summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-12-05 13:23:07 +0000
committerFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-12-05 13:23:07 +0000
commit288490094a7fe9167747dc78d416940759a31197 (patch)
tree53dc4f5c2375f4b688b53ca8841630ddec5e1f88
parent8ec1c47aed09c90343949d57c92760ba84738a46 (diff)
downloadhercules-288490094a7fe9167747dc78d416940759a31197.tar.gz
hercules-288490094a7fe9167747dc78d416940759a31197.tar.bz2
hercules-288490094a7fe9167747dc78d416940759a31197.tar.xz
hercules-288490094a7fe9167747dc78d416940759a31197.zip
- Massive EOL normalization & 'svn:eol-style native' flag setting for all txt/conf/h/c files.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9410 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Dev/bugs.txt28
-rw-r--r--Dev/quotes.txt82
-rw-r--r--conf-tmpl/Changelog.txt436
-rw-r--r--conf-tmpl/GM_account.txt24
-rw-r--r--conf-tmpl/atcommand_athena.conf1596
-rw-r--r--conf-tmpl/battle/battle.conf336
-rw-r--r--conf-tmpl/battle/client.conf228
-rw-r--r--conf-tmpl/battle/drops.conf312
-rw-r--r--conf-tmpl/battle/exp.conf216
-rw-r--r--conf-tmpl/battle/gm.conf214
-rw-r--r--conf-tmpl/battle/guild.conf140
-rw-r--r--conf-tmpl/battle/homunc.conf74
-rw-r--r--conf-tmpl/battle/items.conf174
-rw-r--r--conf-tmpl/battle/misc.conf284
-rw-r--r--conf-tmpl/battle/monster.conf418
-rw-r--r--conf-tmpl/battle/party.conf130
-rw-r--r--conf-tmpl/battle/pet.conf184
-rw-r--r--conf-tmpl/battle/player.conf294
-rw-r--r--conf-tmpl/battle/skill.conf556
-rw-r--r--conf-tmpl/battle/status.conf122
-rw-r--r--conf-tmpl/battle_athena.conf134
-rw-r--r--conf-tmpl/char_athena.conf460
-rw-r--r--conf-tmpl/charcommand_athena.conf196
-rw-r--r--conf-tmpl/charhelp.txt52
-rw-r--r--conf-tmpl/grf-files.txt30
-rw-r--r--conf-tmpl/help.txt350
-rw-r--r--conf-tmpl/help2.txt188
-rw-r--r--conf-tmpl/inter_athena.conf342
-rw-r--r--conf-tmpl/irc_athena.conf84
-rw-r--r--conf-tmpl/ladmin_athena.conf66
-rw-r--r--conf-tmpl/log_athena.conf286
-rw-r--r--conf-tmpl/login_athena.conf408
-rw-r--r--conf-tmpl/map_athena.conf290
-rw-r--r--conf-tmpl/mapflag/gvg.txt164
-rw-r--r--conf-tmpl/mapflag/indoors.txt162
-rw-r--r--conf-tmpl/mapflag/jail.txt96
-rw-r--r--conf-tmpl/mapflag/night.txt460
-rw-r--r--conf-tmpl/mapflag/nightmare.txt96
-rw-r--r--conf-tmpl/mapflag/nobranch.txt574
-rw-r--r--conf-tmpl/mapflag/noexp.txt46
-rw-r--r--conf-tmpl/mapflag/noicewall.txt240
-rw-r--r--conf-tmpl/mapflag/noloot.txt50
-rw-r--r--conf-tmpl/mapflag/nomemo.txt1062
-rw-r--r--conf-tmpl/mapflag/nopenalty.txt450
-rw-r--r--conf-tmpl/mapflag/nopvp.txt154
-rw-r--r--conf-tmpl/mapflag/noreturn.txt452
-rw-r--r--conf-tmpl/mapflag/nosave.txt372
-rw-r--r--conf-tmpl/mapflag/noteleport.txt498
-rw-r--r--conf-tmpl/mapflag/nowarp.txt74
-rw-r--r--conf-tmpl/mapflag/nowarpto.txt82
-rw-r--r--conf-tmpl/mapflag/pvp.txt188
-rw-r--r--conf-tmpl/mapflag/pvp_noguild.txt178
-rw-r--r--conf-tmpl/mapflag/pvp_noparty.txt26
-rw-r--r--conf-tmpl/mapflag/restricted.txt40
-rw-r--r--conf-tmpl/maps_athena.conf1614
-rw-r--r--conf-tmpl/motd.txt2
-rw-r--r--conf-tmpl/msg_athena.conf1112
-rw-r--r--conf-tmpl/packet_athena.conf114
-rw-r--r--conf-tmpl/plugin_athena.conf56
-rw-r--r--conf-tmpl/readme.txt64
-rw-r--r--conf-tmpl/script_athena.conf148
-rw-r--r--conf-tmpl/subnet_athena.conf12
-rw-r--r--db/Changelog.txt5608
-rw-r--r--db/abra_db.txt626
-rw-r--r--db/attr_fix.txt106
-rw-r--r--db/castle_db.txt56
-rw-r--r--db/const.txt1666
-rw-r--r--db/create_arrow_db.txt388
-rw-r--r--db/exp.txt46
-rw-r--r--db/exp2.txt70
-rw-r--r--db/exp_guild.txt100
-rw-r--r--db/exp_homun.txt200
-rw-r--r--db/guild_skill_tree.txt34
-rw-r--r--db/homun_skill_tree.txt146
-rw-r--r--db/homunculus_db.txt32
-rw-r--r--db/item_avail.txt24
-rw-r--r--db/item_bluebox.txt14658
-rw-r--r--db/item_cardalbum.txt694
-rw-r--r--db/item_cookie_bag.txt108
-rw-r--r--db/item_db.txt5420
-rw-r--r--db/item_db2.txt22
-rw-r--r--db/item_findingore.txt50
-rw-r--r--db/item_giftbox.txt1332
-rw-r--r--db/item_group_db.txt16
-rw-r--r--db/item_misc.txt1244
-rw-r--r--db/item_noequip.txt68
-rw-r--r--db/item_scroll.txt12
-rw-r--r--db/item_trade.txt106
-rw-r--r--db/item_violetbox.txt17972
-rw-r--r--db/job_db1.txt310
-rw-r--r--db/job_db2.txt326
-rw-r--r--db/map_index.txt1392
-rw-r--r--db/mob_avail.txt118
-rw-r--r--db/mob_boss.txt94
-rw-r--r--db/mob_branch.txt812
-rw-r--r--db/mob_db.txt1720
-rw-r--r--db/mob_db2.txt104
-rw-r--r--db/mob_db_a.txt1638
-rw-r--r--db/mob_poring.txt34
-rw-r--r--db/mob_race2_db.txt28
-rw-r--r--db/mob_skill_db2.txt482
-rw-r--r--db/packet_db.txt1642
-rw-r--r--db/pet_db.txt120
-rw-r--r--db/produce_db.txt794
-rw-r--r--db/refine_db.txt24
-rw-r--r--db/size_fix.txt14
-rw-r--r--db/skill_cast_db.txt2022
-rw-r--r--db/skill_castnodex_db.txt60
-rw-r--r--db/skill_db.txt1252
-rw-r--r--db/skill_nocast_db.txt116
-rw-r--r--db/skill_require_db.txt944
-rw-r--r--db/skill_tree.txt4358
-rw-r--r--db/skill_unit_db.txt190
-rw-r--r--db/statpoint.txt510
-rw-r--r--doc/admin_packet.txt562
-rw-r--r--doc/client_packet.txt2176
-rw-r--r--doc/conf_ref.txt3992
-rw-r--r--doc/coredump_report.txt218
-rw-r--r--doc/db_ref.txt294
-rw-r--r--doc/ea_job_system.txt360
-rw-r--r--doc/effect_list.txt720
-rw-r--r--doc/help.txt954
-rw-r--r--doc/inter_server_packet.txt408
-rw-r--r--doc/item_bonus.txt424
-rw-r--r--doc/item_db.txt250
-rw-r--r--doc/miscnotes.txt1102
-rw-r--r--doc/mob_db_mode_list.txt98
-rw-r--r--doc/notes/Changelog.txt23628
-rw-r--r--doc/notes/INSTALL.txt492
-rw-r--r--doc/notes/README.win32.txt64
-rw-r--r--doc/notes/Readme-jap.txt42520
-rw-r--r--doc/notes/SVN-SUPPORT.txt30
-rw-r--r--doc/notes/help-old.txt900
-rw-r--r--doc/packet_table_en.txt2672
-rw-r--r--doc/pccommand_list.txt338
-rw-r--r--doc/script_commands.txt10554
-rw-r--r--doc/script_ref.txt2848
-rw-r--r--doc/whisper_sys.txt58
-rw-r--r--doc/woe_time_explanation.txt220
-rw-r--r--notice.txt22
-rw-r--r--npc/Changelog.txt4538
-rw-r--r--npc/airports/airships.txt2258
-rw-r--r--npc/airports/einbroch.txt222
-rw-r--r--npc/airports/lighthalzen.txt182
-rw-r--r--npc/airports/yuno.txt182
-rw-r--r--npc/cities/alberta.txt710
-rw-r--r--npc/cities/aldebaran.txt3116
-rw-r--r--npc/cities/amatsu.txt1876
-rw-r--r--npc/cities/ayothaya.txt574
-rw-r--r--npc/cities/comodo.txt852
-rw-r--r--npc/cities/einbech.txt2286
-rw-r--r--npc/cities/einbroch.txt1936
-rw-r--r--npc/cities/geffen.txt1362
-rw-r--r--npc/cities/gonryun.txt1142
-rw-r--r--npc/cities/hugel.txt206
-rw-r--r--npc/cities/izlude.txt1784
-rw-r--r--npc/cities/jawaii.txt1546
-rw-r--r--npc/cities/lighthalzen.txt4116
-rw-r--r--npc/cities/louyang.txt1146
-rw-r--r--npc/cities/lutie.txt1924
-rw-r--r--npc/cities/morocc.txt940
-rw-r--r--npc/cities/niflheim.txt422
-rw-r--r--npc/cities/payon.txt2046
-rw-r--r--npc/cities/prontera.txt1250
-rw-r--r--npc/cities/umbala.txt1770
-rw-r--r--npc/cities/valkyrie.txt1106
-rw-r--r--npc/cities/yuno.txt782
-rw-r--r--npc/custom/Auctioneer.txt1126
-rw-r--r--npc/custom/Lance/FR_HallOfFame.c592
-rw-r--r--npc/custom/Lance/FR_MailSystem.c232
-rw-r--r--npc/custom/Lance/FR_WeatherController.c806
-rw-r--r--npc/custom/MVP_arena/amvp_func.txt200
-rw-r--r--npc/custom/MVP_arena/arena_mvp.txt1584
-rw-r--r--npc/custom/WoE_Setter.txt374
-rw-r--r--npc/custom/adoption.txt1006
-rw-r--r--npc/custom/airplane.txt876
-rw-r--r--npc/custom/banks/bank.txt250
-rw-r--r--npc/custom/banks/kafra_bank.txt232
-rw-r--r--npc/custom/blackjack.txt698
-rw-r--r--npc/custom/breeder.txt174
-rw-r--r--npc/custom/card_remover.txt350
-rw-r--r--npc/custom/devnpc.txt1016
-rw-r--r--npc/custom/dye.txt352
-rw-r--r--npc/custom/eAAC_Scripts/DonationGirl/donate.txt728
-rw-r--r--npc/custom/eAAC_Scripts/Kafra_Express_files.conf64
-rw-r--r--npc/custom/eAAC_Scripts/banker.txt920
-rw-r--r--npc/custom/eAAC_Scripts/disguiser.txt356
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/Changelog.txt966
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/config.txt800
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt662
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/kafras.txt592
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt350
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt448
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt278
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt1066
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt836
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt810
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt678
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt256
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt260
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt330
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt3522
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt312
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt1000
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt318
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/readme.txt2340
-rw-r--r--npc/custom/eAAC_Scripts/messageboards.txt840
-rw-r--r--npc/custom/eAAC_Scripts/quest_warper.txt4272
-rw-r--r--npc/custom/eAAC_Scripts/roll_a_dice.txt488
-rw-r--r--npc/custom/eAAC_Scripts/vendmachine.txt592
-rw-r--r--npc/custom/eliza.txt1404
-rw-r--r--npc/custom/floating_rates.txt90
-rw-r--r--npc/custom/gefenia.txt66
-rw-r--r--npc/custom/healers/heal.txt102
-rw-r--r--npc/custom/healers/heal_payment.txt212
-rw-r--r--npc/custom/jobs/jobmaster.txt530
-rw-r--r--npc/custom/jobs/old/jobchange.txt1468
-rw-r--r--npc/custom/jobs/reset.txt78
-rw-r--r--npc/custom/lottery.txt912
-rw-r--r--npc/custom/market.txt86
-rw-r--r--npc/custom/morroc_raceway.txt490
-rw-r--r--npc/custom/mvm.txt1790
-rw-r--r--npc/custom/penal_servitude.txt388
-rw-r--r--npc/custom/platinum_skills.txt224
-rw-r--r--npc/custom/poetry/ayothaya.txt1448
-rw-r--r--npc/custom/quests/bandit_beard.txt470
-rw-r--r--npc/custom/quests/berzebub.txt148
-rw-r--r--npc/custom/quests/dead_branch.txt210
-rw-r--r--npc/custom/quests/elvenear.txt136
-rw-r--r--npc/custom/quests/event_6_new_hats.txt742
-rw-r--r--npc/custom/quests/fashion.txt138
-rw-r--r--npc/custom/quests/ironcane.txt98
-rw-r--r--npc/custom/quests/kaho_balmung.txt152
-rw-r--r--npc/custom/quests/kahohorn.txt168
-rw-r--r--npc/custom/quests/kiel_quest.txt126
-rw-r--r--npc/custom/quests/lvl99_quest.txt132
-rw-r--r--npc/custom/quests/magicalhatquest.txt116
-rw-r--r--npc/custom/quests/may_hats.txt360
-rw-r--r--npc/custom/quests/sphinx_mask.txt158
-rw-r--r--npc/custom/quests/sunglasses.txt288
-rw-r--r--npc/custom/quests/tha_statues.txt552
-rw-r--r--npc/custom/quests/thq/THQS_ChatingNPC.txt204
-rw-r--r--npc/custom/quests/thq/THQS_GuildNPC.txt188
-rw-r--r--npc/custom/quests/thq/THQS_QuestNPC.txt1120
-rw-r--r--npc/custom/quests/thq/THQS_Quests.txt2106
-rw-r--r--npc/custom/quests/thq/THQS_TTShop.txt1046
-rw-r--r--npc/custom/quests/umbalian_language.txt424
-rw-r--r--npc/custom/quests/valhallen.txt394
-rw-r--r--npc/custom/rpsroulette.txt572
-rw-r--r--npc/custom/shifty_assassin.txt414
-rw-r--r--npc/custom/sign_your_items.txt430
-rw-r--r--npc/custom/stock_market.txt1584
-rw-r--r--npc/custom/tougijou.txt688
-rw-r--r--npc/custom/warper/warper.txt286
-rw-r--r--npc/eamobs/Whats done.txt122
-rw-r--r--npc/eamobs/dungeons/byalan.txt220
-rw-r--r--npc/eamobs/dungeons/clocktower.txt322
-rw-r--r--npc/eamobs/dungeons/coalmine.txt80
-rw-r--r--npc/eamobs/dungeons/geftower.txt154
-rw-r--r--npc/eamobs/dungeons/glastheim.txt576
-rw-r--r--npc/eamobs/dungeons/jupedun.txt98
-rw-r--r--npc/eamobs/dungeons/moc_pyramid.txt136
-rw-r--r--npc/eamobs/dungeons/moc_sphinx.txt130
-rw-r--r--npc/eamobs/dungeons/sunkenship.txt308
-rw-r--r--npc/eamobs/fields/comodo.txt378
-rw-r--r--npc/eamobs/fields/mjolnir.txt494
-rw-r--r--npc/eamobs/fields/umbala.txt198
-rw-r--r--npc/eamobs/jro/jro.txt7942
-rw-r--r--npc/eamobs/jro/other.txt156
-rw-r--r--npc/events/alchemist.txt332
-rw-r--r--npc/events/custom/2006_dogs_year.txt190
-rw-r--r--npc/events/custom/draculax.txt260
-rw-r--r--npc/events/custom/event_gefenia.txt112
-rw-r--r--npc/events/custom/hallow06.txt248
-rw-r--r--npc/events/custom/hyegun_event.txt152
-rw-r--r--npc/events/custom/kings_items.txt356
-rw-r--r--npc/events/custom/npc_event_thesign.txt136
-rw-r--r--npc/events/custom/p_track/p_track_core.txt84
-rw-r--r--npc/events/custom/p_track/p_track_warpers.txt146
-rw-r--r--npc/events/custom/uneasy_cemetery.txt266
-rw-r--r--npc/events/custom/valentinesdayexp.txt572
-rw-r--r--npc/events/custom/xmas_rings_event.txt386
-rw-r--r--npc/events/dumplingfestival.txt222
-rw-r--r--npc/events/easter.txt402
-rw-r--r--npc/events/event_skill_reset.txt216
-rw-r--r--npc/events/idul_fitri.txt156
-rw-r--r--npc/events/twintowers.txt188
-rw-r--r--npc/events/valentinesday.txt280
-rw-r--r--npc/events/whiteday.txt256
-rw-r--r--npc/events/xmas.txt746
-rw-r--r--npc/guides/guides_alb.txt220
-rw-r--r--npc/guides/guides_alde.txt106
-rw-r--r--npc/guides/guides_ama.txt256
-rw-r--r--npc/guides/guides_com.txt216
-rw-r--r--npc/guides/guides_einbe.txt238
-rw-r--r--npc/guides/guides_einbr.txt336
-rw-r--r--npc/guides/guides_gef.txt260
-rw-r--r--npc/guides/guides_hu.txt300
-rw-r--r--npc/guides/guides_izl.txt230
-rw-r--r--npc/guides/guides_lhz.txt724
-rw-r--r--npc/guides/guides_mor.txt234
-rw-r--r--npc/guides/guides_nif.txt166
-rw-r--r--npc/guides/guides_pay.txt440
-rw-r--r--npc/guides/guides_pron.txt422
-rw-r--r--npc/guides/guides_umb.txt164
-rw-r--r--npc/guides/guides_yun.txt580
-rw-r--r--npc/guild/aldeg/aldeg_dunsw.txt102
-rw-r--r--npc/guild/aldeg/aldeg_ev_agit.txt292
-rw-r--r--npc/guild/aldeg/aldeg_flags.txt486
-rw-r--r--npc/guild/aldeg/aldeg_guardians.txt222
-rw-r--r--npc/guild/aldeg/aldeg_kafras.txt122
-rw-r--r--npc/guild/aldeg/aldeg_managers.txt222
-rw-r--r--npc/guild/aldeg/aldeg_treas.txt282
-rw-r--r--npc/guild/ev_agit_event.txt276
-rw-r--r--npc/guild/gefg/gefg_dunsw.txt98
-rw-r--r--npc/guild/gefg/gefg_ev_agit.txt292
-rw-r--r--npc/guild/gefg/gefg_flags.txt384
-rw-r--r--npc/guild/gefg/gefg_guardians.txt216
-rw-r--r--npc/guild/gefg/gefg_kafras.txt132
-rw-r--r--npc/guild/gefg/gefg_managers.txt208
-rw-r--r--npc/guild/gefg/gefg_treas.txt296
-rw-r--r--npc/guild/gldfunc_dunsw.txt94
-rw-r--r--npc/guild/gldfunc_ev_agit.txt326
-rw-r--r--npc/guild/gldfunc_flag.txt122
-rw-r--r--npc/guild/gldfunc_kafra.txt76
-rw-r--r--npc/guild/gldfunc_manager.txt838
-rw-r--r--npc/guild/gldfunc_treasure.txt170
-rw-r--r--npc/guild/nguild/nguild_dunsw.txt76
-rw-r--r--npc/guild/nguild/nguild_ev_agit.txt238
-rw-r--r--npc/guild/nguild/nguild_flags.txt292
-rw-r--r--npc/guild/nguild/nguild_guardians.txt178
-rw-r--r--npc/guild/nguild/nguild_kafras.txt106
-rw-r--r--npc/guild/nguild/nguild_managers.txt170
-rw-r--r--npc/guild/nguild/nguild_treas.txt234
-rw-r--r--npc/guild/nguild/nguild_warper.txt148
-rw-r--r--npc/guild/payg/payg_dunsw.txt98
-rw-r--r--npc/guild/payg/payg_ev_agit.txt292
-rw-r--r--npc/guild/payg/payg_flags.txt372
-rw-r--r--npc/guild/payg/payg_guardians.txt216
-rw-r--r--npc/guild/payg/payg_kafras.txt130
-rw-r--r--npc/guild/payg/payg_managers.txt208
-rw-r--r--npc/guild/payg/payg_treas.txt280
-rw-r--r--npc/guild/prtg/prtg_dunsw.txt98
-rw-r--r--npc/guild/prtg/prtg_ev_agit.txt292
-rw-r--r--npc/guild/prtg/prtg_flags.txt414
-rw-r--r--npc/guild/prtg/prtg_guardians.txt216
-rw-r--r--npc/guild/prtg/prtg_kafras.txt132
-rw-r--r--npc/guild/prtg/prtg_managers.txt208
-rw-r--r--npc/guild/prtg/prtg_treas.txt288
-rw-r--r--npc/jobs/1-1/acolyte.txt700
-rw-r--r--npc/jobs/1-1/archer.txt366
-rw-r--r--npc/jobs/1-1/mage.txt992
-rw-r--r--npc/jobs/1-1/merchant.txt1946
-rw-r--r--npc/jobs/1-1/swordman.txt1600
-rw-r--r--npc/jobs/1-1/thief.txt920
-rw-r--r--npc/jobs/1-1e/gunslinger.txt522
-rw-r--r--npc/jobs/2-1/assassin.txt3842
-rw-r--r--npc/jobs/2-1/blacksmith.txt3034
-rw-r--r--npc/jobs/2-1/hunter.txt2510
-rw-r--r--npc/jobs/2-1/knight.txt3732
-rw-r--r--npc/jobs/2-1/priest.txt2870
-rw-r--r--npc/jobs/2-1/wizard.txt3032
-rw-r--r--npc/jobs/2-1a/AssassinCross.txt42
-rw-r--r--npc/jobs/2-1a/HighPriest.txt42
-rw-r--r--npc/jobs/2-1a/HighWizard.txt42
-rw-r--r--npc/jobs/2-1a/LordKnight.txt42
-rw-r--r--npc/jobs/2-1a/Sniper.txt42
-rw-r--r--npc/jobs/2-1a/WhiteSmith.txt42
-rw-r--r--npc/jobs/2-1e/StarGladiator.txt580
-rw-r--r--npc/jobs/2-2/alchemist.txt2152
-rw-r--r--npc/jobs/2-2/bard.txt954
-rw-r--r--npc/jobs/2-2/dancer.txt2114
-rw-r--r--npc/jobs/2-2/monk.txt3852
-rw-r--r--npc/jobs/2-2/rogue.txt1984
-rw-r--r--npc/jobs/2-2/sage.txt4360
-rw-r--r--npc/jobs/2-2a/Champion.txt42
-rw-r--r--npc/jobs/2-2a/Clown.txt42
-rw-r--r--npc/jobs/2-2a/Creator.txt42
-rw-r--r--npc/jobs/2-2a/Gypsy.txt42
-rw-r--r--npc/jobs/2-2a/Paladin.txt42
-rw-r--r--npc/jobs/2-2a/Professor.txt42
-rw-r--r--npc/jobs/2-2a/Stalker.txt42
-rw-r--r--npc/jobs/2-2e/SoulLinker.txt626
-rw-r--r--npc/jobs/novice/novice.txt6856
-rw-r--r--npc/jobs/novice/supernovice.txt558
-rw-r--r--npc/kafras/functions_kafras.txt1082
-rw-r--r--npc/kafras/kafras_alb.txt120
-rw-r--r--npc/kafras/kafras_alde.txt102
-rw-r--r--npc/kafras/kafras_com.txt114
-rw-r--r--npc/kafras/kafras_dungeons.txt234
-rw-r--r--npc/kafras/kafras_gef.txt166
-rw-r--r--npc/kafras/kafras_izl.txt80
-rw-r--r--npc/kafras/kafras_mor.txt166
-rw-r--r--npc/kafras/kafras_new.txt316
-rw-r--r--npc/kafras/kafras_pay.txt140
-rw-r--r--npc/kafras/kafras_pron.txt198
-rw-r--r--npc/kafras/kafras_yun.txt138
-rw-r--r--npc/merchants/alchemist.txt258
-rw-r--r--npc/merchants/ammo_boxes.txt230
-rw-r--r--npc/merchants/ammo_dealer.txt200
-rw-r--r--npc/merchants/clothes_dyer.txt776
-rw-r--r--npc/merchants/dye_maker.txt554
-rw-r--r--npc/merchants/grandpa_pharmacist.txt324
-rw-r--r--npc/merchants/hair_dyer.txt318
-rw-r--r--npc/merchants/hair_style.txt4106
-rw-r--r--npc/merchants/icecream.txt122
-rw-r--r--npc/merchants/inn.txt276
-rw-r--r--npc/merchants/kunai_maker.txt194
-rw-r--r--npc/merchants/milk_trader.txt122
-rw-r--r--npc/merchants/novice_exchange.txt316
-rw-r--r--npc/merchants/quivers.txt300
-rw-r--r--npc/merchants/refine.txt1642
-rw-r--r--npc/merchants/renters.txt364
-rw-r--r--npc/merchants/scrolls_arrows.txt76
-rw-r--r--npc/merchants/shops.txt700
-rw-r--r--npc/merchants/shuriken_maker.txt320
-rw-r--r--npc/merchants/socket_enchant.txt1686
-rw-r--r--npc/mobs/airplane.txt18
-rw-r--r--npc/mobs/citycleaners.txt100
-rw-r--r--npc/mobs/dungeons/abyss.txt122
-rw-r--r--npc/mobs/dungeons/amatdun.txt82
-rw-r--r--npc/mobs/dungeons/anthell.txt242
-rw-r--r--npc/mobs/dungeons/ayodun.txt58
-rw-r--r--npc/mobs/dungeons/beachdun.txt76
-rw-r--r--npc/mobs/dungeons/byalan.txt218
-rw-r--r--npc/mobs/dungeons/clocktower.txt312
-rw-r--r--npc/mobs/dungeons/coalmine.txt72
-rw-r--r--npc/mobs/dungeons/eindun.txt70
-rw-r--r--npc/mobs/dungeons/gefenia.txt258
-rw-r--r--npc/mobs/dungeons/geftower.txt192
-rw-r--r--npc/mobs/dungeons/glastheim.txt454
-rw-r--r--npc/mobs/dungeons/gondun.txt86
-rw-r--r--npc/mobs/dungeons/guilddun.txt102
-rw-r--r--npc/mobs/dungeons/icedun.txt72
-rw-r--r--npc/mobs/dungeons/jupedun.txt110
-rw-r--r--npc/mobs/dungeons/kiel.txt86
-rw-r--r--npc/mobs/dungeons/lhzdun.txt482
-rw-r--r--npc/mobs/dungeons/louydun.txt84
-rw-r--r--npc/mobs/dungeons/magmadun.txt76
-rw-r--r--npc/mobs/dungeons/moc_pyramid.txt124
-rw-r--r--npc/mobs/dungeons/moc_sphinx.txt106
-rw-r--r--npc/mobs/dungeons/orcdun.txt82
-rw-r--r--npc/mobs/dungeons/payoncave.txt324
-rw-r--r--npc/mobs/dungeons/pront_maze.txt206
-rw-r--r--npc/mobs/dungeons/pront_sewers.txt104
-rw-r--r--npc/mobs/dungeons/racheldun.txt106
-rw-r--r--npc/mobs/dungeons/sunkenship.txt318
-rw-r--r--npc/mobs/dungeons/thanatos.txt364
-rw-r--r--npc/mobs/dungeons/toyfactory.txt70
-rw-r--r--npc/mobs/dungeons/turtleisland.txt144
-rw-r--r--npc/mobs/dungeons/umbaladun.txt122
-rw-r--r--npc/mobs/dungeons/yggdrasil.txt70
-rw-r--r--npc/mobs/fields/amatsu.txt94
-rw-r--r--npc/mobs/fields/ayothaya.txt60
-rw-r--r--npc/mobs/fields/comodo.txt394
-rw-r--r--npc/mobs/fields/einbroch.txt272
-rw-r--r--npc/mobs/fields/geffen.txt454
-rw-r--r--npc/mobs/fields/gonryun.txt44
-rw-r--r--npc/mobs/fields/hugel.txt250
-rw-r--r--npc/mobs/fields/jawaii.txt58
-rw-r--r--npc/mobs/fields/lighthalzen.txt102
-rw-r--r--npc/mobs/fields/louyang.txt66
-rw-r--r--npc/mobs/fields/lutie.txt40
-rw-r--r--npc/mobs/fields/mjolnir.txt500
-rw-r--r--npc/mobs/fields/morocc.txt588
-rw-r--r--npc/mobs/fields/niflheim.txt392
-rw-r--r--npc/mobs/fields/odin.txt108
-rw-r--r--npc/mobs/fields/payon.txt304
-rw-r--r--npc/mobs/fields/prontera.txt280
-rw-r--r--npc/mobs/fields/rachel.txt230
-rw-r--r--npc/mobs/fields/umbala.txt200
-rw-r--r--npc/mobs/fields/yuno.txt352
-rw-r--r--npc/mobs/pvp.txt80
-rw-r--r--npc/other/Global_Functions.txt970
-rw-r--r--npc/other/arena.txt1308
-rw-r--r--npc/other/books.txt4584
-rw-r--r--npc/other/bulletin_boards.txt1232
-rw-r--r--npc/other/comodo_gambling.txt1240
-rw-r--r--npc/other/divorce.txt222
-rw-r--r--npc/other/dts_warper.txt1930
-rw-r--r--npc/other/lighthalzen_auction.txt116
-rw-r--r--npc/other/lighthalzen_bank.txt164
-rw-r--r--npc/other/marriage.txt1872
-rw-r--r--npc/other/monster_museum.txt1176
-rw-r--r--npc/other/msg_boards.txt266
-rw-r--r--npc/other/powernpc.txt662
-rw-r--r--npc/other/pvp.txt828
-rw-r--r--npc/quest_variables.txt182
-rw-r--r--npc/quests/Lvl4_weapon_quest.txt7230
-rw-r--r--npc/quests/WIP/4.txt244
-rw-r--r--npc/quests/WIP/6.txt248
-rw-r--r--npc/quests/WIP/airships.txt2276
-rw-r--r--npc/quests/WIP/schwalz.txt2090
-rw-r--r--npc/quests/WIP/shadow_quest.txt830
-rw-r--r--npc/quests/bongunsword.txt314
-rw-r--r--npc/quests/bunnyband.txt196
-rw-r--r--npc/quests/cooking_quest.txt1200
-rw-r--r--npc/quests/counteragent_mixture.txt534
-rw-r--r--npc/quests/doomed_swords.txt1364
-rw-r--r--npc/quests/eye_of_hellion.txt4294
-rw-r--r--npc/quests/gunslinger_quests.txt808
-rw-r--r--npc/quests/juice_maker.txt614
-rw-r--r--npc/quests/juperos.txt264
-rw-r--r--npc/quests/metto_quest.txt670
-rw-r--r--npc/quests/monstertamers.txt880
-rw-r--r--npc/quests/mrsmile.txt184
-rw-r--r--npc/quests/newgears/2004_headgears.txt6724
-rw-r--r--npc/quests/newgears/2005_headgears.txt4510
-rw-r--r--npc/quests/newgears/2006_headgear.txt976
-rw-r--r--npc/quests/obb_quest.txt394
-rw-r--r--npc/quests/quests_alberta.txt2384
-rw-r--r--npc/quests/quests_aldebaran.txt186
-rw-r--r--npc/quests/quests_amatsu.txt3056
-rw-r--r--npc/quests/quests_ayothaya.txt3664
-rw-r--r--npc/quests/quests_comodo.txt2484
-rw-r--r--npc/quests/quests_ein.txt8206
-rw-r--r--npc/quests/quests_geffen.txt368
-rw-r--r--npc/quests/quests_gonryun.txt6986
-rw-r--r--npc/quests/quests_izlude.txt254
-rw-r--r--npc/quests/quests_lighthalzen.txt5232
-rw-r--r--npc/quests/quests_louyang.txt6318
-rw-r--r--npc/quests/quests_lutie.txt356
-rw-r--r--npc/quests/quests_morocc.txt246
-rw-r--r--npc/quests/quests_niflheim.txt598
-rw-r--r--npc/quests/quests_payon.txt586
-rw-r--r--npc/quests/quests_prontera.txt354
-rw-r--r--npc/quests/quests_umbala.txt1840
-rw-r--r--npc/quests/quests_yuno.txt256
-rw-r--r--npc/quests/quiz/quiz_qt.txt4278
-rw-r--r--npc/quests/seals/brisingamen_seal.txt11070
-rw-r--r--npc/quests/seals/god_global.txt246
-rw-r--r--npc/quests/seals/god_weapon_creation.txt3188
-rw-r--r--npc/quests/seals/megingard_seal.txt6916
-rw-r--r--npc/quests/seals/mjolnir_seal.txt6316
-rw-r--r--npc/quests/seals/sleipnir_seal.txt4590
-rw-r--r--npc/quests/skills/acolyte_skills.txt258
-rw-r--r--npc/quests/skills/alchemist_skills.txt904
-rw-r--r--npc/quests/skills/archer_skills.txt426
-rw-r--r--npc/quests/skills/assassin_skills.txt142
-rw-r--r--npc/quests/skills/bard_skills.txt142
-rw-r--r--npc/quests/skills/blacksmith_skills.txt282
-rw-r--r--npc/quests/skills/crusader_skills.txt214
-rw-r--r--npc/quests/skills/dancer_skills.txt148
-rw-r--r--npc/quests/skills/hunter_skills.txt176
-rw-r--r--npc/quests/skills/knight_skills.txt134
-rw-r--r--npc/quests/skills/mage_skills.txt236
-rw-r--r--npc/quests/skills/merchant_skills.txt614
-rw-r--r--npc/quests/skills/monk_skills.txt154
-rw-r--r--npc/quests/skills/novice_skills.txt492
-rw-r--r--npc/quests/skills/priest_skills.txt176
-rw-r--r--npc/quests/skills/rogue_skills.txt142
-rw-r--r--npc/quests/skills/sage_skills.txt296
-rw-r--r--npc/quests/skills/swordman_skills.txt748
-rw-r--r--npc/quests/skills/thief_skills.txt774
-rw-r--r--npc/quests/skills/wizard_skills.txt368
-rw-r--r--npc/quests/thana_quest.txt3266
-rw-r--r--npc/sample/PCLoginEvent.txt104
-rw-r--r--npc/sample/bank_test.txt116
-rw-r--r--npc/sample/basejob_baseclass_upper.txt14
-rw-r--r--npc/sample/delitem2.txt58
-rw-r--r--npc/sample/getequipcardid.txt68
-rw-r--r--npc/sample/getiteminfo.txt30
-rw-r--r--npc/sample/getmonsterinfo.txt34
-rw-r--r--npc/sample/gstorage_test.txt140
-rw-r--r--npc/sample/npc_card_remover.txt394
-rw-r--r--npc/sample/npc_dynamic_shop.txt166
-rw-r--r--npc/sample/npc_equip_sample.txt34
-rw-r--r--npc/sample/npc_extend_shop.txt118
-rw-r--r--npc/sample/npc_sample.txt914
-rw-r--r--npc/sample/npc_shop_test.txt62
-rw-r--r--npc/sample/npc_test_arena.txt208
-rw-r--r--npc/sample/npc_test_array.txt70
-rw-r--r--npc/sample/npc_test_chat.txt56
-rw-r--r--npc/sample/npc_test_ev.txt292
-rw-r--r--npc/sample/npc_test_func.txt54
-rw-r--r--npc/sample/npc_test_npctimer.txt66
-rw-r--r--npc/sample/npc_test_npctimer2.txt30
-rw-r--r--npc/sample/npc_test_skill.txt38
-rw-r--r--npc/sample/npc_test_str.txt34
-rw-r--r--npc/sample/npc_testchkoption.txt28
-rw-r--r--npc/sample/npc_time_sample.txt38
-rw-r--r--npc/scripts_athena.conf400
-rw-r--r--npc/scripts_custom.conf286
-rw-r--r--npc/scripts_eaac.conf168
-rw-r--r--npc/scripts_eamonsters.conf156
-rw-r--r--npc/scripts_guild.conf132
-rw-r--r--npc/scripts_jmonsters.conf58
-rw-r--r--npc/scripts_jobs.conf180
-rw-r--r--npc/scripts_main.conf114
-rw-r--r--npc/scripts_mapflags.conf78
-rw-r--r--npc/scripts_monsters.conf152
-rw-r--r--npc/scripts_warps.conf194
-rw-r--r--npc/warps/cities/alberta.txt116
-rw-r--r--npc/warps/cities/aldebaran.txt100
-rw-r--r--npc/warps/cities/amatsu.txt112
-rw-r--r--npc/warps/cities/ayothaya.txt188
-rw-r--r--npc/warps/cities/comodo.txt100
-rw-r--r--npc/warps/cities/einbech.txt94
-rw-r--r--npc/warps/cities/einbroch.txt232
-rw-r--r--npc/warps/cities/geffen.txt98
-rw-r--r--npc/warps/cities/gonryun.txt66
-rw-r--r--npc/warps/cities/hugel.txt216
-rw-r--r--npc/warps/cities/izlude.txt66
-rw-r--r--npc/warps/cities/lighthalzen.txt288
-rw-r--r--npc/warps/cities/louyang.txt110
-rw-r--r--npc/warps/cities/lutie.txt74
-rw-r--r--npc/warps/cities/morroc.txt212
-rw-r--r--npc/warps/cities/niflheim.txt104
-rw-r--r--npc/warps/cities/payon.txt274
-rw-r--r--npc/warps/cities/prontera.txt208
-rw-r--r--npc/warps/cities/rachel.txt244
-rw-r--r--npc/warps/cities/umbala.txt88
-rw-r--r--npc/warps/cities/yggdrasil.txt44
-rw-r--r--npc/warps/cities/yuno.txt402
-rw-r--r--npc/warps/disabled_warps.txt90
-rw-r--r--npc/warps/dungeons/abyss.txt40
-rw-r--r--npc/warps/dungeons/alberta_duns.txt114
-rw-r--r--npc/warps/dungeons/alde_ct.txt432
-rw-r--r--npc/warps/dungeons/amatsu_dun.txt40
-rw-r--r--npc/warps/dungeons/ant_hell.txt68
-rw-r--r--npc/warps/dungeons/ayo_dun.txt42
-rw-r--r--npc/warps/dungeons/coal_mine.txt42
-rw-r--r--npc/warps/dungeons/com_dun.txt36
-rw-r--r--npc/warps/dungeons/ein_dun.txt38
-rw-r--r--npc/warps/dungeons/geffen_dun.txt90
-rw-r--r--npc/warps/dungeons/gon_dun.txt80
-rw-r--r--npc/warps/dungeons/ice_dun.txt10
-rw-r--r--npc/warps/dungeons/izlude_dun.txt58
-rw-r--r--npc/warps/dungeons/juperos.txt258
-rw-r--r--npc/warps/dungeons/kiel_dun.txt152
-rw-r--r--npc/warps/dungeons/lhalzen_dun.txt424
-rw-r--r--npc/warps/dungeons/louyang_dun.txt38
-rw-r--r--npc/warps/dungeons/lutie_dun.txt34
-rw-r--r--npc/warps/dungeons/morroc_duns.txt126
-rw-r--r--npc/warps/dungeons/odin.txt136
-rw-r--r--npc/warps/dungeons/orc_dun.txt50
-rw-r--r--npc/warps/dungeons/payon_dun.txt72
-rw-r--r--npc/warps/dungeons/prt_dun.txt482
-rw-r--r--npc/warps/dungeons/rachel_dun.txt60
-rw-r--r--npc/warps/dungeons/thana_custom.txt316
-rw-r--r--npc/warps/dungeons/thana_dun.txt258
-rw-r--r--npc/warps/dungeons/umbala_dun.txt64
-rw-r--r--npc/warps/dungeons/yuno_dun.txt36
-rw-r--r--npc/warps/fields/abyss_warper.txt154
-rw-r--r--npc/warps/fields/amatsu_fild.txt42
-rw-r--r--npc/warps/fields/com_fild.txt104
-rw-r--r--npc/warps/fields/ein_fild.txt106
-rw-r--r--npc/warps/fields/gefenia.txt60
-rw-r--r--npc/warps/fields/geffen_fild.txt142
-rw-r--r--npc/warps/fields/glastheim.txt166
-rw-r--r--npc/warps/fields/hugel_fild.txt88
-rw-r--r--npc/warps/fields/jawaii.txt50
-rw-r--r--npc/warps/fields/lhalzen_fild.txt38
-rw-r--r--npc/warps/fields/lutie_fild.txt34
-rw-r--r--npc/warps/fields/morroc_fild.txt204
-rw-r--r--npc/warps/fields/mtmjolnir.txt122
-rw-r--r--npc/warps/fields/payon_fild.txt94
-rw-r--r--npc/warps/fields/prontera_fild.txt200
-rw-r--r--npc/warps/fields/rachel_fild.txt62
-rw-r--r--npc/warps/fields/umbala_fild.txt68
-rw-r--r--npc/warps/fields/yuno_fild.txt178
-rw-r--r--npc/warps/guild/guildcastles.txt974
-rw-r--r--npc/warps/other/airplane.txt158
-rw-r--r--npc/warps/other/arena.txt56
-rw-r--r--npc/warps/other/god.txt44
-rw-r--r--npc/warps/other/jobquests.txt244
-rw-r--r--npc/warps/other/kiel.txt224
-rw-r--r--npc/warps/other/other.txt68
-rw-r--r--npc/warps/other/sign.txt76
-rw-r--r--npc/warps/pvp/pvp.txt338
-rw-r--r--save-tmpl/account.txt12
-rw-r--r--save-tmpl/castle.txt48
-rw-r--r--src/char/char.c8886
-rw-r--r--src/char/char.h116
-rw-r--r--src/char/int_guild.c3130
-rw-r--r--src/char/int_guild.h44
-rw-r--r--src/char/int_homun.c742
-rw-r--r--src/char/int_homun.h32
-rw-r--r--src/char/int_party.c1494
-rw-r--r--src/char/int_party.h40
-rw-r--r--src/char/int_pet.c844
-rw-r--r--src/char/int_pet.h36
-rw-r--r--src/char/int_status.c374
-rw-r--r--src/char/int_status.h48
-rw-r--r--src/char/int_storage.c956
-rw-r--r--src/char/int_storage.h44
-rw-r--r--src/char/inter.c1384
-rw-r--r--src/char/inter.h56
-rw-r--r--src/char_sql/char.c8870
-rw-r--r--src/char_sql/char.h220
-rw-r--r--src/char_sql/int_guild.c4212
-rw-r--r--src/char_sql/int_guild.h70
-rw-r--r--src/char_sql/int_homun.c592
-rw-r--r--src/char_sql/int_homun.h28
-rw-r--r--src/char_sql/int_party.c1874
-rw-r--r--src/char_sql/int_party.h60
-rw-r--r--src/char_sql/int_pet.c744
-rw-r--r--src/char_sql/int_pet.h36
-rw-r--r--src/char_sql/int_storage.c758
-rw-r--r--src/char_sql/int_storage.h34
-rw-r--r--src/char_sql/inter.c1644
-rw-r--r--src/char_sql/inter.h112
-rw-r--r--src/char_sql/itemdb.c444
-rw-r--r--src/char_sql/itemdb.h86
-rw-r--r--src/common/core.c606
-rw-r--r--src/common/core.h44
-rw-r--r--src/common/db.c4896
-rw-r--r--src/common/db.h1496
-rw-r--r--src/common/ers.h386
-rw-r--r--src/common/graph.c636
-rw-r--r--src/common/graph.h54
-rw-r--r--src/common/grfio.c2062
-rw-r--r--src/common/grfio.h44
-rw-r--r--src/common/lock.c142
-rw-r--r--src/common/lock.h22
-rw-r--r--src/common/malloc.c1466
-rw-r--r--src/common/malloc.h356
-rw-r--r--src/common/nullpo.c188
-rw-r--r--src/common/nullpo.h474
-rw-r--r--src/common/plugin.h80
-rw-r--r--src/common/plugins.c734
-rw-r--r--src/common/plugins.h122
-rw-r--r--src/common/showmsg.c1652
-rw-r--r--src/common/showmsg.h192
-rw-r--r--src/common/strlib.h48
-rw-r--r--src/common/timer.c872
-rw-r--r--src/common/timer.h120
-rw-r--r--src/common/utils.c768
-rw-r--r--src/common/utils.h104
-rw-r--r--src/common/version.h60
-rw-r--r--src/ladmin/ladmin.c8872
-rw-r--r--src/ladmin/ladmin.h26
-rw-r--r--src/ladmin/md5calc.c478
-rw-r--r--src/ladmin/md5calc.h20
-rw-r--r--src/login/login.c8396
-rw-r--r--src/login/md5calc.c472
-rw-r--r--src/login/md5calc.h14
-rw-r--r--src/login_sql/login.c4796
-rw-r--r--src/login_sql/login.h114
-rw-r--r--src/login_sql/md5calc.c478
-rw-r--r--src/login_sql/md5calc.h20
-rw-r--r--src/map/atcommand.h670
-rw-r--r--src/map/battle.h910
-rw-r--r--src/map/charcommand.c3692
-rw-r--r--src/map/charcommand.h148
-rw-r--r--src/map/charsave.c1046
-rw-r--r--src/map/charsave.h42
-rw-r--r--src/map/chat.c780
-rw-r--r--src/map/chat.h44
-rw-r--r--src/map/chrif.c3272
-rw-r--r--src/map/chrif.h116
-rw-r--r--src/map/clif.h736
-rw-r--r--src/map/date.c144
-rw-r--r--src/map/date.h34
-rw-r--r--src/map/guild.c4034
-rw-r--r--src/map/guild.h190
-rw-r--r--src/map/intif.h144
-rw-r--r--src/map/irc.c1086
-rw-r--r--src/map/irc.h110
-rw-r--r--src/map/itemdb.c2554
-rw-r--r--src/map/itemdb.h296
-rw-r--r--src/map/log.c1064
-rw-r--r--src/map/log.h86
-rw-r--r--src/map/mail.c712
-rw-r--r--src/map/mail.h24
-rw-r--r--src/map/map.h2982
-rw-r--r--src/map/mercenary.c1914
-rw-r--r--src/map/mercenary.h158
-rw-r--r--src/map/mob.h414
-rw-r--r--src/map/npc.c6168
-rw-r--r--src/map/npc.h180
-rw-r--r--src/map/npc_chat.c1034
-rw-r--r--src/map/party.c1804
-rw-r--r--src/map/party.h98
-rw-r--r--src/map/pc.h636
-rw-r--r--src/map/pcre.h516
-rw-r--r--src/map/pet.c2800
-rw-r--r--src/map/pet.h136
-rw-r--r--src/map/script.h182
-rw-r--r--src/map/skill.h1916
-rw-r--r--src/map/status.h1276
-rw-r--r--src/map/storage.c1522
-rw-r--r--src/map/storage.h90
-rw-r--r--src/map/trade.c1106
-rw-r--r--src/map/trade.h30
-rw-r--r--src/map/vending.c534
-rw-r--r--src/map/vending.h28
-rw-r--r--src/plugins/gui.c202
-rw-r--r--src/plugins/gui.txt28
-rw-r--r--src/plugins/httpd.c1502
-rw-r--r--src/plugins/httpd.h214
-rw-r--r--src/plugins/httpd.txt38
-rw-r--r--src/plugins/pid.c108
-rw-r--r--src/plugins/sample.c154
-rw-r--r--src/plugins/sig.c422
-rw-r--r--src/plugins/upnp.txt60
-rw-r--r--src/tool/adduser.c200
-rw-r--r--src/tool/convert.c598
-rw-r--r--src/txt-converter/char-converter.c562
-rw-r--r--src/txt-converter/login-converter.c456
-rw-r--r--src/webserver/doc/API.txt100
-rw-r--r--src/webserver/generate.c76
-rw-r--r--src/webserver/htmlstyle.c102
-rw-r--r--src/webserver/logs.c16
-rw-r--r--src/webserver/main.c284
-rw-r--r--src/webserver/pages/about.c12
-rw-r--r--src/webserver/pages/notdone.c10
-rw-r--r--src/webserver/pages/sample.c48
-rw-r--r--src/webserver/parse.c270
-rw-r--r--src/zlib/crypt.h264
-rw-r--r--src/zlib/ioapi.c354
-rw-r--r--src/zlib/ioapi.h150
-rw-r--r--src/zlib/iowin32.c540
-rw-r--r--src/zlib/iowin32.h42
-rw-r--r--src/zlib/unzip.c3204
-rw-r--r--src/zlib/unzip.h708
-rw-r--r--src/zlib/zconf.h664
-rw-r--r--src/zlib/zlib.h2714
818 files changed, 344812 insertions, 344812 deletions
diff --git a/Dev/bugs.txt b/Dev/bugs.txt
index d03062c12..7b6d94acc 100644
--- a/Dev/bugs.txt
+++ b/Dev/bugs.txt
@@ -1,14 +1,14 @@
-- NOTE: Use this file to place BIG BAD BUGS that have been going on for a good
- while and it seems noone can fix them (Use the forums for common everyday
- bugs). Bugs in this file are not meant to be "fixed" as much as they are a
- "reminder" of big bugs that have not been fixed yet. An good example would
- be "the matrix bug" from the good old days.
-
-
-BUG: mob won't stop moving while casting spell
-DESC: When mob start casting spell, he still moves some cells (2-3). Also if
- mob has no cast time of certain spell, after cast he can 'jump' to you, or
- you'll see him in place he isn't anymore - probably packet with 'move mob'
- is sended to fast (some delay needed after cast ?) ... dunno ;/ It can be
- easly checked on mobs like Novus, Acidus, almost all mobs in Bio Labs lvl 3.
- Beacuse of two of that player sees mob in place where he isn't anymore.
+- NOTE: Use this file to place BIG BAD BUGS that have been going on for a good
+ while and it seems noone can fix them (Use the forums for common everyday
+ bugs). Bugs in this file are not meant to be "fixed" as much as they are a
+ "reminder" of big bugs that have not been fixed yet. An good example would
+ be "the matrix bug" from the good old days.
+
+
+BUG: mob won't stop moving while casting spell
+DESC: When mob start casting spell, he still moves some cells (2-3). Also if
+ mob has no cast time of certain spell, after cast he can 'jump' to you, or
+ you'll see him in place he isn't anymore - probably packet with 'move mob'
+ is sended to fast (some delay needed after cast ?) ... dunno ;/ It can be
+ easly checked on mobs like Novus, Acidus, almost all mobs in Bio Labs lvl 3.
+ Beacuse of two of that player sees mob in place where he isn't anymore.
diff --git a/Dev/quotes.txt b/Dev/quotes.txt
index 607cd3c0e..11a94baf8 100644
--- a/Dev/quotes.txt
+++ b/Dev/quotes.txt
@@ -1,41 +1,41 @@
-ADD UR QUOTES HERE FOR DEV EDITION NPCS!
-Remember to add map, coords, and sprite number!
-
-NEW 10-21-04!
-Add Biography areas
--Real name
--Age
--Where u live
--What u do here
--Why ur here
--and ur own small self intro.
-
-Completed people:
-
-
-Also put some coords so that u walk around
-//************************************\
-Lance
-- Lance
-- 16
-- KL, MY
-- General coding and scripting. Little Code Monkey :D
-- Was invited by Manipulator and Nexon. Promoted by Deviant.
-- Got really into eA at 14, began scripting in 15. Started coding this year.
-
-Codemaster
-- Andrew
-- 18
-- Ohio (College in New York)
-- Go Crazy :D, help with random questions, coding, scripting, documentation
-- Merged in with omniAthena ^_^
-- Been programming and scripting since age 9 :)
-
-erKURITA
-- José Alejandro
-- 18
-- Galicia, Spain
-- Mainly fix scripts and a few db typos :P No coding yet.
-- Well, some of the devs were too lazy/busy to commit my fixes, so I asked
- massdriller for some access, and bam I am here :o
-- http://eathena.deltaanime.net/wiki/index.php/User:ErKURITA
+ADD UR QUOTES HERE FOR DEV EDITION NPCS!
+Remember to add map, coords, and sprite number!
+
+NEW 10-21-04!
+Add Biography areas
+-Real name
+-Age
+-Where u live
+-What u do here
+-Why ur here
+-and ur own small self intro.
+
+Completed people:
+
+
+Also put some coords so that u walk around
+//************************************\
+Lance
+- Lance
+- 16
+- KL, MY
+- General coding and scripting. Little Code Monkey :D
+- Was invited by Manipulator and Nexon. Promoted by Deviant.
+- Got really into eA at 14, began scripting in 15. Started coding this year.
+
+Codemaster
+- Andrew
+- 18
+- Ohio (College in New York)
+- Go Crazy :D, help with random questions, coding, scripting, documentation
+- Merged in with omniAthena ^_^
+- Been programming and scripting since age 9 :)
+
+erKURITA
+- José Alejandro
+- 18
+- Galicia, Spain
+- Mainly fix scripts and a few db typos :P No coding yet.
+- Well, some of the devs were too lazy/busy to commit my fixes, so I asked
+ massdriller for some access, and bam I am here :o
+- http://eathena.deltaanime.net/wiki/index.php/User:ErKURITA
diff --git a/conf-tmpl/Changelog.txt b/conf-tmpl/Changelog.txt
index a4dee842d..487ec5371 100644
--- a/conf-tmpl/Changelog.txt
+++ b/conf-tmpl/Changelog.txt
@@ -1,218 +1,218 @@
-Date Added
-
-2006/11/29
- * Added Rachel Santuary to nomemo mapflags [Playtester]
-2006/11/22
- * Added import/script_conf.txt to keep OnPCxxxxxEven settings [Lupus]
- * Modified slaves_inherit_speed (monster.conf): 0 never. 1 - when the
- master can move. 2 - when the master can't move. 3 - always (default)
- * Also modified slaves_inherit_mode: 0 don't change mode. 1 slaves are
- always aggressive. 2 slaves are always passive. 3 they copy the
- agro/passive mode from their master. Defaults to 2.
-2006/11/20
- * Added monster_ai&0x200 (monster.conf). When set, mob skill delays are
- shared. That is, if the mob has several lines with the same skill, when the
- skill is used, the delay will be set to all of them, not just the one entry
- used. [Skotlex]
-2006/11/07
- * Added nosave mapflag for Guild Dungeons [KarLaeda]
- * New Setting "stdout_with_ansisequence"
- (login_athena/char_athena/map_athena) allows you to specify whether color
- control chars should be printed or not. Is useful to disable for a
- "cleaner" output when you are logging the console output. All credit goes
- to FlavioJS for coding the whole thing. [Skotlex]
-2006/11/05
- * Added maplags for PowerNPC quest. [KarLaeda]
-2006/10/31
- * Modified the player_cloak_check_type and monster_cloak_check_type
- settings. 1 makes it check for walls, 2 makes cloaking NOT end on normal
- attacks, and 4 makes cloaking NOT end when using skills. The default
- setting for players is still 1, but for mobs the default has been changed
- to 4 (skill.conf). [Skotlex]
-2006/10/25
- * Added exp-bonus settings exp_bonus_attacker and exp_bonus_max_attacker
- (exp.conf, default to 25 and 12) [Skotlex]
- * Changed the way the party_even_share_bonus setting works. It now uses a
- simple linear bonus increase (party.conf) [Skotlex]
-2006/10/24
- * Changed the way the skill_steal_max_tries work. Now it actually MEANS the
- max number of steal tries, use 0 to disable (unlimited tries). [Skotlex]
- * Changed the default of skill_steal_max_tries to 0 as there's no proof
- anywhere that there should be such a limit. [Skotlex]
-2006/10/20
- * Added config setting "summon_flora_setting" (skill.conf), with it you can
- decide now two things: a. Whether or not players can harm your floras
- outside versus grounds, and b. Whether or not you can summon out and mix
- different types of plants at the same time. [Skotlex]
-2006/10/19
- * Commented out the monster_noteleport mapflag from the guild castles as
- this is the Aegis behaviour [Skotlex]
-2006/10/18
- * Added monster_noteleport mapflag to the guild castle maps to prevent
- "avoiding MVPs" by forcing them to teleport from rude-attacks. [Skotlex]
-2006/10/16
- * Added &16 to the default of the emergency_call setting (skill.conf)
- [Skotlex]
-2006/10/12
- * Added Homunculus atcommands [Playtester]
-2006/10/11
- * Removed useless inter_athena settings (they were doing absolutely
- nothing): read_gm_interval, gm_db, gm_db_level, gm_db_account_id,
- use_new_sql_db [Skotlex]
-2006/10/06
- * status_cast_cancel is now a type 4 (object bitmasks) setting
- (status.conf). [Skotlex]
-2006/10/06
- * Removed gm_all_skill_add_abra which was doing nothing anyway. [Skotlex]
-2006/10/03
- * Renamed setting delay_dependon_dex to delay_dependon_agi, the delay of
- skills is reduced now (when enabled) by AGI instead of DEX, which makes a
- lot more sense than DEX. [Skotlex]
-2006/09/25
- * Removed config setting allow_atcommand_when_mute as it's no longer used
- (see manner_system in misc.conf for it's replacement) [Skotlex]
-2006/09/19
- * Removed setting ban_spoof_namer (as now invalid chat packets just cause
- the sending character to be disconnected). [Skotlex]
-2006/09/18
- * The new socket update code includes support for two new config settings
- (packet_athena.txt): frame_size, which can be used to alter the logic
- packet-size allowed by the code, and mode_neg, which when set to yes, sets
- TCP_NODELAY on all connections (defaults to yes). [Skotlex]
- * Due to a recent update of how cards/equipment status change defense
- works, the max sc resistance settings (battle/status.conf) no longer apply
- to them. [Skotlex]
-2006/09/16
- * Added monster_ai&256. When set, a monster will pick a random starting
- position to begin checking versus it's skills, otherwise, it will always
- begin checking from the beginning. [Skotlex]
-2006/09/15
- * Added atcommand.conf entries for @adjgmlvl and @adjcmdlvl [Skotlex]
-2006/09/14
- * Adjusted gvg long damage rate to 80%, magic damage rate to 60%
- (battle/guild.conf) [Skotlex]
-2006/09/12
- * Changed back the default of case-sensitive to ON since it shouldn't be
- such a bad performance hog now. [Skotlex]
- * case_sensitive is now off by default due to performance issues
- (login_athena.conf). [Skotlex]
-2006/09/11
- * Corrected name of config settings pc_luk_status_def, mob_luk_status_def
- (status.conf) [Skotlex]
- * Changed the default of enable_baseatk to 9 (player + homun) [Skotlex]
- * Changed the default of enable_perfect_flee to 1 (players only) [Skotlex]
-2006/09/09
- * Removed noteleport flags from Geffenia maps [Playtester]
-2006/09/08
- * Removed sg_miracle_skill_duration, replaced it with
- sg_miracle_skill_min_duration and sg_miracle_skill_max_duration, to specify
- a range for the duration of the skill. [Skotlex]
- * Skill duration for sg miracle is now 1h ~ 2.5h [Skotlex]
-2006/09/07
- * Changed the default of sg_angel_skill_ratio to 10 based on recent
- information from Tharis. [Skotlex]
- * Added sg_angel_skill_ratio to specify rate at which the Angel skill
- triggers. [Skotlex]
- * Increased duration of Miracle of the Sun/Moon/Stars to one hour.
- [Skotlex]
- * Changed gvg_short_attack_damage_rate to 80, as leaked X.2 [Vicious]
-2006/09/06
- * Reverted back the default view/chase range of mobs to 100% since eA now
- uses square view areas, like Aegis. [Skotlex]
-2006/09/05
- * Removed setting mob_show_hp, it's been replaced now by mob_show_info,
- which can be used to specify what kind of info should be displayed from a
- mob. Current options are two different formats for Hp display, and current
- level (monster.conf). [Skotlex]
-2006/08/31
- * Added setting attack_walk_delay which specifies whether a character
- should (or not) be able to move inmediately after starting a normal attack
- (battle.conf). Defaults to 0 since that's what Aegis uses. [Skotlex]
- * Corrected battle config name max_walk_rate, it should be named
- max_walk_speed. [Skotlex]
-2006/08/29
- * monster_ai&1 now only signals whether mobs should update their target
- cell while chasing more frequently (rather than being state-driven like
- Aegis) [Skotlex]
- * Changed the defaults of view_range_rate and chase_range_rate to 120 to
- aproximate better Aegis's view ranges (which are square areas and not
- circles), so eA's default of 100 leads to a circular area contained
- within a 21x21 square zone (what Aegis uses), by using 20%, the circular
- area increases range to 12, which better approximates Aegis's 21x21 area.
- [Skotlex]
-2006/08/24
- * Changed the default of clear_skills_on_death to 0 [Skotlex]
- * Added setting clear_skills_on_warp to specify when a character's
- land-based skills are deleted when the caster changes maps. Defaults to all
- types (skill.conf). [Skotlex]
- * The previous setting now obsoletes traps_setting &2, which now can only
- be 0/1. [Skotlex]
-2006/08/21
- * Removed config setting "muting_players", and expanded the manner_system
- config to specify how having negative manner (mute) affects a player (see
- battle/misc.conf). [Skotlex]
- * Expanded the pk_mode setting from no/yes to 0/1/2. 1 is normal pk_mode,
- if 2 is used, it makes killing players give you a loss of 5 manner points.
- [Skotlex]
-2006/08/18
- * Added monster_ai&128 to make aggressive mobs ignore that behaviour of
- always picking Homun targets above player targets regardless of who is
- closer. [Skotlex]
- * Added guild_aura (skill.conf) setting so you can specify when it works
- and if it works on the guild-master itself. Defaults to working all the
- time on everyone except GM. [Skotlex]
-2006/08/14
- * Removed support for negative autosave intervals, instead added a
- minsave_interval setting which specifies which is the minimum time between
- character saves. Default to 100ms (map_athena.conf). [Skotlex]
- * Modified emergency_call setting to allow for more specific configuration
- (woe/non-woe, gvg-grounds/non-gvg-grounds, disable from nowarpto maps), see
- skill.conf for details. [Skotlex]
-2006/08/10
- * Removed setting mob_ghostring_fix [Skotlex]
- * Changed setting attack_attr_none to affect all neutral-element attacks.
- Basicly, this setting is now used to determine who can hit for full damage
- always when using neutral-attacks (defaults to non-players) [Skotlex]
-2006/08/09
- * Change the default of attack_attr_none to all classes except players.
- This means that pet/mobs/homun will always do normal attacks with
- no-element modifiers (but elemental reduction cards still apply) [Skotlex]
-2006/08/08
- * Removed config settings display_delay_skill_fail and
- display_snatcher_skill_fail, replaced them with display_skill_fail, which
- can be used to determine whether you hide ALL skill-failed messages, those
- from delay, those from Snatcher or those from Envenom (battle/skill.conf)
- [Skotlex]
-2006/08/07
- * Added config force_random_spawn which overrides the spawn-files defined
- coordinates to make all mobs always spawn randomly on the map. [Skotlex]
- * SC_SPEEDUP0 is no longer dispellable by SA_DISPEL [Skotlex]
-2006/08/04
- * Removed settings enemy_critical_rate, homun_critical_rate. Added settings
- enable_critical (defaults to specify only players), mob_critical_rate and
- critical_rate. The last applies to all non-mobs and non-players
- (battle/battle.conf) [Skotlex]
- * Removed settings mob_npc_warp, mob_warpportal. Replaced with setting
- mob_warp which specifies which types of warp can a mob step into
- (battle/monster.conf) [Skotlex]
- * Changed name of the setting log_pick to log_filter since that's what it
- does now. [Skotlex]
- * Modified enable_logs so that instead of a 0/1 setting, you can specify
- which kind of events to log (so you can use a combination), see log_athena
- for the bitmask configuration. [Skotlex]
- * Cleaned a bit the contents of log_athena.conf
-2006/08/02
- * Updated status_cast_cancel to also include silence (so the cast bar is
- cancelled if you are silenced during it) [Skotlex]
-2006/08/01
- * merged in atcommands jailfor, jailtime, charjailtime. Thanks to Meruru
- and Coltaro for the code. [Skotlex]
- * Expanded setting debuff_on_logout so that &1 removes negative buffs and
- &2 removes positive buffs. [Skotlex]
- * Added battle config file status.conf, moved some settings from skill.conf
- and battle.conf to it since they are entirely Status-Change related.
- [Skotlex]
-2006/07/27
- * Added config setting party_update_interval so you can specify how often
- the party-mate minidots should be updated (defaults to 1 sec). [Skotlex]
- * Removed a bunch of broken comments in skill.c [Skotlex]
+Date Added
+
+2006/11/29
+ * Added Rachel Santuary to nomemo mapflags [Playtester]
+2006/11/22
+ * Added import/script_conf.txt to keep OnPCxxxxxEven settings [Lupus]
+ * Modified slaves_inherit_speed (monster.conf): 0 never. 1 - when the
+ master can move. 2 - when the master can't move. 3 - always (default)
+ * Also modified slaves_inherit_mode: 0 don't change mode. 1 slaves are
+ always aggressive. 2 slaves are always passive. 3 they copy the
+ agro/passive mode from their master. Defaults to 2.
+2006/11/20
+ * Added monster_ai&0x200 (monster.conf). When set, mob skill delays are
+ shared. That is, if the mob has several lines with the same skill, when the
+ skill is used, the delay will be set to all of them, not just the one entry
+ used. [Skotlex]
+2006/11/07
+ * Added nosave mapflag for Guild Dungeons [KarLaeda]
+ * New Setting "stdout_with_ansisequence"
+ (login_athena/char_athena/map_athena) allows you to specify whether color
+ control chars should be printed or not. Is useful to disable for a
+ "cleaner" output when you are logging the console output. All credit goes
+ to FlavioJS for coding the whole thing. [Skotlex]
+2006/11/05
+ * Added maplags for PowerNPC quest. [KarLaeda]
+2006/10/31
+ * Modified the player_cloak_check_type and monster_cloak_check_type
+ settings. 1 makes it check for walls, 2 makes cloaking NOT end on normal
+ attacks, and 4 makes cloaking NOT end when using skills. The default
+ setting for players is still 1, but for mobs the default has been changed
+ to 4 (skill.conf). [Skotlex]
+2006/10/25
+ * Added exp-bonus settings exp_bonus_attacker and exp_bonus_max_attacker
+ (exp.conf, default to 25 and 12) [Skotlex]
+ * Changed the way the party_even_share_bonus setting works. It now uses a
+ simple linear bonus increase (party.conf) [Skotlex]
+2006/10/24
+ * Changed the way the skill_steal_max_tries work. Now it actually MEANS the
+ max number of steal tries, use 0 to disable (unlimited tries). [Skotlex]
+ * Changed the default of skill_steal_max_tries to 0 as there's no proof
+ anywhere that there should be such a limit. [Skotlex]
+2006/10/20
+ * Added config setting "summon_flora_setting" (skill.conf), with it you can
+ decide now two things: a. Whether or not players can harm your floras
+ outside versus grounds, and b. Whether or not you can summon out and mix
+ different types of plants at the same time. [Skotlex]
+2006/10/19
+ * Commented out the monster_noteleport mapflag from the guild castles as
+ this is the Aegis behaviour [Skotlex]
+2006/10/18
+ * Added monster_noteleport mapflag to the guild castle maps to prevent
+ "avoiding MVPs" by forcing them to teleport from rude-attacks. [Skotlex]
+2006/10/16
+ * Added &16 to the default of the emergency_call setting (skill.conf)
+ [Skotlex]
+2006/10/12
+ * Added Homunculus atcommands [Playtester]
+2006/10/11
+ * Removed useless inter_athena settings (they were doing absolutely
+ nothing): read_gm_interval, gm_db, gm_db_level, gm_db_account_id,
+ use_new_sql_db [Skotlex]
+2006/10/06
+ * status_cast_cancel is now a type 4 (object bitmasks) setting
+ (status.conf). [Skotlex]
+2006/10/06
+ * Removed gm_all_skill_add_abra which was doing nothing anyway. [Skotlex]
+2006/10/03
+ * Renamed setting delay_dependon_dex to delay_dependon_agi, the delay of
+ skills is reduced now (when enabled) by AGI instead of DEX, which makes a
+ lot more sense than DEX. [Skotlex]
+2006/09/25
+ * Removed config setting allow_atcommand_when_mute as it's no longer used
+ (see manner_system in misc.conf for it's replacement) [Skotlex]
+2006/09/19
+ * Removed setting ban_spoof_namer (as now invalid chat packets just cause
+ the sending character to be disconnected). [Skotlex]
+2006/09/18
+ * The new socket update code includes support for two new config settings
+ (packet_athena.txt): frame_size, which can be used to alter the logic
+ packet-size allowed by the code, and mode_neg, which when set to yes, sets
+ TCP_NODELAY on all connections (defaults to yes). [Skotlex]
+ * Due to a recent update of how cards/equipment status change defense
+ works, the max sc resistance settings (battle/status.conf) no longer apply
+ to them. [Skotlex]
+2006/09/16
+ * Added monster_ai&256. When set, a monster will pick a random starting
+ position to begin checking versus it's skills, otherwise, it will always
+ begin checking from the beginning. [Skotlex]
+2006/09/15
+ * Added atcommand.conf entries for @adjgmlvl and @adjcmdlvl [Skotlex]
+2006/09/14
+ * Adjusted gvg long damage rate to 80%, magic damage rate to 60%
+ (battle/guild.conf) [Skotlex]
+2006/09/12
+ * Changed back the default of case-sensitive to ON since it shouldn't be
+ such a bad performance hog now. [Skotlex]
+ * case_sensitive is now off by default due to performance issues
+ (login_athena.conf). [Skotlex]
+2006/09/11
+ * Corrected name of config settings pc_luk_status_def, mob_luk_status_def
+ (status.conf) [Skotlex]
+ * Changed the default of enable_baseatk to 9 (player + homun) [Skotlex]
+ * Changed the default of enable_perfect_flee to 1 (players only) [Skotlex]
+2006/09/09
+ * Removed noteleport flags from Geffenia maps [Playtester]
+2006/09/08
+ * Removed sg_miracle_skill_duration, replaced it with
+ sg_miracle_skill_min_duration and sg_miracle_skill_max_duration, to specify
+ a range for the duration of the skill. [Skotlex]
+ * Skill duration for sg miracle is now 1h ~ 2.5h [Skotlex]
+2006/09/07
+ * Changed the default of sg_angel_skill_ratio to 10 based on recent
+ information from Tharis. [Skotlex]
+ * Added sg_angel_skill_ratio to specify rate at which the Angel skill
+ triggers. [Skotlex]
+ * Increased duration of Miracle of the Sun/Moon/Stars to one hour.
+ [Skotlex]
+ * Changed gvg_short_attack_damage_rate to 80, as leaked X.2 [Vicious]
+2006/09/06
+ * Reverted back the default view/chase range of mobs to 100% since eA now
+ uses square view areas, like Aegis. [Skotlex]
+2006/09/05
+ * Removed setting mob_show_hp, it's been replaced now by mob_show_info,
+ which can be used to specify what kind of info should be displayed from a
+ mob. Current options are two different formats for Hp display, and current
+ level (monster.conf). [Skotlex]
+2006/08/31
+ * Added setting attack_walk_delay which specifies whether a character
+ should (or not) be able to move inmediately after starting a normal attack
+ (battle.conf). Defaults to 0 since that's what Aegis uses. [Skotlex]
+ * Corrected battle config name max_walk_rate, it should be named
+ max_walk_speed. [Skotlex]
+2006/08/29
+ * monster_ai&1 now only signals whether mobs should update their target
+ cell while chasing more frequently (rather than being state-driven like
+ Aegis) [Skotlex]
+ * Changed the defaults of view_range_rate and chase_range_rate to 120 to
+ aproximate better Aegis's view ranges (which are square areas and not
+ circles), so eA's default of 100 leads to a circular area contained
+ within a 21x21 square zone (what Aegis uses), by using 20%, the circular
+ area increases range to 12, which better approximates Aegis's 21x21 area.
+ [Skotlex]
+2006/08/24
+ * Changed the default of clear_skills_on_death to 0 [Skotlex]
+ * Added setting clear_skills_on_warp to specify when a character's
+ land-based skills are deleted when the caster changes maps. Defaults to all
+ types (skill.conf). [Skotlex]
+ * The previous setting now obsoletes traps_setting &2, which now can only
+ be 0/1. [Skotlex]
+2006/08/21
+ * Removed config setting "muting_players", and expanded the manner_system
+ config to specify how having negative manner (mute) affects a player (see
+ battle/misc.conf). [Skotlex]
+ * Expanded the pk_mode setting from no/yes to 0/1/2. 1 is normal pk_mode,
+ if 2 is used, it makes killing players give you a loss of 5 manner points.
+ [Skotlex]
+2006/08/18
+ * Added monster_ai&128 to make aggressive mobs ignore that behaviour of
+ always picking Homun targets above player targets regardless of who is
+ closer. [Skotlex]
+ * Added guild_aura (skill.conf) setting so you can specify when it works
+ and if it works on the guild-master itself. Defaults to working all the
+ time on everyone except GM. [Skotlex]
+2006/08/14
+ * Removed support for negative autosave intervals, instead added a
+ minsave_interval setting which specifies which is the minimum time between
+ character saves. Default to 100ms (map_athena.conf). [Skotlex]
+ * Modified emergency_call setting to allow for more specific configuration
+ (woe/non-woe, gvg-grounds/non-gvg-grounds, disable from nowarpto maps), see
+ skill.conf for details. [Skotlex]
+2006/08/10
+ * Removed setting mob_ghostring_fix [Skotlex]
+ * Changed setting attack_attr_none to affect all neutral-element attacks.
+ Basicly, this setting is now used to determine who can hit for full damage
+ always when using neutral-attacks (defaults to non-players) [Skotlex]
+2006/08/09
+ * Change the default of attack_attr_none to all classes except players.
+ This means that pet/mobs/homun will always do normal attacks with
+ no-element modifiers (but elemental reduction cards still apply) [Skotlex]
+2006/08/08
+ * Removed config settings display_delay_skill_fail and
+ display_snatcher_skill_fail, replaced them with display_skill_fail, which
+ can be used to determine whether you hide ALL skill-failed messages, those
+ from delay, those from Snatcher or those from Envenom (battle/skill.conf)
+ [Skotlex]
+2006/08/07
+ * Added config force_random_spawn which overrides the spawn-files defined
+ coordinates to make all mobs always spawn randomly on the map. [Skotlex]
+ * SC_SPEEDUP0 is no longer dispellable by SA_DISPEL [Skotlex]
+2006/08/04
+ * Removed settings enemy_critical_rate, homun_critical_rate. Added settings
+ enable_critical (defaults to specify only players), mob_critical_rate and
+ critical_rate. The last applies to all non-mobs and non-players
+ (battle/battle.conf) [Skotlex]
+ * Removed settings mob_npc_warp, mob_warpportal. Replaced with setting
+ mob_warp which specifies which types of warp can a mob step into
+ (battle/monster.conf) [Skotlex]
+ * Changed name of the setting log_pick to log_filter since that's what it
+ does now. [Skotlex]
+ * Modified enable_logs so that instead of a 0/1 setting, you can specify
+ which kind of events to log (so you can use a combination), see log_athena
+ for the bitmask configuration. [Skotlex]
+ * Cleaned a bit the contents of log_athena.conf
+2006/08/02
+ * Updated status_cast_cancel to also include silence (so the cast bar is
+ cancelled if you are silenced during it) [Skotlex]
+2006/08/01
+ * merged in atcommands jailfor, jailtime, charjailtime. Thanks to Meruru
+ and Coltaro for the code. [Skotlex]
+ * Expanded setting debuff_on_logout so that &1 removes negative buffs and
+ &2 removes positive buffs. [Skotlex]
+ * Added battle config file status.conf, moved some settings from skill.conf
+ and battle.conf to it since they are entirely Status-Change related.
+ [Skotlex]
+2006/07/27
+ * Added config setting party_update_interval so you can specify how often
+ the party-mate minidots should be updated (defaults to 1 sec). [Skotlex]
+ * Removed a bunch of broken comments in skill.c [Skotlex]
diff --git a/conf-tmpl/GM_account.txt b/conf-tmpl/GM_account.txt
index bffd60781..ea41ab682 100644
--- a/conf-tmpl/GM_account.txt
+++ b/conf-tmpl/GM_account.txt
@@ -1,12 +1,12 @@
-// eAthena's GM Accounts File
-// Edited by MC Cameri to enable account id ranges
-// Changing this file while login server is running
-// Usage #1(Standard): <account id> <level>
-// Usage #2(Range): <beginning of range[-:~]end of range> <level>
-// Examples:
-// 2000002 99
-// 2000003-2000005 99
-// 2000003~2000005 99
-// 704585 30
-
-704554-704584 99
+// eAthena's GM Accounts File
+// Edited by MC Cameri to enable account id ranges
+// Changing this file while login server is running
+// Usage #1(Standard): <account id> <level>
+// Usage #2(Range): <beginning of range[-:~]end of range> <level>
+// Examples:
+// 2000002 99
+// 2000003-2000005 99
+// 2000003~2000005 99
+// 704585 30
+
+704554-704584 99
diff --git a/conf-tmpl/atcommand_athena.conf b/conf-tmpl/atcommand_athena.conf
index 9371c2781..682ad42d9 100644
--- a/conf-tmpl/atcommand_athena.conf
+++ b/conf-tmpl/atcommand_athena.conf
@@ -1,798 +1,798 @@
-// Athena atcommand Configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-// Set here the symbol that you want to use for your commands
-// Only 1 character is get (default is character_savecharacter_save'@'). You can set any character,
-// except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
-// With default character, all commands begin by a '@': <example> @revive
-command_symbol: @
-
-
-// Sets the level of the users that can use the GM commands.
-// <command name>: level
-// When battle_athena.conf has atcommand_gm_only set to no,
-// normal players (gm level 0) can use GM commands if you set 0 to the command level.
-// Max GM level is 99. If you want forbid a command to all people, set it with level 100.
-
-// Default values are set to define different GM levels like follow:
-// 0: normal player
-// -> no special advantage (only @time to know time and if at_command_gm_only is disabled)
-// 1: Super player
-// -> some (very) little advantages: storage, petrename, etc...
-// 10: Super player+
-// -> same of Super player with !go (very super player)
-// 20: Mediator
-// -> it's a GM that only need to know people, and move to their to speak with them (they can access to any command about wisps)
-// 40: Sub-GM
-// -> This GM can help a GM, and can not create item or zeny or modify a character (can have some information commands)
-// 50: Sub-GM+
-// -> This GM can change some non-important things on a character
-// 60: GM
-// -> can do almost anything (excep administration, and mass commands)
-// GM is the first level where we can modify a character with important value, create items or create zenys
-// 80: GM Chief
-// -> can do anything, except administration commands
-// 99: Administrator
-// -> can do anything!
-// 100: Disabled
-// -> Commands that aren't used. Note: You must use command level 100 to disable command. Commenting doesn't enough.
-
-
-//--------------------------
-// 0: normal player commands
-// None for security purposes.
-
-//-------------------------
-// 1: Super player commands
-
-//Displays a list of @ commands available to the player.
-commands: 1
-
-//Displays the server rates.
-rates: 1
-
-// Show server uptime
-uptime: 1
-
-//Shows/Hides the "there is a delay after a skill" message.
-showdelay: 1
-
-//Displays current levels and % progress.
-exp: 1
-
-// To change your (own) email (characters protection)
-// note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
-// if you want be sure of each e-mail disable this option (value: 100)
-email: 1
-
-// Show Monster info (rates, stats, drops, MVP stuff)
-mobinfo: 1
-monsterinfo: 1
-mi: 1
-
-// Show Item info (type, price, etc)
-iteminfo: 1
-ii: 1
-
-// Show who drops an item (mobs with highest drop rate)
-whodrops: 1
-
-// Syncs the position of the player on the client with the one stored in the server.
-refresh: 1
-
-// Give server time. (6 same commands)
-time: 1
-date: 1
-server_date: 1
-serverdate: 1
-server_time: 1
-servertime: 1
-
-// Displays SVN version of the server.
-version: 1
-
-// Suicide your character.
-die: 1
-
-// Enables you to rename your pet.
-petrename: 1
-
-party: 1
-
-// Brings up your personal storage wherever you are.
-storage: 1
-
-// Locate someone on a map, returns your coordinates if the person isn't on.
-where: 1
-
-// Duel organizing commands
-duel: 1
-invite: 1
-accept: 1
-reject: 1
-leave: 1
-
-// Away messsage
-away: 1
-aw: 1
-
-// Main chat
-main: 1
-
-// Autorejecting Deals/Invites
-noask: 1
-
-// Displays remaining jail time
-jailtime: 1
-
-//Homunculus commands for players
-homtalk: 1
-hominfo: 1
-
-//---------------------------
-// 10: Super player+ commands
-
-//Displays/Hides Experience gained
-showexp: 10
-
-//Displays/Hides Zeny gained
-showzeny: 10
-
-// Spawns you to set points in major cities.
-go: 10
-
-// Enables/disables autolooting from killed mobs.
-autoloot: 10
-
-// Allows you continue vending offline.
-autotrade: 10
-at: 10
-
-// Change Guild Master of your Guild
-changegm: 10
-
-// Change the leader of your party.
-changeleader: 10
-
-// Change the party item share rules.
-partyoption: 10
-
-// Command what the player's pet will say.
-pettalk: 10
-
-// Locates and displays the position of a certain mob on the current map.
-mobsearch: 10
-// Locates and displays the position of a certain mob on your mini-map
-showmobs: 10
-
-//----------------------
-// 20: Mediator commands
-
-// Displays helpfile in Athena base directory (2 same commands).
-help: 20
-h: 20
-help2: 20
-h2: 20
-
-// Warp yourself to a person (3 same commands + /shift).
-jumpto: 20
-goto: 20
-warpto: 20
-
-// Warp yourself to a person by PID (similar to above, cept you us the PID)
-jumptoid: 20
-jumptoid2: 20
-gotoid: 20
-gotoid2: 20
-warptoid: 20
-warptoid2: 20
-
-// Displays the motd file to all players
-gmotd: 20
-
-// follow a player (including warping to them)
-follow: 20
-
-// Sends a request to all connected GMs (via the gm whisper system)
-request: 20
-
-// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
-kick: 20
-
-// Disconnects a user from the server using their PID.
-kickid: 20
-kickid2: 20
-
-// Changes your apperance.
-model: 20
-
-// To get a peco to (un)ride
-mountpeco: 20
-
-// Returns list of logged in characters with their position (2 same commands).
-who: 20
-whois: 20
-
-// Returns list of logged in characters with their job.
-who2: 20
-
-// Returns list of logged in characters with their party/guild.
-who3: 20
-
-// Returns list of logged in characters with their position in a specifical map.
-whomap: 20
-
-// Returns list of logged in characters with their job in a specifical map.
-whomap2: 20
-
-// Returns list of logged in characters with their party/guild in a specifical map.
-whomap3: 20
-
-// Like @who+@who2+who3, but only for GM.
-whogm: 20
-
-// Change your appearence to other players to a mob.
-disguise: 20
-
-//Restore your normal appearance.
-undisguise: 20
-
-// Display ignore list of a player (people from which the player ignore wisps)
-charignorelist: 20
-
-// Displays the text as a normal message with the format "*name message*"
-// instead of "name : message" (Like the /me command in IRC)
-me: 20
-
-// Changes your name to your choice temporarly.
-fakename: 20
-
-// Changes your size.
-size: 20
-
-// Can command what other npcs (by name) can say.
-npctalk: 20
-
-//--------------------
-// 40: Sub-GM commands
-
-// Broadcast to the whole server. Using (1 command + /nb, /b).
-broadcast: 40
-
-// Broadcast to the map you are on (1 command + /lb, /nlb).
-localbroadcast: 40
-
-// Broadcast (with or without name).
-kami: 40
-kamib: 40
-
-// Enables you to go to a certain map, at (x,y) coordinates. (@mapmove + /mm or /mapmove)
-mapmove: 40
-
-// Enables GVG on a map (2 same commands).
-gvgon: 40
-gpvpon: 40
-
-// Turns GVG (Guild v. Guild) off on a map (2 same commands).
-gvgoff: 40
-gpvpoff: 40
-
-// Heals a person to full HP/SP.
-heal: 40
-
-// GM Hide (enables you to be invisible to characters, and most monsters) (1 command + /hide).
-hide: 40
-
-// Changes your job to one you specify (2 same commands).
-job: 40
-jobchange: 40
-
-// Enables you to to jump randomly on a map (that you are already on).
-jump: 40
-
-// Warps you to your last save point (2 same commands).
-return: 40
-load: 40
-
-// Enables lost skills.
-lostskill: 40
-
-// Saves a warp point.
-memo: 40
-
-// Set your character display options. (Visual effects of your character)
-option: 40
-
-// Sets the level of intemecy of your pet.
-petfriendly: 40
-
-// Sets hunger level of your pet.
-pethungry: 40
-
-// Turns PVP (Person v. Person) off on a map.
-pvpoff: 40
-
-// Enables PVP on a map.
-pvpon: 40
-
-// Enables platinum skills.
-questskill: 40
-
-// Sets the speed you can walk/attack at. Default is 150.
-speed: 40
-charspeed: 40
-
-// Enables spirit sphere balls.
-spiritball: 40
-
-// Warp yourself to a certain map, at (x,y) coordinates (2 same commands).
-rura: 40
-warp: 40
-
-// Changes GM clothes color (2 same commands)
-dye: 40
-ccolor: 40
-
-// Changes GM hair style (2 same commands)
-hairstyle: 40
-hstyle: 40
-
-// Changes GM hair color (2 same commands)
-haircolor: 40
-hcolor: 40
-
-// Deletes all your items.
-itemreset: 40
-
-// Displays distribution of players on the server per map (% on each map which has players)
-users: 40
-
-// Deletes floor items in your range of sight
-cleanmap: 40
-
-// Kill all monsters in map (without drops)
-killmonster2: 40
-
-// Sets your spawn point (aka save point).
-save: 40
-
-// Do some visual effect on your character
-effect: 40
-
-// Display all items of a player's cart
-charcartlist: 40
-
-// drop all your items
-dropall: 40
-
-// store all your items
-storeall: 40
-
-// allow other players to hit you out of pvp
-killable: 40
-
-// look up a skill by name
-skillid: 40
-
-// use a skill by id
-useskill: 40
-
-// What skills are required to get this skill
-skilltree: 40
-
-// Marriage skills
-marry: 40
-divorce: 40
-
-// make another player killable
-charkillable: 40
-
-// Same as above, cept uses PID.
-charkillableid: 40
-charkillableid2: 40
-
-// Play a Sound!
-sound: 40
-
-//---------------------
-// 50: Sub-GM+ commands
-
-guild: 50
-
-// Brings up your guild storage wherever you are.
-gstorage: 50
-
-// Spawns a monster, and a certain amount (3 same commands + /monster).
-spawn: 50
-monster: 50
-summon: 50
-
-// To get a peco to (un)ride for another player.
-charmountpeco: 50
-
-// Spawns a smaller sized version of a monster.
-monstersmall: 50
-
-// Spawns a larger sized version of a monster.
-monsterbig: 50
-
-// It will spawn a supportive clone of the given player.
-clone: 50
-
-// It will spawn a supportive clone of the given player that follows the creator around.
-slaveclone: 50
-
-// It will spawn an aggresive clone of the given player.
-evilclone: 50
-
-
-//----------------
-// 60: GM commands
-
-// Starts Guild Wars
-agitstart: 60
-
-// Ends Guild Wars
-agitend: 60
-
-// Resurects yourself.
-alive: 60
-
-// Levels your character to specified level (adds to your level) (3 same commands).
-lvup: 60
-baselvlup: 60
-blevel: 60
-
-// Raises your job level (3 same commands).
-joblvup: 60
-joblvlup: 60
-jlevel: 60
-
-// Changes the sex of yourself
-changesex: 60
-
-// Remove items from a character
-chardelitem: 60
-
-// Saves the respawn point of another character.
-charsave: 60
-
-// Levels your guild to specified level (2 same commands).
-guildlvup: 60
-guildlvlup: 60
-
-idsearch: 60
-
-// Creates an item of your choosing, either Item ID or Name (1 command + /item).
-item: 60
-
-// Creates a complet item (card, etc...) of your choosing, either Item ID or Name.
-item2: 60
-
-// Kill another character without hitting them.
-kill: 60
-
-// Same as above, cept uses PID.
-killid: 60
-killid2: 60
-
-// Kill all monsters in map (with drops)
-killmonster: 60
-
-// Creates yourself a pet egg, have to use Pet ID.
-makeegg: 60
-
-//Hatches an egg
-hatch: 60
-
-// Enable hitting a player even when not in pvp
-killer: 60
-
-// Creates weapon of desired element.
-produce: 60
-
-// Warps a character to you (1 command + /recall).
-recall: 60
-
-// Warps a character to you using their PID.
-recallid: 60
-recallid2: 60
-
-// Refines all weapons in your items list.
-refine: 60
-
-// Will repair all broken items in inventory.
-repairall: 60
-
-// Revives a character, and heals them.
-revive: 60
-
-// Same as above, cept uses PID.
-reviveid: 60
-reviveid2: 60
-
-// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
-rura+: 60
-charwarp: 60
-shuffle: 60
-
-// Change Status of your character
-str: 60
-agi: 60
-vit: 60
-int: 60
-dex: 60
-luk: 60
-
-// Gets all skills (4 same commands)
-allskill: 60
-allskills: 60
-skillall: 60
-skillsall: 60
-
-// sets GM stats to maximum (4 same commands)
-statall: 60
-statsall: 60
-allstats: 60
-allstat: 60
-
-// Gives you job points.
-stpoint: 60
-
-// Gives you skill points of desired amount.
-skpoint: 60
-
-// Warps all online character of a guild to you. (at least one member of that guild must be on.)
-guildrecall: 60
-
-// Warps all online character of a party to you. (at least one party member must be online.)
-partyrecall: 60
-
-// Allows you to spy on any Guilds Guild chat. (at least one member of that guild must be on.)
-// NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
-guildspy: 60
-
-//Allows you to spy on any party's party chat. (at least one party member must be online.)
-// NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
-partyspy: 60
-
-// Gives you money (zeny) of desired amount.
-zeny: 60
-
-// To block definitively a player (only administrator can unblock the account) (2 same commands)
-block: 60
-charblock: 60
-
-// To unblock a player (2 same commands)
-unblock: 60
-charunblock: 60
-
-// To ban a player for a limited time (only administrator can unban the account) (4 same commands)
-ban: 60
-banish: 60
-charban: 60
-charbanish: 60
-
-// To unban a player (4 same commands)
-unban: 60
-unbanish: 60
-charunban: 60
-charunbanish: 60
-
-// To send specified character in jails
-jail: 60
-
-// To discharge a prisoner (2 same commands)
-unjail: 60
-discharge: 60
-
-// Timed jailing
-jailfor: 60
-
-//Displays remaining jail time
-charjailtime: 60
-
-// To change disguise of another player/GM
-chardisguise: 60
-charundisguise: 60
-
-// Create a static warp portal that lasts until the next reboot
-addwarp: 60
-
-// drop a players possessions on the gruond
-chardropall: 60
-
-// put a players possessions in storage
-charstoreall: 60
-
-//Homunculus commands for gms
-homlvup: 60
-homevolution: 60
-makehomun: 60
-homfriendly: 60
-homhungry: 60
-
-//----------------------
-// 80: GM Chief commands
-
-// Set the map you are on to day.
-day: 80
-
-// Kills everyone on the server.
-doom: 80
-
-// Kills everyone on the map you are on.
-doommap: 80
-
-// Set the map you are currently on to night.
-night: 80
-
-// Recalls Everyone To Your Coordinates
-recallall: 80
-
-// Revives all players on the map.
-raisemap: 80
-
-// Revives all players on the server.
-raise: 80
-
-// Hides a NPC.
-hidenpc: 80
-
-// Unhides a NPC.
-shownpc: 80
-
-// Loads a Script
-loadnpc: 80
-
-// Unloads a NPC
-unloadnpc: 80
-
-// Move a NPC
-npcmove: 80
-
-// turn skills on for a map
-skillon: 80
-
-// turn skills off for a map
-skilloff: 80
-
-// Unmute a player
-unmute: 80
-
-//---------------------------
-// 99: Administrator commands
-
-// Disconnect all users from the server
-kickall: 99
-
-// Closes Map-Server
-mapexit: 99
-
-// Give information about terrain/area (debug function)
-gat: 99
-
-// Enables debugging
-packet: 99
-
-// Allows viewing/changing the map's water level (debug function)
-// NOTE: Requires access to the .grf files since the map height properties are not stored in the map cache.
-waterlevel: 99
-
-// Shows information about the map
-mapinfo: 99
-
-// Set Map Flags (WIP)
-mapflag: 99
-
-// Re-load item database (admin command)
-reloaditemdb: 99
-
-// Re-load monsters database (admin command)
-reloadmobdb: 99
-
-// Re-load skills database (admin command)
-reloadskilldb: 99
-
-// Re-load scripts (admin command)
-reloadscript: 99
-
-// Re-load GM level (admin command)
-reloadgmdb: 99
-
-// change a battle_config flag without rebooting server
-setbattleflag: 99
-
-// Refresh only status of players - SQL Only
-refreshonline: 99
-
-// Re-load gm command config (admin command)
-reloadatcommand: 99
-
-// Re-load battle config (admin command)
-reloadbattleconf: 99
-
-// Re-load status database (admin command)
-reloadstatusdb: 99
-
-// Re-load player info database (admin command)
-reloadpcdb: 99
-
-// Re-load the Message of the Day (admin command)
-reloadmotd: 99
-
-// Changes the GM level of another character
-// (lasts until reboot, or gm list reload)
-adjgmlvl: 99
-
-// Changes the required GM level of an @ command
-// (effect lasts until restart or command reload)
-adjcmdlvl: 99
-
-// [Un]Disguise All Players (admin command)
-disguiseall: 99
-undisguiseall: 99
-
-// Mute player (admin command)
-mute: 99
-mutearea: 99
-stfu: 99
-
-// Makes you inmune to attacks (monsters/players/skills cannot target/hit you, admin command)
-monsterignore: 99
-battleignore: 99
-
-//---------------------------------------------------------------
-// 99: Weather effects
-
-snow: 99
-
-clouds: 99
-
-clouds2: 99
-
-fog: 99
-
-fireworks: 99
-
-sakura: 99
-
-leaves:99
-
-// Stop all weather effects
-clearweather: 99
-
-//---------------------------------------------------------------
-// 0: Mail System - SQL Only commands - Must be enabled
-
-// Check # of messages.
-checkmail: 1
-
-// List all messages.
-listmail: 1
-
-// List only new mail.
-listnewmail: 1
-
-// Read a message.
-readmail: 1
-
-// Send mail.
-sendmail: 1
-
-// Send priority mail (tagged with Priority and cannot be deleted until read)
-sendprioritymail: 80
-
-// Delete a message.
-deletemail: 1
-
-//---------------------------------------------------------------
-// 100: Disabled commands
-gm: 100
-nuke: 100
-
-
-//---------------------
-// OTHER: not a command
-
-import: conf/import/atcommand_conf.txt
+// Athena atcommand Configuration file.
+// Translated by Peter Kieser <pfak@telus.net>
+
+// Set here the symbol that you want to use for your commands
+// Only 1 character is get (default is character_savecharacter_save'@'). You can set any character,
+// except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
+// With default character, all commands begin by a '@': <example> @revive
+command_symbol: @
+
+
+// Sets the level of the users that can use the GM commands.
+// <command name>: level
+// When battle_athena.conf has atcommand_gm_only set to no,
+// normal players (gm level 0) can use GM commands if you set 0 to the command level.
+// Max GM level is 99. If you want forbid a command to all people, set it with level 100.
+
+// Default values are set to define different GM levels like follow:
+// 0: normal player
+// -> no special advantage (only @time to know time and if at_command_gm_only is disabled)
+// 1: Super player
+// -> some (very) little advantages: storage, petrename, etc...
+// 10: Super player+
+// -> same of Super player with !go (very super player)
+// 20: Mediator
+// -> it's a GM that only need to know people, and move to their to speak with them (they can access to any command about wisps)
+// 40: Sub-GM
+// -> This GM can help a GM, and can not create item or zeny or modify a character (can have some information commands)
+// 50: Sub-GM+
+// -> This GM can change some non-important things on a character
+// 60: GM
+// -> can do almost anything (excep administration, and mass commands)
+// GM is the first level where we can modify a character with important value, create items or create zenys
+// 80: GM Chief
+// -> can do anything, except administration commands
+// 99: Administrator
+// -> can do anything!
+// 100: Disabled
+// -> Commands that aren't used. Note: You must use command level 100 to disable command. Commenting doesn't enough.
+
+
+//--------------------------
+// 0: normal player commands
+// None for security purposes.
+
+//-------------------------
+// 1: Super player commands
+
+//Displays a list of @ commands available to the player.
+commands: 1
+
+//Displays the server rates.
+rates: 1
+
+// Show server uptime
+uptime: 1
+
+//Shows/Hides the "there is a delay after a skill" message.
+showdelay: 1
+
+//Displays current levels and % progress.
+exp: 1
+
+// To change your (own) email (characters protection)
+// note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
+// if you want be sure of each e-mail disable this option (value: 100)
+email: 1
+
+// Show Monster info (rates, stats, drops, MVP stuff)
+mobinfo: 1
+monsterinfo: 1
+mi: 1
+
+// Show Item info (type, price, etc)
+iteminfo: 1
+ii: 1
+
+// Show who drops an item (mobs with highest drop rate)
+whodrops: 1
+
+// Syncs the position of the player on the client with the one stored in the server.
+refresh: 1
+
+// Give server time. (6 same commands)
+time: 1
+date: 1
+server_date: 1
+serverdate: 1
+server_time: 1
+servertime: 1
+
+// Displays SVN version of the server.
+version: 1
+
+// Suicide your character.
+die: 1
+
+// Enables you to rename your pet.
+petrename: 1
+
+party: 1
+
+// Brings up your personal storage wherever you are.
+storage: 1
+
+// Locate someone on a map, returns your coordinates if the person isn't on.
+where: 1
+
+// Duel organizing commands
+duel: 1
+invite: 1
+accept: 1
+reject: 1
+leave: 1
+
+// Away messsage
+away: 1
+aw: 1
+
+// Main chat
+main: 1
+
+// Autorejecting Deals/Invites
+noask: 1
+
+// Displays remaining jail time
+jailtime: 1
+
+//Homunculus commands for players
+homtalk: 1
+hominfo: 1
+
+//---------------------------
+// 10: Super player+ commands
+
+//Displays/Hides Experience gained
+showexp: 10
+
+//Displays/Hides Zeny gained
+showzeny: 10
+
+// Spawns you to set points in major cities.
+go: 10
+
+// Enables/disables autolooting from killed mobs.
+autoloot: 10
+
+// Allows you continue vending offline.
+autotrade: 10
+at: 10
+
+// Change Guild Master of your Guild
+changegm: 10
+
+// Change the leader of your party.
+changeleader: 10
+
+// Change the party item share rules.
+partyoption: 10
+
+// Command what the player's pet will say.
+pettalk: 10
+
+// Locates and displays the position of a certain mob on the current map.
+mobsearch: 10
+// Locates and displays the position of a certain mob on your mini-map
+showmobs: 10
+
+//----------------------
+// 20: Mediator commands
+
+// Displays helpfile in Athena base directory (2 same commands).
+help: 20
+h: 20
+help2: 20
+h2: 20
+
+// Warp yourself to a person (3 same commands + /shift).
+jumpto: 20
+goto: 20
+warpto: 20
+
+// Warp yourself to a person by PID (similar to above, cept you us the PID)
+jumptoid: 20
+jumptoid2: 20
+gotoid: 20
+gotoid2: 20
+warptoid: 20
+warptoid2: 20
+
+// Displays the motd file to all players
+gmotd: 20
+
+// follow a player (including warping to them)
+follow: 20
+
+// Sends a request to all connected GMs (via the gm whisper system)
+request: 20
+
+// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
+kick: 20
+
+// Disconnects a user from the server using their PID.
+kickid: 20
+kickid2: 20
+
+// Changes your apperance.
+model: 20
+
+// To get a peco to (un)ride
+mountpeco: 20
+
+// Returns list of logged in characters with their position (2 same commands).
+who: 20
+whois: 20
+
+// Returns list of logged in characters with their job.
+who2: 20
+
+// Returns list of logged in characters with their party/guild.
+who3: 20
+
+// Returns list of logged in characters with their position in a specifical map.
+whomap: 20
+
+// Returns list of logged in characters with their job in a specifical map.
+whomap2: 20
+
+// Returns list of logged in characters with their party/guild in a specifical map.
+whomap3: 20
+
+// Like @who+@who2+who3, but only for GM.
+whogm: 20
+
+// Change your appearence to other players to a mob.
+disguise: 20
+
+//Restore your normal appearance.
+undisguise: 20
+
+// Display ignore list of a player (people from which the player ignore wisps)
+charignorelist: 20
+
+// Displays the text as a normal message with the format "*name message*"
+// instead of "name : message" (Like the /me command in IRC)
+me: 20
+
+// Changes your name to your choice temporarly.
+fakename: 20
+
+// Changes your size.
+size: 20
+
+// Can command what other npcs (by name) can say.
+npctalk: 20
+
+//--------------------
+// 40: Sub-GM commands
+
+// Broadcast to the whole server. Using (1 command + /nb, /b).
+broadcast: 40
+
+// Broadcast to the map you are on (1 command + /lb, /nlb).
+localbroadcast: 40
+
+// Broadcast (with or without name).
+kami: 40
+kamib: 40
+
+// Enables you to go to a certain map, at (x,y) coordinates. (@mapmove + /mm or /mapmove)
+mapmove: 40
+
+// Enables GVG on a map (2 same commands).
+gvgon: 40
+gpvpon: 40
+
+// Turns GVG (Guild v. Guild) off on a map (2 same commands).
+gvgoff: 40
+gpvpoff: 40
+
+// Heals a person to full HP/SP.
+heal: 40
+
+// GM Hide (enables you to be invisible to characters, and most monsters) (1 command + /hide).
+hide: 40
+
+// Changes your job to one you specify (2 same commands).
+job: 40
+jobchange: 40
+
+// Enables you to to jump randomly on a map (that you are already on).
+jump: 40
+
+// Warps you to your last save point (2 same commands).
+return: 40
+load: 40
+
+// Enables lost skills.
+lostskill: 40
+
+// Saves a warp point.
+memo: 40
+
+// Set your character display options. (Visual effects of your character)
+option: 40
+
+// Sets the level of intemecy of your pet.
+petfriendly: 40
+
+// Sets hunger level of your pet.
+pethungry: 40
+
+// Turns PVP (Person v. Person) off on a map.
+pvpoff: 40
+
+// Enables PVP on a map.
+pvpon: 40
+
+// Enables platinum skills.
+questskill: 40
+
+// Sets the speed you can walk/attack at. Default is 150.
+speed: 40
+charspeed: 40
+
+// Enables spirit sphere balls.
+spiritball: 40
+
+// Warp yourself to a certain map, at (x,y) coordinates (2 same commands).
+rura: 40
+warp: 40
+
+// Changes GM clothes color (2 same commands)
+dye: 40
+ccolor: 40
+
+// Changes GM hair style (2 same commands)
+hairstyle: 40
+hstyle: 40
+
+// Changes GM hair color (2 same commands)
+haircolor: 40
+hcolor: 40
+
+// Deletes all your items.
+itemreset: 40
+
+// Displays distribution of players on the server per map (% on each map which has players)
+users: 40
+
+// Deletes floor items in your range of sight
+cleanmap: 40
+
+// Kill all monsters in map (without drops)
+killmonster2: 40
+
+// Sets your spawn point (aka save point).
+save: 40
+
+// Do some visual effect on your character
+effect: 40
+
+// Display all items of a player's cart
+charcartlist: 40
+
+// drop all your items
+dropall: 40
+
+// store all your items
+storeall: 40
+
+// allow other players to hit you out of pvp
+killable: 40
+
+// look up a skill by name
+skillid: 40
+
+// use a skill by id
+useskill: 40
+
+// What skills are required to get this skill
+skilltree: 40
+
+// Marriage skills
+marry: 40
+divorce: 40
+
+// make another player killable
+charkillable: 40
+
+// Same as above, cept uses PID.
+charkillableid: 40
+charkillableid2: 40
+
+// Play a Sound!
+sound: 40
+
+//---------------------
+// 50: Sub-GM+ commands
+
+guild: 50
+
+// Brings up your guild storage wherever you are.
+gstorage: 50
+
+// Spawns a monster, and a certain amount (3 same commands + /monster).
+spawn: 50
+monster: 50
+summon: 50
+
+// To get a peco to (un)ride for another player.
+charmountpeco: 50
+
+// Spawns a smaller sized version of a monster.
+monstersmall: 50
+
+// Spawns a larger sized version of a monster.
+monsterbig: 50
+
+// It will spawn a supportive clone of the given player.
+clone: 50
+
+// It will spawn a supportive clone of the given player that follows the creator around.
+slaveclone: 50
+
+// It will spawn an aggresive clone of the given player.
+evilclone: 50
+
+
+//----------------
+// 60: GM commands
+
+// Starts Guild Wars
+agitstart: 60
+
+// Ends Guild Wars
+agitend: 60
+
+// Resurects yourself.
+alive: 60
+
+// Levels your character to specified level (adds to your level) (3 same commands).
+lvup: 60
+baselvlup: 60
+blevel: 60
+
+// Raises your job level (3 same commands).
+joblvup: 60
+joblvlup: 60
+jlevel: 60
+
+// Changes the sex of yourself
+changesex: 60
+
+// Remove items from a character
+chardelitem: 60
+
+// Saves the respawn point of another character.
+charsave: 60
+
+// Levels your guild to specified level (2 same commands).
+guildlvup: 60
+guildlvlup: 60
+
+idsearch: 60
+
+// Creates an item of your choosing, either Item ID or Name (1 command + /item).
+item: 60
+
+// Creates a complet item (card, etc...) of your choosing, either Item ID or Name.
+item2: 60
+
+// Kill another character without hitting them.
+kill: 60
+
+// Same as above, cept uses PID.
+killid: 60
+killid2: 60
+
+// Kill all monsters in map (with drops)
+killmonster: 60
+
+// Creates yourself a pet egg, have to use Pet ID.
+makeegg: 60
+
+//Hatches an egg
+hatch: 60
+
+// Enable hitting a player even when not in pvp
+killer: 60
+
+// Creates weapon of desired element.
+produce: 60
+
+// Warps a character to you (1 command + /recall).
+recall: 60
+
+// Warps a character to you using their PID.
+recallid: 60
+recallid2: 60
+
+// Refines all weapons in your items list.
+refine: 60
+
+// Will repair all broken items in inventory.
+repairall: 60
+
+// Revives a character, and heals them.
+revive: 60
+
+// Same as above, cept uses PID.
+reviveid: 60
+reviveid2: 60
+
+// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
+rura+: 60
+charwarp: 60
+shuffle: 60
+
+// Change Status of your character
+str: 60
+agi: 60
+vit: 60
+int: 60
+dex: 60
+luk: 60
+
+// Gets all skills (4 same commands)
+allskill: 60
+allskills: 60
+skillall: 60
+skillsall: 60
+
+// sets GM stats to maximum (4 same commands)
+statall: 60
+statsall: 60
+allstats: 60
+allstat: 60
+
+// Gives you job points.
+stpoint: 60
+
+// Gives you skill points of desired amount.
+skpoint: 60
+
+// Warps all online character of a guild to you. (at least one member of that guild must be on.)
+guildrecall: 60
+
+// Warps all online character of a party to you. (at least one party member must be online.)
+partyrecall: 60
+
+// Allows you to spy on any Guilds Guild chat. (at least one member of that guild must be on.)
+// NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
+guildspy: 60
+
+//Allows you to spy on any party's party chat. (at least one party member must be online.)
+// NOTE: map server needs to be configured to enable spying to use this command (enable_spy: yes)
+partyspy: 60
+
+// Gives you money (zeny) of desired amount.
+zeny: 60
+
+// To block definitively a player (only administrator can unblock the account) (2 same commands)
+block: 60
+charblock: 60
+
+// To unblock a player (2 same commands)
+unblock: 60
+charunblock: 60
+
+// To ban a player for a limited time (only administrator can unban the account) (4 same commands)
+ban: 60
+banish: 60
+charban: 60
+charbanish: 60
+
+// To unban a player (4 same commands)
+unban: 60
+unbanish: 60
+charunban: 60
+charunbanish: 60
+
+// To send specified character in jails
+jail: 60
+
+// To discharge a prisoner (2 same commands)
+unjail: 60
+discharge: 60
+
+// Timed jailing
+jailfor: 60
+
+//Displays remaining jail time
+charjailtime: 60
+
+// To change disguise of another player/GM
+chardisguise: 60
+charundisguise: 60
+
+// Create a static warp portal that lasts until the next reboot
+addwarp: 60
+
+// drop a players possessions on the gruond
+chardropall: 60
+
+// put a players possessions in storage
+charstoreall: 60
+
+//Homunculus commands for gms
+homlvup: 60
+homevolution: 60
+makehomun: 60
+homfriendly: 60
+homhungry: 60
+
+//----------------------
+// 80: GM Chief commands
+
+// Set the map you are on to day.
+day: 80
+
+// Kills everyone on the server.
+doom: 80
+
+// Kills everyone on the map you are on.
+doommap: 80
+
+// Set the map you are currently on to night.
+night: 80
+
+// Recalls Everyone To Your Coordinates
+recallall: 80
+
+// Revives all players on the map.
+raisemap: 80
+
+// Revives all players on the server.
+raise: 80
+
+// Hides a NPC.
+hidenpc: 80
+
+// Unhides a NPC.
+shownpc: 80
+
+// Loads a Script
+loadnpc: 80
+
+// Unloads a NPC
+unloadnpc: 80
+
+// Move a NPC
+npcmove: 80
+
+// turn skills on for a map
+skillon: 80
+
+// turn skills off for a map
+skilloff: 80
+
+// Unmute a player
+unmute: 80
+
+//---------------------------
+// 99: Administrator commands
+
+// Disconnect all users from the server
+kickall: 99
+
+// Closes Map-Server
+mapexit: 99
+
+// Give information about terrain/area (debug function)
+gat: 99
+
+// Enables debugging
+packet: 99
+
+// Allows viewing/changing the map's water level (debug function)
+// NOTE: Requires access to the .grf files since the map height properties are not stored in the map cache.
+waterlevel: 99
+
+// Shows information about the map
+mapinfo: 99
+
+// Set Map Flags (WIP)
+mapflag: 99
+
+// Re-load item database (admin command)
+reloaditemdb: 99
+
+// Re-load monsters database (admin command)
+reloadmobdb: 99
+
+// Re-load skills database (admin command)
+reloadskilldb: 99
+
+// Re-load scripts (admin command)
+reloadscript: 99
+
+// Re-load GM level (admin command)
+reloadgmdb: 99
+
+// change a battle_config flag without rebooting server
+setbattleflag: 99
+
+// Refresh only status of players - SQL Only
+refreshonline: 99
+
+// Re-load gm command config (admin command)
+reloadatcommand: 99
+
+// Re-load battle config (admin command)
+reloadbattleconf: 99
+
+// Re-load status database (admin command)
+reloadstatusdb: 99
+
+// Re-load player info database (admin command)
+reloadpcdb: 99
+
+// Re-load the Message of the Day (admin command)
+reloadmotd: 99
+
+// Changes the GM level of another character
+// (lasts until reboot, or gm list reload)
+adjgmlvl: 99
+
+// Changes the required GM level of an @ command
+// (effect lasts until restart or command reload)
+adjcmdlvl: 99
+
+// [Un]Disguise All Players (admin command)
+disguiseall: 99
+undisguiseall: 99
+
+// Mute player (admin command)
+mute: 99
+mutearea: 99
+stfu: 99
+
+// Makes you inmune to attacks (monsters/players/skills cannot target/hit you, admin command)
+monsterignore: 99
+battleignore: 99
+
+//---------------------------------------------------------------
+// 99: Weather effects
+
+snow: 99
+
+clouds: 99
+
+clouds2: 99
+
+fog: 99
+
+fireworks: 99
+
+sakura: 99
+
+leaves:99
+
+// Stop all weather effects
+clearweather: 99
+
+//---------------------------------------------------------------
+// 0: Mail System - SQL Only commands - Must be enabled
+
+// Check # of messages.
+checkmail: 1
+
+// List all messages.
+listmail: 1
+
+// List only new mail.
+listnewmail: 1
+
+// Read a message.
+readmail: 1
+
+// Send mail.
+sendmail: 1
+
+// Send priority mail (tagged with Priority and cannot be deleted until read)
+sendprioritymail: 80
+
+// Delete a message.
+deletemail: 1
+
+//---------------------------------------------------------------
+// 100: Disabled commands
+gm: 100
+nuke: 100
+
+
+//---------------------
+// OTHER: not a command
+
+import: conf/import/atcommand_conf.txt
diff --git a/conf-tmpl/battle/battle.conf b/conf-tmpl/battle/battle.conf
index f7516836f..58daf1e4f 100644
--- a/conf-tmpl/battle/battle.conf
+++ b/conf-tmpl/battle/battle.conf
@@ -1,168 +1,168 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-//Note 4: Use bitmask values to specify who is affected
-// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-
-// Who should have a baseatk value (makes str affect damage)? (Note 4)
-enable_baseatk: 9
-
-// Who can have perfect flee? (Note 4)
-enable_perfect_flee: 1
-
-// Who can have critical attacks? (Note 4)
-// (Note that there are some skills that always do critical hit regardless of this)
-enable_critical: 1
-
-// Critical adjustment rate for non-players (Note 2)
-mob_critical_rate: 100
-critical_rate: 100
-
-// Should normal attacks give you a walk delay?
-// If no, 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)
-// If set, total walk delay is set to your attack animation duration divided by
-// this value (eg: 1 -> 100%, 2 -> 50%, 4->25%...)
-attack_walk_delay: 0
-
-// 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: 20
-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 no/0 will be like always endure)
-player_damage_delay_rate: 100
-
-// Undead type differeniate.
-// 0 = element undead
-// 1 = race undead
-// 2 = both
-undead_detect_type: 0
-
-// Does HP recover if hit by an attribute that's same as your own? (Note 1)
-attribute_recover: yes
-
-// 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 4)
-// By default, only players get the penalty.
-agi_penalty_target: 1
-
-// 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 VIT defense when more than vit_penalty_count monsters are targetting player
-// 0 = no penalty is applied
-// 1 = vit_penalty_num is reduced from FLEE as a %
-// 2 = vit_penalty_num is reduced from FLEE as an exact amount
-vit_penalty_type: 1
-
-// When vit penalty is enabled, to whom it should apply to? (Note 4)
-// 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 substraction 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
-
-// How to count the number of the enemies who do an agi penalty...
-// 1 or less: It is a count altogether.
-// 2: Full evasion exclusion
-// 3: Full evasion and evasion exclusion
-// 4 or more: Except all.
-agi_penalty_count_lv: 2
-
-// How to count the number of the enemies who do a vit penalty
-// 1 or less: It is a count altogether.
-// 2: Full evasion exclusion
-// 3: Full evasion and evasion exclusion
-// Four or more: Except all.
-vit_penalty_count_lv: 3
-
-// Change attacker's direction to face opponent on every attack? (Note 4)
-attack_direction_change: 15
-
-// For those who is set, attacks of Neutral element will not get any elemental
-// adjustment (100% versus on all defense-elements) (Note 4)
-// NOTE: This is the setting that makes it so non-players can hit for full
-// damage against Ghost-type targets (eg: Ghostring wearing players).
-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 yes, even thought it degrades performance a bit.
-delay_battle_damage: yes
-
-// Are arrows are consumed when used on a bow? (Note 1)
-arrow_decrement: yes
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+//Note 4: Use bitmask values to specify who is affected
+// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+
+// Who should have a baseatk value (makes str affect damage)? (Note 4)
+enable_baseatk: 9
+
+// Who can have perfect flee? (Note 4)
+enable_perfect_flee: 1
+
+// Who can have critical attacks? (Note 4)
+// (Note that there are some skills that always do critical hit regardless of this)
+enable_critical: 1
+
+// Critical adjustment rate for non-players (Note 2)
+mob_critical_rate: 100
+critical_rate: 100
+
+// Should normal attacks give you a walk delay?
+// If no, 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)
+// If set, total walk delay is set to your attack animation duration divided by
+// this value (eg: 1 -> 100%, 2 -> 50%, 4->25%...)
+attack_walk_delay: 0
+
+// 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: 20
+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 no/0 will be like always endure)
+player_damage_delay_rate: 100
+
+// Undead type differeniate.
+// 0 = element undead
+// 1 = race undead
+// 2 = both
+undead_detect_type: 0
+
+// Does HP recover if hit by an attribute that's same as your own? (Note 1)
+attribute_recover: yes
+
+// 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 4)
+// By default, only players get the penalty.
+agi_penalty_target: 1
+
+// 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 VIT defense when more than vit_penalty_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = vit_penalty_num is reduced from FLEE as a %
+// 2 = vit_penalty_num is reduced from FLEE as an exact amount
+vit_penalty_type: 1
+
+// When vit penalty is enabled, to whom it should apply to? (Note 4)
+// 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 substraction 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
+
+// How to count the number of the enemies who do an agi penalty...
+// 1 or less: It is a count altogether.
+// 2: Full evasion exclusion
+// 3: Full evasion and evasion exclusion
+// 4 or more: Except all.
+agi_penalty_count_lv: 2
+
+// How to count the number of the enemies who do a vit penalty
+// 1 or less: It is a count altogether.
+// 2: Full evasion exclusion
+// 3: Full evasion and evasion exclusion
+// Four or more: Except all.
+vit_penalty_count_lv: 3
+
+// Change attacker's direction to face opponent on every attack? (Note 4)
+attack_direction_change: 15
+
+// For those who is set, attacks of Neutral element will not get any elemental
+// adjustment (100% versus on all defense-elements) (Note 4)
+// NOTE: This is the setting that makes it so non-players can hit for full
+// damage against Ghost-type targets (eg: Ghostring wearing players).
+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 yes, even thought it degrades performance a bit.
+delay_battle_damage: yes
+
+// Are arrows are consumed when used on a bow? (Note 1)
+arrow_decrement: yes
diff --git a/conf-tmpl/battle/client.conf b/conf-tmpl/battle/client.conf
index 0168af923..66b5f1349 100644
--- a/conf-tmpl/battle/client.conf
+++ b/conf-tmpl/battle/client.conf
@@ -1,114 +1,114 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// Set here which client version do you accept. Add all values of clients:
-// Clients older than accepted versions, and versions not set to 'accepted'
-// here will be rejected when logging in
-// 1: Clients 2004-09-06aSakray and older (packet versions 4-9)
-// 2: 2004-09-06aSakexe (version 10)
-// 4: 2004-09-21aSakray (version 11)
-// 8: 2004-10-11aSakexe (version 12)
-// 16: 2004-10-25aSakexe (version 13)
-// 32: 2004-11-01aSakexe (version 14)
-// 64: 2004-12-06aSakexe (version 15)
-// 128: 2005-01-10aSakexe (version 16)
-// 256: 2005-05-09aSakexe (version 17)
-// 512: 2005-06-28aSakexe (version 18)
-// 1024: 2006-04-03aSakexe (version 19)
-// default value: 2047 (all clients)
-packet_ver_flag: 2047
-
-// Minimum delay between whisper/global/party/guild messages (in ms)
-// Messages that break this threshold are silently omitted.
-min_chat_delay: 0
-
-// valid range of dye's and styles on the client
-min_hair_style: 0
-max_hair_style: 23
-min_hair_color: 0
-max_hair_color: 8
-min_cloth_color: 0
-max_cloth_color: 4
-
-//When set to yes, 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: no
-
-//"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: 14
-
-// Maximum user LV to send to client
-// (Default is 99.. Never go above 127)
-//
-// this is only useful if you have adjusted your client
-// to expect levels higher then 99
-max_lv: 99
-
-// Level required to display an aura.
-// NOTE: This assumes that sending max_lv to the client will display the aura. 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.
-aura_lv: 99
-
-// Will tuxedo and wedding dresses be shown when worn? (Note 1)
-wedding_modifydisplay: no
-
-// Save Clothes color. (This will degrade performance) (Note 1)
-save_clothcolor: yes
-
-// Do not display cloth colors for the wedding class?
-// Note: Both save_clothcolor and wedding_modifydisplay have to be enabled
-// for this option to take effect. Set this to yes if your cloth palettes
-// pack doesn't has wedding palettes (or has less than the other jobs)
-wedding_ignorepalette: no
-
-// Do not display cloth colors for the Xmas class?
-// Set this to yes if your cloth palettes pack doesn't has Xmas palettes (or has less than the other jobs)
-xmas_ignorepalette: no
-
-// Set this to 1 if your clients have langtype problems and can't display motd properly
-motd_type: 0
-
-// Show eAthena version to users when the login?
-display_version: yes
-
-// When affected with the "Hallucination" status effect, send the effect to client? (Note 1)
-// Note: Set to 'no' if the client lags due to the "Wavy" screen effect.
-display_hallucination: yes
-
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// Set here which client version do you accept. Add all values of clients:
+// Clients older than accepted versions, and versions not set to 'accepted'
+// here will be rejected when logging in
+// 1: Clients 2004-09-06aSakray and older (packet versions 4-9)
+// 2: 2004-09-06aSakexe (version 10)
+// 4: 2004-09-21aSakray (version 11)
+// 8: 2004-10-11aSakexe (version 12)
+// 16: 2004-10-25aSakexe (version 13)
+// 32: 2004-11-01aSakexe (version 14)
+// 64: 2004-12-06aSakexe (version 15)
+// 128: 2005-01-10aSakexe (version 16)
+// 256: 2005-05-09aSakexe (version 17)
+// 512: 2005-06-28aSakexe (version 18)
+// 1024: 2006-04-03aSakexe (version 19)
+// default value: 2047 (all clients)
+packet_ver_flag: 2047
+
+// Minimum delay between whisper/global/party/guild messages (in ms)
+// Messages that break this threshold are silently omitted.
+min_chat_delay: 0
+
+// valid range of dye's and styles on the client
+min_hair_style: 0
+max_hair_style: 23
+min_hair_color: 0
+max_hair_color: 8
+min_cloth_color: 0
+max_cloth_color: 4
+
+//When set to yes, 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: no
+
+//"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: 14
+
+// Maximum user LV to send to client
+// (Default is 99.. Never go above 127)
+//
+// this is only useful if you have adjusted your client
+// to expect levels higher then 99
+max_lv: 99
+
+// Level required to display an aura.
+// NOTE: This assumes that sending max_lv to the client will display the aura. 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.
+aura_lv: 99
+
+// Will tuxedo and wedding dresses be shown when worn? (Note 1)
+wedding_modifydisplay: no
+
+// Save Clothes color. (This will degrade performance) (Note 1)
+save_clothcolor: yes
+
+// Do not display cloth colors for the wedding class?
+// Note: Both save_clothcolor and wedding_modifydisplay have to be enabled
+// for this option to take effect. Set this to yes if your cloth palettes
+// pack doesn't has wedding palettes (or has less than the other jobs)
+wedding_ignorepalette: no
+
+// Do not display cloth colors for the Xmas class?
+// Set this to yes if your cloth palettes pack doesn't has Xmas palettes (or has less than the other jobs)
+xmas_ignorepalette: no
+
+// Set this to 1 if your clients have langtype problems and can't display motd properly
+motd_type: 0
+
+// Show eAthena version to users when the login?
+display_version: yes
+
+// When affected with the "Hallucination" status effect, send the effect to client? (Note 1)
+// Note: Set to 'no' if the client lags due to the "Wavy" screen effect.
+display_hallucination: yes
+
diff --git a/conf-tmpl/battle/drops.conf b/conf-tmpl/battle/drops.conf
index 83d58af47..4399fc706 100644
--- a/conf-tmpl/battle/drops.conf
+++ b/conf-tmpl/battle/drops.conf
@@ -1,156 +1,156 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// If an item is dropped, does it go stright into the users inventory? (Note 1)
-item_auto_get: no
-
-// How long does it take for an item to disappear from the floor after it is dropped? (in miliseconds)
-flooritem_lifetime: 60000
-
-// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)
-item_first_get_time: 3000
-
-// Grace time during which only the first and second person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)
-// (Takes effect after item_first_get_time elapses)
-item_second_get_time: 1000
-
-// 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) (Note 3)
-// (Takes effect after the item_second_get_time elapses)
-item_third_get_time: 1000
-
-// Grace time during which only the person who did the most damage to a MVP can get the item? (in milliseconds) (Note 3)
-mvp_item_first_get_time: 10000
-
-// Grace time during which only the first and second person who did the most damage to a MVP can get the item? (in milliseconds) (Note 3)
-// (Takes effect after mvp_item_first_get_time elapses)
-mvp_item_second_get_time: 10000
-
-// Grace time during which only the first, second and third person who did the most damage to a MVP can get the item (Note 3)
-// (Takes effect after mvp_item_second_get_time elapses)
-mvp_item_third_get_time: 2000
-
-// Item drop rates (Note 2) (Note 3 applies to the rate settings only)
-
-// 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: no
-
-// Can the monster's drop rate become 0? (Note 1)
-// Defualt: no (as in official servers).
-drop_rate0item: no
-
-// drop_by_luk: Leave at 0 to use normal drop system. Anything higher than 0 will allow luk to affect drop rates. Note that both methods can be combined (the old method is applied first).
-
-//Old System. Your luk affects 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
-
-//Alternate System: Your luk affects the 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
-
-// The rate of monsters dropping ores by the skill Ore Discovery (Default is 100)
-finding_ore_rate: 100
-
-// Whether or not Marine Spheres and Floras summoned by Alchemist will drop items (they never give exp)? (Note 1)
-// This setting has three available values:
-// - 0/no: Nothing drops.
-// - 1/yes: Only marine spheres drop items.
-// - 2: All alchemist summons drop items.
-alchemist_summon_reward: 1
-
-// Make broadcast ** Player1 won Pupa's Pupa Card (chance 0.01%) ***
-// Note: It also announces STEAL skill usage with rare items
-// 0 = don't show announces at all
-// 1 = show announces for 0.01% drop chance items
-// 333 = show announces for 3.33% or lower drop chance items
-// 10000 = show announces for all items
-rare_drop_announce: 0
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// If an item is dropped, does it go stright into the users inventory? (Note 1)
+item_auto_get: no
+
+// How long does it take for an item to disappear from the floor after it is dropped? (in miliseconds)
+flooritem_lifetime: 60000
+
+// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)
+item_first_get_time: 3000
+
+// Grace time during which only the first and second person who did the most damage to a monster can get the item? (in milliseconds) (Note 3)
+// (Takes effect after item_first_get_time elapses)
+item_second_get_time: 1000
+
+// 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) (Note 3)
+// (Takes effect after the item_second_get_time elapses)
+item_third_get_time: 1000
+
+// Grace time during which only the person who did the most damage to a MVP can get the item? (in milliseconds) (Note 3)
+mvp_item_first_get_time: 10000
+
+// Grace time during which only the first and second person who did the most damage to a MVP can get the item? (in milliseconds) (Note 3)
+// (Takes effect after mvp_item_first_get_time elapses)
+mvp_item_second_get_time: 10000
+
+// Grace time during which only the first, second and third person who did the most damage to a MVP can get the item (Note 3)
+// (Takes effect after mvp_item_second_get_time elapses)
+mvp_item_third_get_time: 2000
+
+// Item drop rates (Note 2) (Note 3 applies to the rate settings only)
+
+// 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: no
+
+// Can the monster's drop rate become 0? (Note 1)
+// Defualt: no (as in official servers).
+drop_rate0item: no
+
+// drop_by_luk: Leave at 0 to use normal drop system. Anything higher than 0 will allow luk to affect drop rates. Note that both methods can be combined (the old method is applied first).
+
+//Old System. Your luk affects 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
+
+//Alternate System: Your luk affects the 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
+
+// The rate of monsters dropping ores by the skill Ore Discovery (Default is 100)
+finding_ore_rate: 100
+
+// Whether or not Marine Spheres and Floras summoned by Alchemist will drop items (they never give exp)? (Note 1)
+// This setting has three available values:
+// - 0/no: Nothing drops.
+// - 1/yes: Only marine spheres drop items.
+// - 2: All alchemist summons drop items.
+alchemist_summon_reward: 1
+
+// Make broadcast ** Player1 won Pupa's Pupa Card (chance 0.01%) ***
+// Note: It also announces STEAL skill usage with rare items
+// 0 = don't show announces at all
+// 1 = show announces for 0.01% drop chance items
+// 333 = show announces for 3.33% or lower drop chance items
+// 10000 = show announces for all items
+rare_drop_announce: 0
diff --git a/conf-tmpl/battle/exp.conf b/conf-tmpl/battle/exp.conf
index cdbebe3ec..01d68ab4c 100644
--- a/conf-tmpl/battle/exp.conf
+++ b/conf-tmpl/battle/exp.conf
@@ -1,108 +1,108 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//Note 4: The max level of classes is specified in the exp table.
-// See files db/exp.txt and db/exp2.txt to change them.
-//--------------------------------------------------------------
-
-// Rate at which exp. is given. (Note 2) (Note 3)
-base_exp_rate: 100
-
-// Rate at which job exp. is given. (Note 2) (Note 3)
-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: no
-
-// 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 - jAthena's (uses damage given / total damage as damage ratio)
-//1 - eAthena's (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: 25
-
-//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: 12
-
-// MVP bonus exp rate. (Note 2) (Note 3)
-mvp_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 recieved * 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: yes
-
-// 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: 1
-
-// 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, how much zeny should we penalize them with? (Note 3)
-// 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: no
-
-// Will display zeny earned (from mobs, trades, etc) (Note 1)
-disp_zeny: no
-
-// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)
-// If no, an equation will be used which preserves statpoints earned/lost
-// through external means (ie: stat point buyers/sellers)
-use_statpoint_table: yes
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//Note 4: The max level of classes is specified in the exp table.
+// See files db/exp.txt and db/exp2.txt to change them.
+//--------------------------------------------------------------
+
+// Rate at which exp. is given. (Note 2) (Note 3)
+base_exp_rate: 100
+
+// Rate at which job exp. is given. (Note 2) (Note 3)
+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: no
+
+// 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 - jAthena's (uses damage given / total damage as damage ratio)
+//1 - eAthena's (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: 25
+
+//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: 12
+
+// MVP bonus exp rate. (Note 2) (Note 3)
+mvp_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 recieved * 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: yes
+
+// 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: 1
+
+// 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, how much zeny should we penalize them with? (Note 3)
+// 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: no
+
+// Will display zeny earned (from mobs, trades, etc) (Note 1)
+disp_zeny: no
+
+// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)
+// If no, an equation will be used which preserves statpoints earned/lost
+// through external means (ie: stat point buyers/sellers)
+use_statpoint_table: yes
diff --git a/conf-tmpl/battle/gm.conf b/conf-tmpl/battle/gm.conf
index 6cc8a3d93..03040032a 100644
--- a/conf-tmpl/battle/gm.conf
+++ b/conf-tmpl/battle/gm.conf
@@ -1,107 +1,107 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// 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 'no', commands require exact player name. If 'yes', 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: yes
-
-// [GM] Can use all skills? (No or mimimum GM level)
-gm_all_skill: no
-
-// [GM] Can equip anything? (No or minimum GM level, can cause client errors.)
-gm_all_equipment: no
-
-// [GM] Can use skills without meeting the required conditions (no
-// blue gems? no or minimum GM level to bypass requirements.
-gm_skill_unconditional: no
-
-// [GM] Can join a password protected chat? (No or mimimum GM level)
-gm_join_chat: no
-
-// [GM] Can't be kicked from a chat? (No or mimimum GM level)
-gm_kick_chat: no
-
-// (@) GM Commands available only to GM's? (Note 1)
-// set to 'No', Normal players (gm level 0) can use GM commands _IF_ you set the command level to 0.
-// set to 'Yes', Normal players (gm level 0) can never use a GM command even if you set the command level to 0.
-atcommand_gm_only: no
-
-// Is the character of a GM account set as the object of a display by @ command etc. or not?
-hide_GM_session: no
-
-// Ban people that try trade dupe.
-// Duration of the ban, in minutes (default: 5). Value from 0 to 32767
-// to disable the ban, set 0
-ban_hack_trade: 5
-
-// Set here minimum level of a (online) GM that can receive all informations about any player that try to hack, spoof a name, etc.
-// Values are from 0 to 100.
-// 100: disable information
-// 0: send to any people, including normal players
-// default: 60, according to GM definition in atcommand_athena.conf
-hack_info_GM_level: 60
-
-// Set here the minimum GM level to disable the nowarp (from) and nowarpto (to) flags.
-// This option is mainly used in AT_commands (@memo, @warp, @charwarp, @go, etc...). All GM commands used to move or set a new map check nowarp and nowarpto flags.
-// default: 20 (first level after normal player or super'normal' player)
-any_warp_GM_min_level: 20
-
-// The minimum level for a GM to be unable to distribyte items.
-// You should set this to the same level @item is set to in the atcommand.conf
-// NEVER SET THIS VALUE TO 0, or you will block drop/trade for normal players
-gm_cant_drop_min_lv: 1
-
-//The trust level for your GMs. Any GMs ABOVE this level will be able to distribute items
-//ie: Use Storage/Guild Storage, Drop Items, Use Vend, Trade items.
-gm_cant_drop_max_lv: 98
-
-// Minimum GM level to see the hp of every player? (Default: 60)
-// no/0 can be used to disable it.
-disp_hpmeter: 0
-
-// At what GM level can users see Account/Character IDs in the @who command?
-who_display_aid: 40
-
-// Players Titles (check msg_athena.conf for title strings)
-// You may assign different titles for your Players and GMs
-title_lvl1: 1
-title_lvl2: 10
-title_lvl3: 20
-title_lvl4: 40
-title_lvl5: 50
-title_lvl6: 60
-title_lvl7: 80
-title_lvl8: 99
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// 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 'no', commands require exact player name. If 'yes', 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: yes
+
+// [GM] Can use all skills? (No or mimimum GM level)
+gm_all_skill: no
+
+// [GM] Can equip anything? (No or minimum GM level, can cause client errors.)
+gm_all_equipment: no
+
+// [GM] Can use skills without meeting the required conditions (no
+// blue gems? no or minimum GM level to bypass requirements.
+gm_skill_unconditional: no
+
+// [GM] Can join a password protected chat? (No or mimimum GM level)
+gm_join_chat: no
+
+// [GM] Can't be kicked from a chat? (No or mimimum GM level)
+gm_kick_chat: no
+
+// (@) GM Commands available only to GM's? (Note 1)
+// set to 'No', Normal players (gm level 0) can use GM commands _IF_ you set the command level to 0.
+// set to 'Yes', Normal players (gm level 0) can never use a GM command even if you set the command level to 0.
+atcommand_gm_only: no
+
+// Is the character of a GM account set as the object of a display by @ command etc. or not?
+hide_GM_session: no
+
+// Ban people that try trade dupe.
+// Duration of the ban, in minutes (default: 5). Value from 0 to 32767
+// to disable the ban, set 0
+ban_hack_trade: 5
+
+// Set here minimum level of a (online) GM that can receive all informations about any player that try to hack, spoof a name, etc.
+// Values are from 0 to 100.
+// 100: disable information
+// 0: send to any people, including normal players
+// default: 60, according to GM definition in atcommand_athena.conf
+hack_info_GM_level: 60
+
+// Set here the minimum GM level to disable the nowarp (from) and nowarpto (to) flags.
+// This option is mainly used in AT_commands (@memo, @warp, @charwarp, @go, etc...). All GM commands used to move or set a new map check nowarp and nowarpto flags.
+// default: 20 (first level after normal player or super'normal' player)
+any_warp_GM_min_level: 20
+
+// The minimum level for a GM to be unable to distribyte items.
+// You should set this to the same level @item is set to in the atcommand.conf
+// NEVER SET THIS VALUE TO 0, or you will block drop/trade for normal players
+gm_cant_drop_min_lv: 1
+
+//The trust level for your GMs. Any GMs ABOVE this level will be able to distribute items
+//ie: Use Storage/Guild Storage, Drop Items, Use Vend, Trade items.
+gm_cant_drop_max_lv: 98
+
+// Minimum GM level to see the hp of every player? (Default: 60)
+// no/0 can be used to disable it.
+disp_hpmeter: 0
+
+// At what GM level can users see Account/Character IDs in the @who command?
+who_display_aid: 40
+
+// Players Titles (check msg_athena.conf for title strings)
+// You may assign different titles for your Players and GMs
+title_lvl1: 1
+title_lvl2: 10
+title_lvl3: 20
+title_lvl4: 40
+title_lvl5: 50
+title_lvl6: 60
+title_lvl7: 80
+title_lvl8: 99
diff --git a/conf-tmpl/battle/guild.conf b/conf-tmpl/battle/guild.conf
index 0d2e5d079..405df0cd7 100644
--- a/conf-tmpl/battle/guild.conf
+++ b/conf-tmpl/battle/guild.conf
@@ -1,70 +1,70 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// When making a guild, an Emperium is consumed? (Note 1)
-guild_emperium_check: yes
-
-// Maximum tax limit on a guild member.
-guild_exp_limit: 50
-
-// Maximum castles one guild can own (0 - unlimited)
-guild_max_castles: 0
-
-// Damage adjustments for WOE battles against defending Guild monsters (Note 2)
-castle_defense_rate: 100
-
-// Melee damage adjustments (non skills) for WoE battles (Guild Vs Guild) (Note 2)
-gvg_short_attack_damage_rate: 80
-
-// Ranged damage adjustments (non skills) for WoE battles (Guild Vs Guild) (Note 2)
-gvg_long_attack_damage_rate: 80
-
-// Weapon skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_weapon_attack_damage_rate: 60
-
-// Magic skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_magic_attack_damage_rate: 60
-
-// Misc skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_misc_attack_damage_rate: 60
-
-// 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
-
-// When the emperium is broken with WoE mode on, How Long Before The
-// Declaration Of Castle Owner and Removal of Monsters/Players from
-// Castle. (in milliseconds) (Note 3)
-gvg_eliminate_time: 7000
-
-// Can the 'Glory of Guild' skill be learnt in the Guild window,
-// and does changing emblems require it? (Note 1)
-// P.S: This new guild skill only appears for 2004-10-25aSakexe or newer
-// P.S 2: This skill is not implemented on official servers, so its only optional
-require_glory_guild: no
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// When making a guild, an Emperium is consumed? (Note 1)
+guild_emperium_check: yes
+
+// Maximum tax limit on a guild member.
+guild_exp_limit: 50
+
+// Maximum castles one guild can own (0 - unlimited)
+guild_max_castles: 0
+
+// Damage adjustments for WOE battles against defending Guild monsters (Note 2)
+castle_defense_rate: 100
+
+// Melee damage adjustments (non skills) for WoE battles (Guild Vs Guild) (Note 2)
+gvg_short_attack_damage_rate: 80
+
+// Ranged damage adjustments (non skills) for WoE battles (Guild Vs Guild) (Note 2)
+gvg_long_attack_damage_rate: 80
+
+// Weapon skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_weapon_attack_damage_rate: 60
+
+// Magic skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_magic_attack_damage_rate: 60
+
+// Misc skills damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_misc_attack_damage_rate: 60
+
+// 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
+
+// When the emperium is broken with WoE mode on, How Long Before The
+// Declaration Of Castle Owner and Removal of Monsters/Players from
+// Castle. (in milliseconds) (Note 3)
+gvg_eliminate_time: 7000
+
+// Can the 'Glory of Guild' skill be learnt in the Guild window,
+// and does changing emblems require it? (Note 1)
+// P.S: This new guild skill only appears for 2004-10-25aSakexe or newer
+// P.S 2: This skill is not implemented on official servers, so its only optional
+require_glory_guild: no
diff --git a/conf-tmpl/battle/homunc.conf b/conf-tmpl/battle/homunc.conf
index c44fbc7bc..773d37471 100644
--- a/conf-tmpl/battle/homunc.conf
+++ b/conf-tmpl/battle/homunc.conf
@@ -1,37 +1,37 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// The rate a homunculus will get friendly by feeding it. (Note 2)
-homunculus_friendly_rate: 100
-
-// 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: 0
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// The rate a homunculus will get friendly by feeding it. (Note 2)
+homunculus_friendly_rate: 100
+
+// 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: 0
diff --git a/conf-tmpl/battle/items.conf b/conf-tmpl/battle/items.conf
index 533cac81d..98f1a7034 100644
--- a/conf-tmpl/battle/items.conf
+++ b/conf-tmpl/battle/items.conf
@@ -1,87 +1,87 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// The highest value at which an item can be sold via the merchant vend skill. (in zeny) (Note 3)
-vending_max_value: 1000000000
-
-// Show the buyer's name when successfully vended an item
-buyer_name: yes
-
-// 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 1)
-produce_item_name_input: yes
-
-// Do produced potions have the maker's name on them? (Note 1)
-produce_potion_name_input: yes
-
-// Do crafted arrows have the maker's name on them? (Note 1)
-making_arrow_name_input: no
-
-// Do created holy waters have the maker's name on it? (Note 1)
-holywater_name_input: no
-
-// Do created poison bottles have the maker's name on it? (Note 1)
-cdp_name_input: no
-
-// Is a monster summoned via dead branch aggressive? (Note 1)
-dead_branch_active: yes
-
-// Are summoned monsters level greater then your base level? (dead branches) (Note 1)
-random_monster_checklv: yes
-
-// 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: yes
-
-// 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: no
-
-// 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: no
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// The highest value at which an item can be sold via the merchant vend skill. (in zeny) (Note 3)
+vending_max_value: 1000000000
+
+// Show the buyer's name when successfully vended an item
+buyer_name: yes
+
+// 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 1)
+produce_item_name_input: yes
+
+// Do produced potions have the maker's name on them? (Note 1)
+produce_potion_name_input: yes
+
+// Do crafted arrows have the maker's name on them? (Note 1)
+making_arrow_name_input: no
+
+// Do created holy waters have the maker's name on it? (Note 1)
+holywater_name_input: no
+
+// Do created poison bottles have the maker's name on it? (Note 1)
+cdp_name_input: no
+
+// Is a monster summoned via dead branch aggressive? (Note 1)
+dead_branch_active: yes
+
+// Are summoned monsters level greater then your base level? (dead branches) (Note 1)
+random_monster_checklv: yes
+
+// 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: yes
+
+// 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: no
+
+// 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: no
diff --git a/conf-tmpl/battle/misc.conf b/conf-tmpl/battle/misc.conf
index 53d800f1c..cddeb0d8b 100644
--- a/conf-tmpl/battle/misc.conf
+++ b/conf-tmpl/battle/misc.conf
@@ -1,142 +1,142 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-//Note 4: Use bitmask values to specify who is affected
-// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// 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 (yes), 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: 15
-
-// 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
-
-// For PK servers. Damage adjustment settings, these follow the same logic
-// as their WoE counterparts (see guild.conf)
-pk_short_attack_damage_rate: 80
-pk_long_attack_damage_rate: 70
-pk_weapon_attack_damage_rate: 60
-pk_magic_attack_damage_rate: 60
-pk_misc_attack_damage_rate: 60
-
-// Display skill usage/errors in console? (for debug only) (default: off) (Note 4)
-skill_log: 0
-
-// Display battle log? (for debug only) (default: off) (Note 1)
-battle_log: off
-
-// Display save log? (for debug only) (default: off) (Note 1)
-save_log: off
-
-// Display errors? (for debug only) (default: off) (Note 1)
-error_log: on
-
-// Display other stuff? (for debug only) (default: off) (Note 1)
-etc_log: off
-
-// You can turn the following 5 settings off if you don't need them,
-// or if you're experiencing problems with GRF loading
-//
-// Override item names from GRF file? (Note 1)
-item_name_override_grffile: no
-//
-// Override item equip positions from GRF file? (Note 1)
-item_equip_override_grffile: no
-//
-// Override item slots from GRF file? (Note 1)
-item_slots_override_grffile: no
-//
-// Override 'indoors' mapflags from GRF file? (Note 1)
-indoors_override_grffile: no
-//
-// Override SP used per level from GRF file? (Note 1)
-// Turn this off if you have a customised skill_require_db.txt
-skill_sp_override_grffile: no
-//
-// Read card illustrations from GRF file? (Note 1)
-cardillust_read_grffile: yes
-
-// Do you want to debug warp points? If set to yes, 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: no
-
-// Choose if server begin with night (yes) or day (no)
-night_at_start: no
-
-// 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) (Note 3)
-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) (Note 3)
-night_duration: 0
-
-// Using duel on pvp-maps
-duel_allow_pvp: no
-
-// Using duel on gvg-maps
-duel_allow_gvg: no
-
-// Allow using teleport/warp when dueling
-duel_allow_teleport: no
-
-// Autoleave duel when die
-duel_autoleave_when_die: yes
-
-// Delay between using @duel in minutes
-duel_time_interval: 60
-
-// Restrict duel usage to same map
-duel_only_on_same_map: no
-
-// Determines max number of characters that can stack within a single cell.
-// NOTE: For this setting to make effect you have to use a server compiled with
-// Cell Stack Limit support (see src/map/map.h)
-cell_stack_limit: 1
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+//Note 4: Use bitmask values to specify who is affected
+// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// 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 (yes), 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: 15
+
+// 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
+
+// For PK servers. Damage adjustment settings, these follow the same logic
+// as their WoE counterparts (see guild.conf)
+pk_short_attack_damage_rate: 80
+pk_long_attack_damage_rate: 70
+pk_weapon_attack_damage_rate: 60
+pk_magic_attack_damage_rate: 60
+pk_misc_attack_damage_rate: 60
+
+// Display skill usage/errors in console? (for debug only) (default: off) (Note 4)
+skill_log: 0
+
+// Display battle log? (for debug only) (default: off) (Note 1)
+battle_log: off
+
+// Display save log? (for debug only) (default: off) (Note 1)
+save_log: off
+
+// Display errors? (for debug only) (default: off) (Note 1)
+error_log: on
+
+// Display other stuff? (for debug only) (default: off) (Note 1)
+etc_log: off
+
+// You can turn the following 5 settings off if you don't need them,
+// or if you're experiencing problems with GRF loading
+//
+// Override item names from GRF file? (Note 1)
+item_name_override_grffile: no
+//
+// Override item equip positions from GRF file? (Note 1)
+item_equip_override_grffile: no
+//
+// Override item slots from GRF file? (Note 1)
+item_slots_override_grffile: no
+//
+// Override 'indoors' mapflags from GRF file? (Note 1)
+indoors_override_grffile: no
+//
+// Override SP used per level from GRF file? (Note 1)
+// Turn this off if you have a customised skill_require_db.txt
+skill_sp_override_grffile: no
+//
+// Read card illustrations from GRF file? (Note 1)
+cardillust_read_grffile: yes
+
+// Do you want to debug warp points? If set to yes, 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: no
+
+// Choose if server begin with night (yes) or day (no)
+night_at_start: no
+
+// 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) (Note 3)
+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) (Note 3)
+night_duration: 0
+
+// Using duel on pvp-maps
+duel_allow_pvp: no
+
+// Using duel on gvg-maps
+duel_allow_gvg: no
+
+// Allow using teleport/warp when dueling
+duel_allow_teleport: no
+
+// Autoleave duel when die
+duel_autoleave_when_die: yes
+
+// Delay between using @duel in minutes
+duel_time_interval: 60
+
+// Restrict duel usage to same map
+duel_only_on_same_map: no
+
+// Determines max number of characters that can stack within a single cell.
+// NOTE: For this setting to make effect you have to use a server compiled with
+// Cell Stack Limit support (see src/map/map.h)
+cell_stack_limit: 1
diff --git a/conf-tmpl/battle/monster.conf b/conf-tmpl/battle/monster.conf
index 7549ea3e8..1ea2c822e 100644
--- a/conf-tmpl/battle/monster.conf
+++ b/conf-tmpl/battle/monster.conf
@@ -1,209 +1,209 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// [MVP] Summoned monsters HP rate, that is, monsters summoned by an MVP will have this much HP. (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. The mask bits are
-// (add to include multiple settings):
-// 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: If set, when a mob loses track of their target, they stop walking
-// inmediately. Otherwise, they continue to their last target tile. When
-// set mobs also 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 vecinity
-// 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_npc_warp below)
-// 0x080: When set, aggressive mobs will give the same priority to Homuns and
-// players and will go after the closest target instead of always picking
-// the homunculus
-// 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 be applied to all entries of
-// the same skill, instead of only that particular entry (eg: Mob has heal
-// on six lines for different conditions, when set, whenever one of the six
-// trigger, all of them will share the delay)
-// Example: 0x140 -> Chase players through warps + use skills in random order.
-monster_ai: 0
-
-// 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
-
-// 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: yes
-
-// 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 1)
-// Setting to no/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 inmediate 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 yes, all monsters will have a random respawn spot across the whole
-// map regardless of what the mob-spawn file says.
-force_random_spawn: no
-
-// 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: 2
-
-// 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: 3
-
-// Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
-// chance of triggering the master's autospell cards? (Note 1)
-summons_trigger_autospells: yes
-
-// 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: yes
-
-// 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 yes 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: no
-
-// If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1)
-monster_class_change_full_recover: no
-
-// 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: no
-
-// 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: no
-mobs_level_up_exp_rate: 1
-
-// Dynamic Mobs Options
-// Use dynamic mobs? (recommended for small-medium sized servers)
-dynamic_mobs: yes
-
-// Remove Mobs even if they are hurt
-mob_remove_damaged: yes
-
-// Delay before removing mobs from empty maps (default 5 min = 300 secs)
-mob_remove_delay: 300000
-
-// Can add a delay before sending monster death packet (time is in milliseconds and default 0 is off)
-// Increasing this can fix the problem with monster sprites still appearing after it died. Recommended value: 10.
-mob_clear_delay: 0
-
-// 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
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// [MVP] Summoned monsters HP rate, that is, monsters summoned by an MVP will have this much HP. (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. The mask bits are
+// (add to include multiple settings):
+// 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: If set, when a mob loses track of their target, they stop walking
+// inmediately. Otherwise, they continue to their last target tile. When
+// set mobs also 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 vecinity
+// 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_npc_warp below)
+// 0x080: When set, aggressive mobs will give the same priority to Homuns and
+// players and will go after the closest target instead of always picking
+// the homunculus
+// 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 be applied to all entries of
+// the same skill, instead of only that particular entry (eg: Mob has heal
+// on six lines for different conditions, when set, whenever one of the six
+// trigger, all of them will share the delay)
+// Example: 0x140 -> Chase players through warps + use skills in random order.
+monster_ai: 0
+
+// 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
+
+// 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: yes
+
+// 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 1)
+// Setting to no/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 inmediate 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 yes, all monsters will have a random respawn spot across the whole
+// map regardless of what the mob-spawn file says.
+force_random_spawn: no
+
+// 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: 2
+
+// 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: 3
+
+// Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
+// chance of triggering the master's autospell cards? (Note 1)
+summons_trigger_autospells: yes
+
+// 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: yes
+
+// 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 yes 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: no
+
+// If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1)
+monster_class_change_full_recover: no
+
+// 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: no
+
+// 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: no
+mobs_level_up_exp_rate: 1
+
+// Dynamic Mobs Options
+// Use dynamic mobs? (recommended for small-medium sized servers)
+dynamic_mobs: yes
+
+// Remove Mobs even if they are hurt
+mob_remove_damaged: yes
+
+// Delay before removing mobs from empty maps (default 5 min = 300 secs)
+mob_remove_delay: 300000
+
+// Can add a delay before sending monster death packet (time is in milliseconds and default 0 is off)
+// Increasing this can fix the problem with monster sprites still appearing after it died. Recommended value: 10.
+mob_clear_delay: 0
+
+// 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
diff --git a/conf-tmpl/battle/party.conf b/conf-tmpl/battle/party.conf
index 268f8b1d8..5e18867e2 100644
--- a/conf-tmpl/battle/party.conf
+++ b/conf-tmpl/battle/party.conf
@@ -1,65 +1,65 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// If someone loots, show name in party? (Note 1)
-show_steal_in_same_party: no
-
-// 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: eAthena - bar is updated with the party map dots (up to 1 second delay)
-party_hp_mode: 0
-
-// When 'Party Share' item sharing is enabled in a party,
-// tell the picker which party-member received the item? (Note 1)
-show_party_share_picker: no
-
-// 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 sharing disabled for idle members in the party?
-// Set to no, 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: no
-
-// Give additional experience bonus per party-member involved on even-share parties?
-// (eg: If set to 10, a even-share party of 5 people will receive +40% exp)
-party_even_share_bonus: 0
-
-// If a party uses a skill with penalties do they apply? (Note 1)
-party_skill_penalty: yes
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// If someone loots, show name in party? (Note 1)
+show_steal_in_same_party: no
+
+// 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: eAthena - bar is updated with the party map dots (up to 1 second delay)
+party_hp_mode: 0
+
+// When 'Party Share' item sharing is enabled in a party,
+// tell the picker which party-member received the item? (Note 1)
+show_party_share_picker: no
+
+// 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 sharing disabled for idle members in the party?
+// Set to no, 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: no
+
+// Give additional experience bonus per party-member involved on even-share parties?
+// (eg: If set to 10, a even-share party of 5 people will receive +40% exp)
+party_even_share_bonus: 0
+
+// If a party uses a skill with penalties do they apply? (Note 1)
+party_skill_penalty: yes
diff --git a/conf-tmpl/battle/pet.conf b/conf-tmpl/battle/pet.conf
index 9d02eb1f1..e201ed840 100644
--- a/conf-tmpl/battle/pet.conf
+++ b/conf-tmpl/battle/pet.conf
@@ -1,92 +1,92 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// Rate for catching pets (Note 2)
-pet_catch_rate: 100
-
-// Can you name a pet more then once? (Note 1)
-pet_rename: no
-
-// 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: yes
-
-// When the master attacks a monster, whether or not the pet will also attack. (Note 1)
-pet_attack_support: no
-
-// When the master receives damage from the monster, whether or not the pet attacks back. (Note 1)
-pet_damage_support: no
-
-// 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
-
-// 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: no
-
-// 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: no
-
-// 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
-
-// Are pets disabled during Guild Wars?
-// If set to yes, pets are automatically returned to egg when entering castles during WoE times
-// and hatching is forbidden within as well.
-pet_disable_in_gvg: no
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// Rate for catching pets (Note 2)
+pet_catch_rate: 100
+
+// Can you name a pet more then once? (Note 1)
+pet_rename: no
+
+// 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: yes
+
+// When the master attacks a monster, whether or not the pet will also attack. (Note 1)
+pet_attack_support: no
+
+// When the master receives damage from the monster, whether or not the pet attacks back. (Note 1)
+pet_damage_support: no
+
+// 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
+
+// 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: no
+
+// 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: no
+
+// 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
+
+// Are pets disabled during Guild Wars?
+// If set to yes, pets are automatically returned to egg when entering castles during WoE times
+// and hatching is forbidden within as well.
+pet_disable_in_gvg: no
diff --git a/conf-tmpl/battle/player.conf b/conf-tmpl/battle/player.conf
index 3e816a40b..fbec77f15 100644
--- a/conf-tmpl/battle/player.conf
+++ b/conf-tmpl/battle/player.conf
@@ -1,147 +1,147 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// 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 'yes' on official servers)
-left_cardfix_to_right: yes
-
-// 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: 0
-
-// 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: no
-
-// When set to yes, 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)
-// Default: yes [Kevin]
-player_skillup_limit: yes
-
-// Quest skills can be learned? (Note 1)
-// Setting this to yes can open an exploit on your server!
-quest_skill_learn: no
-
-// When skills are reset, quest skills are reset as well? (Note 1)
-// Setting this to yes can open an exploit on your server!
-// NOTE: If you have quest_skill_learn set to yes, quest skills are always reset.
-quest_skill_reset: no
-
-// You must have basic skills to be able to sit, trade, form a party or create a chatroom? (Note 1)
-basic_skill_check: yes
-
-// 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.
-// If you attack a monster, it will attack you back regaurdless of this setting. (I think)
-player_invincible_time: 5000
-
-// The time interval for HP to restore naturally. (in milliseconds) (Note 3)
-natural_healhp_interval: 6000
-
-// The time interval for SP to restore naturally. (in milliseconds) (Note 3)
-natural_healsp_interval: 8000
-
-// Automatic healing skill's time interval. (in milliseconds) (Note 3)
-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
-
-// Maximum walk speed rate (200 would be capped to twice the normal speed)
-max_walk_speed: 300
-
-// Maximum HP. (Default is 1000000) (Note 3)
-max_hp: 1000000
-
-// Maximum SP. (Default is 1000000) (Note 3)
-max_sp: 1000000
-
-// Max limit of char stats. (agi, str, etc.)
-max_parameter: 99
-
-// Same as max_parameter, but for baby classes.
-max_baby_parameter: 80
-
-// Max armor def/mdef
-// 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. (Note 3)
-max_cart_weight: 8000
-
-// Prevent logout of players after being hit for how long (in ms, 0 disables)?
-prevent_logout: 10000
-
-// Display the drained hp/sp values from normal attacks? (Ie: Hunter Fly card)
-show_hp_sp_drain: no
-
-// Display the gained hp/sp values from killing mobs? (Ie: Sky Deleter Card)
-show_hp_sp_gain: yes
-
-
-// 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.
-friend_auto_add: no
-
-// Are other requests accepted during [various things[party,guild]] a request or not?
-// It does not accept by no accepted by yes.
-invite_request_check: yes
-
-// Players' will drop a 'Skull' when killed?
-// 1 - Dropped only in PvP maps
-// 2 - Dropped in all situations
-// 0 - Disabled
-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
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// 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 'yes' on official servers)
+left_cardfix_to_right: yes
+
+// 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: 0
+
+// 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: no
+
+// When set to yes, 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)
+// Default: yes [Kevin]
+player_skillup_limit: yes
+
+// Quest skills can be learned? (Note 1)
+// Setting this to yes can open an exploit on your server!
+quest_skill_learn: no
+
+// When skills are reset, quest skills are reset as well? (Note 1)
+// Setting this to yes can open an exploit on your server!
+// NOTE: If you have quest_skill_learn set to yes, quest skills are always reset.
+quest_skill_reset: no
+
+// You must have basic skills to be able to sit, trade, form a party or create a chatroom? (Note 1)
+basic_skill_check: yes
+
+// 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.
+// If you attack a monster, it will attack you back regaurdless of this setting. (I think)
+player_invincible_time: 5000
+
+// The time interval for HP to restore naturally. (in milliseconds) (Note 3)
+natural_healhp_interval: 6000
+
+// The time interval for SP to restore naturally. (in milliseconds) (Note 3)
+natural_healsp_interval: 8000
+
+// Automatic healing skill's time interval. (in milliseconds) (Note 3)
+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
+
+// Maximum walk speed rate (200 would be capped to twice the normal speed)
+max_walk_speed: 300
+
+// Maximum HP. (Default is 1000000) (Note 3)
+max_hp: 1000000
+
+// Maximum SP. (Default is 1000000) (Note 3)
+max_sp: 1000000
+
+// Max limit of char stats. (agi, str, etc.)
+max_parameter: 99
+
+// Same as max_parameter, but for baby classes.
+max_baby_parameter: 80
+
+// Max armor def/mdef
+// 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. (Note 3)
+max_cart_weight: 8000
+
+// Prevent logout of players after being hit for how long (in ms, 0 disables)?
+prevent_logout: 10000
+
+// Display the drained hp/sp values from normal attacks? (Ie: Hunter Fly card)
+show_hp_sp_drain: no
+
+// Display the gained hp/sp values from killing mobs? (Ie: Sky Deleter Card)
+show_hp_sp_gain: yes
+
+
+// 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.
+friend_auto_add: no
+
+// Are other requests accepted during [various things[party,guild]] a request or not?
+// It does not accept by no accepted by yes.
+invite_request_check: yes
+
+// Players' will drop a 'Skull' when killed?
+// 1 - Dropped only in PvP maps
+// 2 - Dropped in all situations
+// 0 - Disabled
+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
diff --git a/conf-tmpl/battle/skill.conf b/conf-tmpl/battle/skill.conf
index f0c78c814..233069a85 100644
--- a/conf-tmpl/battle/skill.conf
+++ b/conf-tmpl/battle/skill.conf
@@ -1,278 +1,278 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-//Note 4: Use bitmask values to specify who is affected
-// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// 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
-
-// Is the delay time dependant on the caster's AGI? (Note 1)
-// Note: On Official servers no stat affects delay time
-delay_dependon_agi: no
-
-// Minimum allowed delay for ANY skills after casting (in miliseconds) (Note 1)
-// Note: Setting this to anything above 0 can stop speedhacks.
-min_skill_delay_limit: 100
-
-// Default skill delay for non-weapon based skills which have no delay specified.
-// This delay is also 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_skill_delay: 300
-
-//Completely disable skill delay of the following types (Note 4)
-//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 (instacast)
-// If delay_dependon_agi is enabled, this is also the amount of agi required
-// for zero delay on skills.
-castrate_dex_scale: 150
-
-// Will normal attacks be able to ignore the delay after skills? (Note 1)
-skill_delay_attack_enable: yes
-
-// 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: 15
-
-// 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: no
-
-// Does the distance between caster and target define if the skill is a ranged skill? (Note 4)
-// 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 (eg: Double Strafe is always long-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 4)
-// NOTE: Skills affected by this option are those whose range in the skill_db are negative.
-skillrange_from_weapon: 14
-
-// Should a check on the caster's status be performed in all skill attacks?
-// When set to yes, meteors, storm gust and any other ground skills will have
-// no effect while the caster is unable to fight (eg: stunned).
-skill_caster_check: yes
-
-// Should ground placed skills be removed as soon as the caster dies? [Note 4]
-clear_skills_on_death: 0
-
-// Should ground placed skills be removed when the caster changes maps? [Note 4]
-clear_skills_on_warp: 15
-
-//Setting this to YES 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 yes, those two skills will not protect everyone, but only allies)
-//See db/skill_unit_db.txt for more info.
-defunit_not_enemy: no
-
-// 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 appropiate): 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 4)
-// 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 4)
-// 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 4)
-// 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 4)
-// Default on official servers: yes for player-traps
-gvg_traps_target_all: 1
-
-// Some traps settings (add as necessary):
-// 1: Traps are invisible to those who come into view of it. When unset, all traps are visible at all times.
-// (Invisible traps can be revealed through Hunter's Detecting skill)
-traps_setting: 0
-
-// 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
-
-// Whether placed down skills will check walls (Note 1)
-// (Makes it so that Storm Gust/Lord of Vermillion/etc when casted next to a wall, won't hit on the other side)
-skill_wall_check: yes
-
-// 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 cancelled when attacking.
-// 4 = Cloaking is not cancelled when using skills
-player_cloak_check_type: 1
-monster_cloak_check_type: 4
-
-// Can't place unlimited land skills at the same time (Note 4)
-land_skill_limit: 1
-
-//Determines which kind of skill-failed messages should be sent:
-// 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: 0
-
-// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
-chat_warpportal: no
-
-// What should the wizard's "Sense" skill display on the defense fields?
-// 0: Do not show defense
-// 1: Base defense
-// 2: Vit/Int defense
-// 3: Both (the addition of both) [default]
-sense_type: 3
-
-// Which finger offensive style can be used?
-// 0 = Aegis style
-// 1 = Athena style
-finger_offensive_type: 0
-
-// Number of hits at a time that undead/fire elemental enemies receive from firewall.
-// NOTE: Officially, it is one hit at a time on a very fast rate, however eA's timer system
-// doesn't triggers enough "hits" to exhaust the firewall before the mob walks through it.
-// A value of 5 would suffice for a vertical firewall to take full effect on undead.
-firewall_hits_on_undead: 5
-
-// Grandcross Settings (Dont mess with these)
-// If set to no, 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: no
-
-// Grandcross display type (Default 1)
-// 0: Yellow character
-// 1: White character
-gx_disptype: 1
-
-// Max Level Difference for Devotion
-devotion_level_difference: 10
-
-// If no than you can use the ensemble skills alone. (Note 1)
-player_skill_partner_check: yes
-
-// Remove trap type
-// 0 - Aegis system : Returns 1 'Trap' item
-// 1 - Athena system : Allows the returned item and amount to be defined
-skill_removetrap_type: 0
-
-// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
-backstab_bow_penalty: yes
-
-// Use kRO new steal formula?
-skill_steal_type: yes
-
-// 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: no
-
-// 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 appropiate).
-// 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: 31
-
-// Guild Aura Skills setting (add as appropiate).
-// (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
-
-// Max Possible Level of Monster skills
-// Note: If your MVPs are too tough, reduce it to 10.
-mob_max_skilllvl: 100
-
-// Allows players to skip menu when casting Teleport level 1
-// Menu contains two options. "Random" and "Cancel"
-skip_teleport_lv1_menu: no
-
-// Allow use of SG skills without proper day (Sun/Moon/Star) ?
-allow_skill_without_day: no
-
-// Allow use of ES-type magic on players?
-allow_es_magic_player: no
-
-//Miracle of the Sun, Moon and Stars skill ratio (100% = 10000)
-sg_miracle_skill_ratio: 1
-
-//Miracle of the Sun, Moon and Stars skill duration in miliseconds
-sg_miracle_skill_min_duration: 3600000
-sg_miracle_skill_max_duration: 9000000
-
-//Angel of the Sun, Moon and Stars skill ratio (100% = 10000)
-sg_angel_skill_ratio: 10
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+//Note 4: Use bitmask values to specify who is affected
+// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// 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
+
+// Is the delay time dependant on the caster's AGI? (Note 1)
+// Note: On Official servers no stat affects delay time
+delay_dependon_agi: no
+
+// Minimum allowed delay for ANY skills after casting (in miliseconds) (Note 1)
+// Note: Setting this to anything above 0 can stop speedhacks.
+min_skill_delay_limit: 100
+
+// Default skill delay for non-weapon based skills which have no delay specified.
+// This delay is also 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_skill_delay: 300
+
+//Completely disable skill delay of the following types (Note 4)
+//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 (instacast)
+// If delay_dependon_agi is enabled, this is also the amount of agi required
+// for zero delay on skills.
+castrate_dex_scale: 150
+
+// Will normal attacks be able to ignore the delay after skills? (Note 1)
+skill_delay_attack_enable: yes
+
+// 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: 15
+
+// 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: no
+
+// Does the distance between caster and target define if the skill is a ranged skill? (Note 4)
+// 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 (eg: Double Strafe is always long-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 4)
+// NOTE: Skills affected by this option are those whose range in the skill_db are negative.
+skillrange_from_weapon: 14
+
+// Should a check on the caster's status be performed in all skill attacks?
+// When set to yes, meteors, storm gust and any other ground skills will have
+// no effect while the caster is unable to fight (eg: stunned).
+skill_caster_check: yes
+
+// Should ground placed skills be removed as soon as the caster dies? [Note 4]
+clear_skills_on_death: 0
+
+// Should ground placed skills be removed when the caster changes maps? [Note 4]
+clear_skills_on_warp: 15
+
+//Setting this to YES 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 yes, those two skills will not protect everyone, but only allies)
+//See db/skill_unit_db.txt for more info.
+defunit_not_enemy: no
+
+// 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 appropiate): 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 4)
+// 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 4)
+// 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 4)
+// 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 4)
+// Default on official servers: yes for player-traps
+gvg_traps_target_all: 1
+
+// Some traps settings (add as necessary):
+// 1: Traps are invisible to those who come into view of it. When unset, all traps are visible at all times.
+// (Invisible traps can be revealed through Hunter's Detecting skill)
+traps_setting: 0
+
+// 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
+
+// Whether placed down skills will check walls (Note 1)
+// (Makes it so that Storm Gust/Lord of Vermillion/etc when casted next to a wall, won't hit on the other side)
+skill_wall_check: yes
+
+// 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 cancelled when attacking.
+// 4 = Cloaking is not cancelled when using skills
+player_cloak_check_type: 1
+monster_cloak_check_type: 4
+
+// Can't place unlimited land skills at the same time (Note 4)
+land_skill_limit: 1
+
+//Determines which kind of skill-failed messages should be sent:
+// 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: 0
+
+// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
+chat_warpportal: no
+
+// What should the wizard's "Sense" skill display on the defense fields?
+// 0: Do not show defense
+// 1: Base defense
+// 2: Vit/Int defense
+// 3: Both (the addition of both) [default]
+sense_type: 3
+
+// Which finger offensive style can be used?
+// 0 = Aegis style
+// 1 = Athena style
+finger_offensive_type: 0
+
+// Number of hits at a time that undead/fire elemental enemies receive from firewall.
+// NOTE: Officially, it is one hit at a time on a very fast rate, however eA's timer system
+// doesn't triggers enough "hits" to exhaust the firewall before the mob walks through it.
+// A value of 5 would suffice for a vertical firewall to take full effect on undead.
+firewall_hits_on_undead: 5
+
+// Grandcross Settings (Dont mess with these)
+// If set to no, 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: no
+
+// Grandcross display type (Default 1)
+// 0: Yellow character
+// 1: White character
+gx_disptype: 1
+
+// Max Level Difference for Devotion
+devotion_level_difference: 10
+
+// If no than you can use the ensemble skills alone. (Note 1)
+player_skill_partner_check: yes
+
+// Remove trap type
+// 0 - Aegis system : Returns 1 'Trap' item
+// 1 - Athena system : Allows the returned item and amount to be defined
+skill_removetrap_type: 0
+
+// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
+backstab_bow_penalty: yes
+
+// Use kRO new steal formula?
+skill_steal_type: yes
+
+// 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: no
+
+// 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 appropiate).
+// 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: 31
+
+// Guild Aura Skills setting (add as appropiate).
+// (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
+
+// Max Possible Level of Monster skills
+// Note: If your MVPs are too tough, reduce it to 10.
+mob_max_skilllvl: 100
+
+// Allows players to skip menu when casting Teleport level 1
+// Menu contains two options. "Random" and "Cancel"
+skip_teleport_lv1_menu: no
+
+// Allow use of SG skills without proper day (Sun/Moon/Star) ?
+allow_skill_without_day: no
+
+// Allow use of ES-type magic on players?
+allow_es_magic_player: no
+
+//Miracle of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_miracle_skill_ratio: 1
+
+//Miracle of the Sun, Moon and Stars skill duration in miliseconds
+sg_miracle_skill_min_duration: 3600000
+sg_miracle_skill_max_duration: 9000000
+
+//Angel of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_angel_skill_ratio: 10
diff --git a/conf-tmpl/battle/status.conf b/conf-tmpl/battle/status.conf
index 4c45e2015..f34ab1a54 100644
--- a/conf-tmpl/battle/status.conf
+++ b/conf-tmpl/battle/status.conf
@@ -1,61 +1,61 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-//Note 3: Value is not limited to 60K (see below)
-//Note 4: Use bitmask values to specify who is affected
-// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
-// Other Information:
-// All options are limited to a max of 60K (aprox) which is 600%
-// or 60secs as appropiate.
-// 1000 miliseconds is 1 second.
-// Unless otherwise specified, the minimum value is 0 for all
-// features.
-//--------------------------------------------------------------
-
-// Should skill casting be cancelled when inflicted by curse/stun/sleep/etc (includes silence) [Note 4]?
-status_cast_cancel: 0
-
-// Will certain skill status-changes be removed on logout?
-// This mimics official servers, where Extremity Fist's no SP regen,
-// Strip Equipment, cooking effects are removed when you logout. Setting is:
-// 0 - remove nothing.
-// 1 - remove negative buffs (stripping, EF)
-// 2 - remove positive buffs (cooking)
-// 3 - remove all buffs that are not saved on official (default)
-debuff_on_logout: 3
-
-// 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: 100
-mob_status_def_rate: 100
-
-// Required luk to gain inmunity to status changes.
-// Luk increases resistance by closing the gap between natural resist and max
-// linearly. This setting indicates required luk to gain complete inmunity.
-// Eg: 40 vit -> 40% resist. 150 luk -> +50% of the missing gap.
-// So 40% + (50% of 60%) = 70%
-pc_luk_status_def: 300
-mob_luk_status_def: 300
-
-// Maximum resistance to status changes. (10000 = 100%)
-// NOTE: Cards and equipment can go over this limit, so it only applies to natural resist.
-pc_max_status_def: 10000
-mob_max_status_def: 10000
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+//Note 1: Directives can be set using on/off, yes/no or 1/0.
+//Note 2: All rates are in percents, 100 would mean 100%, 200
+// would mean 200%, etc
+//Note 3: Value is not limited to 60K (see below)
+//Note 4: Use bitmask values to specify who is affected
+// (1: Pc, 2: Mob, 4: Pet, 8: Homonculus)
+// Other Information:
+// All options are limited to a max of 60K (aprox) which is 600%
+// or 60secs as appropiate.
+// 1000 miliseconds is 1 second.
+// Unless otherwise specified, the minimum value is 0 for all
+// features.
+//--------------------------------------------------------------
+
+// Should skill casting be cancelled when inflicted by curse/stun/sleep/etc (includes silence) [Note 4]?
+status_cast_cancel: 0
+
+// Will certain skill status-changes be removed on logout?
+// This mimics official servers, where Extremity Fist's no SP regen,
+// Strip Equipment, cooking effects are removed when you logout. Setting is:
+// 0 - remove nothing.
+// 1 - remove negative buffs (stripping, EF)
+// 2 - remove positive buffs (cooking)
+// 3 - remove all buffs that are not saved on official (default)
+debuff_on_logout: 3
+
+// 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: 100
+mob_status_def_rate: 100
+
+// Required luk to gain inmunity to status changes.
+// Luk increases resistance by closing the gap between natural resist and max
+// linearly. This setting indicates required luk to gain complete inmunity.
+// Eg: 40 vit -> 40% resist. 150 luk -> +50% of the missing gap.
+// So 40% + (50% of 60%) = 70%
+pc_luk_status_def: 300
+mob_luk_status_def: 300
+
+// Maximum resistance to status changes. (10000 = 100%)
+// NOTE: Cards and equipment can go over this limit, so it only applies to natural resist.
+pc_max_status_def: 10000
+mob_max_status_def: 10000
diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf
index eb192f006..6098b0fa6 100644
--- a/conf-tmpl/battle_athena.conf
+++ b/conf-tmpl/battle_athena.conf
@@ -1,67 +1,67 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-// eAthena Battle Configuration File
-// Originally Translated by Peter Kieser <pfak@telus.net>
-// Made in to plainer English by Ancyker
-// Splitted up into multiple files by Skotlex.
-//--------------------------------------------------------------
-
-//General battle-related settings.
-import: conf/battle/battle.conf
-
-//Settings specific to the client.
-import: conf/battle/client.conf
-
-//General drop-related configs.
-import: conf/battle/drops.conf
-
-//Experience rates, exp penalties, stats and max level settings.
-import: conf/battle/exp.conf
-
-//GM levels, atcommands and hack-related configs.
-import: conf/battle/gm.conf
-
-//Guild and WoE settings
-import: conf/battle/guild.conf
-
-//Item/card-specific and crafting related options.
-import: conf/battle/items.conf
-
-//Mob related configuration
-import: conf/battle/monster.conf
-
-//Party related configuration
-import: conf/battle/party.conf
-
-//Pet related configuration
-import: conf/battle/pet.conf
-
-//Homunc related configuration
-import: conf/battle/homunc.conf
-
-//Player specific settings
-import: conf/battle/player.conf
-
-//Skill related settings
-import: conf/battle/skill.conf
-
-//Status change related settings
-import: conf/battle/status.conf
-
-// Anything else that didn't fit anywhere else.
-// Includes duel, day/night, mute/manner, log settings.
-import: conf/battle/misc.conf
-
-//Your custom config goes here.
-import: conf/import/battle_conf.txt
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+// eAthena Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+// Splitted up into multiple files by Skotlex.
+//--------------------------------------------------------------
+
+//General battle-related settings.
+import: conf/battle/battle.conf
+
+//Settings specific to the client.
+import: conf/battle/client.conf
+
+//General drop-related configs.
+import: conf/battle/drops.conf
+
+//Experience rates, exp penalties, stats and max level settings.
+import: conf/battle/exp.conf
+
+//GM levels, atcommands and hack-related configs.
+import: conf/battle/gm.conf
+
+//Guild and WoE settings
+import: conf/battle/guild.conf
+
+//Item/card-specific and crafting related options.
+import: conf/battle/items.conf
+
+//Mob related configuration
+import: conf/battle/monster.conf
+
+//Party related configuration
+import: conf/battle/party.conf
+
+//Pet related configuration
+import: conf/battle/pet.conf
+
+//Homunc related configuration
+import: conf/battle/homunc.conf
+
+//Player specific settings
+import: conf/battle/player.conf
+
+//Skill related settings
+import: conf/battle/skill.conf
+
+//Status change related settings
+import: conf/battle/status.conf
+
+// Anything else that didn't fit anywhere else.
+// Includes duel, day/night, mute/manner, log settings.
+import: conf/battle/misc.conf
+
+//Your custom config goes here.
+import: conf/import/battle_conf.txt
diff --git a/conf-tmpl/char_athena.conf b/conf-tmpl/char_athena.conf
index 840c40d2e..7e2d261d8 100644
--- a/conf-tmpl/char_athena.conf
+++ b/conf-tmpl/char_athena.conf
@@ -1,230 +1,230 @@
-// Athena Character configuration file.
-
-// Note: "Comments" are all text on the right side of a double slash "//"
-// Whatever text is commented will not be parsed by the servers, and serves
-// only as information/reference.
-
-// Server Communication username and password.
-userid: s1
-passwd: p1
-
-// Server name, use alternative character such as ASCII 160 for spaces.
-// NOTE: You should not use spaces in the server name, or guild emblems won't work client-side!
-server_name: eAthena
-
-// Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
-wisp_server_name: Server
-
-// 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
-
-// Login Server Port
-login_port: 6900
-
-// Character Server IP
-// The character server exports this IP address to the entire world.
-// NOTE: You should only need to set this if you are running behind a
-// firewall or are on a machine with multiple interfaces.
-// char_ip:127.0.0.1
-
-// Character Server Port
-char_port: 6121
-
-//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]
-
-//Defines if the ansi sequences should be parsed or skipped.
-//If set to yes the console output is in color. If the stream is redirected to
-//a file, the ansi sequences are printed out.
-//If set to no the console is colorless and, if redirected, will skip the ansi
-//sequences.
-//NOTE: this setting applyes for both stdout and stderr
-stdout_with_ansisequence: yes
-
-//Makes server output more silent by ommitting 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.
-//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
-console_silent: 0
-
-// Console Commands
-// Allow for console commands to be used on/off
-// This prevents usage of >& log.file
-console: off
-
-// Option to force a player to create an e-mail.
-// If a player have default e-mail, and if you activate this option, the player can only connect in the game (to arrive on a map) like follow:
-// - Create at least 1 character
-// - Select 1 character
-// - Select DEL to enter his/her e-mail. (if OK is choosen, client says to the player: 'invalid e-mail')
-// - If his/her e-mail is correct, the player enter in the game (an e-mail is saved definitively).
-// - If his/her e-mail is incorrect, he/she have 'incorrect e-mail' and must select again DEL.
-// - After entering in the game (when the player arrives on a map), DEL and SEL/OK button work normaly for all next connections.
-// Resume: If a player have "incorrect/invalid e-mail" when he/she click on 'OK' button,
-// the player must click 'DEL' button and register his/her NEW e-mail to enter in the game
-// So, default is 0, because administrator must explain to their players before to activate this option.
-email_creation: 0
-
-// Is Character server in maintainence mode?
-char_maintenance: 0
-
-// Enable or disable creation of new characters.
-// Now it is actually supported [Kevin]
-char_new: 1
-
-// Display (New) in the server list.
-char_new_display: 0
-
-// Maximum users able to connect to the server. Set to 0 for unlimited.
-max_connect_user: 0
-
-// When set to yes, the char server will refuse connections from players already online.
-// When a login attempt is rejected, the account in question will be booted from all the connected map servers.
-// Note that this only works within the char-server and it's connected mapservers,
-// the charserver cannot know if the same account is logged on in other char servers.
-// it's safe to turn off if the char-server only has a single map-server connected to it.
-online_check: yes
-
-// Minimum GM level that is allowed to bypass the server limit of users.
-gm_allow_level: 99
-
-// It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-// If player doesn't have same IP, connection is refused.
-// Set to 0/off/no to not check IP of player.
-// Set to 1/on/yes if you want to check (default)
-// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
-// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
-check_ip_flag: yes
-
-// How often should the server save all files? (In seconds)
-// Note: Applies to all data files on TXT servers.
-// On SQL servers, it applies to guilds (character save interval is defined on the map config)
-autosave_time: 60
-
-// Display information on the console whenever characters/guilds/parties/pets are loaded/saved?
-save_log: yes
-
-// Character server flatfile database
-char_txt: save/athena.txt
-
-// Choose to create or not backup file (yes/no, 0/1, etc...)
-// default is 'no', because backup file take time for nothing. Actually, there is no problem on characters file creation and save.
-backup_txt_flag: no
-
-// Character server flatfile database (backup, TXT only)
-backup_txt: save/athena_backup.txt
-
-// Friends list flatfile database
-friends_txt: save/friends.txt
-
-// Start point, Map name followed by coordinates (x,y)
-start_point: new_zone01.gat,53,111
-
-// Starting weapon for new characters
-start_weapon: 1201
-
-// Starting armor for new characters
-start_armor: 2301
-
-// Starting zeny for new characters
-start_zeny: 0
-
-// Size for the fame-lists
-fame_list_alchemist: 10
-fame_list_blacksmith: 10
-fame_list_taekwon: 10
-
-// 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
-
-// Name used for unknown characters
-unknown_char_name: Unknown
-
-// Log Filename
-char_log_filename: log/char.log
-
-// 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: 0
-
-// 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 'char_name_letters' option.
-// 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
-char_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.
-char_name_letters: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
-
-// Filename of the file which receives the online players list in text
-online_txt_filename: online.txt
-
-// Filename of the file which receives the online players list, but in html version
-online_html_filename: online.html
-
-// Choose how to display online players.
-// (sorting operation with a lot of online players can take time on a slow computer)
-// 0: no sorting (default)
-// 1: by alphabetical order of their name
-// 2: by number of their zenys
-// 3: by their base level
-// 4: by their job (and job level inside the same job)
-// 5: by alphabetical order of their actual map location
-online_sorting_option: 0
-
-// Choose which columns that you want display in the online files. Do the addition of these values:
-// (if value is 0, no file is done)
-// 1: name (just the name, no function like 'GM')
-// 2: job
-// 4: levels
-// 8: map name
-// 16: mapname and coordonates
-// 32: zenys
-// 64: name (with 'GM' if the player is a GM)
-// default value: 1 (only name)
-online_display_option: 1
-
-// minimum GM level to display 'GM' when we want to display it (default: 1)
-online_gm_display_min_level: 20
-
-// refresh time (in sec) of the html file in the explorer (default 20)
-online_refresh_html: 20
-
-// To log the character server?
-log_char: 1
-
-// How many Characters are allowed per Account ? (0 = disabled) [SQL Only!]
-chars_per_account: 0
-
-// Restrict character deletion by BaseLevel
-// 0: no restriction (players can delete characters of may levels)
-// -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)
-char_del_level: 0
-
-// What folder the DB files are in (item_db.txt, etc.)
-db_path: db
-
-import: conf/import/char_conf.txt
+// Athena Character configuration file.
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+// Server Communication username and password.
+userid: s1
+passwd: p1
+
+// Server name, use alternative character such as ASCII 160 for spaces.
+// NOTE: You should not use spaces in the server name, or guild emblems won't work client-side!
+server_name: eAthena
+
+// Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
+wisp_server_name: Server
+
+// 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
+
+// Login Server Port
+login_port: 6900
+
+// Character Server IP
+// The character server exports this IP address to the entire world.
+// NOTE: You should only need to set this if you are running behind a
+// firewall or are on a machine with multiple interfaces.
+// char_ip:127.0.0.1
+
+// Character Server Port
+char_port: 6121
+
+//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]
+
+//Defines if the ansi sequences should be parsed or skipped.
+//If set to yes the console output is in color. If the stream is redirected to
+//a file, the ansi sequences are printed out.
+//If set to no the console is colorless and, if redirected, will skip the ansi
+//sequences.
+//NOTE: this setting applyes for both stdout and stderr
+stdout_with_ansisequence: yes
+
+//Makes server output more silent by ommitting 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.
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+// Console Commands
+// Allow for console commands to be used on/off
+// This prevents usage of >& log.file
+console: off
+
+// Option to force a player to create an e-mail.
+// If a player have default e-mail, and if you activate this option, the player can only connect in the game (to arrive on a map) like follow:
+// - Create at least 1 character
+// - Select 1 character
+// - Select DEL to enter his/her e-mail. (if OK is choosen, client says to the player: 'invalid e-mail')
+// - If his/her e-mail is correct, the player enter in the game (an e-mail is saved definitively).
+// - If his/her e-mail is incorrect, he/she have 'incorrect e-mail' and must select again DEL.
+// - After entering in the game (when the player arrives on a map), DEL and SEL/OK button work normaly for all next connections.
+// Resume: If a player have "incorrect/invalid e-mail" when he/she click on 'OK' button,
+// the player must click 'DEL' button and register his/her NEW e-mail to enter in the game
+// So, default is 0, because administrator must explain to their players before to activate this option.
+email_creation: 0
+
+// Is Character server in maintainence mode?
+char_maintenance: 0
+
+// Enable or disable creation of new characters.
+// Now it is actually supported [Kevin]
+char_new: 1
+
+// Display (New) in the server list.
+char_new_display: 0
+
+// Maximum users able to connect to the server. Set to 0 for unlimited.
+max_connect_user: 0
+
+// When set to yes, the char server will refuse connections from players already online.
+// When a login attempt is rejected, the account in question will be booted from all the connected map servers.
+// Note that this only works within the char-server and it's connected mapservers,
+// the charserver cannot know if the same account is logged on in other char servers.
+// it's safe to turn off if the char-server only has a single map-server connected to it.
+online_check: yes
+
+// Minimum GM level that is allowed to bypass the server limit of users.
+gm_allow_level: 99
+
+// It's to check IP of a player between char-server and other servers (part of anti-hacking system)
+// If player doesn't have same IP, connection is refused.
+// Set to 0/off/no to not check IP of player.
+// Set to 1/on/yes if you want to check (default)
+// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
+// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
+check_ip_flag: yes
+
+// How often should the server save all files? (In seconds)
+// Note: Applies to all data files on TXT servers.
+// On SQL servers, it applies to guilds (character save interval is defined on the map config)
+autosave_time: 60
+
+// Display information on the console whenever characters/guilds/parties/pets are loaded/saved?
+save_log: yes
+
+// Character server flatfile database
+char_txt: save/athena.txt
+
+// Choose to create or not backup file (yes/no, 0/1, etc...)
+// default is 'no', because backup file take time for nothing. Actually, there is no problem on characters file creation and save.
+backup_txt_flag: no
+
+// Character server flatfile database (backup, TXT only)
+backup_txt: save/athena_backup.txt
+
+// Friends list flatfile database
+friends_txt: save/friends.txt
+
+// Start point, Map name followed by coordinates (x,y)
+start_point: new_zone01.gat,53,111
+
+// Starting weapon for new characters
+start_weapon: 1201
+
+// Starting armor for new characters
+start_armor: 2301
+
+// Starting zeny for new characters
+start_zeny: 0
+
+// Size for the fame-lists
+fame_list_alchemist: 10
+fame_list_blacksmith: 10
+fame_list_taekwon: 10
+
+// 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
+
+// Name used for unknown characters
+unknown_char_name: Unknown
+
+// Log Filename
+char_log_filename: log/char.log
+
+// 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: 0
+
+// 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 'char_name_letters' option.
+// 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
+char_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.
+char_name_letters: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
+
+// Filename of the file which receives the online players list in text
+online_txt_filename: online.txt
+
+// Filename of the file which receives the online players list, but in html version
+online_html_filename: online.html
+
+// Choose how to display online players.
+// (sorting operation with a lot of online players can take time on a slow computer)
+// 0: no sorting (default)
+// 1: by alphabetical order of their name
+// 2: by number of their zenys
+// 3: by their base level
+// 4: by their job (and job level inside the same job)
+// 5: by alphabetical order of their actual map location
+online_sorting_option: 0
+
+// Choose which columns that you want display in the online files. Do the addition of these values:
+// (if value is 0, no file is done)
+// 1: name (just the name, no function like 'GM')
+// 2: job
+// 4: levels
+// 8: map name
+// 16: mapname and coordonates
+// 32: zenys
+// 64: name (with 'GM' if the player is a GM)
+// default value: 1 (only name)
+online_display_option: 1
+
+// minimum GM level to display 'GM' when we want to display it (default: 1)
+online_gm_display_min_level: 20
+
+// refresh time (in sec) of the html file in the explorer (default 20)
+online_refresh_html: 20
+
+// To log the character server?
+log_char: 1
+
+// How many Characters are allowed per Account ? (0 = disabled) [SQL Only!]
+chars_per_account: 0
+
+// Restrict character deletion by BaseLevel
+// 0: no restriction (players can delete characters of may levels)
+// -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)
+char_del_level: 0
+
+// What folder the DB files are in (item_db.txt, etc.)
+db_path: db
+
+import: conf/import/char_conf.txt
diff --git a/conf-tmpl/charcommand_athena.conf b/conf-tmpl/charcommand_athena.conf
index 40c4b5883..063cd3f30 100644
--- a/conf-tmpl/charcommand_athena.conf
+++ b/conf-tmpl/charcommand_athena.conf
@@ -1,98 +1,98 @@
-// Athena charcommand Configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-// Set here the symbol that you want to use for your commands
-// Only 1 character is get (default is '#'). You can set any character,
-// except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
-// and '@' (Standard GM Commands)
-// With default character, all commands begin by a '#', example: #save SomePlayer
-command_symbol: #
-
-//Give another character a fake name
-fakename: 20
-
-//List a chacter's stats
-stats: 40
-
-//Give another character all stats
-statsall: 40
-
-//List a chacter's items
-itemlist: 40
-
-//Apply an effect onto another character
-effect: 40
-
-//List a chacter's storage items
-storagelist: 40
-
-//Rename another character's pet
-petrename: 50
-
-//Make another character's pet friendly/not
-petfriendly: 50
-
-// Changes character's model
-model: 50
-
-//Apply a certain option to another character
-option: 60
-
-//Save another character
-save: 60
-
-//?
-reset: 60
-
-//Give another character spiritball effect
-spiritball: 60
-
-//Give another character an item
-item: 60
-
-//Change another character's job (2 same commands)
-job: 60
-jobchange: 60
-
-//Give another character zeny
-zeny: 60
-
-//Change another character's base level (3 same commands)
-baselvl: 60
-blvl: 60
-baselvlup: 60
-
-//Change another character's job level (3 same commands)
-joblvl: 60
-jlvl: 60
-joblvlup: 60
-
-//Give another character a platinum skill
-questskill: 60
-
-//Take away a character's platinum skill
-lostskill: 60
-
-// Resets another character's status, skills
-streset: 60
-skreset: 60
-
-
-// Gives another character status points
-stpoint: 60
-
-// Gives another character skill points
-skpoint: 60
-
-// Changes the sex of an online player (all characters on the account)
-changesex: 60
-
-// Warp a player somewhere else (3 same commands)
-warp: 60
-rura: 60
-rura+: 60
-
-//Resets another character's designated maps
-feelreset: 60
-
-import: conf/import/charcommand_conf.txt
+// Athena charcommand Configuration file.
+// Translated by Peter Kieser <pfak@telus.net>
+
+// Set here the symbol that you want to use for your commands
+// Only 1 character is get (default is '#'). You can set any character,
+// except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
+// and '@' (Standard GM Commands)
+// With default character, all commands begin by a '#', example: #save SomePlayer
+command_symbol: #
+
+//Give another character a fake name
+fakename: 20
+
+//List a chacter's stats
+stats: 40
+
+//Give another character all stats
+statsall: 40
+
+//List a chacter's items
+itemlist: 40
+
+//Apply an effect onto another character
+effect: 40
+
+//List a chacter's storage items
+storagelist: 40
+
+//Rename another character's pet
+petrename: 50
+
+//Make another character's pet friendly/not
+petfriendly: 50
+
+// Changes character's model
+model: 50
+
+//Apply a certain option to another character
+option: 60
+
+//Save another character
+save: 60
+
+//?
+reset: 60
+
+//Give another character spiritball effect
+spiritball: 60
+
+//Give another character an item
+item: 60
+
+//Change another character's job (2 same commands)
+job: 60
+jobchange: 60
+
+//Give another character zeny
+zeny: 60
+
+//Change another character's base level (3 same commands)
+baselvl: 60
+blvl: 60
+baselvlup: 60
+
+//Change another character's job level (3 same commands)
+joblvl: 60
+jlvl: 60
+joblvlup: 60
+
+//Give another character a platinum skill
+questskill: 60
+
+//Take away a character's platinum skill
+lostskill: 60
+
+// Resets another character's status, skills
+streset: 60
+skreset: 60
+
+
+// Gives another character status points
+stpoint: 60
+
+// Gives another character skill points
+skpoint: 60
+
+// Changes the sex of an online player (all characters on the account)
+changesex: 60
+
+// Warp a player somewhere else (3 same commands)
+warp: 60
+rura: 60
+rura+: 60
+
+//Resets another character's designated maps
+feelreset: 60
+
+import: conf/import/charcommand_conf.txt
diff --git a/conf-tmpl/charhelp.txt b/conf-tmpl/charhelp.txt
index 194815ced..92d6c5910 100644
--- a/conf-tmpl/charhelp.txt
+++ b/conf-tmpl/charhelp.txt
@@ -1,27 +1,27 @@
- 40:--- CHARACTER CMD ---
- 40:#statsall - Displays stats of all characters.
- 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 <param1> <param2> <param3> <charname> - Like @option command but only to target character.
- 50:#mountpeco <charname> - Give/remove to a player a peco (Class is required, but not skill).
- 50:#petrename <charname> - Re-enable pet rename to a player.
- 60:#save <map> <x> <y> <charname> - Changes the target players respawn point.
- 60:#baselvl <#> <nickname> - Change a characters base level.
- 60:#jlvl <#> <nickname> - Change a characters job level.
- 60:#job/#jobchange <job ID> <char name> - Changes target characters job.
- 60:#zeny <amount> <name> - Give/take a players Zeny
- 60:#stpoint <amount> <name> - Give/take a players stat points
- 60:#skpoint <amount> <name> - give/take a players skill points
- 60:#skreset <charname> - Reset skills of a character.
- 60:#streset <charname> - Reset stats of a character.
- 60:#reset <charname> - Reset stats AND skills of a character.
- 60:#questskill <#> <charname> - Gives to a player the specified quest skill.
- 60:#lostskill <#> <charname> - Takes away the specified quest skill from the player.
- 60:#delitem <item_name_or_ID> <quantity> <player> - Remove items from a character
- 50:#model <hair type> <hair color> <clothes color> <name> - Changes a player's model
- 60:#disguise <monster_name_or_monster_ID> <char name> - Changes disguise of a player
- 60:#undisguise <char name> - Cancels disguise of a player
- 60:#changesex <name> - Changes sex of a player (all characters of the account)
- 60:#warp/#rura+ <mapname> <x> <y> <char name> - Warps character to location of choice
+ 40:--- CHARACTER CMD ---
+ 40:#statsall - Displays stats of all characters.
+ 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 <param1> <param2> <param3> <charname> - Like @option command but only to target character.
+ 50:#mountpeco <charname> - Give/remove to a player a peco (Class is required, but not skill).
+ 50:#petrename <charname> - Re-enable pet rename to a player.
+ 60:#save <map> <x> <y> <charname> - Changes the target players respawn point.
+ 60:#baselvl <#> <nickname> - Change a characters base level.
+ 60:#jlvl <#> <nickname> - Change a characters job level.
+ 60:#job/#jobchange <job ID> <char name> - Changes target characters job.
+ 60:#zeny <amount> <name> - Give/take a players Zeny
+ 60:#stpoint <amount> <name> - Give/take a players stat points
+ 60:#skpoint <amount> <name> - give/take a players skill points
+ 60:#skreset <charname> - Reset skills of a character.
+ 60:#streset <charname> - Reset stats of a character.
+ 60:#reset <charname> - Reset stats AND skills of a character.
+ 60:#questskill <#> <charname> - Gives to a player the specified quest skill.
+ 60:#lostskill <#> <charname> - Takes away the specified quest skill from the player.
+ 60:#delitem <item_name_or_ID> <quantity> <player> - Remove items from a character
+ 50:#model <hair type> <hair color> <clothes color> <name> - Changes a player's model
+ 60:#disguise <monster_name_or_monster_ID> <char name> - Changes disguise of a player
+ 60:#undisguise <char name> - Cancels disguise of a player
+ 60:#changesex <name> - Changes sex of a player (all characters of the account)
+ 60:#warp/#rura+ <mapname> <x> <y> <char name> - Warps character to location of choice
1 \ No newline at end of file
diff --git a/conf-tmpl/grf-files.txt b/conf-tmpl/grf-files.txt
index eaf89d41b..ef2421925 100644
--- a/conf-tmpl/grf-files.txt
+++ b/conf-tmpl/grf-files.txt
@@ -1,15 +1,15 @@
-//-----------------------------------------
-// GRF List
-//-----------------------------------------
-
-grf: C:\Program Files\Gravity\RO\data.grf
-grf: C:\Program Files\Gravity\RO\sdata.grf
-
-// You may add more in this format
-// grf: <data file path>
-
-//------ Others ---------------------------
-
-//Path to directory that contains the data dir
-//NOTE: Path must include trailing backslash, only one data_dir entry is supported.
-//data_dir: C:\Program Files\Gravity\RO\
+//-----------------------------------------
+// GRF List
+//-----------------------------------------
+
+grf: C:\Program Files\Gravity\RO\data.grf
+grf: C:\Program Files\Gravity\RO\sdata.grf
+
+// You may add more in this format
+// grf: <data file path>
+
+//------ Others ---------------------------
+
+//Path to directory that contains the data dir
+//NOTE: Path must include trailing backslash, only one data_dir entry is supported.
+//data_dir: C:\Program Files\Gravity\RO\
diff --git a/conf-tmpl/help.txt b/conf-tmpl/help.txt
index 9bff3be74..a013e8d9d 100644
--- a/conf-tmpl/help.txt
+++ b/conf-tmpl/help.txt
@@ -1,176 +1,176 @@
-// put at first, the minimum level to display the line
- 1:To use one command, type it inside the message window where you usually type to chat.
- 20:@h/@help - display this help guide.
- 20:@h2/@help2 - displays the second help guide.
- 1:
- 1:--- MESSAGE CMD ---
- 1:@main [on|off|message] - Turns on or off global chat (@main must be on to see global chat messages)
- 1:@noask - Auto rejects Deals/Invites
- 20:@gmotd - Broadcasts the Message of The Day file to all players.
- 20:@me <message> - Displays normal text as a message in this format: *name message* (like /me in mIRC)
- 20:@fakename [Name] - Changes your name to your choice temporarly.
- 20:@npctalk [NPC Name],[Message] - Forces a NPC to display a message in normal chat.
- 40:/b/@broadcast <message> - Broadcasts a GM message with name of the GM (in yellow)
- 40:/nb <message>/@kami <message> - Broadcasts a GM message without name of the GM (in yellow)
- 40:@kamib <message> - Broadcasts a GM message without name of the GM (in blue)
- 40:/lb/@localbroadcast <message> - Broadcasts a GM message with name of the GM (in yellow) ONLY on your map
- 40:/nlb <message> - Broadcasts a GM message without name of the GM (in yellow) ONLY on your map
- 1:
- 1:--- INFORMATION CMD ---
- 1:@commands - Displays a list of commands that you can use.
- 1:@rates - Displays the server's current rates.
- 1:@uptime - Displays how long the server has been online.
- 1:@showdelay - Shows/Hides the "there is a delay after this skill" message.
- 1:@exp - Displays current levels and % progress
- 1:@mobinfo/@monsterinfo/@mi [Mob ID|Part of monster name] - Shows Monster Info (rates, stats, drops, MVP stuff)
- 1:@iteminfo/@ii [Item ID|Part of item name] - Shows Item info (type, price, etc)
- 1:@whodrops [Item ID|Part of item name] - Shows who drops an item (mobs with highest drop rates)
- 1:@version - Displays SVN version of the server
- 1:@email <actual@email> <new@email> - to change your e-mail (characters protection)
- 1:@where [char name] - Tells you the location of a character
- 1:@time/@date/@server_date/@serverdate/@server_time/@servertime - Display the date/time of the server
- 10:@showexp - Displays/Hides Experience gained.
- 10:@showzeny - Displays/Hides Zeny gained.
- 10:@mobsearch [Mob ID|Monster Name] - Shows the location of a certain mob on the current map.
- 20:@who/@whois/@w [match_text] - Display a listing of who is online and their party/guild.
- 20:@who2 [match_text] - Display a listing of who is online and their job.
- 20:@who3 [match_text] - Display a listing of who is online and where.
- 20:@whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specifical map.
- 20:@whogm [match_text] - Like @who+@who2+who3, but only for GM.
- 40:@charcartlist <char name> - Displays all items of a player's cart.
- 60:
- 60:@guildspy <guild_name/id> - You will receive all messages of the guild channel (Chat logging must be enabled)
- 60:@partyspy <party_name/id> - You will receive all messages of the party channel (Chat logging must be enabled)
- 99:@mapinfo [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
- 1:
- 1:--- CHANGE GM STATE CMD ---
- 1:@die - Kills yourself
- 10:@go <number/city_name> - Warps you to a city.
- 10: -3: (Memo point 2) 1: morocc 5: izlude 9: yuno 13: niflheim
- 10: -2: (Memo point 1) 2: geffen 6: aldebaran 10: amatsu 14: louyang
- 10: -1: (Memo point 0) 3: payon 7: xmas (lutie) 11: gonryun 15: start point
- 10: 0: prontera 4: alberta 8: comodo 12: umbala 16: prison/jail
- 10:
- 20:/shift/@jumpto/@warpto/@goto <char name> - Warps you to selected character
- 20:@follow <char_name> - follow a player
- 20:@mountpeco - Give/remove you a peco (Class is required, but not skill)
- 20:@disguise <monster_name_or_monster_ID> - Change your appearence to other players to a mob.
- 20:@undisguise - Restore your normal appearance.
- 20:@model <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence.
- 20:@size <1-3> Changes your size (1-Smallest 2-Biggest 3-Normal)
- 40:/hide/@hide - Makes you character invisible (GM invisibility). Type /hide or@hide again become visible.
- 40:@save - Sets respawn point to current spot
- 40:@load/@return - Warps you to your save point
- 40:/mm//mapmove/@warp/@rura/@mapmove <mapname> <x> <y> - Warps you to the selected position
- 40:@jump [x [y]]- Randomly warps you like a flywing.
- 40:@job/@jobchange <job ID> - Changes your job
- 40: 0: Novice 18: Alchemist 4015: Paladin
- 40: 1: Swordman 19: Bard 4016: Champion
- 40: 2: Mage 20: Dancer 4017: Professor
- 40: 3: Archer 23: Super Novice 4018: Stalker
- 40: 4: Acolyte 4001: High Novice 4019: Creator
- 40: 5: Merchant 4002: High Swordman 4020: Clown
- 40: 6: Thief 4003: High Mage 4021: Gypsy
- 40: 7: Knight 4004: High Archer 4046: Taekwon
- 40: 8: Priest 4005: High Acolyte 4047: Star Gladiator
- 40: 9: Wizard 4006: High Merchant 4049: Soul Linker
- 40: 10: Blacksmith 4007: High Thief 24: Gunslinger
- 40: 11: Hunter 4008: Lord Knight 25: Ninja
- 40: 12: Assassin 4009: High Priest
- 40: 14: Crusader 4010: High Wizard
- 40: 15: Monk 4011: Whitesmith
- 40: 16: Sage 4012: Sniper
- 40: 17: Rogue 4013: Assassin Cross
- 40: ---- Baby Classes ----
- 40: 4023: Baby 4024: Baby Swordman 4025: Baby Mage
- 40: 4026: Baby Archer 4027: Baby Acolyte 4028: Baby Merchant
- 40: 4029: Baby Thief 4030: Baby Knight 4031: Baby Priest
- 40: 4032: Baby Wizard 4033: Baby Blacksmith 4034: Baby Hunter
- 40: 4035: Baby Assassin 4037: Baby Crusader 4038: Baby Monk
- 40: 4039: Baby Sage 4040: Baby Rogue 4041: Baby Alchemist
- 40: 4042: Baby Bard 4043: Baby Dancer 4045: Super Baby
- 40:
- 40: <param1> <param2> <p3>(stackable) <param3> <param3>
- 40: 1 Petrified (stackable) 01 Sight 32 Peco Peco riding 2048 Orc Head
- 40: 2 Frozen 01 Poison 02 Hide 64 GM Perfect Hide 4096 Wedding Sprites
- 40: 3 Stunned 02 Cursed 04 Cloak 128 Level 2 Cart 8192 Ruwach
- 40: 4 Sleeping 04 Silenced 08 Level 1 Cart 256 Level 3 Cart
- 40: 6 darkness 08 ??? 16 Falcon 512 Level 4 Cart
- 40: 16 darkness 1024 Level 5 Cart
- 40:
- 40:@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
- 40:@option <param1> <param2> <param3> - Adds different visual effects on or around your character
- 40:@dye/@ccolor <clothes color: 0-4> - Changes your characters appearence (only clothes color).
- 40:@hairstyle/@hstyle <hair ID: 0-17> - Changes your characters appearence (only hair style).
- 40:@haircolor/@hcolor <hair color: 0-8> - Changes your characters appearence (only hair color).
- 40:@speed <1-1000> - Changes you walking speed. 1 being the fastest and 1000 the slowest. Default 150.
- 40:@effect <effect_id> [flag] - Give an efect to your character.
- 40:@dropall - throws all your possession on the ground
- 40:@storeall - puts all your possessions in storage
- 40:@killable - make your character killable
- 40:@memo [memo_position] - set/change a memo location (no position: display memo points).
- 40:@spiritball <number: 1-1000> - Gives you "spirit spheres" like from the skill "Call Spirits"
- 40: (If the number you use is > 1000, your server may become instable or crash)
- 40:@questskill <#> - Gives you the specified quest skill
- 40:@lostskill <#> - Takes away the specified quest skill from you
- 40:@skillid <name> - look up a skill by name
- 40:@useskill <skillid> <skillv> <target> - use a skill on target
- 40: Novice Swordsman Thief Merchant
- 40: 142 = Emergency Care 144 = Moving HP Recovery 149 = Throw Sand 153 = Cart Revolution
- 40: 143 = Act dead 145 = Attack Weak Point 150 = Back Sliding 154 = Change Cart
- 40: Archer 146 = Auto Berserk 151 = Take Stone 155 = Crazy Uproar/Loud Voice
- 40: 147 = Arrow Creation Acolyte 152 = Stone Throw Magician
- 40: 148 = Charge Arrows 156 = Holy Light 157 = Energy Coat
- 40: @skilltree <
- 40: @marry <player1>,<player2> - marry two players
- 40: @divorce <player> - divorces the two players (you need just one name of them)
- 60:@alive - Revives yourself from death
- 60:@lvup/@blevel/@baselvlup <number of levels> - Raises your base level the desired number of levels. The max is 255 (User Defined).
- 60:@joblvup/@jlevel/@joblvlup <number of levels> -Raises your job level the desired number of levels. The max is 50 For Basic Classes. For Super Novice and Advanced Classes it is 70.
- 60:@allskill/@allskills/@skillall/@skillsall - Give you all skills.
- 60:@stpoint <number of points> - Gives you the desired number of stat points.
- 60:@skpoint <number of points> - Gives you the desired number of skill points.
- 60:@zeny <amount> - Gives you desired amount of Zeny.
- 60:@str,@agi,@vit,@int,@dex,@luk <amount> - Adds desired amount to any stat. For example "@str 10" raises your str by 10
- 60:@statall/@statsall/@allstats/@allstat [value] - Adds value in all stats (maximum if no value).
- 60: @addwarp <map name> <x coord> <y coord>
- 40:
- 40:--- MONSTERS CMD ---
- 40:@killmonster2 - kill all monsters of your map (without drops)
- 50:/monster <monster_name> - Spawns 1 of the desired monster.
- 50:@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
- 50:@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
- 50:@spawn/@monster/@summon/@monster2 "desired monster name" <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
- 50:@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
- 50: Spawns the desired monster with any desired name.
- 50:@monstersmall [Mob ID|Mob Name] - Spawns a smaller version of a monster.
- 50:@monsterbig [Mob ID|Mob Name] - Spawns a larger version of a monster.
- 60:@killmonster [map] - kill all monsters of the map (they drop)
- 40:
- 10:--- MISC CMD ---
- 10:@autoloot [on|off|#] - Makes items go straight into your inventory.
- 10:@autotrade/@at - Allows you to vend while you are offline.
- 10:@changegm [Player Name] - Changes the leader of your guild (You must be guild leader)
- 10:@changeleader [Player Name] - Changes the leader of your party (You must be party leader)
- 20:@request [Message] - Sends a message to all connected GMs (via the gm whisper system)
- 40:@sound [Path way to file in Data or GRF file] - Plays a sound from the data or grf file located on the client.
- 50:@clone [Player Name] - Spawns a supportive clone of the given player.
- 50:@slaveclone [Player Name] - Spawns a supportive clone of the given player that follows the creator around.
- 50:@evilclone [Player Name] - Spawns an agressive clone of the given player.
- 60:@changesex - Changes your gender.
- 10:
- 1:--- DUEL CMD ---
- 1:@duel - Starts a duel.
- 1:@invite - Invites a player to a duel.
- 1:@accept - Accepts an invitation to a duel.
- 1:@reject - Rejects an invitation to a duel.
- 1:@leave - Leaves a duel.
- 1:
- 1:--- MAIL SYSTEM --- (SQL Only) (Must be enabled)
- 1:@checkmail - Check # of messages.
- 1:@listmail - List all messages.
- 1:@listnewmail - List only new mail.
- 1:@readmail - Read a message.
- 1:@sendmail - Send mail.
- 1:deletemail - Deletes a message.
+// put at first, the minimum level to display the line
+ 1:To use one command, type it inside the message window where you usually type to chat.
+ 20:@h/@help - display this help guide.
+ 20:@h2/@help2 - displays the second help guide.
+ 1:
+ 1:--- MESSAGE CMD ---
+ 1:@main [on|off|message] - Turns on or off global chat (@main must be on to see global chat messages)
+ 1:@noask - Auto rejects Deals/Invites
+ 20:@gmotd - Broadcasts the Message of The Day file to all players.
+ 20:@me <message> - Displays normal text as a message in this format: *name message* (like /me in mIRC)
+ 20:@fakename [Name] - Changes your name to your choice temporarly.
+ 20:@npctalk [NPC Name],[Message] - Forces a NPC to display a message in normal chat.
+ 40:/b/@broadcast <message> - Broadcasts a GM message with name of the GM (in yellow)
+ 40:/nb <message>/@kami <message> - Broadcasts a GM message without name of the GM (in yellow)
+ 40:@kamib <message> - Broadcasts a GM message without name of the GM (in blue)
+ 40:/lb/@localbroadcast <message> - Broadcasts a GM message with name of the GM (in yellow) ONLY on your map
+ 40:/nlb <message> - Broadcasts a GM message without name of the GM (in yellow) ONLY on your map
+ 1:
+ 1:--- INFORMATION CMD ---
+ 1:@commands - Displays a list of commands that you can use.
+ 1:@rates - Displays the server's current rates.
+ 1:@uptime - Displays how long the server has been online.
+ 1:@showdelay - Shows/Hides the "there is a delay after this skill" message.
+ 1:@exp - Displays current levels and % progress
+ 1:@mobinfo/@monsterinfo/@mi [Mob ID|Part of monster name] - Shows Monster Info (rates, stats, drops, MVP stuff)
+ 1:@iteminfo/@ii [Item ID|Part of item name] - Shows Item info (type, price, etc)
+ 1:@whodrops [Item ID|Part of item name] - Shows who drops an item (mobs with highest drop rates)
+ 1:@version - Displays SVN version of the server
+ 1:@email <actual@email> <new@email> - to change your e-mail (characters protection)
+ 1:@where [char name] - Tells you the location of a character
+ 1:@time/@date/@server_date/@serverdate/@server_time/@servertime - Display the date/time of the server
+ 10:@showexp - Displays/Hides Experience gained.
+ 10:@showzeny - Displays/Hides Zeny gained.
+ 10:@mobsearch [Mob ID|Monster Name] - Shows the location of a certain mob on the current map.
+ 20:@who/@whois/@w [match_text] - Display a listing of who is online and their party/guild.
+ 20:@who2 [match_text] - Display a listing of who is online and their job.
+ 20:@who3 [match_text] - Display a listing of who is online and where.
+ 20:@whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specifical map.
+ 20:@whogm [match_text] - Like @who+@who2+who3, but only for GM.
+ 40:@charcartlist <char name> - Displays all items of a player's cart.
+ 60:
+ 60:@guildspy <guild_name/id> - You will receive all messages of the guild channel (Chat logging must be enabled)
+ 60:@partyspy <party_name/id> - You will receive all messages of the party channel (Chat logging must be enabled)
+ 99:@mapinfo [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
+ 1:
+ 1:--- CHANGE GM STATE CMD ---
+ 1:@die - Kills yourself
+ 10:@go <number/city_name> - Warps you to a city.
+ 10: -3: (Memo point 2) 1: morocc 5: izlude 9: yuno 13: niflheim
+ 10: -2: (Memo point 1) 2: geffen 6: aldebaran 10: amatsu 14: louyang
+ 10: -1: (Memo point 0) 3: payon 7: xmas (lutie) 11: gonryun 15: start point
+ 10: 0: prontera 4: alberta 8: comodo 12: umbala 16: prison/jail
+ 10:
+ 20:/shift/@jumpto/@warpto/@goto <char name> - Warps you to selected character
+ 20:@follow <char_name> - follow a player
+ 20:@mountpeco - Give/remove you a peco (Class is required, but not skill)
+ 20:@disguise <monster_name_or_monster_ID> - Change your appearence to other players to a mob.
+ 20:@undisguise - Restore your normal appearance.
+ 20:@model <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence.
+ 20:@size <1-3> Changes your size (1-Smallest 2-Biggest 3-Normal)
+ 40:/hide/@hide - Makes you character invisible (GM invisibility). Type /hide or@hide again become visible.
+ 40:@save - Sets respawn point to current spot
+ 40:@load/@return - Warps you to your save point
+ 40:/mm//mapmove/@warp/@rura/@mapmove <mapname> <x> <y> - Warps you to the selected position
+ 40:@jump [x [y]]- Randomly warps you like a flywing.
+ 40:@job/@jobchange <job ID> - Changes your job
+ 40: 0: Novice 18: Alchemist 4015: Paladin
+ 40: 1: Swordman 19: Bard 4016: Champion
+ 40: 2: Mage 20: Dancer 4017: Professor
+ 40: 3: Archer 23: Super Novice 4018: Stalker
+ 40: 4: Acolyte 4001: High Novice 4019: Creator
+ 40: 5: Merchant 4002: High Swordman 4020: Clown
+ 40: 6: Thief 4003: High Mage 4021: Gypsy
+ 40: 7: Knight 4004: High Archer 4046: Taekwon
+ 40: 8: Priest 4005: High Acolyte 4047: Star Gladiator
+ 40: 9: Wizard 4006: High Merchant 4049: Soul Linker
+ 40: 10: Blacksmith 4007: High Thief 24: Gunslinger
+ 40: 11: Hunter 4008: Lord Knight 25: Ninja
+ 40: 12: Assassin 4009: High Priest
+ 40: 14: Crusader 4010: High Wizard
+ 40: 15: Monk 4011: Whitesmith
+ 40: 16: Sage 4012: Sniper
+ 40: 17: Rogue 4013: Assassin Cross
+ 40: ---- Baby Classes ----
+ 40: 4023: Baby 4024: Baby Swordman 4025: Baby Mage
+ 40: 4026: Baby Archer 4027: Baby Acolyte 4028: Baby Merchant
+ 40: 4029: Baby Thief 4030: Baby Knight 4031: Baby Priest
+ 40: 4032: Baby Wizard 4033: Baby Blacksmith 4034: Baby Hunter
+ 40: 4035: Baby Assassin 4037: Baby Crusader 4038: Baby Monk
+ 40: 4039: Baby Sage 4040: Baby Rogue 4041: Baby Alchemist
+ 40: 4042: Baby Bard 4043: Baby Dancer 4045: Super Baby
+ 40:
+ 40: <param1> <param2> <p3>(stackable) <param3> <param3>
+ 40: 1 Petrified (stackable) 01 Sight 32 Peco Peco riding 2048 Orc Head
+ 40: 2 Frozen 01 Poison 02 Hide 64 GM Perfect Hide 4096 Wedding Sprites
+ 40: 3 Stunned 02 Cursed 04 Cloak 128 Level 2 Cart 8192 Ruwach
+ 40: 4 Sleeping 04 Silenced 08 Level 1 Cart 256 Level 3 Cart
+ 40: 6 darkness 08 ??? 16 Falcon 512 Level 4 Cart
+ 40: 16 darkness 1024 Level 5 Cart
+ 40:
+ 40:@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
+ 40:@option <param1> <param2> <param3> - Adds different visual effects on or around your character
+ 40:@dye/@ccolor <clothes color: 0-4> - Changes your characters appearence (only clothes color).
+ 40:@hairstyle/@hstyle <hair ID: 0-17> - Changes your characters appearence (only hair style).
+ 40:@haircolor/@hcolor <hair color: 0-8> - Changes your characters appearence (only hair color).
+ 40:@speed <1-1000> - Changes you walking speed. 1 being the fastest and 1000 the slowest. Default 150.
+ 40:@effect <effect_id> [flag] - Give an efect to your character.
+ 40:@dropall - throws all your possession on the ground
+ 40:@storeall - puts all your possessions in storage
+ 40:@killable - make your character killable
+ 40:@memo [memo_position] - set/change a memo location (no position: display memo points).
+ 40:@spiritball <number: 1-1000> - Gives you "spirit spheres" like from the skill "Call Spirits"
+ 40: (If the number you use is > 1000, your server may become instable or crash)
+ 40:@questskill <#> - Gives you the specified quest skill
+ 40:@lostskill <#> - Takes away the specified quest skill from you
+ 40:@skillid <name> - look up a skill by name
+ 40:@useskill <skillid> <skillv> <target> - use a skill on target
+ 40: Novice Swordsman Thief Merchant
+ 40: 142 = Emergency Care 144 = Moving HP Recovery 149 = Throw Sand 153 = Cart Revolution
+ 40: 143 = Act dead 145 = Attack Weak Point 150 = Back Sliding 154 = Change Cart
+ 40: Archer 146 = Auto Berserk 151 = Take Stone 155 = Crazy Uproar/Loud Voice
+ 40: 147 = Arrow Creation Acolyte 152 = Stone Throw Magician
+ 40: 148 = Charge Arrows 156 = Holy Light 157 = Energy Coat
+ 40: @skilltree <
+ 40: @marry <player1>,<player2> - marry two players
+ 40: @divorce <player> - divorces the two players (you need just one name of them)
+ 60:@alive - Revives yourself from death
+ 60:@lvup/@blevel/@baselvlup <number of levels> - Raises your base level the desired number of levels. The max is 255 (User Defined).
+ 60:@joblvup/@jlevel/@joblvlup <number of levels> -Raises your job level the desired number of levels. The max is 50 For Basic Classes. For Super Novice and Advanced Classes it is 70.
+ 60:@allskill/@allskills/@skillall/@skillsall - Give you all skills.
+ 60:@stpoint <number of points> - Gives you the desired number of stat points.
+ 60:@skpoint <number of points> - Gives you the desired number of skill points.
+ 60:@zeny <amount> - Gives you desired amount of Zeny.
+ 60:@str,@agi,@vit,@int,@dex,@luk <amount> - Adds desired amount to any stat. For example "@str 10" raises your str by 10
+ 60:@statall/@statsall/@allstats/@allstat [value] - Adds value in all stats (maximum if no value).
+ 60: @addwarp <map name> <x coord> <y coord>
+ 40:
+ 40:--- MONSTERS CMD ---
+ 40:@killmonster2 - kill all monsters of your map (without drops)
+ 50:/monster <monster_name> - Spawns 1 of the desired monster.
+ 50:@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
+ 50:@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
+ 50:@spawn/@monster/@summon/@monster2 "desired monster name" <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
+ 50:@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
+ 50: Spawns the desired monster with any desired name.
+ 50:@monstersmall [Mob ID|Mob Name] - Spawns a smaller version of a monster.
+ 50:@monsterbig [Mob ID|Mob Name] - Spawns a larger version of a monster.
+ 60:@killmonster [map] - kill all monsters of the map (they drop)
+ 40:
+ 10:--- MISC CMD ---
+ 10:@autoloot [on|off|#] - Makes items go straight into your inventory.
+ 10:@autotrade/@at - Allows you to vend while you are offline.
+ 10:@changegm [Player Name] - Changes the leader of your guild (You must be guild leader)
+ 10:@changeleader [Player Name] - Changes the leader of your party (You must be party leader)
+ 20:@request [Message] - Sends a message to all connected GMs (via the gm whisper system)
+ 40:@sound [Path way to file in Data or GRF file] - Plays a sound from the data or grf file located on the client.
+ 50:@clone [Player Name] - Spawns a supportive clone of the given player.
+ 50:@slaveclone [Player Name] - Spawns a supportive clone of the given player that follows the creator around.
+ 50:@evilclone [Player Name] - Spawns an agressive clone of the given player.
+ 60:@changesex - Changes your gender.
+ 10:
+ 1:--- DUEL CMD ---
+ 1:@duel - Starts a duel.
+ 1:@invite - Invites a player to a duel.
+ 1:@accept - Accepts an invitation to a duel.
+ 1:@reject - Rejects an invitation to a duel.
+ 1:@leave - Leaves a duel.
+ 1:
+ 1:--- MAIL SYSTEM --- (SQL Only) (Must be enabled)
+ 1:@checkmail - Check # of messages.
+ 1:@listmail - List all messages.
+ 1:@listnewmail - List only new mail.
+ 1:@readmail - Read a message.
+ 1:@sendmail - Send mail.
+ 1:deletemail - Deletes a message.
80:@sendprioritymail - Sends priority mail (cannot be deleted until read) \ No newline at end of file
diff --git a/conf-tmpl/help2.txt b/conf-tmpl/help2.txt
index a79262aeb..ff5bebd9f 100644
--- a/conf-tmpl/help2.txt
+++ b/conf-tmpl/help2.txt
@@ -1,95 +1,95 @@
- 0:To use one command, type it inside the message window where you usually type to chat.
- 1:--- ITEMS CMD ---
- 1:@storage - Opens storage
- 40:@itemreset - Remove all your items.
- 50:@gstorage - Opens guild storage
- 60:@itemcheck - Check your items with authorised items.
- 60:@idsearch <part_of_item_name> - Search all items that name have part_of_item_name
- 60:@refine <equip position> <+/- amount>
- 60:@produce <equip name or equip ID> <element> <# of very's>
- 60: Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
- 60: You can add up to 3 Star Crumbs and 1 element
- 60:@repairall - Repair all items of your inventory
- 60:/item <item_name> - Gives you 1 of the desired item.
- 60:@item <item name or ID> <quantity> - Gives you the desired item.
- 60:@item2 <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4> - Gives you the desired item.
- 40:
- 40:--- PVP CMD ---
- 40:@pvpon - Turns pvp on on the current map
- 40:@pvpoff - Turns pvp off on the current map
- 40:@gvgon/@gpvpon - Turns gvg on on the current map
- 40:@gvgoff/@gpvpoff - Turns gvg off on the current map
- 60:@agitstart - Starts War of Emperium
- 60:@agitend - End War of Emperium
- 1:
- 1:--- GROUPS CMD ---
- 1:@party <party_name> - Create a party.
- 50:@guild <guild_name> - Create a guild.
- 60:@guildlvup/@guildlvlup <# of levels> - Raise Guild by desired number of levels
- 60:@guildrecall <guild_name/id> - Warps all online characters of a guild to you.
- 60:@partyrecall <party_name/id> - Warps all online characters of a party to you.
- 1:
- 1:--- PETS CMD ---
- 1:@petrename - Re-enable pet rename
- 10:@pettalk [Message] - Makes your pet say a message.
- 40:@petfriendly <#> - Set pet friendly amount (0-1000) 1000 = Max
- 40:@pethungry <#> - Set pet hungry amount (0-100) 100 = Max
- 60:@hatch - Create a pet from your inventory eggs list.
- 60:@makeegg <pet_id> - Gives pet egg for monster number in pet DB
- 20:
- 20:--- REMOTE CHAR CMD ---
- 20:@kick <char name> - Kicks specified character off the server
- 40:@charkillable <char name> - make another character killable
- 60:@unjail/@discharge <char name> - Discharges specified character/prisoner
- 60:@kill <char name> - Kills specified character.
- 60:@chardropall <char name> - throws all a chars possession on the ground
- 60:@charstoreall <char name> - puts all of anothers charactes possessions in storage
- 60:/recall/@recall <char name> - Warps target character to you.
- 60:@revive <char name> - Revives target character.
- 60:@charblock/@block <char name> - Blocks definitively a account
- 60:@charunblock/@unblock <char name> - Unblocks a account
- 60:@charban/@ban/@banish/@charbanish <time> <name> - Ban temporarily a account
- 60: time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
- 60: Example: @ban +1m-2mn1s-6y testplayer
- 60:@charunban/@unban/@unbanish/@charunbanish <name> - Unban a account
- 60:@jail <char name> - Sends specified character in jails
- 60:@trade <char name> - Open a trade window with a another player
- 80:@recallall - Warps every character online to you.
- 80:@doom - Kills all NON GM chars on the server.
- 80:@doommap - Kills all non GM characters on the map.
- 80:@raise - Resurrects all characters on the server.
- 80:@raisemap - Resurrects all characters on the map.
- 80:
- 80:--- ENVIRONMENT CMD ---
- 80:@night - Uses @option 00 16 00 on all characters. All characters are in darkness.
- 80:@day - Uses @option 00 00 00 on all characters.
- 80:@skillon - turn skills on for a map
- 80:@skilloff - turn skills on for a map
- 99:@rain - Makes all maps to have the rain weather effect.
- 99:@snow - Makes all maps to have the snow weather effect.
- 99:@clouds - Makes all maps to have the cloudy weather effect.
- 99:@clouds2 - Makes all maps to have another cloudy weather effect.
- 99:@fog - Makes all maps to have the fog weather effect.
- 99:@fireworks - Makes all maps to have the fireworks weather effect.
- 99:@sakura - Makes all maps to have the sakura weather effect.
- 99:@leaves - Makes all maps to have the leaves weather effect.
- 80:
- 80:--- ADMIN CMD ---
- 80:@shownpc <NPC name> - Enable a NPC
- 80:@hidenpc <NPC name> - Disable a NPC
- 80:@loadnpc <path to script> - Load script
- 80:@unloadnpc <NPC name> - Unload script
- 99:@adjgmlvl <level> <char name> - Do a temporary adjustment of the GM level of a player
- 99:@adjcmdlvl <level> <command> - Do a temporary adjustment of the GM level of a command
- 99:@kickall - Kick all characters off the server
- 99:@mapexit - Kick all players and shut down map-server.
- 99:@reloaditemdb - Reload item database.
- 99:@reloadmobdb - Reload monster database.
- 99:@reloadskilldb - Reload skills definition database.
- 99:@reloadscript - Reload all scripts.
- 99:@reloadgmdb - Reload GM levels.
- 99:
- 99:@gat - For debugging (you inspect around gat)
- 99:@packet - For debugging (packet variety)
-100:@nuke <char name> -
+ 0:To use one command, type it inside the message window where you usually type to chat.
+ 1:--- ITEMS CMD ---
+ 1:@storage - Opens storage
+ 40:@itemreset - Remove all your items.
+ 50:@gstorage - Opens guild storage
+ 60:@itemcheck - Check your items with authorised items.
+ 60:@idsearch <part_of_item_name> - Search all items that name have part_of_item_name
+ 60:@refine <equip position> <+/- amount>
+ 60:@produce <equip name or equip ID> <element> <# of very's>
+ 60: Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
+ 60: You can add up to 3 Star Crumbs and 1 element
+ 60:@repairall - Repair all items of your inventory
+ 60:/item <item_name> - Gives you 1 of the desired item.
+ 60:@item <item name or ID> <quantity> - Gives you the desired item.
+ 60:@item2 <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4> - Gives you the desired item.
+ 40:
+ 40:--- PVP CMD ---
+ 40:@pvpon - Turns pvp on on the current map
+ 40:@pvpoff - Turns pvp off on the current map
+ 40:@gvgon/@gpvpon - Turns gvg on on the current map
+ 40:@gvgoff/@gpvpoff - Turns gvg off on the current map
+ 60:@agitstart - Starts War of Emperium
+ 60:@agitend - End War of Emperium
+ 1:
+ 1:--- GROUPS CMD ---
+ 1:@party <party_name> - Create a party.
+ 50:@guild <guild_name> - Create a guild.
+ 60:@guildlvup/@guildlvlup <# of levels> - Raise Guild by desired number of levels
+ 60:@guildrecall <guild_name/id> - Warps all online characters of a guild to you.
+ 60:@partyrecall <party_name/id> - Warps all online characters of a party to you.
+ 1:
+ 1:--- PETS CMD ---
+ 1:@petrename - Re-enable pet rename
+ 10:@pettalk [Message] - Makes your pet say a message.
+ 40:@petfriendly <#> - Set pet friendly amount (0-1000) 1000 = Max
+ 40:@pethungry <#> - Set pet hungry amount (0-100) 100 = Max
+ 60:@hatch - Create a pet from your inventory eggs list.
+ 60:@makeegg <pet_id> - Gives pet egg for monster number in pet DB
+ 20:
+ 20:--- REMOTE CHAR CMD ---
+ 20:@kick <char name> - Kicks specified character off the server
+ 40:@charkillable <char name> - make another character killable
+ 60:@unjail/@discharge <char name> - Discharges specified character/prisoner
+ 60:@kill <char name> - Kills specified character.
+ 60:@chardropall <char name> - throws all a chars possession on the ground
+ 60:@charstoreall <char name> - puts all of anothers charactes possessions in storage
+ 60:/recall/@recall <char name> - Warps target character to you.
+ 60:@revive <char name> - Revives target character.
+ 60:@charblock/@block <char name> - Blocks definitively a account
+ 60:@charunblock/@unblock <char name> - Unblocks a account
+ 60:@charban/@ban/@banish/@charbanish <time> <name> - Ban temporarily a account
+ 60: time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
+ 60: Example: @ban +1m-2mn1s-6y testplayer
+ 60:@charunban/@unban/@unbanish/@charunbanish <name> - Unban a account
+ 60:@jail <char name> - Sends specified character in jails
+ 60:@trade <char name> - Open a trade window with a another player
+ 80:@recallall - Warps every character online to you.
+ 80:@doom - Kills all NON GM chars on the server.
+ 80:@doommap - Kills all non GM characters on the map.
+ 80:@raise - Resurrects all characters on the server.
+ 80:@raisemap - Resurrects all characters on the map.
+ 80:
+ 80:--- ENVIRONMENT CMD ---
+ 80:@night - Uses @option 00 16 00 on all characters. All characters are in darkness.
+ 80:@day - Uses @option 00 00 00 on all characters.
+ 80:@skillon - turn skills on for a map
+ 80:@skilloff - turn skills on for a map
+ 99:@rain - Makes all maps to have the rain weather effect.
+ 99:@snow - Makes all maps to have the snow weather effect.
+ 99:@clouds - Makes all maps to have the cloudy weather effect.
+ 99:@clouds2 - Makes all maps to have another cloudy weather effect.
+ 99:@fog - Makes all maps to have the fog weather effect.
+ 99:@fireworks - Makes all maps to have the fireworks weather effect.
+ 99:@sakura - Makes all maps to have the sakura weather effect.
+ 99:@leaves - Makes all maps to have the leaves weather effect.
+ 80:
+ 80:--- ADMIN CMD ---
+ 80:@shownpc <NPC name> - Enable a NPC
+ 80:@hidenpc <NPC name> - Disable a NPC
+ 80:@loadnpc <path to script> - Load script
+ 80:@unloadnpc <NPC name> - Unload script
+ 99:@adjgmlvl <level> <char name> - Do a temporary adjustment of the GM level of a player
+ 99:@adjcmdlvl <level> <command> - Do a temporary adjustment of the GM level of a command
+ 99:@kickall - Kick all characters off the server
+ 99:@mapexit - Kick all players and shut down map-server.
+ 99:@reloaditemdb - Reload item database.
+ 99:@reloadmobdb - Reload monster database.
+ 99:@reloadskilldb - Reload skills definition database.
+ 99:@reloadscript - Reload all scripts.
+ 99:@reloadgmdb - Reload GM levels.
+ 99:
+ 99:@gat - For debugging (you inspect around gat)
+ 99:@packet - For debugging (packet variety)
+100:@nuke <char name> -
100:@GM <password> - it becomes GM! (password is set in login_athena.conf) \ No newline at end of file
diff --git a/conf-tmpl/inter_athena.conf b/conf-tmpl/inter_athena.conf
index 7b6948c68..6b4db55b1 100644
--- a/conf-tmpl/inter_athena.conf
+++ b/conf-tmpl/inter_athena.conf
@@ -1,171 +1,171 @@
-// Athena InterServer configuration.
-
-// TXT version options only
-
-// Storage flatfile database, used for Karfa storage.
-storage_txt: save/storage.txt
-
-// Party flatfile database, for party names, members and other party info.
-party_txt: save/party.txt
-
-// Guild flatfile database, for guild names, members, and other guild info.
-guild_txt: save/guild.txt
-
-// Pet flatfile database, for pet names, and other pet info.
-pet_txt: save/pet.txt
-
-// Homunculus flatfile database, for homunculus information.
-homun_txt: save/homun.txt
-
-// Castle flatfile database, for emperium war castles, etc.
-castle_txt: save/castle.txt
-
-// Status change flatfile database, for status changes that are saved between sessions.
-scdata_txt: save/scdata.txt
-
-// Options for both versions
-
-// Log Inter Connections, etc.?
-log_inter: 1
-
-// Inter Log Filename
-inter_log_filename: log/inter.log
-
-// Level range for sharing within a party
-party_share_level: 10
-
-// SQL version options only
-
-// Char-Save method
-// 0 = saves over the charserver [default]
-// 1 = map server saves character data (reduces strain on the charserver)
-// NOTE: Feature still somewhat experimental, needs more testing.
-// WARNING: Don't use it in multi char/map or customized table names config.
-charsave_method: 0
-
-// GM Reading Method
-// 1 to have Char read GMs, 0 to have Login-controlled GMs
-gm_read_method: 0
-
-// The level at which a player with access is considered a GM.
-// An account with an access level lower than this is not effected
-// by gm_can_drop_lv (battle_athena.conf).
-lowest_gm_level: 1
-
-// You can specify the codepage to use in your mySQL tables here.
-// (Note that this feature requires MySQL 4.1+)
-//default_codepage:
-
-// Interval (in hours) at which servers do a ping on all sql-connections
-// to keep them alive (the default mysql settings makes a connection time-out
-// after 8 hours of inactivity).
-// 0 disables (default). Enable it only if you are getting
-// "MySQL server has gone Away" errors due to lack of activity on your server
-connection_ping_interval: 7
-
-// 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
-
-// MySQL Login SQL Server
-login_server_ip: 127.0.0.1
-login_server_port: 3306
-login_server_id: ragnarok
-login_server_pw: ragnarok
-login_server_db: ragnarok
-
-// MySQL Character SQL server
-char_server_ip: 127.0.0.1
-char_server_port: 3306
-char_server_id: ragnarok
-char_server_pw: ragnarok
-char_server_db: ragnarok
-
-// MySQL Map SQL Server
-map_server_ip: 127.0.0.1
-map_server_port: 3306
-map_server_id: ragnarok
-map_server_pw: ragnarok
-map_server_db: ragnarok
-
-// MySQL Log SQL Database
-log_db_ip: 127.0.0.1
-log_db_port: 3306
-log_db_id: ragnarok
-log_db_pw: ragnarok
-log_db: log
-
-// MySQL Mail SQL Server
-mail_server_ip: 127.0.0.1
-mail_server_port: 3306
-mail_server_id: ragnarok
-mail_server_pw: ragnarok
-mail_server_db: ragnarok
-
-// for TXT -> SQL convertors
-db_server_ip: 127.0.0.1
-db_server_port: 3306
-db_server_id: ragnarok
-db_server_pw: ragnarok
-db_server_logindb: ragnarok
-
-// 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]
-
-//Column names for the login table.
-login_db_account_id: account_id
-login_db_userid: userid
-login_db_user_pass: user_pass
-login_db_level: level
-
-// ALL MySQL Database Table names
-
-// Login Database Tables
-login_db: login
-loginlog_db: loginlog
-
-// Character Database Tables
-char_db: char
-scdata_db: sc_data
-cart_db: cart_inventory
-inventory_db: inventory
-charlog_db: charlog
-storage_db: storage
-reg_db: global_reg_value
-skill_db: skill
-interlog_db: interlog
-memo_db: memo
-guild_db: guild
-guild_alliance_db: guild_alliance
-guild_castle_db: guild_castle
-guild_expulsion_db: guild_expulsion
-guild_member_db: guild_member
-guild_skill_db: guild_skill
-guild_position_db: guild_position
-guild_storage_db: guild_storage
-party_db: party
-pet_db: pet
-friend_db: friends
-
-// Map Database Tables
-item_db_db: item_db
-item_db2_db: item_db2
-mob_db_db: mob_db
-mob_db2_db: mob_db2
-
-// Mail Database Table
-mail_db: mail
-
-//Use SQL item_db and mob_db for the map server
-use_sql_db: no
-
-// Use SQL Mail Server
-mail_server_enable: no
-
-// Nick for sending mainchat
-// messages like whisper
-main_chat_nick: Main
-
-import: conf/import/inter_conf.txt
+// Athena InterServer configuration.
+
+// TXT version options only
+
+// Storage flatfile database, used for Karfa storage.
+storage_txt: save/storage.txt
+
+// Party flatfile database, for party names, members and other party info.
+party_txt: save/party.txt
+
+// Guild flatfile database, for guild names, members, and other guild info.
+guild_txt: save/guild.txt
+
+// Pet flatfile database, for pet names, and other pet info.
+pet_txt: save/pet.txt
+
+// Homunculus flatfile database, for homunculus information.
+homun_txt: save/homun.txt
+
+// Castle flatfile database, for emperium war castles, etc.
+castle_txt: save/castle.txt
+
+// Status change flatfile database, for status changes that are saved between sessions.
+scdata_txt: save/scdata.txt
+
+// Options for both versions
+
+// Log Inter Connections, etc.?
+log_inter: 1
+
+// Inter Log Filename
+inter_log_filename: log/inter.log
+
+// Level range for sharing within a party
+party_share_level: 10
+
+// SQL version options only
+
+// Char-Save method
+// 0 = saves over the charserver [default]
+// 1 = map server saves character data (reduces strain on the charserver)
+// NOTE: Feature still somewhat experimental, needs more testing.
+// WARNING: Don't use it in multi char/map or customized table names config.
+charsave_method: 0
+
+// GM Reading Method
+// 1 to have Char read GMs, 0 to have Login-controlled GMs
+gm_read_method: 0
+
+// The level at which a player with access is considered a GM.
+// An account with an access level lower than this is not effected
+// by gm_can_drop_lv (battle_athena.conf).
+lowest_gm_level: 1
+
+// You can specify the codepage to use in your mySQL tables here.
+// (Note that this feature requires MySQL 4.1+)
+//default_codepage:
+
+// Interval (in hours) at which servers do a ping on all sql-connections
+// to keep them alive (the default mysql settings makes a connection time-out
+// after 8 hours of inactivity).
+// 0 disables (default). Enable it only if you are getting
+// "MySQL server has gone Away" errors due to lack of activity on your server
+connection_ping_interval: 7
+
+// 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
+
+// MySQL Login SQL Server
+login_server_ip: 127.0.0.1
+login_server_port: 3306
+login_server_id: ragnarok
+login_server_pw: ragnarok
+login_server_db: ragnarok
+
+// MySQL Character SQL server
+char_server_ip: 127.0.0.1
+char_server_port: 3306
+char_server_id: ragnarok
+char_server_pw: ragnarok
+char_server_db: ragnarok
+
+// MySQL Map SQL Server
+map_server_ip: 127.0.0.1
+map_server_port: 3306
+map_server_id: ragnarok
+map_server_pw: ragnarok
+map_server_db: ragnarok
+
+// MySQL Log SQL Database
+log_db_ip: 127.0.0.1
+log_db_port: 3306
+log_db_id: ragnarok
+log_db_pw: ragnarok
+log_db: log
+
+// MySQL Mail SQL Server
+mail_server_ip: 127.0.0.1
+mail_server_port: 3306
+mail_server_id: ragnarok
+mail_server_pw: ragnarok
+mail_server_db: ragnarok
+
+// for TXT -> SQL convertors
+db_server_ip: 127.0.0.1
+db_server_port: 3306
+db_server_id: ragnarok
+db_server_pw: ragnarok
+db_server_logindb: ragnarok
+
+// 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]
+
+//Column names for the login table.
+login_db_account_id: account_id
+login_db_userid: userid
+login_db_user_pass: user_pass
+login_db_level: level
+
+// ALL MySQL Database Table names
+
+// Login Database Tables
+login_db: login
+loginlog_db: loginlog
+
+// Character Database Tables
+char_db: char
+scdata_db: sc_data
+cart_db: cart_inventory
+inventory_db: inventory
+charlog_db: charlog
+storage_db: storage
+reg_db: global_reg_value
+skill_db: skill
+interlog_db: interlog
+memo_db: memo
+guild_db: guild
+guild_alliance_db: guild_alliance
+guild_castle_db: guild_castle
+guild_expulsion_db: guild_expulsion
+guild_member_db: guild_member
+guild_skill_db: guild_skill
+guild_position_db: guild_position
+guild_storage_db: guild_storage
+party_db: party
+pet_db: pet
+friend_db: friends
+
+// Map Database Tables
+item_db_db: item_db
+item_db2_db: item_db2
+mob_db_db: mob_db
+mob_db2_db: mob_db2
+
+// Mail Database Table
+mail_db: mail
+
+//Use SQL item_db and mob_db for the map server
+use_sql_db: no
+
+// Use SQL Mail Server
+mail_server_enable: no
+
+// Nick for sending mainchat
+// messages like whisper
+main_chat_nick: Main
+
+import: conf/import/inter_conf.txt
diff --git a/conf-tmpl/irc_athena.conf b/conf-tmpl/irc_athena.conf
index 2929966d9..c55b9c2c0 100644
--- a/conf-tmpl/irc_athena.conf
+++ b/conf-tmpl/irc_athena.conf
@@ -1,42 +1,42 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------
-// eAthena IRC Bot Configuration File
-//--------------------------------------------------------
-
-//Turn the IRC Bot 'on' or 'off'
-use_irc: off
-
-//IRC Server Address
-irc_server: irc.deltaanime.net
-
-//IRC Server Port
-irc_port: 6667
-
-//Autojoin channel when kicked (on=1,off=0)
-irc_autojoin: 0
-
-//IRC Channel
-irc_channel: #
-
-//IRC Channel password (set if required)
-//irc_channel_pass:
-
-//IRC Trade Channel
-irc_trade_channel: #
-
-//IRC Nickname
-irc_nick:
-
-//IRC Password ("0" for no pass)
-irc_pass: 0
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------
+// eAthena IRC Bot Configuration File
+//--------------------------------------------------------
+
+//Turn the IRC Bot 'on' or 'off'
+use_irc: off
+
+//IRC Server Address
+irc_server: irc.deltaanime.net
+
+//IRC Server Port
+irc_port: 6667
+
+//Autojoin channel when kicked (on=1,off=0)
+irc_autojoin: 0
+
+//IRC Channel
+irc_channel: #
+
+//IRC Channel password (set if required)
+//irc_channel_pass:
+
+//IRC Trade Channel
+irc_trade_channel: #
+
+//IRC Nickname
+irc_nick:
+
+//IRC Password ("0" for no pass)
+irc_pass: 0
diff --git a/conf-tmpl/ladmin_athena.conf b/conf-tmpl/ladmin_athena.conf
index ba9f11c0a..dafd72388 100644
--- a/conf-tmpl/ladmin_athena.conf
+++ b/conf-tmpl/ladmin_athena.conf
@@ -1,33 +1,33 @@
-// Athena Ladmin configuration file.
-
-// Login Server IP
-login_ip:127.0.0.1
-// Login Server Port
-login_port: 6900
-
-// Administrative password, used to connect remotely to server.
-// NOTICE: If you enable remote administration, you should change its value for security
-admin_pass: admin
-
-// Encoding type of the password
-// 0: not encoded
-// 1: key+password
-// 2: password+key
-passenc: 2
-
-// Language of ladmin
-// F: Français
-// E: English (default)
-defaultlanguage: E
-
-// Log Filename. All operations done by the software are logged in this file.
-ladmin_log_filename: log/ladmin.log
-
-// Indicate how to display date in logs, to players, etc.
-// 0: 31-12-2004 23:59:59
-// 1: 12-31-2004 23:59:59
-// 2: 2004-31-12 23:59:59
-// 3: 2004-12-31 23:59:59 (default)
-date_format: 3
-
-import: conf/import/ladmin_conf.txt
+// Athena Ladmin configuration file.
+
+// Login Server IP
+login_ip:127.0.0.1
+// Login Server Port
+login_port: 6900
+
+// Administrative password, used to connect remotely to server.
+// NOTICE: If you enable remote administration, you should change its value for security
+admin_pass: admin
+
+// Encoding type of the password
+// 0: not encoded
+// 1: key+password
+// 2: password+key
+passenc: 2
+
+// Language of ladmin
+// F: Français
+// E: English (default)
+defaultlanguage: E
+
+// Log Filename. All operations done by the software are logged in this file.
+ladmin_log_filename: log/ladmin.log
+
+// Indicate how to display date in logs, to players, etc.
+// 0: 31-12-2004 23:59:59
+// 1: 12-31-2004 23:59:59
+// 2: 2004-31-12 23:59:59
+// 3: 2004-12-31 23:59:59 (default)
+date_format: 3
+
+import: conf/import/ladmin_conf.txt
diff --git a/conf-tmpl/log_athena.conf b/conf-tmpl/log_athena.conf
index 1b9242cb9..f55394cc5 100644
--- a/conf-tmpl/log_athena.conf
+++ b/conf-tmpl/log_athena.conf
@@ -1,143 +1,143 @@
-// eAthena - Log Configuration File
-
-// Enable Logs?
-// 1 - Log all events.
-// Or, determine what to log by adding up the different events:
-// 0002 - Log trades
-// 0004 - Log vending transactions
-// 0008 - Log items drop/picked by players
-// 0016 - Log items drop/looted by monsters
-// 0032 - Log NPC transactions (buy/sell)
-// 0064 - Log Script generated transactions (items deleted/acquired through quests)
-// 0128 - Log items stolen from mobs (Steal/Gank)
-// 0256 - Log player-used items.
-// 0512 - Log MVP prize items
-// 1024 - Log player created/deleted items (through @/# commands)
-// Example: Log trades+vending+script items+created items: 2+4+64+1024:
-// enable_logs: 1094
-enable_logs: 1
-
-// Use MySQL Logs? (SQL Version Only)
-sql_logs: 0
-
-// LOGGING FILTERS [Lupus]
-//=============================================================
-//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: ||
-//0002 - Healing items (0)
-//0004 - Etc Items(3) + Arrows (10)
-//0008 - Usable Items(2) + Lures,Scrolls(11)
-//0016 - Weapon(4)
-//0032 - Shields,Armor,Headgears,Accessories,etc(5)
-//0064 - Cards(6)
-//0128 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
-//0256 - Log expensive items ( >= price_items_log)
-//0512 - Log big amount of items ( >= amount_items_log)
-//1024 - Log refined items (if their refine >= refine_items_log )
-//2048 - Log rare items (if their drop chance <= rare_items_log )
-
-//Examples: (log filters)
-//log_filter: 1 = logs ANY items
-//log_filter: 2 = logs only HEALING items
-//log_filter: 4 = logs only Etc Items and Arrows
-//log_filter: 64 = logs only Cards
-//log_filter: 322 = logs only Healing items, Cards and those items which price is >= price_items_log
-//log_filter: 4080 = logs all items (including all rare, big amount) exept healing, etc, arrows and useble ones
-//etc
-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 price < price_items_log
-price_items_log: 1000
-//don't log it if the current item amount < amount_items_log
-amount_items_log: 100
-//=============================================================
-
-// Log Dead Branch Usage
-log_branch: 0
-
-// Track Zeny Changes
-// Filter settings
-// 0 - don't log; 1 - log any zeny changes; 2.....1000000 - minimal absolut logging zeny value
-log_zeny: 0
-
-// Log MVP Monster Drops
-//Outdated. Use Pick_Log instead. But this log could be useful to keep track slayed MVPs
-log_mvpdrop: 0
-
-// Log GM Commands (set to minimum level of Logged Commands)
-log_gm: 40
-
-// Log NPC 'logmes' commands
-log_npc: 0
-
-// Log CHAT (currently only: Party, Guild, Whisper)
-// LOGGING FILTERS [Lupus]
-//=============================================================
-//0 = Don't log at all
-//1 = Log any chat messages
-//Advanced Filter Bits: ||
-//2 - Log Whisper messages
-//3 - Log Party messages
-//4 - Log Guild messages
-//5 - Log Common messages (not implemented)
-//6 - Don't log when WOE is on
-//Example:
-//log_chat: 1 = logs ANY messages
-//log_chat: 6 = logs both Whisper & Party messages
-//log_chat: 8 = logs only Guild messages
-//log_chat: 18 = logs only Whisper, when WOE is off
-
-log_chat: 0
-
-// Dead Branch Log Table
-log_branch_db: branchlog
-
-// Drops & Pickups Table
-log_pick_db: picklog
-
-// Zeny Table
-log_zeny_db: zenylog
-
-// MVP Drop Table
-log_mvpdrop_db: mvplog
-
-// GM Log Table
-log_gm_db: atcommandlog
-
-// NPC Log Table
-log_npc_db: npclog
-
-// CHAT Log Table
-log_chat_db: chatlog
-
-
-// Dead Branch Log File
-log_branch_file: log/branchlog.log
-
-// Drops & Pickups Log File
-log_pick_file: log/picklog.log
-
-// Zeny Log File
-log_zeny_file: log/zenylog.log
-
-// MVP Drop File
-log_mvpdrop_file: log/mvplog.log
-
-// GM Log File
-log_gm_file: log/atcommandlog.log
-
-// NPC Log File
-log_npc_file: log/npclog.log
-
-// CHAT Log File
-log_chat_file: log/chatlog.log
-
-
-import: conf/import/log_conf.txt
+// eAthena - Log Configuration File
+
+// Enable Logs?
+// 1 - Log all events.
+// Or, determine what to log by adding up the different events:
+// 0002 - Log trades
+// 0004 - Log vending transactions
+// 0008 - Log items drop/picked by players
+// 0016 - Log items drop/looted by monsters
+// 0032 - Log NPC transactions (buy/sell)
+// 0064 - Log Script generated transactions (items deleted/acquired through quests)
+// 0128 - Log items stolen from mobs (Steal/Gank)
+// 0256 - Log player-used items.
+// 0512 - Log MVP prize items
+// 1024 - Log player created/deleted items (through @/# commands)
+// Example: Log trades+vending+script items+created items: 2+4+64+1024:
+// enable_logs: 1094
+enable_logs: 1
+
+// Use MySQL Logs? (SQL Version Only)
+sql_logs: 0
+
+// LOGGING FILTERS [Lupus]
+//=============================================================
+//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: ||
+//0002 - Healing items (0)
+//0004 - Etc Items(3) + Arrows (10)
+//0008 - Usable Items(2) + Lures,Scrolls(11)
+//0016 - Weapon(4)
+//0032 - Shields,Armor,Headgears,Accessories,etc(5)
+//0064 - Cards(6)
+//0128 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
+//0256 - Log expensive items ( >= price_items_log)
+//0512 - Log big amount of items ( >= amount_items_log)
+//1024 - Log refined items (if their refine >= refine_items_log )
+//2048 - Log rare items (if their drop chance <= rare_items_log )
+
+//Examples: (log filters)
+//log_filter: 1 = logs ANY items
+//log_filter: 2 = logs only HEALING items
+//log_filter: 4 = logs only Etc Items and Arrows
+//log_filter: 64 = logs only Cards
+//log_filter: 322 = logs only Healing items, Cards and those items which price is >= price_items_log
+//log_filter: 4080 = logs all items (including all rare, big amount) exept healing, etc, arrows and useble ones
+//etc
+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 price < price_items_log
+price_items_log: 1000
+//don't log it if the current item amount < amount_items_log
+amount_items_log: 100
+//=============================================================
+
+// Log Dead Branch Usage
+log_branch: 0
+
+// Track Zeny Changes
+// Filter settings
+// 0 - don't log; 1 - log any zeny changes; 2.....1000000 - minimal absolut logging zeny value
+log_zeny: 0
+
+// Log MVP Monster Drops
+//Outdated. Use Pick_Log instead. But this log could be useful to keep track slayed MVPs
+log_mvpdrop: 0
+
+// Log GM Commands (set to minimum level of Logged Commands)
+log_gm: 40
+
+// Log NPC 'logmes' commands
+log_npc: 0
+
+// Log CHAT (currently only: Party, Guild, Whisper)
+// LOGGING FILTERS [Lupus]
+//=============================================================
+//0 = Don't log at all
+//1 = Log any chat messages
+//Advanced Filter Bits: ||
+//2 - Log Whisper messages
+//3 - Log Party messages
+//4 - Log Guild messages
+//5 - Log Common messages (not implemented)
+//6 - Don't log when WOE is on
+//Example:
+//log_chat: 1 = logs ANY messages
+//log_chat: 6 = logs both Whisper & Party messages
+//log_chat: 8 = logs only Guild messages
+//log_chat: 18 = logs only Whisper, when WOE is off
+
+log_chat: 0
+
+// Dead Branch Log Table
+log_branch_db: branchlog
+
+// Drops & Pickups Table
+log_pick_db: picklog
+
+// Zeny Table
+log_zeny_db: zenylog
+
+// MVP Drop Table
+log_mvpdrop_db: mvplog
+
+// GM Log Table
+log_gm_db: atcommandlog
+
+// NPC Log Table
+log_npc_db: npclog
+
+// CHAT Log Table
+log_chat_db: chatlog
+
+
+// Dead Branch Log File
+log_branch_file: log/branchlog.log
+
+// Drops & Pickups Log File
+log_pick_file: log/picklog.log
+
+// Zeny Log File
+log_zeny_file: log/zenylog.log
+
+// MVP Drop File
+log_mvpdrop_file: log/mvplog.log
+
+// GM Log File
+log_gm_file: log/atcommandlog.log
+
+// NPC Log File
+log_npc_file: log/npclog.log
+
+// CHAT Log File
+log_chat_file: log/chatlog.log
+
+
+import: conf/import/log_conf.txt
diff --git a/conf-tmpl/login_athena.conf b/conf-tmpl/login_athena.conf
index 834904a89..8adcb1ccd 100644
--- a/conf-tmpl/login_athena.conf
+++ b/conf-tmpl/login_athena.conf
@@ -1,204 +1,204 @@
-// Athena Login Server configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-// Note: "Comments" are all text on the right side of a double slash "//"
-// Whatever text is commented will not be parsed by the servers, and serves
-// only as information/reference.
-
-// 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
-
-// Login Server Port
-login_port: 6900
-
-//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]
-
-//Defines if the ansi sequences should be parsed or skipped.
-//If set to yes the console output is in color. If the stream is redirected to
-//a file, the ansi sequences are printed out.
-//If set to no the console is colorless and, if redirected, will skip the ansi
-//sequences.
-//NOTE: this setting applyes for both stdout and stderr
-stdout_with_ansisequence: yes
-
-//Makes server output more silent by ommitting 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.
-//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
-console_silent: 0
-
-// Whether remote administration is enabled or disabled (1 for enabled, 0 for disabled)
-admin_state: 0
-
-// Administrative password, used by ladmin (perl software) to connect remotely to server.
-// NOTICE: If you enable remote administration, you should change its value for security
-admin_pass: admin
-
-// Indicate the IP that the server accepts for remote administration.
-// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
-// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
-// or 'clear' to suppress previous parameter (use it in import file mainly)
-// Add as many IP's as you wish.
-ladminallowip: all
-
-// Console Commands
-// Allow for console commands to be used on/off
-// This prevents usage of >& log.file
-console: off
-
-// Are login's case sensitive (SQL only)?
-case_sensitive: on
-
-// Gamemaster password, used with the @gm command to obtain GM commands (level of gm set with level_new_gm parameter).
-// NOTICE: You should also change this one.
-gm_pass: gm
-
-// Level of new GM created with @gm command. (default: 60)
-// If you set to 0, you disable creation of new GM with @gm.
-// To be able to create a gm with @gm, you must:
-// - give a level to this value (not 0)
-// - enable to level 0 the @gm command (atcommand_athena.conf) (default 100)
-// - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
-// - and normal player must give correct password when he use the @gm command
-level_new_gm: 60
-
-// Can you make new accounts on the server? (1 for Yes, 0 for no)
-// (1 = _M/_F enabled, 0 = not enabled)
-new_account: 1
-
-// ********** account registration flood system **********
-// allowed_regs is the number of registrations allowed in time_allowed (in seconds)
-allowed_regs: 1
-time_allowed: 10
-
-// Account flatfile database, stores account information.
-account_filename: save/account.txt
-
-// What account AIDs have GM privs, and what level?
-gm_account_filename: conf/GM_account.txt
-
-// Timer to check if GM_account file has been changed and reload GM account automaticaly
-// (in seconds; default: 15; value: 0 (disabled), or 2 or more)
-gm_account_filename_check_timer: 15
-
-// Log Filename. All operations received by the server are logged in this file.
-login_log_filename: log/login.log
-
-// To log the login server?
-// NOTE: The login-sql server needs the login logs to enable dynamic pass failure bans.
-log_login: 1
-
-// Name of the file of that logs the unknown packets (for debug or hack check)
-login_log_unknown_packets_filename: log/login_unknown_packets.log
-
-//When set to yes, the login server will refuse connections from accounts that are considered online already.
-//When a login attempt is rejected, the account in question is also kicked from all connected char-servers.
-//It's safe to turn this off if there's only one char-server connected, or if the char-servers don't share
-//the same backend (ie: Multiple char servers reading from the same SQL tables)
-online_check: yes
-
-// Indicate if the unknown packets are saved or not
-//(the unknown packets coming from the char-server or ladministration does not relate to, which is always saved)
-// Be careful: if you receive an attack, your hard disk can cause lag...
-// So, active this option with a speed hard disk or for debug only.
-save_unknown_packets: 0
-
-// Indicate if you want display the parse of the packets received in a normal connection
-// It's useful for debug. Possible values: 0: no (default), 1: yes
-display_parse_login: 0
-
-// Indicate if you want display the parse of the packets received in administration connection
-// It's useful for debug. Possible values: 0: no (default), 1: yes
-display_parse_admin: 0
-
-// Indicate if you want display the parse of the packets received from a char-server
-// It's useful for debug. Possible values: 0: no (default), 1: yes (without packet 0x2714), 2: all packets
-display_parse_fromchar: 0
-
-// Indicate how to display date in logs, to players, etc.
-// 0: 31-12-2004 23:59:59
-// 1: 12-31-2004 23:59:59
-// 2: 2004-31-12 23:59:59
-// 3: 2004-12-31 23:59:59 (default)
-date_format: 3
-
-// Indicate the minimum GM level of player that the server accepts to connection.
-// 0: all players (normal player are 0. it's default), 1-99: GM level at least with level x
-min_level_to_connect: 0
-
-// Give possibility to adjust (ladmin command: timeadd) the time of an unlimited account.
-// If set to on/1/yes..., the adjustment is be done from actual time to set the final time of the account.
-// If set to no/0/no..., the adjustment can not be done on an unlimited account. You must set (ladmin command: timeset) a final time before to adjust (ladmin command: timeadd)
-add_to_unlimited_account: off
-
-// 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
-
-// It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-// If player doesn't have same IP, connection is refused.
-// Set to 0/off/no to not check IP of player.
-// Set to 1/on/yes if you want to check (default)
-// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
-// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
-// if not correct, you can read list of char-servers, but not look slots of characters (rejected by server).
-check_ip_flag: yes
-
-// Specify order of IP control if necessary (option: 'deny,allow', 'allow,deny', or 'mutual-failture')
-// (how to use 'allow' and 'deny' information)
-//order: allow,deny
-
-// Indicate the IP that the server accept.
-// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
-// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
-// or 'clear' to suppress previous parameter (use it in import file mainly)
-// Add as many IP's as you wish.
-//allow: all
-
-// Indicate the IP that the server refuse.
-// Add as many IP's as you wish, as long as you put deny: before it.
-//deny: 123.123.123.123
-//deny: 234.234.234.234
-
-//Check The clientversion set in the clientinfo ?
-check_client_version: no
-
-//What version we would allow to connect? (if the options above is enabled..)
-client_version_to_connect: 20
-
-//Passwords in Login DB are MD5 - <passwordencrypt> cannot b used on client with this on
-use_MD5_passwords: no
-
-//Ban features: read readme for more info if you dont know this.
-ipban: 1
-dynamic_pass_failure_ban: 1
-dynamic_pass_failure_ban_time: 5
-dynamic_pass_failure_ban_how_many: 7
-dynamic_pass_failure_ban_how_long: 5
-dynamic_account_ban: 1
-dynamic_account_ban_class: 0
-
-//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
-
-//DNS Blacklist Blocking (on: 1, off: 0)
-use_dnsbl: 0
-
-//DNS Servers (seperated by a comma)
-dnsbl_servers: dnsbl.deltaanime.net
-
-import: conf/import/login_conf.txt
+// Athena Login Server configuration file.
+// Translated by Peter Kieser <pfak@telus.net>
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+// 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
+
+// Login Server Port
+login_port: 6900
+
+//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]
+
+//Defines if the ansi sequences should be parsed or skipped.
+//If set to yes the console output is in color. If the stream is redirected to
+//a file, the ansi sequences are printed out.
+//If set to no the console is colorless and, if redirected, will skip the ansi
+//sequences.
+//NOTE: this setting applyes for both stdout and stderr
+stdout_with_ansisequence: yes
+
+//Makes server output more silent by ommitting 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.
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+// Whether remote administration is enabled or disabled (1 for enabled, 0 for disabled)
+admin_state: 0
+
+// Administrative password, used by ladmin (perl software) to connect remotely to server.
+// NOTICE: If you enable remote administration, you should change its value for security
+admin_pass: admin
+
+// Indicate the IP that the server accepts for remote administration.
+// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
+// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
+// or 'clear' to suppress previous parameter (use it in import file mainly)
+// Add as many IP's as you wish.
+ladminallowip: all
+
+// Console Commands
+// Allow for console commands to be used on/off
+// This prevents usage of >& log.file
+console: off
+
+// Are login's case sensitive (SQL only)?
+case_sensitive: on
+
+// Gamemaster password, used with the @gm command to obtain GM commands (level of gm set with level_new_gm parameter).
+// NOTICE: You should also change this one.
+gm_pass: gm
+
+// Level of new GM created with @gm command. (default: 60)
+// If you set to 0, you disable creation of new GM with @gm.
+// To be able to create a gm with @gm, you must:
+// - give a level to this value (not 0)
+// - enable to level 0 the @gm command (atcommand_athena.conf) (default 100)
+// - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
+// - and normal player must give correct password when he use the @gm command
+level_new_gm: 60
+
+// Can you make new accounts on the server? (1 for Yes, 0 for no)
+// (1 = _M/_F enabled, 0 = not enabled)
+new_account: 1
+
+// ********** account registration flood system **********
+// allowed_regs is the number of registrations allowed in time_allowed (in seconds)
+allowed_regs: 1
+time_allowed: 10
+
+// Account flatfile database, stores account information.
+account_filename: save/account.txt
+
+// What account AIDs have GM privs, and what level?
+gm_account_filename: conf/GM_account.txt
+
+// Timer to check if GM_account file has been changed and reload GM account automaticaly
+// (in seconds; default: 15; value: 0 (disabled), or 2 or more)
+gm_account_filename_check_timer: 15
+
+// Log Filename. All operations received by the server are logged in this file.
+login_log_filename: log/login.log
+
+// To log the login server?
+// NOTE: The login-sql server needs the login logs to enable dynamic pass failure bans.
+log_login: 1
+
+// Name of the file of that logs the unknown packets (for debug or hack check)
+login_log_unknown_packets_filename: log/login_unknown_packets.log
+
+//When set to yes, the login server will refuse connections from accounts that are considered online already.
+//When a login attempt is rejected, the account in question is also kicked from all connected char-servers.
+//It's safe to turn this off if there's only one char-server connected, or if the char-servers don't share
+//the same backend (ie: Multiple char servers reading from the same SQL tables)
+online_check: yes
+
+// Indicate if the unknown packets are saved or not
+//(the unknown packets coming from the char-server or ladministration does not relate to, which is always saved)
+// Be careful: if you receive an attack, your hard disk can cause lag...
+// So, active this option with a speed hard disk or for debug only.
+save_unknown_packets: 0
+
+// Indicate if you want display the parse of the packets received in a normal connection
+// It's useful for debug. Possible values: 0: no (default), 1: yes
+display_parse_login: 0
+
+// Indicate if you want display the parse of the packets received in administration connection
+// It's useful for debug. Possible values: 0: no (default), 1: yes
+display_parse_admin: 0
+
+// Indicate if you want display the parse of the packets received from a char-server
+// It's useful for debug. Possible values: 0: no (default), 1: yes (without packet 0x2714), 2: all packets
+display_parse_fromchar: 0
+
+// Indicate how to display date in logs, to players, etc.
+// 0: 31-12-2004 23:59:59
+// 1: 12-31-2004 23:59:59
+// 2: 2004-31-12 23:59:59
+// 3: 2004-12-31 23:59:59 (default)
+date_format: 3
+
+// Indicate the minimum GM level of player that the server accepts to connection.
+// 0: all players (normal player are 0. it's default), 1-99: GM level at least with level x
+min_level_to_connect: 0
+
+// Give possibility to adjust (ladmin command: timeadd) the time of an unlimited account.
+// If set to on/1/yes..., the adjustment is be done from actual time to set the final time of the account.
+// If set to no/0/no..., the adjustment can not be done on an unlimited account. You must set (ladmin command: timeset) a final time before to adjust (ladmin command: timeadd)
+add_to_unlimited_account: off
+
+// 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
+
+// It's to check IP of a player between login-server and char-server (part of anti-hacking system)
+// If player doesn't have same IP, connection is refused.
+// Set to 0/off/no to not check IP of player.
+// Set to 1/on/yes if you want to check (default)
+// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
+// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
+// if not correct, you can read list of char-servers, but not look slots of characters (rejected by server).
+check_ip_flag: yes
+
+// Specify order of IP control if necessary (option: 'deny,allow', 'allow,deny', or 'mutual-failture')
+// (how to use 'allow' and 'deny' information)
+//order: allow,deny
+
+// Indicate the IP that the server accept.
+// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
+// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
+// or 'clear' to suppress previous parameter (use it in import file mainly)
+// Add as many IP's as you wish.
+//allow: all
+
+// Indicate the IP that the server refuse.
+// Add as many IP's as you wish, as long as you put deny: before it.
+//deny: 123.123.123.123
+//deny: 234.234.234.234
+
+//Check The clientversion set in the clientinfo ?
+check_client_version: no
+
+//What version we would allow to connect? (if the options above is enabled..)
+client_version_to_connect: 20
+
+//Passwords in Login DB are MD5 - <passwordencrypt> cannot b used on client with this on
+use_MD5_passwords: no
+
+//Ban features: read readme for more info if you dont know this.
+ipban: 1
+dynamic_pass_failure_ban: 1
+dynamic_pass_failure_ban_time: 5
+dynamic_pass_failure_ban_how_many: 7
+dynamic_pass_failure_ban_how_long: 5
+dynamic_account_ban: 1
+dynamic_account_ban_class: 0
+
+//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
+
+//DNS Blacklist Blocking (on: 1, off: 0)
+use_dnsbl: 0
+
+//DNS Servers (seperated by a comma)
+dnsbl_servers: dnsbl.deltaanime.net
+
+import: conf/import/login_conf.txt
diff --git a/conf-tmpl/map_athena.conf b/conf-tmpl/map_athena.conf
index 4812e5d1c..59fcc1210 100644
--- a/conf-tmpl/map_athena.conf
+++ b/conf-tmpl/map_athena.conf
@@ -1,145 +1,145 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-//eAthena Map-Server Configuration File
-//--------------------------------------------------------------
-
-// Note: "Comments" are all text on the right side of a double slash "//"
-// Whatever text is commented will not be parsed by the servers, and serves
-// only as information/reference.
-
-//--------------------------------------------------------------
-// Configuration Info
-//--------------------------------------------------------------
-// Interserver communication passwords, set in account.txt (or equiv.)
-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
-
-// Character Server Port
-char_port: 6121
-
-// Map Server IP
-// The map server exports this IP address to the entire world.
-// NOTE: You should only need to set this if you are running behind a
-// firewall or are on a machine with multiple interfaces.
-//map_ip: 127.0.0.1
-
-// Map Server Port
-map_port: 5121
-
-//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]
-
-//Defines if the ansi sequences should be parsed or skipped.
-//If set to yes the console output is in color. If the stream is redirected to
-//a file, the ansi sequences are printed out.
-//If set to no the console is colorless and, if redirected, will skip the ansi
-//sequences.
-//NOTE: this setting applyes for both stdout and stderr
-stdout_with_ansisequence: yes
-
-//Makes server output more silent by ommitting 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.
-//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
-console_silent: 0
-
-//Preferred map loading method
-// 0: Read directly from grf
-// 1: Read from cache (with compression)
-// 2: Read from cache (without compression)
-// If the cache was not found it will read the maps from the GRF and copy
-// any necessary data into a newly created cache.
-// It is possible to reduce the map cache to 1MB for 400+ maps with compression
-// enabled. If all maps are already loaded in the cache, Athena can boot without
-// reading the grf files.
-read_map_from_cache: 1
-//
-//Where is the bitmap file stored?
-map_cache_file: db/mapinfo.txt
-
-//Where should all database data be read from?
-db_path: db
-
-// Advanced Fusion Maps directory
-afm_dir: afm
-
-// Enable the @guildspy and @partyspy at commands?
-// Note that enabling them decreases packet sending performance.
-enable_spy: no
-
-// Console Commands
-// Allow for console commands to be used on/off
-// This prevents usage of >& log.file
-console: off
-
-// 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):
-// 1: after every successful trade
-// 2: after every vending transaction
-// 4: after closing storage/guild storage.
-// 8: After hatching/returning to egg a pet.
-// 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: 15
-
-// Message of the day file, when a character logs on, this message is displayed.
-motd_txt: conf/motd.txt
-
-// When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
-help_txt: conf/help.txt
-help2_txt: conf/help2.txt
-charhelp_txt: conf/charhelp.txt
-
-mapreg_txt: save/mapreg.txt
-
-// Scripts
-import: npc/scripts_main.conf
-
-// Maps:
-import: conf/maps_athena.conf
-
-import: conf/import/map_conf.txt
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+//eAthena Map-Server Configuration File
+//--------------------------------------------------------------
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+//--------------------------------------------------------------
+// Configuration Info
+//--------------------------------------------------------------
+// Interserver communication passwords, set in account.txt (or equiv.)
+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
+
+// Character Server Port
+char_port: 6121
+
+// Map Server IP
+// The map server exports this IP address to the entire world.
+// NOTE: You should only need to set this if you are running behind a
+// firewall or are on a machine with multiple interfaces.
+//map_ip: 127.0.0.1
+
+// Map Server Port
+map_port: 5121
+
+//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]
+
+//Defines if the ansi sequences should be parsed or skipped.
+//If set to yes the console output is in color. If the stream is redirected to
+//a file, the ansi sequences are printed out.
+//If set to no the console is colorless and, if redirected, will skip the ansi
+//sequences.
+//NOTE: this setting applyes for both stdout and stderr
+stdout_with_ansisequence: yes
+
+//Makes server output more silent by ommitting 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.
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+//Preferred map loading method
+// 0: Read directly from grf
+// 1: Read from cache (with compression)
+// 2: Read from cache (without compression)
+// If the cache was not found it will read the maps from the GRF and copy
+// any necessary data into a newly created cache.
+// It is possible to reduce the map cache to 1MB for 400+ maps with compression
+// enabled. If all maps are already loaded in the cache, Athena can boot without
+// reading the grf files.
+read_map_from_cache: 1
+//
+//Where is the bitmap file stored?
+map_cache_file: db/mapinfo.txt
+
+//Where should all database data be read from?
+db_path: db
+
+// Advanced Fusion Maps directory
+afm_dir: afm
+
+// Enable the @guildspy and @partyspy at commands?
+// Note that enabling them decreases packet sending performance.
+enable_spy: no
+
+// Console Commands
+// Allow for console commands to be used on/off
+// This prevents usage of >& log.file
+console: off
+
+// 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):
+// 1: after every successful trade
+// 2: after every vending transaction
+// 4: after closing storage/guild storage.
+// 8: After hatching/returning to egg a pet.
+// 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: 15
+
+// Message of the day file, when a character logs on, this message is displayed.
+motd_txt: conf/motd.txt
+
+// When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
+help_txt: conf/help.txt
+help2_txt: conf/help2.txt
+charhelp_txt: conf/charhelp.txt
+
+mapreg_txt: save/mapreg.txt
+
+// Scripts
+import: npc/scripts_main.conf
+
+// Maps:
+import: conf/maps_athena.conf
+
+import: conf/import/map_conf.txt
diff --git a/conf-tmpl/mapflag/gvg.txt b/conf-tmpl/mapflag/gvg.txt
index db3d08f2f..f57459d1c 100644
--- a/conf-tmpl/mapflag/gvg.txt
+++ b/conf-tmpl/mapflag/gvg.txt
@@ -1,82 +1,82 @@
-//===== eAthena Script =======================================
-//= GvG On Map Flags
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Description: =========================================
-//= gvg: Turns on GvG mode (same as PvP except Guilds are
-//= automatically allied)
-//= gvg_castle: Describes castle maps for WoE.
-//===== Additional Comments: =================================
-//= 1.2 Updated with new meanings of gvg and gvg_castle
-//= 1.1 Added Novice Guild Castles
-//============================================================
-
-// GvG Arenas =============
-guild_vs1.gat mapflag gvg
-guild_vs2.gat mapflag gvg
-guild_vs3.gat mapflag gvg
-guild_vs4.gat mapflag gvg
-guild_vs5.gat mapflag gvg
-
-// Guild Castles ==========
-aldeg_cas01.gat mapflag gvg_castle
-aldeg_cas02.gat mapflag gvg_castle
-aldeg_cas03.gat mapflag gvg_castle
-aldeg_cas04.gat mapflag gvg_castle
-aldeg_cas05.gat mapflag gvg_castle
-gefg_cas01.gat mapflag gvg_castle
-gefg_cas02.gat mapflag gvg_castle
-gefg_cas03.gat mapflag gvg_castle
-gefg_cas04.gat mapflag gvg_castle
-gefg_cas05.gat mapflag gvg_castle
-payg_cas01.gat mapflag gvg_castle
-payg_cas02.gat mapflag gvg_castle
-payg_cas03.gat mapflag gvg_castle
-payg_cas04.gat mapflag gvg_castle
-payg_cas05.gat mapflag gvg_castle
-prtg_cas01.gat mapflag gvg_castle
-prtg_cas02.gat mapflag gvg_castle
-prtg_cas03.gat mapflag gvg_castle
-prtg_cas04.gat mapflag gvg_castle
-prtg_cas05.gat mapflag gvg_castle
-//Uncomment to disable monsters teleporting (prevents them from "escaping" when rude attacked)
-//aldeg_cas01.gat mapflag monster_noteleport
-//aldeg_cas02.gat mapflag monster_noteleport
-//aldeg_cas03.gat mapflag monster_noteleport
-//aldeg_cas04.gat mapflag monster_noteleport
-//aldeg_cas05.gat mapflag monster_noteleport
-//gefg_cas01.gat mapflag monster_noteleport
-//gefg_cas02.gat mapflag monster_noteleport
-//gefg_cas03.gat mapflag monster_noteleport
-//gefg_cas04.gat mapflag monster_noteleport
-//gefg_cas05.gat mapflag monster_noteleport
-//payg_cas01.gat mapflag monster_noteleport
-//payg_cas02.gat mapflag monster_noteleport
-//payg_cas03.gat mapflag monster_noteleport
-//payg_cas04.gat mapflag monster_noteleport
-//payg_cas05.gat mapflag monster_noteleport
-//prtg_cas01.gat mapflag monster_noteleport
-//prtg_cas02.gat mapflag monster_noteleport
-//prtg_cas03.gat mapflag monster_noteleport
-//prtg_cas04.gat mapflag monster_noteleport
-//prtg_cas05.gat mapflag monster_noteleport
-
-// Novice Guild Castles ===
-//n_castle.gat mapflag gvg_castle
-nguild_alde.gat mapflag gvg_castle
-nguild_gef.gat mapflag gvg_castle
-nguild_pay.gat mapflag gvg_castle
-nguild_prt.gat mapflag gvg_castle
-
-//nguild_alde.gat mapflag monster_noteleport
-//nguild_gef.gat mapflag monster_noteleport
-//nguild_pay.gat mapflag monster_noteleport
-//nguild_prt.gat mapflag monster_noteleport
-
-// Guild Dungeons =========
-gld_dun01.gat mapflag gvg_dungeon
-gld_dun02.gat mapflag gvg_dungeon
-gld_dun03.gat mapflag gvg_dungeon
-gld_dun04.gat mapflag gvg_dungeon
+//===== eAthena Script =======================================
+//= GvG On Map Flags
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Description: =========================================
+//= gvg: Turns on GvG mode (same as PvP except Guilds are
+//= automatically allied)
+//= gvg_castle: Describes castle maps for WoE.
+//===== Additional Comments: =================================
+//= 1.2 Updated with new meanings of gvg and gvg_castle
+//= 1.1 Added Novice Guild Castles
+//============================================================
+
+// GvG Arenas =============
+guild_vs1.gat mapflag gvg
+guild_vs2.gat mapflag gvg
+guild_vs3.gat mapflag gvg
+guild_vs4.gat mapflag gvg
+guild_vs5.gat mapflag gvg
+
+// Guild Castles ==========
+aldeg_cas01.gat mapflag gvg_castle
+aldeg_cas02.gat mapflag gvg_castle
+aldeg_cas03.gat mapflag gvg_castle
+aldeg_cas04.gat mapflag gvg_castle
+aldeg_cas05.gat mapflag gvg_castle
+gefg_cas01.gat mapflag gvg_castle
+gefg_cas02.gat mapflag gvg_castle
+gefg_cas03.gat mapflag gvg_castle
+gefg_cas04.gat mapflag gvg_castle
+gefg_cas05.gat mapflag gvg_castle
+payg_cas01.gat mapflag gvg_castle
+payg_cas02.gat mapflag gvg_castle
+payg_cas03.gat mapflag gvg_castle
+payg_cas04.gat mapflag gvg_castle
+payg_cas05.gat mapflag gvg_castle
+prtg_cas01.gat mapflag gvg_castle
+prtg_cas02.gat mapflag gvg_castle
+prtg_cas03.gat mapflag gvg_castle
+prtg_cas04.gat mapflag gvg_castle
+prtg_cas05.gat mapflag gvg_castle
+//Uncomment to disable monsters teleporting (prevents them from "escaping" when rude attacked)
+//aldeg_cas01.gat mapflag monster_noteleport
+//aldeg_cas02.gat mapflag monster_noteleport
+//aldeg_cas03.gat mapflag monster_noteleport
+//aldeg_cas04.gat mapflag monster_noteleport
+//aldeg_cas05.gat mapflag monster_noteleport
+//gefg_cas01.gat mapflag monster_noteleport
+//gefg_cas02.gat mapflag monster_noteleport
+//gefg_cas03.gat mapflag monster_noteleport
+//gefg_cas04.gat mapflag monster_noteleport
+//gefg_cas05.gat mapflag monster_noteleport
+//payg_cas01.gat mapflag monster_noteleport
+//payg_cas02.gat mapflag monster_noteleport
+//payg_cas03.gat mapflag monster_noteleport
+//payg_cas04.gat mapflag monster_noteleport
+//payg_cas05.gat mapflag monster_noteleport
+//prtg_cas01.gat mapflag monster_noteleport
+//prtg_cas02.gat mapflag monster_noteleport
+//prtg_cas03.gat mapflag monster_noteleport
+//prtg_cas04.gat mapflag monster_noteleport
+//prtg_cas05.gat mapflag monster_noteleport
+
+// Novice Guild Castles ===
+//n_castle.gat mapflag gvg_castle
+nguild_alde.gat mapflag gvg_castle
+nguild_gef.gat mapflag gvg_castle
+nguild_pay.gat mapflag gvg_castle
+nguild_prt.gat mapflag gvg_castle
+
+//nguild_alde.gat mapflag monster_noteleport
+//nguild_gef.gat mapflag monster_noteleport
+//nguild_pay.gat mapflag monster_noteleport
+//nguild_prt.gat mapflag monster_noteleport
+
+// Guild Dungeons =========
+gld_dun01.gat mapflag gvg_dungeon
+gld_dun02.gat mapflag gvg_dungeon
+gld_dun03.gat mapflag gvg_dungeon
+gld_dun04.gat mapflag gvg_dungeon
diff --git a/conf-tmpl/mapflag/indoors.txt b/conf-tmpl/mapflag/indoors.txt
index 473c2da6e..cdbc458fc 100644
--- a/conf-tmpl/mapflag/indoors.txt
+++ b/conf-tmpl/mapflag/indoors.txt
@@ -1,81 +1,81 @@
-//===== eAthena Script =======================================
-//= Map Flags for Indoors Buildings or Dungeons
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.3 [Lupus]
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 'indoors' turns off all night effects.
-//============================================================
-
-alberta_in.gat mapflag indoors
-ama_test.gat mapflag indoors
-izlude_in.gat mapflag indoors
-gef_tower.gat mapflag indoors
-geffen_in.gat mapflag indoors
-moc_castle.gat mapflag indoors
-morocc_in.gat mapflag indoors
-payon_in01.gat mapflag indoors
-payon_in02.gat mapflag indoors
-payon_in03.gat mapflag indoors
-prt_in.gat mapflag indoors
-prt_castle.gat mapflag indoors
-prt_church.gat mapflag indoors
-in_orcs01.gat mapflag indoors
-aldeba_in.gat mapflag indoors
-monk_in.gat mapflag indoors
-prt_are_in.gat mapflag indoors
-arena_room.gat mapflag indoors
-job_sword1.gat mapflag indoors
-xmas_in.gat mapflag indoors
-cmd_in01.gat mapflag indoors
-cmd_in02.gat mapflag indoors
-yuno_in01.gat mapflag indoors
-yuno_in02.gat mapflag indoors
-yuno_in03.gat mapflag indoors
-yuno_in04.gat mapflag indoors
-yuno_in05.gat mapflag indoors
-alde_alche.gat mapflag indoors
-sec_in01.gat mapflag indoors
-ama_in01.gat mapflag indoors
-ama_in02.gat mapflag indoors
-gon_in.gat mapflag indoors
-um_in.gat mapflag indoors
-nif_in.gat mapflag indoors
-lou_in01.gat mapflag indoors
-lou_in02.gat mapflag indoors
-jawaii_in.gat mapflag indoors
-que_god01.gat mapflag indoors
-que_god02.gat mapflag indoors
-ayo_in01.gat mapflag indoors
-ayo_in02.gat mapflag indoors
-que_sign01.gat mapflag indoors
-ein_in01.gat mapflag indoors
-airport.gat mapflag indoors
-airplane.gat mapflag indoors
-airplane_01.gat mapflag indoors
-hu_in01.gat mapflag indoors
-y_airport.gat mapflag indoors
-lhz_airport.gat mapflag indoors
-lhz_in01.gat mapflag indoors
-lhz_in02.gat mapflag indoors
-lhz_in03.gat mapflag indoors
-lhz_cube.gat mapflag indoors
-hu_in01.gat mapflag indoors
-auction_01.gat mapflag indoors
-auction_02.gat mapflag indoors
-ra_in01.gat mapflag indoors
-ra_temin.gat mapflag indoors
-que_rachel.gat mapflag indoors
-yuno_pre.gat mapflag indoors
-lhz_que01.gat mapflag indoors
-que_job01.gat mapflag indoors
-thana_step.gat mapflag indoors
-kh_mansion.gat mapflag indoors
-kh_rossi.gat mapflag indoors
-kh_school.gat mapflag indoors
-kh_vila.gat mapflag indoors
-que_bingo.gat mapflag indoors
-que_ng.gat mapflag indoors
+//===== eAthena Script =======================================
+//= Map Flags for Indoors Buildings or Dungeons
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.3 [Lupus]
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 'indoors' turns off all night effects.
+//============================================================
+
+alberta_in.gat mapflag indoors
+ama_test.gat mapflag indoors
+izlude_in.gat mapflag indoors
+gef_tower.gat mapflag indoors
+geffen_in.gat mapflag indoors
+moc_castle.gat mapflag indoors
+morocc_in.gat mapflag indoors
+payon_in01.gat mapflag indoors
+payon_in02.gat mapflag indoors
+payon_in03.gat mapflag indoors
+prt_in.gat mapflag indoors
+prt_castle.gat mapflag indoors
+prt_church.gat mapflag indoors
+in_orcs01.gat mapflag indoors
+aldeba_in.gat mapflag indoors
+monk_in.gat mapflag indoors
+prt_are_in.gat mapflag indoors
+arena_room.gat mapflag indoors
+job_sword1.gat mapflag indoors
+xmas_in.gat mapflag indoors
+cmd_in01.gat mapflag indoors
+cmd_in02.gat mapflag indoors
+yuno_in01.gat mapflag indoors
+yuno_in02.gat mapflag indoors
+yuno_in03.gat mapflag indoors
+yuno_in04.gat mapflag indoors
+yuno_in05.gat mapflag indoors
+alde_alche.gat mapflag indoors
+sec_in01.gat mapflag indoors
+ama_in01.gat mapflag indoors
+ama_in02.gat mapflag indoors
+gon_in.gat mapflag indoors
+um_in.gat mapflag indoors
+nif_in.gat mapflag indoors
+lou_in01.gat mapflag indoors
+lou_in02.gat mapflag indoors
+jawaii_in.gat mapflag indoors
+que_god01.gat mapflag indoors
+que_god02.gat mapflag indoors
+ayo_in01.gat mapflag indoors
+ayo_in02.gat mapflag indoors
+que_sign01.gat mapflag indoors
+ein_in01.gat mapflag indoors
+airport.gat mapflag indoors
+airplane.gat mapflag indoors
+airplane_01.gat mapflag indoors
+hu_in01.gat mapflag indoors
+y_airport.gat mapflag indoors
+lhz_airport.gat mapflag indoors
+lhz_in01.gat mapflag indoors
+lhz_in02.gat mapflag indoors
+lhz_in03.gat mapflag indoors
+lhz_cube.gat mapflag indoors
+hu_in01.gat mapflag indoors
+auction_01.gat mapflag indoors
+auction_02.gat mapflag indoors
+ra_in01.gat mapflag indoors
+ra_temin.gat mapflag indoors
+que_rachel.gat mapflag indoors
+yuno_pre.gat mapflag indoors
+lhz_que01.gat mapflag indoors
+que_job01.gat mapflag indoors
+thana_step.gat mapflag indoors
+kh_mansion.gat mapflag indoors
+kh_rossi.gat mapflag indoors
+kh_school.gat mapflag indoors
+kh_vila.gat mapflag indoors
+que_bingo.gat mapflag indoors
+que_ng.gat mapflag indoors
diff --git a/conf-tmpl/mapflag/jail.txt b/conf-tmpl/mapflag/jail.txt
index 3d4f28675..4cb9d85cb 100644
--- a/conf-tmpl/mapflag/jail.txt
+++ b/conf-tmpl/mapflag/jail.txt
@@ -1,48 +1,48 @@
-//===== eAthena Script =======================================
-//= Map Flags for Jails ( ATCommand @jail <player> )
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= pvp: Turns on PvP mode
-//= pvp_noparty: Can't attack player in same party
-//= nobranch: No Dead Branching allowed.
-//= nomemo: No Warp Portal Memory Point allowed.
-//= nopenalty: No Exp. penalty when player dies.
-//= nosave: No saving respawn point allowed. Use SavePoint to use the
-//= players previous savepoint, or choose one manually.
-//= noteleport: No Teleporting allowed. No f-wings or b-wings.
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-// No Memory =============================
-sec_pri.gat mapflag nomemo
-
-// No Save ===============================
-sec_pri.gat mapflag nosave SavePoint
-
-// No Teleport ===========================
-sec_pri.gat mapflag noteleport
-
-// No Warp ===============================
-sec_pri.gat mapflag nowarp
-
-// No Return, Stop people from being pulled out of jail (warpparty/guild)
-sec_pri.gat mapflag noreturn
-
-// Bloody Jail ===========================
-//Uncomment following maps to let your prisoners fight with other prisoners
-
-// PvP ===================================
-sec_pri.gat mapflag pvp
-
-// No Party ==============================
-sec_pri.gat mapflag pvp_noparty
-
-//Nightmare Equipment Drops PVP ==========
-sec_pri.gat mapflag pvp_nightmaredrop random,equip,300
+//===== eAthena Script =======================================
+//= Map Flags for Jails ( ATCommand @jail <player> )
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= pvp: Turns on PvP mode
+//= pvp_noparty: Can't attack player in same party
+//= nobranch: No Dead Branching allowed.
+//= nomemo: No Warp Portal Memory Point allowed.
+//= nopenalty: No Exp. penalty when player dies.
+//= nosave: No saving respawn point allowed. Use SavePoint to use the
+//= players previous savepoint, or choose one manually.
+//= noteleport: No Teleporting allowed. No f-wings or b-wings.
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+// No Memory =============================
+sec_pri.gat mapflag nomemo
+
+// No Save ===============================
+sec_pri.gat mapflag nosave SavePoint
+
+// No Teleport ===========================
+sec_pri.gat mapflag noteleport
+
+// No Warp ===============================
+sec_pri.gat mapflag nowarp
+
+// No Return, Stop people from being pulled out of jail (warpparty/guild)
+sec_pri.gat mapflag noreturn
+
+// Bloody Jail ===========================
+//Uncomment following maps to let your prisoners fight with other prisoners
+
+// PvP ===================================
+sec_pri.gat mapflag pvp
+
+// No Party ==============================
+sec_pri.gat mapflag pvp_noparty
+
+//Nightmare Equipment Drops PVP ==========
+sec_pri.gat mapflag pvp_nightmaredrop random,equip,300
diff --git a/conf-tmpl/mapflag/night.txt b/conf-tmpl/mapflag/night.txt
index 1b0e60086..fe588c6b3 100644
--- a/conf-tmpl/mapflag/night.txt
+++ b/conf-tmpl/mapflag/night.txt
@@ -1,230 +1,230 @@
-//===== eAthena Script =======================================
-//= Map Flags for maps where the night is visible.
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0 [Skotlex]
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 'nightenabled' specifies which maps can display "night".
-//============================================================
-
-alb2trea.gat mapflag nightenabled
-alberta.gat mapflag nightenabled
-aldebaran.gat mapflag nightenabled
-gef_fild00.gat mapflag nightenabled
-gef_fild01.gat mapflag nightenabled
-gef_fild02.gat mapflag nightenabled
-gef_fild03.gat mapflag nightenabled
-gef_fild04.gat mapflag nightenabled
-gef_fild05.gat mapflag nightenabled
-gef_fild06.gat mapflag nightenabled
-gef_fild07.gat mapflag nightenabled
-gef_fild08.gat mapflag nightenabled
-gef_fild09.gat mapflag nightenabled
-gef_fild10.gat mapflag nightenabled
-gef_fild11.gat mapflag nightenabled
-geffen.gat mapflag nightenabled
-glast_01.gat mapflag nightenabled
-izlu2dun.gat mapflag nightenabled
-izlude.gat mapflag nightenabled
-mjolnir_01.gat mapflag nightenabled
-mjolnir_02.gat mapflag nightenabled
-mjolnir_03.gat mapflag nightenabled
-mjolnir_04.gat mapflag nightenabled
-mjolnir_05.gat mapflag nightenabled
-mjolnir_06.gat mapflag nightenabled
-mjolnir_07.gat mapflag nightenabled
-mjolnir_08.gat mapflag nightenabled
-mjolnir_09.gat mapflag nightenabled
-mjolnir_10.gat mapflag nightenabled
-mjolnir_11.gat mapflag nightenabled
-mjolnir_12.gat mapflag nightenabled
-moc_fild01.gat mapflag nightenabled
-moc_fild02.gat mapflag nightenabled
-moc_fild03.gat mapflag nightenabled
-moc_fild04.gat mapflag nightenabled
-moc_fild05.gat mapflag nightenabled
-moc_fild06.gat mapflag nightenabled
-moc_fild07.gat mapflag nightenabled
-moc_fild08.gat mapflag nightenabled
-moc_fild09.gat mapflag nightenabled
-moc_fild10.gat mapflag nightenabled
-moc_fild11.gat mapflag nightenabled
-moc_fild12.gat mapflag nightenabled
-moc_fild13.gat mapflag nightenabled
-moc_fild14.gat mapflag nightenabled
-moc_fild15.gat mapflag nightenabled
-moc_fild16.gat mapflag nightenabled
-moc_fild17.gat mapflag nightenabled
-moc_fild18.gat mapflag nightenabled
-moc_fild19.gat mapflag nightenabled
-moc_ruins.gat mapflag nightenabled
-morocc.gat mapflag nightenabled
-pay_arche.gat mapflag nightenabled
-pay_fild01.gat mapflag nightenabled
-pay_fild02.gat mapflag nightenabled
-pay_fild03.gat mapflag nightenabled
-pay_fild04.gat mapflag nightenabled
-pay_fild05.gat mapflag nightenabled
-pay_fild06.gat mapflag nightenabled
-pay_fild07.gat mapflag nightenabled
-pay_fild08.gat mapflag nightenabled
-pay_fild09.gat mapflag nightenabled
-pay_fild10.gat mapflag nightenabled
-pay_fild11.gat mapflag nightenabled
-prontera.gat mapflag nightenabled
-prt_fild00.gat mapflag nightenabled
-prt_fild01.gat mapflag nightenabled
-prt_fild02.gat mapflag nightenabled
-prt_fild03.gat mapflag nightenabled
-prt_fild04.gat mapflag nightenabled
-prt_fild05.gat mapflag nightenabled
-prt_fild06.gat mapflag nightenabled
-prt_fild07.gat mapflag nightenabled
-prt_fild08.gat mapflag nightenabled
-prt_fild09.gat mapflag nightenabled
-prt_fild10.gat mapflag nightenabled
-prt_fild11.gat mapflag nightenabled
-prt_monk.gat mapflag nightenabled
-pvp_y_1-1.gat mapflag nightenabled
-pvp_y_1-2.gat mapflag nightenabled
-pvp_y_1-3.gat mapflag nightenabled
-pvp_y_1-4.gat mapflag nightenabled
-pvp_y_1-5.gat mapflag nightenabled
-pvp_y_2-1.gat mapflag nightenabled
-pvp_y_2-2.gat mapflag nightenabled
-pvp_y_2-3.gat mapflag nightenabled
-pvp_y_2-4.gat mapflag nightenabled
-pvp_y_2-5.gat mapflag nightenabled
-pvp_y_3-1.gat mapflag nightenabled
-pvp_y_3-2.gat mapflag nightenabled
-pvp_y_3-3.gat mapflag nightenabled
-pvp_y_3-4.gat mapflag nightenabled
-pvp_y_3-5.gat mapflag nightenabled
-pvp_y_4-1.gat mapflag nightenabled
-pvp_y_4-2.gat mapflag nightenabled
-pvp_y_4-3.gat mapflag nightenabled
-pvp_y_4-4.gat mapflag nightenabled
-pvp_y_4-5.gat mapflag nightenabled
-pvp_y_5-1.gat mapflag nightenabled
-pvp_y_5-2.gat mapflag nightenabled
-pvp_y_5-3.gat mapflag nightenabled
-pvp_y_5-4.gat mapflag nightenabled
-pvp_y_5-5.gat mapflag nightenabled
-pvp_y_6-1.gat mapflag nightenabled
-pvp_y_6-2.gat mapflag nightenabled
-pvp_y_6-3.gat mapflag nightenabled
-pvp_y_6-4.gat mapflag nightenabled
-pvp_y_6-5.gat mapflag nightenabled
-pvp_y_7-1.gat mapflag nightenabled
-pvp_y_7-2.gat mapflag nightenabled
-pvp_y_7-3.gat mapflag nightenabled
-pvp_y_7-4.gat mapflag nightenabled
-pvp_y_7-5.gat mapflag nightenabled
-pvp_y_8-1.gat mapflag nightenabled
-pvp_y_8-2.gat mapflag nightenabled
-pvp_y_8-3.gat mapflag nightenabled
-pvp_y_8-4.gat mapflag nightenabled
-pvp_y_8-5.gat mapflag nightenabled
-xmas.gat mapflag nightenabled
-xmas_fild01.gat mapflag nightenabled
-cmd_fild01.gat mapflag nightenabled
-cmd_fild02.gat mapflag nightenabled
-cmd_fild03.gat mapflag nightenabled
-cmd_fild04.gat mapflag nightenabled
-cmd_fild05.gat mapflag nightenabled
-cmd_fild06.gat mapflag nightenabled
-cmd_fild07.gat mapflag nightenabled
-cmd_fild08.gat mapflag nightenabled
-cmd_fild09.gat mapflag nightenabled
-gef_fild12.gat mapflag nightenabled
-gef_fild13.gat mapflag nightenabled
-gef_fild14.gat mapflag nightenabled
-tur_dun01.gat mapflag nightenabled
-alde_gld.gat mapflag nightenabled
-pay_gld.gat mapflag nightenabled
-prt_gld.gat mapflag nightenabled
-yuno.gat mapflag nightenabled
-yuno_fild01.gat mapflag nightenabled
-yuno_fild02.gat mapflag nightenabled
-yuno_fild03.gat mapflag nightenabled
-yuno_fild04.gat mapflag nightenabled
-ama_fild01.gat mapflag nightenabled
-amatsu.gat mapflag nightenabled
-gon_fild01.gat mapflag nightenabled
-gonryun.gat mapflag nightenabled
-umbala.gat mapflag nightenabled
-um_fild01.gat mapflag nightenabled
-um_fild02.gat mapflag nightenabled
-um_fild03.gat mapflag nightenabled
-um_fild04.gat mapflag nightenabled
-lou_fild01.gat mapflag nightenabled
-louyang.gat mapflag nightenabled
-jawaii.gat mapflag nightenabled
-gefenia01.gat mapflag nightenabled
-gefenia02.gat mapflag nightenabled
-gefenia03.gat mapflag nightenabled
-gefenia04.gat mapflag nightenabled
-payon.gat mapflag nightenabled
-ayothaya.gat mapflag nightenabled
-ayo_fild01.gat mapflag nightenabled
-ayo_fild02.gat mapflag nightenabled
-yuno_fild05.gat mapflag nightenabled
-yuno_fild07.gat mapflag nightenabled
-yuno_fild08.gat mapflag nightenabled
-yuno_fild09.gat mapflag nightenabled
-yuno_fild11.gat mapflag nightenabled
-yuno_fild12.gat mapflag nightenabled
-einbech.gat mapflag nightenabled
-einbroch.gat mapflag nightenabled
-ein_fild06.gat mapflag nightenabled
-ein_fild07.gat mapflag nightenabled
-ein_fild08.gat mapflag nightenabled
-ein_fild09.gat mapflag nightenabled
-ein_fild10.gat mapflag nightenabled
-ein_fild03.gat mapflag nightenabled
-ein_fild04.gat mapflag nightenabled
-lhz_fild02.gat mapflag nightenabled
-lhz_fild03.gat mapflag nightenabled
-lhz_fild01.gat mapflag nightenabled
-lighthalzen.gat mapflag nightenabled
-lhz_in01.gat mapflag nightenabled
-lhz_in02.gat mapflag nightenabled
-lhz_in03.gat mapflag nightenabled
-hu_fild07.gat mapflag nightenabled
-hu_fild05.gat mapflag nightenabled
-hu_fild04.gat mapflag nightenabled
-hu_fild01.gat mapflag nightenabled
-yuno_fild06.gat mapflag nightenabled
-tha_scene01.gat mapflag nightenabled
-hugel.gat mapflag nightenabled
-p_track01.gat mapflag nightenabled
-p_track01.gat mapflag nightenabled
-odin_tem01.gat mapflag nightenabled
-odin_tem02.gat mapflag nightenabled
-odin_tem03.gat mapflag nightenabled
-hu_fild02.gat mapflag nightenabled
-hu_fild03.gat mapflag nightenabled
-hu_fild06.gat mapflag nightenabled
-ein_fild01.gat mapflag nightenabled
-ein_fild02.gat mapflag nightenabled
-ein_fild05.gat mapflag nightenabled
-yuno_fild10.gat mapflag nightenabled
-rachel.gat mapflag nightenabled
-ra_fild01.gat mapflag nightenabled
-ra_fild02.gat mapflag nightenabled
-ra_fild03.gat mapflag nightenabled
-ra_fild04.gat mapflag nightenabled
-ra_fild05.gat mapflag nightenabled
-ra_fild06.gat mapflag nightenabled
-ra_fild07.gat mapflag nightenabled
-ra_fild08.gat mapflag nightenabled
-ra_fild09.gat mapflag nightenabled
-ra_fild10.gat mapflag nightenabled
-ra_fild11.gat mapflag nightenabled
-ra_fild12.gat mapflag nightenabled
-ra_fild13.gat mapflag nightenabled
-ra_temple.gat mapflag nightenabled
-ra_temsky.gat mapflag nightenabled
+//===== eAthena Script =======================================
+//= Map Flags for maps where the night is visible.
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0 [Skotlex]
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 'nightenabled' specifies which maps can display "night".
+//============================================================
+
+alb2trea.gat mapflag nightenabled
+alberta.gat mapflag nightenabled
+aldebaran.gat mapflag nightenabled
+gef_fild00.gat mapflag nightenabled
+gef_fild01.gat mapflag nightenabled
+gef_fild02.gat mapflag nightenabled
+gef_fild03.gat mapflag nightenabled
+gef_fild04.gat mapflag nightenabled
+gef_fild05.gat mapflag nightenabled
+gef_fild06.gat mapflag nightenabled
+gef_fild07.gat mapflag nightenabled
+gef_fild08.gat mapflag nightenabled
+gef_fild09.gat mapflag nightenabled
+gef_fild10.gat mapflag nightenabled
+gef_fild11.gat mapflag nightenabled
+geffen.gat mapflag nightenabled
+glast_01.gat mapflag nightenabled
+izlu2dun.gat mapflag nightenabled
+izlude.gat mapflag nightenabled
+mjolnir_01.gat mapflag nightenabled
+mjolnir_02.gat mapflag nightenabled
+mjolnir_03.gat mapflag nightenabled
+mjolnir_04.gat mapflag nightenabled
+mjolnir_05.gat mapflag nightenabled
+mjolnir_06.gat mapflag nightenabled
+mjolnir_07.gat mapflag nightenabled
+mjolnir_08.gat mapflag nightenabled
+mjolnir_09.gat mapflag nightenabled
+mjolnir_10.gat mapflag nightenabled
+mjolnir_11.gat mapflag nightenabled
+mjolnir_12.gat mapflag nightenabled
+moc_fild01.gat mapflag nightenabled
+moc_fild02.gat mapflag nightenabled
+moc_fild03.gat mapflag nightenabled
+moc_fild04.gat mapflag nightenabled
+moc_fild05.gat mapflag nightenabled
+moc_fild06.gat mapflag nightenabled
+moc_fild07.gat mapflag nightenabled
+moc_fild08.gat mapflag nightenabled
+moc_fild09.gat mapflag nightenabled
+moc_fild10.gat mapflag nightenabled
+moc_fild11.gat mapflag nightenabled
+moc_fild12.gat mapflag nightenabled
+moc_fild13.gat mapflag nightenabled
+moc_fild14.gat mapflag nightenabled
+moc_fild15.gat mapflag nightenabled
+moc_fild16.gat mapflag nightenabled
+moc_fild17.gat mapflag nightenabled
+moc_fild18.gat mapflag nightenabled
+moc_fild19.gat mapflag nightenabled
+moc_ruins.gat mapflag nightenabled
+morocc.gat mapflag nightenabled
+pay_arche.gat mapflag nightenabled
+pay_fild01.gat mapflag nightenabled
+pay_fild02.gat mapflag nightenabled
+pay_fild03.gat mapflag nightenabled
+pay_fild04.gat mapflag nightenabled
+pay_fild05.gat mapflag nightenabled
+pay_fild06.gat mapflag nightenabled
+pay_fild07.gat mapflag nightenabled
+pay_fild08.gat mapflag nightenabled
+pay_fild09.gat mapflag nightenabled
+pay_fild10.gat mapflag nightenabled
+pay_fild11.gat mapflag nightenabled
+prontera.gat mapflag nightenabled
+prt_fild00.gat mapflag nightenabled
+prt_fild01.gat mapflag nightenabled
+prt_fild02.gat mapflag nightenabled
+prt_fild03.gat mapflag nightenabled
+prt_fild04.gat mapflag nightenabled
+prt_fild05.gat mapflag nightenabled
+prt_fild06.gat mapflag nightenabled
+prt_fild07.gat mapflag nightenabled
+prt_fild08.gat mapflag nightenabled
+prt_fild09.gat mapflag nightenabled
+prt_fild10.gat mapflag nightenabled
+prt_fild11.gat mapflag nightenabled
+prt_monk.gat mapflag nightenabled
+pvp_y_1-1.gat mapflag nightenabled
+pvp_y_1-2.gat mapflag nightenabled
+pvp_y_1-3.gat mapflag nightenabled
+pvp_y_1-4.gat mapflag nightenabled
+pvp_y_1-5.gat mapflag nightenabled
+pvp_y_2-1.gat mapflag nightenabled
+pvp_y_2-2.gat mapflag nightenabled
+pvp_y_2-3.gat mapflag nightenabled
+pvp_y_2-4.gat mapflag nightenabled
+pvp_y_2-5.gat mapflag nightenabled
+pvp_y_3-1.gat mapflag nightenabled
+pvp_y_3-2.gat mapflag nightenabled
+pvp_y_3-3.gat mapflag nightenabled
+pvp_y_3-4.gat mapflag nightenabled
+pvp_y_3-5.gat mapflag nightenabled
+pvp_y_4-1.gat mapflag nightenabled
+pvp_y_4-2.gat mapflag nightenabled
+pvp_y_4-3.gat mapflag nightenabled
+pvp_y_4-4.gat mapflag nightenabled
+pvp_y_4-5.gat mapflag nightenabled
+pvp_y_5-1.gat mapflag nightenabled
+pvp_y_5-2.gat mapflag nightenabled
+pvp_y_5-3.gat mapflag nightenabled
+pvp_y_5-4.gat mapflag nightenabled
+pvp_y_5-5.gat mapflag nightenabled
+pvp_y_6-1.gat mapflag nightenabled
+pvp_y_6-2.gat mapflag nightenabled
+pvp_y_6-3.gat mapflag nightenabled
+pvp_y_6-4.gat mapflag nightenabled
+pvp_y_6-5.gat mapflag nightenabled
+pvp_y_7-1.gat mapflag nightenabled
+pvp_y_7-2.gat mapflag nightenabled
+pvp_y_7-3.gat mapflag nightenabled
+pvp_y_7-4.gat mapflag nightenabled
+pvp_y_7-5.gat mapflag nightenabled
+pvp_y_8-1.gat mapflag nightenabled
+pvp_y_8-2.gat mapflag nightenabled
+pvp_y_8-3.gat mapflag nightenabled
+pvp_y_8-4.gat mapflag nightenabled
+pvp_y_8-5.gat mapflag nightenabled
+xmas.gat mapflag nightenabled
+xmas_fild01.gat mapflag nightenabled
+cmd_fild01.gat mapflag nightenabled
+cmd_fild02.gat mapflag nightenabled
+cmd_fild03.gat mapflag nightenabled
+cmd_fild04.gat mapflag nightenabled
+cmd_fild05.gat mapflag nightenabled
+cmd_fild06.gat mapflag nightenabled
+cmd_fild07.gat mapflag nightenabled
+cmd_fild08.gat mapflag nightenabled
+cmd_fild09.gat mapflag nightenabled
+gef_fild12.gat mapflag nightenabled
+gef_fild13.gat mapflag nightenabled
+gef_fild14.gat mapflag nightenabled
+tur_dun01.gat mapflag nightenabled
+alde_gld.gat mapflag nightenabled
+pay_gld.gat mapflag nightenabled
+prt_gld.gat mapflag nightenabled
+yuno.gat mapflag nightenabled
+yuno_fild01.gat mapflag nightenabled
+yuno_fild02.gat mapflag nightenabled
+yuno_fild03.gat mapflag nightenabled
+yuno_fild04.gat mapflag nightenabled
+ama_fild01.gat mapflag nightenabled
+amatsu.gat mapflag nightenabled
+gon_fild01.gat mapflag nightenabled
+gonryun.gat mapflag nightenabled
+umbala.gat mapflag nightenabled
+um_fild01.gat mapflag nightenabled
+um_fild02.gat mapflag nightenabled
+um_fild03.gat mapflag nightenabled
+um_fild04.gat mapflag nightenabled
+lou_fild01.gat mapflag nightenabled
+louyang.gat mapflag nightenabled
+jawaii.gat mapflag nightenabled
+gefenia01.gat mapflag nightenabled
+gefenia02.gat mapflag nightenabled
+gefenia03.gat mapflag nightenabled
+gefenia04.gat mapflag nightenabled
+payon.gat mapflag nightenabled
+ayothaya.gat mapflag nightenabled
+ayo_fild01.gat mapflag nightenabled
+ayo_fild02.gat mapflag nightenabled
+yuno_fild05.gat mapflag nightenabled
+yuno_fild07.gat mapflag nightenabled
+yuno_fild08.gat mapflag nightenabled
+yuno_fild09.gat mapflag nightenabled
+yuno_fild11.gat mapflag nightenabled
+yuno_fild12.gat mapflag nightenabled
+einbech.gat mapflag nightenabled
+einbroch.gat mapflag nightenabled
+ein_fild06.gat mapflag nightenabled
+ein_fild07.gat mapflag nightenabled
+ein_fild08.gat mapflag nightenabled
+ein_fild09.gat mapflag nightenabled
+ein_fild10.gat mapflag nightenabled
+ein_fild03.gat mapflag nightenabled
+ein_fild04.gat mapflag nightenabled
+lhz_fild02.gat mapflag nightenabled
+lhz_fild03.gat mapflag nightenabled
+lhz_fild01.gat mapflag nightenabled
+lighthalzen.gat mapflag nightenabled
+lhz_in01.gat mapflag nightenabled
+lhz_in02.gat mapflag nightenabled
+lhz_in03.gat mapflag nightenabled
+hu_fild07.gat mapflag nightenabled
+hu_fild05.gat mapflag nightenabled
+hu_fild04.gat mapflag nightenabled
+hu_fild01.gat mapflag nightenabled
+yuno_fild06.gat mapflag nightenabled
+tha_scene01.gat mapflag nightenabled
+hugel.gat mapflag nightenabled
+p_track01.gat mapflag nightenabled
+p_track01.gat mapflag nightenabled
+odin_tem01.gat mapflag nightenabled
+odin_tem02.gat mapflag nightenabled
+odin_tem03.gat mapflag nightenabled
+hu_fild02.gat mapflag nightenabled
+hu_fild03.gat mapflag nightenabled
+hu_fild06.gat mapflag nightenabled
+ein_fild01.gat mapflag nightenabled
+ein_fild02.gat mapflag nightenabled
+ein_fild05.gat mapflag nightenabled
+yuno_fild10.gat mapflag nightenabled
+rachel.gat mapflag nightenabled
+ra_fild01.gat mapflag nightenabled
+ra_fild02.gat mapflag nightenabled
+ra_fild03.gat mapflag nightenabled
+ra_fild04.gat mapflag nightenabled
+ra_fild05.gat mapflag nightenabled
+ra_fild06.gat mapflag nightenabled
+ra_fild07.gat mapflag nightenabled
+ra_fild08.gat mapflag nightenabled
+ra_fild09.gat mapflag nightenabled
+ra_fild10.gat mapflag nightenabled
+ra_fild11.gat mapflag nightenabled
+ra_fild12.gat mapflag nightenabled
+ra_fild13.gat mapflag nightenabled
+ra_temple.gat mapflag nightenabled
+ra_temsky.gat mapflag nightenabled
diff --git a/conf-tmpl/mapflag/nightmare.txt b/conf-tmpl/mapflag/nightmare.txt
index d0c34d188..b185569b6 100644
--- a/conf-tmpl/mapflag/nightmare.txt
+++ b/conf-tmpl/mapflag/nightmare.txt
@@ -1,48 +1,48 @@
-//===== eAthena Script =======================================
-//= Map flags that allow players to drop items/equips on death
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-
-//Nightmare Equipment Drops PVP
-pvp_n_1-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_2-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_3-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_4-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_5-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_6-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_7-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_8-1.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_1-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_2-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_3-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_4-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_5-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_6-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_7-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_8-2.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_1-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_2-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_3-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_4-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_5-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_6-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_7-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_8-3.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_1-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_2-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_3-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_4-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_5-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_6-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_7-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_8-4.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_1-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_2-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_3-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_4-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_5-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_6-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_7-5.gat mapflag pvp_nightmaredrop random,equip,300
-pvp_n_8-5.gat mapflag pvp_nightmaredrop random,equip,300
+//===== eAthena Script =======================================
+//= Map flags that allow players to drop items/equips on death
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+
+
+//Nightmare Equipment Drops PVP
+pvp_n_1-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_2-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_3-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_4-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_5-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_6-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_7-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_8-1.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_1-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_2-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_3-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_4-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_5-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_6-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_7-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_8-2.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_1-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_2-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_3-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_4-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_5-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_6-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_7-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_8-3.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_1-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_2-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_3-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_4-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_5-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_6-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_7-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_8-4.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_1-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_2-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_3-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_4-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_5-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_6-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_7-5.gat mapflag pvp_nightmaredrop random,equip,300
+pvp_n_8-5.gat mapflag pvp_nightmaredrop random,equip,300
diff --git a/conf-tmpl/mapflag/nobranch.txt b/conf-tmpl/mapflag/nobranch.txt
index 81a04d2ae..53cedab5e 100644
--- a/conf-tmpl/mapflag/nobranch.txt
+++ b/conf-tmpl/mapflag/nobranch.txt
@@ -1,288 +1,288 @@
-//===== eAthena Script =======================================
-//= Map flags that disable dead branching
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.2 [Lupus]
-//= 1.3 [massdriller]
-//= 1.6 [Lupus]
-//===== Current Version: =====================================
-
-// Cities ================>\\
-ayo_in01.gat mapflag nobranch
-ayo_in02.gat mapflag nobranch
-alb_ship.gat mapflag nobranch
-alberta_in.gat mapflag nobranch
-aldeba_in.gat mapflag nobranch
-ama_in01.gat mapflag nobranch
-ama_in02.gat mapflag nobranch
-ama_test.gat mapflag nobranch
-cmd_in01.gat mapflag nobranch
-cmd_in02.gat mapflag nobranch
-gef_tower.gat mapflag nobranch
-geffen_in.gat mapflag nobranch
-gon_in.gat mapflag nobranch
-gon_test.gat mapflag nobranch
-in_orcs01.gat mapflag nobranch
-izlude_in.gat mapflag nobranch
-jawaii_in.gat mapflag nobranch
-lou_in01.gat mapflag nobranch
-lou_in02.gat mapflag nobranch
-moc_castle.gat mapflag nobranch
-morocc_in.gat mapflag nobranch
-new_zone01.gat mapflag nobranch
-new_zone02.gat mapflag nobranch
-new_zone03.gat mapflag nobranch
-new_zone04.gat mapflag nobranch
-nif_in.gat mapflag nobranch
-payon_in01.gat mapflag nobranch
-payon_in02.gat mapflag nobranch
-payon_in03.gat mapflag nobranch
-prt_castle.gat mapflag nobranch
-prt_church.gat mapflag nobranch
-prt_in.gat mapflag nobranch
-um_in.gat mapflag nobranch
-xmas_in.gat mapflag nobranch
-yuno_in01.gat mapflag nobranch
-yuno_in02.gat mapflag nobranch
-yuno_in03.gat mapflag nobranch
-yuno_in04.gat mapflag nobranch
-yuno_in05.gat mapflag nobranch
-que_sign01.gat mapflag nobranch
-ein_in01.gat mapflag nobranch
-airport.gat mapflag nobranch
-airplane.gat mapflag nobranch
-airplane_01.gat mapflag nobranch
-ra_in01.gat mapflag nobranch
-// New areas
-yuno_pre.gat mapflag nobranch
-y_airport.gat mapflag nobranch
-lhz_airport.gat mapflag nobranch
-lhz_in01.gat mapflag nobranch
-lhz_in02.gat mapflag nobranch
-lhz_in03.gat mapflag nobranch
-lhz_que01.gat mapflag nobranch
-lhz_cube.gat mapflag nobranch
-hu_in01.gat mapflag nobranch
-auction_01.gat mapflag nobranch
-auction_02.gat mapflag nobranch
-p_track01.gat mapflag nobranch
-p_track02.gat mapflag nobranch
-ra_temple.gat mapflag nobranch
-ra_temsky.gat mapflag nobranch
-que_rachel.gat mapflag nobranch
-
-// Job Quests ====================
-job_sword1.gat mapflag nobranch
-job_thief1.gat mapflag nobranch
-// 2-1
-job_knt.gat mapflag nobranch
-job_prist.gat mapflag nobranch
-job_wiz.gat mapflag nobranch
-job_hunte.gat mapflag nobranch
-in_hunter.gat mapflag nobranch
-in_moc_16.gat mapflag nobranch
-// 2-2
-alde_alche.gat mapflag nobranch
-job_cru.gat mapflag nobranch
-job_duncer.gat mapflag nobranch
-job_monk.gat mapflag nobranch
-monk_test.gat mapflag nobranch
-monk_in.gat mapflag nobranch
-in_rogue.gat mapflag nobranch
-job_sage.gat mapflag nobranch
-que_ng.gat mapflag nobranch
-job_soul.gat mapflag nobranch
-job_star.gat mapflag nobranch
-
-// Special Quests Places =========
-que_god01.gat mapflag nobranch
-que_god02.gat mapflag nobranch
-que_bingo.gat mapflag nobranch
-que_hugel.gat mapflag nobranch
-poring_c01.gat mapflag nobranch
-poring_c02.gat mapflag nobranch
-kh_mansion.gat mapflag nobranch
-kh_rossi.gat mapflag nobranch
-kh_school.gat mapflag nobranch
-kh_vila.gat mapflag nobranch
-
-// Guild Castles ==================
-//alde_gld.gat mapflag nobranch
-aldeg_cas01.gat mapflag nobranch
-aldeg_cas02.gat mapflag nobranch
-aldeg_cas03.gat mapflag nobranch
-aldeg_cas04.gat mapflag nobranch
-aldeg_cas05.gat mapflag nobranch
-gefg_cas01.gat mapflag nobranch
-gefg_cas02.gat mapflag nobranch
-gefg_cas03.gat mapflag nobranch
-gefg_cas04.gat mapflag nobranch
-gefg_cas05.gat mapflag nobranch
-//pay_gld.gat mapflag nobranch
-payg_cas01.gat mapflag nobranch
-payg_cas02.gat mapflag nobranch
-payg_cas03.gat mapflag nobranch
-payg_cas04.gat mapflag nobranch
-payg_cas05.gat mapflag nobranch
-//prt_gld.gat mapflag nobranch
-prtg_cas01.gat mapflag nobranch
-prtg_cas02.gat mapflag nobranch
-prtg_cas03.gat mapflag nobranch
-prtg_cas04.gat mapflag nobranch
-prtg_cas05.gat mapflag nobranch
-//n_castle.gat mapflag nobranch
-nguild_alde.gat mapflag nobranch
-nguild_gef.gat mapflag nobranch
-nguild_pay.gat mapflag nobranch
-nguild_prt.gat mapflag nobranch
-
-// GvG Arenas =====================
-guild_vs1.gat mapflag nobranch
-guild_vs2.gat mapflag nobranch
-guild_vs3.gat mapflag nobranch
-guild_vs4.gat mapflag nobranch
-guild_vs5.gat mapflag nobranch
-
-// Arenas ================>\\
-arena_room.gat mapflag nobranch
-force_1-1.gat mapflag nobranch
-force_1-2.gat mapflag nobranch
-force_1-3.gat mapflag nobranch
-ordeal_1-1.gat mapflag nobranch
-ordeal_1-2.gat mapflag nobranch
-ordeal_1-3.gat mapflag nobranch
-ordeal_2-1.gat mapflag nobranch
-ordeal_2-2.gat mapflag nobranch
-ordeal_2-3.gat mapflag nobranch
-ordeal_3-1.gat mapflag nobranch
-ordeal_3-2.gat mapflag nobranch
-ordeal_3-3.gat mapflag nobranch
-pvp_2vs2.gat mapflag nobranch
-pvp_c_room.gat mapflag nobranch
-quiz_00.gat mapflag nobranch
-quiz_01.gat mapflag nobranch
-sec_in01.gat mapflag nobranch
-//hunter_1-1.gat mapflag nobranch
-//hunter_2-1.gat mapflag nobranch
-//hunter_3-1.gat mapflag nobranch
-//knight_1-1.gat mapflag nobranch
-//knight_2-1.gat mapflag nobranch
-//knight_3-1.gat mapflag nobranch
-//priest_1-1.gat mapflag nobranch
-//priest_2-1.gat mapflag nobranch
-//priest_3-1.gat mapflag nobranch
-prt_are_in.gat mapflag nobranch
-prt_are01.gat mapflag nobranch
-//wizard_1-1.gat mapflag nobranch
-//wizard_2-1.gat mapflag nobranch
-//wizard_3-1.gat mapflag nobranch
-
-// PvP Arenas =========================
-pvp_y_room.gat mapflag nobranch
-pvp_y_1-1.gat mapflag nobranch
-pvp_y_1-2.gat mapflag nobranch
-pvp_y_1-3.gat mapflag nobranch
-pvp_y_1-4.gat mapflag nobranch
-pvp_y_1-5.gat mapflag nobranch
-pvp_y_2-1.gat mapflag nobranch
-pvp_y_2-2.gat mapflag nobranch
-pvp_y_2-3.gat mapflag nobranch
-pvp_y_2-4.gat mapflag nobranch
-pvp_y_2-5.gat mapflag nobranch
-pvp_y_3-1.gat mapflag nobranch
-pvp_y_3-2.gat mapflag nobranch
-pvp_y_3-3.gat mapflag nobranch
-pvp_y_3-4.gat mapflag nobranch
-pvp_y_3-5.gat mapflag nobranch
-pvp_y_4-1.gat mapflag nobranch
-pvp_y_4-2.gat mapflag nobranch
-pvp_y_4-3.gat mapflag nobranch
-pvp_y_4-4.gat mapflag nobranch
-pvp_y_4-5.gat mapflag nobranch
-pvp_y_5-1.gat mapflag nobranch
-pvp_y_5-2.gat mapflag nobranch
-pvp_y_5-3.gat mapflag nobranch
-pvp_y_5-4.gat mapflag nobranch
-pvp_y_5-5.gat mapflag nobranch
-pvp_y_6-1.gat mapflag nobranch
-pvp_y_6-2.gat mapflag nobranch
-pvp_y_6-3.gat mapflag nobranch
-pvp_y_6-4.gat mapflag nobranch
-pvp_y_6-5.gat mapflag nobranch
-pvp_y_7-1.gat mapflag nobranch
-pvp_y_7-2.gat mapflag nobranch
-pvp_y_7-3.gat mapflag nobranch
-pvp_y_7-4.gat mapflag nobranch
-pvp_y_7-5.gat mapflag nobranch
-pvp_y_8-1.gat mapflag nobranch
-pvp_y_8-2.gat mapflag nobranch
-pvp_y_8-3.gat mapflag nobranch
-pvp_y_8-4.gat mapflag nobranch
-pvp_y_8-5.gat mapflag nobranch
-pvp_n_room.gat mapflag nobranch
-pvp_n_1-1.gat mapflag nobranch
-pvp_n_1-2.gat mapflag nobranch
-pvp_n_1-3.gat mapflag nobranch
-pvp_n_1-4.gat mapflag nobranch
-pvp_n_1-5.gat mapflag nobranch
-pvp_n_2-1.gat mapflag nobranch
-pvp_n_2-2.gat mapflag nobranch
-pvp_n_2-3.gat mapflag nobranch
-pvp_n_2-4.gat mapflag nobranch
-pvp_n_2-5.gat mapflag nobranch
-pvp_n_3-1.gat mapflag nobranch
-pvp_n_3-2.gat mapflag nobranch
-pvp_n_3-3.gat mapflag nobranch
-pvp_n_3-4.gat mapflag nobranch
-pvp_n_3-5.gat mapflag nobranch
-pvp_n_4-1.gat mapflag nobranch
-pvp_n_4-2.gat mapflag nobranch
-pvp_n_4-3.gat mapflag nobranch
-pvp_n_4-4.gat mapflag nobranch
-pvp_n_4-5.gat mapflag nobranch
-pvp_n_5-1.gat mapflag nobranch
-pvp_n_5-2.gat mapflag nobranch
-pvp_n_5-3.gat mapflag nobranch
-pvp_n_5-4.gat mapflag nobranch
-pvp_n_5-5.gat mapflag nobranch
-pvp_n_6-1.gat mapflag nobranch
-pvp_n_6-2.gat mapflag nobranch
-pvp_n_6-3.gat mapflag nobranch
-pvp_n_6-4.gat mapflag nobranch
-pvp_n_6-5.gat mapflag nobranch
-pvp_n_7-1.gat mapflag nobranch
-pvp_n_7-2.gat mapflag nobranch
-pvp_n_7-3.gat mapflag nobranch
-pvp_n_7-4.gat mapflag nobranch
-pvp_n_7-5.gat mapflag nobranch
-pvp_n_8-1.gat mapflag nobranch
-pvp_n_8-2.gat mapflag nobranch
-pvp_n_8-3.gat mapflag nobranch
-pvp_n_8-4.gat mapflag nobranch
-pvp_n_8-5.gat mapflag nobranch
-pvp_2vs2.gat mapflag nobranch
-
-//Main City maps
-alberta.gat mapflag nobranch
-aldebaran.gat mapflag nobranch
-amatsu.gat mapflag nobranch
-ayothaya.gat mapflag nobranch
-comodo.gat mapflag nobranch
-einbroch.gat mapflag nobranch
-einbech.gat mapflag nobranch
-geffen.gat mapflag nobranch
-gonryun.gat mapflag nobranch
-izlude.gat mapflag nobranch
-jawaii.gat mapflag nobranch
-hugel.gat mapflag nobranch
-lighthalzen.gat mapflag nobranch
-louyang.gat mapflag nobranch
-morocc.gat mapflag nobranch
-niflheim.gat mapflag nobranch
-prontera.gat mapflag nobranch
-payon.gat mapflag nobranch
-pay_arche.gat mapflag nobranch
-umbala.gat mapflag nobranch
-xmas.gat mapflag nobranch
-yuno.gat mapflag nobranch
+//===== eAthena Script =======================================
+//= Map flags that disable dead branching
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.2 [Lupus]
+//= 1.3 [massdriller]
+//= 1.6 [Lupus]
+//===== Current Version: =====================================
+
+// Cities ================>\\
+ayo_in01.gat mapflag nobranch
+ayo_in02.gat mapflag nobranch
+alb_ship.gat mapflag nobranch
+alberta_in.gat mapflag nobranch
+aldeba_in.gat mapflag nobranch
+ama_in01.gat mapflag nobranch
+ama_in02.gat mapflag nobranch
+ama_test.gat mapflag nobranch
+cmd_in01.gat mapflag nobranch
+cmd_in02.gat mapflag nobranch
+gef_tower.gat mapflag nobranch
+geffen_in.gat mapflag nobranch
+gon_in.gat mapflag nobranch
+gon_test.gat mapflag nobranch
+in_orcs01.gat mapflag nobranch
+izlude_in.gat mapflag nobranch
+jawaii_in.gat mapflag nobranch
+lou_in01.gat mapflag nobranch
+lou_in02.gat mapflag nobranch
+moc_castle.gat mapflag nobranch
+morocc_in.gat mapflag nobranch
+new_zone01.gat mapflag nobranch
+new_zone02.gat mapflag nobranch
+new_zone03.gat mapflag nobranch
+new_zone04.gat mapflag nobranch
+nif_in.gat mapflag nobranch
+payon_in01.gat mapflag nobranch
+payon_in02.gat mapflag nobranch
+payon_in03.gat mapflag nobranch
+prt_castle.gat mapflag nobranch
+prt_church.gat mapflag nobranch
+prt_in.gat mapflag nobranch
+um_in.gat mapflag nobranch
+xmas_in.gat mapflag nobranch
+yuno_in01.gat mapflag nobranch
+yuno_in02.gat mapflag nobranch
+yuno_in03.gat mapflag nobranch
+yuno_in04.gat mapflag nobranch
+yuno_in05.gat mapflag nobranch
+que_sign01.gat mapflag nobranch
+ein_in01.gat mapflag nobranch
+airport.gat mapflag nobranch
+airplane.gat mapflag nobranch
+airplane_01.gat mapflag nobranch
+ra_in01.gat mapflag nobranch
+// New areas
+yuno_pre.gat mapflag nobranch
+y_airport.gat mapflag nobranch
+lhz_airport.gat mapflag nobranch
+lhz_in01.gat mapflag nobranch
+lhz_in02.gat mapflag nobranch
+lhz_in03.gat mapflag nobranch
+lhz_que01.gat mapflag nobranch
+lhz_cube.gat mapflag nobranch
+hu_in01.gat mapflag nobranch
+auction_01.gat mapflag nobranch
+auction_02.gat mapflag nobranch
+p_track01.gat mapflag nobranch
+p_track02.gat mapflag nobranch
+ra_temple.gat mapflag nobranch
+ra_temsky.gat mapflag nobranch
+que_rachel.gat mapflag nobranch
+
+// Job Quests ====================
+job_sword1.gat mapflag nobranch
+job_thief1.gat mapflag nobranch
+// 2-1
+job_knt.gat mapflag nobranch
+job_prist.gat mapflag nobranch
+job_wiz.gat mapflag nobranch
+job_hunte.gat mapflag nobranch
+in_hunter.gat mapflag nobranch
+in_moc_16.gat mapflag nobranch
+// 2-2
+alde_alche.gat mapflag nobranch
+job_cru.gat mapflag nobranch
+job_duncer.gat mapflag nobranch
+job_monk.gat mapflag nobranch
+monk_test.gat mapflag nobranch
+monk_in.gat mapflag nobranch
+in_rogue.gat mapflag nobranch
+job_sage.gat mapflag nobranch
+que_ng.gat mapflag nobranch
+job_soul.gat mapflag nobranch
+job_star.gat mapflag nobranch
+
+// Special Quests Places =========
+que_god01.gat mapflag nobranch
+que_god02.gat mapflag nobranch
+que_bingo.gat mapflag nobranch
+que_hugel.gat mapflag nobranch
+poring_c01.gat mapflag nobranch
+poring_c02.gat mapflag nobranch
+kh_mansion.gat mapflag nobranch
+kh_rossi.gat mapflag nobranch
+kh_school.gat mapflag nobranch
+kh_vila.gat mapflag nobranch
+
+// Guild Castles ==================
+//alde_gld.gat mapflag nobranch
+aldeg_cas01.gat mapflag nobranch
+aldeg_cas02.gat mapflag nobranch
+aldeg_cas03.gat mapflag nobranch
+aldeg_cas04.gat mapflag nobranch
+aldeg_cas05.gat mapflag nobranch
+gefg_cas01.gat mapflag nobranch
+gefg_cas02.gat mapflag nobranch
+gefg_cas03.gat mapflag nobranch
+gefg_cas04.gat mapflag nobranch
+gefg_cas05.gat mapflag nobranch
+//pay_gld.gat mapflag nobranch
+payg_cas01.gat mapflag nobranch
+payg_cas02.gat mapflag nobranch
+payg_cas03.gat mapflag nobranch
+payg_cas04.gat mapflag nobranch
+payg_cas05.gat mapflag nobranch
+//prt_gld.gat mapflag nobranch
+prtg_cas01.gat mapflag nobranch
+prtg_cas02.gat mapflag nobranch
+prtg_cas03.gat mapflag nobranch
+prtg_cas04.gat mapflag nobranch
+prtg_cas05.gat mapflag nobranch
+//n_castle.gat mapflag nobranch
+nguild_alde.gat mapflag nobranch
+nguild_gef.gat mapflag nobranch
+nguild_pay.gat mapflag nobranch
+nguild_prt.gat mapflag nobranch
+
+// GvG Arenas =====================
+guild_vs1.gat mapflag nobranch
+guild_vs2.gat mapflag nobranch
+guild_vs3.gat mapflag nobranch
+guild_vs4.gat mapflag nobranch
+guild_vs5.gat mapflag nobranch
+
+// Arenas ================>\\
+arena_room.gat mapflag nobranch
+force_1-1.gat mapflag nobranch
+force_1-2.gat mapflag nobranch
+force_1-3.gat mapflag nobranch
+ordeal_1-1.gat mapflag nobranch
+ordeal_1-2.gat mapflag nobranch
+ordeal_1-3.gat mapflag nobranch
+ordeal_2-1.gat mapflag nobranch
+ordeal_2-2.gat mapflag nobranch
+ordeal_2-3.gat mapflag nobranch
+ordeal_3-1.gat mapflag nobranch
+ordeal_3-2.gat mapflag nobranch
+ordeal_3-3.gat mapflag nobranch
+pvp_2vs2.gat mapflag nobranch
+pvp_c_room.gat mapflag nobranch
+quiz_00.gat mapflag nobranch
+quiz_01.gat mapflag nobranch
+sec_in01.gat mapflag nobranch
+//hunter_1-1.gat mapflag nobranch
+//hunter_2-1.gat mapflag nobranch
+//hunter_3-1.gat mapflag nobranch
+//knight_1-1.gat mapflag nobranch
+//knight_2-1.gat mapflag nobranch
+//knight_3-1.gat mapflag nobranch
+//priest_1-1.gat mapflag nobranch
+//priest_2-1.gat mapflag nobranch
+//priest_3-1.gat mapflag nobranch
+prt_are_in.gat mapflag nobranch
+prt_are01.gat mapflag nobranch
+//wizard_1-1.gat mapflag nobranch
+//wizard_2-1.gat mapflag nobranch
+//wizard_3-1.gat mapflag nobranch
+
+// PvP Arenas =========================
+pvp_y_room.gat mapflag nobranch
+pvp_y_1-1.gat mapflag nobranch
+pvp_y_1-2.gat mapflag nobranch
+pvp_y_1-3.gat mapflag nobranch
+pvp_y_1-4.gat mapflag nobranch
+pvp_y_1-5.gat mapflag nobranch
+pvp_y_2-1.gat mapflag nobranch
+pvp_y_2-2.gat mapflag nobranch
+pvp_y_2-3.gat mapflag nobranch
+pvp_y_2-4.gat mapflag nobranch
+pvp_y_2-5.gat mapflag nobranch
+pvp_y_3-1.gat mapflag nobranch
+pvp_y_3-2.gat mapflag nobranch
+pvp_y_3-3.gat mapflag nobranch
+pvp_y_3-4.gat mapflag nobranch
+pvp_y_3-5.gat mapflag nobranch
+pvp_y_4-1.gat mapflag nobranch
+pvp_y_4-2.gat mapflag nobranch
+pvp_y_4-3.gat mapflag nobranch
+pvp_y_4-4.gat mapflag nobranch
+pvp_y_4-5.gat mapflag nobranch
+pvp_y_5-1.gat mapflag nobranch
+pvp_y_5-2.gat mapflag nobranch
+pvp_y_5-3.gat mapflag nobranch
+pvp_y_5-4.gat mapflag nobranch
+pvp_y_5-5.gat mapflag nobranch
+pvp_y_6-1.gat mapflag nobranch
+pvp_y_6-2.gat mapflag nobranch
+pvp_y_6-3.gat mapflag nobranch
+pvp_y_6-4.gat mapflag nobranch
+pvp_y_6-5.gat mapflag nobranch
+pvp_y_7-1.gat mapflag nobranch
+pvp_y_7-2.gat mapflag nobranch
+pvp_y_7-3.gat mapflag nobranch
+pvp_y_7-4.gat mapflag nobranch
+pvp_y_7-5.gat mapflag nobranch
+pvp_y_8-1.gat mapflag nobranch
+pvp_y_8-2.gat mapflag nobranch
+pvp_y_8-3.gat mapflag nobranch
+pvp_y_8-4.gat mapflag nobranch
+pvp_y_8-5.gat mapflag nobranch
+pvp_n_room.gat mapflag nobranch
+pvp_n_1-1.gat mapflag nobranch
+pvp_n_1-2.gat mapflag nobranch
+pvp_n_1-3.gat mapflag nobranch
+pvp_n_1-4.gat mapflag nobranch
+pvp_n_1-5.gat mapflag nobranch
+pvp_n_2-1.gat mapflag nobranch
+pvp_n_2-2.gat mapflag nobranch
+pvp_n_2-3.gat mapflag nobranch
+pvp_n_2-4.gat mapflag nobranch
+pvp_n_2-5.gat mapflag nobranch
+pvp_n_3-1.gat mapflag nobranch
+pvp_n_3-2.gat mapflag nobranch
+pvp_n_3-3.gat mapflag nobranch
+pvp_n_3-4.gat mapflag nobranch
+pvp_n_3-5.gat mapflag nobranch
+pvp_n_4-1.gat mapflag nobranch
+pvp_n_4-2.gat mapflag nobranch
+pvp_n_4-3.gat mapflag nobranch
+pvp_n_4-4.gat mapflag nobranch
+pvp_n_4-5.gat mapflag nobranch
+pvp_n_5-1.gat mapflag nobranch
+pvp_n_5-2.gat mapflag nobranch
+pvp_n_5-3.gat mapflag nobranch
+pvp_n_5-4.gat mapflag nobranch
+pvp_n_5-5.gat mapflag nobranch
+pvp_n_6-1.gat mapflag nobranch
+pvp_n_6-2.gat mapflag nobranch
+pvp_n_6-3.gat mapflag nobranch
+pvp_n_6-4.gat mapflag nobranch
+pvp_n_6-5.gat mapflag nobranch
+pvp_n_7-1.gat mapflag nobranch
+pvp_n_7-2.gat mapflag nobranch
+pvp_n_7-3.gat mapflag nobranch
+pvp_n_7-4.gat mapflag nobranch
+pvp_n_7-5.gat mapflag nobranch
+pvp_n_8-1.gat mapflag nobranch
+pvp_n_8-2.gat mapflag nobranch
+pvp_n_8-3.gat mapflag nobranch
+pvp_n_8-4.gat mapflag nobranch
+pvp_n_8-5.gat mapflag nobranch
+pvp_2vs2.gat mapflag nobranch
+
+//Main City maps
+alberta.gat mapflag nobranch
+aldebaran.gat mapflag nobranch
+amatsu.gat mapflag nobranch
+ayothaya.gat mapflag nobranch
+comodo.gat mapflag nobranch
+einbroch.gat mapflag nobranch
+einbech.gat mapflag nobranch
+geffen.gat mapflag nobranch
+gonryun.gat mapflag nobranch
+izlude.gat mapflag nobranch
+jawaii.gat mapflag nobranch
+hugel.gat mapflag nobranch
+lighthalzen.gat mapflag nobranch
+louyang.gat mapflag nobranch
+morocc.gat mapflag nobranch
+niflheim.gat mapflag nobranch
+prontera.gat mapflag nobranch
+payon.gat mapflag nobranch
+pay_arche.gat mapflag nobranch
+umbala.gat mapflag nobranch
+xmas.gat mapflag nobranch
+yuno.gat mapflag nobranch
rachel.gat mapflag nobranch \ No newline at end of file
diff --git a/conf-tmpl/mapflag/noexp.txt b/conf-tmpl/mapflag/noexp.txt
index 0d6fbddef..17fe3dd8c 100644
--- a/conf-tmpl/mapflag/noexp.txt
+++ b/conf-tmpl/mapflag/noexp.txt
@@ -1,23 +1,23 @@
-//===== eAthena Script =======================================
-//= Map flags that disable gaining EXP
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.2 [Lupus] 1.3 [massdriller] 1.4 Lupus 1.5 Lorky
-//= 1.6 Added Lighthalzen (due to quests) [Lupus]
-//============================================================
-
-// Location for Job's Quests
-job_thief1.gat mapflag noexp
-job_sword1.gat mapflag noexp
-in_moc_16.gat mapflag noexp
-job_hunte.gat mapflag noexp
-job_knt.gat mapflag noexp
-job_prist.gat mapflag noexp
-job_wiz.gat mapflag noexp
-job_cru.gat mapflag noexp
-monk_test.gat mapflag noexp
-in_rogue.gat mapflag noexp
-job_sage.gat mapflag noexp
-job_soul.gat mapflag noexp
-job_star.gat mapflag noexp
-que_ng.gat mapflag noexp
+//===== eAthena Script =======================================
+//= Map flags that disable gaining EXP
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.2 [Lupus] 1.3 [massdriller] 1.4 Lupus 1.5 Lorky
+//= 1.6 Added Lighthalzen (due to quests) [Lupus]
+//============================================================
+
+// Location for Job's Quests
+job_thief1.gat mapflag noexp
+job_sword1.gat mapflag noexp
+in_moc_16.gat mapflag noexp
+job_hunte.gat mapflag noexp
+job_knt.gat mapflag noexp
+job_prist.gat mapflag noexp
+job_wiz.gat mapflag noexp
+job_cru.gat mapflag noexp
+monk_test.gat mapflag noexp
+in_rogue.gat mapflag noexp
+job_sage.gat mapflag noexp
+job_soul.gat mapflag noexp
+job_star.gat mapflag noexp
+que_ng.gat mapflag noexp
diff --git a/conf-tmpl/mapflag/noicewall.txt b/conf-tmpl/mapflag/noicewall.txt
index 4d89791c0..616feb8dc 100644
--- a/conf-tmpl/mapflag/noicewall.txt
+++ b/conf-tmpl/mapflag/noicewall.txt
@@ -1,120 +1,120 @@
-//===== eAthena Script =======================================
-//= Map flags that disable icewall skill
-//===== By: ==================================================
-//= eAthena Dev Team
-//=============================================================
-//= noicewall: Disables Icewall skill.
-//= To disable Icewall on a specific map add the mapname here.
-//= 1.5 [Lupus]
-//============================================================
-
-ayo_in01.gat mapflag noicewall
-ayo_in02.gat mapflag noicewall
-alberta_in.gat mapflag noicewall
-alberta.gat mapflag noicewall
-alde_alche.gat mapflag noicewall
-aldeba_in.gat mapflag noicewall
-aldebaran.gat mapflag noicewall
-ama_in01.gat mapflag noicewall
-ama_in02.gat mapflag noicewall
-amatsu.gat mapflag noicewall
-ayothaya.gat mapflag noicewall
-cmd_in01.gat mapflag noicewall
-cmd_in02.gat mapflag noicewall
-comodo.gat mapflag noicewall
-einbroch.gat mapflag noicewall
-einbech.gat mapflag noicewall
-gef_tower.gat mapflag noicewall
-geffen.gat mapflag noicewall
-geffen_in.gat mapflag noicewall
-gon_in.gat mapflag noicewall
-gonryun.gat mapflag noicewall
-in_hunter.gat mapflag noicewall
-in_moc_16.gat mapflag noicewall
-in_orcs01.gat mapflag noicewall
-izlude_in.gat mapflag noicewall
-izlude.gat mapflag noicewall
-hugel.gat mapflag noicewall
-jawaii.gat mapflag noicewall
-moc_castle.gat mapflag noicewall
-monk_in.gat mapflag noicewall
-morocc_in.gat mapflag noicewall
-morocc.gat mapflag noicewall
-payon_in01.gat mapflag noicewall
-payon_in02.gat mapflag noicewall
-payon_in03.gat mapflag noicewall
-payon.gat mapflag noicewall
-pay_arche.gat mapflag noicewall
-prt_are_in.gat mapflag noicewall
-prt_are01.gat mapflag noicewall
-prt_castle.gat mapflag noicewall
-prt_church.gat mapflag noicewall
-prt_in.gat mapflag noicewall
-prontera.gat mapflag noicewall
-sec_in01.gat mapflag noicewall
-job_sword1.gat mapflag noicewall
-um_in.gat mapflag noicewall
-umbala.gat mapflag noicewall
-xmas_in.gat mapflag noicewall
-xmas.gat mapflag noicewall
-yuno_in01.gat mapflag noicewall
-yuno_in02.gat mapflag noicewall
-yuno_in03.gat mapflag noicewall
-yuno_in04.gat mapflag noicewall
-yuno_in05.gat mapflag noicewall
-yuno.gat mapflag noicewall
-gon_test.gat mapflag noicewall
-nif_in.gat mapflag noicewall
-louyang.gat mapflag noicewall
-que_sign01.gat mapflag noicewall
-ein_in01.gat mapflag noicewall
-airport.gat mapflag noicewall
-airplane.gat mapflag noicewall
-airplane_01.gat mapflag noicewall
-lighthalzen.gat mapflag noicewall
-yuno_pre.gat mapflag noicewall
-y_airport.gat mapflag noicewall
-lhz_airport.gat mapflag noicewall
-lhz_in01.gat mapflag noicewall
-lhz_in02.gat mapflag noicewall
-lhz_in03.gat mapflag noicewall
-rachel.gat mapflag noicewall
-ra_in01.gat mapflag noicewall
-ra_temin.gat mapflag noicewall
-ra_temple.gat mapflag noicewall
-ra_temsky.gat mapflag noicewall
-que_rachel.gat mapflag noicewall
-auction_01.gat mapflag noicewall
-auction_02.gat mapflag noicewall
-hu_in01.gat mapflag noicewall
-kh_mansion.gat mapflag noicewall
-kh_rossi.gat mapflag noicewall
-kh_school.gat mapflag noicewall
-kh_vila.gat mapflag noicewall
-
-// Guild Castles ==========
-aldeg_cas01.gat mapflag noicewall
-aldeg_cas02.gat mapflag noicewall
-aldeg_cas03.gat mapflag noicewall
-aldeg_cas04.gat mapflag noicewall
-aldeg_cas05.gat mapflag noicewall
-gefg_cas01.gat mapflag noicewall
-gefg_cas02.gat mapflag noicewall
-gefg_cas03.gat mapflag noicewall
-gefg_cas04.gat mapflag noicewall
-gefg_cas05.gat mapflag noicewall
-payg_cas01.gat mapflag noicewall
-payg_cas02.gat mapflag noicewall
-payg_cas03.gat mapflag noicewall
-payg_cas04.gat mapflag noicewall
-payg_cas05.gat mapflag noicewall
-prtg_cas01.gat mapflag noicewall
-prtg_cas02.gat mapflag noicewall
-prtg_cas03.gat mapflag noicewall
-prtg_cas04.gat mapflag noicewall
-prtg_cas05.gat mapflag noicewall
-// Novice Guild Castles ===
-nguild_alde.gat mapflag noicewall
-nguild_gef.gat mapflag noicewall
-nguild_pay.gat mapflag noicewall
-nguild_prt.gat mapflag noicewall
+//===== eAthena Script =======================================
+//= Map flags that disable icewall skill
+//===== By: ==================================================
+//= eAthena Dev Team
+//=============================================================
+//= noicewall: Disables Icewall skill.
+//= To disable Icewall on a specific map add the mapname here.
+//= 1.5 [Lupus]
+//============================================================
+
+ayo_in01.gat mapflag noicewall
+ayo_in02.gat mapflag noicewall
+alberta_in.gat mapflag noicewall
+alberta.gat mapflag noicewall
+alde_alche.gat mapflag noicewall
+aldeba_in.gat mapflag noicewall
+aldebaran.gat mapflag noicewall
+ama_in01.gat mapflag noicewall
+ama_in02.gat mapflag noicewall
+amatsu.gat mapflag noicewall
+ayothaya.gat mapflag noicewall
+cmd_in01.gat mapflag noicewall
+cmd_in02.gat mapflag noicewall
+comodo.gat mapflag noicewall
+einbroch.gat mapflag noicewall
+einbech.gat mapflag noicewall
+gef_tower.gat mapflag noicewall
+geffen.gat mapflag noicewall
+geffen_in.gat mapflag noicewall
+gon_in.gat mapflag noicewall
+gonryun.gat mapflag noicewall
+in_hunter.gat mapflag noicewall
+in_moc_16.gat mapflag noicewall
+in_orcs01.gat mapflag noicewall
+izlude_in.gat mapflag noicewall
+izlude.gat mapflag noicewall
+hugel.gat mapflag noicewall
+jawaii.gat mapflag noicewall
+moc_castle.gat mapflag noicewall
+monk_in.gat mapflag noicewall
+morocc_in.gat mapflag noicewall
+morocc.gat mapflag noicewall
+payon_in01.gat mapflag noicewall
+payon_in02.gat mapflag noicewall
+payon_in03.gat mapflag noicewall
+payon.gat mapflag noicewall
+pay_arche.gat mapflag noicewall
+prt_are_in.gat mapflag noicewall
+prt_are01.gat mapflag noicewall
+prt_castle.gat mapflag noicewall
+prt_church.gat mapflag noicewall
+prt_in.gat mapflag noicewall
+prontera.gat mapflag noicewall
+sec_in01.gat mapflag noicewall
+job_sword1.gat mapflag noicewall
+um_in.gat mapflag noicewall
+umbala.gat mapflag noicewall
+xmas_in.gat mapflag noicewall
+xmas.gat mapflag noicewall
+yuno_in01.gat mapflag noicewall
+yuno_in02.gat mapflag noicewall
+yuno_in03.gat mapflag noicewall
+yuno_in04.gat mapflag noicewall
+yuno_in05.gat mapflag noicewall
+yuno.gat mapflag noicewall
+gon_test.gat mapflag noicewall
+nif_in.gat mapflag noicewall
+louyang.gat mapflag noicewall
+que_sign01.gat mapflag noicewall
+ein_in01.gat mapflag noicewall
+airport.gat mapflag noicewall
+airplane.gat mapflag noicewall
+airplane_01.gat mapflag noicewall
+lighthalzen.gat mapflag noicewall
+yuno_pre.gat mapflag noicewall
+y_airport.gat mapflag noicewall
+lhz_airport.gat mapflag noicewall
+lhz_in01.gat mapflag noicewall
+lhz_in02.gat mapflag noicewall
+lhz_in03.gat mapflag noicewall
+rachel.gat mapflag noicewall
+ra_in01.gat mapflag noicewall
+ra_temin.gat mapflag noicewall
+ra_temple.gat mapflag noicewall
+ra_temsky.gat mapflag noicewall
+que_rachel.gat mapflag noicewall
+auction_01.gat mapflag noicewall
+auction_02.gat mapflag noicewall
+hu_in01.gat mapflag noicewall
+kh_mansion.gat mapflag noicewall
+kh_rossi.gat mapflag noicewall
+kh_school.gat mapflag noicewall
+kh_vila.gat mapflag noicewall
+
+// Guild Castles ==========
+aldeg_cas01.gat mapflag noicewall
+aldeg_cas02.gat mapflag noicewall
+aldeg_cas03.gat mapflag noicewall
+aldeg_cas04.gat mapflag noicewall
+aldeg_cas05.gat mapflag noicewall
+gefg_cas01.gat mapflag noicewall
+gefg_cas02.gat mapflag noicewall
+gefg_cas03.gat mapflag noicewall
+gefg_cas04.gat mapflag noicewall
+gefg_cas05.gat mapflag noicewall
+payg_cas01.gat mapflag noicewall
+payg_cas02.gat mapflag noicewall
+payg_cas03.gat mapflag noicewall
+payg_cas04.gat mapflag noicewall
+payg_cas05.gat mapflag noicewall
+prtg_cas01.gat mapflag noicewall
+prtg_cas02.gat mapflag noicewall
+prtg_cas03.gat mapflag noicewall
+prtg_cas04.gat mapflag noicewall
+prtg_cas05.gat mapflag noicewall
+// Novice Guild Castles ===
+nguild_alde.gat mapflag noicewall
+nguild_gef.gat mapflag noicewall
+nguild_pay.gat mapflag noicewall
+nguild_prt.gat mapflag noicewall
diff --git a/conf-tmpl/mapflag/noloot.txt b/conf-tmpl/mapflag/noloot.txt
index 928588338..99f6493e4 100644
--- a/conf-tmpl/mapflag/noloot.txt
+++ b/conf-tmpl/mapflag/noloot.txt
@@ -1,25 +1,25 @@
-//===== eAthena Script =======================================
-//= Map flags that disable drop of loot
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.2 [Lupus] 1.3 [massdriller] 1.4 Lupus 1.5 Lorky
-//= 1.6 Added Lighthalzen (due to quests) [Lupus]
-//============================================================
-
-// Location for Job's Quests
-job_sword1.gat mapflag noloot
-in_moc_16.gat mapflag noloot
-job_hunte.gat mapflag noloot
-job_knt.gat mapflag noloot
-job_prist.gat mapflag noloot
-job_wiz.gat mapflag noloot
-job_cru.gat mapflag noloot
-monk_test.gat mapflag noloot
-in_rogue.gat mapflag noloot
-job_sage.gat mapflag noloot
-job_soul.gat mapflag noloot
-job_star.gat mapflag noloot
-que_ng.gat mapflag noloot
-
-//Thievs have to gather some mushrooms. So they need loot
-//job_thief1.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Map flags that disable drop of loot
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.2 [Lupus] 1.3 [massdriller] 1.4 Lupus 1.5 Lorky
+//= 1.6 Added Lighthalzen (due to quests) [Lupus]
+//============================================================
+
+// Location for Job's Quests
+job_sword1.gat mapflag noloot
+in_moc_16.gat mapflag noloot
+job_hunte.gat mapflag noloot
+job_knt.gat mapflag noloot
+job_prist.gat mapflag noloot
+job_wiz.gat mapflag noloot
+job_cru.gat mapflag noloot
+monk_test.gat mapflag noloot
+in_rogue.gat mapflag noloot
+job_sage.gat mapflag noloot
+job_soul.gat mapflag noloot
+job_star.gat mapflag noloot
+que_ng.gat mapflag noloot
+
+//Thievs have to gather some mushrooms. So they need loot
+//job_thief1.gat mapflag noloot
diff --git a/conf-tmpl/mapflag/nomemo.txt b/conf-tmpl/mapflag/nomemo.txt
index c31c32480..a84b87067 100644
--- a/conf-tmpl/mapflag/nomemo.txt
+++ b/conf-tmpl/mapflag/nomemo.txt
@@ -1,531 +1,531 @@
-//===== eAthena Script =======================================
-//= Map flags that disable warp portal memory
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.6 added up to Hugel maps. [Lupus]
-//===== Current Version: =====================================
-
-
-// Towns ====================
-ayo_in01.gat mapflag nomemo
-ayo_in02.gat mapflag nomemo
-alb_ship.gat mapflag nomemo
-alberta_in.gat mapflag nomemo
-aldeba_in.gat mapflag nomemo
-ama_in01.gat mapflag nomemo
-ama_in02.gat mapflag nomemo
-ama_test.gat mapflag nomemo
-cmd_in01.gat mapflag nomemo
-cmd_in02.gat mapflag nomemo
-gef_tower.gat mapflag nomemo
-geffen_in.gat mapflag nomemo
-gon_test.gat mapflag nomemo
-gon_in.gat mapflag nomemo
-in_orcs01.gat mapflag nomemo
-izlude_in.gat mapflag nomemo
-jawaii_in.gat mapflag nomemo
-lou_in01.gat mapflag nomemo
-lou_in02.gat mapflag nomemo
-moc_castle.gat mapflag nomemo
-morocc_in.gat mapflag nomemo
-niflheim.gat mapflag nomemo
-nif_in.gat mapflag nomemo
-new_zone01.gat mapflag nomemo
-new_zone02.gat mapflag nomemo
-new_zone03.gat mapflag nomemo
-new_zone04.gat mapflag nomemo
-pay_arche.gat mapflag nomemo
-payon_in01.gat mapflag nomemo
-payon_in02.gat mapflag nomemo
-payon_in03.gat mapflag nomemo
-prt_castle.gat mapflag nomemo
-prt_church.gat mapflag nomemo
-prt_in.gat mapflag nomemo
-um_in.gat mapflag nomemo
-xmas_in.gat mapflag nomemo
-valkyrie.gat mapflag nomemo
-yuno_in01.gat mapflag nomemo
-yuno_in02.gat mapflag nomemo
-yuno_in03.gat mapflag nomemo
-yuno_in04.gat mapflag nomemo
-yuno_in05.gat mapflag nomemo
-yuno.gat mapflag nomemo
-ein_in01.gat mapflag nomemo
-airport.gat mapflag nomemo
-airplane.gat mapflag nomemo
-airplane_01.gat mapflag nomemo
-lighthalzen.gat mapflag nomemo
-yuno_pre.gat mapflag nomemo
-y_airport.gat mapflag nomemo
-lhz_airport.gat mapflag nomemo
-einbroch.gat mapflag nomemo
-einbech.gat mapflag nomemo
-lhz_cube.gat mapflag nomemo
-lhz_in01.gat mapflag nomemo
-lhz_in02.gat mapflag nomemo
-lhz_in03.gat mapflag nomemo
-hu_in01.gat mapflag nomemo
-auction_01.gat mapflag nomemo
-auction_02.gat mapflag nomemo
-p_track01.gat mapflag nomemo
-p_track02.gat mapflag nomemo
-ra_in01.gat mapflag nomemo
-ra_temin.gat mapflag nomemo
-ra_temsky.gat mapflag nomemo
-
-// Fields ===================
-alb2trea.gat mapflag nomemo
-ayo_fild02.gat mapflag nomemo
-cmd_fild01.gat mapflag nomemo
-cmd_fild02.gat mapflag nomemo
-cmd_fild03.gat mapflag nomemo
-cmd_fild04.gat mapflag nomemo
-cmd_fild05.gat mapflag nomemo
-cmd_fild06.gat mapflag nomemo
-cmd_fild07.gat mapflag nomemo
-cmd_fild08.gat mapflag nomemo
-cmd_fild09.gat mapflag nomemo
-gef_fild02.gat mapflag nomemo
-gef_fild03.gat mapflag nomemo
-gef_fild06.gat mapflag nomemo
-gef_fild08.gat mapflag nomemo
-gef_fild10.gat mapflag nomemo
-gef_fild11.gat mapflag nomemo
-gef_fild12.gat mapflag nomemo
-gef_fild14.gat mapflag nomemo
-glast_01.gat mapflag nomemo
-hu_fild01.gat mapflag nomemo
-hu_fild05.gat mapflag nomemo
-izlu2dun.gat mapflag nomemo
-mjolnir_01.gat mapflag nomemo
-mjolnir_02.gat mapflag nomemo
-mjolnir_03.gat mapflag nomemo
-mjolnir_04.gat mapflag nomemo
-mjolnir_05.gat mapflag nomemo
-mjolnir_07.gat mapflag nomemo
-mjolnir_08.gat mapflag nomemo
-mjolnir_10.gat mapflag nomemo
-mjolnir_11.gat mapflag nomemo
-moc_fild01.gat mapflag nomemo
-moc_fild02.gat mapflag nomemo
-moc_fild03.gat mapflag nomemo
-moc_fild04.gat mapflag nomemo
-moc_fild05.gat mapflag nomemo
-moc_fild08.gat mapflag nomemo
-moc_fild09.gat mapflag nomemo
-moc_fild13.gat mapflag nomemo
-moc_fild14.gat mapflag nomemo
-moc_fild15.gat mapflag nomemo
-moc_fild16.gat mapflag nomemo
-moc_fild17.gat mapflag nomemo
-moc_fild18.gat mapflag nomemo
-nif_fild01.gat mapflag nomemo
-nif_fild02.gat mapflag nomemo
-pay_fild02.gat mapflag nomemo
-//pay_fild04.gat mapflag nomemo
-pay_fild05.gat mapflag nomemo
-pay_fild09.gat mapflag nomemo
-pay_fild10.gat mapflag nomemo
-pay_fild11.gat mapflag nomemo
-prt_fild00.gat mapflag nomemo
-prt_fild03.gat mapflag nomemo
-prt_fild04.gat mapflag nomemo
-prt_fild09.gat mapflag nomemo
-prt_fild10.gat mapflag nomemo
-prt_fild11.gat mapflag nomemo
-prt_monk.gat mapflag nomemo
-um_fild01.gat mapflag nomemo
-um_fild02.gat mapflag nomemo
-um_fild03.gat mapflag nomemo
-yuno_fild02.gat mapflag nomemo
-yuno_fild03.gat mapflag nomemo
-yuno_fild04.gat mapflag nomemo
-yuno_fild05.gat mapflag nomemo
-yuno_fild07.gat mapflag nomemo
-yuno_fild08.gat mapflag nomemo
-yuno_fild09.gat mapflag nomemo
-yuno_fild10.gat mapflag nomemo
-
-
-// Job Quests ================
-// First Job Class
-job_sword1.gat mapflag nomemo
-job_thief1.gat mapflag nomemo
-job_star.gat mapflag nomemo
-// Primary Second Job Class
-job_prist.gat mapflag nomemo
-job_wiz.gat mapflag nomemo
-job_hunte.gat mapflag nomemo
-in_hunter.gat mapflag nomemo
-in_moc_16.gat mapflag nomemo
-// Secondary Second Job Class
-alde_alche.gat mapflag nomemo
-job_cru.gat mapflag nomemo
-job_duncer.gat mapflag nomemo
-job_monk.gat mapflag nomemo
-monk_test.gat mapflag nomemo
-monk_in.gat mapflag nomemo
-in_rogue.gat mapflag nomemo
-job_sage.gat mapflag nomemo
-job_soul.gat mapflag nomemo
-que_ng.gat mapflag nomemo
-
-// Special Quests Places =====
-que_god01.gat mapflag nomemo
-que_god02.gat mapflag nomemo
-que_bingo.gat mapflag nomemo
-que_sign01.gat mapflag nomemo
-que_hugel.gat mapflag nomemo
-que_rachel.gat mapflag nomemo
-poring_c01.gat mapflag nomemo
-poring_c02.gat mapflag nomemo
-// Dungeons =================
-alde_dun01.gat mapflag nomemo
-alde_dun02.gat mapflag nomemo
-alde_dun03.gat mapflag nomemo
-alde_dun04.gat mapflag nomemo
-// Anthelll ------------------
-anthell01.gat mapflag nomemo
-anthell02.gat mapflag nomemo
-// Amatsu Dungeon ------------
-ama_dun01.gat mapflag nomemo
-ama_dun02.gat mapflag nomemo
-ama_dun03.gat mapflag nomemo
-// Ayothaya
-ayo_dun01.gat mapflag nomemo
-ayo_dun02.gat mapflag nomemo
-// Comodo Beach --------------
-beach_dun.gat mapflag nomemo
-beach_dun2.gat mapflag nomemo
-beach_dun3.gat mapflag nomemo
-// Clock Tower ---------------
-c_tower1.gat mapflag nomemo
-c_tower2.gat mapflag nomemo
-c_tower3.gat mapflag nomemo
-c_tower4.gat mapflag nomemo
-// Einbech Mines -------------
-ein_dun01.gat mapflag nomemo
-ein_dun02.gat mapflag nomemo
-// Geffen Dun ----------------
-gef_dun00.gat mapflag nomemo
-gef_dun01.gat mapflag nomemo
-gef_dun02.gat mapflag nomemo
-gef_dun03.gat mapflag nomemo
-// Glast Hiem ----------------
-gl_cas01.gat mapflag nomemo
-gl_cas02.gat mapflag nomemo
-gl_church.gat mapflag nomemo
-gl_chyard.gat mapflag nomemo
-gl_dun01.gat mapflag nomemo
-gl_dun02.gat mapflag nomemo
-gl_in01.gat mapflag nomemo
-gl_knt01.gat mapflag nomemo
-gl_knt02.gat mapflag nomemo
-gl_prison.gat mapflag nomemo
-gl_prison1.gat mapflag nomemo
-gl_sew01.gat mapflag nomemo
-gl_sew02.gat mapflag nomemo
-gl_sew03.gat mapflag nomemo
-gl_sew04.gat mapflag nomemo
-gl_step.gat mapflag nomemo
-// Guild Dun -----------------
-gld_dun01.gat mapflag nomemo
-gld_dun02.gat mapflag nomemo
-gld_dun03.gat mapflag nomemo
-gld_dun04.gat mapflag nomemo
-// Bayalan Island ------------
-iz_dun00.gat mapflag nomemo
-iz_dun01.gat mapflag nomemo
-iz_dun02.gat mapflag nomemo
-iz_dun03.gat mapflag nomemo
-iz_dun04.gat mapflag nomemo
-// Sphinx --------------------
-in_sphinx1.gat mapflag nomemo
-in_sphinx2.gat mapflag nomemo
-in_sphinx3.gat mapflag nomemo
-in_sphinx4.gat mapflag nomemo
-in_sphinx5.gat mapflag nomemo
-// Louyang Dun --------------
-lou_dun03.gat mapflag nomemo
-lou_dun02.gat mapflag nomemo
-lou_dun01.gat mapflag nomemo
-// Magma Dun -----------------
-mag_dun01.gat mapflag nomemo
-mag_dun02.gat mapflag nomemo
-// Pyrmaids ------------------
-moc_pryd01.gat mapflag nomemo
-moc_pryd02.gat mapflag nomemo
-moc_pryd03.gat mapflag nomemo
-moc_pryd04.gat mapflag nomemo
-moc_pryd05.gat mapflag nomemo
-moc_pryd06.gat mapflag nomemo
-moc_prydb1.gat mapflag nomemo
-// Coal Mine(Dead Pitt) ------
-mjo_dun01.gat mapflag nomemo
-mjo_dun02.gat mapflag nomemo
-mjo_dun03.gat mapflag nomemo
-// Orc Dun -------------------
-orcsdun01.gat mapflag nomemo
-orcsdun02.gat mapflag nomemo
-// Payon Cave ----------------
-pay_dun00.gat mapflag nomemo
-pay_dun01.gat mapflag nomemo
-pay_dun02.gat mapflag nomemo
-pay_dun03.gat mapflag nomemo
-pay_dun04.gat mapflag nomemo
-// Hidden Temple ------------
-prt_maze01.gat mapflag nomemo
-prt_maze02.gat mapflag nomemo
-prt_maze03.gat mapflag nomemo
-// Culvert Sewers ------------
-prt_sewb1.gat mapflag nomemo
-prt_sewb2.gat mapflag nomemo
-prt_sewb3.gat mapflag nomemo
-prt_sewb4.gat mapflag nomemo
-// Gonryun Dun ---------------
-gon_dun01.gat mapflag nomemo
-gon_dun02.gat mapflag nomemo
-gon_dun03.gat mapflag nomemo
-// Sunken Ship ---------------
-treasure01.gat mapflag nomemo
-treasure02.gat mapflag nomemo
-// Turtle Island -------------
-tur_dun01.gat mapflag nomemo
-tur_dun02.gat mapflag nomemo
-tur_dun03.gat mapflag nomemo
-tur_dun04.gat mapflag nomemo
-tur_dun05.gat mapflag nomemo
-tur_dun06.gat mapflag nomemo
-// Umbala Dun ----------------
-um_dun01.gat mapflag nomemo
-um_dun02.gat mapflag nomemo
-// Toy Factory ---------------
-xmas_dun01.gat mapflag nomemo
-xmas_dun02.gat mapflag nomemo
-// Yggdrasil Tree Dun --------
-yggdrasil01.gat mapflag nomemo
-// Old Geffenia --------------
-gefenia01.gat mapflag nomemo
-gefenia02.gat mapflag nomemo
-gefenia03.gat mapflag nomemo
-gefenia04.gat mapflag nomemo
-// Bio Lab Dungeon -----------
-lhz_dun01.gat mapflag nomemo
-lhz_dun02.gat mapflag nomemo
-lhz_dun03.gat mapflag nomemo
-// Juperos Dungeon -----------
-juperos_01.gat mapflag nomemo
-juperos_02.gat mapflag nomemo
-jupe_area1.gat mapflag nomemo
-jupe_area2.gat mapflag nomemo
-jupe_core.gat mapflag nomemo
-jupe_ele.gat mapflag nomemo
-jupe_ele_r.gat mapflag nomemo
-jupe_gate.gat mapflag nomemo
-jupe_cave.gat mapflag nomemo
-// Thanatos Tower ------------
-thana_boss.gat mapflag nomemo
-tha_scene01.gat mapflag nomemo
-tha_t01.gat mapflag nomemo
-tha_t02.gat mapflag nomemo
-tha_t03.gat mapflag nomemo
-tha_t04.gat mapflag nomemo
-tha_t05.gat mapflag nomemo
-tha_t06.gat mapflag nomemo
-tha_t07.gat mapflag nomemo
-tha_t08.gat mapflag nomemo
-tha_t09.gat mapflag nomemo
-tha_t10.gat mapflag nomemo
-tha_t11.gat mapflag nomemo
-tha_t12.gat mapflag nomemo
-thana_step.gat mapflag nomemo
-// Abyss Lake Dungeon --------
-abyss_01.gat mapflag nomemo
-abyss_02.gat mapflag nomemo
-abyss_03.gat mapflag nomemo
-//Odin's Temple & Kiehl
-odin_tem01.gat mapflag nomemo
-odin_tem02.gat mapflag nomemo
-odin_tem03.gat mapflag nomemo
-kh_kiehl02.gat mapflag nomemo
-kh_kiehl01.gat mapflag nomemo
-kh_dun02.gat mapflag nomemo
-kh_dun01.gat mapflag nomemo
-kh_mansion.gat mapflag nomemo
-kh_rossi.gat mapflag nomemo
-kh_school.gat mapflag nomemo
-kh_vila.gat mapflag nomemo
-//Ice Dungeon
-ice_dun01.gat mapflag nomemo
-ice_dun02.gat mapflag nomemo
-ice_dun03.gat mapflag nomemo
-ice_dun04.gat mapflag nomemo
-//Rachel Santuary
-ra_san01.gat mapflag nomemo
-ra_san02.gat mapflag nomemo
-ra_san03.gat mapflag nomemo
-ra_san04.gat mapflag nomemo
-ra_san05.gat mapflag nomemo
-
-// Guild Castles =============
-//alde_gld.gat mapflag nomemo
-aldeg_cas01.gat mapflag nomemo
-aldeg_cas02.gat mapflag nomemo
-aldeg_cas03.gat mapflag nomemo
-aldeg_cas04.gat mapflag nomemo
-aldeg_cas05.gat mapflag nomemo
-gefg_cas01.gat mapflag nomemo
-gefg_cas02.gat mapflag nomemo
-gefg_cas03.gat mapflag nomemo
-gefg_cas04.gat mapflag nomemo
-gefg_cas05.gat mapflag nomemo
-//pay_gld.gat mapflag nomemo
-payg_cas01.gat mapflag nomemo
-payg_cas02.gat mapflag nomemo
-payg_cas03.gat mapflag nomemo
-payg_cas04.gat mapflag nomemo
-payg_cas05.gat mapflag nomemo
-//prt_gld.gat mapflag nomemo
-prtg_cas01.gat mapflag nomemo
-prtg_cas02.gat mapflag nomemo
-prtg_cas03.gat mapflag nomemo
-prtg_cas04.gat mapflag nomemo
-prtg_cas05.gat mapflag nomemo
-gefg_cas01.gat mapflag nomemo
-gefg_cas02.gat mapflag nomemo
-gefg_cas03.gat mapflag nomemo
-gefg_cas04.gat mapflag nomemo
-gefg_cas05.gat mapflag nomemo
-nguild_alde.gat mapflag nomemo
-nguild_gef.gat mapflag nomemo
-nguild_pay.gat mapflag nomemo
-nguild_prt.gat mapflag nomemo
-//To Protect Novices Guilds from level abusers
-n_castle.gat mapflag nomemo
-
-// GvG Arenas ================
-guild_vs1.gat mapflag nomemo
-guild_vs2.gat mapflag nomemo
-guild_vs3.gat mapflag nomemo
-guild_vs4.gat mapflag nomemo
-guild_vs5.gat mapflag nomemo
-
-// Arenas ====================
-arena_room.gat mapflag nomemo
-force_1-1.gat mapflag nomemo
-force_1-2.gat mapflag nomemo
-force_1-3.gat mapflag nomemo
-ordeal_1-1.gat mapflag nomemo
-ordeal_1-2.gat mapflag nomemo
-ordeal_1-3.gat mapflag nomemo
-ordeal_2-1.gat mapflag nomemo
-ordeal_2-2.gat mapflag nomemo
-ordeal_2-3.gat mapflag nomemo
-ordeal_3-1.gat mapflag nomemo
-ordeal_3-2.gat mapflag nomemo
-ordeal_3-3.gat mapflag nomemo
-pvp_c_room.gat mapflag nomemo
-quiz_00.gat mapflag nomemo
-quiz_01.gat mapflag nomemo
-sec_in01.gat mapflag nomemo
-sec_in02.gat mapflag nomemo
-//hunter_1-1.gat mapflag nomemo
-//hunter_2-1.gat mapflag nomemo
-//hunter_3-1.gat mapflag nomemo
-//knight_1-1.gat mapflag nomemo
-//knight_2-1.gat mapflag nomemo
-//knight_3-1.gat mapflag nomemo
-//priest_1-1.gat mapflag nomemo
-//priest_2-1.gat mapflag nomemo
-//priest_3-1.gat mapflag nomemo
-prt_are_in.gat mapflag nomemo
-prt_are_in.gat mapflag nomemo
-prt_are01.gat mapflag nomemo
-//wizard_1-1.gat mapflag nomemo
-//wizard_2-1.gat mapflag nomemo
-//wizard_3-1.gat mapflag nomemo
-
-// PvP Arenas ================
-pvp_y_room.gat mapflag nomemo
-pvp_y_1-1.gat mapflag nomemo
-pvp_y_1-2.gat mapflag nomemo
-pvp_y_1-3.gat mapflag nomemo
-pvp_y_1-4.gat mapflag nomemo
-pvp_y_1-5.gat mapflag nomemo
-pvp_y_2-1.gat mapflag nomemo
-pvp_y_2-2.gat mapflag nomemo
-pvp_y_2-3.gat mapflag nomemo
-pvp_y_2-4.gat mapflag nomemo
-pvp_y_2-5.gat mapflag nomemo
-pvp_y_3-1.gat mapflag nomemo
-pvp_y_3-2.gat mapflag nomemo
-pvp_y_3-3.gat mapflag nomemo
-pvp_y_3-4.gat mapflag nomemo
-pvp_y_3-5.gat mapflag nomemo
-pvp_y_4-1.gat mapflag nomemo
-pvp_y_4-2.gat mapflag nomemo
-pvp_y_4-3.gat mapflag nomemo
-pvp_y_4-4.gat mapflag nomemo
-pvp_y_4-5.gat mapflag nomemo
-pvp_y_5-1.gat mapflag nomemo
-pvp_y_5-2.gat mapflag nomemo
-pvp_y_5-3.gat mapflag nomemo
-pvp_y_5-4.gat mapflag nomemo
-pvp_y_5-5.gat mapflag nomemo
-pvp_y_6-1.gat mapflag nomemo
-pvp_y_6-2.gat mapflag nomemo
-pvp_y_6-3.gat mapflag nomemo
-pvp_y_6-4.gat mapflag nomemo
-pvp_y_6-5.gat mapflag nomemo
-pvp_y_7-1.gat mapflag nomemo
-pvp_y_7-2.gat mapflag nomemo
-pvp_y_7-3.gat mapflag nomemo
-pvp_y_7-4.gat mapflag nomemo
-pvp_y_7-5.gat mapflag nomemo
-pvp_y_8-1.gat mapflag nomemo
-pvp_y_8-2.gat mapflag nomemo
-pvp_y_8-3.gat mapflag nomemo
-pvp_y_8-4.gat mapflag nomemo
-pvp_y_8-5.gat mapflag nomemo
-pvp_n_room.gat mapflag nomemo
-pvp_n_1-1.gat mapflag nomemo
-pvp_n_1-2.gat mapflag nomemo
-pvp_n_1-3.gat mapflag nomemo
-pvp_n_1-4.gat mapflag nomemo
-pvp_n_1-5.gat mapflag nomemo
-pvp_n_2-1.gat mapflag nomemo
-pvp_n_2-2.gat mapflag nomemo
-pvp_n_2-3.gat mapflag nomemo
-pvp_n_2-4.gat mapflag nomemo
-pvp_n_2-5.gat mapflag nomemo
-pvp_n_3-1.gat mapflag nomemo
-pvp_n_3-2.gat mapflag nomemo
-pvp_n_3-3.gat mapflag nomemo
-pvp_n_3-4.gat mapflag nomemo
-pvp_n_3-5.gat mapflag nomemo
-pvp_n_4-1.gat mapflag nomemo
-pvp_n_4-2.gat mapflag nomemo
-pvp_n_4-3.gat mapflag nomemo
-pvp_n_4-4.gat mapflag nomemo
-pvp_n_4-5.gat mapflag nomemo
-pvp_n_5-1.gat mapflag nomemo
-pvp_n_5-2.gat mapflag nomemo
-pvp_n_5-3.gat mapflag nomemo
-pvp_n_5-4.gat mapflag nomemo
-pvp_n_5-5.gat mapflag nomemo
-pvp_n_6-1.gat mapflag nomemo
-pvp_n_6-2.gat mapflag nomemo
-pvp_n_6-3.gat mapflag nomemo
-pvp_n_6-4.gat mapflag nomemo
-pvp_n_6-5.gat mapflag nomemo
-pvp_n_7-1.gat mapflag nomemo
-pvp_n_7-2.gat mapflag nomemo
-pvp_n_7-3.gat mapflag nomemo
-pvp_n_7-4.gat mapflag nomemo
-pvp_n_7-5.gat mapflag nomemo
-pvp_n_8-1.gat mapflag nomemo
-pvp_n_8-2.gat mapflag nomemo
-pvp_n_8-3.gat mapflag nomemo
-pvp_n_8-4.gat mapflag nomemo
-pvp_n_8-5.gat mapflag nomemo
-pvp_2vs2.gat mapflag nomemo
+//===== eAthena Script =======================================
+//= Map flags that disable warp portal memory
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.6 added up to Hugel maps. [Lupus]
+//===== Current Version: =====================================
+
+
+// Towns ====================
+ayo_in01.gat mapflag nomemo
+ayo_in02.gat mapflag nomemo
+alb_ship.gat mapflag nomemo
+alberta_in.gat mapflag nomemo
+aldeba_in.gat mapflag nomemo
+ama_in01.gat mapflag nomemo
+ama_in02.gat mapflag nomemo
+ama_test.gat mapflag nomemo
+cmd_in01.gat mapflag nomemo
+cmd_in02.gat mapflag nomemo
+gef_tower.gat mapflag nomemo
+geffen_in.gat mapflag nomemo
+gon_test.gat mapflag nomemo
+gon_in.gat mapflag nomemo
+in_orcs01.gat mapflag nomemo
+izlude_in.gat mapflag nomemo
+jawaii_in.gat mapflag nomemo
+lou_in01.gat mapflag nomemo
+lou_in02.gat mapflag nomemo
+moc_castle.gat mapflag nomemo
+morocc_in.gat mapflag nomemo
+niflheim.gat mapflag nomemo
+nif_in.gat mapflag nomemo
+new_zone01.gat mapflag nomemo
+new_zone02.gat mapflag nomemo
+new_zone03.gat mapflag nomemo
+new_zone04.gat mapflag nomemo
+pay_arche.gat mapflag nomemo
+payon_in01.gat mapflag nomemo
+payon_in02.gat mapflag nomemo
+payon_in03.gat mapflag nomemo
+prt_castle.gat mapflag nomemo
+prt_church.gat mapflag nomemo
+prt_in.gat mapflag nomemo
+um_in.gat mapflag nomemo
+xmas_in.gat mapflag nomemo
+valkyrie.gat mapflag nomemo
+yuno_in01.gat mapflag nomemo
+yuno_in02.gat mapflag nomemo
+yuno_in03.gat mapflag nomemo
+yuno_in04.gat mapflag nomemo
+yuno_in05.gat mapflag nomemo
+yuno.gat mapflag nomemo
+ein_in01.gat mapflag nomemo
+airport.gat mapflag nomemo
+airplane.gat mapflag nomemo
+airplane_01.gat mapflag nomemo
+lighthalzen.gat mapflag nomemo
+yuno_pre.gat mapflag nomemo
+y_airport.gat mapflag nomemo
+lhz_airport.gat mapflag nomemo
+einbroch.gat mapflag nomemo
+einbech.gat mapflag nomemo
+lhz_cube.gat mapflag nomemo
+lhz_in01.gat mapflag nomemo
+lhz_in02.gat mapflag nomemo
+lhz_in03.gat mapflag nomemo
+hu_in01.gat mapflag nomemo
+auction_01.gat mapflag nomemo
+auction_02.gat mapflag nomemo
+p_track01.gat mapflag nomemo
+p_track02.gat mapflag nomemo
+ra_in01.gat mapflag nomemo
+ra_temin.gat mapflag nomemo
+ra_temsky.gat mapflag nomemo
+
+// Fields ===================
+alb2trea.gat mapflag nomemo
+ayo_fild02.gat mapflag nomemo
+cmd_fild01.gat mapflag nomemo
+cmd_fild02.gat mapflag nomemo
+cmd_fild03.gat mapflag nomemo
+cmd_fild04.gat mapflag nomemo
+cmd_fild05.gat mapflag nomemo
+cmd_fild06.gat mapflag nomemo
+cmd_fild07.gat mapflag nomemo
+cmd_fild08.gat mapflag nomemo
+cmd_fild09.gat mapflag nomemo
+gef_fild02.gat mapflag nomemo
+gef_fild03.gat mapflag nomemo
+gef_fild06.gat mapflag nomemo
+gef_fild08.gat mapflag nomemo
+gef_fild10.gat mapflag nomemo
+gef_fild11.gat mapflag nomemo
+gef_fild12.gat mapflag nomemo
+gef_fild14.gat mapflag nomemo
+glast_01.gat mapflag nomemo
+hu_fild01.gat mapflag nomemo
+hu_fild05.gat mapflag nomemo
+izlu2dun.gat mapflag nomemo
+mjolnir_01.gat mapflag nomemo
+mjolnir_02.gat mapflag nomemo
+mjolnir_03.gat mapflag nomemo
+mjolnir_04.gat mapflag nomemo
+mjolnir_05.gat mapflag nomemo
+mjolnir_07.gat mapflag nomemo
+mjolnir_08.gat mapflag nomemo
+mjolnir_10.gat mapflag nomemo
+mjolnir_11.gat mapflag nomemo
+moc_fild01.gat mapflag nomemo
+moc_fild02.gat mapflag nomemo
+moc_fild03.gat mapflag nomemo
+moc_fild04.gat mapflag nomemo
+moc_fild05.gat mapflag nomemo
+moc_fild08.gat mapflag nomemo
+moc_fild09.gat mapflag nomemo
+moc_fild13.gat mapflag nomemo
+moc_fild14.gat mapflag nomemo
+moc_fild15.gat mapflag nomemo
+moc_fild16.gat mapflag nomemo
+moc_fild17.gat mapflag nomemo
+moc_fild18.gat mapflag nomemo
+nif_fild01.gat mapflag nomemo
+nif_fild02.gat mapflag nomemo
+pay_fild02.gat mapflag nomemo
+//pay_fild04.gat mapflag nomemo
+pay_fild05.gat mapflag nomemo
+pay_fild09.gat mapflag nomemo
+pay_fild10.gat mapflag nomemo
+pay_fild11.gat mapflag nomemo
+prt_fild00.gat mapflag nomemo
+prt_fild03.gat mapflag nomemo
+prt_fild04.gat mapflag nomemo
+prt_fild09.gat mapflag nomemo
+prt_fild10.gat mapflag nomemo
+prt_fild11.gat mapflag nomemo
+prt_monk.gat mapflag nomemo
+um_fild01.gat mapflag nomemo
+um_fild02.gat mapflag nomemo
+um_fild03.gat mapflag nomemo
+yuno_fild02.gat mapflag nomemo
+yuno_fild03.gat mapflag nomemo
+yuno_fild04.gat mapflag nomemo
+yuno_fild05.gat mapflag nomemo
+yuno_fild07.gat mapflag nomemo
+yuno_fild08.gat mapflag nomemo
+yuno_fild09.gat mapflag nomemo
+yuno_fild10.gat mapflag nomemo
+
+
+// Job Quests ================
+// First Job Class
+job_sword1.gat mapflag nomemo
+job_thief1.gat mapflag nomemo
+job_star.gat mapflag nomemo
+// Primary Second Job Class
+job_prist.gat mapflag nomemo
+job_wiz.gat mapflag nomemo
+job_hunte.gat mapflag nomemo
+in_hunter.gat mapflag nomemo
+in_moc_16.gat mapflag nomemo
+// Secondary Second Job Class
+alde_alche.gat mapflag nomemo
+job_cru.gat mapflag nomemo
+job_duncer.gat mapflag nomemo
+job_monk.gat mapflag nomemo
+monk_test.gat mapflag nomemo
+monk_in.gat mapflag nomemo
+in_rogue.gat mapflag nomemo
+job_sage.gat mapflag nomemo
+job_soul.gat mapflag nomemo
+que_ng.gat mapflag nomemo
+
+// Special Quests Places =====
+que_god01.gat mapflag nomemo
+que_god02.gat mapflag nomemo
+que_bingo.gat mapflag nomemo
+que_sign01.gat mapflag nomemo
+que_hugel.gat mapflag nomemo
+que_rachel.gat mapflag nomemo
+poring_c01.gat mapflag nomemo
+poring_c02.gat mapflag nomemo
+// Dungeons =================
+alde_dun01.gat mapflag nomemo
+alde_dun02.gat mapflag nomemo
+alde_dun03.gat mapflag nomemo
+alde_dun04.gat mapflag nomemo
+// Anthelll ------------------
+anthell01.gat mapflag nomemo
+anthell02.gat mapflag nomemo
+// Amatsu Dungeon ------------
+ama_dun01.gat mapflag nomemo
+ama_dun02.gat mapflag nomemo
+ama_dun03.gat mapflag nomemo
+// Ayothaya
+ayo_dun01.gat mapflag nomemo
+ayo_dun02.gat mapflag nomemo
+// Comodo Beach --------------
+beach_dun.gat mapflag nomemo
+beach_dun2.gat mapflag nomemo
+beach_dun3.gat mapflag nomemo
+// Clock Tower ---------------
+c_tower1.gat mapflag nomemo
+c_tower2.gat mapflag nomemo
+c_tower3.gat mapflag nomemo
+c_tower4.gat mapflag nomemo
+// Einbech Mines -------------
+ein_dun01.gat mapflag nomemo
+ein_dun02.gat mapflag nomemo
+// Geffen Dun ----------------
+gef_dun00.gat mapflag nomemo
+gef_dun01.gat mapflag nomemo
+gef_dun02.gat mapflag nomemo
+gef_dun03.gat mapflag nomemo
+// Glast Hiem ----------------
+gl_cas01.gat mapflag nomemo
+gl_cas02.gat mapflag nomemo
+gl_church.gat mapflag nomemo
+gl_chyard.gat mapflag nomemo
+gl_dun01.gat mapflag nomemo
+gl_dun02.gat mapflag nomemo
+gl_in01.gat mapflag nomemo
+gl_knt01.gat mapflag nomemo
+gl_knt02.gat mapflag nomemo
+gl_prison.gat mapflag nomemo
+gl_prison1.gat mapflag nomemo
+gl_sew01.gat mapflag nomemo
+gl_sew02.gat mapflag nomemo
+gl_sew03.gat mapflag nomemo
+gl_sew04.gat mapflag nomemo
+gl_step.gat mapflag nomemo
+// Guild Dun -----------------
+gld_dun01.gat mapflag nomemo
+gld_dun02.gat mapflag nomemo
+gld_dun03.gat mapflag nomemo
+gld_dun04.gat mapflag nomemo
+// Bayalan Island ------------
+iz_dun00.gat mapflag nomemo
+iz_dun01.gat mapflag nomemo
+iz_dun02.gat mapflag nomemo
+iz_dun03.gat mapflag nomemo
+iz_dun04.gat mapflag nomemo
+// Sphinx --------------------
+in_sphinx1.gat mapflag nomemo
+in_sphinx2.gat mapflag nomemo
+in_sphinx3.gat mapflag nomemo
+in_sphinx4.gat mapflag nomemo
+in_sphinx5.gat mapflag nomemo
+// Louyang Dun --------------
+lou_dun03.gat mapflag nomemo
+lou_dun02.gat mapflag nomemo
+lou_dun01.gat mapflag nomemo
+// Magma Dun -----------------
+mag_dun01.gat mapflag nomemo
+mag_dun02.gat mapflag nomemo
+// Pyrmaids ------------------
+moc_pryd01.gat mapflag nomemo
+moc_pryd02.gat mapflag nomemo
+moc_pryd03.gat mapflag nomemo
+moc_pryd04.gat mapflag nomemo
+moc_pryd05.gat mapflag nomemo
+moc_pryd06.gat mapflag nomemo
+moc_prydb1.gat mapflag nomemo
+// Coal Mine(Dead Pitt) ------
+mjo_dun01.gat mapflag nomemo
+mjo_dun02.gat mapflag nomemo
+mjo_dun03.gat mapflag nomemo
+// Orc Dun -------------------
+orcsdun01.gat mapflag nomemo
+orcsdun02.gat mapflag nomemo
+// Payon Cave ----------------
+pay_dun00.gat mapflag nomemo
+pay_dun01.gat mapflag nomemo
+pay_dun02.gat mapflag nomemo
+pay_dun03.gat mapflag nomemo
+pay_dun04.gat mapflag nomemo
+// Hidden Temple ------------
+prt_maze01.gat mapflag nomemo
+prt_maze02.gat mapflag nomemo
+prt_maze03.gat mapflag nomemo
+// Culvert Sewers ------------
+prt_sewb1.gat mapflag nomemo
+prt_sewb2.gat mapflag nomemo
+prt_sewb3.gat mapflag nomemo
+prt_sewb4.gat mapflag nomemo
+// Gonryun Dun ---------------
+gon_dun01.gat mapflag nomemo
+gon_dun02.gat mapflag nomemo
+gon_dun03.gat mapflag nomemo
+// Sunken Ship ---------------
+treasure01.gat mapflag nomemo
+treasure02.gat mapflag nomemo
+// Turtle Island -------------
+tur_dun01.gat mapflag nomemo
+tur_dun02.gat mapflag nomemo
+tur_dun03.gat mapflag nomemo
+tur_dun04.gat mapflag nomemo
+tur_dun05.gat mapflag nomemo
+tur_dun06.gat mapflag nomemo
+// Umbala Dun ----------------
+um_dun01.gat mapflag nomemo
+um_dun02.gat mapflag nomemo
+// Toy Factory ---------------
+xmas_dun01.gat mapflag nomemo
+xmas_dun02.gat mapflag nomemo
+// Yggdrasil Tree Dun --------
+yggdrasil01.gat mapflag nomemo
+// Old Geffenia --------------
+gefenia01.gat mapflag nomemo
+gefenia02.gat mapflag nomemo
+gefenia03.gat mapflag nomemo
+gefenia04.gat mapflag nomemo
+// Bio Lab Dungeon -----------
+lhz_dun01.gat mapflag nomemo
+lhz_dun02.gat mapflag nomemo
+lhz_dun03.gat mapflag nomemo
+// Juperos Dungeon -----------
+juperos_01.gat mapflag nomemo
+juperos_02.gat mapflag nomemo
+jupe_area1.gat mapflag nomemo
+jupe_area2.gat mapflag nomemo
+jupe_core.gat mapflag nomemo
+jupe_ele.gat mapflag nomemo
+jupe_ele_r.gat mapflag nomemo
+jupe_gate.gat mapflag nomemo
+jupe_cave.gat mapflag nomemo
+// Thanatos Tower ------------
+thana_boss.gat mapflag nomemo
+tha_scene01.gat mapflag nomemo
+tha_t01.gat mapflag nomemo
+tha_t02.gat mapflag nomemo
+tha_t03.gat mapflag nomemo
+tha_t04.gat mapflag nomemo
+tha_t05.gat mapflag nomemo
+tha_t06.gat mapflag nomemo
+tha_t07.gat mapflag nomemo
+tha_t08.gat mapflag nomemo
+tha_t09.gat mapflag nomemo
+tha_t10.gat mapflag nomemo
+tha_t11.gat mapflag nomemo
+tha_t12.gat mapflag nomemo
+thana_step.gat mapflag nomemo
+// Abyss Lake Dungeon --------
+abyss_01.gat mapflag nomemo
+abyss_02.gat mapflag nomemo
+abyss_03.gat mapflag nomemo
+//Odin's Temple & Kiehl
+odin_tem01.gat mapflag nomemo
+odin_tem02.gat mapflag nomemo
+odin_tem03.gat mapflag nomemo
+kh_kiehl02.gat mapflag nomemo
+kh_kiehl01.gat mapflag nomemo
+kh_dun02.gat mapflag nomemo
+kh_dun01.gat mapflag nomemo
+kh_mansion.gat mapflag nomemo
+kh_rossi.gat mapflag nomemo
+kh_school.gat mapflag nomemo
+kh_vila.gat mapflag nomemo
+//Ice Dungeon
+ice_dun01.gat mapflag nomemo
+ice_dun02.gat mapflag nomemo
+ice_dun03.gat mapflag nomemo
+ice_dun04.gat mapflag nomemo
+//Rachel Santuary
+ra_san01.gat mapflag nomemo
+ra_san02.gat mapflag nomemo
+ra_san03.gat mapflag nomemo
+ra_san04.gat mapflag nomemo
+ra_san05.gat mapflag nomemo
+
+// Guild Castles =============
+//alde_gld.gat mapflag nomemo
+aldeg_cas01.gat mapflag nomemo
+aldeg_cas02.gat mapflag nomemo
+aldeg_cas03.gat mapflag nomemo
+aldeg_cas04.gat mapflag nomemo
+aldeg_cas05.gat mapflag nomemo
+gefg_cas01.gat mapflag nomemo
+gefg_cas02.gat mapflag nomemo
+gefg_cas03.gat mapflag nomemo
+gefg_cas04.gat mapflag nomemo
+gefg_cas05.gat mapflag nomemo
+//pay_gld.gat mapflag nomemo
+payg_cas01.gat mapflag nomemo
+payg_cas02.gat mapflag nomemo
+payg_cas03.gat mapflag nomemo
+payg_cas04.gat mapflag nomemo
+payg_cas05.gat mapflag nomemo
+//prt_gld.gat mapflag nomemo
+prtg_cas01.gat mapflag nomemo
+prtg_cas02.gat mapflag nomemo
+prtg_cas03.gat mapflag nomemo
+prtg_cas04.gat mapflag nomemo
+prtg_cas05.gat mapflag nomemo
+gefg_cas01.gat mapflag nomemo
+gefg_cas02.gat mapflag nomemo
+gefg_cas03.gat mapflag nomemo
+gefg_cas04.gat mapflag nomemo
+gefg_cas05.gat mapflag nomemo
+nguild_alde.gat mapflag nomemo
+nguild_gef.gat mapflag nomemo
+nguild_pay.gat mapflag nomemo
+nguild_prt.gat mapflag nomemo
+//To Protect Novices Guilds from level abusers
+n_castle.gat mapflag nomemo
+
+// GvG Arenas ================
+guild_vs1.gat mapflag nomemo
+guild_vs2.gat mapflag nomemo
+guild_vs3.gat mapflag nomemo
+guild_vs4.gat mapflag nomemo
+guild_vs5.gat mapflag nomemo
+
+// Arenas ====================
+arena_room.gat mapflag nomemo
+force_1-1.gat mapflag nomemo
+force_1-2.gat mapflag nomemo
+force_1-3.gat mapflag nomemo
+ordeal_1-1.gat mapflag nomemo
+ordeal_1-2.gat mapflag nomemo
+ordeal_1-3.gat mapflag nomemo
+ordeal_2-1.gat mapflag nomemo
+ordeal_2-2.gat mapflag nomemo
+ordeal_2-3.gat mapflag nomemo
+ordeal_3-1.gat mapflag nomemo
+ordeal_3-2.gat mapflag nomemo
+ordeal_3-3.gat mapflag nomemo
+pvp_c_room.gat mapflag nomemo
+quiz_00.gat mapflag nomemo
+quiz_01.gat mapflag nomemo
+sec_in01.gat mapflag nomemo
+sec_in02.gat mapflag nomemo
+//hunter_1-1.gat mapflag nomemo
+//hunter_2-1.gat mapflag nomemo
+//hunter_3-1.gat mapflag nomemo
+//knight_1-1.gat mapflag nomemo
+//knight_2-1.gat mapflag nomemo
+//knight_3-1.gat mapflag nomemo
+//priest_1-1.gat mapflag nomemo
+//priest_2-1.gat mapflag nomemo
+//priest_3-1.gat mapflag nomemo
+prt_are_in.gat mapflag nomemo
+prt_are_in.gat mapflag nomemo
+prt_are01.gat mapflag nomemo
+//wizard_1-1.gat mapflag nomemo
+//wizard_2-1.gat mapflag nomemo
+//wizard_3-1.gat mapflag nomemo
+
+// PvP Arenas ================
+pvp_y_room.gat mapflag nomemo
+pvp_y_1-1.gat mapflag nomemo
+pvp_y_1-2.gat mapflag nomemo
+pvp_y_1-3.gat mapflag nomemo
+pvp_y_1-4.gat mapflag nomemo
+pvp_y_1-5.gat mapflag nomemo
+pvp_y_2-1.gat mapflag nomemo
+pvp_y_2-2.gat mapflag nomemo
+pvp_y_2-3.gat mapflag nomemo
+pvp_y_2-4.gat mapflag nomemo
+pvp_y_2-5.gat mapflag nomemo
+pvp_y_3-1.gat mapflag nomemo
+pvp_y_3-2.gat mapflag nomemo
+pvp_y_3-3.gat mapflag nomemo
+pvp_y_3-4.gat mapflag nomemo
+pvp_y_3-5.gat mapflag nomemo
+pvp_y_4-1.gat mapflag nomemo
+pvp_y_4-2.gat mapflag nomemo
+pvp_y_4-3.gat mapflag nomemo
+pvp_y_4-4.gat mapflag nomemo
+pvp_y_4-5.gat mapflag nomemo
+pvp_y_5-1.gat mapflag nomemo
+pvp_y_5-2.gat mapflag nomemo
+pvp_y_5-3.gat mapflag nomemo
+pvp_y_5-4.gat mapflag nomemo
+pvp_y_5-5.gat mapflag nomemo
+pvp_y_6-1.gat mapflag nomemo
+pvp_y_6-2.gat mapflag nomemo
+pvp_y_6-3.gat mapflag nomemo
+pvp_y_6-4.gat mapflag nomemo
+pvp_y_6-5.gat mapflag nomemo
+pvp_y_7-1.gat mapflag nomemo
+pvp_y_7-2.gat mapflag nomemo
+pvp_y_7-3.gat mapflag nomemo
+pvp_y_7-4.gat mapflag nomemo
+pvp_y_7-5.gat mapflag nomemo
+pvp_y_8-1.gat mapflag nomemo
+pvp_y_8-2.gat mapflag nomemo
+pvp_y_8-3.gat mapflag nomemo
+pvp_y_8-4.gat mapflag nomemo
+pvp_y_8-5.gat mapflag nomemo
+pvp_n_room.gat mapflag nomemo
+pvp_n_1-1.gat mapflag nomemo
+pvp_n_1-2.gat mapflag nomemo
+pvp_n_1-3.gat mapflag nomemo
+pvp_n_1-4.gat mapflag nomemo
+pvp_n_1-5.gat mapflag nomemo
+pvp_n_2-1.gat mapflag nomemo
+pvp_n_2-2.gat mapflag nomemo
+pvp_n_2-3.gat mapflag nomemo
+pvp_n_2-4.gat mapflag nomemo
+pvp_n_2-5.gat mapflag nomemo
+pvp_n_3-1.gat mapflag nomemo
+pvp_n_3-2.gat mapflag nomemo
+pvp_n_3-3.gat mapflag nomemo
+pvp_n_3-4.gat mapflag nomemo
+pvp_n_3-5.gat mapflag nomemo
+pvp_n_4-1.gat mapflag nomemo
+pvp_n_4-2.gat mapflag nomemo
+pvp_n_4-3.gat mapflag nomemo
+pvp_n_4-4.gat mapflag nomemo
+pvp_n_4-5.gat mapflag nomemo
+pvp_n_5-1.gat mapflag nomemo
+pvp_n_5-2.gat mapflag nomemo
+pvp_n_5-3.gat mapflag nomemo
+pvp_n_5-4.gat mapflag nomemo
+pvp_n_5-5.gat mapflag nomemo
+pvp_n_6-1.gat mapflag nomemo
+pvp_n_6-2.gat mapflag nomemo
+pvp_n_6-3.gat mapflag nomemo
+pvp_n_6-4.gat mapflag nomemo
+pvp_n_6-5.gat mapflag nomemo
+pvp_n_7-1.gat mapflag nomemo
+pvp_n_7-2.gat mapflag nomemo
+pvp_n_7-3.gat mapflag nomemo
+pvp_n_7-4.gat mapflag nomemo
+pvp_n_7-5.gat mapflag nomemo
+pvp_n_8-1.gat mapflag nomemo
+pvp_n_8-2.gat mapflag nomemo
+pvp_n_8-3.gat mapflag nomemo
+pvp_n_8-4.gat mapflag nomemo
+pvp_n_8-5.gat mapflag nomemo
+pvp_2vs2.gat mapflag nomemo
diff --git a/conf-tmpl/mapflag/nopenalty.txt b/conf-tmpl/mapflag/nopenalty.txt
index 6328e8c4f..0952441d0 100644
--- a/conf-tmpl/mapflag/nopenalty.txt
+++ b/conf-tmpl/mapflag/nopenalty.txt
@@ -1,226 +1,226 @@
-//===== eAthena Script =======================================
-//= Map flags that disable exp. penalty on death.
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.2 [Lupus]
-//===== Current Version: =====================================
-
-
-// Towns ====================>\\
-ayo_in01.gat mapflag nopenalty
-ayo_in02.gat mapflag nopenalty
-alb_ship.gat mapflag nopenalty
-alberta.gat mapflag nopenalty
-alberta_in.gat mapflag nopenalty
-aldebaran.gat mapflag nopenalty
-aldeba_in.gat mapflag nopenalty
-amatsu.gat mapflag nopenalty
-ama_in01.gat mapflag nopenalty
-ama_in02.gat mapflag nopenalty
-ama_test.gat mapflag nopenalty
-arena_room.gat mapflag nopenalty
-comodo.gat mapflag nopenalty
-cmd_in01.gat mapflag nopenalty
-cmd_in02.gat mapflag nopenalty
-geffen.gat mapflag nopenalty
-gef_dun03.gat mapflag nopenalty
-gef_tower.gat mapflag nopenalty
-geffen_in.gat mapflag nopenalty
-gonryun.gat mapflag nopenalty
-gon_in.gat mapflag nopenalty
-gon_test.gat mapflag nopenalty
-hugel.gat mapflag nopenalty
-in_orcs01.gat mapflag nopenalty
-izlude.gat mapflag nopenalty
-izlude_in.gat mapflag nopenalty
-jawaii.gat mapflag nopenalty
-jawaii_in.gat mapflag nopenalty
-lighthalzen.gat mapflag nopenalty
-louyang.gat mapflag nopenalty
-lou_in01.gat mapflag nopenalty
-lou_in02.gat mapflag nopenalty
-morocc.gat mapflag nopenalty
-moc_castle.gat mapflag nopenalty
-morocc_in.gat mapflag nopenalty
-new_zone01.gat mapflag nopenalty
-new_zone02.gat mapflag nopenalty
-new_zone03.gat mapflag nopenalty
-new_zone04.gat mapflag nopenalty
-nif_in.gat mapflag nopenalty
-pay_arche.gat mapflag nopenalty
-payon.gat mapflag nopenalty
-payon_in01.gat mapflag nopenalty
-payon_in02.gat mapflag nopenalty
-payon_in03.gat mapflag nopenalty
-prontera.gat mapflag nopenalty
-prt_are_in.gat mapflag nopenalty
-prt_are01.gat mapflag nopenalty
-prt_castle.gat mapflag nopenalty
-prt_church.gat mapflag nopenalty
-prt_in.gat mapflag nopenalty
-umbala.gat mapflag nopenalty
-um_in.gat mapflag nopenalty
-xmas.gat mapflag nopenalty
-xmas_in.gat mapflag nopenalty
-yuno.gat mapflag nopenalty
-yuno_in01.gat mapflag nopenalty
-yuno_in02.gat mapflag nopenalty
-yuno_in03.gat mapflag nopenalty
-yuno_in04.gat mapflag nopenalty
-yuno_in05.gat mapflag nopenalty
-yuno_pre.gat mapflag nopenalty
-y_airport.gat mapflag nopenalty
-lhz_airport.gat mapflag nopenalty
-lhz_in01.gat mapflag nopenalty
-lhz_in02.gat mapflag nopenalty
-lhz_in03.gat mapflag nopenalty
-rachel.gat mapflag nopenalty
-ra_in01.gat mapflag nopenalty
-ra_temin.gat mapflag nopenalty
-ra_temple.gat mapflag nopenalty
-ra_temsky.gat mapflag nopenalty
-que_rachel.gat mapflag nopenalty
-airplane.gat mapflag nopenalty
-airport.gat mapflag nopenalty
-einbech.gat mapflag nopenalty
-einbroch.gat mapflag nopenalty
-ein_in01.gat mapflag nopenalty
-job_soul.gat mapflag nopenalty
-job_star.gat mapflag nopenalty
-auction_01.gat mapflag nopenalty
-auction_02.gat mapflag nopenalty
-hu_in01.gat mapflag nopenalty
-que_ng.gat mapflag nopenalty
-kh_mansion.gat mapflag nopenalty
-kh_rossi.gat mapflag nopenalty
-kh_school.gat mapflag nopenalty
-kh_vila.gat mapflag nopenalty
-ayothaya.gat mapflag nopenalty
-
-// Job Quests ========================
-job_sword1.gat mapflag nopenalty
-job_thief1.gat mapflag nopenalty
-// 2-1 -----------------------
-job_prist.gat mapflag nopenalty
-job_wiz.gat mapflag nopenalty
-job_hunte.gat mapflag nopenalty
-in_hunter.gat mapflag nopenalty
-in_moc_16.gat mapflag nopenalty
-// 2-2 --------------------
-alde_alche.gat mapflag nopenalty
-job_cru.gat mapflag nopenalty
-job_duncer.gat mapflag nopenalty
-job_monk.gat mapflag nopenalty
-monk_test.gat mapflag nopenalty
-monk_in.gat mapflag nopenalty
-in_rogue.gat mapflag nopenalty
-job_sage.gat mapflag nopenalty
-
-// Misc Quests =======================
-que_sign01.gat mapflag nopenalty
-que_sign02.gat mapflag nopenalty
-
-// GvG Arenas ===================
-guild_vs1.gat mapflag nopenalty
-guild_vs2.gat mapflag nopenalty
-guild_vs3.gat mapflag nopenalty
-guild_vs4.gat mapflag nopenalty
-guild_vs5.gat mapflag nopenalty
-
-// Arenas=======================>\\
-sec_in01.gat mapflag nopenalty
-sec_in02.gat mapflag nopenalty
-
-// Izlude Arena ========================
-force_1-1.gat mapflag nopenalty
-force_1-2.gat mapflag nopenalty
-force_1-3.gat mapflag nopenalty
-force_2-1.gat mapflag nopenalty
-force_2-2.gat mapflag nopenalty
-force_2-3.gat mapflag nopenalty
-force_3-1.gat mapflag nopenalty
-force_3-2.gat mapflag nopenalty
-force_3-3.gat mapflag nopenalty
-
-// PvP Arenas =========================
-pvp_y_1-1.gat mapflag nopenalty
-pvp_y_1-2.gat mapflag nopenalty
-pvp_y_1-3.gat mapflag nopenalty
-pvp_y_1-4.gat mapflag nopenalty
-pvp_y_1-5.gat mapflag nopenalty
-pvp_y_2-1.gat mapflag nopenalty
-pvp_y_2-2.gat mapflag nopenalty
-pvp_y_2-3.gat mapflag nopenalty
-pvp_y_2-4.gat mapflag nopenalty
-pvp_y_2-5.gat mapflag nopenalty
-pvp_y_3-1.gat mapflag nopenalty
-pvp_y_3-2.gat mapflag nopenalty
-pvp_y_3-3.gat mapflag nopenalty
-pvp_y_3-4.gat mapflag nopenalty
-pvp_y_3-5.gat mapflag nopenalty
-pvp_y_4-1.gat mapflag nopenalty
-pvp_y_4-2.gat mapflag nopenalty
-pvp_y_4-3.gat mapflag nopenalty
-pvp_y_4-4.gat mapflag nopenalty
-pvp_y_4-5.gat mapflag nopenalty
-pvp_y_5-1.gat mapflag nopenalty
-pvp_y_5-2.gat mapflag nopenalty
-pvp_y_5-3.gat mapflag nopenalty
-pvp_y_5-4.gat mapflag nopenalty
-pvp_y_5-5.gat mapflag nopenalty
-pvp_y_6-1.gat mapflag nopenalty
-pvp_y_6-2.gat mapflag nopenalty
-pvp_y_6-3.gat mapflag nopenalty
-pvp_y_6-4.gat mapflag nopenalty
-pvp_y_6-5.gat mapflag nopenalty
-pvp_y_7-1.gat mapflag nopenalty
-pvp_y_7-2.gat mapflag nopenalty
-pvp_y_7-3.gat mapflag nopenalty
-pvp_y_7-4.gat mapflag nopenalty
-pvp_y_7-5.gat mapflag nopenalty
-pvp_y_8-1.gat mapflag nopenalty
-pvp_y_8-2.gat mapflag nopenalty
-pvp_y_8-3.gat mapflag nopenalty
-pvp_y_8-4.gat mapflag nopenalty
-pvp_y_8-5.gat mapflag nopenalty
-pvp_n_1-1.gat mapflag nopenalty
-pvp_n_1-2.gat mapflag nopenalty
-pvp_n_1-3.gat mapflag nopenalty
-pvp_n_1-4.gat mapflag nopenalty
-pvp_n_1-5.gat mapflag nopenalty
-pvp_n_2-1.gat mapflag nopenalty
-pvp_n_2-2.gat mapflag nopenalty
-pvp_n_2-3.gat mapflag nopenalty
-pvp_n_2-4.gat mapflag nopenalty
-pvp_n_2-5.gat mapflag nopenalty
-pvp_n_3-1.gat mapflag nopenalty
-pvp_n_3-2.gat mapflag nopenalty
-pvp_n_3-3.gat mapflag nopenalty
-pvp_n_3-4.gat mapflag nopenalty
-pvp_n_3-5.gat mapflag nopenalty
-pvp_n_4-1.gat mapflag nopenalty
-pvp_n_4-2.gat mapflag nopenalty
-pvp_n_4-3.gat mapflag nopenalty
-pvp_n_4-4.gat mapflag nopenalty
-pvp_n_4-5.gat mapflag nopenalty
-pvp_n_5-1.gat mapflag nopenalty
-pvp_n_5-2.gat mapflag nopenalty
-pvp_n_5-3.gat mapflag nopenalty
-pvp_n_5-4.gat mapflag nopenalty
-pvp_n_5-5.gat mapflag nopenalty
-pvp_n_6-1.gat mapflag nopenalty
-pvp_n_6-2.gat mapflag nopenalty
-pvp_n_6-3.gat mapflag nopenalty
-pvp_n_6-4.gat mapflag nopenalty
-pvp_n_6-5.gat mapflag nopenalty
-pvp_n_7-1.gat mapflag nopenalty
-pvp_n_7-2.gat mapflag nopenalty
-pvp_n_7-3.gat mapflag nopenalty
-pvp_n_7-4.gat mapflag nopenalty
-pvp_n_7-5.gat mapflag nopenalty
-pvp_n_8-1.gat mapflag nopenalty
-pvp_n_8-2.gat mapflag nopenalty
-pvp_n_8-3.gat mapflag nopenalty
-pvp_n_8-4.gat mapflag nopenalty
-pvp_n_8-5.gat mapflag nopenalty
+//===== eAthena Script =======================================
+//= Map flags that disable exp. penalty on death.
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.2 [Lupus]
+//===== Current Version: =====================================
+
+
+// Towns ====================>\\
+ayo_in01.gat mapflag nopenalty
+ayo_in02.gat mapflag nopenalty
+alb_ship.gat mapflag nopenalty
+alberta.gat mapflag nopenalty
+alberta_in.gat mapflag nopenalty
+aldebaran.gat mapflag nopenalty
+aldeba_in.gat mapflag nopenalty
+amatsu.gat mapflag nopenalty
+ama_in01.gat mapflag nopenalty
+ama_in02.gat mapflag nopenalty
+ama_test.gat mapflag nopenalty
+arena_room.gat mapflag nopenalty
+comodo.gat mapflag nopenalty
+cmd_in01.gat mapflag nopenalty
+cmd_in02.gat mapflag nopenalty
+geffen.gat mapflag nopenalty
+gef_dun03.gat mapflag nopenalty
+gef_tower.gat mapflag nopenalty
+geffen_in.gat mapflag nopenalty
+gonryun.gat mapflag nopenalty
+gon_in.gat mapflag nopenalty
+gon_test.gat mapflag nopenalty
+hugel.gat mapflag nopenalty
+in_orcs01.gat mapflag nopenalty
+izlude.gat mapflag nopenalty
+izlude_in.gat mapflag nopenalty
+jawaii.gat mapflag nopenalty
+jawaii_in.gat mapflag nopenalty
+lighthalzen.gat mapflag nopenalty
+louyang.gat mapflag nopenalty
+lou_in01.gat mapflag nopenalty
+lou_in02.gat mapflag nopenalty
+morocc.gat mapflag nopenalty
+moc_castle.gat mapflag nopenalty
+morocc_in.gat mapflag nopenalty
+new_zone01.gat mapflag nopenalty
+new_zone02.gat mapflag nopenalty
+new_zone03.gat mapflag nopenalty
+new_zone04.gat mapflag nopenalty
+nif_in.gat mapflag nopenalty
+pay_arche.gat mapflag nopenalty
+payon.gat mapflag nopenalty
+payon_in01.gat mapflag nopenalty
+payon_in02.gat mapflag nopenalty
+payon_in03.gat mapflag nopenalty
+prontera.gat mapflag nopenalty
+prt_are_in.gat mapflag nopenalty
+prt_are01.gat mapflag nopenalty
+prt_castle.gat mapflag nopenalty
+prt_church.gat mapflag nopenalty
+prt_in.gat mapflag nopenalty
+umbala.gat mapflag nopenalty
+um_in.gat mapflag nopenalty
+xmas.gat mapflag nopenalty
+xmas_in.gat mapflag nopenalty
+yuno.gat mapflag nopenalty
+yuno_in01.gat mapflag nopenalty
+yuno_in02.gat mapflag nopenalty
+yuno_in03.gat mapflag nopenalty
+yuno_in04.gat mapflag nopenalty
+yuno_in05.gat mapflag nopenalty
+yuno_pre.gat mapflag nopenalty
+y_airport.gat mapflag nopenalty
+lhz_airport.gat mapflag nopenalty
+lhz_in01.gat mapflag nopenalty
+lhz_in02.gat mapflag nopenalty
+lhz_in03.gat mapflag nopenalty
+rachel.gat mapflag nopenalty
+ra_in01.gat mapflag nopenalty
+ra_temin.gat mapflag nopenalty
+ra_temple.gat mapflag nopenalty
+ra_temsky.gat mapflag nopenalty
+que_rachel.gat mapflag nopenalty
+airplane.gat mapflag nopenalty
+airport.gat mapflag nopenalty
+einbech.gat mapflag nopenalty
+einbroch.gat mapflag nopenalty
+ein_in01.gat mapflag nopenalty
+job_soul.gat mapflag nopenalty
+job_star.gat mapflag nopenalty
+auction_01.gat mapflag nopenalty
+auction_02.gat mapflag nopenalty
+hu_in01.gat mapflag nopenalty
+que_ng.gat mapflag nopenalty
+kh_mansion.gat mapflag nopenalty
+kh_rossi.gat mapflag nopenalty
+kh_school.gat mapflag nopenalty
+kh_vila.gat mapflag nopenalty
+ayothaya.gat mapflag nopenalty
+
+// Job Quests ========================
+job_sword1.gat mapflag nopenalty
+job_thief1.gat mapflag nopenalty
+// 2-1 -----------------------
+job_prist.gat mapflag nopenalty
+job_wiz.gat mapflag nopenalty
+job_hunte.gat mapflag nopenalty
+in_hunter.gat mapflag nopenalty
+in_moc_16.gat mapflag nopenalty
+// 2-2 --------------------
+alde_alche.gat mapflag nopenalty
+job_cru.gat mapflag nopenalty
+job_duncer.gat mapflag nopenalty
+job_monk.gat mapflag nopenalty
+monk_test.gat mapflag nopenalty
+monk_in.gat mapflag nopenalty
+in_rogue.gat mapflag nopenalty
+job_sage.gat mapflag nopenalty
+
+// Misc Quests =======================
+que_sign01.gat mapflag nopenalty
+que_sign02.gat mapflag nopenalty
+
+// GvG Arenas ===================
+guild_vs1.gat mapflag nopenalty
+guild_vs2.gat mapflag nopenalty
+guild_vs3.gat mapflag nopenalty
+guild_vs4.gat mapflag nopenalty
+guild_vs5.gat mapflag nopenalty
+
+// Arenas=======================>\\
+sec_in01.gat mapflag nopenalty
+sec_in02.gat mapflag nopenalty
+
+// Izlude Arena ========================
+force_1-1.gat mapflag nopenalty
+force_1-2.gat mapflag nopenalty
+force_1-3.gat mapflag nopenalty
+force_2-1.gat mapflag nopenalty
+force_2-2.gat mapflag nopenalty
+force_2-3.gat mapflag nopenalty
+force_3-1.gat mapflag nopenalty
+force_3-2.gat mapflag nopenalty
+force_3-3.gat mapflag nopenalty
+
+// PvP Arenas =========================
+pvp_y_1-1.gat mapflag nopenalty
+pvp_y_1-2.gat mapflag nopenalty
+pvp_y_1-3.gat mapflag nopenalty
+pvp_y_1-4.gat mapflag nopenalty
+pvp_y_1-5.gat mapflag nopenalty
+pvp_y_2-1.gat mapflag nopenalty
+pvp_y_2-2.gat mapflag nopenalty
+pvp_y_2-3.gat mapflag nopenalty
+pvp_y_2-4.gat mapflag nopenalty
+pvp_y_2-5.gat mapflag nopenalty
+pvp_y_3-1.gat mapflag nopenalty
+pvp_y_3-2.gat mapflag nopenalty
+pvp_y_3-3.gat mapflag nopenalty
+pvp_y_3-4.gat mapflag nopenalty
+pvp_y_3-5.gat mapflag nopenalty
+pvp_y_4-1.gat mapflag nopenalty
+pvp_y_4-2.gat mapflag nopenalty
+pvp_y_4-3.gat mapflag nopenalty
+pvp_y_4-4.gat mapflag nopenalty
+pvp_y_4-5.gat mapflag nopenalty
+pvp_y_5-1.gat mapflag nopenalty
+pvp_y_5-2.gat mapflag nopenalty
+pvp_y_5-3.gat mapflag nopenalty
+pvp_y_5-4.gat mapflag nopenalty
+pvp_y_5-5.gat mapflag nopenalty
+pvp_y_6-1.gat mapflag nopenalty
+pvp_y_6-2.gat mapflag nopenalty
+pvp_y_6-3.gat mapflag nopenalty
+pvp_y_6-4.gat mapflag nopenalty
+pvp_y_6-5.gat mapflag nopenalty
+pvp_y_7-1.gat mapflag nopenalty
+pvp_y_7-2.gat mapflag nopenalty
+pvp_y_7-3.gat mapflag nopenalty
+pvp_y_7-4.gat mapflag nopenalty
+pvp_y_7-5.gat mapflag nopenalty
+pvp_y_8-1.gat mapflag nopenalty
+pvp_y_8-2.gat mapflag nopenalty
+pvp_y_8-3.gat mapflag nopenalty
+pvp_y_8-4.gat mapflag nopenalty
+pvp_y_8-5.gat mapflag nopenalty
+pvp_n_1-1.gat mapflag nopenalty
+pvp_n_1-2.gat mapflag nopenalty
+pvp_n_1-3.gat mapflag nopenalty
+pvp_n_1-4.gat mapflag nopenalty
+pvp_n_1-5.gat mapflag nopenalty
+pvp_n_2-1.gat mapflag nopenalty
+pvp_n_2-2.gat mapflag nopenalty
+pvp_n_2-3.gat mapflag nopenalty
+pvp_n_2-4.gat mapflag nopenalty
+pvp_n_2-5.gat mapflag nopenalty
+pvp_n_3-1.gat mapflag nopenalty
+pvp_n_3-2.gat mapflag nopenalty
+pvp_n_3-3.gat mapflag nopenalty
+pvp_n_3-4.gat mapflag nopenalty
+pvp_n_3-5.gat mapflag nopenalty
+pvp_n_4-1.gat mapflag nopenalty
+pvp_n_4-2.gat mapflag nopenalty
+pvp_n_4-3.gat mapflag nopenalty
+pvp_n_4-4.gat mapflag nopenalty
+pvp_n_4-5.gat mapflag nopenalty
+pvp_n_5-1.gat mapflag nopenalty
+pvp_n_5-2.gat mapflag nopenalty
+pvp_n_5-3.gat mapflag nopenalty
+pvp_n_5-4.gat mapflag nopenalty
+pvp_n_5-5.gat mapflag nopenalty
+pvp_n_6-1.gat mapflag nopenalty
+pvp_n_6-2.gat mapflag nopenalty
+pvp_n_6-3.gat mapflag nopenalty
+pvp_n_6-4.gat mapflag nopenalty
+pvp_n_6-5.gat mapflag nopenalty
+pvp_n_7-1.gat mapflag nopenalty
+pvp_n_7-2.gat mapflag nopenalty
+pvp_n_7-3.gat mapflag nopenalty
+pvp_n_7-4.gat mapflag nopenalty
+pvp_n_7-5.gat mapflag nopenalty
+pvp_n_8-1.gat mapflag nopenalty
+pvp_n_8-2.gat mapflag nopenalty
+pvp_n_8-3.gat mapflag nopenalty
+pvp_n_8-4.gat mapflag nopenalty
+pvp_n_8-5.gat mapflag nopenalty
pvp_2vs2.gat mapflag nopenalty \ No newline at end of file
diff --git a/conf-tmpl/mapflag/nopvp.txt b/conf-tmpl/mapflag/nopvp.txt
index cfb0d6490..a77fe9a02 100644
--- a/conf-tmpl/mapflag/nopvp.txt
+++ b/conf-tmpl/mapflag/nopvp.txt
@@ -1,78 +1,78 @@
-///===== Description: =============================================
-//= pvp off: Disables Player versus Player mode.
-//= To disable PvP mode on a specific map add the mapname here.
-//= v 1.1
-//============================================================
-
-ayo_in01.gat mapflag pvp off
-ayo_in02.gat mapflag pvp off
-alberta_in.gat mapflag pvp off
-alberta.gat mapflag pvp off
-alde_alche.gat mapflag pvp off
-aldeba_in.gat mapflag pvp off
-aldebaran.gat mapflag pvp off
-ama_in01.gat mapflag pvp off
-ama_in02.gat mapflag pvp off
-amatsu.gat mapflag pvp off
-cmd_in01.gat mapflag pvp off
-cmd_in02.gat mapflag pvp off
-comodo.gat mapflag pvp off
-gef_tower.gat mapflag pvp off
-geffen.gat mapflag pvp off
-geffen_in.gat mapflag pvp off
-gon_in.gat mapflag pvp off
-gonryun.gat mapflag pvp off
-gon_test.gat mapflag pvp off
-in_hunter.gat mapflag pvp off
-in_moc_16.gat mapflag pvp off
-in_orcs01.gat mapflag pvp off
-izlude_in.gat mapflag pvp off
-izlude.gat mapflag pvp off
-hugel.gat mapflag pvp off
-hu_in01.gat mapflag pvp off
-lighthalzen.gat mapflag pvp off
-lhz_airport.gat mapflag pvp off
-lhz_in01.gat mapflag pvp off
-lhz_in02.gat mapflag pvp off
-lhz_in03.gat mapflag pvp off
-louyang.gat mapflag pvp off
-lou_in01.gat mapflag pvp off
-lou_in02.gat mapflag pvp off
-moc_castle.gat mapflag pvp off
-monk_in.gat mapflag pvp off
-morocc_in.gat mapflag pvp off
-morocc.gat mapflag pvp off
-nif_in.gat mapflag pvp off
-payon_in01.gat mapflag pvp off
-payon_in02.gat mapflag pvp off
-payon_in03.gat mapflag pvp off
-payon.gat mapflag pvp off
-pay_arche.gat mapflag pvp off
-prt_are_in.gat mapflag pvp off
-prt_are01.gat mapflag pvp off
-prt_castle.gat mapflag pvp off
-prt_church.gat mapflag pvp off
-prt_in.gat mapflag pvp off
-prontera.gat mapflag pvp off
-sec_in01.gat mapflag pvp off
-job_sword1.gat mapflag pvp off
-um_in.gat mapflag pvp off
-umbala.gat mapflag pvp off
-xmas_in.gat mapflag pvp off
-xmas.gat mapflag pvp off
-yuno_in01.gat mapflag pvp off
-yuno_in03.gat mapflag pvp off
-yuno_in04.gat mapflag pvp off
-yuno_in05.gat mapflag pvp off
-yuno.gat mapflag pvp off
-yuno_pre.gat mapflag pvp off
-y_airport.gat mapflag pvp off
-rachel.gat mapflag pvp off
-ra_in01.gat mapflag pvp off
-ra_temin.gat mapflag pvp off
-airplane.gat mapflag pvp off
-airport.gat mapflag pvp off
-einbech.gat mapflag pvp off
-einbroch.gat mapflag pvp off
-ein_in01.gat mapflag pvp off
+///===== Description: =============================================
+//= pvp off: Disables Player versus Player mode.
+//= To disable PvP mode on a specific map add the mapname here.
+//= v 1.1
+//============================================================
+
+ayo_in01.gat mapflag pvp off
+ayo_in02.gat mapflag pvp off
+alberta_in.gat mapflag pvp off
+alberta.gat mapflag pvp off
+alde_alche.gat mapflag pvp off
+aldeba_in.gat mapflag pvp off
+aldebaran.gat mapflag pvp off
+ama_in01.gat mapflag pvp off
+ama_in02.gat mapflag pvp off
+amatsu.gat mapflag pvp off
+cmd_in01.gat mapflag pvp off
+cmd_in02.gat mapflag pvp off
+comodo.gat mapflag pvp off
+gef_tower.gat mapflag pvp off
+geffen.gat mapflag pvp off
+geffen_in.gat mapflag pvp off
+gon_in.gat mapflag pvp off
+gonryun.gat mapflag pvp off
+gon_test.gat mapflag pvp off
+in_hunter.gat mapflag pvp off
+in_moc_16.gat mapflag pvp off
+in_orcs01.gat mapflag pvp off
+izlude_in.gat mapflag pvp off
+izlude.gat mapflag pvp off
+hugel.gat mapflag pvp off
+hu_in01.gat mapflag pvp off
+lighthalzen.gat mapflag pvp off
+lhz_airport.gat mapflag pvp off
+lhz_in01.gat mapflag pvp off
+lhz_in02.gat mapflag pvp off
+lhz_in03.gat mapflag pvp off
+louyang.gat mapflag pvp off
+lou_in01.gat mapflag pvp off
+lou_in02.gat mapflag pvp off
+moc_castle.gat mapflag pvp off
+monk_in.gat mapflag pvp off
+morocc_in.gat mapflag pvp off
+morocc.gat mapflag pvp off
+nif_in.gat mapflag pvp off
+payon_in01.gat mapflag pvp off
+payon_in02.gat mapflag pvp off
+payon_in03.gat mapflag pvp off
+payon.gat mapflag pvp off
+pay_arche.gat mapflag pvp off
+prt_are_in.gat mapflag pvp off
+prt_are01.gat mapflag pvp off
+prt_castle.gat mapflag pvp off
+prt_church.gat mapflag pvp off
+prt_in.gat mapflag pvp off
+prontera.gat mapflag pvp off
+sec_in01.gat mapflag pvp off
+job_sword1.gat mapflag pvp off
+um_in.gat mapflag pvp off
+umbala.gat mapflag pvp off
+xmas_in.gat mapflag pvp off
+xmas.gat mapflag pvp off
+yuno_in01.gat mapflag pvp off
+yuno_in03.gat mapflag pvp off
+yuno_in04.gat mapflag pvp off
+yuno_in05.gat mapflag pvp off
+yuno.gat mapflag pvp off
+yuno_pre.gat mapflag pvp off
+y_airport.gat mapflag pvp off
+rachel.gat mapflag pvp off
+ra_in01.gat mapflag pvp off
+ra_temin.gat mapflag pvp off
+airplane.gat mapflag pvp off
+airport.gat mapflag pvp off
+einbech.gat mapflag pvp off
+einbroch.gat mapflag pvp off
+ein_in01.gat mapflag pvp off
ayothaya.gat mapflag pvp off \ No newline at end of file
diff --git a/conf-tmpl/mapflag/noreturn.txt b/conf-tmpl/mapflag/noreturn.txt
index 1dd044fb4..fdb862381 100644
--- a/conf-tmpl/mapflag/noreturn.txt
+++ b/conf-tmpl/mapflag/noreturn.txt
@@ -1,226 +1,226 @@
-//===== eAthena Script =======================================
-//= Map flags that disable use of Butterfly wings
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.4 [Lupus]
-//===== Notes: ===============================================
-//= For disabling Fly wings use noteleport
-//= 1.3 According to the patch, enabled Butterfly wings in the Castles [Lupus]
-//= 1.4 Enabled Butterfly wings on PvP maps. [Skotlex]
-//===== Current Version: =====================================
-
-// Cities ========================
-ayo_in01.gat mapflag noreturn
-ayo_in02.gat mapflag noreturn
-alb_ship.gat mapflag noreturn
-alberta_in.gat mapflag noreturn
-aldeba_in.gat mapflag noreturn
-ama_in01.gat mapflag noreturn
-ama_in02.gat mapflag noreturn
-ama_test.gat mapflag noreturn
-cmd_in01.gat mapflag noreturn
-cmd_in02.gat mapflag noreturn
-gef_tower.gat mapflag noreturn
-geffen_in.gat mapflag noreturn
-gon_test.gat mapflag noreturn
-gon_in.gat mapflag noreturn
-in_orcs01.gat mapflag noreturn
-izlude_in.gat mapflag noreturn
-hu_in01.gat mapflag noreturn
-jawaii_in.gat mapflag noreturn
-lou_in01.gat mapflag noreturn
-lou_in02.gat mapflag noreturn
-moc_castle.gat mapflag noreturn
-morocc_in.gat mapflag noreturn
-new_zone01.gat mapflag noreturn
-new_zone02.gat mapflag noreturn
-new_zone03.gat mapflag noreturn
-new_zone04.gat mapflag noreturn
-nif_in.gat mapflag noreturn
-payon_in01.gat mapflag noreturn
-payon_in02.gat mapflag noreturn
-payon_in03.gat mapflag noreturn
-prt_are_in.gat mapflag noreturn
-prt_are01.gat mapflag noreturn
-prt_castle.gat mapflag noreturn
-prt_church.gat mapflag noreturn
-prt_in.gat mapflag noreturn
-um_in.gat mapflag noreturn
-xmas_in.gat mapflag noreturn
-yuno_in01.gat mapflag noreturn
-yuno_in03.gat mapflag noreturn
-yuno_in04.gat mapflag noreturn
-yuno_in05.gat mapflag noreturn
-que_sign01.gat mapflag noreturn
-ein_in01.gat mapflag noreturn
-airport.gat mapflag noreturn
-airplane.gat mapflag noreturn
-airplane_01.gat mapflag noreturn
-ra_in01.gat mapflag noreturn
-ra_temin.gat mapflag noreturn
-que_rachel.gat mapflag noreturn
-
-// New areas
-yuno_pre.gat mapflag noreturn
-y_airport.gat mapflag noreturn
-lhz_airport.gat mapflag noreturn
-lhz_in01.gat mapflag noreturn
-lhz_in02.gat mapflag noreturn
-lhz_in03.gat mapflag noreturn
-lhz_que01.gat mapflag noreturn
-kh_mansion.gat mapflag noreturn
-kh_rossi.gat mapflag noreturn
-kh_school.gat mapflag noreturn
-kh_vila.gat mapflag noreturn
-
-// Job Quests ====================
-job_sword1.gat mapflag noreturn
-job_thief1.gat mapflag noreturn
-// 2-1 -----------------------
-job_hunte.gat mapflag noreturn
-job_prist.gat mapflag noreturn
-job_wiz.gat mapflag noreturn
-in_hunter.gat mapflag noreturn
-in_moc_16.gat mapflag noreturn
-// 2-2 --------------------
-alde_alche.gat mapflag noreturn
-job_cru.gat mapflag noreturn
-job_duncer.gat mapflag noreturn
-job_monk.gat mapflag noreturn
-monk_test.gat mapflag noreturn
-monk_in.gat mapflag noreturn
-in_rogue.gat mapflag noreturn
-job_sage.gat mapflag noreturn
-que_ng.gat mapflag noreturn
-
-// Special Quests Places =========
-que_god01.gat mapflag noreturn
-que_god02.gat mapflag noreturn
-que_bingo.gat mapflag noreturn
-que_hugel.gat mapflag noreturn
-poring_c01.gat mapflag noreturn
-poring_c02.gat mapflag noreturn
-
-// Guild Castles =================
-//= 1.3 According to the kRO patch, enabled Butterfly wings in the Castles
-//aldeg_cas01.gat mapflag noreturn
-//aldeg_cas02.gat mapflag noreturn
-//aldeg_cas03.gat mapflag noreturn
-//aldeg_cas04.gat mapflag noreturn
-//aldeg_cas05.gat mapflag noreturn
-//gefg_cas01.gat mapflag noreturn
-//gefg_cas02.gat mapflag noreturn
-//gefg_cas03.gat mapflag noreturn
-//gefg_cas04.gat mapflag noreturn
-//gefg_cas05.gat mapflag noreturn
-//payg_cas01.gat mapflag noreturn
-//payg_cas02.gat mapflag noreturn
-//payg_cas03.gat mapflag noreturn
-//payg_cas04.gat mapflag noreturn
-//payg_cas05.gat mapflag noreturn
-//prtg_cas01.gat mapflag noreturn
-//prtg_cas02.gat mapflag noreturn
-//prtg_cas03.gat mapflag noreturn
-//prtg_cas04.gat mapflag noreturn
-//prtg_cas05.gat mapflag noreturn
-//nguild_alde.gat mapflag noreturn
-//nguild_gef.gat mapflag noreturn
-//nguild_pay.gat mapflag noreturn
-//nguild_prt.gat mapflag noreturn
-
-// GvG Arenas ===================
-guild_vs1.gat mapflag noreturn
-guild_vs2.gat mapflag noreturn
-guild_vs3.gat mapflag noreturn
-guild_vs4.gat mapflag noreturn
-guild_vs5.gat mapflag noreturn
-
-// Arenas =====================>\\
-arena_room.gat mapflag noreturn
-sec_in01.gat mapflag noreturn
-sec_in02.gat mapflag noreturn
-
-// PvP Arenas=======================
-pvp_y_room.gat mapflag noreturn
-//pvp_y_1-1.gat mapflag noreturn
-//pvp_y_1-2.gat mapflag noreturn
-//pvp_y_1-3.gat mapflag noreturn
-//pvp_y_1-4.gat mapflag noreturn
-//pvp_y_1-5.gat mapflag noreturn
-//pvp_y_2-1.gat mapflag noreturn
-//pvp_y_2-2.gat mapflag noreturn
-//pvp_y_2-3.gat mapflag noreturn
-//pvp_y_2-4.gat mapflag noreturn
-//pvp_y_2-5.gat mapflag noreturn
-//pvp_y_3-1.gat mapflag noreturn
-//pvp_y_3-2.gat mapflag noreturn
-//pvp_y_3-3.gat mapflag noreturn
-//pvp_y_3-4.gat mapflag noreturn
-//pvp_y_3-5.gat mapflag noreturn
-//pvp_y_4-1.gat mapflag noreturn
-//pvp_y_4-2.gat mapflag noreturn
-//pvp_y_4-3.gat mapflag noreturn
-//pvp_y_4-4.gat mapflag noreturn
-//pvp_y_4-5.gat mapflag noreturn
-//pvp_y_5-1.gat mapflag noreturn
-//pvp_y_5-2.gat mapflag noreturn
-//pvp_y_5-3.gat mapflag noreturn
-//pvp_y_5-4.gat mapflag noreturn
-//pvp_y_5-5.gat mapflag noreturn
-//pvp_y_6-1.gat mapflag noreturn
-//pvp_y_6-2.gat mapflag noreturn
-//pvp_y_6-3.gat mapflag noreturn
-//pvp_y_6-4.gat mapflag noreturn
-//pvp_y_6-5.gat mapflag noreturn
-//pvp_y_7-1.gat mapflag noreturn
-//pvp_y_7-2.gat mapflag noreturn
-//pvp_y_7-3.gat mapflag noreturn
-//pvp_y_7-4.gat mapflag noreturn
-//pvp_y_7-5.gat mapflag noreturn
-//pvp_y_8-1.gat mapflag noreturn
-//pvp_y_8-2.gat mapflag noreturn
-//pvp_y_8-3.gat mapflag noreturn
-//pvp_y_8-4.gat mapflag noreturn
-//pvp_y_8-5.gat mapflag noreturn
-pvp_n_room.gat mapflag noreturn
-//pvp_n_1-1.gat mapflag noreturn
-//pvp_n_1-2.gat mapflag noreturn
-//pvp_n_1-3.gat mapflag noreturn
-//pvp_n_1-4.gat mapflag noreturn
-//pvp_n_1-5.gat mapflag noreturn
-//pvp_n_2-1.gat mapflag noreturn
-//pvp_n_2-2.gat mapflag noreturn
-//pvp_n_2-3.gat mapflag noreturn
-//pvp_n_2-4.gat mapflag noreturn
-//pvp_n_2-5.gat mapflag noreturn
-//pvp_n_3-1.gat mapflag noreturn
-//pvp_n_3-2.gat mapflag noreturn
-//pvp_n_3-3.gat mapflag noreturn
-//pvp_n_3-4.gat mapflag noreturn
-//pvp_n_3-5.gat mapflag noreturn
-//pvp_n_4-1.gat mapflag noreturn
-//pvp_n_4-2.gat mapflag noreturn
-//pvp_n_4-3.gat mapflag noreturn
-//pvp_n_4-4.gat mapflag noreturn
-//pvp_n_4-5.gat mapflag noreturn
-//pvp_n_5-1.gat mapflag noreturn
-//pvp_n_5-2.gat mapflag noreturn
-//pvp_n_5-3.gat mapflag noreturn
-//pvp_n_5-4.gat mapflag noreturn
-//pvp_n_5-5.gat mapflag noreturn
-//pvp_n_6-1.gat mapflag noreturn
-//pvp_n_6-2.gat mapflag noreturn
-//pvp_n_6-3.gat mapflag noreturn
-//pvp_n_6-4.gat mapflag noreturn
-//pvp_n_6-5.gat mapflag noreturn
-//pvp_n_7-1.gat mapflag noreturn
-//pvp_n_7-2.gat mapflag noreturn
-//pvp_n_7-3.gat mapflag noreturn
-//pvp_n_7-4.gat mapflag noreturn
-//pvp_n_7-5.gat mapflag noreturn
-//pvp_n_8-1.gat mapflag noreturn
-//pvp_n_8-2.gat mapflag noreturn
-//pvp_n_8-3.gat mapflag noreturn
-//pvp_n_8-4.gat mapflag noreturn
-//pvp_n_8-5.gat mapflag noreturn
-//pvp_2vs2.gat mapflag noreturn
+//===== eAthena Script =======================================
+//= Map flags that disable use of Butterfly wings
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.4 [Lupus]
+//===== Notes: ===============================================
+//= For disabling Fly wings use noteleport
+//= 1.3 According to the patch, enabled Butterfly wings in the Castles [Lupus]
+//= 1.4 Enabled Butterfly wings on PvP maps. [Skotlex]
+//===== Current Version: =====================================
+
+// Cities ========================
+ayo_in01.gat mapflag noreturn
+ayo_in02.gat mapflag noreturn
+alb_ship.gat mapflag noreturn
+alberta_in.gat mapflag noreturn
+aldeba_in.gat mapflag noreturn
+ama_in01.gat mapflag noreturn
+ama_in02.gat mapflag noreturn
+ama_test.gat mapflag noreturn
+cmd_in01.gat mapflag noreturn
+cmd_in02.gat mapflag noreturn
+gef_tower.gat mapflag noreturn
+geffen_in.gat mapflag noreturn
+gon_test.gat mapflag noreturn
+gon_in.gat mapflag noreturn
+in_orcs01.gat mapflag noreturn
+izlude_in.gat mapflag noreturn
+hu_in01.gat mapflag noreturn
+jawaii_in.gat mapflag noreturn
+lou_in01.gat mapflag noreturn
+lou_in02.gat mapflag noreturn
+moc_castle.gat mapflag noreturn
+morocc_in.gat mapflag noreturn
+new_zone01.gat mapflag noreturn
+new_zone02.gat mapflag noreturn
+new_zone03.gat mapflag noreturn
+new_zone04.gat mapflag noreturn
+nif_in.gat mapflag noreturn
+payon_in01.gat mapflag noreturn
+payon_in02.gat mapflag noreturn
+payon_in03.gat mapflag noreturn
+prt_are_in.gat mapflag noreturn
+prt_are01.gat mapflag noreturn
+prt_castle.gat mapflag noreturn
+prt_church.gat mapflag noreturn
+prt_in.gat mapflag noreturn
+um_in.gat mapflag noreturn
+xmas_in.gat mapflag noreturn
+yuno_in01.gat mapflag noreturn
+yuno_in03.gat mapflag noreturn
+yuno_in04.gat mapflag noreturn
+yuno_in05.gat mapflag noreturn
+que_sign01.gat mapflag noreturn
+ein_in01.gat mapflag noreturn
+airport.gat mapflag noreturn
+airplane.gat mapflag noreturn
+airplane_01.gat mapflag noreturn
+ra_in01.gat mapflag noreturn
+ra_temin.gat mapflag noreturn
+que_rachel.gat mapflag noreturn
+
+// New areas
+yuno_pre.gat mapflag noreturn
+y_airport.gat mapflag noreturn
+lhz_airport.gat mapflag noreturn
+lhz_in01.gat mapflag noreturn
+lhz_in02.gat mapflag noreturn
+lhz_in03.gat mapflag noreturn
+lhz_que01.gat mapflag noreturn
+kh_mansion.gat mapflag noreturn
+kh_rossi.gat mapflag noreturn
+kh_school.gat mapflag noreturn
+kh_vila.gat mapflag noreturn
+
+// Job Quests ====================
+job_sword1.gat mapflag noreturn
+job_thief1.gat mapflag noreturn
+// 2-1 -----------------------
+job_hunte.gat mapflag noreturn
+job_prist.gat mapflag noreturn
+job_wiz.gat mapflag noreturn
+in_hunter.gat mapflag noreturn
+in_moc_16.gat mapflag noreturn
+// 2-2 --------------------
+alde_alche.gat mapflag noreturn
+job_cru.gat mapflag noreturn
+job_duncer.gat mapflag noreturn
+job_monk.gat mapflag noreturn
+monk_test.gat mapflag noreturn
+monk_in.gat mapflag noreturn
+in_rogue.gat mapflag noreturn
+job_sage.gat mapflag noreturn
+que_ng.gat mapflag noreturn
+
+// Special Quests Places =========
+que_god01.gat mapflag noreturn
+que_god02.gat mapflag noreturn
+que_bingo.gat mapflag noreturn
+que_hugel.gat mapflag noreturn
+poring_c01.gat mapflag noreturn
+poring_c02.gat mapflag noreturn
+
+// Guild Castles =================
+//= 1.3 According to the kRO patch, enabled Butterfly wings in the Castles
+//aldeg_cas01.gat mapflag noreturn
+//aldeg_cas02.gat mapflag noreturn
+//aldeg_cas03.gat mapflag noreturn
+//aldeg_cas04.gat mapflag noreturn
+//aldeg_cas05.gat mapflag noreturn
+//gefg_cas01.gat mapflag noreturn
+//gefg_cas02.gat mapflag noreturn
+//gefg_cas03.gat mapflag noreturn
+//gefg_cas04.gat mapflag noreturn
+//gefg_cas05.gat mapflag noreturn
+//payg_cas01.gat mapflag noreturn
+//payg_cas02.gat mapflag noreturn
+//payg_cas03.gat mapflag noreturn
+//payg_cas04.gat mapflag noreturn
+//payg_cas05.gat mapflag noreturn
+//prtg_cas01.gat mapflag noreturn
+//prtg_cas02.gat mapflag noreturn
+//prtg_cas03.gat mapflag noreturn
+//prtg_cas04.gat mapflag noreturn
+//prtg_cas05.gat mapflag noreturn
+//nguild_alde.gat mapflag noreturn
+//nguild_gef.gat mapflag noreturn
+//nguild_pay.gat mapflag noreturn
+//nguild_prt.gat mapflag noreturn
+
+// GvG Arenas ===================
+guild_vs1.gat mapflag noreturn
+guild_vs2.gat mapflag noreturn
+guild_vs3.gat mapflag noreturn
+guild_vs4.gat mapflag noreturn
+guild_vs5.gat mapflag noreturn
+
+// Arenas =====================>\\
+arena_room.gat mapflag noreturn
+sec_in01.gat mapflag noreturn
+sec_in02.gat mapflag noreturn
+
+// PvP Arenas=======================
+pvp_y_room.gat mapflag noreturn
+//pvp_y_1-1.gat mapflag noreturn
+//pvp_y_1-2.gat mapflag noreturn
+//pvp_y_1-3.gat mapflag noreturn
+//pvp_y_1-4.gat mapflag noreturn
+//pvp_y_1-5.gat mapflag noreturn
+//pvp_y_2-1.gat mapflag noreturn
+//pvp_y_2-2.gat mapflag noreturn
+//pvp_y_2-3.gat mapflag noreturn
+//pvp_y_2-4.gat mapflag noreturn
+//pvp_y_2-5.gat mapflag noreturn
+//pvp_y_3-1.gat mapflag noreturn
+//pvp_y_3-2.gat mapflag noreturn
+//pvp_y_3-3.gat mapflag noreturn
+//pvp_y_3-4.gat mapflag noreturn
+//pvp_y_3-5.gat mapflag noreturn
+//pvp_y_4-1.gat mapflag noreturn
+//pvp_y_4-2.gat mapflag noreturn
+//pvp_y_4-3.gat mapflag noreturn
+//pvp_y_4-4.gat mapflag noreturn
+//pvp_y_4-5.gat mapflag noreturn
+//pvp_y_5-1.gat mapflag noreturn
+//pvp_y_5-2.gat mapflag noreturn
+//pvp_y_5-3.gat mapflag noreturn
+//pvp_y_5-4.gat mapflag noreturn
+//pvp_y_5-5.gat mapflag noreturn
+//pvp_y_6-1.gat mapflag noreturn
+//pvp_y_6-2.gat mapflag noreturn
+//pvp_y_6-3.gat mapflag noreturn
+//pvp_y_6-4.gat mapflag noreturn
+//pvp_y_6-5.gat mapflag noreturn
+//pvp_y_7-1.gat mapflag noreturn
+//pvp_y_7-2.gat mapflag noreturn
+//pvp_y_7-3.gat mapflag noreturn
+//pvp_y_7-4.gat mapflag noreturn
+//pvp_y_7-5.gat mapflag noreturn
+//pvp_y_8-1.gat mapflag noreturn
+//pvp_y_8-2.gat mapflag noreturn
+//pvp_y_8-3.gat mapflag noreturn
+//pvp_y_8-4.gat mapflag noreturn
+//pvp_y_8-5.gat mapflag noreturn
+pvp_n_room.gat mapflag noreturn
+//pvp_n_1-1.gat mapflag noreturn
+//pvp_n_1-2.gat mapflag noreturn
+//pvp_n_1-3.gat mapflag noreturn
+//pvp_n_1-4.gat mapflag noreturn
+//pvp_n_1-5.gat mapflag noreturn
+//pvp_n_2-1.gat mapflag noreturn
+//pvp_n_2-2.gat mapflag noreturn
+//pvp_n_2-3.gat mapflag noreturn
+//pvp_n_2-4.gat mapflag noreturn
+//pvp_n_2-5.gat mapflag noreturn
+//pvp_n_3-1.gat mapflag noreturn
+//pvp_n_3-2.gat mapflag noreturn
+//pvp_n_3-3.gat mapflag noreturn
+//pvp_n_3-4.gat mapflag noreturn
+//pvp_n_3-5.gat mapflag noreturn
+//pvp_n_4-1.gat mapflag noreturn
+//pvp_n_4-2.gat mapflag noreturn
+//pvp_n_4-3.gat mapflag noreturn
+//pvp_n_4-4.gat mapflag noreturn
+//pvp_n_4-5.gat mapflag noreturn
+//pvp_n_5-1.gat mapflag noreturn
+//pvp_n_5-2.gat mapflag noreturn
+//pvp_n_5-3.gat mapflag noreturn
+//pvp_n_5-4.gat mapflag noreturn
+//pvp_n_5-5.gat mapflag noreturn
+//pvp_n_6-1.gat mapflag noreturn
+//pvp_n_6-2.gat mapflag noreturn
+//pvp_n_6-3.gat mapflag noreturn
+//pvp_n_6-4.gat mapflag noreturn
+//pvp_n_6-5.gat mapflag noreturn
+//pvp_n_7-1.gat mapflag noreturn
+//pvp_n_7-2.gat mapflag noreturn
+//pvp_n_7-3.gat mapflag noreturn
+//pvp_n_7-4.gat mapflag noreturn
+//pvp_n_7-5.gat mapflag noreturn
+//pvp_n_8-1.gat mapflag noreturn
+//pvp_n_8-2.gat mapflag noreturn
+//pvp_n_8-3.gat mapflag noreturn
+//pvp_n_8-4.gat mapflag noreturn
+//pvp_n_8-5.gat mapflag noreturn
+//pvp_2vs2.gat mapflag noreturn
diff --git a/conf-tmpl/mapflag/nosave.txt b/conf-tmpl/mapflag/nosave.txt
index a77cae3d8..549132090 100644
--- a/conf-tmpl/mapflag/nosave.txt
+++ b/conf-tmpl/mapflag/nosave.txt
@@ -1,186 +1,186 @@
-//===== eAthena Script =======================================
-//= Map flags that disable auto saving
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.7 [Lupus]
-//===== Current Version: =====================================
-
-// Job Quests ====================
-job_sword1.gat mapflag nosave SavePoint
-//job_thief1.gat mapflag nosave SavePoint
-// 2-1
-job_knt.gat mapflag nosave SavePoint
-job_prist.gat mapflag nosave SavePoint
-job_wiz.gat mapflag nosave SavePoint
-in_moc_16.gat mapflag nosave SavePoint
-job_hunte.gat mapflag nosave SavePoint
-//in_hunter.gat mapflag nosave SavePoint
-// 2-2
-alde_alche.gat mapflag nosave SavePoint
-job_cru.gat mapflag nosave SavePoint
-job_duncer.gat mapflag nosave SavePoint
-job_monk.gat mapflag nosave SavePoint
-monk_test.gat mapflag nosave SavePoint
-monk_in.gat mapflag nosave SavePoint
-in_rogue.gat mapflag nosave SavePoint
-job_sage.gat mapflag nosave SavePoint
-
-job_star.gat mapflag nosave SavePoint
-job_soul.gat mapflag nosave SavePoint
-
-// Special Quests Places =====
-ama_test.gat mapflag nosave SavePoint
-gef_dun03.gat mapflag nosave SavePoint
-que_god01.gat mapflag nosave SavePoint
-que_god02.gat mapflag nosave SavePoint
-que_sign01.gat mapflag nosave SavePoint
-que_sign02.gat mapflag nosave SavePoint
-que_rachel.gat mapflag nosave SavePoint
-que_ng.gat mapflag nosave SavePoint
-gon_test.gat mapflag nosave SavePoint
-
-// GvG Arenas ==========================
-guild_vs1.gat mapflag nosave SavePoint
-guild_vs2.gat mapflag nosave SavePoint
-guild_vs3.gat mapflag nosave SavePoint
-guild_vs4.gat mapflag nosave SavePoint
-guild_vs5.gat mapflag nosave SavePoint
-
-// Izlude Arena ========================
-force_1-1.gat mapflag nosave SavePoint
-force_1-2.gat mapflag nosave SavePoint
-force_1-3.gat mapflag nosave SavePoint
-force_2-1.gat mapflag nosave SavePoint
-force_2-2.gat mapflag nosave SavePoint
-force_2-3.gat mapflag nosave SavePoint
-force_3-1.gat mapflag nosave SavePoint
-force_3-2.gat mapflag nosave SavePoint
-force_3-3.gat mapflag nosave SavePoint
-
-// Juperos =============================
-jupe_area1.gat mapflag nosave SavePoint
-jupe_area2.gat mapflag nosave SavePoint
-jupe_ele.gat mapflag nosave SavePoint
-jupe_ele_r.gat mapflag nosave SavePoint
-jupe_gate.gat mapflag nosave SavePoint
-
-//PvP Arenas =================================
-pvp_y_room.gat mapflag nosave SavePoint
-pvp_y_1-1.gat mapflag nosave SavePoint
-pvp_y_1-2.gat mapflag nosave SavePoint
-pvp_y_1-3.gat mapflag nosave SavePoint
-pvp_y_1-4.gat mapflag nosave SavePoint
-pvp_y_1-5.gat mapflag nosave SavePoint
-pvp_y_2-1.gat mapflag nosave SavePoint
-pvp_y_2-2.gat mapflag nosave SavePoint
-pvp_y_2-3.gat mapflag nosave SavePoint
-pvp_y_2-4.gat mapflag nosave SavePoint
-pvp_y_2-5.gat mapflag nosave SavePoint
-pvp_y_3-1.gat mapflag nosave SavePoint
-pvp_y_3-2.gat mapflag nosave SavePoint
-pvp_y_3-3.gat mapflag nosave SavePoint
-pvp_y_3-4.gat mapflag nosave SavePoint
-pvp_y_3-5.gat mapflag nosave SavePoint
-pvp_y_4-1.gat mapflag nosave SavePoint
-pvp_y_4-2.gat mapflag nosave SavePoint
-pvp_y_4-3.gat mapflag nosave SavePoint
-pvp_y_4-4.gat mapflag nosave SavePoint
-pvp_y_4-5.gat mapflag nosave SavePoint
-pvp_y_5-1.gat mapflag nosave SavePoint
-pvp_y_5-2.gat mapflag nosave SavePoint
-pvp_y_5-3.gat mapflag nosave SavePoint
-pvp_y_5-4.gat mapflag nosave SavePoint
-pvp_y_5-5.gat mapflag nosave SavePoint
-pvp_y_6-1.gat mapflag nosave SavePoint
-pvp_y_6-2.gat mapflag nosave SavePoint
-pvp_y_6-3.gat mapflag nosave SavePoint
-pvp_y_6-4.gat mapflag nosave SavePoint
-pvp_y_6-5.gat mapflag nosave SavePoint
-pvp_y_7-1.gat mapflag nosave SavePoint
-pvp_y_7-2.gat mapflag nosave SavePoint
-pvp_y_7-3.gat mapflag nosave SavePoint
-pvp_y_7-4.gat mapflag nosave SavePoint
-pvp_y_7-5.gat mapflag nosave SavePoint
-pvp_y_8-1.gat mapflag nosave SavePoint
-pvp_y_8-2.gat mapflag nosave SavePoint
-pvp_y_8-3.gat mapflag nosave SavePoint
-pvp_y_8-4.gat mapflag nosave SavePoint
-pvp_y_8-5.gat mapflag nosave SavePoint
-pvp_n_room.gat mapflag nosave SavePoint
-pvp_n_1-1.gat mapflag nosave SavePoint
-pvp_n_1-2.gat mapflag nosave SavePoint
-pvp_n_1-3.gat mapflag nosave SavePoint
-pvp_n_1-4.gat mapflag nosave SavePoint
-pvp_n_1-5.gat mapflag nosave SavePoint
-pvp_n_2-1.gat mapflag nosave SavePoint
-pvp_n_2-2.gat mapflag nosave SavePoint
-pvp_n_2-3.gat mapflag nosave SavePoint
-pvp_n_2-4.gat mapflag nosave SavePoint
-pvp_n_2-5.gat mapflag nosave SavePoint
-pvp_n_3-1.gat mapflag nosave SavePoint
-pvp_n_3-2.gat mapflag nosave SavePoint
-pvp_n_3-3.gat mapflag nosave SavePoint
-pvp_n_3-4.gat mapflag nosave SavePoint
-pvp_n_3-5.gat mapflag nosave SavePoint
-pvp_n_4-1.gat mapflag nosave SavePoint
-pvp_n_4-2.gat mapflag nosave SavePoint
-pvp_n_4-3.gat mapflag nosave SavePoint
-pvp_n_4-4.gat mapflag nosave SavePoint
-pvp_n_4-5.gat mapflag nosave SavePoint
-pvp_n_5-1.gat mapflag nosave SavePoint
-pvp_n_5-2.gat mapflag nosave SavePoint
-pvp_n_5-3.gat mapflag nosave SavePoint
-pvp_n_5-4.gat mapflag nosave SavePoint
-pvp_n_5-5.gat mapflag nosave SavePoint
-pvp_n_6-1.gat mapflag nosave SavePoint
-pvp_n_6-2.gat mapflag nosave SavePoint
-pvp_n_6-3.gat mapflag nosave SavePoint
-pvp_n_6-4.gat mapflag nosave SavePoint
-pvp_n_6-5.gat mapflag nosave SavePoint
-pvp_n_7-1.gat mapflag nosave SavePoint
-pvp_n_7-2.gat mapflag nosave SavePoint
-pvp_n_7-3.gat mapflag nosave SavePoint
-pvp_n_7-4.gat mapflag nosave SavePoint
-pvp_n_7-5.gat mapflag nosave SavePoint
-pvp_n_8-1.gat mapflag nosave SavePoint
-pvp_n_8-2.gat mapflag nosave SavePoint
-pvp_n_8-3.gat mapflag nosave SavePoint
-pvp_n_8-4.gat mapflag nosave SavePoint
-pvp_n_8-5.gat mapflag nosave SavePoint
-pvp_2vs2.gat mapflag nosave SavePoint
-
-//WoE Castles =================================
-aldeg_cas01.gat mapflag nosave SavePoint
-aldeg_cas02.gat mapflag nosave SavePoint
-aldeg_cas03.gat mapflag nosave SavePoint
-aldeg_cas04.gat mapflag nosave SavePoint
-aldeg_cas05.gat mapflag nosave SavePoint
-gefg_cas01.gat mapflag nosave SavePoint
-gefg_cas02.gat mapflag nosave SavePoint
-gefg_cas03.gat mapflag nosave SavePoint
-gefg_cas04.gat mapflag nosave SavePoint
-gefg_cas05.gat mapflag nosave SavePoint
-payg_cas01.gat mapflag nosave SavePoint
-payg_cas02.gat mapflag nosave SavePoint
-payg_cas03.gat mapflag nosave SavePoint
-payg_cas04.gat mapflag nosave SavePoint
-payg_cas05.gat mapflag nosave SavePoint
-prtg_cas01.gat mapflag nosave SavePoint
-prtg_cas02.gat mapflag nosave SavePoint
-prtg_cas03.gat mapflag nosave SavePoint
-prtg_cas04.gat mapflag nosave SavePoint
-prtg_cas05.gat mapflag nosave SavePoint
-nguild_alde.gat mapflag nosave SavePoint
-nguild_gef.gat mapflag nosave SavePoint
-nguild_pay.gat mapflag nosave SavePoint
-nguild_prt.gat mapflag nosave SavePoint
-
-//Guild Dungeons ==============================
-gld_dun01.gat mapflag nosave SavePoint
-gld_dun02.gat mapflag nosave SavePoint
-gld_dun03.gat mapflag nosave SavePoint
-gld_dun04.gat mapflag nosave SavePoint
-
-//Normal Maps =================================
-yggdrasil01.gat mapflag nosave SavePoint
-thana_boss.gat mapflag nosave SavePoint
+//===== eAthena Script =======================================
+//= Map flags that disable auto saving
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.7 [Lupus]
+//===== Current Version: =====================================
+
+// Job Quests ====================
+job_sword1.gat mapflag nosave SavePoint
+//job_thief1.gat mapflag nosave SavePoint
+// 2-1
+job_knt.gat mapflag nosave SavePoint
+job_prist.gat mapflag nosave SavePoint
+job_wiz.gat mapflag nosave SavePoint
+in_moc_16.gat mapflag nosave SavePoint
+job_hunte.gat mapflag nosave SavePoint
+//in_hunter.gat mapflag nosave SavePoint
+// 2-2
+alde_alche.gat mapflag nosave SavePoint
+job_cru.gat mapflag nosave SavePoint
+job_duncer.gat mapflag nosave SavePoint
+job_monk.gat mapflag nosave SavePoint
+monk_test.gat mapflag nosave SavePoint
+monk_in.gat mapflag nosave SavePoint
+in_rogue.gat mapflag nosave SavePoint
+job_sage.gat mapflag nosave SavePoint
+
+job_star.gat mapflag nosave SavePoint
+job_soul.gat mapflag nosave SavePoint
+
+// Special Quests Places =====
+ama_test.gat mapflag nosave SavePoint
+gef_dun03.gat mapflag nosave SavePoint
+que_god01.gat mapflag nosave SavePoint
+que_god02.gat mapflag nosave SavePoint
+que_sign01.gat mapflag nosave SavePoint
+que_sign02.gat mapflag nosave SavePoint
+que_rachel.gat mapflag nosave SavePoint
+que_ng.gat mapflag nosave SavePoint
+gon_test.gat mapflag nosave SavePoint
+
+// GvG Arenas ==========================
+guild_vs1.gat mapflag nosave SavePoint
+guild_vs2.gat mapflag nosave SavePoint
+guild_vs3.gat mapflag nosave SavePoint
+guild_vs4.gat mapflag nosave SavePoint
+guild_vs5.gat mapflag nosave SavePoint
+
+// Izlude Arena ========================
+force_1-1.gat mapflag nosave SavePoint
+force_1-2.gat mapflag nosave SavePoint
+force_1-3.gat mapflag nosave SavePoint
+force_2-1.gat mapflag nosave SavePoint
+force_2-2.gat mapflag nosave SavePoint
+force_2-3.gat mapflag nosave SavePoint
+force_3-1.gat mapflag nosave SavePoint
+force_3-2.gat mapflag nosave SavePoint
+force_3-3.gat mapflag nosave SavePoint
+
+// Juperos =============================
+jupe_area1.gat mapflag nosave SavePoint
+jupe_area2.gat mapflag nosave SavePoint
+jupe_ele.gat mapflag nosave SavePoint
+jupe_ele_r.gat mapflag nosave SavePoint
+jupe_gate.gat mapflag nosave SavePoint
+
+//PvP Arenas =================================
+pvp_y_room.gat mapflag nosave SavePoint
+pvp_y_1-1.gat mapflag nosave SavePoint
+pvp_y_1-2.gat mapflag nosave SavePoint
+pvp_y_1-3.gat mapflag nosave SavePoint
+pvp_y_1-4.gat mapflag nosave SavePoint
+pvp_y_1-5.gat mapflag nosave SavePoint
+pvp_y_2-1.gat mapflag nosave SavePoint
+pvp_y_2-2.gat mapflag nosave SavePoint
+pvp_y_2-3.gat mapflag nosave SavePoint
+pvp_y_2-4.gat mapflag nosave SavePoint
+pvp_y_2-5.gat mapflag nosave SavePoint
+pvp_y_3-1.gat mapflag nosave SavePoint
+pvp_y_3-2.gat mapflag nosave SavePoint
+pvp_y_3-3.gat mapflag nosave SavePoint
+pvp_y_3-4.gat mapflag nosave SavePoint
+pvp_y_3-5.gat mapflag nosave SavePoint
+pvp_y_4-1.gat mapflag nosave SavePoint
+pvp_y_4-2.gat mapflag nosave SavePoint
+pvp_y_4-3.gat mapflag nosave SavePoint
+pvp_y_4-4.gat mapflag nosave SavePoint
+pvp_y_4-5.gat mapflag nosave SavePoint
+pvp_y_5-1.gat mapflag nosave SavePoint
+pvp_y_5-2.gat mapflag nosave SavePoint
+pvp_y_5-3.gat mapflag nosave SavePoint
+pvp_y_5-4.gat mapflag nosave SavePoint
+pvp_y_5-5.gat mapflag nosave SavePoint
+pvp_y_6-1.gat mapflag nosave SavePoint
+pvp_y_6-2.gat mapflag nosave SavePoint
+pvp_y_6-3.gat mapflag nosave SavePoint
+pvp_y_6-4.gat mapflag nosave SavePoint
+pvp_y_6-5.gat mapflag nosave SavePoint
+pvp_y_7-1.gat mapflag nosave SavePoint
+pvp_y_7-2.gat mapflag nosave SavePoint
+pvp_y_7-3.gat mapflag nosave SavePoint
+pvp_y_7-4.gat mapflag nosave SavePoint
+pvp_y_7-5.gat mapflag nosave SavePoint
+pvp_y_8-1.gat mapflag nosave SavePoint
+pvp_y_8-2.gat mapflag nosave SavePoint
+pvp_y_8-3.gat mapflag nosave SavePoint
+pvp_y_8-4.gat mapflag nosave SavePoint
+pvp_y_8-5.gat mapflag nosave SavePoint
+pvp_n_room.gat mapflag nosave SavePoint
+pvp_n_1-1.gat mapflag nosave SavePoint
+pvp_n_1-2.gat mapflag nosave SavePoint
+pvp_n_1-3.gat mapflag nosave SavePoint
+pvp_n_1-4.gat mapflag nosave SavePoint
+pvp_n_1-5.gat mapflag nosave SavePoint
+pvp_n_2-1.gat mapflag nosave SavePoint
+pvp_n_2-2.gat mapflag nosave SavePoint
+pvp_n_2-3.gat mapflag nosave SavePoint
+pvp_n_2-4.gat mapflag nosave SavePoint
+pvp_n_2-5.gat mapflag nosave SavePoint
+pvp_n_3-1.gat mapflag nosave SavePoint
+pvp_n_3-2.gat mapflag nosave SavePoint
+pvp_n_3-3.gat mapflag nosave SavePoint
+pvp_n_3-4.gat mapflag nosave SavePoint
+pvp_n_3-5.gat mapflag nosave SavePoint
+pvp_n_4-1.gat mapflag nosave SavePoint
+pvp_n_4-2.gat mapflag nosave SavePoint
+pvp_n_4-3.gat mapflag nosave SavePoint
+pvp_n_4-4.gat mapflag nosave SavePoint
+pvp_n_4-5.gat mapflag nosave SavePoint
+pvp_n_5-1.gat mapflag nosave SavePoint
+pvp_n_5-2.gat mapflag nosave SavePoint
+pvp_n_5-3.gat mapflag nosave SavePoint
+pvp_n_5-4.gat mapflag nosave SavePoint
+pvp_n_5-5.gat mapflag nosave SavePoint
+pvp_n_6-1.gat mapflag nosave SavePoint
+pvp_n_6-2.gat mapflag nosave SavePoint
+pvp_n_6-3.gat mapflag nosave SavePoint
+pvp_n_6-4.gat mapflag nosave SavePoint
+pvp_n_6-5.gat mapflag nosave SavePoint
+pvp_n_7-1.gat mapflag nosave SavePoint
+pvp_n_7-2.gat mapflag nosave SavePoint
+pvp_n_7-3.gat mapflag nosave SavePoint
+pvp_n_7-4.gat mapflag nosave SavePoint
+pvp_n_7-5.gat mapflag nosave SavePoint
+pvp_n_8-1.gat mapflag nosave SavePoint
+pvp_n_8-2.gat mapflag nosave SavePoint
+pvp_n_8-3.gat mapflag nosave SavePoint
+pvp_n_8-4.gat mapflag nosave SavePoint
+pvp_n_8-5.gat mapflag nosave SavePoint
+pvp_2vs2.gat mapflag nosave SavePoint
+
+//WoE Castles =================================
+aldeg_cas01.gat mapflag nosave SavePoint
+aldeg_cas02.gat mapflag nosave SavePoint
+aldeg_cas03.gat mapflag nosave SavePoint
+aldeg_cas04.gat mapflag nosave SavePoint
+aldeg_cas05.gat mapflag nosave SavePoint
+gefg_cas01.gat mapflag nosave SavePoint
+gefg_cas02.gat mapflag nosave SavePoint
+gefg_cas03.gat mapflag nosave SavePoint
+gefg_cas04.gat mapflag nosave SavePoint
+gefg_cas05.gat mapflag nosave SavePoint
+payg_cas01.gat mapflag nosave SavePoint
+payg_cas02.gat mapflag nosave SavePoint
+payg_cas03.gat mapflag nosave SavePoint
+payg_cas04.gat mapflag nosave SavePoint
+payg_cas05.gat mapflag nosave SavePoint
+prtg_cas01.gat mapflag nosave SavePoint
+prtg_cas02.gat mapflag nosave SavePoint
+prtg_cas03.gat mapflag nosave SavePoint
+prtg_cas04.gat mapflag nosave SavePoint
+prtg_cas05.gat mapflag nosave SavePoint
+nguild_alde.gat mapflag nosave SavePoint
+nguild_gef.gat mapflag nosave SavePoint
+nguild_pay.gat mapflag nosave SavePoint
+nguild_prt.gat mapflag nosave SavePoint
+
+//Guild Dungeons ==============================
+gld_dun01.gat mapflag nosave SavePoint
+gld_dun02.gat mapflag nosave SavePoint
+gld_dun03.gat mapflag nosave SavePoint
+gld_dun04.gat mapflag nosave SavePoint
+
+//Normal Maps =================================
+yggdrasil01.gat mapflag nosave SavePoint
+thana_boss.gat mapflag nosave SavePoint
diff --git a/conf-tmpl/mapflag/noteleport.txt b/conf-tmpl/mapflag/noteleport.txt
index a6b9fbf18..a3df94568 100644
--- a/conf-tmpl/mapflag/noteleport.txt
+++ b/conf-tmpl/mapflag/noteleport.txt
@@ -1,249 +1,249 @@
-//===== eAthena Script =======================================
-//= Map flags that disable use of fly wings
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.6 [Lupus]
-//===== Notes: ===============================================
-//= For disabling Butterfly wings use noreturn
-//===== Current Version: =====================================
-
-// Cities ========================
-ayo_in01.gat mapflag noteleport
-ayo_in02.gat mapflag noteleport
-alb_ship.gat mapflag noteleport
-alberta_in.gat mapflag noteleport
-aldeba_in.gat mapflag noteleport
-ama_dun01.gat mapflag noteleport
-ama_in01.gat mapflag noteleport
-ama_in02.gat mapflag noteleport
-ama_test.gat mapflag noteleport
-cmd_in01.gat mapflag noteleport
-cmd_in02.gat mapflag noteleport
-gef_dun03.gat mapflag noteleport
-gef_tower.gat mapflag noteleport
-geffen_in.gat mapflag noteleport
-gon_test.gat mapflag noteleport
-gon_in.gat mapflag noteleport
-in_orcs01.gat mapflag noteleport
-izlude_in.gat mapflag noteleport
-jawaii_in.gat mapflag noteleport
-lou_in01.gat mapflag noteleport
-lou_in02.gat mapflag noteleport
-moc_castle.gat mapflag noteleport
-morocc_in.gat mapflag noteleport
-new_zone01.gat mapflag noteleport
-new_zone02.gat mapflag noteleport
-new_zone03.gat mapflag noteleport
-new_zone04.gat mapflag noteleport
-nif_in.gat mapflag noteleport
-payon_in01.gat mapflag noteleport
-payon_in02.gat mapflag noteleport
-payon_in03.gat mapflag noteleport
-prt_are_in.gat mapflag noteleport
-prt_are01.gat mapflag noteleport
-prt_castle.gat mapflag noteleport
-prt_church.gat mapflag noteleport
-prt_in.gat mapflag noteleport
-um_in.gat mapflag noteleport
-xmas_in.gat mapflag noteleport
-yuno_in01.gat mapflag noteleport
-yuno_in02.gat mapflag noteleport
-yuno_in03.gat mapflag noteleport
-yuno_in04.gat mapflag noteleport
-yuno_in05.gat mapflag noteleport
-que_sign01.gat mapflag noteleport
-que_sign02.gat mapflag noteleport
-ein_in01.gat mapflag noteleport
-airport.gat mapflag noteleport
-airplane.gat mapflag noteleport
-airplane_01.gat mapflag noteleport
-// New areas
-lighthalzen.gat mapflag noteleport
-yuno.gat mapflag noteleport
-yuno_pre.gat mapflag noteleport
-y_airport.gat mapflag noteleport
-lhz_airport.gat mapflag noteleport
-einbroch.gat mapflag noteleport
-einbech.gat mapflag noteleport
-lhz_que01.gat mapflag noteleport
-lhz_cube.gat mapflag noteleport
-lhz_in01.gat mapflag noteleport
-lhz_in02.gat mapflag noteleport
-lhz_in03.gat mapflag noteleport
-jupe_area1.gat mapflag noteleport
-jupe_area2.gat mapflag noteleport
-jupe_core.gat mapflag noteleport
-jupe_ele.gat mapflag noteleport
-jupe_ele_r.gat mapflag noteleport
-jupe_gate.gat mapflag noteleport
-tha_t07.gat mapflag noteleport
-tha_t08.gat mapflag noteleport
-tha_t09.gat mapflag noteleport
-tha_t10.gat mapflag noteleport
-tha_t11.gat mapflag noteleport
-tha_t12.gat mapflag noteleport
-thana_step.gat mapflag noteleport
-hu_in01.gat mapflag noteleport
-auction_01.gat mapflag noteleport
-auction_02.gat mapflag noteleport
-ra_in01.gat mapflag noteleport
-ra_temin.gat mapflag noteleport
-ra_temsky.gat mapflag noteleport
-que_rachel.gat mapflag noteleport
-kh_mansion.gat mapflag noteleport
-kh_rossi.gat mapflag noteleport
-kh_school.gat mapflag noteleport
-kh_vila.gat mapflag noteleport
-
-// Job Quests ====================
-job_sword1.gat mapflag noteleport
-job_thief1.gat mapflag noteleport
-// 2-1 -----------------------
-job_prist.gat mapflag noteleport
-job_wiz.gat mapflag noteleport
-job_hunte.gat mapflag noteleport
-in_hunter.gat mapflag noteleport
-in_moc_16.gat mapflag noteleport
-// 2-2 --------------------
-alde_alche.gat mapflag noteleport
-job_cru.gat mapflag noteleport
-job_duncer.gat mapflag noteleport
-job_monk.gat mapflag noteleport
-monk_test.gat mapflag noteleport
-monk_in.gat mapflag noteleport
-in_rogue.gat mapflag noteleport
-job_sage.gat mapflag noteleport
-job_star.gat mapflag noteleport
-job_soul.gat mapflag noteleport
-que_ng.gat mapflag noteleport
-
-// Special Quests Places =========
-que_god01.gat mapflag noteleport
-que_god02.gat mapflag noteleport
-que_bingo.gat mapflag noteleport
-que_hugel.gat mapflag noteleport
-poring_c01.gat mapflag noteleport
-poring_c02.gat mapflag noteleport
-
-// Guild Castles =================
-aldeg_cas01.gat mapflag noteleport
-aldeg_cas02.gat mapflag noteleport
-aldeg_cas03.gat mapflag noteleport
-aldeg_cas04.gat mapflag noteleport
-aldeg_cas05.gat mapflag noteleport
-gefg_cas01.gat mapflag noteleport
-gefg_cas02.gat mapflag noteleport
-gefg_cas03.gat mapflag noteleport
-gefg_cas04.gat mapflag noteleport
-gefg_cas05.gat mapflag noteleport
-payg_cas01.gat mapflag noteleport
-payg_cas02.gat mapflag noteleport
-payg_cas03.gat mapflag noteleport
-payg_cas04.gat mapflag noteleport
-payg_cas05.gat mapflag noteleport
-prtg_cas01.gat mapflag noteleport
-prtg_cas02.gat mapflag noteleport
-prtg_cas03.gat mapflag noteleport
-prtg_cas04.gat mapflag noteleport
-prtg_cas05.gat mapflag noteleport
-nguild_alde.gat mapflag noteleport
-nguild_gef.gat mapflag noteleport
-nguild_pay.gat mapflag noteleport
-nguild_prt.gat mapflag noteleport
-
-// GvG Arenas ===================
-guild_vs1.gat mapflag noteleport
-guild_vs2.gat mapflag noteleport
-guild_vs3.gat mapflag noteleport
-guild_vs4.gat mapflag noteleport
-guild_vs5.gat mapflag noteleport
-
-// Arenas =====================>\\
-arena_room.gat mapflag noteleport
-sec_in01.gat mapflag noteleport
-sec_in02.gat mapflag noteleport
-
-// PvP Arenas=======================
-pvp_y_room.gat mapflag noteleport
-pvp_y_1-1.gat mapflag noteleport
-pvp_y_1-2.gat mapflag noteleport
-pvp_y_1-3.gat mapflag noteleport
-pvp_y_1-4.gat mapflag noteleport
-pvp_y_1-5.gat mapflag noteleport
-pvp_y_2-1.gat mapflag noteleport
-pvp_y_2-2.gat mapflag noteleport
-pvp_y_2-3.gat mapflag noteleport
-pvp_y_2-4.gat mapflag noteleport
-pvp_y_2-5.gat mapflag noteleport
-pvp_y_3-1.gat mapflag noteleport
-pvp_y_3-2.gat mapflag noteleport
-pvp_y_3-3.gat mapflag noteleport
-pvp_y_3-4.gat mapflag noteleport
-pvp_y_3-5.gat mapflag noteleport
-pvp_y_4-1.gat mapflag noteleport
-pvp_y_4-2.gat mapflag noteleport
-pvp_y_4-3.gat mapflag noteleport
-pvp_y_4-4.gat mapflag noteleport
-pvp_y_4-5.gat mapflag noteleport
-pvp_y_5-1.gat mapflag noteleport
-pvp_y_5-2.gat mapflag noteleport
-pvp_y_5-3.gat mapflag noteleport
-pvp_y_5-4.gat mapflag noteleport
-pvp_y_5-5.gat mapflag noteleport
-pvp_y_6-1.gat mapflag noteleport
-pvp_y_6-2.gat mapflag noteleport
-pvp_y_6-3.gat mapflag noteleport
-pvp_y_6-4.gat mapflag noteleport
-pvp_y_6-5.gat mapflag noteleport
-pvp_y_7-1.gat mapflag noteleport
-pvp_y_7-2.gat mapflag noteleport
-pvp_y_7-3.gat mapflag noteleport
-pvp_y_7-4.gat mapflag noteleport
-pvp_y_7-5.gat mapflag noteleport
-pvp_y_8-1.gat mapflag noteleport
-pvp_y_8-2.gat mapflag noteleport
-pvp_y_8-3.gat mapflag noteleport
-pvp_y_8-4.gat mapflag noteleport
-pvp_y_8-5.gat mapflag noteleport
-pvp_n_room.gat mapflag noteleport
-pvp_n_1-1.gat mapflag noteleport
-pvp_n_1-2.gat mapflag noteleport
-pvp_n_1-3.gat mapflag noteleport
-pvp_n_1-4.gat mapflag noteleport
-pvp_n_1-5.gat mapflag noteleport
-pvp_n_2-1.gat mapflag noteleport
-pvp_n_2-2.gat mapflag noteleport
-pvp_n_2-3.gat mapflag noteleport
-pvp_n_2-4.gat mapflag noteleport
-pvp_n_2-5.gat mapflag noteleport
-pvp_n_3-1.gat mapflag noteleport
-pvp_n_3-2.gat mapflag noteleport
-pvp_n_3-3.gat mapflag noteleport
-pvp_n_3-4.gat mapflag noteleport
-pvp_n_3-5.gat mapflag noteleport
-pvp_n_4-1.gat mapflag noteleport
-pvp_n_4-2.gat mapflag noteleport
-pvp_n_4-3.gat mapflag noteleport
-pvp_n_4-4.gat mapflag noteleport
-pvp_n_4-5.gat mapflag noteleport
-pvp_n_5-1.gat mapflag noteleport
-pvp_n_5-2.gat mapflag noteleport
-pvp_n_5-3.gat mapflag noteleport
-pvp_n_5-4.gat mapflag noteleport
-pvp_n_5-5.gat mapflag noteleport
-pvp_n_6-1.gat mapflag noteleport
-pvp_n_6-2.gat mapflag noteleport
-pvp_n_6-3.gat mapflag noteleport
-pvp_n_6-4.gat mapflag noteleport
-pvp_n_6-5.gat mapflag noteleport
-pvp_n_7-1.gat mapflag noteleport
-pvp_n_7-2.gat mapflag noteleport
-pvp_n_7-3.gat mapflag noteleport
-pvp_n_7-4.gat mapflag noteleport
-pvp_n_7-5.gat mapflag noteleport
-pvp_n_8-1.gat mapflag noteleport
-pvp_n_8-2.gat mapflag noteleport
-pvp_n_8-3.gat mapflag noteleport
-pvp_n_8-4.gat mapflag noteleport
-pvp_n_8-5.gat mapflag noteleport
-pvp_2vs2.gat mapflag noteleport
+//===== eAthena Script =======================================
+//= Map flags that disable use of fly wings
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.6 [Lupus]
+//===== Notes: ===============================================
+//= For disabling Butterfly wings use noreturn
+//===== Current Version: =====================================
+
+// Cities ========================
+ayo_in01.gat mapflag noteleport
+ayo_in02.gat mapflag noteleport
+alb_ship.gat mapflag noteleport
+alberta_in.gat mapflag noteleport
+aldeba_in.gat mapflag noteleport
+ama_dun01.gat mapflag noteleport
+ama_in01.gat mapflag noteleport
+ama_in02.gat mapflag noteleport
+ama_test.gat mapflag noteleport
+cmd_in01.gat mapflag noteleport
+cmd_in02.gat mapflag noteleport
+gef_dun03.gat mapflag noteleport
+gef_tower.gat mapflag noteleport
+geffen_in.gat mapflag noteleport
+gon_test.gat mapflag noteleport
+gon_in.gat mapflag noteleport
+in_orcs01.gat mapflag noteleport
+izlude_in.gat mapflag noteleport
+jawaii_in.gat mapflag noteleport
+lou_in01.gat mapflag noteleport
+lou_in02.gat mapflag noteleport
+moc_castle.gat mapflag noteleport
+morocc_in.gat mapflag noteleport
+new_zone01.gat mapflag noteleport
+new_zone02.gat mapflag noteleport
+new_zone03.gat mapflag noteleport
+new_zone04.gat mapflag noteleport
+nif_in.gat mapflag noteleport
+payon_in01.gat mapflag noteleport
+payon_in02.gat mapflag noteleport
+payon_in03.gat mapflag noteleport
+prt_are_in.gat mapflag noteleport
+prt_are01.gat mapflag noteleport
+prt_castle.gat mapflag noteleport
+prt_church.gat mapflag noteleport
+prt_in.gat mapflag noteleport
+um_in.gat mapflag noteleport
+xmas_in.gat mapflag noteleport
+yuno_in01.gat mapflag noteleport
+yuno_in02.gat mapflag noteleport
+yuno_in03.gat mapflag noteleport
+yuno_in04.gat mapflag noteleport
+yuno_in05.gat mapflag noteleport
+que_sign01.gat mapflag noteleport
+que_sign02.gat mapflag noteleport
+ein_in01.gat mapflag noteleport
+airport.gat mapflag noteleport
+airplane.gat mapflag noteleport
+airplane_01.gat mapflag noteleport
+// New areas
+lighthalzen.gat mapflag noteleport
+yuno.gat mapflag noteleport
+yuno_pre.gat mapflag noteleport
+y_airport.gat mapflag noteleport
+lhz_airport.gat mapflag noteleport
+einbroch.gat mapflag noteleport
+einbech.gat mapflag noteleport
+lhz_que01.gat mapflag noteleport
+lhz_cube.gat mapflag noteleport
+lhz_in01.gat mapflag noteleport
+lhz_in02.gat mapflag noteleport
+lhz_in03.gat mapflag noteleport
+jupe_area1.gat mapflag noteleport
+jupe_area2.gat mapflag noteleport
+jupe_core.gat mapflag noteleport
+jupe_ele.gat mapflag noteleport
+jupe_ele_r.gat mapflag noteleport
+jupe_gate.gat mapflag noteleport
+tha_t07.gat mapflag noteleport
+tha_t08.gat mapflag noteleport
+tha_t09.gat mapflag noteleport
+tha_t10.gat mapflag noteleport
+tha_t11.gat mapflag noteleport
+tha_t12.gat mapflag noteleport
+thana_step.gat mapflag noteleport
+hu_in01.gat mapflag noteleport
+auction_01.gat mapflag noteleport
+auction_02.gat mapflag noteleport
+ra_in01.gat mapflag noteleport
+ra_temin.gat mapflag noteleport
+ra_temsky.gat mapflag noteleport
+que_rachel.gat mapflag noteleport
+kh_mansion.gat mapflag noteleport
+kh_rossi.gat mapflag noteleport
+kh_school.gat mapflag noteleport
+kh_vila.gat mapflag noteleport
+
+// Job Quests ====================
+job_sword1.gat mapflag noteleport
+job_thief1.gat mapflag noteleport
+// 2-1 -----------------------
+job_prist.gat mapflag noteleport
+job_wiz.gat mapflag noteleport
+job_hunte.gat mapflag noteleport
+in_hunter.gat mapflag noteleport
+in_moc_16.gat mapflag noteleport
+// 2-2 --------------------
+alde_alche.gat mapflag noteleport
+job_cru.gat mapflag noteleport
+job_duncer.gat mapflag noteleport
+job_monk.gat mapflag noteleport
+monk_test.gat mapflag noteleport
+monk_in.gat mapflag noteleport
+in_rogue.gat mapflag noteleport
+job_sage.gat mapflag noteleport
+job_star.gat mapflag noteleport
+job_soul.gat mapflag noteleport
+que_ng.gat mapflag noteleport
+
+// Special Quests Places =========
+que_god01.gat mapflag noteleport
+que_god02.gat mapflag noteleport
+que_bingo.gat mapflag noteleport
+que_hugel.gat mapflag noteleport
+poring_c01.gat mapflag noteleport
+poring_c02.gat mapflag noteleport
+
+// Guild Castles =================
+aldeg_cas01.gat mapflag noteleport
+aldeg_cas02.gat mapflag noteleport
+aldeg_cas03.gat mapflag noteleport
+aldeg_cas04.gat mapflag noteleport
+aldeg_cas05.gat mapflag noteleport
+gefg_cas01.gat mapflag noteleport
+gefg_cas02.gat mapflag noteleport
+gefg_cas03.gat mapflag noteleport
+gefg_cas04.gat mapflag noteleport
+gefg_cas05.gat mapflag noteleport
+payg_cas01.gat mapflag noteleport
+payg_cas02.gat mapflag noteleport
+payg_cas03.gat mapflag noteleport
+payg_cas04.gat mapflag noteleport
+payg_cas05.gat mapflag noteleport
+prtg_cas01.gat mapflag noteleport
+prtg_cas02.gat mapflag noteleport
+prtg_cas03.gat mapflag noteleport
+prtg_cas04.gat mapflag noteleport
+prtg_cas05.gat mapflag noteleport
+nguild_alde.gat mapflag noteleport
+nguild_gef.gat mapflag noteleport
+nguild_pay.gat mapflag noteleport
+nguild_prt.gat mapflag noteleport
+
+// GvG Arenas ===================
+guild_vs1.gat mapflag noteleport
+guild_vs2.gat mapflag noteleport
+guild_vs3.gat mapflag noteleport
+guild_vs4.gat mapflag noteleport
+guild_vs5.gat mapflag noteleport
+
+// Arenas =====================>\\
+arena_room.gat mapflag noteleport
+sec_in01.gat mapflag noteleport
+sec_in02.gat mapflag noteleport
+
+// PvP Arenas=======================
+pvp_y_room.gat mapflag noteleport
+pvp_y_1-1.gat mapflag noteleport
+pvp_y_1-2.gat mapflag noteleport
+pvp_y_1-3.gat mapflag noteleport
+pvp_y_1-4.gat mapflag noteleport
+pvp_y_1-5.gat mapflag noteleport
+pvp_y_2-1.gat mapflag noteleport
+pvp_y_2-2.gat mapflag noteleport
+pvp_y_2-3.gat mapflag noteleport
+pvp_y_2-4.gat mapflag noteleport
+pvp_y_2-5.gat mapflag noteleport
+pvp_y_3-1.gat mapflag noteleport
+pvp_y_3-2.gat mapflag noteleport
+pvp_y_3-3.gat mapflag noteleport
+pvp_y_3-4.gat mapflag noteleport
+pvp_y_3-5.gat mapflag noteleport
+pvp_y_4-1.gat mapflag noteleport
+pvp_y_4-2.gat mapflag noteleport
+pvp_y_4-3.gat mapflag noteleport
+pvp_y_4-4.gat mapflag noteleport
+pvp_y_4-5.gat mapflag noteleport
+pvp_y_5-1.gat mapflag noteleport
+pvp_y_5-2.gat mapflag noteleport
+pvp_y_5-3.gat mapflag noteleport
+pvp_y_5-4.gat mapflag noteleport
+pvp_y_5-5.gat mapflag noteleport
+pvp_y_6-1.gat mapflag noteleport
+pvp_y_6-2.gat mapflag noteleport
+pvp_y_6-3.gat mapflag noteleport
+pvp_y_6-4.gat mapflag noteleport
+pvp_y_6-5.gat mapflag noteleport
+pvp_y_7-1.gat mapflag noteleport
+pvp_y_7-2.gat mapflag noteleport
+pvp_y_7-3.gat mapflag noteleport
+pvp_y_7-4.gat mapflag noteleport
+pvp_y_7-5.gat mapflag noteleport
+pvp_y_8-1.gat mapflag noteleport
+pvp_y_8-2.gat mapflag noteleport
+pvp_y_8-3.gat mapflag noteleport
+pvp_y_8-4.gat mapflag noteleport
+pvp_y_8-5.gat mapflag noteleport
+pvp_n_room.gat mapflag noteleport
+pvp_n_1-1.gat mapflag noteleport
+pvp_n_1-2.gat mapflag noteleport
+pvp_n_1-3.gat mapflag noteleport
+pvp_n_1-4.gat mapflag noteleport
+pvp_n_1-5.gat mapflag noteleport
+pvp_n_2-1.gat mapflag noteleport
+pvp_n_2-2.gat mapflag noteleport
+pvp_n_2-3.gat mapflag noteleport
+pvp_n_2-4.gat mapflag noteleport
+pvp_n_2-5.gat mapflag noteleport
+pvp_n_3-1.gat mapflag noteleport
+pvp_n_3-2.gat mapflag noteleport
+pvp_n_3-3.gat mapflag noteleport
+pvp_n_3-4.gat mapflag noteleport
+pvp_n_3-5.gat mapflag noteleport
+pvp_n_4-1.gat mapflag noteleport
+pvp_n_4-2.gat mapflag noteleport
+pvp_n_4-3.gat mapflag noteleport
+pvp_n_4-4.gat mapflag noteleport
+pvp_n_4-5.gat mapflag noteleport
+pvp_n_5-1.gat mapflag noteleport
+pvp_n_5-2.gat mapflag noteleport
+pvp_n_5-3.gat mapflag noteleport
+pvp_n_5-4.gat mapflag noteleport
+pvp_n_5-5.gat mapflag noteleport
+pvp_n_6-1.gat mapflag noteleport
+pvp_n_6-2.gat mapflag noteleport
+pvp_n_6-3.gat mapflag noteleport
+pvp_n_6-4.gat mapflag noteleport
+pvp_n_6-5.gat mapflag noteleport
+pvp_n_7-1.gat mapflag noteleport
+pvp_n_7-2.gat mapflag noteleport
+pvp_n_7-3.gat mapflag noteleport
+pvp_n_7-4.gat mapflag noteleport
+pvp_n_7-5.gat mapflag noteleport
+pvp_n_8-1.gat mapflag noteleport
+pvp_n_8-2.gat mapflag noteleport
+pvp_n_8-3.gat mapflag noteleport
+pvp_n_8-4.gat mapflag noteleport
+pvp_n_8-5.gat mapflag noteleport
+pvp_2vs2.gat mapflag noteleport
diff --git a/conf-tmpl/mapflag/nowarp.txt b/conf-tmpl/mapflag/nowarp.txt
index 62dd7b29c..0c841b1de 100644
--- a/conf-tmpl/mapflag/nowarp.txt
+++ b/conf-tmpl/mapflag/nowarp.txt
@@ -1,37 +1,37 @@
-//===== eAthena Script =======================================
-//= Map flags that disable warp
-//===== By: ==================================================
-//= eAthena Dev Team
-//= v 1.2
-//===== Current Version: =====================================
-
-// Special Quests Places =====
-ama_test.gat mapflag nowarp
-gon_test.gat mapflag nowarp
-
-// Guild Castles =============
-aldeg_cas01.gat mapflag nowarp
-aldeg_cas02.gat mapflag nowarp
-aldeg_cas03.gat mapflag nowarp
-aldeg_cas04.gat mapflag nowarp
-aldeg_cas05.gat mapflag nowarp
-gefg_cas01.gat mapflag nowarp
-gefg_cas02.gat mapflag nowarp
-gefg_cas03.gat mapflag nowarp
-gefg_cas04.gat mapflag nowarp
-gefg_cas05.gat mapflag nowarp
-payg_cas01.gat mapflag nowarp
-payg_cas02.gat mapflag nowarp
-payg_cas03.gat mapflag nowarp
-payg_cas04.gat mapflag nowarp
-payg_cas05.gat mapflag nowarp
-prtg_cas01.gat mapflag nowarp
-prtg_cas02.gat mapflag nowarp
-prtg_cas03.gat mapflag nowarp
-prtg_cas04.gat mapflag nowarp
-prtg_cas05.gat mapflag nowarp
-n_castle.gat mapflag nowarp
-nguild_alde.gat mapflag nowarp
-nguild_gef.gat mapflag nowarp
-nguild_pay.gat mapflag nowarp
-nguild_prt.gat mapflag nowarp
+//===== eAthena Script =======================================
+//= Map flags that disable warp
+//===== By: ==================================================
+//= eAthena Dev Team
+//= v 1.2
+//===== Current Version: =====================================
+
+// Special Quests Places =====
+ama_test.gat mapflag nowarp
+gon_test.gat mapflag nowarp
+
+// Guild Castles =============
+aldeg_cas01.gat mapflag nowarp
+aldeg_cas02.gat mapflag nowarp
+aldeg_cas03.gat mapflag nowarp
+aldeg_cas04.gat mapflag nowarp
+aldeg_cas05.gat mapflag nowarp
+gefg_cas01.gat mapflag nowarp
+gefg_cas02.gat mapflag nowarp
+gefg_cas03.gat mapflag nowarp
+gefg_cas04.gat mapflag nowarp
+gefg_cas05.gat mapflag nowarp
+payg_cas01.gat mapflag nowarp
+payg_cas02.gat mapflag nowarp
+payg_cas03.gat mapflag nowarp
+payg_cas04.gat mapflag nowarp
+payg_cas05.gat mapflag nowarp
+prtg_cas01.gat mapflag nowarp
+prtg_cas02.gat mapflag nowarp
+prtg_cas03.gat mapflag nowarp
+prtg_cas04.gat mapflag nowarp
+prtg_cas05.gat mapflag nowarp
+n_castle.gat mapflag nowarp
+nguild_alde.gat mapflag nowarp
+nguild_gef.gat mapflag nowarp
+nguild_pay.gat mapflag nowarp
+nguild_prt.gat mapflag nowarp
diff --git a/conf-tmpl/mapflag/nowarpto.txt b/conf-tmpl/mapflag/nowarpto.txt
index 955f931eb..90ed5a70b 100644
--- a/conf-tmpl/mapflag/nowarpto.txt
+++ b/conf-tmpl/mapflag/nowarpto.txt
@@ -1,42 +1,42 @@
-//===== eAthena Script =======================================
-//= Map flags that disable warpto
-//===== By: ==================================================
-//= eAthena Dev Team
-//= v 1.3
-//===== Current Version: =====================================
-
-// Guild Castles ========================
-//alde_gld.gat mapflag nowarpto
-aldeg_cas01.gat mapflag nowarpto
-aldeg_cas02.gat mapflag nowarpto
-aldeg_cas03.gat mapflag nowarpto
-aldeg_cas04.gat mapflag nowarpto
-aldeg_cas05.gat mapflag nowarpto
-gefg_cas01.gat mapflag nowarpto
-gefg_cas02.gat mapflag nowarpto
-gefg_cas03.gat mapflag nowarpto
-gefg_cas04.gat mapflag nowarpto
-gefg_cas05.gat mapflag nowarpto
-//pay_gld.gat mapflag nowarpto
-payg_cas01.gat mapflag nowarpto
-payg_cas02.gat mapflag nowarpto
-payg_cas03.gat mapflag nowarpto
-payg_cas04.gat mapflag nowarpto
-payg_cas05.gat mapflag nowarpto
-//prt_gld.gat mapflag nowarpto
-prtg_cas01.gat mapflag nowarpto
-prtg_cas02.gat mapflag nowarpto
-prtg_cas03.gat mapflag nowarpto
-prtg_cas04.gat mapflag nowarpto
-prtg_cas05.gat mapflag nowarpto
-//Novice Guild
-n_castle.gat mapflag nowarpto
-nguild_alde.gat mapflag nowarpto
-nguild_gef.gat mapflag nowarpto
-nguild_pay.gat mapflag nowarpto
-nguild_prt.gat mapflag nowarpto
-//Lighthalzen Bio-Lab 3F
-lhz_dun03.gat mapflag nowarpto
-// Special Quests Places =======
-ama_test.gat mapflag nowarpto
+//===== eAthena Script =======================================
+//= Map flags that disable warpto
+//===== By: ==================================================
+//= eAthena Dev Team
+//= v 1.3
+//===== Current Version: =====================================
+
+// Guild Castles ========================
+//alde_gld.gat mapflag nowarpto
+aldeg_cas01.gat mapflag nowarpto
+aldeg_cas02.gat mapflag nowarpto
+aldeg_cas03.gat mapflag nowarpto
+aldeg_cas04.gat mapflag nowarpto
+aldeg_cas05.gat mapflag nowarpto
+gefg_cas01.gat mapflag nowarpto
+gefg_cas02.gat mapflag nowarpto
+gefg_cas03.gat mapflag nowarpto
+gefg_cas04.gat mapflag nowarpto
+gefg_cas05.gat mapflag nowarpto
+//pay_gld.gat mapflag nowarpto
+payg_cas01.gat mapflag nowarpto
+payg_cas02.gat mapflag nowarpto
+payg_cas03.gat mapflag nowarpto
+payg_cas04.gat mapflag nowarpto
+payg_cas05.gat mapflag nowarpto
+//prt_gld.gat mapflag nowarpto
+prtg_cas01.gat mapflag nowarpto
+prtg_cas02.gat mapflag nowarpto
+prtg_cas03.gat mapflag nowarpto
+prtg_cas04.gat mapflag nowarpto
+prtg_cas05.gat mapflag nowarpto
+//Novice Guild
+n_castle.gat mapflag nowarpto
+nguild_alde.gat mapflag nowarpto
+nguild_gef.gat mapflag nowarpto
+nguild_pay.gat mapflag nowarpto
+nguild_prt.gat mapflag nowarpto
+//Lighthalzen Bio-Lab 3F
+lhz_dun03.gat mapflag nowarpto
+// Special Quests Places =======
+ama_test.gat mapflag nowarpto
gon_test.gat mapflag nowarpto \ No newline at end of file
diff --git a/conf-tmpl/mapflag/pvp.txt b/conf-tmpl/mapflag/pvp.txt
index 4f1c34730..cf25c8e50 100644
--- a/conf-tmpl/mapflag/pvp.txt
+++ b/conf-tmpl/mapflag/pvp.txt
@@ -1,94 +1,94 @@
-//===== eAthena Script =======================================
-//= Map flags that enable pvp
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Description: =========================================
-//= pvp: Turns on PvP mode
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-// PvP ========================
-pvp_y_1-1.gat mapflag pvp
-pvp_y_1-2.gat mapflag pvp
-pvp_y_1-3.gat mapflag pvp
-pvp_y_1-4.gat mapflag pvp
-pvp_y_1-5.gat mapflag pvp
-pvp_y_2-1.gat mapflag pvp
-pvp_y_2-2.gat mapflag pvp
-pvp_y_2-3.gat mapflag pvp
-pvp_y_2-4.gat mapflag pvp
-pvp_y_2-5.gat mapflag pvp
-pvp_y_3-1.gat mapflag pvp
-pvp_y_3-2.gat mapflag pvp
-pvp_y_3-3.gat mapflag pvp
-pvp_y_3-4.gat mapflag pvp
-pvp_y_3-5.gat mapflag pvp
-pvp_y_4-1.gat mapflag pvp
-pvp_y_4-2.gat mapflag pvp
-pvp_y_4-3.gat mapflag pvp
-pvp_y_4-4.gat mapflag pvp
-pvp_y_4-5.gat mapflag pvp
-pvp_y_5-1.gat mapflag pvp
-pvp_y_5-2.gat mapflag pvp
-pvp_y_5-3.gat mapflag pvp
-pvp_y_5-4.gat mapflag pvp
-pvp_y_5-5.gat mapflag pvp
-pvp_y_6-1.gat mapflag pvp
-pvp_y_6-2.gat mapflag pvp
-pvp_y_6-3.gat mapflag pvp
-pvp_y_6-4.gat mapflag pvp
-pvp_y_6-5.gat mapflag pvp
-pvp_y_7-1.gat mapflag pvp
-pvp_y_7-2.gat mapflag pvp
-pvp_y_7-3.gat mapflag pvp
-pvp_y_7-4.gat mapflag pvp
-pvp_y_7-5.gat mapflag pvp
-pvp_y_8-1.gat mapflag pvp
-pvp_y_8-2.gat mapflag pvp
-pvp_y_8-3.gat mapflag pvp
-pvp_y_8-4.gat mapflag pvp
-pvp_y_8-5.gat mapflag pvp
-pvp_n_1-1.gat mapflag pvp
-pvp_n_1-2.gat mapflag pvp
-pvp_n_1-3.gat mapflag pvp
-pvp_n_1-4.gat mapflag pvp
-pvp_n_1-5.gat mapflag pvp
-pvp_n_2-1.gat mapflag pvp
-pvp_n_2-2.gat mapflag pvp
-pvp_n_2-3.gat mapflag pvp
-pvp_n_2-4.gat mapflag pvp
-pvp_n_2-5.gat mapflag pvp
-pvp_n_3-1.gat mapflag pvp
-pvp_n_3-2.gat mapflag pvp
-pvp_n_3-3.gat mapflag pvp
-pvp_n_3-4.gat mapflag pvp
-pvp_n_3-5.gat mapflag pvp
-pvp_n_4-1.gat mapflag pvp
-pvp_n_4-2.gat mapflag pvp
-pvp_n_4-3.gat mapflag pvp
-pvp_n_4-4.gat mapflag pvp
-pvp_n_4-5.gat mapflag pvp
-pvp_n_5-1.gat mapflag pvp
-pvp_n_5-2.gat mapflag pvp
-pvp_n_5-3.gat mapflag pvp
-pvp_n_5-4.gat mapflag pvp
-pvp_n_5-5.gat mapflag pvp
-pvp_n_6-1.gat mapflag pvp
-pvp_n_6-2.gat mapflag pvp
-pvp_n_6-3.gat mapflag pvp
-pvp_n_6-4.gat mapflag pvp
-pvp_n_6-5.gat mapflag pvp
-pvp_n_7-1.gat mapflag pvp
-pvp_n_7-2.gat mapflag pvp
-pvp_n_7-3.gat mapflag pvp
-pvp_n_7-4.gat mapflag pvp
-pvp_n_7-5.gat mapflag pvp
-pvp_n_8-1.gat mapflag pvp
-pvp_n_8-2.gat mapflag pvp
-pvp_n_8-3.gat mapflag pvp
-pvp_n_8-4.gat mapflag pvp
-pvp_n_8-5.gat mapflag pvp
-pvp_2vs2.gat mapflag pvp
+//===== eAthena Script =======================================
+//= Map flags that enable pvp
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Description: =========================================
+//= pvp: Turns on PvP mode
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+// PvP ========================
+pvp_y_1-1.gat mapflag pvp
+pvp_y_1-2.gat mapflag pvp
+pvp_y_1-3.gat mapflag pvp
+pvp_y_1-4.gat mapflag pvp
+pvp_y_1-5.gat mapflag pvp
+pvp_y_2-1.gat mapflag pvp
+pvp_y_2-2.gat mapflag pvp
+pvp_y_2-3.gat mapflag pvp
+pvp_y_2-4.gat mapflag pvp
+pvp_y_2-5.gat mapflag pvp
+pvp_y_3-1.gat mapflag pvp
+pvp_y_3-2.gat mapflag pvp
+pvp_y_3-3.gat mapflag pvp
+pvp_y_3-4.gat mapflag pvp
+pvp_y_3-5.gat mapflag pvp
+pvp_y_4-1.gat mapflag pvp
+pvp_y_4-2.gat mapflag pvp
+pvp_y_4-3.gat mapflag pvp
+pvp_y_4-4.gat mapflag pvp
+pvp_y_4-5.gat mapflag pvp
+pvp_y_5-1.gat mapflag pvp
+pvp_y_5-2.gat mapflag pvp
+pvp_y_5-3.gat mapflag pvp
+pvp_y_5-4.gat mapflag pvp
+pvp_y_5-5.gat mapflag pvp
+pvp_y_6-1.gat mapflag pvp
+pvp_y_6-2.gat mapflag pvp
+pvp_y_6-3.gat mapflag pvp
+pvp_y_6-4.gat mapflag pvp
+pvp_y_6-5.gat mapflag pvp
+pvp_y_7-1.gat mapflag pvp
+pvp_y_7-2.gat mapflag pvp
+pvp_y_7-3.gat mapflag pvp
+pvp_y_7-4.gat mapflag pvp
+pvp_y_7-5.gat mapflag pvp
+pvp_y_8-1.gat mapflag pvp
+pvp_y_8-2.gat mapflag pvp
+pvp_y_8-3.gat mapflag pvp
+pvp_y_8-4.gat mapflag pvp
+pvp_y_8-5.gat mapflag pvp
+pvp_n_1-1.gat mapflag pvp
+pvp_n_1-2.gat mapflag pvp
+pvp_n_1-3.gat mapflag pvp
+pvp_n_1-4.gat mapflag pvp
+pvp_n_1-5.gat mapflag pvp
+pvp_n_2-1.gat mapflag pvp
+pvp_n_2-2.gat mapflag pvp
+pvp_n_2-3.gat mapflag pvp
+pvp_n_2-4.gat mapflag pvp
+pvp_n_2-5.gat mapflag pvp
+pvp_n_3-1.gat mapflag pvp
+pvp_n_3-2.gat mapflag pvp
+pvp_n_3-3.gat mapflag pvp
+pvp_n_3-4.gat mapflag pvp
+pvp_n_3-5.gat mapflag pvp
+pvp_n_4-1.gat mapflag pvp
+pvp_n_4-2.gat mapflag pvp
+pvp_n_4-3.gat mapflag pvp
+pvp_n_4-4.gat mapflag pvp
+pvp_n_4-5.gat mapflag pvp
+pvp_n_5-1.gat mapflag pvp
+pvp_n_5-2.gat mapflag pvp
+pvp_n_5-3.gat mapflag pvp
+pvp_n_5-4.gat mapflag pvp
+pvp_n_5-5.gat mapflag pvp
+pvp_n_6-1.gat mapflag pvp
+pvp_n_6-2.gat mapflag pvp
+pvp_n_6-3.gat mapflag pvp
+pvp_n_6-4.gat mapflag pvp
+pvp_n_6-5.gat mapflag pvp
+pvp_n_7-1.gat mapflag pvp
+pvp_n_7-2.gat mapflag pvp
+pvp_n_7-3.gat mapflag pvp
+pvp_n_7-4.gat mapflag pvp
+pvp_n_7-5.gat mapflag pvp
+pvp_n_8-1.gat mapflag pvp
+pvp_n_8-2.gat mapflag pvp
+pvp_n_8-3.gat mapflag pvp
+pvp_n_8-4.gat mapflag pvp
+pvp_n_8-5.gat mapflag pvp
+pvp_2vs2.gat mapflag pvp
diff --git a/conf-tmpl/mapflag/pvp_noguild.txt b/conf-tmpl/mapflag/pvp_noguild.txt
index f05f7b845..8c3167440 100644
--- a/conf-tmpl/mapflag/pvp_noguild.txt
+++ b/conf-tmpl/mapflag/pvp_noguild.txt
@@ -1,89 +1,89 @@
-//===== eAthena Script =======================================
-//= Map flags that disable guilds on pvp grounds.
-//===== By: ==================================================
-//= eAthena Dev Team
-//= v 1.1
-//===== Current Version: =====================================
-
-// PvP Arenas =================
-pvp_y_1-1.gat mapflag pvp_noguild
-pvp_y_1-2.gat mapflag pvp_noguild
-pvp_y_1-3.gat mapflag pvp_noguild
-pvp_y_1-4.gat mapflag pvp_noguild
-pvp_y_1-5.gat mapflag pvp_noguild
-pvp_y_2-1.gat mapflag pvp_noguild
-pvp_y_2-2.gat mapflag pvp_noguild
-pvp_y_2-3.gat mapflag pvp_noguild
-pvp_y_2-4.gat mapflag pvp_noguild
-pvp_y_2-5.gat mapflag pvp_noguild
-pvp_y_3-1.gat mapflag pvp_noguild
-pvp_y_3-2.gat mapflag pvp_noguild
-pvp_y_3-3.gat mapflag pvp_noguild
-pvp_y_3-4.gat mapflag pvp_noguild
-pvp_y_3-5.gat mapflag pvp_noguild
-pvp_y_4-1.gat mapflag pvp_noguild
-pvp_y_4-2.gat mapflag pvp_noguild
-pvp_y_4-3.gat mapflag pvp_noguild
-pvp_y_4-4.gat mapflag pvp_noguild
-pvp_y_4-5.gat mapflag pvp_noguild
-pvp_y_5-1.gat mapflag pvp_noguild
-pvp_y_5-2.gat mapflag pvp_noguild
-pvp_y_5-3.gat mapflag pvp_noguild
-pvp_y_5-4.gat mapflag pvp_noguild
-pvp_y_5-5.gat mapflag pvp_noguild
-pvp_y_6-1.gat mapflag pvp_noguild
-pvp_y_6-2.gat mapflag pvp_noguild
-pvp_y_6-3.gat mapflag pvp_noguild
-pvp_y_6-4.gat mapflag pvp_noguild
-pvp_y_6-5.gat mapflag pvp_noguild
-pvp_y_7-1.gat mapflag pvp_noguild
-pvp_y_7-2.gat mapflag pvp_noguild
-pvp_y_7-3.gat mapflag pvp_noguild
-pvp_y_7-4.gat mapflag pvp_noguild
-pvp_y_7-5.gat mapflag pvp_noguild
-pvp_y_8-1.gat mapflag pvp_noguild
-pvp_y_8-2.gat mapflag pvp_noguild
-pvp_y_8-3.gat mapflag pvp_noguild
-pvp_y_8-4.gat mapflag pvp_noguild
-pvp_y_8-5.gat mapflag pvp_noguild
-pvp_n_1-1.gat mapflag pvp_noguild
-pvp_n_1-2.gat mapflag pvp_noguild
-pvp_n_1-3.gat mapflag pvp_noguild
-pvp_n_1-4.gat mapflag pvp_noguild
-pvp_n_1-5.gat mapflag pvp_noguild
-pvp_n_2-1.gat mapflag pvp_noguild
-pvp_n_2-2.gat mapflag pvp_noguild
-pvp_n_2-3.gat mapflag pvp_noguild
-pvp_n_2-4.gat mapflag pvp_noguild
-pvp_n_2-5.gat mapflag pvp_noguild
-pvp_n_3-1.gat mapflag pvp_noguild
-pvp_n_3-2.gat mapflag pvp_noguild
-pvp_n_3-3.gat mapflag pvp_noguild
-pvp_n_3-4.gat mapflag pvp_noguild
-pvp_n_3-5.gat mapflag pvp_noguild
-pvp_n_4-1.gat mapflag pvp_noguild
-pvp_n_4-2.gat mapflag pvp_noguild
-pvp_n_4-3.gat mapflag pvp_noguild
-pvp_n_4-4.gat mapflag pvp_noguild
-pvp_n_4-5.gat mapflag pvp_noguild
-pvp_n_5-1.gat mapflag pvp_noguild
-pvp_n_5-2.gat mapflag pvp_noguild
-pvp_n_5-3.gat mapflag pvp_noguild
-pvp_n_5-4.gat mapflag pvp_noguild
-pvp_n_5-5.gat mapflag pvp_noguild
-pvp_n_6-1.gat mapflag pvp_noguild
-pvp_n_6-2.gat mapflag pvp_noguild
-pvp_n_6-3.gat mapflag pvp_noguild
-pvp_n_6-4.gat mapflag pvp_noguild
-pvp_n_6-5.gat mapflag pvp_noguild
-pvp_n_7-1.gat mapflag pvp_noguild
-pvp_n_7-2.gat mapflag pvp_noguild
-pvp_n_7-3.gat mapflag pvp_noguild
-pvp_n_7-4.gat mapflag pvp_noguild
-pvp_n_7-5.gat mapflag pvp_noguild
-pvp_n_8-1.gat mapflag pvp_noguild
-pvp_n_8-2.gat mapflag pvp_noguild
-pvp_n_8-3.gat mapflag pvp_noguild
-pvp_n_8-4.gat mapflag pvp_noguild
-pvp_n_8-5.gat mapflag pvp_noguild
-pvp_2vs2.gat mapflag pvp_noguild
+//===== eAthena Script =======================================
+//= Map flags that disable guilds on pvp grounds.
+//===== By: ==================================================
+//= eAthena Dev Team
+//= v 1.1
+//===== Current Version: =====================================
+
+// PvP Arenas =================
+pvp_y_1-1.gat mapflag pvp_noguild
+pvp_y_1-2.gat mapflag pvp_noguild
+pvp_y_1-3.gat mapflag pvp_noguild
+pvp_y_1-4.gat mapflag pvp_noguild
+pvp_y_1-5.gat mapflag pvp_noguild
+pvp_y_2-1.gat mapflag pvp_noguild
+pvp_y_2-2.gat mapflag pvp_noguild
+pvp_y_2-3.gat mapflag pvp_noguild
+pvp_y_2-4.gat mapflag pvp_noguild
+pvp_y_2-5.gat mapflag pvp_noguild
+pvp_y_3-1.gat mapflag pvp_noguild
+pvp_y_3-2.gat mapflag pvp_noguild
+pvp_y_3-3.gat mapflag pvp_noguild
+pvp_y_3-4.gat mapflag pvp_noguild
+pvp_y_3-5.gat mapflag pvp_noguild
+pvp_y_4-1.gat mapflag pvp_noguild
+pvp_y_4-2.gat mapflag pvp_noguild
+pvp_y_4-3.gat mapflag pvp_noguild
+pvp_y_4-4.gat mapflag pvp_noguild
+pvp_y_4-5.gat mapflag pvp_noguild
+pvp_y_5-1.gat mapflag pvp_noguild
+pvp_y_5-2.gat mapflag pvp_noguild
+pvp_y_5-3.gat mapflag pvp_noguild
+pvp_y_5-4.gat mapflag pvp_noguild
+pvp_y_5-5.gat mapflag pvp_noguild
+pvp_y_6-1.gat mapflag pvp_noguild
+pvp_y_6-2.gat mapflag pvp_noguild
+pvp_y_6-3.gat mapflag pvp_noguild
+pvp_y_6-4.gat mapflag pvp_noguild
+pvp_y_6-5.gat mapflag pvp_noguild
+pvp_y_7-1.gat mapflag pvp_noguild
+pvp_y_7-2.gat mapflag pvp_noguild
+pvp_y_7-3.gat mapflag pvp_noguild
+pvp_y_7-4.gat mapflag pvp_noguild
+pvp_y_7-5.gat mapflag pvp_noguild
+pvp_y_8-1.gat mapflag pvp_noguild
+pvp_y_8-2.gat mapflag pvp_noguild
+pvp_y_8-3.gat mapflag pvp_noguild
+pvp_y_8-4.gat mapflag pvp_noguild
+pvp_y_8-5.gat mapflag pvp_noguild
+pvp_n_1-1.gat mapflag pvp_noguild
+pvp_n_1-2.gat mapflag pvp_noguild
+pvp_n_1-3.gat mapflag pvp_noguild
+pvp_n_1-4.gat mapflag pvp_noguild
+pvp_n_1-5.gat mapflag pvp_noguild
+pvp_n_2-1.gat mapflag pvp_noguild
+pvp_n_2-2.gat mapflag pvp_noguild
+pvp_n_2-3.gat mapflag pvp_noguild
+pvp_n_2-4.gat mapflag pvp_noguild
+pvp_n_2-5.gat mapflag pvp_noguild
+pvp_n_3-1.gat mapflag pvp_noguild
+pvp_n_3-2.gat mapflag pvp_noguild
+pvp_n_3-3.gat mapflag pvp_noguild
+pvp_n_3-4.gat mapflag pvp_noguild
+pvp_n_3-5.gat mapflag pvp_noguild
+pvp_n_4-1.gat mapflag pvp_noguild
+pvp_n_4-2.gat mapflag pvp_noguild
+pvp_n_4-3.gat mapflag pvp_noguild
+pvp_n_4-4.gat mapflag pvp_noguild
+pvp_n_4-5.gat mapflag pvp_noguild
+pvp_n_5-1.gat mapflag pvp_noguild
+pvp_n_5-2.gat mapflag pvp_noguild
+pvp_n_5-3.gat mapflag pvp_noguild
+pvp_n_5-4.gat mapflag pvp_noguild
+pvp_n_5-5.gat mapflag pvp_noguild
+pvp_n_6-1.gat mapflag pvp_noguild
+pvp_n_6-2.gat mapflag pvp_noguild
+pvp_n_6-3.gat mapflag pvp_noguild
+pvp_n_6-4.gat mapflag pvp_noguild
+pvp_n_6-5.gat mapflag pvp_noguild
+pvp_n_7-1.gat mapflag pvp_noguild
+pvp_n_7-2.gat mapflag pvp_noguild
+pvp_n_7-3.gat mapflag pvp_noguild
+pvp_n_7-4.gat mapflag pvp_noguild
+pvp_n_7-5.gat mapflag pvp_noguild
+pvp_n_8-1.gat mapflag pvp_noguild
+pvp_n_8-2.gat mapflag pvp_noguild
+pvp_n_8-3.gat mapflag pvp_noguild
+pvp_n_8-4.gat mapflag pvp_noguild
+pvp_n_8-5.gat mapflag pvp_noguild
+pvp_2vs2.gat mapflag pvp_noguild
diff --git a/conf-tmpl/mapflag/pvp_noparty.txt b/conf-tmpl/mapflag/pvp_noparty.txt
index 2bff06ad0..a06178b24 100644
--- a/conf-tmpl/mapflag/pvp_noparty.txt
+++ b/conf-tmpl/mapflag/pvp_noparty.txt
@@ -1,13 +1,13 @@
-//===== eAthena Script =======================================
-//= Map flags that disable parties in pvp maps
-//===== By: ==================================================
-//= eAthena Dev Team
-//= v 1.2
-//===== Current Version: =====================================
-
-// GvG Arenas =================
-guild_vs1.gat mapflag pvp_noparty
-guild_vs2.gat mapflag pvp_noparty
-guild_vs3.gat mapflag pvp_noparty
-guild_vs4.gat mapflag pvp_noparty
-guild_vs5.gat mapflag pvp_noparty
+//===== eAthena Script =======================================
+//= Map flags that disable parties in pvp maps
+//===== By: ==================================================
+//= eAthena Dev Team
+//= v 1.2
+//===== Current Version: =====================================
+
+// GvG Arenas =================
+guild_vs1.gat mapflag pvp_noparty
+guild_vs2.gat mapflag pvp_noparty
+guild_vs3.gat mapflag pvp_noparty
+guild_vs4.gat mapflag pvp_noparty
+guild_vs5.gat mapflag pvp_noparty
diff --git a/conf-tmpl/mapflag/restricted.txt b/conf-tmpl/mapflag/restricted.txt
index e5e21a5d5..2545644d5 100644
--- a/conf-tmpl/mapflag/restricted.txt
+++ b/conf-tmpl/mapflag/restricted.txt
@@ -1,20 +1,20 @@
-//===== eAthena Script =======================================
-//= Map flags that disable certain items/skills configured in
-//= item_noequip.txt and skill_nocast_db.txt
-//===== By: ==================================================
-//= eAthena Dev Team
-//= 1.0 [Komurka]
-//===== Current Version: =====================================
-
-//Aldebaran Turbo Track
-alde_tt02.gat mapflag restricted 1
-turbo_n_1.gat mapflag restricted 1
-turbo_n_4.gat mapflag restricted 1
-turbo_n_8.gat mapflag restricted 1
-turbo_n_16.gat mapflag restricted 1
-turbo_e_4.gat mapflag restricted 1
-turbo_e_8.gat mapflag restricted 1
-turbo_e_16.gat mapflag restricted 1
-
-//Jail
-sec_pri.gat mapflag restricted 2
+//===== eAthena Script =======================================
+//= Map flags that disable certain items/skills configured in
+//= item_noequip.txt and skill_nocast_db.txt
+//===== By: ==================================================
+//= eAthena Dev Team
+//= 1.0 [Komurka]
+//===== Current Version: =====================================
+
+//Aldebaran Turbo Track
+alde_tt02.gat mapflag restricted 1
+turbo_n_1.gat mapflag restricted 1
+turbo_n_4.gat mapflag restricted 1
+turbo_n_8.gat mapflag restricted 1
+turbo_n_16.gat mapflag restricted 1
+turbo_e_4.gat mapflag restricted 1
+turbo_e_8.gat mapflag restricted 1
+turbo_e_16.gat mapflag restricted 1
+
+//Jail
+sec_pri.gat mapflag restricted 2
diff --git a/conf-tmpl/maps_athena.conf b/conf-tmpl/maps_athena.conf
index 70735ab2f..49a5ad8f3 100644
--- a/conf-tmpl/maps_athena.conf
+++ b/conf-tmpl/maps_athena.conf
@@ -1,807 +1,807 @@
-//------------------------- Normal Maps ---------------------------
-map: alb_ship.gat
-map: alb2trea.gat
-map: alberta.gat
-map: alberta_in.gat
-map: alde_dun01.gat
-map: alde_dun02.gat
-map: alde_dun03.gat
-map: alde_dun04.gat
-map: aldeba_in.gat
-map: aldebaran.gat
-map: anthell01.gat
-map: anthell02.gat
-map: arena_room.gat
-map: c_tower1.gat
-map: c_tower2.gat
-map: c_tower3.gat
-map: c_tower4.gat
-//map: force_map1.gat
-//map: force_map2.gat
-//map: force_map3.gat
-map: force_1-1.gat
-map: force_1-2.gat
-map: force_1-3.gat
-map: force_2-1.gat
-map: force_2-2.gat
-map: force_2-3.gat
-map: force_3-1.gat
-map: force_3-2.gat
-map: force_3-3.gat
-map: gef_dun00.gat
-map: gef_dun01.gat
-map: gef_dun02.gat
-map: gef_dun03.gat
-map: gef_fild00.gat
-map: gef_fild01.gat
-map: gef_fild02.gat
-map: gef_fild03.gat
-map: gef_fild04.gat
-map: gef_fild05.gat
-map: gef_fild06.gat
-map: gef_fild07.gat
-map: gef_fild08.gat
-map: gef_fild09.gat
-map: gef_fild10.gat
-map: gef_fild11.gat
-map: gef_fild12.gat
-map: gef_fild13.gat
-map: gef_fild14.gat
-map: gef_tower.gat
-map: geffen.gat
-map: geffen_in.gat
-map: gl_cas01.gat
-map: gl_cas02.gat
-map: gl_church.gat
-map: gl_chyard.gat
-map: gl_dun01.gat
-map: gl_dun02.gat
-map: gl_in01.gat
-map: gl_knt01.gat
-map: gl_knt02.gat
-map: gl_prison.gat
-map: gl_prison1.gat
-map: gl_sew01.gat
-map: gl_sew02.gat
-map: gl_sew03.gat
-map: gl_sew04.gat
-map: gl_step.gat
-map: glast_01.gat
-//map: hunter_1-1.gat
-//map: hunter_2-1.gat
-//map: hunter_3-1.gat
-map: in_hunter.gat
-map: in_moc_16.gat
-map: in_orcs01.gat
-map: in_sphinx1.gat
-map: in_sphinx2.gat
-map: in_sphinx3.gat
-map: in_sphinx4.gat
-map: in_sphinx5.gat
-map: iz_dun00.gat
-map: iz_dun01.gat
-map: iz_dun02.gat
-map: iz_dun03.gat
-map: iz_dun04.gat
-map: izlu2dun.gat
-map: izlude.gat
-map: izlude_in.gat
-map: job_thief1.gat
-//map: knight_1-1.gat
-//map: knight_2-1.gat
-//map: knight_3-1.gat
-map: mjo_dun01.gat
-map: mjo_dun02.gat
-map: mjo_dun03.gat
-map: mjolnir_01.gat
-map: mjolnir_02.gat
-map: mjolnir_03.gat
-map: mjolnir_04.gat
-map: mjolnir_05.gat
-map: mjolnir_06.gat
-map: mjolnir_07.gat
-map: mjolnir_08.gat
-map: mjolnir_09.gat
-map: mjolnir_10.gat
-map: mjolnir_11.gat
-map: mjolnir_12.gat
-map: moc_castle.gat
-map: moc_fild01.gat
-map: moc_fild02.gat
-map: moc_fild03.gat
-map: moc_fild04.gat
-map: moc_fild05.gat
-map: moc_fild06.gat
-map: moc_fild07.gat
-map: moc_fild08.gat
-map: moc_fild09.gat
-map: moc_fild10.gat
-map: moc_fild11.gat
-map: moc_fild12.gat
-map: moc_fild13.gat
-map: moc_fild14.gat
-map: moc_fild15.gat
-map: moc_fild16.gat
-map: moc_fild17.gat
-map: moc_fild18.gat
-map: moc_fild19.gat
-map: moc_pryd01.gat
-map: moc_pryd02.gat
-map: moc_pryd03.gat
-map: moc_pryd04.gat
-map: moc_pryd05.gat
-map: moc_pryd06.gat
-map: moc_prydb1.gat
-map: moc_ruins.gat
-map: monk_in.gat
-map: morocc.gat
-map: morocc_in.gat
-map: new_zone01.gat
-map: new_zone02.gat
-map: new_zone03.gat
-map: new_zone04.gat
-//map: new_1-1.gat
-//map: new_1-2.gat
-//map: new_1-3.gat
-//map: new_1-4.gat
-//map: new_2-1.gat
-//map: new_2-2.gat
-//map: new_2-3.gat
-//map: new_2-4.gat
-//map: new_3-1.gat
-//map: new_3-2.gat
-//map: new_3-3.gat
-//map: new_3-4.gat
-//map: new_4-1.gat
-//map: new_4-2.gat
-//map: new_4-3.gat
-//map: new_4-4.gat
-//map: new_5-1.gat
-//map: new_5-2.gat
-//map: new_5-3.gat
-//map: new_5-4.gat
-map: orcsdun01.gat
-map: orcsdun02.gat
-//map: ordeal_a00.gat
-//map: ordeal_a02.gat
-map: ordeal_1-1.gat
-map: ordeal_1-2.gat
-//map: ordeal_1-3.gat
-//map: ordeal_1-4.gat
-map: ordeal_2-1.gat
-map: ordeal_2-2.gat
-//map: ordeal_2-3.gat
-//map: ordeal_2-4.gat
-map: ordeal_3-1.gat
-map: ordeal_3-2.gat
-//map: ordeal_3-3.gat
-//map: ordeal_3-4.gat
-map: pay_arche.gat
-map: pay_dun00.gat
-map: pay_dun01.gat
-map: pay_dun02.gat
-map: pay_dun03.gat
-map: pay_dun04.gat
-map: pay_fild01.gat
-map: pay_fild02.gat
-map: pay_fild03.gat
-map: pay_fild04.gat
-map: pay_fild05.gat
-map: pay_fild06.gat
-map: pay_fild07.gat
-map: pay_fild08.gat
-map: pay_fild09.gat
-map: pay_fild10.gat
-map: pay_fild11.gat
-//map: payon.gat //moved down to new maps
-//map: payon_in01.gat //moved down to new maps
-//map: payon_in02.gat //moved down to new maps
-//map: priest_1-1.gat
-//map: priest_2-1.gat
-//map: priest_3-1.gat
-map: prontera.gat
-map: prt_are_in.gat
-map: prt_are01.gat
-map: prt_castle.gat
-map: prt_church.gat
-map: prt_fild00.gat
-map: prt_fild01.gat
-map: prt_fild02.gat
-map: prt_fild03.gat
-map: prt_fild04.gat
-map: prt_fild05.gat
-map: prt_fild06.gat
-map: prt_fild07.gat
-map: prt_fild08.gat
-map: prt_fild09.gat
-map: prt_fild10.gat
-map: prt_fild11.gat
-map: prt_in.gat
-map: prt_maze01.gat
-map: prt_maze02.gat
-map: prt_maze03.gat
-map: prt_monk.gat
-map: prt_sewb1.gat
-map: prt_sewb2.gat
-map: prt_sewb3.gat
-map: prt_sewb4.gat
-//map: pvp_room.gat
-map: pvp_2vs2.gat
-map: pvp_c_room.gat
-map: pvp_n_1-1.gat
-map: pvp_n_1-2.gat
-map: pvp_n_1-3.gat
-map: pvp_n_1-4.gat
-map: pvp_n_1-5.gat
-map: pvp_n_2-1.gat
-map: pvp_n_2-2.gat
-map: pvp_n_2-3.gat
-map: pvp_n_2-4.gat
-map: pvp_n_2-5.gat
-map: pvp_n_3-1.gat
-map: pvp_n_3-2.gat
-map: pvp_n_3-3.gat
-map: pvp_n_3-4.gat
-map: pvp_n_3-5.gat
-map: pvp_n_4-1.gat
-map: pvp_n_4-2.gat
-map: pvp_n_4-3.gat
-map: pvp_n_4-4.gat
-map: pvp_n_4-5.gat
-map: pvp_n_5-1.gat
-map: pvp_n_5-2.gat
-map: pvp_n_5-3.gat
-map: pvp_n_5-4.gat
-map: pvp_n_5-5.gat
-map: pvp_n_6-1.gat
-map: pvp_n_6-2.gat
-map: pvp_n_6-3.gat
-map: pvp_n_6-4.gat
-map: pvp_n_6-5.gat
-map: pvp_n_7-1.gat
-map: pvp_n_7-2.gat
-map: pvp_n_7-3.gat
-map: pvp_n_7-4.gat
-map: pvp_n_7-5.gat
-map: pvp_n_8-1.gat
-map: pvp_n_8-2.gat
-map: pvp_n_8-3.gat
-map: pvp_n_8-4.gat
-map: pvp_n_8-5.gat
-map: pvp_n_room.gat
-map: pvp_y_1-1.gat
-map: pvp_y_1-2.gat
-map: pvp_y_1-3.gat
-map: pvp_y_1-4.gat
-map: pvp_y_1-5.gat
-map: pvp_y_2-1.gat
-map: pvp_y_2-2.gat
-map: pvp_y_2-3.gat
-map: pvp_y_2-4.gat
-map: pvp_y_2-5.gat
-map: pvp_y_3-1.gat
-map: pvp_y_3-2.gat
-map: pvp_y_3-3.gat
-map: pvp_y_3-4.gat
-map: pvp_y_3-5.gat
-map: pvp_y_4-1.gat
-map: pvp_y_4-2.gat
-map: pvp_y_4-3.gat
-map: pvp_y_4-4.gat
-map: pvp_y_4-5.gat
-map: pvp_y_5-1.gat
-map: pvp_y_5-2.gat
-map: pvp_y_5-3.gat
-map: pvp_y_5-4.gat
-map: pvp_y_5-5.gat
-map: pvp_y_6-1.gat
-map: pvp_y_6-2.gat
-map: pvp_y_6-3.gat
-map: pvp_y_6-4.gat
-map: pvp_y_6-5.gat
-map: pvp_y_7-1.gat
-map: pvp_y_7-2.gat
-map: pvp_y_7-3.gat
-map: pvp_y_7-4.gat
-map: pvp_y_7-5.gat
-map: pvp_y_8-1.gat
-map: pvp_y_8-2.gat
-map: pvp_y_8-3.gat
-map: pvp_y_8-4.gat
-map: pvp_y_8-5.gat
-map: pvp_y_room.gat
-//map: sword_1-1.gat
-//map: sword_2-1.gat
-//map: sword_3-1.gat
-map: treasure01.gat
-map: treasure02.gat
-//map: wizard_1-1.gat
-//map: wizard_2-1.gat
-//map: wizard_3-1.gat
-map: xmas.gat
-map: xmas_dun01.gat
-map: xmas_dun02.gat
-map: xmas_fild01.gat
-map: xmas_in.gat
-
-//---Ep3.0 Comodo ---
-
-map: beach_dun.gat
-map: beach_dun2.gat
-map: beach_dun3.gat
-map: cmd_fild01.gat
-map: cmd_fild02.gat
-map: cmd_fild03.gat
-map: cmd_fild04.gat
-map: cmd_fild05.gat
-map: cmd_fild06.gat
-map: cmd_fild07.gat
-map: cmd_fild08.gat
-map: cmd_fild09.gat
-map: cmd_in01.gat
-map: cmd_in02.gat
-map: comodo.gat
-
-//---EP3.1 Quiz Revolution ---
-
-map: quiz_00.gat
-map: quiz_01.gat
-map: g_room1-1.gat
-map: g_room1-2.gat
-map: g_room1-3.gat
-map: g_room2.gat
-
-//--- Ep4.0 Turtle Island ---
-
-map: tur_dun01.gat
-map: tur_dun02.gat
-map: tur_dun03.gat
-map: tur_dun04.gat
-map: tur_dun05.gat
-map: tur_dun06.gat
-
-//--- Ep4.1 The War of Emperium ---
-
-map: alde_gld.gat
-map: aldeg_cas01.gat
-map: aldeg_cas02.gat
-map: aldeg_cas03.gat
-map: aldeg_cas04.gat
-map: aldeg_cas05.gat
-map: gefg_cas01.gat
-map: gefg_cas02.gat
-map: gefg_cas03.gat
-map: gefg_cas04.gat
-map: gefg_cas05.gat
-map: gld_dun01.gat
-map: gld_dun02.gat
-map: gld_dun03.gat
-map: gld_dun04.gat
-map: guild_room.gat
-map: guild_vs1.gat
-map: guild_vs2.gat
-map: guild_vs3.gat
-map: guild_vs4.gat
-map: guild_vs5.gat
-map: guild_vs1-1.gat
-map: guild_vs1-2.gat
-map: guild_vs1-3.gat
-map: guild_vs1-4.gat
-map: guild_vs2-1.gat
-map: guild_vs2-2.gat
-//map: job_hunter.gat
-map: job_hunte.gat
-//map: job_knight.gat
-map: job_knt.gat
-//map: job_priest.gat
-map: job_prist.gat
-map: job_sword1.gat
-//map: job_wizard.gat
-map: job_wiz.gat
-map: pay_gld.gat
-map: payg_cas01.gat
-map: payg_cas02.gat
-map: payg_cas03.gat
-map: payg_cas04.gat
-map: payg_cas05.gat
-map: prt_gld.gat
-map: prtg_cas01.gat
-map: prtg_cas02.gat
-map: prtg_cas03.gat
-map: prtg_cas04.gat
-map: prtg_cas05.gat
-
-
-//--- Ep5.0 Yuno ---
-
-map: alde_alche.gat
-map: in_rogue.gat
-map: job_cru.gat
-map: job_duncer.gat
-map: job_monk.gat
-map: job_sage.gat
-map: mag_dun01.gat
-map: mag_dun02.gat
-map: monk_test.gat
-map: quiz_test.gat
-map: yuno.gat
-map: yuno_fild01.gat
-map: yuno_fild02.gat
-map: yuno_fild03.gat
-map: yuno_fild04.gat
-map: yuno_in01.gat
-map: yuno_in02.gat
-map: yuno_in03.gat
-map: yuno_in04.gat
-map: yuno_in05.gat
-
-//--- Ep6.0 - Amatsu ---
-// Requires: kRO 08-10-03 or newer
-// or kRO Sakray 09-09-03 or newer
-
-map: ama_dun01.gat
-map: ama_dun02.gat
-map: ama_dun03.gat
-map: ama_fild01.gat
-map: ama_in01.gat
-map: ama_in02.gat
-map: ama_test.gat
-map: amatsu.gat
-
-//--- Ep6.1 - Gon Ryun ---
-
-map: gon_dun01.gat
-map: gon_dun02.gat
-map: gon_dun03.gat
-map: gon_fild01.gat
-map: gon_in.gat
-map: gon_test.gat
-map: gonryun.gat
-map: sec_in01.gat
-map: sec_in02.gat
-map: sec_pri.gat
-
-//--- Ep6.2 - Umbala ---
-// Requires: kRO 01-27-04 or newer
-// or kRO Sakray 12-02-03 or newer
-// or Akaru's SuperGRF 1.22 or newer
-map: umbala.gat
-map: um_dun01.gat
-map: um_dun02.gat
-map: um_fild01.gat
-map: um_fild02.gat
-map: um_fild03.gat
-map: um_fild04.gat
-map: um_in.gat
-
-//--- Ep6.3 - Niflheim ---
-// Requires: kRO 02-23-04 or newer
-// or kRO Sakray 01-09-04 or newer
-// or Akaru's SuperGRF 1.32 or newer
-map: niflheim.gat
-map: nif_fild01.gat
-map: nif_fild02.gat
-map: nif_in.gat
-map: yggdrasil01.gat
-
-//--- Ep6.4 - Valkyrie ---
-// Requires: kRO ??-??-04 or newer
-// or kRO Sakray 02-03-04 or newer
-// or Akaru's SuperGRF 1.34 or newer
-map: valkyrie.gat
-map: himinn.gat
-
-//--- Ep6.5 - Castle of Dragon (LouYang) ---
-// Requires kRO Sakray 03-30 or newer
-//(Akaru's SuperGRF required version: 1.52)
-map: lou_in01.gat
-map: lou_in02.gat
-map: lou_dun03.gat
-map: lou_dun02.gat
-map: lou_dun01.gat
-map: lou_fild01.gat
-map: louyang.gat
-
-//--- Ep6.6 - Novice Guild Siege ---
-//Requires kRO Sakray 04-07 or newer
-//(Akaru's SuperGRF required version: 1.53)
-//map: siege_test.gat
-map: n_castle.gat
-map: nguild_gef.gat
-map: nguild_prt.gat
-map: nguild_pay.gat
-map: nguild_alde.gat
-
-//--- Ep6.7 - Jawaii ---
-//Requires kRO Sakray 06-22 or newer
-//(Akaru's SuperGRF required version: 1.63)
-map: jawaii.gat
-map: jawaii_in.gat
-
-// --- Ep6.8 - Geffenia ---
-// Requires kRO Sakray 07-13 or newer
-// (Akaru's SuperGRF required version: 1.64)
-map: gefenia01.gat
-map: gefenia02.gat
-map: gefenia03.gat
-map: gefenia04.gat
-
-// --- Ep6.9 - New Payon ---
-// Requires kRO Sakray 09-03
-// -- dunno --
-map: payon.gat
-map: payon_in01.gat
-map: payon_in02.gat
-map: payon_in03.gat
-//same names as old maps except that payon_in03.gat got added
-
-// --- Ep? - Ayothaya ---
-// Requires kRO Sakray 09-21
-// -- 2004-10-19sdata_k.gpf --
-map: ayothaya.gat
-map: ayo_in01.gat
-map: ayo_in02.gat
-map: ayo_fild01.gat
-map: ayo_fild02.gat
-map: ayo_dun01.gat
-map: ayo_dun02.gat
-
-// --- God item quests maps ---
-// -- 2004-10-12sdata_k3.gpf --
-map: que_god01.gat
-map: que_god02.gat
-
-// --- Ep? - Schwarzwald Republic ---
-// -- 2004-12-28sdata_k.gpf --
-map: yuno_fild05.gat
-map: yuno_fild07.gat
-map: yuno_fild08.gat
-map: yuno_fild09.gat
-map: yuno_fild11.gat
-map: yuno_fild12.gat
-
-// --- Turbo Track Arena ---
-// -- 2005-03-08sdata_k.gpf --
-map: alde_tt02.gat
-map: turbo_n_1.gat
-map: turbo_n_4.gat
-map: turbo_n_8.gat
-map: turbo_n_16.gat
-map: turbo_e_4.gat
-map: turbo_e_8.gat
-map: turbo_e_16.gat
-map: turbo_room.gat
-
-// --- Einbroch/Einbech ---
-// -- 2005-03-15sdata_k.gpf --
-map: airplane.gat
-map: airport.gat
-map: einbech.gat
-map: einbroch.gat
-map: ein_dun01.gat
-map: ein_dun02.gat
-map: ein_fild06.gat
-map: ein_fild07.gat
-map: ein_fild08.gat
-map: ein_fild09.gat
-map: ein_fild10.gat
-map: ein_in01.gat
-map: que_sign01.gat
-map: que_sign02.gat
-
-
-// --- Einbroch and Lightalzen ---
-// -- 2005-05-10sdata_k.gpf --
-map: ein_fild03.gat
-map: ein_fild04.gat
-map: lhz_fild02.gat
-map: lhz_fild03.gat
-
-// --- Lighthalzen and Juperos Dungeon ---
-// -- 2005-06-14sdata_k.gpf --
-map: yuno_pre.gat
-map: lhz_fild01.gat
-map: lighthalzen.gat
-map: lhz_in01.gat
-map: lhz_in02.gat
-map: lhz_in03.gat
-map: lhz_que01.gat
-map: lhz_dun01.gat
-map: lhz_dun02.gat
-map: lhz_dun03.gat
-map: lhz_cube.gat
-map: juperos_01.gat
-map: juperos_02.gat
-map: jupe_area1.gat
-map: jupe_area2.gat
-map: jupe_core.gat
-map: jupe_ele.gat
-map: jupe_ele_r.gat
-map: jupe_gate.gat
-
-// --- Lighthalzen & Juno Airport ---
-// -- resnametable clones of airport.gat and airplane.gat --
-map: y_airport.gat
-map: lhz_airport.gat
-map: airplane_01.gat
-
-// --- Juperos Dungeon ---
-// -- 2005-06-28sdata_k.gpf --
-map: jupe_cave.gat
-
-// --- Quiz Revolution ---
-// -- 2005-08-02sdata_k.gpf --
-map: quiz_02.gat
-
-// --- Hugel Field ---
-// -- 2005-08-23sdata_k.gpf --
-map: hu_fild07.gat
-map: hu_fild05.gat
-map: hu_fild04.gat
-map: hu_fild01.gat
-map: yuno_fild06.gat
-
-// --- Star Knight And Soul Linker Job Change Maps ---
-// -- 2005-08-23sdata_k.gpf --
-map: job_soul.gat
-map: job_star.gat
-
-// --- Abyss Lake, Thanatos Tower --
-// -- 2005-09-13sdata_k.gpf - 2005-09-13sdata_k6.gpf --
-map: que_job01.gat
-map: que_job02.gat
-map: que_job03.gat
-map: abyss_01.gat
-map: abyss_02.gat
-map: abyss_03.gat
-map: thana_step.gat
-map: thana_boss.gat
-map: tha_scene01.gat
-map: tha_t01.gat
-map: tha_t02.gat
-map: tha_t03.gat
-map: tha_t04.gat
-map: tha_t07.gat
-map: tha_t05.gat
-map: tha_t06.gat
-map: tha_t08.gat
-
-// --- Thanatos Tower ---
-// -- 2005-09-21sdata_k.gpf --
-map: tha_t09.gat
-map: tha_t10.gat
-map: tha_t11.gat
-map: tha_t12.gat
-
-// --- Auction Market ---
-// -- 2005-11-29sdata_k.gpf --
-map: auction_01.gat
-map: auction_02.gat
-
-// --- Garden City Hugel / Kiehl ---
-// -- 2005-12-20sdata_k.gpf --
-map: hugel.gat
-map: hu_in01.gat
-map: que_bingo.gat
-map: que_hugel.gat
-map: p_track01.gat
-map: p_track02.gat
-map: odin_tem01.gat
-map: odin_tem02.gat
-map: odin_tem03.gat
-map: hu_fild02.gat
-map: hu_fild03.gat
-map: hu_fild06.gat
-map: ein_fild01.gat
-map: ein_fild02.gat
-map: ein_fild05.gat
-map: yuno_fild10.gat
-map: kh_kiehl02.gat
-map: kh_kiehl01.gat
-map: kh_dun02.gat
-map: kh_dun01.gat
-map: kh_mansion.gat
-map: kh_rossi.gat
-map: kh_school.gat
-map: kh_vila.gat
-
-// --- Poring Arena (?) & Gunslinger/Ninja Job Map ---
-// -- 2006-03-28sdata_k.gpf --
-map: poring_c01.gat
-map: poring_c02.gat
-map: que_ng.gat
-
-// --- Arunafeltz & Ice Dungeon ---
-// -- 2006-05-30sdata_k.gpf --
-map: rachel.gat
-map: ra_in01.gat
-map: ra_fild01.gat
-map: ra_fild02.gat
-map: ra_fild03.gat
-map: ra_fild04.gat
-map: ra_fild05.gat
-map: ra_fild06.gat
-map: ra_fild07.gat
-map: ra_fild08.gat
-map: ra_fild09.gat
-map: ra_fild10.gat
-map: ra_fild11.gat
-map: ra_fild12.gat
-map: ra_fild13.gat
-map: ra_san01.gat
-map: ra_san02.gat
-map: ra_san03.gat
-map: ra_san04.gat
-map: ra_san05.gat
-map: ra_temin.gat
-map: ra_temple.gat
-map: ra_temsky.gat
-map: que_rachel.gat
-map: ice_dun01.gat
-map: ice_dun02.gat
-map: ice_dun03.gat
-map: ice_dun04.gat
-
-//------------------------- Clone Maps ---------------------------
-//------------------------- Extra Maps ---------------------------
-
-// Ragnarok World Championship 2004
-// Requires: RWC 2004 Client
-// or Akaru's SuperGRF 1.64 or newer
-//map: rwc01.gat
-//map: rwc02.gat
-//map: rwc03.gat
-
-//Christmas & Sakura Special
-//Requires Akaru's SuperGRF 1.1 or newer
-//map: prontera_x.gat
-//map: alberta_x.gat
-//map: aldebaran_x.gat
-//map: geffen_x.gat
-//map: izlude_x.gat
-//map: prt_church_x.gat
-//map: prontera_s.gat
-//map: pay_arche_s.gat
-
-//Fenced Lutie
-//Requires Akaru's SuperGRF 1.23 or newer
-//map: xmas_old.gat
-
-//Alpha Maps
-//Requires adata.grf containing alpha maps and data
-//map: fay_vilg00.gat
-//map: fay_vilg01.gat
-//map: gef_vilg00.gat
-//map: gef_vilg01.gat
-//map: moc_dugn01.gat
-//map: moc_dugn02.gat
-//map: moc_fild01.gat
-//map: moc_fild02.gat
-//map: moc_fild03.gat
-//map: moc_fild04.gat
-//map: moc_intr00.gat
-//map: moc_intr01.gat
-//map: moc_intr02.gat
-//map: moc_intr04.gat
-//map: moc_vilg00.gat
-//map: moc_vilg01.gat
-//map: moc_vilg02.gat
-//map: probemap.gat
-//map: probemap02.gat
-//map: prt_cstl01.gat
-//map: prt_dugn00.gat
-//map: prt_dugn01.gat
-//map: prt_fild00.gat
-//map: prt_fild01.gat
-//map: prt_fild03.gat
-//map: prt_fild04.gat
-//map: prt_fild05.gat
-//map: prt_intr01.gat
-//map: prt_intr01_a.gat
-//map: prt_intr02.gat
-//map: prt_vilg00.gat
-//map: prt_vilg01.gat
-//map: prt_vilg02.gat
-//map: tank_test.gat
-//map: tank_test2.gat
-//map: test.gat
+//------------------------- Normal Maps ---------------------------
+map: alb_ship.gat
+map: alb2trea.gat
+map: alberta.gat
+map: alberta_in.gat
+map: alde_dun01.gat
+map: alde_dun02.gat
+map: alde_dun03.gat
+map: alde_dun04.gat
+map: aldeba_in.gat
+map: aldebaran.gat
+map: anthell01.gat
+map: anthell02.gat
+map: arena_room.gat
+map: c_tower1.gat
+map: c_tower2.gat
+map: c_tower3.gat
+map: c_tower4.gat
+//map: force_map1.gat
+//map: force_map2.gat
+//map: force_map3.gat
+map: force_1-1.gat
+map: force_1-2.gat
+map: force_1-3.gat
+map: force_2-1.gat
+map: force_2-2.gat
+map: force_2-3.gat
+map: force_3-1.gat
+map: force_3-2.gat
+map: force_3-3.gat
+map: gef_dun00.gat
+map: gef_dun01.gat
+map: gef_dun02.gat
+map: gef_dun03.gat
+map: gef_fild00.gat
+map: gef_fild01.gat
+map: gef_fild02.gat
+map: gef_fild03.gat
+map: gef_fild04.gat
+map: gef_fild05.gat
+map: gef_fild06.gat
+map: gef_fild07.gat
+map: gef_fild08.gat
+map: gef_fild09.gat
+map: gef_fild10.gat
+map: gef_fild11.gat
+map: gef_fild12.gat
+map: gef_fild13.gat
+map: gef_fild14.gat
+map: gef_tower.gat
+map: geffen.gat
+map: geffen_in.gat
+map: gl_cas01.gat
+map: gl_cas02.gat
+map: gl_church.gat
+map: gl_chyard.gat
+map: gl_dun01.gat
+map: gl_dun02.gat
+map: gl_in01.gat
+map: gl_knt01.gat
+map: gl_knt02.gat
+map: gl_prison.gat
+map: gl_prison1.gat
+map: gl_sew01.gat
+map: gl_sew02.gat
+map: gl_sew03.gat
+map: gl_sew04.gat
+map: gl_step.gat
+map: glast_01.gat
+//map: hunter_1-1.gat
+//map: hunter_2-1.gat
+//map: hunter_3-1.gat
+map: in_hunter.gat
+map: in_moc_16.gat
+map: in_orcs01.gat
+map: in_sphinx1.gat
+map: in_sphinx2.gat
+map: in_sphinx3.gat
+map: in_sphinx4.gat
+map: in_sphinx5.gat
+map: iz_dun00.gat
+map: iz_dun01.gat
+map: iz_dun02.gat
+map: iz_dun03.gat
+map: iz_dun04.gat
+map: izlu2dun.gat
+map: izlude.gat
+map: izlude_in.gat
+map: job_thief1.gat
+//map: knight_1-1.gat
+//map: knight_2-1.gat
+//map: knight_3-1.gat
+map: mjo_dun01.gat
+map: mjo_dun02.gat
+map: mjo_dun03.gat
+map: mjolnir_01.gat
+map: mjolnir_02.gat
+map: mjolnir_03.gat
+map: mjolnir_04.gat
+map: mjolnir_05.gat
+map: mjolnir_06.gat
+map: mjolnir_07.gat
+map: mjolnir_08.gat
+map: mjolnir_09.gat
+map: mjolnir_10.gat
+map: mjolnir_11.gat
+map: mjolnir_12.gat
+map: moc_castle.gat
+map: moc_fild01.gat
+map: moc_fild02.gat
+map: moc_fild03.gat
+map: moc_fild04.gat
+map: moc_fild05.gat
+map: moc_fild06.gat
+map: moc_fild07.gat
+map: moc_fild08.gat
+map: moc_fild09.gat
+map: moc_fild10.gat
+map: moc_fild11.gat
+map: moc_fild12.gat
+map: moc_fild13.gat
+map: moc_fild14.gat
+map: moc_fild15.gat
+map: moc_fild16.gat
+map: moc_fild17.gat
+map: moc_fild18.gat
+map: moc_fild19.gat
+map: moc_pryd01.gat
+map: moc_pryd02.gat
+map: moc_pryd03.gat
+map: moc_pryd04.gat
+map: moc_pryd05.gat
+map: moc_pryd06.gat
+map: moc_prydb1.gat
+map: moc_ruins.gat
+map: monk_in.gat
+map: morocc.gat
+map: morocc_in.gat
+map: new_zone01.gat
+map: new_zone02.gat
+map: new_zone03.gat
+map: new_zone04.gat
+//map: new_1-1.gat
+//map: new_1-2.gat
+//map: new_1-3.gat
+//map: new_1-4.gat
+//map: new_2-1.gat
+//map: new_2-2.gat
+//map: new_2-3.gat
+//map: new_2-4.gat
+//map: new_3-1.gat
+//map: new_3-2.gat
+//map: new_3-3.gat
+//map: new_3-4.gat
+//map: new_4-1.gat
+//map: new_4-2.gat
+//map: new_4-3.gat
+//map: new_4-4.gat
+//map: new_5-1.gat
+//map: new_5-2.gat
+//map: new_5-3.gat
+//map: new_5-4.gat
+map: orcsdun01.gat
+map: orcsdun02.gat
+//map: ordeal_a00.gat
+//map: ordeal_a02.gat
+map: ordeal_1-1.gat
+map: ordeal_1-2.gat
+//map: ordeal_1-3.gat
+//map: ordeal_1-4.gat
+map: ordeal_2-1.gat
+map: ordeal_2-2.gat
+//map: ordeal_2-3.gat
+//map: ordeal_2-4.gat
+map: ordeal_3-1.gat
+map: ordeal_3-2.gat
+//map: ordeal_3-3.gat
+//map: ordeal_3-4.gat
+map: pay_arche.gat
+map: pay_dun00.gat
+map: pay_dun01.gat
+map: pay_dun02.gat
+map: pay_dun03.gat
+map: pay_dun04.gat
+map: pay_fild01.gat
+map: pay_fild02.gat
+map: pay_fild03.gat
+map: pay_fild04.gat
+map: pay_fild05.gat
+map: pay_fild06.gat
+map: pay_fild07.gat
+map: pay_fild08.gat
+map: pay_fild09.gat
+map: pay_fild10.gat
+map: pay_fild11.gat
+//map: payon.gat //moved down to new maps
+//map: payon_in01.gat //moved down to new maps
+//map: payon_in02.gat //moved down to new maps
+//map: priest_1-1.gat
+//map: priest_2-1.gat
+//map: priest_3-1.gat
+map: prontera.gat
+map: prt_are_in.gat
+map: prt_are01.gat
+map: prt_castle.gat
+map: prt_church.gat
+map: prt_fild00.gat
+map: prt_fild01.gat
+map: prt_fild02.gat
+map: prt_fild03.gat
+map: prt_fild04.gat
+map: prt_fild05.gat
+map: prt_fild06.gat
+map: prt_fild07.gat
+map: prt_fild08.gat
+map: prt_fild09.gat
+map: prt_fild10.gat
+map: prt_fild11.gat
+map: prt_in.gat
+map: prt_maze01.gat
+map: prt_maze02.gat
+map: prt_maze03.gat
+map: prt_monk.gat
+map: prt_sewb1.gat
+map: prt_sewb2.gat
+map: prt_sewb3.gat
+map: prt_sewb4.gat
+//map: pvp_room.gat
+map: pvp_2vs2.gat
+map: pvp_c_room.gat
+map: pvp_n_1-1.gat
+map: pvp_n_1-2.gat
+map: pvp_n_1-3.gat
+map: pvp_n_1-4.gat
+map: pvp_n_1-5.gat
+map: pvp_n_2-1.gat
+map: pvp_n_2-2.gat
+map: pvp_n_2-3.gat
+map: pvp_n_2-4.gat
+map: pvp_n_2-5.gat
+map: pvp_n_3-1.gat
+map: pvp_n_3-2.gat
+map: pvp_n_3-3.gat
+map: pvp_n_3-4.gat
+map: pvp_n_3-5.gat
+map: pvp_n_4-1.gat
+map: pvp_n_4-2.gat
+map: pvp_n_4-3.gat
+map: pvp_n_4-4.gat
+map: pvp_n_4-5.gat
+map: pvp_n_5-1.gat
+map: pvp_n_5-2.gat
+map: pvp_n_5-3.gat
+map: pvp_n_5-4.gat
+map: pvp_n_5-5.gat
+map: pvp_n_6-1.gat
+map: pvp_n_6-2.gat
+map: pvp_n_6-3.gat
+map: pvp_n_6-4.gat
+map: pvp_n_6-5.gat
+map: pvp_n_7-1.gat
+map: pvp_n_7-2.gat
+map: pvp_n_7-3.gat
+map: pvp_n_7-4.gat
+map: pvp_n_7-5.gat
+map: pvp_n_8-1.gat
+map: pvp_n_8-2.gat
+map: pvp_n_8-3.gat
+map: pvp_n_8-4.gat
+map: pvp_n_8-5.gat
+map: pvp_n_room.gat
+map: pvp_y_1-1.gat
+map: pvp_y_1-2.gat
+map: pvp_y_1-3.gat
+map: pvp_y_1-4.gat
+map: pvp_y_1-5.gat
+map: pvp_y_2-1.gat
+map: pvp_y_2-2.gat
+map: pvp_y_2-3.gat
+map: pvp_y_2-4.gat
+map: pvp_y_2-5.gat
+map: pvp_y_3-1.gat
+map: pvp_y_3-2.gat
+map: pvp_y_3-3.gat
+map: pvp_y_3-4.gat
+map: pvp_y_3-5.gat
+map: pvp_y_4-1.gat
+map: pvp_y_4-2.gat
+map: pvp_y_4-3.gat
+map: pvp_y_4-4.gat
+map: pvp_y_4-5.gat
+map: pvp_y_5-1.gat
+map: pvp_y_5-2.gat
+map: pvp_y_5-3.gat
+map: pvp_y_5-4.gat
+map: pvp_y_5-5.gat
+map: pvp_y_6-1.gat
+map: pvp_y_6-2.gat
+map: pvp_y_6-3.gat
+map: pvp_y_6-4.gat
+map: pvp_y_6-5.gat
+map: pvp_y_7-1.gat
+map: pvp_y_7-2.gat
+map: pvp_y_7-3.gat
+map: pvp_y_7-4.gat
+map: pvp_y_7-5.gat
+map: pvp_y_8-1.gat
+map: pvp_y_8-2.gat
+map: pvp_y_8-3.gat
+map: pvp_y_8-4.gat
+map: pvp_y_8-5.gat
+map: pvp_y_room.gat
+//map: sword_1-1.gat
+//map: sword_2-1.gat
+//map: sword_3-1.gat
+map: treasure01.gat
+map: treasure02.gat
+//map: wizard_1-1.gat
+//map: wizard_2-1.gat
+//map: wizard_3-1.gat
+map: xmas.gat
+map: xmas_dun01.gat
+map: xmas_dun02.gat
+map: xmas_fild01.gat
+map: xmas_in.gat
+
+//---Ep3.0 Comodo ---
+
+map: beach_dun.gat
+map: beach_dun2.gat
+map: beach_dun3.gat
+map: cmd_fild01.gat
+map: cmd_fild02.gat
+map: cmd_fild03.gat
+map: cmd_fild04.gat
+map: cmd_fild05.gat
+map: cmd_fild06.gat
+map: cmd_fild07.gat
+map: cmd_fild08.gat
+map: cmd_fild09.gat
+map: cmd_in01.gat
+map: cmd_in02.gat
+map: comodo.gat
+
+//---EP3.1 Quiz Revolution ---
+
+map: quiz_00.gat
+map: quiz_01.gat
+map: g_room1-1.gat
+map: g_room1-2.gat
+map: g_room1-3.gat
+map: g_room2.gat
+
+//--- Ep4.0 Turtle Island ---
+
+map: tur_dun01.gat
+map: tur_dun02.gat
+map: tur_dun03.gat
+map: tur_dun04.gat
+map: tur_dun05.gat
+map: tur_dun06.gat
+
+//--- Ep4.1 The War of Emperium ---
+
+map: alde_gld.gat
+map: aldeg_cas01.gat
+map: aldeg_cas02.gat
+map: aldeg_cas03.gat
+map: aldeg_cas04.gat
+map: aldeg_cas05.gat
+map: gefg_cas01.gat
+map: gefg_cas02.gat
+map: gefg_cas03.gat
+map: gefg_cas04.gat
+map: gefg_cas05.gat
+map: gld_dun01.gat
+map: gld_dun02.gat
+map: gld_dun03.gat
+map: gld_dun04.gat
+map: guild_room.gat
+map: guild_vs1.gat
+map: guild_vs2.gat
+map: guild_vs3.gat
+map: guild_vs4.gat
+map: guild_vs5.gat
+map: guild_vs1-1.gat
+map: guild_vs1-2.gat
+map: guild_vs1-3.gat
+map: guild_vs1-4.gat
+map: guild_vs2-1.gat
+map: guild_vs2-2.gat
+//map: job_hunter.gat
+map: job_hunte.gat
+//map: job_knight.gat
+map: job_knt.gat
+//map: job_priest.gat
+map: job_prist.gat
+map: job_sword1.gat
+//map: job_wizard.gat
+map: job_wiz.gat
+map: pay_gld.gat
+map: payg_cas01.gat
+map: payg_cas02.gat
+map: payg_cas03.gat
+map: payg_cas04.gat
+map: payg_cas05.gat
+map: prt_gld.gat
+map: prtg_cas01.gat
+map: prtg_cas02.gat
+map: prtg_cas03.gat
+map: prtg_cas04.gat
+map: prtg_cas05.gat
+
+
+//--- Ep5.0 Yuno ---
+
+map: alde_alche.gat
+map: in_rogue.gat
+map: job_cru.gat
+map: job_duncer.gat
+map: job_monk.gat
+map: job_sage.gat
+map: mag_dun01.gat
+map: mag_dun02.gat
+map: monk_test.gat
+map: quiz_test.gat
+map: yuno.gat
+map: yuno_fild01.gat
+map: yuno_fild02.gat
+map: yuno_fild03.gat
+map: yuno_fild04.gat
+map: yuno_in01.gat
+map: yuno_in02.gat
+map: yuno_in03.gat
+map: yuno_in04.gat
+map: yuno_in05.gat
+
+//--- Ep6.0 - Amatsu ---
+// Requires: kRO 08-10-03 or newer
+// or kRO Sakray 09-09-03 or newer
+
+map: ama_dun01.gat
+map: ama_dun02.gat
+map: ama_dun03.gat
+map: ama_fild01.gat
+map: ama_in01.gat
+map: ama_in02.gat
+map: ama_test.gat
+map: amatsu.gat
+
+//--- Ep6.1 - Gon Ryun ---
+
+map: gon_dun01.gat
+map: gon_dun02.gat
+map: gon_dun03.gat
+map: gon_fild01.gat
+map: gon_in.gat
+map: gon_test.gat
+map: gonryun.gat
+map: sec_in01.gat
+map: sec_in02.gat
+map: sec_pri.gat
+
+//--- Ep6.2 - Umbala ---
+// Requires: kRO 01-27-04 or newer
+// or kRO Sakray 12-02-03 or newer
+// or Akaru's SuperGRF 1.22 or newer
+map: umbala.gat
+map: um_dun01.gat
+map: um_dun02.gat
+map: um_fild01.gat
+map: um_fild02.gat
+map: um_fild03.gat
+map: um_fild04.gat
+map: um_in.gat
+
+//--- Ep6.3 - Niflheim ---
+// Requires: kRO 02-23-04 or newer
+// or kRO Sakray 01-09-04 or newer
+// or Akaru's SuperGRF 1.32 or newer
+map: niflheim.gat
+map: nif_fild01.gat
+map: nif_fild02.gat
+map: nif_in.gat
+map: yggdrasil01.gat
+
+//--- Ep6.4 - Valkyrie ---
+// Requires: kRO ??-??-04 or newer
+// or kRO Sakray 02-03-04 or newer
+// or Akaru's SuperGRF 1.34 or newer
+map: valkyrie.gat
+map: himinn.gat
+
+//--- Ep6.5 - Castle of Dragon (LouYang) ---
+// Requires kRO Sakray 03-30 or newer
+//(Akaru's SuperGRF required version: 1.52)
+map: lou_in01.gat
+map: lou_in02.gat
+map: lou_dun03.gat
+map: lou_dun02.gat
+map: lou_dun01.gat
+map: lou_fild01.gat
+map: louyang.gat
+
+//--- Ep6.6 - Novice Guild Siege ---
+//Requires kRO Sakray 04-07 or newer
+//(Akaru's SuperGRF required version: 1.53)
+//map: siege_test.gat
+map: n_castle.gat
+map: nguild_gef.gat
+map: nguild_prt.gat
+map: nguild_pay.gat
+map: nguild_alde.gat
+
+//--- Ep6.7 - Jawaii ---
+//Requires kRO Sakray 06-22 or newer
+//(Akaru's SuperGRF required version: 1.63)
+map: jawaii.gat
+map: jawaii_in.gat
+
+// --- Ep6.8 - Geffenia ---
+// Requires kRO Sakray 07-13 or newer
+// (Akaru's SuperGRF required version: 1.64)
+map: gefenia01.gat
+map: gefenia02.gat
+map: gefenia03.gat
+map: gefenia04.gat
+
+// --- Ep6.9 - New Payon ---
+// Requires kRO Sakray 09-03
+// -- dunno --
+map: payon.gat
+map: payon_in01.gat
+map: payon_in02.gat
+map: payon_in03.gat
+//same names as old maps except that payon_in03.gat got added
+
+// --- Ep? - Ayothaya ---
+// Requires kRO Sakray 09-21
+// -- 2004-10-19sdata_k.gpf --
+map: ayothaya.gat
+map: ayo_in01.gat
+map: ayo_in02.gat
+map: ayo_fild01.gat
+map: ayo_fild02.gat
+map: ayo_dun01.gat
+map: ayo_dun02.gat
+
+// --- God item quests maps ---
+// -- 2004-10-12sdata_k3.gpf --
+map: que_god01.gat
+map: que_god02.gat
+
+// --- Ep? - Schwarzwald Republic ---
+// -- 2004-12-28sdata_k.gpf --
+map: yuno_fild05.gat
+map: yuno_fild07.gat
+map: yuno_fild08.gat
+map: yuno_fild09.gat
+map: yuno_fild11.gat
+map: yuno_fild12.gat
+
+// --- Turbo Track Arena ---
+// -- 2005-03-08sdata_k.gpf --
+map: alde_tt02.gat
+map: turbo_n_1.gat
+map: turbo_n_4.gat
+map: turbo_n_8.gat
+map: turbo_n_16.gat
+map: turbo_e_4.gat
+map: turbo_e_8.gat
+map: turbo_e_16.gat
+map: turbo_room.gat
+
+// --- Einbroch/Einbech ---
+// -- 2005-03-15sdata_k.gpf --
+map: airplane.gat
+map: airport.gat
+map: einbech.gat
+map: einbroch.gat
+map: ein_dun01.gat
+map: ein_dun02.gat
+map: ein_fild06.gat
+map: ein_fild07.gat
+map: ein_fild08.gat
+map: ein_fild09.gat
+map: ein_fild10.gat
+map: ein_in01.gat
+map: que_sign01.gat
+map: que_sign02.gat
+
+
+// --- Einbroch and Lightalzen ---
+// -- 2005-05-10sdata_k.gpf --
+map: ein_fild03.gat
+map: ein_fild04.gat
+map: lhz_fild02.gat
+map: lhz_fild03.gat
+
+// --- Lighthalzen and Juperos Dungeon ---
+// -- 2005-06-14sdata_k.gpf --
+map: yuno_pre.gat
+map: lhz_fild01.gat
+map: lighthalzen.gat
+map: lhz_in01.gat
+map: lhz_in02.gat
+map: lhz_in03.gat
+map: lhz_que01.gat
+map: lhz_dun01.gat
+map: lhz_dun02.gat
+map: lhz_dun03.gat
+map: lhz_cube.gat
+map: juperos_01.gat
+map: juperos_02.gat
+map: jupe_area1.gat
+map: jupe_area2.gat
+map: jupe_core.gat
+map: jupe_ele.gat
+map: jupe_ele_r.gat
+map: jupe_gate.gat
+
+// --- Lighthalzen & Juno Airport ---
+// -- resnametable clones of airport.gat and airplane.gat --
+map: y_airport.gat
+map: lhz_airport.gat
+map: airplane_01.gat
+
+// --- Juperos Dungeon ---
+// -- 2005-06-28sdata_k.gpf --
+map: jupe_cave.gat
+
+// --- Quiz Revolution ---
+// -- 2005-08-02sdata_k.gpf --
+map: quiz_02.gat
+
+// --- Hugel Field ---
+// -- 2005-08-23sdata_k.gpf --
+map: hu_fild07.gat
+map: hu_fild05.gat
+map: hu_fild04.gat
+map: hu_fild01.gat
+map: yuno_fild06.gat
+
+// --- Star Knight And Soul Linker Job Change Maps ---
+// -- 2005-08-23sdata_k.gpf --
+map: job_soul.gat
+map: job_star.gat
+
+// --- Abyss Lake, Thanatos Tower --
+// -- 2005-09-13sdata_k.gpf - 2005-09-13sdata_k6.gpf --
+map: que_job01.gat
+map: que_job02.gat
+map: que_job03.gat
+map: abyss_01.gat
+map: abyss_02.gat
+map: abyss_03.gat
+map: thana_step.gat
+map: thana_boss.gat
+map: tha_scene01.gat
+map: tha_t01.gat
+map: tha_t02.gat
+map: tha_t03.gat
+map: tha_t04.gat
+map: tha_t07.gat
+map: tha_t05.gat
+map: tha_t06.gat
+map: tha_t08.gat
+
+// --- Thanatos Tower ---
+// -- 2005-09-21sdata_k.gpf --
+map: tha_t09.gat
+map: tha_t10.gat
+map: tha_t11.gat
+map: tha_t12.gat
+
+// --- Auction Market ---
+// -- 2005-11-29sdata_k.gpf --
+map: auction_01.gat
+map: auction_02.gat
+
+// --- Garden City Hugel / Kiehl ---
+// -- 2005-12-20sdata_k.gpf --
+map: hugel.gat
+map: hu_in01.gat
+map: que_bingo.gat
+map: que_hugel.gat
+map: p_track01.gat
+map: p_track02.gat
+map: odin_tem01.gat
+map: odin_tem02.gat
+map: odin_tem03.gat
+map: hu_fild02.gat
+map: hu_fild03.gat
+map: hu_fild06.gat
+map: ein_fild01.gat
+map: ein_fild02.gat
+map: ein_fild05.gat
+map: yuno_fild10.gat
+map: kh_kiehl02.gat
+map: kh_kiehl01.gat
+map: kh_dun02.gat
+map: kh_dun01.gat
+map: kh_mansion.gat
+map: kh_rossi.gat
+map: kh_school.gat
+map: kh_vila.gat
+
+// --- Poring Arena (?) & Gunslinger/Ninja Job Map ---
+// -- 2006-03-28sdata_k.gpf --
+map: poring_c01.gat
+map: poring_c02.gat
+map: que_ng.gat
+
+// --- Arunafeltz & Ice Dungeon ---
+// -- 2006-05-30sdata_k.gpf --
+map: rachel.gat
+map: ra_in01.gat
+map: ra_fild01.gat
+map: ra_fild02.gat
+map: ra_fild03.gat
+map: ra_fild04.gat
+map: ra_fild05.gat
+map: ra_fild06.gat
+map: ra_fild07.gat
+map: ra_fild08.gat
+map: ra_fild09.gat
+map: ra_fild10.gat
+map: ra_fild11.gat
+map: ra_fild12.gat
+map: ra_fild13.gat
+map: ra_san01.gat
+map: ra_san02.gat
+map: ra_san03.gat
+map: ra_san04.gat
+map: ra_san05.gat
+map: ra_temin.gat
+map: ra_temple.gat
+map: ra_temsky.gat
+map: que_rachel.gat
+map: ice_dun01.gat
+map: ice_dun02.gat
+map: ice_dun03.gat
+map: ice_dun04.gat
+
+//------------------------- Clone Maps ---------------------------
+//------------------------- Extra Maps ---------------------------
+
+// Ragnarok World Championship 2004
+// Requires: RWC 2004 Client
+// or Akaru's SuperGRF 1.64 or newer
+//map: rwc01.gat
+//map: rwc02.gat
+//map: rwc03.gat
+
+//Christmas & Sakura Special
+//Requires Akaru's SuperGRF 1.1 or newer
+//map: prontera_x.gat
+//map: alberta_x.gat
+//map: aldebaran_x.gat
+//map: geffen_x.gat
+//map: izlude_x.gat
+//map: prt_church_x.gat
+//map: prontera_s.gat
+//map: pay_arche_s.gat
+
+//Fenced Lutie
+//Requires Akaru's SuperGRF 1.23 or newer
+//map: xmas_old.gat
+
+//Alpha Maps
+//Requires adata.grf containing alpha maps and data
+//map: fay_vilg00.gat
+//map: fay_vilg01.gat
+//map: gef_vilg00.gat
+//map: gef_vilg01.gat
+//map: moc_dugn01.gat
+//map: moc_dugn02.gat
+//map: moc_fild01.gat
+//map: moc_fild02.gat
+//map: moc_fild03.gat
+//map: moc_fild04.gat
+//map: moc_intr00.gat
+//map: moc_intr01.gat
+//map: moc_intr02.gat
+//map: moc_intr04.gat
+//map: moc_vilg00.gat
+//map: moc_vilg01.gat
+//map: moc_vilg02.gat
+//map: probemap.gat
+//map: probemap02.gat
+//map: prt_cstl01.gat
+//map: prt_dugn00.gat
+//map: prt_dugn01.gat
+//map: prt_fild00.gat
+//map: prt_fild01.gat
+//map: prt_fild03.gat
+//map: prt_fild04.gat
+//map: prt_fild05.gat
+//map: prt_intr01.gat
+//map: prt_intr01_a.gat
+//map: prt_intr02.gat
+//map: prt_vilg00.gat
+//map: prt_vilg01.gat
+//map: prt_vilg02.gat
+//map: tank_test.gat
+//map: tank_test2.gat
+//map: test.gat
diff --git a/conf-tmpl/motd.txt b/conf-tmpl/motd.txt
index fe8587222..b4d040554 100644
--- a/conf-tmpl/motd.txt
+++ b/conf-tmpl/motd.txt
@@ -1,2 +1,2 @@
-// Internal default is limited to 128 lines. If you need more, you will need to modify the MOTD_LINE_SIZE definition in pc.c
+// Internal default is limited to 128 lines. If you need more, you will need to modify the MOTD_LINE_SIZE definition in pc.c
Welcome to eAthena SVN Version! Enjoy! Please report any bugs you find in eAthena :). \ No newline at end of file
diff --git a/conf-tmpl/msg_athena.conf b/conf-tmpl/msg_athena.conf
index 0b0c0cc42..f747f93f9 100644
--- a/conf-tmpl/msg_athena.conf
+++ b/conf-tmpl/msg_athena.conf
@@ -1,556 +1,556 @@
-// eAthena msg_athena.conf
-// Message Configuration
-// 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-999 reserved for others
-
-// To disable a string (%s) field, make it's 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: Character data respawn point saved.
-7: Warping to respawn 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: Player warped (message sends to player too).
-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: Help commands:
-27: File help.txt not found.
-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: You can't use this command with this class.
-36: Appearence changed.
-37: An invalid number was specified.
-38: Invalid location number or name.
-39: All monster summoned!
-40: Invalid monster ID or name.
-41: Impossible 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: Character's job changed.
-49: Invalid job ID.
-50: You already have some GM powers.
-51: Character revived.
-52: This option cannot be used in PK Mode.
-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: Character's respawn point changed.
-58: Character's options changed.
-59: Night Mode Activated.
-60: Day Mode Activated.
-61: The holy messenger has given judgement.
-62: Judgement was made.
-63: Mercy has been shown.
-64: Mercy has been granted.
-65: Character's base level raised.
-66: Character's base level lowered.
-67: Character's job level can't go any higher.
-68: character's job level raised.
-69: Character's job level lowered.
-70: You have learned the skill.
-71: You have forgotten the skill.
-72: Guild siege warfare start!
-73: Already it has started siege warfare.
-74: Guild siege warfare end!
-75: Siege warfare hasn't started yet.
-76: You have received all skills.
-77: The reference result of '%s' (name: id):
-78: %s: %d
-79: It is %d affair above.
-80: Give a display name and monster name/id please.
-81: Your GM level don't authorize you to do this action on this player.
-82: Please, use one of this number/name:
-83: Cannot spawn emperium.
-84: All stats changed!
-85: Invalid time for ban command.
-86: Sorry, but a player name have at least 4 characters.
-87: Sorry, but a player name have 23 characters maximum.
-88: Character name sends to char-server to ask it.
-89: Sorry, it's already the night. Impossible to execute the command.
-90: Sorry, it's already the day. Impossible to execute the command.
-91: Character's base level can't go any higher.
-92: All characters recalled!
-93: All online characters of the %s guild are near you.
-94: Incorrect name/ID, or no one from the guild is online.
-95: All online characters of the %s party are near you.
-96: Incorrect name or ID, or no one from the party is online.
-97: Item database reloaded.
-98: Monster database reloaded.
-99: Skill database reloaded.
-100: Scripts reloaded.
-101: Login-server asked to reload GM accounts and their level.
-102: Mounted 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 item.
-117: GM has send you in jails.
-118: Player warped in jails.
-119: This player is not in jails.
-120: GM has discharge you.
-121: Player unjailed.
-122: Disguise applied.
-123: Monster/NPC name/id hasn't been found.
-124: Undisguise applied.
-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.
-//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations of @clone)
-140: Character's disguise applied.
-141: Character's undisguise applied.
-142: Character is not disguised.
-143: Commands are disabled on this map.
-144: Invalid actual E-mail. If you have default E-mail, type a@a.com.
-145: Invalid new E-mail. Please enter a real E-mail.
-146: New E-mail must be a real E-mail.
-147: New E-mail must be different of the actual E-mail.
-148: Information sended 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: Impossible to change your job.
-156: HP or/and SP modified.
-157: HP and SP are already with the good value.
-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: Your memo point #%d doesn't exist.
-165: All monsters killed!
-166: No item has been refined!
-167: 1 item has been refined!
-168: %d items have been refined!
-169: This item (%d: '%s') is not an equipment.
-170: This item is not an equipment.
-171: %d - void
-172: You replace previous memo position %d - %s (%d,%d).
-173: Note: you don't have the 'Warp' skill level to use it.
-174: Number of status points changed!
-175: Number of skill points changed!
-176: Number of zenys changed!
-177: Impossible to decrease a stat.
-178: Impossible to increase a stat.
-179: Guild level changed.
-180: The monter/egg name/id doesn't exist.
-181: You already have a pet.
-182: Pet friendly value changed!
-183: Pet friendly is already the good value.
-184: Sorry, but you have no pet.
-185: Pet hungry value changed!
-186: Pet hungry is already the good value.
-187: You can now rename your pet.
-188: You can already rename your pet.
-189: This player can now rename his/her pet.
-190: This player can already rename his/her pet.
-191: Sorry, but this player has no pet.
-192: Impossible to change the character's job.
-193: Character's base level can't go any lower.
-194: Character's job level can't go any lower.
-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: This player has learned the skill.
-200: This player already has this quest skill.
-201: You don't have this quest skill.
-202: This player has forgotten the skill.
-203: This player doesn't have this quest skill.
-204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-205: You already have this number of spiritballs.
-206: '%s' skill points reseted!
-207: '%s' stats points reseted!
-208: '%s' skill and stats points reseted!
-209: Character's number of skill points changed!
-210: Character's number of status points changed!
-211: Character's number of zenys changed!
-212: Cannot mount a Peco while in disguise.
-213: You can not mount a peco with your job.
-214: Unmounted Peco.
-215: This player cannot mount a Peco while in disguise.
-216: Now, this player mounts a peco.
-217: This player can not mount a peco with his/her job.
-218: Now, this player has not more peco.
-219: %d day
-220: %d days
-221: %s %d hour
-222: %s %d hours
-223: %s %d minute
-224: %s %d minutes
-225: %s and %d second
-226: %s and %d seconds
-227: Party modification is disabled on this map.
-228: Guild modification is disabled on 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 actualy in night for %s.
-234: Game time: After, the game will be in permanent daylight.
-235: Game time: The game is actualy in daylight for %s.
-236: Game time: After, the game will be in permanent night.
-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 kill anybody
-242: You are now killable by anyone
-243: Map skills are off
-244: Map skills are on
-245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
-246: Your GM level don't authorize you to do 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 are not authorized to memo this map.
-254: GM commands configuration reloaded.
-255: Battle configuration reloaded.
-256: Status database reloaded.
-257: Player database 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: '%s' designated maps reseted!
-268: Reloaded the Message of the Day.
-269: Displaying first %d out of %d matches
-//@me output format
-270: *%s %s*
-271: You can't drop items on this map
-272: You can't trade on this map
-273: Commands available:
-274: %d commands found.
-275: No commands found.
-276: You can't open shop on this map
-277: Usage: @request <petition/message to online GMs>.
-278: (@request): %s
-279: @request sent.
-280: Invalid pet name.
-281: You can't create chat rooms on this map
-//Party-related
-282: You need to be a party leader to use this command.
-283: Target character must be online and be in your party.
-284: Leadership transferred.
-285: You've become the party leader.
-286: There's been no change in the setting.
-//Missing stuff for @killer related commands.
-287: Killer state reset
-288: You are no longer killable
-289: The player is now killable
-290: The player is no longer killable
-291: Weather effects will dispell on warp/refresh
-// Guild Castles Number
-// --------------------
-299: ?? Castles
-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: Total Domination
-//alternative
-//324: Twenty Four Castles
-
-// Players Titles (for @who, etc commands, check battle_athena.conf for titles level setting)
-// Useful note: you may remove ':%d' from the line, then you will see only player title, w/o his level
-325: Super player:%d
-326: Super player+:%d
-327: Mediator:%d
-328: Sub-GM:%d
-329: Sub-GM+:%d
-330: GM:%d
-331: GM Chief:%d
-332: Administrator:%d
-// Templates for @who output
-333: Name: %s
-334: (%s)
-335: | Party: '%s'
-336: | Guild: '%s'
-//You may ommit the last %s, then you won't see players job name
-337: | L:%d/%d | Job: %s
-//You may ommit 2 last %d, then you won't see players coords, just map name
-338: | Location: %s %d %d
-
-// @duel (part 1)
-350: Duel: You can't use @invite. You aren't a duellist.
-351: Duel: The limit of players is reached.
-352: Duel: Player name not found.
-353: Duel: The Player is in the duel already.
-354: Duel: Duel invitation has been sent.
-355: Duel: You can't use @duel without @reject.
-356: Duel: You can take part in duel once per %d minutes.
-357: Duel: Invalid value.
-358: Duel: You can't use @leave. You aren't a duellist.
-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 isn't on the same map.
-// @duel (part 2)
-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 --
-// Main chat
-380: Main chat has been activated.
-381: Main chat already activated.
-382: Main chat has been disabled.
-383: Main chat already disabled.
-384: Main chat is currently enabled. Usage: @main <on|off>, @main <message>.
-385: Main chat is currently disabled. Usage: @main <on|off>, @main <message>.
-386: Main@%s: %s
-387: You cannot use Main chat while muted.
-388: You should enable main chat with "@main on" command.
-//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.
-400: Usage: @jailfor <time> <character name>
-401: You have been jailed for %d years, %d months, %d days, %d hours and %d minutes
-402: %s in jail for %d years, %d months, %d days, %d hours and %d minutes
-
-// Homunculus messages
-450: You already have an homunculus
-
-// Messages of others (not for GM commands)
-// ----------------------------------------
-
-500: Night Mode is already active
-501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-502: Day Mode is Activated
-503: Night Mode is Activated
-
-//Supernovice's Guardian Angel
-//actually.. new client msgtxt file contains these 3 lines... [Lupus]
-//----------------------------
-504: Guardian Angel, can you hear my voice? ^^;
-505: My name is %s, and I'm a Super Novice~
-506: Please help me~ T.T
-
-// 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 Available....
-
-//mail system
-//----------------------
-510: You have no messages.
-511: %d - From : %s (New - Priority)
-512: %d - From : %s (New)
-513: %d - From : %s
-514: You have %d new messages.
-515: You have %d unread priority messages.
-516: You have no new messages.
-517: Message not found.
-518: Reading message from %s.
-519: Cannot delete unread priority mail.
-520: You have recieved new mail, use @listmail before deleting.
-521: Message deleted.
-522: You must wait 10 minutes before sending another message.
-523: Access Denied.
-524: Character does not exist.
-525: Mail has been sent.
-526: You have new mail.
-
-// Bot detect messages (currently unused)
-535: Possible use of BOT (99%% of chance) or modified client by '%s' (account: %d, char_id: %d). This player ask your name when you are hidden.
-
-536: Character '%s' (account: %d) try to use a bot (it tries to detect a fake player).
-537: Character '%s' (account: %d) try to use a bot (it tries to detect a fake mob).
-// 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 try to trade %d of them.
-540: This player has been definitivly blocked.
-// Rare Items Drop/Steal announce
-541: '%s' won %s's %s (chance: %0.02f%%)
-//541: %.0s%.0sSomeone won %s
-542: '%s' stole %s's %s (chance: %0.02f%%)
-//542: %.0s%.0sSomeone stole %s
-// @Away message bits
-543: (Automessage has been sent)
-544: Away [AT] - "%s"
-545: Away - "%s"
-546: Away automessage has been activated.
-547: Away automessage has been disabled.
-548: Usage: @away,@aw <message>. Enter empty message for disable it.
-// @Autotrade
-549: You should be vending to use @Autotrade.
-
-//550 -> 650: Job Names
-550: Novice
-551: Swordsman
-552: Mage
-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 Mage
-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 Mage
-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
-//...
-650: Unknown Job
-
-//Custom translations
-import: conf/import/msg_conf.txt
+// eAthena msg_athena.conf
+// Message Configuration
+// 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-999 reserved for others
+
+// To disable a string (%s) field, make it's 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: Character data respawn point saved.
+7: Warping to respawn 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: Player warped (message sends to player too).
+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: Help commands:
+27: File help.txt not found.
+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: You can't use this command with this class.
+36: Appearence changed.
+37: An invalid number was specified.
+38: Invalid location number or name.
+39: All monster summoned!
+40: Invalid monster ID or name.
+41: Impossible 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: Character's job changed.
+49: Invalid job ID.
+50: You already have some GM powers.
+51: Character revived.
+52: This option cannot be used in PK Mode.
+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: Character's respawn point changed.
+58: Character's options changed.
+59: Night Mode Activated.
+60: Day Mode Activated.
+61: The holy messenger has given judgement.
+62: Judgement was made.
+63: Mercy has been shown.
+64: Mercy has been granted.
+65: Character's base level raised.
+66: Character's base level lowered.
+67: Character's job level can't go any higher.
+68: character's job level raised.
+69: Character's job level lowered.
+70: You have learned the skill.
+71: You have forgotten the skill.
+72: Guild siege warfare start!
+73: Already it has started siege warfare.
+74: Guild siege warfare end!
+75: Siege warfare hasn't started yet.
+76: You have received all skills.
+77: The reference result of '%s' (name: id):
+78: %s: %d
+79: It is %d affair above.
+80: Give a display name and monster name/id please.
+81: Your GM level don't authorize you to do this action on this player.
+82: Please, use one of this number/name:
+83: Cannot spawn emperium.
+84: All stats changed!
+85: Invalid time for ban command.
+86: Sorry, but a player name have at least 4 characters.
+87: Sorry, but a player name have 23 characters maximum.
+88: Character name sends to char-server to ask it.
+89: Sorry, it's already the night. Impossible to execute the command.
+90: Sorry, it's already the day. Impossible to execute the command.
+91: Character's base level can't go any higher.
+92: All characters recalled!
+93: All online characters of the %s guild are near you.
+94: Incorrect name/ID, or no one from the guild is online.
+95: All online characters of the %s party are near you.
+96: Incorrect name or ID, or no one from the party is online.
+97: Item database reloaded.
+98: Monster database reloaded.
+99: Skill database reloaded.
+100: Scripts reloaded.
+101: Login-server asked to reload GM accounts and their level.
+102: Mounted 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 item.
+117: GM has send you in jails.
+118: Player warped in jails.
+119: This player is not in jails.
+120: GM has discharge you.
+121: Player unjailed.
+122: Disguise applied.
+123: Monster/NPC name/id hasn't been found.
+124: Undisguise applied.
+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.
+//Messages 134-139 are no longer used, available for future reuse (preferrable for more variations of @clone)
+140: Character's disguise applied.
+141: Character's undisguise applied.
+142: Character is not disguised.
+143: Commands are disabled on this map.
+144: Invalid actual E-mail. If you have default E-mail, type a@a.com.
+145: Invalid new E-mail. Please enter a real E-mail.
+146: New E-mail must be a real E-mail.
+147: New E-mail must be different of the actual E-mail.
+148: Information sended 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: Impossible to change your job.
+156: HP or/and SP modified.
+157: HP and SP are already with the good value.
+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: Your memo point #%d doesn't exist.
+165: All monsters killed!
+166: No item has been refined!
+167: 1 item has been refined!
+168: %d items have been refined!
+169: This item (%d: '%s') is not an equipment.
+170: This item is not an equipment.
+171: %d - void
+172: You replace previous memo position %d - %s (%d,%d).
+173: Note: you don't have the 'Warp' skill level to use it.
+174: Number of status points changed!
+175: Number of skill points changed!
+176: Number of zenys changed!
+177: Impossible to decrease a stat.
+178: Impossible to increase a stat.
+179: Guild level changed.
+180: The monter/egg name/id doesn't exist.
+181: You already have a pet.
+182: Pet friendly value changed!
+183: Pet friendly is already the good value.
+184: Sorry, but you have no pet.
+185: Pet hungry value changed!
+186: Pet hungry is already the good value.
+187: You can now rename your pet.
+188: You can already rename your pet.
+189: This player can now rename his/her pet.
+190: This player can already rename his/her pet.
+191: Sorry, but this player has no pet.
+192: Impossible to change the character's job.
+193: Character's base level can't go any lower.
+194: Character's job level can't go any lower.
+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: This player has learned the skill.
+200: This player already has this quest skill.
+201: You don't have this quest skill.
+202: This player has forgotten the skill.
+203: This player doesn't have this quest skill.
+204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
+205: You already have this number of spiritballs.
+206: '%s' skill points reseted!
+207: '%s' stats points reseted!
+208: '%s' skill and stats points reseted!
+209: Character's number of skill points changed!
+210: Character's number of status points changed!
+211: Character's number of zenys changed!
+212: Cannot mount a Peco while in disguise.
+213: You can not mount a peco with your job.
+214: Unmounted Peco.
+215: This player cannot mount a Peco while in disguise.
+216: Now, this player mounts a peco.
+217: This player can not mount a peco with his/her job.
+218: Now, this player has not more peco.
+219: %d day
+220: %d days
+221: %s %d hour
+222: %s %d hours
+223: %s %d minute
+224: %s %d minutes
+225: %s and %d second
+226: %s and %d seconds
+227: Party modification is disabled on this map.
+228: Guild modification is disabled on 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 actualy in night for %s.
+234: Game time: After, the game will be in permanent daylight.
+235: Game time: The game is actualy in daylight for %s.
+236: Game time: After, the game will be in permanent night.
+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 kill anybody
+242: You are now killable by anyone
+243: Map skills are off
+244: Map skills are on
+245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
+246: Your GM level don't authorize you to do 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 are not authorized to memo this map.
+254: GM commands configuration reloaded.
+255: Battle configuration reloaded.
+256: Status database reloaded.
+257: Player database 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: '%s' designated maps reseted!
+268: Reloaded the Message of the Day.
+269: Displaying first %d out of %d matches
+//@me output format
+270: *%s %s*
+271: You can't drop items on this map
+272: You can't trade on this map
+273: Commands available:
+274: %d commands found.
+275: No commands found.
+276: You can't open shop on this map
+277: Usage: @request <petition/message to online GMs>.
+278: (@request): %s
+279: @request sent.
+280: Invalid pet name.
+281: You can't create chat rooms on this map
+//Party-related
+282: You need to be a party leader to use this command.
+283: Target character must be online and be in your party.
+284: Leadership transferred.
+285: You've become the party leader.
+286: There's been no change in the setting.
+//Missing stuff for @killer related commands.
+287: Killer state reset
+288: You are no longer killable
+289: The player is now killable
+290: The player is no longer killable
+291: Weather effects will dispell on warp/refresh
+// Guild Castles Number
+// --------------------
+299: ?? Castles
+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: Total Domination
+//alternative
+//324: Twenty Four Castles
+
+// Players Titles (for @who, etc commands, check battle_athena.conf for titles level setting)
+// Useful note: you may remove ':%d' from the line, then you will see only player title, w/o his level
+325: Super player:%d
+326: Super player+:%d
+327: Mediator:%d
+328: Sub-GM:%d
+329: Sub-GM+:%d
+330: GM:%d
+331: GM Chief:%d
+332: Administrator:%d
+// Templates for @who output
+333: Name: %s
+334: (%s)
+335: | Party: '%s'
+336: | Guild: '%s'
+//You may ommit the last %s, then you won't see players job name
+337: | L:%d/%d | Job: %s
+//You may ommit 2 last %d, then you won't see players coords, just map name
+338: | Location: %s %d %d
+
+// @duel (part 1)
+350: Duel: You can't use @invite. You aren't a duellist.
+351: Duel: The limit of players is reached.
+352: Duel: Player name not found.
+353: Duel: The Player is in the duel already.
+354: Duel: Duel invitation has been sent.
+355: Duel: You can't use @duel without @reject.
+356: Duel: You can take part in duel once per %d minutes.
+357: Duel: Invalid value.
+358: Duel: You can't use @leave. You aren't a duellist.
+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 isn't on the same map.
+// @duel (part 2)
+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 --
+// Main chat
+380: Main chat has been activated.
+381: Main chat already activated.
+382: Main chat has been disabled.
+383: Main chat already disabled.
+384: Main chat is currently enabled. Usage: @main <on|off>, @main <message>.
+385: Main chat is currently disabled. Usage: @main <on|off>, @main <message>.
+386: Main@%s: %s
+387: You cannot use Main chat while muted.
+388: You should enable main chat with "@main on" command.
+//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.
+400: Usage: @jailfor <time> <character name>
+401: You have been jailed for %d years, %d months, %d days, %d hours and %d minutes
+402: %s in jail for %d years, %d months, %d days, %d hours and %d minutes
+
+// Homunculus messages
+450: You already have an homunculus
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+500: Night Mode is already active
+501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+502: Day Mode is Activated
+503: Night Mode is Activated
+
+//Supernovice's Guardian Angel
+//actually.. new client msgtxt file contains these 3 lines... [Lupus]
+//----------------------------
+504: Guardian Angel, can you hear my voice? ^^;
+505: My name is %s, and I'm a Super Novice~
+506: Please help me~ T.T
+
+// 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 Available....
+
+//mail system
+//----------------------
+510: You have no messages.
+511: %d - From : %s (New - Priority)
+512: %d - From : %s (New)
+513: %d - From : %s
+514: You have %d new messages.
+515: You have %d unread priority messages.
+516: You have no new messages.
+517: Message not found.
+518: Reading message from %s.
+519: Cannot delete unread priority mail.
+520: You have recieved new mail, use @listmail before deleting.
+521: Message deleted.
+522: You must wait 10 minutes before sending another message.
+523: Access Denied.
+524: Character does not exist.
+525: Mail has been sent.
+526: You have new mail.
+
+// Bot detect messages (currently unused)
+535: Possible use of BOT (99%% of chance) or modified client by '%s' (account: %d, char_id: %d). This player ask your name when you are hidden.
+
+536: Character '%s' (account: %d) try to use a bot (it tries to detect a fake player).
+537: Character '%s' (account: %d) try to use a bot (it tries to detect a fake mob).
+// 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 try to trade %d of them.
+540: This player has been definitivly blocked.
+// Rare Items Drop/Steal announce
+541: '%s' won %s's %s (chance: %0.02f%%)
+//541: %.0s%.0sSomeone won %s
+542: '%s' stole %s's %s (chance: %0.02f%%)
+//542: %.0s%.0sSomeone stole %s
+// @Away message bits
+543: (Automessage has been sent)
+544: Away [AT] - "%s"
+545: Away - "%s"
+546: Away automessage has been activated.
+547: Away automessage has been disabled.
+548: Usage: @away,@aw <message>. Enter empty message for disable it.
+// @Autotrade
+549: You should be vending to use @Autotrade.
+
+//550 -> 650: Job Names
+550: Novice
+551: Swordsman
+552: Mage
+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 Mage
+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 Mage
+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
+//...
+650: Unknown Job
+
+//Custom translations
+import: conf/import/msg_conf.txt
diff --git a/conf-tmpl/packet_athena.conf b/conf-tmpl/packet_athena.conf
index 6f5a1ac2f..d654a0e35 100644
--- a/conf-tmpl/packet_athena.conf
+++ b/conf-tmpl/packet_athena.conf
@@ -1,57 +1,57 @@
-// Athena sockets Configuration file
-// translated (davidsiaw)
-
-
-// Display debug reports (iWhen something goes wrong during the report, the report is saved.)
-debug: no
-
-// How long can a socket stall before closing the connection (in seconds)
-stall_time: 60
-
-// When enabled, sets TCP_NODELAY (disable nagel Algorythm) on all connections
-mode_neg: yes
-
-// frame packet size as considered by the server (when there's enough
-// information in queue to fill the frame_size, a "send" is forced)
-//frame_size: 1054
-
-//----- IP Rules Settings -----
-
-// Do we check IP's before allowing incoming connections?
-enable_ip_rules: yes
-
-// Decide the order of access restriction (Same as apache?)
-// deny,allow Is the standard
-
-order: deny,allow
-// order: allow,deny
-// order: mutual-failture
-
-// The IP list which it uses to access controls
-// allow : Allows access regardless of permissions
-// deny : Completely disallow
-// Žw’è–³‚µ : If the permission check encounters mutual-failure(whatever that means) it will disallow access
-
-// allow: 127.0.0.1
-// allow: 192.168.0.0/16
-// allow: 10.0.0.0/255.0.0.0
-allow: all
-
-// deny: 127.0.0.1
-
-
-//---- Ddos Protection Settings ----
-// If there is a connection request within ddos_interval msec for ddos_count number of times, it will assume it is a ddos attack
-
-// Consecutive intervals(msec)
-ddos_interval: 3000
-
-// Connection frequency
-ddos_count: 5
-
-// The time interval after which the threat of ddos is assumed to be gone
-// After this amount of time, the ddos restrictions are lifted.
-ddos_autoreset: 600000
-
-
-//import: conf/import/packet_conf.txt
+// Athena sockets Configuration file
+// translated (davidsiaw)
+
+
+// Display debug reports (iWhen something goes wrong during the report, the report is saved.)
+debug: no
+
+// How long can a socket stall before closing the connection (in seconds)
+stall_time: 60
+
+// When enabled, sets TCP_NODELAY (disable nagel Algorythm) on all connections
+mode_neg: yes
+
+// frame packet size as considered by the server (when there's enough
+// information in queue to fill the frame_size, a "send" is forced)
+//frame_size: 1054
+
+//----- IP Rules Settings -----
+
+// Do we check IP's before allowing incoming connections?
+enable_ip_rules: yes
+
+// Decide the order of access restriction (Same as apache?)
+// deny,allow Is the standard
+
+order: deny,allow
+// order: allow,deny
+// order: mutual-failture
+
+// The IP list which it uses to access controls
+// allow : Allows access regardless of permissions
+// deny : Completely disallow
+// Žw’è–³‚µ : If the permission check encounters mutual-failure(whatever that means) it will disallow access
+
+// allow: 127.0.0.1
+// allow: 192.168.0.0/16
+// allow: 10.0.0.0/255.0.0.0
+allow: all
+
+// deny: 127.0.0.1
+
+
+//---- Ddos Protection Settings ----
+// If there is a connection request within ddos_interval msec for ddos_count number of times, it will assume it is a ddos attack
+
+// Consecutive intervals(msec)
+ddos_interval: 3000
+
+// Connection frequency
+ddos_count: 5
+
+// The time interval after which the threat of ddos is assumed to be gone
+// After this amount of time, the ddos restrictions are lifted.
+ddos_autoreset: 600000
+
+
+//import: conf/import/packet_conf.txt
diff --git a/conf-tmpl/plugin_athena.conf b/conf-tmpl/plugin_athena.conf
index 1d7cbbd62..c4b889da8 100644
--- a/conf-tmpl/plugin_athena.conf
+++ b/conf-tmpl/plugin_athena.conf
@@ -1,29 +1,29 @@
-// Athena Plugins Configuration file
-
-// Should we auto search for plugin files and load them?
-// If set to 'yes' you will not need to set 'plugin:' commands
-// in this conf file to load them
-auto_search: no
-
-//------Plugins List -----------
-
-// Just a sample plugin
-//plugin: sample
-
-// UPnP core plugin
-plugin: upnp
-
-// GUI core plugin
-//plugin: gui
-
-// Crash and Uptime reporting for CygWin/Linux
-//plugin: sig
-
-// Crash reporting for Windows
-//plugin: exchndl
-
-// Process id logging
-//plugin: pid
-
-// Built-in webserver
+// Athena Plugins Configuration file
+
+// Should we auto search for plugin files and load them?
+// If set to 'yes' you will not need to set 'plugin:' commands
+// in this conf file to load them
+auto_search: no
+
+//------Plugins List -----------
+
+// Just a sample plugin
+//plugin: sample
+
+// UPnP core plugin
+plugin: upnp
+
+// GUI core plugin
+//plugin: gui
+
+// Crash and Uptime reporting for CygWin/Linux
+//plugin: sig
+
+// Crash reporting for Windows
+//plugin: exchndl
+
+// Process id logging
+//plugin: pid
+
+// Built-in webserver
//plugin: httpd \ No newline at end of file
diff --git a/conf-tmpl/readme.txt b/conf-tmpl/readme.txt
index 6b0ddd2ac..db8777680 100644
--- a/conf-tmpl/readme.txt
+++ b/conf-tmpl/readme.txt
@@ -1,33 +1,33 @@
-What is the import folder for?
-
-Most people don't know the real use of the import folder. After you do, you will wonder
-what you ever did without it.
-
-The main thing it does, is provide 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 are updated with eA (usually though SVN).
-
-How does this work?
-
-Well, you place only the settings you have changed in the import files. I'll use
-battle_athena.conf and battle_conf.txt for my example. Everytime you update you conf
-folder, using the normal method, you have to go and edit the configs again. So, you have to
-redo your rates, redo your ip addresses, you have to redo it all. Well, not with the import
-system.
-
-Say you want to change your base experience rate from the default (100)to 7x (700). Well
-then you would place this in your import/battle_conf.txt:
-
-// Rate at which exp. is given. (Note 2)
-base_exp_rate: 700
-
-You don't need the comment (duh, it's a commnet), but I usually leave them for clarity
-sake.
-
-So, now this new setting take place over the setting in battle_athena.conf. You just keep
-this file everytime you update, and your setting will always be there. Neat, isn't it?
-
-So, yeah, that's what the import folder is for. I hope to see a lot more people use it, to
-make my life as a managed server runer better.
-
+What is the import folder for?
+
+Most people don't know the real use of the import folder. After you do, you will wonder
+what you ever did without it.
+
+The main thing it does, is provide 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 are updated with eA (usually though SVN).
+
+How does this work?
+
+Well, you place only the settings you have changed in the import files. I'll use
+battle_athena.conf and battle_conf.txt for my example. Everytime you update you conf
+folder, using the normal method, you have to go and edit the configs again. So, you have to
+redo your rates, redo your ip addresses, you have to redo it all. Well, not with the import
+system.
+
+Say you want to change your base experience rate from the default (100)to 7x (700). Well
+then you would place this in your import/battle_conf.txt:
+
+// Rate at which exp. is given. (Note 2)
+base_exp_rate: 700
+
+You don't need the comment (duh, it's a commnet), but I usually leave them for clarity
+sake.
+
+So, now this new setting take place over the setting in battle_athena.conf. You just keep
+this file everytime you update, and your setting will always be there. Neat, isn't it?
+
+So, yeah, that's what the import folder is for. I hope to see a lot more people use it, to
+make my life as a managed server runer better.
+
Semi-guide by Ajarn \ No newline at end of file
diff --git a/conf-tmpl/script_athena.conf b/conf-tmpl/script_athena.conf
index f0582c401..939d04e11 100644
--- a/conf-tmpl/script_athena.conf
+++ b/conf-tmpl/script_athena.conf
@@ -1,74 +1,74 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------
-// eAthena Script Configuration File
-//--------------------------------------------------------
-
-
-// When choosing those which it refines setting the letter which is indicated. (Those for word use other than Japanese?)
-refine_posword: Head,Body,Left hand,Right hand,Robe,Shoes,Accessory 1,Accessory 2,Head 2,Head 3,Not Equipped
-
-//If you are getting crashes during script loading, you can set this to yes
-//to find out which script causes it. Otherwise leave it as no since the amount
-//of extra console output is staggering.
-verbose_mode: no
-
-warn_func_no_comma: yes
-
-warn_cmd_no_comma: yes
-
-warn_func_mismatch_paramnum: yes
-
-warn_cmd_mismatch_paramnum: yes
-
-check_cmdcount: 655360
-
-check_gotocount: 2048
-
-
-//---- Custom script functions ----
-
-// 0 - Event script is defined as an NPC by itself
-// 1 - Event script can be called by script label
-event_script_type: 0
-
-// For events to be activated do we require
-// a 'set [EventName],1;' to be called first?
-event_requires_trigger: no
-
-// Name of event when a player has died
-die_event_name: OnPCDieEvent
-
-// Name of event when a player kills a player
-kill_pc_event_name: OnPCKillEvent
-
-// Name of event when a player kills a monster
-kill_mob_event_name: OnNPCKillEvent
-
-// Name of event when a player logs out
-logout_event_name: OnPCLogoutEvent
-
-// Name of event when a player logs in
-login_event_name: OnPCLoginEvent
-
-// Name of event when a player changes map
-// NOTE: This event will only trigger on maps with the "loadevent" flag active.
-loadmap_event_name: OnPCLoadMapEvent
-
-// Name of event when a player levels up (base lv)
-baselvup_event_name: OnPCBaseLvUpEvent
-
-// Name of event when a player levels up (job lv)
-joblvup_event_name: OnPCJobLvUpEvent
-
-import: conf/import/script_conf.txt
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------
+// eAthena Script Configuration File
+//--------------------------------------------------------
+
+
+// When choosing those which it refines setting the letter which is indicated. (Those for word use other than Japanese?)
+refine_posword: Head,Body,Left hand,Right hand,Robe,Shoes,Accessory 1,Accessory 2,Head 2,Head 3,Not Equipped
+
+//If you are getting crashes during script loading, you can set this to yes
+//to find out which script causes it. Otherwise leave it as no since the amount
+//of extra console output is staggering.
+verbose_mode: no
+
+warn_func_no_comma: yes
+
+warn_cmd_no_comma: yes
+
+warn_func_mismatch_paramnum: yes
+
+warn_cmd_mismatch_paramnum: yes
+
+check_cmdcount: 655360
+
+check_gotocount: 2048
+
+
+//---- Custom script functions ----
+
+// 0 - Event script is defined as an NPC by itself
+// 1 - Event script can be called by script label
+event_script_type: 0
+
+// For events to be activated do we require
+// a 'set [EventName],1;' to be called first?
+event_requires_trigger: no
+
+// Name of event when a player has died
+die_event_name: OnPCDieEvent
+
+// Name of event when a player kills a player
+kill_pc_event_name: OnPCKillEvent
+
+// Name of event when a player kills a monster
+kill_mob_event_name: OnNPCKillEvent
+
+// Name of event when a player logs out
+logout_event_name: OnPCLogoutEvent
+
+// Name of event when a player logs in
+login_event_name: OnPCLoginEvent
+
+// Name of event when a player changes map
+// NOTE: This event will only trigger on maps with the "loadevent" flag active.
+loadmap_event_name: OnPCLoadMapEvent
+
+// Name of event when a player levels up (base lv)
+baselvup_event_name: OnPCBaseLvUpEvent
+
+// Name of event when a player levels up (job lv)
+joblvup_event_name: OnPCJobLvUpEvent
+
+import: conf/import/script_conf.txt
diff --git a/conf-tmpl/subnet_athena.conf b/conf-tmpl/subnet_athena.conf
index 5308ffbda..e91fb7376 100644
--- a/conf-tmpl/subnet_athena.conf
+++ b/conf-tmpl/subnet_athena.conf
@@ -1,6 +1,6 @@
-// Subnet support file
-// Format is:
-// subnet: net-submask:char_ip:map_ip
-// you can add more than one subnet
-
-subnet: 255.0.0.0:127.0.0.1:127.0.0.1
+// Subnet support file
+// Format is:
+// subnet: net-submask:char_ip:map_ip
+// you can add more than one subnet
+
+subnet: 255.0.0.0:127.0.0.1:127.0.0.1
diff --git a/db/Changelog.txt b/db/Changelog.txt
index a0be3846c..e5784874d 100644
--- a/db/Changelog.txt
+++ b/db/Changelog.txt
@@ -1,2804 +1,2804 @@
-========================= Items that need fixing/implementing
-
- 5126 Morpheus's Hood: Magic spells cannot be dispelled!?
-
- 2653 Sacrifice Ring: NO INFO. Item not implemented....
- [Vicious] On your death it breaks (BS can fix it), you drop all Equipment (equipped, even the ring).
- And revive with 1 HP / 1 SP at the place of your death.
- [Komurka] From where this info is? ... Mine: On your death you'll loose this ring and get 50% HP.
- [Poki#3] Theres no official desc! <.< Although you might wanna make it a custom item or something...
- 1475 Cavalry Lance: NEED INFO.
- 1475 Equestrian's Spear: NEED INFO.
- 13005 Angelic Wing Dagger: NEED INFO.
- 1308 Golden Axe: NEED INFO.
- 13160, 13161 Destroyer: Can break target's armor when fired at close range.
- -----
- 4296 Cramp Card: Temp Plug: 10z per mob-level on a 3% chance.
- 7458 Fortune Horn: It's a custom name ^^;
- 12017 Speed Decreasing Potion: A potion which decreases the moving speed of a character for a duration.
- -----
-
-========================
-12/04
- * Almost official HP values for Ninja/Gunslinger [Playtester]
- * Updated garments [Playtester]
-12/03
- * Updated shoes [Playtester]
-12/02
- * Updated armors [Playtester]
- * Updated shields [Playtester]
-12/01
- * Removed some mobs that aren't used anymore [Playtester]
- * Updated various mob stats thanks to Soukosa [Playtester]
-11/30
- * Fixed some mob names thanks to Soukosa [Playtester]
-11/29
- * More drop updates [Playtester]
- * Updated various drops [Playtester]
-11/28
- * Fixed Alchemist combo's autospell casting on target instead of self [Playtester]
-11/27
- * Fixed up healing items [Playtester]
- * Updated Rachel mob drops [Playtester]
- * Updated Rachel mob stats [Playtester]
- * Corrected KiriKage's range so it works correctly when used by non-players
- or when use weapon's range is used. [Skotlex]
- * Changed service for you's flags so it affects all players on range.
- [Skotlex]
-11/26
- * Updated Rachel Field mob stats and drops [Playtester]
- * Updated selling price for some common drops [Playtester]
-11/25
- * Fixed Sphinx Helm, Coif and Orc Hero Helm [Playtester]
- * Fixed selling price of Fine Grit 10z -> 60z [Playtester]
-11/24
- * Heaven's drive no longer targets traps. [Skotlex]
-11/23
- * Fixed sp cost of RG_RAID [Playtester]
- * Official skills for remaining Thanatos mobs [Playtester]
- - this completes the X.3 and X.4 mob skill updates
- - removed various skills from G_mobs
-11/21
- * All coin related skills can be used with any weapon. Those that require
- ammo can be used with any ammo. [Skotlex]
- * Fixed all cast times and delays of Gunslinger skills [Playtester]
- - cast time of Dust is reduced by dex
- - Tracking cast time cannot be reduced by anything
- - Increase Accuracy requires 4 coins instead of 2
- * Updated healing values of Ketupat and Red Thorn Fruit [Playtester]
-11/20
- * Official skill for Ancient Mimic, Death Word and Angels [Playtester]
- - also made NPC_DEFENDER self targeted
- - Shelter now has angry mode
- * The max level of NPC_SPLASHATTACK is now 1. [Skotlex]
- * Flywing and Butterfly Wing will now use the teleport skill [Playtester]
- * Official skills for Breeze and Plasma [Playtester]
- * Official X.4 skills thanks to Tharis [Playtester]
- - also set MVP skills to MVP skill level
-11/19
- * Official skills for Abyss Lake mobs [Playtester]
- - G_Acidus, G_Ferus and Green Iguana don't have skills
- - someone should test if all skills are working
- - Green Iguana is now a looter
-11/18
- * Official skills for Bacsojin and Orc Baby [Playtester]
- - yes Bacsojin's skills are interuptable despite MVP status
- * Updated X.1 mob stats [Playtester]
- * Official skills for Detale and Thanatos [Playtester]
- - pm me if you want to help converting the mob skills
-11/17
- * Updated remaining X.2 mob stats [Playtester]
- * Updated Bio Lab and Juperos mob stats [Playtester]
- * Fixed some sprite mob names [Playtester]
-11/16
- * Fixed the misleading description of what item_avail does. [Skotlex]
- * Updated X.3 mob stats [Playtester]
- * Updated Kiel dungeon mob stats [Playtester]
- * Changed type of unimplemented cards to "Card" [Playtester]
-11/15
- * Updated Odin Temple mob stats [Playtester]
- * Fixed Gonryun mob stats [Playtester]
- - also fixed Bacsojin and Chung E
-11/13
- * Changed bAtk to bBaseAtk [Playtester]
-11/10
- * Fully official GS/NJ Job Exp [Playtester]
- * Removed the inf2 = TRAP of FirePillar and Spider Web so they are blocked
- by Land Protector. [Skotlex]
-11/09
- * More accurate Max HP values for TK/SG/SL/GS/NJ [Playtester]
- - TK/SG/SL are official up to level 70
- * Reduced the check area of hermod to 3x3, you now have to literally stand
- next to a warp for it to work. [Skotlex]
- * Official Weight and Max SP values for TK/SG/SL/GS/NJ [Playtester]
- - why were ours so far off the official ones?
-11/08
- * Reduced Wand of Hermod's splash range (max distance from a portal) from 3 to
- 2. Should it really be 1? (that is, be so close that moving a single cell
- warps you?) [Skotlex]
-11/07
- * Kiel now summons 6 slaves instead of 5 [Playtester]
-11/06
- * Added Bull's Eye 0.5 sec cast time [Skotlex]
- * Ganbantein's delay is now 2 secs. [Skotlex]
- * Removed the time2 value of NJ_NEN since it has no use. [Skotlex]
-11/05
- * Raised the chance to get an OPB from an OPB [Playtester]
- * Official NJ/GS job exp for level 51+52 [Playtester]
-11/03
- * Official X.4 MVP rewards [Playtester]
- * Official NJ/GS job exp up to joblevel 50 [Playtester]
- * Remaining official X.4 drop updates [Playtester]
- - updated related item names
-11/02
- * Official Gunslinger/Ninja weapon drops [Playtester]
- - updated other mob drops A-M
- - updated related item names
- * Official X.4 mob drops [Playtester]
- * Fixed Aliot's Rebirth skill [Playtester]
-11/01
- * Reverted LK_Berserk HP requirement [Vicious]
-10/30
- * Added some official X.4 drop rates [Playtester]
- * Corrected GS skill ranges using Aegis data. All their targetted skills
- have a base range of 9, and Dust (Choke) has a range of 2. [Skotlex]
- * Gave Grounddrift a knockback of 3 for the fire-elemental effect (value
- totally custom)
- * Set the inf2 to encore skills of Wand of Hermode [Skotlex]
-10/29
- * Official NJ/GS exp chart for level 1-48 [Playtester]
- * Added Shinobi Sash to Shinobi drops [Playtester]
- * Fixed const.txt, thanks to flaviojs [Vicious]
- * Fixed homunculus's growth, according to Aegis [Vicious]
-10/27
- * Made Thief Clothes and Ninja Suit being equippable by Ninja [Playtester]
- * More Odin/Kiel fixes [Playtester]
-10/26
- * Fixed Constant's explode not working as it should [Playtester]
-10/25
- * More Kiel Mob updates [Playtester]
- * Changed order of Aliza drops to prevent steal exploit [Playtester]
- * MG_STONECURSE and NPC_PETRIFYATTACK now use time1 to specify the
- "petrifying time". This value has been set to 5 seconds. [Skotlex]
- * Fixed view ids of some headgears [Playtester]
-10/24
- * Kiel Mob updates [Playtester]
- * Reverted Lupus' map_index update. map_index should NOT be touched. [Vicious]
- * Updated map index accordingly [Lupus]
-10/23
- * Adjusted LK_BERSERK so you can only use it when you have 20% or less
- life. [Skotlex]
-10/20
- * Official Muscipular drops [Playtester]
-10/19
- * Added the actual skill delay of 1000ms to Triple Attack and Chain combo
- in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of
- 700ms. [Skotlex]
- * Added the Monk combos to skill_castnodex so their delay is not decreased
- by skills. [Skotlex]
-10/18
- * Updated the packetdb for the 2006-10-17a client. [Zephiris]
-10/16
- * Corrected issen's range to 5, as per the login packet information.
- [Skotlex]
- * Applied most of Mpeg's work on Ninja Skills. For information see:
- http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
- * Small Kiel MVP drop rate increase [Playtester]
-10/14
- * Fixed Bacsojin's and Chung E's stats [Playtester]
-10/12
- * Reverted GS/NJ Job Exp [Playtester]
- - better too high than too low
- * Corrected Caprice cast info. No cast time, delay time equal to the bolt
- spells. [Skotlex]
- * Probably official GS/NJ Job Exp [Playtester]
-10/09
- * Fixed High Quality Sandals not being refinable [Playtester]
-10/08
- * Probably final drop rate increase [Playtester]
-10/06
- * Reverted size fix for Guns and Shuriken [Playtester]
- - it appears they are 100% to all after all
-10/05
- * Selling price of Broken Pieces 10z -> 400z [Playtester]
- * Raised the drop rates of most combo equips [Playtester]
-10/04
- * Raised level of Kiel MVP skills [Playtester]
-10/01
- * Adjusted drop rates thanks to info from Tharis [Playtester]
- * Updated view ids of some headgears [Playtester]
- - beware of crashes when your client is too old
-09/29
- * Fully official Ktullanux stats [Playtester]
- * Official X.4 item scripts [Playtester]
- * Fixed Gunslinger job bonus [Playtester]
- * Official X.4 aspd values for GS, NJ and SG [Playtester]
-09/28
- * Raised drop rate of some MVP drops [Playtester]
- - also added Morrigan's Manteau to Thanatos drops
-09/27
- * Raised skill casting rate for Rachel mobs [Playtester]
-09/25
- * Fixed item group 35 (lottobox) in item_misc.txt [Skotlex]
- * Added Ninja/Gunslinger job exp as separate exp chart [Playtester]
- * Immaterial Sword now has a 3% chance of reducing target's sp by 30% [Playtester]
-09/23
- * Now Valkyrie Randgris will only resummon when she has less than 3 slaves [Playtester]
-09/21
- * Implemented Rachel Sanctuary mob skills [Playtester]
-09/18
- * Corrected Ki Explosion to have range 1 and to take your weapon's element.
- [Skotlex]
- * Fixing Holden combo not draining sp correctly [Playtester]
- * Added official Rachel Sanctuary mob stats [Playtester]
- * Fixed the order of mob skills thanks to [Leon] [Playtester]
- * Changed NPC_CHANGEUNDEAD from a self skill to a targetted skill. Changed
- it's duration to 30 secs. [Skotlex]
-09/17
- * Updated some item names according to info from Haplo [Playtester]
- * Fixed some Thanatos mob names [Playtester]
-09/16
- * Added NPC_CHANGEUNDEAD to the skill_cast_db, fixes it apparently doing
- "nothing". [Skotlex]
-09/15
- * Added the remaining drop changes which I missed before [Playtester]
-09/14
- * Fixed X.3 Cooking drop rates [Playtester]
- - also updated related aegis item names
- - now our db is official up to X.3
- * Corrected Smokie's pet script to use petskillbonus instead of "bonus"
- [Skotlex]
- * Fixed Abyss Lake drop rates [Playtester]
- - also updated related aegis item names
- * Fixed Thanatos Tower drop rates [Playtester]
- - also updated some related aegis item names
-09/13
- * Started fixing up X.3 drop rates [Playtester]
-09/12
- * Fixed NPC_ATTRICHANGE being targeted rather than self [Playtester]
- * Fixed Vesper's summoning behavior [Playtester]
-09/11
- * CG_MOONLIT is no longer castable in WoE grounds. [Skotlex]
-09/10
- * Removed NPC_Powerup from Dimik [Playtester]
- * More accurate guess on Strouf's dex [Playtester]
- * Doubled Strouf's dex [Playtester]
- * Guard is now equippable by every job [Playtester]
-09/08
- * Adjusted various Rachel mob stats and skills [Playtester]
- * Added missing Ice Dungeon mob skills [Playtester]
- * Added missing Rachel mob skills [Playtester]
- * Removed dMotion from Iceicle [Playtester]
- * Official Rachel mob stats [Playtester]
- - progress 30%
-09/07
- * Merged some of mpeg's work on NJ skills [Skotlex]
-09/06
- * Changed all bCriticalRate to bCritical [Playtester]
- * Updated skill_require_db's entry for Abracadabra, it requires yellow 2
- gemstones (there's no such hardcoded yellow gemstone requirement anymore)
- [Skotlex]
- * Corrected db/const.txt entry bMagicSubRace -> bMagicAddSize [Skotlex]
-
- * Updated attack power of Unholy Touch [Playtester]
- - also moved combo bonuses to non-accessoire parts
-09/05
- * Updated comments on Arrow Crafting thanks to Haplo [Playtester]
-09/04
- * Updated Shinobi Sash and Exorcising Ring [Playtester]
-09/02
- * Applied Vicious's ranges on guns [Playtester]
- - Rifle & Shotgun = 9, others = 7
- * Updated various item names thanks to Haplo [Playtester]
- - please update all the quests that use these item names
-09/01
- * Added some new items thanks to Haplo [Playtester]
-08/30
- * Updated ingredients for Smooth Noodle [Playtester]
- * Updated mob iRO names and mob stats [Playtester]
-08/29
- * Applied Mpeg's work on GS [Toms]
- ( http://gpegon.free.fr/ea/gunslinger_08-29-06_mpeg.txt )
-08/26
- * Reduced weapon range of all guns by 1 [Playtester]
-08/25
- * Shinobi Belt combo now also works with slotted Ninja Suit [Playtester]
-08/24
- * Updated X.3 iRO mob names [Playtester]
-08/23
- * Corrected the healing value of novice pots. [MasterOfMuppets]
-08/22
- * Fixed SP usage of some Gunslinger skills [Playtester]
- * Added a duration to Disarm [Playtester]
- * Final fix on Grand Cross weapon [Playtester]
- * Some fixes on Grand Cross weapon, might need more fixes [Playtester]
- * Removed event bonus on Celebration Ring [Playtester]
- * Applied Mpeg's fix on GS according to kRO's values [Toms]
- * Updated Embryo creation, put "Potion Creation Guide" instead of "Embryo Creation Guide"
- according to RockmanEXE's & iRO info [Toms]
- * Updated range of guns according to RockmanEXE's info [Playtester]
- * Updated some items thanks to Haplo [Playtester]
-08/21
- * Increased splash range of HVAN_EXPLOSION to 4. [Skotlex]
- * Added delay to HLIF_AVOID [Toms]
-08/20
- * Fixed Fling not reducing DEF for 30 seconds [Playtester]
- * Updates Zeny givers (Red Pouch) [Lupus]
-08/19
- * Removed event bonus of 4 year anniversary hat [Playtester]
- * Added HAMI_CASTLE block time [Toms]
- * Updated NJ_BAKUENRYU skill tree [Toms]
- * Updated HLIF_CHANGE skill [Toms]
- * Updated Kouenka, removed aftercast delay [Toms]
- * Fixed some Ninja weapons (1Hand Sword -> Dagger) [Toms]
-08/18
- * Made HLIF_HEAL a self skill that auto-selects target to caster's master.
- [Skotlex]
- * Fixed Kouenka not having an aftercast delay on levels greater 1 [Playtester]
-08/17
- * Gospel can't stack anymore [Playtester]
-08/16
- * Added WE_CALLBABY to Gunslinger and Ninja [Playtester]
- * Fixed various bullets, spheres and kunais [Playtester]
- * NJ_NEN now requires a Fang [Playtester]
-08/15
- * Fixed disarm not working [Playtester]
- - also fixed duration of Gatling Fever
- * Made Kiel MVP's skills non-cancelable [Playtester]
- * Fixed Masamune and Kamaitachi using bAspd rather than bAspdRate [Playtester]
-08/14
- * Updated mob stats according to official kRO website [Playtester]
- * Fixed attack power of Dusk [Playtester]
- * Added official Gunslinger ASPD values according to Ragnarok Monthly [Playtester]
-08/13
- * Gave elemental -1 to some GS skills. [Vicious]
-08/12
- * Destroyer now has a 1% chance on breaking armor rather than Hit-10 [Playtester]
- * Fixed Fling requiring unknown amunition [Playtester]
- * Changed the aftercast delay of Envenom to 100ms [Playtester]
- - this will cause that you can cast Envenom as fast as aMotion
- * Reduced weight of Thanatos Tower quest items to 0 [Playtester]
-08/10
- * Updated the Packet DB up to the 2006-08-07aSakexe client. [Zephiris]
- * Reverted Tracking being affected by dex [Playtester]
- * Aloevera and Anodyne now cast on self [Playtester]
- * Fixed view id of some new headgears [Playtester]
- * Added two missing braces to Yellow Novus card script [Playtester]
- * Removed cast time on Flip Coin, Tracking is now affected by dex [Playtester]
-08/09
- * Removed cast time of AM_REST & AM_CALLHOMUNCULUS [Toms]
- * Hopefully fixed Green Ferus card combo [Playtester]
- * Removed bonus range on some bows (there is a range column for that) [Playtester]
- - also reverted sidewinder card, chance is handled in the code
- * Fixed Royal Tea requiring Sweet Sauce rather than Yellow Spice [Playtester]
- * Fixed Rapid Shower only using 1 bullet rather than 5 [Playtester]
-08/08
- * Item name update [Vicious]
- * Made PF_FOGWALL a targetted skill. [Skotlex]
-08/07
- * Slightly increased drop rate of some low-level guns [Playtester]
- - also lowered drop rate of Armor Charm to 0.01% again
-08/06
- * Fixed selling price of Sharp Leaf [Playtester]
-08/05
- * Added temporary size fixes for GS/NJ weapons [Playtester]
- * Raised NJ/GS item MVP drop rates a little [Playtester]
-08/04
- * Fixed Boots not equipable by Gunslingers [Playtester]
- * Added the remaining official item drop bonus rates [Playtester]
- - note that some bugs might have appeared, please test!
- * Added some official item drop bonus rates [Playtester]
- - also replaced IG_Jellopy with IG_Resist
- * reverted 13202,Shell_of_Blood back [Lupus]
- * Fixed 13202,Shell_of_Blood type to 4 = SHELL for shotgun (not a bullet) [Lupus]
-08/03
- * Hydro is no longer an MVP [Playtester]
- * Changed the inf2 value of SA_DISPEL so it can be casted on party/guild
- mates, but not yourself. [Skotlex]
- * Updated some monsters [Playtester]
- - Gig and Deleter are now Fire 2 element
- - reduced attack power of Skeggiolds
- * Finally updated stats of the monsters that got their exp updated a month ago [Playtester]
- * Fixed some items I added yesterday [Playtester]
-08/02
- * Added a dummy blind duration of 10 secs to FullBuster. [Skotlex]
- * Updated the mob skills so that the marine sphere casts self-destruction
- with 3 second cast after it starts walking. [Skotlex]
- * Updated Create Arrow to X.4 [Playtester]
- * Gold Lux now makes you autocast Flip Coin on attack [Playtester]
- - also Gunslinger can use Berserk Potion now
- * Changed Scream and Hammerfall's stun duration to 5 seconds. [Skotlex]
- * Converted NJ_HYOUSYOURAKU from jAthena since our version was lacking a time2 [Playtester]
- * Reverted LOD card changes as well [Playtester]
- * Reverted some changes. [MasterOfMuppets]
- * Reduced overrefine bonus of level 4 weapons to 13 [Playtester]
- * Added the new items and fixed selling price of Dark Mask [Playtester]
-08/01
- * Changed Solace's and Retribution's skills so they feel like on official servers [Playtester]
- * Fire Pillar's aftercast delay is 1 second now [Playtester]
- * Updated Abyss Lake and Rachel mobs [Playtester]
- * Some minor monster skill changes [Playtester]
- * Made Deluge/volcano/v. gale be castable on top of each other again
- [Skotlex]
- * Cleaned up some of the db files. [Skotlex]
- * Fixed name of Freya's Shoes [Playtester]
- * Small item update from Haplo [Playtester]
-07/31
- * Updated Awakening Potion, Note Headphone and High Quality Sandals [Playtester]
-07/30
- * Corrected the defense of puppy band [MasterOfMuppets]
- * Adjusted some drop rates and removed Yoyo's Animal Skin drop [Playtester]
- * Fixed element of Abyss Lake monsters [Playtester]
-07/29
- * Memorize cast time now can't be reduced by status changes neither.
- [Skotlex]
- * Large mob_db update [Playtester]
- - added most of the missing X.4 / 11.1 drops
- - adjusted the drop rates of Odin Temple and Kiel's Mechanical Doll Factory
- - removed beret drop
- * Reverted the Combat Knife (wrong translated description) [Playtester]
- * Shockwave, Flasher and Freezing Trap now consume 2 trap items [Playtester]
- - this is correct according to info from RagnaInfo and some guides
- * Reverted the Hellion Revenant change. He IS supposed to be undead 3. [MasterOfMuppets]
- - And yes, he can still heal himself even though he is undead...
- - Note by Playtester: On eA right now he can't...
-07/28
- * Fixed some summon skills [Playtester]
-07/27
- * Hellion Revenant is now dark element so he can heal himself [Playtester]
- * Fixed Teddy Bear card [Playtester]
- * Hopefully fixed Solace card [Playtester]
- * Corrected Combat Knife reducing damage from DemiHumans by 10% instead of
- increasing damage against them. [Skotlex]
- * Fixed Independence Memorial Hat weight, set to 0 [Toms]
-07/25
- * Added rudeattacked teleport to Rachel MVPs [Playtester]
- * Added some NPC_Emotions for the Rachel mobs [Playtester]
- * Fixed Grandcross not being self-targeted for mobs [Playtester]
- * Final cooking drop rate adjustment [Playtester]
- * Fixed a bug in the item_db thanks to Toms [Playtester]
- * Fixed G_Kraben and G_Biolab3 mobs [Playtester]
- * Item updates by Haplo [Playtester]
-07/24
- * Raised drop rate of cook books and sets a little [Playtester]
- * Raised drop rate of food a little [Playtester]
- * Raised drop rate of Kiel's and Valkyrie's drops a little [Playtester]
- * updated def on 2006 helms in preparation for the 2006 headgears quest. [Reddozen]
- * Added flag 0x002 (no reiteration) to Deluge/Volcano/Violent Gale
- (skill_unit_db) [Skotlex]
- * Edited Rachel mobs a little and added Beret to Turtle General drops [Playtester]
- * Changed Land Protector's range back to 3. [Skotlex]
-07/23
- * Added some new items thanks to Haplo [Playtester]
- * Added Holy Quiver to IG_Quiver [Playtester]
- * Added the skills of the Rachel + Ice Dungeon mobs [Playtester]
- - I made it so that the monsters are safe to use
- - the skills are official, but some skills are missing
- - the stats are only 50% official
- - drops are official, but various are missing
- * Completed the temporary Rachel + Ice Dungeon mob stats [Playtester]
-07/22
- * More Rachel mobs [Playtester]
- * Raised the chance of Holden Card Combo dropping a stem [Playtester]
- * Started to implement the Rachel mobs [Playtester]
-07/21
- * Updated Speed/Delay of Juperos mobs [Playtester]
- - all the official Aegis delays we have are implemented now
- * Updated Speed/Delays of Lighthalzen mobs [Playtester]
- * Updated Speed/Delays of Einbech mobs [Playtester]
- * Replaced race numbers with constants RC_(race) in the item_db [Playtester]
- - also changed some success rates of gaining item bonuses
- * Updated Speed/Delays of Louyang and Ayothaya mobs [Playtester]
- * Fixed Lord of Death Card's Status Change chances [Playtester]
- * Added G_ L_ and XMAS_ mobs to the race2 races [Playtester]
- - also added Rotar Zairo to 'Goblins'
- * Fixed Anonymity Request and Erende Ebecee Card [Playtester]
-07/20
- * Added a skill_unit_db entry for NJ_HYOUSYOURAKU, thanks to Eus for the
- data. [Skotlex]
- * Updated Speed/Delays of Niflheim mobs [Playtester]
- * Updated Speed/Delays of Umbala mobs [Playtester]
- * Updated Speed/Delays of Kunlun mobs [Playtester]
- * Updated aDelay of some mobs to Aegis [Playtester]
- - the code now solves the aDelay bug, so we can fully use Aegis values
- - Alice and Zherlthsh finally attack like on official servers
- - please don't merge the mob_db until the code is merged
- - Ancient Mimic now drops Freyr's Shoes
- * Updated the sell price of Serin's ring [MasterOfMuppets]
- * Made Bacsojin's skills uninteruptable [Playtester]
-07/19
- * Put the newly implemented cards into the old card album list. [MasterOfMuppets]
- * Fixed mob skills for G_INCUBUS and G_WRAITH_DEAD [MasterOfMuppets]
- - Someone needs to implement all of the G_MONSTER skills.
- * Raised drop rate of Electric Wire and Undershirt [Playtester]
- * Some speed and aDelay adjustments on Fur_Seal, Metaling, Increase Soil
- - Incantation Samurai is now moving much faster
-07/18
- * Updated speed and delay values of Amatsu mobs [Playtester]
- * Added more of the X.4 and 11.1 drops [Playtester]
- - attention: All Stone of Sage (etc) drops have been changed to
- Stone of Sage (usable) drops, the etc item is not used anymore!
- * Speed updates for Anolian and Merman [Playtester]
-07/17
- * Speed/Delay updates for Pasana, Rybio and Phendark [Playtester]
- * Ooops, forgot to update packet_db [DracoRPG]
-07/16
- * Updated Speed, aDelay, aMotion, dMotion of some mobs to Aegis [Playtester]
- * Raised speed of Kiel mobs until we know official values [Playtester]
- * Added Angel's Kiss drop to Toad [Playtester]
- * Valkyrie drops slotted helm again, Valkyrie Helm requires a quest [Playtester]
-07/15
- * Hydro's drop change... [Playtester]
- * Adjusted attack speed of Thanatos Tower mobs [Playtester]
- * Adjusted move- and attack-speed of all Abyss Lake mobs [Playtester]
- - also fixed Novus dropping the correct card
- - added Detale's Reflect Shield skill
-07/14
- * Added more X.4 and 11.1 item drops [Playtester]
- - we don't know about the others yet
- * Adjusted Odin Temple drops and drop rates with help from Tharis [Playtester]
- - note: I'm working on adding the X.4 and 11.1 drops now
-07/13
- * Fixed the Kaensin info in skill_db/skill_unit_db... before the skill was
- overpowered. Now... I think it's underpowered :D [Skotlex]
-07/12
- * Tao Gunga will now summon G_Megalith's. [Poki#3]
- * Updated the new Rachel mob names and the new G_ mobs stats & skills. Also removed there poring drops. [Poki#3]
- * Updated Detale's Skills [Playtester]
- * Fixed element, mode and attack speed of some monsters [Playtester]
-07/11
- * Fixed Nurse Cap, Memory Book and Dagger of Counter [Playtester]
- * Marionette now drops "Marionette Doll" [Playtester]
-07/10
- * Corrected Frost Nova's splash range and Land Protector's cast range.
- Thanks to Haplo. [Skotlex]
- * Fixed Beast Strafing not having inf2 = 512 (to make it a
- target-auto-select skill) [Skotlex]
- * Fixed the duration of Land Protector, removed unused time2 value from
- their entries in skill_cast_db. Thanks to Haplo. [Skotlex]
- * Corrected skill require entry from the Twilight Pharmacy skills.
- [Skotlex]
- * Removed Frost Nova's skill_unit_db entry. [Skotlex]
-07/09
- * Added Guillontine's SP Drain per attack [Playtester]
- * More item updates thanks to Haplo [Playtester]
- * Added various items and fixed armor charm [Playtester]
-07/05
- * Added Thanatos Tower Quest items to item_trade.txt [Playtester]
- * Added correct card effects for "Status Effect on both" [Playtester]
-07/04
- * Added temp plugs for new headgears. [Vicious]
- - I only added this for VIEW ID. so someone needs to update everything else.
- * Updated item_trade.txt to Aegis X.2 ItemMoveInfo.txt [Vicious]
- * Updated the cooking items so they are ready for official implementation [Playtester]
- - also slightly raised drop rates of Cooking Sets
- * Silver Tiara's bonus is Int AGAIN (Gravity can't decide) [Playtester]
-07/03
- * Fixed the UF * flags of Songs/Dances in skill_unit_db. [Skotlex]
-07/02
- * Added the Mercenary Summon Scrolls [Playtester]
- * Fixed two books in the item_db [Playtester]
-07/01
- * Added Silence Effect to the Lord of the Dead Card [Playtester]
-06/30
- * Applied some mob_db changes according to the 27/06/2006 patch [Playtester]
- * Updated skill_unit_db to use the correct values of
- UF_ENSEMBLE/UF_DANCE/UF_SONG as applicable. [Skotlex]
- * Added the new X.4 headgears [Playtester]
- * Fixed various items and sorted the item_db [Playtester]
- * Reverted back Vulcan Arrow. It's fine now. Player can move after the attack animation end [Lupus]
- * Raised attack power of Strouf according to X.4 updates [Playtester]
-06/29
- * Updated Freyr's Shoes and Vidar's Boots [Playtester]
- * [Again] Added back walkdelay to Sonic Blow(thx@rkit), Arrow Vulcan [Lupus]
- Walk delay lasts as attack does. In ARROW VULCAN fixed CONSTANT delay to the list
-06/28
- * Updated Soul Change to use inf2 4096 (INF2_ALLOW_ENEMY). [Skotlex]
- * Updated Morpheus's Hood and Freyr's Shoes [Playtester]
- * Fixed the SP usage of AS_SPLASHER. Thanks to Belle. [MasterOfMuppets]
-06/27
- * Added the remaining Ninja/Gunslinger drops [Playtester]
- * Raised autocast chance of Owl Duke card to Aegis x.2 [Playtester]
- * Some small item_db fixes [Playtester]
-06/26
- * Mob name/sprite name update, thanks to Saycyber21 [Vicious]
- * Updated/Added some items [Playtester]
- * Corrected unit id of desperado and Ground Drift using jA's info. [Skotlex]
-06/25
- * Added two new gunslinger weapon drops, thanks to RockmanEXE. [MasterOfMuppets]
-06/23
- * Fixed SP Drain rates of items [Playtester]
- * Updated BD_INTOABYSS's unit flag to not affect mobs. [Skotlex]
- * Rogue Card Combo now removes Intimidate autospell [Playtester]
- * Sorted in the new cards and fixed some equips [Playtester]
-06/22
- * Fixed the remaining 2006 Cards [Playtester]
- * Fixed some equipment fields that caused warnings [Playtester]
-06/21
- * Fixed the equipment fields of the new cards [Playtester]
-06/20
- * Reduced Stone Buckler's natural Def to 3 [Playtester]
- * Started fixing some of the cards [Playtester]
-06/19
- * Some more item updates [Playtester]
- - Valkyrie Shield and Survivor's Manteau have their complete bonus script now, please test it
- - Slotted Ice Pick and Iron Shackle Combo are weaker now
- * Some updates to the item_db [Playtester]
- - updated Survivor's Manteau, Valkyrie Shield, Stone Buckler, etc.
-06/18
- * Added Exp to some Thief Bug versions [Playtester]
-06/17
- * Fixed the scripts for the Lotto Boxes [Playtester]
- * Changed Hellion Revenant to heal for 9999. [MasterOfMuppets]
- - Also put in some item restrictions related to the eye of hellion quest.
-06/16
- - Updated GTB's card script to be "bonus bNoMagicDamage,100;" [Skotlex]
-06/14
- * Fixed the awfully coded Baseball Cap script [Playtester]
- - please use CONSTANTS!
- - please use RC_Nonboss and RC_Boss for "all mobs" instead of listing all the races!
- - please don't stack RC_Nonboss with RC_(some race)!
-06/13
- * Detale only summons one Hydro [Playtester]
- * Fixed the names of the Lotto items [Playtester]
- * Garm Claw now has 152 Attack Power rather than 115 [Playtester]
-06/12
- * SL_STIN/SL_STUN have dex-reducable casting times now. [Skotlex]
- * Temp sprite names for Rachel/Ice Dungeon monsters, thanks to Saycyber21. [Vicious]
- - Chung E = temp sprites.
- * Fixed the mode of Monemus [MasterOfMuppets]
-06/11
- * Commented some unused mobs in the mob_db [Playtester]
- * Goggles are worth 10k now [Playtester]
-06/10
- * Slotted Crown and Tiara only have +1 int [Playtester]
- * Added the new cards to the drops [Playtester]
-06/08
- * Implemented Electric Wire [Playtester]
-06/07
- * Stormy Knight card now freezes when attack rather then when hit [Playtester]
-06/06
- * Fixed Owl Duke not having boss mode [Playtester]
- * Fixed Osiris's slaves [Playtester]
- * Hopefully fixed all the Unbreakable bonuses [Playtester]
- * Fixed Valkyrie skills and Magnum Break of all mobs [Playtester]
- * Sunflower Hairpin now can't be refined anymore [Playtester]
-06/05
- * Added some sign quest related item restrictions. [MasterOfMuppets]
- * Fixed the item bonus of baseball cap. [MasterOfMuppets]
- * A typo fix, thanks to DracoRPG. [MasterOfMuppets]
-06/03
- * Fixed Archdam Card [Playtester]
- * Fixed Skeggiold's drops [Playtester]
- * MVP Jupitel now does 30 Hits [Playtester]
-06/02
- * Removed the job bonuses of High Novice and Baby Novice [Playtester]
- * Updated Holy Cross, Investigate and Finger Offensive to be usable by all
- weapons. [Skotlex]
- * Gave several MVPs their MVP skill versions [Playtester]
- * Made Grandcross usable with all weapons. Thanks to Khersai for digging it
- up. [Skotlex]
- * Added Can Attack to various G_mobs [Playtester]
- * Removed the Novice Job bonuses again [Playtester]
- - http://www.eathena.ws/board/index.php?showtopic=93893
- * Small adjustments of the Orc Lord and Valkyrie Randgris drops [Playtester]
-06/01
- * Readded Novice Job bonusses [Poki#3]
- - Just why where they removed? http://guide.ragnarok.co.kr/JobNovicestatus.asp still lists them...
-
-05/31
- * Fixed mode of G_Whisper_Boss [Playtester]
- * Gave Rafflesia Can_Move and Aggressive mode [Playtester]
- - who removed it?
- * Fixed Arrow Crafting, now using the official X.2 values [Playtester]
- * Updated item_db according to info provided by Haplo [Playtester]
- * Changed the range of Rotar Zairo to 7, as it should be. [MasterOfMuppets]
-05/30
- * Fixed the mode of Monemus to prevent it from getting knocked back. [MasterOfMuppets]
- * Updated the modes of Gremlin and Beholder according to iRO [MasterOfMuppets]
-05/29
- * "Massive" item update [Vicious]
- - Updated the cards' effects. Old effects are commented at the end.
- -- Slots are NOT checked, so someone needs to do it. shouldn't be hard.
- - New items, by Landarma.
- - New "slotted" items.
- * Fixed Green Ale's effect, thanks to NLZ. [MasterOfMuppets]
-05/28
- * Updated ASC_BREAKER's range to 9. [Skotlex]
-05/28
- * Readded some aDelay fixes which were accidentaly reverted [Playtester]
-05/26
- * Added Red Chile drop to Kraben & small aMotion fix [Playtester]
- * Added missing Odin drops (guessed) [Playtester]
- * Updated Kiel and added Odin mob drops [Playtester]
- - low drop rates as long as not known
- - still missing Makeup Kit, Angel Hairband and not sure which Survivor's Rod
- * Fixed 12106,Jeweled_Box. Now giving an accessory [Lupus]
-05/25
- * Modified some drops and added drops to Ferus and Dragon Egg [Playtester]
- * Updated the Exp of some mobs accordings to the last kRO patch thanks to Muad_Dib [Playtester]
- * More fixes on MVP exp and changed some mob modes [Playtester]
- * Fixed Sidewinder card to raise the chance of Double Attack if you have mastered it [Playtester]
- * MVP Exp is now 1/2 of the Base Exp as pointed out by Tharis [Playtester]
- - Removed MVP drops of Hydro and Event Kiel as they are supposely no MVPs
-05/24
- * Added cooking drops to the mob_db [Playtester]
- * Final Aegis X.2 update [Playtester]
- - added mob_db_a.txt in case someone wants to use 100% official X.2 drop rates
- - now starting to add after-X.2 drops
-05/23
- * Amon Ra now uses Meteor Storm on self until we find out how it really works [Playtester]
-05/21
- * Incantation Samurai Card now ignores def of all non-boss races [Playtester]
- - should include players now
-05/19
- * Major fix to the mob_skill_db [Playtester]
- - traps are now placed around2 rather than self
- - all idle skills should work now
- * More fixes on Amon Ra [Playtester]
- * Fixed Bascojin's mob summoning [Playtester]
- * Fixed some SPRITE names of mobs [Playtester]
- * Fixed item names of new items thanks to Haplo [Playtester]
-05/18
- * Amon Ra's and Dark Lord's Fire Pillar & Meteor Storm now have Level 11 rather than 30 [Playtester]
- * Fixed MVP Fire Pillar --> 12 hits, 5x5 range [Playtester]
- * Corrected LoV's effect range for levels 11+ to range 8. [Skotlex]
- * Added new items 2006-04-25 ... 2006-05-16. Thanks to Landarma [Lupus]
-05/16
- * More Aegis X.2 drop updates [Playtester]
- - progress 50%
-05/15
- * More Amon Ra related changes [Playtester]
- - Dark Blessing and Blood Sucker now have a range of 9 tiles
- - Small fixes on his skills again
- - G_Khalitzburg is a bit slower now
- * Fixed implementation of MVP Meteor Storm [Playtester]
- - Dark Lord and Amon Ra use it
- - Meteors drop in an area of 31x31 tiles
- - each Meteor has 7x7 tiles splash damage
- - each Meteor does 15 hits
- * Spirit skills now have 500ms delay. [Skotlex]
- * Changed speed of G_Khalitzburg (very fast now) [Playtester]
- * Improved some skills of Amon Ra [Playtester]
-05/14
- * More Aegis X.2 drop updates [Playtester]
- - progress 45%
-05/13
- * Hopefully fixed Skeggiolds summon endless slaves [Playtester]
- * Added a hopefully better implementation of Amon Ra thanks to Tharis [Playtester]
- - also fixed name of Apocalypse
- * Uncommented Summon skill of Katrinn and Shecil [Playtester]
- * Some more drop updates [Playtester]
- - progress 40%
- * Fixed Medusa drops and updated Treasure Box drops [Playtester]
-05/12
- * Updated cast times of Kaupe and Kaahi. [Skotlex]
- * SMA has dex reducable casttime now. [Skotlex]
- * Updating drops to Aegis X.2 [Playtester]
- - progress 35%
-05/11
- * Moved TK_DOWNKICK's stun time from time to time2 [Skotlex]
- * Added TK_TURNKICK's stun time in skill_cast_db (2secs in time2) [Skotlex]
-05/09
- * More Aegis X.2 drop updates [Playtester]
-05/08
- * Corrected Stun Duration for Meteor assault to 3 secs. [Skotlex]
- * Reduced Stun duration of multiple skills to 3 secs. Skills affected:
- Meteor Storm, Land Mine, Bash (fatal blow), Throw Stone, NPC_LICK, Raid,
- shield Charge, Cart Termination. [Skotlex]
- * Reduced stun duration of most skills to 3 secs. [Skotlex]
-05/07
- * Updating drops to Aegis X.2 [Playtester]
- - progress 25%
-05/06
- * Replaced every "if(!cond) end; cmd1; cmd2;" with "if(cond) { cmd1; cmd2; }"
- in item scripts, reads better for the eyes and for PHP scripts [DracoRPG]
- * Changed Doppelganger Card's attack delay reduction bonus to non-stackable
- (bAspdRate instead of bAspdAddRate) as every other such bonus is [DracoRPG]
-05/05
- * Hammer fall's stun duration is now 1+lv seconds. [Skotlex]
- * Removed drops from Bio Lab mobs than are not in X.2 [Playtester]
-05/04
- * All KA-spells are interruptable. [Skotlex]
- * Modified NPC_STUNATTACK: Max level is 5, stun duration is 1+lv seconds
- (these duration values are guessed, but they are better than the previous
- 5+lv seconds) [Skotlex]
-05/03
- * Fusion's cast time reduced to 0. [Skotlex]
- * Removed all Novice Job bonusses [Playtester]
- * Reverted the changes to Killer Mantis and Demon Pungus card [Playtester]
- - the base effect rate is 20%, but target's defense can lower the rate
- * Fixed bugs in every New Card with getrefine() check [Lupus]
- - optimized some IF() conditions of the new cards
- - temp fix of getrefine bonus 4379,Blue_Acidus_Card (probably item desc is wrong)
-05/02
- * Corrected Desperado ammo consumption (should be 10) [Skotlex]
- * Lowered all card drop rates to 0.01% as they are in Aegis X.2 [Playtester]
- * Updating old/wrong mob drops to Aegis X.2 drops [Playtester]
- - progress 10%
- * Changed the prices of the ninja stones according to official. [erKURITA]
- * Linking skills now have their cast-time reduced by dex. [Skotlex]
- * Lowered the duration of Speed Potion to 5 seconds [Playtester]
- - now it's doubled speed for 5 seconds
-05/01
- * Fixed Jump Kick's range to 9. [Skotlex]
- * Modified the AM_TWILIGHT* skills to require 200 medicine bowls. [Skotlex]
- * Added effect of Speed Potion [Playtester]
- * Removed Kraben Card drop from G_Kraben [Playtester]
- * Fixed a typo in the Armeyer Dinze card thanks to theultramage [Playtester]
-04/30
- * Changed TK_RUN's state from none to move_enable. [Skotlex]
- * Added Hellion Revenant [Playtester]
- - his skills are still missing
- * Changed chance of Demon Pungus Card and Killer Mantis Card to 10% [Playtester]
- * Final updates for Bio Lab drop rates thanks to Muad_Dib [Playtester]
- - they should be official to 99% now
- * Updated Bio Lab drop rates to Aegis X.2 thanks to Muad_Dib [Playtester]
- * Fixed the name of Wind Demon = "Fuuma" shurikens [Playtester]
-04/29
- * Item ID 7344 is now called "Shinokas Case File" [Playtester]
- - when someone is making the quest please make sure the guy is called Shinokas
- * Updated drops of Bio Lab 3 MVPs [Playtester]
- - drop rate is 1/10 of the guessed values (until skills/delays are finished)
- - also fixed a typo in the item db
- * Updated drops of Bio Lab 3 mobs [Playtester]
- * Updated mob delays to current info [Playtester]
- * More fixes in the mob db [Playtester]
- - fixed more drops
- - kRO name for Goblin Steamrider is "Steam Goblin"
- * Started fixing the drops of mobs with more than 8 different items [Playtester]
- * Added new hats ViewID, thanks to Lost_Kakashi [Lupus]
- * Added new cards set 4332-4407. Thanks to virpyre,vicious_pucca,reddozen and the others ^_-
- - Fixed some bugs and typos in the new cards effects. Probably there are more [Lupus]
- Note: ON finishing adjusting STEAL skill, we'd start adding cards into MOBs drops.
-04/28
- * Fixed the "stun" typo that has been in eAthena for ages [Playtester]
- - SC_STAN --> SC_STUN
- - Eff_Stan --> Eff_Stun
- * Storm Kick's range increased to 2. [Skotlex]
- * Lowered drop rates of Bio Lab 3 normal mobs [Playtester]
- - not finished yet, need 12 item drop slots...
- * Range of Flying Sidekick 10->8 cells [Lupus]
- * Updated drop rates of the Bio Lab 1&2 mobs [Playtester]
- - using 1/2 of the guessed values again
-04/27
- * Corrected the hit value of the TK kicks (from single hit "6" to multi-hit
- "8") [Skotlex]
- * All TK kicks do 3 hits now. [Skotlex]
-04/26
- * Updated drop rates of Remover/Gemini with help of Tharis [Playtester]
- - droprate is now 1/2 of the guessed values
-04/25
- * Updated OBB/OCA/etc [Vicious]
- * Re-enabled Biolab's summon summmoning [Vicious]
-04/25
- * Fixed price of yummy fish 150z -> 250z [Playtester]
- * Updated Mode and Delays of Odin Temple mobs(using Frus delays for now) [Playtester]
- * Fixed Element, Race, aDelay, aMotion and Range of Plasma and Breeze [Playtester]
- * Updated the remaining mob names [Playtester]
- * Updated the iRO and kRO mob names [Playtester]
- - mob names done up to ID 1491, working on the rest now
- * Updated the header in the mob db text files [Playtester]
- - the order is now SpriteName,kROName,iROName
-04/24
- * Updated OBB, OCA, Cookie Bag, Giftbox, OVB drops to X.2(X.3?)
- ItemSummonList provided by Peter [Vicious]
- * Fixed Running's cast time [Playtester]
- * Fixed Item 2520 and Item 662 according to info from Haplo [Playtester]
-04/23
- * Updated mob_skill_db: all idle and walk skills had their rate up x10. [Skotlex]
- * Put in most of the Kiel Hyre monster drops, at temporary low rates. [MasterOfMuppets]
- * Updated some loot sell prices for the Kiel Hyre/Odin Temple monsters [MasterOfMuppets]
- * NPC_CHANGE<property> should be self, not target [Vicious]
- * Increased all chase/follow skill rates by 10 since their trigger rate has
- been decreased by that much due to the unit-data update. [Skotlex]
-04/22
- * Updated Kiel/Odin mob stat to kRO official guidebook [Vicious]
- * Major fix to the Einbroch mobs [Playtester]
- - stats and drops should now be to 99% official
-04/21
- * Fixed stats of Chung E / Green Maiden [Playtester]
- * Set NPC_INVISIBLE's duration to 30 secs. [Skotlex]
- * Finally implemented Dragon Egg thanks to Tharis [Playtester]
- * Fixed some mob skills that where missing an [Enter]... (Windows format... AGAIN!) [Poki#3]
- ...why co we have uncommented Attack skills under an iddle state? Oo
- * Added a lot of G_Mobs and changed some slave spawns to them. Please use the newest exe release. [Poki#3]
- * Fixed selling price of research chart(ID 7347) thanks to Muad_Dib [Playtester]
- * Fixed some drops of the Bio Lab 1&2 mobs [Playtester]
- * Fixed more elements of Bio Lab mobs [Playtester]
-04/20
- * Changed item_db2.txt to new format thanks to joshuaali [Playtester]
- * Fixed range of meteor (from 14x14 to 7x7) [Skotlex]
- * Fixed Nile Rose bonus [Playtester]
- * Fixed Violy's Arc Wand drop [Playtester]
- * Changed "Event Hat" to "Brazil Event Hat" [Playtester]
-04/19
- * Fixed a zeny exploit by lowering price of fire cracker [Playtester]
- * Fixed Attack of Niflheim Mobs being way too low [Playtester]
- * Reverted the delay for Arrow Shower and Double Strafe to 100ms [Skotlex]
- * Reverted the cast time for pick stone to 500ms, no delay. [Skotlex]
- * Fixed Roguemaster's Bow being equipable by Rogues [Playtester]
-04/18
- * Some more fixes on the Bio Lab mobs [Playtester]
- * Fixed Laurell's mode [Playtester]
- * Updated Juperos Mobs, they now have correct kRO Sakray stats [Playtester]
- * Fixed elements/race/size of all Juperos mobs [Playtester]
- - still working on the correct stats
- * Fixed element of Gemini and Monemus [Playtester]
- * Fixed Butcher's weapon level thanks to gyunwoo23 [Playtester]
- - also fixed Event Nile Rose missing a slot
- * Fixed new healing items not being usuable by new classes [Playtester]
-04/16
- * Fixed knives being equipable by Taekwon and Star Gladiator [Playtester]
- * Fixed jname of Photon Cannon [Playtester]
- * Fixed slots of Butcher thanks to gyunwoo23 [Playtester]
- * Fixed some item names in the item_db thanks to Haplo [Playtester]
- * Fixed Mjolnir's ASPD bonus [Playtester]
- * Fixed moving speed of Bio Lab 3 mobs [Playtester]
- * Corrected Venom Knife's requiring two knives per use. [Skotlex]
- * Adjusted more delays/speed of Lighthalzen mobs thanks to Tharis [Playtester]
- * Fixed Job_Equip values for all one-handed-swords thanks to Haplo [Playtester]
- * Fixed wrong effect 4175,Poisonous_Toad_Card [Lupus]
-04/15
- * Fixed Vesper's HP and implemented Monemus properly [Playtester]
- * Renamed Mastersmith Howard to Whitesmith Howard [Playtester]
- * Fixed Halo(id 2282) having 10% resistance instead of 15% thanks to KarLaeda [Playtester]
- * Fixed movement and attack speed of Lighthalzen Mobs thanks to Tharis [Playtester]
- * Fixed names of Lighthalzen Mobs, using iRO names now [Playtester]
-04/14
- * Fixed various Job Fields in the item_db.txt thanks to Haplo and KarLaeda [Playtester]
- - they should all fit to the descriptions now
-04/13
- - fixed pick stone ID [Lupus]
- * Updated 1675,VENATU (some columns were shifted) [Lupus]
- * Updated items weight, names. Thanks 2 Haplo [Lupus]
- - 12142,Book_of_Magic effect updated +20 Agi for 30 min (d0n't list it in the items desc)
- Stopped updating Stable Item Db till the merge ^_-
-04/12
- * Fixed the price of empty scrolls, thanks to rockmanEXE [MasterOfMuppets]
- for the info. He doesn't pwnz0rz so much :(
- * Some Lighthalzen mob updates [MasterOfMuppets]
- * Added cast time to pick stone of 3 secs and 500ms delay. [Skotlex]
- * Fixed produce_db for Halberd 3-->12 Oridecons [Playtester]
- * Fixed Violy's Violin[4] drop rate. It is 2%. [Playtester]
- * Fixed a typo and sorted skill_cast_db by skill id. [Playtester]
-04/11
- * Corrected some items bonus, weight. Thanks 2 Haplo [Lupus]
- * Modified Mastela Fruit price to 8500, according to RockmanEXE. [erKURITA]
- * Modified Goggles and Goggles_ price to... 20z, according to RockmanEXE. [erKURITA]
- * Made Anopheles aggressive [erKURITA]
-04/07
- * Modified the equip_job field in the item_db to be a hexadecimal value for
- easier handling. [Skotlex]
- * Modified/optimized the distribution of the values for jobs in the
- job_equip field; added doc/item_db.txt to explain each of the fields in
- db/item_db.txt as well as the possible values for them. [Skotlex]
-04/06
- * Added some Landarma's new items plugs [Lupus]
- * Lowered min zeny amount that give Red Envelopes, thanks to kyoki [Lupus]
- * Removed mapflag noreturn from pvp maps. [Skotlex]
- * Fixed HP/SP requirements for WE_MALE/WE_FEMALE [Skotlex]
-04/05
- * Modified the item_db and added view_types to ammo: 1 arrows, 2 dagger
- (venom knife), 3 bullets, 4 shells, 5 grenades, 6 shurikens, 7 kunais.
- [Skotlex]
- * Updated skill_require_db to specify the ammo types required for GS/NJ
- skills (as best as I could understand them) [Skotlex]
- * Updated item givers with ACTUAL items. ~10 Ep [Lupus]
- item_cookie_bag.txt,item_cardalbum.txt,item_violetbox.txt,item_giftbox.txt,item_bluebox.txt
-03/31
- * Changed the look field of all arrows to 1. [Skotlex]
- * Added column "RequiredArrowType" to skill_require_db, set to 1 all
- arrow-based skills. The rest of skills need to be set up! For example,
- let's say that throwable knives are type 2. On the item_db set up the
- item's look/view to be 2, and then in skill_require_db for the skill
- AS_VENOMKNIFE, set the required Arrow to 2 as well. This needs be done for
- all GS/NJ skills with throwable type requirements (bullets/darts/etc). I
- don't do it because I don't really know how many types there really are (I
- could have just added bullet/dagger and leave it at that, but I do not know
- if different skills require different types of "ammo". [Skotlex]
-
- * Adjusted the range of Wall of Fog to 9 and Spider Web to 7 [Skotlex]
-03/30
- * Fixed a lot of Jnames [Poki#3]
-03/29
- * Updated FULL BUSTER aftercast delays, thanks to Haplo [Lupus]
- - Fixed Rose Nile bonus
- * Updated changed weight of some items according to Haplo's note [Lupus]
- * Updated some SP cost of some skills. Added SP COST info for Homunculi skills. Thanks to Haplo [Lupus]
- * Fixed inf2 of Jump-Kick to make it a "combo-skill" so that it may do a
- BCT_ENEMY check. [Skotlex]
-03/28
- * Changed droprate of Einbroch/Lighthalzen monsters. [Vicious]
-03/27 * Removed EVENT bonuses from event items: [Lupus]
- 2646,Bunch_of_Carnations, 2647,Nile_Rose, 2668,Woman_Glory, 5097,2_Years_Anniversary_Hat
- NOTE: If you want to use these or other EVENT BONUSES, set them via 'setitemscript' command
- in your scripts. Check X-Mas Rings Event as example.
- Poki#3, please, update the item desc. Or explain that the bonuses are gone just after the events
-03/26
- * 5136,Louise's Santa_Hat lost its EVENT autocast bonus. [Lupus]
- * Added missing slots to Alice Doll, Marionette Doll, Kabuki Mask & Kawaii_Ribbon [Lupus]
-03/24
- * Fixed 5123,Ulle's_Cap bug [Lupus]
-03/22
- * Changed preserve's cost to 30 sp. [Skotlex]
- * Changed Soul Breaker's cast time to 700ms. [Skotlex]
- * Updated Elemental Converter ingredients. Thanks2 Haplo [Lupus]
-03/21
- * Fixed the inf2 for BA_DISSONANCE to be dance-skill. [Skotlex]
- * Myst Case Card will drop GB even if the card combo's on [Lupus]
-03/20
- * Fixed splash area of Ganbantein [Skotlex]
- * Updated atk,def,mdef of NJ/GS items, thanks to Haplo [Lupus]
- - also re-fixed few blackhole89 (def, atk) values
- * Uploaded Kargha's updated item_db.txt with the Gunslinger/Ninja usage bits set.
- Looked correct to me, if there should still be errors, feel free to revert. [blackhole89]
-03/18
- * Updated price and such for NJ/SG weapons
- * Fixed tons of wrong weight, wep lvlm req level items. Big thanks to KarLaeda and Haplo [Lupus]
-03/15
- * Alice Doll hat fixed effect, thanks2 Sir_Loon [Lupus]
- - Fixed Moonlit's inf2 not being set to ensemble skill. Thanks to Haplo.
- [Skotlex]
-03/14
- * Modified skill entries for the Wedding recall skills. Updated their
- splash value to signal the area around the caster where the warp will be
- placed. [Skotlex]
-03/13
- * Changed the mode of the crystals to 193 (can move, can attack, plants)
- [Skotlex]
- * Devotion won't work on guildmates now (only party-members) [Skotlex]
- * Changed Gravity Field's element to earth so that it may hit hidden chars.
- [Skotlex]
- * Added missing mob skills to G_HYDRA, G_PARASITE [Lupus]
- * Fixed TK and Soul Linker's position of their job entry in exp2.txt,
- thanks to Coltaro. [Skotlex]
- * Fixed NPC_GRANDDARKNESS targetting the enemy instead of yourself in
- mob_skill_db. [Skotlex]
- * Fixed Grandcross's hit and range entries in the skill_db (it had hit 5?
- that wasn't even a valid value from the description) [Skotlex]
-03/11
- * Update the buy/sell prices of four daggers(1247-1249 & 13000) [MasterOfMuppets]
- * Adjusted bonus items drop rates at Mimic Card and Myst Case Card [Lupus]
-03/10
- * Added a few dummy duration values on skill_cast_db for some GS skills
- (better than leaving them on 0...) [Skotlex]
- * Updated div of LoV, Combo Skills and other such skills whose damage
- equation does not really scales well with the number of hits. [Skotlex]
- * Made G_Giant_Hornet Agressive, thanks to Blackgatomon [Lupus]
- * Doppel's drops fix Lance 1411 -> Lance 1410 [Lupus]
-03/08
- * Updated skill tree for Ninja/GS [Vicious]
- * More work on Ninja/GS. They have joblvl 70, according to status
- on kRO site, so using adv. classes' job exp chart. [Vicious]
- * Updated stat bonus, given by Muad_Dib. [Vicious]
- * Added more columns to size_fix and job_db1.txt with temp value. [Vicious]
- * Fixed cooldown time for ASC_CDP, according to description [Foruken]
-03/07
- * Temp ninja/gs skill tree. [Vicious]
- * Temp plug on Ninja in Skill_db. Ninja is correct on skill ID,
- not sure about gunslinger, so they're commented out. [Vicious]
-03/06
- * Stave Crasher's element is now -1 (take weapon's element) [Skotlex]
-03/03
- * Fixed missing baby-dancer job in exp2.txt [Skotlex]
- * Added GrandCross's can't move delay of 900ms to skill_cast_db and Finger
- Offensive's can't move delay of 200ms/lv to skill_cast_db (values taken
- from the code) [Skotlex]
- * Updated skill_cast_db time info for some skills: [Skotlex]
- - Magnum's time2 is skill-block time
- - St. Recovery/ Cure's time2 is the confuse/blind duration
- - added NPC_POWERUP/NPC_AGIUP durations
- - Napalm Vulcan's time2 is curse length
- - Most of Tarot Card's effects last time2
- * Adjusted SC durations for Meteor Assault [Skotlex]
-03/02
- * Temp Plugs for NJ and GS items [Poki#3]
- * Fixed some skill warnings. [Poki#3]
- * Added back mob "Mime Monkey". [Poki#3]
-
-03/01
- * Added temp Green Iguana skills [Lupus]
-
-02/27
- * Temp plug: 2620,Rogue's_Treasure steal rate -> 1 (have to fix formula) [Lupus]
- - Fixed all Vesper Acessories (removed doubled DEF bonus), thanks to Irmin
- - Rearranged Stone Buckler: normally it gives +4 DEF, with CARD COMBO it gives +5 DEF, and with CARD COMBO+SWORDMAN CLASS it would give +10 DEF
- - Removed DOUBLED combo bonus from some items. Also fixed missing brackets
- Chnaged: 2115,Valkyrie's_Shield, 2114,Stone_Buckler, 2353,Odin's_Blessing,
- 5122,Magni's_Cap, 5123,Ulle's_Cap, 5124,Fricca's_Circlet
-02/24
- * Changed bosses slaves in Bio Labs level 3 - they will spawn only once now [Komurka]
-
-02/22
- * Fixed Summon skills, among others. [Poki#3]
- * Fixed G_GOBLINE_XMAS mode (aggresive ~~) [Komurka]
- * Made G_DARK_ILLUSION more ... aggressive [Komurka]
-
-02/21
- * Changed a bunch of item names according to the upcoming iRO Lighthalzen Patch. [Poki#3]
-
-02/20
- * Some mob_skill_db fixes [Komurka]
- * Fixed a small typo I found while browsing through the mob skill database [MasterOfMuppets]
- * Reverted back all 'status change' cards back to 10/20/30% (kRO website have full descs ~~) [Komurka]
- * Updated item_bluebox.txt, item_giftbox.txt, item_violetbox.txt, item_db.txt, mob_db.txt, [Komurka]
- added item_cookie_bag.txt
- - new databases from Aegis 10.2
- - implemented Cookie Bag item
- - added missing mobs
- - note: yes, I know that random item databases can be shorter (item_bluebox.txt, item_violetbox.txt,
- item_cookie_bag.txt, but not with current implementation of item randomizing
- for expamle:
- - there are 9285 items in item_bluebox.txt, and 1000000/9285 = real value
- - so line with Red Potion would contain rate = 1000000/9285*12 = real value (can't be)
- I think it's better to have bigger db, and do ONE rand check, than shorter and check it even 1000 times ~~
- (in function itemdb_searchrandomid) so please, don't mess with them, or change them
- * Updated mobs mode (ID 1001-1691) according to Aegis 10.2 [Komurka]
- * 2nd part (status % chances, coma) of item_db.txt update according to Aegis 10.2 file [Komurka]
- - all cards, that had 20% on status change now have 6%
- - all cards, that had 10%+20% on status change now have 3%+3%
- - all bAddEff and bResEff updated
- - some small fixes
- - fixed Assaulter slaves thanks to Poki#3
- * 1st part (autospells) of item_db.txt update according to Aegis 10.2 file [Komurka]
- - (to transtation devs) I suggest to update item descriptions
- * New mob skill database from Aegis 10.2 (mobs 1001-1691) [Komurka]
- * Fixed some names in mob_db.txt ('Name', not 'JName') [Komurka]
-
-02/18
- * Updated Chung_E's drops a bit according to recent info, it had the same [MasterOfMuppets]
- drops as Sohees before.
- * Violy Card fix [Komurka]
- * Updated effects of 585,Brusti, 1263 Unholy Touch, 12133 McDonald's Ice Cone [Lupus]
- & 12136 Women's Bundle
-02/17
- - Updated skill_unit_db to use range 1 for all mines. The actual splash
- range is now taken from skill_db. [Skotlex]
- - Updated some skills who's NK should now be 3. Updated some splash ranges.
- [Skotlex]
-02/16
- * Added a new column in the skill_db to specify the
- splash-range/area-of-effect of skills. [Skotlex]
-02/14
- * Part 1 of Gravitys "Zeny Inflation Control Update" [Poki#3]
- - All potion type drops from monsters are changed with Herbs (Excluding MvP Monsters).
- Red Potions -> Red Herb
- Orange Potion -> Yellow Herb
- Yellow Potion -> Yellow Herb
- White Potion -> White Herb
- Green Potion -> Green Herb
- - 'Mastela Fruit', dropped by 'Enchanted Peach Tree' monster, will be deleted.
- You can buy it in Hugel.
- - All Awakening Potions replaced with Grapes.
- - All Berserk Potions replaced by Lemon.
- * Jump Kick and High Jump now depend on the skill state ST_MOVE_ENABLE
- [Skotlex]
-02/13
- * Updated most mobs Summon Skills to use "OnSpawn" conditions. [Poki#3]
- * Fixed exp.txt for Baby Dancer, thanks to Gepard [Komurka]
-
-02/10
- * Enchanted Peach Tree supposed to move, thanks to Persian69 [Vicious]
- * Clock's attack range is 2, thanks to Persian69 [Vicious]
- * Fixed Valkyrie armors having no effect for Aco class, thanks to
- a user from em-24.com [Vicious]
- * Changed the max level of the NPC_BREAK skills to 10. Changed their
- element to 0 and made them no damage skills. [Skotlex]
- * Weapon Repair update. SP cost 30, Cast time 7.5 secs, interruptable. [Skotlex]
-02/09
- * Modified Magnum break's delay to 0, time1 to 2 secs, time2 to 10 secs.
- Time 1 is for the skill reuse delay, and time2 the weapon fire bonus time.
- [Skotlex]
-02/06
- * Changed Serin's Gold Ring Weight to 0 [Poki#3]
-
-02/05
- * Merged most of the 'plug' items into the main item_db. [Skotlex]
-02/04
- * Added monster skills and drops to Plasma(all types), Orc baby, green iguana. Thanks [MasterOfMuppets]
- to Tharis for providing the info.
-02/02
- * Added Playtester's Odin and Kiel Mobs. Added Valkyrie and missing Honunies. [Poki#3]
-02/01
- * Falcon Assault only does one hit now. [Skotlex]
-01/31
- * Changed Lady Tany's skills a bit and removed the CANWALK from her mode [MasterOfMuppets]
- * Changed Vesper's mode to boss [MasterOfMuppets]
-01/30
- * Revised the Thanatos Tower and Abyss Lakes monster's skills [MasterOfMuppets]
- * Added monster drops to the Thanatos Tower and Abyss lake monsters [MasterOfMuppets]
- * Fixed a lot of item names in item_db ;] [Poki#3]
- * Fixed Dark Priest Card [Komurka]
-01/29
- * Updated drops of Vesper [MasterOfMuppets]
- * Changed the range of NPC_PETRIFYATTACK from 1 to 7 [MasterOfMuppets]
- * Added monster skills to the odin temple monsters [MasterOfMuppets]
- * Updated Vesper's and orc baby's monster skills [MasterOfMuppets]
- * Vesper will now spawn Apocalypses as slaves [MasterOfMuppets]
- * Lowered the drop rate of peridots by apocalypses, they are no longer minibosses. [MasterOfMuppets]
- * Updated some cards according to tests: Icreased a bit chance of Gift Box / OBB /OVB drops [Lupus]
- Raggler Card Combo(2x), Mimic Card(2x), Mystcase Card(8x)
- * Updated Mystcase Card: When Raggler Card Cmbo is set, it stops dropping Gift Boxes [Lupus]
- Because it starts dropping OVBs
- * Updated the stats, exp, jexp, hp, def, mdef, atk of all the Thanatos tower [MasterOfMuppets]
- & Abyss lake monsters and Banana Lady Tanee using information from the official
- kRO guide book. Thanks to saycyber21 for the scans. However FERUS and FERUS_ was missing =(
- * Updated Vesper a bit and changed some drops for the venatus [MasterOfMuppets]
-01/28
- * Added two missing zeros to Pharaoh's database line, thanks to Persian69 [MasterOfMuppets]
- * Removed the looting modes of all the Lighthalzen monsters, why were [MasterOfMuppets]
- they there anyway o_0
- * Changed Apocalips_H's jname to Vesper [MasterOfMuppets]
- - Switched two dimik drops with eachother
-01/27
- * Updated Branches [Poki#3]
- * Fixed mob skill entries of AL_PNEUMA for Kiel. [Skotlex]
- * Updated EXP,JEXP and ATK of the Kiel dungeon monsters. [MasterOfMuppets]
- * Removed emperium from Pharaoh's drop list. [Kayla]
- * Added monster skills to the kiel dungeon monsters [MasterOfMuppets]
- * Changed SKEGGIOLD monster #1755 to SKEGGIOLD_ so you can separate them [MasterOfMuppets]
-
-01/26
- * Changed Sunflower Pin's DEF from 0 do 1 (27/01 kRO Patch) [Poki#3]
- * Rearanged the new items in item_db. they should be chacked and placed in the right spot [Poki#3]
- * Cleared up some Custom Mobs and their skills. [Poki#3]
- * Changed Fire Poring's ID to 1239 and moved him to mob_db2. [Poki#3]
- * Changed some Mob Names, based on kRO. [Poki#3]
- * Ygnizem (Boss) now summons the G_ mobs. This should be done to all MvP's [Poki#3]
- * Changed Kavac's Range to 9 and Katrinn and Magaleta's Range to 1. [Poki#3]
- * Added the missing Bazerald drop to Pharaoh at 0.8% [MasterOfMuppets]
- * Changed ASC_BREAKER range from 9 to 5 cells, according to skill
- description available in translation project [Foruken]
-
-01/25
- * TK_RUN's cast time is now 1 sec (it was previously 5:4:3:2:1 ms, the
- heck? someone refix it if it was supposed to be 5000:4000:3000:2000:1000)
- [Skotlex]
- * Fixed a few item scripts (SC_ATKPOT -> SC_ATKPOTION) [Skotlex]
- * checked mob_skill_db.txt and mob_skill_db2.txt under DOS, removed strange ASCII chars
- - hope it's fixed now [Komurka]
-
-01/24
- * removed unneeded comma in produce_db.txt (someday I'm gonna write parser for eA scripts ~~) [Komurka]
- * card fix (>77 changed to >=77) thanks to Poki#3 [Komurka]
-
-01/21
- * Added/removed some commas in mob_skill_db.txt [Komurka]
- - Added mob_skill_db2.txt
- * Fixed Chase Walk SP usage (40->10) thanks to poorboy [Komurka]
- * Fixed Crab Card's Combo Bonus: Wind Element -> Water, thanks to Irmin [Lupus]
- * Fixed 'Box of Heavy Rain' [Komurka]
-
-01/20
- * Changed Double Strafe, Arrow Shower and Beast Strafing's delay to be
- 100ms on top of the normal attack delay. [Skotlex]
-01/19
- * Updated db/const.txt to contain all SC_ effects as defined in status.h.
- Thanks to Ancyker. [Skotlex]
- - Updated item_db.txt as a few SC_ have had their names changed.
- - It may be necessary to remove a few entries which make no sense to add,
- but that can be done later.
-01/16
- * Corrected Roundkick's knockback? [Vicious]
-01/14
- * Mode change on some monsters [Vicious]
- * Updated Packet DB a bit [Vicious]
- * Updated the race, size, HP and modes of the Kiel monsters [MasterOfMuppets]
-01/12
- * Fixed Baby Leopard by.. ppl. [Vicious]
- * Temp Odin monsters, by Azazel [Vicious]
- * Zipper Bear Card and Baby Leopard Card do not protect against stripping.
- Done by DracoRPG [Vicious]
-01/10
- * Fixed Mighty Staff to drain 2SP per attack rather than 2% [Skotlex]
-01/09
- * Refixed GrandCross's script (bonus2->bonus) [Skotlex
-01/08
- * Changed Grand Cross's script to drain 1 sp per hit rather than 1% [Skotlex]
- * Added the Kiel dungeon monsters, they have no stats yet though [MasterOfMuppets]
- * Changed the name of Chung E to Green Maiden [MasterOfMuppets]
- * Changed the name of Zherlthsh to Zealotus as in iRO, [MasterOfMuppets]
- you should thank me for that ;D
- * Now Mammonite is usable by all weapons. [Skotlex]
-01/07
- * Santa's Bag type 0->2, some potions type 2->0 [Lupus]
- * Item DB correction. [Vicious]
-01/05
- * Fixed item updates by jsk225. [Vicious]
- * Item updates by Landarma. Need updates. [Vicious]
-01/03
- * SL_KAUPE skill times info to skill_cast_db. [Skotlex]
- * Added SL_SWOO, SL_SKE, SL_SKA skill times information to skill_cast_db.
- [Skotlex]
- * Set nk to 2 (splash damage) to Meteor Assault and Raging Thrust [Skotlex]
-01/02
- * Added active guild skills to skill_castnodex_db [Skotlex]
-01/01
- * Corrected char name filter? [Vicious]
-12/31
- * Updated Absorb spirit spheres to be interruptible. [Skotlex]
- * Updated some mobskills for the einbroch monsters [MasterOfMuppets]
-12/30
- * Removed some maps from mapflag that were not in either maps_athena nor map_index. [Vicious]
- * Updated the active guild skill cast times to 5 secs. Now their time2 is
- used as cool-down (300000 -> 5 mins). Also made them interruptable. [Skotlex]
-12/28
- * Added Kahai and Kaite spell times to skill_cast_db [Skotlex]
- * Removed Guilds Glory from guild skill tree [Komurka]
- * Moved some THQ items [Komurka]
- * Fixed duplicate the_sign [DracoRPG]
- * Fixed 2 name inconstitencies in item_db, thanks to Haplo [DracoRPG]
- * Added SC_Intravision to Sunshine Box and const list [DracoRPG]
- * Cleaned up even further, no conflict should occur now [DracoRPG]
-12/27
- * Reverted Draco's cleanup [Komurka]
- * Small cleanup in item names [DracoRPG]
-12/24
- * Changed Dokkaebi to Dokebi, by Harbin [Vicious]
- * Removed the item requirements for Twilight Pharmacy from
- skill_require_db, since the requirements are acquired from produce_db.txt
- [Skotlex]
- * Moved the sell price of the Tuxedo to the buy column (21500->43000) [Skotlex]
-12/23
- * Corrected the Critical Race bonus of the Sabbath and cleaned up the
- script of Morphicious' Hood. [Skotlex]
- * Added 1 sec cast time to Stone Curse [Komurka]
- * Added missing Amon Ra skills (he won't be so lame anymore) [Komurka]
- * Some fixes thx to Poki#3 [Komurka]
- * Desert Wolf Babe -> Baby Desert Wolf (iRO), thx to Poki#3 [Komurka]
- * Fixed the drops of RSX 0806, thanks to Poki#3 [MasterOfMuppets]
-12/22
- * Added back the changebase script to Tuxedo. [Skotlex]
- * Changed the autospell chance of Lude card from 2% to 20%. [MasterOfMuppets]
- * Changed pest card to get its additional bonus if you have 77 int or [MasterOfMuppets]
- higher instead of 77 and higher.
-12/21
- * Item_DB update for Tuesday's kRO sakray update. Temp plugs. [Vicious]
- - THQ Quest Items needs new item number!!!!
-
-12/20
- * Set up some basic skill info for SKA/SKE/SWOO [Skotlex]
- * Moved item requirements for Aqua Benedicta to produce_db. [Skotlex]
- * A small fix to sucsamad [MasterOfMuppets]
- * Moved item requirements for Create Deadly Poison from skill_require_db to
- produce_db [Skotlex]
-12/19
- * Jewel sword will now drop jewels as intended, fixed a typo in sucsamad, [MasterOfMuppets]
- thanks to Ishizu-chan.
- * Fixed 1613,Mighty Staff to give 10 str instead of 15. [Kayla]
-12/18
- * Updated 1725,Wondering Bard's Bow applicable jobs and item bonus [Lupus]
-12/17
- * Removed 10% Neutral Damage Resistance from Golden Gear [Komurka]
-12/16
- * Added effects to 12112,Tropical_Sograt and 12113,Vermilion_the_Beach. Thanks to persian69 [Lupus]
- * Fixed Treasure Box 30 (Payon Castle 5) drops Mage Hat (the green one), where it should drop Magician Hat instead (the cylinder hat), thanks 2Ishuzu-chan
-12/13
- * Modified a bit a few skills in skill_db to enable mobs to properly use
- them. [Skotlex]
- * Fixed G_BAPHOMET_ to show up as "Baphomet" instead of "Baphomet Jr." [MasterOfMuppets]
-12/12
- * Slotted Elemental Armors can be worn by anyone except novice. [Vicious]
- * Updated packet_db for /taekwon [Vicious]
- * Added SL_KAIZEL data to skill_cast_db.txt/skill_cast_nodex_db.txt [Skotlex]
- * Updated some KA skill info in skill_db, thanks to Reddozen. [Skotlex]
- * Fixed some items, such as Kafra Ring. Also updated accessaries.
- Novices/Super Novices are not allowed to wear lots of accessaries. [Vicious]
- * Changed available jobs for some items. If it is wrong job...
- Blame Item'o'luper since I used it. XD Doubt it is wrong though. [Vicious]
- * Changed Marionette's blowcount to 0 rather than 1... [Skotlex]
- * Added EOL before '//SG_FUSION#Union of the Sun, Moon and Stars#' in skill_tree.txt [Komurka]
- Dunno what's wrong but ... before server hasn't been reading SG_FUSION skill at all -.-
-12/11
- * Corrected again the mvp exp percent of Lighthalzen bosses (max is 10000
- = 100%, why was it set to 700000? Made 7000 = 70%) [Skotlex]
- * TKs, SGs and SLs should now be able to use berserk potions. [MasterOfMuppets]
- * Added missing quantity value to Herb Tea With Grape Juice and Barbecue, thanks to Haplo [Lupus]
-12/10
- * Removed V_poring from dead branch, it's a boss monster >.> [MasterOfMuppets]
- * Added slot to angel's kiss [Kayla]
- * Updated some items to allow soullinkers wear them, thanks to lunaus [MasterOfMuppets]
- for all the work.
- * Fixed the aftercast delay of lex divina, thanks to marquis007. [MasterOfMuppets]
- * Updated the sell/buy price of some Homunculus related items [MasterOfMuppets]
-12/09
- * Made Berserk Pitcher Potion-Pitcher-like. [Vicious]
- * Fixed 5125, Angel's Kiss. Should be novice only. Good eye Kholdstare! [Kayla]
- * Updated skill_db and skill_require_db info for Soul Linker skills, thanks
- to Reddozen to provide the information. [Skotlex]
- * Updated skill_db SL skills pl to -2 where appropiate (-2 = take
- status-change's element, but not weapon's one -> For Warm Wind) [Skotlex]
- * Added in skill data for SL_STIN/SL_STUN/SL_SMA [Skotlex]
- * Updated skill_require_db to enable songs/dances to be performed with
- either whips/musical instruments. [Skotlex]
- * Added a bunch of Soul Linker skills to skill_castnodex_db.txt [Skotlex]
-12/08
- * View ID changed for Luise's Santa's Hat from 208 to 20 (standard santa's hat)
- because 208 isn't supported yet
- * Corrected HT_POWER's number of hits (1->2) [Skotlex]
- * Corrected G_Mobster's element, thanks to Haplo [Skotlex]
- * Corrected Treasure Box element, now they are Neutral 1. [Skotlex]
- * Modified Beast Strafing's inf to be a self skill (since it's a combo, it
- auto selects target) [Skotlex]
- * Updated Volet / Blue Box items lists [Lupus]
- * Fixed 5131,Close_Helmet jobs [Lupus]
- * Updated Warmth of the Sun / Warmth of the Moon / Warmth of the Star sp usage (20/20/10) [Komurka]
- * Implemented the script of a few items. Need clarification of a few others
- that need implementing (see above comments). [Skotlex]
- * Updated the element of all treasure boxes to 21 (neutral 1) [Skotlex]
-12/07
- * Updated inf2 to 2 (NPC skills) to the Abracadabra skills to prevent them
- from displaying on the GM-all-skills menu. [Skotlex]
- * Updated SG_*_WARM skills to have range 1. [Skotlex]
- * Updated SG skills [Komurka]
-12/06
- * Updated Berserk Pitcher in skill_require_db and Full Adrenaline Rush in
- skill_db as per Reddozen's info. [Skotlex]
- * Made Garm's Claw shadow property [Harbin]
- * Added Thanatos to boss list [Harbin]
-12/05
- * Fixed Succub+Incub Cards combo bonus -> +1 INT, thanks to Playtester [Lupus]
- * Fixed Wings of Eagle Script (bSpeed no longer exists, it should be
- bSpeedRate) [Skotlex]
- * Fixed Meteor Storm (Was not requiring thunderstorm level 1) [Kayla]
-12/04
- * Updated SL_SOULLINKER to have inf2 = 512 (cant' cast on self) [Skotlex]
-12/02
- * Fixed Items according to Taekwon / Soul Linker / Star Gladiator [Lupus]
- * Changed the requirment of Vulture's Eye for Falcon Assault [MasterOfMuppets]
- from 10 to 5, thanks to Haplo.
- * Fixed two typos in the mob_skill_db, thanks to Zubasa [MasterOfMuppets]
- * Casting time for soul link [Vicious]
- * Updated Marine Sphere skills in hopes to make it work correctly.
-12/01
- * Changed TK_JUMPKICK's inf to self skill (to make it behave like extremity
- fist) [Skotlex]
- * Set Ki Explosion's stun time as time2 in skill_cast_db. [Skotlex]
- * Lowered the MVP exp bonus from the bio lab dungeon bosses [MasterOfMuppets]
- - fixed a typo in Erend's exp
- * Corrected Venom Splasher's countdown duration. [Skotlex]
- * Implementation of Reddozen's Soul Linker's DB [Vicious]
-11/30
- * Added the last drops of the Bio lab dungeon bosses [MasterOfMuppets]
- * Changed the attack range of Rafflesias to 7 [MasterOfMuppets]
- * Cleaned up the item_db, checked and added the items previously added and
- commented by Viccious. [Skotlex]
- * Cleaned up the mob_db, corrected Lighthalzen Bosses MVP exp rate (the max
- is 100%, why did you guys set 70000%? I changed that to 70%) [Skotlex]
- * Cleaned up job_db2.txt by removing the unnecessary trailing 0's. [Skotlex]
- * Fixed Antonio's defense (was 100, should be 99) [Kayla]
- * Fixed CTM card affecting after-cast delay instead of castrate [Vicious]
- * Fixed phen card affecting your after-cast delay instead of castrate, [MasterOfMuppets]
- thanks to andz for pointing it out
- * Mob_db update, added some more G_mobs and Xmas_Orc, thanks to [MasterOfMuppets]
- Muad_dib
- * Changed the range of NPC_CURSEATTACK and NPC_BLINDATTACK to 7, [MasterOfMuppets]
- not sure whether it's supposed to be 7 or 9...
- * Updated elemental-resist potions in produce_db, thanks to jsk225 [Vicious]
- * Updated two-handed sword's weapon level in produce_db, thanks to piroJOKE. [Vicious]
-11/29
- * Updated range of Phantasmic and Charge Arrow. [Skotlex]
- * Correct ViewID for Cyclops Eye, Updated to-do [Vicious]
- * Temp plug on new items. Someone check please. :D [Vicious]
- * Updated skill ranges so that the range specified is always the skill
- range regardless of sign. Those with negative range are now used for the
- battle_config option skillrange_from_weapon [Skotlex]
- * Updated Earth Elemental Convertor, thanks to reddozen [Vicious]
- * Added temp skills to Ayothaya MVP Lady Tany. [Lupus]
- Also added her real slaves, thanks to MasterOfMuppets for info
- * Update produce_db.txt with cooking items coments, thanks to battousai90 [Lupus]
-11/28
- * Lighthalzen MVP drop update done by MasterOfMuppets - Still need more work. [Vicious]
- * Reduced the range of Focused Arrow Strike by 10, that range should be
- added via the Vulture skill. [Skotlex]
- * Updated skill ranges for Alchemist and Monk, thanks to Komurka. [Skotlex]
-11/27
- * Added Sonic Blow to skill_castnodex so that the skill delay applies to
- walking as well. [Skotlex]
- * Fixed Adrenaline2 and Berserk Pitcher's inf2 (were not set to spirit
- skill) [Skotlex]
- * Reverted Ruwach's range to 2. [Skotlex]
- * Updated skill_db to make all ranged skills with range 8 become 9. Also
- explained wtf is "maxcount" in skill_db. [Skotlex]
- * Fixed SA skills showing up. wtf is "maxcount" in skill_db??? [Vicious]
-11/26
- * Updated effect boxes, according to RO Magazine [Vicious]
- * Updated Redemptio(no target, not dex-effected) [Vicious]
- * Updated blowcount on 2nd class quest skills [Vicious]
- * Updated sell prices on new items [Vicious]
- * Updated Great Axe to give +5 skillblown to Mammonite, and BonGun card +5
- knockback to Bash [Skotlex]
- * Changed the range of Blitz Beat and Falcon Assault to 5 [Skotlex]
- (Vulture Eye bonus is now applied to these skills)
-11/25
- * Updated skill ranges of Rogue and Priest skills, thanks to Komurka
- for the information. [Skotlex]
- * Updated skill ranges of Assassin and Crusader skills, thanks to Komurka
- for the information. [Skotlex]
-11/24
- * Updated skill ranges of Hunter and Knight skills, thanks to Komurka for
- the packet information. [Skotlex]
-11/22
- * Lowered the required ammount of oridecon needed to craft gladiuses by 4, [MasterOfMuppets]
- thanks to andz for pointing it out.
- * Updated the Range of Provoke, Bowling Bash. Retouched the range of Spear
- Stab to be +2 of current weapon rather than 4. [Skotlex]
- * Reupdated the mob skill db (some mobs had mode change-target which is
- obsolete now) [Skotlex]
- * Merged in Komurka's latest update to the mob_skill_db.txt [Skotlex]
- * Updated Firewall's knockback to 2. [Skotlex]
- * Updated the job bonuses for a bunch of jobs, thanks to Haplo for going
- through the kRO job bonus db. [Skotlex]
- * Fixed g_bloody_butterfly - 1526, thanks to Zoc for finding it [Kayla]
-11/21
- * Changed a Coma effect. Thanks to Luna. [Nexon]
- * Updated joblevel stat bonuses of Soullinker and Star Gladiator, thanks to reddozen [MasterOfMuppets]
- * Massive Reddozen's update of mix-food recipes, also made all Cooking Sets Produce 11; [Lupus]
- * Made more food/Potion items type 0, fixed typo [Lupus]
- * Updated rafflesia's mode to make it change-target. [Skotlex]
-11/20
- * Changed all mixed food type to 0 - FOOD (healing items) [Lupus]
- * Updated mob_db with the mode data from Kyoki and added mob entries 1521
- 1581. [Skotlex]
- * Added that bonus INT to Sage/Baby Sage on Job Level 38 [Skotlex]
- * Updated the monster DB to use all the new modes, all credits to Kyoki [MasterOfMuppets]
- * Adjusted drops/speed of the Einbroch monsters according to iRO [MasterOfMuppets]
- * Fixed Skeleton Manteau not having it's bonuses, thanks to reddozen & vicious_pucca [MasterOfMuppets]
- * Mjolnir can now only be used by merchant/swordsman classes [MasterOfMuppets]
-11/18
- * Fixed Tao Gunka's Slaves -> Megaliths again [Lupus]
- * Fixed the Elemental Resist potions. [Skotlex]
-11/17
- * Updated the mob skill database to use the new conditions angry and follow [MasterOfMuppets]
- now it also changed the modes of monsters using emotes, all credits goes
- to Komurka for the database work.
- * Added 5135,Cyclops_Eye with temp view ID [Lupus]
- * Changed the drop rate of house auger from lord of death to 0.8% [MasterOfMuppets]
- * Made Brooch of cursed fortune give +6 crit instead of +6% crit, [MasterOfMuppets]
- thanks to vicious_pucca.
-11/15
- * Replaced all Cards' bAtk bonuses with bBaseAtk, thanks to Vicious_Pucca for pointing it out [Lupus]
- * Taekwon skill updates [DracoRPG]
- * Fixed bonus of 2356,Holy_Cloth_of_Benefit, thx to vicious_pucca [Lupus]
- * Made Arrow Shower a land-based skill. [Skotlex]
- * Changed Moonlight Petal's range to 3, this is used for the sheltering
- range of the skill. [Skotlex]
- * Updated 2356,Holy_Cloth_of_Benefit effect [Lupus]
-11/14
- * Added sell price to pot and fixed the shop, thanks to vicious_pucca [MasterOfMuppets]
- * Updated some more food prices [MasterOfMuppets]
- - Also added a few of the shops selling food items, pot isn't sold atm though
- I'll try to find it's price tomorrow.
- * Made Ruwach's element Holy as pointed out by k3dt. [Skotlex]
-11/13
- * Updated some buy prices to food items, thanks to reddozen and vicious_pucca [MasterOfMuppets]
-11/12
- * Fixed pumpkin hat. Halloween is over, so is the item's status boosts. [Nexon]
-11/09
- * Fixed alice and zherlths(whatever)s taming items which were swaped [MasterOfMuppets]
- thanks to Poki#3 for fixing it.
- * Updated metalings drop rates, based on 100 killed metalings [MasterOfMuppets]
- in iRO, I will kill more some other time to get more accurate results
- mob_db.txt update: [Lupus]
- - Added Solid Trunks into Willow drops (fixed % rate of other trunks)
- - Removed ALL slaves cards drops from mini-boss drops
- - Removed Zorro Mask from goblins drops (added it into Wrapped Masks Box)
- - Updated some Goblins drops: Added Surprized Mask, Annoyed Mask, Gangsters Mask
- - all the rest masks you could get from Wrapped Masks Box
- * Updated the drops of the normal advanced class monsters in lighthalzen. [MasterOfMuppets]
- Thanks to reddozen for fine tuning them
- * Made Maya Purple card to compound on headgear isntead of accessory, [MasterOfMuppets]
- thanks to reddozen.
- - Added red chili to Kraben's monster drops.
- * Corrected Venom Knife's poison duration. [Skotlex]
- * Fixed dumpling child card dropping meat and giving an additional heal effect to meat
- instead of candy, thanks to Komurka. [MasterOfMuppets]
- * Added a few monster drops related to cooking, thanks to reddozen and vicious_pucca [MasterOfMuppets]
- - Cook books 6~10, various ingredients for cooking and legendary cooking set.
- * Updated db/const.txt as per the new SC changes, thanks to Silent. [Skotlex]
-11/08
- * Added cook books, lvl 1~5 to item_trade.txt to prevent exploits [MasterOfMuppets]
- * Updated job_db1.txt information for Taekwon/Star Gladiator and Soul
- Linker. Thanks to... Reddozen, I think (data was taken from the Taekwon
- Thread) [Skotlex]
- * Fixed Mobster Card bonus, thanks to tattatheng [Lupus]
-11/07
- * Copied skills from Jakk to Christmas Jakk which was missing monster skills [MasterOfMuppets]
- * Added Metaling to mob_poring.txt [MasterOfMuppets]
- * Updated Mimic Card & Mystcase Card bonuses & Raggler Card [Combo bonus = OVB Drop] chances: [Lupus]
- according to kRO formula (found by real tests): chance = 1 * (killed_mob_level/10) + 1
- PS I've killed tons of mobs and tested these cards [Lupus]
-11/06
- * Fixed Marse and Rocker cards missing effects [MasterOfMuppets]
- * Updated item_db2.txt (new format), thanks to Justin84 [Lupus]
-11/05
- * Changed some item names for preparing the sign quest [MasterOfMuppets]
- * Reverted Doppelganger's aspd value to 10, it is the correct value [MasterOfMuppets]
- do not change it again.
- * Updated alot of weapons, thanks to reddozen and vicious_pucca [MasterOfMuppets]
-11/04
- * Added the enchant effect to Cursed water [MasterOfMuppets]
- - Changed fake angels droprate of cursed water to 3% and added cursed water to
- drop from violys at 10%
- * Added Angel wing to old blue boxes and old violet boxes [MasterOfMuppets]
-11/03
- * Added slots to Garm's claw, hard covered book and wool cap, thanks to Gyunwoo23
- - Made shoes unequipable for novices and a small update for the skill DB.
- * Added Venom Knife requirement to the skill Venom Knife. Still won't check
- for a Venom Knife to be equipped as arrow, but it will consume it at least.
- [Skotlex]
- * Made Ki Translation usable on party-mates only (inf2&1024) [Skotlex]
- * Added empty bottles to the Elemental-resist potions recipes, thanks to reddozen [MasterOfMuppets]
-10/31
- * More updates to new quest skills. [DracoRPG]
- * Added Elemental-resist Potions recipe, thanks to RockManEXE. [DracoRPG]
- * Added Embryo recipe, updated Homonculus skill tree. [DracoRPG]
- * Many updates about new quest skills. [DracoRPG]
- * Added missing ()s to Sage's Diary script. [DracoRPG]
-10/30
- * Updated Venom Knife price -> 50z [Lupus]
- * Updated const.txt to reflect changes in source, thanks to Silent. [DracoRPG]
-10/29
- * Added 2nd jobs quest skills to skill_tree. [DracoRPG]
- * Updated current food recipes and added more of them, at the moment
- we'll keep all of them as itemlv 11. [DracoRPG]
-10/28
- * Changed pole axe's dex bonus to 1, thanks to Maxsia for pointing it out [MasterOfMuppets]
- * Added apple drop to Ancient mimic to prevent steal exploiting, thanks to Irmin [MasterOfMuppets]
- * Added a few missing loot sell prices [MasterOfMuppets]
- * Thanx to Justin84, added misssing names of 2 skills in skill_tree.txt (HW_GANBANTEIN,HW_GRAVITATION) [Lupus]
-10/27
- * Fixed the ammount of guild exp beeing given by Tribal Solidarity, credits goes to irmin [MasterOfMuppets]
- * Fixed Glittering Clothes' script. [Skotlex]
-10/24
- * Added cursed water to be dropped by fake angel [MasterOfMuppets]
- * Reverted the inf 32 mode for Heaven's Drive and Arrow Shower [Skotlex]
- * Added Thanatos/Abyss MOb skills and changed some thanatos/abyss mob stats.
- Thanks to Vicious_Pucca, Poki#3 and erKURITA. [Nexon]
- * Added inf 32 (can target traps) to Arrow Shower and Heaven's Drive. I
- hope it doesn't messes up the client... but this is how it should be since
- those skills CAN hit traps [Skotlex]
- * Fixed Poison Toad Card - Now equips on Accessory [Kayla]
- * Changed Investigate's range to 2. [Skotlex]
- * Added GrimTooth to skill_cast_db, time2 is the duration of the stop
- effect. [Skotlex]
-10/23
- * Fixed the Weapon coma rate script of Lord of Death Card [Skotlex]
- * Fixed type in Moonlight Dagger script. [Skotlex]
- * Updated Mini Furnace to be produce 21 since that's the new index for
- rough material refinements. [Skotlex]
- * Changed Moonlight dagger to be steal 3 sp per hit, not 3% [Skotlex]
- * Added healing effect to mixed foods, added produce effect to cooking sets [DracoRPG]
- * Updated Poring V's mode, thanks to Vicious Pucca. [Skotlex]
- * Updated castle_db.txt for correct work on /guildbreak [Lupus]
-10/22
- * Changed Extremity Fist and Investigate's range to 3. [Skotlex]
- * Bumped Magaleta's heal levels to 9 and 10. [Skotlex]
-10/19
- * Corrected a bunch of spells that should be "no overlap" in skill_unit_db.
- [Skotlex]
- * Added Arrow Vulcan to skill_castnodex.txt to specify you shouldn't be
- able to walk during the skill's delay. [Skotlex]
- * Gave normal Magaleta a stronger heal (Lv1 is kinda sad...), also made her
- cast heal 10 on nearby friends when their HP drops below 60% [Skotlex]
- * Double bug fix: 4303,Whisper_Boss_Card [Lupus]
- - Fixed wrong Poki's card desc.. and found.. that we weren't adding 3% MaxHP... but +3
- * Added new item. Thanks to Landarma. And Fixed an old item stat. [Nexon]
- * Added a few more loot sell prices to the einbroch items [MasterOfMuppets]
- * Corrected NPC_STOP, it should have at least range 1 (currently range 8
- for lack of better info) and inf should be 1 (attack skill) not 4
- (used on self). Also changed it's time to 10secs as 2sec is really too
- low. [Skotlex]
- * Fixed constants for Karma and Manner in db/const.txt, thanks to orn. [Skotlex]
-10/18
- * More translations for japanese comments, again thanks to sighel. [MasterOfMuppets]
- * Updated Thanatos' mode to include boss-type (Thanatos and several of the
- mobs in the same dungeon are supposed to be looters? That's what I read
- from here). [Skotlex]
- * Changed DEF of Guard to 3, according to Komurka and andz report
- [Foruken]
-
-10/17
- * Re-fixed Gravition's range to 8. [Skotlex]
- * Some mob skill updates regarding the advanced classes in Lighthalzen. [Skotlex]
- - Removed Sanctuary from Magaleta, removed advanced skills from mobs.
- - Raised Frost Diver's rate for Katrinn, reduced rate of Sight Trasher.
- * Updated the item_db to use BaseClass comparisons rather than those
- callfunc("is class") functions. [Skotlex]
- * Updated some items so that Atk and Matk potions specify their duration in
- ms rather than seconds (standarizes with all other sc_start items) [Skotlex]
- * Added translations for japanese comments, thanks to sighel. [MasterOfMuppets]
- The following files had translations added:
- - abra_db.txt
- - attr_fix.txt
- - exp_guild.txt
- - skill_cast_db.txt
- - skill_db.txt
-10/16
- * Updated some stats of Lady Tanee, thanks to gyunwoo23 [MasterOfMuppets]
-10/15
- * Fixed 2 mobs having wrong stats. [Nexon]
-10/14
- * Some changes to Katrinn's mobskills as pointed out by Viccious and
- Lonyaph, also changed her mode to aggressive + assist. [Skotlex]
- * Updated Gravitation's range to 8. [Skotlex]
- * Corrected mob skill name for Lighthalzen bosses (do not call
- NPC_CALLSLAVE 'NPC_SUMMONSLAVE' they are different things) [Skotlex]
- * Changed Envenom's element to poison... [Skotlex]
- * Updated Envenom: Range 3, number of hits 1. [Skotlex]
-10/13
- * Updated the monster skills of the lighthalzen dungeon bosses [MasterOfMuppets]
- * Updated monsters drops [Lupus]
- -Evil Snake Lord <- Hellfire,
- -Inc.Samurai <- Azoth,
- - Garm <- MVP drop% fix
- * Lowered ancient mimic's droprate of bloody branch to 0.01% to prevent exploits [MasterOfMuppets]
- - Fixed Elder's drops a bit
- * Updated Call Partner's time to 20 secs (after which time the partner is
- recalled), also set the skill's unit target to 'noone'. [Skotlex]
- * Fixed Lude card casting endure on enemies instead of self [MasterOfMuppets]
-10/12
- * Updated defense, mode, element, speed and attack speed of some Lighthalzen mobs,
- per info provided ny Viccious. [Skotlex]
- * Updated a bit the Lighthalzen mob stats using data provided by Viccious
- Pucca [Skotlex]
- * Updated item_db: Added books to equipable weapons of Star Gladiator,
- added Staffs as equipables for Soul Linker, and added to SG the armor they
- can wear (boots, manteau, spiky headband and Goat helm, I think). Also made
- the Vesper Core accesories equippable only by advanced classes. [Skotlex]
- * Added Reverse Orcish to skill_cast_db.txt, upkeep time is the orc curse
- duration. Set to 20 mins for now. [Skotlex]
- * Fixed typo AllStat -> Allstats, thanx 2L0wFlea_sq [Lupus]
- * Fixed: LunarBow[1]->[2], Coif Req/Jobs, Cinquedia Req/Equip Lvl thanx 2 persian69 [Lupus]
- * Corrected g_katrinn and g_shecil's element. [Skotlex]
-10/11
- * Fixed Zherlthsh + Injustice Combo bonus (was giving that bonus 2 times... +1 more bug V_V ) [Lupus]
- - Checked all combo cards bonuses: There's no similiar bug! ^_-
- * Updated Ancient Mummy card effect, thanks to irmin for info [Lupus]
- * Changed Envenom's range to 2. [Skotlex]
- * Fixed Awakening Potion's usable jobs, I think. [Skotlex]
- * Updated the whole item_db to allow TaekWon, Star Gladiator and Soul
- Linker to use items. [Skotlex]
- - Weapons were not touched.
- - The following job_codes were updated to include all 3 new classes:
- - All Jobs but Novice (2088958 -> 119529470)
- - All Jobs but novice+acolyte class (2055918 -> 119496430)
- - All Jobs (10477567 -> 127918079)
- - All Jobs but acolyte class (10444527 -> 127885039)
- - Also added them to awakening potion's job listing.
- - Lupus's previous updated had to be reverted so this replacement worked :P
- - Someone tell me which weapons these classes could use so I can update that too?
- * Fixed some item classes restrictions, fixed Concentration Potion, Awakening Potion, thanks to andz [Lupus]
- - there's one prob left: Cap and Cap_ headgears
- * Added new items [Landarma]
-10/10
- * Enabled Poring V and commented out Fire Poring in the mob db. [Skotlex]
- * Added Poring V to the mob db, altough it is currently commented as it
- collides with Fire Poring's ID. [Skotlex]
- * Corrected ArchAngeling card (needing 78 instead of 77 luk), Maya Card
- (magic damage return 30->50%) and Grand Cross (HP Drain -> SP Drain)
- [Skotlex]
- * Changed Mirror Shield's mdef to 5. [Skotlex]
- * Changed GrandCross's duration to 900ms (changes nothing as the three hits
- still happen at 0, 400 and 800ms) [Skotlex]
-10/09
- * Fixed a few mob skills and mob stats. Thanks to MasterOfMuppets. [Nexon]
- * Fixed a few items having wrong stats. Thanks to Maud Dib. [Nexon]
-10/08
- * Added missing ; at Bunny Slippers in item_db.txt. [Mass Zero]
- * Made a small change to Item_db. [Nexon]
- * Added Magic Scrolls drops, updated walkspeed of Kaho thanks to MasterOfMuppets [Lupus]
-10/07
- * Fixed a small error in Rawrel's stats. [Nexon]
- * Added a small change to Whikebain's drops. [Nexon]
- * Updated Mob drops and Lighthalzen exp gain. Thanks to MasterOfMuppets and Viccious_Pucca [Nexon]
- * Updated Item sell/buy price. [Nexon]
- * Added a new skill to a mob. [Nexon]
-10/06
- * Updated the HP level of the normal second class mobs (as per info
- provided through Viccious Pucca) [Skotlex]
- * Added "The Sign" to item_trade.txt (as per info provided through
- Viccious), also made it add +5% atk. [Skotlex]
- * Corrected the item_trade.txt restrictions for Novice Potion (why you
- couldn't place it in your cart, or sell it? o.O) [Skotlex]
- * Corrected G_Magaleta's elemental mode. [Skotlex]
- * Corrected Envenom's max skill level (7->10), and changed the attribute to
- poison. [Skotlex]
- * Corrected Bloody Butterfly card so it doesn't makes spells
- uninterruptable in WoE. [Skotlex]
- * Added skill data for various skills (second class quest skills and
- several Tae-Kwon related jobs. All the info was acquired by Draco from
- jA's information. [Skotlex]
- * Made Spiral Pierce non-interruptable. [Skotlex]
- * Implemented 4198,Maya_Purple_Card effect. Thanks to jA team! [Lupus]
- - There's a special Intravision timer also. So that "Box to see hidden mobs" could be implemented now
-10/05
- * Updated new items from kRO. Thanks to Landarma. [Nexon]
- * Fixed 2 Mobs, thanks to MasterOfMuppets [Nexon]
- * Added back Grandcross's 20% HP cost. [Skotlex]
- * Updated Grandcross's Casting time, and Blast Mine's duration. [Skotlex]
- * Updated meltdown's cast time to 0.5 at lv1, 1.0 secs at lv 10. Still
- unconfirmed, but it's much more likely than the alleged 0.05~0.10secs.
- [Skotlex]
- * Updated #2415,Bunny_Slippers. Thanx to noobs [Lupus]
-10/04
- * Fixed some items with wrong weight/ stats. Thanks to mrmagoo [Nexon]
- * Changed Savage Babe Card and Savage Babe to Savage Bebe Card and Savage Bebe. [Nexon]
- * Removed the flags from Spider Web, now it can be stacked and placed
- underneath characters. [Skotlex]
-10/03
- * Updated Thanatos/Abyss monster info. Still in need of stats. [Nexon]
- * Updated the skill info on NPC_DARKCROSS [Skotlex]
- * Updated Lighthalzen mobs and mob skills as per Master of Muppets provided
- info. [Skotlex]
- * Updated Ygnizem's slaves to be the other 5 first classes. [Skotlex]
-10/02
- * PVP drop item - 7420 Skull... costs 0z. Replaced exploitable bone drop with skull drop [Lupus]
- * Fixed effect of #5092,Coif (aka Blue Coif) (removed +100 SP) and set its sell price (it's sold in Pront.church) [Lupus]
-10/01
- * Fixed Effect of #2614,Eye of Dullahan (100% Poison Protection) according to some FAQ and tests [Lupus]
- - Don't add it into the item desc (that should remain as '....')
- * Added Orc Baby to Orcs in mob_race2_db [DracoRPG]
-09/30
- * Changed Acid Terror's bleed time to 120 secs (seems to be the official
- value) [Skotlex]
- * Updated Meteor Assaults upkeep time2. Lv1 is the duration of blind, Lv2
- is the duration of stun, and Lv3 is the duration of bleeding. However, the
- true duration for these stats is as of yet unknown. [Skotlex]
-09/27
- * Changed lord of vermillion times to make it hit four times at times 0,
- 1250ms, 2500ms and 3750ms. [Skotlex]
- * Fixed Thanatos Mobs. Thanks to andz [Nexon]
- * Added missing bonus +5 Int to Excalibur [Lupus]
- * Fixed drop rate of Emperium: [Lupus]
- Pharaoh 5.5% (there was a typo), Abyss Knight 0.3%, Zherlthsh 0.15%, Gryphon 0.25%
-09/26
- * Restored sell prices of Feather&Sticky Webfoot, thx to Dr.Evil for note [Lupus]
- * Updated some Lighthalzen mobs drops and skills, thanks to MasterOfMuppets
- * Updated Einbroch mobs drops, thanks to MasterOfMuppets
- * Fixed Tengu Drops (removed 2nd Mr.Smile) [Lupus]
-09/23
- * Updated Lighthalzen mobs.[Nexon]
- - Some still need to be implemented.
- * Updated const.txt with new emotes.[Nexon]
- - Skotlex told me to.
-09/22
- * Updated the item_db file, now the sell column is used. Those items that
- had buy price 20 and sell price blank now have buy price blanka nd sell
- price sell. Likewise, all etc items got their buy price removed and placed
- in the sell price column (price halved, obviously) [Skotlex]
- - I recommend following this new recommendation unless someone comes up
- with a better idea (well someone had to use the sell column eventually :P)
- * Corrected 1562#Textbook on Battlefield: Chance of Bless = 1% [Lupus]
- - Fixed Banana Hat: Now 3% chance of Provoke lvl3
- - Bow Thimble doesn't work as it should (core issue, to be revised soon)
- * Added 2 new items (thanks to Landarma) [Lupus]
- * According to Einbroch updates, changed Emperium drops: [Lupus]
- (Mob name, Mob Lvl, Chance%) '-' = Removed drop, '+' = added drop
- Angelring, 20 0.4 Baphomet, 81 5% Ghostring, 18 0.3%
- Orc Zombie, 24 0.01 Requiem, 35 0.01 Shining Plant, 1 0.01
- + Abyss Knight, 79 3% + Gryphon, 72 2% + Maya, 81 4%
- + Orc Lord, 74 2.5% + Osiris, 78, 3% + Pharaoh, 93, 5.5%
- + Zherlthsh. 63, 1%
- - Golden Thief Bug - Mimic - Werewolf
- * Fixed drops of Abyss Knight (2 kinds of Broad Swords) [Lupus]
- * Added some notes to Lighthalzen Monsters. Should be revised, thanks to persian69 for the info [Lupus]
-09/21
- * Fixed a few cards having wrong setting. Doppelganger, Mobster, Zherlthsh Cards and others all work correctly now.[Nexon]
- * Fixed weapons not having correct attributes and status boosters.[Nexon]
- * Added a few new items, thanks to Landarma.[Nexon]
- * Added Mr.Smile to 1405#Tengu drops. Also!!! Removed Mr.Smile Quest! [Lupus]
- * Added Assassin Mask into Inc.Samurai drops (0.4%) [Lupus]
-09/19
- * Thanks to MasterOfMuppets: Fixed drop rate of minerals [Lupus]
- - Fixed some Niflheim mobs range and speed, re-fixed Increase Soil walk speed, Kind of Beetle mode.
- * Thanx to mrmagoo: item #1356, fixed weight. #5126 delayrate change applies to Advanced Classes only [Lupus]
- - It could be also interpreted as "For Advanced Classes Magic Scills". But then we'd have to add a special flag....
- * Removed Whisper Card drop from Giant Whisper. Only mini-bosses could carry 2 cards. Now Giant Whisper has its own card [Lupus]
- - Why Giant Whisper's size - SMALL ? Any info?
- * Thx2MasterOfMuppets: Fixed some items prices [Lupus]
- - Sorry, Skotlex, we can't merge OpenOffice Sheets, let's switch them in some TXT format for SVN merging [Lupus]
-09/18
- * produce_db.txt corrected Halberd / Damascus ingredients [Lupus]
- according to 13th Sept kRO desc, thanks to andz
- * Corrected range of Hunter's Detect skill
- * Removed Apple-Plugs (512,0%) drops from the monsters [Lupus]
- * Updated Leaf Cat's walkspeed (now faster, thx2 MasterOfMuppets) [Lupus]
-09/16
- * Corrected the duration of the resist potions. [Skotlex]
- * Added constants to const.txt to identify Elements and Race. [Skotlex]
- ^^^^ they are pretty fine [Lupus]
- * Added effects for Resist Element items. Temporal duration: 3 mins. [Skotlex]
-09/15
- * Removed inf2 128 (trap) from Quagmire, Sphere Mine and Demonstration as
- they are not really traps (all ground based skills with trap mode can be
- targetted) [Skotlex]
- * Updated WE_BABY to cost 10% of Baby's max SP (thanks again to Viccious
- Pucca). [Skotlex]
- * Updated Venom Knife's stats, has the stats of an arrow now and is
- equippable only by Assassin. It probably won't work right yet as
- eA will demand the sin to use a bow. [Skotlex]
- * Corrected the base exp requirement for level 99 advanced classes (it's
- supposed to be 343210000 exp), thanks to Viccious Pucca. [Skotlex]
- * Changed uptime2 of dance/song skills, these are now used to determine how
- long the effect lasts after you've walked out of the skill's area of
- effect, so they were all set to 20 secs. [Skotlex]
- * Updated 1617,Wand_of_Survival and 1619,Wand_of_Survival__ to give 2 instead of 3 (to DEX and INT) [Lupus]
-09/13
- * Updated mobs stats (mostly Einbroch) thanks to MasterOfMuppets,Viccious Pucca [Lupus]
- * Multiplied all drain rates x10 (100% leech rate is now 1000) [Skotlex]
- * Immaterial sword now drains 30% of target's sp on a 0.1% rate (info from
- Viccious Pucca). [Skotlex]
- * Updated bDrainValue bonuses to be bonus2/bonus3 (they don't take a "rate"
- parameter anymore) [Skotlex]
- * Multiplied all autospell rates x10 (100% casting rate is now 1000) [Skotlex]
- * Weapons that had autospell rates of 25% have been reduced to 9% (seems to
- be that way from the data gathered by Viccious) [Skotlex]
- * Added Range of Devotion/Sacrifice to skill_db, likewise, added the
- effect's duration to skill_cast_db [Skotlex]
- * Added new monsters with poring stats, thanks to Freya [Lupus]
- * Added skill_unit flag 0x80 (UF_DUALMODE) for skills that trigger both
- interval effects and onout/onplace events (by default, if a skill has a
- interval such as Apple of Idun, then the routines when you step in/out of
- the skill cells won't be called). Applied flag to Apple of Idun and
- Gravitation. [Skotlex]
- * Changed Basilica's interval to -1. [Skotlex]
- * Added new items, thanks to Landarma [Lupus]
-09/12
- * Corrected job_db1 hp-factor for Advanced Classes. [Skotlex]
- * Updated drops of Myst,Bloody Butterfly,Disguise,Goblin Leader (All thanks to MasterOfMuppets) [Lupus]
- - Updated items prices
- - Lighthalzen monsters call up to 5 slaves now, added their drops with temp rates (thanks to Azazel)
-09/11
- * Fixed target of NPC_KEEPING skills. [Skotlex]
- * Changed Wand of Hermod's target to ally (party+guildmates) [Skotlex]
- * Added/Updated some items sell prices (All thanks to MasterOfMuppets) [Lupus]
- - Added missing slot to Coif_(ex Nuns Hat). Dark Lord now has it as a MVP drop 10%
- - 1072#KAHO drops burning hearts instead of stone hearts
- - Added common weapons of Bard/Dancer into OBB/OVVB
- * Added temp mob skills to all Lighthalzen mobs by Azazel [Lupus]
- * Increased movement speed of 1516,INCREASE_SOIL (checked it on the official servers) [MasterOfMuppets]
- * Drooping Cat now can be upgradeable (proved by some official servers) [Lupus]
- * Temporary made Lighthalzen (Juperos) mobs aggressive to prevent abuse. Till we get their real stats/skills [Lupus]
- * Fixed some monsters names to Aegis compatible format (should be useful for some spawn/ mobs skills convertors) [Lupus]
-09/10
- * 2647,Nile_Rose now gives only +10 MaxHP (each event item loses its bonuses after awhile) [Lupus]
- * Added missing official prices to Louyang (mostly) items. Thanks to MasterOfMuppets [Lupus]
-09/09
- * Added some of the missing mob skills that Komurka claims don't work on eA
- yet. These will be tested and debugged at a later date. [Skotlex]
- * Small fix to the self-destruction skill of Marine Sphere as pointed out
- by Komurka [Skotlex]
- * Fixed the alchemist related skills for marine sphere from rate 10% to
- rate 100% [Skotlex]
-09/08
- * Fixed some songs/dances's target (changed it from "all " to "all") [Skotlex]
- * Readded the mob skills NPC_RANDOMMOVE and NPC_SELFDESTRUCTION to the
- Marine Sphere (which were lost on Komurka's last update to mob_skill_db)
- [Skotlex]
- * Since the Lighthalzen mobs don't have accurate stats, but accurate
- HP/Atk/Exp, their stats have been bumped to 75 all (and luk 99) to avoid
- abusers until their correct stats can be figured out. [Skotlex]
- * Updated/corrected the header information of skill_db.txt
- * Reverted LoV and Storm Gust's range to 6 and 5 respectively as
- empirically tested by Ishizu [Skotlex]
-09/07
- * Added new flags to ground units: UF_NOPC, UF_NOMOB, adjusted accordingly
- on song/dances that affect everyone except mobs. [Skotlex]
-09/06
- * Changed in the skill_tree the mysterious value 4 that somehow slipped in
- as a skillrequirement for WE_CALLBABY. [Skotlex]
- * Changed Magic Crasher and Pressure's nk to 0 [Skotlex]
- NOTE: nk=2 is for splash damage skills and 1 for "no damage" skills. This
- info is never sent to the client, so there's no reason we should deviate
- from that convention.
- * Added effects to new items: [Lupus]
- - #12107,Wrapped Mask: You get 1 random mask (Mr.Smile,Mr.Scream,Phantom Opera Mask,all set of Expressionless,Surprised,etc masks)
- - #12106,Jewel Case: You get 1 random accessory (Ring,Clip,etc. Rogue's Treasure, Bow Timble, Fashion Hipsack. Excluding some overpowered and quests accessories)
- - TEMP PLUG: #12111 Warpped Food: (You get 1 meat, 1 raw fish, 1 fruit)
- * Added new items, thanks to Landarma [Lupus]
-09/04
- * Changed B.Something Sacramenti's range from 1 to 9. [Skotlex]
- (9 is what I have in the descriptions, and it can't be more wrong than 1
- anyway)
- * Added missing +60 SP bonus to the Quve+Lude Card Combo [Lupus]
- * Changed Rich Man Kim's target from party to enemy. [Skotlex]
- (it is now a SC that inflicts the mob, and when it dies applies on the
- exp it gives)
-09/02
- * Changed Firewall's knockback to 1. [Skotlex]
-09/01
- * Fixed Taekwon's Fighting Chant max level, thanks to [DracoRPG]
- * Added specific status changes for cooked foods' stats bonuses [DracoRPG]
-08/31
- * Reverted traps to target "enemy", hardcoded to become "all" on gvg
- grounds. [Skotlex]
- * Changed all traps to have target "all" (data from Viccious Pucca) [Skotlex]
- * Updated SP costs and durations of Assumptio (thanks to Viccious Pucca)
- [Skotlex]
- * Updated range of Lord of Vermillion (changed to 5->11x11) and Storm Gust
- (changed to 4->9x9) [Skotlex]
-08/30
- * Added item groups for Taming Items, Quivers and Scrolls [Skotlex]
- * Implemented Taming_Item_Giftset, Bundle_of_Spells, First_Aid_Box [Skotlex]
- * 'Fixed' Cramp Card. Gives +10z per mob level on a 3% success chance. [Skotlex]
- * Added Violin[4] #1902 into OVB, into Violy Drops (0.1%). Probably some of new drops
- have chance more than 0.01%, too [Lupus]
- * Fixed some items names spelling. Thx2Erpirata [Lupus]
- * Added new items thx 2Landarma. I've made Venom Knife as a ETC item atm. [Lupus]
-08/28
- * Added job bonuses for Taekwon, thanks to RockmanEXE [DracoRPG]
- * Changed appearance of some DBs, now they have more friendly (and ENGLISH) headers, this
- was initiated by Vedurin whose redesigned and updated skill_cast_db, produce_db and
- create_arrow_db are also included in this change, thanks to him ^^ [DracoRPG]
- * Changed Acid Demonstration's element from fire to neutral. [Skotlex]
-08/27
- * Cleaned up the item_db.txt file, moved item comments to this file [Skotlex]
- * Updated const.txt with correct Taekwon-class job IDs [DracoRPG]
-08/25
- * Updated slots in Sage's diary to 2. [Skotlex]
- * Updated Mobs drops: Dancing Dragon, Civil Servant, Tao Gunka, Kraben by
- MasterOfMuppets [Lupus]
- * Changed Acid Demonstration from a "weapon" type skill to "misc". [Skotlex]
- * Updated Demonstration to not stack and not be placeable near enemies. [Skotlex]
- * Updated max number of spider webs to 3. [Skotlex]
- * Updated Full Strip's casting time to 0. [Skotlex]
-08/24
- * Updated Shield Chain's cool-down to 1 sec. [Skotlex]
- * Updated summon spirit sphere's casting time to 1sec (all over the place
- it says Zen's casting is twice SSS, and everywhere we also read that Zen's
- cast is 2 secs, so add both together...) [Skotlex]
-08/23
- * Fixed Sacrificial Ritual requiring Endure LV5 instead of LV1 [Skotlex]
- * Updated the mob skill database. When specifying Metamorphosis/Transformation,
- use the skilllv to indicate how many alternatives there are (for example, an
- ant egg would use metamorphosis level 3 as it can convert to Andre, Deniro or
- Pierre) [Skotlex]
- * Set the permilliage (use rate) of Metamorphosis to 50 (0.5%) on all mobs
- that had it specified at 0.
- * Updated the skill delay from Breaker (thanks to Vicious Pucca) [Skotlex]
- * Lowered Elder Willow's trunk drop rate from 35% to 3.5% [Skotlex]
- * Changed Ghoul's race from 11 (unknown?) to 1 (undead). [Skotlex]
- * Updated Deviling's mode to make him count as a boss/miniboss. [Skotlex]
- * Corrected Spring Rabbit card improving candy-type item healing rates [Skotlex]
- (should be meat type since that's what it makes mobs drop)
- * Updated buy/sell prices of some Louyang Drops (thanks to Ishizu) [Skotlex]
-08/22
- * Reverted magnum break... it is supposed to be fire element :/ [Skotlex]
- * Updated casting times and delays of Soul Strike & Napalm Beat, range of
- Ruwach/Sight (thanks to Vicious Pucca) [Skotlex]
- * Updated Magnum Break's element (takes weapon), the fire part is hardcoded. [Skotlex]
- * Removed the temp plug from Cramp Card as it seems it's way too powerful [DracoRPG]
- * Updated skill_tree,job_db1 and job_db2 for new system and Taekwon support [DracoRPG]
- * Moved MVPs from mob_branch.txt to mob_boss.txt (those that had yet to be
- moved, that is) [Skotlex]
- * Added target flag "ally" to skill_unit_db [Skotlex]
- * Added 0.5 sec delay to Aid Potion, 1 sec casting time & delay to Aid Condensed Potion
- (from kRO website, thanks to reddozen and vicious_pucca) [DracoRPG]
- * Removed UF_NOFOOTSET from Ice Wall (I have several sources for that) [DracoRPG]
- * Removed slot from nile_rose (All stats +5, event version), added slot to nile_rose_
- (MaxHP +10, permanent version) [DracoRPG]
- * Added complete (except TK_MISSION) Taekwon skill tree & skill DBs entries [DracoRPG]
-08/19
- * Fixed Double Attack's pl not being -1 (take weapon's element) [Skotlex]
-08/18
- * Changed sell price of unknown test tube to 0 as it can be abused for a
- zeny exploit (thanks to Kayla for pointing it out) [Skotlex]
- * Changes to Immaterial Sword (drain 1SP, not 1%SP per attack)
- * Fixed Battleground Textbook, Greatest General Card to cast on yourself
- (again) [Skotlex]
- * Changed Emperium to Holy 1 / Angel [DracoRPG]
- * Changed (again!) Gloria Domini to 'misc' [DracoRPG]
- * Changed pl of all 'weapon' attack skills that take weapon's element from '0' to '-1',
- according to the new system. Also changed type of various skills. [DracoRPG]
- * Bah, refixed Owl Duke Card/Enchanted Peach Tree. [Skotlex]
- The last value of bonus4 bAutoSpell defines target (0 = self, 1 = enemy)
- * Added new items, thanks to Landarma [Lupus
-08/17
- * Changed back Soul Collect/Zen's casting time to 2 sec... [Skotlex]
- * Changed Gloria Domini & Martyr's Reckogning from 'magic' to 'weapon', Battle Chant from
- 'magic' to 'misc' [DracoRPG]
- * Added IDs of Taekwon and its 2nd jobs to const.txt [DracoRPG]
- * Added and fixed effects of some boxes [DracoRPG]
- * Changed Heirozoist Card to have same chance as Azoth (3%), seems better [DracoRPG]
- * Dropped Kobold Archer's Hat drop to 0.01% (it was left to 1% by an accident) [Lupus]
-08/16
- * Reverted Magnum Break to be self-centered... [Skotlex]
- * Corrected Teleport cost (thanks to k3dt) [Skotlex]
- * Updated Heirozoist card to have a 0.1% chance of converting mob class
- instead of 0.01% [Skotlex]
-08/15
- * Changed Magnum break's inf to 1 (normal targetted skill) [Skotlex]
- * Made Kraben agressive and much faster [Skotlex]
- (info from Ishizu)
- * Updated some Ayothaya loot prices [Skotlex]
- (thanks to Ishizu)
- * Corrected the uptime for SA_AUTOSPELL [Skotlex]
- (thanks to HarmonySong)
-08/11
- * Updated refine items for Damascus (thanks to Ishizu) [Skotlex]
- * Updated Zen's (Hyper Spirit Sphere) casting time to 3 secs as per the kro
- skilldesctable.txt file. [Skotlex]
- * Updated Guardians to be BOSS types (their mode was changed to 165 from 133) [Skotlex]
- Report any problems from this (just make sure you have some sort of
- source to rely on).
-08/09
- * Updated Enchanted Peach Tree, Owl Duke and Greatest General
- to have their auto-spell casted on themselves rather than the enemy [Skotlex]
- (I don't have the data at hand, so if any of these should actually cast
- on the enemy, please correct it).
- * Updated Battlefield Textbook to cast Bless on yourself, not the enemy. [Skotlex]
- * Added new mobs, thanks to Death Dealer [Lupus]
- * Added new items, thanx to Landarma [Lupus]
- * Fixed Lunar Bow bonus [Lupus]
- * Added effect to Novice Hood [Lupus]
- * Fixed Freezer Card combo (was doing Weapon Perfection on the enemy) [Skotlex]
-08/05
- * Fixed price of Ghost Doll (from Freya)
- * Reverted Earth Deleter Card to 10SP [Lupus]
- HINT! HINT! HINT!
- How to check false items/cards bonuses reports? Just open latest korean idnum2itemdesctable.txt
- And check numbers in the item desc 8)))
- * Updated Fireball cast times and delay [Skotlex]
- * Updated SP cost of Stone Curae [Skotlex]
-08/04
- * Updated mobs 1006 (Thief Bug Larva), 1393 (G Mummy), 1394 (G Zombie), and
- 1407 (Dokebi) to be Level 1 and have max HP 1, otherwise the new mob db
- loading system will complain about them. [Skotlex]
- * Added new mobs: Green Iguana, Orc Baby, updated and added some items. Thanks to Landarma [Lupus]
- Thanks to Erpirata for pointing me some tiny typos.
-08/02
- * Reduced Soul Burn's after cast to 0 (the 15sec delay for reusing the
- skill is already hardcoded) [Skotlex]
-07/31
- * Updated throw stone's range to 7, delay 100ms [Skotlex]
- * Updated Steel Body to require 50% sp [Skotlex]
-07/29
- * Removed Poison Bottle (item lv256) from produce_db [DracoRPG]
- * Changed NPC_CURSEATTACK and NPC_ENERGYDRAIN to Dark attribute [DracoRPG]
- * Changed mobs with NPC_STOP to cast it on target [DracoRPG]
- * Changed Cart Termination to use "cartboost" state in skill_require_db [DracoRPG]
- * Modified Hip Shaker/Ugly Dance's unit data to make it work every 3 secs [Skotlex]
- * Okay, reduced the Call Partner's uptime from 10 secs to 0. [Skotlex]
- * Changed Soul Collect/Summon Spirit Sphere type from weapon to none. [Skotlex]
-07/28
- * Added baby skills delays, added them into nocastdex.txt [Lupus]
- * Updated the Wedding skills: They cost 10% HP/SP and grand 10% HP/SP of
- their partner's sp. Also the recall partner skill has a casttime of 20secs
- not diminishable by dex. [Skotlex]
- * Massive skills update (from now updated kRO website) [DracoRPG]
- - Blitz Beat : casting time changed to 1.5 sec
- - Falcon Assault : casting time / after-cast delay changed to 1 sec / 3 sec
- - Focused Arrow Strike : after-cast delay changed to 1.5 sec
- - Wind Walker : after-cast delay changed to 2 sec, casting time can be reduced by DEX
- - Meteor Assault : casting time / after-cast delay changed to 0.5 sec / 0.5 sec
- - Gloria Domini : after-cast delay changed to 2~4 sec
- * Fixed "Greatest General Card" now casts the correct skill level [Fredzilla]
-07/26
- * Changed the inf2 of Marionette Control to 512 + 1024 (can't cast on self
- + party only) [Skotlex]
- * Changed the inf2 of Providence/Resistant Souls to 512 (can't cast on self) [Skotlex]
- * Changed the inf2 of Devotion/Sacrifice to 3524 (512 -can't cast on self-
- + 1024+2048 (party/guild only)) [Skotlex]
- * Reverted Palm Strike's cast-time to 0 (the skill's code has been updated
- so it is not needed now) [Skotlex]
- * Fixed skill-tree requirements of Soul Burn and Mind Breaker as described
- by Ishizu. [Skotlex]
- * Fixed drop rates of all god-equipment-quest items from Treasure Boxes, they were 10x
- too high!! (lowered from '80'=0.8% to '8'=0.08%) [DracoRPG]
- * Changed Weapon Repair to targetted with range 2 [DracoRPG]
- * Made real effect of Textbook on Battlefield. Fixed skill ID.[Lupus]
- * New Items. Thanx to Landarma & Erpirata [Lupus]
-07/25
- * New items. Thanx to Landarma [Lupus]
- * Few item names have been fixed. Added drops to Evil Snake Lord, Injustice.
- thanks to MasterOfMuppets [Lupus]
-07/24
- * Changed the endow spell's inf2 to 3072 (party only/guild only) [Skotlex]
-07/20
- * Changed Bow Thimble damage bonus to 3% (trustworthy-looking ragnainfo source) [DracoRPG]
- * Removed job_db2-2 and rewritten + UPDATED job_db2 for the new system [DracoRPG]
-07/18
- * A silly me, Palm Strike's delay before taking effect is 1s, not 1.5 ^^' [Skotlex]
- * Changed Double Attack's list_num (div) to 2. [Skotlex]
- * Added Palm Strike to the "skill_castnodex" file. [Skotlex]
- * Changed Palm Strike's casting time to 1500ms (this value is used as the
- delay between doing the skill and the damage taking effect) [Skotlex]
- * Updated Gospel's uptime2 to 60 secs (that's how long the bonuses should
- affect) [Skotlex]
-07/13
- * Changed Wand of Hermod's skill_unit_setting from 'friend' to 'party' [Skotlex]
- (this should make the skill affect only party (and guild?) mates instead
- of all players in normal maps)
-07/11
- * Reduced Einbroch mobs (RSX,Ungoliatnt) call-slave skill chance from 10000 (100%) to (10%) [Lupus]
- * Added the Loli Ruri card to the magician set [Skotlex]
- * Changed Guild Castles' names to iRO [DracoRPG]
-07/10
- * Fixed Lord of Death mob (added house auger), added correct MVP exp to Tao Gunka,
- RSX 0806, thanks to MasterOfMuppets [Lupus]
- * Reduced drop chance of Galapago, Banana Hat, etc hats (acc. the patch) [Lupus]
- * Due to adding (thanx to Muad_dib) Lighthalzen fields mobs spawn. I had to change
- temp Mole stats to Martin. But Mole has its own hat drop [Lupus]
- * Lighthalzen fields mobs spawn. thanx to Muad_dib
- * Edited skill_castnodex_db [DracoRPG]
- - Enabled DEX-reduced casting time on Blitz Beat, Falcon Assault and Sharp Shooting
- (Lupus told me to do, so blame him, not me :p)
- - Removed the skills that only had a non-DEX-reduced after-cast delay since DEX
- shouldn't reduce after-cast delays anyway (only useful for custom servers who want to
- enable delay_dependon_dex but it's not our matter)
-07/09
- * Fixed SP usage of PALMSTRIKE, SPIRAL PIERCE [Lupus]
- I do always open the latest korean patch and get ACTUAL numbers from there ^^
- * Added delays to Falcon Assault (1 sec for 1lvl,2,3,4,5sec for 5lvl)
- according to desc.
- * Fixed Aura Blade (now requires Magnum Break LV 5) [Lupus]
- * Updated Palm Strike's sp cost and sphere requirement [Skotlex]
- (info provided by ZeroXell)
- * Fixed Apocalypse (guild) mob id. [Skotlex]
- * Awakening Potions now cure 'Sleep' [Skotlex]
-
-07/08
- * Wedding/Adoption skill's inf2 has been changed to 4 (Wedding Skills) [Skotlex]
- (Deja vu? Somehow I did not do it last time I said I did)
- * Added the Adoption skills to the skill_require_db [Skotlex]
- They use basic stats for now and sp cost 1 so you can cast it.
- * Reverted the wedding rings behaviour. [Skotlex]
- * Wedding/Adoption skill's inf2 has been changed to 4 (Wedding Skills) [Skotlex]
- * Added the adoption skills to the tree of all classes [Skotlex]
- (WE_CALLPARENT, WE_BABY to baby classes, WE_CALLBABY to all others)
- * Updated the Wedding Rings to give the adoption parent skill. [Skotlex]
- * Einbroch monsters obtained some new drops, thanx to MasterOfMuppet [Lupus]
- * Added drops: Super Novice Hat[1]->Mole 0.1%, Soldier Felt Hat[1]->Removal 0.1% [Lupus]
- * MasterOfMuppet's fixes. According to kRO's website fixed: [Lupus]
- ayothaya mobs with elemental attributes, race, size, temp speed and temp modes(ie aggressive, loot e.t.c)
- einbroch mobs with elemental attributes, race, size, adjusted atk dmg,def,mdef,exp,jexp
- * Added Lighthalzen monsters (with poring stats) and Homuculuses(as monsters), thanks to Muad Dib of Fusion.
- I've added common stats to Bascojin&Chung_E monsters tough [Lupus]
- * Fixed Bloody Roar item effect, thanks to Landarma [Lupus]
- * Fixed Enchanted Peach Tree (Live Tree) Card to autocast Heal on self [DracoRPG]
- * Added new effect to Winter Cap. thanks to Landarma [Lupus]
-07/07
- * Changed Marionette's inf2 to 1024 (use only on party) [Skotlex]
- * Changed Marionette's inf to 16 (targetted support skill) [Skotlex]
- * Changed Soul-Change's inf2 to 3072 (use on party/guild only) [Skotlex]
- Still not sure what's the proper way to enable it on pvp/gvg grounds, though...
- * Fixed small typo with grandpa_beared thanks to N0_0N3. [massdriller]
-07/06
- * Made Arrow Vulcan be affected by dex, delay unaffected by dex. [Skotlex]
- (from what I read around on the forums, it seems that's how it is)
- * Made Double Strafe, Arrow Shower cast time be affected by dex, and delay
- be unaffected by dex. [Skotlex]
- (hey, these two had 0 cast times already, so it was a waste the way it was)
- * Changed Tao Gunka's mode to 163 (131+32) to make it a boss type mob [Skotlex]
- * Changed Spider Web's inf to 2 so that it becomes ground-targeted [Skotlex]
- * Added Novice Red Potion into item_trade.txt db. (can't be traded, etc) [Lupus]
- * Removed Zealotus Mask drop from Zherlthsh (could be3 made as a quest only. And goes with Player's name prefix) [Lupus]
- * Added missing Horns of Succubus drop (thx 2Lorky), added Angry Teeth drops to Teddy Bear + Hylozoist [Lupus]
- * Few fixes in the new_hats_0625.txt quests [Lupus]
- * Re-Fixed few mobs drops, thanks to MasterOfMuppets [Lupus]
- * Added missing bonusrate = 1 into Bon Gun's petskillattack2 params [Lupus]
-07/04
- * Added Marine Card effect,added minerals drops to various monsters (need for official lvl4 weapon quest!) thanks to MasterOfMuppets [Lupus]
- * Fixed BonGun's pet script. [Skotlex]
- * Fixed Li Me Mang Ryang Not Equipable bug thanks to vicious_pucca [massdriller]
-07/02
- * Added missing ';' in Incubus Card script [DracoRPG]
- * Updated mapflags. Added new hats drops to Kobold Archer, Wootan Fighter, Galapago [Lupus]
- * Added Li Me Mang Ryang Card to OCA and to the drops [Lupus]
- * Updated tons of cards, thanx to Landarma
- Also fixed misplaced IDs od 4269 Incubus and 4268 Injustice cards [Lupus]
- (everywhere, including card album, mobs drops, cards-combo bonus)
-!!!!WARNING!!!! check your servers for those cards. Remove them. They have different placements and could cause exploits!
- * Fixed Succubus+Incubus card-combo bonus exploit. Thx 2DracoRPG [Lupus]
- * Implemented Increase Soil card (compound to Armor) -50% DMG by Guardians [Lupus]
- * Added temp plug to Cramp Card (on a mob kill now it gives you 1 zeny) [Lupus]
- * Added packet_ver 18 by Sara-chan [Lupus]
-
-06/28
- * Added "gld_dun01.gat 5" to water_height.txt as reported by Manipulator [Skotlex]
- * Added Dryad Card effect, thx to MasterOfMuppets [Lupus]
- * Fixed Land Protector's Range to be 7x7,7x7,9x9,9x9,11x11 [Skotlex]
- * Made Lemon consumable (previous equip_jobs was 0), that was not on
- purpose, right? [Skotlex]
- * Added 2-sec aftercast-delay to sonic blows. Too many complains about double
- casting it, and I really don't think it was meant to be doble-castable
- either. [Skotlex]
- * Added effects to new boxes (thanks to Landarma), added these boxes
- as drops to new cards (thanks to MasterOfMuppets), fixed Taoist Card
- placement [Lupus] TODO: revise all the cards
-06/23
- * Corrected 3 of the new headgears in item DB, thanks to Ishizu-chan [celest]
-06/20
- * Fixed some item_db typos [celest]
- * Updated Thunderstorm range to 2 [celest]
-
-06/18
- * Reverted Skotlex's work. [Lupus]
- all 3 Lances differ by their ID (for quests purposes!)
- There are 2 assassin masks: 5054 and 5096. They don't have any slots.
- But they differ by applicable jobs: 5054 for Assassins + Priest Class
- and 5096 is for ANY Thief Class (Thief,Assassin,Roug) + Priest Class
- Plz, if you want, use ITEM_DB2.TXT for made-up items 8)
- -- I can't argue on the assassin mask, and it's good that it was fixed. But
- which quest uses the Lance (1411)? It must be a quest that is not
- currently shipped with eA, because items 1411 and 1412 are NOT used
- anywhere inside the NPC directory, and 1410 is only on some shops. I am
- curious to know which Quest uses the 1411 lance...
- Plus it doesn't seems to make any sense from a client-side view. "You
- need the Lance that Doppel Drops, not another" (even thought they all
- look and work exactly the same for the player x.X) [Skotlex]
- * Changed slot-count for item 1411 (Lance_) from 0 to 1. [Skotlex]
- I am not going to believe 0 is the real number for it considering that:
- 1: You can't get it from any shop. (that id is nowhere in the npc files)
- 2: Only DoppelGanger drops it, with a 5.5% chance.
- * Added some new items (by Landarma), fixed recently added ones. [Lupus]
-06/11
- * Changed Ungoliatnt Assumption skill's target to self from target [Skotlex]
- * Updated skill_cast_db: Soul-Strike's casting time, Stone Curse's upkeep
- time as per the information provided by Midas [Skotlex]
- * Changed Sprinkle's Sand range from 8 to 1 (8??? o.O) [Skotlex]
- * Changed Dark Illusion Card's bonus bDelayrate -> bonus bCastrate [DracoRPG]
- * Added the new headgears and garments [DracoRPG]
-06/09
- * Added inf2=64 to Benedictio. 64 now actually stands for "skill needs
- other nearby support characters", or as the battle_config calls it
- "ensemble skills". [Skotlex]
- * Removed inf2 of Extremity Fist, it is harcoded for now. Inf2 values 4 and
- 8 are free for the taking. What should they be for? Partner/Baby skills? [Skotlex]
- * Added inf2 values: 32 (Dance/Song skills) & 64 (Encore skills).
- (Encore skills don't need to be set as 96) [Skotlex]:
- - Bard Skills set to inf2 32: BA_WHISTLE, BA_ASSASSINCROSS, BA_POEMBRAGI, BA_APPLEIDUN
- - Dancer Skills set to inf2 32: DC_HUMMING, DC_DONTFORGETME,
- DC_SERVICEFORYOU, DC_UGLYDANCE
- - Encore Skills set to inf2 64: BD_LULLABY, BD_RICHMANKIM,
- BD_DRUMBATTLEFIELD, BD_RINGNIBELUL, BD_INTOABYSS, BD_SIEGFRIED
- - If I missed any skill, help me correct it, these inf2 values are not yet
- used in the code, but that'll change soon.
- * Added inf2 value 16 for Guild Skills, set all guild skills to have inf2
- * Readded skills to items Electric Guitar, Firebrand & Ice Falchion [Skotlex]
- * Some corrections to the skill_db.txt's nk value. [Skotlex]
- - Storm Gust: 1->0
- - Blitz-Beat: 1->2
- * Removed magnum break's inf2=16 since it ain't used anywhere. [Skotlex]
- * Fixed Ayothaya monsters drops and names thx 2 MasterOfMuppets [Lupus]
-06/06
- * Corrected Ice Falchion, Firebrand, Electric Guitar [Skotlex]
- These should not give you a skill-tree, only auto-cast the skill.
- Ice Falc also has a 1% chance of freezing yourself.
- * Removed the 20% HP cost of casting GrandCross.
-06/05
- * Changed Grandcross/DarkCross's Interval from 300ms to 400ms [Skotlex]
- This fixes GX doing 4 hits instead of 3.
- * Added tons of new items, thanks to Landarma [DracoRPG]
-06/03
- * Fixed 'Keeping' in the mob skill DB to be cast on self [celest]
-06/01
- * Optimized a lot of new cards scripts [DracoRPG]
- * Changed Deviling to receive 50% more damage from ALL elements but neutral, and not only Fire/Earth/Water/Wind [DracoRPG]
- * Changed doppelganger card aspd bonus to 10% as it should be. [massdriller]
- * Changed DoppelGanger card's attack speed increase to 30%. [Skotlex]
- This card current does not stacks. If anyone knows of a valid source that
- says otherwise, open a bug-report so it can be corrected.
-05/29
- * Moved the card-status listing from item_db.txt to this file [Skotlex]
- * Added the new column to item_db: refineable to specify which items can be refined. [Skotlex]
- * Fixed Novices able to wear all "Every class except Novice" headgears, thanks to duduc [DracoRPG]
-05/28
- * Added emotion constants to const.txt [Skotlex - R1853]
- The constants mirror their command counter part (ie: /meh -> e_meh),
- for the most part, except for the following:
- e_gasp (/!), e_what (/?), e_cash (/$), e_dots (/...), e_no (/??),
- e_hp (need HP), e_hlp (/hp, help emotion),
- e_scissors (ctrl+-), e_rock (ctrl+=), e_paper (ctrl+\)
- And the following flag-emotions are available:
- e_korea, e_indonesia, e_philippines, e_usa, e_brazil
- The whole point is being able to do in scripts "emotion e_wah;" instead
- of "emotion 16;"
-05/25
- * Fixed Peach Tree card, thanks to Komurka
-05/20
- * Updated mob skill DB, thanks to Komurka
-05/17
- * Corrected typo for sweet potato, thanks to maeki
- * Switched Tirfing and Mystelltain card effects, thanks to starlon [DracoRPG]
-05/15
- * Changed Hylozoist's race to demon, thanks to Dino9021
- * Fixed Gajomart Card, thanks to starlon [DracoRPG]
- * Added missing 'amount input' packet for Sakexe 05-09 [celest]
-05/12
- * Added missing 'close storage' packet for Sakexe 05-09 [celest]
-05/11
- * Updated item_db (all items with use_script "pet" or "itemskill") to use
- the new type of item (11: delay-consumed usables) [Skotlex]
- * Added the new G_ mobs with poring stats, thanks to Komurka
-05/10
- * Changed 2005-05-09Sakexe's packet version to 17 [celest]
- * Fixed Merchant Class Card Combo Set bug (it was always ON) [Lupus]
- * Merchant Class Card Combo Set: added 0.1% Old Purple Box drop [Lupus]
- * Archer Class Card Combo Set: added +5% EXP bonus on killing Brute [Lupus]
- * Holy Class Card Combo Set: added +5% EXP bonus on killing Undead/Demon [Lupus]
-
-05/09
- * Added INT +2 and Unbreakable to Crown of Mistress [DracoRPG]
- * added Sara-chan's 18th packets update [Lupus]
- * Added FULLY updated mobs skills DB by Komurka (up to Aegis Zone 8.5) [Lupus]
- * Fixed drops of Antique Firelock (thanx 2 Freya) [Lupus]
- * Added skills to Beetle King thanks to MasterOfMuppets [Lupus]
- * Started updating monsters skills according to the recent servers
- thanks to MasterOfMuppets [Lupus]
-05/08
- * Fixed Whisper Boss card, thanks to sbilly
- * Updated the packet db (removed some duplicates, corrected some packets),
- thanks to glucose
- * Removed Sword Mastery from Alchemist's skill tree :o [DracoRPG]
-05/06
- * Fixed some genders for some FOOD. Added some new items into item_db. Thanks 2 Landarma [Lupus]
-05/04
- * Added 1% Horse Crest drops to Greatest General, Sohee monsters [Lupus]
- * Added implemented cards into card albums and to mobs drops [Lupus]
- * Set Mimic Card, Mystcase Card bonus to 0.1% (it was 0.01%, they has been increased to 0.1% due recent patch)
- But it isn't 1% for sure
- ? Greatest General Card semms having wrong effect, tough 8) [Lupus]
-05/03
- * Added missing item drop effects for some new cards [celest]
- * Fixed Heater Card and Freezer Card [celest]
-05/02
- * Fixed # of Deviling's slaves [Lupus]
- * Fixed cards that use getrefine [celest]
-05/01
- * Fixed skill tree entry for Potion Synthesis, thanks to shadow
-04/30
- * fixed cards that required bExpAddRace,bSPGainRace,bLoseSPWhenUnequip by MasterOfMuppets [Lupus]
-04/29
- * Re-added Spiral Pierce to Lord knight's skill tree
- * Added missing Shield Chain to the skill tree, thanks to Komurka
- * Fixed Harpy Card and Freezer Card, thanks to Komurka
-04/28
- * Added effect for Dumpling Child and Hermit Plant card
- * Changed Crab card to use 'isequipped' and fixed Rideword card
-04/27
- * Added effect for Solar Sword
-04/26
- * Fixed some items, thanks to Komurka and shadow
- * Applied new advanced skills changes from 4/26 patch [DracoRPG]
- * Reverted Arrow Shower / Double back to 0.1. Sorry! [Lupus]
- * Started implementing missing card effects [Lupus]
- * Added more mobs skills, thanx to MasterOfMuppets [Lupus]
-04/25
- * Fixed Durian and Ramadan, thanks to rollopop
-04/23
- * Fixed Red Scarf name, thanks to Sasuke [DracoRPG]
- * Removed some extra 0's in the item_db, thanks to Zoc
- * Added monsters skills to all Niflheim / Louyang monsters,
- changed Garm slaves to Garm Bebe. Thanx to MasterOfMuppets
- * Fixed Owl Duke Card, now casting IMPOSITIO on the card holder [Lupus]
- * Panacea,Royal Jelly now remove Hallucination Effect. accord.to 10 May patch [Lupus]
- * Hallucination Pills (Pellet) cause Hallucination Effect [Lupus]
-
-04/22
- * Updated effects for Ahura Mazda, Gaia Sword, Freezer Card
- * Added 4 items of THQ -> item_avail.txt [Lupus]
- * Removed the Stun effect ????? on Sweet Potato, fixed Assulter Card script not in correct field [DracoRPG]
- * Minor cards sets fixes [DracoRPG]
- - Reverted some wrong Codemaster's if(callfunc("Is_xx_Class"))) => if(callfunc("Is_xx_Class"))==0) changes
- - Fixed Thief cards set checking for Merchant class instead of Thief class
-04/20
- * Added Thief cards set and fixed other ones, now they should all work [DracoRPG]
- * Added Intravision item bonus [DracoRPG]
- * Adding supported map cell types to const.txt [celest]
- * Added summoned Geographers can heal their masters [celest]
-04/19
- * Corrected skill tree entry for Peco lord knight's Berserk [celest]
-04/17
- * Fixed "Every job except Novice" armors wearable by Novices [DracoRPG]
-04/16
- * Corrected job bonuses for novice, super novice and dancer [celest]
-04/15
- * Removed Raid not allowed in GvG (never seen it anywhere...) [DracoRPG]
- * Added new items, thanx to Landarma [Lupus]
-04/12
- * Added monsters skills and slaves to all Einbrook monsters, thx4info2 Landarma [Lupus]
- * fixed Deviling and Lou-Yang monsters drops, thx2 MasterOfMuppets [Lupus]
- * Added missing summon slaves to Deviling, Tao Gunka (correct # and type) [Lupus]
- * Made Deviling, Tao Gunka aggressive (st - according to most DBs, 2nd - it's MVP)
- * Corrected 1 wrong entry in the create arrow DB, thanks to Komurka
-04/08
- * Corrected wrong entries in the create arrow DB, thanks to Komurka
-04/07
- * Fixed materials for forging Lance : 1 Evil Horn -> 2 [DracoRPG]
- * Fixed Sphinx Hat equip location [DracoRPG]
-04/06
- * Added Einbrook monsters and drops, thanx to Landarma [Lupus]
-04/05
- * Some items fixes [DracoRPG]
- - added missing "Neko Mimi" hat #5099, thanks to Neko2
- - fixed Wedding Rings item types, thank to nimrod
- * Removed Evil Wings drops from Mini Demon,Deviruchi,Archangeling and put it into Deviling [Lupus]
- according to kRO "Evil Wings" are dropped by Deviling only
- Deviling items drop chances aren't correct yet
- * Fixed skill tree entries for Vulcan Arrow, and Throw Arrow for gypsies,
- thanks to Hekate
-04/04
- * Removed required skills for Berserk (only job level 50 is needed) [DracoRPG]
- * Re-added MDEF +15 to Resting Cat [DracoRPG]
- * Added Sunglasses & Glasses into OBB, added slotted Sunglasses & Glasses into OVB [Lupus]
-04/03
- * Doppelganger Card gives only 10% ASPD bonus (from Aegis) [DracoRPG]
-04/02
- * More new cards and fixes [DracoRPG]
- - added Acolyte, Archer and Merchant sets effects
- - added Turtle General Card effect
- - corrected Job_Super_Novice -> Job_SuperNovice for Lude and Quve Cards
- - autospell weapons (except Fireblend, Ice Falchion and Electric Guitar)
- give no more the skill so it can't be used when you want
-04/01
- * New cards updates and additions [DracoRPG]
- - added Mage and Swordman sets effects
- - added Whisper Boss Card (not found the ID -> commented out)
- - activated Turtle General Card but effect not yet scripted
- - updated some effects from 3/17 patch
-03/31
- * Updated/added some new card effects [DracoRPG]
- * Reverted Berzebub card to reduce casting rate
- * Corrected some item effects, thanks to digigp and htm
- * Updated some cards effects from 3/25 patch [DracoRPG]
- * Updated freeze time for Frost Diver and Frost Nova
- * Updated cast time for Preserve, thanks to Neko2
-03/29
- * Some optimizatons, added missing skill to Electric Guitar [Lupus]
- * Added new items (thanx to Landarma) [Lupus]
- * Added effects to Spring Rabbit, Galapago, Sea Otter Cards [Lupus]
- It seems that item heal rate doesn't work yet
-03/27
- * Re-Updated MOB DB with correct file now 8) [Lupus]
- * Added all released cards into monsters drops and OCA [Lupus]
- * Minor Items, Monsters fixes [Lupus]
-03/26
- * Fixed some incorrect create arrow entries, thanks to boredpoo
-
-03/25
- * Added Einbrook's mobs, thanks to RodneyJ for their IDs [Lupus]
- * Removed some extra 0's in the item_db, thanks to Zoc
- * Corrected some item effects according to the mentoned earlier doc [Lupus]
-03/24
- * Corrected exp table entries for level 11 and 99, thanks to Dino9021
- * Corrected some item effects according to the newly found Aegis Zone Server [DracoRPG]
-
-03/22
- * Corrected some typos in the items DB, thanks to Zoc [celest]
- * Added new items. Thanks to Landarma [Lupus]
- * skill CANNIBALIZE: fixed its upkeep time [Lupus]
- * Added Rafflesia into Dead Branch monsters list, removen all MVPs from there [Lupus]
- DBs never supposed to call MVPs!!! Only Sages Hocus Pocus could make
- a MVP from Alchemyst's Floras. (eA Hocus implementation doesn't support it yet)
-03/21
- * Corrected exp table entries for Super Novice, thanks to Dino9021 [celest]
-
-03/19
- * changed all cards to 'getrefine' function [Lupus]
- * used 'cardscnt' instead of 'isequipped' in Crab Card.
- It's a weapon compunding card. So it used to give up to
- 6 bonuses! on Assassin with 4 4-slotted weapons.
- Now it lets you get up to 2x bonuses per hand.
- Should be fixed more. already got idea 8)
- All the similar cards should be fixed in the same way.
- * Fixed missing END; in new cards, some optimizatons [Lupus]
-03/18
- * Updated item prices for Niflheim drops [celest]
- * Updated some Ayothaya mob stats [celest]
- * Fixed Incantation Samurai card reducing HP too quickly - the time should
- be in milliseconds ^^; [celest]
- * Added ~86 new cards. Fixed, optimized [Lupus]
- Thanks to Indiona,Landarma. Gosh, I had to fix some bugz ^_-
-03/16
- * Added new items. Thanks to Landarma [Lupus]
-03/15
- * Fixed pricing for Claw, thanks to Dino9021 [celest]
-03/09
- * Added new items. Thanks to Landarma [Lupus]
-02/23
- * New Cards: Some fixes, revisions, additions [Lupus]
- According to the latest news:
- Fixed Tirfing, Mysteltainn (swapped enemy sizes of the cards bonuses)
- Added bonus: Munak+Bongun+Hyegun Cards -> +1 Allstats
- Added Alice Card placement. (also added it for Spring Rabbit, Galapago, Otter) And put Alice Card into OCA
- can't add new effects for 22 Fed Update Cards yet.
- All the cards by 22Feb have been revised, but not all tested.
-02/21
- * Added new item: Takius' Blindfold. thanks to Landarma [Lupus]
- * Revised New Cards, added missing effects, fixed bugs [Lupus]
- ~20 cards to check left 8) But in 22 Feb some new cards have been announced T__T'
- * Added actual item_db.sql into sql-files. [Lupus]
- * item_db.txt: Added missing fields / removed extra fields from some new items V__V' [Lupus]
- * More monsters name fixes (GIANT_HONET -> GIANT_HORNET , etc) [Lupus]
- * Added actual mob_db.sql into sql-files. If you use SQL Mob DB then update it [Lupus]
-
-02/19
- * Added released cards into the monsters drops. Fixed couple card names [Lupus]
- (Arc Angeling -> Archangeling)
-
-02/18
- * Added more new cards effects (thanks to DracoRPG at this time) [Lupus]
- added missing bonus 'bAllStats' into doc/item_bonus.txt
- * Changed Goblin Leader Card to using bAddRace2 -- each player can only save
- 10 AddDamageClass, so this would save some space for other cards ^^ [celest]
- * Started adding new cards effects. Also big thanks to Landarma [Lupus]
-
-02/17
- * Added 4 columns into mob_db.txt & mob_db2.txt [Lupus]
- If you were using SQL MOB DB, then update your SQL DB and import all data
- from mob_db.txt mob_db2.txt
- * Fixed some mobs drops Whisper + Boss Whissper had wrong drops %% [Lupus]
- and Whisper had 0% Card drop...Also fixed all MVP mobs (MVP bonuses were shifted...
- MVP EXP was missing, etc)
- * Corrected Parrying lasting time, thanks to p14333 and krc2k for pointing it
- out [celest]
-
-02/11
- NOTE: Get rid of old cards on your server!!! IDs: 4149-4332
- before using of this item_db.txt (some cards have changed their IDs)
- and it could cause ALIEN cards in your players equipment 8))
- i.g. a weapon compounding CARDS inserted in armor, etc...
- * item_db.txt Massive update: [Lupus]
- - Added all new missing items (up to st.Valentine's Day Event)
- - Added new cards 4149-4332, sorted them and set their sripts.
- - Fixed some names, typos, weigths and prices
- * Commented out old custom cards from Old_Card_Album.txt till we brush them up [Lupus]
- * Removed old custom cards from MOBs drops [Lupus]
- thanks to Landarma(new items templates) Poki#3(removing cards from drops)
- * Updated Soul Breaker cast and delay time, thanks to matthias [celest]
- * Updated Chain Crush to require level 2 Tiger Fist, thanks to matthias for
- pointing it out [celest]
-
-02/05
- * item_db.txt Added prices to all Magic Scrolls and to Horse Crest,
- added +100-1000 Zeny effect to Gold Coin (it's used in st.Patric event)
- not sure in Zeny amount, tough. [Lupus]
- * mob_db.txt Kind of Beetle -> Beetle King. [Lupus]
-
-01/26
- * Updated Counter dagger's attack, thanks to Poki#3
- * Added ayo_fild02 to nomemo mapflag list
-
-01/13
- * Fixed drops of Taoist Hermit, added drops rates to JOKER (all rates were 0%)
- Removed 0.01% Chances of all Apple drops plugs
- Tided up mob_db/mob_db2, removed extra tail delimiters (,,,,,,) [Lupus]
-01/07
- * Added midas' fix for Hammerfall and Adrenaline Rush [celest]
- * Added 'bDelayrate' and changed Phen card, Marduk Card and Berzebub Card's
- effects to use this instead of bCastrate (which was reducing casting time,
- not delay time) [celest]
-01/05
- * Added DracoRPG's changes [celest]
- - changed Gungnir to wind element
- - changed Damascus to cannot be broken
-01/04
- * item name fix Daydric Card -> Raydric Card [Lupus]
- Changed weight of Durian,Ramadan,Realgar Wine.
- Added effect to Durian fruit
-01/01
- * Included Mages and Wizards to be able to use berserk potions [celest]
- * Changed some create arrow outputs for new kRO 12/21/04 patch [Aria]
-
-12/29
- * Corrected Bloody Axe's weight - 400 > 4000 [celest]
- * Removed Bandit's Beard from item_avail.txt [celest]
-12/28
- * Removed Roguemaster's Bow adding steal chance, thanks Draco [celest]
-
-12/26
- * Added item_db2.txt - would be more convenient to store custom items in a
- separate db [celest]
-
-12/21
- * Added prices to Arrow Quviers ( = 500* arrow price), fixed few item names
- (removed '_' from jNAME column), fixed HP amount in Novices Red Potion [Lupus]
-12/21
- * Added the new Quivers, updated Horse Crest [celest]
-12/20
- * removed extra {},,,,,,, from each tailing [Lupus]
- * Corrected job requirements for some garments [celest]
- * Corrected skill tree requirements for 3 Peco Lord knight skills [celest]
- * Updated item 569 -> it's a Red potion given to novices if they pass the
- training grounds test [celest]
-12/18
- * Lord Knight's Concentration can now be used with any weapon [Aria]
- * Changed few God-items to fit kRO 12/7/04 Patch [Aria]
- - Reverted by Celest (sorry, but it's already updated ^^;)
- * Fixed screwed drops of Kapha (someone removed one number and all data was shifted) [Lupus]
- * Found one missing item N 569, looks like red Potion. Added a temp plug
- fixed typo bolt -> Bolt in one scroll [Lupus]
- BTW I made a TXT Resources merger (it helps merge clients resources itemdesc,etc)
- so if u need it just tell me
-
-12/17 * Added effect for Deadly poison bottle and Ice cream [celest]
-
-12/15 * Updated Steel Body, Thunderstorm, Investigate and Magic Crasher, thanks
- to midas
- * Removed elunium and oridecon from produce_db, thanks to Draco
-
-12/14 * Changed 'Parasite' to non-moving [celest]
-
-12/12 * Removed unuseable skills from skill_tree.txt [celest]
-
-12/11 * Corrected item_db - Wedding rings should give all 3 skills [celest]
-
-12/9 * Removed some unused skills from skill_tree.txt [celest]
-
-12/8 * Capitalised horn_Card in item_db [celest]
-
-12/7 * Fixed some item names (and swpped names of Alarm Mask and Expressionless Mask) [Lupus]
- * Added effect for Bow Thimble, Archer Skeleton Card and Tribal Solidarity [celest]
- * Updated Sleipnir, Brisingamen, Mjolnir, Megingord, Counter Dagger,
- Poison Knife [celest]
- * Updated SP requirements for Full Strip, Full Chemical Protection, Cannibalize [celest]
- * Corrected some item_db typos, thanks to DracoRPG
-
-12/6 * Changed spiritball requirements for Chain Crush to 1, thanks to MaoMao of cAthena
-
-12/5 * Edited skill_nocast_db - the skills should be useable outside GvG maps even
- if woe is on [celest]
-
-12/3 * corrected Spider Web's maximum level [celest]
- * Removed Soul Drain from Professor's skill tree [celest]
- * Updated Stunner's job - Acolytes and monks should be able to use it too! [celest]
-
-12/2 * Updated skill tree prerequisites for the new kRO skills [celest]
-
-12/1 * Updated Poison React, Soul Change, Soul Burn [celest]
-
-11/30 * Corrected bUnbreakable value in const.txt [celest]
- * updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest]
-
-11/29 * Updated skill_db for Quagmire, Fog Wall [celest]
-
-11/28 * Fixed Wedding rings placement 2->136 [Lupus]
- * Fixed mob Amon Ra stats/drops [shadow]
-
-11/27 * Fixed some drain rates, fixed Balmung, Mjolnir, fixed all maces (for right jobs) [shadow]
-
-11/26 * Fixed Abrakadabra (3 Yellow Gemstones -> Yellow Gemstones 2).
- And of course it would still use 1 Yellow even if you have Mistress Card, etc. [Lupus]
- TODO: Abrakadabra should also summon Monsters and even MVP by chance...
- * Lowered max level of Oridecon Research skill from 10 to 5 [Lupus]
-
-11/25 * Added element effects to const.txt. [celest]
- Usage example: sc_start SC_Frost,30000,0;
- to change the weapon element to Water for 30 seconds.
-
-11/23 * Added temporary requirements for the new guild skills [celest]
-
-11/22
- * Changed weapon requirements for Sharp Shooting [celest]
- * fixed job_db2.txt (,, -> ,) [Lupus]
- * Adding 11/23 kRO's new skills [celest]
- * Slim Potions requires empty test tube, not empty potion bottle *fixed* [shadow]
-
-11/21
- * added bClassChange to const.txt and added bClassChange,50; to azoth (.5% chance to transform monster into another.) [Valaris]
- * added mob stats: 1027,Raptice [Lupus]
-
-11/20
- - Added deadly poison bottle to produce_db.txt [celest]
- - Edited ASC_CDP in skill_require_db.txt
- - Edited ASC_EDP in skill_cast_db.txt
-
-11/17
- - Corrected max level for cloaking in skill_tree.txt [celest]
-
-11/16
- - Item 7110 fixed name -> Broken Sword (part of Bongun quest) [Lupus]
-
-11/16
- - Added BaseJob to const.txt [celest]
-
-11/15
- - Minor fix on wedding skills, to use 15% of SP/HP . [shadowlady]
- - ?
-
-11/14
- - Fixed Golden Thief Bug Mode!(+detects hidden) [Lupus]
-
+========================= Items that need fixing/implementing
+
+ 5126 Morpheus's Hood: Magic spells cannot be dispelled!?
+
+ 2653 Sacrifice Ring: NO INFO. Item not implemented....
+ [Vicious] On your death it breaks (BS can fix it), you drop all Equipment (equipped, even the ring).
+ And revive with 1 HP / 1 SP at the place of your death.
+ [Komurka] From where this info is? ... Mine: On your death you'll loose this ring and get 50% HP.
+ [Poki#3] Theres no official desc! <.< Although you might wanna make it a custom item or something...
+ 1475 Cavalry Lance: NEED INFO.
+ 1475 Equestrian's Spear: NEED INFO.
+ 13005 Angelic Wing Dagger: NEED INFO.
+ 1308 Golden Axe: NEED INFO.
+ 13160, 13161 Destroyer: Can break target's armor when fired at close range.
+ -----
+ 4296 Cramp Card: Temp Plug: 10z per mob-level on a 3% chance.
+ 7458 Fortune Horn: It's a custom name ^^;
+ 12017 Speed Decreasing Potion: A potion which decreases the moving speed of a character for a duration.
+ -----
+
+========================
+12/04
+ * Almost official HP values for Ninja/Gunslinger [Playtester]
+ * Updated garments [Playtester]
+12/03
+ * Updated shoes [Playtester]
+12/02
+ * Updated armors [Playtester]
+ * Updated shields [Playtester]
+12/01
+ * Removed some mobs that aren't used anymore [Playtester]
+ * Updated various mob stats thanks to Soukosa [Playtester]
+11/30
+ * Fixed some mob names thanks to Soukosa [Playtester]
+11/29
+ * More drop updates [Playtester]
+ * Updated various drops [Playtester]
+11/28
+ * Fixed Alchemist combo's autospell casting on target instead of self [Playtester]
+11/27
+ * Fixed up healing items [Playtester]
+ * Updated Rachel mob drops [Playtester]
+ * Updated Rachel mob stats [Playtester]
+ * Corrected KiriKage's range so it works correctly when used by non-players
+ or when use weapon's range is used. [Skotlex]
+ * Changed service for you's flags so it affects all players on range.
+ [Skotlex]
+11/26
+ * Updated Rachel Field mob stats and drops [Playtester]
+ * Updated selling price for some common drops [Playtester]
+11/25
+ * Fixed Sphinx Helm, Coif and Orc Hero Helm [Playtester]
+ * Fixed selling price of Fine Grit 10z -> 60z [Playtester]
+11/24
+ * Heaven's drive no longer targets traps. [Skotlex]
+11/23
+ * Fixed sp cost of RG_RAID [Playtester]
+ * Official skills for remaining Thanatos mobs [Playtester]
+ - this completes the X.3 and X.4 mob skill updates
+ - removed various skills from G_mobs
+11/21
+ * All coin related skills can be used with any weapon. Those that require
+ ammo can be used with any ammo. [Skotlex]
+ * Fixed all cast times and delays of Gunslinger skills [Playtester]
+ - cast time of Dust is reduced by dex
+ - Tracking cast time cannot be reduced by anything
+ - Increase Accuracy requires 4 coins instead of 2
+ * Updated healing values of Ketupat and Red Thorn Fruit [Playtester]
+11/20
+ * Official skill for Ancient Mimic, Death Word and Angels [Playtester]
+ - also made NPC_DEFENDER self targeted
+ - Shelter now has angry mode
+ * The max level of NPC_SPLASHATTACK is now 1. [Skotlex]
+ * Flywing and Butterfly Wing will now use the teleport skill [Playtester]
+ * Official skills for Breeze and Plasma [Playtester]
+ * Official X.4 skills thanks to Tharis [Playtester]
+ - also set MVP skills to MVP skill level
+11/19
+ * Official skills for Abyss Lake mobs [Playtester]
+ - G_Acidus, G_Ferus and Green Iguana don't have skills
+ - someone should test if all skills are working
+ - Green Iguana is now a looter
+11/18
+ * Official skills for Bacsojin and Orc Baby [Playtester]
+ - yes Bacsojin's skills are interuptable despite MVP status
+ * Updated X.1 mob stats [Playtester]
+ * Official skills for Detale and Thanatos [Playtester]
+ - pm me if you want to help converting the mob skills
+11/17
+ * Updated remaining X.2 mob stats [Playtester]
+ * Updated Bio Lab and Juperos mob stats [Playtester]
+ * Fixed some sprite mob names [Playtester]
+11/16
+ * Fixed the misleading description of what item_avail does. [Skotlex]
+ * Updated X.3 mob stats [Playtester]
+ * Updated Kiel dungeon mob stats [Playtester]
+ * Changed type of unimplemented cards to "Card" [Playtester]
+11/15
+ * Updated Odin Temple mob stats [Playtester]
+ * Fixed Gonryun mob stats [Playtester]
+ - also fixed Bacsojin and Chung E
+11/13
+ * Changed bAtk to bBaseAtk [Playtester]
+11/10
+ * Fully official GS/NJ Job Exp [Playtester]
+ * Removed the inf2 = TRAP of FirePillar and Spider Web so they are blocked
+ by Land Protector. [Skotlex]
+11/09
+ * More accurate Max HP values for TK/SG/SL/GS/NJ [Playtester]
+ - TK/SG/SL are official up to level 70
+ * Reduced the check area of hermod to 3x3, you now have to literally stand
+ next to a warp for it to work. [Skotlex]
+ * Official Weight and Max SP values for TK/SG/SL/GS/NJ [Playtester]
+ - why were ours so far off the official ones?
+11/08
+ * Reduced Wand of Hermod's splash range (max distance from a portal) from 3 to
+ 2. Should it really be 1? (that is, be so close that moving a single cell
+ warps you?) [Skotlex]
+11/07
+ * Kiel now summons 6 slaves instead of 5 [Playtester]
+11/06
+ * Added Bull's Eye 0.5 sec cast time [Skotlex]
+ * Ganbantein's delay is now 2 secs. [Skotlex]
+ * Removed the time2 value of NJ_NEN since it has no use. [Skotlex]
+11/05
+ * Raised the chance to get an OPB from an OPB [Playtester]
+ * Official NJ/GS job exp for level 51+52 [Playtester]
+11/03
+ * Official X.4 MVP rewards [Playtester]
+ * Official NJ/GS job exp up to joblevel 50 [Playtester]
+ * Remaining official X.4 drop updates [Playtester]
+ - updated related item names
+11/02
+ * Official Gunslinger/Ninja weapon drops [Playtester]
+ - updated other mob drops A-M
+ - updated related item names
+ * Official X.4 mob drops [Playtester]
+ * Fixed Aliot's Rebirth skill [Playtester]
+11/01
+ * Reverted LK_Berserk HP requirement [Vicious]
+10/30
+ * Added some official X.4 drop rates [Playtester]
+ * Corrected GS skill ranges using Aegis data. All their targetted skills
+ have a base range of 9, and Dust (Choke) has a range of 2. [Skotlex]
+ * Gave Grounddrift a knockback of 3 for the fire-elemental effect (value
+ totally custom)
+ * Set the inf2 to encore skills of Wand of Hermode [Skotlex]
+10/29
+ * Official NJ/GS exp chart for level 1-48 [Playtester]
+ * Added Shinobi Sash to Shinobi drops [Playtester]
+ * Fixed const.txt, thanks to flaviojs [Vicious]
+ * Fixed homunculus's growth, according to Aegis [Vicious]
+10/27
+ * Made Thief Clothes and Ninja Suit being equippable by Ninja [Playtester]
+ * More Odin/Kiel fixes [Playtester]
+10/26
+ * Fixed Constant's explode not working as it should [Playtester]
+10/25
+ * More Kiel Mob updates [Playtester]
+ * Changed order of Aliza drops to prevent steal exploit [Playtester]
+ * MG_STONECURSE and NPC_PETRIFYATTACK now use time1 to specify the
+ "petrifying time". This value has been set to 5 seconds. [Skotlex]
+ * Fixed view ids of some headgears [Playtester]
+10/24
+ * Kiel Mob updates [Playtester]
+ * Reverted Lupus' map_index update. map_index should NOT be touched. [Vicious]
+ * Updated map index accordingly [Lupus]
+10/23
+ * Adjusted LK_BERSERK so you can only use it when you have 20% or less
+ life. [Skotlex]
+10/20
+ * Official Muscipular drops [Playtester]
+10/19
+ * Added the actual skill delay of 1000ms to Triple Attack and Chain combo
+ in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of
+ 700ms. [Skotlex]
+ * Added the Monk combos to skill_castnodex so their delay is not decreased
+ by skills. [Skotlex]
+10/18
+ * Updated the packetdb for the 2006-10-17a client. [Zephiris]
+10/16
+ * Corrected issen's range to 5, as per the login packet information.
+ [Skotlex]
+ * Applied most of Mpeg's work on Ninja Skills. For information see:
+ http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
+ * Small Kiel MVP drop rate increase [Playtester]
+10/14
+ * Fixed Bacsojin's and Chung E's stats [Playtester]
+10/12
+ * Reverted GS/NJ Job Exp [Playtester]
+ - better too high than too low
+ * Corrected Caprice cast info. No cast time, delay time equal to the bolt
+ spells. [Skotlex]
+ * Probably official GS/NJ Job Exp [Playtester]
+10/09
+ * Fixed High Quality Sandals not being refinable [Playtester]
+10/08
+ * Probably final drop rate increase [Playtester]
+10/06
+ * Reverted size fix for Guns and Shuriken [Playtester]
+ - it appears they are 100% to all after all
+10/05
+ * Selling price of Broken Pieces 10z -> 400z [Playtester]
+ * Raised the drop rates of most combo equips [Playtester]
+10/04
+ * Raised level of Kiel MVP skills [Playtester]
+10/01
+ * Adjusted drop rates thanks to info from Tharis [Playtester]
+ * Updated view ids of some headgears [Playtester]
+ - beware of crashes when your client is too old
+09/29
+ * Fully official Ktullanux stats [Playtester]
+ * Official X.4 item scripts [Playtester]
+ * Fixed Gunslinger job bonus [Playtester]
+ * Official X.4 aspd values for GS, NJ and SG [Playtester]
+09/28
+ * Raised drop rate of some MVP drops [Playtester]
+ - also added Morrigan's Manteau to Thanatos drops
+09/27
+ * Raised skill casting rate for Rachel mobs [Playtester]
+09/25
+ * Fixed item group 35 (lottobox) in item_misc.txt [Skotlex]
+ * Added Ninja/Gunslinger job exp as separate exp chart [Playtester]
+ * Immaterial Sword now has a 3% chance of reducing target's sp by 30% [Playtester]
+09/23
+ * Now Valkyrie Randgris will only resummon when she has less than 3 slaves [Playtester]
+09/21
+ * Implemented Rachel Sanctuary mob skills [Playtester]
+09/18
+ * Corrected Ki Explosion to have range 1 and to take your weapon's element.
+ [Skotlex]
+ * Fixing Holden combo not draining sp correctly [Playtester]
+ * Added official Rachel Sanctuary mob stats [Playtester]
+ * Fixed the order of mob skills thanks to [Leon] [Playtester]
+ * Changed NPC_CHANGEUNDEAD from a self skill to a targetted skill. Changed
+ it's duration to 30 secs. [Skotlex]
+09/17
+ * Updated some item names according to info from Haplo [Playtester]
+ * Fixed some Thanatos mob names [Playtester]
+09/16
+ * Added NPC_CHANGEUNDEAD to the skill_cast_db, fixes it apparently doing
+ "nothing". [Skotlex]
+09/15
+ * Added the remaining drop changes which I missed before [Playtester]
+09/14
+ * Fixed X.3 Cooking drop rates [Playtester]
+ - also updated related aegis item names
+ - now our db is official up to X.3
+ * Corrected Smokie's pet script to use petskillbonus instead of "bonus"
+ [Skotlex]
+ * Fixed Abyss Lake drop rates [Playtester]
+ - also updated related aegis item names
+ * Fixed Thanatos Tower drop rates [Playtester]
+ - also updated some related aegis item names
+09/13
+ * Started fixing up X.3 drop rates [Playtester]
+09/12
+ * Fixed NPC_ATTRICHANGE being targeted rather than self [Playtester]
+ * Fixed Vesper's summoning behavior [Playtester]
+09/11
+ * CG_MOONLIT is no longer castable in WoE grounds. [Skotlex]
+09/10
+ * Removed NPC_Powerup from Dimik [Playtester]
+ * More accurate guess on Strouf's dex [Playtester]
+ * Doubled Strouf's dex [Playtester]
+ * Guard is now equippable by every job [Playtester]
+09/08
+ * Adjusted various Rachel mob stats and skills [Playtester]
+ * Added missing Ice Dungeon mob skills [Playtester]
+ * Added missing Rachel mob skills [Playtester]
+ * Removed dMotion from Iceicle [Playtester]
+ * Official Rachel mob stats [Playtester]
+ - progress 30%
+09/07
+ * Merged some of mpeg's work on NJ skills [Skotlex]
+09/06
+ * Changed all bCriticalRate to bCritical [Playtester]
+ * Updated skill_require_db's entry for Abracadabra, it requires yellow 2
+ gemstones (there's no such hardcoded yellow gemstone requirement anymore)
+ [Skotlex]
+ * Corrected db/const.txt entry bMagicSubRace -> bMagicAddSize [Skotlex]
+
+ * Updated attack power of Unholy Touch [Playtester]
+ - also moved combo bonuses to non-accessoire parts
+09/05
+ * Updated comments on Arrow Crafting thanks to Haplo [Playtester]
+09/04
+ * Updated Shinobi Sash and Exorcising Ring [Playtester]
+09/02
+ * Applied Vicious's ranges on guns [Playtester]
+ - Rifle & Shotgun = 9, others = 7
+ * Updated various item names thanks to Haplo [Playtester]
+ - please update all the quests that use these item names
+09/01
+ * Added some new items thanks to Haplo [Playtester]
+08/30
+ * Updated ingredients for Smooth Noodle [Playtester]
+ * Updated mob iRO names and mob stats [Playtester]
+08/29
+ * Applied Mpeg's work on GS [Toms]
+ ( http://gpegon.free.fr/ea/gunslinger_08-29-06_mpeg.txt )
+08/26
+ * Reduced weapon range of all guns by 1 [Playtester]
+08/25
+ * Shinobi Belt combo now also works with slotted Ninja Suit [Playtester]
+08/24
+ * Updated X.3 iRO mob names [Playtester]
+08/23
+ * Corrected the healing value of novice pots. [MasterOfMuppets]
+08/22
+ * Fixed SP usage of some Gunslinger skills [Playtester]
+ * Added a duration to Disarm [Playtester]
+ * Final fix on Grand Cross weapon [Playtester]
+ * Some fixes on Grand Cross weapon, might need more fixes [Playtester]
+ * Removed event bonus on Celebration Ring [Playtester]
+ * Applied Mpeg's fix on GS according to kRO's values [Toms]
+ * Updated Embryo creation, put "Potion Creation Guide" instead of "Embryo Creation Guide"
+ according to RockmanEXE's & iRO info [Toms]
+ * Updated range of guns according to RockmanEXE's info [Playtester]
+ * Updated some items thanks to Haplo [Playtester]
+08/21
+ * Increased splash range of HVAN_EXPLOSION to 4. [Skotlex]
+ * Added delay to HLIF_AVOID [Toms]
+08/20
+ * Fixed Fling not reducing DEF for 30 seconds [Playtester]
+ * Updates Zeny givers (Red Pouch) [Lupus]
+08/19
+ * Removed event bonus of 4 year anniversary hat [Playtester]
+ * Added HAMI_CASTLE block time [Toms]
+ * Updated NJ_BAKUENRYU skill tree [Toms]
+ * Updated HLIF_CHANGE skill [Toms]
+ * Updated Kouenka, removed aftercast delay [Toms]
+ * Fixed some Ninja weapons (1Hand Sword -> Dagger) [Toms]
+08/18
+ * Made HLIF_HEAL a self skill that auto-selects target to caster's master.
+ [Skotlex]
+ * Fixed Kouenka not having an aftercast delay on levels greater 1 [Playtester]
+08/17
+ * Gospel can't stack anymore [Playtester]
+08/16
+ * Added WE_CALLBABY to Gunslinger and Ninja [Playtester]
+ * Fixed various bullets, spheres and kunais [Playtester]
+ * NJ_NEN now requires a Fang [Playtester]
+08/15
+ * Fixed disarm not working [Playtester]
+ - also fixed duration of Gatling Fever
+ * Made Kiel MVP's skills non-cancelable [Playtester]
+ * Fixed Masamune and Kamaitachi using bAspd rather than bAspdRate [Playtester]
+08/14
+ * Updated mob stats according to official kRO website [Playtester]
+ * Fixed attack power of Dusk [Playtester]
+ * Added official Gunslinger ASPD values according to Ragnarok Monthly [Playtester]
+08/13
+ * Gave elemental -1 to some GS skills. [Vicious]
+08/12
+ * Destroyer now has a 1% chance on breaking armor rather than Hit-10 [Playtester]
+ * Fixed Fling requiring unknown amunition [Playtester]
+ * Changed the aftercast delay of Envenom to 100ms [Playtester]
+ - this will cause that you can cast Envenom as fast as aMotion
+ * Reduced weight of Thanatos Tower quest items to 0 [Playtester]
+08/10
+ * Updated the Packet DB up to the 2006-08-07aSakexe client. [Zephiris]
+ * Reverted Tracking being affected by dex [Playtester]
+ * Aloevera and Anodyne now cast on self [Playtester]
+ * Fixed view id of some new headgears [Playtester]
+ * Added two missing braces to Yellow Novus card script [Playtester]
+ * Removed cast time on Flip Coin, Tracking is now affected by dex [Playtester]
+08/09
+ * Removed cast time of AM_REST & AM_CALLHOMUNCULUS [Toms]
+ * Hopefully fixed Green Ferus card combo [Playtester]
+ * Removed bonus range on some bows (there is a range column for that) [Playtester]
+ - also reverted sidewinder card, chance is handled in the code
+ * Fixed Royal Tea requiring Sweet Sauce rather than Yellow Spice [Playtester]
+ * Fixed Rapid Shower only using 1 bullet rather than 5 [Playtester]
+08/08
+ * Item name update [Vicious]
+ * Made PF_FOGWALL a targetted skill. [Skotlex]
+08/07
+ * Slightly increased drop rate of some low-level guns [Playtester]
+ - also lowered drop rate of Armor Charm to 0.01% again
+08/06
+ * Fixed selling price of Sharp Leaf [Playtester]
+08/05
+ * Added temporary size fixes for GS/NJ weapons [Playtester]
+ * Raised NJ/GS item MVP drop rates a little [Playtester]
+08/04
+ * Fixed Boots not equipable by Gunslingers [Playtester]
+ * Added the remaining official item drop bonus rates [Playtester]
+ - note that some bugs might have appeared, please test!
+ * Added some official item drop bonus rates [Playtester]
+ - also replaced IG_Jellopy with IG_Resist
+ * reverted 13202,Shell_of_Blood back [Lupus]
+ * Fixed 13202,Shell_of_Blood type to 4 = SHELL for shotgun (not a bullet) [Lupus]
+08/03
+ * Hydro is no longer an MVP [Playtester]
+ * Changed the inf2 value of SA_DISPEL so it can be casted on party/guild
+ mates, but not yourself. [Skotlex]
+ * Updated some monsters [Playtester]
+ - Gig and Deleter are now Fire 2 element
+ - reduced attack power of Skeggiolds
+ * Finally updated stats of the monsters that got their exp updated a month ago [Playtester]
+ * Fixed some items I added yesterday [Playtester]
+08/02
+ * Added a dummy blind duration of 10 secs to FullBuster. [Skotlex]
+ * Updated the mob skills so that the marine sphere casts self-destruction
+ with 3 second cast after it starts walking. [Skotlex]
+ * Updated Create Arrow to X.4 [Playtester]
+ * Gold Lux now makes you autocast Flip Coin on attack [Playtester]
+ - also Gunslinger can use Berserk Potion now
+ * Changed Scream and Hammerfall's stun duration to 5 seconds. [Skotlex]
+ * Converted NJ_HYOUSYOURAKU from jAthena since our version was lacking a time2 [Playtester]
+ * Reverted LOD card changes as well [Playtester]
+ * Reverted some changes. [MasterOfMuppets]
+ * Reduced overrefine bonus of level 4 weapons to 13 [Playtester]
+ * Added the new items and fixed selling price of Dark Mask [Playtester]
+08/01
+ * Changed Solace's and Retribution's skills so they feel like on official servers [Playtester]
+ * Fire Pillar's aftercast delay is 1 second now [Playtester]
+ * Updated Abyss Lake and Rachel mobs [Playtester]
+ * Some minor monster skill changes [Playtester]
+ * Made Deluge/volcano/v. gale be castable on top of each other again
+ [Skotlex]
+ * Cleaned up some of the db files. [Skotlex]
+ * Fixed name of Freya's Shoes [Playtester]
+ * Small item update from Haplo [Playtester]
+07/31
+ * Updated Awakening Potion, Note Headphone and High Quality Sandals [Playtester]
+07/30
+ * Corrected the defense of puppy band [MasterOfMuppets]
+ * Adjusted some drop rates and removed Yoyo's Animal Skin drop [Playtester]
+ * Fixed element of Abyss Lake monsters [Playtester]
+07/29
+ * Memorize cast time now can't be reduced by status changes neither.
+ [Skotlex]
+ * Large mob_db update [Playtester]
+ - added most of the missing X.4 / 11.1 drops
+ - adjusted the drop rates of Odin Temple and Kiel's Mechanical Doll Factory
+ - removed beret drop
+ * Reverted the Combat Knife (wrong translated description) [Playtester]
+ * Shockwave, Flasher and Freezing Trap now consume 2 trap items [Playtester]
+ - this is correct according to info from RagnaInfo and some guides
+ * Reverted the Hellion Revenant change. He IS supposed to be undead 3. [MasterOfMuppets]
+ - And yes, he can still heal himself even though he is undead...
+ - Note by Playtester: On eA right now he can't...
+07/28
+ * Fixed some summon skills [Playtester]
+07/27
+ * Hellion Revenant is now dark element so he can heal himself [Playtester]
+ * Fixed Teddy Bear card [Playtester]
+ * Hopefully fixed Solace card [Playtester]
+ * Corrected Combat Knife reducing damage from DemiHumans by 10% instead of
+ increasing damage against them. [Skotlex]
+ * Fixed Independence Memorial Hat weight, set to 0 [Toms]
+07/25
+ * Added rudeattacked teleport to Rachel MVPs [Playtester]
+ * Added some NPC_Emotions for the Rachel mobs [Playtester]
+ * Fixed Grandcross not being self-targeted for mobs [Playtester]
+ * Final cooking drop rate adjustment [Playtester]
+ * Fixed a bug in the item_db thanks to Toms [Playtester]
+ * Fixed G_Kraben and G_Biolab3 mobs [Playtester]
+ * Item updates by Haplo [Playtester]
+07/24
+ * Raised drop rate of cook books and sets a little [Playtester]
+ * Raised drop rate of food a little [Playtester]
+ * Raised drop rate of Kiel's and Valkyrie's drops a little [Playtester]
+ * updated def on 2006 helms in preparation for the 2006 headgears quest. [Reddozen]
+ * Added flag 0x002 (no reiteration) to Deluge/Volcano/Violent Gale
+ (skill_unit_db) [Skotlex]
+ * Edited Rachel mobs a little and added Beret to Turtle General drops [Playtester]
+ * Changed Land Protector's range back to 3. [Skotlex]
+07/23
+ * Added some new items thanks to Haplo [Playtester]
+ * Added Holy Quiver to IG_Quiver [Playtester]
+ * Added the skills of the Rachel + Ice Dungeon mobs [Playtester]
+ - I made it so that the monsters are safe to use
+ - the skills are official, but some skills are missing
+ - the stats are only 50% official
+ - drops are official, but various are missing
+ * Completed the temporary Rachel + Ice Dungeon mob stats [Playtester]
+07/22
+ * More Rachel mobs [Playtester]
+ * Raised the chance of Holden Card Combo dropping a stem [Playtester]
+ * Started to implement the Rachel mobs [Playtester]
+07/21
+ * Updated Speed/Delay of Juperos mobs [Playtester]
+ - all the official Aegis delays we have are implemented now
+ * Updated Speed/Delays of Lighthalzen mobs [Playtester]
+ * Updated Speed/Delays of Einbech mobs [Playtester]
+ * Replaced race numbers with constants RC_(race) in the item_db [Playtester]
+ - also changed some success rates of gaining item bonuses
+ * Updated Speed/Delays of Louyang and Ayothaya mobs [Playtester]
+ * Fixed Lord of Death Card's Status Change chances [Playtester]
+ * Added G_ L_ and XMAS_ mobs to the race2 races [Playtester]
+ - also added Rotar Zairo to 'Goblins'
+ * Fixed Anonymity Request and Erende Ebecee Card [Playtester]
+07/20
+ * Added a skill_unit_db entry for NJ_HYOUSYOURAKU, thanks to Eus for the
+ data. [Skotlex]
+ * Updated Speed/Delays of Niflheim mobs [Playtester]
+ * Updated Speed/Delays of Umbala mobs [Playtester]
+ * Updated Speed/Delays of Kunlun mobs [Playtester]
+ * Updated aDelay of some mobs to Aegis [Playtester]
+ - the code now solves the aDelay bug, so we can fully use Aegis values
+ - Alice and Zherlthsh finally attack like on official servers
+ - please don't merge the mob_db until the code is merged
+ - Ancient Mimic now drops Freyr's Shoes
+ * Updated the sell price of Serin's ring [MasterOfMuppets]
+ * Made Bacsojin's skills uninteruptable [Playtester]
+07/19
+ * Put the newly implemented cards into the old card album list. [MasterOfMuppets]
+ * Fixed mob skills for G_INCUBUS and G_WRAITH_DEAD [MasterOfMuppets]
+ - Someone needs to implement all of the G_MONSTER skills.
+ * Raised drop rate of Electric Wire and Undershirt [Playtester]
+ * Some speed and aDelay adjustments on Fur_Seal, Metaling, Increase Soil
+ - Incantation Samurai is now moving much faster
+07/18
+ * Updated speed and delay values of Amatsu mobs [Playtester]
+ * Added more of the X.4 and 11.1 drops [Playtester]
+ - attention: All Stone of Sage (etc) drops have been changed to
+ Stone of Sage (usable) drops, the etc item is not used anymore!
+ * Speed updates for Anolian and Merman [Playtester]
+07/17
+ * Speed/Delay updates for Pasana, Rybio and Phendark [Playtester]
+ * Ooops, forgot to update packet_db [DracoRPG]
+07/16
+ * Updated Speed, aDelay, aMotion, dMotion of some mobs to Aegis [Playtester]
+ * Raised speed of Kiel mobs until we know official values [Playtester]
+ * Added Angel's Kiss drop to Toad [Playtester]
+ * Valkyrie drops slotted helm again, Valkyrie Helm requires a quest [Playtester]
+07/15
+ * Hydro's drop change... [Playtester]
+ * Adjusted attack speed of Thanatos Tower mobs [Playtester]
+ * Adjusted move- and attack-speed of all Abyss Lake mobs [Playtester]
+ - also fixed Novus dropping the correct card
+ - added Detale's Reflect Shield skill
+07/14
+ * Added more X.4 and 11.1 item drops [Playtester]
+ - we don't know about the others yet
+ * Adjusted Odin Temple drops and drop rates with help from Tharis [Playtester]
+ - note: I'm working on adding the X.4 and 11.1 drops now
+07/13
+ * Fixed the Kaensin info in skill_db/skill_unit_db... before the skill was
+ overpowered. Now... I think it's underpowered :D [Skotlex]
+07/12
+ * Tao Gunga will now summon G_Megalith's. [Poki#3]
+ * Updated the new Rachel mob names and the new G_ mobs stats & skills. Also removed there poring drops. [Poki#3]
+ * Updated Detale's Skills [Playtester]
+ * Fixed element, mode and attack speed of some monsters [Playtester]
+07/11
+ * Fixed Nurse Cap, Memory Book and Dagger of Counter [Playtester]
+ * Marionette now drops "Marionette Doll" [Playtester]
+07/10
+ * Corrected Frost Nova's splash range and Land Protector's cast range.
+ Thanks to Haplo. [Skotlex]
+ * Fixed Beast Strafing not having inf2 = 512 (to make it a
+ target-auto-select skill) [Skotlex]
+ * Fixed the duration of Land Protector, removed unused time2 value from
+ their entries in skill_cast_db. Thanks to Haplo. [Skotlex]
+ * Corrected skill require entry from the Twilight Pharmacy skills.
+ [Skotlex]
+ * Removed Frost Nova's skill_unit_db entry. [Skotlex]
+07/09
+ * Added Guillontine's SP Drain per attack [Playtester]
+ * More item updates thanks to Haplo [Playtester]
+ * Added various items and fixed armor charm [Playtester]
+07/05
+ * Added Thanatos Tower Quest items to item_trade.txt [Playtester]
+ * Added correct card effects for "Status Effect on both" [Playtester]
+07/04
+ * Added temp plugs for new headgears. [Vicious]
+ - I only added this for VIEW ID. so someone needs to update everything else.
+ * Updated item_trade.txt to Aegis X.2 ItemMoveInfo.txt [Vicious]
+ * Updated the cooking items so they are ready for official implementation [Playtester]
+ - also slightly raised drop rates of Cooking Sets
+ * Silver Tiara's bonus is Int AGAIN (Gravity can't decide) [Playtester]
+07/03
+ * Fixed the UF * flags of Songs/Dances in skill_unit_db. [Skotlex]
+07/02
+ * Added the Mercenary Summon Scrolls [Playtester]
+ * Fixed two books in the item_db [Playtester]
+07/01
+ * Added Silence Effect to the Lord of the Dead Card [Playtester]
+06/30
+ * Applied some mob_db changes according to the 27/06/2006 patch [Playtester]
+ * Updated skill_unit_db to use the correct values of
+ UF_ENSEMBLE/UF_DANCE/UF_SONG as applicable. [Skotlex]
+ * Added the new X.4 headgears [Playtester]
+ * Fixed various items and sorted the item_db [Playtester]
+ * Reverted back Vulcan Arrow. It's fine now. Player can move after the attack animation end [Lupus]
+ * Raised attack power of Strouf according to X.4 updates [Playtester]
+06/29
+ * Updated Freyr's Shoes and Vidar's Boots [Playtester]
+ * [Again] Added back walkdelay to Sonic Blow(thx@rkit), Arrow Vulcan [Lupus]
+ Walk delay lasts as attack does. In ARROW VULCAN fixed CONSTANT delay to the list
+06/28
+ * Updated Soul Change to use inf2 4096 (INF2_ALLOW_ENEMY). [Skotlex]
+ * Updated Morpheus's Hood and Freyr's Shoes [Playtester]
+ * Fixed the SP usage of AS_SPLASHER. Thanks to Belle. [MasterOfMuppets]
+06/27
+ * Added the remaining Ninja/Gunslinger drops [Playtester]
+ * Raised autocast chance of Owl Duke card to Aegis x.2 [Playtester]
+ * Some small item_db fixes [Playtester]
+06/26
+ * Mob name/sprite name update, thanks to Saycyber21 [Vicious]
+ * Updated/Added some items [Playtester]
+ * Corrected unit id of desperado and Ground Drift using jA's info. [Skotlex]
+06/25
+ * Added two new gunslinger weapon drops, thanks to RockmanEXE. [MasterOfMuppets]
+06/23
+ * Fixed SP Drain rates of items [Playtester]
+ * Updated BD_INTOABYSS's unit flag to not affect mobs. [Skotlex]
+ * Rogue Card Combo now removes Intimidate autospell [Playtester]
+ * Sorted in the new cards and fixed some equips [Playtester]
+06/22
+ * Fixed the remaining 2006 Cards [Playtester]
+ * Fixed some equipment fields that caused warnings [Playtester]
+06/21
+ * Fixed the equipment fields of the new cards [Playtester]
+06/20
+ * Reduced Stone Buckler's natural Def to 3 [Playtester]
+ * Started fixing some of the cards [Playtester]
+06/19
+ * Some more item updates [Playtester]
+ - Valkyrie Shield and Survivor's Manteau have their complete bonus script now, please test it
+ - Slotted Ice Pick and Iron Shackle Combo are weaker now
+ * Some updates to the item_db [Playtester]
+ - updated Survivor's Manteau, Valkyrie Shield, Stone Buckler, etc.
+06/18
+ * Added Exp to some Thief Bug versions [Playtester]
+06/17
+ * Fixed the scripts for the Lotto Boxes [Playtester]
+ * Changed Hellion Revenant to heal for 9999. [MasterOfMuppets]
+ - Also put in some item restrictions related to the eye of hellion quest.
+06/16
+ - Updated GTB's card script to be "bonus bNoMagicDamage,100;" [Skotlex]
+06/14
+ * Fixed the awfully coded Baseball Cap script [Playtester]
+ - please use CONSTANTS!
+ - please use RC_Nonboss and RC_Boss for "all mobs" instead of listing all the races!
+ - please don't stack RC_Nonboss with RC_(some race)!
+06/13
+ * Detale only summons one Hydro [Playtester]
+ * Fixed the names of the Lotto items [Playtester]
+ * Garm Claw now has 152 Attack Power rather than 115 [Playtester]
+06/12
+ * SL_STIN/SL_STUN have dex-reducable casting times now. [Skotlex]
+ * Temp sprite names for Rachel/Ice Dungeon monsters, thanks to Saycyber21. [Vicious]
+ - Chung E = temp sprites.
+ * Fixed the mode of Monemus [MasterOfMuppets]
+06/11
+ * Commented some unused mobs in the mob_db [Playtester]
+ * Goggles are worth 10k now [Playtester]
+06/10
+ * Slotted Crown and Tiara only have +1 int [Playtester]
+ * Added the new cards to the drops [Playtester]
+06/08
+ * Implemented Electric Wire [Playtester]
+06/07
+ * Stormy Knight card now freezes when attack rather then when hit [Playtester]
+06/06
+ * Fixed Owl Duke not having boss mode [Playtester]
+ * Fixed Osiris's slaves [Playtester]
+ * Hopefully fixed all the Unbreakable bonuses [Playtester]
+ * Fixed Valkyrie skills and Magnum Break of all mobs [Playtester]
+ * Sunflower Hairpin now can't be refined anymore [Playtester]
+06/05
+ * Added some sign quest related item restrictions. [MasterOfMuppets]
+ * Fixed the item bonus of baseball cap. [MasterOfMuppets]
+ * A typo fix, thanks to DracoRPG. [MasterOfMuppets]
+06/03
+ * Fixed Archdam Card [Playtester]
+ * Fixed Skeggiold's drops [Playtester]
+ * MVP Jupitel now does 30 Hits [Playtester]
+06/02
+ * Removed the job bonuses of High Novice and Baby Novice [Playtester]
+ * Updated Holy Cross, Investigate and Finger Offensive to be usable by all
+ weapons. [Skotlex]
+ * Gave several MVPs their MVP skill versions [Playtester]
+ * Made Grandcross usable with all weapons. Thanks to Khersai for digging it
+ up. [Skotlex]
+ * Added Can Attack to various G_mobs [Playtester]
+ * Removed the Novice Job bonuses again [Playtester]
+ - http://www.eathena.ws/board/index.php?showtopic=93893
+ * Small adjustments of the Orc Lord and Valkyrie Randgris drops [Playtester]
+06/01
+ * Readded Novice Job bonusses [Poki#3]
+ - Just why where they removed? http://guide.ragnarok.co.kr/JobNovicestatus.asp still lists them...
+
+05/31
+ * Fixed mode of G_Whisper_Boss [Playtester]
+ * Gave Rafflesia Can_Move and Aggressive mode [Playtester]
+ - who removed it?
+ * Fixed Arrow Crafting, now using the official X.2 values [Playtester]
+ * Updated item_db according to info provided by Haplo [Playtester]
+ * Changed the range of Rotar Zairo to 7, as it should be. [MasterOfMuppets]
+05/30
+ * Fixed the mode of Monemus to prevent it from getting knocked back. [MasterOfMuppets]
+ * Updated the modes of Gremlin and Beholder according to iRO [MasterOfMuppets]
+05/29
+ * "Massive" item update [Vicious]
+ - Updated the cards' effects. Old effects are commented at the end.
+ -- Slots are NOT checked, so someone needs to do it. shouldn't be hard.
+ - New items, by Landarma.
+ - New "slotted" items.
+ * Fixed Green Ale's effect, thanks to NLZ. [MasterOfMuppets]
+05/28
+ * Updated ASC_BREAKER's range to 9. [Skotlex]
+05/28
+ * Readded some aDelay fixes which were accidentaly reverted [Playtester]
+05/26
+ * Added Red Chile drop to Kraben & small aMotion fix [Playtester]
+ * Added missing Odin drops (guessed) [Playtester]
+ * Updated Kiel and added Odin mob drops [Playtester]
+ - low drop rates as long as not known
+ - still missing Makeup Kit, Angel Hairband and not sure which Survivor's Rod
+ * Fixed 12106,Jeweled_Box. Now giving an accessory [Lupus]
+05/25
+ * Modified some drops and added drops to Ferus and Dragon Egg [Playtester]
+ * Updated the Exp of some mobs accordings to the last kRO patch thanks to Muad_Dib [Playtester]
+ * More fixes on MVP exp and changed some mob modes [Playtester]
+ * Fixed Sidewinder card to raise the chance of Double Attack if you have mastered it [Playtester]
+ * MVP Exp is now 1/2 of the Base Exp as pointed out by Tharis [Playtester]
+ - Removed MVP drops of Hydro and Event Kiel as they are supposely no MVPs
+05/24
+ * Added cooking drops to the mob_db [Playtester]
+ * Final Aegis X.2 update [Playtester]
+ - added mob_db_a.txt in case someone wants to use 100% official X.2 drop rates
+ - now starting to add after-X.2 drops
+05/23
+ * Amon Ra now uses Meteor Storm on self until we find out how it really works [Playtester]
+05/21
+ * Incantation Samurai Card now ignores def of all non-boss races [Playtester]
+ - should include players now
+05/19
+ * Major fix to the mob_skill_db [Playtester]
+ - traps are now placed around2 rather than self
+ - all idle skills should work now
+ * More fixes on Amon Ra [Playtester]
+ * Fixed Bascojin's mob summoning [Playtester]
+ * Fixed some SPRITE names of mobs [Playtester]
+ * Fixed item names of new items thanks to Haplo [Playtester]
+05/18
+ * Amon Ra's and Dark Lord's Fire Pillar & Meteor Storm now have Level 11 rather than 30 [Playtester]
+ * Fixed MVP Fire Pillar --> 12 hits, 5x5 range [Playtester]
+ * Corrected LoV's effect range for levels 11+ to range 8. [Skotlex]
+ * Added new items 2006-04-25 ... 2006-05-16. Thanks to Landarma [Lupus]
+05/16
+ * More Aegis X.2 drop updates [Playtester]
+ - progress 50%
+05/15
+ * More Amon Ra related changes [Playtester]
+ - Dark Blessing and Blood Sucker now have a range of 9 tiles
+ - Small fixes on his skills again
+ - G_Khalitzburg is a bit slower now
+ * Fixed implementation of MVP Meteor Storm [Playtester]
+ - Dark Lord and Amon Ra use it
+ - Meteors drop in an area of 31x31 tiles
+ - each Meteor has 7x7 tiles splash damage
+ - each Meteor does 15 hits
+ * Spirit skills now have 500ms delay. [Skotlex]
+ * Changed speed of G_Khalitzburg (very fast now) [Playtester]
+ * Improved some skills of Amon Ra [Playtester]
+05/14
+ * More Aegis X.2 drop updates [Playtester]
+ - progress 45%
+05/13
+ * Hopefully fixed Skeggiolds summon endless slaves [Playtester]
+ * Added a hopefully better implementation of Amon Ra thanks to Tharis [Playtester]
+ - also fixed name of Apocalypse
+ * Uncommented Summon skill of Katrinn and Shecil [Playtester]
+ * Some more drop updates [Playtester]
+ - progress 40%
+ * Fixed Medusa drops and updated Treasure Box drops [Playtester]
+05/12
+ * Updated cast times of Kaupe and Kaahi. [Skotlex]
+ * SMA has dex reducable casttime now. [Skotlex]
+ * Updating drops to Aegis X.2 [Playtester]
+ - progress 35%
+05/11
+ * Moved TK_DOWNKICK's stun time from time to time2 [Skotlex]
+ * Added TK_TURNKICK's stun time in skill_cast_db (2secs in time2) [Skotlex]
+05/09
+ * More Aegis X.2 drop updates [Playtester]
+05/08
+ * Corrected Stun Duration for Meteor assault to 3 secs. [Skotlex]
+ * Reduced Stun duration of multiple skills to 3 secs. Skills affected:
+ Meteor Storm, Land Mine, Bash (fatal blow), Throw Stone, NPC_LICK, Raid,
+ shield Charge, Cart Termination. [Skotlex]
+ * Reduced stun duration of most skills to 3 secs. [Skotlex]
+05/07
+ * Updating drops to Aegis X.2 [Playtester]
+ - progress 25%
+05/06
+ * Replaced every "if(!cond) end; cmd1; cmd2;" with "if(cond) { cmd1; cmd2; }"
+ in item scripts, reads better for the eyes and for PHP scripts [DracoRPG]
+ * Changed Doppelganger Card's attack delay reduction bonus to non-stackable
+ (bAspdRate instead of bAspdAddRate) as every other such bonus is [DracoRPG]
+05/05
+ * Hammer fall's stun duration is now 1+lv seconds. [Skotlex]
+ * Removed drops from Bio Lab mobs than are not in X.2 [Playtester]
+05/04
+ * All KA-spells are interruptable. [Skotlex]
+ * Modified NPC_STUNATTACK: Max level is 5, stun duration is 1+lv seconds
+ (these duration values are guessed, but they are better than the previous
+ 5+lv seconds) [Skotlex]
+05/03
+ * Fusion's cast time reduced to 0. [Skotlex]
+ * Removed all Novice Job bonusses [Playtester]
+ * Reverted the changes to Killer Mantis and Demon Pungus card [Playtester]
+ - the base effect rate is 20%, but target's defense can lower the rate
+ * Fixed bugs in every New Card with getrefine() check [Lupus]
+ - optimized some IF() conditions of the new cards
+ - temp fix of getrefine bonus 4379,Blue_Acidus_Card (probably item desc is wrong)
+05/02
+ * Corrected Desperado ammo consumption (should be 10) [Skotlex]
+ * Lowered all card drop rates to 0.01% as they are in Aegis X.2 [Playtester]
+ * Updating old/wrong mob drops to Aegis X.2 drops [Playtester]
+ - progress 10%
+ * Changed the prices of the ninja stones according to official. [erKURITA]
+ * Linking skills now have their cast-time reduced by dex. [Skotlex]
+ * Lowered the duration of Speed Potion to 5 seconds [Playtester]
+ - now it's doubled speed for 5 seconds
+05/01
+ * Fixed Jump Kick's range to 9. [Skotlex]
+ * Modified the AM_TWILIGHT* skills to require 200 medicine bowls. [Skotlex]
+ * Added effect of Speed Potion [Playtester]
+ * Removed Kraben Card drop from G_Kraben [Playtester]
+ * Fixed a typo in the Armeyer Dinze card thanks to theultramage [Playtester]
+04/30
+ * Changed TK_RUN's state from none to move_enable. [Skotlex]
+ * Added Hellion Revenant [Playtester]
+ - his skills are still missing
+ * Changed chance of Demon Pungus Card and Killer Mantis Card to 10% [Playtester]
+ * Final updates for Bio Lab drop rates thanks to Muad_Dib [Playtester]
+ - they should be official to 99% now
+ * Updated Bio Lab drop rates to Aegis X.2 thanks to Muad_Dib [Playtester]
+ * Fixed the name of Wind Demon = "Fuuma" shurikens [Playtester]
+04/29
+ * Item ID 7344 is now called "Shinokas Case File" [Playtester]
+ - when someone is making the quest please make sure the guy is called Shinokas
+ * Updated drops of Bio Lab 3 MVPs [Playtester]
+ - drop rate is 1/10 of the guessed values (until skills/delays are finished)
+ - also fixed a typo in the item db
+ * Updated drops of Bio Lab 3 mobs [Playtester]
+ * Updated mob delays to current info [Playtester]
+ * More fixes in the mob db [Playtester]
+ - fixed more drops
+ - kRO name for Goblin Steamrider is "Steam Goblin"
+ * Started fixing the drops of mobs with more than 8 different items [Playtester]
+ * Added new hats ViewID, thanks to Lost_Kakashi [Lupus]
+ * Added new cards set 4332-4407. Thanks to virpyre,vicious_pucca,reddozen and the others ^_-
+ - Fixed some bugs and typos in the new cards effects. Probably there are more [Lupus]
+ Note: ON finishing adjusting STEAL skill, we'd start adding cards into MOBs drops.
+04/28
+ * Fixed the "stun" typo that has been in eAthena for ages [Playtester]
+ - SC_STAN --> SC_STUN
+ - Eff_Stan --> Eff_Stun
+ * Storm Kick's range increased to 2. [Skotlex]
+ * Lowered drop rates of Bio Lab 3 normal mobs [Playtester]
+ - not finished yet, need 12 item drop slots...
+ * Range of Flying Sidekick 10->8 cells [Lupus]
+ * Updated drop rates of the Bio Lab 1&2 mobs [Playtester]
+ - using 1/2 of the guessed values again
+04/27
+ * Corrected the hit value of the TK kicks (from single hit "6" to multi-hit
+ "8") [Skotlex]
+ * All TK kicks do 3 hits now. [Skotlex]
+04/26
+ * Updated drop rates of Remover/Gemini with help of Tharis [Playtester]
+ - droprate is now 1/2 of the guessed values
+04/25
+ * Updated OBB/OCA/etc [Vicious]
+ * Re-enabled Biolab's summon summmoning [Vicious]
+04/25
+ * Fixed price of yummy fish 150z -> 250z [Playtester]
+ * Updated Mode and Delays of Odin Temple mobs(using Frus delays for now) [Playtester]
+ * Fixed Element, Race, aDelay, aMotion and Range of Plasma and Breeze [Playtester]
+ * Updated the remaining mob names [Playtester]
+ * Updated the iRO and kRO mob names [Playtester]
+ - mob names done up to ID 1491, working on the rest now
+ * Updated the header in the mob db text files [Playtester]
+ - the order is now SpriteName,kROName,iROName
+04/24
+ * Updated OBB, OCA, Cookie Bag, Giftbox, OVB drops to X.2(X.3?)
+ ItemSummonList provided by Peter [Vicious]
+ * Fixed Running's cast time [Playtester]
+ * Fixed Item 2520 and Item 662 according to info from Haplo [Playtester]
+04/23
+ * Updated mob_skill_db: all idle and walk skills had their rate up x10. [Skotlex]
+ * Put in most of the Kiel Hyre monster drops, at temporary low rates. [MasterOfMuppets]
+ * Updated some loot sell prices for the Kiel Hyre/Odin Temple monsters [MasterOfMuppets]
+ * NPC_CHANGE<property> should be self, not target [Vicious]
+ * Increased all chase/follow skill rates by 10 since their trigger rate has
+ been decreased by that much due to the unit-data update. [Skotlex]
+04/22
+ * Updated Kiel/Odin mob stat to kRO official guidebook [Vicious]
+ * Major fix to the Einbroch mobs [Playtester]
+ - stats and drops should now be to 99% official
+04/21
+ * Fixed stats of Chung E / Green Maiden [Playtester]
+ * Set NPC_INVISIBLE's duration to 30 secs. [Skotlex]
+ * Finally implemented Dragon Egg thanks to Tharis [Playtester]
+ * Fixed some mob skills that where missing an [Enter]... (Windows format... AGAIN!) [Poki#3]
+ ...why co we have uncommented Attack skills under an iddle state? Oo
+ * Added a lot of G_Mobs and changed some slave spawns to them. Please use the newest exe release. [Poki#3]
+ * Fixed selling price of research chart(ID 7347) thanks to Muad_Dib [Playtester]
+ * Fixed some drops of the Bio Lab 1&2 mobs [Playtester]
+ * Fixed more elements of Bio Lab mobs [Playtester]
+04/20
+ * Changed item_db2.txt to new format thanks to joshuaali [Playtester]
+ * Fixed range of meteor (from 14x14 to 7x7) [Skotlex]
+ * Fixed Nile Rose bonus [Playtester]
+ * Fixed Violy's Arc Wand drop [Playtester]
+ * Changed "Event Hat" to "Brazil Event Hat" [Playtester]
+04/19
+ * Fixed a zeny exploit by lowering price of fire cracker [Playtester]
+ * Fixed Attack of Niflheim Mobs being way too low [Playtester]
+ * Reverted the delay for Arrow Shower and Double Strafe to 100ms [Skotlex]
+ * Reverted the cast time for pick stone to 500ms, no delay. [Skotlex]
+ * Fixed Roguemaster's Bow being equipable by Rogues [Playtester]
+04/18
+ * Some more fixes on the Bio Lab mobs [Playtester]
+ * Fixed Laurell's mode [Playtester]
+ * Updated Juperos Mobs, they now have correct kRO Sakray stats [Playtester]
+ * Fixed elements/race/size of all Juperos mobs [Playtester]
+ - still working on the correct stats
+ * Fixed element of Gemini and Monemus [Playtester]
+ * Fixed Butcher's weapon level thanks to gyunwoo23 [Playtester]
+ - also fixed Event Nile Rose missing a slot
+ * Fixed new healing items not being usuable by new classes [Playtester]
+04/16
+ * Fixed knives being equipable by Taekwon and Star Gladiator [Playtester]
+ * Fixed jname of Photon Cannon [Playtester]
+ * Fixed slots of Butcher thanks to gyunwoo23 [Playtester]
+ * Fixed some item names in the item_db thanks to Haplo [Playtester]
+ * Fixed Mjolnir's ASPD bonus [Playtester]
+ * Fixed moving speed of Bio Lab 3 mobs [Playtester]
+ * Corrected Venom Knife's requiring two knives per use. [Skotlex]
+ * Adjusted more delays/speed of Lighthalzen mobs thanks to Tharis [Playtester]
+ * Fixed Job_Equip values for all one-handed-swords thanks to Haplo [Playtester]
+ * Fixed wrong effect 4175,Poisonous_Toad_Card [Lupus]
+04/15
+ * Fixed Vesper's HP and implemented Monemus properly [Playtester]
+ * Renamed Mastersmith Howard to Whitesmith Howard [Playtester]
+ * Fixed Halo(id 2282) having 10% resistance instead of 15% thanks to KarLaeda [Playtester]
+ * Fixed movement and attack speed of Lighthalzen Mobs thanks to Tharis [Playtester]
+ * Fixed names of Lighthalzen Mobs, using iRO names now [Playtester]
+04/14
+ * Fixed various Job Fields in the item_db.txt thanks to Haplo and KarLaeda [Playtester]
+ - they should all fit to the descriptions now
+04/13
+ - fixed pick stone ID [Lupus]
+ * Updated 1675,VENATU (some columns were shifted) [Lupus]
+ * Updated items weight, names. Thanks 2 Haplo [Lupus]
+ - 12142,Book_of_Magic effect updated +20 Agi for 30 min (d0n't list it in the items desc)
+ Stopped updating Stable Item Db till the merge ^_-
+04/12
+ * Fixed the price of empty scrolls, thanks to rockmanEXE [MasterOfMuppets]
+ for the info. He doesn't pwnz0rz so much :(
+ * Some Lighthalzen mob updates [MasterOfMuppets]
+ * Added cast time to pick stone of 3 secs and 500ms delay. [Skotlex]
+ * Fixed produce_db for Halberd 3-->12 Oridecons [Playtester]
+ * Fixed Violy's Violin[4] drop rate. It is 2%. [Playtester]
+ * Fixed a typo and sorted skill_cast_db by skill id. [Playtester]
+04/11
+ * Corrected some items bonus, weight. Thanks 2 Haplo [Lupus]
+ * Modified Mastela Fruit price to 8500, according to RockmanEXE. [erKURITA]
+ * Modified Goggles and Goggles_ price to... 20z, according to RockmanEXE. [erKURITA]
+ * Made Anopheles aggressive [erKURITA]
+04/07
+ * Modified the equip_job field in the item_db to be a hexadecimal value for
+ easier handling. [Skotlex]
+ * Modified/optimized the distribution of the values for jobs in the
+ job_equip field; added doc/item_db.txt to explain each of the fields in
+ db/item_db.txt as well as the possible values for them. [Skotlex]
+04/06
+ * Added some Landarma's new items plugs [Lupus]
+ * Lowered min zeny amount that give Red Envelopes, thanks to kyoki [Lupus]
+ * Removed mapflag noreturn from pvp maps. [Skotlex]
+ * Fixed HP/SP requirements for WE_MALE/WE_FEMALE [Skotlex]
+04/05
+ * Modified the item_db and added view_types to ammo: 1 arrows, 2 dagger
+ (venom knife), 3 bullets, 4 shells, 5 grenades, 6 shurikens, 7 kunais.
+ [Skotlex]
+ * Updated skill_require_db to specify the ammo types required for GS/NJ
+ skills (as best as I could understand them) [Skotlex]
+ * Updated item givers with ACTUAL items. ~10 Ep [Lupus]
+ item_cookie_bag.txt,item_cardalbum.txt,item_violetbox.txt,item_giftbox.txt,item_bluebox.txt
+03/31
+ * Changed the look field of all arrows to 1. [Skotlex]
+ * Added column "RequiredArrowType" to skill_require_db, set to 1 all
+ arrow-based skills. The rest of skills need to be set up! For example,
+ let's say that throwable knives are type 2. On the item_db set up the
+ item's look/view to be 2, and then in skill_require_db for the skill
+ AS_VENOMKNIFE, set the required Arrow to 2 as well. This needs be done for
+ all GS/NJ skills with throwable type requirements (bullets/darts/etc). I
+ don't do it because I don't really know how many types there really are (I
+ could have just added bullet/dagger and leave it at that, but I do not know
+ if different skills require different types of "ammo". [Skotlex]
+
+ * Adjusted the range of Wall of Fog to 9 and Spider Web to 7 [Skotlex]
+03/30
+ * Fixed a lot of Jnames [Poki#3]
+03/29
+ * Updated FULL BUSTER aftercast delays, thanks to Haplo [Lupus]
+ - Fixed Rose Nile bonus
+ * Updated changed weight of some items according to Haplo's note [Lupus]
+ * Updated some SP cost of some skills. Added SP COST info for Homunculi skills. Thanks to Haplo [Lupus]
+ * Fixed inf2 of Jump-Kick to make it a "combo-skill" so that it may do a
+ BCT_ENEMY check. [Skotlex]
+03/28
+ * Changed droprate of Einbroch/Lighthalzen monsters. [Vicious]
+03/27 * Removed EVENT bonuses from event items: [Lupus]
+ 2646,Bunch_of_Carnations, 2647,Nile_Rose, 2668,Woman_Glory, 5097,2_Years_Anniversary_Hat
+ NOTE: If you want to use these or other EVENT BONUSES, set them via 'setitemscript' command
+ in your scripts. Check X-Mas Rings Event as example.
+ Poki#3, please, update the item desc. Or explain that the bonuses are gone just after the events
+03/26
+ * 5136,Louise's Santa_Hat lost its EVENT autocast bonus. [Lupus]
+ * Added missing slots to Alice Doll, Marionette Doll, Kabuki Mask & Kawaii_Ribbon [Lupus]
+03/24
+ * Fixed 5123,Ulle's_Cap bug [Lupus]
+03/22
+ * Changed preserve's cost to 30 sp. [Skotlex]
+ * Changed Soul Breaker's cast time to 700ms. [Skotlex]
+ * Updated Elemental Converter ingredients. Thanks2 Haplo [Lupus]
+03/21
+ * Fixed the inf2 for BA_DISSONANCE to be dance-skill. [Skotlex]
+ * Myst Case Card will drop GB even if the card combo's on [Lupus]
+03/20
+ * Fixed splash area of Ganbantein [Skotlex]
+ * Updated atk,def,mdef of NJ/GS items, thanks to Haplo [Lupus]
+ - also re-fixed few blackhole89 (def, atk) values
+ * Uploaded Kargha's updated item_db.txt with the Gunslinger/Ninja usage bits set.
+ Looked correct to me, if there should still be errors, feel free to revert. [blackhole89]
+03/18
+ * Updated price and such for NJ/SG weapons
+ * Fixed tons of wrong weight, wep lvlm req level items. Big thanks to KarLaeda and Haplo [Lupus]
+03/15
+ * Alice Doll hat fixed effect, thanks2 Sir_Loon [Lupus]
+ - Fixed Moonlit's inf2 not being set to ensemble skill. Thanks to Haplo.
+ [Skotlex]
+03/14
+ * Modified skill entries for the Wedding recall skills. Updated their
+ splash value to signal the area around the caster where the warp will be
+ placed. [Skotlex]
+03/13
+ * Changed the mode of the crystals to 193 (can move, can attack, plants)
+ [Skotlex]
+ * Devotion won't work on guildmates now (only party-members) [Skotlex]
+ * Changed Gravity Field's element to earth so that it may hit hidden chars.
+ [Skotlex]
+ * Added missing mob skills to G_HYDRA, G_PARASITE [Lupus]
+ * Fixed TK and Soul Linker's position of their job entry in exp2.txt,
+ thanks to Coltaro. [Skotlex]
+ * Fixed NPC_GRANDDARKNESS targetting the enemy instead of yourself in
+ mob_skill_db. [Skotlex]
+ * Fixed Grandcross's hit and range entries in the skill_db (it had hit 5?
+ that wasn't even a valid value from the description) [Skotlex]
+03/11
+ * Update the buy/sell prices of four daggers(1247-1249 & 13000) [MasterOfMuppets]
+ * Adjusted bonus items drop rates at Mimic Card and Myst Case Card [Lupus]
+03/10
+ * Added a few dummy duration values on skill_cast_db for some GS skills
+ (better than leaving them on 0...) [Skotlex]
+ * Updated div of LoV, Combo Skills and other such skills whose damage
+ equation does not really scales well with the number of hits. [Skotlex]
+ * Made G_Giant_Hornet Agressive, thanks to Blackgatomon [Lupus]
+ * Doppel's drops fix Lance 1411 -> Lance 1410 [Lupus]
+03/08
+ * Updated skill tree for Ninja/GS [Vicious]
+ * More work on Ninja/GS. They have joblvl 70, according to status
+ on kRO site, so using adv. classes' job exp chart. [Vicious]
+ * Updated stat bonus, given by Muad_Dib. [Vicious]
+ * Added more columns to size_fix and job_db1.txt with temp value. [Vicious]
+ * Fixed cooldown time for ASC_CDP, according to description [Foruken]
+03/07
+ * Temp ninja/gs skill tree. [Vicious]
+ * Temp plug on Ninja in Skill_db. Ninja is correct on skill ID,
+ not sure about gunslinger, so they're commented out. [Vicious]
+03/06
+ * Stave Crasher's element is now -1 (take weapon's element) [Skotlex]
+03/03
+ * Fixed missing baby-dancer job in exp2.txt [Skotlex]
+ * Added GrandCross's can't move delay of 900ms to skill_cast_db and Finger
+ Offensive's can't move delay of 200ms/lv to skill_cast_db (values taken
+ from the code) [Skotlex]
+ * Updated skill_cast_db time info for some skills: [Skotlex]
+ - Magnum's time2 is skill-block time
+ - St. Recovery/ Cure's time2 is the confuse/blind duration
+ - added NPC_POWERUP/NPC_AGIUP durations
+ - Napalm Vulcan's time2 is curse length
+ - Most of Tarot Card's effects last time2
+ * Adjusted SC durations for Meteor Assault [Skotlex]
+03/02
+ * Temp Plugs for NJ and GS items [Poki#3]
+ * Fixed some skill warnings. [Poki#3]
+ * Added back mob "Mime Monkey". [Poki#3]
+
+03/01
+ * Added temp Green Iguana skills [Lupus]
+
+02/27
+ * Temp plug: 2620,Rogue's_Treasure steal rate -> 1 (have to fix formula) [Lupus]
+ - Fixed all Vesper Acessories (removed doubled DEF bonus), thanks to Irmin
+ - Rearranged Stone Buckler: normally it gives +4 DEF, with CARD COMBO it gives +5 DEF, and with CARD COMBO+SWORDMAN CLASS it would give +10 DEF
+ - Removed DOUBLED combo bonus from some items. Also fixed missing brackets
+ Chnaged: 2115,Valkyrie's_Shield, 2114,Stone_Buckler, 2353,Odin's_Blessing,
+ 5122,Magni's_Cap, 5123,Ulle's_Cap, 5124,Fricca's_Circlet
+02/24
+ * Changed bosses slaves in Bio Labs level 3 - they will spawn only once now [Komurka]
+
+02/22
+ * Fixed Summon skills, among others. [Poki#3]
+ * Fixed G_GOBLINE_XMAS mode (aggresive ~~) [Komurka]
+ * Made G_DARK_ILLUSION more ... aggressive [Komurka]
+
+02/21
+ * Changed a bunch of item names according to the upcoming iRO Lighthalzen Patch. [Poki#3]
+
+02/20
+ * Some mob_skill_db fixes [Komurka]
+ * Fixed a small typo I found while browsing through the mob skill database [MasterOfMuppets]
+ * Reverted back all 'status change' cards back to 10/20/30% (kRO website have full descs ~~) [Komurka]
+ * Updated item_bluebox.txt, item_giftbox.txt, item_violetbox.txt, item_db.txt, mob_db.txt, [Komurka]
+ added item_cookie_bag.txt
+ - new databases from Aegis 10.2
+ - implemented Cookie Bag item
+ - added missing mobs
+ - note: yes, I know that random item databases can be shorter (item_bluebox.txt, item_violetbox.txt,
+ item_cookie_bag.txt, but not with current implementation of item randomizing
+ for expamle:
+ - there are 9285 items in item_bluebox.txt, and 1000000/9285 = real value
+ - so line with Red Potion would contain rate = 1000000/9285*12 = real value (can't be)
+ I think it's better to have bigger db, and do ONE rand check, than shorter and check it even 1000 times ~~
+ (in function itemdb_searchrandomid) so please, don't mess with them, or change them
+ * Updated mobs mode (ID 1001-1691) according to Aegis 10.2 [Komurka]
+ * 2nd part (status % chances, coma) of item_db.txt update according to Aegis 10.2 file [Komurka]
+ - all cards, that had 20% on status change now have 6%
+ - all cards, that had 10%+20% on status change now have 3%+3%
+ - all bAddEff and bResEff updated
+ - some small fixes
+ - fixed Assaulter slaves thanks to Poki#3
+ * 1st part (autospells) of item_db.txt update according to Aegis 10.2 file [Komurka]
+ - (to transtation devs) I suggest to update item descriptions
+ * New mob skill database from Aegis 10.2 (mobs 1001-1691) [Komurka]
+ * Fixed some names in mob_db.txt ('Name', not 'JName') [Komurka]
+
+02/18
+ * Updated Chung_E's drops a bit according to recent info, it had the same [MasterOfMuppets]
+ drops as Sohees before.
+ * Violy Card fix [Komurka]
+ * Updated effects of 585,Brusti, 1263 Unholy Touch, 12133 McDonald's Ice Cone [Lupus]
+ & 12136 Women's Bundle
+02/17
+ - Updated skill_unit_db to use range 1 for all mines. The actual splash
+ range is now taken from skill_db. [Skotlex]
+ - Updated some skills who's NK should now be 3. Updated some splash ranges.
+ [Skotlex]
+02/16
+ * Added a new column in the skill_db to specify the
+ splash-range/area-of-effect of skills. [Skotlex]
+02/14
+ * Part 1 of Gravitys "Zeny Inflation Control Update" [Poki#3]
+ - All potion type drops from monsters are changed with Herbs (Excluding MvP Monsters).
+ Red Potions -> Red Herb
+ Orange Potion -> Yellow Herb
+ Yellow Potion -> Yellow Herb
+ White Potion -> White Herb
+ Green Potion -> Green Herb
+ - 'Mastela Fruit', dropped by 'Enchanted Peach Tree' monster, will be deleted.
+ You can buy it in Hugel.
+ - All Awakening Potions replaced with Grapes.
+ - All Berserk Potions replaced by Lemon.
+ * Jump Kick and High Jump now depend on the skill state ST_MOVE_ENABLE
+ [Skotlex]
+02/13
+ * Updated most mobs Summon Skills to use "OnSpawn" conditions. [Poki#3]
+ * Fixed exp.txt for Baby Dancer, thanks to Gepard [Komurka]
+
+02/10
+ * Enchanted Peach Tree supposed to move, thanks to Persian69 [Vicious]
+ * Clock's attack range is 2, thanks to Persian69 [Vicious]
+ * Fixed Valkyrie armors having no effect for Aco class, thanks to
+ a user from em-24.com [Vicious]
+ * Changed the max level of the NPC_BREAK skills to 10. Changed their
+ element to 0 and made them no damage skills. [Skotlex]
+ * Weapon Repair update. SP cost 30, Cast time 7.5 secs, interruptable. [Skotlex]
+02/09
+ * Modified Magnum break's delay to 0, time1 to 2 secs, time2 to 10 secs.
+ Time 1 is for the skill reuse delay, and time2 the weapon fire bonus time.
+ [Skotlex]
+02/06
+ * Changed Serin's Gold Ring Weight to 0 [Poki#3]
+
+02/05
+ * Merged most of the 'plug' items into the main item_db. [Skotlex]
+02/04
+ * Added monster skills and drops to Plasma(all types), Orc baby, green iguana. Thanks [MasterOfMuppets]
+ to Tharis for providing the info.
+02/02
+ * Added Playtester's Odin and Kiel Mobs. Added Valkyrie and missing Honunies. [Poki#3]
+02/01
+ * Falcon Assault only does one hit now. [Skotlex]
+01/31
+ * Changed Lady Tany's skills a bit and removed the CANWALK from her mode [MasterOfMuppets]
+ * Changed Vesper's mode to boss [MasterOfMuppets]
+01/30
+ * Revised the Thanatos Tower and Abyss Lakes monster's skills [MasterOfMuppets]
+ * Added monster drops to the Thanatos Tower and Abyss lake monsters [MasterOfMuppets]
+ * Fixed a lot of item names in item_db ;] [Poki#3]
+ * Fixed Dark Priest Card [Komurka]
+01/29
+ * Updated drops of Vesper [MasterOfMuppets]
+ * Changed the range of NPC_PETRIFYATTACK from 1 to 7 [MasterOfMuppets]
+ * Added monster skills to the odin temple monsters [MasterOfMuppets]
+ * Updated Vesper's and orc baby's monster skills [MasterOfMuppets]
+ * Vesper will now spawn Apocalypses as slaves [MasterOfMuppets]
+ * Lowered the drop rate of peridots by apocalypses, they are no longer minibosses. [MasterOfMuppets]
+ * Updated some cards according to tests: Icreased a bit chance of Gift Box / OBB /OVB drops [Lupus]
+ Raggler Card Combo(2x), Mimic Card(2x), Mystcase Card(8x)
+ * Updated Mystcase Card: When Raggler Card Cmbo is set, it stops dropping Gift Boxes [Lupus]
+ Because it starts dropping OVBs
+ * Updated the stats, exp, jexp, hp, def, mdef, atk of all the Thanatos tower [MasterOfMuppets]
+ & Abyss lake monsters and Banana Lady Tanee using information from the official
+ kRO guide book. Thanks to saycyber21 for the scans. However FERUS and FERUS_ was missing =(
+ * Updated Vesper a bit and changed some drops for the venatus [MasterOfMuppets]
+01/28
+ * Added two missing zeros to Pharaoh's database line, thanks to Persian69 [MasterOfMuppets]
+ * Removed the looting modes of all the Lighthalzen monsters, why were [MasterOfMuppets]
+ they there anyway o_0
+ * Changed Apocalips_H's jname to Vesper [MasterOfMuppets]
+ - Switched two dimik drops with eachother
+01/27
+ * Updated Branches [Poki#3]
+ * Fixed mob skill entries of AL_PNEUMA for Kiel. [Skotlex]
+ * Updated EXP,JEXP and ATK of the Kiel dungeon monsters. [MasterOfMuppets]
+ * Removed emperium from Pharaoh's drop list. [Kayla]
+ * Added monster skills to the kiel dungeon monsters [MasterOfMuppets]
+ * Changed SKEGGIOLD monster #1755 to SKEGGIOLD_ so you can separate them [MasterOfMuppets]
+
+01/26
+ * Changed Sunflower Pin's DEF from 0 do 1 (27/01 kRO Patch) [Poki#3]
+ * Rearanged the new items in item_db. they should be chacked and placed in the right spot [Poki#3]
+ * Cleared up some Custom Mobs and their skills. [Poki#3]
+ * Changed Fire Poring's ID to 1239 and moved him to mob_db2. [Poki#3]
+ * Changed some Mob Names, based on kRO. [Poki#3]
+ * Ygnizem (Boss) now summons the G_ mobs. This should be done to all MvP's [Poki#3]
+ * Changed Kavac's Range to 9 and Katrinn and Magaleta's Range to 1. [Poki#3]
+ * Added the missing Bazerald drop to Pharaoh at 0.8% [MasterOfMuppets]
+ * Changed ASC_BREAKER range from 9 to 5 cells, according to skill
+ description available in translation project [Foruken]
+
+01/25
+ * TK_RUN's cast time is now 1 sec (it was previously 5:4:3:2:1 ms, the
+ heck? someone refix it if it was supposed to be 5000:4000:3000:2000:1000)
+ [Skotlex]
+ * Fixed a few item scripts (SC_ATKPOT -> SC_ATKPOTION) [Skotlex]
+ * checked mob_skill_db.txt and mob_skill_db2.txt under DOS, removed strange ASCII chars
+ - hope it's fixed now [Komurka]
+
+01/24
+ * removed unneeded comma in produce_db.txt (someday I'm gonna write parser for eA scripts ~~) [Komurka]
+ * card fix (>77 changed to >=77) thanks to Poki#3 [Komurka]
+
+01/21
+ * Added/removed some commas in mob_skill_db.txt [Komurka]
+ - Added mob_skill_db2.txt
+ * Fixed Chase Walk SP usage (40->10) thanks to poorboy [Komurka]
+ * Fixed Crab Card's Combo Bonus: Wind Element -> Water, thanks to Irmin [Lupus]
+ * Fixed 'Box of Heavy Rain' [Komurka]
+
+01/20
+ * Changed Double Strafe, Arrow Shower and Beast Strafing's delay to be
+ 100ms on top of the normal attack delay. [Skotlex]
+01/19
+ * Updated db/const.txt to contain all SC_ effects as defined in status.h.
+ Thanks to Ancyker. [Skotlex]
+ - Updated item_db.txt as a few SC_ have had their names changed.
+ - It may be necessary to remove a few entries which make no sense to add,
+ but that can be done later.
+01/16
+ * Corrected Roundkick's knockback? [Vicious]
+01/14
+ * Mode change on some monsters [Vicious]
+ * Updated Packet DB a bit [Vicious]
+ * Updated the race, size, HP and modes of the Kiel monsters [MasterOfMuppets]
+01/12
+ * Fixed Baby Leopard by.. ppl. [Vicious]
+ * Temp Odin monsters, by Azazel [Vicious]
+ * Zipper Bear Card and Baby Leopard Card do not protect against stripping.
+ Done by DracoRPG [Vicious]
+01/10
+ * Fixed Mighty Staff to drain 2SP per attack rather than 2% [Skotlex]
+01/09
+ * Refixed GrandCross's script (bonus2->bonus) [Skotlex
+01/08
+ * Changed Grand Cross's script to drain 1 sp per hit rather than 1% [Skotlex]
+ * Added the Kiel dungeon monsters, they have no stats yet though [MasterOfMuppets]
+ * Changed the name of Chung E to Green Maiden [MasterOfMuppets]
+ * Changed the name of Zherlthsh to Zealotus as in iRO, [MasterOfMuppets]
+ you should thank me for that ;D
+ * Now Mammonite is usable by all weapons. [Skotlex]
+01/07
+ * Santa's Bag type 0->2, some potions type 2->0 [Lupus]
+ * Item DB correction. [Vicious]
+01/05
+ * Fixed item updates by jsk225. [Vicious]
+ * Item updates by Landarma. Need updates. [Vicious]
+01/03
+ * SL_KAUPE skill times info to skill_cast_db. [Skotlex]
+ * Added SL_SWOO, SL_SKE, SL_SKA skill times information to skill_cast_db.
+ [Skotlex]
+ * Set nk to 2 (splash damage) to Meteor Assault and Raging Thrust [Skotlex]
+01/02
+ * Added active guild skills to skill_castnodex_db [Skotlex]
+01/01
+ * Corrected char name filter? [Vicious]
+12/31
+ * Updated Absorb spirit spheres to be interruptible. [Skotlex]
+ * Updated some mobskills for the einbroch monsters [MasterOfMuppets]
+12/30
+ * Removed some maps from mapflag that were not in either maps_athena nor map_index. [Vicious]
+ * Updated the active guild skill cast times to 5 secs. Now their time2 is
+ used as cool-down (300000 -> 5 mins). Also made them interruptable. [Skotlex]
+12/28
+ * Added Kahai and Kaite spell times to skill_cast_db [Skotlex]
+ * Removed Guilds Glory from guild skill tree [Komurka]
+ * Moved some THQ items [Komurka]
+ * Fixed duplicate the_sign [DracoRPG]
+ * Fixed 2 name inconstitencies in item_db, thanks to Haplo [DracoRPG]
+ * Added SC_Intravision to Sunshine Box and const list [DracoRPG]
+ * Cleaned up even further, no conflict should occur now [DracoRPG]
+12/27
+ * Reverted Draco's cleanup [Komurka]
+ * Small cleanup in item names [DracoRPG]
+12/24
+ * Changed Dokkaebi to Dokebi, by Harbin [Vicious]
+ * Removed the item requirements for Twilight Pharmacy from
+ skill_require_db, since the requirements are acquired from produce_db.txt
+ [Skotlex]
+ * Moved the sell price of the Tuxedo to the buy column (21500->43000) [Skotlex]
+12/23
+ * Corrected the Critical Race bonus of the Sabbath and cleaned up the
+ script of Morphicious' Hood. [Skotlex]
+ * Added 1 sec cast time to Stone Curse [Komurka]
+ * Added missing Amon Ra skills (he won't be so lame anymore) [Komurka]
+ * Some fixes thx to Poki#3 [Komurka]
+ * Desert Wolf Babe -> Baby Desert Wolf (iRO), thx to Poki#3 [Komurka]
+ * Fixed the drops of RSX 0806, thanks to Poki#3 [MasterOfMuppets]
+12/22
+ * Added back the changebase script to Tuxedo. [Skotlex]
+ * Changed the autospell chance of Lude card from 2% to 20%. [MasterOfMuppets]
+ * Changed pest card to get its additional bonus if you have 77 int or [MasterOfMuppets]
+ higher instead of 77 and higher.
+12/21
+ * Item_DB update for Tuesday's kRO sakray update. Temp plugs. [Vicious]
+ - THQ Quest Items needs new item number!!!!
+
+12/20
+ * Set up some basic skill info for SKA/SKE/SWOO [Skotlex]
+ * Moved item requirements for Aqua Benedicta to produce_db. [Skotlex]
+ * A small fix to sucsamad [MasterOfMuppets]
+ * Moved item requirements for Create Deadly Poison from skill_require_db to
+ produce_db [Skotlex]
+12/19
+ * Jewel sword will now drop jewels as intended, fixed a typo in sucsamad, [MasterOfMuppets]
+ thanks to Ishizu-chan.
+ * Fixed 1613,Mighty Staff to give 10 str instead of 15. [Kayla]
+12/18
+ * Updated 1725,Wondering Bard's Bow applicable jobs and item bonus [Lupus]
+12/17
+ * Removed 10% Neutral Damage Resistance from Golden Gear [Komurka]
+12/16
+ * Added effects to 12112,Tropical_Sograt and 12113,Vermilion_the_Beach. Thanks to persian69 [Lupus]
+ * Fixed Treasure Box 30 (Payon Castle 5) drops Mage Hat (the green one), where it should drop Magician Hat instead (the cylinder hat), thanks 2Ishuzu-chan
+12/13
+ * Modified a bit a few skills in skill_db to enable mobs to properly use
+ them. [Skotlex]
+ * Fixed G_BAPHOMET_ to show up as "Baphomet" instead of "Baphomet Jr." [MasterOfMuppets]
+12/12
+ * Slotted Elemental Armors can be worn by anyone except novice. [Vicious]
+ * Updated packet_db for /taekwon [Vicious]
+ * Added SL_KAIZEL data to skill_cast_db.txt/skill_cast_nodex_db.txt [Skotlex]
+ * Updated some KA skill info in skill_db, thanks to Reddozen. [Skotlex]
+ * Fixed some items, such as Kafra Ring. Also updated accessaries.
+ Novices/Super Novices are not allowed to wear lots of accessaries. [Vicious]
+ * Changed available jobs for some items. If it is wrong job...
+ Blame Item'o'luper since I used it. XD Doubt it is wrong though. [Vicious]
+ * Changed Marionette's blowcount to 0 rather than 1... [Skotlex]
+ * Added EOL before '//SG_FUSION#Union of the Sun, Moon and Stars#' in skill_tree.txt [Komurka]
+ Dunno what's wrong but ... before server hasn't been reading SG_FUSION skill at all -.-
+12/11
+ * Corrected again the mvp exp percent of Lighthalzen bosses (max is 10000
+ = 100%, why was it set to 700000? Made 7000 = 70%) [Skotlex]
+ * TKs, SGs and SLs should now be able to use berserk potions. [MasterOfMuppets]
+ * Added missing quantity value to Herb Tea With Grape Juice and Barbecue, thanks to Haplo [Lupus]
+12/10
+ * Removed V_poring from dead branch, it's a boss monster >.> [MasterOfMuppets]
+ * Added slot to angel's kiss [Kayla]
+ * Updated some items to allow soullinkers wear them, thanks to lunaus [MasterOfMuppets]
+ for all the work.
+ * Fixed the aftercast delay of lex divina, thanks to marquis007. [MasterOfMuppets]
+ * Updated the sell/buy price of some Homunculus related items [MasterOfMuppets]
+12/09
+ * Made Berserk Pitcher Potion-Pitcher-like. [Vicious]
+ * Fixed 5125, Angel's Kiss. Should be novice only. Good eye Kholdstare! [Kayla]
+ * Updated skill_db and skill_require_db info for Soul Linker skills, thanks
+ to Reddozen to provide the information. [Skotlex]
+ * Updated skill_db SL skills pl to -2 where appropiate (-2 = take
+ status-change's element, but not weapon's one -> For Warm Wind) [Skotlex]
+ * Added in skill data for SL_STIN/SL_STUN/SL_SMA [Skotlex]
+ * Updated skill_require_db to enable songs/dances to be performed with
+ either whips/musical instruments. [Skotlex]
+ * Added a bunch of Soul Linker skills to skill_castnodex_db.txt [Skotlex]
+12/08
+ * View ID changed for Luise's Santa's Hat from 208 to 20 (standard santa's hat)
+ because 208 isn't supported yet
+ * Corrected HT_POWER's number of hits (1->2) [Skotlex]
+ * Corrected G_Mobster's element, thanks to Haplo [Skotlex]
+ * Corrected Treasure Box element, now they are Neutral 1. [Skotlex]
+ * Modified Beast Strafing's inf to be a self skill (since it's a combo, it
+ auto selects target) [Skotlex]
+ * Updated Volet / Blue Box items lists [Lupus]
+ * Fixed 5131,Close_Helmet jobs [Lupus]
+ * Updated Warmth of the Sun / Warmth of the Moon / Warmth of the Star sp usage (20/20/10) [Komurka]
+ * Implemented the script of a few items. Need clarification of a few others
+ that need implementing (see above comments). [Skotlex]
+ * Updated the element of all treasure boxes to 21 (neutral 1) [Skotlex]
+12/07
+ * Updated inf2 to 2 (NPC skills) to the Abracadabra skills to prevent them
+ from displaying on the GM-all-skills menu. [Skotlex]
+ * Updated SG_*_WARM skills to have range 1. [Skotlex]
+ * Updated SG skills [Komurka]
+12/06
+ * Updated Berserk Pitcher in skill_require_db and Full Adrenaline Rush in
+ skill_db as per Reddozen's info. [Skotlex]
+ * Made Garm's Claw shadow property [Harbin]
+ * Added Thanatos to boss list [Harbin]
+12/05
+ * Fixed Succub+Incub Cards combo bonus -> +1 INT, thanks to Playtester [Lupus]
+ * Fixed Wings of Eagle Script (bSpeed no longer exists, it should be
+ bSpeedRate) [Skotlex]
+ * Fixed Meteor Storm (Was not requiring thunderstorm level 1) [Kayla]
+12/04
+ * Updated SL_SOULLINKER to have inf2 = 512 (cant' cast on self) [Skotlex]
+12/02
+ * Fixed Items according to Taekwon / Soul Linker / Star Gladiator [Lupus]
+ * Changed the requirment of Vulture's Eye for Falcon Assault [MasterOfMuppets]
+ from 10 to 5, thanks to Haplo.
+ * Fixed two typos in the mob_skill_db, thanks to Zubasa [MasterOfMuppets]
+ * Casting time for soul link [Vicious]
+ * Updated Marine Sphere skills in hopes to make it work correctly.
+12/01
+ * Changed TK_JUMPKICK's inf to self skill (to make it behave like extremity
+ fist) [Skotlex]
+ * Set Ki Explosion's stun time as time2 in skill_cast_db. [Skotlex]
+ * Lowered the MVP exp bonus from the bio lab dungeon bosses [MasterOfMuppets]
+ - fixed a typo in Erend's exp
+ * Corrected Venom Splasher's countdown duration. [Skotlex]
+ * Implementation of Reddozen's Soul Linker's DB [Vicious]
+11/30
+ * Added the last drops of the Bio lab dungeon bosses [MasterOfMuppets]
+ * Changed the attack range of Rafflesias to 7 [MasterOfMuppets]
+ * Cleaned up the item_db, checked and added the items previously added and
+ commented by Viccious. [Skotlex]
+ * Cleaned up the mob_db, corrected Lighthalzen Bosses MVP exp rate (the max
+ is 100%, why did you guys set 70000%? I changed that to 70%) [Skotlex]
+ * Cleaned up job_db2.txt by removing the unnecessary trailing 0's. [Skotlex]
+ * Fixed Antonio's defense (was 100, should be 99) [Kayla]
+ * Fixed CTM card affecting after-cast delay instead of castrate [Vicious]
+ * Fixed phen card affecting your after-cast delay instead of castrate, [MasterOfMuppets]
+ thanks to andz for pointing it out
+ * Mob_db update, added some more G_mobs and Xmas_Orc, thanks to [MasterOfMuppets]
+ Muad_dib
+ * Changed the range of NPC_CURSEATTACK and NPC_BLINDATTACK to 7, [MasterOfMuppets]
+ not sure whether it's supposed to be 7 or 9...
+ * Updated elemental-resist potions in produce_db, thanks to jsk225 [Vicious]
+ * Updated two-handed sword's weapon level in produce_db, thanks to piroJOKE. [Vicious]
+11/29
+ * Updated range of Phantasmic and Charge Arrow. [Skotlex]
+ * Correct ViewID for Cyclops Eye, Updated to-do [Vicious]
+ * Temp plug on new items. Someone check please. :D [Vicious]
+ * Updated skill ranges so that the range specified is always the skill
+ range regardless of sign. Those with negative range are now used for the
+ battle_config option skillrange_from_weapon [Skotlex]
+ * Updated Earth Elemental Convertor, thanks to reddozen [Vicious]
+ * Added temp skills to Ayothaya MVP Lady Tany. [Lupus]
+ Also added her real slaves, thanks to MasterOfMuppets for info
+ * Update produce_db.txt with cooking items coments, thanks to battousai90 [Lupus]
+11/28
+ * Lighthalzen MVP drop update done by MasterOfMuppets - Still need more work. [Vicious]
+ * Reduced the range of Focused Arrow Strike by 10, that range should be
+ added via the Vulture skill. [Skotlex]
+ * Updated skill ranges for Alchemist and Monk, thanks to Komurka. [Skotlex]
+11/27
+ * Added Sonic Blow to skill_castnodex so that the skill delay applies to
+ walking as well. [Skotlex]
+ * Fixed Adrenaline2 and Berserk Pitcher's inf2 (were not set to spirit
+ skill) [Skotlex]
+ * Reverted Ruwach's range to 2. [Skotlex]
+ * Updated skill_db to make all ranged skills with range 8 become 9. Also
+ explained wtf is "maxcount" in skill_db. [Skotlex]
+ * Fixed SA skills showing up. wtf is "maxcount" in skill_db??? [Vicious]
+11/26
+ * Updated effect boxes, according to RO Magazine [Vicious]
+ * Updated Redemptio(no target, not dex-effected) [Vicious]
+ * Updated blowcount on 2nd class quest skills [Vicious]
+ * Updated sell prices on new items [Vicious]
+ * Updated Great Axe to give +5 skillblown to Mammonite, and BonGun card +5
+ knockback to Bash [Skotlex]
+ * Changed the range of Blitz Beat and Falcon Assault to 5 [Skotlex]
+ (Vulture Eye bonus is now applied to these skills)
+11/25
+ * Updated skill ranges of Rogue and Priest skills, thanks to Komurka
+ for the information. [Skotlex]
+ * Updated skill ranges of Assassin and Crusader skills, thanks to Komurka
+ for the information. [Skotlex]
+11/24
+ * Updated skill ranges of Hunter and Knight skills, thanks to Komurka for
+ the packet information. [Skotlex]
+11/22
+ * Lowered the required ammount of oridecon needed to craft gladiuses by 4, [MasterOfMuppets]
+ thanks to andz for pointing it out.
+ * Updated the Range of Provoke, Bowling Bash. Retouched the range of Spear
+ Stab to be +2 of current weapon rather than 4. [Skotlex]
+ * Reupdated the mob skill db (some mobs had mode change-target which is
+ obsolete now) [Skotlex]
+ * Merged in Komurka's latest update to the mob_skill_db.txt [Skotlex]
+ * Updated Firewall's knockback to 2. [Skotlex]
+ * Updated the job bonuses for a bunch of jobs, thanks to Haplo for going
+ through the kRO job bonus db. [Skotlex]
+ * Fixed g_bloody_butterfly - 1526, thanks to Zoc for finding it [Kayla]
+11/21
+ * Changed a Coma effect. Thanks to Luna. [Nexon]
+ * Updated joblevel stat bonuses of Soullinker and Star Gladiator, thanks to reddozen [MasterOfMuppets]
+ * Massive Reddozen's update of mix-food recipes, also made all Cooking Sets Produce 11; [Lupus]
+ * Made more food/Potion items type 0, fixed typo [Lupus]
+ * Updated rafflesia's mode to make it change-target. [Skotlex]
+11/20
+ * Changed all mixed food type to 0 - FOOD (healing items) [Lupus]
+ * Updated mob_db with the mode data from Kyoki and added mob entries 1521
+ 1581. [Skotlex]
+ * Added that bonus INT to Sage/Baby Sage on Job Level 38 [Skotlex]
+ * Updated the monster DB to use all the new modes, all credits to Kyoki [MasterOfMuppets]
+ * Adjusted drops/speed of the Einbroch monsters according to iRO [MasterOfMuppets]
+ * Fixed Skeleton Manteau not having it's bonuses, thanks to reddozen & vicious_pucca [MasterOfMuppets]
+ * Mjolnir can now only be used by merchant/swordsman classes [MasterOfMuppets]
+11/18
+ * Fixed Tao Gunka's Slaves -> Megaliths again [Lupus]
+ * Fixed the Elemental Resist potions. [Skotlex]
+11/17
+ * Updated the mob skill database to use the new conditions angry and follow [MasterOfMuppets]
+ now it also changed the modes of monsters using emotes, all credits goes
+ to Komurka for the database work.
+ * Added 5135,Cyclops_Eye with temp view ID [Lupus]
+ * Changed the drop rate of house auger from lord of death to 0.8% [MasterOfMuppets]
+ * Made Brooch of cursed fortune give +6 crit instead of +6% crit, [MasterOfMuppets]
+ thanks to vicious_pucca.
+11/15
+ * Replaced all Cards' bAtk bonuses with bBaseAtk, thanks to Vicious_Pucca for pointing it out [Lupus]
+ * Taekwon skill updates [DracoRPG]
+ * Fixed bonus of 2356,Holy_Cloth_of_Benefit, thx to vicious_pucca [Lupus]
+ * Made Arrow Shower a land-based skill. [Skotlex]
+ * Changed Moonlight Petal's range to 3, this is used for the sheltering
+ range of the skill. [Skotlex]
+ * Updated 2356,Holy_Cloth_of_Benefit effect [Lupus]
+11/14
+ * Added sell price to pot and fixed the shop, thanks to vicious_pucca [MasterOfMuppets]
+ * Updated some more food prices [MasterOfMuppets]
+ - Also added a few of the shops selling food items, pot isn't sold atm though
+ I'll try to find it's price tomorrow.
+ * Made Ruwach's element Holy as pointed out by k3dt. [Skotlex]
+11/13
+ * Updated some buy prices to food items, thanks to reddozen and vicious_pucca [MasterOfMuppets]
+11/12
+ * Fixed pumpkin hat. Halloween is over, so is the item's status boosts. [Nexon]
+11/09
+ * Fixed alice and zherlths(whatever)s taming items which were swaped [MasterOfMuppets]
+ thanks to Poki#3 for fixing it.
+ * Updated metalings drop rates, based on 100 killed metalings [MasterOfMuppets]
+ in iRO, I will kill more some other time to get more accurate results
+ mob_db.txt update: [Lupus]
+ - Added Solid Trunks into Willow drops (fixed % rate of other trunks)
+ - Removed ALL slaves cards drops from mini-boss drops
+ - Removed Zorro Mask from goblins drops (added it into Wrapped Masks Box)
+ - Updated some Goblins drops: Added Surprized Mask, Annoyed Mask, Gangsters Mask
+ - all the rest masks you could get from Wrapped Masks Box
+ * Updated the drops of the normal advanced class monsters in lighthalzen. [MasterOfMuppets]
+ Thanks to reddozen for fine tuning them
+ * Made Maya Purple card to compound on headgear isntead of accessory, [MasterOfMuppets]
+ thanks to reddozen.
+ - Added red chili to Kraben's monster drops.
+ * Corrected Venom Knife's poison duration. [Skotlex]
+ * Fixed dumpling child card dropping meat and giving an additional heal effect to meat
+ instead of candy, thanks to Komurka. [MasterOfMuppets]
+ * Added a few monster drops related to cooking, thanks to reddozen and vicious_pucca [MasterOfMuppets]
+ - Cook books 6~10, various ingredients for cooking and legendary cooking set.
+ * Updated db/const.txt as per the new SC changes, thanks to Silent. [Skotlex]
+11/08
+ * Added cook books, lvl 1~5 to item_trade.txt to prevent exploits [MasterOfMuppets]
+ * Updated job_db1.txt information for Taekwon/Star Gladiator and Soul
+ Linker. Thanks to... Reddozen, I think (data was taken from the Taekwon
+ Thread) [Skotlex]
+ * Fixed Mobster Card bonus, thanks to tattatheng [Lupus]
+11/07
+ * Copied skills from Jakk to Christmas Jakk which was missing monster skills [MasterOfMuppets]
+ * Added Metaling to mob_poring.txt [MasterOfMuppets]
+ * Updated Mimic Card & Mystcase Card bonuses & Raggler Card [Combo bonus = OVB Drop] chances: [Lupus]
+ according to kRO formula (found by real tests): chance = 1 * (killed_mob_level/10) + 1
+ PS I've killed tons of mobs and tested these cards [Lupus]
+11/06
+ * Fixed Marse and Rocker cards missing effects [MasterOfMuppets]
+ * Updated item_db2.txt (new format), thanks to Justin84 [Lupus]
+11/05
+ * Changed some item names for preparing the sign quest [MasterOfMuppets]
+ * Reverted Doppelganger's aspd value to 10, it is the correct value [MasterOfMuppets]
+ do not change it again.
+ * Updated alot of weapons, thanks to reddozen and vicious_pucca [MasterOfMuppets]
+11/04
+ * Added the enchant effect to Cursed water [MasterOfMuppets]
+ - Changed fake angels droprate of cursed water to 3% and added cursed water to
+ drop from violys at 10%
+ * Added Angel wing to old blue boxes and old violet boxes [MasterOfMuppets]
+11/03
+ * Added slots to Garm's claw, hard covered book and wool cap, thanks to Gyunwoo23
+ - Made shoes unequipable for novices and a small update for the skill DB.
+ * Added Venom Knife requirement to the skill Venom Knife. Still won't check
+ for a Venom Knife to be equipped as arrow, but it will consume it at least.
+ [Skotlex]
+ * Made Ki Translation usable on party-mates only (inf2&1024) [Skotlex]
+ * Added empty bottles to the Elemental-resist potions recipes, thanks to reddozen [MasterOfMuppets]
+10/31
+ * More updates to new quest skills. [DracoRPG]
+ * Added Elemental-resist Potions recipe, thanks to RockManEXE. [DracoRPG]
+ * Added Embryo recipe, updated Homonculus skill tree. [DracoRPG]
+ * Many updates about new quest skills. [DracoRPG]
+ * Added missing ()s to Sage's Diary script. [DracoRPG]
+10/30
+ * Updated Venom Knife price -> 50z [Lupus]
+ * Updated const.txt to reflect changes in source, thanks to Silent. [DracoRPG]
+10/29
+ * Added 2nd jobs quest skills to skill_tree. [DracoRPG]
+ * Updated current food recipes and added more of them, at the moment
+ we'll keep all of them as itemlv 11. [DracoRPG]
+10/28
+ * Changed pole axe's dex bonus to 1, thanks to Maxsia for pointing it out [MasterOfMuppets]
+ * Added apple drop to Ancient mimic to prevent steal exploiting, thanks to Irmin [MasterOfMuppets]
+ * Added a few missing loot sell prices [MasterOfMuppets]
+ * Thanx to Justin84, added misssing names of 2 skills in skill_tree.txt (HW_GANBANTEIN,HW_GRAVITATION) [Lupus]
+10/27
+ * Fixed the ammount of guild exp beeing given by Tribal Solidarity, credits goes to irmin [MasterOfMuppets]
+ * Fixed Glittering Clothes' script. [Skotlex]
+10/24
+ * Added cursed water to be dropped by fake angel [MasterOfMuppets]
+ * Reverted the inf 32 mode for Heaven's Drive and Arrow Shower [Skotlex]
+ * Added Thanatos/Abyss MOb skills and changed some thanatos/abyss mob stats.
+ Thanks to Vicious_Pucca, Poki#3 and erKURITA. [Nexon]
+ * Added inf 32 (can target traps) to Arrow Shower and Heaven's Drive. I
+ hope it doesn't messes up the client... but this is how it should be since
+ those skills CAN hit traps [Skotlex]
+ * Fixed Poison Toad Card - Now equips on Accessory [Kayla]
+ * Changed Investigate's range to 2. [Skotlex]
+ * Added GrimTooth to skill_cast_db, time2 is the duration of the stop
+ effect. [Skotlex]
+10/23
+ * Fixed the Weapon coma rate script of Lord of Death Card [Skotlex]
+ * Fixed type in Moonlight Dagger script. [Skotlex]
+ * Updated Mini Furnace to be produce 21 since that's the new index for
+ rough material refinements. [Skotlex]
+ * Changed Moonlight dagger to be steal 3 sp per hit, not 3% [Skotlex]
+ * Added healing effect to mixed foods, added produce effect to cooking sets [DracoRPG]
+ * Updated Poring V's mode, thanks to Vicious Pucca. [Skotlex]
+ * Updated castle_db.txt for correct work on /guildbreak [Lupus]
+10/22
+ * Changed Extremity Fist and Investigate's range to 3. [Skotlex]
+ * Bumped Magaleta's heal levels to 9 and 10. [Skotlex]
+10/19
+ * Corrected a bunch of spells that should be "no overlap" in skill_unit_db.
+ [Skotlex]
+ * Added Arrow Vulcan to skill_castnodex.txt to specify you shouldn't be
+ able to walk during the skill's delay. [Skotlex]
+ * Gave normal Magaleta a stronger heal (Lv1 is kinda sad...), also made her
+ cast heal 10 on nearby friends when their HP drops below 60% [Skotlex]
+ * Double bug fix: 4303,Whisper_Boss_Card [Lupus]
+ - Fixed wrong Poki's card desc.. and found.. that we weren't adding 3% MaxHP... but +3
+ * Added new item. Thanks to Landarma. And Fixed an old item stat. [Nexon]
+ * Added a few more loot sell prices to the einbroch items [MasterOfMuppets]
+ * Corrected NPC_STOP, it should have at least range 1 (currently range 8
+ for lack of better info) and inf should be 1 (attack skill) not 4
+ (used on self). Also changed it's time to 10secs as 2sec is really too
+ low. [Skotlex]
+ * Fixed constants for Karma and Manner in db/const.txt, thanks to orn. [Skotlex]
+10/18
+ * More translations for japanese comments, again thanks to sighel. [MasterOfMuppets]
+ * Updated Thanatos' mode to include boss-type (Thanatos and several of the
+ mobs in the same dungeon are supposed to be looters? That's what I read
+ from here). [Skotlex]
+ * Changed DEF of Guard to 3, according to Komurka and andz report
+ [Foruken]
+
+10/17
+ * Re-fixed Gravition's range to 8. [Skotlex]
+ * Some mob skill updates regarding the advanced classes in Lighthalzen. [Skotlex]
+ - Removed Sanctuary from Magaleta, removed advanced skills from mobs.
+ - Raised Frost Diver's rate for Katrinn, reduced rate of Sight Trasher.
+ * Updated the item_db to use BaseClass comparisons rather than those
+ callfunc("is class") functions. [Skotlex]
+ * Updated some items so that Atk and Matk potions specify their duration in
+ ms rather than seconds (standarizes with all other sc_start items) [Skotlex]
+ * Added translations for japanese comments, thanks to sighel. [MasterOfMuppets]
+ The following files had translations added:
+ - abra_db.txt
+ - attr_fix.txt
+ - exp_guild.txt
+ - skill_cast_db.txt
+ - skill_db.txt
+10/16
+ * Updated some stats of Lady Tanee, thanks to gyunwoo23 [MasterOfMuppets]
+10/15
+ * Fixed 2 mobs having wrong stats. [Nexon]
+10/14
+ * Some changes to Katrinn's mobskills as pointed out by Viccious and
+ Lonyaph, also changed her mode to aggressive + assist. [Skotlex]
+ * Updated Gravitation's range to 8. [Skotlex]
+ * Corrected mob skill name for Lighthalzen bosses (do not call
+ NPC_CALLSLAVE 'NPC_SUMMONSLAVE' they are different things) [Skotlex]
+ * Changed Envenom's element to poison... [Skotlex]
+ * Updated Envenom: Range 3, number of hits 1. [Skotlex]
+10/13
+ * Updated the monster skills of the lighthalzen dungeon bosses [MasterOfMuppets]
+ * Updated monsters drops [Lupus]
+ -Evil Snake Lord <- Hellfire,
+ -Inc.Samurai <- Azoth,
+ - Garm <- MVP drop% fix
+ * Lowered ancient mimic's droprate of bloody branch to 0.01% to prevent exploits [MasterOfMuppets]
+ - Fixed Elder's drops a bit
+ * Updated Call Partner's time to 20 secs (after which time the partner is
+ recalled), also set the skill's unit target to 'noone'. [Skotlex]
+ * Fixed Lude card casting endure on enemies instead of self [MasterOfMuppets]
+10/12
+ * Updated defense, mode, element, speed and attack speed of some Lighthalzen mobs,
+ per info provided ny Viccious. [Skotlex]
+ * Updated a bit the Lighthalzen mob stats using data provided by Viccious
+ Pucca [Skotlex]
+ * Updated item_db: Added books to equipable weapons of Star Gladiator,
+ added Staffs as equipables for Soul Linker, and added to SG the armor they
+ can wear (boots, manteau, spiky headband and Goat helm, I think). Also made
+ the Vesper Core accesories equippable only by advanced classes. [Skotlex]
+ * Added Reverse Orcish to skill_cast_db.txt, upkeep time is the orc curse
+ duration. Set to 20 mins for now. [Skotlex]
+ * Fixed typo AllStat -> Allstats, thanx 2L0wFlea_sq [Lupus]
+ * Fixed: LunarBow[1]->[2], Coif Req/Jobs, Cinquedia Req/Equip Lvl thanx 2 persian69 [Lupus]
+ * Corrected g_katrinn and g_shecil's element. [Skotlex]
+10/11
+ * Fixed Zherlthsh + Injustice Combo bonus (was giving that bonus 2 times... +1 more bug V_V ) [Lupus]
+ - Checked all combo cards bonuses: There's no similiar bug! ^_-
+ * Updated Ancient Mummy card effect, thanks to irmin for info [Lupus]
+ * Changed Envenom's range to 2. [Skotlex]
+ * Fixed Awakening Potion's usable jobs, I think. [Skotlex]
+ * Updated the whole item_db to allow TaekWon, Star Gladiator and Soul
+ Linker to use items. [Skotlex]
+ - Weapons were not touched.
+ - The following job_codes were updated to include all 3 new classes:
+ - All Jobs but Novice (2088958 -> 119529470)
+ - All Jobs but novice+acolyte class (2055918 -> 119496430)
+ - All Jobs (10477567 -> 127918079)
+ - All Jobs but acolyte class (10444527 -> 127885039)
+ - Also added them to awakening potion's job listing.
+ - Lupus's previous updated had to be reverted so this replacement worked :P
+ - Someone tell me which weapons these classes could use so I can update that too?
+ * Fixed some item classes restrictions, fixed Concentration Potion, Awakening Potion, thanks to andz [Lupus]
+ - there's one prob left: Cap and Cap_ headgears
+ * Added new items [Landarma]
+10/10
+ * Enabled Poring V and commented out Fire Poring in the mob db. [Skotlex]
+ * Added Poring V to the mob db, altough it is currently commented as it
+ collides with Fire Poring's ID. [Skotlex]
+ * Corrected ArchAngeling card (needing 78 instead of 77 luk), Maya Card
+ (magic damage return 30->50%) and Grand Cross (HP Drain -> SP Drain)
+ [Skotlex]
+ * Changed Mirror Shield's mdef to 5. [Skotlex]
+ * Changed GrandCross's duration to 900ms (changes nothing as the three hits
+ still happen at 0, 400 and 800ms) [Skotlex]
+10/09
+ * Fixed a few mob skills and mob stats. Thanks to MasterOfMuppets. [Nexon]
+ * Fixed a few items having wrong stats. Thanks to Maud Dib. [Nexon]
+10/08
+ * Added missing ; at Bunny Slippers in item_db.txt. [Mass Zero]
+ * Made a small change to Item_db. [Nexon]
+ * Added Magic Scrolls drops, updated walkspeed of Kaho thanks to MasterOfMuppets [Lupus]
+10/07
+ * Fixed a small error in Rawrel's stats. [Nexon]
+ * Added a small change to Whikebain's drops. [Nexon]
+ * Updated Mob drops and Lighthalzen exp gain. Thanks to MasterOfMuppets and Viccious_Pucca [Nexon]
+ * Updated Item sell/buy price. [Nexon]
+ * Added a new skill to a mob. [Nexon]
+10/06
+ * Updated the HP level of the normal second class mobs (as per info
+ provided through Viccious Pucca) [Skotlex]
+ * Added "The Sign" to item_trade.txt (as per info provided through
+ Viccious), also made it add +5% atk. [Skotlex]
+ * Corrected the item_trade.txt restrictions for Novice Potion (why you
+ couldn't place it in your cart, or sell it? o.O) [Skotlex]
+ * Corrected G_Magaleta's elemental mode. [Skotlex]
+ * Corrected Envenom's max skill level (7->10), and changed the attribute to
+ poison. [Skotlex]
+ * Corrected Bloody Butterfly card so it doesn't makes spells
+ uninterruptable in WoE. [Skotlex]
+ * Added skill data for various skills (second class quest skills and
+ several Tae-Kwon related jobs. All the info was acquired by Draco from
+ jA's information. [Skotlex]
+ * Made Spiral Pierce non-interruptable. [Skotlex]
+ * Implemented 4198,Maya_Purple_Card effect. Thanks to jA team! [Lupus]
+ - There's a special Intravision timer also. So that "Box to see hidden mobs" could be implemented now
+10/05
+ * Updated new items from kRO. Thanks to Landarma. [Nexon]
+ * Fixed 2 Mobs, thanks to MasterOfMuppets [Nexon]
+ * Added back Grandcross's 20% HP cost. [Skotlex]
+ * Updated Grandcross's Casting time, and Blast Mine's duration. [Skotlex]
+ * Updated meltdown's cast time to 0.5 at lv1, 1.0 secs at lv 10. Still
+ unconfirmed, but it's much more likely than the alleged 0.05~0.10secs.
+ [Skotlex]
+ * Updated #2415,Bunny_Slippers. Thanx to noobs [Lupus]
+10/04
+ * Fixed some items with wrong weight/ stats. Thanks to mrmagoo [Nexon]
+ * Changed Savage Babe Card and Savage Babe to Savage Bebe Card and Savage Bebe. [Nexon]
+ * Removed the flags from Spider Web, now it can be stacked and placed
+ underneath characters. [Skotlex]
+10/03
+ * Updated Thanatos/Abyss monster info. Still in need of stats. [Nexon]
+ * Updated the skill info on NPC_DARKCROSS [Skotlex]
+ * Updated Lighthalzen mobs and mob skills as per Master of Muppets provided
+ info. [Skotlex]
+ * Updated Ygnizem's slaves to be the other 5 first classes. [Skotlex]
+10/02
+ * PVP drop item - 7420 Skull... costs 0z. Replaced exploitable bone drop with skull drop [Lupus]
+ * Fixed effect of #5092,Coif (aka Blue Coif) (removed +100 SP) and set its sell price (it's sold in Pront.church) [Lupus]
+10/01
+ * Fixed Effect of #2614,Eye of Dullahan (100% Poison Protection) according to some FAQ and tests [Lupus]
+ - Don't add it into the item desc (that should remain as '....')
+ * Added Orc Baby to Orcs in mob_race2_db [DracoRPG]
+09/30
+ * Changed Acid Terror's bleed time to 120 secs (seems to be the official
+ value) [Skotlex]
+ * Updated Meteor Assaults upkeep time2. Lv1 is the duration of blind, Lv2
+ is the duration of stun, and Lv3 is the duration of bleeding. However, the
+ true duration for these stats is as of yet unknown. [Skotlex]
+09/27
+ * Changed lord of vermillion times to make it hit four times at times 0,
+ 1250ms, 2500ms and 3750ms. [Skotlex]
+ * Fixed Thanatos Mobs. Thanks to andz [Nexon]
+ * Added missing bonus +5 Int to Excalibur [Lupus]
+ * Fixed drop rate of Emperium: [Lupus]
+ Pharaoh 5.5% (there was a typo), Abyss Knight 0.3%, Zherlthsh 0.15%, Gryphon 0.25%
+09/26
+ * Restored sell prices of Feather&Sticky Webfoot, thx to Dr.Evil for note [Lupus]
+ * Updated some Lighthalzen mobs drops and skills, thanks to MasterOfMuppets
+ * Updated Einbroch mobs drops, thanks to MasterOfMuppets
+ * Fixed Tengu Drops (removed 2nd Mr.Smile) [Lupus]
+09/23
+ * Updated Lighthalzen mobs.[Nexon]
+ - Some still need to be implemented.
+ * Updated const.txt with new emotes.[Nexon]
+ - Skotlex told me to.
+09/22
+ * Updated the item_db file, now the sell column is used. Those items that
+ had buy price 20 and sell price blank now have buy price blanka nd sell
+ price sell. Likewise, all etc items got their buy price removed and placed
+ in the sell price column (price halved, obviously) [Skotlex]
+ - I recommend following this new recommendation unless someone comes up
+ with a better idea (well someone had to use the sell column eventually :P)
+ * Corrected 1562#Textbook on Battlefield: Chance of Bless = 1% [Lupus]
+ - Fixed Banana Hat: Now 3% chance of Provoke lvl3
+ - Bow Thimble doesn't work as it should (core issue, to be revised soon)
+ * Added 2 new items (thanks to Landarma) [Lupus]
+ * According to Einbroch updates, changed Emperium drops: [Lupus]
+ (Mob name, Mob Lvl, Chance%) '-' = Removed drop, '+' = added drop
+ Angelring, 20 0.4 Baphomet, 81 5% Ghostring, 18 0.3%
+ Orc Zombie, 24 0.01 Requiem, 35 0.01 Shining Plant, 1 0.01
+ + Abyss Knight, 79 3% + Gryphon, 72 2% + Maya, 81 4%
+ + Orc Lord, 74 2.5% + Osiris, 78, 3% + Pharaoh, 93, 5.5%
+ + Zherlthsh. 63, 1%
+ - Golden Thief Bug - Mimic - Werewolf
+ * Fixed drops of Abyss Knight (2 kinds of Broad Swords) [Lupus]
+ * Added some notes to Lighthalzen Monsters. Should be revised, thanks to persian69 for the info [Lupus]
+09/21
+ * Fixed a few cards having wrong setting. Doppelganger, Mobster, Zherlthsh Cards and others all work correctly now.[Nexon]
+ * Fixed weapons not having correct attributes and status boosters.[Nexon]
+ * Added a few new items, thanks to Landarma.[Nexon]
+ * Added Mr.Smile to 1405#Tengu drops. Also!!! Removed Mr.Smile Quest! [Lupus]
+ * Added Assassin Mask into Inc.Samurai drops (0.4%) [Lupus]
+09/19
+ * Thanks to MasterOfMuppets: Fixed drop rate of minerals [Lupus]
+ - Fixed some Niflheim mobs range and speed, re-fixed Increase Soil walk speed, Kind of Beetle mode.
+ * Thanx to mrmagoo: item #1356, fixed weight. #5126 delayrate change applies to Advanced Classes only [Lupus]
+ - It could be also interpreted as "For Advanced Classes Magic Scills". But then we'd have to add a special flag....
+ * Removed Whisper Card drop from Giant Whisper. Only mini-bosses could carry 2 cards. Now Giant Whisper has its own card [Lupus]
+ - Why Giant Whisper's size - SMALL ? Any info?
+ * Thx2MasterOfMuppets: Fixed some items prices [Lupus]
+ - Sorry, Skotlex, we can't merge OpenOffice Sheets, let's switch them in some TXT format for SVN merging [Lupus]
+09/18
+ * produce_db.txt corrected Halberd / Damascus ingredients [Lupus]
+ according to 13th Sept kRO desc, thanks to andz
+ * Corrected range of Hunter's Detect skill
+ * Removed Apple-Plugs (512,0%) drops from the monsters [Lupus]
+ * Updated Leaf Cat's walkspeed (now faster, thx2 MasterOfMuppets) [Lupus]
+09/16
+ * Corrected the duration of the resist potions. [Skotlex]
+ * Added constants to const.txt to identify Elements and Race. [Skotlex]
+ ^^^^ they are pretty fine [Lupus]
+ * Added effects for Resist Element items. Temporal duration: 3 mins. [Skotlex]
+09/15
+ * Removed inf2 128 (trap) from Quagmire, Sphere Mine and Demonstration as
+ they are not really traps (all ground based skills with trap mode can be
+ targetted) [Skotlex]
+ * Updated WE_BABY to cost 10% of Baby's max SP (thanks again to Viccious
+ Pucca). [Skotlex]
+ * Updated Venom Knife's stats, has the stats of an arrow now and is
+ equippable only by Assassin. It probably won't work right yet as
+ eA will demand the sin to use a bow. [Skotlex]
+ * Corrected the base exp requirement for level 99 advanced classes (it's
+ supposed to be 343210000 exp), thanks to Viccious Pucca. [Skotlex]
+ * Changed uptime2 of dance/song skills, these are now used to determine how
+ long the effect lasts after you've walked out of the skill's area of
+ effect, so they were all set to 20 secs. [Skotlex]
+ * Updated 1617,Wand_of_Survival and 1619,Wand_of_Survival__ to give 2 instead of 3 (to DEX and INT) [Lupus]
+09/13
+ * Updated mobs stats (mostly Einbroch) thanks to MasterOfMuppets,Viccious Pucca [Lupus]
+ * Multiplied all drain rates x10 (100% leech rate is now 1000) [Skotlex]
+ * Immaterial sword now drains 30% of target's sp on a 0.1% rate (info from
+ Viccious Pucca). [Skotlex]
+ * Updated bDrainValue bonuses to be bonus2/bonus3 (they don't take a "rate"
+ parameter anymore) [Skotlex]
+ * Multiplied all autospell rates x10 (100% casting rate is now 1000) [Skotlex]
+ * Weapons that had autospell rates of 25% have been reduced to 9% (seems to
+ be that way from the data gathered by Viccious) [Skotlex]
+ * Added Range of Devotion/Sacrifice to skill_db, likewise, added the
+ effect's duration to skill_cast_db [Skotlex]
+ * Added new monsters with poring stats, thanks to Freya [Lupus]
+ * Added skill_unit flag 0x80 (UF_DUALMODE) for skills that trigger both
+ interval effects and onout/onplace events (by default, if a skill has a
+ interval such as Apple of Idun, then the routines when you step in/out of
+ the skill cells won't be called). Applied flag to Apple of Idun and
+ Gravitation. [Skotlex]
+ * Changed Basilica's interval to -1. [Skotlex]
+ * Added new items, thanks to Landarma [Lupus]
+09/12
+ * Corrected job_db1 hp-factor for Advanced Classes. [Skotlex]
+ * Updated drops of Myst,Bloody Butterfly,Disguise,Goblin Leader (All thanks to MasterOfMuppets) [Lupus]
+ - Updated items prices
+ - Lighthalzen monsters call up to 5 slaves now, added their drops with temp rates (thanks to Azazel)
+09/11
+ * Fixed target of NPC_KEEPING skills. [Skotlex]
+ * Changed Wand of Hermod's target to ally (party+guildmates) [Skotlex]
+ * Added/Updated some items sell prices (All thanks to MasterOfMuppets) [Lupus]
+ - Added missing slot to Coif_(ex Nuns Hat). Dark Lord now has it as a MVP drop 10%
+ - 1072#KAHO drops burning hearts instead of stone hearts
+ - Added common weapons of Bard/Dancer into OBB/OVVB
+ * Added temp mob skills to all Lighthalzen mobs by Azazel [Lupus]
+ * Increased movement speed of 1516,INCREASE_SOIL (checked it on the official servers) [MasterOfMuppets]
+ * Drooping Cat now can be upgradeable (proved by some official servers) [Lupus]
+ * Temporary made Lighthalzen (Juperos) mobs aggressive to prevent abuse. Till we get their real stats/skills [Lupus]
+ * Fixed some monsters names to Aegis compatible format (should be useful for some spawn/ mobs skills convertors) [Lupus]
+09/10
+ * 2647,Nile_Rose now gives only +10 MaxHP (each event item loses its bonuses after awhile) [Lupus]
+ * Added missing official prices to Louyang (mostly) items. Thanks to MasterOfMuppets [Lupus]
+09/09
+ * Added some of the missing mob skills that Komurka claims don't work on eA
+ yet. These will be tested and debugged at a later date. [Skotlex]
+ * Small fix to the self-destruction skill of Marine Sphere as pointed out
+ by Komurka [Skotlex]
+ * Fixed the alchemist related skills for marine sphere from rate 10% to
+ rate 100% [Skotlex]
+09/08
+ * Fixed some songs/dances's target (changed it from "all " to "all") [Skotlex]
+ * Readded the mob skills NPC_RANDOMMOVE and NPC_SELFDESTRUCTION to the
+ Marine Sphere (which were lost on Komurka's last update to mob_skill_db)
+ [Skotlex]
+ * Since the Lighthalzen mobs don't have accurate stats, but accurate
+ HP/Atk/Exp, their stats have been bumped to 75 all (and luk 99) to avoid
+ abusers until their correct stats can be figured out. [Skotlex]
+ * Updated/corrected the header information of skill_db.txt
+ * Reverted LoV and Storm Gust's range to 6 and 5 respectively as
+ empirically tested by Ishizu [Skotlex]
+09/07
+ * Added new flags to ground units: UF_NOPC, UF_NOMOB, adjusted accordingly
+ on song/dances that affect everyone except mobs. [Skotlex]
+09/06
+ * Changed in the skill_tree the mysterious value 4 that somehow slipped in
+ as a skillrequirement for WE_CALLBABY. [Skotlex]
+ * Changed Magic Crasher and Pressure's nk to 0 [Skotlex]
+ NOTE: nk=2 is for splash damage skills and 1 for "no damage" skills. This
+ info is never sent to the client, so there's no reason we should deviate
+ from that convention.
+ * Added effects to new items: [Lupus]
+ - #12107,Wrapped Mask: You get 1 random mask (Mr.Smile,Mr.Scream,Phantom Opera Mask,all set of Expressionless,Surprised,etc masks)
+ - #12106,Jewel Case: You get 1 random accessory (Ring,Clip,etc. Rogue's Treasure, Bow Timble, Fashion Hipsack. Excluding some overpowered and quests accessories)
+ - TEMP PLUG: #12111 Warpped Food: (You get 1 meat, 1 raw fish, 1 fruit)
+ * Added new items, thanks to Landarma [Lupus]
+09/04
+ * Changed B.Something Sacramenti's range from 1 to 9. [Skotlex]
+ (9 is what I have in the descriptions, and it can't be more wrong than 1
+ anyway)
+ * Added missing +60 SP bonus to the Quve+Lude Card Combo [Lupus]
+ * Changed Rich Man Kim's target from party to enemy. [Skotlex]
+ (it is now a SC that inflicts the mob, and when it dies applies on the
+ exp it gives)
+09/02
+ * Changed Firewall's knockback to 1. [Skotlex]
+09/01
+ * Fixed Taekwon's Fighting Chant max level, thanks to [DracoRPG]
+ * Added specific status changes for cooked foods' stats bonuses [DracoRPG]
+08/31
+ * Reverted traps to target "enemy", hardcoded to become "all" on gvg
+ grounds. [Skotlex]
+ * Changed all traps to have target "all" (data from Viccious Pucca) [Skotlex]
+ * Updated SP costs and durations of Assumptio (thanks to Viccious Pucca)
+ [Skotlex]
+ * Updated range of Lord of Vermillion (changed to 5->11x11) and Storm Gust
+ (changed to 4->9x9) [Skotlex]
+08/30
+ * Added item groups for Taming Items, Quivers and Scrolls [Skotlex]
+ * Implemented Taming_Item_Giftset, Bundle_of_Spells, First_Aid_Box [Skotlex]
+ * 'Fixed' Cramp Card. Gives +10z per mob level on a 3% success chance. [Skotlex]
+ * Added Violin[4] #1902 into OVB, into Violy Drops (0.1%). Probably some of new drops
+ have chance more than 0.01%, too [Lupus]
+ * Fixed some items names spelling. Thx2Erpirata [Lupus]
+ * Added new items thx 2Landarma. I've made Venom Knife as a ETC item atm. [Lupus]
+08/28
+ * Added job bonuses for Taekwon, thanks to RockmanEXE [DracoRPG]
+ * Changed appearance of some DBs, now they have more friendly (and ENGLISH) headers, this
+ was initiated by Vedurin whose redesigned and updated skill_cast_db, produce_db and
+ create_arrow_db are also included in this change, thanks to him ^^ [DracoRPG]
+ * Changed Acid Demonstration's element from fire to neutral. [Skotlex]
+08/27
+ * Cleaned up the item_db.txt file, moved item comments to this file [Skotlex]
+ * Updated const.txt with correct Taekwon-class job IDs [DracoRPG]
+08/25
+ * Updated slots in Sage's diary to 2. [Skotlex]
+ * Updated Mobs drops: Dancing Dragon, Civil Servant, Tao Gunka, Kraben by
+ MasterOfMuppets [Lupus]
+ * Changed Acid Demonstration from a "weapon" type skill to "misc". [Skotlex]
+ * Updated Demonstration to not stack and not be placeable near enemies. [Skotlex]
+ * Updated max number of spider webs to 3. [Skotlex]
+ * Updated Full Strip's casting time to 0. [Skotlex]
+08/24
+ * Updated Shield Chain's cool-down to 1 sec. [Skotlex]
+ * Updated summon spirit sphere's casting time to 1sec (all over the place
+ it says Zen's casting is twice SSS, and everywhere we also read that Zen's
+ cast is 2 secs, so add both together...) [Skotlex]
+08/23
+ * Fixed Sacrificial Ritual requiring Endure LV5 instead of LV1 [Skotlex]
+ * Updated the mob skill database. When specifying Metamorphosis/Transformation,
+ use the skilllv to indicate how many alternatives there are (for example, an
+ ant egg would use metamorphosis level 3 as it can convert to Andre, Deniro or
+ Pierre) [Skotlex]
+ * Set the permilliage (use rate) of Metamorphosis to 50 (0.5%) on all mobs
+ that had it specified at 0.
+ * Updated the skill delay from Breaker (thanks to Vicious Pucca) [Skotlex]
+ * Lowered Elder Willow's trunk drop rate from 35% to 3.5% [Skotlex]
+ * Changed Ghoul's race from 11 (unknown?) to 1 (undead). [Skotlex]
+ * Updated Deviling's mode to make him count as a boss/miniboss. [Skotlex]
+ * Corrected Spring Rabbit card improving candy-type item healing rates [Skotlex]
+ (should be meat type since that's what it makes mobs drop)
+ * Updated buy/sell prices of some Louyang Drops (thanks to Ishizu) [Skotlex]
+08/22
+ * Reverted magnum break... it is supposed to be fire element :/ [Skotlex]
+ * Updated casting times and delays of Soul Strike & Napalm Beat, range of
+ Ruwach/Sight (thanks to Vicious Pucca) [Skotlex]
+ * Updated Magnum Break's element (takes weapon), the fire part is hardcoded. [Skotlex]
+ * Removed the temp plug from Cramp Card as it seems it's way too powerful [DracoRPG]
+ * Updated skill_tree,job_db1 and job_db2 for new system and Taekwon support [DracoRPG]
+ * Moved MVPs from mob_branch.txt to mob_boss.txt (those that had yet to be
+ moved, that is) [Skotlex]
+ * Added target flag "ally" to skill_unit_db [Skotlex]
+ * Added 0.5 sec delay to Aid Potion, 1 sec casting time & delay to Aid Condensed Potion
+ (from kRO website, thanks to reddozen and vicious_pucca) [DracoRPG]
+ * Removed UF_NOFOOTSET from Ice Wall (I have several sources for that) [DracoRPG]
+ * Removed slot from nile_rose (All stats +5, event version), added slot to nile_rose_
+ (MaxHP +10, permanent version) [DracoRPG]
+ * Added complete (except TK_MISSION) Taekwon skill tree & skill DBs entries [DracoRPG]
+08/19
+ * Fixed Double Attack's pl not being -1 (take weapon's element) [Skotlex]
+08/18
+ * Changed sell price of unknown test tube to 0 as it can be abused for a
+ zeny exploit (thanks to Kayla for pointing it out) [Skotlex]
+ * Changes to Immaterial Sword (drain 1SP, not 1%SP per attack)
+ * Fixed Battleground Textbook, Greatest General Card to cast on yourself
+ (again) [Skotlex]
+ * Changed Emperium to Holy 1 / Angel [DracoRPG]
+ * Changed (again!) Gloria Domini to 'misc' [DracoRPG]
+ * Changed pl of all 'weapon' attack skills that take weapon's element from '0' to '-1',
+ according to the new system. Also changed type of various skills. [DracoRPG]
+ * Bah, refixed Owl Duke Card/Enchanted Peach Tree. [Skotlex]
+ The last value of bonus4 bAutoSpell defines target (0 = self, 1 = enemy)
+ * Added new items, thanks to Landarma [Lupus
+08/17
+ * Changed back Soul Collect/Zen's casting time to 2 sec... [Skotlex]
+ * Changed Gloria Domini & Martyr's Reckogning from 'magic' to 'weapon', Battle Chant from
+ 'magic' to 'misc' [DracoRPG]
+ * Added IDs of Taekwon and its 2nd jobs to const.txt [DracoRPG]
+ * Added and fixed effects of some boxes [DracoRPG]
+ * Changed Heirozoist Card to have same chance as Azoth (3%), seems better [DracoRPG]
+ * Dropped Kobold Archer's Hat drop to 0.01% (it was left to 1% by an accident) [Lupus]
+08/16
+ * Reverted Magnum Break to be self-centered... [Skotlex]
+ * Corrected Teleport cost (thanks to k3dt) [Skotlex]
+ * Updated Heirozoist card to have a 0.1% chance of converting mob class
+ instead of 0.01% [Skotlex]
+08/15
+ * Changed Magnum break's inf to 1 (normal targetted skill) [Skotlex]
+ * Made Kraben agressive and much faster [Skotlex]
+ (info from Ishizu)
+ * Updated some Ayothaya loot prices [Skotlex]
+ (thanks to Ishizu)
+ * Corrected the uptime for SA_AUTOSPELL [Skotlex]
+ (thanks to HarmonySong)
+08/11
+ * Updated refine items for Damascus (thanks to Ishizu) [Skotlex]
+ * Updated Zen's (Hyper Spirit Sphere) casting time to 3 secs as per the kro
+ skilldesctable.txt file. [Skotlex]
+ * Updated Guardians to be BOSS types (their mode was changed to 165 from 133) [Skotlex]
+ Report any problems from this (just make sure you have some sort of
+ source to rely on).
+08/09
+ * Updated Enchanted Peach Tree, Owl Duke and Greatest General
+ to have their auto-spell casted on themselves rather than the enemy [Skotlex]
+ (I don't have the data at hand, so if any of these should actually cast
+ on the enemy, please correct it).
+ * Updated Battlefield Textbook to cast Bless on yourself, not the enemy. [Skotlex]
+ * Added new mobs, thanks to Death Dealer [Lupus]
+ * Added new items, thanx to Landarma [Lupus]
+ * Fixed Lunar Bow bonus [Lupus]
+ * Added effect to Novice Hood [Lupus]
+ * Fixed Freezer Card combo (was doing Weapon Perfection on the enemy) [Skotlex]
+08/05
+ * Fixed price of Ghost Doll (from Freya)
+ * Reverted Earth Deleter Card to 10SP [Lupus]
+ HINT! HINT! HINT!
+ How to check false items/cards bonuses reports? Just open latest korean idnum2itemdesctable.txt
+ And check numbers in the item desc 8)))
+ * Updated Fireball cast times and delay [Skotlex]
+ * Updated SP cost of Stone Curae [Skotlex]
+08/04
+ * Updated mobs 1006 (Thief Bug Larva), 1393 (G Mummy), 1394 (G Zombie), and
+ 1407 (Dokebi) to be Level 1 and have max HP 1, otherwise the new mob db
+ loading system will complain about them. [Skotlex]
+ * Added new mobs: Green Iguana, Orc Baby, updated and added some items. Thanks to Landarma [Lupus]
+ Thanks to Erpirata for pointing me some tiny typos.
+08/02
+ * Reduced Soul Burn's after cast to 0 (the 15sec delay for reusing the
+ skill is already hardcoded) [Skotlex]
+07/31
+ * Updated throw stone's range to 7, delay 100ms [Skotlex]
+ * Updated Steel Body to require 50% sp [Skotlex]
+07/29
+ * Removed Poison Bottle (item lv256) from produce_db [DracoRPG]
+ * Changed NPC_CURSEATTACK and NPC_ENERGYDRAIN to Dark attribute [DracoRPG]
+ * Changed mobs with NPC_STOP to cast it on target [DracoRPG]
+ * Changed Cart Termination to use "cartboost" state in skill_require_db [DracoRPG]
+ * Modified Hip Shaker/Ugly Dance's unit data to make it work every 3 secs [Skotlex]
+ * Okay, reduced the Call Partner's uptime from 10 secs to 0. [Skotlex]
+ * Changed Soul Collect/Summon Spirit Sphere type from weapon to none. [Skotlex]
+07/28
+ * Added baby skills delays, added them into nocastdex.txt [Lupus]
+ * Updated the Wedding skills: They cost 10% HP/SP and grand 10% HP/SP of
+ their partner's sp. Also the recall partner skill has a casttime of 20secs
+ not diminishable by dex. [Skotlex]
+ * Massive skills update (from now updated kRO website) [DracoRPG]
+ - Blitz Beat : casting time changed to 1.5 sec
+ - Falcon Assault : casting time / after-cast delay changed to 1 sec / 3 sec
+ - Focused Arrow Strike : after-cast delay changed to 1.5 sec
+ - Wind Walker : after-cast delay changed to 2 sec, casting time can be reduced by DEX
+ - Meteor Assault : casting time / after-cast delay changed to 0.5 sec / 0.5 sec
+ - Gloria Domini : after-cast delay changed to 2~4 sec
+ * Fixed "Greatest General Card" now casts the correct skill level [Fredzilla]
+07/26
+ * Changed the inf2 of Marionette Control to 512 + 1024 (can't cast on self
+ + party only) [Skotlex]
+ * Changed the inf2 of Providence/Resistant Souls to 512 (can't cast on self) [Skotlex]
+ * Changed the inf2 of Devotion/Sacrifice to 3524 (512 -can't cast on self-
+ + 1024+2048 (party/guild only)) [Skotlex]
+ * Reverted Palm Strike's cast-time to 0 (the skill's code has been updated
+ so it is not needed now) [Skotlex]
+ * Fixed skill-tree requirements of Soul Burn and Mind Breaker as described
+ by Ishizu. [Skotlex]
+ * Fixed drop rates of all god-equipment-quest items from Treasure Boxes, they were 10x
+ too high!! (lowered from '80'=0.8% to '8'=0.08%) [DracoRPG]
+ * Changed Weapon Repair to targetted with range 2 [DracoRPG]
+ * Made real effect of Textbook on Battlefield. Fixed skill ID.[Lupus]
+ * New Items. Thanx to Landarma & Erpirata [Lupus]
+07/25
+ * New items. Thanx to Landarma [Lupus]
+ * Few item names have been fixed. Added drops to Evil Snake Lord, Injustice.
+ thanks to MasterOfMuppets [Lupus]
+07/24
+ * Changed the endow spell's inf2 to 3072 (party only/guild only) [Skotlex]
+07/20
+ * Changed Bow Thimble damage bonus to 3% (trustworthy-looking ragnainfo source) [DracoRPG]
+ * Removed job_db2-2 and rewritten + UPDATED job_db2 for the new system [DracoRPG]
+07/18
+ * A silly me, Palm Strike's delay before taking effect is 1s, not 1.5 ^^' [Skotlex]
+ * Changed Double Attack's list_num (div) to 2. [Skotlex]
+ * Added Palm Strike to the "skill_castnodex" file. [Skotlex]
+ * Changed Palm Strike's casting time to 1500ms (this value is used as the
+ delay between doing the skill and the damage taking effect) [Skotlex]
+ * Updated Gospel's uptime2 to 60 secs (that's how long the bonuses should
+ affect) [Skotlex]
+07/13
+ * Changed Wand of Hermod's skill_unit_setting from 'friend' to 'party' [Skotlex]
+ (this should make the skill affect only party (and guild?) mates instead
+ of all players in normal maps)
+07/11
+ * Reduced Einbroch mobs (RSX,Ungoliatnt) call-slave skill chance from 10000 (100%) to (10%) [Lupus]
+ * Added the Loli Ruri card to the magician set [Skotlex]
+ * Changed Guild Castles' names to iRO [DracoRPG]
+07/10
+ * Fixed Lord of Death mob (added house auger), added correct MVP exp to Tao Gunka,
+ RSX 0806, thanks to MasterOfMuppets [Lupus]
+ * Reduced drop chance of Galapago, Banana Hat, etc hats (acc. the patch) [Lupus]
+ * Due to adding (thanx to Muad_dib) Lighthalzen fields mobs spawn. I had to change
+ temp Mole stats to Martin. But Mole has its own hat drop [Lupus]
+ * Lighthalzen fields mobs spawn. thanx to Muad_dib
+ * Edited skill_castnodex_db [DracoRPG]
+ - Enabled DEX-reduced casting time on Blitz Beat, Falcon Assault and Sharp Shooting
+ (Lupus told me to do, so blame him, not me :p)
+ - Removed the skills that only had a non-DEX-reduced after-cast delay since DEX
+ shouldn't reduce after-cast delays anyway (only useful for custom servers who want to
+ enable delay_dependon_dex but it's not our matter)
+07/09
+ * Fixed SP usage of PALMSTRIKE, SPIRAL PIERCE [Lupus]
+ I do always open the latest korean patch and get ACTUAL numbers from there ^^
+ * Added delays to Falcon Assault (1 sec for 1lvl,2,3,4,5sec for 5lvl)
+ according to desc.
+ * Fixed Aura Blade (now requires Magnum Break LV 5) [Lupus]
+ * Updated Palm Strike's sp cost and sphere requirement [Skotlex]
+ (info provided by ZeroXell)
+ * Fixed Apocalypse (guild) mob id. [Skotlex]
+ * Awakening Potions now cure 'Sleep' [Skotlex]
+
+07/08
+ * Wedding/Adoption skill's inf2 has been changed to 4 (Wedding Skills) [Skotlex]
+ (Deja vu? Somehow I did not do it last time I said I did)
+ * Added the Adoption skills to the skill_require_db [Skotlex]
+ They use basic stats for now and sp cost 1 so you can cast it.
+ * Reverted the wedding rings behaviour. [Skotlex]
+ * Wedding/Adoption skill's inf2 has been changed to 4 (Wedding Skills) [Skotlex]
+ * Added the adoption skills to the tree of all classes [Skotlex]
+ (WE_CALLPARENT, WE_BABY to baby classes, WE_CALLBABY to all others)
+ * Updated the Wedding Rings to give the adoption parent skill. [Skotlex]
+ * Einbroch monsters obtained some new drops, thanx to MasterOfMuppet [Lupus]
+ * Added drops: Super Novice Hat[1]->Mole 0.1%, Soldier Felt Hat[1]->Removal 0.1% [Lupus]
+ * MasterOfMuppet's fixes. According to kRO's website fixed: [Lupus]
+ ayothaya mobs with elemental attributes, race, size, temp speed and temp modes(ie aggressive, loot e.t.c)
+ einbroch mobs with elemental attributes, race, size, adjusted atk dmg,def,mdef,exp,jexp
+ * Added Lighthalzen monsters (with poring stats) and Homuculuses(as monsters), thanks to Muad Dib of Fusion.
+ I've added common stats to Bascojin&Chung_E monsters tough [Lupus]
+ * Fixed Bloody Roar item effect, thanks to Landarma [Lupus]
+ * Fixed Enchanted Peach Tree (Live Tree) Card to autocast Heal on self [DracoRPG]
+ * Added new effect to Winter Cap. thanks to Landarma [Lupus]
+07/07
+ * Changed Marionette's inf2 to 1024 (use only on party) [Skotlex]
+ * Changed Marionette's inf to 16 (targetted support skill) [Skotlex]
+ * Changed Soul-Change's inf2 to 3072 (use on party/guild only) [Skotlex]
+ Still not sure what's the proper way to enable it on pvp/gvg grounds, though...
+ * Fixed small typo with grandpa_beared thanks to N0_0N3. [massdriller]
+07/06
+ * Made Arrow Vulcan be affected by dex, delay unaffected by dex. [Skotlex]
+ (from what I read around on the forums, it seems that's how it is)
+ * Made Double Strafe, Arrow Shower cast time be affected by dex, and delay
+ be unaffected by dex. [Skotlex]
+ (hey, these two had 0 cast times already, so it was a waste the way it was)
+ * Changed Tao Gunka's mode to 163 (131+32) to make it a boss type mob [Skotlex]
+ * Changed Spider Web's inf to 2 so that it becomes ground-targeted [Skotlex]
+ * Added Novice Red Potion into item_trade.txt db. (can't be traded, etc) [Lupus]
+ * Removed Zealotus Mask drop from Zherlthsh (could be3 made as a quest only. And goes with Player's name prefix) [Lupus]
+ * Added missing Horns of Succubus drop (thx 2Lorky), added Angry Teeth drops to Teddy Bear + Hylozoist [Lupus]
+ * Few fixes in the new_hats_0625.txt quests [Lupus]
+ * Re-Fixed few mobs drops, thanks to MasterOfMuppets [Lupus]
+ * Added missing bonusrate = 1 into Bon Gun's petskillattack2 params [Lupus]
+07/04
+ * Added Marine Card effect,added minerals drops to various monsters (need for official lvl4 weapon quest!) thanks to MasterOfMuppets [Lupus]
+ * Fixed BonGun's pet script. [Skotlex]
+ * Fixed Li Me Mang Ryang Not Equipable bug thanks to vicious_pucca [massdriller]
+07/02
+ * Added missing ';' in Incubus Card script [DracoRPG]
+ * Updated mapflags. Added new hats drops to Kobold Archer, Wootan Fighter, Galapago [Lupus]
+ * Added Li Me Mang Ryang Card to OCA and to the drops [Lupus]
+ * Updated tons of cards, thanx to Landarma
+ Also fixed misplaced IDs od 4269 Incubus and 4268 Injustice cards [Lupus]
+ (everywhere, including card album, mobs drops, cards-combo bonus)
+!!!!WARNING!!!! check your servers for those cards. Remove them. They have different placements and could cause exploits!
+ * Fixed Succubus+Incubus card-combo bonus exploit. Thx 2DracoRPG [Lupus]
+ * Implemented Increase Soil card (compound to Armor) -50% DMG by Guardians [Lupus]
+ * Added temp plug to Cramp Card (on a mob kill now it gives you 1 zeny) [Lupus]
+ * Added packet_ver 18 by Sara-chan [Lupus]
+
+06/28
+ * Added "gld_dun01.gat 5" to water_height.txt as reported by Manipulator [Skotlex]
+ * Added Dryad Card effect, thx to MasterOfMuppets [Lupus]
+ * Fixed Land Protector's Range to be 7x7,7x7,9x9,9x9,11x11 [Skotlex]
+ * Made Lemon consumable (previous equip_jobs was 0), that was not on
+ purpose, right? [Skotlex]
+ * Added 2-sec aftercast-delay to sonic blows. Too many complains about double
+ casting it, and I really don't think it was meant to be doble-castable
+ either. [Skotlex]
+ * Added effects to new boxes (thanks to Landarma), added these boxes
+ as drops to new cards (thanks to MasterOfMuppets), fixed Taoist Card
+ placement [Lupus] TODO: revise all the cards
+06/23
+ * Corrected 3 of the new headgears in item DB, thanks to Ishizu-chan [celest]
+06/20
+ * Fixed some item_db typos [celest]
+ * Updated Thunderstorm range to 2 [celest]
+
+06/18
+ * Reverted Skotlex's work. [Lupus]
+ all 3 Lances differ by their ID (for quests purposes!)
+ There are 2 assassin masks: 5054 and 5096. They don't have any slots.
+ But they differ by applicable jobs: 5054 for Assassins + Priest Class
+ and 5096 is for ANY Thief Class (Thief,Assassin,Roug) + Priest Class
+ Plz, if you want, use ITEM_DB2.TXT for made-up items 8)
+ -- I can't argue on the assassin mask, and it's good that it was fixed. But
+ which quest uses the Lance (1411)? It must be a quest that is not
+ currently shipped with eA, because items 1411 and 1412 are NOT used
+ anywhere inside the NPC directory, and 1410 is only on some shops. I am
+ curious to know which Quest uses the 1411 lance...
+ Plus it doesn't seems to make any sense from a client-side view. "You
+ need the Lance that Doppel Drops, not another" (even thought they all
+ look and work exactly the same for the player x.X) [Skotlex]
+ * Changed slot-count for item 1411 (Lance_) from 0 to 1. [Skotlex]
+ I am not going to believe 0 is the real number for it considering that:
+ 1: You can't get it from any shop. (that id is nowhere in the npc files)
+ 2: Only DoppelGanger drops it, with a 5.5% chance.
+ * Added some new items (by Landarma), fixed recently added ones. [Lupus]
+06/11
+ * Changed Ungoliatnt Assumption skill's target to self from target [Skotlex]
+ * Updated skill_cast_db: Soul-Strike's casting time, Stone Curse's upkeep
+ time as per the information provided by Midas [Skotlex]
+ * Changed Sprinkle's Sand range from 8 to 1 (8??? o.O) [Skotlex]
+ * Changed Dark Illusion Card's bonus bDelayrate -> bonus bCastrate [DracoRPG]
+ * Added the new headgears and garments [DracoRPG]
+06/09
+ * Added inf2=64 to Benedictio. 64 now actually stands for "skill needs
+ other nearby support characters", or as the battle_config calls it
+ "ensemble skills". [Skotlex]
+ * Removed inf2 of Extremity Fist, it is harcoded for now. Inf2 values 4 and
+ 8 are free for the taking. What should they be for? Partner/Baby skills? [Skotlex]
+ * Added inf2 values: 32 (Dance/Song skills) & 64 (Encore skills).
+ (Encore skills don't need to be set as 96) [Skotlex]:
+ - Bard Skills set to inf2 32: BA_WHISTLE, BA_ASSASSINCROSS, BA_POEMBRAGI, BA_APPLEIDUN
+ - Dancer Skills set to inf2 32: DC_HUMMING, DC_DONTFORGETME,
+ DC_SERVICEFORYOU, DC_UGLYDANCE
+ - Encore Skills set to inf2 64: BD_LULLABY, BD_RICHMANKIM,
+ BD_DRUMBATTLEFIELD, BD_RINGNIBELUL, BD_INTOABYSS, BD_SIEGFRIED
+ - If I missed any skill, help me correct it, these inf2 values are not yet
+ used in the code, but that'll change soon.
+ * Added inf2 value 16 for Guild Skills, set all guild skills to have inf2
+ * Readded skills to items Electric Guitar, Firebrand & Ice Falchion [Skotlex]
+ * Some corrections to the skill_db.txt's nk value. [Skotlex]
+ - Storm Gust: 1->0
+ - Blitz-Beat: 1->2
+ * Removed magnum break's inf2=16 since it ain't used anywhere. [Skotlex]
+ * Fixed Ayothaya monsters drops and names thx 2 MasterOfMuppets [Lupus]
+06/06
+ * Corrected Ice Falchion, Firebrand, Electric Guitar [Skotlex]
+ These should not give you a skill-tree, only auto-cast the skill.
+ Ice Falc also has a 1% chance of freezing yourself.
+ * Removed the 20% HP cost of casting GrandCross.
+06/05
+ * Changed Grandcross/DarkCross's Interval from 300ms to 400ms [Skotlex]
+ This fixes GX doing 4 hits instead of 3.
+ * Added tons of new items, thanks to Landarma [DracoRPG]
+06/03
+ * Fixed 'Keeping' in the mob skill DB to be cast on self [celest]
+06/01
+ * Optimized a lot of new cards scripts [DracoRPG]
+ * Changed Deviling to receive 50% more damage from ALL elements but neutral, and not only Fire/Earth/Water/Wind [DracoRPG]
+ * Changed doppelganger card aspd bonus to 10% as it should be. [massdriller]
+ * Changed DoppelGanger card's attack speed increase to 30%. [Skotlex]
+ This card current does not stacks. If anyone knows of a valid source that
+ says otherwise, open a bug-report so it can be corrected.
+05/29
+ * Moved the card-status listing from item_db.txt to this file [Skotlex]
+ * Added the new column to item_db: refineable to specify which items can be refined. [Skotlex]
+ * Fixed Novices able to wear all "Every class except Novice" headgears, thanks to duduc [DracoRPG]
+05/28
+ * Added emotion constants to const.txt [Skotlex - R1853]
+ The constants mirror their command counter part (ie: /meh -> e_meh),
+ for the most part, except for the following:
+ e_gasp (/!), e_what (/?), e_cash (/$), e_dots (/...), e_no (/??),
+ e_hp (need HP), e_hlp (/hp, help emotion),
+ e_scissors (ctrl+-), e_rock (ctrl+=), e_paper (ctrl+\)
+ And the following flag-emotions are available:
+ e_korea, e_indonesia, e_philippines, e_usa, e_brazil
+ The whole point is being able to do in scripts "emotion e_wah;" instead
+ of "emotion 16;"
+05/25
+ * Fixed Peach Tree card, thanks to Komurka
+05/20
+ * Updated mob skill DB, thanks to Komurka
+05/17
+ * Corrected typo for sweet potato, thanks to maeki
+ * Switched Tirfing and Mystelltain card effects, thanks to starlon [DracoRPG]
+05/15
+ * Changed Hylozoist's race to demon, thanks to Dino9021
+ * Fixed Gajomart Card, thanks to starlon [DracoRPG]
+ * Added missing 'amount input' packet for Sakexe 05-09 [celest]
+05/12
+ * Added missing 'close storage' packet for Sakexe 05-09 [celest]
+05/11
+ * Updated item_db (all items with use_script "pet" or "itemskill") to use
+ the new type of item (11: delay-consumed usables) [Skotlex]
+ * Added the new G_ mobs with poring stats, thanks to Komurka
+05/10
+ * Changed 2005-05-09Sakexe's packet version to 17 [celest]
+ * Fixed Merchant Class Card Combo Set bug (it was always ON) [Lupus]
+ * Merchant Class Card Combo Set: added 0.1% Old Purple Box drop [Lupus]
+ * Archer Class Card Combo Set: added +5% EXP bonus on killing Brute [Lupus]
+ * Holy Class Card Combo Set: added +5% EXP bonus on killing Undead/Demon [Lupus]
+
+05/09
+ * Added INT +2 and Unbreakable to Crown of Mistress [DracoRPG]
+ * added Sara-chan's 18th packets update [Lupus]
+ * Added FULLY updated mobs skills DB by Komurka (up to Aegis Zone 8.5) [Lupus]
+ * Fixed drops of Antique Firelock (thanx 2 Freya) [Lupus]
+ * Added skills to Beetle King thanks to MasterOfMuppets [Lupus]
+ * Started updating monsters skills according to the recent servers
+ thanks to MasterOfMuppets [Lupus]
+05/08
+ * Fixed Whisper Boss card, thanks to sbilly
+ * Updated the packet db (removed some duplicates, corrected some packets),
+ thanks to glucose
+ * Removed Sword Mastery from Alchemist's skill tree :o [DracoRPG]
+05/06
+ * Fixed some genders for some FOOD. Added some new items into item_db. Thanks 2 Landarma [Lupus]
+05/04
+ * Added 1% Horse Crest drops to Greatest General, Sohee monsters [Lupus]
+ * Added implemented cards into card albums and to mobs drops [Lupus]
+ * Set Mimic Card, Mystcase Card bonus to 0.1% (it was 0.01%, they has been increased to 0.1% due recent patch)
+ But it isn't 1% for sure
+ ? Greatest General Card semms having wrong effect, tough 8) [Lupus]
+05/03
+ * Added missing item drop effects for some new cards [celest]
+ * Fixed Heater Card and Freezer Card [celest]
+05/02
+ * Fixed # of Deviling's slaves [Lupus]
+ * Fixed cards that use getrefine [celest]
+05/01
+ * Fixed skill tree entry for Potion Synthesis, thanks to shadow
+04/30
+ * fixed cards that required bExpAddRace,bSPGainRace,bLoseSPWhenUnequip by MasterOfMuppets [Lupus]
+04/29
+ * Re-added Spiral Pierce to Lord knight's skill tree
+ * Added missing Shield Chain to the skill tree, thanks to Komurka
+ * Fixed Harpy Card and Freezer Card, thanks to Komurka
+04/28
+ * Added effect for Dumpling Child and Hermit Plant card
+ * Changed Crab card to use 'isequipped' and fixed Rideword card
+04/27
+ * Added effect for Solar Sword
+04/26
+ * Fixed some items, thanks to Komurka and shadow
+ * Applied new advanced skills changes from 4/26 patch [DracoRPG]
+ * Reverted Arrow Shower / Double back to 0.1. Sorry! [Lupus]
+ * Started implementing missing card effects [Lupus]
+ * Added more mobs skills, thanx to MasterOfMuppets [Lupus]
+04/25
+ * Fixed Durian and Ramadan, thanks to rollopop
+04/23
+ * Fixed Red Scarf name, thanks to Sasuke [DracoRPG]
+ * Removed some extra 0's in the item_db, thanks to Zoc
+ * Added monsters skills to all Niflheim / Louyang monsters,
+ changed Garm slaves to Garm Bebe. Thanx to MasterOfMuppets
+ * Fixed Owl Duke Card, now casting IMPOSITIO on the card holder [Lupus]
+ * Panacea,Royal Jelly now remove Hallucination Effect. accord.to 10 May patch [Lupus]
+ * Hallucination Pills (Pellet) cause Hallucination Effect [Lupus]
+
+04/22
+ * Updated effects for Ahura Mazda, Gaia Sword, Freezer Card
+ * Added 4 items of THQ -> item_avail.txt [Lupus]
+ * Removed the Stun effect ????? on Sweet Potato, fixed Assulter Card script not in correct field [DracoRPG]
+ * Minor cards sets fixes [DracoRPG]
+ - Reverted some wrong Codemaster's if(callfunc("Is_xx_Class"))) => if(callfunc("Is_xx_Class"))==0) changes
+ - Fixed Thief cards set checking for Merchant class instead of Thief class
+04/20
+ * Added Thief cards set and fixed other ones, now they should all work [DracoRPG]
+ * Added Intravision item bonus [DracoRPG]
+ * Adding supported map cell types to const.txt [celest]
+ * Added summoned Geographers can heal their masters [celest]
+04/19
+ * Corrected skill tree entry for Peco lord knight's Berserk [celest]
+04/17
+ * Fixed "Every job except Novice" armors wearable by Novices [DracoRPG]
+04/16
+ * Corrected job bonuses for novice, super novice and dancer [celest]
+04/15
+ * Removed Raid not allowed in GvG (never seen it anywhere...) [DracoRPG]
+ * Added new items, thanx to Landarma [Lupus]
+04/12
+ * Added monsters skills and slaves to all Einbrook monsters, thx4info2 Landarma [Lupus]
+ * fixed Deviling and Lou-Yang monsters drops, thx2 MasterOfMuppets [Lupus]
+ * Added missing summon slaves to Deviling, Tao Gunka (correct # and type) [Lupus]
+ * Made Deviling, Tao Gunka aggressive (st - according to most DBs, 2nd - it's MVP)
+ * Corrected 1 wrong entry in the create arrow DB, thanks to Komurka
+04/08
+ * Corrected wrong entries in the create arrow DB, thanks to Komurka
+04/07
+ * Fixed materials for forging Lance : 1 Evil Horn -> 2 [DracoRPG]
+ * Fixed Sphinx Hat equip location [DracoRPG]
+04/06
+ * Added Einbrook monsters and drops, thanx to Landarma [Lupus]
+04/05
+ * Some items fixes [DracoRPG]
+ - added missing "Neko Mimi" hat #5099, thanks to Neko2
+ - fixed Wedding Rings item types, thank to nimrod
+ * Removed Evil Wings drops from Mini Demon,Deviruchi,Archangeling and put it into Deviling [Lupus]
+ according to kRO "Evil Wings" are dropped by Deviling only
+ Deviling items drop chances aren't correct yet
+ * Fixed skill tree entries for Vulcan Arrow, and Throw Arrow for gypsies,
+ thanks to Hekate
+04/04
+ * Removed required skills for Berserk (only job level 50 is needed) [DracoRPG]
+ * Re-added MDEF +15 to Resting Cat [DracoRPG]
+ * Added Sunglasses & Glasses into OBB, added slotted Sunglasses & Glasses into OVB [Lupus]
+04/03
+ * Doppelganger Card gives only 10% ASPD bonus (from Aegis) [DracoRPG]
+04/02
+ * More new cards and fixes [DracoRPG]
+ - added Acolyte, Archer and Merchant sets effects
+ - added Turtle General Card effect
+ - corrected Job_Super_Novice -> Job_SuperNovice for Lude and Quve Cards
+ - autospell weapons (except Fireblend, Ice Falchion and Electric Guitar)
+ give no more the skill so it can't be used when you want
+04/01
+ * New cards updates and additions [DracoRPG]
+ - added Mage and Swordman sets effects
+ - added Whisper Boss Card (not found the ID -> commented out)
+ - activated Turtle General Card but effect not yet scripted
+ - updated some effects from 3/17 patch
+03/31
+ * Updated/added some new card effects [DracoRPG]
+ * Reverted Berzebub card to reduce casting rate
+ * Corrected some item effects, thanks to digigp and htm
+ * Updated some cards effects from 3/25 patch [DracoRPG]
+ * Updated freeze time for Frost Diver and Frost Nova
+ * Updated cast time for Preserve, thanks to Neko2
+03/29
+ * Some optimizatons, added missing skill to Electric Guitar [Lupus]
+ * Added new items (thanx to Landarma) [Lupus]
+ * Added effects to Spring Rabbit, Galapago, Sea Otter Cards [Lupus]
+ It seems that item heal rate doesn't work yet
+03/27
+ * Re-Updated MOB DB with correct file now 8) [Lupus]
+ * Added all released cards into monsters drops and OCA [Lupus]
+ * Minor Items, Monsters fixes [Lupus]
+03/26
+ * Fixed some incorrect create arrow entries, thanks to boredpoo
+
+03/25
+ * Added Einbrook's mobs, thanks to RodneyJ for their IDs [Lupus]
+ * Removed some extra 0's in the item_db, thanks to Zoc
+ * Corrected some item effects according to the mentoned earlier doc [Lupus]
+03/24
+ * Corrected exp table entries for level 11 and 99, thanks to Dino9021
+ * Corrected some item effects according to the newly found Aegis Zone Server [DracoRPG]
+
+03/22
+ * Corrected some typos in the items DB, thanks to Zoc [celest]
+ * Added new items. Thanks to Landarma [Lupus]
+ * skill CANNIBALIZE: fixed its upkeep time [Lupus]
+ * Added Rafflesia into Dead Branch monsters list, removen all MVPs from there [Lupus]
+ DBs never supposed to call MVPs!!! Only Sages Hocus Pocus could make
+ a MVP from Alchemyst's Floras. (eA Hocus implementation doesn't support it yet)
+03/21
+ * Corrected exp table entries for Super Novice, thanks to Dino9021 [celest]
+
+03/19
+ * changed all cards to 'getrefine' function [Lupus]
+ * used 'cardscnt' instead of 'isequipped' in Crab Card.
+ It's a weapon compunding card. So it used to give up to
+ 6 bonuses! on Assassin with 4 4-slotted weapons.
+ Now it lets you get up to 2x bonuses per hand.
+ Should be fixed more. already got idea 8)
+ All the similar cards should be fixed in the same way.
+ * Fixed missing END; in new cards, some optimizatons [Lupus]
+03/18
+ * Updated item prices for Niflheim drops [celest]
+ * Updated some Ayothaya mob stats [celest]
+ * Fixed Incantation Samurai card reducing HP too quickly - the time should
+ be in milliseconds ^^; [celest]
+ * Added ~86 new cards. Fixed, optimized [Lupus]
+ Thanks to Indiona,Landarma. Gosh, I had to fix some bugz ^_-
+03/16
+ * Added new items. Thanks to Landarma [Lupus]
+03/15
+ * Fixed pricing for Claw, thanks to Dino9021 [celest]
+03/09
+ * Added new items. Thanks to Landarma [Lupus]
+02/23
+ * New Cards: Some fixes, revisions, additions [Lupus]
+ According to the latest news:
+ Fixed Tirfing, Mysteltainn (swapped enemy sizes of the cards bonuses)
+ Added bonus: Munak+Bongun+Hyegun Cards -> +1 Allstats
+ Added Alice Card placement. (also added it for Spring Rabbit, Galapago, Otter) And put Alice Card into OCA
+ can't add new effects for 22 Fed Update Cards yet.
+ All the cards by 22Feb have been revised, but not all tested.
+02/21
+ * Added new item: Takius' Blindfold. thanks to Landarma [Lupus]
+ * Revised New Cards, added missing effects, fixed bugs [Lupus]
+ ~20 cards to check left 8) But in 22 Feb some new cards have been announced T__T'
+ * Added actual item_db.sql into sql-files. [Lupus]
+ * item_db.txt: Added missing fields / removed extra fields from some new items V__V' [Lupus]
+ * More monsters name fixes (GIANT_HONET -> GIANT_HORNET , etc) [Lupus]
+ * Added actual mob_db.sql into sql-files. If you use SQL Mob DB then update it [Lupus]
+
+02/19
+ * Added released cards into the monsters drops. Fixed couple card names [Lupus]
+ (Arc Angeling -> Archangeling)
+
+02/18
+ * Added more new cards effects (thanks to DracoRPG at this time) [Lupus]
+ added missing bonus 'bAllStats' into doc/item_bonus.txt
+ * Changed Goblin Leader Card to using bAddRace2 -- each player can only save
+ 10 AddDamageClass, so this would save some space for other cards ^^ [celest]
+ * Started adding new cards effects. Also big thanks to Landarma [Lupus]
+
+02/17
+ * Added 4 columns into mob_db.txt & mob_db2.txt [Lupus]
+ If you were using SQL MOB DB, then update your SQL DB and import all data
+ from mob_db.txt mob_db2.txt
+ * Fixed some mobs drops Whisper + Boss Whissper had wrong drops %% [Lupus]
+ and Whisper had 0% Card drop...Also fixed all MVP mobs (MVP bonuses were shifted...
+ MVP EXP was missing, etc)
+ * Corrected Parrying lasting time, thanks to p14333 and krc2k for pointing it
+ out [celest]
+
+02/11
+ NOTE: Get rid of old cards on your server!!! IDs: 4149-4332
+ before using of this item_db.txt (some cards have changed their IDs)
+ and it could cause ALIEN cards in your players equipment 8))
+ i.g. a weapon compounding CARDS inserted in armor, etc...
+ * item_db.txt Massive update: [Lupus]
+ - Added all new missing items (up to st.Valentine's Day Event)
+ - Added new cards 4149-4332, sorted them and set their sripts.
+ - Fixed some names, typos, weigths and prices
+ * Commented out old custom cards from Old_Card_Album.txt till we brush them up [Lupus]
+ * Removed old custom cards from MOBs drops [Lupus]
+ thanks to Landarma(new items templates) Poki#3(removing cards from drops)
+ * Updated Soul Breaker cast and delay time, thanks to matthias [celest]
+ * Updated Chain Crush to require level 2 Tiger Fist, thanks to matthias for
+ pointing it out [celest]
+
+02/05
+ * item_db.txt Added prices to all Magic Scrolls and to Horse Crest,
+ added +100-1000 Zeny effect to Gold Coin (it's used in st.Patric event)
+ not sure in Zeny amount, tough. [Lupus]
+ * mob_db.txt Kind of Beetle -> Beetle King. [Lupus]
+
+01/26
+ * Updated Counter dagger's attack, thanks to Poki#3
+ * Added ayo_fild02 to nomemo mapflag list
+
+01/13
+ * Fixed drops of Taoist Hermit, added drops rates to JOKER (all rates were 0%)
+ Removed 0.01% Chances of all Apple drops plugs
+ Tided up mob_db/mob_db2, removed extra tail delimiters (,,,,,,) [Lupus]
+01/07
+ * Added midas' fix for Hammerfall and Adrenaline Rush [celest]
+ * Added 'bDelayrate' and changed Phen card, Marduk Card and Berzebub Card's
+ effects to use this instead of bCastrate (which was reducing casting time,
+ not delay time) [celest]
+01/05
+ * Added DracoRPG's changes [celest]
+ - changed Gungnir to wind element
+ - changed Damascus to cannot be broken
+01/04
+ * item name fix Daydric Card -> Raydric Card [Lupus]
+ Changed weight of Durian,Ramadan,Realgar Wine.
+ Added effect to Durian fruit
+01/01
+ * Included Mages and Wizards to be able to use berserk potions [celest]
+ * Changed some create arrow outputs for new kRO 12/21/04 patch [Aria]
+
+12/29
+ * Corrected Bloody Axe's weight - 400 > 4000 [celest]
+ * Removed Bandit's Beard from item_avail.txt [celest]
+12/28
+ * Removed Roguemaster's Bow adding steal chance, thanks Draco [celest]
+
+12/26
+ * Added item_db2.txt - would be more convenient to store custom items in a
+ separate db [celest]
+
+12/21
+ * Added prices to Arrow Quviers ( = 500* arrow price), fixed few item names
+ (removed '_' from jNAME column), fixed HP amount in Novices Red Potion [Lupus]
+12/21
+ * Added the new Quivers, updated Horse Crest [celest]
+12/20
+ * removed extra {},,,,,,, from each tailing [Lupus]
+ * Corrected job requirements for some garments [celest]
+ * Corrected skill tree requirements for 3 Peco Lord knight skills [celest]
+ * Updated item 569 -> it's a Red potion given to novices if they pass the
+ training grounds test [celest]
+12/18
+ * Lord Knight's Concentration can now be used with any weapon [Aria]
+ * Changed few God-items to fit kRO 12/7/04 Patch [Aria]
+ - Reverted by Celest (sorry, but it's already updated ^^;)
+ * Fixed screwed drops of Kapha (someone removed one number and all data was shifted) [Lupus]
+ * Found one missing item N 569, looks like red Potion. Added a temp plug
+ fixed typo bolt -> Bolt in one scroll [Lupus]
+ BTW I made a TXT Resources merger (it helps merge clients resources itemdesc,etc)
+ so if u need it just tell me
+
+12/17 * Added effect for Deadly poison bottle and Ice cream [celest]
+
+12/15 * Updated Steel Body, Thunderstorm, Investigate and Magic Crasher, thanks
+ to midas
+ * Removed elunium and oridecon from produce_db, thanks to Draco
+
+12/14 * Changed 'Parasite' to non-moving [celest]
+
+12/12 * Removed unuseable skills from skill_tree.txt [celest]
+
+12/11 * Corrected item_db - Wedding rings should give all 3 skills [celest]
+
+12/9 * Removed some unused skills from skill_tree.txt [celest]
+
+12/8 * Capitalised horn_Card in item_db [celest]
+
+12/7 * Fixed some item names (and swpped names of Alarm Mask and Expressionless Mask) [Lupus]
+ * Added effect for Bow Thimble, Archer Skeleton Card and Tribal Solidarity [celest]
+ * Updated Sleipnir, Brisingamen, Mjolnir, Megingord, Counter Dagger,
+ Poison Knife [celest]
+ * Updated SP requirements for Full Strip, Full Chemical Protection, Cannibalize [celest]
+ * Corrected some item_db typos, thanks to DracoRPG
+
+12/6 * Changed spiritball requirements for Chain Crush to 1, thanks to MaoMao of cAthena
+
+12/5 * Edited skill_nocast_db - the skills should be useable outside GvG maps even
+ if woe is on [celest]
+
+12/3 * corrected Spider Web's maximum level [celest]
+ * Removed Soul Drain from Professor's skill tree [celest]
+ * Updated Stunner's job - Acolytes and monks should be able to use it too! [celest]
+
+12/2 * Updated skill tree prerequisites for the new kRO skills [celest]
+
+12/1 * Updated Poison React, Soul Change, Soul Burn [celest]
+
+11/30 * Corrected bUnbreakable value in const.txt [celest]
+ * updated skill_cast_db for Meltdown and Tiger Knuckle Fist [celest]
+
+11/29 * Updated skill_db for Quagmire, Fog Wall [celest]
+
+11/28 * Fixed Wedding rings placement 2->136 [Lupus]
+ * Fixed mob Amon Ra stats/drops [shadow]
+
+11/27 * Fixed some drain rates, fixed Balmung, Mjolnir, fixed all maces (for right jobs) [shadow]
+
+11/26 * Fixed Abrakadabra (3 Yellow Gemstones -> Yellow Gemstones 2).
+ And of course it would still use 1 Yellow even if you have Mistress Card, etc. [Lupus]
+ TODO: Abrakadabra should also summon Monsters and even MVP by chance...
+ * Lowered max level of Oridecon Research skill from 10 to 5 [Lupus]
+
+11/25 * Added element effects to const.txt. [celest]
+ Usage example: sc_start SC_Frost,30000,0;
+ to change the weapon element to Water for 30 seconds.
+
+11/23 * Added temporary requirements for the new guild skills [celest]
+
+11/22
+ * Changed weapon requirements for Sharp Shooting [celest]
+ * fixed job_db2.txt (,, -> ,) [Lupus]
+ * Adding 11/23 kRO's new skills [celest]
+ * Slim Potions requires empty test tube, not empty potion bottle *fixed* [shadow]
+
+11/21
+ * added bClassChange to const.txt and added bClassChange,50; to azoth (.5% chance to transform monster into another.) [Valaris]
+ * added mob stats: 1027,Raptice [Lupus]
+
+11/20
+ - Added deadly poison bottle to produce_db.txt [celest]
+ - Edited ASC_CDP in skill_require_db.txt
+ - Edited ASC_EDP in skill_cast_db.txt
+
+11/17
+ - Corrected max level for cloaking in skill_tree.txt [celest]
+
+11/16
+ - Item 7110 fixed name -> Broken Sword (part of Bongun quest) [Lupus]
+
+11/16
+ - Added BaseJob to const.txt [celest]
+
+11/15
+ - Minor fix on wedding skills, to use 15% of SP/HP . [shadowlady]
+ - ?
+
+11/14
+ - Fixed Golden Thief Bug Mode!(+detects hidden) [Lupus]
+
diff --git a/db/abra_db.txt b/db/abra_db.txt
index 0e5a91102..9c8e36f36 100644
--- a/db/abra_db.txt
+++ b/db/abra_db.txt
@@ -1,313 +1,313 @@
-// Hocus-Pocus Castable Skills Database
-//
-// Structure of Database:
-// SkillID,DummyName,RequiredHocusPocusLevel,Rate
-
-1,Basic Skill,1,5000
-
-2,Sword Mastery,1,5000
-3,Two-Handed Sword Mastery,1,5000
-4,Increase HP Recovery,1,5000
-5,Bash,1,5000
-6,Provoke,1,5000
-7,Magnum Break,1,5000
-8,Endure,1,5000
-
-9,Increase SP Recovery,1,5000
-10,Sight,1,5000
-11,Napalm Beat,1,5000
-12,Safety Wall,4,5000
-13,Soul Strike,2,5000
-14,Cold Bolt,1,5000
-15,Frost Diver,2,5000
-16,Stone Curse,1,5000
-17,Fire Ball,2,5000
-18,Fire Wall,4,5000
-19,Fire Bolt,1,5000
-20,Lightning Bolt,1,5000
-21,Thunder Storm,2,5000
-
-22,Divine Protection,1,0
-23,Demon Bane,1,0
-24,Ruwach,1,5000
-25,Pneuma,6,5000
-26,Teleport,2,5000
-27,Warp Portal,4,5000
-28,Heal,1,5000
-29,Increase AGI,2,5000
-30,Decrease AGI,4,5000
-31,Aqua Benedicta,1,5000
-32,Signum Crucis,1,5000
-33,Angelus,1,5000
-34,Blessing,2,5000
-35,Cure,1,5000
-
-36,Enlarge Weight Limit,1,0
-37,Discount,1,0
-38,Overcharge,1,0
-39,Pushcart,1,0
-40,Item Appraisal,1,5000
-41,Vending,4,5000
-42,Mammonite,1,5000
-
-43,Owl?s Eye,1,0
-44,Vulture?s Eye,1,0
-45,Improve Concentration,4,5000
-46,Double Strafe,1,5000
-47,Arrow Shower,2,5000
-
-48,Double Attack,1,0
-49,Improve Dodge,1,0
-50,Steal,2,5000
-51,Hiding,2,5000
-52,Envenom,1,5000,
-53,Detoxify,1,5000
-
-54,Resurrection,1,5000
-
-55,Spear Mastery,1,0
-56,Pierce,2,4000
-57,Brandish Spear,6,4000
-58,Spear Stab,1,4000
-59,Spear Boomerang,4,4000
-60,TwoHand Quicken,1,4000
-61,Counter Attack,2,4000
-62,Bowling Bash,6,4000
-63,Peco Peco Riding,1,0
-64,Cavalier Mastery,1,0
-
-65,Mace Mastery,1,0
-66,Imposito Manus,1,4000
-67,Suffragium,2,4000
-68,Aspersio,2,4000
-69,B.S Sacramenti,4,4000
-70,Sanctuary,2,4000
-71,Slow poison,1,4000
-72,Status Recovery,1,4000
-73,Kyrie Eleison,2,4000
-74,Magnificat,2,4000
-75,Gloria,4,4000
-76,Lex Divina,2,4000
-77,Turn Undead,2,4000
-78,Lex Aeterna,4,4000
-79,Magnus Exorcismus,6,4000
-
-80,Fire Pillar,2,4000
-81,Sighttrasher,2,4000
-//82,Fire Ivy,1,0
-83,Meteor Storm,6,4000
-84,Jupiter Thunder,2,4000
-85,Lord of Vermilion,6,4000
-86,Water Ball,4,4000
-87,Ice Wall,2,4000
-88,Frost Nova,1,4000
-89,Storm Gust,6,4000
-90,Earth spike,1,4000
-91,Heaven?s Drive,2,4000
-92,Quagmire,4,4000
-93,Sense,1,4000
-
-94,Iron Tempering,1,0
-95,Steel Tempering,1,0
-96,Enchanted Stone Craft,1,0
-97,Oridecon Research,1,0
-98,Smith Dagger,1,0
-99,Smith Sword,1,0
-100,Smith Two-handed Sword,1,0
-101,Smith Axe,1,0
-102,Smith Mace,1,0
-103,Smith Knucklebrace,1,0
-104,Smith Spear,1,0
-105,Hilt Binding,1,0
-106,Ore Discovery,1,0
-107,Weaponry Research,1,0
-108,Weapon Repair,1,0
-109,Skin Tempering,1,0
-110,Hammer Fall,1,4000
-111,Adrenaline Rush,2,4000
-112,Weapon Perfection,4,4000
-113,Power-Thrust,4,4000
-114,Maximize Power,6,4000
-
-115,Skid Trap,1,4000
-116,Land Mine,2,4000
-117,Ankle Snare,2,4000
-118,Shockwave Trap,4,4000
-119,Sandman,4,4000
-120,Flasher,4,4000
-121,Freezing Trap,4,4000
-122,Blast Mine,4,4000
-123,Claymore Trap,6,4000
-124,Remove Trap,1,4000
-125,Talkie box,1,4000
-126,Beast Bane,1,0
-127,Falconry Mastery,1,0
-128,Steel Crow,1,0
-129,Blitz Beat,4,4000
-130,Detect,1,4000
-131,Spring Trap,1,4000
-
-132,Righthand Mastery,1,0
-133,Lefthand Mastery,1,0
-134,Katar Mastery,1,0
-135,Cloaking,2,4000
-136,Sonic Blow,2,4000
-137,Grimtooth,4,4000
-138,Enchant Poison,2,4000
-139,Poison React,2,4000
-140,Venom Dust,4,4000
-141,Venom Splasher,4,40000
-
-//---JP2.0 Additional skill---
-142,First Aid,1,5000
-143,Act Dead,1,5000
-144,Moving HP-Recovery,1,0
-145,Attack Weak Point,1,0
-146,Auto Berserk,1,0
-147,Arrow Crafting,1,5000
-148,Arrow Repel,1,5000
-149,Throw Sand,1,5000
-150,Back sliding,1,5000
-151,Find Stone,1,5000
-152,Stone Fling,1,5000
-153,Cart Revolution,1,5000
-154,Change Cart,1,5000
-155,Crazy Uproar,1,5000
-156,Holy Light,1,5000
-157,Energy Coat,1,5000
-
-//---EP4.0 Skill---
-210,Gank,1,0
-211,Mug,1,4000
-212,Back Stab,4,4000
-213,Stalk,1,0
-214,Sightless Raid,2,4000
-215,Divest Weapon,4,4000
-216,Divest shield,4,4000
-217,Divest armor,4,4000
-218,Divest helm,4,4000
-219,Snatch,4,4000
-220,Scribble,1,4000
-221,Piece,2,4000
-222,Remover,4,4000
-223,Slyness,1,0
-224,Haggle,1,0
-225,Intimidate,1,0
-
-226,Axe Mastery,1,0
-227,Potion Research,1,0
-228,Prepare Potion,1,4000
-229,Bomb,2,4000
-230,Acid terror,2,4000
-231,Aid Potion,2,4000
-232,Summon Flora,4,4000
-233,Summon Marine Sphere,4,4000
-234,Alchemical Weapon,4,4000
-235,Synthesized Shield,4,4000
-236,Synthetic Armor,4,4000
-237,Biochemical Helm,4,4000
-
-//238,Basis of Life,1,0
-//239,Biotechnology,1,0
-//240,Life Creation,1,0
-//241,Cultivation,1,0
-//242,Flame control,1,0
-//243,Call Hommunculus,1,0
-//244,Peaceful Rest,1,0
-//245,Drillmaster,1,0
-//246,Heal Hommunculus,1,0
-//247,Resurrect Hommunculus,1,0
-
-248,Faith,1,0
-249,Guard,1,4000
-250,Smite,2,4000
-251,Shield boomerang,2,4000
-252,Shield Reflect,4,4000
-253,Holy cross,2,4000
-254,Grand cross,6,4000
-255,Sacrifice,4,4000
-256,Resistant Soul,2,4000
-257,Defending Aura,4,4000
-258,Spear Quicken,1,4000
-
-259,Iron fists,1,0
-260,Spiritual Cadence,1,0
-261,Summon Spirit Sphere,1,4000
-262,Absorb Spirit Sphere,1,4000
-263,Raging Triple Blow,1,0
-264,Snap,4,4000
-265,Dodge,1,0
-266,Occult Impact,2,4000
-267,Throw Spirit Sphere,2,4000
-268,Mental Strength,4,4000
-269,Root,2,4000
-270,Fury,2,4000
-271,Asura Strike,6,4000
-272,Raging Quadruple Blow,1,0
-273,Raging Thrust,1,0
-
-274,Study,1,0
-275,Cast Cancel,1,4000
-276,Magic Rod,1,4000
-277,Spell Break,2,4000
-278,Free Cast,1,0
-279,Hindsight,2,4000
-280,Endow Blaze,2,4000
-281,Endow Tsunami,2,4000
-282,Endow Tornado,2,4000
-283,Endow Quake,2,4000
-284,Dragonology,1,0
-285,Volcano,4,4000
-286,Deluge,4,4000
-287,Whirlwind,4,4000
-288,Magnetic Earth,4,4000
-289,Dispel,6,4000
-290,Hocus-pocus,4,4000
-
-// Abracadabra Derivation Skill
-291,Monocell,4,2500
-292,Class Change,8,2500
-293,Summon Monster,6,3500
-294,Orcish Face,4,5000
-295,Death,8,2000
-296,Fortune,6,4000
-297,Tame Monster,6,4000
-298,Question,4,5000
-299,Gravity,4,5000
-300,Level Up,10,500
-301,Instant Death,4,2000
-302,Full Recovery,8,3000
-303,Coma,4,4000
-
-// Dancer / Bard commonness
-304,Amp,1,0
-305,Encore,1,0
-306,Lullaby,1,0
-307,Mental Sensing,1,0
-308,Down Tempo,1,0
-309,Battle Theme,1,0
-310,Harmonic Lick,1,0
-311,Classical Pluck,1,0
-312,Power Chord,1,0
-313,Acoustic Rhythm,1,0
-//314,Ragnarok,1,0
-
-// Bard skill
-315,Music Lesson,1,0
-316,Melody Strike,1,4000
-317,Unchained Serenade,1,0
-318,Unbarring Octave,2,4000
-319,Perfect Tablature,1,0
-320,Impressive Riff,1,0
-321,Magic Strings,1,0
-322,Song of Lutie,1,0
-
-// Dancer skill
-323,Dance Lessons,1,0
-324,Slinging Arrow,1,4000
-325,Hip Shaker,1,0
-326,Dazzler,2,4000
-327,Focus Ballet,1,0
-328,Slow Grace,1,0
-329,Lady Luck,1,0
-330,Gypsy's Kiss,1,0
+// Hocus-Pocus Castable Skills Database
+//
+// Structure of Database:
+// SkillID,DummyName,RequiredHocusPocusLevel,Rate
+
+1,Basic Skill,1,5000
+
+2,Sword Mastery,1,5000
+3,Two-Handed Sword Mastery,1,5000
+4,Increase HP Recovery,1,5000
+5,Bash,1,5000
+6,Provoke,1,5000
+7,Magnum Break,1,5000
+8,Endure,1,5000
+
+9,Increase SP Recovery,1,5000
+10,Sight,1,5000
+11,Napalm Beat,1,5000
+12,Safety Wall,4,5000
+13,Soul Strike,2,5000
+14,Cold Bolt,1,5000
+15,Frost Diver,2,5000
+16,Stone Curse,1,5000
+17,Fire Ball,2,5000
+18,Fire Wall,4,5000
+19,Fire Bolt,1,5000
+20,Lightning Bolt,1,5000
+21,Thunder Storm,2,5000
+
+22,Divine Protection,1,0
+23,Demon Bane,1,0
+24,Ruwach,1,5000
+25,Pneuma,6,5000
+26,Teleport,2,5000
+27,Warp Portal,4,5000
+28,Heal,1,5000
+29,Increase AGI,2,5000
+30,Decrease AGI,4,5000
+31,Aqua Benedicta,1,5000
+32,Signum Crucis,1,5000
+33,Angelus,1,5000
+34,Blessing,2,5000
+35,Cure,1,5000
+
+36,Enlarge Weight Limit,1,0
+37,Discount,1,0
+38,Overcharge,1,0
+39,Pushcart,1,0
+40,Item Appraisal,1,5000
+41,Vending,4,5000
+42,Mammonite,1,5000
+
+43,Owl?s Eye,1,0
+44,Vulture?s Eye,1,0
+45,Improve Concentration,4,5000
+46,Double Strafe,1,5000
+47,Arrow Shower,2,5000
+
+48,Double Attack,1,0
+49,Improve Dodge,1,0
+50,Steal,2,5000
+51,Hiding,2,5000
+52,Envenom,1,5000,
+53,Detoxify,1,5000
+
+54,Resurrection,1,5000
+
+55,Spear Mastery,1,0
+56,Pierce,2,4000
+57,Brandish Spear,6,4000
+58,Spear Stab,1,4000
+59,Spear Boomerang,4,4000
+60,TwoHand Quicken,1,4000
+61,Counter Attack,2,4000
+62,Bowling Bash,6,4000
+63,Peco Peco Riding,1,0
+64,Cavalier Mastery,1,0
+
+65,Mace Mastery,1,0
+66,Imposito Manus,1,4000
+67,Suffragium,2,4000
+68,Aspersio,2,4000
+69,B.S Sacramenti,4,4000
+70,Sanctuary,2,4000
+71,Slow poison,1,4000
+72,Status Recovery,1,4000
+73,Kyrie Eleison,2,4000
+74,Magnificat,2,4000
+75,Gloria,4,4000
+76,Lex Divina,2,4000
+77,Turn Undead,2,4000
+78,Lex Aeterna,4,4000
+79,Magnus Exorcismus,6,4000
+
+80,Fire Pillar,2,4000
+81,Sighttrasher,2,4000
+//82,Fire Ivy,1,0
+83,Meteor Storm,6,4000
+84,Jupiter Thunder,2,4000
+85,Lord of Vermilion,6,4000
+86,Water Ball,4,4000
+87,Ice Wall,2,4000
+88,Frost Nova,1,4000
+89,Storm Gust,6,4000
+90,Earth spike,1,4000
+91,Heaven?s Drive,2,4000
+92,Quagmire,4,4000
+93,Sense,1,4000
+
+94,Iron Tempering,1,0
+95,Steel Tempering,1,0
+96,Enchanted Stone Craft,1,0
+97,Oridecon Research,1,0
+98,Smith Dagger,1,0
+99,Smith Sword,1,0
+100,Smith Two-handed Sword,1,0
+101,Smith Axe,1,0
+102,Smith Mace,1,0
+103,Smith Knucklebrace,1,0
+104,Smith Spear,1,0
+105,Hilt Binding,1,0
+106,Ore Discovery,1,0
+107,Weaponry Research,1,0
+108,Weapon Repair,1,0
+109,Skin Tempering,1,0
+110,Hammer Fall,1,4000
+111,Adrenaline Rush,2,4000
+112,Weapon Perfection,4,4000
+113,Power-Thrust,4,4000
+114,Maximize Power,6,4000
+
+115,Skid Trap,1,4000
+116,Land Mine,2,4000
+117,Ankle Snare,2,4000
+118,Shockwave Trap,4,4000
+119,Sandman,4,4000
+120,Flasher,4,4000
+121,Freezing Trap,4,4000
+122,Blast Mine,4,4000
+123,Claymore Trap,6,4000
+124,Remove Trap,1,4000
+125,Talkie box,1,4000
+126,Beast Bane,1,0
+127,Falconry Mastery,1,0
+128,Steel Crow,1,0
+129,Blitz Beat,4,4000
+130,Detect,1,4000
+131,Spring Trap,1,4000
+
+132,Righthand Mastery,1,0
+133,Lefthand Mastery,1,0
+134,Katar Mastery,1,0
+135,Cloaking,2,4000
+136,Sonic Blow,2,4000
+137,Grimtooth,4,4000
+138,Enchant Poison,2,4000
+139,Poison React,2,4000
+140,Venom Dust,4,4000
+141,Venom Splasher,4,40000
+
+//---JP2.0 Additional skill---
+142,First Aid,1,5000
+143,Act Dead,1,5000
+144,Moving HP-Recovery,1,0
+145,Attack Weak Point,1,0
+146,Auto Berserk,1,0
+147,Arrow Crafting,1,5000
+148,Arrow Repel,1,5000
+149,Throw Sand,1,5000
+150,Back sliding,1,5000
+151,Find Stone,1,5000
+152,Stone Fling,1,5000
+153,Cart Revolution,1,5000
+154,Change Cart,1,5000
+155,Crazy Uproar,1,5000
+156,Holy Light,1,5000
+157,Energy Coat,1,5000
+
+//---EP4.0 Skill---
+210,Gank,1,0
+211,Mug,1,4000
+212,Back Stab,4,4000
+213,Stalk,1,0
+214,Sightless Raid,2,4000
+215,Divest Weapon,4,4000
+216,Divest shield,4,4000
+217,Divest armor,4,4000
+218,Divest helm,4,4000
+219,Snatch,4,4000
+220,Scribble,1,4000
+221,Piece,2,4000
+222,Remover,4,4000
+223,Slyness,1,0
+224,Haggle,1,0
+225,Intimidate,1,0
+
+226,Axe Mastery,1,0
+227,Potion Research,1,0
+228,Prepare Potion,1,4000
+229,Bomb,2,4000
+230,Acid terror,2,4000
+231,Aid Potion,2,4000
+232,Summon Flora,4,4000
+233,Summon Marine Sphere,4,4000
+234,Alchemical Weapon,4,4000
+235,Synthesized Shield,4,4000
+236,Synthetic Armor,4,4000
+237,Biochemical Helm,4,4000
+
+//238,Basis of Life,1,0
+//239,Biotechnology,1,0
+//240,Life Creation,1,0
+//241,Cultivation,1,0
+//242,Flame control,1,0
+//243,Call Hommunculus,1,0
+//244,Peaceful Rest,1,0
+//245,Drillmaster,1,0
+//246,Heal Hommunculus,1,0
+//247,Resurrect Hommunculus,1,0
+
+248,Faith,1,0
+249,Guard,1,4000
+250,Smite,2,4000
+251,Shield boomerang,2,4000
+252,Shield Reflect,4,4000
+253,Holy cross,2,4000
+254,Grand cross,6,4000
+255,Sacrifice,4,4000
+256,Resistant Soul,2,4000
+257,Defending Aura,4,4000
+258,Spear Quicken,1,4000
+
+259,Iron fists,1,0
+260,Spiritual Cadence,1,0
+261,Summon Spirit Sphere,1,4000
+262,Absorb Spirit Sphere,1,4000
+263,Raging Triple Blow,1,0
+264,Snap,4,4000
+265,Dodge,1,0
+266,Occult Impact,2,4000
+267,Throw Spirit Sphere,2,4000
+268,Mental Strength,4,4000
+269,Root,2,4000
+270,Fury,2,4000
+271,Asura Strike,6,4000
+272,Raging Quadruple Blow,1,0
+273,Raging Thrust,1,0
+
+274,Study,1,0
+275,Cast Cancel,1,4000
+276,Magic Rod,1,4000
+277,Spell Break,2,4000
+278,Free Cast,1,0
+279,Hindsight,2,4000
+280,Endow Blaze,2,4000
+281,Endow Tsunami,2,4000
+282,Endow Tornado,2,4000
+283,Endow Quake,2,4000
+284,Dragonology,1,0
+285,Volcano,4,4000
+286,Deluge,4,4000
+287,Whirlwind,4,4000
+288,Magnetic Earth,4,4000
+289,Dispel,6,4000
+290,Hocus-pocus,4,4000
+
+// Abracadabra Derivation Skill
+291,Monocell,4,2500
+292,Class Change,8,2500
+293,Summon Monster,6,3500
+294,Orcish Face,4,5000
+295,Death,8,2000
+296,Fortune,6,4000
+297,Tame Monster,6,4000
+298,Question,4,5000
+299,Gravity,4,5000
+300,Level Up,10,500
+301,Instant Death,4,2000
+302,Full Recovery,8,3000
+303,Coma,4,4000
+
+// Dancer / Bard commonness
+304,Amp,1,0
+305,Encore,1,0
+306,Lullaby,1,0
+307,Mental Sensing,1,0
+308,Down Tempo,1,0
+309,Battle Theme,1,0
+310,Harmonic Lick,1,0
+311,Classical Pluck,1,0
+312,Power Chord,1,0
+313,Acoustic Rhythm,1,0
+//314,Ragnarok,1,0
+
+// Bard skill
+315,Music Lesson,1,0
+316,Melody Strike,1,4000
+317,Unchained Serenade,1,0
+318,Unbarring Octave,2,4000
+319,Perfect Tablature,1,0
+320,Impressive Riff,1,0
+321,Magic Strings,1,0
+322,Song of Lutie,1,0
+
+// Dancer skill
+323,Dance Lessons,1,0
+324,Slinging Arrow,1,4000
+325,Hip Shaker,1,0
+326,Dazzler,2,4000
+327,Focus Ballet,1,0
+328,Slow Grace,1,0
+329,Lady Luck,1,0
+330,Gypsy's Kiss,1,0
diff --git a/db/attr_fix.txt b/db/attr_fix.txt
index c5c3bfe25..32ce86cb8 100644
--- a/db/attr_fix.txt
+++ b/db/attr_fix.txt
@@ -1,53 +1,53 @@
-// Attribute correction
-// Side:Attribute of monster // Length:Attribute of attack
-1,10 // lv1 Attribute table
-//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
- 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
- 100, 25, 100, 150, 50, 100, 75, 100, 100, 100, // Water
- 100, 100, 100, 50, 150, 100, 75, 100, 100, 100, // Earth
- 100, 50, 150, 25, 100, 100, 75, 100, 100, 125, // Fire
- 100, 175, 50, 100, 25, 100, 75, 100, 100, 100, // Wind
- 100, 100, 125, 125, 125, 0, 75, 50, 100, -25, // Poison
- 100, 100, 100, 100, 100, 100, 0, 125, 100, 150, // Holy
- 100, 100, 100, 100, 100, 50, 125, 0, 100, -25, // Shadow
- 25, 100, 100, 100, 100, 100, 75, 75, 125, 100, // Sense
- 100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // Immortality
-// Side:Attribute of monster // Length:Attribute of attack
-2,10 // lv2 Attribute table
-//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
- 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
- 100, 0, 100, 175, 25, 100, 50, 75, 100, 100, // Water
- 100, 100, 50, 25, 175, 100, 50, 75, 100, 100, // Earth
- 100, 25, 175, 0, 100, 100, 50, 75, 100, 150, // Fire
- 100, 175, 25, 100, 0, 100, 50, 75, 100, 100, // Wind
- 100, 75, 125, 125, 125, 0, 50, 25, 75, -50, // Poison
- 100, 100, 100, 100, 100, 100, -25, 150, 100, 175, // Holy
- 100, 100, 100, 100, 100, 25, 150, -25, 100, -50, // Shadow
- 0, 75, 75, 75, 75, 75, 50, 50, 150, 125, // Sense
- 100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // Immortality
-// Side:Attribute of monster // Length:Attribute of attack
-3,10 // lv3 Attribute table
-//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
- 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
- 100, -25, 100, 200, 0, 100, 25, 50, 100, 125, // Water
- 100, 100, 0, 0, 200, 100, 25, 50, 100, 75, // Earth
- 100, 0, 200, -25, 100, 100, 25, 50, 100, 175, // Fire
- 100, 200, 0, 100, -25, 100, 25, 50, 100, 100, // Wind
- 100, 50, 100, 100, 100, 0, 25, 0, 50, -75, // Poison
- 100, 100, 100, 100, 100, 125, -50, 175, 100, 200, // Holy
- 100, 100, 100, 100, 100, 0, 175, -50, 100, -75, // Shadow
- 0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // Sense
- 100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // Immortality
-// Side:Attribute of monster // Length:Attribute of attack
-4,10 // lv4 Attribute table
-//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
- 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
- 100, -50, 100, 200, 0, 75, 0, 25, 100, 150, // Water
- 100, 100, -25, 0, 200, 75, 0, 25, 100, 50, // Earth
- 100, 0, 200, -50, 100, 75, 0, 25, 100, 200, // Fire
- 100, 200, 0, 100, -50, 75, 0, 25, 100, 100, // Wind
- 100, 25, 75, 75, 75, 0, 0, -25, 25,-100, // Poison
- 100, 75, 75, 75, 75, 125,-100, 200, 100, 200, // Holy
- 100, 75, 75, 75, 75, -25, 200,-100, 100,-100, // Shadow
- 0, 25, 25, 25, 25, 25, 0, 0, 200, 175, // Sense
- 100, 25, 25, 25, 25, -25, 175, 0, 100, 0, // Immortality
+// Attribute correction
+// Side:Attribute of monster // Length:Attribute of attack
+1,10 // lv1 Attribute table
+//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
+ 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
+ 100, 25, 100, 150, 50, 100, 75, 100, 100, 100, // Water
+ 100, 100, 100, 50, 150, 100, 75, 100, 100, 100, // Earth
+ 100, 50, 150, 25, 100, 100, 75, 100, 100, 125, // Fire
+ 100, 175, 50, 100, 25, 100, 75, 100, 100, 100, // Wind
+ 100, 100, 125, 125, 125, 0, 75, 50, 100, -25, // Poison
+ 100, 100, 100, 100, 100, 100, 0, 125, 100, 150, // Holy
+ 100, 100, 100, 100, 100, 50, 125, 0, 100, -25, // Shadow
+ 25, 100, 100, 100, 100, 100, 75, 75, 125, 100, // Sense
+ 100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // Immortality
+// Side:Attribute of monster // Length:Attribute of attack
+2,10 // lv2 Attribute table
+//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
+ 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
+ 100, 0, 100, 175, 25, 100, 50, 75, 100, 100, // Water
+ 100, 100, 50, 25, 175, 100, 50, 75, 100, 100, // Earth
+ 100, 25, 175, 0, 100, 100, 50, 75, 100, 150, // Fire
+ 100, 175, 25, 100, 0, 100, 50, 75, 100, 100, // Wind
+ 100, 75, 125, 125, 125, 0, 50, 25, 75, -50, // Poison
+ 100, 100, 100, 100, 100, 100, -25, 150, 100, 175, // Holy
+ 100, 100, 100, 100, 100, 25, 150, -25, 100, -50, // Shadow
+ 0, 75, 75, 75, 75, 75, 50, 50, 150, 125, // Sense
+ 100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // Immortality
+// Side:Attribute of monster // Length:Attribute of attack
+3,10 // lv3 Attribute table
+//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
+ 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
+ 100, -25, 100, 200, 0, 100, 25, 50, 100, 125, // Water
+ 100, 100, 0, 0, 200, 100, 25, 50, 100, 75, // Earth
+ 100, 0, 200, -25, 100, 100, 25, 50, 100, 175, // Fire
+ 100, 200, 0, 100, -25, 100, 25, 50, 100, 100, // Wind
+ 100, 50, 100, 100, 100, 0, 25, 0, 50, -75, // Poison
+ 100, 100, 100, 100, 100, 125, -50, 175, 100, 200, // Holy
+ 100, 100, 100, 100, 100, 0, 175, -50, 100, -75, // Shadow
+ 0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // Sense
+ 100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // Immortality
+// Side:Attribute of monster // Length:Attribute of attack
+4,10 // lv4 Attribute table
+//Netr Watr Erth Fire Wind Pois Hly Shdw Sens Imor
+ 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
+ 100, -50, 100, 200, 0, 75, 0, 25, 100, 150, // Water
+ 100, 100, -25, 0, 200, 75, 0, 25, 100, 50, // Earth
+ 100, 0, 200, -50, 100, 75, 0, 25, 100, 200, // Fire
+ 100, 200, 0, 100, -50, 75, 0, 25, 100, 100, // Wind
+ 100, 25, 75, 75, 75, 0, 0, -25, 25,-100, // Poison
+ 100, 75, 75, 75, 75, 125,-100, 200, 100, 200, // Holy
+ 100, 75, 75, 75, 75, -25, 200,-100, 100,-100, // Shadow
+ 0, 25, 25, 25, 25, 25, 0, 0, 200, 175, // Sense
+ 100, 25, 25, 25, 25, -25, 175, 0, 100, 0, // Immortality
diff --git a/db/castle_db.txt b/db/castle_db.txt
index 4cadaa502..a82fbeaf8 100644
--- a/db/castle_db.txt
+++ b/db/castle_db.txt
@@ -1,28 +1,28 @@
-// Guild Castles Database
-//
-// Structure of Database:
-// CastleID,MapName,CastleName,OnGuildBreakEventName(to abandon captured castles),Flag(reserved)
-0,aldeg_cas01.gat,Neuschwanstein,Agit_A01,1 // kRO : Noisyubantian
-1,aldeg_cas02.gat,Hohenschwangau,Agit_A02,1 // kRO : Hohensyubangawoo
-2,aldeg_cas03.gat,Nuenberg,Agit_A03,1 // kRO : Nyirenverk
-3,aldeg_cas04.gat,Wuerzburg,Agit_A04,1 // kRO : Byirtsburi
-4,aldeg_cas05.gat,Rothenburg,Agit_A05,1 // kRO : Rotenburk
-5,gefg_cas01.gat,Repherion,Agit_G01,1 // kRO : Reprion
-6,gefg_cas02.gat,Eeyolbriggar,Agit_G02,1 // kRO : Yolbriger
-7,gefg_cas03.gat,Yesnelph,Agit_G03,1 // kRO : Isinlife
-8,gefg_cas04.gat,Bergel,Agit_G04,1 // kRO : Berigel
-9,gefg_cas05.gat,Mersetzdeitz,Agit_G05,1 // kRO : Melsedetsu
-10,payg_cas01.gat,Bright Arbor,Agit_Py01,1 // kRO : Mingting
-11,payg_cas02.gat,Scarlet Palace,Agit_Py02,1 // kRO : Tiantan
-12,payg_cas03.gat,Holy Shadow,Agit_Py03,1 // kRO : Fuying
-13,payg_cas04.gat,Sacred Altar,Agit_Py04,1 // kRO : Honglou
-14,payg_cas05.gat,Bamboo Grove Hill,Agit_Py05,1 // kRO : Zhulinxian
-15,prtg_cas01.gat,Kriemhild,Agit_Pt01,1 // kRO : Creamhilt
-16,prtg_cas02.gat,Swanhild,Agit_Pt02,1 // kRO : Sbanhealt
-17,prtg_cas03.gat,Fadhgridh,Agit_Pt03,1 // kRO : Lazrigees
-18,prtg_cas04.gat,Skoegul,Agit_Pt04,1 // kRO : Squagul
-19,prtg_cas05.gat,Gondul,Agit_Pt05,1 // kRO : Guindull
-20,nguild_alde.gat,Novice Castle 1,Agit_N01,2
-21,nguild_gef.gat,Novice Castle 2,Agit_N02,2
-22,nguild_pay.gat,Novice Castle 3,Agit_N03,2
-23,nguild_prt.gat,Novice Castle 4,Agit_N04,2
+// Guild Castles Database
+//
+// Structure of Database:
+// CastleID,MapName,CastleName,OnGuildBreakEventName(to abandon captured castles),Flag(reserved)
+0,aldeg_cas01.gat,Neuschwanstein,Agit_A01,1 // kRO : Noisyubantian
+1,aldeg_cas02.gat,Hohenschwangau,Agit_A02,1 // kRO : Hohensyubangawoo
+2,aldeg_cas03.gat,Nuenberg,Agit_A03,1 // kRO : Nyirenverk
+3,aldeg_cas04.gat,Wuerzburg,Agit_A04,1 // kRO : Byirtsburi
+4,aldeg_cas05.gat,Rothenburg,Agit_A05,1 // kRO : Rotenburk
+5,gefg_cas01.gat,Repherion,Agit_G01,1 // kRO : Reprion
+6,gefg_cas02.gat,Eeyolbriggar,Agit_G02,1 // kRO : Yolbriger
+7,gefg_cas03.gat,Yesnelph,Agit_G03,1 // kRO : Isinlife
+8,gefg_cas04.gat,Bergel,Agit_G04,1 // kRO : Berigel
+9,gefg_cas05.gat,Mersetzdeitz,Agit_G05,1 // kRO : Melsedetsu
+10,payg_cas01.gat,Bright Arbor,Agit_Py01,1 // kRO : Mingting
+11,payg_cas02.gat,Scarlet Palace,Agit_Py02,1 // kRO : Tiantan
+12,payg_cas03.gat,Holy Shadow,Agit_Py03,1 // kRO : Fuying
+13,payg_cas04.gat,Sacred Altar,Agit_Py04,1 // kRO : Honglou
+14,payg_cas05.gat,Bamboo Grove Hill,Agit_Py05,1 // kRO : Zhulinxian
+15,prtg_cas01.gat,Kriemhild,Agit_Pt01,1 // kRO : Creamhilt
+16,prtg_cas02.gat,Swanhild,Agit_Pt02,1 // kRO : Sbanhealt
+17,prtg_cas03.gat,Fadhgridh,Agit_Pt03,1 // kRO : Lazrigees
+18,prtg_cas04.gat,Skoegul,Agit_Pt04,1 // kRO : Squagul
+19,prtg_cas05.gat,Gondul,Agit_Pt05,1 // kRO : Guindull
+20,nguild_alde.gat,Novice Castle 1,Agit_N01,2
+21,nguild_gef.gat,Novice Castle 2,Agit_N02,2
+22,nguild_pay.gat,Novice Castle 3,Agit_N03,2
+23,nguild_prt.gat,Novice Castle 4,Agit_N04,2
diff --git a/db/const.txt b/db/const.txt
index 233170ec9..7f71a0a35 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -1,833 +1,833 @@
-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
-Job_Alchem 18
-Job_Bard 19
-Job_Dancer 20
-Job_Crusader2 21
-Job_Wedding 22
-Job_SuperNovice 23
-Job_Gunslinger 24
-Job_Ninja 25
-Job_Xmas 26
-
-Job_Novice_High 4001
-Job_Swordman_High 4002
-Job_Mage_High 4003
-Job_Archer_High 4004
-Job_Acolyte_High 4005
-Job_Merchant_High 4006
-Job_Thief_High 4007
-Job_Lord_Knight 4008
-Job_High_Priest 4009
-Job_High_Wizard 4010
-Job_Whitesmith 4011
-Job_Sniper 4012
-Job_Assassin_Cross 4013
-Job_Lord_Knight2 4014
-Job_Paladin 4015
-Job_Champion 4016
-Job_Professor 4017
-Job_Stalker 4018
-Job_Creator 4019
-Job_Clown 4020
-Job_Gypsy 4021
-Job_Paladin2 4022
-
-Job_Baby 4023
-Job_Baby_Swordman 4024
-Job_Baby_Mage 4025
-Job_Baby_Archer 4026
-Job_Baby_Acolyte 4027
-Job_Baby_Merchant 4028
-Job_Baby_Thief 4029
-Job_Baby_Knight 4030
-Job_Baby_Priest 4031
-Job_Baby_Wizard 4032
-Job_Baby_Blacksmith 4033
-Job_Baby_Hunter 4034
-Job_Baby_Assassin 4035
-Job_Baby_Knight2 4036
-Job_Baby_Crusader 4037
-Job_Baby_Monk 4038
-Job_Baby_Sage 4039
-Job_Baby_Rogue 4040
-Job_Baby_Alchem 4041
-Job_Baby_Bard 4042
-Job_Baby_Dancer 4043
-Job_Baby_Crusader2 4044
-Job_Super_Baby 4045
-
-Job_Taekwon 4046
-Job_Star_Gladiator 4047
-Job_Star_Gladiator2 4048
-Job_Soul_Linker 4049
-
-EAJL_2_1 0x100
-EAJL_2_2 0x200
-EAJL_2 0x300
-EAJL_UPPER 0x1000
-EAJL_BABY 0x2000
-EAJ_UPPERMASK 0x0fff
-EAJ_BASEMASK 0x00ff
-
-EAJ_NOVICE 0x0
-EAJ_SWORDMAN 0x1
-EAJ_MAGE 0x2
-EAJ_ARCHER 0x3
-EAJ_ACOLYTE 0x4
-EAJ_MERCHANT 0x5
-EAJ_THIEF 0x6
-EAJ_TAEKWON 0x7
-EAJ_GUNSLINGER 0x9
-EAJ_NINJA 0x0A
-
-EAJ_SUPER_NOVICE 0x100
-EAJ_KNIGHT 0x101
-EAJ_WIZARD 0x102
-EAJ_HUNTER 0x103
-EAJ_PRIEST 0x104
-EAJ_BLACKSMITH 0x105
-EAJ_ASSASSIN 0x106
-EAJ_STAR_GLADIATOR 0x107
-
-EAJ_CRUSADER 0x201
-EAJ_SAGE 0x202
-EAJ_BARDDANCER 0x203
-EAJ_MONK 0x204
-EAJ_ALCHEMIST 0x205
-EAJ_ROGUE 0x206
-EAJ_SOUL_LINKER 0x207
-
-EAJ_NOVICE_HIGH 0x1000
-EAJ_SWORDMAN_HIGH 0x1001
-EAJ_MAGE_HIGH 0x1002
-EAJ_ARCHER_HIGH 0x1003
-EAJ_ACOLYTE_HIGH 0x1004
-EAJ_MERCHANT_HIGH 0x1005
-EAJ_THIEF_HIGH 0x1006
-
-EAJ_LORD_KNIGHT 0x1101
-EAJ_HIGH_WIZARD 0x1102
-EAJ_SNIPER 0x1103
-EAJ_HIGH_PRIEST 0x1104
-EAJ_WHITESMITH 0x1105
-EAJ_ASSASSIN_CROSS 0x1106
-
-EAJ_PALADIN 0x1201
-EAJ_PROFESSOR 0x1202
-EAJ_CLOWNGYPSY 0x1203
-EAJ_CHAMPION 0x1204
-EAJ_CREATOR 0x1205
-EAJ_STALKER 0x1206
-
-EAJ_BABY 0x2000
-EAJ_BABY_SWORDMAN 0x2001
-EAJ_BABY_MAGE 0x2002
-EAJ_BABY_ARCHER 0x2003
-EAJ_BABY_ACOLYTE 0x2004
-EAJ_BABY_MERCHANT 0x2005
-EAJ_BABY_THIEF 0x2006
-EAJ_BABY_TAEKWON 0x2007
-
-EAJ_SUPER_BABY 0x2100
-EAJ_BABY_KNIGHT 0x2101
-EAJ_BABY_WIZARD 0x2102
-EAJ_BABY_HUNTER 0x2103
-EAJ_BABY_PRIEST 0x2104
-EAJ_BABY_BLACKSMITH 0x2105
-EAJ_BABY_ASSASSIN 0x2106
-EAJ_BABY_STAR_GLADIATOR 0x2107
-
-EAJ_BABY_CRUSADER 0x2201
-EAJ_BABY_SAGE 0x2202
-EAJ_BABY_BARDDANCER 0x2203
-EAJ_BABY_MONK 0x2204
-EAJ_BABY_ALCHEMIST 0x2205
-EAJ_BABY_ROGUE 0x2206
-EAJ_BABY_SOUL_LINKER 0x2207
-
-Option_Wedding 0x1000
-Option_Xmas 0x20000
-
-bc_all 0
-bc_map 1
-bc_area 2
-bc_self 3
-bc_pc 0
-bc_npc 8
-bc_yellow 0
-bc_blue 16
-
-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_rain 20
-mf_indoors 21
-mf_nogo 22
-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_nonightmaredrop 35
-mf_restricted 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
-
-cell_wall 1
-cell_water 3
-cell_ground 5
-cell_regen 32
-cell_basilica 64
-cell_npc 128
-
-StatusPoint 9 1
-BaseLevel 11 1
-SkillPoint 12 1
-Class 19 1
-Upper 56 1
-Zeny 20 1
-Sex 21 1
-Weight 24 1
-MaxWeight 25 1
-JobLevel 55 1
-BaseExp 1 1
-JobExp 2 1
-Karma 3 1
-Manner 4 1
-NextBaseExp 22 1
-NextJobExp 23 1
-Hp 5 1
-MaxHp 6 1
-Sp 7 1
-MaxSp 8 1
-BaseJob 119 1
-BaseClass 120 1
-
-bMaxHP 6
-bMaxSP 8
-bStr 13
-bAgi 14
-bVit 15
-bInt 16
-bDex 17
-bLuk 18
-bAtk 41
-bAtk2 42
-bMatk1 43
-bMatk2 44
-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
-bMatk 1024
-bMatkRate 1025
-bIgnoreDefEle 1026
-bIgnoreDefRace 1027
-bAtkRate 1028
-bSpeedAddRate 1029
-bAspdAddRate 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
-bAddSpeed 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
-bRandomAttackIncrease 1072
-bAllStats 1073
-bAgiVit 1074
-bAgiDexStr 1075
-bPerfectHide 1076
-
-bClassChange 1078
-bHPDrainValue 1079
-bSPDrainValue 1080
-bWeaponAtk 1081
-bWeaponAtkRate 1082
-bDelayrate 1083
-bHPDrainRateRace 1084
-bSPDrainRateRace 1085
-
-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
-bAddDamageByClass 2020
-bSPGainValue 2021
-bIgnoreDefMob 2022
-bHPLossRate 2023
-bAddRace2 2024
-bHPGainValue 2025
-bSubSize 2026
-bHPDrainValueRace 2027
-bAddItemHealRate 2028
-bSPDrainValueRace 2029
-bExpAddRace 2030
-bSPGainRace 2031
-bSPSubRace2 2032
-bAddEffWhenHitShort 2033
-bUnstripableWeapon 2034
-bUnstripableArmor 2035
-bUnstripableHelm 2036
-bUnstripableShield 2037
-bIntravision 2038
-bAddMonsterDropItemGroup 2039
-bSPLossRate 2040
-bAddSkillBlow 2041
-bSPVanishRate 2042
-
-Eff_Stone 0
-Eff_Freeze 1
-Eff_Stan 2
-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
-
-Ele_Neutral 0
-Ele_Water 1
-Ele_Earth 2
-Ele_Fire 3
-Ele_Wind 4
-Ele_Poison 5
-Ele_Holy 6
-Ele_Dark 7
-Ele_Ghost 8
-Ele_Undead 9
-
-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_Boss 10
-RC_NonBoss 11
-
-IG_BlueBox 1
-IG_VioletBox 2
-IG_CardAlbum 3
-IG_GiftBox 4
-IG_ScrollBox 5
-IG_FingingOre 6
-IG_CookieBag 7
-IG_Potion 8
-IG_Herb 9
-IG_Fruit 10
-IG_Meat 11
-IG_Candy 12
-IG_Juice 13
-IG_Fish 14
-IG_Box 15
-IG_Gemstone 16
-IG_Resist 17
-IG_Ore 18
-IG_Food 19
-IG_Recovery 20
-IG_Mineral 21
-IG_Taming 22
-IG_Scroll 23
-IG_Quiver 24
-IG_Mask 25
-IG_Accesory 26
-IG_Jewel 27
-IG_GiftBox_1 28
-IG_GiftBox_2 29
-IG_GiftBox_3 30
-IG_GiftBox_4 31
-IG_EggBoy 32
-IG_EggGirl 33
-IG_GiftBoxChina 34
-IG_LottoBox 35
-
-SC_ALL -1
-SC_STONE 0
-SC_FREEZE 1
-SC_STAN 2
-SC_STUN 2
-SC_SLEEP 3
-SC_POISON 4
-SC_CURSE 5
-SC_SILENCE 6
-SC_CONFUSION 7
-SC_BLIND 8
-SC_BLEEDING 9
-SC_DPOISON 10
-SC_PROVOKE 20
-SC_ENDURE 21
-SC_TWOHANDQUICKEN 22
-SC_CONCENTRATE 23
-SC_HIDING 24
-SC_CLOAKING 25
-SC_ENCPOISON 26
-SC_POISONREACT 27
-SC_QUAGMIRE 28
-SC_ANGELUS 29
-SC_BLESSING 30
-SC_SIGNUMCRUCIS 31
-SC_INCREASEAGI 32
-SC_DECREASEAGI 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_AETERNA 42
-SC_ADRENALINE 43
-SC_WEAPONPERFECTION 44
-SC_OVERTHRUST 45
-SC_MAXIMIZEPOWER 46
-SC_TRICKDEAD 47
-SC_LOUD 48
-SC_ENERGYCOAT 49
-SC_BROKENARMOR 50
-SC_BROKENWEAPON 51
-SC_HALLUCINATION 52
-SC_WEIGHT50 53
-SC_WEIGHT90 54
-SC_ASPDPOTION0 55
-SC_ASPDPOTION1 56
-SC_ASPDPOTION2 57
-SC_ASPDPOTION3 58
-SC_SPEEDUP0 59
-SC_SPEEDUP1 60
-SC_ATKPOTION 61
-SC_MATKPOTION 62
-SC_WEDDING 63
-SC_SLOWDOWN 64
-SC_ANKLE 65
-SC_KEEPING 66
-SC_BARRIER 67
-SC_STRIPWEAPON 68
-SC_STRIPSHIELD 69
-SC_STRIPARMOR 70
-SC_STRIPHELM 71
-SC_CP_WEAPON 72
-SC_CP_SHIELD 73
-SC_CP_ARMOR 74
-SC_CP_HELM 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_SPEARSQUICKEN 86
-SC_AUTOCOUNTER 87
-SC_SIGHT 88
-SC_SAFETYWALL 89
-SC_RUWACH 90
-SC_EXTREMITYFIST 91
-SC_EXPLOSIONSPIRITS 92
-SC_COMBO 93
-SC_BLADESTOP_WAIT 94
-SC_BLADESTOP 95
-SC_FIREWEAPON 96
-SC_WATERWEAPON 97
-SC_WINDWEAPON 98
-SC_EARTHWEAPON 99
-SC_VOLCANO 100
-SC_DELUGE 101
-SC_VIOLENTGALE 102
-SC_WATK_ELEMENT 103
-SC_LANDPROTECTOR 104
-SC_ARMOR_ELEMENT 105
-SC_NOCHAT 106
-SC_BABY 107
-SC_AURABLADE 108
-SC_PARRYING 109
-SC_CONCENTRATION 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_REJECTSWORD 125
-SC_MARIONETTE 126
-SC_MARIONETTE2 127
-SC_MOONLIT 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_READYSTORM 138
-SC_READYDOWN 139
-SC_READYTURN 140
-SC_READYCOUNTER 141
-SC_DODGE 142
-SC_RUN 143
-SC_SHADOWWEAPON 144
-SC_ADRENALINE2 145
-SC_GHOSTWEAPON 146
-SC_KAIZEL 147
-SC_KAAHI 148
-SC_KAUPE 149
-SC_ONEHAND 150
-SC_PRESERVE 151
-SC_BATTLEORDERS 152
-SC_REGENERATION 153
-SC_DOUBLECAST 154
-SC_GRAVITATION 155
-SC_MAXOVERTHRUST 156
-SC_LONGING 157
-SC_HERMODE 158
-SC_SHRINK 159
-SC_SIGHTBLASTER 160
-SC_WINKCHARM 161
-SC_CLOSECONFINE 162
-SC_CLOSECONFINE2 163
-SC_DANCING 164
-SC_LULLABY 165
-SC_RICHMANKIM 166
-SC_ETERNALCHAOS 167
-SC_DRUMBATTLE 168
-SC_NIBELUNGEN 169
-SC_ROKISWEIL 170
-SC_INTOABYSS 171
-SC_SIEGFRIED 172
-SC_WHISTLE 173
-SC_ASSNCROS 174
-SC_POEMBRAGI 175
-SC_APPLEIDUN 176
-SC_UGLYDANCE 177
-SC_HUMMING 178
-SC_DONTFORGETME 179
-SC_FORTUNE 180
-SC_SERVICE4U 181
-SC_STOP 182
-SC_SPURT 183
-SC_SPIRIT 184
-SC_COMA 185
-SC_INTRAVISION 186
-SC_INCALLSTATUS 187
-SC_INCSTR 188
-SC_INCAGI 189
-SC_INCVIT 190
-SC_INCINT 191
-SC_INCDEX 192
-SC_INCLUK 193
-SC_INCHIT 194
-SC_INCHITRATE 195
-SC_INCFLEE 196
-SC_INCFLEERATE 197
-SC_INCMHPRATE 198
-SC_INCMSPRATE 199
-SC_INCATKRATE 200
-SC_INCMATKRATE 201
-SC_INCDEFRATE 202
-SC_STRFOOD 203
-SC_AGIFOOD 204
-SC_VITFOOD 205
-SC_INTFOOD 206
-SC_DEXFOOD 207
-SC_LUKFOOD 208
-SC_HITFOOD 209
-SC_FLEEFOOD 210
-SC_BATKFOOD 211
-SC_WATKFOOD 212
-SC_MATKFOOD 213
-SC_SCRESIST 214
-SC_XMAS 215
-SC_WARM 216
-SC_SUN_COMFORT 217
-SC_MOON_COMFORT 218
-SC_STAR_COMFORT 219
-SC_FUSION 220
-SC_SKILLRATE_UP 221
-SC_SKE 222
-SC_KAITE 223
-SC_SWOO 224
-SC_SKA 225
-
-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_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_usa 49
-e_indonesia 50
-e_brazil 51
-e_flash 52
-e_turn 53
-e_sigh 54
-e_proud 55
-e_loud 56
-e_ohnoes 57
-e_dice 58
-
-PET_CLASS 1
-PET_NAME 2
-PET_LEVEL 3
-PET_HUNGRY 4
-PET_INTIMATE 5
-
-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
-
-AI_ACTION_TYPE 0
-AI_ACTION_TAR_TYPE 1
-AI_ACTION_TAR 2
-AI_ACTION_SRC 3
-AI_ACTION_TAR_TYPE_PC 1
-AI_ACTION_TAR_TYPE_MOB 2
-AI_ACTION_TAR_TYPE_PET 4
-AI_ACTION_TAR_TYPE_HOMUN 8
-AI_ACTION_TAR_TYPE_ITEM 16
-AI_ACTION_TYPE_NPCCLICK 256
-AI_ACTION_TYPE_ATTACK 128
-AI_ACTION_TYPE_DETECT 64
-AI_ACTION_TYPE_DEAD 32
-AI_ACTION_TYPE_ASSIST 16
-AI_ACTION_TYPE_KILL 8
-AI_ACTION_TYPE_UNLOCK 4
-AI_ACTION_TYPE_WALKACK 2
-AI_ACTION_TYPE_WARPACK 1
-
-ALL_CLIENT 0
-ALL_SAMEMAP 1
-AREA 2
-AREA_WOS 3
-AREA_WOC 4
-AREA_WOSC 5
-AREA_CHAT_WOC 6
-CHAT 7
-CHAT_WOS 8
-CHAT_MAINCHAT 9
-PARTY 10
-PARTY_WOS 11
-PARTY_SAMEMAP 12
-PARTY_SAMEMAP_WOS 13
-PARTY_AREA 14
-PARTY_AREA_WOS 15
-GUILD 16
-GUILD_WOS 17
-GUILD_SAMEMAP 18
-GUILD_SAMEMAP_WOS 19
-GUILD_AREA 20
-GUILD_AREA_WOS 21
-SELF 22
+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
+Job_Alchem 18
+Job_Bard 19
+Job_Dancer 20
+Job_Crusader2 21
+Job_Wedding 22
+Job_SuperNovice 23
+Job_Gunslinger 24
+Job_Ninja 25
+Job_Xmas 26
+
+Job_Novice_High 4001
+Job_Swordman_High 4002
+Job_Mage_High 4003
+Job_Archer_High 4004
+Job_Acolyte_High 4005
+Job_Merchant_High 4006
+Job_Thief_High 4007
+Job_Lord_Knight 4008
+Job_High_Priest 4009
+Job_High_Wizard 4010
+Job_Whitesmith 4011
+Job_Sniper 4012
+Job_Assassin_Cross 4013
+Job_Lord_Knight2 4014
+Job_Paladin 4015
+Job_Champion 4016
+Job_Professor 4017
+Job_Stalker 4018
+Job_Creator 4019
+Job_Clown 4020
+Job_Gypsy 4021
+Job_Paladin2 4022
+
+Job_Baby 4023
+Job_Baby_Swordman 4024
+Job_Baby_Mage 4025
+Job_Baby_Archer 4026
+Job_Baby_Acolyte 4027
+Job_Baby_Merchant 4028
+Job_Baby_Thief 4029
+Job_Baby_Knight 4030
+Job_Baby_Priest 4031
+Job_Baby_Wizard 4032
+Job_Baby_Blacksmith 4033
+Job_Baby_Hunter 4034
+Job_Baby_Assassin 4035
+Job_Baby_Knight2 4036
+Job_Baby_Crusader 4037
+Job_Baby_Monk 4038
+Job_Baby_Sage 4039
+Job_Baby_Rogue 4040
+Job_Baby_Alchem 4041
+Job_Baby_Bard 4042
+Job_Baby_Dancer 4043
+Job_Baby_Crusader2 4044
+Job_Super_Baby 4045
+
+Job_Taekwon 4046
+Job_Star_Gladiator 4047
+Job_Star_Gladiator2 4048
+Job_Soul_Linker 4049
+
+EAJL_2_1 0x100
+EAJL_2_2 0x200
+EAJL_2 0x300
+EAJL_UPPER 0x1000
+EAJL_BABY 0x2000
+EAJ_UPPERMASK 0x0fff
+EAJ_BASEMASK 0x00ff
+
+EAJ_NOVICE 0x0
+EAJ_SWORDMAN 0x1
+EAJ_MAGE 0x2
+EAJ_ARCHER 0x3
+EAJ_ACOLYTE 0x4
+EAJ_MERCHANT 0x5
+EAJ_THIEF 0x6
+EAJ_TAEKWON 0x7
+EAJ_GUNSLINGER 0x9
+EAJ_NINJA 0x0A
+
+EAJ_SUPER_NOVICE 0x100
+EAJ_KNIGHT 0x101
+EAJ_WIZARD 0x102
+EAJ_HUNTER 0x103
+EAJ_PRIEST 0x104
+EAJ_BLACKSMITH 0x105
+EAJ_ASSASSIN 0x106
+EAJ_STAR_GLADIATOR 0x107
+
+EAJ_CRUSADER 0x201
+EAJ_SAGE 0x202
+EAJ_BARDDANCER 0x203
+EAJ_MONK 0x204
+EAJ_ALCHEMIST 0x205
+EAJ_ROGUE 0x206
+EAJ_SOUL_LINKER 0x207
+
+EAJ_NOVICE_HIGH 0x1000
+EAJ_SWORDMAN_HIGH 0x1001
+EAJ_MAGE_HIGH 0x1002
+EAJ_ARCHER_HIGH 0x1003
+EAJ_ACOLYTE_HIGH 0x1004
+EAJ_MERCHANT_HIGH 0x1005
+EAJ_THIEF_HIGH 0x1006
+
+EAJ_LORD_KNIGHT 0x1101
+EAJ_HIGH_WIZARD 0x1102
+EAJ_SNIPER 0x1103
+EAJ_HIGH_PRIEST 0x1104
+EAJ_WHITESMITH 0x1105
+EAJ_ASSASSIN_CROSS 0x1106
+
+EAJ_PALADIN 0x1201
+EAJ_PROFESSOR 0x1202
+EAJ_CLOWNGYPSY 0x1203
+EAJ_CHAMPION 0x1204
+EAJ_CREATOR 0x1205
+EAJ_STALKER 0x1206
+
+EAJ_BABY 0x2000
+EAJ_BABY_SWORDMAN 0x2001
+EAJ_BABY_MAGE 0x2002
+EAJ_BABY_ARCHER 0x2003
+EAJ_BABY_ACOLYTE 0x2004
+EAJ_BABY_MERCHANT 0x2005
+EAJ_BABY_THIEF 0x2006
+EAJ_BABY_TAEKWON 0x2007
+
+EAJ_SUPER_BABY 0x2100
+EAJ_BABY_KNIGHT 0x2101
+EAJ_BABY_WIZARD 0x2102
+EAJ_BABY_HUNTER 0x2103
+EAJ_BABY_PRIEST 0x2104
+EAJ_BABY_BLACKSMITH 0x2105
+EAJ_BABY_ASSASSIN 0x2106
+EAJ_BABY_STAR_GLADIATOR 0x2107
+
+EAJ_BABY_CRUSADER 0x2201
+EAJ_BABY_SAGE 0x2202
+EAJ_BABY_BARDDANCER 0x2203
+EAJ_BABY_MONK 0x2204
+EAJ_BABY_ALCHEMIST 0x2205
+EAJ_BABY_ROGUE 0x2206
+EAJ_BABY_SOUL_LINKER 0x2207
+
+Option_Wedding 0x1000
+Option_Xmas 0x20000
+
+bc_all 0
+bc_map 1
+bc_area 2
+bc_self 3
+bc_pc 0
+bc_npc 8
+bc_yellow 0
+bc_blue 16
+
+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_rain 20
+mf_indoors 21
+mf_nogo 22
+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_nonightmaredrop 35
+mf_restricted 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
+
+cell_wall 1
+cell_water 3
+cell_ground 5
+cell_regen 32
+cell_basilica 64
+cell_npc 128
+
+StatusPoint 9 1
+BaseLevel 11 1
+SkillPoint 12 1
+Class 19 1
+Upper 56 1
+Zeny 20 1
+Sex 21 1
+Weight 24 1
+MaxWeight 25 1
+JobLevel 55 1
+BaseExp 1 1
+JobExp 2 1
+Karma 3 1
+Manner 4 1
+NextBaseExp 22 1
+NextJobExp 23 1
+Hp 5 1
+MaxHp 6 1
+Sp 7 1
+MaxSp 8 1
+BaseJob 119 1
+BaseClass 120 1
+
+bMaxHP 6
+bMaxSP 8
+bStr 13
+bAgi 14
+bVit 15
+bInt 16
+bDex 17
+bLuk 18
+bAtk 41
+bAtk2 42
+bMatk1 43
+bMatk2 44
+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
+bMatk 1024
+bMatkRate 1025
+bIgnoreDefEle 1026
+bIgnoreDefRace 1027
+bAtkRate 1028
+bSpeedAddRate 1029
+bAspdAddRate 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
+bAddSpeed 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
+bRandomAttackIncrease 1072
+bAllStats 1073
+bAgiVit 1074
+bAgiDexStr 1075
+bPerfectHide 1076
+
+bClassChange 1078
+bHPDrainValue 1079
+bSPDrainValue 1080
+bWeaponAtk 1081
+bWeaponAtkRate 1082
+bDelayrate 1083
+bHPDrainRateRace 1084
+bSPDrainRateRace 1085
+
+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
+bAddDamageByClass 2020
+bSPGainValue 2021
+bIgnoreDefMob 2022
+bHPLossRate 2023
+bAddRace2 2024
+bHPGainValue 2025
+bSubSize 2026
+bHPDrainValueRace 2027
+bAddItemHealRate 2028
+bSPDrainValueRace 2029
+bExpAddRace 2030
+bSPGainRace 2031
+bSPSubRace2 2032
+bAddEffWhenHitShort 2033
+bUnstripableWeapon 2034
+bUnstripableArmor 2035
+bUnstripableHelm 2036
+bUnstripableShield 2037
+bIntravision 2038
+bAddMonsterDropItemGroup 2039
+bSPLossRate 2040
+bAddSkillBlow 2041
+bSPVanishRate 2042
+
+Eff_Stone 0
+Eff_Freeze 1
+Eff_Stan 2
+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
+
+Ele_Neutral 0
+Ele_Water 1
+Ele_Earth 2
+Ele_Fire 3
+Ele_Wind 4
+Ele_Poison 5
+Ele_Holy 6
+Ele_Dark 7
+Ele_Ghost 8
+Ele_Undead 9
+
+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_Boss 10
+RC_NonBoss 11
+
+IG_BlueBox 1
+IG_VioletBox 2
+IG_CardAlbum 3
+IG_GiftBox 4
+IG_ScrollBox 5
+IG_FingingOre 6
+IG_CookieBag 7
+IG_Potion 8
+IG_Herb 9
+IG_Fruit 10
+IG_Meat 11
+IG_Candy 12
+IG_Juice 13
+IG_Fish 14
+IG_Box 15
+IG_Gemstone 16
+IG_Resist 17
+IG_Ore 18
+IG_Food 19
+IG_Recovery 20
+IG_Mineral 21
+IG_Taming 22
+IG_Scroll 23
+IG_Quiver 24
+IG_Mask 25
+IG_Accesory 26
+IG_Jewel 27
+IG_GiftBox_1 28
+IG_GiftBox_2 29
+IG_GiftBox_3 30
+IG_GiftBox_4 31
+IG_EggBoy 32
+IG_EggGirl 33
+IG_GiftBoxChina 34
+IG_LottoBox 35
+
+SC_ALL -1
+SC_STONE 0
+SC_FREEZE 1
+SC_STAN 2
+SC_STUN 2
+SC_SLEEP 3
+SC_POISON 4
+SC_CURSE 5
+SC_SILENCE 6
+SC_CONFUSION 7
+SC_BLIND 8
+SC_BLEEDING 9
+SC_DPOISON 10
+SC_PROVOKE 20
+SC_ENDURE 21
+SC_TWOHANDQUICKEN 22
+SC_CONCENTRATE 23
+SC_HIDING 24
+SC_CLOAKING 25
+SC_ENCPOISON 26
+SC_POISONREACT 27
+SC_QUAGMIRE 28
+SC_ANGELUS 29
+SC_BLESSING 30
+SC_SIGNUMCRUCIS 31
+SC_INCREASEAGI 32
+SC_DECREASEAGI 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_AETERNA 42
+SC_ADRENALINE 43
+SC_WEAPONPERFECTION 44
+SC_OVERTHRUST 45
+SC_MAXIMIZEPOWER 46
+SC_TRICKDEAD 47
+SC_LOUD 48
+SC_ENERGYCOAT 49
+SC_BROKENARMOR 50
+SC_BROKENWEAPON 51
+SC_HALLUCINATION 52
+SC_WEIGHT50 53
+SC_WEIGHT90 54
+SC_ASPDPOTION0 55
+SC_ASPDPOTION1 56
+SC_ASPDPOTION2 57
+SC_ASPDPOTION3 58
+SC_SPEEDUP0 59
+SC_SPEEDUP1 60
+SC_ATKPOTION 61
+SC_MATKPOTION 62
+SC_WEDDING 63
+SC_SLOWDOWN 64
+SC_ANKLE 65
+SC_KEEPING 66
+SC_BARRIER 67
+SC_STRIPWEAPON 68
+SC_STRIPSHIELD 69
+SC_STRIPARMOR 70
+SC_STRIPHELM 71
+SC_CP_WEAPON 72
+SC_CP_SHIELD 73
+SC_CP_ARMOR 74
+SC_CP_HELM 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_SPEARSQUICKEN 86
+SC_AUTOCOUNTER 87
+SC_SIGHT 88
+SC_SAFETYWALL 89
+SC_RUWACH 90
+SC_EXTREMITYFIST 91
+SC_EXPLOSIONSPIRITS 92
+SC_COMBO 93
+SC_BLADESTOP_WAIT 94
+SC_BLADESTOP 95
+SC_FIREWEAPON 96
+SC_WATERWEAPON 97
+SC_WINDWEAPON 98
+SC_EARTHWEAPON 99
+SC_VOLCANO 100
+SC_DELUGE 101
+SC_VIOLENTGALE 102
+SC_WATK_ELEMENT 103
+SC_LANDPROTECTOR 104
+SC_ARMOR_ELEMENT 105
+SC_NOCHAT 106
+SC_BABY 107
+SC_AURABLADE 108
+SC_PARRYING 109
+SC_CONCENTRATION 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_REJECTSWORD 125
+SC_MARIONETTE 126
+SC_MARIONETTE2 127
+SC_MOONLIT 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_READYSTORM 138
+SC_READYDOWN 139
+SC_READYTURN 140
+SC_READYCOUNTER 141
+SC_DODGE 142
+SC_RUN 143
+SC_SHADOWWEAPON 144
+SC_ADRENALINE2 145
+SC_GHOSTWEAPON 146
+SC_KAIZEL 147
+SC_KAAHI 148
+SC_KAUPE 149
+SC_ONEHAND 150
+SC_PRESERVE 151
+SC_BATTLEORDERS 152
+SC_REGENERATION 153
+SC_DOUBLECAST 154
+SC_GRAVITATION 155
+SC_MAXOVERTHRUST 156
+SC_LONGING 157
+SC_HERMODE 158
+SC_SHRINK 159
+SC_SIGHTBLASTER 160
+SC_WINKCHARM 161
+SC_CLOSECONFINE 162
+SC_CLOSECONFINE2 163
+SC_DANCING 164
+SC_LULLABY 165
+SC_RICHMANKIM 166
+SC_ETERNALCHAOS 167
+SC_DRUMBATTLE 168
+SC_NIBELUNGEN 169
+SC_ROKISWEIL 170
+SC_INTOABYSS 171
+SC_SIEGFRIED 172
+SC_WHISTLE 173
+SC_ASSNCROS 174
+SC_POEMBRAGI 175
+SC_APPLEIDUN 176
+SC_UGLYDANCE 177
+SC_HUMMING 178
+SC_DONTFORGETME 179
+SC_FORTUNE 180
+SC_SERVICE4U 181
+SC_STOP 182
+SC_SPURT 183
+SC_SPIRIT 184
+SC_COMA 185
+SC_INTRAVISION 186
+SC_INCALLSTATUS 187
+SC_INCSTR 188
+SC_INCAGI 189
+SC_INCVIT 190
+SC_INCINT 191
+SC_INCDEX 192
+SC_INCLUK 193
+SC_INCHIT 194
+SC_INCHITRATE 195
+SC_INCFLEE 196
+SC_INCFLEERATE 197
+SC_INCMHPRATE 198
+SC_INCMSPRATE 199
+SC_INCATKRATE 200
+SC_INCMATKRATE 201
+SC_INCDEFRATE 202
+SC_STRFOOD 203
+SC_AGIFOOD 204
+SC_VITFOOD 205
+SC_INTFOOD 206
+SC_DEXFOOD 207
+SC_LUKFOOD 208
+SC_HITFOOD 209
+SC_FLEEFOOD 210
+SC_BATKFOOD 211
+SC_WATKFOOD 212
+SC_MATKFOOD 213
+SC_SCRESIST 214
+SC_XMAS 215
+SC_WARM 216
+SC_SUN_COMFORT 217
+SC_MOON_COMFORT 218
+SC_STAR_COMFORT 219
+SC_FUSION 220
+SC_SKILLRATE_UP 221
+SC_SKE 222
+SC_KAITE 223
+SC_SWOO 224
+SC_SKA 225
+
+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_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_usa 49
+e_indonesia 50
+e_brazil 51
+e_flash 52
+e_turn 53
+e_sigh 54
+e_proud 55
+e_loud 56
+e_ohnoes 57
+e_dice 58
+
+PET_CLASS 1
+PET_NAME 2
+PET_LEVEL 3
+PET_HUNGRY 4
+PET_INTIMATE 5
+
+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
+
+AI_ACTION_TYPE 0
+AI_ACTION_TAR_TYPE 1
+AI_ACTION_TAR 2
+AI_ACTION_SRC 3
+AI_ACTION_TAR_TYPE_PC 1
+AI_ACTION_TAR_TYPE_MOB 2
+AI_ACTION_TAR_TYPE_PET 4
+AI_ACTION_TAR_TYPE_HOMUN 8
+AI_ACTION_TAR_TYPE_ITEM 16
+AI_ACTION_TYPE_NPCCLICK 256
+AI_ACTION_TYPE_ATTACK 128
+AI_ACTION_TYPE_DETECT 64
+AI_ACTION_TYPE_DEAD 32
+AI_ACTION_TYPE_ASSIST 16
+AI_ACTION_TYPE_KILL 8
+AI_ACTION_TYPE_UNLOCK 4
+AI_ACTION_TYPE_WALKACK 2
+AI_ACTION_TYPE_WARPACK 1
+
+ALL_CLIENT 0
+ALL_SAMEMAP 1
+AREA 2
+AREA_WOS 3
+AREA_WOC 4
+AREA_WOSC 5
+AREA_CHAT_WOC 6
+CHAT 7
+CHAT_WOS 8
+CHAT_MAINCHAT 9
+PARTY 10
+PARTY_WOS 11
+PARTY_SAMEMAP 12
+PARTY_SAMEMAP_WOS 13
+PARTY_AREA 14
+PARTY_AREA_WOS 15
+GUILD 16
+GUILD_WOS 17
+GUILD_SAMEMAP 18
+GUILD_SAMEMAP_WOS 19
+GUILD_AREA 20
+GUILD_AREA_WOS 21
+SELF 22
diff --git a/db/create_arrow_db.txt b/db/create_arrow_db.txt
index cd831dcdc..7332975db 100644
--- a/db/create_arrow_db.txt
+++ b/db/create_arrow_db.txt
@@ -1,195 +1,195 @@
-// Arrow Crafting Database
-//
-// Structure of Database:
-// SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5
-
-// Old Blue Box --> 50 Sharp Arrows, 50 Sleep Arrows
-603,1764,50,1768,50
-// Dead Branch --> 40 Mute Arrows
-604,1769,40
-// Amulet --> 40 Curse Arrows
-609,1761,40
-// Empty Bottle --> 2 Iron Arrows
-713,1770,2
-// Emperium --> 600 Immaterial Arrows, 600 Mute Arrows, 600 Oridecon Arrows
-714,1757,600,1769,600,1765,600
-// Yellow Gemstone --> 30 Stone Arrows, 1 Sleep Arrow
-715,1756,30,1768,1
-// Red Gemstone --> 10 Rusty Arrows, 1 Poison Arrow, 1 Curse Arrow
-716,1762,10,1763,1,1761,1
-// Blue Gemstone --> 30 Crystal Arrows, 1 Frozen Arrow
-717,1754,30,1759,1
-// Cursed Ruby --> 50 Curse Arrows, 10 Sleep Arrows
-724,1761,50,1768,10
-// Cracked Diamond --> 50 Sharp Arrows
-733,1764,50
-// Rough Oridecon --> 50 Oridecon Arrows
-756,1765,50
-// Rough Elunium --> 200 Steel Arrows, 5 Stun Arrows
-757,1753,200,1758,5
-// Tree Root --> 7 Arrows
-902,1750,7
-// Scorpion Tail --> 3 Rusty Arrows
-904,1762,3
-// Jellopy --> 4 Arrows
-909,1750,4
-// Garlet --> 12 Iron Arrows
-910,1770,12
-// Scell --> 8 Steel Arrows
-911,1753,8
-// Zargon --> 50 Silver Arrows
-912,1751,50
-// Tooth of Bat --> 1 Arrow of Shadow
-913,1767,1
-// Wolf Claw --> 15 Iron Arrows
-920,1770,15
-// Orc's Fang --> 30 Iron Arrows, 5 Steel Arrows, 10 Stone Arrows
-922,1770,30,1753,5,1756,10
-// Evil Horn --> 20 Arrows of Shadow, 10 Flash Arrows, 5 Stun Arrows
-923,1767,20,1760,10,1758,5
-// Venom Canine --> 1 Poison Arrow
-937,1763,1
-// Bee Sting --> 1 Rusty Arrow
-939,1762,1
-// Horn --> 35 Steel Arrows
-947,1770,35
-// Cactus Needle --> 50 Arrows
-952,1750,50
-// Gill --> 80 Iron Arrows, 50 Crystal Arrows
-956,1770,80,1754,50
-// Decayed Nail --> 1 Rusty Arrow, 1 Arrow of Shadow
-957,1762,1,1767,1
-// Horrendous Mouth --> 5 Arrows of Shadow
-958,1767,5
-// Stinky Scale --> 1 Poison Arrow
-959,1763,1
-// Heroic Emblem --> 1 Oridecon Arrow, 5 Stun Arrows
-968,1765,1,1758,5
-// Gold --> 50 Flash Arrows, 50 Oridecon Arrows
-969,1760,50,1765,50
-// Oridecon --> 250 Oridecon Arrows
-984,1765,250
-// Elunium --> 1000 Steel Arrows, 50 Stun Arrows
-985,1753,1000,1758,50
-// Red Blood --> 2000 Fire Arrows
-990,1752,2000
-// Crystal Blue --> 500 Crystal Arrows
-991,1754,500
-// Wind of Verdure --> 500 Arrows of Wind
-992,1755,500
-// Green Live --> 500 Stone Arrows
-993,1756,500
-// Flame Heart --> 6000 Fire Arrows, 5 Mute Arrows
-994,1752,6000,1769,5
-// Mystic Frozen --> 1500 Crystal Arrows, 5 Frozen Arrows
-995,1754,1500,1759,5
-// Rough Wind --> 1500 Arrows of Wind, 5 Sleep Arrows
-996,1755,1500,1768,5
-// Great Nature --> 1500 Stone Arrows, 5 Flash Arrows
-997,1756,1500,1760,5
-// Iron --> 100 Iron Arrows
-998,1770,100
-// Steel --> 100 Steel Arrows
-999,1753,100
-// Star Crumb --> 30 Flash Arrows
-1000,1760,30
-// Star Dust --> 10 Flash Arrows
-1001,1760,10
-// Iron Ore --> 50 Iron Arrows
-1002,1770,50
-// Coal --> 8 Arrows of Shadow
-1003,1767,8
-// Phracon --> 50 Iron Arrows
-1010,1770,50
-// Emveretarcon --> 200 Iron Arrows, 40 Silver Arrows
-1011,1770,200,1751,40
-// Mole Claw --> 50 Iron Arrows, 60 Stone Arrows
-1018,1770,50,1756,60
-// Trunk --> 40 Arrows
-1019,1750,40
-// Dokebi Horn --> 40 Iron Arrows, 2 Arrows of Shadow
-1021,1770,40,1767,2
-// Porcupine Quill --> 70 Arrows, 30 Stone Arrows
-1027,1750,70,1756,30
-// Mantis Scythe --> 1 Sharp Arrow
-1031,1764,1
-// Dragon Canine --> 1 Oridecon Arrow, 50 Iron Arrows
-1035,1765,1,1770,50
-// Little Evil Horn --> 2 Curse Arrows, 50 Iron Arrows
-1038,1761,2,1770,50
-// Lantern --> 80 Iron Arrows
-1041,1770,80
-// Orc Claw --> 10 Steel Arrows
-1043,1753,10
-// Zenorc's Fang --> 5 Rusty Arrows
-1044,1762,5
-// Ancient Tooth --> 20 Steel Arrows, 300 Crystal Arrows
-1053,1753,20,1754,300
-// Fang --> 2 Sharp Arrows, 40 Silver Arrows
-1063,1764,2,1751,40
-// Reins --> 100 Iron Arrows, 50 Steel Arrows
-1064,1770,100,1753,50
-// Fine-grained Trunk --> 20 Arrows
-1066,1750,20
-// Solid Trunk --> 20 Arrows
-1067,1750,20
-// Barren Trunk --> 20 Arrows
-1068,1750,20
-// Clock Hand --> 5 Sleep Arrows, 100 Arrows
-1095,1768,5,1750,100
-// Manacles --> 50 Steel Arrows
-1098,1753,50
-// Unicorn Horn --> 1000 Silver Arrows
-2257,1751,1000
-// Opera Masque --> 200 Steel Arrows, 40 Mute Arrows
-2281,1753,200,1769,40
-// Mr. Scream --> 200 Sharp Arrows, 300 Steel Arrows
-2288,1764,200,1753,300
-// Welding Mask --> 200 Steel Arrows, 40 Stun Arrows
-2292,1753,200,1758,40
-// Glittering Jacket --> 1000 Flash Arrows
-2319,1760,1000
-// Wooden Mail --> 700 Arrows, 500 Iron Arrows
-2328,1750,700,1770,500
-// Wooden Mail (Slotted) --> 1000 Arrows, 700 Iron Arrows
-2329,1750,1000,1770,700
-// Silver robe --> 700 Silver Arrows
-2332,1751,700
-// Silver Robe (Slotted) --> 1000 Silver Arrows, 10 Immaterial Arrows
-2333,1751,1000,1757,10
-// Shackles --> 700 Iron Arrows, 50 Steel Arrows
-2408,1770,700,1753,50
-// Matyr's Leash --> 150 Arrows of Wind, 100 Steel Arrows, 10 Sharp Arrows
-2618,1755,150,1753,100,1764,10
-// Fin Helm --> 600 Crystal Arrows, 200 Steel Arrows
-5014,1754,600,1753,200
-// Ogre Tooth --> 30 Steel Arrows, 5 Rusty Arrows
-7002,1753,30,1762,5
-// Stiff Horn --> 2 Stun Arrows
-7008,1758,2
-// Tail of Steel Scorpion --> 250 Steel Arrows, 1 Poison Arrow
-7010,1753,250,1763,1
-// Young Twig --> 1000 Mute Arrows
-7018,1769,1000
-// Loki's Whispers --> 1000 Arrows of Shadow
-7019,1767,1000
-// Mother's Nightmare --> 1000 Curse Arrows
-7020,1761,1000
-// Foolishness of the Blind --> 200 Flash Arrows
-7021,1760,200
-// Old Hilt --> 1000 Oridecon Arrows
-7022,1765,1000
-// Blade of Darkness --> 600 Sharp Arrows, 200 Arrows of Shadow
-7023,1764,600,1767,200
-// Bloody Edge --> 600 Sharp Arrows, 200 Curse Arrows
-7024,1764,600,1761,200
-// Lucifer's Lament --> 800 Stun Arrows, 400 Mute Arrows, 800 Sleep Arrows
-7025,1758,800,1769,400,1768,800
-// Key of the Clock Tower --> 50 Oridecon Arrows
-7026,1765,50
-// Key of the Underground --> 100 Arrows of Shadow
-7027,1767,100
-// Matchstick --> 3000 Fire Arrows
-7035,1752,3000
-// Fang of Garm --> 300 Crystal Arrows
+// Arrow Crafting Database
+//
+// Structure of Database:
+// SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5
+
+// Old Blue Box --> 50 Sharp Arrows, 50 Sleep Arrows
+603,1764,50,1768,50
+// Dead Branch --> 40 Mute Arrows
+604,1769,40
+// Amulet --> 40 Curse Arrows
+609,1761,40
+// Empty Bottle --> 2 Iron Arrows
+713,1770,2
+// Emperium --> 600 Immaterial Arrows, 600 Mute Arrows, 600 Oridecon Arrows
+714,1757,600,1769,600,1765,600
+// Yellow Gemstone --> 30 Stone Arrows, 1 Sleep Arrow
+715,1756,30,1768,1
+// Red Gemstone --> 10 Rusty Arrows, 1 Poison Arrow, 1 Curse Arrow
+716,1762,10,1763,1,1761,1
+// Blue Gemstone --> 30 Crystal Arrows, 1 Frozen Arrow
+717,1754,30,1759,1
+// Cursed Ruby --> 50 Curse Arrows, 10 Sleep Arrows
+724,1761,50,1768,10
+// Cracked Diamond --> 50 Sharp Arrows
+733,1764,50
+// Rough Oridecon --> 50 Oridecon Arrows
+756,1765,50
+// Rough Elunium --> 200 Steel Arrows, 5 Stun Arrows
+757,1753,200,1758,5
+// Tree Root --> 7 Arrows
+902,1750,7
+// Scorpion Tail --> 3 Rusty Arrows
+904,1762,3
+// Jellopy --> 4 Arrows
+909,1750,4
+// Garlet --> 12 Iron Arrows
+910,1770,12
+// Scell --> 8 Steel Arrows
+911,1753,8
+// Zargon --> 50 Silver Arrows
+912,1751,50
+// Tooth of Bat --> 1 Arrow of Shadow
+913,1767,1
+// Wolf Claw --> 15 Iron Arrows
+920,1770,15
+// Orc's Fang --> 30 Iron Arrows, 5 Steel Arrows, 10 Stone Arrows
+922,1770,30,1753,5,1756,10
+// Evil Horn --> 20 Arrows of Shadow, 10 Flash Arrows, 5 Stun Arrows
+923,1767,20,1760,10,1758,5
+// Venom Canine --> 1 Poison Arrow
+937,1763,1
+// Bee Sting --> 1 Rusty Arrow
+939,1762,1
+// Horn --> 35 Steel Arrows
+947,1770,35
+// Cactus Needle --> 50 Arrows
+952,1750,50
+// Gill --> 80 Iron Arrows, 50 Crystal Arrows
+956,1770,80,1754,50
+// Decayed Nail --> 1 Rusty Arrow, 1 Arrow of Shadow
+957,1762,1,1767,1
+// Horrendous Mouth --> 5 Arrows of Shadow
+958,1767,5
+// Stinky Scale --> 1 Poison Arrow
+959,1763,1
+// Heroic Emblem --> 1 Oridecon Arrow, 5 Stun Arrows
+968,1765,1,1758,5
+// Gold --> 50 Flash Arrows, 50 Oridecon Arrows
+969,1760,50,1765,50
+// Oridecon --> 250 Oridecon Arrows
+984,1765,250
+// Elunium --> 1000 Steel Arrows, 50 Stun Arrows
+985,1753,1000,1758,50
+// Red Blood --> 2000 Fire Arrows
+990,1752,2000
+// Crystal Blue --> 500 Crystal Arrows
+991,1754,500
+// Wind of Verdure --> 500 Arrows of Wind
+992,1755,500
+// Green Live --> 500 Stone Arrows
+993,1756,500
+// Flame Heart --> 6000 Fire Arrows, 5 Mute Arrows
+994,1752,6000,1769,5
+// Mystic Frozen --> 1500 Crystal Arrows, 5 Frozen Arrows
+995,1754,1500,1759,5
+// Rough Wind --> 1500 Arrows of Wind, 5 Sleep Arrows
+996,1755,1500,1768,5
+// Great Nature --> 1500 Stone Arrows, 5 Flash Arrows
+997,1756,1500,1760,5
+// Iron --> 100 Iron Arrows
+998,1770,100
+// Steel --> 100 Steel Arrows
+999,1753,100
+// Star Crumb --> 30 Flash Arrows
+1000,1760,30
+// Star Dust --> 10 Flash Arrows
+1001,1760,10
+// Iron Ore --> 50 Iron Arrows
+1002,1770,50
+// Coal --> 8 Arrows of Shadow
+1003,1767,8
+// Phracon --> 50 Iron Arrows
+1010,1770,50
+// Emveretarcon --> 200 Iron Arrows, 40 Silver Arrows
+1011,1770,200,1751,40
+// Mole Claw --> 50 Iron Arrows, 60 Stone Arrows
+1018,1770,50,1756,60
+// Trunk --> 40 Arrows
+1019,1750,40
+// Dokebi Horn --> 40 Iron Arrows, 2 Arrows of Shadow
+1021,1770,40,1767,2
+// Porcupine Quill --> 70 Arrows, 30 Stone Arrows
+1027,1750,70,1756,30
+// Mantis Scythe --> 1 Sharp Arrow
+1031,1764,1
+// Dragon Canine --> 1 Oridecon Arrow, 50 Iron Arrows
+1035,1765,1,1770,50
+// Little Evil Horn --> 2 Curse Arrows, 50 Iron Arrows
+1038,1761,2,1770,50
+// Lantern --> 80 Iron Arrows
+1041,1770,80
+// Orc Claw --> 10 Steel Arrows
+1043,1753,10
+// Zenorc's Fang --> 5 Rusty Arrows
+1044,1762,5
+// Ancient Tooth --> 20 Steel Arrows, 300 Crystal Arrows
+1053,1753,20,1754,300
+// Fang --> 2 Sharp Arrows, 40 Silver Arrows
+1063,1764,2,1751,40
+// Reins --> 100 Iron Arrows, 50 Steel Arrows
+1064,1770,100,1753,50
+// Fine-grained Trunk --> 20 Arrows
+1066,1750,20
+// Solid Trunk --> 20 Arrows
+1067,1750,20
+// Barren Trunk --> 20 Arrows
+1068,1750,20
+// Clock Hand --> 5 Sleep Arrows, 100 Arrows
+1095,1768,5,1750,100
+// Manacles --> 50 Steel Arrows
+1098,1753,50
+// Unicorn Horn --> 1000 Silver Arrows
+2257,1751,1000
+// Opera Masque --> 200 Steel Arrows, 40 Mute Arrows
+2281,1753,200,1769,40
+// Mr. Scream --> 200 Sharp Arrows, 300 Steel Arrows
+2288,1764,200,1753,300
+// Welding Mask --> 200 Steel Arrows, 40 Stun Arrows
+2292,1753,200,1758,40
+// Glittering Jacket --> 1000 Flash Arrows
+2319,1760,1000
+// Wooden Mail --> 700 Arrows, 500 Iron Arrows
+2328,1750,700,1770,500
+// Wooden Mail (Slotted) --> 1000 Arrows, 700 Iron Arrows
+2329,1750,1000,1770,700
+// Silver robe --> 700 Silver Arrows
+2332,1751,700
+// Silver Robe (Slotted) --> 1000 Silver Arrows, 10 Immaterial Arrows
+2333,1751,1000,1757,10
+// Shackles --> 700 Iron Arrows, 50 Steel Arrows
+2408,1770,700,1753,50
+// Matyr's Leash --> 150 Arrows of Wind, 100 Steel Arrows, 10 Sharp Arrows
+2618,1755,150,1753,100,1764,10
+// Fin Helm --> 600 Crystal Arrows, 200 Steel Arrows
+5014,1754,600,1753,200
+// Ogre Tooth --> 30 Steel Arrows, 5 Rusty Arrows
+7002,1753,30,1762,5
+// Stiff Horn --> 2 Stun Arrows
+7008,1758,2
+// Tail of Steel Scorpion --> 250 Steel Arrows, 1 Poison Arrow
+7010,1753,250,1763,1
+// Young Twig --> 1000 Mute Arrows
+7018,1769,1000
+// Loki's Whispers --> 1000 Arrows of Shadow
+7019,1767,1000
+// Mother's Nightmare --> 1000 Curse Arrows
+7020,1761,1000
+// Foolishness of the Blind --> 200 Flash Arrows
+7021,1760,200
+// Old Hilt --> 1000 Oridecon Arrows
+7022,1765,1000
+// Blade of Darkness --> 600 Sharp Arrows, 200 Arrows of Shadow
+7023,1764,600,1767,200
+// Bloody Edge --> 600 Sharp Arrows, 200 Curse Arrows
+7024,1764,600,1761,200
+// Lucifer's Lament --> 800 Stun Arrows, 400 Mute Arrows, 800 Sleep Arrows
+7025,1758,800,1769,400,1768,800
+// Key of the Clock Tower --> 50 Oridecon Arrows
+7026,1765,50
+// Key of the Underground --> 100 Arrows of Shadow
+7027,1767,100
+// Matchstick --> 3000 Fire Arrows
+7035,1752,3000
+// Fang of Garm --> 300 Crystal Arrows
7036,1754,300 \ No newline at end of file
diff --git a/db/exp.txt b/db/exp.txt
index 63a3cfe39..5c2dba027 100644
--- a/db/exp.txt
+++ b/db/exp.txt
@@ -1,24 +1,24 @@
-//Experience tables format:
-//Max Level,Class list,Type (0 - Base Exp; 1 - Job Exp),Exp for Lv 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98
-//Base - Normal and Baby Jobs
-99,0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:23:24:25:26:4023:4024:4025:4026:4027:4028:4029:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4045:4046:4047:4048:4049,0,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
-//Base - Adv Jobs
-99,4001:4002:4003:4004:4005:4006:4007:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,0,10,18,28,40,85,123,168,220,278,400,481,613,731,875,1038,1213,1400,1575,1775,2268,2604,2786,3136,3506,4130,4796,5508,6264,9645,12392,14220,16159,18209,21649,24451,27401,30499,33748,47342,58160,64711,71573,78749,90144,99312,108870,118816,129154,174196,213220,238080,264150,291427,329640,363155,398116,434526,472381,610848,731828,806448,884232,965180,1073896,1170382,1270556,1374422,1481976,1850800,3389616,3666333,3953534,4251217,4559382,5129260,5488173,5859059,6241919,7374168,9570662,10458427,11380262,12336168,13326144,14994907,16130400,17304200,18516326,19766760,29216160,34949880,40930560,55017900,71510400,106974000,146061000,174405000,343210000
-//Job - Novice
-10,0:4023,1,10,18,28,40,91,151,205,268,340
-//Job - 1st Classes
-50,1:2:3:4:5:6:26:4024:4025:4026:4027:4028:4029:4046,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596
-//Job - 2nd Classes
-50,7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4049,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,644736,793535,921810,1106758,1260955,1487304,1557657,1990632,2083386
-//Job - Super Novice
-99,23:4045,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596,982092,992092,1002092,1012092,1022092,1032092,1042092,1052092,1062092,1072092,1082092,1092092,1102092,1112092,1122092,1132092,1142092,1152092,1162092,1172092,1182092,1192092,1202092,1212092,1222092,1232092,1242092,1252092,1262092,1272092,1282092,1292092,1302092,1312092,1322092,1332092,1342092,1352092,1362092,1372092,1382092,1392092,1402092,1412092,1422092,1432092,1442092,1452092,1462092
-//Job - Novice High
-10,4001,1,11,20,31,44,100,166,226,295,374
-//Job - Adv First Classes
-50,4002:4003:4004:4005:4006:4007,1,60,86,116,152,232,360,440,544,672,1040,1208,1398,1604,1896,2250,3336,3874,4452,6080,7976,11128,12544,14042,18228,28683,38225,42228,46425,58073,70898,91195,99290,107720,131043,156238,195408,210430,226010,269028,314788,384853,479453,510878,620880,715530,965928,1024488,1205230,1273990
-//Job - Adv Second Classes
-70,4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,1,288,368,568,696,1206,1774,2192,3196,5080,7352,8580,9892,13358,18984,31925,35860,40013,51605,68585,87770,96443,105515,131770,167428,206720,223860,241673,294553,362303,479053,513362,548856,656197,787507,927154,985696,1046034,1231134,1449220,1678177,1773024,2182221,2534978,3043585,3782865,4461912,4672971,5971896,6250158,6875174,7562691,8318960,9150856,10065942,11877812,14015818,16538655,19515624,23028437,28094693,34275525,41816141,51015692,62239144,79666104,101972614,130524946,167071930,213852071
-//Job - Star Gladiator
-50,4047:4048,1,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,54868,70216,77154,84412,105416,133942,165376,179088,193338,235642,289842,348402,373354,399168,477234,572732,674294,716870,760752,895370,1053978,1220492,1289472,1587070,1843620,2213516,2521910,2974608,3115314,3981264,4166772
-//Job - Ninja/Gunslinger
+//Experience tables format:
+//Max Level,Class list,Type (0 - Base Exp; 1 - Job Exp),Exp for Lv 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98
+//Base - Normal and Baby Jobs
+99,0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:23:24:25:26:4023:4024:4025:4026:4027:4028:4029:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4045:4046:4047:4048:4049,0,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
+//Base - Adv Jobs
+99,4001:4002:4003:4004:4005:4006:4007:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,0,10,18,28,40,85,123,168,220,278,400,481,613,731,875,1038,1213,1400,1575,1775,2268,2604,2786,3136,3506,4130,4796,5508,6264,9645,12392,14220,16159,18209,21649,24451,27401,30499,33748,47342,58160,64711,71573,78749,90144,99312,108870,118816,129154,174196,213220,238080,264150,291427,329640,363155,398116,434526,472381,610848,731828,806448,884232,965180,1073896,1170382,1270556,1374422,1481976,1850800,3389616,3666333,3953534,4251217,4559382,5129260,5488173,5859059,6241919,7374168,9570662,10458427,11380262,12336168,13326144,14994907,16130400,17304200,18516326,19766760,29216160,34949880,40930560,55017900,71510400,106974000,146061000,174405000,343210000
+//Job - Novice
+10,0:4023,1,10,18,28,40,91,151,205,268,340
+//Job - 1st Classes
+50,1:2:3:4:5:6:26:4024:4025:4026:4027:4028:4029:4046,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596
+//Job - 2nd Classes
+50,7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4049,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,644736,793535,921810,1106758,1260955,1487304,1557657,1990632,2083386
+//Job - Super Novice
+99,23:4045,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596,982092,992092,1002092,1012092,1022092,1032092,1042092,1052092,1062092,1072092,1082092,1092092,1102092,1112092,1122092,1132092,1142092,1152092,1162092,1172092,1182092,1192092,1202092,1212092,1222092,1232092,1242092,1252092,1262092,1272092,1282092,1292092,1302092,1312092,1322092,1332092,1342092,1352092,1362092,1372092,1382092,1392092,1402092,1412092,1422092,1432092,1442092,1452092,1462092
+//Job - Novice High
+10,4001,1,11,20,31,44,100,166,226,295,374
+//Job - Adv First Classes
+50,4002:4003:4004:4005:4006:4007,1,60,86,116,152,232,360,440,544,672,1040,1208,1398,1604,1896,2250,3336,3874,4452,6080,7976,11128,12544,14042,18228,28683,38225,42228,46425,58073,70898,91195,99290,107720,131043,156238,195408,210430,226010,269028,314788,384853,479453,510878,620880,715530,965928,1024488,1205230,1273990
+//Job - Adv Second Classes
+70,4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,1,288,368,568,696,1206,1774,2192,3196,5080,7352,8580,9892,13358,18984,31925,35860,40013,51605,68585,87770,96443,105515,131770,167428,206720,223860,241673,294553,362303,479053,513362,548856,656197,787507,927154,985696,1046034,1231134,1449220,1678177,1773024,2182221,2534978,3043585,3782865,4461912,4672971,5971896,6250158,6875174,7562691,8318960,9150856,10065942,11877812,14015818,16538655,19515624,23028437,28094693,34275525,41816141,51015692,62239144,79666104,101972614,130524946,167071930,213852071
+//Job - Star Gladiator
+50,4047:4048,1,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,54868,70216,77154,84412,105416,133942,165376,179088,193338,235642,289842,348402,373354,399168,477234,572732,674294,716870,760752,895370,1053978,1220492,1289472,1587070,1843620,2213516,2521910,2974608,3115314,3981264,4166772
+//Job - Ninja/Gunslinger
70,24:25,1,72,92,142,174,301,443,548,799,1270,1838,2145,2473,3339,4746,6385,7172,8002,10321,13717,17554,19288,21103,26354,33485,41344,44772,48334,58910,72460,87100,93338,99792,119308,143183,231068,257377,274363,314246,371105,431038,476309,588548,665256,801731,916689,1130023,1188623,1477408,1551289,1746582,1845236,1954741,2124555,2345698,2548763,2759555,3021488,3254111,3489547,3695474,4012251,4181112,4302211,4496584,4578951,4869523,5022114,5123654,5395117 \ No newline at end of file
diff --git a/db/exp2.txt b/db/exp2.txt
index 1d77efa22..733b13a92 100644
--- a/db/exp2.txt
+++ b/db/exp2.txt
@@ -1,35 +1,35 @@
-//This is a custom Experience table with support for up to level 1000.
-//To use it, replace exp.txt with this file and edit the max level
-//accordingly.
-//Experience tables format:
-//Max Level,Class list,Type (0 - Base Exp / 1 - Job Exp),Exp 1,2,3,...
-//Base - Normal Jobs
-99,0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:23:24:25:26:4046:4047:4048:4049,0,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,8109652,8643822,9206127,9797599,10419283,11072238,11757533,12476249,13229476,14018313,14843866,15707247,16609574,17551968,18535552,19561452,20630792,21744696,22904284,24110674,25364977,26668297,28021732,29426368,30883282,32393539,33958189,35578269,37254799,38988782,40781202,42633023,44545189,46518620,48554214,50652844,52815357,55042573,57335285,59694256,62120220,64613880,67175907,69806941,72507587,75278418,78119970,81032746,84017211,87073795,90202891,93404853,96680000,100028610,103450924,106947144,110517434,114161918,117880680,121673767,125541185,129482901,133498844,137588903,141752928,145990732,150302088,154686733,159144364,163674642,168277191,172951600,177697420,182514167,187401324,192358338,197384623,202479560,207642499,212872757,218169621,223532347,228960163,234452268,240007834,245626005,251305900,257046613,262847212,268706744,274624232,280598679,286629065,292714352,298853483,305045382,311288957,317583099,323926685,330318577,336757623,343242660,349772512,356345994,362961909,369619053,376316214,383052171,389825698,396635564,403480532,410359362,417270811,424213634,431186584,438188413,445217874,452273720,459354706,466459588,473587127,480736086,487905232,495093338,502299181,509521545,516759221,524011006,531275705,538552132,545839109,553135467,560440047,567751700,575069288,582391684,589717771,597046446,604376616,611707202,619037136,626365365,633690848,641012559,648329484,655640625,662944998,670241632,677529573,684807881,692075631,699331913,706575834,713806514,721023091,728224718,735410563,742579811,749731663,756865335,763980061,771075089,778149684,785203127,792234715,799243761,806229595,813191563,820129025,827041359,833927958,840788232,847621604,854427516,861205423,867954796,874675123,881365905,888026659,894656917,901256227,907824150,914360262,920864154,927335431,933773713,940178632,946549836,952886985,959189754,965457830,971690914,977888720,984050975,990177418,996267800,1002321886,1008339452,1014320285,1020264186,1026170966,1032040448,1037872466,1043666865,1049423500,1055142238,1060822955,1066465539,1072069886,1077635904,1083163509,1088652627,1094103193,1099515152,1104888457,1110223070,1115518962,1120776112,1125994507,1131174143,1136315022,1141417155,1146480560,1151505263,1156491296,1161438699,1166347518,1171217806,1176049622,1180843032,1185598108,1190314928,1194993575,1199634138,1204236712,1208801396,1213328296,1217817522,1222269189,1226683417,1231060330,1235400057,1239702732,1243968491,1248197476,1252389832,1256545708,1260665257,1264748635,1268796001,1272807518,1276783353,1280723674,1284628654,1288498467,1292333290,1296133304,1299898691,1303629636,1307326326,1310988950,1314617700,1318212769,1321774352,1325302646,1328797850,1332260164,1335689790,1339086931,1342451791,1345784576,1349085494,1352354752,1355592559,1358799125,1361974661,1365119379,1368233491,1371317210,1374370750,1377394325,1380388150,1383352439,1386287408,1389193273,1392070249,1394918553,1397738400,1400530007,1403293591,1406029367,1408737552,1411418361,1414072010,1416698715,1419298692,1421872155,1424419319,1426940398,1429435606,1431905157,1434349263,1436768137,1439161990,1441531034,1443875479,1446195535,1448491412,1450763318,1453011460,1455236046,1457437282,1459615373,1461770523,1463902937,1466012816,1468100363,1470165779,1472209264,1474231016,1476231234,1478210114,1480167853,1482104645,1484020685,1485916165,1487791277,1489646211,1491481157,1493296304,1495091838,1496867946,1498624813,1500362623,1502081558,1503781800,1505463529,1507126924,1508772163,1510399423,1512008880,1513600707,1515175078,1516732165,1518272138,1519795167,1521301420,1522791064,1524264265,1525721187,1527161994,1528586847,1529995908,1531389336,1532767289,1534129924,1535477397,1536809863,1538127475,1539430385,1540718744,1541992701,1543252405,1544498003,1545729641,1546947464,1548151616,1549342238,1550519472,1551683458,1552834334,1553972238,1555097306,1556209673,1557309473,1558396839,1559471902,1560534793,1561585640,1562624572,1563651716,1564667197,1565671140,1566663668,1567644904,1568614969,1569573982,1570522063,1571459329,1572385897,1573301883,1574207401,1575102565,1575987487,1576862278,1577727048,1578581907,1579426962,1580262321,1581088090,1581904373,1582711275,1583508898,1584297344,1585076715,1585847110,1586608628,1587361366,1588105422,1588840892,1589567871,1590286453,1590996731,1591698797,1592392743,1593078658,1593756633,1594426755,1595089112,1595743791,1596390878,1597030458,1597662614,1598287430,1598904988,1599515370,1600118656,1600714926,1601304259,1601886733,1602462426,1603031414,1603593772,1604149576,1604698899,1605241815,1605778396,1606308715,1606832842,1607350847,1607862800,1608368770,1608868825,1609363032,1609851457,1610334167,1610811226,1611282699,1611748650,1612209142,1612664237,1613113997,1613558483,1613997756,1614431875,1614860899,1615284887,1615703896,1616117984,1616527207,1616931621,1617331282,1617726244,1618116561,1618502287,1618883474,1619260175,1619632442,1620000326,1620363877,1620723146,1621078182,1621429033,1621775749,1622118377,1622456965,1622791559,1623122206,1623448951,1623771840,1624090917,1624406227,1624717813,1625025719,1625329987,1625630660,1625927779,1626221386,1626511522,1626798227,1627081541,1627361504,1627638155,1627911532,1628181674,1628448618,1628712402,1628973062,1629230635,1629485157,1629736664,1629985191,1630230773,1630473445,1630713240,1630950192,1631184334,1631415700,1631644322,1631870232,1632093461,1632314042,1632532005,1632747381,1632960200,1633170493,1633378289,1633583617,1633786507,1633986987,1634185085,1634380829,1634574248,1634765368,1634954216,1635140820,1635325205,1635507398,1635687425,1635865311,1636041081,1636214761,1636386375,1636555947,1636723501,1636889061,1637052651,1637214294,1637374013,1637531831,1637687770,1637841852,1637994099,1638144533,1638293176,1638440048,1638585171,1638728565,1638870250,1639010247,1639148576,1639285256,1639420307,1639553749,1639685600,1639815879,1639944605,1640071796,1640197471,1640321647,1640444342,1640565574,1640685360,1640803717,1640920662,1641036212,1641150383,1641263192,1641374655,1641484788,1641593607,1641701127,1641807363,1641912331,1642016046,1642118523,1642219777,1642319822,1642418672,1642516342,1642612846,1642708197,1642802409,1642895496,1642987471,1643078348,1643168139,1643256857,1643344515,1643431126,1643516702,1643601256,1643684799,1643767344,1643848902,1643929486,1644009107,1644087776,1644165505,1644242304,1644318185,1644393159,1644467237,1644540429,1644612746,1644684198,1644754796,1644824550,1644893470,1644961565,1645028846,1645095322,1645161003,1645225899,1645290018,1645353370,1645415965,1645477811,1645538917,1645599292,1645658945,1645717884,1645776118,1645833655,1645890503,1645946671,1646002167,1646056999,1646111175,1646164702,1646217589,1646269843,1646321471,1646372481,1646422881,1646472677,1646521877,1646570488,1646618517,1646665972,1646712858,1646759183,1646804953,1646850175,1646894856,1646939002,1646982619,1647025714,1647068293,1647110362,1647151927,1647192995,1647233571,1647273661,1647313271,1647352406,1647391073,1647429277,1647467023,1647504317,1647541164,1647577570,1647613540,1647649079,1647684192,1647718884,1647753161,1647787027,1647820488,1647853548,1647886212,1647918484,1647950370,1647981874,1648013000,1648043753,1648074138,1648104159,1648133820,1648163126,1648192080,1648220687,1648248952,1648276878,1648304469,1648331730,1648358664,1648385275,1648411567,1648437544,1648463210,1648488568,1648513622,1648538376,1648562833,1648586997,1648610872,1648634460,1648657766,1648680792,1648703542,1648726020,1648748228,1648770170,1648791849,1648813268,1648834430,1648855339,1648875997,1648896407,1648916573,1648936497,1648956182,1648975631,1648994847,1649013832,1649032590,1649051123,1649069434,1649087525,1649105399,1649123059,1649140507,1649157746,1649174778,1649191606,1649208232,1649224659,1649240889,1649256924,1649272767,1649288420,1649303885,1649319165,1649334262,1649349178,1649363915,1649378475,1649392861,1649407074,1649421117,1649434991,1649448699,1649462242,1649475623,1649488844,1649501906,1649514811,1649527562,1649540160,1649552607,1649564904,1649577054,1649589058,1649600918,1649612636,1649624213,1649635652,1649646953,1649658119,1649669151,1649680051,1649690820,1649701460,1649711972,1649722358,1649732619,1649742757,1649752774,1649762671,1649772449,1649782110,1649791655,1649801085,1649810402,1649819607,1649828702,1649837688,1649846566,1649855338,1649864004,1649872566,1649881026,1649889384,1649897642,1649905801,1649913862,1649921826,1649929695,1649937469,1649945150,1649952739,1649960237,1649967645,1649974964,1649982195,1649989340,1649996399,1650003373,1650010263,1650017071,1650023797,1650030442,1650037008,1650043495,1650049904,1650056236,1650062492,1650068673,1650074780,1650080814,1650086775,1650092665,1650098484,1650104233,1650109913,1650115525,1650121070,1650126548,1650131961,1650137309,1650142593,1650147813,1650152971,1650158067,1650163102,1650168076,1650172990,1650177845,1650182642,1650187382,1650192065,1650196692,1650201263,1650205779,1650210241,1650214650,1650219006,1650223309,1650227561,1650231762,1650235912,1650240012,1650244063,1650248066,1650252021,1650255928,1650259788,1650263602,1650267370,1650271093,1650274771,1650278405,1650281996,1650285544,1650289049,1650292512,1650295933,1650299313,1650302653,1650305953,1650309213,1650312434,1650315616,1650318760,1650321866,1650324935,1650327967,1650330963,1650333923,1650336847,1650339736,1650342591,1650345411,1650348198,1650350951,1650353671,1650356358,1650359013,1650361636,1650364228,1650366789,1650369319,1650371819,1650374289,1650376729,1650379140,1650381522,1650383875,1650386200,1650388497,1650390766,1650393008,1650395223,1650397412,1650399574,1650401711,1650403822,1650405908,1650407969,1650410005,1650412016,1650414003,1650415966,1650417906,1650419823,1650421717,1650423588,1650425436,1650427262,1650429066
-//Base - Adv Jobs
-99,4001:4002:4003:4004:4005:4006:4007:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,0,10,18,28,40,85,123,168,220,278,400,481,613,731,875,1038,1213,1400,1575,1775,2268,2604,2786,3136,3506,4130,4796,5508,6264,9645,12392,14220,16159,18209,21649,24451,27401,30499,33748,47342,58160,64711,71573,78749,90144,99312,108870,118816,129154,174196,213220,238080,264150,291427,329640,363155,398116,434526,472381,610848,731828,806448,884232,965180,1073896,1170382,1270556,1374422,1481976,1850800,3389616,3666333,3953534,4251217,4559382,5129260,5488173,5859059,6241919,7374168,9570662,10458427,11380262,12336168,13326144,14994907,16130400,17304200,18516326,19766760,21085096,22473939,23935933,25473761,27090141,28787825,30569594,32438257,34396650,36447628,38594068,40838862,43184915,45635142,48192464,50859807,53640095,56536248,59551182,62687799,65948990,69337627,72856561,76508620,80296602,84223275,88291372,92503586,96862571,101370933,106031232,110845975,115817614,120948544,126241098,131697545,137320088,143110859,149071919,155205253,161512770,167996297,174657580,181498280,188519973,195724146,203112195,210685425,218445048,226392181,234527844,242852961,251368358,260074760,268972793,278062983,287345754,296821429,306490229,316352273,326407578,336656059,347097530,357731703,368558190,379576502,390786051,402186149,413776012,425554759,437521412,449674899,462014055,474537623,487244256,500132518,513200886,526447751,539871420,553470119,567241993,581185110,595297462,609576966,624021468,638628745,653396504,668322389,683403980,698638797,714024301,729557897,745236936,761058717,777020492,793119465,809352795,825717601,842210961,858829917,875571475,892432609,909410264,926501355,943702774,961011389,978424047,995937576,1013548788,1031254481,1049051440,1066936441,1084906252,1102957634,1121087346,1139292145,1157568786,1175914029,1194324635,1212797373,1231329018,1249916355,1268556179,1287245299,1305980536,1324758729,1343576732,1362431419,1381319683,1400238439,1419184625,1438155202,1457147157,1476157502,1495183278,1514221554,1533269429,1552324031,1571382520,1590442090,1609499966,1628553409,1647599713,1666636209,1685660263,1704669278,1723660695,1742631992,1761580687,1780504336,1799400534,1818266916,1837101157,1855900974,1874664122,1893388399,1912071644,1930711737,1949306600,1967854196,1986352530,2004799649,2023193642,2041532640,2059814816,2078038384,2096201600,2114302763,2132340212,2150312328,2168217533,2186054291,2203821106,2221516523,2239139127,2256687544,2274160439,2291556517,2308874523,2326113241,2343271492,2360348137,2377342074,2394252239,2411077605,2427817182,2444470016,2461035190,2477511822,2493899065,2510196107,2526402170,2542516509,2558538414,2574467207,2590302243,2606042908,2621688620,2637238829,2652693014,2668050684,2683311379,2698474666,2713540143,2728507434,2743376192,2758146097,2772816855,2787388198,2801859883,2816231694,2830503439,2844674950,2858746082,2872716714,2886586747,2900356105,2914024733,2927592598,2941059688,2954426010,2967691593,2980856483,2993920747,3006884469,3019747752,3032510717,3045173501,3057736259,3070199161,3082562393,3094826158,3106990673,3119056170,3131022894,3142891106,3154661079,3166333099,3177907466,3189384491,3200764497,3212047820,3223234805,3234325809,3245321200,3256221356,3267026664,3277737521,3288354333,3298877514,3309307489,3319644689,3329889553,3340042528,3350104069,3360074637,3369954700,3379744733,3389445216,3399056636,3408579485,3418014261,3427361466,3436621608,3445795199,3454882755,3463884797,3472801849,3481634440,3490383101,3499048368,3507630778,3516130872,3524549194,3532886290,3541142708,3549318998,3557415713,3565433406,3573372633,3581233950,3589017916,3596725090,3604356032,3611911302,3619391462,3626797073,3634128697,3641386897,3648572235,3655685273,3662726573,3669696697,3676596205,3683425658,3690185617,3696876640,3703499285,3710054109,3716541669,3722962519,3729317213,3735606303,3741830339,3747989871,3754085446,3760117610,3766086907,3771993879,3777839066,3783623006,3789346235,3795009287,3800612694,3806156985,3811642688,3817070327,3822440424,3827753500,3833010071,3838210653,3843355757,3848445893,3853481568,3858463286,3863391548,3868266853,3873089696,3877860570,3882579965,3887248368,3891866263,3896434130,3900952448,3905421692,3909842333,3914214841,3918539681,3922817316,3927048205,3931232805,3935371569,3939464947,3943513385,3947517328,3951477216,3955393486,3959266573,3963096907,3966884916,3970631025,3974335655,3977999224,3981622147,3985204835,3988747697,3992251137,3995715558,3999141358,4002528933,4005878676,4009190975,4012466216,4015704782,4018907052,4022073402,4025204206,4028299834,4031360652,4034387025,4037379312,4040337871,4043263057,4046155220,4049014709,4051841869,4054637042,4057400566,4060132778,4062834010,4065504592,4068144851,4070755111,4073335693,4075886914,4078409090,4080902532,4083367550,4085804450,4088213536,4090595108,4092949463,4095276897,4097577701,4099852165,4102100575,4104323215,4106520366,4108692307,4110839312,4112961655,4115059606,4117133433,4119183400,4121209770,4123212802,4125192754,4127149880,4129084433,4130996662,4132886814,4134755133,4136601862,4138427240,4140231505,4142014891,4143777631,4145519954,4147242089,4148944261,4150626693,4152289606,4153933218,4155557746,4157163403,4158750402,4160318952,4161869260,4163401532,4164915971,4166412777,4167892150,4169354286,4170799380,4172227625,4173639211,4175034327,4176413160,4177775894,4179122712,4180453795,4181769321,4183069467,4184354408,4185624318,4186879367,4188119725,4189345560,4190557037,4191754321,4192937573,4194106954,4195262623,4196404736,4197533449,4198648916,4199751289,4200840717,4201917350,4202981334,4204032815,4205071936,4206098840,4207113668,4208116558,4209107648,4210087074,4211054971,4212011472,4212956708,4213890810,4214813906,4215726123,4216627588,4217518424,4218398755,4219268703,4220128387,4220977927,4221817441,4222647044,4223466852,4224276979,4225077537,4225868637,4226650390,4227422904,4228186286,4228940643,4229686080,4230422700,4231150607,4231869902,4232580686,4233283058,4233977116,4234662957,4235340677,4236010370,4236672131,4237326053,4237972227,4238610743,4239241692,4239865161,4240481239,4241090012,4241691565,4242285983,4242873350,4243453749,4244027261,4244593967,4245153947,4245707279,4246254042,4246794313,4247328169,4247855684,4248376933,4248891990,4249400928,4249903818,4250400732,4250891740,4251376912,4251856316,4252330020,4252798092,4253260597,4253717602,4254169171,4254615368,4255056257,4255491900,4255922359,4256347695,4256767969,4257183240,4257593568,4257999011,4258399627,4258795472,4259186603,4259573076,4259954946,4260332267,4260705093,4261073477,4261437472,4261797129,4262152500,4262503636,4262850586,4263193401,4263532129,4263866819,4264197518,4264524274,4264847134,4265166143,4265481348,4265792793,4266100523,4266404582,4266705014,4267001861,4267295166,4267584971,4267871318,4268154248,4268433801,4268710017,4268982936,4269252597,4269519039,4269782300,4270042418,4270299430,4270553373,4270804284,4271052198,4271297151,4271539179,4271778316,4272014596,4272248054,4272478723,4272706636,4272931826,4273154325,4273374166,4273591380,4273805998,4274018051,4274227570,4274434585,4274639125,4274841221,4275040901,4275238194,4275433128,4275625732,4275816033,4276004059,4276189837,4276373393,4276554754,4276733946,4276910995,4277085927,4277258767,4277429540,4277598270,4277764982,4277929700,4278092447,4278253247,4278412124,4278569100,4278724198,4278877440,4279028849,4279178446,4279326253,4279472291,4279616582,4279759146,4279900004,4280039176,4280176683,4280312544,4280446779,4280579407,4280710448,4280839920,4280967842,4281094233,4281219111,4281342494,4281464400,4281584846,4281703850,4281821429,4281937601,4282052382,4282165788,4282277836,4282388543,4282497924,4282605995,4282712772,4282818270,4282922505,4283025492,4283127245,4283227779,4283327109,4283425250,4283522215,4283618019,4283712675,4283806197,4283898599,4283989894,4284080096,4284169217,4284257270,4284344268,4284430224,4284515150,4284599059,4284681963,4284763873,4284844802,4284924761,4285003762,4285081817,4285158936,4285235131,4285310413,4285384793,4285458282,4285530890,4285602628,4285673507,4285743536,4285812726,4285881087,4285948628,4286015360,4286081292,4286146434,4286210795,4286274385,4286337213,4286399288,4286460619,4286521215,4286581084,4286640236,4286698679,4286756421,4286813471,4286869837,4286925527,4286980550,4287034913,4287088625,4287141693,4287194125,4287245928,4287297110,4287347678,4287397640,4287447003,4287495774,4287543961,4287591570,4287638608,4287685082,4287730999,4287776365,4287821187,4287865472,4287909226,4287952455,4287995166,4288037365,4288079058,4288120251,4288160950,4288201161,4288240890,4288280143,4288318925,4288357242,4288395099,4288432502,4288469457,4288505969,4288542043,4288577684,4288612898,4288647690,4288682064,4288716026,4288749581,4288782733,4288815488,4288847850,4288879824,4288911414,4288942626,4288973463,4289003930,4289034032,4289063773,4289093157,4289122189,4289150873,4289179213,4289207213,4289234877,4289262209,4289289213,4289315893,4289342253,4289368297,4289394029,4289419452,4289444570,4289469387,4289493906,4289518131,4289542066,4289565714,4289589078,4289612162,4289634969,4289657502,4289679765,4289701761,4289723493,4289744964,4289766178,4289787137,4289807845,4289828305,4289848519,4289868491,4289888223,4289907718,4289926979,4289946009,4289964811,4289983388,4290001742,4290019876,4290037792,4290055493,4290072982,4290090261,4290107333,4290124200,4290140865,4290157330,4290173597,4290189669,4290205548,4290221237,4290236737,4290252051,4290267182,4290282131,4290296901,4290311494,4290325912,4290340157,4290354231,4290368136,4290381874,4290395447,4290408857,4290422107,4290435198,4290448132,4290460910,4290473535,4290486009,4290498333,4290510509,4290522539,4290534425,4290546168,4290557770,4290569233,4290580558,4290591748,4290602803,4290613726,4290624518,4290635180,4290645714,4290656122,4290666405,4290676565,4290686603,4290696520,4290706318,4290715999,4290725564,4290735014,4290744350,4290753574,4290762688,4290771692,4290780588,4290789378,4290798062,4290806642,4290815119,4290823494,4290831769,4290839944,4290848021,4290856001,4290863886,4290871676,4290879373,4290886977,4290894490,4290901913,4290909247,4290916493,4290923652,4290930725,4290937713,4290944617,4290951438,4290958178,4290964837,4290971416,4290977916,4290984338,4290990683,4290996952,4291003145,4291009264,4291015310,4291021283,4291027184,4291033015,4291038776,4291044468,4291050091,4291055647,4291061136,4291066559,4291071917,4291077211,4291082441,4291087609,4291092715,4291097759,4291102743,4291107667,4291112532,4291117338,4291122087,4291126779
-//Base - Baby Jobs
-99,4023:4024:4025:4026:4027:4028:4029:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4045,0,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,8109652,8643822,9206127,9797599,10419283,11072238,11757533,12476249,13229476,14018313,14843866,15707247,16609574,17551968,18535552,19561452,20630792,21744696,22904284,24110674,25364977,26668297,28021732,29426368,30883282,32393539,33958189,35578269,37254799,38988782,40781202,42633023,44545189,46518620,48554214,50652844,52815357,55042573,57335285,59694256,62120220,64613880,67175907,69806941,72507587,75278418,78119970,81032746,84017211,87073795,90202891,93404853,96680000,100028610,103450924,106947144,110517434,114161918,117880680,121673767,125541185,129482901,133498844,137588903,141752928,145990732,150302088,154686733,159144364,163674642,168277191,172951600,177697420,182514167,187401324,192358338,197384623,202479560,207642499,212872757,218169621,223532347,228960163,234452268,240007834,245626005,251305900,257046613,262847212,268706744,274624232,280598679,286629065,292714352,298853483,305045382,311288957,317583099,323926685,330318577,336757623,343242660,349772512,356345994,362961909,369619053,376316214,383052171,389825698,396635564,403480532,410359362,417270811,424213634,431186584,438188413,445217874,452273720,459354706,466459588,473587127,480736086,487905232,495093338,502299181,509521545,516759221,524011006,531275705,538552132,545839109,553135467,560440047,567751700,575069288,582391684,589717771,597046446,604376616,611707202,619037136,626365365,633690848,641012559,648329484,655640625,662944998,670241632,677529573,684807881,692075631,699331913,706575834,713806514,721023091,728224718,735410563,742579811,749731663,756865335,763980061,771075089,778149684,785203127,792234715,799243761,806229595,813191563,820129025,827041359,833927958,840788232,847621604,854427516,861205423,867954796,874675123,881365905,888026659,894656917,901256227,907824150,914360262,920864154,927335431,933773713,940178632,946549836,952886985,959189754,965457830,971690914,977888720,984050975,990177418,996267800,1002321886,1008339452,1014320285,1020264186,1026170966,1032040448,1037872466,1043666865,1049423500,1055142238,1060822955,1066465539,1072069886,1077635904,1083163509,1088652627,1094103193,1099515152,1104888457,1110223070,1115518962,1120776112,1125994507,1131174143,1136315022,1141417155,1146480560,1151505263,1156491296,1161438699,1166347518,1171217806,1176049622,1180843032,1185598108,1190314928,1194993575,1199634138,1204236712,1208801396,1213328296,1217817522,1222269189,1226683417,1231060330,1235400057,1239702732,1243968491,1248197476,1252389832,1256545708,1260665257,1264748635,1268796001,1272807518,1276783353,1280723674,1284628654,1288498467,1292333290,1296133304,1299898691,1303629636,1307326326,1310988950,1314617700,1318212769,1321774352,1325302646,1328797850,1332260164,1335689790,1339086931,1342451791,1345784576,1349085494,1352354752,1355592559,1358799125,1361974661,1365119379,1368233491,1371317210,1374370750,1377394325,1380388150,1383352439,1386287408,1389193273,1392070249,1394918553,1397738400,1400530007,1403293591,1406029367,1408737552,1411418361,1414072010,1416698715,1419298692,1421872155,1424419319,1426940398,1429435606,1431905157,1434349263,1436768137,1439161990,1441531034,1443875479,1446195535,1448491412,1450763318,1453011460,1455236046,1457437282,1459615373,1461770523,1463902937,1466012816,1468100363,1470165779,1472209264,1474231016,1476231234,1478210114,1480167853,1482104645,1484020685,1485916165,1487791277,1489646211,1491481157,1493296304,1495091838,1496867946,1498624813,1500362623,1502081558,1503781800,1505463529,1507126924,1508772163,1510399423,1512008880,1513600707,1515175078,1516732165,1518272138,1519795167,1521301420,1522791064,1524264265,1525721187,1527161994,1528586847,1529995908,1531389336,1532767289,1534129924,1535477397,1536809863,1538127475,1539430385,1540718744,1541992701,1543252405,1544498003,1545729641,1546947464,1548151616,1549342238,1550519472,1551683458,1552834334,1553972238,1555097306,1556209673,1557309473,1558396839,1559471902,1560534793,1561585640,1562624572,1563651716,1564667197,1565671140,1566663668,1567644904,1568614969,1569573982,1570522063,1571459329,1572385897,1573301883,1574207401,1575102565,1575987487,1576862278,1577727048,1578581907,1579426962,1580262321,1581088090,1581904373,1582711275,1583508898,1584297344,1585076715,1585847110,1586608628,1587361366,1588105422,1588840892,1589567871,1590286453,1590996731,1591698797,1592392743,1593078658,1593756633,1594426755,1595089112,1595743791,1596390878,1597030458,1597662614,1598287430,1598904988,1599515370,1600118656,1600714926,1601304259,1601886733,1602462426,1603031414,1603593772,1604149576,1604698899,1605241815,1605778396,1606308715,1606832842,1607350847,1607862800,1608368770,1608868825,1609363032,1609851457,1610334167,1610811226,1611282699,1611748650,1612209142,1612664237,1613113997,1613558483,1613997756,1614431875,1614860899,1615284887,1615703896,1616117984,1616527207,1616931621,1617331282,1617726244,1618116561,1618502287,1618883474,1619260175,1619632442,1620000326,1620363877,1620723146,1621078182,1621429033,1621775749,1622118377,1622456965,1622791559,1623122206,1623448951,1623771840,1624090917,1624406227,1624717813,1625025719,1625329987,1625630660,1625927779,1626221386,1626511522,1626798227,1627081541,1627361504,1627638155,1627911532,1628181674,1628448618,1628712402,1628973062,1629230635,1629485157,1629736664,1629985191,1630230773,1630473445,1630713240,1630950192,1631184334,1631415700,1631644322,1631870232,1632093461,1632314042,1632532005,1632747381,1632960200,1633170493,1633378289,1633583617,1633786507,1633986987,1634185085,1634380829,1634574248,1634765368,1634954216,1635140820,1635325205,1635507398,1635687425,1635865311,1636041081,1636214761,1636386375,1636555947,1636723501,1636889061,1637052651,1637214294,1637374013,1637531831,1637687770,1637841852,1637994099,1638144533,1638293176,1638440048,1638585171,1638728565,1638870250,1639010247,1639148576,1639285256,1639420307,1639553749,1639685600,1639815879,1639944605,1640071796,1640197471,1640321647,1640444342,1640565574,1640685360,1640803717,1640920662,1641036212,1641150383,1641263192,1641374655,1641484788,1641593607,1641701127,1641807363,1641912331,1642016046,1642118523,1642219777,1642319822,1642418672,1642516342,1642612846,1642708197,1642802409,1642895496,1642987471,1643078348,1643168139,1643256857,1643344515,1643431126,1643516702,1643601256,1643684799,1643767344,1643848902,1643929486,1644009107,1644087776,1644165505,1644242304,1644318185,1644393159,1644467237,1644540429,1644612746,1644684198,1644754796,1644824550,1644893470,1644961565,1645028846,1645095322,1645161003,1645225899,1645290018,1645353370,1645415965,1645477811,1645538917,1645599292,1645658945,1645717884,1645776118,1645833655,1645890503,1645946671,1646002167,1646056999,1646111175,1646164702,1646217589,1646269843,1646321471,1646372481,1646422881,1646472677,1646521877,1646570488,1646618517,1646665972,1646712858,1646759183,1646804953,1646850175,1646894856,1646939002,1646982619,1647025714,1647068293,1647110362,1647151927,1647192995,1647233571,1647273661,1647313271,1647352406,1647391073,1647429277,1647467023,1647504317,1647541164,1647577570,1647613540,1647649079,1647684192,1647718884,1647753161,1647787027,1647820488,1647853548,1647886212,1647918484,1647950370,1647981874,1648013000,1648043753,1648074138,1648104159,1648133820,1648163126,1648192080,1648220687,1648248952,1648276878,1648304469,1648331730,1648358664,1648385275,1648411567,1648437544,1648463210,1648488568,1648513622,1648538376,1648562833,1648586997,1648610872,1648634460,1648657766,1648680792,1648703542,1648726020,1648748228,1648770170,1648791849,1648813268,1648834430,1648855339,1648875997,1648896407,1648916573,1648936497,1648956182,1648975631,1648994847,1649013832,1649032590,1649051123,1649069434,1649087525,1649105399,1649123059,1649140507,1649157746,1649174778,1649191606,1649208232,1649224659,1649240889,1649256924,1649272767,1649288420,1649303885,1649319165,1649334262,1649349178,1649363915,1649378475,1649392861,1649407074,1649421117,1649434991,1649448699,1649462242,1649475623,1649488844,1649501906,1649514811,1649527562,1649540160,1649552607,1649564904,1649577054,1649589058,1649600918,1649612636,1649624213,1649635652,1649646953,1649658119,1649669151,1649680051,1649690820,1649701460,1649711972,1649722358,1649732619,1649742757,1649752774,1649762671,1649772449,1649782110,1649791655,1649801085,1649810402,1649819607,1649828702,1649837688,1649846566,1649855338,1649864004,1649872566,1649881026,1649889384,1649897642,1649905801,1649913862,1649921826,1649929695,1649937469,1649945150,1649952739,1649960237,1649967645,1649974964,1649982195,1649989340,1649996399,1650003373,1650010263,1650017071,1650023797,1650030442,1650037008,1650043495,1650049904,1650056236,1650062492,1650068673,1650074780,1650080814,1650086775,1650092665,1650098484,1650104233,1650109913,1650115525,1650121070,1650126548,1650131961,1650137309,1650142593,1650147813,1650152971,1650158067,1650163102,1650168076,1650172990,1650177845,1650182642,1650187382,1650192065,1650196692,1650201263,1650205779,1650210241,1650214650,1650219006,1650223309,1650227561,1650231762,1650235912,1650240012,1650244063,1650248066,1650252021,1650255928,1650259788,1650263602,1650267370,1650271093,1650274771,1650278405,1650281996,1650285544,1650289049,1650292512,1650295933,1650299313,1650302653,1650305953,1650309213,1650312434,1650315616,1650318760,1650321866,1650324935,1650327967,1650330963,1650333923,1650336847,1650339736,1650342591,1650345411,1650348198,1650350951,1650353671,1650356358,1650359013,1650361636,1650364228,1650366789,1650369319,1650371819,1650374289,1650376729,1650379140,1650381522,1650383875,1650386200,1650388497,1650390766,1650393008,1650395223,1650397412,1650399574,1650401711,1650403822,1650405908,1650407969,1650410005,1650412016,1650414003,1650415966,1650417906,1650419823,1650421717,1650423588,1650425436,1650427262,1650429066
-//Job - Novice
-10,0,1,10,18,28,40,91,151,205,268,340,0
-//Job - 1st Classes
-50,1:2:3:4:5:6:26:4046,1,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,329843,379102,434567,496856,566629,644589,731482,828096,935264,1053861,1184807,1329062,1487630,1661554,1851918,2059842,2286484,2533034,2800715,3090779,3404503,3743189,4108159,4500752,4922319,5374222,5857829,6374510,6925632,7512557,8136637,8799208,9501590,10245078,11030942,11860420,12734717,13654998,14622385,15637956,16702739,17817709,18983785,20201828,21472637,22796947,24175427,25608679,27097233,28641549,30242013,31898938,33612561,35383045,37210476,39094865,41036147,43034181,45088752,47199571,49366275,51588430,53865531,56197005,58582210,61020440,63510925,66052833,68645274,71287301,73977913,76716056,79500628,82330481,85204422,88121217,91079595,94078248,97115837,100190993,103302318,106448393,109627775,112839003,116080601,119351078,122648934,125972660,129320741,132691658,136083893,139495928,142926248,146373345,149835718,153311875,156800336,160299633,163808315,167324946,170848108,174376402,177908451,181442899,184978413,188513685,192047431,195578393,199105341,202627072,206142410,209650210,213149356,216638760,220117366,223584148,227038110,230478288,233903749,237313590,240706940,244082960,247440841,250779805,254099105,257398024,260675877,263932007,267165788,270376624,273563946,276727216,279865923,282979584,286067743,289129972,292165868,295175054,298157179,301111917,304038965,306938045,309808901,312651301,315465033,318249908,321005758,323732433,326429805,329097764,331736219,334345097,336924341,339473912,341993787,344483958,346944434,349375236,351776401,354147978,356490030,358802632,361085872,363339848,365564669,367760455,369927336,372065452,374174951,376255991,378308737,380333362,382330048,384298982,386240358,388154377,390041246,391901177,393734387,395541098,397321537,399075935,400804526,402507549,404185246,405837861,407465642,409068839,410647704,412202492,413733459,415240862,416724961,418186016,419624289,421040041,422433535,423805034,425154801,426483099,427790192,429076343,430341814,431586867,432811764,434016766,435202133,436368124,437514996,438643007,439752411,440843463,441916415,442971519,444009023,445029176,446032223,447018409,447987976,448941165,449878214,450799359,451704835,452594875,453469708,454329562,455174663,456005235,456821498,457623672,458411973,459186616,459947813,460695773,461430704,462152810,462862294,463559356,464244194,464917003,465577976,466227304,466865175,467491774,468107285,468711889,469305764,469889087,470462031,471024768,471577467,472120295,472653416,473176993,473691185,474196151,474692045,475179021,475657230,476126821,476587940,477040732,477485339,477921901,478350556,478771440,479184687,479590429,479988796,480379915,480763913,481140913,481511037,481874405,482231136,482581346,482925149,483262657,483593982,483919232,484238515,484551937,484859601,485161609,485458061,485749057,486034693,486315066,486590269,486860394,487125532,487385773,487641205,487891913,488137983,488379498,488616541,488849192,489077530,489301633,489521578,489737440,489949293,490157210,490361262,490561520,490758052,490950927,491140211,491325969,491508266,491687165,491862728,492035017,492204091,492370009,492532829,492692607,492849400,493003262,493154248,493302410,493447800,493590469,493730468,493867845,494002649,494134928,494264728,494392095,494517074,494639709,494760043,494878119,494993979,495107664,495219215,495328671,495436070,495541451,495644852,495746309,495845859,495943537,496039378,496133416,496225684,496316216,496405044,496492199,496577713,496661617,496743940,496824712,496903963,496981720,497058012,497132865,497206307,497278364,497349062,497418427,497486483,497553255,497618767,497683043,497746106,497807978,497868682,497928240,497986673,498044003,498100250,498155434,498209576,498262695,498314810,498365940,498416104,498465319,498513604,498560976,498607452,498653050,498697785,498741674,498784733,498826978,498868423,498909084,498948976,498988113,499026509,499064179,499101136,499137393,499172964,499207862,499242099,499275688,499308641,499340970,499372686,499403802,499434328,499464276,499493657,499522481,499550759,499578502,499605719,499632420,499658615,499684314,499709526,499734260,499758525,499782330,499805684,499828596,499851073,499873124,499894757,499915980,499936801,499957227,499977266,499996925,500016211,500035131,500053692,500071901,500089765,500107290,500124483,500141350,500157897,500174130,500190055,500205678,500221004,500236040,500250790,500265261,500279457,500293384,500307047,500320450,500333599,500346498,500359153,500371568,500383747,500395695,500407416,500418915,500430195,500441261,500452117,500462767,500473215,500483465,500493520,500503384,500513061,500522554,500531867,500541003,500549966,500558759,500567385,500575847,500584149,500592293,500600282,500608120,500615809,500623352,500630752,500638011,500645132,500652118,500658971,500665694,500672290,500678760,500685108,500691335,500697444,500703437,500709316,500715083,500720741,500726291,500731736,500737078,500742318,500747459,500752502,500757449,500762302,500767063,500771734,500776316,500780811,500785220,500789546,500793790,500797953,500802037,500806043,500809973,500813829,500817611,500821321,500824961,500828532,500832035,500835471,500838842,500842149,500845393,500848576,500851698,500854761,500857766,500860714,500863606,500866443,500869226,500871956,500874634,500877261,500879838,500882366,500884846,500887279,500889666,500892008,500894305,500896558,500898769,500900938,500903065,500905152,500907199,500909207,500911177,500913110,500915006,500916866,500918691,500920481,500922237,500923960,500925650,500927308,500928934,500930529,500932094,500933629,500935135,500936613,500938063,500939485,500940880,500942248,500943590,500944907,500946199,500947466,500948709,500949929,500951125,500952299,500953450,500954580,500955688,500956775,500957841,500958887,500959913,500960920,500961908,500962877,500963827,500964759,500965674,500966571,500967451,500968314,500969161,500969992,500970807,500971607,500972391,500973160,500973915,500974656,500975382,500976095,500976794,500977480,500978153,500978813,500979460,500980095,500980718,500981329,500981929,500982517,500983094,500983660,500984215,500984760,500985294,500985818,500986332,500986836,500987331,500987816,500988292,500988759,500989217,500989667,500990108,500990541,500990965,500991381,500991789,500992190,500992583,500992968,500993346,500993717,500994081,500994438,500994788,500995132,500995469,500995800,500996124,500996442,500996754,500997060,500997360,500997655,500997944,500998227,500998505,500998778,500999046,500999309,500999567,500999820,501000068,501000311,501000549,501000783,501001012,501001237,501001458,501001675,501001887,501002095,501002299,501002500,501002697,501002890,501003079,501003265,501003447,501003626,501003801,501003973,501004142,501004307,501004469,501004628,501004784,501004937,501005087,501005234,501005379,501005521,501005660,501005796,501005930,501006061,501006190,501006316,501006440,501006562,501006681,501006798,501006913,501007026,501007136,501007244,501007350,501007454,501007556,501007656,501007754,501007850,501007945,501008038,501008129,501008218,501008306,501008392,501008476,501008559,501008640,501008720,501008798,501008875,501008950,501009024,501009096,501009167,501009237,501009305,501009372,501009438,501009502,501009565,501009627,501009688,501009748,501009806,501009863,501009919,501009974,501010028,501010081,501010133,501010184,501010234,501010283,501010331,501010378,501010424,501010469,501010514,501010558,501010601,501010643,501010684,501010724,501010764,501010803,501010841,501010878,501010915,501010951,501010986,501011021,501011055,501011088,501011121,501011153,501011184,501011215,501011245,501011275,501011304,501011332,501011360,501011387,501011414,501011440,501011466,501011491,501011516,501011540,501011564,501011587,501011610,501011633,501011655,501011677,501011698,501011719,501011739,501011759,501011779,501011798,501011817,501011835,501011853,501011871,501011888,501011905,501011922,501011938,501011954,501011970,501011985,501012000,501012015,501012030,501012044,501012058,501012072,501012085,501012098,501012111,501012124,501012136,501012148,501012160,501012172,501012183,501012194,501012205,501012216,501012227,501012237,501012247,501012257,501012267,501012277,501012286,501012295,501012304,501012313,501012322,501012330,501012338,501012346,501012354,501012362,501012370,501012378,501012385,501012392,501012399,501012406,501012413,501012420,501012427,501012433,501012439,501012445,501012451,501012457,501012463,501012469,501012475,501012480,501012485,501012490,501012495,501012500,501012505,501012510,501012515,501012520,501012524,501012528,501012532,501012536,501012540,501012544,501012548,501012552,501012556,501012560,501012564,501012568,501012571,501012574,501012577,501012580,501012583,501012586,501012589,501012592,501012595,501012598,501012601,501012604,501012607,501012610,501012613,501012615,501012617,501012619,501012621,501012623,501012625,501012627,501012629,501012631,501012633,501012635,501012637,501012639,501012641,501012643,501012645,501012647,501012649,501012651,501012653,501012655,501012656,501012657,501012658,501012659,501012660,501012661,501012662,501012663,501012664,501012665,501012666,501012667,501012668,501012669,501012670,501012671,501012672,501012673,501012674,501012675,501012676,501012677,501012678,501012679,501012680,501012681,501012682,501012683,501012684,501012685,501012686,501012687,501012688,501012689,501012690,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691
-//Job - 2nd Classes
-50,7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4049,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,704689,811527,932059,1067681,1219884,1390260,1580501,1792401,2027857,2288870,2577542,2896079,3246785,3632064,4054414,4516427,5020783,5570245,6167657,6815936,7518065,8277089,9096106,9978260,10926733,11944736,13035502,14202274,15448298,16776813,18191041,19694176,21289377,22979756,24768369,26658206,28652182,30753126,32963775,35286762,37724609,40279720,42954371,45750705,48670723,51716280,54889077,58190657,61622401,65185522,68881063,72709894,76672708,80770021,85002169,89369310,93871421,98508300,103279567,108184665,113222861,118393251,123694760,129126148,134686012,140372791,146184770,152120084,158176725,164352547,170645270,177052488,183571672,190200181,196935263,203774065,210713640,217750950,224882876,232106223,239417728,246814065,254291853,261847661,269478017,277179412,284948306,292781137,300674324,308624274,316627388,324680066,332778713,340919742,349099582,357314681,365561510,373836570,382136392,390457544,398796635,407150316,415515285,423888291,432266134,440645671,449023816,457397543,465763888,474119952,482462902,490789971,499098461,507385745,515649266,523886539,532095151,540272763,548417108,556525995,564597304,572628991,580619086,588565690,596466980,604321205,612126687,619881818,627585062,635234954,642830098,650369167,657850901,665274107,672637658,679940491,687181606,694360067,701474996,708525577,715511052,722430719,729283933,736070103,742788691,749439211,756021226,762534350,768978243,775352612,781657209,787891828,794056307,800150524,806174396,812127878,818010962,823823676,829566082,835238274,840840378,846372551,851834978,857227874,862551478,867806057,872991902,878109327,883158668,888140283,893054550,897901867,902682649,907397329,912046357,916630197,921149329,925604246,929995454,934323471,938588826,942792060,946933722,951014371,955034574,958994906,962895949,966738291,970522526,974249254,977919079,981532609,985090456,988593235,992041563,995436060,998777348,1002066049,1005302786,1008488184,1011622866,1014707457,1017742580,1020728856,1023666907,1026557352,1029400809,1032197893,1034949218,1037655393,1040317027,1042934723,1045509083,1048040705,1050530182,1052978105,1055385060,1057751629,1060078390,1062365915,1064614774,1066825530,1068998742,1071134965,1073234748,1075298634,1077327163,1079320868,1081280278,1083205916,1085098299,1086957939,1088785342,1090581010,1092345438,1094079115,1095782526,1097456149,1099100457,1100715917,1102302990,1103862133,1105393795,1106898420,1108376447,1109828309,1111254434,1112655243,1114031153,1115382574,1116709911,1118013563,1119293924,1120551383,1121786323,1122999122,1124190152,1125359779,1126508366,1127636269,1128743839,1129831422,1130899359,1131947986,1132977634,1133988629,1134981292,1135955938,1136912879,1137852422,1138774868,1139680514,1140569653,1141442572,1142299555,1143140880,1143966822,1144777651,1145573633,1146355029,1147122096,1147875088,1148614253,1149339836,1150052079,1150751218,1151437486,1152111113,1152772324,1153421341,1154058381,1154683659,1155297386,1155899769,1156491012,1157071316,1157640877,1158199889,1158748542,1159287023,1159815516,1160334201,1160843257,1161342858,1161833175,1162314377,1162786630,1163250097,1163704937,1164151308,1164589365,1165019259,1165441139,1165855152,1166261441,1166660148,1167051412,1167435370,1167812155,1168181900,1168544733,1168900782,1169250171,1169593023,1169929459,1170259597,1170583552,1170901439,1171213370,1171519455,1171819803,1172114519,1172403707,1172687470,1172965908,1173239120,1173507203,1173770252,1174028360,1174281619,1174530119,1174773949,1175013195,1175247943,1175478276,1175704277,1175926026,1176143603,1176357085,1176566548,1176772068,1176973718,1177171570,1177365695,1177556163,1177743042,1177926399,1178106300,1178282809,1178455990,1178625906,1178792617,1178956183,1179116664,1179274117,1179428599,1179580165,1179728870,1179874768,1180017912,1180158353,1180296142,1180431328,1180563961,1180694088,1180821757,1180947013,1181069902,1181190469,1181308757,1181424809,1181538667,1181650373,1181759966,1181867487,1181972975,1182076467,1182178002,1182277616,1182375346,1182471227,1182565293,1182657579,1182748119,1182836945,1182924090,1183009586,1183093463,1183175752,1183256483,1183335686,1183413389,1183489621,1183564409,1183637781,1183709763,1183780382,1183849663,1183917632,1183984313,1184049731,1184113909,1184176871,1184238640,1184299239,1184358689,1184417013,1184474231,1184530365,1184585435,1184639461,1184692463,1184744460,1184795471,1184845515,1184894611,1184942776,1184990027,1185036382,1185081858,1185126472,1185170240,1185213178,1185255302,1185296627,1185337168,1185376940,1185415958,1185454236,1185491788,1185528627,1185564767,1185600222,1185635004,1185669126,1185702601,1185735441,1185767658,1185799263,1185830269,1185860686,1185890526,1185919800,1185948518,1185976691,1186004330,1186031444,1186058044,1186084139,1186109739,1186134853,1186159490,1186183659,1186207370,1186230631,1186253450,1186275836,1186297797,1186319341,1186340476,1186361210,1186381550,1186401504,1186421079,1186440283,1186459122,1186477604,1186495735,1186513521,1186530970,1186548087,1186564879,1186581353,1186597514,1186613368,1186628921,1186644179,1186659147,1186673831,1186688236,1186702367,1186716230,1186729830,1186743172,1186756260,1186769100,1186781696,1186794053,1186806175,1186818067,1186829733,1186841177,1186852404,1186863418,1186874223,1186884822,1186895220,1186905421,1186915428,1186925245,1186934875,1186944322,1186953590,1186962682,1186971601,1186980351,1186988935,1186997356,1187005617,1187013721,1187021671,1187029470,1187037121,1187044626,1187051989,1187059212,1187066298,1187073249,1187080068,1187086758,1187093321,1187099759,1187106075,1187112271,1187118349,1187124311,1187130160,1187135898,1187141527,1187147049,1187152466,1187157780,1187162993,1187168107,1187173124,1187178046,1187182874,1187187611,1187192258,1187196816,1187201288,1187205675,1187209978,1187214200,1187218341,1187222404,1187226390,1187230300,1187234136,1187237899,1187241590,1187245211,1187248763,1187252248,1187255667,1187259021,1187262311,1187265538,1187268704,1187271810,1187274857,1187277846,1187280778,1187283655,1187286477,1187289245,1187291961,1187294625,1187297238,1187299802,1187302317,1187304784,1187307204,1187309578,1187311907,1187314192,1187316434,1187318633,1187320790,1187322906,1187324982,1187327019,1187329017,1187330977,1187332900,1187334786,1187336636,1187338451,1187340232,1187341979,1187343693,1187345374,1187347023,1187348641,1187350228,1187351785,1187353312,1187354810,1187356280,1187357722,1187359136,1187360524,1187361885,1187363220,1187364530,1187365815,1187367076,1187368313,1187369526,1187370716,1187371883,1187373028,1187374151,1187375253,1187376334,1187377395,1187378435,1187379456,1187380457,1187381439,1187382403,1187383348,1187384275,1187385185,1187386077,1187386952,1187387811,1187388653,1187389479,1187390290,1187391085,1187391865,1187392630,1187393381,1187394118,1187394841,1187395550,1187396245,1187396927,1187397596,1187398252,1187398896,1187399528,1187400148,1187400756,1187401352,1187401937,1187402511,1187403074,1187403626,1187404168,1187404699,1187405220,1187405731,1187406233,1187406725,1187407208,1187407682,1187408147,1187408603,1187409050,1187409489,1187409919,1187410341,1187410755,1187411161,1187411559,1187411950,1187412333,1187412709,1187413078,1187413440,1187413795,1187414143,1187414485,1187414820,1187415149,1187415472,1187415788,1187416098,1187416402,1187416701,1187416994,1187417281,1187417563,1187417840,1187418111,1187418377,1187418638,1187418894,1187419145,1187419391,1187419633,1187419870,1187420103,1187420331,1187420555,1187420775,1187420990,1187421201,1187421408,1187421611,1187421810,1187422006,1187422198,1187422386,1187422571,1187422752,1187422930,1187423104,1187423275,1187423443,1187423608,1187423769,1187423927,1187424082,1187424234,1187424383,1187424530,1187424674,1187424815,1187424953,1187425089,1187425222,1187425353,1187425481,1187425607,1187425730,1187425851,1187425970,1187426086,1187426200,1187426312,1187426422,1187426530,1187426636,1187426740,1187426842,1187426942,1187427040,1187427136,1187427230,1187427322,1187427413,1187427502,1187427589,1187427674,1187427758,1187427840,1187427921,1187428000,1187428078,1187428154,1187428229,1187428302,1187428374,1187428444,1187428513,1187428581,1187428648,1187428713,1187428777,1187428840,1187428902,1187428962,1187429021,1187429079,1187429136,1187429192,1187429247,1187429301,1187429354,1187429406,1187429457,1187429507,1187429556,1187429604,1187429651,1187429697,1187429742,1187429786,1187429829,1187429872,1187429914,1187429955,1187429995,1187430034,1187430073,1187430111,1187430148,1187430184,1187430220,1187430255,1187430289,1187430323,1187430356,1187430388,1187430420,1187430451,1187430482,1187430512,1187430541,1187430570,1187430598,1187430626,1187430653,1187430680,1187430706,1187430732,1187430757,1187430782,1187430806,1187430830,1187430853,1187430876,1187430898,1187430920,1187430942,1187430963,1187430984,1187431004,1187431024,1187431044,1187431063,1187431082,1187431100,1187431118,1187431136,1187431153,1187431170,1187431187,1187431203,1187431219,1187431235,1187431250,1187431265,1187431280,1187431295,1187431309,1187431323,1187431337,1187431350,1187431363,1187431376,1187431389,1187431401,1187431413,1187431425,1187431437,1187431448,1187431459,1187431470,1187431481,1187431492,1187431502,1187431512,1187431522,1187431532,1187431542,1187431551,1187431560,1187431569,1187431578,1187431587,1187431595,1187431603,1187431611,1187431619,1187431627,1187431635,1187431642,1187431649,1187431656,1187431663,1187431670,1187431677,1187431684,1187431690,1187431696,1187431702,1187431708,1187431714,1187431720,1187431726,1187431732,1187431737,1187431742,1187431747,1187431752,1187431757,1187431762,1187431767,1187431772,1187431777,1187431782,1187431786,1187431790,1187431794,1187431798,1187431802,1187431806,1187431810,1187431814,1187431818,1187431822,1187431826,1187431829,1187431832,1187431835,1187431838,1187431841,1187431844,1187431847,1187431850,1187431853,1187431856,1187431859,1187431862,1187431865,1187431868,1187431871,1187431873,1187431875,1187431877,1187431879,1187431881,1187431883,1187431885,1187431887,1187431889,1187431891,1187431893,1187431895,1187431897,1187431899,1187431901,1187431903,1187431905,1187431907,1187431909,1187431911,1187431913,1187431915,1187431916,1187431917,1187431918,1187431919,1187431920,1187431921,1187431922
-//Job - Super Novice
-99,23,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
-//Job - Novice High
-10,4001,1,11,20,31,44,100,166,226,295,374,0
-//Job - Adv First Classes
-50,4002:4003:4004:4005:4006:4007,1,60,86,116,152,232,360,440,544,672,1040,1208,1398,1604,1896,2250,3336,3874,4452,6080,7976,11128,12544,14042,18228,28683,38225,42228,46425,58073,70898,91195,99290,107720,131043,156238,195408,210430,226010,269028,314788,384853,479453,510878,620880,715530,822388,942708,1077832,1229192,1398312,1586809,1796395,2028875,2286150,2570212,2883147,3227131,3604428,4017387,4468440,4960097,5494942,6075626,6704865,7385431,8120148,8911883,9763540,10678052,11658373,12707470,13828314,15023872,16297098,17650924,19088250,20611938,22224798,23929585,25728985,27625611,29621990,31720558,33923652,36233502,38652223,41181809,43824128,46580913,49453759,52444118,55553293,58782437,62132546,65604458,69198851,72916241,76756979,80721254,84809088,89020341,93354708,97811721,102390753,107091018,111911574,116851326,121909029,127083292,132372582,137775229,143289430,148913253,154644644,160481430,166421327,172461943,178600787,184835272,191162721,197580376,204085402,210674892,217345875,224095322,230920151,237817234,244783402,251815451,258910149,266064240,273274451,280537495,287850079,295208908,302610689,310052137,317529979,325040959,332581841,340149414,347740495,355351934,362980617,370623468,378277453,385939583,393606917,401276564,408945685,416611495,424271267,431922331,439562077,447187956,454797483,462388235,469957854,477504049,485024593,492517328,499980161,507411067,514808089,522169338,529492992,536777296,544020563,551221172,558377570,565488268,572551843,579566936,586532253,593446562,600308694,607117541,613872055,620571248,627214189,633800006,640327881,646797052,653206812,659556504,665845524,672073319,678239382,684343257,690384532,696362841,702277862,708129315,713916962,719640605,725300085,730895280,736426105,741892510,747294479,752632028,757905206,763114091,768258791,773339442,778356208,783309277,788198862,793025201,797788555,802489205,807127454,811703625,816218058,820671113,825063166,829394608,833665848,837877307,842029420,846122635,850157413,854134225,858053552,861915887,865721730,869471590,873165985,876805439,880390483,883921654,887399495,890824553,894197380,897518531,900788566,904008046,907177537,910297605,913368818,916391747,919366961,922295032,925176531,928012029,930802096,933547303,936248218,938905408,941519439,944090875,946620278,949108207,951555219,953961868,956328705,958656278,960945131,963195806,965408840,967584767,969724117,971827415,973895183,975927939,977926195,979890460,981821237,983719026,985584322,987417614,989219387,990990121,992730290,994440365,996120811,997772088,999394651,1000988949,1002555426,1004094522,1005606671,1007092302,1008551839,1009985700,1011394298,1012778042,1014137334,1015472572,1016784149,1018072452,1019337863,1020580760,1021801514,1023000493,1024178058,1025334567,1026470371,1027585817,1028681247,1029756999,1030813405,1031850792,1032869483,1033869796,1034852045,1035816538,1036763579,1037693467,1038606498,1039502962,1040383145,1041247329,1042095790,1042928803,1043746635,1044549552,1045337813,1046111675,1046871391,1047617208,1048349371,1049068120,1049773692,1050466319,1051146230,1051813650,1052468801,1053111901,1053743164,1054362800,1054971017,1055568019,1056154006,1056729176,1057293722,1057847834,1058391700,1058925505,1059449429,1059963650,1060468344,1060963682,1061449833,1061926964,1062395238,1062854815,1063305853,1063748508,1064182931,1064609273,1065027680,1065438297,1065841266,1066236727,1066624817,1067005670,1067379419,1067746194,1068106123,1068459331,1068805942,1069146076,1069479853,1069807389,1070128800,1070444198,1070753693,1071057395,1071355410,1071647844,1071934799,1072216376,1072492675,1072763794,1073029828,1073290871,1073547016,1073798354,1074044974,1074286963,1074524407,1074757391,1074985997,1075210307,1075430400,1075646355,1075858249,1076066158,1076270156,1076470315,1076666707,1076859403,1077048471,1077233979,1077415993,1077594579,1077769801,1077941721,1078110401,1078275902,1078438283,1078597603,1078753918,1078907285,1079057760,1079205396,1079350247,1079492364,1079631799,1079768602,1079902823,1080034510,1080163711,1080290472,1080414839,1080536857,1080656570,1080774021,1080889253,1081002307,1081113225,1081222046,1081328810,1081433556,1081536322,1081637145,1081736061,1081833107,1081928317,1082021726,1082113368,1082203277,1082291485,1082378024,1082462925,1082546220,1082627938,1082708110,1082786764,1082863929,1082939633,1083013904,1083086769,1083158254,1083228386,1083297189,1083364689,1083430911,1083495879,1083559616,1083622146,1083683491,1083743674,1083802717,1083860641,1083917467,1083973217,1084027910,1084081567,1084134207,1084185849,1084236512,1084286215,1084334976,1084382812,1084429742,1084475782,1084520949,1084565260,1084608731,1084651377,1084693215,1084734259,1084774525,1084814027,1084852780,1084890798,1084928095,1084964685,1085000581,1085035796,1085070343,1085104235,1085137484,1085170102,1085202101,1085233493,1085264289,1085294501,1085324140,1085353217,1085381742,1085409726,1085437179,1085464111,1085490532,1085516451,1085541878,1085566823,1085591294,1085615301,1085638852,1085661956,1085684622,1085706858,1085728672,1085750072,1085771065,1085791660,1085811864,1085831684,1085851128,1085870203,1085888916,1085907274,1085925283,1085942950,1085960282,1085977285,1085993965,1086010328,1086026381,1086042129,1086057578,1086072734,1086087602,1086102188,1086116497,1086130534,1086144304,1086157813,1086171065,1086184066,1086196820,1086209332,1086221606,1086233647,1086245459,1086257047,1086268415,1086279567,1086290507,1086301240,1086311769,1086322098,1086332231,1086342171,1086351922,1086361488,1086370872,1086380078,1086389109,1086397969,1086406661,1086415187,1086423552,1086431758,1086439808,1086447705,1086455452,1086463052,1086470507,1086477821,1086484996,1086492035,1086498940,1086505714,1086512359,1086518878,1086525273,1086531547,1086537701,1086543738,1086549661,1086555471,1086561171,1086566763,1086572248,1086577629,1086582908,1086588087,1086593167,1086598151,1086603040,1086607836,1086612541,1086617157,1086621685,1086626127,1086630485,1086634760,1086638954,1086643068,1086647104,1086651063,1086654947,1086658757,1086662495,1086666162,1086669759,1086673288,1086676750,1086680146,1086683477,1086686745,1086689951,1086693096,1086696181,1086699208,1086702177,1086705090,1086707947,1086710750,1086713500,1086716198,1086718844,1086721440,1086723987,1086726485,1086728936,1086731340,1086733699,1086736013,1086738283,1086740510,1086742694,1086744837,1086746939,1086749001,1086751024,1086753009,1086754956,1086756866,1086758740,1086760578,1086762381,1086764150,1086765885,1086767587,1086769257,1086770895,1086772502,1086774078,1086775624,1086777141,1086778629,1086780089,1086781521,1086782926,1086784304,1086785656,1086786982,1086788283,1086789559,1086790811,1086792039,1086793244,1086794426,1086795586,1086796724,1086797840,1086798935,1086800009,1086801063,1086802097,1086803111,1086804106,1086805082,1086806039,1086806978,1086807899,1086808803,1086809689,1086810559,1086811412,1086812249,1086813070,1086813875,1086814665,1086815440,1086816200,1086816946,1086817678,1086818396,1086819100,1086819791,1086820469,1086821134,1086821786,1086822426,1086823053,1086823669,1086824273,1086824865,1086825446,1086826016,1086826575,1086827124,1086827662,1086828190,1086828708,1086829216,1086829714,1086830203,1086830683,1086831153,1086831615,1086832068,1086832512,1086832948,1086833375,1086833794,1086834205,1086834608,1086835004,1086835392,1086835773,1086836147,1086836514,1086836874,1086837227,1086837573,1086837912,1086838245,1086838572,1086838892,1086839206,1086839514,1086839816,1086840113,1086840404,1086840690,1086840970,1086841245,1086841515,1086841779,1086842038,1086842292,1086842542,1086842787,1086843027,1086843263,1086843494,1086843721,1086843943,1086844161,1086844375,1086844585,1086844791,1086844993,1086845191,1086845385,1086845576,1086845763,1086845946,1086846126,1086846303,1086846476,1086846646,1086846813,1086846976,1086847136,1086847293,1086847447,1086847598,1086847746,1086847892,1086848035,1086848175,1086848312,1086848447,1086848579,1086848709,1086848836,1086848961,1086849083,1086849203,1086849321,1086849437,1086849550,1086849661,1086849770,1086849877,1086849982,1086850085,1086850186,1086850285,1086850382,1086850477,1086850571,1086850663,1086850753,1086850841,1086850928,1086851013,1086851096,1086851178,1086851258,1086851337,1086851414,1086851490,1086851564,1086851637,1086851708,1086851778,1086851847,1086851914,1086851980,1086852045,1086852109,1086852171,1086852232,1086852292,1086852351,1086852409,1086852466,1086852522,1086852576,1086852629,1086852681,1086852732,1086852782,1086852831,1086852879,1086852927,1086852974,1086853020,1086853065,1086853109,1086853152,1086853194,1086853236,1086853277,1086853317,1086853356,1086853394,1086853432,1086853469,1086853505,1086853541,1086853576,1086853610,1086853644,1086853677,1086853709,1086853741,1086853772,1086853802,1086853832,1086853861,1086853890,1086853918,1086853946,1086853973,1086854000,1086854026,1086854052,1086854077,1086854102,1086854126,1086854150,1086854173,1086854196,1086854218,1086854240,1086854261,1086854282,1086854303,1086854323,1086854343,1086854362,1086854381,1086854400,1086854418,1086854436,1086854454,1086854471,1086854488,1086854505,1086854521,1086854537,1086854553,1086854568,1086854583,1086854598,1086854612,1086854626,1086854640,1086854654,1086854667,1086854680,1086854693,1086854706,1086854718,1086854730,1086854742,1086854754,1086854765,1086854776,1086854787,1086854798,1086854808,1086854818,1086854828,1086854838,1086854848,1086854857,1086854866,1086854875,1086854884,1086854893,1086854902,1086854910,1086854918,1086854926,1086854934,1086854942,1086854950,1086854957,1086854964,1086854971,1086854978,1086854985,1086854992,1086854999,1086855005,1086855011,1086855017,1086855023,1086855029,1086855035,1086855041,1086855047,1086855052,1086855057,1086855062,1086855067,1086855072,1086855077,1086855082,1086855087,1086855092,1086855096,1086855100,1086855104,1086855108,1086855112,1086855116,1086855120,1086855124,1086855128,1086855132,1086855136,1086855140,1086855143,1086855146,1086855149,1086855152,1086855155,1086855158,1086855161,1086855164,1086855167,1086855170,1086855173,1086855176,1086855179,1086855182,1086855185,1086855187,1086855189,1086855191,1086855193,1086855195,1086855197,1086855199,1086855201,1086855203,1086855205,1086855207,1086855209,1086855211,1086855213,1086855215,1086855217,1086855219,1086855221,1086855223,1086855225,1086855227,1086855228,1086855229,1086855230,1086855231,1086855232,1086855233,1086855234,1086855235,1086855236
-//Job - Adv Second Classes
-70,24:25:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,1,368,568,696,1206,1774,2192,3196,5080,7352,8580,9892,13358,18984,31925,35860,40013,51605,68585,87770,96443,105515,131770,167428,206720,223860,241673,294553,362303,479053,513362,548856,656197,787507,927154,985696,1046034,1231134,1449220,1678177,1943306,2244059,2584282,2968115,3400000,3884688,4427246,5033064,5707855,6457661,7288852,8208125,9222500,10339317,11566230,12911197,14382470,15988583,17738338,19640789,21705223,23941143,26358244,28966392,31775600,34796000,38037819,41511350,45226922,49194872,53425513,57929105,62715823,67795725,73178721,78874542,84892710,91242506,97932943,104972733,112370263,120133566,128270295,136787699,145692601,154991375,164689926,174793673,185307530,196235893,207582627,219351052,231543938,244163492,257211358,270688607,284595740,298932685,313698799,328892871,344513126,360557232,377022309,393904936,411201163,428906522,447016041,465524258,484425237,503712583,523379460,543418608,563822364,584582678,605691135,627138976,648917115,671016163,693426449,716138040,739140762,762424222,785977830,809790819,833852265,858151108,882676174,907416194,932359821,957495652,982812246,1008298142,1033941875,1059731995,1085657082,1111705763,1137866726,1164128735,1190480643,1216911407,1243410098,1269965914,1296568193,1323206421,1349870242,1376549469,1403234090,1429914278,1456580397,1483223010,1509832883,1536400993,1562918530,1589376904,1615767747,1642082917,1668314501,1694454815,1720496409,1746432067,1772254807,1797957882,1823534782,1848979230,1874285184,1899446836,1924458610,1949315159,1974011367,1998542342,2022903418,2047090150,2071098310,2094923887,2118563083,2142012307,2165268175,2188327503,2211187307,2233844796,2256297369,2278542611,2300578289,2322402347,2344012903,2365408244,2386586822,2407547248,2428288289,2448808865,2469108042,2489185029,2509039173,2528669956,2548076989,2567260008,2586218871,2604953553,2623464142,2641750834,2659813929,2677653830,2695271035,2712666136,2729839813,2746792832,2763526041,2780040365,2796336805,2812416433,2828280388,2843929874,2859366157,2874590560,2889604462,2904409294,2919006536,2933397714,2947584399,2961568203,2975350775,2988933801,3002319001,3015508125,3028502953,3041305291,3053916970,3066339843,3078575783,3090626683,3102494451,3114181011,3125688300,3137018266,3148172868,3159154072,3169963851,3180604184,3191077054,3201384446,3211528348,3221510747,3231333629,3240998979,3250508779,3259865006,3269069632,3278124624,3287031942,3295793538,3304411356,3312887331,3321223387,3329421440,3337483392,3345411135,3353206549,3360871500,3368407842,3375817414,3383102041,3390263534,3397303689,3404224286,3411027090,3417713850,3424286299,3430746152,3437095109,3443334852,3449467047,3455493342,3461415367,3467234735,3472953041,3478571863,3484092761,3489517276,3494846931,3500083232,3505227667,3510281705,3515246797,3520124376,3524915857,3529622637,3534246095,3538787592,3543248471,3547630058,3551933659,3556160565,3560312047,3564389360,3568393741,3572326410,3576188570,3579981406,3583706087,3587363764,3590955573,3594482632,3597946043,3601346892,3604686248,3607965165,3611184681,3614345817,3617449581,3620496963,3623488939,3626426470,3629310502,3632141966,3634921779,3637650842,3640330044,3642960259,3645542346,3648077152,3650565509,3653008236,3655406140,3657760013,3660070635,3662338774,3664565184,3666750607,3668895774,3671001402,3673068197,3675096854,3677088055,3679042471,3680960763,3682843579,3684691557,3686505325,3688285499,3690032685,3691747478,3693430465,3695082220,3696703310,3698294290,3699855707,3701388097,3702891989,3704367901,3705816342,3707237813,3708632806,3710001804,3711345282,3712663706,3713957535,3715227220,3716473203,3717695918,3718895792,3720073245,3721228689,3722362528,3723475160,3724566975,3725638356,3726689680,3727721318,3728733632,3729726979,3730701710,3731658168,3732596692,3733517613,3734421257,3735307945,3736177990,3737031701,3737869381,3738691328,3739497833,3740289184,3741065662,3741827543,3742575099,3743308597,3744028298,3744734459,3745427333,3746107167,3746774204,3747428682,3748070836,3748700896,3749319088,3749925634,3750520750,3751104651,3751677546,3752239641,3752791138,3753332236,3753863129,3754384008,3754895060,3755396470,3755888418,3756371081,3756844634,3757309248,3757765090,3758212325,3758651114,3759081616,3759503986,3759918377,3760324939,3760723819,3761115161,3761499107,3761875797,3762245366,3762607949,3762963676,3763312677,3763655079,3763991005,3764320578,3764643917,3764961140,3765272361,3765577694,3765877250,3766171137,3766459463,3766742332,3767019847,3767292109,3767559217,3767821269,3768078359,3768330582,3768578029,3768820790,3769058954,3769292607,3769521835,3769746721,3769967347,3770183794,3770396141,3770604465,3770808842,3771009346,3771206051,3771399029,3771588350,3771774083,3771956296,3772135055,3772310426,3772482473,3772651259,3772816845,3772979292,3773138659,3773295005,3773448386,3773598859,3773746479,3773891300,3774033375,3774172755,3774309492,3774443636,3774575236,3774704340,3774830995,3774955248,3775077144,3775196728,3775314043,3775429133,3775542040,3775652805,3775761468,3775868070,3775972649,3776075244,3776175892,3776274631,3776371496,3776466523,3776559747,3776651202,3776740921,3776828938,3776915285,3776999993,3777083093,3777164616,3777244592,3777323050,3777400019,3777475527,3777549602,3777622271,3777693560,3777763496,3777832105,3777899411,3777965440,3778030215,3778093760,3778156099,3778217255,3778277250,3778336106,3778393844,3778450486,3778506053,3778560565,3778614042,3778666503,3778717968,3778768456,3778817986,3778866575,3778914242,3778961003,3779006877,3779051880,3779096028,3779139338,3779181825,3779223505,3779264394,3779304506,3779343857,3779382460,3779420330,3779457481,3779493927,3779529681,3779564756,3779599164,3779632919,3779666033,3779698518,3779730386,3779761649,3779792318,3779822405,3779851920,3779880875,3779909280,3779937145,3779964481,3779991298,3780017605,3780043413,3780068731,3780093568,3780117933,3780141835,3780165283,3780188286,3780210852,3780232989,3780254706,3780276010,3780296909,3780317412,3780337525,3780357256,3780376612,3780395601,3780414229,3780432503,3780450430,3780468016,3780485268,3780502193,3780518796,3780535084,3780551062,3780566737,3780582114,3780597199,3780611997,3780626514,3780640755,3780654726,3780668431,3780681876,3780695066,3780708005,3780720698,3780733150,3780745366,3780757349,3780769105,3780780637,3780791950,3780803048,3780813936,3780824617,3780835095,3780845374,3780855458,3780865350,3780875054,3780884574,3780893913,3780903074,3780912061,3780920878,3780929527,3780938012,3780946336,3780954501,3780962511,3780970369,3780978078,3780985640,3780993059,3781000337,3781007476,3781014480,3781021351,3781028091,3781034703,3781041189,3781047552,3781053794,3781059918,3781065925,3781071818,3781077599,3781083270,3781088834,3781094292,3781099646,3781104899,3781110052,3781115107,3781120066,3781124931,3781129703,3781134384,3781138976,3781143481,3781147901,3781152237,3781156490,3781160662,3781164755,3781168770,3781172709,3781176573,3781180364,3781184083,3781187731,3781191310,3781194821,3781198265,3781201644,3781204958,3781208209,3781211399,3781214528,3781217598,3781220609,3781223563,3781226461,3781229304,3781232093,3781234829,3781237513,3781240146,3781242729,3781245263,3781247749,3781250187,3781252579,3781254926,3781257228,3781259486,3781261701,3781263874,3781266006,3781268097,3781270149,3781272162,3781274136,3781276073,3781277973,3781279837,3781281666,3781283460,3781285220,3781286946,3781288639,3781290300,3781291930,3781293529,3781295097,3781296636,3781298145,3781299626,3781301078,3781302503,3781303901,3781305272,3781306617,3781307937,3781309231,3781310501,3781311747,3781312969,3781314168,3781315344,3781316498,3781317630,3781318740,3781319829,3781320897,3781321945,3781322973,3781323982,3781324972,3781325943,3781326895,3781327829,3781328745,3781329644,3781330526,3781331391,3781332240,3781333073,3781333890,3781334691,3781335477,3781336248,3781337004,3781337746,3781338474,3781339188,3781339888,3781340575,3781341249,3781341910,3781342559,3781343195,3781343819,3781344431,3781345032,3781345621,3781346199,3781346766,3781347322,3781347868,3781348403,3781348928,3781349443,3781349948,3781350444,3781350930,3781351407,3781351875,3781352334,3781352784,3781353226,3781353659,3781354084,3781354501,3781354910,3781355311,3781355705,3781356091,3781356470,3781356842,3781357207,3781357565,3781357916,3781358260,3781358598,3781358929,3781359254,3781359573,3781359886,3781360193,3781360494,3781360789,3781361079,3781361363,3781361642,3781361915,3781362183,3781362446,3781362704,3781362957,3781363205,3781363449,3781363688,3781363922,3781364152,3781364378,3781364599,3781364816,3781365029,3781365238,3781365443,3781365644,3781365841,3781366034,3781366224,3781366410,3781366593,3781366772,3781366948,3781367120,3781367289,3781367455,3781367618,3781367778,3781367934,3781368088,3781368239,3781368387,3781368532,3781368674,3781368813,3781368950,3781369084,3781369216,3781369345,3781369472,3781369596,3781369718,3781369838,3781369955,3781370070,3781370183,3781370294,3781370403,3781370509,3781370613,3781370715,3781370815,3781370914,3781371011,3781371106,3781371199,3781371290,3781371380,3781371468,3781371554,3781371638,3781371721,3781371802,3781371882,3781371960,3781372037,3781372112,3781372186,3781372258,3781372329,3781372399,3781372467,3781372534,3781372600,3781372664,3781372727,3781372789,3781372850,3781372910,3781372969,3781373026,3781373082,3781373137,3781373191,3781373244,3781373296,3781373347,3781373397,3781373446,3781373494,3781373541,3781373587,3781373632,3781373677,3781373721,3781373764,3781373806,3781373847,3781373887,3781373927,3781373966,3781374004,3781374041,3781374078,3781374114,3781374149,3781374184,3781374218,3781374251,3781374284,3781374316,3781374347,3781374378,3781374408,3781374438,3781374467,3781374496,3781374524,3781374551,3781374578,3781374604,3781374630,3781374655,3781374680,3781374704,3781374728,3781374751,3781374774,3781374797,3781374819,3781374841,3781374862,3781374883,3781374903,3781374923,3781374943,3781374962,3781374981,3781375000,3781375018,3781375036,3781375053,3781375070,3781375087,3781375103,3781375119,3781375135,3781375151,3781375166,3781375181,3781375196,3781375210,3781375224,3781375238,3781375252,3781375265,3781375278,3781375291,3781375303,3781375315,3781375327,3781375339,3781375351,3781375362,3781375373,3781375384,3781375395,3781375405,3781375415,3781375425,3781375435,3781375445,3781375454,3781375463,3781375472,3781375481,3781375490,3781375499,3781375507,3781375515,3781375523,3781375531,3781375539,3781375547,3781375554,3781375561,3781375568,3781375575,3781375582,3781375589,3781375596,3781375602,3781375608,3781375614,3781375620,3781375626,3781375632,3781375638,3781375644,3781375649,3781375654,3781375659,3781375664
-//Job - Star Gladiator
-50,4047:4048,1,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,54868,70216,77154,84412,105416,133942,165376,179088,193338,235642,289842,348402,373354,399168,477234,572732,674294,716870,760752,895370,1053978,1220492,1409379,1623055,1864120,2135364,2439771,2780523,3161005,3584806,4055720,4577747,5155093,5792168,6493582,7264141,8108843,9032871,10041585,11140513,12335340,13631900,15036161,16554212,18192249,19956561,21853511,23889523,26071060,28404610,30896665,33553702,36382164,39388442,42578852,45959619,49536854,53316538,57304499,61506398,65927706,70573691,75449398,80559633,85908949,91501631,97341682,103432811,109778421,116381598,123245103,130371364,137762466,145420147,153345795,161540442,170004760,178739065,187743310,197017092,206559651,216369871,226446289,236787095,247390140,258252944,269372701,280746288,292370275,304240934,316354248,328705924,341291403,354105871,367144273,380401324,393871522,407549162,421428347,435503003,449766891,464213622,478836669,493629380,508584993,523696648,538957399,554360228,569898056,585563758,601350173,617250114,633256384,649361782,665559118,681841219,698200942,714631183,731124884,747675046,764274732,780917079,797595303,814302708,831032690,847778745,864534475,881293592,898049925,914797422,931530156,948242328,964928270,981582450,998199473,1014774083,1031301167,1047775755,1064193021,1080548287,1096837020,1113054835,1129197495,1145260911,1161241141,1177134391,1192937013,1208645505,1224256509,1239766811,1255173340,1270473164,1285663492,1300741669,1315705176,1330551627,1345278767,1359884471,1374366739,1388723697,1402953592,1417054791,1431025777,1444865147,1458571611,1472143986,1485581197,1498882271,1512046336,1525072618,1537960438,1550709209,1563318435,1575787706,1588116696,1600305161,1612352936,1624259931,1636026131,1647651590,1659136432,1670480845,1681685082,1692749457,1703674340,1714460159,1725107395,1735616581,1745988298,1756223174,1766321883,1776285140,1786113701,1795808361,1805369951,1814799337,1824097418,1833265123,1842303411,1851213268,1859995707,1868651764,1877182497,1885588987,1893872333,1902033652,1910074079,1917994763,1925796869,1933481573,1941050064,1948503540,1955843209,1963070288,1970186001,1977191577,1984088252,1990877264,1997559857,2004137276,2010610768,2016981581,2023250963,2029420161,2035490422,2041462991,2047339109,2053120015,2058806945,2064401129,2069903793,2075316158,2080639439,2085874846,2091023580,2096086837,2101065805,2105961665,2110775588,2115508739,2120162273,2124737336,2129235066,2133656590,2138003026,2142275483,2146475060,2150602844,2154659913,2158647334,2162566165,2166417450,2170202225,2173921514,2177576330,2181167675,2184696540,2188163904,2191570735,2194917991,2198206616,2201437545,2204611701,2207729995,2210793327,2213802586,2216758649,2219662382,2222514640,2225316266,2228068093,2230770942,2233425623,2236032934,2238593664,2241108590,2243578477,2246004081,2248386147,2250725409,2253022589,2255278401,2257493547,2259668720,2261804601,2263901862,2265961164,2267983160,2269968491,2271917789,2273831677,2275710768,2277555665,2279366962,2281145244,2282891087,2284605057,2286287712,2287939601,2289561264,2291153232,2292716028,2294250167,2295756155,2297234490,2298685661,2300110151,2301508433,2302880974,2304228232,2305550658,2306848695,2308122780,2309373341,2310600799,2311805570,2312988060,2314148671,2315287796,2316405822,2317503130,2318580095,2319637084,2320674458,2321692573,2322691778,2323672416,2324634824,2325579333,2326506269,2327415953,2328308698,2329184814,2330044604,2330888366,2331716394,2332528975,2333326392,2334108923,2334876841,2335630414,2336369905,2337095574,2337807674,2338506455,2339192162,2339865036,2340525313,2341173226,2341809003,2342432868,2343045041,2343645738,2344235172,2344813550,2345381078,2345937956,2346484382,2347020550,2347546649,2348062867,2348569387,2349066390,2349554052,2350032547,2350502045,2350962713,2351414717,2351858217,2352293372,2352720337,2353139265,2353550306,2353953607,2354349312,2354737563,2355118500,2355492259,2355858974,2356218777,2356571797,2356918161,2357257994,2357591417,2357918551,2358239514,2358554421,2358863386,2359166519,2359463931,2359755728,2360042016,2360322899,2360598477,2360868851,2361134118,2361394373,2361649711,2361900225,2362146005,2362387140,2362623717,2362855822,2363083539,2363306951,2363526139,2363741182,2363952158,2364159144,2364362215,2364561444,2364756904,2364948666,2365136800,2365321374,2365502455,2365680109,2365854400,2366025392,2366193147,2366357727,2366519191,2366677598,2366833005,2366985469,2367135046,2367281790,2367425755,2367566993,2367705556,2367841494,2367974857,2368105693,2368234050,2368359975,2368483514,2368604712,2368723613,2368840261,2368954698,2369066966,2369177106,2369285159,2369391164,2369495159,2369597183,2369697272,2369795464,2369891794,2369986298,2370079010,2370169964,2370259193,2370346730,2370432607,2370516855,2370599505,2370680588,2370760133,2370838169,2370914725,2370989829,2371063508,2371135789,2371206699,2371276264,2371344509,2371411459,2371477139,2371541573,2371604784,2371666796,2371727631,2371787312,2371845861,2371903299,2371959647,2372014925,2372069154,2372122354,2372174544,2372225744,2372275972,2372325247,2372373587,2372421009,2372467531,2372513170,2372557943,2372601866,2372644955,2372687226,2372728695,2372769376,2372809285,2372848437,2372886845,2372924524,2372961488,2372997750,2373033324,2373068222,2373102458,2373136044,2373168992,2373201314,2373233023,2373264130,2373294646,2373324582,2373353950,2373382760,2373411023,2373438750,2373465950,2373492634,2373518811,2373544491,2373569683,2373594397,2373618641,2373642425,2373665757,2373688646,2373711101,2373733129,2373754739,2373775938,2373796735,2373817137,2373837151,2373856785,2373876046,2373894941,2373913478,2373931663,2373949502,2373967002,2373984170,2374001012,2374017534,2374033742,2374049642,2374065240,2374080542,2374095553,2374110279,2374124726,2374138898,2374152801,2374166440,2374179820,2374192946,2374205822,2374218454,2374230846,2374243002,2374254927,2374266626,2374278103,2374289362,2374300407,2374311242,2374321871,2374332298,2374342527,2374352562,2374362406,2374372063,2374381537,2374390831,2374399948,2374408892,2374417666,2374426273,2374434717,2374443000,2374451126,2374459098,2374466918,2374474590,2374482116,2374489499,2374496742,2374503847,2374510817,2374517655,2374524363,2374530943,2374537398,2374543731,2374549943,2374556037,2374562016,2374567881,2374573635,2374579279,2374584816,2374590248,2374595577,2374600804,2374605932,2374610963,2374615898,2374620739,2374625488,2374630147,2374634718,2374639202,2374643600,2374647915,2374652148,2374656301,2374660375,2374664371,2374668291,2374672137,2374675910,2374679611,2374683242,2374686804,2374690298,2374693726,2374697089,2374700388,2374703624,2374706798,2374709912,2374712967,2374715964,2374718904,2374721788,2374724617,2374727393,2374730116,2374732787,2374735407,2374737978,2374740500,2374742974,2374745401,2374747782,2374750117,2374752408,2374754655,2374756860,2374759023,2374761145,2374763226,2374765268,2374767271,2374769236,2374771164,2374773055,2374774910,2374776730,2374778515,2374780266,2374781984,2374783669,2374785322,2374786944,2374788535,2374790096,2374791627,2374793129,2374794603,2374796049,2374797467,2374798858,2374800223,2374801562,2374802875,2374804163,2374805427,2374806667,2374807883,2374809076,2374810246,2374811394,2374812520,2374813625,2374814709,2374815772,2374816815,2374817838,2374818842,2374819827,2374820793,2374821741,2374822671,2374823583,2374824478,2374825356,2374826217,2374827062,2374827891,2374828704,2374829501,2374830283,2374831050,2374831803,2374832541,2374833265,2374833976,2374834673,2374835357,2374836028,2374836686,2374837332,2374837965,2374838586,2374839195,2374839793,2374840379,2374840954,2374841518,2374842072,2374842615,2374843148,2374843671,2374844184,2374844687,2374845180,2374845664,2374846139,2374846605,2374847062,2374847510,2374847950,2374848381,2374848804,2374849219,2374849626,2374850025,2374850417,2374850801,2374851178,2374851548,2374851911,2374852267,2374852616,2374852959,2374853295,2374853625,2374853948,2374854265,2374854576,2374854881,2374855180,2374855474,2374855762,2374856045,2374856322,2374856594,2374856861,2374857123,2374857380,2374857632,2374857879,2374858121,2374858359,2374858592,2374858821,2374859045,2374859265,2374859481,2374859693,2374859901,2374860105,2374860305,2374860501,2374860693,2374860882,2374861067,2374861249,2374861427,2374861602,2374861773,2374861941,2374862106,2374862268,2374862427,2374862583,2374862736,2374862886,2374863033,2374863177,2374863318,2374863457,2374863593,2374863727,2374863858,2374863986,2374864112,2374864236,2374864357,2374864476,2374864593,2374864707,2374864819,2374864929,2374865037,2374865143,2374865247,2374865349,2374865449,2374865547,2374865643,2374865737,2374865830,2374865921,2374866010,2374866097,2374866183,2374866267,2374866349,2374866430,2374866509,2374866587,2374866663,2374866738,2374866811,2374866883,2374866954,2374867023,2374867091,2374867158,2374867223,2374867287,2374867350,2374867412,2374867473,2374867532,2374867590,2374867647,2374867703,2374867758,2374867812,2374867865,2374867917,2374867968,2374868018,2374868067,2374868115,2374868162,2374868208,2374868253,2374868297,2374868341,2374868384,2374868426,2374868467,2374868507,2374868547,2374868586,2374868624,2374868661,2374868698,2374868734,2374868769,2374868803,2374868837,2374868870,2374868903,2374868935,2374868966,2374868997,2374869027,2374869057,2374869086,2374869114,2374869142,2374869169,2374869196,2374869222,2374869248,2374869273,2374869298,2374869322,2374869346,2374869369,2374869392,2374869414,2374869436,2374869458,2374869479,2374869500,2374869520,2374869540,2374869560,2374869579,2374869598,2374869616,2374869634,2374869652,2374869669,2374869686,2374869703,2374869719,2374869735,2374869751,2374869766,2374869781,2374869796,2374869811,2374869825,2374869839,2374869853,2374869866,2374869879,2374869892,2374869905,2374869917,2374869929,2374869941,2374869953,2374869964,2374869975,2374869986,2374869997,2374870008,2374870018,2374870028,2374870038,2374870048,2374870058,2374870067,2374870076,2374870085,2374870094,2374870103,2374870111,2374870119,2374870127,2374870135,2374870143,2374870151,2374870158,2374870165,2374870172,2374870179,2374870186,2374870193,2374870200,2374870206,2374870212,2374870218,2374870224,2374870230,2374870236,2374870242,2374870248,2374870253,2374870258,2374870263,2374870268,2374870273,2374870278,2374870283,2374870288,2374870293,2374870298,2374870302,2374870306,2374870310,2374870314,2374870318,2374870322,2374870326,2374870330,2374870334,2374870338,2374870342,2374870346,2374870349,2374870352,2374870355,2374870358,2374870361,2374870364,2374870367
-//Job - Baby Novice
-10,4023,1,10,18,28,40,91,151,205,268,340,0
-//Job - 1st Baby Classes
-50,4024:4025:4026:4027:4028:4029,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
-//Job - 2nd Baby Classes
-50,4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,704689,811527,932059,1067681,1219884,1390260,1580501,1792401,2027857,2288870,2577542,2896079,3246785,3632064,4054414,4516427,5020783,5570245,6167657,6815936,7518065,8277089,9096106,9978260,10926733,11944736,13035502,14202274,15448298,16776813,18191041,19694176,21289377,22979756,24768369,26658206,28652182,30753126,32963775,35286762,37724609,40279720,42954371,45750705,48670723,51716280,54889077,58190657,61622401,65185522,68881063,72709894,76672708,80770021,85002169,89369310,93871421,98508300,103279567,108184665,113222861,118393251,123694760,129126148,134686012,140372791,146184770,152120084,158176725,164352547,170645270,177052488,183571672,190200181,196935263,203774065,210713640,217750950,224882876,232106223,239417728,246814065,254291853,261847661,269478017,277179412,284948306,292781137,300674324,308624274,316627388,324680066,332778713,340919742,349099582,357314681,365561510,373836570,382136392,390457544,398796635,407150316,415515285,423888291,432266134,440645671,449023816,457397543,465763888,474119952,482462902,490789971,499098461,507385745,515649266,523886539,532095151,540272763,548417108,556525995,564597304,572628991,580619086,588565690,596466980,604321205,612126687,619881818,627585062,635234954,642830098,650369167,657850901,665274107,672637658,679940491,687181606,694360067,701474996,708525577,715511052,722430719,729283933,736070103,742788691,749439211,756021226,762534350,768978243,775352612,781657209,787891828,794056307,800150524,806174396,812127878,818010962,823823676,829566082,835238274,840840378,846372551,851834978,857227874,862551478,867806057,872991902,878109327,883158668,888140283,893054550,897901867,902682649,907397329,912046357,916630197,921149329,925604246,929995454,934323471,938588826,942792060,946933722,951014371,955034574,958994906,962895949,966738291,970522526,974249254,977919079,981532609,985090456,988593235,992041563,995436060,998777348,1002066049,1005302786,1008488184,1011622866,1014707457,1017742580,1020728856,1023666907,1026557352,1029400809,1032197893,1034949218,1037655393,1040317027,1042934723,1045509083,1048040705,1050530182,1052978105,1055385060,1057751629,1060078390,1062365915,1064614774,1066825530,1068998742,1071134965,1073234748,1075298634,1077327163,1079320868,1081280278,1083205916,1085098299,1086957939,1088785342,1090581010,1092345438,1094079115,1095782526,1097456149,1099100457,1100715917,1102302990,1103862133,1105393795,1106898420,1108376447,1109828309,1111254434,1112655243,1114031153,1115382574,1116709911,1118013563,1119293924,1120551383,1121786323,1122999122,1124190152,1125359779,1126508366,1127636269,1128743839,1129831422,1130899359,1131947986,1132977634,1133988629,1134981292,1135955938,1136912879,1137852422,1138774868,1139680514,1140569653,1141442572,1142299555,1143140880,1143966822,1144777651,1145573633,1146355029,1147122096,1147875088,1148614253,1149339836,1150052079,1150751218,1151437486,1152111113,1152772324,1153421341,1154058381,1154683659,1155297386,1155899769,1156491012,1157071316,1157640877,1158199889,1158748542,1159287023,1159815516,1160334201,1160843257,1161342858,1161833175,1162314377,1162786630,1163250097,1163704937,1164151308,1164589365,1165019259,1165441139,1165855152,1166261441,1166660148,1167051412,1167435370,1167812155,1168181900,1168544733,1168900782,1169250171,1169593023,1169929459,1170259597,1170583552,1170901439,1171213370,1171519455,1171819803,1172114519,1172403707,1172687470,1172965908,1173239120,1173507203,1173770252,1174028360,1174281619,1174530119,1174773949,1175013195,1175247943,1175478276,1175704277,1175926026,1176143603,1176357085,1176566548,1176772068,1176973718,1177171570,1177365695,1177556163,1177743042,1177926399,1178106300,1178282809,1178455990,1178625906,1178792617,1178956183,1179116664,1179274117,1179428599,1179580165,1179728870,1179874768,1180017912,1180158353,1180296142,1180431328,1180563961,1180694088,1180821757,1180947013,1181069902,1181190469,1181308757,1181424809,1181538667,1181650373,1181759966,1181867487,1181972975,1182076467,1182178002,1182277616,1182375346,1182471227,1182565293,1182657579,1182748119,1182836945,1182924090,1183009586,1183093463,1183175752,1183256483,1183335686,1183413389,1183489621,1183564409,1183637781,1183709763,1183780382,1183849663,1183917632,1183984313,1184049731,1184113909,1184176871,1184238640,1184299239,1184358689,1184417013,1184474231,1184530365,1184585435,1184639461,1184692463,1184744460,1184795471,1184845515,1184894611,1184942776,1184990027,1185036382,1185081858,1185126472,1185170240,1185213178,1185255302,1185296627,1185337168,1185376940,1185415958,1185454236,1185491788,1185528627,1185564767,1185600222,1185635004,1185669126,1185702601,1185735441,1185767658,1185799263,1185830269,1185860686,1185890526,1185919800,1185948518,1185976691,1186004330,1186031444,1186058044,1186084139,1186109739,1186134853,1186159490,1186183659,1186207370,1186230631,1186253450,1186275836,1186297797,1186319341,1186340476,1186361210,1186381550,1186401504,1186421079,1186440283,1186459122,1186477604,1186495735,1186513521,1186530970,1186548087,1186564879,1186581353,1186597514,1186613368,1186628921,1186644179,1186659147,1186673831,1186688236,1186702367,1186716230,1186729830,1186743172,1186756260,1186769100,1186781696,1186794053,1186806175,1186818067,1186829733,1186841177,1186852404,1186863418,1186874223,1186884822,1186895220,1186905421,1186915428,1186925245,1186934875,1186944322,1186953590,1186962682,1186971601,1186980351,1186988935,1186997356,1187005617,1187013721,1187021671,1187029470,1187037121,1187044626,1187051989,1187059212,1187066298,1187073249,1187080068,1187086758,1187093321,1187099759,1187106075,1187112271,1187118349,1187124311,1187130160,1187135898,1187141527,1187147049,1187152466,1187157780,1187162993,1187168107,1187173124,1187178046,1187182874,1187187611,1187192258,1187196816,1187201288,1187205675,1187209978,1187214200,1187218341,1187222404,1187226390,1187230300,1187234136,1187237899,1187241590,1187245211,1187248763,1187252248,1187255667,1187259021,1187262311,1187265538,1187268704,1187271810,1187274857,1187277846,1187280778,1187283655,1187286477,1187289245,1187291961,1187294625,1187297238,1187299802,1187302317,1187304784,1187307204,1187309578,1187311907,1187314192,1187316434,1187318633,1187320790,1187322906,1187324982,1187327019,1187329017,1187330977,1187332900,1187334786,1187336636,1187338451,1187340232,1187341979,1187343693,1187345374,1187347023,1187348641,1187350228,1187351785,1187353312,1187354810,1187356280,1187357722,1187359136,1187360524,1187361885,1187363220,1187364530,1187365815,1187367076,1187368313,1187369526,1187370716,1187371883,1187373028,1187374151,1187375253,1187376334,1187377395,1187378435,1187379456,1187380457,1187381439,1187382403,1187383348,1187384275,1187385185,1187386077,1187386952,1187387811,1187388653,1187389479,1187390290,1187391085,1187391865,1187392630,1187393381,1187394118,1187394841,1187395550,1187396245,1187396927,1187397596,1187398252,1187398896,1187399528,1187400148,1187400756,1187401352,1187401937,1187402511,1187403074,1187403626,1187404168,1187404699,1187405220,1187405731,1187406233,1187406725,1187407208,1187407682,1187408147,1187408603,1187409050,1187409489,1187409919,1187410341,1187410755,1187411161,1187411559,1187411950,1187412333,1187412709,1187413078,1187413440,1187413795,1187414143,1187414485,1187414820,1187415149,1187415472,1187415788,1187416098,1187416402,1187416701,1187416994,1187417281,1187417563,1187417840,1187418111,1187418377,1187418638,1187418894,1187419145,1187419391,1187419633,1187419870,1187420103,1187420331,1187420555,1187420775,1187420990,1187421201,1187421408,1187421611,1187421810,1187422006,1187422198,1187422386,1187422571,1187422752,1187422930,1187423104,1187423275,1187423443,1187423608,1187423769,1187423927,1187424082,1187424234,1187424383,1187424530,1187424674,1187424815,1187424953,1187425089,1187425222,1187425353,1187425481,1187425607,1187425730,1187425851,1187425970,1187426086,1187426200,1187426312,1187426422,1187426530,1187426636,1187426740,1187426842,1187426942,1187427040,1187427136,1187427230,1187427322,1187427413,1187427502,1187427589,1187427674,1187427758,1187427840,1187427921,1187428000,1187428078,1187428154,1187428229,1187428302,1187428374,1187428444,1187428513,1187428581,1187428648,1187428713,1187428777,1187428840,1187428902,1187428962,1187429021,1187429079,1187429136,1187429192,1187429247,1187429301,1187429354,1187429406,1187429457,1187429507,1187429556,1187429604,1187429651,1187429697,1187429742,1187429786,1187429829,1187429872,1187429914,1187429955,1187429995,1187430034,1187430073,1187430111,1187430148,1187430184,1187430220,1187430255,1187430289,1187430323,1187430356,1187430388,1187430420,1187430451,1187430482,1187430512,1187430541,1187430570,1187430598,1187430626,1187430653,1187430680,1187430706,1187430732,1187430757,1187430782,1187430806,1187430830,1187430853,1187430876,1187430898,1187430920,1187430942,1187430963,1187430984,1187431004,1187431024,1187431044,1187431063,1187431082,1187431100,1187431118,1187431136,1187431153,1187431170,1187431187,1187431203,1187431219,1187431235,1187431250,1187431265,1187431280,1187431295,1187431309,1187431323,1187431337,1187431350,1187431363,1187431376,1187431389,1187431401,1187431413,1187431425,1187431437,1187431448,1187431459,1187431470,1187431481,1187431492,1187431502,1187431512,1187431522,1187431532,1187431542,1187431551,1187431560,1187431569,1187431578,1187431587,1187431595,1187431603,1187431611,1187431619,1187431627,1187431635,1187431642,1187431649,1187431656,1187431663,1187431670,1187431677,1187431684,1187431690,1187431696,1187431702,1187431708,1187431714,1187431720,1187431726,1187431732,1187431737,1187431742,1187431747,1187431752,1187431757,1187431762,1187431767,1187431772,1187431777,1187431782,1187431786,1187431790,1187431794,1187431798,1187431802,1187431806,1187431810,1187431814,1187431818,1187431822,1187431826,1187431829,1187431832,1187431835,1187431838,1187431841,1187431844,1187431847,1187431850,1187431853,1187431856,1187431859,1187431862,1187431865,1187431868,1187431871,1187431873,1187431875,1187431877,1187431879,1187431881,1187431883,1187431885,1187431887,1187431889,1187431891,1187431893,1187431895,1187431897,1187431899,1187431901,1187431903,1187431905,1187431907,1187431909,1187431911,1187431913,1187431915,1187431916,1187431917,1187431918,1187431919,1187431920,1187431921,1187431922
-//Job - Super Baby
-99,4045,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
+//This is a custom Experience table with support for up to level 1000.
+//To use it, replace exp.txt with this file and edit the max level
+//accordingly.
+//Experience tables format:
+//Max Level,Class list,Type (0 - Base Exp / 1 - Job Exp),Exp 1,2,3,...
+//Base - Normal Jobs
+99,0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:23:24:25:26:4046:4047:4048:4049,0,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,8109652,8643822,9206127,9797599,10419283,11072238,11757533,12476249,13229476,14018313,14843866,15707247,16609574,17551968,18535552,19561452,20630792,21744696,22904284,24110674,25364977,26668297,28021732,29426368,30883282,32393539,33958189,35578269,37254799,38988782,40781202,42633023,44545189,46518620,48554214,50652844,52815357,55042573,57335285,59694256,62120220,64613880,67175907,69806941,72507587,75278418,78119970,81032746,84017211,87073795,90202891,93404853,96680000,100028610,103450924,106947144,110517434,114161918,117880680,121673767,125541185,129482901,133498844,137588903,141752928,145990732,150302088,154686733,159144364,163674642,168277191,172951600,177697420,182514167,187401324,192358338,197384623,202479560,207642499,212872757,218169621,223532347,228960163,234452268,240007834,245626005,251305900,257046613,262847212,268706744,274624232,280598679,286629065,292714352,298853483,305045382,311288957,317583099,323926685,330318577,336757623,343242660,349772512,356345994,362961909,369619053,376316214,383052171,389825698,396635564,403480532,410359362,417270811,424213634,431186584,438188413,445217874,452273720,459354706,466459588,473587127,480736086,487905232,495093338,502299181,509521545,516759221,524011006,531275705,538552132,545839109,553135467,560440047,567751700,575069288,582391684,589717771,597046446,604376616,611707202,619037136,626365365,633690848,641012559,648329484,655640625,662944998,670241632,677529573,684807881,692075631,699331913,706575834,713806514,721023091,728224718,735410563,742579811,749731663,756865335,763980061,771075089,778149684,785203127,792234715,799243761,806229595,813191563,820129025,827041359,833927958,840788232,847621604,854427516,861205423,867954796,874675123,881365905,888026659,894656917,901256227,907824150,914360262,920864154,927335431,933773713,940178632,946549836,952886985,959189754,965457830,971690914,977888720,984050975,990177418,996267800,1002321886,1008339452,1014320285,1020264186,1026170966,1032040448,1037872466,1043666865,1049423500,1055142238,1060822955,1066465539,1072069886,1077635904,1083163509,1088652627,1094103193,1099515152,1104888457,1110223070,1115518962,1120776112,1125994507,1131174143,1136315022,1141417155,1146480560,1151505263,1156491296,1161438699,1166347518,1171217806,1176049622,1180843032,1185598108,1190314928,1194993575,1199634138,1204236712,1208801396,1213328296,1217817522,1222269189,1226683417,1231060330,1235400057,1239702732,1243968491,1248197476,1252389832,1256545708,1260665257,1264748635,1268796001,1272807518,1276783353,1280723674,1284628654,1288498467,1292333290,1296133304,1299898691,1303629636,1307326326,1310988950,1314617700,1318212769,1321774352,1325302646,1328797850,1332260164,1335689790,1339086931,1342451791,1345784576,1349085494,1352354752,1355592559,1358799125,1361974661,1365119379,1368233491,1371317210,1374370750,1377394325,1380388150,1383352439,1386287408,1389193273,1392070249,1394918553,1397738400,1400530007,1403293591,1406029367,1408737552,1411418361,1414072010,1416698715,1419298692,1421872155,1424419319,1426940398,1429435606,1431905157,1434349263,1436768137,1439161990,1441531034,1443875479,1446195535,1448491412,1450763318,1453011460,1455236046,1457437282,1459615373,1461770523,1463902937,1466012816,1468100363,1470165779,1472209264,1474231016,1476231234,1478210114,1480167853,1482104645,1484020685,1485916165,1487791277,1489646211,1491481157,1493296304,1495091838,1496867946,1498624813,1500362623,1502081558,1503781800,1505463529,1507126924,1508772163,1510399423,1512008880,1513600707,1515175078,1516732165,1518272138,1519795167,1521301420,1522791064,1524264265,1525721187,1527161994,1528586847,1529995908,1531389336,1532767289,1534129924,1535477397,1536809863,1538127475,1539430385,1540718744,1541992701,1543252405,1544498003,1545729641,1546947464,1548151616,1549342238,1550519472,1551683458,1552834334,1553972238,1555097306,1556209673,1557309473,1558396839,1559471902,1560534793,1561585640,1562624572,1563651716,1564667197,1565671140,1566663668,1567644904,1568614969,1569573982,1570522063,1571459329,1572385897,1573301883,1574207401,1575102565,1575987487,1576862278,1577727048,1578581907,1579426962,1580262321,1581088090,1581904373,1582711275,1583508898,1584297344,1585076715,1585847110,1586608628,1587361366,1588105422,1588840892,1589567871,1590286453,1590996731,1591698797,1592392743,1593078658,1593756633,1594426755,1595089112,1595743791,1596390878,1597030458,1597662614,1598287430,1598904988,1599515370,1600118656,1600714926,1601304259,1601886733,1602462426,1603031414,1603593772,1604149576,1604698899,1605241815,1605778396,1606308715,1606832842,1607350847,1607862800,1608368770,1608868825,1609363032,1609851457,1610334167,1610811226,1611282699,1611748650,1612209142,1612664237,1613113997,1613558483,1613997756,1614431875,1614860899,1615284887,1615703896,1616117984,1616527207,1616931621,1617331282,1617726244,1618116561,1618502287,1618883474,1619260175,1619632442,1620000326,1620363877,1620723146,1621078182,1621429033,1621775749,1622118377,1622456965,1622791559,1623122206,1623448951,1623771840,1624090917,1624406227,1624717813,1625025719,1625329987,1625630660,1625927779,1626221386,1626511522,1626798227,1627081541,1627361504,1627638155,1627911532,1628181674,1628448618,1628712402,1628973062,1629230635,1629485157,1629736664,1629985191,1630230773,1630473445,1630713240,1630950192,1631184334,1631415700,1631644322,1631870232,1632093461,1632314042,1632532005,1632747381,1632960200,1633170493,1633378289,1633583617,1633786507,1633986987,1634185085,1634380829,1634574248,1634765368,1634954216,1635140820,1635325205,1635507398,1635687425,1635865311,1636041081,1636214761,1636386375,1636555947,1636723501,1636889061,1637052651,1637214294,1637374013,1637531831,1637687770,1637841852,1637994099,1638144533,1638293176,1638440048,1638585171,1638728565,1638870250,1639010247,1639148576,1639285256,1639420307,1639553749,1639685600,1639815879,1639944605,1640071796,1640197471,1640321647,1640444342,1640565574,1640685360,1640803717,1640920662,1641036212,1641150383,1641263192,1641374655,1641484788,1641593607,1641701127,1641807363,1641912331,1642016046,1642118523,1642219777,1642319822,1642418672,1642516342,1642612846,1642708197,1642802409,1642895496,1642987471,1643078348,1643168139,1643256857,1643344515,1643431126,1643516702,1643601256,1643684799,1643767344,1643848902,1643929486,1644009107,1644087776,1644165505,1644242304,1644318185,1644393159,1644467237,1644540429,1644612746,1644684198,1644754796,1644824550,1644893470,1644961565,1645028846,1645095322,1645161003,1645225899,1645290018,1645353370,1645415965,1645477811,1645538917,1645599292,1645658945,1645717884,1645776118,1645833655,1645890503,1645946671,1646002167,1646056999,1646111175,1646164702,1646217589,1646269843,1646321471,1646372481,1646422881,1646472677,1646521877,1646570488,1646618517,1646665972,1646712858,1646759183,1646804953,1646850175,1646894856,1646939002,1646982619,1647025714,1647068293,1647110362,1647151927,1647192995,1647233571,1647273661,1647313271,1647352406,1647391073,1647429277,1647467023,1647504317,1647541164,1647577570,1647613540,1647649079,1647684192,1647718884,1647753161,1647787027,1647820488,1647853548,1647886212,1647918484,1647950370,1647981874,1648013000,1648043753,1648074138,1648104159,1648133820,1648163126,1648192080,1648220687,1648248952,1648276878,1648304469,1648331730,1648358664,1648385275,1648411567,1648437544,1648463210,1648488568,1648513622,1648538376,1648562833,1648586997,1648610872,1648634460,1648657766,1648680792,1648703542,1648726020,1648748228,1648770170,1648791849,1648813268,1648834430,1648855339,1648875997,1648896407,1648916573,1648936497,1648956182,1648975631,1648994847,1649013832,1649032590,1649051123,1649069434,1649087525,1649105399,1649123059,1649140507,1649157746,1649174778,1649191606,1649208232,1649224659,1649240889,1649256924,1649272767,1649288420,1649303885,1649319165,1649334262,1649349178,1649363915,1649378475,1649392861,1649407074,1649421117,1649434991,1649448699,1649462242,1649475623,1649488844,1649501906,1649514811,1649527562,1649540160,1649552607,1649564904,1649577054,1649589058,1649600918,1649612636,1649624213,1649635652,1649646953,1649658119,1649669151,1649680051,1649690820,1649701460,1649711972,1649722358,1649732619,1649742757,1649752774,1649762671,1649772449,1649782110,1649791655,1649801085,1649810402,1649819607,1649828702,1649837688,1649846566,1649855338,1649864004,1649872566,1649881026,1649889384,1649897642,1649905801,1649913862,1649921826,1649929695,1649937469,1649945150,1649952739,1649960237,1649967645,1649974964,1649982195,1649989340,1649996399,1650003373,1650010263,1650017071,1650023797,1650030442,1650037008,1650043495,1650049904,1650056236,1650062492,1650068673,1650074780,1650080814,1650086775,1650092665,1650098484,1650104233,1650109913,1650115525,1650121070,1650126548,1650131961,1650137309,1650142593,1650147813,1650152971,1650158067,1650163102,1650168076,1650172990,1650177845,1650182642,1650187382,1650192065,1650196692,1650201263,1650205779,1650210241,1650214650,1650219006,1650223309,1650227561,1650231762,1650235912,1650240012,1650244063,1650248066,1650252021,1650255928,1650259788,1650263602,1650267370,1650271093,1650274771,1650278405,1650281996,1650285544,1650289049,1650292512,1650295933,1650299313,1650302653,1650305953,1650309213,1650312434,1650315616,1650318760,1650321866,1650324935,1650327967,1650330963,1650333923,1650336847,1650339736,1650342591,1650345411,1650348198,1650350951,1650353671,1650356358,1650359013,1650361636,1650364228,1650366789,1650369319,1650371819,1650374289,1650376729,1650379140,1650381522,1650383875,1650386200,1650388497,1650390766,1650393008,1650395223,1650397412,1650399574,1650401711,1650403822,1650405908,1650407969,1650410005,1650412016,1650414003,1650415966,1650417906,1650419823,1650421717,1650423588,1650425436,1650427262,1650429066
+//Base - Adv Jobs
+99,4001:4002:4003:4004:4005:4006:4007:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,0,10,18,28,40,85,123,168,220,278,400,481,613,731,875,1038,1213,1400,1575,1775,2268,2604,2786,3136,3506,4130,4796,5508,6264,9645,12392,14220,16159,18209,21649,24451,27401,30499,33748,47342,58160,64711,71573,78749,90144,99312,108870,118816,129154,174196,213220,238080,264150,291427,329640,363155,398116,434526,472381,610848,731828,806448,884232,965180,1073896,1170382,1270556,1374422,1481976,1850800,3389616,3666333,3953534,4251217,4559382,5129260,5488173,5859059,6241919,7374168,9570662,10458427,11380262,12336168,13326144,14994907,16130400,17304200,18516326,19766760,21085096,22473939,23935933,25473761,27090141,28787825,30569594,32438257,34396650,36447628,38594068,40838862,43184915,45635142,48192464,50859807,53640095,56536248,59551182,62687799,65948990,69337627,72856561,76508620,80296602,84223275,88291372,92503586,96862571,101370933,106031232,110845975,115817614,120948544,126241098,131697545,137320088,143110859,149071919,155205253,161512770,167996297,174657580,181498280,188519973,195724146,203112195,210685425,218445048,226392181,234527844,242852961,251368358,260074760,268972793,278062983,287345754,296821429,306490229,316352273,326407578,336656059,347097530,357731703,368558190,379576502,390786051,402186149,413776012,425554759,437521412,449674899,462014055,474537623,487244256,500132518,513200886,526447751,539871420,553470119,567241993,581185110,595297462,609576966,624021468,638628745,653396504,668322389,683403980,698638797,714024301,729557897,745236936,761058717,777020492,793119465,809352795,825717601,842210961,858829917,875571475,892432609,909410264,926501355,943702774,961011389,978424047,995937576,1013548788,1031254481,1049051440,1066936441,1084906252,1102957634,1121087346,1139292145,1157568786,1175914029,1194324635,1212797373,1231329018,1249916355,1268556179,1287245299,1305980536,1324758729,1343576732,1362431419,1381319683,1400238439,1419184625,1438155202,1457147157,1476157502,1495183278,1514221554,1533269429,1552324031,1571382520,1590442090,1609499966,1628553409,1647599713,1666636209,1685660263,1704669278,1723660695,1742631992,1761580687,1780504336,1799400534,1818266916,1837101157,1855900974,1874664122,1893388399,1912071644,1930711737,1949306600,1967854196,1986352530,2004799649,2023193642,2041532640,2059814816,2078038384,2096201600,2114302763,2132340212,2150312328,2168217533,2186054291,2203821106,2221516523,2239139127,2256687544,2274160439,2291556517,2308874523,2326113241,2343271492,2360348137,2377342074,2394252239,2411077605,2427817182,2444470016,2461035190,2477511822,2493899065,2510196107,2526402170,2542516509,2558538414,2574467207,2590302243,2606042908,2621688620,2637238829,2652693014,2668050684,2683311379,2698474666,2713540143,2728507434,2743376192,2758146097,2772816855,2787388198,2801859883,2816231694,2830503439,2844674950,2858746082,2872716714,2886586747,2900356105,2914024733,2927592598,2941059688,2954426010,2967691593,2980856483,2993920747,3006884469,3019747752,3032510717,3045173501,3057736259,3070199161,3082562393,3094826158,3106990673,3119056170,3131022894,3142891106,3154661079,3166333099,3177907466,3189384491,3200764497,3212047820,3223234805,3234325809,3245321200,3256221356,3267026664,3277737521,3288354333,3298877514,3309307489,3319644689,3329889553,3340042528,3350104069,3360074637,3369954700,3379744733,3389445216,3399056636,3408579485,3418014261,3427361466,3436621608,3445795199,3454882755,3463884797,3472801849,3481634440,3490383101,3499048368,3507630778,3516130872,3524549194,3532886290,3541142708,3549318998,3557415713,3565433406,3573372633,3581233950,3589017916,3596725090,3604356032,3611911302,3619391462,3626797073,3634128697,3641386897,3648572235,3655685273,3662726573,3669696697,3676596205,3683425658,3690185617,3696876640,3703499285,3710054109,3716541669,3722962519,3729317213,3735606303,3741830339,3747989871,3754085446,3760117610,3766086907,3771993879,3777839066,3783623006,3789346235,3795009287,3800612694,3806156985,3811642688,3817070327,3822440424,3827753500,3833010071,3838210653,3843355757,3848445893,3853481568,3858463286,3863391548,3868266853,3873089696,3877860570,3882579965,3887248368,3891866263,3896434130,3900952448,3905421692,3909842333,3914214841,3918539681,3922817316,3927048205,3931232805,3935371569,3939464947,3943513385,3947517328,3951477216,3955393486,3959266573,3963096907,3966884916,3970631025,3974335655,3977999224,3981622147,3985204835,3988747697,3992251137,3995715558,3999141358,4002528933,4005878676,4009190975,4012466216,4015704782,4018907052,4022073402,4025204206,4028299834,4031360652,4034387025,4037379312,4040337871,4043263057,4046155220,4049014709,4051841869,4054637042,4057400566,4060132778,4062834010,4065504592,4068144851,4070755111,4073335693,4075886914,4078409090,4080902532,4083367550,4085804450,4088213536,4090595108,4092949463,4095276897,4097577701,4099852165,4102100575,4104323215,4106520366,4108692307,4110839312,4112961655,4115059606,4117133433,4119183400,4121209770,4123212802,4125192754,4127149880,4129084433,4130996662,4132886814,4134755133,4136601862,4138427240,4140231505,4142014891,4143777631,4145519954,4147242089,4148944261,4150626693,4152289606,4153933218,4155557746,4157163403,4158750402,4160318952,4161869260,4163401532,4164915971,4166412777,4167892150,4169354286,4170799380,4172227625,4173639211,4175034327,4176413160,4177775894,4179122712,4180453795,4181769321,4183069467,4184354408,4185624318,4186879367,4188119725,4189345560,4190557037,4191754321,4192937573,4194106954,4195262623,4196404736,4197533449,4198648916,4199751289,4200840717,4201917350,4202981334,4204032815,4205071936,4206098840,4207113668,4208116558,4209107648,4210087074,4211054971,4212011472,4212956708,4213890810,4214813906,4215726123,4216627588,4217518424,4218398755,4219268703,4220128387,4220977927,4221817441,4222647044,4223466852,4224276979,4225077537,4225868637,4226650390,4227422904,4228186286,4228940643,4229686080,4230422700,4231150607,4231869902,4232580686,4233283058,4233977116,4234662957,4235340677,4236010370,4236672131,4237326053,4237972227,4238610743,4239241692,4239865161,4240481239,4241090012,4241691565,4242285983,4242873350,4243453749,4244027261,4244593967,4245153947,4245707279,4246254042,4246794313,4247328169,4247855684,4248376933,4248891990,4249400928,4249903818,4250400732,4250891740,4251376912,4251856316,4252330020,4252798092,4253260597,4253717602,4254169171,4254615368,4255056257,4255491900,4255922359,4256347695,4256767969,4257183240,4257593568,4257999011,4258399627,4258795472,4259186603,4259573076,4259954946,4260332267,4260705093,4261073477,4261437472,4261797129,4262152500,4262503636,4262850586,4263193401,4263532129,4263866819,4264197518,4264524274,4264847134,4265166143,4265481348,4265792793,4266100523,4266404582,4266705014,4267001861,4267295166,4267584971,4267871318,4268154248,4268433801,4268710017,4268982936,4269252597,4269519039,4269782300,4270042418,4270299430,4270553373,4270804284,4271052198,4271297151,4271539179,4271778316,4272014596,4272248054,4272478723,4272706636,4272931826,4273154325,4273374166,4273591380,4273805998,4274018051,4274227570,4274434585,4274639125,4274841221,4275040901,4275238194,4275433128,4275625732,4275816033,4276004059,4276189837,4276373393,4276554754,4276733946,4276910995,4277085927,4277258767,4277429540,4277598270,4277764982,4277929700,4278092447,4278253247,4278412124,4278569100,4278724198,4278877440,4279028849,4279178446,4279326253,4279472291,4279616582,4279759146,4279900004,4280039176,4280176683,4280312544,4280446779,4280579407,4280710448,4280839920,4280967842,4281094233,4281219111,4281342494,4281464400,4281584846,4281703850,4281821429,4281937601,4282052382,4282165788,4282277836,4282388543,4282497924,4282605995,4282712772,4282818270,4282922505,4283025492,4283127245,4283227779,4283327109,4283425250,4283522215,4283618019,4283712675,4283806197,4283898599,4283989894,4284080096,4284169217,4284257270,4284344268,4284430224,4284515150,4284599059,4284681963,4284763873,4284844802,4284924761,4285003762,4285081817,4285158936,4285235131,4285310413,4285384793,4285458282,4285530890,4285602628,4285673507,4285743536,4285812726,4285881087,4285948628,4286015360,4286081292,4286146434,4286210795,4286274385,4286337213,4286399288,4286460619,4286521215,4286581084,4286640236,4286698679,4286756421,4286813471,4286869837,4286925527,4286980550,4287034913,4287088625,4287141693,4287194125,4287245928,4287297110,4287347678,4287397640,4287447003,4287495774,4287543961,4287591570,4287638608,4287685082,4287730999,4287776365,4287821187,4287865472,4287909226,4287952455,4287995166,4288037365,4288079058,4288120251,4288160950,4288201161,4288240890,4288280143,4288318925,4288357242,4288395099,4288432502,4288469457,4288505969,4288542043,4288577684,4288612898,4288647690,4288682064,4288716026,4288749581,4288782733,4288815488,4288847850,4288879824,4288911414,4288942626,4288973463,4289003930,4289034032,4289063773,4289093157,4289122189,4289150873,4289179213,4289207213,4289234877,4289262209,4289289213,4289315893,4289342253,4289368297,4289394029,4289419452,4289444570,4289469387,4289493906,4289518131,4289542066,4289565714,4289589078,4289612162,4289634969,4289657502,4289679765,4289701761,4289723493,4289744964,4289766178,4289787137,4289807845,4289828305,4289848519,4289868491,4289888223,4289907718,4289926979,4289946009,4289964811,4289983388,4290001742,4290019876,4290037792,4290055493,4290072982,4290090261,4290107333,4290124200,4290140865,4290157330,4290173597,4290189669,4290205548,4290221237,4290236737,4290252051,4290267182,4290282131,4290296901,4290311494,4290325912,4290340157,4290354231,4290368136,4290381874,4290395447,4290408857,4290422107,4290435198,4290448132,4290460910,4290473535,4290486009,4290498333,4290510509,4290522539,4290534425,4290546168,4290557770,4290569233,4290580558,4290591748,4290602803,4290613726,4290624518,4290635180,4290645714,4290656122,4290666405,4290676565,4290686603,4290696520,4290706318,4290715999,4290725564,4290735014,4290744350,4290753574,4290762688,4290771692,4290780588,4290789378,4290798062,4290806642,4290815119,4290823494,4290831769,4290839944,4290848021,4290856001,4290863886,4290871676,4290879373,4290886977,4290894490,4290901913,4290909247,4290916493,4290923652,4290930725,4290937713,4290944617,4290951438,4290958178,4290964837,4290971416,4290977916,4290984338,4290990683,4290996952,4291003145,4291009264,4291015310,4291021283,4291027184,4291033015,4291038776,4291044468,4291050091,4291055647,4291061136,4291066559,4291071917,4291077211,4291082441,4291087609,4291092715,4291097759,4291102743,4291107667,4291112532,4291117338,4291122087,4291126779
+//Base - Baby Jobs
+99,4023:4024:4025:4026:4027:4028:4029:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4045,0,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,8109652,8643822,9206127,9797599,10419283,11072238,11757533,12476249,13229476,14018313,14843866,15707247,16609574,17551968,18535552,19561452,20630792,21744696,22904284,24110674,25364977,26668297,28021732,29426368,30883282,32393539,33958189,35578269,37254799,38988782,40781202,42633023,44545189,46518620,48554214,50652844,52815357,55042573,57335285,59694256,62120220,64613880,67175907,69806941,72507587,75278418,78119970,81032746,84017211,87073795,90202891,93404853,96680000,100028610,103450924,106947144,110517434,114161918,117880680,121673767,125541185,129482901,133498844,137588903,141752928,145990732,150302088,154686733,159144364,163674642,168277191,172951600,177697420,182514167,187401324,192358338,197384623,202479560,207642499,212872757,218169621,223532347,228960163,234452268,240007834,245626005,251305900,257046613,262847212,268706744,274624232,280598679,286629065,292714352,298853483,305045382,311288957,317583099,323926685,330318577,336757623,343242660,349772512,356345994,362961909,369619053,376316214,383052171,389825698,396635564,403480532,410359362,417270811,424213634,431186584,438188413,445217874,452273720,459354706,466459588,473587127,480736086,487905232,495093338,502299181,509521545,516759221,524011006,531275705,538552132,545839109,553135467,560440047,567751700,575069288,582391684,589717771,597046446,604376616,611707202,619037136,626365365,633690848,641012559,648329484,655640625,662944998,670241632,677529573,684807881,692075631,699331913,706575834,713806514,721023091,728224718,735410563,742579811,749731663,756865335,763980061,771075089,778149684,785203127,792234715,799243761,806229595,813191563,820129025,827041359,833927958,840788232,847621604,854427516,861205423,867954796,874675123,881365905,888026659,894656917,901256227,907824150,914360262,920864154,927335431,933773713,940178632,946549836,952886985,959189754,965457830,971690914,977888720,984050975,990177418,996267800,1002321886,1008339452,1014320285,1020264186,1026170966,1032040448,1037872466,1043666865,1049423500,1055142238,1060822955,1066465539,1072069886,1077635904,1083163509,1088652627,1094103193,1099515152,1104888457,1110223070,1115518962,1120776112,1125994507,1131174143,1136315022,1141417155,1146480560,1151505263,1156491296,1161438699,1166347518,1171217806,1176049622,1180843032,1185598108,1190314928,1194993575,1199634138,1204236712,1208801396,1213328296,1217817522,1222269189,1226683417,1231060330,1235400057,1239702732,1243968491,1248197476,1252389832,1256545708,1260665257,1264748635,1268796001,1272807518,1276783353,1280723674,1284628654,1288498467,1292333290,1296133304,1299898691,1303629636,1307326326,1310988950,1314617700,1318212769,1321774352,1325302646,1328797850,1332260164,1335689790,1339086931,1342451791,1345784576,1349085494,1352354752,1355592559,1358799125,1361974661,1365119379,1368233491,1371317210,1374370750,1377394325,1380388150,1383352439,1386287408,1389193273,1392070249,1394918553,1397738400,1400530007,1403293591,1406029367,1408737552,1411418361,1414072010,1416698715,1419298692,1421872155,1424419319,1426940398,1429435606,1431905157,1434349263,1436768137,1439161990,1441531034,1443875479,1446195535,1448491412,1450763318,1453011460,1455236046,1457437282,1459615373,1461770523,1463902937,1466012816,1468100363,1470165779,1472209264,1474231016,1476231234,1478210114,1480167853,1482104645,1484020685,1485916165,1487791277,1489646211,1491481157,1493296304,1495091838,1496867946,1498624813,1500362623,1502081558,1503781800,1505463529,1507126924,1508772163,1510399423,1512008880,1513600707,1515175078,1516732165,1518272138,1519795167,1521301420,1522791064,1524264265,1525721187,1527161994,1528586847,1529995908,1531389336,1532767289,1534129924,1535477397,1536809863,1538127475,1539430385,1540718744,1541992701,1543252405,1544498003,1545729641,1546947464,1548151616,1549342238,1550519472,1551683458,1552834334,1553972238,1555097306,1556209673,1557309473,1558396839,1559471902,1560534793,1561585640,1562624572,1563651716,1564667197,1565671140,1566663668,1567644904,1568614969,1569573982,1570522063,1571459329,1572385897,1573301883,1574207401,1575102565,1575987487,1576862278,1577727048,1578581907,1579426962,1580262321,1581088090,1581904373,1582711275,1583508898,1584297344,1585076715,1585847110,1586608628,1587361366,1588105422,1588840892,1589567871,1590286453,1590996731,1591698797,1592392743,1593078658,1593756633,1594426755,1595089112,1595743791,1596390878,1597030458,1597662614,1598287430,1598904988,1599515370,1600118656,1600714926,1601304259,1601886733,1602462426,1603031414,1603593772,1604149576,1604698899,1605241815,1605778396,1606308715,1606832842,1607350847,1607862800,1608368770,1608868825,1609363032,1609851457,1610334167,1610811226,1611282699,1611748650,1612209142,1612664237,1613113997,1613558483,1613997756,1614431875,1614860899,1615284887,1615703896,1616117984,1616527207,1616931621,1617331282,1617726244,1618116561,1618502287,1618883474,1619260175,1619632442,1620000326,1620363877,1620723146,1621078182,1621429033,1621775749,1622118377,1622456965,1622791559,1623122206,1623448951,1623771840,1624090917,1624406227,1624717813,1625025719,1625329987,1625630660,1625927779,1626221386,1626511522,1626798227,1627081541,1627361504,1627638155,1627911532,1628181674,1628448618,1628712402,1628973062,1629230635,1629485157,1629736664,1629985191,1630230773,1630473445,1630713240,1630950192,1631184334,1631415700,1631644322,1631870232,1632093461,1632314042,1632532005,1632747381,1632960200,1633170493,1633378289,1633583617,1633786507,1633986987,1634185085,1634380829,1634574248,1634765368,1634954216,1635140820,1635325205,1635507398,1635687425,1635865311,1636041081,1636214761,1636386375,1636555947,1636723501,1636889061,1637052651,1637214294,1637374013,1637531831,1637687770,1637841852,1637994099,1638144533,1638293176,1638440048,1638585171,1638728565,1638870250,1639010247,1639148576,1639285256,1639420307,1639553749,1639685600,1639815879,1639944605,1640071796,1640197471,1640321647,1640444342,1640565574,1640685360,1640803717,1640920662,1641036212,1641150383,1641263192,1641374655,1641484788,1641593607,1641701127,1641807363,1641912331,1642016046,1642118523,1642219777,1642319822,1642418672,1642516342,1642612846,1642708197,1642802409,1642895496,1642987471,1643078348,1643168139,1643256857,1643344515,1643431126,1643516702,1643601256,1643684799,1643767344,1643848902,1643929486,1644009107,1644087776,1644165505,1644242304,1644318185,1644393159,1644467237,1644540429,1644612746,1644684198,1644754796,1644824550,1644893470,1644961565,1645028846,1645095322,1645161003,1645225899,1645290018,1645353370,1645415965,1645477811,1645538917,1645599292,1645658945,1645717884,1645776118,1645833655,1645890503,1645946671,1646002167,1646056999,1646111175,1646164702,1646217589,1646269843,1646321471,1646372481,1646422881,1646472677,1646521877,1646570488,1646618517,1646665972,1646712858,1646759183,1646804953,1646850175,1646894856,1646939002,1646982619,1647025714,1647068293,1647110362,1647151927,1647192995,1647233571,1647273661,1647313271,1647352406,1647391073,1647429277,1647467023,1647504317,1647541164,1647577570,1647613540,1647649079,1647684192,1647718884,1647753161,1647787027,1647820488,1647853548,1647886212,1647918484,1647950370,1647981874,1648013000,1648043753,1648074138,1648104159,1648133820,1648163126,1648192080,1648220687,1648248952,1648276878,1648304469,1648331730,1648358664,1648385275,1648411567,1648437544,1648463210,1648488568,1648513622,1648538376,1648562833,1648586997,1648610872,1648634460,1648657766,1648680792,1648703542,1648726020,1648748228,1648770170,1648791849,1648813268,1648834430,1648855339,1648875997,1648896407,1648916573,1648936497,1648956182,1648975631,1648994847,1649013832,1649032590,1649051123,1649069434,1649087525,1649105399,1649123059,1649140507,1649157746,1649174778,1649191606,1649208232,1649224659,1649240889,1649256924,1649272767,1649288420,1649303885,1649319165,1649334262,1649349178,1649363915,1649378475,1649392861,1649407074,1649421117,1649434991,1649448699,1649462242,1649475623,1649488844,1649501906,1649514811,1649527562,1649540160,1649552607,1649564904,1649577054,1649589058,1649600918,1649612636,1649624213,1649635652,1649646953,1649658119,1649669151,1649680051,1649690820,1649701460,1649711972,1649722358,1649732619,1649742757,1649752774,1649762671,1649772449,1649782110,1649791655,1649801085,1649810402,1649819607,1649828702,1649837688,1649846566,1649855338,1649864004,1649872566,1649881026,1649889384,1649897642,1649905801,1649913862,1649921826,1649929695,1649937469,1649945150,1649952739,1649960237,1649967645,1649974964,1649982195,1649989340,1649996399,1650003373,1650010263,1650017071,1650023797,1650030442,1650037008,1650043495,1650049904,1650056236,1650062492,1650068673,1650074780,1650080814,1650086775,1650092665,1650098484,1650104233,1650109913,1650115525,1650121070,1650126548,1650131961,1650137309,1650142593,1650147813,1650152971,1650158067,1650163102,1650168076,1650172990,1650177845,1650182642,1650187382,1650192065,1650196692,1650201263,1650205779,1650210241,1650214650,1650219006,1650223309,1650227561,1650231762,1650235912,1650240012,1650244063,1650248066,1650252021,1650255928,1650259788,1650263602,1650267370,1650271093,1650274771,1650278405,1650281996,1650285544,1650289049,1650292512,1650295933,1650299313,1650302653,1650305953,1650309213,1650312434,1650315616,1650318760,1650321866,1650324935,1650327967,1650330963,1650333923,1650336847,1650339736,1650342591,1650345411,1650348198,1650350951,1650353671,1650356358,1650359013,1650361636,1650364228,1650366789,1650369319,1650371819,1650374289,1650376729,1650379140,1650381522,1650383875,1650386200,1650388497,1650390766,1650393008,1650395223,1650397412,1650399574,1650401711,1650403822,1650405908,1650407969,1650410005,1650412016,1650414003,1650415966,1650417906,1650419823,1650421717,1650423588,1650425436,1650427262,1650429066
+//Job - Novice
+10,0,1,10,18,28,40,91,151,205,268,340,0
+//Job - 1st Classes
+50,1:2:3:4:5:6:26:4046,1,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,329843,379102,434567,496856,566629,644589,731482,828096,935264,1053861,1184807,1329062,1487630,1661554,1851918,2059842,2286484,2533034,2800715,3090779,3404503,3743189,4108159,4500752,4922319,5374222,5857829,6374510,6925632,7512557,8136637,8799208,9501590,10245078,11030942,11860420,12734717,13654998,14622385,15637956,16702739,17817709,18983785,20201828,21472637,22796947,24175427,25608679,27097233,28641549,30242013,31898938,33612561,35383045,37210476,39094865,41036147,43034181,45088752,47199571,49366275,51588430,53865531,56197005,58582210,61020440,63510925,66052833,68645274,71287301,73977913,76716056,79500628,82330481,85204422,88121217,91079595,94078248,97115837,100190993,103302318,106448393,109627775,112839003,116080601,119351078,122648934,125972660,129320741,132691658,136083893,139495928,142926248,146373345,149835718,153311875,156800336,160299633,163808315,167324946,170848108,174376402,177908451,181442899,184978413,188513685,192047431,195578393,199105341,202627072,206142410,209650210,213149356,216638760,220117366,223584148,227038110,230478288,233903749,237313590,240706940,244082960,247440841,250779805,254099105,257398024,260675877,263932007,267165788,270376624,273563946,276727216,279865923,282979584,286067743,289129972,292165868,295175054,298157179,301111917,304038965,306938045,309808901,312651301,315465033,318249908,321005758,323732433,326429805,329097764,331736219,334345097,336924341,339473912,341993787,344483958,346944434,349375236,351776401,354147978,356490030,358802632,361085872,363339848,365564669,367760455,369927336,372065452,374174951,376255991,378308737,380333362,382330048,384298982,386240358,388154377,390041246,391901177,393734387,395541098,397321537,399075935,400804526,402507549,404185246,405837861,407465642,409068839,410647704,412202492,413733459,415240862,416724961,418186016,419624289,421040041,422433535,423805034,425154801,426483099,427790192,429076343,430341814,431586867,432811764,434016766,435202133,436368124,437514996,438643007,439752411,440843463,441916415,442971519,444009023,445029176,446032223,447018409,447987976,448941165,449878214,450799359,451704835,452594875,453469708,454329562,455174663,456005235,456821498,457623672,458411973,459186616,459947813,460695773,461430704,462152810,462862294,463559356,464244194,464917003,465577976,466227304,466865175,467491774,468107285,468711889,469305764,469889087,470462031,471024768,471577467,472120295,472653416,473176993,473691185,474196151,474692045,475179021,475657230,476126821,476587940,477040732,477485339,477921901,478350556,478771440,479184687,479590429,479988796,480379915,480763913,481140913,481511037,481874405,482231136,482581346,482925149,483262657,483593982,483919232,484238515,484551937,484859601,485161609,485458061,485749057,486034693,486315066,486590269,486860394,487125532,487385773,487641205,487891913,488137983,488379498,488616541,488849192,489077530,489301633,489521578,489737440,489949293,490157210,490361262,490561520,490758052,490950927,491140211,491325969,491508266,491687165,491862728,492035017,492204091,492370009,492532829,492692607,492849400,493003262,493154248,493302410,493447800,493590469,493730468,493867845,494002649,494134928,494264728,494392095,494517074,494639709,494760043,494878119,494993979,495107664,495219215,495328671,495436070,495541451,495644852,495746309,495845859,495943537,496039378,496133416,496225684,496316216,496405044,496492199,496577713,496661617,496743940,496824712,496903963,496981720,497058012,497132865,497206307,497278364,497349062,497418427,497486483,497553255,497618767,497683043,497746106,497807978,497868682,497928240,497986673,498044003,498100250,498155434,498209576,498262695,498314810,498365940,498416104,498465319,498513604,498560976,498607452,498653050,498697785,498741674,498784733,498826978,498868423,498909084,498948976,498988113,499026509,499064179,499101136,499137393,499172964,499207862,499242099,499275688,499308641,499340970,499372686,499403802,499434328,499464276,499493657,499522481,499550759,499578502,499605719,499632420,499658615,499684314,499709526,499734260,499758525,499782330,499805684,499828596,499851073,499873124,499894757,499915980,499936801,499957227,499977266,499996925,500016211,500035131,500053692,500071901,500089765,500107290,500124483,500141350,500157897,500174130,500190055,500205678,500221004,500236040,500250790,500265261,500279457,500293384,500307047,500320450,500333599,500346498,500359153,500371568,500383747,500395695,500407416,500418915,500430195,500441261,500452117,500462767,500473215,500483465,500493520,500503384,500513061,500522554,500531867,500541003,500549966,500558759,500567385,500575847,500584149,500592293,500600282,500608120,500615809,500623352,500630752,500638011,500645132,500652118,500658971,500665694,500672290,500678760,500685108,500691335,500697444,500703437,500709316,500715083,500720741,500726291,500731736,500737078,500742318,500747459,500752502,500757449,500762302,500767063,500771734,500776316,500780811,500785220,500789546,500793790,500797953,500802037,500806043,500809973,500813829,500817611,500821321,500824961,500828532,500832035,500835471,500838842,500842149,500845393,500848576,500851698,500854761,500857766,500860714,500863606,500866443,500869226,500871956,500874634,500877261,500879838,500882366,500884846,500887279,500889666,500892008,500894305,500896558,500898769,500900938,500903065,500905152,500907199,500909207,500911177,500913110,500915006,500916866,500918691,500920481,500922237,500923960,500925650,500927308,500928934,500930529,500932094,500933629,500935135,500936613,500938063,500939485,500940880,500942248,500943590,500944907,500946199,500947466,500948709,500949929,500951125,500952299,500953450,500954580,500955688,500956775,500957841,500958887,500959913,500960920,500961908,500962877,500963827,500964759,500965674,500966571,500967451,500968314,500969161,500969992,500970807,500971607,500972391,500973160,500973915,500974656,500975382,500976095,500976794,500977480,500978153,500978813,500979460,500980095,500980718,500981329,500981929,500982517,500983094,500983660,500984215,500984760,500985294,500985818,500986332,500986836,500987331,500987816,500988292,500988759,500989217,500989667,500990108,500990541,500990965,500991381,500991789,500992190,500992583,500992968,500993346,500993717,500994081,500994438,500994788,500995132,500995469,500995800,500996124,500996442,500996754,500997060,500997360,500997655,500997944,500998227,500998505,500998778,500999046,500999309,500999567,500999820,501000068,501000311,501000549,501000783,501001012,501001237,501001458,501001675,501001887,501002095,501002299,501002500,501002697,501002890,501003079,501003265,501003447,501003626,501003801,501003973,501004142,501004307,501004469,501004628,501004784,501004937,501005087,501005234,501005379,501005521,501005660,501005796,501005930,501006061,501006190,501006316,501006440,501006562,501006681,501006798,501006913,501007026,501007136,501007244,501007350,501007454,501007556,501007656,501007754,501007850,501007945,501008038,501008129,501008218,501008306,501008392,501008476,501008559,501008640,501008720,501008798,501008875,501008950,501009024,501009096,501009167,501009237,501009305,501009372,501009438,501009502,501009565,501009627,501009688,501009748,501009806,501009863,501009919,501009974,501010028,501010081,501010133,501010184,501010234,501010283,501010331,501010378,501010424,501010469,501010514,501010558,501010601,501010643,501010684,501010724,501010764,501010803,501010841,501010878,501010915,501010951,501010986,501011021,501011055,501011088,501011121,501011153,501011184,501011215,501011245,501011275,501011304,501011332,501011360,501011387,501011414,501011440,501011466,501011491,501011516,501011540,501011564,501011587,501011610,501011633,501011655,501011677,501011698,501011719,501011739,501011759,501011779,501011798,501011817,501011835,501011853,501011871,501011888,501011905,501011922,501011938,501011954,501011970,501011985,501012000,501012015,501012030,501012044,501012058,501012072,501012085,501012098,501012111,501012124,501012136,501012148,501012160,501012172,501012183,501012194,501012205,501012216,501012227,501012237,501012247,501012257,501012267,501012277,501012286,501012295,501012304,501012313,501012322,501012330,501012338,501012346,501012354,501012362,501012370,501012378,501012385,501012392,501012399,501012406,501012413,501012420,501012427,501012433,501012439,501012445,501012451,501012457,501012463,501012469,501012475,501012480,501012485,501012490,501012495,501012500,501012505,501012510,501012515,501012520,501012524,501012528,501012532,501012536,501012540,501012544,501012548,501012552,501012556,501012560,501012564,501012568,501012571,501012574,501012577,501012580,501012583,501012586,501012589,501012592,501012595,501012598,501012601,501012604,501012607,501012610,501012613,501012615,501012617,501012619,501012621,501012623,501012625,501012627,501012629,501012631,501012633,501012635,501012637,501012639,501012641,501012643,501012645,501012647,501012649,501012651,501012653,501012655,501012656,501012657,501012658,501012659,501012660,501012661,501012662,501012663,501012664,501012665,501012666,501012667,501012668,501012669,501012670,501012671,501012672,501012673,501012674,501012675,501012676,501012677,501012678,501012679,501012680,501012681,501012682,501012683,501012684,501012685,501012686,501012687,501012688,501012689,501012690,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691,501012691
+//Job - 2nd Classes
+50,7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044:4049,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,704689,811527,932059,1067681,1219884,1390260,1580501,1792401,2027857,2288870,2577542,2896079,3246785,3632064,4054414,4516427,5020783,5570245,6167657,6815936,7518065,8277089,9096106,9978260,10926733,11944736,13035502,14202274,15448298,16776813,18191041,19694176,21289377,22979756,24768369,26658206,28652182,30753126,32963775,35286762,37724609,40279720,42954371,45750705,48670723,51716280,54889077,58190657,61622401,65185522,68881063,72709894,76672708,80770021,85002169,89369310,93871421,98508300,103279567,108184665,113222861,118393251,123694760,129126148,134686012,140372791,146184770,152120084,158176725,164352547,170645270,177052488,183571672,190200181,196935263,203774065,210713640,217750950,224882876,232106223,239417728,246814065,254291853,261847661,269478017,277179412,284948306,292781137,300674324,308624274,316627388,324680066,332778713,340919742,349099582,357314681,365561510,373836570,382136392,390457544,398796635,407150316,415515285,423888291,432266134,440645671,449023816,457397543,465763888,474119952,482462902,490789971,499098461,507385745,515649266,523886539,532095151,540272763,548417108,556525995,564597304,572628991,580619086,588565690,596466980,604321205,612126687,619881818,627585062,635234954,642830098,650369167,657850901,665274107,672637658,679940491,687181606,694360067,701474996,708525577,715511052,722430719,729283933,736070103,742788691,749439211,756021226,762534350,768978243,775352612,781657209,787891828,794056307,800150524,806174396,812127878,818010962,823823676,829566082,835238274,840840378,846372551,851834978,857227874,862551478,867806057,872991902,878109327,883158668,888140283,893054550,897901867,902682649,907397329,912046357,916630197,921149329,925604246,929995454,934323471,938588826,942792060,946933722,951014371,955034574,958994906,962895949,966738291,970522526,974249254,977919079,981532609,985090456,988593235,992041563,995436060,998777348,1002066049,1005302786,1008488184,1011622866,1014707457,1017742580,1020728856,1023666907,1026557352,1029400809,1032197893,1034949218,1037655393,1040317027,1042934723,1045509083,1048040705,1050530182,1052978105,1055385060,1057751629,1060078390,1062365915,1064614774,1066825530,1068998742,1071134965,1073234748,1075298634,1077327163,1079320868,1081280278,1083205916,1085098299,1086957939,1088785342,1090581010,1092345438,1094079115,1095782526,1097456149,1099100457,1100715917,1102302990,1103862133,1105393795,1106898420,1108376447,1109828309,1111254434,1112655243,1114031153,1115382574,1116709911,1118013563,1119293924,1120551383,1121786323,1122999122,1124190152,1125359779,1126508366,1127636269,1128743839,1129831422,1130899359,1131947986,1132977634,1133988629,1134981292,1135955938,1136912879,1137852422,1138774868,1139680514,1140569653,1141442572,1142299555,1143140880,1143966822,1144777651,1145573633,1146355029,1147122096,1147875088,1148614253,1149339836,1150052079,1150751218,1151437486,1152111113,1152772324,1153421341,1154058381,1154683659,1155297386,1155899769,1156491012,1157071316,1157640877,1158199889,1158748542,1159287023,1159815516,1160334201,1160843257,1161342858,1161833175,1162314377,1162786630,1163250097,1163704937,1164151308,1164589365,1165019259,1165441139,1165855152,1166261441,1166660148,1167051412,1167435370,1167812155,1168181900,1168544733,1168900782,1169250171,1169593023,1169929459,1170259597,1170583552,1170901439,1171213370,1171519455,1171819803,1172114519,1172403707,1172687470,1172965908,1173239120,1173507203,1173770252,1174028360,1174281619,1174530119,1174773949,1175013195,1175247943,1175478276,1175704277,1175926026,1176143603,1176357085,1176566548,1176772068,1176973718,1177171570,1177365695,1177556163,1177743042,1177926399,1178106300,1178282809,1178455990,1178625906,1178792617,1178956183,1179116664,1179274117,1179428599,1179580165,1179728870,1179874768,1180017912,1180158353,1180296142,1180431328,1180563961,1180694088,1180821757,1180947013,1181069902,1181190469,1181308757,1181424809,1181538667,1181650373,1181759966,1181867487,1181972975,1182076467,1182178002,1182277616,1182375346,1182471227,1182565293,1182657579,1182748119,1182836945,1182924090,1183009586,1183093463,1183175752,1183256483,1183335686,1183413389,1183489621,1183564409,1183637781,1183709763,1183780382,1183849663,1183917632,1183984313,1184049731,1184113909,1184176871,1184238640,1184299239,1184358689,1184417013,1184474231,1184530365,1184585435,1184639461,1184692463,1184744460,1184795471,1184845515,1184894611,1184942776,1184990027,1185036382,1185081858,1185126472,1185170240,1185213178,1185255302,1185296627,1185337168,1185376940,1185415958,1185454236,1185491788,1185528627,1185564767,1185600222,1185635004,1185669126,1185702601,1185735441,1185767658,1185799263,1185830269,1185860686,1185890526,1185919800,1185948518,1185976691,1186004330,1186031444,1186058044,1186084139,1186109739,1186134853,1186159490,1186183659,1186207370,1186230631,1186253450,1186275836,1186297797,1186319341,1186340476,1186361210,1186381550,1186401504,1186421079,1186440283,1186459122,1186477604,1186495735,1186513521,1186530970,1186548087,1186564879,1186581353,1186597514,1186613368,1186628921,1186644179,1186659147,1186673831,1186688236,1186702367,1186716230,1186729830,1186743172,1186756260,1186769100,1186781696,1186794053,1186806175,1186818067,1186829733,1186841177,1186852404,1186863418,1186874223,1186884822,1186895220,1186905421,1186915428,1186925245,1186934875,1186944322,1186953590,1186962682,1186971601,1186980351,1186988935,1186997356,1187005617,1187013721,1187021671,1187029470,1187037121,1187044626,1187051989,1187059212,1187066298,1187073249,1187080068,1187086758,1187093321,1187099759,1187106075,1187112271,1187118349,1187124311,1187130160,1187135898,1187141527,1187147049,1187152466,1187157780,1187162993,1187168107,1187173124,1187178046,1187182874,1187187611,1187192258,1187196816,1187201288,1187205675,1187209978,1187214200,1187218341,1187222404,1187226390,1187230300,1187234136,1187237899,1187241590,1187245211,1187248763,1187252248,1187255667,1187259021,1187262311,1187265538,1187268704,1187271810,1187274857,1187277846,1187280778,1187283655,1187286477,1187289245,1187291961,1187294625,1187297238,1187299802,1187302317,1187304784,1187307204,1187309578,1187311907,1187314192,1187316434,1187318633,1187320790,1187322906,1187324982,1187327019,1187329017,1187330977,1187332900,1187334786,1187336636,1187338451,1187340232,1187341979,1187343693,1187345374,1187347023,1187348641,1187350228,1187351785,1187353312,1187354810,1187356280,1187357722,1187359136,1187360524,1187361885,1187363220,1187364530,1187365815,1187367076,1187368313,1187369526,1187370716,1187371883,1187373028,1187374151,1187375253,1187376334,1187377395,1187378435,1187379456,1187380457,1187381439,1187382403,1187383348,1187384275,1187385185,1187386077,1187386952,1187387811,1187388653,1187389479,1187390290,1187391085,1187391865,1187392630,1187393381,1187394118,1187394841,1187395550,1187396245,1187396927,1187397596,1187398252,1187398896,1187399528,1187400148,1187400756,1187401352,1187401937,1187402511,1187403074,1187403626,1187404168,1187404699,1187405220,1187405731,1187406233,1187406725,1187407208,1187407682,1187408147,1187408603,1187409050,1187409489,1187409919,1187410341,1187410755,1187411161,1187411559,1187411950,1187412333,1187412709,1187413078,1187413440,1187413795,1187414143,1187414485,1187414820,1187415149,1187415472,1187415788,1187416098,1187416402,1187416701,1187416994,1187417281,1187417563,1187417840,1187418111,1187418377,1187418638,1187418894,1187419145,1187419391,1187419633,1187419870,1187420103,1187420331,1187420555,1187420775,1187420990,1187421201,1187421408,1187421611,1187421810,1187422006,1187422198,1187422386,1187422571,1187422752,1187422930,1187423104,1187423275,1187423443,1187423608,1187423769,1187423927,1187424082,1187424234,1187424383,1187424530,1187424674,1187424815,1187424953,1187425089,1187425222,1187425353,1187425481,1187425607,1187425730,1187425851,1187425970,1187426086,1187426200,1187426312,1187426422,1187426530,1187426636,1187426740,1187426842,1187426942,1187427040,1187427136,1187427230,1187427322,1187427413,1187427502,1187427589,1187427674,1187427758,1187427840,1187427921,1187428000,1187428078,1187428154,1187428229,1187428302,1187428374,1187428444,1187428513,1187428581,1187428648,1187428713,1187428777,1187428840,1187428902,1187428962,1187429021,1187429079,1187429136,1187429192,1187429247,1187429301,1187429354,1187429406,1187429457,1187429507,1187429556,1187429604,1187429651,1187429697,1187429742,1187429786,1187429829,1187429872,1187429914,1187429955,1187429995,1187430034,1187430073,1187430111,1187430148,1187430184,1187430220,1187430255,1187430289,1187430323,1187430356,1187430388,1187430420,1187430451,1187430482,1187430512,1187430541,1187430570,1187430598,1187430626,1187430653,1187430680,1187430706,1187430732,1187430757,1187430782,1187430806,1187430830,1187430853,1187430876,1187430898,1187430920,1187430942,1187430963,1187430984,1187431004,1187431024,1187431044,1187431063,1187431082,1187431100,1187431118,1187431136,1187431153,1187431170,1187431187,1187431203,1187431219,1187431235,1187431250,1187431265,1187431280,1187431295,1187431309,1187431323,1187431337,1187431350,1187431363,1187431376,1187431389,1187431401,1187431413,1187431425,1187431437,1187431448,1187431459,1187431470,1187431481,1187431492,1187431502,1187431512,1187431522,1187431532,1187431542,1187431551,1187431560,1187431569,1187431578,1187431587,1187431595,1187431603,1187431611,1187431619,1187431627,1187431635,1187431642,1187431649,1187431656,1187431663,1187431670,1187431677,1187431684,1187431690,1187431696,1187431702,1187431708,1187431714,1187431720,1187431726,1187431732,1187431737,1187431742,1187431747,1187431752,1187431757,1187431762,1187431767,1187431772,1187431777,1187431782,1187431786,1187431790,1187431794,1187431798,1187431802,1187431806,1187431810,1187431814,1187431818,1187431822,1187431826,1187431829,1187431832,1187431835,1187431838,1187431841,1187431844,1187431847,1187431850,1187431853,1187431856,1187431859,1187431862,1187431865,1187431868,1187431871,1187431873,1187431875,1187431877,1187431879,1187431881,1187431883,1187431885,1187431887,1187431889,1187431891,1187431893,1187431895,1187431897,1187431899,1187431901,1187431903,1187431905,1187431907,1187431909,1187431911,1187431913,1187431915,1187431916,1187431917,1187431918,1187431919,1187431920,1187431921,1187431922
+//Job - Super Novice
+99,23,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
+//Job - Novice High
+10,4001,1,11,20,31,44,100,166,226,295,374,0
+//Job - Adv First Classes
+50,4002:4003:4004:4005:4006:4007,1,60,86,116,152,232,360,440,544,672,1040,1208,1398,1604,1896,2250,3336,3874,4452,6080,7976,11128,12544,14042,18228,28683,38225,42228,46425,58073,70898,91195,99290,107720,131043,156238,195408,210430,226010,269028,314788,384853,479453,510878,620880,715530,822388,942708,1077832,1229192,1398312,1586809,1796395,2028875,2286150,2570212,2883147,3227131,3604428,4017387,4468440,4960097,5494942,6075626,6704865,7385431,8120148,8911883,9763540,10678052,11658373,12707470,13828314,15023872,16297098,17650924,19088250,20611938,22224798,23929585,25728985,27625611,29621990,31720558,33923652,36233502,38652223,41181809,43824128,46580913,49453759,52444118,55553293,58782437,62132546,65604458,69198851,72916241,76756979,80721254,84809088,89020341,93354708,97811721,102390753,107091018,111911574,116851326,121909029,127083292,132372582,137775229,143289430,148913253,154644644,160481430,166421327,172461943,178600787,184835272,191162721,197580376,204085402,210674892,217345875,224095322,230920151,237817234,244783402,251815451,258910149,266064240,273274451,280537495,287850079,295208908,302610689,310052137,317529979,325040959,332581841,340149414,347740495,355351934,362980617,370623468,378277453,385939583,393606917,401276564,408945685,416611495,424271267,431922331,439562077,447187956,454797483,462388235,469957854,477504049,485024593,492517328,499980161,507411067,514808089,522169338,529492992,536777296,544020563,551221172,558377570,565488268,572551843,579566936,586532253,593446562,600308694,607117541,613872055,620571248,627214189,633800006,640327881,646797052,653206812,659556504,665845524,672073319,678239382,684343257,690384532,696362841,702277862,708129315,713916962,719640605,725300085,730895280,736426105,741892510,747294479,752632028,757905206,763114091,768258791,773339442,778356208,783309277,788198862,793025201,797788555,802489205,807127454,811703625,816218058,820671113,825063166,829394608,833665848,837877307,842029420,846122635,850157413,854134225,858053552,861915887,865721730,869471590,873165985,876805439,880390483,883921654,887399495,890824553,894197380,897518531,900788566,904008046,907177537,910297605,913368818,916391747,919366961,922295032,925176531,928012029,930802096,933547303,936248218,938905408,941519439,944090875,946620278,949108207,951555219,953961868,956328705,958656278,960945131,963195806,965408840,967584767,969724117,971827415,973895183,975927939,977926195,979890460,981821237,983719026,985584322,987417614,989219387,990990121,992730290,994440365,996120811,997772088,999394651,1000988949,1002555426,1004094522,1005606671,1007092302,1008551839,1009985700,1011394298,1012778042,1014137334,1015472572,1016784149,1018072452,1019337863,1020580760,1021801514,1023000493,1024178058,1025334567,1026470371,1027585817,1028681247,1029756999,1030813405,1031850792,1032869483,1033869796,1034852045,1035816538,1036763579,1037693467,1038606498,1039502962,1040383145,1041247329,1042095790,1042928803,1043746635,1044549552,1045337813,1046111675,1046871391,1047617208,1048349371,1049068120,1049773692,1050466319,1051146230,1051813650,1052468801,1053111901,1053743164,1054362800,1054971017,1055568019,1056154006,1056729176,1057293722,1057847834,1058391700,1058925505,1059449429,1059963650,1060468344,1060963682,1061449833,1061926964,1062395238,1062854815,1063305853,1063748508,1064182931,1064609273,1065027680,1065438297,1065841266,1066236727,1066624817,1067005670,1067379419,1067746194,1068106123,1068459331,1068805942,1069146076,1069479853,1069807389,1070128800,1070444198,1070753693,1071057395,1071355410,1071647844,1071934799,1072216376,1072492675,1072763794,1073029828,1073290871,1073547016,1073798354,1074044974,1074286963,1074524407,1074757391,1074985997,1075210307,1075430400,1075646355,1075858249,1076066158,1076270156,1076470315,1076666707,1076859403,1077048471,1077233979,1077415993,1077594579,1077769801,1077941721,1078110401,1078275902,1078438283,1078597603,1078753918,1078907285,1079057760,1079205396,1079350247,1079492364,1079631799,1079768602,1079902823,1080034510,1080163711,1080290472,1080414839,1080536857,1080656570,1080774021,1080889253,1081002307,1081113225,1081222046,1081328810,1081433556,1081536322,1081637145,1081736061,1081833107,1081928317,1082021726,1082113368,1082203277,1082291485,1082378024,1082462925,1082546220,1082627938,1082708110,1082786764,1082863929,1082939633,1083013904,1083086769,1083158254,1083228386,1083297189,1083364689,1083430911,1083495879,1083559616,1083622146,1083683491,1083743674,1083802717,1083860641,1083917467,1083973217,1084027910,1084081567,1084134207,1084185849,1084236512,1084286215,1084334976,1084382812,1084429742,1084475782,1084520949,1084565260,1084608731,1084651377,1084693215,1084734259,1084774525,1084814027,1084852780,1084890798,1084928095,1084964685,1085000581,1085035796,1085070343,1085104235,1085137484,1085170102,1085202101,1085233493,1085264289,1085294501,1085324140,1085353217,1085381742,1085409726,1085437179,1085464111,1085490532,1085516451,1085541878,1085566823,1085591294,1085615301,1085638852,1085661956,1085684622,1085706858,1085728672,1085750072,1085771065,1085791660,1085811864,1085831684,1085851128,1085870203,1085888916,1085907274,1085925283,1085942950,1085960282,1085977285,1085993965,1086010328,1086026381,1086042129,1086057578,1086072734,1086087602,1086102188,1086116497,1086130534,1086144304,1086157813,1086171065,1086184066,1086196820,1086209332,1086221606,1086233647,1086245459,1086257047,1086268415,1086279567,1086290507,1086301240,1086311769,1086322098,1086332231,1086342171,1086351922,1086361488,1086370872,1086380078,1086389109,1086397969,1086406661,1086415187,1086423552,1086431758,1086439808,1086447705,1086455452,1086463052,1086470507,1086477821,1086484996,1086492035,1086498940,1086505714,1086512359,1086518878,1086525273,1086531547,1086537701,1086543738,1086549661,1086555471,1086561171,1086566763,1086572248,1086577629,1086582908,1086588087,1086593167,1086598151,1086603040,1086607836,1086612541,1086617157,1086621685,1086626127,1086630485,1086634760,1086638954,1086643068,1086647104,1086651063,1086654947,1086658757,1086662495,1086666162,1086669759,1086673288,1086676750,1086680146,1086683477,1086686745,1086689951,1086693096,1086696181,1086699208,1086702177,1086705090,1086707947,1086710750,1086713500,1086716198,1086718844,1086721440,1086723987,1086726485,1086728936,1086731340,1086733699,1086736013,1086738283,1086740510,1086742694,1086744837,1086746939,1086749001,1086751024,1086753009,1086754956,1086756866,1086758740,1086760578,1086762381,1086764150,1086765885,1086767587,1086769257,1086770895,1086772502,1086774078,1086775624,1086777141,1086778629,1086780089,1086781521,1086782926,1086784304,1086785656,1086786982,1086788283,1086789559,1086790811,1086792039,1086793244,1086794426,1086795586,1086796724,1086797840,1086798935,1086800009,1086801063,1086802097,1086803111,1086804106,1086805082,1086806039,1086806978,1086807899,1086808803,1086809689,1086810559,1086811412,1086812249,1086813070,1086813875,1086814665,1086815440,1086816200,1086816946,1086817678,1086818396,1086819100,1086819791,1086820469,1086821134,1086821786,1086822426,1086823053,1086823669,1086824273,1086824865,1086825446,1086826016,1086826575,1086827124,1086827662,1086828190,1086828708,1086829216,1086829714,1086830203,1086830683,1086831153,1086831615,1086832068,1086832512,1086832948,1086833375,1086833794,1086834205,1086834608,1086835004,1086835392,1086835773,1086836147,1086836514,1086836874,1086837227,1086837573,1086837912,1086838245,1086838572,1086838892,1086839206,1086839514,1086839816,1086840113,1086840404,1086840690,1086840970,1086841245,1086841515,1086841779,1086842038,1086842292,1086842542,1086842787,1086843027,1086843263,1086843494,1086843721,1086843943,1086844161,1086844375,1086844585,1086844791,1086844993,1086845191,1086845385,1086845576,1086845763,1086845946,1086846126,1086846303,1086846476,1086846646,1086846813,1086846976,1086847136,1086847293,1086847447,1086847598,1086847746,1086847892,1086848035,1086848175,1086848312,1086848447,1086848579,1086848709,1086848836,1086848961,1086849083,1086849203,1086849321,1086849437,1086849550,1086849661,1086849770,1086849877,1086849982,1086850085,1086850186,1086850285,1086850382,1086850477,1086850571,1086850663,1086850753,1086850841,1086850928,1086851013,1086851096,1086851178,1086851258,1086851337,1086851414,1086851490,1086851564,1086851637,1086851708,1086851778,1086851847,1086851914,1086851980,1086852045,1086852109,1086852171,1086852232,1086852292,1086852351,1086852409,1086852466,1086852522,1086852576,1086852629,1086852681,1086852732,1086852782,1086852831,1086852879,1086852927,1086852974,1086853020,1086853065,1086853109,1086853152,1086853194,1086853236,1086853277,1086853317,1086853356,1086853394,1086853432,1086853469,1086853505,1086853541,1086853576,1086853610,1086853644,1086853677,1086853709,1086853741,1086853772,1086853802,1086853832,1086853861,1086853890,1086853918,1086853946,1086853973,1086854000,1086854026,1086854052,1086854077,1086854102,1086854126,1086854150,1086854173,1086854196,1086854218,1086854240,1086854261,1086854282,1086854303,1086854323,1086854343,1086854362,1086854381,1086854400,1086854418,1086854436,1086854454,1086854471,1086854488,1086854505,1086854521,1086854537,1086854553,1086854568,1086854583,1086854598,1086854612,1086854626,1086854640,1086854654,1086854667,1086854680,1086854693,1086854706,1086854718,1086854730,1086854742,1086854754,1086854765,1086854776,1086854787,1086854798,1086854808,1086854818,1086854828,1086854838,1086854848,1086854857,1086854866,1086854875,1086854884,1086854893,1086854902,1086854910,1086854918,1086854926,1086854934,1086854942,1086854950,1086854957,1086854964,1086854971,1086854978,1086854985,1086854992,1086854999,1086855005,1086855011,1086855017,1086855023,1086855029,1086855035,1086855041,1086855047,1086855052,1086855057,1086855062,1086855067,1086855072,1086855077,1086855082,1086855087,1086855092,1086855096,1086855100,1086855104,1086855108,1086855112,1086855116,1086855120,1086855124,1086855128,1086855132,1086855136,1086855140,1086855143,1086855146,1086855149,1086855152,1086855155,1086855158,1086855161,1086855164,1086855167,1086855170,1086855173,1086855176,1086855179,1086855182,1086855185,1086855187,1086855189,1086855191,1086855193,1086855195,1086855197,1086855199,1086855201,1086855203,1086855205,1086855207,1086855209,1086855211,1086855213,1086855215,1086855217,1086855219,1086855221,1086855223,1086855225,1086855227,1086855228,1086855229,1086855230,1086855231,1086855232,1086855233,1086855234,1086855235,1086855236
+//Job - Adv Second Classes
+70,24:25:4008:4009:4010:4011:4012:4013:4014:4015:4016:4017:4018:4019:4020:4021:4022,1,368,568,696,1206,1774,2192,3196,5080,7352,8580,9892,13358,18984,31925,35860,40013,51605,68585,87770,96443,105515,131770,167428,206720,223860,241673,294553,362303,479053,513362,548856,656197,787507,927154,985696,1046034,1231134,1449220,1678177,1943306,2244059,2584282,2968115,3400000,3884688,4427246,5033064,5707855,6457661,7288852,8208125,9222500,10339317,11566230,12911197,14382470,15988583,17738338,19640789,21705223,23941143,26358244,28966392,31775600,34796000,38037819,41511350,45226922,49194872,53425513,57929105,62715823,67795725,73178721,78874542,84892710,91242506,97932943,104972733,112370263,120133566,128270295,136787699,145692601,154991375,164689926,174793673,185307530,196235893,207582627,219351052,231543938,244163492,257211358,270688607,284595740,298932685,313698799,328892871,344513126,360557232,377022309,393904936,411201163,428906522,447016041,465524258,484425237,503712583,523379460,543418608,563822364,584582678,605691135,627138976,648917115,671016163,693426449,716138040,739140762,762424222,785977830,809790819,833852265,858151108,882676174,907416194,932359821,957495652,982812246,1008298142,1033941875,1059731995,1085657082,1111705763,1137866726,1164128735,1190480643,1216911407,1243410098,1269965914,1296568193,1323206421,1349870242,1376549469,1403234090,1429914278,1456580397,1483223010,1509832883,1536400993,1562918530,1589376904,1615767747,1642082917,1668314501,1694454815,1720496409,1746432067,1772254807,1797957882,1823534782,1848979230,1874285184,1899446836,1924458610,1949315159,1974011367,1998542342,2022903418,2047090150,2071098310,2094923887,2118563083,2142012307,2165268175,2188327503,2211187307,2233844796,2256297369,2278542611,2300578289,2322402347,2344012903,2365408244,2386586822,2407547248,2428288289,2448808865,2469108042,2489185029,2509039173,2528669956,2548076989,2567260008,2586218871,2604953553,2623464142,2641750834,2659813929,2677653830,2695271035,2712666136,2729839813,2746792832,2763526041,2780040365,2796336805,2812416433,2828280388,2843929874,2859366157,2874590560,2889604462,2904409294,2919006536,2933397714,2947584399,2961568203,2975350775,2988933801,3002319001,3015508125,3028502953,3041305291,3053916970,3066339843,3078575783,3090626683,3102494451,3114181011,3125688300,3137018266,3148172868,3159154072,3169963851,3180604184,3191077054,3201384446,3211528348,3221510747,3231333629,3240998979,3250508779,3259865006,3269069632,3278124624,3287031942,3295793538,3304411356,3312887331,3321223387,3329421440,3337483392,3345411135,3353206549,3360871500,3368407842,3375817414,3383102041,3390263534,3397303689,3404224286,3411027090,3417713850,3424286299,3430746152,3437095109,3443334852,3449467047,3455493342,3461415367,3467234735,3472953041,3478571863,3484092761,3489517276,3494846931,3500083232,3505227667,3510281705,3515246797,3520124376,3524915857,3529622637,3534246095,3538787592,3543248471,3547630058,3551933659,3556160565,3560312047,3564389360,3568393741,3572326410,3576188570,3579981406,3583706087,3587363764,3590955573,3594482632,3597946043,3601346892,3604686248,3607965165,3611184681,3614345817,3617449581,3620496963,3623488939,3626426470,3629310502,3632141966,3634921779,3637650842,3640330044,3642960259,3645542346,3648077152,3650565509,3653008236,3655406140,3657760013,3660070635,3662338774,3664565184,3666750607,3668895774,3671001402,3673068197,3675096854,3677088055,3679042471,3680960763,3682843579,3684691557,3686505325,3688285499,3690032685,3691747478,3693430465,3695082220,3696703310,3698294290,3699855707,3701388097,3702891989,3704367901,3705816342,3707237813,3708632806,3710001804,3711345282,3712663706,3713957535,3715227220,3716473203,3717695918,3718895792,3720073245,3721228689,3722362528,3723475160,3724566975,3725638356,3726689680,3727721318,3728733632,3729726979,3730701710,3731658168,3732596692,3733517613,3734421257,3735307945,3736177990,3737031701,3737869381,3738691328,3739497833,3740289184,3741065662,3741827543,3742575099,3743308597,3744028298,3744734459,3745427333,3746107167,3746774204,3747428682,3748070836,3748700896,3749319088,3749925634,3750520750,3751104651,3751677546,3752239641,3752791138,3753332236,3753863129,3754384008,3754895060,3755396470,3755888418,3756371081,3756844634,3757309248,3757765090,3758212325,3758651114,3759081616,3759503986,3759918377,3760324939,3760723819,3761115161,3761499107,3761875797,3762245366,3762607949,3762963676,3763312677,3763655079,3763991005,3764320578,3764643917,3764961140,3765272361,3765577694,3765877250,3766171137,3766459463,3766742332,3767019847,3767292109,3767559217,3767821269,3768078359,3768330582,3768578029,3768820790,3769058954,3769292607,3769521835,3769746721,3769967347,3770183794,3770396141,3770604465,3770808842,3771009346,3771206051,3771399029,3771588350,3771774083,3771956296,3772135055,3772310426,3772482473,3772651259,3772816845,3772979292,3773138659,3773295005,3773448386,3773598859,3773746479,3773891300,3774033375,3774172755,3774309492,3774443636,3774575236,3774704340,3774830995,3774955248,3775077144,3775196728,3775314043,3775429133,3775542040,3775652805,3775761468,3775868070,3775972649,3776075244,3776175892,3776274631,3776371496,3776466523,3776559747,3776651202,3776740921,3776828938,3776915285,3776999993,3777083093,3777164616,3777244592,3777323050,3777400019,3777475527,3777549602,3777622271,3777693560,3777763496,3777832105,3777899411,3777965440,3778030215,3778093760,3778156099,3778217255,3778277250,3778336106,3778393844,3778450486,3778506053,3778560565,3778614042,3778666503,3778717968,3778768456,3778817986,3778866575,3778914242,3778961003,3779006877,3779051880,3779096028,3779139338,3779181825,3779223505,3779264394,3779304506,3779343857,3779382460,3779420330,3779457481,3779493927,3779529681,3779564756,3779599164,3779632919,3779666033,3779698518,3779730386,3779761649,3779792318,3779822405,3779851920,3779880875,3779909280,3779937145,3779964481,3779991298,3780017605,3780043413,3780068731,3780093568,3780117933,3780141835,3780165283,3780188286,3780210852,3780232989,3780254706,3780276010,3780296909,3780317412,3780337525,3780357256,3780376612,3780395601,3780414229,3780432503,3780450430,3780468016,3780485268,3780502193,3780518796,3780535084,3780551062,3780566737,3780582114,3780597199,3780611997,3780626514,3780640755,3780654726,3780668431,3780681876,3780695066,3780708005,3780720698,3780733150,3780745366,3780757349,3780769105,3780780637,3780791950,3780803048,3780813936,3780824617,3780835095,3780845374,3780855458,3780865350,3780875054,3780884574,3780893913,3780903074,3780912061,3780920878,3780929527,3780938012,3780946336,3780954501,3780962511,3780970369,3780978078,3780985640,3780993059,3781000337,3781007476,3781014480,3781021351,3781028091,3781034703,3781041189,3781047552,3781053794,3781059918,3781065925,3781071818,3781077599,3781083270,3781088834,3781094292,3781099646,3781104899,3781110052,3781115107,3781120066,3781124931,3781129703,3781134384,3781138976,3781143481,3781147901,3781152237,3781156490,3781160662,3781164755,3781168770,3781172709,3781176573,3781180364,3781184083,3781187731,3781191310,3781194821,3781198265,3781201644,3781204958,3781208209,3781211399,3781214528,3781217598,3781220609,3781223563,3781226461,3781229304,3781232093,3781234829,3781237513,3781240146,3781242729,3781245263,3781247749,3781250187,3781252579,3781254926,3781257228,3781259486,3781261701,3781263874,3781266006,3781268097,3781270149,3781272162,3781274136,3781276073,3781277973,3781279837,3781281666,3781283460,3781285220,3781286946,3781288639,3781290300,3781291930,3781293529,3781295097,3781296636,3781298145,3781299626,3781301078,3781302503,3781303901,3781305272,3781306617,3781307937,3781309231,3781310501,3781311747,3781312969,3781314168,3781315344,3781316498,3781317630,3781318740,3781319829,3781320897,3781321945,3781322973,3781323982,3781324972,3781325943,3781326895,3781327829,3781328745,3781329644,3781330526,3781331391,3781332240,3781333073,3781333890,3781334691,3781335477,3781336248,3781337004,3781337746,3781338474,3781339188,3781339888,3781340575,3781341249,3781341910,3781342559,3781343195,3781343819,3781344431,3781345032,3781345621,3781346199,3781346766,3781347322,3781347868,3781348403,3781348928,3781349443,3781349948,3781350444,3781350930,3781351407,3781351875,3781352334,3781352784,3781353226,3781353659,3781354084,3781354501,3781354910,3781355311,3781355705,3781356091,3781356470,3781356842,3781357207,3781357565,3781357916,3781358260,3781358598,3781358929,3781359254,3781359573,3781359886,3781360193,3781360494,3781360789,3781361079,3781361363,3781361642,3781361915,3781362183,3781362446,3781362704,3781362957,3781363205,3781363449,3781363688,3781363922,3781364152,3781364378,3781364599,3781364816,3781365029,3781365238,3781365443,3781365644,3781365841,3781366034,3781366224,3781366410,3781366593,3781366772,3781366948,3781367120,3781367289,3781367455,3781367618,3781367778,3781367934,3781368088,3781368239,3781368387,3781368532,3781368674,3781368813,3781368950,3781369084,3781369216,3781369345,3781369472,3781369596,3781369718,3781369838,3781369955,3781370070,3781370183,3781370294,3781370403,3781370509,3781370613,3781370715,3781370815,3781370914,3781371011,3781371106,3781371199,3781371290,3781371380,3781371468,3781371554,3781371638,3781371721,3781371802,3781371882,3781371960,3781372037,3781372112,3781372186,3781372258,3781372329,3781372399,3781372467,3781372534,3781372600,3781372664,3781372727,3781372789,3781372850,3781372910,3781372969,3781373026,3781373082,3781373137,3781373191,3781373244,3781373296,3781373347,3781373397,3781373446,3781373494,3781373541,3781373587,3781373632,3781373677,3781373721,3781373764,3781373806,3781373847,3781373887,3781373927,3781373966,3781374004,3781374041,3781374078,3781374114,3781374149,3781374184,3781374218,3781374251,3781374284,3781374316,3781374347,3781374378,3781374408,3781374438,3781374467,3781374496,3781374524,3781374551,3781374578,3781374604,3781374630,3781374655,3781374680,3781374704,3781374728,3781374751,3781374774,3781374797,3781374819,3781374841,3781374862,3781374883,3781374903,3781374923,3781374943,3781374962,3781374981,3781375000,3781375018,3781375036,3781375053,3781375070,3781375087,3781375103,3781375119,3781375135,3781375151,3781375166,3781375181,3781375196,3781375210,3781375224,3781375238,3781375252,3781375265,3781375278,3781375291,3781375303,3781375315,3781375327,3781375339,3781375351,3781375362,3781375373,3781375384,3781375395,3781375405,3781375415,3781375425,3781375435,3781375445,3781375454,3781375463,3781375472,3781375481,3781375490,3781375499,3781375507,3781375515,3781375523,3781375531,3781375539,3781375547,3781375554,3781375561,3781375568,3781375575,3781375582,3781375589,3781375596,3781375602,3781375608,3781375614,3781375620,3781375626,3781375632,3781375638,3781375644,3781375649,3781375654,3781375659,3781375664
+//Job - Star Gladiator
+50,4047:4048,1,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,27434,54868,70216,77154,84412,105416,133942,165376,179088,193338,235642,289842,348402,373354,399168,477234,572732,674294,716870,760752,895370,1053978,1220492,1409379,1623055,1864120,2135364,2439771,2780523,3161005,3584806,4055720,4577747,5155093,5792168,6493582,7264141,8108843,9032871,10041585,11140513,12335340,13631900,15036161,16554212,18192249,19956561,21853511,23889523,26071060,28404610,30896665,33553702,36382164,39388442,42578852,45959619,49536854,53316538,57304499,61506398,65927706,70573691,75449398,80559633,85908949,91501631,97341682,103432811,109778421,116381598,123245103,130371364,137762466,145420147,153345795,161540442,170004760,178739065,187743310,197017092,206559651,216369871,226446289,236787095,247390140,258252944,269372701,280746288,292370275,304240934,316354248,328705924,341291403,354105871,367144273,380401324,393871522,407549162,421428347,435503003,449766891,464213622,478836669,493629380,508584993,523696648,538957399,554360228,569898056,585563758,601350173,617250114,633256384,649361782,665559118,681841219,698200942,714631183,731124884,747675046,764274732,780917079,797595303,814302708,831032690,847778745,864534475,881293592,898049925,914797422,931530156,948242328,964928270,981582450,998199473,1014774083,1031301167,1047775755,1064193021,1080548287,1096837020,1113054835,1129197495,1145260911,1161241141,1177134391,1192937013,1208645505,1224256509,1239766811,1255173340,1270473164,1285663492,1300741669,1315705176,1330551627,1345278767,1359884471,1374366739,1388723697,1402953592,1417054791,1431025777,1444865147,1458571611,1472143986,1485581197,1498882271,1512046336,1525072618,1537960438,1550709209,1563318435,1575787706,1588116696,1600305161,1612352936,1624259931,1636026131,1647651590,1659136432,1670480845,1681685082,1692749457,1703674340,1714460159,1725107395,1735616581,1745988298,1756223174,1766321883,1776285140,1786113701,1795808361,1805369951,1814799337,1824097418,1833265123,1842303411,1851213268,1859995707,1868651764,1877182497,1885588987,1893872333,1902033652,1910074079,1917994763,1925796869,1933481573,1941050064,1948503540,1955843209,1963070288,1970186001,1977191577,1984088252,1990877264,1997559857,2004137276,2010610768,2016981581,2023250963,2029420161,2035490422,2041462991,2047339109,2053120015,2058806945,2064401129,2069903793,2075316158,2080639439,2085874846,2091023580,2096086837,2101065805,2105961665,2110775588,2115508739,2120162273,2124737336,2129235066,2133656590,2138003026,2142275483,2146475060,2150602844,2154659913,2158647334,2162566165,2166417450,2170202225,2173921514,2177576330,2181167675,2184696540,2188163904,2191570735,2194917991,2198206616,2201437545,2204611701,2207729995,2210793327,2213802586,2216758649,2219662382,2222514640,2225316266,2228068093,2230770942,2233425623,2236032934,2238593664,2241108590,2243578477,2246004081,2248386147,2250725409,2253022589,2255278401,2257493547,2259668720,2261804601,2263901862,2265961164,2267983160,2269968491,2271917789,2273831677,2275710768,2277555665,2279366962,2281145244,2282891087,2284605057,2286287712,2287939601,2289561264,2291153232,2292716028,2294250167,2295756155,2297234490,2298685661,2300110151,2301508433,2302880974,2304228232,2305550658,2306848695,2308122780,2309373341,2310600799,2311805570,2312988060,2314148671,2315287796,2316405822,2317503130,2318580095,2319637084,2320674458,2321692573,2322691778,2323672416,2324634824,2325579333,2326506269,2327415953,2328308698,2329184814,2330044604,2330888366,2331716394,2332528975,2333326392,2334108923,2334876841,2335630414,2336369905,2337095574,2337807674,2338506455,2339192162,2339865036,2340525313,2341173226,2341809003,2342432868,2343045041,2343645738,2344235172,2344813550,2345381078,2345937956,2346484382,2347020550,2347546649,2348062867,2348569387,2349066390,2349554052,2350032547,2350502045,2350962713,2351414717,2351858217,2352293372,2352720337,2353139265,2353550306,2353953607,2354349312,2354737563,2355118500,2355492259,2355858974,2356218777,2356571797,2356918161,2357257994,2357591417,2357918551,2358239514,2358554421,2358863386,2359166519,2359463931,2359755728,2360042016,2360322899,2360598477,2360868851,2361134118,2361394373,2361649711,2361900225,2362146005,2362387140,2362623717,2362855822,2363083539,2363306951,2363526139,2363741182,2363952158,2364159144,2364362215,2364561444,2364756904,2364948666,2365136800,2365321374,2365502455,2365680109,2365854400,2366025392,2366193147,2366357727,2366519191,2366677598,2366833005,2366985469,2367135046,2367281790,2367425755,2367566993,2367705556,2367841494,2367974857,2368105693,2368234050,2368359975,2368483514,2368604712,2368723613,2368840261,2368954698,2369066966,2369177106,2369285159,2369391164,2369495159,2369597183,2369697272,2369795464,2369891794,2369986298,2370079010,2370169964,2370259193,2370346730,2370432607,2370516855,2370599505,2370680588,2370760133,2370838169,2370914725,2370989829,2371063508,2371135789,2371206699,2371276264,2371344509,2371411459,2371477139,2371541573,2371604784,2371666796,2371727631,2371787312,2371845861,2371903299,2371959647,2372014925,2372069154,2372122354,2372174544,2372225744,2372275972,2372325247,2372373587,2372421009,2372467531,2372513170,2372557943,2372601866,2372644955,2372687226,2372728695,2372769376,2372809285,2372848437,2372886845,2372924524,2372961488,2372997750,2373033324,2373068222,2373102458,2373136044,2373168992,2373201314,2373233023,2373264130,2373294646,2373324582,2373353950,2373382760,2373411023,2373438750,2373465950,2373492634,2373518811,2373544491,2373569683,2373594397,2373618641,2373642425,2373665757,2373688646,2373711101,2373733129,2373754739,2373775938,2373796735,2373817137,2373837151,2373856785,2373876046,2373894941,2373913478,2373931663,2373949502,2373967002,2373984170,2374001012,2374017534,2374033742,2374049642,2374065240,2374080542,2374095553,2374110279,2374124726,2374138898,2374152801,2374166440,2374179820,2374192946,2374205822,2374218454,2374230846,2374243002,2374254927,2374266626,2374278103,2374289362,2374300407,2374311242,2374321871,2374332298,2374342527,2374352562,2374362406,2374372063,2374381537,2374390831,2374399948,2374408892,2374417666,2374426273,2374434717,2374443000,2374451126,2374459098,2374466918,2374474590,2374482116,2374489499,2374496742,2374503847,2374510817,2374517655,2374524363,2374530943,2374537398,2374543731,2374549943,2374556037,2374562016,2374567881,2374573635,2374579279,2374584816,2374590248,2374595577,2374600804,2374605932,2374610963,2374615898,2374620739,2374625488,2374630147,2374634718,2374639202,2374643600,2374647915,2374652148,2374656301,2374660375,2374664371,2374668291,2374672137,2374675910,2374679611,2374683242,2374686804,2374690298,2374693726,2374697089,2374700388,2374703624,2374706798,2374709912,2374712967,2374715964,2374718904,2374721788,2374724617,2374727393,2374730116,2374732787,2374735407,2374737978,2374740500,2374742974,2374745401,2374747782,2374750117,2374752408,2374754655,2374756860,2374759023,2374761145,2374763226,2374765268,2374767271,2374769236,2374771164,2374773055,2374774910,2374776730,2374778515,2374780266,2374781984,2374783669,2374785322,2374786944,2374788535,2374790096,2374791627,2374793129,2374794603,2374796049,2374797467,2374798858,2374800223,2374801562,2374802875,2374804163,2374805427,2374806667,2374807883,2374809076,2374810246,2374811394,2374812520,2374813625,2374814709,2374815772,2374816815,2374817838,2374818842,2374819827,2374820793,2374821741,2374822671,2374823583,2374824478,2374825356,2374826217,2374827062,2374827891,2374828704,2374829501,2374830283,2374831050,2374831803,2374832541,2374833265,2374833976,2374834673,2374835357,2374836028,2374836686,2374837332,2374837965,2374838586,2374839195,2374839793,2374840379,2374840954,2374841518,2374842072,2374842615,2374843148,2374843671,2374844184,2374844687,2374845180,2374845664,2374846139,2374846605,2374847062,2374847510,2374847950,2374848381,2374848804,2374849219,2374849626,2374850025,2374850417,2374850801,2374851178,2374851548,2374851911,2374852267,2374852616,2374852959,2374853295,2374853625,2374853948,2374854265,2374854576,2374854881,2374855180,2374855474,2374855762,2374856045,2374856322,2374856594,2374856861,2374857123,2374857380,2374857632,2374857879,2374858121,2374858359,2374858592,2374858821,2374859045,2374859265,2374859481,2374859693,2374859901,2374860105,2374860305,2374860501,2374860693,2374860882,2374861067,2374861249,2374861427,2374861602,2374861773,2374861941,2374862106,2374862268,2374862427,2374862583,2374862736,2374862886,2374863033,2374863177,2374863318,2374863457,2374863593,2374863727,2374863858,2374863986,2374864112,2374864236,2374864357,2374864476,2374864593,2374864707,2374864819,2374864929,2374865037,2374865143,2374865247,2374865349,2374865449,2374865547,2374865643,2374865737,2374865830,2374865921,2374866010,2374866097,2374866183,2374866267,2374866349,2374866430,2374866509,2374866587,2374866663,2374866738,2374866811,2374866883,2374866954,2374867023,2374867091,2374867158,2374867223,2374867287,2374867350,2374867412,2374867473,2374867532,2374867590,2374867647,2374867703,2374867758,2374867812,2374867865,2374867917,2374867968,2374868018,2374868067,2374868115,2374868162,2374868208,2374868253,2374868297,2374868341,2374868384,2374868426,2374868467,2374868507,2374868547,2374868586,2374868624,2374868661,2374868698,2374868734,2374868769,2374868803,2374868837,2374868870,2374868903,2374868935,2374868966,2374868997,2374869027,2374869057,2374869086,2374869114,2374869142,2374869169,2374869196,2374869222,2374869248,2374869273,2374869298,2374869322,2374869346,2374869369,2374869392,2374869414,2374869436,2374869458,2374869479,2374869500,2374869520,2374869540,2374869560,2374869579,2374869598,2374869616,2374869634,2374869652,2374869669,2374869686,2374869703,2374869719,2374869735,2374869751,2374869766,2374869781,2374869796,2374869811,2374869825,2374869839,2374869853,2374869866,2374869879,2374869892,2374869905,2374869917,2374869929,2374869941,2374869953,2374869964,2374869975,2374869986,2374869997,2374870008,2374870018,2374870028,2374870038,2374870048,2374870058,2374870067,2374870076,2374870085,2374870094,2374870103,2374870111,2374870119,2374870127,2374870135,2374870143,2374870151,2374870158,2374870165,2374870172,2374870179,2374870186,2374870193,2374870200,2374870206,2374870212,2374870218,2374870224,2374870230,2374870236,2374870242,2374870248,2374870253,2374870258,2374870263,2374870268,2374870273,2374870278,2374870283,2374870288,2374870293,2374870298,2374870302,2374870306,2374870310,2374870314,2374870318,2374870322,2374870326,2374870330,2374870334,2374870338,2374870342,2374870346,2374870349,2374870352,2374870355,2374870358,2374870361,2374870364,2374870367
+//Job - Baby Novice
+10,4023,1,10,18,28,40,91,151,205,268,340,0
+//Job - 1st Baby Classes
+50,4024:4025:4026:4027:4028:4029,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
+//Job - 2nd Baby Classes
+50,4030:4031:4032:4033:4034:4035:4036:4037:4038:4039:4040:4041:4042:4043:4044,1,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,704689,811527,932059,1067681,1219884,1390260,1580501,1792401,2027857,2288870,2577542,2896079,3246785,3632064,4054414,4516427,5020783,5570245,6167657,6815936,7518065,8277089,9096106,9978260,10926733,11944736,13035502,14202274,15448298,16776813,18191041,19694176,21289377,22979756,24768369,26658206,28652182,30753126,32963775,35286762,37724609,40279720,42954371,45750705,48670723,51716280,54889077,58190657,61622401,65185522,68881063,72709894,76672708,80770021,85002169,89369310,93871421,98508300,103279567,108184665,113222861,118393251,123694760,129126148,134686012,140372791,146184770,152120084,158176725,164352547,170645270,177052488,183571672,190200181,196935263,203774065,210713640,217750950,224882876,232106223,239417728,246814065,254291853,261847661,269478017,277179412,284948306,292781137,300674324,308624274,316627388,324680066,332778713,340919742,349099582,357314681,365561510,373836570,382136392,390457544,398796635,407150316,415515285,423888291,432266134,440645671,449023816,457397543,465763888,474119952,482462902,490789971,499098461,507385745,515649266,523886539,532095151,540272763,548417108,556525995,564597304,572628991,580619086,588565690,596466980,604321205,612126687,619881818,627585062,635234954,642830098,650369167,657850901,665274107,672637658,679940491,687181606,694360067,701474996,708525577,715511052,722430719,729283933,736070103,742788691,749439211,756021226,762534350,768978243,775352612,781657209,787891828,794056307,800150524,806174396,812127878,818010962,823823676,829566082,835238274,840840378,846372551,851834978,857227874,862551478,867806057,872991902,878109327,883158668,888140283,893054550,897901867,902682649,907397329,912046357,916630197,921149329,925604246,929995454,934323471,938588826,942792060,946933722,951014371,955034574,958994906,962895949,966738291,970522526,974249254,977919079,981532609,985090456,988593235,992041563,995436060,998777348,1002066049,1005302786,1008488184,1011622866,1014707457,1017742580,1020728856,1023666907,1026557352,1029400809,1032197893,1034949218,1037655393,1040317027,1042934723,1045509083,1048040705,1050530182,1052978105,1055385060,1057751629,1060078390,1062365915,1064614774,1066825530,1068998742,1071134965,1073234748,1075298634,1077327163,1079320868,1081280278,1083205916,1085098299,1086957939,1088785342,1090581010,1092345438,1094079115,1095782526,1097456149,1099100457,1100715917,1102302990,1103862133,1105393795,1106898420,1108376447,1109828309,1111254434,1112655243,1114031153,1115382574,1116709911,1118013563,1119293924,1120551383,1121786323,1122999122,1124190152,1125359779,1126508366,1127636269,1128743839,1129831422,1130899359,1131947986,1132977634,1133988629,1134981292,1135955938,1136912879,1137852422,1138774868,1139680514,1140569653,1141442572,1142299555,1143140880,1143966822,1144777651,1145573633,1146355029,1147122096,1147875088,1148614253,1149339836,1150052079,1150751218,1151437486,1152111113,1152772324,1153421341,1154058381,1154683659,1155297386,1155899769,1156491012,1157071316,1157640877,1158199889,1158748542,1159287023,1159815516,1160334201,1160843257,1161342858,1161833175,1162314377,1162786630,1163250097,1163704937,1164151308,1164589365,1165019259,1165441139,1165855152,1166261441,1166660148,1167051412,1167435370,1167812155,1168181900,1168544733,1168900782,1169250171,1169593023,1169929459,1170259597,1170583552,1170901439,1171213370,1171519455,1171819803,1172114519,1172403707,1172687470,1172965908,1173239120,1173507203,1173770252,1174028360,1174281619,1174530119,1174773949,1175013195,1175247943,1175478276,1175704277,1175926026,1176143603,1176357085,1176566548,1176772068,1176973718,1177171570,1177365695,1177556163,1177743042,1177926399,1178106300,1178282809,1178455990,1178625906,1178792617,1178956183,1179116664,1179274117,1179428599,1179580165,1179728870,1179874768,1180017912,1180158353,1180296142,1180431328,1180563961,1180694088,1180821757,1180947013,1181069902,1181190469,1181308757,1181424809,1181538667,1181650373,1181759966,1181867487,1181972975,1182076467,1182178002,1182277616,1182375346,1182471227,1182565293,1182657579,1182748119,1182836945,1182924090,1183009586,1183093463,1183175752,1183256483,1183335686,1183413389,1183489621,1183564409,1183637781,1183709763,1183780382,1183849663,1183917632,1183984313,1184049731,1184113909,1184176871,1184238640,1184299239,1184358689,1184417013,1184474231,1184530365,1184585435,1184639461,1184692463,1184744460,1184795471,1184845515,1184894611,1184942776,1184990027,1185036382,1185081858,1185126472,1185170240,1185213178,1185255302,1185296627,1185337168,1185376940,1185415958,1185454236,1185491788,1185528627,1185564767,1185600222,1185635004,1185669126,1185702601,1185735441,1185767658,1185799263,1185830269,1185860686,1185890526,1185919800,1185948518,1185976691,1186004330,1186031444,1186058044,1186084139,1186109739,1186134853,1186159490,1186183659,1186207370,1186230631,1186253450,1186275836,1186297797,1186319341,1186340476,1186361210,1186381550,1186401504,1186421079,1186440283,1186459122,1186477604,1186495735,1186513521,1186530970,1186548087,1186564879,1186581353,1186597514,1186613368,1186628921,1186644179,1186659147,1186673831,1186688236,1186702367,1186716230,1186729830,1186743172,1186756260,1186769100,1186781696,1186794053,1186806175,1186818067,1186829733,1186841177,1186852404,1186863418,1186874223,1186884822,1186895220,1186905421,1186915428,1186925245,1186934875,1186944322,1186953590,1186962682,1186971601,1186980351,1186988935,1186997356,1187005617,1187013721,1187021671,1187029470,1187037121,1187044626,1187051989,1187059212,1187066298,1187073249,1187080068,1187086758,1187093321,1187099759,1187106075,1187112271,1187118349,1187124311,1187130160,1187135898,1187141527,1187147049,1187152466,1187157780,1187162993,1187168107,1187173124,1187178046,1187182874,1187187611,1187192258,1187196816,1187201288,1187205675,1187209978,1187214200,1187218341,1187222404,1187226390,1187230300,1187234136,1187237899,1187241590,1187245211,1187248763,1187252248,1187255667,1187259021,1187262311,1187265538,1187268704,1187271810,1187274857,1187277846,1187280778,1187283655,1187286477,1187289245,1187291961,1187294625,1187297238,1187299802,1187302317,1187304784,1187307204,1187309578,1187311907,1187314192,1187316434,1187318633,1187320790,1187322906,1187324982,1187327019,1187329017,1187330977,1187332900,1187334786,1187336636,1187338451,1187340232,1187341979,1187343693,1187345374,1187347023,1187348641,1187350228,1187351785,1187353312,1187354810,1187356280,1187357722,1187359136,1187360524,1187361885,1187363220,1187364530,1187365815,1187367076,1187368313,1187369526,1187370716,1187371883,1187373028,1187374151,1187375253,1187376334,1187377395,1187378435,1187379456,1187380457,1187381439,1187382403,1187383348,1187384275,1187385185,1187386077,1187386952,1187387811,1187388653,1187389479,1187390290,1187391085,1187391865,1187392630,1187393381,1187394118,1187394841,1187395550,1187396245,1187396927,1187397596,1187398252,1187398896,1187399528,1187400148,1187400756,1187401352,1187401937,1187402511,1187403074,1187403626,1187404168,1187404699,1187405220,1187405731,1187406233,1187406725,1187407208,1187407682,1187408147,1187408603,1187409050,1187409489,1187409919,1187410341,1187410755,1187411161,1187411559,1187411950,1187412333,1187412709,1187413078,1187413440,1187413795,1187414143,1187414485,1187414820,1187415149,1187415472,1187415788,1187416098,1187416402,1187416701,1187416994,1187417281,1187417563,1187417840,1187418111,1187418377,1187418638,1187418894,1187419145,1187419391,1187419633,1187419870,1187420103,1187420331,1187420555,1187420775,1187420990,1187421201,1187421408,1187421611,1187421810,1187422006,1187422198,1187422386,1187422571,1187422752,1187422930,1187423104,1187423275,1187423443,1187423608,1187423769,1187423927,1187424082,1187424234,1187424383,1187424530,1187424674,1187424815,1187424953,1187425089,1187425222,1187425353,1187425481,1187425607,1187425730,1187425851,1187425970,1187426086,1187426200,1187426312,1187426422,1187426530,1187426636,1187426740,1187426842,1187426942,1187427040,1187427136,1187427230,1187427322,1187427413,1187427502,1187427589,1187427674,1187427758,1187427840,1187427921,1187428000,1187428078,1187428154,1187428229,1187428302,1187428374,1187428444,1187428513,1187428581,1187428648,1187428713,1187428777,1187428840,1187428902,1187428962,1187429021,1187429079,1187429136,1187429192,1187429247,1187429301,1187429354,1187429406,1187429457,1187429507,1187429556,1187429604,1187429651,1187429697,1187429742,1187429786,1187429829,1187429872,1187429914,1187429955,1187429995,1187430034,1187430073,1187430111,1187430148,1187430184,1187430220,1187430255,1187430289,1187430323,1187430356,1187430388,1187430420,1187430451,1187430482,1187430512,1187430541,1187430570,1187430598,1187430626,1187430653,1187430680,1187430706,1187430732,1187430757,1187430782,1187430806,1187430830,1187430853,1187430876,1187430898,1187430920,1187430942,1187430963,1187430984,1187431004,1187431024,1187431044,1187431063,1187431082,1187431100,1187431118,1187431136,1187431153,1187431170,1187431187,1187431203,1187431219,1187431235,1187431250,1187431265,1187431280,1187431295,1187431309,1187431323,1187431337,1187431350,1187431363,1187431376,1187431389,1187431401,1187431413,1187431425,1187431437,1187431448,1187431459,1187431470,1187431481,1187431492,1187431502,1187431512,1187431522,1187431532,1187431542,1187431551,1187431560,1187431569,1187431578,1187431587,1187431595,1187431603,1187431611,1187431619,1187431627,1187431635,1187431642,1187431649,1187431656,1187431663,1187431670,1187431677,1187431684,1187431690,1187431696,1187431702,1187431708,1187431714,1187431720,1187431726,1187431732,1187431737,1187431742,1187431747,1187431752,1187431757,1187431762,1187431767,1187431772,1187431777,1187431782,1187431786,1187431790,1187431794,1187431798,1187431802,1187431806,1187431810,1187431814,1187431818,1187431822,1187431826,1187431829,1187431832,1187431835,1187431838,1187431841,1187431844,1187431847,1187431850,1187431853,1187431856,1187431859,1187431862,1187431865,1187431868,1187431871,1187431873,1187431875,1187431877,1187431879,1187431881,1187431883,1187431885,1187431887,1187431889,1187431891,1187431893,1187431895,1187431897,1187431899,1187431901,1187431903,1187431905,1187431907,1187431909,1187431911,1187431913,1187431915,1187431916,1187431917,1187431918,1187431919,1187431920,1187431921,1187431922
+//Job - Super Baby
+99,4045,1,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,328955,377083,431132,491676,559324,634723,718557,811549,914458,1028082,1153255,1290848,1441766,1606949,1787369,1984031,2197968,2430240,2681934,2954159,3248044,3564736,3905397,4271200,4663326,5082962,5531297,6009517,6518804,7060331,7635258,8244729,8889869,9571780,10291536,11050182,11848729,12688151,13569383,14493317,15460800,16472628,17529549,18632256,19781387,20977523,22221186,23512836,24852871,26241627,27679375,29166322,30702608,32288308,33923432,35607923,37341659,39124453,40956055,42836150,44764361,46740250,48763319,50833011,52948714,55109760,57315427,59564942,61857484,64192184,66568128,68984360,71439882,73933660,76464624,79031670,81633664,84269444,86937821,89637583,92367498,95126314,97912764,100725566,103563428,106425047,109309113,112214313,115139328,118082841,121043535,124020096,127011214,130015587,133031921,136058931,139095344,142139901,145191355,148248476,151310051,154374884,157441798,160509638,163577267,166643572,169707462,172767868,175823747,178874080,181917872,184954154,187981983,191000442,194008641,197005716,199990830,202963174,205921964,208866445,211795888,214709591,217606880,220487106,223349647,226193908,229019320,231825340,234611449,237377155,240121991,242845513,245547302,248226962,250884122,253518432,256129566,258717218,261281106,263820967,266336559,268827661,271294071,273735605,276152100,278543408,280909401,283249967,285565011,287854454,290118232,292356296,294568612,296755160,298915934,301050940,303160198,305243739,307301606,309333854,311340547,313321762,315277584,317208107,319113436,320993684,322848972,324679429,326485191,328266402,330023212,331755778,333464263,335148836,336809671,338446947,340060848,341651562,343219283,344764207,346286534,347786469,349264218,350719990,352153998,353566457,354957584,356327598,357676720,359005172,360313177,361600961,362868749,364116768,365345245,366554409,367744487,368915708,370068300,371202492,372318512,373416587,374496946,375559815,376605421,377633989,378645744,379640909,380619707,381582360,382529088,383460111,384375646,385275910,386161118,387031483,387887217,388728531,389555633,390368730,391168027,391953728,392726034,393485145,394231258,394964570,395685274,396393563,397089626,397773652,398445826,399106332,399755353,400393068,401019655,401635289,402240145,402834393,403418204,403991744,404555179,405108673,405652386,406186478,406711105,407226423,407732584,408229739,408718037,409197625,409668648,410131248,410585566,411031741,411469910,411900208,412322767,412737719,413145193,413545315,413938212,414324006,414702820,415074773,415439983,415798566,416150637,416496308,416835690,417168893,417496024,417817188,418132490,418442033,418745917,419044242,419337105,419624602,419906829,420183878,420455840,420722806,420984864,421242102,421494605,421742458,421985743,422224542,422458935,422689001,422914818,423136461,423354006,423567526,423777094,423982781,424184657,424382791,424577250,424768101,424955409,425139238,425319652,425496712,425670480,425841015,426008376,426172621,426333807,426491990,426647225,426799565,426949063,427095772,427239742,427381024,427519667,427655720,427789230,427920243,428048806,428174964,428298761,428420241,428539446,428656418,428771199,428883829,428994348,429102794,429209207,429313623,429416080,429516614,429615261,429712056,429807033,429900226,429991668,430081391,430169428,430255809,430340566,430423729,430505327,430585390,430663946,430741024,430816650,430890852,430963657,431035091,431105179,431173946,431241417,431307617,431372569,431436296,431498821,431560167,431620356,431679410,431737350,431794196,431849969,431904690,431958378,432011052,432062732,432113436,432163182,432211988,432259872,432306852,432352944,432398165,432442532,432486060,432528765,432570663,432611769,432652098,432691664,432730482,432768566,432805929,432842585,432878548,432913831,432948446,432982406,433015723,433048410,433080478,433111939,433142805,433173086,433202794,433231939,433260533,433288585,433316106,433343106,433369594,433395581,433421075,433446086,433470624,433494697,433518314,433541483,433564213,433586512,433608389,433629851,433650906,433671562,433691827,433711708,433731212,433750346,433769117,433787533,433805599,433823323,433840711,433857769,433874504,433890921,433907027,433922828,433938329,433953536,433968454,433983089,433997447,434011533,434025351,434038907,434052206,434065253,434078052,434090608,434102926,434115010,434126865,434138495,434149905,434161098,434172079,434182851,434193419,434203786,434213957,434223935,434233723,434243325,434252745,434261986,434271052,434279946,434288671,434297230,434305627,434313865,434321946,434329874,434337651,434345281,434352766,434360109,434367312,434374379,434381311,434388112,434394784,434401329,434407750,434414049,434420228,434426290,434432237,434438071,434443794,434449408,434454916,434460319,434465620,434470820,434475921,434480925,434485834,434490650,434495375,434500010,434504557,434509017,434513393,434517686,434521897,434526028,434530081,434534057,434537957,434541783,434545536,434549218,434552830,434556374,434559850,434563260,434566605,434569887,434573107,434576265,434579363,434582403,434585385,434588310,434591180,434593995,434596757,434599466,434602124,434604731,434607289,434609798,434612259,434614674,434617043,434619367,434621647,434623883,434626077,434628229,434630340,434632411,434634443,434636436,434638391,434640309,434642191,434644037,434645848,434647624,434649367,434651077,434652754,434654399,434656013,434657596,434659149,434660673,434662168,434663634,434665072,434666483,434667867,434669225,434670557,434671864,434673146,434674404,434675638,434676848,434678035,434679200,434680343,434681464,434682564,434683643,434684701,434685739,434686757,434687756,434688736,434689697,434690640,434691565,434692473,434693363,434694236,434695093,434695934,434696759,434697568,434698362,434699140,434699904,434700653,434701388,434702109,434702816,434703510,434704191,434704859,434705514,434706156,434706786,434707404,434708011,434708606,434709190,434709763,434710325,434710876,434711417,434711947,434712467,434712977,434713478,434713969,434714451,434714924,434715388,434715843,434716289,434716727,434717156,434717577,434717990,434718395,434718793,434719183,434719566,434719941,434720309,434720670,434721024,434721372,434721713,434722047,434722375,434722697,434723013,434723323,434723627,434723925,434724217,434724504,434724785,434725061,434725332,434725598,434725859,434726115,434726366,434726612,434726853,434727090,434727322,434727550,434727773,434727992,434728207,434728418,434728625,434728828,434729027,434729222,434729414,434729602,434729786,434729967,434730144,434730318,434730489,434730656,434730820,434730981,434731139,434731294,434731446,434731595,434731741,434731885,434732026,434732164,434732299,434732432,434732562,434732690,434732815,434732938,434733059,434733177,434733293,434733407,434733519,434733629,434733737,434733842,434733945,434734046,434734146,434734244,434734340,434734434,434734526,434734616,434734705,434734792,434734877,434734961,434735043,434735123,434735202,434735279,434735355,434735430,434735503,434735575,434735645,434735714,434735782,434735848,434735913,434735977,434736040,434736101,434736161,434736220,434736278,434736335,434736391,434736446,434736500,434736553,434736605,434736656,434736706,434736755,434736803,434736850,434736896,434736941,434736985,434737028,434737071,434737113,434737154,434737194,434737233,434737272,434737310,434737347,434737383,434737419,434737454,434737488,434737522,434737555,434737587,434737619,434737650,434737681,434737711,434737740,434737769,434737797,434737825,434737852,434737879,434737905,434737931,434737956,434737981,434738005,434738029,434738052,434738075,434738097,434738119,434738140,434738161,434738182,434738202,434738222,434738241,434738260,434738279,434738297,434738315,434738333,434738350,434738367,434738384,434738400,434738416,434738432,434738447,434738462,434738477,434738491,434738505,434738519,434738533,434738546,434738559,434738572,434738585,434738597,434738609,434738621,434738633,434738644,434738655,434738666,434738677,434738688,434738698,434738708,434738718,434738728,434738738,434738747,434738756,434738765,434738774,434738783,434738791,434738799,434738807,434738815,434738823,434738831,434738838,434738845,434738852,434738859,434738866,434738873,434738880,434738886,434738892,434738898,434738904,434738910,434738916,434738922,434738928,434738933,434738938,434738943,434738948,434738953,434738958,434738963,434738968,434738973,434738978,434738982,434738986,434738990,434738994,434738998,434739002,434739006,434739010,434739014,434739018,434739022,434739025,434739028,434739031,434739034,434739037,434739040,434739043,434739046,434739049,434739052,434739055,434739058,434739061,434739064,434739067,434739069,434739071,434739073,434739075,434739077,434739079,434739081,434739083,434739085,434739087,434739089,434739091,434739093,434739095,434739097,434739099,434739101,434739103,434739105,434739107,434739109,434739110,434739111,434739112,434739113,434739114,434739115,434739116,434739117,434739118,434739119,434739120,434739121,434739122,434739123,434739124,434739125,434739126,434739127,434739128,434739129,434739130,434739131,434739132,434739133,434739134,434739135,434739136,434739137,434739138,434739139,434739140,434739141,434739142,434739143,434739144,434739145,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146,434739146
diff --git a/db/exp_guild.txt b/db/exp_guild.txt
index 56d7cf544..acb370246 100644
--- a/db/exp_guild.txt
+++ b/db/exp_guild.txt
@@ -1,50 +1,50 @@
-// Guild LvUp experience value table
-2000000
-4000000
-8000000
-14000000
-22000000
-32000000
-44000000
-58000000
-74000000
-92000000
-112000000
-134000000
-158000000
-184000000
-212000000
-242000000
-274000000
-308000000
-344000000
-382000000
-422000000
-464000000
-508000000
-554000000
-602000000
-652000000
-704000000
-758000000
-814000000
-872000000
-932000000
-994000000
-1058000000
-1124000000
-1192000000
-1262000000
-1334000000
-1408000000
-1484000000
-1562000000
-1642000000
-1724000000
-1808000000
-1894000000
-1999999999
-1999999999
-1999999999
-1999999999
-1999999999
+// Guild LvUp experience value table
+2000000
+4000000
+8000000
+14000000
+22000000
+32000000
+44000000
+58000000
+74000000
+92000000
+112000000
+134000000
+158000000
+184000000
+212000000
+242000000
+274000000
+308000000
+344000000
+382000000
+422000000
+464000000
+508000000
+554000000
+602000000
+652000000
+704000000
+758000000
+814000000
+872000000
+932000000
+994000000
+1058000000
+1124000000
+1192000000
+1262000000
+1334000000
+1408000000
+1484000000
+1562000000
+1642000000
+1724000000
+1808000000
+1894000000
+1999999999
+1999999999
+1999999999
+1999999999
+1999999999
diff --git a/db/exp_homun.txt b/db/exp_homun.txt
index b78123903..9b48412dd 100644
--- a/db/exp_homun.txt
+++ b/db/exp_homun.txt
@@ -1,100 +1,100 @@
-//Homunculus LvUp experience value table
-50
-110
-180
-260
-350
-630
-950
-1310
-1710
-2150
-3180
-4300
-5510
-6810
-8200
-10800
-13560
-16480
-19560
-22800
-28090
-33630
-39420
-45460
-51750
-61500
-70910
-81030
-91510
-102350
-117580
-133300
-149510
-166210
-183400
-206480
-230200
-254560
-279560
-305200
-338450
-372510
-407380
-443060
-479550
-525590
-572630
-620670
-669710
-719750
-781500
-844460
-908630
-974010
-1040600
-1121280
-1203400
-1286960
-1371960
-1458400
-1561530
-1666350
-1772860
-1881060
-1990950
-2120350
-2251710
-2385030
-2520310
-2657550
-2817340
-2979380
-3143670
-3310210
-3479000
-3673600
-3870760
-4070480
-4272760
-4477600
-4711730
-4948750
-5188660
-5431460
-5677150
-5955830
-6237750
-6522910
-6811310
-7102950
-7431500
-7763660
-8099430
-8438810
-8781800
-9165840
-9553880
-9945920
-0
+//Homunculus LvUp experience value table
+50
+110
+180
+260
+350
+630
+950
+1310
+1710
+2150
+3180
+4300
+5510
+6810
+8200
+10800
+13560
+16480
+19560
+22800
+28090
+33630
+39420
+45460
+51750
+61500
+70910
+81030
+91510
+102350
+117580
+133300
+149510
+166210
+183400
+206480
+230200
+254560
+279560
+305200
+338450
+372510
+407380
+443060
+479550
+525590
+572630
+620670
+669710
+719750
+781500
+844460
+908630
+974010
+1040600
+1121280
+1203400
+1286960
+1371960
+1458400
+1561530
+1666350
+1772860
+1881060
+1990950
+2120350
+2251710
+2385030
+2520310
+2657550
+2817340
+2979380
+3143670
+3310210
+3479000
+3673600
+3870760
+4070480
+4272760
+4477600
+4711730
+4948750
+5188660
+5431460
+5677150
+5955830
+6237750
+6522910
+6811310
+7102950
+7431500
+7763660
+8099430
+8438810
+8781800
+9165840
+9553880
+9945920
+0
diff --git a/db/guild_skill_tree.txt b/db/guild_skill_tree.txt
index 6e2fecc87..2ae734f70 100644
--- a/db/guild_skill_tree.txt
+++ b/db/guild_skill_tree.txt
@@ -1,17 +1,17 @@
-//Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv //GUILD SKILLNAME#Skill Name#
-
-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#
+//Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv //GUILD SKILLNAME#Skill Name#
+
+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
index 54e7c89ca..e606924c0 100644
--- a/db/homun_skill_tree.txt
+++ b/db/homun_skill_tree.txt
@@ -1,73 +1,73 @@
-//CLass,Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name#
-//Lif
-6001,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
-6001,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
-6001,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
-//Amistr
-6002,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
-6002,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
-6002,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
-//Filir
-6003,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
-6003,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
-6003,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
-//Vanilmirth
-6004,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
-6004,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
-6004,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
-//Lif2
-6005,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
-6005,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
-6005,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
-//Amistr2
-6006,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
-6006,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
-6006,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
-//Filir2
-6007,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
-6007,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
-6007,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
-//Vanilmirth2
-6008,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
-6008,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
-6008,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
-//Lif_H
-6009,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
-6009,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
-6009,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
-6009,8004,3,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
-//Amistr_H
-6010,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
-6010,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
-6010,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
-6010,8008,3,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
-//Filir_H
-6011,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
-6011,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
-6011,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
-6011,8012,3,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
-//Vanilmirth_H
-6012,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
-6012,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
-6012,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
-6012,8016,3,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
-//Lif2_H
-6013,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
-6013,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
-6013,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
-6013,8004,3,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
-//Amistr2_H
-6014,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
-6014,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
-6014,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
-6014,8008,3,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
-//Filir2_H
-6015,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
-6015,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
-6015,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
-6015,8012,3,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
-//Vanilmirth2_H
-6016,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
-6016,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
-6016,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
-6016,8016,3,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
+//CLass,Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name#
+//Lif
+6001,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
+6001,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
+6001,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
+//Amistr
+6002,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
+6002,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
+6002,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
+//Filir
+6003,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
+6003,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
+6003,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
+//Vanilmirth
+6004,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
+6004,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
+6004,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
+//Lif2
+6005,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
+6005,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
+6005,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
+//Amistr2
+6006,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
+6006,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
+6006,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
+//Filir2
+6007,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
+6007,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
+6007,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
+//Vanilmirth2
+6008,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
+6008,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
+6008,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
+//Lif_H
+6009,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
+6009,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
+6009,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
+6009,8004,3,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
+//Amistr_H
+6010,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
+6010,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
+6010,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
+6010,8008,3,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
+//Filir_H
+6011,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
+6011,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
+6011,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
+6011,8012,3,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
+//Vanilmirth_H
+6012,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
+6012,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
+6012,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
+6012,8016,3,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
+//Lif2_H
+6013,8001,5,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
+6013,8002,5,8001,3,0,0,0,0,0,0,0,0 //HLIF_AVOID
+6013,8003,5,8001,5,0,0,0,0,0,0,0,0 //HLIF_BRAIN
+6013,8004,3,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
+//Amistr2_H
+6014,8005,5,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
+6014,8006,5,8005,5,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
+6014,8007,5,8006,3,0,0,0,0,0,0,0,0 //HAMI_SKIN
+6014,8008,3,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
+//Filir2_H
+6015,8009,5,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
+6015,8010,5,8009,3,0,0,0,0,0,0,0,0 //HFLI_FLEET
+6015,8011,5,8010,3,0,0,0,0,0,0,0,0 //HFLI_SPEED
+6015,8012,3,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
+//Vanilmirth2_H
+6016,8013,5,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE,
+6016,8014,5,8013,3,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
+6016,8015,5,8013,5,0,0,0,0,0,0,0,0 //HVAN_INSTRUCT
+6016,8016,3,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
diff --git a/db/homunculus_db.txt b/db/homunculus_db.txt
index fb9cc7220..c0101ef97 100644
--- a/db/homunculus_db.txt
+++ b/db/homunculus_db.txt
@@ -1,17 +1,17 @@
-//class,name,baseHP,baseSP,baseSTR,baseAGI,baseVIT,baseINT,baseDEX,baseLUK,baseIntimacy,baseHungry,hungryDelay,foodID,gminHP,gmaxHP,gminSP,gmaxSP,gminSTR,gmaxSTR,gminAGI,gmaxAGI,gminVIT,gmaxVIT,gminINT,gmaxINT,gminDEX,gmaxDEX,gminLUK,gmaxLUK,evol_class,baseASPD,size,race,element,accessID
-6001,Lif,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,6009,700,0,0,0,0
-6002,Amistr,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,6010,700,0,0,0,0
-6003,Filir,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,6011,700,0,0,0,0
-6004,Vanilmirth,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,6012,700,0,0,0,0
-6005,Lif2,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,6013,700,0,0,0,0
-6006,Amistr2,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,6014,700,0,0,0,0
-6007,Filir2,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,6015,700,0,0,0,0
-6008,Vanilmirth2,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,6016,700,0,0,0,0
-6009,Lif_H,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,0,700,1,0,0,0
-6010,Amistr_H,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,0,700,1,0,0,0
-6011,Filir_H,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,0,700,1,0,0,0
-6012,Vanilmirth_H,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,0,700,1,0,0,0
-6013,Lif2_H,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,0,700,1,0,0,0
-6014,Amistr2_H,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,0,700,1,0,0,0
-6015,Filir2_H,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,0,700,1,0,0,0
+//class,name,baseHP,baseSP,baseSTR,baseAGI,baseVIT,baseINT,baseDEX,baseLUK,baseIntimacy,baseHungry,hungryDelay,foodID,gminHP,gmaxHP,gminSP,gmaxSP,gminSTR,gmaxSTR,gminAGI,gmaxAGI,gminVIT,gmaxVIT,gminINT,gmaxINT,gminDEX,gmaxDEX,gminLUK,gmaxLUK,evol_class,baseASPD,size,race,element,accessID
+6001,Lif,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,6009,700,0,0,0,0
+6002,Amistr,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,6010,700,0,0,0,0
+6003,Filir,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,6011,700,0,0,0,0
+6004,Vanilmirth,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,6012,700,0,0,0,0
+6005,Lif2,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,6013,700,0,0,0,0
+6006,Amistr2,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,6014,700,0,0,0,0
+6007,Filir2,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,6015,700,0,0,0,0
+6008,Vanilmirth2,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,6016,700,0,0,0,0
+6009,Lif_H,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,0,700,1,0,0,0
+6010,Amistr_H,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,0,700,1,0,0,0
+6011,Filir_H,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,0,700,1,0,0,0
+6012,Vanilmirth_H,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,0,700,1,0,0,0
+6013,Lif2_H,150,40,17,20,15,35,24,12,21,32,60000,537,60,100,4,9,5,19,5,19,5,19,4,20,6,20,6,20,0,700,1,0,0,0
+6014,Amistr2_H,320,10,20,17,35,11,24,12,21,32,60000,912,80,130,1,4,8,20,4,20,4,20,1,10,3,19,3,19,0,700,1,0,0,0
+6015,Filir2_H,90,25,29,35,9,8,30,9,21,32,60000,910,45,75,3,6,4,20,8,20,1,10,3,19,4,20,3,19,0,700,1,0,0,0
6016,Vanilmirth2_H,80,11,11,11,11,11,11,11,21,32,60000,911,30,150,0,7,1,30,1,30,1,30,1,30,1,30,1,30,0,700,1,0,0,0 \ No newline at end of file
diff --git a/db/item_avail.txt b/db/item_avail.txt
index 1a1420915..2cb547098 100644
--- a/db/item_avail.txt
+++ b/db/item_avail.txt
@@ -1,12 +1,12 @@
-// item id,sprite id
-// Replaces an item client-side while keeping them separate server-side.
-// Think of it as a way to disguise items.
-// If 0 is used then item will be disabled.
-2240,2241 //Beard - Grampa Beard
-
-//Treasure Hunters Quest Items
-//use these aliases if your game client doesn't support them normally
-//7950,7021
-//7951,7042
-//1998,1250
-//1999,1472
+// item id,sprite id
+// Replaces an item client-side while keeping them separate server-side.
+// Think of it as a way to disguise items.
+// If 0 is used then item will be disabled.
+2240,2241 //Beard - Grampa Beard
+
+//Treasure Hunters Quest Items
+//use these aliases if your game client doesn't support them normally
+//7950,7021
+//7951,7042
+//1998,1250
+//1999,1472
diff --git a/db/item_bluebox.txt b/db/item_bluebox.txt
index 0c76e931f..5a3a2a820 100644
--- a/db/item_bluebox.txt
+++ b/db/item_bluebox.txt
@@ -1,7329 +1,7329 @@
-// Old Blue Box Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-1,2101,1 //Guard
-1,2102,1 //Guard
-1,2103,1 //Buckler
-1,2104,1 //Buckler
-1,2105,1 //Shield
-1,2106,1 //Shield
-1,2107,1 //Mirror Shield
-1,2108,1 //Mirror Shield
-1,2109,1 //Memory Book
-1,2112,1 //Novice Guard
-1,2301,1 //Cotton Shirt
-1,2302,1 //Cotton Shirt
-1,2303,1 //Jacket
-1,2304,1 //Jacket
-1,2305,1 //Adventurer's Suit
-1,2306,1 //Adventurer's Suit
-1,2307,1 //Mantle
-1,2308,1 //Mantle
-1,2309,1 //Coat
-1,2310,1 //Coat
-1,2311,1 //Mink Coat
-1,2312,1 //Padded Armor
-1,2313,1 //Padded Armor
-1,2314,1 //Chain Mail
-1,2315,1 //Chain Mail
-1,2316,1 //Full Plate
-1,2317,1 //Full Plate
-1,2318,1 //Lord's Clothes
-1,2320,1 //Formal Suit
-1,2321,1 //Silk Robe
-1,2322,1 //Silk Robe
-1,2323,1 //Scapulare
-1,2324,1 //Scapulare
-1,2325,1 //Saint's Robe
-1,2326,1 //Saint's Robe
-1,2328,1 //Wooden Mail
-1,2329,1 //Wooden Mail
-1,2330,1 //Tights
-1,2331,1 //Tights
-1,2332,1 //Silver Robe
-1,2333,1 //Silver Robe
-1,2335,1 //Thief Clothes
-1,2336,1 //Thief Clothes
-1,2337,1 //Ninja Suit
-1,2338,1 //Wedding Dress
-1,2339,1 //Pantie
-1,2340,1 //Novice Breastplate
-1,2341,1 //Legion Plate Armor
-1,2352,1 //Tattered Novice Ninja Suit
-1,2401,1 //Sandals
-1,2402,1 //Sandals
-1,2403,1 //Shoes
-1,2404,1 //Shoes
-1,2405,1 //Boots
-1,2406,1 //Boots
-1,2407,1 //Crystal Pumps
-1,2408,1 //Shackles
-1,2409,1 //High Heels
-1,2411,1 //Greaves
-1,2414,1 //Novice Slippers
-1,2501,1 //Hood
-1,2502,1 //Hood
-1,2503,1 //Muffler
-1,2504,1 //Muffler
-1,2505,1 //Manteau
-1,2506,1 //Manteau
-1,2507,1 //Ancient Cape
-1,2508,1 //Ragamuffin Manteau
-1,2510,1 //Somber Novice Hood
-1,2601,1 //Ring
-1,2602,1 //Earring
-1,2603,1 //Necklace
-1,2604,1 //Glove
-1,2605,1 //Brooch
-1,2607,1 //Clip
-1,2608,1 //Rosary
-1,2609,1 //Skull Ring
-1,2610,1 //Gold Ring
-1,2611,1 //Silver Ring
-1,2612,1 //Flower Ring
-1,2613,1 //Diamond Ring
-1,2617,1 //Celebrant's Mitten
-1,2618,1 //Matyr's Leash
-1,2627,1 //Belt
-1,2628,1 //Novice Armlet
-1,1116,1 //Katana
-1,1117,1 //Katana
-1,1151,1 //Slayer
-1,1152,1 //Slayer
-1,1154,1 //Bastard Sword
-1,1155,1 //Bastard Sword
-1,1157,1 //Two-Handed Sword
-1,1158,1 //Two-Handed Sword
-1,1160,1 //Broad Sword
-1,1162,1 //Broad Sword
-1,1163,1 //Claymore
-1,1250,1 //Jur
-1,1251,1 //Jur
-1,1252,1 //Katar
-1,1253,1 //Katar
-1,1254,1 //Jamadhar
-1,1255,1 //Jamadhar
-1,1256,1 //Katar of Frozen Icicle
-1,1257,1 //Katar of Quaking
-1,1258,1 //Katar of Raging Blaze
-1,1259,1 //Katar of Piercing Wind
-1,1351,1 //Battle Axe
-1,1352,1 //Battle Axe
-1,1354,1 //Hammer
-1,1355,1 //Hammer
-1,1357,1 //Buster
-1,1358,1 //Buster
-1,1360,1 //Two-Handed Axe
-1,1361,1 //Two-Handed Axe
-1,1410,1 //Lance
-1,1411,1 //Lance
-1,1451,1 //Guisarme
-1,1452,1 //Guisarme
-1,1454,1 //Glaive
-1,1455,1 //Glaive
-1,1457,1 //Partizan
-1,1458,1 //Partizan
-1,1460,1 //Trident
-1,1461,1 //Trident
-1,1463,1 //Halberd
-1,1464,1 //Halberd
-1,1472,1 //Soul Staff
-1,1701,1 //Bow
-1,1702,1 //Bow
-1,1704,1 //Composite Bow
-1,1705,1 //Composite Bow
-1,1707,1 //Great Bow
-1,1708,1 //Great Bow
-1,1710,1 //Crossbow
-1,1711,1 //Crossbow
-1,1713,1 //Arbalest
-1,1714,1 //Gakkung Bow
-1,1715,1 //Arbalest
-1,1716,1 //Gakkung Bow
-1,1718,1 //Hunter Bow
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1201,1 //Knife
-1,1202,1 //Knife
-1,1204,1 //Cutter
-1,1205,1 //Cutter
-1,1207,1 //Main Gauche
-1,1208,1 //Main Gauche
-1,1210,1 //Dirk
-1,1211,1 //Dirk
-1,1213,1 //Dagger
-1,1214,1 //Dagger
-1,1216,1 //Stiletto
-1,1217,1 //Stiletto
-1,1219,1 //Gladius
-1,1220,1 //Gladius
-1,1222,1 //Damascus
-1,1226,1 //Damascus
-1,1243,1 //Novice Main Gauche
-1,1301,1 //Axe
-1,1302,1 //Axe
-1,1304,1 //Orcish Axe
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1550,1 //Book
-1,1551,1 //Bible
-1,1552,1 //Tablet
-1,1553,1 //Book of Billows
-1,1554,1 //Book of Mother Earth
-1,1555,1 //Book of the Blazing Sun
-1,1556,1 //Book of Gust of Wind
-1,1558,1 //Girl's Diary
-1,1601,1 //Rod
-1,1602,1 //Rod
-1,1604,1 //Wand
-1,1605,1 //Wand
-1,1607,1 //Staff
-1,1608,1 //Staff
-1,1610,1 //Arc Wand
-1,1611,1 //Arc Wand
-1,1613,1 //Mighty Staff
-1,1614,1 //Wand of Occult
-1,1615,1 //Evil Bone Wand
-1,1801,1 //Waghnak
-1,1802,1 //Waghnak
-1,1803,1 //Knuckle Duster
-1,1804,1 //Knuckle Duster
-1,1805,1 //Studded Knuckles
-1,1806,1 //Studded Knuckles
-1,1807,1 //Fist
-1,1808,1 //Fist
-1,1809,1 //Claw
-1,1810,1 //Claw
-1,1811,1 //Finger
-1,1812,1 //Finger
-1,1901,1 //Violin
-1,1902,1 //Violin
-1,1903,1 //Mandolin
-1,1904,1 //Mandolin
-1,1905,1 //Lute
-1,1906,1 //Lute
-1,1907,1 //Guitar
-1,1908,1 //Guitar
-1,1909,1 //Harp
-1,1910,1 //Harp
-1,1911,1 //Gumoongoh
-1,1912,1 //Gumoongoh
-1,1950,1 //Rope
-1,1951,1 //Rope
-1,1952,1 //Whip
-1,1953,1 //Whip
-1,1954,1 //Wire Whip
-1,1955,1 //Wire Whip
-1,1956,1 //Rante Whip
-1,1957,1 //Rante Whip
-1,1958,1 //Tail Whip
-1,1959,1 //Tail Whip
-1,1960,1 //Whip
-1,1961,1 //Whip
-1,2201,1 //Sunglasses
-1,2203,1 //Glasses
-1,2205,1 //Diver Goggles
-1,2206,1 //Wedding Veil
-1,2207,1 //Fancy Flower
-1,2208,1 //Ribbon
-1,2209,1 //Ribbon
-1,2210,1 //Hair Band
-1,2211,1 //Bandana
-1,2212,1 //Eye Patch
-1,2213,1 //Kitty Band
-1,2214,1 //Bunny Band
-1,2215,1 //Flower Band
-1,2216,1 //Biretta
-1,2217,1 //Biretta
-1,2218,1 //Flu Mask
-1,2220,1 //Hat
-1,2221,1 //Hat
-1,2222,1 //Turban
-1,2223,1 //Turban
-1,2226,1 //Cap
-1,2227,1 //Cap
-1,2228,1 //Helm
-1,2229,1 //Helm
-1,2230,1 //Gemmed Sallet
-1,2231,1 //Gemmed Sallet
-1,2232,1 //Circlet
-1,2233,1 //Circlet
-1,2236,1 //Santa Hat
-1,2239,1 //Monocle
-1,2241,1 //Grandpa Beard
-1,2242,1 //Purple Glasses
-1,2243,1 //Geek Glasses
-1,2244,1 //Big Ribbon
-1,2245,1 //Sweet Gent
-1,2246,1 //Golden Gear
-1,2247,1 //Romantic Gent
-1,2248,1 //Western Grace
-1,2250,1 //Cute Ribbon
-1,2251,1 //Monk Hat
-1,2252,1 //Wizard Hat
-1,2253,1 //Sunflower
-1,2257,1 //Unicorn Horn
-1,2259,1 //Mini Propeller
-1,2260,1 //Mini Glasses
-1,2261,1 //Army Cap
-1,2262,1 //Clown Nose
-1,2263,1 //Zorro Masque
-1,2265,1 //Gangster Mask
-1,2266,1 //Iron Cain
-1,2267,1 //Cigarette
-1,2268,1 //Pipe
-1,2269,1 //Romantic Flower
-1,2270,1 //Romantic Leaf
-1,2271,1 //Jack be Dandy
-1,2275,1 //Red Bandana
-1,2276,1 //Angled Glasses
-1,2277,1 //Nurse Cap
-1,2279,1 //Bomb Wick
-1,2282,1 //Halo
-1,2285,1 //Apple of Archer
-1,2287,1 //Pirate Bandana
-1,2289,1 //Poo Poo Hat
-1,2290,1 //Funeral Hat
-1,2291,1 //Masquerade
-1,2294,1 //Stellar
-1,2295,1 //Blinker
-1,2298,1 //Green Feeler
-1,2299,1 //Orc Helm
-1,5003,1 //Joker Jester
-1,5006,1 //Machoman's Glasses
-1,5008,1 //Puppy Love
-1,5009,1 //Safety Helmet
-1,5010,1 //Indian Fillet
-1,5011,1 //Aerial
-1,5014,1 //Fin Helm
-1,5015,1 //Egg Shell
-1,5030,1 //Panda Hat
-1,5035,1 //Poring Hat
-1,5037,1 //Nutshell
-1,5055,1 //Novice False Eggshell
-1,2278,1 //Mr. Smile
-1,2288,1 //Mr. Scream
-1,2297,1 //Goblin Mask
-1,5005,1 //Gas Mask
-1,5088,1 //Surprised Mask
-1,5089,1 //Annoyed Mask
-1,5090,1 //Goblin Leader Mask
-1,2224,1 //Goggles
-1,2225,1 //Goggles
-1,10001,1 //Skull Helm
-1,10002,1 //Monster Oxygen Mask
-1,10003,1 //Transparent Headgear
-1,10004,1 //Pacifier
-1,10005,1 //Wig
-1,10006,1 //Queen's Hair Ornament
-1,10007,1 //Silk Ribbon
-1,10008,1 //Punisher
-1,10009,1 //Wild Flower
-1,10010,1 //Battered Pot
-1,10011,1 //Stellar Hairpin
-1,10012,1 //Tiny Egg Shell
-1,10013,1 //Backpack
-1,10014,1 //Rocker Glasses
-1,10015,1 //Green Lace
-1,10016,1 //Golden Bell
-1,10017,1 //Bark Shorts
-1,10018,1 //Monkey Circlet
-1,10019,1 //Red Scarf
-1,10020,1 //Grave Keeper's Sword
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,2101,1 //Guard
-1,2102,1 //Guard
-1,2103,1 //Buckler
-1,2104,1 //Buckler
-1,2105,1 //Shield
-1,2106,1 //Shield
-1,2107,1 //Mirror Shield
-1,2108,1 //Mirror Shield
-1,2109,1 //Memory Book
-1,2112,1 //Novice Guard
-1,2301,1 //Cotton Shirt
-1,2302,1 //Cotton Shirt
-1,2303,1 //Jacket
-1,2304,1 //Jacket
-1,2305,1 //Adventurer's Suit
-1,2306,1 //Adventurer's Suit
-1,2307,1 //Mantle
-1,2308,1 //Mantle
-1,2309,1 //Coat
-1,2310,1 //Coat
-1,2311,1 //Mink Coat
-1,2312,1 //Padded Armor
-1,2313,1 //Padded Armor
-1,2314,1 //Chain Mail
-1,2315,1 //Chain Mail
-1,2316,1 //Full Plate
-1,2317,1 //Full Plate
-1,2318,1 //Lord's Clothes
-1,2320,1 //Formal Suit
-1,2321,1 //Silk Robe
-1,2322,1 //Silk Robe
-1,2323,1 //Scapulare
-1,2324,1 //Scapulare
-1,2325,1 //Saint's Robe
-1,2326,1 //Saint's Robe
-1,2328,1 //Wooden Mail
-1,2329,1 //Wooden Mail
-1,2330,1 //Tights
-1,2331,1 //Tights
-1,2332,1 //Silver Robe
-1,2333,1 //Silver Robe
-1,2335,1 //Thief Clothes
-1,2336,1 //Thief Clothes
-1,2337,1 //Ninja Suit
-1,2338,1 //Wedding Dress
-1,2339,1 //Pantie
-1,2340,1 //Novice Breastplate
-1,2341,1 //Legion Plate Armor
-1,2352,1 //Tattered Novice Ninja Suit
-1,2401,1 //Sandals
-1,2402,1 //Sandals
-1,2403,1 //Shoes
-1,2404,1 //Shoes
-1,2405,1 //Boots
-1,2406,1 //Boots
-1,2407,1 //Crystal Pumps
-1,2408,1 //Shackles
-1,2409,1 //High Heels
-1,2411,1 //Greaves
-1,2414,1 //Novice Slippers
-1,2501,1 //Hood
-1,2502,1 //Hood
-1,2503,1 //Muffler
-1,2504,1 //Muffler
-1,2505,1 //Manteau
-1,2506,1 //Manteau
-1,2507,1 //Ancient Cape
-1,2508,1 //Ragamuffin Manteau
-1,2510,1 //Somber Novice Hood
-1,2601,1 //Ring
-1,2602,1 //Earring
-1,2603,1 //Necklace
-1,2604,1 //Glove
-1,2605,1 //Brooch
-1,2607,1 //Clip
-1,2608,1 //Rosary
-1,2609,1 //Skull Ring
-1,2610,1 //Gold Ring
-1,2611,1 //Silver Ring
-1,2612,1 //Flower Ring
-1,2613,1 //Diamond Ring
-1,2617,1 //Celebrant's Mitten
-1,2618,1 //Matyr's Leash
-1,2627,1 //Belt
-1,2628,1 //Novice Armlet
-1,1116,1 //Katana
-1,1117,1 //Katana
-1,1151,1 //Slayer
-1,1152,1 //Slayer
-1,1154,1 //Bastard Sword
-1,1155,1 //Bastard Sword
-1,1157,1 //Two-Handed Sword
-1,1158,1 //Two-Handed Sword
-1,1160,1 //Broad Sword
-1,1162,1 //Broad Sword
-1,1163,1 //Claymore
-1,1250,1 //Jur
-1,1251,1 //Jur
-1,1252,1 //Katar
-1,1253,1 //Katar
-1,1254,1 //Jamadhar
-1,1255,1 //Jamadhar
-1,1256,1 //Katar of Frozen Icicle
-1,1257,1 //Katar of Quaking
-1,1258,1 //Katar of Raging Blaze
-1,1259,1 //Katar of Piercing Wind
-1,1351,1 //Battle Axe
-1,1352,1 //Battle Axe
-1,1354,1 //Hammer
-1,1355,1 //Hammer
-1,1357,1 //Buster
-1,1358,1 //Buster
-1,1360,1 //Two-Handed Axe
-1,1361,1 //Two-Handed Axe
-1,1410,1 //Lance
-1,1411,1 //Lance
-1,1451,1 //Guisarme
-1,1452,1 //Guisarme
-1,1454,1 //Glaive
-1,1455,1 //Glaive
-1,1457,1 //Partizan
-1,1458,1 //Partizan
-1,1460,1 //Trident
-1,1461,1 //Trident
-1,1463,1 //Halberd
-1,1464,1 //Halberd
-1,1472,1 //Soul Staff
-1,1701,1 //Bow
-1,1702,1 //Bow
-1,1704,1 //Composite Bow
-1,1705,1 //Composite Bow
-1,1707,1 //Great Bow
-1,1708,1 //Great Bow
-1,1710,1 //Crossbow
-1,1711,1 //Crossbow
-1,1713,1 //Arbalest
-1,1714,1 //Gakkung Bow
-1,1715,1 //Arbalest
-1,1716,1 //Gakkung Bow
-1,1718,1 //Hunter Bow
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1201,1 //Knife
-1,1202,1 //Knife
-1,1204,1 //Cutter
-1,1205,1 //Cutter
-1,1207,1 //Main Gauche
-1,1208,1 //Main Gauche
-1,1210,1 //Dirk
-1,1211,1 //Dirk
-1,1213,1 //Dagger
-1,1214,1 //Dagger
-1,1216,1 //Stiletto
-1,1217,1 //Stiletto
-1,1219,1 //Gladius
-1,1220,1 //Gladius
-1,1222,1 //Damascus
-1,1226,1 //Damascus
-1,1243,1 //Novice Main Gauche
-1,1301,1 //Axe
-1,1302,1 //Axe
-1,1304,1 //Orcish Axe
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1550,1 //Book
-1,1551,1 //Bible
-1,1552,1 //Tablet
-1,1553,1 //Book of Billows
-1,1554,1 //Book of Mother Earth
-1,1555,1 //Book of the Blazing Sun
-1,1556,1 //Book of Gust of Wind
-1,1558,1 //Girl's Diary
-1,1601,1 //Rod
-1,1602,1 //Rod
-1,1604,1 //Wand
-1,1605,1 //Wand
-1,1607,1 //Staff
-1,1608,1 //Staff
-1,1610,1 //Arc Wand
-1,1611,1 //Arc Wand
-1,1613,1 //Mighty Staff
-1,1614,1 //Wand of Occult
-1,1615,1 //Evil Bone Wand
-1,1801,1 //Waghnak
-1,1802,1 //Waghnak
-1,1803,1 //Knuckle Duster
-1,1804,1 //Knuckle Duster
-1,1805,1 //Studded Knuckles
-1,1806,1 //Studded Knuckles
-1,1807,1 //Fist
-1,1808,1 //Fist
-1,1809,1 //Claw
-1,1810,1 //Claw
-1,1811,1 //Finger
-1,1812,1 //Finger
-1,1901,1 //Violin
-1,1902,1 //Violin
-1,1903,1 //Mandolin
-1,1904,1 //Mandolin
-1,1905,1 //Lute
-1,1906,1 //Lute
-1,1907,1 //Guitar
-1,1908,1 //Guitar
-1,1909,1 //Harp
-1,1910,1 //Harp
-1,1911,1 //Gumoongoh
-1,1912,1 //Gumoongoh
-1,1950,1 //Rope
-1,1951,1 //Rope
-1,1952,1 //Whip
-1,1953,1 //Whip
-1,1954,1 //Wire Whip
-1,1955,1 //Wire Whip
-1,1956,1 //Rante Whip
-1,1957,1 //Rante Whip
-1,1958,1 //Tail Whip
-1,1959,1 //Tail Whip
-1,1960,1 //Whip
-1,1961,1 //Whip
-1,2201,1 //Sunglasses
-1,2203,1 //Glasses
-1,2205,1 //Diver Goggles
-1,2206,1 //Wedding Veil
-1,2207,1 //Fancy Flower
-1,2208,1 //Ribbon
-1,2209,1 //Ribbon
-1,2210,1 //Hair Band
-1,2211,1 //Bandana
-1,2212,1 //Eye Patch
-1,2213,1 //Kitty Band
-1,2214,1 //Bunny Band
-1,2215,1 //Flower Band
-1,2216,1 //Biretta
-1,2217,1 //Biretta
-1,2218,1 //Flu Mask
-1,2220,1 //Hat
-1,2221,1 //Hat
-1,2222,1 //Turban
-1,2223,1 //Turban
-1,2226,1 //Cap
-1,2227,1 //Cap
-1,2228,1 //Helm
-1,2229,1 //Helm
-1,2230,1 //Gemmed Sallet
-1,2231,1 //Gemmed Sallet
-1,2232,1 //Circlet
-1,2233,1 //Circlet
-1,2236,1 //Santa Hat
-1,2239,1 //Monocle
-1,2241,1 //Grandpa Beard
-1,2242,1 //Purple Glasses
-1,2243,1 //Geek Glasses
-1,2244,1 //Big Ribbon
-1,2245,1 //Sweet Gent
-1,2246,1 //Golden Gear
-1,2247,1 //Romantic Gent
-1,2248,1 //Western Grace
-1,2250,1 //Cute Ribbon
-1,2251,1 //Monk Hat
-1,2252,1 //Wizard Hat
-1,2253,1 //Sunflower
-1,2257,1 //Unicorn Horn
-1,2259,1 //Mini Propeller
-1,2260,1 //Mini Glasses
-1,2261,1 //Army Cap
-1,2262,1 //Clown Nose
-1,2263,1 //Zorro Masque
-1,2265,1 //Gangster Mask
-1,2266,1 //Iron Cain
-1,2267,1 //Cigarette
-1,2268,1 //Pipe
-1,2269,1 //Romantic Flower
-1,2270,1 //Romantic Leaf
-1,2271,1 //Jack be Dandy
-1,2275,1 //Red Bandana
-1,2276,1 //Angled Glasses
-1,2277,1 //Nurse Cap
-1,2279,1 //Bomb Wick
-1,2282,1 //Halo
-1,2285,1 //Apple of Archer
-1,2287,1 //Pirate Bandana
-1,2289,1 //Poo Poo Hat
-1,2290,1 //Funeral Hat
-1,2291,1 //Masquerade
-1,2294,1 //Stellar
-1,2295,1 //Blinker
-1,2298,1 //Green Feeler
-1,2299,1 //Orc Helm
-1,5003,1 //Joker Jester
-1,5006,1 //Machoman's Glasses
-1,5008,1 //Puppy Love
-1,5009,1 //Safety Helmet
-1,5010,1 //Indian Fillet
-1,5011,1 //Aerial
-1,5014,1 //Fin Helm
-1,5015,1 //Egg Shell
-1,5030,1 //Panda Hat
-1,5035,1 //Poring Hat
-1,5037,1 //Nutshell
-1,5055,1 //Novice False Eggshell
-1,2278,1 //Mr. Smile
-1,2288,1 //Mr. Scream
-1,2297,1 //Goblin Mask
-1,5005,1 //Gas Mask
-1,5088,1 //Surprised Mask
-1,5089,1 //Annoyed Mask
-1,5090,1 //Goblin Leader Mask
-1,2224,1 //Goggles
-1,2225,1 //Goggles
-1,10001,1 //Skull Helm
-1,10002,1 //Monster Oxygen Mask
-1,10003,1 //Transparent Headgear
-1,10004,1 //Pacifier
-1,10005,1 //Wig
-1,10006,1 //Queen's Hair Ornament
-1,10007,1 //Silk Ribbon
-1,10008,1 //Punisher
-1,10009,1 //Wild Flower
-1,10010,1 //Battered Pot
-1,10011,1 //Stellar Hairpin
-1,10012,1 //Tiny Egg Shell
-1,10013,1 //Backpack
-1,10014,1 //Rocker Glasses
-1,10015,1 //Green Lace
-1,10016,1 //Golden Bell
-1,10017,1 //Bark Shorts
-1,10018,1 //Monkey Circlet
-1,10019,1 //Red Scarf
-1,10020,1 //Grave Keeper's Sword
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,2101,1 //Guard
-1,2102,1 //Guard
-1,2103,1 //Buckler
-1,2104,1 //Buckler
-1,2105,1 //Shield
-1,2106,1 //Shield
-1,2107,1 //Mirror Shield
-1,2108,1 //Mirror Shield
-1,2109,1 //Memory Book
-1,2112,1 //Novice Guard
-1,2301,1 //Cotton Shirt
-1,2302,1 //Cotton Shirt
-1,2303,1 //Jacket
-1,2304,1 //Jacket
-1,2305,1 //Adventurer's Suit
-1,2306,1 //Adventurer's Suit
-1,2307,1 //Mantle
-1,2308,1 //Mantle
-1,2309,1 //Coat
-1,2310,1 //Coat
-1,2311,1 //Mink Coat
-1,2312,1 //Padded Armor
-1,2313,1 //Padded Armor
-1,2314,1 //Chain Mail
-1,2315,1 //Chain Mail
-1,2316,1 //Full Plate
-1,2317,1 //Full Plate
-1,2318,1 //Lord's Clothes
-1,2320,1 //Formal Suit
-1,2321,1 //Silk Robe
-1,2322,1 //Silk Robe
-1,2323,1 //Scapulare
-1,2324,1 //Scapulare
-1,2325,1 //Saint's Robe
-1,2326,1 //Saint's Robe
-1,2328,1 //Wooden Mail
-1,2329,1 //Wooden Mail
-1,2330,1 //Tights
-1,2331,1 //Tights
-1,2332,1 //Silver Robe
-1,2333,1 //Silver Robe
-1,2335,1 //Thief Clothes
-1,2336,1 //Thief Clothes
-1,2337,1 //Ninja Suit
-1,2338,1 //Wedding Dress
-1,2339,1 //Pantie
-1,2340,1 //Novice Breastplate
-1,2341,1 //Legion Plate Armor
-1,2352,1 //Tattered Novice Ninja Suit
-1,2401,1 //Sandals
-1,2402,1 //Sandals
-1,2403,1 //Shoes
-1,2404,1 //Shoes
-1,2405,1 //Boots
-1,2406,1 //Boots
-1,2407,1 //Crystal Pumps
-1,2408,1 //Shackles
-1,2409,1 //High Heels
-1,2411,1 //Greaves
-1,2414,1 //Novice Slippers
-1,2501,1 //Hood
-1,2502,1 //Hood
-1,2503,1 //Muffler
-1,2504,1 //Muffler
-1,2505,1 //Manteau
-1,2506,1 //Manteau
-1,2507,1 //Ancient Cape
-1,2508,1 //Ragamuffin Manteau
-1,2510,1 //Somber Novice Hood
-1,2601,1 //Ring
-1,2602,1 //Earring
-1,2603,1 //Necklace
-1,2604,1 //Glove
-1,2605,1 //Brooch
-1,2607,1 //Clip
-1,2608,1 //Rosary
-1,2609,1 //Skull Ring
-1,2610,1 //Gold Ring
-1,2611,1 //Silver Ring
-1,2612,1 //Flower Ring
-1,2613,1 //Diamond Ring
-1,2617,1 //Celebrant's Mitten
-1,2618,1 //Matyr's Leash
-1,2627,1 //Belt
-1,2628,1 //Novice Armlet
-1,1116,1 //Katana
-1,1117,1 //Katana
-1,1151,1 //Slayer
-1,1152,1 //Slayer
-1,1154,1 //Bastard Sword
-1,1155,1 //Bastard Sword
-1,1157,1 //Two-Handed Sword
-1,1158,1 //Two-Handed Sword
-1,1160,1 //Broad Sword
-1,1162,1 //Broad Sword
-1,1163,1 //Claymore
-1,1250,1 //Jur
-1,1251,1 //Jur
-1,1252,1 //Katar
-1,1253,1 //Katar
-1,1254,1 //Jamadhar
-1,1255,1 //Jamadhar
-1,1256,1 //Katar of Frozen Icicle
-1,1257,1 //Katar of Quaking
-1,1258,1 //Katar of Raging Blaze
-1,1259,1 //Katar of Piercing Wind
-1,1351,1 //Battle Axe
-1,1352,1 //Battle Axe
-1,1354,1 //Hammer
-1,1355,1 //Hammer
-1,1357,1 //Buster
-1,1358,1 //Buster
-1,1360,1 //Two-Handed Axe
-1,1361,1 //Two-Handed Axe
-1,1410,1 //Lance
-1,1411,1 //Lance
-1,1451,1 //Guisarme
-1,1452,1 //Guisarme
-1,1454,1 //Glaive
-1,1455,1 //Glaive
-1,1457,1 //Partizan
-1,1458,1 //Partizan
-1,1460,1 //Trident
-1,1461,1 //Trident
-1,1463,1 //Halberd
-1,1464,1 //Halberd
-1,1472,1 //Soul Staff
-1,1701,1 //Bow
-1,1702,1 //Bow
-1,1704,1 //Composite Bow
-1,1705,1 //Composite Bow
-1,1707,1 //Great Bow
-1,1708,1 //Great Bow
-1,1710,1 //Crossbow
-1,1711,1 //Crossbow
-1,1713,1 //Arbalest
-1,1714,1 //Gakkung Bow
-1,1715,1 //Arbalest
-1,1716,1 //Gakkung Bow
-1,1718,1 //Hunter Bow
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1101,1 //Sword
-1,1102,1 //Sword
-1,1104,1 //Falchion
-1,1105,1 //Falchion
-1,1107,1 //Blade
-1,1108,1 //Blade
-1,1110,1 //Rapier
-1,1111,1 //Rapier
-1,1113,1 //Scimitar
-1,1114,1 //Scimitar
-1,1119,1 //Tsurugi
-1,1120,1 //Tsurugi
-1,1122,1 //Ring Pommel Saber
-1,1123,1 //Haedonggum
-1,1124,1 //Orcish sword
-1,1125,1 //Ring Pommel Saber
-1,1126,1 //Saber
-1,1127,1 //Saber
-1,1128,1 //Haedonggum
-1,1129,1 //Flamberge
-1,1201,1 //Knife
-1,1202,1 //Knife
-1,1204,1 //Cutter
-1,1205,1 //Cutter
-1,1207,1 //Main Gauche
-1,1208,1 //Main Gauche
-1,1210,1 //Dirk
-1,1211,1 //Dirk
-1,1213,1 //Dagger
-1,1214,1 //Dagger
-1,1216,1 //Stiletto
-1,1217,1 //Stiletto
-1,1219,1 //Gladius
-1,1220,1 //Gladius
-1,1222,1 //Damascus
-1,1226,1 //Damascus
-1,1243,1 //Novice Main Gauche
-1,1301,1 //Axe
-1,1302,1 //Axe
-1,1304,1 //Orcish Axe
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1401,1 //Javelin
-1,1402,1 //Javelin
-1,1404,1 //Spear
-1,1405,1 //Spear
-1,1407,1 //Pike
-1,1408,1 //Pike
-1,1501,1 //Club
-1,1502,1 //Club
-1,1504,1 //Mace
-1,1505,1 //Mace
-1,1507,1 //Smasher
-1,1508,1 //Smasher
-1,1510,1 //Flail
-1,1511,1 //Flail
-1,1513,1 //Morning Star
-1,1514,1 //Morning Star
-1,1516,1 //Sword Mace
-1,1517,1 //Sword Mace
-1,1519,1 //Chain
-1,1520,1 //Chain
-1,1522,1 //Stunner
-1,1550,1 //Book
-1,1551,1 //Bible
-1,1552,1 //Tablet
-1,1553,1 //Book of Billows
-1,1554,1 //Book of Mother Earth
-1,1555,1 //Book of the Blazing Sun
-1,1556,1 //Book of Gust of Wind
-1,1558,1 //Girl's Diary
-1,1601,1 //Rod
-1,1602,1 //Rod
-1,1604,1 //Wand
-1,1605,1 //Wand
-1,1607,1 //Staff
-1,1608,1 //Staff
-1,1610,1 //Arc Wand
-1,1611,1 //Arc Wand
-1,1613,1 //Mighty Staff
-1,1614,1 //Wand of Occult
-1,1615,1 //Evil Bone Wand
-1,1801,1 //Waghnak
-1,1802,1 //Waghnak
-1,1803,1 //Knuckle Duster
-1,1804,1 //Knuckle Duster
-1,1805,1 //Studded Knuckles
-1,1806,1 //Studded Knuckles
-1,1807,1 //Fist
-1,1808,1 //Fist
-1,1809,1 //Claw
-1,1810,1 //Claw
-1,1811,1 //Finger
-1,1812,1 //Finger
-1,1901,1 //Violin
-1,1902,1 //Violin
-1,1903,1 //Mandolin
-1,1904,1 //Mandolin
-1,1905,1 //Lute
-1,1906,1 //Lute
-1,1907,1 //Guitar
-1,1908,1 //Guitar
-1,1909,1 //Harp
-1,1910,1 //Harp
-1,1911,1 //Gumoongoh
-1,1912,1 //Gumoongoh
-1,1950,1 //Rope
-1,1951,1 //Rope
-1,1952,1 //Whip
-1,1953,1 //Whip
-1,1954,1 //Wire Whip
-1,1955,1 //Wire Whip
-1,1956,1 //Rante Whip
-1,1957,1 //Rante Whip
-1,1958,1 //Tail Whip
-1,1959,1 //Tail Whip
-1,1960,1 //Whip
-1,1961,1 //Whip
-1,2201,1 //Sunglasses
-1,2203,1 //Glasses
-1,2205,1 //Diver Goggles
-1,2206,1 //Wedding Veil
-1,2207,1 //Fancy Flower
-1,2208,1 //Ribbon
-1,2209,1 //Ribbon
-1,2210,1 //Hair Band
-1,2211,1 //Bandana
-1,2212,1 //Eye Patch
-1,2213,1 //Kitty Band
-1,2214,1 //Bunny Band
-1,2215,1 //Flower Band
-1,2216,1 //Biretta
-1,2217,1 //Biretta
-1,2218,1 //Flu Mask
-1,2220,1 //Hat
-1,2221,1 //Hat
-1,2222,1 //Turban
-1,2223,1 //Turban
-1,2226,1 //Cap
-1,2227,1 //Cap
-1,2228,1 //Helm
-1,2229,1 //Helm
-1,2230,1 //Gemmed Sallet
-1,2231,1 //Gemmed Sallet
-1,2232,1 //Circlet
-1,2233,1 //Circlet
-1,2236,1 //Santa Hat
-1,2239,1 //Monocle
-1,2241,1 //Grandpa Beard
-1,2242,1 //Purple Glasses
-1,2243,1 //Geek Glasses
-1,2244,1 //Big Ribbon
-1,2245,1 //Sweet Gent
-1,2246,1 //Golden Gear
-1,2247,1 //Romantic Gent
-1,2248,1 //Western Grace
-1,2250,1 //Cute Ribbon
-1,2251,1 //Monk Hat
-1,2252,1 //Wizard Hat
-1,2253,1 //Sunflower
-1,2257,1 //Unicorn Horn
-1,2259,1 //Mini Propeller
-1,2260,1 //Mini Glasses
-1,2261,1 //Army Cap
-1,2262,1 //Clown Nose
-1,2263,1 //Zorro Masque
-1,2265,1 //Gangster Mask
-1,2266,1 //Iron Cain
-1,2267,1 //Cigarette
-1,2268,1 //Pipe
-1,2269,1 //Romantic Flower
-1,2270,1 //Romantic Leaf
-1,2271,1 //Jack be Dandy
-1,2275,1 //Red Bandana
-1,2276,1 //Angled Glasses
-1,2277,1 //Nurse Cap
-1,2279,1 //Bomb Wick
-1,2282,1 //Halo
-1,2285,1 //Apple of Archer
-1,2287,1 //Pirate Bandana
-1,2289,1 //Poo Poo Hat
-1,2290,1 //Funeral Hat
-1,2291,1 //Masquerade
-1,2294,1 //Stellar
-1,2295,1 //Blinker
-1,2298,1 //Green Feeler
-1,2299,1 //Orc Helm
-1,5003,1 //Joker Jester
-1,5006,1 //Machoman's Glasses
-1,5008,1 //Puppy Love
-1,5009,1 //Safety Helmet
-1,5010,1 //Indian Fillet
-1,5011,1 //Aerial
-1,5014,1 //Fin Helm
-1,5015,1 //Egg Shell
-1,5030,1 //Panda Hat
-1,5035,1 //Poring Hat
-1,5037,1 //Nutshell
-1,5055,1 //Novice False Eggshell
-1,2278,1 //Mr. Smile
-1,2288,1 //Mr. Scream
-1,2297,1 //Goblin Mask
-1,5005,1 //Gas Mask
-1,5088,1 //Surprised Mask
-1,5089,1 //Annoyed Mask
-1,5090,1 //Goblin Leader Mask
-1,2224,1 //Goggles
-1,2225,1 //Goggles
-1,10001,1 //Skull Helm
-1,10002,1 //Monster Oxygen Mask
-1,10003,1 //Transparent Headgear
-1,10004,1 //Pacifier
-1,10005,1 //Wig
-1,10006,1 //Queen's Hair Ornament
-1,10007,1 //Silk Ribbon
-1,10008,1 //Punisher
-1,10009,1 //Wild Flower
-1,10010,1 //Battered Pot
-1,10011,1 //Stellar Hairpin
-1,10012,1 //Tiny Egg Shell
-1,10013,1 //Backpack
-1,10014,1 //Rocker Glasses
-1,10015,1 //Green Lace
-1,10016,1 //Golden Bell
-1,10017,1 //Bark Shorts
-1,10018,1 //Monkey Circlet
-1,10019,1 //Red Scarf
-1,10020,1 //Grave Keeper's Sword
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,603,1 //Old Blue Box
-1,604,1 //Dead Branch
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,644,1 //Gift Box
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,701,1 //Ora Ora
-1,702,1 //Animal Gore
-1,703,1 //Hinalle
-1,704,1 //Aloe
-1,705,1 //Clover
-1,706,1 //Four Leaf Clover
-1,707,1 //Singing Plant
-1,708,1 //Ment
-1,710,1 //Illusion Flower
-1,711,1 //Shoot
-1,712,1 //Flower
-1,713,1 //Empty Bottle
-1,714,1 //Emperium
-1,715,1 //Yellow Gemstone
-1,716,1 //Red Gemstone
-1,717,1 //Blue Gemstone
-1,718,1 //Garnet
-1,719,1 //Amethyst
-1,720,1 //Aquamarine
-1,721,1 //Emerald
-1,722,1 //Pearl
-1,723,1 //Ruby
-1,724,1 //Cursed Ruby
-1,725,1 //Sardonyx
-1,726,1 //Sapphire
-1,727,1 //Opal
-1,728,1 //Topaz
-1,729,1 //Zircon
-1,730,1 //1carat Diamond
-1,731,1 //2carat Diamond
-1,732,1 //3carat Diamond
-1,733,1 //Cracked Diamond
-1,734,1 //Red Frame
-1,735,1 //Chung Jah
-1,736,1 //China
-1,737,1 //Black Ladle
-1,738,1 //Pencil Case
-1,739,1 //Rouge
-1,740,1 //Puppet
-1,741,1 //Poring Doll
-1,742,1 //Chonchon Doll
-1,743,1 //Spore Doll
-1,744,1 //Bouquet
-1,745,1 //Wedding Bouquet
-1,746,1 //Glass Bead
-1,747,1 //Crystal Mirror
-1,748,1 //Witherless Rose
-1,749,1 //Frozen Rose
-1,750,1 //Baphomet Doll
-1,751,1 //Osiris Doll
-1,752,1 //Grasshopper Doll
-1,753,1 //Yoyo Doll
-1,754,1 //Raccoon Doll
-1,756,1 //Rough Oridecon
-1,757,1 //Rough Elunium
-1,901,1 //Danggie
-1,902,1 //Tree Root
-1,903,1 //Reptile Tongue
-1,904,1 //Scorpion Tail
-1,905,1 //Stem
-1,906,1 //Pointed Scale
-1,907,1 //Resin
-1,908,1 //Spawn
-1,909,1 //Jellopy
-1,910,1 //Garlet
-1,911,1 //Scell
-1,912,1 //Zargon
-1,913,1 //Tooth of Bat
-1,914,1 //Fluff
-1,915,1 //Chrysalis
-1,916,1 //Feather of Birds
-1,917,1 //Talon
-1,918,1 //Sticky Webfoot
-1,919,1 //Animal Skin
-1,920,1 //Wolf Claw
-1,921,1 //Mushroom Spore
-1,922,1 //Orc's Fang
-1,923,1 //Evil Horn
-1,924,1 //Powder of Butterfly
-1,925,1 //Bill of Birds
-1,926,1 //Snake Scale
-1,928,1 //Insect Feeler
-1,929,1 //Immortal Heart
-1,930,1 //Rotten Bandage
-1,931,1 //Orcish Voucher
-1,932,1 //Skel-Bone
-1,934,1 //Memento
-1,935,1 //Shell
-1,936,1 //Scale Shell
-1,937,1 //Venom Canine
-1,938,1 //Sticky Mucus
-1,939,1 //Bee Sting
-1,940,1 //Grasshopper's Leg
-1,941,1 //Nose Ring
-1,942,1 //Yoyo Tail
-1,943,1 //Solid Shell
-1,944,1 //Horseshoe
-1,945,1 //Raccoon Leaf
-1,946,1 //Snail's Shell
-1,947,1 //Horn
-1,948,1 //Bear's Footskin
-1,949,1 //Feather
-1,950,1 //Heart of Mermaid
-1,951,1 //Fin
-1,952,1 //Cactus Needle
-1,953,1 //Stone Heart
-1,954,1 //Shining Scale
-1,955,1 //Worm Peeling
-1,956,1 //Gill
-1,957,1 //Decayed Nail
-1,958,1 //Horrendous Mouth
-1,959,1 //Stinky Scale
-1,960,1 //Nipper
-1,961,1 //Conch
-1,962,1 //Tentacle
-1,963,1 //Sharp Scale
-1,964,1 //Crab Shell
-1,965,1 //Clam Shell
-1,966,1 //Clam Flesh
-1,967,1 //Turtle Shell
-1,968,1 //Heroic Emblem
-1,969,1 //Gold
-1,970,1 //Alcohol
-1,971,1 //Detrimindexta
-1,972,1 //Karvodailnirol
-1,973,1 //Counteragent
-1,974,1 //Mixture
-1,975,1 //Scarlet Dyestuff
-1,976,1 //Lemon Dyestuff
-1,978,1 //Cobaltblue Dyestuff
-1,979,1 //Darkgreen Dyestuff
-1,980,1 //Orange Dyestuff
-1,981,1 //Violet Dyestuff
-1,982,1 //White Dyestuff
-1,983,1 //Black Dyestuff
-1,984,1 //Oridecon
-1,985,1 //Elunium
-1,986,1 //Anvil
-1,987,1 //Oridecon Anvil
-1,988,1 //Golden Anvil
-1,989,1 //Emperium Anvil
-1,990,1 //Red Blood
-1,991,1 //Crystal Blue
-1,992,1 //Wind of Verdure
-1,993,1 //Green Live
-1,994,1 //Flame Heart
-1,995,1 //Mystic Frozen
-1,996,1 //Rough Wind
-1,997,1 //Great Nature
-1,998,1 //Iron
-1,999,1 //Steel
-1,1000,1 //Star Crumb
-1,1001,1 //Star Dust
-1,1002,1 //Iron Ore
-1,1003,1 //Coal
-1,1004,1 //Chivalry Emblem
-1,1005,1 //Hammer of Blacksmith
-1,1006,1 //Old Magicbook
-1,1007,1 //Necklace of Wisdom
-1,1008,1 //Necklace of Oblivion
-1,1009,1 //Hand of God
-1,1010,1 //Phracon
-1,1011,1 //Emveretarcon
-1,1012,1 //Frill
-1,1013,1 //Rainbow Shell
-1,1014,1 //Ant Jaw
-1,1015,1 //Tongue
-1,1016,1 //Rat Tail
-1,1017,1 //Mole Whiskers
-1,1018,1 //Mole Claw
-1,1019,1 //Trunk
-1,1020,1 //Black Hair
-1,1021,1 //Dokebi Horn
-1,1022,1 //Nine Tails
-1,1023,1 //Fish Tail
-1,1024,1 //Squid Ink
-1,1025,1 //Cobweb
-1,1026,1 //Acorn
-1,1027,1 //Porcupine Quill
-1,1028,1 //Mane
-1,1029,1 //Tiger Skin
-1,1030,1 //Tiger's Footskin
-1,1031,1 //Mantis Scythe
-1,1032,1 //Maneater Blossom
-1,1033,1 //Maneater Root
-1,1034,1 //Blue Hair
-1,1035,1 //Dragon Canine
-1,1036,1 //Dragon Scale
-1,1037,1 //Dragon Tail
-1,1038,1 //Little Evil Horn
-1,1039,1 //Little Evil Wing
-1,1040,1 //Elder Pixie's Moustache
-1,1041,1 //Lantern
-1,1042,1 //Bug Leg
-1,1043,1 //Orc Claw
-1,1044,1 //Zenorc's Fang
-1,1045,1 //Cultish Masque
-1,1046,1 //Scorpion Nipper
-1,1047,1 //Dead Medusa
-1,1048,1 //Horrendous Hair
-1,1049,1 //Skirt of Virgin
-1,1050,1 //Tendon
-1,1051,1 //Detonator
-1,1052,1 //Single Cell
-1,1053,1 //Ancient Tooth
-1,1054,1 //Ancient Lips
-1,1055,1 //Earthworm Peeling
-1,1056,1 //Grit
-1,1057,1 //Moth Dust
-1,1058,1 //Moth Wings
-1,1059,1 //Fabric
-1,1060,1 //Golden Hair
-1,1061,1 //Witched Starsand
-1,1062,1 //Jack o' Pumpkin
-1,1063,1 //Fang
-1,1064,1 //Reins
-1,1065,1 //Trap
-1,1066,1 //Fine-grained Trunk
-1,1067,1 //Solid Trunk
-1,1068,1 //Barren Trunk
-1,1088,1 //Morocc Solution
-1,1089,1 //Payon Solution
-1,1092,1 //Empty Test Tube
-1,1093,1 //Empty Potion Bottle
-1,1094,1 //Short Daenggie
-1,1095,1 //Clock Hand
-1,1096,1 //Round Shell
-1,1097,1 //Worn Out Page
-1,1098,1 //Manacles
-1,1099,1 //Worn-out Prison Uniform
-1,7001,1 //Mould Powder
-1,7002,1 //Ogre Tooth
-1,7003,1 //Anolian Skin
-1,7004,1 //Mud Lump
-1,7005,1 //Skull
-1,7006,1 //Wing of Red Bat
-1,7007,1 //Claw of Rat
-1,7008,1 //Stiff Horn
-1,7009,1 //Glitter Shell
-1,7010,1 //Tail of Steel Scorpion
-1,7011,1 //Claw of Monkey
-1,7012,1 //Tough Scalelike Stem
-1,7013,1 //Coral Reef
-1,7014,1 //Old Portrait
-1,7015,1 //Memory Bookmark
-1,7016,1 //Bent Spoon
-1,7026,1 //Clock_Tower_Key
-1,7027,1 //Key of the Underground
-1,7030,1 //Claw of Desert Wolf
-1,7031,1 //Old Frying Pan
-1,7032,1 //Piece of Egg Shell
-1,7033,1 //Poison Spore
-1,7034,1 //Red Stocking
-1,7035,1 //Matchstick
-1,7036,1 //Fang of Garm
-1,7038,1 //Yarn
-1,7041,1 //Fine Grit
-1,7047,1 //Alice's Apron
-1,7048,1 //Talon of Griffon
-1,7049,1 //Stone
-1,7053,1 //Cyfar
-1,7054,1 //Brigan
-1,7059,1 //Free Ticket for Kafra Storage
-1,7060,1 //Free Ticket for Kafra Transportation
-1,7061,1 //Free Ticket for the Cart Service
-1,7063,1 //Soft Feather
-1,7064,1 //Wing of Dragonfly
-1,7065,1 //Sea-Otter Fur
-1,7066,1 //Ice Cubic
-1,7067,1 //Stone Fragment
-1,7068,1 //Burnt Tree
-1,7069,1 //Destroyed Armor
-1,7070,1 //Broken Shell
-1,7071,1 //Tattered Clothes
-1,7072,1 //Old Shuriken
-1,7093,1 //Cogwheel
-1,7094,1 //Fragment
-1,7095,1 //Metal Fragment
-1,7096,1 //Lava
-1,7097,1 //Burning Heart
-1,7098,1 //Live Coal
-1,7099,1 //Worn-out Magic Scroll
-1,7100,1 //Sharp Leaf
-1,7101,1 //Peco Peco Feather
-1,7106,1 //Antelope Horn
-1,7107,1 //Antelope Skin
-1,7108,1 //Piece of Shield
-1,7109,1 //Shining Spear Blade
-1,7110,1 //Broken Sword
-1,7111,1 //Slick Paper
-1,7112,1 //Sharp Paper
-1,7113,1 //Broken Pharaoh Emblem
-1,7114,1 //Masque of Tutankhamen
-1,7115,1 //Harpy Feather
-1,7116,1 //Harpy Talon
-1,7117,1 //Torn Magic Book
-1,7118,1 //Torn Scroll
-1,7119,1 //Bacillus
-1,7120,1 //Burning Horseshoe
-1,7121,1 //Honey Pot
-1,7122,1 //Burning Hair
-1,7123,1 //Dragon Skin
-1,7124,1 //Sand Clump
-1,7125,1 //Scorpion Claw
-1,7126,1 //Large Jellopy
-1,7134,1 //Medicine Bowl
-1,7135,1 //Fire Bottle
-1,7136,1 //Acid Bottle
-1,7137,1 //Plant Bottle
-1,7138,1 //Marine Sphere Bottle
-1,7139,1 //Glistening Coat
-1,7149,1 //Yellow Plate
-1,7150,1 //Piece of Bamboo
-1,7151,1 //Oil Paper
-1,7152,1 //Glossy Hair
-1,7153,1 //Worn-out Kimono
-1,7154,1 //Poisonous Powder
-1,7155,1 //Poisonous Toad Skin
-1,7156,1 //Broken Shuriken
-1,7157,1 //Dark Mask
-1,7158,1 //Broken Liquor Jar
-1,7159,1 //Tengu Nose
-1,7161,1 //Black Bear Skin
-1,7162,1 //Cloud Crumb
-1,7163,1 //Hard Feeler
-1,7164,1 //Solid_Peach
-1,7165,1 //Transparent Celestial Robe
-1,7166,1 //Soft Silk
-1,7167,1 //Strange Steel Piece
-1,7168,1 //Giant Butterfly Wing
-1,7169,1 //Ba_Gua
-1,7170,1 //Tuxedo
-1,7171,1 //Leopard Skin
-1,7172,1 //Leopard Claw
-1,7174,1 //Wrapping Lace
-1,7175,1 //Wrapping Paper
-1,7182,1 //Cacao
-1,7186,1 //Thin Trunk
-1,7187,1 //Festival Mask
-1,7188,1 //Brown_Root
-1,7189,1 //Wooden Heart
-1,7190,1 //Solid Husk
-1,7191,1 //Lamp
-1,7192,1 //Vane
-1,7193,1 //Sprout
-1,7194,1 //Soft Blade of Grass
-1,7195,1 //Slingshot
-1,7196,1 //Shoulder Protector
-1,7197,1 //Tough Vines
-1,7198,1 //Huge Leaf
-1,7200,1 //Elastic Band
-1,7201,1 //Log
-1,7202,1 //Pincher of Beetle
-1,7203,1 //Strong Branch
-1,7205,1 //Piece of Black Cloth
-1,7206,1 //Black Cat Doll
-1,7207,1 //Old Manteau
-1,7208,1 //Rusty Kitchen Knife
-1,7209,1 //Helm of Dullahan
-1,7210,1 //Armor Piece of Dullahan
-1,7211,1 //Fragment of Rossata Stone
-1,7212,1 //Hung Doll
-1,7213,1 //Needle Packet
-1,7214,1 //Bat Cage
-1,7215,1 //Broken Needle
-1,7216,1 //Red Muffler
-1,7217,1 //Spool
-1,7218,1 //Decomposed Rope
-1,7219,1 //Striped Sock
-1,7220,1 //Ectoplasm
-1,7221,1 //Tangled Chains
-1,7222,1 //Wooden Gnarl
-1,7223,1 //Contorted Self-Portrait
-1,7225,1 //Pumpkin Lantern
-1,7262,1 //Folding Fan of Cat Ghost
-1,7263,1 //Cat's Eye
-1,7264,1 //Dry Sand
-1,7265,1 //Dragon Horn
-1,7266,1 //Denture from Dragon Mask
-1,7267,1 //Tiger Panty
-1,7268,1 //Little Ghost Doll
-1,7269,1 //Pinafore
-1,7270,1 //Nursing_Bottle
-1,1750,1 //Arrow
-1,1751,1 //Silver Arrow
-1,1752,1 //Fire Arrow
-1,1753,1 //Steel Arrow
-1,1754,1 //Crystal Arrow
-1,1755,1 //Arrow of Wind
-1,1756,1 //Stone Arrow
-1,1757,1 //Immaterial Arrow
-1,1758,1 //Stun Arrow
-1,1759,1 //Frozen Arrow
-1,1760,1 //Flash Arrow
-1,1761,1 //Cursed Arrow
-1,1762,1 //Rusty Arrow
-1,1763,1 //Poison Arrow
-1,1764,1 //Sharp Arrow
-1,1765,1 //Oridecon Arrow
-1,1767,1 //Shadow Arrow
-1,1768,1 //Sleep Arrow
-1,1769,1 //Mute Arrow
-1,1770,1 //Iron Arrow
-1,501,1 //Red Potion
-1,502,1 //Orange Potion
-1,503,1 //Yellow Potion
-1,504,1 //White Potion
-1,505,1 //Blue Potion
-1,506,1 //Green Potion
-1,507,1 //Red Herb
-1,508,1 //Yellow Herb
-1,509,1 //White Herb
-1,510,1 //Blue Herb
-1,511,1 //Green Herb
-1,512,1 //Apple
-1,513,1 //Banana
-1,514,1 //Grape
-1,515,1 //Carrot
-1,516,1 //Potato
-1,517,1 //Meat
-1,518,1 //Honey
-1,519,1 //Milk
-1,520,1 //Hinalle Leaflet
-1,521,1 //Aloe Leaflet
-1,522,1 //Mastela Fruit
-1,523,1 //Holy Water
-1,525,1 //Panacea
-1,526,1 //Royal Jelly
-1,528,1 //Monster Food
-1,529,1 //Candy
-1,530,1 //Candy Cane
-1,531,1 //Apple Juice
-1,532,1 //Banana Juice
-1,533,1 //Grape Juice
-1,534,1 //Carrot Juice
-1,535,1 //Pumpkin
-1,536,1 //Ice Cream
-1,537,1 //Pet Food
-1,538,1 //Well-baked Cookie
-1,539,1 //Piece of Cake
-1,544,1 //Raw Fish
-1,545,1 //Condensed Red Potion
-1,546,1 //Condensed Yellow Potion
-1,547,1 //Condensed White Potion
-1,548,1 //Cheese
-1,549,1 //Yam
-1,550,1 //Rice Cake
-1,551,1 //Sushi
-1,553,1 //Bao
-1,555,1 //Traditional Rice Cake
-1,558,1 //Chocolate
-1,561,1 //White Chocolate
-1,601,1 //Fly Wing
-1,602,1 //Butterfly Wing
-1,605,1 //Anodyne
-1,606,1 //Aloevera
-1,607,1 //Yggdrasil Berry
-1,608,1 //Yggdrasil Seed
-1,609,1 //Amulet
-1,610,1 //Yggdrasil Leaf
-1,611,1 //Magnifier
-1,612,1 //Mini Furnace
-1,613,1 //Iron Hammer
-1,614,1 //Golden Hammer
-1,615,1 //Oridecon Hammer
-1,618,1 //Worn Out Scroll
-1,619,1 //Unripe Apple
-1,620,1 //Orange Juice
-1,621,1 //Bitter Herb
-1,622,1 //Rainbow Carrot
-1,623,1 //Earthworm the Dude
-1,624,1 //Rotten Fish
-1,625,1 //Rusty Iron
-1,626,1 //Monster Juice
-1,627,1 //Sweet Milk
-1,628,1 //Well-Dried Bone
-1,629,1 //Singing Flower
-1,630,1 //Dew Laden Moss
-1,631,1 //Deadly Noxious Herb
-1,632,1 //Fatty Chubby Earthworm
-1,633,1 //Sweet Potato
-1,634,1 //Tropical Banana
-1,635,1 //Orc Trophy
-1,636,1 //No Recipient
-1,637,1 //Old Broom
-1,638,1 //Silver Knife of Chastity
-1,639,1 //Armlet of Obedience
-1,640,1 //Shining Stone
-1,641,1 //Contracts in Shadow
-1,642,1 //Book of the Devil
-1,643,1 //Pet Incubator
-1,645,1 //Concentration Potion
-1,656,1 //Awakening Potion
-1,657,1 //Berserk Potion
-1,659,1 //Her Heart
-1,663,1 //Songpyun
-1,664,1 //Gift Box
-1,665,1 //Gift Box
-1,666,1 //Gift Box
-1,667,1 //Gift Box
-1,668,1 //Red_Envelope
-1,678,1 //Poison Bottle
-1,679,1 //Pilule
-1,2249,1 //Coronet
-1,2254,1 //Angel Wing
-1,2255,1 //Evil Wing
-1,2258,1 //Spiky Band
-1,2274,1 //Ghost Bandana
-1,2621,1 //Ring
-1,2622,1 //Earring
-1,2623,1 //Necklace
-1,2624,1 //Glove
-1,2625,1 //Brooch
-1,2626,1 //Rosary
-1,5002,1 //Jewel Crown
-1,5085,1 //Small Ribbons
-1,603,1000 //Old Blue Box
-1,604,500 //Dead Branch
-1,644,300 //Gift Box
+// Old Blue Box Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+1,2101,1 //Guard
+1,2102,1 //Guard
+1,2103,1 //Buckler
+1,2104,1 //Buckler
+1,2105,1 //Shield
+1,2106,1 //Shield
+1,2107,1 //Mirror Shield
+1,2108,1 //Mirror Shield
+1,2109,1 //Memory Book
+1,2112,1 //Novice Guard
+1,2301,1 //Cotton Shirt
+1,2302,1 //Cotton Shirt
+1,2303,1 //Jacket
+1,2304,1 //Jacket
+1,2305,1 //Adventurer's Suit
+1,2306,1 //Adventurer's Suit
+1,2307,1 //Mantle
+1,2308,1 //Mantle
+1,2309,1 //Coat
+1,2310,1 //Coat
+1,2311,1 //Mink Coat
+1,2312,1 //Padded Armor
+1,2313,1 //Padded Armor
+1,2314,1 //Chain Mail
+1,2315,1 //Chain Mail
+1,2316,1 //Full Plate
+1,2317,1 //Full Plate
+1,2318,1 //Lord's Clothes
+1,2320,1 //Formal Suit
+1,2321,1 //Silk Robe
+1,2322,1 //Silk Robe
+1,2323,1 //Scapulare
+1,2324,1 //Scapulare
+1,2325,1 //Saint's Robe
+1,2326,1 //Saint's Robe
+1,2328,1 //Wooden Mail
+1,2329,1 //Wooden Mail
+1,2330,1 //Tights
+1,2331,1 //Tights
+1,2332,1 //Silver Robe
+1,2333,1 //Silver Robe
+1,2335,1 //Thief Clothes
+1,2336,1 //Thief Clothes
+1,2337,1 //Ninja Suit
+1,2338,1 //Wedding Dress
+1,2339,1 //Pantie
+1,2340,1 //Novice Breastplate
+1,2341,1 //Legion Plate Armor
+1,2352,1 //Tattered Novice Ninja Suit
+1,2401,1 //Sandals
+1,2402,1 //Sandals
+1,2403,1 //Shoes
+1,2404,1 //Shoes
+1,2405,1 //Boots
+1,2406,1 //Boots
+1,2407,1 //Crystal Pumps
+1,2408,1 //Shackles
+1,2409,1 //High Heels
+1,2411,1 //Greaves
+1,2414,1 //Novice Slippers
+1,2501,1 //Hood
+1,2502,1 //Hood
+1,2503,1 //Muffler
+1,2504,1 //Muffler
+1,2505,1 //Manteau
+1,2506,1 //Manteau
+1,2507,1 //Ancient Cape
+1,2508,1 //Ragamuffin Manteau
+1,2510,1 //Somber Novice Hood
+1,2601,1 //Ring
+1,2602,1 //Earring
+1,2603,1 //Necklace
+1,2604,1 //Glove
+1,2605,1 //Brooch
+1,2607,1 //Clip
+1,2608,1 //Rosary
+1,2609,1 //Skull Ring
+1,2610,1 //Gold Ring
+1,2611,1 //Silver Ring
+1,2612,1 //Flower Ring
+1,2613,1 //Diamond Ring
+1,2617,1 //Celebrant's Mitten
+1,2618,1 //Matyr's Leash
+1,2627,1 //Belt
+1,2628,1 //Novice Armlet
+1,1116,1 //Katana
+1,1117,1 //Katana
+1,1151,1 //Slayer
+1,1152,1 //Slayer
+1,1154,1 //Bastard Sword
+1,1155,1 //Bastard Sword
+1,1157,1 //Two-Handed Sword
+1,1158,1 //Two-Handed Sword
+1,1160,1 //Broad Sword
+1,1162,1 //Broad Sword
+1,1163,1 //Claymore
+1,1250,1 //Jur
+1,1251,1 //Jur
+1,1252,1 //Katar
+1,1253,1 //Katar
+1,1254,1 //Jamadhar
+1,1255,1 //Jamadhar
+1,1256,1 //Katar of Frozen Icicle
+1,1257,1 //Katar of Quaking
+1,1258,1 //Katar of Raging Blaze
+1,1259,1 //Katar of Piercing Wind
+1,1351,1 //Battle Axe
+1,1352,1 //Battle Axe
+1,1354,1 //Hammer
+1,1355,1 //Hammer
+1,1357,1 //Buster
+1,1358,1 //Buster
+1,1360,1 //Two-Handed Axe
+1,1361,1 //Two-Handed Axe
+1,1410,1 //Lance
+1,1411,1 //Lance
+1,1451,1 //Guisarme
+1,1452,1 //Guisarme
+1,1454,1 //Glaive
+1,1455,1 //Glaive
+1,1457,1 //Partizan
+1,1458,1 //Partizan
+1,1460,1 //Trident
+1,1461,1 //Trident
+1,1463,1 //Halberd
+1,1464,1 //Halberd
+1,1472,1 //Soul Staff
+1,1701,1 //Bow
+1,1702,1 //Bow
+1,1704,1 //Composite Bow
+1,1705,1 //Composite Bow
+1,1707,1 //Great Bow
+1,1708,1 //Great Bow
+1,1710,1 //Crossbow
+1,1711,1 //Crossbow
+1,1713,1 //Arbalest
+1,1714,1 //Gakkung Bow
+1,1715,1 //Arbalest
+1,1716,1 //Gakkung Bow
+1,1718,1 //Hunter Bow
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1201,1 //Knife
+1,1202,1 //Knife
+1,1204,1 //Cutter
+1,1205,1 //Cutter
+1,1207,1 //Main Gauche
+1,1208,1 //Main Gauche
+1,1210,1 //Dirk
+1,1211,1 //Dirk
+1,1213,1 //Dagger
+1,1214,1 //Dagger
+1,1216,1 //Stiletto
+1,1217,1 //Stiletto
+1,1219,1 //Gladius
+1,1220,1 //Gladius
+1,1222,1 //Damascus
+1,1226,1 //Damascus
+1,1243,1 //Novice Main Gauche
+1,1301,1 //Axe
+1,1302,1 //Axe
+1,1304,1 //Orcish Axe
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1550,1 //Book
+1,1551,1 //Bible
+1,1552,1 //Tablet
+1,1553,1 //Book of Billows
+1,1554,1 //Book of Mother Earth
+1,1555,1 //Book of the Blazing Sun
+1,1556,1 //Book of Gust of Wind
+1,1558,1 //Girl's Diary
+1,1601,1 //Rod
+1,1602,1 //Rod
+1,1604,1 //Wand
+1,1605,1 //Wand
+1,1607,1 //Staff
+1,1608,1 //Staff
+1,1610,1 //Arc Wand
+1,1611,1 //Arc Wand
+1,1613,1 //Mighty Staff
+1,1614,1 //Wand of Occult
+1,1615,1 //Evil Bone Wand
+1,1801,1 //Waghnak
+1,1802,1 //Waghnak
+1,1803,1 //Knuckle Duster
+1,1804,1 //Knuckle Duster
+1,1805,1 //Studded Knuckles
+1,1806,1 //Studded Knuckles
+1,1807,1 //Fist
+1,1808,1 //Fist
+1,1809,1 //Claw
+1,1810,1 //Claw
+1,1811,1 //Finger
+1,1812,1 //Finger
+1,1901,1 //Violin
+1,1902,1 //Violin
+1,1903,1 //Mandolin
+1,1904,1 //Mandolin
+1,1905,1 //Lute
+1,1906,1 //Lute
+1,1907,1 //Guitar
+1,1908,1 //Guitar
+1,1909,1 //Harp
+1,1910,1 //Harp
+1,1911,1 //Gumoongoh
+1,1912,1 //Gumoongoh
+1,1950,1 //Rope
+1,1951,1 //Rope
+1,1952,1 //Whip
+1,1953,1 //Whip
+1,1954,1 //Wire Whip
+1,1955,1 //Wire Whip
+1,1956,1 //Rante Whip
+1,1957,1 //Rante Whip
+1,1958,1 //Tail Whip
+1,1959,1 //Tail Whip
+1,1960,1 //Whip
+1,1961,1 //Whip
+1,2201,1 //Sunglasses
+1,2203,1 //Glasses
+1,2205,1 //Diver Goggles
+1,2206,1 //Wedding Veil
+1,2207,1 //Fancy Flower
+1,2208,1 //Ribbon
+1,2209,1 //Ribbon
+1,2210,1 //Hair Band
+1,2211,1 //Bandana
+1,2212,1 //Eye Patch
+1,2213,1 //Kitty Band
+1,2214,1 //Bunny Band
+1,2215,1 //Flower Band
+1,2216,1 //Biretta
+1,2217,1 //Biretta
+1,2218,1 //Flu Mask
+1,2220,1 //Hat
+1,2221,1 //Hat
+1,2222,1 //Turban
+1,2223,1 //Turban
+1,2226,1 //Cap
+1,2227,1 //Cap
+1,2228,1 //Helm
+1,2229,1 //Helm
+1,2230,1 //Gemmed Sallet
+1,2231,1 //Gemmed Sallet
+1,2232,1 //Circlet
+1,2233,1 //Circlet
+1,2236,1 //Santa Hat
+1,2239,1 //Monocle
+1,2241,1 //Grandpa Beard
+1,2242,1 //Purple Glasses
+1,2243,1 //Geek Glasses
+1,2244,1 //Big Ribbon
+1,2245,1 //Sweet Gent
+1,2246,1 //Golden Gear
+1,2247,1 //Romantic Gent
+1,2248,1 //Western Grace
+1,2250,1 //Cute Ribbon
+1,2251,1 //Monk Hat
+1,2252,1 //Wizard Hat
+1,2253,1 //Sunflower
+1,2257,1 //Unicorn Horn
+1,2259,1 //Mini Propeller
+1,2260,1 //Mini Glasses
+1,2261,1 //Army Cap
+1,2262,1 //Clown Nose
+1,2263,1 //Zorro Masque
+1,2265,1 //Gangster Mask
+1,2266,1 //Iron Cain
+1,2267,1 //Cigarette
+1,2268,1 //Pipe
+1,2269,1 //Romantic Flower
+1,2270,1 //Romantic Leaf
+1,2271,1 //Jack be Dandy
+1,2275,1 //Red Bandana
+1,2276,1 //Angled Glasses
+1,2277,1 //Nurse Cap
+1,2279,1 //Bomb Wick
+1,2282,1 //Halo
+1,2285,1 //Apple of Archer
+1,2287,1 //Pirate Bandana
+1,2289,1 //Poo Poo Hat
+1,2290,1 //Funeral Hat
+1,2291,1 //Masquerade
+1,2294,1 //Stellar
+1,2295,1 //Blinker
+1,2298,1 //Green Feeler
+1,2299,1 //Orc Helm
+1,5003,1 //Joker Jester
+1,5006,1 //Machoman's Glasses
+1,5008,1 //Puppy Love
+1,5009,1 //Safety Helmet
+1,5010,1 //Indian Fillet
+1,5011,1 //Aerial
+1,5014,1 //Fin Helm
+1,5015,1 //Egg Shell
+1,5030,1 //Panda Hat
+1,5035,1 //Poring Hat
+1,5037,1 //Nutshell
+1,5055,1 //Novice False Eggshell
+1,2278,1 //Mr. Smile
+1,2288,1 //Mr. Scream
+1,2297,1 //Goblin Mask
+1,5005,1 //Gas Mask
+1,5088,1 //Surprised Mask
+1,5089,1 //Annoyed Mask
+1,5090,1 //Goblin Leader Mask
+1,2224,1 //Goggles
+1,2225,1 //Goggles
+1,10001,1 //Skull Helm
+1,10002,1 //Monster Oxygen Mask
+1,10003,1 //Transparent Headgear
+1,10004,1 //Pacifier
+1,10005,1 //Wig
+1,10006,1 //Queen's Hair Ornament
+1,10007,1 //Silk Ribbon
+1,10008,1 //Punisher
+1,10009,1 //Wild Flower
+1,10010,1 //Battered Pot
+1,10011,1 //Stellar Hairpin
+1,10012,1 //Tiny Egg Shell
+1,10013,1 //Backpack
+1,10014,1 //Rocker Glasses
+1,10015,1 //Green Lace
+1,10016,1 //Golden Bell
+1,10017,1 //Bark Shorts
+1,10018,1 //Monkey Circlet
+1,10019,1 //Red Scarf
+1,10020,1 //Grave Keeper's Sword
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,2101,1 //Guard
+1,2102,1 //Guard
+1,2103,1 //Buckler
+1,2104,1 //Buckler
+1,2105,1 //Shield
+1,2106,1 //Shield
+1,2107,1 //Mirror Shield
+1,2108,1 //Mirror Shield
+1,2109,1 //Memory Book
+1,2112,1 //Novice Guard
+1,2301,1 //Cotton Shirt
+1,2302,1 //Cotton Shirt
+1,2303,1 //Jacket
+1,2304,1 //Jacket
+1,2305,1 //Adventurer's Suit
+1,2306,1 //Adventurer's Suit
+1,2307,1 //Mantle
+1,2308,1 //Mantle
+1,2309,1 //Coat
+1,2310,1 //Coat
+1,2311,1 //Mink Coat
+1,2312,1 //Padded Armor
+1,2313,1 //Padded Armor
+1,2314,1 //Chain Mail
+1,2315,1 //Chain Mail
+1,2316,1 //Full Plate
+1,2317,1 //Full Plate
+1,2318,1 //Lord's Clothes
+1,2320,1 //Formal Suit
+1,2321,1 //Silk Robe
+1,2322,1 //Silk Robe
+1,2323,1 //Scapulare
+1,2324,1 //Scapulare
+1,2325,1 //Saint's Robe
+1,2326,1 //Saint's Robe
+1,2328,1 //Wooden Mail
+1,2329,1 //Wooden Mail
+1,2330,1 //Tights
+1,2331,1 //Tights
+1,2332,1 //Silver Robe
+1,2333,1 //Silver Robe
+1,2335,1 //Thief Clothes
+1,2336,1 //Thief Clothes
+1,2337,1 //Ninja Suit
+1,2338,1 //Wedding Dress
+1,2339,1 //Pantie
+1,2340,1 //Novice Breastplate
+1,2341,1 //Legion Plate Armor
+1,2352,1 //Tattered Novice Ninja Suit
+1,2401,1 //Sandals
+1,2402,1 //Sandals
+1,2403,1 //Shoes
+1,2404,1 //Shoes
+1,2405,1 //Boots
+1,2406,1 //Boots
+1,2407,1 //Crystal Pumps
+1,2408,1 //Shackles
+1,2409,1 //High Heels
+1,2411,1 //Greaves
+1,2414,1 //Novice Slippers
+1,2501,1 //Hood
+1,2502,1 //Hood
+1,2503,1 //Muffler
+1,2504,1 //Muffler
+1,2505,1 //Manteau
+1,2506,1 //Manteau
+1,2507,1 //Ancient Cape
+1,2508,1 //Ragamuffin Manteau
+1,2510,1 //Somber Novice Hood
+1,2601,1 //Ring
+1,2602,1 //Earring
+1,2603,1 //Necklace
+1,2604,1 //Glove
+1,2605,1 //Brooch
+1,2607,1 //Clip
+1,2608,1 //Rosary
+1,2609,1 //Skull Ring
+1,2610,1 //Gold Ring
+1,2611,1 //Silver Ring
+1,2612,1 //Flower Ring
+1,2613,1 //Diamond Ring
+1,2617,1 //Celebrant's Mitten
+1,2618,1 //Matyr's Leash
+1,2627,1 //Belt
+1,2628,1 //Novice Armlet
+1,1116,1 //Katana
+1,1117,1 //Katana
+1,1151,1 //Slayer
+1,1152,1 //Slayer
+1,1154,1 //Bastard Sword
+1,1155,1 //Bastard Sword
+1,1157,1 //Two-Handed Sword
+1,1158,1 //Two-Handed Sword
+1,1160,1 //Broad Sword
+1,1162,1 //Broad Sword
+1,1163,1 //Claymore
+1,1250,1 //Jur
+1,1251,1 //Jur
+1,1252,1 //Katar
+1,1253,1 //Katar
+1,1254,1 //Jamadhar
+1,1255,1 //Jamadhar
+1,1256,1 //Katar of Frozen Icicle
+1,1257,1 //Katar of Quaking
+1,1258,1 //Katar of Raging Blaze
+1,1259,1 //Katar of Piercing Wind
+1,1351,1 //Battle Axe
+1,1352,1 //Battle Axe
+1,1354,1 //Hammer
+1,1355,1 //Hammer
+1,1357,1 //Buster
+1,1358,1 //Buster
+1,1360,1 //Two-Handed Axe
+1,1361,1 //Two-Handed Axe
+1,1410,1 //Lance
+1,1411,1 //Lance
+1,1451,1 //Guisarme
+1,1452,1 //Guisarme
+1,1454,1 //Glaive
+1,1455,1 //Glaive
+1,1457,1 //Partizan
+1,1458,1 //Partizan
+1,1460,1 //Trident
+1,1461,1 //Trident
+1,1463,1 //Halberd
+1,1464,1 //Halberd
+1,1472,1 //Soul Staff
+1,1701,1 //Bow
+1,1702,1 //Bow
+1,1704,1 //Composite Bow
+1,1705,1 //Composite Bow
+1,1707,1 //Great Bow
+1,1708,1 //Great Bow
+1,1710,1 //Crossbow
+1,1711,1 //Crossbow
+1,1713,1 //Arbalest
+1,1714,1 //Gakkung Bow
+1,1715,1 //Arbalest
+1,1716,1 //Gakkung Bow
+1,1718,1 //Hunter Bow
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1201,1 //Knife
+1,1202,1 //Knife
+1,1204,1 //Cutter
+1,1205,1 //Cutter
+1,1207,1 //Main Gauche
+1,1208,1 //Main Gauche
+1,1210,1 //Dirk
+1,1211,1 //Dirk
+1,1213,1 //Dagger
+1,1214,1 //Dagger
+1,1216,1 //Stiletto
+1,1217,1 //Stiletto
+1,1219,1 //Gladius
+1,1220,1 //Gladius
+1,1222,1 //Damascus
+1,1226,1 //Damascus
+1,1243,1 //Novice Main Gauche
+1,1301,1 //Axe
+1,1302,1 //Axe
+1,1304,1 //Orcish Axe
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1550,1 //Book
+1,1551,1 //Bible
+1,1552,1 //Tablet
+1,1553,1 //Book of Billows
+1,1554,1 //Book of Mother Earth
+1,1555,1 //Book of the Blazing Sun
+1,1556,1 //Book of Gust of Wind
+1,1558,1 //Girl's Diary
+1,1601,1 //Rod
+1,1602,1 //Rod
+1,1604,1 //Wand
+1,1605,1 //Wand
+1,1607,1 //Staff
+1,1608,1 //Staff
+1,1610,1 //Arc Wand
+1,1611,1 //Arc Wand
+1,1613,1 //Mighty Staff
+1,1614,1 //Wand of Occult
+1,1615,1 //Evil Bone Wand
+1,1801,1 //Waghnak
+1,1802,1 //Waghnak
+1,1803,1 //Knuckle Duster
+1,1804,1 //Knuckle Duster
+1,1805,1 //Studded Knuckles
+1,1806,1 //Studded Knuckles
+1,1807,1 //Fist
+1,1808,1 //Fist
+1,1809,1 //Claw
+1,1810,1 //Claw
+1,1811,1 //Finger
+1,1812,1 //Finger
+1,1901,1 //Violin
+1,1902,1 //Violin
+1,1903,1 //Mandolin
+1,1904,1 //Mandolin
+1,1905,1 //Lute
+1,1906,1 //Lute
+1,1907,1 //Guitar
+1,1908,1 //Guitar
+1,1909,1 //Harp
+1,1910,1 //Harp
+1,1911,1 //Gumoongoh
+1,1912,1 //Gumoongoh
+1,1950,1 //Rope
+1,1951,1 //Rope
+1,1952,1 //Whip
+1,1953,1 //Whip
+1,1954,1 //Wire Whip
+1,1955,1 //Wire Whip
+1,1956,1 //Rante Whip
+1,1957,1 //Rante Whip
+1,1958,1 //Tail Whip
+1,1959,1 //Tail Whip
+1,1960,1 //Whip
+1,1961,1 //Whip
+1,2201,1 //Sunglasses
+1,2203,1 //Glasses
+1,2205,1 //Diver Goggles
+1,2206,1 //Wedding Veil
+1,2207,1 //Fancy Flower
+1,2208,1 //Ribbon
+1,2209,1 //Ribbon
+1,2210,1 //Hair Band
+1,2211,1 //Bandana
+1,2212,1 //Eye Patch
+1,2213,1 //Kitty Band
+1,2214,1 //Bunny Band
+1,2215,1 //Flower Band
+1,2216,1 //Biretta
+1,2217,1 //Biretta
+1,2218,1 //Flu Mask
+1,2220,1 //Hat
+1,2221,1 //Hat
+1,2222,1 //Turban
+1,2223,1 //Turban
+1,2226,1 //Cap
+1,2227,1 //Cap
+1,2228,1 //Helm
+1,2229,1 //Helm
+1,2230,1 //Gemmed Sallet
+1,2231,1 //Gemmed Sallet
+1,2232,1 //Circlet
+1,2233,1 //Circlet
+1,2236,1 //Santa Hat
+1,2239,1 //Monocle
+1,2241,1 //Grandpa Beard
+1,2242,1 //Purple Glasses
+1,2243,1 //Geek Glasses
+1,2244,1 //Big Ribbon
+1,2245,1 //Sweet Gent
+1,2246,1 //Golden Gear
+1,2247,1 //Romantic Gent
+1,2248,1 //Western Grace
+1,2250,1 //Cute Ribbon
+1,2251,1 //Monk Hat
+1,2252,1 //Wizard Hat
+1,2253,1 //Sunflower
+1,2257,1 //Unicorn Horn
+1,2259,1 //Mini Propeller
+1,2260,1 //Mini Glasses
+1,2261,1 //Army Cap
+1,2262,1 //Clown Nose
+1,2263,1 //Zorro Masque
+1,2265,1 //Gangster Mask
+1,2266,1 //Iron Cain
+1,2267,1 //Cigarette
+1,2268,1 //Pipe
+1,2269,1 //Romantic Flower
+1,2270,1 //Romantic Leaf
+1,2271,1 //Jack be Dandy
+1,2275,1 //Red Bandana
+1,2276,1 //Angled Glasses
+1,2277,1 //Nurse Cap
+1,2279,1 //Bomb Wick
+1,2282,1 //Halo
+1,2285,1 //Apple of Archer
+1,2287,1 //Pirate Bandana
+1,2289,1 //Poo Poo Hat
+1,2290,1 //Funeral Hat
+1,2291,1 //Masquerade
+1,2294,1 //Stellar
+1,2295,1 //Blinker
+1,2298,1 //Green Feeler
+1,2299,1 //Orc Helm
+1,5003,1 //Joker Jester
+1,5006,1 //Machoman's Glasses
+1,5008,1 //Puppy Love
+1,5009,1 //Safety Helmet
+1,5010,1 //Indian Fillet
+1,5011,1 //Aerial
+1,5014,1 //Fin Helm
+1,5015,1 //Egg Shell
+1,5030,1 //Panda Hat
+1,5035,1 //Poring Hat
+1,5037,1 //Nutshell
+1,5055,1 //Novice False Eggshell
+1,2278,1 //Mr. Smile
+1,2288,1 //Mr. Scream
+1,2297,1 //Goblin Mask
+1,5005,1 //Gas Mask
+1,5088,1 //Surprised Mask
+1,5089,1 //Annoyed Mask
+1,5090,1 //Goblin Leader Mask
+1,2224,1 //Goggles
+1,2225,1 //Goggles
+1,10001,1 //Skull Helm
+1,10002,1 //Monster Oxygen Mask
+1,10003,1 //Transparent Headgear
+1,10004,1 //Pacifier
+1,10005,1 //Wig
+1,10006,1 //Queen's Hair Ornament
+1,10007,1 //Silk Ribbon
+1,10008,1 //Punisher
+1,10009,1 //Wild Flower
+1,10010,1 //Battered Pot
+1,10011,1 //Stellar Hairpin
+1,10012,1 //Tiny Egg Shell
+1,10013,1 //Backpack
+1,10014,1 //Rocker Glasses
+1,10015,1 //Green Lace
+1,10016,1 //Golden Bell
+1,10017,1 //Bark Shorts
+1,10018,1 //Monkey Circlet
+1,10019,1 //Red Scarf
+1,10020,1 //Grave Keeper's Sword
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,2101,1 //Guard
+1,2102,1 //Guard
+1,2103,1 //Buckler
+1,2104,1 //Buckler
+1,2105,1 //Shield
+1,2106,1 //Shield
+1,2107,1 //Mirror Shield
+1,2108,1 //Mirror Shield
+1,2109,1 //Memory Book
+1,2112,1 //Novice Guard
+1,2301,1 //Cotton Shirt
+1,2302,1 //Cotton Shirt
+1,2303,1 //Jacket
+1,2304,1 //Jacket
+1,2305,1 //Adventurer's Suit
+1,2306,1 //Adventurer's Suit
+1,2307,1 //Mantle
+1,2308,1 //Mantle
+1,2309,1 //Coat
+1,2310,1 //Coat
+1,2311,1 //Mink Coat
+1,2312,1 //Padded Armor
+1,2313,1 //Padded Armor
+1,2314,1 //Chain Mail
+1,2315,1 //Chain Mail
+1,2316,1 //Full Plate
+1,2317,1 //Full Plate
+1,2318,1 //Lord's Clothes
+1,2320,1 //Formal Suit
+1,2321,1 //Silk Robe
+1,2322,1 //Silk Robe
+1,2323,1 //Scapulare
+1,2324,1 //Scapulare
+1,2325,1 //Saint's Robe
+1,2326,1 //Saint's Robe
+1,2328,1 //Wooden Mail
+1,2329,1 //Wooden Mail
+1,2330,1 //Tights
+1,2331,1 //Tights
+1,2332,1 //Silver Robe
+1,2333,1 //Silver Robe
+1,2335,1 //Thief Clothes
+1,2336,1 //Thief Clothes
+1,2337,1 //Ninja Suit
+1,2338,1 //Wedding Dress
+1,2339,1 //Pantie
+1,2340,1 //Novice Breastplate
+1,2341,1 //Legion Plate Armor
+1,2352,1 //Tattered Novice Ninja Suit
+1,2401,1 //Sandals
+1,2402,1 //Sandals
+1,2403,1 //Shoes
+1,2404,1 //Shoes
+1,2405,1 //Boots
+1,2406,1 //Boots
+1,2407,1 //Crystal Pumps
+1,2408,1 //Shackles
+1,2409,1 //High Heels
+1,2411,1 //Greaves
+1,2414,1 //Novice Slippers
+1,2501,1 //Hood
+1,2502,1 //Hood
+1,2503,1 //Muffler
+1,2504,1 //Muffler
+1,2505,1 //Manteau
+1,2506,1 //Manteau
+1,2507,1 //Ancient Cape
+1,2508,1 //Ragamuffin Manteau
+1,2510,1 //Somber Novice Hood
+1,2601,1 //Ring
+1,2602,1 //Earring
+1,2603,1 //Necklace
+1,2604,1 //Glove
+1,2605,1 //Brooch
+1,2607,1 //Clip
+1,2608,1 //Rosary
+1,2609,1 //Skull Ring
+1,2610,1 //Gold Ring
+1,2611,1 //Silver Ring
+1,2612,1 //Flower Ring
+1,2613,1 //Diamond Ring
+1,2617,1 //Celebrant's Mitten
+1,2618,1 //Matyr's Leash
+1,2627,1 //Belt
+1,2628,1 //Novice Armlet
+1,1116,1 //Katana
+1,1117,1 //Katana
+1,1151,1 //Slayer
+1,1152,1 //Slayer
+1,1154,1 //Bastard Sword
+1,1155,1 //Bastard Sword
+1,1157,1 //Two-Handed Sword
+1,1158,1 //Two-Handed Sword
+1,1160,1 //Broad Sword
+1,1162,1 //Broad Sword
+1,1163,1 //Claymore
+1,1250,1 //Jur
+1,1251,1 //Jur
+1,1252,1 //Katar
+1,1253,1 //Katar
+1,1254,1 //Jamadhar
+1,1255,1 //Jamadhar
+1,1256,1 //Katar of Frozen Icicle
+1,1257,1 //Katar of Quaking
+1,1258,1 //Katar of Raging Blaze
+1,1259,1 //Katar of Piercing Wind
+1,1351,1 //Battle Axe
+1,1352,1 //Battle Axe
+1,1354,1 //Hammer
+1,1355,1 //Hammer
+1,1357,1 //Buster
+1,1358,1 //Buster
+1,1360,1 //Two-Handed Axe
+1,1361,1 //Two-Handed Axe
+1,1410,1 //Lance
+1,1411,1 //Lance
+1,1451,1 //Guisarme
+1,1452,1 //Guisarme
+1,1454,1 //Glaive
+1,1455,1 //Glaive
+1,1457,1 //Partizan
+1,1458,1 //Partizan
+1,1460,1 //Trident
+1,1461,1 //Trident
+1,1463,1 //Halberd
+1,1464,1 //Halberd
+1,1472,1 //Soul Staff
+1,1701,1 //Bow
+1,1702,1 //Bow
+1,1704,1 //Composite Bow
+1,1705,1 //Composite Bow
+1,1707,1 //Great Bow
+1,1708,1 //Great Bow
+1,1710,1 //Crossbow
+1,1711,1 //Crossbow
+1,1713,1 //Arbalest
+1,1714,1 //Gakkung Bow
+1,1715,1 //Arbalest
+1,1716,1 //Gakkung Bow
+1,1718,1 //Hunter Bow
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1101,1 //Sword
+1,1102,1 //Sword
+1,1104,1 //Falchion
+1,1105,1 //Falchion
+1,1107,1 //Blade
+1,1108,1 //Blade
+1,1110,1 //Rapier
+1,1111,1 //Rapier
+1,1113,1 //Scimitar
+1,1114,1 //Scimitar
+1,1119,1 //Tsurugi
+1,1120,1 //Tsurugi
+1,1122,1 //Ring Pommel Saber
+1,1123,1 //Haedonggum
+1,1124,1 //Orcish sword
+1,1125,1 //Ring Pommel Saber
+1,1126,1 //Saber
+1,1127,1 //Saber
+1,1128,1 //Haedonggum
+1,1129,1 //Flamberge
+1,1201,1 //Knife
+1,1202,1 //Knife
+1,1204,1 //Cutter
+1,1205,1 //Cutter
+1,1207,1 //Main Gauche
+1,1208,1 //Main Gauche
+1,1210,1 //Dirk
+1,1211,1 //Dirk
+1,1213,1 //Dagger
+1,1214,1 //Dagger
+1,1216,1 //Stiletto
+1,1217,1 //Stiletto
+1,1219,1 //Gladius
+1,1220,1 //Gladius
+1,1222,1 //Damascus
+1,1226,1 //Damascus
+1,1243,1 //Novice Main Gauche
+1,1301,1 //Axe
+1,1302,1 //Axe
+1,1304,1 //Orcish Axe
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1401,1 //Javelin
+1,1402,1 //Javelin
+1,1404,1 //Spear
+1,1405,1 //Spear
+1,1407,1 //Pike
+1,1408,1 //Pike
+1,1501,1 //Club
+1,1502,1 //Club
+1,1504,1 //Mace
+1,1505,1 //Mace
+1,1507,1 //Smasher
+1,1508,1 //Smasher
+1,1510,1 //Flail
+1,1511,1 //Flail
+1,1513,1 //Morning Star
+1,1514,1 //Morning Star
+1,1516,1 //Sword Mace
+1,1517,1 //Sword Mace
+1,1519,1 //Chain
+1,1520,1 //Chain
+1,1522,1 //Stunner
+1,1550,1 //Book
+1,1551,1 //Bible
+1,1552,1 //Tablet
+1,1553,1 //Book of Billows
+1,1554,1 //Book of Mother Earth
+1,1555,1 //Book of the Blazing Sun
+1,1556,1 //Book of Gust of Wind
+1,1558,1 //Girl's Diary
+1,1601,1 //Rod
+1,1602,1 //Rod
+1,1604,1 //Wand
+1,1605,1 //Wand
+1,1607,1 //Staff
+1,1608,1 //Staff
+1,1610,1 //Arc Wand
+1,1611,1 //Arc Wand
+1,1613,1 //Mighty Staff
+1,1614,1 //Wand of Occult
+1,1615,1 //Evil Bone Wand
+1,1801,1 //Waghnak
+1,1802,1 //Waghnak
+1,1803,1 //Knuckle Duster
+1,1804,1 //Knuckle Duster
+1,1805,1 //Studded Knuckles
+1,1806,1 //Studded Knuckles
+1,1807,1 //Fist
+1,1808,1 //Fist
+1,1809,1 //Claw
+1,1810,1 //Claw
+1,1811,1 //Finger
+1,1812,1 //Finger
+1,1901,1 //Violin
+1,1902,1 //Violin
+1,1903,1 //Mandolin
+1,1904,1 //Mandolin
+1,1905,1 //Lute
+1,1906,1 //Lute
+1,1907,1 //Guitar
+1,1908,1 //Guitar
+1,1909,1 //Harp
+1,1910,1 //Harp
+1,1911,1 //Gumoongoh
+1,1912,1 //Gumoongoh
+1,1950,1 //Rope
+1,1951,1 //Rope
+1,1952,1 //Whip
+1,1953,1 //Whip
+1,1954,1 //Wire Whip
+1,1955,1 //Wire Whip
+1,1956,1 //Rante Whip
+1,1957,1 //Rante Whip
+1,1958,1 //Tail Whip
+1,1959,1 //Tail Whip
+1,1960,1 //Whip
+1,1961,1 //Whip
+1,2201,1 //Sunglasses
+1,2203,1 //Glasses
+1,2205,1 //Diver Goggles
+1,2206,1 //Wedding Veil
+1,2207,1 //Fancy Flower
+1,2208,1 //Ribbon
+1,2209,1 //Ribbon
+1,2210,1 //Hair Band
+1,2211,1 //Bandana
+1,2212,1 //Eye Patch
+1,2213,1 //Kitty Band
+1,2214,1 //Bunny Band
+1,2215,1 //Flower Band
+1,2216,1 //Biretta
+1,2217,1 //Biretta
+1,2218,1 //Flu Mask
+1,2220,1 //Hat
+1,2221,1 //Hat
+1,2222,1 //Turban
+1,2223,1 //Turban
+1,2226,1 //Cap
+1,2227,1 //Cap
+1,2228,1 //Helm
+1,2229,1 //Helm
+1,2230,1 //Gemmed Sallet
+1,2231,1 //Gemmed Sallet
+1,2232,1 //Circlet
+1,2233,1 //Circlet
+1,2236,1 //Santa Hat
+1,2239,1 //Monocle
+1,2241,1 //Grandpa Beard
+1,2242,1 //Purple Glasses
+1,2243,1 //Geek Glasses
+1,2244,1 //Big Ribbon
+1,2245,1 //Sweet Gent
+1,2246,1 //Golden Gear
+1,2247,1 //Romantic Gent
+1,2248,1 //Western Grace
+1,2250,1 //Cute Ribbon
+1,2251,1 //Monk Hat
+1,2252,1 //Wizard Hat
+1,2253,1 //Sunflower
+1,2257,1 //Unicorn Horn
+1,2259,1 //Mini Propeller
+1,2260,1 //Mini Glasses
+1,2261,1 //Army Cap
+1,2262,1 //Clown Nose
+1,2263,1 //Zorro Masque
+1,2265,1 //Gangster Mask
+1,2266,1 //Iron Cain
+1,2267,1 //Cigarette
+1,2268,1 //Pipe
+1,2269,1 //Romantic Flower
+1,2270,1 //Romantic Leaf
+1,2271,1 //Jack be Dandy
+1,2275,1 //Red Bandana
+1,2276,1 //Angled Glasses
+1,2277,1 //Nurse Cap
+1,2279,1 //Bomb Wick
+1,2282,1 //Halo
+1,2285,1 //Apple of Archer
+1,2287,1 //Pirate Bandana
+1,2289,1 //Poo Poo Hat
+1,2290,1 //Funeral Hat
+1,2291,1 //Masquerade
+1,2294,1 //Stellar
+1,2295,1 //Blinker
+1,2298,1 //Green Feeler
+1,2299,1 //Orc Helm
+1,5003,1 //Joker Jester
+1,5006,1 //Machoman's Glasses
+1,5008,1 //Puppy Love
+1,5009,1 //Safety Helmet
+1,5010,1 //Indian Fillet
+1,5011,1 //Aerial
+1,5014,1 //Fin Helm
+1,5015,1 //Egg Shell
+1,5030,1 //Panda Hat
+1,5035,1 //Poring Hat
+1,5037,1 //Nutshell
+1,5055,1 //Novice False Eggshell
+1,2278,1 //Mr. Smile
+1,2288,1 //Mr. Scream
+1,2297,1 //Goblin Mask
+1,5005,1 //Gas Mask
+1,5088,1 //Surprised Mask
+1,5089,1 //Annoyed Mask
+1,5090,1 //Goblin Leader Mask
+1,2224,1 //Goggles
+1,2225,1 //Goggles
+1,10001,1 //Skull Helm
+1,10002,1 //Monster Oxygen Mask
+1,10003,1 //Transparent Headgear
+1,10004,1 //Pacifier
+1,10005,1 //Wig
+1,10006,1 //Queen's Hair Ornament
+1,10007,1 //Silk Ribbon
+1,10008,1 //Punisher
+1,10009,1 //Wild Flower
+1,10010,1 //Battered Pot
+1,10011,1 //Stellar Hairpin
+1,10012,1 //Tiny Egg Shell
+1,10013,1 //Backpack
+1,10014,1 //Rocker Glasses
+1,10015,1 //Green Lace
+1,10016,1 //Golden Bell
+1,10017,1 //Bark Shorts
+1,10018,1 //Monkey Circlet
+1,10019,1 //Red Scarf
+1,10020,1 //Grave Keeper's Sword
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,603,1 //Old Blue Box
+1,604,1 //Dead Branch
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,644,1 //Gift Box
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,701,1 //Ora Ora
+1,702,1 //Animal Gore
+1,703,1 //Hinalle
+1,704,1 //Aloe
+1,705,1 //Clover
+1,706,1 //Four Leaf Clover
+1,707,1 //Singing Plant
+1,708,1 //Ment
+1,710,1 //Illusion Flower
+1,711,1 //Shoot
+1,712,1 //Flower
+1,713,1 //Empty Bottle
+1,714,1 //Emperium
+1,715,1 //Yellow Gemstone
+1,716,1 //Red Gemstone
+1,717,1 //Blue Gemstone
+1,718,1 //Garnet
+1,719,1 //Amethyst
+1,720,1 //Aquamarine
+1,721,1 //Emerald
+1,722,1 //Pearl
+1,723,1 //Ruby
+1,724,1 //Cursed Ruby
+1,725,1 //Sardonyx
+1,726,1 //Sapphire
+1,727,1 //Opal
+1,728,1 //Topaz
+1,729,1 //Zircon
+1,730,1 //1carat Diamond
+1,731,1 //2carat Diamond
+1,732,1 //3carat Diamond
+1,733,1 //Cracked Diamond
+1,734,1 //Red Frame
+1,735,1 //Chung Jah
+1,736,1 //China
+1,737,1 //Black Ladle
+1,738,1 //Pencil Case
+1,739,1 //Rouge
+1,740,1 //Puppet
+1,741,1 //Poring Doll
+1,742,1 //Chonchon Doll
+1,743,1 //Spore Doll
+1,744,1 //Bouquet
+1,745,1 //Wedding Bouquet
+1,746,1 //Glass Bead
+1,747,1 //Crystal Mirror
+1,748,1 //Witherless Rose
+1,749,1 //Frozen Rose
+1,750,1 //Baphomet Doll
+1,751,1 //Osiris Doll
+1,752,1 //Grasshopper Doll
+1,753,1 //Yoyo Doll
+1,754,1 //Raccoon Doll
+1,756,1 //Rough Oridecon
+1,757,1 //Rough Elunium
+1,901,1 //Danggie
+1,902,1 //Tree Root
+1,903,1 //Reptile Tongue
+1,904,1 //Scorpion Tail
+1,905,1 //Stem
+1,906,1 //Pointed Scale
+1,907,1 //Resin
+1,908,1 //Spawn
+1,909,1 //Jellopy
+1,910,1 //Garlet
+1,911,1 //Scell
+1,912,1 //Zargon
+1,913,1 //Tooth of Bat
+1,914,1 //Fluff
+1,915,1 //Chrysalis
+1,916,1 //Feather of Birds
+1,917,1 //Talon
+1,918,1 //Sticky Webfoot
+1,919,1 //Animal Skin
+1,920,1 //Wolf Claw
+1,921,1 //Mushroom Spore
+1,922,1 //Orc's Fang
+1,923,1 //Evil Horn
+1,924,1 //Powder of Butterfly
+1,925,1 //Bill of Birds
+1,926,1 //Snake Scale
+1,928,1 //Insect Feeler
+1,929,1 //Immortal Heart
+1,930,1 //Rotten Bandage
+1,931,1 //Orcish Voucher
+1,932,1 //Skel-Bone
+1,934,1 //Memento
+1,935,1 //Shell
+1,936,1 //Scale Shell
+1,937,1 //Venom Canine
+1,938,1 //Sticky Mucus
+1,939,1 //Bee Sting
+1,940,1 //Grasshopper's Leg
+1,941,1 //Nose Ring
+1,942,1 //Yoyo Tail
+1,943,1 //Solid Shell
+1,944,1 //Horseshoe
+1,945,1 //Raccoon Leaf
+1,946,1 //Snail's Shell
+1,947,1 //Horn
+1,948,1 //Bear's Footskin
+1,949,1 //Feather
+1,950,1 //Heart of Mermaid
+1,951,1 //Fin
+1,952,1 //Cactus Needle
+1,953,1 //Stone Heart
+1,954,1 //Shining Scale
+1,955,1 //Worm Peeling
+1,956,1 //Gill
+1,957,1 //Decayed Nail
+1,958,1 //Horrendous Mouth
+1,959,1 //Stinky Scale
+1,960,1 //Nipper
+1,961,1 //Conch
+1,962,1 //Tentacle
+1,963,1 //Sharp Scale
+1,964,1 //Crab Shell
+1,965,1 //Clam Shell
+1,966,1 //Clam Flesh
+1,967,1 //Turtle Shell
+1,968,1 //Heroic Emblem
+1,969,1 //Gold
+1,970,1 //Alcohol
+1,971,1 //Detrimindexta
+1,972,1 //Karvodailnirol
+1,973,1 //Counteragent
+1,974,1 //Mixture
+1,975,1 //Scarlet Dyestuff
+1,976,1 //Lemon Dyestuff
+1,978,1 //Cobaltblue Dyestuff
+1,979,1 //Darkgreen Dyestuff
+1,980,1 //Orange Dyestuff
+1,981,1 //Violet Dyestuff
+1,982,1 //White Dyestuff
+1,983,1 //Black Dyestuff
+1,984,1 //Oridecon
+1,985,1 //Elunium
+1,986,1 //Anvil
+1,987,1 //Oridecon Anvil
+1,988,1 //Golden Anvil
+1,989,1 //Emperium Anvil
+1,990,1 //Red Blood
+1,991,1 //Crystal Blue
+1,992,1 //Wind of Verdure
+1,993,1 //Green Live
+1,994,1 //Flame Heart
+1,995,1 //Mystic Frozen
+1,996,1 //Rough Wind
+1,997,1 //Great Nature
+1,998,1 //Iron
+1,999,1 //Steel
+1,1000,1 //Star Crumb
+1,1001,1 //Star Dust
+1,1002,1 //Iron Ore
+1,1003,1 //Coal
+1,1004,1 //Chivalry Emblem
+1,1005,1 //Hammer of Blacksmith
+1,1006,1 //Old Magicbook
+1,1007,1 //Necklace of Wisdom
+1,1008,1 //Necklace of Oblivion
+1,1009,1 //Hand of God
+1,1010,1 //Phracon
+1,1011,1 //Emveretarcon
+1,1012,1 //Frill
+1,1013,1 //Rainbow Shell
+1,1014,1 //Ant Jaw
+1,1015,1 //Tongue
+1,1016,1 //Rat Tail
+1,1017,1 //Mole Whiskers
+1,1018,1 //Mole Claw
+1,1019,1 //Trunk
+1,1020,1 //Black Hair
+1,1021,1 //Dokebi Horn
+1,1022,1 //Nine Tails
+1,1023,1 //Fish Tail
+1,1024,1 //Squid Ink
+1,1025,1 //Cobweb
+1,1026,1 //Acorn
+1,1027,1 //Porcupine Quill
+1,1028,1 //Mane
+1,1029,1 //Tiger Skin
+1,1030,1 //Tiger's Footskin
+1,1031,1 //Mantis Scythe
+1,1032,1 //Maneater Blossom
+1,1033,1 //Maneater Root
+1,1034,1 //Blue Hair
+1,1035,1 //Dragon Canine
+1,1036,1 //Dragon Scale
+1,1037,1 //Dragon Tail
+1,1038,1 //Little Evil Horn
+1,1039,1 //Little Evil Wing
+1,1040,1 //Elder Pixie's Moustache
+1,1041,1 //Lantern
+1,1042,1 //Bug Leg
+1,1043,1 //Orc Claw
+1,1044,1 //Zenorc's Fang
+1,1045,1 //Cultish Masque
+1,1046,1 //Scorpion Nipper
+1,1047,1 //Dead Medusa
+1,1048,1 //Horrendous Hair
+1,1049,1 //Skirt of Virgin
+1,1050,1 //Tendon
+1,1051,1 //Detonator
+1,1052,1 //Single Cell
+1,1053,1 //Ancient Tooth
+1,1054,1 //Ancient Lips
+1,1055,1 //Earthworm Peeling
+1,1056,1 //Grit
+1,1057,1 //Moth Dust
+1,1058,1 //Moth Wings
+1,1059,1 //Fabric
+1,1060,1 //Golden Hair
+1,1061,1 //Witched Starsand
+1,1062,1 //Jack o' Pumpkin
+1,1063,1 //Fang
+1,1064,1 //Reins
+1,1065,1 //Trap
+1,1066,1 //Fine-grained Trunk
+1,1067,1 //Solid Trunk
+1,1068,1 //Barren Trunk
+1,1088,1 //Morocc Solution
+1,1089,1 //Payon Solution
+1,1092,1 //Empty Test Tube
+1,1093,1 //Empty Potion Bottle
+1,1094,1 //Short Daenggie
+1,1095,1 //Clock Hand
+1,1096,1 //Round Shell
+1,1097,1 //Worn Out Page
+1,1098,1 //Manacles
+1,1099,1 //Worn-out Prison Uniform
+1,7001,1 //Mould Powder
+1,7002,1 //Ogre Tooth
+1,7003,1 //Anolian Skin
+1,7004,1 //Mud Lump
+1,7005,1 //Skull
+1,7006,1 //Wing of Red Bat
+1,7007,1 //Claw of Rat
+1,7008,1 //Stiff Horn
+1,7009,1 //Glitter Shell
+1,7010,1 //Tail of Steel Scorpion
+1,7011,1 //Claw of Monkey
+1,7012,1 //Tough Scalelike Stem
+1,7013,1 //Coral Reef
+1,7014,1 //Old Portrait
+1,7015,1 //Memory Bookmark
+1,7016,1 //Bent Spoon
+1,7026,1 //Clock_Tower_Key
+1,7027,1 //Key of the Underground
+1,7030,1 //Claw of Desert Wolf
+1,7031,1 //Old Frying Pan
+1,7032,1 //Piece of Egg Shell
+1,7033,1 //Poison Spore
+1,7034,1 //Red Stocking
+1,7035,1 //Matchstick
+1,7036,1 //Fang of Garm
+1,7038,1 //Yarn
+1,7041,1 //Fine Grit
+1,7047,1 //Alice's Apron
+1,7048,1 //Talon of Griffon
+1,7049,1 //Stone
+1,7053,1 //Cyfar
+1,7054,1 //Brigan
+1,7059,1 //Free Ticket for Kafra Storage
+1,7060,1 //Free Ticket for Kafra Transportation
+1,7061,1 //Free Ticket for the Cart Service
+1,7063,1 //Soft Feather
+1,7064,1 //Wing of Dragonfly
+1,7065,1 //Sea-Otter Fur
+1,7066,1 //Ice Cubic
+1,7067,1 //Stone Fragment
+1,7068,1 //Burnt Tree
+1,7069,1 //Destroyed Armor
+1,7070,1 //Broken Shell
+1,7071,1 //Tattered Clothes
+1,7072,1 //Old Shuriken
+1,7093,1 //Cogwheel
+1,7094,1 //Fragment
+1,7095,1 //Metal Fragment
+1,7096,1 //Lava
+1,7097,1 //Burning Heart
+1,7098,1 //Live Coal
+1,7099,1 //Worn-out Magic Scroll
+1,7100,1 //Sharp Leaf
+1,7101,1 //Peco Peco Feather
+1,7106,1 //Antelope Horn
+1,7107,1 //Antelope Skin
+1,7108,1 //Piece of Shield
+1,7109,1 //Shining Spear Blade
+1,7110,1 //Broken Sword
+1,7111,1 //Slick Paper
+1,7112,1 //Sharp Paper
+1,7113,1 //Broken Pharaoh Emblem
+1,7114,1 //Masque of Tutankhamen
+1,7115,1 //Harpy Feather
+1,7116,1 //Harpy Talon
+1,7117,1 //Torn Magic Book
+1,7118,1 //Torn Scroll
+1,7119,1 //Bacillus
+1,7120,1 //Burning Horseshoe
+1,7121,1 //Honey Pot
+1,7122,1 //Burning Hair
+1,7123,1 //Dragon Skin
+1,7124,1 //Sand Clump
+1,7125,1 //Scorpion Claw
+1,7126,1 //Large Jellopy
+1,7134,1 //Medicine Bowl
+1,7135,1 //Fire Bottle
+1,7136,1 //Acid Bottle
+1,7137,1 //Plant Bottle
+1,7138,1 //Marine Sphere Bottle
+1,7139,1 //Glistening Coat
+1,7149,1 //Yellow Plate
+1,7150,1 //Piece of Bamboo
+1,7151,1 //Oil Paper
+1,7152,1 //Glossy Hair
+1,7153,1 //Worn-out Kimono
+1,7154,1 //Poisonous Powder
+1,7155,1 //Poisonous Toad Skin
+1,7156,1 //Broken Shuriken
+1,7157,1 //Dark Mask
+1,7158,1 //Broken Liquor Jar
+1,7159,1 //Tengu Nose
+1,7161,1 //Black Bear Skin
+1,7162,1 //Cloud Crumb
+1,7163,1 //Hard Feeler
+1,7164,1 //Solid_Peach
+1,7165,1 //Transparent Celestial Robe
+1,7166,1 //Soft Silk
+1,7167,1 //Strange Steel Piece
+1,7168,1 //Giant Butterfly Wing
+1,7169,1 //Ba_Gua
+1,7170,1 //Tuxedo
+1,7171,1 //Leopard Skin
+1,7172,1 //Leopard Claw
+1,7174,1 //Wrapping Lace
+1,7175,1 //Wrapping Paper
+1,7182,1 //Cacao
+1,7186,1 //Thin Trunk
+1,7187,1 //Festival Mask
+1,7188,1 //Brown_Root
+1,7189,1 //Wooden Heart
+1,7190,1 //Solid Husk
+1,7191,1 //Lamp
+1,7192,1 //Vane
+1,7193,1 //Sprout
+1,7194,1 //Soft Blade of Grass
+1,7195,1 //Slingshot
+1,7196,1 //Shoulder Protector
+1,7197,1 //Tough Vines
+1,7198,1 //Huge Leaf
+1,7200,1 //Elastic Band
+1,7201,1 //Log
+1,7202,1 //Pincher of Beetle
+1,7203,1 //Strong Branch
+1,7205,1 //Piece of Black Cloth
+1,7206,1 //Black Cat Doll
+1,7207,1 //Old Manteau
+1,7208,1 //Rusty Kitchen Knife
+1,7209,1 //Helm of Dullahan
+1,7210,1 //Armor Piece of Dullahan
+1,7211,1 //Fragment of Rossata Stone
+1,7212,1 //Hung Doll
+1,7213,1 //Needle Packet
+1,7214,1 //Bat Cage
+1,7215,1 //Broken Needle
+1,7216,1 //Red Muffler
+1,7217,1 //Spool
+1,7218,1 //Decomposed Rope
+1,7219,1 //Striped Sock
+1,7220,1 //Ectoplasm
+1,7221,1 //Tangled Chains
+1,7222,1 //Wooden Gnarl
+1,7223,1 //Contorted Self-Portrait
+1,7225,1 //Pumpkin Lantern
+1,7262,1 //Folding Fan of Cat Ghost
+1,7263,1 //Cat's Eye
+1,7264,1 //Dry Sand
+1,7265,1 //Dragon Horn
+1,7266,1 //Denture from Dragon Mask
+1,7267,1 //Tiger Panty
+1,7268,1 //Little Ghost Doll
+1,7269,1 //Pinafore
+1,7270,1 //Nursing_Bottle
+1,1750,1 //Arrow
+1,1751,1 //Silver Arrow
+1,1752,1 //Fire Arrow
+1,1753,1 //Steel Arrow
+1,1754,1 //Crystal Arrow
+1,1755,1 //Arrow of Wind
+1,1756,1 //Stone Arrow
+1,1757,1 //Immaterial Arrow
+1,1758,1 //Stun Arrow
+1,1759,1 //Frozen Arrow
+1,1760,1 //Flash Arrow
+1,1761,1 //Cursed Arrow
+1,1762,1 //Rusty Arrow
+1,1763,1 //Poison Arrow
+1,1764,1 //Sharp Arrow
+1,1765,1 //Oridecon Arrow
+1,1767,1 //Shadow Arrow
+1,1768,1 //Sleep Arrow
+1,1769,1 //Mute Arrow
+1,1770,1 //Iron Arrow
+1,501,1 //Red Potion
+1,502,1 //Orange Potion
+1,503,1 //Yellow Potion
+1,504,1 //White Potion
+1,505,1 //Blue Potion
+1,506,1 //Green Potion
+1,507,1 //Red Herb
+1,508,1 //Yellow Herb
+1,509,1 //White Herb
+1,510,1 //Blue Herb
+1,511,1 //Green Herb
+1,512,1 //Apple
+1,513,1 //Banana
+1,514,1 //Grape
+1,515,1 //Carrot
+1,516,1 //Potato
+1,517,1 //Meat
+1,518,1 //Honey
+1,519,1 //Milk
+1,520,1 //Hinalle Leaflet
+1,521,1 //Aloe Leaflet
+1,522,1 //Mastela Fruit
+1,523,1 //Holy Water
+1,525,1 //Panacea
+1,526,1 //Royal Jelly
+1,528,1 //Monster Food
+1,529,1 //Candy
+1,530,1 //Candy Cane
+1,531,1 //Apple Juice
+1,532,1 //Banana Juice
+1,533,1 //Grape Juice
+1,534,1 //Carrot Juice
+1,535,1 //Pumpkin
+1,536,1 //Ice Cream
+1,537,1 //Pet Food
+1,538,1 //Well-baked Cookie
+1,539,1 //Piece of Cake
+1,544,1 //Raw Fish
+1,545,1 //Condensed Red Potion
+1,546,1 //Condensed Yellow Potion
+1,547,1 //Condensed White Potion
+1,548,1 //Cheese
+1,549,1 //Yam
+1,550,1 //Rice Cake
+1,551,1 //Sushi
+1,553,1 //Bao
+1,555,1 //Traditional Rice Cake
+1,558,1 //Chocolate
+1,561,1 //White Chocolate
+1,601,1 //Fly Wing
+1,602,1 //Butterfly Wing
+1,605,1 //Anodyne
+1,606,1 //Aloevera
+1,607,1 //Yggdrasil Berry
+1,608,1 //Yggdrasil Seed
+1,609,1 //Amulet
+1,610,1 //Yggdrasil Leaf
+1,611,1 //Magnifier
+1,612,1 //Mini Furnace
+1,613,1 //Iron Hammer
+1,614,1 //Golden Hammer
+1,615,1 //Oridecon Hammer
+1,618,1 //Worn Out Scroll
+1,619,1 //Unripe Apple
+1,620,1 //Orange Juice
+1,621,1 //Bitter Herb
+1,622,1 //Rainbow Carrot
+1,623,1 //Earthworm the Dude
+1,624,1 //Rotten Fish
+1,625,1 //Rusty Iron
+1,626,1 //Monster Juice
+1,627,1 //Sweet Milk
+1,628,1 //Well-Dried Bone
+1,629,1 //Singing Flower
+1,630,1 //Dew Laden Moss
+1,631,1 //Deadly Noxious Herb
+1,632,1 //Fatty Chubby Earthworm
+1,633,1 //Sweet Potato
+1,634,1 //Tropical Banana
+1,635,1 //Orc Trophy
+1,636,1 //No Recipient
+1,637,1 //Old Broom
+1,638,1 //Silver Knife of Chastity
+1,639,1 //Armlet of Obedience
+1,640,1 //Shining Stone
+1,641,1 //Contracts in Shadow
+1,642,1 //Book of the Devil
+1,643,1 //Pet Incubator
+1,645,1 //Concentration Potion
+1,656,1 //Awakening Potion
+1,657,1 //Berserk Potion
+1,659,1 //Her Heart
+1,663,1 //Songpyun
+1,664,1 //Gift Box
+1,665,1 //Gift Box
+1,666,1 //Gift Box
+1,667,1 //Gift Box
+1,668,1 //Red_Envelope
+1,678,1 //Poison Bottle
+1,679,1 //Pilule
+1,2249,1 //Coronet
+1,2254,1 //Angel Wing
+1,2255,1 //Evil Wing
+1,2258,1 //Spiky Band
+1,2274,1 //Ghost Bandana
+1,2621,1 //Ring
+1,2622,1 //Earring
+1,2623,1 //Necklace
+1,2624,1 //Glove
+1,2625,1 //Brooch
+1,2626,1 //Rosary
+1,5002,1 //Jewel Crown
+1,5085,1 //Small Ribbons
+1,603,1000 //Old Blue Box
+1,604,500 //Dead Branch
+1,644,300 //Gift Box
diff --git a/db/item_cardalbum.txt b/db/item_cardalbum.txt
index 063146b33..5b2a41614 100644
--- a/db/item_cardalbum.txt
+++ b/db/item_cardalbum.txt
@@ -1,347 +1,347 @@
-// Old Card Album Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-3,4001,7 //Poring Card
-3,4002,7 //Fabre Card
-3,4003,6 //Pupa Card
-3,4004,7 //Drops Card
-3,4005,1 //Santa Poring Card
-3,4006,7 //Lunatic Card
-3,4007,4 //Peco Peco Egg Card
-3,4008,7 //Picky Card
-3,4009,7 //Chonchon Card
-3,4010,7 //Willow Card
-3,4011,7 //Picky Egg Card
-3,4012,5 //Thief Bug Egg Card
-3,4013,5 //Andre Egg Card
-3,4014,5 //Roda Frog Card
-3,4015,5 //Condor Card
-3,4016,5 //Thief Bug Card
-3,4017,5 //Savage Babe Card
-3,4019,5 //Hornet Card
-3,4020,5 //Farmiliar Card
-3,4021,5 //Rocker Card
-3,4022,5 //Spore Card
-3,4023,5 //Baby Desert Wolf Card
-3,4024,5 //Plankton Card
-3,4025,5 //Skeleton Card
-3,4026,3 //Female Thief Bug Card
-3,4027,3 //Kukre Card
-3,4028,3 //Tarou Card
-3,4029,3 //Wolf Card
-3,4030,3 //Mandragora Card
-3,4031,3 //Peco Peco Card
-3,4032,3 //Ambernite Card
-3,4033,3 //Poporing Card
-3,4034,3 //Wormtail Card
-3,4035,3 //Hydra Card
-3,4036,3 //Muka Card
-3,4037,3 //Snake Card
-3,4038,3 //Zombie Card
-3,4039,3 //Stainer Card
-3,4040,3 //Creamy Card
-3,4041,3 //Coco Card
-3,4042,3 //Steel Chonchon Card
-3,4043,3 //Andre Card
-3,4044,3 //Smokie Card
-3,4045,3 //Horn Card
-3,4046,3 //Martin Card
-3,4047,1 //Ghostring Card
-3,4048,3 //Poison Spore Card
-3,4049,3 //Vadon Card
-3,4050,3 //Male Thief Bug Card
-3,4051,3 //Yoyo Card
-3,4052,3 //Elder Willow Card
-3,4053,1 //Vitata Card
-3,4054,1 //Angeling Card
-3,4055,3 //Marina Card
-3,4056,3 //Dustiness Card
-3,4057,2 //Metaller Card
-3,4058,2 //Thara Frog Card
-3,4060,2 //Goblin Card
-3,4061,2 //Cornutus Card
-3,4062,2 //Anacondaq Card
-3,4063,2 //Caramel Card
-3,4064,2 //Zerom Card
-3,4065,2 //Kaho Card
-3,4066,2 //Orc Warrior Card
-3,4067,2 //Megalodon Card
-3,4068,2 //Scorpion Card
-3,4069,2 //Drainliar Card
-3,4070,2 //Eggyra Card
-3,4071,2 //Orc Zombie Card
-3,4072,2 //Golem Card
-3,4073,2 //Pirate Skeleton Card
-3,4074,2 //Bigfoot Card
-3,4075,2 //Argos Card
-3,4076,2 //Magnolia Card
-3,4077,2 //Phen Card
-3,4078,2 //Savage Card
-3,4079,2 //Mantis Card
-3,4080,2 //Flora Card
-3,4081,2 //Hode Card
-3,4082,1 //Desert Wolf Card
-3,4083,1 //Rafflesia Card
-3,4084,1 //Marine Sphere Card
-3,4085,1 //Orc Skeleton Card
-3,4086,1 //Soldier Skeleton Card
-3,4087,1 //Giearth Card
-3,4088,1 //Frilldora Card
-3,4089,1 //Swordfish Card
-3,4090,1 //Munak Card
-3,4091,1 //Kobold Card
-3,4092,1 //Skeleton Worker Card
-3,4093,1 //Obeaune Card
-3,4094,1 //Archer Skeleton Card
-3,4095,1 //Marse Card
-3,4096,1 //Zenorc Card
-3,4097,1 //Matyr Card
-3,4098,1 //Dokebi Card
-3,4099,1 //Pasana Card
-3,4100,1 //Sohee Card
-3,4101,1 //Sandman Card
-3,4102,1 //Whisper Card
-3,4103,1 //Horong Card
-3,4104,1 //Requiem Card
-3,4105,1 //Marc Card
-3,4106,1 //Mummy Card
-3,4107,1 //Verit Card
-3,4108,1 //Myst Card
-3,4109,1 //Jakk Card
-3,4110,1 //Ghoul Card
-3,4111,1 //Strouf Card
-3,4112,1 //Marduk Card
-3,4113,1 //Marionette Card
-3,4114,1 //Argiope Card
-3,4115,1 //Hunter Fly Card
-3,4116,1 //Isis Card
-3,4117,1 //Sidewinder Card
-3,4118,1 //Earth Petite Card
-3,4119,1 //Bathory Card
-3,4120,1 //Sky Petite Card
-3,4122,1 //Deviruchi Card
-3,4125,1 //Deviace Card
-3,4127,1 //Nightmare Card
-3,4129,1 //Bapho Jr. Card
-3,4133,1 //Raydric Card
-3,4136,1 //Khalitzburg Card
-3,4139,1 //Joker Card
-3,4141,1 //Evil Druid Card
-3,4149,1 //Gargoyle Card
-3,4150,1 //Goat Card
-3,4151,1 //Gajomart Card
-3,4152,1 //Galapago Card
-3,4153,1 //Crab Card
-3,4154,1 //Dumpling Child Card
-3,4156,1 //Goblin Steamrider Card
-3,4157,1 //Goblin Archer Card
-3,4158,1 //Sky Deleter Card
-3,4159,1 //Nine Tail Card
-3,4160,1 //Firelock Soldier Card
-3,4161,1 //Grand Peco Card
-3,4162,1 //Grizzly Card
-3,4164,1 //Gullinbursti Card
-3,4165,1 //Gig Card
-3,4166,1 //Nightmare Terror Card
-3,4167,1 //Neraid Card
-3,4170,1 //Dark Frame Card
-3,4172,1 //The Paper Card
-3,4173,1 //Demon Fungus Card
-3,4175,1 //Poisonous Toad Card
-3,4176,1 //Dullahan Card
-3,4177,1 //Dryad Card
-3,4178,1 //Dragon Tail Card
-3,4180,1 //Driller Card
-3,4181,1 //Disguise Card
-3,4182,1 //Diabolic Card
-3,4184,1 //Lava Golem Card
-3,4185,1 //Rideword Card
-3,4186,1 //Raggler Card
-3,4187,1 //Raydric Archer Card
-3,4188,1 //Leib Olmai Card
-3,4189,1 //Wraith Dead Card
-3,4190,1 //Wraith Card
-3,4191,1 //Loli Ruri Card
-3,4192,1 //Rotar Zairo Card
-3,4193,1 //Lude Card
-3,4194,1 //Rybio Card
-3,4195,1 //Leaf Cat Card
-3,4196,1 //Marin Card
-3,4199,1 //Merman Card
-3,4200,1 //Megalith Card
-3,4201,1 //Majoruros Card
-3,4202,1 //Civil Servant Card
-3,4204,1 //Mini Demon Card
-3,4205,1 //Mimic Card
-3,4206,1 //Myst Case Card
-3,4208,1 //Miyabi Doll Card
-3,4209,1 //Violy Card
-3,4210,1 //Wanderer Card
-3,4212,1 //Bongun Card
-3,4213,1 //Brilight Card
-3,4214,1 //Bloody Murderer Card
-3,4215,1 //Blazer Card
-3,4216,1 //Sasquatch Card
-3,4217,1 //Enchanted Peach Tree Card
-3,4218,1 //Succubus Card
-3,4219,1 //Sage Worm Card
-3,4220,1 //Solider Card
-3,4221,1 //Skeleton General Card
-3,4222,1 //Skeleton Prisoner Card
-3,4223,1 //Stalactic Golem Card
-3,4224,1 //Stem Worm Card
-3,4225,1 //Stone Shooter Card
-3,4226,1 //Sting Card
-3,4227,1 //Spring Rabbit Card
-3,4228,1 //Sleeper Card
-3,4230,1 //Shinobi Card
-3,4231,1 //Increase Soil Card
-3,4232,1 //Hermit Plant Card
-3,4233,1 //Baby Leopard Card
-3,4234,1 //Anolian Card
-3,4235,1 //Christmas Cookie Card
-3,4237,1 //Owl Duke Card
-3,4238,1 //Owl Baron Card
-3,4239,1 //Iron Fist Card
-3,4240,1 //Arclouze Card
-3,4242,1 //Apocalipse Card
-3,4244,1 //Alarm Card
-3,4245,1 //Am Mut Card
-3,4246,1 //Assaulter Card
-3,4247,1 //Aster Card
-3,4248,1 //Ancient Mummy Card
-3,4249,1 //Ancient Worm Card
-3,4251,1 //Elder Card
-3,4252,1 //Alligator Card
-3,4253,1 //Alice Card
-3,4255,1 //Orc Lady Card
-3,4256,1 //Orc Archer Card
-3,4257,1 //Wild Rose Card
-3,4258,1 //Evil Nymph Card
-3,4259,1 //Wooden Golem Card
-3,4260,1 //Wootan Shooter Card
-3,4261,1 //Wootan Fighter Card
-3,4262,1 //Cloud Hermit Card
-3,4264,1 //Wind Ghost Card
-3,4265,1 //Li Me Mang Ryang Card
-3,4267,1 //Explosion Card
-3,4268,1 //Injustice Card
-3,4269,1 //Incubus Card
-3,4270,1 //Giant Spider Card
-3,4271,1 //Giant Hornet Card
-3,4272,1 //Dancing Dragon Card
-3,4273,1 //Shell Fish Card
-3,4274,1 //Zombie Master Card
-3,4275,1 //Zombie Prisoner Card
-3,4277,1 //Zherlthsh Card
-3,4278,1 //Gibbet Card
-3,4279,1 //Earth Deleter Card
-3,4280,1 //Geographer Card
-3,4281,1 //Zipper Bear Card
-3,4282,1 //Tengu Card
-3,4283,1 //Greatest General Card
-3,4284,1 //Chepet Card
-3,4285,1 //Choco Card
-3,4286,1 //Karakasa Card
-3,4287,1 //Kapha Card
-3,4288,1 //Carat Card
-3,4289,1 //Caterpillar Card
-3,4290,1 //Cat O' Nine Tails Card
-3,4292,1 //Kobold Archer Card
-3,4293,1 //Cookie Card
-3,4294,1 //Quve Card
-3,4295,1 //Kraben Card
-3,4296,1 //Cramp Card
-3,4297,1 //Cruiser Card
-3,4298,1 //Creamy Fear Card
-3,4299,1 //Clock Card
-3,4300,1 //Chimera Card
-3,4301,1 //Killer Mantis Card
-3,4304,1 //Tamruan Card
-3,4229,1 //Clock Tower Manager Card
-3,4307,1 //Beetle King Card
-3,4308,1 //Tri Joint Card
-3,4309,1 //Parasite Card
-3,4310,1 //Panzer Goblin Card
-3,4311,1 //Permeter Card
-3,4312,1 //Seal Card
-3,4313,1 //Punk Card
-3,4314,1 //Penomena Card
-3,4315,1 //Pest Card
-3,4316,1 //False Angel Card
-3,4319,1 //Freezer Card
-3,4321,1 //Hylozoist Card
-3,4322,1 //High Orc Card
-3,4323,1 //Garm Baby Card
-3,4325,1 //Harpy Card
-3,4326,1 //Sea-Otter Card
-3,4327,1 //Bloody Butterfly Card
-3,4328,1 //Hyegun Card
-3,4329,1 //Phendark Card
-3,4331,1 //Heater Card
-3,4243,1 //Antonio Card
-
-//New cards
-3,4332,1 //Waste Stove Card
-3,4333,1 //Venomous Card
-3,4334,1 //Noxious Card
-3,4335,1 //Pitman Card
-3,4336,1 //Ungoliant Card
-3,4337,1 //Porcellio Card
-3,4338,1 //Obsidian Card
-3,4339,1 //Mineral Card
-3,4340,1 //Teddy Bear Card
-3,4341,1 //Metaling Card
-3,4343,1 //Holden Card
-3,4344,1 //Anopheles Card
-3,4345,1 //Hill Wind Card
-3,4346,1 //Egnizem Cenia Card
-3,4347,1 //Armeyer Dinze Card
-3,4348,1 //Wikebine Tres Card
-3,4349,1 //Errende Ebecee Card
-3,4350,1 //Laurell Weinder Card
-3,4351,1 //Kavach Icarus Card
-3,4353,1 //Remover Card
-3,4354,1 //Gemini-S58 Card
-3,4355,1 //Gremlin Card
-3,4356,1 //Beholder Card
-3,4358,1 //Seyren Windsor Card
-3,4360,1 //Eremes Guile Card
-3,4362,1 //Howard Alt-Eisen Card
-3,4364,1 //Margaretha Solin Card
-3,4366,1 //Kathryne Keyron Card
-3,4368,1 //Cecil Damon Card
-3,4369,1 //Venatu Card
-3,4370,1 //Dimik Card
-3,4371,1 //Archdam Card
-3,4373,1 //Chung E Card
-3,4375,1 //Orc Baby Card
-3,4377,1 //Green Iguana Card
-3,4378,1 //Gold Acidus Card
-3,4379,1 //Blue Acidus Card
-3,4380,1 //Red Ferus Card
-3,4381,1 //Green Ferus Card
-3,4382,1 //Yellow Novus Card
-3,4383,1 //Red Novus Card
-3,4384,1 //Hydro Card
-3,4385,1 //Dragon Egg Card
-3,4387,1 //Ancient Mimic Card
-3,4388,1 //Deathword Card
-3,4389,1 //Plasma Card
-3,4390,1 //Breeze Card
-3,4391,1 //Retribution Card
-3,4392,1 //Observation Card
-3,4393,1 //Shelter Card
-3,4394,1 //Solace Card
-3,4395,1 //Thanatos Maero Card
-3,4396,1 //Thanatos Odium Card
-3,4397,1 //Thanatos Despero Card
-//3,4398,1 //Thanatos Dolor Card
-3,4400,1 //Aliza Card
-3,4401,1 //Alicel Card
-3,4402,1 //Aliot Card
-3,4404,1 //Skogul Card
-//3,4405,1 //Frus Card
-//3,4406,1 //Skeggiold Card
+// Old Card Album Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+3,4001,7 //Poring Card
+3,4002,7 //Fabre Card
+3,4003,6 //Pupa Card
+3,4004,7 //Drops Card
+3,4005,1 //Santa Poring Card
+3,4006,7 //Lunatic Card
+3,4007,4 //Peco Peco Egg Card
+3,4008,7 //Picky Card
+3,4009,7 //Chonchon Card
+3,4010,7 //Willow Card
+3,4011,7 //Picky Egg Card
+3,4012,5 //Thief Bug Egg Card
+3,4013,5 //Andre Egg Card
+3,4014,5 //Roda Frog Card
+3,4015,5 //Condor Card
+3,4016,5 //Thief Bug Card
+3,4017,5 //Savage Babe Card
+3,4019,5 //Hornet Card
+3,4020,5 //Farmiliar Card
+3,4021,5 //Rocker Card
+3,4022,5 //Spore Card
+3,4023,5 //Baby Desert Wolf Card
+3,4024,5 //Plankton Card
+3,4025,5 //Skeleton Card
+3,4026,3 //Female Thief Bug Card
+3,4027,3 //Kukre Card
+3,4028,3 //Tarou Card
+3,4029,3 //Wolf Card
+3,4030,3 //Mandragora Card
+3,4031,3 //Peco Peco Card
+3,4032,3 //Ambernite Card
+3,4033,3 //Poporing Card
+3,4034,3 //Wormtail Card
+3,4035,3 //Hydra Card
+3,4036,3 //Muka Card
+3,4037,3 //Snake Card
+3,4038,3 //Zombie Card
+3,4039,3 //Stainer Card
+3,4040,3 //Creamy Card
+3,4041,3 //Coco Card
+3,4042,3 //Steel Chonchon Card
+3,4043,3 //Andre Card
+3,4044,3 //Smokie Card
+3,4045,3 //Horn Card
+3,4046,3 //Martin Card
+3,4047,1 //Ghostring Card
+3,4048,3 //Poison Spore Card
+3,4049,3 //Vadon Card
+3,4050,3 //Male Thief Bug Card
+3,4051,3 //Yoyo Card
+3,4052,3 //Elder Willow Card
+3,4053,1 //Vitata Card
+3,4054,1 //Angeling Card
+3,4055,3 //Marina Card
+3,4056,3 //Dustiness Card
+3,4057,2 //Metaller Card
+3,4058,2 //Thara Frog Card
+3,4060,2 //Goblin Card
+3,4061,2 //Cornutus Card
+3,4062,2 //Anacondaq Card
+3,4063,2 //Caramel Card
+3,4064,2 //Zerom Card
+3,4065,2 //Kaho Card
+3,4066,2 //Orc Warrior Card
+3,4067,2 //Megalodon Card
+3,4068,2 //Scorpion Card
+3,4069,2 //Drainliar Card
+3,4070,2 //Eggyra Card
+3,4071,2 //Orc Zombie Card
+3,4072,2 //Golem Card
+3,4073,2 //Pirate Skeleton Card
+3,4074,2 //Bigfoot Card
+3,4075,2 //Argos Card
+3,4076,2 //Magnolia Card
+3,4077,2 //Phen Card
+3,4078,2 //Savage Card
+3,4079,2 //Mantis Card
+3,4080,2 //Flora Card
+3,4081,2 //Hode Card
+3,4082,1 //Desert Wolf Card
+3,4083,1 //Rafflesia Card
+3,4084,1 //Marine Sphere Card
+3,4085,1 //Orc Skeleton Card
+3,4086,1 //Soldier Skeleton Card
+3,4087,1 //Giearth Card
+3,4088,1 //Frilldora Card
+3,4089,1 //Swordfish Card
+3,4090,1 //Munak Card
+3,4091,1 //Kobold Card
+3,4092,1 //Skeleton Worker Card
+3,4093,1 //Obeaune Card
+3,4094,1 //Archer Skeleton Card
+3,4095,1 //Marse Card
+3,4096,1 //Zenorc Card
+3,4097,1 //Matyr Card
+3,4098,1 //Dokebi Card
+3,4099,1 //Pasana Card
+3,4100,1 //Sohee Card
+3,4101,1 //Sandman Card
+3,4102,1 //Whisper Card
+3,4103,1 //Horong Card
+3,4104,1 //Requiem Card
+3,4105,1 //Marc Card
+3,4106,1 //Mummy Card
+3,4107,1 //Verit Card
+3,4108,1 //Myst Card
+3,4109,1 //Jakk Card
+3,4110,1 //Ghoul Card
+3,4111,1 //Strouf Card
+3,4112,1 //Marduk Card
+3,4113,1 //Marionette Card
+3,4114,1 //Argiope Card
+3,4115,1 //Hunter Fly Card
+3,4116,1 //Isis Card
+3,4117,1 //Sidewinder Card
+3,4118,1 //Earth Petite Card
+3,4119,1 //Bathory Card
+3,4120,1 //Sky Petite Card
+3,4122,1 //Deviruchi Card
+3,4125,1 //Deviace Card
+3,4127,1 //Nightmare Card
+3,4129,1 //Bapho Jr. Card
+3,4133,1 //Raydric Card
+3,4136,1 //Khalitzburg Card
+3,4139,1 //Joker Card
+3,4141,1 //Evil Druid Card
+3,4149,1 //Gargoyle Card
+3,4150,1 //Goat Card
+3,4151,1 //Gajomart Card
+3,4152,1 //Galapago Card
+3,4153,1 //Crab Card
+3,4154,1 //Dumpling Child Card
+3,4156,1 //Goblin Steamrider Card
+3,4157,1 //Goblin Archer Card
+3,4158,1 //Sky Deleter Card
+3,4159,1 //Nine Tail Card
+3,4160,1 //Firelock Soldier Card
+3,4161,1 //Grand Peco Card
+3,4162,1 //Grizzly Card
+3,4164,1 //Gullinbursti Card
+3,4165,1 //Gig Card
+3,4166,1 //Nightmare Terror Card
+3,4167,1 //Neraid Card
+3,4170,1 //Dark Frame Card
+3,4172,1 //The Paper Card
+3,4173,1 //Demon Fungus Card
+3,4175,1 //Poisonous Toad Card
+3,4176,1 //Dullahan Card
+3,4177,1 //Dryad Card
+3,4178,1 //Dragon Tail Card
+3,4180,1 //Driller Card
+3,4181,1 //Disguise Card
+3,4182,1 //Diabolic Card
+3,4184,1 //Lava Golem Card
+3,4185,1 //Rideword Card
+3,4186,1 //Raggler Card
+3,4187,1 //Raydric Archer Card
+3,4188,1 //Leib Olmai Card
+3,4189,1 //Wraith Dead Card
+3,4190,1 //Wraith Card
+3,4191,1 //Loli Ruri Card
+3,4192,1 //Rotar Zairo Card
+3,4193,1 //Lude Card
+3,4194,1 //Rybio Card
+3,4195,1 //Leaf Cat Card
+3,4196,1 //Marin Card
+3,4199,1 //Merman Card
+3,4200,1 //Megalith Card
+3,4201,1 //Majoruros Card
+3,4202,1 //Civil Servant Card
+3,4204,1 //Mini Demon Card
+3,4205,1 //Mimic Card
+3,4206,1 //Myst Case Card
+3,4208,1 //Miyabi Doll Card
+3,4209,1 //Violy Card
+3,4210,1 //Wanderer Card
+3,4212,1 //Bongun Card
+3,4213,1 //Brilight Card
+3,4214,1 //Bloody Murderer Card
+3,4215,1 //Blazer Card
+3,4216,1 //Sasquatch Card
+3,4217,1 //Enchanted Peach Tree Card
+3,4218,1 //Succubus Card
+3,4219,1 //Sage Worm Card
+3,4220,1 //Solider Card
+3,4221,1 //Skeleton General Card
+3,4222,1 //Skeleton Prisoner Card
+3,4223,1 //Stalactic Golem Card
+3,4224,1 //Stem Worm Card
+3,4225,1 //Stone Shooter Card
+3,4226,1 //Sting Card
+3,4227,1 //Spring Rabbit Card
+3,4228,1 //Sleeper Card
+3,4230,1 //Shinobi Card
+3,4231,1 //Increase Soil Card
+3,4232,1 //Hermit Plant Card
+3,4233,1 //Baby Leopard Card
+3,4234,1 //Anolian Card
+3,4235,1 //Christmas Cookie Card
+3,4237,1 //Owl Duke Card
+3,4238,1 //Owl Baron Card
+3,4239,1 //Iron Fist Card
+3,4240,1 //Arclouze Card
+3,4242,1 //Apocalipse Card
+3,4244,1 //Alarm Card
+3,4245,1 //Am Mut Card
+3,4246,1 //Assaulter Card
+3,4247,1 //Aster Card
+3,4248,1 //Ancient Mummy Card
+3,4249,1 //Ancient Worm Card
+3,4251,1 //Elder Card
+3,4252,1 //Alligator Card
+3,4253,1 //Alice Card
+3,4255,1 //Orc Lady Card
+3,4256,1 //Orc Archer Card
+3,4257,1 //Wild Rose Card
+3,4258,1 //Evil Nymph Card
+3,4259,1 //Wooden Golem Card
+3,4260,1 //Wootan Shooter Card
+3,4261,1 //Wootan Fighter Card
+3,4262,1 //Cloud Hermit Card
+3,4264,1 //Wind Ghost Card
+3,4265,1 //Li Me Mang Ryang Card
+3,4267,1 //Explosion Card
+3,4268,1 //Injustice Card
+3,4269,1 //Incubus Card
+3,4270,1 //Giant Spider Card
+3,4271,1 //Giant Hornet Card
+3,4272,1 //Dancing Dragon Card
+3,4273,1 //Shell Fish Card
+3,4274,1 //Zombie Master Card
+3,4275,1 //Zombie Prisoner Card
+3,4277,1 //Zherlthsh Card
+3,4278,1 //Gibbet Card
+3,4279,1 //Earth Deleter Card
+3,4280,1 //Geographer Card
+3,4281,1 //Zipper Bear Card
+3,4282,1 //Tengu Card
+3,4283,1 //Greatest General Card
+3,4284,1 //Chepet Card
+3,4285,1 //Choco Card
+3,4286,1 //Karakasa Card
+3,4287,1 //Kapha Card
+3,4288,1 //Carat Card
+3,4289,1 //Caterpillar Card
+3,4290,1 //Cat O' Nine Tails Card
+3,4292,1 //Kobold Archer Card
+3,4293,1 //Cookie Card
+3,4294,1 //Quve Card
+3,4295,1 //Kraben Card
+3,4296,1 //Cramp Card
+3,4297,1 //Cruiser Card
+3,4298,1 //Creamy Fear Card
+3,4299,1 //Clock Card
+3,4300,1 //Chimera Card
+3,4301,1 //Killer Mantis Card
+3,4304,1 //Tamruan Card
+3,4229,1 //Clock Tower Manager Card
+3,4307,1 //Beetle King Card
+3,4308,1 //Tri Joint Card
+3,4309,1 //Parasite Card
+3,4310,1 //Panzer Goblin Card
+3,4311,1 //Permeter Card
+3,4312,1 //Seal Card
+3,4313,1 //Punk Card
+3,4314,1 //Penomena Card
+3,4315,1 //Pest Card
+3,4316,1 //False Angel Card
+3,4319,1 //Freezer Card
+3,4321,1 //Hylozoist Card
+3,4322,1 //High Orc Card
+3,4323,1 //Garm Baby Card
+3,4325,1 //Harpy Card
+3,4326,1 //Sea-Otter Card
+3,4327,1 //Bloody Butterfly Card
+3,4328,1 //Hyegun Card
+3,4329,1 //Phendark Card
+3,4331,1 //Heater Card
+3,4243,1 //Antonio Card
+
+//New cards
+3,4332,1 //Waste Stove Card
+3,4333,1 //Venomous Card
+3,4334,1 //Noxious Card
+3,4335,1 //Pitman Card
+3,4336,1 //Ungoliant Card
+3,4337,1 //Porcellio Card
+3,4338,1 //Obsidian Card
+3,4339,1 //Mineral Card
+3,4340,1 //Teddy Bear Card
+3,4341,1 //Metaling Card
+3,4343,1 //Holden Card
+3,4344,1 //Anopheles Card
+3,4345,1 //Hill Wind Card
+3,4346,1 //Egnizem Cenia Card
+3,4347,1 //Armeyer Dinze Card
+3,4348,1 //Wikebine Tres Card
+3,4349,1 //Errende Ebecee Card
+3,4350,1 //Laurell Weinder Card
+3,4351,1 //Kavach Icarus Card
+3,4353,1 //Remover Card
+3,4354,1 //Gemini-S58 Card
+3,4355,1 //Gremlin Card
+3,4356,1 //Beholder Card
+3,4358,1 //Seyren Windsor Card
+3,4360,1 //Eremes Guile Card
+3,4362,1 //Howard Alt-Eisen Card
+3,4364,1 //Margaretha Solin Card
+3,4366,1 //Kathryne Keyron Card
+3,4368,1 //Cecil Damon Card
+3,4369,1 //Venatu Card
+3,4370,1 //Dimik Card
+3,4371,1 //Archdam Card
+3,4373,1 //Chung E Card
+3,4375,1 //Orc Baby Card
+3,4377,1 //Green Iguana Card
+3,4378,1 //Gold Acidus Card
+3,4379,1 //Blue Acidus Card
+3,4380,1 //Red Ferus Card
+3,4381,1 //Green Ferus Card
+3,4382,1 //Yellow Novus Card
+3,4383,1 //Red Novus Card
+3,4384,1 //Hydro Card
+3,4385,1 //Dragon Egg Card
+3,4387,1 //Ancient Mimic Card
+3,4388,1 //Deathword Card
+3,4389,1 //Plasma Card
+3,4390,1 //Breeze Card
+3,4391,1 //Retribution Card
+3,4392,1 //Observation Card
+3,4393,1 //Shelter Card
+3,4394,1 //Solace Card
+3,4395,1 //Thanatos Maero Card
+3,4396,1 //Thanatos Odium Card
+3,4397,1 //Thanatos Despero Card
+//3,4398,1 //Thanatos Dolor Card
+3,4400,1 //Aliza Card
+3,4401,1 //Alicel Card
+3,4402,1 //Aliot Card
+3,4404,1 //Skogul Card
+//3,4405,1 //Frus Card
+//3,4406,1 //Skeggiold Card
diff --git a/db/item_cookie_bag.txt b/db/item_cookie_bag.txt
index afe3aba69..610f67081 100644
--- a/db/item_cookie_bag.txt
+++ b/db/item_cookie_bag.txt
@@ -1,54 +1,54 @@
-
-// Cookie Bag Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-7,529,1 //Candy
-7,570,1 //Lucky Candy
-7,530,1 //Candy Cane
-7,571,1 //Lucky Candy Cane
-7,538,1 //Well-baked Cookie
-7,572,1 //Lucky Cookie
-7,539,1 //Piece of Cake
-7,564,1 //Rice Ball
-7,12122,1 //Sesame Pastry
-7,12123,1 //Honey Pastry
-7,12124,1 //Rainbow Cake
-7,558,1 //Chocolate
-7,559,1 //Hand-made Chocolate
-7,560,1 //Hand-made White Chocolate
-7,561,1 //White Chocolate
-7,573,1 //Chocolate Drink
-7,529,1 //Candy
-7,570,1 //Lucky Candy
-7,530,1 //Candy Cane
-7,571,1 //Lucky Candy Cane
-7,538,1 //Well-baked Cookie
-7,572,1 //Lucky Cookie
-7,539,1 //Piece of Cake
-7,564,1 //Rice Ball
-7,529,1 //Candy
-7,570,1 //Lucky Candy
-7,530,1 //Candy Cane
-7,571,1 //Lucky Candy Cane
-7,538,1 //Well-baked Cookie
-7,572,1 //Lucky Cookie
-7,539,1 //Piece of Cake
-7,564,1 //Rice Ball
-7,529,1 //Candy
-7,570,1 //Lucky Candy
-7,530,1 //Candy Cane
-7,571,1 //Lucky Candy Cane
-7,538,1 //Well-baked Cookie
-7,572,1 //Lucky Cookie
-7,539,1 //Piece of Cake
-7,564,1 //Rice Ball
-7,529,1 //Candy
-7,570,1 //Lucky Candy
-7,530,1 //Candy Cane
-7,571,1 //Lucky Candy Cane
-7,538,1 //Well-baked Cookie
-7,572,1 //Lucky Cookie
-7,539,1 //Piece of Cake
-7,564,1 //Rice Ball
+
+// Cookie Bag Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+7,529,1 //Candy
+7,570,1 //Lucky Candy
+7,530,1 //Candy Cane
+7,571,1 //Lucky Candy Cane
+7,538,1 //Well-baked Cookie
+7,572,1 //Lucky Cookie
+7,539,1 //Piece of Cake
+7,564,1 //Rice Ball
+7,12122,1 //Sesame Pastry
+7,12123,1 //Honey Pastry
+7,12124,1 //Rainbow Cake
+7,558,1 //Chocolate
+7,559,1 //Hand-made Chocolate
+7,560,1 //Hand-made White Chocolate
+7,561,1 //White Chocolate
+7,573,1 //Chocolate Drink
+7,529,1 //Candy
+7,570,1 //Lucky Candy
+7,530,1 //Candy Cane
+7,571,1 //Lucky Candy Cane
+7,538,1 //Well-baked Cookie
+7,572,1 //Lucky Cookie
+7,539,1 //Piece of Cake
+7,564,1 //Rice Ball
+7,529,1 //Candy
+7,570,1 //Lucky Candy
+7,530,1 //Candy Cane
+7,571,1 //Lucky Candy Cane
+7,538,1 //Well-baked Cookie
+7,572,1 //Lucky Cookie
+7,539,1 //Piece of Cake
+7,564,1 //Rice Ball
+7,529,1 //Candy
+7,570,1 //Lucky Candy
+7,530,1 //Candy Cane
+7,571,1 //Lucky Candy Cane
+7,538,1 //Well-baked Cookie
+7,572,1 //Lucky Cookie
+7,539,1 //Piece of Cake
+7,564,1 //Rice Ball
+7,529,1 //Candy
+7,570,1 //Lucky Candy
+7,530,1 //Candy Cane
+7,571,1 //Lucky Candy Cane
+7,538,1 //Well-baked Cookie
+7,572,1 //Lucky Cookie
+7,539,1 //Piece of Cake
+7,564,1 //Rice Ball
diff --git a/db/item_db.txt b/db/item_db.txt
index 167f65359..a956ff283 100644
--- a/db/item_db.txt
+++ b/db/item_db.txt
@@ -1,2710 +1,2710 @@
-// Items Database
-//
-// Structure of Database:
-// ID,AegisName,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Upper,Gender,Loc,wLV,eLV,Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
-//
-// Healing Items
-//=============================================================
-0,DEFAULT,Default,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-501,Red_Potion,Red Potion,0,50,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
-502,Orange_Potion,Orange Potion,0,200,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
-503,Yellow_Potion,Yellow Potion,0,550,,130,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
-504,White_Potion,White Potion,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-505,Blue_Potion,Blue Potion,0,5000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(40,60); },{},{}
-506,Green_Potion,Green Potion,0,40,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; },{},{}
-507,Red_Herb,Red Herb,0,18,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(18,28),0; },{},{}
-508,Yellow_Herb,Yellow Herb,0,40,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(38,58),0; },{},{}
-509,White_Herb,White Herb,0,120,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(75,115),0; },{},{}
-510,Blue_Herb,Blue Herb,0,60,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(15,30); },{},{}
-511,Green_Herb,Green Herb,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; },{},{}
-512,Apple,Apple,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(16,22),0; },{},{}
-513,Banana,Banana,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(17,21),0; },{},{}
-514,Grape,Grape,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,15); },{},{}
-515,Carrot,Carrot,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(18,20),0; },{},{}
-516,Sweet_Potato,Potato,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(15,23),0; if(rand(100)<3) sc_start SC_Stun,10000,0; },{},{}
-517,Meat,Meat,0,50,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),0; },{},{}
-518,Honey,Honey,0,500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),rand(20,40); },{},{}
-519,Milk,Milk,0,25,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(27,37),0; },{},{}
-520,Leaflet_Of_Hinal,Hinalle Leaflet,0,150,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
-521,Leaflet_Of_Aloe,Aloe Leaflet,0,360,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-522,Fruit_Of_Mastela,Mastela Fruit,0,8500,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(400,600),0; },{},{}
-523,Holy_Water,Holy Water,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Curse; },{},{}
-525,Panacea,Panacea,0,500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; sc_end SC_Hallucination; },{},{}
-526,Royal_Jelly,Royal Jelly,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),rand(40,60); sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; sc_end SC_Hallucination; },{},{}
-528,Monster's_Feed,Monster Food,0,60,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(72,108),0; },{},{}
-529,Candy,Candy,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
-530,Candy_Striper,Candy Cane,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
-531,Apple_Juice,Apple Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,35),0; },{},{}
-532,Banana_Juice,Banana Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(26,34),0; },{},{}
-533,Grape_Juice,Grape Juice,0,250,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(15,25); },{},{}
-534,Carrot_Juice,Carrot Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(27,33),0; },{},{}
-535,Pumpkin,Pumpkin,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 19,0; },{},{}
-536,Ice_Cream,Ice Cream,0,150,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; if(rand(100)<24) sc_start SC_Freeze,10000,0; },{},{}
-537,Pet_Food,Pet Food,0,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
-538,Well_Baked_Cookie,Well-baked Cookie,0,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(160,200),0; },{},{}
-539,Piece_Of_Cake,Piece of Cake,0,3000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),0; },{},{}
-540,Falcon's_Feed,Falcon food,0,2000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(185,225),0; },{},{}
-541,Pecopeco's_Feed,Peco Peco food,0,3000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-542,Festive_Cookie,Festival Cookie,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-543,Festive_Rainbow_Cake,Festival Rainbow Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-544,Fish_Slice,Raw Fish,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,60),0; },{},{}
-545,Red_Slim_Potion,Condensed Red Potion,0,150,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
-546,Yellow_Slim_Potion,Condensed Yellow Potion,0,600,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
-547,White_Slim_Potion,Condensed White Potion,0,1650,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-548,Cheese,Cheese,0,2800,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,15); },{},{}
-549,Nice_Sweet_Potato,Yam,0,180,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,100),0; },{},{}
-550,Popped_Rice,Rice Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(10,15),0; },{},{}
-551,Shusi,Sushi,0,1,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,60),0; },{},{}
-552,KETUPAT,Ketupat,0,1,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,90),rand(20,30); },{},{}
-553,Bun,Bao,0,1,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(35,70),0; },{},{}
-554,Mojji,Mochi,0,100,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; if(rand(100)<3) sc_start SC_Stun,10000,0; if(rand(100)<3) sc_start SC_Blind,10000,0; },{},{}
-555,Rice_Cake,Traditional Rice Cake,0,100,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
-556,Long_Rice_Cake,Rice Cake Stick,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(20,25),0; },{},{}
-557,Hash_Rice_Cake,Neatly Sliced Rice Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,30),0; },{},{}
-558,Chocolate,Chocolate,0,1,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 1,1; },{},{}
-559,HandMade_Chocolate,Hand-made Chocolate,0,1,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
-560,HandMade_Chocolate_,Hand-made White Chocolate,0,5000,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
-561,White_Chocolate,White Chocolate,0,5000,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
-562,Pizza,Doublecrust Swiss Fondue,0,100,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),0; },{},{}
-563,Pizza_01,Doublecrust Swiss Fondue,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(375,445),0; },{},{}
-564,Rice_Ball,Rice Ball,0,1,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 200,0; },{},{}
-565,Vita500_Bottle,Vita500,0,580,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(142,274),0; },{},{}
-566,Tomyumkung,Tom Yum Goong,0,10000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(244,350),rand(10,30); },{},{}
-567,Prawn,Shrimp,0,500,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(117,192),0; },{},{}
-568,Lemon,Lemon,0,60,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,20); },{},{}
-569,Novice_Potion,Novice Potion,0,,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(22,33),0; },{},{}
-570,Lucky_Candy,Lucky Candy,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
-571,Lucky_Cnady_Cane,Lucky Candy Cane,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
-572,Lucky_Cookie,Lucky Cookie,0,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(160,200),0; },{},{}
-573,Chocolate_Drink,Chocolate Drink,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(330,410),rand(45,65); },{},{}
-574,Egg,Egg,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(33,42),0; },{},{}
-575,Piece_Of_Cake_,2nd Anniversary Cake,0,10,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),0; },{},{}
-576,Prickly_Fruit,Prickly Fruit,0,540,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(150,300),rand(20,30); },{},{}
-577,Grain,Bag of Grain,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(60,70),0; },{},{}
-578,Strawberry,Strawberry,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(16,28); },{},{}
-579,Delicious_Fish,Fresh Fish,0,250,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(100,150),0; },{},{}
-580,Bread,Bread,0,150,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
-581,Mushroom,Edible Mushroom,0,40,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(20,30),0; },{},{}
-582,Orange,Orange,0,300,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(10,20),rand(10,20); },{},{}
-583,Ketupat_,Ketupat,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),rand(40,60); },{},{}
-584,Skewer_Soup,Skewer Soup,0,100,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(40,70),0; },{},{}
-585,Brusti,Brusti,0,2,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(15,20),0; itemskill 74,3,"Magnificat"; },{},{}
-586,Mother's_Cake,Mother's Cake,0,20,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
-587,Thorny_Fruit,Red Thorn Fruit,0,880,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),rand(20,30); },{},{}
-588,Spaghetti,Spaghetti,0,100,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(40,70),0; },{},{}
-589,Pizza_,Pizza,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(375,445),0; },{},{}
-590,Brizel_,Brezel,0,2,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
-// Usable Items
-//===================================================================
-601,Wing_Of_Fly,Fly Wing,11,60,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,1,""; },{},{}
-602,Wing_Of_Butterfly,Butterfly Wing,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,2,""; },{},{}
-603,Old_Blue_Box,Old Blue Box,2,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_BlueBox),1; },{},{}
-604,Branch_Of_Dead_Tree,Dead Branch,2,50,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-1,1,""; },{},{}
-605,Anodyne,Anodyne,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ENDURE,10000,1; },{},{}
-606,Aloebera,Aloevera,0,1500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_PROVOKE,30000,1; },{},{}
-607,Yggdrasilberry,Yggdrasil Berry,0,2,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 100,100; },{},{}
-608,Seed_Of_Yggdrasil,Yggdrasil Seed,0,5000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; },{},{}
-609,Amulet,Amulet,2,100,,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-610,Leaf_Of_Yggdrasil,Yggdrasil Leaf,11,4000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 54,1,"Resurrection"; },{},{}
-611,Spectacles,Magnifier,11,40,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 40,1,"Identify"; },{},{}
-// Smithing Items
-612,Portable_Furnace,Mini Furnace,2,150,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 21; },{},{}
-613,Iron_Hammer,Iron Hammer,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 1; },{},{}
-614,Golden_Hammer,Golden Hammer,2,3000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 2; },{},{}
-615,Oridecon_Hammer,Oridecon Hammer,2,5000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 3; },{},{}
-// Item Givers
-616,Old_Card_Album,Old Card Album,2,10000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_CardAlbum),1; },{},{}
-617,Old_Violet_Box,Old Purple Box,2,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_VioletBox),1; },{},{}
-618,Worn_Out_Scroll,Worn Out Scroll,2,50,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_ScrollBox),1; },{},{}
-// Pet Tames
-619,Unripe_Apple,Unripe Apple,11,1000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1002; },{},{}
-620,Orange_Juice,Orange Juice,11,1500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1113; },{},{}
-621,Bitter_Herb,Bitter Herb,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1031; },{},{}
-622,Rainbow_Carrot,Rainbow Carrot,11,2500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1063; },{},{}
-623,Earthworm_The_Dude,Earthworm the Dude,11,4000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1049; },{},{}
-624,Rotten_Fish,Rotten Fish,11,2500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1011; },{},{}
-625,Lusty_Iron,Rusty Iron,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1042; },{},{}
-626,Monster_Juice,Monster Juice,11,1500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1035; },{},{}
-627,Sweet_Milk,Sweet Milk,11,7000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1167; },{},{}
-628,Well_Dried_Bone,Well-Dried Bone,11,10000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1107; },{},{}
-629,Singing_Flower,Singing Flower,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1052; },{},{}
-630,Dew_Laden_Moss,Dew Laden Moss,11,10,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1014; },{},{}
-631,Deadly_Noxious_Herb,Deadly Noxious Herb,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1077; },{},{}
-632,Fatty_Chubby_Earthworm,Fatty Chubby Earthworm,11,5000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1019; },{},{}
-633,Baked_Yam,Sweet Potato,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1056; },{},{}
-634,Tropical_Banana,Tropical Banana,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1057; },{},{}
-635,Horror_Of_Tribe,Orc Trophy,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1023; },{},{}
-636,No_Recipient,No Recipient,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1026; },{},{}
-637,Old_Broom,Old Broom,11,350,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1110; },{},{}
-638,Silver_Knife_Of_Chaste,Silver Knife of Chastity,11,12000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1170; },{},{}
-639,Armlet_Of_Obedience,Armlet of Obedience,11,18000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1029; },{},{}
-640,Shining_Stone,Shining Stone,11,3000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1155; },{},{}
-641,Contracts_In_Shadow,Contracts in Shadow,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1109; },{},{}
-642,Book_Of_Devil,Book of the Devil,11,1800,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1101; },{},{}
-643,Pet_Incubator,Pet Incubator,2,3000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ bpet; },{},{}
-644,Gift_Box,Gift Box,2,2,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-// ASPD Potions
-645,Center_Potion,Concentration Potion,2,800,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,0; },{},{}
-656,Awakening_Potion,Awakening Potion,2,1500,,150,,,,,0xFFF7FEEF,7,2,,,40,,,{ sc_end SC_Sleep; sc_start SC_ASPDPOTION1,1800000,0; },{},{}
-657,Berserk_Potion,Berserk Potion,2,3000,,200,,,,,0x01E646A6,7,2,,,85,,,{ sc_start SC_ASPDPOTION2,1800000,0; },{},{}
-658,Union_Of_Tribe,Tribal Solidarity,2,1000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ guildgetexp rand(600000,1200000); },{},{}
-// New Pet Tames
-659,Heart_Of_Her,Her Heart,11,500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1188; },{},{}
-660,Prohibition_Red_Candle,Forbidden Red Candle,11,,10000,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1200; },{},{}
-661,Sway_Apron,Soft Apron,11,,10000,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1275; },{},{}
-662,Inspector_Certificate,Authoritative Badge,2,1450,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ specialeffect 507; sc_start SC_SpeedUp0,240000,0; },{},{}
-663,Korea_Rice_Cake,Songpyun,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 10,0; },{},{}
-// Item Givers
-664,Gift_Box_1,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-665,Gift_Box_2,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-666,Gift_Box_3,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-667,Gift_Box_4,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-668,Handsei,Red_Envelope,2,1,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ set Zeny,Zeny+rand(1000,10000); },{},{}
-669,Rice_Cake_Soup,Rice-Cake Soup,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal -100,-100; },{},{}
-// Coins
-670,Gold_Coin_Moneybag,Bag of Gold Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-671,Gold_Coin,Gold Coin,2,,10,40,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-672,Copper_Coin_Moneybag,Bag of Bronze Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-673,Copper_Coin,Bronze Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-674,Mithril_Coin,Mithril Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-675,Silver_Coin,Silver Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-676,Silver_Coin_Moneybag,Bag of Silver Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-677,White_Gold_Coin,Platinum Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-678,Poison_Bottle,Poison Bottle,0,5000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ if(Class == 4013) { sc_start SC_Poison,600000,0; sc_start SC_ASPDPOTION3,30000,0; } else percentheal -100,0; },{},{}
-679,Gold_Pill,Pilule,0,5000,,300,,,,,0xFFFFFFFF,7,3,,,,,,{ itemheal 50,50; },{},{}
-680,Magical_Carnation,Magic Carnation,2,,10,1000,,,,,0xFFFFFFFF,7,3,,,,,,{ itemheal 25,0; },{},{}
-681,Memory_Of_Wedding,Sweet Memory of Marriage,2,50000,,10,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
-// ATK/MATK Potions
-682,Realgar_Wine,Distilled Fighting Spirit,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,30; },{},{}
-683,Exorcize_Herb,Herb of Incantation,0,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_MATKPOTION,60000,30; },{},{}
-684,Durian,Durian,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,10; sc_start SC_MATKPOTION,60000,10; },{},{}
-685,RAMADAN,Ramadan,0,20,,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-// Scrolls
-686,Earth_Scroll_1_3,Level 3 Earth Spike,11,650,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 90,3,"Earth Spike Level 3"; },{},{}
-687,Earth_Scroll_1_5,Level 5 Earth Spike,11,1300,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 90,5,"Earth Spike Level 5"; },{},{}
-688,Cold_Scroll_1_3,Level 3 Cold Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 14,3,"Cold Bolt Level 3"; },{},{}
-689,Cold_Scroll_1_5,Level 5 Cold Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 14,5,"Cold Bolt Level 5"; },{},{}
-690,Fire_Scroll_1_3,Level 3 Fire Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 19,3,"Fire Bolt Level 3"; },{},{}
-691,Fire_Scroll_1_5,Level 5 Fire Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 19,5,"Fire bolt Level 5"; },{},{}
-692,Wind_Scroll_1_3,Level 3 Lightening Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 20,3,"Lightning Bolt Level 3"; },{},{}
-693,Wind_Scroll_1_5,Level 5 Lightening Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 20,5,"Lightning Bolt Level 5"; },{},{}
-694,Ghost_Scroll_1_3,Level 3 Soul Strike,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 13,3,"Soul Strike Level 3"; },{},{}
-695,Ghost_Scroll_1_5,Level 5 Soul Strike,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 13,5,"Soul Strike Level 5"; },{},{}
-696,Fire_Scroll_2_1,Level 1 Fire Ball,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 17,1,"Fire Ball Level 1"; },{},{}
-697,Fire_Scroll_2_5,Level 5 Fire Ball,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 17,5,"Fire Ball Level 5"; },{},{}
-698,Fire_Scroll_3_1,Level 1 Fire Wall,11,350,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 18,1,"Fire Wall Level 1"; },{},{}
-699,Fire_Scroll_3_5,Level 5 Fire Wall,11,700,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 18,5,"Fire Wall Level 5"; },{},{}
-700,Cold_Scroll_2_1,Level 1 Frost Diver,11,350,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 15,1,"Frost Diver Level 1"; },{},{}
-// Etc Items
-//===================================================================
-701,Ora_Ora,Ora Ora,3,,27500,200,,,,,,,,,,,,,{},{},{}
-702,Animal_Blood,Animal Gore,3,,1,100,,,,,,,,,,,,,{},{},{}
-703,Hinalle,Hinalle,3,,250,10,,,,,,,,,,,,,{},{},{}
-704,Aloe,Aloe,3,,250,10,,,,,,,,,,,,,{},{},{}
-705,Clover,Clover,3,,5,10,,,,,,,,,,,,,{},{},{}
-706,Four_Leaf_Clover,Four Leaf Clover,3,,40000,10,,,,,,,,,,,,,{},{},{}
-707,Singing_Plant,Singing Plant,3,,250,10,,,,,,,,,,,,,{},{},{}
-708,Ment,Ment,3,,250,10,,,,,,,,,,,,,{},{},{}
-709,Izidor,Izidor,3,,250,10,,,,,,,,,,,,,{},{},{}
-710,Illusion_Flower,Illusion Flower,3,,500,10,,,,,,,,,,,,,{},{},{}
-711,Shoot,Shoot,3,,8,10,,,,,,,,,,,,,{},{},{}
-712,Flower,Flower,3,,1,10,,,,,,,,,,,,,{},{},{}
-713,Empty_Bottle,Empty Bottle,3,,3,20,,,,,,,,,,,,,{},{},{}
-714,Emperium,Emperium,3,,1,1000,,,,,,,,,,,,,{},{},{}
-715,Yellow_Gemstone,Yellow Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
-716,Red_Gemstone,Red Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
-717,Blue_Gemstone,Blue Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
-718,Dark_Red_Jewel,Garnet,3,,3000,100,,,,,,,,,,,,,{},{},{}
-719,Violet_Jewel,Amethyst,3,,3000,100,,,,,,,,,,,,,{},{},{}
-720,Skyblue_Jewel,Aquamarine,3,,3000,100,,,,,,,,,,,,,{},{},{}
-721,Azure_Jewel,Emerald,3,,3000,100,,,,,,,,,,,,,{},{},{}
-722,Scarlet_Jewel,Pearl,3,,3000,100,,,,,,,,,,,,,{},{},{}
-723,Cardinal_Jewel,Ruby,3,,3000,100,,,,,,,,,,,,,{},{},{}
-724,Cardinal_Jewel_,Cursed Ruby,3,,500,100,,,,,,,,,,,,,{},{},{}
-725,Red_Jewel,Sardonyx,3,,3000,100,,,,,,,,,,,,,{},{},{}
-726,Blue_Jewel,Sapphire,3,,3000,100,,,,,,,,,,,,,{},{},{}
-727,White_Jewel,Opal,3,,3000,100,,,,,,,,,,,,,{},{},{}
-728,Golden_Jewel,Topaz,3,,3000,100,,,,,,,,,,,,,{},{},{}
-729,Bluish_Green_Jewel,Zircon,3,,3000,100,,,,,,,,,,,,,{},{},{}
-730,Crystal_Jewel,1carat Diamond,3,,5000,100,,,,,,,,,,,,,{},{},{}
-731,Crystal_Jewel_,2carat Diamond,3,,12500,100,,,,,,,,,,,,,{},{},{}
-732,Crystal_Jewel__,3carat Diamond,3,,27500,100,,,,,,,,,,,,,{},{},{}
-733,Crystal_Jewel___,Cracked Diamond,3,,1,100,,,,,,,,,,,,,{},{},{}
-734,Red_Frame,Red Frame,3,,1500,200,,,,,,,,,,,,,{},{},{}
-735,Blue_Porcelain,Chung Jah,3,,2500,500,,,,,,,,,,,,,{},{},{}
-736,White_Platter,China,3,,500,300,,,,,,,,,,,,,{},{},{}
-737,Black_Ladle,Black Ladle,3,,200,50,,,,,,,,,,,,,{},{},{}
-738,Pencil_Case,Pencil Case,3,,150,100,,,,,,,,,,,,,{},{},{}
-739,Rouge,Rouge,3,,5000,10,,,,,,,,,,,,,{},{},{}
-740,Stuffed_Doll,Puppet,3,,500,100,,,,,,,,,,,,,{},{},{}
-741,Poring_Doll,Poring Doll,3,,900,100,,,,,,,,,,,,,{},{},{}
-742,Chonchon_Doll,Chonchon Doll,3,,1500,100,,,,,,,,,,,,,{},{},{}
-743,Spore_Doll,Spore Doll,3,,2750,100,,,,,,,,,,,,,{},{},{}
-744,Bunch_Of_Flowers,Bouquet,3,,1000,50,,,,,,,,,,,,,{},{},{}
-745,Wedding_Bouquet,Wedding Bouquet,3,,5000,50,,,,,,,,,,,,,{},{},{}
-746,Glass_Bead,Glass Bead,3,,700,50,,,,,,,,,,,,,{},{},{}
-747,Crystal_Mirror,Crystal Mirror,3,,7500,50,,,,,,,,,,,,,{},{},{}
-748,Witherless_Rose,Witherless Rose,3,,27500,10,,,,,,,,,,,,,{},{},{}
-749,Frozen_Rose,Frozen Rose,3,,17500,10,,,,,,,,,,,,,{},{},{}
-750,Baphomet_Doll,Baphomet Doll,3,,9000,100,,,,,,,,,,,,,{},{},{}
-751,Osiris_Doll,Osiris Doll,3,,7000,100,,,,,,,,,,,,,{},{},{}
-752,Grasshopper_Doll,Grasshopper Doll,3,,2000,100,,,,,,,,,,,,,{},{},{}
-753,Monkey_Doll,Yoyo Doll,3,,3000,100,,,,,,,,,,,,,{},{},{}
-754,Raccoondog_Doll,Raccoon Doll,3,,2500,100,,,,,,,,,,,,,{},{},{}
-756,Oridecon_Stone,Rough Oridecon,3,,274,200,,,,,,,,,,,,,{},{},{}
-757,Elunium_Stone,Rough Elunium,3,,324,200,,,,,,,,,,,,,{},{},{}
-901,Danggie,Danggie,3,,125,10,,,,,,,,,,,,,{},{},{}
-902,Tree_Root,Tree Root,3,,6,10,,,,,,,,,,,,,{},{},{}
-903,Reptile_Tongue,Reptile Tongue,3,,25,10,,,,,,,,,,,,,{},{},{}
-904,Scorpion's_Tail,Scorpion Tail,3,,62,10,,,,,,,,,,,,,{},{},{}
-905,Stem,Stem,3,,29,10,,,,,,,,,,,,,{},{},{}
-906,Pointed_Scale,Pointed Scale,3,,35,10,,,,,,,,,,,,,{},{},{}
-907,Resin,Resin,3,,60,10,,,,,,,,,,,,,{},{},{}
-908,Spawn,Spawn,3,,74,10,,,,,,,,,,,,,{},{},{}
-909,Jellopy,Jellopy,3,,3,10,,,,,,,,,,,,,{},{},{}
-910,Garlet,Garlet,3,,20,10,,,,,,,,,,,,,{},{},{}
-911,Scell,Scell,3,,80,10,,,,,,,,,,,,,{},{},{}
-912,Zargon,Zargon,3,,240,10,,,,,,,,,,,,,{},{},{}
-913,Tooth_Of_Bat,Tooth of Bat,3,,17,10,,,,,,,,,,,,,{},{},{}
-914,Fluff,Fluff,3,,4,10,,,,,,,,,,,,,{},{},{}
-915,Chrysalis,Chrysalis,3,,4,10,,,,,,,,,,,,,{},{},{}
-916,Feather_Of_Birds,Feather of Birds,3,,5,10,,,,,,,,,,,,,{},{},{}
-917,Talon,Talon,3,,10,10,,,,,,,,,,,,,{},{},{}
-918,Sticky_Webfoot,Sticky Webfoot,3,,5,10,,,,,,,,,,,,,{},{},{}
-919,Animal's_Skin,Animal Skin,3,,18,10,,,,,,,,,,,,,{},{},{}
-920,Claw_Of_Wolves,Wolf Claw,3,,29,10,,,,,,,,,,,,,{},{},{}
-921,Mushroom_Spore,Mushroom Spore,3,,18,10,,,,,,,,,,,,,{},{},{}
-922,Orcish_Cuspid,Orc's Fang,3,,110,10,,,,,,,,,,,,,{},{},{}
-923,Evil_Horn,Evil Horn,3,,510,10,,,,,,,,,,,,,{},{},{}
-924,Powder_Of_Butterfly,Powder of Butterfly,3,,45,10,,,,,,,,,,,,,{},{},{}
-925,Bill_Of_Birds,Bill of Birds,3,,32,10,,,,,,,,,,,,,{},{},{}
-926,Scale_Of_Snakes,Snake Scale,3,,41,10,,,,,,,,,,,,,{},{},{}
-928,Insect_Feeler,Insect Feeler,3,,57,10,,,,,,,,,,,,,{},{},{}
-929,Immortal_Heart,Immortal Heart,3,,187,10,,,,,,,,,,,,,{},{},{}
-930,Rotten_Bandage,Rotten Bandage,3,,179,10,,,,,,,,,,,,,{},{},{}
-931,Orcish_Voucher,Orcish Voucher,3,,84,10,,,,,,,,,,,,,{},{},{}
-932,Skel_Bone,Skel-Bone,3,,116,10,,,,,,,,,,,,,{},{},{}
-934,Mementos,Memento,3,,300,10,,,,,,,,,,,,,{},{},{}
-935,Shell,Shell,3,,7,10,,,,,,,,,,,,,{},{},{}
-936,Scales_Shell,Scale Shell,3,,233,10,,,,,,,,,,,,,{},{},{}
-937,Posionous_Canine,Venom Canine,3,,74,10,,,,,,,,,,,,,{},{},{}
-938,Sticky_Mucus,Sticky Mucus,3,,35,10,,,,,,,,,,,,,{},{},{}
-939,Bee_Sting,Bee Sting,3,,16,10,,,,,,,,,,,,,{},{},{}
-940,Grasshopper's_Leg,Grasshopper's Leg,3,,18,10,,,,,,,,,,,,,{},{},{}
-941,Nose_Ring,Nose Ring,3,,284,10,,,,,,,,,,,,,{},{},{}
-942,Yoyo_Tail,Yoyo Tail,3,,57,10,,,,,,,,,,,,,{},{},{}
-943,Solid_Shell,Solid Shell,3,,224,10,,,,,,,,,,,,,{},{},{}
-944,Horseshoe,Horseshoe,3,,294,10,,,,,,,,,,,,,{},{},{}
-945,Raccoon_Leaf,Raccoon Leaf,3,,53,10,,,,,,,,,,,,,{},{},{}
-946,Snail's_Shell,Snail's Shell,3,,32,10,,,,,,,,,,,,,{},{},{}
-947,Horn,Horn,3,,58,10,,,,,,,,,,,,,{},{},{}
-948,Bear's_Foot,Bear's Footskin,3,,87,10,,,,,,,,,,,,,{},{},{}
-949,Feather,Feather,3,,5,10,,,,,,,,,,,,,{},{},{}
-950,Heart_Of_Mermaid,Heart of Mermaid,3,,132,10,,,,,,,,,,,,,{},{},{}
-951,Fin,Fin,3,,206,10,,,,,,,,,,,,,{},{},{}
-952,Cactus_Needle,Cactus Needle,3,,41,10,,,,,,,,,,,,,{},{},{}
-953,Stone_Heart,Stone Heart,3,,92,10,,,,,,,,,,,,,{},{},{}
-954,Shining_Scales,Shining Scale,3,,233,10,,,,,,,,,,,,,{},{},{}
-955,Worm_Peelings,Worm Peeling,3,,26,10,,,,,,,,,,,,,{},{},{}
-956,Gill,Gill,3,,171,10,,,,,,,,,,,,,{},{},{}
-957,Decayed_Nail,Decayed Nail,3,,41,10,,,,,,,,,,,,,{},{},{}
-958,Horrendous_Mouth,Horrendous Mouth,3,,195,10,,,,,,,,,,,,,{},{},{}
-959,Rotten_Scale,Stinky Scale,3,,84,10,,,,,,,,,,,,,{},{},{}
-960,Nipper,Nipper,3,,57,10,,,,,,,,,,,,,{},{},{}
-961,Conch,Conch,3,,79,10,,,,,,,,,,,,,{},{},{}
-962,Tentacle,Tentacle,3,,35,10,,,,,,,,,,,,,{},{},{}
-963,Sharp_Scale,Sharp Scale,3,,125,10,,,,,,,,,,,,,{},{},{}
-964,Crap_Shell,Crab Shell,3,,45,10,,,,,,,,,,,,,{},{},{}
-965,Clam_Shell,Clam Shell,3,,28,10,,,,,,,,,,,,,{},{},{}
-966,Flesh_Of_Clam,Clam Flesh,3,,79,10,,,,,,,,,,,,,{},{},{}
-967,Turtle_Shell,Turtle Shell,3,,340,10,,,,,,,,,,,,,{},{},{}
-968,Voucher_Of_Orcish_Hero,Heroic Emblem,3,,1500,10,,,,,,,,,,,,,{},{},{}
-969,Gold,Gold,3,,100000,200,,,,,,,,,,,,,{},{},{}
-970,Alchol,Alcohol,3,,200,30,,,,,,,,,,,,,{},{},{}
-971,Detrimindexta,Detrimindexta,3,,200,30,,,,,,,,,,,,,{},{},{}
-972,Karvodailnirol,Karvodailnirol,3,,200,30,,,,,,,,,,,,,{},{},{}
-973,Counteragent,Counteragent,3,,100,70,,,,,,,,,,,,,{},{},{}
-974,Mixture,Mixture,3,,100,70,,,,,,,,,,,,,{},{},{}
-975,Scarlet_Dyestuffs,Scarlet Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-976,Lemon_Dyestuffs,Lemon Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-978,Cobaltblue_Dyestuffs,Cobaltblue Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-979,Darkgreen_Dyestuffs,Darkgreen Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-980,Orange_Dyestuffs,Orange Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-981,Violet_Dyestuffs,Violet Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-982,White_Dyestuffs,White Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-983,Black_Dyestuffs,Black Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
-984,Oridecon,Oridecon,3,,550,200,,,,,,,,,,,,,{},{},{}
-985,Elunium,Elunium,3,,550,200,,,,,,,,,,,,,{},{},{}
-986,Anvil,Anvil,3,,15000,500,,,,,,,,,,,,,{},{},{}
-987,Oridecon_Anvil,Oridecon Anvil,3,,60000,700,,,,,,,,,,,,,{},{},{}
-988,Golden_Anvil,Golden Anvil,3,,150000,900,,,,,,,,,,,,,{},{},{}
-989,Emperium_Anvil,Emperium Anvil,3,,300000,1000,,,,,,,,,,,,,{},{},{}
-990,Boody_Red,Red Blood,3,,500,50,,,,,,,,,,,,,{},{},{}
-991,Crystal_Blue,Crystal Blue,3,,500,50,,,,,,,,,,,,,{},{},{}
-992,Wind_Of_Verdure,Wind of Verdure,3,,500,50,,,,,,,,,,,,,{},{},{}
-993,Yellow_Live,Green Live,3,,500,50,,,,,,,,,,,,,{},{},{}
-994,Flame_Heart,Flame Heart,3,,1500,300,,,,,,,,,,,,,{},{},{}
-995,Mistic_Frozen,Mystic Frozen,3,,1500,300,,,,,,,,,,,,,{},{},{}
-996,Rough_Wind,Rough Wind,3,,1500,300,,,,,,,,,,,,,{},{},{}
-997,Great_Nature,Great Nature,3,,1500,300,,,,,,,,,,,,,{},{},{}
-998,Iron,Iron,3,,50,50,,,,,,,,,,,,,{},{},{}
-999,Steel,Steel,3,,500,100,,,,,,,,,,,,,{},{},{}
-1000,Star_Crumb,Star Crumb,3,,2250,100,,,,,,,,,,,,,{},{},{}
-1001,Sparkling_Dust,Star Dust,3,,750,10,,,,,,,,,,,,,{},{},{}
-1002,Iron_Ore,Iron Ore,3,,25,150,,,,,,,,,,,,,{},{},{}
-1003,Coal,Coal,3,,250,50,,,,,,,,,,,,,{},{},{}
-1004,Patriotism_Marks,Chivalry Emblem,3,,1,100,,,,,,,,,,,,,{},{},{}
-1005,Hammer_Of_Blacksmith,Hammer of Blacksmith,3,,1,800,,,,,,,,,,,,,{},{},{}
-1006,Old_Magic_Book,Old Magicbook,3,,1,30,,,,,,,,,,,,,{},{},{}
-1007,Penetration,Necklace of Wisdom,3,,1,40,,,,,,,,,,,,,{},{},{}
-1008,Frozen_Heart,Necklace of Oblivion,3,,1,100,,,,,,,,,,,,,{},{},{}
-1009,Sacred_Marks,Hand of God,3,,1,20,,,,,,,,,,,,,{},{},{}
-1010,Phracon,Phracon,3,,100,200,,,,,,,,,,,,,{},{},{}
-1011,Emveretarcon,Emveretarcon,3,,500,200,,,,,,,,,,,,,{},{},{}
-1012,Lizard_Scruff,Frill,3,,125,10,,,,,,,,,,,,,{},{},{}
-1013,Colorful_Shell,Rainbow Shell,3,,45,10,,,,,,,,,,,,,{},{},{}
-1014,Jaws_Of_Ant,Ant Jaw,3,,116,10,,,,,,,,,,,,,{},{},{}
-1015,Thin_N'_Long_Tongue,Tongue,3,,264,10,,,,,,,,,,,,,{},{},{}
-1016,Rat_Tail,Rat Tail,3,,26,10,,,,,,,,,,,,,{},{},{}
-1017,Moustache_Of_Mole,Mole Whiskers,3,,53,10,,,,,,,,,,,,,{},{},{}
-1018,Nail_Of_Mole,Mole Claw,3,,105,10,,,,,,,,,,,,,{},{},{}
-1019,Wooden_Block,Trunk,3,,30,10,,,,,,,,,,,,,{},{},{}
-1020,Long_Hair,Black Hair,3,,146,10,,,,,,,,,,,,,{},{},{}
-1021,Dokkaebi_Horn,Dokebi Horn,3,,146,10,,,,,,,,,,,,,{},{},{}
-1022,Fox_Tail,Nine Tails,3,,325,10,,,,,,,,,,,,,{},{},{}
-1023,Fish_Tail,Fish Tail,3,,98,10,,,,,,,,,,,,,{},{},{}
-1024,Chinese_Ink,Squid Ink,3,,132,10,,,,,,,,,,,,,{},{},{}
-1025,Spiderweb,Cobweb,3,,92,10,,,,,,,,,,,,,{},{},{}
-1026,Acorn,Acorn,3,,49,10,,,,,,,,,,,,,{},{},{}
-1027,Porcupine_Spike,Porcupine Quill,3,,79,10,,,,,,,,,,,,,{},{},{}
-1028,Wild_Boar's_Mane,Mane,3,,98,10,,,,,,,,,,,,,{},{},{}
-1029,Tiger's_Skin,Tiger Skin,3,,274,10,,,,,,,,,,,,,{},{},{}
-1030,Tiger_Footskin,Tiger's Footskin,3,,750,10,,,,,,,,,,,,,{},{},{}
-1031,Limb_Of_Mantis,Mantis Scythe,3,,98,10,,,,,,,,,,,,,{},{},{}
-1032,Blossom_Of_Maneater,Maneater Blossom,3,,98,10,,,,,,,,,,,,,{},{},{}
-1033,Root_Of_Maneater,Maneater Root,3,,104,10,,,,,,,,,,,,,{},{},{}
-1034,Cobold_Hair,Blue Hair,3,,171,10,,,,,,,,,,,,,{},{},{}
-1035,Dragon_Canine,Dragon Canine,3,,242,10,,,,,,,,,,,,,{},{},{}
-1036,Dragon_Scale,Dragon Scale,3,,250,10,,,,,,,,,,,,,{},{},{}
-1037,Dragon_Train,Dragon Tail,3,,600,10,,,,,,,,,,,,,{},{},{}
-1038,Petite_DiablOfs_Horn,Little Evil Horn,3,,264,10,,,,,,,,,,,,,{},{},{}
-1039,Petite_DiablOfs_Wing,Little Evil Wing,3,,1000,10,,,,,,,,,,,,,{},{},{}
-1040,Elder_Pixie's_Beard,Elder Pixie's Moustache,3,,116,10,,,,,,,,,,,,,{},{},{}
-1041,Lantern,Lantern,3,,125,10,,,,,,,,,,,,,{},{},{}
-1042,Short_Leg,Bug Leg,3,,215,10,,,,,,,,,,,,,{},{},{}
-1043,Nail_Of_Orc,Orc Claw,3,,84,10,,,,,,,,,,,,,{},{},{}
-1044,Tooth_Of_,Zenorc's Fang,3,,132,10,,,,,,,,,,,,,{},{},{}
-1045,Sacred_Masque,Cultish Masque,3,,206,10,,,,,,,,,,,,,{},{},{}
-1046,Tweezer,Scorpion Nipper,3,,307,10,,,,,,,,,,,,,{},{},{}
-1047,Head_Of_Medusa,Dead Medusa,3,,274,10,,,,,,,,,,,,,{},{},{}
-1048,Slender_Snake,Horrendous Hair,3,,400,10,,,,,,,,,,,,,{},{},{}
-1049,Skirt_Of_Virgin,Skirt of Virgin,3,,850,10,,,,,,,,,,,,,{},{},{}
-1050,Tendon,Tendon,3,,110,10,,,,,,,,,,,,,{},{},{}
-1051,Detonator,Detonator,3,,225,10,,,,,,,,,,,,,{},{},{}
-1052,Single_Cell,Single Cell,3,,23,10,,,,,,,,,,,,,{},{},{}
-1053,Tooth_Of_Ancient_Fish,Ancient Tooth,3,,274,10,,,,,,,,,,,,,{},{},{}
-1054,Lip_Of_Ancient_Fish,Ancient Lips,3,,500,10,,,,,,,,,,,,,{},{},{}
-1055,Earthworm_Peeling,Earthworm Peeling,3,,98,10,,,,,,,,,,,,,{},{},{}
-1056,Grit,Grit,3,,153,10,,,,,,,,,,,,,{},{},{}
-1057,Moth_Dust,Moth Dust,3,,69,10,,,,,,,,,,,,,{},{},{}
-1058,Wing_Of_Moth,Moth Wings,3,,100,10,,,,,,,,,,,,,{},{},{}
-1059,Transparent_Cloth,Fabric,3,,153,10,,,,,,,,,,,,,{},{},{}
-1060,Golden_Hair,Golden Hair,3,,215,10,,,,,,,,,,,,,{},{},{}
-1061,Starsand_Of_Witch,Witched Starsand,3,,242,10,,,,,,,,,,,,,{},{},{}
-1062,Pumpkin_Head,Jack o' Pumpkin,3,,187,10,,,,,,,,,,,,,{},{},{}
-1063,Sharpened_Cuspid,Fang,3,,340,10,,,,,,,,,,,,,{},{},{}
-1064,Reins,Reins,3,,401,10,,,,,,,,,,,,,{},{},{}
-1065,Booby_Trap,Trap,3,,50,10,,,,,,,,,,,,,{},{},{}
-1066,Tree_Of_Archer_1,Fine-grained Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
-1067,Tree_Of_Archer_2,Solid Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
-1068,Tree_Of_Archer_3,Barren Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
-1069,Mushroom_Of_Thief_1,Orange Net Mushroom,3,,1,10,,,,,,,,,,,,,{},{},{}
-1070,Mushroom_Of_Thief_2,Orange Gooey Mushroom,3,,1,10,,,,,,,,,,,,,{},{},{}
-1071,Mage_Test_1,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
-1072,Delivery_Message,Delivery Message,3,,1,10,,,,,,,,,,,,,{},{},{}
-1073,Merchant_Voucher_1,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1074,Merchant_Voucher_2,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1075,Merchant_Voucher_3,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1076,Merchant_Voucher_4,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1077,Merchant_Voucher_5,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1078,Merchant_Voucher_6,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1079,Merchant_Voucher_7,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1080,Merchant_Voucher_8,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
-1081,Merchant_Box_1,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
-1082,Merchant_Box_2,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
-1083,Merchant_Box_3,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
-1084,Kapra's_Pass,Kafra Pass,3,,0,10,,,,,,,,,,,,,{},{},{}
-1085,Mage_Test_2,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
-1086,Mage_Test_3,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
-1087,Mage_Test_4,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
-1088,Morocc_Potion,Morocc Solution,3,,1,30,,,,,,,,,,,,,{},{},{}
-1089,Payon_Potion,Payon Solution,3,,1,30,,,,,,,,,,,,,{},{},{}
-1090,Mage_Test_Etc,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
-1091,Merchant_Box_Etc,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
-1092,Empty_Cylinder,Empty Test Tube,3,,2,20,,,,,,,,,,,,,{},{},{}
-1093,Empty_Potion,Empty Potion Bottle,3,,5,10,,,,,,,,,,,,,{},{},{}
-1094,Short_Daenggie,Short Daenggie,3,,139,10,,,,,,,,,,,,,{},{},{}
-1095,Needle_Of_Alarm,Clock Hand,3,,273,10,,,,,,,,,,,,,{},{},{}
-1096,Round_Shell,Round Shell,3,,477,10,,,,,,,,,,,,,{},{},{}
-1097,Worn_Out_Page,Worn Out Page,3,,410,10,,,,,,,,,,,,,{},{},{}
-1098,Manacles,Manacles,3,,329,10,,,,,,,,,,,,,{},{},{}
-1099,Worn_Out_Prison_Uniform,Worn-out Prison Uniform,3,,340,10,,,,,,,,,,,,,{},{},{}
-// Weapons
-//===================================================================
-// 1-Handed Swords
-1101,Sword,Sword,4,100,,500,25,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1102,Sword_,Sword,4,100,,500,25,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1103,Sword__,Sword,4,100,,500,25,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1104,Falchion,Falchion,4,1500,,600,39,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1105,Falchion_,Falchion,4,1500,,600,39,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1106,Falchion__,Falchion,4,1500,,600,39,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1107,Blade,Blade,4,2900,,700,53,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1108,Blade_,Blade,4,2900,,700,53,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1109,Blade__,Blade,4,2900,,700,53,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
-1110,Lapier,Rapier,4,10000,,500,70,,1,2,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1111,Lapier_,Rapier,4,10000,,500,70,,1,3,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1112,Lapier__,Rapier,4,10000,,500,70,,1,0,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1113,Scimiter,Scimitar,4,17000,,700,85,,1,2,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1114,Scimiter_,Scimitar,4,17000,,700,85,,1,3,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1115,Scimiter__,Scimitar,4,17000,,700,85,,1,0,0x000654E3,7,2,2,2,14,1,2,{},{},{}
-1116,Katana,Katana,4,2000,,1000,60,,1,3,0x00004082,7,2,34,1,4,1,3,{},{},{}
-1117,Katana_,Katana,4,2000,,1000,60,,1,4,0x00004082,7,2,34,1,4,1,3,{},{},{}
-1118,Katana__,Katana,4,2000,,1000,60,,1,0,0x00004082,7,2,34,1,4,1,3,{},{},{}
-1119,Tsurugi,Tsurugi,4,51000,,1200,130,,1,1,0x000654E2,7,2,2,3,27,1,2,{},{},{}
-1120,Tsurugi_,Tsurugi,4,51000,,1200,130,,1,2,0x000654E2,7,2,2,3,27,1,2,{},{},{}
-1121,Tsurugi__,Tsurugi,4,51000,,1200,130,,1,0,0x000654E2,7,2,2,3,27,1,2,{},{},{}
-1122,Ring_Pommel_Saber,Ring Pommel Saber,4,24000,,900,100,,1,2,0x000654E2,7,2,2,2,14,1,2,{},{},{}
-1123,Haedonggum,Haedonggum,4,50000,,900,120,,1,1,0x000654E2,7,2,2,3,27,1,2,{ bonus bInt,3; },{},{}
-1124,Orcish_Sword,Orcish sword,4,,10,800,90,,1,0,0x000654E3,7,2,2,3,5,1,2,{ bonus bUnbreakableWeapon,0; },{},{}
-1125,Ring_Pommel_Saber_,Ring Pommel Saber,4,24000,,900,100,,1,3,0x000654E2,7,2,2,2,14,1,2,{},{},{}
-1126,Saber,Saber,4,49000,,1000,115,,1,2,0x000654E2,7,2,2,3,27,1,2,{},{},{}
-1127,Saber_,Saber,4,49000,,1000,115,,1,3,0x000654E2,7,2,2,3,27,1,2,{},{},{}
-1128,Hae_Dong_Gum_,Haedonggum,4,50000,,900,120,,1,2,0x000654E2,7,2,2,3,27,1,2,{ bonus bInt,3; },{},{}
-1129,Flamberge,Flamberge,4,60000,,1500,150,,1,0,0x00004080,7,2,2,3,27,1,2,{},{},{}
-1130,Nagan,Nagan,4,,10,500,120,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; },{},{}
-1131,Ice_Falchon,Ice Falchion,4,,10,600,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,100; skill 14,3; bonus3 bAutoSpell,14,3,100; },{},{}
-1132,Edge,Edge,4,,10,700,115,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,RC_NonBoss,10; },{},{}
-1133,Fire_Brand,Fireblend,4,,10,500,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; skill 19,3; bonus3 bAutoSpell,19,3,100; },{},{}
-1134,Scissores_Sword,Caesar's Sword,4,,10,700,140,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant; },{},{}
-1135,Cutlas,Cutlus,4,,10,900,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ skill 5,5; bonus bStr,2; bonus bDef,1; },{},{}
-1136,Solar_Sword,Solar Sword,4,,10,1200,85,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; bonus2 bHPDrainRate,1000,1; bonus2 bSPLossRate,15,10000; },{},{}
-1137,Excalibur,Excalibur,4,,10,1200,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,Ele_Holy; },{},{}
-1138,Mysteltainn_,Mysteltainn,4,,10,1000,170,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Ghost,15; bonus3 bAutoSpell,16,3,100; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3; },{},{}
-1139,Tale_Fing_,Tirfing,4,,10,1000,200,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bHPLossRate,35,10000; },{},{}
-1140,Byeorrun_Gum,Byeollungum,4,,10,900,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bSubRace,RC_NonBoss,-10; bonus2 bAddRace,RC_Boss,5; bonus bAllStats,2; },{},{}
-1141,Immaterial_Sword,Immaterial Sword,4,,10,900,140,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Ghost; bonus2 bSPVanishRate,30,30; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon,0; },{},{}
-1142,Jewel_Sword,Jeweled Sword,4,,10,2200,104,,1,0,0x000654E2,7,2,2,3,68,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Jewel,5; },{},{}
-1143,Gaia_Sword,Gaia Sword,4,,10,2500,115,,1,0,0x000654E2,7,2,2,3,74,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Ore,5; },{},{}
-1144,Sasimi,Sashimi,4,,10,1400,75,,1,0,0x000654E2,7,2,2,3,48,1,2,{ bonus bAtkEle,Ele_Wind; bonus3 bAddMonsterDropItem,544,RC_Fish,4000; },{},{}
-1145,Holy_Avenger,Holy Avenger,4,,10,1350,125,,1,0,0x00004000,7,2,2,3,75,1,2,{ bonus bAtkEle,Ele_Holy; },{},{}
-1146,Town_Sword,Town Sword,4,42000,,800,100,,1,1,0x00000001,7,2,2,3,30,1,2,{},{},{}
-1147,Town_Sword_,Town Sword,4,42000,,800,100,,1,2,0x00000001,7,2,2,3,30,1,2,{},{},{}
-1148,Star_Dust_Blade,Star Dust Blade,4,,10,1000,140,,1,1,0x00000001,7,2,2,4,45,1,2,{ bonus2 bAddEff,Eff_Stun,500; bonus bUnbreakableWeapon,0; },{},{}
-1149,Flamberge__,Flamberge,4,60000,,1500,150,,1,2,0x00004080,7,2,2,3,27,1,2,{},{},{}
-// 2-Handed Swords
-1151,Slayer,Slayer,4,15000,,1300,90,,1,2,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1152,Slayer_,Slayer,4,15000,,1300,90,,1,3,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1153,Slayer__,Slayer,4,15000,,1300,90,,1,0,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1154,Bastard_Sword,Bastard Sword,4,22500,,1600,115,,1,2,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1155,Bastard_Sword_,Bastard Sword,4,22500,,1600,115,,1,3,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1156,Bastard_Sword__,Bastard Sword,4,22500,,1600,115,,1,0,0x00004082,7,2,34,2,18,1,3,{},{},{}
-1157,Two_Hand_Sword,Two-Handed Sword,4,60000,,2200,160,,1,1,0x00004082,7,2,34,3,33,1,3,{},{},{}
-1158,Two_Hand_Sword_,Two-Handed Sword,4,60000,,2200,160,,1,2,0x00004082,7,2,34,3,33,1,3,{},{},{}
-1159,Two_Hand_Sword__,Two-Handed Sword,4,60000,,2200,160,,1,0,0x00004082,7,2,34,3,33,1,3,{},{},{}
-1160,Broad_Sword,Broad Sword,4,65000,,2000,140,,1,1,0x00004082,7,2,34,3,33,1,3,{ bonus bDef,5; },{},{}
-1161,Balmung,Balmung,4,,10,1000,250,,2,0,0xFFFFFFFF,7,2,2,4,48,1,1,{ bonus bInt,20; bonus bLuk,20; },{},{}
-1162,Broad_Sword_,Broad Sword,4,65000,,2000,140,,1,2,0x00004082,7,2,34,3,33,1,3,{ bonus bDef,5; },{},{}
-1163,Claymore,Claymore,4,74000,,2500,180,,1,0,0x00004080,7,2,34,3,33,1,3,{},{},{}
-1164,Muramasa,Muramasa,4,,10,1000,155,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bCritical,30; bonus bAspdRate,8; bonus2 bAddEff2,Eff_Curse,100; },{},{}
-1165,Masamune,Masamune,4,,10,1000,200,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bFlee,30; bonus bStr,-5; bonus bAspdRate,2; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{}
-1166,Dragon_Slayer,Dragon Slayer,4,,10,1300,150,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15; },{},{}
-1167,Schweizersabel,Schweizersabel,4,,10,1600,160,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,20,3,100; },{},{}
-1168,Zweihander,Zweihander,4,,10,2200,200,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bUnbreakableWeapon,0; },{},{}
-1169,Executioner_,Executioner,4,,10,2200,155,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bAtkEle,Ele_Dark; },{},{}
-1170,Katzbalger,Katzbalger,4,,10,2000,175,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bVit,5; bonus bDef,10; },{},{}
-1171,Zweihander__,Zweihander,4,,10,2200,200,,1,2,0x00004082,7,2,34,4,48,1,3,{ bonus bUnbreakableWeapon,0; },{},{}
-1172,Claymore__,Claymore,4,74000,,2500,180,,1,2,0x00004080,7,2,34,3,33,1,3,{},{},{}
-// Daggers
-1201,Knife,Knife,4,50,,400,17,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1202,Knife_,Knife,4,50,,400,17,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1203,Knife__,Knife,4,50,,400,17,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1204,Cutter,Cutter,4,1250,,500,30,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1205,Cutter_,Cutter,4,1250,,500,30,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1206,Cutter__,Cutter,4,1250,,500,30,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1207,Main_Gauche,Main Gauche,4,2400,,600,43,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1208,Main_Gauche_,Main Gauche,4,2400,,600,43,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1209,Main_Gauche__,Main Gauche,4,2400,,600,43,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
-1210,Dirk,Dirk,4,8500,,500,59,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1211,Dirk_,Dirk,4,8500,,500,59,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1212,Dirk__,Dirk,4,8500,,500,59,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1213,Dagger,Dagger,4,14000,,600,73,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1214,Dagger_,Dagger,4,14000,,600,73,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1215,Dagger__,Dagger,4,14000,,600,73,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1216,Stiletto,Stiletto,4,19500,,700,87,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1217,Stiletto_,Stiletto,4,19500,,700,87,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1218,Stiletto__,Stiletto,4,19500,,700,87,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
-1219,Gladius,Gladius,4,43000,,700,105,,1,2,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
-1220,Gladius_,Gladius,4,43000,,700,105,,1,3,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
-1221,Gladius__,Gladius,4,43000,,700,105,,1,0,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
-1222,Damascus,Damascus,4,49000,,800,118,,1,1,0x028F5EEE,7,2,2,3,24,1,1,{ bonus bUnbreakableWeapon,0; },{},{}
-1223,Forturn_Sword,Fortune Sword,4,,10,500,90,,1,0,0x028F5EEE,7,2,2,4,24,1,1,{ bonus bLuk,5; bonus bFlee2,20; },{},{}
-1224,Sword_Breaker,Swordbreaker,4,,10,1000,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bBreakWeaponRate,500; },{},{}
-1225,Mail_Breaker,Mailbreaker,4,,10,1000,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bBreakArmorRate,500; },{},{}
-1226,Damascus_,Damascus,4,49000,,800,118,,1,2,0x028F5EEE,7,2,2,3,24,1,1,{ bonus bUnbreakableWeapon,0; },{},{}
-1227,Weeder_Knife,Weeder Knife,4,,10,400,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_Plant; bonus2 bAddRace,RC_Plant,15; bonus2 bSubRace,RC_Plant,15; },{},{}
-1228,Combat_Knife,Combat Knife,4,,10,400,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Demon,-10; },{},{}
-1229,Mama's_Knife,Kitchen Knife,4,,10,500,75,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bCritical,30; bonus2 bAddRace,RC_DemiHuman,3; bonus3 bAddMonsterDropItem,517,RC_Brute,5000; },{},{}
-1230,House_Auger,Ice Pick,4,,10,600,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; },{},{}
-1231,Bazerald,Bazerald,4,,10,500,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bAtkEle,Ele_Fire; bonus bInt,5; bonus bMatkRate,10; },{},{}
-1232,Assasin_Dagger,Assassin Dagger,4,,10,600,140,,1,0,0x00001000,7,2,2,4,36,1,1,{ bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdRate,2; bonus bAtkEle,Ele_Dark; },{},{}
-1233,Exercise,Exorciser,4,,10,700,90,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_Demon; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_DemiHuman,-10; },{},{}
-1234,Moonlight_Sword,Moonlight Dagger,4,,10,700,50,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bMaxSPrate,10; bonus bSPDrainValue,3; },{},{}
-1235,Azoth,Azoth,4,,10,700,110,,1,0,0x00040000,7,2,2,4,36,1,1,{ bonus bClassChange,300; },{},{}
-1236,Sucsamad,Sucsamad,4,,10,800,140,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0; },{},{}
-1237,Grimtooth_,Grimtooth,4,,10,800,180,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50; },{},{}
-1238,Zeny_Knife,Zeny Knife,4,,10,1200,64,,1,0,0x028F5EEE,7,2,2,3,70,1,1,{ bonus2 bGetZenyNum,10,100; },{},{}
-1239,Poison_Knife,Poison Knife,4,,10,800,64,,1,0,0x028F5EEE,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,3000; },{},{}
-1240,Princess_Knife,Princess Knife,4,,10,400,84,,1,0,0x028F5EEE,7,2,2,4,1,1,1,{ bonus bAllStats,1; },{},{}
-1241,Cursed_Dagger,Cursed Dagger,4,,10,400,55,,1,0,0x00810204,7,2,2,4,85,1,1,{ bonus2 bAddEff,Eff_Curse,500; },{},{}
-1242,Counter_Dagger,Dagger of Counter,4,,10,550,140,,1,0,0x00810204,7,2,2,4,55,1,1,{ bonus bCritical,90; },{},{}
-1243,Novice_Knife,Novice Main Gauche,4,,10,1,45,,1,0,0x00000001,7,2,2,1,1,0,1,{},{},{}
-1244,Holy_Dagger,Holy Dagger,4,,10,800,100,,1,0,0x028F5EEE,7,2,2,4,55,1,1,{ bonus bAtkEle,Ele_Holy; },{},{}
-1245,Cinquedea,Cinquedea,4,40000,,700,110,,1,1,0x00000001,7,2,2,3,30,1,1,{},{},{}
-1246,Cinquedea_,Cinquedea,4,40000,,700,110,,1,2,0x00000001,7,2,2,3,30,1,1,{},{},{}
-1247,Kindling_Dagger,Kindle Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Fire; },{},{}
-1248,Obsidian_Dagger,Obsidian Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Earth; },{},{}
-1249,Fisherman's_Dagger,Fisherman's Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Water; },{},{}
-// Katars
-1250,Jur,Jur,4,19500,,800,125,,1,2,0x00001000,7,2,34,2,18,1,16,{},{},{}
-1251,Jur_,Jur,4,19500,,800,125,,1,3,0x00001000,7,2,34,2,18,1,16,{},{},{}
-1252,Katar,Katar,4,41000,,1200,148,,1,1,0x00001000,7,2,34,3,33,1,16,{ bonus bDex,1; },{},{}
-1253,Katar_,Katar,4,41000,,1200,148,,1,2,0x00001000,7,2,34,3,33,1,16,{ bonus bDex,1; },{},{}
-1254,Jamadhar,Jamadhar,4,37200,,1500,165,,1,0,0x00001000,7,2,34,3,33,1,16,{},{},{}
-1255,Jamadhar_,Jamadhar,4,37200,,1500,165,,1,1,0x00001000,7,2,34,3,33,1,16,{},{},{}
-1256,Katar_Of_Cold_Icicle,Katar of Frozen Icicle,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; },{},{}
-1257,Katar_Of_Thornbush,Katar of Quaking,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Earth; bonus2 bAddEff,Eff_Blind,500; },{},{}
-1258,Katar_Of_Raging_Blaze,Katar of Raging Blaze,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500; },{},{}
-1259,Katar_Of_Piercing_Wind,Katar of Piercing Wind,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Sleep,500; },{},{}
-1260,Ghoul_Leg,Sharpened Legbone of Ghoul,4,52500,,1700,150,,1,0,0x00001000,7,2,34,3,65,1,16,{ bonus bAtkEle,Ele_Undead; },{},{}
-1261,Infiltrator,Infiltrator,4,57000,,1500,140,,1,0,0x00001000,7,2,34,4,75,1,16,{ bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; },{},{}
-1262,Nail_Of_Loki,Loki's Nail,4,,10,1200,115,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus2 bAddEff,Eff_Bleeding,500; },{},{}
-1263,Unholy_Touch,Unholy Touch,4,,10,1250,151,,1,0,0x00001000,7,2,34,4,70,1,16,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,500; bonus bCritical,-1; bonus bUnbreakableWeapon,0; },{},{}
-1264,Various_Jur,Specialty Jur,4,,10,800,90,,1,4,0x00001000,7,2,34,1,0,1,16,{ bonus2 bAddEff2,Eff_Bleeding,50; },{},{}
-1265,Bloody_Roar,Bloody Roar,4,,10,1000,120,,1,0,0x00001000,7,2,34,4,75,1,16,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bFlee,-160; bonus bFlee2,-160; bonus bNoRegen,1; bonus bNoRegen,2; },{},{}
-1266,Infiltrator_,Infiltrator,4,57000,,1500,140,,1,1,0x00001000,7,2,34,4,75,1,16,{ bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; },{},{}
-// 1-Handed Axes
-1301,Axe,Axe,4,500,,800,38,,1,3,0x000654E3,7,2,2,1,3,1,6,{},{},{}
-1302,Axe_,Axe,4,500,,800,38,,1,4,0x000654E3,7,2,2,1,3,1,6,{},{},{}
-1303,Axe__,Axe,4,500,,800,38,,1,0,0x000654E3,7,2,2,1,3,1,6,{},{},{}
-1304,Orcish_Axe,Orcish Axe,4,,10,1500,75,,1,0,0x000454A3,7,2,2,3,3,1,6,{},{},{}
-1305,Cleaver,Cleaver,4,,10,1200,140,,1,0,0x000444A2,7,2,2,4,44,1,6,{ bonus2 bAddRace,RC_DemiHuman,5; bonus3 bAddMonsterDropItem,517,RC_Brute,30; },{},{}
-1306,War_Axe,War Axe,4,,10,4200,145,,1,1,0x00040400,7,2,2,3,76,1,6,{ bonus bDex,2; bonus bLuk,2; },{},{}
-1307,Windhawk,Windhawk,4,,10,1500,115,,1,0,0x000444A2,7,2,2,2,14,1,6,{ bonus bAspdRate,5; },{},{}
-1308,Golden_Axe,Golden Axe,4,,10,3000,170,,1,0,0xFFFFFFFE,7,2,2,4,45,1,6,{},{},{}
-// 2-Handed Axes
-1351,Battle_Axe,Battle Axe,4,5400,,1500,80,,1,3,0x000444A2,7,2,34,1,3,1,7,{},{},{}
-1352,Battle_Axe_,Battle Axe,4,5400,,1500,80,,1,4,0x000444A2,7,2,34,1,3,1,7,{},{},{}
-1353,Battle_Axe__,Battle Axe,4,5400,,1500,80,,1,0,0x000444A2,7,2,34,1,3,1,7,{},{},{}
-1354,Hammer,Hammer,4,15500,,2000,120,,1,2,0x000444A2,7,2,34,2,16,1,7,{},{},{}
-1355,Hammer_,Hammer,4,15500,,2000,120,,1,3,0x000444A2,7,2,34,2,16,1,7,{},{},{}
-1356,Hammer__,Hammer,4,15500,,2000,120,,1,0,0x000444A2,7,2,34,2,16,1,7,{},{},{}
-1357,Buster,Buster,4,34000,,2200,155,,1,1,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1358,Buster_,Buster,4,34000,,2200,155,,1,2,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1359,Buster__,Buster,4,34000,,2200,155,,1,0,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1360,Two_Handed_Axe,Two-Handed Axe,4,55000,,2500,185,,1,1,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1361,Two_Handed_Axe_,Two-Handed Axe,4,55000,,2500,185,,1,2,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1362,Two_Handed_Axe__,Two-Handed Axe,4,55000,,2500,185,,1,0,0x000444A2,7,2,34,3,30,1,7,{},{},{}
-1363,Brood_Axe,Bloody Axe,4,,10,4000,170,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bStr,10; bonus bSpeedRate,25; },{},{}
-1364,Great_Axe,Great Axe,4,,10,1800,187,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bAddSkillBlow,42,5; bonus2 bAddEff,Eff_Stun,1500; },{},{}
-1365,Sabbath,Sabbath,4,,10,2300,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_Demon,50; bonus bAtkEle,Ele_Dark; bonus2 bCriticalAddRace,RC_Undead,50; },{},{}
-1366,Right_Epsilon,Light Epsilon,4,,10,2300,180,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Holy; skill 28,3; bonus2 bAddRace,RC_Demon,3; },{},{}
-1367,Slaughter,Slaughter,4,,10,2500,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40; bonus bAtkEle,Ele_Earth; },{},{}
-1368,Tomahawk,Tomahawk,4,,10,2500,165,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Wind; skill 337,1; },{},{}
-1369,Guillotine,Guillotine,4,,10,3000,215,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPGainRace,RC_DemiHuman,20; },{},{}
-// 1-Handed Spears
-1401,Javelin,Javelin,4,150,,700,28,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1402,Javelin_,Javelin,4,150,,700,28,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1403,Javelin__,Javelin,4,150,,700,28,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1404,Spear,Spear,4,1700,,850,44,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1405,Spear_,Spear,4,1700,,850,44,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1406,Spear__,Spear,4,1700,,850,44,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1407,Pike,Pike,4,3450,,1000,60,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1408,Pike_,Pike,4,3450,,1000,60,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1409,Pike__,Pike,4,3450,,1000,60,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
-1410,Lance,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1411,Lance_,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1412,Lance__,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1413,Gungnir,Gungnir,4,,10,500,120,,3,0,0x00004082,7,2,2,4,4,1,4,{ bonus bAtkEle,Ele_Wind; bonus bPerfectHitRate,25; bonus bHit,30; },{},{}
-1414,Gelerdria,Gelerdria,4,,10,700,145,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus bAtkEle,Ele_Earth; bonus bMaxHP,800; bonus bMaxSP,-50; },{},{}
-1415,Skewer,Brocca,4,,10,850,100,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus bIgnoreDefRace,RC_NonBoss; bonus2 bAddEle,Ele_Neutral,25; },{},{}
-1416,Tjungkuletti,Tjungkuletti,4,,10,1000,95,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus2 bSPDrainValue,1,1; bonus bSPGainValue,5; },{},{}
-1417,Pole_Axe,Pole Axe,4,,10,3800,160,,3,1,0x00004082,7,2,2,3,71,1,4,{ bonus bStr,1; bonus bInt,2; bonus bDex,1; },{},{}
-1418,Gungnir__,Gungnir,4,,10,500,120,,3,2,0x00004082,7,2,2,4,4,1,4,{ bonus bAtkEle,Ele_Wind; bonus bPerfectHitRate,25; bonus bHit,30; },{},{}
-// 2-Handed Spears
-1451,Guisarme,Guisarme,4,13000,,1000,84,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1452,Guisarme_,Guisarme,4,13000,,1000,84,,3,3,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1453,Guisarme__,Guisarme,4,13000,,1000,84,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1454,Glaive,Glaive,4,20000,,1200,104,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1455,Glaive_,Glaive,4,20000,,1200,104,,3,3,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1456,Glaive__,Glaive,4,20000,,1200,104,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1457,Partizan,Partizan,4,27700,,2000,124,,3,1,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1458,Partizan_,Partizan,4,27700,,2000,124,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1459,Partizan__,Partizan,4,27700,,2000,124,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
-1460,Trident,Trident,4,51000,,1200,150,,3,2,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1461,Trident_,Trident,4,51000,,1200,150,,3,3,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1462,Trident__,Trident,4,51000,,1200,150,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1463,Halberd,Halberd,4,54000,,2500,165,,3,1,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1464,Halberd_,Halberd,4,54000,,2500,165,,3,2,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1465,Halberd__,Halberd,4,54000,,2500,165,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
-1466,Crescent_Scythe,Crescent Scythe,4,,10,2500,180,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bCritical,30; bonus bHit,10; },{},{}
-1467,Bill_Guisarme,Bill Guisarme,4,,10,1000,183,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiHuman,5; },{},{}
-1468,Zephyrus,Zephyrus,4,,10,2000,170,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,100; },{},{}
-1469,Longinus's_Spear,Longinus's Spear,4,,10,2500,180,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Angel,10; },{},{}
-1470,Brionac,Brionac,4,,10,3000,190,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Holy; skill 28,5; bonus3 bAutoSpell,13,3,100; bonus2 bAddRace,RC_Boss,5; },{},{}
-1471,Hell_Fire,Hellfire,4,,10,3500,200,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Fire; bonus3 bAutoSpell,17,3,100; bonus bStr,3; },{},{}
-// 2-Handed Staffs
-1472,Staff_Of_Soul,Soul Staff,4,,10,1400,25,,1,0,0x00810204,7,2,34,3,73,1,10,{ bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15; },{},{}
-1473,Wizardy_Staff,Wizardry Staff,4,,10,2400,120,,1,0,0x00810204,7,2,34,4,90,1,10,{ bonus bInt,6; bonus bDex,2; bonus bMatkRate,15; },{},{}
-// 2-Handed Spears
-1474,Gae_Bolg,Gae Bolg,4,,10,2000,160,,3,0,0x00004082,7,2,34,4,60,1,5,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Boss,10; },{},{}
-1475,Horseback_Lance,Equestrian's Spear,4,,10,3700,200,,3,0,0x00004082,7,2,34,4,75,1,5,{},{},{}
-1476,Crescent_Scythe_,Crescent Scythe,4,,10,2500,180,,3,1,0x00004082,7,2,34,4,48,1,5,{ bonus bCritical,30; bonus bHit,10; },{},{}
-// Maces
-1501,Club,Club,4,120,,700,23,,1,3,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1502,Club_,Club,4,120,,700,23,,1,4,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1503,Club__,Club,4,120,,700,23,,1,0,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1504,Mace,Mace,4,1600,,800,37,,1,3,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1505,Mace_,Mace,4,1600,,800,37,,1,4,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1506,Mace__,Mace,4,1600,,800,37,,1,0,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
-1507,Smasher,Smasher,4,9000,,1000,54,,1,2,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
-1508,Smasher_,Smasher,4,9000,,1000,54,,1,3,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
-1509,Smasher__,Smasher,4,9000,,1000,54,,1,3,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
-1510,Flail,Flail,4,16000,,900,69,,1,2,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1511,Flail_,Flail,4,16000,,900,69,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1512,Flail__,Flail,4,16000,,900,69,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1513,Morning_Star,Morning Star,4,41000,,1500,110,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1514,Morning_Star_,Morning Star,4,41000,,1500,110,,1,2,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1515,Morning_Star__,Morning Star,4,41000,,1500,110,,1,2,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1516,Sword_Mace,Sword Mace,4,50000,,1200,130,,1,0,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1517,Sword_Mace_,Sword Mace,4,50000,,1200,130,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1518,Sword_Mace__,Sword Mace,4,50000,,1200,130,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
-1519,Chain,Chain,4,23000,,800,84,,1,2,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1520,Chain_,Chain,4,23000,,800,84,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1521,Chain__,Chain,4,23000,,800,84,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
-1522,Stunner,Stunner,4,60000,,2000,140,,1,0,0x00008110,7,2,2,3,27,1,8,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
-1523,Spike,Spike,4,,10,700,85,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{}
-1524,Golden_Mace,Golden Mace,4,,10,800,110,,1,1,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0; },{},{}
-1525,Long_Mace,Long Mace,4,,10,800,135,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bLongAtkDef,10; bonus bAtkRange,3; },{},{}
-1526,Slash,Slash,4,,10,1000,145,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{}
-1527,Quadrille,Quadrille,4,,10,900,165,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEle,Ele_Earth,10; },{},{}
-1528,Grand_Cross,Grand Cross,4,,10,1500,140,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,77,3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3; },{},{}
-1529,Iron_Driver,Iron Driver,4,,10,3000,155,,1,0,0x00008100,7,2,2,3,78,1,8,{ bonus bAtkRange,1; },{},{}
-1530,Mjolnir,Mjolnir,4,,10,6000,250,,1,0,0x000444A2,7,2,2,4,95,0,8,{ bonus bAtkEle,Ele_Wind; bonus bDex,40; bonus bStr,15; bonus bAspdRate,10; bonus bUnbreakableWeapon,0; },{},{}
-1531,Spanner,Wrench,4,,10,2500,115,,1,0,0x00008110,7,2,2,3,55,1,8,{ bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Stun,100; bonus2 bAddEff,Eff_Poison,100; bonus2 bAddEff,Eff_Freeze,100; },{},{}
-1532,Stunner__,Stunner,4,60000,,2000,140,,1,2,0x00008110,7,2,2,3,27,1,8,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
-1533,Warrior's_Balmung,Warrior's Balmung,4,,10,1000,170,,1,0,0xFFFFFFFF,7,2,2,4,48,1,2,{ bonus bAllStats,5; },{},{}
-// Books
-1550,Book,Book,4,30000,,600,85,,1,3,0x00410100,7,2,2,2,14,1,15,{},{},{}
-1551,Bible,Bible,4,60000,,1000,115,,1,2,0x00410100,7,2,2,3,27,1,15,{ bonus bInt,2; },{},{}
-1552,Tablet,Tablet,4,51000,,800,125,,1,1,0x00410100,7,2,2,3,27,1,15,{},{},{}
-1553,Book_Of_Billows,Book of Billows,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Water; },{},{}
-1554,Book_Of_Mother_Earth,Book of Mother Earth,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Earth; },{},{}
-1555,Book_Of_Blazing_Sun,Book of the Blazing Sun,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Fire; },{},{}
-1556,Book_Of_Gust_Of_Wind,Book of Gust of Wind,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Wind; },{},{}
-1557,Book_Of_The_Apocalypse,Book of the Apocalypse,4,35000,,800,120,,1,0,0x00410100,7,2,2,4,40,1,15,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Holy,5; bonus2 bAddEle,Ele_Water,7; bonus2 bAddEle,Ele_Earth,7; bonus2 bAddEle,Ele_Fire,7; bonus2 bAddEle,Ele_Wind,7; },{},{}
-1558,Girl's_Diary,Girl's Diary,4,,10,300,60,,1,1,0x00410100,7,2,2,4,40,1,15,{ bonus2 bAddDamageClass,1188,150; },{},{}
-1559,Legacy_Of_Dragon,Legacy of Dragon,4,,10,700,130,,1,0,0x00410100,7,2,2,4,70,1,15,{ bonus bInt,3; bonus bIgnoreDefRace,RC_Dragon; bonus2 bSPGainRace,RC_Dragon,10; },{},{}
-1560,Diary_Of_Great_Sage,Sage's Diary,4,,10,1100,100,,1,2,0x00410100,7,2,2,3,60,1,15,{ bonus bMatkRate,15; if(readparam(bStr)>=50) bonus bAspdRate,5; if(readparam(bInt)>=70) bonus bMatkRate,5; },{},{}
-1561,Hardback,Hardcover Book,4,,10,1500,140,,1,1,0x00410100,7,2,2,4,55,1,15,{ bonus bStr,3; bonus bDex,2; },{},{}
-1562,Bible_Of_Battlefield,Battlefield Textbook,4,,10,700,110,,1,1,0x00410100,7,2,2,4,80,1,15,{ bonus bInt,3; bonus4 bAutoSpell,34,3+(getskilllv(34)>3)*(getskilllv(34)-3),10,0; },{},{}
-1599,Angra_Manyu,Angra Manyu,4,120,,10,1,,1,4,0x000FDFFF,7,2,2,4,2,1,8,{ bonus bBaseAtk,3800; bonus2 bHPDrainRate,1000,100; },{},{}
-// Staffs
-1601,Rod,Rod,4,50,,400,15,,1,3,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
-1602,Rod_,Rod,4,50,,400,15,,1,4,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
-1603,Rod__,Rod,4,50,,400,15,,1,0,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
-1604,Wand,Wand,4,2500,,400,25,,1,2,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
-1605,Wand_,Wand,4,2500,,400,25,,1,3,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
-1606,Wand__,Wand,4,2500,,400,25,,1,0,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
-1607,Staff,Staff,4,9500,,400,40,,1,2,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
-1608,Staff_,Staff,4,9500,,400,40,,1,3,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
-1609,Staff__,Staff,4,9500,,400,40,,1,0,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
-1610,Arc_Wand,Arc Wand,4,45000,,400,60,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
-1611,Arc_Wand_,Arc Wand,4,45000,,400,60,,1,2,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
-1612,Arc_Wand__,Arc Wand,4,45000,,400,60,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
-1613,Mighty_Staff,Mighty Staff,4,,10,700,130,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bStr,10; bonus bMatkRate,15; bonus bSPDrainValue,-2; },{},{}
-1614,Blessed_Wand,Wand of Occult,4,,10,700,75,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
-1615,Bone_Wand,Evil Bone Wand,4,,10,700,40,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,4; bonus bAtkEle,Ele_Undead; bonus bMatkRate,15; },{},{}
-1616,Staff_Of_Wing,Wing Staff,4,86000,,500,60,,1,0,0x00810204,7,2,2,4,40,1,10,{ bonus bMatkRate,15; bonus bCastrate,-5; },{},{}
-1617,Survival_Rod,Survivor's Rod,4,85000,,1000,50,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bDex,2; bonus bMatkRate,15; bonus bMaxHP,300; },{},{}
-1618,Survival_Rod_,Survivor's Rod,4,85000,,1000,50,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bDex,3; bonus bMatkRate,15; bonus bMaxHP,400; },{},{}
-1619,Survival_Rod2,Survivor's Rod,4,85000,,1000,50,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,2; bonus bMatkRate,15; bonus bMaxHP,300; },{},{}
-1620,Survival_Rod2_,Survivor's Rod,4,85000,,1000,50,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; bonus bMaxHP,400; },{},{}
-1621,Hypnotist's_Staff,Hypnotist's Staff,4,86000,,500,70,,1,1,0x00000001,7,2,2,3,30,1,10,{ bonus bInt,1; bonus bMatkRate,25; },{},{}
-1622,Hypnotist's_Staff_,Hypnotist's Staff,4,86000,,500,70,,1,2,0x00000001,7,2,2,3,30,1,10,{ bonus bInt,1; bonus bMatkRate,25; },{},{}
-// Bows
-1701,Bow,Bow,4,1000,,500,15,,5,3,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1702,Bow_,Bow,4,1000,,500,15,,5,4,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1703,Bow__,Bow,4,1000,,500,15,,5,0,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1704,Composite_Bow,Composite Bow,4,2500,,600,29,,5,3,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1705,Composite_Bow_,Composite Bow,4,2500,,600,29,,5,4,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1706,Composite_Bow__,Composite Bow,4,2500,,600,29,,5,0,0x000A0848,7,2,34,1,4,1,11,{},{},{}
-1707,Great_Bow,Great Bow,4,10000,,1000,50,,5,2,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1708,Great_Bow_,Great Bow,4,10000,,1000,50,,5,3,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1709,Great_Bow__,Great Bow,4,10000,,1000,50,,5,0,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1710,CrossBow,Crossbow,4,17000,,900,65,,5,2,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1711,CrossBow_,Crossbow,4,17000,,900,65,,5,3,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1712,CrossBow__,Crossbow,4,17000,,900,65,,5,0,0x000A0848,7,2,34,2,18,1,11,{},{},{}
-1713,Arbalest,Arbalest,4,48000,,1000,90,,5,1,0x000A0848,7,2,34,3,33,1,11,{ bonus bDex,2; },{},{}
-1714,Kakkung,Gakkung Bow,4,42000,,1100,100,,5,1,0x000A0848,7,2,34,3,33,1,11,{},{},{}
-1715,Arbalest_,Arbalest,4,48000,,1000,90,,5,2,0x000A0848,7,2,34,3,33,1,11,{ bonus bDex,2; },{},{}
-1716,Kakkung_,Gakkung Bow,4,42000,,1100,100,,5,2,0x000A0848,7,2,34,3,33,1,11,{},{},{}
-1718,Hunter_Bow,Hunter Bow,4,64000,,1500,125,,5,0,0x00000800,7,2,34,3,33,1,11,{},{},{}
-1719,Bow_Of_Roguemaster,Roguemaster's Bow,4,,10,500,75,,11,0,0x00000040,7,2,34,4,48,1,11,{},{},{}
-1720,Bow_Of_Rudra,Rudra Bow,4,,10,1200,150,,5,0,0x000A0808,7,2,34,4,48,1,11,{ bonus bAtkEle,Ele_Holy; bonus bInt,5; skill 35,1; skill 28,1; bonus2 bResEff,Eff_Poison,5000; bonus2 bResEff,Eff_Curse,5000; bonus2 bResEff,Eff_Silence,5000; bonus2 bResEff,Eff_Confusion,5000; bonus2 bResEff,Eff_Blind,5000; },{},{}
-1721,Repeting_CrossBow,Repeating Crossbow,4,89000,,2000,95,,9,1,0x00020840,7,2,34,3,65,1,11,{},{},{}
-1722,Balistar,Ballista,4,,10,3500,145,,5,0,0x00080800,7,2,34,4,77,1,11,{},{},{}
-1723,Luna_Bow,Luna Bow,4,,10,2000,100,,5,2,0x00000800,7,2,34,3,30,1,11,{ bonus bDef,2+3*(getrefine()>9)+(getrefine()>6 && getrefine()<=9); },{},{}
-1724,Dragon_Wing,Dragon Wing,4,,10,1200,100,,5,0,0x000A0848,7,2,34,4,60,1,11,{ bonus3 bAddMonsterDropItem,1765,RC_Dragon,300; bonus bIgnoreDefRace,RC_Dragon; },{},{}
-1725,Wandering_Bard's_Bow,Minstrel Bow,4,,10,1700,120,,5,1,0x00080800,7,2,34,4,70,1,11,{ bonus bInt,2; bonus bSPrecovRate,10; },{},{}
-1726,Hunter_Bow_,Hunter Bow,4,64000,,1500,125,,5,1,0x00000800,7,2,34,3,33,1,11,{},{},{}
-1727,Ballista_,Ballista,4,,10,3500,145,,5,1,0x00080800,7,2,34,4,77,1,11,{},{},{}
-// Arrows
-1750,Arrow,Arrow,10,1,,1,25,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
-1751,Silver_Arrow,Silver Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; },{},{}
-1752,Fire_Arrow,Fire Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Fire; },{},{}
-1753,Steel_Arrow,Steel Arrow,10,2,,2,40,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
-1754,Crystal_Arrow,Crystal Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Water; },{},{}
-1755,Arrow_Of_Wind,Arrow of Wind,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Wind; },{},{}
-1756,Stone_Arrow,Stone Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Earth; },{},{}
-1757,Immatrial_Arrow,Immaterial Arrow,10,3,,1,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Ghost; },{},{}
-1758,Stun_Arrow,Stun Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
-1759,Freezing_Arrow,Frozen Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,1000; },{},{}
-1760,Flash_Arrow,Flash Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Blind,1000; },{},{}
-1761,Curse_Arrow,Cursed Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Curse,1000; },{},{}
-1762,Rusty_Arrow,Rusty Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Poison; },{},{}
-1763,Poison_Arrow,Poison Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,2000; },{},{}
-1764,Incisive_Arrow,Sharp Arrow,10,3,,3,10,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bCritical,10; },{},{}
-1765,Oridecon_Arrow,Oridecon Arrow,10,3,,3,50,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
-1766,Arrow_Of_Counter_Evil,Arrow of Counter Evil,10,40,,3,50,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; },{},{}
-1767,Arrow_Of_Shadow,Shadow Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Dark; },{},{}
-1768,Sleep_Arrow,Sleep Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Sleep,2000; },{},{}
-1769,Silence_Arrow,Mute Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Silence,1000; },{},{}
-1770,Iron_Arrow,Iron Arrow,10,2,,1,30,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
-1771,Venom_Knife,Venom Knife,10,50,,5,30,,,,0x00001000,7,2,32768,,1,,2,{},{},{}
-1772,Holy_Arrow,Holy Arrow,10,3,,2,50,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; bonus2 bAddRace,RC_Demon,5; },{},{}
-// Knuckles
-1801,Waghnakh,Waghnak,4,8000,,400,30,,1,3,0x00008100,7,2,2,1,1,1,12,{},{},{}
-1802,Waghnakh_,Waghnak,4,8000,,400,30,,1,4,0x00008100,7,2,2,1,1,1,12,{},{},{}
-1803,Knuckle_Duster,Knuckle Duster,4,25000,,450,50,,1,2,0x00008100,7,2,2,2,12,1,12,{},{},{}
-1804,Knuckle_Duster_,Knuckle Duster,4,25000,,450,50,,1,3,0x00008100,7,2,2,2,12,1,12,{},{},{}
-1805,Hora,Studded Knuckles,4,32000,,450,65,,1,2,0x00008100,7,2,2,2,12,1,12,{},{},{}
-1806,Hora_,Studded Knuckles,4,32000,,450,65,,1,3,0x00008100,7,2,2,2,12,1,12,{},{},{}
-1807,Fist,Fist,4,53000,,650,115,,1,0,0x00008100,7,2,2,3,24,1,12,{},{},{}
-1808,Fist_,Fist,4,53000,,650,115,,1,1,0x00008100,7,2,2,3,24,1,12,{},{},{}
-1809,Claw,Claw,4,67000,,500,86,,1,1,0x00008100,7,2,2,3,24,1,12,{ bonus bStr,2; },{},{}
-1810,Claw_,Claw,4,67000,,500,86,,1,2,0x00008100,7,2,2,3,24,1,12,{ bonus bStr,2; },{},{}
-1811,Finger,Finger,4,58000,,500,97,,1,1,0x00008100,7,2,2,3,24,1,12,{},{},{}
-1812,Finger_,Finger,4,58000,,500,97,,1,2,0x00008100,7,2,2,3,24,1,12,{},{},{}
-1813,Kaiser_Knuckle,Kaiser Knuckle,4,,10,450,110,,1,0,0x00008100,7,2,2,4,36,1,12,{ bonus bAtkEle,Ele_Wind; bonus2 bAddRace,RC_Undead,5; bonus2 bAddEle,Ele_Water,10; bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Fire,10; bonus2 bAddEle,Ele_Wind,10; },{},{}
-1814,Berserk,Berserk,4,,10,500,120,,1,0,0x00008100,7,2,2,4,36,1,12,{ bonus bAspdRate,12; },{},{}
-1815,Claw_Of_Garm,Garm Claw,4,,10,550,152,,1,1,0x00008100,7,2,2,4,70,1,12,{ bonus bAtkEle,Ele_Dark; bonus bMaxHPrate,-2; bonus2 bAddEff,Eff_Bleeding,500; },{},{}
-1816,Berserk_,Berserk,4,,10,500,120,,1,1,0x00008100,7,2,2,4,36,1,12,{ bonus bAspdRate,12; },{},{}
-// Instruments
-1901,Violin,Violin,4,4000,,700,50,,1,3,0x00080000,7,1,2,1,2,1,13,{},{},{}
-1902,Violin_,Violin,4,4000,,700,50,,1,4,0x00080000,7,1,2,1,2,1,13,{},{},{}
-1903,Mandolin,Mandolin,4,18000,,400,90,,1,2,0x00080000,7,1,2,2,14,1,13,{},{},{}
-1904,Mandolin_,Mandolin,4,18000,,400,90,,1,3,0x00080000,7,1,2,2,14,1,13,{},{},{}
-1905,Lute,Lute,4,24500,,500,105,,1,2,0x00080000,7,1,2,2,14,1,13,{},{},{}
-1906,Lute_,Lute,4,24500,,500,105,,1,3,0x00080000,7,1,2,2,14,1,13,{},{},{}
-1907,Guitar,Guitar,4,47000,,900,142,,1,0,0x00080000,7,1,2,3,27,1,13,{},{},{}
-1908,Guitar_,Guitar,4,47000,,900,142,,1,1,0x00080000,7,1,2,3,27,1,13,{},{},{}
-1909,Harp,Harp,4,62000,,900,114,,1,1,0x00080000,7,1,2,3,27,1,13,{ bonus bInt,2; },{},{}
-1910,Harp_,Harp,4,62000,,900,114,,1,2,0x00080000,7,1,2,3,27,1,13,{ bonus bInt,2; },{},{}
-1911,Guh_Moon_Goh,Gumoongoh,4,54000,,1300,126,,1,1,0x00080000,7,1,2,3,27,1,13,{},{},{}
-1912,Guh_Moon_Goh_,Gumoongoh,4,54000,,1300,126,,1,2,0x00080000,7,1,2,3,27,1,13,{},{},{}
-1913,Electronic_Guitar,Electric Guitar,4,,10,1800,110,,1,0,0x00080000,7,1,2,4,70,1,13,{ skill 84,1; bonus3 bAutoSpell,84,1,100; bonus bAtkEle,Ele_Wind; bonus bInt,2; bonus bAgi,1; },{},{}
-1914,Guitar_Of_Passion,Burning Passion Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Fire; },{},{}
-1915,Guitar_Of_Blue_Solo,Loner's Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Water; },{},{}
-1916,Guitar_Of_Vast_Land,Green Acre Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Earth; },{},{}
-1917,Guitar_Of_Gentle_Breeze,Gentle Breeze Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Wind; },{},{}
-1918,Oriental_Lute,Oriental Lute,4,,10,1200,150,,1,0,0x00080000,7,1,2,4,65,1,13,{ bonus2 bSkillAtk,394,10; bonus2 bSkillAtk,316,10; },{},{}
-// Whips
-1950,Rope,Rope,4,2500,,400,45,,2,3,0x00080000,7,0,2,1,3,1,14,{},{},{}
-1951,Rope_,Rope,4,2500,,400,45,,2,4,0x00080000,7,0,2,1,3,1,14,{},{},{}
-1952,Line,Whip,4,12000,,300,80,,2,2,0x00080000,7,0,2,2,16,1,14,{},{},{}
-1953,Line_,Whip,4,12000,,300,80,,2,3,0x00080000,7,0,2,2,16,1,14,{},{},{}
-1954,Wire,Wire Whip,4,17500,,1000,95,,2,2,0x00080000,7,0,2,2,16,1,14,{},{},{}
-1955,Wire_,Wire Whip,4,17500,,1000,95,,2,3,0x00080000,7,0,2,2,16,1,14,{},{},{}
-1956,Rante,Rante Whip,4,32000,,900,135,,2,0,0x00080000,7,0,2,3,30,1,14,{},{},{}
-1957,Rante_,Rante Whip,4,32000,,900,135,,2,1,0x00080000,7,0,2,3,30,1,14,{},{},{}
-1958,Tail,Tail Whip,4,41000,,700,105,,2,1,0x00080000,7,0,2,3,30,1,14,{ bonus bLuk,3; },{},{}
-1959,Tail_,Tail Whip,4,41000,,700,105,,2,2,0x00080000,7,0,2,3,30,1,14,{ bonus bLuk,3; },{},{}
-1960,Whip,Whip,4,38000,,700,120,,2,1,0x00080000,7,0,2,3,30,1,14,{},{},{}
-1961,Whip_,Whip,4,38000,,700,120,,2,2,0x00080000,7,0,2,3,30,1,14,{},{},{}
-1962,Lariat,Lariat Whip,4,,10,400,100,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bDex,5; bonus bAgi,1; },{},{}
-1963,Rapture_Rose,Rapture Rose,4,,10,300,115,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,5000; },{},{}
-1964,Chemeti,Chemeti Whip,4,,10,700,135,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2; },{},{}
-1965,Whip_Of_Red_Flame,Red Flame Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Fire; },{},{}
-1966,Whip_Of_Ice_Piece,Icicle Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Water; },{},{}
-1967,Whip_Of_Earth,Gaia Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Earth; },{},{}
-1968,Jump_Rope,Skipping Rope,4,,10,400,120,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bCritical,20; },{},{}
-1969,Bladed_Whip,Blade Whip,4,,10,1200,140,,2,0,0x00080000,7,0,2,4,30,1,14,{ bonus2 bAddEff,Eff_Bleeding,500; },{},{}
-1970,Queen's_Whip,Queen's Whip,4,,10,1100,150,,2,0,0x00080000,7,0,2,4,65,1,14,{ bonus2 bSkillAtk,394,10; bonus2 bSkillAtk,324,10; },{},{}
-1971,Electric_Wire,Electric Wire,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Wind; },{},{}
-// Shields
-//===================================================================
-2101,Guard,Guard,5,500,,300,,3,,0,0xFFFFFFFF,7,2,32,,0,1,1,{},{},{}
-2102,Guard_,Guard,5,500,,300,,3,,1,0xFFFFFFFF,7,2,32,,0,1,1,{},{},{}
-2103,Buckler,Buckler,5,14000,,600,,4,,0,0x000ED5F2,7,2,32,,0,1,2,{},{},{}
-2104,Buckler_,Buckler,5,14000,,600,,4,,1,0x000ED5F2,7,2,32,,0,1,2,{},{},{}
-2105,Shield,Shield,5,56000,,1300,,6,,0,0x00004082,7,2,32,,0,1,3,{},{},{}
-2106,Shield_,Shield,5,56000,,1300,,6,,1,0x00004082,7,2,32,,0,1,3,{},{},{}
-2107,Mirror_Shield,Mirror Shield,5,60000,,1000,,4,,0,0x00404082,7,2,32,,0,1,4,{ bonus bMdef,5; },{},{}
-2108,Mirror_Shield_,Mirror Shield,5,60000,,1000,,4,,1,0x00404082,7,2,32,,0,1,4,{ bonus bMdef,5; },{},{}
-2109,Memorize_Book,Memory Book,5,,10,1000,,3,,0,0x00810204,7,2,32,,0,1,0,{ bonus bInt,1; bonus bMdef,2; },{},{}
-2110,Holy_Guard,Holy Guard,5,85000,,1400,,5,,0,0x00004000,7,2,32,,68,0,3,{ bonus bVit,2; bonus bMdef,2; },{},{}
-2111,Herald_Of_GOD,Sacred Mission,5,128000,,1600,,5,,0,0x00004000,7,2,32,,83,1,3,{ bonus bVit,3; bonus bInt,2; bonus bMdef,3; bonus bUnbreakableShield,0; },{},{}
-2112,Novice_Guard,Novice Guard,5,1,,1,,3,,0,0x00000001,7,2,32,,0,0,1,{},{},{}
-2113,Novice_Shield,Novice Shield,5,5000,,1000,,3,,1,0x00000001,7,2,32,,40,1,3,{ bonus2 bSubEle,Ele_Water,20; bonus2 bSubEle,Ele_Earth,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Wind,20; bonus2 bSubEle,Ele_Poison,20; bonus2 bSubEle,Ele_Ghost,20; bonus2 bSubEle,Ele_Undead,20; },{},{}
-2114,Stone_Buckler,Stone Buckler,5,30000,,1500,,3,,1,0xFFFFFFFE,7,2,32,,65,1,2,{ bonus2 bSubSize,2,5; if (isequipped(2353,5122)) { bonus bStr,2; bonus bDef,5; bonus bMdef,5; if(BaseClass == Job_Swordman) bonus bDef,6; } },{},{}
-2115,Valkyrja's_Shield,Valkyrie's Shield,5,30000,,500,,3,,1,0xFFFFFFFE,7,2,32,,65,1,3,{ bonus2 bSubEle,Ele_Water,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Undead,20; bonus bMdef,5; if(isequipped(2353,5124)) { bonus bDef,2; bonus bMdef,5+getRefine()+getequiprefinerycnt(1); } },{},{}
-2116,Angel's_Safeguard,Angelic Guard,5,10000,,400,,3,,1,0x00000001,7,2,32,,20,1,3,{ bonus2 bSubRace,RC_Demon,5; },{},{}
-2117,Gauntlet,Gauntlet,5,10000,,150,,5,,0,0x02000000,7,2,32,,20,1,,{},{},{}
-2118,Gauntlet_,Gauntlet,5,10000,,150,,5,,1,0x02000000,7,2,32,,20,1,,{},{},{}
-2119,Superior_Gauntlet,Superior Gauntlet,5,40000,,150,,4,,0,0x02000000,7,2,32,,50,1,,{ bonus bMdef,5; },{},{}
-2120,Superior_Gauntlet_,Superior Gauntlet,5,40000,,150,,4,,1,0x02000000,7,2,32,,50,1,,{ bonus bMdef,5; },{},{}
-2121,Memory_Book_,Memory Book,5,,10,1000,,3,,1,0x00810204,7,2,32,,0,1,0,{ bonus bInt,1; bonus bMdef,2; },{},{}
-2199,Ahura_Mazda,Ahura Mazdah,5,1,,10,,100,,0,0xFFFFFFFF,7,2,32,,1,1,0,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; skill 479,5; },{},{}
-// Headgears
-//===================================================================
-2201,Sunglasses,Sunglasses,5,5000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,12,{ bonus2 bResEff,Eff_Blind,500; },{},{}
-2202,Sunglasses_,Sunglasses,5,5000,,100,,0,,1,0xFFFFFFFF,7,2,512,,0,0,12,{ bonus2 bResEff,Eff_Blind,500; },{},{}
-2203,Glasses,Glasses,5,4000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,3,{},{},{}
-2204,Glasses_,Glasses,5,4000,,100,,0,,1,0xFFFFFFFF,7,2,512,,0,0,3,{},{},{}
-2205,Diver's_Goggles,Diver Goggles,5,3500,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,10,{},{},{}
-2206,Wedding_Veil,Wedding Veil,5,23000,,100,,0,,0,0xFFFFFFFF,7,0,256,,0,1,44,{ bonus bMdef,5; },{},{}
-2207,Fancy_Flower,Fancy Flower,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,4,{ bonus2 bSubRace,RC_Plant,10; },{},{}
-2208,Ribbon,Ribbon,5,800,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,17,{ bonus bMdef,3; },{},{}
-2209,Ribbon_,Ribbon,5,800,,100,,1,,1,0xFFFFFFFF,7,2,256,,0,1,17,{ bonus bMdef,3; },{},{}
-2210,Hair_Band,Hair Band,5,500,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,9,{},{},{}
-2211,Bandana,Bandana,5,400,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,6,{},{},{}
-2212,Eye_Bandage,Eye Patch,5,1000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,13,{},{},{}
-2213,Cat_Hairband,Kitty Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,2,{},{},{}
-2214,Bunny_Band,Bunny Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,15,{ bonus bLuk,2; },{},{}
-2215,Flower_Hairband,Flower Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,5,{},{},{}
-2216,Biretta,Biretta,5,9000,,100,,4,,0,0x00008110,7,2,256,,0,1,11,{},{},{}
-2217,Biretta_,Biretta,5,9000,,100,,4,,1,0x00008110,7,2,256,,0,1,11,{},{},{}
-2218,Flu_Mask,Flu Mask,5,300,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,8,{ bonus2 bResEff,Eff_Silence,1000; },{},{}
-2219,Flu_Mask_,Flu Mask,5,300,,100,,0,,1,0xFFFFFFFF,7,2,1,,0,0,8,{ bonus2 bResEff,Eff_Silence,1000; },{},{}
-2220,Hat,Hat,5,1000,,200,,2,,0,0xFFFFFFFF,7,2,256,,0,1,16,{},{},{}
-2221,Hat_,Hat,5,1000,,200,,2,,1,0xFFFFFFFF,7,2,256,,0,1,16,{},{},{}
-2222,Turban,Turban,5,4500,,300,,3,,0,0xFFFFFFFE,7,2,256,,0,1,7,{},{},{}
-2223,Turban_,Turban,5,4500,,300,,3,,1,0xFFFFFFFE,7,2,256,,0,1,7,{},{},{}
-2224,Goggle,Goggles,5,10000,,300,,5,,0,0x000E5CEA,7,2,768,,0,1,1,{},{},{}
-2225,Goggle_,Goggles,5,10000,,300,,5,,1,0x000E5CEA,7,2,768,,0,1,1,{},{},{}
-2226,Cap,Cap,5,12000,,400,,4,,0,0x000E5CEA,7,2,256,,0,1,14,{},{},{}
-2227,Cap_,Cap,5,12000,,400,,4,,1,0x000E5CEA,7,2,256,,0,1,14,{},{},{}
-2228,Helm,Helm,5,44000,,600,,6,,0,0x00004082,7,2,256,,0,1,40,{},{},{}
-2229,Helm_,Helm,5,44000,,600,,6,,1,0x00004082,7,2,256,,0,1,40,{},{},{}
-2230,Gemmed_Sallet,Gemmed Sallet,5,50000,,500,,4,,0,0x000654E2,7,2,256,,0,1,0,{ bonus bMdef,3; },{},{}
-2231,Gemmed_Sallet_,Gemmed Sallet,5,50000,,500,,4,,1,0x000654E2,7,2,256,,0,1,0,{ bonus bMdef,3; },{},{}
-2232,Circlet,Circlet,5,7500,,300,,3,,0,0x00818314,7,2,256,,0,1,18,{ bonus bMdef,3; },{},{}
-2233,Circlet_,Circlet,5,7500,,300,,3,,1,0x00818314,7,2,256,,0,1,18,{ bonus bMdef,3; },{},{}
-2234,Tiara,Tiara,5,,10,400,,4,,0,0xFFFFFFFE,7,0,256,,45,1,19,{ bonus bInt,2; },{},{}
-2235,Crown,Crown,5,,10,400,,4,,0,0xFFFFFFFE,7,1,256,,45,1,45,{ bonus bInt,2; },{},{}
-2236,Santa's_Hat,Santa Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,20,{ bonus bMdef,1; bonus bLuk,1; },{},{}
-2237,Weird_Goatee,Bandit Beard,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,21,{},{},{}
-2238,Weird_Moustache,Moustache,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,22,{},{},{}
-2239,One_Eyed_Glass,Monocle,5,10000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,23,{},{},{}
-2240,Beard,Beard,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,24,{},{},{}
-2241,Granpa_Beard,Grandpa Beard,5,5000,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,25,{},{},{}
-2242,Luxury_Sunglasses,Purple Glasses,5,24000,,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,26,{ bonus2 bResEff,Eff_Blind,1000; },{},{}
-2243,Spinning_Eyes,Geek Glasses,5,20000,,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,27,{ bonus2 bResEff,Eff_Blind,1500; },{},{}
-2244,Big_Sis'_Ribbon,Big Ribbon,5,15000,,200,,2,,0,0xFFFFFFFE,7,2,256,,0,1,28,{ bonus bMdef,3; },{},{}
-2245,Sweet_Gents,Sweet Gent,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,29,{},{},{}
-2246,Golden_Gear,Golden Gear,5,,10,900,,5,,0,0xFFFFFFFE,7,2,256,,40,1,30,{ bonus bUnbreakableHelm,0; },{},{}
-2247,Oldman's_Romance,Romantic Gent,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,31,{},{},{}
-2248,Western_Grace,Western Grace,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,32,{},{},{}
-2249,Coronet,Coronet,5,,10,300,,3,,0,0xFFFFFFFE,7,2,256,,0,1,33,{ bonus bInt,1; },{},{}
-2250,Fillet,Cute Ribbon,5,500,,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,34,{ bonus bMaxSP,20; },{},{}
-2251,Holy_Bonnet,Monk Hat,5,30000,,100,,5,,0,0x00008110,7,2,256,,0,1,35,{ bonus bMdef,3; },{},{}
-2252,Star_Sparkling,Wizard Hat,5,,10,300,,4,,0,0x00810204,7,2,256,,0,1,36,{ bonus bMaxSP,100; },{},{}
-2253,Sunflower,Sunflower,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,37,{ bonus2 bSubRace,RC_Insect,10; },{},{}
-2254,Angelic_Chain,Angel Wing,5,,10,100,,2,,0,0xFFFFFFFE,7,2,256,,0,1,38,{ bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,RC_Demon,3; },{},{}
-2255,Satanic_Chain,Evil Wing,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,39,{ bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,RC_Angel,3; },{},{}
-2256,Magestic_Goat,Majestic Goat,5,,10,800,,5,,0,0x006444A2,7,2,256,,0,1,41,{ bonus bStr,1; },{},{}
-2257,Snowy_Horn,Unicorn Horn,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,42,{},{},{}
-2258,Sharp_Gear,Spiky Band,5,,10,1000,,6,,0,0x0066D5F2,7,2,256,,50,1,43,{},{},{}
-2259,Mini_Propeller,Mini Propeller,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,46,{},{},{}
-2260,Mini_Glasses,Mini Glasses,5,28000,,100,,1,,0,0xFFFFFFFE,7,2,512,,0,0,47,{},{},{}
-2261,Prontera_Army_Cap,Army Cap,5,,10,400,,4,,0,0x000654E2,7,2,256,,0,1,48,{},{},{}
-2262,Pierrot_Nose,Clown Nose,5,,10,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,49,{},{},{}
-2263,Gangster_Patch,Zorro Masque,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,50,{},{},{}
-2264,Munak_Turban,Munak Hat,5,,10,300,,5,,0,0xFFFFFFFF,7,2,769,,0,0,51,{ bonus2 bSubRace,RC_Undead,10; },{},{}
-2265,Ganster_Mask,Gangster Mask,5,,10,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,52,{ bonus2 bResEff,Eff_Silence,1500; },{},{}
-2266,Iron_Cane,Iron Cain,5,,10,300,,1,,0,0x00004082,7,2,1,,50,0,53,{},{},{}
-2267,Cigar,Cigarette,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,54,{ bonus2 bSubRace,RC_Insect,3; },{},{}
-2268,Smoking_Pipe,Pipe,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,55,{ bonus2 bSubRace,RC_Insect,3; },{},{}
-2269,Centimental_Flower,Romantic Flower,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,56,{ bonus2 bSubRace,RC_Plant,3; },{},{}
-2270,Centimental_Leaf,Romantic Leaf,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,57,{ bonus2 bSubRace,RC_Plant,3; },{},{}
-2271,Jack_A_Dandy,Jack be Dandy,5,45000,,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,58,{},{},{}
-2272,Stop_Post,Stop Post,5,,10,400,,1,,0,0xFFFFFFFF,7,2,256,,0,1,59,{},{},{}
-2273,Doctor_Cap,Doctor Band,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,60,{ bonus bInt,1; },{},{}
-2274,Ghost_Bandana,Ghost Bandana,5,,10,100,,0,,0,0xFFFFFFFE,7,2,256,,0,1,61,{ bonus bAgi,2; bonus2 bSubEle,Ele_Ghost,10; },{},{}
-2275,Red_Bandana,Red Bandana,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,62,{},{},{}
-2276,Eagle_Eyes,Angled Glasses,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,63,{},{},{}
-2277,Nurse_Cap,Nurse Cap,5,,10,100,,1,,0,0x00008110,7,2,256,,0,1,64,{ bonus bInt,1; },{},{}
-2278,Mr_Smile,Mr. Smile,5,60,,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,65,{},{},{}
-2279,Bomb_Wick,Bomb Wick,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,66,{},{},{}
-2280,Sahkkat,Sakkat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,67,{ bonus bAgi,1; },{},{}
-2281,Phantom_Of_Opera,Opera Masque,5,8000,,200,,2,,0,0xFFFFFFFE,7,2,513,,0,0,68,{},{},{}
-2282,Spirit_Chain,Halo,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,0,69,{ bonus2 bSubEle,Ele_Holy,15; },{},{}
-2283,Ear_Mufs,Ear Muffs,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,1,70,{ bonus2 bResEff,Eff_Curse,1000; },{},{}
-2284,Antler,Antlers,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,0,1,71,{},{},{}
-2285,Apple_Of_Archer,Apple of Archer,5,,10,200,,0,,0,0xFFFFFFFE,7,2,256,,30,1,72,{ bonus bDex,3; },{},{}
-2286,Elven_Ears,Elven Ears,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,70,0,73,{},{},{}
-2287,Pirate_Bandana,Pirate Bandana,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,74,{ bonus bStr,1; },{},{}
-2288,Mr_Scream,Mr. Scream,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,75,{},{},{}
-2289,Poo_Poo_Hat,Poo Poo Hat,5,,10,700,,0,,0,0xFFFFFFFF,7,2,256,,0,0,76,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
-2290,Funeral_Costume,Funeral Hat,5,3000,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,77,{},{},{}
-2291,Masquerade,Masquerade,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,78,{ bonus2 bAddRace,RC_DemiHuman,3; },{},{}
-2292,Welding_Mask,Welding Mask,5,,10,300,,2,,0,0x00040420,7,2,513,,50,0,79,{ bonus2 bSubEle,Ele_Fire,10; },{},{}
-2293,Pretend_Murdered,Pretend Murdered,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,80,{},{},{}
-2294,Star_Dust,Stellar,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,81,{},{},{}
-2295,Blinker,Blinker,5,1500,,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,82,{ bonus2 bResEff,Eff_Blind,10000; },{},{}
-2296,Binoculars,Binoculars,5,,10,100,,1,,0,0x00080808,7,2,512,,50,0,83,{ bonus bDex,1; },{},{}
-2297,Goblini_Mask,Goblin Mask,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,84,{},{},{}
-2298,Green_Feeler,Green Feeler,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,0,85,{},{},{}
-2299,Viking_Helm,Orc Helm,5,,10,500,,5,,0,0x000654E2,7,2,256,,0,1,86,{},{},{}
-// Armors
-//===================================================================
-2301,Cotton_Shirt,Cotton Shirt,5,10,,100,,1,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2302,Cotton_Shirt_,Cotton Shirt,5,10,,100,,1,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2303,Leather_Jacket,Jacket,5,200,,200,,2,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2304,Leather_Jacket_,Jacket,5,200,,200,,2,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2305,Adventure_Suit,Adventurer's Suit,5,1000,,300,,3,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2306,Adventurere's_Suit_,Adventurer's Suit,5,1000,,300,,3,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2307,Mantle,Mantle,5,10000,,600,,4,,0,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
-2308,Mantle_,Mantle,5,10000,,600,,4,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
-2309,Coat,Coat,5,22000,,1200,,5,,0,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
-2310,Coat_,Coat,5,22000,,1200,,5,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
-2311,Mink_Coat,Mink Coat,5,,10,2300,,6,,1,0xFFFFFFFE,7,2,16,,30,1,0,{},{},{}
-2312,Padded_Armor,Padded Armor,5,48000,,2800,,7,,0,0x000654E2,7,2,16,,0,1,0,{ if(isequipped(2656)) { bonus bDef,5; bonus bMaxHP,150; } },{},{}
-2313,Padded_Armor_,Padded Armor,5,48000,,2800,,7,,1,0x000654E2,7,2,16,,0,1,0,{ if(isequipped(2656)) { bonus bDef,5; bonus bMaxHP,150; } },{},{}
-2314,Chain_Mail,Chain Mail,5,65000,,3300,,8,,0,0x000654E2,7,2,16,,0,1,0,{},{},{}
-2315,Chain_Mail_,Chain Mail,5,65000,,3300,,8,,1,0x000654E2,7,2,16,,0,1,0,{},{},{}
-2316,Plate_Armor,Full Plate,5,80000,,4500,,10,,0,0x00004082,7,2,16,,40,1,0,{},{},{}
-2317,Plate_Armor_,Full Plate,5,80000,,4500,,10,,1,0x00004082,7,2,16,,40,1,0,{},{},{}
-2318,Clothes_Of_The_Lord,Lord's Clothes,5,,10,2500,,8,,1,0x00040420,7,2,16,,70,1,0,{ bonus bMdef,5; bonus bInt,1; },{},{}
-2319,Glittering_Clothes,Glittering Jacket,5,,10,2500,,7,,1,0xFFFFFFFE,7,2,16,,60,1,0,{ bonus bMdef,5; bonus2 bAddEff,Eff_Blind,500; },{},{}
-2320,Formal_Suit,Formal Suit,5,,10,300,,5,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
-2321,Silk_Robe,Silk Robe,5,8000,,400,,3,,0,0x0085C7B6,7,2,16,,0,1,0,{ bonus bMdef,10; },{},{}
-2322,Silk_Robe_,Silk Robe,5,8000,,400,,3,,1,0x0085C7B6,7,2,16,,0,1,0,{ bonus bMdef,10; },{},{}
-2323,Scapulare,Scapulare,5,6500,,400,,4,,0,0x00008110,7,2,16,,0,1,0,{},{},{}
-2324,Scapulare_,Scapulare,5,6500,,400,,4,,1,0x00008110,7,2,16,,0,1,0,{},{},{}
-2325,Saint_Robe,Saint's Robe,5,54000,,600,,6,,0,0x00048530,7,2,16,,0,1,0,{ bonus bMdef,5; },{},{}
-2326,Saint_Robe_,Saint's Robe,5,54000,,600,,6,,1,0x00048530,7,2,16,,0,1,0,{ bonus bMdef,5; },{},{}
-2327,Holy_Robe,Holy Robe,5,,10,1700,,7,,0,0x00008110,7,2,16,,60,1,0,{ bonus bMdef,5; bonus2 bSubRace,RC_Demon,15; bonus2 bSubEle,Ele_Dark,10; },{},{}
-2328,Wooden_Mail,Wooden Mail,5,5500,,1000,,4,,0,0x000444A2,7,2,16,,0,1,0,{},{},{}
-2329,Wooden_Mail_,Wooden Mail,5,5500,,1000,,4,,1,0x000444A2,7,2,16,,0,1,0,{},{},{}
-2330,Tights,Tights,5,71000,,500,,6,,0,0x00080808,7,2,16,,45,1,0,{ bonus bDex,1; },{},{}
-2331,Tights_,Tights,5,71000,,500,,6,,1,0x00080808,7,2,16,,45,1,0,{ bonus bDex,1; },{},{}
-2332,Silver_Robe,Silver Robe,5,7000,,700,,4,,0,0x00810204,7,2,16,,0,1,0,{},{},{}
-2333,Silver_Robe_,Silver Robe,5,7000,,700,,4,,1,0x00810204,7,2,16,,0,1,0,{},{},{}
-2334,Mage_Coat,Mage Coat,5,,10,600,,5,,0,0x00810204,7,2,16,,50,1,0,{ bonus bMdef,5; bonus bInt,1; },{},{}
-2335,Thief_Clothes,Thief Clothes,5,74000,,100,,6,,0,0x02021040,7,2,16,,0,1,0,{ bonus bAgi,1; },{},{}
-2336,Thief_Clothes_,Thief Clothes,5,74000,,100,,6,,1,0x02021040,7,2,16,,0,1,0,{ bonus bAgi,1; },{},{}
-2337,Ninja_Suit,Ninja Suit,5,,10,1500,,7,,0,0x02021040,7,2,16,,50,1,0,{ bonus bAgi,1; bonus bMdef,3; if(isequipped(2654)) { bonus bUseSPrate,-20; bonus bMaxHP,300; } },{},{}
-2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,0xFFFFFFFE,7,0,16,,0,1,0,{ bonus bMdef,15; },{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
-2339,G_Strings,Pantie,5,1000,,100,,4,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
-2340,Novice_Breast,Novice Breastplate,5,89000,,500,,4,,1,0x00000001,7,2,16,,10,1,0,{},{},{}
-2341,Full_Plate_Armor,Legion Plate Armor,5,94000,,5500,,11,,0,0x00004000,7,2,16,,70,1,0,{},{},{}
-2342,Full_Plate_Armor_,Legion Plate Armor,5,102500,,5500,,11,,1,0x00004000,7,2,16,,70,1,0,{},{},{}
-2343,Robe_Of_Casting,Robe of Cast,5,124800,,1100,,5,,0,0x00810200,7,2,16,,75,1,0,{ bonus bCastrate,-3; bonus bMdef,4; },{},{}
-2344,Flame_Sprits_Armor,Lucius's Fierce Armor of Volcano,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Fire; },{},{}
-2345,Flame_Sprits_Armor_,Lucius's Fierce Armor of Volcano,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Fire; },{},{}
-2346,Water_Sprits_Armor,Saphien's Armor of Ocean,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Water; },{},{}
-2347,Water_Sprits_Armor_,Saphien's Armor of Ocean,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Water; },{},{}
-2348,Wind_Sprits_Armor,Aebeccee's Raging Typhoon Armor,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Wind; },{},{}
-2349,Wind_Sprits_Armor_,Aebeccee's Raging Typhoon Armor,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Wind; },{},{}
-2350,Earth_Sprits_Armor,Claytos Cracking Earth Armor,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Earth; },{},{}
-2351,Earth_Sprits_Armor_,Claytos Cracking Earth Armor,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Earth; },{},{}
-2352,Novice_Plate,Tattered Novice Ninja Suit,5,1,,1,,4,,0,0x00000001,7,2,16,,0,0,0,{},{},{}
-2353,Odin's_Blessing,Odin's Blessing,5,30000,,2500,,6,,1,0xFFFFFFFE,7,2,16,,65,1,0,{},{},{}
-2354,Goibne's_Armor,Goibne's Armor,5,50000,,3500,,7,,0,0xFFFFFFFE,7,2,16,,54,1,0,{ bonus bVit,2; bonus bMaxHPrate,10; },{},{}
-2355,Angel's_Protection,Angelic Protection,5,10000,,600,,4,,1,0x00000001,7,2,16,,40,1,0,{ bonus bMdef,20; if(isequipped(2116,2420,2521,5125)) { bonus bMaxHP,900; bonus bMaxSP,100; bonus4 bAutoSpellWhenHit,361,1,20,0; } },{},{}
-2356,Vestment_Of_Grace,Blessed Holy Robe,5,,10,2500,,5,,1,0x00008100,7,2,16,,70,1,0,{ bonus bMdef,5; bonus2 bResEff,Eff_Blind,8000; },{},{}
-2357,Valkyrie_Armor,Valkyrie's Armor,5,0,,2800,,6,,1,0xFFFFFFFE,2,2,16,,0,1,0,{ bonus bAllStats,1; bonus bUnbreakableArmor,0; if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus2 bResEff,Eff_Silence,5000; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus2 bResEff,Eff_Stun,5000; },{},{}
-2358,Angel_Dress,Angel's Dress,5,,10,1000,,5,,0,0xFFFFFFFF,7,2,16,,0,0,0,{ bonus bLuk,4; },{},{}
-2359,Ninja_Suit_,Ninja Suit,5,,10,1500,,7,,1,0x02021040,7,2,16,,50,1,0,{ bonus bAgi,1; bonus bMdef,3; if(isequipped(2654)) { bonus bUseSPrate,-20; bonus bMaxHP,300; } },{},{}
-2360,Robe_of_Casting_,Robe of Cast,5,124800,,1100,,5,,1,0x00810200,7,2,16,,75,1,0,{ bonus bCastrate,-3; bonus bMdef,4; },{},{}
-2361,Blue_Robe,Blue Robe,5,,10,500,,0,,0,0xFFFFFFFE,7,2,16,,0,1,0,{ bonus bAllStats,5; bonus bMdef,5; },{},{}
-2362,Red_Robe,Red Robe,5,,10,500,,0,,0,0xFFFFFFFE,7,2,16,,0,1,0,{ bonus bAllStats,5; bonus bMdef,5; },{},{}
-2363,White_Robe,White Robe,5,,10,500,,0,,0,0x00000001,7,2,16,,0,1,0,{ bonus bAllStats,3; bonus bMdef,5; },{},{}
-// Footgears
-//===================================================================
-2401,Sandals,Sandals,5,400,,200,,1,,0,0xFFFFFFFF,7,2,64,,0,1,0,{},{},{}
-2402,Sandals_,Sandals,5,400,,200,,1,,1,0xFFFFFFFF,7,2,64,,0,1,0,{},{},{}
-2403,Shoes,Shoes,5,3500,,400,,2,,0,0xFFFFFFFE,7,2,64,,0,1,0,{},{},{}
-2404,Shoes_,Shoes,5,3500,,400,,2,,1,0xFFFFFFFE,7,2,64,,0,1,0,{},{},{}
-2405,Boots,Boots,5,18000,,600,,4,,0,0x016E5CEA,7,2,64,,0,1,0,{},{},{}
-2406,Boots_,Boots,5,18000,,600,,4,,1,0x016E5CEA,7,2,64,,0,1,0,{},{},{}
-2407,Chrystal_Pumps,Crystal Pumps,5,,10,100,,0,,0,0xFFFFFFFE,7,0,64,,0,1,0,{ bonus bMdef,10; bonus bLuk,5; },{},{}
-2408,Cuffs,Shackles,5,5000,,3000,,3,,0,0xFFFFFFFF,7,2,64,,0,1,0,{ if (isequipped(2655)) { bonus bBaseAtk,50; bonus2 bAddDefClass,1196,20; bonus2 bAddDefClass,1197,20; } },{},{}
-2409,Spiky_Heel,High Heels,5,8500,,600,,2,,0,0xFFFFFFFE,7,2,64,,0,1,0,{ bonus bMdef,5; },{},{}
-2410,Sleipnir,Sleipnir,5,,10,3500,,5,,0,0xFFFFFFFF,7,2,64,,94,0,0,{ bonus bMdef,10; bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bSPrecovRate,15; bonus bSpeedRate,25; },{},{}
-2411,Grave,Greaves,5,48000,,750,,5,,0,0x00004080,7,2,64,,65,1,0,{},{},{}
-2412,Grave_,Greaves,5,54000,,750,,5,,1,0x00004080,7,2,64,,65,1,0,{},{},{}
-2413,Safty_Boots,Safety Boots,5,34000,,350,,6,,0,0x00004082,7,2,64,,30,0,0,{},{},{}
-2414,Novice_Boots,Novice Slippers,5,1,,1,,2,,0,0x00000001,7,2,64,,0,0,0,{},{},{}
-2415,Slipper,Bunny Slipper,5,34000,,300,,3,,1,0xFFFFFFFE,7,0,64,,30,1,0,{ bonus bLuk,3; bonus bMdef,3; },{},{}
-2416,Novice_Shoes,Novice Shoes,5,35000,,500,,2,,1,0x00000001,7,2,64,,40,1,0,{ bonus bMaxHPrate,5; },{},{}
-2417,Fricco_Shoes,Freya's Shoes,5,30000,,500,,3,,0,0xFFFFFFFE,7,2,64,,65,1,0,{ bonus bAgi,2; bonus2 bAddItemHealRate,IG_Potion,20; if(isequipped(2353,2516)){ bonus bAgi,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; } },{},{}
-2418,Vidar's_Boots,Vidar's Boots,5,30000,,650,,4,,0,0xFFFFFFFE,7,2,64,,65,1,0,{ bonus bMaxHPrate,9; bonus bMaxSPrate,9; if(isequipped(2353,2517)){ bonus bVit,5; bonus bHPrecovRate,10; bonus bSPrecovRate,10; } },{},{}
-2419,Goibne's_Combat_Boots,Goibne's Greaves,5,30000,,700,,4,,0,0xFFFFFFFE,7,2,64,,54,1,0,{ bonus bMdef,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; },{},{}
-2420,Angel's_Arrival,Angel's Reincarnation,5,10000,,300,,2,,1,0x00000001,7,2,64,,25,1,0,{ bonus bMaxHP,100; },{},{}
-2421,Valkyrie's_Shoes,Valkyrie's Shoes,5,0,,500,,4,,1,0xFFFFFFFE,2,2,64,,1,1,0,{ if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bMaxHP,(BaseLevel*5); else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bMaxSP,(JobLevel*2); },{},{}
-2422,High_Quality_Sandals,High Quality Sandals,5,24000,,200,,2,,1,0x00818314,7,2,64,,40,1,0,{ bonus bMdef,10; },{},{}
-// Garments
-//===================================================================
-2501,Hood,Hood,5,1000,,200,,1,,0,0xFFFFFFFF,7,2,4,,0,1,0,{},{},{}
-2502,Hood_,Hood,5,1000,,200,,1,,1,0xFFFFFFFF,7,2,4,,0,1,0,{},{},{}
-2503,Muffler,Muffler,5,5000,,400,,2,,0,0xFFFFFFFE,7,2,4,,0,1,0,{},{},{}
-2504,Muffler_,Muffler,5,5000,,400,,2,,1,0xFFFFFFFE,7,2,4,,0,1,0,{},{},{}
-2505,Manteau,Manteau,5,32000,,600,,4,,0,0x006654E2,7,2,4,,0,1,0,{},{},{}
-2506,Manteau_,Manteau,5,32000,,600,,4,,1,0x006654E2,7,2,4,,0,1,0,{},{},{}
-2507,Cape_Of_Ancient_Lord,Ancient Cape,5,82000,,600,,2,,0,0xFFFFFFFE,7,2,4,,40,1,0,{ bonus bAgi,1; },{},{}
-2508,Ragamuffin_Cape,Ragamuffin Manteau,5,56000,,500,,1,,0,0xFFFFFFFE,7,2,4,,0,1,0,{ bonus bMdef,10; },{},{}
-2509,Clack_Of_Servival,Survivor's Manteau,5,20000,,550,,0,,0,0x00810204,7,2,4,,75,1,0,{ bonus bVit,10; if(isequipped(1618) || isequipped(1620)) bonus bMaxHP,300; bonus bMatkRate,-5; if(isequipped(1617) || isequipped(1618) || isequipped(1619) || isequipped(1620)) bonus bMatkRate,getequiprefinerycnt(4); bonus2 bSubEle,Ele_Neutral,getRefine()*3; },{},{}
-2510,Novice_Hood,Somber Novice Hood,5,1,,1,,2,,0,0x00000001,7,2,4,,0,0,0,{ bonus2 bSubEle,Ele_Neutral,20; },{},{}
-2511,Skeleton?_Cape,Skeleton Manteau,5,5000,,700,,1,,0,0xFFFFFFFE,7,2,4,,75,1,0,{ bonus bStr,2; bonus bInt,-3; bonus bDex,2; bonus bVit,-3; bonus bLuk,2; bonus bAgi,-4; },{},{}
-2512,Novice_Manteau,Novice Manteau,5,50000,,500,,2,,1,0x00000001,7,2,4,,40,1,0,{ bonus2 bSubEle,Ele_Neutral,10; },{},{}
-2513,Celestial_Robe,Heavenly Maiden Robe,5,,10,500,,3,,1,0xFFFFFFFE,7,2,4,,80,1,0,{},{},{}
-2514,Pauldron,Pauldron,5,,10,800,,5,,1,0x000654E2,7,2,4,,80,1,0,{},{},{}
-2515,Wing_Of_Eagle,Eagle Wing,5,20000,,300,,1,,1,0x00810204,7,2,4,,85,1,0,{ if(isequipped(1616)) bonus bSpeedRate,10; },{},{}
-2516,Falcon_Robe,Falcon Muffler,5,30000,,400,,3,,0,0xFFFFFFFE,7,2,4,,65,1,0,{ bonus bFlee,15; bonus bFlee2,5; },{},{}
-2517,Vali's_Manteau,Vali's Manteau,5,30000,,600,,4,,0,0xFFFFFFFE,7,2,4,,65,1,0,{ bonus2 bSubEle,Ele_Neutral,15; },{},{}
-2518,Morpheus's_Shawl,Morpheus's Shawl,5,30000,,600,,3,,0,0xFFFFFFFE,7,2,4,,33,1,0,{ bonus bMaxSPrate,10; bonus bMdef,3; },{},{}
-2519,Morrigane's_Manteau,Morrigane's Manteau,5,30000,,600,,3,,0,0xFFFFFFFE,7,2,4,,61,1,0,{ bonus bLuk,2; bonus bFlee2,8; },{},{}
-2520,Goibne's_Shoulder_Arms,Goibne's Spaulders,5,30000,,700,,3,,0,0xFFFFFFFE,7,2,4,,54,1,0,{ bonus bLongAtkDef,10; bonus bMdef,2; bonus bVit,1; },{},{}
-2521,Angel's_Warmth,Angelic Cardigan,5,10000,,400,,2,,1,0x00000001,7,2,4,,20,1,0,{ bonus bHPrecovRate,5; },{},{}
-2522,Undershirt,Undershirt,5,20000,,150,,2,,0,0xFFFFFFFF,7,2,4,,1,1,0,{ bonus bMdef,1; if(isequipped(2339)) { bonus bAgi,5; bonus bFlee,10; } },{},{}
-2523,Undershirt_,Undershirt,5,20000,,150,,2,,1,0xFFFFFFFF,7,2,4,,1,1,0,{ bonus bMdef,1; if(isequipped(2339)) { bonus bAgi,5; bonus bFlee,10; } },{},{}
-2524,Valkyrie's_Manteau,Valkyrie's Manteau,5,0,,500,,3,,1,0xFFFFFFFE,2,2,4,,1,1,0,{ if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bFlee2,5+(getequiprefinerycnt(5)*2); else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bShortWeaponDamageReturn,5+(getequiprefinerycnt(5)*2); },{},{}
-2525,Ancient_Cape_,Ancient Cape,5,82000,,600,,2,,1,0xFFFFFFFE,7,2,4,,40,1,0,{ bonus bAgi,1; },{},{}
-2526,Dragonscale_Jacket,Dragonscale Jacket,5,,10,10,,4,,0,0xFFFFFFFF,7,2,4,,50,1,0,{},{},{}
-// Accessories
-//===================================================================
-2601,Ring,Ring,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bStr,2; },{},{}
-2602,Earring,Earring,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bInt,2; },{},{}
-2603,Necklace,Necklace,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bVit,2; },{},{}
-2604,Glove,Glove,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bDex,2; },{},{}
-2605,Brooch,Brooch,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bAgi,2; },{},{}
-2607,Clip,Clip,5,30000,,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxSP,10; },{},{}
-2608,Rosary,Rosary,5,15000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bMdef,5; bonus bLuk,2; },{},{}
-2609,Skul_Ring,Skull Ring,5,10000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2610,Gold_Ring,Gold Ring,5,30000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2611,Silver_Ring,Silver Ring,5,20000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2612,Flower_Ring,Flower Ring,5,1500,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2613,Diamond_Ring,Diamond Ring,5,45000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2614,An_Eye_Of_Dullahan,Eye of Dullahan,5,90000,,100,,0,,0,0xFFFFFFFE,7,2,136,,50,0,0,{},{},{}
-2615,Safety_Ring,Safety Ring,5,75000,,100,,3,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bMdef,3; },{},{}
-2616,Critical_Ring,Critical Ring,5,75000,,50,,0,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bCritical,5; },{},{}
-2617,Mitten_Of_Presbyter,Celebrant's Mitten,5,,10,100,,1,,0,0xFFFFFFFE,7,2,136,,35,0,0,{ bonus bInt,1; },{},{}
-2618,Matyr's_Flea_Guard,Matyr's Leash,5,,10,100,,1,,0,0xFFFFFFFE,7,2,136,,35,0,0,{ bonus bAgi,1; },{},{}
-2619,Thimble_Of_Archer,Bow Thimble,5,10000,,100,,0,,0,0x00080808,7,2,136,,65,0,0,{ bonus bLongAtkRate,3; },{},{}
-2620,Ring_Of_Rogue,Rogue's Treasure,5,30000,,100,,0,,0,0x02021040,7,2,136,,70,0,0,{ bonus bAddStealRate,1; },{},{}
-2621,Ring_,Ring,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bStr,1; },{},{}
-2622,Earring_,Earring,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bInt,1; },{},{}
-2623,Necklace_,Necklace,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bVit,1; },{},{}
-2624,Glove_,Glove,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bDex,1; },{},{}
-2625,Brooch_,Brooch,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bAgi,1; },{},{}
-2626,Rosary_,Rosary,5,15000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bMdef,3; bonus bLuk,1; },{},{}
-2627,Belt,Belt,5,20000,,1200,,0,,1,0xFFFFFFFF,7,2,136,,25,0,0,{},{},{}
-2628,Novice_Armlet,Novice Armlet,5,400,,200,,0,,1,0x00000001,7,2,136,,0,0,0,{ bonus bStr,1; bonus bInt,1; bonus bLuk,1; },{},{}
-2629,Magingiorde,Megingjard,5,,10,8000,,2,,0,0xFFFFFFFF,7,2,136,,94,0,0,{ bonus bStr,40; bonus bMdef,7; },{},{}
-2630,Brysinggamen,Brisingamen,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,136,,94,0,0,{ bonus bStr,6; bonus bAgi,6; bonus bVit,6; bonus bInt,6; bonus bLuk,10; bonus bMdef,5; },{},{}
-2631,First_Age_Ring,Celebration Ring,5,,10,10,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2634,Bridegroom_Ring,Wedding Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,1,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; },{},{}
-2635,Bride_Ring,Wedding Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,0,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; },{},{}
-2636,Gold_Ring_,Gold Christmas Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2637,Silver_Ring_,Silver Christmas Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2638,Exorcize_Sachet,Sacred Incense,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,1; bonus bLuk,1; },{},{}
-2639,Purification_Sachet,Occult Incense,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bAgi,1; bonus bInt,1; },{},{}
-2640,Kafra_Ring,Kafra Ring,5,,10,200,,1,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,1; bonus bAgi,1; bonus bInt,1; bonus bLuk,1; bonus bMdef,1; },{},{}
-2641,Fashionable_Sack,Fashion Hip Sack,5,,10,700,,0,,0,0x00040420,7,2,136,,50,0,0,{ bonus bStr,2; },{},{}
-2642,Serin's_Gold_Ring,Serin's Gold Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2643,Serin's_Gold_Ring_,Serin's Gold Ring,5,,22500,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2644,The_Sign_,The Sign,5,,10,0,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMatkRate,5; bonus bAtkRate,5; },{},{}
-2645,Moonlight_Ring,Moonlight Ring,5,,10,200,,0,,0,0x028F5EEE,7,2,136,,60,0,0,{},{},{}
-2646,Bunch_Of_Carnation,Bunch of Carnations,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2647,Nile_Rose,Nile Rose,5,,10,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxHP,10; },{},{}
-2648,Morpheus's_Ring,Morpheus's Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,33,0,0,{ bonus bInt,1; bonus bMaxSPrate,5; },{},{}
-2649,Morpheus's_Armlet,Morpheus's Bracelet,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,33,0,0,{ bonus bInt,1; bonus bMaxSPrate,5; },{},{}
-2650,Morrigane's_Belt,Morrigane's Belt,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,61,0,0,{ bonus bBaseAtk,5; bonus bCritical,3; },{},{}
-2651,Morrigane's_Pendant,Morrigane's Pendant,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,61,0,0,{ bonus bStr,2; bonus bCritical,3; },{},{}
-2652,Cursed_Lucky_Brooch,Goddess of Fortune's Cursed Brooch,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bCritical,6; bonus2 bAddEff2,Eff_Curse,50; },{},{}
-2653,Sacrifice_Ring,Sacrifice Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,90,0,0,{},{},{}
-2654,Shinobi's_Sash,Shinobi Sash,5,,10,300,,1,,0,0x02021040,7,2,136,,30,0,0,{ bonus bStr,1; bonus bAgi,1; bonus bMdef,1; },{},{}
-2655,Bloody_Iron_Ball,Bloodied Shackle Ball,5,,10,4000,,0,,0,0xFFFFFFFE,7,2,136,,0,0,0,{},{},{}
-2656,Hyper_Changer,Armor Charm,5,,10,1000,,1,,0,0x000654E2,7,2,136,,0,0,0,{ bonus bMaxHP,50; },{},{}
-2657,Lab_Passport,Laboratory Permit,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
-2658,Nile_Rose_,Nile Rose,5,,10,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxHP,10; },{},{}
-2659,Vesper_Core01,Vesper Core 01,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bInt,2; bonus bMaxSPrate,5; },{},{}
-2660,Vesper_Core02,Vesper Core 02,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bStr,3; bonus bBaseAtk,10; },{},{}
-2661,Vesper_Core03,Vesper Core 03,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bAgi,3; bonus bFlee,5; },{},{}
-2662,Vesper_Core04,Vesper Core 04,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bDex,3; bonus bHit,10; },{},{}
-2663,Gauntlet_Of_Accuracy,Gauntlet of Hit,5,,10,900,,0,,0,0xFFFFFFFF,7,2,136,,75,0,0,{ bonus bHit,15; bonus bStr,1; },{},{}
-2664,Scarf_Belt,Belcarf,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,75,0,0,{ bonus bDex,2; bonus bInt,1; },{},{}
-2665,Ring_of_Exorcism,Exorcising Ring,5,,10,500,,0,,0,0x00008110,7,2,136,,60,0,0,{ bonus bMdef,1; bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; },{},{}
-2666,Lamp_of_Hope,Lantern of Hope,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,2; bonus2 bResEff,Eff_Blind,10; },{},{}
-2667,Glove_of_Archer,Renown Archer's Gloves,5,,10,300,,0,,0,0xFFFFFFFE,7,2,136,,60,0,0,{ bonus bHit,5; bonus bCritical,5; bonus bDex,1; },{},{}
-2668,Woman_Glory,Woman Glory,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,136,,94,0,0,{},{},{}
-2669,RJC_Necklace,RJC Necklace,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxSP,10; },{},{}
-2670,Ring_of_Longing,Ring of Longing,5,,,100,,1,,1,0xFFFFFFFF,7,2,136,,30,0,,{ bonus bFlee,5; },{},{}
-2671,Bow_Thimble_,Bow Thimble,5,10000,,100,,0,,1,0x00080808,7,2,136,,65,0,0,{ bonus bLongAtkRate,3; },{},{}
-2672,3rd_Anniversary_Celebration_Ring,3rd Anniversary Celebration Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bAllStats,5; },{},{}
-2673,Warrior's_Shining_Ring,Warrior's Shining Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,48,0,0,{ bonus bBaseAtk,10; bonus bSPrecovRate,3; },{},{}
-// Cards
-//===================================================================
-4001,Poring_Card,Poring Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,2; bonus bFlee2,1; },{},{}
-4002,Fabre_Card,Fabre Card,6,,10,10,,,,,,,,2,,,,,{ bonus bVit,1; bonus bMaxHP,100; },{},{}
-4003,Pupa_Card,Pupa Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,700; },{},{}
-4004,Drops_Card,Drops Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDex,1; bonus bHit,3; },{},{}
-4005,Poring__Card,Santa Poring Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Dark,20; },{},{}
-4006,Lunatic_Card,Lunatic Card,6,,10,10,,,,,,,,2,,,,,{ bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1; },{},{}
-4007,Pecopeco_Egg_Card,Peco Peco Egg Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Formless,20; },{},{}
-4008,Picky_Card,Picky Card,6,,10,10,,,,,,,,16,,,,,{ bonus bStr,1; bonus bBaseAtk,10; },{},{}
-4009,Chonchon_Card,Chonchon Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,1; bonus bFlee,2; },{},{}
-4010,Wilow_Card,Willow Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxSP,80; },{},{}
-4011,Picky__Card,Picky Egg Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,1; bonus bMaxHP,100; },{},{}
-4012,Thief_Bug_Egg_Card,Thief Bug Egg Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMaxHP,400; },{},{}
-4013,Andre_Egg_Card,Andre Egg Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMaxHPrate,5; },{},{}
-4014,Roda_Frog_Card,Roda Frog Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,400; bonus bMaxSP,50; },{},{}
-4015,Condor_Card,Condor Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,10; },{},{}
-4016,Thief_Bug_Card,Thief Bug Card,6,,10,10,,,,,,,,16,,,,,{ bonus bAgi,1; },{},{}
-4017,Savage_Babe_Card,Savage Babe Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Stun,500; },{},{}
-4018,Andre_Larva_Card,Andre Larva Card,6,,10,10,,,,,,,,2,,,,,{ bonus bInt,1; bonus bMaxSP,10; },{},{}
-4019,Hornet_Card,Hornet Card,6,,10,10,,,,,,,,2,,,,,{ bonus bStr,1; bonus bBaseAtk,3; },{},{}
-4020,Farmiliar_Card,Farmiliar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5; },{},{}
-4021,Rocker_Card,Rocker Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDex,1; bonus bBaseAtk,5; },{},{}
-4022,Spore_Card,Spore Card,6,,10,10,,,,,,,,136,,,,,{ bonus bVit,2; },{},{}
-4023,Desert_Wolf_Babe_Card,Baby Desert Wolf Card,6,,10,10,,,,,,,,16,,,,,{ bonus bInt,1; },{},{}
-4024,Plankton_Card,Plankton Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5; },{},{}
-4025,Skeleton_Card,Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stun,200; },{},{}
-4026,Thief_Bug_Female_Card,Female Thief Bug Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAgi,1; bonus bFlee,1; },{},{}
-4027,Kukre_Card,Kukre Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,2; },{},{}
-4028,Tarou_Card,Tarou Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,2; },{},{}
-4029,Wolf_Card,Wolf Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus bCritical,1; },{},{}
-4030,Mandragora_Card,Mandragora Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Wind,20; },{},{}
-4031,Pecopeco_Card,Peco Peco Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,10; },{},{}
-4032,Ambernite_Card,Ambernite Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; },{},{}
-4033,Poporing_Card,Poporing Card,6,,10,10,,,,,,,,136,,,,,{ skill 53,1; },{},{}
-4034,Worm_Tail_Card,Wormtail Card,6,,10,10,,,,,,,,136,,,,,{ bonus bDex,2; },{},{}
-4035,Hydra_Card,Hydra Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,20; },{},{}
-4036,Muka_Card,Muka Card,6,,10,10,,,,,,,,136,,,,,{ bonus bHPrecovRate,10; },{},{}
-4037,Snake_Card,Snake Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5; },{},{}
-4038,Zombie_Card,Zombie Card,6,,10,10,,,,,,,,64,,,,,{ bonus bHPrecovRate,20; },{},{}
-4039,Stainer_Card,Stainer Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Silence,2000; bonus bDef,1; },{},{}
-4040,Creamy_Card,Creamy Card,6,,10,10,,,,,,,,136,,,,,{ skill 26,1; },{},{}
-4041,Coco_Card,Coco Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1; },{},{}
-4042,Steel_Chonchon_Card,Steel Chonchon Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bSubEle,Ele_Wind,10; bonus bDef,2; },{},{}
-4043,Andre_Card,Andre Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,20; },{},{}
-4044,Smokie_Card,Smokie Card,6,,10,10,,,,,,,,136,,,,,{ skill 51,1; },{},{}
-4045,Horn_Card,Horn Card,6,,10,10,,,,,,,,32,,,,,{ bonus bLongAtkDef,35; },{},{}
-4046,Martin_Card,Martin Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Blind,2000; bonus bDef,1; },{},{}
-4047,Ghostring_Card,Ghostring Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Ghost; bonus bHPrecovRate,-25; },{},{}
-4048,Poison_Spore_Card,Poison Spore Card,6,,10,10,,,,,,,,136,,,,,{ skill 52,3; },{},{}
-4049,Vadon_Card,Vadon Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Fire,20; },{},{}
-4050,Thief_Bug_Male_Card,Male Thief Bug Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,2; },{},{}
-4051,Yoyo_Card,Yoyo Card,6,,10,10,,,,,,,,136,,,,,{ bonus bFlee2,5; bonus bAgi,1; },{},{}
-4052,Elder_Wilow_Card,Elder Willow Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,2; },{},{}
-4053,Vitata_Card,Vitata Card,6,,10,10,,,,,,,,136,,,,,{ skill 28,1; bonus bUseSPrate,25; },{},{}
-4054,Angeling_Card,Angeling Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Holy; },{},{}
-4055,Marina_Card,Marina Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5; },{},{}
-4056,Dustiness_Card,Dustiness Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Wind,30; bonus bFlee,5; },{},{}
-4057,Metaller_Card,Metaller Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5; },{},{}
-4058,Thara_Frog_Card,Thara Frog Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_DemiHuman,30; },{},{}
-4059,Soldier_Andre_Card,Soldier Andre Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Plant,30; },{},{}
-4060,Goblin_Card,Goblin Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Brute,20; },{},{}
-4061,Cornutus_Card,Cornutus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bUnbreakableArmor,0; bonus bDef,1; },{},{}
-4062,Anacondaq_Card,Anacondaq Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Poison,20; },{},{}
-4063,Caramel_Card,Caramel Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Insect,20; },{},{}
-4064,Zerom_Card,Zerom Card,6,,10,10,,,,,,,,136,,,,,{ bonus bDex,3; },{},{}
-4065,Kaho_Card,Kaho Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Earth,20; },{},{}
-4066,Orc_Warrior_Card,Orc Warrior Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Brute,30; },{},{}
-4067,Megalodon_Card,Megalodon Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1; },{},{}
-4068,Scorpion_Card,Scorpion Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Plant,20; },{},{}
-4069,Drainliar_Card,Drainliar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Water,20; },{},{}
-4070,Eggyra_Card,Eggyra Card,6,,10,10,,,,,,,,64,,,,,{ bonus bSPrecovRate,15; },{},{}
-4071,Orc_Zombie_Card,Orc Zombie Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Undead,30; bonus bFlee,5; },{},{}
-4072,Golem_Card,Golem Card,6,,10,10,,,,,,,,2,,,,,{ bonus bUnbreakableWeapon,0; bonus bBaseAtk,5; },{},{}
-4073,Pirate_Skel_Card,Pirate Skeleton Card,6,,10,10,,,,,,,,136,,,,,{ skill 37,5; },{},{}
-4074,BigFoot_Card,Bigfoot Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Insect,30; },{},{}
-4075,Argos_Card,Argos Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Stone,2000; bonus bDef,1; },{},{}
-4076,Magnolia_Card,Magnolia Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5; },{},{}
-4077,Phen_Card,Phen Card,6,,10,10,,,,,,,,136,,,,,{ bonus bNoCastCancel,0; bonus bCastrate,25; },{},{}
-4078,Savage_Card,Savage Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,3; },{},{}
-4079,Mantis_Card,Mantis Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,3; },{},{}
-4080,Flora_Card,Flora Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Fish,20; },{},{}
-4081,Hode_Card,Hode Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Earth,30; bonus bFlee,5; },{},{}
-4082,Desert_Wolf_Card,Desert Wolf Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,0,15; bonus bBaseAtk,5; },{},{}
-4083,Rafflesia_Card,Rafflesia Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Fish,30; },{},{}
-4084,Marine_Sphere_Card,Marine Sphere Card,6,,10,10,,,,,,,,136,,,,,{ skill 7,3; },{},{}
-4085,Orc_Skeleton_Card,Orc Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Holy,20; },{},{}
-4086,Soldier_Skeleton_Card,Soldier Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritical,9; },{},{}
-4087,Giearth_Card,Giearth Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,Ele_Earth,15; },{},{}
-4088,Frilldora_Card,Frilldora Card,6,,10,10,,,,,,,,4,,,,,{ skill 135,1; },{},{}
-4089,Sword_Fish_Card,Swordfish Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Water; bonus bDef,1; },{},{}
-4090,Munak_Card,Munak Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,Ele_Earth,5; bonus bDef,1; },{},{}
-4091,Kobold_Card,Kobold Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,1; bonus bCritical,4; },{},{}
-4092,Skel_Worker_Card,Skeleton Worker Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,1,15; bonus bBaseAtk,5; },{},{}
-4093,Obeaune_Card,Obeaune Card,6,,10,10,,,,,,,,136,,,,,{ skill 35,1; },{},{}
-4094,Archer_Skeleton_Card,Archer Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bLongAtkRate,10; },{},{}
-4095,Marse_Card,Marse Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Water,30; bonus bFlee,5; },{},{}
-4096,Zenorc_Card,Zenorc Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10; },{},{}
-4097,Matyr_Card,Matyr Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,10; bonus bAgi,1; },{},{}
-4098,Dokebi_Card,Dokebi Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Wind; bonus bDef,1; },{},{}
-4099,Pasana_Card,Pasana Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Fire; bonus bDef,1; },{},{}
-4100,Sohee_Card,Sohee Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxSPrate,15; bonus bSPrecovRate,3; },{},{}
-4101,Sand_Man_Card,Sandman Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Earth; bonus bDef,1; },{},{}
-4102,Whisper_Card,Whisper Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,20; bonus2 bSubEle,Ele_Ghost,-50; },{},{}
-4103,Horong_Card,Horong Card,6,,10,10,,,,,,,,136,,,,,{ skill 10,1; },{},{}
-4104,Requiem_Card,Requiem Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Confusion,500; },{},{}
-4105,Marc_Card,Marc Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bSubEle,Ele_Water,5; bonus2 bResEff,Eff_Freeze,10000; },{},{}
-4106,Mummy_Card,Mummy Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,20; },{},{}
-4107,Verit_Card,Verit Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,8; bonus bMaxSPrate,8; },{},{}
-4108,Myst_Card,Myst Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Poison,30; bonus bFlee,5; },{},{}
-4109,Jakk_Card,Jakk Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Fire,30; bonus bFlee,5; },{},{}
-4110,Ghoul_Card,Ghoul Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Poison,2000; bonus bDef,1; },{},{}
-4111,Strouf_Card,Strouf Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Demon,20; },{},{}
-4112,Marduk_Card,Marduk Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Silence,10000; },{},{}
-4113,Marionette_Card,Marionette Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Ghost,30; bonus bFlee,5; },{},{}
-4114,Argiope_Card,Argiope Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Poison; bonus bDef,1; },{},{}
-4115,Hunter_Fly_Card,Hunter Fly Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bHpDrainRate,30,15; },{},{}
-4116,Isis_Card,Isis Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Dark,30; bonus bFlee,5; },{},{}
-4117,Side_Winder_Card,Sidewinder Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDoubleRate,5; },{},{}
-4118,Petit_Card,Earth Petite Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Dragon,20; },{},{}
-4119,Bathory_Card,Bathory Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Dark; },{},{}
-4120,Petit__Card,Sky Petite Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Dragon,30; },{},{}
-4121,Phreeoni_Card,Phreeoni Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,100; },{},{}
-4122,Deviruchi_Card,Deviruchi Card,6,,10,10,,,,,,,,769,,,,,{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; },{},{}
-4123,Eddga_Card,Eddga Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; }
-4124,Medusa_Card,Medusa Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,15; bonus2 bResEff,Eff_Stone,10000; },{},{}
-4125,Deviace_Card,Deviace Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7; },{},{}
-4126,Minorous_Card,Minorous Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,2,15; bonus bBaseAtk,5; },{},{}
-4127,Nightmare_Card,Nightmare Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1; },{},{}
-4128,Golden_Bug_Card,Golden Thief Bug Card,6,,10,10,,,,,,,,32,,,,,{ bonus bNoMagicDamage,100; bonus bUseSPrate,100; },{},{}
-4129,Baphomet__Card,Bapho Jr. Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,3; bonus bCritical,1; },{},{}
-4130,Scorpion_King_Card,Scorpion King Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Undead,20; },{},{}
-4131,Moonlight_Flower_Card,Moonlight Flower Card,6,,10,10,,,,,,,,64,,,,,{ bonus bSpeedRate,25; },{},{}
-4132,Mistress_Card,Mistress Card,6,,10,10,,,,,,,,769,,,,,{ bonus bNoGemStone,0; bonus bUseSPrate,25; },{},{}
-4133,Daydric_Card,Raydric Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,20; },{},{}
-4134,Dracula_Card,Dracula Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSpDrainRate,100,5; },{},{}
-4135,Orc_Load_Card,Orc Lord Card,6,,10,10,,,,,,,,16,,,,,{ bonus bShortWeaponDamageReturn,30; },{},{}
-4136,Khalitzburg_Card,Khalitzburg Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,30; },{},{}
-4137,Drake_Card,Drake Card,6,,10,10,,,,,,,,2,,,,,{ bonus bNoSizeFix,0; },{},{}
-4138,Anubis_Card,Anubis Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Angel,30; },{},{}
-4139,Joker_Card,Joker Card,6,,10,10,,,,,,,,136,,,,,{ skill 50,1; },{},{}
-4140,Knight_Of_Abyss_Card,Abysmal Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Boss,25; },{},{}
-4141,Evil_Druid_Card,Evil Druid Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Undead; bonus bInt,1; bonus bDef,1; },{},{}
-4142,Doppelganger_Card,Doppelganger Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,10; },{},{}
-4143,Orc_Hero_Card,Orc Hero Card,6,,10,10,,,,,,,,769,,,,,{ bonus bVit,3; bonus2 bResEff,Eff_Stun,10000; },{},{}
-4144,Osiris_Card,Osiris Card,6,,10,10,,,,,,,,136,,,,,{ bonus bRestartFullRecover,0; },{},{}
-4145,Berzebub_Card,Berzebub Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCastrate,-30; bonus bMaxSPrate,-15; bonus bMaxHPrate,-5; },{},{}
-4146,Maya_Card,Maya Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMagicDamageReturn,50; },{},{}
-4147,Baphomet_Card,Baphomet Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,-10; bonus bSplashRange,1; },{},{}
-4148,Pharaoh_Card,Pharaoh Card,6,,10,10,,,,,,,,769,,,,,{ bonus bUseSPrate,-30; },{},{}
-4149,Gargoyle_Card,Gargoyle Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12028,RC_Insect,300; },{},{}
-4150,Goat_Card,Goat Card,6,,10,10,,,,,,,,16,,,,,{ if(getrefine()<6) { bonus bDef,2; bonus bMdef,5; } },{},{}
-4151,Gajomart_Card,Gajomart Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Plant,-20; bonus2 bExpAddRace,RC_Plant,10; },{},{}
-4152,Galapago_Card,Galapago Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Juice,50; bonus3 bAddMonsterDropItemGroup,IG_Juice,RC_Insect,900; },{},{}
-4153,Crab_Card,Crab Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1266,30; if(isequipped(4247,4273)) { bonus3 bAddMonsterDropItem,544,RC_Fish,3000; bonus2 bAddEle,Ele_Water,30; } },{},{}
-4154,Rice_Cake_Boy_Card,Dumpling Child Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Candy,50; bonus3 bAddMonsterDropItem,529,RC_DemiHuman,300; bonus3 bAddMonsterDropItem,530,RC_DemiHuman,100; },{},{}
-4155,Goblin_Leader_Card,Goblin Leader Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,1,30; },{},{}
-4156,Steam_Goblin_Card,Goblin Steamrider Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Formless,7; },{},{}
-4157,Goblin_Archer_Card,Goblin Archer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Undead,7; },{},{}
-4158,Flying_Deleter_Card,Sky Deleter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bHPrecovRate,-100; bonus bHPGainValue,100; },{},{}
-4159,Nine_Tail_Card,Nine Tail Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,2; if(getrefine()>8) bonus bFlee,20; },{},{}
-4160,Antique_Firelock_Card,Firelock Soldier Card,6,,10,10,,,,,,,,64,,,,,{ bonus bStr,2; if(getrefine()>8) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } },{},{}
-4161,Grand_Peco_Card,Grand Peco Card,6,,10,10,,,,,,,,769,,,,,{ bonus4 bAutoSpellWhenHit,75,1,50,0; if(isequipped(4031)) { bonus bDef,3; bonus bVit,3; } },{},{}
-4162,Grizzly_Card,Grizzly Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Blind,1000+2000*(isequipped(4074)); },{},{}
-4163,Gryphon_Card,Gryphon Card,6,,10,10,,,,,,,,2,,,,,{ bonus bFlee,2; bonus bCritical,7; if (BaseClass == Job_Swordman) bonus3 bAutoSpell,62,5,10; },{},{}
-4164,Gullinbursti_Card,Gullinbursti Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Fish,-20; bonus2 bExpAddRace,RC_Fish,10; },{},{}
-4165,Gig_Card,Gig Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Insect,5; },{ },{ heal 0,-5; }
-4166,Nightmare_Terror_Card,Nightmare Terror Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Curse,1000+2000*(isequipped(4127)); },{},{}
-4167,Neraid_Card,Neraid Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Brute,5; },{},{ heal 0,-5; }
-4168,Dark_Lord_Card,Dark Lord Card,6,,10,10,,,,,,,,64,,,,,{ bonus4 bAutoSpellWhenHit,83,5,100,0; if(isequipped(4169)) { bonus bMaxHPrate,20; bonus bMaxSPrate,20; } },{},{}
-4169,Dark_Illusion_Card,Dark Illusion Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bCastrate,-10-10*isequipped(4168); },{},{}
-4170,Dark_Frame_Card,Dark Frame Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,2000; },{},{}
-4171,Dark_Priest_Card,Dark Priest Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPGainValue,1; },{},{}
-4172,The_Paper_Card,The Paper Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus2 bSPDrainValue,-1,0; },{},{}
-4173,Demon_Pungus_Card,Demon Pungus Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,2000; },{},{}
-4174,Deviling_Card,Deviling Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50; },{},{}
-4175,Poison_Toad_Card,Poisonous Toad Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,52,1,20,1; },{},{}
-4176,Dullahan_Card,Dullahan Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Dragon,7; },{},{}
-4177,Dryad_Card,Dryad Card,6,,10,10,,,,,,,,769,,,,,{ bonus3 bAddMonsterDropItem,993,RC_Plant,100; bonus2 bSubEle,Ele_Earth,10; },{},{}
-4178,Dragon_Tail_Card,Dragon Tail Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,1; bonus bFlee,10; bonus2 bSkillAtk,46,5; bonus2 bSkillAtk,47,5; },{},{}
-4179,Dragon_Fly_Card,Dragon Fly Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,1; if(isequipped(4009)) bonus bFlee,18; },{},{}
-4180,Driller_Card,Driller Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Dragon,5; },{ },{ heal 0,-5; }
-4181,Disguise_Card,Disguise Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Silence,1000+2000*(readparam(bVit)>=77); },{},{}
-4182,Diabolic_Card,Diabolic Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Demon,5; },{ },{ heal 0,-5; }
-4183,Vagabond_Wolf_Card,Vagabond Wolf Card,6,,10,10,,,,,,,,4,,,,,{ bonus bStr,1; if(isequipped(4029)) bonus bFlee,18; },{},{}
-4184,Lava_Golem_Card,Lava Golem Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,4,30; },{},{}
-4185,Rideword_Card,Rideword Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; if(BaseClass == Job_Acolyte) { bonus bInt,1; bonus bMdef,1; } },{},{}
-4186,Raggler_Card,Raggler Card,6,,10,10,,,,,,,,64,,,,,{ bonus bStr,1; bonus bVit,1; if(isequipped(4233,4281,4321,4206)) { bonus bLuk,10; bonus2 bSPDrainValue,2,0; bonus2 bSkillAtk,42,20; if(BaseClass == Job_Merchant) { bonus2 bAddMonsterDropItem,617,-2; bonus bMagicDamageReturn,20; } } },{},{}
-4187,Raydric_Archer_Card,Raydric Archer Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12030,RC_Demon,300; },{},{}
-4188,Leib_Olmai_Card,Leib Olmai Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Fire,10; bonus3 bAddMonsterDropItem,990,RC_Brute,100; },{},{}
-4189,Wraith_Dead_Card,Wraith Dead Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Curse,2000; },{},{}
-4190,Wraith_Card,Wraith Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12027,RC_Undead,300; },{},{}
-4191,Loli_Ruri_Card,Loli Ruri Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,28,3,50,0; },{},{}
-4192,Rotar_Zairo_Card,Rotar Zairo Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Fish,7; },{},{}
-4193,Lude_Card,Lude Card,6,,10,10,,,,,,,,136,,,,,{ if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) bonus4 bAutoSpellWhenHit,8,1,200,0; },{},{}
-4194,Rybio_Card,Rybio Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stun,1000+2000*(readparam(bDex)>=77); },{},{}
-4195,Leaf_Cat_Card,Leaf Cat Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Water,10; bonus3 bAddMonsterDropItem,991,RC_Fish,100; },{},{}
-4196,Marin_Card,Marin Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItem,909,2000; bonus2 bAddMonsterDropItem,7126,10; },{},{}
-4197,Mastering_Card,Mastering Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLuk,1; if(isequipped(4001)) bonus bFlee,18; },{},{}
-4198,Maya_Puple_Card,Maya Purple Card,6,,10,10,,,,,,,,769,,,,,{ bonus bIntravision,0; },{},{}
-4199,Merman_Card,Merman Card,6,,10,10,,,,,,,,64,,,,,{ bonus bHPrecovRate,10; bonus bSPrecovRate,10; if(isequipped(4297,4234,4252,4178)) { bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass == Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } } },{},{}
-4200,Megalith_Card,Megalith Card,6,,10,10,,,,,,,,64,,,,,{ if(getrefine()<6) bonus bMdef,7; },{},{}
-4201,Majoruros_Card,Majoruros Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stun,2000; },{},{}
-4202,Civil_Servant_Card,Civil Servant Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Ghost,20; },{},{}
-4203,Mutant_Dragon_Card,Mutant Dragonoid Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus3 bAutoSpell,17,3+7*(getskilllv(17)==10),50; },{},{}
-4204,Mini_Demon_Card,Mini Demon Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Brute,-20; bonus2 bExpAddRace,RC_Brute,10; },{},{}
-4205,Mimic_Card,Mimic Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItem,603,-6; },{},{}
-4206,Mystcase_Card,Myst Case Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bAddMonsterDropItem,644,-24; },{},{}
-4207,Mysteltainn_Card,Mysteltainn Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,0,25; bonus bDef,1; },{},{}
-4208,Miyabi_Ningyo_Card,Miyabi Doll Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxSPrate,10; bonus2 bSkillAtk,15,5; },{},{}
-4209,Violy_Card,Violy Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,318,1+4*(getskilllv(318)==5),20,0; },{},{}
-4210,Wander_Man_Card,Wanderer Card,6,,10,10,,,,,,,,4,,,,,{ if(BaseClass == Job_Thief) bonus bFlee,20; if(isequipped(4172,4257,4230,4272) == 0) { bonus3 bAutoSpell,219,1,20; } else { bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,5; bonus2 bSPDrainValue,1,0; if(BaseClass == Job_Thief) bonus bNoGemStone,0; } },{},{}
-4211,Vocal_Card,Vocal Card,6,,10,10,,,,,,,,4,,,,,{ bonus bMdef,3; if(isequipped(4021)) bonus bFlee,18; },{},{}
-4212,Bon_Gun_Card,Bongun Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,5,1,20; bonus2 bAddSkillBlow,5,5; bonus2 bAddDamageByClass,1026,100; },{},{}
-4213,Brilight_Card,Brilight Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Silence,2000; },{},{}
-4214,Bloody_Murderer_Card,Bloody Murderer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Insect,7; },{},{}
-4215,Blazzer_Card,Blazer Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Food,500; },{},{}
-4216,Sasquatch_Card,Sasquatch Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,2000; },{},{}
-4217,Live_Peach_Tree_Card,Enchanted Peach Tree Card,6,,10,10,,,,,,,,32,,,,,{ bonus4 bAutoSpell,28,1+9*(getskilllv(28)==10),20,0; if(isequipped(4280,4185,4293,4312)) { bonus bVit,10; bonus bCastrate,-10; bonus bUseSPRate,-10; if(BaseClass == Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } } },{},{}
-4218,Succubus_Card,Succubus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,1000; bonus bVit,-3+4*isequipped(4269); bonus bHPrecovRate,-20+30*isequipped(4269); },{},{}
-4219,Sageworm_Card,Sage Worm Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Gemstone,90; },{},{}
-4220,Solider_Card,Solider Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDef,2; bonus bMdef,2; },{},{}
-4221,Skeleton_General_Card,Skeleton General Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Insect,-20; bonus2 bExpAddRace,RC_Insect,10; },{},{}
-4222,Skel_Prisoner_Card,Skeleton Prisoner Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,1000+2000*(isequipped(4025)); },{},{}
-4223,Stalactic_Golem_Card,Stalactic Golem Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Stun,2000; },{},{}
-4224,Stem_Worm_Card,Stem Worm Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12032,RC_Brute,300; },{},{}
-4225,Stone_Shooter_Card,Stone Shooter Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; bonus bHit,10; },{},{}
-4226,Sting_Card,Sting Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; if(getrefine()>8) bonus bMdef,5; },{},{}
-4227,Spring_Rabbit_Card,Spring Rabbit Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Meat,50; bonus3 bAddMonsterDropItemGroup,IG_Meat,RC_Brute,400; },{},{}
-4228,Sleeper_Card,Sleeper Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12031,RC_Fish,300; },{},{}
-4229,C_Tower_Manager_Card,Clock Tower Manager Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; bonus bCastrate,-5; if(isequipped(4244,4299,4313)) { bonus bDef,3; bonus bMdef,3; } },{},{}
-4230,Shinobi_Card,Shinobi Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,1; bonus4 bAutoSpellWhenHit,135,5,100,0; },{},{}
-4231,Increase_Soil_Card,Increase Soil Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bAddDamageByClass,1285,-50; bonus2 bAddDamageByClass,1286,-50; bonus2 bAddDamageByClass,1287,-50; },{},{}
-4232,Wild_Ginseng_Card,Hermit Plant Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Herb,50; bonus3 bAddMonsterDropItemGroup,IG_Herb,RC_Plant,1500; },{},{}
-4233,Baby_Leopard_Card,Baby Leopard Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,3; if(BaseClass == Job_Merchant) bonus bUnbreakableArmor,0; },{},{}
-4234,Anolian_Card,Anolian Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,45,1+9*(getskilllv(45)==10),30,0; },{},{}
-4235,Cookie_XMAS_Card,Christmas Cookie Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Angel,-20; bonus2 bExpAddRace,RC_Angel,10; },{},{}
-4236,Amon_Ra_Card,Amon Ra Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAllStats,1; bonus4 bAutoSpellWhenHit,73,10,(30+70*(readparam(bInt)>=99)),0; },{},{}
-4237,Owl_Duke_Card,Owl Duke Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,66,3,30,0; if(isequipped(4238)) bonus3 bAutoSpell,20,5,20; },{},{}
-4238,Owl_Baron_Card,Owl Baron Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,78,1,30; },{},{}
-4239,Iron_Fist_Card,Iron Fist Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Formless,-20; bonus2 bExpAddRace,RC_Formless,10; },{},{}
-4240,Arclouse_Card,Arclouze Card,6,,10,10,,,,,,,,32,,,,,{ if (getrefine()<6) { bonus bDef,2; bonus bMdef,3; } },{},{}
-4241,Archangeling_Card,Arc Angeling Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxHP,300; if(readparam(bLuk)>=77) { bonus bHPrecovRate,100; bonus bSPrecovRate,100; } },{},{}
-4242,Apocalips_Card,Apocalipse Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,2; if(getrefine()>8) bonus bMaxHP,800; },{},{}
-4243,Antonio_Card,Antonio Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,26,1,500,0; },{},{}
-4244,Alarm_Card,Alarm Card,6,,10,10,,,,,,,,64,,,,,{ bonus4 bAutoSpellWhenHit,10,1,200,0; bonus bMaxHP,300; bonus bVit,1; },{},{}
-4245,Am_Mut_Card,Am Mut Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_DemiHuman,-20; bonus2 bExpAddRace,RC_DemiHuman,10; },{},{}
-4246,Assulter_Card,Assaulter Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_DemiHuman,7; },{},{}
-4247,Aster_Card,Aster Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1074,30; },{},{}
-4248,Ancient_Mummy_Card,Ancient Mummy Card,6,,10,10,,,,,,,,32,,,,,{ bonus4 bAutoSpellWhenHit,32,5,30,0; if(isequipped(4106)) bonus bPerfectHitAddRate,20; },{},{}
-4249,Ancient_Worm_Card,Ancient Worm Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Demon,-20; bonus2 bExpAddRace,RC_Demon,10; },{},{}
-4250,Executioner_Card,Executioner Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,2,25; bonus bDef,1; },{},{}
-4251,Elder_Card,Elder Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,5,40; },{},{}
-4252,Alligator_Card,Alligator Card,6,,10,10,,,,,,,,136,,,,,{ bonus bLongAtkDef,5; },{},{}
-4253,Alice_Card,Alice Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Boss,40; bonus2 bSubRace,RC_NonBoss,-40; },{},{}
-4254,Tirfing_Card,Tirfing Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,1,25; bonus bDef,1; },{},{}
-4255,Orc_Lady_Card,Orc Lady Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,3,30; },{},{}
-4256,Orc_Archer_Card,Orc Archer Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12034,RC_DemiHuman,300; },{},{}
-4257,Wild_Rose_Card,Wild Rose Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,1; if(BaseClass == Job_Thief) bonus bFlee2,5; },{},{}
-4258,Wicked_Nymph_Card,Evil Nymph Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; bonus bMaxSP,50; },{},{}
-4259,Wooden_Golem_Card,Wooden Golem Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDef,1; bonus bHPrecovRate,30; },{},{}
-4260,Wootan_Shooter_Card,Wootan Shooter Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Confusion,2000; },{},{}
-4261,Wootan_Fighter_Card,Wootan Fighter Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Bleeding,2000; },{},{}
-4262,Evil_Cloud_Hermit_Card,Cloud Hermit Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12029,RC_Plant,300; },{},{}
-4263,Incant_Samurai_Card,Incantation Samurai Card,6,,10,10,,,,,,,,2,,,,,{ bonus bIgnoreDefRace,RC_NonBoss; bonus bNoRegen,1; bonus2 bHPLossRate,666,10000; },{ },{ heal -999,0; }
-4264,Wind_Ghost_Card,Wind Ghost Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,84,3+7*(getskilllv(84)==10),20; },{},{}
-4265,Li_Me_Mang_Ryang_Card,Li Me Mang Ryang Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12033,RC_Angel,300; },{},{}
-4266,Eclipse_Card,Eclipse Card,6,,10,10,,,,,,,,4,,,,,{ bonus bVit,1; if(isequipped(4006)) bonus bFlee,18; },{},{}
-4267,Explosion_Card,Explosion Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Dragon,-20; bonus2 bExpAddRace,RC_Dragon,10; },{},{}
-4268,Injustice_Card,Injustice Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,136,1,50; if(isequipped(4277)) { bonus bBaseAtk,20; bonus bLuk,3; } },{},{}
-4269,Incubus_Card,Incubus Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxSP,150; bonus bInt,-3+4*isequipped(4218); bonus bSPrecovRate,-20+30*isequipped(4218); },{},{}
-4270,Giant_Spider_Card,Giant Spider Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Poison,2000; },{},{}
-4271,Giant_Honet_Card,Giant Hornet Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Wind,10; bonus3 bAddMonsterDropItem,992,RC_Insect,100; },{},{}
-4272,Dancing_Dragon_Card,Dancing Dragon Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,1; bonus bCritical,3; },{},{}
-4273,Shellfish_Card,Shell Fish Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30; },{},{}
-4274,Zombie_Master_Card,Zombie Master Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Undead,5; },{ },{ heal 0,-5; }
-4275,Zombie_Prisoner_Card,Zombie Prisoner Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10; },{},{}
-4276,Lord_Of_Death_Card,Lord of Death Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Stun,500; bonus2 bAddEff,Eff_Curse,500; bonus2 bAddEff,Eff_Silence,500; bonus2 bAddEff,Eff_Poison,500; bonus2 bAddEff,Eff_Bleeding,500; bonus2 bWeaponComaRace,RC_NonBoss,10; },{},{}
-4277,Zherlthsh_Card,Zherlthsh Card,6,,10,10,,,,,,,,32,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,316,10; bonus2 bSkillAtk,324,10; },{},{}
-4278,Gibbet_Card,Gibbet Card,6,,10,10,,,,,,,,769,,,,,{ if(getrefine()<6) bonus bMdef,5; },{},{}
-4279,Deleter_Card,Earth Deleter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bSPrecovRate,-100; bonus bSPGainValue,10; },{ },{ heal 0,-100; }
-4280,Geographer_Card,Geographer Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,34,2+8*(getskilllv(34)==10),30,0; },{},{}
-4281,Zipper_Bear_Card,Zipper Bear Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus2 bSPDrainValue,-1,0; if(BaseClass == Job_Merchant) bonus bUnbreakableWeapon,0; },{},{}
-4282,Tengu_Card,Tengu Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Recovery,500; },{},{}
-4283,Greatest_General_Card,Greatest General Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,261,5,2+18*(BaseClass == Job_Acolyte),0; },{},{}
-4284,Chepet_Card,Chepet Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,28,5,50; },{},{}
-4285,Choco_Card,Choco Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee2,5; bonus bFlee,10; },{},{}
-4286,Karakasa_Card,Karakasa Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Confusion,1000+2000*(readparam(bStr)>=77); },{},{}
-4287,Kapha_Card,Kapha Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()<6) bonus bMdef,8; },{},{}
-4288,Carat_Card,Carat Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,2; if(getrefine()>8) bonus bMaxSP,150; },{},{}
-4289,Caterpillar_Card,Caterpillar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Plant,5; },{ },{ heal 0,-5; }
-4290,Cat_O_Nine_Tail_Card,Cat O' Nine Tails Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMdef,3; bonus bMagicDamageReturn,5; },{},{}
-4291,Kobold_Leader_Card,Kobold Leader Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,2,30; },{},{}
-4292,Kobold_Archer_Card,Kobold Archer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Plant,7; },{},{}
-4293,Cookie_Card,Cookie Card,6,,10,10,,,,,,,,136,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,156,10; },{},{}
-4294,Quve_Card,Quve Card,6,,10,10,,,,,,,,136,,,,,{ if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) bonus4 bAutoSpellWhenHit,29,1,100,0; if(isequipped(4193)) { bonus bMaxHP,300; bonus bMaxSP,60; } },{},{}
-4295,Kraben_Card,Kraben Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Blind,2000; },{},{}
-4296,Cramp_Card,Cramp Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bGetZenyNum,10,3; if(isequipped(4028)) bonus bStr,3; },{},{}
-4297,Cruiser_Card,Cruiser Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Brute,7; },{},{}
-4298,Cremy_Fear_Card,Creamy Fear Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Confusion,2000; },{},{}
-4299,Clock_Card,Clock Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,249,3+7*(getskilllv(249)==10),30,0; },{},{}
-4300,Chimera_Card,Chimera Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Poison,1000+2000*(BaseJob==Job_Assassin); },{},{}
-4301,Killer_Mantis_Card,Killer Mantis Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Bleeding,2000; },{},{}
-4302,Tao_Gunka_Card,Tao Gunka Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,100; bonus bDef,-50; bonus bMdef,-50; },{},{}
-4303,Whisper_Boss_Card,Giant Whisper Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,10; if(readparam(bStr)>=80) bonus bBaseAtk,20; if(readparam(bVit)>=80) bonus bMaxHPrate,3; if(readparam(bLuk)>=80) bonus bCritical,3; },{},{}
-4304,Tamruan_Card,Tamruan Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; bonus2 bSkillAtk,250,10; bonus2 bSkillAtk,251,10; },{},{}
-4305,Turtle_General_Card,Turtle General Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAtkRate,20; if(BaseClass == Job_Swordman) bonus3 bAutoSpell,7,10,30; },{},{}
-4306,Toad_Card,Toad Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee2,1; if(isequipped(4014)) bonus bFlee,18; },{},{}
-4307,Kind_Of_Beetle_Card,Beetle King Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Fish,5; },{ },{ heal 0,-5; }
-4308,Tri_Joint_Card,Tri Joint Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Formless,5; },{ },{ heal 0,-5; }
-4309,Parasite_Card,Parasite Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,1; bonus2 bSubEle,Ele_Neutral,5; },{},{}
-4310,Panzer_Goblin_Card,Panzer Goblin Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Demon,7; },{},{}
-4311,Permeter_Card,Permeter Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Dark,15; bonus2 bSubEle,Ele_Undead,15; },{},{}
-4312,Fur_Seal_Card,Seal Card,6,,10,10,,,,,,,,2,,,,,{ bonus bFlee,3; bonus bHit,10; if(BaseClass == Job_Acolyte) { bonus2 bCriticalAddRace,RC_Undead,9; bonus2 bCriticalAddRace,RC_Demon,9; } },{},{}
-4313,Punk_Card,Punk Card,6,,10,10,,,,,,,,4,,,,,{ bonus4 bAutoSpellWhenHit,92,1+4*(getskilllv(92)==5),50,0; },{},{}
-4314,Penomena_Card,Penomena Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Formless,30; },{},{}
-4315,Pest_Card,Pest Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,1000+2000*(readparam(bInt)>=77); },{},{}
-4316,Fake_Angel_Card,False Angel Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Angel,5; },{ },{ heal 0,-5; }
-4317,Mobster_Card,Mobster Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,15; if(BaseClass == Job_Thief) bonus bCritical,4; },{},{}
-4318,Knight_Windstorm_Card,Stormy Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,89,2,20; bonus2 bAddEff,Eff_Freeze,2000; },{},{}
-4319,Freezer_Card,Freezer Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHP,300; if(getrefine()>=9) bonus2 bSkillAtk,5,10; if(isequipped(4246,4311,4220,4331)) { bonus bStr,10; bonus bMaxHPrate,20; bonus bHPrecovRate,50; bonus4 bAutoSpell,112,1,3,0; bonus2 bAddMonsterDropItem,501,500; if(BaseClass == Job_Swordman) { bonus2 bAddItemHealRate,IG_Potion,50; } } },{},{}
-4320,Bloody_Knight_Card,Bloody Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,83,1,20; },{},{}
-4321,Hylozoist_Card,Hylozoist Card,6,,10,10,,,,,,,,136,,,,,{ bonus bClassChange,100; },{},{}
-4322,High_Orc_Card,High Orc Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,1; bonus bShortWeaponDamageReturn,5; },{},{}
-4323,Garm_Baby_Card,Garm Baby Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,15,3,50+250*isequipped(4324); },{},{}
-4324,Garm_Card,Garm Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,5000; },{},{}
-4325,Harpy_Card,Harpy Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,15; bonus2 bSkillAtk,11,5; if(isequipped(4191,4208,4258,4309,4327)) { bonus bMaxHP,500; bonus bDef,5; bonus bMDef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass == Job_Mage) { bonus bMatkRate,3; bonus bCastrate,-15; } } },{},{}
-4326,See_Otter_Card,Sea-Otter Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Fish,50; bonus3 bAddMonsterDropItemGroup,IG_Fish,RC_Fish,600; },{},{}
-4327,Blood_Butterfly_Card,Bloody Butterfly Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCastrate,30; bonus bNoCastCancel,0; bonus2 bSkillAtk,18,5; },{},{}
-4328,Hyegun_Card,Hyegun Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,15; bonus bCritical,1; if(isequipped(4090,4212)) bonus bAllStats,1; },{},{}
-4329,Phendark_Card,Phendark Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_DemiHuman,5; },{ },{ heal 0,-5; }
-4330,Dark_Snake_Lord_Card,Evil Snake Lord Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,3; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Curse,10000; },{},{}
-4331,Heater_Card,Heater Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCritical,3; if(BaseClass == Job_Swordman) bonus bFlee2,3; },{},{}
-4332,Waste_Stove_Card,Waste Stove Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,5; bonus bInt,1; if(isequipped(4185,4293,4312)) { bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus4 bAutoSpell,32,5,10,1; bonus2 bSkillAtk,271,10; if(BaseJob == Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } } },{},{}
-4333,Venomous_Card,Venomous Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Poison,3000,2; },{},{}
-4334,Noxious_Card,Noxious Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLongAtkDef,20; },{},{}
-4335,Pitman_Card,Pitman Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,90,2; bonus2 bSkillAtk,91,2; },{},{}
-4336,Ungoliant_Card,Ungoliant Card,6,,10,10,,,,,,,,769,,,,,{ bonus bHPrecovRate,10; bonus2 bResEff,Eff_Bleeding,10000; },{},{}
-4337,Porcellio_Card,Porcellio Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,25; bonus bDef,-5; },{},{}
-4338,Obsidian_Card,Obsidian Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,readparam(bDex)/18; },{},{}
-4339,Mineral_Card,Mineral Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,-25; bonus bDef,3; },{},{}
-4340,Teddy_Bear_Card,Teddy Bear Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Undead,30; },{},{}
-4341,Metaling_Card,Metaling Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,215,1,50; },{},{}
-4342,RSX_0806_Card,RSX 0806 Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4343,Holden_Card,Holden Card,6,,10,10,,,,,,,,769,,,,,{ bonus bLuk,2; if(isequipped(4186,4281,4036,4233)) { bonus bStr,4; bonus bMaxHPrate,7; bonus bMaxSPrate,7; bonus2 bSkillAtk,42,20; bonus bSPDrainValue,1; if(BaseJob == Job_Alchem) { bonus4 bAutoSpell,111,1,10,0; bonus2 bAddMonsterDropItem,7139,300; bonus2 bAddMonsterDropItem,905,300; } } },{},{}
-4344,Anopheles_Card,Anopheles Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12058,RC_Insect,300; },{},{}
-4345,Hill_Wind_Card,Hill Wind Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,21,2; bonus2 bSkillAtk,84,2; bonus2 bSkillAtk,85,2; },{},{}
-4346,Egnigem_Cenia_Card,Egnigem Cenia Card,6,,10,10,,,,,,,,16,,,,,{ bonus bStr,readparam(bInt)/18; },{},{}
-4347,Armeyer_Dinze_Card,Armeyer Dinze Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddMonsterDropItem,12053,RC_Fish,300; },{},{}
-4348,Wikebine_Tres_Card,Wikebine Tres Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,217,1,50; if(isequipped(4039,4210,4257,4230)) { bonus bStr,6; bonus bAgi,4; bonus2 bSkillAtk,212,10; if(getskilllv(217)==5) bonus3 bAutoSpell,217,5,50; if(BaseJob == Job_Rogue) { bonus bUseSPrate,-20; bonus3 bAutoSpell,219,1,-20; } } },{},{}
-4349,Errende_Ebecee_Card,Errende Ebecee Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpellWhenHit,25,1,50,0; },{},{}
-4350,Laurell_Weinder_Card,Laurell Weinder Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,88,1; bonus2 bSkillAtk,89,1; },{},{}
-4351,Kavach_Icarus_Card,Kavach Icarus Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()<=4) { bonus bFlee,20; bonus bFlee2,1; } else { bonus bFlee,10; } },{},{}
-4352,General_Egnigem_Cenia_Card,General Egnigem Cenia Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-4353,Remover_Card,Remover Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,(800-(80*getrefine())); bonus bHPrecovRate,10; },{},{}
-4354,Gemini-S58_Card,Gemini-S58 Card,6,,10,10,,,,,,,,769,,,,,{ if(readparam(bAgi)>=90) { bonus2 bResEff,Eff_Silence,3000; bonus2 bResEff,Eff_Stun,3000; } if(readparam(bVit)>=80) { bonus2 bResEff,Eff_Stone,5000; bonus2 bResEff,Eff_Sleep,5000; } },{},{}
-4355,Gremlin_Card,Gremlin Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12043,RC_Brute,300; },{},{}
-4356,Beholder_Card,Beholder Card,6,,10,10,,,,,,,,136,,,,,{ skill 275,1; },{},{}
-4357,Lord_Knight_Card,Lord Knight Card,6,,10,10,,,,,,,,769,,,,,{ skill 359,1; bonus bMaxHPrate,-50; },{},{}
-4358,Seyren_Windsor_Card,Seyren Windsor Card,6,,10,10,,,,,,,,769,,,,,{ bonus bStr,getrefine()-6; },{},{}
-4359,Assassin_Cross_Card,Assassin Cross Card,6,,10,10,,,,,,,,4,,,,,{ skill 135,3; },{},{}
-4360,Eremes_Guile_Card,Eremes Guile Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
-4361,Whitesmith_Card,Whitesmith Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBreakWeaponRate,1000; bonus bBreakArmorRate,700; },{},{}
-4362,Howard_Alt-Eisen_Card,Howard Alt-Eisen Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,-5; bonus bHit,40; },{},{}
-4363,High_Priest_Card,High Priest Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4364,Margaretha_Solin_Card,Margaretha Solin Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4365,High_Wizard_Card,High Wizard Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4366,Kathryne_Keyron_Card,Kathryne Keyron Card,6,,10,10,,,,,,,,769,,,,,{ bonus bCastrate,getrefine()*-1; },{},{}
-4367,Sniper_Card,Sniper Card,6,,10,10,,,,,,,,2,,,,,{ bonus bNoRegen,1; bonus2 bHpDrainRate,50,20; },{},{}
-4368,Cecil_Damon_Card,Cecil Damon Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,5; bonus bHit,-30; },{},{}
-4369,Venatu_Card,Venatu Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,readparam(bAgi)/18; },{},{}
-4370,Dimik_Card,Dimik Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,getrefine()-5; },{},{}
-4371,Archdam_Card,Archdam Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,10; bonus bCastrate,20; if(isequipped(4311,4319,4331)) { bonus bInt,1; bonus bStr,1; bonus bDef,2; bonus bSPrecovRate,10; bonus2 bSkillAtk,480,10; bonus2 bSkillAtk,368,10; bonus bCastrate,-10; if(BaseJob == Job_Crusader) { bonus bDefEle,Ele_Holy; } } },{},{}
-4372,Bacsojin_Card,Bacsojin Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4373,Chung_E_Card,Chung E Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLuk, getrefine()-5; },{},{}
-4374,Vesper_Card,Vesper Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4375,Orc_Baby_Card,Orc Baby Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()>=9) { bonus2 bSubEle,Ele_Neutral,15; bonus bFlee,15; } else { bonus2 bSubEle,Ele_Neutral,10; bonus bFlee,10; } },{},{}
-4376,Lady_Tany_Card,Lady Tanee Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-50; bonus bMaxSPrate,50; bonus2 bAddMonsterDropItem,513,500; bonus2 bAddItemHealRate,513,100; },{},{}
-4377,Green_Iguana_Card,Green Iguana Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12063,RC_Formless,300; },{},{}
-4378,Gold_Acidus_Card,Gold Acidus Card,6,,10,10,,,,,,,,64,,,,,{ if(getrefine()<=4) { bonus bMaxHPrate,8; bonus bMaxSPrate,8; bonus bHPrecovRate,5; bonus bSPrecovRate,5; } else { bonus bMaxHPrate,4; bonus bMaxSPrate,4; } },{},{}
-4379,Blue_Acidus_Card,Blue Acidus Card,6,,10,10,,,,,,,,769,,,,,{ if(getrefine()<=4) { bonus bSPrecovRate,5; bonus bMaxSP,80; } else { bonus bMaxSP,40; } },{},{}
-4380,Red_Ferus_Card,Red Ferus Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,80,2; bonus2 bSkillAtk,83,2; },{},{}
-4381,Green_Ferus_Card,Green Ferus Card,6,,10,10,,,,,,,,64,,,,,{ bonus bVit,1; bonus bMaxHPrate,10; if(isequipped(4297,4234,4252,4178)) { bonus bDex,5; bonus2 bSkillAtk,394,5; bonus2 bSkillAtk,324,10; bonus2 bSkillAtk,316,10; if(BaseJob == Job_Bard || BaseJob == Job_Dancer) { bonus4 bAutoSpellWhenHit,489,2,50,1; } } },{},{}
-4382,Yellow_Novus_Card,Yellow Novus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,500; bonus bHPrecovRate,10; if(isequipped(4208,4258,4325,4327)) { bonus bInt,3; bonus2 bSkillAtk,91,10; bonus2 bSkillAtk,21,10; if(BaseJob == Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bCastrate,-20; } } },{},{}
-4383,Red_Novus_Card,Red Novus Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Confusion,3000,2; },{},{}
-4384,Hydro_Card,Hydro Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,277,1,100; },{},{}
-4385,Dragon_Egg_Card,Dragon Egg Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12048,RC_Dragon,300; },{},{}
-4386,Detale_Card,Detale Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4387,Ancient_Mimic_Card,Ancient Mimic Card,6,,10,10,,,,,,,,16,,,,,{ bonus bAgi,readparam(bLuk)/18; },{},{}
-4388,Deathword_Card,Deathword Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,11,2; bonus2 bSkillAtk,13,2; bonus2 bSkillAtk,400,2; },{},{}
-4389,Plasma_Card,Plasma Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Resist,1200; },{},{}
-4390,Breeze_Card,Breeze Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddEff,Eff_Bleeding,500; },{},{}
-4391,Retribution_Card,Retribution Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12068,RC_Angel,300; },{},{}
-4392,Observation_Card,Observation Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDex,readparam(bVit)/18; },{},{}
-4393,Shelter_Card,Shelter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bInt,readparam(bStr)/18; },{},{}
-4394,Solace_Card,Solace Card,6,,10,10,,,,,,,,2,,,,,{ if(BaseJob == Job_Priest) bonus4 bAutoSpell,254,5,10,0; },{},{}
-4395,Thanatos_Maero_Card,Thanatos Maero Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus3 bAutoSpell,30,3,50; },{},{}
-4396,Thanatos_Odium_Card,Thanatos Odium Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,getrefine()-5;},{},{}
-4397,Thanatos_Despero_Card,Thanatos Despero Card,6,,10,10,,,,,,,,32,,,,,{ bonus bInt,getrefine()-6; },{},{}
-4398,Thanatos_Dolor_Card,Thanatos Dolor Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4399,Thanatos_Card,Thanatos Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; bonus bSPDrainValue,-1; bonus bDef,-30; bonus bFlee,-30; },{},{}
-4400,Aliza_Card,Aliza Card,6,,10,10,,,,,,,,16,,,,,{ if(BaseJob == Job_Dancer) { bonus4 bAutoSpellWhenHit,1011,1,100,1; } else { bonus4 bAutoSpellWhenHit,1011,1,50,1; } },{},{}
-4401,Alicel_Card,Alicel Card,6,,10,10,,,,,,,,16,,,,,{ bonus bFlee,10; bonus bDef,-5; },{},{}
-4402,Aliot_Card,Aliot Card,6,,10,10,,,,,,,,4,,,,,{ if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) { bonus bStr, 2; bonus bMaxHPrate, 5; } if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) { bonus bInt, 2; bonus bMaxSPrate, 5; } },{},{}
-4403,Kiel_D-01_Card,Kiel D-01 Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4404,Skogul_Card,Skogul Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Bleeding,3000,2; },{},{}
-4405,Frus_Card,Frus Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4406,Skeggiold_Card,Skeggiold Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-4407,Valkyrie_Randgris_Card,Valkyrie Randgris Card,6,,10,10,,,,,,,,,,,,,{},{},{}
-
-// More Headgears
-//===================================================================
-5001,Headset,Headset,5,,10,200,,3,,0,0xFFFFFFFE,7,2,256,,0,1,87,{ bonus2 bResEff,Eff_Curse,1000; },{},{}
-5002,Gemmed_Crown,Jewel Crown,5,,10,600,,4,,0,0x000654E2,7,2,256,,60,1,88,{ bonus bMdef,3; bonus bInt,2; bonus bLuk,1; },{},{}
-5003,Joker_Jester,Joker Jester,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,89,{ bonus bMdef,5; bonus bLuk,2; },{},{}
-5004,Oxygen_Mask,Oxygen Mask,5,,10,200,,0,,0,0xFFFFFFFE,7,2,1,,0,0,90,{ bonus2 bResEff,Eff_Poison,2000; },{},{}
-5005,Gas_Mask,Gas Mask,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,91,{ bonus2 bResEff,Eff_Poison,3000; },{},{}
-5006,Machoman_Glasses,Machoman's Glasses,5,36000,,100,,1,,0,0xFFFFFFFE,7,2,512,,0,0,92,{},{},{}
-5007,Loard_Circlet,Grand Circlet,5,,10,200,,3,,0,0xFFFFFFFE,7,2,256,,55,1,93,{ bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1; },{},{}
-5008,Puppy_Love,Puppy Love,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,94,{},{},{}
-5009,Safety_Helmet,Safety Helmet,5,,10,500,,3,,0,0xFFFFFFFE,7,2,256,,0,1,95,{ bonus bMdef,3; bonus bUnbreakableHelm,0; },{},{}
-5010,Indian_Hair_Piece,Indian Fillet,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,96,{},{},{}
-5011,Antenna,Aerial,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,97,{},{},{}
-5012,Ph.D_Hat,Ph.D Hat,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,98,{ bonus bMdef,3; },{},{}
-5013,Horn_Of_Lord_Kaho,Lord Kaho's Horn,5,,10,100,,5,,0,0xFFFFFFFF,7,2,256,,0,1,99,{ bonus bMdef,10; bonus bStr,5; bonus bAgi,10; bonus bVit,10; bonus bInt,5; bonus bLuk,20; },{},{}
-5014,Fin_Helm,Fin Helm,5,,10,300,,2,,0,0x00004082,7,2,512,,65,0,100,{},{},{}
-5015,Egg_Shell,Egg Shell,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,0,101,{},{},{}
-5016,Boy's_Cap,Boys Cap,5,,10,100,,2,,0,0xFFFFFFFE,7,2,256,,0,1,102,{},{},{}
-5017,Bone_Helm,Bone Helm,5,,10,800,,7,,0,0x000444A2,7,2,256,,70,1,103,{ bonus2 bSubEle,Ele_Dark,-15; },{},{}
-5018,Feather_Bonnet,Feather Bonnet,5,,10,300,,4,,0,0x00080808,7,2,256,,0,1,104,{ bonus bAgi,1; },{},{}
-5019,Corsair,Corsair,5,,10,500,,5,,0,0xFFFFFFFE,7,2,256,,0,1,105,{ bonus bVit,1; },{},{}
-5020,Kafra_Band,Kafra Band,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,0,1,106,{ bonus bMdef,3; },{},{}
-5021,Bankruptcy_Of_Heart,Grief for Greed,5,,10,1200,,4,,0,0x00040420,7,2,256,,38,1,107,{ bonus bInt,1; bonus bDex,1; },{},{}
-5022,Helm_Of_Sun,Hat of the Sun God,5,,10,2400,,4,,0,0x00CFDF80,7,2,768,,0,1,138,{ bonus bStr,3; bonus bInt,2; },{},{}
-5023,Hat_Of_Bundle,Parcel Hat,5,,10,1000,,0,,0,0x00040420,7,2,256,,0,1,108,{},{},{}
-5024,Hat_Of_Cake,Cake Hat,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,256,,0,1,109,{},{},{}
-5025,Helm_Of_Angel,Helm of Angel,5,,10,1600,,5,,0,0x00CFDF80,7,2,256,,74,1,110,{ bonus bAgi,1; bonus bLuk,1; bonus bMdef,3; },{},{}
-5026,Hat_Of_Cook,Chef Hat,5,,10,300,,1,,0,0xFFFFFFFE,7,2,256,,50,1,111,{ bonus bDex,1; },{},{}
-5027,Wizardry_Hat,Mage Hat,5,,10,300,,1,,0,0x00810204,7,2,256,,0,1,112,{ bonus bInt,2; bonus bMaxSP,150; },{},{}
-5028,Candle,Candle,5,,10,150,,5,,0,0xFFFFFFFF,7,2,256,,0,1,113,{},{},{}
-5029,Spore_Hat,Spore Hat,5,,10,900,,3,,0,0xFFFFFFFE,7,2,256,,20,1,114,{},{},{}
-5030,Panda_Cap,Panda Hat,5,,10,800,,3,,0,0xFFFFFFFE,7,2,256,,40,1,115,{},{},{}
-5031,Mine_Helm,Mine Hat,5,,10,1500,,4,,0,0x0006D5F2,7,2,256,,55,1,116,{ bonus bDex,2; },{},{}
-5032,Picnic_Hat,Sunday Hat,5,,10,800,,1,,0,0xFFFFFFFE,7,2,256,,0,1,117,{},{},{}
-5033,Smokie_Hat,Raccoon Hat,5,,10,900,,3,,0,0xFFFFFFFE,7,2,256,,50,1,118,{},{},{}
-5034,Light_Bulb_Band,Bulb Band,5,,10,500,,0,,0,0xFFFFFFFE,7,2,256,,0,1,119,{},{},{}
-5035,Poring_Hat,Poring Hat,5,,10,700,,2,,0,0xFFFFFFFE,7,2,256,,38,1,120,{},{},{}
-5036,Cross_Band,Cross Hat,5,,10,250,,1,,0,0xFFFFFFFE,7,2,256,,10,1,121,{},{},{}
-5037,Fruit_Shell,Nutshell,5,,10,150,,4,,0,0xFFFFFFFF,7,2,256,,5,0,122,{},{},{}
-5038,Deviruchi_Cap,Deviruchi Hat,5,,10,800,,2,,0,0xFFFFFFFE,7,2,256,,64,1,123,{ bonus bStr,1; bonus bInt,1; },{},{}
-5039,Mottled_Egg_Shell,Rainbow Eggshell,5,,10,400,,4,,0,0xFFFFFFFF,7,2,256,,19,0,124,{},{},{}
-5040,Blush,Blush,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,125,{},{},{}
-5041,Heart_Hair_Pin,Heart Hairpin,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,126,{},{},{}
-5042,Hair_Protector,Bao Bao,5,,10,150,,0,,0,0xFFFFFFFE,7,2,256,,14,1,127,{},{},{}
-5043,Opera_Ghost_Mask,Opera Phantom Mask,5,,10,200,,1,,0,0xFFFFFFFE,7,2,512,,20,0,128,{},{},{}
-5044,Devil's_Wing,Wings of Diablo,5,,10,350,,2,,0,0xFFFFFFFF,7,2,256,,45,1,129,{},{},{}
-5045,Magician_Hat,Magician Hat,5,,10,500,,3,,0,0x00818314,7,2,256,,50,1,130,{ bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50; },{},{}
-5046,Bongun_Hat,Bongun Hat,5,,10,300,,5,,0,0xFFFFFFFF,7,2,769,,0,0,139,{},{},{}
-5047,Fashion_Sunglass,Fashionable Glasses,5,,10,100,,0,,0,0xFFFFFFFE,7,2,256,,0,1,131,{},{},{}
-5048,First_Moon_Hair_Pin,Cresent Hairpin,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,132,{},{},{}
-5049,Stripe_Band,Striped Hairband,5,,10,150,,1,,0,0xFFFFFFFF,7,2,256,,0,0,133,{},{},{}
-5050,Mystery_Fruit_Shell,Wonder_Nutshell,5,,10,300,,5,,0,0xFFFFFFFF,7,2,256,,30,0,134,{},{},{}
-5051,Kitty_Bell,Pussy_Cat_Bell,5,,10,100,,5,,0,0xFFFFFFFF,7,2,1,,0,0,135,{},{},{}
-5052,Blue_Hair_Band,Blue Hairband,5,,10,150,,1,,0,0xFFFFFFFF,7,2,256,,0,1,136,{},{},{}
-5053,Spinx_Helm,Sphinx Hat,5,,10,3000,,5,,0,0x00004082,7,2,257,,65,0,137,{ bonus bStr,3; },{},{}
-5054,Assassin_Mask,Assassin Mask,5,,10,100,,0,,0,0x00001100,7,2,1,,70,0,180,{},{},{}
-5055,Novice_Egg_Cap,Novice False Eggshell,5,,10,1,,3,,0,0x00000001,7,2,256,,0,0,101,{},{},{}
-5056,Love_Berry,Fruit of Love,5,,10,200,,0,,0,0xFFFFFFFF,7,2,256,,0,1,140,{},{},{}
-5057,Ear_Of_Black_Cat,Black Cat Ears,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,45,1,141,{},{},{}
-5058,Drooping_Kitty,Drooping Cat,5,,10,500,,1,,0,0xFFFFFFFE,7,2,256,,0,1,142,{ bonus bMDef,15; bonus2 bResEff,Eff_Curse,3000; },{},{}
-5059,Brown_Bear_Cap,Teddybear Hat,5,,10,800,,3,,0,0xFFFFFFFF,7,2,256,,50,1,143,{},{},{}
-5060,Party_Hat,Party Hat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,144,{ bonus bLuk,1; },{},{}
-5061,Flower_Hairpin,Flower Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,145,{},{},{}
-5062,Straw_Hat,Straw Hat,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,50,1,146,{ bonus bAgi,1; },{},{}
-5063,Plaster,Giant Band Aid,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,147,{},{},{}
-5064,Leaf_Headgear,Smokie Leaf,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,148,{},{},{}
-5065,Fish_On_Head,Blue Fish,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,50,1,149,{ bonus2 bAddRace,RC_Fish,10; },{},{}
-5066,Horn_Of_Succubus,Succubus Horn,5,,10,800,,4,,0,0xFFFFFFFE,7,2,256,,70,1,150,{ bonus bInt,1; bonus bMdef,10; },{},{}
-5067,Sombrero,Sombrero,5,,10,350,,4,,0,0xFFFFFFFE,7,2,256,,0,1,151,{ bonus bAgi,1; },{},{}
-5068,Ear_Of_Devil's_Wing,Evil Wing Ears,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,70,0,152,{ bonus bStr,1; },{},{}
-5069,Mask_Of_Fox,Kitsune Mask,5,,10,300,,1,,0,0xFFFFFFFE,7,2,256,,0,1,153,{ bonus bAgi,1; bonus bLuk,1; },{},{}
-5070,Headband_Of_Power,Hot-blooded Headband,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,154,{ bonus bStr,2; },{},{}
-5071,Indian_Headband,Indian Headband,5,,10,200,,1,,0,0xFFFFFFFE,7,2,256,,0,1,155,{ bonus bDex,1; },{},{}
-5072,Inccubus_Horn,Incubus Horn,5,,10,800,,4,,0,0xFFFFFFFE,7,2,256,,70,1,156,{ bonus bAgi,1; bonus bMdef,10; },{},{}
-5073,Cap_Of_Concentration,Model Training Hat,5,,10,700,,2,,0,0xFFFFFFFE,7,2,256,,0,1,157,{ bonus bDex,2; },{},{}
-5074,Ear_Of_Angel's_Wing,Angel Wing Ears,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,70,0,158,{ bonus bStr,1; },{},{}
-5075,Cowboy_Hat,Cowboy Hat,5,,10,500,,4,,0,0xFFFFFFFF,7,2,256,,0,1,159,{},{},{}
-5076,Fur_Hat,Beanie,5,,10,350,,2,,0,0xFFFFFFFF,7,2,256,,0,1,160,{ bonus bLuk,1; },{},{}
-5077,Tulip_Hairpin,Tulip Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,161,{},{},{}
-5078,Sea_Otter_Cap,Sea-Otter Hat,5,,10,800,,3,,0,0xFFFFFFFF,7,2,256,,50,1,162,{ bonus bVit,1; },{},{}
-5079,Crossed_Hair_Band,X Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,163,{},{},{}
-5080,Headgear_Of_Queen,Crown of Ancient Queen,5,,10,400,,4,,0,0xFFFFFFFF,7,2,256,,45,1,164,{},{},{}
-5081,Mistress_Crown,Crown of Mistress,5,,10,100,,1,,0,0xFFFFFFFE,7,0,256,,75,1,165,{ bonus bMaxSP,100; bonus bInt,2; bonus bUnbreakableHelm,0; },{},{}
-5082,Mushroom_Band,Decorative Mushroom,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,166,{},{},{}
-5083,Red_Tailed_Ribbon,Red Ribbon,5,,10,200,,1,,0,0xFFFFFFFF,7,0,256,,45,1,167,{ bonus bMdef,10; },{},{}
-5084,Lazy_Raccoon,Lazy Smokie,5,,10,500,,1,,0,0xFFFFFFFE,7,2,256,,0,1,168,{ bonus2 bResEff,Eff_Sleep,2000; },{},{}
-5085,Pair_Of_Red_Ribbon,Small Ribbons,5,,10,100,,1,,0,0xFFFFFFFF,7,0,512,,45,0,169,{},{},{}
-5086,Alarm_Mask,Alarm Mask,5,,10,100,,2,,0,0xFFFFFFFE,7,2,513,,0,0,170,{ bonus2 bResEff,Eff_Blind,5000; },{},{}
-5087,Goblin_Mask_01,Poker Face,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,171,{},{},{}
-5088,Goblin_Mask_02,Surprised Mask,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,172,{},{},{}
-5089,Goblin_Mask_03,Annoyed Mask,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,173,{},{},{}
-5090,Goblin_Mask_04,Goblin Leader Mask,5,,10,100,,2,,0,0xFFFFFFFF,7,2,513,,0,0,174,{},{},{}
-5091,Big_Golden_Bell,Decorative Golden Bell,5,,10,200,,2,,0,0xFFFFFFFE,7,2,768,,35,1,175,{},{},{}
-5092,Blue_Coif,Coif,5,150000,,300,,5,,0,0x00001100,7,0,768,,65,1,176,{},{},{}
-5093,Blue_Coif_,Coif,5,150000,,300,,5,,1,0x00001100,7,0,768,,65,1,177,{ bonus bMaxSP,100; },{},{}
-5094,Orc_Hero_Helm,Helmet of Orc Hero,5,500000,,900,,5,,0,0xFFFFFFFE,7,2,768,,55,1,178,{ bonus bStr,2; bonus bVit,1; },{},{}
-5095,Orc_Hero_Helm_,Helmet of Orc Hero,5,800000,,1000,,5,,1,0xFFFFFFFE,7,2,768,,55,1,178,{ bonus bStr,2; bonus bVit,1; },{},{}
-5096,Assassin_Mask_,Assassin Mask,5,,10,100,,0,,0,0x00001100,7,2,1,,70,0,180,{},{},{}
-5097,Cone_Hat_,4 Years Anniversary Hat,5,,10,400,,0,,0,0xFFFFFFFF,7,2,256,,0,1,144,{},{},{}
-5098,Tiger_Mask,Tiger Mask,5,,10,400,,2,,0,0xFFFFFFFF,7,2,768,,50,0,181,{ bonus bStr,3; bonus bMaxHP,100; },{},{}
-5099,Cat_Hat,Neko Mimi,5,,10,300,,1,,0,0xFFFFFFFF,7,2,256,,0,1,182,{ bonus bLuk,2; bonus bMdef,10; bonus2 bSubRace,RC_Brute,5; },{},{}
-5100,Sales_Signboard,Sales Banner,5,,10,800,,1,,0,0xFFFFFFFF,7,2,256,,75,1,183,{ bonus bStr,1; bonus bAgi,1; bonus bLuk,1; },{},{}
-5101,Takius_Blindfold,Takius's Blindfold,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,184,{},{},{}
-5102,Round_Eyes,Blank Eyes,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,185,{},{},{}
-5103,Sunflower_Hairpin,Sunflower Hairpin,5,,10,600,,1,,0,0xFFFFFFFE,7,2,256,,30,0,186,{ bonus bAgi,2; bonus bCritical,5; },{},{}
-5104,Dark_Blindfold,Dark Blinder,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,184,{ bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Stun,200; },{},{}
-5105,Hat_Of_Cake_,2nd Anniversary Hat,5,,10,1000,,1,,0,0xFFFFFFFF,7,2,256,,24,1,109,{ bonus bDex,1; bonus bMaxSP,80; },{},{}
-5106,Cone_Hat_INA,2nd Anniversary Hat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,24,1,144,{ bonus bLuk,1; },{},{}
-5107,Well_Baked_Toast,Crunch Toast,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,188,{},{},{}
-5108,Detective_Hat,Renown Detective's Cap,5,,10,350,,3,,1,0xFFFFFFFF,7,2,256,,0,1,189,{},{},{}
-5109,Red_Bonnet,Red Bonnet,5,,10,400,,2,,0,0xFFFFFFFF,7,2,256,,0,1,190,{},{},{}
-5110,Baby_Pacifier,Baby Pacifier,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,191,{},{},{}
-5111,Galapago_Cap,Galapago Cap,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,55,1,192,{ bonus2 bAddMonsterDropItem,605,30; },{},{}
-5112,Super_Novice_Hat,Super Novice Hat,5,8500,,400,,4,,0,0x00000001,7,2,256,,40,1,193,{ bonus bAllStats,1; },{},{}
-5113,Angry_Mouth,Angry Snarl,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,194,{},{},{}
-5114,Fedora,Bucket Hat,5,6000,,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,195,{},{},{}
-5115,Winter_Hat,Winter Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,0,1,196,{ bonus2 bResEff,Eff_Freeze,1000; },{},{}
-5116,Banana_Hat,Banana Hat,5,,10,200,,1,,0,0xFFFFFFFF,7,2,256,,0,1,197,{ bonus3 bAutoSpell,6,3,30; },{},{}
-5117,Mistic_Rose,Mystic Rose,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,198,{ bonus2 bSubRace,RC_Plant,2; },{},{}
-5118,Ear_Of_Puppy,Puppy Headband,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,199,{},{},{}
-5119,Super_Novice_Hat_,Super Novice Hat,5,8500,,400,,4,,1,0x00000001,7,2,256,,40,1,193,{ bonus bAllStats,1; },{},{}
-5120,Fedora_,Bucket Hat,5,6000,,300,,3,,1,0xFFFFFFFF,7,2,256,,0,1,195,{},{},{}
-5121,Zherlthsh_Mask,Zherlthsh Mask,5,,10,400,,3,,0,0xFFFFFFFE,7,2,768,,70,1,200,{ bonus2 bAddRace,RC_DemiHuman,5; bonus2 bSubRace,RC_DemiHuman,5; },{},{}
-5122,Magni_Cap,Magni's Cap,5,,10,1000,,5,,0,0xFFFFFFFE,7,2,256,,65,1,250,{ bonus bStr,2; },{},{}
-5123,Ulle_Cap,Ulle's Cap,5,,10,500,,3,,1,0xFFFFFFFE,7,2,256,,65,1,254,{ bonus bDex,2; bonus bAgi,1; if(isequipped(2353) && bDex>=70) bonus bUseSPrate,-10; },{},{}
-5124,Fricca_Circlet,Frigg's Circlet,5,,10,300,,3,,0,0xFFFFFFFE,7,2,256,,65,1,251,{ bonus bMdef,10; bonus bInt,2; bonus bMaxSP,50; },{},{}
-5125,Kiss_Of_Angel,Angel's Kiss,5,,10,300,,2,,1,0x00000001,7,2,256,,50,1,255,{ bonus bSPrecovRate,3; },{},{}
-5126,Morpheus's_Hood,Morpheus's Hood,5,,10,200,,1,,0,0xFFFFFFFE,7,2,256,,33,1,256,{ bonus bInt,2; if(isequipped(2518,2648,2649)) { bonus bInt,5; bonus bMdef,11; bonus bMaxSPrate,20; bonus bNoCastCancel,0; bonus bCastrate,25; } },{},{}
-5127,Morrigane's_Helm,Morrigane's Helm,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,61,1,257,{ bonus bLuk,2; bonus bBaseAtk,3; if(isequipped(2519,2650,2651)) { bonus bStr,2; bonus bLuk,9; bonus bCritical,13; bonus bBaseAtk,18; bonus bFlee2,13; } },{},{}
-5128,Goibne's_Helmet,Goibne's Helm,5,,10,500,,5,,0,0xFFFFFFFE,7,2,256,,54,1,258,{ bonus bVit,3; bonus bMdef,3; if(isequipped(2354,2419,2520)) { bonus bVit,5; bonus bMaxHPrate,15; bonus bMaxSPrate,5; bonus bDef,5; bonus bMdef,15; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Wind,10; } },{},{}
-5129,Bird_Nest,Bird Nest,5,,10,400,,1,,0,0xFFFFFFFF,7,2,256,,55,1,201,{ bonus bAgi,2; bonus2 bSubRace,RC_Brute,10; },{},{}
-5130,Lion_Mask,Lion Mask,5,,10,700,,0,,0,0x00CFDF80,7,2,768,,75,1,202,{ bonus2 bAddEffWhenHit,Eff_Silence,300; bonus bMdef,1; },{},{}
-5131,Close_Helmet,Close Helmet,5,,10,1200,,8,,0,0x00004082,7,2,769,,75,1,203,{ bonus bVit,3; bonus bMaxHPrate,3; },{},{}
-5132,Angeling_Hat,Angeling Hat,5,,10,700,,2,,0,0xFFFFFFFF,7,2,256,,38,1,204,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
-5133,Sheep_Hat,Sheep Hat,5,,10,150,,1,,0,0x00008110,7,2,256,,0,1,205,{ bonus bShortWeaponDamageReturn,5; },{},{}
-5134,Pumpkin-Head,Pumpkin-Head,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,0,0,206,{},{},{}
-5135,Cyclops_Eye,Cyclop's Eye,5,,10,200,,0,,0,0xFFFFFFFE,7,2,512,,75,0,207,{ bonus bMaxSP,50; },{},{}
-5136,Santa's_Hat_,Louise's Santa Hat,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,20,{ bonus bMdef,1; bonus bLuk,1; },{},{}
-5137,Alice_Doll,Alice Doll,5,,10,500,,0,,1,0xFFFFFFFE,7,2,256,,30,0,208,{ bonus bStr,1; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEff2,Eff_Sleep,10; },{},{}
-5138,Magic_Eyes,Magic Eyes,5,,10,300,,1,,0,0x00810204,7,2,256,,30,1,209,{ bonus bMdef,5; bonus bCastrate,-10; bonus bUseSPrate,20; },{},{}
-5139,Lotus,Lotus,5,,10,200,,0,,0,0xFFFFFFFF,7,2,256,,10,0,210,{ bonus bDex,1; bonus bInt,1; bonus bMdef,5; },{},{}
-5140,Kawaii_Ribbon,Kawaii Ribbon,5,,10,400,,1,,1,0xFFFFFFFF,7,2,256,,10,1,211,{ bonus2 bSubRace,RC_Undead,5; bonus2 bSubRace,RC_Demon,5; },{},{}
-5141,Marionette_Doll,Marionette Doll,5,,10,400,,0,,1,0xFFFFFFFE,7,2,256,,30,1,212,{ bonus bStr,1; },{},{}
-5142,Crescent_Helm,Crescent Helm,5,,10,3000,,8,,0,0x000444A2,7,2,768,,50,1,213,{ bonus bVit,1; bonus2 bSubRace,RC_DemiHuman,5; },{},{}
-5143,Kabuki_Mask,Kabuki Mask,5,,10,1000,,5,,1,0xFFFFFFFE,7,2,769,,10,1,214,{ bonus2 bResEff,Eff_Silence,3000; },{},{}
-5144,Gamble_Hat,Gambler Hat,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,0,1,16,{ bonus bLuk,5; },{},{}
-5145,Carnival_Jester,Carnival Jester,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,89,{},{},{}
-5146,Elephant_Hat,Elephant Hat,5,,10,500,,0,,0,0xFFFFFFFF,7,2,256,,0,1,215,{ bonus bVit,1; bonus2 bSubRace,RC_Brute,7; skill 86,1; },{},{}
-5147,Baseball_Cap,Baseball Cap,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,1,216,{},{},{}
-5148,National_Holiday_Hat,National Holiday Hat,5,,10,500,,0,,0,0xFFFFFFFF,7,2,256,,,1,217,{ bonus bInt,2; },{},{}
-5149,Silver_Tiara,Silver Tiara,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,218,{ bonus bInt,2; },{},{}
-5150,Brazil_Event_Hat,Brazil Event Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,219,{ bonus bSpeedRate,35; },{},{}
-5151,Note_Headphone,Note Headphones,5,,,100,,4,,1,0xFFFFFFFF,7,2,256,,,1,220,{ bonus bMdef,3; bonus2 bResEff,Eff_Stun,1000; bonus2 bResEff,Eff_Freeze,1000; },{},{}
-5152,Phoenix_Crown,Phoenix Crown,5,,,2000,,1,,0,0xFFFFFFFF,7,2,768,,,1,221,{ bonus2 bResEff,Eff_Stun,1000; bonus bInt,1; bonus bMdef,2; },{},{}
-5153,Angeling_Pin,Angeling Pin,5,,,700,,1,,0,0xFFFFFFFF,7,2,256,,,1,222,{ bonus bFlee,5; if (isequipped(2358)==0) end; bonus bLuk,6; bonus bFlee,5; bonus bInt,2; },{},{}
-5154,Father's_Sunglasses,Father's Sunglasses,5,,,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,12,{},{},{}
-5155,Father's_White_Beard,Father's White Beard,5,,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,,25,{ bonus bBaseAtk,20; },{},{}
-5156,Father's_Mask,Father's Mask,5,,,100,,1,,0,0xFFFFFFFF,7,2,1,,,,8,{ bonus bMatkRate,1; },{},{}
-5157,Orc_Helm_,Orc Helm,5,,10,500,,5,,1,0x000654E2,7,2,256,,0,1,86,{},{},{}
-5158,Monk_Hat_,Monk Hat,5,30000,,100,,5,,1,0x00008110,7,2,256,,0,1,35,{ bonus bMdef,3; },{},{}
-5159,Golden_Gear_,Golden Gear,5,,10,900,,5,,1,0xFFFFFFFE,7,2,256,,40,1,30,{ bonus bUnbreakableHelm,0; },{},{}
-5160,Majestic_Goat_,Majestic Goat,5,,10,800,,5,,1,0x006444A2,7,2,256,,0,1,41,{ bonus bStr,1; },{},{}
-5161,Spiky_Band_,Spiky Band,5,,10,1000,,6,,1,0x0066D5F2,7,2,256,,50,1,43,{},{},{}
-5162,Bone_Helm_,Bone Helm,5,,10,800,,7,,1,0x000444A2,7,2,256,,70,1,103,{ bonus2 bSubEle,Ele_Dark,-15; },{},{}
-5163,Corsair_,Corsair,5,,10,500,,5,,1,0xFFFFFFFE,7,2,256,,0,1,105,{ bonus bVit,1; },{},{}
-5164,Tiara_,Tiara,5,,10,400,,4,,1,0xFFFFFFFE,7,0,256,,45,1,19,{ bonus bInt,1; },{},{}
-5165,Crown_,Crown,5,,10,400,,4,,1,0xFFFFFFFE,7,1,256,,45,1,45,{ bonus bInt,1; },{},{}
-5166,Sphinx_Hat_,Sphinx Hat,5,,10,3000,,5,,1,0x00004082,7,2,257,,65,0,137,{ bonus bStr,2; },{},{}
-5167,Munak_Hat_,Munak Hat,5,,10,300,,5,,1,0xFFFFFFFF,7,2,769,,0,0,51,{ bonus2 bSubRace,RC_Undead,10; },{},{}
-5168,Bongun_Hat_,Bongun Hat,5,,10,300,,5,,1,0xFFFFFFFF,7,2,769,,0,0,139,{},{},{}
-5169,Bride_Mask,Bride Mask,5,,10,500,,4,,1,0xFFFFFFFF,7,2,768,,40,1,223,{ if(BaseClass==Job_Taekwon){ bonus bLuk,2; bonus bCritical,5; } },{},{}
-5170,Feather_Beret,Feather Beret,5,,10,600,,1,,0,0xFFFFFFFE,7,2,256,,0,1,224,{ bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; },{},{}
-5171,Valkyrie_Helm,Valkyrie Helm,5,,10,1000,,5,,1,0xFFFFFFFE,2,2,256,,0,1,225,{ bonus bMdef,5; },{},{}
-5172,Beret,Beret,5,,10,700,,0,,0,0xFFFFFFFF,7,2,256,,0,0,226,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
-5173,Judge_Hat,Judge Hat,5,,10,400,,3,,1,0xFFFFFFFF,7,2,256,,60,1,227,{ if(BaseClass==Job_Taekwon){ bonus bAgi,1; bonus bHPrecovRate,3; } },{},{}
-5174,A-yam,A-yam,5,,10,400,,3,,1,0xFFFFFFFF,7,2,256,,60,1,228,{ if(BaseClass==Job_Taekwon){ bonus bInt,1; bonus bSPrecovRate,3; } },{},{}
-5175,Anonymity_Request,Anonymity Request,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,229,{ bonus2 bResEff,Eff_Curse,500; bonus bMdef,1; bonus bHit,-5; },{},{}
-5176,Smiling_Mask,Smiling Mask,5,,10,100,,2,,0,0xFFFFFFFF,7,2,513,,30,0,230,{ if(BaseClass==Job_Taekwon){ bonus bLuk,1; bonus bFlee2,2; } },{},{}
-5177,Lion_Masquerade,Lion Masquerade,5,,10,500,,5,,1,0xFFFFFFFF,7,2,768,,40,1,231,{ if(BaseClass==Job_Taekwon){ bonus bDex,2; bonus bBaseAtk,2*getrefine(); bonus2 bAddEff,Eff_Stun,100; } },{},{}
-5178,Candle,Candle,5,,10,150,,0,,0,0xFFFFFFFF,7,2,256,,0,1,113,{ bonus bAllStats,1; },{},{}
-5179,Golden_Tiara,Golden Tiara,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,232,{ bonus bInt,2; },{},{}
-5180,France_Holiday_Hat,France Holiday Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,217,{ bonus bVit,1; },{},{}
-5181,Helm_of_Darkness,Helm of Darkness,5,,10,500,,3,,1,0x000654E2,7,2,768,,50,1,233,{ bonus bStr,2; },{},{}
-5182,Puppy_Hat,Puppy Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,30,0,234,{ bonus bAgi,1; bonus4 bAutoSpell,75,1,10+20*(readparam(bAgi)>=77),0; },{},{}
-5183,Nest_Hat,Nest Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,10,1,235,{ bonus bDex,1; bonus bAgi,1; bonus2 bResEff,Eff_Stun,1000; },{},{}
-5184,Captain's_Hat,Captain's Hat,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,30,1,236,{ bonus2 bSubEle,Ele_Water,5; },{},{}
-5185,Laurel_Crown,Laurel Crown,5,,10,100,,1,,1,0xFFFFFFFF,7,2,256,,10,1,237,{ bonus bLuk,3; bonus2 bResEff,Eff_Blind,500; bonus2 bResEff,Eff_Curse,500; },{},{}
-5186,Geographer_Decoration,Geographer Decoration,5,,10,500,,1,,0,0xFFFFFFFF,7,2,256,,30,0,238,{ bonus bInt,1; bonus4 bAutoSpellWhenHit,28,1,10,0; },{},{}
-5187,Twin_Ribbon,Twin Ribbon,5,,10,200,,3,,1,0xFFFFFFFF,7,2,256,,30,1,239,{ bonus bMaxSP,30; bonus bMdef,3; },{},{}
-5188,Wandering_Minstrel_Hat,Wandering Minstrel Hat,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,50,1,240,{ bonus bInt,1; bonus bDex,1; },{},{}
-5189,Autumn_Leaves,Autumn Leaves,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,241,{ bonus bMaxHP,40; bonus bMaxSP,40; },{},{}
-5190,Independence_Memorial_Hat,Independence Memorial Hat,5,,10,0,,3,,0,0xFFFFFFFF,7,2,256,,,1,216,{},{},{}
-5191,Black_Ribbon,Black Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,242,{ bonus bMdef,3; },{},{}
-5192,Yellow_Ribbon,Yellow Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,243,{ bonus bMdef,3; },{},{}
-5193,Green_Ribbon,Green Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,244,{ bonus bMdef,3; },{},{}
-5194,Pink_Ribbon,Pink Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,245,{ bonus bMdef,3; },{},{}
-5195,Red_Ribbon,Red Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,246,{ bonus bMdef,3; },{},{}
-5196,Orange_Ribbon,Orange Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,247,{ bonus bMdef,3; },{},{}
-5197,White_Ribbon,White Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,248,{ bonus bMdef,3; },{},{}
-5198,Drooping_Bunny,Drooping Bunny,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,249,{ bonus bDex,1; bonus bFlee,2; },{},{}
-5199,Baseball_Cap_,Baseball Cap,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,,1,216,{},{},{}
-5200,Coppola,Coppola,5,,10,300,,0,,0,0xFFFFFFFF,7,2,256,,,1,252,{},{},{}
-// More Etc Items
-//===================================================================
-7001,Mould_Powder,Mould Powder,3,,340,10,,,,,,,,,,,,,{},{},{}
-7002,Ogre_Tooth,Ogre Tooth,3,,329,10,,,,,,,,,,,,,{},{},{}
-7003,Anolian_Skin,Anolian Skin,3,,464,10,,,,,,,,,,,,,{},{},{}
-7004,Mud_Lump,Mud Lump,3,,438,10,,,,,,,,,,,,,{},{},{}
-7005,Skull,Skull,3,,522,10,,,,,,,,,,,,,{},{},{}
-7006,Wing_Of_Red_Bat,Wing of Red Bat,3,,84,10,,,,,,,,,,,,,{},{},{}
-7007,Claw_Of_Rat,Claw of Rat,3,,374,10,,,,,,,,,,,,,{},{},{}
-7008,Stiff_Horn,Stiff Horn,3,,318,10,,,,,,,,,,,,,{},{},{}
-7009,Glitter_Shell,Glitter Shell,3,,264,10,,,,,,,,,,,,,{},{},{}
-7010,Tail_Of_Steel_Scorpion,Tail of Steel Scorpion,3,,274,10,,,,,,,,,,,,,{},{},{}
-7011,Claw_Of_Monkey,Claw of Monkey,3,,233,10,,,,,,,,,,,,,{},{},{}
-7012,Tough_Scalelike_Stem,Tough Scalelike Stem,3,,206,10,,,,,,,,,,,,,{},{},{}
-7013,Coral_Reef,Coral Reef,3,,386,10,,,,,,,,,,,,,{},{},{}
-7014,Old_Portrait,Old Portrait,3,,750,100,,,,,,,,,,,,,{},{},{}
-7015,Bookclip_In_Memory,Memory Bookmark,3,,1500,20,,,,,,,,,,,,,{},{},{}
-7016,Spoon_Stub,Bent Spoon,3,,1250,20,,,,,,,,,,,,,{},{},{}
-7017,Executioner's_Mitten,Executioner's Mitten,3,,2250,30,,,,,,,,,,,,,{},{},{}
-7018,Young_Twig,Young Twig,3,,25,10,,,,,,,,,,,,,{},{},{}
-7019,Loki's_Whispers,Loki's Whispers,3,,10,10,,,,,,,,,,,,,{},{},{}
-7020,Mother's_Nightmare,Mother's Nightmare,3,,10,10,,,,,,,,,,,,,{},{},{}
-7021,Foolishness_Of_Blind,Foolishness of the Blind,3,,10,10,,,,,,,,,,,,,{},{},{}
-7022,Old_Hilt,Old Hilt,3,,75,30,,,,,,,,,,,,,{},{},{}
-7023,Blade_Lost_In_Darkness,Blade of Darkness,3,,6000,40,,,,,,,,,,,,,{},{},{}
-7024,Bloody_Edge,Bloody Edge,3,,5000,40,,,,,,,,,,,,,{},{},{}
-7025,Lucifer's_Lament,Lucifer's Lament,3,,15000,50,,,,,,,,,,,,,{},{},{}
-7026,Key_Of_Clock_Tower,Key of the Clock Tower,3,,50,30,,,,,,,,,,,,,{},{},{}
-7027,Underground_Key,Key of the Underground,3,,50,30,,,,,,,,,,,,,{},{},{}
-7028,Invite_For_Duel,Invite for Duel,3,,0,10,,,,,,,,,,,,,{},{},{}
-7029,Admission_For_Duel,Admission for Duel,3,,10,10,,,,,,,,,,,,,{},{},{}
-7030,Claw_Of_Desert_Wolf,Claw of Desert Wolf,3,,104,10,,,,,,,,,,,,,{},{},{}
-7031,Old_Frying_Pan,Old Frying Pan,3,,98,10,,,,,,,,,,,,,{},{},{}
-7032,Piece_Of_Egg_Shell,Piece of Egg Shell,3,,84,10,,,,,,,,,,,,,{},{},{}
-7033,Poison_Spore,Poison Spore,3,,57,10,,,,,,,,,,,,,{},{},{}
-7034,Red_Socks_With_Holes,Red Stocking,3,,50,10,,,,,,,,,,,,,{},{},{}
-7035,Matchstick,Matchstick,3,,50,10,,,,,,,,,,,,,{},{},{}
-7036,Fang_Of_Garm,Fang of Garm,3,,50,10,,,,,,,,,,,,,{},{},{}
-7037,Trade_Coupon,Coupon,3,,1000,10,,,,,,,,,,,,,{},{},{}
-7038,Yarn,Yarn,3,,50,10,,,,,,,,,,,,,{},{},{}
-7039,Novice_Nametag,Newbie Tag,3,,10,10,,,,,,,,,,,,,{},{},{}
-7040,Megaphone,Megaphone,3,,10,10,,,,,,,,,,,,,{},{},{}
-7041,Fine_Grit,Fine Grit,3,,60,10,,,,,,,,,,,,,{},{},{}
-7042,Leather_Bag_Of_Infinity,Leather Bag of Infinity,3,,10,10,,,,,,,,,,,,,{},{},{}
-7043,Fine_Sand,Fine Sand,3,,50,10,,,,,,,,,,,,,{},{},{}
-7044,Vigorgra,Vigorgra,3,,10,10,,,,,,,,,,,,,{},{},{}
-7045,Magic_Paint,Magic Paint,3,,10,10,,,,,,,,,,,,,{},{},{}
-7046,Cart_Parts,Cart Parts,3,,10,10,,,,,,,,,,,,,{},{},{}
-7047,Alice's_Apron,Alice's Apron,3,,1212,10,,,,,,,,,,,,,{},{},{}
-7048,Talon_Of_Griffin,Talon of Griffon,3,,50,10,,,,,,,,,,,,,{},{},{}
-7049,Stone,Stone,3,,0,30,,,,,,,,,,,,,{},{},{}
-7050,Cotton_Mat,Cotton Mat,3,,10,10,,,,,,,,,,,,,{},{},{}
-7051,Silk_Mat,Silk Mat,3,,10,10,,,,,,,,,,,,,{},{},{}
-7052,Old_Magazine,Old Papers,3,,10,10,,,,,,,,,,,,,{},{},{}
-7053,Cyfar,Cyfar,3,,386,10,,,,,,,,,,,,,{},{},{}
-7054,Brigan,Brigan,3,,373,10,,,,,,,,,,,,,{},{},{}
-7055,Animal_Pooopoo,Animal Poop,3,,10,50,,,,,,,,,,,,,{},{},{}
-7056,Payroll_Of_Kafra,Payment Statement for Kafra Employee,3,,10,50,,,,,,,,,,,,,{},{},{}
-7057,Gallar_Horn,Gjallar,3,,10,500,,,,,,,,,,,,,{},{},{}
-7058,Gullraifnir,Gleipnir,3,,10,500,,,,,,,,,,,,,{},{},{}
-7059,Cargo_Free_Ticket,Free Ticket for Kafra Storage,3,,10,10,,,,,,,,,,,,,{},{},{}
-7060,Warp_Free_Ticket,Free Ticket for Kafra Transportation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7061,Cart_Free_Ticket,Free Ticket for the Cart Service,3,,10,10,,,,,,,,,,,,,{},{},{}
-7062,Broken_Turtle_Shell,Broken Turtle Shell,3,,10,10,,,,,,,,,,,,,{},{},{}
-7063,Soft_Feather,Soft Feather,3,,140,10,,,,,,,,,,,,,{},{},{}
-7064,Dragon_Fly_Wing,Wing of Dragonfly,3,,260,10,,,,,,,,,,,,,{},{},{}
-7065,Sea_Otter_Leather,Sea-Otter Fur,3,,410,10,,,,,,,,,,,,,{},{},{}
-7066,Ice_Piece,Ice Cubic,3,,330,10,,,,,,,,,,,,,{},{},{}
-7067,Stone_Piece,Stone Fragment,3,,320,10,,,,,,,,,,,,,{},{},{}
-7068,Burn_Tree,Burnt Tree,3,,361,10,,,,,,,,,,,,,{},{},{}
-7069,Broken_Armor_Piece,Destroyed Armor,3,,521,10,,,,,,,,,,,,,{},{},{}
-7070,Broken_Shell,Broken Shell,3,,450,10,,,,,,,,,,,,,{},{},{}
-7071,Tatters_Clothes,Tattered Clothes,3,,320,10,,,,,,,,,,,,,{},{},{}
-7072,Rust_Suriken,Old Shuriken,3,,890,10,,,,,,,,,,,,,{},{},{}
-7073,Jewel_Of_Prayer,Freya's Jewel,3,,10,500,,,,,,,,,,,,,{},{},{}
-7074,Iron_Glove,Thor's Gauntlet,3,,10,500,,,,,,,,,,,,,{},{},{}
-7075,Iron_Maiden,Iron Maiden,3,,10,500,,,,,,,,,,,,,{},{},{}
-7076,Mystery_Wheel,Wheel of the Unknown,3,,10,500,,,,,,,,,,,,,{},{},{}
-7077,Silver_Fancy,Silver Ornament,3,,10,500,,,,,,,,,,,,,{},{},{}
-7078,Anger_Of_Valkurye,Wrath of Valkyrie,3,,10,500,,,,,,,,,,,,,{},{},{}
-7079,Feather_Of_Angel,Feather of Angel Wing,3,,10,500,,,,,,,,,,,,,{},{},{}
-7080,Foot_Step_Of_Cat,Footprints of Cat,3,,10,500,,,,,,,,,,,,,{},{},{}
-7081,Beard_Of_Women,Woman's Moustaches,3,,10,500,,,,,,,,,,,,,{},{},{}
-7082,Root_Of_Stone,Root of Stone,3,,10,500,,,,,,,,,,,,,{},{},{}
-7083,Soul_Of_Fish,Spirit of Fish,3,,10,500,,,,,,,,,,,,,{},{},{}
-7084,Saliva_Of_Bird,Sputum of Bird,3,,10,500,,,,,,,,,,,,,{},{},{}
-7085,Tendon_Of_Bear,Sinew of Bear,3,,10,500,,,,,,,,,,,,,{},{},{}
-7086,Symbol_Of_Sun,Emblem of the Sun God,3,,10,500,,,,,,,,,,,,,{},{},{}
-7087,Breath_Of_Soul,Breath of Soul,3,,10,500,,,,,,,,,,,,,{},{},{}
-7088,Crystal_Of_Snow,Snow Crystal,3,,10,500,,,,,,,,,,,,,{},{},{}
-7089,Indication_Of_Tempest,Omen of Tempest,3,,10,500,,,,,,,,,,,,,{},{},{}
-7090,Slilince_Wave,Ripple,3,,10,500,,,,,,,,,,,,,{},{},{}
-7091,Rough_Billows,Billow,3,,10,500,,,,,,,,,,,,,{},{},{}
-7092,Air_Stream,Drifting Air,3,,10,500,,,,,,,,,,,,,{},{},{}
-7093,Wheel,Cogwheel,3,,756,10,,,,,,,,,,,,,{},{},{}
-7094,Mystery_Piece,Fragment,3,,672,10,,,,,,,,,,,,,{},{},{}
-7095,Broken_Steel_Piece,Metal Fragment,3,,294,10,,,,,,,,,,,,,{},{},{}
-7096,Cold_Magma,Lava,3,,554,10,,,,,,,,,,,,,{},{},{}
-7097,Burning_Heart,Burning Heart,3,,462,10,,,,,,,,,,,,,{},{},{}
-7098,Live_Coal,Live Coal,3,,319,10,,,,,,,,,,,,,{},{},{}
-7099,Old_Magic_Circle,Worn-out Magic Scroll,3,,387,10,,,,,,,,,,,,,{},{},{}
-7100,Sharp_Leaf,Sharp Leaf,3,,403,10,,,,,,,,,,,,,{},{},{}
-7101,Peco_Wing_Feather,Peco Peco Feather,3,,227,10,,,,,,,,,,,,,{},{},{}
-7102,Hideous_Dream,Nightmare,3,,10,10,,,,,,,,,,,,,{},{},{}
-7103,Unknown_Liquid_Bottle,Unknown Liquid Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7104,Fake_Angel_Wing,False Angel Wing,3,,378,10,,,,,,,,,,,,,{},{},{}
-7105,Fake_Angel_Loop,False Heaven Ring,3,,462,10,,,,,,,,,,,,,{},{},{}
-7106,Goat's_Horn,Antelope Horn,3,,336,10,,,,,,,,,,,,,{},{},{}
-7107,Gaoat's_Skin,Antelope Skin,3,,378,10,,,,,,,,,,,,,{},{},{}
-7108,Boroken_Shiled_Piece,Piece of Shield,3,,840,10,,,,,,,,,,,,,{},{},{}
-7109,Shine_Spear_Blade,Shining Spear Blade,3,,10,10,,,,,,,,,,,,,{},{},{}
-7110,Vroken_Sword,Broken Sword,3,,294,10,,,,,,,,,,,,,{},{},{}
-7111,Smooth_Paper,Slick Paper,3,,353,10,,,,,,,,,,,,,{},{},{}
-7112,Fright_Paper_Blade,Sharp Paper,3,,453,10,,,,,,,,,,,,,{},{},{}
-7113,Broken_Pharaoh_Symbol,Broken Pharaoh Emblem,3,,10,10,,,,,,,,,,,,,{},{},{}
-7114,Tutankhamen's_Mask,Masque of Tutankhamen,3,,10,10,,,,,,,,,,,,,{},{},{}
-7115,Harpy's_Feather,Harpy Feather,3,,571,10,,,,,,,,,,,,,{},{},{}
-7116,Harpy's_Claw,Harpy Talon,3,,605,10,,,,,,,,,,,,,{},{},{}
-7117,Rent_Spell_Book,Torn Magic Book,3,,571,10,,,,,,,,,,,,,{},{},{}
-7118,Rent_Scroll,Torn Scroll,3,,681,10,,,,,,,,,,,,,{},{},{}
-7119,Spawns,Bacillus,3,1025,,10,,,,,,,,,,,,,{},{},{}
-7120,Burning_Horse_Shoe,Burning Horseshoe,3,,411,10,,,,,,,,,,,,,{},{},{}
-7121,Honey_Jar,Honey Pot,3,,311,10,,,,,,,,,,,,,{},{},{}
-7122,Hot_Hair,Burning Hair,3,,487,10,,,,,,,,,,,,,{},{},{}
-7123,Dragon's_Skin,Dragon Skin,3,,512,10,,,,,,,,,,,,,{},{},{}
-7124,Sand_Lump,Sand Clump,3,,353,10,,,,,,,,,,,,,{},{},{}
-7125,Scropion's_Nipper,Scorpion Claw,3,,353,10,,,,,,,,,,,,,{},{},{}
-7126,Large_Jellopy,Large Jellopy,3,,420,10,,,,,,,,,,,,,{},{},{}
-7127,Alcol_Create_Book,Alcohol Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7128,FireBottle_Create_Book,Bottle Grenade Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7129,Acid_Create_Book,Acid Bottle Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7130,Plant_Create_Book,Plant Bottle Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7131,Mine_Create_Book,Marine Sphere Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7132,Coating_Create_Book,Glistening Coat Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7133,Slim_Potion_Create_Book,Condensed Potion Creation Guide,3,,120000,10,,,,,,,,,,,,,{},{},{}
-7134,Medicine_Bowl,Medicine Bowl,3,,4,10,,,,,,,,,,,,,{},{},{}
-7135,Fire_Bottle,Fire Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7136,Acid_Bottle,Acid Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7137,MenEater_Plant_Bottle,Plant Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7138,Mini_Bottle,Marine Sphere Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7139,Coating_Bottle,Glistening Coat,3,,10,10,,,,,,,,,,,,,{},{},{}
-7140,Seed_Of_Life,Seed of Life,3,,30000,10,,,,,,,,,,,,,{},{},{}
-7141,Yggdrasilberry_Dew,Morning Dew of Yggdrasil,3,,10000,10,,,,,,,,,,,,,{},{},{}
-7142,Germination_Breed,Embryo,3,,30000,10,,,,,,,,,,,,,{},{},{}
-7143,Life_Force_Pot,Seperation Tubes,2,,2500,10,,,,,0x00040000,7,2,,,,,,{ bpet; },{},{}
-7144,Normal_Potion_Book,Potion Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7145,Rag_T_Shirts,Ragnarok T-Shirt,3,,10,10,,,,,,,,,,,,,{},{},{}
-7146,Vacance_Ticket,Vacation Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7147,Jasmin,Jasmine,3,,10,10,,,,,,,,,,,,,{},{},{}
-7148,Mother_Letter,Mother's Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
-7149,Yellow_Plate,Yellow Plate,3,,110,10,,,,,,,,,,,,,{},{},{}
-7150,Bamboo_Cut,Piece of Bamboo,3,,155,10,,,,,,,,,,,,,{},{},{}
-7151,Oil_Paper,Oil Paper,3,,155,10,,,,,,,,,,,,,{},{},{}
-7152,Glossy_Hair,Glossy Hair,3,,170,10,,,,,,,,,,,,,{},{},{}
-7153,Old_Japaness_Clothes,Worn-out Kimono,3,,295,10,,,,,,,,,,,,,{},{},{}
-7154,Poison_Powder,Poisonous Powder,3,,80,10,,,,,,,,,,,,,{},{},{}
-7155,Poison_Toad's_Skin,Poisonous Toad Skin,3,,140,10,,,,,,,,,,,,,{},{},{}
-7156,Broken_Shuriken,Broken Shuriken,3,,235,10,,,,,,,,,,,,,{},{},{}
-7157,Black_Mask,Dark Mask,3,,157,10,,,,,,,,,,,,,{},{},{}
-7158,Broken_Wine_Vessel,Broken Liquor Jar,3,,80,10,,,,,,,,,,,,,{},{},{}
-7159,Tengu's_Nose,Tengu Nose,3,,200,10,,,,,,,,,,,,,{},{},{}
-7160,Lord's_Passable_Ticket,Feudal Lord Permit,3,,10,10,,,,,,,,,,,,,{},{},{}
-7161,Black_Bear's_Skin,Black Bear Skin,3,,192,10,,,,,,,,,,,,,{},{},{}
-7162,Cloud_Piece,Cloud Crumb,3,,195,10,,,,,,,,,,,,,{},{},{}
-7163,Sharp_Feeler,Hard Feeler,3,,285,10,,,,,,,,,,,,,{},{},{}
-7164,Hard_Peach,Solid_Peach,3,,200,10,,,,,,,,,,,,,{},{},{}
-7165,Limpid_Celestial_Robe,Transparent Celestial Robe,3,,325,10,,,,,,,,,,,,,{},{},{}
-7166,Soft_Silk_Cloth,Soft Silk,3,,600,10,,,,,,,,,,,,,{},{},{}
-7167,Mystery_Iron_Bit,Strange Steel Piece,3,,215,10,,,,,,,,,,,,,{},{},{}
-7168,Great_Wing,Giant Butterfly Wing,3,,307,10,,,,,,,,,,,,,{},{},{}
-7169,Taegeuk_Plate,Ba_Gua,3,,1400,10,,,,,,,,,,,,,{},{},{}
-7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,0xFFFFFFFE,7,1,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
-7171,Leopard_Skin,Leopard Skin,3,,141,10,,,,,,,,,,,,,{},{},{}
-7172,Leopard_Talon,Leopard Claw,3,,145,10,,,,,,,,,,,,,{},{},{}
-7173,BurnBuster_Bag,Bun Buster Bag,3,,10,10,,,,,,,,,,,,,{},{},{}
-7174,Packing_Ribbon,Wrapping Lace,3,,10,10,,,,,,,,,,,,,{},{},{}
-7175,Packing_Paper,Wrapping Paper,3,,10,10,,,,,,,,,,,,,{},{},{}
-7176,XMAS_Coupon,Royal Certificate,3,,10,10,,,,,,,,,,,,,{},{},{}
-7177,Part_Of_Star's_Sob,Crumb of Sobbing Starlight,3,,10,10,,,,,,,,,,,,,{},{},{}
-7178,Star's_Sob,Sobbing Starlight,3,,10,10,,,,,,,,,,,,,{},{},{}
-7179,Donation_Card,Proof of Donation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7180,Introduction_Of_Mr.Han,Hahn Sukbong's Recommendation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7181,Receipt_01,Receipt,3,,10,10,,,,,,,,,,,,,{},{},{}
-7182,Cacao,Cacao,3,,100,20,,,,,,,,,,,,,{},{},{}
-7183,Sister_Letter,Letter from Sister,3,,10,10,,,,,,,,,,,,,{},{},{}
-7184,Piano_Keyboard,Piano Key,3,,10,10,,,,,,,,,,,,,{},{},{}
-7185,Quiz_Ticket,Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7186,Thin_Stem,Thin Trunk,3,,109,10,,,,,,,,,,,,,{},{},{}
-7187,Festival_Mask,Festival Mask,3,,50,10,,,,,,,,,,,,,{},{},{}
-7188,Browny_Root,Brown_Root,3,,280,10,,,,,,,,,,,,,{},{},{}
-7189,Heart_Of_Tree,Wooden Heart,3,,340,10,,,,,,,,,,,,,{},{},{}
-7190,Solid_Peeling,Solid Husk,3,,70,10,,,,,,,,,,,,,{},{},{}
-7191,Lamplight,Lamp,3,,10,10,,,,,,,,,,,,,{},{},{}
-7192,Blade_Of_Pinwheel,Vane,3,,80,10,,,,,,,,,,,,,{},{},{}
-7193,Germinating_Sprout,Sprout,3,,115,10,,,,,,,,,,,,,{},{},{}
-7194,Soft_Leaf,Soft Blade of Grass,3,,200,10,,,,,,,,,,,,,{},{},{}
-7195,Air_Rifle,Slingshot,3,,105,10,,,,,,,,,,,,,{},{},{}
-7196,Shoulder_Protection,Shoulder Protector,3,,115,10,,,,,,,,,,,,,{},{},{}
-7197,Tough_Vines,Tough Vines,3,,250,10,,,,,,,,,,,,,{},{},{}
-7198,Great_Leaf,Huge Leaf,3,,305,10,,,,,,,,,,,,,{},{},{}
-7199,Coupon,Unknown_Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
-7200,Flexible_String,Elastic Band,3,,190,10,,,,,,,,,,,,,{},{},{}
-7201,Log,Log,3,,125,10,,,,,,,,,,,,,{},{},{}
-7202,Beetle_Nipper,Pincher of Beetle,3,,145,10,,,,,,,,,,,,,{},{},{}
-7203,Solid_Twig,Strong Branch,3,,95,10,,,,,,,,,,,,,{},{},{}
-7204,Gunpowder,Gunpowder,3,,10,10,,,,,,,,,,,,,{},{},{}
-7205,Piece_Of_Black_Cloth,Piece of Black Cloth,3,,263,10,,,,,,,,,,,,,{},{},{}
-7206,Black_Kitty_Doll,Black Cat Doll,3,,720,10,,,,,,,,,,,,,{},{},{}
-7207,Old_Manteau,Old Manteau,3,,640,10,,,,,,,,,,,,,{},{},{}
-7208,Rusty_Cleaver,Rusty Kitchen Knife,3,,890,10,,,,,,,,,,,,,{},{},{}
-7209,Dullahan's_Helm,Helm of Dullahan,3,,675,10,,,,,,,,,,,,,{},{},{}
-7210,Dullahan_Armor,Armor Piece of Dullahan,3,,395,10,,,,,,,,,,,,,{},{},{}
-7211,Rojerta_Piece,Fragment of Rossata Stone,3,,1300,10,,,,,,,,,,,,,{},{},{}
-7212,Hanging_Doll,Hung Doll,3,,510,10,,,,,,,,,,,,,{},{},{}
-7213,Needle_Pouch,Needle Packet,3,,416,10,,,,,,,,,,,,,{},{},{}
-7214,Bat_Cage,Bat Cage,3,,440,10,,,,,,,,,,,,,{},{},{}
-7215,Broken_Needle,Broken Needle,3,,345,10,,,,,,,,,,,,,{},{},{}
-7216,Red_Scarf,Red Muffler,3,,330,10,,,,,,,,,,,,,{},{},{}
-7217,Spool,Spool,3,,212,10,,,,,,,,,,,,,{},{},{}
-7218,Rotten_Rope,Decomposed Rope,3,,195,10,,,,,,,,,,,,,{},{},{}
-7219,Striped_Socks,Striped Sock,3,,460,10,,,,,,,,,,,,,{},{},{}
-7220,Ectoplasm,Ectoplasm,3,,166,10,,,,,,,,,,,,,{},{},{}
-7221,Tangled_Chain,Tangled Chains,3,,370,10,,,,,,,,,,,,,{},{},{}
-7222,Tree_Knot,Wooden Gnarl,3,,234,10,,,,,,,,,,,,,{},{},{}
-7223,Distorted_Portrait,Contorted Self-Portrait,3,,1016,10,,,,,,,,,,,,,{},{},{}
-7224,Stone_Of_Intelligence,Stone of Sage,3,,50000,10,,,,,,,,,,,,,{},{},{}
-7225,Pumpkin_Bucket,Pumpkin Lantern,3,,243,10,,,,,,,,,,,,,{},{},{}
-7226,Pill,Pellet,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Hallucination,10000,0; },{},{}
-7227,TCG_Card,TCG Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7228,Gold_Bullion,Gold Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
-7229,Silver_Bullion,Silver Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
-7230,White_Gold_Bullion,Platinum Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
-7231,Gold_Ore,Gold Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
-7232,Silver_Ore,Silver Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
-7233,Mithril_Ore,Mithril Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
-7234,Soul_Of_Guild,Spirit of Guild,3,,10,10,,,,,,,,,,,,,{},{},{}
-7235,Soul_Of_Courage,Spirit of Charge,3,,10,10,,,,,,,,,,,,,{},{},{}
-7236,Soul_Of_Guard,Spirit of Protection,3,,10,10,,,,,,,,,,,,,{},{},{}
-7237,Soul_Of_Partnership,Spirit of Association,3,,10,10,,,,,,,,,,,,,{},{},{}
-7238,Soul_Of_Correspondence,Spirit of Coordination,3,,10,10,,,,,,,,,,,,,{},{},{}
-7239,Soul_Of_Proceeding,Spirit of Advance,3,,10,10,,,,,,,,,,,,,{},{},{}
-7240,Soul_Of_Confidence,Spirit of Trust,3,,10,10,,,,,,,,,,,,,{},{},{}
-7241,Soul_Of_Agreement,Spirit of Union,3,,10,10,,,,,,,,,,,,,{},{},{}
-7242,Soul_Of_Harmony,Spirit of Combination,3,,10,10,,,,,,,,,,,,,{},{},{}
-7243,Soul_Of_Cooperate,Spirit of Cooperation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7244,Soul_Of_Unity,Spirit of Solidarity,3,,10,10,,,,,,,,,,,,,{},{},{}
-7245,Soul_Of_Friendship,Spirit of Friendship,3,,10,10,,,,,,,,,,,,,{},{},{}
-7246,Soul_Of_Peace,Spirit of Peace,3,,10,10,,,,,,,,,,,,,{},{},{}
-7247,Soul_Of_Spirit,Spirit of Determination,3,,10,10,,,,,,,,,,,,,{},{},{}
-7248,Soul_Of_Honor,Spirit of Honor,3,,10,10,,,,,,,,,,,,,{},{},{}
-7249,Soul_Of_Service,Spirit of Service,3,,10,10,,,,,,,,,,,,,{},{},{}
-7250,Soul_Of_Glory,Spirit of Glory,3,,10,10,,,,,,,,,,,,,{},{},{}
-7251,Soul_Of_Victory,Spirit of Victory,3,,10,10,,,,,,,,,,,,,{},{},{}
-7252,Herb_Medicine,Herbal Medicine,3,,10,10,,,,,,,,,,,,,{},{},{}
-7253,Taeguk_Flag,Golden Korean Flag,3,,10,10,,,,,,,,,,,,,{},{},{}
-7254,Digital_Print_Ticket,Digital Picture Printing Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
-7255,China_Marble01,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7256,China_Marble02,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7257,China_Marble03,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7258,China_Marble04,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7259,China_Marble05,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7260,China_Marble06,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7261,China_Marble07,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7262,Fan,Folding Fan of Cat Ghost,3,,233,10,,,,,,,,,,,,,{},{},{}
-7263,Cat_Eyed_Stone,Cat's Eye,3,,477,10,,,,,,,,,,,,,{},{},{}
-7264,Dried_Sand,Dry Sand,3,,161,10,,,,,,,,,,,,,{},{},{}
-7265,Dragon_Horn,Dragon Horn,3,,272,10,,,,,,,,,,,,,{},{},{}
-7266,Dragon_Fang,Denture from Dragon Mask,3,,218,10,,,,,,,,,,,,,{},{},{}
-7267,Tiger_Skin_Panties,Tiger Panty,3,,149,10,,,,,,,,,,,,,{},{},{}
-7268,Little_Blacky_Ghost,Little Ghost Doll,3,,605,10,,,,,,,,,,,,,{},{},{}
-7269,Bib,Pinafore,3,,480,10,,,,,,,,,,,,,{},{},{}
-7270,Milk_Bottle,Nursing_Bottle,3,,550,10,,,,,,,,,,,,,{},{},{}
-7271,Figure,Novice Figure,3,,10,10,,,,,,,,,,,,,{},{},{}
-7272,Meat_Dumpling_Doll,Rice Ball Doll,3,,10,10,,,,,,,,,,,,,{},{},{}
-7273,Golden_Necklace,RWC Necklace,3,,10,10,,,,,,,,,,,,,{},{},{}
-7274,Ancient_Translator,Translated Ancient Language,3,,10,10,,,,,,,,,,,,,{},{},{}
-7275,Ancient_Document,Record of Ancient Language,3,,10,10,,,,,,,,,,,,,{},{},{}
-7276,Picture_Letter,Doodled Message,3,,10,10,,,,,,,,,,,,,{},{},{}
-7277,Munak_Doll,Munak Doll,3,,4450,10,,,,,,,,,,,,,{},{},{}
-7278,Wellbeing_Letter,Letter to Wife,3,,10,10,,,,,,,,,,,,,{},{},{}
-7279,Vita500_Lid,Vita500 Lid,3,,10,10,,,,,,,,,,,,,{},{},{}
-7280,Quiz_Ticket01,1st Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7281,Quiz_Ticket02,2nd Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7282,Quiz_Ticket03,3rd Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7283,Quiz_Ticket04,4th Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7284,Quiz_Ticket05,5th Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
-7285,Thread_Skein,Holy Threads,3,,1,10,,,,,,,,,,,,,{},{},{}
-7286,Chilli,Red Chile,3,,10,10,,,,,,,,,,,,,{},{},{}
-7287,Thread_Skein_,Holier Threads,3,,1,10,,,,,,,,,,,,,{},{},{}
-7288,Thai_Ring,Engagement Ring,3,,10,10,,,,,,,,,,,,,{},{},{}
-7289,Olivine,Peridot,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7290,Phlogopite,Phlogopite,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7291,Agate,Agate,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7292,Muscovite,Muscovite,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7293,Rose_Quartz,Rose Quartz,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7294,Turquoise,Turquoise,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7295,Citrine,Citrin,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7296,Pyroxene,Pyroxene,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7297,Biotite,Biotite,3,,1500,100,,,,,,,,,,,,,{},{},{}
-7298,Leaf_Clothes,Fig Leaf,3,,269,10,,,,,,,,,,,,,{},{},{}
-7299,Bamboo_Basket,Straw Basket,3,,316,10,,,,,,,,,,,,,{},{},{}
-7300,Gemstone,Gemstone,3,,710,10,,,,,,,,,,,,,{},{},{}
-7301,Sword_Accessory,Tassel,3,,399,10,,,,,,,,,,,,,{},{},{}
-7302,KRATHONG,Krathong,3,,10,10,,,,,,,,,,,,,{},{},{}
-7303,Bag_Of_Rice,Straw Rice Bag,3,,0,800,,,,,,,,,,,,,{},{},{}
-7304,Witch's_Spell_Book,Witch's Spell Scroll,3,,0,0,,,,,,,,,,,,,{},{},{}
-7305,Authority_Of_Nine_World,Symbol of the Nine Realms,3,,0,10,,,,,,,,,,,,,{},{},{}
-7306,Fragment_Of_Soul,Piece of Spirit,3,,0,10,,,,,,,,,,,,,{},{},{}
-7307,Whisper_Of_Soul,Spiritual Whispers,3,,0,10,,,,,,,,,,,,,{},{},{}
-7308,Witch's_Potion,Witch's Tonic,3,,0,10,,,,,,,,,,,,,{},{},{}
-7309,Wing_Of_Crow,Crow Wing,3,,0,10,,,,,,,,,,,,,{},{},{}
-7310,Free_Peco_Ticket,Free Ticket for Peco Ride,3,,10,10,,,,,,,,,,,,,{},{},{}
-7311,Free_Flying_Ship_Ticket,Free Ticket for Flyship,3,,10,10,,,,,,,,,,,,,{},{},{}
-7312,Jubilee,Jubilee,3,,16,10,,,,,,,,,,,,,{},{},{}
-7313,Seal_Of_Witch,Witch's Medal,3,,10,10,,,,,,,,,,,,,{},{},{}
-7314,The_Sign,The Sign,3,,0,10,,,,,,,,,,,,,{},{},{}
-7315,Dark_Crystal_Fragment,Dark Crystal Fragment,3,,211,10,,,,,,,,,,,,,{},{},{}
-7316,Long_Limb,Insect Leg,3,,329,10,,,,,,,,,,,,,{},{},{}
-7317,Screw,Rusty Screw,3,,267,10,,,,,,,,,,,,,{},{},{}
-7318,Old_Pick,Old Pick,3,,256,10,,,,,,,,,,,,,{},{},{}
-7319,Old_Steel_Plate,Used Iron Plate,3,,512,10,,,,,,,,,,,,,{},{},{}
-7320,Air_Pollutant,Dust Pollutant,3,,128,10,,,,,,,,,,,,,{},{},{}
-7321,Fragment_Of_Crystal,Crystal Fragment,3,,276,10,,,,,,,,,,,,,{},{},{}
-7322,Poisonous_Gas,Toxic Gas,3,,333,10,,,,,,,,,,,,,{},{},{}
-7323,Battered_Kettle,Battered Kettle,3,,128,10,,,,,,,,,,,,,{},{},{}
-7325,Tube,Flexible Tube,3,,51,10,,,,,,,,,,,,,{},{},{}
-7326,Fluorescent_Liquid,Fluorescent Liquid,3,,356,10,,,,,,,,,,,,,{},{},{}
-7327,Headlamp,Flashlight,3,,512,10,,,,,,,,,,,,,{},{},{}
-7328,Legendary_Scroll,Legend of Songkran,3,,10,10,,,,,,,,,,,,,{},{},{}
-7329,Old_Copper_Key,Old Bronze Key,3,,10,10,,,,,,,,,,,,,{},{},{}
-7330,Holy_Marble,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
-7331,Flower_Of_Heaven,Heaven Flower,3,,10,10,,,,,,,,,,,,,{},{},{}
-7332,Slate,Complete Tablet,3,,0,0,,,,,,,,,,,,,{},{},{}
-7333,Piece_Of_Slate_1,Prontera Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
-7334,Piece_Of_Slate_2,Payon Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
-7335,Piece_Of_Slate_3,Morocc Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
-7336,Piece_Of_Slate_4,Geffen Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
-7337,Eye_Of_Hellion,Eye of Hellion,3,,0,0,,,,,,,,,,,,,{},{},{}
-7338,RO_Transportation_Card,One-way Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7339,RO_Transportation_Card_,Commemorative Travel Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7340,Will_Of_Darkness,Will of the Darkness,3,,367,50,,,,,,,,,,,,,{},{},{}
-7341,Worn_Out_Pendant,Old Pendant,3,,10,0,,,,,,,,,,,,,{},{},{}
-7342,File01,File Folder,3,,10,0,,,,,,,,,,,,,{},{},{}
-7343,File02,Sealed File Folder,3,,10,0,,,,,,,,,,,,,{},{},{}
-7344,File03,Shinokas Case File,3,,10,0,,,,,,,,,,,,,{},{},{}
-7345,Armlet_Of_Prisoner,Handcuffs,3,,362,10,,,,,,,,,,,,,{},{},{}
-7346,Pile_Of_Ymir_Heart,Ymir's Heart Piece,3,,10,0,,,,,,,,,,,,,{},{},{}
-7347,Lab_Staff_Record,Research Chart,3,,420,10,,,,,,,,,,,,,{},{},{}
-7348,Indication_Of_Member01,Membership Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7349,Indication_Of_Member02,Archive Permit,3,,10,0,,,,,,,,,,,,,{},{},{}
-7350,Pass,Pass,3,,10,10,,,,,,,,,,,,,{},{},{}
-7351,Friend's_Diary,Friend's Diary,3,,10,0,,,,,,,,,,,,,{},{},{}
-7352,Transparent_Plate01,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
-7353,Transparent_Plate02,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
-7354,Transparent_Plate03,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
-7355,Transparent_Plate04,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
-7356,Piece_Of_Crest1,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
-7357,Piece_Of_Crest2,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
-7358,Piece_Of_Crest3,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
-7359,Piece_Of_Crest4,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
-7360,RO_Festival_Ticket,RO Festival Invitation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7361,Lotto01,Lotto Ball 01,3,,10,10,,,,,,,,,,,,,{},{},{}
-7362,Lotto02,Lotto Ball 02,3,,10,10,,,,,,,,,,,,,{},{},{}
-7363,Lotto03,Lotto Ball 03,3,,10,10,,,,,,,,,,,,,{},{},{}
-7364,Lotto04,Lotto Ball 04,3,,10,10,,,,,,,,,,,,,{},{},{}
-7365,Lotto05,Lotto Ball 05,3,,10,10,,,,,,,,,,,,,{},{},{}
-7366,Lotto06,Lotto Ball 06,3,,10,10,,,,,,,,,,,,,{},{},{}
-7367,Lotto07,Lotto Ball 07,3,,10,10,,,,,,,,,,,,,{},{},{}
-7368,Lotto08,Lotto Ball 08,3,,10,10,,,,,,,,,,,,,{},{},{}
-7369,Lotto09,Lotto Ball 09,3,,10,10,,,,,,,,,,,,,{},{},{}
-7370,Lotto10,Lotto Ball 10,3,,10,10,,,,,,,,,,,,,{},{},{}
-7371,Lotto11,Lotto Ball 11,3,,10,10,,,,,,,,,,,,,{},{},{}
-7372,Lotto12,Lotto Ball 12,3,,10,10,,,,,,,,,,,,,{},{},{}
-7373,Lotto13,Lotto Ball 13,3,,10,10,,,,,,,,,,,,,{},{},{}
-7374,Lotto14,Lotto Ball 14,3,,10,10,,,,,,,,,,,,,{},{},{}
-7375,Lotto15,Lotto Ball 15,3,,10,10,,,,,,,,,,,,,{},{},{}
-7376,Lotto16,Lotto Ball 16,3,,10,10,,,,,,,,,,,,,{},{},{}
-7377,Lotto17,Lotto Ball 17,3,,10,10,,,,,,,,,,,,,{},{},{}
-7378,Lotto18,Lotto Ball 18,3,,10,10,,,,,,,,,,,,,{},{},{}
-7379,Lotto19,Lotto Ball 19,3,,10,10,,,,,,,,,,,,,{},{},{}
-7380,Lotto20,Lotto Ball 20,3,,10,10,,,,,,,,,,,,,{},{},{}
-7381,Lotto21,Lotto Ball 21,3,,10,10,,,,,,,,,,,,,{},{},{}
-7382,Lotto22,Lotto Ball 22,3,,10,10,,,,,,,,,,,,,{},{},{}
-7383,Lotto23,Lotto Ball 23,3,,10,10,,,,,,,,,,,,,{},{},{}
-7384,Lotto24,Lotto Ball 24,3,,10,10,,,,,,,,,,,,,{},{},{}
-7385,Lotto25,Lotto Ball 25,3,,10,10,,,,,,,,,,,,,{},{},{}
-7386,Lotto26,Lotto Ball 26,3,,10,10,,,,,,,,,,,,,{},{},{}
-7387,Lotto27,Lotto Ball 27,3,,10,10,,,,,,,,,,,,,{},{},{}
-7388,Lotto28,Lotto Ball 28,3,,10,10,,,,,,,,,,,,,{},{},{}
-7389,Lotto29,Lotto Ball 29,3,,10,10,,,,,,,,,,,,,{},{},{}
-7390,Lotto30,Lotto Ball 30,3,,10,10,,,,,,,,,,,,,{},{},{}
-7391,Lotto31,Lotto Ball 31,3,,10,10,,,,,,,,,,,,,{},{},{}
-7392,Lotto32,Lotto Ball 32,3,,10,10,,,,,,,,,,,,,{},{},{}
-7393,Lotto33,Lotto Ball 33,3,,10,10,,,,,,,,,,,,,{},{},{}
-7394,Lotto34,Lotto Ball 34,3,,10,10,,,,,,,,,,,,,{},{},{}
-7395,Lotto35,Lotto Ball 35,3,,10,10,,,,,,,,,,,,,{},{},{}
-7396,Lotto36,Lotto Ball 36,3,,10,10,,,,,,,,,,,,,{},{},{}
-7397,Lotto37,Lotto Ball 37,3,,10,10,,,,,,,,,,,,,{},{},{}
-7398,Lotto38,Lotto Ball 38,3,,10,10,,,,,,,,,,,,,{},{},{}
-7399,Piece_Of_Clue01,Selamat,3,,10,10,,,,,,,,,,,,,{},{},{}
-7400,Piece_Of_Clue02,Hari,3,,10,10,,,,,,,,,,,,,{},{},{}
-7401,Piece_Of_Clue03,Kemerdekaan,3,,10,10,,,,,,,,,,,,,{},{},{}
-7402,Piece_Of_Clue04,Republik,3,,10,10,,,,,,,,,,,,,{},{},{}
-7403,Piece_Of_Clue05,Indonesia,3,,10,10,,,,,,,,,,,,,{},{},{}
-7404,Piece_Of_Clue06,Ke-60,3,,10,10,,,,,,,,,,,,,{},{},{}
-7405,Crushed_Can,Crushed Can,3,,1,10,,,,,,,,,,,,,{},{},{}
-7406,Moon_Cake1,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7407,Moon_Cake2,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7408,Moon_Cake3,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7409,Moon_Cake4,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7410,Moon_Cake5,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7411,Moon_Cake6,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7412,Moon_Cake7,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7413,Moon_Cake8,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7414,Moon_Cake9,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
-7415,Stone_Of_Summons,Summoning Stone,3,,10,10,,,,,,,,,,,,,{},{},{}
-7416,Letter_Of_Recommendation,Letter of Recommentation,3,,10,10,,,,,,,,,,,,,{},{},{}
-7417,Mission_ScrollA,Written Request (A),3,,10,10,,,,,,,,,,,,,{},{},{}
-7418,Mission_ScrollB,Written Request (B),3,,10,10,,,,,,,,,,,,,{},{},{}
-7419,Embryo_Create_Book,Embryo Creation Guide,3,,10,10,,,,,,,,,,,,,{},{},{}
-7420,Skull_,Skull,3,,0,10,,,,,,,,,,,,,{},{},{}
-7421,Red_Key,Red Key,3,,10,0,,,,,,,,,,,,,{},{},{}
-7422,Yellow_Key,Yellow Key,3,,10,0,,,,,,,,,,,,,{},{},{}
-7423,Blue_Key,Blue Key,3,,10,0,,,,,,,,,,,,,{},{},{}
-7424,Green_Key,Green Key,3,,10,0,,,,,,,,,,,,,{},{},{}
-7425,Black_Key,Black Key,3,,10,0,,,,,,,,,,,,,{},{},{}
-7426,Red_Magic_Stone,Red Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
-7427,Yellow_Magic_Stone,Yellow Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
-7428,Blue_Magic_Stone,Blue Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
-7429,Green_Magic_Stone,Green Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
-7430,Black_Magic_Stone,Black Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
-7431,Books,Pile of Books,3,,10,10,,,,,,,,,,,,,{},{},{}
-7432,Leather_Pouch,Leather Pouch,3,,10,10,,,,,,,,,,,,,{},{},{}
-7433,Empty_Scroll,Blank Scroll,3,,2000,10,,,,,,,,,,,,,{},{},{}
-7434,Elemental_Create_Book,Elemental Potion Creation Guide,3,,10,10,,,,,,,,,,,,,{},{},{}
-7435,Golden_Accessory,Golden Ornament,3,,953,10,,,,,,,,,,,,,{},{},{}
-7436,Fragment_of_Agony,Fragment of Agony,3,,753,10,,,,,,,,,,,,,{},{},{}
-7437,Fragment_of_Sorrow,Fragment of Sorrow,3,,753,10,,,,,,,,,,,,,{},{},{}
-7438,Fragment_of_Hatred,Fragment of Hatred,3,,753,10,,,,,,,,,,,,,{},{},{}
-7439,Fragment_of_Despair,Fragment of Despair,3,,753,10,,,,,,,,,,,,,{},{},{}
-7440,Red_Feather,Red tinted Feather,3,,667,10,,,,,,,,,,,,,{},{},{}
-7441,Blue_Feather,Blue tinted Feather,3,,704,10,,,,,,,,,,,,,{},{},{}
-7442,Cursed_Seal,Cursed Seal,3,,666,10,,,,,,,,,,,,,{},{},{}
-7443,Head_of_3Head_Dragon,Three-Headed_Dragon's_Head,3,,478,10,,,,,,,,,,,,,{},{},{}
-7444,Treasure_Box,Treasure Box,3,,150000,10,,,,,,,,,,,,,{},{},{}
-7445,Green_Orb,Green Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
-7446,Blue_Orb,Blue Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
-7447,Red_Orb,Red Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
-7448,Yellow_Orb,Yellow Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
-7449,Bloodstained_Page,Bloody Page,3,,340,10,,,,,,,,,,,,,{},{},{}
-7450,Bone_Armor_Piece,Skeletal Armor Piece,3,,1025,10,,,,,,,,,,,,,{},{},{}
-7451,Scale_of_Fire_Dragon,Fire Dragon Scale,3,,926,10,,,,,,,,,,,,,{},{},{}
-7452,Yellow_Spice,Yellow Spice,3,1000,,10,,,,,,,,,,,,,{},{},{}
-7453,Sweet_Sauce,Sweet Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
-7454,Plain_Sauce,Savory Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
-7455,Hot_Sauce,Spicy Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
-7456,Red_Spice,Red Spice,3,1000,,10,,,,,,,,,,,,,{},{},{}
-7457,Cooking_Oil,Cooking Oil,3,500,,10,,,,,,,,,,,,,{},{},{}
-7458,Fortune_Horn,Fortune Horn,3,,10,10,,,,,,,,,,,,,{},{},{}
-7459,Ramadan_,Ramadan,3,,10,10,,,,,,,,,,,,,{},{},{}
-7460,Nifl_Express_Ticket,Niflheim Express Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7461,Blue_A_Card,Blue A Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7462,Blue_E_Card,Blue E Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7463,Blue_F_Card,Blue F Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7464,Blue_H_Card,Blue H Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7465,Blue_L_Card,Blue L Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7466,Blue_N_Card,Blue N Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7467,Blue_O_Card,Blue O Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7468,Blue_P_Card,Blue P Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7469,Blue_U_Card,Blue U Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7470,Blue_W_Card,Blue W Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7471,Blue_Y_Card,Blue Y Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7472,Cookbook01,Level 1 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7473,Cookbook02,Level 2 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7474,Cookbook03,Level 3 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7475,Cookbook04,Level 4 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7476,Cookbook05,Level 5 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7477,Cookbook06,Level 6 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7478,Cookbook07,Level 7 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7479,Cookbook08,Level 8 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7480,Cookbook09,Level 9 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7481,Cookbook10,Level 10 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
-7482,Pot,Pot,3,200,,10,,,,,,,,,,,,,{},{},{}
-7483,Key_of_the_Seal,Key of the Seal,3,,,10,,,,,,,,,,,,,{},{},{}
-7484,Warrior_Symbol,Symbol of a Brave Warrior,3,,10,10,,,,,,0,2,,,,,,{},{},{}
-7485,2nd_Floor_Pass,Cloud General,3,,10,10,,,,,,0,2,,,,,,{},{},{}
-7486,3rd_Floor_Pass,Wind General,3,,10,10,,,,,,0,2,,,,,,{},{},{}
-7487,Pub_Liquor,Pub Liquor,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7488,Delivery_Box,Delivery Box,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7489,Outhouse_Spare_Key,Spare Key to the Outhouse,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7490,Letter_to_Elie,Letter to Elie,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7491,Iron_Box,Iron_Box,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7492,Yellow_Keycard,Yellow Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7493,Golden_Key,Golden Key,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7494,Exquisite_Button,Exquisite Button,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7495,Blue_Keycard,Blue Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7496,Red_Keycard,Red_Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7497,Piece_of_Metal,Piece of Metal,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7498,Losimier's_House_Key,Key to Losimier's_House,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7499,Portrait_of_a_Family,Portrait of a Family,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7500,Portrait_of_a_Lady,Portrait of a Lady,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7501,K.H's_Letter,K.H's Letter,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7502,James's_Memo,James's Memo,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7503,Portrait_of_a_Guy,Portrait of a Guy,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7504,Power_Source,Power Source,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7505,Toy_Key,Toy Key,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7506,Black_Keycard,Black Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7507,Hard_Piece_of_Steel,Hard Piece of Steel,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7508,Elisia's_Ring,Elisia's Ring,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7509,Gorgeous_Keycard,Gorgeous Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7510,Valhalla's_Flower,Valhalla's Flower,3,,50000,10,,,,,,0,2,,,,,,{},{},{}
-7511,Darkness_Rune,Darkness Rune,3,1263,,10,,,,,,0,2,,,,,,{},{},{}
-7512,Burnt_Pieces,Burnt Pieces,3,,400,10,,,,,,0,2,,,,,,{},{},{}
-7513,Pocket_Watch,Pocket Watch,3,,855,10,,,,,,0,2,,,,,,{},{},{}
-7514,Monster_Ticket,Monster Ticket,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7515,Interesting_Medal,Interesting Medal,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7516,Green_Keycard,Green Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
-7517,Golden_Coin,Golden Coin,3,,10,100,,,,,,0,2,,,,,,{},{},{}
-7518,Women's_Medal,Women's Medal,3,,10,10,,,,,,0,2,,,,,,{},{},{}
-7519,Handsel,Handsel,3,,10,10,,,,,,,,,,,,,{},{},{}
-7520,Please_Be_Rich,Please Be Rich,3,,10,10,,,,,,,,,,,,,{},{},{}
-7521,Burning_Stone,Burning Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
-7522,Freezing_Stone,Freezing Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
-7523,Windchime_Stone,Windchime Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
-7524,Fang,Fang,3,300,,20,,,,,,7,2,,,,,,{},{},{}
-7525,Summer_Festival_Ticket,Summer Festival Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7526,Application,Application,3,,10,0,,,,,,,,,,,,,{},{},{}
-7527,Book_About_True_Life,Book About True Life,3,,10,100,,,,,,,,,,,,,{},{},{}
-7528,Lottery_Ticket,Lottery Ticket,3,,10,0,,,,,,,,,,,,,{},{},{}
-7529,Stolen_Sandal,Stolen Sandal,3,,10,0,,,,,,,,,,,,,{},{},{}
-7530,Amatsu_Travel_Brochure,Amatsu Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
-7531,Gonryun_Travel_Brochure,Gonryun Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
-7532,Louyang_Travel_Brochure,Louyang Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
-7533,Ayothaya_Travel_Brochure,Ayothaya Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
-7534,Amatsu_Photo_Album,Amatsu Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
-7535,Gonryun_Photo_Album,Gonryun Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
-7536,Louyang_Photo_Album,Louyang Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
-7537,Ayothaya_Photo_Album,Ayothaya Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
-7538,Sand_For_Work,Sand For Work,3,,10,0,,,,,,,,,,,,,{},{},{}
-7539,Poring_Coin,Poring Coin,3,,10,0,,,,,,,,,,,,,{},{},{}
-7540,Lotto_Ball_39,Lotto Ball 39,3,,10,10,,,,,,,,,,,,,{},{},{}
-7541,Lotto_Ball_40,Lotto Ball 40,3,,10,10,,,,,,,,,,,,,{},{},{}
-7542,Lotto_Ball_41,Lotto Ball 41,3,,10,10,,,,,,,,,,,,,{},{},{}
-7543,Lotto_Ball_42,Lotto Ball 42,3,,10,10,,,,,,,,,,,,,{},{},{}
-7544,Lotto_Ball_43,Lotto Ball 43,3,,10,10,,,,,,,,,,,,,{},{},{}
-7545,Lotto_Ball_44,Lotto Ball 44,3,,10,10,,,,,,,,,,,,,{},{},{}
-7546,Lotto_Ball_45,Lotto Ball 45,3,,10,10,,,,,,,,,,,,,{},{},{}
-7547,Soccer_Ball,Soccer Ball,3,,10,10,,,,,,,,,,,,,{},{},{}
-7548,Soccer_Shoes,Soccer Shoes,3,,10,10,,,,,,,,,,,,,{},{},{}
-7549,Brazilian_Flag,Brazilian Flag,3,,10,10,,,,,,,,,,,,,{},{},{}
-7550,6.13_Ticket,6.13 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7551,6.18_Ticket,6.18 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7552,6.22_Ticket,6.22 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7553,Lotus_,Lotus,3,,10,10,,,,,,,,,,,,,{},{},{}
-7554,Striped_Candle,Striped Candle,3,,10,10,,,,,,,,,,,,,{},{},{}
-7555,Green_Incense,Green Incense,3,,10,10,,,,,,,,,,,,,{},{},{}
-7556,Longing_Heart,Longing Heart,3,,10,10,,,,,,,,,,,,,{},{},{}
-7557,Invitation_Letter,Invitation Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
-7558,Invitation_Ticket,Invitation Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7559,Key_to_the_Secret_Garden,Key to the Secret Garden,3,,10,10,,,,,,,,,,,,,{},{},{}
-7560,Longing_Heart_,Longing Heart,3,,10,10,,,,,,,,,,,,,{},{},{}
-7561,Ice_Heart,Ice Heart,3,,303,10,,,,,,,,,,,,,{},{},{}
-7562,Ice_Scale,Ice Scale,3,,1510,10,,,,,,,,,,,,,{},{},{}
-7563,Bloody_Rune,Bloody Rune,3,,1008,10,,,,,,,,,,,,,{},{},{}
-7564,Rotten_Meat,Rotten Meat,3,,51,10,,,,,,,,,,,,,{},{},{}
-7565,Sticky_Poison,Sticky Poison,3,,175,10,,,,,,,,,,,,,{},{},{}
-7566,Will_of_Red_Darkness,Will of Red Darkness,3,,765,10,,,,,,,,,,,,,{},{},{}
-7567,Suspicious_Hat,Suspicious Hat,3,,645,10,,,,,,,,,,,,,{},{},{}
-7568,White_Mask,White Mask,3,,530,10,,,,,,,,,,,,,{},{},{}
-7569,Hammer_of_Wind,Hammer of Wind,3,,10,0,,,,,,,,,,,,,{},{},{}
-7570,Temple_Lottery_Ticket,Temple Lottery Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
-7571,Blue's_Diary,Blue's Diary,3,,10,0,,,,,,,,,,,,,{},{},{}
-7572,Gray_Necklace,Gray Necklace,3,,10,0,,,,,,,,,,,,,{},{},{}
-7573,Shining_Necklace,Shining Necklace,3,,10,0,,,,,,,,,,,,,{},{},{}
-7574,Ice_Powder,Ice Powder,3,,10,0,,,,,,,,,,,,,{},{},{}
-7575,Red-coloured_Gem,Red-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
-7576,Blue-coloured_Gem,Blue-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
-7577,Yellow-coloured_Gem,Yellow-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
-7578,Countermagic_Crystal,Countermagic Crystal,3,,10,10,,,,,,,,,,,,,{},{},{}
-7579,Silk_Handkerchief_of_Zhi_Nu,Silk Handkerchief of Zhi Nu,3,,10,10,,,,,,,,,,,,,{},{},{}
-7581,Celebration_Document,Celebration Document,3,,10,10,,,,,,,,,,,,,{},{},{}
-7582,Jewel_of_Destruction,Jewel of Destruction,3,,10,10,,,,,,,,,,,,,{},{},{}
-7583,Evil_Mind,Evil Mind,3,,10,10,,,,,,,,,,,,,{},{},{}
-7584,Guard's_First_Proof,Guard's First Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
-7585,Guard's_Second_Proof,Guard's Second Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
-7586,Guard's_Third_Proof,Guard's Third Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
-7587,Guard's_Fourth_Proof,Guard's Fourth Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
-7588,IPOD_Coupon,IPOD Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
-7589,Lettered_Moon_Snack_01,Lettered Moon Snack 01,3,,10,10,,,,,,,,,,,,,{},{},{}
-7590,Lettered_Moon_Snack_02,Lettered Moon Snack 02,3,,10,10,,,,,,,,,,,,,{},{},{}
-7591,Lettered_Moon_Snack_03,Lettered Moon Snack 03,3,,10,10,,,,,,,,,,,,,{},{},{}
-7592,Lettered_Moon_Snack_04,Lettered Moon Snack 04,3,,10,10,,,,,,,,,,,,,{},{},{}
-7593,Lettered_Moon_Snack_05,Lettered Moon Snack 05,3,,10,10,,,,,,,,,,,,,{},{},{}
-7594,Sonia's_Letter,Sonia's Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
-7595,Special_Sword,Special Sword,3,,10,10,,,,,,,,,,,,,{},{},{}
-7596,Special_Shield,Special Shield,3,,10,10,,,,,,,,,,,,,{},{},{}
-7597,Magic_Stone,Magic Stone,3,,10,10,,,,,,,,,,,,,{},{},{}
-7598,Blue_I_Card,Blue I Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7599,Blue_D_Card,Blue D Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7600,Blue_K_Card,Blue K Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7601,Blue_S_Card,Blue S Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-7602,Blue_R_Card,Blue R Card,3,,10,10,,,,,,,,,,,,,{},{},{}
-// Pet Eggs
-//===================================================================
-9001,Poring_Egg,Poring Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9002,Drops_Egg,Drops Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9003,Poporing_Egg,Poporing Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9004,Lunatic_Egg,Lunatic Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9005,Picky_Egg,Picky Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9006,Chonchon_Egg,Chonchon Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9007,Steel_Chonchon_Egg,Steel Chonchon Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9008,Hunter_Fly_Egg,Hunter Fly Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9009,Savage_Bebe_Egg,Savage Babe Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9010,Baby_Desert_Wolf_Egg,Baby Desert Wolf Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9011,Rocker_Egg,Rocker Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9012,Spore_Egg,Spore Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9013,Poison_Spore_Egg,Poison Spore Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9014,PecoPeco_Egg,Peco_Peco Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9015,Smokie_Egg,Smokie Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9016,Yoyo_Egg,Yoyo Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9017,Orc_Warrior_Egg,Orc Warrior Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9018,Munak_Egg,Munak Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9019,Dokkaebi_Egg,Dokebi Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9020,Sohee_Egg,Sohee Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9021,Isis_Egg,Isis Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9022,Green_Petite_Egg,Green Petite Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9023,Deviruchi_Egg,Deviruchi Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9024,Bapho_Jr._Egg,Bapho Jr. Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9025,Bongun_Egg,Bongun Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9026,Zherlthsh_Egg,Zherlthsh Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-9027,Alice_Egg,Alice Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
-// Pet Accessories
-//===================================================================
-10001,Skull_Helm,Skull Helm,8,,10,0,,,,,,,,,,,,,{},{},{}
-10002,Monster_Oxygen_Mask,Monster Oxygen Mask,8,,10,0,,,,,,,,,,,,,{},{},{}
-10003,Transparent_Headgear,Transparent Headgear,8,,10,0,,,,,,,,,,,,,{},{},{}
-10004,Pacifier,Pacifier,8,,10,0,,,,,,,,,,,,,{},{},{}
-10005,Wig,Wig,8,,10,0,,,,,,,,,,,,,{},{},{}
-10006,Queen's_Hair_Ornament,Queen's Hair Ornament,8,,10,0,,,,,,,,,,,,,{},{},{}
-10007,Silk_Ribbon,Silk Ribbon,8,,10,0,,,,,,,,,,,,,{},{},{}
-10008,Punisher,Punisher,8,,10,0,,,,,,,,,,,,,{},{},{}
-10009,Wild_Flower,Wild Flower,8,,10,0,,,,,,,,,,,,,{},{},{}
-10010,Battered_Pot,Battered Pot,8,,10,0,,,,,,,,,,,,,{},{},{}
-10011,Stellar_Hairpin,Stellar Hairpin,8,,10,0,,,,,,,,,,,,,{},{},{}
-10012,Tiny_Egg_Shell,Tiny Egg Shell,8,,10,0,,,,,,,,,,,,,{},{},{}
-10013,Backpack,Backpack,8,1500,,0,,,,,,,,,,,,,{},{},{}
-10014,Rocker_Glasses,Rocker Glasses,8,2000,,0,,,,,,,,,,,,,{},{},{}
-10015,Green_Lace,Green Lace,8,,10,0,,,,,,,,,,,,,{},{},{}
-10016,Golden_Bell,Golden Bell,8,,10,0,,,,,,,,,,,,,{},{},{}
-10017,Bark_Shorts,Bark Shorts,8,,10,0,,,,,,,,,,,,,{},{},{}
-10018,Monkey_Circlet,Monkey Circlet,8,,10,0,,,,,,,,,,,,,{},{},{}
-10019,Red_Muffler,Red Scarf,8,,10,0,,,,,,,,,,,,,{},{},{}
-10020,Sword_Of_Grave_Keeper,Grave Keeper's Sword,8,,10,0,,,,,,,,,,,,,{},{},{}
-// History Books
-//===================================================================
-11000,Prontera_Book_01,History book of Prontera,3,,10,0,,,,,,,,,,,,,{},{},{}
-// More Usable Items
-//===================================================================
-// Scrolls
-12000,Cold_Scroll_2_5,Level 5 Frost Diver,11,700,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 15,5,"Frost Diver Level 5"; },{},{}
-12001,Holy_Scroll_1_3,Level 3 Heal,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 28,3,"Heal Level 3"; },{},{}
-12002,Holy_Scroll_1_5,Level 5 Heal,11,2000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 28,5,"Heal Level 5"; },{},{}
-12003,Holy_Scroll_2_1,Level 1 Teleport,11,100,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,1,"Teleport Level 1"; },{},{}
-// Arrow Quivers
-12004,Arrow_Container,Quiver,2,500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1750,500; },{},{}
-12005,Iron_Arrow_Container,Iron Arrow Quiver,2,1000,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1770,500; },{},{}
-12006,Steel_Arrow_Container,Steel Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1753,500; },{},{}
-12007,Ori_Arrow_Container,Oridecon Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1765,500; },{},{}
-12008,Fire_Arrow_Container,Fire Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1752,500; },{},{}
-12009,Silver_Arrow_Container,Silver Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1751,500; },{},{}
-12010,Wind_Arrow_Container,Wind Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1755,500; },{},{}
-12011,Stone_Arrow_Container,Stone Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1756,500; },{},{}
-12012,Crystal_Arrow_Container,Crystal Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1754,500; },{},{}
-12013,Shadow_Arrow_Container,Shadow Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1767,500; },{},{}
-12014,Imma_Arrow_Container,Immaterial Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1757,500; },{},{}
-12015,Rusty_Arrow_Container,Rusty Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1762,500; },{},{}
-// Speed Potions
-12016,Speed_Up_Potion,Speed Potion,0,1000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ specialeffect 507; sc_start SC_SpeedUp1,5000,0; },{},{}
-12017,Slow_Down_Potion,Slow Potion,0,1000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12018,Fire_Cracker,Firecracker,2,100,1,20,,,,,0xFFFFFFFF,7,2,,,,,,{ misceffect(256); },{},{}
-12019,Holy_Egg,Holy Egg,2,,10,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 54,2,"Resurrection"; },{},{}
-12020,Water_Of_Darkness,Cursed_Water,0,,1,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_SHADOWWEAPON, 1200000, 1; },{},{}
-12021,Pork_Belly,Pork,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,99),0; },{},{}
-12022,Spareribs,Galbi,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,99),0; },{},{}
-12023,Giftbox_China,Wrapped Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
-12024,Red_Pouch_Of_Surprise,Red Pouch,2,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12025,Egg_Boy,Dano Festival Egg,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12026,Egg_Girl,Dano Festival Egg,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-// Effect Boxes
-12027,Giggling_Box,Giggling Box,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 9,0; if(rand(100)<30) sc_start SC_Curse,30000,0; },{},{}
-12028,Box_Of_Thunder,Box of Thunder,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_SpeedUp1,20000,0; },{},{}
-12029,Gloomy_Box,Box of Gloom,11,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 45,1,"Improve Concentration"; },{},{}
-12030,Box_Of_Grudge,Box of Resentment,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,20; },{},{}
-12031,Sleepy_Box,Box of Drowsiness,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_MATKPOTION,60000,20; },{},{}
-12032,Box_Of_Storm,Box of Storms,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WATERWEAPON,180000,0; },{},{}
-12033,Box_Of_Sunlight,Box of Sunlight,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Intravision,20000,0; },{},{}
-12034,Painting_Box,Box of Panting,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 0,9; if(rand(100)<30) sc_start SC_Silence,30000,0; },{},{}
-12035,Lotto_Box01,Lotto Box 01,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7361,7370),1; },{},{}
-12036,Lotto_Box02,Lotto Box 02,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7371,7380),1; },{},{}
-12037,Lotto_Box03,Lotto Box 03,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7381,7390),1; },{},{}
-12038,Lotto_Box04,Lotto Box 04,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_LottoBox),1; },{},{}
-12039,Lotto_Box05,Lotto Box 05,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7542,7546),1; },{},{}
-12040,Stone_Of_Intelligence_,Stone of Sage,2,,50000,300,,,,,0xFFFFFFFF,7,2,,,,,,{ homevolution ; },{},{}
-// Mixed Foods (+1 to +5)
-12041,Str_Dish01,Fried Grasshopper Legs,0,2000,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 1; percentheal 5,0; },{},{}
-12042,Str_Dish02,Seasoned Sticky Webfoot,0,4000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 2; percentheal 5,0; },{},{}
-12043,Str_Dish03,Bomber Steak,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 3; percentheal 5,0; },{},{}
-12044,Str_Dish04,Herb Marinade Beef,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 4; percentheal 5,0; },{},{}
-12045,Str_Dish05,Lutie Lady's Pancake,0,10000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 5; percentheal 10,0; },{},{}
-12046,Int_Dish01,Grape Juice Herbal Tea,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 1; percentheal 0,5; },{},{}
-12047,Int_Dish02,Autumn Red Tea,0,4000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 2; percentheal 0,5; },{},{}
-12048,Int_Dish03,Honey Herbal Tea,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 3; percentheal 0,5; },{},{}
-12049,Int_Dish04,Morocc Fruit Wine,0,8000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 4; percentheal 0,5; },{},{}
-12050,Int_Dish05,Mastela Fruit Wine,0,10000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 5; percentheal 0,10; },{},{}
-12051,Vit_Dish01,Steamed Crab Nippers,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 1; percentheal 5,0; },{},{}
-12052,Vit_Dish02,Assorted Seafood,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 2; percentheal 5,0; },{},{}
-12053,Vit_Dish03,Clam Soup,0,6000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 3; percentheal 5,0; },{},{}
-12054,Vit_Dish04,Seasoned Jellyfish,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 4; percentheal 5,0; },{},{}
-12055,Vit_Dish05,Spicy Fried Bao,0,10000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 5; percentheal 10,0; },{},{}
-12056,Agi_Dish01,Frog Egg Squid Ink Soup,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 1; percentheal 3,1; },{},{}
-12057,Agi_Dish02,Smooth Noodle,0,4000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 2; percentheal 3,1; },{},{}
-12058,Agi_Dish03,Tentacle Cheese Gratin,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 3; percentheal 3,1; },{},{}
-12059,Agi_Dish04,Lutie Cold Noodle,0,8000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 4; percentheal 3,1; },{},{}
-12060,Agi_Dish05,Steamed Bat Wing in Pumpkin,0,10000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 5; percentheal 6,2; },{},{}
-12061,Dex_Dish01,Honey Grape Juice,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 1; percentheal 2,2; },{},{}
-12062,Dex_Dish02,Chocolate Mousse Cake,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 2; percentheal 2,2; },{},{}
-12063,Dex_Dish03,Fruit Mix,0,6000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 3; percentheal 2,2; },{},{}
-12064,Dex_Dish04,Cream Sandwich,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 4; percentheal 2,2; },{},{}
-12065,Dex_Dish05,Green Salad,0,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 5; percentheal 5,5; },{},{}
-12066,Luk_Dish01,Fried Monkey Tails,0,2000,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 1; percentheal 3,2; },{},{}
-12067,Luk_Dish02,Mixed Juice,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 2; percentheal 3,2; },{},{}
-12068,Luk_Dish03,Fried Sweet Potato,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 3; percentheal 4,2; },{},{}
-12069,Luk_Dish04,Steamed Ancient Lips,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 4; percentheal 4,2; },{},{}
-12070,Luk_Dish05,Fried Scorpion Tails,0,10000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 5; percentheal 5,2; },{},{}
-// Mixed Foods (+6 to +10)
-12071,Str_Dish06,Shiny Marinade Beef,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 6; percentheal 10,2; },{},{}
-12072,Str_Dish07,Whole Roast,0,40000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 7; percentheal 10,4; },{},{}
-12073,Str_Dish08,Bearfoot Special,0,60000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 8; percentheal 15,6; },{},{}
-12074,Str_Dish09,Tendon Satay,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 9; percentheal 15,8; },{},{}
-12075,Str_Dish10,Steamed Tongue,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 10; percentheal 20,20; },{},{}
-12076,Int_Dish06,Red Mushroom Wine,0,20000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 6; percentheal 2,10; },{},{}
-12077,Int_Dish07,Special Royal Jelly Herbal Tea,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 7; percentheal 4,10; },{},{}
-12078,Int_Dish08,Royal Family Tea,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 8; percentheal 6,10; },{},{}
-12079,Int_Dish09,Tristan XII,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 9; percentheal 8,15; },{},{}
-12080,Int_Dish10,Dragon Breath Cocktail,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 10; percentheal 10,20; },{},{}
-12081,Vit_Dish06,Awfully Bitter Bracer,0,20000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 6; percentheal 13,0; },{},{}
-12082,Vit_Dish07,Sumptuous Feast,0,40000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 7; percentheal 16,0; },{},{}
-12083,Vit_Dish08,Giant Burito,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 8; percentheal 19,0; },{},{}
-12084,Vit_Dish09,Ascending Dragon Soup,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 9; percentheal 22,0; },{},{}
-12085,Vit_Dish10,Immortal Stew,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 10; percentheal 25,0; },{},{}
-12086,Agi_Dish06,Chile Shrimp Gratin,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 6; percentheal 7,2; },{},{}
-12087,Agi_Dish07,Steamed Alligator with Vegetable,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 7; percentheal 8,2; },{},{}
-12088,Agi_Dish08,Incredibly Spicy Curry,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 8; percentheal 9,2; },{},{}
-12089,Agi_Dish09,Special Meat Stew,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 9; percentheal 10,2; },{},{}
-12090,Agi_Dish10,Steamed Desert Scorpions,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 10; percentheal 15,5; },{},{}
-12091,Dex_Dish06,Peach Cake,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 6; percentheal 5,6; },{},{}
-12092,Dex_Dish07,Soul Haunted Bread,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 7; percentheal 5,7; },{},{}
-12093,Dex_Dish08,Special Toast,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 8; percentheal 5,8; },{},{}
-12094,Dex_Dish09,Heavenly Fruit Juice,0,80000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 9; percentheal 5,9; },{},{}
-12095,Dex_Dish10,Hwergelmir's Tonic,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 10; percentheal 10,10; },{},{}
-12096,Luk_Dish06,Lucky Soup,0,20000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 6; percentheal 6,3; },{},{}
-12097,Luk_Dish07,Assorted Shish Kebob,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 7; percentheal 7,3; },{},{}
-12098,Luk_Dish08,Strawberry Flavored Rice Ball,0,60000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 8; percentheal 9,3; },{},{}
-12099,Luk_Dish09,Blood Flavored Soda,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 9; percentheal 10,4; },{},{}
-12100,Luk_Dish10,Cooked Nine Tail,0,100000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 10; percentheal 14,8; },{},{}
-12101,Citron,Citron,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12102,Meat_Skewer,Grilled Skewer,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-// New Monster Summoners & Item Givers
-12103,Bloody_Dead_Branch,Bloody Branch,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-3,1,""; },{},{}
-12104,Random_Quiver,Random Quiver,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Quiver),1; },{},{}
-12105,Set_Of_Taiming_Item,Taming Gift Set,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Taming),3; },{},{}
-12106,Accessory_Box,Jewelry Box,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Accesory),1; },{},{}
-12107,Wrapped_Mask,Wrapped Mask,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Mask),1; },{},{}
-12108,Bundle_Of_Magic_Scroll,Scroll Package,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Scroll),5; },{},{}
-12109,Poring_Box,Poring Box,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-2,1,""; },{},{}
-12110,First_Aid_Kit,First Aid Kit,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Potion),5; },{},{}
-12111,Food_Package,Bundle of Food,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Fruit),1; getitem groupranditem(IG_Meat),1; getitem groupranditem(IG_Fish),1; },{},{}
-12112,Tropical_Sograt,Tropical Sograt,0,,500,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Curse,10000,1; },{},{}
-12113,Vermilion_The_Beach,Vermilion on the Beach,0,,500,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Stun,10000,1; },{},{}
-// Elemental Converters
-12114,Flame_Converter,Flame Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_FIREWEAPON,180000,1; },{},{}
-12115,Frost_Converter,Frost Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WATERWEAPON,180000,1; },{},{}
-12116,Seismic_Converter,Seismic Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_EARTHWEAPON,180000,1; },{},{}
-12117,Lighting_Converter,Lightning Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WINDWEAPON,180000,1; },{},{}
-// Elemental Resistance Potions
-12118,Resist_Fire_Potion,Fire Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Fire,20,Ele_Water,-15; },{},{}
-12119,Resist_Cold_Potion,Cold Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Water,20,Ele_Wind,-15; },{},{}
-12120,Resist_Earth_Potion,Earth Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Earth,20,Ele_Fire,-15; },{},{}
-12121,Resist_Wind_Potion,Thunder Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Wind,20,Ele_Earth,-15; },{},{}
-12122,Sesame_Pastry,Sesame Pastry,0,,1,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_HitFood,1200000,30; },{},{}
-12123,Honey_Pastry,Honey Pastry,0,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_FleeFood,1200000,30; },{},{}
-12124,Rainbow_Cake,Rainbow Cake,0,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_BATKFood,1200000,10; sc_start SC_MATKFood,120000,10; },{},{}
-// Cooking Sets
-12125,Outdoor_Cooker,Outdoor Cooking Kit,2,500,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 11; },{},{}
-12126,Home_Cooking_Set,Home Cooking Kit,2,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 12; },{},{}
-12127,High_end_Cooking_Kits,Professional Cooking Kit,2,2000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 13; },{},{}
-12128,Imperial_Cooking_Kits,Royal Cooking Kit,2,5000,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 14; },{},{}
-12129,Fantastic_Cooking_Kits,Fantastic Cooking Kit,2,10000,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 15; },{},{}
-//
-12130,Cookie_Bag,Cookie Bag,2,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_CookieBag),1; },{},{}
-12131,Lucky_Potion,Lucky Potion,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12132,Red_Bag,Santa's Bag,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Xmas,600000,0; },{},{}
-12133,McDonald's_Ice_Cone,McDonald's Ice Cone,0,50,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ if(gettime(5) != MDiceCone) { set MDiceCone,gettime(5); percentheal 50,50; } },{},{}
-12134,Red_Envelope_,Red Envelope,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ set Zeny,Zeny+rand(1000,10000); },{},{}
-12135,Green_Ale,Green Ale,2,,10,30,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; if(rand(100) >= 90)sc_start SC_Confusion,10000,0; },{},{}
-12136,Women's_Bundle,Women's Bundle,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem callfunc("F_RandMes",4,558,529,2668,7518),1; },{},{}
-12137,First_Stage,First Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12138,Second_Stage,Second Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12139,Third_Stage,Third Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12140,Fourth_Stage,Fourth Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12141,Fifth_Stage,Fifth Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12142,Book_of_Magic,Book of Magic,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1800000, 10; },{},{}
-12143,Red_Can,Red Can,2,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 25,25; },{},{}
-12144,Lightning_Sphere_Pack,Lightning Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13204,500; },{},{}
-12145,Blind_Sphere_Pack,Blind Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13206,500; },{},{}
-12146,Poison_Sphere_Pack,Poison Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13205,500; },{},{}
-12147,Freezing_Sphere_Pack,Freezing Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13207,500; },{},{}
-12148,Flare_Sphere_Pack,Flare Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13203,500; },{},{}
-12149,Bullet_Casing,Bullet Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13200,500; },{},{}
-12150,Shell_of_Blood_Casing,Shell of Blood Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13202,500; },{},{}
-12151,Silver_Bullet_Casing,Silver Bullet Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13201,500; },{},{}
-12152,Special_Gift,Special Gift,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12153,Archer_Mercenary_Summon_Scroll_Level_1,Archer Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12154,Archer_Mercenary_Summon_Scroll_Level_2,Archer Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12155,Archer_Mercenary_Summon_Scroll_Level_3,Archer Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12156,Archer_Mercenary_Summon_Scroll_Level_4,Archer Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12157,Archer_Mercenary_Summon_Scroll_Level_5,Archer Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12158,Archer_Mercenary_Summon_Scroll_Level_6,Archer Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12159,Archer_Mercenary_Summon_Scroll_Level_7,Archer Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12160,Archer_Mercenary_Summon_Scroll_Level_8,Archer Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12161,Archer_Mercenary_Summon_Scroll_Level_9,Archer Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12162,Archer_Mercenary_Summon_Scroll_Level_10,Archer Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12163,Swordsman_Mercenary_Summon_Scroll_Level_1,Swordsman Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12164,Swordsman_Mercenary_Summon_Scroll_Level_2,Swordsman Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12165,Swordsman_Mercenary_Summon_Scroll_Level_3,Swordsman Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12166,Swordsman_Mercenary_Summon_Scroll_Level_4,Swordsman Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12167,Swordsman_Mercenary_Summon_Scroll_Level_5,Swordsman Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12168,Swordsman_Mercenary_Summon_Scroll_Level_6,Swordsman Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12169,Swordsman_Mercenary_Summon_Scroll_Level_7,Swordsman Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12170,Swordsman_Mercenary_Summon_Scroll_Level_8,Swordsman Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12171,Swordsman_Mercenary_Summon_Scroll_Level_9,Swordsman Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12172,Swordsman_Mercenary_Summon_Scroll_Level_10,Swordsman Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12173,Spearman_Mercenary_Summon_Scroll_Level_1,Spearman Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12174,Spearman_Mercenary_Summon_Scroll_Level_2,Spearman Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12175,Spearman_Mercenary_Summon_Scroll_Level_3,Spearman Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12176,Spearman_Mercenary_Summon_Scroll_Level_4,Spearman Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12177,Spearman_Mercenary_Summon_Scroll_Level_5,Spearman Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12178,Spearman_Mercenary_Summon_Scroll_Level_6,Spearman Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12179,Spearman_Mercenary_Summon_Scroll_Level_7,Spearman Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12180,Spearman_Mercenary_Summon_Scroll_Level_8,Spearman Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12181,Spearman_Mercenary_Summon_Scroll_Level_9,Spearman Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12182,Spearman_Mercenary_Summon_Scroll_Level_10,Spearman Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12183,Holy_Arrow_Container,Holy Arrow Quiver,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1772,500; },{},{}
-12184,Mercenary's_Red_Potion,Mercenary's Red Potion,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12185,Mercenary's_Blue_Potion,Mercenary's Blue Potion,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12186,Old_Red_Box,Old Red Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12187,Old_Green_Box,Old Green Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-12188,Fantastic_Moon_Snack,Fantastic Moon Snack,2,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; },{},{}
-12189,Old_Red_Box_,Old Red Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
-// More Weapons
-//===================================================================
-// Daggers
-13000,Jujube_Dagger,Dagger with Jujube hilt,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Wind; },{},{}
-13001,Dragon_Killer,Dragon Killer,4,,10,900,110,,1,0,0x008F5EEF,7,2,2,4,60,1,1,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bExpAddRace,RC_Dragon,10; },{},{}
-13002,Ginnungagap,Ginnungagap,4,,10,700,120,,1,0,0x008F5EEF,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; bonus2 bAddEff2,Eff_Blind,50; },{},{}
-13003,Coward,Cowardice Blade,4,52000,,700,80,,1,1,0x02021040,7,2,2,3,55,1,1,{ bonus bDef,5; },{},{}
-13004,Coward_,Cowardice Blade,4,52000,,700,80,,1,2,0x02021040,7,2,2,3,55,1,1,{ bonus bDef,5; },{},{}
-13005,Angelwing_Short_Sword,Angelic Wing Dagger,4,,10,600,120,,1,1,0xFFFFFFFE,7,2,2,4,50,1,1,{},{},{}
-// Ninja Weapons
-13006,Khukri,Gokurin,4,240000,,600,150,,1,0,0x02000000,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,500; },{},{}
-13007,Jitte,Jitte,4,20000,,400,70,,1,0,0x02000000,7,2,2,2,35,1,1,{ bonus bBreakWeaponRate,500; },{},{}
-13008,Jitte_,Jitte,4,20000,,400,70,,1,1,0x02000000,7,2,2,2,35,1,1,{ bonus bBreakWeaponRate,500; },{},{}
-13009,Kamaitachi,Kamaitachi,4,48000,,900,125,,1,0,0x02000000,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus bCritical,3; bonus bAspdRate,3; },{},{}
-13010,Asura,Ashura,4,32000,,600,50,,1,2,0x02000000,7,2,2,1,12,1,1,{ bonus bMatkRate,10; },{},{}
-13011,Asura_,Ashura,4,32000,,600,50,,1,3,0x02000000,7,2,2,1,12,1,1,{ bonus bMatkRate,10; },{},{}
-13012,Murasame,Murasame,4,48000,,700,95,,1,1,0x02000000,7,2,2,2,24,1,1,{ bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
-13013,Muraseme_,Murasame,4,48000,,700,95,,1,2,0x02000000,7,2,2,2,24,1,1,{ bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
-13014,Hakujin,Hakujin,4,120000,,800,120,,1,0,0x02000000,7,2,2,3,42,1,1,{ bonus4 bAutoSpell,28,1,20,0; },{},{}
-13015,Hakujin_,Hakujin,4,120000,,800,120,,1,1,0x02000000,7,2,2,3,42,1,1,{ bonus4 bAutoSpell,28,1,20,0; },{},{}
-13016,Poison_Knife__,Poison Knife,4,,10,800,64,,1,2,0x028F5EEE,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,3000; },{},{}
-13017,Ice_Pick_,Ice Pick,4,,10,600,70,,1,1,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; },{},{}
-13018,Sucsamad_,Sucsamad,4,,10,800,140,,1,1,0x028F5EEE,7,2,2,4,36,1,1,{ bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0; },{},{}
-13019,Ginnungagap_,Ginnungagap,4,,10,700,120,,1,1,0x008F5EEF,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; bonus2 bAddEff2,Eff_Blind,50; },{},{}
-13020,Warrior's_Balmung_,Warrior's Balmung,4,,10,1000,170,,1,0,0xFFFFFFFF,7,2,2,4,48,1,2,{ bonus bAllStats,5; },{},{}
-// Guns
-13100,Six_Shooter,Six Shooter,4,4500,,400,30,,7,1,0x01000000,7,2,34,1,10,1,17,{ bonus bHit,-10; },{},{}
-13101,Six_Shooter_,Six Shooter,4,4500,,400,30,,7,2,0x01000000,7,2,34,1,10,1,17,{ bonus bHit,-10; },{},{}
-13102,Crimson_Bolt,Crimson Bolt,4,20000,,450,45,,7,1,0x01000000,7,2,34,2,35,1,17,{ bonus bHit,-10; },{},{}
-13103,Crimson_Bolt_,Crimson Bolt,4,20000,,450,45,,7,2,0x01000000,7,2,34,2,35,1,17,{ bonus bHit,-10; },{},{}
-13104,The_Garrison,Garrison,4,48000,,500,70,,7,1,0x01000000,7,2,34,2,55,1,17,{ bonus bHit,-10; },{},{}
-13105,The_Garrison_,Garrison,4,48000,,500,70,,7,2,0x01000000,7,2,34,2,55,1,17,{ bonus bHit,-10; },{},{}
-13106,Gold_Lux,Gold Lux,4,100000,,500,20,,7,0,0x01000000,7,2,34,3,12,1,17,{ bonus bHit,-10; if(getskilllv(500)>0) bonus4 bAutoSpell,500,getskilllv(500),100,0; },{},{}
-13150,Branch,Branch,4,3000,,500,50,,9,3,0x01000000,7,2,34,1,1,1,18,{},{},{}
-13151,The_Cyclone,Cyclone,4,17500,,700,120,,9,1,0x01000000,7,2,34,2,24,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
-13152,The_Cyclone_,Cyclone,4,17500,,700,120,,9,2,0x01000000,7,2,34,2,24,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
-13153,Dusk,Dusk,4,23500,,750,150,,9,1,0x01000000,7,2,34,2,56,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
-13154,Rolling_Stone,Rolling Stone,4,12000,,900,135,,9,1,0x01000000,7,2,34,1,14,1,19,{ bonus bSplashRange,1; },{},{}
-13155,Black_Rose,Black Rose,4,32000,,900,180,,9,1,0x01000000,7,2,34,2,35,1,19,{ bonus bSplashRange,1; },{},{}
-13156,Gate_Keeper,Gate Keeper,4,56000,,1000,210,,9,0,0x01000000,7,2,34,2,55,1,19,{ bonus bSplashRange,1; bonus4 bAutoSpell,520,6,50,1; },{},{}
-13157,Drifter,Drifter,4,80000,,2300,50,,7,1,0x01000000,7,2,34,2,55,1,20,{},{},{}
-13158,Butcher,Butcher,4,130000,,2500,75,,7,0,0x01000000,7,2,34,3,68,1,20,{ bonus2 bCriticalAddRace,RC_Brute,10; },{},{}
-13159,Butcher_,Butcher,4,130000,,2500,75,,7,1,0x01000000,7,2,34,3,68,1,20,{ bonus2 bCriticalAddRace,RC_Brute,10; },{},{}
-13160,Destroyer,Destroyer,4,110000,,1200,220,,7,0,0x01000000,7,2,34,2,52,1,21,{ bonus bBreakArmorRate,200; },{},{}
-13161,Destroyer_,Destroyer,4,110000,,1200,220,,7,1,0x01000000,7,2,34,2,52,1,21,{ bonus bBreakArmorRate,200; },{},{}
-13162,Inferno,Inferno,4,230000,,1250,280,,7,1,0x01000000,7,2,34,2,65,1,21,{},{},{}
-// Bullets
-13200,Bullet,Bullet,10,1,,2,10,,,,0x01000000,7,2,32768,,1,,3,{},{},{}
-13201,Silver_Bullet,Silver Bullet,10,15,,2,15,,,,0x01000000,7,2,32768,,1,,3,{ bonus bAtkEle,Ele_Holy; },{},{}
-13202,Shell_of_Blood,Shell of Blood,10,30,,2,30,,,,0x01000000,7,2,32768,,1,,3,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
-13203,Flare_Sphere,Flare Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Fire; },{},{}
-13204,Lightning_Sphere,Lightning Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Wind; },{},{}
-13205,Poison_Sphere,Poison Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,500; },{},{}
-13206,Blind_Sphere,Blind Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; },{},{}
-13207,Freezing_Sphere,Freezing Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Water; },{},{}
-// Shurikens & Kunais
-13250,Shuriken,Shuriken,10,4,,5,10,,,,0x02000000,7,2,32768,,1,,6,{},{},{}
-13251,Raincloud_Shuriken,Raincloud Shuriken,10,10,,5,30,,,,0x02000000,7,2,32768,,20,,6,{},{},{}
-13252,Flash_Shuriken,Flash Shuriken,10,20,,5,45,,,,0x02000000,7,2,32768,,40,,6,{},{},{}
-13253,Pointed_Leaf_Shuriken,Pointed Leaf Shuriken,10,40,,5,70,,,,0x02000000,7,2,32768,,60,,6,{},{},{}
-13254,Piercing_Thorn_Shuriken,Piercing Thorn Shuriken,10,100,,5,100,,,,0x02000000,7,2,32768,,80,,6,{},{},{}
-13255,Kunai_of_Frozen_Icicle,Kunai of Frozen Icicle,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Water; },{},{}
-13256,Kunai_of_Black_Earth,Kunai of Black Earth,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Earth; },{},{}
-13257,Kunai_of_Violent_Winds,Kunai of Violent Winds,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Wind; },{},{}
-13258,Kunai_of_Fierce_Heat,Kunai of Fierce Heat,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Fire; },{},{}
-13259,Kunai_of_Deadly_Poison,Kunai of Deadly Poison,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,500; },{},{}
-// Ninja Fuuma Shurikens
-13300,Huuma_Bird_Wing,Fuuma Shuriken Beneki,4,90000,,3000,150,,1,0,0x02000000,7,2,34,4,65,1,22,{ bonus bAtkEle,Ele_Wind; bonus bAgi,-1; bonus bDex,-2; },{},{}
-13301,Huuma_Giant_Wheel,Fuuma Shuriken Daisharin,4,40000,,2500,50,,1,3,0x02000000,7,2,34,4,42,1,22,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
-13302,Huuma_Giant_Wheel_,Fuuma Shuriken Daisharin,4,40000,,2500,50,,1,4,0x02000000,7,2,34,4,42,1,22,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
-13303,Huuma_Blaze,Fuuma Shuriken Rekka,4,78000,,1500,185,,1,0,0x02000000,7,2,34,4,55,1,22,{ bonus bDex,-2; bonus bAtkEle,Ele_Fire; bonus4 bAutoSpell,17,5,30,1; },{},{}
-13400,Cutlus_,Cutlus,4,,10,900,150,,1,1,0x000654E2,7,2,2,4,40,1,2,{ skill 5,5; bonus bStr,2; bonus bDef,1; },{},{}
+// Items Database
+//
+// Structure of Database:
+// ID,AegisName,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Upper,Gender,Loc,wLV,eLV,Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
+//
+// Healing Items
+//=============================================================
+0,DEFAULT,Default,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+501,Red_Potion,Red Potion,0,50,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
+502,Orange_Potion,Orange Potion,0,200,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
+503,Yellow_Potion,Yellow Potion,0,550,,130,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
+504,White_Potion,White Potion,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+505,Blue_Potion,Blue Potion,0,5000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(40,60); },{},{}
+506,Green_Potion,Green Potion,0,40,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; },{},{}
+507,Red_Herb,Red Herb,0,18,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(18,28),0; },{},{}
+508,Yellow_Herb,Yellow Herb,0,40,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(38,58),0; },{},{}
+509,White_Herb,White Herb,0,120,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(75,115),0; },{},{}
+510,Blue_Herb,Blue Herb,0,60,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(15,30); },{},{}
+511,Green_Herb,Green Herb,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; },{},{}
+512,Apple,Apple,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(16,22),0; },{},{}
+513,Banana,Banana,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(17,21),0; },{},{}
+514,Grape,Grape,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,15); },{},{}
+515,Carrot,Carrot,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(18,20),0; },{},{}
+516,Sweet_Potato,Potato,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(15,23),0; if(rand(100)<3) sc_start SC_Stun,10000,0; },{},{}
+517,Meat,Meat,0,50,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),0; },{},{}
+518,Honey,Honey,0,500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),rand(20,40); },{},{}
+519,Milk,Milk,0,25,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(27,37),0; },{},{}
+520,Leaflet_Of_Hinal,Hinalle Leaflet,0,150,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
+521,Leaflet_Of_Aloe,Aloe Leaflet,0,360,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+522,Fruit_Of_Mastela,Mastela Fruit,0,8500,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(400,600),0; },{},{}
+523,Holy_Water,Holy Water,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Curse; },{},{}
+525,Panacea,Panacea,0,500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; sc_end SC_Hallucination; },{},{}
+526,Royal_Jelly,Royal Jelly,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),rand(40,60); sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; sc_end SC_Hallucination; },{},{}
+528,Monster's_Feed,Monster Food,0,60,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(72,108),0; },{},{}
+529,Candy,Candy,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
+530,Candy_Striper,Candy Cane,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
+531,Apple_Juice,Apple Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,35),0; },{},{}
+532,Banana_Juice,Banana Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(26,34),0; },{},{}
+533,Grape_Juice,Grape Juice,0,250,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(15,25); },{},{}
+534,Carrot_Juice,Carrot Juice,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(27,33),0; },{},{}
+535,Pumpkin,Pumpkin,0,15,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 19,0; },{},{}
+536,Ice_Cream,Ice Cream,0,150,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; if(rand(100)<24) sc_start SC_Freeze,10000,0; },{},{}
+537,Pet_Food,Pet Food,0,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
+538,Well_Baked_Cookie,Well-baked Cookie,0,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(160,200),0; },{},{}
+539,Piece_Of_Cake,Piece of Cake,0,3000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),0; },{},{}
+540,Falcon's_Feed,Falcon food,0,2000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(185,225),0; },{},{}
+541,Pecopeco's_Feed,Peco Peco food,0,3000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+542,Festive_Cookie,Festival Cookie,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+543,Festive_Rainbow_Cake,Festival Rainbow Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+544,Fish_Slice,Raw Fish,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,60),0; },{},{}
+545,Red_Slim_Potion,Condensed Red Potion,0,150,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
+546,Yellow_Slim_Potion,Condensed Yellow Potion,0,600,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
+547,White_Slim_Potion,Condensed White Potion,0,1650,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+548,Cheese,Cheese,0,2800,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,15); },{},{}
+549,Nice_Sweet_Potato,Yam,0,180,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,100),0; },{},{}
+550,Popped_Rice,Rice Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(10,15),0; },{},{}
+551,Shusi,Sushi,0,1,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,60),0; },{},{}
+552,KETUPAT,Ketupat,0,1,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,90),rand(20,30); },{},{}
+553,Bun,Bao,0,1,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(35,70),0; },{},{}
+554,Mojji,Mochi,0,100,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; if(rand(100)<3) sc_start SC_Stun,10000,0; if(rand(100)<3) sc_start SC_Blind,10000,0; },{},{}
+555,Rice_Cake,Traditional Rice Cake,0,100,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
+556,Long_Rice_Cake,Rice Cake Stick,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(20,25),0; },{},{}
+557,Hash_Rice_Cake,Neatly Sliced Rice Cake,0,10,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(25,30),0; },{},{}
+558,Chocolate,Chocolate,0,1,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 1,1; },{},{}
+559,HandMade_Chocolate,Hand-made Chocolate,0,1,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
+560,HandMade_Chocolate_,Hand-made White Chocolate,0,5000,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
+561,White_Chocolate,White Chocolate,0,5000,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 50,50; },{},{}
+562,Pizza,Doublecrust Swiss Fondue,0,100,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,100),0; },{},{}
+563,Pizza_01,Doublecrust Swiss Fondue,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(375,445),0; },{},{}
+564,Rice_Ball,Rice Ball,0,1,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 200,0; },{},{}
+565,Vita500_Bottle,Vita500,0,580,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(142,274),0; },{},{}
+566,Tomyumkung,Tom Yum Goong,0,10000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(244,350),rand(10,30); },{},{}
+567,Prawn,Shrimp,0,500,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(117,192),0; },{},{}
+568,Lemon,Lemon,0,60,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(10,20); },{},{}
+569,Novice_Potion,Novice Potion,0,,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(22,33),0; },{},{}
+570,Lucky_Candy,Lucky Candy,0,10,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
+571,Lucky_Cnady_Cane,Lucky Candy Cane,0,20,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
+572,Lucky_Cookie,Lucky Cookie,0,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(160,200),0; },{},{}
+573,Chocolate_Drink,Chocolate Drink,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(330,410),rand(45,65); },{},{}
+574,Egg,Egg,0,20,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(33,42),0; },{},{}
+575,Piece_Of_Cake_,2nd Anniversary Cake,0,10,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),0; },{},{}
+576,Prickly_Fruit,Prickly Fruit,0,540,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(150,300),rand(20,30); },{},{}
+577,Grain,Bag of Grain,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(60,70),0; },{},{}
+578,Strawberry,Strawberry,0,200,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal 0,rand(16,28); },{},{}
+579,Delicious_Fish,Fresh Fish,0,250,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(100,150),0; },{},{}
+580,Bread,Bread,0,150,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
+581,Mushroom,Edible Mushroom,0,40,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(20,30),0; },{},{}
+582,Orange,Orange,0,300,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(10,20),rand(10,20); },{},{}
+583,Ketupat_,Ketupat,0,7000,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),rand(40,60); },{},{}
+584,Skewer_Soup,Skewer Soup,0,100,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(40,70),0; },{},{}
+585,Brusti,Brusti,0,2,,40,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(15,20),0; itemskill 74,3,"Magnificat"; },{},{}
+586,Mother's_Cake,Mother's Cake,0,20,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}
+587,Thorny_Fruit,Red Thorn Fruit,0,880,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(270,330),rand(20,30); },{},{}
+588,Spaghetti,Spaghetti,0,100,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(40,70),0; },{},{}
+589,Pizza_,Pizza,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(375,445),0; },{},{}
+590,Brizel_,Brezel,0,2,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(50,90),0; },{},{}
+// Usable Items
+//===================================================================
+601,Wing_Of_Fly,Fly Wing,11,60,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,1,""; },{},{}
+602,Wing_Of_Butterfly,Butterfly Wing,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,2,""; },{},{}
+603,Old_Blue_Box,Old Blue Box,2,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_BlueBox),1; },{},{}
+604,Branch_Of_Dead_Tree,Dead Branch,2,50,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-1,1,""; },{},{}
+605,Anodyne,Anodyne,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ENDURE,10000,1; },{},{}
+606,Aloebera,Aloevera,0,1500,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_PROVOKE,30000,1; },{},{}
+607,Yggdrasilberry,Yggdrasil Berry,0,2,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 100,100; },{},{}
+608,Seed_Of_Yggdrasil,Yggdrasil Seed,0,5000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; },{},{}
+609,Amulet,Amulet,2,100,,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+610,Leaf_Of_Yggdrasil,Yggdrasil Leaf,11,4000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 54,1,"Resurrection"; },{},{}
+611,Spectacles,Magnifier,11,40,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 40,1,"Identify"; },{},{}
+// Smithing Items
+612,Portable_Furnace,Mini Furnace,2,150,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 21; },{},{}
+613,Iron_Hammer,Iron Hammer,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 1; },{},{}
+614,Golden_Hammer,Golden Hammer,2,3000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 2; },{},{}
+615,Oridecon_Hammer,Oridecon Hammer,2,5000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 3; },{},{}
+// Item Givers
+616,Old_Card_Album,Old Card Album,2,10000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_CardAlbum),1; },{},{}
+617,Old_Violet_Box,Old Purple Box,2,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_VioletBox),1; },{},{}
+618,Worn_Out_Scroll,Worn Out Scroll,2,50,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_ScrollBox),1; },{},{}
+// Pet Tames
+619,Unripe_Apple,Unripe Apple,11,1000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1002; },{},{}
+620,Orange_Juice,Orange Juice,11,1500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1113; },{},{}
+621,Bitter_Herb,Bitter Herb,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1031; },{},{}
+622,Rainbow_Carrot,Rainbow Carrot,11,2500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1063; },{},{}
+623,Earthworm_The_Dude,Earthworm the Dude,11,4000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1049; },{},{}
+624,Rotten_Fish,Rotten Fish,11,2500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1011; },{},{}
+625,Lusty_Iron,Rusty Iron,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1042; },{},{}
+626,Monster_Juice,Monster Juice,11,1500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1035; },{},{}
+627,Sweet_Milk,Sweet Milk,11,7000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1167; },{},{}
+628,Well_Dried_Bone,Well-Dried Bone,11,10000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1107; },{},{}
+629,Singing_Flower,Singing Flower,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1052; },{},{}
+630,Dew_Laden_Moss,Dew Laden Moss,11,10,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1014; },{},{}
+631,Deadly_Noxious_Herb,Deadly Noxious Herb,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1077; },{},{}
+632,Fatty_Chubby_Earthworm,Fatty Chubby Earthworm,11,5000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1019; },{},{}
+633,Baked_Yam,Sweet Potato,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1056; },{},{}
+634,Tropical_Banana,Tropical Banana,11,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1057; },{},{}
+635,Horror_Of_Tribe,Orc Trophy,11,300,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1023; },{},{}
+636,No_Recipient,No Recipient,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1026; },{},{}
+637,Old_Broom,Old Broom,11,350,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1110; },{},{}
+638,Silver_Knife_Of_Chaste,Silver Knife of Chastity,11,12000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1170; },{},{}
+639,Armlet_Of_Obedience,Armlet of Obedience,11,18000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1029; },{},{}
+640,Shining_Stone,Shining Stone,11,3000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1155; },{},{}
+641,Contracts_In_Shadow,Contracts in Shadow,11,100,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1109; },{},{}
+642,Book_Of_Devil,Book of the Devil,11,1800,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1101; },{},{}
+643,Pet_Incubator,Pet Incubator,2,3000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ bpet; },{},{}
+644,Gift_Box,Gift Box,2,2,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+// ASPD Potions
+645,Center_Potion,Concentration Potion,2,800,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,0; },{},{}
+656,Awakening_Potion,Awakening Potion,2,1500,,150,,,,,0xFFF7FEEF,7,2,,,40,,,{ sc_end SC_Sleep; sc_start SC_ASPDPOTION1,1800000,0; },{},{}
+657,Berserk_Potion,Berserk Potion,2,3000,,200,,,,,0x01E646A6,7,2,,,85,,,{ sc_start SC_ASPDPOTION2,1800000,0; },{},{}
+658,Union_Of_Tribe,Tribal Solidarity,2,1000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ guildgetexp rand(600000,1200000); },{},{}
+// New Pet Tames
+659,Heart_Of_Her,Her Heart,11,500,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1188; },{},{}
+660,Prohibition_Red_Candle,Forbidden Red Candle,11,,10000,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1200; },{},{}
+661,Sway_Apron,Soft Apron,11,,10000,50,,,,,0xFFFFFFFF,7,2,,,,,,{ pet 1275; },{},{}
+662,Inspector_Certificate,Authoritative Badge,2,1450,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ specialeffect 507; sc_start SC_SpeedUp0,240000,0; },{},{}
+663,Korea_Rice_Cake,Songpyun,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 10,0; },{},{}
+// Item Givers
+664,Gift_Box_1,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+665,Gift_Box_2,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+666,Gift_Box_3,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+667,Gift_Box_4,Gift Box,2,1000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+668,Handsei,Red_Envelope,2,1,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ set Zeny,Zeny+rand(1000,10000); },{},{}
+669,Rice_Cake_Soup,Rice-Cake Soup,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal -100,-100; },{},{}
+// Coins
+670,Gold_Coin_Moneybag,Bag of Gold Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+671,Gold_Coin,Gold Coin,2,,10,40,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+672,Copper_Coin_Moneybag,Bag of Bronze Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+673,Copper_Coin,Bronze Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+674,Mithril_Coin,Mithril Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+675,Silver_Coin,Silver Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+676,Silver_Coin_Moneybag,Bag of Silver Coins,2,,10,400,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+677,White_Gold_Coin,Platinum Coin,2,,10,40,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+678,Poison_Bottle,Poison Bottle,0,5000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ if(Class == 4013) { sc_start SC_Poison,600000,0; sc_start SC_ASPDPOTION3,30000,0; } else percentheal -100,0; },{},{}
+679,Gold_Pill,Pilule,0,5000,,300,,,,,0xFFFFFFFF,7,3,,,,,,{ itemheal 50,50; },{},{}
+680,Magical_Carnation,Magic Carnation,2,,10,1000,,,,,0xFFFFFFFF,7,3,,,,,,{ itemheal 25,0; },{},{}
+681,Memory_Of_Wedding,Sweet Memory of Marriage,2,50000,,10,,,,,0xFFFFFFFF,7,3,,,,,,{},{},{}
+// ATK/MATK Potions
+682,Realgar_Wine,Distilled Fighting Spirit,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,30; },{},{}
+683,Exorcize_Herb,Herb of Incantation,0,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_MATKPOTION,60000,30; },{},{}
+684,Durian,Durian,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,10; sc_start SC_MATKPOTION,60000,10; },{},{}
+685,RAMADAN,Ramadan,0,20,,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+// Scrolls
+686,Earth_Scroll_1_3,Level 3 Earth Spike,11,650,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 90,3,"Earth Spike Level 3"; },{},{}
+687,Earth_Scroll_1_5,Level 5 Earth Spike,11,1300,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 90,5,"Earth Spike Level 5"; },{},{}
+688,Cold_Scroll_1_3,Level 3 Cold Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 14,3,"Cold Bolt Level 3"; },{},{}
+689,Cold_Scroll_1_5,Level 5 Cold Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 14,5,"Cold Bolt Level 5"; },{},{}
+690,Fire_Scroll_1_3,Level 3 Fire Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 19,3,"Fire Bolt Level 3"; },{},{}
+691,Fire_Scroll_1_5,Level 5 Fire Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 19,5,"Fire bolt Level 5"; },{},{}
+692,Wind_Scroll_1_3,Level 3 Lightening Bolt,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 20,3,"Lightning Bolt Level 3"; },{},{}
+693,Wind_Scroll_1_5,Level 5 Lightening Bolt,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 20,5,"Lightning Bolt Level 5"; },{},{}
+694,Ghost_Scroll_1_3,Level 3 Soul Strike,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 13,3,"Soul Strike Level 3"; },{},{}
+695,Ghost_Scroll_1_5,Level 5 Soul Strike,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 13,5,"Soul Strike Level 5"; },{},{}
+696,Fire_Scroll_2_1,Level 1 Fire Ball,11,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 17,1,"Fire Ball Level 1"; },{},{}
+697,Fire_Scroll_2_5,Level 5 Fire Ball,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 17,5,"Fire Ball Level 5"; },{},{}
+698,Fire_Scroll_3_1,Level 1 Fire Wall,11,350,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 18,1,"Fire Wall Level 1"; },{},{}
+699,Fire_Scroll_3_5,Level 5 Fire Wall,11,700,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 18,5,"Fire Wall Level 5"; },{},{}
+700,Cold_Scroll_2_1,Level 1 Frost Diver,11,350,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 15,1,"Frost Diver Level 1"; },{},{}
+// Etc Items
+//===================================================================
+701,Ora_Ora,Ora Ora,3,,27500,200,,,,,,,,,,,,,{},{},{}
+702,Animal_Blood,Animal Gore,3,,1,100,,,,,,,,,,,,,{},{},{}
+703,Hinalle,Hinalle,3,,250,10,,,,,,,,,,,,,{},{},{}
+704,Aloe,Aloe,3,,250,10,,,,,,,,,,,,,{},{},{}
+705,Clover,Clover,3,,5,10,,,,,,,,,,,,,{},{},{}
+706,Four_Leaf_Clover,Four Leaf Clover,3,,40000,10,,,,,,,,,,,,,{},{},{}
+707,Singing_Plant,Singing Plant,3,,250,10,,,,,,,,,,,,,{},{},{}
+708,Ment,Ment,3,,250,10,,,,,,,,,,,,,{},{},{}
+709,Izidor,Izidor,3,,250,10,,,,,,,,,,,,,{},{},{}
+710,Illusion_Flower,Illusion Flower,3,,500,10,,,,,,,,,,,,,{},{},{}
+711,Shoot,Shoot,3,,8,10,,,,,,,,,,,,,{},{},{}
+712,Flower,Flower,3,,1,10,,,,,,,,,,,,,{},{},{}
+713,Empty_Bottle,Empty Bottle,3,,3,20,,,,,,,,,,,,,{},{},{}
+714,Emperium,Emperium,3,,1,1000,,,,,,,,,,,,,{},{},{}
+715,Yellow_Gemstone,Yellow Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
+716,Red_Gemstone,Red Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
+717,Blue_Gemstone,Blue Gemstone,3,,300,30,,,,,,,,,,,,,{},{},{}
+718,Dark_Red_Jewel,Garnet,3,,3000,100,,,,,,,,,,,,,{},{},{}
+719,Violet_Jewel,Amethyst,3,,3000,100,,,,,,,,,,,,,{},{},{}
+720,Skyblue_Jewel,Aquamarine,3,,3000,100,,,,,,,,,,,,,{},{},{}
+721,Azure_Jewel,Emerald,3,,3000,100,,,,,,,,,,,,,{},{},{}
+722,Scarlet_Jewel,Pearl,3,,3000,100,,,,,,,,,,,,,{},{},{}
+723,Cardinal_Jewel,Ruby,3,,3000,100,,,,,,,,,,,,,{},{},{}
+724,Cardinal_Jewel_,Cursed Ruby,3,,500,100,,,,,,,,,,,,,{},{},{}
+725,Red_Jewel,Sardonyx,3,,3000,100,,,,,,,,,,,,,{},{},{}
+726,Blue_Jewel,Sapphire,3,,3000,100,,,,,,,,,,,,,{},{},{}
+727,White_Jewel,Opal,3,,3000,100,,,,,,,,,,,,,{},{},{}
+728,Golden_Jewel,Topaz,3,,3000,100,,,,,,,,,,,,,{},{},{}
+729,Bluish_Green_Jewel,Zircon,3,,3000,100,,,,,,,,,,,,,{},{},{}
+730,Crystal_Jewel,1carat Diamond,3,,5000,100,,,,,,,,,,,,,{},{},{}
+731,Crystal_Jewel_,2carat Diamond,3,,12500,100,,,,,,,,,,,,,{},{},{}
+732,Crystal_Jewel__,3carat Diamond,3,,27500,100,,,,,,,,,,,,,{},{},{}
+733,Crystal_Jewel___,Cracked Diamond,3,,1,100,,,,,,,,,,,,,{},{},{}
+734,Red_Frame,Red Frame,3,,1500,200,,,,,,,,,,,,,{},{},{}
+735,Blue_Porcelain,Chung Jah,3,,2500,500,,,,,,,,,,,,,{},{},{}
+736,White_Platter,China,3,,500,300,,,,,,,,,,,,,{},{},{}
+737,Black_Ladle,Black Ladle,3,,200,50,,,,,,,,,,,,,{},{},{}
+738,Pencil_Case,Pencil Case,3,,150,100,,,,,,,,,,,,,{},{},{}
+739,Rouge,Rouge,3,,5000,10,,,,,,,,,,,,,{},{},{}
+740,Stuffed_Doll,Puppet,3,,500,100,,,,,,,,,,,,,{},{},{}
+741,Poring_Doll,Poring Doll,3,,900,100,,,,,,,,,,,,,{},{},{}
+742,Chonchon_Doll,Chonchon Doll,3,,1500,100,,,,,,,,,,,,,{},{},{}
+743,Spore_Doll,Spore Doll,3,,2750,100,,,,,,,,,,,,,{},{},{}
+744,Bunch_Of_Flowers,Bouquet,3,,1000,50,,,,,,,,,,,,,{},{},{}
+745,Wedding_Bouquet,Wedding Bouquet,3,,5000,50,,,,,,,,,,,,,{},{},{}
+746,Glass_Bead,Glass Bead,3,,700,50,,,,,,,,,,,,,{},{},{}
+747,Crystal_Mirror,Crystal Mirror,3,,7500,50,,,,,,,,,,,,,{},{},{}
+748,Witherless_Rose,Witherless Rose,3,,27500,10,,,,,,,,,,,,,{},{},{}
+749,Frozen_Rose,Frozen Rose,3,,17500,10,,,,,,,,,,,,,{},{},{}
+750,Baphomet_Doll,Baphomet Doll,3,,9000,100,,,,,,,,,,,,,{},{},{}
+751,Osiris_Doll,Osiris Doll,3,,7000,100,,,,,,,,,,,,,{},{},{}
+752,Grasshopper_Doll,Grasshopper Doll,3,,2000,100,,,,,,,,,,,,,{},{},{}
+753,Monkey_Doll,Yoyo Doll,3,,3000,100,,,,,,,,,,,,,{},{},{}
+754,Raccoondog_Doll,Raccoon Doll,3,,2500,100,,,,,,,,,,,,,{},{},{}
+756,Oridecon_Stone,Rough Oridecon,3,,274,200,,,,,,,,,,,,,{},{},{}
+757,Elunium_Stone,Rough Elunium,3,,324,200,,,,,,,,,,,,,{},{},{}
+901,Danggie,Danggie,3,,125,10,,,,,,,,,,,,,{},{},{}
+902,Tree_Root,Tree Root,3,,6,10,,,,,,,,,,,,,{},{},{}
+903,Reptile_Tongue,Reptile Tongue,3,,25,10,,,,,,,,,,,,,{},{},{}
+904,Scorpion's_Tail,Scorpion Tail,3,,62,10,,,,,,,,,,,,,{},{},{}
+905,Stem,Stem,3,,29,10,,,,,,,,,,,,,{},{},{}
+906,Pointed_Scale,Pointed Scale,3,,35,10,,,,,,,,,,,,,{},{},{}
+907,Resin,Resin,3,,60,10,,,,,,,,,,,,,{},{},{}
+908,Spawn,Spawn,3,,74,10,,,,,,,,,,,,,{},{},{}
+909,Jellopy,Jellopy,3,,3,10,,,,,,,,,,,,,{},{},{}
+910,Garlet,Garlet,3,,20,10,,,,,,,,,,,,,{},{},{}
+911,Scell,Scell,3,,80,10,,,,,,,,,,,,,{},{},{}
+912,Zargon,Zargon,3,,240,10,,,,,,,,,,,,,{},{},{}
+913,Tooth_Of_Bat,Tooth of Bat,3,,17,10,,,,,,,,,,,,,{},{},{}
+914,Fluff,Fluff,3,,4,10,,,,,,,,,,,,,{},{},{}
+915,Chrysalis,Chrysalis,3,,4,10,,,,,,,,,,,,,{},{},{}
+916,Feather_Of_Birds,Feather of Birds,3,,5,10,,,,,,,,,,,,,{},{},{}
+917,Talon,Talon,3,,10,10,,,,,,,,,,,,,{},{},{}
+918,Sticky_Webfoot,Sticky Webfoot,3,,5,10,,,,,,,,,,,,,{},{},{}
+919,Animal's_Skin,Animal Skin,3,,18,10,,,,,,,,,,,,,{},{},{}
+920,Claw_Of_Wolves,Wolf Claw,3,,29,10,,,,,,,,,,,,,{},{},{}
+921,Mushroom_Spore,Mushroom Spore,3,,18,10,,,,,,,,,,,,,{},{},{}
+922,Orcish_Cuspid,Orc's Fang,3,,110,10,,,,,,,,,,,,,{},{},{}
+923,Evil_Horn,Evil Horn,3,,510,10,,,,,,,,,,,,,{},{},{}
+924,Powder_Of_Butterfly,Powder of Butterfly,3,,45,10,,,,,,,,,,,,,{},{},{}
+925,Bill_Of_Birds,Bill of Birds,3,,32,10,,,,,,,,,,,,,{},{},{}
+926,Scale_Of_Snakes,Snake Scale,3,,41,10,,,,,,,,,,,,,{},{},{}
+928,Insect_Feeler,Insect Feeler,3,,57,10,,,,,,,,,,,,,{},{},{}
+929,Immortal_Heart,Immortal Heart,3,,187,10,,,,,,,,,,,,,{},{},{}
+930,Rotten_Bandage,Rotten Bandage,3,,179,10,,,,,,,,,,,,,{},{},{}
+931,Orcish_Voucher,Orcish Voucher,3,,84,10,,,,,,,,,,,,,{},{},{}
+932,Skel_Bone,Skel-Bone,3,,116,10,,,,,,,,,,,,,{},{},{}
+934,Mementos,Memento,3,,300,10,,,,,,,,,,,,,{},{},{}
+935,Shell,Shell,3,,7,10,,,,,,,,,,,,,{},{},{}
+936,Scales_Shell,Scale Shell,3,,233,10,,,,,,,,,,,,,{},{},{}
+937,Posionous_Canine,Venom Canine,3,,74,10,,,,,,,,,,,,,{},{},{}
+938,Sticky_Mucus,Sticky Mucus,3,,35,10,,,,,,,,,,,,,{},{},{}
+939,Bee_Sting,Bee Sting,3,,16,10,,,,,,,,,,,,,{},{},{}
+940,Grasshopper's_Leg,Grasshopper's Leg,3,,18,10,,,,,,,,,,,,,{},{},{}
+941,Nose_Ring,Nose Ring,3,,284,10,,,,,,,,,,,,,{},{},{}
+942,Yoyo_Tail,Yoyo Tail,3,,57,10,,,,,,,,,,,,,{},{},{}
+943,Solid_Shell,Solid Shell,3,,224,10,,,,,,,,,,,,,{},{},{}
+944,Horseshoe,Horseshoe,3,,294,10,,,,,,,,,,,,,{},{},{}
+945,Raccoon_Leaf,Raccoon Leaf,3,,53,10,,,,,,,,,,,,,{},{},{}
+946,Snail's_Shell,Snail's Shell,3,,32,10,,,,,,,,,,,,,{},{},{}
+947,Horn,Horn,3,,58,10,,,,,,,,,,,,,{},{},{}
+948,Bear's_Foot,Bear's Footskin,3,,87,10,,,,,,,,,,,,,{},{},{}
+949,Feather,Feather,3,,5,10,,,,,,,,,,,,,{},{},{}
+950,Heart_Of_Mermaid,Heart of Mermaid,3,,132,10,,,,,,,,,,,,,{},{},{}
+951,Fin,Fin,3,,206,10,,,,,,,,,,,,,{},{},{}
+952,Cactus_Needle,Cactus Needle,3,,41,10,,,,,,,,,,,,,{},{},{}
+953,Stone_Heart,Stone Heart,3,,92,10,,,,,,,,,,,,,{},{},{}
+954,Shining_Scales,Shining Scale,3,,233,10,,,,,,,,,,,,,{},{},{}
+955,Worm_Peelings,Worm Peeling,3,,26,10,,,,,,,,,,,,,{},{},{}
+956,Gill,Gill,3,,171,10,,,,,,,,,,,,,{},{},{}
+957,Decayed_Nail,Decayed Nail,3,,41,10,,,,,,,,,,,,,{},{},{}
+958,Horrendous_Mouth,Horrendous Mouth,3,,195,10,,,,,,,,,,,,,{},{},{}
+959,Rotten_Scale,Stinky Scale,3,,84,10,,,,,,,,,,,,,{},{},{}
+960,Nipper,Nipper,3,,57,10,,,,,,,,,,,,,{},{},{}
+961,Conch,Conch,3,,79,10,,,,,,,,,,,,,{},{},{}
+962,Tentacle,Tentacle,3,,35,10,,,,,,,,,,,,,{},{},{}
+963,Sharp_Scale,Sharp Scale,3,,125,10,,,,,,,,,,,,,{},{},{}
+964,Crap_Shell,Crab Shell,3,,45,10,,,,,,,,,,,,,{},{},{}
+965,Clam_Shell,Clam Shell,3,,28,10,,,,,,,,,,,,,{},{},{}
+966,Flesh_Of_Clam,Clam Flesh,3,,79,10,,,,,,,,,,,,,{},{},{}
+967,Turtle_Shell,Turtle Shell,3,,340,10,,,,,,,,,,,,,{},{},{}
+968,Voucher_Of_Orcish_Hero,Heroic Emblem,3,,1500,10,,,,,,,,,,,,,{},{},{}
+969,Gold,Gold,3,,100000,200,,,,,,,,,,,,,{},{},{}
+970,Alchol,Alcohol,3,,200,30,,,,,,,,,,,,,{},{},{}
+971,Detrimindexta,Detrimindexta,3,,200,30,,,,,,,,,,,,,{},{},{}
+972,Karvodailnirol,Karvodailnirol,3,,200,30,,,,,,,,,,,,,{},{},{}
+973,Counteragent,Counteragent,3,,100,70,,,,,,,,,,,,,{},{},{}
+974,Mixture,Mixture,3,,100,70,,,,,,,,,,,,,{},{},{}
+975,Scarlet_Dyestuffs,Scarlet Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+976,Lemon_Dyestuffs,Lemon Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+978,Cobaltblue_Dyestuffs,Cobaltblue Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+979,Darkgreen_Dyestuffs,Darkgreen Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+980,Orange_Dyestuffs,Orange Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+981,Violet_Dyestuffs,Violet Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+982,White_Dyestuffs,White Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+983,Black_Dyestuffs,Black Dyestuff,3,,500,150,,,,,,,,,,,,,{},{},{}
+984,Oridecon,Oridecon,3,,550,200,,,,,,,,,,,,,{},{},{}
+985,Elunium,Elunium,3,,550,200,,,,,,,,,,,,,{},{},{}
+986,Anvil,Anvil,3,,15000,500,,,,,,,,,,,,,{},{},{}
+987,Oridecon_Anvil,Oridecon Anvil,3,,60000,700,,,,,,,,,,,,,{},{},{}
+988,Golden_Anvil,Golden Anvil,3,,150000,900,,,,,,,,,,,,,{},{},{}
+989,Emperium_Anvil,Emperium Anvil,3,,300000,1000,,,,,,,,,,,,,{},{},{}
+990,Boody_Red,Red Blood,3,,500,50,,,,,,,,,,,,,{},{},{}
+991,Crystal_Blue,Crystal Blue,3,,500,50,,,,,,,,,,,,,{},{},{}
+992,Wind_Of_Verdure,Wind of Verdure,3,,500,50,,,,,,,,,,,,,{},{},{}
+993,Yellow_Live,Green Live,3,,500,50,,,,,,,,,,,,,{},{},{}
+994,Flame_Heart,Flame Heart,3,,1500,300,,,,,,,,,,,,,{},{},{}
+995,Mistic_Frozen,Mystic Frozen,3,,1500,300,,,,,,,,,,,,,{},{},{}
+996,Rough_Wind,Rough Wind,3,,1500,300,,,,,,,,,,,,,{},{},{}
+997,Great_Nature,Great Nature,3,,1500,300,,,,,,,,,,,,,{},{},{}
+998,Iron,Iron,3,,50,50,,,,,,,,,,,,,{},{},{}
+999,Steel,Steel,3,,500,100,,,,,,,,,,,,,{},{},{}
+1000,Star_Crumb,Star Crumb,3,,2250,100,,,,,,,,,,,,,{},{},{}
+1001,Sparkling_Dust,Star Dust,3,,750,10,,,,,,,,,,,,,{},{},{}
+1002,Iron_Ore,Iron Ore,3,,25,150,,,,,,,,,,,,,{},{},{}
+1003,Coal,Coal,3,,250,50,,,,,,,,,,,,,{},{},{}
+1004,Patriotism_Marks,Chivalry Emblem,3,,1,100,,,,,,,,,,,,,{},{},{}
+1005,Hammer_Of_Blacksmith,Hammer of Blacksmith,3,,1,800,,,,,,,,,,,,,{},{},{}
+1006,Old_Magic_Book,Old Magicbook,3,,1,30,,,,,,,,,,,,,{},{},{}
+1007,Penetration,Necklace of Wisdom,3,,1,40,,,,,,,,,,,,,{},{},{}
+1008,Frozen_Heart,Necklace of Oblivion,3,,1,100,,,,,,,,,,,,,{},{},{}
+1009,Sacred_Marks,Hand of God,3,,1,20,,,,,,,,,,,,,{},{},{}
+1010,Phracon,Phracon,3,,100,200,,,,,,,,,,,,,{},{},{}
+1011,Emveretarcon,Emveretarcon,3,,500,200,,,,,,,,,,,,,{},{},{}
+1012,Lizard_Scruff,Frill,3,,125,10,,,,,,,,,,,,,{},{},{}
+1013,Colorful_Shell,Rainbow Shell,3,,45,10,,,,,,,,,,,,,{},{},{}
+1014,Jaws_Of_Ant,Ant Jaw,3,,116,10,,,,,,,,,,,,,{},{},{}
+1015,Thin_N'_Long_Tongue,Tongue,3,,264,10,,,,,,,,,,,,,{},{},{}
+1016,Rat_Tail,Rat Tail,3,,26,10,,,,,,,,,,,,,{},{},{}
+1017,Moustache_Of_Mole,Mole Whiskers,3,,53,10,,,,,,,,,,,,,{},{},{}
+1018,Nail_Of_Mole,Mole Claw,3,,105,10,,,,,,,,,,,,,{},{},{}
+1019,Wooden_Block,Trunk,3,,30,10,,,,,,,,,,,,,{},{},{}
+1020,Long_Hair,Black Hair,3,,146,10,,,,,,,,,,,,,{},{},{}
+1021,Dokkaebi_Horn,Dokebi Horn,3,,146,10,,,,,,,,,,,,,{},{},{}
+1022,Fox_Tail,Nine Tails,3,,325,10,,,,,,,,,,,,,{},{},{}
+1023,Fish_Tail,Fish Tail,3,,98,10,,,,,,,,,,,,,{},{},{}
+1024,Chinese_Ink,Squid Ink,3,,132,10,,,,,,,,,,,,,{},{},{}
+1025,Spiderweb,Cobweb,3,,92,10,,,,,,,,,,,,,{},{},{}
+1026,Acorn,Acorn,3,,49,10,,,,,,,,,,,,,{},{},{}
+1027,Porcupine_Spike,Porcupine Quill,3,,79,10,,,,,,,,,,,,,{},{},{}
+1028,Wild_Boar's_Mane,Mane,3,,98,10,,,,,,,,,,,,,{},{},{}
+1029,Tiger's_Skin,Tiger Skin,3,,274,10,,,,,,,,,,,,,{},{},{}
+1030,Tiger_Footskin,Tiger's Footskin,3,,750,10,,,,,,,,,,,,,{},{},{}
+1031,Limb_Of_Mantis,Mantis Scythe,3,,98,10,,,,,,,,,,,,,{},{},{}
+1032,Blossom_Of_Maneater,Maneater Blossom,3,,98,10,,,,,,,,,,,,,{},{},{}
+1033,Root_Of_Maneater,Maneater Root,3,,104,10,,,,,,,,,,,,,{},{},{}
+1034,Cobold_Hair,Blue Hair,3,,171,10,,,,,,,,,,,,,{},{},{}
+1035,Dragon_Canine,Dragon Canine,3,,242,10,,,,,,,,,,,,,{},{},{}
+1036,Dragon_Scale,Dragon Scale,3,,250,10,,,,,,,,,,,,,{},{},{}
+1037,Dragon_Train,Dragon Tail,3,,600,10,,,,,,,,,,,,,{},{},{}
+1038,Petite_DiablOfs_Horn,Little Evil Horn,3,,264,10,,,,,,,,,,,,,{},{},{}
+1039,Petite_DiablOfs_Wing,Little Evil Wing,3,,1000,10,,,,,,,,,,,,,{},{},{}
+1040,Elder_Pixie's_Beard,Elder Pixie's Moustache,3,,116,10,,,,,,,,,,,,,{},{},{}
+1041,Lantern,Lantern,3,,125,10,,,,,,,,,,,,,{},{},{}
+1042,Short_Leg,Bug Leg,3,,215,10,,,,,,,,,,,,,{},{},{}
+1043,Nail_Of_Orc,Orc Claw,3,,84,10,,,,,,,,,,,,,{},{},{}
+1044,Tooth_Of_,Zenorc's Fang,3,,132,10,,,,,,,,,,,,,{},{},{}
+1045,Sacred_Masque,Cultish Masque,3,,206,10,,,,,,,,,,,,,{},{},{}
+1046,Tweezer,Scorpion Nipper,3,,307,10,,,,,,,,,,,,,{},{},{}
+1047,Head_Of_Medusa,Dead Medusa,3,,274,10,,,,,,,,,,,,,{},{},{}
+1048,Slender_Snake,Horrendous Hair,3,,400,10,,,,,,,,,,,,,{},{},{}
+1049,Skirt_Of_Virgin,Skirt of Virgin,3,,850,10,,,,,,,,,,,,,{},{},{}
+1050,Tendon,Tendon,3,,110,10,,,,,,,,,,,,,{},{},{}
+1051,Detonator,Detonator,3,,225,10,,,,,,,,,,,,,{},{},{}
+1052,Single_Cell,Single Cell,3,,23,10,,,,,,,,,,,,,{},{},{}
+1053,Tooth_Of_Ancient_Fish,Ancient Tooth,3,,274,10,,,,,,,,,,,,,{},{},{}
+1054,Lip_Of_Ancient_Fish,Ancient Lips,3,,500,10,,,,,,,,,,,,,{},{},{}
+1055,Earthworm_Peeling,Earthworm Peeling,3,,98,10,,,,,,,,,,,,,{},{},{}
+1056,Grit,Grit,3,,153,10,,,,,,,,,,,,,{},{},{}
+1057,Moth_Dust,Moth Dust,3,,69,10,,,,,,,,,,,,,{},{},{}
+1058,Wing_Of_Moth,Moth Wings,3,,100,10,,,,,,,,,,,,,{},{},{}
+1059,Transparent_Cloth,Fabric,3,,153,10,,,,,,,,,,,,,{},{},{}
+1060,Golden_Hair,Golden Hair,3,,215,10,,,,,,,,,,,,,{},{},{}
+1061,Starsand_Of_Witch,Witched Starsand,3,,242,10,,,,,,,,,,,,,{},{},{}
+1062,Pumpkin_Head,Jack o' Pumpkin,3,,187,10,,,,,,,,,,,,,{},{},{}
+1063,Sharpened_Cuspid,Fang,3,,340,10,,,,,,,,,,,,,{},{},{}
+1064,Reins,Reins,3,,401,10,,,,,,,,,,,,,{},{},{}
+1065,Booby_Trap,Trap,3,,50,10,,,,,,,,,,,,,{},{},{}
+1066,Tree_Of_Archer_1,Fine-grained Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
+1067,Tree_Of_Archer_2,Solid Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
+1068,Tree_Of_Archer_3,Barren Trunk,3,,1,10,,,,,,,,,,,,,{},{},{}
+1069,Mushroom_Of_Thief_1,Orange Net Mushroom,3,,1,10,,,,,,,,,,,,,{},{},{}
+1070,Mushroom_Of_Thief_2,Orange Gooey Mushroom,3,,1,10,,,,,,,,,,,,,{},{},{}
+1071,Mage_Test_1,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
+1072,Delivery_Message,Delivery Message,3,,1,10,,,,,,,,,,,,,{},{},{}
+1073,Merchant_Voucher_1,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1074,Merchant_Voucher_2,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1075,Merchant_Voucher_3,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1076,Merchant_Voucher_4,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1077,Merchant_Voucher_5,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1078,Merchant_Voucher_6,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1079,Merchant_Voucher_7,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1080,Merchant_Voucher_8,Voucher,3,,1,10,,,,,,,,,,,,,{},{},{}
+1081,Merchant_Box_1,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
+1082,Merchant_Box_2,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
+1083,Merchant_Box_3,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
+1084,Kapra's_Pass,Kafra Pass,3,,0,10,,,,,,,,,,,,,{},{},{}
+1085,Mage_Test_2,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
+1086,Mage_Test_3,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
+1087,Mage_Test_4,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
+1088,Morocc_Potion,Morocc Solution,3,,1,30,,,,,,,,,,,,,{},{},{}
+1089,Payon_Potion,Payon Solution,3,,1,30,,,,,,,,,,,,,{},{},{}
+1090,Mage_Test_Etc,Unknown Test Tube,3,,0,30,,,,,,,,,,,,,{},{},{}
+1091,Merchant_Box_Etc,Delivery Box,3,,1,1200,,,,,,,,,,,,,{},{},{}
+1092,Empty_Cylinder,Empty Test Tube,3,,2,20,,,,,,,,,,,,,{},{},{}
+1093,Empty_Potion,Empty Potion Bottle,3,,5,10,,,,,,,,,,,,,{},{},{}
+1094,Short_Daenggie,Short Daenggie,3,,139,10,,,,,,,,,,,,,{},{},{}
+1095,Needle_Of_Alarm,Clock Hand,3,,273,10,,,,,,,,,,,,,{},{},{}
+1096,Round_Shell,Round Shell,3,,477,10,,,,,,,,,,,,,{},{},{}
+1097,Worn_Out_Page,Worn Out Page,3,,410,10,,,,,,,,,,,,,{},{},{}
+1098,Manacles,Manacles,3,,329,10,,,,,,,,,,,,,{},{},{}
+1099,Worn_Out_Prison_Uniform,Worn-out Prison Uniform,3,,340,10,,,,,,,,,,,,,{},{},{}
+// Weapons
+//===================================================================
+// 1-Handed Swords
+1101,Sword,Sword,4,100,,500,25,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1102,Sword_,Sword,4,100,,500,25,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1103,Sword__,Sword,4,100,,500,25,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1104,Falchion,Falchion,4,1500,,600,39,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1105,Falchion_,Falchion,4,1500,,600,39,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1106,Falchion__,Falchion,4,1500,,600,39,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1107,Blade,Blade,4,2900,,700,53,,1,3,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1108,Blade_,Blade,4,2900,,700,53,,1,4,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1109,Blade__,Blade,4,2900,,700,53,,1,0,0x000654E3,7,2,2,1,2,1,2,{},{},{}
+1110,Lapier,Rapier,4,10000,,500,70,,1,2,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1111,Lapier_,Rapier,4,10000,,500,70,,1,3,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1112,Lapier__,Rapier,4,10000,,500,70,,1,0,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1113,Scimiter,Scimitar,4,17000,,700,85,,1,2,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1114,Scimiter_,Scimitar,4,17000,,700,85,,1,3,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1115,Scimiter__,Scimitar,4,17000,,700,85,,1,0,0x000654E3,7,2,2,2,14,1,2,{},{},{}
+1116,Katana,Katana,4,2000,,1000,60,,1,3,0x00004082,7,2,34,1,4,1,3,{},{},{}
+1117,Katana_,Katana,4,2000,,1000,60,,1,4,0x00004082,7,2,34,1,4,1,3,{},{},{}
+1118,Katana__,Katana,4,2000,,1000,60,,1,0,0x00004082,7,2,34,1,4,1,3,{},{},{}
+1119,Tsurugi,Tsurugi,4,51000,,1200,130,,1,1,0x000654E2,7,2,2,3,27,1,2,{},{},{}
+1120,Tsurugi_,Tsurugi,4,51000,,1200,130,,1,2,0x000654E2,7,2,2,3,27,1,2,{},{},{}
+1121,Tsurugi__,Tsurugi,4,51000,,1200,130,,1,0,0x000654E2,7,2,2,3,27,1,2,{},{},{}
+1122,Ring_Pommel_Saber,Ring Pommel Saber,4,24000,,900,100,,1,2,0x000654E2,7,2,2,2,14,1,2,{},{},{}
+1123,Haedonggum,Haedonggum,4,50000,,900,120,,1,1,0x000654E2,7,2,2,3,27,1,2,{ bonus bInt,3; },{},{}
+1124,Orcish_Sword,Orcish sword,4,,10,800,90,,1,0,0x000654E3,7,2,2,3,5,1,2,{ bonus bUnbreakableWeapon,0; },{},{}
+1125,Ring_Pommel_Saber_,Ring Pommel Saber,4,24000,,900,100,,1,3,0x000654E2,7,2,2,2,14,1,2,{},{},{}
+1126,Saber,Saber,4,49000,,1000,115,,1,2,0x000654E2,7,2,2,3,27,1,2,{},{},{}
+1127,Saber_,Saber,4,49000,,1000,115,,1,3,0x000654E2,7,2,2,3,27,1,2,{},{},{}
+1128,Hae_Dong_Gum_,Haedonggum,4,50000,,900,120,,1,2,0x000654E2,7,2,2,3,27,1,2,{ bonus bInt,3; },{},{}
+1129,Flamberge,Flamberge,4,60000,,1500,150,,1,0,0x00004080,7,2,2,3,27,1,2,{},{},{}
+1130,Nagan,Nagan,4,,10,500,120,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; },{},{}
+1131,Ice_Falchon,Ice Falchion,4,,10,600,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,100; skill 14,3; bonus3 bAutoSpell,14,3,100; },{},{}
+1132,Edge,Edge,4,,10,700,115,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,RC_NonBoss,10; },{},{}
+1133,Fire_Brand,Fireblend,4,,10,500,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; skill 19,3; bonus3 bAutoSpell,19,3,100; },{},{}
+1134,Scissores_Sword,Caesar's Sword,4,,10,700,140,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant; },{},{}
+1135,Cutlas,Cutlus,4,,10,900,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ skill 5,5; bonus bStr,2; bonus bDef,1; },{},{}
+1136,Solar_Sword,Solar Sword,4,,10,1200,85,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; bonus2 bHPDrainRate,1000,1; bonus2 bSPLossRate,15,10000; },{},{}
+1137,Excalibur,Excalibur,4,,10,1200,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,Ele_Holy; },{},{}
+1138,Mysteltainn_,Mysteltainn,4,,10,1000,170,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Ghost,15; bonus3 bAutoSpell,16,3,100; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3; },{},{}
+1139,Tale_Fing_,Tirfing,4,,10,1000,200,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bHPLossRate,35,10000; },{},{}
+1140,Byeorrun_Gum,Byeollungum,4,,10,900,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bSubRace,RC_NonBoss,-10; bonus2 bAddRace,RC_Boss,5; bonus bAllStats,2; },{},{}
+1141,Immaterial_Sword,Immaterial Sword,4,,10,900,140,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Ghost; bonus2 bSPVanishRate,30,30; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon,0; },{},{}
+1142,Jewel_Sword,Jeweled Sword,4,,10,2200,104,,1,0,0x000654E2,7,2,2,3,68,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Jewel,5; },{},{}
+1143,Gaia_Sword,Gaia Sword,4,,10,2500,115,,1,0,0x000654E2,7,2,2,3,74,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Ore,5; },{},{}
+1144,Sasimi,Sashimi,4,,10,1400,75,,1,0,0x000654E2,7,2,2,3,48,1,2,{ bonus bAtkEle,Ele_Wind; bonus3 bAddMonsterDropItem,544,RC_Fish,4000; },{},{}
+1145,Holy_Avenger,Holy Avenger,4,,10,1350,125,,1,0,0x00004000,7,2,2,3,75,1,2,{ bonus bAtkEle,Ele_Holy; },{},{}
+1146,Town_Sword,Town Sword,4,42000,,800,100,,1,1,0x00000001,7,2,2,3,30,1,2,{},{},{}
+1147,Town_Sword_,Town Sword,4,42000,,800,100,,1,2,0x00000001,7,2,2,3,30,1,2,{},{},{}
+1148,Star_Dust_Blade,Star Dust Blade,4,,10,1000,140,,1,1,0x00000001,7,2,2,4,45,1,2,{ bonus2 bAddEff,Eff_Stun,500; bonus bUnbreakableWeapon,0; },{},{}
+1149,Flamberge__,Flamberge,4,60000,,1500,150,,1,2,0x00004080,7,2,2,3,27,1,2,{},{},{}
+// 2-Handed Swords
+1151,Slayer,Slayer,4,15000,,1300,90,,1,2,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1152,Slayer_,Slayer,4,15000,,1300,90,,1,3,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1153,Slayer__,Slayer,4,15000,,1300,90,,1,0,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1154,Bastard_Sword,Bastard Sword,4,22500,,1600,115,,1,2,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1155,Bastard_Sword_,Bastard Sword,4,22500,,1600,115,,1,3,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1156,Bastard_Sword__,Bastard Sword,4,22500,,1600,115,,1,0,0x00004082,7,2,34,2,18,1,3,{},{},{}
+1157,Two_Hand_Sword,Two-Handed Sword,4,60000,,2200,160,,1,1,0x00004082,7,2,34,3,33,1,3,{},{},{}
+1158,Two_Hand_Sword_,Two-Handed Sword,4,60000,,2200,160,,1,2,0x00004082,7,2,34,3,33,1,3,{},{},{}
+1159,Two_Hand_Sword__,Two-Handed Sword,4,60000,,2200,160,,1,0,0x00004082,7,2,34,3,33,1,3,{},{},{}
+1160,Broad_Sword,Broad Sword,4,65000,,2000,140,,1,1,0x00004082,7,2,34,3,33,1,3,{ bonus bDef,5; },{},{}
+1161,Balmung,Balmung,4,,10,1000,250,,2,0,0xFFFFFFFF,7,2,2,4,48,1,1,{ bonus bInt,20; bonus bLuk,20; },{},{}
+1162,Broad_Sword_,Broad Sword,4,65000,,2000,140,,1,2,0x00004082,7,2,34,3,33,1,3,{ bonus bDef,5; },{},{}
+1163,Claymore,Claymore,4,74000,,2500,180,,1,0,0x00004080,7,2,34,3,33,1,3,{},{},{}
+1164,Muramasa,Muramasa,4,,10,1000,155,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bCritical,30; bonus bAspdRate,8; bonus2 bAddEff2,Eff_Curse,100; },{},{}
+1165,Masamune,Masamune,4,,10,1000,200,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bFlee,30; bonus bStr,-5; bonus bAspdRate,2; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{}
+1166,Dragon_Slayer,Dragon Slayer,4,,10,1300,150,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15; },{},{}
+1167,Schweizersabel,Schweizersabel,4,,10,1600,160,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,20,3,100; },{},{}
+1168,Zweihander,Zweihander,4,,10,2200,200,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bUnbreakableWeapon,0; },{},{}
+1169,Executioner_,Executioner,4,,10,2200,155,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bAtkEle,Ele_Dark; },{},{}
+1170,Katzbalger,Katzbalger,4,,10,2000,175,,1,0,0x00004082,7,2,34,4,48,1,3,{ bonus bVit,5; bonus bDef,10; },{},{}
+1171,Zweihander__,Zweihander,4,,10,2200,200,,1,2,0x00004082,7,2,34,4,48,1,3,{ bonus bUnbreakableWeapon,0; },{},{}
+1172,Claymore__,Claymore,4,74000,,2500,180,,1,2,0x00004080,7,2,34,3,33,1,3,{},{},{}
+// Daggers
+1201,Knife,Knife,4,50,,400,17,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1202,Knife_,Knife,4,50,,400,17,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1203,Knife__,Knife,4,50,,400,17,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1204,Cutter,Cutter,4,1250,,500,30,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1205,Cutter_,Cutter,4,1250,,500,30,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1206,Cutter__,Cutter,4,1250,,500,30,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1207,Main_Gauche,Main Gauche,4,2400,,600,43,,1,3,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1208,Main_Gauche_,Main Gauche,4,2400,,600,43,,1,4,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1209,Main_Gauche__,Main Gauche,4,2400,,600,43,,1,0,0xFE9F7EEF,7,2,2,1,1,1,1,{},{},{}
+1210,Dirk,Dirk,4,8500,,500,59,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1211,Dirk_,Dirk,4,8500,,500,59,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1212,Dirk__,Dirk,4,8500,,500,59,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1213,Dagger,Dagger,4,14000,,600,73,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1214,Dagger_,Dagger,4,14000,,600,73,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1215,Dagger__,Dagger,4,14000,,600,73,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1216,Stiletto,Stiletto,4,19500,,700,87,,1,2,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1217,Stiletto_,Stiletto,4,19500,,700,87,,1,3,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1218,Stiletto__,Stiletto,4,19500,,700,87,,1,0,0xFE9F7EEF,7,2,2,2,12,1,1,{},{},{}
+1219,Gladius,Gladius,4,43000,,700,105,,1,2,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
+1220,Gladius_,Gladius,4,43000,,700,105,,1,3,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
+1221,Gladius__,Gladius,4,43000,,700,105,,1,0,0x028F5EEE,7,2,2,3,24,1,1,{},{},{}
+1222,Damascus,Damascus,4,49000,,800,118,,1,1,0x028F5EEE,7,2,2,3,24,1,1,{ bonus bUnbreakableWeapon,0; },{},{}
+1223,Forturn_Sword,Fortune Sword,4,,10,500,90,,1,0,0x028F5EEE,7,2,2,4,24,1,1,{ bonus bLuk,5; bonus bFlee2,20; },{},{}
+1224,Sword_Breaker,Swordbreaker,4,,10,1000,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bBreakWeaponRate,500; },{},{}
+1225,Mail_Breaker,Mailbreaker,4,,10,1000,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bBreakArmorRate,500; },{},{}
+1226,Damascus_,Damascus,4,49000,,800,118,,1,2,0x028F5EEE,7,2,2,3,24,1,1,{ bonus bUnbreakableWeapon,0; },{},{}
+1227,Weeder_Knife,Weeder Knife,4,,10,400,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_Plant; bonus2 bAddRace,RC_Plant,15; bonus2 bSubRace,RC_Plant,15; },{},{}
+1228,Combat_Knife,Combat Knife,4,,10,400,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Demon,-10; },{},{}
+1229,Mama's_Knife,Kitchen Knife,4,,10,500,75,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bCritical,30; bonus2 bAddRace,RC_DemiHuman,3; bonus3 bAddMonsterDropItem,517,RC_Brute,5000; },{},{}
+1230,House_Auger,Ice Pick,4,,10,600,80,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; },{},{}
+1231,Bazerald,Bazerald,4,,10,500,70,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bAtkEle,Ele_Fire; bonus bInt,5; bonus bMatkRate,10; },{},{}
+1232,Assasin_Dagger,Assassin Dagger,4,,10,600,140,,1,0,0x00001000,7,2,2,4,36,1,1,{ bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdRate,2; bonus bAtkEle,Ele_Dark; },{},{}
+1233,Exercise,Exorciser,4,,10,700,90,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bIgnoreDefRace,RC_Demon; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_DemiHuman,-10; },{},{}
+1234,Moonlight_Sword,Moonlight Dagger,4,,10,700,50,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bMaxSPrate,10; bonus bSPDrainValue,3; },{},{}
+1235,Azoth,Azoth,4,,10,700,110,,1,0,0x00040000,7,2,2,4,36,1,1,{ bonus bClassChange,300; },{},{}
+1236,Sucsamad,Sucsamad,4,,10,800,140,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0; },{},{}
+1237,Grimtooth_,Grimtooth,4,,10,800,180,,1,0,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50; },{},{}
+1238,Zeny_Knife,Zeny Knife,4,,10,1200,64,,1,0,0x028F5EEE,7,2,2,3,70,1,1,{ bonus2 bGetZenyNum,10,100; },{},{}
+1239,Poison_Knife,Poison Knife,4,,10,800,64,,1,0,0x028F5EEE,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,3000; },{},{}
+1240,Princess_Knife,Princess Knife,4,,10,400,84,,1,0,0x028F5EEE,7,2,2,4,1,1,1,{ bonus bAllStats,1; },{},{}
+1241,Cursed_Dagger,Cursed Dagger,4,,10,400,55,,1,0,0x00810204,7,2,2,4,85,1,1,{ bonus2 bAddEff,Eff_Curse,500; },{},{}
+1242,Counter_Dagger,Dagger of Counter,4,,10,550,140,,1,0,0x00810204,7,2,2,4,55,1,1,{ bonus bCritical,90; },{},{}
+1243,Novice_Knife,Novice Main Gauche,4,,10,1,45,,1,0,0x00000001,7,2,2,1,1,0,1,{},{},{}
+1244,Holy_Dagger,Holy Dagger,4,,10,800,100,,1,0,0x028F5EEE,7,2,2,4,55,1,1,{ bonus bAtkEle,Ele_Holy; },{},{}
+1245,Cinquedea,Cinquedea,4,40000,,700,110,,1,1,0x00000001,7,2,2,3,30,1,1,{},{},{}
+1246,Cinquedea_,Cinquedea,4,40000,,700,110,,1,2,0x00000001,7,2,2,3,30,1,1,{},{},{}
+1247,Kindling_Dagger,Kindle Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Fire; },{},{}
+1248,Obsidian_Dagger,Obsidian Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Earth; },{},{}
+1249,Fisherman's_Dagger,Fisherman's Dagger,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Water; },{},{}
+// Katars
+1250,Jur,Jur,4,19500,,800,125,,1,2,0x00001000,7,2,34,2,18,1,16,{},{},{}
+1251,Jur_,Jur,4,19500,,800,125,,1,3,0x00001000,7,2,34,2,18,1,16,{},{},{}
+1252,Katar,Katar,4,41000,,1200,148,,1,1,0x00001000,7,2,34,3,33,1,16,{ bonus bDex,1; },{},{}
+1253,Katar_,Katar,4,41000,,1200,148,,1,2,0x00001000,7,2,34,3,33,1,16,{ bonus bDex,1; },{},{}
+1254,Jamadhar,Jamadhar,4,37200,,1500,165,,1,0,0x00001000,7,2,34,3,33,1,16,{},{},{}
+1255,Jamadhar_,Jamadhar,4,37200,,1500,165,,1,1,0x00001000,7,2,34,3,33,1,16,{},{},{}
+1256,Katar_Of_Cold_Icicle,Katar of Frozen Icicle,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; },{},{}
+1257,Katar_Of_Thornbush,Katar of Quaking,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Earth; bonus2 bAddEff,Eff_Blind,500; },{},{}
+1258,Katar_Of_Raging_Blaze,Katar of Raging Blaze,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500; },{},{}
+1259,Katar_Of_Piercing_Wind,Katar of Piercing Wind,4,45000,,1200,105,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Sleep,500; },{},{}
+1260,Ghoul_Leg,Sharpened Legbone of Ghoul,4,52500,,1700,150,,1,0,0x00001000,7,2,34,3,65,1,16,{ bonus bAtkEle,Ele_Undead; },{},{}
+1261,Infiltrator,Infiltrator,4,57000,,1500,140,,1,0,0x00001000,7,2,34,4,75,1,16,{ bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; },{},{}
+1262,Nail_Of_Loki,Loki's Nail,4,,10,1200,115,,1,0,0x00001000,7,2,34,3,55,1,16,{ bonus2 bAddEff,Eff_Bleeding,500; },{},{}
+1263,Unholy_Touch,Unholy Touch,4,,10,1250,151,,1,0,0x00001000,7,2,34,4,70,1,16,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,500; bonus bCritical,-1; bonus bUnbreakableWeapon,0; },{},{}
+1264,Various_Jur,Specialty Jur,4,,10,800,90,,1,4,0x00001000,7,2,34,1,0,1,16,{ bonus2 bAddEff2,Eff_Bleeding,50; },{},{}
+1265,Bloody_Roar,Bloody Roar,4,,10,1000,120,,1,0,0x00001000,7,2,34,4,75,1,16,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bFlee,-160; bonus bFlee2,-160; bonus bNoRegen,1; bonus bNoRegen,2; },{},{}
+1266,Infiltrator_,Infiltrator,4,57000,,1500,140,,1,1,0x00001000,7,2,34,4,75,1,16,{ bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; },{},{}
+// 1-Handed Axes
+1301,Axe,Axe,4,500,,800,38,,1,3,0x000654E3,7,2,2,1,3,1,6,{},{},{}
+1302,Axe_,Axe,4,500,,800,38,,1,4,0x000654E3,7,2,2,1,3,1,6,{},{},{}
+1303,Axe__,Axe,4,500,,800,38,,1,0,0x000654E3,7,2,2,1,3,1,6,{},{},{}
+1304,Orcish_Axe,Orcish Axe,4,,10,1500,75,,1,0,0x000454A3,7,2,2,3,3,1,6,{},{},{}
+1305,Cleaver,Cleaver,4,,10,1200,140,,1,0,0x000444A2,7,2,2,4,44,1,6,{ bonus2 bAddRace,RC_DemiHuman,5; bonus3 bAddMonsterDropItem,517,RC_Brute,30; },{},{}
+1306,War_Axe,War Axe,4,,10,4200,145,,1,1,0x00040400,7,2,2,3,76,1,6,{ bonus bDex,2; bonus bLuk,2; },{},{}
+1307,Windhawk,Windhawk,4,,10,1500,115,,1,0,0x000444A2,7,2,2,2,14,1,6,{ bonus bAspdRate,5; },{},{}
+1308,Golden_Axe,Golden Axe,4,,10,3000,170,,1,0,0xFFFFFFFE,7,2,2,4,45,1,6,{},{},{}
+// 2-Handed Axes
+1351,Battle_Axe,Battle Axe,4,5400,,1500,80,,1,3,0x000444A2,7,2,34,1,3,1,7,{},{},{}
+1352,Battle_Axe_,Battle Axe,4,5400,,1500,80,,1,4,0x000444A2,7,2,34,1,3,1,7,{},{},{}
+1353,Battle_Axe__,Battle Axe,4,5400,,1500,80,,1,0,0x000444A2,7,2,34,1,3,1,7,{},{},{}
+1354,Hammer,Hammer,4,15500,,2000,120,,1,2,0x000444A2,7,2,34,2,16,1,7,{},{},{}
+1355,Hammer_,Hammer,4,15500,,2000,120,,1,3,0x000444A2,7,2,34,2,16,1,7,{},{},{}
+1356,Hammer__,Hammer,4,15500,,2000,120,,1,0,0x000444A2,7,2,34,2,16,1,7,{},{},{}
+1357,Buster,Buster,4,34000,,2200,155,,1,1,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1358,Buster_,Buster,4,34000,,2200,155,,1,2,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1359,Buster__,Buster,4,34000,,2200,155,,1,0,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1360,Two_Handed_Axe,Two-Handed Axe,4,55000,,2500,185,,1,1,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1361,Two_Handed_Axe_,Two-Handed Axe,4,55000,,2500,185,,1,2,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1362,Two_Handed_Axe__,Two-Handed Axe,4,55000,,2500,185,,1,0,0x000444A2,7,2,34,3,30,1,7,{},{},{}
+1363,Brood_Axe,Bloody Axe,4,,10,4000,170,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bStr,10; bonus bSpeedRate,25; },{},{}
+1364,Great_Axe,Great Axe,4,,10,1800,187,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bAddSkillBlow,42,5; bonus2 bAddEff,Eff_Stun,1500; },{},{}
+1365,Sabbath,Sabbath,4,,10,2300,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_Demon,50; bonus bAtkEle,Ele_Dark; bonus2 bCriticalAddRace,RC_Undead,50; },{},{}
+1366,Right_Epsilon,Light Epsilon,4,,10,2300,180,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Holy; skill 28,3; bonus2 bAddRace,RC_Demon,3; },{},{}
+1367,Slaughter,Slaughter,4,,10,2500,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40; bonus bAtkEle,Ele_Earth; },{},{}
+1368,Tomahawk,Tomahawk,4,,10,2500,165,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Wind; skill 337,1; },{},{}
+1369,Guillotine,Guillotine,4,,10,3000,215,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPGainRace,RC_DemiHuman,20; },{},{}
+// 1-Handed Spears
+1401,Javelin,Javelin,4,150,,700,28,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1402,Javelin_,Javelin,4,150,,700,28,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1403,Javelin__,Javelin,4,150,,700,28,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1404,Spear,Spear,4,1700,,850,44,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1405,Spear_,Spear,4,1700,,850,44,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1406,Spear__,Spear,4,1700,,850,44,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1407,Pike,Pike,4,3450,,1000,60,,3,3,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1408,Pike_,Pike,4,3450,,1000,60,,3,4,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1409,Pike__,Pike,4,3450,,1000,60,,3,0,0x00004082,7,2,2,1,4,1,4,{},{},{}
+1410,Lance,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1411,Lance_,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1412,Lance__,Lance,4,60000,,2500,185,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1413,Gungnir,Gungnir,4,,10,500,120,,3,0,0x00004082,7,2,2,4,4,1,4,{ bonus bAtkEle,Ele_Wind; bonus bPerfectHitRate,25; bonus bHit,30; },{},{}
+1414,Gelerdria,Gelerdria,4,,10,700,145,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus bAtkEle,Ele_Earth; bonus bMaxHP,800; bonus bMaxSP,-50; },{},{}
+1415,Skewer,Brocca,4,,10,850,100,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus bIgnoreDefRace,RC_NonBoss; bonus2 bAddEle,Ele_Neutral,25; },{},{}
+1416,Tjungkuletti,Tjungkuletti,4,,10,1000,95,,3,0,0x00004082,7,2,2,4,48,1,4,{ bonus2 bSPDrainValue,1,1; bonus bSPGainValue,5; },{},{}
+1417,Pole_Axe,Pole Axe,4,,10,3800,160,,3,1,0x00004082,7,2,2,3,71,1,4,{ bonus bStr,1; bonus bInt,2; bonus bDex,1; },{},{}
+1418,Gungnir__,Gungnir,4,,10,500,120,,3,2,0x00004082,7,2,2,4,4,1,4,{ bonus bAtkEle,Ele_Wind; bonus bPerfectHitRate,25; bonus bHit,30; },{},{}
+// 2-Handed Spears
+1451,Guisarme,Guisarme,4,13000,,1000,84,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1452,Guisarme_,Guisarme,4,13000,,1000,84,,3,3,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1453,Guisarme__,Guisarme,4,13000,,1000,84,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1454,Glaive,Glaive,4,20000,,1200,104,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1455,Glaive_,Glaive,4,20000,,1200,104,,3,3,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1456,Glaive__,Glaive,4,20000,,1200,104,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1457,Partizan,Partizan,4,27700,,2000,124,,3,1,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1458,Partizan_,Partizan,4,27700,,2000,124,,3,2,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1459,Partizan__,Partizan,4,27700,,2000,124,,3,0,0x00004082,7,2,34,2,18,1,5,{},{},{}
+1460,Trident,Trident,4,51000,,1200,150,,3,2,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1461,Trident_,Trident,4,51000,,1200,150,,3,3,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1462,Trident__,Trident,4,51000,,1200,150,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1463,Halberd,Halberd,4,54000,,2500,165,,3,1,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1464,Halberd_,Halberd,4,54000,,2500,165,,3,2,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1465,Halberd__,Halberd,4,54000,,2500,165,,3,0,0x00004082,7,2,34,3,33,1,5,{},{},{}
+1466,Crescent_Scythe,Crescent Scythe,4,,10,2500,180,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bCritical,30; bonus bHit,10; },{},{}
+1467,Bill_Guisarme,Bill Guisarme,4,,10,1000,183,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiHuman,5; },{},{}
+1468,Zephyrus,Zephyrus,4,,10,2000,170,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,100; },{},{}
+1469,Longinus's_Spear,Longinus's Spear,4,,10,2500,180,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Angel,10; },{},{}
+1470,Brionac,Brionac,4,,10,3000,190,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Holy; skill 28,5; bonus3 bAutoSpell,13,3,100; bonus2 bAddRace,RC_Boss,5; },{},{}
+1471,Hell_Fire,Hellfire,4,,10,3500,200,,3,0,0x00004082,7,2,34,4,48,1,5,{ bonus bAtkEle,Ele_Fire; bonus3 bAutoSpell,17,3,100; bonus bStr,3; },{},{}
+// 2-Handed Staffs
+1472,Staff_Of_Soul,Soul Staff,4,,10,1400,25,,1,0,0x00810204,7,2,34,3,73,1,10,{ bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15; },{},{}
+1473,Wizardy_Staff,Wizardry Staff,4,,10,2400,120,,1,0,0x00810204,7,2,34,4,90,1,10,{ bonus bInt,6; bonus bDex,2; bonus bMatkRate,15; },{},{}
+// 2-Handed Spears
+1474,Gae_Bolg,Gae Bolg,4,,10,2000,160,,3,0,0x00004082,7,2,34,4,60,1,5,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Boss,10; },{},{}
+1475,Horseback_Lance,Equestrian's Spear,4,,10,3700,200,,3,0,0x00004082,7,2,34,4,75,1,5,{},{},{}
+1476,Crescent_Scythe_,Crescent Scythe,4,,10,2500,180,,3,1,0x00004082,7,2,34,4,48,1,5,{ bonus bCritical,30; bonus bHit,10; },{},{}
+// Maces
+1501,Club,Club,4,120,,700,23,,1,3,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1502,Club_,Club,4,120,,700,23,,1,4,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1503,Club__,Club,4,120,,700,23,,1,0,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1504,Mace,Mace,4,1600,,800,37,,1,3,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1505,Mace_,Mace,4,1600,,800,37,,1,4,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1506,Mace__,Mace,4,1600,,800,37,,1,0,0x0004C5B3,7,2,2,1,2,1,8,{},{},{}
+1507,Smasher,Smasher,4,9000,,1000,54,,1,2,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
+1508,Smasher_,Smasher,4,9000,,1000,54,,1,3,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
+1509,Smasher__,Smasher,4,9000,,1000,54,,1,3,0x0004C5B3,7,2,2,2,14,1,8,{},{},{}
+1510,Flail,Flail,4,16000,,900,69,,1,2,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1511,Flail_,Flail,4,16000,,900,69,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1512,Flail__,Flail,4,16000,,900,69,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1513,Morning_Star,Morning Star,4,41000,,1500,110,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1514,Morning_Star_,Morning Star,4,41000,,1500,110,,1,2,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1515,Morning_Star__,Morning Star,4,41000,,1500,110,,1,2,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1516,Sword_Mace,Sword Mace,4,50000,,1200,130,,1,0,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1517,Sword_Mace_,Sword Mace,4,50000,,1200,130,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1518,Sword_Mace__,Sword Mace,4,50000,,1200,130,,1,1,0x0004C5B2,7,2,2,3,27,1,8,{},{},{}
+1519,Chain,Chain,4,23000,,800,84,,1,2,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1520,Chain_,Chain,4,23000,,800,84,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1521,Chain__,Chain,4,23000,,800,84,,1,3,0x0004C5B2,7,2,2,2,14,1,8,{},{},{}
+1522,Stunner,Stunner,4,60000,,2000,140,,1,0,0x00008110,7,2,2,3,27,1,8,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
+1523,Spike,Spike,4,,10,700,85,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{}
+1524,Golden_Mace,Golden Mace,4,,10,800,110,,1,1,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0; },{},{}
+1525,Long_Mace,Long Mace,4,,10,800,135,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bLongAtkDef,10; bonus bAtkRange,3; },{},{}
+1526,Slash,Slash,4,,10,1000,145,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{}
+1527,Quadrille,Quadrille,4,,10,900,165,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEle,Ele_Earth,10; },{},{}
+1528,Grand_Cross,Grand Cross,4,,10,1500,140,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,77,3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3; },{},{}
+1529,Iron_Driver,Iron Driver,4,,10,3000,155,,1,0,0x00008100,7,2,2,3,78,1,8,{ bonus bAtkRange,1; },{},{}
+1530,Mjolnir,Mjolnir,4,,10,6000,250,,1,0,0x000444A2,7,2,2,4,95,0,8,{ bonus bAtkEle,Ele_Wind; bonus bDex,40; bonus bStr,15; bonus bAspdRate,10; bonus bUnbreakableWeapon,0; },{},{}
+1531,Spanner,Wrench,4,,10,2500,115,,1,0,0x00008110,7,2,2,3,55,1,8,{ bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Stun,100; bonus2 bAddEff,Eff_Poison,100; bonus2 bAddEff,Eff_Freeze,100; },{},{}
+1532,Stunner__,Stunner,4,60000,,2000,140,,1,2,0x00008110,7,2,2,3,27,1,8,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
+1533,Warrior's_Balmung,Warrior's Balmung,4,,10,1000,170,,1,0,0xFFFFFFFF,7,2,2,4,48,1,2,{ bonus bAllStats,5; },{},{}
+// Books
+1550,Book,Book,4,30000,,600,85,,1,3,0x00410100,7,2,2,2,14,1,15,{},{},{}
+1551,Bible,Bible,4,60000,,1000,115,,1,2,0x00410100,7,2,2,3,27,1,15,{ bonus bInt,2; },{},{}
+1552,Tablet,Tablet,4,51000,,800,125,,1,1,0x00410100,7,2,2,3,27,1,15,{},{},{}
+1553,Book_Of_Billows,Book of Billows,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Water; },{},{}
+1554,Book_Of_Mother_Earth,Book of Mother Earth,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Earth; },{},{}
+1555,Book_Of_Blazing_Sun,Book of the Blazing Sun,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Fire; },{},{}
+1556,Book_Of_Gust_Of_Wind,Book of Gust of Wind,4,35000,,750,90,,1,0,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Wind; },{},{}
+1557,Book_Of_The_Apocalypse,Book of the Apocalypse,4,35000,,800,120,,1,0,0x00410100,7,2,2,4,40,1,15,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Holy,5; bonus2 bAddEle,Ele_Water,7; bonus2 bAddEle,Ele_Earth,7; bonus2 bAddEle,Ele_Fire,7; bonus2 bAddEle,Ele_Wind,7; },{},{}
+1558,Girl's_Diary,Girl's Diary,4,,10,300,60,,1,1,0x00410100,7,2,2,4,40,1,15,{ bonus2 bAddDamageClass,1188,150; },{},{}
+1559,Legacy_Of_Dragon,Legacy of Dragon,4,,10,700,130,,1,0,0x00410100,7,2,2,4,70,1,15,{ bonus bInt,3; bonus bIgnoreDefRace,RC_Dragon; bonus2 bSPGainRace,RC_Dragon,10; },{},{}
+1560,Diary_Of_Great_Sage,Sage's Diary,4,,10,1100,100,,1,2,0x00410100,7,2,2,3,60,1,15,{ bonus bMatkRate,15; if(readparam(bStr)>=50) bonus bAspdRate,5; if(readparam(bInt)>=70) bonus bMatkRate,5; },{},{}
+1561,Hardback,Hardcover Book,4,,10,1500,140,,1,1,0x00410100,7,2,2,4,55,1,15,{ bonus bStr,3; bonus bDex,2; },{},{}
+1562,Bible_Of_Battlefield,Battlefield Textbook,4,,10,700,110,,1,1,0x00410100,7,2,2,4,80,1,15,{ bonus bInt,3; bonus4 bAutoSpell,34,3+(getskilllv(34)>3)*(getskilllv(34)-3),10,0; },{},{}
+1599,Angra_Manyu,Angra Manyu,4,120,,10,1,,1,4,0x000FDFFF,7,2,2,4,2,1,8,{ bonus bBaseAtk,3800; bonus2 bHPDrainRate,1000,100; },{},{}
+// Staffs
+1601,Rod,Rod,4,50,,400,15,,1,3,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
+1602,Rod_,Rod,4,50,,400,15,,1,4,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
+1603,Rod__,Rod,4,50,,400,15,,1,0,0x00818315,7,2,2,1,1,1,10,{ bonus bMatkRate,15; },{},{}
+1604,Wand,Wand,4,2500,,400,25,,1,2,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
+1605,Wand_,Wand,4,2500,,400,25,,1,3,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
+1606,Wand__,Wand,4,2500,,400,25,,1,0,0x00818315,7,2,2,2,12,1,10,{ bonus bInt,1; bonus bMatkRate,15; },{},{}
+1607,Staff,Staff,4,9500,,400,40,,1,2,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
+1608,Staff_,Staff,4,9500,,400,40,,1,3,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
+1609,Staff__,Staff,4,9500,,400,40,,1,0,0x00818314,7,2,2,2,12,1,10,{ bonus bInt,2; bonus bMatkRate,15; },{},{}
+1610,Arc_Wand,Arc Wand,4,45000,,400,60,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
+1611,Arc_Wand_,Arc Wand,4,45000,,400,60,,1,2,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
+1612,Arc_Wand__,Arc Wand,4,45000,,400,60,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
+1613,Mighty_Staff,Mighty Staff,4,,10,700,130,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bStr,10; bonus bMatkRate,15; bonus bSPDrainValue,-2; },{},{}
+1614,Blessed_Wand,Wand of Occult,4,,10,700,75,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; },{},{}
+1615,Bone_Wand,Evil Bone Wand,4,,10,700,40,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,4; bonus bAtkEle,Ele_Undead; bonus bMatkRate,15; },{},{}
+1616,Staff_Of_Wing,Wing Staff,4,86000,,500,60,,1,0,0x00810204,7,2,2,4,40,1,10,{ bonus bMatkRate,15; bonus bCastrate,-5; },{},{}
+1617,Survival_Rod,Survivor's Rod,4,85000,,1000,50,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bDex,2; bonus bMatkRate,15; bonus bMaxHP,300; },{},{}
+1618,Survival_Rod_,Survivor's Rod,4,85000,,1000,50,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bDex,3; bonus bMatkRate,15; bonus bMaxHP,400; },{},{}
+1619,Survival_Rod2,Survivor's Rod,4,85000,,1000,50,,1,0,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,2; bonus bMatkRate,15; bonus bMaxHP,300; },{},{}
+1620,Survival_Rod2_,Survivor's Rod,4,85000,,1000,50,,1,1,0x00818314,7,2,2,3,24,1,10,{ bonus bInt,3; bonus bMatkRate,15; bonus bMaxHP,400; },{},{}
+1621,Hypnotist's_Staff,Hypnotist's Staff,4,86000,,500,70,,1,1,0x00000001,7,2,2,3,30,1,10,{ bonus bInt,1; bonus bMatkRate,25; },{},{}
+1622,Hypnotist's_Staff_,Hypnotist's Staff,4,86000,,500,70,,1,2,0x00000001,7,2,2,3,30,1,10,{ bonus bInt,1; bonus bMatkRate,25; },{},{}
+// Bows
+1701,Bow,Bow,4,1000,,500,15,,5,3,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1702,Bow_,Bow,4,1000,,500,15,,5,4,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1703,Bow__,Bow,4,1000,,500,15,,5,0,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1704,Composite_Bow,Composite Bow,4,2500,,600,29,,5,3,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1705,Composite_Bow_,Composite Bow,4,2500,,600,29,,5,4,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1706,Composite_Bow__,Composite Bow,4,2500,,600,29,,5,0,0x000A0848,7,2,34,1,4,1,11,{},{},{}
+1707,Great_Bow,Great Bow,4,10000,,1000,50,,5,2,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1708,Great_Bow_,Great Bow,4,10000,,1000,50,,5,3,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1709,Great_Bow__,Great Bow,4,10000,,1000,50,,5,0,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1710,CrossBow,Crossbow,4,17000,,900,65,,5,2,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1711,CrossBow_,Crossbow,4,17000,,900,65,,5,3,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1712,CrossBow__,Crossbow,4,17000,,900,65,,5,0,0x000A0848,7,2,34,2,18,1,11,{},{},{}
+1713,Arbalest,Arbalest,4,48000,,1000,90,,5,1,0x000A0848,7,2,34,3,33,1,11,{ bonus bDex,2; },{},{}
+1714,Kakkung,Gakkung Bow,4,42000,,1100,100,,5,1,0x000A0848,7,2,34,3,33,1,11,{},{},{}
+1715,Arbalest_,Arbalest,4,48000,,1000,90,,5,2,0x000A0848,7,2,34,3,33,1,11,{ bonus bDex,2; },{},{}
+1716,Kakkung_,Gakkung Bow,4,42000,,1100,100,,5,2,0x000A0848,7,2,34,3,33,1,11,{},{},{}
+1718,Hunter_Bow,Hunter Bow,4,64000,,1500,125,,5,0,0x00000800,7,2,34,3,33,1,11,{},{},{}
+1719,Bow_Of_Roguemaster,Roguemaster's Bow,4,,10,500,75,,11,0,0x00000040,7,2,34,4,48,1,11,{},{},{}
+1720,Bow_Of_Rudra,Rudra Bow,4,,10,1200,150,,5,0,0x000A0808,7,2,34,4,48,1,11,{ bonus bAtkEle,Ele_Holy; bonus bInt,5; skill 35,1; skill 28,1; bonus2 bResEff,Eff_Poison,5000; bonus2 bResEff,Eff_Curse,5000; bonus2 bResEff,Eff_Silence,5000; bonus2 bResEff,Eff_Confusion,5000; bonus2 bResEff,Eff_Blind,5000; },{},{}
+1721,Repeting_CrossBow,Repeating Crossbow,4,89000,,2000,95,,9,1,0x00020840,7,2,34,3,65,1,11,{},{},{}
+1722,Balistar,Ballista,4,,10,3500,145,,5,0,0x00080800,7,2,34,4,77,1,11,{},{},{}
+1723,Luna_Bow,Luna Bow,4,,10,2000,100,,5,2,0x00000800,7,2,34,3,30,1,11,{ bonus bDef,2+3*(getrefine()>9)+(getrefine()>6 && getrefine()<=9); },{},{}
+1724,Dragon_Wing,Dragon Wing,4,,10,1200,100,,5,0,0x000A0848,7,2,34,4,60,1,11,{ bonus3 bAddMonsterDropItem,1765,RC_Dragon,300; bonus bIgnoreDefRace,RC_Dragon; },{},{}
+1725,Wandering_Bard's_Bow,Minstrel Bow,4,,10,1700,120,,5,1,0x00080800,7,2,34,4,70,1,11,{ bonus bInt,2; bonus bSPrecovRate,10; },{},{}
+1726,Hunter_Bow_,Hunter Bow,4,64000,,1500,125,,5,1,0x00000800,7,2,34,3,33,1,11,{},{},{}
+1727,Ballista_,Ballista,4,,10,3500,145,,5,1,0x00080800,7,2,34,4,77,1,11,{},{},{}
+// Arrows
+1750,Arrow,Arrow,10,1,,1,25,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
+1751,Silver_Arrow,Silver Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; },{},{}
+1752,Fire_Arrow,Fire Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Fire; },{},{}
+1753,Steel_Arrow,Steel Arrow,10,2,,2,40,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
+1754,Crystal_Arrow,Crystal Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Water; },{},{}
+1755,Arrow_Of_Wind,Arrow of Wind,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Wind; },{},{}
+1756,Stone_Arrow,Stone Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Earth; },{},{}
+1757,Immatrial_Arrow,Immaterial Arrow,10,3,,1,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Ghost; },{},{}
+1758,Stun_Arrow,Stun Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Stun,1000; },{},{}
+1759,Freezing_Arrow,Frozen Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,1000; },{},{}
+1760,Flash_Arrow,Flash Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Blind,1000; },{},{}
+1761,Curse_Arrow,Cursed Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Curse,1000; },{},{}
+1762,Rusty_Arrow,Rusty Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Poison; },{},{}
+1763,Poison_Arrow,Poison Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,2000; },{},{}
+1764,Incisive_Arrow,Sharp Arrow,10,3,,3,10,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bCritical,10; },{},{}
+1765,Oridecon_Arrow,Oridecon Arrow,10,3,,3,50,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
+1766,Arrow_Of_Counter_Evil,Arrow of Counter Evil,10,40,,3,50,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; },{},{}
+1767,Arrow_Of_Shadow,Shadow Arrow,10,3,,2,30,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Dark; },{},{}
+1768,Sleep_Arrow,Sleep Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Sleep,2000; },{},{}
+1769,Silence_Arrow,Mute Arrow,10,3,,3,1,,,,0x000A0848,7,2,32768,,1,,1,{ bonus2 bAddEff,Eff_Silence,1000; },{},{}
+1770,Iron_Arrow,Iron Arrow,10,2,,1,30,,,,0x000A0848,7,2,32768,,1,,1,{},{},{}
+1771,Venom_Knife,Venom Knife,10,50,,5,30,,,,0x00001000,7,2,32768,,1,,2,{},{},{}
+1772,Holy_Arrow,Holy Arrow,10,3,,2,50,,,,0x000A0848,7,2,32768,,1,,1,{ bonus bAtkEle,Ele_Holy; bonus2 bAddRace,RC_Demon,5; },{},{}
+// Knuckles
+1801,Waghnakh,Waghnak,4,8000,,400,30,,1,3,0x00008100,7,2,2,1,1,1,12,{},{},{}
+1802,Waghnakh_,Waghnak,4,8000,,400,30,,1,4,0x00008100,7,2,2,1,1,1,12,{},{},{}
+1803,Knuckle_Duster,Knuckle Duster,4,25000,,450,50,,1,2,0x00008100,7,2,2,2,12,1,12,{},{},{}
+1804,Knuckle_Duster_,Knuckle Duster,4,25000,,450,50,,1,3,0x00008100,7,2,2,2,12,1,12,{},{},{}
+1805,Hora,Studded Knuckles,4,32000,,450,65,,1,2,0x00008100,7,2,2,2,12,1,12,{},{},{}
+1806,Hora_,Studded Knuckles,4,32000,,450,65,,1,3,0x00008100,7,2,2,2,12,1,12,{},{},{}
+1807,Fist,Fist,4,53000,,650,115,,1,0,0x00008100,7,2,2,3,24,1,12,{},{},{}
+1808,Fist_,Fist,4,53000,,650,115,,1,1,0x00008100,7,2,2,3,24,1,12,{},{},{}
+1809,Claw,Claw,4,67000,,500,86,,1,1,0x00008100,7,2,2,3,24,1,12,{ bonus bStr,2; },{},{}
+1810,Claw_,Claw,4,67000,,500,86,,1,2,0x00008100,7,2,2,3,24,1,12,{ bonus bStr,2; },{},{}
+1811,Finger,Finger,4,58000,,500,97,,1,1,0x00008100,7,2,2,3,24,1,12,{},{},{}
+1812,Finger_,Finger,4,58000,,500,97,,1,2,0x00008100,7,2,2,3,24,1,12,{},{},{}
+1813,Kaiser_Knuckle,Kaiser Knuckle,4,,10,450,110,,1,0,0x00008100,7,2,2,4,36,1,12,{ bonus bAtkEle,Ele_Wind; bonus2 bAddRace,RC_Undead,5; bonus2 bAddEle,Ele_Water,10; bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Fire,10; bonus2 bAddEle,Ele_Wind,10; },{},{}
+1814,Berserk,Berserk,4,,10,500,120,,1,0,0x00008100,7,2,2,4,36,1,12,{ bonus bAspdRate,12; },{},{}
+1815,Claw_Of_Garm,Garm Claw,4,,10,550,152,,1,1,0x00008100,7,2,2,4,70,1,12,{ bonus bAtkEle,Ele_Dark; bonus bMaxHPrate,-2; bonus2 bAddEff,Eff_Bleeding,500; },{},{}
+1816,Berserk_,Berserk,4,,10,500,120,,1,1,0x00008100,7,2,2,4,36,1,12,{ bonus bAspdRate,12; },{},{}
+// Instruments
+1901,Violin,Violin,4,4000,,700,50,,1,3,0x00080000,7,1,2,1,2,1,13,{},{},{}
+1902,Violin_,Violin,4,4000,,700,50,,1,4,0x00080000,7,1,2,1,2,1,13,{},{},{}
+1903,Mandolin,Mandolin,4,18000,,400,90,,1,2,0x00080000,7,1,2,2,14,1,13,{},{},{}
+1904,Mandolin_,Mandolin,4,18000,,400,90,,1,3,0x00080000,7,1,2,2,14,1,13,{},{},{}
+1905,Lute,Lute,4,24500,,500,105,,1,2,0x00080000,7,1,2,2,14,1,13,{},{},{}
+1906,Lute_,Lute,4,24500,,500,105,,1,3,0x00080000,7,1,2,2,14,1,13,{},{},{}
+1907,Guitar,Guitar,4,47000,,900,142,,1,0,0x00080000,7,1,2,3,27,1,13,{},{},{}
+1908,Guitar_,Guitar,4,47000,,900,142,,1,1,0x00080000,7,1,2,3,27,1,13,{},{},{}
+1909,Harp,Harp,4,62000,,900,114,,1,1,0x00080000,7,1,2,3,27,1,13,{ bonus bInt,2; },{},{}
+1910,Harp_,Harp,4,62000,,900,114,,1,2,0x00080000,7,1,2,3,27,1,13,{ bonus bInt,2; },{},{}
+1911,Guh_Moon_Goh,Gumoongoh,4,54000,,1300,126,,1,1,0x00080000,7,1,2,3,27,1,13,{},{},{}
+1912,Guh_Moon_Goh_,Gumoongoh,4,54000,,1300,126,,1,2,0x00080000,7,1,2,3,27,1,13,{},{},{}
+1913,Electronic_Guitar,Electric Guitar,4,,10,1800,110,,1,0,0x00080000,7,1,2,4,70,1,13,{ skill 84,1; bonus3 bAutoSpell,84,1,100; bonus bAtkEle,Ele_Wind; bonus bInt,2; bonus bAgi,1; },{},{}
+1914,Guitar_Of_Passion,Burning Passion Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Fire; },{},{}
+1915,Guitar_Of_Blue_Solo,Loner's Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Water; },{},{}
+1916,Guitar_Of_Vast_Land,Green Acre Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Earth; },{},{}
+1917,Guitar_Of_Gentle_Breeze,Gentle Breeze Guitar,4,,10,900,110,,1,0,0x00080000,7,1,2,3,27,1,13,{ bonus bAtkEle,Ele_Wind; },{},{}
+1918,Oriental_Lute,Oriental Lute,4,,10,1200,150,,1,0,0x00080000,7,1,2,4,65,1,13,{ bonus2 bSkillAtk,394,10; bonus2 bSkillAtk,316,10; },{},{}
+// Whips
+1950,Rope,Rope,4,2500,,400,45,,2,3,0x00080000,7,0,2,1,3,1,14,{},{},{}
+1951,Rope_,Rope,4,2500,,400,45,,2,4,0x00080000,7,0,2,1,3,1,14,{},{},{}
+1952,Line,Whip,4,12000,,300,80,,2,2,0x00080000,7,0,2,2,16,1,14,{},{},{}
+1953,Line_,Whip,4,12000,,300,80,,2,3,0x00080000,7,0,2,2,16,1,14,{},{},{}
+1954,Wire,Wire Whip,4,17500,,1000,95,,2,2,0x00080000,7,0,2,2,16,1,14,{},{},{}
+1955,Wire_,Wire Whip,4,17500,,1000,95,,2,3,0x00080000,7,0,2,2,16,1,14,{},{},{}
+1956,Rante,Rante Whip,4,32000,,900,135,,2,0,0x00080000,7,0,2,3,30,1,14,{},{},{}
+1957,Rante_,Rante Whip,4,32000,,900,135,,2,1,0x00080000,7,0,2,3,30,1,14,{},{},{}
+1958,Tail,Tail Whip,4,41000,,700,105,,2,1,0x00080000,7,0,2,3,30,1,14,{ bonus bLuk,3; },{},{}
+1959,Tail_,Tail Whip,4,41000,,700,105,,2,2,0x00080000,7,0,2,3,30,1,14,{ bonus bLuk,3; },{},{}
+1960,Whip,Whip,4,38000,,700,120,,2,1,0x00080000,7,0,2,3,30,1,14,{},{},{}
+1961,Whip_,Whip,4,38000,,700,120,,2,2,0x00080000,7,0,2,3,30,1,14,{},{},{}
+1962,Lariat,Lariat Whip,4,,10,400,100,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bDex,5; bonus bAgi,1; },{},{}
+1963,Rapture_Rose,Rapture Rose,4,,10,300,115,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,5000; },{},{}
+1964,Chemeti,Chemeti Whip,4,,10,700,135,,2,0,0x00080000,7,0,2,4,44,1,14,{ bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2; },{},{}
+1965,Whip_Of_Red_Flame,Red Flame Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Fire; },{},{}
+1966,Whip_Of_Ice_Piece,Icicle Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Water; },{},{}
+1967,Whip_Of_Earth,Gaia Whip,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Earth; },{},{}
+1968,Jump_Rope,Skipping Rope,4,,10,400,120,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bCritical,20; },{},{}
+1969,Bladed_Whip,Blade Whip,4,,10,1200,140,,2,0,0x00080000,7,0,2,4,30,1,14,{ bonus2 bAddEff,Eff_Bleeding,500; },{},{}
+1970,Queen's_Whip,Queen's Whip,4,,10,1100,150,,2,0,0x00080000,7,0,2,4,65,1,14,{ bonus2 bSkillAtk,394,10; bonus2 bSkillAtk,324,10; },{},{}
+1971,Electric_Wire,Electric Wire,4,,10,700,110,,2,0,0x00080000,7,0,2,3,30,1,14,{ bonus bAtkEle,Ele_Wind; },{},{}
+// Shields
+//===================================================================
+2101,Guard,Guard,5,500,,300,,3,,0,0xFFFFFFFF,7,2,32,,0,1,1,{},{},{}
+2102,Guard_,Guard,5,500,,300,,3,,1,0xFFFFFFFF,7,2,32,,0,1,1,{},{},{}
+2103,Buckler,Buckler,5,14000,,600,,4,,0,0x000ED5F2,7,2,32,,0,1,2,{},{},{}
+2104,Buckler_,Buckler,5,14000,,600,,4,,1,0x000ED5F2,7,2,32,,0,1,2,{},{},{}
+2105,Shield,Shield,5,56000,,1300,,6,,0,0x00004082,7,2,32,,0,1,3,{},{},{}
+2106,Shield_,Shield,5,56000,,1300,,6,,1,0x00004082,7,2,32,,0,1,3,{},{},{}
+2107,Mirror_Shield,Mirror Shield,5,60000,,1000,,4,,0,0x00404082,7,2,32,,0,1,4,{ bonus bMdef,5; },{},{}
+2108,Mirror_Shield_,Mirror Shield,5,60000,,1000,,4,,1,0x00404082,7,2,32,,0,1,4,{ bonus bMdef,5; },{},{}
+2109,Memorize_Book,Memory Book,5,,10,1000,,3,,0,0x00810204,7,2,32,,0,1,0,{ bonus bInt,1; bonus bMdef,2; },{},{}
+2110,Holy_Guard,Holy Guard,5,85000,,1400,,5,,0,0x00004000,7,2,32,,68,0,3,{ bonus bVit,2; bonus bMdef,2; },{},{}
+2111,Herald_Of_GOD,Sacred Mission,5,128000,,1600,,5,,0,0x00004000,7,2,32,,83,1,3,{ bonus bVit,3; bonus bInt,2; bonus bMdef,3; bonus bUnbreakableShield,0; },{},{}
+2112,Novice_Guard,Novice Guard,5,1,,1,,3,,0,0x00000001,7,2,32,,0,0,1,{},{},{}
+2113,Novice_Shield,Novice Shield,5,5000,,1000,,3,,1,0x00000001,7,2,32,,40,1,3,{ bonus2 bSubEle,Ele_Water,20; bonus2 bSubEle,Ele_Earth,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Wind,20; bonus2 bSubEle,Ele_Poison,20; bonus2 bSubEle,Ele_Ghost,20; bonus2 bSubEle,Ele_Undead,20; },{},{}
+2114,Stone_Buckler,Stone Buckler,5,30000,,1500,,3,,1,0xFFFFFFFE,7,2,32,,65,1,2,{ bonus2 bSubSize,2,5; if (isequipped(2353,5122)) { bonus bStr,2; bonus bDef,5; bonus bMdef,5; if(BaseClass == Job_Swordman) bonus bDef,6; } },{},{}
+2115,Valkyrja's_Shield,Valkyrie's Shield,5,30000,,500,,3,,1,0xFFFFFFFE,7,2,32,,65,1,3,{ bonus2 bSubEle,Ele_Water,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Undead,20; bonus bMdef,5; if(isequipped(2353,5124)) { bonus bDef,2; bonus bMdef,5+getRefine()+getequiprefinerycnt(1); } },{},{}
+2116,Angel's_Safeguard,Angelic Guard,5,10000,,400,,3,,1,0x00000001,7,2,32,,20,1,3,{ bonus2 bSubRace,RC_Demon,5; },{},{}
+2117,Gauntlet,Gauntlet,5,10000,,150,,5,,0,0x02000000,7,2,32,,20,1,,{},{},{}
+2118,Gauntlet_,Gauntlet,5,10000,,150,,5,,1,0x02000000,7,2,32,,20,1,,{},{},{}
+2119,Superior_Gauntlet,Superior Gauntlet,5,40000,,150,,4,,0,0x02000000,7,2,32,,50,1,,{ bonus bMdef,5; },{},{}
+2120,Superior_Gauntlet_,Superior Gauntlet,5,40000,,150,,4,,1,0x02000000,7,2,32,,50,1,,{ bonus bMdef,5; },{},{}
+2121,Memory_Book_,Memory Book,5,,10,1000,,3,,1,0x00810204,7,2,32,,0,1,0,{ bonus bInt,1; bonus bMdef,2; },{},{}
+2199,Ahura_Mazda,Ahura Mazdah,5,1,,10,,100,,0,0xFFFFFFFF,7,2,32,,1,1,0,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; skill 479,5; },{},{}
+// Headgears
+//===================================================================
+2201,Sunglasses,Sunglasses,5,5000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,12,{ bonus2 bResEff,Eff_Blind,500; },{},{}
+2202,Sunglasses_,Sunglasses,5,5000,,100,,0,,1,0xFFFFFFFF,7,2,512,,0,0,12,{ bonus2 bResEff,Eff_Blind,500; },{},{}
+2203,Glasses,Glasses,5,4000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,3,{},{},{}
+2204,Glasses_,Glasses,5,4000,,100,,0,,1,0xFFFFFFFF,7,2,512,,0,0,3,{},{},{}
+2205,Diver's_Goggles,Diver Goggles,5,3500,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,10,{},{},{}
+2206,Wedding_Veil,Wedding Veil,5,23000,,100,,0,,0,0xFFFFFFFF,7,0,256,,0,1,44,{ bonus bMdef,5; },{},{}
+2207,Fancy_Flower,Fancy Flower,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,4,{ bonus2 bSubRace,RC_Plant,10; },{},{}
+2208,Ribbon,Ribbon,5,800,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,17,{ bonus bMdef,3; },{},{}
+2209,Ribbon_,Ribbon,5,800,,100,,1,,1,0xFFFFFFFF,7,2,256,,0,1,17,{ bonus bMdef,3; },{},{}
+2210,Hair_Band,Hair Band,5,500,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,9,{},{},{}
+2211,Bandana,Bandana,5,400,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,6,{},{},{}
+2212,Eye_Bandage,Eye Patch,5,1000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,13,{},{},{}
+2213,Cat_Hairband,Kitty Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,2,{},{},{}
+2214,Bunny_Band,Bunny Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,15,{ bonus bLuk,2; },{},{}
+2215,Flower_Hairband,Flower Band,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,5,{},{},{}
+2216,Biretta,Biretta,5,9000,,100,,4,,0,0x00008110,7,2,256,,0,1,11,{},{},{}
+2217,Biretta_,Biretta,5,9000,,100,,4,,1,0x00008110,7,2,256,,0,1,11,{},{},{}
+2218,Flu_Mask,Flu Mask,5,300,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,8,{ bonus2 bResEff,Eff_Silence,1000; },{},{}
+2219,Flu_Mask_,Flu Mask,5,300,,100,,0,,1,0xFFFFFFFF,7,2,1,,0,0,8,{ bonus2 bResEff,Eff_Silence,1000; },{},{}
+2220,Hat,Hat,5,1000,,200,,2,,0,0xFFFFFFFF,7,2,256,,0,1,16,{},{},{}
+2221,Hat_,Hat,5,1000,,200,,2,,1,0xFFFFFFFF,7,2,256,,0,1,16,{},{},{}
+2222,Turban,Turban,5,4500,,300,,3,,0,0xFFFFFFFE,7,2,256,,0,1,7,{},{},{}
+2223,Turban_,Turban,5,4500,,300,,3,,1,0xFFFFFFFE,7,2,256,,0,1,7,{},{},{}
+2224,Goggle,Goggles,5,10000,,300,,5,,0,0x000E5CEA,7,2,768,,0,1,1,{},{},{}
+2225,Goggle_,Goggles,5,10000,,300,,5,,1,0x000E5CEA,7,2,768,,0,1,1,{},{},{}
+2226,Cap,Cap,5,12000,,400,,4,,0,0x000E5CEA,7,2,256,,0,1,14,{},{},{}
+2227,Cap_,Cap,5,12000,,400,,4,,1,0x000E5CEA,7,2,256,,0,1,14,{},{},{}
+2228,Helm,Helm,5,44000,,600,,6,,0,0x00004082,7,2,256,,0,1,40,{},{},{}
+2229,Helm_,Helm,5,44000,,600,,6,,1,0x00004082,7,2,256,,0,1,40,{},{},{}
+2230,Gemmed_Sallet,Gemmed Sallet,5,50000,,500,,4,,0,0x000654E2,7,2,256,,0,1,0,{ bonus bMdef,3; },{},{}
+2231,Gemmed_Sallet_,Gemmed Sallet,5,50000,,500,,4,,1,0x000654E2,7,2,256,,0,1,0,{ bonus bMdef,3; },{},{}
+2232,Circlet,Circlet,5,7500,,300,,3,,0,0x00818314,7,2,256,,0,1,18,{ bonus bMdef,3; },{},{}
+2233,Circlet_,Circlet,5,7500,,300,,3,,1,0x00818314,7,2,256,,0,1,18,{ bonus bMdef,3; },{},{}
+2234,Tiara,Tiara,5,,10,400,,4,,0,0xFFFFFFFE,7,0,256,,45,1,19,{ bonus bInt,2; },{},{}
+2235,Crown,Crown,5,,10,400,,4,,0,0xFFFFFFFE,7,1,256,,45,1,45,{ bonus bInt,2; },{},{}
+2236,Santa's_Hat,Santa Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,20,{ bonus bMdef,1; bonus bLuk,1; },{},{}
+2237,Weird_Goatee,Bandit Beard,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,21,{},{},{}
+2238,Weird_Moustache,Moustache,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,22,{},{},{}
+2239,One_Eyed_Glass,Monocle,5,10000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,23,{},{},{}
+2240,Beard,Beard,5,2,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,24,{},{},{}
+2241,Granpa_Beard,Grandpa Beard,5,5000,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,25,{},{},{}
+2242,Luxury_Sunglasses,Purple Glasses,5,24000,,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,26,{ bonus2 bResEff,Eff_Blind,1000; },{},{}
+2243,Spinning_Eyes,Geek Glasses,5,20000,,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,27,{ bonus2 bResEff,Eff_Blind,1500; },{},{}
+2244,Big_Sis'_Ribbon,Big Ribbon,5,15000,,200,,2,,0,0xFFFFFFFE,7,2,256,,0,1,28,{ bonus bMdef,3; },{},{}
+2245,Sweet_Gents,Sweet Gent,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,29,{},{},{}
+2246,Golden_Gear,Golden Gear,5,,10,900,,5,,0,0xFFFFFFFE,7,2,256,,40,1,30,{ bonus bUnbreakableHelm,0; },{},{}
+2247,Oldman's_Romance,Romantic Gent,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,31,{},{},{}
+2248,Western_Grace,Western Grace,5,15000,,400,,3,,0,0xFFFFFFFE,7,2,256,,0,1,32,{},{},{}
+2249,Coronet,Coronet,5,,10,300,,3,,0,0xFFFFFFFE,7,2,256,,0,1,33,{ bonus bInt,1; },{},{}
+2250,Fillet,Cute Ribbon,5,500,,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,34,{ bonus bMaxSP,20; },{},{}
+2251,Holy_Bonnet,Monk Hat,5,30000,,100,,5,,0,0x00008110,7,2,256,,0,1,35,{ bonus bMdef,3; },{},{}
+2252,Star_Sparkling,Wizard Hat,5,,10,300,,4,,0,0x00810204,7,2,256,,0,1,36,{ bonus bMaxSP,100; },{},{}
+2253,Sunflower,Sunflower,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,37,{ bonus2 bSubRace,RC_Insect,10; },{},{}
+2254,Angelic_Chain,Angel Wing,5,,10,100,,2,,0,0xFFFFFFFE,7,2,256,,0,1,38,{ bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,RC_Demon,3; },{},{}
+2255,Satanic_Chain,Evil Wing,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,39,{ bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,RC_Angel,3; },{},{}
+2256,Magestic_Goat,Majestic Goat,5,,10,800,,5,,0,0x006444A2,7,2,256,,0,1,41,{ bonus bStr,1; },{},{}
+2257,Snowy_Horn,Unicorn Horn,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,42,{},{},{}
+2258,Sharp_Gear,Spiky Band,5,,10,1000,,6,,0,0x0066D5F2,7,2,256,,50,1,43,{},{},{}
+2259,Mini_Propeller,Mini Propeller,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,46,{},{},{}
+2260,Mini_Glasses,Mini Glasses,5,28000,,100,,1,,0,0xFFFFFFFE,7,2,512,,0,0,47,{},{},{}
+2261,Prontera_Army_Cap,Army Cap,5,,10,400,,4,,0,0x000654E2,7,2,256,,0,1,48,{},{},{}
+2262,Pierrot_Nose,Clown Nose,5,,10,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,49,{},{},{}
+2263,Gangster_Patch,Zorro Masque,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,50,{},{},{}
+2264,Munak_Turban,Munak Hat,5,,10,300,,5,,0,0xFFFFFFFF,7,2,769,,0,0,51,{ bonus2 bSubRace,RC_Undead,10; },{},{}
+2265,Ganster_Mask,Gangster Mask,5,,10,100,,0,,0,0xFFFFFFFF,7,2,1,,0,0,52,{ bonus2 bResEff,Eff_Silence,1500; },{},{}
+2266,Iron_Cane,Iron Cain,5,,10,300,,1,,0,0x00004082,7,2,1,,50,0,53,{},{},{}
+2267,Cigar,Cigarette,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,54,{ bonus2 bSubRace,RC_Insect,3; },{},{}
+2268,Smoking_Pipe,Pipe,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,55,{ bonus2 bSubRace,RC_Insect,3; },{},{}
+2269,Centimental_Flower,Romantic Flower,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,56,{ bonus2 bSubRace,RC_Plant,3; },{},{}
+2270,Centimental_Leaf,Romantic Leaf,5,,10,100,,0,,0,0xFFFFFFFE,7,2,1,,0,0,57,{ bonus2 bSubRace,RC_Plant,3; },{},{}
+2271,Jack_A_Dandy,Jack be Dandy,5,45000,,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,58,{},{},{}
+2272,Stop_Post,Stop Post,5,,10,400,,1,,0,0xFFFFFFFF,7,2,256,,0,1,59,{},{},{}
+2273,Doctor_Cap,Doctor Band,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,60,{ bonus bInt,1; },{},{}
+2274,Ghost_Bandana,Ghost Bandana,5,,10,100,,0,,0,0xFFFFFFFE,7,2,256,,0,1,61,{ bonus bAgi,2; bonus2 bSubEle,Ele_Ghost,10; },{},{}
+2275,Red_Bandana,Red Bandana,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,62,{},{},{}
+2276,Eagle_Eyes,Angled Glasses,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,0,0,63,{},{},{}
+2277,Nurse_Cap,Nurse Cap,5,,10,100,,1,,0,0x00008110,7,2,256,,0,1,64,{ bonus bInt,1; },{},{}
+2278,Mr_Smile,Mr. Smile,5,60,,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,65,{},{},{}
+2279,Bomb_Wick,Bomb Wick,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,66,{},{},{}
+2280,Sahkkat,Sakkat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,67,{ bonus bAgi,1; },{},{}
+2281,Phantom_Of_Opera,Opera Masque,5,8000,,200,,2,,0,0xFFFFFFFE,7,2,513,,0,0,68,{},{},{}
+2282,Spirit_Chain,Halo,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,0,69,{ bonus2 bSubEle,Ele_Holy,15; },{},{}
+2283,Ear_Mufs,Ear Muffs,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,1,70,{ bonus2 bResEff,Eff_Curse,1000; },{},{}
+2284,Antler,Antlers,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,0,1,71,{},{},{}
+2285,Apple_Of_Archer,Apple of Archer,5,,10,200,,0,,0,0xFFFFFFFE,7,2,256,,30,1,72,{ bonus bDex,3; },{},{}
+2286,Elven_Ears,Elven Ears,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,70,0,73,{},{},{}
+2287,Pirate_Bandana,Pirate Bandana,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,74,{ bonus bStr,1; },{},{}
+2288,Mr_Scream,Mr. Scream,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,75,{},{},{}
+2289,Poo_Poo_Hat,Poo Poo Hat,5,,10,700,,0,,0,0xFFFFFFFF,7,2,256,,0,0,76,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
+2290,Funeral_Costume,Funeral Hat,5,3000,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,77,{},{},{}
+2291,Masquerade,Masquerade,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,78,{ bonus2 bAddRace,RC_DemiHuman,3; },{},{}
+2292,Welding_Mask,Welding Mask,5,,10,300,,2,,0,0x00040420,7,2,513,,50,0,79,{ bonus2 bSubEle,Ele_Fire,10; },{},{}
+2293,Pretend_Murdered,Pretend Murdered,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,0,80,{},{},{}
+2294,Star_Dust,Stellar,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,81,{},{},{}
+2295,Blinker,Blinker,5,1500,,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,82,{ bonus2 bResEff,Eff_Blind,10000; },{},{}
+2296,Binoculars,Binoculars,5,,10,100,,1,,0,0x00080808,7,2,512,,50,0,83,{ bonus bDex,1; },{},{}
+2297,Goblini_Mask,Goblin Mask,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,84,{},{},{}
+2298,Green_Feeler,Green Feeler,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,0,85,{},{},{}
+2299,Viking_Helm,Orc Helm,5,,10,500,,5,,0,0x000654E2,7,2,256,,0,1,86,{},{},{}
+// Armors
+//===================================================================
+2301,Cotton_Shirt,Cotton Shirt,5,10,,100,,1,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2302,Cotton_Shirt_,Cotton Shirt,5,10,,100,,1,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2303,Leather_Jacket,Jacket,5,200,,200,,2,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2304,Leather_Jacket_,Jacket,5,200,,200,,2,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2305,Adventure_Suit,Adventurer's Suit,5,1000,,300,,3,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2306,Adventurere's_Suit_,Adventurer's Suit,5,1000,,300,,3,,1,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2307,Mantle,Mantle,5,10000,,600,,4,,0,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
+2308,Mantle_,Mantle,5,10000,,600,,4,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
+2309,Coat,Coat,5,22000,,1200,,5,,0,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
+2310,Coat_,Coat,5,22000,,1200,,5,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
+2311,Mink_Coat,Mink Coat,5,,10,2300,,6,,1,0xFFFFFFFE,7,2,16,,30,1,0,{},{},{}
+2312,Padded_Armor,Padded Armor,5,48000,,2800,,7,,0,0x000654E2,7,2,16,,0,1,0,{ if(isequipped(2656)) { bonus bDef,5; bonus bMaxHP,150; } },{},{}
+2313,Padded_Armor_,Padded Armor,5,48000,,2800,,7,,1,0x000654E2,7,2,16,,0,1,0,{ if(isequipped(2656)) { bonus bDef,5; bonus bMaxHP,150; } },{},{}
+2314,Chain_Mail,Chain Mail,5,65000,,3300,,8,,0,0x000654E2,7,2,16,,0,1,0,{},{},{}
+2315,Chain_Mail_,Chain Mail,5,65000,,3300,,8,,1,0x000654E2,7,2,16,,0,1,0,{},{},{}
+2316,Plate_Armor,Full Plate,5,80000,,4500,,10,,0,0x00004082,7,2,16,,40,1,0,{},{},{}
+2317,Plate_Armor_,Full Plate,5,80000,,4500,,10,,1,0x00004082,7,2,16,,40,1,0,{},{},{}
+2318,Clothes_Of_The_Lord,Lord's Clothes,5,,10,2500,,8,,1,0x00040420,7,2,16,,70,1,0,{ bonus bMdef,5; bonus bInt,1; },{},{}
+2319,Glittering_Clothes,Glittering Jacket,5,,10,2500,,7,,1,0xFFFFFFFE,7,2,16,,60,1,0,{ bonus bMdef,5; bonus2 bAddEff,Eff_Blind,500; },{},{}
+2320,Formal_Suit,Formal Suit,5,,10,300,,5,,1,0xFFFFFFFE,7,2,16,,0,1,0,{},{},{}
+2321,Silk_Robe,Silk Robe,5,8000,,400,,3,,0,0x0085C7B6,7,2,16,,0,1,0,{ bonus bMdef,10; },{},{}
+2322,Silk_Robe_,Silk Robe,5,8000,,400,,3,,1,0x0085C7B6,7,2,16,,0,1,0,{ bonus bMdef,10; },{},{}
+2323,Scapulare,Scapulare,5,6500,,400,,4,,0,0x00008110,7,2,16,,0,1,0,{},{},{}
+2324,Scapulare_,Scapulare,5,6500,,400,,4,,1,0x00008110,7,2,16,,0,1,0,{},{},{}
+2325,Saint_Robe,Saint's Robe,5,54000,,600,,6,,0,0x00048530,7,2,16,,0,1,0,{ bonus bMdef,5; },{},{}
+2326,Saint_Robe_,Saint's Robe,5,54000,,600,,6,,1,0x00048530,7,2,16,,0,1,0,{ bonus bMdef,5; },{},{}
+2327,Holy_Robe,Holy Robe,5,,10,1700,,7,,0,0x00008110,7,2,16,,60,1,0,{ bonus bMdef,5; bonus2 bSubRace,RC_Demon,15; bonus2 bSubEle,Ele_Dark,10; },{},{}
+2328,Wooden_Mail,Wooden Mail,5,5500,,1000,,4,,0,0x000444A2,7,2,16,,0,1,0,{},{},{}
+2329,Wooden_Mail_,Wooden Mail,5,5500,,1000,,4,,1,0x000444A2,7,2,16,,0,1,0,{},{},{}
+2330,Tights,Tights,5,71000,,500,,6,,0,0x00080808,7,2,16,,45,1,0,{ bonus bDex,1; },{},{}
+2331,Tights_,Tights,5,71000,,500,,6,,1,0x00080808,7,2,16,,45,1,0,{ bonus bDex,1; },{},{}
+2332,Silver_Robe,Silver Robe,5,7000,,700,,4,,0,0x00810204,7,2,16,,0,1,0,{},{},{}
+2333,Silver_Robe_,Silver Robe,5,7000,,700,,4,,1,0x00810204,7,2,16,,0,1,0,{},{},{}
+2334,Mage_Coat,Mage Coat,5,,10,600,,5,,0,0x00810204,7,2,16,,50,1,0,{ bonus bMdef,5; bonus bInt,1; },{},{}
+2335,Thief_Clothes,Thief Clothes,5,74000,,100,,6,,0,0x02021040,7,2,16,,0,1,0,{ bonus bAgi,1; },{},{}
+2336,Thief_Clothes_,Thief Clothes,5,74000,,100,,6,,1,0x02021040,7,2,16,,0,1,0,{ bonus bAgi,1; },{},{}
+2337,Ninja_Suit,Ninja Suit,5,,10,1500,,7,,0,0x02021040,7,2,16,,50,1,0,{ bonus bAgi,1; bonus bMdef,3; if(isequipped(2654)) { bonus bUseSPrate,-20; bonus bMaxHP,300; } },{},{}
+2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,0xFFFFFFFE,7,0,16,,0,1,0,{ bonus bMdef,15; },{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
+2339,G_Strings,Pantie,5,1000,,100,,4,,0,0xFFFFFFFF,7,2,16,,0,1,0,{},{},{}
+2340,Novice_Breast,Novice Breastplate,5,89000,,500,,4,,1,0x00000001,7,2,16,,10,1,0,{},{},{}
+2341,Full_Plate_Armor,Legion Plate Armor,5,94000,,5500,,11,,0,0x00004000,7,2,16,,70,1,0,{},{},{}
+2342,Full_Plate_Armor_,Legion Plate Armor,5,102500,,5500,,11,,1,0x00004000,7,2,16,,70,1,0,{},{},{}
+2343,Robe_Of_Casting,Robe of Cast,5,124800,,1100,,5,,0,0x00810200,7,2,16,,75,1,0,{ bonus bCastrate,-3; bonus bMdef,4; },{},{}
+2344,Flame_Sprits_Armor,Lucius's Fierce Armor of Volcano,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Fire; },{},{}
+2345,Flame_Sprits_Armor_,Lucius's Fierce Armor of Volcano,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Fire; },{},{}
+2346,Water_Sprits_Armor,Saphien's Armor of Ocean,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Water; },{},{}
+2347,Water_Sprits_Armor_,Saphien's Armor of Ocean,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Water; },{},{}
+2348,Wind_Sprits_Armor,Aebeccee's Raging Typhoon Armor,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Wind; },{},{}
+2349,Wind_Sprits_Armor_,Aebeccee's Raging Typhoon Armor,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Wind; },{},{}
+2350,Earth_Sprits_Armor,Claytos Cracking Earth Armor,5,136000,,2200,,4,,0,0x000444A2,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Earth; },{},{}
+2351,Earth_Sprits_Armor_,Claytos Cracking Earth Armor,5,136000,,2200,,4,,1,0xFFFFFFFE,7,2,16,,45,1,0,{ bonus bDefEle,Ele_Earth; },{},{}
+2352,Novice_Plate,Tattered Novice Ninja Suit,5,1,,1,,4,,0,0x00000001,7,2,16,,0,0,0,{},{},{}
+2353,Odin's_Blessing,Odin's Blessing,5,30000,,2500,,6,,1,0xFFFFFFFE,7,2,16,,65,1,0,{},{},{}
+2354,Goibne's_Armor,Goibne's Armor,5,50000,,3500,,7,,0,0xFFFFFFFE,7,2,16,,54,1,0,{ bonus bVit,2; bonus bMaxHPrate,10; },{},{}
+2355,Angel's_Protection,Angelic Protection,5,10000,,600,,4,,1,0x00000001,7,2,16,,40,1,0,{ bonus bMdef,20; if(isequipped(2116,2420,2521,5125)) { bonus bMaxHP,900; bonus bMaxSP,100; bonus4 bAutoSpellWhenHit,361,1,20,0; } },{},{}
+2356,Vestment_Of_Grace,Blessed Holy Robe,5,,10,2500,,5,,1,0x00008100,7,2,16,,70,1,0,{ bonus bMdef,5; bonus2 bResEff,Eff_Blind,8000; },{},{}
+2357,Valkyrie_Armor,Valkyrie's Armor,5,0,,2800,,6,,1,0xFFFFFFFE,2,2,16,,0,1,0,{ bonus bAllStats,1; bonus bUnbreakableArmor,0; if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus2 bResEff,Eff_Silence,5000; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus2 bResEff,Eff_Stun,5000; },{},{}
+2358,Angel_Dress,Angel's Dress,5,,10,1000,,5,,0,0xFFFFFFFF,7,2,16,,0,0,0,{ bonus bLuk,4; },{},{}
+2359,Ninja_Suit_,Ninja Suit,5,,10,1500,,7,,1,0x02021040,7,2,16,,50,1,0,{ bonus bAgi,1; bonus bMdef,3; if(isequipped(2654)) { bonus bUseSPrate,-20; bonus bMaxHP,300; } },{},{}
+2360,Robe_of_Casting_,Robe of Cast,5,124800,,1100,,5,,1,0x00810200,7,2,16,,75,1,0,{ bonus bCastrate,-3; bonus bMdef,4; },{},{}
+2361,Blue_Robe,Blue Robe,5,,10,500,,0,,0,0xFFFFFFFE,7,2,16,,0,1,0,{ bonus bAllStats,5; bonus bMdef,5; },{},{}
+2362,Red_Robe,Red Robe,5,,10,500,,0,,0,0xFFFFFFFE,7,2,16,,0,1,0,{ bonus bAllStats,5; bonus bMdef,5; },{},{}
+2363,White_Robe,White Robe,5,,10,500,,0,,0,0x00000001,7,2,16,,0,1,0,{ bonus bAllStats,3; bonus bMdef,5; },{},{}
+// Footgears
+//===================================================================
+2401,Sandals,Sandals,5,400,,200,,1,,0,0xFFFFFFFF,7,2,64,,0,1,0,{},{},{}
+2402,Sandals_,Sandals,5,400,,200,,1,,1,0xFFFFFFFF,7,2,64,,0,1,0,{},{},{}
+2403,Shoes,Shoes,5,3500,,400,,2,,0,0xFFFFFFFE,7,2,64,,0,1,0,{},{},{}
+2404,Shoes_,Shoes,5,3500,,400,,2,,1,0xFFFFFFFE,7,2,64,,0,1,0,{},{},{}
+2405,Boots,Boots,5,18000,,600,,4,,0,0x016E5CEA,7,2,64,,0,1,0,{},{},{}
+2406,Boots_,Boots,5,18000,,600,,4,,1,0x016E5CEA,7,2,64,,0,1,0,{},{},{}
+2407,Chrystal_Pumps,Crystal Pumps,5,,10,100,,0,,0,0xFFFFFFFE,7,0,64,,0,1,0,{ bonus bMdef,10; bonus bLuk,5; },{},{}
+2408,Cuffs,Shackles,5,5000,,3000,,3,,0,0xFFFFFFFF,7,2,64,,0,1,0,{ if (isequipped(2655)) { bonus bBaseAtk,50; bonus2 bAddDefClass,1196,20; bonus2 bAddDefClass,1197,20; } },{},{}
+2409,Spiky_Heel,High Heels,5,8500,,600,,2,,0,0xFFFFFFFE,7,2,64,,0,1,0,{ bonus bMdef,5; },{},{}
+2410,Sleipnir,Sleipnir,5,,10,3500,,5,,0,0xFFFFFFFF,7,2,64,,94,0,0,{ bonus bMdef,10; bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bSPrecovRate,15; bonus bSpeedRate,25; },{},{}
+2411,Grave,Greaves,5,48000,,750,,5,,0,0x00004080,7,2,64,,65,1,0,{},{},{}
+2412,Grave_,Greaves,5,54000,,750,,5,,1,0x00004080,7,2,64,,65,1,0,{},{},{}
+2413,Safty_Boots,Safety Boots,5,34000,,350,,6,,0,0x00004082,7,2,64,,30,0,0,{},{},{}
+2414,Novice_Boots,Novice Slippers,5,1,,1,,2,,0,0x00000001,7,2,64,,0,0,0,{},{},{}
+2415,Slipper,Bunny Slipper,5,34000,,300,,3,,1,0xFFFFFFFE,7,0,64,,30,1,0,{ bonus bLuk,3; bonus bMdef,3; },{},{}
+2416,Novice_Shoes,Novice Shoes,5,35000,,500,,2,,1,0x00000001,7,2,64,,40,1,0,{ bonus bMaxHPrate,5; },{},{}
+2417,Fricco_Shoes,Freya's Shoes,5,30000,,500,,3,,0,0xFFFFFFFE,7,2,64,,65,1,0,{ bonus bAgi,2; bonus2 bAddItemHealRate,IG_Potion,20; if(isequipped(2353,2516)){ bonus bAgi,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; } },{},{}
+2418,Vidar's_Boots,Vidar's Boots,5,30000,,650,,4,,0,0xFFFFFFFE,7,2,64,,65,1,0,{ bonus bMaxHPrate,9; bonus bMaxSPrate,9; if(isequipped(2353,2517)){ bonus bVit,5; bonus bHPrecovRate,10; bonus bSPrecovRate,10; } },{},{}
+2419,Goibne's_Combat_Boots,Goibne's Greaves,5,30000,,700,,4,,0,0xFFFFFFFE,7,2,64,,54,1,0,{ bonus bMdef,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; },{},{}
+2420,Angel's_Arrival,Angel's Reincarnation,5,10000,,300,,2,,1,0x00000001,7,2,64,,25,1,0,{ bonus bMaxHP,100; },{},{}
+2421,Valkyrie's_Shoes,Valkyrie's Shoes,5,0,,500,,4,,1,0xFFFFFFFE,2,2,64,,1,1,0,{ if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bMaxHP,(BaseLevel*5); else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bMaxSP,(JobLevel*2); },{},{}
+2422,High_Quality_Sandals,High Quality Sandals,5,24000,,200,,2,,1,0x00818314,7,2,64,,40,1,0,{ bonus bMdef,10; },{},{}
+// Garments
+//===================================================================
+2501,Hood,Hood,5,1000,,200,,1,,0,0xFFFFFFFF,7,2,4,,0,1,0,{},{},{}
+2502,Hood_,Hood,5,1000,,200,,1,,1,0xFFFFFFFF,7,2,4,,0,1,0,{},{},{}
+2503,Muffler,Muffler,5,5000,,400,,2,,0,0xFFFFFFFE,7,2,4,,0,1,0,{},{},{}
+2504,Muffler_,Muffler,5,5000,,400,,2,,1,0xFFFFFFFE,7,2,4,,0,1,0,{},{},{}
+2505,Manteau,Manteau,5,32000,,600,,4,,0,0x006654E2,7,2,4,,0,1,0,{},{},{}
+2506,Manteau_,Manteau,5,32000,,600,,4,,1,0x006654E2,7,2,4,,0,1,0,{},{},{}
+2507,Cape_Of_Ancient_Lord,Ancient Cape,5,82000,,600,,2,,0,0xFFFFFFFE,7,2,4,,40,1,0,{ bonus bAgi,1; },{},{}
+2508,Ragamuffin_Cape,Ragamuffin Manteau,5,56000,,500,,1,,0,0xFFFFFFFE,7,2,4,,0,1,0,{ bonus bMdef,10; },{},{}
+2509,Clack_Of_Servival,Survivor's Manteau,5,20000,,550,,0,,0,0x00810204,7,2,4,,75,1,0,{ bonus bVit,10; if(isequipped(1618) || isequipped(1620)) bonus bMaxHP,300; bonus bMatkRate,-5; if(isequipped(1617) || isequipped(1618) || isequipped(1619) || isequipped(1620)) bonus bMatkRate,getequiprefinerycnt(4); bonus2 bSubEle,Ele_Neutral,getRefine()*3; },{},{}
+2510,Novice_Hood,Somber Novice Hood,5,1,,1,,2,,0,0x00000001,7,2,4,,0,0,0,{ bonus2 bSubEle,Ele_Neutral,20; },{},{}
+2511,Skeleton?_Cape,Skeleton Manteau,5,5000,,700,,1,,0,0xFFFFFFFE,7,2,4,,75,1,0,{ bonus bStr,2; bonus bInt,-3; bonus bDex,2; bonus bVit,-3; bonus bLuk,2; bonus bAgi,-4; },{},{}
+2512,Novice_Manteau,Novice Manteau,5,50000,,500,,2,,1,0x00000001,7,2,4,,40,1,0,{ bonus2 bSubEle,Ele_Neutral,10; },{},{}
+2513,Celestial_Robe,Heavenly Maiden Robe,5,,10,500,,3,,1,0xFFFFFFFE,7,2,4,,80,1,0,{},{},{}
+2514,Pauldron,Pauldron,5,,10,800,,5,,1,0x000654E2,7,2,4,,80,1,0,{},{},{}
+2515,Wing_Of_Eagle,Eagle Wing,5,20000,,300,,1,,1,0x00810204,7,2,4,,85,1,0,{ if(isequipped(1616)) bonus bSpeedRate,10; },{},{}
+2516,Falcon_Robe,Falcon Muffler,5,30000,,400,,3,,0,0xFFFFFFFE,7,2,4,,65,1,0,{ bonus bFlee,15; bonus bFlee2,5; },{},{}
+2517,Vali's_Manteau,Vali's Manteau,5,30000,,600,,4,,0,0xFFFFFFFE,7,2,4,,65,1,0,{ bonus2 bSubEle,Ele_Neutral,15; },{},{}
+2518,Morpheus's_Shawl,Morpheus's Shawl,5,30000,,600,,3,,0,0xFFFFFFFE,7,2,4,,33,1,0,{ bonus bMaxSPrate,10; bonus bMdef,3; },{},{}
+2519,Morrigane's_Manteau,Morrigane's Manteau,5,30000,,600,,3,,0,0xFFFFFFFE,7,2,4,,61,1,0,{ bonus bLuk,2; bonus bFlee2,8; },{},{}
+2520,Goibne's_Shoulder_Arms,Goibne's Spaulders,5,30000,,700,,3,,0,0xFFFFFFFE,7,2,4,,54,1,0,{ bonus bLongAtkDef,10; bonus bMdef,2; bonus bVit,1; },{},{}
+2521,Angel's_Warmth,Angelic Cardigan,5,10000,,400,,2,,1,0x00000001,7,2,4,,20,1,0,{ bonus bHPrecovRate,5; },{},{}
+2522,Undershirt,Undershirt,5,20000,,150,,2,,0,0xFFFFFFFF,7,2,4,,1,1,0,{ bonus bMdef,1; if(isequipped(2339)) { bonus bAgi,5; bonus bFlee,10; } },{},{}
+2523,Undershirt_,Undershirt,5,20000,,150,,2,,1,0xFFFFFFFF,7,2,4,,1,1,0,{ bonus bMdef,1; if(isequipped(2339)) { bonus bAgi,5; bonus bFlee,10; } },{},{}
+2524,Valkyrie's_Manteau,Valkyrie's Manteau,5,0,,500,,3,,1,0xFFFFFFFE,2,2,4,,1,1,0,{ if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bFlee2,5+(getequiprefinerycnt(5)*2); else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bShortWeaponDamageReturn,5+(getequiprefinerycnt(5)*2); },{},{}
+2525,Ancient_Cape_,Ancient Cape,5,82000,,600,,2,,1,0xFFFFFFFE,7,2,4,,40,1,0,{ bonus bAgi,1; },{},{}
+2526,Dragonscale_Jacket,Dragonscale Jacket,5,,10,10,,4,,0,0xFFFFFFFF,7,2,4,,50,1,0,{},{},{}
+// Accessories
+//===================================================================
+2601,Ring,Ring,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bStr,2; },{},{}
+2602,Earring,Earring,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bInt,2; },{},{}
+2603,Necklace,Necklace,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bVit,2; },{},{}
+2604,Glove,Glove,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bDex,2; },{},{}
+2605,Brooch,Brooch,5,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bAgi,2; },{},{}
+2607,Clip,Clip,5,30000,,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxSP,10; },{},{}
+2608,Rosary,Rosary,5,15000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bMdef,5; bonus bLuk,2; },{},{}
+2609,Skul_Ring,Skull Ring,5,10000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2610,Gold_Ring,Gold Ring,5,30000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2611,Silver_Ring,Silver Ring,5,20000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2612,Flower_Ring,Flower Ring,5,1500,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2613,Diamond_Ring,Diamond Ring,5,45000,,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2614,An_Eye_Of_Dullahan,Eye of Dullahan,5,90000,,100,,0,,0,0xFFFFFFFE,7,2,136,,50,0,0,{},{},{}
+2615,Safety_Ring,Safety Ring,5,75000,,100,,3,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bMdef,3; },{},{}
+2616,Critical_Ring,Critical Ring,5,75000,,50,,0,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bCritical,5; },{},{}
+2617,Mitten_Of_Presbyter,Celebrant's Mitten,5,,10,100,,1,,0,0xFFFFFFFE,7,2,136,,35,0,0,{ bonus bInt,1; },{},{}
+2618,Matyr's_Flea_Guard,Matyr's Leash,5,,10,100,,1,,0,0xFFFFFFFE,7,2,136,,35,0,0,{ bonus bAgi,1; },{},{}
+2619,Thimble_Of_Archer,Bow Thimble,5,10000,,100,,0,,0,0x00080808,7,2,136,,65,0,0,{ bonus bLongAtkRate,3; },{},{}
+2620,Ring_Of_Rogue,Rogue's Treasure,5,30000,,100,,0,,0,0x02021040,7,2,136,,70,0,0,{ bonus bAddStealRate,1; },{},{}
+2621,Ring_,Ring,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bStr,1; },{},{}
+2622,Earring_,Earring,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bInt,1; },{},{}
+2623,Necklace_,Necklace,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bVit,1; },{},{}
+2624,Glove_,Glove,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bDex,1; },{},{}
+2625,Brooch_,Brooch,5,30000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bAgi,1; },{},{}
+2626,Rosary_,Rosary,5,15000,,200,,0,,1,0xFFFFFFFE,7,2,136,,90,0,0,{ bonus bMdef,3; bonus bLuk,1; },{},{}
+2627,Belt,Belt,5,20000,,1200,,0,,1,0xFFFFFFFF,7,2,136,,25,0,0,{},{},{}
+2628,Novice_Armlet,Novice Armlet,5,400,,200,,0,,1,0x00000001,7,2,136,,0,0,0,{ bonus bStr,1; bonus bInt,1; bonus bLuk,1; },{},{}
+2629,Magingiorde,Megingjard,5,,10,8000,,2,,0,0xFFFFFFFF,7,2,136,,94,0,0,{ bonus bStr,40; bonus bMdef,7; },{},{}
+2630,Brysinggamen,Brisingamen,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,136,,94,0,0,{ bonus bStr,6; bonus bAgi,6; bonus bVit,6; bonus bInt,6; bonus bLuk,10; bonus bMdef,5; },{},{}
+2631,First_Age_Ring,Celebration Ring,5,,10,10,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2634,Bridegroom_Ring,Wedding Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,1,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; },{},{}
+2635,Bride_Ring,Wedding Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,0,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; },{},{}
+2636,Gold_Ring_,Gold Christmas Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2637,Silver_Ring_,Silver Christmas Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2638,Exorcize_Sachet,Sacred Incense,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,1; bonus bLuk,1; },{},{}
+2639,Purification_Sachet,Occult Incense,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bAgi,1; bonus bInt,1; },{},{}
+2640,Kafra_Ring,Kafra Ring,5,,10,200,,1,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,1; bonus bAgi,1; bonus bInt,1; bonus bLuk,1; bonus bMdef,1; },{},{}
+2641,Fashionable_Sack,Fashion Hip Sack,5,,10,700,,0,,0,0x00040420,7,2,136,,50,0,0,{ bonus bStr,2; },{},{}
+2642,Serin's_Gold_Ring,Serin's Gold Ring,5,,10,0,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2643,Serin's_Gold_Ring_,Serin's Gold Ring,5,,22500,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2644,The_Sign_,The Sign,5,,10,0,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMatkRate,5; bonus bAtkRate,5; },{},{}
+2645,Moonlight_Ring,Moonlight Ring,5,,10,200,,0,,0,0x028F5EEE,7,2,136,,60,0,0,{},{},{}
+2646,Bunch_Of_Carnation,Bunch of Carnations,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2647,Nile_Rose,Nile Rose,5,,10,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxHP,10; },{},{}
+2648,Morpheus's_Ring,Morpheus's Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,33,0,0,{ bonus bInt,1; bonus bMaxSPrate,5; },{},{}
+2649,Morpheus's_Armlet,Morpheus's Bracelet,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,33,0,0,{ bonus bInt,1; bonus bMaxSPrate,5; },{},{}
+2650,Morrigane's_Belt,Morrigane's Belt,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,61,0,0,{ bonus bBaseAtk,5; bonus bCritical,3; },{},{}
+2651,Morrigane's_Pendant,Morrigane's Pendant,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,61,0,0,{ bonus bStr,2; bonus bCritical,3; },{},{}
+2652,Cursed_Lucky_Brooch,Goddess of Fortune's Cursed Brooch,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,40,0,0,{ bonus bCritical,6; bonus2 bAddEff2,Eff_Curse,50; },{},{}
+2653,Sacrifice_Ring,Sacrifice Ring,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,90,0,0,{},{},{}
+2654,Shinobi's_Sash,Shinobi Sash,5,,10,300,,1,,0,0x02021040,7,2,136,,30,0,0,{ bonus bStr,1; bonus bAgi,1; bonus bMdef,1; },{},{}
+2655,Bloody_Iron_Ball,Bloodied Shackle Ball,5,,10,4000,,0,,0,0xFFFFFFFE,7,2,136,,0,0,0,{},{},{}
+2656,Hyper_Changer,Armor Charm,5,,10,1000,,1,,0,0x000654E2,7,2,136,,0,0,0,{ bonus bMaxHP,50; },{},{}
+2657,Lab_Passport,Laboratory Permit,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{},{},{}
+2658,Nile_Rose_,Nile Rose,5,,10,100,,0,,1,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxHP,10; },{},{}
+2659,Vesper_Core01,Vesper Core 01,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bInt,2; bonus bMaxSPrate,5; },{},{}
+2660,Vesper_Core02,Vesper Core 02,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bStr,3; bonus bBaseAtk,10; },{},{}
+2661,Vesper_Core03,Vesper Core 03,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bAgi,3; bonus bFlee,5; },{},{}
+2662,Vesper_Core04,Vesper Core 04,5,,10,500,,1,,0,0x00CFDF80,2,2,136,,0,0,0,{ bonus bMdef,3; bonus bDex,3; bonus bHit,10; },{},{}
+2663,Gauntlet_Of_Accuracy,Gauntlet of Hit,5,,10,900,,0,,0,0xFFFFFFFF,7,2,136,,75,0,0,{ bonus bHit,15; bonus bStr,1; },{},{}
+2664,Scarf_Belt,Belcarf,5,,10,200,,0,,0,0xFFFFFFFE,7,2,136,,75,0,0,{ bonus bDex,2; bonus bInt,1; },{},{}
+2665,Ring_of_Exorcism,Exorcising Ring,5,,10,500,,0,,0,0x00008110,7,2,136,,60,0,0,{ bonus bMdef,1; bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; },{},{}
+2666,Lamp_of_Hope,Lantern of Hope,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bStr,2; bonus2 bResEff,Eff_Blind,10; },{},{}
+2667,Glove_of_Archer,Renown Archer's Gloves,5,,10,300,,0,,0,0xFFFFFFFE,7,2,136,,60,0,0,{ bonus bHit,5; bonus bCritical,5; bonus bDex,1; },{},{}
+2668,Woman_Glory,Woman Glory,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,136,,94,0,0,{},{},{}
+2669,RJC_Necklace,RJC Necklace,5,,10,100,,0,,0,0xFFFFFFFF,7,2,136,,0,0,0,{ bonus bMaxSP,10; },{},{}
+2670,Ring_of_Longing,Ring of Longing,5,,,100,,1,,1,0xFFFFFFFF,7,2,136,,30,0,,{ bonus bFlee,5; },{},{}
+2671,Bow_Thimble_,Bow Thimble,5,10000,,100,,0,,1,0x00080808,7,2,136,,65,0,0,{ bonus bLongAtkRate,3; },{},{}
+2672,3rd_Anniversary_Celebration_Ring,3rd Anniversary Celebration Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bAllStats,5; },{},{}
+2673,Warrior's_Shining_Ring,Warrior's Shining Ring,5,,10,100,,0,,0,0xFFFFFFFE,7,2,136,,48,0,0,{ bonus bBaseAtk,10; bonus bSPrecovRate,3; },{},{}
+// Cards
+//===================================================================
+4001,Poring_Card,Poring Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,2; bonus bFlee2,1; },{},{}
+4002,Fabre_Card,Fabre Card,6,,10,10,,,,,,,,2,,,,,{ bonus bVit,1; bonus bMaxHP,100; },{},{}
+4003,Pupa_Card,Pupa Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,700; },{},{}
+4004,Drops_Card,Drops Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDex,1; bonus bHit,3; },{},{}
+4005,Poring__Card,Santa Poring Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Dark,20; },{},{}
+4006,Lunatic_Card,Lunatic Card,6,,10,10,,,,,,,,2,,,,,{ bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1; },{},{}
+4007,Pecopeco_Egg_Card,Peco Peco Egg Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Formless,20; },{},{}
+4008,Picky_Card,Picky Card,6,,10,10,,,,,,,,16,,,,,{ bonus bStr,1; bonus bBaseAtk,10; },{},{}
+4009,Chonchon_Card,Chonchon Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,1; bonus bFlee,2; },{},{}
+4010,Wilow_Card,Willow Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxSP,80; },{},{}
+4011,Picky__Card,Picky Egg Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,1; bonus bMaxHP,100; },{},{}
+4012,Thief_Bug_Egg_Card,Thief Bug Egg Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMaxHP,400; },{},{}
+4013,Andre_Egg_Card,Andre Egg Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMaxHPrate,5; },{},{}
+4014,Roda_Frog_Card,Roda Frog Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,400; bonus bMaxSP,50; },{},{}
+4015,Condor_Card,Condor Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,10; },{},{}
+4016,Thief_Bug_Card,Thief Bug Card,6,,10,10,,,,,,,,16,,,,,{ bonus bAgi,1; },{},{}
+4017,Savage_Babe_Card,Savage Babe Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Stun,500; },{},{}
+4018,Andre_Larva_Card,Andre Larva Card,6,,10,10,,,,,,,,2,,,,,{ bonus bInt,1; bonus bMaxSP,10; },{},{}
+4019,Hornet_Card,Hornet Card,6,,10,10,,,,,,,,2,,,,,{ bonus bStr,1; bonus bBaseAtk,3; },{},{}
+4020,Farmiliar_Card,Farmiliar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5; },{},{}
+4021,Rocker_Card,Rocker Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDex,1; bonus bBaseAtk,5; },{},{}
+4022,Spore_Card,Spore Card,6,,10,10,,,,,,,,136,,,,,{ bonus bVit,2; },{},{}
+4023,Desert_Wolf_Babe_Card,Baby Desert Wolf Card,6,,10,10,,,,,,,,16,,,,,{ bonus bInt,1; },{},{}
+4024,Plankton_Card,Plankton Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5; },{},{}
+4025,Skeleton_Card,Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stun,200; },{},{}
+4026,Thief_Bug_Female_Card,Female Thief Bug Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAgi,1; bonus bFlee,1; },{},{}
+4027,Kukre_Card,Kukre Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,2; },{},{}
+4028,Tarou_Card,Tarou Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,2; },{},{}
+4029,Wolf_Card,Wolf Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus bCritical,1; },{},{}
+4030,Mandragora_Card,Mandragora Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Wind,20; },{},{}
+4031,Pecopeco_Card,Peco Peco Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,10; },{},{}
+4032,Ambernite_Card,Ambernite Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; },{},{}
+4033,Poporing_Card,Poporing Card,6,,10,10,,,,,,,,136,,,,,{ skill 53,1; },{},{}
+4034,Worm_Tail_Card,Wormtail Card,6,,10,10,,,,,,,,136,,,,,{ bonus bDex,2; },{},{}
+4035,Hydra_Card,Hydra Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,20; },{},{}
+4036,Muka_Card,Muka Card,6,,10,10,,,,,,,,136,,,,,{ bonus bHPrecovRate,10; },{},{}
+4037,Snake_Card,Snake Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5; },{},{}
+4038,Zombie_Card,Zombie Card,6,,10,10,,,,,,,,64,,,,,{ bonus bHPrecovRate,20; },{},{}
+4039,Stainer_Card,Stainer Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Silence,2000; bonus bDef,1; },{},{}
+4040,Creamy_Card,Creamy Card,6,,10,10,,,,,,,,136,,,,,{ skill 26,1; },{},{}
+4041,Coco_Card,Coco Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1; },{},{}
+4042,Steel_Chonchon_Card,Steel Chonchon Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bSubEle,Ele_Wind,10; bonus bDef,2; },{},{}
+4043,Andre_Card,Andre Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,20; },{},{}
+4044,Smokie_Card,Smokie Card,6,,10,10,,,,,,,,136,,,,,{ skill 51,1; },{},{}
+4045,Horn_Card,Horn Card,6,,10,10,,,,,,,,32,,,,,{ bonus bLongAtkDef,35; },{},{}
+4046,Martin_Card,Martin Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Blind,2000; bonus bDef,1; },{},{}
+4047,Ghostring_Card,Ghostring Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Ghost; bonus bHPrecovRate,-25; },{},{}
+4048,Poison_Spore_Card,Poison Spore Card,6,,10,10,,,,,,,,136,,,,,{ skill 52,3; },{},{}
+4049,Vadon_Card,Vadon Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Fire,20; },{},{}
+4050,Thief_Bug_Male_Card,Male Thief Bug Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,2; },{},{}
+4051,Yoyo_Card,Yoyo Card,6,,10,10,,,,,,,,136,,,,,{ bonus bFlee2,5; bonus bAgi,1; },{},{}
+4052,Elder_Wilow_Card,Elder Willow Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,2; },{},{}
+4053,Vitata_Card,Vitata Card,6,,10,10,,,,,,,,136,,,,,{ skill 28,1; bonus bUseSPrate,25; },{},{}
+4054,Angeling_Card,Angeling Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Holy; },{},{}
+4055,Marina_Card,Marina Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5; },{},{}
+4056,Dustiness_Card,Dustiness Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Wind,30; bonus bFlee,5; },{},{}
+4057,Metaller_Card,Metaller Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5; },{},{}
+4058,Thara_Frog_Card,Thara Frog Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_DemiHuman,30; },{},{}
+4059,Soldier_Andre_Card,Soldier Andre Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Plant,30; },{},{}
+4060,Goblin_Card,Goblin Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Brute,20; },{},{}
+4061,Cornutus_Card,Cornutus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bUnbreakableArmor,0; bonus bDef,1; },{},{}
+4062,Anacondaq_Card,Anacondaq Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Poison,20; },{},{}
+4063,Caramel_Card,Caramel Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Insect,20; },{},{}
+4064,Zerom_Card,Zerom Card,6,,10,10,,,,,,,,136,,,,,{ bonus bDex,3; },{},{}
+4065,Kaho_Card,Kaho Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Earth,20; },{},{}
+4066,Orc_Warrior_Card,Orc Warrior Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Brute,30; },{},{}
+4067,Megalodon_Card,Megalodon Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1; },{},{}
+4068,Scorpion_Card,Scorpion Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Plant,20; },{},{}
+4069,Drainliar_Card,Drainliar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Water,20; },{},{}
+4070,Eggyra_Card,Eggyra Card,6,,10,10,,,,,,,,64,,,,,{ bonus bSPrecovRate,15; },{},{}
+4071,Orc_Zombie_Card,Orc Zombie Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Undead,30; bonus bFlee,5; },{},{}
+4072,Golem_Card,Golem Card,6,,10,10,,,,,,,,2,,,,,{ bonus bUnbreakableWeapon,0; bonus bBaseAtk,5; },{},{}
+4073,Pirate_Skel_Card,Pirate Skeleton Card,6,,10,10,,,,,,,,136,,,,,{ skill 37,5; },{},{}
+4074,BigFoot_Card,Bigfoot Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Insect,30; },{},{}
+4075,Argos_Card,Argos Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Stone,2000; bonus bDef,1; },{},{}
+4076,Magnolia_Card,Magnolia Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5; },{},{}
+4077,Phen_Card,Phen Card,6,,10,10,,,,,,,,136,,,,,{ bonus bNoCastCancel,0; bonus bCastrate,25; },{},{}
+4078,Savage_Card,Savage Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,3; },{},{}
+4079,Mantis_Card,Mantis Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,3; },{},{}
+4080,Flora_Card,Flora Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Fish,20; },{},{}
+4081,Hode_Card,Hode Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Earth,30; bonus bFlee,5; },{},{}
+4082,Desert_Wolf_Card,Desert Wolf Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,0,15; bonus bBaseAtk,5; },{},{}
+4083,Rafflesia_Card,Rafflesia Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Fish,30; },{},{}
+4084,Marine_Sphere_Card,Marine Sphere Card,6,,10,10,,,,,,,,136,,,,,{ skill 7,3; },{},{}
+4085,Orc_Skeleton_Card,Orc Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Holy,20; },{},{}
+4086,Soldier_Skeleton_Card,Soldier Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritical,9; },{},{}
+4087,Giearth_Card,Giearth Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,Ele_Earth,15; },{},{}
+4088,Frilldora_Card,Frilldora Card,6,,10,10,,,,,,,,4,,,,,{ skill 135,1; },{},{}
+4089,Sword_Fish_Card,Swordfish Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Water; bonus bDef,1; },{},{}
+4090,Munak_Card,Munak Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,Ele_Earth,5; bonus bDef,1; },{},{}
+4091,Kobold_Card,Kobold Card,6,,10,10,,,,,,,,136,,,,,{ bonus bStr,1; bonus bCritical,4; },{},{}
+4092,Skel_Worker_Card,Skeleton Worker Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,1,15; bonus bBaseAtk,5; },{},{}
+4093,Obeaune_Card,Obeaune Card,6,,10,10,,,,,,,,136,,,,,{ skill 35,1; },{},{}
+4094,Archer_Skeleton_Card,Archer Skeleton Card,6,,10,10,,,,,,,,2,,,,,{ bonus bLongAtkRate,10; },{},{}
+4095,Marse_Card,Marse Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Water,30; bonus bFlee,5; },{},{}
+4096,Zenorc_Card,Zenorc Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10; },{},{}
+4097,Matyr_Card,Matyr Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,10; bonus bAgi,1; },{},{}
+4098,Dokebi_Card,Dokebi Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Wind; bonus bDef,1; },{},{}
+4099,Pasana_Card,Pasana Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Fire; bonus bDef,1; },{},{}
+4100,Sohee_Card,Sohee Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxSPrate,15; bonus bSPrecovRate,3; },{},{}
+4101,Sand_Man_Card,Sandman Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Earth; bonus bDef,1; },{},{}
+4102,Whisper_Card,Whisper Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,20; bonus2 bSubEle,Ele_Ghost,-50; },{},{}
+4103,Horong_Card,Horong Card,6,,10,10,,,,,,,,136,,,,,{ skill 10,1; },{},{}
+4104,Requiem_Card,Requiem Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Confusion,500; },{},{}
+4105,Marc_Card,Marc Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bSubEle,Ele_Water,5; bonus2 bResEff,Eff_Freeze,10000; },{},{}
+4106,Mummy_Card,Mummy Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,20; },{},{}
+4107,Verit_Card,Verit Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,8; bonus bMaxSPrate,8; },{},{}
+4108,Myst_Card,Myst Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Poison,30; bonus bFlee,5; },{},{}
+4109,Jakk_Card,Jakk Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Fire,30; bonus bFlee,5; },{},{}
+4110,Ghoul_Card,Ghoul Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Poison,2000; bonus bDef,1; },{},{}
+4111,Strouf_Card,Strouf Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Demon,20; },{},{}
+4112,Marduk_Card,Marduk Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Silence,10000; },{},{}
+4113,Marionette_Card,Marionette Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Ghost,30; bonus bFlee,5; },{},{}
+4114,Argiope_Card,Argiope Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Poison; bonus bDef,1; },{},{}
+4115,Hunter_Fly_Card,Hunter Fly Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bHpDrainRate,30,15; },{},{}
+4116,Isis_Card,Isis Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Dark,30; bonus bFlee,5; },{},{}
+4117,Side_Winder_Card,Sidewinder Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDoubleRate,5; },{},{}
+4118,Petit_Card,Earth Petite Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Dragon,20; },{},{}
+4119,Bathory_Card,Bathory Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Dark; },{},{}
+4120,Petit__Card,Sky Petite Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Dragon,30; },{},{}
+4121,Phreeoni_Card,Phreeoni Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,100; },{},{}
+4122,Deviruchi_Card,Deviruchi Card,6,,10,10,,,,,,,,769,,,,,{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; },{},{}
+4123,Eddga_Card,Eddga Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; }
+4124,Medusa_Card,Medusa Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,15; bonus2 bResEff,Eff_Stone,10000; },{},{}
+4125,Deviace_Card,Deviace Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7; },{},{}
+4126,Minorous_Card,Minorous Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddSize,2,15; bonus bBaseAtk,5; },{},{}
+4127,Nightmare_Card,Nightmare Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1; },{},{}
+4128,Golden_Bug_Card,Golden Thief Bug Card,6,,10,10,,,,,,,,32,,,,,{ bonus bNoMagicDamage,100; bonus bUseSPrate,100; },{},{}
+4129,Baphomet__Card,Bapho Jr. Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,3; bonus bCritical,1; },{},{}
+4130,Scorpion_King_Card,Scorpion King Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Undead,20; },{},{}
+4131,Moonlight_Flower_Card,Moonlight Flower Card,6,,10,10,,,,,,,,64,,,,,{ bonus bSpeedRate,25; },{},{}
+4132,Mistress_Card,Mistress Card,6,,10,10,,,,,,,,769,,,,,{ bonus bNoGemStone,0; bonus bUseSPrate,25; },{},{}
+4133,Daydric_Card,Raydric Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,20; },{},{}
+4134,Dracula_Card,Dracula Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSpDrainRate,100,5; },{},{}
+4135,Orc_Load_Card,Orc Lord Card,6,,10,10,,,,,,,,16,,,,,{ bonus bShortWeaponDamageReturn,30; },{},{}
+4136,Khalitzburg_Card,Khalitzburg Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,30; },{},{}
+4137,Drake_Card,Drake Card,6,,10,10,,,,,,,,2,,,,,{ bonus bNoSizeFix,0; },{},{}
+4138,Anubis_Card,Anubis Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Angel,30; },{},{}
+4139,Joker_Card,Joker Card,6,,10,10,,,,,,,,136,,,,,{ skill 50,1; },{},{}
+4140,Knight_Of_Abyss_Card,Abysmal Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_Boss,25; },{},{}
+4141,Evil_Druid_Card,Evil Druid Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Undead; bonus bInt,1; bonus bDef,1; },{},{}
+4142,Doppelganger_Card,Doppelganger Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,10; },{},{}
+4143,Orc_Hero_Card,Orc Hero Card,6,,10,10,,,,,,,,769,,,,,{ bonus bVit,3; bonus2 bResEff,Eff_Stun,10000; },{},{}
+4144,Osiris_Card,Osiris Card,6,,10,10,,,,,,,,136,,,,,{ bonus bRestartFullRecover,0; },{},{}
+4145,Berzebub_Card,Berzebub Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCastrate,-30; bonus bMaxSPrate,-15; bonus bMaxHPrate,-5; },{},{}
+4146,Maya_Card,Maya Card,6,,10,10,,,,,,,,32,,,,,{ bonus bMagicDamageReturn,50; },{},{}
+4147,Baphomet_Card,Baphomet Card,6,,10,10,,,,,,,,2,,,,,{ bonus bHit,-10; bonus bSplashRange,1; },{},{}
+4148,Pharaoh_Card,Pharaoh Card,6,,10,10,,,,,,,,769,,,,,{ bonus bUseSPrate,-30; },{},{}
+4149,Gargoyle_Card,Gargoyle Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12028,RC_Insect,300; },{},{}
+4150,Goat_Card,Goat Card,6,,10,10,,,,,,,,16,,,,,{ if(getrefine()<6) { bonus bDef,2; bonus bMdef,5; } },{},{}
+4151,Gajomart_Card,Gajomart Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Plant,-20; bonus2 bExpAddRace,RC_Plant,10; },{},{}
+4152,Galapago_Card,Galapago Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Juice,50; bonus3 bAddMonsterDropItemGroup,IG_Juice,RC_Insect,900; },{},{}
+4153,Crab_Card,Crab Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1266,30; if(isequipped(4247,4273)) { bonus3 bAddMonsterDropItem,544,RC_Fish,3000; bonus2 bAddEle,Ele_Water,30; } },{},{}
+4154,Rice_Cake_Boy_Card,Dumpling Child Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Candy,50; bonus3 bAddMonsterDropItem,529,RC_DemiHuman,300; bonus3 bAddMonsterDropItem,530,RC_DemiHuman,100; },{},{}
+4155,Goblin_Leader_Card,Goblin Leader Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,1,30; },{},{}
+4156,Steam_Goblin_Card,Goblin Steamrider Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Formless,7; },{},{}
+4157,Goblin_Archer_Card,Goblin Archer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Undead,7; },{},{}
+4158,Flying_Deleter_Card,Sky Deleter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bHPrecovRate,-100; bonus bHPGainValue,100; },{},{}
+4159,Nine_Tail_Card,Nine Tail Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,2; if(getrefine()>8) bonus bFlee,20; },{},{}
+4160,Antique_Firelock_Card,Firelock Soldier Card,6,,10,10,,,,,,,,64,,,,,{ bonus bStr,2; if(getrefine()>8) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } },{},{}
+4161,Grand_Peco_Card,Grand Peco Card,6,,10,10,,,,,,,,769,,,,,{ bonus4 bAutoSpellWhenHit,75,1,50,0; if(isequipped(4031)) { bonus bDef,3; bonus bVit,3; } },{},{}
+4162,Grizzly_Card,Grizzly Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Blind,1000+2000*(isequipped(4074)); },{},{}
+4163,Gryphon_Card,Gryphon Card,6,,10,10,,,,,,,,2,,,,,{ bonus bFlee,2; bonus bCritical,7; if (BaseClass == Job_Swordman) bonus3 bAutoSpell,62,5,10; },{},{}
+4164,Gullinbursti_Card,Gullinbursti Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Fish,-20; bonus2 bExpAddRace,RC_Fish,10; },{},{}
+4165,Gig_Card,Gig Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Insect,5; },{ },{ heal 0,-5; }
+4166,Nightmare_Terror_Card,Nightmare Terror Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Curse,1000+2000*(isequipped(4127)); },{},{}
+4167,Neraid_Card,Neraid Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Brute,5; },{},{ heal 0,-5; }
+4168,Dark_Lord_Card,Dark Lord Card,6,,10,10,,,,,,,,64,,,,,{ bonus4 bAutoSpellWhenHit,83,5,100,0; if(isequipped(4169)) { bonus bMaxHPrate,20; bonus bMaxSPrate,20; } },{},{}
+4169,Dark_Illusion_Card,Dark Illusion Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bCastrate,-10-10*isequipped(4168); },{},{}
+4170,Dark_Frame_Card,Dark Frame Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,2000; },{},{}
+4171,Dark_Priest_Card,Dark Priest Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPGainValue,1; },{},{}
+4172,The_Paper_Card,The Paper Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus2 bSPDrainValue,-1,0; },{},{}
+4173,Demon_Pungus_Card,Demon Pungus Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,2000; },{},{}
+4174,Deviling_Card,Deviling Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50; },{},{}
+4175,Poison_Toad_Card,Poisonous Toad Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,52,1,20,1; },{},{}
+4176,Dullahan_Card,Dullahan Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Dragon,7; },{},{}
+4177,Dryad_Card,Dryad Card,6,,10,10,,,,,,,,769,,,,,{ bonus3 bAddMonsterDropItem,993,RC_Plant,100; bonus2 bSubEle,Ele_Earth,10; },{},{}
+4178,Dragon_Tail_Card,Dragon Tail Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,1; bonus bFlee,10; bonus2 bSkillAtk,46,5; bonus2 bSkillAtk,47,5; },{},{}
+4179,Dragon_Fly_Card,Dragon Fly Card,6,,10,10,,,,,,,,4,,,,,{ bonus bAgi,1; if(isequipped(4009)) bonus bFlee,18; },{},{}
+4180,Driller_Card,Driller Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Dragon,5; },{ },{ heal 0,-5; }
+4181,Disguise_Card,Disguise Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Silence,1000+2000*(readparam(bVit)>=77); },{},{}
+4182,Diabolic_Card,Diabolic Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Demon,5; },{ },{ heal 0,-5; }
+4183,Vagabond_Wolf_Card,Vagabond Wolf Card,6,,10,10,,,,,,,,4,,,,,{ bonus bStr,1; if(isequipped(4029)) bonus bFlee,18; },{},{}
+4184,Lava_Golem_Card,Lava Golem Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,4,30; },{},{}
+4185,Rideword_Card,Rideword Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; if(BaseClass == Job_Acolyte) { bonus bInt,1; bonus bMdef,1; } },{},{}
+4186,Raggler_Card,Raggler Card,6,,10,10,,,,,,,,64,,,,,{ bonus bStr,1; bonus bVit,1; if(isequipped(4233,4281,4321,4206)) { bonus bLuk,10; bonus2 bSPDrainValue,2,0; bonus2 bSkillAtk,42,20; if(BaseClass == Job_Merchant) { bonus2 bAddMonsterDropItem,617,-2; bonus bMagicDamageReturn,20; } } },{},{}
+4187,Raydric_Archer_Card,Raydric Archer Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12030,RC_Demon,300; },{},{}
+4188,Leib_Olmai_Card,Leib Olmai Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Fire,10; bonus3 bAddMonsterDropItem,990,RC_Brute,100; },{},{}
+4189,Wraith_Dead_Card,Wraith Dead Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Curse,2000; },{},{}
+4190,Wraith_Card,Wraith Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12027,RC_Undead,300; },{},{}
+4191,Loli_Ruri_Card,Loli Ruri Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,28,3,50,0; },{},{}
+4192,Rotar_Zairo_Card,Rotar Zairo Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Fish,7; },{},{}
+4193,Lude_Card,Lude Card,6,,10,10,,,,,,,,136,,,,,{ if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) bonus4 bAutoSpellWhenHit,8,1,200,0; },{},{}
+4194,Rybio_Card,Rybio Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stun,1000+2000*(readparam(bDex)>=77); },{},{}
+4195,Leaf_Cat_Card,Leaf Cat Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Water,10; bonus3 bAddMonsterDropItem,991,RC_Fish,100; },{},{}
+4196,Marin_Card,Marin Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItem,909,2000; bonus2 bAddMonsterDropItem,7126,10; },{},{}
+4197,Mastering_Card,Mastering Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLuk,1; if(isequipped(4001)) bonus bFlee,18; },{},{}
+4198,Maya_Puple_Card,Maya Purple Card,6,,10,10,,,,,,,,769,,,,,{ bonus bIntravision,0; },{},{}
+4199,Merman_Card,Merman Card,6,,10,10,,,,,,,,64,,,,,{ bonus bHPrecovRate,10; bonus bSPrecovRate,10; if(isequipped(4297,4234,4252,4178)) { bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass == Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } } },{},{}
+4200,Megalith_Card,Megalith Card,6,,10,10,,,,,,,,64,,,,,{ if(getrefine()<6) bonus bMdef,7; },{},{}
+4201,Majoruros_Card,Majoruros Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stun,2000; },{},{}
+4202,Civil_Servant_Card,Civil Servant Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEle,Ele_Ghost,20; },{},{}
+4203,Mutant_Dragon_Card,Mutant Dragonoid Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus3 bAutoSpell,17,3+7*(getskilllv(17)==10),50; },{},{}
+4204,Mini_Demon_Card,Mini Demon Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Brute,-20; bonus2 bExpAddRace,RC_Brute,10; },{},{}
+4205,Mimic_Card,Mimic Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItem,603,-6; },{},{}
+4206,Mystcase_Card,Myst Case Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bAddMonsterDropItem,644,-24; },{},{}
+4207,Mysteltainn_Card,Mysteltainn Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,0,25; bonus bDef,1; },{},{}
+4208,Miyabi_Ningyo_Card,Miyabi Doll Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxSPrate,10; bonus2 bSkillAtk,15,5; },{},{}
+4209,Violy_Card,Violy Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,318,1+4*(getskilllv(318)==5),20,0; },{},{}
+4210,Wander_Man_Card,Wanderer Card,6,,10,10,,,,,,,,4,,,,,{ if(BaseClass == Job_Thief) bonus bFlee,20; if(isequipped(4172,4257,4230,4272) == 0) { bonus3 bAutoSpell,219,1,20; } else { bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,5; bonus2 bSPDrainValue,1,0; if(BaseClass == Job_Thief) bonus bNoGemStone,0; } },{},{}
+4211,Vocal_Card,Vocal Card,6,,10,10,,,,,,,,4,,,,,{ bonus bMdef,3; if(isequipped(4021)) bonus bFlee,18; },{},{}
+4212,Bon_Gun_Card,Bongun Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,5,1,20; bonus2 bAddSkillBlow,5,5; bonus2 bAddDamageByClass,1026,100; },{},{}
+4213,Brilight_Card,Brilight Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Silence,2000; },{},{}
+4214,Bloody_Murderer_Card,Bloody Murderer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Insect,7; },{},{}
+4215,Blazzer_Card,Blazer Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Food,500; },{},{}
+4216,Sasquatch_Card,Sasquatch Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,2000; },{},{}
+4217,Live_Peach_Tree_Card,Enchanted Peach Tree Card,6,,10,10,,,,,,,,32,,,,,{ bonus4 bAutoSpell,28,1+9*(getskilllv(28)==10),20,0; if(isequipped(4280,4185,4293,4312)) { bonus bVit,10; bonus bCastrate,-10; bonus bUseSPRate,-10; if(BaseClass == Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } } },{},{}
+4218,Succubus_Card,Succubus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,1000; bonus bVit,-3+4*isequipped(4269); bonus bHPrecovRate,-20+30*isequipped(4269); },{},{}
+4219,Sageworm_Card,Sage Worm Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Gemstone,90; },{},{}
+4220,Solider_Card,Solider Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDef,2; bonus bMdef,2; },{},{}
+4221,Skeleton_General_Card,Skeleton General Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Insect,-20; bonus2 bExpAddRace,RC_Insect,10; },{},{}
+4222,Skel_Prisoner_Card,Skeleton Prisoner Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,1000+2000*(isequipped(4025)); },{},{}
+4223,Stalactic_Golem_Card,Stalactic Golem Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Stun,2000; },{},{}
+4224,Stem_Worm_Card,Stem Worm Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12032,RC_Brute,300; },{},{}
+4225,Stone_Shooter_Card,Stone Shooter Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; bonus bHit,10; },{},{}
+4226,Sting_Card,Sting Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; if(getrefine()>8) bonus bMdef,5; },{},{}
+4227,Spring_Rabbit_Card,Spring Rabbit Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Meat,50; bonus3 bAddMonsterDropItemGroup,IG_Meat,RC_Brute,400; },{},{}
+4228,Sleeper_Card,Sleeper Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12031,RC_Fish,300; },{},{}
+4229,C_Tower_Manager_Card,Clock Tower Manager Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; bonus bCastrate,-5; if(isequipped(4244,4299,4313)) { bonus bDef,3; bonus bMdef,3; } },{},{}
+4230,Shinobi_Card,Shinobi Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,1; bonus4 bAutoSpellWhenHit,135,5,100,0; },{},{}
+4231,Increase_Soil_Card,Increase Soil Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bAddDamageByClass,1285,-50; bonus2 bAddDamageByClass,1286,-50; bonus2 bAddDamageByClass,1287,-50; },{},{}
+4232,Wild_Ginseng_Card,Hermit Plant Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Herb,50; bonus3 bAddMonsterDropItemGroup,IG_Herb,RC_Plant,1500; },{},{}
+4233,Baby_Leopard_Card,Baby Leopard Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,3; if(BaseClass == Job_Merchant) bonus bUnbreakableArmor,0; },{},{}
+4234,Anolian_Card,Anolian Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,45,1+9*(getskilllv(45)==10),30,0; },{},{}
+4235,Cookie_XMAS_Card,Christmas Cookie Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Angel,-20; bonus2 bExpAddRace,RC_Angel,10; },{},{}
+4236,Amon_Ra_Card,Amon Ra Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAllStats,1; bonus4 bAutoSpellWhenHit,73,10,(30+70*(readparam(bInt)>=99)),0; },{},{}
+4237,Owl_Duke_Card,Owl Duke Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,66,3,30,0; if(isequipped(4238)) bonus3 bAutoSpell,20,5,20; },{},{}
+4238,Owl_Baron_Card,Owl Baron Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,78,1,30; },{},{}
+4239,Iron_Fist_Card,Iron Fist Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Formless,-20; bonus2 bExpAddRace,RC_Formless,10; },{},{}
+4240,Arclouse_Card,Arclouze Card,6,,10,10,,,,,,,,32,,,,,{ if (getrefine()<6) { bonus bDef,2; bonus bMdef,3; } },{},{}
+4241,Archangeling_Card,Arc Angeling Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxHP,300; if(readparam(bLuk)>=77) { bonus bHPrecovRate,100; bonus bSPrecovRate,100; } },{},{}
+4242,Apocalips_Card,Apocalipse Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,2; if(getrefine()>8) bonus bMaxHP,800; },{},{}
+4243,Antonio_Card,Antonio Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,26,1,500,0; },{},{}
+4244,Alarm_Card,Alarm Card,6,,10,10,,,,,,,,64,,,,,{ bonus4 bAutoSpellWhenHit,10,1,200,0; bonus bMaxHP,300; bonus bVit,1; },{},{}
+4245,Am_Mut_Card,Am Mut Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_DemiHuman,-20; bonus2 bExpAddRace,RC_DemiHuman,10; },{},{}
+4246,Assulter_Card,Assaulter Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_DemiHuman,7; },{},{}
+4247,Aster_Card,Aster Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1074,30; },{},{}
+4248,Ancient_Mummy_Card,Ancient Mummy Card,6,,10,10,,,,,,,,32,,,,,{ bonus4 bAutoSpellWhenHit,32,5,30,0; if(isequipped(4106)) bonus bPerfectHitAddRate,20; },{},{}
+4249,Ancient_Worm_Card,Ancient Worm Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Demon,-20; bonus2 bExpAddRace,RC_Demon,10; },{},{}
+4250,Executioner_Card,Executioner Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,2,25; bonus bDef,1; },{},{}
+4251,Elder_Card,Elder Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,5,40; },{},{}
+4252,Alligator_Card,Alligator Card,6,,10,10,,,,,,,,136,,,,,{ bonus bLongAtkDef,5; },{},{}
+4253,Alice_Card,Alice Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Boss,40; bonus2 bSubRace,RC_NonBoss,-40; },{},{}
+4254,Tirfing_Card,Tirfing Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubSize,1,25; bonus bDef,1; },{},{}
+4255,Orc_Lady_Card,Orc Lady Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,3,30; },{},{}
+4256,Orc_Archer_Card,Orc Archer Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12034,RC_DemiHuman,300; },{},{}
+4257,Wild_Rose_Card,Wild Rose Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,1; if(BaseClass == Job_Thief) bonus bFlee2,5; },{},{}
+4258,Wicked_Nymph_Card,Evil Nymph Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,1; bonus bMaxSP,50; },{},{}
+4259,Wooden_Golem_Card,Wooden Golem Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDef,1; bonus bHPrecovRate,30; },{},{}
+4260,Wootan_Shooter_Card,Wootan Shooter Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Confusion,2000; },{},{}
+4261,Wootan_Fighter_Card,Wootan Fighter Card,6,,10,10,,,,,,,,769,,,,,{ bonus bDef,1; bonus2 bResEff,Eff_Bleeding,2000; },{},{}
+4262,Evil_Cloud_Hermit_Card,Cloud Hermit Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12029,RC_Plant,300; },{},{}
+4263,Incant_Samurai_Card,Incantation Samurai Card,6,,10,10,,,,,,,,2,,,,,{ bonus bIgnoreDefRace,RC_NonBoss; bonus bNoRegen,1; bonus2 bHPLossRate,666,10000; },{ },{ heal -999,0; }
+4264,Wind_Ghost_Card,Wind Ghost Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,84,3+7*(getskilllv(84)==10),20; },{},{}
+4265,Li_Me_Mang_Ryang_Card,Li Me Mang Ryang Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12033,RC_Angel,300; },{},{}
+4266,Eclipse_Card,Eclipse Card,6,,10,10,,,,,,,,4,,,,,{ bonus bVit,1; if(isequipped(4006)) bonus bFlee,18; },{},{}
+4267,Explosion_Card,Explosion Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Dragon,-20; bonus2 bExpAddRace,RC_Dragon,10; },{},{}
+4268,Injustice_Card,Injustice Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,136,1,50; if(isequipped(4277)) { bonus bBaseAtk,20; bonus bLuk,3; } },{},{}
+4269,Incubus_Card,Incubus Card,6,,10,10,,,,,,,,769,,,,,{ bonus bMaxSP,150; bonus bInt,-3+4*isequipped(4218); bonus bSPrecovRate,-20+30*isequipped(4218); },{},{}
+4270,Giant_Spider_Card,Giant Spider Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Poison,2000; },{},{}
+4271,Giant_Honet_Card,Giant Hornet Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Wind,10; bonus3 bAddMonsterDropItem,992,RC_Insect,100; },{},{}
+4272,Dancing_Dragon_Card,Dancing Dragon Card,6,,10,10,,,,,,,,136,,,,,{ bonus bAgi,1; bonus bCritical,3; },{},{}
+4273,Shellfish_Card,Shell Fish Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30; },{},{}
+4274,Zombie_Master_Card,Zombie Master Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Undead,5; },{ },{ heal 0,-5; }
+4275,Zombie_Prisoner_Card,Zombie Prisoner Card,6,,10,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10; },{},{}
+4276,Lord_Of_Death_Card,Lord of Death Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddEff,Eff_Stun,500; bonus2 bAddEff,Eff_Curse,500; bonus2 bAddEff,Eff_Silence,500; bonus2 bAddEff,Eff_Poison,500; bonus2 bAddEff,Eff_Bleeding,500; bonus2 bWeaponComaRace,RC_NonBoss,10; },{},{}
+4277,Zherlthsh_Card,Zherlthsh Card,6,,10,10,,,,,,,,32,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,316,10; bonus2 bSkillAtk,324,10; },{},{}
+4278,Gibbet_Card,Gibbet Card,6,,10,10,,,,,,,,769,,,,,{ if(getrefine()<6) bonus bMdef,5; },{},{}
+4279,Deleter_Card,Earth Deleter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bSPrecovRate,-100; bonus bSPGainValue,10; },{ },{ heal 0,-100; }
+4280,Geographer_Card,Geographer Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,34,2+8*(getskilllv(34)==10),30,0; },{},{}
+4281,Zipper_Bear_Card,Zipper Bear Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus2 bSPDrainValue,-1,0; if(BaseClass == Job_Merchant) bonus bUnbreakableWeapon,0; },{},{}
+4282,Tengu_Card,Tengu Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Recovery,500; },{},{}
+4283,Greatest_General_Card,Greatest General Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpell,261,5,2+18*(BaseClass == Job_Acolyte),0; },{},{}
+4284,Chepet_Card,Chepet Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,28,5,50; },{},{}
+4285,Choco_Card,Choco Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee2,5; bonus bFlee,10; },{},{}
+4286,Karakasa_Card,Karakasa Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Confusion,1000+2000*(readparam(bStr)>=77); },{},{}
+4287,Kapha_Card,Kapha Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()<6) bonus bMdef,8; },{},{}
+4288,Carat_Card,Carat Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,2; if(getrefine()>8) bonus bMaxSP,150; },{},{}
+4289,Caterpillar_Card,Caterpillar Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Plant,5; },{ },{ heal 0,-5; }
+4290,Cat_O_Nine_Tail_Card,Cat O' Nine Tails Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMdef,3; bonus bMagicDamageReturn,5; },{},{}
+4291,Kobold_Leader_Card,Kobold Leader Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,2,30; },{},{}
+4292,Kobold_Archer_Card,Kobold Archer Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Plant,7; },{},{}
+4293,Cookie_Card,Cookie Card,6,,10,10,,,,,,,,136,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,156,10; },{},{}
+4294,Quve_Card,Quve Card,6,,10,10,,,,,,,,136,,,,,{ if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) bonus4 bAutoSpellWhenHit,29,1,100,0; if(isequipped(4193)) { bonus bMaxHP,300; bonus bMaxSP,60; } },{},{}
+4295,Kraben_Card,Kraben Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Blind,2000; },{},{}
+4296,Cramp_Card,Cramp Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bGetZenyNum,10,3; if(isequipped(4028)) bonus bStr,3; },{},{}
+4297,Cruiser_Card,Cruiser Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Brute,7; },{},{}
+4298,Cremy_Fear_Card,Creamy Fear Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Confusion,2000; },{},{}
+4299,Clock_Card,Clock Card,6,,10,10,,,,,,,,16,,,,,{ bonus4 bAutoSpellWhenHit,249,3+7*(getskilllv(249)==10),30,0; },{},{}
+4300,Chimera_Card,Chimera Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Poison,1000+2000*(BaseJob==Job_Assassin); },{},{}
+4301,Killer_Mantis_Card,Killer Mantis Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Bleeding,2000; },{},{}
+4302,Tao_Gunka_Card,Tao Gunka Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,100; bonus bDef,-50; bonus bMdef,-50; },{},{}
+4303,Whisper_Boss_Card,Giant Whisper Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,10; if(readparam(bStr)>=80) bonus bBaseAtk,20; if(readparam(bVit)>=80) bonus bMaxHPrate,3; if(readparam(bLuk)>=80) bonus bCritical,3; },{},{}
+4304,Tamruan_Card,Tamruan Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,2; bonus2 bSkillAtk,250,10; bonus2 bSkillAtk,251,10; },{},{}
+4305,Turtle_General_Card,Turtle General Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAtkRate,20; if(BaseClass == Job_Swordman) bonus3 bAutoSpell,7,10,30; },{},{}
+4306,Toad_Card,Toad Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee2,1; if(isequipped(4014)) bonus bFlee,18; },{},{}
+4307,Kind_Of_Beetle_Card,Beetle King Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Fish,5; },{ },{ heal 0,-5; }
+4308,Tri_Joint_Card,Tri Joint Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Formless,5; },{ },{ heal 0,-5; }
+4309,Parasite_Card,Parasite Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,1; bonus2 bSubEle,Ele_Neutral,5; },{},{}
+4310,Panzer_Goblin_Card,Panzer Goblin Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Demon,7; },{},{}
+4311,Permeter_Card,Permeter Card,6,,10,10,,,,,,,,769,,,,,{ bonus2 bSubEle,Ele_Dark,15; bonus2 bSubEle,Ele_Undead,15; },{},{}
+4312,Fur_Seal_Card,Seal Card,6,,10,10,,,,,,,,2,,,,,{ bonus bFlee,3; bonus bHit,10; if(BaseClass == Job_Acolyte) { bonus2 bCriticalAddRace,RC_Undead,9; bonus2 bCriticalAddRace,RC_Demon,9; } },{},{}
+4313,Punk_Card,Punk Card,6,,10,10,,,,,,,,4,,,,,{ bonus4 bAutoSpellWhenHit,92,1+4*(getskilllv(92)==5),50,0; },{},{}
+4314,Penomena_Card,Penomena Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Formless,30; },{},{}
+4315,Pest_Card,Pest Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,1000+2000*(readparam(bInt)>=77); },{},{}
+4316,Fake_Angel_Card,False Angel Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Angel,5; },{ },{ heal 0,-5; }
+4317,Mobster_Card,Mobster Card,6,,10,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,15; if(BaseClass == Job_Thief) bonus bCritical,4; },{},{}
+4318,Knight_Windstorm_Card,Stormy Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,89,2,20; bonus2 bAddEff,Eff_Freeze,2000; },{},{}
+4319,Freezer_Card,Freezer Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHP,300; if(getrefine()>=9) bonus2 bSkillAtk,5,10; if(isequipped(4246,4311,4220,4331)) { bonus bStr,10; bonus bMaxHPrate,20; bonus bHPrecovRate,50; bonus4 bAutoSpell,112,1,3,0; bonus2 bAddMonsterDropItem,501,500; if(BaseClass == Job_Swordman) { bonus2 bAddItemHealRate,IG_Potion,50; } } },{},{}
+4320,Bloody_Knight_Card,Bloody Knight Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,83,1,20; },{},{}
+4321,Hylozoist_Card,Hylozoist Card,6,,10,10,,,,,,,,136,,,,,{ bonus bClassChange,100; },{},{}
+4322,High_Orc_Card,High Orc Card,6,,10,10,,,,,,,,32,,,,,{ bonus bDef,1; bonus bShortWeaponDamageReturn,5; },{},{}
+4323,Garm_Baby_Card,Garm Baby Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,15,3,50+250*isequipped(4324); },{},{}
+4324,Garm_Card,Garm Card,6,,10,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,5000; },{},{}
+4325,Harpy_Card,Harpy Card,6,,10,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,15; bonus2 bSkillAtk,11,5; if(isequipped(4191,4208,4258,4309,4327)) { bonus bMaxHP,500; bonus bDef,5; bonus bMDef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass == Job_Mage) { bonus bMatkRate,3; bonus bCastrate,-15; } } },{},{}
+4326,See_Otter_Card,Sea-Otter Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddItemHealRate,IG_Fish,50; bonus3 bAddMonsterDropItemGroup,IG_Fish,RC_Fish,600; },{},{}
+4327,Blood_Butterfly_Card,Bloody Butterfly Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCastrate,30; bonus bNoCastCancel,0; bonus2 bSkillAtk,18,5; },{},{}
+4328,Hyegun_Card,Hyegun Card,6,,10,10,,,,,,,,4,,,,,{ bonus bFlee,15; bonus bCritical,1; if(isequipped(4090,4212)) bonus bAllStats,1; },{},{}
+4329,Phendark_Card,Phendark Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_DemiHuman,5; },{ },{ heal 0,-5; }
+4330,Dark_Snake_Lord_Card,Evil Snake Lord Card,6,,10,10,,,,,,,,769,,,,,{ bonus bInt,3; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Curse,10000; },{},{}
+4331,Heater_Card,Heater Card,6,,10,10,,,,,,,,136,,,,,{ bonus bCritical,3; if(BaseClass == Job_Swordman) bonus bFlee2,3; },{},{}
+4332,Waste_Stove_Card,Waste Stove Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,5; bonus bInt,1; if(isequipped(4185,4293,4312)) { bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus4 bAutoSpell,32,5,10,1; bonus2 bSkillAtk,271,10; if(BaseJob == Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } } },{},{}
+4333,Venomous_Card,Venomous Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Poison,3000,2; },{},{}
+4334,Noxious_Card,Noxious Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLongAtkDef,20; },{},{}
+4335,Pitman_Card,Pitman Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,90,2; bonus2 bSkillAtk,91,2; },{},{}
+4336,Ungoliant_Card,Ungoliant Card,6,,10,10,,,,,,,,769,,,,,{ bonus bHPrecovRate,10; bonus2 bResEff,Eff_Bleeding,10000; },{},{}
+4337,Porcellio_Card,Porcellio Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,25; bonus bDef,-5; },{},{}
+4338,Obsidian_Card,Obsidian Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,readparam(bDex)/18; },{},{}
+4339,Mineral_Card,Mineral Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,-25; bonus bDef,3; },{},{}
+4340,Teddy_Bear_Card,Teddy Bear Card,6,,10,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Undead,30; },{},{}
+4341,Metaling_Card,Metaling Card,6,,10,10,,,,,,,,2,,,,,{ bonus3 bAutoSpell,215,1,50; },{},{}
+4342,RSX_0806_Card,RSX 0806 Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4343,Holden_Card,Holden Card,6,,10,10,,,,,,,,769,,,,,{ bonus bLuk,2; if(isequipped(4186,4281,4036,4233)) { bonus bStr,4; bonus bMaxHPrate,7; bonus bMaxSPrate,7; bonus2 bSkillAtk,42,20; bonus bSPDrainValue,1; if(BaseJob == Job_Alchem) { bonus4 bAutoSpell,111,1,10,0; bonus2 bAddMonsterDropItem,7139,300; bonus2 bAddMonsterDropItem,905,300; } } },{},{}
+4344,Anopheles_Card,Anopheles Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12058,RC_Insect,300; },{},{}
+4345,Hill_Wind_Card,Hill Wind Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,21,2; bonus2 bSkillAtk,84,2; bonus2 bSkillAtk,85,2; },{},{}
+4346,Egnigem_Cenia_Card,Egnigem Cenia Card,6,,10,10,,,,,,,,16,,,,,{ bonus bStr,readparam(bInt)/18; },{},{}
+4347,Armeyer_Dinze_Card,Armeyer Dinze Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddMonsterDropItem,12053,RC_Fish,300; },{},{}
+4348,Wikebine_Tres_Card,Wikebine Tres Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,217,1,50; if(isequipped(4039,4210,4257,4230)) { bonus bStr,6; bonus bAgi,4; bonus2 bSkillAtk,212,10; if(getskilllv(217)==5) bonus3 bAutoSpell,217,5,50; if(BaseJob == Job_Rogue) { bonus bUseSPrate,-20; bonus3 bAutoSpell,219,1,-20; } } },{},{}
+4349,Errende_Ebecee_Card,Errende Ebecee Card,6,,10,10,,,,,,,,136,,,,,{ bonus4 bAutoSpellWhenHit,25,1,50,0; },{},{}
+4350,Laurell_Weinder_Card,Laurell Weinder Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,88,1; bonus2 bSkillAtk,89,1; },{},{}
+4351,Kavach_Icarus_Card,Kavach Icarus Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()<=4) { bonus bFlee,20; bonus bFlee2,1; } else { bonus bFlee,10; } },{},{}
+4352,General_Egnigem_Cenia_Card,General Egnigem Cenia Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+4353,Remover_Card,Remover Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,(800-(80*getrefine())); bonus bHPrecovRate,10; },{},{}
+4354,Gemini-S58_Card,Gemini-S58 Card,6,,10,10,,,,,,,,769,,,,,{ if(readparam(bAgi)>=90) { bonus2 bResEff,Eff_Silence,3000; bonus2 bResEff,Eff_Stun,3000; } if(readparam(bVit)>=80) { bonus2 bResEff,Eff_Stone,5000; bonus2 bResEff,Eff_Sleep,5000; } },{},{}
+4355,Gremlin_Card,Gremlin Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12043,RC_Brute,300; },{},{}
+4356,Beholder_Card,Beholder Card,6,,10,10,,,,,,,,136,,,,,{ skill 275,1; },{},{}
+4357,Lord_Knight_Card,Lord Knight Card,6,,10,10,,,,,,,,769,,,,,{ skill 359,1; bonus bMaxHPrate,-50; },{},{}
+4358,Seyren_Windsor_Card,Seyren Windsor Card,6,,10,10,,,,,,,,769,,,,,{ bonus bStr,getrefine()-6; },{},{}
+4359,Assassin_Cross_Card,Assassin Cross Card,6,,10,10,,,,,,,,4,,,,,{ skill 135,3; },{},{}
+4360,Eremes_Guile_Card,Eremes Guile Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
+4361,Whitesmith_Card,Whitesmith Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBreakWeaponRate,1000; bonus bBreakArmorRate,700; },{},{}
+4362,Howard_Alt-Eisen_Card,Howard Alt-Eisen Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,-5; bonus bHit,40; },{},{}
+4363,High_Priest_Card,High Priest Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4364,Margaretha_Solin_Card,Margaretha Solin Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4365,High_Wizard_Card,High Wizard Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4366,Kathryne_Keyron_Card,Kathryne Keyron Card,6,,10,10,,,,,,,,769,,,,,{ bonus bCastrate,getrefine()*-1; },{},{}
+4367,Sniper_Card,Sniper Card,6,,10,10,,,,,,,,2,,,,,{ bonus bNoRegen,1; bonus2 bHpDrainRate,50,20; },{},{}
+4368,Cecil_Damon_Card,Cecil Damon Card,6,,10,10,,,,,,,,2,,,,,{ bonus bAspdRate,5; bonus bHit,-30; },{},{}
+4369,Venatu_Card,Venatu Card,6,,10,10,,,,,,,,16,,,,,{ bonus bLuk,readparam(bAgi)/18; },{},{}
+4370,Dimik_Card,Dimik Card,6,,10,10,,,,,,,,16,,,,,{ bonus bVit,getrefine()-5; },{},{}
+4371,Archdam_Card,Archdam Card,6,,10,10,,,,,,,,16,,,,,{ bonus bBaseAtk,10; bonus bCastrate,20; if(isequipped(4311,4319,4331)) { bonus bInt,1; bonus bStr,1; bonus bDef,2; bonus bSPrecovRate,10; bonus2 bSkillAtk,480,10; bonus2 bSkillAtk,368,10; bonus bCastrate,-10; if(BaseJob == Job_Crusader) { bonus bDefEle,Ele_Holy; } } },{},{}
+4372,Bacsojin_Card,Bacsojin Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4373,Chung_E_Card,Chung E Card,6,,10,10,,,,,,,,4,,,,,{ bonus bLuk, getrefine()-5; },{},{}
+4374,Vesper_Card,Vesper Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4375,Orc_Baby_Card,Orc Baby Card,6,,10,10,,,,,,,,4,,,,,{ if(getrefine()>=9) { bonus2 bSubEle,Ele_Neutral,15; bonus bFlee,15; } else { bonus2 bSubEle,Ele_Neutral,10; bonus bFlee,10; } },{},{}
+4376,Lady_Tany_Card,Lady Tanee Card,6,,10,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-50; bonus bMaxSPrate,50; bonus2 bAddMonsterDropItem,513,500; bonus2 bAddItemHealRate,513,100; },{},{}
+4377,Green_Iguana_Card,Green Iguana Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12063,RC_Formless,300; },{},{}
+4378,Gold_Acidus_Card,Gold Acidus Card,6,,10,10,,,,,,,,64,,,,,{ if(getrefine()<=4) { bonus bMaxHPrate,8; bonus bMaxSPrate,8; bonus bHPrecovRate,5; bonus bSPrecovRate,5; } else { bonus bMaxHPrate,4; bonus bMaxSPrate,4; } },{},{}
+4379,Blue_Acidus_Card,Blue Acidus Card,6,,10,10,,,,,,,,769,,,,,{ if(getrefine()<=4) { bonus bSPrecovRate,5; bonus bMaxSP,80; } else { bonus bMaxSP,40; } },{},{}
+4380,Red_Ferus_Card,Red Ferus Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,80,2; bonus2 bSkillAtk,83,2; },{},{}
+4381,Green_Ferus_Card,Green Ferus Card,6,,10,10,,,,,,,,64,,,,,{ bonus bVit,1; bonus bMaxHPrate,10; if(isequipped(4297,4234,4252,4178)) { bonus bDex,5; bonus2 bSkillAtk,394,5; bonus2 bSkillAtk,324,10; bonus2 bSkillAtk,316,10; if(BaseJob == Job_Bard || BaseJob == Job_Dancer) { bonus4 bAutoSpellWhenHit,489,2,50,1; } } },{},{}
+4382,Yellow_Novus_Card,Yellow Novus Card,6,,10,10,,,,,,,,16,,,,,{ bonus bMaxHP,500; bonus bHPrecovRate,10; if(isequipped(4208,4258,4325,4327)) { bonus bInt,3; bonus2 bSkillAtk,91,10; bonus2 bSkillAtk,21,10; if(BaseJob == Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bCastrate,-20; } } },{},{}
+4383,Red_Novus_Card,Red Novus Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Confusion,3000,2; },{},{}
+4384,Hydro_Card,Hydro Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,277,1,100; },{},{}
+4385,Dragon_Egg_Card,Dragon Egg Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12048,RC_Dragon,300; },{},{}
+4386,Detale_Card,Detale Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4387,Ancient_Mimic_Card,Ancient Mimic Card,6,,10,10,,,,,,,,16,,,,,{ bonus bAgi,readparam(bLuk)/18; },{},{}
+4388,Deathword_Card,Deathword Card,6,,10,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,11,2; bonus2 bSkillAtk,13,2; bonus2 bSkillAtk,400,2; },{},{}
+4389,Plasma_Card,Plasma Card,6,,10,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Resist,1200; },{},{}
+4390,Breeze_Card,Breeze Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddEff,Eff_Bleeding,500; },{},{}
+4391,Retribution_Card,Retribution Card,6,,10,10,,,,,,,,136,,,,,{ bonus3 bAddMonsterDropItem,12068,RC_Angel,300; },{},{}
+4392,Observation_Card,Observation Card,6,,10,10,,,,,,,,16,,,,,{ bonus bDex,readparam(bVit)/18; },{},{}
+4393,Shelter_Card,Shelter Card,6,,10,10,,,,,,,,16,,,,,{ bonus bInt,readparam(bStr)/18; },{},{}
+4394,Solace_Card,Solace Card,6,,10,10,,,,,,,,2,,,,,{ if(BaseJob == Job_Priest) bonus4 bAutoSpell,254,5,10,0; },{},{}
+4395,Thanatos_Maero_Card,Thanatos Maero Card,6,,10,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus3 bAutoSpell,30,3,50; },{},{}
+4396,Thanatos_Odium_Card,Thanatos Odium Card,6,,10,10,,,,,,,,64,,,,,{ bonus bAgi,getrefine()-5;},{},{}
+4397,Thanatos_Despero_Card,Thanatos Despero Card,6,,10,10,,,,,,,,32,,,,,{ bonus bInt,getrefine()-6; },{},{}
+4398,Thanatos_Dolor_Card,Thanatos Dolor Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4399,Thanatos_Card,Thanatos Card,6,,10,10,,,,,,,,2,,,,,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; bonus bSPDrainValue,-1; bonus bDef,-30; bonus bFlee,-30; },{},{}
+4400,Aliza_Card,Aliza Card,6,,10,10,,,,,,,,16,,,,,{ if(BaseJob == Job_Dancer) { bonus4 bAutoSpellWhenHit,1011,1,100,1; } else { bonus4 bAutoSpellWhenHit,1011,1,50,1; } },{},{}
+4401,Alicel_Card,Alicel Card,6,,10,10,,,,,,,,16,,,,,{ bonus bFlee,10; bonus bDef,-5; },{},{}
+4402,Aliot_Card,Aliot Card,6,,10,10,,,,,,,,4,,,,,{ if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) { bonus bStr, 2; bonus bMaxHPrate, 5; } if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) { bonus bInt, 2; bonus bMaxSPrate, 5; } },{},{}
+4403,Kiel_D-01_Card,Kiel D-01 Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4404,Skogul_Card,Skogul Card,6,,10,10,,,,,,,,16,,,,,{ bonus3 bAddEffWhenHit,Eff_Bleeding,3000,2; },{},{}
+4405,Frus_Card,Frus Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4406,Skeggiold_Card,Skeggiold Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+4407,Valkyrie_Randgris_Card,Valkyrie Randgris Card,6,,10,10,,,,,,,,,,,,,{},{},{}
+
+// More Headgears
+//===================================================================
+5001,Headset,Headset,5,,10,200,,3,,0,0xFFFFFFFE,7,2,256,,0,1,87,{ bonus2 bResEff,Eff_Curse,1000; },{},{}
+5002,Gemmed_Crown,Jewel Crown,5,,10,600,,4,,0,0x000654E2,7,2,256,,60,1,88,{ bonus bMdef,3; bonus bInt,2; bonus bLuk,1; },{},{}
+5003,Joker_Jester,Joker Jester,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,89,{ bonus bMdef,5; bonus bLuk,2; },{},{}
+5004,Oxygen_Mask,Oxygen Mask,5,,10,200,,0,,0,0xFFFFFFFE,7,2,1,,0,0,90,{ bonus2 bResEff,Eff_Poison,2000; },{},{}
+5005,Gas_Mask,Gas Mask,5,,10,100,,1,,0,0xFFFFFFFE,7,2,513,,0,0,91,{ bonus2 bResEff,Eff_Poison,3000; },{},{}
+5006,Machoman_Glasses,Machoman's Glasses,5,36000,,100,,1,,0,0xFFFFFFFE,7,2,512,,0,0,92,{},{},{}
+5007,Loard_Circlet,Grand Circlet,5,,10,200,,3,,0,0xFFFFFFFE,7,2,256,,55,1,93,{ bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1; },{},{}
+5008,Puppy_Love,Puppy Love,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,0,94,{},{},{}
+5009,Safety_Helmet,Safety Helmet,5,,10,500,,3,,0,0xFFFFFFFE,7,2,256,,0,1,95,{ bonus bMdef,3; bonus bUnbreakableHelm,0; },{},{}
+5010,Indian_Hair_Piece,Indian Fillet,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,96,{},{},{}
+5011,Antenna,Aerial,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,97,{},{},{}
+5012,Ph.D_Hat,Ph.D Hat,5,,10,100,,3,,0,0xFFFFFFFE,7,2,256,,0,1,98,{ bonus bMdef,3; },{},{}
+5013,Horn_Of_Lord_Kaho,Lord Kaho's Horn,5,,10,100,,5,,0,0xFFFFFFFF,7,2,256,,0,1,99,{ bonus bMdef,10; bonus bStr,5; bonus bAgi,10; bonus bVit,10; bonus bInt,5; bonus bLuk,20; },{},{}
+5014,Fin_Helm,Fin Helm,5,,10,300,,2,,0,0x00004082,7,2,512,,65,0,100,{},{},{}
+5015,Egg_Shell,Egg Shell,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,0,101,{},{},{}
+5016,Boy's_Cap,Boys Cap,5,,10,100,,2,,0,0xFFFFFFFE,7,2,256,,0,1,102,{},{},{}
+5017,Bone_Helm,Bone Helm,5,,10,800,,7,,0,0x000444A2,7,2,256,,70,1,103,{ bonus2 bSubEle,Ele_Dark,-15; },{},{}
+5018,Feather_Bonnet,Feather Bonnet,5,,10,300,,4,,0,0x00080808,7,2,256,,0,1,104,{ bonus bAgi,1; },{},{}
+5019,Corsair,Corsair,5,,10,500,,5,,0,0xFFFFFFFE,7,2,256,,0,1,105,{ bonus bVit,1; },{},{}
+5020,Kafra_Band,Kafra Band,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,0,1,106,{ bonus bMdef,3; },{},{}
+5021,Bankruptcy_Of_Heart,Grief for Greed,5,,10,1200,,4,,0,0x00040420,7,2,256,,38,1,107,{ bonus bInt,1; bonus bDex,1; },{},{}
+5022,Helm_Of_Sun,Hat of the Sun God,5,,10,2400,,4,,0,0x00CFDF80,7,2,768,,0,1,138,{ bonus bStr,3; bonus bInt,2; },{},{}
+5023,Hat_Of_Bundle,Parcel Hat,5,,10,1000,,0,,0,0x00040420,7,2,256,,0,1,108,{},{},{}
+5024,Hat_Of_Cake,Cake Hat,5,,10,1500,,1,,0,0xFFFFFFFF,7,2,256,,0,1,109,{},{},{}
+5025,Helm_Of_Angel,Helm of Angel,5,,10,1600,,5,,0,0x00CFDF80,7,2,256,,74,1,110,{ bonus bAgi,1; bonus bLuk,1; bonus bMdef,3; },{},{}
+5026,Hat_Of_Cook,Chef Hat,5,,10,300,,1,,0,0xFFFFFFFE,7,2,256,,50,1,111,{ bonus bDex,1; },{},{}
+5027,Wizardry_Hat,Mage Hat,5,,10,300,,1,,0,0x00810204,7,2,256,,0,1,112,{ bonus bInt,2; bonus bMaxSP,150; },{},{}
+5028,Candle,Candle,5,,10,150,,5,,0,0xFFFFFFFF,7,2,256,,0,1,113,{},{},{}
+5029,Spore_Hat,Spore Hat,5,,10,900,,3,,0,0xFFFFFFFE,7,2,256,,20,1,114,{},{},{}
+5030,Panda_Cap,Panda Hat,5,,10,800,,3,,0,0xFFFFFFFE,7,2,256,,40,1,115,{},{},{}
+5031,Mine_Helm,Mine Hat,5,,10,1500,,4,,0,0x0006D5F2,7,2,256,,55,1,116,{ bonus bDex,2; },{},{}
+5032,Picnic_Hat,Sunday Hat,5,,10,800,,1,,0,0xFFFFFFFE,7,2,256,,0,1,117,{},{},{}
+5033,Smokie_Hat,Raccoon Hat,5,,10,900,,3,,0,0xFFFFFFFE,7,2,256,,50,1,118,{},{},{}
+5034,Light_Bulb_Band,Bulb Band,5,,10,500,,0,,0,0xFFFFFFFE,7,2,256,,0,1,119,{},{},{}
+5035,Poring_Hat,Poring Hat,5,,10,700,,2,,0,0xFFFFFFFE,7,2,256,,38,1,120,{},{},{}
+5036,Cross_Band,Cross Hat,5,,10,250,,1,,0,0xFFFFFFFE,7,2,256,,10,1,121,{},{},{}
+5037,Fruit_Shell,Nutshell,5,,10,150,,4,,0,0xFFFFFFFF,7,2,256,,5,0,122,{},{},{}
+5038,Deviruchi_Cap,Deviruchi Hat,5,,10,800,,2,,0,0xFFFFFFFE,7,2,256,,64,1,123,{ bonus bStr,1; bonus bInt,1; },{},{}
+5039,Mottled_Egg_Shell,Rainbow Eggshell,5,,10,400,,4,,0,0xFFFFFFFF,7,2,256,,19,0,124,{},{},{}
+5040,Blush,Blush,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,125,{},{},{}
+5041,Heart_Hair_Pin,Heart Hairpin,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,126,{},{},{}
+5042,Hair_Protector,Bao Bao,5,,10,150,,0,,0,0xFFFFFFFE,7,2,256,,14,1,127,{},{},{}
+5043,Opera_Ghost_Mask,Opera Phantom Mask,5,,10,200,,1,,0,0xFFFFFFFE,7,2,512,,20,0,128,{},{},{}
+5044,Devil's_Wing,Wings of Diablo,5,,10,350,,2,,0,0xFFFFFFFF,7,2,256,,45,1,129,{},{},{}
+5045,Magician_Hat,Magician Hat,5,,10,500,,3,,0,0x00818314,7,2,256,,50,1,130,{ bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50; },{},{}
+5046,Bongun_Hat,Bongun Hat,5,,10,300,,5,,0,0xFFFFFFFF,7,2,769,,0,0,139,{},{},{}
+5047,Fashion_Sunglass,Fashionable Glasses,5,,10,100,,0,,0,0xFFFFFFFE,7,2,256,,0,1,131,{},{},{}
+5048,First_Moon_Hair_Pin,Cresent Hairpin,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,132,{},{},{}
+5049,Stripe_Band,Striped Hairband,5,,10,150,,1,,0,0xFFFFFFFF,7,2,256,,0,0,133,{},{},{}
+5050,Mystery_Fruit_Shell,Wonder_Nutshell,5,,10,300,,5,,0,0xFFFFFFFF,7,2,256,,30,0,134,{},{},{}
+5051,Kitty_Bell,Pussy_Cat_Bell,5,,10,100,,5,,0,0xFFFFFFFF,7,2,1,,0,0,135,{},{},{}
+5052,Blue_Hair_Band,Blue Hairband,5,,10,150,,1,,0,0xFFFFFFFF,7,2,256,,0,1,136,{},{},{}
+5053,Spinx_Helm,Sphinx Hat,5,,10,3000,,5,,0,0x00004082,7,2,257,,65,0,137,{ bonus bStr,3; },{},{}
+5054,Assassin_Mask,Assassin Mask,5,,10,100,,0,,0,0x00001100,7,2,1,,70,0,180,{},{},{}
+5055,Novice_Egg_Cap,Novice False Eggshell,5,,10,1,,3,,0,0x00000001,7,2,256,,0,0,101,{},{},{}
+5056,Love_Berry,Fruit of Love,5,,10,200,,0,,0,0xFFFFFFFF,7,2,256,,0,1,140,{},{},{}
+5057,Ear_Of_Black_Cat,Black Cat Ears,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,45,1,141,{},{},{}
+5058,Drooping_Kitty,Drooping Cat,5,,10,500,,1,,0,0xFFFFFFFE,7,2,256,,0,1,142,{ bonus bMDef,15; bonus2 bResEff,Eff_Curse,3000; },{},{}
+5059,Brown_Bear_Cap,Teddybear Hat,5,,10,800,,3,,0,0xFFFFFFFF,7,2,256,,50,1,143,{},{},{}
+5060,Party_Hat,Party Hat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,144,{ bonus bLuk,1; },{},{}
+5061,Flower_Hairpin,Flower Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,145,{},{},{}
+5062,Straw_Hat,Straw Hat,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,50,1,146,{ bonus bAgi,1; },{},{}
+5063,Plaster,Giant Band Aid,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,147,{},{},{}
+5064,Leaf_Headgear,Smokie Leaf,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,148,{},{},{}
+5065,Fish_On_Head,Blue Fish,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,50,1,149,{ bonus2 bAddRace,RC_Fish,10; },{},{}
+5066,Horn_Of_Succubus,Succubus Horn,5,,10,800,,4,,0,0xFFFFFFFE,7,2,256,,70,1,150,{ bonus bInt,1; bonus bMdef,10; },{},{}
+5067,Sombrero,Sombrero,5,,10,350,,4,,0,0xFFFFFFFE,7,2,256,,0,1,151,{ bonus bAgi,1; },{},{}
+5068,Ear_Of_Devil's_Wing,Evil Wing Ears,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,70,0,152,{ bonus bStr,1; },{},{}
+5069,Mask_Of_Fox,Kitsune Mask,5,,10,300,,1,,0,0xFFFFFFFE,7,2,256,,0,1,153,{ bonus bAgi,1; bonus bLuk,1; },{},{}
+5070,Headband_Of_Power,Hot-blooded Headband,5,,10,100,,1,,0,0xFFFFFFFE,7,2,256,,0,1,154,{ bonus bStr,2; },{},{}
+5071,Indian_Headband,Indian Headband,5,,10,200,,1,,0,0xFFFFFFFE,7,2,256,,0,1,155,{ bonus bDex,1; },{},{}
+5072,Inccubus_Horn,Incubus Horn,5,,10,800,,4,,0,0xFFFFFFFE,7,2,256,,70,1,156,{ bonus bAgi,1; bonus bMdef,10; },{},{}
+5073,Cap_Of_Concentration,Model Training Hat,5,,10,700,,2,,0,0xFFFFFFFE,7,2,256,,0,1,157,{ bonus bDex,2; },{},{}
+5074,Ear_Of_Angel's_Wing,Angel Wing Ears,5,,10,100,,1,,0,0xFFFFFFFF,7,2,512,,70,0,158,{ bonus bStr,1; },{},{}
+5075,Cowboy_Hat,Cowboy Hat,5,,10,500,,4,,0,0xFFFFFFFF,7,2,256,,0,1,159,{},{},{}
+5076,Fur_Hat,Beanie,5,,10,350,,2,,0,0xFFFFFFFF,7,2,256,,0,1,160,{ bonus bLuk,1; },{},{}
+5077,Tulip_Hairpin,Tulip Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,161,{},{},{}
+5078,Sea_Otter_Cap,Sea-Otter Hat,5,,10,800,,3,,0,0xFFFFFFFF,7,2,256,,50,1,162,{ bonus bVit,1; },{},{}
+5079,Crossed_Hair_Band,X Hairpin,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,163,{},{},{}
+5080,Headgear_Of_Queen,Crown of Ancient Queen,5,,10,400,,4,,0,0xFFFFFFFF,7,2,256,,45,1,164,{},{},{}
+5081,Mistress_Crown,Crown of Mistress,5,,10,100,,1,,0,0xFFFFFFFE,7,0,256,,75,1,165,{ bonus bMaxSP,100; bonus bInt,2; bonus bUnbreakableHelm,0; },{},{}
+5082,Mushroom_Band,Decorative Mushroom,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,166,{},{},{}
+5083,Red_Tailed_Ribbon,Red Ribbon,5,,10,200,,1,,0,0xFFFFFFFF,7,0,256,,45,1,167,{ bonus bMdef,10; },{},{}
+5084,Lazy_Raccoon,Lazy Smokie,5,,10,500,,1,,0,0xFFFFFFFE,7,2,256,,0,1,168,{ bonus2 bResEff,Eff_Sleep,2000; },{},{}
+5085,Pair_Of_Red_Ribbon,Small Ribbons,5,,10,100,,1,,0,0xFFFFFFFF,7,0,512,,45,0,169,{},{},{}
+5086,Alarm_Mask,Alarm Mask,5,,10,100,,2,,0,0xFFFFFFFE,7,2,513,,0,0,170,{ bonus2 bResEff,Eff_Blind,5000; },{},{}
+5087,Goblin_Mask_01,Poker Face,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,171,{},{},{}
+5088,Goblin_Mask_02,Surprised Mask,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,172,{},{},{}
+5089,Goblin_Mask_03,Annoyed Mask,5,,10,100,,1,,0,0xFFFFFFFF,7,2,513,,0,0,173,{},{},{}
+5090,Goblin_Mask_04,Goblin Leader Mask,5,,10,100,,2,,0,0xFFFFFFFF,7,2,513,,0,0,174,{},{},{}
+5091,Big_Golden_Bell,Decorative Golden Bell,5,,10,200,,2,,0,0xFFFFFFFE,7,2,768,,35,1,175,{},{},{}
+5092,Blue_Coif,Coif,5,150000,,300,,5,,0,0x00001100,7,0,768,,65,1,176,{},{},{}
+5093,Blue_Coif_,Coif,5,150000,,300,,5,,1,0x00001100,7,0,768,,65,1,177,{ bonus bMaxSP,100; },{},{}
+5094,Orc_Hero_Helm,Helmet of Orc Hero,5,500000,,900,,5,,0,0xFFFFFFFE,7,2,768,,55,1,178,{ bonus bStr,2; bonus bVit,1; },{},{}
+5095,Orc_Hero_Helm_,Helmet of Orc Hero,5,800000,,1000,,5,,1,0xFFFFFFFE,7,2,768,,55,1,178,{ bonus bStr,2; bonus bVit,1; },{},{}
+5096,Assassin_Mask_,Assassin Mask,5,,10,100,,0,,0,0x00001100,7,2,1,,70,0,180,{},{},{}
+5097,Cone_Hat_,4 Years Anniversary Hat,5,,10,400,,0,,0,0xFFFFFFFF,7,2,256,,0,1,144,{},{},{}
+5098,Tiger_Mask,Tiger Mask,5,,10,400,,2,,0,0xFFFFFFFF,7,2,768,,50,0,181,{ bonus bStr,3; bonus bMaxHP,100; },{},{}
+5099,Cat_Hat,Neko Mimi,5,,10,300,,1,,0,0xFFFFFFFF,7,2,256,,0,1,182,{ bonus bLuk,2; bonus bMdef,10; bonus2 bSubRace,RC_Brute,5; },{},{}
+5100,Sales_Signboard,Sales Banner,5,,10,800,,1,,0,0xFFFFFFFF,7,2,256,,75,1,183,{ bonus bStr,1; bonus bAgi,1; bonus bLuk,1; },{},{}
+5101,Takius_Blindfold,Takius's Blindfold,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,184,{},{},{}
+5102,Round_Eyes,Blank Eyes,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,185,{},{},{}
+5103,Sunflower_Hairpin,Sunflower Hairpin,5,,10,600,,1,,0,0xFFFFFFFE,7,2,256,,30,0,186,{ bonus bAgi,2; bonus bCritical,5; },{},{}
+5104,Dark_Blindfold,Dark Blinder,5,,10,100,,0,,0,0xFFFFFFFE,7,2,512,,0,0,184,{ bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Stun,200; },{},{}
+5105,Hat_Of_Cake_,2nd Anniversary Hat,5,,10,1000,,1,,0,0xFFFFFFFF,7,2,256,,24,1,109,{ bonus bDex,1; bonus bMaxSP,80; },{},{}
+5106,Cone_Hat_INA,2nd Anniversary Hat,5,,10,300,,3,,0,0xFFFFFFFF,7,2,256,,24,1,144,{ bonus bLuk,1; },{},{}
+5107,Well_Baked_Toast,Crunch Toast,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,188,{},{},{}
+5108,Detective_Hat,Renown Detective's Cap,5,,10,350,,3,,1,0xFFFFFFFF,7,2,256,,0,1,189,{},{},{}
+5109,Red_Bonnet,Red Bonnet,5,,10,400,,2,,0,0xFFFFFFFF,7,2,256,,0,1,190,{},{},{}
+5110,Baby_Pacifier,Baby Pacifier,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,191,{},{},{}
+5111,Galapago_Cap,Galapago Cap,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,55,1,192,{ bonus2 bAddMonsterDropItem,605,30; },{},{}
+5112,Super_Novice_Hat,Super Novice Hat,5,8500,,400,,4,,0,0x00000001,7,2,256,,40,1,193,{ bonus bAllStats,1; },{},{}
+5113,Angry_Mouth,Angry Snarl,5,,10,50,,0,,0,0xFFFFFFFF,7,2,1,,0,0,194,{},{},{}
+5114,Fedora,Bucket Hat,5,6000,,300,,3,,0,0xFFFFFFFF,7,2,256,,0,1,195,{},{},{}
+5115,Winter_Hat,Winter Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,0,1,196,{ bonus2 bResEff,Eff_Freeze,1000; },{},{}
+5116,Banana_Hat,Banana Hat,5,,10,200,,1,,0,0xFFFFFFFF,7,2,256,,0,1,197,{ bonus3 bAutoSpell,6,3,30; },{},{}
+5117,Mistic_Rose,Mystic Rose,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,198,{ bonus2 bSubRace,RC_Plant,2; },{},{}
+5118,Ear_Of_Puppy,Puppy Headband,5,,10,100,,2,,0,0xFFFFFFFF,7,2,256,,0,1,199,{},{},{}
+5119,Super_Novice_Hat_,Super Novice Hat,5,8500,,400,,4,,1,0x00000001,7,2,256,,40,1,193,{ bonus bAllStats,1; },{},{}
+5120,Fedora_,Bucket Hat,5,6000,,300,,3,,1,0xFFFFFFFF,7,2,256,,0,1,195,{},{},{}
+5121,Zherlthsh_Mask,Zherlthsh Mask,5,,10,400,,3,,0,0xFFFFFFFE,7,2,768,,70,1,200,{ bonus2 bAddRace,RC_DemiHuman,5; bonus2 bSubRace,RC_DemiHuman,5; },{},{}
+5122,Magni_Cap,Magni's Cap,5,,10,1000,,5,,0,0xFFFFFFFE,7,2,256,,65,1,250,{ bonus bStr,2; },{},{}
+5123,Ulle_Cap,Ulle's Cap,5,,10,500,,3,,1,0xFFFFFFFE,7,2,256,,65,1,254,{ bonus bDex,2; bonus bAgi,1; if(isequipped(2353) && bDex>=70) bonus bUseSPrate,-10; },{},{}
+5124,Fricca_Circlet,Frigg's Circlet,5,,10,300,,3,,0,0xFFFFFFFE,7,2,256,,65,1,251,{ bonus bMdef,10; bonus bInt,2; bonus bMaxSP,50; },{},{}
+5125,Kiss_Of_Angel,Angel's Kiss,5,,10,300,,2,,1,0x00000001,7,2,256,,50,1,255,{ bonus bSPrecovRate,3; },{},{}
+5126,Morpheus's_Hood,Morpheus's Hood,5,,10,200,,1,,0,0xFFFFFFFE,7,2,256,,33,1,256,{ bonus bInt,2; if(isequipped(2518,2648,2649)) { bonus bInt,5; bonus bMdef,11; bonus bMaxSPrate,20; bonus bNoCastCancel,0; bonus bCastrate,25; } },{},{}
+5127,Morrigane's_Helm,Morrigane's Helm,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,61,1,257,{ bonus bLuk,2; bonus bBaseAtk,3; if(isequipped(2519,2650,2651)) { bonus bStr,2; bonus bLuk,9; bonus bCritical,13; bonus bBaseAtk,18; bonus bFlee2,13; } },{},{}
+5128,Goibne's_Helmet,Goibne's Helm,5,,10,500,,5,,0,0xFFFFFFFE,7,2,256,,54,1,258,{ bonus bVit,3; bonus bMdef,3; if(isequipped(2354,2419,2520)) { bonus bVit,5; bonus bMaxHPrate,15; bonus bMaxSPrate,5; bonus bDef,5; bonus bMdef,15; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Wind,10; } },{},{}
+5129,Bird_Nest,Bird Nest,5,,10,400,,1,,0,0xFFFFFFFF,7,2,256,,55,1,201,{ bonus bAgi,2; bonus2 bSubRace,RC_Brute,10; },{},{}
+5130,Lion_Mask,Lion Mask,5,,10,700,,0,,0,0x00CFDF80,7,2,768,,75,1,202,{ bonus2 bAddEffWhenHit,Eff_Silence,300; bonus bMdef,1; },{},{}
+5131,Close_Helmet,Close Helmet,5,,10,1200,,8,,0,0x00004082,7,2,769,,75,1,203,{ bonus bVit,3; bonus bMaxHPrate,3; },{},{}
+5132,Angeling_Hat,Angeling Hat,5,,10,700,,2,,0,0xFFFFFFFF,7,2,256,,38,1,204,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
+5133,Sheep_Hat,Sheep Hat,5,,10,150,,1,,0,0x00008110,7,2,256,,0,1,205,{ bonus bShortWeaponDamageReturn,5; },{},{}
+5134,Pumpkin-Head,Pumpkin-Head,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,0,0,206,{},{},{}
+5135,Cyclops_Eye,Cyclop's Eye,5,,10,200,,0,,0,0xFFFFFFFE,7,2,512,,75,0,207,{ bonus bMaxSP,50; },{},{}
+5136,Santa's_Hat_,Louise's Santa Hat,5,,10,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,20,{ bonus bMdef,1; bonus bLuk,1; },{},{}
+5137,Alice_Doll,Alice Doll,5,,10,500,,0,,1,0xFFFFFFFE,7,2,256,,30,0,208,{ bonus bStr,1; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEff2,Eff_Sleep,10; },{},{}
+5138,Magic_Eyes,Magic Eyes,5,,10,300,,1,,0,0x00810204,7,2,256,,30,1,209,{ bonus bMdef,5; bonus bCastrate,-10; bonus bUseSPrate,20; },{},{}
+5139,Lotus,Lotus,5,,10,200,,0,,0,0xFFFFFFFF,7,2,256,,10,0,210,{ bonus bDex,1; bonus bInt,1; bonus bMdef,5; },{},{}
+5140,Kawaii_Ribbon,Kawaii Ribbon,5,,10,400,,1,,1,0xFFFFFFFF,7,2,256,,10,1,211,{ bonus2 bSubRace,RC_Undead,5; bonus2 bSubRace,RC_Demon,5; },{},{}
+5141,Marionette_Doll,Marionette Doll,5,,10,400,,0,,1,0xFFFFFFFE,7,2,256,,30,1,212,{ bonus bStr,1; },{},{}
+5142,Crescent_Helm,Crescent Helm,5,,10,3000,,8,,0,0x000444A2,7,2,768,,50,1,213,{ bonus bVit,1; bonus2 bSubRace,RC_DemiHuman,5; },{},{}
+5143,Kabuki_Mask,Kabuki Mask,5,,10,1000,,5,,1,0xFFFFFFFE,7,2,769,,10,1,214,{ bonus2 bResEff,Eff_Silence,3000; },{},{}
+5144,Gamble_Hat,Gambler Hat,5,,10,200,,2,,0,0xFFFFFFFF,7,2,256,,0,1,16,{ bonus bLuk,5; },{},{}
+5145,Carnival_Jester,Carnival Jester,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,0,1,89,{},{},{}
+5146,Elephant_Hat,Elephant Hat,5,,10,500,,0,,0,0xFFFFFFFF,7,2,256,,0,1,215,{ bonus bVit,1; bonus2 bSubRace,RC_Brute,7; skill 86,1; },{},{}
+5147,Baseball_Cap,Baseball Cap,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,0,1,216,{},{},{}
+5148,National_Holiday_Hat,National Holiday Hat,5,,10,500,,0,,0,0xFFFFFFFF,7,2,256,,,1,217,{ bonus bInt,2; },{},{}
+5149,Silver_Tiara,Silver Tiara,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,218,{ bonus bInt,2; },{},{}
+5150,Brazil_Event_Hat,Brazil Event Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,219,{ bonus bSpeedRate,35; },{},{}
+5151,Note_Headphone,Note Headphones,5,,,100,,4,,1,0xFFFFFFFF,7,2,256,,,1,220,{ bonus bMdef,3; bonus2 bResEff,Eff_Stun,1000; bonus2 bResEff,Eff_Freeze,1000; },{},{}
+5152,Phoenix_Crown,Phoenix Crown,5,,,2000,,1,,0,0xFFFFFFFF,7,2,768,,,1,221,{ bonus2 bResEff,Eff_Stun,1000; bonus bInt,1; bonus bMdef,2; },{},{}
+5153,Angeling_Pin,Angeling Pin,5,,,700,,1,,0,0xFFFFFFFF,7,2,256,,,1,222,{ bonus bFlee,5; if (isequipped(2358)==0) end; bonus bLuk,6; bonus bFlee,5; bonus bInt,2; },{},{}
+5154,Father's_Sunglasses,Father's Sunglasses,5,,,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,12,{},{},{}
+5155,Father's_White_Beard,Father's White Beard,5,,,100,,0,,0,0xFFFFFFFF,7,2,1,,0,,25,{ bonus bBaseAtk,20; },{},{}
+5156,Father's_Mask,Father's Mask,5,,,100,,1,,0,0xFFFFFFFF,7,2,1,,,,8,{ bonus bMatkRate,1; },{},{}
+5157,Orc_Helm_,Orc Helm,5,,10,500,,5,,1,0x000654E2,7,2,256,,0,1,86,{},{},{}
+5158,Monk_Hat_,Monk Hat,5,30000,,100,,5,,1,0x00008110,7,2,256,,0,1,35,{ bonus bMdef,3; },{},{}
+5159,Golden_Gear_,Golden Gear,5,,10,900,,5,,1,0xFFFFFFFE,7,2,256,,40,1,30,{ bonus bUnbreakableHelm,0; },{},{}
+5160,Majestic_Goat_,Majestic Goat,5,,10,800,,5,,1,0x006444A2,7,2,256,,0,1,41,{ bonus bStr,1; },{},{}
+5161,Spiky_Band_,Spiky Band,5,,10,1000,,6,,1,0x0066D5F2,7,2,256,,50,1,43,{},{},{}
+5162,Bone_Helm_,Bone Helm,5,,10,800,,7,,1,0x000444A2,7,2,256,,70,1,103,{ bonus2 bSubEle,Ele_Dark,-15; },{},{}
+5163,Corsair_,Corsair,5,,10,500,,5,,1,0xFFFFFFFE,7,2,256,,0,1,105,{ bonus bVit,1; },{},{}
+5164,Tiara_,Tiara,5,,10,400,,4,,1,0xFFFFFFFE,7,0,256,,45,1,19,{ bonus bInt,1; },{},{}
+5165,Crown_,Crown,5,,10,400,,4,,1,0xFFFFFFFE,7,1,256,,45,1,45,{ bonus bInt,1; },{},{}
+5166,Sphinx_Hat_,Sphinx Hat,5,,10,3000,,5,,1,0x00004082,7,2,257,,65,0,137,{ bonus bStr,2; },{},{}
+5167,Munak_Hat_,Munak Hat,5,,10,300,,5,,1,0xFFFFFFFF,7,2,769,,0,0,51,{ bonus2 bSubRace,RC_Undead,10; },{},{}
+5168,Bongun_Hat_,Bongun Hat,5,,10,300,,5,,1,0xFFFFFFFF,7,2,769,,0,0,139,{},{},{}
+5169,Bride_Mask,Bride Mask,5,,10,500,,4,,1,0xFFFFFFFF,7,2,768,,40,1,223,{ if(BaseClass==Job_Taekwon){ bonus bLuk,2; bonus bCritical,5; } },{},{}
+5170,Feather_Beret,Feather Beret,5,,10,600,,1,,0,0xFFFFFFFE,7,2,256,,0,1,224,{ bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; },{},{}
+5171,Valkyrie_Helm,Valkyrie Helm,5,,10,1000,,5,,1,0xFFFFFFFE,2,2,256,,0,1,225,{ bonus bMdef,5; },{},{}
+5172,Beret,Beret,5,,10,700,,0,,0,0xFFFFFFFF,7,2,256,,0,0,226,{ bonus2 bSubRace,RC_DemiHuman,10; },{},{}
+5173,Judge_Hat,Judge Hat,5,,10,400,,3,,1,0xFFFFFFFF,7,2,256,,60,1,227,{ if(BaseClass==Job_Taekwon){ bonus bAgi,1; bonus bHPrecovRate,3; } },{},{}
+5174,A-yam,A-yam,5,,10,400,,3,,1,0xFFFFFFFF,7,2,256,,60,1,228,{ if(BaseClass==Job_Taekwon){ bonus bInt,1; bonus bSPrecovRate,3; } },{},{}
+5175,Anonymity_Request,Anonymity Request,5,,10,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,229,{ bonus2 bResEff,Eff_Curse,500; bonus bMdef,1; bonus bHit,-5; },{},{}
+5176,Smiling_Mask,Smiling Mask,5,,10,100,,2,,0,0xFFFFFFFF,7,2,513,,30,0,230,{ if(BaseClass==Job_Taekwon){ bonus bLuk,1; bonus bFlee2,2; } },{},{}
+5177,Lion_Masquerade,Lion Masquerade,5,,10,500,,5,,1,0xFFFFFFFF,7,2,768,,40,1,231,{ if(BaseClass==Job_Taekwon){ bonus bDex,2; bonus bBaseAtk,2*getrefine(); bonus2 bAddEff,Eff_Stun,100; } },{},{}
+5178,Candle,Candle,5,,10,150,,0,,0,0xFFFFFFFF,7,2,256,,0,1,113,{ bonus bAllStats,1; },{},{}
+5179,Golden_Tiara,Golden Tiara,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,232,{ bonus bInt,2; },{},{}
+5180,France_Holiday_Hat,France Holiday Hat,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,217,{ bonus bVit,1; },{},{}
+5181,Helm_of_Darkness,Helm of Darkness,5,,10,500,,3,,1,0x000654E2,7,2,768,,50,1,233,{ bonus bStr,2; },{},{}
+5182,Puppy_Hat,Puppy Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,30,0,234,{ bonus bAgi,1; bonus4 bAutoSpell,75,1,10+20*(readparam(bAgi)>=77),0; },{},{}
+5183,Nest_Hat,Nest Hat,5,,10,500,,3,,0,0xFFFFFFFF,7,2,256,,10,1,235,{ bonus bDex,1; bonus bAgi,1; bonus2 bResEff,Eff_Stun,1000; },{},{}
+5184,Captain's_Hat,Captain's Hat,5,,10,500,,4,,0,0xFFFFFFFE,7,2,256,,30,1,236,{ bonus2 bSubEle,Ele_Water,5; },{},{}
+5185,Laurel_Crown,Laurel Crown,5,,10,100,,1,,1,0xFFFFFFFF,7,2,256,,10,1,237,{ bonus bLuk,3; bonus2 bResEff,Eff_Blind,500; bonus2 bResEff,Eff_Curse,500; },{},{}
+5186,Geographer_Decoration,Geographer Decoration,5,,10,500,,1,,0,0xFFFFFFFF,7,2,256,,30,0,238,{ bonus bInt,1; bonus4 bAutoSpellWhenHit,28,1,10,0; },{},{}
+5187,Twin_Ribbon,Twin Ribbon,5,,10,200,,3,,1,0xFFFFFFFF,7,2,256,,30,1,239,{ bonus bMaxSP,30; bonus bMdef,3; },{},{}
+5188,Wandering_Minstrel_Hat,Wandering Minstrel Hat,5,,10,500,,2,,0,0xFFFFFFFF,7,2,256,,50,1,240,{ bonus bInt,1; bonus bDex,1; },{},{}
+5189,Autumn_Leaves,Autumn Leaves,5,,10,100,,0,,0,0xFFFFFFFF,7,2,256,,,1,241,{ bonus bMaxHP,40; bonus bMaxSP,40; },{},{}
+5190,Independence_Memorial_Hat,Independence Memorial Hat,5,,10,0,,3,,0,0xFFFFFFFF,7,2,256,,,1,216,{},{},{}
+5191,Black_Ribbon,Black Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,242,{ bonus bMdef,3; },{},{}
+5192,Yellow_Ribbon,Yellow Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,243,{ bonus bMdef,3; },{},{}
+5193,Green_Ribbon,Green Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,244,{ bonus bMdef,3; },{},{}
+5194,Pink_Ribbon,Pink Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,245,{ bonus bMdef,3; },{},{}
+5195,Red_Ribbon,Red Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,246,{ bonus bMdef,3; },{},{}
+5196,Orange_Ribbon,Orange Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,247,{ bonus bMdef,3; },{},{}
+5197,White_Ribbon,White Ribbon,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,248,{ bonus bMdef,3; },{},{}
+5198,Drooping_Bunny,Drooping Bunny,5,,10,100,,1,,0,0xFFFFFFFF,7,2,256,,,1,249,{ bonus bDex,1; bonus bFlee,2; },{},{}
+5199,Baseball_Cap_,Baseball Cap,5,,10,200,,3,,0,0xFFFFFFFF,7,2,256,,,1,216,{},{},{}
+5200,Coppola,Coppola,5,,10,300,,0,,0,0xFFFFFFFF,7,2,256,,,1,252,{},{},{}
+// More Etc Items
+//===================================================================
+7001,Mould_Powder,Mould Powder,3,,340,10,,,,,,,,,,,,,{},{},{}
+7002,Ogre_Tooth,Ogre Tooth,3,,329,10,,,,,,,,,,,,,{},{},{}
+7003,Anolian_Skin,Anolian Skin,3,,464,10,,,,,,,,,,,,,{},{},{}
+7004,Mud_Lump,Mud Lump,3,,438,10,,,,,,,,,,,,,{},{},{}
+7005,Skull,Skull,3,,522,10,,,,,,,,,,,,,{},{},{}
+7006,Wing_Of_Red_Bat,Wing of Red Bat,3,,84,10,,,,,,,,,,,,,{},{},{}
+7007,Claw_Of_Rat,Claw of Rat,3,,374,10,,,,,,,,,,,,,{},{},{}
+7008,Stiff_Horn,Stiff Horn,3,,318,10,,,,,,,,,,,,,{},{},{}
+7009,Glitter_Shell,Glitter Shell,3,,264,10,,,,,,,,,,,,,{},{},{}
+7010,Tail_Of_Steel_Scorpion,Tail of Steel Scorpion,3,,274,10,,,,,,,,,,,,,{},{},{}
+7011,Claw_Of_Monkey,Claw of Monkey,3,,233,10,,,,,,,,,,,,,{},{},{}
+7012,Tough_Scalelike_Stem,Tough Scalelike Stem,3,,206,10,,,,,,,,,,,,,{},{},{}
+7013,Coral_Reef,Coral Reef,3,,386,10,,,,,,,,,,,,,{},{},{}
+7014,Old_Portrait,Old Portrait,3,,750,100,,,,,,,,,,,,,{},{},{}
+7015,Bookclip_In_Memory,Memory Bookmark,3,,1500,20,,,,,,,,,,,,,{},{},{}
+7016,Spoon_Stub,Bent Spoon,3,,1250,20,,,,,,,,,,,,,{},{},{}
+7017,Executioner's_Mitten,Executioner's Mitten,3,,2250,30,,,,,,,,,,,,,{},{},{}
+7018,Young_Twig,Young Twig,3,,25,10,,,,,,,,,,,,,{},{},{}
+7019,Loki's_Whispers,Loki's Whispers,3,,10,10,,,,,,,,,,,,,{},{},{}
+7020,Mother's_Nightmare,Mother's Nightmare,3,,10,10,,,,,,,,,,,,,{},{},{}
+7021,Foolishness_Of_Blind,Foolishness of the Blind,3,,10,10,,,,,,,,,,,,,{},{},{}
+7022,Old_Hilt,Old Hilt,3,,75,30,,,,,,,,,,,,,{},{},{}
+7023,Blade_Lost_In_Darkness,Blade of Darkness,3,,6000,40,,,,,,,,,,,,,{},{},{}
+7024,Bloody_Edge,Bloody Edge,3,,5000,40,,,,,,,,,,,,,{},{},{}
+7025,Lucifer's_Lament,Lucifer's Lament,3,,15000,50,,,,,,,,,,,,,{},{},{}
+7026,Key_Of_Clock_Tower,Key of the Clock Tower,3,,50,30,,,,,,,,,,,,,{},{},{}
+7027,Underground_Key,Key of the Underground,3,,50,30,,,,,,,,,,,,,{},{},{}
+7028,Invite_For_Duel,Invite for Duel,3,,0,10,,,,,,,,,,,,,{},{},{}
+7029,Admission_For_Duel,Admission for Duel,3,,10,10,,,,,,,,,,,,,{},{},{}
+7030,Claw_Of_Desert_Wolf,Claw of Desert Wolf,3,,104,10,,,,,,,,,,,,,{},{},{}
+7031,Old_Frying_Pan,Old Frying Pan,3,,98,10,,,,,,,,,,,,,{},{},{}
+7032,Piece_Of_Egg_Shell,Piece of Egg Shell,3,,84,10,,,,,,,,,,,,,{},{},{}
+7033,Poison_Spore,Poison Spore,3,,57,10,,,,,,,,,,,,,{},{},{}
+7034,Red_Socks_With_Holes,Red Stocking,3,,50,10,,,,,,,,,,,,,{},{},{}
+7035,Matchstick,Matchstick,3,,50,10,,,,,,,,,,,,,{},{},{}
+7036,Fang_Of_Garm,Fang of Garm,3,,50,10,,,,,,,,,,,,,{},{},{}
+7037,Trade_Coupon,Coupon,3,,1000,10,,,,,,,,,,,,,{},{},{}
+7038,Yarn,Yarn,3,,50,10,,,,,,,,,,,,,{},{},{}
+7039,Novice_Nametag,Newbie Tag,3,,10,10,,,,,,,,,,,,,{},{},{}
+7040,Megaphone,Megaphone,3,,10,10,,,,,,,,,,,,,{},{},{}
+7041,Fine_Grit,Fine Grit,3,,60,10,,,,,,,,,,,,,{},{},{}
+7042,Leather_Bag_Of_Infinity,Leather Bag of Infinity,3,,10,10,,,,,,,,,,,,,{},{},{}
+7043,Fine_Sand,Fine Sand,3,,50,10,,,,,,,,,,,,,{},{},{}
+7044,Vigorgra,Vigorgra,3,,10,10,,,,,,,,,,,,,{},{},{}
+7045,Magic_Paint,Magic Paint,3,,10,10,,,,,,,,,,,,,{},{},{}
+7046,Cart_Parts,Cart Parts,3,,10,10,,,,,,,,,,,,,{},{},{}
+7047,Alice's_Apron,Alice's Apron,3,,1212,10,,,,,,,,,,,,,{},{},{}
+7048,Talon_Of_Griffin,Talon of Griffon,3,,50,10,,,,,,,,,,,,,{},{},{}
+7049,Stone,Stone,3,,0,30,,,,,,,,,,,,,{},{},{}
+7050,Cotton_Mat,Cotton Mat,3,,10,10,,,,,,,,,,,,,{},{},{}
+7051,Silk_Mat,Silk Mat,3,,10,10,,,,,,,,,,,,,{},{},{}
+7052,Old_Magazine,Old Papers,3,,10,10,,,,,,,,,,,,,{},{},{}
+7053,Cyfar,Cyfar,3,,386,10,,,,,,,,,,,,,{},{},{}
+7054,Brigan,Brigan,3,,373,10,,,,,,,,,,,,,{},{},{}
+7055,Animal_Pooopoo,Animal Poop,3,,10,50,,,,,,,,,,,,,{},{},{}
+7056,Payroll_Of_Kafra,Payment Statement for Kafra Employee,3,,10,50,,,,,,,,,,,,,{},{},{}
+7057,Gallar_Horn,Gjallar,3,,10,500,,,,,,,,,,,,,{},{},{}
+7058,Gullraifnir,Gleipnir,3,,10,500,,,,,,,,,,,,,{},{},{}
+7059,Cargo_Free_Ticket,Free Ticket for Kafra Storage,3,,10,10,,,,,,,,,,,,,{},{},{}
+7060,Warp_Free_Ticket,Free Ticket for Kafra Transportation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7061,Cart_Free_Ticket,Free Ticket for the Cart Service,3,,10,10,,,,,,,,,,,,,{},{},{}
+7062,Broken_Turtle_Shell,Broken Turtle Shell,3,,10,10,,,,,,,,,,,,,{},{},{}
+7063,Soft_Feather,Soft Feather,3,,140,10,,,,,,,,,,,,,{},{},{}
+7064,Dragon_Fly_Wing,Wing of Dragonfly,3,,260,10,,,,,,,,,,,,,{},{},{}
+7065,Sea_Otter_Leather,Sea-Otter Fur,3,,410,10,,,,,,,,,,,,,{},{},{}
+7066,Ice_Piece,Ice Cubic,3,,330,10,,,,,,,,,,,,,{},{},{}
+7067,Stone_Piece,Stone Fragment,3,,320,10,,,,,,,,,,,,,{},{},{}
+7068,Burn_Tree,Burnt Tree,3,,361,10,,,,,,,,,,,,,{},{},{}
+7069,Broken_Armor_Piece,Destroyed Armor,3,,521,10,,,,,,,,,,,,,{},{},{}
+7070,Broken_Shell,Broken Shell,3,,450,10,,,,,,,,,,,,,{},{},{}
+7071,Tatters_Clothes,Tattered Clothes,3,,320,10,,,,,,,,,,,,,{},{},{}
+7072,Rust_Suriken,Old Shuriken,3,,890,10,,,,,,,,,,,,,{},{},{}
+7073,Jewel_Of_Prayer,Freya's Jewel,3,,10,500,,,,,,,,,,,,,{},{},{}
+7074,Iron_Glove,Thor's Gauntlet,3,,10,500,,,,,,,,,,,,,{},{},{}
+7075,Iron_Maiden,Iron Maiden,3,,10,500,,,,,,,,,,,,,{},{},{}
+7076,Mystery_Wheel,Wheel of the Unknown,3,,10,500,,,,,,,,,,,,,{},{},{}
+7077,Silver_Fancy,Silver Ornament,3,,10,500,,,,,,,,,,,,,{},{},{}
+7078,Anger_Of_Valkurye,Wrath of Valkyrie,3,,10,500,,,,,,,,,,,,,{},{},{}
+7079,Feather_Of_Angel,Feather of Angel Wing,3,,10,500,,,,,,,,,,,,,{},{},{}
+7080,Foot_Step_Of_Cat,Footprints of Cat,3,,10,500,,,,,,,,,,,,,{},{},{}
+7081,Beard_Of_Women,Woman's Moustaches,3,,10,500,,,,,,,,,,,,,{},{},{}
+7082,Root_Of_Stone,Root of Stone,3,,10,500,,,,,,,,,,,,,{},{},{}
+7083,Soul_Of_Fish,Spirit of Fish,3,,10,500,,,,,,,,,,,,,{},{},{}
+7084,Saliva_Of_Bird,Sputum of Bird,3,,10,500,,,,,,,,,,,,,{},{},{}
+7085,Tendon_Of_Bear,Sinew of Bear,3,,10,500,,,,,,,,,,,,,{},{},{}
+7086,Symbol_Of_Sun,Emblem of the Sun God,3,,10,500,,,,,,,,,,,,,{},{},{}
+7087,Breath_Of_Soul,Breath of Soul,3,,10,500,,,,,,,,,,,,,{},{},{}
+7088,Crystal_Of_Snow,Snow Crystal,3,,10,500,,,,,,,,,,,,,{},{},{}
+7089,Indication_Of_Tempest,Omen of Tempest,3,,10,500,,,,,,,,,,,,,{},{},{}
+7090,Slilince_Wave,Ripple,3,,10,500,,,,,,,,,,,,,{},{},{}
+7091,Rough_Billows,Billow,3,,10,500,,,,,,,,,,,,,{},{},{}
+7092,Air_Stream,Drifting Air,3,,10,500,,,,,,,,,,,,,{},{},{}
+7093,Wheel,Cogwheel,3,,756,10,,,,,,,,,,,,,{},{},{}
+7094,Mystery_Piece,Fragment,3,,672,10,,,,,,,,,,,,,{},{},{}
+7095,Broken_Steel_Piece,Metal Fragment,3,,294,10,,,,,,,,,,,,,{},{},{}
+7096,Cold_Magma,Lava,3,,554,10,,,,,,,,,,,,,{},{},{}
+7097,Burning_Heart,Burning Heart,3,,462,10,,,,,,,,,,,,,{},{},{}
+7098,Live_Coal,Live Coal,3,,319,10,,,,,,,,,,,,,{},{},{}
+7099,Old_Magic_Circle,Worn-out Magic Scroll,3,,387,10,,,,,,,,,,,,,{},{},{}
+7100,Sharp_Leaf,Sharp Leaf,3,,403,10,,,,,,,,,,,,,{},{},{}
+7101,Peco_Wing_Feather,Peco Peco Feather,3,,227,10,,,,,,,,,,,,,{},{},{}
+7102,Hideous_Dream,Nightmare,3,,10,10,,,,,,,,,,,,,{},{},{}
+7103,Unknown_Liquid_Bottle,Unknown Liquid Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7104,Fake_Angel_Wing,False Angel Wing,3,,378,10,,,,,,,,,,,,,{},{},{}
+7105,Fake_Angel_Loop,False Heaven Ring,3,,462,10,,,,,,,,,,,,,{},{},{}
+7106,Goat's_Horn,Antelope Horn,3,,336,10,,,,,,,,,,,,,{},{},{}
+7107,Gaoat's_Skin,Antelope Skin,3,,378,10,,,,,,,,,,,,,{},{},{}
+7108,Boroken_Shiled_Piece,Piece of Shield,3,,840,10,,,,,,,,,,,,,{},{},{}
+7109,Shine_Spear_Blade,Shining Spear Blade,3,,10,10,,,,,,,,,,,,,{},{},{}
+7110,Vroken_Sword,Broken Sword,3,,294,10,,,,,,,,,,,,,{},{},{}
+7111,Smooth_Paper,Slick Paper,3,,353,10,,,,,,,,,,,,,{},{},{}
+7112,Fright_Paper_Blade,Sharp Paper,3,,453,10,,,,,,,,,,,,,{},{},{}
+7113,Broken_Pharaoh_Symbol,Broken Pharaoh Emblem,3,,10,10,,,,,,,,,,,,,{},{},{}
+7114,Tutankhamen's_Mask,Masque of Tutankhamen,3,,10,10,,,,,,,,,,,,,{},{},{}
+7115,Harpy's_Feather,Harpy Feather,3,,571,10,,,,,,,,,,,,,{},{},{}
+7116,Harpy's_Claw,Harpy Talon,3,,605,10,,,,,,,,,,,,,{},{},{}
+7117,Rent_Spell_Book,Torn Magic Book,3,,571,10,,,,,,,,,,,,,{},{},{}
+7118,Rent_Scroll,Torn Scroll,3,,681,10,,,,,,,,,,,,,{},{},{}
+7119,Spawns,Bacillus,3,1025,,10,,,,,,,,,,,,,{},{},{}
+7120,Burning_Horse_Shoe,Burning Horseshoe,3,,411,10,,,,,,,,,,,,,{},{},{}
+7121,Honey_Jar,Honey Pot,3,,311,10,,,,,,,,,,,,,{},{},{}
+7122,Hot_Hair,Burning Hair,3,,487,10,,,,,,,,,,,,,{},{},{}
+7123,Dragon's_Skin,Dragon Skin,3,,512,10,,,,,,,,,,,,,{},{},{}
+7124,Sand_Lump,Sand Clump,3,,353,10,,,,,,,,,,,,,{},{},{}
+7125,Scropion's_Nipper,Scorpion Claw,3,,353,10,,,,,,,,,,,,,{},{},{}
+7126,Large_Jellopy,Large Jellopy,3,,420,10,,,,,,,,,,,,,{},{},{}
+7127,Alcol_Create_Book,Alcohol Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7128,FireBottle_Create_Book,Bottle Grenade Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7129,Acid_Create_Book,Acid Bottle Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7130,Plant_Create_Book,Plant Bottle Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7131,Mine_Create_Book,Marine Sphere Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7132,Coating_Create_Book,Glistening Coat Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7133,Slim_Potion_Create_Book,Condensed Potion Creation Guide,3,,120000,10,,,,,,,,,,,,,{},{},{}
+7134,Medicine_Bowl,Medicine Bowl,3,,4,10,,,,,,,,,,,,,{},{},{}
+7135,Fire_Bottle,Fire Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7136,Acid_Bottle,Acid Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7137,MenEater_Plant_Bottle,Plant Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7138,Mini_Bottle,Marine Sphere Bottle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7139,Coating_Bottle,Glistening Coat,3,,10,10,,,,,,,,,,,,,{},{},{}
+7140,Seed_Of_Life,Seed of Life,3,,30000,10,,,,,,,,,,,,,{},{},{}
+7141,Yggdrasilberry_Dew,Morning Dew of Yggdrasil,3,,10000,10,,,,,,,,,,,,,{},{},{}
+7142,Germination_Breed,Embryo,3,,30000,10,,,,,,,,,,,,,{},{},{}
+7143,Life_Force_Pot,Seperation Tubes,2,,2500,10,,,,,0x00040000,7,2,,,,,,{ bpet; },{},{}
+7144,Normal_Potion_Book,Potion Creation Guide,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7145,Rag_T_Shirts,Ragnarok T-Shirt,3,,10,10,,,,,,,,,,,,,{},{},{}
+7146,Vacance_Ticket,Vacation Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7147,Jasmin,Jasmine,3,,10,10,,,,,,,,,,,,,{},{},{}
+7148,Mother_Letter,Mother's Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
+7149,Yellow_Plate,Yellow Plate,3,,110,10,,,,,,,,,,,,,{},{},{}
+7150,Bamboo_Cut,Piece of Bamboo,3,,155,10,,,,,,,,,,,,,{},{},{}
+7151,Oil_Paper,Oil Paper,3,,155,10,,,,,,,,,,,,,{},{},{}
+7152,Glossy_Hair,Glossy Hair,3,,170,10,,,,,,,,,,,,,{},{},{}
+7153,Old_Japaness_Clothes,Worn-out Kimono,3,,295,10,,,,,,,,,,,,,{},{},{}
+7154,Poison_Powder,Poisonous Powder,3,,80,10,,,,,,,,,,,,,{},{},{}
+7155,Poison_Toad's_Skin,Poisonous Toad Skin,3,,140,10,,,,,,,,,,,,,{},{},{}
+7156,Broken_Shuriken,Broken Shuriken,3,,235,10,,,,,,,,,,,,,{},{},{}
+7157,Black_Mask,Dark Mask,3,,157,10,,,,,,,,,,,,,{},{},{}
+7158,Broken_Wine_Vessel,Broken Liquor Jar,3,,80,10,,,,,,,,,,,,,{},{},{}
+7159,Tengu's_Nose,Tengu Nose,3,,200,10,,,,,,,,,,,,,{},{},{}
+7160,Lord's_Passable_Ticket,Feudal Lord Permit,3,,10,10,,,,,,,,,,,,,{},{},{}
+7161,Black_Bear's_Skin,Black Bear Skin,3,,192,10,,,,,,,,,,,,,{},{},{}
+7162,Cloud_Piece,Cloud Crumb,3,,195,10,,,,,,,,,,,,,{},{},{}
+7163,Sharp_Feeler,Hard Feeler,3,,285,10,,,,,,,,,,,,,{},{},{}
+7164,Hard_Peach,Solid_Peach,3,,200,10,,,,,,,,,,,,,{},{},{}
+7165,Limpid_Celestial_Robe,Transparent Celestial Robe,3,,325,10,,,,,,,,,,,,,{},{},{}
+7166,Soft_Silk_Cloth,Soft Silk,3,,600,10,,,,,,,,,,,,,{},{},{}
+7167,Mystery_Iron_Bit,Strange Steel Piece,3,,215,10,,,,,,,,,,,,,{},{},{}
+7168,Great_Wing,Giant Butterfly Wing,3,,307,10,,,,,,,,,,,,,{},{},{}
+7169,Taegeuk_Plate,Ba_Gua,3,,1400,10,,,,,,,,,,,,,{},{},{}
+7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,0xFFFFFFFE,7,1,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
+7171,Leopard_Skin,Leopard Skin,3,,141,10,,,,,,,,,,,,,{},{},{}
+7172,Leopard_Talon,Leopard Claw,3,,145,10,,,,,,,,,,,,,{},{},{}
+7173,BurnBuster_Bag,Bun Buster Bag,3,,10,10,,,,,,,,,,,,,{},{},{}
+7174,Packing_Ribbon,Wrapping Lace,3,,10,10,,,,,,,,,,,,,{},{},{}
+7175,Packing_Paper,Wrapping Paper,3,,10,10,,,,,,,,,,,,,{},{},{}
+7176,XMAS_Coupon,Royal Certificate,3,,10,10,,,,,,,,,,,,,{},{},{}
+7177,Part_Of_Star's_Sob,Crumb of Sobbing Starlight,3,,10,10,,,,,,,,,,,,,{},{},{}
+7178,Star's_Sob,Sobbing Starlight,3,,10,10,,,,,,,,,,,,,{},{},{}
+7179,Donation_Card,Proof of Donation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7180,Introduction_Of_Mr.Han,Hahn Sukbong's Recommendation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7181,Receipt_01,Receipt,3,,10,10,,,,,,,,,,,,,{},{},{}
+7182,Cacao,Cacao,3,,100,20,,,,,,,,,,,,,{},{},{}
+7183,Sister_Letter,Letter from Sister,3,,10,10,,,,,,,,,,,,,{},{},{}
+7184,Piano_Keyboard,Piano Key,3,,10,10,,,,,,,,,,,,,{},{},{}
+7185,Quiz_Ticket,Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7186,Thin_Stem,Thin Trunk,3,,109,10,,,,,,,,,,,,,{},{},{}
+7187,Festival_Mask,Festival Mask,3,,50,10,,,,,,,,,,,,,{},{},{}
+7188,Browny_Root,Brown_Root,3,,280,10,,,,,,,,,,,,,{},{},{}
+7189,Heart_Of_Tree,Wooden Heart,3,,340,10,,,,,,,,,,,,,{},{},{}
+7190,Solid_Peeling,Solid Husk,3,,70,10,,,,,,,,,,,,,{},{},{}
+7191,Lamplight,Lamp,3,,10,10,,,,,,,,,,,,,{},{},{}
+7192,Blade_Of_Pinwheel,Vane,3,,80,10,,,,,,,,,,,,,{},{},{}
+7193,Germinating_Sprout,Sprout,3,,115,10,,,,,,,,,,,,,{},{},{}
+7194,Soft_Leaf,Soft Blade of Grass,3,,200,10,,,,,,,,,,,,,{},{},{}
+7195,Air_Rifle,Slingshot,3,,105,10,,,,,,,,,,,,,{},{},{}
+7196,Shoulder_Protection,Shoulder Protector,3,,115,10,,,,,,,,,,,,,{},{},{}
+7197,Tough_Vines,Tough Vines,3,,250,10,,,,,,,,,,,,,{},{},{}
+7198,Great_Leaf,Huge Leaf,3,,305,10,,,,,,,,,,,,,{},{},{}
+7199,Coupon,Unknown_Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
+7200,Flexible_String,Elastic Band,3,,190,10,,,,,,,,,,,,,{},{},{}
+7201,Log,Log,3,,125,10,,,,,,,,,,,,,{},{},{}
+7202,Beetle_Nipper,Pincher of Beetle,3,,145,10,,,,,,,,,,,,,{},{},{}
+7203,Solid_Twig,Strong Branch,3,,95,10,,,,,,,,,,,,,{},{},{}
+7204,Gunpowder,Gunpowder,3,,10,10,,,,,,,,,,,,,{},{},{}
+7205,Piece_Of_Black_Cloth,Piece of Black Cloth,3,,263,10,,,,,,,,,,,,,{},{},{}
+7206,Black_Kitty_Doll,Black Cat Doll,3,,720,10,,,,,,,,,,,,,{},{},{}
+7207,Old_Manteau,Old Manteau,3,,640,10,,,,,,,,,,,,,{},{},{}
+7208,Rusty_Cleaver,Rusty Kitchen Knife,3,,890,10,,,,,,,,,,,,,{},{},{}
+7209,Dullahan's_Helm,Helm of Dullahan,3,,675,10,,,,,,,,,,,,,{},{},{}
+7210,Dullahan_Armor,Armor Piece of Dullahan,3,,395,10,,,,,,,,,,,,,{},{},{}
+7211,Rojerta_Piece,Fragment of Rossata Stone,3,,1300,10,,,,,,,,,,,,,{},{},{}
+7212,Hanging_Doll,Hung Doll,3,,510,10,,,,,,,,,,,,,{},{},{}
+7213,Needle_Pouch,Needle Packet,3,,416,10,,,,,,,,,,,,,{},{},{}
+7214,Bat_Cage,Bat Cage,3,,440,10,,,,,,,,,,,,,{},{},{}
+7215,Broken_Needle,Broken Needle,3,,345,10,,,,,,,,,,,,,{},{},{}
+7216,Red_Scarf,Red Muffler,3,,330,10,,,,,,,,,,,,,{},{},{}
+7217,Spool,Spool,3,,212,10,,,,,,,,,,,,,{},{},{}
+7218,Rotten_Rope,Decomposed Rope,3,,195,10,,,,,,,,,,,,,{},{},{}
+7219,Striped_Socks,Striped Sock,3,,460,10,,,,,,,,,,,,,{},{},{}
+7220,Ectoplasm,Ectoplasm,3,,166,10,,,,,,,,,,,,,{},{},{}
+7221,Tangled_Chain,Tangled Chains,3,,370,10,,,,,,,,,,,,,{},{},{}
+7222,Tree_Knot,Wooden Gnarl,3,,234,10,,,,,,,,,,,,,{},{},{}
+7223,Distorted_Portrait,Contorted Self-Portrait,3,,1016,10,,,,,,,,,,,,,{},{},{}
+7224,Stone_Of_Intelligence,Stone of Sage,3,,50000,10,,,,,,,,,,,,,{},{},{}
+7225,Pumpkin_Bucket,Pumpkin Lantern,3,,243,10,,,,,,,,,,,,,{},{},{}
+7226,Pill,Pellet,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Hallucination,10000,0; },{},{}
+7227,TCG_Card,TCG Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7228,Gold_Bullion,Gold Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
+7229,Silver_Bullion,Silver Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
+7230,White_Gold_Bullion,Platinum Bullion,3,,10,300,,,,,,,,,,,,,{},{},{}
+7231,Gold_Ore,Gold Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
+7232,Silver_Ore,Silver Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
+7233,Mithril_Ore,Mithril Ore,3,,10,150,,,,,,,,,,,,,{},{},{}
+7234,Soul_Of_Guild,Spirit of Guild,3,,10,10,,,,,,,,,,,,,{},{},{}
+7235,Soul_Of_Courage,Spirit of Charge,3,,10,10,,,,,,,,,,,,,{},{},{}
+7236,Soul_Of_Guard,Spirit of Protection,3,,10,10,,,,,,,,,,,,,{},{},{}
+7237,Soul_Of_Partnership,Spirit of Association,3,,10,10,,,,,,,,,,,,,{},{},{}
+7238,Soul_Of_Correspondence,Spirit of Coordination,3,,10,10,,,,,,,,,,,,,{},{},{}
+7239,Soul_Of_Proceeding,Spirit of Advance,3,,10,10,,,,,,,,,,,,,{},{},{}
+7240,Soul_Of_Confidence,Spirit of Trust,3,,10,10,,,,,,,,,,,,,{},{},{}
+7241,Soul_Of_Agreement,Spirit of Union,3,,10,10,,,,,,,,,,,,,{},{},{}
+7242,Soul_Of_Harmony,Spirit of Combination,3,,10,10,,,,,,,,,,,,,{},{},{}
+7243,Soul_Of_Cooperate,Spirit of Cooperation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7244,Soul_Of_Unity,Spirit of Solidarity,3,,10,10,,,,,,,,,,,,,{},{},{}
+7245,Soul_Of_Friendship,Spirit of Friendship,3,,10,10,,,,,,,,,,,,,{},{},{}
+7246,Soul_Of_Peace,Spirit of Peace,3,,10,10,,,,,,,,,,,,,{},{},{}
+7247,Soul_Of_Spirit,Spirit of Determination,3,,10,10,,,,,,,,,,,,,{},{},{}
+7248,Soul_Of_Honor,Spirit of Honor,3,,10,10,,,,,,,,,,,,,{},{},{}
+7249,Soul_Of_Service,Spirit of Service,3,,10,10,,,,,,,,,,,,,{},{},{}
+7250,Soul_Of_Glory,Spirit of Glory,3,,10,10,,,,,,,,,,,,,{},{},{}
+7251,Soul_Of_Victory,Spirit of Victory,3,,10,10,,,,,,,,,,,,,{},{},{}
+7252,Herb_Medicine,Herbal Medicine,3,,10,10,,,,,,,,,,,,,{},{},{}
+7253,Taeguk_Flag,Golden Korean Flag,3,,10,10,,,,,,,,,,,,,{},{},{}
+7254,Digital_Print_Ticket,Digital Picture Printing Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
+7255,China_Marble01,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7256,China_Marble02,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7257,China_Marble03,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7258,China_Marble04,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7259,China_Marble05,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7260,China_Marble06,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7261,China_Marble07,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7262,Fan,Folding Fan of Cat Ghost,3,,233,10,,,,,,,,,,,,,{},{},{}
+7263,Cat_Eyed_Stone,Cat's Eye,3,,477,10,,,,,,,,,,,,,{},{},{}
+7264,Dried_Sand,Dry Sand,3,,161,10,,,,,,,,,,,,,{},{},{}
+7265,Dragon_Horn,Dragon Horn,3,,272,10,,,,,,,,,,,,,{},{},{}
+7266,Dragon_Fang,Denture from Dragon Mask,3,,218,10,,,,,,,,,,,,,{},{},{}
+7267,Tiger_Skin_Panties,Tiger Panty,3,,149,10,,,,,,,,,,,,,{},{},{}
+7268,Little_Blacky_Ghost,Little Ghost Doll,3,,605,10,,,,,,,,,,,,,{},{},{}
+7269,Bib,Pinafore,3,,480,10,,,,,,,,,,,,,{},{},{}
+7270,Milk_Bottle,Nursing_Bottle,3,,550,10,,,,,,,,,,,,,{},{},{}
+7271,Figure,Novice Figure,3,,10,10,,,,,,,,,,,,,{},{},{}
+7272,Meat_Dumpling_Doll,Rice Ball Doll,3,,10,10,,,,,,,,,,,,,{},{},{}
+7273,Golden_Necklace,RWC Necklace,3,,10,10,,,,,,,,,,,,,{},{},{}
+7274,Ancient_Translator,Translated Ancient Language,3,,10,10,,,,,,,,,,,,,{},{},{}
+7275,Ancient_Document,Record of Ancient Language,3,,10,10,,,,,,,,,,,,,{},{},{}
+7276,Picture_Letter,Doodled Message,3,,10,10,,,,,,,,,,,,,{},{},{}
+7277,Munak_Doll,Munak Doll,3,,4450,10,,,,,,,,,,,,,{},{},{}
+7278,Wellbeing_Letter,Letter to Wife,3,,10,10,,,,,,,,,,,,,{},{},{}
+7279,Vita500_Lid,Vita500 Lid,3,,10,10,,,,,,,,,,,,,{},{},{}
+7280,Quiz_Ticket01,1st Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7281,Quiz_Ticket02,2nd Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7282,Quiz_Ticket03,3rd Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7283,Quiz_Ticket04,4th Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7284,Quiz_Ticket05,5th Quiz Entry,3,,10,10,,,,,,,,,,,,,{},{},{}
+7285,Thread_Skein,Holy Threads,3,,1,10,,,,,,,,,,,,,{},{},{}
+7286,Chilli,Red Chile,3,,10,10,,,,,,,,,,,,,{},{},{}
+7287,Thread_Skein_,Holier Threads,3,,1,10,,,,,,,,,,,,,{},{},{}
+7288,Thai_Ring,Engagement Ring,3,,10,10,,,,,,,,,,,,,{},{},{}
+7289,Olivine,Peridot,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7290,Phlogopite,Phlogopite,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7291,Agate,Agate,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7292,Muscovite,Muscovite,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7293,Rose_Quartz,Rose Quartz,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7294,Turquoise,Turquoise,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7295,Citrine,Citrin,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7296,Pyroxene,Pyroxene,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7297,Biotite,Biotite,3,,1500,100,,,,,,,,,,,,,{},{},{}
+7298,Leaf_Clothes,Fig Leaf,3,,269,10,,,,,,,,,,,,,{},{},{}
+7299,Bamboo_Basket,Straw Basket,3,,316,10,,,,,,,,,,,,,{},{},{}
+7300,Gemstone,Gemstone,3,,710,10,,,,,,,,,,,,,{},{},{}
+7301,Sword_Accessory,Tassel,3,,399,10,,,,,,,,,,,,,{},{},{}
+7302,KRATHONG,Krathong,3,,10,10,,,,,,,,,,,,,{},{},{}
+7303,Bag_Of_Rice,Straw Rice Bag,3,,0,800,,,,,,,,,,,,,{},{},{}
+7304,Witch's_Spell_Book,Witch's Spell Scroll,3,,0,0,,,,,,,,,,,,,{},{},{}
+7305,Authority_Of_Nine_World,Symbol of the Nine Realms,3,,0,10,,,,,,,,,,,,,{},{},{}
+7306,Fragment_Of_Soul,Piece of Spirit,3,,0,10,,,,,,,,,,,,,{},{},{}
+7307,Whisper_Of_Soul,Spiritual Whispers,3,,0,10,,,,,,,,,,,,,{},{},{}
+7308,Witch's_Potion,Witch's Tonic,3,,0,10,,,,,,,,,,,,,{},{},{}
+7309,Wing_Of_Crow,Crow Wing,3,,0,10,,,,,,,,,,,,,{},{},{}
+7310,Free_Peco_Ticket,Free Ticket for Peco Ride,3,,10,10,,,,,,,,,,,,,{},{},{}
+7311,Free_Flying_Ship_Ticket,Free Ticket for Flyship,3,,10,10,,,,,,,,,,,,,{},{},{}
+7312,Jubilee,Jubilee,3,,16,10,,,,,,,,,,,,,{},{},{}
+7313,Seal_Of_Witch,Witch's Medal,3,,10,10,,,,,,,,,,,,,{},{},{}
+7314,The_Sign,The Sign,3,,0,10,,,,,,,,,,,,,{},{},{}
+7315,Dark_Crystal_Fragment,Dark Crystal Fragment,3,,211,10,,,,,,,,,,,,,{},{},{}
+7316,Long_Limb,Insect Leg,3,,329,10,,,,,,,,,,,,,{},{},{}
+7317,Screw,Rusty Screw,3,,267,10,,,,,,,,,,,,,{},{},{}
+7318,Old_Pick,Old Pick,3,,256,10,,,,,,,,,,,,,{},{},{}
+7319,Old_Steel_Plate,Used Iron Plate,3,,512,10,,,,,,,,,,,,,{},{},{}
+7320,Air_Pollutant,Dust Pollutant,3,,128,10,,,,,,,,,,,,,{},{},{}
+7321,Fragment_Of_Crystal,Crystal Fragment,3,,276,10,,,,,,,,,,,,,{},{},{}
+7322,Poisonous_Gas,Toxic Gas,3,,333,10,,,,,,,,,,,,,{},{},{}
+7323,Battered_Kettle,Battered Kettle,3,,128,10,,,,,,,,,,,,,{},{},{}
+7325,Tube,Flexible Tube,3,,51,10,,,,,,,,,,,,,{},{},{}
+7326,Fluorescent_Liquid,Fluorescent Liquid,3,,356,10,,,,,,,,,,,,,{},{},{}
+7327,Headlamp,Flashlight,3,,512,10,,,,,,,,,,,,,{},{},{}
+7328,Legendary_Scroll,Legend of Songkran,3,,10,10,,,,,,,,,,,,,{},{},{}
+7329,Old_Copper_Key,Old Bronze Key,3,,10,10,,,,,,,,,,,,,{},{},{}
+7330,Holy_Marble,Mystic Orb,3,,10,100,,,,,,,,,,,,,{},{},{}
+7331,Flower_Of_Heaven,Heaven Flower,3,,10,10,,,,,,,,,,,,,{},{},{}
+7332,Slate,Complete Tablet,3,,0,0,,,,,,,,,,,,,{},{},{}
+7333,Piece_Of_Slate_1,Prontera Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
+7334,Piece_Of_Slate_2,Payon Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
+7335,Piece_Of_Slate_3,Morocc Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
+7336,Piece_Of_Slate_4,Geffen Tablet,3,,10,10,,,,,,,,,,,,,{},{},{}
+7337,Eye_Of_Hellion,Eye of Hellion,3,,0,0,,,,,,,,,,,,,{},{},{}
+7338,RO_Transportation_Card,One-way Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7339,RO_Transportation_Card_,Commemorative Travel Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7340,Will_Of_Darkness,Will of the Darkness,3,,367,50,,,,,,,,,,,,,{},{},{}
+7341,Worn_Out_Pendant,Old Pendant,3,,10,0,,,,,,,,,,,,,{},{},{}
+7342,File01,File Folder,3,,10,0,,,,,,,,,,,,,{},{},{}
+7343,File02,Sealed File Folder,3,,10,0,,,,,,,,,,,,,{},{},{}
+7344,File03,Shinokas Case File,3,,10,0,,,,,,,,,,,,,{},{},{}
+7345,Armlet_Of_Prisoner,Handcuffs,3,,362,10,,,,,,,,,,,,,{},{},{}
+7346,Pile_Of_Ymir_Heart,Ymir's Heart Piece,3,,10,0,,,,,,,,,,,,,{},{},{}
+7347,Lab_Staff_Record,Research Chart,3,,420,10,,,,,,,,,,,,,{},{},{}
+7348,Indication_Of_Member01,Membership Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7349,Indication_Of_Member02,Archive Permit,3,,10,0,,,,,,,,,,,,,{},{},{}
+7350,Pass,Pass,3,,10,10,,,,,,,,,,,,,{},{},{}
+7351,Friend's_Diary,Friend's Diary,3,,10,0,,,,,,,,,,,,,{},{},{}
+7352,Transparent_Plate01,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
+7353,Transparent_Plate02,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
+7354,Transparent_Plate03,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
+7355,Transparent_Plate04,Transparent Plate,3,,10,10,,,,,,,,,,,,,{},{},{}
+7356,Piece_Of_Crest1,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
+7357,Piece_Of_Crest2,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
+7358,Piece_Of_Crest3,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
+7359,Piece_Of_Crest4,Crest Piece,3,,2500,10,,,,,,,,,,,,,{},{},{}
+7360,RO_Festival_Ticket,RO Festival Invitation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7361,Lotto01,Lotto Ball 01,3,,10,10,,,,,,,,,,,,,{},{},{}
+7362,Lotto02,Lotto Ball 02,3,,10,10,,,,,,,,,,,,,{},{},{}
+7363,Lotto03,Lotto Ball 03,3,,10,10,,,,,,,,,,,,,{},{},{}
+7364,Lotto04,Lotto Ball 04,3,,10,10,,,,,,,,,,,,,{},{},{}
+7365,Lotto05,Lotto Ball 05,3,,10,10,,,,,,,,,,,,,{},{},{}
+7366,Lotto06,Lotto Ball 06,3,,10,10,,,,,,,,,,,,,{},{},{}
+7367,Lotto07,Lotto Ball 07,3,,10,10,,,,,,,,,,,,,{},{},{}
+7368,Lotto08,Lotto Ball 08,3,,10,10,,,,,,,,,,,,,{},{},{}
+7369,Lotto09,Lotto Ball 09,3,,10,10,,,,,,,,,,,,,{},{},{}
+7370,Lotto10,Lotto Ball 10,3,,10,10,,,,,,,,,,,,,{},{},{}
+7371,Lotto11,Lotto Ball 11,3,,10,10,,,,,,,,,,,,,{},{},{}
+7372,Lotto12,Lotto Ball 12,3,,10,10,,,,,,,,,,,,,{},{},{}
+7373,Lotto13,Lotto Ball 13,3,,10,10,,,,,,,,,,,,,{},{},{}
+7374,Lotto14,Lotto Ball 14,3,,10,10,,,,,,,,,,,,,{},{},{}
+7375,Lotto15,Lotto Ball 15,3,,10,10,,,,,,,,,,,,,{},{},{}
+7376,Lotto16,Lotto Ball 16,3,,10,10,,,,,,,,,,,,,{},{},{}
+7377,Lotto17,Lotto Ball 17,3,,10,10,,,,,,,,,,,,,{},{},{}
+7378,Lotto18,Lotto Ball 18,3,,10,10,,,,,,,,,,,,,{},{},{}
+7379,Lotto19,Lotto Ball 19,3,,10,10,,,,,,,,,,,,,{},{},{}
+7380,Lotto20,Lotto Ball 20,3,,10,10,,,,,,,,,,,,,{},{},{}
+7381,Lotto21,Lotto Ball 21,3,,10,10,,,,,,,,,,,,,{},{},{}
+7382,Lotto22,Lotto Ball 22,3,,10,10,,,,,,,,,,,,,{},{},{}
+7383,Lotto23,Lotto Ball 23,3,,10,10,,,,,,,,,,,,,{},{},{}
+7384,Lotto24,Lotto Ball 24,3,,10,10,,,,,,,,,,,,,{},{},{}
+7385,Lotto25,Lotto Ball 25,3,,10,10,,,,,,,,,,,,,{},{},{}
+7386,Lotto26,Lotto Ball 26,3,,10,10,,,,,,,,,,,,,{},{},{}
+7387,Lotto27,Lotto Ball 27,3,,10,10,,,,,,,,,,,,,{},{},{}
+7388,Lotto28,Lotto Ball 28,3,,10,10,,,,,,,,,,,,,{},{},{}
+7389,Lotto29,Lotto Ball 29,3,,10,10,,,,,,,,,,,,,{},{},{}
+7390,Lotto30,Lotto Ball 30,3,,10,10,,,,,,,,,,,,,{},{},{}
+7391,Lotto31,Lotto Ball 31,3,,10,10,,,,,,,,,,,,,{},{},{}
+7392,Lotto32,Lotto Ball 32,3,,10,10,,,,,,,,,,,,,{},{},{}
+7393,Lotto33,Lotto Ball 33,3,,10,10,,,,,,,,,,,,,{},{},{}
+7394,Lotto34,Lotto Ball 34,3,,10,10,,,,,,,,,,,,,{},{},{}
+7395,Lotto35,Lotto Ball 35,3,,10,10,,,,,,,,,,,,,{},{},{}
+7396,Lotto36,Lotto Ball 36,3,,10,10,,,,,,,,,,,,,{},{},{}
+7397,Lotto37,Lotto Ball 37,3,,10,10,,,,,,,,,,,,,{},{},{}
+7398,Lotto38,Lotto Ball 38,3,,10,10,,,,,,,,,,,,,{},{},{}
+7399,Piece_Of_Clue01,Selamat,3,,10,10,,,,,,,,,,,,,{},{},{}
+7400,Piece_Of_Clue02,Hari,3,,10,10,,,,,,,,,,,,,{},{},{}
+7401,Piece_Of_Clue03,Kemerdekaan,3,,10,10,,,,,,,,,,,,,{},{},{}
+7402,Piece_Of_Clue04,Republik,3,,10,10,,,,,,,,,,,,,{},{},{}
+7403,Piece_Of_Clue05,Indonesia,3,,10,10,,,,,,,,,,,,,{},{},{}
+7404,Piece_Of_Clue06,Ke-60,3,,10,10,,,,,,,,,,,,,{},{},{}
+7405,Crushed_Can,Crushed Can,3,,1,10,,,,,,,,,,,,,{},{},{}
+7406,Moon_Cake1,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7407,Moon_Cake2,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7408,Moon_Cake3,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7409,Moon_Cake4,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7410,Moon_Cake5,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7411,Moon_Cake6,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7412,Moon_Cake7,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7413,Moon_Cake8,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7414,Moon_Cake9,Yuebing,3,,10,10,,,,,,,,,,,,,{},{},{}
+7415,Stone_Of_Summons,Summoning Stone,3,,10,10,,,,,,,,,,,,,{},{},{}
+7416,Letter_Of_Recommendation,Letter of Recommentation,3,,10,10,,,,,,,,,,,,,{},{},{}
+7417,Mission_ScrollA,Written Request (A),3,,10,10,,,,,,,,,,,,,{},{},{}
+7418,Mission_ScrollB,Written Request (B),3,,10,10,,,,,,,,,,,,,{},{},{}
+7419,Embryo_Create_Book,Embryo Creation Guide,3,,10,10,,,,,,,,,,,,,{},{},{}
+7420,Skull_,Skull,3,,0,10,,,,,,,,,,,,,{},{},{}
+7421,Red_Key,Red Key,3,,10,0,,,,,,,,,,,,,{},{},{}
+7422,Yellow_Key,Yellow Key,3,,10,0,,,,,,,,,,,,,{},{},{}
+7423,Blue_Key,Blue Key,3,,10,0,,,,,,,,,,,,,{},{},{}
+7424,Green_Key,Green Key,3,,10,0,,,,,,,,,,,,,{},{},{}
+7425,Black_Key,Black Key,3,,10,0,,,,,,,,,,,,,{},{},{}
+7426,Red_Magic_Stone,Red Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
+7427,Yellow_Magic_Stone,Yellow Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
+7428,Blue_Magic_Stone,Blue Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
+7429,Green_Magic_Stone,Green Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
+7430,Black_Magic_Stone,Black Charm Stone,3,,10,0,,,,,,,,,,,,,{},{},{}
+7431,Books,Pile of Books,3,,10,10,,,,,,,,,,,,,{},{},{}
+7432,Leather_Pouch,Leather Pouch,3,,10,10,,,,,,,,,,,,,{},{},{}
+7433,Empty_Scroll,Blank Scroll,3,,2000,10,,,,,,,,,,,,,{},{},{}
+7434,Elemental_Create_Book,Elemental Potion Creation Guide,3,,10,10,,,,,,,,,,,,,{},{},{}
+7435,Golden_Accessory,Golden Ornament,3,,953,10,,,,,,,,,,,,,{},{},{}
+7436,Fragment_of_Agony,Fragment of Agony,3,,753,10,,,,,,,,,,,,,{},{},{}
+7437,Fragment_of_Sorrow,Fragment of Sorrow,3,,753,10,,,,,,,,,,,,,{},{},{}
+7438,Fragment_of_Hatred,Fragment of Hatred,3,,753,10,,,,,,,,,,,,,{},{},{}
+7439,Fragment_of_Despair,Fragment of Despair,3,,753,10,,,,,,,,,,,,,{},{},{}
+7440,Red_Feather,Red tinted Feather,3,,667,10,,,,,,,,,,,,,{},{},{}
+7441,Blue_Feather,Blue tinted Feather,3,,704,10,,,,,,,,,,,,,{},{},{}
+7442,Cursed_Seal,Cursed Seal,3,,666,10,,,,,,,,,,,,,{},{},{}
+7443,Head_of_3Head_Dragon,Three-Headed_Dragon's_Head,3,,478,10,,,,,,,,,,,,,{},{},{}
+7444,Treasure_Box,Treasure Box,3,,150000,10,,,,,,,,,,,,,{},{},{}
+7445,Green_Orb,Green Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
+7446,Blue_Orb,Blue Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
+7447,Red_Orb,Red Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
+7448,Yellow_Orb,Yellow Bijou,3,,443,10,,,,,,,,,,,,,{},{},{}
+7449,Bloodstained_Page,Bloody Page,3,,340,10,,,,,,,,,,,,,{},{},{}
+7450,Bone_Armor_Piece,Skeletal Armor Piece,3,,1025,10,,,,,,,,,,,,,{},{},{}
+7451,Scale_of_Fire_Dragon,Fire Dragon Scale,3,,926,10,,,,,,,,,,,,,{},{},{}
+7452,Yellow_Spice,Yellow Spice,3,1000,,10,,,,,,,,,,,,,{},{},{}
+7453,Sweet_Sauce,Sweet Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
+7454,Plain_Sauce,Savory Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
+7455,Hot_Sauce,Spicy Sauce,3,700,,10,,,,,,,,,,,,,{},{},{}
+7456,Red_Spice,Red Spice,3,1000,,10,,,,,,,,,,,,,{},{},{}
+7457,Cooking_Oil,Cooking Oil,3,500,,10,,,,,,,,,,,,,{},{},{}
+7458,Fortune_Horn,Fortune Horn,3,,10,10,,,,,,,,,,,,,{},{},{}
+7459,Ramadan_,Ramadan,3,,10,10,,,,,,,,,,,,,{},{},{}
+7460,Nifl_Express_Ticket,Niflheim Express Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7461,Blue_A_Card,Blue A Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7462,Blue_E_Card,Blue E Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7463,Blue_F_Card,Blue F Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7464,Blue_H_Card,Blue H Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7465,Blue_L_Card,Blue L Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7466,Blue_N_Card,Blue N Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7467,Blue_O_Card,Blue O Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7468,Blue_P_Card,Blue P Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7469,Blue_U_Card,Blue U Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7470,Blue_W_Card,Blue W Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7471,Blue_Y_Card,Blue Y Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7472,Cookbook01,Level 1 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7473,Cookbook02,Level 2 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7474,Cookbook03,Level 3 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7475,Cookbook04,Level 4 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7476,Cookbook05,Level 5 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7477,Cookbook06,Level 6 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7478,Cookbook07,Level 7 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7479,Cookbook08,Level 8 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7480,Cookbook09,Level 9 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7481,Cookbook10,Level 10 Cookbook,3,,10,10,,,,,,,,,,,,,{},{},{}
+7482,Pot,Pot,3,200,,10,,,,,,,,,,,,,{},{},{}
+7483,Key_of_the_Seal,Key of the Seal,3,,,10,,,,,,,,,,,,,{},{},{}
+7484,Warrior_Symbol,Symbol of a Brave Warrior,3,,10,10,,,,,,0,2,,,,,,{},{},{}
+7485,2nd_Floor_Pass,Cloud General,3,,10,10,,,,,,0,2,,,,,,{},{},{}
+7486,3rd_Floor_Pass,Wind General,3,,10,10,,,,,,0,2,,,,,,{},{},{}
+7487,Pub_Liquor,Pub Liquor,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7488,Delivery_Box,Delivery Box,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7489,Outhouse_Spare_Key,Spare Key to the Outhouse,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7490,Letter_to_Elie,Letter to Elie,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7491,Iron_Box,Iron_Box,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7492,Yellow_Keycard,Yellow Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7493,Golden_Key,Golden Key,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7494,Exquisite_Button,Exquisite Button,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7495,Blue_Keycard,Blue Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7496,Red_Keycard,Red_Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7497,Piece_of_Metal,Piece of Metal,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7498,Losimier's_House_Key,Key to Losimier's_House,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7499,Portrait_of_a_Family,Portrait of a Family,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7500,Portrait_of_a_Lady,Portrait of a Lady,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7501,K.H's_Letter,K.H's Letter,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7502,James's_Memo,James's Memo,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7503,Portrait_of_a_Guy,Portrait of a Guy,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7504,Power_Source,Power Source,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7505,Toy_Key,Toy Key,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7506,Black_Keycard,Black Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7507,Hard_Piece_of_Steel,Hard Piece of Steel,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7508,Elisia's_Ring,Elisia's Ring,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7509,Gorgeous_Keycard,Gorgeous Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7510,Valhalla's_Flower,Valhalla's Flower,3,,50000,10,,,,,,0,2,,,,,,{},{},{}
+7511,Darkness_Rune,Darkness Rune,3,1263,,10,,,,,,0,2,,,,,,{},{},{}
+7512,Burnt_Pieces,Burnt Pieces,3,,400,10,,,,,,0,2,,,,,,{},{},{}
+7513,Pocket_Watch,Pocket Watch,3,,855,10,,,,,,0,2,,,,,,{},{},{}
+7514,Monster_Ticket,Monster Ticket,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7515,Interesting_Medal,Interesting Medal,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7516,Green_Keycard,Green Keycard,3,,10,0,,,,,,0,2,,,,,,{},{},{}
+7517,Golden_Coin,Golden Coin,3,,10,100,,,,,,0,2,,,,,,{},{},{}
+7518,Women's_Medal,Women's Medal,3,,10,10,,,,,,0,2,,,,,,{},{},{}
+7519,Handsel,Handsel,3,,10,10,,,,,,,,,,,,,{},{},{}
+7520,Please_Be_Rich,Please Be Rich,3,,10,10,,,,,,,,,,,,,{},{},{}
+7521,Burning_Stone,Burning Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
+7522,Freezing_Stone,Freezing Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
+7523,Windchime_Stone,Windchime Stone,3,150,,10,,,,,,7,2,,,,,,{},{},{}
+7524,Fang,Fang,3,300,,20,,,,,,7,2,,,,,,{},{},{}
+7525,Summer_Festival_Ticket,Summer Festival Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7526,Application,Application,3,,10,0,,,,,,,,,,,,,{},{},{}
+7527,Book_About_True_Life,Book About True Life,3,,10,100,,,,,,,,,,,,,{},{},{}
+7528,Lottery_Ticket,Lottery Ticket,3,,10,0,,,,,,,,,,,,,{},{},{}
+7529,Stolen_Sandal,Stolen Sandal,3,,10,0,,,,,,,,,,,,,{},{},{}
+7530,Amatsu_Travel_Brochure,Amatsu Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
+7531,Gonryun_Travel_Brochure,Gonryun Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
+7532,Louyang_Travel_Brochure,Louyang Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
+7533,Ayothaya_Travel_Brochure,Ayothaya Travel Brochure,3,,10,0,,,,,,,,,,,,,{},{},{}
+7534,Amatsu_Photo_Album,Amatsu Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
+7535,Gonryun_Photo_Album,Gonryun Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
+7536,Louyang_Photo_Album,Louyang Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
+7537,Ayothaya_Photo_Album,Ayothaya Photo Album,3,,10,0,,,,,,,,,,,,,{},{},{}
+7538,Sand_For_Work,Sand For Work,3,,10,0,,,,,,,,,,,,,{},{},{}
+7539,Poring_Coin,Poring Coin,3,,10,0,,,,,,,,,,,,,{},{},{}
+7540,Lotto_Ball_39,Lotto Ball 39,3,,10,10,,,,,,,,,,,,,{},{},{}
+7541,Lotto_Ball_40,Lotto Ball 40,3,,10,10,,,,,,,,,,,,,{},{},{}
+7542,Lotto_Ball_41,Lotto Ball 41,3,,10,10,,,,,,,,,,,,,{},{},{}
+7543,Lotto_Ball_42,Lotto Ball 42,3,,10,10,,,,,,,,,,,,,{},{},{}
+7544,Lotto_Ball_43,Lotto Ball 43,3,,10,10,,,,,,,,,,,,,{},{},{}
+7545,Lotto_Ball_44,Lotto Ball 44,3,,10,10,,,,,,,,,,,,,{},{},{}
+7546,Lotto_Ball_45,Lotto Ball 45,3,,10,10,,,,,,,,,,,,,{},{},{}
+7547,Soccer_Ball,Soccer Ball,3,,10,10,,,,,,,,,,,,,{},{},{}
+7548,Soccer_Shoes,Soccer Shoes,3,,10,10,,,,,,,,,,,,,{},{},{}
+7549,Brazilian_Flag,Brazilian Flag,3,,10,10,,,,,,,,,,,,,{},{},{}
+7550,6.13_Ticket,6.13 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7551,6.18_Ticket,6.18 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7552,6.22_Ticket,6.22 Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7553,Lotus_,Lotus,3,,10,10,,,,,,,,,,,,,{},{},{}
+7554,Striped_Candle,Striped Candle,3,,10,10,,,,,,,,,,,,,{},{},{}
+7555,Green_Incense,Green Incense,3,,10,10,,,,,,,,,,,,,{},{},{}
+7556,Longing_Heart,Longing Heart,3,,10,10,,,,,,,,,,,,,{},{},{}
+7557,Invitation_Letter,Invitation Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
+7558,Invitation_Ticket,Invitation Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7559,Key_to_the_Secret_Garden,Key to the Secret Garden,3,,10,10,,,,,,,,,,,,,{},{},{}
+7560,Longing_Heart_,Longing Heart,3,,10,10,,,,,,,,,,,,,{},{},{}
+7561,Ice_Heart,Ice Heart,3,,303,10,,,,,,,,,,,,,{},{},{}
+7562,Ice_Scale,Ice Scale,3,,1510,10,,,,,,,,,,,,,{},{},{}
+7563,Bloody_Rune,Bloody Rune,3,,1008,10,,,,,,,,,,,,,{},{},{}
+7564,Rotten_Meat,Rotten Meat,3,,51,10,,,,,,,,,,,,,{},{},{}
+7565,Sticky_Poison,Sticky Poison,3,,175,10,,,,,,,,,,,,,{},{},{}
+7566,Will_of_Red_Darkness,Will of Red Darkness,3,,765,10,,,,,,,,,,,,,{},{},{}
+7567,Suspicious_Hat,Suspicious Hat,3,,645,10,,,,,,,,,,,,,{},{},{}
+7568,White_Mask,White Mask,3,,530,10,,,,,,,,,,,,,{},{},{}
+7569,Hammer_of_Wind,Hammer of Wind,3,,10,0,,,,,,,,,,,,,{},{},{}
+7570,Temple_Lottery_Ticket,Temple Lottery Ticket,3,,10,10,,,,,,,,,,,,,{},{},{}
+7571,Blue's_Diary,Blue's Diary,3,,10,0,,,,,,,,,,,,,{},{},{}
+7572,Gray_Necklace,Gray Necklace,3,,10,0,,,,,,,,,,,,,{},{},{}
+7573,Shining_Necklace,Shining Necklace,3,,10,0,,,,,,,,,,,,,{},{},{}
+7574,Ice_Powder,Ice Powder,3,,10,0,,,,,,,,,,,,,{},{},{}
+7575,Red-coloured_Gem,Red-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
+7576,Blue-coloured_Gem,Blue-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
+7577,Yellow-coloured_Gem,Yellow-colored Gem,3,,10,50,,,,,,,,,,,,,{},{},{}
+7578,Countermagic_Crystal,Countermagic Crystal,3,,10,10,,,,,,,,,,,,,{},{},{}
+7579,Silk_Handkerchief_of_Zhi_Nu,Silk Handkerchief of Zhi Nu,3,,10,10,,,,,,,,,,,,,{},{},{}
+7581,Celebration_Document,Celebration Document,3,,10,10,,,,,,,,,,,,,{},{},{}
+7582,Jewel_of_Destruction,Jewel of Destruction,3,,10,10,,,,,,,,,,,,,{},{},{}
+7583,Evil_Mind,Evil Mind,3,,10,10,,,,,,,,,,,,,{},{},{}
+7584,Guard's_First_Proof,Guard's First Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
+7585,Guard's_Second_Proof,Guard's Second Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
+7586,Guard's_Third_Proof,Guard's Third Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
+7587,Guard's_Fourth_Proof,Guard's Fourth Proof,3,,10,10,,,,,,,,,,,,,{},{},{}
+7588,IPOD_Coupon,IPOD Coupon,3,,10,10,,,,,,,,,,,,,{},{},{}
+7589,Lettered_Moon_Snack_01,Lettered Moon Snack 01,3,,10,10,,,,,,,,,,,,,{},{},{}
+7590,Lettered_Moon_Snack_02,Lettered Moon Snack 02,3,,10,10,,,,,,,,,,,,,{},{},{}
+7591,Lettered_Moon_Snack_03,Lettered Moon Snack 03,3,,10,10,,,,,,,,,,,,,{},{},{}
+7592,Lettered_Moon_Snack_04,Lettered Moon Snack 04,3,,10,10,,,,,,,,,,,,,{},{},{}
+7593,Lettered_Moon_Snack_05,Lettered Moon Snack 05,3,,10,10,,,,,,,,,,,,,{},{},{}
+7594,Sonia's_Letter,Sonia's Letter,3,,10,10,,,,,,,,,,,,,{},{},{}
+7595,Special_Sword,Special Sword,3,,10,10,,,,,,,,,,,,,{},{},{}
+7596,Special_Shield,Special Shield,3,,10,10,,,,,,,,,,,,,{},{},{}
+7597,Magic_Stone,Magic Stone,3,,10,10,,,,,,,,,,,,,{},{},{}
+7598,Blue_I_Card,Blue I Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7599,Blue_D_Card,Blue D Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7600,Blue_K_Card,Blue K Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7601,Blue_S_Card,Blue S Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+7602,Blue_R_Card,Blue R Card,3,,10,10,,,,,,,,,,,,,{},{},{}
+// Pet Eggs
+//===================================================================
+9001,Poring_Egg,Poring Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9002,Drops_Egg,Drops Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9003,Poporing_Egg,Poporing Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9004,Lunatic_Egg,Lunatic Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9005,Picky_Egg,Picky Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9006,Chonchon_Egg,Chonchon Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9007,Steel_Chonchon_Egg,Steel Chonchon Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9008,Hunter_Fly_Egg,Hunter Fly Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9009,Savage_Bebe_Egg,Savage Babe Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9010,Baby_Desert_Wolf_Egg,Baby Desert Wolf Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9011,Rocker_Egg,Rocker Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9012,Spore_Egg,Spore Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9013,Poison_Spore_Egg,Poison Spore Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9014,PecoPeco_Egg,Peco_Peco Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9015,Smokie_Egg,Smokie Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9016,Yoyo_Egg,Yoyo Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9017,Orc_Warrior_Egg,Orc Warrior Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9018,Munak_Egg,Munak Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9019,Dokkaebi_Egg,Dokebi Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9020,Sohee_Egg,Sohee Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9021,Isis_Egg,Isis Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9022,Green_Petite_Egg,Green Petite Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9023,Deviruchi_Egg,Deviruchi Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9024,Bapho_Jr._Egg,Bapho Jr. Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9025,Bongun_Egg,Bongun Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9026,Zherlthsh_Egg,Zherlthsh Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+9027,Alice_Egg,Alice Egg,7,,10,0,,,,,,,,,,,,,{},{},{}
+// Pet Accessories
+//===================================================================
+10001,Skull_Helm,Skull Helm,8,,10,0,,,,,,,,,,,,,{},{},{}
+10002,Monster_Oxygen_Mask,Monster Oxygen Mask,8,,10,0,,,,,,,,,,,,,{},{},{}
+10003,Transparent_Headgear,Transparent Headgear,8,,10,0,,,,,,,,,,,,,{},{},{}
+10004,Pacifier,Pacifier,8,,10,0,,,,,,,,,,,,,{},{},{}
+10005,Wig,Wig,8,,10,0,,,,,,,,,,,,,{},{},{}
+10006,Queen's_Hair_Ornament,Queen's Hair Ornament,8,,10,0,,,,,,,,,,,,,{},{},{}
+10007,Silk_Ribbon,Silk Ribbon,8,,10,0,,,,,,,,,,,,,{},{},{}
+10008,Punisher,Punisher,8,,10,0,,,,,,,,,,,,,{},{},{}
+10009,Wild_Flower,Wild Flower,8,,10,0,,,,,,,,,,,,,{},{},{}
+10010,Battered_Pot,Battered Pot,8,,10,0,,,,,,,,,,,,,{},{},{}
+10011,Stellar_Hairpin,Stellar Hairpin,8,,10,0,,,,,,,,,,,,,{},{},{}
+10012,Tiny_Egg_Shell,Tiny Egg Shell,8,,10,0,,,,,,,,,,,,,{},{},{}
+10013,Backpack,Backpack,8,1500,,0,,,,,,,,,,,,,{},{},{}
+10014,Rocker_Glasses,Rocker Glasses,8,2000,,0,,,,,,,,,,,,,{},{},{}
+10015,Green_Lace,Green Lace,8,,10,0,,,,,,,,,,,,,{},{},{}
+10016,Golden_Bell,Golden Bell,8,,10,0,,,,,,,,,,,,,{},{},{}
+10017,Bark_Shorts,Bark Shorts,8,,10,0,,,,,,,,,,,,,{},{},{}
+10018,Monkey_Circlet,Monkey Circlet,8,,10,0,,,,,,,,,,,,,{},{},{}
+10019,Red_Muffler,Red Scarf,8,,10,0,,,,,,,,,,,,,{},{},{}
+10020,Sword_Of_Grave_Keeper,Grave Keeper's Sword,8,,10,0,,,,,,,,,,,,,{},{},{}
+// History Books
+//===================================================================
+11000,Prontera_Book_01,History book of Prontera,3,,10,0,,,,,,,,,,,,,{},{},{}
+// More Usable Items
+//===================================================================
+// Scrolls
+12000,Cold_Scroll_2_5,Level 5 Frost Diver,11,700,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 15,5,"Frost Diver Level 5"; },{},{}
+12001,Holy_Scroll_1_3,Level 3 Heal,11,1000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 28,3,"Heal Level 3"; },{},{}
+12002,Holy_Scroll_1_5,Level 5 Heal,11,2000,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 28,5,"Heal Level 5"; },{},{}
+12003,Holy_Scroll_2_1,Level 1 Teleport,11,100,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 26,1,"Teleport Level 1"; },{},{}
+// Arrow Quivers
+12004,Arrow_Container,Quiver,2,500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1750,500; },{},{}
+12005,Iron_Arrow_Container,Iron Arrow Quiver,2,1000,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1770,500; },{},{}
+12006,Steel_Arrow_Container,Steel Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1753,500; },{},{}
+12007,Ori_Arrow_Container,Oridecon Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1765,500; },{},{}
+12008,Fire_Arrow_Container,Fire Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1752,500; },{},{}
+12009,Silver_Arrow_Container,Silver Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1751,500; },{},{}
+12010,Wind_Arrow_Container,Wind Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1755,500; },{},{}
+12011,Stone_Arrow_Container,Stone Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1756,500; },{},{}
+12012,Crystal_Arrow_Container,Crystal Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1754,500; },{},{}
+12013,Shadow_Arrow_Container,Shadow Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1767,500; },{},{}
+12014,Imma_Arrow_Container,Immaterial Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1757,500; },{},{}
+12015,Rusty_Arrow_Container,Rusty Arrow Quiver,2,1500,,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1762,500; },{},{}
+// Speed Potions
+12016,Speed_Up_Potion,Speed Potion,0,1000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ specialeffect 507; sc_start SC_SpeedUp1,5000,0; },{},{}
+12017,Slow_Down_Potion,Slow Potion,0,1000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12018,Fire_Cracker,Firecracker,2,100,1,20,,,,,0xFFFFFFFF,7,2,,,,,,{ misceffect(256); },{},{}
+12019,Holy_Egg,Holy Egg,2,,10,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 54,2,"Resurrection"; },{},{}
+12020,Water_Of_Darkness,Cursed_Water,0,,1,30,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_SHADOWWEAPON, 1200000, 1; },{},{}
+12021,Pork_Belly,Pork,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,99),0; },{},{}
+12022,Spareribs,Galbi,0,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(70,99),0; },{},{}
+12023,Giftbox_China,Wrapped Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_GiftBox),1; },{},{}
+12024,Red_Pouch_Of_Surprise,Red Pouch,2,,10,50,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12025,Egg_Boy,Dano Festival Egg,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12026,Egg_Girl,Dano Festival Egg,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+// Effect Boxes
+12027,Giggling_Box,Giggling Box,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 9,0; if(rand(100)<30) sc_start SC_Curse,30000,0; },{},{}
+12028,Box_Of_Thunder,Box of Thunder,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_SpeedUp1,20000,0; },{},{}
+12029,Gloomy_Box,Box of Gloom,11,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ itemskill 45,1,"Improve Concentration"; },{},{}
+12030,Box_Of_Grudge,Box of Resentment,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_ATKPOTION,60000,20; },{},{}
+12031,Sleepy_Box,Box of Drowsiness,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_MATKPOTION,60000,20; },{},{}
+12032,Box_Of_Storm,Box of Storms,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WATERWEAPON,180000,0; },{},{}
+12033,Box_Of_Sunlight,Box of Sunlight,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Intravision,20000,0; },{},{}
+12034,Painting_Box,Box of Panting,2,,500,200,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 0,9; if(rand(100)<30) sc_start SC_Silence,30000,0; },{},{}
+12035,Lotto_Box01,Lotto Box 01,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7361,7370),1; },{},{}
+12036,Lotto_Box02,Lotto Box 02,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7371,7380),1; },{},{}
+12037,Lotto_Box03,Lotto Box 03,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7381,7390),1; },{},{}
+12038,Lotto_Box04,Lotto Box 04,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_LottoBox),1; },{},{}
+12039,Lotto_Box05,Lotto Box 05,2,,10,20,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem rand(7542,7546),1; },{},{}
+12040,Stone_Of_Intelligence_,Stone of Sage,2,,50000,300,,,,,0xFFFFFFFF,7,2,,,,,,{ homevolution ; },{},{}
+// Mixed Foods (+1 to +5)
+12041,Str_Dish01,Fried Grasshopper Legs,0,2000,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 1; percentheal 5,0; },{},{}
+12042,Str_Dish02,Seasoned Sticky Webfoot,0,4000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 2; percentheal 5,0; },{},{}
+12043,Str_Dish03,Bomber Steak,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 3; percentheal 5,0; },{},{}
+12044,Str_Dish04,Herb Marinade Beef,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 4; percentheal 5,0; },{},{}
+12045,Str_Dish05,Lutie Lady's Pancake,0,10000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 5; percentheal 10,0; },{},{}
+12046,Int_Dish01,Grape Juice Herbal Tea,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 1; percentheal 0,5; },{},{}
+12047,Int_Dish02,Autumn Red Tea,0,4000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 2; percentheal 0,5; },{},{}
+12048,Int_Dish03,Honey Herbal Tea,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 3; percentheal 0,5; },{},{}
+12049,Int_Dish04,Morocc Fruit Wine,0,8000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 4; percentheal 0,5; },{},{}
+12050,Int_Dish05,Mastela Fruit Wine,0,10000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 5; percentheal 0,10; },{},{}
+12051,Vit_Dish01,Steamed Crab Nippers,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 1; percentheal 5,0; },{},{}
+12052,Vit_Dish02,Assorted Seafood,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 2; percentheal 5,0; },{},{}
+12053,Vit_Dish03,Clam Soup,0,6000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 3; percentheal 5,0; },{},{}
+12054,Vit_Dish04,Seasoned Jellyfish,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 4; percentheal 5,0; },{},{}
+12055,Vit_Dish05,Spicy Fried Bao,0,10000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 5; percentheal 10,0; },{},{}
+12056,Agi_Dish01,Frog Egg Squid Ink Soup,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 1; percentheal 3,1; },{},{}
+12057,Agi_Dish02,Smooth Noodle,0,4000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 2; percentheal 3,1; },{},{}
+12058,Agi_Dish03,Tentacle Cheese Gratin,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 3; percentheal 3,1; },{},{}
+12059,Agi_Dish04,Lutie Cold Noodle,0,8000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 4; percentheal 3,1; },{},{}
+12060,Agi_Dish05,Steamed Bat Wing in Pumpkin,0,10000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 5; percentheal 6,2; },{},{}
+12061,Dex_Dish01,Honey Grape Juice,0,2000,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 1; percentheal 2,2; },{},{}
+12062,Dex_Dish02,Chocolate Mousse Cake,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 2; percentheal 2,2; },{},{}
+12063,Dex_Dish03,Fruit Mix,0,6000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 3; percentheal 2,2; },{},{}
+12064,Dex_Dish04,Cream Sandwich,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 4; percentheal 2,2; },{},{}
+12065,Dex_Dish05,Green Salad,0,10000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 5; percentheal 5,5; },{},{}
+12066,Luk_Dish01,Fried Monkey Tails,0,2000,,60,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 1; percentheal 3,2; },{},{}
+12067,Luk_Dish02,Mixed Juice,0,4000,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 2; percentheal 3,2; },{},{}
+12068,Luk_Dish03,Fried Sweet Potato,0,6000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 3; percentheal 4,2; },{},{}
+12069,Luk_Dish04,Steamed Ancient Lips,0,8000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 4; percentheal 4,2; },{},{}
+12070,Luk_Dish05,Fried Scorpion Tails,0,10000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 5; percentheal 5,2; },{},{}
+// Mixed Foods (+6 to +10)
+12071,Str_Dish06,Shiny Marinade Beef,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 6; percentheal 10,2; },{},{}
+12072,Str_Dish07,Whole Roast,0,40000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 7; percentheal 10,4; },{},{}
+12073,Str_Dish08,Bearfoot Special,0,60000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 8; percentheal 15,6; },{},{}
+12074,Str_Dish09,Tendon Satay,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 9; percentheal 15,8; },{},{}
+12075,Str_Dish10,Steamed Tongue,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_STRFood, 1200000, 10; percentheal 20,20; },{},{}
+12076,Int_Dish06,Red Mushroom Wine,0,20000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 6; percentheal 2,10; },{},{}
+12077,Int_Dish07,Special Royal Jelly Herbal Tea,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 7; percentheal 4,10; },{},{}
+12078,Int_Dish08,Royal Family Tea,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 8; percentheal 6,10; },{},{}
+12079,Int_Dish09,Tristan XII,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 9; percentheal 8,15; },{},{}
+12080,Int_Dish10,Dragon Breath Cocktail,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INTFood, 1200000, 10; percentheal 10,20; },{},{}
+12081,Vit_Dish06,Awfully Bitter Bracer,0,20000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 6; percentheal 13,0; },{},{}
+12082,Vit_Dish07,Sumptuous Feast,0,40000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 7; percentheal 16,0; },{},{}
+12083,Vit_Dish08,Giant Burito,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 8; percentheal 19,0; },{},{}
+12084,Vit_Dish09,Ascending Dragon Soup,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 9; percentheal 22,0; },{},{}
+12085,Vit_Dish10,Immortal Stew,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_VITFood, 1200000, 10; percentheal 25,0; },{},{}
+12086,Agi_Dish06,Chile Shrimp Gratin,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 6; percentheal 7,2; },{},{}
+12087,Agi_Dish07,Steamed Alligator with Vegetable,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 7; percentheal 8,2; },{},{}
+12088,Agi_Dish08,Incredibly Spicy Curry,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 8; percentheal 9,2; },{},{}
+12089,Agi_Dish09,Special Meat Stew,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 9; percentheal 10,2; },{},{}
+12090,Agi_Dish10,Steamed Desert Scorpions,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1200000, 10; percentheal 15,5; },{},{}
+12091,Dex_Dish06,Peach Cake,0,20000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 6; percentheal 5,6; },{},{}
+12092,Dex_Dish07,Soul Haunted Bread,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 7; percentheal 5,7; },{},{}
+12093,Dex_Dish08,Special Toast,0,60000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 8; percentheal 5,8; },{},{}
+12094,Dex_Dish09,Heavenly Fruit Juice,0,80000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 9; percentheal 5,9; },{},{}
+12095,Dex_Dish10,Hwergelmir's Tonic,0,100000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_DEXFood, 1200000, 10; percentheal 10,10; },{},{}
+12096,Luk_Dish06,Lucky Soup,0,20000,,300,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 6; percentheal 6,3; },{},{}
+12097,Luk_Dish07,Assorted Shish Kebob,0,40000,,800,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 7; percentheal 7,3; },{},{}
+12098,Luk_Dish08,Strawberry Flavored Rice Ball,0,60000,,400,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 8; percentheal 9,3; },{},{}
+12099,Luk_Dish09,Blood Flavored Soda,0,80000,,1000,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 9; percentheal 10,4; },{},{}
+12100,Luk_Dish10,Cooked Nine Tail,0,100000,,500,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_LUKFood, 1200000, 10; percentheal 14,8; },{},{}
+12101,Citron,Citron,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12102,Meat_Skewer,Grilled Skewer,0,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+// New Monster Summoners & Item Givers
+12103,Bloody_Dead_Branch,Bloody Branch,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-3,1,""; },{},{}
+12104,Random_Quiver,Random Quiver,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Quiver),1; },{},{}
+12105,Set_Of_Taiming_Item,Taming Gift Set,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Taming),3; },{},{}
+12106,Accessory_Box,Jewelry Box,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Accesory),1; },{},{}
+12107,Wrapped_Mask,Wrapped Mask,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Mask),1; },{},{}
+12108,Bundle_Of_Magic_Scroll,Scroll Package,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Scroll),5; },{},{}
+12109,Poring_Box,Poring Box,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ monster "this",-1,-1,"--ja--",-2,1,""; },{},{}
+12110,First_Aid_Kit,First Aid Kit,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Potion),5; },{},{}
+12111,Food_Package,Bundle of Food,2,,5000,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_Fruit),1; getitem groupranditem(IG_Meat),1; getitem groupranditem(IG_Fish),1; },{},{}
+12112,Tropical_Sograt,Tropical Sograt,0,,500,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Curse,10000,1; },{},{}
+12113,Vermilion_The_Beach,Vermilion on the Beach,0,,500,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Stun,10000,1; },{},{}
+// Elemental Converters
+12114,Flame_Converter,Flame Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_FIREWEAPON,180000,1; },{},{}
+12115,Frost_Converter,Frost Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WATERWEAPON,180000,1; },{},{}
+12116,Seismic_Converter,Seismic Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_EARTHWEAPON,180000,1; },{},{}
+12117,Lighting_Converter,Lightning Elemental Converter,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_WINDWEAPON,180000,1; },{},{}
+// Elemental Resistance Potions
+12118,Resist_Fire_Potion,Fire Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Fire,20,Ele_Water,-15; },{},{}
+12119,Resist_Cold_Potion,Cold Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Water,20,Ele_Wind,-15; },{},{}
+12120,Resist_Earth_Potion,Earth Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Earth,20,Ele_Fire,-15; },{},{}
+12121,Resist_Wind_Potion,Thunder Resist Potion,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start4 SC_ARMOR_ELEMENT,1200000,Ele_Wind,20,Ele_Earth,-15; },{},{}
+12122,Sesame_Pastry,Sesame Pastry,0,,1,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_HitFood,1200000,30; },{},{}
+12123,Honey_Pastry,Honey Pastry,0,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_FleeFood,1200000,30; },{},{}
+12124,Rainbow_Cake,Rainbow Cake,0,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_BATKFood,1200000,10; sc_start SC_MATKFood,120000,10; },{},{}
+// Cooking Sets
+12125,Outdoor_Cooker,Outdoor Cooking Kit,2,500,,20,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 11; },{},{}
+12126,Home_Cooking_Set,Home Cooking Kit,2,1000,,30,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 12; },{},{}
+12127,High_end_Cooking_Kits,Professional Cooking Kit,2,2000,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 13; },{},{}
+12128,Imperial_Cooking_Kits,Royal Cooking Kit,2,5000,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 14; },{},{}
+12129,Fantastic_Cooking_Kits,Fantastic Cooking Kit,2,10000,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ produce 15; },{},{}
+//
+12130,Cookie_Bag,Cookie Bag,2,,10,70,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_CookieBag),1; },{},{}
+12131,Lucky_Potion,Lucky Potion,0,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12132,Red_Bag,Santa's Bag,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_Xmas,600000,0; },{},{}
+12133,McDonald's_Ice_Cone,McDonald's Ice Cone,0,50,,80,,,,,0xFFFFFFFF,7,2,,,,,,{ if(gettime(5) != MDiceCone) { set MDiceCone,gettime(5); percentheal 50,50; } },{},{}
+12134,Red_Envelope_,Red Envelope,2,,10,10,,,,,0xFFFFFFFF,7,2,,,,,,{ set Zeny,Zeny+rand(1000,10000); },{},{}
+12135,Green_Ale,Green Ale,2,,10,30,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; if(rand(100) >= 90)sc_start SC_Confusion,10000,0; },{},{}
+12136,Women's_Bundle,Women's Bundle,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem callfunc("F_RandMes",4,558,529,2668,7518),1; },{},{}
+12137,First_Stage,First Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12138,Second_Stage,Second Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12139,Third_Stage,Third Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12140,Fourth_Stage,Fourth Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12141,Fifth_Stage,Fifth Stage,2,,10,0,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12142,Book_of_Magic,Book of Magic,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_AGIFood, 1800000, 10; },{},{}
+12143,Red_Can,Red Can,2,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 25,25; },{},{}
+12144,Lightning_Sphere_Pack,Lightning Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13204,500; },{},{}
+12145,Blind_Sphere_Pack,Blind Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13206,500; },{},{}
+12146,Poison_Sphere_Pack,Poison Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13205,500; },{},{}
+12147,Freezing_Sphere_Pack,Freezing Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13207,500; },{},{}
+12148,Flare_Sphere_Pack,Flare Sphere Pack,2,,10,350,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13203,500; },{},{}
+12149,Bullet_Casing,Bullet Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13200,500; },{},{}
+12150,Shell_of_Blood_Casing,Shell of Blood Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13202,500; },{},{}
+12151,Silver_Bullet_Casing,Silver Bullet Casing,2,,10,250,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 13201,500; },{},{}
+12152,Special_Gift,Special Gift,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12153,Archer_Mercenary_Summon_Scroll_Level_1,Archer Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12154,Archer_Mercenary_Summon_Scroll_Level_2,Archer Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12155,Archer_Mercenary_Summon_Scroll_Level_3,Archer Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12156,Archer_Mercenary_Summon_Scroll_Level_4,Archer Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12157,Archer_Mercenary_Summon_Scroll_Level_5,Archer Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12158,Archer_Mercenary_Summon_Scroll_Level_6,Archer Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12159,Archer_Mercenary_Summon_Scroll_Level_7,Archer Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12160,Archer_Mercenary_Summon_Scroll_Level_8,Archer Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12161,Archer_Mercenary_Summon_Scroll_Level_9,Archer Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12162,Archer_Mercenary_Summon_Scroll_Level_10,Archer Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12163,Swordsman_Mercenary_Summon_Scroll_Level_1,Swordsman Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12164,Swordsman_Mercenary_Summon_Scroll_Level_2,Swordsman Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12165,Swordsman_Mercenary_Summon_Scroll_Level_3,Swordsman Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12166,Swordsman_Mercenary_Summon_Scroll_Level_4,Swordsman Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12167,Swordsman_Mercenary_Summon_Scroll_Level_5,Swordsman Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12168,Swordsman_Mercenary_Summon_Scroll_Level_6,Swordsman Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12169,Swordsman_Mercenary_Summon_Scroll_Level_7,Swordsman Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12170,Swordsman_Mercenary_Summon_Scroll_Level_8,Swordsman Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12171,Swordsman_Mercenary_Summon_Scroll_Level_9,Swordsman Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12172,Swordsman_Mercenary_Summon_Scroll_Level_10,Swordsman Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12173,Spearman_Mercenary_Summon_Scroll_Level_1,Spearman Mercenary Summon Scroll Level 1,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12174,Spearman_Mercenary_Summon_Scroll_Level_2,Spearman Mercenary Summon Scroll Level 2,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12175,Spearman_Mercenary_Summon_Scroll_Level_3,Spearman Mercenary Summon Scroll Level 3,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12176,Spearman_Mercenary_Summon_Scroll_Level_4,Spearman Mercenary Summon Scroll Level 4,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12177,Spearman_Mercenary_Summon_Scroll_Level_5,Spearman Mercenary Summon Scroll Level 5,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12178,Spearman_Mercenary_Summon_Scroll_Level_6,Spearman Mercenary Summon Scroll Level 6,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12179,Spearman_Mercenary_Summon_Scroll_Level_7,Spearman Mercenary Summon Scroll Level 7,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12180,Spearman_Mercenary_Summon_Scroll_Level_8,Spearman Mercenary Summon Scroll Level 8,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12181,Spearman_Mercenary_Summon_Scroll_Level_9,Spearman Mercenary Summon Scroll Level 9,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12182,Spearman_Mercenary_Summon_Scroll_Level_10,Spearman Mercenary Summon Scroll Level 10,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12183,Holy_Arrow_Container,Holy Arrow Quiver,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 1772,500; },{},{}
+12184,Mercenary's_Red_Potion,Mercenary's Red Potion,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12185,Mercenary's_Blue_Potion,Mercenary's Blue Potion,2,,10,100,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12186,Old_Red_Box,Old Red Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12187,Old_Green_Box,Old Green Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+12188,Fantastic_Moon_Snack,Fantastic Moon Snack,2,,10,300,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 50,50; },{},{}
+12189,Old_Red_Box_,Old Red Box,2,,10,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
+// More Weapons
+//===================================================================
+// Daggers
+13000,Jujube_Dagger,Dagger with Jujube hilt,4,,5000,600,39,,1,0,0x008F5EEF,7,2,2,1,0,1,1,{ bonus bAtkEle,Ele_Wind; },{},{}
+13001,Dragon_Killer,Dragon Killer,4,,10,900,110,,1,0,0x008F5EEF,7,2,2,4,60,1,1,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bExpAddRace,RC_Dragon,10; },{},{}
+13002,Ginnungagap,Ginnungagap,4,,10,700,120,,1,0,0x008F5EEF,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; bonus2 bAddEff2,Eff_Blind,50; },{},{}
+13003,Coward,Cowardice Blade,4,52000,,700,80,,1,1,0x02021040,7,2,2,3,55,1,1,{ bonus bDef,5; },{},{}
+13004,Coward_,Cowardice Blade,4,52000,,700,80,,1,2,0x02021040,7,2,2,3,55,1,1,{ bonus bDef,5; },{},{}
+13005,Angelwing_Short_Sword,Angelic Wing Dagger,4,,10,600,120,,1,1,0xFFFFFFFE,7,2,2,4,50,1,1,{},{},{}
+// Ninja Weapons
+13006,Khukri,Gokurin,4,240000,,600,150,,1,0,0x02000000,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,500; },{},{}
+13007,Jitte,Jitte,4,20000,,400,70,,1,0,0x02000000,7,2,2,2,35,1,1,{ bonus bBreakWeaponRate,500; },{},{}
+13008,Jitte_,Jitte,4,20000,,400,70,,1,1,0x02000000,7,2,2,2,35,1,1,{ bonus bBreakWeaponRate,500; },{},{}
+13009,Kamaitachi,Kamaitachi,4,48000,,900,125,,1,0,0x02000000,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus bCritical,3; bonus bAspdRate,3; },{},{}
+13010,Asura,Ashura,4,32000,,600,50,,1,2,0x02000000,7,2,2,1,12,1,1,{ bonus bMatkRate,10; },{},{}
+13011,Asura_,Ashura,4,32000,,600,50,,1,3,0x02000000,7,2,2,1,12,1,1,{ bonus bMatkRate,10; },{},{}
+13012,Murasame,Murasame,4,48000,,700,95,,1,1,0x02000000,7,2,2,2,24,1,1,{ bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
+13013,Muraseme_,Murasame,4,48000,,700,95,,1,2,0x02000000,7,2,2,2,24,1,1,{ bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10; },{},{}
+13014,Hakujin,Hakujin,4,120000,,800,120,,1,0,0x02000000,7,2,2,3,42,1,1,{ bonus4 bAutoSpell,28,1,20,0; },{},{}
+13015,Hakujin_,Hakujin,4,120000,,800,120,,1,1,0x02000000,7,2,2,3,42,1,1,{ bonus4 bAutoSpell,28,1,20,0; },{},{}
+13016,Poison_Knife__,Poison Knife,4,,10,800,64,,1,2,0x028F5EEE,7,2,2,3,65,1,1,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,3000; },{},{}
+13017,Ice_Pick_,Ice Pick,4,,10,600,70,,1,1,0x028F5EEE,7,2,2,4,36,1,1,{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; },{},{}
+13018,Sucsamad_,Sucsamad,4,,10,800,140,,1,1,0x028F5EEE,7,2,2,4,36,1,1,{ bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0; },{},{}
+13019,Ginnungagap_,Ginnungagap,4,,10,700,120,,1,1,0x008F5EEF,7,2,2,4,70,1,1,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; bonus2 bAddEff2,Eff_Blind,50; },{},{}
+13020,Warrior's_Balmung_,Warrior's Balmung,4,,10,1000,170,,1,0,0xFFFFFFFF,7,2,2,4,48,1,2,{ bonus bAllStats,5; },{},{}
+// Guns
+13100,Six_Shooter,Six Shooter,4,4500,,400,30,,7,1,0x01000000,7,2,34,1,10,1,17,{ bonus bHit,-10; },{},{}
+13101,Six_Shooter_,Six Shooter,4,4500,,400,30,,7,2,0x01000000,7,2,34,1,10,1,17,{ bonus bHit,-10; },{},{}
+13102,Crimson_Bolt,Crimson Bolt,4,20000,,450,45,,7,1,0x01000000,7,2,34,2,35,1,17,{ bonus bHit,-10; },{},{}
+13103,Crimson_Bolt_,Crimson Bolt,4,20000,,450,45,,7,2,0x01000000,7,2,34,2,35,1,17,{ bonus bHit,-10; },{},{}
+13104,The_Garrison,Garrison,4,48000,,500,70,,7,1,0x01000000,7,2,34,2,55,1,17,{ bonus bHit,-10; },{},{}
+13105,The_Garrison_,Garrison,4,48000,,500,70,,7,2,0x01000000,7,2,34,2,55,1,17,{ bonus bHit,-10; },{},{}
+13106,Gold_Lux,Gold Lux,4,100000,,500,20,,7,0,0x01000000,7,2,34,3,12,1,17,{ bonus bHit,-10; if(getskilllv(500)>0) bonus4 bAutoSpell,500,getskilllv(500),100,0; },{},{}
+13150,Branch,Branch,4,3000,,500,50,,9,3,0x01000000,7,2,34,1,1,1,18,{},{},{}
+13151,The_Cyclone,Cyclone,4,17500,,700,120,,9,1,0x01000000,7,2,34,2,24,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
+13152,The_Cyclone_,Cyclone,4,17500,,700,120,,9,2,0x01000000,7,2,34,2,24,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
+13153,Dusk,Dusk,4,23500,,750,150,,9,1,0x01000000,7,2,34,2,56,1,18,{ bonus bHit,10; bonus bCritical,10; },{},{}
+13154,Rolling_Stone,Rolling Stone,4,12000,,900,135,,9,1,0x01000000,7,2,34,1,14,1,19,{ bonus bSplashRange,1; },{},{}
+13155,Black_Rose,Black Rose,4,32000,,900,180,,9,1,0x01000000,7,2,34,2,35,1,19,{ bonus bSplashRange,1; },{},{}
+13156,Gate_Keeper,Gate Keeper,4,56000,,1000,210,,9,0,0x01000000,7,2,34,2,55,1,19,{ bonus bSplashRange,1; bonus4 bAutoSpell,520,6,50,1; },{},{}
+13157,Drifter,Drifter,4,80000,,2300,50,,7,1,0x01000000,7,2,34,2,55,1,20,{},{},{}
+13158,Butcher,Butcher,4,130000,,2500,75,,7,0,0x01000000,7,2,34,3,68,1,20,{ bonus2 bCriticalAddRace,RC_Brute,10; },{},{}
+13159,Butcher_,Butcher,4,130000,,2500,75,,7,1,0x01000000,7,2,34,3,68,1,20,{ bonus2 bCriticalAddRace,RC_Brute,10; },{},{}
+13160,Destroyer,Destroyer,4,110000,,1200,220,,7,0,0x01000000,7,2,34,2,52,1,21,{ bonus bBreakArmorRate,200; },{},{}
+13161,Destroyer_,Destroyer,4,110000,,1200,220,,7,1,0x01000000,7,2,34,2,52,1,21,{ bonus bBreakArmorRate,200; },{},{}
+13162,Inferno,Inferno,4,230000,,1250,280,,7,1,0x01000000,7,2,34,2,65,1,21,{},{},{}
+// Bullets
+13200,Bullet,Bullet,10,1,,2,10,,,,0x01000000,7,2,32768,,1,,3,{},{},{}
+13201,Silver_Bullet,Silver Bullet,10,15,,2,15,,,,0x01000000,7,2,32768,,1,,3,{ bonus bAtkEle,Ele_Holy; },{},{}
+13202,Shell_of_Blood,Shell of Blood,10,30,,2,30,,,,0x01000000,7,2,32768,,1,,3,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
+13203,Flare_Sphere,Flare Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Fire; },{},{}
+13204,Lightning_Sphere,Lightning Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Wind; },{},{}
+13205,Poison_Sphere,Poison Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,500; },{},{}
+13206,Blind_Sphere,Blind Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; },{},{}
+13207,Freezing_Sphere,Freezing Sphere,10,80,,5,50,,,,0x01000000,7,2,32768,,1,,5,{ bonus bAtkEle,Ele_Water; },{},{}
+// Shurikens & Kunais
+13250,Shuriken,Shuriken,10,4,,5,10,,,,0x02000000,7,2,32768,,1,,6,{},{},{}
+13251,Raincloud_Shuriken,Raincloud Shuriken,10,10,,5,30,,,,0x02000000,7,2,32768,,20,,6,{},{},{}
+13252,Flash_Shuriken,Flash Shuriken,10,20,,5,45,,,,0x02000000,7,2,32768,,40,,6,{},{},{}
+13253,Pointed_Leaf_Shuriken,Pointed Leaf Shuriken,10,40,,5,70,,,,0x02000000,7,2,32768,,60,,6,{},{},{}
+13254,Piercing_Thorn_Shuriken,Piercing Thorn Shuriken,10,100,,5,100,,,,0x02000000,7,2,32768,,80,,6,{},{},{}
+13255,Kunai_of_Frozen_Icicle,Kunai of Frozen Icicle,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Water; },{},{}
+13256,Kunai_of_Black_Earth,Kunai of Black Earth,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Earth; },{},{}
+13257,Kunai_of_Violent_Winds,Kunai of Violent Winds,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Wind; },{},{}
+13258,Kunai_of_Fierce_Heat,Kunai of Fierce Heat,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Fire; },{},{}
+13259,Kunai_of_Deadly_Poison,Kunai of Deadly Poison,10,10,,20,30,,,,0x02000000,7,2,32768,,1,,7,{ bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,500; },{},{}
+// Ninja Fuuma Shurikens
+13300,Huuma_Bird_Wing,Fuuma Shuriken Beneki,4,90000,,3000,150,,1,0,0x02000000,7,2,34,4,65,1,22,{ bonus bAtkEle,Ele_Wind; bonus bAgi,-1; bonus bDex,-2; },{},{}
+13301,Huuma_Giant_Wheel,Fuuma Shuriken Daisharin,4,40000,,2500,50,,1,3,0x02000000,7,2,34,4,42,1,22,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
+13302,Huuma_Giant_Wheel_,Fuuma Shuriken Daisharin,4,40000,,2500,50,,1,4,0x02000000,7,2,34,4,42,1,22,{ bonus2 bAddEff,Eff_Bleeding,100; },{},{}
+13303,Huuma_Blaze,Fuuma Shuriken Rekka,4,78000,,1500,185,,1,0,0x02000000,7,2,34,4,55,1,22,{ bonus bDex,-2; bonus bAtkEle,Ele_Fire; bonus4 bAutoSpell,17,5,30,1; },{},{}
+13400,Cutlus_,Cutlus,4,,10,900,150,,1,1,0x000654E2,7,2,2,4,40,1,2,{ skill 5,5; bonus bStr,2; bonus bDef,1; },{},{}
diff --git a/db/item_db2.txt b/db/item_db2.txt
index 721832c8a..4656b22fd 100644
--- a/db/item_db2.txt
+++ b/db/item_db2.txt
@@ -1,11 +1,11 @@
-// Items Additional Database - Custom Items go here
-//
-// Structure of Database:
-// ID,Name,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Upper,Gender,Loc,wLV,eLV,Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
-//
-// THQ Quest Items
-//=============================================================
-//7950,THG_Membership,THG Membership,3,,10,10,,,,,,,,,,,,,{},{},{}
-//7951,Token_Bag,Token Bag,3,,10,10,,,,,,,,,,,,,{},{},{}
-//1998,Jeramiah's_Jur,Jeramiah's Jur,3,,10,10,,,,,,,,,,,,,{},{},{}
-//1999,Zed's_Staff,Zed's Staff,3,,10,10,,,,,,,,,,,,,{},{},{}
+// Items Additional Database - Custom Items go here
+//
+// Structure of Database:
+// ID,Name,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Upper,Gender,Loc,wLV,eLV,Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
+//
+// THQ Quest Items
+//=============================================================
+//7950,THG_Membership,THG Membership,3,,10,10,,,,,,,,,,,,,{},{},{}
+//7951,Token_Bag,Token Bag,3,,10,10,,,,,,,,,,,,,{},{},{}
+//1998,Jeramiah's_Jur,Jeramiah's Jur,3,,10,10,,,,,,,,,,,,,{},{},{}
+//1999,Zed's_Staff,Zed's Staff,3,,10,10,,,,,,,,,,,,,{},{},{}
diff --git a/db/item_findingore.txt b/db/item_findingore.txt
index 45f634e0d..5b62bf75c 100644
--- a/db/item_findingore.txt
+++ b/db/item_findingore.txt
@@ -1,25 +1,25 @@
-// Ore Discovery Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-6,714,3 //Emperium
-6,756,20 //Rough Oridecon
-6,757,20 //Rough Elunium
-6,969,2 //Gold
-6,984,10 //Oridecon
-6,985,10 //Elunium
-6,990,30 //Red Blood
-6,991,30 //Crystal Blue
-6,992,30 //Wind of Verdure
-6,993,30 //Green Live
-6,994,15 //Flame Heart
-6,995,15 //Mystic Frozen
-6,996,15 //Rough Wind
-6,997,15 //Great Nature
-6,998,80 //Iron
-6,999,50 //Steel
-6,1002,100 //Iron Ore
-6,1003,60 //Coal
-6,1010,95 //Phracon
-6,1011,55 //Emveretarcon
+// Ore Discovery Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+6,714,3 //Emperium
+6,756,20 //Rough Oridecon
+6,757,20 //Rough Elunium
+6,969,2 //Gold
+6,984,10 //Oridecon
+6,985,10 //Elunium
+6,990,30 //Red Blood
+6,991,30 //Crystal Blue
+6,992,30 //Wind of Verdure
+6,993,30 //Green Live
+6,994,15 //Flame Heart
+6,995,15 //Mystic Frozen
+6,996,15 //Rough Wind
+6,997,15 //Great Nature
+6,998,80 //Iron
+6,999,50 //Steel
+6,1002,100 //Iron Ore
+6,1003,60 //Coal
+6,1010,95 //Phracon
+6,1011,55 //Emveretarcon
diff --git a/db/item_giftbox.txt b/db/item_giftbox.txt
index b44b759fe..0ef16aa52 100644
--- a/db/item_giftbox.txt
+++ b/db/item_giftbox.txt
@@ -1,666 +1,666 @@
-// Gift Box Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-
-// GiftBox
-4,756,5 //Rough Oridecon
-4,757,2 //Rough Elunium
-4,984,2 //Oridecon
-4,985,1 //Elunium
-4,714,1 //Emperium
-4,999,1 //Steel
-4,1000,1 //Star Crumb
-4,994,1 //Flame Heart
-4,995,1 //Mystic Frozen
-4,996,1 //Rough Wind
-4,997,1 //Great Nature
-4,975,1 //Scarlet Dyestuff
-4,976,1 //Lemon Dyestuff
-4,978,1 //Cobaltblue Dyestuff
-4,979,1 //Darkgreen Dyestuff
-4,980,1 //Orange Dyestuff
-4,981,1 //Violet Dyestuff
-4,982,1 //White Dyestuff
-4,983,1 //Black Dyestuff
-4,969,1 //Gold
-4,718,1 //Garnet
-4,719,1 //Amethyst
-4,720,1 //Aquamarine
-4,721,1 //Emerald
-4,722,1 //Pearl
-4,723,1 //Ruby
-4,724,1 //Cursed Ruby
-4,725,1 //Sardonyx
-4,726,1 //Sapphire
-4,727,1 //Opal
-4,728,1 //Topaz
-4,729,1 //Zircon
-4,730,1 //1carat Diamond
-4,731,1 //2carat Diamond
-4,732,1 //3carat Diamond
-4,733,1 //Cracked Diamond
-4,734,1 //Red Frame
-4,735,1 //Chung Jah
-4,736,1 //China
-4,737,1 //Black Ladle
-4,738,1 //Pencil Case
-4,739,1 //Rouge
-4,740,1 //Puppet
-4,741,1 //Poring Doll
-4,742,1 //Chonchon Doll
-4,743,1 //Spore Doll
-4,744,1 //Bouquet
-4,745,1 //Wedding Bouquet
-4,746,1 //Glass Bead
-4,747,1 //Crystal Mirror
-4,748,1 //Witherless Rose
-4,749,1 //Frozen Rose
-4,750,1 //Baphomet Doll
-4,751,1 //Osiris Doll
-4,752,1 //Grasshopper Doll
-4,753,1 //Yoyo Doll
-4,754,1 //Raccoon Doll
-4,706,1 //Four Leaf Clover
-4,4005,1 //Santa Poring Card
-4,7034,1 //Red Stocking
-4,501,1 //Red Potion
-4,502,1 //Orange Potion
-4,503,1 //Yellow Potion
-4,504,1 //White Potion
-4,505,1 //Blue Potion
-4,506,1 //Green Potion
-4,526,1 //Royal Jelly
-4,529,1 //Candy
-4,530,1 //Candy Cane
-4,537,1 //Pet Food
-4,538,1 //Well-baked Cookie
-4,539,1 //Piece of Cake
-4,603,1 //Old Blue Box
-4,617,1 //Old Purple Box
-4,644,19 //Gift Box
-4,1558,1 //Girl's Diary
-// GiftBox_1
-28,756,5 //Rough Oridecon
-28,757,2 //Rough Elunium
-28,984,2 //Oridecon
-28,985,1 //Elunium
-28,714,1 //Emperium
-28,999,1 //Steel
-28,1000,1 //Star Crumb
-28,994,1 //Flame Heart
-28,995,1 //Mystic Frozen
-28,996,1 //Rough Wind
-28,997,1 //Great Nature
-28,975,1 //Scarlet Dyestuff
-28,976,1 //Lemon Dyestuff
-28,978,1 //Cobaltblue Dyestuff
-28,979,1 //Darkgreen Dyestuff
-28,980,1 //Orange Dyestuff
-28,981,1 //Violet Dyestuff
-28,982,1 //White Dyestuff
-28,983,1 //Black Dyestuff
-28,969,1 //Gold
-28,718,1 //Garnet
-28,719,1 //Amethyst
-28,720,1 //Aquamarine
-28,721,1 //Emerald
-28,722,1 //Pearl
-28,723,1 //Ruby
-28,724,1 //Cursed Ruby
-28,725,1 //Sardonyx
-28,726,1 //Sapphire
-28,727,1 //Opal
-28,728,1 //Topaz
-28,729,1 //Zircon
-28,730,1 //1carat Diamond
-28,731,1 //2carat Diamond
-28,732,1 //3carat Diamond
-28,733,1 //Cracked Diamond
-28,734,1 //Red Frame
-28,735,1 //Chung Jah
-28,736,1 //China
-28,737,1 //Black Ladle
-28,738,1 //Pencil Case
-28,739,1 //Rouge
-28,740,1 //Puppet
-28,741,1 //Poring Doll
-28,742,1 //Chonchon Doll
-28,743,1 //Spore Doll
-28,744,1 //Bouquet
-28,745,1 //Wedding Bouquet
-28,746,1 //Glass Bead
-28,747,1 //Crystal Mirror
-28,748,1 //Witherless Rose
-28,749,1 //Frozen Rose
-28,750,1 //Baphomet Doll
-28,751,1 //Osiris Doll
-28,752,1 //Grasshopper Doll
-28,753,1 //Yoyo Doll
-28,754,1 //Raccoon Doll
-28,706,1 //Four Leaf Clover
-28,4005,1 //Santa Poring Card
-28,7034,1 //Red Stocking
-28,501,1 //Red Potion
-28,502,1 //Orange Potion
-28,503,1 //Yellow Potion
-28,504,1 //White Potion
-28,505,1 //Blue Potion
-28,506,1 //Green Potion
-28,526,1 //Royal Jelly
-28,529,1 //Candy
-28,530,1 //Candy Cane
-28,537,1 //Pet Food
-28,538,1 //Well-baked Cookie
-28,539,1 //Piece of Cake
-28,603,1 //Old Blue Box
-28,617,1 //Old Purple Box
-28,644,19 //Gift Box
-28,1558,1 //Girl's Diary
-//GiftBox_2
-29,756,5 //Rough Oridecon
-29,757,2 //Rough Elunium
-29,984,2 //Oridecon
-29,985,1 //Elunium
-29,714,1 //Emperium
-29,999,1 //Steel
-29,1000,1 //Star Crumb
-29,994,1 //Flame Heart
-29,995,1 //Mystic Frozen
-29,996,1 //Rough Wind
-29,997,1 //Great Nature
-29,975,1 //Scarlet Dyestuff
-29,976,1 //Lemon Dyestuff
-29,978,1 //Cobaltblue Dyestuff
-29,979,1 //Darkgreen Dyestuff
-29,980,1 //Orange Dyestuff
-29,981,1 //Violet Dyestuff
-29,982,1 //White Dyestuff
-29,983,1 //Black Dyestuff
-29,969,1 //Gold
-29,718,1 //Garnet
-29,719,1 //Amethyst
-29,720,1 //Aquamarine
-29,721,1 //Emerald
-29,722,1 //Pearl
-29,723,1 //Ruby
-29,724,1 //Cursed Ruby
-29,725,1 //Sardonyx
-29,726,1 //Sapphire
-29,727,1 //Opal
-29,728,1 //Topaz
-29,729,1 //Zircon
-29,730,1 //1carat Diamond
-29,731,1 //2carat Diamond
-29,732,1 //3carat Diamond
-29,733,1 //Cracked Diamond
-29,734,1 //Red Frame
-29,735,1 //Chung Jah
-29,736,1 //China
-29,737,1 //Black Ladle
-29,738,1 //Pencil Case
-29,739,1 //Rouge
-29,740,1 //Puppet
-29,741,1 //Poring Doll
-29,742,1 //Chonchon Doll
-29,743,1 //Spore Doll
-29,744,1 //Bouquet
-29,745,1 //Wedding Bouquet
-29,746,1 //Glass Bead
-29,747,1 //Crystal Mirror
-29,748,1 //Witherless Rose
-29,749,1 //Frozen Rose
-29,750,1 //Baphomet Doll
-29,751,1 //Osiris Doll
-29,752,1 //Grasshopper Doll
-29,753,1 //Yoyo Doll
-29,754,1 //Raccoon Doll
-29,706,1 //Four Leaf Clover
-29,4005,1 //Santa Poring Card
-29,7034,1 //Red Stocking
-29,501,1 //Red Potion
-29,502,1 //Orange Potion
-29,503,1 //Yellow Potion
-29,504,1 //White Potion
-29,505,1 //Blue Potion
-29,506,1 //Green Potion
-29,526,1 //Royal Jelly
-29,529,1 //Candy
-29,530,1 //Candy Cane
-29,537,1 //Pet Food
-29,538,1 //Well-baked Cookie
-29,539,1 //Piece of Cake
-29,603,1 //Old Blue Box
-29,617,1 //Old Purple Box
-29,644,19 //Gift Box
-29,1558,1 //Girl's Diary
-// Gift_Box3
-30,756,5 //Rough Oridecon
-30,757,2 //Rough Elunium
-30,984,2 //Oridecon
-30,985,1 //Elunium
-30,714,1 //Emperium
-30,999,1 //Steel
-30,1000,1 //Star Crumb
-30,994,1 //Flame Heart
-30,995,1 //Mystic Frozen
-30,996,1 //Rough Wind
-30,997,1 //Great Nature
-30,975,1 //Scarlet Dyestuff
-30,976,1 //Lemon Dyestuff
-30,978,1 //Cobaltblue Dyestuff
-30,979,1 //Darkgreen Dyestuff
-30,980,1 //Orange Dyestuff
-30,981,1 //Violet Dyestuff
-30,982,1 //White Dyestuff
-30,983,1 //Black Dyestuff
-30,969,1 //Gold
-30,718,1 //Garnet
-30,719,1 //Amethyst
-30,720,1 //Aquamarine
-30,721,1 //Emerald
-30,722,1 //Pearl
-30,723,1 //Ruby
-30,724,1 //Cursed Ruby
-30,725,1 //Sardonyx
-30,726,1 //Sapphire
-30,727,1 //Opal
-30,728,1 //Topaz
-30,729,1 //Zircon
-30,730,1 //1carat Diamond
-30,731,1 //2carat Diamond
-30,732,1 //3carat Diamond
-30,733,1 //Cracked Diamond
-30,734,1 //Red Frame
-30,735,1 //Chung Jah
-30,736,1 //China
-30,737,1 //Black Ladle
-30,738,1 //Pencil Case
-30,739,1 //Rouge
-30,740,1 //Puppet
-30,741,1 //Poring Doll
-30,742,1 //Chonchon Doll
-30,743,1 //Spore Doll
-30,744,1 //Bouquet
-30,745,1 //Wedding Bouquet
-30,746,1 //Glass Bead
-30,747,1 //Crystal Mirror
-30,748,1 //Witherless Rose
-30,749,1 //Frozen Rose
-30,750,1 //Baphomet Doll
-30,751,1 //Osiris Doll
-30,752,1 //Grasshopper Doll
-30,753,1 //Yoyo Doll
-30,754,1 //Raccoon Doll
-30,706,1 //Four Leaf Clover
-30,4005,1 //Santa Poring Card
-30,7034,1 //Red Stocking
-30,501,1 //Red Potion
-30,502,1 //Orange Potion
-30,503,1 //Yellow Potion
-30,504,1 //White Potion
-30,505,1 //Blue Potion
-30,506,1 //Green Potion
-30,526,1 //Royal Jelly
-30,529,1 //Candy
-30,530,1 //Candy Cane
-30,537,1 //Pet Food
-30,538,1 //Well-baked Cookie
-30,539,1 //Piece of Cake
-30,603,1 //Old Blue Box
-30,617,1 //Old Purple Box
-30,644,19 //Gift Box
-30,1558,1 //Girl's Diary
-// GiftBox_4
-31,756,5 //Rough Oridecon
-31,757,2 //Rough Elunium
-31,984,2 //Oridecon
-31,985,1 //Elunium
-31,714,1 //Emperium
-31,999,1 //Steel
-31,1000,1 //Star Crumb
-31,994,1 //Flame Heart
-31,995,1 //Mystic Frozen
-31,996,1 //Rough Wind
-31,997,1 //Great Nature
-31,975,1 //Scarlet Dyestuff
-31,976,1 //Lemon Dyestuff
-31,978,1 //Cobaltblue Dyestuff
-31,979,1 //Darkgreen Dyestuff
-31,980,1 //Orange Dyestuff
-31,981,1 //Violet Dyestuff
-31,982,1 //White Dyestuff
-31,983,1 //Black Dyestuff
-31,969,1 //Gold
-31,718,1 //Garnet
-31,719,1 //Amethyst
-31,720,1 //Aquamarine
-31,721,1 //Emerald
-31,722,1 //Pearl
-31,723,1 //Ruby
-31,724,1 //Cursed Ruby
-31,725,1 //Sardonyx
-31,726,1 //Sapphire
-31,727,1 //Opal
-31,728,1 //Topaz
-31,729,1 //Zircon
-31,730,1 //1carat Diamond
-31,731,1 //2carat Diamond
-31,732,1 //3carat Diamond
-31,733,1 //Cracked Diamond
-31,734,1 //Red Frame
-31,735,1 //Chung Jah
-31,736,1 //China
-31,737,1 //Black Ladle
-31,738,1 //Pencil Case
-31,739,1 //Rouge
-31,740,1 //Puppet
-31,741,1 //Poring Doll
-31,742,1 //Chonchon Doll
-31,743,1 //Spore Doll
-31,744,1 //Bouquet
-31,745,1 //Wedding Bouquet
-31,746,1 //Glass Bead
-31,747,1 //Crystal Mirror
-31,748,1 //Witherless Rose
-31,749,1 //Frozen Rose
-31,750,1 //Baphomet Doll
-31,751,1 //Osiris Doll
-31,752,1 //Grasshopper Doll
-31,753,1 //Yoyo Doll
-31,754,1 //Raccoon Doll
-31,706,1 //Four Leaf Clover
-31,4005,1 //Santa Poring Card
-31,7034,1 //Red Stocking
-31,501,1 //Red Potion
-31,502,1 //Orange Potion
-31,503,1 //Yellow Potion
-31,504,1 //White Potion
-31,505,1 //Blue Potion
-31,506,1 //Green Potion
-31,526,1 //Royal Jelly
-31,529,1 //Candy
-31,530,1 //Candy Cane
-31,537,1 //Pet Food
-31,538,1 //Well-baked Cookie
-31,539,1 //Piece of Cake
-31,603,1 //Old Blue Box
-31,617,1 //Old Purple Box
-31,644,19 //Gift Box
-31,1558,1 //Girl's Diary
-// GiftBox_China
-34,501,1 //Red Potion
-34,502,1 //Orange Potion
-34,503,1 //Yellow Potion
-34,504,1 //White Potion
-34,505,1 //Blue Potion
-34,506,1 //Green Potion
-34,518,1 //Honey
-34,520,1 //Hinalle Leaflet
-34,521,1 //Aloe Leaflet
-34,521,1 //Aloe Leaflet
-34,525,1 //Panacea
-34,526,1 //Royal Jelly
-34,529,1 //Candy
-34,530,1 //Candy Cane
-34,603,40 //Old Blue Box
-34,604,9 //Dead Branch
-34,605,1 //Anodyne
-34,606,1 //Aloevera
-34,607,1 //Yggdrasil Berry
-34,608,1 //Yggdrasil Seed
-34,610,1 //Yggdrasil Leaf
-34,612,5 //Mini Furnace
-34,613,1 //Iron Hammer
-34,614,1 //Golden Hammer
-34,615,1 //Oridecon Hammer
-34,701,1 //Ora Ora
-34,702,1 //Animal Gore
-34,703,1 //Hinalle
-34,704,1 //Aloe
-34,706,1 //Four Leaf Clover
-34,707,1 //Singing Plant
-34,708,1 //Ment
-34,710,1 //Illusion Flower
-34,714,1 //Emperium
-34,715,1 //Yellow Gemstone
-34,716,1 //Red Gemstone
-34,717,1 //Blue Gemstone
-34,718,1 //Garnet
-34,719,1 //Amethyst
-34,720,1 //Aquamarine
-34,721,1 //Emerald
-34,722,1 //Pearl
-34,723,1 //Ruby
-34,724,1 //Cursed Ruby
-34,725,1 //Sardonyx
-34,726,1 //Sapphire
-34,727,1 //Opal
-34,728,1 //Topaz
-34,729,1 //Zircon
-34,730,1 //1carat Diamond
-34,731,1 //2carat Diamond
-34,732,1 //3carat Diamond
-34,733,1 //Cracked Diamond
-34,734,1 //Red Frame
-34,735,1 //Chung Jah
-34,736,1 //China
-34,737,1 //Black Ladle
-34,738,1 //Pencil Case
-34,740,1 //Puppet
-34,741,1 //Poring Doll
-34,742,1 //Chonchon Doll
-34,743,1 //Spore Doll
-34,745,1 //Wedding Bouquet
-34,747,1 //Crystal Mirror
-34,748,1 //Witherless Rose
-34,749,1 //Frozen Rose
-34,752,1 //Grasshopper Doll
-34,753,1 //Yoyo Doll
-34,754,1 //Raccoon Doll
-34,756,1 //Rough Oridecon
-34,757,1 //Rough Elunium
-34,909,1 //Jellopy
-34,910,1 //Garlet
-34,911,1 //Scell
-34,912,1 //Zargon
-34,931,1 //Orcish Voucher
-34,934,1 //Memento
-34,968,1 //Heroic Emblem
-34,969,1 //Gold
-34,970,1 //Alcohol
-34,971,1 //Detrimindexta
-34,972,1 //Karvodailnirol
-34,973,1 //Counteragent
-34,974,1 //Mixture
-34,975,1 //Scarlet Dyestuff
-34,976,1 //Lemon Dyestuff
-34,978,1 //Cobaltblue Dyestuff
-34,979,1 //Darkgreen Dyestuff
-34,980,1 //Orange Dyestuff
-34,981,1 //Violet Dyestuff
-34,982,1 //White Dyestuff
-34,983,1 //Black Dyestuff
-34,984,1 //Oridecon
-34,985,1 //Elunium
-34,986,1 //Anvil
-34,987,1 //Oridecon Anvil
-34,988,1 //Golden Anvil
-34,989,1 //Emperium Anvil
-34,990,1 //Red Blood
-34,991,1 //Crystal Blue
-34,992,1 //Wind of Verdure
-34,993,1 //Green Live
-34,994,1 //Flame Heart
-34,995,1 //Mystic Frozen
-34,996,1 //Rough Wind
-34,997,1 //Great Nature
-34,998,1 //Iron
-34,999,1 //Steel
-34,1000,1 //Star Crumb
-34,1001,1 //Star Dust
-34,1002,1 //Iron Ore
-34,1003,1 //Coal
-34,1004,1 //Chivalry Emblem
-34,1005,1 //Hammer of Blacksmith
-34,1006,1 //Old Magicbook
-34,1007,1 //Necklace of Wisdom
-34,1008,1 //Necklace of Oblivion
-34,1009,1 //Hand of God
-34,1010,1 //Phracon
-34,1011,1 //Emveretarcon
-34,1065,1 //Trap
-34,1102,1 //Sword
-34,1105,1 //Falchion
-34,1108,1 //Blade
-34,1111,1 //Rapier
-34,1114,1 //Scimitar
-34,1117,1 //Katana
-34,1120,1 //Tsurugi
-34,1125,1 //Ring Pommel Saber
-34,1127,1 //Saber
-34,1128,1 //Haedonggum
-34,1129,1 //Flamberge
-34,1152,1 //Slayer
-34,1155,1 //Bastard Sword
-34,1158,1 //Two-Handed Sword
-34,1162,1 //Broad Sword
-34,1163,1 //Claymore
-34,1202,1 //Knife
-34,1205,1 //Cutter
-34,1208,1 //Main Gauche
-34,1211,1 //Dirk
-34,1214,1 //Dagger
-34,1217,1 //Stiletto
-34,1220,1 //Gladius
-34,1226,1 //Damascus
-34,1251,1 //Jur
-34,1253,1 //Katar
-34,1255,1 //Jamadhar
-34,1302,1 //Axe
-34,1352,1 //Battle Axe
-34,1355,1 //Hammer
-34,1358,1 //Buster
-34,1361,1 //Two-Handed Axe
-34,1402,1 //Javelin
-34,1405,1 //Spear
-34,1408,1 //Pike
-34,1410,1 //Lance
-34,1452,1 //Guisarme
-34,1455,1 //Glaive
-34,1458,1 //Partizan
-34,1461,1 //Trident
-34,1464,1 //Halberd
-34,1502,1 //Club
-34,1505,1 //Mace
-34,1508,1 //Smasher
-34,1511,1 //Flail
-34,1514,1 //Morning Star
-34,1517,1 //Sword Mace
-34,1520,1 //Chain
-34,1550,1 //Book
-34,1551,1 //Bible
-34,1602,1 //Rod
-34,1605,1 //Wand
-34,1608,1 //Staff
-34,1611,1 //Arc Wand
-34,1613,1 //Mighty Staff
-34,1702,1 //Bow
-34,1705,1 //Composite Bow
-34,1711,1 //Crossbow
-34,1713,1 //Arbalest
-34,1714,1 //Gakkung Bow
-34,1718,1 //Hunter Bow
-34,1719,1 //Roguemaster's Bow
-34,2102,1 //Guard
-34,2104,1 //Buckler
-34,2106,1 //Shield
-34,2108,1 //Mirror Shield
-34,2207,1 //Fancy Flower
-34,2209,1 //Ribbon
-34,2213,1 //Kitty Band
-34,2215,1 //Flower Band
-34,2217,1 //Biretta
-34,2221,1 //Hat
-34,2223,1 //Turban
-34,2225,1 //Goggles
-34,2227,1 //Cap
-34,2229,1 //Helm
-34,2231,1 //Gemmed Sallet
-34,2233,1 //Circlet
-34,2236,1 //Santa Hat
-34,2244,1 //Big Ribbon
-34,2249,1 //Coronet
-34,2250,1 //Cute Ribbon
-34,2257,1 //Unicorn Horn
-34,2258,1 //Spiky Band
-34,2262,1 //Clown Nose
-34,2263,1 //Zorro Masque
-34,2265,1 //Gangster Mask
-34,2269,1 //Romantic Flower
-34,2270,1 //Romantic Leaf
-34,2271,1 //Jack be Dandy
-34,2272,1 //Stop Post
-34,2273,1 //Doctor Band
-34,2275,1 //Red Bandana
-34,2276,1 //Angled Glasses
-34,2279,1 //Bomb Wick
-34,2284,1 //Antlers
-34,2287,1 //Pirate Bandana
-34,2289,1 //Poo Poo Hat
-34,2290,1 //Funeral Hat
-34,2291,1 //Masquerade
-34,2293,1 //Pretend Murdered
-34,2294,1 //Stellar
-34,2295,1 //Blinker
-34,2296,1 //Binoculars
-34,2298,1 //Green Feeler
-34,2299,1 //Orc Helm
-34,2302,1 //Cotton Shirt
-34,2304,1 //Jacket
-34,2306,1 //Adventurer's Suit
-34,2308,1 //Mantle
-34,2310,1 //Coat
-34,2311,1 //Mink Coat
-34,2313,1 //Padded Armor
-34,2315,1 //Chain Mail
-34,2317,1 //Full Plate
-34,2322,1 //Silk Robe
-34,2324,1 //Scapulare
-34,2326,1 //Saint's Robe
-34,2329,1 //Wooden Mail
-34,2331,1 //Tights
-34,2333,1 //Silver Robe
-34,2336,1 //Thief Clothes
-34,2337,1 //Ninja Suit
-34,2338,1 //Wedding Dress
-34,2339,1 //Pantie
-34,2402,1 //Sandals
-34,2404,1 //Shoes
-34,2407,1 //Crystal Pumps
-34,2408,1 //Shackles
-34,2409,1 //High Heels
-34,2502,1 //Hood
-34,2504,1 //Muffler
-34,2506,1 //Manteau
-34,2507,1 //Ancient Cape
-34,2508,1 //Ragamuffin Manteau
-34,2601,1 //Ring
-34,2602,1 //Earring
-34,2603,1 //Necklace
-34,2604,1 //Glove
-34,2605,1 //Brooch
-34,2607,1 //Clip
-34,2608,1 //Rosary
-34,2609,1 //Skull Ring
-34,2610,1 //Gold Ring
-34,2611,1 //Silver Ring
-34,2612,1 //Flower Ring
-34,2613,1 //Diamond Ring
-34,5008,1 //Puppy Love
-34,5009,1 //Safety Helmet
-34,5010,1 //Indian Fillet
-34,5014,1 //Fin Helm
-34,5015,1 //Egg Shell
-
+// Gift Box Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+
+// GiftBox
+4,756,5 //Rough Oridecon
+4,757,2 //Rough Elunium
+4,984,2 //Oridecon
+4,985,1 //Elunium
+4,714,1 //Emperium
+4,999,1 //Steel
+4,1000,1 //Star Crumb
+4,994,1 //Flame Heart
+4,995,1 //Mystic Frozen
+4,996,1 //Rough Wind
+4,997,1 //Great Nature
+4,975,1 //Scarlet Dyestuff
+4,976,1 //Lemon Dyestuff
+4,978,1 //Cobaltblue Dyestuff
+4,979,1 //Darkgreen Dyestuff
+4,980,1 //Orange Dyestuff
+4,981,1 //Violet Dyestuff
+4,982,1 //White Dyestuff
+4,983,1 //Black Dyestuff
+4,969,1 //Gold
+4,718,1 //Garnet
+4,719,1 //Amethyst
+4,720,1 //Aquamarine
+4,721,1 //Emerald
+4,722,1 //Pearl
+4,723,1 //Ruby
+4,724,1 //Cursed Ruby
+4,725,1 //Sardonyx
+4,726,1 //Sapphire
+4,727,1 //Opal
+4,728,1 //Topaz
+4,729,1 //Zircon
+4,730,1 //1carat Diamond
+4,731,1 //2carat Diamond
+4,732,1 //3carat Diamond
+4,733,1 //Cracked Diamond
+4,734,1 //Red Frame
+4,735,1 //Chung Jah
+4,736,1 //China
+4,737,1 //Black Ladle
+4,738,1 //Pencil Case
+4,739,1 //Rouge
+4,740,1 //Puppet
+4,741,1 //Poring Doll
+4,742,1 //Chonchon Doll
+4,743,1 //Spore Doll
+4,744,1 //Bouquet
+4,745,1 //Wedding Bouquet
+4,746,1 //Glass Bead
+4,747,1 //Crystal Mirror
+4,748,1 //Witherless Rose
+4,749,1 //Frozen Rose
+4,750,1 //Baphomet Doll
+4,751,1 //Osiris Doll
+4,752,1 //Grasshopper Doll
+4,753,1 //Yoyo Doll
+4,754,1 //Raccoon Doll
+4,706,1 //Four Leaf Clover
+4,4005,1 //Santa Poring Card
+4,7034,1 //Red Stocking
+4,501,1 //Red Potion
+4,502,1 //Orange Potion
+4,503,1 //Yellow Potion
+4,504,1 //White Potion
+4,505,1 //Blue Potion
+4,506,1 //Green Potion
+4,526,1 //Royal Jelly
+4,529,1 //Candy
+4,530,1 //Candy Cane
+4,537,1 //Pet Food
+4,538,1 //Well-baked Cookie
+4,539,1 //Piece of Cake
+4,603,1 //Old Blue Box
+4,617,1 //Old Purple Box
+4,644,19 //Gift Box
+4,1558,1 //Girl's Diary
+// GiftBox_1
+28,756,5 //Rough Oridecon
+28,757,2 //Rough Elunium
+28,984,2 //Oridecon
+28,985,1 //Elunium
+28,714,1 //Emperium
+28,999,1 //Steel
+28,1000,1 //Star Crumb
+28,994,1 //Flame Heart
+28,995,1 //Mystic Frozen
+28,996,1 //Rough Wind
+28,997,1 //Great Nature
+28,975,1 //Scarlet Dyestuff
+28,976,1 //Lemon Dyestuff
+28,978,1 //Cobaltblue Dyestuff
+28,979,1 //Darkgreen Dyestuff
+28,980,1 //Orange Dyestuff
+28,981,1 //Violet Dyestuff
+28,982,1 //White Dyestuff
+28,983,1 //Black Dyestuff
+28,969,1 //Gold
+28,718,1 //Garnet
+28,719,1 //Amethyst
+28,720,1 //Aquamarine
+28,721,1 //Emerald
+28,722,1 //Pearl
+28,723,1 //Ruby
+28,724,1 //Cursed Ruby
+28,725,1 //Sardonyx
+28,726,1 //Sapphire
+28,727,1 //Opal
+28,728,1 //Topaz
+28,729,1 //Zircon
+28,730,1 //1carat Diamond
+28,731,1 //2carat Diamond
+28,732,1 //3carat Diamond
+28,733,1 //Cracked Diamond
+28,734,1 //Red Frame
+28,735,1 //Chung Jah
+28,736,1 //China
+28,737,1 //Black Ladle
+28,738,1 //Pencil Case
+28,739,1 //Rouge
+28,740,1 //Puppet
+28,741,1 //Poring Doll
+28,742,1 //Chonchon Doll
+28,743,1 //Spore Doll
+28,744,1 //Bouquet
+28,745,1 //Wedding Bouquet
+28,746,1 //Glass Bead
+28,747,1 //Crystal Mirror
+28,748,1 //Witherless Rose
+28,749,1 //Frozen Rose
+28,750,1 //Baphomet Doll
+28,751,1 //Osiris Doll
+28,752,1 //Grasshopper Doll
+28,753,1 //Yoyo Doll
+28,754,1 //Raccoon Doll
+28,706,1 //Four Leaf Clover
+28,4005,1 //Santa Poring Card
+28,7034,1 //Red Stocking
+28,501,1 //Red Potion
+28,502,1 //Orange Potion
+28,503,1 //Yellow Potion
+28,504,1 //White Potion
+28,505,1 //Blue Potion
+28,506,1 //Green Potion
+28,526,1 //Royal Jelly
+28,529,1 //Candy
+28,530,1 //Candy Cane
+28,537,1 //Pet Food
+28,538,1 //Well-baked Cookie
+28,539,1 //Piece of Cake
+28,603,1 //Old Blue Box
+28,617,1 //Old Purple Box
+28,644,19 //Gift Box
+28,1558,1 //Girl's Diary
+//GiftBox_2
+29,756,5 //Rough Oridecon
+29,757,2 //Rough Elunium
+29,984,2 //Oridecon
+29,985,1 //Elunium
+29,714,1 //Emperium
+29,999,1 //Steel
+29,1000,1 //Star Crumb
+29,994,1 //Flame Heart
+29,995,1 //Mystic Frozen
+29,996,1 //Rough Wind
+29,997,1 //Great Nature
+29,975,1 //Scarlet Dyestuff
+29,976,1 //Lemon Dyestuff
+29,978,1 //Cobaltblue Dyestuff
+29,979,1 //Darkgreen Dyestuff
+29,980,1 //Orange Dyestuff
+29,981,1 //Violet Dyestuff
+29,982,1 //White Dyestuff
+29,983,1 //Black Dyestuff
+29,969,1 //Gold
+29,718,1 //Garnet
+29,719,1 //Amethyst
+29,720,1 //Aquamarine
+29,721,1 //Emerald
+29,722,1 //Pearl
+29,723,1 //Ruby
+29,724,1 //Cursed Ruby
+29,725,1 //Sardonyx
+29,726,1 //Sapphire
+29,727,1 //Opal
+29,728,1 //Topaz
+29,729,1 //Zircon
+29,730,1 //1carat Diamond
+29,731,1 //2carat Diamond
+29,732,1 //3carat Diamond
+29,733,1 //Cracked Diamond
+29,734,1 //Red Frame
+29,735,1 //Chung Jah
+29,736,1 //China
+29,737,1 //Black Ladle
+29,738,1 //Pencil Case
+29,739,1 //Rouge
+29,740,1 //Puppet
+29,741,1 //Poring Doll
+29,742,1 //Chonchon Doll
+29,743,1 //Spore Doll
+29,744,1 //Bouquet
+29,745,1 //Wedding Bouquet
+29,746,1 //Glass Bead
+29,747,1 //Crystal Mirror
+29,748,1 //Witherless Rose
+29,749,1 //Frozen Rose
+29,750,1 //Baphomet Doll
+29,751,1 //Osiris Doll
+29,752,1 //Grasshopper Doll
+29,753,1 //Yoyo Doll
+29,754,1 //Raccoon Doll
+29,706,1 //Four Leaf Clover
+29,4005,1 //Santa Poring Card
+29,7034,1 //Red Stocking
+29,501,1 //Red Potion
+29,502,1 //Orange Potion
+29,503,1 //Yellow Potion
+29,504,1 //White Potion
+29,505,1 //Blue Potion
+29,506,1 //Green Potion
+29,526,1 //Royal Jelly
+29,529,1 //Candy
+29,530,1 //Candy Cane
+29,537,1 //Pet Food
+29,538,1 //Well-baked Cookie
+29,539,1 //Piece of Cake
+29,603,1 //Old Blue Box
+29,617,1 //Old Purple Box
+29,644,19 //Gift Box
+29,1558,1 //Girl's Diary
+// Gift_Box3
+30,756,5 //Rough Oridecon
+30,757,2 //Rough Elunium
+30,984,2 //Oridecon
+30,985,1 //Elunium
+30,714,1 //Emperium
+30,999,1 //Steel
+30,1000,1 //Star Crumb
+30,994,1 //Flame Heart
+30,995,1 //Mystic Frozen
+30,996,1 //Rough Wind
+30,997,1 //Great Nature
+30,975,1 //Scarlet Dyestuff
+30,976,1 //Lemon Dyestuff
+30,978,1 //Cobaltblue Dyestuff
+30,979,1 //Darkgreen Dyestuff
+30,980,1 //Orange Dyestuff
+30,981,1 //Violet Dyestuff
+30,982,1 //White Dyestuff
+30,983,1 //Black Dyestuff
+30,969,1 //Gold
+30,718,1 //Garnet
+30,719,1 //Amethyst
+30,720,1 //Aquamarine
+30,721,1 //Emerald
+30,722,1 //Pearl
+30,723,1 //Ruby
+30,724,1 //Cursed Ruby
+30,725,1 //Sardonyx
+30,726,1 //Sapphire
+30,727,1 //Opal
+30,728,1 //Topaz
+30,729,1 //Zircon
+30,730,1 //1carat Diamond
+30,731,1 //2carat Diamond
+30,732,1 //3carat Diamond
+30,733,1 //Cracked Diamond
+30,734,1 //Red Frame
+30,735,1 //Chung Jah
+30,736,1 //China
+30,737,1 //Black Ladle
+30,738,1 //Pencil Case
+30,739,1 //Rouge
+30,740,1 //Puppet
+30,741,1 //Poring Doll
+30,742,1 //Chonchon Doll
+30,743,1 //Spore Doll
+30,744,1 //Bouquet
+30,745,1 //Wedding Bouquet
+30,746,1 //Glass Bead
+30,747,1 //Crystal Mirror
+30,748,1 //Witherless Rose
+30,749,1 //Frozen Rose
+30,750,1 //Baphomet Doll
+30,751,1 //Osiris Doll
+30,752,1 //Grasshopper Doll
+30,753,1 //Yoyo Doll
+30,754,1 //Raccoon Doll
+30,706,1 //Four Leaf Clover
+30,4005,1 //Santa Poring Card
+30,7034,1 //Red Stocking
+30,501,1 //Red Potion
+30,502,1 //Orange Potion
+30,503,1 //Yellow Potion
+30,504,1 //White Potion
+30,505,1 //Blue Potion
+30,506,1 //Green Potion
+30,526,1 //Royal Jelly
+30,529,1 //Candy
+30,530,1 //Candy Cane
+30,537,1 //Pet Food
+30,538,1 //Well-baked Cookie
+30,539,1 //Piece of Cake
+30,603,1 //Old Blue Box
+30,617,1 //Old Purple Box
+30,644,19 //Gift Box
+30,1558,1 //Girl's Diary
+// GiftBox_4
+31,756,5 //Rough Oridecon
+31,757,2 //Rough Elunium
+31,984,2 //Oridecon
+31,985,1 //Elunium
+31,714,1 //Emperium
+31,999,1 //Steel
+31,1000,1 //Star Crumb
+31,994,1 //Flame Heart
+31,995,1 //Mystic Frozen
+31,996,1 //Rough Wind
+31,997,1 //Great Nature
+31,975,1 //Scarlet Dyestuff
+31,976,1 //Lemon Dyestuff
+31,978,1 //Cobaltblue Dyestuff
+31,979,1 //Darkgreen Dyestuff
+31,980,1 //Orange Dyestuff
+31,981,1 //Violet Dyestuff
+31,982,1 //White Dyestuff
+31,983,1 //Black Dyestuff
+31,969,1 //Gold
+31,718,1 //Garnet
+31,719,1 //Amethyst
+31,720,1 //Aquamarine
+31,721,1 //Emerald
+31,722,1 //Pearl
+31,723,1 //Ruby
+31,724,1 //Cursed Ruby
+31,725,1 //Sardonyx
+31,726,1 //Sapphire
+31,727,1 //Opal
+31,728,1 //Topaz
+31,729,1 //Zircon
+31,730,1 //1carat Diamond
+31,731,1 //2carat Diamond
+31,732,1 //3carat Diamond
+31,733,1 //Cracked Diamond
+31,734,1 //Red Frame
+31,735,1 //Chung Jah
+31,736,1 //China
+31,737,1 //Black Ladle
+31,738,1 //Pencil Case
+31,739,1 //Rouge
+31,740,1 //Puppet
+31,741,1 //Poring Doll
+31,742,1 //Chonchon Doll
+31,743,1 //Spore Doll
+31,744,1 //Bouquet
+31,745,1 //Wedding Bouquet
+31,746,1 //Glass Bead
+31,747,1 //Crystal Mirror
+31,748,1 //Witherless Rose
+31,749,1 //Frozen Rose
+31,750,1 //Baphomet Doll
+31,751,1 //Osiris Doll
+31,752,1 //Grasshopper Doll
+31,753,1 //Yoyo Doll
+31,754,1 //Raccoon Doll
+31,706,1 //Four Leaf Clover
+31,4005,1 //Santa Poring Card
+31,7034,1 //Red Stocking
+31,501,1 //Red Potion
+31,502,1 //Orange Potion
+31,503,1 //Yellow Potion
+31,504,1 //White Potion
+31,505,1 //Blue Potion
+31,506,1 //Green Potion
+31,526,1 //Royal Jelly
+31,529,1 //Candy
+31,530,1 //Candy Cane
+31,537,1 //Pet Food
+31,538,1 //Well-baked Cookie
+31,539,1 //Piece of Cake
+31,603,1 //Old Blue Box
+31,617,1 //Old Purple Box
+31,644,19 //Gift Box
+31,1558,1 //Girl's Diary
+// GiftBox_China
+34,501,1 //Red Potion
+34,502,1 //Orange Potion
+34,503,1 //Yellow Potion
+34,504,1 //White Potion
+34,505,1 //Blue Potion
+34,506,1 //Green Potion
+34,518,1 //Honey
+34,520,1 //Hinalle Leaflet
+34,521,1 //Aloe Leaflet
+34,521,1 //Aloe Leaflet
+34,525,1 //Panacea
+34,526,1 //Royal Jelly
+34,529,1 //Candy
+34,530,1 //Candy Cane
+34,603,40 //Old Blue Box
+34,604,9 //Dead Branch
+34,605,1 //Anodyne
+34,606,1 //Aloevera
+34,607,1 //Yggdrasil Berry
+34,608,1 //Yggdrasil Seed
+34,610,1 //Yggdrasil Leaf
+34,612,5 //Mini Furnace
+34,613,1 //Iron Hammer
+34,614,1 //Golden Hammer
+34,615,1 //Oridecon Hammer
+34,701,1 //Ora Ora
+34,702,1 //Animal Gore
+34,703,1 //Hinalle
+34,704,1 //Aloe
+34,706,1 //Four Leaf Clover
+34,707,1 //Singing Plant
+34,708,1 //Ment
+34,710,1 //Illusion Flower
+34,714,1 //Emperium
+34,715,1 //Yellow Gemstone
+34,716,1 //Red Gemstone
+34,717,1 //Blue Gemstone
+34,718,1 //Garnet
+34,719,1 //Amethyst
+34,720,1 //Aquamarine
+34,721,1 //Emerald
+34,722,1 //Pearl
+34,723,1 //Ruby
+34,724,1 //Cursed Ruby
+34,725,1 //Sardonyx
+34,726,1 //Sapphire
+34,727,1 //Opal
+34,728,1 //Topaz
+34,729,1 //Zircon
+34,730,1 //1carat Diamond
+34,731,1 //2carat Diamond
+34,732,1 //3carat Diamond
+34,733,1 //Cracked Diamond
+34,734,1 //Red Frame
+34,735,1 //Chung Jah
+34,736,1 //China
+34,737,1 //Black Ladle
+34,738,1 //Pencil Case
+34,740,1 //Puppet
+34,741,1 //Poring Doll
+34,742,1 //Chonchon Doll
+34,743,1 //Spore Doll
+34,745,1 //Wedding Bouquet
+34,747,1 //Crystal Mirror
+34,748,1 //Witherless Rose
+34,749,1 //Frozen Rose
+34,752,1 //Grasshopper Doll
+34,753,1 //Yoyo Doll
+34,754,1 //Raccoon Doll
+34,756,1 //Rough Oridecon
+34,757,1 //Rough Elunium
+34,909,1 //Jellopy
+34,910,1 //Garlet
+34,911,1 //Scell
+34,912,1 //Zargon
+34,931,1 //Orcish Voucher
+34,934,1 //Memento
+34,968,1 //Heroic Emblem
+34,969,1 //Gold
+34,970,1 //Alcohol
+34,971,1 //Detrimindexta
+34,972,1 //Karvodailnirol
+34,973,1 //Counteragent
+34,974,1 //Mixture
+34,975,1 //Scarlet Dyestuff
+34,976,1 //Lemon Dyestuff
+34,978,1 //Cobaltblue Dyestuff
+34,979,1 //Darkgreen Dyestuff
+34,980,1 //Orange Dyestuff
+34,981,1 //Violet Dyestuff
+34,982,1 //White Dyestuff
+34,983,1 //Black Dyestuff
+34,984,1 //Oridecon
+34,985,1 //Elunium
+34,986,1 //Anvil
+34,987,1 //Oridecon Anvil
+34,988,1 //Golden Anvil
+34,989,1 //Emperium Anvil
+34,990,1 //Red Blood
+34,991,1 //Crystal Blue
+34,992,1 //Wind of Verdure
+34,993,1 //Green Live
+34,994,1 //Flame Heart
+34,995,1 //Mystic Frozen
+34,996,1 //Rough Wind
+34,997,1 //Great Nature
+34,998,1 //Iron
+34,999,1 //Steel
+34,1000,1 //Star Crumb
+34,1001,1 //Star Dust
+34,1002,1 //Iron Ore
+34,1003,1 //Coal
+34,1004,1 //Chivalry Emblem
+34,1005,1 //Hammer of Blacksmith
+34,1006,1 //Old Magicbook
+34,1007,1 //Necklace of Wisdom
+34,1008,1 //Necklace of Oblivion
+34,1009,1 //Hand of God
+34,1010,1 //Phracon
+34,1011,1 //Emveretarcon
+34,1065,1 //Trap
+34,1102,1 //Sword
+34,1105,1 //Falchion
+34,1108,1 //Blade
+34,1111,1 //Rapier
+34,1114,1 //Scimitar
+34,1117,1 //Katana
+34,1120,1 //Tsurugi
+34,1125,1 //Ring Pommel Saber
+34,1127,1 //Saber
+34,1128,1 //Haedonggum
+34,1129,1 //Flamberge
+34,1152,1 //Slayer
+34,1155,1 //Bastard Sword
+34,1158,1 //Two-Handed Sword
+34,1162,1 //Broad Sword
+34,1163,1 //Claymore
+34,1202,1 //Knife
+34,1205,1 //Cutter
+34,1208,1 //Main Gauche
+34,1211,1 //Dirk
+34,1214,1 //Dagger
+34,1217,1 //Stiletto
+34,1220,1 //Gladius
+34,1226,1 //Damascus
+34,1251,1 //Jur
+34,1253,1 //Katar
+34,1255,1 //Jamadhar
+34,1302,1 //Axe
+34,1352,1 //Battle Axe
+34,1355,1 //Hammer
+34,1358,1 //Buster
+34,1361,1 //Two-Handed Axe
+34,1402,1 //Javelin
+34,1405,1 //Spear
+34,1408,1 //Pike
+34,1410,1 //Lance
+34,1452,1 //Guisarme
+34,1455,1 //Glaive
+34,1458,1 //Partizan
+34,1461,1 //Trident
+34,1464,1 //Halberd
+34,1502,1 //Club
+34,1505,1 //Mace
+34,1508,1 //Smasher
+34,1511,1 //Flail
+34,1514,1 //Morning Star
+34,1517,1 //Sword Mace
+34,1520,1 //Chain
+34,1550,1 //Book
+34,1551,1 //Bible
+34,1602,1 //Rod
+34,1605,1 //Wand
+34,1608,1 //Staff
+34,1611,1 //Arc Wand
+34,1613,1 //Mighty Staff
+34,1702,1 //Bow
+34,1705,1 //Composite Bow
+34,1711,1 //Crossbow
+34,1713,1 //Arbalest
+34,1714,1 //Gakkung Bow
+34,1718,1 //Hunter Bow
+34,1719,1 //Roguemaster's Bow
+34,2102,1 //Guard
+34,2104,1 //Buckler
+34,2106,1 //Shield
+34,2108,1 //Mirror Shield
+34,2207,1 //Fancy Flower
+34,2209,1 //Ribbon
+34,2213,1 //Kitty Band
+34,2215,1 //Flower Band
+34,2217,1 //Biretta
+34,2221,1 //Hat
+34,2223,1 //Turban
+34,2225,1 //Goggles
+34,2227,1 //Cap
+34,2229,1 //Helm
+34,2231,1 //Gemmed Sallet
+34,2233,1 //Circlet
+34,2236,1 //Santa Hat
+34,2244,1 //Big Ribbon
+34,2249,1 //Coronet
+34,2250,1 //Cute Ribbon
+34,2257,1 //Unicorn Horn
+34,2258,1 //Spiky Band
+34,2262,1 //Clown Nose
+34,2263,1 //Zorro Masque
+34,2265,1 //Gangster Mask
+34,2269,1 //Romantic Flower
+34,2270,1 //Romantic Leaf
+34,2271,1 //Jack be Dandy
+34,2272,1 //Stop Post
+34,2273,1 //Doctor Band
+34,2275,1 //Red Bandana
+34,2276,1 //Angled Glasses
+34,2279,1 //Bomb Wick
+34,2284,1 //Antlers
+34,2287,1 //Pirate Bandana
+34,2289,1 //Poo Poo Hat
+34,2290,1 //Funeral Hat
+34,2291,1 //Masquerade
+34,2293,1 //Pretend Murdered
+34,2294,1 //Stellar
+34,2295,1 //Blinker
+34,2296,1 //Binoculars
+34,2298,1 //Green Feeler
+34,2299,1 //Orc Helm
+34,2302,1 //Cotton Shirt
+34,2304,1 //Jacket
+34,2306,1 //Adventurer's Suit
+34,2308,1 //Mantle
+34,2310,1 //Coat
+34,2311,1 //Mink Coat
+34,2313,1 //Padded Armor
+34,2315,1 //Chain Mail
+34,2317,1 //Full Plate
+34,2322,1 //Silk Robe
+34,2324,1 //Scapulare
+34,2326,1 //Saint's Robe
+34,2329,1 //Wooden Mail
+34,2331,1 //Tights
+34,2333,1 //Silver Robe
+34,2336,1 //Thief Clothes
+34,2337,1 //Ninja Suit
+34,2338,1 //Wedding Dress
+34,2339,1 //Pantie
+34,2402,1 //Sandals
+34,2404,1 //Shoes
+34,2407,1 //Crystal Pumps
+34,2408,1 //Shackles
+34,2409,1 //High Heels
+34,2502,1 //Hood
+34,2504,1 //Muffler
+34,2506,1 //Manteau
+34,2507,1 //Ancient Cape
+34,2508,1 //Ragamuffin Manteau
+34,2601,1 //Ring
+34,2602,1 //Earring
+34,2603,1 //Necklace
+34,2604,1 //Glove
+34,2605,1 //Brooch
+34,2607,1 //Clip
+34,2608,1 //Rosary
+34,2609,1 //Skull Ring
+34,2610,1 //Gold Ring
+34,2611,1 //Silver Ring
+34,2612,1 //Flower Ring
+34,2613,1 //Diamond Ring
+34,5008,1 //Puppy Love
+34,5009,1 //Safety Helmet
+34,5010,1 //Indian Fillet
+34,5014,1 //Fin Helm
+34,5015,1 //Egg Shell
+
diff --git a/db/item_group_db.txt b/db/item_group_db.txt
index fcf94aa74..723c18a75 100644
--- a/db/item_group_db.txt
+++ b/db/item_group_db.txt
@@ -1,8 +1,8 @@
-import: db/item_bluebox.txt
-import: db/item_violetbox.txt
-import: db/item_cardalbum.txt
-import: db/item_cookie_bag.txt
-import: db/item_findingore.txt
-import: db/item_giftbox.txt
-import: db/item_scroll.txt
-import: db/item_misc.txt
+import: db/item_bluebox.txt
+import: db/item_violetbox.txt
+import: db/item_cardalbum.txt
+import: db/item_cookie_bag.txt
+import: db/item_findingore.txt
+import: db/item_giftbox.txt
+import: db/item_scroll.txt
+import: db/item_misc.txt
diff --git a/db/item_misc.txt b/db/item_misc.txt
index a9b73fc9b..d62b1a549 100644
--- a/db/item_misc.txt
+++ b/db/item_misc.txt
@@ -1,622 +1,622 @@
-//GroupID,ItemID,Rate
-//
-// Potions
-8,678,1 //Poison Bottle
-8,501,1 //Red Potion
-8,502,1 //Orange Potion
-8,503,1 //Yellow Potion
-8,12017,1 //Slow Potion
-8,504,1 //White Potion
-8,505,1 //Blue Potion
-8,506,1 //Green Potion
-8,545,1 //Condensed Red Potion
-8,546,1 //Condensed Yellow Potion
-8,547,1 //Condensed White Potion
-8,12020,1 //Cursed_Water
-8,645,1 //Concentration Potion
-8,656,1 //Awakening Potion
-8,657,1 //Berserk Potion
-8,569,1 //Novice Potion
-8,605,1 //Anodyne
-8,12016,1 //Speed Potion
-8,501,1 //Red Potion
-8,502,1 //Orange Potion
-8,503,1 //Yellow Potion
-8,12017,1 //Slow Potion
-8,504,1 //White Potion
-8,505,1 //Blue Potion
-8,506,1 //Green Potion
-8,545,1 //Condensed Red Potion
-8,546,1 //Condensed Yellow Potion
-8,547,1 //Condensed White Potion
-8,12020,1 //Cursed_Water
-8,645,1 //Concentration Potion
-8,656,1 //Awakening Potion
-8,657,1 //Berserk Potion
-8,569,1 //Novice Potion
-8,605,1 //Anodyne
-8,12016,1 //Speed Potion
-8,501,1 //Red Potion
-8,502,1 //Orange Potion
-8,503,1 //Yellow Potion
-8,12017,1 //Slow Potion
-8,504,1 //White Potion
-8,505,1 //Blue Potion
-8,506,1 //Green Potion
-8,545,1 //Condensed Red Potion
-8,546,1 //Condensed Yellow Potion
-8,547,1 //Condensed White Potion
-8,12020,1 //Cursed_Water
-8,645,1 //Concentration Potion
-8,656,1 //Awakening Potion
-8,657,1 //Berserk Potion
-8,569,1 //Novice Potion
-8,605,1 //Anodyne
-8,12016,1 //Speed Potion
-8,501,1 //Red Potion
-8,502,1 //Orange Potion
-8,503,1 //Yellow Potion
-8,12017,1 //Slow Potion
-8,504,1 //White Potion
-8,505,1 //Blue Potion
-8,506,1 //Green Potion
-8,545,1 //Condensed Red Potion
-8,546,1 //Condensed Yellow Potion
-8,547,1 //Condensed White Potion
-8,12020,1 //Cursed_Water
-8,645,1 //Concentration Potion
-8,656,1 //Awakening Potion
-8,657,1 //Berserk Potion
-8,569,1 //Novice Potion
-8,605,1 //Anodyne
-8,12016,1 //Speed Potion
-8,501,1 //Red Potion
-8,502,1 //Orange Potion
-8,503,1 //Yellow Potion
-8,12017,1 //Slow Potion
-8,504,1 //White Potion
-8,505,1 //Blue Potion
-8,506,1 //Green Potion
-8,545,1 //Condensed Red Potion
-8,546,1 //Condensed Yellow Potion
-8,547,1 //Condensed White Potion
-8,12020,1 //Cursed_Water
-8,645,1 //Concentration Potion
-8,656,1 //Awakening Potion
-8,657,1 //Berserk Potion
-8,569,1 //Novice Potion
-8,605,1 //Anodyne
-8,12016,1 //Speed Potion
-// Herbs
-9,507,1
-9,508,1
-9,509,1
-9,510,1
-9,511,1
-// Fruits
-10,512,1
-10,513,1
-10,514,1
-10,515,1
-10,516,1
-// Meat
-11,517,1
-11,528,1
-// Candy
-12,529,1
-12,530,1
-// Juice (removed Grape juice 533)
-13,531,1
-13,532,1
-13,534,1
-// Fish
-14,544,1
-14,551,1
-// Boxes
-15,603,1
-15,617,1
-15,644,1
-// Gemstones
-16,715,1
-16,716,1
-16,717,1
-// Elemental Resist Potions
-17,12118,1
-17,12119,1
-17,12120,1
-17,12121,1
-// ores
-18,756,1
-18,757,1
-18,998,1
-18,999,1
-18,1002,1
-18,1003,1
-18,1010,1
-18,1011,1
-// food types
-19,512,1
-19,513,1
-19,514,1
-19,515,1
-19,516,1
-19,517,1
-19,528,1
-19,529,1
-19,530,1
-19,544,1
-19,551,1
-//recovery-types
-20,501,1
-20,502,1
-20,503,1
-20,504,1
-20,505,1
-20,506,1
-20,507,1
-20,508,1
-20,509,1
-20,510,1
-20,511,1
-20,531,1
-20,532,1
-20,533,1
-20,534,1
-// minerals
-21,714,1
-21,756,1
-21,757,1
-21,969,1
-21,984,1
-21,985,1
-21,990,1
-21,991,1
-21,992,1
-21,993,1
-21,994,1
-21,995,1
-21,996,1
-21,997,1
-21,998,1
-21,999,1
-21,1002,1
-21,1003,1
-21,1010,1
-21,1011,1
-// taming items
-22,619,1 //Unripe Apple
-22,620,1 //Orange Juice
-22,621,1 //Bitter Herb
-22,622,1 //Rainbow Carrot
-22,623,1 //Earthworm the Dude
-22,624,1 //Rotten Fish
-22,625,1 //Rusty Iron
-22,626,1 //Monster Juice
-22,627,1 //Sweet Milk
-22,628,1 //Well-Dried Bone
-22,629,1 //Singing Flower
-22,630,1 //Dew Laden Moss
-22,631,1 //Deadly Noxious Herb
-22,632,1 //Fatty Chubby Earthworm
-22,633,1 //Sweet Potato
-22,634,1 //Tropical Banana
-22,635,1 //Orc Trophy
-22,636,1 //No Recipient
-22,637,1 //Old Broom
-22,638,1 //Silver Knife of Chastity
-22,639,1 //Armlet of Obedience
-22,640,1 //Shining Stone
-22,641,1 //Contracts in Shadow
-22,642,1 //Book of the Devil
-22,659,1 //Her Heart
-22,660,1 //Forbidden Red Candle
-22,661,1 //Soft Apron
-22,10001,1 //Skull Helm
-22,10002,1 //Monster Oxygen Mask
-22,10003,1 //Transparent Headgear
-22,10004,1 //Pacifier
-22,10005,1 //Wig
-22,10006,1 //Queen's Hair Ornament
-22,10007,1 //Silk Ribbon
-22,10008,1 //Punisher
-22,10009,1 //Wild Flower
-22,10010,1 //Battered Pot
-22,10011,1 //Stellar Hairpin
-22,10012,1 //Tiny Egg Shell
-22,10013,1 //Backpack
-22,10014,1 //Rocker Glasses
-22,10015,1 //Green Lace
-22,10016,1 //Golden Bell
-22,10017,1 //Bark Shorts
-22,10018,1 //Monkey Circlet
-22,10019,1 //Red Scarf
-22,10020,1 //Grave Keeper's Sword
-//scrolls
-23,686,1 //Level 3 Earth Spike
-23,687,1 //Level 5 Earth Spike
-23,688,1 //Level 3 Cold Bolt
-23,689,1 //Level 5 Cold Bolt
-23,690,1 //Level 3 Fire Bolt
-23,691,1 //Level 5 Fire Bolt
-23,692,1 //Level 3 Lightening Bolt
-23,693,1 //Level 5 Lightening Bolt
-23,694,1 //Level 3 Soul Strike
-23,695,1 //Level 5 Soul Strike
-23,696,1 //Level 1 Fire Ball
-23,697,1 //Level 5 Fire Ball
-23,698,1 //Level 1 Fire Wall
-23,699,1 //Level 5 Fire Wall
-23,700,1 //Level 1 Frost Diver
-23,12000,1 //Level 5 Frost Diver
-23,12001,1 //Level 3 Heal
-23,12002,1 //Level 5 Heal
-//quivers
-24,12004,1 //Quiver
-24,12005,1 //Iron Arrow Quiver
-24,12006,1 //Steel Arrow Quiver
-24,12007,1 //Oridecon Arrow Quiver
-24,12008,1 //Fire Arrow Quiver
-24,12009,1 //Silver Arrow Quiver
-24,12010,1 //Wind Arrow Quiver
-24,12011,1 //Stone Arrow Quiver
-24,12012,1 //Crystal Arrow Quiver
-24,12013,1 //Shadow Arrow Quiver
-24,12014,1 //Immaterial Arrow Quiver
-24,12015,1 //Rusty Arrow Quiver
-24,12183,1 //Holy Arrow Quiver
-//masks
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,2278,1 //Mr. Smile
-25,2281,1 //Opera Masque
-25,2288,1 //Mr. Scream
-25,2292,1 //Welding Mask
-25,2297,1 //Goblin Mask
-25,5005,1 //Gas Mask
-25,5086,1 //Alarm Mask
-25,5087,1 //Poker Face
-25,5088,1 //Surprised Mask
-25,5089,1 //Annoyed Mask
-25,5090,1 //Goblin Leader Mask
-25,5121,1 //Zherlthsh Mask
-//accessory
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2604,1 //Glove
-26,2610,1 //Gold Ring
-26,2617,1 //Celebrant's Mitten
-26,2612,1 //Flower Ring
-26,2603,1 //Necklace
-26,2623,1 //Necklace
-26,2628,1 //Novice Armlet
-26,2613,1 //Diamond Ring
-26,2609,1 //Skull Ring
-26,2619,1 //Bow Thimble
-26,2608,1 //Rosary
-26,2601,1 //Ring
-26,2618,1 //Matyr's Leash
-26,2627,1 //Belt
-26,2605,1 //Brooch
-26,2658,1 //Nile Rose
-26,2611,1 //Silver Ring
-26,2607,1 //Clip
-26,2602,1 //Earring
-26,2615,1 //Safety Ring
-26,2616,1 //Critical Ring
-26,2624,1 //Glove
-26,2621,1 //Ring
-26,2626,1 //Rosary
-26,2625,1 //Brooch
-26,2622,1 //Earring
-// jewels
-27,718,1
-27,719,1
-27,720,1
-27,721,1
-27,722,1
-27,723,1
-27,724,1
-27,725,1
-27,726,1
-27,727,1
-27,728,1
-27,729,1
-27,730,1
-27,731,1
-27,732,1
-27,733,1
-// Egg Boy
-32,514,300 //Grape
-32,564,522 //Rice Ball
-32,660,20 //Forbidden Red Candle
-32,682,100 //Distilled Fighting Spirit
-32,683,50 //Herb of Incantation
-32,2235,2 //Crown
-32,2274,5 //Ghost Bandana
-32,5072,1 //Incubus Horn
-// Egg Girl
-33,514,300 //Grape
-33,564,522 //Rice Ball
-33,661,20 //Soft Apron
-33,682,100 //Distilled Fighting Spirit
-33,683,50 //Herb of Incantation
-33,2234,2 //Tiara
-33,5042,5 //Bao Bao
-33,5066,1 //Succubus Horn
-// Lotto Box
-35,7391,1
-35,7392,1
-35,7393,1
-35,7394,1
-35,7395,1
-35,7396,1
-35,7397,1
-35,7398,1
-35,7540,1
-35,7541,1
+//GroupID,ItemID,Rate
+//
+// Potions
+8,678,1 //Poison Bottle
+8,501,1 //Red Potion
+8,502,1 //Orange Potion
+8,503,1 //Yellow Potion
+8,12017,1 //Slow Potion
+8,504,1 //White Potion
+8,505,1 //Blue Potion
+8,506,1 //Green Potion
+8,545,1 //Condensed Red Potion
+8,546,1 //Condensed Yellow Potion
+8,547,1 //Condensed White Potion
+8,12020,1 //Cursed_Water
+8,645,1 //Concentration Potion
+8,656,1 //Awakening Potion
+8,657,1 //Berserk Potion
+8,569,1 //Novice Potion
+8,605,1 //Anodyne
+8,12016,1 //Speed Potion
+8,501,1 //Red Potion
+8,502,1 //Orange Potion
+8,503,1 //Yellow Potion
+8,12017,1 //Slow Potion
+8,504,1 //White Potion
+8,505,1 //Blue Potion
+8,506,1 //Green Potion
+8,545,1 //Condensed Red Potion
+8,546,1 //Condensed Yellow Potion
+8,547,1 //Condensed White Potion
+8,12020,1 //Cursed_Water
+8,645,1 //Concentration Potion
+8,656,1 //Awakening Potion
+8,657,1 //Berserk Potion
+8,569,1 //Novice Potion
+8,605,1 //Anodyne
+8,12016,1 //Speed Potion
+8,501,1 //Red Potion
+8,502,1 //Orange Potion
+8,503,1 //Yellow Potion
+8,12017,1 //Slow Potion
+8,504,1 //White Potion
+8,505,1 //Blue Potion
+8,506,1 //Green Potion
+8,545,1 //Condensed Red Potion
+8,546,1 //Condensed Yellow Potion
+8,547,1 //Condensed White Potion
+8,12020,1 //Cursed_Water
+8,645,1 //Concentration Potion
+8,656,1 //Awakening Potion
+8,657,1 //Berserk Potion
+8,569,1 //Novice Potion
+8,605,1 //Anodyne
+8,12016,1 //Speed Potion
+8,501,1 //Red Potion
+8,502,1 //Orange Potion
+8,503,1 //Yellow Potion
+8,12017,1 //Slow Potion
+8,504,1 //White Potion
+8,505,1 //Blue Potion
+8,506,1 //Green Potion
+8,545,1 //Condensed Red Potion
+8,546,1 //Condensed Yellow Potion
+8,547,1 //Condensed White Potion
+8,12020,1 //Cursed_Water
+8,645,1 //Concentration Potion
+8,656,1 //Awakening Potion
+8,657,1 //Berserk Potion
+8,569,1 //Novice Potion
+8,605,1 //Anodyne
+8,12016,1 //Speed Potion
+8,501,1 //Red Potion
+8,502,1 //Orange Potion
+8,503,1 //Yellow Potion
+8,12017,1 //Slow Potion
+8,504,1 //White Potion
+8,505,1 //Blue Potion
+8,506,1 //Green Potion
+8,545,1 //Condensed Red Potion
+8,546,1 //Condensed Yellow Potion
+8,547,1 //Condensed White Potion
+8,12020,1 //Cursed_Water
+8,645,1 //Concentration Potion
+8,656,1 //Awakening Potion
+8,657,1 //Berserk Potion
+8,569,1 //Novice Potion
+8,605,1 //Anodyne
+8,12016,1 //Speed Potion
+// Herbs
+9,507,1
+9,508,1
+9,509,1
+9,510,1
+9,511,1
+// Fruits
+10,512,1
+10,513,1
+10,514,1
+10,515,1
+10,516,1
+// Meat
+11,517,1
+11,528,1
+// Candy
+12,529,1
+12,530,1
+// Juice (removed Grape juice 533)
+13,531,1
+13,532,1
+13,534,1
+// Fish
+14,544,1
+14,551,1
+// Boxes
+15,603,1
+15,617,1
+15,644,1
+// Gemstones
+16,715,1
+16,716,1
+16,717,1
+// Elemental Resist Potions
+17,12118,1
+17,12119,1
+17,12120,1
+17,12121,1
+// ores
+18,756,1
+18,757,1
+18,998,1
+18,999,1
+18,1002,1
+18,1003,1
+18,1010,1
+18,1011,1
+// food types
+19,512,1
+19,513,1
+19,514,1
+19,515,1
+19,516,1
+19,517,1
+19,528,1
+19,529,1
+19,530,1
+19,544,1
+19,551,1
+//recovery-types
+20,501,1
+20,502,1
+20,503,1
+20,504,1
+20,505,1
+20,506,1
+20,507,1
+20,508,1
+20,509,1
+20,510,1
+20,511,1
+20,531,1
+20,532,1
+20,533,1
+20,534,1
+// minerals
+21,714,1
+21,756,1
+21,757,1
+21,969,1
+21,984,1
+21,985,1
+21,990,1
+21,991,1
+21,992,1
+21,993,1
+21,994,1
+21,995,1
+21,996,1
+21,997,1
+21,998,1
+21,999,1
+21,1002,1
+21,1003,1
+21,1010,1
+21,1011,1
+// taming items
+22,619,1 //Unripe Apple
+22,620,1 //Orange Juice
+22,621,1 //Bitter Herb
+22,622,1 //Rainbow Carrot
+22,623,1 //Earthworm the Dude
+22,624,1 //Rotten Fish
+22,625,1 //Rusty Iron
+22,626,1 //Monster Juice
+22,627,1 //Sweet Milk
+22,628,1 //Well-Dried Bone
+22,629,1 //Singing Flower
+22,630,1 //Dew Laden Moss
+22,631,1 //Deadly Noxious Herb
+22,632,1 //Fatty Chubby Earthworm
+22,633,1 //Sweet Potato
+22,634,1 //Tropical Banana
+22,635,1 //Orc Trophy
+22,636,1 //No Recipient
+22,637,1 //Old Broom
+22,638,1 //Silver Knife of Chastity
+22,639,1 //Armlet of Obedience
+22,640,1 //Shining Stone
+22,641,1 //Contracts in Shadow
+22,642,1 //Book of the Devil
+22,659,1 //Her Heart
+22,660,1 //Forbidden Red Candle
+22,661,1 //Soft Apron
+22,10001,1 //Skull Helm
+22,10002,1 //Monster Oxygen Mask
+22,10003,1 //Transparent Headgear
+22,10004,1 //Pacifier
+22,10005,1 //Wig
+22,10006,1 //Queen's Hair Ornament
+22,10007,1 //Silk Ribbon
+22,10008,1 //Punisher
+22,10009,1 //Wild Flower
+22,10010,1 //Battered Pot
+22,10011,1 //Stellar Hairpin
+22,10012,1 //Tiny Egg Shell
+22,10013,1 //Backpack
+22,10014,1 //Rocker Glasses
+22,10015,1 //Green Lace
+22,10016,1 //Golden Bell
+22,10017,1 //Bark Shorts
+22,10018,1 //Monkey Circlet
+22,10019,1 //Red Scarf
+22,10020,1 //Grave Keeper's Sword
+//scrolls
+23,686,1 //Level 3 Earth Spike
+23,687,1 //Level 5 Earth Spike
+23,688,1 //Level 3 Cold Bolt
+23,689,1 //Level 5 Cold Bolt
+23,690,1 //Level 3 Fire Bolt
+23,691,1 //Level 5 Fire Bolt
+23,692,1 //Level 3 Lightening Bolt
+23,693,1 //Level 5 Lightening Bolt
+23,694,1 //Level 3 Soul Strike
+23,695,1 //Level 5 Soul Strike
+23,696,1 //Level 1 Fire Ball
+23,697,1 //Level 5 Fire Ball
+23,698,1 //Level 1 Fire Wall
+23,699,1 //Level 5 Fire Wall
+23,700,1 //Level 1 Frost Diver
+23,12000,1 //Level 5 Frost Diver
+23,12001,1 //Level 3 Heal
+23,12002,1 //Level 5 Heal
+//quivers
+24,12004,1 //Quiver
+24,12005,1 //Iron Arrow Quiver
+24,12006,1 //Steel Arrow Quiver
+24,12007,1 //Oridecon Arrow Quiver
+24,12008,1 //Fire Arrow Quiver
+24,12009,1 //Silver Arrow Quiver
+24,12010,1 //Wind Arrow Quiver
+24,12011,1 //Stone Arrow Quiver
+24,12012,1 //Crystal Arrow Quiver
+24,12013,1 //Shadow Arrow Quiver
+24,12014,1 //Immaterial Arrow Quiver
+24,12015,1 //Rusty Arrow Quiver
+24,12183,1 //Holy Arrow Quiver
+//masks
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,2278,1 //Mr. Smile
+25,2281,1 //Opera Masque
+25,2288,1 //Mr. Scream
+25,2292,1 //Welding Mask
+25,2297,1 //Goblin Mask
+25,5005,1 //Gas Mask
+25,5086,1 //Alarm Mask
+25,5087,1 //Poker Face
+25,5088,1 //Surprised Mask
+25,5089,1 //Annoyed Mask
+25,5090,1 //Goblin Leader Mask
+25,5121,1 //Zherlthsh Mask
+//accessory
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2604,1 //Glove
+26,2610,1 //Gold Ring
+26,2617,1 //Celebrant's Mitten
+26,2612,1 //Flower Ring
+26,2603,1 //Necklace
+26,2623,1 //Necklace
+26,2628,1 //Novice Armlet
+26,2613,1 //Diamond Ring
+26,2609,1 //Skull Ring
+26,2619,1 //Bow Thimble
+26,2608,1 //Rosary
+26,2601,1 //Ring
+26,2618,1 //Matyr's Leash
+26,2627,1 //Belt
+26,2605,1 //Brooch
+26,2658,1 //Nile Rose
+26,2611,1 //Silver Ring
+26,2607,1 //Clip
+26,2602,1 //Earring
+26,2615,1 //Safety Ring
+26,2616,1 //Critical Ring
+26,2624,1 //Glove
+26,2621,1 //Ring
+26,2626,1 //Rosary
+26,2625,1 //Brooch
+26,2622,1 //Earring
+// jewels
+27,718,1
+27,719,1
+27,720,1
+27,721,1
+27,722,1
+27,723,1
+27,724,1
+27,725,1
+27,726,1
+27,727,1
+27,728,1
+27,729,1
+27,730,1
+27,731,1
+27,732,1
+27,733,1
+// Egg Boy
+32,514,300 //Grape
+32,564,522 //Rice Ball
+32,660,20 //Forbidden Red Candle
+32,682,100 //Distilled Fighting Spirit
+32,683,50 //Herb of Incantation
+32,2235,2 //Crown
+32,2274,5 //Ghost Bandana
+32,5072,1 //Incubus Horn
+// Egg Girl
+33,514,300 //Grape
+33,564,522 //Rice Ball
+33,661,20 //Soft Apron
+33,682,100 //Distilled Fighting Spirit
+33,683,50 //Herb of Incantation
+33,2234,2 //Tiara
+33,5042,5 //Bao Bao
+33,5066,1 //Succubus Horn
+// Lotto Box
+35,7391,1
+35,7392,1
+35,7393,1
+35,7394,1
+35,7395,1
+35,7396,1
+35,7397,1
+35,7398,1
+35,7540,1
+35,7541,1
diff --git a/db/item_noequip.txt b/db/item_noequip.txt
index 17eba9a11..79b0f3f7c 100644
--- a/db/item_noequip.txt
+++ b/db/item_noequip.txt
@@ -1,35 +1,35 @@
-// The equipment/items/cards restriction file
-// here you define which items may not be used at PvP / GvG
-// format: <item id>,<mode>
-// mode
-// 1- restricted in PVP
-// 2- restricted in GVG
-// 3- restricted in both PvP and GvG
-// Restricted zones - they're configured by 'restricted <number>' mapflag
-// 4 - restricted in zone 1
-// 8 - restricted in zone 2
-// 16 - restricted in zone 3
-// 32 - restricted in zone 4
-// 64 - restricted in zone 5
-// 128 - restricted in zone 6
-// 256 - restricted in zone 7
-
-//Examples:
-//1201,1 you can't use KNIFE(ID 1201) on PvP and GvG
-//608,3 you can't use Yggdrasil Seed(ID 608) on both PvP & GvG & WoE Castles
-//4174,3 Forbid Deviling Card in every PVP or GVG map, and during woes.
-//501,4 you can't use Red Potion on map marked as 'restricted zone 1'
-//502,8 you can't use Orange Potion on map marked as 'restricted zone 2'
-//503,16 you can't use Yellow Potion on map marked as 'restricted zone 3'
-// you can even mix modes
-//519,41 (32+8+1) you can't use Milk on PVP, and maps marked as 'restricted zone 2' and 'restricted zone 4'
-
-
-//Zone 1 - Aldebaran Turbo Track
-601,4 //Fly Wing
-506,4 //Green Potion
-525,4 //Panacea
-
-//Zone 2 - Jail
-601,8 //Fly Wing - not really needed here but ...
+// The equipment/items/cards restriction file
+// here you define which items may not be used at PvP / GvG
+// format: <item id>,<mode>
+// mode
+// 1- restricted in PVP
+// 2- restricted in GVG
+// 3- restricted in both PvP and GvG
+// Restricted zones - they're configured by 'restricted <number>' mapflag
+// 4 - restricted in zone 1
+// 8 - restricted in zone 2
+// 16 - restricted in zone 3
+// 32 - restricted in zone 4
+// 64 - restricted in zone 5
+// 128 - restricted in zone 6
+// 256 - restricted in zone 7
+
+//Examples:
+//1201,1 you can't use KNIFE(ID 1201) on PvP and GvG
+//608,3 you can't use Yggdrasil Seed(ID 608) on both PvP & GvG & WoE Castles
+//4174,3 Forbid Deviling Card in every PVP or GVG map, and during woes.
+//501,4 you can't use Red Potion on map marked as 'restricted zone 1'
+//502,8 you can't use Orange Potion on map marked as 'restricted zone 2'
+//503,16 you can't use Yellow Potion on map marked as 'restricted zone 3'
+// you can even mix modes
+//519,41 (32+8+1) you can't use Milk on PVP, and maps marked as 'restricted zone 2' and 'restricted zone 4'
+
+
+//Zone 1 - Aldebaran Turbo Track
+601,4 //Fly Wing
+506,4 //Green Potion
+525,4 //Panacea
+
+//Zone 2 - Jail
+601,8 //Fly Wing - not really needed here but ...
602,8 //Butterfly Wing - also not needed \ No newline at end of file
diff --git a/db/item_scroll.txt b/db/item_scroll.txt
index 3c52a0f9d..178510f7d 100644
--- a/db/item_scroll.txt
+++ b/db/item_scroll.txt
@@ -1,6 +1,6 @@
-// Worn-Out Scroll Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-5,909,1 //Jellopy
+// Worn-Out Scroll Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+5,909,1 //Jellopy
diff --git a/db/item_trade.txt b/db/item_trade.txt
index 2ce6850bc..67f7225b9 100644
--- a/db/item_trade.txt
+++ b/db/item_trade.txt
@@ -1,54 +1,54 @@
-//Item Trading Restrictions File
-//Specify here special rules for item trading.
-//Item ID, TradeMask, GM-Level Override
-//Trading mask values:
-//1:Item can't be drop
-//2:Item can't be traded (nor vended)
-//4:Wedded partner can override restriction 2.
-//8:Item can't be sold to npcs
-//16:Item can't be placed in the cart
-//32:Item can't be placed in the storage
-//64:Item can't be placed in the guild storage
-//Example:
-//1161,67,50 //Balmung: No drop, No trade, No Guild Store (1+2+64 =67),
-//only GMs of GM-level 50 and up can override the setting.
-2634,127,100 // ??????
-2635,127,100 // ??????
-//The Sign Quest related items
-7177,123,100 // ?? ?????
-7178,123,100 // ?? ???
-7304,123,100 // ??????
-7305,123,100 // ???????
-7306,123,100 // ?????
-7307,123,100 // ??????
-7308,123,100 // ?????
-7309,123,100 // ??????
-2642,123,100 // ??????
-2644,123,100 // ??? armor
-7314,123,100 // ??? event
-7025,27,100 // ??? ??
-7527,122,100 // ????? ???
-12142,122,100 // ????? ???
-2647,123,100 // ????
-//Eye of Hellion quest related items
-7332,123,100 // ??
-7333,123,100 // ????_1
-7334,123,100 // ????_2
-7335,123,100 // ????_3
-7336,123,100 // ????_4
-7339,123,100 // ??????_
-5132,27,100 // ?????
-//Leather Pouch (part of Cooking Quest)
-7432,123,100
-// Keys (Thanatos Tower Quest)
-7421,123,100
-7422,123,100
-7423,123,100
-7424,123,100
-7425,123,100
-// Magical Stones (Thanatos Tower Quest)
-7426,123,100
-7427,123,100
-7428,123,100
-7429,123,100
+//Item Trading Restrictions File
+//Specify here special rules for item trading.
+//Item ID, TradeMask, GM-Level Override
+//Trading mask values:
+//1:Item can't be drop
+//2:Item can't be traded (nor vended)
+//4:Wedded partner can override restriction 2.
+//8:Item can't be sold to npcs
+//16:Item can't be placed in the cart
+//32:Item can't be placed in the storage
+//64:Item can't be placed in the guild storage
+//Example:
+//1161,67,50 //Balmung: No drop, No trade, No Guild Store (1+2+64 =67),
+//only GMs of GM-level 50 and up can override the setting.
+2634,127,100 // ??????
+2635,127,100 // ??????
+//The Sign Quest related items
+7177,123,100 // ?? ?????
+7178,123,100 // ?? ???
+7304,123,100 // ??????
+7305,123,100 // ???????
+7306,123,100 // ?????
+7307,123,100 // ??????
+7308,123,100 // ?????
+7309,123,100 // ??????
+2642,123,100 // ??????
+2644,123,100 // ??? armor
+7314,123,100 // ??? event
+7025,27,100 // ??? ??
+7527,122,100 // ????? ???
+12142,122,100 // ????? ???
+2647,123,100 // ????
+//Eye of Hellion quest related items
+7332,123,100 // ??
+7333,123,100 // ????_1
+7334,123,100 // ????_2
+7335,123,100 // ????_3
+7336,123,100 // ????_4
+7339,123,100 // ??????_
+5132,27,100 // ?????
+//Leather Pouch (part of Cooking Quest)
+7432,123,100
+// Keys (Thanatos Tower Quest)
+7421,123,100
+7422,123,100
+7423,123,100
+7424,123,100
+7425,123,100
+// Magical Stones (Thanatos Tower Quest)
+7426,123,100
+7427,123,100
+7428,123,100
+7429,123,100
7430,123,100 \ No newline at end of file
diff --git a/db/item_violetbox.txt b/db/item_violetbox.txt
index 1494ffd22..08643f33c 100644
--- a/db/item_violetbox.txt
+++ b/db/item_violetbox.txt
@@ -1,8986 +1,8986 @@
-// Old Violet Box Obtainable Items Database
-//
-// Structure of Database:
-// GroupID,ItemID,Rate
-
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2102,1 //Guard
-2,2104,1 //Buckler
-2,2106,1 //Shield
-2,2108,1 //Mirror Shield
-2,2109,1 //Memory Book
-2,2112,1 //Novice Guard
-2,2302,1 //Cotton Shirt
-2,2304,1 //Jacket
-2,2306,1 //Adventurer's Suit
-2,2308,1 //Mantle
-2,2310,1 //Coat
-2,2311,1 //Mink Coat
-2,2313,1 //Padded Armor
-2,2315,1 //Chain Mail
-2,2317,1 //Full Plate
-2,2318,1 //Lord's Clothes
-2,2320,1 //Formal Suit
-2,2322,1 //Silk Robe
-2,2324,1 //Scapulare
-2,2326,1 //Saint's Robe
-2,2329,1 //Wooden Mail
-2,2331,1 //Tights
-2,2333,1 //Silver Robe
-2,2336,1 //Thief Clothes
-2,2337,1 //Ninja Suit
-2,2338,1 //Wedding Dress
-2,2339,1 //Pantie
-2,2340,1 //Novice Breastplate
-2,2352,1 //Tattered Novice Ninja Suit
-2,2402,1 //Sandals
-2,2404,1 //Shoes
-2,2406,1 //Boots
-2,2407,1 //Crystal Pumps
-2,2408,1 //Shackles
-2,2409,1 //High Heels
-2,2411,1 //Greaves
-2,2414,1 //Novice Slippers
-2,2502,1 //Hood
-2,2504,1 //Muffler
-2,2506,1 //Manteau
-2,2507,1 //Ancient Cape
-2,2508,1 //Ragamuffin Manteau
-2,2510,1 //Somber Novice Hood
-2,2601,1 //Ring
-2,2602,1 //Earring
-2,2603,1 //Necklace
-2,2604,1 //Glove
-2,2605,1 //Brooch
-2,2607,1 //Clip
-2,2608,1 //Rosary
-2,2609,1 //Skull Ring
-2,2610,1 //Gold Ring
-2,2611,1 //Silver Ring
-2,2612,1 //Flower Ring
-2,2613,1 //Diamond Ring
-2,2617,1 //Celebrant's Mitten
-2,2618,1 //Matyr's Leash
-2,2627,1 //Belt
-2,2628,1 //Novice Armlet
-2,1117,1 //Katana
-2,1152,1 //Slayer
-2,1155,1 //Bastard Sword
-2,1158,1 //Two-Handed Sword
-2,1162,1 //Broad Sword
-2,1163,1 //Claymore
-2,1251,1 //Jur
-2,1253,1 //Katar
-2,1255,1 //Jamadhar
-2,1256,1 //Katar of Frozen Icicle
-2,1257,1 //Katar of Quaking
-2,1258,1 //Katar of Raging Blaze
-2,1259,1 //Katar of Piercing Wind
-2,1352,1 //Battle Axe
-2,1355,1 //Hammer
-2,1358,1 //Buster
-2,1361,1 //Two-Handed Axe
-2,1411,1 //Lance
-2,1452,1 //Guisarme
-2,1455,1 //Glaive
-2,1458,1 //Partizan
-2,1461,1 //Trident
-2,1464,1 //Halberd
-2,1472,1 //Soul Staff
-2,1702,1 //Bow
-2,1705,1 //Composite Bow
-2,1708,1 //Great Bow
-2,1711,1 //Crossbow
-2,1715,1 //Arbalest
-2,1716,1 //Gakkung Bow
-2,1718,1 //Hunter Bow
-2,1102,1 //Sword
-2,1105,1 //Falchion
-2,1108,1 //Blade
-2,1111,1 //Rapier
-2,1114,1 //Scimitar
-2,1120,1 //Tsurugi
-2,1124,1 //Orcish sword
-2,1125,1 //Ring Pommel Saber
-2,1127,1 //Saber
-2,1128,1 //Haedonggum
-2,1129,1 //Flamberge
-2,1202,1 //Knife
-2,1205,1 //Cutter
-2,1208,1 //Main Gauche
-2,1211,1 //Dirk
-2,1214,1 //Dagger
-2,1217,1 //Stiletto
-2,1220,1 //Gladius
-2,1226,1 //Damascus
-2,1243,1 //Novice Main Gauche
-2,1302,1 //Axe
-2,1304,1 //Orcish Axe
-2,1402,1 //Javelin
-2,1405,1 //Spear
-2,1408,1 //Pike
-2,1502,1 //Club
-2,1505,1 //Mace
-2,1508,1 //Smasher
-2,1511,1 //Flail
-2,1514,1 //Morning Star
-2,1517,1 //Sword Mace
-2,1520,1 //Chain
-2,1522,1 //Stunner
-2,1550,1 //Book
-2,1551,1 //Bible
-2,1552,1 //Tablet
-2,1553,1 //Book of Billows
-2,1554,1 //Book of Mother Earth
-2,1555,1 //Book of the Blazing Sun
-2,1556,1 //Book of Gust of Wind
-2,1558,1 //Girl's Diary
-2,1602,1 //Rod
-2,1605,1 //Wand
-2,1608,1 //Staff
-2,1611,1 //Arc Wand
-2,1613,1 //Mighty Staff
-2,1614,1 //Wand of Occult
-2,1615,1 //Evil Bone Wand
-2,1802,1 //Waghnak
-2,1804,1 //Knuckle Duster
-2,1806,1 //Studded Knuckles
-2,1808,1 //Fist
-2,1810,1 //Claw
-2,1812,1 //Finger
-2,1902,1 //Violin
-2,1904,1 //Mandolin
-2,1906,1 //Lute
-2,1908,1 //Guitar
-2,1910,1 //Harp
-2,1912,1 //Gumoongoh
-2,1951,1 //Rope
-2,1953,1 //Whip
-2,1955,1 //Wire Whip
-2,1957,1 //Rante Whip
-2,1959,1 //Tail Whip
-2,1961,1 //Whip
-2,2201,1 //Sunglasses
-2,2203,1 //Glasses
-2,2205,1 //Diver Goggles
-2,2206,1 //Wedding Veil
-2,2207,1 //Fancy Flower
-2,2208,1 //Ribbon
-2,2209,1 //Ribbon
-2,2210,1 //Hair Band
-2,2211,1 //Bandana
-2,2212,1 //Eye Patch
-2,2213,1 //Kitty Band
-2,2214,1 //Bunny Band
-2,2215,1 //Flower Band
-2,2216,1 //Biretta
-2,2217,1 //Biretta
-2,2218,1 //Flu Mask
-2,2220,1 //Hat
-2,2221,1 //Hat
-2,2222,1 //Turban
-2,2223,1 //Turban
-2,2226,1 //Cap
-2,2227,1 //Cap
-2,2228,1 //Helm
-2,2229,1 //Helm
-2,2230,1 //Gemmed Sallet
-2,2231,1 //Gemmed Sallet
-2,2232,1 //Circlet
-2,2233,1 //Circlet
-2,2236,1 //Santa Hat
-2,2239,1 //Monocle
-2,2241,1 //Grandpa Beard
-2,2242,1 //Purple Glasses
-2,2243,1 //Geek Glasses
-2,2244,1 //Big Ribbon
-2,2245,1 //Sweet Gent
-2,2246,1 //Golden Gear
-2,2247,1 //Romantic Gent
-2,2248,1 //Western Grace
-2,2250,1 //Cute Ribbon
-2,2251,1 //Monk Hat
-2,2252,1 //Wizard Hat
-2,2253,1 //Sunflower
-2,2257,1 //Unicorn Horn
-2,2259,1 //Mini Propeller
-2,2260,1 //Mini Glasses
-2,2261,1 //Army Cap
-2,2262,1 //Clown Nose
-2,2263,1 //Zorro Masque
-2,2265,1 //Gangster Mask
-2,2266,1 //Iron Cain
-2,2267,1 //Cigarette
-2,2268,1 //Pipe
-2,2269,1 //Romantic Flower
-2,2270,1 //Romantic Leaf
-2,2271,1 //Jack be Dandy
-2,2275,1 //Red Bandana
-2,2276,1 //Angled Glasses
-2,2277,1 //Nurse Cap
-2,2279,1 //Bomb Wick
-2,2282,1 //Halo
-2,2285,1 //Apple of Archer
-2,2287,1 //Pirate Bandana
-2,2289,1 //Poo Poo Hat
-2,2290,1 //Funeral Hat
-2,2291,1 //Masquerade
-2,2294,1 //Stellar
-2,2295,1 //Blinker
-2,2298,1 //Green Feeler
-2,2299,1 //Orc Helm
-2,5003,1 //Joker Jester
-2,5006,1 //Machoman's Glasses
-2,5008,1 //Puppy Love
-2,5009,1 //Safety Helmet
-2,5010,1 //Indian Fillet
-2,5011,1 //Aerial
-2,5014,1 //Fin Helm
-2,5015,1 //Egg Shell
-2,5030,1 //Panda Hat
-2,5035,1 //Poring Hat
-2,5037,1 //Nutshell
-2,5055,1 //Novice False Eggshell
-2,2278,1 //Mr. Smile
-2,2288,1 //Mr. Scream
-2,2297,1 //Goblin Mask
-2,5005,1 //Gas Mask
-2,5088,1 //Surprised Mask
-2,5089,1 //Annoyed Mask
-2,5090,1 //Goblin Leader Mask
-2,2224,1 //Goggles
-2,2225,1 //Goggles
-2,10001,1 //Skull Helm
-2,10002,1 //Monster Oxygen Mask
-2,10003,1 //Transparent Headgear
-2,10004,1 //Pacifier
-2,10005,1 //Wig
-2,10006,1 //Queen's Hair Ornament
-2,10007,1 //Silk Ribbon
-2,10008,1 //Punisher
-2,10009,1 //Wild Flower
-2,10010,1 //Battered Pot
-2,10011,1 //Stellar Hairpin
-2,10012,1 //Tiny Egg Shell
-2,10013,1 //Backpack
-2,10014,1 //Rocker Glasses
-2,10015,1 //Green Lace
-2,10016,1 //Golden Bell
-2,10017,1 //Bark Shorts
-2,10018,1 //Monkey Circlet
-2,10019,1 //Red Scarf
-2,10020,1 //Grave Keeper's Sword
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,701,1 //Ora Ora
-2,702,1 //Animal Gore
-2,703,1 //Hinalle
-2,704,1 //Aloe
-2,705,1 //Clover
-2,706,1 //Four Leaf Clover
-2,707,1 //Singing Plant
-2,708,1 //Ment
-2,710,1 //Illusion Flower
-2,711,1 //Shoot
-2,712,1 //Flower
-2,713,1 //Empty Bottle
-2,714,1 //Emperium
-2,715,1 //Yellow Gemstone
-2,716,1 //Red Gemstone
-2,717,1 //Blue Gemstone
-2,718,1 //Garnet
-2,719,1 //Amethyst
-2,720,1 //Aquamarine
-2,721,1 //Emerald
-2,722,1 //Pearl
-2,723,1 //Ruby
-2,724,1 //Cursed Ruby
-2,725,1 //Sardonyx
-2,726,1 //Sapphire
-2,727,1 //Opal
-2,728,1 //Topaz
-2,729,1 //Zircon
-2,730,1 //1carat Diamond
-2,731,1 //2carat Diamond
-2,732,1 //3carat Diamond
-2,733,1 //Cracked Diamond
-2,734,1 //Red Frame
-2,735,1 //Chung Jah
-2,736,1 //China
-2,737,1 //Black Ladle
-2,738,1 //Pencil Case
-2,739,1 //Rouge
-2,740,1 //Puppet
-2,741,1 //Poring Doll
-2,742,1 //Chonchon Doll
-2,743,1 //Spore Doll
-2,744,1 //Bouquet
-2,745,1 //Wedding Bouquet
-2,746,1 //Glass Bead
-2,747,1 //Crystal Mirror
-2,748,1 //Witherless Rose
-2,749,1 //Frozen Rose
-2,750,1 //Baphomet Doll
-2,751,1 //Osiris Doll
-2,752,1 //Grasshopper Doll
-2,753,1 //Yoyo Doll
-2,754,1 //Raccoon Doll
-2,756,1 //Rough Oridecon
-2,757,1 //Rough Elunium
-2,901,1 //Danggie
-2,902,1 //Tree Root
-2,903,1 //Reptile Tongue
-2,904,1 //Scorpion Tail
-2,905,1 //Stem
-2,906,1 //Pointed Scale
-2,907,1 //Resin
-2,908,1 //Spawn
-2,909,1 //Jellopy
-2,910,1 //Garlet
-2,911,1 //Scell
-2,912,1 //Zargon
-2,913,1 //Tooth of Bat
-2,914,1 //Fluff
-2,915,1 //Chrysalis
-2,916,1 //Feather of Birds
-2,917,1 //Talon
-2,918,1 //Sticky Webfoot
-2,919,1 //Animal Skin
-2,920,1 //Wolf Claw
-2,921,1 //Mushroom Spore
-2,922,1 //Orc's Fang
-2,923,1 //Evil Horn
-2,924,1 //Powder of Butterfly
-2,925,1 //Bill of Birds
-2,926,1 //Snake Scale
-2,928,1 //Insect Feeler
-2,929,1 //Immortal Heart
-2,930,1 //Rotten Bandage
-2,931,1 //Orcish Voucher
-2,932,1 //Skel-Bone
-2,934,1 //Memento
-2,935,1 //Shell
-2,936,1 //Scale Shell
-2,937,1 //Venom Canine
-2,938,1 //Sticky Mucus
-2,939,1 //Bee Sting
-2,940,1 //Grasshopper's Leg
-2,941,1 //Nose Ring
-2,942,1 //Yoyo Tail
-2,943,1 //Solid Shell
-2,944,1 //Horseshoe
-2,945,1 //Raccoon Leaf
-2,946,1 //Snail's Shell
-2,947,1 //Horn
-2,948,1 //Bear's Footskin
-2,949,1 //Feather
-2,950,1 //Heart of Mermaid
-2,951,1 //Fin
-2,952,1 //Cactus Needle
-2,953,1 //Stone Heart
-2,954,1 //Shining Scale
-2,955,1 //Worm Peeling
-2,956,1 //Gill
-2,957,1 //Decayed Nail
-2,958,1 //Horrendous Mouth
-2,959,1 //Stinky Scale
-2,960,1 //Nipper
-2,961,1 //Conch
-2,962,1 //Tentacle
-2,963,1 //Sharp Scale
-2,964,1 //Crab Shell
-2,965,1 //Clam Shell
-2,966,1 //Clam Flesh
-2,967,1 //Turtle Shell
-2,968,1 //Heroic Emblem
-2,969,1 //Gold
-2,970,1 //Alcohol
-2,971,1 //Detrimindexta
-2,972,1 //Karvodailnirol
-2,973,1 //Counteragent
-2,974,1 //Mixture
-2,975,1 //Scarlet Dyestuff
-2,976,1 //Lemon Dyestuff
-2,978,1 //Cobaltblue Dyestuff
-2,979,1 //Darkgreen Dyestuff
-2,980,1 //Orange Dyestuff
-2,981,1 //Violet Dyestuff
-2,982,1 //White Dyestuff
-2,983,1 //Black Dyestuff
-2,984,1 //Oridecon
-2,985,1 //Elunium
-2,986,1 //Anvil
-2,987,1 //Oridecon Anvil
-2,988,1 //Golden Anvil
-2,989,1 //Emperium Anvil
-2,990,1 //Red Blood
-2,991,1 //Crystal Blue
-2,992,1 //Wind of Verdure
-2,993,1 //Green Live
-2,994,1 //Flame Heart
-2,995,1 //Mystic Frozen
-2,996,1 //Rough Wind
-2,997,1 //Great Nature
-2,998,1 //Iron
-2,999,1 //Steel
-2,1000,1 //Star Crumb
-2,1001,1 //Star Dust
-2,1002,1 //Iron Ore
-2,1003,1 //Coal
-2,1004,1 //Chivalry Emblem
-2,1005,1 //Hammer of Blacksmith
-2,1006,1 //Old Magicbook
-2,1007,1 //Necklace of Wisdom
-2,1008,1 //Necklace of Oblivion
-2,1009,1 //Hand of God
-2,1010,1 //Phracon
-2,1011,1 //Emveretarcon
-2,1012,1 //Frill
-2,1013,1 //Rainbow Shell
-2,1014,1 //Ant Jaw
-2,1015,1 //Tongue
-2,1016,1 //Rat Tail
-2,1017,1 //Mole Whiskers
-2,1018,1 //Mole Claw
-2,1019,1 //Trunk
-2,1020,1 //Black Hair
-2,1021,1 //Dokebi Horn
-2,1022,1 //Nine Tails
-2,1023,1 //Fish Tail
-2,1024,1 //Squid Ink
-2,1025,1 //Cobweb
-2,1026,1 //Acorn
-2,1027,1 //Porcupine Quill
-2,1028,1 //Mane
-2,1029,1 //Tiger Skin
-2,1030,1 //Tiger's Footskin
-2,1031,1 //Mantis Scythe
-2,1032,1 //Maneater Blossom
-2,1033,1 //Maneater Root
-2,1034,1 //Blue Hair
-2,1035,1 //Dragon Canine
-2,1036,1 //Dragon Scale
-2,1037,1 //Dragon Tail
-2,1038,1 //Little Evil Horn
-2,1039,1 //Little Evil Wing
-2,1040,1 //Elder Pixie's Moustache
-2,1041,1 //Lantern
-2,1042,1 //Bug Leg
-2,1043,1 //Orc Claw
-2,1044,1 //Zenorc's Fang
-2,1045,1 //Cultish Masque
-2,1046,1 //Scorpion Nipper
-2,1047,1 //Dead Medusa
-2,1048,1 //Horrendous Hair
-2,1049,1 //Skirt of Virgin
-2,1050,1 //Tendon
-2,1051,1 //Detonator
-2,1052,1 //Single Cell
-2,1053,1 //Ancient Tooth
-2,1054,1 //Ancient Lips
-2,1055,1 //Earthworm Peeling
-2,1056,1 //Grit
-2,1057,1 //Moth Dust
-2,1058,1 //Moth Wings
-2,1059,1 //Fabric
-2,1060,1 //Golden Hair
-2,1061,1 //Witched Starsand
-2,1062,1 //Jack o' Pumpkin
-2,1063,1 //Fang
-2,1064,1 //Reins
-2,1065,1 //Trap
-2,1066,1 //Fine-grained Trunk
-2,1067,1 //Solid Trunk
-2,1068,1 //Barren Trunk
-2,1088,1 //Morocc Solution
-2,1089,1 //Payon Solution
-2,1092,1 //Empty Test Tube
-2,1093,1 //Empty Potion Bottle
-2,1094,1 //Short Daenggie
-2,1095,1 //Clock Hand
-2,1096,1 //Round Shell
-2,1097,1 //Worn Out Page
-2,1098,1 //Manacles
-2,1099,1 //Worn-out Prison Uniform
-2,7001,1 //Mould Powder
-2,7002,1 //Ogre Tooth
-2,7003,1 //Anolian Skin
-2,7004,1 //Mud Lump
-2,7005,1 //Skull
-2,7006,1 //Wing of Red Bat
-2,7007,1 //Claw of Rat
-2,7008,1 //Stiff Horn
-2,7009,1 //Glitter Shell
-2,7010,1 //Tail of Steel Scorpion
-2,7011,1 //Claw of Monkey
-2,7012,1 //Tough Scalelike Stem
-2,7013,1 //Coral Reef
-2,7014,1 //Old Portrait
-2,7015,1 //Memory Bookmark
-2,7016,1 //Bent Spoon
-2,7026,1 //Clock_Tower_Key
-2,7027,1 //Key of the Underground
-2,7030,1 //Claw of Desert Wolf
-2,7031,1 //Old Frying Pan
-2,7032,1 //Piece of Egg Shell
-2,7033,1 //Poison Spore
-2,7034,1 //Red Stocking
-2,7035,1 //Matchstick
-2,7036,1 //Fang of Garm
-2,7038,1 //Yarn
-2,7041,1 //Fine Grit
-2,7047,1 //Alice's Apron
-2,7048,1 //Talon of Griffon
-2,7049,1 //Stone
-2,7053,1 //Cyfar
-2,7054,1 //Brigan
-2,7059,1 //Free Ticket for Kafra Storage
-2,7060,1 //Free Ticket for Kafra Transportation
-2,7061,1 //Free Ticket for the Cart Service
-2,7063,1 //Soft Feather
-2,7064,1 //Wing of Dragonfly
-2,7065,1 //Sea-Otter Fur
-2,7066,1 //Ice Cubic
-2,7067,1 //Stone Fragment
-2,7068,1 //Burnt Tree
-2,7069,1 //Destroyed Armor
-2,7070,1 //Broken Shell
-2,7071,1 //Tattered Clothes
-2,7072,1 //Old Shuriken
-2,7093,1 //Cogwheel
-2,7094,1 //Fragment
-2,7095,1 //Metal Fragment
-2,7096,1 //Lava
-2,7097,1 //Burning Heart
-2,7098,1 //Live Coal
-2,7099,1 //Worn-out Magic Scroll
-2,7100,1 //Sharp Leaf
-2,7101,1 //Peco Peco Feather
-2,7106,1 //Antelope Horn
-2,7107,1 //Antelope Skin
-2,7108,1 //Piece of Shield
-2,7109,1 //Shining Spear Blade
-2,7110,1 //Broken Sword
-2,7111,1 //Slick Paper
-2,7112,1 //Sharp Paper
-2,7113,1 //Broken Pharaoh Emblem
-2,7114,1 //Masque of Tutankhamen
-2,7115,1 //Harpy Feather
-2,7116,1 //Harpy Talon
-2,7117,1 //Torn Magic Book
-2,7118,1 //Torn Scroll
-2,7119,1 //Bacillus
-2,7120,1 //Burning Horseshoe
-2,7121,1 //Honey Pot
-2,7122,1 //Burning Hair
-2,7123,1 //Dragon Skin
-2,7124,1 //Sand Clump
-2,7125,1 //Scorpion Claw
-2,7126,1 //Large Jellopy
-2,7134,1 //Medicine Bowl
-2,7135,1 //Fire Bottle
-2,7136,1 //Acid Bottle
-2,7137,1 //Plant Bottle
-2,7138,1 //Marine Sphere Bottle
-2,7139,1 //Glistening Coat
-2,7149,1 //Yellow Plate
-2,7150,1 //Piece of Bamboo
-2,7151,1 //Oil Paper
-2,7152,1 //Glossy Hair
-2,7153,1 //Worn-out Kimono
-2,7154,1 //Poisonous Powder
-2,7155,1 //Poisonous Toad Skin
-2,7156,1 //Broken Shuriken
-2,7157,1 //Dark Mask
-2,7158,1 //Broken Liquor Jar
-2,7159,1 //Tengu Nose
-2,7161,1 //Black Bear Skin
-2,7162,1 //Cloud Crumb
-2,7163,1 //Hard Feeler
-2,7164,1 //Solid_Peach
-2,7165,1 //Transparent Celestial Robe
-2,7166,1 //Soft Silk
-2,7167,1 //Strange Steel Piece
-2,7168,1 //Giant Butterfly Wing
-2,7169,1 //Ba_Gua
-2,7170,1 //Tuxedo
-2,7171,1 //Leopard Skin
-2,7172,1 //Leopard Claw
-2,7174,1 //Wrapping Lace
-2,7175,1 //Wrapping Paper
-2,7182,1 //Cacao
-2,7186,1 //Thin Trunk
-2,7187,1 //Festival Mask
-2,7188,1 //Brown_Root
-2,7189,1 //Wooden Heart
-2,7190,1 //Solid Husk
-2,7191,1 //Lamp
-2,7192,1 //Vane
-2,7193,1 //Sprout
-2,7194,1 //Soft Blade of Grass
-2,7195,1 //Slingshot
-2,7196,1 //Shoulder Protector
-2,7197,1 //Tough Vines
-2,7198,1 //Huge Leaf
-2,7200,1 //Elastic Band
-2,7201,1 //Log
-2,7202,1 //Pincher of Beetle
-2,7203,1 //Strong Branch
-2,7205,1 //Piece of Black Cloth
-2,7206,1 //Black Cat Doll
-2,7207,1 //Old Manteau
-2,7208,1 //Rusty Kitchen Knife
-2,7209,1 //Helm of Dullahan
-2,7210,1 //Armor Piece of Dullahan
-2,7211,1 //Fragment of Rossata Stone
-2,7212,1 //Hung Doll
-2,7213,1 //Needle Packet
-2,7214,1 //Bat Cage
-2,7215,1 //Broken Needle
-2,7216,1 //Red Muffler
-2,7217,1 //Spool
-2,7218,1 //Decomposed Rope
-2,7219,1 //Striped Sock
-2,7220,1 //Ectoplasm
-2,7221,1 //Tangled Chains
-2,7222,1 //Wooden Gnarl
-2,7223,1 //Contorted Self-Portrait
-2,7225,1 //Pumpkin Lantern
-2,7262,1 //Folding Fan of Cat Ghost
-2,7263,1 //Cat's Eye
-2,7264,1 //Dry Sand
-2,7265,1 //Dragon Horn
-2,7266,1 //Denture from Dragon Mask
-2,7267,1 //Tiger Panty
-2,7268,1 //Little Ghost Doll
-2,7269,1 //Pinafore
-2,7270,1 //Nursing_Bottle
-2,1750,1 //Arrow
-2,1751,1 //Silver Arrow
-2,1752,1 //Fire Arrow
-2,1753,1 //Steel Arrow
-2,1754,1 //Crystal Arrow
-2,1755,1 //Arrow of Wind
-2,1756,1 //Stone Arrow
-2,1757,1 //Immaterial Arrow
-2,1758,1 //Stun Arrow
-2,1759,1 //Frozen Arrow
-2,1760,1 //Flash Arrow
-2,1761,1 //Cursed Arrow
-2,1762,1 //Rusty Arrow
-2,1763,1 //Poison Arrow
-2,1764,1 //Sharp Arrow
-2,1765,1 //Oridecon Arrow
-2,1767,1 //Shadow Arrow
-2,1768,1 //Sleep Arrow
-2,1769,1 //Mute Arrow
-2,1770,1 //Iron Arrow
-2,501,1 //Red Potion
-2,502,1 //Orange Potion
-2,503,1 //Yellow Potion
-2,504,1 //White Potion
-2,505,1 //Blue Potion
-2,506,1 //Green Potion
-2,507,1 //Red Herb
-2,508,1 //Yellow Herb
-2,509,1 //White Herb
-2,510,1 //Blue Herb
-2,511,1 //Green Herb
-2,512,1 //Apple
-2,513,1 //Banana
-2,514,1 //Grape
-2,515,1 //Carrot
-2,516,1 //Potato
-2,517,1 //Meat
-2,518,1 //Honey
-2,519,1 //Milk
-2,520,1 //Hinalle Leaflet
-2,521,1 //Aloe Leaflet
-2,522,1 //Mastela Fruit
-2,523,1 //Holy Water
-2,525,1 //Panacea
-2,526,1 //Royal Jelly
-2,528,1 //Monster Food
-2,529,1 //Candy
-2,530,1 //Candy Cane
-2,531,1 //Apple Juice
-2,532,1 //Banana Juice
-2,533,1 //Grape Juice
-2,534,1 //Carrot Juice
-2,535,1 //Pumpkin
-2,536,1 //Ice Cream
-2,537,1 //Pet Food
-2,538,1 //Well-baked Cookie
-2,539,1 //Piece of Cake
-2,544,1 //Raw Fish
-2,545,1 //Condensed Red Potion
-2,546,1 //Condensed Yellow Potion
-2,547,1 //Condensed White Potion
-2,548,1 //Cheese
-2,549,1 //Yam
-2,550,1 //Rice Cake
-2,551,1 //Sushi
-2,553,1 //Bao
-2,555,1 //Traditional Rice Cake
-2,558,1 //Chocolate
-2,561,1 //White Chocolate
-2,601,1 //Fly Wing
-2,602,1 //Butterfly Wing
-2,603,1 //Old Blue Box
-2,604,1 //Dead Branch
-2,605,1 //Anodyne
-2,606,1 //Aloevera
-2,607,1 //Yggdrasil Berry
-2,608,1 //Yggdrasil Seed
-2,609,1 //Amulet
-2,610,1 //Yggdrasil Leaf
-2,611,1 //Magnifier
-2,612,1 //Mini Furnace
-2,613,1 //Iron Hammer
-2,614,1 //Golden Hammer
-2,615,1 //Oridecon Hammer
-2,618,1 //Worn Out Scroll
-2,619,1 //Unripe Apple
-2,620,1 //Orange Juice
-2,621,1 //Bitter Herb
-2,622,1 //Rainbow Carrot
-2,623,1 //Earthworm the Dude
-2,624,1 //Rotten Fish
-2,625,1 //Rusty Iron
-2,626,1 //Monster Juice
-2,627,1 //Sweet Milk
-2,628,1 //Well-Dried Bone
-2,629,1 //Singing Flower
-2,630,1 //Dew Laden Moss
-2,631,1 //Deadly Noxious Herb
-2,632,1 //Fatty Chubby Earthworm
-2,633,1 //Sweet Potato
-2,634,1 //Tropical Banana
-2,635,1 //Orc Trophy
-2,636,1 //No Recipient
-2,637,1 //Old Broom
-2,638,1 //Silver Knife of Chastity
-2,639,1 //Armlet of Obedience
-2,640,1 //Shining Stone
-2,641,1 //Contracts in Shadow
-2,642,1 //Book of the Devil
-2,643,1 //Pet Incubator
-2,644,1 //Gift Box
-2,645,1 //Concentration Potion
-2,656,1 //Awakening Potion
-2,657,1 //Berserk Potion
-2,659,1 //Her Heart
-2,663,1 //Songpyun
-2,664,1 //Gift Box
-2,665,1 //Gift Box
-2,666,1 //Gift Box
-2,667,1 //Gift Box
-2,668,1 //Red_Envelope
-2,678,1 //Poison Bottle
-2,679,1 //Pilule
-2,2234,1 //Tiara
-2,2235,1 //Crown
-2,2249,1 //Coronet
-2,2254,1 //Angel Wing
-2,2255,1 //Evil Wing
-2,2258,1 //Spiky Band
-2,2256,1 //Majestic Goat
-2,2274,1 //Ghost Bandana
-2,2286,1 //Elven Ears
-2,2327,1 //Holy Robe
-2,2334,1 //Mage Coat
-2,2614,1 //Eye of Dullahan
-2,2615,1 //Safety Ring
-2,2616,1 //Critical Ring
-2,2621,1 //Ring
-2,2622,1 //Earring
-2,2623,1 //Necklace
-2,2624,1 //Glove
-2,2625,1 //Brooch
-2,2626,1 //Rosary
-2,5002,1 //Jewel Crown
-2,5085,1 //Small Ribbons
-2,5007,1 //Grand Circlet
-2,5017,1 //Bone Helm
-2,5019,1 //Corsair
-2,5054,1 //Assassin Mask
-2,5066,1 //Succubus Horn
-2,5072,1 //Incubus Horn
-2,5053,1 //Sphinx Hat
-2,616,1 //Old Card Album
-2,617,100 //Old Purple Box
-2,644,100 //Gift Box
-2,604,100 //Dead Branch
-2,603,600 //Old Blue Box
-2,604,100 //Dead Branch
+// Old Violet Box Obtainable Items Database
+//
+// Structure of Database:
+// GroupID,ItemID,Rate
+
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2102,1 //Guard
+2,2104,1 //Buckler
+2,2106,1 //Shield
+2,2108,1 //Mirror Shield
+2,2109,1 //Memory Book
+2,2112,1 //Novice Guard
+2,2302,1 //Cotton Shirt
+2,2304,1 //Jacket
+2,2306,1 //Adventurer's Suit
+2,2308,1 //Mantle
+2,2310,1 //Coat
+2,2311,1 //Mink Coat
+2,2313,1 //Padded Armor
+2,2315,1 //Chain Mail
+2,2317,1 //Full Plate
+2,2318,1 //Lord's Clothes
+2,2320,1 //Formal Suit
+2,2322,1 //Silk Robe
+2,2324,1 //Scapulare
+2,2326,1 //Saint's Robe
+2,2329,1 //Wooden Mail
+2,2331,1 //Tights
+2,2333,1 //Silver Robe
+2,2336,1 //Thief Clothes
+2,2337,1 //Ninja Suit
+2,2338,1 //Wedding Dress
+2,2339,1 //Pantie
+2,2340,1 //Novice Breastplate
+2,2352,1 //Tattered Novice Ninja Suit
+2,2402,1 //Sandals
+2,2404,1 //Shoes
+2,2406,1 //Boots
+2,2407,1 //Crystal Pumps
+2,2408,1 //Shackles
+2,2409,1 //High Heels
+2,2411,1 //Greaves
+2,2414,1 //Novice Slippers
+2,2502,1 //Hood
+2,2504,1 //Muffler
+2,2506,1 //Manteau
+2,2507,1 //Ancient Cape
+2,2508,1 //Ragamuffin Manteau
+2,2510,1 //Somber Novice Hood
+2,2601,1 //Ring
+2,2602,1 //Earring
+2,2603,1 //Necklace
+2,2604,1 //Glove
+2,2605,1 //Brooch
+2,2607,1 //Clip
+2,2608,1 //Rosary
+2,2609,1 //Skull Ring
+2,2610,1 //Gold Ring
+2,2611,1 //Silver Ring
+2,2612,1 //Flower Ring
+2,2613,1 //Diamond Ring
+2,2617,1 //Celebrant's Mitten
+2,2618,1 //Matyr's Leash
+2,2627,1 //Belt
+2,2628,1 //Novice Armlet
+2,1117,1 //Katana
+2,1152,1 //Slayer
+2,1155,1 //Bastard Sword
+2,1158,1 //Two-Handed Sword
+2,1162,1 //Broad Sword
+2,1163,1 //Claymore
+2,1251,1 //Jur
+2,1253,1 //Katar
+2,1255,1 //Jamadhar
+2,1256,1 //Katar of Frozen Icicle
+2,1257,1 //Katar of Quaking
+2,1258,1 //Katar of Raging Blaze
+2,1259,1 //Katar of Piercing Wind
+2,1352,1 //Battle Axe
+2,1355,1 //Hammer
+2,1358,1 //Buster
+2,1361,1 //Two-Handed Axe
+2,1411,1 //Lance
+2,1452,1 //Guisarme
+2,1455,1 //Glaive
+2,1458,1 //Partizan
+2,1461,1 //Trident
+2,1464,1 //Halberd
+2,1472,1 //Soul Staff
+2,1702,1 //Bow
+2,1705,1 //Composite Bow
+2,1708,1 //Great Bow
+2,1711,1 //Crossbow
+2,1715,1 //Arbalest
+2,1716,1 //Gakkung Bow
+2,1718,1 //Hunter Bow
+2,1102,1 //Sword
+2,1105,1 //Falchion
+2,1108,1 //Blade
+2,1111,1 //Rapier
+2,1114,1 //Scimitar
+2,1120,1 //Tsurugi
+2,1124,1 //Orcish sword
+2,1125,1 //Ring Pommel Saber
+2,1127,1 //Saber
+2,1128,1 //Haedonggum
+2,1129,1 //Flamberge
+2,1202,1 //Knife
+2,1205,1 //Cutter
+2,1208,1 //Main Gauche
+2,1211,1 //Dirk
+2,1214,1 //Dagger
+2,1217,1 //Stiletto
+2,1220,1 //Gladius
+2,1226,1 //Damascus
+2,1243,1 //Novice Main Gauche
+2,1302,1 //Axe
+2,1304,1 //Orcish Axe
+2,1402,1 //Javelin
+2,1405,1 //Spear
+2,1408,1 //Pike
+2,1502,1 //Club
+2,1505,1 //Mace
+2,1508,1 //Smasher
+2,1511,1 //Flail
+2,1514,1 //Morning Star
+2,1517,1 //Sword Mace
+2,1520,1 //Chain
+2,1522,1 //Stunner
+2,1550,1 //Book
+2,1551,1 //Bible
+2,1552,1 //Tablet
+2,1553,1 //Book of Billows
+2,1554,1 //Book of Mother Earth
+2,1555,1 //Book of the Blazing Sun
+2,1556,1 //Book of Gust of Wind
+2,1558,1 //Girl's Diary
+2,1602,1 //Rod
+2,1605,1 //Wand
+2,1608,1 //Staff
+2,1611,1 //Arc Wand
+2,1613,1 //Mighty Staff
+2,1614,1 //Wand of Occult
+2,1615,1 //Evil Bone Wand
+2,1802,1 //Waghnak
+2,1804,1 //Knuckle Duster
+2,1806,1 //Studded Knuckles
+2,1808,1 //Fist
+2,1810,1 //Claw
+2,1812,1 //Finger
+2,1902,1 //Violin
+2,1904,1 //Mandolin
+2,1906,1 //Lute
+2,1908,1 //Guitar
+2,1910,1 //Harp
+2,1912,1 //Gumoongoh
+2,1951,1 //Rope
+2,1953,1 //Whip
+2,1955,1 //Wire Whip
+2,1957,1 //Rante Whip
+2,1959,1 //Tail Whip
+2,1961,1 //Whip
+2,2201,1 //Sunglasses
+2,2203,1 //Glasses
+2,2205,1 //Diver Goggles
+2,2206,1 //Wedding Veil
+2,2207,1 //Fancy Flower
+2,2208,1 //Ribbon
+2,2209,1 //Ribbon
+2,2210,1 //Hair Band
+2,2211,1 //Bandana
+2,2212,1 //Eye Patch
+2,2213,1 //Kitty Band
+2,2214,1 //Bunny Band
+2,2215,1 //Flower Band
+2,2216,1 //Biretta
+2,2217,1 //Biretta
+2,2218,1 //Flu Mask
+2,2220,1 //Hat
+2,2221,1 //Hat
+2,2222,1 //Turban
+2,2223,1 //Turban
+2,2226,1 //Cap
+2,2227,1 //Cap
+2,2228,1 //Helm
+2,2229,1 //Helm
+2,2230,1 //Gemmed Sallet
+2,2231,1 //Gemmed Sallet
+2,2232,1 //Circlet
+2,2233,1 //Circlet
+2,2236,1 //Santa Hat
+2,2239,1 //Monocle
+2,2241,1 //Grandpa Beard
+2,2242,1 //Purple Glasses
+2,2243,1 //Geek Glasses
+2,2244,1 //Big Ribbon
+2,2245,1 //Sweet Gent
+2,2246,1 //Golden Gear
+2,2247,1 //Romantic Gent
+2,2248,1 //Western Grace
+2,2250,1 //Cute Ribbon
+2,2251,1 //Monk Hat
+2,2252,1 //Wizard Hat
+2,2253,1 //Sunflower
+2,2257,1 //Unicorn Horn
+2,2259,1 //Mini Propeller
+2,2260,1 //Mini Glasses
+2,2261,1 //Army Cap
+2,2262,1 //Clown Nose
+2,2263,1 //Zorro Masque
+2,2265,1 //Gangster Mask
+2,2266,1 //Iron Cain
+2,2267,1 //Cigarette
+2,2268,1 //Pipe
+2,2269,1 //Romantic Flower
+2,2270,1 //Romantic Leaf
+2,2271,1 //Jack be Dandy
+2,2275,1 //Red Bandana
+2,2276,1 //Angled Glasses
+2,2277,1 //Nurse Cap
+2,2279,1 //Bomb Wick
+2,2282,1 //Halo
+2,2285,1 //Apple of Archer
+2,2287,1 //Pirate Bandana
+2,2289,1 //Poo Poo Hat
+2,2290,1 //Funeral Hat
+2,2291,1 //Masquerade
+2,2294,1 //Stellar
+2,2295,1 //Blinker
+2,2298,1 //Green Feeler
+2,2299,1 //Orc Helm
+2,5003,1 //Joker Jester
+2,5006,1 //Machoman's Glasses
+2,5008,1 //Puppy Love
+2,5009,1 //Safety Helmet
+2,5010,1 //Indian Fillet
+2,5011,1 //Aerial
+2,5014,1 //Fin Helm
+2,5015,1 //Egg Shell
+2,5030,1 //Panda Hat
+2,5035,1 //Poring Hat
+2,5037,1 //Nutshell
+2,5055,1 //Novice False Eggshell
+2,2278,1 //Mr. Smile
+2,2288,1 //Mr. Scream
+2,2297,1 //Goblin Mask
+2,5005,1 //Gas Mask
+2,5088,1 //Surprised Mask
+2,5089,1 //Annoyed Mask
+2,5090,1 //Goblin Leader Mask
+2,2224,1 //Goggles
+2,2225,1 //Goggles
+2,10001,1 //Skull Helm
+2,10002,1 //Monster Oxygen Mask
+2,10003,1 //Transparent Headgear
+2,10004,1 //Pacifier
+2,10005,1 //Wig
+2,10006,1 //Queen's Hair Ornament
+2,10007,1 //Silk Ribbon
+2,10008,1 //Punisher
+2,10009,1 //Wild Flower
+2,10010,1 //Battered Pot
+2,10011,1 //Stellar Hairpin
+2,10012,1 //Tiny Egg Shell
+2,10013,1 //Backpack
+2,10014,1 //Rocker Glasses
+2,10015,1 //Green Lace
+2,10016,1 //Golden Bell
+2,10017,1 //Bark Shorts
+2,10018,1 //Monkey Circlet
+2,10019,1 //Red Scarf
+2,10020,1 //Grave Keeper's Sword
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,701,1 //Ora Ora
+2,702,1 //Animal Gore
+2,703,1 //Hinalle
+2,704,1 //Aloe
+2,705,1 //Clover
+2,706,1 //Four Leaf Clover
+2,707,1 //Singing Plant
+2,708,1 //Ment
+2,710,1 //Illusion Flower
+2,711,1 //Shoot
+2,712,1 //Flower
+2,713,1 //Empty Bottle
+2,714,1 //Emperium
+2,715,1 //Yellow Gemstone
+2,716,1 //Red Gemstone
+2,717,1 //Blue Gemstone
+2,718,1 //Garnet
+2,719,1 //Amethyst
+2,720,1 //Aquamarine
+2,721,1 //Emerald
+2,722,1 //Pearl
+2,723,1 //Ruby
+2,724,1 //Cursed Ruby
+2,725,1 //Sardonyx
+2,726,1 //Sapphire
+2,727,1 //Opal
+2,728,1 //Topaz
+2,729,1 //Zircon
+2,730,1 //1carat Diamond
+2,731,1 //2carat Diamond
+2,732,1 //3carat Diamond
+2,733,1 //Cracked Diamond
+2,734,1 //Red Frame
+2,735,1 //Chung Jah
+2,736,1 //China
+2,737,1 //Black Ladle
+2,738,1 //Pencil Case
+2,739,1 //Rouge
+2,740,1 //Puppet
+2,741,1 //Poring Doll
+2,742,1 //Chonchon Doll
+2,743,1 //Spore Doll
+2,744,1 //Bouquet
+2,745,1 //Wedding Bouquet
+2,746,1 //Glass Bead
+2,747,1 //Crystal Mirror
+2,748,1 //Witherless Rose
+2,749,1 //Frozen Rose
+2,750,1 //Baphomet Doll
+2,751,1 //Osiris Doll
+2,752,1 //Grasshopper Doll
+2,753,1 //Yoyo Doll
+2,754,1 //Raccoon Doll
+2,756,1 //Rough Oridecon
+2,757,1 //Rough Elunium
+2,901,1 //Danggie
+2,902,1 //Tree Root
+2,903,1 //Reptile Tongue
+2,904,1 //Scorpion Tail
+2,905,1 //Stem
+2,906,1 //Pointed Scale
+2,907,1 //Resin
+2,908,1 //Spawn
+2,909,1 //Jellopy
+2,910,1 //Garlet
+2,911,1 //Scell
+2,912,1 //Zargon
+2,913,1 //Tooth of Bat
+2,914,1 //Fluff
+2,915,1 //Chrysalis
+2,916,1 //Feather of Birds
+2,917,1 //Talon
+2,918,1 //Sticky Webfoot
+2,919,1 //Animal Skin
+2,920,1 //Wolf Claw
+2,921,1 //Mushroom Spore
+2,922,1 //Orc's Fang
+2,923,1 //Evil Horn
+2,924,1 //Powder of Butterfly
+2,925,1 //Bill of Birds
+2,926,1 //Snake Scale
+2,928,1 //Insect Feeler
+2,929,1 //Immortal Heart
+2,930,1 //Rotten Bandage
+2,931,1 //Orcish Voucher
+2,932,1 //Skel-Bone
+2,934,1 //Memento
+2,935,1 //Shell
+2,936,1 //Scale Shell
+2,937,1 //Venom Canine
+2,938,1 //Sticky Mucus
+2,939,1 //Bee Sting
+2,940,1 //Grasshopper's Leg
+2,941,1 //Nose Ring
+2,942,1 //Yoyo Tail
+2,943,1 //Solid Shell
+2,944,1 //Horseshoe
+2,945,1 //Raccoon Leaf
+2,946,1 //Snail's Shell
+2,947,1 //Horn
+2,948,1 //Bear's Footskin
+2,949,1 //Feather
+2,950,1 //Heart of Mermaid
+2,951,1 //Fin
+2,952,1 //Cactus Needle
+2,953,1 //Stone Heart
+2,954,1 //Shining Scale
+2,955,1 //Worm Peeling
+2,956,1 //Gill
+2,957,1 //Decayed Nail
+2,958,1 //Horrendous Mouth
+2,959,1 //Stinky Scale
+2,960,1 //Nipper
+2,961,1 //Conch
+2,962,1 //Tentacle
+2,963,1 //Sharp Scale
+2,964,1 //Crab Shell
+2,965,1 //Clam Shell
+2,966,1 //Clam Flesh
+2,967,1 //Turtle Shell
+2,968,1 //Heroic Emblem
+2,969,1 //Gold
+2,970,1 //Alcohol
+2,971,1 //Detrimindexta
+2,972,1 //Karvodailnirol
+2,973,1 //Counteragent
+2,974,1 //Mixture
+2,975,1 //Scarlet Dyestuff
+2,976,1 //Lemon Dyestuff
+2,978,1 //Cobaltblue Dyestuff
+2,979,1 //Darkgreen Dyestuff
+2,980,1 //Orange Dyestuff
+2,981,1 //Violet Dyestuff
+2,982,1 //White Dyestuff
+2,983,1 //Black Dyestuff
+2,984,1 //Oridecon
+2,985,1 //Elunium
+2,986,1 //Anvil
+2,987,1 //Oridecon Anvil
+2,988,1 //Golden Anvil
+2,989,1 //Emperium Anvil
+2,990,1 //Red Blood
+2,991,1 //Crystal Blue
+2,992,1 //Wind of Verdure
+2,993,1 //Green Live
+2,994,1 //Flame Heart
+2,995,1 //Mystic Frozen
+2,996,1 //Rough Wind
+2,997,1 //Great Nature
+2,998,1 //Iron
+2,999,1 //Steel
+2,1000,1 //Star Crumb
+2,1001,1 //Star Dust
+2,1002,1 //Iron Ore
+2,1003,1 //Coal
+2,1004,1 //Chivalry Emblem
+2,1005,1 //Hammer of Blacksmith
+2,1006,1 //Old Magicbook
+2,1007,1 //Necklace of Wisdom
+2,1008,1 //Necklace of Oblivion
+2,1009,1 //Hand of God
+2,1010,1 //Phracon
+2,1011,1 //Emveretarcon
+2,1012,1 //Frill
+2,1013,1 //Rainbow Shell
+2,1014,1 //Ant Jaw
+2,1015,1 //Tongue
+2,1016,1 //Rat Tail
+2,1017,1 //Mole Whiskers
+2,1018,1 //Mole Claw
+2,1019,1 //Trunk
+2,1020,1 //Black Hair
+2,1021,1 //Dokebi Horn
+2,1022,1 //Nine Tails
+2,1023,1 //Fish Tail
+2,1024,1 //Squid Ink
+2,1025,1 //Cobweb
+2,1026,1 //Acorn
+2,1027,1 //Porcupine Quill
+2,1028,1 //Mane
+2,1029,1 //Tiger Skin
+2,1030,1 //Tiger's Footskin
+2,1031,1 //Mantis Scythe
+2,1032,1 //Maneater Blossom
+2,1033,1 //Maneater Root
+2,1034,1 //Blue Hair
+2,1035,1 //Dragon Canine
+2,1036,1 //Dragon Scale
+2,1037,1 //Dragon Tail
+2,1038,1 //Little Evil Horn
+2,1039,1 //Little Evil Wing
+2,1040,1 //Elder Pixie's Moustache
+2,1041,1 //Lantern
+2,1042,1 //Bug Leg
+2,1043,1 //Orc Claw
+2,1044,1 //Zenorc's Fang
+2,1045,1 //Cultish Masque
+2,1046,1 //Scorpion Nipper
+2,1047,1 //Dead Medusa
+2,1048,1 //Horrendous Hair
+2,1049,1 //Skirt of Virgin
+2,1050,1 //Tendon
+2,1051,1 //Detonator
+2,1052,1 //Single Cell
+2,1053,1 //Ancient Tooth
+2,1054,1 //Ancient Lips
+2,1055,1 //Earthworm Peeling
+2,1056,1 //Grit
+2,1057,1 //Moth Dust
+2,1058,1 //Moth Wings
+2,1059,1 //Fabric
+2,1060,1 //Golden Hair
+2,1061,1 //Witched Starsand
+2,1062,1 //Jack o' Pumpkin
+2,1063,1 //Fang
+2,1064,1 //Reins
+2,1065,1 //Trap
+2,1066,1 //Fine-grained Trunk
+2,1067,1 //Solid Trunk
+2,1068,1 //Barren Trunk
+2,1088,1 //Morocc Solution
+2,1089,1 //Payon Solution
+2,1092,1 //Empty Test Tube
+2,1093,1 //Empty Potion Bottle
+2,1094,1 //Short Daenggie
+2,1095,1 //Clock Hand
+2,1096,1 //Round Shell
+2,1097,1 //Worn Out Page
+2,1098,1 //Manacles
+2,1099,1 //Worn-out Prison Uniform
+2,7001,1 //Mould Powder
+2,7002,1 //Ogre Tooth
+2,7003,1 //Anolian Skin
+2,7004,1 //Mud Lump
+2,7005,1 //Skull
+2,7006,1 //Wing of Red Bat
+2,7007,1 //Claw of Rat
+2,7008,1 //Stiff Horn
+2,7009,1 //Glitter Shell
+2,7010,1 //Tail of Steel Scorpion
+2,7011,1 //Claw of Monkey
+2,7012,1 //Tough Scalelike Stem
+2,7013,1 //Coral Reef
+2,7014,1 //Old Portrait
+2,7015,1 //Memory Bookmark
+2,7016,1 //Bent Spoon
+2,7026,1 //Clock_Tower_Key
+2,7027,1 //Key of the Underground
+2,7030,1 //Claw of Desert Wolf
+2,7031,1 //Old Frying Pan
+2,7032,1 //Piece of Egg Shell
+2,7033,1 //Poison Spore
+2,7034,1 //Red Stocking
+2,7035,1 //Matchstick
+2,7036,1 //Fang of Garm
+2,7038,1 //Yarn
+2,7041,1 //Fine Grit
+2,7047,1 //Alice's Apron
+2,7048,1 //Talon of Griffon
+2,7049,1 //Stone
+2,7053,1 //Cyfar
+2,7054,1 //Brigan
+2,7059,1 //Free Ticket for Kafra Storage
+2,7060,1 //Free Ticket for Kafra Transportation
+2,7061,1 //Free Ticket for the Cart Service
+2,7063,1 //Soft Feather
+2,7064,1 //Wing of Dragonfly
+2,7065,1 //Sea-Otter Fur
+2,7066,1 //Ice Cubic
+2,7067,1 //Stone Fragment
+2,7068,1 //Burnt Tree
+2,7069,1 //Destroyed Armor
+2,7070,1 //Broken Shell
+2,7071,1 //Tattered Clothes
+2,7072,1 //Old Shuriken
+2,7093,1 //Cogwheel
+2,7094,1 //Fragment
+2,7095,1 //Metal Fragment
+2,7096,1 //Lava
+2,7097,1 //Burning Heart
+2,7098,1 //Live Coal
+2,7099,1 //Worn-out Magic Scroll
+2,7100,1 //Sharp Leaf
+2,7101,1 //Peco Peco Feather
+2,7106,1 //Antelope Horn
+2,7107,1 //Antelope Skin
+2,7108,1 //Piece of Shield
+2,7109,1 //Shining Spear Blade
+2,7110,1 //Broken Sword
+2,7111,1 //Slick Paper
+2,7112,1 //Sharp Paper
+2,7113,1 //Broken Pharaoh Emblem
+2,7114,1 //Masque of Tutankhamen
+2,7115,1 //Harpy Feather
+2,7116,1 //Harpy Talon
+2,7117,1 //Torn Magic Book
+2,7118,1 //Torn Scroll
+2,7119,1 //Bacillus
+2,7120,1 //Burning Horseshoe
+2,7121,1 //Honey Pot
+2,7122,1 //Burning Hair
+2,7123,1 //Dragon Skin
+2,7124,1 //Sand Clump
+2,7125,1 //Scorpion Claw
+2,7126,1 //Large Jellopy
+2,7134,1 //Medicine Bowl
+2,7135,1 //Fire Bottle
+2,7136,1 //Acid Bottle
+2,7137,1 //Plant Bottle
+2,7138,1 //Marine Sphere Bottle
+2,7139,1 //Glistening Coat
+2,7149,1 //Yellow Plate
+2,7150,1 //Piece of Bamboo
+2,7151,1 //Oil Paper
+2,7152,1 //Glossy Hair
+2,7153,1 //Worn-out Kimono
+2,7154,1 //Poisonous Powder
+2,7155,1 //Poisonous Toad Skin
+2,7156,1 //Broken Shuriken
+2,7157,1 //Dark Mask
+2,7158,1 //Broken Liquor Jar
+2,7159,1 //Tengu Nose
+2,7161,1 //Black Bear Skin
+2,7162,1 //Cloud Crumb
+2,7163,1 //Hard Feeler
+2,7164,1 //Solid_Peach
+2,7165,1 //Transparent Celestial Robe
+2,7166,1 //Soft Silk
+2,7167,1 //Strange Steel Piece
+2,7168,1 //Giant Butterfly Wing
+2,7169,1 //Ba_Gua
+2,7170,1 //Tuxedo
+2,7171,1 //Leopard Skin
+2,7172,1 //Leopard Claw
+2,7174,1 //Wrapping Lace
+2,7175,1 //Wrapping Paper
+2,7182,1 //Cacao
+2,7186,1 //Thin Trunk
+2,7187,1 //Festival Mask
+2,7188,1 //Brown_Root
+2,7189,1 //Wooden Heart
+2,7190,1 //Solid Husk
+2,7191,1 //Lamp
+2,7192,1 //Vane
+2,7193,1 //Sprout
+2,7194,1 //Soft Blade of Grass
+2,7195,1 //Slingshot
+2,7196,1 //Shoulder Protector
+2,7197,1 //Tough Vines
+2,7198,1 //Huge Leaf
+2,7200,1 //Elastic Band
+2,7201,1 //Log
+2,7202,1 //Pincher of Beetle
+2,7203,1 //Strong Branch
+2,7205,1 //Piece of Black Cloth
+2,7206,1 //Black Cat Doll
+2,7207,1 //Old Manteau
+2,7208,1 //Rusty Kitchen Knife
+2,7209,1 //Helm of Dullahan
+2,7210,1 //Armor Piece of Dullahan
+2,7211,1 //Fragment of Rossata Stone
+2,7212,1 //Hung Doll
+2,7213,1 //Needle Packet
+2,7214,1 //Bat Cage
+2,7215,1 //Broken Needle
+2,7216,1 //Red Muffler
+2,7217,1 //Spool
+2,7218,1 //Decomposed Rope
+2,7219,1 //Striped Sock
+2,7220,1 //Ectoplasm
+2,7221,1 //Tangled Chains
+2,7222,1 //Wooden Gnarl
+2,7223,1 //Contorted Self-Portrait
+2,7225,1 //Pumpkin Lantern
+2,7262,1 //Folding Fan of Cat Ghost
+2,7263,1 //Cat's Eye
+2,7264,1 //Dry Sand
+2,7265,1 //Dragon Horn
+2,7266,1 //Denture from Dragon Mask
+2,7267,1 //Tiger Panty
+2,7268,1 //Little Ghost Doll
+2,7269,1 //Pinafore
+2,7270,1 //Nursing_Bottle
+2,1750,1 //Arrow
+2,1751,1 //Silver Arrow
+2,1752,1 //Fire Arrow
+2,1753,1 //Steel Arrow
+2,1754,1 //Crystal Arrow
+2,1755,1 //Arrow of Wind
+2,1756,1 //Stone Arrow
+2,1757,1 //Immaterial Arrow
+2,1758,1 //Stun Arrow
+2,1759,1 //Frozen Arrow
+2,1760,1 //Flash Arrow
+2,1761,1 //Cursed Arrow
+2,1762,1 //Rusty Arrow
+2,1763,1 //Poison Arrow
+2,1764,1 //Sharp Arrow
+2,1765,1 //Oridecon Arrow
+2,1767,1 //Shadow Arrow
+2,1768,1 //Sleep Arrow
+2,1769,1 //Mute Arrow
+2,1770,1 //Iron Arrow
+2,501,1 //Red Potion
+2,502,1 //Orange Potion
+2,503,1 //Yellow Potion
+2,504,1 //White Potion
+2,505,1 //Blue Potion
+2,506,1 //Green Potion
+2,507,1 //Red Herb
+2,508,1 //Yellow Herb
+2,509,1 //White Herb
+2,510,1 //Blue Herb
+2,511,1 //Green Herb
+2,512,1 //Apple
+2,513,1 //Banana
+2,514,1 //Grape
+2,515,1 //Carrot
+2,516,1 //Potato
+2,517,1 //Meat
+2,518,1 //Honey
+2,519,1 //Milk
+2,520,1 //Hinalle Leaflet
+2,521,1 //Aloe Leaflet
+2,522,1 //Mastela Fruit
+2,523,1 //Holy Water
+2,525,1 //Panacea
+2,526,1 //Royal Jelly
+2,528,1 //Monster Food
+2,529,1 //Candy
+2,530,1 //Candy Cane
+2,531,1 //Apple Juice
+2,532,1 //Banana Juice
+2,533,1 //Grape Juice
+2,534,1 //Carrot Juice
+2,535,1 //Pumpkin
+2,536,1 //Ice Cream
+2,537,1 //Pet Food
+2,538,1 //Well-baked Cookie
+2,539,1 //Piece of Cake
+2,544,1 //Raw Fish
+2,545,1 //Condensed Red Potion
+2,546,1 //Condensed Yellow Potion
+2,547,1 //Condensed White Potion
+2,548,1 //Cheese
+2,549,1 //Yam
+2,550,1 //Rice Cake
+2,551,1 //Sushi
+2,553,1 //Bao
+2,555,1 //Traditional Rice Cake
+2,558,1 //Chocolate
+2,561,1 //White Chocolate
+2,601,1 //Fly Wing
+2,602,1 //Butterfly Wing
+2,603,1 //Old Blue Box
+2,604,1 //Dead Branch
+2,605,1 //Anodyne
+2,606,1 //Aloevera
+2,607,1 //Yggdrasil Berry
+2,608,1 //Yggdrasil Seed
+2,609,1 //Amulet
+2,610,1 //Yggdrasil Leaf
+2,611,1 //Magnifier
+2,612,1 //Mini Furnace
+2,613,1 //Iron Hammer
+2,614,1 //Golden Hammer
+2,615,1 //Oridecon Hammer
+2,618,1 //Worn Out Scroll
+2,619,1 //Unripe Apple
+2,620,1 //Orange Juice
+2,621,1 //Bitter Herb
+2,622,1 //Rainbow Carrot
+2,623,1 //Earthworm the Dude
+2,624,1 //Rotten Fish
+2,625,1 //Rusty Iron
+2,626,1 //Monster Juice
+2,627,1 //Sweet Milk
+2,628,1 //Well-Dried Bone
+2,629,1 //Singing Flower
+2,630,1 //Dew Laden Moss
+2,631,1 //Deadly Noxious Herb
+2,632,1 //Fatty Chubby Earthworm
+2,633,1 //Sweet Potato
+2,634,1 //Tropical Banana
+2,635,1 //Orc Trophy
+2,636,1 //No Recipient
+2,637,1 //Old Broom
+2,638,1 //Silver Knife of Chastity
+2,639,1 //Armlet of Obedience
+2,640,1 //Shining Stone
+2,641,1 //Contracts in Shadow
+2,642,1 //Book of the Devil
+2,643,1 //Pet Incubator
+2,644,1 //Gift Box
+2,645,1 //Concentration Potion
+2,656,1 //Awakening Potion
+2,657,1 //Berserk Potion
+2,659,1 //Her Heart
+2,663,1 //Songpyun
+2,664,1 //Gift Box
+2,665,1 //Gift Box
+2,666,1 //Gift Box
+2,667,1 //Gift Box
+2,668,1 //Red_Envelope
+2,678,1 //Poison Bottle
+2,679,1 //Pilule
+2,2234,1 //Tiara
+2,2235,1 //Crown
+2,2249,1 //Coronet
+2,2254,1 //Angel Wing
+2,2255,1 //Evil Wing
+2,2258,1 //Spiky Band
+2,2256,1 //Majestic Goat
+2,2274,1 //Ghost Bandana
+2,2286,1 //Elven Ears
+2,2327,1 //Holy Robe
+2,2334,1 //Mage Coat
+2,2614,1 //Eye of Dullahan
+2,2615,1 //Safety Ring
+2,2616,1 //Critical Ring
+2,2621,1 //Ring
+2,2622,1 //Earring
+2,2623,1 //Necklace
+2,2624,1 //Glove
+2,2625,1 //Brooch
+2,2626,1 //Rosary
+2,5002,1 //Jewel Crown
+2,5085,1 //Small Ribbons
+2,5007,1 //Grand Circlet
+2,5017,1 //Bone Helm
+2,5019,1 //Corsair
+2,5054,1 //Assassin Mask
+2,5066,1 //Succubus Horn
+2,5072,1 //Incubus Horn
+2,5053,1 //Sphinx Hat
+2,616,1 //Old Card Album
+2,617,100 //Old Purple Box
+2,644,100 //Gift Box
+2,604,100 //Dead Branch
+2,603,600 //Old Blue Box
+2,604,100 //Dead Branch
diff --git a/db/job_db1.txt b/db/job_db1.txt
index 90b816af4..6b34f8b5f 100644
--- a/db/job_db1.txt
+++ b/db/job_db1.txt
@@ -1,155 +1,155 @@
-// Job-specific Values Database
-//
-// Structure of Database:
-// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher,Fuuma Shuriken
-//
-// Novice
-0, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Swordman
-1, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Magician
-2, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Archer
-3, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Acolyte
-4, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Merchant
-5, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Thief
-6, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Knight
-7, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Priest
-8, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Wizard
-9, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Blacksmith
-10, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Hunter
-11, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Assassin
-12, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Knight (Peco)
-13, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Crusader
-14, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Monk
-15, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sage
-16, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Rogue
-17, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Alchemist
-18, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Bard
-19, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Dancer
-20, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Crusader (Peco)
-21, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Wedding
-22, 20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Super Novice
-23, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Gunslinger
-24, 28000,88 , 0 ,450 ,500 ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 ,1500 , 700 ,1500 ,2000
-// Ninja
-25, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 550
-// Novice High
-4001, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Swordman High
-4002, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Magician High
-4003, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Archer High
-4004, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Acolyte High
-4005, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Merchant High
-4006, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Thief High
-4007, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Lord Knight
-4008, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// High Priest
-4009, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// High Wizard
-4010, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Whitesmith
-4011, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Sniper
-4012, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Assassin Cross
-4013, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Lord Knight (Peco)
-4014, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Paladin
-4015, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Champion
-4016, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Professor
-4017, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Stalker
-4018, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Creator
-4019, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Clown
-4020, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Gypsy
-4021, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Paladin (Peco)
-4022, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Novice
-4023, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Swordman
-4024, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Magician
-4025, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Archer
-4026, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Acolyte
-4027, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Merchant
-4028, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Thief
-4029, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Knight
-4030, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Priest
-4031, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Wizard
-4032, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Blacksmith
-4033, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Hunter
-4034, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Assassin
-4035, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Knight (Peco)
-4036, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Crusader
-4037, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Monk
-4038, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Sage
-4039, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Rogue
-4040, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Alchemist
-4041, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Bard
-4042, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Dancer
-4043, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Crusader (Peco)
-4044, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Baby Super Novice
-4045, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Taekwon
-4046, 28000,70 ,500 ,200 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Star Knight
-4047, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Star Knight (flying)
-4048, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-// Soul Linker
-4049, 24000,75 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Job-specific Values Database
+//
+// Structure of Database:
+// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher,Fuuma Shuriken
+//
+// Novice
+0, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Swordman
+1, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Magician
+2, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Archer
+3, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Acolyte
+4, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Merchant
+5, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Thief
+6, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Knight
+7, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Priest
+8, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Wizard
+9, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Blacksmith
+10, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Hunter
+11, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Assassin
+12, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Knight (Peco)
+13, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Crusader
+14, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Monk
+15, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Sage
+16, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Rogue
+17, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Alchemist
+18, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Bard
+19, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Dancer
+20, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Crusader (Peco)
+21, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Wedding
+22, 20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Super Novice
+23, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Gunslinger
+24, 28000,88 , 0 ,450 ,500 ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 750 ,1500 , 700 ,1500 ,2000
+// Ninja
+25, 26000,80 , 0 ,515 ,400 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 550
+// Novice High
+4001, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Swordman High
+4002, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Magician High
+4003, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Archer High
+4004, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Acolyte High
+4005, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Merchant High
+4006, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Thief High
+4007, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Lord Knight
+4008, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// High Priest
+4009, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// High Wizard
+4010, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Whitesmith
+4011, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Sniper
+4012, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Assassin Cross
+4013, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Lord Knight (Peco)
+4014, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Paladin
+4015, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Champion
+4016, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Professor
+4017, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Stalker
+4018, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Creator
+4019, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Clown
+4020, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Gypsy
+4021, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Paladin (Peco)
+4022, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Novice
+4023, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Swordman
+4024, 28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Magician
+4025, 22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Archer
+4026, 26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Acolyte
+4027, 24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Merchant
+4028, 28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Thief
+4029, 24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Knight
+4030, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Priest
+4031, 26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Wizard
+4032, 24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Blacksmith
+4033, 30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Hunter
+4034, 27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Assassin
+4035, 24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Knight (Peco)
+4036, 28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Crusader
+4037, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Monk
+4038, 26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Sage
+4039, 24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Rogue
+4040, 24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Alchemist
+4041, 30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Bard
+4042, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Dancer
+4043, 27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Crusader (Peco)
+4044, 28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Baby Super Novice
+4045, 20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Taekwon
+4046, 28000,70 ,500 ,200 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Star Knight
+4047, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Star Knight (flying)
+4048, 28000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+// Soul Linker
+4049, 24000,75 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
diff --git a/db/job_db2.txt b/db/job_db2.txt
index 17522e78d..0144624b9 100644
--- a/db/job_db2.txt
+++ b/db/job_db2.txt
@@ -1,163 +1,163 @@
-// 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
-//
-// Novice
-0,0,0,0,0,0,0,0,0,0
-// Swordman
-1,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
-// Magician
-2,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
-// Archer
-3,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
-// Acolyte
-4,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
-// Merchant
-5,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
-// Thief
-6,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
-// Knight
-7,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
-// Priest
-8,6,0,6,1,0,2,3,4,4,6,1,0,0,3,5,0,1,0,0,5,6,4,0,0,5,0,1,0,2,0,6,5,0,3,1,3,2,0,6,0,0,4,4,0,3,0,0,2,0,6
-// Wizard
-9,4,5,0,4,5,2,0,0,4,2,0,1,5,0,6,0,0,4,0,0,0,4,0,2,0,5,0,0,4,0,4,5,4,2,0,6,0,3,5,4,2,0,2,0,4,2,2,4,0,4
-// Blacksmith
-10,5,0,1,5,5,0,3,1,0,5,6,5,3,0,0,1,0,0,5,3,4,0,1,0,0,5,0,5,2,0,1,3,0,4,0,5,3,2,5,5,0,0,0,1,0,6,5,0,3,0
-// Hunter
-11,5,0,4,5,1,0,6,5,0,1,1,2,0,5,6,0,3,0,2,2,5,3,0,0,0,0,5,0,6,0,2,0,5,4,0,0,0,5,2,0,4,6,5,1,0,4,2,0,5,0
-// Assassin
-12,2,2,2,4,0,3,0,3,5,0,1,0,0,4,2,2,2,2,2,2,2,0,0,5,1,0,1,0,0,5,5,1,0,0,0,0,0,4,0,5,5,4,0,0,1,5,0,1,0,5
-// Knight (Peco)
-13,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
-// Crusader
-14,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
-// Monk
-15,1,1,0,5,2,0,3,0,0,2,0,1,1,0,6,4,0,2,0,3,2,5,2,0,3,1,1,0,0,5,0,6,3,0,2,0,0,4,0,6,3,0,5,2,0,3,0,0,1,1
-// Sage
-16,4,0,2,3,0,2,0,4,0,0,3,0,2,0,4,0,6,3,0,5,0,2,0,4,5,0,5,0,0,4,0,5,2,0,6,0,4,4,5,6,0,1,0,1,4,1,1,1,0,4
-// Rogue
-17,2,3,5,0,1,3,2,0,3,0,5,0,0,3,3,2,0,5,0,5,0,0,2,0,1,3,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,4,0,5
-// Alchemist
-18,4,5,5,0,0,1,0,5,4,0,2,0,5,2,1,0,4,0,5,3,5,0,4,4,5,1,0,5,4,0,3,5,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
-// Bard
-19,5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,5,3,0,5,6,4,0,0,2,0,0,0,1,0,2,0,5,3,0,2,0,0,5,0,4,6,0,3,0,0,5,4,2,0,5
-// Dancer
-20,6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,5,3,0,6,5,4,0,0,2,0,0,0,1,0,2,0,6,3,0,2,0,0,6,0,4,5,0,3,0,0,6,4,2,0,6
-// Crusader (Peco)
-21,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
-// 22: Wedding
-// Super Novice
-23,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,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
-// Gunslinger
-24,5,6,0,6,0,5,0,0,0,0,5,6,0,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,0,0,6,1,0,0,5,0,0,0,0,0,1,0,0,0,5,0,0,0,0,1,6,4,0,0,5,0,0,0,2,3,4,5,6,1,0,0,0,0,0,0
-// Ninja
-25,2,2,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,4,2,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,4,5,6,0,0,0,0,0,0
-// Novice High
-4001,0,0,0,0,0,0,0,0,0,0
-// Swordman High
-4002,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
-// Magician High
-4003,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
-// Archer High
-4004,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
-// Acolyte High
-4005,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
-// Merchant High
-4006,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
-// Thief High
-4007,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
-// Lord Knight
-4008,1,2,6,5,3,1,1,1,0,2,5,3,4,2,0,5,2,0,1,0,0,3,0,0,1,0,6,5,3,0,5,0,1,0,0,5,2,6,0,3,1,0,3,5,0,1,1,0,5,0,0,1,2,0,0,1,1,3,0,2,0,5,0,1,2,0,4,3,0,1
-// High Priest
-4009,4,0,2,3,1,0,4,2,0,0,4,1,5,0,0,5,0,0,2,4,1,3,4,4,0,5,0,5,2,3,1,0,0,4,0,0,5,1,0,6,0,2,5,0,1,5,4,0,6,3,3,0,0,0,2,5,4,3,0,1,4,5,0,0,2,4,3,2,0,4
-// High Wizard
-4010,4,5,3,0,4,0,0,2,5,4,0,6,0,4,0,0,5,2,4,1,0,5,5,4,0,2,0,4,3,0,5,4,0,2,0,0,4,4,4,1,6,0,5,0,0,4,3,0,4,2,0,0,3,0,4,2,6,0,4,1,5,4,0,0,2,3,5,0,2,4
-// Whitesmith
-4011,5,1,1,4,0,5,2,6,3,0,0,5,3,0,4,6,1,0,2,2,0,4,5,0,0,1,0,6,3,0,2,5,1,4,0,2,0,5,6,0,5,0,0,6,6,0,5,3,0,4,0,1,0,0,5,5,0,2,0,3,4,5,0,2,3,6,6,0,0,5
-// Sniper
-4012,5,2,5,5,4,2,0,1,0,2,2,3,0,6,0,5,5,0,0,4,2,5,0,1,6,5,0,2,0,5,6,3,2,0,5,6,0,2,0,5,0,4,2,0,1,5,0,2,0,6,5,0,0,4,3,0,6,2,0,5,1,6,0,0,4,0,0,0,5,6
-// Assassin Cross
-4013,2,1,6,2,2,0,1,6,3,5,0,1,0,0,2,6,0,6,0,2,1,0,5,2,2,6,0,0,1,0,2,2,2,6,0,0,5,1,5,0,0,2,5,0,0,2,3,6,0,1,2,0,5,1,0,2,5,0,0,0,5,2,0,5,6,1,0,0,3,5
-// Lord Knight (Peco)
-4014,1,2,6,5,3,1,1,1,0,2,5,3,4,2,0,5,2,0,1,0,0,3,0,0,1,0,6,5,3,0,5,0,1,0,0,5,2,6,0,3,1,0,3,5,0,1,1,0,5,0,0,1,2,0,0,1,1,3,0,2,0,5,0,1,2,0,4,3,0,1
-// Paladin
-4015,3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,5,1,0,0,3,0,5,2,0,1,0,0,4,3,0,0,1,0,0,5,2,0,6,1,0,3,4,0,5,0,0,1,3,0,0,2,3,4,1,0,5,0,6,2,4,0,3,1,4,0,6,5,3,2
-// Champion
-4016,1,4,3,2,0,5,0,0,1,0,4,2,6,0,3,5,1,0,0,2,2,5,0,3,0,0,1,0,2,5,0,0,4,6,0,0,1,5,3,0,0,3,0,5,2,6,4,1,0,5,0,2,5,0,0,4,0,3,1,5,0,2,0,4,1,1,5,3,4,2
-// Professor
-4017,4,4,2,0,1,0,3,5,0,0,4,2,0,4,0,5,0,1,0,5,6,4,2,3,0,5,1,0,5,4,0,2,0,5,0,1,5,4,3,0,4,0,2,0,1,5,0,0,4,2,0,5,0,2,5,1,4,0,0,2,0,5,3,4,0,6,0,4,2,4
-// Stalker
-4018,1,2,0,6,4,3,0,0,2,5,1,2,0,0,3,5,5,0,0,6,2,1,0,6,0,5,2,0,5,0,6,1,0,2,0,0,5,5,0,0,2,3,1,4,2,0,1,0,5,6,0,5,1,0,0,5,4,2,6,5,0,1,3,2,0,5,1,0,0,2
-// Creator
-4019,5,0,6,0,2,1,4,6,3,5,0,0,4,0,5,0,0,2,0,6,0,4,5,0,6,0,2,0,0,4,1,0,3,6,5,0,0,2,0,0,5,5,5,0,6,4,5,0,5,0,6,6,1,2,0,5,5,0,4,6,3,0,5,6,0,1,2,4,6,5
-// Clown
-4020,2,5,0,2,1,0,5,4,2,1,6,0,2,0,5,3,0,6,1,0,4,0,5,2,0,6,0,4,0,5,0,2,1,0,0,2,0,0,5,5,4,0,5,0,1,0,6,0,2,5,0,0,2,1,0,5,5,2,3,0,5,1,5,0,2,5,0,2,4,1
-// Gypsy
-4021,5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,0,5,5,2,4,6,5,0,0,2,0,5,0,1,0,0,2,4,0,5,0,5,0,5,0,2,0,5,1,0,2,4,3,0,0,2,5,0,4,2,2,6,0,5,1,2,0,5,2
-// Paladin (Peco)
-4022,3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,5,1,0,0,3,0,5,2,0,1,0,0,4,3,0,0,1,0,0,5,2,0,6,1,0,3,4,0,5,0,0,1,3,0,0,2,3,4,1,0,5,0,6,2,4,0,3,1,4,0,6,5,3,2
-// Baby Novice
-4023,0,0,0,0,0,0,0,0,0,0
-// Baby Swordman
-4024,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
-// Baby Magician
-4025,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
-// Baby Archer
-4026,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
-// Baby Acolyte
-4027,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
-// Baby Merchant
-4028,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
-// Baby Thief
-4029,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
-// Baby Knight
-4030,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
-// Baby Priest
-4031,6,0,6,1,0,2,3,4,4,6,1,0,0,3,5,0,1,0,0,5,6,4,0,0,5,0,1,0,2,0,6,5,0,3,1,3,2,0,6,0,0,4,4,0,3,0,0,2,0,6
-// Baby Wizard
-4032,4,5,0,4,5,2,0,0,4,2,0,1,5,0,6,0,0,4,0,0,0,4,0,2,0,5,0,0,4,0,4,5,4,2,0,6,0,3,5,4,2,0,2,0,4,2,2,4,0,4
-// Baby Blacksmith
-4033,5,0,1,5,5,0,3,1,0,5,6,5,3,0,0,1,0,0,5,3,4,0,1,0,0,5,0,5,2,0,1,3,0,4,0,5,3,2,5,5,0,0,0,1,0,6,5,0,3,0
-// Baby Hunter
-4034,5,0,4,5,1,0,6,5,0,1,1,2,0,5,6,0,3,0,2,2,5,3,0,0,0,0,5,0,6,0,2,0,5,4,0,0,0,5,2,0,4,6,5,1,0,4,2,0,5,0
-// Baby Assassin
-4035,2,2,2,4,0,3,0,3,5,0,1,0,0,4,2,2,2,2,2,2,2,0,0,5,1,0,1,0,0,5,5,1,0,0,0,0,0,4,0,5,5,4,0,0,1,5,0,1,0,5
-// Baby Knight (Peco)
-4036,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
-// Baby Crusader
-4037,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
-// Baby Monk
-4038,1,1,0,5,2,0,3,0,0,2,0,1,1,0,6,4,0,2,0,3,2,5,2,0,3,1,1,0,0,5,0,6,3,0,2,0,0,4,0,6,3,0,5,2,0,3,0,0,1,1
-// Baby Sage
-4039,4,0,2,3,0,2,0,4,0,0,3,0,2,0,4,0,6,3,0,5,0,2,0,4,5,0,5,0,0,4,0,5,2,0,6,0,4,4,5,6,0,1,0,1,4,1,1,1,0,4
-// Baby Rogue
-4040,2,3,5,0,1,3,2,0,3,0,5,0,0,3,3,2,0,5,0,5,0,0,2,0,1,3,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,4,0,5
-// Baby Alchemist
-4041,4,5,5,0,0,1,0,5,4,0,2,0,5,2,1,0,4,0,5,3,5,0,4,4,5,1,0,5,4,0,3,5,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
-// Baby Bard
-4042,5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,5,3,0,5,6,4,0,0,2,0,0,0,1,0,2,0,5,3,0,2,0,0,5,0,4,6,0,3,0,0,5,4,2,0,5
-// Baby Dancer
-4043,6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,5,3,0,6,5,4,0,0,2,0,0,0,1,0,2,0,6,3,0,2,0,0,6,0,4,5,0,3,0,0,6,4,2,0,6
-// Baby Crusader (Peco)
-4044,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,0,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
-// Baby Super Novice
-4045,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,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
-// Taekwon
-4046,1,1,1,1,1,1,0,0,0,5,5,5,5,5,5,0,0,0,0,2,2,2,2,2,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
-// Star Gladiator
-4047,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
-// Star Gladiator (Flying)
-4048,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
-// Soul Linker
-4049,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5
+// 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
+//
+// Novice
+0,0,0,0,0,0,0,0,0,0
+// Swordman
+1,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
+// Magician
+2,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
+// Archer
+3,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
+// Acolyte
+4,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
+// Merchant
+5,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
+// Thief
+6,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
+// Knight
+7,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
+// Priest
+8,6,0,6,1,0,2,3,4,4,6,1,0,0,3,5,0,1,0,0,5,6,4,0,0,5,0,1,0,2,0,6,5,0,3,1,3,2,0,6,0,0,4,4,0,3,0,0,2,0,6
+// Wizard
+9,4,5,0,4,5,2,0,0,4,2,0,1,5,0,6,0,0,4,0,0,0,4,0,2,0,5,0,0,4,0,4,5,4,2,0,6,0,3,5,4,2,0,2,0,4,2,2,4,0,4
+// Blacksmith
+10,5,0,1,5,5,0,3,1,0,5,6,5,3,0,0,1,0,0,5,3,4,0,1,0,0,5,0,5,2,0,1,3,0,4,0,5,3,2,5,5,0,0,0,1,0,6,5,0,3,0
+// Hunter
+11,5,0,4,5,1,0,6,5,0,1,1,2,0,5,6,0,3,0,2,2,5,3,0,0,0,0,5,0,6,0,2,0,5,4,0,0,0,5,2,0,4,6,5,1,0,4,2,0,5,0
+// Assassin
+12,2,2,2,4,0,3,0,3,5,0,1,0,0,4,2,2,2,2,2,2,2,0,0,5,1,0,1,0,0,5,5,1,0,0,0,0,0,4,0,5,5,4,0,0,1,5,0,1,0,5
+// Knight (Peco)
+13,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
+// Crusader
+14,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
+// Monk
+15,1,1,0,5,2,0,3,0,0,2,0,1,1,0,6,4,0,2,0,3,2,5,2,0,3,1,1,0,0,5,0,6,3,0,2,0,0,4,0,6,3,0,5,2,0,3,0,0,1,1
+// Sage
+16,4,0,2,3,0,2,0,4,0,0,3,0,2,0,4,0,6,3,0,5,0,2,0,4,5,0,5,0,0,4,0,5,2,0,6,0,4,4,5,6,0,1,0,1,4,1,1,1,0,4
+// Rogue
+17,2,3,5,0,1,3,2,0,3,0,5,0,0,3,3,2,0,5,0,5,0,0,2,0,1,3,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,4,0,5
+// Alchemist
+18,4,5,5,0,0,1,0,5,4,0,2,0,5,2,1,0,4,0,5,3,5,0,4,4,5,1,0,5,4,0,3,5,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
+// Bard
+19,5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,5,3,0,5,6,4,0,0,2,0,0,0,1,0,2,0,5,3,0,2,0,0,5,0,4,6,0,3,0,0,5,4,2,0,5
+// Dancer
+20,6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,5,3,0,6,5,4,0,0,2,0,0,0,1,0,2,0,6,3,0,2,0,0,6,0,4,5,0,3,0,0,6,4,2,0,6
+// Crusader (Peco)
+21,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
+// 22: Wedding
+// Super Novice
+23,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,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
+// Gunslinger
+24,5,6,0,6,0,5,0,0,0,0,5,6,0,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,0,0,6,1,0,0,5,0,0,0,0,0,1,0,0,0,5,0,0,0,0,1,6,4,0,0,5,0,0,0,2,3,4,5,6,1,0,0,0,0,0,0
+// Ninja
+25,2,2,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,4,2,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,4,5,6,0,0,0,0,0,0
+// Novice High
+4001,0,0,0,0,0,0,0,0,0,0
+// Swordman High
+4002,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
+// Magician High
+4003,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
+// Archer High
+4004,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
+// Acolyte High
+4005,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
+// Merchant High
+4006,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
+// Thief High
+4007,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
+// Lord Knight
+4008,1,2,6,5,3,1,1,1,0,2,5,3,4,2,0,5,2,0,1,0,0,3,0,0,1,0,6,5,3,0,5,0,1,0,0,5,2,6,0,3,1,0,3,5,0,1,1,0,5,0,0,1,2,0,0,1,1,3,0,2,0,5,0,1,2,0,4,3,0,1
+// High Priest
+4009,4,0,2,3,1,0,4,2,0,0,4,1,5,0,0,5,0,0,2,4,1,3,4,4,0,5,0,5,2,3,1,0,0,4,0,0,5,1,0,6,0,2,5,0,1,5,4,0,6,3,3,0,0,0,2,5,4,3,0,1,4,5,0,0,2,4,3,2,0,4
+// High Wizard
+4010,4,5,3,0,4,0,0,2,5,4,0,6,0,4,0,0,5,2,4,1,0,5,5,4,0,2,0,4,3,0,5,4,0,2,0,0,4,4,4,1,6,0,5,0,0,4,3,0,4,2,0,0,3,0,4,2,6,0,4,1,5,4,0,0,2,3,5,0,2,4
+// Whitesmith
+4011,5,1,1,4,0,5,2,6,3,0,0,5,3,0,4,6,1,0,2,2,0,4,5,0,0,1,0,6,3,0,2,5,1,4,0,2,0,5,6,0,5,0,0,6,6,0,5,3,0,4,0,1,0,0,5,5,0,2,0,3,4,5,0,2,3,6,6,0,0,5
+// Sniper
+4012,5,2,5,5,4,2,0,1,0,2,2,3,0,6,0,5,5,0,0,4,2,5,0,1,6,5,0,2,0,5,6,3,2,0,5,6,0,2,0,5,0,4,2,0,1,5,0,2,0,6,5,0,0,4,3,0,6,2,0,5,1,6,0,0,4,0,0,0,5,6
+// Assassin Cross
+4013,2,1,6,2,2,0,1,6,3,5,0,1,0,0,2,6,0,6,0,2,1,0,5,2,2,6,0,0,1,0,2,2,2,6,0,0,5,1,5,0,0,2,5,0,0,2,3,6,0,1,2,0,5,1,0,2,5,0,0,0,5,2,0,5,6,1,0,0,3,5
+// Lord Knight (Peco)
+4014,1,2,6,5,3,1,1,1,0,2,5,3,4,2,0,5,2,0,1,0,0,3,0,0,1,0,6,5,3,0,5,0,1,0,0,5,2,6,0,3,1,0,3,5,0,1,1,0,5,0,0,1,2,0,0,1,1,3,0,2,0,5,0,1,2,0,4,3,0,1
+// Paladin
+4015,3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,5,1,0,0,3,0,5,2,0,1,0,0,4,3,0,0,1,0,0,5,2,0,6,1,0,3,4,0,5,0,0,1,3,0,0,2,3,4,1,0,5,0,6,2,4,0,3,1,4,0,6,5,3,2
+// Champion
+4016,1,4,3,2,0,5,0,0,1,0,4,2,6,0,3,5,1,0,0,2,2,5,0,3,0,0,1,0,2,5,0,0,4,6,0,0,1,5,3,0,0,3,0,5,2,6,4,1,0,5,0,2,5,0,0,4,0,3,1,5,0,2,0,4,1,1,5,3,4,2
+// Professor
+4017,4,4,2,0,1,0,3,5,0,0,4,2,0,4,0,5,0,1,0,5,6,4,2,3,0,5,1,0,5,4,0,2,0,5,0,1,5,4,3,0,4,0,2,0,1,5,0,0,4,2,0,5,0,2,5,1,4,0,0,2,0,5,3,4,0,6,0,4,2,4
+// Stalker
+4018,1,2,0,6,4,3,0,0,2,5,1,2,0,0,3,5,5,0,0,6,2,1,0,6,0,5,2,0,5,0,6,1,0,2,0,0,5,5,0,0,2,3,1,4,2,0,1,0,5,6,0,5,1,0,0,5,4,2,6,5,0,1,3,2,0,5,1,0,0,2
+// Creator
+4019,5,0,6,0,2,1,4,6,3,5,0,0,4,0,5,0,0,2,0,6,0,4,5,0,6,0,2,0,0,4,1,0,3,6,5,0,0,2,0,0,5,5,5,0,6,4,5,0,5,0,6,6,1,2,0,5,5,0,4,6,3,0,5,6,0,1,2,4,6,5
+// Clown
+4020,2,5,0,2,1,0,5,4,2,1,6,0,2,0,5,3,0,6,1,0,4,0,5,2,0,6,0,4,0,5,0,2,1,0,0,2,0,0,5,5,4,0,5,0,1,0,6,0,2,5,0,0,2,1,0,5,5,2,3,0,5,1,5,0,2,5,0,2,4,1
+// Gypsy
+4021,5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,0,5,5,2,4,6,5,0,0,2,0,5,0,1,0,0,2,4,0,5,0,5,0,5,0,2,0,5,1,0,2,4,3,0,0,2,5,0,4,2,2,6,0,5,1,2,0,5,2
+// Paladin (Peco)
+4022,3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,5,1,0,0,3,0,5,2,0,1,0,0,4,3,0,0,1,0,0,5,2,0,6,1,0,3,4,0,5,0,0,1,3,0,0,2,3,4,1,0,5,0,6,2,4,0,3,1,4,0,6,5,3,2
+// Baby Novice
+4023,0,0,0,0,0,0,0,0,0,0
+// Baby Swordman
+4024,0,1,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,2,0,0,1,0,0,5,0,3,0,1,0,3,0,6,0,2,1,0,1,1
+// Baby Magician
+4025,0,4,0,0,0,5,0,0,0,5,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,6,0,0,4,0,0,5,0,4,0,2,0,6,0,4,0,4,2,0,6,4
+// Baby Archer
+4026,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,5,0,0,2,0,0,5,0,1,0,1,0,5,0,6,0,3,4,0,2,5
+// Baby Acolyte
+4027,0,6,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,2,0,0,0,1,0,0,0,3,0,0,4,0,0,5,0,6,0,2,0,1,0,3,0,4,5,0,1,6
+// Baby Merchant
+4028,0,3,0,0,0,5,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,6,0,5,0,1,2,5,0,1,0,6,3,0,1,5
+// Baby Thief
+4029,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,1,0,0,2,0,0,1,0,2,0,6,0,5,0,3,0,6,1,0,5,2
+// Baby Knight
+4030,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
+// Baby Priest
+4031,6,0,6,1,0,2,3,4,4,6,1,0,0,3,5,0,1,0,0,5,6,4,0,0,5,0,1,0,2,0,6,5,0,3,1,3,2,0,6,0,0,4,4,0,3,0,0,2,0,6
+// Baby Wizard
+4032,4,5,0,4,5,2,0,0,4,2,0,1,5,0,6,0,0,4,0,0,0,4,0,2,0,5,0,0,4,0,4,5,4,2,0,6,0,3,5,4,2,0,2,0,4,2,2,4,0,4
+// Baby Blacksmith
+4033,5,0,1,5,5,0,3,1,0,5,6,5,3,0,0,1,0,0,5,3,4,0,1,0,0,5,0,5,2,0,1,3,0,4,0,5,3,2,5,5,0,0,0,1,0,6,5,0,3,0
+// Baby Hunter
+4034,5,0,4,5,1,0,6,5,0,1,1,2,0,5,6,0,3,0,2,2,5,3,0,0,0,0,5,0,6,0,2,0,5,4,0,0,0,5,2,0,4,6,5,1,0,4,2,0,5,0
+// Baby Assassin
+4035,2,2,2,4,0,3,0,3,5,0,1,0,0,4,2,2,2,2,2,2,2,0,0,5,1,0,1,0,0,5,5,1,0,0,0,0,0,4,0,5,5,4,0,0,1,5,0,1,0,5
+// Baby Knight (Peco)
+4036,3,0,3,1,6,0,0,3,0,1,5,3,2,0,1,0,3,3,5,6,1,0,3,0,0,0,1,6,3,0,5,0,1,0,0,3,6,2,0,5,0,0,3,0,0,1,1,5,5,0
+// Baby Crusader
+4037,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,4,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
+// Baby Monk
+4038,1,1,0,5,2,0,3,0,0,2,0,1,1,0,6,4,0,2,0,3,2,5,2,0,3,1,1,0,0,5,0,6,3,0,2,0,0,4,0,6,3,0,5,2,0,3,0,0,1,1
+// Baby Sage
+4039,4,0,2,3,0,2,0,4,0,0,3,0,2,0,4,0,6,3,0,5,0,2,0,4,5,0,5,0,0,4,0,5,2,0,6,0,4,4,5,6,0,1,0,1,4,1,1,1,0,4
+// Baby Rogue
+4040,2,3,5,0,1,3,2,0,3,0,5,0,0,3,3,2,0,5,0,5,0,0,2,0,1,3,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,4,0,5
+// Baby Alchemist
+4041,4,5,5,0,0,1,0,5,4,0,2,0,5,2,1,0,4,0,5,3,5,0,4,4,5,1,0,5,4,0,3,5,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
+// Baby Bard
+4042,5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,5,3,0,5,6,4,0,0,2,0,0,0,1,0,2,0,5,3,0,2,0,0,5,0,4,6,0,3,0,0,5,4,2,0,5
+// Baby Dancer
+4043,6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,5,3,0,6,5,4,0,0,2,0,0,0,1,0,2,0,6,3,0,2,0,0,6,0,4,5,0,3,0,0,6,4,2,0,6
+// Baby Crusader (Peco)
+4044,6,6,6,6,6,0,1,0,4,0,1,3,0,5,3,0,1,0,0,4,4,3,1,0,1,0,0,5,0,2,0,1,0,5,0,2,0,4,0,3,3,0,0,4,0,3,0,1,0,3
+// Baby Super Novice
+4045,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,2,0,3,0,4,0,5,0,6,0,1,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,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
+// Taekwon
+4046,1,1,1,1,1,1,0,0,0,5,5,5,5,5,5,0,0,0,0,2,2,2,2,2,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
+// Star Gladiator
+4047,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
+// Star Gladiator (Flying)
+4048,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
+// Soul Linker
+4049,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5
diff --git a/db/map_index.txt b/db/map_index.txt
index 5ae260858..50b73b8c0 100644
--- a/db/map_index.txt
+++ b/db/map_index.txt
@@ -1,696 +1,696 @@
-//======================================================================================
-// Map Index
-//======================================================================================
-//Contains the list of maps with their respective IDs for inter-server use.
-//IDs must never change, therefore any new maps need to be added at the end,
-//and old ones must not be removed, but may be replaced.
-//Format:
-//mapname<tab>index <- specifies index for this map
-//mapname <- map will use index of previous map +1
-//Note that map index 0 is special and reserved for "error" status.
-//Note: The extension is optional, all maps will have their extension set to
-// ".gat" upon loading.
-unknown.gat 0
-alb_ship.gat
-alb2trea.gat
-alberta.gat
-alberta_in.gat
-alde_dun01.gat
-alde_dun02.gat
-alde_dun03.gat
-alde_dun04.gat
-aldeba_in.gat
-aldebaran.gat
-anthell01.gat
-anthell02.gat
-arena_room.gat
-c_tower1.gat
-c_tower2.gat
-c_tower3.gat
-c_tower4.gat
-force_1-1.gat
-force_1-2.gat
-force_1-3.gat
-force_2-1.gat
-force_2-2.gat
-force_2-3.gat
-force_3-1.gat
-force_3-2.gat
-force_3-3.gat
-gef_dun00.gat
-gef_dun01.gat
-gef_dun02.gat
-gef_dun03.gat
-gef_fild00.gat
-gef_fild01.gat
-gef_fild02.gat
-gef_fild03.gat
-gef_fild04.gat
-gef_fild05.gat
-gef_fild06.gat
-gef_fild07.gat
-gef_fild08.gat
-gef_fild09.gat
-gef_fild10.gat
-gef_fild11.gat
-gef_fild12.gat
-gef_fild13.gat
-gef_fild14.gat
-gef_tower.gat
-geffen.gat
-geffen_in.gat
-gl_cas01.gat
-gl_cas02.gat
-gl_church.gat
-gl_chyard.gat
-gl_dun01.gat
-gl_dun02.gat
-gl_in01.gat
-gl_knt01.gat
-gl_knt02.gat
-gl_prison.gat
-gl_prison1.gat
-gl_sew01.gat
-gl_sew02.gat
-gl_sew03.gat
-gl_sew04.gat
-gl_step.gat
-glast_01.gat
-hunter_1-1.gat
-hunter_2-1.gat
-hunter_3-1.gat
-in_hunter.gat
-in_moc_16.gat
-in_orcs01.gat
-in_sphinx1.gat
-in_sphinx2.gat
-in_sphinx3.gat
-in_sphinx4.gat
-in_sphinx5.gat
-iz_dun00.gat
-iz_dun01.gat
-iz_dun02.gat
-iz_dun03.gat
-iz_dun04.gat
-job_sword1.gat
-izlu2dun.gat
-izlude.gat
-izlude_in.gat
-job_thief1.gat
-knight_1-1.gat
-knight_2-1.gat
-knight_3-1.gat
-mjo_dun01.gat
-mjo_dun02.gat
-mjo_dun03.gat
-mjolnir_01.gat
-mjolnir_02.gat
-mjolnir_03.gat
-mjolnir_04.gat
-mjolnir_05.gat
-mjolnir_06.gat
-mjolnir_07.gat
-mjolnir_08.gat
-mjolnir_09.gat
-mjolnir_10.gat
-mjolnir_11.gat
-mjolnir_12.gat
-moc_castle.gat
-moc_fild01.gat
-moc_fild02.gat
-moc_fild03.gat
-moc_fild04.gat
-moc_fild05.gat
-moc_fild06.gat
-moc_fild07.gat
-moc_fild08.gat
-moc_fild09.gat
-moc_fild10.gat
-moc_fild11.gat
-moc_fild12.gat
-moc_fild13.gat
-moc_fild14.gat
-moc_fild15.gat
-moc_fild16.gat
-moc_fild17.gat
-moc_fild18.gat
-moc_fild19.gat
-moc_pryd01.gat
-moc_pryd02.gat
-moc_pryd03.gat
-moc_pryd04.gat
-moc_pryd05.gat
-moc_pryd06.gat
-moc_prydb1.gat
-moc_ruins.gat
-monk_in.gat
-morocc.gat
-morocc_in.gat
-new_1-1.gat
-new_1-2.gat
-new_1-3.gat
-new_1-4.gat
-new_2-1.gat
-new_2-2.gat
-new_2-3.gat
-new_2-4.gat
-new_3-1.gat
-new_3-2.gat
-new_3-3.gat
-new_3-4.gat
-new_4-1.gat
-new_4-2.gat
-new_4-3.gat
-new_4-4.gat
-new_5-1.gat
-new_5-2.gat
-new_5-3.gat
-new_5-4.gat
-orcsdun01.gat
-orcsdun02.gat
-ordeal_1-1.gat
-ordeal_1-2.gat
-ordeal_1-3.gat
-ordeal_1-4.gat
-ordeal_2-1.gat
-ordeal_2-2.gat
-ordeal_2-3.gat
-ordeal_2-4.gat
-ordeal_3-1.gat
-ordeal_3-2.gat
-ordeal_3-3.gat
-ordeal_3-4.gat
-pay_arche.gat
-pay_dun00.gat
-pay_dun01.gat
-pay_dun02.gat
-pay_dun03.gat
-pay_dun04.gat
-pay_fild01.gat
-pay_fild02.gat
-pay_fild03.gat
-pay_fild04.gat
-pay_fild05.gat
-pay_fild06.gat
-pay_fild07.gat
-pay_fild08.gat
-pay_fild09.gat
-pay_fild10.gat
-pay_fild11.gat
-payon.gat
-payon_in01.gat
-payon_in02.gat
-priest_1-1.gat
-priest_2-1.gat
-priest_3-1.gat
-prontera.gat
-prt_are_in.gat
-prt_are01.gat
-pvp_room.gat
-prt_castle.gat
-prt_church.gat
-prt_fild00.gat
-prt_fild01.gat
-prt_fild02.gat
-prt_fild03.gat
-prt_fild04.gat
-prt_fild05.gat
-prt_fild06.gat
-prt_fild07.gat
-prt_fild08.gat
-prt_fild09.gat
-prt_fild10.gat
-prt_fild11.gat
-prt_in.gat
-prt_maze01.gat
-prt_maze02.gat
-prt_maze03.gat
-prt_monk.gat
-prt_sewb1.gat
-prt_sewb2.gat
-prt_sewb3.gat
-prt_sewb4.gat
-pvp_2vs2.gat
-pvp_c_room.gat
-pvp_n_1-1.gat
-pvp_n_1-2.gat
-pvp_n_1-3.gat
-pvp_n_1-4.gat
-pvp_n_1-5.gat
-pvp_n_2-1.gat
-pvp_n_2-2.gat
-pvp_n_2-3.gat
-pvp_n_2-4.gat
-pvp_n_2-5.gat
-pvp_n_3-1.gat
-pvp_n_3-2.gat
-pvp_n_3-3.gat
-pvp_n_3-4.gat
-pvp_n_3-5.gat
-pvp_n_4-1.gat
-pvp_n_4-2.gat
-pvp_n_4-3.gat
-pvp_n_4-4.gat
-pvp_n_4-5.gat
-pvp_n_5-1.gat
-pvp_n_5-2.gat
-pvp_n_5-3.gat
-pvp_n_5-4.gat
-pvp_n_5-5.gat
-pvp_n_6-1.gat
-pvp_n_6-2.gat
-pvp_n_6-3.gat
-pvp_n_6-4.gat
-pvp_n_6-5.gat
-pvp_n_7-1.gat
-pvp_n_7-2.gat
-pvp_n_7-3.gat
-pvp_n_7-4.gat
-pvp_n_7-5.gat
-pvp_n_8-1.gat
-pvp_n_8-2.gat
-pvp_n_8-3.gat
-pvp_n_8-4.gat
-pvp_n_8-5.gat
-pvp_n_room.gat
-pvp_y_1-1.gat
-pvp_y_1-2.gat
-pvp_y_1-3.gat
-pvp_y_1-4.gat
-pvp_y_1-5.gat
-pvp_y_2-1.gat
-pvp_y_2-2.gat
-pvp_y_2-3.gat
-pvp_y_2-4.gat
-pvp_y_2-5.gat
-pvp_y_3-1.gat
-pvp_y_3-2.gat
-pvp_y_3-3.gat
-pvp_y_3-4.gat
-pvp_y_3-5.gat
-pvp_y_4-1.gat
-pvp_y_4-2.gat
-pvp_y_4-3.gat
-pvp_y_4-4.gat
-pvp_y_4-5.gat
-pvp_y_5-1.gat
-pvp_y_5-2.gat
-pvp_y_5-3.gat
-pvp_y_5-4.gat
-pvp_y_5-5.gat
-pvp_y_6-1.gat
-pvp_y_6-2.gat
-pvp_y_6-3.gat
-pvp_y_6-4.gat
-pvp_y_6-5.gat
-pvp_y_7-1.gat
-pvp_y_7-2.gat
-pvp_y_7-3.gat
-pvp_y_7-4.gat
-pvp_y_7-5.gat
-pvp_y_8-1.gat
-pvp_y_8-2.gat
-pvp_y_8-3.gat
-pvp_y_8-4.gat
-pvp_y_8-5.gat
-pvp_y_room.gat
-sword_1-1.gat
-sword_2-1.gat
-sword_3-1.gat
-treasure01.gat
-treasure02.gat
-wizard_1-1.gat
-wizard_2-1.gat
-wizard_3-1.gat
-xmas.gat
-xmas_dun01.gat
-xmas_dun02.gat
-xmas_fild01.gat
-xmas_in.gat
-beach_dun.gat
-beach_dun2.gat
-beach_dun3.gat
-cmd_fild01.gat
-cmd_fild02.gat
-cmd_fild03.gat
-cmd_fild04.gat
-cmd_fild05.gat
-cmd_fild06.gat
-cmd_fild07.gat
-cmd_fild08.gat
-cmd_fild09.gat
-cmd_in01.gat
-cmd_in02.gat
-comodo.gat
-quiz_00.gat
-quiz_01.gat
-g_room1-1.gat
-g_room1-2.gat
-g_room1-3.gat
-g_room2.gat
-tur_dun01.gat
-tur_dun02.gat
-tur_dun03.gat
-tur_dun04.gat
-tur_dun05.gat
-tur_dun06.gat
-alde_gld.gat
-aldeg_cas01.gat
-aldeg_cas02.gat
-aldeg_cas03.gat
-aldeg_cas04.gat
-aldeg_cas05.gat
-gefg_cas01.gat
-gefg_cas02.gat
-gefg_cas03.gat
-gefg_cas04.gat
-gefg_cas05.gat
-gld_dun01.gat
-gld_dun02.gat
-gld_dun03.gat
-gld_dun04.gat
-guild_room.gat
-guild_vs1.gat
-guild_vs2.gat
-guild_vs3.gat
-guild_vs4.gat
-guild_vs5.gat
-guild_vs1-1.gat
-guild_vs1-2.gat
-guild_vs1-3.gat
-guild_vs1-4.gat
-guild_vs2-1.gat
-guild_vs2-2.gat
-job_hunte.gat
-job_knt.gat
-job_prist.gat
-job_wiz.gat
-pay_gld.gat
-payg_cas01.gat
-payg_cas02.gat
-payg_cas03.gat
-payg_cas04.gat
-payg_cas05.gat
-prt_gld.gat
-prtg_cas01.gat
-prtg_cas02.gat
-prtg_cas03.gat
-prtg_cas04.gat
-prtg_cas05.gat
-alde_alche.gat
-in_rogue.gat
-job_cru.gat
-job_duncer.gat
-job_monk.gat
-job_sage.gat
-mag_dun01.gat
-mag_dun02.gat
-monk_test.gat
-quiz_test.gat
-yuno.gat
-yuno_fild01.gat
-yuno_fild02.gat
-yuno_fild03.gat
-yuno_fild04.gat
-yuno_in01.gat
-yuno_in02.gat
-yuno_in03.gat
-yuno_in04.gat
-yuno_in05.gat
-ama_dun01.gat
-ama_dun02.gat
-ama_dun03.gat
-ama_fild01.gat
-ama_in01.gat
-ama_in02.gat
-ama_test.gat
-amatsu.gat
-gon_dun01.gat
-gon_dun02.gat
-gon_dun03.gat
-gon_fild01.gat
-gon_in.gat
-gon_test.gat
-gonryun.gat
-sec_in01.gat
-sec_in02.gat
-sec_pri.gat
-umbala.gat
-um_dun01.gat
-um_dun02.gat
-um_fild01.gat
-um_fild02.gat
-um_fild03.gat
-um_fild04.gat
-um_in.gat
-niflheim.gat
-nif_fild01.gat
-nif_fild02.gat
-nif_in.gat
-yggdrasil01.gat
-valkyrie.gat
-himinn.gat
-lou_in01.gat
-lou_in02.gat
-lou_dun03.gat
-lou_dun02.gat
-lou_dun01.gat
-lou_fild01.gat
-louyang.gat
-siege_test.gat
-n_castle.gat
-nguild_gef.gat
-nguild_prt.gat
-nguild_pay.gat
-nguild_alde.gat
-jawaii.gat
-jawaii_in.gat
-gefenia01.gat
-gefenia02.gat
-gefenia03.gat
-gefenia04.gat
-new_zone01.gat
-new_zone02.gat
-new_zone03.gat
-new_zone04.gat
-payon_in03.gat
-ayothaya.gat
-ayo_in01.gat
-ayo_in02.gat
-ayo_fild01.gat
-ayo_fild02.gat
-ayo_dun01.gat
-ayo_dun02.gat
-que_god01.gat
-que_god02.gat
-yuno_fild05.gat
-yuno_fild07.gat
-yuno_fild08.gat
-yuno_fild09.gat
-yuno_fild11.gat
-yuno_fild12.gat
-alde_tt02.gat
-turbo_n_1.gat
-turbo_n_4.gat
-turbo_n_8.gat
-turbo_n_16.gat
-turbo_e_4.gat
-turbo_e_8.gat
-turbo_e_16.gat
-turbo_room.gat
-airplane.gat
-airport.gat
-einbech.gat
-einbroch.gat
-ein_dun01.gat
-ein_dun02.gat
-ein_fild06.gat
-ein_fild07.gat
-ein_fild08.gat
-ein_fild09.gat
-ein_fild10.gat
-ein_in01.gat
-que_sign01.gat
-que_sign02.gat
-ein_fild03.gat
-ein_fild04.gat
-lhz_fild02.gat
-lhz_fild03.gat
-yuno_pre.gat
-lhz_fild01.gat
-lighthalzen.gat
-lhz_in01.gat
-lhz_in02.gat
-lhz_in03.gat
-lhz_que01.gat
-lhz_dun01.gat
-lhz_dun02.gat
-lhz_dun03.gat
-lhz_cube.gat
-juperos_01.gat
-juperos_02.gat
-jupe_area1.gat
-jupe_area2.gat
-jupe_core.gat
-jupe_ele.gat
-jupe_ele_r.gat
-jupe_gate.gat
-y_airport.gat
-lhz_airport.gat
-airplane_01.gat
-jupe_cave.gat
-quiz_02.gat
-hu_fild07.gat
-hu_fild05.gat
-hu_fild04.gat
-hu_fild01.gat
-yuno_fild06.gat
-job_soul.gat
-job_star.gat
-que_job01.gat
-que_job02.gat
-que_job03.gat
-abyss_01.gat
-abyss_02.gat
-abyss_03.gat
-thana_step.gat
-thana_boss.gat
-tha_scene01.gat
-tha_t01.gat
-tha_t02.gat
-tha_t03.gat
-tha_t04.gat
-tha_t07.gat
-tha_t05.gat
-tha_t06.gat
-tha_t08.gat
-tha_t09.gat
-tha_t10.gat
-tha_t11.gat
-tha_t12.gat
-auction_01.gat
-auction_02.gat
-hugel.gat
-hu_in01.gat
-que_bingo.gat
-que_hugel.gat
-p_track01.gat
-p_track02.gat
-odin_tem01.gat
-odin_tem02.gat
-odin_tem03.gat
-hu_fild02.gat
-hu_fild03.gat
-hu_fild06.gat
-ein_fild01.gat
-ein_fild02.gat
-ein_fild05.gat
-yuno_fild10.gat
-kh_kiehl02.gat
-kh_kiehl01.gat
-kh_dun02.gat
-kh_dun01.gat
-kh_mansion.gat
-kh_rossi.gat
-kh_school.gat
-kh_vila.gat
-force_map1.gat
-force_map2.gat
-force_map3.gat
-job_hunter.gat
-job_knight.gat
-job_priest.gat
-job_wizard.gat
-g_room2.gat
-rachel.gat
-ra_in01.gat
-ra_fild01.gat
-ra_fild02.gat
-ra_fild03.gat
-ra_fild04.gat
-ra_fild05.gat
-ra_fild06.gat
-ra_fild07.gat
-ra_fild08.gat
-ra_fild09.gat
-ra_fild10.gat
-ra_fild11.gat
-ra_fild12.gat
-ra_fild13.gat
-ra_san01.gat
-ra_san02.gat
-ra_san03.gat
-ra_san04.gat
-ra_san05.gat
-ra_temin.gat
-ra_temple.gat
-ra_temsky.gat
-que_rachel.gat
-ice_dun01.gat
-ice_dun02.gat
-ice_dun03.gat
-ice_dun04.gat
-//======================================================================================
-// - Other/Extra maps -
-// Only add maps under this line if they are not standard maps!
-//======================================================================================
-rwc01.gat 1000
-rwc02.gat
-rwc03.gat
-prontera_x.gat
-alberta_x.gat
-aldebaran_x.gat
-geffen_x.gat
-izlude_x.gat
-prt_church_x.gat
-prontera_s.gat
-pay_arche_s.gat
-xmas_old.gat
-ordeal_a00.gat
-ordeal_a02.gat
-fay_vilg00.gat
-fay_vilg01.gat
-gef_vilg00.gat
-gef_vilg01.gat
-moc_dugn01.gat
-moc_dugn02.gat
-moc_fild01.gat
-moc_fild02.gat
-moc_fild03.gat
-moc_fild04.gat
-moc_intr00.gat
-moc_intr01.gat
-moc_intr02.gat
-moc_intr04.gat
-moc_vilg00.gat
-moc_vilg01.gat
-moc_vilg02.gat
-probemap.gat
-probemap02.gat
-prt_cstl01.gat
-prt_dugn00.gat
-prt_dugn01.gat
-prt_fild00.gat
-prt_fild01.gat
-prt_fild03.gat
-prt_fild04.gat
-prt_fild05.gat
-prt_intr01.gat
-prt_intr01_a.gat
-prt_intr02.gat
-prt_vilg00.gat
-prt_vilg01.gat
-prt_vilg02.gat
-tank_test.gat
-tank_test2.gat
-test.gat
-poring_c01.gat
-poring_c02.gat
-que_ng.gat
-//======================================================================================
-//Place your custom maps with a starting ID here.
-//======================================================================================
-//Example:
-//
-//mymap.gat 1250
-//mymap-2.gat
+//======================================================================================
+// Map Index
+//======================================================================================
+//Contains the list of maps with their respective IDs for inter-server use.
+//IDs must never change, therefore any new maps need to be added at the end,
+//and old ones must not be removed, but may be replaced.
+//Format:
+//mapname<tab>index <- specifies index for this map
+//mapname <- map will use index of previous map +1
+//Note that map index 0 is special and reserved for "error" status.
+//Note: The extension is optional, all maps will have their extension set to
+// ".gat" upon loading.
+unknown.gat 0
+alb_ship.gat
+alb2trea.gat
+alberta.gat
+alberta_in.gat
+alde_dun01.gat
+alde_dun02.gat
+alde_dun03.gat
+alde_dun04.gat
+aldeba_in.gat
+aldebaran.gat
+anthell01.gat
+anthell02.gat
+arena_room.gat
+c_tower1.gat
+c_tower2.gat
+c_tower3.gat
+c_tower4.gat
+force_1-1.gat
+force_1-2.gat
+force_1-3.gat
+force_2-1.gat
+force_2-2.gat
+force_2-3.gat
+force_3-1.gat
+force_3-2.gat
+force_3-3.gat
+gef_dun00.gat
+gef_dun01.gat
+gef_dun02.gat
+gef_dun03.gat
+gef_fild00.gat
+gef_fild01.gat
+gef_fild02.gat
+gef_fild03.gat
+gef_fild04.gat
+gef_fild05.gat
+gef_fild06.gat
+gef_fild07.gat
+gef_fild08.gat
+gef_fild09.gat
+gef_fild10.gat
+gef_fild11.gat
+gef_fild12.gat
+gef_fild13.gat
+gef_fild14.gat
+gef_tower.gat
+geffen.gat
+geffen_in.gat
+gl_cas01.gat
+gl_cas02.gat
+gl_church.gat
+gl_chyard.gat
+gl_dun01.gat
+gl_dun02.gat
+gl_in01.gat
+gl_knt01.gat
+gl_knt02.gat
+gl_prison.gat
+gl_prison1.gat
+gl_sew01.gat
+gl_sew02.gat
+gl_sew03.gat
+gl_sew04.gat
+gl_step.gat
+glast_01.gat
+hunter_1-1.gat
+hunter_2-1.gat
+hunter_3-1.gat
+in_hunter.gat
+in_moc_16.gat
+in_orcs01.gat
+in_sphinx1.gat
+in_sphinx2.gat
+in_sphinx3.gat
+in_sphinx4.gat
+in_sphinx5.gat
+iz_dun00.gat
+iz_dun01.gat
+iz_dun02.gat
+iz_dun03.gat
+iz_dun04.gat
+job_sword1.gat
+izlu2dun.gat
+izlude.gat
+izlude_in.gat
+job_thief1.gat
+knight_1-1.gat
+knight_2-1.gat
+knight_3-1.gat
+mjo_dun01.gat
+mjo_dun02.gat
+mjo_dun03.gat
+mjolnir_01.gat
+mjolnir_02.gat
+mjolnir_03.gat
+mjolnir_04.gat
+mjolnir_05.gat
+mjolnir_06.gat
+mjolnir_07.gat
+mjolnir_08.gat
+mjolnir_09.gat
+mjolnir_10.gat
+mjolnir_11.gat
+mjolnir_12.gat
+moc_castle.gat
+moc_fild01.gat
+moc_fild02.gat
+moc_fild03.gat
+moc_fild04.gat
+moc_fild05.gat
+moc_fild06.gat
+moc_fild07.gat
+moc_fild08.gat
+moc_fild09.gat
+moc_fild10.gat
+moc_fild11.gat
+moc_fild12.gat
+moc_fild13.gat
+moc_fild14.gat
+moc_fild15.gat
+moc_fild16.gat
+moc_fild17.gat
+moc_fild18.gat
+moc_fild19.gat
+moc_pryd01.gat
+moc_pryd02.gat
+moc_pryd03.gat
+moc_pryd04.gat
+moc_pryd05.gat
+moc_pryd06.gat
+moc_prydb1.gat
+moc_ruins.gat
+monk_in.gat
+morocc.gat
+morocc_in.gat
+new_1-1.gat
+new_1-2.gat
+new_1-3.gat
+new_1-4.gat
+new_2-1.gat
+new_2-2.gat
+new_2-3.gat
+new_2-4.gat
+new_3-1.gat
+new_3-2.gat
+new_3-3.gat
+new_3-4.gat
+new_4-1.gat
+new_4-2.gat
+new_4-3.gat
+new_4-4.gat
+new_5-1.gat
+new_5-2.gat
+new_5-3.gat
+new_5-4.gat
+orcsdun01.gat
+orcsdun02.gat
+ordeal_1-1.gat
+ordeal_1-2.gat
+ordeal_1-3.gat
+ordeal_1-4.gat
+ordeal_2-1.gat
+ordeal_2-2.gat
+ordeal_2-3.gat
+ordeal_2-4.gat
+ordeal_3-1.gat
+ordeal_3-2.gat
+ordeal_3-3.gat
+ordeal_3-4.gat
+pay_arche.gat
+pay_dun00.gat
+pay_dun01.gat
+pay_dun02.gat
+pay_dun03.gat
+pay_dun04.gat
+pay_fild01.gat
+pay_fild02.gat
+pay_fild03.gat
+pay_fild04.gat
+pay_fild05.gat
+pay_fild06.gat
+pay_fild07.gat
+pay_fild08.gat
+pay_fild09.gat
+pay_fild10.gat
+pay_fild11.gat
+payon.gat
+payon_in01.gat
+payon_in02.gat
+priest_1-1.gat
+priest_2-1.gat
+priest_3-1.gat
+prontera.gat
+prt_are_in.gat
+prt_are01.gat
+pvp_room.gat
+prt_castle.gat
+prt_church.gat
+prt_fild00.gat
+prt_fild01.gat
+prt_fild02.gat
+prt_fild03.gat
+prt_fild04.gat
+prt_fild05.gat
+prt_fild06.gat
+prt_fild07.gat
+prt_fild08.gat
+prt_fild09.gat
+prt_fild10.gat
+prt_fild11.gat
+prt_in.gat
+prt_maze01.gat
+prt_maze02.gat
+prt_maze03.gat
+prt_monk.gat
+prt_sewb1.gat
+prt_sewb2.gat
+prt_sewb3.gat
+prt_sewb4.gat
+pvp_2vs2.gat
+pvp_c_room.gat
+pvp_n_1-1.gat
+pvp_n_1-2.gat
+pvp_n_1-3.gat
+pvp_n_1-4.gat
+pvp_n_1-5.gat
+pvp_n_2-1.gat
+pvp_n_2-2.gat
+pvp_n_2-3.gat
+pvp_n_2-4.gat
+pvp_n_2-5.gat
+pvp_n_3-1.gat
+pvp_n_3-2.gat
+pvp_n_3-3.gat
+pvp_n_3-4.gat
+pvp_n_3-5.gat
+pvp_n_4-1.gat
+pvp_n_4-2.gat
+pvp_n_4-3.gat
+pvp_n_4-4.gat
+pvp_n_4-5.gat
+pvp_n_5-1.gat
+pvp_n_5-2.gat
+pvp_n_5-3.gat
+pvp_n_5-4.gat
+pvp_n_5-5.gat
+pvp_n_6-1.gat
+pvp_n_6-2.gat
+pvp_n_6-3.gat
+pvp_n_6-4.gat
+pvp_n_6-5.gat
+pvp_n_7-1.gat
+pvp_n_7-2.gat
+pvp_n_7-3.gat
+pvp_n_7-4.gat
+pvp_n_7-5.gat
+pvp_n_8-1.gat
+pvp_n_8-2.gat
+pvp_n_8-3.gat
+pvp_n_8-4.gat
+pvp_n_8-5.gat
+pvp_n_room.gat
+pvp_y_1-1.gat
+pvp_y_1-2.gat
+pvp_y_1-3.gat
+pvp_y_1-4.gat
+pvp_y_1-5.gat
+pvp_y_2-1.gat
+pvp_y_2-2.gat
+pvp_y_2-3.gat
+pvp_y_2-4.gat
+pvp_y_2-5.gat
+pvp_y_3-1.gat
+pvp_y_3-2.gat
+pvp_y_3-3.gat
+pvp_y_3-4.gat
+pvp_y_3-5.gat
+pvp_y_4-1.gat
+pvp_y_4-2.gat
+pvp_y_4-3.gat
+pvp_y_4-4.gat
+pvp_y_4-5.gat
+pvp_y_5-1.gat
+pvp_y_5-2.gat
+pvp_y_5-3.gat
+pvp_y_5-4.gat
+pvp_y_5-5.gat
+pvp_y_6-1.gat
+pvp_y_6-2.gat
+pvp_y_6-3.gat
+pvp_y_6-4.gat
+pvp_y_6-5.gat
+pvp_y_7-1.gat
+pvp_y_7-2.gat
+pvp_y_7-3.gat
+pvp_y_7-4.gat
+pvp_y_7-5.gat
+pvp_y_8-1.gat
+pvp_y_8-2.gat
+pvp_y_8-3.gat
+pvp_y_8-4.gat
+pvp_y_8-5.gat
+pvp_y_room.gat
+sword_1-1.gat
+sword_2-1.gat
+sword_3-1.gat
+treasure01.gat
+treasure02.gat
+wizard_1-1.gat
+wizard_2-1.gat
+wizard_3-1.gat
+xmas.gat
+xmas_dun01.gat
+xmas_dun02.gat
+xmas_fild01.gat
+xmas_in.gat
+beach_dun.gat
+beach_dun2.gat
+beach_dun3.gat
+cmd_fild01.gat
+cmd_fild02.gat
+cmd_fild03.gat
+cmd_fild04.gat
+cmd_fild05.gat
+cmd_fild06.gat
+cmd_fild07.gat
+cmd_fild08.gat
+cmd_fild09.gat
+cmd_in01.gat
+cmd_in02.gat
+comodo.gat
+quiz_00.gat
+quiz_01.gat
+g_room1-1.gat
+g_room1-2.gat
+g_room1-3.gat
+g_room2.gat
+tur_dun01.gat
+tur_dun02.gat
+tur_dun03.gat
+tur_dun04.gat
+tur_dun05.gat
+tur_dun06.gat
+alde_gld.gat
+aldeg_cas01.gat
+aldeg_cas02.gat
+aldeg_cas03.gat
+aldeg_cas04.gat
+aldeg_cas05.gat
+gefg_cas01.gat
+gefg_cas02.gat
+gefg_cas03.gat
+gefg_cas04.gat
+gefg_cas05.gat
+gld_dun01.gat
+gld_dun02.gat
+gld_dun03.gat
+gld_dun04.gat
+guild_room.gat
+guild_vs1.gat
+guild_vs2.gat
+guild_vs3.gat
+guild_vs4.gat
+guild_vs5.gat
+guild_vs1-1.gat
+guild_vs1-2.gat
+guild_vs1-3.gat
+guild_vs1-4.gat
+guild_vs2-1.gat
+guild_vs2-2.gat
+job_hunte.gat
+job_knt.gat
+job_prist.gat
+job_wiz.gat
+pay_gld.gat
+payg_cas01.gat
+payg_cas02.gat
+payg_cas03.gat
+payg_cas04.gat
+payg_cas05.gat
+prt_gld.gat
+prtg_cas01.gat
+prtg_cas02.gat
+prtg_cas03.gat
+prtg_cas04.gat
+prtg_cas05.gat
+alde_alche.gat
+in_rogue.gat
+job_cru.gat
+job_duncer.gat
+job_monk.gat
+job_sage.gat
+mag_dun01.gat
+mag_dun02.gat
+monk_test.gat
+quiz_test.gat
+yuno.gat
+yuno_fild01.gat
+yuno_fild02.gat
+yuno_fild03.gat
+yuno_fild04.gat
+yuno_in01.gat
+yuno_in02.gat
+yuno_in03.gat
+yuno_in04.gat
+yuno_in05.gat
+ama_dun01.gat
+ama_dun02.gat
+ama_dun03.gat
+ama_fild01.gat
+ama_in01.gat
+ama_in02.gat
+ama_test.gat
+amatsu.gat
+gon_dun01.gat
+gon_dun02.gat
+gon_dun03.gat
+gon_fild01.gat
+gon_in.gat
+gon_test.gat
+gonryun.gat
+sec_in01.gat
+sec_in02.gat
+sec_pri.gat
+umbala.gat
+um_dun01.gat
+um_dun02.gat
+um_fild01.gat
+um_fild02.gat
+um_fild03.gat
+um_fild04.gat
+um_in.gat
+niflheim.gat
+nif_fild01.gat
+nif_fild02.gat
+nif_in.gat
+yggdrasil01.gat
+valkyrie.gat
+himinn.gat
+lou_in01.gat
+lou_in02.gat
+lou_dun03.gat
+lou_dun02.gat
+lou_dun01.gat
+lou_fild01.gat
+louyang.gat
+siege_test.gat
+n_castle.gat
+nguild_gef.gat
+nguild_prt.gat
+nguild_pay.gat
+nguild_alde.gat
+jawaii.gat
+jawaii_in.gat
+gefenia01.gat
+gefenia02.gat
+gefenia03.gat
+gefenia04.gat
+new_zone01.gat
+new_zone02.gat
+new_zone03.gat
+new_zone04.gat
+payon_in03.gat
+ayothaya.gat
+ayo_in01.gat
+ayo_in02.gat
+ayo_fild01.gat
+ayo_fild02.gat
+ayo_dun01.gat
+ayo_dun02.gat
+que_god01.gat
+que_god02.gat
+yuno_fild05.gat
+yuno_fild07.gat
+yuno_fild08.gat
+yuno_fild09.gat
+yuno_fild11.gat
+yuno_fild12.gat
+alde_tt02.gat
+turbo_n_1.gat
+turbo_n_4.gat
+turbo_n_8.gat
+turbo_n_16.gat
+turbo_e_4.gat
+turbo_e_8.gat
+turbo_e_16.gat
+turbo_room.gat
+airplane.gat
+airport.gat
+einbech.gat
+einbroch.gat
+ein_dun01.gat
+ein_dun02.gat
+ein_fild06.gat
+ein_fild07.gat
+ein_fild08.gat
+ein_fild09.gat
+ein_fild10.gat
+ein_in01.gat
+que_sign01.gat
+que_sign02.gat
+ein_fild03.gat
+ein_fild04.gat
+lhz_fild02.gat
+lhz_fild03.gat
+yuno_pre.gat
+lhz_fild01.gat
+lighthalzen.gat
+lhz_in01.gat
+lhz_in02.gat
+lhz_in03.gat
+lhz_que01.gat
+lhz_dun01.gat
+lhz_dun02.gat
+lhz_dun03.gat
+lhz_cube.gat
+juperos_01.gat
+juperos_02.gat
+jupe_area1.gat
+jupe_area2.gat
+jupe_core.gat
+jupe_ele.gat
+jupe_ele_r.gat
+jupe_gate.gat
+y_airport.gat
+lhz_airport.gat
+airplane_01.gat
+jupe_cave.gat
+quiz_02.gat
+hu_fild07.gat
+hu_fild05.gat
+hu_fild04.gat
+hu_fild01.gat
+yuno_fild06.gat
+job_soul.gat
+job_star.gat
+que_job01.gat
+que_job02.gat
+que_job03.gat
+abyss_01.gat
+abyss_02.gat
+abyss_03.gat
+thana_step.gat
+thana_boss.gat
+tha_scene01.gat
+tha_t01.gat
+tha_t02.gat
+tha_t03.gat
+tha_t04.gat
+tha_t07.gat
+tha_t05.gat
+tha_t06.gat
+tha_t08.gat
+tha_t09.gat
+tha_t10.gat
+tha_t11.gat
+tha_t12.gat
+auction_01.gat
+auction_02.gat
+hugel.gat
+hu_in01.gat
+que_bingo.gat
+que_hugel.gat
+p_track01.gat
+p_track02.gat
+odin_tem01.gat
+odin_tem02.gat
+odin_tem03.gat
+hu_fild02.gat
+hu_fild03.gat
+hu_fild06.gat
+ein_fild01.gat
+ein_fild02.gat
+ein_fild05.gat
+yuno_fild10.gat
+kh_kiehl02.gat
+kh_kiehl01.gat
+kh_dun02.gat
+kh_dun01.gat
+kh_mansion.gat
+kh_rossi.gat
+kh_school.gat
+kh_vila.gat
+force_map1.gat
+force_map2.gat
+force_map3.gat
+job_hunter.gat
+job_knight.gat
+job_priest.gat
+job_wizard.gat
+g_room2.gat
+rachel.gat
+ra_in01.gat
+ra_fild01.gat
+ra_fild02.gat
+ra_fild03.gat
+ra_fild04.gat
+ra_fild05.gat
+ra_fild06.gat
+ra_fild07.gat
+ra_fild08.gat
+ra_fild09.gat
+ra_fild10.gat
+ra_fild11.gat
+ra_fild12.gat
+ra_fild13.gat
+ra_san01.gat
+ra_san02.gat
+ra_san03.gat
+ra_san04.gat
+ra_san05.gat
+ra_temin.gat
+ra_temple.gat
+ra_temsky.gat
+que_rachel.gat
+ice_dun01.gat
+ice_dun02.gat
+ice_dun03.gat
+ice_dun04.gat
+//======================================================================================
+// - Other/Extra maps -
+// Only add maps under this line if they are not standard maps!
+//======================================================================================
+rwc01.gat 1000
+rwc02.gat
+rwc03.gat
+prontera_x.gat
+alberta_x.gat
+aldebaran_x.gat
+geffen_x.gat
+izlude_x.gat
+prt_church_x.gat
+prontera_s.gat
+pay_arche_s.gat
+xmas_old.gat
+ordeal_a00.gat
+ordeal_a02.gat
+fay_vilg00.gat
+fay_vilg01.gat
+gef_vilg00.gat
+gef_vilg01.gat
+moc_dugn01.gat
+moc_dugn02.gat
+moc_fild01.gat
+moc_fild02.gat
+moc_fild03.gat
+moc_fild04.gat
+moc_intr00.gat
+moc_intr01.gat
+moc_intr02.gat
+moc_intr04.gat
+moc_vilg00.gat
+moc_vilg01.gat
+moc_vilg02.gat
+probemap.gat
+probemap02.gat
+prt_cstl01.gat
+prt_dugn00.gat
+prt_dugn01.gat
+prt_fild00.gat
+prt_fild01.gat
+prt_fild03.gat
+prt_fild04.gat
+prt_fild05.gat
+prt_intr01.gat
+prt_intr01_a.gat
+prt_intr02.gat
+prt_vilg00.gat
+prt_vilg01.gat
+prt_vilg02.gat
+tank_test.gat
+tank_test2.gat
+test.gat
+poring_c01.gat
+poring_c02.gat
+que_ng.gat
+//======================================================================================
+//Place your custom maps with a starting ID here.
+//======================================================================================
+//Example:
+//
+//mymap.gat 1250
+//mymap-2.gat
diff --git a/db/mob_avail.txt b/db/mob_avail.txt
index b97c5c032..fc8a73934 100644
--- a/db/mob_avail.txt
+++ b/db/mob_avail.txt
@@ -1,59 +1,59 @@
-// for mobs
-// mob_id,sprite_id,equip #
-// Use another mob's sprite for a monster. 0 for sprite will disable mob.
-// Mob must have an equipment it's pet counterpart can use or it will cause problems. If no equip use 0.
-// The following if a player sprite is used
-// MobID,SpriteID,Sex,Hair,Hair_Color,Weapon,Shield,Head_Top,Head_Middle,Head_Bottom,Option,Dye_Color
-// Use Item ID for weapons and shields, not View ID.
-
-//1002,1039 //Poring,Baphomet (Make Porings look like Baphomet)
-
-//Crusader quest monsters with poring stats
-1910,1036,0
-1911,1132,0
-1912,1257,0
-1913,1164,0
-1914,1276,0
-
-// Easter Event Monsters
-1920,1047,0
-1921,1093,0
-
-// eAthena Dev Team
-// Valaris
-1900,4013,1,1,1,1254,0,67,12,54,16,1
-// Valaris Worshiper
-1901,6,1,1,1,1219,2101,67,12,54,0,1
-// MC Cameri
-1902,14,1,6,6,1101,2105,0,0,0,32,3
-// Poki#3
-1903,4012,1,21,0,1720,0,102,184,57,16,0
-// Sentry
-1904,1286,0
-
-// eAthena Custom Equipped Mobs
-1970,1002,10013
-1971,1011,10002
-1972,1014,10017
-1973,1019,10010
-1974,1023,10009
-1975,1026,10008
-1976,1029,10006
-1977,1031,10013
-1978,1035,10002
-1979,1042,10002
-1980,1049,10012
-1981,1052,10014
-1982,1056,10019
-1983,1057,10018
-1984,1063,10007
-1985,1077,10017
-1986,1101,10001
-1987,1107,10003
-1988,1109,10004
-1989,1110,10005
-1990,1113,10013
-1991,1155,10011
-1992,1167,10015
-1993,1170,10016
-1994,1188,10020
+// for mobs
+// mob_id,sprite_id,equip #
+// Use another mob's sprite for a monster. 0 for sprite will disable mob.
+// Mob must have an equipment it's pet counterpart can use or it will cause problems. If no equip use 0.
+// The following if a player sprite is used
+// MobID,SpriteID,Sex,Hair,Hair_Color,Weapon,Shield,Head_Top,Head_Middle,Head_Bottom,Option,Dye_Color
+// Use Item ID for weapons and shields, not View ID.
+
+//1002,1039 //Poring,Baphomet (Make Porings look like Baphomet)
+
+//Crusader quest monsters with poring stats
+1910,1036,0
+1911,1132,0
+1912,1257,0
+1913,1164,0
+1914,1276,0
+
+// Easter Event Monsters
+1920,1047,0
+1921,1093,0
+
+// eAthena Dev Team
+// Valaris
+1900,4013,1,1,1,1254,0,67,12,54,16,1
+// Valaris Worshiper
+1901,6,1,1,1,1219,2101,67,12,54,0,1
+// MC Cameri
+1902,14,1,6,6,1101,2105,0,0,0,32,3
+// Poki#3
+1903,4012,1,21,0,1720,0,102,184,57,16,0
+// Sentry
+1904,1286,0
+
+// eAthena Custom Equipped Mobs
+1970,1002,10013
+1971,1011,10002
+1972,1014,10017
+1973,1019,10010
+1974,1023,10009
+1975,1026,10008
+1976,1029,10006
+1977,1031,10013
+1978,1035,10002
+1979,1042,10002
+1980,1049,10012
+1981,1052,10014
+1982,1056,10019
+1983,1057,10018
+1984,1063,10007
+1985,1077,10017
+1986,1101,10001
+1987,1107,10003
+1988,1109,10004
+1989,1110,10005
+1990,1113,10013
+1991,1155,10011
+1992,1167,10015
+1993,1170,10016
+1994,1188,10020
diff --git a/db/mob_boss.txt b/db/mob_boss.txt
index 6e1cc5231..431665c0a 100644
--- a/db/mob_boss.txt
+++ b/db/mob_boss.txt
@@ -1,47 +1,47 @@
-// Bloody Branch Summonable Monsters Database
-//
-// Structure of Database:
-// MobID,DummyName,Rate
-
-0,Baphomet,1039
-//1022,Werewolf,1000000
-1038,Osiris,1000000
-1039,Baphomet,1000000
-1046,Doppelganger,1000000
-1059,Mistress,1000000
-1086,Golden Thief Bug,1000000
-1087,Orc Hero,1000000
-1112,Drake,1000000
-1115,Eddga,1000000
-1147,Maya,1000000
-1150,Moonlight,1000000
-1157,Pharaoh,1000000
-1159,Phreeoni,1000000
-1190,Orc Lord,1000000
-1251,Stormy Knight,1000000
-1252,Garm,1000000
-1272,Dark Lord,1000000
-1312,Turtle General,1000000
-1373,Lord of Death,1000000
-1389,Dracula,1000000
-1418,Evil Snake Lord,1000000
-1492,Incantation Samurai,1000000
-1511,Amon Ra,1000000
-1518,Bacsojin,1000000
-1583,Tao Gunka,1000000
-1623,RSX 0806,1000000
-1685,Vesper,1000000
-1688,Lady Tany,1000000
-1719,Detale,1000000
-
-//== Not "Normal" MvP's. (Level 99 or Quest ones)
-//1646,Lord Knight Seyren,1000000
-//1647,Assassin Cross Eremes,1000000
-//1648,Whitesmith Harword,1000000
-//1649,High Priest Magaleta,1000000
-//1650,Sniper Shecil,1000000
-//1651,High Wizard Katrinn,1000000
-//1658,Egnigem Cenia,1000000
-//1708,Thanatos,1000000
-//1734,Kiel D-01,1000000
-//1751,Valkyrie Randgris,1000000
+// Bloody Branch Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
+0,Baphomet,1039
+//1022,Werewolf,1000000
+1038,Osiris,1000000
+1039,Baphomet,1000000
+1046,Doppelganger,1000000
+1059,Mistress,1000000
+1086,Golden Thief Bug,1000000
+1087,Orc Hero,1000000
+1112,Drake,1000000
+1115,Eddga,1000000
+1147,Maya,1000000
+1150,Moonlight,1000000
+1157,Pharaoh,1000000
+1159,Phreeoni,1000000
+1190,Orc Lord,1000000
+1251,Stormy Knight,1000000
+1252,Garm,1000000
+1272,Dark Lord,1000000
+1312,Turtle General,1000000
+1373,Lord of Death,1000000
+1389,Dracula,1000000
+1418,Evil Snake Lord,1000000
+1492,Incantation Samurai,1000000
+1511,Amon Ra,1000000
+1518,Bacsojin,1000000
+1583,Tao Gunka,1000000
+1623,RSX 0806,1000000
+1685,Vesper,1000000
+1688,Lady Tany,1000000
+1719,Detale,1000000
+
+//== Not "Normal" MvP's. (Level 99 or Quest ones)
+//1646,Lord Knight Seyren,1000000
+//1647,Assassin Cross Eremes,1000000
+//1648,Whitesmith Harword,1000000
+//1649,High Priest Magaleta,1000000
+//1650,Sniper Shecil,1000000
+//1651,High Wizard Katrinn,1000000
+//1658,Egnigem Cenia,1000000
+//1708,Thanatos,1000000
+//1734,Kiel D-01,1000000
+//1751,Valkyrie Randgris,1000000
diff --git a/db/mob_branch.txt b/db/mob_branch.txt
index e33e56a73..cdca27a70 100644
--- a/db/mob_branch.txt
+++ b/db/mob_branch.txt
@@ -1,406 +1,406 @@
-// Dead Branch Summonable Monsters Database
-//
-// Structure of Database:
-// MobID,DummyName,Rate
-
-0,SCORPION,Scorpion,1001
-1001,Scorpion,1000000
-1002,Poring,1000000
-1004,Hornet,1000000
-1005,Familiar,1000000
-1007,Fabre,1000000
-1008,Pupa,1000000
-1009,Condor,1000000
-1010,Willow,1000000
-1011,Chonchon,1000000
-1012,Roda Frog,1000000
-1013,Wolf,1000000
-1014,Spore,1000000
-1015,Zombie,1000000
-1016,Archer Skeleton,1000000
-1017,Thief Bug Female,1000000
-1018,Creamy,1000000
-1019,Peco Peco,1000000
-1020,Mandragora,1000000
-1021,Thief Bug Male,1000000
-1023,Orc Warrior,1000000
-1024,Wormtail,1000000
-1025,Snake,1000000
-1026,Munak,1000000
-1027,Raptice,1000000
-1028,Soldier Skeleton,1000000
-1029,Isis,1000000
-1030,Anacondaq,1000000
-1031,Poporing,1000000
-1032,Verit,1000000
-1033,Elder Willow,1000000
-1034,Thara Frog,1000000
-1035,Hunter Fly,1000000
-1036,Ghoul,1000000
-1037,Side Winder,1000000
-1040,Golem,1000000
-1041,Mummy,1000000
-1042,Steel Chonchon,1000000
-1043,Seahorse,1000000
-1044,Obeaune,1000000
-1045,Marc,1000000
-1047,Peco Peco Egg,1000000
-1048,Thief Bug Egg,1000000
-1049,Picky,1000000
-1050,Picky,1000000
-1051,Thief Bug,1000000
-1052,Rocker,1000000
-1055,Muka,1000000
-1056,Smokie,1000000
-1057,Yoyo,1000000
-1058,Metaller,1000000
-1060,Bigfoot,1000000
-1061,Nightmare,1000000
-1062,Santa Poring,1000000
-1063,Lunatic,1000000
-1064,Megalodon,1000000
-1065,Strouf,1000000
-1066,Vadon,1000000
-1067,Cornutus,1000000
-1068,Hydra,1000000
-1069,Swordfish,1000000
-1070,Kukre,1000000
-1071,Pirate Skeleton,1000000
-1072,Kaho,1000000
-1076,Skeleton,1000000
-1077,Poison Spore,1000000
-1078,Red Plant,1000000
-1079,Blue Plant,1000000
-1080,Green Plant,1000000
-1081,Yellow Plant,1000000
-1082,White Plant,1000000
-1083,Shining Plant,1000000
-1084,Black Mushroom,1000000
-1085,Red Mushroom,1000000
-1088,Vocal,1000000
-1089,Toad,1000000
-1090,Mastering,1000000
-1091,Dragon Fly,1000000
-1092,Vagabond Wolf,1000000
-1093,Eclipse,1000000
-1094,Ambernite,1000000
-1095,Andre,1000000
-1096,Angeling,1000000
-1097,Ant Egg,1000000
-1099,Argiope,1000000
-1100,Argos,1000000
-1101,Baphomet Jr.,1000000
-1102,Bathory,1000000
-1103,Caramel,1000000
-1104,Coco,1000000
-1105,Deniro,1000000
-1106,Desert Wolf,1000000
-1107,Baby Desert Wolf,1000000
-1108,Deviace,1000000
-1109,Deviruchi,1000000
-1110,Dokebi,1000000
-1111,Drainliar,1000000
-1113,Drops,1000000
-1114,Dustiness,1000000
-1116,Eggyra,1000000
-1117,Evil Druid,1000000
-1118,Flora,1000000
-1119,Frilldora,1000000
-1120,Ghostring,1000000
-1121,Giearth,1000000
-1122,Goblin,1000000
-1123,Goblin,1000000
-1124,Goblin,1000000
-1125,Goblin,1000000
-1126,Goblin,1000000
-1127,Hode,1000000
-1128,Horn,1000000
-1129,Horong,1000000
-1130,Jakk,1000000
-1131,Joker,1000000
-1132,Khalitzburg,1000000
-1133,Kobold,1000000
-1134,Kobold,1000000
-1135,Kobold,1000000
-1138,Magnolia,1000000
-1139,Mantis,1000000
-1140,Marduk,1000000
-1141,Marina,1000000
-1142,Marine Sphere,1000000
-1143,Marionette,1000000
-1144,Marse,1000000
-1145,Martin,1000000
-1146,Matyr,1000000
-1148,Medusa,1000000
-1149,Minorous,1000000
-1151,Myst,1000000
-1152,Orc Skeleton,1000000
-1153,Orc Zombie,1000000
-1154,Pasana,1000000
-1155,Petite,1000000
-1156,Petite,1000000
-1158,Phen,1000000
-1160,Piere,1000000
-1161,Plankton,1000000
-1162,Rafflesia,1000000
-1163,Raydric,1000000
-1164,Requiem,1000000
-1165,Sandman,1000000
-1166,Savage,1000000
-1167,Savage Babe,1000000
-1169,Skeleton Worker,1000000
-1170,Sohee,1000000
-1174,Stainer,1000000
-1175,Tarou,1000000
-1176,Vitata,1000000
-1177,Zenorc,1000000
-1178,Zerom,1000000
-1179,Whisper,1000000
-1180,Nine Tail,1000000
-1185,Whisper,1000000
-1186,Giant Whisper,1000000
-1188,Bongun,1000000
-1189,Orc Archer,1000000
-1191,Mimic,1000000
-1192,Wraith,1000000
-1193,Alarm,1000000
-1194,Arclouse,1000000
-1195,Rideword,1000000
-1196,Skeleton Prisoner,1000000
-1197,Zombie Prisoner,1000000
-1199,Punk,1000000
-1200,Zherlthsh,1000000
-1201,Rybio,1000000
-1202,Phendark,1000000
-1203,Mysteltainn,1000000
-1204,Tyrfing,1000000
-1205,Executioner,1000000
-1206,Anolian,1000000
-1207,Sting,1000000
-1208,Wanderer,1000000
-1209,Cramp,1000000
-1211,Brilight,1000000
-1212,Iron Fist,1000000
-1213,High Orc,1000000
-1214,Choco,1000000
-1215,Stem Worm,1000000
-1216,Penomena,1000000
-1219,Abysmal Knight,1000000
-1242,Marin,1000000
-1243,Sasquatch,1000000
-1244,Christmas Jakk,1000000
-1245,Christmas Goblin,1000000
-1246,Christmas Cookie,1000000
-1247,Antonio,1000000
-1248,Cruiser,1000000
-1249,Myst Case,1000000
-1250,Chepet,1000000
-1253,Gargoyle,1000000
-1254,Raggler,1000000
-1255,Neraid,1000000
-1256,Pest,1000000
-1257,Injustice,1000000
-1258,Goblin Archer,1000000
-1259,Gryphon,1000000
-1260,Dark Frame,1000000
-1261,Wild Rose,1000000
-1262,Mutant Dragonoid,1000000
-1263,Wind Ghost,1000000
-1264,Merman,1000000
-1265,Cookie,1000000
-1266,Aster,1000000
-1267,Carat,1000000
-1268,Blood Knight,1000000
-1269,Clock,1000000
-1270,Clock Tower Manager,1000000
-1271,Alligator,1000000
-1273,Orc Lady,1000000
-1274,Megalith,1000000
-1275,Alice,1000000
-1276,Raydric Archer,1000000
-1277,Greatest General,1000000
-1278,Stalactite Golem,1000000
-1279,Tri Joint,1000000
-1280,Goblin Steamrider,1000000
-1281,Sage Worm,1000000
-1282,Kobold Archer,1000000
-1283,Chimera,1000000
-1289,Maya Purple,1000000
-1290,Skeleton General,1000000
-1291,Wraith Dead,1000000
-1292,Mini Demon,1000000
-1293,Creamy Fear,1000000
-1294,Killer Mantis,1000000
-1295,Owl Baron,1000000
-1296,Kobold Leader,1000000
-1297,Ancient Mummy,1000000
-1298,Zombie Master,1000000
-1299,Goblin Leader,1000000
-1300,Caterpillar,1000000
-1301,Am Mut,1000000
-1302,Dark Illusion,1000000
-1303,Giant Hornet,1000000
-1304,Giant Spider,1000000
-1305,Ancient Worm,1000000
-1306,Leib Olmai,1000000
-1307,Cat o' Nine Tails,1000000
-1308,Panzer Goblin,1000000
-1309,Gajomart,1000000
-1310,Majoruros,1000000
-1311,Gullinbursti,1000000
-1313,Mobster,1000000
-1314,Permeter,1000000
-1315,Assaulter,1000000
-1316,Solider,1000000
-1317,Seal,1000000
-1318,Heater,1000000
-1319,Freezer,1000000
-1320,Owl Duke,1000000
-1321,Dragon Tail,1000000
-1322,Spring Rabbit,1000000
-1323,Sea Otter,1000000
-1364,Assaulter,1000000
-1365,Apocalypse,1000000
-1366,Lava Golem,1000000
-1367,Blazer,1000000
-1368,Geographer,1000000
-1369,Grand Peco,1000000
-1370,Succubus,1000000
-1371,Fake Angel,1000000
-1372,Goat,1000000
-1374,Incubus,1000000
-1375,The Paper,1000000
-1376,Harpy,1000000
-1377,Elder,1000000
-1378,Demon Fungus,1000000
-1379,Nightmare Terror,1000000
-1380,Driller,1000000
-1381,Grizzly,1000000
-1382,Diabolic,1000000
-1383,Explosion,1000000
-1384,Deleter,1000000
-1385,Deleter,1000000
-1386,Sleeper,1000000
-1387,Gig,1000000
-1388,Arc Angeling,1000000
-1390,Violy,1000000
-1391,Galapago,1000000
-1392,Rotar Zairo,1000000
-1400,Karakasa,1000000
-1401,Shinobi,1000000
-1402,Poison Toad,1000000
-1403,Firelock Soldier,1000000
-1404,Miyabi Doll,1000000
-1405,Tengu,1000000
-1406,Kapha,1000000
-1408,Bloody Butterfly,1000000
-1409,Dumpling Child,1000000
-1410,Enchanted Peach Tree,1000000
-1412,Taoist Hermit,1000000
-1413,Hermit Plant,1000000
-1415,Baby Leopard,1000000
-1416,Evil Nymph,1000000
-1417,Zipper Bear,1000000
-1493,Dryad,1000000
-1494,Beetle King,1000000
-1495,Stone Shooter,1000000
-1497,Wooden Golem,1000000
-1498,Wootan Shooter,1000000
-1499,Wootan Fighter,1000000
-1500,Parasite,1000000
-1503,Gibbet,1000000
-1504,Dullahan,1000000
-1505,Loli Ruri,1000000
-1506,Disguise,1000000
-1507,Bloody Murderer,1000000
-1508,Quve,1000000
-1509,Lude,1000000
-1510,Hylozoist,1000000
-1512,Hyegun,1000000
-1513,Civil Servant,1000000
-1514,Dancing Dragon,1000000
-1515,Garm Baby,1000000
-1516,Increase Soil,1000000
-1517,Li Me Mang Ryang,1000000
-1519,Chung E,1000000
-1520,Boiled Rice,1000000
-1582,Deviling,1000000
-1584,Tamruan,1000000
-1585,Mime Monkey,1000000
-1586,Leaf Cat,1000000
-1587,Kraben,1000000
-1588,Christmas Orc,1000000
-1613,Metaling,1000000
-1614,Mineral,1000000
-1615,Obsidian,1000000
-1616,Pitman,1000000
-1617,Waste Stove,1000000
-1618,Ungoliant,1000000
-1619,Porcellio,1000000
-1620,Noxious,1000000
-1621,Venomous,1000000
-1622,Teddy Bear,1000000
-1627,Anopheles,1000000
-1628,Holden,1000000
-1629,Hill Wind,1000000
-1631,Chung E,1000000
-1632,Gremlin,1000000
-1633,Beholder,1000000
-//1634,Seyren Windsor,1000000
-//1635,Eremes Guile,1000000
-//1636,Howard Alt-Eisen,1000000
-//1637,Margaretha Solin,1000000
-//1638,Cecil Damon,1000000
-//1639,Kathryne Keyron,1000000
-//1652,Egnigem Cenia,1000000
-//1653,Wikebine Tres,1000000
-//1654,Armeyer Dinze,1000000
-//1655,Errende Ebecee,1000000
-//1656,Kavach Icarus,1000000
-//1657,Laurell Weinder,1000000
-1668,Archdam,1000000
-1670,Dimik,1000000
-1671,Dimik,1000000
-1672,Dimik,1000000
-1673,Dimik,1000000
-1675,Venatu,1000000
-1676,Venatu,1000000
-1677,Venatu,1000000
-1678,Venatu,1000000
-1680,Hill Wind,1000000
-1681,Gemini-S58,1000000
-1682,Remover,1000000
-1686,Orc Baby,1000000
-1687,Green Iguana,1000000
-1692,Breeze,1000000
-1693,Plasma,1000000
-1694,Plasma,1000000
-1695,Plasma,1000000
-1696,Plasma,1000000
-1697,Plasma,1000000
-1698,Deathword,1000000
-1699,Ancient Mimic,1000000
-1700,Observation,1000000
-1701,Shelter,1000000
-1702,Retribution,1000000
-1703,Solace,1000000
-//1704,Thanatos Odium,1000000
-//1705,Thanatos Despero,1000000
-//1706,Thanatos Maero,1000000
-//1707,Thanatos Dolor,1000000
-1713,Acidus,1000000
-1714,Ferus,1000000
-1715,Novus,1000000
-1716,Acidus,1000000
-1717,Ferus,1000000
-1718,Novus,1000000
-1720,Hydro,1000000
-1721,Dragon Egg,1000000
-1735,Alicel,1000000
-1736,Aliot,1000000
-1737,Aliza,1000000
-1738,Constant,1000000
-1752,Skogul,1000000
-1753,Frus,1000000
-1754,Skeggiold,1000000
-1755,Skeggiold,1000000
+// Dead Branch Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
+0,SCORPION,Scorpion,1001
+1001,Scorpion,1000000
+1002,Poring,1000000
+1004,Hornet,1000000
+1005,Familiar,1000000
+1007,Fabre,1000000
+1008,Pupa,1000000
+1009,Condor,1000000
+1010,Willow,1000000
+1011,Chonchon,1000000
+1012,Roda Frog,1000000
+1013,Wolf,1000000
+1014,Spore,1000000
+1015,Zombie,1000000
+1016,Archer Skeleton,1000000
+1017,Thief Bug Female,1000000
+1018,Creamy,1000000
+1019,Peco Peco,1000000
+1020,Mandragora,1000000
+1021,Thief Bug Male,1000000
+1023,Orc Warrior,1000000
+1024,Wormtail,1000000
+1025,Snake,1000000
+1026,Munak,1000000
+1027,Raptice,1000000
+1028,Soldier Skeleton,1000000
+1029,Isis,1000000
+1030,Anacondaq,1000000
+1031,Poporing,1000000
+1032,Verit,1000000
+1033,Elder Willow,1000000
+1034,Thara Frog,1000000
+1035,Hunter Fly,1000000
+1036,Ghoul,1000000
+1037,Side Winder,1000000
+1040,Golem,1000000
+1041,Mummy,1000000
+1042,Steel Chonchon,1000000
+1043,Seahorse,1000000
+1044,Obeaune,1000000
+1045,Marc,1000000
+1047,Peco Peco Egg,1000000
+1048,Thief Bug Egg,1000000
+1049,Picky,1000000
+1050,Picky,1000000
+1051,Thief Bug,1000000
+1052,Rocker,1000000
+1055,Muka,1000000
+1056,Smokie,1000000
+1057,Yoyo,1000000
+1058,Metaller,1000000
+1060,Bigfoot,1000000
+1061,Nightmare,1000000
+1062,Santa Poring,1000000
+1063,Lunatic,1000000
+1064,Megalodon,1000000
+1065,Strouf,1000000
+1066,Vadon,1000000
+1067,Cornutus,1000000
+1068,Hydra,1000000
+1069,Swordfish,1000000
+1070,Kukre,1000000
+1071,Pirate Skeleton,1000000
+1072,Kaho,1000000
+1076,Skeleton,1000000
+1077,Poison Spore,1000000
+1078,Red Plant,1000000
+1079,Blue Plant,1000000
+1080,Green Plant,1000000
+1081,Yellow Plant,1000000
+1082,White Plant,1000000
+1083,Shining Plant,1000000
+1084,Black Mushroom,1000000
+1085,Red Mushroom,1000000
+1088,Vocal,1000000
+1089,Toad,1000000
+1090,Mastering,1000000
+1091,Dragon Fly,1000000
+1092,Vagabond Wolf,1000000
+1093,Eclipse,1000000
+1094,Ambernite,1000000
+1095,Andre,1000000
+1096,Angeling,1000000
+1097,Ant Egg,1000000
+1099,Argiope,1000000
+1100,Argos,1000000
+1101,Baphomet Jr.,1000000
+1102,Bathory,1000000
+1103,Caramel,1000000
+1104,Coco,1000000
+1105,Deniro,1000000
+1106,Desert Wolf,1000000
+1107,Baby Desert Wolf,1000000
+1108,Deviace,1000000
+1109,Deviruchi,1000000
+1110,Dokebi,1000000
+1111,Drainliar,1000000
+1113,Drops,1000000
+1114,Dustiness,1000000
+1116,Eggyra,1000000
+1117,Evil Druid,1000000
+1118,Flora,1000000
+1119,Frilldora,1000000
+1120,Ghostring,1000000
+1121,Giearth,1000000
+1122,Goblin,1000000
+1123,Goblin,1000000
+1124,Goblin,1000000
+1125,Goblin,1000000
+1126,Goblin,1000000
+1127,Hode,1000000
+1128,Horn,1000000
+1129,Horong,1000000
+1130,Jakk,1000000
+1131,Joker,1000000
+1132,Khalitzburg,1000000
+1133,Kobold,1000000
+1134,Kobold,1000000
+1135,Kobold,1000000
+1138,Magnolia,1000000
+1139,Mantis,1000000
+1140,Marduk,1000000
+1141,Marina,1000000
+1142,Marine Sphere,1000000
+1143,Marionette,1000000
+1144,Marse,1000000
+1145,Martin,1000000
+1146,Matyr,1000000
+1148,Medusa,1000000
+1149,Minorous,1000000
+1151,Myst,1000000
+1152,Orc Skeleton,1000000
+1153,Orc Zombie,1000000
+1154,Pasana,1000000
+1155,Petite,1000000
+1156,Petite,1000000
+1158,Phen,1000000
+1160,Piere,1000000
+1161,Plankton,1000000
+1162,Rafflesia,1000000
+1163,Raydric,1000000
+1164,Requiem,1000000
+1165,Sandman,1000000
+1166,Savage,1000000
+1167,Savage Babe,1000000
+1169,Skeleton Worker,1000000
+1170,Sohee,1000000
+1174,Stainer,1000000
+1175,Tarou,1000000
+1176,Vitata,1000000
+1177,Zenorc,1000000
+1178,Zerom,1000000
+1179,Whisper,1000000
+1180,Nine Tail,1000000
+1185,Whisper,1000000
+1186,Giant Whisper,1000000
+1188,Bongun,1000000
+1189,Orc Archer,1000000
+1191,Mimic,1000000
+1192,Wraith,1000000
+1193,Alarm,1000000
+1194,Arclouse,1000000
+1195,Rideword,1000000
+1196,Skeleton Prisoner,1000000
+1197,Zombie Prisoner,1000000
+1199,Punk,1000000
+1200,Zherlthsh,1000000
+1201,Rybio,1000000
+1202,Phendark,1000000
+1203,Mysteltainn,1000000
+1204,Tyrfing,1000000
+1205,Executioner,1000000
+1206,Anolian,1000000
+1207,Sting,1000000
+1208,Wanderer,1000000
+1209,Cramp,1000000
+1211,Brilight,1000000
+1212,Iron Fist,1000000
+1213,High Orc,1000000
+1214,Choco,1000000
+1215,Stem Worm,1000000
+1216,Penomena,1000000
+1219,Abysmal Knight,1000000
+1242,Marin,1000000
+1243,Sasquatch,1000000
+1244,Christmas Jakk,1000000
+1245,Christmas Goblin,1000000
+1246,Christmas Cookie,1000000
+1247,Antonio,1000000
+1248,Cruiser,1000000
+1249,Myst Case,1000000
+1250,Chepet,1000000
+1253,Gargoyle,1000000
+1254,Raggler,1000000
+1255,Neraid,1000000
+1256,Pest,1000000
+1257,Injustice,1000000
+1258,Goblin Archer,1000000
+1259,Gryphon,1000000
+1260,Dark Frame,1000000
+1261,Wild Rose,1000000
+1262,Mutant Dragonoid,1000000
+1263,Wind Ghost,1000000
+1264,Merman,1000000
+1265,Cookie,1000000
+1266,Aster,1000000
+1267,Carat,1000000
+1268,Blood Knight,1000000
+1269,Clock,1000000
+1270,Clock Tower Manager,1000000
+1271,Alligator,1000000
+1273,Orc Lady,1000000
+1274,Megalith,1000000
+1275,Alice,1000000
+1276,Raydric Archer,1000000
+1277,Greatest General,1000000
+1278,Stalactite Golem,1000000
+1279,Tri Joint,1000000
+1280,Goblin Steamrider,1000000
+1281,Sage Worm,1000000
+1282,Kobold Archer,1000000
+1283,Chimera,1000000
+1289,Maya Purple,1000000
+1290,Skeleton General,1000000
+1291,Wraith Dead,1000000
+1292,Mini Demon,1000000
+1293,Creamy Fear,1000000
+1294,Killer Mantis,1000000
+1295,Owl Baron,1000000
+1296,Kobold Leader,1000000
+1297,Ancient Mummy,1000000
+1298,Zombie Master,1000000
+1299,Goblin Leader,1000000
+1300,Caterpillar,1000000
+1301,Am Mut,1000000
+1302,Dark Illusion,1000000
+1303,Giant Hornet,1000000
+1304,Giant Spider,1000000
+1305,Ancient Worm,1000000
+1306,Leib Olmai,1000000
+1307,Cat o' Nine Tails,1000000
+1308,Panzer Goblin,1000000
+1309,Gajomart,1000000
+1310,Majoruros,1000000
+1311,Gullinbursti,1000000
+1313,Mobster,1000000
+1314,Permeter,1000000
+1315,Assaulter,1000000
+1316,Solider,1000000
+1317,Seal,1000000
+1318,Heater,1000000
+1319,Freezer,1000000
+1320,Owl Duke,1000000
+1321,Dragon Tail,1000000
+1322,Spring Rabbit,1000000
+1323,Sea Otter,1000000
+1364,Assaulter,1000000
+1365,Apocalypse,1000000
+1366,Lava Golem,1000000
+1367,Blazer,1000000
+1368,Geographer,1000000
+1369,Grand Peco,1000000
+1370,Succubus,1000000
+1371,Fake Angel,1000000
+1372,Goat,1000000
+1374,Incubus,1000000
+1375,The Paper,1000000
+1376,Harpy,1000000
+1377,Elder,1000000
+1378,Demon Fungus,1000000
+1379,Nightmare Terror,1000000
+1380,Driller,1000000
+1381,Grizzly,1000000
+1382,Diabolic,1000000
+1383,Explosion,1000000
+1384,Deleter,1000000
+1385,Deleter,1000000
+1386,Sleeper,1000000
+1387,Gig,1000000
+1388,Arc Angeling,1000000
+1390,Violy,1000000
+1391,Galapago,1000000
+1392,Rotar Zairo,1000000
+1400,Karakasa,1000000
+1401,Shinobi,1000000
+1402,Poison Toad,1000000
+1403,Firelock Soldier,1000000
+1404,Miyabi Doll,1000000
+1405,Tengu,1000000
+1406,Kapha,1000000
+1408,Bloody Butterfly,1000000
+1409,Dumpling Child,1000000
+1410,Enchanted Peach Tree,1000000
+1412,Taoist Hermit,1000000
+1413,Hermit Plant,1000000
+1415,Baby Leopard,1000000
+1416,Evil Nymph,1000000
+1417,Zipper Bear,1000000
+1493,Dryad,1000000
+1494,Beetle King,1000000
+1495,Stone Shooter,1000000
+1497,Wooden Golem,1000000
+1498,Wootan Shooter,1000000
+1499,Wootan Fighter,1000000
+1500,Parasite,1000000
+1503,Gibbet,1000000
+1504,Dullahan,1000000
+1505,Loli Ruri,1000000
+1506,Disguise,1000000
+1507,Bloody Murderer,1000000
+1508,Quve,1000000
+1509,Lude,1000000
+1510,Hylozoist,1000000
+1512,Hyegun,1000000
+1513,Civil Servant,1000000
+1514,Dancing Dragon,1000000
+1515,Garm Baby,1000000
+1516,Increase Soil,1000000
+1517,Li Me Mang Ryang,1000000
+1519,Chung E,1000000
+1520,Boiled Rice,1000000
+1582,Deviling,1000000
+1584,Tamruan,1000000
+1585,Mime Monkey,1000000
+1586,Leaf Cat,1000000
+1587,Kraben,1000000
+1588,Christmas Orc,1000000
+1613,Metaling,1000000
+1614,Mineral,1000000
+1615,Obsidian,1000000
+1616,Pitman,1000000
+1617,Waste Stove,1000000
+1618,Ungoliant,1000000
+1619,Porcellio,1000000
+1620,Noxious,1000000
+1621,Venomous,1000000
+1622,Teddy Bear,1000000
+1627,Anopheles,1000000
+1628,Holden,1000000
+1629,Hill Wind,1000000
+1631,Chung E,1000000
+1632,Gremlin,1000000
+1633,Beholder,1000000
+//1634,Seyren Windsor,1000000
+//1635,Eremes Guile,1000000
+//1636,Howard Alt-Eisen,1000000
+//1637,Margaretha Solin,1000000
+//1638,Cecil Damon,1000000
+//1639,Kathryne Keyron,1000000
+//1652,Egnigem Cenia,1000000
+//1653,Wikebine Tres,1000000
+//1654,Armeyer Dinze,1000000
+//1655,Errende Ebecee,1000000
+//1656,Kavach Icarus,1000000
+//1657,Laurell Weinder,1000000
+1668,Archdam,1000000
+1670,Dimik,1000000
+1671,Dimik,1000000
+1672,Dimik,1000000
+1673,Dimik,1000000
+1675,Venatu,1000000
+1676,Venatu,1000000
+1677,Venatu,1000000
+1678,Venatu,1000000
+1680,Hill Wind,1000000
+1681,Gemini-S58,1000000
+1682,Remover,1000000
+1686,Orc Baby,1000000
+1687,Green Iguana,1000000
+1692,Breeze,1000000
+1693,Plasma,1000000
+1694,Plasma,1000000
+1695,Plasma,1000000
+1696,Plasma,1000000
+1697,Plasma,1000000
+1698,Deathword,1000000
+1699,Ancient Mimic,1000000
+1700,Observation,1000000
+1701,Shelter,1000000
+1702,Retribution,1000000
+1703,Solace,1000000
+//1704,Thanatos Odium,1000000
+//1705,Thanatos Despero,1000000
+//1706,Thanatos Maero,1000000
+//1707,Thanatos Dolor,1000000
+1713,Acidus,1000000
+1714,Ferus,1000000
+1715,Novus,1000000
+1716,Acidus,1000000
+1717,Ferus,1000000
+1718,Novus,1000000
+1720,Hydro,1000000
+1721,Dragon Egg,1000000
+1735,Alicel,1000000
+1736,Aliot,1000000
+1737,Aliza,1000000
+1738,Constant,1000000
+1752,Skogul,1000000
+1753,Frus,1000000
+1754,Skeggiold,1000000
+1755,Skeggiold,1000000
diff --git a/db/mob_db.txt b/db/mob_db.txt
index 570decca4..960e1c415 100644
--- a/db/mob_db.txt
+++ b/db/mob_db.txt
@@ -1,860 +1,860 @@
-// Monster Database
-//
-// Structure of Database :
-// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
-// Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough
-
-1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1
-1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1
-1004,HORNET,Hornet,Hornet,8,169,0,19,15,1,22,27,5,5,6,20,8,10,17,5,10,12,0,4,24,137,150,1292,792,216,0,0,0,0,0,0,0,0,992,80,939,9000,909,3500,1208,15,511,350,518,150,0,0,0,0,0,0,4019,1
-1005,FARMILIAR,Familiar,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,0,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1
-1007,FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1
-1008,PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1
-1009,CONDOR,Condor,Condor,5,92,0,6,5,1,11,14,0,0,1,13,5,0,13,10,10,12,1,2,24,137,150,1148,648,480,0,0,0,0,0,0,0,0,917,9000,1702,150,715,80,1750,5500,517,400,916,2000,582,600,0,0,0,0,4015,1
-1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,129,200,1672,672,432,0,0,0,0,0,0,0,0,902,9000,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1
-1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1
-1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,129,200,2016,816,288,0,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
-1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,137,200,1054,504,432,0,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1
-1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1
-1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1
-1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,0,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1
-1018,CREAMY,Creamy,Creamy,16,595,0,105,70,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,150,1136,720,840,0,0,0,0,0,0,0,0,924,9000,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1
-1019,PECOPECO,Peco Peco,Peco Peco,19,531,0,159,72,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,137,200,1564,864,576,0,0,0,0,0,0,0,0,925,9000,2402,20,508,200,507,900,1604,100,0,0,582,1000,0,0,0,0,4031,1
-1020,MANDRAGORA,Mandragora,Mandragora,12,405,0,45,32,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,993,50,905,9000,1405,30,511,350,711,300,706,3,1967,10,0,0,0,0,4030,1
-1023,ORK_WARRIOR,Orc Warrior,Orc Warrior,24,1400,0,408,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,9000,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1024,WORM_TAIL,Wormtail,Wormtail,14,426,0,59,40,2,42,51,5,0,1,14,28,5,46,5,10,12,1,3,22,145,200,1048,48,192,0,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1
-1025,SNAKE,Snake,Boa,15,471,0,72,48,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,926,9000,1117,15,507,900,1011,35,937,800,954,1,578,600,0,0,0,0,4037,1
-1026,MUNAK,Munak,Munak,30,2872,0,601,318,1,150,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2181,200,2468,768,288,0,0,0,0,0,0,0,0,901,9000,2264,2,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1
-1028,SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,1201,150,1216,50,0,0,0,0,4086,1
-1029,ISIS,Isis,Isis,47,7003,0,3709,1550,1,423,507,10,35,38,65,43,50,66,15,10,12,2,6,27,149,200,1384,768,336,0,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
-1030,ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,300,149,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,1011,50,937,9000,1455,10,926,1500,936,200,508,150,756,50,0,0,0,0,4062,1
-1031,POPORING,Poporing,Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,0,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,512,5,1207,5,512,250,0,0,0,0,4033,1
-1032,VERIT,Verit,Verit,38,5272,0,835,517,1,389,469,0,5,1,19,38,0,38,20,10,12,1,1,29,131,250,2468,768,480,0,0,0,0,0,0,0,0,929,9000,912,700,930,1100,509,600,2609,1,2612,200,639,20,0,0,0,0,4107,1
-1033,ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,163,101,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,990,50,907,9000,1019,350,757,40,2329,30,690,100,604,100,0,0,0,0,4052,1
-1034,THARA_FROG,Thara Frog,Thara Frog,22,2152,0,219,138,1,105,127,0,10,1,22,22,5,34,10,10,12,1,5,41,129,200,2016,816,288,0,0,0,0,0,0,0,0,1011,45,908,5500,911,600,509,30,725,5,918,2000,0,0,0,0,0,0,4058,1
-1035,HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,33,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5335,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
-1036,GHOUL,Ghoul,Ghoul,40,5418,0,1088,622,1,420,500,5,20,1,20,29,0,45,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,958,6000,756,110,509,700,511,800,2609,60,934,150,1260,1,0,0,0,0,4110,1
-1037,SIDE_WINDER,Side Winder,Side Winder,43,4929,0,1996,993,1,240,320,5,10,38,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,0,0,0,0,0,0,0,0,954,5335,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,0,0,0,0,4117,1
-1038,OSIRIS,Osiris,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,12,1,1,89,1205,100,1072,672,384,35750,10000,603,4000,608,3000,751,500,617,2000,1232,150,2235,200,1255,600,1009,1000,5053,150,984,3783,0,0,0,0,4144,1
-1039,BAPHOMET,Baphomet,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,12,2,6,67,1205,100,768,768,576,53625,10000,607,2000,750,500,923,5000,1466,200,2256,200,2607,800,714,500,617,3000,985,5432,984,4171,0,0,0,0,4147,1
-1040,GOLEM,Golem,Golem,25,3900,0,465,94,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,999,150,953,9000,912,220,757,70,1003,210,715,200,998,350,0,0,0,0,4072,1
-1041,MUMMY,Mummy,Mummy,37,5176,0,800,602,1,305,360,0,10,28,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,930,9000,756,100,934,550,2604,1,2611,10,525,250,508,850,0,0,0,0,4106,1
-1042,STEEL_CHONCHON,Steel Chonchon,Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,139,150,1076,576,480,0,0,0,0,0,0,0,0,992,90,999,30,910,2400,935,9000,943,30,998,200,1002,300,0,0,0,0,4042,1
-1044,OBEAUNE,Obeaune,Obeaune,31,3952,0,644,407,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,0,0,0,0,0,0,0,0,995,13,950,9000,5014,1,2326,10,720,10,951,500,748,30,0,0,0,0,4093,1
-1045,MARC,Marc,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,995,18,956,9000,756,95,951,1000,720,10,717,200,509,700,0,0,0,0,4105,1
-1046,DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,88,90,90,35,125,65,10,12,1,6,67,1205,100,480,480,288,25740,10000,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1
-1047,PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,1500,2102,2,507,400,507,400,713,1800,736,10,0,0,0,0,4007,1
-1048,THIEF_BUG_EGG,Thief Bug Egg,Thief Bug Egg,4,48,0,8,4,0,13,17,20,0,1,6,4,0,14,20,10,12,0,4,27,0,1000,701,1,1,0,0,0,0,0,0,0,0,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,250,0,0,0,0,4012,1
-1049,PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,9000,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,1
-1050,PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,10,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,9000,949,700,5015,10,507,600,519,300,715,50,10012,10,0,0,0,0,4011,1
-1051,THIEF_BUG,Thief Bug,Thief Bug,6,126,0,17,5,1,18,24,5,0,1,6,6,0,11,0,10,12,0,4,60,139,150,1288,288,768,0,0,0,0,0,0,0,0,955,2500,2304,80,507,350,909,2000,2303,120,1002,250,0,0,0,0,0,0,4016,1
-1052,ROCKER,Rocker,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,9000,1916,10,2298,4,1402,80,520,10,752,10,703,10,0,0,0,0,4021,1
-1053,THIEF_BUG_,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,139,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,300,0,0,0,0,4026,1
-1054,THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,0,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
-1055,MUKA,Muka,Muka,17,610,0,273,120,1,40,49,5,5,15,15,30,5,20,10,10,12,2,3,22,129,300,1960,960,384,0,0,0,0,0,0,0,0,993,70,952,9000,713,2000,511,400,507,1000,1451,50,1002,250,0,0,0,0,4036,1
-1056,SMOKIE,Smokie,Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,1,754,2,912,5,729,2,0,0,0,0,4044,1
-1057,YOYO,Yoyo,Yoyo,21,879,0,280,111,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,0,0,0,0,0,0,0,0,942,9000,513,1500,508,200,7182,900,753,10,756,24,578,1000,0,0,0,0,4051,1
-1058,METALLER,Metaller,Metaller,22,926,0,241,152,1,131,159,15,30,1,22,22,20,49,50,10,12,1,4,23,139,200,1708,1008,540,0,0,0,0,0,0,0,0,990,60,940,6500,911,400,757,49,707,20,935,3000,1914,10,0,0,0,0,4057,1
-1059,MISTRESS,Mistress,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,50,165,60,95,70,130,10,12,0,4,84,1205,100,1148,648,300,19662,10000,996,1500,526,4000,722,3000,1413,150,518,10000,2249,250,616,1000,7018,10,985,4268,984,3300,0,0,0,0,4132,1
-1060,BIGFOOT,Bigfoot,Bigfoot,25,1619,0,310,188,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,948,9000,2289,5,919,5000,740,80,516,1500,518,450,756,43,0,0,0,0,4074,1
-1061,NIGHTMARE,Nightmare,Nightmare,49,4437,0,1912,1912,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,0,0,0,0,0,0,0,0,944,6000,510,500,2608,2,603,30,505,100,1261,1,984,60,0,0,0,0,4127,1
-1062,PORING_,Santa Poring,Santa Poring,3,69,0,4,5,1,12,16,0,0,1,14,3,10,12,90,10,12,1,3,26,129,400,1672,672,480,0,0,0,0,0,0,0,0,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,0,0,0,0,0,0,4005,1
-1063,LUNATIC,Lunatic,Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,512,2000,507,600,515,1100,622,20,0,0,0,0,4006,1
-1064,MEGALODON,Megalodon,Megalodon,24,1648,0,215,132,1,155,188,0,15,1,12,24,0,26,5,10,12,1,1,29,129,200,2492,792,432,0,0,0,0,0,0,0,0,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,0,0,0,0,4067,1
-1065,STROUF,Strouf,Strouf,48,11990,0,3080,2098,1,200,1250,5,50,1,40,45,92,43,65,10,12,2,5,61,2181,150,1872,672,384,0,0,0,0,0,0,0,0,951,5335,756,115,2241,2,1461,2,949,3000,720,20,956,1500,0,0,0,0,4111,1
-1066,VADON,Vadon,Vadon,19,1017,0,135,85,1,74,85,20,0,1,19,16,10,36,15,10,12,0,5,21,145,300,1632,432,540,0,0,0,0,0,0,0,0,991,40,960,9000,910,3000,2313,5,943,100,757,40,717,50,0,0,0,0,4049,1
-1067,CORNUTUS,Cornutus,Cornutus,23,1620,0,240,149,1,109,131,30,0,1,23,23,5,36,12,10,12,0,5,21,145,200,1248,48,480,0,0,0,0,0,0,0,0,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,0,0,0,0,4061,1
-1068,HYDRA,Hydra,Hydra,14,660,0,59,40,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,1011,25,962,5500,938,1500,971,20,525,5,517,700,0,0,0,0,0,0,4035,1
-1069,SWORD_FISH,Swordfish,Swordfish,30,4299,0,1251,638,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,2181,200,1968,768,384,0,0,0,0,0,0,0,0,995,10,963,9000,756,33,2257,2,757,50,1117,25,956,600,0,0,0,0,4089,1
-1070,KUKRE,Kukre,Kukre,11,507,0,38,28,1,28,37,15,0,1,11,11,5,16,2,10,12,0,5,21,131,150,1776,576,288,0,0,0,0,0,0,0,0,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,0,0,0,0,4027,1
-1071,PIRATE_SKEL,Pirate Skeleton,Pirate Skeleton,25,1676,0,233,142,1,145,178,10,15,25,13,25,5,25,10,10,12,1,1,29,2181,200,1754,554,288,0,0,0,0,0,0,0,0,932,3000,2287,15,7477,5,2211,250,1104,250,756,43,628,20,0,0,0,0,4073,1
-1072,KAHO,Kaho,Kaho,60,8409,0,3990,450,1,110,760,5,50,1,55,43,88,80,46,10,12,1,6,83,2181,150,1700,1000,500,0,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1
-1073,CRAB,Crab,Crab,20,2451,0,163,101,1,71,81,35,0,18,20,15,0,36,15,7,12,0,5,21,129,200,992,792,360,0,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1
-1074,SHELLFISH,Shellfish,Shellfish,15,920,0,66,44,1,35,42,35,0,1,12,8,0,32,5,10,12,0,5,21,145,200,864,864,384,0,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1
-1075,TURTLE,Turtle,Turtle,3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,129,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1076,SKELETON,Skeleton,Skeleton,10,234,0,18,14,1,39,47,10,10,1,5,10,0,12,0,10,12,1,1,29,145,200,2228,528,576,0,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1
-1077,POISON_SPORE,Poison Spore,Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,0,24,0,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,7033,9000,2221,20,511,550,510,60,972,50,921,1200,912,5,0,0,0,0,4048,1
-1078,RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0
-1079,BLUE_PLANT,Blue Plant,Blue Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0
-1080,GREEN_PLANT,Green Plant,Green Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0
-1081,YELLOW_PLANT,Yellow Plant,Yellow Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0
-1082,WHITE_PLANT,White Plant,White Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0
-1083,SHINING_PLANT,Shining Plant,Shining Plant,1,20,0,0,0,1,1,2,100,99,0,0,0,0,0,90,7,12,0,3,26,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0
-1084,BLACK_MUSHROOM,Black Mushroom,Black Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0
-1085,RED_MUSHROOM,Red Mushroom,Red Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0
-1086,GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,64,126000,0,14300,7150,1,870,1145,60,45,65,75,35,45,85,150,10,12,2,4,43,171,100,768,768,480,7150,10000,2610,2000,701,1000,0,0,969,1000,1524,150,2246,250,10016,500,714,300,985,2000,984,1500,0,0,0,0,4128,1
-1087,ORK_HERO,Orc Hero,Orc Hero,77,295700,0,58630,32890,1,2257,2542,40,45,1,91,99,70,105,90,10,12,2,7,42,1205,150,1678,780,648,29315,10000,725,2000,607,1500,999,5000,968,9700,10018,500,1366,150,2106,250,1124,1000,985,4559,984,3589,0,0,0,0,4143,1
-1088,VOCAL,Vocal,Vocal,18,3016,0,110,88,1,71,82,10,30,77,28,26,30,53,40,10,12,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,2247,50,940,8000,721,1000,752,1500,2420,1000,645,700,1917,10,0,0,0,0,4211,1
-1089,TOAD,Toad,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,12,1,5,21,1205,200,1236,336,432,0,0,0,0,0,0,0,0,2244,50,518,2000,729,1000,746,1500,970,100,971,100,5125,1000,0,0,0,0,4306,1
-1090,MASTERING,Mastering,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,12,1,3,21,1205,300,1072,672,480,0,0,0,0,0,0,0,0,2257,200,619,50,722,1000,2116,1000,512,8000,512,8000,531,4000,0,0,0,0,4197,1
-1091,DRAGON_FLY,Dragon Fly,Dragon Fly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,12,0,4,24,1205,100,1076,576,480,0,0,0,0,0,0,0,0,2245,200,507,8000,719,1500,742,2000,2607,3000,625,50,533,3000,0,0,0,0,4179,1
-1092,VAGABOND_WOLF,Vagabond Wolf,Vagabond Wolf,24,12240,0,247,176,1,135,159,10,0,57,45,48,20,50,65,10,12,1,2,22,1205,150,1048,648,432,0,0,0,0,0,0,0,0,2248,200,920,8000,728,1500,1148,100,2521,1000,725,10,626,50,0,0,0,0,4183,1
-1093,ECLIPSE,Eclipse,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,12,1,2,60,1205,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,507,8000,727,1200,746,1500,706,30,622,50,2355,1000,0,0,0,0,4266,1
-1094,AMBERNITE,Ambernite,Ambernite,13,495,0,57,38,1,39,46,30,0,1,13,13,5,18,5,10,12,2,4,21,145,400,2048,648,648,0,0,0,0,0,0,0,0,991,50,946,9000,910,1200,935,3000,943,2,757,14,1002,150,0,0,0,0,4032,1
-1095,ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,139,300,1288,288,384,0,0,0,0,0,0,0,0,955,9000,910,1000,938,500,993,50,1001,4,1002,350,757,28,0,0,0,0,4043,1
-1096,ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,12,1,8,86,1205,200,1072,672,672,0,0,0,0,0,0,0,0,2254,100,2324,60,610,500,2282,1,509,2000,512,28,714,40,0,0,0,0,4054,1
-1097,ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,320,935,2000,909,2000,938,650,713,2000,1002,200,0,0,0,0,0,0,4013,1
-1098,ANUBIS,Anubis,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,1717,200,2000,1000,500,0,0,0,0,0,0,0,0,2602,5,509,600,2601,5,1007,15,0,0,0,0,0,0,0,0,0,0,4138,1
-1099,ARGIOPE,Argiope,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,1685,300,1792,792,336,0,0,0,0,0,0,0,0,1042,5335,912,1200,757,175,2406,5,511,1500,719,10,0,0,0,0,0,0,4114,1
-1100,ARGOS,Argos,Argos,25,1117,0,388,188,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,0,0,0,0,0,0,0,0,1025,9000,911,1200,1042,500,757,61,511,670,508,250,10017,15,0,0,0,0,4075,1
-1101,BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1173,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,508,1300,2405,50,0,0,0,0,4129,1
-1102,BATHORY,Bathory,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,1001,200,1061,4850,2252,3,1611,5,1000,30,1006,15,637,20,0,0,0,0,4119,1
-1103,CARAMEL,Caramel,Caramel,23,1424,0,264,162,1,90,112,5,5,35,23,46,5,38,10,10,12,0,2,22,145,200,1604,840,756,0,0,0,0,0,0,0,0,1027,9000,2310,5,919,5500,1455,10,1405,15,1408,20,0,0,0,0,0,0,4063,1
-1104,COCO,Coco,Coco,17,817,0,120,78,1,56,67,0,0,24,17,34,20,24,10,10,12,0,2,22,145,150,1864,864,1008,0,0,0,0,0,0,0,0,1026,9000,2502,20,914,3000,919,2500,516,500,2402,25,578,600,0,0,0,0,4041,1
-1105,DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,139,150,1288,288,576,0,0,0,0,0,0,0,0,955,9000,910,3000,938,1200,990,50,1001,8,1002,450,757,34,0,0,0,0,4043,1
-1106,DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,56,27,45,15,56,10,10,12,1,2,23,141,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,0,0,0,0,4082,1
-1107,DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,80,517,600,2301,200,13011,5,582,1000,0,0,0,0,4023,1
-1108,DEVIACE,Deviace,Deviace,47,20090,0,9988,7207,1,514,1024,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,995,25,1053,9000,1054,1000,5011,2,971,200,1256,3,756,161,0,0,0,0,4125,1
-1109,DEVIRUCHI,Deviruchi,Deviruchi,46,6666,0,2662,1278,1,475,560,10,25,1,69,40,55,70,30,10,12,0,6,27,1173,150,980,600,384,0,0,0,0,0,0,0,0,1038,5335,1039,400,984,2,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
-1110,DOKEBI,Dokebi,Dokebi,33,2697,0,889,455,1,197,249,0,10,50,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,9000,757,150,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
-1111,DRAINLIAR,Drainliar,Drainliar,24,1162,0,431,176,1,74,84,0,0,1,36,24,0,78,0,10,12,0,2,47,149,250,1276,576,384,0,0,0,0,0,0,0,0,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,0,0,0,0,4069,1
-1112,DRAKE,Drake,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,85,80,49,75,79,50,10,12,1,1,29,1205,400,620,420,360,14300,10000,504,5000,719,500,0,0,1127,600,1125,950,1135,150,1128,400,5019,350,985,3200,984,2300,0,0,0,0,4137,1
-1113,DROPS,Drops,Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,512,800,620,20,0,0,0,0,4004,1
-1114,DUSTINESS,Dustiness,Dustiness,21,1044,0,218,140,1,80,102,0,10,1,53,17,0,38,5,10,12,0,4,44,145,150,1004,504,384,0,0,0,0,0,0,0,0,1057,9000,1058,500,2291,4,928,2000,1001,10,507,1200,0,0,0,0,0,0,4056,1
-1115,EDDGA,Eddga,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,78,70,85,66,90,85,10,12,2,2,23,1205,300,872,1344,432,12512,10000,1029,5000,1030,1000,994,3000,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,0,0,0,0,4123,1
-1116,EGGYRA,Eggyra,Eggyra,24,633,0,215,220,1,85,107,20,25,1,36,24,0,32,0,10,12,1,0,48,145,200,1816,816,288,0,0,0,0,0,0,0,0,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,0,0,0,0,4070,1
-1117,EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,2890,1827,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,1173,300,2276,576,336,0,0,0,0,0,0,0,0,2217,10,1615,1,2508,2,1551,10,610,200,7478,4,509,2000,0,0,0,0,4141,1
-1118,FLORA,Flora,Flora,26,2092,0,357,226,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,1032,9000,2253,3,704,10,521,50,629,20,905,2000,748,1,0,0,0,0,4080,1
-1119,FRILLDORA,Frilldora,Frilldora,30,2023,0,529,319,1,200,239,0,10,35,30,38,15,53,30,10,12,1,2,23,2181,300,1540,720,432,0,0,0,0,0,0,0,0,1012,5500,757,90,903,1500,721,15,715,200,507,800,912,120,0,0,0,0,4088,1
-1120,GHOSTRING,Ghostring,Ghostring,18,73300,0,101,108,1,82,122,0,60,40,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,1059,5335,2274,100,2336,50,604,500,603,10,714,30,695,100,0,0,0,0,4047,1
-1121,GIEARTH,Giearth,Giearth,29,2252,0,495,301,1,154,185,10,50,25,29,46,60,64,105,10,12,0,6,22,145,200,1848,1296,432,0,0,0,0,0,0,0,0,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,0,0,0,0,0,0,4087,1
-1122,GOBLIN_1,Goblin,Goblin,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,9000,756,43,2297,3,1211,10,2104,5,507,1800,0,0,0,0,4060,1
-1123,GOBLIN_2,Goblin,Goblin,24,1034,0,287,176,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,998,250,911,9000,5010,3,1511,10,2104,1,507,1550,2297,3,0,0,0,0,4060,1
-1124,GOBLIN_3,Goblin,Goblin,24,1034,0,357,176,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,998,230,911,9000,2275,3,5088,15,2104,1,507,1550,508,220,0,0,0,0,4060,1
-1125,GOBLIN_4,Goblin,Goblin,23,1359,0,264,164,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,993,100,998,170,5087,15,2263,3,1508,10,2104,1,507,1500,0,0,0,0,4060,1
-1126,GOBLIN_5,Goblin,Goblin,22,1952,0,241,152,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,998,150,911,9000,1605,15,2104,1,5089,15,507,1500,508,220,0,0,0,0,4060,1
-1127,HODE,Hode,Hode,26,2282,0,550,300,1,146,177,0,30,1,26,42,5,49,40,10,12,1,2,42,129,200,1480,480,720,0,0,0,0,0,0,0,0,993,120,1055,9000,757,80,938,3000,1146,10,7021,1,632,20,0,0,0,0,4081,1
-1128,HORN,Horn,Horn,18,659,0,134,86,1,58,69,10,0,22,18,28,10,47,15,10,12,1,4,22,145,200,1528,528,288,0,0,0,0,0,0,0,0,993,80,1011,35,947,5500,1452,15,935,5500,943,70,0,0,0,0,0,0,4045,1
-1129,HORONG,Horong,Horong,34,1939,0,786,479,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,0,0,0,0,4103,1
-1130,JAKK,Jakk,Jakk,38,3581,0,1408,880,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,9000,912,900,985,31,2331,5,1008,5,535,1000,0,0,0,0,0,0,4109,1
-1131,JOKER,Joker,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,1173,100,1364,864,432,0,0,0,0,0,0,0,0,912,2000,616,2,641,20,508,1000,1259,1,984,100,695,100,0,0,0,0,4139,1
-1132,KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,58,65,48,5,73,40,10,12,2,1,29,1173,350,528,1000,396,0,0,0,0,0,0,0,0,932,8000,985,191,5017,1,2108,2,1004,10,509,2000,1127,2,0,0,0,0,4136,1
-1133,KOBOLD_1,Kobold,Kobold,36,3893,0,988,625,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
-1134,KOBOLD_2,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1
-1135,KOBOLD_3,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,0,0,2104,3,508,100,0,0,0,0,4091,1
-1136,KOBOLD_4,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1
-1137,KOBOLD_5,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1
-1138,MAGNOLIA,Magnolia,Magnolia,26,3195,0,393,248,1,120,151,5,30,1,26,26,0,39,5,10,12,0,6,21,131,250,1560,360,360,0,0,0,0,0,0,0,0,7031,9000,910,800,911,100,912,10,737,40,508,400,12127,5,0,0,0,0,4076,1
-1139,MANTIS,Mantis,Mantis,26,2472,0,393,248,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,0,0,0,0,0,0,0,0,993,110,1031,9000,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1
-1140,MARDUK,Marduk,Marduk,40,4214,0,1238,752,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,0,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1
-1141,MARINA,Marina,Marina,21,2087,0,218,140,1,84,106,0,5,1,21,21,0,36,10,10,12,0,3,41,129,400,2280,1080,864,0,0,0,0,0,0,0,0,1052,5000,938,1500,991,45,995,2,717,200,631,20,0,0,0,0,0,0,4055,1
-1142,MARINE_SPHERE,Marine Sphere,Marine Sphere,28,3518,0,461,284,1,120,320,0,40,1,28,28,0,33,50,10,12,0,3,41,0,800,1201,1,1,0,0,0,0,0,0,0,0,1050,5000,1051,2500,1520,10,720,10,717,150,10003,10,0,0,0,0,0,0,4084,1
-1143,MARIONETTE,Marionette,Marionette,41,3222,0,1078,1276,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,0,0,0,0,0,0,0,0,1060,9000,2294,5,2605,1,699,100,1520,15,2407,1,5141,3,0,0,0,0,4113,1
-1144,MARSE,Marse,Marse,31,5034,0,586,370,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,1024,9000,962,3000,717,200,720,10,995,12,1007,5,514,300,0,0,0,0,4095,1
-1145,MARTIN,Martin,Martin,18,1109,0,134,86,1,52,63,0,5,12,18,30,15,15,5,10,12,0,2,42,129,300,1480,480,480,0,0,0,0,0,0,0,0,1017,9000,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1
-1146,MATYR,Matyr,Matyr,31,2585,0,967,407,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,0,0,0,0,0,0,0,0,2618,10,528,5000,919,5500,537,400,757,100,514,200,0,0,0,0,0,0,4097,1
-1147,MAYA,Maya,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,95,97,76,95,82,105,10,12,2,4,82,1205,100,864,1000,480,21450,10000,730,2000,603,3000,617,2000,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,0,0,0,0,4146,1
-1148,MEDUSA,Medusa,Medusa,79,16408,0,6876,4697,1,827,1100,28,18,1,74,50,57,77,69,10,12,1,6,40,1173,180,1720,1320,360,0,0,0,0,0,0,0,0,1048,5335,1965,250,702,200,2610,150,722,250,967,3500,1007,3,0,0,0,0,4124,1
-1149,MINOROUS,Minorous,Minorous,52,7431,0,2750,1379,1,590,770,15,5,65,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,0,0,0,0,0,0,0,0,941,5335,756,196,1361,2,1005,10,516,1500,1301,200,568,300,0,0,0,0,4126,1
-1150,MOONLIGHT,Moonlight Flower,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,55,99,55,82,95,120,10,12,1,6,63,1205,150,1276,576,288,13750,10000,1022,5000,504,1500,728,500,5008,1000,1234,100,1525,150,10008,500,638,650,985,2600,984,1900,0,0,0,0,4131,1
-1151,MYST,Myst,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,5005,2,1019,800,10005,10,756,65,757,97,605,20,514,35,0,0,0,0,4108,1
-1152,ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,315,194,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,922,5500,932,3500,757,80,2299,2,1358,10,511,50,0,0,0,0,0,0,4085,1
-1153,ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,196,120,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2181,400,2852,1152,840,0,0,0,0,0,0,0,0,1043,5500,938,3000,714,1,0,0,0,0,0,0,0,0,0,0,0,0,4071,1
-1154,PASANA,Pasana,Pasana,61,8289,0,4087,2135,1,513,682,29,35,1,73,50,61,59,43,10,12,1,7,43,149,165,976,576,288,0,0,0,0,0,0,0,0,7110,4365,7121,2500,757,20,1105,500,1217,150,2522,100,0,0,0,0,0,0,4099,1
-1155,PETIT,Petite,Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,55,79,60,10,12,1,9,22,149,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5335,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
-1156,PETIT_,Petite,Petite,45,5747,0,1758,1075,1,300,355,20,45,1,113,45,55,73,80,10,12,1,9,24,149,150,1420,1080,528,0,0,0,0,0,0,0,0,1036,5335,1037,300,985,61,509,1000,13006,5,912,1500,606,15,0,0,0,0,4120,1
-1157,PHARAOH,Pharaoh,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,1205,125,868,768,288,57495,10000,607,5500,526,5000,732,5000,7113,5820,7114,2500,1136,100,2327,150,5002,500,1552,300,1231,80,0,0,0,0,4148,1
-1158,PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,0,88,75,10,12,1,5,41,145,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,5500,963,2000,720,5,517,1000,951,500,756,25,0,0,0,0,0,0,4077,1
-1159,PHREEONI,Phreeoni,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,12,2,2,60,1205,200,1020,1020,288,16087,10000,1008,500,730,1000,1000,4000,1015,9700,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,0,0,0,0,4121,1
-1160,PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,139,200,1288,288,576,0,0,0,0,0,0,0,0,955,9000,910,1100,938,600,992,30,1001,5,1002,400,757,31,0,0,0,0,4043,1
-1161,PLANKTON,Plankton,Plankton,10,354,0,23,18,1,26,31,0,5,1,10,10,0,15,0,10,12,0,3,61,129,400,2208,1008,324,0,0,0,0,0,0,0,0,1052,9000,910,300,938,700,970,4,713,1000,630,20,645,50,0,0,0,0,4024,1
-1162,RAFFLESIA,Rafflesia,Rafflesia,17,1333,0,333,333,3,105,127,0,2,1,18,24,11,37,10,10,12,0,3,22,133,150,512,528,240,0,0,0,0,0,0,0,0,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,0,0,0,0,4083,1
-1163,RAYDRIC,Raydric,Raydric,52,8613,0,3410,1795,1,830,930,40,15,58,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,0,0,0,0,0,0,0,0,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,4850,0,0,0,0,4133,1
-1164,REQUIEM,Requiem,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,603,35,714,1,912,2500,958,3500,934,1500,2308,10,7477,1,0,0,0,0,4104,1
-1165,SAND_MAN,Sandman,Sandman,34,3413,0,810,492,1,180,205,10,25,24,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1
-1166,SAVAGE,Savage,Savage,26,2092,0,521,248,1,120,150,10,5,1,26,54,10,37,15,10,12,2,2,42,145,150,1960,960,384,0,0,0,0,0,0,0,0,1028,9000,514,300,702,2,2276,1,605,10,757,70,526,2,0,0,0,0,4078,1
-1167,SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,9000,1302,100,517,500,1750,1000,949,850,1010,80,627,40,0,0,0,0,4017,1
-1168,SCORPION_KING,Scorpion King,Scorpion King,50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,145,200,1700,1000,500,0,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1
-1169,SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,397,240,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,0,0,0,0,4092,1
-1170,SOHEE,Sohee,Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,250,2112,912,576,0,0,0,0,0,0,0,0,1020,9000,1049,50,2277,1,2504,5,1217,5,507,1000,662,350,0,0,0,0,4100,1
-1171,SOLDIER_ANDRE,Soldier Andre,Soldier Andre,22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1
-1172,SOLDIER_DENIRO,Soldier Deniro,Soldier Deniro,29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,149,200,2000,1000,500,0,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1
-1173,SOLDIER_PIERE,Soldier Piere,Soldier Piere,23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1
-1174,STAINER,Stainer,Stainer,16,538,0,105,70,1,53,64,10,0,1,40,16,5,30,5,10,12,0,4,24,145,200,1688,1188,612,0,0,0,0,0,0,0,0,992,70,1011,30,1013,9000,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1
-1175,TAROU,Tarou,Tarou,11,284,0,57,28,1,34,45,0,0,1,20,11,10,24,5,10,12,0,2,27,145,150,1744,1044,684,0,0,0,0,0,0,0,0,1016,9000,919,3000,949,800,528,1000,701,2,0,0,0,0,0,0,0,0,4028,1
-1176,VITATA,Vitata,Vitata,20,894,0,163,101,1,69,80,15,20,1,20,25,65,40,70,10,12,0,4,22,145,300,1768,768,384,0,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1
-1177,ZENORC,Zenorc,Zenorc,31,2585,0,967,407,1,188,223,0,15,1,77,15,0,76,10,10,12,1,7,27,131,150,1180,480,360,0,0,0,0,0,0,0,0,1044,5500,756,70,938,2500,1006,5,508,100,640,20,0,0,0,0,0,0,4096,1
-1178,ZEROM,Zerom,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,0,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,1002,300,0,0,0,0,4064,1
-1179,WHISPER,Whisper,Whisper,34,1796,0,591,599,1,180,221,0,45,1,51,14,0,60,0,10,12,0,6,68,149,150,1960,960,504,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1
-1180,NINE_TAIL,Nine Tail,Nine Tail,51,7766,0,2812,825,1,610,734,10,25,1,80,46,1,74,85,10,12,1,2,63,1173,150,840,540,480,0,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1
-1181,ZOMBIE_DRAGON,Zombie Dragon,Zombie Dragon,1,1000,0,49500,1650,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,1205,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1182,THIEF_MUSHROOM,Thief Mushroom,Thief Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1183,CHONCHON_,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,2181,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1
-1184,FABRE_,Fabre,Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,2181,400,1672,672,480,0,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,4002,0
-1185,WHISPER_,Whisper,Whisper,34,1796,0,537,545,1,198,239,0,45,1,51,14,0,60,0,10,12,0,1,28,0,150,1960,960,504,0,0,0,0,0,0,0,0,1001,10,1059,100,2282,0,2333,1,0,0,0,0,0,0,0,0,0,0,4102,0
-1186,WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,48,1173,250,2536,1536,672,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4303,1
-1187,SWITCH,Switch,Switch,1,2,0,1,1,1,1,2,0,0,1,1,1,0,1,0,1,12,1,0,20,0,1,1,1,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
-1188,BON_GUN,Bongun,Bongun,32,3520,0,424,242,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,5046,1,609,15,508,1000,508,1250,0,0,0,0,4212,1
-1189,ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,1729,1787,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,149,300,1960,620,480,0,0,0,0,0,0,0,0,1063,4656,1753,1000,1756,2500,1755,2500,1716,2,507,1400,509,900,0,0,0,0,4256,1
-1190,ORC_LORD,Orc Lord,Orc Lord,74,393000,0,62205,8580,1,2700,3150,40,5,85,82,149,70,110,85,10,12,2,7,82,1205,100,1248,500,360,31102,10000,968,5500,617,2000,0,0,1363,200,2601,500,5007,150,2627,1000,0,0,985,4268,984,3100,0,0,0,0,4135,1
-1191,MIMIC,Mimic,Mimic,51,6120,0,165,165,1,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,0,0,0,0,0,0,0,0,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,0,0,0,0,4205,1
-1192,WRAITH,Wraith,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,65,95,35,10,12,2,1,89,1173,300,1816,576,240,0,0,0,0,0,0,0,0,1059,5820,2206,10,2506,2,716,650,602,1300,2505,10,731,5,0,0,0,0,4190,1
-1193,ALARM,Alarm,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,1173,300,1020,500,768,0,0,0,0,0,0,0,0,1095,5335,2607,1,7005,1500,611,1300,984,105,7026,20,912,1500,0,0,0,0,4244,1
-1194,ARCLOUSE,Arclouse,Arclouze,59,6075,0,860,1000,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,0,0,0,0,0,0,0,0,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,0,0,0,0,4240,1
-1195,RIDEWORD,Rideword,Rideword,59,11638,0,2007,3106,1,584,804,5,35,48,75,10,20,120,45,10,12,0,0,60,1173,150,864,500,192,0,0,0,0,0,0,0,0,1097,4850,1553,4,1554,4,1555,2,1556,2,7015,300,1006,20,0,0,0,0,4185,1
-1196,SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,2466,1562,1,660,890,10,20,55,20,36,0,76,25,10,12,1,1,69,141,350,1848,500,576,0,0,0,0,0,0,0,0,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,0,0,0,0,4222,1
-1197,ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,2635,1724,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,141,350,1768,500,192,0,0,0,0,0,0,0,0,1099,3500,7016,105,2266,1,716,600,930,3500,2408,39,985,112,0,0,0,0,4275,1
-1198,DARK_PRIEST,Dark Priest,Dark Priest,79,101992,0,12192,5152,2,1238,2037,56,70,5,91,41,101,103,42,10,12,1,6,89,141,200,864,1252,476,0,0,0,0,0,0,0,0,1557,5,2608,30,505,100,716,450,1009,50,2319,5,1241,1,0,0,0,0,4171,1
-1199,PUNK,Punk,Punk,43,3620,0,1699,1033,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,0,0,0,0,0,0,0,0,7001,5335,715,800,10004,100,1061,1000,1057,3000,601,1100,2502,15,0,0,0,0,4313,1
-1200,ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,3608,2304,1,700,850,10,15,70,85,40,30,125,60,10,12,1,7,60,141,200,800,2112,768,0,0,0,0,0,0,0,0,7017,5,509,1800,7293,1500,2331,8,2622,1,1970,100,2291,3,0,0,0,0,4277,1
-1201,RYBIO,Rybio,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,141,200,1790,1440,540,0,0,0,0,0,0,0,0,1015,3880,7017,3,509,1800,731,30,1008,10,984,100,709,30,0,0,0,0,4194,1
-1202,PHENDARK,Phendark,Phendark,73,22729,0,6826,3443,2,794,1056,52,36,1,62,120,65,76,66,10,12,2,7,40,141,175,1744,1344,600,0,0,0,0,0,0,0,0,1015,3880,7017,4,509,1800,0,0,984,150,1971,100,0,0,0,0,0,0,4329,1
-1203,MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,1205,250,1152,500,240,0,0,0,0,0,0,0,0,7019,1,7297,1500,1152,70,1155,40,1163,2,999,120,984,243,0,0,0,0,4207,1
-1204,TIRFING,Tirfing,Ogretooth,71,29900,0,5412,4235,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,1205,100,816,500,240,0,0,0,0,0,0,0,0,7022,1,638,50,7292,1500,1214,70,1217,40,999,120,984,189,0,0,0,0,4254,1
-1205,EXECUTIONER,Executioner,Executioner,65,28980,0,4730,3536,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,1205,200,768,500,384,0,0,0,0,0,0,0,0,7024,5,7290,1500,1111,80,1114,60,1125,40,999,120,984,145,0,0,0,0,4250,1
-1206,ANOLIAN,Anolian,Anolian,61,18960,0,5900,3700,1,640,980,15,15,1,43,58,25,80,65,10,12,1,5,41,1173,190,900,500,864,0,0,0,0,0,0,0,0,7003,4850,1754,2000,526,5,10019,10,943,5335,2625,1,984,134,0,0,0,0,4234,1
-1207,STING,Sting,Sting,61,9500,0,4081,2970,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,1173,300,528,500,240,0,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,719,3,0,0,0,0,4226,1
-1208,WANDER_MAN,Wander Man,Wanderer,74,8170,0,5786,4730,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,1173,100,672,500,192,0,0,0,0,0,0,0,0,7005,4850,616,1,13015,5,2270,5,610,650,984,217,1164,1,0,0,0,0,4210,1
-1209,CRAMP,Cramp,Cramp,56,4720,0,2300,1513,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,250,510,70,984,95,0,0,0,0,4296,1
-1210,FILAMENTOUS,Filamentous,Filamentous,51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1
-1211,BRILIGHT,Brilight,Brilight,46,5562,0,1826,1331,1,298,383,30,5,1,90,15,10,50,35,10,12,0,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,602,1000,757,220,610,250,509,2600,0,0,0,0,4213,1
-1212,IRON_FIST,Iron Fist,Iron Fist,47,4221,0,1435,1520,1,430,590,40,5,1,25,15,10,81,20,10,12,1,4,60,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1
-1213,HIGH_ORC,High Orc,High Orc,52,6890,0,3618,1639,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,1173,150,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1
-1214,CHOCO,Choco,Choco,43,4278,0,1265,1265,1,315,402,5,5,65,68,55,45,65,25,10,12,0,2,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,532,1000,607,25,0,0,0,0,4285,1
-1215,STEM_WORM,Stem Worm,Stem Worm,40,6136,0,1452,939,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7012,5335,509,1800,1968,10,756,115,997,5,1454,20,608,45,0,0,0,0,4224,1
-1216,PENOMENA,Penomena,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,1173,400,832,500,600,0,0,0,0,0,0,0,0,7013,4850,962,8000,938,7000,525,200,719,15,1258,1,716,550,0,0,0,0,4314,1
-1219,KNIGHT_OF_ABYSS,Knight of Abyss,Abysmal Knight,79,36140,0,8469,6268,1,1600,2150,55,50,66,68,64,25,135,50,10,12,2,7,87,1685,300,1500,500,1000,0,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1410,25,1162,1,985,369,984,259,0,0,0,0,4140,1
-1220,M_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,388,242,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,1717,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1
-1221,M_SAVAGE,Savage,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,1717,150,1960,960,384,0,0,0,0,0,0,0,0,1028,6000,514,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1
-1222,L_HIGH_ORC,High Orc,High Orc,52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1
-1223,L_ORC,Orc,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,1717,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1224,L_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,1717,200,1672,672,288,0,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1
-1225,L_CHOCO,Choco,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1
-1226,L_KOBOLD,Kobold,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,1717,200,1028,528,360,0,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
-1227,L_GOBLIN,Goblin,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,1717,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1
-1228,L_PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,1717,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1
-1229,META_FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1
-1230,META_PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1
-1231,META_CREAMY,Creamy,Creamy,16,595,0,96,64,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,200,1220,720,288,0,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1
-1232,META_PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1
-1233,CONCEIVE_PECOPECO,Peco Peco,Peco Peco,19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,129,200,1564,864,576,0,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1
-1234,PROVOKE_YOYO,Yoyo,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,6000,7182,500,508,130,919,5500,753,7,578,500,582,1000,0,0,0,0,4051,1
-1235,SMOKING_ORC,Smoking Orc,Smoking Orc,24,1400,0,261,160,1,114,136,10,20,1,24,48,20,34,0,10,12,1,7,22,653,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1236,META_ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1
-1237,META_ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,651,300,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1000,935,3000,1001,6,1002,350,757,28,0,0,0,0,4043,1
-1238,META_PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,651,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
-1239,META_DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,651,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
-1240,META_PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,0,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,2302,150,507,650,519,350,715,60,0,0,0,0,0,0,4008,1
-1241,META_PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,0,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,5015,7,507,750,519,350,715,60,0,0,0,0,0,0,4011,1
-1242,MARIN,Marin,Marin,15,742,0,66,44,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,910,3200,938,1500,700,100,720,40,510,75,529,350,5035,1,0,0,0,0,4196,1
-1243,SASQUATCH,Sasquatch,Sasquatch,30,3163,0,529,319,1,250,280,5,0,75,25,60,10,34,20,10,12,2,2,60,1173,300,1260,192,192,0,0,0,0,0,0,0,0,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,0,0,0,0,4216,1
-1244,JAKK_XMAS,Christmas Jakk,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,644,20,7175,1200,7174,1200,0,0,0,0,4109,1
-1245,GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,7174,550,7175,550,756,43,644,10,1211,10,2104,5,2236,10,0,0,0,0,4060,1
-1246,COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,461,284,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,538,1500,722,45,912,200,2502,25,644,5,688,100,507,1700,0,0,0,0,4235,1
-1247,ANTONIO,Antonio,Antonio,10,10,0,3,2,1,13,20,100,0,1,1,1,50,100,100,10,12,1,3,66,129,100,720,720,432,0,0,0,0,0,0,0,0,7034,10000,644,200,538,1500,539,1000,529,5500,530,5500,2236,250,0,0,0,0,4243,1
-1248,CRUISER,Cruiser,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,133,400,1296,1296,432,0,0,0,0,0,0,0,0,1098,900,2251,2,998,320,996,5,911,3500,13150,5,756,87,0,0,0,0,4297,1
-1249,MYSTCASE,Myst Case,Myst Case,38,3450,0,1113,688,1,160,360,5,10,65,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,530,90,912,1500,603,20,539,800,722,150,731,5,529,340,0,0,0,0,4206,1
-1250,CHEPET,Chepet,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,1173,400,672,672,288,0,0,0,0,0,0,0,0,7035,2500,912,750,512,5500,619,40,10019,5,508,1300,2508,5,0,0,0,0,4284,1
-1251,KNIGHT_OF_WINDSTORM,Knight of Windstorm,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,75,185,83,55,130,79,10,12,2,0,84,1205,200,468,468,288,32175,10000,720,4500,2406,500,995,3000,1468,150,603,3000,617,4000,2621,200,2506,500,985,4559,5007,1,0,0,0,0,4318,1
-1252,GARM,Garm,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,85,126,82,65,95,60,10,12,2,2,81,1205,400,608,408,336,25025,10000,7036,1000,603,3000,995,3000,7036,5500,1131,150,1256,500,1815,500,0,0,985,3977,984,2900,0,0,0,0,4324,1
-1253,GARGOYLE,Gargoyle,Gargoyle,48,3950,0,1650,1650,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,912,3880,1039,500,0,0,0,0,2619,1,1769,2000,757,238,0,0,0,0,4149,1
-1254,RAGGLER,Raggler,Raggler,21,1020,0,218,140,1,102,113,0,5,18,10,32,20,39,35,10,12,0,2,24,1173,200,1000,900,384,0,0,0,0,0,0,0,0,7053,3000,916,5000,645,200,514,200,992,90,2225,7,756,32,0,0,0,0,4186,1
-1255,NERAID,Neraid,Nereid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,1173,200,776,576,288,0,0,0,0,0,0,0,0,1055,5100,7053,1000,510,230,1966,10,514,250,757,180,985,37,0,0,0,0,4167,1
-1256,PEST,Pest,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,1173,165,700,648,480,0,0,0,0,0,0,0,0,1055,5500,7054,200,702,10,605,100,716,250,0,0,756,115,0,0,0,0,4315,1
-1257,INJUSTICE,Injustice,Injustice,51,7600,0,2118,1488,1,480,600,0,0,84,42,39,0,71,35,10,12,1,1,47,1173,400,770,720,336,0,0,0,0,0,0,0,0,999,300,7054,5335,7053,3500,2313,5,2316,2,660,2,1255,2,0,0,0,0,4268,1
-1258,GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,461,284,9,89,113,0,0,10,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,2297,3,998,250,911,1000,1765,3000,507,600,1705,25,514,300,0,0,0,0,4157,1
-1259,GRYPHON,Gryphon,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,68,95,78,65,115,75,10,12,2,2,84,1205,100,704,504,432,0,0,0,0,0,0,0,0,7048,2500,7054,5335,7063,120,1452,1500,1417,1,984,185,996,150,0,0,0,0,4163,1
-1260,DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,3652,3271,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,1173,200,920,720,200,0,0,0,0,0,0,0,0,7054,4656,734,1000,2505,30,0,0,0,0,1000,80,747,3,0,0,0,0,4170,1
-1261,WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,1113,688,1,315,360,0,15,65,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,7053,5335,748,50,5037,120,1767,3000,624,35,528,600,2244,2,0,0,0,0,4257,1
-1262,MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,1205,250,1280,1080,240,0,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,400,7296,1500,12040,10,0,0,0,0,4203,1
-1263,WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,2424,1488,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,1173,150,1056,1056,336,0,0,0,0,0,0,0,0,912,4559,932,6000,7005,500,693,100,1611,8,996,100,1615,1,0,0,0,0,4264,1
-1264,MERMAN,Merman,Merman,53,14690,0,4500,3000,2,482,964,10,35,72,45,46,35,60,55,10,12,1,7,61,1173,220,916,816,336,0,0,0,0,0,0,0,0,1054,1300,523,300,568,400,720,40,995,35,1460,3,756,203,0,0,0,0,4199,1
-1265,COOKIE,Cookie,Cookie,25,950,0,310,188,1,130,145,0,25,1,35,20,53,37,90,10,12,0,7,60,137,200,1036,936,240,0,0,0,0,0,0,0,0,538,1000,530,150,979,1,645,280,2402,30,12001,100,529,320,0,0,0,0,4293,1
-1266,ASTER,Aster,Aster,18,1372,0,122,78,1,56,64,0,10,1,19,15,0,34,5,10,12,0,5,22,145,400,1264,864,216,0,0,0,0,0,0,0,0,938,500,7013,40,1052,1200,508,200,912,60,512,100,0,0,0,0,0,0,4247,1
-1267,CARAT,Carat,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,7054,3200,536,1000,2409,5,5003,1,0,0,0,0,509,1450,0,0,0,0,4288,1
-1268,BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,10120,6820,3,2150,3030,60,50,88,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,7054,4850,2229,45,2317,5,2106,65,1170,1,1417,2,985,433,0,0,0,0,4320,1
-1269,CLOCK,Clock,Clock,60,11050,0,3410,2904,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,1095,5335,1019,800,509,1900,568,320,7026,30,7027,30,985,163,0,0,0,0,4299,1
-1270,C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,4378,2850,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,1095,5335,7054,5335,999,500,520,850,2109,1,7026,2000,7027,2000,0,0,0,0,4229,1
-1271,ALLIGATOR,Alligator,Alligator,42,6962,0,1379,866,1,315,360,2,5,1,45,50,10,69,65,10,12,1,2,21,145,200,1100,900,480,0,0,0,0,0,0,0,0,912,1000,1099,600,7003,2000,608,50,0,0,0,0,756,129,0,0,0,0,4252,1
-1272,DARK_LORD,Dark Lord,Dark Lord,80,360000,0,65780,45045,2,2800,3320,30,70,1,120,64,118,99,60,10,12,2,6,89,1205,100,868,768,480,32890,10000,7005,6000,5093,500,617,2000,1615,800,5017,550,1237,300,2334,300,2507,100,985,5141,984,3977,0,0,0,0,4168,1
-1273,ORC_LADY,Orc Lady,Orc Lady,31,2000,0,644,407,1,135,170,10,10,35,42,25,15,69,55,10,12,1,7,42,1173,200,1050,900,288,0,0,0,0,0,0,0,0,7053,4656,998,300,2602,1,2206,1,12127,10,7477,3,2338,1,0,0,0,0,4255,1
-1274,MEGALITH,Megalith,Megalith,45,5300,0,1758,1075,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,912,100,7049,1000,617,1,0,0,0,0,985,61,757,207,0,0,0,0,4200,1
-1275,ALICE,Alice,Alice,62,10000,0,3583,2400,1,550,700,5,5,64,64,42,85,100,130,10,12,1,7,60,145,200,502,2304,480,0,0,0,0,0,0,0,0,7047,2500,637,40,2407,3,739,30,5085,1,12128,10,12002,100,0,0,0,0,4253,1
-1276,RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,3025,2125,9,415,500,35,5,15,25,22,5,145,35,10,12,1,6,47,133,200,1152,1152,480,0,0,0,0,0,0,0,0,7054,4656,0,0,2315,2,1701,150,1764,2000,1715,3,985,106,0,0,0,0,4187,1
-1277,GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,1238,752,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,2000,1019,2000,1501,100,662,300,2272,1,508,250,686,100,0,0,0,0,4283,1
-1278,STALACTIC_GOLEM,Stalactic Golem,Stalactic Golem,60,18700,0,5808,2695,1,950,1260,50,5,73,45,85,5,90,25,10,12,2,0,80,145,200,1264,864,288,0,0,0,0,0,0,0,0,7004,2000,7054,4850,1000,250,997,30,757,250,0,0,985,163,0,0,0,0,4223,1
-1279,TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,386,220,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,1173,200,860,660,624,0,0,0,0,0,0,0,0,7053,100,943,380,606,200,993,160,1001,140,0,0,757,106,0,0,0,0,4308,1
-1280,STEAM_GOBLIN,Steam Goblin,Goblin Steamrider,35,2490,0,864,495,1,234,269,20,5,58,59,32,15,75,25,10,12,1,7,44,145,200,1008,1008,528,0,0,0,0,0,0,0,0,911,2500,7053,3880,998,300,999,55,1003,320,13104,5,757,124,0,0,0,0,4156,1
-1281,SAGEWORM,Sage Worm,Sage Worm,43,3850,0,1155,1320,1,120,280,0,50,1,52,24,88,79,55,10,12,0,2,60,145,200,936,936,288,0,0,0,0,0,0,0,0,693,100,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1
-1282,KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,739,455,9,155,185,10,5,10,20,15,30,100,25,10,12,0,7,23,133,200,1008,1008,384,0,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1
-1283,CHIMERA,Chimera,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,1205,200,772,672,360,0,0,0,0,0,0,0,0,7054,5335,1048,2500,568,1000,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1
-1284,HUGELING,Hugeling,Hugeling,1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,145,200,1872,672,480,0,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0
-1285,ARCHER_GUARDIAN,Archer Guardian,Archer Guardian,74,28634,0,1,1,12,1120,1600,35,60,95,80,80,90,165,55,14,16,2,7,80,165,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1286,KNIGHT_GUARDIAN,Knight Guardian,Knight Guardian,86,30214,0,1,1,2,1280,1560,55,30,110,40,140,65,125,65,14,16,2,7,80,165,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1287,SOLDIER_GUARDIAN,Soldier Guardian,Soldier Guardian,56,15670,0,1,1,1,873,1036,35,0,85,56,100,45,103,43,10,12,0,4,22,165,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1288,EMPELIUM,Emperium,Emperium,90,68430,0,0,0,1,60,71,40,50,1,17,80,50,26,20,10,12,0,8,26,0,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1289,MAYA_PUPLE,Maya Purple,Maya Purple,81,55479,0,10496,3893,2,1447,2000,68,48,95,90,80,95,90,119,10,12,2,4,82,1205,100,1024,1000,480,0,0,0,0,0,0,0,0,7053,4413,757,250,756,300,969,100,984,150,10006,1,7481,2,0,0,0,0,4198,1
-1290,SKELETON_GENERAL,Skeleton General,Skeleton General,73,17402,0,8170,3370,1,910,1089,25,25,90,25,40,20,77,25,10,12,1,1,29,1173,150,2276,576,432,0,0,0,0,0,0,0,0,7068,2550,756,160,508,800,1220,35,1219,80,1222,3,2274,1,0,0,0,0,4221,1
-1291,WRAITH_DEAD,Wraith Dead,Wraith Dead,74,43021,0,10341,3618,2,1366,1626,25,30,5,99,55,75,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,1059,4413,2206,10,2506,8,716,700,732,5,603,100,568,300,0,0,0,0,4189,1
-1292,MINI_DEMON,Mini Demon,Mini Demon,68,32538,0,8396,3722,1,1073,1414,30,25,5,75,40,55,89,42,10,12,0,6,27,1173,150,1000,600,384,0,0,0,0,0,0,0,0,1038,4413,1039,450,2255,3,757,160,912,2500,1009,10,1410,3,0,0,0,0,4204,1
-1293,CREMY_FEAR,Creamy Fear,Creamy Fear,62,13387,0,7365,2691,2,666,829,45,30,5,40,16,15,68,55,10,12,0,4,24,1173,155,1136,720,840,0,0,0,0,0,0,0,0,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,0,0,0,0,4298,1
-1294,KILLER_MANTIS,Killer Mantis,Killer Mantis,56,13183,0,6509,2366,1,764,927,35,20,5,26,24,5,75,40,10,12,1,4,22,1173,175,1528,660,432,0,0,0,0,0,0,0,0,1031,4550,943,2500,721,10,509,15,514,25,1262,1,2108,1,0,0,0,0,4301,1
-1295,OWL_BARON,Owl Baron,Owl Baron,75,60746,0,10967,4811,2,1252,1610,65,25,25,25,80,95,95,55,10,12,2,6,60,1205,175,1345,824,440,0,0,0,0,0,0,0,0,7071,3500,7063,2500,1716,2,1472,1,1402,25,693,100,5045,5,0,0,0,0,4238,1
-1296,KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,18313,0,7432,2713,1,649,958,37,37,5,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,999,450,1034,6305,912,1200,1511,6,1613,2,525,150,526,100,0,0,0,0,4291,1
-1297,ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,8040,3499,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,930,4413,934,1800,2624,1,2611,150,508,650,756,150,757,100,0,0,0,0,4248,1
-1298,ZOMBIE_MASTER,Zombie Master,Zombie Master,62,14211,0,7610,2826,1,824,1084,37,26,25,20,30,5,77,35,10,12,1,1,29,1173,175,2612,912,288,0,0,0,0,0,0,0,0,7071,4413,938,1500,958,1500,723,200,727,100,1260,1,2324,2,0,0,0,0,4274,1
-1299,GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,20152,0,6036,2184,1,663,752,48,16,5,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,7054,1500,999,800,756,120,5090,50,2106,2,508,650,5113,10,0,0,0,0,4155,1
-1300,CATERPILLAR,Caterpillar,Caterpillar,64,14439,0,6272,3107,1,894,1447,47,29,35,25,85,15,69,45,10,12,0,4,22,1173,300,1672,672,480,0,0,0,0,0,0,0,0,949,3000,7054,5335,2227,20,1000,100,997,50,505,12,508,500,0,0,0,0,4289,1
-1301,AM_MUT,Am Mut,Am Mut,61,12099,0,7709,2690,1,1040,1121,50,10,50,65,40,35,83,45,10,12,0,6,27,1173,200,1156,456,384,0,0,0,0,0,0,0,0,1021,4550,757,250,1517,3,969,5,2282,1,616,1,746,250,0,0,0,0,4245,1
-1302,DARK_ILLUSION,Dark Illusion,Dark Illusion,77,103631,0,11163,4181,2,1300,1983,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,1615,3,5017,2,2508,3,7054,5335,522,120,509,1550,1162,2,0,0,0,0,4169,1
-1303,GIANT_HONET,Giant Hornet,Giant Hornet,56,13105,0,5785,2006,1,650,852,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,0,0,0,0,4271,1
-1304,GIANT_SPIDER,Giant Spider,Giant Spider,55,11874,0,6211,2146,1,624,801,41,28,5,36,43,5,73,69,10,12,2,4,25,1173,165,1468,468,768,0,0,0,0,0,0,0,0,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,0,0,0,0,4270,1
-1305,ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,8174,3782,1,948,1115,35,30,5,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,1042,4413,912,2500,2406,9,719,15,1096,680,938,3500,7054,2500,0,0,0,0,4249,1
-1306,LEIB_OLMAI,Leib Olmai,Leib Olmai,58,24233,0,6011,2171,1,740,1390,27,31,5,35,95,5,64,85,10,12,2,2,22,1173,175,1260,230,192,0,0,0,0,0,0,0,0,948,4550,2289,8,740,120,518,500,526,500,969,5,7053,800,0,0,0,0,4188,1
-1307,CAT_O_NINE_TAIL,Cat o' Nine Tails,Cat o' Nine Tails,76,64512,0,10869,4283,1,1112,1275,61,55,55,75,55,82,86,120,10,12,1,6,63,1205,155,1276,576,288,0,0,0,0,0,0,0,0,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,0,0,0,0,4290,1
-1308,PANZER_GOBLIN,Panzer Goblin,Panzer Goblin,59,14130,0,7212,2697,1,683,878,41,28,60,60,40,20,81,160,10,12,1,7,44,1173,200,960,1008,840,0,0,0,0,0,0,0,0,7053,4413,7054,3500,999,180,998,360,1003,580,13158,5,994,160,0,0,0,0,4310,1
-1309,GAJOMART,Gajomart,Gajomart,63,13669,0,6625,2900,1,917,950,85,50,5,34,10,5,75,140,10,12,0,0,83,1173,300,1000,1152,828,0,0,0,0,0,0,0,0,953,6500,912,2300,508,870,2279,8,1752,10000,999,640,994,180,0,0,0,0,4151,1
-1310,MAJORUROS,Majoruros,Majoruros,66,57991,0,8525,3799,1,780,1300,10,25,65,50,75,50,85,48,10,12,2,2,43,1173,250,1100,960,780,0,0,0,0,0,0,0,0,941,4413,1361,4,568,300,984,16,509,1850,2611,160,1000,250,0,0,0,0,4201,1
-1311,GULLINBURSTI,Gullinbursti,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,55,25,60,5,70,45,10,12,2,2,42,1173,150,1960,960,384,0,0,0,0,0,0,0,0,1028,3500,514,290,702,6,2276,1,605,15,2627,1,912,160,0,0,0,0,4164,1
-1312,TURTLE_GENERAL,Turtle General,Turtle General,97,320700,0,18202,9800,2,2438,3478,50,54,100,45,55,65,105,164,10,12,2,2,42,1205,200,900,1000,500,9101,10000,967,5500,607,1500,617,2000,1529,8,1306,5,7480,200,1417,9,7070,5335,1141,80,658,1,0,0,0,0,4305,1
-1313,MOBSTER,Mobster,Mobster,61,7991,0,4424,1688,1,910,1128,41,37,76,46,20,35,76,55,10,12,1,7,20,1173,250,1100,560,580,0,0,0,0,0,0,0,0,1239,3,726,4559,2621,1,716,600,912,2500,525,450,505,60,0,0,0,0,4317,1
-1314,PERMETER,Permeter,Permeter,63,8228,0,3756,1955,2,943,1211,46,45,69,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,967,4413,7070,45,1019,1240,507,2450,912,1240,522,25,605,1,0,0,0,0,4311,1
-1315,ASSULTER,Assaulter,Assaulter,71,11170,0,4854,2654,2,764,1499,35,28,85,74,10,35,100,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,967,4413,7069,1200,7072,840,508,1280,912,1240,13300,5,603,1,0,0,0,0,4246,1
-1316,SOLIDER,Solider,Solider,70,12099,0,4458,1951,2,797,979,57,43,69,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,64,7067,850,508,2100,912,1240,518,850,1519,1,0,0,0,0,4220,1
-1317,FUR_SEAL,Fur Seal,Seal,63,9114,0,3765,1824,1,845,1203,25,33,5,28,22,15,69,84,10,12,1,2,21,149,200,1612,622,583,0,0,0,0,0,0,0,0,912,4365,510,250,2310,5,7053,1200,1452,1,525,200,746,120,0,0,0,0,4312,1
-1318,HEATER,Heater,Heater,68,11020,0,3766,2359,2,683,1008,40,42,69,47,25,5,71,100,10,12,1,2,43,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,750,697,100,912,1640,526,140,7054,600,7068,1250,0,0,0,0,4331,1
-1319,FREEZER,Freezer,Freezer,72,8636,0,3665,2197,2,671,983,55,43,69,41,59,5,67,100,10,12,1,2,41,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,850,7066,1250,912,1800,526,160,7053,600,689,100,0,0,0,0,4319,1
-1320,OWL_DUKE,Owl Duke,Owl Duke,75,26623,0,7217,3474,1,715,910,27,49,15,45,40,75,79,88,10,12,2,6,60,1205,195,1345,824,440,0,0,0,0,0,0,0,0,7071,4413,7063,1500,693,100,747,1,1451,3,1513,2,5045,1,0,0,0,0,4237,1
-1321,DRAGON_TAIL,Dragon Tail,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,10,68,15,5,67,67,10,12,1,4,44,1173,175,862,534,312,0,0,0,0,0,0,0,0,7064,4413,1096,400,943,800,2207,8,2226,2,601,300,602,150,0,0,0,0,4178,1
-1322,SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,3982,1766,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7054,3500,7053,2500,949,2500,511,4500,508,800,510,200,509,800,0,0,0,0,4227,1
-1323,SEE_OTTER,Sea Otter,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,5,36,40,25,82,65,10,12,1,2,61,149,190,1132,583,532,0,0,0,0,0,0,0,0,722,150,965,5500,7065,4365,725,50,726,50,746,650,7053,1200,0,0,0,0,4326,1
-1324,TREASURE_BOX1,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1325,TREASURE_BOX2,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7073,80,658,500,604,10000,984,4850,985,7275,1239,1500,5027,75,1165,8,0,0,0,0
-1326,TREASURE_BOX3,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1327,TREASURE_BOX4,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7074,80,658,500,604,10000,984,4850,985,7275,2108,1000,1306,75,5022,2,0,0,0,0
-1328,TREASURE_BOX5,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1329,TREASURE_BOX6,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7075,80,658,500,604,10000,984,4850,985,7275,2102,834,5019,100,5002,9,0,0,0,0
-1330,TREASURE_BOX7,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1331,TREASURE_BOX8,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7076,80,658,500,604,10000,984,4850,985,7275,2616,500,2334,125,2622,9,0,0,0,0
-1332,TREASURE_BOX9,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1333,TREASURE_BOX10,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7077,80,658,500,604,10000,984,4850,985,7275,2104,500,2331,150,2623,10,0,0,0,0
-1334,TREASURE_BOX11,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1335,TREASURE_BOX12,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7078,80,658,500,604,10000,984,4850,985,7275,2270,500,1716,150,2256,10,0,0,0,0
-1336,TREASURE_BOX13,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1337,TREASURE_BOX14,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7079,80,658,500,604,10000,984,4850,985,7275,1238,375,1531,150,2318,10,0,0,0,0
-1338,TREASURE_BOX15,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1339,TREASURE_BOX16,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7080,80,658,500,604,10000,984,4850,985,7275,2626,300,1472,167,2327,10,0,0,0,0
-1340,TREASURE_BOX17,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1341,TREASURE_BOX18,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7081,80,658,500,604,10000,984,4850,985,7275,1143,250,1237,188,2235,12,0,0,0,0
-1342,TREASURE_BOX19,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1343,TREASURE_BOX20,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7082,80,658,500,604,10000,984,4850,985,7275,617,250,1144,188,5007,19,0,0,0,0
-1344,TREASURE_BOX21,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1345,TREASURE_BOX22,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7083,80,658,500,604,10000,984,4850,985,7275,2508,1000,2336,69,2621,20,0,0,0,0
-1346,TREASURE_BOX23,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1347,TREASURE_BOX24,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7084,80,658,500,604,10000,984,4850,985,7275,2106,1000,1164,50,5025,24,0,0,0,0
-1348,TREASURE_BOX25,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1349,TREASURE_BOX26,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7085,80,658,500,604,10000,984,4850,985,7275,2231,750,2624,46,2286,25,0,0,0,0
-1350,TREASURE_BOX27,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1351,TREASURE_BOX28,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7086,80,658,500,604,10000,984,4850,985,7275,2283,500,2615,41,2234,32,0,0,0,0
-1352,TREASURE_BOX29,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1353,TREASURE_BOX30,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7087,80,658,500,604,10000,984,4850,985,7275,2507,500,2625,38,5045,34,0,0,0,0
-1354,TREASURE_BOX31,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1355,TREASURE_BOX32,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7088,80,658,500,604,10000,984,4850,985,7275,2407,429,2269,250,2317,35,0,0,0,0
-1356,TREASURE_BOX33,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1357,TREASURE_BOX34,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7089,80,658,500,604,10000,984,4850,985,7275,2109,300,2406,273,2258,38,0,0,0,0
-1358,TREASURE_BOX35,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1359,TREASURE_BOX36,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7090,80,658,500,604,10000,984,4850,985,7275,1142,215,2255,60,5017,38,0,0,0,0
-1360,TREASURE_BOX37,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1361,TREASURE_BOX38,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7091,80,658,500,604,10000,984,4850,985,7275,1417,50,5053,50,2229,50,0,0,0,0
-1362,TREASURE_BOX39,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1363,TREASURE_BOX40,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7092,80,658,500,604,10000,984,4850,985,7275,2506,43,2254,43,1529,38,0,0,0,0
-1364,G_ASSULTER,Assaulter,Assaulter,59,12853,0,0,0,2,152,177,35,36,85,55,10,35,145,100,10,12,1,6,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,1019,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1365,APOCALIPS,Apocalypse,Apocalypse,66,22880,0,6540,4935,2,1030,1370,62,49,1,48,120,48,66,85,10,12,2,0,60,149,400,1840,1440,384,0,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,13161,1,2506,20,999,2500,0,0,0,0,4242,1
-1366,LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,6470,3879,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,2190,2040,336,0,0,0,0,0,0,0,0,7096,4559,7097,3686,2317,1,2316,2,509,2500,0,0,0,0,0,0,0,0,4184,1
-1367,BLAZZER,Blazer,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,1,6,43,149,180,1732,1332,540,0,0,0,0,0,0,0,0,7097,4850,7098,3400,509,3000,0,0,0,0,0,0,0,0,0,0,0,0,4215,1
-1368,GEOGRAPHER,Geographer,Geographer,56,8071,0,2715,2000,3,467,621,28,26,1,66,47,60,68,44,10,12,1,3,62,132,2000,1308,1008,480,0,0,0,0,0,0,0,0,1032,6200,1033,5500,2253,30,2207,50,12002,100,0,0,0,0,0,0,0,0,4280,1
-1369,GRAND_PECO,Grand Peco,Grand Peco,58,8054,0,2387,1361,2,444,565,37,30,1,66,66,50,71,51,10,12,2,2,43,137,165,1460,960,432,0,0,0,0,0,0,0,0,7101,4850,522,300,992,1000,969,1,0,0,0,0,582,500,0,0,0,0,4161,1
-1370,SUCCUBUS,Succubus,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,103,89,87,10,12,1,6,67,1173,155,1306,1056,288,0,0,0,0,0,0,0,0,522,1500,2407,3,2611,500,2613,150,5066,1,1472,1,505,1000,0,0,0,0,4218,1
-1371,FAKE_ANGEL,Fake Angel,False Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,2181,160,920,720,336,0,0,0,0,0,0,0,0,0,0,0,0,717,1000,715,1000,716,1000,12020,1000,0,0,0,0,0,0,4316,1
-1372,GOAT,Goat,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,1,2,63,137,165,1380,1080,336,0,0,0,0,0,0,0,0,7106,4559,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,0,0,0,0,4150,1
-1373,LORD_OF_DEATH,Lord of Death,Lord of the Dead,94,303383,0,131343,43345,3,2430,3232,77,73,1,99,120,109,100,106,10,12,2,6,67,1205,180,1446,1296,360,65671,10000,607,5500,732,5000,617,5000,7108,5335,1417,5,1230,10,2621,2,7109,10,1306,1,1529,2,0,0,0,0,4276,1
-1374,INCUBUS,Incubus,Incubus,75,17281,0,5254,4212,2,1408,1873,58,46,1,97,95,103,89,87,10,12,1,6,67,1173,165,850,600,336,0,0,0,0,0,0,0,0,522,1500,509,5500,5072,1,2621,1,2610,500,2613,150,509,2200,0,0,0,0,4269,1
-1375,THE_PAPER,The Paper,The Paper,56,18557,0,2849,1998,1,845,1124,25,24,1,66,52,76,71,79,10,12,1,0,60,2181,170,1160,960,336,0,0,0,0,0,0,0,0,7111,4947,7112,3200,508,1800,511,2000,13009,5,0,0,0,0,0,0,0,0,4172,1
-1376,HARPY,Harpy,Harpy,70,16599,0,3562,2133,1,926,1231,42,44,1,112,72,67,74,76,10,12,1,6,64,2181,155,972,672,470,0,0,0,0,0,0,0,0,7115,4850,7116,2500,508,1500,508,800,709,20,0,0,0,0,0,0,0,0,4325,1
-1377,ELDER,Elder,Elder,64,21592,0,5650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1552,1152,336,0,0,0,0,0,0,0,0,7099,4000,7117,1500,7118,1500,691,100,1473,1,616,1,7027,3000,0,0,0,0,4251,1
-1378,DEMON_PUNGUS,Demon Pungus,Demon Pungus,56,7259,0,3148,1817,1,360,479,48,31,1,83,55,59,63,34,10,12,0,6,65,2181,170,1260,960,672,0,0,0,0,0,0,0,0,7119,4074,7001,4559,715,3880,1061,5000,0,0,0,0,0,0,0,0,0,0,4173,1
-1379,NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,6683,4359,1,757,1007,37,37,1,76,55,60,76,54,10,12,2,6,67,2181,165,1216,816,432,0,0,0,0,0,0,0,0,7120,4947,2626,1,2608,30,505,50,510,150,695,100,1261,1,0,0,0,0,4166,1
-1380,DRILLER,Driller,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,2181,165,1300,900,336,0,0,0,0,0,0,0,0,1012,7500,715,3880,716,3500,0,0,0,0,0,0,0,0,0,0,0,0,4180,1
-1381,GRIZZLY,Grizzly,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,55,68,58,70,61,10,12,2,2,63,2181,165,1492,1092,192,0,0,0,0,0,0,0,0,948,5000,919,5000,549,2500,0,0,0,0,0,0,0,0,0,0,0,0,4162,1
-1382,DIABOLIC,Diabolic,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,2181,150,1080,780,180,0,0,0,0,0,0,0,0,1038,5820,1039,4850,2605,3,984,20,1263,10,0,0,0,0,0,0,0,0,4182,1
-1383,EXPLOSION,Explosion,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1260,960,336,0,0,0,0,0,0,0,0,7006,5500,7097,2200,7122,3200,756,800,522,400,0,0,0,0,0,0,0,0,4267,1
-1384,DELETER,Deleter,Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,104,40,65,72,54,10,12,1,9,43,141,175,1020,720,384,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4158,1
-1385,DELETER_,Deleter,Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,66,40,65,72,68,10,12,1,9,43,141,175,1024,624,336,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4279,1
-1386,SLEEPER,Sleeper,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,2181,195,1350,1200,432,0,0,0,0,0,0,0,0,7124,4947,1056,5335,997,2500,756,300,1226,5,1622,5,7043,1200,0,0,0,0,4228,1
-1387,GIG,Gig,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,43,2181,170,1264,864,576,0,0,0,0,0,0,0,0,7125,4365,904,5500,716,150,525,2500,994,850,0,0,0,0,0,0,0,0,4165,1
-1388,ARCHANGELING,Archangeling,Arc Angeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,1205,180,1072,672,480,0,0,0,0,0,0,0,0,2255,5,610,1800,608,150,7291,1500,2254,5,2317,3,7294,1500,0,0,0,0,4241,1
-1389,DRACULA,Dracula,Dracula,85,320096,0,120157,38870,3,1625,1890,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1290,1140,576,60078,10000,607,5500,732,5000,522,5000,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,0,0,0,0,0,0,4134,1
-1390,VIOLY,Violy,Violy,75,18257,0,6353,3529,10,738,982,37,36,1,93,54,58,101,83,10,12,1,7,40,133,170,1356,1056,540,0,0,0,0,0,0,0,0,1060,6305,12127,50,740,1200,2610,800,526,1400,12020,1000,1902,500,0,0,0,0,4209,1
-1391,GALAPAGO,Galapago,Galapago,61,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,0,2,22,139,165,1430,1080,1080,0,0,0,0,0,0,0,0,7053,5335,610,100,508,3500,606,100,605,100,5111,1,582,1000,0,0,0,0,4152,1
-1392,ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,351,215,10,109,137,4,34,1,62,45,26,55,5,10,12,2,0,44,133,155,2416,2016,432,0,0,0,0,0,0,0,0,7126,500,2312,1,7053,1000,999,450,984,1,912,2500,910,5500,0,0,0,0,4192,1
-1393,G_MUMMY,Mummy,Mummy,37,5176,0,0,0,1,305,360,0,10,28,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1394,G_ZOMBIE,Zombie,Zombie,15,534,0,0,0,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1395,CRYSTAL_1,Wind Crystal,Wind Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,5097,7000,532,6500,558,5000,607,200,0,0,0,0
-1396,CRYSTAL_2,Earth Crystal,Earth Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,5097,7000,531,6500,558,5000,608,250,0,0,0,0
-1397,CRYSTAL_3,Fire Crystal,Fire Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,5097,7000,534,6500,558,5000,604,300,0,0,0,0
-1398,CRYSTAL_4,Water Crystal,Water Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,5097,7000,533,6500,558,5000,603,100,0,0,0,0
-1399,EVENT_BAPHO,Baphomet,Baphomet,68,1264000,0,87250,27895,3,1847,2267,35,45,1,152,96,85,120,95,10,12,2,6,67,1205,130,768,768,576,43625,10000,607,5500,526,5000,732,5000,1417,550,1306,680,1145,480,2110,640,2327,1500,2111,500,2621,1720,2256,1550,0,0,0,0
-1400,KARAKASA,Karakasa,Karakasa,30,3092,0,489,322,1,141,183,1,5,1,45,12,20,49,60,10,12,1,0,60,129,155,1638,2016,576,0,0,0,0,0,0,0,0,7151,5000,7150,4268,1019,3200,7111,2200,912,4074,746,30,13012,5,0,0,0,0,4286,1
-1401,SHINOBI,Shinobi,Shinobi,69,12700,0,4970,3010,2,460,1410,34,21,85,85,25,25,100,100,10,12,1,7,67,1173,150,1003,1152,336,0,0,0,0,0,0,0,0,7156,5335,2337,2,7053,2200,2654,100,2336,1,7157,2000,13013,5,0,0,0,0,4230,1
-1402,POISON_TOAD,Poison Toad,Poison Toad,46,6629,0,1929,1457,3,288,408,5,10,20,34,19,14,66,55,10,12,1,2,45,129,160,1148,1728,864,0,0,0,0,0,0,0,0,7155,5500,7154,2400,2610,4,511,540,724,2,526,2,1246,10,0,0,0,0,4175,1
-1403,ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,1293,1003,10,289,336,10,10,15,35,29,15,120,42,10,12,1,1,49,133,170,1084,2304,576,0,0,0,0,0,0,0,0,998,5500,2285,1,7126,1400,508,40,549,350,525,250,13152,5,0,0,0,0,4160,1
-1404,MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,795,453,1,250,305,1,20,1,52,15,10,62,15,10,12,1,6,27,145,250,1938,2112,768,0,0,0,0,0,0,0,0,7152,5335,7153,2500,509,1550,1000,1250,12127,10,13014,5,1904,2,0,0,0,0,4208,1
-1405,TENGU,Tengu,Tengu,65,16940,0,4207,2843,2,660,980,12,82,90,42,69,45,78,80,10,12,2,6,42,2181,200,1439,1920,672,0,0,0,0,0,0,0,0,7159,3500,7158,5500,13301,5,522,150,13302,5,12128,20,687,100,0,0,0,0,4282,1
-1406,KAPHA,Kapha,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,51,49,22,73,45,10,12,1,5,21,2181,165,2012,1728,672,0,0,0,0,0,0,0,0,7149,6500,7053,3500,520,1500,521,2300,708,2,1915,10,13008,5,0,0,0,0,4287,1
-1408,BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,55,8082,0,2119,1562,3,121,342,5,23,1,59,14,55,68,15,10,12,1,4,44,141,145,472,576,288,0,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1
-1409,RICE_CAKE_BOY,Rice Cake Boy,Dumpling Child,27,2098,0,231,149,1,112,134,5,12,1,22,29,5,41,10,10,12,0,7,20,145,160,647,768,420,0,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1
-1410,LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,53,8905,0,2591,1799,7,301,351,10,38,72,45,35,39,80,5,10,12,1,3,42,132,410,400,672,480,0,0,0,0,0,0,0,0,7164,4365,0,0,526,1000,604,400,532,100,603,5,0,0,0,0,0,0,4217,1
-//1411,PEACH_TREE_BULLET,Peach Tree Bullet,Peach Tree Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1412,EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,56,10392,0,3304,2198,10,311,333,25,59,1,20,18,50,136,11,10,12,2,0,40,133,190,480,840,432,0,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1
-1413,WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,1038,692,1,220,280,10,20,13,42,36,55,66,30,10,12,0,3,43,145,140,512,756,360,0,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,516,4800,1951,1,578,1000,0,0,0,0,4232,1
-//1414,GINSENG_BULLET,Ginseng Bullet,Ginseng Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1415,BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,352,201,2,155,207,0,5,20,44,20,4,49,10,10,12,0,2,28,2181,150,318,528,420,0,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1
-1416,WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,16029,0,3945,2599,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,1173,200,637,1008,360,0,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1
-1417,ZIPPER_BEAR,Zipper Bear,Zipper Bear,35,2901,0,370,225,1,248,289,10,5,30,25,55,15,28,25,10,12,1,2,27,145,155,780,1008,420,0,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1
-1418,DARK_SNAKE_LORD,Evil Snake Lord,Evil Snake Lord,73,254993,0,34288,17950,3,1433,2210,25,55,70,83,62,80,164,88,10,12,2,2,68,1205,200,588,816,420,17144,10000,607,5500,608,3500,985,5500,7169,5820,10020,5100,1471,80,5012,80,1474,500,7226,900,661,2000,0,0,0,0,4330,1
-1419,G_FARMILIAR,Familiar,Familiar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,0,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1420,G_ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,2181,300,2864,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1421,G_ISIS,Isis,Isis,43,4828,0,0,0,1,423,507,10,35,38,65,43,30,72,15,10,12,2,6,27,2181,200,1384,768,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1422,G_HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,0,0,1,246,333,25,15,33,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1423,G_GHOUL,Ghoul,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1424,G_SIDE_WINDER,Side Winder,Side Winder,43,4929,0,0,0,1,240,320,5,10,38,43,40,15,115,20,10,12,1,2,25,2693,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1425,G_OBEAUNE,Obeaune,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,2181,200,1872,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1426,G_MARC,Marc,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1427,G_NIGHTMARE,Nightmare,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1428,G_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,0,0,1,89,101,0,0,1,19,25,0,24,0,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1429,G_ARGIOPE,Argiope,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,2181,300,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1430,G_ARGOS,Argos,Argos,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,2181,300,1468,468,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1431,G_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1432,G_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,0,0,1,169,208,0,10,56,27,45,15,56,10,10,12,1,2,23,2181,200,1120,420,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1433,G_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1434,G_DRAINLIAR,Drainliar,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,0,78,0,10,12,0,2,47,2181,250,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1435,G_EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,0,0,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,2693,300,2276,576,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1436,G_JAKK,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1437,G_JOKER,Joker,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,2181,100,1364,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1438,G_KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,58,65,48,5,73,40,10,12,2,1,29,2693,350,528,1000,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1439,G_HIGH_ORC,High Orc,High Orc,52,6890,0,0,0,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,2181,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1440,G_STEM_WORM,Stem Worm,Stem Worm,40,6136,0,0,0,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,2181,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1441,G_PENOMENA,Penomena,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,2181,400,832,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1442,G_SASQUATCH,Sasquatch,Sasquatch,30,3163,0,0,0,1,250,280,5,0,75,25,60,10,34,20,10,12,2,2,60,2181,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1443,G_CRUISER,Cruiser,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,2181,400,1296,1296,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1444,G_CHEPET,Chepet,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,2181,400,672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1445,G_RAGGLER,Raggler,Raggler,21,1020,0,0,0,1,102,113,0,5,18,10,32,20,39,35,10,12,0,2,24,2181,200,1000,900,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1446,G_INJUSTICE,Injustice,Injustice,51,7600,0,0,0,1,480,600,0,0,84,42,39,0,71,35,10,12,1,1,47,2693,400,770,720,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1447,G_GRYPHON,Gryphon,Gryphon,72,27800,0,0,0,1,880,1260,35,35,68,95,78,65,115,75,10,12,2,2,84,2213,100,704,504,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1448,G_DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,0,0,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,2693,200,920,720,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1449,G_MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,0,0,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,2213,250,1280,1080,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1450,G_WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,0,0,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1451,G_MERMAN,Merman,Merman,53,12300,0,0,0,2,482,603,10,35,72,45,46,15,85,55,10,12,1,7,41,2181,220,916,816,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1452,G_ORC_LADY,Orc Lady,Orc Lady,31,2000,0,0,0,1,135,170,10,10,35,42,25,15,69,55,10,12,1,7,42,2181,200,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1453,G_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,0,0,9,415,500,35,5,15,25,22,5,145,35,10,12,1,6,47,2693,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1454,G_TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,0,0,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,2181,200,860,660,624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1455,G_KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,0,0,9,155,185,10,5,10,20,15,30,100,25,10,12,0,7,23,2181,200,1008,1008,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1456,G_CHIMERA,Chimera,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,2725,200,772,672,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1457,G_MANTIS,Mantis,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,2181,200,1528,660,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1458,G_MARDUK,Marduk,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,2181,300,1540,840,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1459,G_MARIONETTE,Marionette,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,2181,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1460,G_MATYR,Matyr,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,2181,150,432,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1461,G_MINOROUS,Minorous,Minorous,52,7431,0,0,0,1,590,770,15,5,65,42,61,66,52,25,10,12,2,2,43,2181,200,1360,960,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1462,G_ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,0,0,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1463,G_ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,0,0,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2693,400,2852,1152,840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1464,G_PASANA,Pasana,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,2181,165,976,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1465,G_PETIT,Petite,Petite,44,6881,0,0,0,1,360,427,30,30,1,44,62,55,79,60,10,12,1,9,22,2181,200,1624,620,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1466,G_PETIT_,Petite,Petite,45,5747,0,0,0,1,300,355,20,45,1,113,45,55,73,80,10,12,1,9,24,2181,150,1420,1080,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1467,G_RAYDRIC,Raydric,Raydric,52,8613,0,0,0,1,830,930,40,15,58,47,42,5,69,26,10,12,2,7,47,2693,150,824,780,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1468,G_REQUIEM,Requim,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1469,G_SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1470,G_ZEROM,Zerom,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,0,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1471,G_NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,2181,150,840,540,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1472,G_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,2181,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1473,G_ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,0,0,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,2181,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1474,G_MIMIC,Mimic,Mimic,51,6120,0,0,0,1,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,2181,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1475,G_WRAITH,Wraith,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,65,95,35,10,12,2,1,89,2181,300,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1476,G_ALARM,Alarm,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,2181,300,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1477,G_ARCLOUSE,Arclouse,Arclouze,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,2181,100,960,500,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1478,G_RIDEWORD,Rideword,Rideword,59,11638,0,0,0,1,584,804,5,35,48,75,10,20,120,45,10,12,0,0,60,2693,150,864,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1479,G_SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,55,20,36,0,76,25,10,12,1,1,69,2181,350,1848,500,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1480,G_ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,2693,350,1768,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1481,G_PUNK,Punk,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,2181,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1482,G_ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,0,0,1,700,850,10,15,70,85,40,30,125,60,10,12,1,7,60,2181,200,800,792,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1483,G_RYBIO,Rybio,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,2693,200,1790,1440,540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1484,G_PHENDARK,Phendark,Phendark,73,22729,0,0,0,2,794,1056,52,36,1,62,120,65,76,66,10,12,2,7,40,2693,175,1744,1344,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1485,G_MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,2725,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1486,G_TIRFING,Tirfing,Ogretooth,71,29900,0,0,0,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,2213,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1487,G_EXECUTIONER,Executioner,Executioner,65,28980,0,0,0,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,2725,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1488,G_ANOLIAN,Anolian,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,2181,190,900,500,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1489,G_STING,Sting,Sting,61,9500,0,0,0,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,2181,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1490,G_WANDER_MAN,Wander Man,Wanderer,74,8170,0,0,0,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,2693,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1491,G_DOKEBI,Dokebi,Dokebi,33,2697,0,0,0,1,197,249,0,10,50,50,40,35,69,40,10,12,0,6,27,2181,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-//Umbala
-1492,INCANTATION_SAMURAI,Incantation Samurai,Samurai Specter,71,218652,0,33095,18214,3,1219,2169,10,51,91,85,78,85,150,60,10,12,2,7,67,1205,135,874,1344,576,16547,10000,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,13303,7500,1235,80,0,0,0,0,4263,1
-1493,DRYAD,Dryad,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,82,2181,170,950,2520,576,0,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,1951,80,1964,1,2270,10,7100,3000,0,0,0,0,4177,1
-1494,KIND_OF_BEETLE,Beetle King,Beetle King,34,1874,0,679,442,1,191,243,45,12,1,34,10,0,40,0,10,12,0,4,22,137,165,1247,768,576,0,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1
-1495,STONE_SHOOTER,Stone Shooter,Stone Shooter,42,4104,0,1238,752,10,309,350,12,45,1,40,20,79,92,20,10,12,1,3,63,2181,175,2413,1248,768,0,0,0,0,0,0,0,0,7203,5000,7201,5000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1
-//1496,STONE_SHOOTER_BULLET,Stone Shooter Bullet,Stone Shooter Bullet,(mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1497,WOODEN_GOLEM,Wooden Golem,Wooden Golem,51,9200,0,1926,1353,1,570,657,32,36,1,41,69,5,85,155,10,12,2,3,82,2181,165,1543,1632,480,0,0,0,0,0,0,0,0,7189,4000,7188,4000,757,110,2270,10,604,100,7201,5000,921,1000,0,0,0,0,4259,1
-1498,WOOTAN_SHOOTER,Wootan Shooter,Wootan Shooter,39,3977,0,886,453,10,84,105,10,28,15,35,29,15,100,42,10,12,1,7,42,2181,200,857,1056,576,0,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,512,100,7182,100,5116,10,0,0,0,0,4260,1
-1499,WOOTAN_FIGHTER,Wootan Fighter,Wootan Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,45,30,10,12,1,7,43,2181,200,912,1344,480,0,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,513,1000,7198,1000,5116,5,0,0,0,0,4261,1
-1500,PARASITE,Parasite,Parasite,49,5188,0,1098,1453,8,215,430,10,19,1,40,30,30,90,50,10,12,1,3,44,132,400,864,864,672,0,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,711,500,0,0,0,0,4309,1
-//1501,PARASITE_BULLET,Parasite Bullet,Parasite Bullet... (mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1502,PORING_V,Pori Pori,Bring it on!,99,95000000,0,87250,27895,1,10000,30000,0,10,100,100,65,100,255,255,10,12,1,3,25,2485,160,1672,672,480,43625,10000,10020,1000,4005,100,2286,200,5035,10000,2344,2500,2346,2500,2350,2500,2348,2500,2655,4000,7126,10000,2110,4500,0,0,0,0
-
-//Niflheim
-1503,GIBBET,Gibbet,Gibbet,58,6841,0,4011,1824,1,418,656,28,31,0,42,42,27,46,28,10,12,2,6,27,2693,180,917,1584,576,0,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,0,0,0,0,0,0,4278,1
-1504,DULLAHAN,Dullahan,Dullahan,62,12437,0,4517,2963,2,647,1065,47,38,0,30,5,45,62,22,10,12,1,1,49,2181,155,847,1152,480,0,0,0,0,0,0,0,0,7209,3200,7210,4850,0,0,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1
-1505,LOLI_RURI,Loli Ruri,Loli Ruri,71,23470,0,6641,4314,2,1476,2317,39,44,0,66,54,74,81,43,10,12,2,6,87,2181,125,747,1632,576,0,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,0,0,0,0,0,0,0,0,4191,1
-1506,DISGUISE,Disguise,Disguise,55,7543,0,2815,1919,2,279,546,18,29,0,72,45,35,48,65,10,12,1,6,82,2181,147,516,768,384,0,0,0,0,0,0,0,0,7216,4850,7221,3686,2502,50,518,100,2508,50,2504,2,0,0,0,0,0,0,4181,1
-1507,BLOODY_MURDERER,Bloody Murderer,Bloody Murderer,72,27521,0,9742,3559,2,864,1081,37,41,0,30,90,15,52,12,10,12,2,7,67,2181,175,914,1344,384,0,0,0,0,0,0,0,0,7207,4171,7223,1000,7208,2000,2288,50,984,100,1229,3,13002,1,0,0,0,0,4214,1
-1508,QUVE,Quve,Quve,40,4559,0,414,306,1,299,469,12,12,0,61,24,19,37,24,10,12,0,1,29,2181,150,912,1248,576,0,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,0,0,0,0,0,0,0,0,4294,1
-1509,LUDE,Lude,Lude,36,3214,0,392,247,2,287,451,14,10,0,59,21,18,36,21,10,12,0,1,29,2181,150,890,960,480,0,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,0,0,0,0,0,0,4193,1
-1510,HYLOZOIST,Hylozoist,Heirozoist,51,7186,0,2314,1297,1,317,498,16,51,0,28,26,47,66,14,10,12,0,6,47,2181,155,741,1536,480,0,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1
-
-1511,AMON_RA,Amon Ra,Amon Ra,88,1214138,0,87264,35891,3,1647,2576,26,52,0,1,90,124,74,45,14,12,2,7,62,164,170,854,2016,480,43632,10000,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1
-
-//Louyang
-1512,HYEGUN,Hyegun,Yao Jun,56,9981,0,2199,1022,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,2181,180,890,1320,720,0,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,0,0,0,0,0,0,0,0,4328,1
-1513,CIVIL_SERVANT,Civil Servant,Mao Guai,62,14390,0,4023,2750,2,650,1010,42,5,58,15,20,60,80,50,10,12,1,2,44,2181,200,1257,528,432,0,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1
-1514,DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,2,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,160,600,840,504,0,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1
-1515,GARM_BABY,Garm Baby,Garm Baby,61,20199,0,1022,2980,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,2181,450,879,672,576,0,0,0,0,0,0,0,0,7270,1500,7269,2500,7066,4365,749,100,12000,100,0,0,0,0,0,0,0,0,4323,1
-1516,INCREASE_SOIL,Increase Soil,Mi Gao,51,8230,0,2760,2110,1,560,700,30,12,40,45,23,12,69,12,10,12,1,0,62,145,445,106,1056,576,0,0,0,0,0,0,0,0,7264,4365,7004,2300,997,10,969,2,0,0,0,0,0,0,0,0,0,0,4231,1
-1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,Jing Guai,48,5920,0,1643,1643,1,434,633,23,16,46,51,19,8,57,30,10,12,1,6,62,2181,165,1120,576,420,0,0,0,0,0,0,0,0,7267,4500,7268,400,1501,10,1523,1,0,0,0,0,0,0,0,0,0,0,4265,1
-1518,BACSOJIN,Bacsojin,White Lady,72,56380,0,5590,1659,2,560,1446,10,15,38,65,34,80,102,35,10,12,2,7,41,2213,160,576,960,480,0,0,0,0,0,0,0,0,1020,5500,603,2,617,2,7165,3000,7166,1000,747,500,0,0,2234,1,0,0,0,0
-1519,CHUNG_E,Chung E,Green Maiden,49,23900,0,2396,993,1,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,40,2181,170,1728,816,1188,0,0,0,0,0,0,0,0,7053,4850,740,100,1806,10,518,500,0,0,0,0,0,0,5042,2,0,0,0,0
-1520,BOILED_RICE,Boiled Rice,Boiled Rice,15,400,0,84,45,1,49,82,0,10,1,14,14,0,19,15,10,12,1,3,21,129,170,1152,672,672,0,0,0,0,0,0,0,0,564,5500,7272,3000,7194,1000,7198,1000,0,0,0,0,0,0,0,0,0,0,0,0
-1521,G_ALICE,Alice,Alice,62,10000,0,0,0,1,550,700,5,5,64,64,42,85,100,130,10,12,1,7,60,145,200,520,2304,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1522,G_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,0,0,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1523,G_ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,0,0,10,289,336,10,10,15,35,29,15,120,42,10,12,1,1,49,133,170,1084,2304,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1524,G_BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,0,0,2,155,207,0,5,20,44,20,4,49,10,10,12,0,2,28,2181,150,318,528,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1525,G_BATHORY,Bathory,Bathory,44,5415,0,0,0,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1526,G_BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,55,8082,0,0,0,3,121,342,5,23,1,59,14,55,68,15,10,12,1,4,44,141,145,472,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1527,G_C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,0,0,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1528,G_CLOCK,Clock,Clock,60,11050,0,0,0,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1529,G_DARK_SNAKE_LORD,Dark Snake Lord,Evil Snake Lord,73,254993,0,0,0,3,1433,2210,25,55,70,83,62,80,164,88,10,12,2,2,68,1205,200,588,816,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1530,G_DRACULA,Dracula,Dracula,85,320096,0,0,0,3,1625,1890,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1290,1140,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1531,G_EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,56,10392,0,0,0,10,311,333,25,59,1,20,18,50,136,11,10,12,2,0,40,133,190,480,840,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1532,G_EXPLOSION,Explosion,Explosion,46,8054,0,0,0,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1260,960,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1533,G_FUR_SEAL,Fur Seal,Seal,63,9114,0,0,0,1,845,1203,25,33,5,28,22,15,69,84,10,12,1,2,21,149,200,1612,622,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1534,G_GOBLIN_1,Goblin,Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1535,G_GOBLIN_2,Goblin,Goblin,24,1034,0,0,0,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1536,G_GOBLIN_3,Goblin,Goblin,24,1034,0,0,0,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1537,G_GOBLIN_4,Goblin,Goblin,23,1359,0,0,0,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1538,G_GOBLIN_5,Goblin,Goblin,22,1952,0,0,0,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1539,G_GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,20152,0,0,0,1,663,752,48,16,5,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1540,G_GOLEM,Golem,Golem,25,3900,0,0,0,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1541,G_GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,0,0,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1542,G_INCANTATION_SAMURA,Incantation Samurai,Incantation Samurai,71,218652,0,0,0,3,1219,2169,10,51,91,85,78,85,150,60,10,12,2,7,67,1205,135,874,1344,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1543,G_KAPHA,Kapha,Kapha,41,7892,0,0,0,3,399,719,20,38,1,51,49,22,73,45,10,12,1,5,21,2181,165,2012,1728,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1544,G_KARAKASA,Karakasa,Karakasa,30,3092,0,0,0,1,141,183,1,5,1,45,12,20,49,60,10,12,1,0,60,129,155,1638,2016,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1545,G_KOBOLD_1,Kobold,Kobold,36,3893,0,0,0,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1546,G_KOBOLD_2,Kobold,Kobold,31,2179,0,0,0,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1547,G_KOBOLD_3,Kobold,Kobold,31,2179,0,0,0,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1548,G_KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,18313,0,0,0,1,649,958,37,37,5,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1549,G_LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,0,0,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,2190,2040,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1550,G_LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,53,8905,0,0,0,7,301,351,10,38,72,45,35,39,80,5,10,12,1,3,42,132,410,400,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1551,G_MARSE,Marse,Marse,31,5034,0,0,0,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1552,G_MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,0,0,1,250,305,1,20,1,52,15,10,62,15,10,12,1,6,27,145,250,1938,2112,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1553,G_MYST,Myst,Myst,38,3745,0,0,0,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1554,G_NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,0,0,1,757,1007,37,37,1,76,55,60,76,54,10,12,2,6,67,2181,165,1216,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1555,G_PARASITE,Parasite,Parasite,49,5188,0,0,0,8,215,430,10,19,1,40,30,30,90,50,10,12,1,3,44,132,400,864,864,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1556,G_POISON_TOAD,Poison Toad,Poisonous Toad,46,6629,0,0,0,3,288,408,5,10,20,34,19,14,66,55,10,12,1,2,45,129,160,1148,1728,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1557,G_ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,0,0,10,109,137,4,34,1,62,45,26,55,5,10,12,2,0,44,133,155,2416,2016,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1558,G_SAND_MAN,Sandman,Sandman,34,3413,0,0,0,1,180,205,10,25,24,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1559,G_SCORPION,Scorpion,Scorpion,24,1109,0,0,0,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1560,G_SHINOBI,Shinobi,Shinobi,69,12700,0,0,0,2,460,1410,34,21,85,85,25,25,100,100,10,12,1,7,67,1173,150,1003,1152,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1561,G_SMOKIE,Smokie,Smokie,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1562,G_SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,0,0,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1563,G_TENGU,Tengu,Tengu,65,16940,0,0,0,2,660,980,12,82,90,42,69,45,78,80,10,12,2,6,42,2181,200,1439,1920,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1564,G_WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,16029,0,0,0,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,1173,200,637,1008,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1565,G_WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,0,0,1,220,280,10,20,13,42,36,55,66,30,10,12,0,3,43,145,140,512,756,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1566,G_WRAITH_DEAD,Wraith Dead,Wraith Dead,74,43021,0,0,0,2,1366,1626,25,30,5,99,55,75,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1567,G_ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,0,0,1,948,1115,35,30,5,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1568,G_ANGELING,Angeling,Angeling,20,55000,0,0,0,1,120,195,0,70,1,50,20,75,68,200,10,12,1,8,86,1205,200,1072,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1569,G_BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,0,0,3,2150,3030,60,50,88,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1570,G_CRAMP,Cramp,Cramp,56,4720,0,0,0,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1571,G_DEVIACE,Deviace,Deviace,47,19192,0,0,0,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1572,G_DROPS,Drops,Drops,3,55,0,0,0,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1573,G_ELDER,Elder,Elder,64,21592,0,0,0,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1552,1152,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1574,G_ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,0,0,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1575,G_FLORA,Flora,Flora,26,2092,0,0,0,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1576,G_GHOSTRING,Ghostring,Ghostring,18,73300,0,0,0,1,82,122,0,60,40,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1577,G_GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,0,0,9,89,113,0,0,10,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1578,G_HORONG,Horong,Horong,34,1939,0,0,0,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1579,G_HYDRA,Hydra,Hydra,14,660,0,0,0,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1580,G_INCUBUS,Incubus,Incubus,75,17281,0,0,0,2,1408,1873,58,46,1,97,95,103,89,87,10,12,1,6,67,1173,165,850,600,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1581,G_VOCAL,Vocal,Vocal,18,3016,0,0,0,1,71,82,10,30,77,28,26,30,53,40,10,12,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1582,DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,30,50,20,75,77,200,10,12,1,6,87,1205,200,1072,1056,384,0,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1
-1583,TAO_GUNKA,Tao Gunka,Tao Gunka,70,193000,0,59175,10445,2,1450,1770,20,20,1,85,78,35,140,60,10,12,2,6,60,173,150,1020,288,144,29587,10000,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,1002,1000,2231,5,0,0,0,0,4302,1
-
-//Ayothaya
-1584,TAMRUAN,Tamruan,Tamruan,52,10234,0,3812,55,1,489,534,15,35,80,62,38,75,72,15,10,12,2,6,67,141,140,512,1152,672,0,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,0,0,0,0,0,0,0,0,4304,1
-1585,MIME_MONKEY,Mime Monkey,Mime Monkey,40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0
-1586,LEAF_CAT,Leaf Cat,Leaf Cat,38,2396,0,165,1212,1,266,307,5,19,25,67,12,45,60,29,10,12,0,2,22,131,150,960,864,720,0,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1
-1587,KRABEN,Kraben,Kraben,50,5880,0,206,1322,1,125,765,5,42,50,125,1,66,75,50,10,12,1,0,48,141,100,1152,1536,576,0,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,7286,1000,603,10,0,0,0,0,4295,1
-
-//Some more G_Mobs and Xmas_Orc
-1588,ORC_XMAS,Christmas Orc,Christmas Orc,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,7175,1600,1352,10,644,15,7174,1600,0,0,0,0,4066,1
-1589,G_MANDRAGORA,Mandragora,Mandragora,12,405,0,0,0,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1590,G_GEOGRAPHER,Geographer,Geographer,56,8071,0,0,0,3,467,621,28,26,1,66,47,60,68,44,10,12,1,3,62,132,2000,1308,1008,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1591,A_LUNATIC,Lunatic,Lunatic,29,2334,0,0,0,1,221,245,10,20,1,15,22,5,40,15,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1592,A_MOBSTER,Gangster,Gangster,40,8000,0,0,0,1,300,355,20,27,1,50,45,45,73,30,10,12,1,7,20,1685,250,1100,560,580,0,0,0,0,0,0,0,0,7049,10000,601,2000,1206,3000,713,1000,550,10000,7049,0,7049,0,7049,0,0,0,0,0
-1593,A_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,52,8613,0,0,0,1,830,930,40,27,58,47,42,5,69,26,10,12,1,1,69,149,175,1772,120,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1594,G_FREEZER,Freezer,Freezer,72,8636,0,0,0,2,671,983,55,43,69,41,59,5,67,100,10,12,1,2,41,181,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1595,G_MARIN,Marin,Marin,15,742,0,0,0,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1596,G_TAMRUAN,Tamruan,Tamruan,52,10234,0,0,0,1,489,534,15,35,80,62,38,75,72,15,10,12,2,6,67,181,140,512,1152,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1597,G_GARGOYLE,Gargoyle,Gargoyle,48,3950,0,0,0,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1598,G_BLAZZER,Blazzer,Blazzer,43,8252,0,0,0,2,533,709,50,40,1,52,50,39,69,40,10,12,1,6,43,133,180,1732,1332,540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1599,G_WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,0,0,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,48,181,250,2536,1536,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1600,G_HEATER,Heater,Heater,68,11020,0,0,0,2,683,1008,40,42,69,47,25,5,71,100,10,12,1,2,43,181,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1601,G_PERMETER,Permeter,Permeter,63,8228,0,0,0,2,943,1211,46,45,69,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1602,G_SOLIDER,Solider,Solider,70,12099,0,0,0,2,797,979,57,43,69,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1603,G_BIGFOOT,Bigfoot,Bigfoot,25,1619,0,0,0,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1604,G_GIANT_HONET,Giant Hornet,Giant Hornet,56,13105,0,0,0,1,650,852,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1605,G_DARK_ILLUSION,Dark Illusion,Dark Illusion,77,103631,0,0,0,2,1300,1983,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1606,G_GARM_BABY,Garm Baby,Garm Baby,61,20199,0,0,0,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,133,450,879,672,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1607,G_GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1608,G_THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,0,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1609,G_DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,2,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,160,600,840,504,0,0,0,0,0,0,0,0,570,500,571,50,572,20,515,10000,12018,5000,0,0,0,0,668,100,0,0,0,0
-1610,A_MUNAK,Munak,Munak,30,2872,0,0,0,1,40,50,0,0,1,15,20,5,120,15,10,12,1,1,89,133,100,2468,768,288,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-1611,A_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,89,149,200,1720,500,420,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-1612,A_HYEGUN,Hyegun,Yao Jun,56,9981,0,0,0,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,89,133,180,890,1320,720,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-
-//Einbroch
-1613,METALING,Metaling,Metaling,26,889,0,492,249,1,135,270,5,3,30,15,10,18,35,2,10,12,0,0,20,131,300,384,672,480,0,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1
-1614,MINERAL,Mineral,Mineral,56,7950,0,3563,1768,1,723,812,29,35,60,52,35,21,67,32,10,12,0,0,40,145,250,648,480,360,0,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,4339,1
-1615,OBSIDIAN,Obsidian,Obsidian,50,8812,0,2799,1802,1,841,980,35,5,62,32,42,24,61,55,10,12,0,0,42,141,350,720,864,504,0,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,4338,1
-1616,PITMAN,Pitman,Pitman,43,5015,0,1799,1083,1,290,486,22,26,0,15,5,5,52,36,10,12,2,1,42,145,180,960,336,300,0,0,0,0,0,0,0,0,7318,3000,7319,500,998,800,999,500,1003,100,1041,1000,7327,80,0,0,0,0,4335,1
-1617,WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,4412,1135,1,692,1081,23,10,20,69,55,5,59,77,10,12,2,0,20,141,300,1152,528,360,0,0,0,0,0,0,0,0,7323,1000,7068,1000,998,500,625,50,1002,1000,604,50,7319,3800,0,0,0,0,4332,1
-1618,UNGOLIANT,Ungoliant,Ungoliant,69,29140,0,8211,142,1,1290,2280,25,25,33,52,57,25,119,43,10,12,2,4,45,1173,350,420,576,420,0,0,0,0,0,0,0,0,7316,4500,1014,3500,1013,1000,7289,1500,7326,2500,718,1500,2406,500,0,0,0,0,4336,1
-1619,PORCELLIO,Porcellio,Porcellio,28,1654,0,512,346,1,82,247,0,8,0,31,21,50,54,85,10,12,0,4,62,131,150,720,360,360,0,0,0,0,0,0,0,0,7312,5000,1208,25,928,1000,1052,3000,630,2,7326,30,0,0,0,0,0,0,4337,1
-1620,NOXIOUS,Noxious,Noxious,35,2038,0,698,698,1,299,400,0,60,12,41,10,30,44,2,10,12,1,0,68,141,350,768,1440,672,0,0,0,0,0,0,0,0,7322,1000,7001,3000,605,50,7320,3000,0,0,0,0,603,1,0,0,0,0,4334,1
-1621,VENOMOUS,Venomous,Venomous,42,4653,0,1780,1280,1,422,844,0,49,12,60,17,19,60,1,10,12,1,0,25,141,350,768,1440,672,0,0,0,0,0,0,0,0,7320,5000,7119,3000,7154,1000,7322,2000,0,0,0,0,603,1,0,0,0,0,4333,1
-1622,TEDDY_BEAR,Teddy Bear,Teddy Bear,71,8109,0,5891,3455,1,621,1432,19,32,5,155,32,41,121,26,10,12,0,0,60,149,200,512,780,504,0,0,0,0,0,0,0,0,7317,3800,518,1000,615,300,13106,5,5113,50,2652,10,985,100,0,0,0,0,4340,1
-1623,RSX_0806,RSX 0806,RSX-0806,86,280733,0,31010,32011,1,2740,5620,39,41,85,51,75,25,93,84,10,12,2,0,60,1205,220,128,1104,240,15505,10000,607,5500,5104,3500,732,5500,7093,6000,999,5000,644,5000,617,1000,7327,5000,1242,50,1531,20,1230,10,0,0,4342,1
-1624,G_WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,0,0,1,500,889,23,10,20,69,55,5,79,77,10,12,2,0,20,645,220,1152,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1625,G_PORCELLIO,Porcellio,Porcellio,43,5523,0,1024,693,1,164,494,0,8,0,31,21,50,64,85,10,12,0,4,62,131,150,720,360,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Hellion Revenant
-1626,G_DARK_PRIEST,Hellion Revenant,Hellion Revenant,88,286900,0,1,1,2,50,3150,25,50,1,80,50,99,130,99,10,12,1,6,69,181,150,432,384,192,0,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0
-
-//Lighthalzen
-1627,ANOPHELES,Anopheles,Anopheles,23,100,0,99,55,1,48,63,0,90,1,200,4,5,120,5,10,12,0,4,64,133,200,140,864,430,0,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1
-1628,MOLE,Mole,Holden,36,2209,0,268,172,9,52,63,0,5,24,18,23,30,45,5,10,12,0,2,42,131,300,140,960,504,0,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,13101,5,0,0,0,0,0,0,0,0,0,0,4343,1
-1629,HILL_WIND,Hill Wind,Hill Wind,43,3189,0,1800,1100,3,290,480,10,15,21,42,31,50,41,23,10,12,1,2,64,671,200,336,540,432,0,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4345,1
-1630,BACSOJIN_,Bacsojin,White Lady,85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,1973,130,576,960,480,22625,10000,607,5500,2513,2000,617,5000,1020,5500,603,5000,617,3000,7165,3000,7166,1000,747,500,0,0,2234,10,0,0,4372,1
-1631,CHUNG_E_,Chung E,Green Maiden,59,23900,0,4256,920,2,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,44,145,150,1728,816,1188,0,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,0,0,0,0,5042,50,0,0,0,0,4373,1
-1632,GREMLIN,Gremlin,Gremlin,53,9280,0,4355,1768,1,329,762,29,25,80,41,59,75,62,15,10,12,2,6,47,657,140,432,540,432,0,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,1,1265,1,0,0,603,2,0,0,0,0,4355,1
-1633,BEHOLDER,Beholder,Beholder,56,7950,0,4821,3822,6,723,812,17,30,60,62,25,59,85,32,10,12,0,0,44,657,190,336,840,360,0,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,603,2,0,0,0,0,4356,1
-//Normal advanced class mobs
-1634,SEYREN,Seyren,Seyren Windsor,91,88402,0,100000,116460,1,2100,2530,63,12,90,89,72,20,99,25,10,12,1,6,63,1693,170,76,384,288,0,0,0,0,0,0,0,0,7345,3000,13001,2,1163,200,603,30,2229,12,2317,1,1155,250,0,0,0,0,4358,1
-1635,EREMES,Eremes,Eremes Guile,87,60199,0,100000,99800,1,2020,2320,23,12,45,138,31,19,99,30,10,12,1,6,85,1693,180,76,384,288,0,0,0,0,0,0,0,0,7347,2000,603,50,2514,1,1262,3,1264,30,678,110,2336,2,0,0,0,0,4360,1
-1636,HARWORD,Harword,Howard Alt-Eisen,83,78690,0,100000,112540,1,1890,2390,59,10,90,62,99,35,98,66,10,12,1,7,81,1693,180,76,384,288,0,0,0,0,0,0,0,0,7345,3000,2514,1,2406,5,1361,110,2104,10,2318,1,603,50,0,0,0,0,4362,1
-1637,MAGALETA,Magaleta,Margaretha Sorin,90,61282,0,100000,117800,1,1300,2053,35,60,1,9,97,145,88,40,10,12,1,7,66,1693,180,1152,384,288,0,0,0,0,0,0,0,0,7347,2000,2607,20,1602,200,1561,10,2327,1,603,50,2504,10,0,0,0,0,4364,1
-1638,SHECIL,Shecil,Cecil Damon,82,58900,0,100000,118260,14,1226,1854,25,15,1,145,27,32,134,80,10,12,1,7,64,1693,180,76,384,288,0,0,0,0,0,0,0,0,7345,3000,12014,110,2331,10,1711,100,12007,150,603,50,2502,60,0,0,0,0,4368,1
-1639,KATRINN,Katrinn,Kathryne Keyron,92,47280,0,100000,116470,1,497,1697,10,74,1,5,77,180,110,39,10,12,1,7,68,1693,150,1152,384,288,0,0,0,0,0,0,0,0,7345,3000,603,50,1611,200,1620,5,2102,30,5085,1,2404,20,0,0,0,0,4366,1
-//MVP Slaves
-1640,G_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1641,G_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1642,G_HARWORD,Whitesmith Harword,Whitesmith Howard,99,310000,0,18000,10000,1,4822,5033,66,36,100,73,112,35,136,60,10,12,1,7,81,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1643,G_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,84,64,182,92,100,10,12,1,7,86,1725,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1644,G_SHECIL,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,14,1892,5113,22,35,1,180,39,67,193,130,10,12,1,7,84,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1645,G_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,88,1,89,42,223,128,93,10,12,1,7,68,1725,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-//MVP Monsters
-1646,B_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,120,110,81,65,130,52,10,12,1,7,83,1973,100,76,384,288,2417800,10000,617,5500,603,5000,732,2000,1132,2500,2342,3500,2412,9000,1470,3500,1469,3000,1166,2500,1415,1500,0,0,0,0,4357,1
-1647,B_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,90,181,62,37,122,60,10,12,1,7,85,1973,100,76,384,288,2041700,10000,617,5500,603,5000,732,2000,1234,1500,1230,1500,2319,9000,1233,3500,1232,3500,1265,3500,13002,3500,0,0,0,0,4359,1
-1648,B_HARWORD,Whitesmith Harword,Whitesmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,100,73,112,35,136,60,10,12,1,7,82,1973,100,76,384,288,2001170,10000,617,5500,603,5000,732,2000,1138,3500,1140,2500,2318,9000,1365,3500,1364,3500,1369,2500,1368,3500,0,0,0,0,4361,1
-1649,B_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,86,1973,125,1152,384,288,2128500,10000,617,5500,603,5000,732,2000,1814,3500,2615,2500,2513,9000,1557,3500,1527,3500,1528,2500,1560,3500,0,0,0,0,4363,1
-1650,B_SHECIL,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,14,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,84,1973,100,76,384,288,2046500,10000,617,5500,603,5000,1723,2000,1228,3500,1236,3500,617,9000,1234,1500,1237,3500,1720,1500,1724,2500,0,0,0,0,4367,1
-1651,B_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,1973,150,1152,384,288,2004100,10000,617,5500,603,5000,732,2000,1241,3500,1242,3500,2616,9000,2343,2500,2513,2500,1618,3000,2319,3500,0,0,0,0,4365,1
-//1'st Class Mobs
-1652,YGNIZEM,Ygnizem,Egnigem Cenia,58,11200,0,4870,98,1,823,1212,35,8,60,35,52,18,79,20,10,12,1,7,43,1693,145,576,432,288,0,0,0,0,0,0,0,0,7347,1000,2317,1,1158,20,1127,20,2313,10,1152,80,1170,1,0,0,0,0,4346,1
-1653,WHIKEBAIN,Whikebain,Wickebine Tres,62,7320,0,4204,21,1,693,889,9,8,1,102,34,20,83,30,10,12,1,7,65,1693,120,576,432,288,0,0,0,0,0,0,0,0,7345,2000,1223,1,2306,40,1220,10,2315,2,1208,50,13004,10,0,0,0,0,4348,1
-1654,ARMAIA,Armaia,Armeyer Dinze,66,7110,0,4008,35,1,750,913,42,6,5,36,50,15,89,60,10,12,1,7,62,1693,120,576,432,288,0,0,0,0,0,0,0,0,7345,1000,2504,1,1358,50,1352,40,2311,10,1302,80,1307,10,0,0,0,0,4347,1
-1655,EREND,Erend,Errende Ebecee,59,6980,0,4501,67,1,896,1159,14,30,1,31,41,93,67,30,10,12,1,7,46,1693,130,576,432,288,0,0,0,0,0,0,0,0,7345,500,2217,5,1514,50,1517,20,2326,5,2324,10,1523,1,0,0,0,0,4349,1
-1656,KAVAC,Kavac,Kavach Icarus,60,7899,0,4090,86,9,684,904,12,5,48,100,10,15,118,40,10,12,1,7,44,1693,150,576,432,288,0,0,0,0,0,0,0,0,7347,2000,1716,1,12006,100,1708,10,2308,5,2402,30,2404,2,0,0,0,0,4351,1
-1657,RAWREL,Rawrel,Laurell Weinder,61,6168,0,4620,30,1,430,517,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,150,576,432,288,0,0,0,0,0,0,0,0,934,1000,1616,1,2102,5,1608,50,2322,10,2333,30,2607,1,0,0,0,0,4350,1
-//1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
-1658,B_YGNIZEM,Ygnizem,Egnigem Cenia,79,214200,0,258760,86000,1,3890,5690,48,25,82,60,45,31,110,40,10,12,1,7,43,1973,100,1008,864,288,129380,10000,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,644,1000,0,0,4352,1
-1659,G_WHIKEBAIN,Whikebain,Wickebine Tres,62,7320,0,0,0,1,593,789,9,12,1,102,34,23,74,30,10,12,1,7,65,1693,120,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1660,G_ARMAIA,Armaia,Armeyer Dinze,66,7110,0,0,0,1,650,813,42,6,5,36,40,15,80,60,10,12,1,7,62,1693,120,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1661,G_EREND,Erend,Errende Ebecee,59,6980,0,0,0,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,130,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1662,G_KAVAC,Kavac,Kavach Icarus,60,7899,0,0,0,9,584,804,12,5,48,100,10,20,118,40,10,12,1,7,44,1693,150,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1663,G_RAWREL,Rawrel,Laurell Weinder,61,6168,0,0,0,1,330,417,8,48,1,41,5,100,45,10,10,12,1,7,48,3229,150,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-1664,POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,3900,1800,9,800,900,10,30,1,40,25,20,80,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1665,POTON_CANON_1,Photon Cannon,Photon Cannon,67,7500,0,4300,2000,9,700,800,15,30,1,40,30,40,86,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,13160,5,0,0,0,0,0,0,0,0,0,0,0,0
-1666,POTON_CANON_2,Photon Cannon,Photon Cannon,64,7100,0,3100,2700,9,800,900,8,30,1,40,21,29,80,91,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1667,POTON_CANON_3,Photon Cannon,Photon Cannon,65,7800,0,3800,2300,9,700,800,15,30,1,40,23,30,90,99,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,728,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1668,ARCHDAM,Archdam,Archdam,79,25000,0,8000,5000,3,1000,2000,15,15,65,65,35,75,75,15,10,12,2,7,60,157,180,580,288,360,0,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,13156,5,0,0,0,0,0,0,0,0,4371,1
-1669,DIMIK,Dimik,Dimik,77,10000,0,0,0,5,1040,1880,45,28,15,35,40,15,120,42,10,12,1,0,40,157,200,576,720,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1670,DIMIK_1,Dimik,Dimik,79,16000,0,6400,3500,7,1140,1980,45,28,15,88,20,20,120,40,10,12,1,0,44,157,150,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,300,7094,300,13153,5,984,10,12128,50,0,0,0,0,4370,1
-1671,DIMIK_2,Dimik,Dimik,89,29000,0,8000,5000,5,1440,2280,45,28,15,40,30,30,150,70,10,12,1,0,41,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7353,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
-1672,DIMIK_3,Dimik,Dimik,80,19000,0,5900,2800,5,1240,2080,68,28,15,30,78,20,120,30,10,12,1,0,42,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7354,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
-1673,DIMIK_4,Dimik,Dimik,82,13900,0,5800,4500,5,1840,2840,45,28,15,20,20,10,120,30,10,12,1,0,43,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7355,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
-1674,MONEMUS,Monemus,Monemus,88,80000,0,0,0,5,2000,3000,54,25,0,1,90,24,144,45,14,12,2,0,63,164,400,1368,1344,432,0,0,0,0,0,0,0,0,7049,2000,953,1000,7049,0,7049,0,7049,0,7049,0,7049,0,7049,0,0,0,0,0
-1675,VENATU,Venatu,Venatu,77,8000,0,0,0,2,1200,1800,35,20,5,26,24,5,75,40,10,12,1,0,43,157,150,504,1020,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1676,VENATU_1,Venatu,Venatu,72,8900,0,4000,2000,2,800,1400,30,20,5,26,24,5,82,30,10,12,1,0,40,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,300,7094,300,13157,5,985,10,12127,100,0,0,0,0,4369,1
-1677,VENATU_2,Venatu,Venatu,80,9000,0,4000,2000,2,900,1500,30,20,5,82,32,5,105,30,10,12,1,0,44,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7357,500,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
-1678,VENATU_3,Venatu,Venatu,78,9500,0,4500,2000,2,800,1400,30,20,5,26,68,5,95,30,10,12,1,0,42,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7358,400,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
-1679,VENATU_4,Venatu,Venatu,75,12300,0,4000,2000,2,800,1400,30,20,5,26,24,5,100,30,10,12,1,0,41,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7359,300,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
-1680,HILL_WIND_1,Hill Wind,Hill Wind,45,4233,0,2132,1722,3,320,510,10,15,21,42,31,50,67,23,10,12,1,2,64,157,170,504,480,360,0,0,0,0,0,0,0,0,7115,4000,7116,3000,528,1000,510,10,0,0,0,0,0,0,0,0,0,0,4345,1
-1681,GEMINI,Gemini-S58,Gemini-S58,72,57870,0,22024,9442,3,2150,3030,60,45,88,75,70,77,105,55,10,12,1,0,21,189,200,1872,360,864,0,0,0,0,0,0,0,0,7005,3000,603,1000,13159,5,546,500,547,400,7479,6,12040,300,0,0,0,0,4354,1
-1682,REMOVAL,Removal,Remover,55,10289,0,3831,1278,1,558,797,5,20,1,20,56,35,57,20,10,12,1,1,49,157,250,1536,1056,1152,0,0,0,0,0,0,0,0,713,5000,7319,5000,5005,10,549,500,971,50,972,100,5120,6,0,0,0,0,4353,1
-1683,G_POTON_CANON,Photon Cannon,Photon Cannon,46,7000,0,0,0,9,560,570,5,10,1,36,36,20,56,30,10,12,1,0,43,669,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1684,G_ARCHDAM,Archdam,Archdam,57,11000,0,0,0,3,600,700,15,15,65,65,35,75,75,15,10,12,2,8,60,157,180,1080,288,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1685,APOCALIPS_H,Vesper,Vesper,97,320700,0,200000,100000,3,4000,10000,50,54,100,50,60,70,160,150,10,12,2,2,46,165,180,504,912,432,100000,10000,617,5500,603,5000,732,2000,7095,5000,7094,3000,617,1000,617,1000,2659,100,2660,100,2661,100,2662,100,0,0,4374,1
-1686,ORC_BABY,Orc Baby,Orc Baby,21,912,0,220,220,1,135,270,10,10,30,15,10,18,35,2,10,12,0,7,22,653,200,672,864,288,0,0,0,0,0,0,0,0,7126,1000,10004,100,2299,1,519,5000,7270,200,7269,100,0,0,0,0,0,0,4375,1
-1687,GREEN_IGUANA,Green Iguana,Grove,54,6444,0,2400,2050,1,550,650,0,10,1,52,64,5,98,14,10,12,1,2,42,131,200,720,528,432,0,0,0,0,0,0,0,0,521,1500,903,1000,520,1000,511,1000,528,2000,606,10,511,1,0,0,0,0,4377,1
-1688,LADY_TANEE,Lady Tanee,Lady Tanee,89,493000,0,64995,43222,14,450,2170,20,44,1,125,48,78,210,38,10,12,2,3,64,676,100,576,432,360,32497,10000,617,5500,12095,5000,732,2000,12090,5000,634,4000,12129,1000,5116,1000,985,5000,617,2000,1716,6000,0,0,0,0,4376,1
-1689,G_BACSOJIN,Bacsojin,White Lady,85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,1973,130,576,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1690,G_SPRING_RABBIT,Spring Rabbit,Spring Rabbit,12,15,0,0,0,1,0,0,100,99,1,1,1,1,1,1,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7303,9000,7303,500,7303,10,7303,10,7303,10,7303,10,7303,10,7303,10,0,0,0,0
-1691,G_KRABEN,Kraben,Kraben,70,10880,0,0,0,1,125,765,5,42,50,155,1,66,112,60,10,12,1,0,48,141,100,1152,1536,576,0,0,0,0,0,0,0,0,521,1,521,1,521,1,521,1,521,1,521,1,521,1,0,0,0,0,0,0
-
-// Thanatos Tower & Abyss
-1692,BREEZE,Breeze,Breeze,56,5099,0,2390,1340,2,94,215,7,32,1,96,6,38,91,45,10,12,1,0,64,133,100,140,384,504,0,0,0,0,0,0,0,0,945,500,706,10,2270,10,511,100,604,10,2269,10,996,10,0,0,0,0,4390,1
-1693,PLASMA_Y,Plasma,Plasma,56,8400,0,2200,2100,3,400,900,0,40,1,30,10,83,105,45,10,12,0,0,88,133,100,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,715,100,969,1,0,0,0,0,0,0,0,0,4389,1
-1694,PLASMA_R,Plasma,Plasma,43,5700,0,2000,1000,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,990,45,0,0,0,0,0,0,0,0,4389,1
-1695,PLASMA_G,Plasma,Plasma,47,7600,0,2000,1000,3,300,700,0,30,1,30,5,61,90,30,10,12,0,0,82,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,717,100,993,40,0,0,0,0,0,0,0,0,4389,1
-1696,PLASMA_P,Plasma,Plasma,49,5900,0,2000,1000,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,724,100,0,0,0,0,0,0,0,0,4389,1
-1697,PLASMA_B,Plasma,Plasma,44,8200,0,2000,1000,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,717,100,991,35,0,0,0,0,0,0,0,0,4389,1
-1698,DEATHWORD,Deathword,Death Word,65,18990,0,2986,4912,1,622,1102,10,40,50,75,10,20,140,45,10,12,1,0,60,133,150,176,912,300,0,0,0,0,0,0,0,0,1097,4000,7015,300,1006,20,7449,500,2418,10,7479,2,7480,1,0,0,0,0,4388,1
-1699,ANCIENT_MIMIC,Ancient Mimic,Ancient Mimic,60,8080,0,2950,2650,1,530,1697,20,40,50,100,30,40,150,110,10,12,2,0,60,133,100,168,480,360,0,0,0,0,0,0,0,0,603,30,617,1,644,50,2404,5,2506,1,2417,10,2610,100,0,0,0,0,4387,1
-1700,OBSERVATION,Observation,Dame of Sentinel,81,65111,0,39872,33120,2,1666,2609,55,55,30,74,56,126,145,114,10,12,1,8,80,165,100,432,480,360,0,0,0,0,0,0,0,0,7441,500,2621,1,7442,100,728,1000,12040,100,2210,10,7435,100,0,0,0,0,4392,1
-1701,SHELTER,Shelter,Mistress of Shelter,80,38000,0,29010,25110,2,1871,1971,22,63,12,67,34,167,157,120,10,12,1,8,66,2213,160,432,420,360,0,0,0,0,0,0,0,0,7440,200,7442,1,12040,50,722,1000,7005,1000,7442,50,0,0,0,0,0,0,4393,1
-1702,RETRIBUTION,Retribution,Baroness of Retribution,79,46666,0,28332,33120,2,2022,2288,35,35,30,142,66,72,133,39,10,12,1,8,67,165,120,360,480,360,0,0,0,0,0,0,0,0,7440,400,2621,1,12040,50,723,1000,2506,5,1158,10,7442,50,0,0,0,0,4391,1
-1703,SOLACE,Solace,Lady Solace,77,25252,0,21000,25110,2,1392,1462,21,67,12,76,29,145,99,100,10,12,1,8,66,165,180,576,420,360,0,0,0,0,0,0,0,0,7441,200,2621,1,12040,50,718,1000,1910,50,1909,100,7442,50,0,0,0,0,4394,1
-1704,THA_ODIUM,Thanatos Odium,Odium of Thanatos,92,72389,0,88420,63880,9,2100,2800,68,30,100,52,165,62,185,90,10,12,2,1,88,165,100,432,288,420,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7436,10000,616,10,2520,1000,0,0,0,0,0,0,4396,1
-1705,THA_DESPERO,Thanatos Despero,Despero of Thanatos,88,86666,0,62001,51220,2,2182,3082,38,39,100,167,79,92,151,120,10,12,2,1,88,165,150,160,528,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7439,10000,616,10,2419,1000,0,0,0,0,0,0,4397,1
-1706,THA_MAERO,Thanatos Maero,Maero of Thanatos,83,62000,0,56699,63880,2,2022,2288,29,72,100,176,30,200,122,29,10,12,1,1,88,165,150,160,480,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7437,10000,616,10,2354,1000,0,0,0,0,0,0,4395,1
-1707,THA_DOLOR,Thanatos Dolor,Dolor of Thanatos,83,59922,0,43200,51220,2,1392,2092,21,80,100,76,29,206,139,44,10,12,0,1,88,165,150,160,672,480,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7438,10000,616,10,5128,1000,0,0,0,0,0,0,4398,1
-1708,THANATOS,Thanatos,Thanatos Phantom,99,445660,0,3666000,2145060,3,3812,7483,35,35,100,108,122,86,147,32,10,12,2,6,88,1461,120,115,816,504,1833000,10000,617,5500,603,5000,732,2000,7444,1000,2519,1000,7450,5000,2342,5000,2412,5000,2515,1000,2655,500,0,0,0,0,4399,1
-1709,G_THA_ODIUM,Thanatos Odium,Odium of Thanatos,92,72389,0,10000,5000,9,2100,2800,68,30,100,52,165,62,185,90,10,12,2,1,88,165,100,115,288,420,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1710,G_THA_DESPERO,Thanatos Despero,Despero of Thanatos,88,86666,0,10000,5000,2,2182,3082,38,39,100,167,79,92,151,120,10,12,2,1,88,165,150,160,528,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1711,G_THA_MAERO,Thanatos Maero,Maero of Thanatos,83,62000,0,10000,5000,2,2022,2288,29,72,100,176,30,200,122,29,10,12,1,1,88,165,150,160,480,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1712,G_THA_DOLOR,Thanatos Dolor,Dolor of Thanatos,83,59922,0,10000,5000,2,1392,2092,21,80,100,76,29,206,139,44,10,12,0,1,88,165,150,160,672,480,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1713,ACIDUS,Acidus,Acidus,80,51112,0,28043,8023,2,1289,2109,29,69,1,71,55,135,103,69,10,12,2,9,46,133,170,168,1008,300,0,0,0,0,0,0,0,0,582,5100,1035,4000,7444,5,1036,3589,7448,800,714,5,2114,50,0,0,0,0,4378,1
-1714,FERUS,Ferus,Ferus,70,29218,0,8093,3952,2,1056,1496,14,45,1,78,45,72,81,73,10,12,2,9,43,133,100,108,576,432,0,0,0,0,0,0,0,0,578,2200,1035,1000,7123,1000,1036,2000,7447,800,994,20,5122,50,0,0,0,0,4380,1
-1715,NOVUS,Novus,Novus,42,5430,0,1320,1002,1,284,384,20,28,1,56,43,45,124,43,10,12,0,9,20,133,110,151,288,360,0,0,0,0,0,0,0,0,511,3000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4383,1
-1716,ACIDUS_,Acidus,Acidus,76,39111,0,14392,4203,2,1180,2000,21,47,1,78,31,93,88,52,10,12,2,9,44,133,180,168,768,360,0,0,0,0,0,0,0,0,505,150,1035,4000,510,150,1036,3589,7446,800,996,20,7446,100,0,0,0,0,4379,1
-1717,FERUS_,Ferus,Ferus,69,21182,0,6750,2230,2,930,1170,14,38,1,66,77,60,79,35,10,12,2,9,42,133,120,108,576,432,0,0,0,0,0,0,0,0,579,5100,1035,1000,0,0,1036,3589,7445,800,997,20,7445,100,0,0,0,0,4381,1
-1718,NOVUS_,Novus,Novus,43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,133,100,252,816,480,0,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1
-1719,DETALE,Detale,Detardeurus,90,480000,0,291850,123304,3,4560,5548,66,59,100,90,112,136,140,56,10,12,2,9,67,1461,250,432,936,360,145925,10000,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1
-1720,HYDRO,Hydro,Hydrolancer,89,308230,0,83450,2480,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,165,160,140,672,432,0,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1
-1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0,1000,24,0,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
-1722,EVENT_JAKK,Jakk,Jakk,99,10310,0,103,100,1,115,182,5,11,1,28,18,13,35,45,10,12,1,0,43,2181,240,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1723,A_SHECIL,Shecil Damon,Cecil Damon,82,30000,0,0,0,14,600,900,25,15,1,145,27,32,134,80,10,12,1,7,64,1693,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1724,A_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,9,1000,1300,10,30,1,40,25,20,80,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1725,R_PORING,Poring,Poring,1,50,0,0,0,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,131,150,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1726,R_LUNATIC,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,150,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1727,R_SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,0,0,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,150,1624,624,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1728,R_DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,0,0,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,150,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1729,R_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,150,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1730,R_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1731,G_DOPPELGANGER,Doppelganger,Doppelganger,72,12000000,0,3000000,2000000,1,5000,10000,99,99,88,180,70,75,180,65,10,12,2,8,48,1205,190,480,480,288,0,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1732,G_TREASURE_BOX,Treasure Chest,Treasure Chest,98,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Kiel Dungeon monsters (done, but drop rates guessed)
-1733,KIEL,Kiel,Kiel,90,523000,0,36500,23405,3,1682,3311,28,32,100,112,76,89,156,102,10,12,1,0,47,165,140,1152,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1734,KIEL_,Kiel D-01,Kiel D-01,90,1523000,0,2356200,512602,3,3280,6560,28,32,100,130,140,160,199,180,10,12,1,0,47,1461,130,1152,576,432,1178100,10000,617,5500,603,5000,616,2000,7513,3000,617,3000,2651,1000,2319,1000,1618,500,1242,500,2650,1000,0,0,0,0,4403,1
-1735,ALICEL,Alicel,Alicel,75,37520,0,8890,5420,2,1800,2770,30,30,50,58,50,51,92,40,10,12,1,6,60,133,250,1080,480,504,0,0,0,0,0,0,0,0,7512,2000,7507,3000,999,200,7317,500,1812,5,985,10,2517,20,0,0,0,0,4401,1
-1736,ALIOT,Aliot,Aliot,75,48290,0,13020,4006,2,950,2470,35,15,50,32,87,12,68,19,10,12,1,6,60,133,200,1296,432,360,0,0,0,0,0,0,0,0,7512,2000,7507,3000,2516,10,7317,500,1408,10,985,10,2102,2,0,0,0,0,4402,1
-1737,ALIZA,Aliza,Aliza,69,19000,0,6583,3400,1,750,1100,8,5,74,74,52,35,110,140,10,12,1,7,60,145,220,1440,576,600,0,0,0,0,0,0,0,0,7054,4000,2518,10,2626,10,7047,5,12128,50,661,1,2233,3,0,0,0,0,4400,1
-1738,CONSTANT,Constant,Constant,55,10000,0,3230,116,1,460,580,12,12,50,28,26,47,66,14,10,12,0,0,67,133,150,720,360,360,0,0,0,0,0,0,0,0,7512,100,7507,1500,7325,10,999,10,757,10,0,0,0,0,0,0,0,0,0,0
-1739,G_ALICEL,Alicel,Alicel,75,37520,0,0,0,2,1600,2570,30,30,50,60,50,51,92,40,10,12,1,6,60,133,150,1080,480,504,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1740,G_ALIOT,Aliot,Aliot,75,43290,0,0,0,2,950,2070,35,15,50,32,87,12,68,19,10,12,1,6,60,133,150,1296,432,360,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1741,G_COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1742,G_CARAT,Carat,Carat,51,5200,0,0,0,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1743,G_MYSTCASE,Myst Case,Myst Case,38,3450,0,0,0,1,160,360,5,10,65,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1744,G_WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,0,0,1,315,360,0,15,65,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1745,G_CONSTANT,Constant,Constant,55,1000,0,0,0,1,460,580,12,12,50,28,26,47,66,14,10,12,0,6,67,133,110,720,360,360,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1746,G_ALIZA,Aliza,Aliza,69,15000,0,0,0,1,750,1100,8,5,74,74,52,35,110,140,10,12,1,7,60,145,200,1440,576,600,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1747,G_SNAKE,Snake,Boa,15,471,0,0,0,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1748,G_ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,0,0,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1749,G_MEDUSA,Medusa,Medusa,79,22408,0,0,0,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,1720,1320,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1750,G_RED_PLANT,Red Plant,Red Plant,1,100,0,0,0,1,100,200,100,99,0,0,0,0,0,100,7,12,0,3,22,64,2000,1,1,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
-
-// Odin monsters (done, but drop rates guessed)
-1751,RANDGRIS,Valkyrie Randgris,Valkyrie Randgris,99,3567200,0,2854900,3114520,3,5560,9980,25,42,100,120,80,120,220,210,10,12,2,8,86,165,100,576,576,480,1427450,10000,617,5500,603,5000,616,2000,7510,5000,2357,800,2524,1500,2421,1500,2229,2500,7024,2500,0,0,0,0,0,0,4407,1
-1752,SKOGUL,Skogul,Skogul,70,87544,0,27620,10,2,1110,1930,20,15,1,69,70,50,67,52,10,12,1,6,67,133,190,720,384,480,0,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,739,500,2609,100,757,500,0,0,0,0,0,0,4404,1
-1753,FRUS,Frus,Frus,69,83422,0,20620,10,2,1110,1780,20,15,1,69,60,50,76,52,10,12,1,6,67,133,150,480,576,432,0,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,2622,3,2308,10,757,500,0,0,0,0,0,0,4405,1
-1754,SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,91100,10,1,1400,2020,12,24,80,100,50,72,90,50,10,12,0,8,46,165,250,672,780,480,0,0,0,0,0,0,0,0,7511,6000,2254,1,7063,1000,608,20,7511,1000,2322,100,2353,100,0,0,0,0,4406,1
-1755,SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,99200,10,1,1600,2050,15,24,80,120,60,85,98,80,10,12,0,8,46,165,250,672,780,480,0,0,0,0,0,0,0,0,7511,6000,2254,1,7063,1000,610,20,7511,1000,2322,100,2353,100,0,0,0,0,4406,1
-1756,G_HYDRO,Hydro,Hydrolancer,89,308230,0,0,0,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,165,160,140,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1757,G_ACIDUS,Acidus,Acidus,80,51112,0,0,0,2,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,46,133,170,168,1008,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1758,G_FERUS,Ferus,Ferus,70,29218,0,0,0,2,1056,1496,34,45,1,78,45,72,81,73,10,12,2,9,43,133,100,108,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1759,G_ACIDUS_,Acidus,Acidus,76,39111,0,0,0,2,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,44,133,180,168,768,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1760,G_FERUS_,Ferus,Ferus,69,21182,0,0,0,2,930,1170,24,38,1,66,77,60,79,35,10,12,2,9,42,133,120,108,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1761,G_SKOGUL,Skogul,Skogul,70,57544,0,0,0,2,1110,1930,20,15,1,69,70,50,67,52,10,12,1,6,67,133,170,720,384,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1762,G_FRUS,Frus,Frus,69,53422,0,0,0,2,1110,1780,20,15,1,69,60,50,76,52,10,12,1,6,67,133,130,480,576,432,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1763,G_SKEGGIOLD,Skeggiold,Skeggiold,81,100200,0,0,0,1,1400,3410,12,24,80,100,50,72,90,50,10,12,0,8,46,165,200,672,780,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1764,G_SKEGGIOLD_,Skeggiold,Skeggiold,83,103000,0,0,0,1,1600,4110,15,24,80,120,60,85,98,80,10,12,0,8,46,165,200,672,780,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1765,G_RANDGRIS,Valkyrie,Valkyrie,99,1567200,0,10000,10000,3,5560,9980,25,42,100,120,80,120,220,210,10,12,2,8,86,165,100,576,576,480,0,0,0,0,0,0,0,0,7510,500,617,100,2115,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1766,EM_ANGELING,Angeling,Angeling,99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,1205,300,1288,288,384,0,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1767,EM_DEVILING,Deviling,Deviling,99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,1205,300,1288,288,384,0,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Rachel / Ice Dungeon monsters (Poring Stats)
-1768,GLOOMUNDERNIGHT,Gloom Under Night,Gloom Under Night,89,2298000,0,962175,276445,3,5880,9516,10,20,100,115,98,78,111,50,10,12,2,0,68,165,200,1344,2880,576,481087,10000,607,5500,617,5000,617,5000,7566,7000,7023,4000,7022,2000,616,5000,2513,1000,0,0,0,0,0,0,0,0,0,0
-1769,AGAV,Agav,Agav,73,29620,0,9780,6622,1,103,1109,15,35,1,32,27,132,69,15,10,12,1,7,80,133,300,768,360,360,0,0,0,0,0,0,0,0,7567,2500,2422,2,7563,4000,2109,1,12183,50,7563,100,0,0,0,0,0,0,0,0
-1770,ECHIO,Echio,Echio,69,34900,0,13560,4300,1,750,1800,33,11,74,74,52,35,59,56,10,12,1,7,80,133,250,768,360,360,0,0,0,0,0,0,0,0,7567,2500,608,10,7563,4000,5172,50,12183,20,7563,100,0,0,0,0,0,0,0,0
-1771,VANBERK,Vanberk,Vanberk,59,9988,0,4203,901,1,230,660,24,6,69,66,39,29,51,41,10,12,1,7,80,133,250,768,360,360,0,0,0,0,0,0,0,0,7568,2500,526,10,7563,1000,5172,10,0,0,7563,100,0,0,0,0,0,0,0,0
-1772,ISILLA,Isilla,Isilla,62,8297,0,3001,3001,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,133,300,768,360,432,0,0,0,0,0,0,0,0,7568,2500,2422,1,7563,1000,2610,10,2601,1,7563,100,0,0,0,0,0,0,0,0
-1773,HODREMLIN,Hodremlin,Hodremlin,61,12180,0,6782,2022,1,845,1678,29,25,80,41,81,56,62,11,10,12,1,6,67,149,140,960,528,432,0,0,0,0,0,0,0,0,587,1000,7340,1000,2406,2,938,1000,7563,1000,1061,2000,0,0,0,0,0,0,0,0
-1774,SEEKER,Seeker,Seeker,65,10090,0,5671,4278,6,723,852,17,30,60,52,34,143,107,27,10,12,0,0,64,149,190,576,432,300,0,0,0,0,0,0,0,0,587,1000,7340,1000,985,20,1061,4000,7563,1000,0,0,0,0,0,0,0,0,0,0
-1775,SNOWIER,Snowier,Snowier,60,19230,0,5882,2699,2,770,1347,22,12,73,46,72,15,52,25,10,12,2,0,41,133,220,936,1020,420,0,0,0,0,0,0,0,0,7561,3000,7066,1000,757,100,510,50,509,500,0,0,991,100,0,0,0,0,0,0
-1776,SIROMA,Siroma,Siroma,42,6800,0,2230,1005,1,220,440,12,8,33,23,52,11,40,19,10,12,0,0,61,131,180,432,648,240,0,0,0,0,0,0,0,0,7561,1000,7066,500,510,10,0,0,0,0,0,0,991,20,0,0,0,0,0,0
-1777,ICE_TITAN,Ice Titan,Ice Titan,60,38200,0,13872,7928,1,1090,1570,71,15,99,34,88,10,79,29,10,12,2,0,61,133,250,861,660,144,0,0,0,0,0,0,0,0,7561,5000,7066,3000,749,100,984,10,985,30,0,0,995,100,0,0,0,0,0,0
-1778,GAZETI,Gazeti,Gazeti,55,12300,0,5758,2075,10,512,612,65,25,1,12,20,60,101,5,10,12,1,6,21,133,190,576,370,270,0,0,0,0,0,0,0,0,7561,3000,7066,3000,985,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1779,KTULLANUX,Ktullanux,Ktullanux,98,4417000,0,2720050,1120020,3,1680,10360,40,42,85,126,82,125,177,112,10,12,2,2,81,165,400,432,840,216,1360025,10000,607,5500,617,5000,617,5000,7562,9000,616,3000,2509,5000,2111,5000,617,5000,607,5000,0,0,0,0,0,0,0,0
-1780,MUSCIPULAR,Muscipular,Muscipular,57,4332,0,1706,1706,3,521,726,12,12,1,53,39,25,92,51,10,12,1,3,22,132,2000,672,648,360,0,0,0,0,0,0,0,0,7565,3000,1032,3000,629,2,1033,2000,905,1000,631,3,0,0,0,0,0,0,0,0
-1781,DROSERA,Drosera,Drosera,46,7221,0,2612,1022,7,389,589,10,13,1,30,27,17,76,41,10,12,1,3,22,132,2000,864,576,336,0,0,0,0,0,0,0,0,7565,3000,938,3000,1032,3000,1033,2000,621,3,905,1000,0,0,0,0,0,0,0,0
-1782,ROWEEN,Roween,Roween,31,5716,0,1669,1266,1,298,377,0,7,51,39,48,18,67,19,10,12,1,2,24,133,200,412,840,300,0,0,0,0,0,0,0,0,7564,3000,919,3000,992,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1783,GALION,Galion,Galion,44,32240,0,10020,3368,1,336,441,11,12,51,52,59,25,72,32,10,12,1,2,44,165,150,864,624,360,0,0,0,0,0,0,0,0,7564,3000,919,3000,996,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1784,STAPO,Stapo,Stapo,23,666,0,332,221,1,135,370,90,5,12,11,15,12,23,1,10,12,0,0,42,131,300,936,792,432,0,0,0,0,0,0,0,0,909,1000,7312,1000,512,1000,7126,100,993,10,0,0,0,0,0,0,0,0,0,0
-1785,ATROCE,Atros,Atros,82,1008420,0,295550,118895,2,2526,3646,25,25,100,87,56,49,89,72,10,12,2,2,67,165,150,576,600,240,147775,10000,607,5500,617,5000,617,5000,7563,7000,608,1000,2621,1000,617,5000,607,5000,5123,100,0,0,0,0,0,0,0,0
-1786,G_AGAV,Agav,Agav,73,25620,0,0,0,1,103,909,15,35,1,32,27,132,69,15,10,12,1,7,40,133,300,768,360,360,0,0,0,0,0,0,0,0,7567,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1787,G_ECHIO,Echio,Echio,69,36900,0,0,0,1,750,1500,33,11,74,74,52,35,59,56,10,12,1,7,40,133,250,768,360,360,0,0,0,0,0,0,0,0,7567,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1788,G_ICE_TITAN,Ice Titan,Ice Titan,60,32900,0,0,0,1,1090,1570,71,15,99,34,88,10,79,29,10,12,2,0,61,133,250,861,660,144,0,0,0,0,0,0,0,0,7561,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1789,ICEICLE,Iceicle,Iceicle,38,10,0,5,5,3,241,1082,0,10,1,10,10,10,172,5,10,12,0,0,41,132,2000,1344,0,0,0,0,0,0,0,0,0,0,7066,1000,7066,1000,7066,1000,7066,500,7066,500,7066,500,7066,500,7066,500,0,0,0,0
-1790,G_RAFFLESIA,Rafflesia,Rafflesia,17,1333,0,0,0,3,105,127,0,2,1,18,24,11,37,10,10,12,0,3,22,133,150,512,528,240,0,0,0,0,0,0,0,0,7577,3000,7575,4000,7576,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1791,G_GALION,Galion,Galion,44,32240,0,0,0,1,336,441,11,12,51,52,59,25,72,32,10,12,1,2,44,165,150,864,624,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1792,SOCCER_BALL,Soccer Ball,Soccer Ball,1,1000,0,0,0,0,0,0,128,99,0,0,0,0,0,0,0,0,0,0,20,131,2000,96,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1793,G_MEGALITH,Megalith,Megalith,45,5300,0,0,0,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1794,G_ROWEEN,Roween,Roween,31,5716,0,0,0,1,298,377,0,7,51,39,48,18,67,19,10,12,1,2,24,133,200,412,840,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1795,BLOODY_KNIGHT_,Bloody Knight,Bloody Knight,82,800000,0,0,0,3,10000,30000,60,60,88,121,100,100,125,55,10,12,2,8,28,1173,250,828,528,192,0,0,0,0,0,0,0,0,1417,100,2412,100,2514,200,2342,300,2513,200,1620,200,617,7000,7578,10000,0,0,0,0
-1796,AUNOE,Aunoe,Aunoe,62,21297,0,4102,4102,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,131,250,768,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1797,FANAT,Fanat,Fanat,62,21297,0,4102,4102,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,131,250,768,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1798,TREASURE_BOX_,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1799,G_SEYREN_,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1800,G_EREMES_,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1801,G_HARWORD_,Whitesmith Harword,Mastersmith Howard,99,310000,0,18000,10000,1,4822,5033,66,36,100,73,112,35,136,60,10,12,1,7,81,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1802,G_MAGALETA_,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,84,64,182,92,100,10,12,1,7,86,131,125,1152,384,288,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1803,G_SHECIL_,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,14,1892,5113,22,35,1,180,39,67,193,130,10,12,1,7,84,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1804,G_KATRINN_,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,88,1,89,42,223,128,93,10,12,1,7,68,131,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1805,B_SEYREN_,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,120,110,81,65,130,52,10,12,1,7,83,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1806,B_EREMES_,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,90,181,62,37,122,60,10,12,1,7,85,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1807,B_HARWORD_,Whitesmith Harword,Mastersmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,100,73,112,35,136,60,10,12,1,7,82,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1808,B_MAGALETA_,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,86,131,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1809,B_SHECIL_,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,14,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,84,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1810,B_KATRINN_,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,131,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1811,G_SMOKIE_,Smokie,Bandit,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,131,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1812,EVENT_LUDE,Lude,Delightful Lude,99,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,131,190,890,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1813,EVENT_HYDRO,Hydro,Hydrolancer,99,5880000,0,4000000,2000000,3,15000,40000,60,55,1,142,250,86,189,32,10,12,2,8,48,131,100,140,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1814,EVENT_MOON,Moonlight Flower,Moonlight Flower,80,30000,0,30000,30000,1,500,800,50,50,1,35,45,112,69,93,10,12,1,2,63,131,150,1276,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1815,EVENT_RICECAKE,Rice Cake,Rice Cake,12,20,0,0,0,1,1,2,100,99,1,1,1,1,1,1,0,0,1,0,20,131,2000,1320,0,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1816,EVENT_GOURD,Gourd,Gourd,12,1000,0,0,0,1,1,2,100,99,1,1,1,1,1,1,0,0,1,0,20,131,2000,96,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-6001,MER_LIF,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6002,MER_AMISTR,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6003,MER_FILIR,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6004,MER_VANILMIRTH,Vanilmirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6005,MER_LIF2,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6006,MER_AMISTR2,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6007,MER_FILIR2,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6008,MER_VANILMIRTH2,Vanimirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6009,MER_LIF_H,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6010,MER_AMISTR_H,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6011,MER_FILIR_H,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6012,MER_VANILMIRTH_H,Vanilmirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6013,MER_LIF_H2,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
-6014,MER_AMISTR_H2,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6015,MER_FILIR_H2,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
-6016,MER_VANILMIRTH_H2,Vanimirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+// Monster Database
+//
+// Structure of Database :
+// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
+// Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough
+
+1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1
+1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1
+1004,HORNET,Hornet,Hornet,8,169,0,19,15,1,22,27,5,5,6,20,8,10,17,5,10,12,0,4,24,137,150,1292,792,216,0,0,0,0,0,0,0,0,992,80,939,9000,909,3500,1208,15,511,350,518,150,0,0,0,0,0,0,4019,1
+1005,FARMILIAR,Familiar,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,0,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1
+1007,FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1
+1008,PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,0,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1
+1009,CONDOR,Condor,Condor,5,92,0,6,5,1,11,14,0,0,1,13,5,0,13,10,10,12,1,2,24,137,150,1148,648,480,0,0,0,0,0,0,0,0,917,9000,1702,150,715,80,1750,5500,517,400,916,2000,582,600,0,0,0,0,4015,1
+1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,129,200,1672,672,432,0,0,0,0,0,0,0,0,902,9000,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1
+1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1
+1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,129,200,2016,816,288,0,0,0,0,0,0,0,0,918,9000,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
+1013,WOLF,Wolf,Wolf,25,919,0,329,199,1,37,46,0,0,1,20,28,15,32,20,10,12,1,2,22,137,200,1054,504,432,0,0,0,0,0,0,0,0,1011,20,920,9000,2308,10,517,650,528,1050,919,5500,578,600,0,0,0,0,4029,1
+1014,SPORE,Spore,Spore,16,510,0,66,108,1,24,48,0,5,1,12,12,5,19,8,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,9000,507,800,510,50,743,10,2220,40,7033,5,578,600,0,0,0,0,4022,1
+1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,957,9000,724,5,938,1000,958,50,727,70,0,0,0,0,0,0,0,0,4038,1
+1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,0,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,1800,1701,150,0,0,0,0,4094,1
+1018,CREAMY,Creamy,Creamy,16,595,0,105,70,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,150,1136,720,840,0,0,0,0,0,0,0,0,924,9000,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1
+1019,PECOPECO,Peco Peco,Peco Peco,19,531,0,159,72,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,137,200,1564,864,576,0,0,0,0,0,0,0,0,925,9000,2402,20,508,200,507,900,1604,100,0,0,582,1000,0,0,0,0,4031,1
+1020,MANDRAGORA,Mandragora,Mandragora,12,405,0,45,32,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,993,50,905,9000,1405,30,511,350,711,300,706,3,1967,10,0,0,0,0,4030,1
+1023,ORK_WARRIOR,Orc Warrior,Orc Warrior,24,1400,0,408,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,9000,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1024,WORM_TAIL,Wormtail,Wormtail,14,426,0,59,40,2,42,51,5,0,1,14,28,5,46,5,10,12,1,3,22,145,200,1048,48,192,0,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1
+1025,SNAKE,Snake,Boa,15,471,0,72,48,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,926,9000,1117,15,507,900,1011,35,937,800,954,1,578,600,0,0,0,0,4037,1
+1026,MUNAK,Munak,Munak,30,2872,0,601,318,1,150,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2181,200,2468,768,288,0,0,0,0,0,0,0,0,901,9000,2264,2,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1
+1028,SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,1201,150,1216,50,0,0,0,0,4086,1
+1029,ISIS,Isis,Isis,47,7003,0,3709,1550,1,423,507,10,35,38,65,43,50,66,15,10,12,2,6,27,149,200,1384,768,336,0,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
+1030,ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,300,149,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,1011,50,937,9000,1455,10,926,1500,936,200,508,150,756,50,0,0,0,0,4062,1
+1031,POPORING,Poporing,Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,0,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,512,5,1207,5,512,250,0,0,0,0,4033,1
+1032,VERIT,Verit,Verit,38,5272,0,835,517,1,389,469,0,5,1,19,38,0,38,20,10,12,1,1,29,131,250,2468,768,480,0,0,0,0,0,0,0,0,929,9000,912,700,930,1100,509,600,2609,1,2612,200,639,20,0,0,0,0,4107,1
+1033,ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,163,101,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,990,50,907,9000,1019,350,757,40,2329,30,690,100,604,100,0,0,0,0,4052,1
+1034,THARA_FROG,Thara Frog,Thara Frog,22,2152,0,219,138,1,105,127,0,10,1,22,22,5,34,10,10,12,1,5,41,129,200,2016,816,288,0,0,0,0,0,0,0,0,1011,45,908,5500,911,600,509,30,725,5,918,2000,0,0,0,0,0,0,4058,1
+1035,HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,33,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5335,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
+1036,GHOUL,Ghoul,Ghoul,40,5418,0,1088,622,1,420,500,5,20,1,20,29,0,45,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,958,6000,756,110,509,700,511,800,2609,60,934,150,1260,1,0,0,0,0,4110,1
+1037,SIDE_WINDER,Side Winder,Side Winder,43,4929,0,1996,993,1,240,320,5,10,38,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,0,0,0,0,0,0,0,0,954,5335,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,0,0,0,0,4117,1
+1038,OSIRIS,Osiris,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,12,1,1,89,1205,100,1072,672,384,35750,10000,603,4000,608,3000,751,500,617,2000,1232,150,2235,200,1255,600,1009,1000,5053,150,984,3783,0,0,0,0,4144,1
+1039,BAPHOMET,Baphomet,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,12,2,6,67,1205,100,768,768,576,53625,10000,607,2000,750,500,923,5000,1466,200,2256,200,2607,800,714,500,617,3000,985,5432,984,4171,0,0,0,0,4147,1
+1040,GOLEM,Golem,Golem,25,3900,0,465,94,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,999,150,953,9000,912,220,757,70,1003,210,715,200,998,350,0,0,0,0,4072,1
+1041,MUMMY,Mummy,Mummy,37,5176,0,800,602,1,305,360,0,10,28,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,930,9000,756,100,934,550,2604,1,2611,10,525,250,508,850,0,0,0,0,4106,1
+1042,STEEL_CHONCHON,Steel Chonchon,Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,139,150,1076,576,480,0,0,0,0,0,0,0,0,992,90,999,30,910,2400,935,9000,943,30,998,200,1002,300,0,0,0,0,4042,1
+1044,OBEAUNE,Obeaune,Obeaune,31,3952,0,644,407,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,0,0,0,0,0,0,0,0,995,13,950,9000,5014,1,2326,10,720,10,951,500,748,30,0,0,0,0,4093,1
+1045,MARC,Marc,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,995,18,956,9000,756,95,951,1000,720,10,717,200,509,700,0,0,0,0,4105,1
+1046,DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,88,90,90,35,125,65,10,12,1,6,67,1205,100,480,480,288,25740,10000,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1
+1047,PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,1500,2102,2,507,400,507,400,713,1800,736,10,0,0,0,0,4007,1
+1048,THIEF_BUG_EGG,Thief Bug Egg,Thief Bug Egg,4,48,0,8,4,0,13,17,20,0,1,6,4,0,14,20,10,12,0,4,27,0,1000,701,1,1,0,0,0,0,0,0,0,0,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,250,0,0,0,0,4012,1
+1049,PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,9000,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,1
+1050,PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,10,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,9000,949,700,5015,10,507,600,519,300,715,50,10012,10,0,0,0,0,4011,1
+1051,THIEF_BUG,Thief Bug,Thief Bug,6,126,0,17,5,1,18,24,5,0,1,6,6,0,11,0,10,12,0,4,60,139,150,1288,288,768,0,0,0,0,0,0,0,0,955,2500,2304,80,507,350,909,2000,2303,120,1002,250,0,0,0,0,0,0,4016,1
+1052,ROCKER,Rocker,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,9000,1916,10,2298,4,1402,80,520,10,752,10,703,10,0,0,0,0,4021,1
+1053,THIEF_BUG_,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,139,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,300,0,0,0,0,4026,1
+1054,THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,0,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
+1055,MUKA,Muka,Muka,17,610,0,273,120,1,40,49,5,5,15,15,30,5,20,10,10,12,2,3,22,129,300,1960,960,384,0,0,0,0,0,0,0,0,993,70,952,9000,713,2000,511,400,507,1000,1451,50,1002,250,0,0,0,0,4036,1
+1056,SMOKIE,Smokie,Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,1,754,2,912,5,729,2,0,0,0,0,4044,1
+1057,YOYO,Yoyo,Yoyo,21,879,0,280,111,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,0,0,0,0,0,0,0,0,942,9000,513,1500,508,200,7182,900,753,10,756,24,578,1000,0,0,0,0,4051,1
+1058,METALLER,Metaller,Metaller,22,926,0,241,152,1,131,159,15,30,1,22,22,20,49,50,10,12,1,4,23,139,200,1708,1008,540,0,0,0,0,0,0,0,0,990,60,940,6500,911,400,757,49,707,20,935,3000,1914,10,0,0,0,0,4057,1
+1059,MISTRESS,Mistress,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,50,165,60,95,70,130,10,12,0,4,84,1205,100,1148,648,300,19662,10000,996,1500,526,4000,722,3000,1413,150,518,10000,2249,250,616,1000,7018,10,985,4268,984,3300,0,0,0,0,4132,1
+1060,BIGFOOT,Bigfoot,Bigfoot,25,1619,0,310,188,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,948,9000,2289,5,919,5000,740,80,516,1500,518,450,756,43,0,0,0,0,4074,1
+1061,NIGHTMARE,Nightmare,Nightmare,49,4437,0,1912,1912,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,0,0,0,0,0,0,0,0,944,6000,510,500,2608,2,603,30,505,100,1261,1,984,60,0,0,0,0,4127,1
+1062,PORING_,Santa Poring,Santa Poring,3,69,0,4,5,1,12,16,0,0,1,14,3,10,12,90,10,12,1,3,26,129,400,1672,672,480,0,0,0,0,0,0,0,0,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,0,0,0,0,0,0,4005,1
+1063,LUNATIC,Lunatic,Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,512,2000,507,600,515,1100,622,20,0,0,0,0,4006,1
+1064,MEGALODON,Megalodon,Megalodon,24,1648,0,215,132,1,155,188,0,15,1,12,24,0,26,5,10,12,1,1,29,129,200,2492,792,432,0,0,0,0,0,0,0,0,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,0,0,0,0,4067,1
+1065,STROUF,Strouf,Strouf,48,11990,0,3080,2098,1,200,1250,5,50,1,40,45,92,43,65,10,12,2,5,61,2181,150,1872,672,384,0,0,0,0,0,0,0,0,951,5335,756,115,2241,2,1461,2,949,3000,720,20,956,1500,0,0,0,0,4111,1
+1066,VADON,Vadon,Vadon,19,1017,0,135,85,1,74,85,20,0,1,19,16,10,36,15,10,12,0,5,21,145,300,1632,432,540,0,0,0,0,0,0,0,0,991,40,960,9000,910,3000,2313,5,943,100,757,40,717,50,0,0,0,0,4049,1
+1067,CORNUTUS,Cornutus,Cornutus,23,1620,0,240,149,1,109,131,30,0,1,23,23,5,36,12,10,12,0,5,21,145,200,1248,48,480,0,0,0,0,0,0,0,0,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,0,0,0,0,4061,1
+1068,HYDRA,Hydra,Hydra,14,660,0,59,40,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,1011,25,962,5500,938,1500,971,20,525,5,517,700,0,0,0,0,0,0,4035,1
+1069,SWORD_FISH,Swordfish,Swordfish,30,4299,0,1251,638,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,2181,200,1968,768,384,0,0,0,0,0,0,0,0,995,10,963,9000,756,33,2257,2,757,50,1117,25,956,600,0,0,0,0,4089,1
+1070,KUKRE,Kukre,Kukre,11,507,0,38,28,1,28,37,15,0,1,11,11,5,16,2,10,12,0,5,21,131,150,1776,576,288,0,0,0,0,0,0,0,0,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,0,0,0,0,4027,1
+1071,PIRATE_SKEL,Pirate Skeleton,Pirate Skeleton,25,1676,0,233,142,1,145,178,10,15,25,13,25,5,25,10,10,12,1,1,29,2181,200,1754,554,288,0,0,0,0,0,0,0,0,932,3000,2287,15,7477,5,2211,250,1104,250,756,43,628,20,0,0,0,0,4073,1
+1072,KAHO,Kaho,Kaho,60,8409,0,3990,450,1,110,760,5,50,1,55,43,88,80,46,10,12,1,6,83,2181,150,1700,1000,500,0,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1
+1073,CRAB,Crab,Crab,20,2451,0,163,101,1,71,81,35,0,18,20,15,0,36,15,7,12,0,5,21,129,200,992,792,360,0,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1
+1074,SHELLFISH,Shellfish,Shellfish,15,920,0,66,44,1,35,42,35,0,1,12,8,0,32,5,10,12,0,5,21,145,200,864,864,384,0,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1
+1075,TURTLE,Turtle,Turtle,3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,129,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1076,SKELETON,Skeleton,Skeleton,10,234,0,18,14,1,39,47,10,10,1,5,10,0,12,0,10,12,1,1,29,145,200,2228,528,576,0,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1
+1077,POISON_SPORE,Poison Spore,Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,0,24,0,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,7033,9000,2221,20,511,550,510,60,972,50,921,1200,912,5,0,0,0,0,4048,1
+1078,RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0
+1079,BLUE_PLANT,Blue Plant,Blue Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0
+1080,GREEN_PLANT,Green Plant,Green Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0
+1081,YELLOW_PLANT,Yellow Plant,Yellow Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0
+1082,WHITE_PLANT,White Plant,White Plant,1,10,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0
+1083,SHINING_PLANT,Shining Plant,Shining Plant,1,20,0,0,0,1,1,2,100,99,0,0,0,0,0,90,7,12,0,3,26,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0
+1084,BLACK_MUSHROOM,Black Mushroom,Black Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0
+1085,RED_MUSHROOM,Red Mushroom,Red Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0
+1086,GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,64,126000,0,14300,7150,1,870,1145,60,45,65,75,35,45,85,150,10,12,2,4,43,171,100,768,768,480,7150,10000,2610,2000,701,1000,0,0,969,1000,1524,150,2246,250,10016,500,714,300,985,2000,984,1500,0,0,0,0,4128,1
+1087,ORK_HERO,Orc Hero,Orc Hero,77,295700,0,58630,32890,1,2257,2542,40,45,1,91,99,70,105,90,10,12,2,7,42,1205,150,1678,780,648,29315,10000,725,2000,607,1500,999,5000,968,9700,10018,500,1366,150,2106,250,1124,1000,985,4559,984,3589,0,0,0,0,4143,1
+1088,VOCAL,Vocal,Vocal,18,3016,0,110,88,1,71,82,10,30,77,28,26,30,53,40,10,12,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,2247,50,940,8000,721,1000,752,1500,2420,1000,645,700,1917,10,0,0,0,0,4211,1
+1089,TOAD,Toad,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,12,1,5,21,1205,200,1236,336,432,0,0,0,0,0,0,0,0,2244,50,518,2000,729,1000,746,1500,970,100,971,100,5125,1000,0,0,0,0,4306,1
+1090,MASTERING,Mastering,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,12,1,3,21,1205,300,1072,672,480,0,0,0,0,0,0,0,0,2257,200,619,50,722,1000,2116,1000,512,8000,512,8000,531,4000,0,0,0,0,4197,1
+1091,DRAGON_FLY,Dragon Fly,Dragon Fly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,12,0,4,24,1205,100,1076,576,480,0,0,0,0,0,0,0,0,2245,200,507,8000,719,1500,742,2000,2607,3000,625,50,533,3000,0,0,0,0,4179,1
+1092,VAGABOND_WOLF,Vagabond Wolf,Vagabond Wolf,24,12240,0,247,176,1,135,159,10,0,57,45,48,20,50,65,10,12,1,2,22,1205,150,1048,648,432,0,0,0,0,0,0,0,0,2248,200,920,8000,728,1500,1148,100,2521,1000,725,10,626,50,0,0,0,0,4183,1
+1093,ECLIPSE,Eclipse,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,12,1,2,60,1205,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,507,8000,727,1200,746,1500,706,30,622,50,2355,1000,0,0,0,0,4266,1
+1094,AMBERNITE,Ambernite,Ambernite,13,495,0,57,38,1,39,46,30,0,1,13,13,5,18,5,10,12,2,4,21,145,400,2048,648,648,0,0,0,0,0,0,0,0,991,50,946,9000,910,1200,935,3000,943,2,757,14,1002,150,0,0,0,0,4032,1
+1095,ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,139,300,1288,288,384,0,0,0,0,0,0,0,0,955,9000,910,1000,938,500,993,50,1001,4,1002,350,757,28,0,0,0,0,4043,1
+1096,ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,12,1,8,86,1205,200,1072,672,672,0,0,0,0,0,0,0,0,2254,100,2324,60,610,500,2282,1,509,2000,512,28,714,40,0,0,0,0,4054,1
+1097,ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,320,935,2000,909,2000,938,650,713,2000,1002,200,0,0,0,0,0,0,4013,1
+1098,ANUBIS,Anubis,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,1717,200,2000,1000,500,0,0,0,0,0,0,0,0,2602,5,509,600,2601,5,1007,15,0,0,0,0,0,0,0,0,0,0,4138,1
+1099,ARGIOPE,Argiope,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,1685,300,1792,792,336,0,0,0,0,0,0,0,0,1042,5335,912,1200,757,175,2406,5,511,1500,719,10,0,0,0,0,0,0,4114,1
+1100,ARGOS,Argos,Argos,25,1117,0,388,188,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,0,0,0,0,0,0,0,0,1025,9000,911,1200,1042,500,757,61,511,670,508,250,10017,15,0,0,0,0,4075,1
+1101,BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1173,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,508,1300,2405,50,0,0,0,0,4129,1
+1102,BATHORY,Bathory,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,1001,200,1061,4850,2252,3,1611,5,1000,30,1006,15,637,20,0,0,0,0,4119,1
+1103,CARAMEL,Caramel,Caramel,23,1424,0,264,162,1,90,112,5,5,35,23,46,5,38,10,10,12,0,2,22,145,200,1604,840,756,0,0,0,0,0,0,0,0,1027,9000,2310,5,919,5500,1455,10,1405,15,1408,20,0,0,0,0,0,0,4063,1
+1104,COCO,Coco,Coco,17,817,0,120,78,1,56,67,0,0,24,17,34,20,24,10,10,12,0,2,22,145,150,1864,864,1008,0,0,0,0,0,0,0,0,1026,9000,2502,20,914,3000,919,2500,516,500,2402,25,578,600,0,0,0,0,4041,1
+1105,DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,139,150,1288,288,576,0,0,0,0,0,0,0,0,955,9000,910,3000,938,1200,990,50,1001,8,1002,450,757,34,0,0,0,0,4043,1
+1106,DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,56,27,45,15,56,10,10,12,1,2,23,141,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,0,0,0,0,4082,1
+1107,DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,80,517,600,2301,200,13011,5,582,1000,0,0,0,0,4023,1
+1108,DEVIACE,Deviace,Deviace,47,20090,0,9988,7207,1,514,1024,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,995,25,1053,9000,1054,1000,5011,2,971,200,1256,3,756,161,0,0,0,0,4125,1
+1109,DEVIRUCHI,Deviruchi,Deviruchi,46,6666,0,2662,1278,1,475,560,10,25,1,69,40,55,70,30,10,12,0,6,27,1173,150,980,600,384,0,0,0,0,0,0,0,0,1038,5335,1039,400,984,2,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
+1110,DOKEBI,Dokebi,Dokebi,33,2697,0,889,455,1,197,249,0,10,50,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,9000,757,150,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
+1111,DRAINLIAR,Drainliar,Drainliar,24,1162,0,431,176,1,74,84,0,0,1,36,24,0,78,0,10,12,0,2,47,149,250,1276,576,384,0,0,0,0,0,0,0,0,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,0,0,0,0,4069,1
+1112,DRAKE,Drake,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,85,80,49,75,79,50,10,12,1,1,29,1205,400,620,420,360,14300,10000,504,5000,719,500,0,0,1127,600,1125,950,1135,150,1128,400,5019,350,985,3200,984,2300,0,0,0,0,4137,1
+1113,DROPS,Drops,Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,512,800,620,20,0,0,0,0,4004,1
+1114,DUSTINESS,Dustiness,Dustiness,21,1044,0,218,140,1,80,102,0,10,1,53,17,0,38,5,10,12,0,4,44,145,150,1004,504,384,0,0,0,0,0,0,0,0,1057,9000,1058,500,2291,4,928,2000,1001,10,507,1200,0,0,0,0,0,0,4056,1
+1115,EDDGA,Eddga,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,78,70,85,66,90,85,10,12,2,2,23,1205,300,872,1344,432,12512,10000,1029,5000,1030,1000,994,3000,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,0,0,0,0,4123,1
+1116,EGGYRA,Eggyra,Eggyra,24,633,0,215,220,1,85,107,20,25,1,36,24,0,32,0,10,12,1,0,48,145,200,1816,816,288,0,0,0,0,0,0,0,0,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,0,0,0,0,4070,1
+1117,EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,2890,1827,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,1173,300,2276,576,336,0,0,0,0,0,0,0,0,2217,10,1615,1,2508,2,1551,10,610,200,7478,4,509,2000,0,0,0,0,4141,1
+1118,FLORA,Flora,Flora,26,2092,0,357,226,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,1032,9000,2253,3,704,10,521,50,629,20,905,2000,748,1,0,0,0,0,4080,1
+1119,FRILLDORA,Frilldora,Frilldora,30,2023,0,529,319,1,200,239,0,10,35,30,38,15,53,30,10,12,1,2,23,2181,300,1540,720,432,0,0,0,0,0,0,0,0,1012,5500,757,90,903,1500,721,15,715,200,507,800,912,120,0,0,0,0,4088,1
+1120,GHOSTRING,Ghostring,Ghostring,18,73300,0,101,108,1,82,122,0,60,40,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,1059,5335,2274,100,2336,50,604,500,603,10,714,30,695,100,0,0,0,0,4047,1
+1121,GIEARTH,Giearth,Giearth,29,2252,0,495,301,1,154,185,10,50,25,29,46,60,64,105,10,12,0,6,22,145,200,1848,1296,432,0,0,0,0,0,0,0,0,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,0,0,0,0,0,0,4087,1
+1122,GOBLIN_1,Goblin,Goblin,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,9000,756,43,2297,3,1211,10,2104,5,507,1800,0,0,0,0,4060,1
+1123,GOBLIN_2,Goblin,Goblin,24,1034,0,287,176,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,998,250,911,9000,5010,3,1511,10,2104,1,507,1550,2297,3,0,0,0,0,4060,1
+1124,GOBLIN_3,Goblin,Goblin,24,1034,0,357,176,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,998,230,911,9000,2275,3,5088,15,2104,1,507,1550,508,220,0,0,0,0,4060,1
+1125,GOBLIN_4,Goblin,Goblin,23,1359,0,264,164,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,993,100,998,170,5087,15,2263,3,1508,10,2104,1,507,1500,0,0,0,0,4060,1
+1126,GOBLIN_5,Goblin,Goblin,22,1952,0,241,152,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,998,150,911,9000,1605,15,2104,1,5089,15,507,1500,508,220,0,0,0,0,4060,1
+1127,HODE,Hode,Hode,26,2282,0,550,300,1,146,177,0,30,1,26,42,5,49,40,10,12,1,2,42,129,200,1480,480,720,0,0,0,0,0,0,0,0,993,120,1055,9000,757,80,938,3000,1146,10,7021,1,632,20,0,0,0,0,4081,1
+1128,HORN,Horn,Horn,18,659,0,134,86,1,58,69,10,0,22,18,28,10,47,15,10,12,1,4,22,145,200,1528,528,288,0,0,0,0,0,0,0,0,993,80,1011,35,947,5500,1452,15,935,5500,943,70,0,0,0,0,0,0,4045,1
+1129,HORONG,Horong,Horong,34,1939,0,786,479,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,0,0,0,0,4103,1
+1130,JAKK,Jakk,Jakk,38,3581,0,1408,880,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,9000,912,900,985,31,2331,5,1008,5,535,1000,0,0,0,0,0,0,4109,1
+1131,JOKER,Joker,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,1173,100,1364,864,432,0,0,0,0,0,0,0,0,912,2000,616,2,641,20,508,1000,1259,1,984,100,695,100,0,0,0,0,4139,1
+1132,KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,58,65,48,5,73,40,10,12,2,1,29,1173,350,528,1000,396,0,0,0,0,0,0,0,0,932,8000,985,191,5017,1,2108,2,1004,10,509,2000,1127,2,0,0,0,0,4136,1
+1133,KOBOLD_1,Kobold,Kobold,36,3893,0,988,625,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
+1134,KOBOLD_2,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1
+1135,KOBOLD_3,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,0,0,2104,3,508,100,0,0,0,0,4091,1
+1136,KOBOLD_4,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1
+1137,KOBOLD_5,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1
+1138,MAGNOLIA,Magnolia,Magnolia,26,3195,0,393,248,1,120,151,5,30,1,26,26,0,39,5,10,12,0,6,21,131,250,1560,360,360,0,0,0,0,0,0,0,0,7031,9000,910,800,911,100,912,10,737,40,508,400,12127,5,0,0,0,0,4076,1
+1139,MANTIS,Mantis,Mantis,26,2472,0,393,248,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,0,0,0,0,0,0,0,0,993,110,1031,9000,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1
+1140,MARDUK,Marduk,Marduk,40,4214,0,1238,752,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,0,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1
+1141,MARINA,Marina,Marina,21,2087,0,218,140,1,84,106,0,5,1,21,21,0,36,10,10,12,0,3,41,129,400,2280,1080,864,0,0,0,0,0,0,0,0,1052,5000,938,1500,991,45,995,2,717,200,631,20,0,0,0,0,0,0,4055,1
+1142,MARINE_SPHERE,Marine Sphere,Marine Sphere,28,3518,0,461,284,1,120,320,0,40,1,28,28,0,33,50,10,12,0,3,41,0,800,1201,1,1,0,0,0,0,0,0,0,0,1050,5000,1051,2500,1520,10,720,10,717,150,10003,10,0,0,0,0,0,0,4084,1
+1143,MARIONETTE,Marionette,Marionette,41,3222,0,1078,1276,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,0,0,0,0,0,0,0,0,1060,9000,2294,5,2605,1,699,100,1520,15,2407,1,5141,3,0,0,0,0,4113,1
+1144,MARSE,Marse,Marse,31,5034,0,586,370,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,1024,9000,962,3000,717,200,720,10,995,12,1007,5,514,300,0,0,0,0,4095,1
+1145,MARTIN,Martin,Martin,18,1109,0,134,86,1,52,63,0,5,12,18,30,15,15,5,10,12,0,2,42,129,300,1480,480,480,0,0,0,0,0,0,0,0,1017,9000,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1
+1146,MATYR,Matyr,Matyr,31,2585,0,967,407,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,0,0,0,0,0,0,0,0,2618,10,528,5000,919,5500,537,400,757,100,514,200,0,0,0,0,0,0,4097,1
+1147,MAYA,Maya,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,95,97,76,95,82,105,10,12,2,4,82,1205,100,864,1000,480,21450,10000,730,2000,603,3000,617,2000,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,0,0,0,0,4146,1
+1148,MEDUSA,Medusa,Medusa,79,16408,0,6876,4697,1,827,1100,28,18,1,74,50,57,77,69,10,12,1,6,40,1173,180,1720,1320,360,0,0,0,0,0,0,0,0,1048,5335,1965,250,702,200,2610,150,722,250,967,3500,1007,3,0,0,0,0,4124,1
+1149,MINOROUS,Minorous,Minorous,52,7431,0,2750,1379,1,590,770,15,5,65,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,0,0,0,0,0,0,0,0,941,5335,756,196,1361,2,1005,10,516,1500,1301,200,568,300,0,0,0,0,4126,1
+1150,MOONLIGHT,Moonlight Flower,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,55,99,55,82,95,120,10,12,1,6,63,1205,150,1276,576,288,13750,10000,1022,5000,504,1500,728,500,5008,1000,1234,100,1525,150,10008,500,638,650,985,2600,984,1900,0,0,0,0,4131,1
+1151,MYST,Myst,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,5005,2,1019,800,10005,10,756,65,757,97,605,20,514,35,0,0,0,0,4108,1
+1152,ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,315,194,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,922,5500,932,3500,757,80,2299,2,1358,10,511,50,0,0,0,0,0,0,4085,1
+1153,ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,196,120,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2181,400,2852,1152,840,0,0,0,0,0,0,0,0,1043,5500,938,3000,714,1,0,0,0,0,0,0,0,0,0,0,0,0,4071,1
+1154,PASANA,Pasana,Pasana,61,8289,0,4087,2135,1,513,682,29,35,1,73,50,61,59,43,10,12,1,7,43,149,165,976,576,288,0,0,0,0,0,0,0,0,7110,4365,7121,2500,757,20,1105,500,1217,150,2522,100,0,0,0,0,0,0,4099,1
+1155,PETIT,Petite,Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,55,79,60,10,12,1,9,22,149,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5335,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
+1156,PETIT_,Petite,Petite,45,5747,0,1758,1075,1,300,355,20,45,1,113,45,55,73,80,10,12,1,9,24,149,150,1420,1080,528,0,0,0,0,0,0,0,0,1036,5335,1037,300,985,61,509,1000,13006,5,912,1500,606,15,0,0,0,0,4120,1
+1157,PHARAOH,Pharaoh,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,1205,125,868,768,288,57495,10000,607,5500,526,5000,732,5000,7113,5820,7114,2500,1136,100,2327,150,5002,500,1552,300,1231,80,0,0,0,0,4148,1
+1158,PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,0,88,75,10,12,1,5,41,145,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,5500,963,2000,720,5,517,1000,951,500,756,25,0,0,0,0,0,0,4077,1
+1159,PHREEONI,Phreeoni,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,12,2,2,60,1205,200,1020,1020,288,16087,10000,1008,500,730,1000,1000,4000,1015,9700,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,0,0,0,0,4121,1
+1160,PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,139,200,1288,288,576,0,0,0,0,0,0,0,0,955,9000,910,1100,938,600,992,30,1001,5,1002,400,757,31,0,0,0,0,4043,1
+1161,PLANKTON,Plankton,Plankton,10,354,0,23,18,1,26,31,0,5,1,10,10,0,15,0,10,12,0,3,61,129,400,2208,1008,324,0,0,0,0,0,0,0,0,1052,9000,910,300,938,700,970,4,713,1000,630,20,645,50,0,0,0,0,4024,1
+1162,RAFFLESIA,Rafflesia,Rafflesia,17,1333,0,333,333,3,105,127,0,2,1,18,24,11,37,10,10,12,0,3,22,133,150,512,528,240,0,0,0,0,0,0,0,0,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,0,0,0,0,4083,1
+1163,RAYDRIC,Raydric,Raydric,52,8613,0,3410,1795,1,830,930,40,15,58,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,0,0,0,0,0,0,0,0,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,4850,0,0,0,0,4133,1
+1164,REQUIEM,Requiem,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,603,35,714,1,912,2500,958,3500,934,1500,2308,10,7477,1,0,0,0,0,4104,1
+1165,SAND_MAN,Sandman,Sandman,34,3413,0,810,492,1,180,205,10,25,24,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1
+1166,SAVAGE,Savage,Savage,26,2092,0,521,248,1,120,150,10,5,1,26,54,10,37,15,10,12,2,2,42,145,150,1960,960,384,0,0,0,0,0,0,0,0,1028,9000,514,300,702,2,2276,1,605,10,757,70,526,2,0,0,0,0,4078,1
+1167,SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,9000,1302,100,517,500,1750,1000,949,850,1010,80,627,40,0,0,0,0,4017,1
+1168,SCORPION_KING,Scorpion King,Scorpion King,50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,145,200,1700,1000,500,0,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1
+1169,SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,397,240,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,0,0,0,0,4092,1
+1170,SOHEE,Sohee,Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,250,2112,912,576,0,0,0,0,0,0,0,0,1020,9000,1049,50,2277,1,2504,5,1217,5,507,1000,662,350,0,0,0,0,4100,1
+1171,SOLDIER_ANDRE,Soldier Andre,Soldier Andre,22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1
+1172,SOLDIER_DENIRO,Soldier Deniro,Soldier Deniro,29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,149,200,2000,1000,500,0,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1
+1173,SOLDIER_PIERE,Soldier Piere,Soldier Piere,23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1
+1174,STAINER,Stainer,Stainer,16,538,0,105,70,1,53,64,10,0,1,40,16,5,30,5,10,12,0,4,24,145,200,1688,1188,612,0,0,0,0,0,0,0,0,992,70,1011,30,1013,9000,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1
+1175,TAROU,Tarou,Tarou,11,284,0,57,28,1,34,45,0,0,1,20,11,10,24,5,10,12,0,2,27,145,150,1744,1044,684,0,0,0,0,0,0,0,0,1016,9000,919,3000,949,800,528,1000,701,2,0,0,0,0,0,0,0,0,4028,1
+1176,VITATA,Vitata,Vitata,20,894,0,163,101,1,69,80,15,20,1,20,25,65,40,70,10,12,0,4,22,145,300,1768,768,384,0,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1
+1177,ZENORC,Zenorc,Zenorc,31,2585,0,967,407,1,188,223,0,15,1,77,15,0,76,10,10,12,1,7,27,131,150,1180,480,360,0,0,0,0,0,0,0,0,1044,5500,756,70,938,2500,1006,5,508,100,640,20,0,0,0,0,0,0,4096,1
+1178,ZEROM,Zerom,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,0,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,1002,300,0,0,0,0,4064,1
+1179,WHISPER,Whisper,Whisper,34,1796,0,591,599,1,180,221,0,45,1,51,14,0,60,0,10,12,0,6,68,149,150,1960,960,504,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1
+1180,NINE_TAIL,Nine Tail,Nine Tail,51,7766,0,2812,825,1,610,734,10,25,1,80,46,1,74,85,10,12,1,2,63,1173,150,840,540,480,0,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1
+1181,ZOMBIE_DRAGON,Zombie Dragon,Zombie Dragon,1,1000,0,49500,1650,3,7900,9140,0,0,120,145,145,145,130,120,10,12,2,9,89,1205,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1182,THIEF_MUSHROOM,Thief Mushroom,Thief Mushroom,1,15,0,0,0,1,1,2,100,99,0,0,0,0,0,0,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1183,CHONCHON_,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,2181,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1
+1184,FABRE_,Fabre,Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,2181,400,1672,672,480,0,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,4002,0
+1185,WHISPER_,Whisper,Whisper,34,1796,0,537,545,1,198,239,0,45,1,51,14,0,60,0,10,12,0,1,28,0,150,1960,960,504,0,0,0,0,0,0,0,0,1001,10,1059,100,2282,0,2333,1,0,0,0,0,0,0,0,0,0,0,4102,0
+1186,WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,48,1173,250,2536,1536,672,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4303,1
+1187,SWITCH,Switch,Switch,1,2,0,1,1,1,1,2,0,0,1,1,1,0,1,0,1,12,1,0,20,0,1,1,1,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
+1188,BON_GUN,Bongun,Bongun,32,3520,0,424,242,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,5046,1,609,15,508,1000,508,1250,0,0,0,0,4212,1
+1189,ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,1729,1787,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,149,300,1960,620,480,0,0,0,0,0,0,0,0,1063,4656,1753,1000,1756,2500,1755,2500,1716,2,507,1400,509,900,0,0,0,0,4256,1
+1190,ORC_LORD,Orc Lord,Orc Lord,74,393000,0,62205,8580,1,2700,3150,40,5,85,82,149,70,110,85,10,12,2,7,82,1205,100,1248,500,360,31102,10000,968,5500,617,2000,0,0,1363,200,2601,500,5007,150,2627,1000,0,0,985,4268,984,3100,0,0,0,0,4135,1
+1191,MIMIC,Mimic,Mimic,51,6120,0,165,165,1,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,0,0,0,0,0,0,0,0,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,0,0,0,0,4205,1
+1192,WRAITH,Wraith,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,65,95,35,10,12,2,1,89,1173,300,1816,576,240,0,0,0,0,0,0,0,0,1059,5820,2206,10,2506,2,716,650,602,1300,2505,10,731,5,0,0,0,0,4190,1
+1193,ALARM,Alarm,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,1173,300,1020,500,768,0,0,0,0,0,0,0,0,1095,5335,2607,1,7005,1500,611,1300,984,105,7026,20,912,1500,0,0,0,0,4244,1
+1194,ARCLOUSE,Arclouse,Arclouze,59,6075,0,860,1000,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,0,0,0,0,0,0,0,0,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,0,0,0,0,4240,1
+1195,RIDEWORD,Rideword,Rideword,59,11638,0,2007,3106,1,584,804,5,35,48,75,10,20,120,45,10,12,0,0,60,1173,150,864,500,192,0,0,0,0,0,0,0,0,1097,4850,1553,4,1554,4,1555,2,1556,2,7015,300,1006,20,0,0,0,0,4185,1
+1196,SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,2466,1562,1,660,890,10,20,55,20,36,0,76,25,10,12,1,1,69,141,350,1848,500,576,0,0,0,0,0,0,0,0,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,0,0,0,0,4222,1
+1197,ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,2635,1724,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,141,350,1768,500,192,0,0,0,0,0,0,0,0,1099,3500,7016,105,2266,1,716,600,930,3500,2408,39,985,112,0,0,0,0,4275,1
+1198,DARK_PRIEST,Dark Priest,Dark Priest,79,101992,0,12192,5152,2,1238,2037,56,70,5,91,41,101,103,42,10,12,1,6,89,141,200,864,1252,476,0,0,0,0,0,0,0,0,1557,5,2608,30,505,100,716,450,1009,50,2319,5,1241,1,0,0,0,0,4171,1
+1199,PUNK,Punk,Punk,43,3620,0,1699,1033,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,0,0,0,0,0,0,0,0,7001,5335,715,800,10004,100,1061,1000,1057,3000,601,1100,2502,15,0,0,0,0,4313,1
+1200,ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,3608,2304,1,700,850,10,15,70,85,40,30,125,60,10,12,1,7,60,141,200,800,2112,768,0,0,0,0,0,0,0,0,7017,5,509,1800,7293,1500,2331,8,2622,1,1970,100,2291,3,0,0,0,0,4277,1
+1201,RYBIO,Rybio,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,141,200,1790,1440,540,0,0,0,0,0,0,0,0,1015,3880,7017,3,509,1800,731,30,1008,10,984,100,709,30,0,0,0,0,4194,1
+1202,PHENDARK,Phendark,Phendark,73,22729,0,6826,3443,2,794,1056,52,36,1,62,120,65,76,66,10,12,2,7,40,141,175,1744,1344,600,0,0,0,0,0,0,0,0,1015,3880,7017,4,509,1800,0,0,984,150,1971,100,0,0,0,0,0,0,4329,1
+1203,MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,1205,250,1152,500,240,0,0,0,0,0,0,0,0,7019,1,7297,1500,1152,70,1155,40,1163,2,999,120,984,243,0,0,0,0,4207,1
+1204,TIRFING,Tirfing,Ogretooth,71,29900,0,5412,4235,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,1205,100,816,500,240,0,0,0,0,0,0,0,0,7022,1,638,50,7292,1500,1214,70,1217,40,999,120,984,189,0,0,0,0,4254,1
+1205,EXECUTIONER,Executioner,Executioner,65,28980,0,4730,3536,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,1205,200,768,500,384,0,0,0,0,0,0,0,0,7024,5,7290,1500,1111,80,1114,60,1125,40,999,120,984,145,0,0,0,0,4250,1
+1206,ANOLIAN,Anolian,Anolian,61,18960,0,5900,3700,1,640,980,15,15,1,43,58,25,80,65,10,12,1,5,41,1173,190,900,500,864,0,0,0,0,0,0,0,0,7003,4850,1754,2000,526,5,10019,10,943,5335,2625,1,984,134,0,0,0,0,4234,1
+1207,STING,Sting,Sting,61,9500,0,4081,2970,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,1173,300,528,500,240,0,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,719,3,0,0,0,0,4226,1
+1208,WANDER_MAN,Wander Man,Wanderer,74,8170,0,5786,4730,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,1173,100,672,500,192,0,0,0,0,0,0,0,0,7005,4850,616,1,13015,5,2270,5,610,650,984,217,1164,1,0,0,0,0,4210,1
+1209,CRAMP,Cramp,Cramp,56,4720,0,2300,1513,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,250,510,70,984,95,0,0,0,0,4296,1
+1210,FILAMENTOUS,Filamentous,Filamentous,51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1
+1211,BRILIGHT,Brilight,Brilight,46,5562,0,1826,1331,1,298,383,30,5,1,90,15,10,50,35,10,12,0,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,602,1000,757,220,610,250,509,2600,0,0,0,0,4213,1
+1212,IRON_FIST,Iron Fist,Iron Fist,47,4221,0,1435,1520,1,430,590,40,5,1,25,15,10,81,20,10,12,1,4,60,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1
+1213,HIGH_ORC,High Orc,High Orc,52,6890,0,3618,1639,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,1173,150,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1
+1214,CHOCO,Choco,Choco,43,4278,0,1265,1265,1,315,402,5,5,65,68,55,45,65,25,10,12,0,2,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,532,1000,607,25,0,0,0,0,4285,1
+1215,STEM_WORM,Stem Worm,Stem Worm,40,6136,0,1452,939,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7012,5335,509,1800,1968,10,756,115,997,5,1454,20,608,45,0,0,0,0,4224,1
+1216,PENOMENA,Penomena,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,1173,400,832,500,600,0,0,0,0,0,0,0,0,7013,4850,962,8000,938,7000,525,200,719,15,1258,1,716,550,0,0,0,0,4314,1
+1219,KNIGHT_OF_ABYSS,Knight of Abyss,Abysmal Knight,79,36140,0,8469,6268,1,1600,2150,55,50,66,68,64,25,135,50,10,12,2,7,87,1685,300,1500,500,1000,0,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1410,25,1162,1,985,369,984,259,0,0,0,0,4140,1
+1220,M_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,388,242,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,1717,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1
+1221,M_SAVAGE,Savage,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,1717,150,1960,960,384,0,0,0,0,0,0,0,0,1028,6000,514,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1
+1222,L_HIGH_ORC,High Orc,High Orc,52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,508,1100,0,0,0,0,4066,1
+1223,L_ORC,Orc,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,1717,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1224,L_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,1717,200,1672,672,288,0,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1
+1225,L_CHOCO,Choco,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1
+1226,L_KOBOLD,Kobold,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,1717,200,1028,528,360,0,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
+1227,L_GOBLIN,Goblin,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,1717,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1
+1228,L_PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,1717,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1
+1229,META_FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,0,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1
+1230,META_PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1
+1231,META_CREAMY,Creamy,Creamy,16,595,0,96,64,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,200,1220,720,288,0,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1
+1232,META_PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1
+1233,CONCEIVE_PECOPECO,Peco Peco,Peco Peco,19,531,0,159,36,1,50,64,0,0,1,13,13,25,27,9,10,12,2,2,23,129,200,1564,864,576,0,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,582,1000,0,0,0,0,4031,1
+1234,PROVOKE_YOYO,Yoyo,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,6000,7182,500,508,130,919,5500,753,7,578,500,582,1000,0,0,0,0,4051,1
+1235,SMOKING_ORC,Smoking Orc,Smoking Orc,24,1400,0,261,160,1,114,136,10,20,1,24,48,20,34,0,10,12,1,7,22,653,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1236,META_ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1
+1237,META_ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,651,300,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1000,935,3000,1001,6,1002,350,757,28,0,0,0,0,4043,1
+1238,META_PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,651,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
+1239,META_DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,651,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
+1240,META_PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,0,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,2302,150,507,650,519,350,715,60,0,0,0,0,0,0,4008,1
+1241,META_PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,0,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,5015,7,507,750,519,350,715,60,0,0,0,0,0,0,4011,1
+1242,MARIN,Marin,Marin,15,742,0,66,44,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,910,3200,938,1500,700,100,720,40,510,75,529,350,5035,1,0,0,0,0,4196,1
+1243,SASQUATCH,Sasquatch,Sasquatch,30,3163,0,529,319,1,250,280,5,0,75,25,60,10,34,20,10,12,2,2,60,1173,300,1260,192,192,0,0,0,0,0,0,0,0,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,0,0,0,0,4216,1
+1244,JAKK_XMAS,Christmas Jakk,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,644,20,7175,1200,7174,1200,0,0,0,0,4109,1
+1245,GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,7174,550,7175,550,756,43,644,10,1211,10,2104,5,2236,10,0,0,0,0,4060,1
+1246,COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,461,284,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,538,1500,722,45,912,200,2502,25,644,5,688,100,507,1700,0,0,0,0,4235,1
+1247,ANTONIO,Antonio,Antonio,10,10,0,3,2,1,13,20,100,0,1,1,1,50,100,100,10,12,1,3,66,129,100,720,720,432,0,0,0,0,0,0,0,0,7034,10000,644,200,538,1500,539,1000,529,5500,530,5500,2236,250,0,0,0,0,4243,1
+1248,CRUISER,Cruiser,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,133,400,1296,1296,432,0,0,0,0,0,0,0,0,1098,900,2251,2,998,320,996,5,911,3500,13150,5,756,87,0,0,0,0,4297,1
+1249,MYSTCASE,Myst Case,Myst Case,38,3450,0,1113,688,1,160,360,5,10,65,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,530,90,912,1500,603,20,539,800,722,150,731,5,529,340,0,0,0,0,4206,1
+1250,CHEPET,Chepet,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,1173,400,672,672,288,0,0,0,0,0,0,0,0,7035,2500,912,750,512,5500,619,40,10019,5,508,1300,2508,5,0,0,0,0,4284,1
+1251,KNIGHT_OF_WINDSTORM,Knight of Windstorm,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,75,185,83,55,130,79,10,12,2,0,84,1205,200,468,468,288,32175,10000,720,4500,2406,500,995,3000,1468,150,603,3000,617,4000,2621,200,2506,500,985,4559,5007,1,0,0,0,0,4318,1
+1252,GARM,Garm,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,85,126,82,65,95,60,10,12,2,2,81,1205,400,608,408,336,25025,10000,7036,1000,603,3000,995,3000,7036,5500,1131,150,1256,500,1815,500,0,0,985,3977,984,2900,0,0,0,0,4324,1
+1253,GARGOYLE,Gargoyle,Gargoyle,48,3950,0,1650,1650,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,912,3880,1039,500,0,0,0,0,2619,1,1769,2000,757,238,0,0,0,0,4149,1
+1254,RAGGLER,Raggler,Raggler,21,1020,0,218,140,1,102,113,0,5,18,10,32,20,39,35,10,12,0,2,24,1173,200,1000,900,384,0,0,0,0,0,0,0,0,7053,3000,916,5000,645,200,514,200,992,90,2225,7,756,32,0,0,0,0,4186,1
+1255,NERAID,Neraid,Nereid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,1173,200,776,576,288,0,0,0,0,0,0,0,0,1055,5100,7053,1000,510,230,1966,10,514,250,757,180,985,37,0,0,0,0,4167,1
+1256,PEST,Pest,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,1173,165,700,648,480,0,0,0,0,0,0,0,0,1055,5500,7054,200,702,10,605,100,716,250,0,0,756,115,0,0,0,0,4315,1
+1257,INJUSTICE,Injustice,Injustice,51,7600,0,2118,1488,1,480,600,0,0,84,42,39,0,71,35,10,12,1,1,47,1173,400,770,720,336,0,0,0,0,0,0,0,0,999,300,7054,5335,7053,3500,2313,5,2316,2,660,2,1255,2,0,0,0,0,4268,1
+1258,GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,461,284,9,89,113,0,0,10,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,2297,3,998,250,911,1000,1765,3000,507,600,1705,25,514,300,0,0,0,0,4157,1
+1259,GRYPHON,Gryphon,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,68,95,78,65,115,75,10,12,2,2,84,1205,100,704,504,432,0,0,0,0,0,0,0,0,7048,2500,7054,5335,7063,120,1452,1500,1417,1,984,185,996,150,0,0,0,0,4163,1
+1260,DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,3652,3271,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,1173,200,920,720,200,0,0,0,0,0,0,0,0,7054,4656,734,1000,2505,30,0,0,0,0,1000,80,747,3,0,0,0,0,4170,1
+1261,WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,1113,688,1,315,360,0,15,65,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,7053,5335,748,50,5037,120,1767,3000,624,35,528,600,2244,2,0,0,0,0,4257,1
+1262,MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,1205,250,1280,1080,240,0,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,400,7296,1500,12040,10,0,0,0,0,4203,1
+1263,WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,2424,1488,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,1173,150,1056,1056,336,0,0,0,0,0,0,0,0,912,4559,932,6000,7005,500,693,100,1611,8,996,100,1615,1,0,0,0,0,4264,1
+1264,MERMAN,Merman,Merman,53,14690,0,4500,3000,2,482,964,10,35,72,45,46,35,60,55,10,12,1,7,61,1173,220,916,816,336,0,0,0,0,0,0,0,0,1054,1300,523,300,568,400,720,40,995,35,1460,3,756,203,0,0,0,0,4199,1
+1265,COOKIE,Cookie,Cookie,25,950,0,310,188,1,130,145,0,25,1,35,20,53,37,90,10,12,0,7,60,137,200,1036,936,240,0,0,0,0,0,0,0,0,538,1000,530,150,979,1,645,280,2402,30,12001,100,529,320,0,0,0,0,4293,1
+1266,ASTER,Aster,Aster,18,1372,0,122,78,1,56,64,0,10,1,19,15,0,34,5,10,12,0,5,22,145,400,1264,864,216,0,0,0,0,0,0,0,0,938,500,7013,40,1052,1200,508,200,912,60,512,100,0,0,0,0,0,0,4247,1
+1267,CARAT,Carat,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,7054,3200,536,1000,2409,5,5003,1,0,0,0,0,509,1450,0,0,0,0,4288,1
+1268,BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,10120,6820,3,2150,3030,60,50,88,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,7054,4850,2229,45,2317,5,2106,65,1170,1,1417,2,985,433,0,0,0,0,4320,1
+1269,CLOCK,Clock,Clock,60,11050,0,3410,2904,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,1095,5335,1019,800,509,1900,568,320,7026,30,7027,30,985,163,0,0,0,0,4299,1
+1270,C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,4378,2850,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,1095,5335,7054,5335,999,500,520,850,2109,1,7026,2000,7027,2000,0,0,0,0,4229,1
+1271,ALLIGATOR,Alligator,Alligator,42,6962,0,1379,866,1,315,360,2,5,1,45,50,10,69,65,10,12,1,2,21,145,200,1100,900,480,0,0,0,0,0,0,0,0,912,1000,1099,600,7003,2000,608,50,0,0,0,0,756,129,0,0,0,0,4252,1
+1272,DARK_LORD,Dark Lord,Dark Lord,80,360000,0,65780,45045,2,2800,3320,30,70,1,120,64,118,99,60,10,12,2,6,89,1205,100,868,768,480,32890,10000,7005,6000,5093,500,617,2000,1615,800,5017,550,1237,300,2334,300,2507,100,985,5141,984,3977,0,0,0,0,4168,1
+1273,ORC_LADY,Orc Lady,Orc Lady,31,2000,0,644,407,1,135,170,10,10,35,42,25,15,69,55,10,12,1,7,42,1173,200,1050,900,288,0,0,0,0,0,0,0,0,7053,4656,998,300,2602,1,2206,1,12127,10,7477,3,2338,1,0,0,0,0,4255,1
+1274,MEGALITH,Megalith,Megalith,45,5300,0,1758,1075,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,912,100,7049,1000,617,1,0,0,0,0,985,61,757,207,0,0,0,0,4200,1
+1275,ALICE,Alice,Alice,62,10000,0,3583,2400,1,550,700,5,5,64,64,42,85,100,130,10,12,1,7,60,145,200,502,2304,480,0,0,0,0,0,0,0,0,7047,2500,637,40,2407,3,739,30,5085,1,12128,10,12002,100,0,0,0,0,4253,1
+1276,RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,3025,2125,9,415,500,35,5,15,25,22,5,145,35,10,12,1,6,47,133,200,1152,1152,480,0,0,0,0,0,0,0,0,7054,4656,0,0,2315,2,1701,150,1764,2000,1715,3,985,106,0,0,0,0,4187,1
+1277,GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,1238,752,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,2000,1019,2000,1501,100,662,300,2272,1,508,250,686,100,0,0,0,0,4283,1
+1278,STALACTIC_GOLEM,Stalactic Golem,Stalactic Golem,60,18700,0,5808,2695,1,950,1260,50,5,73,45,85,5,90,25,10,12,2,0,80,145,200,1264,864,288,0,0,0,0,0,0,0,0,7004,2000,7054,4850,1000,250,997,30,757,250,0,0,985,163,0,0,0,0,4223,1
+1279,TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,386,220,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,1173,200,860,660,624,0,0,0,0,0,0,0,0,7053,100,943,380,606,200,993,160,1001,140,0,0,757,106,0,0,0,0,4308,1
+1280,STEAM_GOBLIN,Steam Goblin,Goblin Steamrider,35,2490,0,864,495,1,234,269,20,5,58,59,32,15,75,25,10,12,1,7,44,145,200,1008,1008,528,0,0,0,0,0,0,0,0,911,2500,7053,3880,998,300,999,55,1003,320,13104,5,757,124,0,0,0,0,4156,1
+1281,SAGEWORM,Sage Worm,Sage Worm,43,3850,0,1155,1320,1,120,280,0,50,1,52,24,88,79,55,10,12,0,2,60,145,200,936,936,288,0,0,0,0,0,0,0,0,693,100,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1
+1282,KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,739,455,9,155,185,10,5,10,20,15,30,100,25,10,12,0,7,23,133,200,1008,1008,384,0,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1
+1283,CHIMERA,Chimera,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,1205,200,772,672,360,0,0,0,0,0,0,0,0,7054,5335,1048,2500,568,1000,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1
+1284,HUGELING,Hugeling,Hugeling,1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,145,200,1872,672,480,0,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0
+1285,ARCHER_GUARDIAN,Archer Guardian,Archer Guardian,74,28634,0,1,1,12,1120,1600,35,60,95,80,80,90,165,55,14,16,2,7,80,165,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1286,KNIGHT_GUARDIAN,Knight Guardian,Knight Guardian,86,30214,0,1,1,2,1280,1560,55,30,110,40,140,65,125,65,14,16,2,7,80,165,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1287,SOLDIER_GUARDIAN,Soldier Guardian,Soldier Guardian,56,15670,0,1,1,1,873,1036,35,0,85,56,100,45,103,43,10,12,0,4,22,165,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1288,EMPELIUM,Emperium,Emperium,90,68430,0,0,0,1,60,71,40,50,1,17,80,50,26,20,10,12,0,8,26,0,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1289,MAYA_PUPLE,Maya Purple,Maya Purple,81,55479,0,10496,3893,2,1447,2000,68,48,95,90,80,95,90,119,10,12,2,4,82,1205,100,1024,1000,480,0,0,0,0,0,0,0,0,7053,4413,757,250,756,300,969,100,984,150,10006,1,7481,2,0,0,0,0,4198,1
+1290,SKELETON_GENERAL,Skeleton General,Skeleton General,73,17402,0,8170,3370,1,910,1089,25,25,90,25,40,20,77,25,10,12,1,1,29,1173,150,2276,576,432,0,0,0,0,0,0,0,0,7068,2550,756,160,508,800,1220,35,1219,80,1222,3,2274,1,0,0,0,0,4221,1
+1291,WRAITH_DEAD,Wraith Dead,Wraith Dead,74,43021,0,10341,3618,2,1366,1626,25,30,5,99,55,75,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,1059,4413,2206,10,2506,8,716,700,732,5,603,100,568,300,0,0,0,0,4189,1
+1292,MINI_DEMON,Mini Demon,Mini Demon,68,32538,0,8396,3722,1,1073,1414,30,25,5,75,40,55,89,42,10,12,0,6,27,1173,150,1000,600,384,0,0,0,0,0,0,0,0,1038,4413,1039,450,2255,3,757,160,912,2500,1009,10,1410,3,0,0,0,0,4204,1
+1293,CREMY_FEAR,Creamy Fear,Creamy Fear,62,13387,0,7365,2691,2,666,829,45,30,5,40,16,15,68,55,10,12,0,4,24,1173,155,1136,720,840,0,0,0,0,0,0,0,0,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,0,0,0,0,4298,1
+1294,KILLER_MANTIS,Killer Mantis,Killer Mantis,56,13183,0,6509,2366,1,764,927,35,20,5,26,24,5,75,40,10,12,1,4,22,1173,175,1528,660,432,0,0,0,0,0,0,0,0,1031,4550,943,2500,721,10,509,15,514,25,1262,1,2108,1,0,0,0,0,4301,1
+1295,OWL_BARON,Owl Baron,Owl Baron,75,60746,0,10967,4811,2,1252,1610,65,25,25,25,80,95,95,55,10,12,2,6,60,1205,175,1345,824,440,0,0,0,0,0,0,0,0,7071,3500,7063,2500,1716,2,1472,1,1402,25,693,100,5045,5,0,0,0,0,4238,1
+1296,KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,18313,0,7432,2713,1,649,958,37,37,5,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,999,450,1034,6305,912,1200,1511,6,1613,2,525,150,526,100,0,0,0,0,4291,1
+1297,ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,8040,3499,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,930,4413,934,1800,2624,1,2611,150,508,650,756,150,757,100,0,0,0,0,4248,1
+1298,ZOMBIE_MASTER,Zombie Master,Zombie Master,62,14211,0,7610,2826,1,824,1084,37,26,25,20,30,5,77,35,10,12,1,1,29,1173,175,2612,912,288,0,0,0,0,0,0,0,0,7071,4413,938,1500,958,1500,723,200,727,100,1260,1,2324,2,0,0,0,0,4274,1
+1299,GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,20152,0,6036,2184,1,663,752,48,16,5,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,7054,1500,999,800,756,120,5090,50,2106,2,508,650,5113,10,0,0,0,0,4155,1
+1300,CATERPILLAR,Caterpillar,Caterpillar,64,14439,0,6272,3107,1,894,1447,47,29,35,25,85,15,69,45,10,12,0,4,22,1173,300,1672,672,480,0,0,0,0,0,0,0,0,949,3000,7054,5335,2227,20,1000,100,997,50,505,12,508,500,0,0,0,0,4289,1
+1301,AM_MUT,Am Mut,Am Mut,61,12099,0,7709,2690,1,1040,1121,50,10,50,65,40,35,83,45,10,12,0,6,27,1173,200,1156,456,384,0,0,0,0,0,0,0,0,1021,4550,757,250,1517,3,969,5,2282,1,616,1,746,250,0,0,0,0,4245,1
+1302,DARK_ILLUSION,Dark Illusion,Dark Illusion,77,103631,0,11163,4181,2,1300,1983,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,1615,3,5017,2,2508,3,7054,5335,522,120,509,1550,1162,2,0,0,0,0,4169,1
+1303,GIANT_HONET,Giant Hornet,Giant Hornet,56,13105,0,5785,2006,1,650,852,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,0,0,0,0,4271,1
+1304,GIANT_SPIDER,Giant Spider,Giant Spider,55,11874,0,6211,2146,1,624,801,41,28,5,36,43,5,73,69,10,12,2,4,25,1173,165,1468,468,768,0,0,0,0,0,0,0,0,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,0,0,0,0,4270,1
+1305,ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,8174,3782,1,948,1115,35,30,5,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,1042,4413,912,2500,2406,9,719,15,1096,680,938,3500,7054,2500,0,0,0,0,4249,1
+1306,LEIB_OLMAI,Leib Olmai,Leib Olmai,58,24233,0,6011,2171,1,740,1390,27,31,5,35,95,5,64,85,10,12,2,2,22,1173,175,1260,230,192,0,0,0,0,0,0,0,0,948,4550,2289,8,740,120,518,500,526,500,969,5,7053,800,0,0,0,0,4188,1
+1307,CAT_O_NINE_TAIL,Cat o' Nine Tails,Cat o' Nine Tails,76,64512,0,10869,4283,1,1112,1275,61,55,55,75,55,82,86,120,10,12,1,6,63,1205,155,1276,576,288,0,0,0,0,0,0,0,0,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,0,0,0,0,4290,1
+1308,PANZER_GOBLIN,Panzer Goblin,Panzer Goblin,59,14130,0,7212,2697,1,683,878,41,28,60,60,40,20,81,160,10,12,1,7,44,1173,200,960,1008,840,0,0,0,0,0,0,0,0,7053,4413,7054,3500,999,180,998,360,1003,580,13158,5,994,160,0,0,0,0,4310,1
+1309,GAJOMART,Gajomart,Gajomart,63,13669,0,6625,2900,1,917,950,85,50,5,34,10,5,75,140,10,12,0,0,83,1173,300,1000,1152,828,0,0,0,0,0,0,0,0,953,6500,912,2300,508,870,2279,8,1752,10000,999,640,994,180,0,0,0,0,4151,1
+1310,MAJORUROS,Majoruros,Majoruros,66,57991,0,8525,3799,1,780,1300,10,25,65,50,75,50,85,48,10,12,2,2,43,1173,250,1100,960,780,0,0,0,0,0,0,0,0,941,4413,1361,4,568,300,984,16,509,1850,2611,160,1000,250,0,0,0,0,4201,1
+1311,GULLINBURSTI,Gullinbursti,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,55,25,60,5,70,45,10,12,2,2,42,1173,150,1960,960,384,0,0,0,0,0,0,0,0,1028,3500,514,290,702,6,2276,1,605,15,2627,1,912,160,0,0,0,0,4164,1
+1312,TURTLE_GENERAL,Turtle General,Turtle General,97,320700,0,18202,9800,2,2438,3478,50,54,100,45,55,65,105,164,10,12,2,2,42,1205,200,900,1000,500,9101,10000,967,5500,607,1500,617,2000,1529,8,1306,5,7480,200,1417,9,7070,5335,1141,80,658,1,0,0,0,0,4305,1
+1313,MOBSTER,Mobster,Mobster,61,7991,0,4424,1688,1,910,1128,41,37,76,46,20,35,76,55,10,12,1,7,20,1173,250,1100,560,580,0,0,0,0,0,0,0,0,1239,3,726,4559,2621,1,716,600,912,2500,525,450,505,60,0,0,0,0,4317,1
+1314,PERMETER,Permeter,Permeter,63,8228,0,3756,1955,2,943,1211,46,45,69,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,967,4413,7070,45,1019,1240,507,2450,912,1240,522,25,605,1,0,0,0,0,4311,1
+1315,ASSULTER,Assaulter,Assaulter,71,11170,0,4854,2654,2,764,1499,35,28,85,74,10,35,100,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,967,4413,7069,1200,7072,840,508,1280,912,1240,13300,5,603,1,0,0,0,0,4246,1
+1316,SOLIDER,Solider,Solider,70,12099,0,4458,1951,2,797,979,57,43,69,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,64,7067,850,508,2100,912,1240,518,850,1519,1,0,0,0,0,4220,1
+1317,FUR_SEAL,Fur Seal,Seal,63,9114,0,3765,1824,1,845,1203,25,33,5,28,22,15,69,84,10,12,1,2,21,149,200,1612,622,583,0,0,0,0,0,0,0,0,912,4365,510,250,2310,5,7053,1200,1452,1,525,200,746,120,0,0,0,0,4312,1
+1318,HEATER,Heater,Heater,68,11020,0,3766,2359,2,683,1008,40,42,69,47,25,5,71,100,10,12,1,2,43,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,750,697,100,912,1640,526,140,7054,600,7068,1250,0,0,0,0,4331,1
+1319,FREEZER,Freezer,Freezer,72,8636,0,3665,2197,2,671,983,55,43,69,41,59,5,67,100,10,12,1,2,41,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,850,7066,1250,912,1800,526,160,7053,600,689,100,0,0,0,0,4319,1
+1320,OWL_DUKE,Owl Duke,Owl Duke,75,26623,0,7217,3474,1,715,910,27,49,15,45,40,75,79,88,10,12,2,6,60,1205,195,1345,824,440,0,0,0,0,0,0,0,0,7071,4413,7063,1500,693,100,747,1,1451,3,1513,2,5045,1,0,0,0,0,4237,1
+1321,DRAGON_TAIL,Dragon Tail,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,10,68,15,5,67,67,10,12,1,4,44,1173,175,862,534,312,0,0,0,0,0,0,0,0,7064,4413,1096,400,943,800,2207,8,2226,2,601,300,602,150,0,0,0,0,4178,1
+1322,SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,3982,1766,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7054,3500,7053,2500,949,2500,511,4500,508,800,510,200,509,800,0,0,0,0,4227,1
+1323,SEE_OTTER,Sea Otter,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,5,36,40,25,82,65,10,12,1,2,61,149,190,1132,583,532,0,0,0,0,0,0,0,0,722,150,965,5500,7065,4365,725,50,726,50,746,650,7053,1200,0,0,0,0,4326,1
+1324,TREASURE_BOX1,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1325,TREASURE_BOX2,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7073,80,658,500,604,10000,984,4850,985,7275,1239,1500,5027,75,1165,8,0,0,0,0
+1326,TREASURE_BOX3,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1327,TREASURE_BOX4,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7074,80,658,500,604,10000,984,4850,985,7275,2108,1000,1306,75,5022,2,0,0,0,0
+1328,TREASURE_BOX5,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1329,TREASURE_BOX6,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7075,80,658,500,604,10000,984,4850,985,7275,2102,834,5019,100,5002,9,0,0,0,0
+1330,TREASURE_BOX7,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1331,TREASURE_BOX8,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7076,80,658,500,604,10000,984,4850,985,7275,2616,500,2334,125,2622,9,0,0,0,0
+1332,TREASURE_BOX9,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1333,TREASURE_BOX10,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7077,80,658,500,604,10000,984,4850,985,7275,2104,500,2331,150,2623,10,0,0,0,0
+1334,TREASURE_BOX11,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1335,TREASURE_BOX12,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7078,80,658,500,604,10000,984,4850,985,7275,2270,500,1716,150,2256,10,0,0,0,0
+1336,TREASURE_BOX13,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1337,TREASURE_BOX14,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7079,80,658,500,604,10000,984,4850,985,7275,1238,375,1531,150,2318,10,0,0,0,0
+1338,TREASURE_BOX15,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1339,TREASURE_BOX16,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7080,80,658,500,604,10000,984,4850,985,7275,2626,300,1472,167,2327,10,0,0,0,0
+1340,TREASURE_BOX17,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1341,TREASURE_BOX18,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7081,80,658,500,604,10000,984,4850,985,7275,1143,250,1237,188,2235,12,0,0,0,0
+1342,TREASURE_BOX19,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1343,TREASURE_BOX20,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7082,80,658,500,604,10000,984,4850,985,7275,617,250,1144,188,5007,19,0,0,0,0
+1344,TREASURE_BOX21,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1345,TREASURE_BOX22,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7083,80,658,500,604,10000,984,4850,985,7275,2508,1000,2336,69,2621,20,0,0,0,0
+1346,TREASURE_BOX23,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1347,TREASURE_BOX24,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7084,80,658,500,604,10000,984,4850,985,7275,2106,1000,1164,50,5025,24,0,0,0,0
+1348,TREASURE_BOX25,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1349,TREASURE_BOX26,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7085,80,658,500,604,10000,984,4850,985,7275,2231,750,2624,46,2286,25,0,0,0,0
+1350,TREASURE_BOX27,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1351,TREASURE_BOX28,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7086,80,658,500,604,10000,984,4850,985,7275,2283,500,2615,41,2234,32,0,0,0,0
+1352,TREASURE_BOX29,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1353,TREASURE_BOX30,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7087,80,658,500,604,10000,984,4850,985,7275,2507,500,2625,38,5045,34,0,0,0,0
+1354,TREASURE_BOX31,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1355,TREASURE_BOX32,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7088,80,658,500,604,10000,984,4850,985,7275,2407,429,2269,250,2317,35,0,0,0,0
+1356,TREASURE_BOX33,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1357,TREASURE_BOX34,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7089,80,658,500,604,10000,984,4850,985,7275,2109,300,2406,273,2258,38,0,0,0,0
+1358,TREASURE_BOX35,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1359,TREASURE_BOX36,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7090,80,658,500,604,10000,984,4850,985,7275,1142,215,2255,60,5017,38,0,0,0,0
+1360,TREASURE_BOX37,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1361,TREASURE_BOX38,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7091,80,658,500,604,10000,984,4850,985,7275,1417,50,5053,50,2229,50,0,0,0,0
+1362,TREASURE_BOX39,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1363,TREASURE_BOX40,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7092,80,658,500,604,10000,984,4850,985,7275,2506,43,2254,43,1529,38,0,0,0,0
+1364,G_ASSULTER,Assaulter,Assaulter,59,12853,0,0,0,2,152,177,35,36,85,55,10,35,145,100,10,12,1,6,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,1019,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1365,APOCALIPS,Apocalypse,Apocalypse,66,22880,0,6540,4935,2,1030,1370,62,49,1,48,120,48,66,85,10,12,2,0,60,149,400,1840,1440,384,0,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,13161,1,2506,20,999,2500,0,0,0,0,4242,1
+1366,LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,6470,3879,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,2190,2040,336,0,0,0,0,0,0,0,0,7096,4559,7097,3686,2317,1,2316,2,509,2500,0,0,0,0,0,0,0,0,4184,1
+1367,BLAZZER,Blazer,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,1,6,43,149,180,1732,1332,540,0,0,0,0,0,0,0,0,7097,4850,7098,3400,509,3000,0,0,0,0,0,0,0,0,0,0,0,0,4215,1
+1368,GEOGRAPHER,Geographer,Geographer,56,8071,0,2715,2000,3,467,621,28,26,1,66,47,60,68,44,10,12,1,3,62,132,2000,1308,1008,480,0,0,0,0,0,0,0,0,1032,6200,1033,5500,2253,30,2207,50,12002,100,0,0,0,0,0,0,0,0,4280,1
+1369,GRAND_PECO,Grand Peco,Grand Peco,58,8054,0,2387,1361,2,444,565,37,30,1,66,66,50,71,51,10,12,2,2,43,137,165,1460,960,432,0,0,0,0,0,0,0,0,7101,4850,522,300,992,1000,969,1,0,0,0,0,582,500,0,0,0,0,4161,1
+1370,SUCCUBUS,Succubus,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,103,89,87,10,12,1,6,67,1173,155,1306,1056,288,0,0,0,0,0,0,0,0,522,1500,2407,3,2611,500,2613,150,5066,1,1472,1,505,1000,0,0,0,0,4218,1
+1371,FAKE_ANGEL,Fake Angel,False Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,2181,160,920,720,336,0,0,0,0,0,0,0,0,0,0,0,0,717,1000,715,1000,716,1000,12020,1000,0,0,0,0,0,0,4316,1
+1372,GOAT,Goat,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,1,2,63,137,165,1380,1080,336,0,0,0,0,0,0,0,0,7106,4559,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,0,0,0,0,4150,1
+1373,LORD_OF_DEATH,Lord of Death,Lord of the Dead,94,303383,0,131343,43345,3,2430,3232,77,73,1,99,120,109,100,106,10,12,2,6,67,1205,180,1446,1296,360,65671,10000,607,5500,732,5000,617,5000,7108,5335,1417,5,1230,10,2621,2,7109,10,1306,1,1529,2,0,0,0,0,4276,1
+1374,INCUBUS,Incubus,Incubus,75,17281,0,5254,4212,2,1408,1873,58,46,1,97,95,103,89,87,10,12,1,6,67,1173,165,850,600,336,0,0,0,0,0,0,0,0,522,1500,509,5500,5072,1,2621,1,2610,500,2613,150,509,2200,0,0,0,0,4269,1
+1375,THE_PAPER,The Paper,The Paper,56,18557,0,2849,1998,1,845,1124,25,24,1,66,52,76,71,79,10,12,1,0,60,2181,170,1160,960,336,0,0,0,0,0,0,0,0,7111,4947,7112,3200,508,1800,511,2000,13009,5,0,0,0,0,0,0,0,0,4172,1
+1376,HARPY,Harpy,Harpy,70,16599,0,3562,2133,1,926,1231,42,44,1,112,72,67,74,76,10,12,1,6,64,2181,155,972,672,470,0,0,0,0,0,0,0,0,7115,4850,7116,2500,508,1500,508,800,709,20,0,0,0,0,0,0,0,0,4325,1
+1377,ELDER,Elder,Elder,64,21592,0,5650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1552,1152,336,0,0,0,0,0,0,0,0,7099,4000,7117,1500,7118,1500,691,100,1473,1,616,1,7027,3000,0,0,0,0,4251,1
+1378,DEMON_PUNGUS,Demon Pungus,Demon Pungus,56,7259,0,3148,1817,1,360,479,48,31,1,83,55,59,63,34,10,12,0,6,65,2181,170,1260,960,672,0,0,0,0,0,0,0,0,7119,4074,7001,4559,715,3880,1061,5000,0,0,0,0,0,0,0,0,0,0,4173,1
+1379,NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,6683,4359,1,757,1007,37,37,1,76,55,60,76,54,10,12,2,6,67,2181,165,1216,816,432,0,0,0,0,0,0,0,0,7120,4947,2626,1,2608,30,505,50,510,150,695,100,1261,1,0,0,0,0,4166,1
+1380,DRILLER,Driller,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,2181,165,1300,900,336,0,0,0,0,0,0,0,0,1012,7500,715,3880,716,3500,0,0,0,0,0,0,0,0,0,0,0,0,4180,1
+1381,GRIZZLY,Grizzly,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,55,68,58,70,61,10,12,2,2,63,2181,165,1492,1092,192,0,0,0,0,0,0,0,0,948,5000,919,5000,549,2500,0,0,0,0,0,0,0,0,0,0,0,0,4162,1
+1382,DIABOLIC,Diabolic,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,2181,150,1080,780,180,0,0,0,0,0,0,0,0,1038,5820,1039,4850,2605,3,984,20,1263,10,0,0,0,0,0,0,0,0,4182,1
+1383,EXPLOSION,Explosion,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1260,960,336,0,0,0,0,0,0,0,0,7006,5500,7097,2200,7122,3200,756,800,522,400,0,0,0,0,0,0,0,0,4267,1
+1384,DELETER,Deleter,Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,104,40,65,72,54,10,12,1,9,43,141,175,1020,720,384,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4158,1
+1385,DELETER_,Deleter,Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,66,40,65,72,68,10,12,1,9,43,141,175,1024,624,336,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4279,1
+1386,SLEEPER,Sleeper,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,2181,195,1350,1200,432,0,0,0,0,0,0,0,0,7124,4947,1056,5335,997,2500,756,300,1226,5,1622,5,7043,1200,0,0,0,0,4228,1
+1387,GIG,Gig,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,43,2181,170,1264,864,576,0,0,0,0,0,0,0,0,7125,4365,904,5500,716,150,525,2500,994,850,0,0,0,0,0,0,0,0,4165,1
+1388,ARCHANGELING,Archangeling,Arc Angeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,1205,180,1072,672,480,0,0,0,0,0,0,0,0,2255,5,610,1800,608,150,7291,1500,2254,5,2317,3,7294,1500,0,0,0,0,4241,1
+1389,DRACULA,Dracula,Dracula,85,320096,0,120157,38870,3,1625,1890,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1290,1140,576,60078,10000,607,5500,732,5000,522,5000,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,0,0,0,0,0,0,4134,1
+1390,VIOLY,Violy,Violy,75,18257,0,6353,3529,10,738,982,37,36,1,93,54,58,101,83,10,12,1,7,40,133,170,1356,1056,540,0,0,0,0,0,0,0,0,1060,6305,12127,50,740,1200,2610,800,526,1400,12020,1000,1902,500,0,0,0,0,4209,1
+1391,GALAPAGO,Galapago,Galapago,61,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,0,2,22,139,165,1430,1080,1080,0,0,0,0,0,0,0,0,7053,5335,610,100,508,3500,606,100,605,100,5111,1,582,1000,0,0,0,0,4152,1
+1392,ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,351,215,10,109,137,4,34,1,62,45,26,55,5,10,12,2,0,44,133,155,2416,2016,432,0,0,0,0,0,0,0,0,7126,500,2312,1,7053,1000,999,450,984,1,912,2500,910,5500,0,0,0,0,4192,1
+1393,G_MUMMY,Mummy,Mummy,37,5176,0,0,0,1,305,360,0,10,28,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1394,G_ZOMBIE,Zombie,Zombie,15,534,0,0,0,1,67,79,0,10,1,8,7,0,15,0,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1395,CRYSTAL_1,Wind Crystal,Wind Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,5097,7000,532,6500,558,5000,607,200,0,0,0,0
+1396,CRYSTAL_2,Earth Crystal,Earth Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,5097,7000,531,6500,558,5000,608,250,0,0,0,0
+1397,CRYSTAL_3,Fire Crystal,Fire Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,5097,7000,534,6500,558,5000,604,300,0,0,0,0
+1398,CRYSTAL_4,Water Crystal,Water Crystal,1,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,193,190,0,0,0,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,5097,7000,533,6500,558,5000,603,100,0,0,0,0
+1399,EVENT_BAPHO,Baphomet,Baphomet,68,1264000,0,87250,27895,3,1847,2267,35,45,1,152,96,85,120,95,10,12,2,6,67,1205,130,768,768,576,43625,10000,607,5500,526,5000,732,5000,1417,550,1306,680,1145,480,2110,640,2327,1500,2111,500,2621,1720,2256,1550,0,0,0,0
+1400,KARAKASA,Karakasa,Karakasa,30,3092,0,489,322,1,141,183,1,5,1,45,12,20,49,60,10,12,1,0,60,129,155,1638,2016,576,0,0,0,0,0,0,0,0,7151,5000,7150,4268,1019,3200,7111,2200,912,4074,746,30,13012,5,0,0,0,0,4286,1
+1401,SHINOBI,Shinobi,Shinobi,69,12700,0,4970,3010,2,460,1410,34,21,85,85,25,25,100,100,10,12,1,7,67,1173,150,1003,1152,336,0,0,0,0,0,0,0,0,7156,5335,2337,2,7053,2200,2654,100,2336,1,7157,2000,13013,5,0,0,0,0,4230,1
+1402,POISON_TOAD,Poison Toad,Poison Toad,46,6629,0,1929,1457,3,288,408,5,10,20,34,19,14,66,55,10,12,1,2,45,129,160,1148,1728,864,0,0,0,0,0,0,0,0,7155,5500,7154,2400,2610,4,511,540,724,2,526,2,1246,10,0,0,0,0,4175,1
+1403,ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,1293,1003,10,289,336,10,10,15,35,29,15,120,42,10,12,1,1,49,133,170,1084,2304,576,0,0,0,0,0,0,0,0,998,5500,2285,1,7126,1400,508,40,549,350,525,250,13152,5,0,0,0,0,4160,1
+1404,MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,795,453,1,250,305,1,20,1,52,15,10,62,15,10,12,1,6,27,145,250,1938,2112,768,0,0,0,0,0,0,0,0,7152,5335,7153,2500,509,1550,1000,1250,12127,10,13014,5,1904,2,0,0,0,0,4208,1
+1405,TENGU,Tengu,Tengu,65,16940,0,4207,2843,2,660,980,12,82,90,42,69,45,78,80,10,12,2,6,42,2181,200,1439,1920,672,0,0,0,0,0,0,0,0,7159,3500,7158,5500,13301,5,522,150,13302,5,12128,20,687,100,0,0,0,0,4282,1
+1406,KAPHA,Kapha,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,51,49,22,73,45,10,12,1,5,21,2181,165,2012,1728,672,0,0,0,0,0,0,0,0,7149,6500,7053,3500,520,1500,521,2300,708,2,1915,10,13008,5,0,0,0,0,4287,1
+1408,BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,55,8082,0,2119,1562,3,121,342,5,23,1,59,14,55,68,15,10,12,1,4,44,141,145,472,576,288,0,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1
+1409,RICE_CAKE_BOY,Rice Cake Boy,Dumpling Child,27,2098,0,231,149,1,112,134,5,12,1,22,29,5,41,10,10,12,0,7,20,145,160,647,768,420,0,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1
+1410,LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,53,8905,0,2591,1799,7,301,351,10,38,72,45,35,39,80,5,10,12,1,3,42,132,410,400,672,480,0,0,0,0,0,0,0,0,7164,4365,0,0,526,1000,604,400,532,100,603,5,0,0,0,0,0,0,4217,1
+//1411,PEACH_TREE_BULLET,Peach Tree Bullet,Peach Tree Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1412,EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,56,10392,0,3304,2198,10,311,333,25,59,1,20,18,50,136,11,10,12,2,0,40,133,190,480,840,432,0,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1
+1413,WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,1038,692,1,220,280,10,20,13,42,36,55,66,30,10,12,0,3,43,145,140,512,756,360,0,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,516,4800,1951,1,578,1000,0,0,0,0,4232,1
+//1414,GINSENG_BULLET,Ginseng Bullet,Ginseng Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1415,BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,352,201,2,155,207,0,5,20,44,20,4,49,10,10,12,0,2,28,2181,150,318,528,420,0,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1
+1416,WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,16029,0,3945,2599,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,1173,200,637,1008,360,0,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1
+1417,ZIPPER_BEAR,Zipper Bear,Zipper Bear,35,2901,0,370,225,1,248,289,10,5,30,25,55,15,28,25,10,12,1,2,27,145,155,780,1008,420,0,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1
+1418,DARK_SNAKE_LORD,Evil Snake Lord,Evil Snake Lord,73,254993,0,34288,17950,3,1433,2210,25,55,70,83,62,80,164,88,10,12,2,2,68,1205,200,588,816,420,17144,10000,607,5500,608,3500,985,5500,7169,5820,10020,5100,1471,80,5012,80,1474,500,7226,900,661,2000,0,0,0,0,4330,1
+1419,G_FARMILIAR,Familiar,Familiar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,0,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1420,G_ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,2181,300,2864,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1421,G_ISIS,Isis,Isis,43,4828,0,0,0,1,423,507,10,35,38,65,43,30,72,15,10,12,2,6,27,2181,200,1384,768,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1422,G_HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,0,0,1,246,333,25,15,33,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1423,G_GHOUL,Ghoul,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1424,G_SIDE_WINDER,Side Winder,Side Winder,43,4929,0,0,0,1,240,320,5,10,38,43,40,15,115,20,10,12,1,2,25,2693,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1425,G_OBEAUNE,Obeaune,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,2181,200,1872,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1426,G_MARC,Marc,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1427,G_NIGHTMARE,Nightmare,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1428,G_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,0,0,1,89,101,0,0,1,19,25,0,24,0,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1429,G_ARGIOPE,Argiope,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,2181,300,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1430,G_ARGOS,Argos,Argos,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,2181,300,1468,468,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1431,G_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1432,G_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,0,0,1,169,208,0,10,56,27,45,15,56,10,10,12,1,2,23,2181,200,1120,420,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1433,G_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1434,G_DRAINLIAR,Drainliar,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,0,78,0,10,12,0,2,47,2181,250,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1435,G_EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,0,0,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,2693,300,2276,576,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1436,G_JAKK,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1437,G_JOKER,Joker,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,2181,100,1364,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1438,G_KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,58,65,48,5,73,40,10,12,2,1,29,2693,350,528,1000,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1439,G_HIGH_ORC,High Orc,High Orc,52,6890,0,0,0,1,428,533,15,5,55,46,55,35,82,40,10,12,2,7,43,2181,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1440,G_STEM_WORM,Stem Worm,Stem Worm,40,6136,0,0,0,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,2181,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1441,G_PENOMENA,Penomena,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,2181,400,832,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1442,G_SASQUATCH,Sasquatch,Sasquatch,30,3163,0,0,0,1,250,280,5,0,75,25,60,10,34,20,10,12,2,2,60,2181,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1443,G_CRUISER,Cruiser,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,2181,400,1296,1296,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1444,G_CHEPET,Chepet,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,2181,400,672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1445,G_RAGGLER,Raggler,Raggler,21,1020,0,0,0,1,102,113,0,5,18,10,32,20,39,35,10,12,0,2,24,2181,200,1000,900,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1446,G_INJUSTICE,Injustice,Injustice,51,7600,0,0,0,1,480,600,0,0,84,42,39,0,71,35,10,12,1,1,47,2693,400,770,720,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1447,G_GRYPHON,Gryphon,Gryphon,72,27800,0,0,0,1,880,1260,35,35,68,95,78,65,115,75,10,12,2,2,84,2213,100,704,504,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1448,G_DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,0,0,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,2693,200,920,720,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1449,G_MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,0,0,4,2400,3400,15,20,75,47,30,68,45,35,10,12,2,9,43,2213,250,1280,1080,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1450,G_WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,0,0,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1451,G_MERMAN,Merman,Merman,53,12300,0,0,0,2,482,603,10,35,72,45,46,15,85,55,10,12,1,7,41,2181,220,916,816,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1452,G_ORC_LADY,Orc Lady,Orc Lady,31,2000,0,0,0,1,135,170,10,10,35,42,25,15,69,55,10,12,1,7,42,2181,200,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1453,G_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,0,0,9,415,500,35,5,15,25,22,5,145,35,10,12,1,6,47,2693,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1454,G_TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,0,0,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,2181,200,860,660,624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1455,G_KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,0,0,9,155,185,10,5,10,20,15,30,100,25,10,12,0,7,23,2181,200,1008,1008,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1456,G_CHIMERA,Chimera,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,2725,200,772,672,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1457,G_MANTIS,Mantis,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,2181,200,1528,660,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1458,G_MARDUK,Marduk,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,2181,300,1540,840,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1459,G_MARIONETTE,Marionette,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,2181,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1460,G_MATYR,Matyr,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,2181,150,432,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1461,G_MINOROUS,Minorous,Minorous,52,7431,0,0,0,1,590,770,15,5,65,42,61,66,52,25,10,12,2,2,43,2181,200,1360,960,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1462,G_ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,0,0,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1463,G_ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,0,0,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2693,400,2852,1152,840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1464,G_PASANA,Pasana,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,2181,165,976,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1465,G_PETIT,Petite,Petite,44,6881,0,0,0,1,360,427,30,30,1,44,62,55,79,60,10,12,1,9,22,2181,200,1624,620,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1466,G_PETIT_,Petite,Petite,45,5747,0,0,0,1,300,355,20,45,1,113,45,55,73,80,10,12,1,9,24,2181,150,1420,1080,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1467,G_RAYDRIC,Raydric,Raydric,52,8613,0,0,0,1,830,930,40,15,58,47,42,5,69,26,10,12,2,7,47,2693,150,824,780,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1468,G_REQUIEM,Requim,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1469,G_SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1470,G_ZEROM,Zerom,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,0,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1471,G_NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,2181,150,840,540,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1472,G_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,2181,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1473,G_ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,0,0,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,2181,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1474,G_MIMIC,Mimic,Mimic,51,6120,0,0,0,1,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,2181,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1475,G_WRAITH,Wraith,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,65,95,35,10,12,2,1,89,2181,300,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1476,G_ALARM,Alarm,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,2181,300,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1477,G_ARCLOUSE,Arclouse,Arclouze,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,2181,100,960,500,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1478,G_RIDEWORD,Rideword,Rideword,59,11638,0,0,0,1,584,804,5,35,48,75,10,20,120,45,10,12,0,0,60,2693,150,864,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1479,G_SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,55,20,36,0,76,25,10,12,1,1,69,2181,350,1848,500,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1480,G_ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,2693,350,1768,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1481,G_PUNK,Punk,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,2181,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1482,G_ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,0,0,1,700,850,10,15,70,85,40,30,125,60,10,12,1,7,60,2181,200,800,792,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1483,G_RYBIO,Rybio,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,2693,200,1790,1440,540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1484,G_PHENDARK,Phendark,Phendark,73,22729,0,0,0,2,794,1056,52,36,1,62,120,65,76,66,10,12,2,7,40,2693,175,1744,1344,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1485,G_MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,77,139,80,35,159,65,10,12,2,0,87,2725,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1486,G_TIRFING,Tirfing,Ogretooth,71,29900,0,0,0,1,950,1146,30,35,58,87,55,35,132,65,10,12,1,0,67,2213,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1487,G_EXECUTIONER,Executioner,Executioner,65,28980,0,0,0,2,570,950,35,35,64,85,40,25,88,60,10,12,2,0,47,2725,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1488,G_ANOLIAN,Anolian,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,2181,190,900,500,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1489,G_STING,Sting,Sting,61,9500,0,0,0,1,850,1032,5,30,57,45,55,5,120,85,10,12,1,0,62,2181,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1490,G_WANDER_MAN,Wander Man,Wanderer,74,8170,0,0,0,2,450,1170,5,5,1,192,38,45,127,85,10,12,1,6,24,2693,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1491,G_DOKEBI,Dokebi,Dokebi,33,2697,0,0,0,1,197,249,0,10,50,50,40,35,69,40,10,12,0,6,27,2181,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+//Umbala
+1492,INCANTATION_SAMURAI,Incantation Samurai,Samurai Specter,71,218652,0,33095,18214,3,1219,2169,10,51,91,85,78,85,150,60,10,12,2,7,67,1205,135,874,1344,576,16547,10000,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,13303,7500,1235,80,0,0,0,0,4263,1
+1493,DRYAD,Dryad,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,82,2181,170,950,2520,576,0,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,1951,80,1964,1,2270,10,7100,3000,0,0,0,0,4177,1
+1494,KIND_OF_BEETLE,Beetle King,Beetle King,34,1874,0,679,442,1,191,243,45,12,1,34,10,0,40,0,10,12,0,4,22,137,165,1247,768,576,0,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1
+1495,STONE_SHOOTER,Stone Shooter,Stone Shooter,42,4104,0,1238,752,10,309,350,12,45,1,40,20,79,92,20,10,12,1,3,63,2181,175,2413,1248,768,0,0,0,0,0,0,0,0,7203,5000,7201,5000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1
+//1496,STONE_SHOOTER_BULLET,Stone Shooter Bullet,Stone Shooter Bullet,(mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1497,WOODEN_GOLEM,Wooden Golem,Wooden Golem,51,9200,0,1926,1353,1,570,657,32,36,1,41,69,5,85,155,10,12,2,3,82,2181,165,1543,1632,480,0,0,0,0,0,0,0,0,7189,4000,7188,4000,757,110,2270,10,604,100,7201,5000,921,1000,0,0,0,0,4259,1
+1498,WOOTAN_SHOOTER,Wootan Shooter,Wootan Shooter,39,3977,0,886,453,10,84,105,10,28,15,35,29,15,100,42,10,12,1,7,42,2181,200,857,1056,576,0,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,512,100,7182,100,5116,10,0,0,0,0,4260,1
+1499,WOOTAN_FIGHTER,Wootan Fighter,Wootan Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,45,30,10,12,1,7,43,2181,200,912,1344,480,0,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,513,1000,7198,1000,5116,5,0,0,0,0,4261,1
+1500,PARASITE,Parasite,Parasite,49,5188,0,1098,1453,8,215,430,10,19,1,40,30,30,90,50,10,12,1,3,44,132,400,864,864,672,0,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,711,500,0,0,0,0,4309,1
+//1501,PARASITE_BULLET,Parasite Bullet,Parasite Bullet... (mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1502,PORING_V,Pori Pori,Bring it on!,99,95000000,0,87250,27895,1,10000,30000,0,10,100,100,65,100,255,255,10,12,1,3,25,2485,160,1672,672,480,43625,10000,10020,1000,4005,100,2286,200,5035,10000,2344,2500,2346,2500,2350,2500,2348,2500,2655,4000,7126,10000,2110,4500,0,0,0,0
+
+//Niflheim
+1503,GIBBET,Gibbet,Gibbet,58,6841,0,4011,1824,1,418,656,28,31,0,42,42,27,46,28,10,12,2,6,27,2693,180,917,1584,576,0,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,0,0,0,0,0,0,4278,1
+1504,DULLAHAN,Dullahan,Dullahan,62,12437,0,4517,2963,2,647,1065,47,38,0,30,5,45,62,22,10,12,1,1,49,2181,155,847,1152,480,0,0,0,0,0,0,0,0,7209,3200,7210,4850,0,0,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1
+1505,LOLI_RURI,Loli Ruri,Loli Ruri,71,23470,0,6641,4314,2,1476,2317,39,44,0,66,54,74,81,43,10,12,2,6,87,2181,125,747,1632,576,0,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,0,0,0,0,0,0,0,0,4191,1
+1506,DISGUISE,Disguise,Disguise,55,7543,0,2815,1919,2,279,546,18,29,0,72,45,35,48,65,10,12,1,6,82,2181,147,516,768,384,0,0,0,0,0,0,0,0,7216,4850,7221,3686,2502,50,518,100,2508,50,2504,2,0,0,0,0,0,0,4181,1
+1507,BLOODY_MURDERER,Bloody Murderer,Bloody Murderer,72,27521,0,9742,3559,2,864,1081,37,41,0,30,90,15,52,12,10,12,2,7,67,2181,175,914,1344,384,0,0,0,0,0,0,0,0,7207,4171,7223,1000,7208,2000,2288,50,984,100,1229,3,13002,1,0,0,0,0,4214,1
+1508,QUVE,Quve,Quve,40,4559,0,414,306,1,299,469,12,12,0,61,24,19,37,24,10,12,0,1,29,2181,150,912,1248,576,0,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,0,0,0,0,0,0,0,0,4294,1
+1509,LUDE,Lude,Lude,36,3214,0,392,247,2,287,451,14,10,0,59,21,18,36,21,10,12,0,1,29,2181,150,890,960,480,0,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,0,0,0,0,0,0,4193,1
+1510,HYLOZOIST,Hylozoist,Heirozoist,51,7186,0,2314,1297,1,317,498,16,51,0,28,26,47,66,14,10,12,0,6,47,2181,155,741,1536,480,0,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1
+
+1511,AMON_RA,Amon Ra,Amon Ra,88,1214138,0,87264,35891,3,1647,2576,26,52,0,1,90,124,74,45,14,12,2,7,62,164,170,854,2016,480,43632,10000,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1
+
+//Louyang
+1512,HYEGUN,Hyegun,Yao Jun,56,9981,0,2199,1022,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,2181,180,890,1320,720,0,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,0,0,0,0,0,0,0,0,4328,1
+1513,CIVIL_SERVANT,Civil Servant,Mao Guai,62,14390,0,4023,2750,2,650,1010,42,5,58,15,20,60,80,50,10,12,1,2,44,2181,200,1257,528,432,0,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1
+1514,DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,2,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,160,600,840,504,0,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1
+1515,GARM_BABY,Garm Baby,Garm Baby,61,20199,0,1022,2980,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,2181,450,879,672,576,0,0,0,0,0,0,0,0,7270,1500,7269,2500,7066,4365,749,100,12000,100,0,0,0,0,0,0,0,0,4323,1
+1516,INCREASE_SOIL,Increase Soil,Mi Gao,51,8230,0,2760,2110,1,560,700,30,12,40,45,23,12,69,12,10,12,1,0,62,145,445,106,1056,576,0,0,0,0,0,0,0,0,7264,4365,7004,2300,997,10,969,2,0,0,0,0,0,0,0,0,0,0,4231,1
+1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,Jing Guai,48,5920,0,1643,1643,1,434,633,23,16,46,51,19,8,57,30,10,12,1,6,62,2181,165,1120,576,420,0,0,0,0,0,0,0,0,7267,4500,7268,400,1501,10,1523,1,0,0,0,0,0,0,0,0,0,0,4265,1
+1518,BACSOJIN,Bacsojin,White Lady,72,56380,0,5590,1659,2,560,1446,10,15,38,65,34,80,102,35,10,12,2,7,41,2213,160,576,960,480,0,0,0,0,0,0,0,0,1020,5500,603,2,617,2,7165,3000,7166,1000,747,500,0,0,2234,1,0,0,0,0
+1519,CHUNG_E,Chung E,Green Maiden,49,23900,0,2396,993,1,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,40,2181,170,1728,816,1188,0,0,0,0,0,0,0,0,7053,4850,740,100,1806,10,518,500,0,0,0,0,0,0,5042,2,0,0,0,0
+1520,BOILED_RICE,Boiled Rice,Boiled Rice,15,400,0,84,45,1,49,82,0,10,1,14,14,0,19,15,10,12,1,3,21,129,170,1152,672,672,0,0,0,0,0,0,0,0,564,5500,7272,3000,7194,1000,7198,1000,0,0,0,0,0,0,0,0,0,0,0,0
+1521,G_ALICE,Alice,Alice,62,10000,0,0,0,1,550,700,5,5,64,64,42,85,100,130,10,12,1,7,60,145,200,520,2304,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1522,G_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,0,0,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1523,G_ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,0,0,10,289,336,10,10,15,35,29,15,120,42,10,12,1,1,49,133,170,1084,2304,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1524,G_BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,0,0,2,155,207,0,5,20,44,20,4,49,10,10,12,0,2,28,2181,150,318,528,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1525,G_BATHORY,Bathory,Bathory,44,5415,0,0,0,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1526,G_BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,55,8082,0,0,0,3,121,342,5,23,1,59,14,55,68,15,10,12,1,4,44,141,145,472,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1527,G_C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,0,0,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1528,G_CLOCK,Clock,Clock,60,11050,0,0,0,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1529,G_DARK_SNAKE_LORD,Dark Snake Lord,Evil Snake Lord,73,254993,0,0,0,3,1433,2210,25,55,70,83,62,80,164,88,10,12,2,2,68,1205,200,588,816,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1530,G_DRACULA,Dracula,Dracula,85,320096,0,0,0,3,1625,1890,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1290,1140,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1531,G_EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,56,10392,0,0,0,10,311,333,25,59,1,20,18,50,136,11,10,12,2,0,40,133,190,480,840,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1532,G_EXPLOSION,Explosion,Explosion,46,8054,0,0,0,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1260,960,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1533,G_FUR_SEAL,Fur Seal,Seal,63,9114,0,0,0,1,845,1203,25,33,5,28,22,15,69,84,10,12,1,2,21,149,200,1612,622,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1534,G_GOBLIN_1,Goblin,Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1535,G_GOBLIN_2,Goblin,Goblin,24,1034,0,0,0,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1536,G_GOBLIN_3,Goblin,Goblin,24,1034,0,0,0,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1537,G_GOBLIN_4,Goblin,Goblin,23,1359,0,0,0,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1538,G_GOBLIN_5,Goblin,Goblin,22,1952,0,0,0,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1539,G_GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,20152,0,0,0,1,663,752,48,16,5,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1540,G_GOLEM,Golem,Golem,25,3900,0,0,0,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1541,G_GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,0,0,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1542,G_INCANTATION_SAMURA,Incantation Samurai,Incantation Samurai,71,218652,0,0,0,3,1219,2169,10,51,91,85,78,85,150,60,10,12,2,7,67,1205,135,874,1344,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1543,G_KAPHA,Kapha,Kapha,41,7892,0,0,0,3,399,719,20,38,1,51,49,22,73,45,10,12,1,5,21,2181,165,2012,1728,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1544,G_KARAKASA,Karakasa,Karakasa,30,3092,0,0,0,1,141,183,1,5,1,45,12,20,49,60,10,12,1,0,60,129,155,1638,2016,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1545,G_KOBOLD_1,Kobold,Kobold,36,3893,0,0,0,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1546,G_KOBOLD_2,Kobold,Kobold,31,2179,0,0,0,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1547,G_KOBOLD_3,Kobold,Kobold,31,2179,0,0,0,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1548,G_KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,18313,0,0,0,1,649,958,37,37,5,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1549,G_LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,0,0,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,2190,2040,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1550,G_LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,53,8905,0,0,0,7,301,351,10,38,72,45,35,39,80,5,10,12,1,3,42,132,410,400,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1551,G_MARSE,Marse,Marse,31,5034,0,0,0,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1552,G_MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,0,0,1,250,305,1,20,1,52,15,10,62,15,10,12,1,6,27,145,250,1938,2112,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1553,G_MYST,Myst,Myst,38,3745,0,0,0,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1554,G_NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,0,0,1,757,1007,37,37,1,76,55,60,76,54,10,12,2,6,67,2181,165,1216,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1555,G_PARASITE,Parasite,Parasite,49,5188,0,0,0,8,215,430,10,19,1,40,30,30,90,50,10,12,1,3,44,132,400,864,864,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1556,G_POISON_TOAD,Poison Toad,Poisonous Toad,46,6629,0,0,0,3,288,408,5,10,20,34,19,14,66,55,10,12,1,2,45,129,160,1148,1728,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1557,G_ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,0,0,10,109,137,4,34,1,62,45,26,55,5,10,12,2,0,44,133,155,2416,2016,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1558,G_SAND_MAN,Sandman,Sandman,34,3413,0,0,0,1,180,205,10,25,24,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1559,G_SCORPION,Scorpion,Scorpion,24,1109,0,0,0,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1560,G_SHINOBI,Shinobi,Shinobi,69,12700,0,0,0,2,460,1410,34,21,85,85,25,25,100,100,10,12,1,7,67,1173,150,1003,1152,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1561,G_SMOKIE,Smokie,Smokie,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1562,G_SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,0,0,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1563,G_TENGU,Tengu,Tengu,65,16940,0,0,0,2,660,980,12,82,90,42,69,45,78,80,10,12,2,6,42,2181,200,1439,1920,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1564,G_WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,16029,0,0,0,2,399,1090,12,75,1,64,12,69,100,80,10,12,1,6,67,1173,200,637,1008,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1565,G_WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,0,0,1,220,280,10,20,13,42,36,55,66,30,10,12,0,3,43,145,140,512,756,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1566,G_WRAITH_DEAD,Wraith Dead,Wraith Dead,74,43021,0,0,0,2,1366,1626,25,30,5,99,55,75,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1567,G_ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,0,0,1,948,1115,35,30,5,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1568,G_ANGELING,Angeling,Angeling,20,55000,0,0,0,1,120,195,0,70,1,50,20,75,68,200,10,12,1,8,86,1205,200,1072,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1569,G_BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,0,0,3,2150,3030,60,50,88,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1570,G_CRAMP,Cramp,Cramp,56,4720,0,0,0,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1571,G_DEVIACE,Deviace,Deviace,47,19192,0,0,0,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1572,G_DROPS,Drops,Drops,3,55,0,0,0,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1573,G_ELDER,Elder,Elder,64,21592,0,0,0,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1552,1152,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1574,G_ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,0,0,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1575,G_FLORA,Flora,Flora,26,2092,0,0,0,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1576,G_GHOSTRING,Ghostring,Ghostring,18,73300,0,0,0,1,82,122,0,60,40,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1577,G_GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,0,0,9,89,113,0,0,10,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1578,G_HORONG,Horong,Horong,34,1939,0,0,0,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1579,G_HYDRA,Hydra,Hydra,14,660,0,0,0,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1580,G_INCUBUS,Incubus,Incubus,75,17281,0,0,0,2,1408,1873,58,46,1,97,95,103,89,87,10,12,1,6,67,1173,165,850,600,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1581,G_VOCAL,Vocal,Vocal,18,3016,0,0,0,1,71,82,10,30,77,28,26,30,53,40,10,12,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1582,DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,30,50,20,75,77,200,10,12,1,6,87,1205,200,1072,1056,384,0,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1
+1583,TAO_GUNKA,Tao Gunka,Tao Gunka,70,193000,0,59175,10445,2,1450,1770,20,20,1,85,78,35,140,60,10,12,2,6,60,173,150,1020,288,144,29587,10000,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,1002,1000,2231,5,0,0,0,0,4302,1
+
+//Ayothaya
+1584,TAMRUAN,Tamruan,Tamruan,52,10234,0,3812,55,1,489,534,15,35,80,62,38,75,72,15,10,12,2,6,67,141,140,512,1152,672,0,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,0,0,0,0,0,0,0,0,4304,1
+1585,MIME_MONKEY,Mime Monkey,Mime Monkey,40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0
+1586,LEAF_CAT,Leaf Cat,Leaf Cat,38,2396,0,165,1212,1,266,307,5,19,25,67,12,45,60,29,10,12,0,2,22,131,150,960,864,720,0,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1
+1587,KRABEN,Kraben,Kraben,50,5880,0,206,1322,1,125,765,5,42,50,125,1,66,75,50,10,12,1,0,48,141,100,1152,1536,576,0,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,7286,1000,603,10,0,0,0,0,4295,1
+
+//Some more G_Mobs and Xmas_Orc
+1588,ORC_XMAS,Christmas Orc,Christmas Orc,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,7175,1600,1352,10,644,15,7174,1600,0,0,0,0,4066,1
+1589,G_MANDRAGORA,Mandragora,Mandragora,12,405,0,0,0,4,26,35,0,25,1,12,24,0,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1590,G_GEOGRAPHER,Geographer,Geographer,56,8071,0,0,0,3,467,621,28,26,1,66,47,60,68,44,10,12,1,3,62,132,2000,1308,1008,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1591,A_LUNATIC,Lunatic,Lunatic,29,2334,0,0,0,1,221,245,10,20,1,15,22,5,40,15,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1592,A_MOBSTER,Gangster,Gangster,40,8000,0,0,0,1,300,355,20,27,1,50,45,45,73,30,10,12,1,7,20,1685,250,1100,560,580,0,0,0,0,0,0,0,0,7049,10000,601,2000,1206,3000,713,1000,550,10000,7049,0,7049,0,7049,0,0,0,0,0
+1593,A_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,52,8613,0,0,0,1,830,930,40,27,58,47,42,5,69,26,10,12,1,1,69,149,175,1772,120,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1594,G_FREEZER,Freezer,Freezer,72,8636,0,0,0,2,671,983,55,43,69,41,59,5,67,100,10,12,1,2,41,181,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1595,G_MARIN,Marin,Marin,15,742,0,0,0,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1596,G_TAMRUAN,Tamruan,Tamruan,52,10234,0,0,0,1,489,534,15,35,80,62,38,75,72,15,10,12,2,6,67,181,140,512,1152,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1597,G_GARGOYLE,Gargoyle,Gargoyle,48,3950,0,0,0,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1598,G_BLAZZER,Blazzer,Blazzer,43,8252,0,0,0,2,533,709,50,40,1,52,50,39,69,40,10,12,1,6,43,133,180,1732,1332,540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1599,G_WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,0,0,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,48,181,250,2536,1536,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1600,G_HEATER,Heater,Heater,68,11020,0,0,0,2,683,1008,40,42,69,47,25,5,71,100,10,12,1,2,43,181,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1601,G_PERMETER,Permeter,Permeter,63,8228,0,0,0,2,943,1211,46,45,69,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1602,G_SOLIDER,Solider,Solider,70,12099,0,0,0,2,797,979,57,43,69,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1603,G_BIGFOOT,Bigfoot,Bigfoot,25,1619,0,0,0,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1604,G_GIANT_HONET,Giant Hornet,Giant Hornet,56,13105,0,0,0,1,650,852,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1605,G_DARK_ILLUSION,Dark Illusion,Dark Illusion,77,103631,0,0,0,2,1300,1983,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1606,G_GARM_BABY,Garm Baby,Garm Baby,61,20199,0,0,0,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,133,450,879,672,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1607,G_GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1608,G_THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,0,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1609,G_DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,2,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,160,600,840,504,0,0,0,0,0,0,0,0,570,500,571,50,572,20,515,10000,12018,5000,0,0,0,0,668,100,0,0,0,0
+1610,A_MUNAK,Munak,Munak,30,2872,0,0,0,1,40,50,0,0,1,15,20,5,120,15,10,12,1,1,89,133,100,2468,768,288,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+1611,A_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,89,149,200,1720,500,420,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+1612,A_HYEGUN,Hyegun,Yao Jun,56,9981,0,0,0,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,89,133,180,890,1320,720,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+
+//Einbroch
+1613,METALING,Metaling,Metaling,26,889,0,492,249,1,135,270,5,3,30,15,10,18,35,2,10,12,0,0,20,131,300,384,672,480,0,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,13103,5,7312,5000,0,0,0,0,4341,1
+1614,MINERAL,Mineral,Mineral,56,7950,0,3563,1768,1,723,812,29,35,60,52,35,21,67,32,10,12,0,0,40,145,250,648,480,360,0,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,4339,1
+1615,OBSIDIAN,Obsidian,Obsidian,50,8812,0,2799,1802,1,841,980,35,5,62,32,42,24,61,55,10,12,0,0,42,141,350,720,864,504,0,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,4338,1
+1616,PITMAN,Pitman,Pitman,43,5015,0,1799,1083,1,290,486,22,26,0,15,5,5,52,36,10,12,2,1,42,145,180,960,336,300,0,0,0,0,0,0,0,0,7318,3000,7319,500,998,800,999,500,1003,100,1041,1000,7327,80,0,0,0,0,4335,1
+1617,WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,4412,1135,1,692,1081,23,10,20,69,55,5,59,77,10,12,2,0,20,141,300,1152,528,360,0,0,0,0,0,0,0,0,7323,1000,7068,1000,998,500,625,50,1002,1000,604,50,7319,3800,0,0,0,0,4332,1
+1618,UNGOLIANT,Ungoliant,Ungoliant,69,29140,0,8211,142,1,1290,2280,25,25,33,52,57,25,119,43,10,12,2,4,45,1173,350,420,576,420,0,0,0,0,0,0,0,0,7316,4500,1014,3500,1013,1000,7289,1500,7326,2500,718,1500,2406,500,0,0,0,0,4336,1
+1619,PORCELLIO,Porcellio,Porcellio,28,1654,0,512,346,1,82,247,0,8,0,31,21,50,54,85,10,12,0,4,62,131,150,720,360,360,0,0,0,0,0,0,0,0,7312,5000,1208,25,928,1000,1052,3000,630,2,7326,30,0,0,0,0,0,0,4337,1
+1620,NOXIOUS,Noxious,Noxious,35,2038,0,698,698,1,299,400,0,60,12,41,10,30,44,2,10,12,1,0,68,141,350,768,1440,672,0,0,0,0,0,0,0,0,7322,1000,7001,3000,605,50,7320,3000,0,0,0,0,603,1,0,0,0,0,4334,1
+1621,VENOMOUS,Venomous,Venomous,42,4653,0,1780,1280,1,422,844,0,49,12,60,17,19,60,1,10,12,1,0,25,141,350,768,1440,672,0,0,0,0,0,0,0,0,7320,5000,7119,3000,7154,1000,7322,2000,0,0,0,0,603,1,0,0,0,0,4333,1
+1622,TEDDY_BEAR,Teddy Bear,Teddy Bear,71,8109,0,5891,3455,1,621,1432,19,32,5,155,32,41,121,26,10,12,0,0,60,149,200,512,780,504,0,0,0,0,0,0,0,0,7317,3800,518,1000,615,300,13106,5,5113,50,2652,10,985,100,0,0,0,0,4340,1
+1623,RSX_0806,RSX 0806,RSX-0806,86,280733,0,31010,32011,1,2740,5620,39,41,85,51,75,25,93,84,10,12,2,0,60,1205,220,128,1104,240,15505,10000,607,5500,5104,3500,732,5500,7093,6000,999,5000,644,5000,617,1000,7327,5000,1242,50,1531,20,1230,10,0,0,4342,1
+1624,G_WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,0,0,1,500,889,23,10,20,69,55,5,79,77,10,12,2,0,20,645,220,1152,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1625,G_PORCELLIO,Porcellio,Porcellio,43,5523,0,1024,693,1,164,494,0,8,0,31,21,50,64,85,10,12,0,4,62,131,150,720,360,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Hellion Revenant
+1626,G_DARK_PRIEST,Hellion Revenant,Hellion Revenant,88,286900,0,1,1,2,50,3150,25,50,1,80,50,99,130,99,10,12,1,6,69,181,150,432,384,192,0,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0
+
+//Lighthalzen
+1627,ANOPHELES,Anopheles,Anopheles,23,100,0,99,55,1,48,63,0,90,1,200,4,5,120,5,10,12,0,4,64,133,200,140,864,430,0,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4344,1
+1628,MOLE,Mole,Holden,36,2209,0,268,172,9,52,63,0,5,24,18,23,30,45,5,10,12,0,2,42,131,300,140,960,504,0,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,13101,5,0,0,0,0,0,0,0,0,0,0,4343,1
+1629,HILL_WIND,Hill Wind,Hill Wind,43,3189,0,1800,1100,3,290,480,10,15,21,42,31,50,41,23,10,12,1,2,64,671,200,336,540,432,0,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4345,1
+1630,BACSOJIN_,Bacsojin,White Lady,85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,1973,130,576,960,480,22625,10000,607,5500,2513,2000,617,5000,1020,5500,603,5000,617,3000,7165,3000,7166,1000,747,500,0,0,2234,10,0,0,4372,1
+1631,CHUNG_E_,Chung E,Green Maiden,59,23900,0,4256,920,2,460,1050,8,15,38,65,43,30,90,15,10,12,1,7,44,145,150,1728,816,1188,0,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,0,0,0,0,5042,50,0,0,0,0,4373,1
+1632,GREMLIN,Gremlin,Gremlin,53,9280,0,4355,1768,1,329,762,29,25,80,41,59,75,62,15,10,12,2,6,47,657,140,432,540,432,0,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,1,1265,1,0,0,603,2,0,0,0,0,4355,1
+1633,BEHOLDER,Beholder,Beholder,56,7950,0,4821,3822,6,723,812,17,30,60,62,25,59,85,32,10,12,0,0,44,657,190,336,840,360,0,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,603,2,0,0,0,0,4356,1
+//Normal advanced class mobs
+1634,SEYREN,Seyren,Seyren Windsor,91,88402,0,100000,116460,1,2100,2530,63,12,90,89,72,20,99,25,10,12,1,6,63,1693,170,76,384,288,0,0,0,0,0,0,0,0,7345,3000,13001,2,1163,200,603,30,2229,12,2317,1,1155,250,0,0,0,0,4358,1
+1635,EREMES,Eremes,Eremes Guile,87,60199,0,100000,99800,1,2020,2320,23,12,45,138,31,19,99,30,10,12,1,6,85,1693,180,76,384,288,0,0,0,0,0,0,0,0,7347,2000,603,50,2514,1,1262,3,1264,30,678,110,2336,2,0,0,0,0,4360,1
+1636,HARWORD,Harword,Howard Alt-Eisen,83,78690,0,100000,112540,1,1890,2390,59,10,90,62,99,35,98,66,10,12,1,7,81,1693,180,76,384,288,0,0,0,0,0,0,0,0,7345,3000,2514,1,2406,5,1361,110,2104,10,2318,1,603,50,0,0,0,0,4362,1
+1637,MAGALETA,Magaleta,Margaretha Sorin,90,61282,0,100000,117800,1,1300,2053,35,60,1,9,97,145,88,40,10,12,1,7,66,1693,180,1152,384,288,0,0,0,0,0,0,0,0,7347,2000,2607,20,1602,200,1561,10,2327,1,603,50,2504,10,0,0,0,0,4364,1
+1638,SHECIL,Shecil,Cecil Damon,82,58900,0,100000,118260,14,1226,1854,25,15,1,145,27,32,134,80,10,12,1,7,64,1693,180,76,384,288,0,0,0,0,0,0,0,0,7345,3000,12014,110,2331,10,1711,100,12007,150,603,50,2502,60,0,0,0,0,4368,1
+1639,KATRINN,Katrinn,Kathryne Keyron,92,47280,0,100000,116470,1,497,1697,10,74,1,5,77,180,110,39,10,12,1,7,68,1693,150,1152,384,288,0,0,0,0,0,0,0,0,7345,3000,603,50,1611,200,1620,5,2102,30,5085,1,2404,20,0,0,0,0,4366,1
+//MVP Slaves
+1640,G_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1641,G_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1642,G_HARWORD,Whitesmith Harword,Whitesmith Howard,99,310000,0,18000,10000,1,4822,5033,66,36,100,73,112,35,136,60,10,12,1,7,81,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1643,G_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,84,64,182,92,100,10,12,1,7,86,1725,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1644,G_SHECIL,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,14,1892,5113,22,35,1,180,39,67,193,130,10,12,1,7,84,1725,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1645,G_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,88,1,89,42,223,128,93,10,12,1,7,68,1725,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+//MVP Monsters
+1646,B_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,120,110,81,65,130,52,10,12,1,7,83,1973,100,76,384,288,2417800,10000,617,5500,603,5000,732,2000,1132,2500,2342,3500,2412,9000,1470,3500,1469,3000,1166,2500,1415,1500,0,0,0,0,4357,1
+1647,B_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,90,181,62,37,122,60,10,12,1,7,85,1973,100,76,384,288,2041700,10000,617,5500,603,5000,732,2000,1234,1500,1230,1500,2319,9000,1233,3500,1232,3500,1265,3500,13002,3500,0,0,0,0,4359,1
+1648,B_HARWORD,Whitesmith Harword,Whitesmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,100,73,112,35,136,60,10,12,1,7,82,1973,100,76,384,288,2001170,10000,617,5500,603,5000,732,2000,1138,3500,1140,2500,2318,9000,1365,3500,1364,3500,1369,2500,1368,3500,0,0,0,0,4361,1
+1649,B_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,86,1973,125,1152,384,288,2128500,10000,617,5500,603,5000,732,2000,1814,3500,2615,2500,2513,9000,1557,3500,1527,3500,1528,2500,1560,3500,0,0,0,0,4363,1
+1650,B_SHECIL,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,14,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,84,1973,100,76,384,288,2046500,10000,617,5500,603,5000,1723,2000,1228,3500,1236,3500,617,9000,1234,1500,1237,3500,1720,1500,1724,2500,0,0,0,0,4367,1
+1651,B_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,1973,150,1152,384,288,2004100,10000,617,5500,603,5000,732,2000,1241,3500,1242,3500,2616,9000,2343,2500,2513,2500,1618,3000,2319,3500,0,0,0,0,4365,1
+//1'st Class Mobs
+1652,YGNIZEM,Ygnizem,Egnigem Cenia,58,11200,0,4870,98,1,823,1212,35,8,60,35,52,18,79,20,10,12,1,7,43,1693,145,576,432,288,0,0,0,0,0,0,0,0,7347,1000,2317,1,1158,20,1127,20,2313,10,1152,80,1170,1,0,0,0,0,4346,1
+1653,WHIKEBAIN,Whikebain,Wickebine Tres,62,7320,0,4204,21,1,693,889,9,8,1,102,34,20,83,30,10,12,1,7,65,1693,120,576,432,288,0,0,0,0,0,0,0,0,7345,2000,1223,1,2306,40,1220,10,2315,2,1208,50,13004,10,0,0,0,0,4348,1
+1654,ARMAIA,Armaia,Armeyer Dinze,66,7110,0,4008,35,1,750,913,42,6,5,36,50,15,89,60,10,12,1,7,62,1693,120,576,432,288,0,0,0,0,0,0,0,0,7345,1000,2504,1,1358,50,1352,40,2311,10,1302,80,1307,10,0,0,0,0,4347,1
+1655,EREND,Erend,Errende Ebecee,59,6980,0,4501,67,1,896,1159,14,30,1,31,41,93,67,30,10,12,1,7,46,1693,130,576,432,288,0,0,0,0,0,0,0,0,7345,500,2217,5,1514,50,1517,20,2326,5,2324,10,1523,1,0,0,0,0,4349,1
+1656,KAVAC,Kavac,Kavach Icarus,60,7899,0,4090,86,9,684,904,12,5,48,100,10,15,118,40,10,12,1,7,44,1693,150,576,432,288,0,0,0,0,0,0,0,0,7347,2000,1716,1,12006,100,1708,10,2308,5,2402,30,2404,2,0,0,0,0,4351,1
+1657,RAWREL,Rawrel,Laurell Weinder,61,6168,0,4620,30,1,430,517,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,150,576,432,288,0,0,0,0,0,0,0,0,934,1000,1616,1,2102,5,1608,50,2322,10,2333,30,2607,1,0,0,0,0,4350,1
+//1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
+1658,B_YGNIZEM,Ygnizem,Egnigem Cenia,79,214200,0,258760,86000,1,3890,5690,48,25,82,60,45,31,110,40,10,12,1,7,43,1973,100,1008,864,288,129380,10000,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,644,1000,0,0,4352,1
+1659,G_WHIKEBAIN,Whikebain,Wickebine Tres,62,7320,0,0,0,1,593,789,9,12,1,102,34,23,74,30,10,12,1,7,65,1693,120,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1660,G_ARMAIA,Armaia,Armeyer Dinze,66,7110,0,0,0,1,650,813,42,6,5,36,40,15,80,60,10,12,1,7,62,1693,120,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1661,G_EREND,Erend,Errende Ebecee,59,6980,0,0,0,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,130,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1662,G_KAVAC,Kavac,Kavach Icarus,60,7899,0,0,0,9,584,804,12,5,48,100,10,20,118,40,10,12,1,7,44,1693,150,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1663,G_RAWREL,Rawrel,Laurell Weinder,61,6168,0,0,0,1,330,417,8,48,1,41,5,100,45,10,10,12,1,7,48,3229,150,1008,864,288,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+1664,POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,3900,1800,9,800,900,10,30,1,40,25,20,80,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1665,POTON_CANON_1,Photon Cannon,Photon Cannon,67,7500,0,4300,2000,9,700,800,15,30,1,40,30,40,86,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,13160,5,0,0,0,0,0,0,0,0,0,0,0,0
+1666,POTON_CANON_2,Photon Cannon,Photon Cannon,64,7100,0,3100,2700,9,800,900,8,30,1,40,21,29,80,91,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1667,POTON_CANON_3,Photon Cannon,Photon Cannon,65,7800,0,3800,2300,9,700,800,15,30,1,40,23,30,90,99,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,7126,5000,728,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1668,ARCHDAM,Archdam,Archdam,79,25000,0,8000,5000,3,1000,2000,15,15,65,65,35,75,75,15,10,12,2,7,60,157,180,580,288,360,0,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,13156,5,0,0,0,0,0,0,0,0,4371,1
+1669,DIMIK,Dimik,Dimik,77,10000,0,0,0,5,1040,1880,45,28,15,35,40,15,120,42,10,12,1,0,40,157,200,576,720,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1670,DIMIK_1,Dimik,Dimik,79,16000,0,6400,3500,7,1140,1980,45,28,15,88,20,20,120,40,10,12,1,0,44,157,150,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,300,7094,300,13153,5,984,10,12128,50,0,0,0,0,4370,1
+1671,DIMIK_2,Dimik,Dimik,89,29000,0,8000,5000,5,1440,2280,45,28,15,40,30,30,150,70,10,12,1,0,41,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7353,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
+1672,DIMIK_3,Dimik,Dimik,80,19000,0,5900,2800,5,1240,2080,68,28,15,30,78,20,120,30,10,12,1,0,42,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7354,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
+1673,DIMIK_4,Dimik,Dimik,82,13900,0,5800,4500,5,1840,2840,45,28,15,20,20,10,120,30,10,12,1,0,43,157,200,576,720,432,0,0,0,0,0,0,0,0,7319,2000,7355,50,999,300,7094,300,2656,10,984,10,12128,50,0,0,0,0,4370,1
+1674,MONEMUS,Monemus,Monemus,88,80000,0,0,0,5,2000,3000,54,25,0,1,90,24,144,45,14,12,2,0,63,164,400,1368,1344,432,0,0,0,0,0,0,0,0,7049,2000,953,1000,7049,0,7049,0,7049,0,7049,0,7049,0,7049,0,0,0,0,0
+1675,VENATU,Venatu,Venatu,77,8000,0,0,0,2,1200,1800,35,20,5,26,24,5,75,40,10,12,1,0,43,157,150,504,1020,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1676,VENATU_1,Venatu,Venatu,72,8900,0,4000,2000,2,800,1400,30,20,5,26,24,5,82,30,10,12,1,0,40,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,300,7094,300,13157,5,985,10,12127,100,0,0,0,0,4369,1
+1677,VENATU_2,Venatu,Venatu,80,9000,0,4000,2000,2,900,1500,30,20,5,82,32,5,105,30,10,12,1,0,44,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7357,500,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
+1678,VENATU_3,Venatu,Venatu,78,9500,0,4500,2000,2,800,1400,30,20,5,26,68,5,95,30,10,12,1,0,42,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7358,400,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
+1679,VENATU_4,Venatu,Venatu,75,12300,0,4000,2000,2,800,1400,30,20,5,26,24,5,100,30,10,12,1,0,41,157,150,504,1020,360,0,0,0,0,0,0,0,0,7317,2000,7359,300,999,300,7094,300,2656,10,985,10,12127,100,0,0,0,0,4369,1
+1680,HILL_WIND_1,Hill Wind,Hill Wind,45,4233,0,2132,1722,3,320,510,10,15,21,42,31,50,67,23,10,12,1,2,64,157,170,504,480,360,0,0,0,0,0,0,0,0,7115,4000,7116,3000,528,1000,510,10,0,0,0,0,0,0,0,0,0,0,4345,1
+1681,GEMINI,Gemini-S58,Gemini-S58,72,57870,0,22024,9442,3,2150,3030,60,45,88,75,70,77,105,55,10,12,1,0,21,189,200,1872,360,864,0,0,0,0,0,0,0,0,7005,3000,603,1000,13159,5,546,500,547,400,7479,6,12040,300,0,0,0,0,4354,1
+1682,REMOVAL,Removal,Remover,55,10289,0,3831,1278,1,558,797,5,20,1,20,56,35,57,20,10,12,1,1,49,157,250,1536,1056,1152,0,0,0,0,0,0,0,0,713,5000,7319,5000,5005,10,549,500,971,50,972,100,5120,6,0,0,0,0,4353,1
+1683,G_POTON_CANON,Photon Cannon,Photon Cannon,46,7000,0,0,0,9,560,570,5,10,1,36,36,20,56,30,10,12,1,0,43,669,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1684,G_ARCHDAM,Archdam,Archdam,57,11000,0,0,0,3,600,700,15,15,65,65,35,75,75,15,10,12,2,8,60,157,180,1080,288,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1685,APOCALIPS_H,Vesper,Vesper,97,320700,0,200000,100000,3,4000,10000,50,54,100,50,60,70,160,150,10,12,2,2,46,165,180,504,912,432,100000,10000,617,5500,603,5000,732,2000,7095,5000,7094,3000,617,1000,617,1000,2659,100,2660,100,2661,100,2662,100,0,0,4374,1
+1686,ORC_BABY,Orc Baby,Orc Baby,21,912,0,220,220,1,135,270,10,10,30,15,10,18,35,2,10,12,0,7,22,653,200,672,864,288,0,0,0,0,0,0,0,0,7126,1000,10004,100,2299,1,519,5000,7270,200,7269,100,0,0,0,0,0,0,4375,1
+1687,GREEN_IGUANA,Green Iguana,Grove,54,6444,0,2400,2050,1,550,650,0,10,1,52,64,5,98,14,10,12,1,2,42,131,200,720,528,432,0,0,0,0,0,0,0,0,521,1500,903,1000,520,1000,511,1000,528,2000,606,10,511,1,0,0,0,0,4377,1
+1688,LADY_TANEE,Lady Tanee,Lady Tanee,89,493000,0,64995,43222,14,450,2170,20,44,1,125,48,78,210,38,10,12,2,3,64,676,100,576,432,360,32497,10000,617,5500,12095,5000,732,2000,12090,5000,634,4000,12129,1000,5116,1000,985,5000,617,2000,1716,6000,0,0,0,0,4376,1
+1689,G_BACSOJIN,Bacsojin,White Lady,85,253221,0,45250,16445,3,1868,6124,20,55,52,65,44,112,152,35,10,12,2,7,64,1973,130,576,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1690,G_SPRING_RABBIT,Spring Rabbit,Spring Rabbit,12,15,0,0,0,1,0,0,100,99,1,1,1,1,1,1,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7303,9000,7303,500,7303,10,7303,10,7303,10,7303,10,7303,10,7303,10,0,0,0,0
+1691,G_KRABEN,Kraben,Kraben,70,10880,0,0,0,1,125,765,5,42,50,155,1,66,112,60,10,12,1,0,48,141,100,1152,1536,576,0,0,0,0,0,0,0,0,521,1,521,1,521,1,521,1,521,1,521,1,521,1,0,0,0,0,0,0
+
+// Thanatos Tower & Abyss
+1692,BREEZE,Breeze,Breeze,56,5099,0,2390,1340,2,94,215,7,32,1,96,6,38,91,45,10,12,1,0,64,133,100,140,384,504,0,0,0,0,0,0,0,0,945,500,706,10,2270,10,511,100,604,10,2269,10,996,10,0,0,0,0,4390,1
+1693,PLASMA_Y,Plasma,Plasma,56,8400,0,2200,2100,3,400,900,0,40,1,30,10,83,105,45,10,12,0,0,88,133,100,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,715,100,969,1,0,0,0,0,0,0,0,0,4389,1
+1694,PLASMA_R,Plasma,Plasma,43,5700,0,2000,1000,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,990,45,0,0,0,0,0,0,0,0,4389,1
+1695,PLASMA_G,Plasma,Plasma,47,7600,0,2000,1000,3,300,700,0,30,1,30,5,61,90,30,10,12,0,0,82,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,717,100,993,40,0,0,0,0,0,0,0,0,4389,1
+1696,PLASMA_P,Plasma,Plasma,49,5900,0,2000,1000,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,716,100,724,100,0,0,0,0,0,0,0,0,4389,1
+1697,PLASMA_B,Plasma,Plasma,44,8200,0,2000,1000,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,133,150,608,1440,576,0,0,0,0,0,0,0,0,911,100,644,10,731,2,717,100,991,35,0,0,0,0,0,0,0,0,4389,1
+1698,DEATHWORD,Deathword,Death Word,65,18990,0,2986,4912,1,622,1102,10,40,50,75,10,20,140,45,10,12,1,0,60,133,150,176,912,300,0,0,0,0,0,0,0,0,1097,4000,7015,300,1006,20,7449,500,2418,10,7479,2,7480,1,0,0,0,0,4388,1
+1699,ANCIENT_MIMIC,Ancient Mimic,Ancient Mimic,60,8080,0,2950,2650,1,530,1697,20,40,50,100,30,40,150,110,10,12,2,0,60,133,100,168,480,360,0,0,0,0,0,0,0,0,603,30,617,1,644,50,2404,5,2506,1,2417,10,2610,100,0,0,0,0,4387,1
+1700,OBSERVATION,Observation,Dame of Sentinel,81,65111,0,39872,33120,2,1666,2609,55,55,30,74,56,126,145,114,10,12,1,8,80,165,100,432,480,360,0,0,0,0,0,0,0,0,7441,500,2621,1,7442,100,728,1000,12040,100,2210,10,7435,100,0,0,0,0,4392,1
+1701,SHELTER,Shelter,Mistress of Shelter,80,38000,0,29010,25110,2,1871,1971,22,63,12,67,34,167,157,120,10,12,1,8,66,2213,160,432,420,360,0,0,0,0,0,0,0,0,7440,200,7442,1,12040,50,722,1000,7005,1000,7442,50,0,0,0,0,0,0,4393,1
+1702,RETRIBUTION,Retribution,Baroness of Retribution,79,46666,0,28332,33120,2,2022,2288,35,35,30,142,66,72,133,39,10,12,1,8,67,165,120,360,480,360,0,0,0,0,0,0,0,0,7440,400,2621,1,12040,50,723,1000,2506,5,1158,10,7442,50,0,0,0,0,4391,1
+1703,SOLACE,Solace,Lady Solace,77,25252,0,21000,25110,2,1392,1462,21,67,12,76,29,145,99,100,10,12,1,8,66,165,180,576,420,360,0,0,0,0,0,0,0,0,7441,200,2621,1,12040,50,718,1000,1910,50,1909,100,7442,50,0,0,0,0,4394,1
+1704,THA_ODIUM,Thanatos Odium,Odium of Thanatos,92,72389,0,88420,63880,9,2100,2800,68,30,100,52,165,62,185,90,10,12,2,1,88,165,100,432,288,420,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7436,10000,616,10,2520,1000,0,0,0,0,0,0,4396,1
+1705,THA_DESPERO,Thanatos Despero,Despero of Thanatos,88,86666,0,62001,51220,2,2182,3082,38,39,100,167,79,92,151,120,10,12,2,1,88,165,150,160,528,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7439,10000,616,10,2419,1000,0,0,0,0,0,0,4397,1
+1706,THA_MAERO,Thanatos Maero,Maero of Thanatos,83,62000,0,56699,63880,2,2022,2288,29,72,100,176,30,200,122,29,10,12,1,1,88,165,150,160,480,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7437,10000,616,10,2354,1000,0,0,0,0,0,0,4395,1
+1707,THA_DOLOR,Thanatos Dolor,Dolor of Thanatos,83,59922,0,43200,51220,2,1392,2092,21,80,100,76,29,206,139,44,10,12,0,1,88,165,150,160,672,480,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,7438,10000,616,10,5128,1000,0,0,0,0,0,0,4398,1
+1708,THANATOS,Thanatos,Thanatos Phantom,99,445660,0,3666000,2145060,3,3812,7483,35,35,100,108,122,86,147,32,10,12,2,6,88,1461,120,115,816,504,1833000,10000,617,5500,603,5000,732,2000,7444,1000,2519,1000,7450,5000,2342,5000,2412,5000,2515,1000,2655,500,0,0,0,0,4399,1
+1709,G_THA_ODIUM,Thanatos Odium,Odium of Thanatos,92,72389,0,10000,5000,9,2100,2800,68,30,100,52,165,62,185,90,10,12,2,1,88,165,100,115,288,420,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1710,G_THA_DESPERO,Thanatos Despero,Despero of Thanatos,88,86666,0,10000,5000,2,2182,3082,38,39,100,167,79,92,151,120,10,12,2,1,88,165,150,160,528,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1711,G_THA_MAERO,Thanatos Maero,Maero of Thanatos,83,62000,0,10000,5000,2,2022,2288,29,72,100,176,30,200,122,29,10,12,1,1,88,165,150,160,480,360,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1712,G_THA_DOLOR,Thanatos Dolor,Dolor of Thanatos,83,59922,0,10000,5000,2,1392,2092,21,80,100,76,29,206,139,44,10,12,0,1,88,165,150,160,672,480,0,0,0,0,0,0,0,0,7054,1000,731,500,732,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1713,ACIDUS,Acidus,Acidus,80,51112,0,28043,8023,2,1289,2109,29,69,1,71,55,135,103,69,10,12,2,9,46,133,170,168,1008,300,0,0,0,0,0,0,0,0,582,5100,1035,4000,7444,5,1036,3589,7448,800,714,5,2114,50,0,0,0,0,4378,1
+1714,FERUS,Ferus,Ferus,70,29218,0,8093,3952,2,1056,1496,14,45,1,78,45,72,81,73,10,12,2,9,43,133,100,108,576,432,0,0,0,0,0,0,0,0,578,2200,1035,1000,7123,1000,1036,2000,7447,800,994,20,5122,50,0,0,0,0,4380,1
+1715,NOVUS,Novus,Novus,42,5430,0,1320,1002,1,284,384,20,28,1,56,43,45,124,43,10,12,0,9,20,133,110,151,288,360,0,0,0,0,0,0,0,0,511,3000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4383,1
+1716,ACIDUS_,Acidus,Acidus,76,39111,0,14392,4203,2,1180,2000,21,47,1,78,31,93,88,52,10,12,2,9,44,133,180,168,768,360,0,0,0,0,0,0,0,0,505,150,1035,4000,510,150,1036,3589,7446,800,996,20,7446,100,0,0,0,0,4379,1
+1717,FERUS_,Ferus,Ferus,69,21182,0,6750,2230,2,930,1170,14,38,1,66,77,60,79,35,10,12,2,9,42,133,120,108,576,432,0,0,0,0,0,0,0,0,579,5100,1035,1000,0,0,1036,3589,7445,800,997,20,7445,100,0,0,0,0,4381,1
+1718,NOVUS_,Novus,Novus,43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,133,100,252,816,480,0,0,0,0,0,0,0,0,508,2000,7053,1035,0,0,1036,589,0,0,0,0,0,0,0,0,0,0,4382,1
+1719,DETALE,Detale,Detardeurus,90,480000,0,291850,123304,3,4560,5548,66,59,100,90,112,136,140,56,10,12,2,9,67,1461,250,432,936,360,145925,10000,617,5500,603,5000,732,2000,2649,1000,2648,1000,7444,5000,7451,3589,12080,1000,1417,100,5002,500,0,0,0,0,4386,1
+1720,HYDRO,Hydro,Hydrolancer,89,308230,0,83450,2480,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,165,160,140,672,432,0,0,0,0,0,0,0,0,7123,4000,1035,4000,7443,3880,5126,500,5127,500,12085,300,5124,500,0,0,0,0,4384,1
+1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,0,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0,1000,24,0,0,0,0,0,0,0,0,0,0,985,5,7032,100,731,10,732,5,718,10,720,10,728,10,0,0,0,0,4385,1
+1722,EVENT_JAKK,Jakk,Jakk,99,10310,0,103,100,1,115,182,5,11,1,28,18,13,35,45,10,12,1,0,43,2181,240,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1723,A_SHECIL,Shecil Damon,Cecil Damon,82,30000,0,0,0,14,600,900,25,15,1,145,27,32,134,80,10,12,1,7,64,1693,180,1008,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1724,A_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,9,1000,1300,10,30,1,40,25,20,80,80,10,12,1,0,40,157,300,1536,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1725,R_PORING,Poring,Poring,1,50,0,0,0,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,131,150,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1726,R_LUNATIC,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,150,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1727,R_SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,0,0,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,150,1624,624,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1728,R_DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,0,0,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,150,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1729,R_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,150,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1730,R_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1731,G_DOPPELGANGER,Doppelganger,Doppelganger,72,12000000,0,3000000,2000000,1,5000,10000,99,99,88,180,70,75,180,65,10,12,2,8,48,1205,190,480,480,288,0,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1732,G_TREASURE_BOX,Treasure Chest,Treasure Chest,98,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Kiel Dungeon monsters (done, but drop rates guessed)
+1733,KIEL,Kiel,Kiel,90,523000,0,36500,23405,3,1682,3311,28,32,100,112,76,89,156,102,10,12,1,0,47,165,140,1152,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1734,KIEL_,Kiel D-01,Kiel D-01,90,1523000,0,2356200,512602,3,3280,6560,28,32,100,130,140,160,199,180,10,12,1,0,47,1461,130,1152,576,432,1178100,10000,617,5500,603,5000,616,2000,7513,3000,617,3000,2651,1000,2319,1000,1618,500,1242,500,2650,1000,0,0,0,0,4403,1
+1735,ALICEL,Alicel,Alicel,75,37520,0,8890,5420,2,1800,2770,30,30,50,58,50,51,92,40,10,12,1,6,60,133,250,1080,480,504,0,0,0,0,0,0,0,0,7512,2000,7507,3000,999,200,7317,500,1812,5,985,10,2517,20,0,0,0,0,4401,1
+1736,ALIOT,Aliot,Aliot,75,48290,0,13020,4006,2,950,2470,35,15,50,32,87,12,68,19,10,12,1,6,60,133,200,1296,432,360,0,0,0,0,0,0,0,0,7512,2000,7507,3000,2516,10,7317,500,1408,10,985,10,2102,2,0,0,0,0,4402,1
+1737,ALIZA,Aliza,Aliza,69,19000,0,6583,3400,1,750,1100,8,5,74,74,52,35,110,140,10,12,1,7,60,145,220,1440,576,600,0,0,0,0,0,0,0,0,7054,4000,2518,10,2626,10,7047,5,12128,50,661,1,2233,3,0,0,0,0,4400,1
+1738,CONSTANT,Constant,Constant,55,10000,0,3230,116,1,460,580,12,12,50,28,26,47,66,14,10,12,0,0,67,133,150,720,360,360,0,0,0,0,0,0,0,0,7512,100,7507,1500,7325,10,999,10,757,10,0,0,0,0,0,0,0,0,0,0
+1739,G_ALICEL,Alicel,Alicel,75,37520,0,0,0,2,1600,2570,30,30,50,60,50,51,92,40,10,12,1,6,60,133,150,1080,480,504,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1740,G_ALIOT,Aliot,Aliot,75,43290,0,0,0,2,950,2070,35,15,50,32,87,12,68,19,10,12,1,6,60,133,150,1296,432,360,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1741,G_COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1742,G_CARAT,Carat,Carat,51,5200,0,0,0,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1743,G_MYSTCASE,Myst Case,Myst Case,38,3450,0,0,0,1,160,360,5,10,65,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1744,G_WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,0,0,1,315,360,0,15,65,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1745,G_CONSTANT,Constant,Constant,55,1000,0,0,0,1,460,580,12,12,50,28,26,47,66,14,10,12,0,6,67,133,110,720,360,360,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1746,G_ALIZA,Aliza,Aliza,69,15000,0,0,0,1,750,1100,8,5,74,74,52,35,110,140,10,12,1,7,60,145,200,1440,576,600,0,0,0,0,0,0,0,0,7507,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1747,G_SNAKE,Snake,Boa,15,471,0,0,0,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1748,G_ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,0,0,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1749,G_MEDUSA,Medusa,Medusa,79,22408,0,0,0,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,1720,1320,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1750,G_RED_PLANT,Red Plant,Red Plant,1,100,0,0,0,1,100,200,100,99,0,0,0,0,0,100,7,12,0,3,22,64,2000,1,1,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
+
+// Odin monsters (done, but drop rates guessed)
+1751,RANDGRIS,Valkyrie Randgris,Valkyrie Randgris,99,3567200,0,2854900,3114520,3,5560,9980,25,42,100,120,80,120,220,210,10,12,2,8,86,165,100,576,576,480,1427450,10000,617,5500,603,5000,616,2000,7510,5000,2357,800,2524,1500,2421,1500,2229,2500,7024,2500,0,0,0,0,0,0,4407,1
+1752,SKOGUL,Skogul,Skogul,70,87544,0,27620,10,2,1110,1930,20,15,1,69,70,50,67,52,10,12,1,6,67,133,190,720,384,480,0,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,739,500,2609,100,757,500,0,0,0,0,0,0,4404,1
+1753,FRUS,Frus,Frus,69,83422,0,20620,10,2,1110,1780,20,15,1,69,60,50,76,52,10,12,1,6,67,133,150,480,576,432,0,0,0,0,0,0,0,0,7511,3500,7054,1000,716,1000,2622,3,2308,10,757,500,0,0,0,0,0,0,4405,1
+1754,SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,91100,10,1,1400,2020,12,24,80,100,50,72,90,50,10,12,0,8,46,165,250,672,780,480,0,0,0,0,0,0,0,0,7511,6000,2254,1,7063,1000,608,20,7511,1000,2322,100,2353,100,0,0,0,0,4406,1
+1755,SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,99200,10,1,1600,2050,15,24,80,120,60,85,98,80,10,12,0,8,46,165,250,672,780,480,0,0,0,0,0,0,0,0,7511,6000,2254,1,7063,1000,610,20,7511,1000,2322,100,2353,100,0,0,0,0,4406,1
+1756,G_HYDRO,Hydro,Hydrolancer,89,308230,0,0,0,3,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,47,165,160,140,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1757,G_ACIDUS,Acidus,Acidus,80,51112,0,0,0,2,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,46,133,170,168,1008,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1758,G_FERUS,Ferus,Ferus,70,29218,0,0,0,2,1056,1496,34,45,1,78,45,72,81,73,10,12,2,9,43,133,100,108,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1759,G_ACIDUS_,Acidus,Acidus,76,39111,0,0,0,2,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,44,133,180,168,768,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1760,G_FERUS_,Ferus,Ferus,69,21182,0,0,0,2,930,1170,24,38,1,66,77,60,79,35,10,12,2,9,42,133,120,108,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1761,G_SKOGUL,Skogul,Skogul,70,57544,0,0,0,2,1110,1930,20,15,1,69,70,50,67,52,10,12,1,6,67,133,170,720,384,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1762,G_FRUS,Frus,Frus,69,53422,0,0,0,2,1110,1780,20,15,1,69,60,50,76,52,10,12,1,6,67,133,130,480,576,432,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1763,G_SKEGGIOLD,Skeggiold,Skeggiold,81,100200,0,0,0,1,1400,3410,12,24,80,100,50,72,90,50,10,12,0,8,46,165,200,672,780,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1764,G_SKEGGIOLD_,Skeggiold,Skeggiold,83,103000,0,0,0,1,1600,4110,15,24,80,120,60,85,98,80,10,12,0,8,46,165,200,672,780,480,0,0,0,0,0,0,0,0,7511,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1765,G_RANDGRIS,Valkyrie,Valkyrie,99,1567200,0,10000,10000,3,5560,9980,25,42,100,120,80,120,220,210,10,12,2,8,86,165,100,576,576,480,0,0,0,0,0,0,0,0,7510,500,617,100,2115,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1766,EM_ANGELING,Angeling,Angeling,99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,1205,300,1288,288,384,0,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1767,EM_DEVILING,Deviling,Deviling,99,128430,0,0,0,1,60,71,40,50,1,17,80,80,126,20,10,12,0,8,66,1205,300,1288,288,384,0,0,909,5000,909,5000,741,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Rachel / Ice Dungeon monsters (Poring Stats)
+1768,GLOOMUNDERNIGHT,Gloom Under Night,Gloom Under Night,89,2298000,0,962175,276445,3,5880,9516,10,20,100,115,98,78,111,50,10,12,2,0,68,165,200,1344,2880,576,481087,10000,607,5500,617,5000,617,5000,7566,7000,7023,4000,7022,2000,616,5000,2513,1000,0,0,0,0,0,0,0,0,0,0
+1769,AGAV,Agav,Agav,73,29620,0,9780,6622,1,103,1109,15,35,1,32,27,132,69,15,10,12,1,7,80,133,300,768,360,360,0,0,0,0,0,0,0,0,7567,2500,2422,2,7563,4000,2109,1,12183,50,7563,100,0,0,0,0,0,0,0,0
+1770,ECHIO,Echio,Echio,69,34900,0,13560,4300,1,750,1800,33,11,74,74,52,35,59,56,10,12,1,7,80,133,250,768,360,360,0,0,0,0,0,0,0,0,7567,2500,608,10,7563,4000,5172,50,12183,20,7563,100,0,0,0,0,0,0,0,0
+1771,VANBERK,Vanberk,Vanberk,59,9988,0,4203,901,1,230,660,24,6,69,66,39,29,51,41,10,12,1,7,80,133,250,768,360,360,0,0,0,0,0,0,0,0,7568,2500,526,10,7563,1000,5172,10,0,0,7563,100,0,0,0,0,0,0,0,0
+1772,ISILLA,Isilla,Isilla,62,8297,0,3001,3001,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,133,300,768,360,432,0,0,0,0,0,0,0,0,7568,2500,2422,1,7563,1000,2610,10,2601,1,7563,100,0,0,0,0,0,0,0,0
+1773,HODREMLIN,Hodremlin,Hodremlin,61,12180,0,6782,2022,1,845,1678,29,25,80,41,81,56,62,11,10,12,1,6,67,149,140,960,528,432,0,0,0,0,0,0,0,0,587,1000,7340,1000,2406,2,938,1000,7563,1000,1061,2000,0,0,0,0,0,0,0,0
+1774,SEEKER,Seeker,Seeker,65,10090,0,5671,4278,6,723,852,17,30,60,52,34,143,107,27,10,12,0,0,64,149,190,576,432,300,0,0,0,0,0,0,0,0,587,1000,7340,1000,985,20,1061,4000,7563,1000,0,0,0,0,0,0,0,0,0,0
+1775,SNOWIER,Snowier,Snowier,60,19230,0,5882,2699,2,770,1347,22,12,73,46,72,15,52,25,10,12,2,0,41,133,220,936,1020,420,0,0,0,0,0,0,0,0,7561,3000,7066,1000,757,100,510,50,509,500,0,0,991,100,0,0,0,0,0,0
+1776,SIROMA,Siroma,Siroma,42,6800,0,2230,1005,1,220,440,12,8,33,23,52,11,40,19,10,12,0,0,61,131,180,432,648,240,0,0,0,0,0,0,0,0,7561,1000,7066,500,510,10,0,0,0,0,0,0,991,20,0,0,0,0,0,0
+1777,ICE_TITAN,Ice Titan,Ice Titan,60,38200,0,13872,7928,1,1090,1570,71,15,99,34,88,10,79,29,10,12,2,0,61,133,250,861,660,144,0,0,0,0,0,0,0,0,7561,5000,7066,3000,749,100,984,10,985,30,0,0,995,100,0,0,0,0,0,0
+1778,GAZETI,Gazeti,Gazeti,55,12300,0,5758,2075,10,512,612,65,25,1,12,20,60,101,5,10,12,1,6,21,133,190,576,370,270,0,0,0,0,0,0,0,0,7561,3000,7066,3000,985,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1779,KTULLANUX,Ktullanux,Ktullanux,98,4417000,0,2720050,1120020,3,1680,10360,40,42,85,126,82,125,177,112,10,12,2,2,81,165,400,432,840,216,1360025,10000,607,5500,617,5000,617,5000,7562,9000,616,3000,2509,5000,2111,5000,617,5000,607,5000,0,0,0,0,0,0,0,0
+1780,MUSCIPULAR,Muscipular,Muscipular,57,4332,0,1706,1706,3,521,726,12,12,1,53,39,25,92,51,10,12,1,3,22,132,2000,672,648,360,0,0,0,0,0,0,0,0,7565,3000,1032,3000,629,2,1033,2000,905,1000,631,3,0,0,0,0,0,0,0,0
+1781,DROSERA,Drosera,Drosera,46,7221,0,2612,1022,7,389,589,10,13,1,30,27,17,76,41,10,12,1,3,22,132,2000,864,576,336,0,0,0,0,0,0,0,0,7565,3000,938,3000,1032,3000,1033,2000,621,3,905,1000,0,0,0,0,0,0,0,0
+1782,ROWEEN,Roween,Roween,31,5716,0,1669,1266,1,298,377,0,7,51,39,48,18,67,19,10,12,1,2,24,133,200,412,840,300,0,0,0,0,0,0,0,0,7564,3000,919,3000,992,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1783,GALION,Galion,Galion,44,32240,0,10020,3368,1,336,441,11,12,51,52,59,25,72,32,10,12,1,2,44,165,150,864,624,360,0,0,0,0,0,0,0,0,7564,3000,919,3000,996,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1784,STAPO,Stapo,Stapo,23,666,0,332,221,1,135,370,90,5,12,11,15,12,23,1,10,12,0,0,42,131,300,936,792,432,0,0,0,0,0,0,0,0,909,1000,7312,1000,512,1000,7126,100,993,10,0,0,0,0,0,0,0,0,0,0
+1785,ATROCE,Atros,Atros,82,1008420,0,295550,118895,2,2526,3646,25,25,100,87,56,49,89,72,10,12,2,2,67,165,150,576,600,240,147775,10000,607,5500,617,5000,617,5000,7563,7000,608,1000,2621,1000,617,5000,607,5000,5123,100,0,0,0,0,0,0,0,0
+1786,G_AGAV,Agav,Agav,73,25620,0,0,0,1,103,909,15,35,1,32,27,132,69,15,10,12,1,7,40,133,300,768,360,360,0,0,0,0,0,0,0,0,7567,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1787,G_ECHIO,Echio,Echio,69,36900,0,0,0,1,750,1500,33,11,74,74,52,35,59,56,10,12,1,7,40,133,250,768,360,360,0,0,0,0,0,0,0,0,7567,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1788,G_ICE_TITAN,Ice Titan,Ice Titan,60,32900,0,0,0,1,1090,1570,71,15,99,34,88,10,79,29,10,12,2,0,61,133,250,861,660,144,0,0,0,0,0,0,0,0,7561,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1789,ICEICLE,Iceicle,Iceicle,38,10,0,5,5,3,241,1082,0,10,1,10,10,10,172,5,10,12,0,0,41,132,2000,1344,0,0,0,0,0,0,0,0,0,0,7066,1000,7066,1000,7066,1000,7066,500,7066,500,7066,500,7066,500,7066,500,0,0,0,0
+1790,G_RAFFLESIA,Rafflesia,Rafflesia,17,1333,0,0,0,3,105,127,0,2,1,18,24,11,37,10,10,12,0,3,22,133,150,512,528,240,0,0,0,0,0,0,0,0,7577,3000,7575,4000,7576,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1791,G_GALION,Galion,Galion,44,32240,0,0,0,1,336,441,11,12,51,52,59,25,72,32,10,12,1,2,44,165,150,864,624,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1792,SOCCER_BALL,Soccer Ball,Soccer Ball,1,1000,0,0,0,0,0,0,128,99,0,0,0,0,0,0,0,0,0,0,20,131,2000,96,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1793,G_MEGALITH,Megalith,Megalith,45,5300,0,0,0,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1794,G_ROWEEN,Roween,Roween,31,5716,0,0,0,1,298,377,0,7,51,39,48,18,67,19,10,12,1,2,24,133,200,412,840,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1795,BLOODY_KNIGHT_,Bloody Knight,Bloody Knight,82,800000,0,0,0,3,10000,30000,60,60,88,121,100,100,125,55,10,12,2,8,28,1173,250,828,528,192,0,0,0,0,0,0,0,0,1417,100,2412,100,2514,200,2342,300,2513,200,1620,200,617,7000,7578,10000,0,0,0,0
+1796,AUNOE,Aunoe,Aunoe,62,21297,0,4102,4102,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,131,250,768,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1797,FANAT,Fanat,Fanat,62,21297,0,4102,4102,1,89,733,11,19,1,28,12,97,57,12,10,12,1,7,80,131,250,768,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1798,TREASURE_BOX_,Treasure Chest,Treasure Chest,99,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,20,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1799,G_SEYREN_,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,72,37,120,110,81,65,130,52,10,12,1,7,83,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1800,G_EREMES_,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,90,181,62,37,122,60,10,12,1,7,85,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1801,G_HARWORD_,Whitesmith Harword,Mastersmith Howard,99,310000,0,18000,10000,1,4822,5033,66,36,100,73,112,35,136,60,10,12,1,7,81,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1802,G_MAGALETA_,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,84,64,182,92,100,10,12,1,7,86,131,125,1152,384,288,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1803,G_SHECIL_,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,14,1892,5113,22,35,1,180,39,67,193,130,10,12,1,7,84,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1804,G_KATRINN_,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,88,1,89,42,223,128,93,10,12,1,7,68,131,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1805,B_SEYREN_,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,120,110,81,65,130,52,10,12,1,7,83,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1806,B_EREMES_,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,90,181,62,37,122,60,10,12,1,7,85,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1807,B_HARWORD_,Whitesmith Harword,Mastersmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,100,73,112,35,136,60,10,12,1,7,82,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1808,B_MAGALETA_,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,86,131,125,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1809,B_SHECIL_,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,14,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,84,131,100,76,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1810,B_KATRINN_,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,131,150,1152,384,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1811,G_SMOKIE_,Smokie,Bandit,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,131,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1812,EVENT_LUDE,Lude,Delightful Lude,99,15,0,0,0,0,0,0,100,99,1,1,1,1,999,1,0,0,0,0,20,131,190,890,960,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1813,EVENT_HYDRO,Hydro,Hydrolancer,99,5880000,0,4000000,2000000,3,15000,40000,60,55,1,142,250,86,189,32,10,12,2,8,48,131,100,140,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1814,EVENT_MOON,Moonlight Flower,Moonlight Flower,80,30000,0,30000,30000,1,500,800,50,50,1,35,45,112,69,93,10,12,1,2,63,131,150,1276,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1815,EVENT_RICECAKE,Rice Cake,Rice Cake,12,20,0,0,0,1,1,2,100,99,1,1,1,1,1,1,0,0,1,0,20,131,2000,1320,0,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1816,EVENT_GOURD,Gourd,Gourd,12,1000,0,0,0,1,1,2,100,99,1,1,1,1,1,1,0,0,1,0,20,131,2000,96,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+6001,MER_LIF,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6002,MER_AMISTR,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6003,MER_FILIR,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6004,MER_VANILMIRTH,Vanilmirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6005,MER_LIF2,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6006,MER_AMISTR2,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6007,MER_FILIR2,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6008,MER_VANILMIRTH2,Vanimirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6009,MER_LIF_H,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6010,MER_AMISTR_H,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6011,MER_FILIR_H,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6012,MER_VANILMIRTH_H,Vanilmirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6013,MER_LIF_H2,Lif,Lif,1,150,40,0,0,2,0,0,0,0,12,20,15,35,24,14,10,0,0,7,20,145,150,700,0,300,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,5
+6014,MER_AMISTR_H2,Amistr,Amistr,1,320,10,0,0,2,0,0,0,0,20,17,35,11,24,13,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6015,MER_FILIR_H2,Filir,Filir,1,90,25,0,0,2,0,0,0,0,29,35,9,8,30,9,10,0,0,2,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
+6016,MER_VANILMIRTH_H2,Vanimirth,Vanilmirth,1,80,11,0,0,2,0,0,0,0,11,11,11,11,11,11,10,0,0,0,20,145,150,700,0,300,0,0,0,0,0,0,0,0,7004,2000,7054,5500,1000,250,997,30,512,0,757,250,985,163,0,0,0,0,4072,5
diff --git a/db/mob_db2.txt b/db/mob_db2.txt
index 37f64cc10..aa8552a77 100644
--- a/db/mob_db2.txt
+++ b/db/mob_db2.txt
@@ -1,52 +1,52 @@
-// Monsters Additional Database
-//
-// Structure of Database :
-// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
-
-// Crusader quest monsters with poring stats (No drops)
-1910,C_GHOUL,Ghoul,Ghoul,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1911,C_KHALITZBURG,Khalitzburg,Khalitzburg,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1912,C_INJUSTICE,Injustice,Injustice,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1913,C_REQUIEM,Requiem,Requiem,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1914,C_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Easter Event Monsters
-1920,EASTER_EGG,Easter Egg,Easter Egg,3,300,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,128,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,500,558,300,501,200,501,200,713,800,558,300,558,300,0,0,0,0
-1921,EASTER_BUNNY,Easter Bunny,Easter Bunny,6,1800,0,60,55,1,20,26,0,40,1,36,6,1,11,80,10,10,0,2,60,181,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,0,0,0,0,4006,70
-
-// eAthena Dev Team
-1900,VALARIS,Valaris,Valaris,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
-1901,VALARIS_WORSHIPPER,Valaris's Worshipper,Valaris's Worshipper,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1685,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,0,0,0,0,4129,1
-1902,MC_CAMERI,MC Cameri,MC Cameri,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
-1903,POKI,Poki#3,Poki#3,99,1349000,0,4093000,1526000,9,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,64,1973,120,500,672,480,92100,7000,603,5500,617,3000,1723,1000,1228,100,1236,500,617,2500,1234,75,1237,125,1722,250,1724,100,1720,50,0,0,0,0
-1904,SENTRY,Sentry,Sentry,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
-
-// Mobs used for eAthena's Custom Equipped Mobs
-1970,PORING_,Pet Poring,Pet Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,4001,20
-1971,CHONCHON__,Pet Chonchon,Pet Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,5
-1972,SPORE_,Pet Spore,Pet Spore,9,327,0,22,17,1,24,29,0,5,1,9,9,1,14,5,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,5000,507,800,510,50,743,5,2220,40,921,5,578,100,0,0,0,0,4022,5
-1973,PECOPECO_,Pet Peco Peco,Pet Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,649,200,1564,864,576,0,0,0,0,0,0,0,0,925,5500,2402,20,508,50,507,900,1604,100,582,60,0,0,0,0,0,0,4031,3
-1974,ORK_WARRIOR_,Pet Orc Warrior,Pet Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2693,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1975,MUNAK_,Pet Munak,Pet Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2693,200,2468,768,288,0,0,0,0,0,0,0,0,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,3
-1976,ISIS_,Pet Isis,Pet Isis,43,4828,0,2396,993,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,661,200,1384,768,336,0,0,0,0,0,0,0,0,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
-1977,POPORING_,Pet Poporing,Pet Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,1,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,729,5,0,0,0,0,0,0,0,0,4033,5
-1978,HUNTER_FLY_,Pet Hunter Fly,Pet Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2693,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
-1979,STEEL_CHONCHON_,Pet Steel Chonchon,Pet Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,651,150,1076,576,480,0,0,0,0,0,0,0,0,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,0,0,0,0,4042,1
-1980,PICKY__,Pet Picky,Pet Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,10
-1981,ROCKER_,Pet Rocker,Pet Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,0,0,0,0,4021,10
-1982,SMOKIE_,Pet Smokie,Pet Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,0,0,0,0,4044,1
-1983,YOYO_,Pet Yoyo,Pet Yoyo,19,879,0,148,93,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,5500,513,1500,508,100,919,5000,753,5,756,24,578,200,0,0,0,0,4051,1
-1984,LUNATIC_,Pet Lunatic,Pet Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,0,0,0,0,4006,15
-1985,POISON_SPORE_,Pet Poison Spore,Pet Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2693,200,1672,672,288,0,0,0,0,0,0,0,0,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,0,0,0,0,4048,2
-1986,BAPHOMET__,Pet Baphomet Jr.,Pet Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1685,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,0,0,0,0,4129,1
-1987,DESERT_WOLF_B_,Pet Baby Desert Wolf,Pet Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,649,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,60,517,600,2301,200,0,0,0,0,0,0,0,0,4023,10
-1988,DEVIRUCHI_,Pet Deviruchi,Pet Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,1685,150,980,600,384,0,0,0,0,0,0,0,0,1038,5500,1039,400,0,0,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
-1989,DOKEBI__,Pet Dokebi,Pet Dokebi,33,2697,0,889,455,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
-1990,DROPS_,Pet Drops,Pet Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,1,12,15,10,12,1,3,23,131,400,1452,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,0,0,0,0,4004,10
-1991,PETIT__,Pet Earth Petite,Pet Earth Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,661,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
-1992,SAVAGE_BABE_,Pet Savage Babe,Pet Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,0,0,0,0,4017,1
-1993,SOHEE_,Pet Sohee,Pet Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,300,2112,912,576,0,0,0,0,0,0,0,0,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,662,100,0,0,0,0,4100,1
-1994,BON_GUN_,Pet Bon Gun,Pet Bon Gun,32,3520,0,424,242,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,661,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,4212,1
-
-//Custom Fire Poring. Warning, Colides with META_DENIRO
-//1239,FIRE_PORING,Fire Poring,Fire Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,4001,20
+// Monsters Additional Database
+//
+// Structure of Database :
+// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
+
+// Crusader quest monsters with poring stats (No drops)
+1910,C_GHOUL,Ghoul,Ghoul,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1911,C_KHALITZBURG,Khalitzburg,Khalitzburg,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1912,C_INJUSTICE,Injustice,Injustice,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1913,C_REQUIEM,Requiem,Requiem,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1914,C_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Easter Event Monsters
+1920,EASTER_EGG,Easter Egg,Easter Egg,3,300,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,128,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,500,558,300,501,200,501,200,713,800,558,300,558,300,0,0,0,0
+1921,EASTER_BUNNY,Easter Bunny,Easter Bunny,6,1800,0,60,55,1,20,26,0,40,1,36,6,1,11,80,10,10,0,2,60,181,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,0,0,0,0,4006,70
+
+// eAthena Dev Team
+1900,VALARIS,Valaris,Valaris,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
+1901,VALARIS_WORSHIPPER,Valaris's Worshipper,Valaris's Worshipper,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1685,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,0,0,0,0,4129,1
+1902,MC_CAMERI,MC Cameri,MC Cameri,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
+1903,POKI,Poki#3,Poki#3,99,1349000,0,4093000,1526000,9,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,64,1973,120,500,672,480,92100,7000,603,5500,617,3000,1723,1000,1228,100,1236,500,617,2500,1234,75,1237,125,1722,250,1724,100,1720,50,0,0,0,0
+1904,SENTRY,Sentry,Sentry,99,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1973,100,1068,768,576,13000,5000,608,1000,750,400,923,3800,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,0,0,0,0,4147,1
+
+// Mobs used for eAthena's Custom Equipped Mobs
+1970,PORING_,Pet Poring,Pet Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,4001,20
+1971,CHONCHON__,Pet Chonchon,Pet Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,5
+1972,SPORE_,Pet Spore,Pet Spore,9,327,0,22,17,1,24,29,0,5,1,9,9,1,14,5,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,5000,507,800,510,50,743,5,2220,40,921,5,578,100,0,0,0,0,4022,5
+1973,PECOPECO_,Pet Peco Peco,Pet Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,649,200,1564,864,576,0,0,0,0,0,0,0,0,925,5500,2402,20,508,50,507,900,1604,100,582,60,0,0,0,0,0,0,4031,3
+1974,ORK_WARRIOR_,Pet Orc Warrior,Pet Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2693,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1975,MUNAK_,Pet Munak,Pet Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2693,200,2468,768,288,0,0,0,0,0,0,0,0,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,3
+1976,ISIS_,Pet Isis,Pet Isis,43,4828,0,2396,993,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,661,200,1384,768,336,0,0,0,0,0,0,0,0,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
+1977,POPORING_,Pet Poporing,Pet Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,1,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,729,5,0,0,0,0,0,0,0,0,4033,5
+1978,HUNTER_FLY_,Pet Hunter Fly,Pet Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2693,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
+1979,STEEL_CHONCHON_,Pet Steel Chonchon,Pet Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,651,150,1076,576,480,0,0,0,0,0,0,0,0,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,0,0,0,0,4042,1
+1980,PICKY__,Pet Picky,Pet Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,10
+1981,ROCKER_,Pet Rocker,Pet Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,0,0,0,0,4021,10
+1982,SMOKIE_,Pet Smokie,Pet Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,0,0,0,0,4044,1
+1983,YOYO_,Pet Yoyo,Pet Yoyo,19,879,0,148,93,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,5500,513,1500,508,100,919,5000,753,5,756,24,578,200,0,0,0,0,4051,1
+1984,LUNATIC_,Pet Lunatic,Pet Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,0,0,0,0,4006,15
+1985,POISON_SPORE_,Pet Poison Spore,Pet Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2693,200,1672,672,288,0,0,0,0,0,0,0,0,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,0,0,0,0,4048,2
+1986,BAPHOMET__,Pet Baphomet Jr.,Pet Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1685,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,0,0,0,0,4129,1
+1987,DESERT_WOLF_B_,Pet Baby Desert Wolf,Pet Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,649,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,60,517,600,2301,200,0,0,0,0,0,0,0,0,4023,10
+1988,DEVIRUCHI_,Pet Deviruchi,Pet Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,1685,150,980,600,384,0,0,0,0,0,0,0,0,1038,5500,1039,400,0,0,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
+1989,DOKEBI__,Pet Dokebi,Pet Dokebi,33,2697,0,889,455,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
+1990,DROPS_,Pet Drops,Pet Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,1,12,15,10,12,1,3,23,131,400,1452,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,0,0,0,0,4004,10
+1991,PETIT__,Pet Earth Petite,Pet Earth Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,661,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
+1992,SAVAGE_BABE_,Pet Savage Babe,Pet Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,0,0,0,0,4017,1
+1993,SOHEE_,Pet Sohee,Pet Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,300,2112,912,576,0,0,0,0,0,0,0,0,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,662,100,0,0,0,0,4100,1
+1994,BON_GUN_,Pet Bon Gun,Pet Bon Gun,32,3520,0,424,242,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,661,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,4212,1
+
+//Custom Fire Poring. Warning, Colides with META_DENIRO
+//1239,FIRE_PORING,Fire Poring,Fire Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,4001,20
diff --git a/db/mob_db_a.txt b/db/mob_db_a.txt
index c91dfc4e9..01ee1280f 100644
--- a/db/mob_db_a.txt
+++ b/db/mob_db_a.txt
@@ -1,819 +1,819 @@
-// Monster Database
-//
-// Structure of Database :
-// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
-// Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough
-
-1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1
-1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1
-1003,TESTEGG,Test Egg,Test Egg,2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1004,HORNET,Hornet,Hornet,8,169,0,19,15,1,22,27,5,5,1,20,8,10,17,5,10,12,0,4,24,137,150,1292,792,216,0,0,0,0,0,0,0,0,992,50,939,5500,909,3500,1208,15,511,350,518,100,0,0,0,0,0,0,4019,1
-1005,FARMILIAR,Familiar,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1
-1006,THIEF_BUG_LARVA,Thief Bug Larva,Thief Bug Larva,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1007,FABRE,Fabre,Fabre,2,63,0,3,2,1,7,10,0,0,1,2,4,1,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1
-1008,PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,1,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1
-1009,CONDOR,Condor,Condor,5,92,0,6,5,1,11,14,0,0,1,13,5,1,13,10,10,12,1,2,24,137,150,1148,648,480,0,0,0,0,0,0,0,0,917,6500,1702,150,715,80,1750,5500,517,400,916,2000,0,0,0,0,0,0,4015,1
-1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,129,200,1672,672,432,0,0,0,0,0,0,0,0,902,6100,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1
-1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1
-1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,129,200,2016,816,288,0,0,0,0,0,0,0,0,918,5500,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
-1013,WOLF,Wolf,Wolf,12,405,0,45,32,1,37,46,0,0,1,12,24,15,30,20,10,12,1,2,22,137,200,1054,54,432,0,0,0,0,0,0,0,0,1011,20,920,5500,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1
-1014,SPORE,Spore,Spore,9,327,0,22,17,1,24,29,0,5,1,9,9,1,14,5,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,5000,507,800,510,50,743,5,2220,40,7033,5,0,0,0,0,0,0,4022,1
-1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,1,15,1,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,957,5500,724,5,938,1000,958,50,727,55,0,0,0,0,0,0,0,0,4038,1
-1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,0,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,800,1701,150,0,0,0,0,4094,1
-1017,THIEF_BUG_FEMALE,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,651,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1
-1018,CREAMY,Creamy,Creamy,16,595,0,105,70,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,150,1136,720,840,0,0,0,0,0,0,0,0,924,5500,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1
-1019,PECOPECO,Peco Peco,Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,137,200,1564,864,576,0,0,0,0,0,0,0,0,925,5500,2402,20,508,50,507,900,1604,100,0,0,0,0,0,0,0,0,4031,1
-1020,MANDRAGORA,Mandragora,Mandragora,12,405,0,45,32,4,26,35,0,25,1,12,24,1,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,993,50,905,5500,1405,30,511,350,711,300,706,1,1967,10,0,0,0,0,4030,1
-1021,THIEF_BUG_MALE,Thief Bug Male,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,653,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
-1022,WEREWOLF,Werewolf,Werewolf,80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,163,200,1500,768,652,0,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0
-1023,ORK_WARRIOR,Orc Warrior,Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1024,WORM_TAIL,Wormtail,Wormtail,14,426,0,59,40,2,42,51,5,10,1,14,28,5,46,5,10,12,1,3,22,145,200,1048,48,192,0,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1
-1025,SNAKE,Snake,Boa,15,471,0,72,48,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,926,5500,1117,15,507,900,1011,35,937,800,954,1,0,0,0,0,0,0,4037,1
-1026,MUNAK,Munak,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2181,200,2468,768,288,0,0,0,0,0,0,0,0,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1
-1027,RAPTICE,Raptice,Raptice,17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,131,200,2000,1000,500,0,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1028,SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,1201,150,1216,50,0,0,0,0,4086,1
-1029,ISIS,Isis,Isis,43,4828,0,2396,993,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,149,200,1384,768,336,0,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
-1030,ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,300,149,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,1011,50,937,5500,1455,10,926,1500,936,200,508,150,756,38,0,0,0,0,4062,1
-1031,POPORING,Poporing,Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,1,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,512,5,1207,5,512,250,0,0,0,0,4033,1
-1032,VERIT,Verit,Verit,38,5272,0,835,517,1,389,469,0,5,1,19,38,1,38,20,10,12,1,1,29,131,250,2468,768,480,0,0,0,0,0,0,0,0,929,5335,912,700,930,1100,509,550,2609,1,2612,200,639,20,0,0,0,0,4107,1
-1033,ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,163,101,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1452,672,432,0,0,0,0,0,0,0,0,990,50,907,5500,1019,350,757,37,2329,30,690,100,604,100,0,0,0,0,4052,1
-1034,THARA_FROG,Thara Frog,Thara Frog,22,2152,0,219,138,1,105,127,0,10,1,22,22,5,34,10,10,12,1,5,41,129,200,2016,816,288,0,0,0,0,0,0,0,0,1011,45,908,5500,911,600,509,30,725,5,918,2000,0,0,0,0,0,0,4058,1
-1035,HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5335,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
-1036,GHOUL,Ghoul,Ghoul,39,5118,0,882,541,1,420,500,5,20,1,20,29,1,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,958,5335,756,110,509,670,511,800,2609,60,934,150,1260,0,0,0,0,0,4110,1
-1037,SIDE_WINDER,Side Winder,Side Winder,43,4929,0,1996,993,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,0,0,0,0,0,0,0,0,954,5335,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,0,0,0,0,4117,1
-1038,OSIRIS,Osiris,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,10,1,1,89,1205,100,1072,672,384,7710,5000,603,4000,608,3000,751,500,617,2000,1232,150,2235,200,1255,600,1009,1000,5053,150,984,3783,0,0,0,0,4144,1
-1039,BAPHOMET,Baphomet,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1205,100,1068,768,576,13000,5000,607,2000,750,500,923,5000,1466,200,2256,200,2607,800,714,500,617,3000,985,5432,984,4171,0,0,0,0,4147,1
-1040,GOLEM,Golem,Golem,25,3900,0,465,94,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,1
-1041,MUMMY,Mummy,Mummy,37,5176,0,488,314,1,305,360,0,10,1,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,930,5335,756,100,934,550,2604,1,2611,10,525,250,508,450,0,0,0,0,4106,1
-1042,STEEL_CHONCHON,Steel Chonchon,Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,139,150,1076,576,480,0,0,0,0,0,0,0,0,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,300,0,0,0,0,4042,1
-1043,SEAHORES,Seahorse,Seahorse,18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1044,OBEAUNE,Obeaune,Obeaune,31,3952,0,644,407,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,0,0,0,0,0,0,0,0,995,13,950,5500,5014,1,2326,10,720,10,951,500,748,25,0,0,0,0,4093,1
-1045,MARC,Marc,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,995,18,956,5335,756,95,951,1000,720,10,717,200,509,600,0,0,0,0,4105,1
-1046,DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,1205,100,480,480,288,5340,5000,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1
-1047,PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,1500,2102,2,507,400,507,400,713,1800,736,10,0,0,0,0,4007,1
-1048,THIEF_BUG_EGG,Thief Bug Egg,Thief Bug Egg,4,48,0,8,4,0,13,17,20,0,1,6,4,0,14,20,10,12,0,4,27,0,1000,701,1,1,0,0,0,0,0,0,0,0,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,250,0,0,0,0,4012,1
-1049,PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,1
-1050,PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,10,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,5015,10,507,600,519,300,715,50,10012,10,0,0,0,0,4011,1
-1051,THIEF_BUG,Thief Bug,Thief Bug,6,126,0,17,5,1,18,24,5,0,1,6,6,0,11,0,10,12,0,0,60,139,150,1288,288,768,0,0,0,0,0,0,0,0,955,2500,2304,80,507,350,909,2000,2303,120,1002,250,0,0,0,0,0,0,4016,1
-1052,ROCKER,Rocker,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,5000,1916,10,2298,4,1402,80,520,10,752,5,703,2,0,0,0,0,4021,1
-1053,THIEF_BUG_,Thief Bug Female,Thief Bug Female,10,170,0,0,0,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,139,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,300,0,0,0,0,4026,1
-1054,THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
-1055,MUKA,Muka,Muka,15,570,0,72,48,1,40,49,5,5,1,15,30,5,20,10,10,12,2,3,22,129,300,1960,960,384,0,0,0,0,0,0,0,0,993,70,952,5500,713,2000,511,400,507,1000,1451,50,1002,250,0,0,0,0,4036,1
-1056,SMOKIE,Smokie,Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,1,754,2,912,5,729,2,0,0,0,0,4044,1
-1057,YOYO,Yoyo,Yoyo,19,879,0,148,93,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,0,0,0,0,0,0,0,0,942,5500,513,1500,508,100,919,5000,753,5,756,24,0,0,0,0,0,0,4051,1
-1058,METALLER,Metaller,Metaller,22,926,0,241,152,1,131,159,15,30,1,22,22,20,49,50,10,12,1,4,23,139,200,1708,1008,540,0,0,0,0,0,0,0,0,990,60,940,6500,911,400,757,49,707,20,935,3000,1914,10,0,0,0,0,4057,1
-1059,MISTRESS,Mistress,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,1,165,60,95,70,130,10,12,0,4,84,1205,100,1148,648,300,2569,5000,996,1500,526,4000,722,3000,1413,150,518,10000,2249,250,616,1000,7018,10,985,4268,984,3300,0,0,0,0,4132,1
-1060,BIGFOOT,Bigfoot,Bigfoot,25,1619,0,310,188,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,948,5500,2289,5,919,5000,740,80,516,1500,518,400,756,43,0,0,0,0,4074,1
-1061,NIGHTMARE,Nightmare,Nightmare,49,4437,0,1729,1787,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,0,0,0,0,0,0,0,0,944,4947,510,500,2608,2,603,30,505,100,1261,1,984,60,0,0,0,0,4127,1
-1062,SANTA_PORING,Santa Poring,Santa Poring,3,69,0,4,5,1,12,16,0,0,1,14,3,10,12,90,10,12,1,3,26,129,400,1672,672,480,0,0,0,0,0,0,0,0,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,0,0,0,0,0,0,4005,1
-1063,LUNATIC,Lunatic,Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,515,2000,507,600,515,1100,622,20,0,0,0,0,4006,1
-1064,MEGALODON,Megalodon,Megalodon,24,1648,0,215,132,1,155,188,0,15,1,12,24,0,26,5,10,12,1,1,29,129,200,2492,792,432,0,0,0,0,0,0,0,0,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,0,0,0,0,4067,1
-1065,STROUF,Strouf,Strouf,40,9952,0,1238,752,1,200,350,5,50,1,40,45,72,43,65,10,12,2,5,61,2181,150,1872,672,384,0,0,0,0,0,0,0,0,951,5335,756,115,2241,2,1461,2,949,3000,720,20,956,1500,0,0,0,0,4111,1
-1066,VADON,Vadon,Vadon,19,1017,0,135,85,1,74,85,20,0,1,19,16,10,36,15,10,12,0,5,21,145,300,1632,432,540,0,0,0,0,0,0,0,0,991,35,960,5500,910,3000,2313,5,943,100,757,34,717,50,0,0,0,0,4049,1
-1067,CORNUTUS,Cornutus,Cornutus,23,1620,0,240,149,1,109,131,30,0,1,23,23,5,36,12,10,12,0,5,21,145,200,1248,48,480,0,0,0,0,0,0,0,0,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,0,0,0,0,4061,1
-1068,HYDRA,Hydra,Hydra,14,660,0,59,40,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,1011,25,962,5500,938,1500,971,20,525,5,517,700,0,0,0,0,0,0,4035,1
-1069,SWORD_FISH,Swordfish,Swordfish,30,4299,0,529,319,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,2181,200,1968,768,384,0,0,0,0,0,0,0,0,995,10,963,5500,756,33,2257,2,757,45,1117,25,956,600,0,0,0,0,4089,1
-1070,KUKRE,Kukre,Kukre,11,507,0,38,28,1,28,37,15,0,1,11,11,5,16,2,10,12,0,5,21,131,150,1776,576,288,0,0,0,0,0,0,0,0,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,0,0,0,0,4027,1
-1071,PIRATE_SKEL,Pirate Skeleton,Pirate Skeleton,25,1676,0,233,142,1,145,178,10,15,1,13,25,5,25,10,10,12,1,1,29,2181,200,1754,554,288,0,0,0,0,0,0,0,0,932,3000,2287,15,1125,25,2211,250,1104,250,756,43,628,20,0,0,0,0,4073,1
-1072,KAHO,Kaho,Kaho,60,8409,0,3990,450,1,110,760,5,50,1,55,43,88,80,46,10,12,1,6,83,2181,175,1700,1000,500,0,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1
-1073,CRAB,Crab,Crab,20,2451,0,163,101,1,71,81,35,0,1,20,15,1,36,15,7,12,0,5,21,129,200,992,792,360,0,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1
-1074,SHELLFISH,Shellfish,Shellfish,15,920,0,66,44,1,35,42,35,0,1,12,8,1,32,5,10,12,0,5,21,145,200,864,864,384,0,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1
-1075,TURTLE,Turtle,Turtle,3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,129,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1076,SKELETON,Skeleton,Skeleton,10,234,0,18,14,1,39,47,10,5,1,5,10,1,12,1,10,12,1,1,29,145,200,2228,528,576,0,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1
-1077,POISON_SPORE,Poison Spore,Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,5,0,0,0,0,4048,1
-1078,RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0
-1079,BLUE_PLANT,Blue Plant,Blue Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0
-1080,GREEN_PLANT,Green Plant,Green Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0
-1081,YELLOW_PLANT,Yellow Plant,Yellow Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0
-1082,WHITE_PLANT,White Plant,White Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0
-1083,SHINING_PLANT,Shining Plant,Shining Plant,1,20,0,0,0,1,1,2,100,99,1,1,1,1,1,90,7,12,0,3,26,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0
-1084,BLACK_MUSHROOM,Black Mushroom,Black Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0
-1085,RED_MUSHROOM,Red Mushroom,Red Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0
-1086,GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,64,126000,0,14300,7150,1,870,1145,60,45,1,75,35,45,85,150,10,12,2,4,43,171,100,768,768,480,1250,5000,2610,2000,701,1000,0,0,969,1000,1524,150,2246,250,10016,500,714,300,985,2000,984,1500,0,0,0,0,4128,1
-1087,ORK_HERO,Orc Hero,Orc Hero,77,295700,0,58630,32890,1,2257,2542,40,45,1,91,99,70,105,90,10,10,2,7,42,1205,150,1678,780,648,4500,5000,725,2000,607,1500,999,5000,968,9700,10018,500,1366,150,2106,250,1124,1000,985,4559,984,3589,0,0,0,0,4143,1
-1088,VOCAL,Vocal,Vocal,18,3016,0,110,88,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,2247,50,940,8000,721,1000,752,1500,912,5335,645,700,1917,10,0,0,0,0,4211,1
-1089,TOAD,Toad,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,10,1,5,21,1205,200,1236,336,432,0,0,0,0,0,0,0,0,2244,50,518,2000,729,1000,746,1500,970,100,971,100,0,0,0,0,0,0,4306,1
-1090,MASTERING,Mastering,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,10,1,3,21,1205,300,1072,672,480,0,0,0,0,0,0,0,0,2257,200,619,50,722,1000,512,18,512,8000,512,8000,531,4000,0,0,0,0,4197,1
-1091,DRAGON_FLY,Dragon Fly,Dragon Fly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,10,0,4,24,1205,100,1076,576,480,0,0,0,0,0,0,0,0,2245,200,501,8000,719,1500,742,2000,2607,3000,625,50,533,3000,0,0,0,0,4179,1
-1092,VAGABOND_WOLF,Vagabond Wolf,Vagabond Wolf,24,12240,0,247,176,1,135,159,10,0,1,45,48,20,50,65,10,10,1,2,22,1205,150,1048,648,432,0,0,0,0,0,0,0,0,2248,200,920,8000,728,1500,1148,100,517,8000,725,10,626,50,0,0,0,0,4183,1
-1093,ECLIPSE,Eclipse,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,10,0,2,60,1205,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,0,0,0,0,4266,1
-1094,AMBERNITE,Ambernite,Ambernite,13,495,0,57,38,1,39,46,30,0,1,13,13,5,18,5,10,12,2,4,21,145,400,2048,648,648,0,0,0,0,0,0,0,0,991,35,946,5500,910,1200,935,3000,943,2,757,14,1002,150,0,0,0,0,4032,1
-1095,ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,139,300,1288,288,384,0,0,0,0,0,0,0,0,955,5500,910,1000,938,500,993,40,1001,4,1002,350,757,28,0,0,0,0,4043,1
-1096,ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,2254,100,2324,60,610,500,2282,1,504,1000,512,28,714,40,0,0,0,0,4054,1
-1097,ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,320,935,2000,909,2000,938,650,713,2000,1002,200,0,0,0,0,0,0,4013,1
-1098,ANUBIS,Anubis,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,1717,200,2000,1000,500,0,0,0,0,0,0,0,0,2602,5,504,600,2601,5,1007,15,0,0,0,0,0,0,0,0,0,0,4138,1
-1099,ARGIOPE,Argiope,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,1685,300,1792,792,336,0,0,0,0,0,0,0,0,1042,5335,912,1200,757,175,2406,5,511,1500,719,10,0,0,0,0,0,0,4114,1
-1100,ARGOS,Argos,Argos,25,1117,0,388,188,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,0,0,0,0,0,0,0,0,1025,5500,911,1200,1042,500,757,61,511,670,508,250,10017,15,0,0,0,0,4075,1
-1101,BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1173,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,508,300,2405,50,0,0,0,0,4129,1
-1102,BATHORY,Bathory,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,1001,200,1061,4850,2252,3,1611,5,1000,30,1006,15,637,20,0,0,0,0,4119,1
-1103,CARAMEL,Caramel,Caramel,23,1424,0,264,162,1,90,112,5,5,1,23,46,5,38,10,10,12,0,2,22,145,200,1604,840,756,0,0,0,0,0,0,0,0,1027,5500,2310,5,919,5500,1455,10,1405,15,1408,20,0,0,0,0,0,0,4063,1
-1104,COCO,Coco,Coco,17,817,0,120,78,1,56,67,0,0,1,17,34,20,24,10,10,12,0,2,22,145,150,1864,864,1008,0,0,0,0,0,0,0,0,1026,5500,2502,20,914,3000,919,2500,516,500,2402,25,0,0,0,0,0,0,4041,1
-1105,DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,139,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
-1106,DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,141,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,0,0,0,0,4082,1
-1107,DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,80,517,600,2301,200,0,0,0,0,0,0,0,0,4023,1
-1108,DEVIACE,Deviace,Deviace,47,19192,0,2105,1329,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,995,25,1053,5335,1054,1000,5011,2,971,100,1256,3,756,161,0,0,0,0,4125,1
-1109,DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,1173,150,980,600,384,0,0,0,0,0,0,0,0,1038,5335,1039,400,984,2,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
-1110,DOKEBI,Dokebi,Dokebi,33,2697,0,889,455,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
-1111,DRAINLIAR,Drainliar,Drainliar,24,1162,0,431,176,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,149,250,1276,576,384,0,0,0,0,0,0,0,0,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,0,0,0,0,4069,1
-1112,DRAKE,Drake,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,1,80,49,75,79,50,10,12,1,1,29,1205,400,620,420,360,4300,5000,504,5000,719,500,0,0,1127,600,1125,950,1135,150,1128,400,5019,350,985,3200,984,2300,0,0,0,0,4137,1
-1113,DROPS,Drops,Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,1,12,15,10,12,1,3,23,131,400,1452,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,512,800,620,20,0,0,0,0,4004,1
-1114,DUSTINESS,Dustiness,Dustiness,21,1044,0,218,140,1,80,102,0,10,1,53,17,1,38,5,10,12,0,4,44,145,150,1004,504,384,0,0,0,0,0,0,0,0,1057,5500,1058,500,2291,4,928,2000,1001,10,507,1200,0,0,0,0,0,0,4056,1
-1115,EDDGA,Eddga,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,1,70,85,66,90,85,10,12,2,2,23,1205,300,872,1344,432,6179,5000,1029,5000,1030,1000,994,3000,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,0,0,0,0,4123,1
-1116,EGGYRA,Eggyra,Eggyra,24,633,0,215,220,1,85,107,20,25,1,36,24,1,32,1,10,12,1,0,48,145,200,1816,816,288,0,0,0,0,0,0,0,0,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,0,0,0,0,4070,1
-1117,EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,2890,1827,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,1173,300,2276,576,336,0,0,0,0,0,0,0,0,2217,10,1615,1,2508,2,1551,10,610,200,609,10,509,2000,0,0,0,0,4141,1
-1118,FLORA,Flora,Flora,26,2092,0,357,226,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,1032,5500,2253,3,704,10,521,50,629,20,905,2000,748,1,0,0,0,0,4080,1
-1119,FRILLDORA,Frilldora,Frilldora,30,2023,0,529,319,1,200,239,0,10,1,30,38,15,53,30,10,12,1,2,23,2181,300,1540,720,432,0,0,0,0,0,0,0,0,1012,5500,757,90,903,1500,721,15,715,200,507,800,912,120,0,0,0,0,4088,1
-1120,GHOSTRING,Ghostring,Ghostring,18,73300,0,101,108,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,1059,5335,2274,100,2336,50,604,500,603,10,714,30,695,100,0,0,0,0,4047,1
-1121,GIEARTH,Giearth,Giearth,29,2252,0,495,301,1,154,185,10,50,1,29,46,60,64,105,10,12,0,6,22,145,200,1848,1296,432,0,0,0,0,0,0,0,0,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,0,0,0,0,0,0,4087,1
-1122,GOBLIN_1,Goblin,Goblin,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1
-1123,GOBLIN_2,Goblin,Goblin,24,1034,0,287,176,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,998,250,911,1000,5010,3,1511,10,2104,1,507,550,2297,3,0,0,0,0,4060,1
-1124,GOBLIN_3,Goblin,Goblin,24,1034,0,357,176,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,998,230,911,1000,2275,3,5088,15,2104,1,507,550,508,120,0,0,0,0,4060,1
-1125,GOBLIN_4,Goblin,Goblin,23,1359,0,264,164,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,993,100,998,170,5087,15,2263,3,1508,10,2104,1,507,500,0,0,0,0,4060,1
-1126,GOBLIN_5,Goblin,Goblin,22,1952,0,241,152,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,998,150,911,800,1605,15,2104,1,5089,15,507,500,508,120,0,0,0,0,4060,1
-1127,HODE,Hode,Hode,26,2282,0,393,248,1,146,177,0,30,1,26,42,5,49,40,10,12,1,2,42,129,200,1480,480,720,0,0,0,0,0,0,0,0,993,120,1055,5500,757,70,938,3000,1146,10,7021,1,632,20,0,0,0,0,4081,1
-1128,HORN,Horn,Horn,18,659,0,134,86,1,58,69,10,0,1,18,28,10,47,15,10,12,1,4,22,145,200,1528,528,288,0,0,0,0,0,0,0,0,993,80,1011,35,947,5500,1452,15,935,5500,943,70,0,0,0,0,0,0,4045,1
-1129,HORONG,Horong,Horong,34,1939,0,786,479,1,275,327,99,50,1,34,10,1,50,1,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,0,0,0,0,4103,1
-1130,JAKK,Jakk,Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,1008,5,535,1000,0,0,0,0,0,0,4109,1
-1131,JOKER,Joker,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,1173,100,1364,864,432,0,0,0,0,0,0,0,0,912,2000,616,2,641,20,508,1000,1259,1,984,100,695,100,0,0,0,0,4139,1
-1132,KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,1173,350,528,1000,396,0,0,0,0,0,0,0,0,932,8000,985,191,5017,1,2108,2,1004,10,509,1000,1127,2,0,0,0,0,4136,1
-1133,KOBOLD_1,Kobold,Kobold,36,3893,0,988,625,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
-1134,KOBOLD_2,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1
-1135,KOBOLD_3,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,0,0,2104,3,508,100,0,0,0,0,4091,1
-1136,KOBOLD_4,Kobold,Kobold,30,3503,0,481,290,1,168,199,15,10,1,30,30,20,50,20,10,12,1,7,41,141,200,2200,1000,500,0,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1
-1137,KOBOLD_5,Kobold,Kobold,30,2462,0,481,290,1,168,199,15,10,1,30,60,20,45,20,10,12,1,7,42,141,200,2000,1000,500,0,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1
-1138,MAGNOLIA,Magnolia,Magnolia,26,3195,0,393,248,1,120,151,5,30,1,26,26,0,39,5,10,12,0,6,21,131,250,1560,360,360,0,0,0,0,0,0,0,0,7031,5500,910,800,911,100,912,10,737,20,508,250,0,0,0,0,0,0,4076,1
-1139,MANTIS,Mantis,Mantis,26,2472,0,393,248,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,0,0,0,0,0,0,0,0,993,110,1031,5500,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1
-1140,MARDUK,Marduk,Marduk,40,4214,0,1238,752,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,0,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1
-1141,MARINA,Marina,Marina,21,2087,0,218,140,1,84,106,0,5,1,21,21,1,36,10,10,12,0,3,41,129,400,2280,1080,864,0,0,0,0,0,0,0,0,1052,5000,938,1500,991,45,995,2,717,200,631,20,0,0,0,0,0,0,4055,1
-1142,MARINE_SPHERE,Marine Sphere,Marine Sphere,28,3518,0,461,284,1,120,320,0,40,1,28,28,1,33,50,10,12,0,3,21,0,800,1201,1,1,0,0,0,0,0,0,0,0,1050,5000,1051,2500,1520,10,720,10,717,150,10003,10,0,0,0,0,0,0,4084,1
-1143,MARIONETTE,Marionette,Marionette,41,3222,0,1078,1276,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,0,0,0,0,0,0,0,0,1060,4850,2294,5,2605,1,699,100,1520,15,2407,1,514,200,0,0,0,0,4113,1
-1144,MARSE,Marse,Marse,31,5034,0,586,370,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,1024,5000,962,3000,717,200,720,10,995,12,1007,5,514,200,0,0,0,0,4095,1
-1145,MARTIN,Martin,Martin,18,1109,0,134,86,1,52,63,0,5,1,18,30,15,15,5,10,12,0,2,42,129,300,1480,480,480,0,0,0,0,0,0,0,0,1017,6100,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1
-1146,MATYR,Matyr,Matyr,31,2585,0,967,407,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,0,0,0,0,0,0,0,0,2618,10,528,5000,919,5500,537,400,757,100,514,200,0,0,0,0,0,0,4097,1
-1147,MAYA,Maya,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,1,97,76,95,82,105,10,12,2,4,82,1205,100,864,1000,480,10500,5000,730,2000,603,3000,617,2000,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,0,0,0,0,4146,1
-1148,MEDUSA,Medusa,Medusa,79,22408,0,6876,4697,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,2000,1000,500,0,0,0,0,0,0,0,0,1048,5335,1965,250,702,200,2610,150,722,250,967,3500,1007,3,0,0,0,0,4124,1
-1149,MINOROUS,Minorous,Minorous,52,7431,0,2750,1459,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,0,0,0,0,0,0,0,0,941,5335,756,196,1361,2,1005,10,516,1500,1301,200,568,150,0,0,0,0,4126,1
-1150,MOONLIGHT,Moonlight Flower,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,1,99,55,82,95,120,10,10,1,6,63,1205,150,1276,576,288,1250,5000,1022,5000,504,1500,728,500,5008,1000,1234,100,1525,150,10008,500,638,650,985,2600,984,1900,0,0,0,0,4131,1
-1151,MYST,Myst,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,1,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,5005,2,1019,800,10005,10,756,65,757,97,605,20,514,35,0,0,0,0,4108,1
-1152,ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,315,194,1,190,236,10,10,1,14,18,1,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,922,5500,932,3500,757,80,2299,2,1358,10,511,50,0,0,0,0,0,0,4085,1
-1153,ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,196,120,1,151,184,5,10,1,12,24,1,24,5,10,12,1,1,29,2181,400,2852,1152,840,0,0,0,0,0,0,0,0,1043,5500,938,3000,714,1,0,0,0,0,0,0,0,0,0,0,0,0,4071,1
-1154,PASANA,Pasana,Pasana,61,8289,0,4087,2135,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,149,165,1700,1000,500,0,0,0,0,0,0,0,0,7110,4365,7121,2500,757,20,1105,500,1217,150,0,0,0,0,0,0,0,0,4099,1
-1155,PETIT,Petite,Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,149,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5335,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
-1156,PETIT_,Petite,Petite,45,5747,0,1758,1075,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,149,150,1420,1080,528,0,0,0,0,0,0,0,0,1036,5335,1037,300,985,61,509,1000,602,500,912,1500,606,15,0,0,0,0,4120,1
-1157,PHARAOH,Pharaoh,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,1205,125,2000,1000,500,4060,5000,607,5500,526,5000,732,5000,7113,5820,7114,2500,1136,100,2327,150,5002,500,1552,300,1231,80,0,0,0,0,4148,1
-1158,PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,145,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,5500,963,2000,720,5,517,1000,951,500,756,25,0,0,0,0,0,0,4077,1
-1159,PHREEONI,Phreeoni,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,10,2,2,60,1205,200,1020,1020,288,2700,5000,1008,500,730,1000,1000,4000,1015,9700,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,0,0,0,0,4121,1
-1160,PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,139,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
-1161,PLANKTON,Plankton,Plankton,10,354,0,23,18,1,26,31,0,5,1,10,10,1,15,1,10,12,0,3,61,129,400,2208,1008,324,0,0,0,0,0,0,0,0,1052,5500,910,300,938,700,970,2,713,1000,630,20,645,50,0,0,0,0,4024,1
-1162,RAFFLESIA,Rafflesia,Rafflesia,27,1950,0,388,242,7,105,120,20,10,1,27,54,1,76,27,10,10,0,3,22,128,200,1000,2652,1056,0,0,0,0,0,0,0,0,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,0,0,0,0,4083,1
-1163,RAYDRIC,Raydric,Raydric,52,8613,0,3410,1795,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,0,0,0,0,0,0,0,0,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,4850,0,0,0,0,4133,1
-1164,REQUIEM,Requiem,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,603,35,714,1,912,2500,958,3500,934,1500,2308,10,0,0,0,0,0,0,4104,1
-1165,SAND_MAN,Sandman,Sandman,34,3413,0,810,492,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1
-1166,SAVAGE,Savage,Savage,26,2092,0,357,226,1,120,150,10,5,1,26,54,10,37,15,10,12,2,2,42,145,150,1960,960,384,0,0,0,0,0,0,0,0,1028,5500,514,150,702,2,2276,1,605,10,757,70,526,1,0,0,0,0,4078,1
-1167,SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,0,0,0,0,4017,1
-1168,SCORPION_KING,Scorpion King,Scorpion King,50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,145,200,1700,1000,500,0,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1
-1169,SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,397,240,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,0,0,0,0,4092,1
-1170,SOHEE,Sohee,Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,300,2112,912,576,0,0,0,0,0,0,0,0,1020,5500,1049,50,2277,1,2504,5,1217,5,507,1000,662,350,0,0,0,0,4100,1
-1171,SOLDIER_ANDRE,Soldier Andre,Soldier Andre,22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1
-1172,SOLDIER_DENIRO,Soldier Deniro,Soldier Deniro,29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,149,200,2000,1000,500,0,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1
-1173,SOLDIER_PIERE,Soldier Piere,Soldier Piere,23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1
-1174,STAINER,Stainer,Stainer,16,538,0,105,70,1,53,64,10,0,1,40,16,5,30,5,10,12,0,4,24,145,200,1688,1188,612,0,0,0,0,0,0,0,0,992,60,1011,30,1013,5500,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1
-1175,TAROU,Tarou,Tarou,11,284,0,57,28,1,34,45,0,0,1,20,11,10,24,5,10,12,0,2,27,145,150,1744,1044,684,0,0,0,0,0,0,0,0,1016,5500,919,3000,949,800,528,1000,701,1,0,0,0,0,0,0,0,0,4028,1
-1176,VITATA,Vitata,Vitata,20,894,0,163,101,1,69,80,15,20,1,20,25,65,40,70,10,12,0,4,22,145,300,1768,768,384,0,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1
-1177,ZENORC,Zenorc,Zenorc,31,2585,0,967,407,1,188,223,0,15,1,77,15,1,76,10,10,12,1,7,27,131,150,1180,480,360,0,0,0,0,0,0,0,0,1044,5500,756,70,938,2500,1006,5,508,50,640,20,0,0,0,0,0,0,4096,1
-1178,ZEROM,Zerom,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,1002,300,0,0,0,0,4064,1
-1179,WHISPER,Whisper,Whisper,34,1796,0,591,599,1,180,221,0,45,1,51,14,1,60,1,10,12,0,6,68,149,150,1960,960,504,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1
-1180,NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,1650,825,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,1173,150,840,540,480,0,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1
-1181,ZOMBIE_DRAGON,Zombie Dragon,Zombie Dragon,1,1000,0,49500,1650,9,7900,9140,0,0,1,145,145,145,130,120,10,12,2,9,89,1205,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1182,THIEF_MUSHROOM,Thief Mushroom,Thief Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1183,CHONCHON_,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,2181,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1
-1184,FABRE_,Fabre,Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,2181,400,1672,672,480,0,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,4002,0
-1185,WHISPER_,Whisper,Whisper,34,1796,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,1,28,0,150,1960,960,504,0,0,0,0,0,0,0,0,1001,10,1059,100,2282,0,2333,1,0,0,0,0,0,0,0,0,0,0,4102,0
-1186,WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,6,48,1173,250,2536,1536,672,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4303,1
-1187,SWITCH,Switch,Switch,1,2,0,1,1,1,1,2,0,0,1,1,1,1,1,1,1,12,1,0,20,0,1,1,1,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
-1188,BON_GUN,Bongun,Bongun,32,3520,0,424,242,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,5046,1,609,15,508,1000,508,250,0,0,0,0,4212,1
-1189,ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,1729,1787,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,149,300,1960,620,480,0,0,0,0,0,0,0,0,1063,4656,1753,1000,1756,2500,1755,2500,1716,2,507,1400,509,900,0,0,0,0,4256,1
-1190,ORC_LORD,Orc Lord,Orc Lord,74,393000,0,62205,8580,1,2700,3150,40,5,1,82,149,70,110,85,10,12,2,7,82,1205,100,1248,500,360,12800,5000,968,5500,617,2000,0,0,1363,200,2601,500,5007,150,2627,1000,0,0,985,4268,984,3100,0,0,0,0,0,0
-1191,MIMIC,Mimic,Mimic,51,6120,0,165,165,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,0,0,0,0,0,0,0,0,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,0,0,0,0,4205,1
-1192,WRAITH,Wraith,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,1173,300,1816,576,240,0,0,0,0,0,0,0,0,1059,5820,2206,10,2506,2,716,650,602,1300,2505,10,731,5,0,0,0,0,4190,1
-1193,ALARM,Alarm,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,1173,300,1020,500,768,0,0,0,0,0,0,0,0,1095,5335,2607,1,7005,1500,611,1300,984,105,7026,20,912,1500,0,0,0,0,4244,1
-1194,ARCLOUSE,Arclouse,Arclouze,59,6075,0,860,1000,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,0,0,0,0,0,0,0,0,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,0,0,0,0,4240,1
-1195,RIDEWORD,Rideword,Rideword,59,11638,0,2007,3106,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,1173,150,864,500,192,0,0,0,0,0,0,0,0,1097,4850,1553,4,1554,4,1555,2,1556,2,7015,300,1006,20,0,0,0,0,4185,1
-1196,SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,2466,1562,1,660,890,10,20,1,20,36,1,76,25,10,12,1,1,69,141,350,1848,500,576,0,0,0,0,0,0,0,0,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,0,0,0,0,4222,1
-1197,ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,2635,1724,1,780,930,10,20,1,24,39,1,72,25,10,12,1,1,69,141,350,1768,500,192,0,0,0,0,0,0,0,0,1099,3500,7016,105,2266,1,716,600,930,3500,2408,39,985,112,0,0,0,0,4275,1
-1198,DARK_PRIEST,Dark Priest,Dark Priest,59,9660,0,3320,2974,1,298,370,30,60,1,54,38,95,82,60,10,12,1,7,87,141,200,1500,500,1000,0,0,0,0,0,0,0,0,1557,5,2608,30,505,100,716,450,1009,50,2319,5,1241,1,0,0,0,0,4171,1
-1199,PUNK,Punk,Punk,43,3620,0,1699,1033,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,0,0,0,0,0,0,0,0,7001,5335,715,800,10004,100,1061,1000,1057,3000,601,1100,2502,15,0,0,0,0,4313,1
-1200,ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,3608,2304,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,160,384,0,0,0,0,0,0,0,0,7017,5,509,800,7293,1500,2331,8,2622,1,1970,100,2291,3,0,0,0,0,4277,1
-1201,RYBIO,Rybio,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,141,200,1500,500,1000,0,0,0,0,0,0,0,0,1015,3880,7017,3,509,800,731,30,1008,10,984,100,0,0,0,0,0,0,4194,1
-1202,PHENDARK,Phendark,Phendark,73,22729,0,6826,3443,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,141,175,1500,500,1000,0,0,0,0,0,0,0,0,1015,3880,7017,4,509,800,0,0,984,150,0,0,0,0,0,0,0,0,4329,1
-1203,MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,1205,250,1152,500,240,0,0,0,0,0,0,0,0,7019,1,7297,1500,1152,70,1155,40,1163,2,999,120,984,243,0,0,0,0,4207,1
-1204,TIRFING,Tirfing,Ogretooth,71,29900,0,5412,4235,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,1205,100,816,500,240,0,0,0,0,0,0,0,0,7022,1,638,50,7292,1500,1214,70,1217,40,999,120,984,189,0,0,0,0,4254,1
-1205,EXECUTIONER,Executioner,Executioner,65,28980,0,4730,3536,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,1205,200,768,500,384,0,0,0,0,0,0,0,0,7024,5,7290,1500,1111,80,1114,60,1125,40,999,120,984,145,0,0,0,0,4250,1
-1206,ANOLIAN,Anolian,Anolian,63,18960,0,4378,2907,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,1173,200,900,500,864,0,0,0,0,0,0,0,0,7003,4850,1754,2000,526,5,10019,10,943,5335,2625,1,984,134,0,0,0,0,4234,1
-1207,STING,Sting,Sting,61,9500,0,4081,2970,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,1173,300,528,500,240,0,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,719,3,0,0,0,0,4226,1
-1208,WANDER_MAN,Wander Man,Wanderer,74,8170,0,5786,4730,2,450,550,5,5,1,192,38,45,127,85,10,12,1,6,24,1173,100,672,500,192,0,0,0,0,0,0,0,0,7005,4850,616,1,723,500,2270,5,610,650,984,217,608,3,0,0,0,0,4210,1
-1209,CRAMP,Cramp,Cramp,56,4720,0,2300,1513,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,150,510,70,984,95,0,0,0,0,4296,1
-1210,FILAMENTOUS,Filamentous,Filamentous,51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1
-1211,BRILIGHT,Brilight,Brilight,46,5562,0,1826,1331,1,298,383,30,5,1,90,15,10,50,35,10,12,0,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,602,1000,757,220,610,250,509,1600,0,0,0,0,4213,1
-1212,IRON_FIST,Iron Fist,Iron Fist,47,4221,0,1435,1520,1,430,590,40,5,1,25,15,10,81,20,10,12,1,4,60,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1
-1213,HIGH_ORC,High Orc,High Orc,52,6890,0,3618,1639,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1173,150,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1
-1214,CHOCO,Choco,Choco,43,4278,0,1265,1265,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,532,1000,607,25,0,0,0,0,4285,1
-1215,STEM_WORM,Stem Worm,Stem Worm,40,6136,0,1452,939,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7012,5335,509,1800,1968,10,756,115,997,5,1454,20,608,45,0,0,0,0,4224,1
-1216,PENOMENA,Penomena,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,1173,400,832,500,600,0,0,0,0,0,0,0,0,7013,4850,962,8000,938,7000,525,200,719,15,1258,1,716,550,0,0,0,0,4314,1
-1219,KNIGHT_OF_ABYSS,Knight of Abyss,Abysmal Knight,79,36140,0,8469,6268,1,1600,2150,55,50,1,68,64,25,135,50,10,12,2,7,87,1685,300,1500,500,1000,0,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1410,25,1162,1,985,369,984,259,0,0,0,0,4140,1
-1220,M_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,1717,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1
-1221,M_SAVAGE,Savage,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,1717,150,1960,960,384,0,0,0,0,0,0,0,0,1028,6000,656,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1
-1222,L_HIGH_ORC,High Orc,High Orc,52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,502,1100,0,0,0,0,4066,1
-1223,L_ORC,Orc,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,1717,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1224,L_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,1717,200,1672,672,288,0,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1
-1225,L_CHOCO,Choco,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1
-1226,L_KOBOLD,Kobold,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,1717,200,1028,528,360,0,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
-1227,L_GOBLIN,Goblin,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,1717,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,0,0,0,0,4060,1
-1228,L_PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,1717,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1
-1229,META_FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,1,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1
-1230,META_PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1
-1231,META_CREAMY,Creamy,Creamy,16,595,0,96,64,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,200,1220,720,288,0,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1
-1232,META_PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1
-1233,CONCEIVE_PECOPECO,Peco Peco,Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,129,200,1564,864,576,0,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,0,0,0,0,0,0,4031,1
-1234,PROVOKE_YOYO,Yoyo,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,6000,513,2000,508,130,919,5500,753,7,0,0,0,0,0,0,0,0,4051,1
-1235,SMOKING_ORC,Smoking Orc,Smoking Orc,24,1400,0,261,160,1,114,136,10,20,1,24,48,20,34,1,10,12,1,7,22,653,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1236,META_ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1
-1237,META_ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,651,300,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1000,935,3000,1001,6,1002,350,757,28,0,0,0,0,4043,1
-1238,META_PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,651,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
-1239,META_DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,651,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
-1240,META_PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,1,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,2302,150,507,650,519,350,715,60,0,0,0,0,0,0,4008,1
-1241,META_SHELL_PICKY,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,1,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,5015,7,507,750,519,350,715,60,0,0,0,0,0,0,4011,1
-1242,MARIN,Marin,Marin,15,742,0,66,44,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,910,3200,938,1500,700,100,720,40,510,75,529,350,5035,1,0,0,0,0,4196,1
-1243,SASQUATCH,Sasquatch,Sasquatch,30,3163,0,529,319,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,1173,300,1260,192,192,0,0,0,0,0,0,0,0,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,0,0,0,0,4216,1
-1244,JAKK_XMAS,Christmas Jakk,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,644,20,7175,1200,7174,1200,0,0,0,0,4109,1
-1245,GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,7174,550,7175,550,756,43,644,10,1211,10,2104,5,2236,10,0,0,0,0,4060,1
-1246,COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,461,284,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,538,1500,722,45,912,200,2502,25,644,5,688,100,507,700,0,0,0,0,4235,1
-1247,ANTONIO,Antonio,Antonio,10,10,0,3,2,1,13,20,99,0,1,1,1,50,100,100,10,12,1,3,66,129,100,720,720,432,0,0,0,0,0,0,0,0,7034,10000,644,200,538,1500,539,1000,529,5500,530,5500,2236,250,0,0,0,0,4243,1
-1248,CRUISER,Cruiser,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,133,400,1296,1296,432,0,0,0,0,0,0,0,0,1098,900,2251,2,998,320,996,5,911,3500,719,35,756,87,0,0,0,0,4297,1
-1249,MYSTCASE,Myst Case,Myst Case,38,3450,0,1113,688,1,160,360,5,10,1,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,530,90,912,1500,603,20,539,800,722,150,731,5,529,340,0,0,0,0,4206,1
-1250,CHEPET,Chepet,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,1173,400,672,672,288,0,0,0,0,0,0,0,0,7035,2500,912,750,512,5500,619,40,10019,5,508,300,2508,5,0,0,0,0,4284,1
-1251,KNIGHT_OF_WINDSTORM,Knight of Windstorm,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,1,185,83,55,130,79,10,12,2,0,84,1205,200,468,468,288,31200,5000,720,4500,2406,500,995,3000,1468,150,603,3000,617,4000,2621,200,2506,500,985,4559,5007,1,0,0,0,0,4318,1
-1252,GARM,Garm,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,1,126,82,65,95,60,10,12,2,2,81,1205,400,608,408,336,28473,5000,7036,1000,603,3000,995,3000,7036,5500,1131,150,1256,500,1815,500,0,0,985,3977,984,2900,0,0,0,0,4324,1
-1253,GARGOYLE,Gargoyle,Gargoyle,48,3950,0,1650,1650,9,290,360,10,10,1,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,912,3880,1039,500,0,0,0,0,2619,1,1769,2000,757,238,0,0,0,0,4149,1
-1254,RAGGLER,Raggler,Raggler,21,1020,0,218,140,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,1173,200,1000,900,384,0,0,0,0,0,0,0,0,7053,3000,916,5000,645,200,514,100,992,90,2225,7,756,32,0,0,0,0,4186,1
-1255,NERAID,Neraid,Nereid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,1173,200,776,576,288,0,0,0,0,0,0,0,0,1055,5100,7053,1000,510,230,1966,10,514,250,757,180,985,37,0,0,0,0,4167,1
-1256,PEST,Pest,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,1173,200,700,648,480,0,0,0,0,0,0,0,0,1055,5500,7054,200,702,10,605,100,716,250,0,0,756,115,0,0,0,0,4315,1
-1257,INJUSTICE,Injustice,Injustice,51,7600,0,2118,1488,1,480,600,0,0,1,42,39,1,71,35,10,12,1,1,47,1173,400,770,720,336,0,0,0,0,0,0,0,0,999,300,7054,5335,7053,3500,2313,5,2316,2,660,2,1255,2,0,0,0,0,4268,1
-1258,GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,461,284,9,89,113,0,0,1,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,2297,3,998,250,911,1000,1765,3000,507,600,1705,25,514,150,0,0,0,0,4157,1
-1259,GRYPHON,Gryphon,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,1205,100,704,504,432,0,0,0,0,0,0,0,0,7048,2500,7054,5335,7063,120,1452,1500,1417,1,984,185,996,150,0,0,0,0,4163,1
-1260,DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,3652,3271,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,1173,200,920,720,200,0,0,0,0,0,0,0,0,7054,4656,734,1000,2505,30,0,0,0,0,1000,80,747,3,0,0,0,0,4170,1
-1261,WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,1113,688,1,315,360,0,15,1,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,7053,5335,748,50,5037,120,1767,3000,624,35,528,600,2244,2,0,0,0,0,4257,1
-1262,MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,1205,250,1280,1080,240,0,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,400,7296,1500,505,150,0,0,0,0,4203,1
-1263,WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,2118,1488,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,1173,150,1056,1056,336,0,0,0,0,0,0,0,0,912,4559,932,6000,7005,500,693,100,1611,8,996,100,1615,1,0,0,0,0,4264,1
-1264,MERMAN,Merman,Merman,53,12300,0,3345,2054,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,1173,200,916,816,336,0,0,0,0,0,0,0,0,1054,1300,523,300,568,200,720,40,995,35,1460,3,756,203,0,0,0,0,4199,1
-1265,COOKIE,Cookie,Cookie,25,950,0,310,188,1,130,153,0,25,1,35,20,53,37,90,10,12,0,7,60,137,200,1036,936,240,0,0,0,0,0,0,0,0,538,1000,530,150,979,1,645,280,2402,30,12001,100,529,320,0,0,0,0,4293,1
-1266,ASTER,Aster,Aster,18,1452,0,122,78,1,56,64,0,10,1,19,15,1,34,5,10,12,0,5,22,145,400,1264,864,216,0,0,0,0,0,0,0,0,938,500,7013,40,1052,1200,508,200,912,60,512,100,0,0,0,0,0,0,4247,1
-1267,CARAT,Carat,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,7054,3200,536,1000,2409,5,5003,1,0,0,0,0,509,450,0,0,0,0,4288,1
-1268,BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,10120,6820,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,7054,4850,2229,45,2317,5,2106,65,1170,1,1417,2,985,433,0,0,0,0,4320,1
-1269,CLOCK,Clock,Clock,60,11050,0,3410,2904,2,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,1095,5335,1019,800,509,900,568,220,7026,30,7027,30,985,163,0,0,0,0,4299,1
-1270,C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,4378,2850,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,1095,5335,7054,5335,999,500,520,850,2109,1,7026,2000,7027,2000,0,0,0,0,4229,1
-1271,ALLIGATOR,Alligator,Alligator,42,6962,0,1379,866,1,315,360,2,5,1,45,50,10,82,65,10,12,1,2,21,145,200,1100,900,480,0,0,0,0,0,0,0,0,912,1000,1099,600,7003,2000,608,50,0,0,0,0,756,129,0,0,0,0,4252,1
-1272,DARK_LORD,Dark Lord,Dark Lord,80,360000,0,65780,45045,2,2800,3320,30,70,1,120,64,118,99,60,10,12,2,6,89,1205,100,868,768,480,36500,5000,7005,6000,5093,500,617,2000,1615,800,5017,550,1237,300,2334,300,2507,100,985,5141,984,3977,0,0,0,0,4168,1
-1273,ORC_LADY,Orc Lady,Orc Lady,31,2000,0,644,407,1,135,170,10,10,1,42,25,15,69,55,10,12,1,7,42,1173,200,1050,900,288,0,0,0,0,0,0,0,0,7053,4656,998,300,2602,1,2206,1,1352,10,508,900,2338,1,0,0,0,0,4255,1
-1274,MEGALITH,Megalith,Megalith,45,5300,0,1758,1075,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,912,100,7049,1000,617,1,0,0,0,0,985,61,757,207,0,0,0,0,4200,1
-1275,ALICE,Alice,Alice,62,10000,0,3583,2400,1,550,700,5,5,1,64,42,85,100,130,10,12,1,7,60,145,200,1152,185,480,0,0,0,0,0,0,0,0,7047,2500,637,40,2407,3,739,30,5085,1,508,400,12002,100,0,0,0,0,4253,1
-1276,RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,3025,2125,9,415,500,35,5,1,25,22,5,145,35,10,12,1,6,47,133,200,1152,1152,480,0,0,0,0,0,0,0,0,7054,4656,0,0,2315,2,1701,150,1764,2000,1715,3,985,106,0,0,0,0,4187,1
-1277,GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,1238,752,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,2000,1019,2000,1501,100,662,200,2272,1,508,150,686,100,0,0,0,0,4283,1
-1278,STALACTIC_GOLEM,Stalactic Golem,Stalactic Golem,60,18700,0,3872,2695,1,950,1130,50,5,1,45,85,5,75,25,10,12,2,0,80,145,200,1264,864,288,0,0,0,0,0,0,0,0,7004,2000,7054,4850,1000,250,997,30,757,250,0,0,985,163,0,0,0,0,4223,1
-1279,TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,386,220,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,1173,200,860,660,624,0,0,0,0,0,0,0,0,7053,100,943,380,606,200,993,160,1001,140,0,0,757,106,0,0,0,0,4308,1
-1280,STEAM_GOBLIN,Steam Goblin,Goblin Steamrider,35,2490,0,864,495,1,234,269,20,5,1,59,32,15,75,25,10,12,1,7,44,145,200,1008,1008,528,0,0,0,0,0,0,0,0,911,2500,7053,3880,998,300,999,55,1003,320,1003,320,757,124,0,0,0,0,4156,1
-1281,SAGEWORM,Sage Worm,Sage Worm,43,3850,0,1155,1320,1,120,280,0,50,1,52,24,88,79,55,10,12,0,2,60,145,200,936,936,288,0,0,0,0,0,0,0,0,693,100,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1
-1282,KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,739,455,9,155,185,10,5,1,20,15,30,100,25,10,12,0,7,23,133,200,1008,1008,384,0,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1
-1283,CHIMERA,Chimera,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,1205,200,772,672,360,0,0,0,0,0,0,0,0,7054,5335,1048,2500,657,500,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1
-1284,HUGELING,Hugeling,Hugeling,1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,145,200,1872,672,480,0,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0
-1285,ARCHER_GUARDIAN,Archer Guardian,Archer Guardian,74,28634,0,1,1,12,1120,1600,35,60,1,80,80,90,165,55,14,16,2,7,80,165,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1286,KNIGHT_GUARDIAN,Knight Guardian,Knight Guardian,86,30214,0,1,1,2,1280,1560,55,30,1,40,140,65,125,65,14,16,2,7,80,165,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1287,SOLDIER_GUARDIAN,Soldier Guardian,Soldier Guardian,56,15670,0,1,1,1,873,1036,35,0,1,56,100,45,103,43,10,12,0,4,22,165,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1288,EMPERIUM,Emperium,Emperium,90,68430,0,109,71,1,60,71,40,50,1,17,80,50,26,20,10,12,0,8,26,0,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1289,MAYA_PUPLE,Maya Purple,Maya Purple,81,54331,0,10496,3893,2,1446,1999,68,48,1,90,80,95,90,119,10,12,2,4,82,1205,100,1024,1000,480,0,0,0,0,0,0,0,0,7053,4413,757,250,756,300,969,100,984,150,10006,1,639,50,0,0,0,0,4198,1
-1290,SKELETON_GENERAL,Skeleton General,Skeleton General,73,17043,0,8170,3370,1,910,1089,25,25,1,25,40,20,77,25,10,12,1,1,29,1173,150,2276,576,432,0,0,0,0,0,0,0,0,7068,2550,756,160,508,800,1220,35,1219,80,1222,3,2274,1,0,0,0,0,4221,1
-1291,WRAITH_DEAD,Wraith Dead,Wraith Dead,74,42131,0,10341,3618,2,1366,1626,25,30,1,99,55,95,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,1059,4413,2206,10,2506,8,716,700,732,5,603,100,568,150,0,0,0,0,4189,1
-1292,MINI_DEMON,Mini Demon,Mini Demon,68,31865,0,8396,3722,1,1073,1415,30,25,1,75,40,55,89,42,10,12,0,6,27,1173,150,1000,600,384,0,0,0,0,0,0,0,0,1038,4413,1039,450,2255,3,757,160,912,2500,1009,10,1410,3,0,0,0,0,4204,1
-1293,CREMY_FEAR,Creamy Fear,Creamy Fear,62,13109,0,7365,2691,2,667,830,45,30,1,40,16,15,68,55,10,12,0,4,24,1173,155,1136,720,840,0,0,0,0,0,0,0,0,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,0,0,0,0,4298,1
-1294,KILLER_MANTIS,Killer Mantis,Killer Mantis,56,12911,0,6509,2366,1,764,927,35,20,1,26,24,5,75,40,10,12,1,4,22,1173,175,1528,660,432,0,0,0,0,0,0,0,0,1031,4550,943,2500,721,10,509,5,514,25,1262,1,2108,1,0,0,0,0,4301,1
-1295,OWL_BARON,Owl Baron,Owl Baron,75,59489,0,10967,4811,2,1252,1609,65,25,1,25,80,95,95,55,10,12,2,6,60,1205,175,1345,824,440,0,0,0,0,0,0,0,0,7071,3500,7063,2500,1716,2,1472,1,1402,25,693,100,5045,5,0,0,0,0,4238,1
-1296,KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,17935,0,7432,2713,1,649,957,37,37,1,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,999,450,1034,6305,912,1200,1511,6,1613,2,525,150,526,100,0,0,0,0,4291,1
-1297,ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,8040,3499,1,836,1129,27,27,1,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,930,4413,934,1800,2624,1,2611,150,508,350,756,150,757,100,0,0,0,0,4248,1
-1298,ZOMBIE_MASTER,Zombie Master,Zombie Master,62,13917,0,7610,2826,1,824,1084,37,26,1,20,30,5,77,35,10,12,1,1,29,1173,175,2612,912,288,0,0,0,0,0,0,0,0,7071,4413,938,1500,958,1500,723,200,727,100,1260,1,2324,2,0,0,0,0,4274,1
-1299,GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,19735,0,6036,2184,1,663,753,48,16,1,55,37,30,69,58,10,12,1,8,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,7054,1500,999,800,756,120,5090,50,2106,2,508,650,5113,10,0,0,0,0,4155,1
-1300,CATERPILLAR,Caterpillar,Caterpillar,64,14140,0,6272,3107,1,895,1448,47,29,1,25,85,15,69,45,10,12,0,4,22,1173,300,1672,672,480,0,0,0,0,0,0,0,0,949,3000,7054,5335,2227,20,1000,100,997,50,505,12,508,500,0,0,0,0,4289,1
-1301,AM_MUT,Am Mut,Am Mut,61,11848,0,7709,2690,1,1041,1123,50,10,1,65,40,35,83,45,10,12,0,6,27,1173,200,1156,456,384,0,0,0,0,0,0,0,0,1021,4550,757,250,1517,3,969,5,2282,1,616,1,746,250,0,0,0,0,4245,1
-1302,DARK_ILLUSION,Dark Illusion,Dark Illusion,77,101487,0,11163,4181,2,1300,1982,64,70,1,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,1615,3,5017,2,2508,3,7054,5335,522,120,504,550,1162,2,0,0,0,0,4169,1
-1303,GIANT_HONET,Giant Hornet,Giant Hornet,56,12834,0,5785,2006,1,650,851,38,43,1,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,0,0,0,0,4271,1
-1304,GIANT_SPIDER,Giant Spider,Giant Spider,55,11628,0,6211,2146,1,625,802,41,28,1,36,43,5,73,69,10,12,2,4,25,1173,165,1468,468,768,0,0,0,0,0,0,0,0,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,0,0,0,0,4270,1
-1305,ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,8174,3782,1,947,1115,35,30,1,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,1042,4413,912,2500,2406,9,719,15,1096,680,938,3500,7054,2500,0,0,0,0,4249,1
-1306,LEIB_OLMAI,Leib Olmai,Leib Olmai,58,24223,0,6011,2171,1,740,1390,27,31,1,35,95,5,64,85,10,12,2,2,22,1173,175,1260,230,192,0,0,0,0,0,0,0,0,948,4550,2289,8,740,120,518,500,526,0,969,5,7053,800,0,0,0,0,4188,1
-1307,CAT_O_NINE_TAIL,Cat o' Nine Tails,Cat o' Nine Tails,76,64512,0,10869,4283,1,1112,1275,61,55,1,75,55,82,86,120,10,12,1,6,63,1205,155,1276,576,288,0,0,0,0,0,0,0,0,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,0,0,0,0,4290,1
-1308,PANZER_GOBLIN,Panzer Goblin,Panzer Goblin,59,13838,0,7212,2697,1,682,877,41,28,1,60,40,20,81,160,10,12,1,7,44,1173,200,960,1008,840,0,0,0,0,0,0,0,0,7053,4413,7054,3500,999,180,998,360,1003,580,744,800,994,160,0,0,0,0,4310,1
-1309,GAJOMART,Gajomart,Gajomart,63,13699,0,6625,2900,1,916,948,85,50,1,34,10,5,75,140,10,12,0,0,83,1173,300,1000,1152,828,0,0,0,0,0,0,0,0,953,6500,912,2300,508,870,2279,8,1752,10000,999,640,994,180,0,0,0,0,4151,1
-1310,MAJORUROS,Majoruros,Majoruros,66,57991,0,8525,3799,1,781,1301,10,25,1,50,75,50,85,48,10,12,2,2,43,1173,250,1100,960,780,0,0,0,0,0,0,0,0,941,4413,1361,4,568,300,984,16,509,850,2611,160,1000,250,0,0,0,0,4201,1
-1311,GULLINBURSTI,Gullinbursti,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,1,25,60,5,70,45,10,12,2,2,42,1173,150,1960,960,384,0,0,0,0,0,0,0,0,1028,3500,514,290,702,6,2276,1,605,15,2627,1,912,160,0,0,0,0,4164,1
-1312,TURTLE_GENERAL,Turtle General,Turtle General,97,320700,0,18202,9800,1,2438,3479,50,54,1,45,55,65,105,164,10,12,2,2,42,1205,200,900,1000,500,39805,5000,967,5500,607,1500,617,2000,1529,8,1306,5,0,0,1417,9,7070,5335,1141,80,658,1,0,0,0,0,4305,1
-1313,MOBSTER,Mobster,Mobster,61,11347,0,4424,1688,1,910,1128,41,37,1,46,20,35,76,55,10,12,1,7,20,1173,250,1100,560,580,0,0,0,0,0,0,0,0,1239,3,726,4559,2621,1,716,600,912,2500,525,450,505,60,0,0,0,0,4317,1
-1314,PERMETER,Permeter,Permeter,63,8228,0,3756,1955,2,943,1212,46,45,1,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,967,4413,7070,45,1019,1240,507,2450,912,1240,522,25,605,1,0,0,0,0,4311,1
-1315,ASSULTER,Assaulter,Assaulter,71,15861,0,4854,2654,2,764,1499,35,28,1,74,10,35,100,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,967,4413,7069,1200,7072,840,508,1280,912,1240,522,45,603,1,0,0,0,0,4246,1
-1316,SOLIDER,Solider,Solider,70,12099,0,4458,1951,2,796,978,57,43,1,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,64,7067,850,508,2100,912,1240,518,850,1519,1,0,0,0,0,4220,1
-1317,FUR_SEAL,Fur Seal,Seal,63,9114,0,3765,1824,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,149,250,1612,622,583,0,0,0,0,0,0,0,0,912,4365,510,250,2310,5,7053,1200,1452,1,525,200,746,120,0,0,0,0,4312,1
-1318,HEATER,Heater,Heater,68,11020,0,3766,2359,2,682,1007,40,42,1,47,25,5,71,100,10,12,1,2,43,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,750,697,100,912,1640,526,140,7054,600,7068,1250,0,0,0,0,4331,1
-1319,FREEZER,Freezer,Freezer,72,8636,0,3665,2197,1,672,984,55,43,1,41,59,5,67,100,10,12,1,2,41,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,850,7066,1250,912,1800,526,160,7053,600,689,100,0,0,0,0,4319,1
-1320,OWL_DUKE,Owl Duke,Owl Duke,75,26623,0,7217,3474,1,715,910,27,49,1,45,40,75,79,88,10,12,2,6,60,1205,195,1345,824,440,0,0,0,0,0,0,0,0,7071,4413,7063,1500,693,100,747,1,1451,3,1513,2,5045,1,0,0,0,0,4237,1
-1321,DRAGON_TAIL,Dragon Tail,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,1,68,15,5,67,67,10,12,1,4,44,1173,175,862,534,312,0,0,0,0,0,0,0,0,7064,4413,1096,400,943,800,2207,8,2226,2,601,300,602,150,0,0,0,0,4178,1
-1322,SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,3982,1766,1,585,813,29,21,1,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7054,3500,7053,2500,949,2500,511,4500,508,800,510,200,509,800,0,0,0,0,4227,1
-1323,SEE_OTTER,Sea Otter,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,1,36,40,25,82,65,10,12,1,2,61,149,190,1132,583,532,0,0,0,0,0,0,0,0,722,150,965,5500,7065,4365,725,50,726,50,746,650,7053,1200,0,0,0,0,4326,1
-1324,TREASURE_BOX1,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1325,TREASURE_BOX2,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7073,80,658,500,604,10000,984,4850,985,7275,1239,1500,5027,75,1165,8,0,0,0,0
-1326,TREASURE_BOX3,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1327,TREASURE_BOX4,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7074,80,658,500,604,10000,984,4850,985,7275,2108,1000,1306,75,5022,2,0,0,0,0
-1328,TREASURE_BOX5,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1329,TREASURE_BOX6,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7075,80,658,500,604,10000,984,4850,985,7275,2102,834,5019,100,5002,9,0,0,0,0
-1330,TREASURE_BOX7,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1331,TREASURE_BOX8,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7076,80,658,500,604,10000,984,4850,985,7275,2616,500,2334,125,2622,9,0,0,0,0
-1332,TREASURE_BOX9,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1333,TREASURE_BOX10,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7077,80,658,500,604,10000,984,4850,985,7275,2104,500,2331,150,2623,10,0,0,0,0
-1334,TREASURE_BOX11,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1335,TREASURE_BOX12,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7078,80,658,500,604,10000,984,4850,985,7275,2270,500,1716,150,2256,10,0,0,0,0
-1336,TREASURE_BOX13,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1337,TREASURE_BOX14,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7079,80,658,500,604,10000,984,4850,985,7275,1238,375,1531,150,2318,10,0,0,0,0
-1338,TREASURE_BOX15,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1339,TREASURE_BOX16,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7080,80,658,500,604,10000,984,4850,985,7275,2626,300,1472,167,2327,10,0,0,0,0
-1340,TREASURE_BOX17,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1341,TREASURE_BOX18,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7081,80,658,500,604,10000,984,4850,985,7275,1143,250,1237,188,2235,12,0,0,0,0
-1342,TREASURE_BOX19,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1343,TREASURE_BOX20,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7082,80,658,500,604,10000,984,4850,985,7275,617,250,1144,188,5007,19,0,0,0,0
-1344,TREASURE_BOX21,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1345,TREASURE_BOX22,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7083,80,658,500,604,10000,984,4850,985,7275,2508,1000,2336,69,2621,20,0,0,0,0
-1346,TREASURE_BOX23,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1347,TREASURE_BOX24,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7084,80,658,500,604,10000,984,4850,985,7275,2106,1000,1164,50,5025,24,0,0,0,0
-1348,TREASURE_BOX25,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1349,TREASURE_BOX26,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7085,80,658,500,604,10000,984,4850,985,7275,2231,750,2624,46,2286,25,0,0,0,0
-1350,TREASURE_BOX27,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1351,TREASURE_BOX28,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7086,80,658,500,604,10000,984,4850,985,7275,2283,500,2615,41,2234,32,0,0,0,0
-1352,TREASURE_BOX29,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1353,TREASURE_BOX30,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7087,80,658,500,604,10000,984,4850,985,7275,2507,500,2625,38,5045,34,0,0,0,0
-1354,TREASURE_BOX31,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1355,TREASURE_BOX32,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7088,80,658,500,604,10000,984,4850,985,7275,2407,429,2269,250,2317,35,0,0,0,0
-1356,TREASURE_BOX33,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1357,TREASURE_BOX34,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7089,80,658,500,604,10000,984,4850,985,7275,2109,300,2406,273,2258,38,0,0,0,0
-1358,TREASURE_BOX35,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1359,TREASURE_BOX36,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7090,80,658,500,604,10000,984,4850,985,7275,1142,215,2255,60,5017,38,0,0,0,0
-1360,TREASURE_BOX37,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1361,TREASURE_BOX38,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7091,80,658,500,604,10000,984,4850,985,7275,1417,50,5053,50,2229,50,0,0,0,0
-1362,TREASURE_BOX39,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
-1363,TREASURE_BOX40,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7092,80,658,500,604,10000,984,4850,985,7275,2506,43,2254,43,1529,38,0,0,0,0
-1364,G_ASSAULTER,Assaulter,Assaulter,59,18251,0,0,0,2,195,227,35,36,85,55,10,35,145,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,1019,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1365,APOCALIPS,Apocalypse,Apocalypse,66,22680,0,6540,4935,2,1030,1370,62,49,1,48,120,108,66,85,10,12,2,0,60,149,400,1564,864,576,0,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,757,15,2506,20,999,2500,0,0,0,0,4242,1
-1366,LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,6470,3879,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,1564,864,576,0,0,0,0,0,0,0,0,7096,4559,7097,3686,2317,1,2316,2,509,2500,0,0,0,0,0,0,0,0,4184,1
-1367,BLAZZER,Blazer,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,0,6,43,149,180,1564,864,576,0,0,0,0,0,0,0,0,7097,4850,7098,3400,509,3000,0,0,0,0,0,0,0,0,0,0,0,0,4215,1
-1368,GEOGRAPHER,Geographer,Geographer,56,8071,0,2715,2000,3,467,621,28,26,1,67,47,60,68,44,10,12,0,3,62,132,2000,1564,864,576,0,0,0,0,0,0,0,0,1032,6200,1033,5500,2253,30,2207,50,12002,100,0,0,0,0,0,0,0,0,4280,1
-1369,GRAND_PECO,Grand Peco,Grand Peco,58,8054,0,2387,1361,2,444,565,37,30,1,67,66,50,71,51,10,12,2,2,43,137,165,1564,864,576,0,0,0,0,0,0,0,0,7101,4850,522,300,992,1000,969,1,0,0,0,0,0,0,0,0,0,0,4161,1
-1370,SUCCUBUS,Succubus,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,150,89,87,10,12,1,6,67,1173,155,1564,864,576,0,0,0,0,0,0,0,0,522,1500,2407,3,2611,500,2613,150,5066,1,1472,1,505,1000,0,0,0,0,4218,1
-1371,FAKE_ANGEL,Fake Angel,False Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,2181,160,1564,864,576,0,0,0,0,0,0,0,0,7104,0,7105,0,717,1000,715,1000,716,1000,12020,1000,0,0,0,0,0,0,4316,1
-1372,GOAT,Goat,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,2,2,63,137,165,1564,864,576,0,0,0,0,0,0,0,0,7106,4559,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,0,0,0,0,4150,1
-1373,LORD_OF_DEATH,Lord of Death,Lord of the Dead,94,303383,0,131343,43345,2,2430,4104,77,73,1,99,120,169,100,106,10,12,2,6,67,1205,300,1564,864,576,10000,5000,607,5500,732,5000,617,5000,7108,5335,1417,5,1230,10,2621,2,7109,10,1306,1,1529,2,0,0,0,0,4276,1
-1374,INCUBUS,Incubus,Incubus,75,17281,0,5254,4212,1,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,1173,165,1564,864,576,0,0,0,0,0,0,0,0,522,1500,509,5500,5072,1,2621,1,2610,500,2613,150,509,1200,0,0,0,0,4269,1
-1375,THE_PAPER,The Paper,The Paper,56,18557,0,2849,1998,1,845,1124,25,24,1,66,52,76,71,79,10,12,1,0,60,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7111,4947,7112,3200,508,800,511,2000,0,0,0,0,0,0,0,0,0,0,4172,1
-1376,HARPY,Harpy,Harpy,70,16599,0,3562,2133,1,956,1231,42,44,1,112,72,103,74,76,10,12,1,6,64,2181,155,1564,864,576,0,0,0,0,0,0,0,0,7115,4850,7116,2500,508,1500,508,800,0,0,0,0,0,0,0,0,0,0,4325,1
-1377,ELDER,Elder,Elder,64,21592,0,4650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7099,4365,7117,1500,7118,1500,691,100,1473,1,616,2,7027,5000,0,0,0,0,4251,1
-1378,DEMON_PUNGUS,Demon Pungus,Demon Pungus,56,7259,0,3148,1817,1,360,479,48,31,1,83,55,59,63,34,10,12,0,6,65,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7119,4074,7001,4559,715,3880,0,0,0,0,0,0,0,0,0,0,0,0,4173,1
-1379,NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,6683,4359,1,757,1007,37,37,1,76,55,60,77,54,10,12,2,6,67,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7120,4947,2626,1,2608,30,505,50,510,150,695,100,0,0,0,0,0,0,4166,1
-1380,DRILLER,Driller,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,2181,165,1564,864,576,0,0,0,0,0,0,0,0,1012,7500,715,3880,716,3500,0,0,0,0,0,0,0,0,0,0,0,0,4180,1
-1381,GRIZZLY,Grizzly,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,54,68,58,70,61,10,12,2,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,948,5000,919,5000,549,2500,0,0,0,0,0,0,0,0,0,0,0,0,4162,1
-1382,DIABOLIC,Diabolic,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,2181,150,1564,864,576,0,0,0,0,0,0,0,0,1038,5820,1039,4850,2605,3,984,20,1263,10,0,0,0,0,0,0,0,0,4182,1
-1383,EXPLOSION,Explosion,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7006,5500,7097,2200,7122,3200,756,800,522,400,0,0,0,0,0,0,0,0,4267,1
-1384,DELETER,Deleter,Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,105,40,65,72,54,10,12,1,9,44,141,175,1564,864,576,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4158,1
-1385,DELETER_,Deleter,Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,67,40,65,72,68,10,12,1,9,42,141,175,1564,864,576,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4279,1
-1386,SLEEPER,Sleeper,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,2181,195,1564,864,576,0,0,0,0,0,0,0,0,7124,4947,1056,5335,997,2500,756,300,1226,5,1622,5,7043,1200,0,0,0,0,4228,1
-1387,GIG,Gig,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,41,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7125,4365,904,5500,716,150,525,2500,994,850,0,0,0,0,0,0,0,0,4165,1
-1388,ARCHANGELING,Archangeling,Arc Angeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,1205,180,1564,864,576,0,0,0,0,0,0,0,0,2255,5,610,1800,608,150,7291,1500,2254,5,2317,3,7294,1500,0,0,0,0,4241,1
-1389,DRACULA,Dracula,Dracula,85,320096,0,120157,38870,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1564,864,576,500,5000,607,5500,732,5000,522,5000,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,0,0,0,0,0,0,4134,1
-1390,VIOLY,Violy,Violy,75,18257,0,6353,3529,10,738,982,37,36,1,93,54,85,101,83,10,12,1,7,40,133,170,1564,864,576,0,0,0,0,0,0,0,0,1060,6305,1610,50,740,1200,2610,800,526,1400,12020,1000,1902,500,0,0,0,0,4209,1
-1391,GALAPAGO,Galapago,Galapago,63,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,1,2,22,139,165,1564,864,576,0,0,0,0,0,0,0,0,7053,5335,610,1500,508,2500,606,100,605,100,5111,1,0,0,0,0,0,0,4152,1
-1392,ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,351,215,1,109,137,4,34,1,62,45,26,55,5,10,12,1,0,44,133,155,1564,864,576,0,0,0,0,0,0,0,0,7126,500,2312,1,7053,1000,999,450,984,1,912,2500,910,5500,0,0,0,0,4192,1
-1393,G_MUMMY,Mummy,Mummy,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1394,G_ZOMBIE,Zombie,Zombie,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1395,CRYSTAL_1,Wind Crystal,Wind Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,5097,7000,532,6500,558,5000,607,200,0,0,0,0
-1396,CRYSTAL_2,Earth Crystal,Earth Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,5097,7000,531,6500,558,5000,608,250,0,0,0,0
-1397,CRYSTAL_3,Fire Crystal,Fire Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,5097,7000,534,6500,558,5000,604,300,0,0,0,0
-1398,CRYSTAL_4,Water Crystal,Water Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,5097,7000,533,6500,558,5000,603,100,0,0,0,0
-1399,EVENT_BAPHO,Baphomet,Baphomet,68,864960,0,562340,87895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1205,100,1068,768,576,500,5000,607,5500,526,5000,732,5000,1417,550,1306,680,1145,480,2110,640,2327,1500,2111,500,2621,1720,2256,1550,0,0,0,0
-1400,KARAKASA,Karakasa,Karakasa,30,3092,0,489,322,1,140,183,1,20,1,40,12,5,10,1,10,12,1,0,60,129,300,1480,480,1056,0,0,0,0,0,0,0,0,7151,5000,7150,4268,1019,3200,7111,2200,912,4074,746,30,0,0,0,0,0,0,4286,1
-1401,SHINOBI,Shinobi,Shinobi,69,12700,0,4970,3010,1,460,1410,34,21,1,85,25,25,100,100,10,12,1,7,67,1173,200,1480,480,720,0,0,0,0,0,0,0,0,7156,5335,2337,2,7053,2200,2335,2,2336,1,7157,2000,739,15,0,0,0,0,4230,1
-1402,POISON_TOAD,Poison Toad,Poison Toad,46,6629,0,1929,1457,1,288,408,5,10,1,34,19,14,66,55,10,12,1,2,45,129,165,976,576,288,0,0,0,0,0,0,0,0,7155,5500,7154,2400,2610,4,511,540,724,2,526,2,1246,10,0,0,0,0,4175,1
-1403,ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,1293,1003,9,289,336,10,10,1,37,29,15,101,15,10,12,1,1,49,133,200,2276,576,432,0,0,0,0,0,0,0,0,998,5500,2285,1,7126,1400,508,20,549,350,525,250,0,0,0,0,0,0,4160,1
-1404,MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,795,493,1,250,305,1,20,1,31,15,10,47,15,10,12,1,6,27,145,200,1720,500,420,0,0,0,0,0,0,0,0,7152,5335,7153,2500,509,550,1000,1250,2613,1,7005,100,1904,2,0,0,0,0,4208,1
-1405,TENGU,Tengu,Tengu,65,16940,0,4207,2843,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,7159,3500,7158,5500,7063,25,522,150,999,80,2278,2,687,100,0,0,0,0,4282,1
-1406,KAPHA,Kapha,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7149,6500,7053,3500,520,1500,521,2300,708,2,1915,10,640,1,0,0,0,0,4287,1
-1407,DOKEBI_,Dokebi,Dokebi,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,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
-1408,BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,57,8082,0,2119,1562,2,354,575,5,23,1,65,35,37,116,30,10,13,1,4,44,141,150,872,500,300,0,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1
-1409,RICE_CAKE_BOY,Rice Cake Boy,Dumpling Child,27,2098,0,231,149,1,112,134,5,12,1,22,29,5,41,10,10,13,0,7,20,145,200,1672,672,480,0,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1
-1410,LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,55,10050,0,2591,1799,10,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,200,1288,576,288,0,0,0,0,0,0,0,0,7164,4365,522,1900,526,1000,604,400,532,100,603,3,0,0,0,0,0,0,4217,1
-//1411,PEACH_TREE_BULLET,Peach Tree Bullet,Peach Tree Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1412,EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,57,15003,0,3304,2198,9,620,899,25,59,1,66,21,76,130,79,10,13,2,0,40,133,150,1754,544,288,0,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1
-1413,WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,1038,692,1,220,280,10,20,1,42,36,55,66,30,10,13,0,3,43,145,400,2208,1008,324,0,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,516,4800,1951,1,0,0,0,0,0,0,4232,1
-//1414,GINSENG_BULLET,Ginseng Bullet,Ginseng Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1415,BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,352,201,1,155,207,0,5,1,44,20,4,49,10,10,13,0,2,28,2181,150,988,288,168,0,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1
-1416,WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,18029,0,3945,2599,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,1173,200,1672,672,288,0,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1
-1417,ZIPPER_BEAR,Zipper Bear,Zipper Bear,35,2901,0,370,255,1,248,289,10,5,1,25,55,15,28,25,10,13,1,2,27,145,200,976,576,288,0,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1
-1418,DARK_SNAKE_LORD,Evil Snake Lord,Evil Snake Lord,73,254993,0,34288,17950,1,1433,2033,25,55,1,83,62,80,164,88,10,12,2,2,68,1205,200,976,500,400,524,5000,607,5500,608,3500,985,5500,7169,5820,10020,5100,1471,80,5012,80,617,800,7226,900,661,2000,1474,500,0,0,0,0
-1419,G_FARMILIAR,Familiar,Familiar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1420,G_ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,2181,300,2864,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1421,G_ISIS,Isis,Isis,43,4828,0,0,0,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,2181,200,1384,768,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1422,G_HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,0,0,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1423,G_GHOUL,Ghoul,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1424,G_SIDE_WINDER,Side Winder,Side Winder,43,4929,0,0,0,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,2693,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1425,G_OBEAUNE,Obeaune,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,2181,200,1872,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1426,G_MARC,Marc,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1427,G_NIGHTMARE,Nightmare,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1428,G_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,0,0,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1429,G_ARGIOPE,Argiope,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,2181,300,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1430,G_ARGOS,Argos,Argos,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,2181,300,1468,468,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1431,G_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1432,G_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,0,0,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,2181,200,1120,420,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1433,G_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1434,G_DRAINLIAR,Drainliar,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,2181,250,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1435,G_EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,0,0,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,2693,300,2276,576,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1436,G_JAKK,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1437,G_JOKER,Joker,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,2181,100,1364,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1438,G_KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,2693,175,528,1000,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1439,G_HIGH_ORC,High Orc,High Orc,52,6890,0,0,0,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,2181,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1440,G_STEM_WORM,Stem Worm,Stem Worm,40,6136,0,0,0,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,2181,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1441,G_PENOMENA,Penomena,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,2181,400,832,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1442,G_SASQUATCH,Sasquatch,Sasquatch,30,3163,0,0,0,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,2181,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1443,G_CRUISER,Cruiser,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,2181,400,1296,1296,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1444,G_CHEPET,Chepet,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,2181,400,672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1445,G_RAGGLER,Raggler,Raggler,21,1020,0,0,0,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,2181,200,1000,900,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1446,G_INJUSTICE,Injustice,Injustice,51,7600,0,0,0,1,480,600,0,0,1,42,39,0,71,35,10,12,1,1,47,2693,400,770,720,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1447,G_GRYPHON,Gryphon,Gryphon,72,27800,0,0,0,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,2213,100,704,504,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1448,G_DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,0,0,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,2693,200,920,720,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1449,G_MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,0,0,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,2213,250,1280,1080,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1450,G_WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,0,0,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1451,G_MERMAN,Merman,Merman,53,12300,0,0,0,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,2181,200,916,816,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1452,G_ORC_LADY,Orc Lady,Orc Lady,31,2000,0,0,0,1,135,170,10,10,1,42,25,15,69,55,10,12,1,7,42,2181,200,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1453,G_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,0,0,9,415,500,35,5,1,25,22,5,145,35,10,12,1,6,47,2693,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1454,G_TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,0,0,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,2181,200,860,660,624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1455,G_KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,0,0,9,155,185,10,5,1,20,15,30,100,25,10,12,0,7,23,2181,200,1008,1008,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1456,G_CHIMERA,Chimera,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,2725,200,772,672,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1457,G_MANTIS,Mantis,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,2181,200,1528,660,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1458,G_MARDUK,Marduk,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,2181,300,1540,840,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1459,G_MARIONETTE,Marionette,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,2181,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1460,G_MATYR,Matyr,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,2181,150,432,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1461,G_MINOROUS,Minorous,Minorous,52,7431,0,0,0,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,2181,200,1360,960,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1462,G_ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,0,0,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1463,G_ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,0,0,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2693,400,2852,1152,840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1464,G_PASANA,Pasana,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,2181,165,1700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1465,G_PETIT,Petite,Petite,44,6881,0,0,0,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,2181,200,1624,620,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1466,G_PETIT_,Petite,Petite,45,5747,0,0,0,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,2181,150,1420,1080,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1467,G_RAYDRIC,Raydric,Raydric,52,8613,0,0,0,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,2693,150,824,780,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1468,G_REQUIEM,Requim,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1469,G_SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1470,G_ZEROM,Zerom,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1471,G_NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,2181,150,840,540,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1472,G_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,2181,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1473,G_ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,0,0,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,2181,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1474,G_MIMIC,Mimic,Mimic,51,6120,0,0,0,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,2181,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1475,G_WRAITH,Wraith,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,2181,300,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1476,G_ALARM,Alarm,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,2181,300,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1477,G_ARCLOUSE,Arclouse,Arclouze,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,2181,100,960,500,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1478,G_RIDEWORD,Rideword,Rideword,59,11638,0,0,0,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,2693,150,864,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1479,G_SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,1,20,36,0,76,25,10,12,1,1,69,2181,350,1848,500,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1480,G_ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,2693,350,1768,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1481,G_PUNK,Punk,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,2181,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1482,G_ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,0,0,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,2181,200,800,160,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1483,G_RYBIO,Rybio,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,2693,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1484,G_PHENDARK,Phendark,Phendark,73,22729,0,0,0,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,2693,175,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1485,G_MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,2725,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1486,G_TIRFING,Tirfing,Ogretooth,71,29900,0,0,0,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,2213,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1487,G_EXECUTIONER,Executioner,Executioner,65,28980,0,0,0,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,2725,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1488,G_ANOLIAN,Anolian,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,2181,200,900,500,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1489,G_STING,Sting,Sting,61,9500,0,0,0,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,2181,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1490,G_WANDER_MAN,Wander Man,Wanderer,74,8170,0,0,0,2,750,1000,5,5,1,192,38,45,127,85,10,12,1,6,24,2693,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1491,G_DOKEBI,Dokebi,Dokebi,33,2697,0,0,0,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,2181,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-//Umbala
-1492,INCANTATION_SAMURAI,Incantation Samurai,Samurai Specter,71,218652,0,53600,5000,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,1205,200,1152,1152,480,5000,5000,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,504,7500,1235,80,0,0,0,0,4263,1
-1493,DRYAD,Dryad,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,64,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,1951,80,1964,1,2270,10,7100,3000,0,0,0,0,4177,1
-1494,KIND_OF_BEETLE,Beetle King,Beetle King,34,1874,0,679,442,1,191,243,45,12,1,34,10,1,50,1,10,12,0,4,22,137,200,1152,1152,384,0,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1
-1495,STONE_SHOOTER,Stone Shooter,Stone Shooter,42,4104,0,1238,752,9,309,350,12,45,1,40,20,79,92,20,10,12,1,3,63,2181,150,1872,1248,428,0,0,0,0,0,0,0,0,7203,5000,7201,3000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1
-//1496,STONE_SHOOTER_BULLET,Stone Shooter Bullet,Stone Shooter Bullet,(mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1497,WOODEN_GOLEM,Wooden Golem,Wooden Golem,51,9200,0,1926,1353,1,570,657,32,36,1,41,69,5,85,41,10,12,2,3,42,2181,200,1152,1584,400,0,0,0,0,0,0,0,0,7189,4365,7188,5723,757,110,2270,10,604,100,7201,1000,921,1000,0,0,0,0,4259,1
-1498,WOOTAN_SHOOTER,Wootan Shooter,Wootan Shooter,39,3977,0,886,453,9,224,271,10,28,1,35,29,15,120,42,10,12,1,7,42,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,512,100,0,0,5116,10,0,0,0,0,4260,1
-1499,WOOTAN_FIGHTER,Wootan Fighter,Wootan Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,67,30,10,12,1,7,43,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,513,1000,7198,1000,5116,5,0,0,0,0,4261,1
-1500,PARASITE,Parasite,Parasite,37,3090,0,1098,478,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,711,500,0,0,0,0,4309,1
-//1501,PARASITE_BULLET,Parasite Bullet,Parasite Bullet... (mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-1502,PORING_V,Pori Pori,Bring it on!,99,95000000,0,87250,27895,1,600,700,17,32,10,50,65,50,45,35,10,12,1,3,25,2485,400,1872,672,480,9999,5000,10020,1000,4005,100,2286,200,5035,5000,2344,5000,2346,5000,2350,5000,2348,5000,10004,6000,7126,7760,2110,4500,0,0,0,0
-
-//Niflheim
-1503,GIBBET,Gibbet,Gibbet,58,6841,0,4011,1824,1,418,656,28,31,1,42,42,27,46,28,10,12,2,6,27,2693,150,1152,1584,400,0,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,0,0,0,0,0,0,4278,1
-1504,DULLAHAN,Dullahan,Dullahan,62,12437,0,4517,2963,1,647,1065,47,38,1,30,5,45,62,22,10,12,1,1,49,2181,155,1152,1152,428,0,0,0,0,0,0,0,0,7209,3200,7210,4850,0,0,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1
-1505,LOLI_RURI,Loli Ruri,Loli Ruri,71,23470,0,6641,4314,1,1476,2317,39,44,1,66,54,74,81,43,10,12,2,6,87,2181,155,1152,1632,424,0,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,0,0,0,0,0,0,0,0,4191,1
-1506,DISGUISE,Disguise,Disguise,55,7543,0,2815,1919,1,279,546,18,29,1,72,45,35,48,65,10,12,1,6,82,2181,147,1152,768,732,0,0,0,0,0,0,0,0,7216,4850,7221,3686,2502,50,518,100,2508,50,2504,2,0,0,0,0,0,0,4181,1
-1507,BLOODY_MURDERER,Bloody Murderer,Bloody Murderer,72,27521,0,9742,3559,1,864,1081,37,41,1,30,90,15,52,12,10,12,2,7,67,2181,175,1152,1344,400,0,0,0,0,0,0,0,0,7207,4171,7223,1000,7208,2000,2288,50,984,100,1229,3,13002,1,0,0,0,0,4214,1
-1508,QUVE,Quve,Quve,40,4559,0,414,306,1,299,469,12,12,1,61,24,19,37,24,10,12,0,1,29,2181,160,1152,1248,400,0,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,0,0,0,0,0,0,0,0,4294,1
-1509,LUDE,Lude,Lude,36,3214,0,392,247,1,287,469,14,10,1,59,60,18,36,21,10,12,0,1,29,2181,150,1152,960,752,0,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,0,0,0,0,0,0,4193,1
-1510,HYLOZOIST,Hylozoist,Heirozoist,51,7186,0,2314,1297,1,317,498,16,51,1,28,26,47,66,14,10,12,0,6,47,2181,155,1152,1536,969,0,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1
-
-1511,AMON_RA,Amon Ra,Amon Ra,88,1214138,0,87264,35891,3,1647,2576,26,52,1,1,90,124,74,45,10,12,2,7,62,164,100,1152,672,480,8000,5000,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1
-
-//Louyang
-1512,HYEGUN,Hyegun,Yao Jun,56,9981,0,2199,1032,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,0,0,0,0,0,0,0,0,4328,1
-1513,CIVIL_SERVANT,Civil Servant,Mao Guai,62,14390,0,4023,2750,1,650,1010,42,5,58,15,20,60,80,50,10,12,1,2,44,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1
-1514,DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,1,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,200,1152,1152,384,0,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1
-1515,GARM_BABY,Garm Baby,Garm Baby,61,20119,0,1022,2980,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,2181,300,1152,1152,384,0,0,0,0,0,0,0,0,7270,1500,7269,2500,7066,4365,749,100,12000,100,0,0,0,0,0,0,0,0,4323,1
-1516,INCREASE_SOIL,Increase Soil,Mi Gao,51,8230,0,2760,2110,1,560,700,30,12,40,45,23,12,69,12,10,12,1,0,62,145,400,1152,1152,384,0,0,0,0,0,0,0,0,7264,4365,7004,2300,997,10,969,2,0,0,0,0,0,0,0,0,0,0,4231,1
-1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,Jing Guai,48,5920,0,1643,1643,1,434,633,23,16,46,51,19,8,57,30,10,12,2,6,62,2181,175,1152,1152,384,0,0,0,0,0,0,0,0,7267,4500,7268,400,1501,10,1523,1,0,0,0,0,0,0,0,0,0,0,4265,1
-1518,BACSOJIN,Bacsojin,White Lady,85,253221,0,45250,16445,1,1868,6124,20,55,1,65,44,112,152,35,10,12,2,7,67,2213,200,1152,1152,480,5000,1000,607,500,608,500,985,500,1020,5500,603,2,617,2,7165,3000,7166,1000,747,500,0,0,2234,1,0,0,0,0
-1519,CHUNG_E,Chung E,Green Maiden,59,23900,0,4256,920,1,460,1050,8,15,1,65,43,30,90,15,10,12,1,7,44,2181,300,2112,912,576,0,0,0,0,0,0,0,0,7053,4850,740,100,1806,10,518,500,0,0,0,0,0,0,5042,2,0,0,0,0
-1520,BOILED_RICE,Boiled Rice,Boiled Rice,14,344,0,81,44,1,59,72,0,10,1,14,14,0,19,15,10,12,1,6,21,129,300,1672,672,480,0,0,0,0,0,0,0,0,564,5500,7272,3000,7194,1000,7198,1000,0,0,0,0,0,0,0,0,0,0,0,0
-1521,G_ALICE,Alice,Alice,62,10000,0,0,0,1,550,700,5,5,1,64,42,85,100,130,10,12,1,7,60,145,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1522,G_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,0,0,1,836,1129,27,27,1,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1523,G_ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,0,0,9,289,336,10,10,1,37,29,15,101,15,10,12,1,1,49,133,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1524,G_BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,0,0,2,155,207,0,5,1,44,20,4,49,10,10,13,0,2,28,2181,150,988,288,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1525,G_BATHORY,Bathory,Bathory,44,5415,0,0,0,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1526,G_BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,57,8082,0,0,0,2,354,575,5,23,1,65,35,37,116,30,10,13,1,4,44,141,150,872,500,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1527,G_C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,0,0,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1528,G_CLOCK,Clock,Clock,60,11050,0,0,0,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1529,G_DARK_SNAKE_LORD,Dark Snake Lord,Evil Snake Lord,73,254993,0,0,0,1,1433,2033,25,55,1,83,62,80,164,88,10,12,2,2,68,1205,200,976,500,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1530,G_DRACULA,Dracula,Dracula,85,320096,0,0,0,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1531,G_EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,57,15003,0,0,0,9,620,899,25,59,1,66,21,76,130,79,10,13,2,0,40,133,150,1754,544,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1532,G_EXPLOSION,Explosion,Explosion,46,8054,0,0,0,1,336,447,35,27,1,61,56,78,66,38,10,12,0,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1533,G_FUR_SEAL,Fur Seal,Seal,63,9114,0,0,0,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,149,250,1612,622,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1534,G_GOBLIN_1,Goblin,Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1535,G_GOBLIN_2,Goblin,Goblin,24,1034,0,0,0,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1536,G_GOBLIN_3,Goblin,Goblin,24,1034,0,0,0,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1537,G_GOBLIN_4,Goblin,Goblin,23,1359,0,0,0,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1538,G_GOBLIN_5,Goblin,Goblin,22,1952,0,0,0,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1539,G_GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,19735,0,0,0,1,663,753,48,16,1,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1540,G_GOLEM,Golem,Golem,25,3900,0,0,0,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1541,G_GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,0,0,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1542,G_INCANTATION_SAMURAI,Incantation Samurai,Incantation Samurai,75,218652,0,0,0,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,1205,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1543,G_KAPHA,Kapha,Kapha,41,7982,0,0,0,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1544,G_KARAKASA,Karakasa,Karakasa,30,3092,0,0,0,1,140,183,1,20,1,40,12,5,52,45,10,12,1,0,60,129,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1545,G_KOBOLD_1,Kobold,Kobold,36,3893,0,0,0,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1546,G_KOBOLD_2,Kobold,Kobold,31,2179,0,0,0,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1547,G_KOBOLD_3,Kobold,Kobold,31,2179,0,0,0,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1548,G_KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,17935,0,0,0,1,649,957,37,37,1,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1549,G_LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,0,0,1,1541,2049,65,50,1,57,115,127,76,68,10,12,2,0,83,149,400,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1550,G_LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,55,10050,0,0,0,8,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,400,1288,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1551,G_MARSE,Marse,Marse,31,5034,0,0,0,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1552,G_MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,0,0,1,250,305,1,2,1,31,15,10,47,15,10,12,1,6,27,145,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1553,G_MYST,Myst,Myst,38,3745,0,0,0,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1554,G_NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1555,G_PARASITE,Parasite,Parasite,37,3090,0,0,0,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1556,G_POISON_TOAD,Poison Toad,Poisonous Toad,46,6629,0,0,0,1,288,408,5,10,1,45,19,1,66,43,10,12,1,2,45,129,165,976,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1557,G_ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,0,0,10,109,137,4,34,1,62,45,48,55,5,10,12,1,0,44,133,155,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1558,G_SAND_MAN,Sandman,Sandman,34,3413,0,0,0,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1559,G_SCORPION,Scorpion,Scorpion,24,1109,0,0,0,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1560,G_SHINOBI,Shinobi,Shinobi,69,12700,0,0,0,1,460,1410,30,21,1,91,25,25,89,40,10,12,1,7,67,1173,200,1480,480,720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1561,G_SMOKIE,Smokie,Smokie,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1562,G_SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,0,0,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1563,G_TENGU,Tengu,Tengu,65,16940,0,0,0,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1564,G_WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,18029,0,0,0,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,1173,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1565,G_WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,0,0,5,220,280,10,20,1,42,36,55,66,30,10,13,0,3,43,145,400,2208,1008,324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1566,G_WRAITH_DEAD,Wraith Dead,Wraith Dead,74,42131,0,0,0,2,1366,1626,25,30,1,99,55,95,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1567,G_ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,0,0,1,947,1115,35,30,1,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1568,G_ANGELING,Angeling,Angeling,20,55000,0,0,0,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1569,G_BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,0,0,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1570,G_CRAMP,Cramp,Cramp,56,4720,0,0,0,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1571,G_DEVIACE,Deviace,Deviace,47,19192,0,0,0,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1572,G_DROPS,Drops,Drops,3,55,0,0,0,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1573,G_ELDER,Elder,Elder,64,21592,0,0,0,3,421,560,45,68,1,76,68,142,72,86,10,12,2,7,80,2181,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1574,G_ELDER_WILLOW,Elder Willow,Elder Willow,20,693,0,0,0,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1575,G_FLORA,Flora,Flora,26,2092,0,0,0,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1576,G_GHOSTRING,Ghostring,Ghostring,18,73300,0,0,0,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1577,G_GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,0,0,9,89,113,0,0,1,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1578,G_HORONG,Horong,Horong,34,1939,0,0,0,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1579,G_HYDRA,Hydra,Hydra,14,660,0,0,0,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1580,G_INCUBUS,Incubus,Incubus,75,17281,0,0,0,2,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,1173,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1581,G_VOCAL,Vocal,Vocal,18,3016,0,0,0,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1582,DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,1,50,20,75,77,200,10,12,1,6,87,1205,400,1872,672,480,0,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1
-1583,TAO_GUNKA,Tao Gunka,Tao Gunka,70,193000,0,59175,10445,3,1450,1770,20,20,70,40,85,78,35,140,60,12,2,6,60,173,225,1872,672,480,3000,5000,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,1002,1000,2231,5,0,0,0,0,4302,1
-
-//Ayothaya
-1584,TAMRUAN,Tamruan,Tamruan,52,10234,0,3812,55,3,489,534,15,35,1,62,38,75,72,15,10,12,2,6,67,141,200,1872,672,480,0,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,0,0,0,0,0,0,0,0,4304,1
-1585,MIME_MONKEY,Mime Monkey,Mime Monkey,40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0
-1586,LEAF_CAT,Leaf Cat,Leaf Cat,38,2396,0,165,1212,1,266,307,5,19,1,67,12,45,60,29,10,12,0,2,22,131,150,1872,672,480,0,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1
-1587,KRABEN,Kraben,Kraben,50,5880,0,206,1322,1,125,765,5,42,1,125,1,66,75,50,10,12,1,0,48,141,75,1872,672,480,0,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,0,0,603,10,0,0,0,0,4295,1
-
-//Some more G_Mobs and Xmas_Orc
-1588,XMAS_ORC,Christmas Orc,Christmas Orc,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
-1589,G_MANDRAGORA,Mandragora,Mandragora,12,405,0,0,0,4,26,35,0,25,1,12,24,1,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1590,G_GEOGRAPHER,Geographer,Geographer,56,8071,0,0,0,3,467,621,28,26,1,67,47,60,68,44,10,12,0,3,62,132,2000,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1591,A_LUNATIC,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1592,A_MOBSTER,Gangster,Gangster,40,8000,0,0,0,1,100,300,41,37,1,46,20,35,76,55,10,12,1,7,20,1685,250,1100,560,580,0,0,0,0,0,0,0,0,7049,10000,601,2000,1206,3000,713,1000,550,10000,7049,0,7049,0,7049,0,0,0,0,0
-1593,A_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,39760,0,0,0,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,149,175,1772,120,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1594,G_FREEZER,Freezer,Freezer,72,12263,0,0,0,2,672,984,55,43,69,41,59,5,67,100,10,12,1,2,41,53,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1595,G_MARIN,Marin,Marin,15,742,0,0,0,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,1,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1596,G_TAMRUAN,Tamruan,Tamruan,52,10234,0,0,0,1,489,534,38,94,26,20,15,0,60,45,10,10,1,6,62,181,190,872,560,380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1597,G_GARGOYLE,Gargoyle,Gargoyle,48,3950,0,0,0,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,5,200,1020,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1598,G_BLAZZER,Blazzer,Blazzer,43,8252,0,0,0,2,533,709,50,40,1,52,50,64,69,40,10,12,0,6,43,5,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1599,G_WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,0,0,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,68,53,250,2536,1536,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1600,G_HEATER,Heater,Heater,68,15648,0,0,0,2,682,1007,40,42,69,47,25,5,71,100,10,12,1,2,43,53,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1601,G_PERMETER,Permeter,Permeter,63,11684,0,0,0,2,943,1212,46,45,69,59,60,5,69,100,10,12,1,2,40,17,250,1100,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1602,G_SOLIDER,Solider,Solider,70,17181,0,0,0,2,796,978,57,43,69,35,85,5,74,100,10,12,1,2,42,17,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1603,G_BIGFOOT,Bigfoot,Bigfoot,25,1619,0,0,0,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1604,G_GIANT_HONET,Giant Hornet,Giant Hornet,56,12834,0,0,0,1,650,851,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1605,G_DARK_ILLUSION,Dark Illusion,Dark Illusion,77,101487,0,0,0,2,1300,1982,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1606,G_GARM_BABY,Garm Baby,Garm Baby,61,20119,0,0,0,3,680,1179,34,13,1,30,56,55,85,30,10,12,1,2,41,133,300,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1607,G_GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,1173,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1608,G_THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1609,G_DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,0,0,3,550,789,39,10,1,62,55,25,72,10,10,12,1,9,44,131,200,1152,1152,384,0,0,0,0,0,0,0,0,570,500,571,50,572,20,515,10000,12018,5000,0,0,0,0,668,100,0,0,0,0
-1610,A_MUNAK,Munak,Munak,30,2872,0,0,0,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-1611,A_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-1612,A_HYEGUN,Hyegun,Yao Jun,56,9981,0,0,0,3,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,133,200,1152,1152,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
-
-//Einbroch
-1613,METALING,Metaling,Metaling,26,889,0,492,249,1,135,270,5,3,20,15,10,18,35,2,10,12,0,0,20,131,250,672,672,480,0,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,512,500,7312,5000,0,0,0,0,0,0
-1614,MINERAL,Mineral,Mineral,56,7950,0,3563,1768,1,723,812,29,35,50,52,35,21,77,32,10,12,0,0,40,145,175,572,672,480,0,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,0,0
-1615,OBSIDIAN,Obsidian,Obsidian,50,8812,0,3002,2202,1,841,980,35,5,50,32,42,24,71,55,10,12,0,0,42,141,200,1572,672,480,0,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,0,0
-1616,PITMAN,Pitman,Pitman,43,5015,0,1799,1083,1,290,486,22,12,50,15,5,5,52,36,10,12,2,1,42,145,150,1672,672,480,0,0,0,0,0,0,0,0,7318,3000,7319,500,998,800,999,500,1003,100,1041,1000,7327,80,0,0,0,0,0,0
-1617,WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,4412,1135,1,500,889,23,10,60,69,55,5,59,77,10,12,2,0,20,141,250,872,672,480,0,0,0,0,0,0,0,0,7323,1000,7068,1000,998,500,625,50,1002,1000,604,50,7319,3800,0,0,0,0,0,0
-1618,UNGOLIANT,Ungoliant,Ungoliant,69,29140,0,8211,142,1,1290,2280,25,15,80,52,57,25,119,43,10,12,2,4,45,1173,300,672,672,480,0,0,0,0,0,0,0,0,7316,4500,1014,3500,1013,1000,7289,1500,7326,2500,718,1500,2406,500,0,0,0,0,0,0
-1619,PORCELLIO,Porcellio,Porcellio,28,1654,0,512,346,1,82,247,0,8,30,31,21,50,54,85,10,12,0,4,62,131,150,572,672,480,0,0,0,0,0,0,0,0,7312,5000,1208,25,928,1000,1052,3000,630,2,7326,30,0,0,0,0,0,0,0,0
-1620,NOXIOUS,Noxious,Noxious,35,2038,0,698,698,1,299,400,0,35,30,41,10,30,44,2,10,12,1,0,68,141,300,1472,672,480,0,0,0,0,0,0,0,0,7322,1000,7001,3000,605,50,7320,3000,0,0,0,0,0,0,603,1,0,0,0,0
-1621,VENOMOUS,Venomous,Venomous,42,4653,0,1780,1280,1,422,844,0,42,30,60,17,19,58,1,10,12,1,0,25,141,300,1472,672,480,0,0,0,0,0,0,0,0,7320,5000,7119,3000,7154,1000,7322,2000,0,0,0,0,0,0,603,1,0,0,0,0
-1622,TEDDY_BEAR,Teddy Bear,Teddy Bear,71,8109,0,5891,3445,1,559,1352,19,27,70,179,32,41,121,26,10,12,0,0,60,149,125,572,672,480,0,0,0,0,0,0,0,0,7317,3800,518,1000,615,300,538,1000,5113,50,2652,10,985,100,0,0,0,0,0,0
-1623,RSX_0806,RSX 0806,RSX-0806,86,280733,0,31010,32011,1,2740,5620,39,41,1,51,75,25,93,84,10,12,2,0,60,1205,200,1152,1152,480,25000,5000,607,5500,5104,3500,732,5500,7093,6000,999,5000,644,5000,617,1000,7327,5000,1242,50,1531,20,1230,10,0,0,0,0
-1624,G_WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,0,0,1,692,1081,23,10,60,69,55,5,59,77,10,12,2,0,20,645,250,872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1625,G_PORCELLIO,Porcellio,Porcellio,28,1654,0,0,0,1,82,247,0,8,30,31,21,50,54,85,10,12,0,4,62,131,150,572,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Hellion Revenant
-1626,G_DARK_PRIEST,Dark Priest,Hellion Revenant,88,286900,0,1,1,2,50,3150,25,50,1,80,50,99,130,99,10,12,1,6,69,181,150,432,384,192,0,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0
-
-//Lighthalzen
-1627,ANOPHELES,Anopheles,Anopheles,23,100,0,99,55,1,48,63,0,90,1,200,4,5,120,23,10,12,0,4,64,133,250,972,672,480,0,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1628,MOLE,Mole,Holden,36,2209,0,268,172,1,53,63,0,5,1,18,23,30,45,5,10,12,0,2,42,131,400,1872,672,480,0,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1629,HILL_WIND,Hill Wind,Hill Wind,43,3189,0,1800,1100,1,290,480,10,15,1,42,31,50,51,23,10,12,1,2,64,671,400,1872,672,480,0,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1630,BACSOJIN_,Bacsojin,White Lady,72,56380,0,5590,1659,1,560,1446,10,51,1,85,78,85,150,60,10,12,2,7,44,1973,200,1152,1152,480,0,5000,607,5500,2513,2000,617,5000,1020,5500,603,5000,617,3000,7165,3000,7166,1000,747,500,0,0,2234,10,0,0,0,0
-1631,CHUNG_E_,Chung E,Green Maiden,59,23900,0,4256,920,1,60,105,8,15,1,33,33,10,58,15,10,12,1,7,44,145,300,2112,912,576,0,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,0,0,0,0,0,0,5042,50,0,0,0,0
-1632,GREMLIN,Gremlin,Gremlin,53,9280,0,4355,1768,1,329,762,29,25,1,41,59,75,62,15,10,12,1,3,21,671,200,1872,672,480,0,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,5,1265,1,0,0,0,0,603,2,0,0,0,0
-1633,BEHOLDER,Beholder,Beholder,56,7950,0,4821,3822,1,723,812,17,30,1,62,25,59,85,32,10,12,1,3,21,671,200,1872,672,480,0,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,0,0,603,2,0,0,0,0
-//Normal advanced class mobs
-1634,SEYREN,Seyren,Seyren Windsor,91,88402,0,100000,116460,1,2100,2530,63,12,1,40,86,20,94,25,10,12,1,7,63,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,13001,1,1163,300,603,50,2229,15,2317,2,1155,400,1474,1,0,0,0,0
-1635,EREMES,Eremes,Eremes Guile,87,60199,0,100000,99800,1,2020,2320,23,12,1,138,31,19,90,30,10,12,1,7,85,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,603,50,1253,100,1262,7,1264,80,678,250,2336,5,2514,1,0,0,0,0
-1636,HARWORD,Harword,Howard Alt-Eisen,83,78690,0,100000,112540,1,1890,2390,59,10,1,62,99,35,98,66,10,12,1,7,82,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,2607,50,2406,10,1361,200,2104,15,2318,1,603,50,2514,1,0,0,0,0
-1637,MAGALETA,Magaleta,Margaretha Solin,90,61282,0,100000,117800,1,1300,2053,35,60,1,81,41,145,70,40,10,12,1,7,66,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,2607,50,1602,300,1561,7,2104,15,603,50,2504,15,2327,1,0,0,0,0
-1638,SHECIL,Shecil,Cecil Damon,82,58900,0,100000,118260,9,1226,1854,25,15,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,7345,3000,12014,200,1705,150,1711,80,12007,200,603,50,2502,100,2331,5,0,0,0,0
-1639,KATRINN,Katrinn,Kathryne Keyron,92,47280,0,100000,116470,1,497,1697,10,74,1,56,39,180,110,39,10,12,1,7,68,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,603,40,1611,300,1620,2,2102,30,2334,30,2404,30,5085,1,0,0,0,0
-//MVP Slaves
-1640,G_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,58,37,1,40,86,20,94,25,10,12,1,7,63,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1641,G_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,1,138,31,19,90,30,10,12,1,7,85,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1642,G_HARWORD,Whitesmith Harword,Whitesmith Howard,99,310000,0,18000,10000,1,4822,5033,42,36,1,62,99,35,98,66,10,12,1,7,82,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1643,G_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,81,41,145,70,40,10,12,1,7,66,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1644,G_SHECIL,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,9,1892,5113,22,35,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-1645,G_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,82,1,56,39,180,110,39,10,12,1,7,68,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
-//MVP Monsters
-1646,B_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,1,81,94,110,130,52,10,12,1,7,63,1973,120,672,672,480,94100,5000,617,5500,603,5000,732,2000,1132,3000,2342,4000,2412,9000,1470,4000,1469,4000,1166,3000,1415,3000,1169,3000,0,0,0,0
-1647,B_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,1,181,62,37,122,60,10,12,1,7,85,1973,120,672,672,480,84100,5000,617,5500,603,5000,732,2000,1234,3000,1230,3000,2319,9000,1233,4000,1232,4000,1265,4000,13002,4000,1231,3000,0,0,0,0
-1648,B_HARWORD,Whitesmith Harword,Whitesmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,1,73,112,35,136,60,10,12,1,7,82,1973,120,672,672,480,82100,5000,617,5500,603,5000,732,2000,1138,4000,1140,3000,2318,9000,1365,4000,1364,4000,1369,3000,1368,4000,1363,4000,0,0,0,0
-1649,B_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,66,1973,120,672,672,480,80100,5000,617,5500,603,5000,732,2000,1814,4000,2513,3000,2615,9000,1557,4000,1527,4000,1528,3000,1560,4000,1526,4000,0,0,0,0
-1650,B_SHECIL,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,9,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,64,1973,120,500,672,480,92100,5000,617,5500,603,5000,1723,2000,1228,4000,1236,4000,617,9000,1234,3000,1237,4000,1722,4000,1724,3000,1720,3000,0,0,0,0
-1651,B_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,1973,120,672,672,480,95100,5000,617,5500,603,5000,732,2000,1241,4000,1242,4000,2616,9000,2343,3000,2513,3000,1618,4000,1620,4000,2319,4000,0,0,0,0
-//1'st Class Mobs
-1652,YGNIZEM,Ygnizem,Egnigem Cenia,58,11200,0,4870,98,1,723,1112,35,12,1,35,52,18,70,20,10,12,1,7,43,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,1000,644,10,1158,20,1127,20,2313,10,1152,80,1170,1,2317,1,0,0,0,0
-1653,WHIKEBAIN,Whikebain,Wikebine Tres,62,7320,0,4204,21,1,593,789,9,12,1,48,34,20,74,30,10,12,1,7,65,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,2000,644,10,2306,40,1220,10,2315,2,1208,50,13004,10,1223,1,0,0,0,0
-1654,ARMAIA,Armaia,Armeyer Dinze,66,7110,0,4008,35,1,650,813,42,6,1,36,49,15,80,60,10,12,1,7,62,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,1000,644,10,1358,50,1352,40,2311,10,1302,80,1307,10,2504,1,0,0,0,0
-1655,EREND,Erend,Errende Ebecee,59,6980,0,4501,67,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,500,644,10,1514,50,1517,20,2326,5,2324,10,1523,1,2217,5,0,0,0,0
-1656,KAVAC,Kavac,Kavach Icarus,60,7899,0,4090,86,9,584,804,14,5,1,75,10,15,108,40,10,12,1,7,44,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,644,10,12006,100,1708,10,2308,5,2402,30,2404,2,1716,1,0,0,0,0
-1657,RAWREL,Rawrel,Laurell Weinder,61,6168,0,4620,30,1,330,417,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,120,672,672,480,0,0,0,0,0,0,0,0,934,1000,644,10,2102,5,1608,50,2322,10,2333,30,2607,1,1616,1,0,0,0,0
-//1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
-1658,B_YGNIZEM,Ygnizem,Egnigem Cenia,79,214200,0,258760,86000,1,3890,5690,48,12,1,60,45,31,110,40,10,12,1,7,43,1973,100,500,500,480,32000,5000,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,644,1000,0,0,0,0
-1659,G_WHIKEBAIN,Whikebain,Wikebine Tres,62,7320,0,0,0,1,593,789,9,12,1,48,34,20,74,30,10,12,1,7,65,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1660,G_ARMAIA,Armaia,Armeyer Dinze,66,7110,0,0,0,1,650,813,42,6,1,36,49,15,80,60,10,12,1,7,62,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1661,G_EREND,Erend,Errende Ebecee,59,6980,0,0,0,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1662,G_KAVAC,Kavac,Kavach Icarus,60,7899,0,0,0,9,584,804,14,5,1,75,10,15,108,40,10,12,1,7,44,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1663,G_RAWREL,Rawrel,Laurell Weinder,61,6168,0,0,0,1,330,417,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-1664,POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,3900,1800,7,800,900,10,30,1,40,25,20,80,80,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1665,POTON_CANON_1,Photon Cannon,Photon Cannon,67,7500,0,4300,2000,7,700,800,15,30,1,40,30,40,86,80,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1666,POTON_CANON_2,Photon Cannon,Photon Cannon,64,7100,0,3100,2700,7,800,900,8,30,1,40,21,29,80,91,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1667,POTON_CANON_3,Photon Cannon,Photon Cannon,65,7800,0,3800,2300,7,700,800,15,30,1,40,23,30,90,99,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,728,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1668,ARCHDAM,Archdam,Archdam,79,25000,0,8000,100,1,1000,2000,15,15,1,65,35,75,75,15,10,12,2,7,60,157,200,1272,672,480,0,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,0,0,0,0,0,0,0,0,0,0,0,0
-1669,DIMIK,Dimik,Dimik,77,10000,0,0,0,7,840,1480,45,28,1,35,41,15,120,40,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
-1670,DIMIK_1,Dimik,Dimik,79,16000,0,6400,3500,7,1140,1980,45,28,1,88,20,20,120,40,10,12,1,0,44,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
-1671,DIMIK_2,Dimik,Dimik,89,29000,0,8000,5000,7,1440,2280,45,28,1,40,30,30,150,70,10,12,1,0,41,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7353,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
-1672,DIMIK_3,Dimik,Dimik,80,19000,0,5900,2800,7,1240,2080,68,28,1,30,78,20,120,30,10,12,1,0,42,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7354,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
-1673,DIMIK_4,Dimik,Dimik,82,13900,0,5800,4500,7,1840,2840,45,28,1,20,20,10,120,30,10,12,1,0,43,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7355,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
-1674,MONEMUS,Monemus,Monemus,88,80000,0,0,0,5,2000,3000,26,52,1,1,90,124,74,45,10,12,2,0,63,164,200,1272,672,480,0,0,0,0,0,0,0,0,7049,2000,953,1000,7049,0,7049,0,7049,0,7049,0,7049,0,7049,0,0,0,0,0
-1675,VENATU,Venatu,Venatu,77,8000,0,0,0,3,1200,1800,35,20,1,26,24,5,75,40,10,12,1,0,43,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
-1676,VENATU_1,Venatu,Venatu,72,8900,0,4000,2000,3,800,1400,30,20,1,26,24,5,82,30,10,12,1,0,40,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
-1677,VENATU_2,Venatu,Venatu,80,9000,0,4000,2000,3,900,1500,30,20,1,82,32,5,105,30,10,12,1,0,44,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7357,500,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
-1678,VENATU_3,Venatu,Venatu,78,9500,0,4500,2000,3,800,1400,30,20,1,26,68,5,95,30,10,12,1,0,42,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7358,400,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
-1679,VENATU_4,Venatu,Venatu,75,12300,0,4000,2000,3,800,1400,30,20,1,26,24,5,100,30,10,12,1,0,41,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7359,300,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
-1680,HILL_WIND_1,Hill Wind,Hill Wind,45,4233,0,2132,1722,1,320,510,10,15,1,42,31,50,67,23,10,12,1,2,64,157,200,1272,672,480,0,0,0,0,0,0,0,0,7115,4000,7116,3000,528,1000,510,10,0,0,0,0,0,0,0,0,0,0,0,0
-1681,GEMINI,Gemini-S58,Gemini-S58,72,57870,0,22024,9442,1,2150,3030,60,45,1,75,70,77,105,55,10,12,1,0,61,189,200,1272,672,480,0,0,0,0,0,0,0,0,7005,3000,603,1000,7005,3000,546,500,547,400,971,100,972,100,0,0,0,0,0,0
-1682,REMOVAL,Removal,Remover,55,10289,0,3831,1278,1,558,797,5,20,1,20,56,35,57,20,10,12,1,1,49,157,250,1272,672,480,0,0,0,0,0,0,0,0,713,5000,7319,5000,5005,10,549,500,971,50,972,100,5120,10,0,0,0,0,0,0
-1683,POTON_CANON_5,Photon Cannon,Photon Cannon,46,7000,0,2,1,1,560,570,5,10,1,1,1,1,1,1,10,12,1,0,43,669,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1684,G_ARCHDAM,Archdam,Archdam,57,11000,0,0,0,1,600,700,15,15,1,65,35,75,75,15,10,12,2,8,60,157,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1685,APOCALIPS_H,Vesper,Vesper,97,320700,0,200000,100000,2,4000,10000,50,54,1,50,60,70,160,150,10,12,2,2,46,165,200,1564,864,576,50000,5000,617,5500,603,5000,732,2000,7095,5000,7094,3000,617,1000,617,1000,2659,100,2660,100,2661,100,2662,100,0,0,0,0
-1686,ORC_BABY,Orc Baby,Orc Baby,21,912,0,220,220,1,135,270,10,10,1,15,10,18,35,2,10,12,1,7,42,653,200,2000,1000,500,0,0,0,0,0,0,0,0,7126,3500,519,400,627,20,10015,25,5110,1,0,0,0,0,0,0,0,0,0,0
-1687,GREEN_IGUANA,Green Iguana,Green Iguana,54,6444,0,2400,2050,1,550,650,0,10,5,52,64,5,98,14,10,12,1,2,22,129,200,2000,1000,500,0,0,0,0,0,0,0,0,521,750,520,1500,903,7000,528,120,606,30,511,2000,511,100,511,10,0,0,0,0
-1688,LADY_TANEE,Lady Tanee,Lady Tany,89,493000,0,64995,42222,9,450,2170,20,44,1,125,48,78,210,38,10,12,0,3,62,676,75,1564,864,576,2500,4000,617,750,753,2500,732,3000,513,7000,634,3000,12127,1500,607,2800,985,2500,5116,350,1716,250,0,0,0,0,0,0
-1689,G_BACSOJIN,Bacsojin,White Lady,72,56380,0,5590,1659,1,560,1446,10,51,1,85,78,85,150,60,10,12,2,7,44,1973,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1690,G_SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,0,0,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1691,G_KRABEN,Kraben,Kraben,50,5880,0,0,0,1,125,765,1,66,1,40,40,40,40,30,10,12,1,0,48,645,75,1872,672,480,0,0,0,0,0,0,0,0,703,75,521,1500,519,5000,912,5000,5062,1000,2102,15,603,5,0,0,0,0,4295,1
-
-// Thanatos Tower & Abyss
-1692,BREEZE,Breeze,Breeze,56,5099,0,2390,1340,1,294,715,7,32,1,92,6,38,91,45,10,12,1,0,64,141,150,396,384,240,0,0,0,0,0,0,0,0,2270,30,2269,2,945,7000,511,2500,706,8,996,50,604,110,0,0,0,0,0,0
-1693,PLASMA_Y,Plasma,Plasma,56,8400,0,2200,2100,3,400,900,0,40,1,30,10,83,105,45,10,12,0,0,88,141,100,1458,1440,480,0,0,0,0,0,0,0,0,911,6000,644,10,732,12,715,250,969,1,0,0,0,0,0,0,0,0,0,0
-1694,PLASMA_R,Plasma,Plasma,43,5700,0,2000,1000,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,4800,644,4,732,5,716,250,990,140,0,0,0,0,0,0,0,0,0,0
-1695,PLASMA_G,Plasma,Plasma,47,7600,0,2000,1000,3,300,700,0,30,1,30,5,61,90,30,10,12,0,0,82,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,5500,644,5,732,7,717,250,993,160,0,0,0,0,0,0,0,0,0,0
-1696,PLASMA_P,Plasma,Plasma,49,5900,0,2000,1000,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,5000,644,6,732,9,716,250,724,7,0,0,0,0,0,0,0,0,0,0
-1697,PLASMA_B,Plasma,Plasma,44,8200,0,2000,1000,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,6000,644,8,732,10,717,250,991,180,0,0,0,0,0,0,0,0,0,0
-1698,DEATHWORD,Deathword,Deathword,65,18990,0,2986,4912,1,622,1102,10,40,1,75,10,20,140,45,10,12,1,0,80,653,150,864,500,192,0,0,0,0,0,0,0,0,7479,8,7480,4,7478,12,1097,800,7449,4500,7015,1200,618,500,0,0,0,0,0,0
-1699,ANCIENT_MIMIC,Ancient Mimic,Ancient Mimic,60,8080,0,2950,2650,1,530,1697,20,40,1,100,30,40,150,110,10,12,1,0,80,653,100,972,500,288,0,0,0,0,0,0,0,0,603,30,644,50,617,10,2402,50,2404,20,2502,40,2506,8,2610,50,0,0,0,0
-1700,OBSERVATION,Observation,Observation,81,65111,0,39872,33120,1,1666,2609,55,55,1,72,56,126,145,114,10,12,1,8,66,653,150,800,672,480,0,0,0,0,0,0,0,0,7441,4500,2621,2,721,50,7224,10,603,20,7435,800,7442,2500,0,0,0,0,0,0
-1701,SHELTER,Shelter,Shelter,80,38000,0,29010,25110,1,1871,1971,22,63,1,67,34,167,157,120,10,12,1,8,86,653,150,800,672,480,0,0,0,0,0,0,0,0,7440,4000,7104,3000,7224,12,722,35,7442,1200,603,18,7005,1000,0,0,0,0,0,0
-1702,RETRIBUTION,Retribution,Retribution,79,46666,0,28332,33120,1,2022,2288,35,35,1,142,66,72,133,39,10,12,1,8,87,653,150,800,672,480,0,0,0,0,0,0,0,0,7440,6000,7442,3000,7224,25,723,40,2506,20,1158,4,603,28,2621,3,0,0,0,0
-1703,SOLACE,Solace,Solace,77,25252,0,21000,25110,1,1392,1462,21,67,1,76,29,145,99,100,10,12,1,8,86,653,150,800,672,480,0,0,0,0,0,0,0,0,7441,5500,7442,2800,2621,1,7224,30,718,45,1910,5,1909,30,603,32,0,0,0,0
-1704,THANA_ODIUM,Thanatos Odium,Thanatos Odium,92,72389,0,86420,63880,1,2100,2800,68,30,1,52,165,62,185,90,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,250,732,200,7438,500,616,10,0,0,0,0,0,0,0,0,0,0
-1705,THANA_DESPERO,Thanatos Despero,Thanatos Despero,88,86666,0,62001,51220,1,2182,3082,38,39,1,167,79,92,151,120,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,280,732,170,7439,500,616,8,0,0,0,0,0,0,0,0,0,0
-1706,THANA_MAERO,Thanatos Maero,Thanatos Maero,83,62000,0,56699,63880,1,2022,2288,29,72,1,176,30,200,122,29,10,12,1,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,320,732,130,7437,500,616,7,0,0,0,0,0,0,0,0,0,0
-1707,THANA_DOLOR,Thanatos Dolor,Thanatos Dolor,83,59922,0,43200,51220,1,1392,2092,21,80,1,76,29,206,139,44,10,12,0,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,300,732,150,7436,500,616,5,0,0,0,0,0,0,0,0,0,0
-1708,THANATOS,Thanatos,Thanatos,99,445660,0,3666000,2145060,1,3812,7483,35,35,1,108,122,86,147,32,10,10,2,6,88,1973,100,700,672,480,1000000,5000,603,5000,732,3000,616,4000,2412,2000,2342,2000,7450,4000,617,4000,12103,1500,7444,6500,732,1000,644,2500,0,0,0,0
-1709,G_THANA_ODIUM,Thanatos Odium,Thanatos Odium,92,72389,0,0,0,1,2100,2800,68,30,1,52,165,62,185,90,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1710,G_THANA_DESPERO,Thanatos Despero,Thanatos Despero,88,86666,0,0,0,1,2182,3082,38,39,1,167,79,92,151,120,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1711,G_THANA_MAERO,Thanatos Maero,Thanatos Maero,83,62000,0,0,0,1,2022,2288,29,72,1,176,30,200,122,29,10,12,1,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1712,G_THANA_DOLOR,Thanatos Dolor,Thanatos Dolor,83,59922,0,0,0,1,1392,2092,21,80,1,76,29,206,139,44,10,12,0,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1713,ACIDUS,Acidus,Acidus,80,51112,0,28043,8023,1,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,66,653,150,800,672,480,0,0,0,0,0,0,0,0,582,1200,1036,5500,1035,3000,7444,2,715,800,714,25,0,0,0,0,0,0,0,0
-1714,FERUS,Ferus,Ferus,70,29218,0,8093,3952,1,1056,1496,34,45,1,80,100,110,70,70,10,12,2,9,63,653,150,800,672,480,0,0,0,0,0,0,0,0,578,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1715,NOVUS,Novus,Novus,42,5430,0,1320,1002,1,284,384,20,28,1,56,43,45,124,43,10,12,0,9,20,653,150,450,672,480,0,0,0,0,0,0,0,0,1036,5500,511,2000,7053,2500,512,800,0,0,0,0,0,0,0,0,0,0,0,0
-1716,ACIDUS_,Acidus,Acidus,76,39111,0,14392,4203,1,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,61,653,150,800,672,480,0,0,0,0,0,0,0,0,505,400,1036,6000,1035,3200,510,750,717,800,996,120,0,0,0,0,0,0,0,0
-1717,FERUS_,Ferus,Ferus,69,21182,0,6750,2230,1,930,1170,24,38,1,90,100,100,80,70,10,12,2,9,62,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1718,NOVUS_,Novus,Novus,43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,653,150,450,672,480,0,0,0,0,0,0,0,0,1036,6000,508,1200,7053,2200,512,600,0,0,0,0,0,0,0,0,0,0,0,0
-1719,DETALE,Detale,Detale,90,480000,0,291850,123304,1,4560,5548,66,59,1,90,112,136,140,56,10,12,2,9,87,1973,150,750,672,480,50000,7000,617,3000,969,2500,732,5000,7444,1500,7451,4500,12080,2000,1417,3,2231,300,617,800,0,0,0,0,0,0,0,0
-1720,HYDRO,Hydro,Hydro,89,308230,0,83450,2480,1,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,67,653,150,800,672,480,0,5000,603,5000,617,1500,607,2000,7443,4500,7123,3000,1035,1000,7444,60,12085,300,1166,4,12040,80,0,0,0,0,0,0
-1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,1,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1722,G_JAKK_,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1723,G_SHECIL_,Shecil Damon,Cecil Damon,82,58900,0,0,0,9,1226,1854,25,15,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1724,G_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,7,800,900,10,10,1,40,25,20,60,30,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1725,G_PORING,Poring,Poring,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1726,G_LUNATIC_,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1727,G_SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,0,0,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1728,G_DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,0,0,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1729,G_BAPHOMET__,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1730,G_DEVIRUCHI_,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1731,G_DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,0,0,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,1205,100,480,480,288,0,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1732,G_TREASURE_BOX,Treasure Chest,Treasure Chest,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-// Kiel Dungeon monsters (stats are done - Vicious, drops and skills are done as well - MoM. I still don't know what "Scrap Fragment" and "Hard Iron Piece" are though)
-1733,KIEL,Kiel,Kiel,90,523000,0,36500,23405,1,1682,3311,28,32,1,112,76,89,156,102,10,12,1,0,47,131,200,672,672,480,0,5000,603,6000,617,3000,617,1500,7513,3500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1734,KIEL_,Kiel D-01,Kiel D-01,90,1523000,0,2356200,512602,1,3280,6560,28,32,1,130,140,160,199,180,10,12,1,0,47,1973,200,672,672,480,1,1000,617,5000,7513,1000,0,0,7513,3000,2319,50,1620,50,1242,50,0,0,0,0,0,0,0,0,0,0,0,0
-1735,ALICEL,Alicel,Alicel,75,37520,0,8890,5420,1,1800,2770,30,30,1,58,50,51,92,40,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,999,200,7317,3000,1812,1,985,50,0,0,0,0,0,0,0,0
-1736,ALIOT,Aliot,Aliot,75,48290,0,13020,4006,1,950,2470,35,15,1,32,87,12,68,19,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,999,250,7317,3200,1408,20,985,55,0,0,0,0,0,0,0,0
-1737,ALIZA,Aliza,Aliza,69,19000,0,6583,3400,1,750,1100,8,5,1,72,52,35,110,140,10,12,1,7,60,145,200,672,672,480,0,0,0,0,0,0,0,0,637,20,2407,1,2626,1,7047,2500,12128,5,661,10,2233,1,0,0,0,0,0,0
-1738,CONSTANT,Constant,Constant,55,10000,0,3230,116,1,460,580,12,12,1,28,26,47,66,14,10,12,0,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,7325,3000,999,120,757,250,0,0,0,0,0,0,0,0,0,0
-1739,G_ALICEL,Alicel,Alicel,75,37520,0,0,0,1,1800,2770,30,30,1,58,50,51,92,40,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1740,G_ALIOT,Aliot,Aliot,75,48290,0,0,0,1,950,2470,35,15,1,32,87,12,68,19,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1741,G_COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1742,G_CARAT,Carat,Carat,51,5200,0,0,0,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1743,G_MYSTCASE,Myst Case,Myst Case,38,3450,0,0,0,1,160,360,5,10,1,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1744,G_WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,0,0,1,315,360,0,15,1,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1745,G_CONSTANT,Constant,Constant,55,10000,0,0,0,1,460,580,12,12,1,28,26,47,66,14,10,12,0,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1746,G_ALIZA,Aliza,Aliza,69,19000,0,0,0,1,750,1100,8,5,1,72,52,35,110,140,10,12,1,7,60,145,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1747,G_SNAKE,Snake,Boa,15,471,0,0,0,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1748,G_ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,0,0,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1749,G_MEDUSA,Medusa,Medusa,79,22408,0,0,0,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,2000,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1750,G_RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,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
-
-// Odin monsters (stats are done - Vicious, no drops/skills yet)
-1751,RANDGRIS,Valkyrie Randgris,Valkyrie Randgris,99,3567200,0,2854900,3114520,1,5560,8980,25,42,1,120,80,120,220,210,10,12,2,8,86,161,150,584,576,480,0,5000,603,6000,617,3000,617,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1752,SKOGUL,Skogul,Skogul,70,87544,0,27620,10,1,1110,1930,20,15,1,69,70,50,112,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1753,FRUS,Frus,Frus,69,83422,0,20620,10,1,1110,1780,20,15,1,69,60,50,123,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1754,SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,91100,10,1,2010,2630,12,24,1,100,50,72,106,50,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1755,SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,99200,10,1,2510,2960,15,24,1,120,60,85,119,80,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1756,G_HYDRO,Hydro,Hydro,89,308230,0,0,0,1,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,67,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1757,G_ACIDUS,Acidus,Acidus,80,51112,0,0,0,1,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,66,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1758,G_FERUS,Ferus,Ferus,70,29218,0,0,0,1,1056,1496,34,45,1,80,100,110,70,70,10,12,2,9,63,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1759,G_ACIDUS_,Acidus,Acidus,76,39111,0,0,0,1,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,61,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1760,G_FERUS_,Ferus,Ferus,69,21182,0,0,0,1,930,1170,24,38,1,90,100,100,80,70,10,12,2,9,62,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1761,G_SKOGUL,Skogul,Skogul,70,87544,0,0,0,1,1110,1930,20,15,1,69,70,50,112,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1762,G_FRUS,Frus,Frus,69,83422,0,0,0,1,1110,1780,20,15,1,69,60,50,123,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1763,G_SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,0,0,1,2010,2630,12,24,1,100,50,72,106,50,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1764,G_SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,0,0,1,2510,2960,15,24,1,120,60,85,119,80,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1765,G_RANDGRIS,Valkyrie,Valkyrie,99,1567200,0,10000,10000,1,5560,9980,25,42,1,120,80,120,220,210,10,12,2,8,86,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1766,EM_ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1767,EM_DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,1,50,20,75,77,200,10,12,1,6,87,1205,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-
-//Homunculi (Don't uncomment) (Why? :P [Poki#3])
-//6001,LIF,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6002,AMISTR,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6003,FILIR,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6004,VANILMIRTH,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6005,LIF2,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6006,AMISTR2,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6007,FILIR2,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6008,VANILMIRTH2,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6009,LIF_H,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6010,AMISTR_H,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6011,FILIR_H,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6012,VANILMIRTH_H,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6013,LIF_H2,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6014,AMISTR_H2,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6015,FILIR_H2,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-//6016,VANILMIRTH_H2,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+// Monster Database
+//
+// Structure of Database :
+// ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ThinkTime,aMotion,dMotion,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Drop9id,Drop9per,DropCardid,DropCardper
+// Note: Keep the Sprite_Name field as it is (in the game client). You may change Name,JName field tough
+
+1001,SCORPION,Scorpion,Scorpion,24,1109,0,287,176,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,0,0,0,0,4068,1
+1002,PORING,Poring,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1
+1003,TESTEGG,Test Egg,Test Egg,2,100000,0,10,10,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0,512,0,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1004,HORNET,Hornet,Hornet,8,169,0,19,15,1,22,27,5,5,1,20,8,10,17,5,10,12,0,4,24,137,150,1292,792,216,0,0,0,0,0,0,0,0,992,50,939,5500,909,3500,1208,15,511,350,518,100,0,0,0,0,0,0,4019,1
+1005,FARMILIAR,Familiar,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,0,0,0,0,4020,1
+1006,THIEF_BUG_LARVA,Thief Bug Larva,Thief Bug Larva,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1007,FABRE,Fabre,Fabre,2,63,0,3,2,1,7,10,0,0,1,2,4,1,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,0,0,0,0,4002,1
+1008,PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,1,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,0,0,0,0,4003,1
+1009,CONDOR,Condor,Condor,5,92,0,6,5,1,11,14,0,0,1,13,5,1,13,10,10,12,1,2,24,137,150,1148,648,480,0,0,0,0,0,0,0,0,917,6500,1702,150,715,80,1750,5500,517,400,916,2000,0,0,0,0,0,0,4015,1
+1010,WILOW,Willow,Willow,4,95,0,5,4,1,9,12,5,15,1,4,8,30,9,10,10,12,1,3,22,129,200,1672,672,432,0,0,0,0,0,0,0,0,902,6100,1019,100,907,1500,516,700,1068,3500,1067,2000,1066,1000,0,0,0,0,4010,1
+1011,CHONCHON,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,129,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,0,0,0,0,4009,1
+1012,RODA_FROG,Roda Frog,Roda Frog,5,133,0,6,5,1,11,14,0,5,1,5,5,5,10,5,10,12,1,5,21,129,200,2016,816,288,0,0,0,0,0,0,0,0,918,5500,908,500,511,300,721,7,713,2000,0,0,0,0,0,0,0,0,4014,1
+1013,WOLF,Wolf,Wolf,12,405,0,45,32,1,37,46,0,0,1,12,24,15,30,20,10,12,1,2,22,137,200,1054,54,432,0,0,0,0,0,0,0,0,1011,20,920,5500,2308,10,517,650,528,1050,919,5500,0,0,0,0,0,0,4029,1
+1014,SPORE,Spore,Spore,9,327,0,22,17,1,24,29,0,5,1,9,9,1,14,5,10,12,1,3,21,129,200,1872,672,288,0,0,0,0,0,0,0,0,921,5000,507,800,510,50,743,5,2220,40,7033,5,0,0,0,0,0,0,4022,1
+1015,ZOMBIE,Zombie,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,1,15,1,10,12,1,1,29,2181,400,2612,912,288,0,0,0,0,0,0,0,0,957,5500,724,5,938,1000,958,50,727,55,0,0,0,0,0,0,0,0,4038,1
+1016,ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,483,283,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,0,0,0,0,0,0,0,0,932,4500,756,70,2285,3,1708,35,1752,1000,507,800,1701,150,0,0,0,0,4094,1
+1017,THIEF_BUG_FEMALE,Thief Bug Female,Thief Bug Female,10,170,0,35,18,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,651,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,0,0,0,0,4026,1
+1018,CREAMY,Creamy,Creamy,16,595,0,105,70,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,150,1136,720,840,0,0,0,0,0,0,0,0,924,5500,2322,10,518,150,602,100,2207,2,712,500,692,100,0,0,0,0,4040,1
+1019,PECOPECO,Peco Peco,Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,137,200,1564,864,576,0,0,0,0,0,0,0,0,925,5500,2402,20,508,50,507,900,1604,100,0,0,0,0,0,0,0,0,4031,1
+1020,MANDRAGORA,Mandragora,Mandragora,12,405,0,45,32,4,26,35,0,25,1,12,24,1,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,993,50,905,5500,1405,30,511,350,711,300,706,1,1967,10,0,0,0,0,4030,1
+1021,THIEF_BUG_MALE,Thief Bug Male,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,653,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
+1022,WEREWOLF,Werewolf,Werewolf,80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,163,200,1500,768,652,0,0,0,0,0,0,0,0,999,500,1034,4000,984,500,985,500,7017,800,0,0,1912,300,0,0,0,0,0,0
+1023,ORK_WARRIOR,Orc Warrior,Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1024,WORM_TAIL,Wormtail,Wormtail,14,426,0,59,40,2,42,51,5,10,1,14,28,5,46,5,10,12,1,3,22,145,200,1048,48,192,0,0,0,0,0,0,0,0,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,100,0,0,0,0,4034,1
+1025,SNAKE,Snake,Boa,15,471,0,72,48,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,926,5500,1117,15,507,900,1011,35,937,800,954,1,0,0,0,0,0,0,4037,1
+1026,MUNAK,Munak,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,2181,200,2468,768,288,0,0,0,0,0,0,0,0,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,0,0,0,0,4090,1
+1027,RAPTICE,Raptice,Raptice,17,600,0,100,55,1,0,0,5,10,5,20,20,0,28,10,10,12,1,2,22,131,200,2000,1000,500,0,0,0,0,0,0,0,0,909,7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1028,SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,932,5500,756,60,1214,12,507,700,934,10,1201,150,1216,50,0,0,0,0,4086,1
+1029,ISIS,Isis,Isis,43,4828,0,2396,993,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,149,200,1384,768,336,0,0,0,0,0,0,0,0,936,5335,2233,5,2603,1,733,150,732,20,954,1000,731,5,0,0,0,0,4116,1
+1030,ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,300,149,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,1011,50,937,5500,1455,10,926,1500,936,200,508,150,756,38,0,0,0,0,4062,1
+1031,POPORING,Poporing,Poporing,14,344,0,81,44,1,59,72,0,10,1,14,14,1,19,15,10,12,1,3,25,131,300,1672,672,480,0,0,0,0,0,0,0,0,938,5500,910,1500,511,500,514,200,512,5,1207,5,512,250,0,0,0,0,4033,1
+1032,VERIT,Verit,Verit,38,5272,0,835,517,1,389,469,0,5,1,19,38,1,38,20,10,12,1,1,29,131,250,2468,768,480,0,0,0,0,0,0,0,0,929,5335,912,700,930,1100,509,550,2609,1,2612,200,639,20,0,0,0,0,4107,1
+1033,ELDER_WILOW,Elder Willow,Elder Willow,20,693,0,163,101,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1452,672,432,0,0,0,0,0,0,0,0,990,50,907,5500,1019,350,757,37,2329,30,690,100,604,100,0,0,0,0,4052,1
+1034,THARA_FROG,Thara Frog,Thara Frog,22,2152,0,219,138,1,105,127,0,10,1,22,22,5,34,10,10,12,1,5,41,129,200,2016,816,288,0,0,0,0,0,0,0,0,1011,45,908,5500,911,600,509,30,725,5,918,2000,0,0,0,0,0,0,4058,1
+1035,HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,1517,952,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,996,30,999,100,943,5335,912,1300,756,129,2259,1,1226,2,0,0,0,0,4115,1
+1036,GHOUL,Ghoul,Ghoul,39,5118,0,882,541,1,420,500,5,20,1,20,29,1,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,958,5335,756,110,509,670,511,800,2609,60,934,150,1260,0,0,0,0,0,4110,1
+1037,SIDE_WINDER,Side Winder,Side Winder,43,4929,0,1996,993,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,0,0,0,0,0,0,0,0,954,5335,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,0,0,0,0,4117,1
+1038,OSIRIS,Osiris,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,10,1,1,89,1205,100,1072,672,384,7710,5000,603,4000,608,3000,751,500,617,2000,1232,150,2235,200,1255,600,1009,1000,5053,150,984,3783,0,0,0,0,4144,1
+1039,BAPHOMET,Baphomet,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1205,100,1068,768,576,13000,5000,607,2000,750,500,923,5000,1466,200,2256,200,2607,800,714,500,617,3000,985,5432,984,4171,0,0,0,0,4147,1
+1040,GOLEM,Golem,Golem,25,3900,0,465,94,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,0,0,0,0,4072,1
+1041,MUMMY,Mummy,Mummy,37,5176,0,488,314,1,305,360,0,10,1,19,32,0,63,20,10,12,1,1,49,2181,300,1772,72,384,0,0,0,0,0,0,0,0,930,5335,756,100,934,550,2604,1,2611,10,525,250,508,450,0,0,0,0,4106,1
+1042,STEEL_CHONCHON,Steel Chonchon,Steel Chonchon,17,530,0,109,71,1,54,65,15,0,1,43,17,5,33,10,10,12,0,4,24,139,150,1076,576,480,0,0,0,0,0,0,0,0,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,300,0,0,0,0,4042,1
+1043,SEAHORES,Seahorse,Seahorse,18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,131,200,1500,800,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1044,OBEAUNE,Obeaune,Obeaune,31,3952,0,644,407,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,0,0,0,0,0,0,0,0,995,13,950,5500,5014,1,2326,10,720,10,951,500,748,25,0,0,0,0,4093,1
+1045,MARC,Marc,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,995,18,956,5335,756,95,951,1000,720,10,717,200,509,600,0,0,0,0,4105,1
+1046,DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,1205,100,480,480,288,5340,5000,724,1500,505,6000,0,0,2317,250,1162,220,1168,150,2258,350,1411,550,985,3686,984,2700,0,0,0,0,4142,1
+1047,PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,250,935,1500,2102,2,507,400,507,400,713,1800,736,10,0,0,0,0,4007,1
+1048,THIEF_BUG_EGG,Thief Bug Egg,Thief Bug Egg,4,48,0,8,4,0,13,17,20,0,1,6,4,0,14,20,10,12,0,4,27,0,1000,701,1,1,0,0,0,0,0,0,0,0,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,250,0,0,0,0,4012,1
+1049,PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,5,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,2302,150,507,550,519,300,715,50,0,0,0,0,0,0,4008,1
+1050,PICKY_,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,10,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,700,5015,10,507,600,519,300,715,50,10012,10,0,0,0,0,4011,1
+1051,THIEF_BUG,Thief Bug,Thief Bug,6,126,0,17,5,1,18,24,5,0,1,6,6,0,11,0,10,12,0,0,60,139,150,1288,288,768,0,0,0,0,0,0,0,0,955,2500,2304,80,507,350,909,2000,2303,120,1002,250,0,0,0,0,0,0,4016,1
+1052,ROCKER,Rocker,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,0,940,5000,1916,10,2298,4,1402,80,520,10,752,5,703,2,0,0,0,0,4021,1
+1053,THIEF_BUG_,Thief Bug Female,Thief Bug Female,10,170,0,0,0,1,33,40,5,5,1,15,10,5,23,5,10,12,1,4,27,139,200,988,288,768,0,0,0,0,0,0,0,0,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,300,0,0,0,0,4026,1
+1054,THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,0,0,0,0,4050,1
+1055,MUKA,Muka,Muka,15,570,0,72,48,1,40,49,5,5,1,15,30,5,20,10,10,12,2,3,22,129,300,1960,960,384,0,0,0,0,0,0,0,0,993,70,952,5500,713,2000,511,400,507,1000,1451,50,1002,250,0,0,0,0,4036,1
+1056,SMOKIE,Smokie,Smokie,18,641,0,134,86,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,945,5500,919,5500,516,800,2213,1,754,2,912,5,729,2,0,0,0,0,4044,1
+1057,YOYO,Yoyo,Yoyo,19,879,0,148,93,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,0,0,0,0,0,0,0,0,942,5500,513,1500,508,100,919,5000,753,5,756,24,0,0,0,0,0,0,4051,1
+1058,METALLER,Metaller,Metaller,22,926,0,241,152,1,131,159,15,30,1,22,22,20,49,50,10,12,1,4,23,139,200,1708,1008,540,0,0,0,0,0,0,0,0,990,60,940,6500,911,400,757,49,707,20,935,3000,1914,10,0,0,0,0,4057,1
+1059,MISTRESS,Mistress,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,1,165,60,95,70,130,10,12,0,4,84,1205,100,1148,648,300,2569,5000,996,1500,526,4000,722,3000,1413,150,518,10000,2249,250,616,1000,7018,10,985,4268,984,3300,0,0,0,0,4132,1
+1060,BIGFOOT,Bigfoot,Bigfoot,25,1619,0,310,188,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,948,5500,2289,5,919,5000,740,80,516,1500,518,400,756,43,0,0,0,0,4074,1
+1061,NIGHTMARE,Nightmare,Nightmare,49,4437,0,1729,1787,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,0,0,0,0,0,0,0,0,944,4947,510,500,2608,2,603,30,505,100,1261,1,984,60,0,0,0,0,4127,1
+1062,SANTA_PORING,Santa Poring,Santa Poring,3,69,0,4,5,1,12,16,0,0,1,14,3,10,12,90,10,12,1,3,26,129,400,1672,672,480,0,0,0,0,0,0,0,0,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,0,0,0,0,0,0,4005,1
+1063,LUNATIC,Lunatic,Lunatic,3,60,0,6,2,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,705,6500,949,1000,2262,4,515,2000,507,600,515,1100,622,20,0,0,0,0,4006,1
+1064,MEGALODON,Megalodon,Megalodon,24,1648,0,215,132,1,155,188,0,15,1,12,24,0,26,5,10,12,1,1,29,129,200,2492,792,432,0,0,0,0,0,0,0,0,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,0,0,0,0,4067,1
+1065,STROUF,Strouf,Strouf,40,9952,0,1238,752,1,200,350,5,50,1,40,45,72,43,65,10,12,2,5,61,2181,150,1872,672,384,0,0,0,0,0,0,0,0,951,5335,756,115,2241,2,1461,2,949,3000,720,20,956,1500,0,0,0,0,4111,1
+1066,VADON,Vadon,Vadon,19,1017,0,135,85,1,74,85,20,0,1,19,16,10,36,15,10,12,0,5,21,145,300,1632,432,540,0,0,0,0,0,0,0,0,991,35,960,5500,910,3000,2313,5,943,100,757,34,717,50,0,0,0,0,4049,1
+1067,CORNUTUS,Cornutus,Cornutus,23,1620,0,240,149,1,109,131,30,0,1,23,23,5,36,12,10,12,0,5,21,145,200,1248,48,480,0,0,0,0,0,0,0,0,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,0,0,0,0,4061,1
+1068,HYDRA,Hydra,Hydra,14,660,0,59,40,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,1011,25,962,5500,938,1500,971,20,525,5,517,700,0,0,0,0,0,0,4035,1
+1069,SWORD_FISH,Swordfish,Swordfish,30,4299,0,529,319,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,2181,200,1968,768,384,0,0,0,0,0,0,0,0,995,10,963,5500,756,33,2257,2,757,45,1117,25,956,600,0,0,0,0,4089,1
+1070,KUKRE,Kukre,Kukre,11,507,0,38,28,1,28,37,15,0,1,11,11,5,16,2,10,12,0,5,21,131,150,1776,576,288,0,0,0,0,0,0,0,0,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,0,0,0,0,4027,1
+1071,PIRATE_SKEL,Pirate Skeleton,Pirate Skeleton,25,1676,0,233,142,1,145,178,10,15,1,13,25,5,25,10,10,12,1,1,29,2181,200,1754,554,288,0,0,0,0,0,0,0,0,932,3000,2287,15,1125,25,2211,250,1104,250,756,43,628,20,0,0,0,0,4073,1
+1072,KAHO,Kaho,Kaho,60,8409,0,3990,450,1,110,760,5,50,1,55,43,88,80,46,10,12,1,6,83,2181,175,1700,1000,500,0,0,0,0,0,0,0,0,994,30,1003,150,7097,3000,690,100,757,1000,716,300,970,5,0,0,0,0,4065,1
+1073,CRAB,Crab,Crab,20,2451,0,163,101,1,71,81,35,0,1,20,15,1,36,15,7,12,0,5,21,129,200,992,792,360,0,0,0,0,0,0,0,0,964,5500,960,1500,7049,700,1001,13,0,0,0,0,757,37,0,0,0,0,4153,1
+1074,SHELLFISH,Shellfish,Shellfish,15,920,0,66,44,1,35,42,35,0,1,12,8,1,32,5,10,12,0,5,21,145,200,864,864,384,0,0,0,0,0,0,0,0,965,5500,966,1000,7049,500,1056,1000,1001,10,0,0,757,18,0,0,0,0,4273,1
+1075,TURTLE,Turtle,Turtle,3,77,0,0,0,1,1,2,35,0,1,1,1,1,1,1,7,12,0,5,22,129,200,500,500,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1076,SKELETON,Skeleton,Skeleton,10,234,0,18,14,1,39,47,10,5,1,5,10,1,12,1,10,12,1,1,29,145,200,2228,528,576,0,0,0,0,0,0,0,0,1010,90,932,800,1505,80,909,3000,507,850,2609,30,0,0,0,0,0,0,4025,1
+1077,POISON_SPORE,Poison Spore,Poison Spore,19,665,0,186,93,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,5,0,0,0,0,4048,1
+1078,RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0
+1079,BLUE_PLANT,Blue Plant,Blue Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0
+1080,GREEN_PLANT,Green Plant,Green Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0
+1081,YELLOW_PLANT,Yellow Plant,Yellow Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0
+1082,WHITE_PLANT,White Plant,White Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0
+1083,SHINING_PLANT,Shining Plant,Shining Plant,1,20,0,0,0,1,1,2,100,99,1,1,1,1,1,90,7,12,0,3,26,64,2000,1,1,1,0,0,0,0,0,0,0,0,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0
+1084,BLACK_MUSHROOM,Black Mushroom,Black Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0
+1085,RED_MUSHROOM,Red Mushroom,Red Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0
+1086,GOLDEN_BUG,Golden Thief Bug,Golden Thief Bug,64,126000,0,14300,7150,1,870,1145,60,45,1,75,35,45,85,150,10,12,2,4,43,171,100,768,768,480,1250,5000,2610,2000,701,1000,0,0,969,1000,1524,150,2246,250,10016,500,714,300,985,2000,984,1500,0,0,0,0,4128,1
+1087,ORK_HERO,Orc Hero,Orc Hero,77,295700,0,58630,32890,1,2257,2542,40,45,1,91,99,70,105,90,10,10,2,7,42,1205,150,1678,780,648,4500,5000,725,2000,607,1500,999,5000,968,9700,10018,500,1366,150,2106,250,1124,1000,985,4559,984,3589,0,0,0,0,4143,1
+1088,VOCAL,Vocal,Vocal,18,3016,0,110,88,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,2247,50,940,8000,721,1000,752,1500,912,5335,645,700,1917,10,0,0,0,0,4211,1
+1089,TOAD,Toad,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,10,1,5,21,1205,200,1236,336,432,0,0,0,0,0,0,0,0,2244,50,518,2000,729,1000,746,1500,970,100,971,100,0,0,0,0,0,0,4306,1
+1090,MASTERING,Mastering,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,10,1,3,21,1205,300,1072,672,480,0,0,0,0,0,0,0,0,2257,200,619,50,722,1000,512,18,512,8000,512,8000,531,4000,0,0,0,0,4197,1
+1091,DRAGON_FLY,Dragon Fly,Dragon Fly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,10,0,4,24,1205,100,1076,576,480,0,0,0,0,0,0,0,0,2245,200,501,8000,719,1500,742,2000,2607,3000,625,50,533,3000,0,0,0,0,4179,1
+1092,VAGABOND_WOLF,Vagabond Wolf,Vagabond Wolf,24,12240,0,247,176,1,135,159,10,0,1,45,48,20,50,65,10,10,1,2,22,1205,150,1048,648,432,0,0,0,0,0,0,0,0,2248,200,920,8000,728,1500,1148,100,517,8000,725,10,626,50,0,0,0,0,4183,1
+1093,ECLIPSE,Eclipse,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,10,0,2,60,1205,200,1456,456,336,0,0,0,0,0,0,0,0,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,0,0,0,0,4266,1
+1094,AMBERNITE,Ambernite,Ambernite,13,495,0,57,38,1,39,46,30,0,1,13,13,5,18,5,10,12,2,4,21,145,400,2048,648,648,0,0,0,0,0,0,0,0,991,35,946,5500,910,1200,935,3000,943,2,757,14,1002,150,0,0,0,0,4032,1
+1095,ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,139,300,1288,288,384,0,0,0,0,0,0,0,0,955,5500,910,1000,938,500,993,40,1001,4,1002,350,757,28,0,0,0,0,4043,1
+1096,ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,2254,100,2324,60,610,500,2282,1,504,1000,512,28,714,40,0,0,0,0,4054,1
+1097,ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,320,935,2000,909,2000,938,650,713,2000,1002,200,0,0,0,0,0,0,4013,1
+1098,ANUBIS,Anubis,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,1717,200,2000,1000,500,0,0,0,0,0,0,0,0,2602,5,504,600,2601,5,1007,15,0,0,0,0,0,0,0,0,0,0,4138,1
+1099,ARGIOPE,Argiope,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,1685,300,1792,792,336,0,0,0,0,0,0,0,0,1042,5335,912,1200,757,175,2406,5,511,1500,719,10,0,0,0,0,0,0,4114,1
+1100,ARGOS,Argos,Argos,25,1117,0,388,188,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,0,0,0,0,0,0,0,0,1025,5500,911,1200,1042,500,757,61,511,670,508,250,10017,15,0,0,0,0,4075,1
+1101,BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,1173,100,868,480,120,0,0,0,0,0,0,0,0,923,500,984,63,1464,2,607,50,610,100,508,300,2405,50,0,0,0,0,4129,1
+1102,BATHORY,Bathory,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,1001,200,1061,4850,2252,3,1611,5,1000,30,1006,15,637,20,0,0,0,0,4119,1
+1103,CARAMEL,Caramel,Caramel,23,1424,0,264,162,1,90,112,5,5,1,23,46,5,38,10,10,12,0,2,22,145,200,1604,840,756,0,0,0,0,0,0,0,0,1027,5500,2310,5,919,5500,1455,10,1405,15,1408,20,0,0,0,0,0,0,4063,1
+1104,COCO,Coco,Coco,17,817,0,120,78,1,56,67,0,0,1,17,34,20,24,10,10,12,0,2,22,145,150,1864,864,1008,0,0,0,0,0,0,0,0,1026,5500,2502,20,914,3000,919,2500,516,500,2402,25,0,0,0,0,0,0,4041,1
+1105,DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,139,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
+1106,DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,141,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,0,0,0,0,4082,1
+1107,DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,20,16,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,1010,85,919,5500,2306,80,517,600,2301,200,0,0,0,0,0,0,0,0,4023,1
+1108,DEVIACE,Deviace,Deviace,47,19192,0,2105,1329,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,995,25,1053,5335,1054,1000,5011,2,971,100,1256,3,756,161,0,0,0,0,4125,1
+1109,DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,1173,150,980,600,384,0,0,0,0,0,0,0,0,1038,5335,1039,400,984,2,1458,2,1009,5,912,1500,756,154,0,0,0,0,4122,1
+1110,DOKEBI,Dokebi,Dokebi,33,2697,0,889,455,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,0,0,0,0,0,0,0,0,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,0,0,0,0,4098,1
+1111,DRAINLIAR,Drainliar,Drainliar,24,1162,0,431,176,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,149,250,1276,576,384,0,0,0,0,0,0,0,0,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,0,0,0,0,4069,1
+1112,DRAKE,Drake,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,1,80,49,75,79,50,10,12,1,1,29,1205,400,620,420,360,4300,5000,504,5000,719,500,0,0,1127,600,1125,950,1135,150,1128,400,5019,350,985,3200,984,2300,0,0,0,0,4137,1
+1113,DROPS,Drops,Drops,3,55,0,4,3,1,10,13,0,0,1,3,3,1,12,15,10,12,1,3,23,131,400,1452,672,480,0,0,0,0,0,0,0,0,909,7500,1602,80,938,500,512,1100,713,1700,512,800,620,20,0,0,0,0,4004,1
+1114,DUSTINESS,Dustiness,Dustiness,21,1044,0,218,140,1,80,102,0,10,1,53,17,1,38,5,10,12,0,4,44,145,150,1004,504,384,0,0,0,0,0,0,0,0,1057,5500,1058,500,2291,4,928,2000,1001,10,507,1200,0,0,0,0,0,0,4056,1
+1115,EDDGA,Eddga,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,1,70,85,66,90,85,10,12,2,2,23,1205,300,872,1344,432,6179,5000,1029,5000,1030,1000,994,3000,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,0,0,0,0,4123,1
+1116,EGGYRA,Eggyra,Eggyra,24,633,0,215,220,1,85,107,20,25,1,36,24,1,32,1,10,12,1,0,48,145,200,1816,816,288,0,0,0,0,0,0,0,0,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,0,0,0,0,4070,1
+1117,EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,2890,1827,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,1173,300,2276,576,336,0,0,0,0,0,0,0,0,2217,10,1615,1,2508,2,1551,10,610,200,609,10,509,2000,0,0,0,0,4141,1
+1118,FLORA,Flora,Flora,26,2092,0,357,226,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,1032,5500,2253,3,704,10,521,50,629,20,905,2000,748,1,0,0,0,0,4080,1
+1119,FRILLDORA,Frilldora,Frilldora,30,2023,0,529,319,1,200,239,0,10,1,30,38,15,53,30,10,12,1,2,23,2181,300,1540,720,432,0,0,0,0,0,0,0,0,1012,5500,757,90,903,1500,721,15,715,200,507,800,912,120,0,0,0,0,4088,1
+1120,GHOSTRING,Ghostring,Ghostring,18,73300,0,101,108,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,1059,5335,2274,100,2336,50,604,500,603,10,714,30,695,100,0,0,0,0,4047,1
+1121,GIEARTH,Giearth,Giearth,29,2252,0,495,301,1,154,185,10,50,1,29,46,60,64,105,10,12,0,6,22,145,200,1848,1296,432,0,0,0,0,0,0,0,0,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,0,0,0,0,0,0,4087,1
+1122,GOBLIN_1,Goblin,Goblin,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,507,800,0,0,0,0,4060,1
+1123,GOBLIN_2,Goblin,Goblin,24,1034,0,287,176,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,998,250,911,1000,5010,3,1511,10,2104,1,507,550,2297,3,0,0,0,0,4060,1
+1124,GOBLIN_3,Goblin,Goblin,24,1034,0,357,176,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,998,230,911,1000,2275,3,5088,15,2104,1,507,550,508,120,0,0,0,0,4060,1
+1125,GOBLIN_4,Goblin,Goblin,23,1359,0,264,164,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,993,100,998,170,5087,15,2263,3,1508,10,2104,1,507,500,0,0,0,0,4060,1
+1126,GOBLIN_5,Goblin,Goblin,22,1952,0,241,152,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,998,150,911,800,1605,15,2104,1,5089,15,507,500,508,120,0,0,0,0,4060,1
+1127,HODE,Hode,Hode,26,2282,0,393,248,1,146,177,0,30,1,26,42,5,49,40,10,12,1,2,42,129,200,1480,480,720,0,0,0,0,0,0,0,0,993,120,1055,5500,757,70,938,3000,1146,10,7021,1,632,20,0,0,0,0,4081,1
+1128,HORN,Horn,Horn,18,659,0,134,86,1,58,69,10,0,1,18,28,10,47,15,10,12,1,4,22,145,200,1528,528,288,0,0,0,0,0,0,0,0,993,80,1011,35,947,5500,1452,15,935,5500,943,70,0,0,0,0,0,0,4045,1
+1129,HORONG,Horong,Horong,34,1939,0,786,479,1,275,327,99,50,1,34,10,1,50,1,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,0,0,0,0,4103,1
+1130,JAKK,Jakk,Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,1008,5,535,1000,0,0,0,0,0,0,4109,1
+1131,JOKER,Joker,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,1173,100,1364,864,432,0,0,0,0,0,0,0,0,912,2000,616,2,641,20,508,1000,1259,1,984,100,695,100,0,0,0,0,4139,1
+1132,KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,1173,350,528,1000,396,0,0,0,0,0,0,0,0,932,8000,985,191,5017,1,2108,2,1004,10,509,1000,1127,2,0,0,0,0,4136,1
+1133,KOBOLD_1,Kobold,Kobold,36,3893,0,988,625,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,700,757,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
+1134,KOBOLD_2,Kobold,Kobold,31,2179,0,806,407,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,999,100,1034,5335,912,200,2104,3,508,100,2101,100,0,0,0,0,0,0,4091,1
+1135,KOBOLD_3,Kobold,Kobold,31,2179,0,644,407,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,990,35,999,100,1034,5335,912,200,0,0,2104,3,508,100,0,0,0,0,4091,1
+1136,KOBOLD_4,Kobold,Kobold,30,3503,0,481,290,1,168,199,15,10,1,30,30,20,50,20,10,12,1,7,41,141,200,2200,1000,500,0,0,0,0,0,0,0,0,999,50,1034,5335,912,100,1355,5,2104,3,508,100,1301,150,0,0,0,0,4091,1
+1137,KOBOLD_5,Kobold,Kobold,30,2462,0,481,290,1,168,199,15,10,1,30,60,20,45,20,10,12,1,7,42,141,200,2000,1000,500,0,0,0,0,0,0,0,0,999,40,1034,5335,912,100,1514,5,2104,3,508,100,1501,150,0,0,0,0,4091,1
+1138,MAGNOLIA,Magnolia,Magnolia,26,3195,0,393,248,1,120,151,5,30,1,26,26,0,39,5,10,12,0,6,21,131,250,1560,360,360,0,0,0,0,0,0,0,0,7031,5500,910,800,911,100,912,10,737,20,508,250,0,0,0,0,0,0,4076,1
+1139,MANTIS,Mantis,Mantis,26,2472,0,393,248,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,0,0,0,0,0,0,0,0,993,110,1031,5500,911,1400,757,70,943,250,721,10,507,650,0,0,0,0,4079,1
+1140,MARDUK,Marduk,Marduk,40,4214,0,1238,752,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,0,0,0,0,0,0,0,0,994,35,1045,4365,1608,10,2617,1,1614,3,691,100,642,20,0,0,0,0,4112,1
+1141,MARINA,Marina,Marina,21,2087,0,218,140,1,84,106,0,5,1,21,21,1,36,10,10,12,0,3,41,129,400,2280,1080,864,0,0,0,0,0,0,0,0,1052,5000,938,1500,991,45,995,2,717,200,631,20,0,0,0,0,0,0,4055,1
+1142,MARINE_SPHERE,Marine Sphere,Marine Sphere,28,3518,0,461,284,1,120,320,0,40,1,28,28,1,33,50,10,12,0,3,21,0,800,1201,1,1,0,0,0,0,0,0,0,0,1050,5000,1051,2500,1520,10,720,10,717,150,10003,10,0,0,0,0,0,0,4084,1
+1143,MARIONETTE,Marionette,Marionette,41,3222,0,1078,1276,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,0,0,0,0,0,0,0,0,1060,4850,2294,5,2605,1,699,100,1520,15,2407,1,514,200,0,0,0,0,4113,1
+1144,MARSE,Marse,Marse,31,5034,0,586,370,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,1024,5000,962,3000,717,200,720,10,995,12,1007,5,514,200,0,0,0,0,4095,1
+1145,MARTIN,Martin,Martin,18,1109,0,134,86,1,52,63,0,5,1,18,30,15,15,5,10,12,0,2,42,129,300,1480,480,480,0,0,0,0,0,0,0,0,1017,6100,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,0,0,0,0,4046,1
+1146,MATYR,Matyr,Matyr,31,2585,0,967,407,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,0,0,0,0,0,0,0,0,2618,10,528,5000,919,5500,537,400,757,100,514,200,0,0,0,0,0,0,4097,1
+1147,MAYA,Maya,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,1,97,76,95,82,105,10,12,2,4,82,1205,100,864,1000,480,10500,5000,730,2000,603,3000,617,2000,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,0,0,0,0,4146,1
+1148,MEDUSA,Medusa,Medusa,79,22408,0,6876,4697,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,2000,1000,500,0,0,0,0,0,0,0,0,1048,5335,1965,250,702,200,2610,150,722,250,967,3500,1007,3,0,0,0,0,4124,1
+1149,MINOROUS,Minorous,Minorous,52,7431,0,2750,1459,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,0,0,0,0,0,0,0,0,941,5335,756,196,1361,2,1005,10,516,1500,1301,200,568,150,0,0,0,0,4126,1
+1150,MOONLIGHT,Moonlight Flower,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,1,99,55,82,95,120,10,10,1,6,63,1205,150,1276,576,288,1250,5000,1022,5000,504,1500,728,500,5008,1000,1234,100,1525,150,10008,500,638,650,985,2600,984,1900,0,0,0,0,4131,1
+1151,MYST,Myst,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,1,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,5005,2,1019,800,10005,10,756,65,757,97,605,20,514,35,0,0,0,0,4108,1
+1152,ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,315,194,1,190,236,10,10,1,14,18,1,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,922,5500,932,3500,757,80,2299,2,1358,10,511,50,0,0,0,0,0,0,4085,1
+1153,ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,196,120,1,151,184,5,10,1,12,24,1,24,5,10,12,1,1,29,2181,400,2852,1152,840,0,0,0,0,0,0,0,0,1043,5500,938,3000,714,1,0,0,0,0,0,0,0,0,0,0,0,0,4071,1
+1154,PASANA,Pasana,Pasana,61,8289,0,4087,2135,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,149,165,1700,1000,500,0,0,0,0,0,0,0,0,7110,4365,7121,2500,757,20,1105,500,1217,150,0,0,0,0,0,0,0,0,4099,1
+1155,PETIT,Petite,Petite,44,6881,0,1677,1034,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,149,200,1624,620,384,0,0,0,0,0,0,0,0,1035,5335,1037,300,756,140,509,1000,1510,150,912,1500,606,15,0,0,0,0,4118,1
+1156,PETIT_,Petite,Petite,45,5747,0,1758,1075,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,149,150,1420,1080,528,0,0,0,0,0,0,0,0,1036,5335,1037,300,985,61,509,1000,602,500,912,1500,606,15,0,0,0,0,4120,1
+1157,PHARAOH,Pharaoh,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,1205,125,2000,1000,500,4060,5000,607,5500,526,5000,732,5000,7113,5820,7114,2500,1136,100,2327,150,5002,500,1552,300,1231,80,0,0,0,0,4148,1
+1158,PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,145,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,5500,963,2000,720,5,517,1000,951,500,756,25,0,0,0,0,0,0,4077,1
+1159,PHREEONI,Phreeoni,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,10,2,2,60,1205,200,1020,1020,288,2700,5000,1008,500,730,1000,1000,4000,1015,9700,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,0,0,0,0,4121,1
+1160,PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,139,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
+1161,PLANKTON,Plankton,Plankton,10,354,0,23,18,1,26,31,0,5,1,10,10,1,15,1,10,12,0,3,61,129,400,2208,1008,324,0,0,0,0,0,0,0,0,1052,5500,910,300,938,700,970,2,713,1000,630,20,645,50,0,0,0,0,4024,1
+1162,RAFFLESIA,Rafflesia,Rafflesia,27,1950,0,388,242,7,105,120,20,10,1,27,54,1,76,27,10,10,0,3,22,128,200,1000,2652,1056,0,0,0,0,0,0,0,0,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,0,0,0,0,4083,1
+1163,RAYDRIC,Raydric,Raydric,52,8613,0,3410,1795,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,0,0,0,0,0,0,0,0,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,4850,0,0,0,0,4133,1
+1164,REQUIEM,Requiem,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,603,35,714,1,912,2500,958,3500,934,1500,2308,10,0,0,0,0,0,0,4104,1
+1165,SAND_MAN,Sandman,Sandman,34,3413,0,810,492,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,997,35,1056,5335,757,118,7043,350,1001,200,1257,1,1622,5,0,0,0,0,4101,1
+1166,SAVAGE,Savage,Savage,26,2092,0,357,226,1,120,150,10,5,1,26,54,10,37,15,10,12,2,2,42,145,150,1960,960,384,0,0,0,0,0,0,0,0,1028,5500,514,150,702,2,2276,1,605,10,757,70,526,1,0,0,0,0,4078,1
+1167,SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,14,12,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,0,0,0,0,4017,1
+1168,SCORPION_KING,Scorpion King,Scorpion King,50,6354,0,2187,1346,1,500,603,40,10,1,50,47,1,83,30,10,12,2,7,23,145,200,1700,1000,500,0,0,0,0,0,0,0,0,994,45,1046,4850,1005,15,904,5000,943,3000,509,700,0,0,0,0,0,0,4130,1
+1169,SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,397,240,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,0,0,0,0,4092,1
+1170,SOHEE,Sohee,Sohee,33,5628,0,739,455,1,210,251,0,10,1,33,33,10,58,15,10,12,1,6,21,145,300,2112,912,576,0,0,0,0,0,0,0,0,1020,5500,1049,50,2277,1,2504,5,1217,5,507,1000,662,350,0,0,0,0,4100,1
+1171,SOLDIER_ANDRE,Soldier Andre,Soldier Andre,22,1245,0,219,138,1,105,127,20,0,1,22,44,20,40,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,2700,911,800,757,10,1111,15,1001,30,943,150,0,0,0,0,0,0,4059,1
+1172,SOLDIER_DENIRO,Soldier Deniro,Soldier Deniro,29,2047,0,450,274,1,162,193,20,0,1,29,58,20,54,10,10,12,0,4,42,149,200,2000,1000,500,0,0,0,0,0,0,0,0,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,0,0,0,0,0,0,4059,1
+1173,SOLDIER_PIERE,Soldier Piere,Soldier Piere,23,1217,0,240,149,1,109,131,25,0,1,23,46,20,38,10,10,12,0,4,42,149,200,1001,1,1,0,0,0,0,0,0,0,0,1014,3100,911,800,911,10,1114,15,1001,35,943,200,0,0,0,0,0,0,4059,1
+1174,STAINER,Stainer,Stainer,16,538,0,105,70,1,53,64,10,0,1,40,16,5,30,5,10,12,0,4,24,145,200,1688,1188,612,0,0,0,0,0,0,0,0,992,60,1011,30,1013,5500,910,2100,757,25,943,10,1002,300,0,0,0,0,4039,1
+1175,TAROU,Tarou,Tarou,11,284,0,57,28,1,34,45,0,0,1,20,11,10,24,5,10,12,0,2,27,145,150,1744,1044,684,0,0,0,0,0,0,0,0,1016,5500,919,3000,949,800,528,1000,701,1,0,0,0,0,0,0,0,0,4028,1
+1176,VITATA,Vitata,Vitata,20,894,0,163,101,1,69,80,15,20,1,20,25,65,40,70,10,12,0,4,22,145,300,1768,768,384,0,0,0,0,0,0,0,0,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,0,0,0,0,4053,1
+1177,ZENORC,Zenorc,Zenorc,31,2585,0,967,407,1,188,223,0,15,1,77,15,1,76,10,10,12,1,7,27,131,150,1180,480,360,0,0,0,0,0,0,0,0,1044,5500,756,70,938,2500,1006,5,508,50,640,20,0,0,0,0,0,0,4096,1
+1178,ZEROM,Zerom,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,1011,55,998,190,2339,200,2265,3,2408,10,1002,300,1002,300,0,0,0,0,4064,1
+1179,WHISPER,Whisper,Whisper,34,1796,0,591,599,1,180,221,0,45,1,51,14,1,60,1,10,12,0,6,68,149,150,1960,960,504,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4102,1
+1180,NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,1650,825,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,1173,150,840,540,480,0,0,0,0,0,0,0,0,1022,4656,746,200,603,100,604,100,526,250,525,350,756,100,0,0,0,0,4159,1
+1181,ZOMBIE_DRAGON,Zombie Dragon,Zombie Dragon,1,1000,0,49500,1650,9,7900,9140,0,0,1,145,145,145,130,120,10,12,2,9,89,1205,400,2700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1182,THIEF_MUSHROOM,Thief Mushroom,Thief Mushroom,1,15,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,1,0,0,0,0,0,0,0,0,1069,1500,1070,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1183,CHONCHON_,Chonchon,Chonchon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,2181,200,1076,576,480,0,0,0,0,0,0,0,0,998,50,935,5500,909,1500,1205,55,601,100,742,5,0,0,0,0,0,0,4009,1
+1184,FABRE_,Fabre,Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,2181,400,1672,672,480,0,0,0,0,0,0,0,0,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,0,0,0,0,4002,0
+1185,WHISPER_,Whisper,Whisper,34,1796,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,1,28,0,150,1960,960,504,0,0,0,0,0,0,0,0,1001,10,1059,100,2282,0,2333,1,0,0,0,0,0,0,0,0,0,0,4102,0
+1186,WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,6,48,1173,250,2536,1536,672,0,0,0,0,0,0,0,0,1001,150,1059,5335,2282,1,2333,10,0,0,0,0,0,0,0,0,0,0,4303,1
+1187,SWITCH,Switch,Switch,1,2,0,1,1,1,1,2,0,0,1,1,1,1,1,1,1,12,1,0,20,0,1,1,1,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
+1188,BON_GUN,Bongun,Bongun,32,3520,0,424,242,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,1094,5500,7014,40,618,60,5046,1,609,15,508,1000,508,250,0,0,0,0,4212,1
+1189,ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,1729,1787,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,149,300,1960,620,480,0,0,0,0,0,0,0,0,1063,4656,1753,1000,1756,2500,1755,2500,1716,2,507,1400,509,900,0,0,0,0,4256,1
+1190,ORC_LORD,Orc Lord,Orc Lord,74,393000,0,62205,8580,1,2700,3150,40,5,1,82,149,70,110,85,10,12,2,7,82,1205,100,1248,500,360,12800,5000,968,5500,617,2000,0,0,1363,200,2601,500,5007,150,2627,1000,0,0,985,4268,984,3100,0,0,0,0,0,0
+1191,MIMIC,Mimic,Mimic,51,6120,0,165,165,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,0,0,0,0,0,0,0,0,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,0,0,0,0,4205,1
+1192,WRAITH,Wraith,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,1173,300,1816,576,240,0,0,0,0,0,0,0,0,1059,5820,2206,10,2506,2,716,650,602,1300,2505,10,731,5,0,0,0,0,4190,1
+1193,ALARM,Alarm,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,1173,300,1020,500,768,0,0,0,0,0,0,0,0,1095,5335,2607,1,7005,1500,611,1300,984,105,7026,20,912,1500,0,0,0,0,4244,1
+1194,ARCLOUSE,Arclouse,Arclouze,59,6075,0,860,1000,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,0,0,0,0,0,0,0,0,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,0,0,0,0,4240,1
+1195,RIDEWORD,Rideword,Rideword,59,11638,0,2007,3106,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,1173,150,864,500,192,0,0,0,0,0,0,0,0,1097,4850,1553,4,1554,4,1555,2,1556,2,7015,300,1006,20,0,0,0,0,4185,1
+1196,SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,2466,1562,1,660,890,10,20,1,20,36,1,76,25,10,12,1,1,69,141,350,1848,500,576,0,0,0,0,0,0,0,0,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,0,0,0,0,4222,1
+1197,ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,2635,1724,1,780,930,10,20,1,24,39,1,72,25,10,12,1,1,69,141,350,1768,500,192,0,0,0,0,0,0,0,0,1099,3500,7016,105,2266,1,716,600,930,3500,2408,39,985,112,0,0,0,0,4275,1
+1198,DARK_PRIEST,Dark Priest,Dark Priest,59,9660,0,3320,2974,1,298,370,30,60,1,54,38,95,82,60,10,12,1,7,87,141,200,1500,500,1000,0,0,0,0,0,0,0,0,1557,5,2608,30,505,100,716,450,1009,50,2319,5,1241,1,0,0,0,0,4171,1
+1199,PUNK,Punk,Punk,43,3620,0,1699,1033,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,0,0,0,0,0,0,0,0,7001,5335,715,800,10004,100,1061,1000,1057,3000,601,1100,2502,15,0,0,0,0,4313,1
+1200,ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,3608,2304,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,160,384,0,0,0,0,0,0,0,0,7017,5,509,800,7293,1500,2331,8,2622,1,1970,100,2291,3,0,0,0,0,4277,1
+1201,RYBIO,Rybio,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,141,200,1500,500,1000,0,0,0,0,0,0,0,0,1015,3880,7017,3,509,800,731,30,1008,10,984,100,0,0,0,0,0,0,4194,1
+1202,PHENDARK,Phendark,Phendark,73,22729,0,6826,3443,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,141,175,1500,500,1000,0,0,0,0,0,0,0,0,1015,3880,7017,4,509,800,0,0,984,150,0,0,0,0,0,0,0,0,4329,1
+1203,MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,1205,250,1152,500,240,0,0,0,0,0,0,0,0,7019,1,7297,1500,1152,70,1155,40,1163,2,999,120,984,243,0,0,0,0,4207,1
+1204,TIRFING,Tirfing,Ogretooth,71,29900,0,5412,4235,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,1205,100,816,500,240,0,0,0,0,0,0,0,0,7022,1,638,50,7292,1500,1214,70,1217,40,999,120,984,189,0,0,0,0,4254,1
+1205,EXECUTIONER,Executioner,Executioner,65,28980,0,4730,3536,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,1205,200,768,500,384,0,0,0,0,0,0,0,0,7024,5,7290,1500,1111,80,1114,60,1125,40,999,120,984,145,0,0,0,0,4250,1
+1206,ANOLIAN,Anolian,Anolian,63,18960,0,4378,2907,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,1173,200,900,500,864,0,0,0,0,0,0,0,0,7003,4850,1754,2000,526,5,10019,10,943,5335,2625,1,984,134,0,0,0,0,4234,1
+1207,STING,Sting,Sting,61,9500,0,4081,2970,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,1173,300,528,500,240,0,0,0,0,0,0,0,0,7004,4850,1756,1500,2624,1,1003,130,997,25,10007,10,719,3,0,0,0,0,4226,1
+1208,WANDER_MAN,Wander Man,Wanderer,74,8170,0,5786,4730,2,450,550,5,5,1,192,38,45,127,85,10,12,1,6,24,1173,100,672,500,192,0,0,0,0,0,0,0,0,7005,4850,616,1,723,500,2270,5,610,650,984,217,608,3,0,0,0,0,4210,1
+1209,CRAMP,Cramp,Cramp,56,4720,0,2300,1513,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,7007,4656,528,1000,726,80,746,110,568,150,510,70,984,95,0,0,0,0,4296,1
+1210,FILAMENTOUS,Filamentous,Filamentous,51,6088,0,1926,1353,1,425,525,35,10,1,35,30,5,83,40,10,12,1,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7008,4850,947,8000,943,3880,993,200,1451,40,757,18,509,1600,0,0,0,0,4045,1
+1211,BRILIGHT,Brilight,Brilight,46,5562,0,1826,1331,1,298,383,30,5,1,90,15,10,50,35,10,12,0,4,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7009,5335,992,200,912,1200,602,1000,757,220,610,250,509,1600,0,0,0,0,4213,1
+1212,IRON_FIST,Iron Fist,Iron Fist,47,4221,0,1435,1520,1,430,590,40,5,1,25,15,10,81,20,10,12,1,4,60,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7010,5335,757,229,757,22,1002,750,999,180,998,300,0,0,0,0,0,0,4239,1
+1213,HIGH_ORC,High Orc,High Orc,52,6890,0,3618,1639,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1173,150,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,508,900,0,0,0,0,4322,1
+1214,CHOCO,Choco,Choco,43,4278,0,1265,1265,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,985,53,513,5000,634,20,532,1000,607,25,0,0,0,0,4285,1
+1215,STEM_WORM,Stem Worm,Stem Worm,40,6136,0,1452,939,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,149,200,1500,500,1000,0,0,0,0,0,0,0,0,7012,5335,509,1800,1968,10,756,115,997,5,1454,20,608,45,0,0,0,0,4224,1
+1216,PENOMENA,Penomena,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,1173,400,832,500,600,0,0,0,0,0,0,0,0,7013,4850,962,8000,938,7000,525,200,719,15,1258,1,716,550,0,0,0,0,4314,1
+1219,KNIGHT_OF_ABYSS,Knight of Abyss,Abysmal Knight,79,36140,0,8469,6268,1,1600,2150,55,50,1,68,64,25,135,50,10,12,2,7,87,1685,300,1500,500,1000,0,0,0,0,0,0,0,0,1064,5335,7023,5,2318,1,1410,25,1162,1,985,369,984,259,0,0,0,0,4140,1
+1220,M_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,427,266,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,1717,200,1120,420,288,0,0,0,0,0,0,0,0,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,0,0,0,0,0,0,4082,1
+1221,M_SAVAGE,Savage,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,1717,150,1960,960,384,0,0,0,0,0,0,0,0,1028,6000,656,150,702,3,2276,2,605,15,757,70,0,0,0,0,0,0,4078,1
+1222,L_HIGH_ORC,High Orc,High Orc,52,6890,0,2128,1490,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,502,1100,0,0,0,0,4066,1
+1223,L_ORC,Orc,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,1717,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1224,L_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,169,85,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,1717,200,1672,672,288,0,0,0,0,0,0,0,0,921,8000,2221,20,511,650,510,55,972,35,0,0,0,0,0,0,0,0,4048,1
+1225,L_CHOCO,Choco,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,1717,200,1500,500,1000,0,0,0,0,0,0,0,0,7011,5335,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,0,0,0,0,4051,1
+1226,L_KOBOLD,Kobold,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,1717,200,1028,528,360,0,0,0,0,0,0,0,0,999,90,1034,5820,912,750,985,25,1220,2,2104,5,0,0,0,0,0,0,4091,1
+1227,L_GOBLIN,Goblin,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,1717,100,1120,620,240,0,0,0,0,0,0,0,0,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,0,0,0,0,4060,1
+1228,L_PHEN,Phen,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,1717,150,2544,1344,1152,0,0,0,0,0,0,0,0,1023,6000,963,2300,720,8,517,1100,951,550,756,25,0,0,0,0,0,0,4077,1
+1229,META_FABRE,Fabre,Fabre,2,63,0,3,2,1,8,11,0,0,1,2,4,1,7,5,10,12,0,4,22,129,400,1672,672,480,0,0,0,0,0,0,0,0,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,0,0,0,0,4002,1
+1230,META_PUPA,Pupa,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,4,22,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,300,0,0,0,0,4003,1
+1231,META_CREAMY,Creamy,Creamy,16,595,0,96,64,1,53,64,0,30,1,40,16,15,16,55,10,12,0,4,24,129,200,1220,720,288,0,0,0,0,0,0,0,0,924,6000,2322,10,518,180,602,200,2207,4,712,800,0,0,0,0,0,0,4040,1
+1232,META_PECOPECO_EGG,Peco Peco Egg,Peco Peco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,120,935,1500,2102,2,507,450,507,450,713,2000,736,15,0,0,0,0,4007,1
+1233,CONCEIVE_PECOPECO,Peco Peco,Peco Peco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,129,200,1564,864,576,0,0,0,0,0,0,0,0,925,6000,2402,20,508,55,507,950,1604,100,0,0,0,0,0,0,0,0,4031,1
+1234,PROVOKE_YOYO,Yoyo,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,651,200,1054,54,384,0,0,0,0,0,0,0,0,942,6000,513,2000,508,130,919,5500,753,7,0,0,0,0,0,0,0,0,4051,1
+1235,SMOKING_ORC,Smoking Orc,Smoking Orc,24,1400,0,261,160,1,114,136,10,20,1,24,48,20,34,1,10,12,1,7,22,653,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1236,META_ANT_EGG,Ant Egg,Ant Egg,4,420,0,5,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,0,1000,1001,1,1,0,0,0,0,0,0,0,0,1010,135,935,2740,909,3000,938,750,713,2000,1002,220,0,0,0,0,0,0,4013,1
+1237,META_ANDRE,Andre,Andre,17,688,0,109,71,1,60,71,10,0,1,17,24,20,26,20,10,12,0,4,22,651,300,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1000,935,3000,1001,6,1002,350,757,28,0,0,0,0,4043,1
+1238,META_PIERE,Piere,Piere,18,733,0,122,78,1,64,75,15,0,1,18,26,20,27,15,10,12,0,4,22,651,200,1288,288,576,0,0,0,0,0,0,0,0,955,5700,910,1100,938,600,992,15,1001,5,1002,400,757,31,0,0,0,0,4043,1
+1239,META_DENIRO,Deniro,Deniro,19,760,0,135,85,1,68,79,15,0,1,19,30,20,43,10,10,12,0,4,22,651,150,1288,288,576,0,0,0,0,0,0,0,0,955,6000,910,3000,938,1200,990,45,1001,8,1002,450,757,34,0,0,0,0,4043,1
+1240,META_PICKY,Picky,Picky,3,80,0,4,3,1,9,12,0,0,1,3,3,1,10,30,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,2302,150,507,650,519,350,715,60,0,0,0,0,0,0,4008,1
+1241,META_SHELL_PICKY,Picky,Picky,4,83,0,5,4,1,8,11,20,0,1,3,3,1,11,20,10,12,0,2,23,129,200,988,288,168,0,0,0,0,0,0,0,0,916,6500,949,850,5015,7,507,750,519,350,715,60,0,0,0,0,0,0,4011,1
+1242,MARIN,Marin,Marin,15,742,0,66,44,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,129,400,1872,672,480,0,0,0,0,0,0,0,0,910,3200,938,1500,700,100,720,40,510,75,529,350,5035,1,0,0,0,0,4196,1
+1243,SASQUATCH,Sasquatch,Sasquatch,30,3163,0,529,319,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,1173,300,1260,192,192,0,0,0,0,0,0,0,0,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,0,0,0,0,4216,1
+1244,JAKK_XMAS,Christmas Jakk,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,1173,200,1180,480,648,0,0,0,0,0,0,0,0,1062,5335,912,900,985,31,2331,5,644,20,7175,1200,7174,1200,0,0,0,0,4109,1
+1245,GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,7174,550,7175,550,756,43,644,10,1211,10,2104,5,2236,10,0,0,0,0,4060,1
+1246,COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,461,284,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,538,1500,722,45,912,200,2502,25,644,5,688,100,507,700,0,0,0,0,4235,1
+1247,ANTONIO,Antonio,Antonio,10,10,0,3,2,1,13,20,99,0,1,1,1,50,100,100,10,12,1,3,66,129,100,720,720,432,0,0,0,0,0,0,0,0,7034,10000,644,200,538,1500,539,1000,529,5500,530,5500,2236,250,0,0,0,0,4243,1
+1248,CRUISER,Cruiser,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,133,400,1296,1296,432,0,0,0,0,0,0,0,0,1098,900,2251,2,998,320,996,5,911,3500,719,35,756,87,0,0,0,0,4297,1
+1249,MYSTCASE,Myst Case,Myst Case,38,3450,0,1113,688,1,160,360,5,10,1,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,530,90,912,1500,603,20,539,800,722,150,731,5,529,340,0,0,0,0,4206,1
+1250,CHEPET,Chepet,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,1173,400,672,672,288,0,0,0,0,0,0,0,0,7035,2500,912,750,512,5500,619,40,10019,5,508,300,2508,5,0,0,0,0,4284,1
+1251,KNIGHT_OF_WINDSTORM,Knight of Windstorm,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,1,185,83,55,130,79,10,12,2,0,84,1205,200,468,468,288,31200,5000,720,4500,2406,500,995,3000,1468,150,603,3000,617,4000,2621,200,2506,500,985,4559,5007,1,0,0,0,0,4318,1
+1252,GARM,Garm,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,1,126,82,65,95,60,10,12,2,2,81,1205,400,608,408,336,28473,5000,7036,1000,603,3000,995,3000,7036,5500,1131,150,1256,500,1815,500,0,0,985,3977,984,2900,0,0,0,0,4324,1
+1253,GARGOYLE,Gargoyle,Gargoyle,48,3950,0,1650,1650,9,290,360,10,10,1,61,20,20,126,40,10,12,1,6,64,133,200,1020,720,384,0,0,0,0,0,0,0,0,912,3880,1039,500,0,0,0,0,2619,1,1769,2000,757,238,0,0,0,0,4149,1
+1254,RAGGLER,Raggler,Raggler,21,1020,0,218,140,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,1173,200,1000,900,384,0,0,0,0,0,0,0,0,7053,3000,916,5000,645,200,514,100,992,90,2225,7,756,32,0,0,0,0,4186,1
+1255,NERAID,Neraid,Nereid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,1173,200,776,576,288,0,0,0,0,0,0,0,0,1055,5100,7053,1000,510,230,1966,10,514,250,757,180,985,37,0,0,0,0,4167,1
+1256,PEST,Pest,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,1173,200,700,648,480,0,0,0,0,0,0,0,0,1055,5500,7054,200,702,10,605,100,716,250,0,0,756,115,0,0,0,0,4315,1
+1257,INJUSTICE,Injustice,Injustice,51,7600,0,2118,1488,1,480,600,0,0,1,42,39,1,71,35,10,12,1,1,47,1173,400,770,720,336,0,0,0,0,0,0,0,0,999,300,7054,5335,7053,3500,2313,5,2316,2,660,2,1255,2,0,0,0,0,4268,1
+1258,GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,461,284,9,89,113,0,0,1,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,2297,3,998,250,911,1000,1765,3000,507,600,1705,25,514,150,0,0,0,0,4157,1
+1259,GRYPHON,Gryphon,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,1205,100,704,504,432,0,0,0,0,0,0,0,0,7048,2500,7054,5335,7063,120,1452,1500,1417,1,984,185,996,150,0,0,0,0,4163,1
+1260,DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,3652,3271,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,1173,200,920,720,200,0,0,0,0,0,0,0,0,7054,4656,734,1000,2505,30,0,0,0,0,1000,80,747,3,0,0,0,0,4170,1
+1261,WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,1113,688,1,315,360,0,15,1,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,7053,5335,748,50,5037,120,1767,3000,624,35,528,600,2244,2,0,0,0,0,4257,1
+1262,MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,1205,250,1280,1080,240,0,0,0,0,0,0,0,0,7054,4850,1035,500,1036,500,930,500,1559,400,7296,1500,505,150,0,0,0,0,4203,1
+1263,WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,2118,1488,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,1173,150,1056,1056,336,0,0,0,0,0,0,0,0,912,4559,932,6000,7005,500,693,100,1611,8,996,100,1615,1,0,0,0,0,4264,1
+1264,MERMAN,Merman,Merman,53,12300,0,3345,2054,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,1173,200,916,816,336,0,0,0,0,0,0,0,0,1054,1300,523,300,568,200,720,40,995,35,1460,3,756,203,0,0,0,0,4199,1
+1265,COOKIE,Cookie,Cookie,25,950,0,310,188,1,130,153,0,25,1,35,20,53,37,90,10,12,0,7,60,137,200,1036,936,240,0,0,0,0,0,0,0,0,538,1000,530,150,979,1,645,280,2402,30,12001,100,529,320,0,0,0,0,4293,1
+1266,ASTER,Aster,Aster,18,1452,0,122,78,1,56,64,0,10,1,19,15,1,34,5,10,12,0,5,22,145,400,1264,864,216,0,0,0,0,0,0,0,0,938,500,7013,40,1052,1200,508,200,912,60,512,100,0,0,0,0,0,0,4247,1
+1267,CARAT,Carat,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,7054,3200,536,1000,2409,5,5003,1,0,0,0,0,509,450,0,0,0,0,4288,1
+1268,BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,10120,6820,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,7054,4850,2229,45,2317,5,2106,65,1170,1,1417,2,985,433,0,0,0,0,4320,1
+1269,CLOCK,Clock,Clock,60,11050,0,3410,2904,2,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,1095,5335,1019,800,509,900,568,220,7026,30,7027,30,985,163,0,0,0,0,4299,1
+1270,C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,4378,2850,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,1095,5335,7054,5335,999,500,520,850,2109,1,7026,2000,7027,2000,0,0,0,0,4229,1
+1271,ALLIGATOR,Alligator,Alligator,42,6962,0,1379,866,1,315,360,2,5,1,45,50,10,82,65,10,12,1,2,21,145,200,1100,900,480,0,0,0,0,0,0,0,0,912,1000,1099,600,7003,2000,608,50,0,0,0,0,756,129,0,0,0,0,4252,1
+1272,DARK_LORD,Dark Lord,Dark Lord,80,360000,0,65780,45045,2,2800,3320,30,70,1,120,64,118,99,60,10,12,2,6,89,1205,100,868,768,480,36500,5000,7005,6000,5093,500,617,2000,1615,800,5017,550,1237,300,2334,300,2507,100,985,5141,984,3977,0,0,0,0,4168,1
+1273,ORC_LADY,Orc Lady,Orc Lady,31,2000,0,644,407,1,135,170,10,10,1,42,25,15,69,55,10,12,1,7,42,1173,200,1050,900,288,0,0,0,0,0,0,0,0,7053,4656,998,300,2602,1,2206,1,1352,10,508,900,2338,1,0,0,0,0,4255,1
+1274,MEGALITH,Megalith,Megalith,45,5300,0,1758,1075,9,264,314,50,25,1,45,60,5,95,5,10,12,2,0,80,132,200,1332,1332,672,0,0,0,0,0,0,0,0,912,100,7049,1000,617,1,0,0,0,0,985,61,757,207,0,0,0,0,4200,1
+1275,ALICE,Alice,Alice,62,10000,0,3583,2400,1,550,700,5,5,1,64,42,85,100,130,10,12,1,7,60,145,200,1152,185,480,0,0,0,0,0,0,0,0,7047,2500,637,40,2407,3,739,30,5085,1,508,400,12002,100,0,0,0,0,4253,1
+1276,RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,3025,2125,9,415,500,35,5,1,25,22,5,145,35,10,12,1,6,47,133,200,1152,1152,480,0,0,0,0,0,0,0,0,7054,4656,0,0,2315,2,1701,150,1764,2000,1715,3,985,106,0,0,0,0,4187,1
+1277,GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,1238,752,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,2000,1019,2000,1501,100,662,200,2272,1,508,150,686,100,0,0,0,0,4283,1
+1278,STALACTIC_GOLEM,Stalactic Golem,Stalactic Golem,60,18700,0,3872,2695,1,950,1130,50,5,1,45,85,5,75,25,10,12,2,0,80,145,200,1264,864,288,0,0,0,0,0,0,0,0,7004,2000,7054,4850,1000,250,997,30,757,250,0,0,985,163,0,0,0,0,4223,1
+1279,TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,386,220,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,1173,200,860,660,624,0,0,0,0,0,0,0,0,7053,100,943,380,606,200,993,160,1001,140,0,0,757,106,0,0,0,0,4308,1
+1280,STEAM_GOBLIN,Steam Goblin,Goblin Steamrider,35,2490,0,864,495,1,234,269,20,5,1,59,32,15,75,25,10,12,1,7,44,145,200,1008,1008,528,0,0,0,0,0,0,0,0,911,2500,7053,3880,998,300,999,55,1003,320,1003,320,757,124,0,0,0,0,4156,1
+1281,SAGEWORM,Sage Worm,Sage Worm,43,3850,0,1155,1320,1,120,280,0,50,1,52,24,88,79,55,10,12,0,2,60,145,200,936,936,288,0,0,0,0,0,0,0,0,693,100,1097,1000,1055,3000,691,100,505,40,689,100,5012,1,0,0,0,0,4219,1
+1282,KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,739,455,9,155,185,10,5,1,20,15,30,100,25,10,12,0,7,23,133,200,1008,1008,384,0,0,0,0,0,0,0,0,912,250,999,60,1034,4850,5118,50,1763,2000,1711,5,756,79,0,0,0,0,4292,1
+1283,CHIMERA,Chimera,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,1205,200,772,672,360,0,0,0,0,0,0,0,0,7054,5335,1048,2500,657,500,1306,1,7295,1500,1364,1,984,160,0,0,0,0,4300,1
+1284,HUGELING,Hugeling,Hugeling,1,5000,0,2,1,4,7,10,0,0,1,1,1,1,6,1,10,12,2,3,21,145,200,1872,672,480,0,0,0,0,0,0,0,0,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0
+1285,ARCHER_GUARDIAN,Archer Guardian,Archer Guardian,74,28634,0,1,1,12,1120,1600,35,60,1,80,80,90,165,55,14,16,2,7,80,165,265,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1286,KNIGHT_GUARDIAN,Knight Guardian,Knight Guardian,86,30214,0,1,1,2,1280,1560,55,30,1,40,140,65,125,65,14,16,2,7,80,165,275,1200,1200,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1287,SOLDIER_GUARDIAN,Soldier Guardian,Soldier Guardian,56,15670,0,1,1,1,873,1036,35,0,1,56,100,45,103,43,10,12,0,4,22,165,265,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1288,EMPERIUM,Emperium,Emperium,90,68430,0,109,71,1,60,71,40,50,1,17,80,50,26,20,10,12,0,8,26,0,300,1288,288,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1289,MAYA_PUPLE,Maya Purple,Maya Purple,81,54331,0,10496,3893,2,1446,1999,68,48,1,90,80,95,90,119,10,12,2,4,82,1205,100,1024,1000,480,0,0,0,0,0,0,0,0,7053,4413,757,250,756,300,969,100,984,150,10006,1,639,50,0,0,0,0,4198,1
+1290,SKELETON_GENERAL,Skeleton General,Skeleton General,73,17043,0,8170,3370,1,910,1089,25,25,1,25,40,20,77,25,10,12,1,1,29,1173,150,2276,576,432,0,0,0,0,0,0,0,0,7068,2550,756,160,508,800,1220,35,1219,80,1222,3,2274,1,0,0,0,0,4221,1
+1291,WRAITH_DEAD,Wraith Dead,Wraith Dead,74,42131,0,10341,3618,2,1366,1626,25,30,1,99,55,95,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,1059,4413,2206,10,2506,8,716,700,732,5,603,100,568,150,0,0,0,0,4189,1
+1292,MINI_DEMON,Mini Demon,Mini Demon,68,31865,0,8396,3722,1,1073,1415,30,25,1,75,40,55,89,42,10,12,0,6,27,1173,150,1000,600,384,0,0,0,0,0,0,0,0,1038,4413,1039,450,2255,3,757,160,912,2500,1009,10,1410,3,0,0,0,0,4204,1
+1293,CREMY_FEAR,Creamy Fear,Creamy Fear,62,13109,0,7365,2691,2,667,830,45,30,1,40,16,15,68,55,10,12,0,4,24,1173,155,1136,720,840,0,0,0,0,0,0,0,0,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,0,0,0,0,4298,1
+1294,KILLER_MANTIS,Killer Mantis,Killer Mantis,56,12911,0,6509,2366,1,764,927,35,20,1,26,24,5,75,40,10,12,1,4,22,1173,175,1528,660,432,0,0,0,0,0,0,0,0,1031,4550,943,2500,721,10,509,5,514,25,1262,1,2108,1,0,0,0,0,4301,1
+1295,OWL_BARON,Owl Baron,Owl Baron,75,59489,0,10967,4811,2,1252,1609,65,25,1,25,80,95,95,55,10,12,2,6,60,1205,175,1345,824,440,0,0,0,0,0,0,0,0,7071,3500,7063,2500,1716,2,1472,1,1402,25,693,100,5045,5,0,0,0,0,4238,1
+1296,KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,17935,0,7432,2713,1,649,957,37,37,1,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,999,450,1034,6305,912,1200,1511,6,1613,2,525,150,526,100,0,0,0,0,4291,1
+1297,ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,8040,3499,1,836,1129,27,27,1,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,930,4413,934,1800,2624,1,2611,150,508,350,756,150,757,100,0,0,0,0,4248,1
+1298,ZOMBIE_MASTER,Zombie Master,Zombie Master,62,13917,0,7610,2826,1,824,1084,37,26,1,20,30,5,77,35,10,12,1,1,29,1173,175,2612,912,288,0,0,0,0,0,0,0,0,7071,4413,938,1500,958,1500,723,200,727,100,1260,1,2324,2,0,0,0,0,4274,1
+1299,GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,19735,0,6036,2184,1,663,753,48,16,1,55,37,30,69,58,10,12,1,8,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,7054,1500,999,800,756,120,5090,50,2106,2,508,650,5113,10,0,0,0,0,4155,1
+1300,CATERPILLAR,Caterpillar,Caterpillar,64,14140,0,6272,3107,1,895,1448,47,29,1,25,85,15,69,45,10,12,0,4,22,1173,300,1672,672,480,0,0,0,0,0,0,0,0,949,3000,7054,5335,2227,20,1000,100,997,50,505,12,508,500,0,0,0,0,4289,1
+1301,AM_MUT,Am Mut,Am Mut,61,11848,0,7709,2690,1,1041,1123,50,10,1,65,40,35,83,45,10,12,0,6,27,1173,200,1156,456,384,0,0,0,0,0,0,0,0,1021,4550,757,250,1517,3,969,5,2282,1,616,1,746,250,0,0,0,0,4245,1
+1302,DARK_ILLUSION,Dark Illusion,Dark Illusion,77,101487,0,11163,4181,2,1300,1982,64,70,1,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,1615,3,5017,2,2508,3,7054,5335,522,120,504,550,1162,2,0,0,0,0,4169,1
+1303,GIANT_HONET,Giant Hornet,Giant Hornet,56,12834,0,5785,2006,1,650,851,38,43,1,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,0,0,0,0,4271,1
+1304,GIANT_SPIDER,Giant Spider,Giant Spider,55,11628,0,6211,2146,1,625,802,41,28,1,36,43,5,73,69,10,12,2,4,25,1173,165,1468,468,768,0,0,0,0,0,0,0,0,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,0,0,0,0,4270,1
+1305,ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,8174,3782,1,947,1115,35,30,1,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,1042,4413,912,2500,2406,9,719,15,1096,680,938,3500,7054,2500,0,0,0,0,4249,1
+1306,LEIB_OLMAI,Leib Olmai,Leib Olmai,58,24223,0,6011,2171,1,740,1390,27,31,1,35,95,5,64,85,10,12,2,2,22,1173,175,1260,230,192,0,0,0,0,0,0,0,0,948,4550,2289,8,740,120,518,500,526,0,969,5,7053,800,0,0,0,0,4188,1
+1307,CAT_O_NINE_TAIL,Cat o' Nine Tails,Cat o' Nine Tails,76,64512,0,10869,4283,1,1112,1275,61,55,1,75,55,82,86,120,10,12,1,6,63,1205,155,1276,576,288,0,0,0,0,0,0,0,0,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,0,0,0,0,4290,1
+1308,PANZER_GOBLIN,Panzer Goblin,Panzer Goblin,59,13838,0,7212,2697,1,682,877,41,28,1,60,40,20,81,160,10,12,1,7,44,1173,200,960,1008,840,0,0,0,0,0,0,0,0,7053,4413,7054,3500,999,180,998,360,1003,580,744,800,994,160,0,0,0,0,4310,1
+1309,GAJOMART,Gajomart,Gajomart,63,13699,0,6625,2900,1,916,948,85,50,1,34,10,5,75,140,10,12,0,0,83,1173,300,1000,1152,828,0,0,0,0,0,0,0,0,953,6500,912,2300,508,870,2279,8,1752,10000,999,640,994,180,0,0,0,0,4151,1
+1310,MAJORUROS,Majoruros,Majoruros,66,57991,0,8525,3799,1,781,1301,10,25,1,50,75,50,85,48,10,12,2,2,43,1173,250,1100,960,780,0,0,0,0,0,0,0,0,941,4413,1361,4,568,300,984,16,509,850,2611,160,1000,250,0,0,0,0,4201,1
+1311,GULLINBURSTI,Gullinbursti,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,1,25,60,5,70,45,10,12,2,2,42,1173,150,1960,960,384,0,0,0,0,0,0,0,0,1028,3500,514,290,702,6,2276,1,605,15,2627,1,912,160,0,0,0,0,4164,1
+1312,TURTLE_GENERAL,Turtle General,Turtle General,97,320700,0,18202,9800,1,2438,3479,50,54,1,45,55,65,105,164,10,12,2,2,42,1205,200,900,1000,500,39805,5000,967,5500,607,1500,617,2000,1529,8,1306,5,0,0,1417,9,7070,5335,1141,80,658,1,0,0,0,0,4305,1
+1313,MOBSTER,Mobster,Mobster,61,11347,0,4424,1688,1,910,1128,41,37,1,46,20,35,76,55,10,12,1,7,20,1173,250,1100,560,580,0,0,0,0,0,0,0,0,1239,3,726,4559,2621,1,716,600,912,2500,525,450,505,60,0,0,0,0,4317,1
+1314,PERMETER,Permeter,Permeter,63,8228,0,3756,1955,2,943,1212,46,45,1,59,60,5,69,100,10,12,1,2,40,145,250,1100,483,528,0,0,0,0,0,0,0,0,967,4413,7070,45,1019,1240,507,2450,912,1240,522,25,605,1,0,0,0,0,4311,1
+1315,ASSULTER,Assaulter,Assaulter,71,15861,0,4854,2654,2,764,1499,35,28,1,74,10,35,100,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,967,4413,7069,1200,7072,840,508,1280,912,1240,522,45,603,1,0,0,0,0,4246,1
+1316,SOLIDER,Solider,Solider,70,12099,0,4458,1951,2,796,978,57,43,1,35,85,5,74,100,10,12,1,2,42,145,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,64,7067,850,508,2100,912,1240,518,850,1519,1,0,0,0,0,4220,1
+1317,FUR_SEAL,Fur Seal,Seal,63,9114,0,3765,1824,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,149,250,1612,622,583,0,0,0,0,0,0,0,0,912,4365,510,250,2310,5,7053,1200,1452,1,525,200,746,120,0,0,0,0,4312,1
+1318,HEATER,Heater,Heater,68,11020,0,3766,2359,2,682,1007,40,42,1,47,25,5,71,100,10,12,1,2,43,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,750,697,100,912,1640,526,140,7054,600,7068,1250,0,0,0,0,4331,1
+1319,FREEZER,Freezer,Freezer,72,8636,0,3665,2197,1,672,984,55,43,1,41,59,5,67,100,10,12,1,2,41,1173,250,1452,483,528,0,0,0,0,0,0,0,0,967,4413,7070,850,7066,1250,912,1800,526,160,7053,600,689,100,0,0,0,0,4319,1
+1320,OWL_DUKE,Owl Duke,Owl Duke,75,26623,0,7217,3474,1,715,910,27,49,1,45,40,75,79,88,10,12,2,6,60,1205,195,1345,824,440,0,0,0,0,0,0,0,0,7071,4413,7063,1500,693,100,747,1,1451,3,1513,2,5045,1,0,0,0,0,4237,1
+1321,DRAGON_TAIL,Dragon Tail,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,1,68,15,5,67,67,10,12,1,4,44,1173,175,862,534,312,0,0,0,0,0,0,0,0,7064,4413,1096,400,943,800,2207,8,2226,2,601,300,602,150,0,0,0,0,4178,1
+1322,SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,3982,1766,1,585,813,29,21,1,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,7054,3500,7053,2500,949,2500,511,4500,508,800,510,200,509,800,0,0,0,0,4227,1
+1323,SEE_OTTER,Sea Otter,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,1,36,40,25,82,65,10,12,1,2,61,149,190,1132,583,532,0,0,0,0,0,0,0,0,722,150,965,5500,7065,4365,725,50,726,50,746,650,7053,1200,0,0,0,0,4326,1
+1324,TREASURE_BOX1,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1325,TREASURE_BOX2,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7073,80,658,500,604,10000,984,4850,985,7275,1239,1500,5027,75,1165,8,0,0,0,0
+1326,TREASURE_BOX3,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1327,TREASURE_BOX4,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7074,80,658,500,604,10000,984,4850,985,7275,2108,1000,1306,75,5022,2,0,0,0,0
+1328,TREASURE_BOX5,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1329,TREASURE_BOX6,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7075,80,658,500,604,10000,984,4850,985,7275,2102,834,5019,100,5002,9,0,0,0,0
+1330,TREASURE_BOX7,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1331,TREASURE_BOX8,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7076,80,658,500,604,10000,984,4850,985,7275,2616,500,2334,125,2622,9,0,0,0,0
+1332,TREASURE_BOX9,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1333,TREASURE_BOX10,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7077,80,658,500,604,10000,984,4850,985,7275,2104,500,2331,150,2623,10,0,0,0,0
+1334,TREASURE_BOX11,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1335,TREASURE_BOX12,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7078,80,658,500,604,10000,984,4850,985,7275,2270,500,1716,150,2256,10,0,0,0,0
+1336,TREASURE_BOX13,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1337,TREASURE_BOX14,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7079,80,658,500,604,10000,984,4850,985,7275,1238,375,1531,150,2318,10,0,0,0,0
+1338,TREASURE_BOX15,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1339,TREASURE_BOX16,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7080,80,658,500,604,10000,984,4850,985,7275,2626,300,1472,167,2327,10,0,0,0,0
+1340,TREASURE_BOX17,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1341,TREASURE_BOX18,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7081,80,658,500,604,10000,984,4850,985,7275,1143,250,1237,188,2235,12,0,0,0,0
+1342,TREASURE_BOX19,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1343,TREASURE_BOX20,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7082,80,658,500,604,10000,984,4850,985,7275,617,250,1144,188,5007,19,0,0,0,0
+1344,TREASURE_BOX21,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1345,TREASURE_BOX22,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7083,80,658,500,604,10000,984,4850,985,7275,2508,1000,2336,69,2621,20,0,0,0,0
+1346,TREASURE_BOX23,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1347,TREASURE_BOX24,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7084,80,658,500,604,10000,984,4850,985,7275,2106,1000,1164,50,5025,24,0,0,0,0
+1348,TREASURE_BOX25,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1349,TREASURE_BOX26,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7085,80,658,500,604,10000,984,4850,985,7275,2231,750,2624,46,2286,25,0,0,0,0
+1350,TREASURE_BOX27,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1351,TREASURE_BOX28,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7086,80,658,500,604,10000,984,4850,985,7275,2283,500,2615,41,2234,32,0,0,0,0
+1352,TREASURE_BOX29,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1353,TREASURE_BOX30,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7087,80,658,500,604,10000,984,4850,985,7275,2507,500,2625,38,5045,34,0,0,0,0
+1354,TREASURE_BOX31,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1355,TREASURE_BOX32,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7088,80,658,500,604,10000,984,4850,985,7275,2407,429,2269,250,2317,35,0,0,0,0
+1356,TREASURE_BOX33,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1357,TREASURE_BOX34,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7089,80,658,500,604,10000,984,4850,985,7275,2109,300,2406,273,2258,38,0,0,0,0
+1358,TREASURE_BOX35,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1359,TREASURE_BOX36,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7090,80,658,500,604,10000,984,4850,985,7275,1142,215,2255,60,5017,38,0,0,0,0
+1360,TREASURE_BOX37,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1361,TREASURE_BOX38,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7091,80,658,500,604,10000,984,4850,985,7275,1417,50,5053,50,2229,50,0,0,0,0
+1362,TREASURE_BOX39,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,732,7760,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0
+1363,TREASURE_BOX40,Treasure Chest,Treasure Chest,99,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7092,80,658,500,604,10000,984,4850,985,7275,2506,43,2254,43,1529,38,0,0,0,0
+1364,G_ASSAULTER,Assaulter,Assaulter,59,18251,0,0,0,2,195,227,35,36,85,55,10,35,145,100,10,12,1,7,44,1173,155,1000,900,432,0,0,0,0,0,0,0,0,1019,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1365,APOCALIPS,Apocalypse,Apocalypse,66,22680,0,6540,4935,2,1030,1370,62,49,1,48,120,108,66,85,10,12,2,0,60,149,400,1564,864,576,0,0,0,0,0,0,0,0,7095,5335,7094,2400,7093,2200,985,5,757,15,2506,20,999,2500,0,0,0,0,4242,1
+1366,LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,6470,3879,1,1541,2049,65,50,1,57,115,70,76,68,10,12,2,0,83,149,400,1564,864,576,0,0,0,0,0,0,0,0,7096,4559,7097,3686,2317,1,2316,2,509,2500,0,0,0,0,0,0,0,0,4184,1
+1367,BLAZZER,Blazer,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,0,6,43,149,180,1564,864,576,0,0,0,0,0,0,0,0,7097,4850,7098,3400,509,3000,0,0,0,0,0,0,0,0,0,0,0,0,4215,1
+1368,GEOGRAPHER,Geographer,Geographer,56,8071,0,2715,2000,3,467,621,28,26,1,67,47,60,68,44,10,12,0,3,62,132,2000,1564,864,576,0,0,0,0,0,0,0,0,1032,6200,1033,5500,2253,30,2207,50,12002,100,0,0,0,0,0,0,0,0,4280,1
+1369,GRAND_PECO,Grand Peco,Grand Peco,58,8054,0,2387,1361,2,444,565,37,30,1,67,66,50,71,51,10,12,2,2,43,137,165,1564,864,576,0,0,0,0,0,0,0,0,7101,4850,522,300,992,1000,969,1,0,0,0,0,0,0,0,0,0,0,4161,1
+1370,SUCCUBUS,Succubus,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,150,89,87,10,12,1,6,67,1173,155,1564,864,576,0,0,0,0,0,0,0,0,522,1500,2407,3,2611,500,2613,150,5066,1,1472,1,505,1000,0,0,0,0,4218,1
+1371,FAKE_ANGEL,Fake Angel,False Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,2181,160,1564,864,576,0,0,0,0,0,0,0,0,7104,0,7105,0,717,1000,715,1000,716,1000,12020,1000,0,0,0,0,0,0,4316,1
+1372,GOAT,Goat,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,2,2,63,137,165,1564,864,576,0,0,0,0,0,0,0,0,7106,4559,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,0,0,0,0,4150,1
+1373,LORD_OF_DEATH,Lord of Death,Lord of the Dead,94,303383,0,131343,43345,2,2430,4104,77,73,1,99,120,169,100,106,10,12,2,6,67,1205,300,1564,864,576,10000,5000,607,5500,732,5000,617,5000,7108,5335,1417,5,1230,10,2621,2,7109,10,1306,1,1529,2,0,0,0,0,4276,1
+1374,INCUBUS,Incubus,Incubus,75,17281,0,5254,4212,1,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,1173,165,1564,864,576,0,0,0,0,0,0,0,0,522,1500,509,5500,5072,1,2621,1,2610,500,2613,150,509,1200,0,0,0,0,4269,1
+1375,THE_PAPER,The Paper,The Paper,56,18557,0,2849,1998,1,845,1124,25,24,1,66,52,76,71,79,10,12,1,0,60,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7111,4947,7112,3200,508,800,511,2000,0,0,0,0,0,0,0,0,0,0,4172,1
+1376,HARPY,Harpy,Harpy,70,16599,0,3562,2133,1,956,1231,42,44,1,112,72,103,74,76,10,12,1,6,64,2181,155,1564,864,576,0,0,0,0,0,0,0,0,7115,4850,7116,2500,508,1500,508,800,0,0,0,0,0,0,0,0,0,0,4325,1
+1377,ELDER,Elder,Elder,64,21592,0,4650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7099,4365,7117,1500,7118,1500,691,100,1473,1,616,2,7027,5000,0,0,0,0,4251,1
+1378,DEMON_PUNGUS,Demon Pungus,Demon Pungus,56,7259,0,3148,1817,1,360,479,48,31,1,83,55,59,63,34,10,12,0,6,65,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7119,4074,7001,4559,715,3880,0,0,0,0,0,0,0,0,0,0,0,0,4173,1
+1379,NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,78,22605,0,6683,4359,1,757,1007,37,37,1,76,55,60,77,54,10,12,2,6,67,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7120,4947,2626,1,2608,30,505,50,510,150,695,100,0,0,0,0,0,0,4166,1
+1380,DRILLER,Driller,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,2181,165,1564,864,576,0,0,0,0,0,0,0,0,1012,7500,715,3880,716,3500,0,0,0,0,0,0,0,0,0,0,0,0,4180,1
+1381,GRIZZLY,Grizzly,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,54,68,58,70,61,10,12,2,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,948,5000,919,5000,549,2500,0,0,0,0,0,0,0,0,0,0,0,0,4162,1
+1382,DIABOLIC,Diabolic,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,2181,150,1564,864,576,0,0,0,0,0,0,0,0,1038,5820,1039,4850,2605,3,984,20,1263,10,0,0,0,0,0,0,0,0,4182,1
+1383,EXPLOSION,Explosion,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,7006,5500,7097,2200,7122,3200,756,800,522,400,0,0,0,0,0,0,0,0,4267,1
+1384,DELETER,Deleter,Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,105,40,65,72,54,10,12,1,9,44,141,175,1564,864,576,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4158,1
+1385,DELETER_,Deleter,Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,67,40,65,72,68,10,12,1,9,42,141,175,1564,864,576,0,0,0,0,0,0,0,0,7123,4074,1035,5335,1037,3880,1036,3589,0,0,0,0,0,0,0,0,0,0,4279,1
+1386,SLEEPER,Sleeper,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,2181,195,1564,864,576,0,0,0,0,0,0,0,0,7124,4947,1056,5335,997,2500,756,300,1226,5,1622,5,7043,1200,0,0,0,0,4228,1
+1387,GIG,Gig,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,41,2181,170,1564,864,576,0,0,0,0,0,0,0,0,7125,4365,904,5500,716,150,525,2500,994,850,0,0,0,0,0,0,0,0,4165,1
+1388,ARCHANGELING,Archangeling,Arc Angeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,1205,180,1564,864,576,0,0,0,0,0,0,0,0,2255,5,610,1800,608,150,7291,1500,2254,5,2317,3,7294,1500,0,0,0,0,4241,1
+1389,DRACULA,Dracula,Dracula,85,320096,0,120157,38870,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1564,864,576,500,5000,607,5500,732,5000,522,5000,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,0,0,0,0,0,0,4134,1
+1390,VIOLY,Violy,Violy,75,18257,0,6353,3529,10,738,982,37,36,1,93,54,85,101,83,10,12,1,7,40,133,170,1564,864,576,0,0,0,0,0,0,0,0,1060,6305,1610,50,740,1200,2610,800,526,1400,12020,1000,1902,500,0,0,0,0,4209,1
+1391,GALAPAGO,Galapago,Galapago,63,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,1,2,22,139,165,1564,864,576,0,0,0,0,0,0,0,0,7053,5335,610,1500,508,2500,606,100,605,100,5111,1,0,0,0,0,0,0,4152,1
+1392,ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,351,215,1,109,137,4,34,1,62,45,26,55,5,10,12,1,0,44,133,155,1564,864,576,0,0,0,0,0,0,0,0,7126,500,2312,1,7053,1000,999,450,984,1,912,2500,910,5500,0,0,0,0,4192,1
+1393,G_MUMMY,Mummy,Mummy,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1394,G_ZOMBIE,Zombie,Zombie,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1395,CRYSTAL_1,Wind Crystal,Wind Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,665,4900,5097,7000,532,6500,558,5000,607,200,0,0,0,0
+1396,CRYSTAL_2,Earth Crystal,Earth Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,667,4900,5097,7000,531,6500,558,5000,608,250,0,0,0,0
+1397,CRYSTAL_3,Fire Crystal,Fire Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,664,4900,5097,7000,534,6500,558,5000,604,300,0,0,0,0
+1398,CRYSTAL_4,Water Crystal,Water Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,255,1,7,12,0,3,22,193,2000,300,300,1,0,0,0,0,0,0,0,0,539,3800,530,4500,561,5000,666,4900,5097,7000,533,6500,558,5000,603,100,0,0,0,0
+1399,EVENT_BAPHO,Baphomet,Baphomet,68,864960,0,562340,87895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,1205,100,1068,768,576,500,5000,607,5500,526,5000,732,5000,1417,550,1306,680,1145,480,2110,640,2327,1500,2111,500,2621,1720,2256,1550,0,0,0,0
+1400,KARAKASA,Karakasa,Karakasa,30,3092,0,489,322,1,140,183,1,20,1,40,12,5,10,1,10,12,1,0,60,129,300,1480,480,1056,0,0,0,0,0,0,0,0,7151,5000,7150,4268,1019,3200,7111,2200,912,4074,746,30,0,0,0,0,0,0,4286,1
+1401,SHINOBI,Shinobi,Shinobi,69,12700,0,4970,3010,1,460,1410,34,21,1,85,25,25,100,100,10,12,1,7,67,1173,200,1480,480,720,0,0,0,0,0,0,0,0,7156,5335,2337,2,7053,2200,2335,2,2336,1,7157,2000,739,15,0,0,0,0,4230,1
+1402,POISON_TOAD,Poison Toad,Poison Toad,46,6629,0,1929,1457,1,288,408,5,10,1,34,19,14,66,55,10,12,1,2,45,129,165,976,576,288,0,0,0,0,0,0,0,0,7155,5500,7154,2400,2610,4,511,540,724,2,526,2,1246,10,0,0,0,0,4175,1
+1403,ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,1293,1003,9,289,336,10,10,1,37,29,15,101,15,10,12,1,1,49,133,200,2276,576,432,0,0,0,0,0,0,0,0,998,5500,2285,1,7126,1400,508,20,549,350,525,250,0,0,0,0,0,0,4160,1
+1404,MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,795,493,1,250,305,1,20,1,31,15,10,47,15,10,12,1,6,27,145,200,1720,500,420,0,0,0,0,0,0,0,0,7152,5335,7153,2500,509,550,1000,1250,2613,1,7005,100,1904,2,0,0,0,0,4208,1
+1405,TENGU,Tengu,Tengu,65,16940,0,4207,2843,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,7159,3500,7158,5500,7063,25,522,150,999,80,2278,2,687,100,0,0,0,0,4282,1
+1406,KAPHA,Kapha,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7149,6500,7053,3500,520,1500,521,2300,708,2,1915,10,640,1,0,0,0,0,4287,1
+1407,DOKEBI_,Dokebi,Dokebi,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,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
+1408,BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,57,8082,0,2119,1562,2,354,575,5,23,1,65,35,37,116,30,10,13,1,4,44,141,150,872,500,300,0,0,0,0,0,0,0,0,7163,4608,7168,2500,602,1200,924,5500,1802,3,1962,1,0,0,0,0,0,0,4327,1
+1409,RICE_CAKE_BOY,Rice Cake Boy,Dumpling Child,27,2098,0,231,149,1,112,134,5,12,1,22,29,5,41,10,10,13,0,7,20,145,200,1672,672,480,0,0,0,0,0,0,0,0,7150,3200,7151,2500,2262,1,7192,5000,553,1000,7187,3000,0,0,0,0,0,0,4154,1
+1410,LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,55,10050,0,2591,1799,10,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,200,1288,576,288,0,0,0,0,0,0,0,0,7164,4365,522,1900,526,1000,604,400,532,100,603,3,0,0,0,0,0,0,4217,1
+//1411,PEACH_TREE_BULLET,Peach Tree Bullet,Peach Tree Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1412,EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,57,15003,0,3304,2198,9,620,899,25,59,1,66,21,76,130,79,10,13,2,0,40,133,150,1754,544,288,0,0,0,0,0,0,0,0,7162,4656,548,5600,550,4500,553,6800,1908,2,757,150,693,100,0,0,0,0,4262,1
+1413,WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,1038,692,1,220,280,10,20,1,42,36,55,66,30,10,13,0,3,43,145,400,2208,1008,324,0,0,0,0,0,0,0,0,520,3500,521,3500,1033,3800,1032,4800,516,4800,1951,1,0,0,0,0,0,0,4232,1
+//1414,GINSENG_BULLET,Ginseng Bullet,Ginseng Bullet... (mode 129),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1415,BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,352,201,1,155,207,0,5,1,44,20,4,49,10,10,13,0,2,28,2181,150,988,288,168,0,0,0,0,0,0,0,0,7171,5200,7172,3200,756,150,517,2000,1214,100,537,500,0,0,0,0,0,0,4233,1
+1416,WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,18029,0,3945,2599,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,1173,200,1672,672,288,0,0,0,0,0,0,0,0,7165,3977,7166,1380,984,10,1904,4,1906,1,12002,100,1918,10,0,0,0,0,4258,1
+1417,ZIPPER_BEAR,Zipper Bear,Zipper Bear,35,2901,0,370,255,1,248,289,10,5,1,25,55,15,28,25,10,13,1,2,27,145,200,976,576,288,0,0,0,0,0,0,0,0,7161,4462,7167,3500,526,400,518,900,512,90,0,0,0,0,0,0,0,0,4281,1
+1418,DARK_SNAKE_LORD,Evil Snake Lord,Evil Snake Lord,73,254993,0,34288,17950,1,1433,2033,25,55,1,83,62,80,164,88,10,12,2,2,68,1205,200,976,500,400,524,5000,607,5500,608,3500,985,5500,7169,5820,10020,5100,1471,80,5012,80,617,800,7226,900,661,2000,1474,500,0,0,0,0
+1419,G_FARMILIAR,Familiar,Familiar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,2181,150,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1420,G_ARCHER_SKELETON,Archer Skeleton,Archer Skeleton,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,2181,300,2864,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1421,G_ISIS,Isis,Isis,43,4828,0,0,0,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,2181,200,1384,768,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1422,G_HUNTER_FLY,Hunter Fly,Hunter Fly,42,5242,0,0,0,1,246,333,25,15,1,105,32,15,72,30,10,12,0,4,44,2181,150,676,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1423,G_GHOUL,Ghoul,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,2181,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1424,G_SIDE_WINDER,Side Winder,Side Winder,43,4929,0,0,0,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,2693,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1425,G_OBEAUNE,Obeaune,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,2181,200,1872,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1426,G_MARC,Marc,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,2181,150,1272,72,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1427,G_NIGHTMARE,Nightmare,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1428,G_POISON_SPORE,Poison Spore,Poison Spore,19,665,0,0,0,1,89,101,0,0,1,19,25,1,24,1,10,12,1,3,25,2181,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1429,G_ARGIOPE,Argiope,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,2181,300,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1430,G_ARGOS,Argos,Argos,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,2181,300,1468,468,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1431,G_BAPHOMET_,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1432,G_DESERT_WOLF,Desert Wolf,Desert Wolf,27,1716,0,0,0,1,169,208,0,10,1,27,45,15,56,10,10,12,1,2,23,2181,200,1120,420,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1433,G_DEVIRUCHI,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1434,G_DRAINLIAR,Drainliar,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,2181,250,1276,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1435,G_EVIL_DRUID,Evil Druid,Evil Druid,58,16506,0,0,0,1,420,670,5,60,1,29,58,80,68,30,10,12,2,1,89,2693,300,2276,576,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1436,G_JAKK,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1437,G_JOKER,Joker,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,2181,100,1364,864,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1438,G_KHALITZBURG,Khalitzburg,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,2693,175,528,1000,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1439,G_HIGH_ORC,High Orc,High Orc,52,6890,0,0,0,1,428,533,15,5,1,46,55,35,82,40,10,12,2,7,43,2181,150,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1440,G_STEM_WORM,Stem Worm,Stem Worm,40,6136,0,0,0,2,290,375,5,10,1,30,26,15,79,35,10,12,1,3,24,2181,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1441,G_PENOMENA,Penomena,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,2181,400,832,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1442,G_SASQUATCH,Sasquatch,Sasquatch,30,3163,0,0,0,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,2181,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1443,G_CRUISER,Cruiser,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,2181,400,1296,1296,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1444,G_CHEPET,Chepet,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,2181,400,672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1445,G_RAGGLER,Raggler,Raggler,21,1020,0,0,0,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,2181,200,1000,900,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1446,G_INJUSTICE,Injustice,Injustice,51,7600,0,0,0,1,480,600,0,0,1,42,39,0,71,35,10,12,1,1,47,2693,400,770,720,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1447,G_GRYPHON,Gryphon,Gryphon,72,27800,0,0,0,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,2213,100,704,504,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1448,G_DARK_FRAME,Dark Frame,Dark Frame,59,7500,0,0,0,1,960,1210,10,45,1,72,42,45,85,25,10,12,1,6,67,2693,200,920,720,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1449,G_MUTANT_DRAGON,Mutant Dragon,Mutant Dragonoid,65,62600,0,0,0,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,2213,250,1280,1080,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1450,G_WIND_GHOST,Wind Ghost,Wind Ghost,51,4820,0,0,0,2,489,639,0,45,1,89,15,90,85,25,10,12,1,6,64,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1451,G_MERMAN,Merman,Merman,53,12300,0,0,0,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,2181,200,916,816,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1452,G_ORC_LADY,Orc Lady,Orc Lady,31,2000,0,0,0,1,135,170,10,10,1,42,25,15,69,55,10,12,1,7,42,2181,200,1050,900,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1453,G_RAYDRIC_ARCHER,Raydric Archer,Raydric Archer,52,5250,0,0,0,9,415,500,35,5,1,25,22,5,145,35,10,12,1,6,47,2693,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1454,G_TRI_JOINT,Tri Joint,Tri Joint,32,2300,0,0,0,1,178,206,20,5,1,48,24,10,67,20,10,12,0,4,22,2181,200,860,660,624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1455,G_KOBOLD_ARCHER,Kobold Archer,Kobold Archer,33,2560,0,0,0,9,155,185,10,5,1,20,15,30,100,25,10,12,0,7,23,2181,200,1008,1008,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1456,G_CHIMERA,Chimera,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,2725,200,772,672,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1457,G_MANTIS,Mantis,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,2181,200,1528,660,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1458,G_MARDUK,Marduk,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,2181,300,1540,840,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1459,G_MARIONETTE,Marionette,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,2181,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1460,G_MATYR,Matyr,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,2181,150,432,432,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1461,G_MINOROUS,Minorous,Minorous,52,7431,0,0,0,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,2181,200,1360,960,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1462,G_ORC_SKELETON,Orc Skeleton,Orc Skeleton,28,2278,0,0,0,1,190,236,10,10,1,14,18,0,30,15,10,12,1,1,29,2181,200,2420,720,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1463,G_ORC_ZOMBIE,Orc Zombie,Orc Zombie,24,1568,0,0,0,1,151,184,5,10,1,12,24,0,24,5,10,12,1,1,29,2693,400,2852,1152,840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1464,G_PASANA,Pasana,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,2181,165,1700,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1465,G_PETIT,Petite,Petite,44,6881,0,0,0,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,2181,200,1624,620,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1466,G_PETIT_,Petite,Petite,45,5747,0,0,0,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,2181,150,1420,1080,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1467,G_RAYDRIC,Raydric,Raydric,52,8613,0,0,0,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,2693,150,824,780,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1468,G_REQUIEM,Requim,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,2181,400,1516,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1469,G_SKEL_WORKER,Skeleton Worker,Skeleton Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,2181,400,2420,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1470,G_ZEROM,Zerom,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,2181,200,1780,1080,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1471,G_NINE_TAIL,Nine Tail,Nine Tail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,2181,150,840,540,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1472,G_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,2181,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1473,G_ORC_ARCHER,Orc Archer,Orc Archer,49,7440,0,0,0,9,310,390,10,5,1,44,25,20,125,20,10,12,1,7,22,2181,300,1960,620,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1474,G_MIMIC,Mimic,Mimic,51,6120,0,0,0,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,2181,100,972,500,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1475,G_WRAITH,Wraith,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,2181,300,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1476,G_ALARM,Alarm,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,2181,300,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1477,G_ARCLOUSE,Arclouse,Arclouze,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,2181,100,960,500,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1478,G_RIDEWORD,Rideword,Rideword,59,11638,0,0,0,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,2693,150,864,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1479,G_SKEL_PRISONER,Skeleton Prisoner,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,1,20,36,0,76,25,10,12,1,1,69,2181,350,1848,500,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1480,G_ZOMBIE_PRISONER,Zombie Prisoner,Zombie Prisoner,53,11280,0,0,0,1,780,930,10,20,1,24,39,0,72,25,10,12,1,1,69,2693,350,1768,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1481,G_PUNK,Punk,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,2181,300,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1482,G_ZHERLTHSH,Zherlthsh,Zealotus,63,18300,0,0,0,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,2181,200,800,160,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1483,G_RYBIO,Rybio,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,2693,200,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1484,G_PHENDARK,Phendark,Phendark,73,22729,0,0,0,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,2693,175,1500,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1485,G_MYSTELTAINN,Mysteltainn,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,2725,250,1152,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1486,G_TIRFING,Tirfing,Ogretooth,71,29900,0,0,0,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,2213,100,816,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1487,G_EXECUTIONER,Executioner,Executioner,65,28980,0,0,0,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,2725,200,768,500,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1488,G_ANOLIAN,Anolian,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,2181,200,900,500,864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1489,G_STING,Sting,Sting,61,9500,0,0,0,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,2181,300,528,500,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1490,G_WANDER_MAN,Wander Man,Wanderer,74,8170,0,0,0,2,750,1000,5,5,1,192,38,45,127,85,10,12,1,6,24,2693,100,672,500,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1491,G_DOKEBI,Dokebi,Dokebi,33,2697,0,0,0,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,2181,250,1156,456,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+//Umbala
+1492,INCANTATION_SAMURAI,Incantation Samurai,Samurai Specter,71,218652,0,53600,5000,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,1205,200,1152,1152,480,5000,5000,607,5500,608,3500,985,5500,1165,2,985,3500,5096,500,607,4500,999,6305,504,7500,1235,80,0,0,0,0,4263,1
+1493,DRYAD,Dryad,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,64,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7197,5335,7198,1000,7188,3000,1951,80,1964,1,2270,10,7100,3000,0,0,0,0,4177,1
+1494,KIND_OF_BEETLE,Beetle King,Beetle King,34,1874,0,679,442,1,191,243,45,12,1,34,10,1,50,1,10,12,0,4,22,137,200,1152,1152,384,0,0,0,0,0,0,0,0,7190,6500,7202,4500,928,1000,955,500,2102,1,0,0,0,0,0,0,0,0,4307,1
+1495,STONE_SHOOTER,Stone Shooter,Stone Shooter,42,4104,0,1238,752,9,309,350,12,45,1,40,20,79,92,20,10,12,1,3,63,2181,150,1872,1248,428,0,0,0,0,0,0,0,0,7203,5000,7201,3000,7188,1000,1019,2000,756,100,7049,1000,0,0,0,0,0,0,4225,1
+//1496,STONE_SHOOTER_BULLET,Stone Shooter Bullet,Stone Shooter Bullet,(mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1497,WOODEN_GOLEM,Wooden Golem,Wooden Golem,51,9200,0,1926,1353,1,570,657,32,36,1,41,69,5,85,41,10,12,2,3,42,2181,200,1152,1584,400,0,0,0,0,0,0,0,0,7189,4365,7188,5723,757,110,2270,10,604,100,7201,1000,921,1000,0,0,0,0,4259,1
+1498,WOOTAN_SHOOTER,Wootan Shooter,Wootan Shooter,39,3977,0,886,453,9,224,271,10,28,1,35,29,15,120,42,10,12,1,7,42,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7195,4500,7200,3500,513,1000,7049,1000,512,100,0,0,5116,10,0,0,0,0,4260,1
+1499,WOOTAN_FIGHTER,Wootan Fighter,Wootan Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,67,30,10,12,1,7,43,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,517,4500,7196,4000,1801,3,1812,1,513,1000,7198,1000,5116,5,0,0,0,0,4261,1
+1500,PARASITE,Parasite,Parasite,37,3090,0,1098,478,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,132,200,1152,1152,384,0,0,0,0,0,0,0,0,7193,5500,7194,2000,7186,3880,7198,500,1957,1,1969,1,711,500,0,0,0,0,4309,1
+//1501,PARASITE_BULLET,Parasite Bullet,Parasite Bullet... (mode 2181),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+1502,PORING_V,Pori Pori,Bring it on!,99,95000000,0,87250,27895,1,600,700,17,32,10,50,65,50,45,35,10,12,1,3,25,2485,400,1872,672,480,9999,5000,10020,1000,4005,100,2286,200,5035,5000,2344,5000,2346,5000,2350,5000,2348,5000,10004,6000,7126,7760,2110,4500,0,0,0,0
+
+//Niflheim
+1503,GIBBET,Gibbet,Gibbet,58,6841,0,4011,1824,1,418,656,28,31,1,42,42,27,46,28,10,12,2,6,27,2693,150,1152,1584,400,0,0,0,0,0,0,0,0,7212,1800,7218,5335,7222,4074,724,300,716,100,604,10,0,0,0,0,0,0,4278,1
+1504,DULLAHAN,Dullahan,Dullahan,62,12437,0,4517,2963,1,647,1065,47,38,1,30,5,45,62,22,10,12,1,1,49,2181,155,1152,1152,428,0,0,0,0,0,0,0,0,7209,3200,7210,4850,0,0,2505,13,2506,1,0,0,0,0,0,0,0,0,4176,1
+1505,LOLI_RURI,Loli Ruri,Loli Ruri,71,23470,0,6641,4314,1,1476,2317,39,44,1,66,54,74,81,43,10,12,2,6,87,2181,155,1152,1632,424,0,0,0,0,0,0,0,0,7206,800,7219,3000,7214,5044,985,100,7019,1,0,0,0,0,0,0,0,0,4191,1
+1506,DISGUISE,Disguise,Disguise,55,7543,0,2815,1919,1,279,546,18,29,1,72,45,35,48,65,10,12,1,6,82,2181,147,1152,768,732,0,0,0,0,0,0,0,0,7216,4850,7221,3686,2502,50,518,100,2508,50,2504,2,0,0,0,0,0,0,4181,1
+1507,BLOODY_MURDERER,Bloody Murderer,Bloody Murderer,72,27521,0,9742,3559,1,864,1081,37,41,1,30,90,15,52,12,10,12,2,7,67,2181,175,1152,1344,400,0,0,0,0,0,0,0,0,7207,4171,7223,1000,7208,2000,2288,50,984,100,1229,3,13002,1,0,0,0,0,4214,1
+1508,QUVE,Quve,Quve,40,4559,0,414,306,1,299,469,12,12,1,61,24,19,37,24,10,12,0,1,29,2181,160,1152,1248,400,0,0,0,0,0,0,0,0,7205,3200,7220,5723,601,1000,7154,100,756,10,0,0,0,0,0,0,0,0,4294,1
+1509,LUDE,Lude,Lude,36,3214,0,392,247,1,287,469,14,10,1,59,60,18,36,21,10,12,0,1,29,2181,150,1152,960,752,0,0,0,0,0,0,0,0,7225,3200,7220,5723,1059,1000,2282,10,757,10,12001,100,0,0,0,0,0,0,4193,1
+1510,HYLOZOIST,Hylozoist,Heirozoist,51,7186,0,2314,1297,1,317,498,16,51,1,28,26,47,66,14,10,12,0,6,47,2181,155,1152,1536,969,0,0,0,0,0,0,0,0,7215,4365,7217,5335,7213,2000,740,80,7220,300,757,10,5113,1,0,0,0,0,4321,1
+
+1511,AMON_RA,Amon Ra,Amon Ra,88,1214138,0,87264,35891,3,1647,2576,26,52,1,1,90,124,74,45,10,12,2,7,62,164,100,1152,672,480,8000,5000,607,5500,608,3500,732,5500,5053,150,2615,50,7211,7760,985,3880,616,400,1552,10,607,3000,0,0,0,0,4236,1
+
+//Louyang
+1512,HYEGUN,Hyegun,Yao Jun,56,9981,0,2199,1032,1,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7054,3880,609,100,985,10,2406,1,7277,300,0,0,0,0,0,0,0,0,4328,1
+1513,CIVIL_SERVANT,Civil Servant,Mao Guai,62,14390,0,4023,2750,1,650,1010,42,5,58,15,20,60,80,50,10,12,1,2,44,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,7262,4171,7263,2000,606,10,1023,100,693,100,0,0,0,0,0,0,0,0,4202,1
+1514,DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,3030,769,1,550,789,39,10,55,62,55,25,72,22,10,12,1,9,44,131,200,1152,1152,384,0,0,0,0,0,0,0,0,7266,4365,7265,3000,7268,800,1036,1000,7038,3000,0,0,0,0,0,0,0,0,4272,1
+1515,GARM_BABY,Garm Baby,Garm Baby,61,20119,0,1022,2980,1,680,1179,34,13,45,30,56,55,85,30,10,12,1,2,41,2181,300,1152,1152,384,0,0,0,0,0,0,0,0,7270,1500,7269,2500,7066,4365,749,100,12000,100,0,0,0,0,0,0,0,0,4323,1
+1516,INCREASE_SOIL,Increase Soil,Mi Gao,51,8230,0,2760,2110,1,560,700,30,12,40,45,23,12,69,12,10,12,1,0,62,145,400,1152,1152,384,0,0,0,0,0,0,0,0,7264,4365,7004,2300,997,10,969,2,0,0,0,0,0,0,0,0,0,0,4231,1
+1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,Jing Guai,48,5920,0,1643,1643,1,434,633,23,16,46,51,19,8,57,30,10,12,2,6,62,2181,175,1152,1152,384,0,0,0,0,0,0,0,0,7267,4500,7268,400,1501,10,1523,1,0,0,0,0,0,0,0,0,0,0,4265,1
+1518,BACSOJIN,Bacsojin,White Lady,85,253221,0,45250,16445,1,1868,6124,20,55,1,65,44,112,152,35,10,12,2,7,67,2213,200,1152,1152,480,5000,1000,607,500,608,500,985,500,1020,5500,603,2,617,2,7165,3000,7166,1000,747,500,0,0,2234,1,0,0,0,0
+1519,CHUNG_E,Chung E,Green Maiden,59,23900,0,4256,920,1,460,1050,8,15,1,65,43,30,90,15,10,12,1,7,44,2181,300,2112,912,576,0,0,0,0,0,0,0,0,7053,4850,740,100,1806,10,518,500,0,0,0,0,0,0,5042,2,0,0,0,0
+1520,BOILED_RICE,Boiled Rice,Boiled Rice,14,344,0,81,44,1,59,72,0,10,1,14,14,0,19,15,10,12,1,6,21,129,300,1672,672,480,0,0,0,0,0,0,0,0,564,5500,7272,3000,7194,1000,7198,1000,0,0,0,0,0,0,0,0,0,0,0,0
+1521,G_ALICE,Alice,Alice,62,10000,0,0,0,1,550,700,5,5,1,64,42,85,100,130,10,12,1,7,60,145,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1522,G_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,40599,0,0,0,1,836,1129,27,27,1,19,32,5,83,35,10,12,1,1,49,1173,175,1772,120,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1523,G_ANTIQUE_FIRELOCK,Antique Firelock,Firelock Soldier,47,3852,0,0,0,9,289,336,10,10,1,37,29,15,101,15,10,12,1,1,49,133,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1524,G_BABY_LEOPARD,Baby Leopard,Baby Leopard,32,2590,0,0,0,2,155,207,0,5,1,44,20,4,49,10,10,13,0,2,28,2181,150,988,288,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1525,G_BATHORY,Bathory,Bathory,44,5415,0,0,0,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,1173,100,1504,840,900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1526,G_BLOOD_BUTTERFLY,Bloody Butterfly,Bloody Butterfly,57,8082,0,0,0,2,354,575,5,23,1,65,35,37,116,30,10,13,1,4,44,141,150,872,500,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1527,G_C_TOWER_MANAGER,Clock Tower Manager,Clock Tower Manager,63,18600,0,0,0,3,880,1180,35,30,1,75,20,64,75,60,10,12,2,0,80,145,200,1072,672,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1528,G_CLOCK,Clock,Clock,60,11050,0,0,0,1,720,909,15,10,1,70,50,25,90,50,10,12,1,0,42,145,200,1092,792,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1529,G_DARK_SNAKE_LORD,Dark Snake Lord,Evil Snake Lord,73,254993,0,0,0,1,1433,2033,25,55,1,83,62,80,164,88,10,12,2,2,68,1205,200,976,500,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1530,G_DRACULA,Dracula,Dracula,85,320096,0,0,0,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,1205,145,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1531,G_EVIL_CLOUD_HERMIT,Evil Cloud Hermit,Taoist Hermit,57,15003,0,0,0,9,620,899,25,59,1,66,21,76,130,79,10,13,2,0,40,133,150,1754,544,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1532,G_EXPLOSION,Explosion,Explosion,46,8054,0,0,0,1,336,447,35,27,1,61,56,78,66,38,10,12,0,2,63,2181,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1533,G_FUR_SEAL,Fur Seal,Seal,63,9114,0,0,0,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,149,250,1612,622,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1534,G_GOBLIN_1,Goblin,Goblin,25,1176,0,0,0,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,1173,100,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1535,G_GOBLIN_2,Goblin,Goblin,24,1034,0,0,0,1,88,100,10,5,1,24,24,15,66,10,10,12,1,7,23,149,150,1320,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1536,G_GOBLIN_3,Goblin,Goblin,24,1034,0,0,0,1,132,165,10,5,1,24,24,15,24,10,10,12,1,7,25,141,250,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1537,G_GOBLIN_4,Goblin,Goblin,23,1359,0,0,0,1,109,131,10,5,1,23,46,15,36,10,10,12,1,7,22,141,200,1624,624,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1538,G_GOBLIN_5,Goblin,Goblin,22,1952,0,0,0,1,105,127,10,5,1,22,22,15,32,10,10,12,1,7,21,141,300,3074,1874,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1539,G_GOBLIN_LEADER,Goblin Leader,Goblin Leader,64,19735,0,0,0,1,663,753,48,16,1,55,37,30,69,58,10,12,1,7,24,1173,120,1120,620,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1540,G_GOLEM,Golem,Golem,25,3900,0,0,0,1,175,187,40,0,1,15,25,0,15,0,10,12,2,0,60,145,300,1608,816,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1541,G_GREATEST_GENERAL,Greatest General,Greatest General,40,3632,0,0,0,3,350,400,15,15,1,20,60,55,82,140,10,12,1,0,43,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1542,G_INCANTATION_SAMURAI,Incantation Samurai,Incantation Samurai,75,218652,0,0,0,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,1205,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1543,G_KAPHA,Kapha,Kapha,41,7982,0,0,0,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,2181,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1544,G_KARAKASA,Karakasa,Karakasa,30,3092,0,0,0,1,140,183,1,20,1,40,12,5,52,45,10,12,1,0,60,129,300,1480,480,1056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1545,G_KOBOLD_1,Kobold,Kobold,36,3893,0,0,0,1,265,318,15,10,1,90,36,30,52,20,10,12,1,7,44,141,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1546,G_KOBOLD_2,Kobold,Kobold,31,2179,0,0,0,1,262,324,15,10,1,31,31,20,46,20,10,12,1,7,45,141,200,1528,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1547,G_KOBOLD_3,Kobold,Kobold,31,2179,0,0,0,1,186,216,15,10,1,31,31,20,88,20,10,12,1,7,43,141,300,1228,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1548,G_KOBOLD_LEADER,Kobold Leader,Kobold Leader,65,17935,0,0,0,1,649,957,37,37,1,90,36,30,77,59,10,12,1,7,44,1173,150,1028,528,360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1549,G_LAVA_GOLEM,Lava Golem,Lava Golem,77,24324,0,0,0,1,1541,2049,65,50,1,57,115,127,76,68,10,12,2,0,83,149,400,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1550,G_LIVE_PEACH_TREE,Live Peach Tree,Enchanted Peach Tree,55,10050,0,0,0,8,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,400,1288,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1551,G_MARSE,Marse,Marse,31,5034,0,0,0,1,211,252,0,5,1,31,25,5,52,30,10,12,0,5,41,145,300,1956,756,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1552,G_MIYABI_NINGYO,Miyabi Ningyo,Miyabi Doll,33,6300,0,0,0,1,250,305,1,2,1,31,15,10,47,15,10,12,1,6,27,145,200,1720,500,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1553,G_MYST,Myst,Myst,38,3745,0,0,0,1,365,445,0,40,1,38,18,0,53,10,10,12,2,0,25,1173,200,1576,576,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1554,G_NIGHTMARE_TERROR,Nightmare Terror,Nightmare Terror,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,2181,150,1816,816,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1555,G_PARASITE,Parasite,Parasite,37,3090,0,0,0,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,132,200,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1556,G_POISON_TOAD,Poison Toad,Poisonous Toad,46,6629,0,0,0,1,288,408,5,10,1,45,19,1,66,43,10,12,1,2,45,129,165,976,576,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1557,G_ROTAR_ZAIRO,Rotar Zairo,Rotar Zairo,25,1209,0,0,0,10,109,137,4,34,1,62,45,48,55,5,10,12,1,0,44,133,155,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1558,G_SAND_MAN,Sandman,Sandman,34,3413,0,0,0,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,2181,250,1672,720,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1559,G_SCORPION,Scorpion,Scorpion,24,1109,0,0,0,1,80,135,30,0,1,24,24,5,52,5,10,12,0,4,23,149,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1560,G_SHINOBI,Shinobi,Shinobi,69,12700,0,0,0,1,460,1410,30,21,1,91,25,25,89,40,10,12,1,7,67,1173,200,1480,480,720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1561,G_SMOKIE,Smokie,Smokie,18,641,0,0,0,1,61,72,0,10,1,18,36,25,26,35,10,12,0,2,22,145,200,1576,576,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1562,G_SOLDIER_SKELETON,Soldier Skeleton,Soldier Skeleton,29,2334,0,0,0,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,2181,200,2276,576,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1563,G_TENGU,Tengu,Tengu,65,16940,0,0,0,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,2181,150,1056,1056,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1564,G_WICKED_NYMPH,Wicked Nymph,Evil Nymph,63,18029,0,0,0,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,1173,200,1672,672,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1565,G_WILD_GINSENG,Wild Ginseng,Hermit Plant,46,6900,0,0,0,5,220,280,10,20,1,42,36,55,66,30,10,13,0,3,43,145,400,2208,1008,324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1566,G_WRAITH_DEAD,Wraith Dead,Wraith Dead,74,42131,0,0,0,2,1366,1626,25,30,1,99,55,95,115,45,10,12,2,1,89,1173,175,1816,576,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1567,G_ANCIENT_WORM,Ancient Worm,Ancient Worm,67,22598,0,0,0,1,947,1115,35,30,1,35,56,55,81,72,10,12,2,4,25,1173,165,1792,792,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1568,G_ANGELING,Angeling,Angeling,20,55000,0,0,0,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1569,G_BLOODY_KNIGHT,Bloody Knight,Bloody Knight,82,57870,0,0,0,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,1173,250,828,528,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1570,G_CRAMP,Cramp,Cramp,56,4720,0,0,0,1,395,465,0,5,1,85,35,5,65,60,10,12,0,2,45,149,100,1000,500,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1571,G_DEVIACE,Deviace,Deviace,47,19192,0,0,0,1,514,674,10,20,1,47,62,48,62,25,10,12,1,5,81,145,400,1680,480,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1572,G_DROPS,Drops,Drops,3,55,0,0,0,1,10,13,0,0,1,3,3,0,12,15,10,12,1,3,23,131,400,1372,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1573,G_ELDER,Elder,Elder,64,21592,0,0,0,3,421,560,45,68,1,76,68,142,72,86,10,12,2,7,80,2181,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1574,G_ELDER_WILLOW,Elder Willow,Elder Willow,20,693,0,0,0,1,58,70,10,30,1,20,25,35,38,30,10,12,1,3,43,149,200,1372,672,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1575,G_FLORA,Flora,Flora,26,2092,0,0,0,3,242,273,10,35,1,26,35,5,43,80,10,12,2,3,22,132,1000,1432,432,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1576,G_GHOSTRING,Ghostring,Ghostring,18,73300,0,0,0,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,1205,300,1220,1080,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1577,G_GOBLIN_ARCHER,Goblin Archer,Goblin Archer,28,1750,0,0,0,9,89,113,0,0,1,15,20,15,72,20,10,12,0,7,25,133,200,1172,672,420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1578,G_HORONG,Horong,Horong,34,1939,0,0,0,1,275,327,99,50,1,34,10,0,50,0,10,12,0,0,83,141,400,1888,1152,828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1579,G_HYDRA,Hydra,Hydra,14,660,0,0,0,7,22,28,0,40,1,14,14,0,40,2,10,12,0,3,41,132,1000,800,432,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1580,G_INCUBUS,Incubus,Incubus,75,17281,0,0,0,2,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,1173,165,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1581,G_VOCAL,Vocal,Vocal,18,3016,0,0,0,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,1205,200,1080,648,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1582,DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,1,50,20,75,77,200,10,12,1,6,87,1205,400,1872,672,480,0,0,0,0,0,0,0,0,1039,3000,912,4850,2255,100,512,5000,7023,1,983,100,694,100,0,0,0,0,4174,1
+1583,TAO_GUNKA,Tao Gunka,Tao Gunka,70,193000,0,59175,10445,3,1450,1770,20,20,70,40,85,78,35,140,60,12,2,6,60,173,225,1872,672,480,3000,5000,984,6000,617,3000,505,6000,7300,4850,7067,4850,728,1000,2296,400,504,3000,1002,1000,2231,5,0,0,0,0,4302,1
+
+//Ayothaya
+1584,TAMRUAN,Tamruan,Tamruan,52,10234,0,3812,55,3,489,534,15,35,1,62,38,75,72,15,10,12,2,6,67,141,200,1872,672,480,0,0,0,0,0,0,0,0,7301,4850,7069,3000,1117,40,1155,8,2315,3,0,0,0,0,0,0,0,0,4304,1
+1585,MIME_MONKEY,Mime Monkey,Mime Monkey,40,6000,0,200,22,3,300,350,40,40,1,40,40,40,40,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,0,0,0,0,0,0
+1586,LEAF_CAT,Leaf Cat,Leaf Cat,38,2396,0,165,1212,1,266,307,5,19,1,67,12,45,60,29,10,12,0,2,22,131,150,1872,672,480,0,0,0,0,0,0,0,0,7198,4365,520,300,608,5,1023,1100,568,250,567,500,7298,5335,0,0,0,0,4195,1
+1587,KRABEN,Kraben,Kraben,50,5880,0,206,1322,1,125,765,5,42,1,125,1,66,75,50,10,12,1,0,48,141,75,1872,672,480,0,0,0,0,0,0,0,0,912,3500,519,3000,521,1000,2102,1,7299,4850,0,0,603,10,0,0,0,0,4295,1
+
+//Some more G_Mobs and Xmas_Orc
+1588,XMAS_ORC,Christmas Orc,Christmas Orc,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,2181,200,1864,864,288,0,0,0,0,0,0,0,0,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,0,0,0,0,4066,1
+1589,G_MANDRAGORA,Mandragora,Mandragora,12,405,0,0,0,4,26,35,0,25,1,12,24,1,36,15,10,12,1,3,62,132,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1590,G_GEOGRAPHER,Geographer,Geographer,56,8071,0,0,0,3,467,621,28,26,1,67,47,60,68,44,10,12,0,3,62,132,2000,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1591,A_LUNATIC,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1592,A_MOBSTER,Gangster,Gangster,40,8000,0,0,0,1,100,300,41,37,1,46,20,35,76,55,10,12,1,7,20,1685,250,1100,560,580,0,0,0,0,0,0,0,0,7049,10000,601,2000,1206,3000,713,1000,550,10000,7049,0,7049,0,7049,0,0,0,0,0
+1593,A_ANCIENT_MUMMY,Ancient Mummy,Ancient Mummy,64,39760,0,0,0,1,836,1129,27,27,28,19,32,5,83,35,10,12,1,1,49,149,175,1772,120,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1594,G_FREEZER,Freezer,Freezer,72,12263,0,0,0,2,672,984,55,43,69,41,59,5,67,100,10,12,1,2,41,53,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1595,G_MARIN,Marin,Marin,15,742,0,0,0,1,39,43,0,10,1,10,10,5,35,15,10,12,1,3,41,1,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1596,G_TAMRUAN,Tamruan,Tamruan,52,10234,0,0,0,1,489,534,38,94,26,20,15,0,60,45,10,10,1,6,62,181,190,872,560,380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1597,G_GARGOYLE,Gargoyle,Gargoyle,48,3950,0,0,0,9,290,360,10,10,15,61,20,20,126,40,10,12,1,6,64,5,200,1020,720,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1598,G_BLAZZER,Blazzer,Blazzer,43,8252,0,0,0,2,533,709,50,40,1,52,50,64,69,40,10,12,0,6,43,5,200,1564,864,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1599,G_WHISPER_BOSS,Giant Whisper,Giant Whisper,34,5040,0,0,0,1,198,239,0,45,1,51,14,0,60,0,10,12,0,6,68,53,250,2536,1536,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1600,G_HEATER,Heater,Heater,68,15648,0,0,0,2,682,1007,40,42,69,47,25,5,71,100,10,12,1,2,43,53,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1601,G_PERMETER,Permeter,Permeter,63,11684,0,0,0,2,943,1212,46,45,69,59,60,5,69,100,10,12,1,2,40,17,250,1100,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1602,G_SOLIDER,Solider,Solider,70,17181,0,0,0,2,796,978,57,43,69,35,85,5,74,100,10,12,1,2,42,17,250,1452,483,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1603,G_BIGFOOT,Bigfoot,Bigfoot,25,1619,0,0,0,1,198,220,10,0,1,25,55,15,20,25,10,12,2,2,22,145,300,1260,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1604,G_GIANT_HONET,Giant Hornet,Giant Hornet,56,12834,0,0,0,1,650,851,38,43,35,38,32,10,71,64,10,12,0,4,24,1173,155,1292,792,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1605,G_DARK_ILLUSION,Dark Illusion,Dark Illusion,77,101487,0,0,0,2,1300,1982,64,70,5,100,40,100,97,40,10,12,2,6,89,1205,145,1024,768,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1606,G_GARM_BABY,Garm Baby,Garm Baby,61,20119,0,0,0,3,680,1179,34,13,1,30,56,55,85,30,10,12,1,2,41,133,300,1152,1152,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1607,G_GOBLINE_XMAS,Christmas Goblin,Christmas Goblin,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,1173,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1608,G_THIEF_BUG__,Thief Bug Male,Thief Bug Male,19,583,0,0,0,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1609,G_DANCING_DRAGON,Dancing Dragon,Zhu Po Long,54,9136,0,0,0,3,550,789,39,10,1,62,55,25,72,10,10,12,1,9,44,131,200,1152,1152,384,0,0,0,0,0,0,0,0,570,500,571,50,572,20,515,10000,12018,5000,0,0,0,0,668,100,0,0,0,0
+1610,A_MUNAK,Munak,Munak,30,2872,0,0,0,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+1611,A_BON_GUN,Bongun,Bongun,32,3520,0,0,0,1,220,260,0,0,45,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+1612,A_HYEGUN,Hyegun,Yao Jun,56,9981,0,0,0,3,710,1128,12,10,60,40,36,10,73,15,10,12,1,1,49,133,200,1152,1152,384,0,0,0,0,0,0,0,0,508,2000,0,0,0,0,0,0,0,0,0,0,12017,100,12016,100,0,0,0,0
+
+//Einbroch
+1613,METALING,Metaling,Metaling,26,889,0,492,249,1,135,270,5,3,20,15,10,18,35,2,10,12,0,0,20,131,250,672,672,480,0,0,0,0,0,0,0,0,7325,4000,1002,1000,998,500,7126,1000,7317,200,512,500,7312,5000,0,0,0,0,0,0
+1614,MINERAL,Mineral,Mineral,56,7950,0,3563,1768,1,723,812,29,35,50,52,35,21,77,32,10,12,0,0,40,145,175,572,672,480,0,0,0,0,0,0,0,0,7321,3000,728,500,714,2,984,80,1011,800,715,100,969,2,0,0,0,0,0,0
+1615,OBSIDIAN,Obsidian,Obsidian,50,8812,0,3002,2202,1,841,980,35,5,50,32,42,24,71,55,10,12,0,0,42,141,200,1572,672,480,0,0,0,0,0,0,0,0,7315,3000,730,500,1003,500,985,50,999,500,1263,10,0,0,0,0,0,0,0,0
+1616,PITMAN,Pitman,Pitman,43,5015,0,1799,1083,1,290,486,22,12,50,15,5,5,52,36,10,12,2,1,42,145,150,1672,672,480,0,0,0,0,0,0,0,0,7318,3000,7319,500,998,800,999,500,1003,100,1041,1000,7327,80,0,0,0,0,0,0
+1617,WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,4412,1135,1,500,889,23,10,60,69,55,5,59,77,10,12,2,0,20,141,250,872,672,480,0,0,0,0,0,0,0,0,7323,1000,7068,1000,998,500,625,50,1002,1000,604,50,7319,3800,0,0,0,0,0,0
+1618,UNGOLIANT,Ungoliant,Ungoliant,69,29140,0,8211,142,1,1290,2280,25,15,80,52,57,25,119,43,10,12,2,4,45,1173,300,672,672,480,0,0,0,0,0,0,0,0,7316,4500,1014,3500,1013,1000,7289,1500,7326,2500,718,1500,2406,500,0,0,0,0,0,0
+1619,PORCELLIO,Porcellio,Porcellio,28,1654,0,512,346,1,82,247,0,8,30,31,21,50,54,85,10,12,0,4,62,131,150,572,672,480,0,0,0,0,0,0,0,0,7312,5000,1208,25,928,1000,1052,3000,630,2,7326,30,0,0,0,0,0,0,0,0
+1620,NOXIOUS,Noxious,Noxious,35,2038,0,698,698,1,299,400,0,35,30,41,10,30,44,2,10,12,1,0,68,141,300,1472,672,480,0,0,0,0,0,0,0,0,7322,1000,7001,3000,605,50,7320,3000,0,0,0,0,0,0,603,1,0,0,0,0
+1621,VENOMOUS,Venomous,Venomous,42,4653,0,1780,1280,1,422,844,0,42,30,60,17,19,58,1,10,12,1,0,25,141,300,1472,672,480,0,0,0,0,0,0,0,0,7320,5000,7119,3000,7154,1000,7322,2000,0,0,0,0,0,0,603,1,0,0,0,0
+1622,TEDDY_BEAR,Teddy Bear,Teddy Bear,71,8109,0,5891,3445,1,559,1352,19,27,70,179,32,41,121,26,10,12,0,0,60,149,125,572,672,480,0,0,0,0,0,0,0,0,7317,3800,518,1000,615,300,538,1000,5113,50,2652,10,985,100,0,0,0,0,0,0
+1623,RSX_0806,RSX 0806,RSX-0806,86,280733,0,31010,32011,1,2740,5620,39,41,1,51,75,25,93,84,10,12,2,0,60,1205,200,1152,1152,480,25000,5000,607,5500,5104,3500,732,5500,7093,6000,999,5000,644,5000,617,1000,7327,5000,1242,50,1531,20,1230,10,0,0,0,0
+1624,G_WASTE_STOVE,Waste Stove,Old Stove,68,15895,0,0,0,1,692,1081,23,10,60,69,55,5,59,77,10,12,2,0,20,645,250,872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1625,G_PORCELLIO,Porcellio,Porcellio,28,1654,0,0,0,1,82,247,0,8,30,31,21,50,54,85,10,12,0,4,62,131,150,572,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Hellion Revenant
+1626,G_DARK_PRIEST,Dark Priest,Hellion Revenant,88,286900,0,1,1,2,50,3150,25,50,1,80,50,99,130,99,10,12,1,6,69,181,150,432,384,192,0,0,0,0,0,0,0,0,7337,8000,7337,5000,7337,3000,7337,1000,7337,500,7337,100,0,0,0,0,0,0,0,0
+
+//Lighthalzen
+1627,ANOPHELES,Anopheles,Anopheles,23,100,0,99,55,1,48,63,0,90,1,200,4,5,120,23,10,12,0,4,64,133,250,972,672,480,0,0,0,0,0,0,0,0,601,1000,7119,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1628,MOLE,Mole,Holden,36,2209,0,268,172,1,53,63,0,5,1,18,23,30,45,5,10,12,0,2,42,131,400,1872,672,480,0,0,0,0,0,0,0,0,1017,5000,1018,5000,5119,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1629,HILL_WIND,Hill Wind,Hill Wind,43,3189,0,1800,1100,1,290,480,10,15,1,42,31,50,51,23,10,12,1,2,64,671,400,1872,672,480,0,0,0,0,0,0,0,0,517,1000,528,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1630,BACSOJIN_,Bacsojin,White Lady,72,56380,0,5590,1659,1,560,1446,10,51,1,85,78,85,150,60,10,12,2,7,44,1973,200,1152,1152,480,0,5000,607,5500,2513,2000,617,5000,1020,5500,603,5000,617,3000,7165,3000,7166,1000,747,500,0,0,2234,10,0,0,0,0
+1631,CHUNG_E_,Chung E,Green Maiden,59,23900,0,4256,920,1,60,105,8,15,1,33,33,10,58,15,10,12,1,7,44,145,300,2112,912,576,0,0,0,0,0,0,0,0,7053,4200,740,100,1806,10,518,500,0,0,0,0,0,0,5042,50,0,0,0,0
+1632,GREMLIN,Gremlin,Gremlin,53,9280,0,4355,1768,1,329,762,29,25,1,41,59,75,62,15,10,12,1,3,21,671,200,1872,672,480,0,0,0,0,0,0,0,0,7340,3000,938,3000,719,100,2406,5,1265,1,0,0,0,0,603,2,0,0,0,0
+1633,BEHOLDER,Beholder,Beholder,56,7950,0,4821,3822,1,723,812,17,30,1,62,25,59,85,32,10,12,1,3,21,671,200,1872,672,480,0,0,0,0,0,0,0,0,576,3000,605,100,996,100,985,10,0,0,0,0,0,0,603,2,0,0,0,0
+//Normal advanced class mobs
+1634,SEYREN,Seyren,Seyren Windsor,91,88402,0,100000,116460,1,2100,2530,63,12,1,40,86,20,94,25,10,12,1,7,63,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,13001,1,1163,300,603,50,2229,15,2317,2,1155,400,1474,1,0,0,0,0
+1635,EREMES,Eremes,Eremes Guile,87,60199,0,100000,99800,1,2020,2320,23,12,1,138,31,19,90,30,10,12,1,7,85,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,603,50,1253,100,1262,7,1264,80,678,250,2336,5,2514,1,0,0,0,0
+1636,HARWORD,Harword,Howard Alt-Eisen,83,78690,0,100000,112540,1,1890,2390,59,10,1,62,99,35,98,66,10,12,1,7,82,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,2607,50,2406,10,1361,200,2104,15,2318,1,603,50,2514,1,0,0,0,0
+1637,MAGALETA,Magaleta,Margaretha Solin,90,61282,0,100000,117800,1,1300,2053,35,60,1,81,41,145,70,40,10,12,1,7,66,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,2607,50,1602,300,1561,7,2104,15,603,50,2504,15,2327,1,0,0,0,0
+1638,SHECIL,Shecil,Cecil Damon,82,58900,0,100000,118260,9,1226,1854,25,15,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,7345,3000,12014,200,1705,150,1711,80,12007,200,603,50,2502,100,2331,5,0,0,0,0
+1639,KATRINN,Katrinn,Kathryne Keyron,92,47280,0,100000,116470,1,497,1697,10,74,1,56,39,180,110,39,10,12,1,7,68,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,3000,603,40,1611,300,1620,2,2102,30,2334,30,2404,30,5085,1,0,0,0,0
+//MVP Slaves
+1640,G_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,347590,0,18000,10000,1,4238,5040,58,37,1,40,86,20,94,25,10,12,1,7,63,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1641,G_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,211230,0,18000,10000,1,3189,5289,27,39,1,138,31,19,90,30,10,12,1,7,85,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1642,G_HARWORD,Whitesmith Harword,Whitesmith Howard,99,310000,0,18000,10000,1,4822,5033,42,36,1,62,99,35,98,66,10,12,1,7,82,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1643,G_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,182910,0,18000,10000,1,1688,2580,35,78,1,81,41,145,70,40,10,12,1,7,66,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1644,G_SHECIL,Sniper Shecil,Sniper Cecil,99,209000,0,18000,10000,9,1892,5113,22,35,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+1645,G_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,189920,0,18000,10000,1,497,2094,10,82,1,56,39,180,110,39,10,12,1,7,68,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,617,10,0,0,0,0
+//MVP Monsters
+1646,B_SEYREN,Lord Knight Seyren,Lord Knight Seyren,99,1647590,0,4835600,1569970,1,7238,11040,72,37,1,81,94,110,130,52,10,12,1,7,63,1973,120,672,672,480,94100,5000,617,5500,603,5000,732,2000,1132,3000,2342,4000,2412,9000,1470,4000,1469,4000,1166,3000,1415,3000,1169,3000,0,0,0,0
+1647,B_EREMES,Assassin Cross Eremes,Assassin Cross Eremes,99,1411230,0,4083400,1592380,1,4189,8289,37,39,1,181,62,37,122,60,10,12,1,7,85,1973,120,672,672,480,84100,5000,617,5500,603,5000,732,2000,1234,3000,1230,3000,2319,9000,1233,4000,1232,4000,1265,4000,13002,4000,1231,3000,0,0,0,0
+1648,B_HARWORD,Whitesmith Harword,Whitesmith Howard,99,1460000,0,4002340,1421000,1,7822,8251,66,36,1,73,112,35,136,60,10,12,1,7,82,1973,120,672,672,480,82100,5000,617,5500,603,5000,732,2000,1138,4000,1140,3000,2318,9000,1365,4000,1364,4000,1369,3000,1368,4000,1363,4000,0,0,0,0
+1649,B_MAGALETA,High Priest Magaleta,High Priest Margaretha,99,1092910,0,4257000,1318800,1,4688,5580,35,78,1,84,64,182,92,100,10,12,1,7,66,1973,120,672,672,480,80100,5000,617,5500,603,5000,732,2000,1814,4000,2513,3000,2615,9000,1557,4000,1527,4000,1528,3000,1560,4000,1526,4000,0,0,0,0
+1650,B_SHECIL,Sniper Shecil,Sniper Cecil,99,1349000,0,4093000,1526000,9,4892,9113,22,35,1,180,39,67,193,130,10,12,1,7,64,1973,120,500,672,480,92100,5000,617,5500,603,5000,1723,2000,1228,4000,1236,4000,617,9000,1234,3000,1237,4000,1722,4000,1724,3000,1720,3000,0,0,0,0
+1651,B_KATRINN,High Wizard Katrinn,High Wizard Kathryne,99,1069920,0,4008200,1636700,1,1197,4394,10,88,1,89,42,223,128,93,10,12,1,7,68,1973,120,672,672,480,95100,5000,617,5500,603,5000,732,2000,1241,4000,1242,4000,2616,9000,2343,3000,2513,3000,1618,4000,1620,4000,2319,4000,0,0,0,0
+//1'st Class Mobs
+1652,YGNIZEM,Ygnizem,Egnigem Cenia,58,11200,0,4870,98,1,723,1112,35,12,1,35,52,18,70,20,10,12,1,7,43,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,1000,644,10,1158,20,1127,20,2313,10,1152,80,1170,1,2317,1,0,0,0,0
+1653,WHIKEBAIN,Whikebain,Wikebine Tres,62,7320,0,4204,21,1,593,789,9,12,1,48,34,20,74,30,10,12,1,7,65,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,2000,644,10,2306,40,1220,10,2315,2,1208,50,13004,10,1223,1,0,0,0,0
+1654,ARMAIA,Armaia,Armeyer Dinze,66,7110,0,4008,35,1,650,813,42,6,1,36,49,15,80,60,10,12,1,7,62,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,1000,644,10,1358,50,1352,40,2311,10,1302,80,1307,10,2504,1,0,0,0,0
+1655,EREND,Erend,Errende Ebecee,59,6980,0,4501,67,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,120,672,672,480,0,0,0,0,0,0,0,0,7345,500,644,10,1514,50,1517,20,2326,5,2324,10,1523,1,2217,5,0,0,0,0
+1656,KAVAC,Kavac,Kavach Icarus,60,7899,0,4090,86,9,584,804,14,5,1,75,10,15,108,40,10,12,1,7,44,1693,120,672,672,480,0,0,0,0,0,0,0,0,7347,2000,644,10,12006,100,1708,10,2308,5,2402,30,2404,2,1716,1,0,0,0,0
+1657,RAWREL,Rawrel,Laurell Weinder,61,6168,0,4620,30,1,330,417,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,120,672,672,480,0,0,0,0,0,0,0,0,934,1000,644,10,2102,5,1608,50,2322,10,2333,30,2607,1,1616,1,0,0,0,0
+//1'st Class MvP (Ygnizem/Egnigem Cenia) and her mobs.
+1658,B_YGNIZEM,Ygnizem,Egnigem Cenia,79,214200,0,258760,86000,1,3890,5690,48,12,1,60,45,31,110,40,10,12,1,7,43,1973,100,500,500,480,32000,5000,617,5500,603,5000,732,2000,1162,1000,644,5000,603,5000,1167,1000,2320,1000,2406,1000,1130,1000,644,1000,0,0,0,0
+1659,G_WHIKEBAIN,Whikebain,Wikebine Tres,62,7320,0,0,0,1,593,789,9,12,1,48,34,20,74,30,10,12,1,7,65,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1660,G_ARMAIA,Armaia,Armeyer Dinze,66,7110,0,0,0,1,650,813,42,6,1,36,49,15,80,60,10,12,1,7,62,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1661,G_EREND,Erend,Errende Ebecee,59,6980,0,0,0,1,796,1059,14,30,1,31,41,93,60,30,10,12,1,7,46,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1662,G_KAVAC,Kavac,Kavach Icarus,60,7899,0,0,0,9,584,804,14,5,1,75,10,15,108,40,10,12,1,7,44,1693,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1663,G_RAWREL,Rawrel,Laurell Weinder,61,6168,0,0,0,1,330,417,8,48,1,41,5,120,45,10,10,12,1,7,48,3229,120,672,672,480,0,0,0,0,0,0,0,0,0,0,644,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+1664,POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,3900,1800,7,800,900,10,30,1,40,25,20,80,80,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,718,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1665,POTON_CANON_1,Photon Cannon,Photon Cannon,67,7500,0,4300,2000,7,700,800,15,30,1,40,30,40,86,80,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,726,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1666,POTON_CANON_2,Photon Cannon,Photon Cannon,64,7100,0,3100,2700,7,800,900,8,30,1,40,21,29,80,91,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,721,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1667,POTON_CANON_3,Photon Cannon,Photon Cannon,65,7800,0,3800,2300,7,700,800,15,30,1,40,23,30,90,99,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7126,5000,728,1000,938,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1668,ARCHDAM,Archdam,Archdam,79,25000,0,8000,100,1,1000,2000,15,15,1,65,35,75,75,15,10,12,2,7,60,157,200,1272,672,480,0,0,0,0,0,0,0,0,7317,5000,999,500,984,200,985,200,0,0,0,0,0,0,0,0,0,0,0,0
+1669,DIMIK,Dimik,Dimik,77,10000,0,0,0,7,840,1480,45,28,1,35,41,15,120,40,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
+1670,DIMIK_1,Dimik,Dimik,79,16000,0,6400,3500,7,1140,1980,45,28,1,88,20,20,120,40,10,12,1,0,44,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7352,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
+1671,DIMIK_2,Dimik,Dimik,89,29000,0,8000,5000,7,1440,2280,45,28,1,40,30,30,150,70,10,12,1,0,41,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7353,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
+1672,DIMIK_3,Dimik,Dimik,80,19000,0,5900,2800,7,1240,2080,68,28,1,30,78,20,120,30,10,12,1,0,42,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7354,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
+1673,DIMIK_4,Dimik,Dimik,82,13900,0,5800,4500,7,1840,2840,45,28,1,20,20,10,120,30,10,12,1,0,43,157,200,1272,672,480,0,0,0,0,0,0,0,0,7319,2000,7355,50,999,500,7094,500,999,500,984,10,0,0,0,0,0,0,0,0
+1674,MONEMUS,Monemus,Monemus,88,80000,0,0,0,5,2000,3000,26,52,1,1,90,124,74,45,10,12,2,0,63,164,200,1272,672,480,0,0,0,0,0,0,0,0,7049,2000,953,1000,7049,0,7049,0,7049,0,7049,0,7049,0,7049,0,0,0,0,0
+1675,VENATU,Venatu,Venatu,77,8000,0,0,0,3,1200,1800,35,20,1,26,24,5,75,40,10,12,1,0,43,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
+1676,VENATU_1,Venatu,Venatu,72,8900,0,4000,2000,3,800,1400,30,20,1,26,24,5,82,30,10,12,1,0,40,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7356,350,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
+1677,VENATU_2,Venatu,Venatu,80,9000,0,4000,2000,3,900,1500,30,20,1,82,32,5,105,30,10,12,1,0,44,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7357,500,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
+1678,VENATU_3,Venatu,Venatu,78,9500,0,4500,2000,3,800,1400,30,20,1,26,68,5,95,30,10,12,1,0,42,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7358,400,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
+1679,VENATU_4,Venatu,Venatu,75,12300,0,4000,2000,3,800,1400,30,20,1,26,24,5,100,30,10,12,1,0,41,157,150,1272,672,480,0,0,0,0,0,0,0,0,7317,2000,7359,300,999,500,7094,500,999,500,985,10,0,0,0,0,0,0,0,0
+1680,HILL_WIND_1,Hill Wind,Hill Wind,45,4233,0,2132,1722,1,320,510,10,15,1,42,31,50,67,23,10,12,1,2,64,157,200,1272,672,480,0,0,0,0,0,0,0,0,7115,4000,7116,3000,528,1000,510,10,0,0,0,0,0,0,0,0,0,0,0,0
+1681,GEMINI,Gemini-S58,Gemini-S58,72,57870,0,22024,9442,1,2150,3030,60,45,1,75,70,77,105,55,10,12,1,0,61,189,200,1272,672,480,0,0,0,0,0,0,0,0,7005,3000,603,1000,7005,3000,546,500,547,400,971,100,972,100,0,0,0,0,0,0
+1682,REMOVAL,Removal,Remover,55,10289,0,3831,1278,1,558,797,5,20,1,20,56,35,57,20,10,12,1,1,49,157,250,1272,672,480,0,0,0,0,0,0,0,0,713,5000,7319,5000,5005,10,549,500,971,50,972,100,5120,10,0,0,0,0,0,0
+1683,POTON_CANON_5,Photon Cannon,Photon Cannon,46,7000,0,2,1,1,560,570,5,10,1,1,1,1,1,1,10,12,1,0,43,669,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1684,G_ARCHDAM,Archdam,Archdam,57,11000,0,0,0,1,600,700,15,15,1,65,35,75,75,15,10,12,2,8,60,157,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1685,APOCALIPS_H,Vesper,Vesper,97,320700,0,200000,100000,2,4000,10000,50,54,1,50,60,70,160,150,10,12,2,2,46,165,200,1564,864,576,50000,5000,617,5500,603,5000,732,2000,7095,5000,7094,3000,617,1000,617,1000,2659,100,2660,100,2661,100,2662,100,0,0,0,0
+1686,ORC_BABY,Orc Baby,Orc Baby,21,912,0,220,220,1,135,270,10,10,1,15,10,18,35,2,10,12,1,7,42,653,200,2000,1000,500,0,0,0,0,0,0,0,0,7126,3500,519,400,627,20,10015,25,5110,1,0,0,0,0,0,0,0,0,0,0
+1687,GREEN_IGUANA,Green Iguana,Green Iguana,54,6444,0,2400,2050,1,550,650,0,10,5,52,64,5,98,14,10,12,1,2,22,129,200,2000,1000,500,0,0,0,0,0,0,0,0,521,750,520,1500,903,7000,528,120,606,30,511,2000,511,100,511,10,0,0,0,0
+1688,LADY_TANEE,Lady Tanee,Lady Tany,89,493000,0,64995,42222,9,450,2170,20,44,1,125,48,78,210,38,10,12,0,3,62,676,75,1564,864,576,2500,4000,617,750,753,2500,732,3000,513,7000,634,3000,12127,1500,607,2800,985,2500,5116,350,1716,250,0,0,0,0,0,0
+1689,G_BACSOJIN,Bacsojin,White Lady,72,56380,0,5590,1659,1,560,1446,10,51,1,85,78,85,150,60,10,12,2,7,44,1973,200,1152,1152,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1690,G_SPRING_RABBIT,Spring Rabbit,Spring Rabbit,58,9045,0,0,0,1,585,813,29,21,45,61,5,15,77,90,10,12,1,2,42,131,160,1120,552,511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1691,G_KRABEN,Kraben,Kraben,50,5880,0,0,0,1,125,765,1,66,1,40,40,40,40,30,10,12,1,0,48,645,75,1872,672,480,0,0,0,0,0,0,0,0,703,75,521,1500,519,5000,912,5000,5062,1000,2102,15,603,5,0,0,0,0,4295,1
+
+// Thanatos Tower & Abyss
+1692,BREEZE,Breeze,Breeze,56,5099,0,2390,1340,1,294,715,7,32,1,92,6,38,91,45,10,12,1,0,64,141,150,396,384,240,0,0,0,0,0,0,0,0,2270,30,2269,2,945,7000,511,2500,706,8,996,50,604,110,0,0,0,0,0,0
+1693,PLASMA_Y,Plasma,Plasma,56,8400,0,2200,2100,3,400,900,0,40,1,30,10,83,105,45,10,12,0,0,88,141,100,1458,1440,480,0,0,0,0,0,0,0,0,911,6000,644,10,732,12,715,250,969,1,0,0,0,0,0,0,0,0,0,0
+1694,PLASMA_R,Plasma,Plasma,43,5700,0,2000,1000,3,300,700,0,30,1,30,5,56,90,30,10,12,0,0,83,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,4800,644,4,732,5,716,250,990,140,0,0,0,0,0,0,0,0,0,0
+1695,PLASMA_G,Plasma,Plasma,47,7600,0,2000,1000,3,300,700,0,30,1,30,5,61,90,30,10,12,0,0,82,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,5500,644,5,732,7,717,250,993,160,0,0,0,0,0,0,0,0,0,0
+1696,PLASMA_P,Plasma,Plasma,49,5900,0,2000,1000,3,300,700,0,30,1,30,5,54,90,30,10,12,0,0,87,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,5000,644,6,732,9,716,250,724,7,0,0,0,0,0,0,0,0,0,0
+1697,PLASMA_B,Plasma,Plasma,44,8200,0,2000,1000,3,300,700,0,30,1,30,5,73,90,30,10,12,0,0,81,141,150,1458,1440,480,0,0,0,0,0,0,0,0,911,6000,644,8,732,10,717,250,991,180,0,0,0,0,0,0,0,0,0,0
+1698,DEATHWORD,Deathword,Deathword,65,18990,0,2986,4912,1,622,1102,10,40,1,75,10,20,140,45,10,12,1,0,80,653,150,864,500,192,0,0,0,0,0,0,0,0,7479,8,7480,4,7478,12,1097,800,7449,4500,7015,1200,618,500,0,0,0,0,0,0
+1699,ANCIENT_MIMIC,Ancient Mimic,Ancient Mimic,60,8080,0,2950,2650,1,530,1697,20,40,1,100,30,40,150,110,10,12,1,0,80,653,100,972,500,288,0,0,0,0,0,0,0,0,603,30,644,50,617,10,2402,50,2404,20,2502,40,2506,8,2610,50,0,0,0,0
+1700,OBSERVATION,Observation,Observation,81,65111,0,39872,33120,1,1666,2609,55,55,1,72,56,126,145,114,10,12,1,8,66,653,150,800,672,480,0,0,0,0,0,0,0,0,7441,4500,2621,2,721,50,7224,10,603,20,7435,800,7442,2500,0,0,0,0,0,0
+1701,SHELTER,Shelter,Shelter,80,38000,0,29010,25110,1,1871,1971,22,63,1,67,34,167,157,120,10,12,1,8,86,653,150,800,672,480,0,0,0,0,0,0,0,0,7440,4000,7104,3000,7224,12,722,35,7442,1200,603,18,7005,1000,0,0,0,0,0,0
+1702,RETRIBUTION,Retribution,Retribution,79,46666,0,28332,33120,1,2022,2288,35,35,1,142,66,72,133,39,10,12,1,8,87,653,150,800,672,480,0,0,0,0,0,0,0,0,7440,6000,7442,3000,7224,25,723,40,2506,20,1158,4,603,28,2621,3,0,0,0,0
+1703,SOLACE,Solace,Solace,77,25252,0,21000,25110,1,1392,1462,21,67,1,76,29,145,99,100,10,12,1,8,86,653,150,800,672,480,0,0,0,0,0,0,0,0,7441,5500,7442,2800,2621,1,7224,30,718,45,1910,5,1909,30,603,32,0,0,0,0
+1704,THANA_ODIUM,Thanatos Odium,Thanatos Odium,92,72389,0,86420,63880,1,2100,2800,68,30,1,52,165,62,185,90,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,250,732,200,7438,500,616,10,0,0,0,0,0,0,0,0,0,0
+1705,THANA_DESPERO,Thanatos Despero,Thanatos Despero,88,86666,0,62001,51220,1,2182,3082,38,39,1,167,79,92,151,120,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,280,732,170,7439,500,616,8,0,0,0,0,0,0,0,0,0,0
+1706,THANA_MAERO,Thanatos Maero,Thanatos Maero,83,62000,0,56699,63880,1,2022,2288,29,72,1,176,30,200,122,29,10,12,1,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,320,732,130,7437,500,616,7,0,0,0,0,0,0,0,0,0,0
+1707,THANA_DOLOR,Thanatos Dolor,Thanatos Dolor,83,59922,0,43200,51220,1,1392,2092,21,80,1,76,29,206,139,44,10,12,0,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,7054,7000,731,300,732,150,7436,500,616,5,0,0,0,0,0,0,0,0,0,0
+1708,THANATOS,Thanatos,Thanatos,99,445660,0,3666000,2145060,1,3812,7483,35,35,1,108,122,86,147,32,10,10,2,6,88,1973,100,700,672,480,1000000,5000,603,5000,732,3000,616,4000,2412,2000,2342,2000,7450,4000,617,4000,12103,1500,7444,6500,732,1000,644,2500,0,0,0,0
+1709,G_THANA_ODIUM,Thanatos Odium,Thanatos Odium,92,72389,0,0,0,1,2100,2800,68,30,1,52,165,62,185,90,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1710,G_THANA_DESPERO,Thanatos Despero,Thanatos Despero,88,86666,0,0,0,1,2182,3082,38,39,1,167,79,92,151,120,10,12,2,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1711,G_THANA_MAERO,Thanatos Maero,Thanatos Maero,83,62000,0,0,0,1,2022,2288,29,72,1,176,30,200,122,29,10,12,1,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1712,G_THANA_DOLOR,Thanatos Dolor,Thanatos Dolor,83,59922,0,0,0,1,1392,2092,21,80,1,76,29,206,139,44,10,12,0,1,88,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1713,ACIDUS,Acidus,Acidus,80,51112,0,28043,8023,1,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,66,653,150,800,672,480,0,0,0,0,0,0,0,0,582,1200,1036,5500,1035,3000,7444,2,715,800,714,25,0,0,0,0,0,0,0,0
+1714,FERUS,Ferus,Ferus,70,29218,0,8093,3952,1,1056,1496,34,45,1,80,100,110,70,70,10,12,2,9,63,653,150,800,672,480,0,0,0,0,0,0,0,0,578,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1715,NOVUS,Novus,Novus,42,5430,0,1320,1002,1,284,384,20,28,1,56,43,45,124,43,10,12,0,9,20,653,150,450,672,480,0,0,0,0,0,0,0,0,1036,5500,511,2000,7053,2500,512,800,0,0,0,0,0,0,0,0,0,0,0,0
+1716,ACIDUS_,Acidus,Acidus,76,39111,0,14392,4203,1,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,61,653,150,800,672,480,0,0,0,0,0,0,0,0,505,400,1036,6000,1035,3200,510,750,717,800,996,120,0,0,0,0,0,0,0,0
+1717,FERUS_,Ferus,Ferus,69,21182,0,6750,2230,1,930,1170,24,38,1,90,100,100,80,70,10,12,2,9,62,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1718,NOVUS_,Novus,Novus,43,5830,0,1411,1100,1,314,414,24,28,1,60,43,39,119,43,10,12,0,9,20,653,150,450,672,480,0,0,0,0,0,0,0,0,1036,6000,508,1200,7053,2200,512,600,0,0,0,0,0,0,0,0,0,0,0,0
+1719,DETALE,Detale,Detale,90,480000,0,291850,123304,1,4560,5548,66,59,1,90,112,136,140,56,10,12,2,9,87,1973,150,750,672,480,50000,7000,617,3000,969,2500,732,5000,7444,1500,7451,4500,12080,2000,1417,3,2231,300,617,800,0,0,0,0,0,0,0,0
+1720,HYDRO,Hydro,Hydro,89,308230,0,83450,2480,1,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,67,653,150,800,672,480,0,5000,603,5000,617,1500,607,2000,7443,4500,7123,3000,1035,1000,7444,60,12085,300,1166,4,12040,80,0,0,0,0,0,0
+1721,DRAGON_EGG,Dragon Egg,Dragon Egg,43,18322,0,6740,0,1,1,2,78,60,1,1,56,67,1,63,10,12,1,9,40,0,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1722,G_JAKK_,Jakk,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,2181,200,1180,480,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1723,G_SHECIL_,Shecil Damon,Cecil Damon,82,58900,0,0,0,9,1226,1854,25,15,1,145,27,49,134,80,10,12,1,7,64,1693,120,500,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1724,G_POTON_CANON,Photon Cannon,Photon Cannon,66,8000,0,0,0,7,800,900,10,10,1,40,25,20,60,30,10,12,1,0,40,157,200,1272,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1725,G_PORING,Poring,Poring,1,50,0,0,0,1,7,10,0,5,1,1,1,1,6,30,10,12,1,3,21,131,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1726,G_LUNATIC_,Lunatic,Lunatic,3,60,0,0,0,1,9,12,0,20,1,3,3,10,8,60,10,12,0,2,60,129,200,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1727,G_SAVAGE_BABE,Savage Babe,Savage Babe,7,182,0,0,0,1,20,25,0,0,1,7,14,5,12,35,10,12,0,2,22,129,400,1624,624,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1728,G_DESERT_WOLF_B,Desert Wolf Baby,Baby Desert Wolf,9,164,0,0,0,1,30,36,0,0,1,9,9,5,21,40,10,12,0,2,23,137,300,1600,900,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1729,G_BAPHOMET__,Baphomet Jr.,Baphomet Jr.,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,2181,100,868,480,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1730,G_DEVIRUCHI_,Deviruchi,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,2181,150,980,600,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1731,G_DOPPELGANGER,Doppelganger,Doppelganger,72,249000,0,0,0,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,1205,100,480,480,288,0,0,0,0,0,0,0,0,7484,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1732,G_TREASURE_BOX,Treasure Chest,Treasure Chest,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,1,1,1,1,0,0,0,0,0,0,0,0,7486,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+// Kiel Dungeon monsters (stats are done - Vicious, drops and skills are done as well - MoM. I still don't know what "Scrap Fragment" and "Hard Iron Piece" are though)
+1733,KIEL,Kiel,Kiel,90,523000,0,36500,23405,1,1682,3311,28,32,1,112,76,89,156,102,10,12,1,0,47,131,200,672,672,480,0,5000,603,6000,617,3000,617,1500,7513,3500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1734,KIEL_,Kiel D-01,Kiel D-01,90,1523000,0,2356200,512602,1,3280,6560,28,32,1,130,140,160,199,180,10,12,1,0,47,1973,200,672,672,480,1,1000,617,5000,7513,1000,0,0,7513,3000,2319,50,1620,50,1242,50,0,0,0,0,0,0,0,0,0,0,0,0
+1735,ALICEL,Alicel,Alicel,75,37520,0,8890,5420,1,1800,2770,30,30,1,58,50,51,92,40,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,999,200,7317,3000,1812,1,985,50,0,0,0,0,0,0,0,0
+1736,ALIOT,Aliot,Aliot,75,48290,0,13020,4006,1,950,2470,35,15,1,32,87,12,68,19,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,999,250,7317,3200,1408,20,985,55,0,0,0,0,0,0,0,0
+1737,ALIZA,Aliza,Aliza,69,19000,0,6583,3400,1,750,1100,8,5,1,72,52,35,110,140,10,12,1,7,60,145,200,672,672,480,0,0,0,0,0,0,0,0,637,20,2407,1,2626,1,7047,2500,12128,5,661,10,2233,1,0,0,0,0,0,0
+1738,CONSTANT,Constant,Constant,55,10000,0,3230,116,1,460,580,12,12,1,28,26,47,66,14,10,12,0,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,7497,0,7507,0,7325,3000,999,120,757,250,0,0,0,0,0,0,0,0,0,0
+1739,G_ALICEL,Alicel,Alicel,75,37520,0,0,0,1,1800,2770,30,30,1,58,50,51,92,40,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1740,G_ALIOT,Aliot,Aliot,75,48290,0,0,0,1,950,2470,35,15,1,32,87,12,68,19,10,12,1,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1741,G_COOKIE_XMAS,Christmas Cookie,Christmas Cookie,28,2090,0,0,0,1,140,170,0,50,1,24,30,53,45,100,10,12,0,7,46,145,400,1248,1248,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1742,G_CARAT,Carat,Carat,51,5200,0,0,0,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,1173,200,1078,768,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1743,G_MYSTCASE,Myst Case,Myst Case,38,3450,0,0,0,1,160,360,5,10,1,50,25,5,48,75,10,12,1,0,60,145,400,1248,1248,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1744,G_WILD_ROSE,Wild Rose,Wild Rose,38,2980,0,0,0,1,315,360,0,15,1,85,15,35,65,80,10,12,0,2,24,131,100,964,864,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1745,G_CONSTANT,Constant,Constant,55,10000,0,0,0,1,460,580,12,12,1,28,26,47,66,14,10,12,0,0,67,653,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1746,G_ALIZA,Aliza,Aliza,69,19000,0,0,0,1,750,1100,8,5,1,72,52,35,110,140,10,12,1,7,60,145,200,672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1747,G_SNAKE,Snake,Boa,15,471,0,0,0,1,46,55,0,0,1,15,15,10,35,5,10,12,1,2,22,129,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1748,G_ANACONDAQ,Anacondaq,Anacondaq,23,1109,0,0,0,1,124,157,0,0,1,23,28,10,36,5,10,12,1,2,25,145,200,1576,576,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1749,G_MEDUSA,Medusa,Medusa,79,22408,0,0,0,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,1173,180,2000,1000,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1750,G_RED_PLANT,Red Plant,Red Plant,1,10,0,0,0,1,1,2,100,99,1,1,1,1,1,1,7,12,0,3,22,64,2000,1,1,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
+
+// Odin monsters (stats are done - Vicious, no drops/skills yet)
+1751,RANDGRIS,Valkyrie Randgris,Valkyrie Randgris,99,3567200,0,2854900,3114520,1,5560,8980,25,42,1,120,80,120,220,210,10,12,2,8,86,161,150,584,576,480,0,5000,603,6000,617,3000,617,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1752,SKOGUL,Skogul,Skogul,70,87544,0,27620,10,1,1110,1930,20,15,1,69,70,50,112,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1753,FRUS,Frus,Frus,69,83422,0,20620,10,1,1110,1780,20,15,1,69,60,50,123,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1754,SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,91100,10,1,2010,2630,12,24,1,100,50,72,106,50,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1755,SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,99200,10,1,2510,2960,15,24,1,120,60,85,119,80,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1756,G_HYDRO,Hydro,Hydro,89,308230,0,0,0,1,2554,3910,52,62,1,96,110,86,94,32,10,12,2,9,67,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1757,G_ACIDUS,Acidus,Acidus,80,51112,0,0,0,1,1289,2109,39,69,1,71,55,135,103,69,10,12,2,9,66,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1758,G_FERUS,Ferus,Ferus,70,29218,0,0,0,1,1056,1496,34,45,1,80,100,110,70,70,10,12,2,9,63,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1759,G_ACIDUS_,Acidus,Acidus,76,39111,0,0,0,1,1180,2000,31,47,1,78,31,93,88,52,10,12,2,9,61,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1760,G_FERUS_,Ferus,Ferus,69,21182,0,0,0,1,930,1170,24,38,1,90,100,100,80,70,10,12,2,9,62,653,150,800,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1761,G_SKOGUL,Skogul,Skogul,70,87544,0,0,0,1,1110,1930,20,15,1,69,70,50,112,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1762,G_FRUS,Frus,Frus,69,83422,0,0,0,1,1110,1780,20,15,1,69,60,50,123,52,10,12,1,6,48,129,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1763,G_SKEGGIOLD,Skeggiold,Skeggiold,81,295200,0,0,0,1,2010,2630,12,24,1,100,50,72,106,50,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1764,G_SKEGGIOLD_,Skeggiold,Skeggiold,83,315200,0,0,0,1,2510,2960,15,24,1,120,60,85,119,80,10,12,0,8,66,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1765,G_RANDGRIS,Valkyrie,Valkyrie,99,1567200,0,10000,10000,1,5560,9980,25,42,1,120,80,120,220,210,10,12,2,8,86,161,150,584,576,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1766,EM_ANGELING,Angeling,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,1205,200,1272,672,672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1767,EM_DEVILING,Deviling,Deviling,31,64500,0,211,412,1,135,270,5,70,1,50,20,75,77,200,10,12,1,6,87,1205,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+
+//Homunculi (Don't uncomment) (Why? :P [Poki#3])
+//6001,LIF,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6002,AMISTR,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6003,FILIR,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6004,VANILMIRTH,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6005,LIF2,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6006,AMISTR2,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6007,FILIR2,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6008,VANILMIRTH2,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6009,LIF_H,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6010,AMISTR_H,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6011,FILIR_H,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6012,VANILMIRTH_H,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6013,LIF_H2,Lif,Lif,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6014,AMISTR_H2,Amistr,Amistr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6015,FILIR_H2,Filir,Filir,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+//6016,VANILMIRTH_H2,Vanilmirth,Vanilmirth,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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/mob_poring.txt b/db/mob_poring.txt
index a2e77e3d7..00b991052 100644
--- a/db/mob_poring.txt
+++ b/db/mob_poring.txt
@@ -1,17 +1,17 @@
-// Poring Box Summonable Monsters Database
-//
-// Structure of Database:
-// MobID,DummyName,Rate
-
-0,Poring,1002
-1002,Poring,700000
-1062,Santa Poring,200000
-1113,Drops,500000
-1031,Poporing,400000
-1242,Marin,300000
-1613,Metaling,250000
-1090,Mastering,100000
-1120,Ghostring,50000
-1096,Angeling,25000
-1582,Deviling,25000
-1388,Arc Angeling,10000
+// Poring Box Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
+0,Poring,1002
+1002,Poring,700000
+1062,Santa Poring,200000
+1113,Drops,500000
+1031,Poporing,400000
+1242,Marin,300000
+1613,Metaling,250000
+1090,Mastering,100000
+1120,Ghostring,50000
+1096,Angeling,25000
+1582,Deviling,25000
+1388,Arc Angeling,10000
diff --git a/db/mob_race2_db.txt b/db/mob_race2_db.txt
index 18b7eec3c..56c8d8126 100644
--- a/db/mob_race2_db.txt
+++ b/db/mob_race2_db.txt
@@ -1,15 +1,15 @@
-// Monster Racial Groups Database
-//
-// Structure of Database:
-// Race2ID,MobID1,MobID2,MobID3,...,MobID9
-
-// Goblins
-1,1122,1123,1124,1125,1126,1227,1245,1258,1280,1308,1392,1534,1535,1536,1537,1538,1557,1577,1607
-// Kobolds
-2,1133,1134,1135,1136,1137,1226,1282,1455,1545,1546,1547
-// Orcs
-3,1023,1152,1153,1177,1189,1213,1222,1223,1235,1273,1439,1452,1462,1463,1473,1588,1686
-// Golems
-4,1040,1278,1366,1497,1540,1549
-// Guardians
+// Monster Racial Groups Database
+//
+// Structure of Database:
+// Race2ID,MobID1,MobID2,MobID3,...,MobID9
+
+// Goblins
+1,1122,1123,1124,1125,1126,1227,1245,1258,1280,1308,1392,1534,1535,1536,1537,1538,1557,1577,1607
+// Kobolds
+2,1133,1134,1135,1136,1137,1226,1282,1455,1545,1546,1547
+// Orcs
+3,1023,1152,1153,1177,1189,1213,1222,1223,1235,1273,1439,1452,1462,1463,1473,1588,1686
+// Golems
+4,1040,1278,1366,1497,1540,1549
+// Guardians
5,1285,1286,1287 \ No newline at end of file
diff --git a/db/mob_skill_db2.txt b/db/mob_skill_db2.txt
index 8611d4810..51532c4cb 100644
--- a/db/mob_skill_db2.txt
+++ b/db/mob_skill_db2.txt
@@ -1,242 +1,242 @@
-// Custom mob skills
-//MOB_ID, a unused dummy character sequence (for information only), STATE, SKILL_ID, SKILL_LV,
-// rate (10000 = 100%), casttime, delay, cancelable, a target, a condition type, a condition value,
-// a value 1, a value 2, a value 3, a value 4, a value 5, emotion
-//Example
-//1001,Poring@TF_POISON,attack,52,3,100,1500,10000,no,target,always,0,,,,,7
-//
-//rate refers to the chance of the skill being casted when the condition is fulfilled.
-//delay is the time in milliseconds that has to be pass before recasting the same skill.
-//
-//STATE:
-// any / 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)
-//
-//target: The target of the skill can be: target (when a PC is targetted) / self / friend / master
-// (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 (11x11 area around self)
-//
-//conditions: (condition type) (value which specifies a condition value)
-// always uncondtional
-// myhpltmaxrate when the mob's hp drops to a certain %
-// mystatuson If the mob has any abnormalities in status (condition value),
-// mystatusoff If the mob has ended any abnormalities in status (condition value),
-// friendhpltmaxrate when the mobs' friend's hp drops to a certain %
-// friendstatuson If the friend has any abnormalities in status (condition value),
-// friendstatusoff If the friend has ended any abnormalities in status (condition value),
-// attackpcgt Attack PC becomes more than the number of specification
-// attackpcge Attack PC becomes equal or more than the number of specification.
-// slavelt when the number of slaves is lower than the original number of specification.
-// slavele when the number of slaves is lower or equal than the original number of specification.
-// closedattacked when melee attacked (close range attack)
-// longrangeattacked when long ranged attacked (like bows and far range weapons)
-// skillused when a skill is used on the mob
-// afterskill after the mob used certain skill.
-// casttargeted when a target is in cast range.
-// rudeattacked when a target is rude attacked
-//
-// The character's state which can be specified to be a condition value by the statuson/statusoff system
-// anybad any type of state change
-// stone condition of being in stone state
-// freeze condition of being in frozen state
-// stan condition of being in stunned state
-// sleep condition of being in sleep state
-// poison condition of being in poisoned state
-// curse condition of being in cursed state
-// silence condition of being in silenced state
-// confusion condition of being in confusion state
-// blind condition of being in blind state
-// hiding condition of being in hidden state
-// sight condition of being in unhidden state
-
-// eAthena Dev Team
-1900,Valaris@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-1900,Valaris@AL_TELEPORT,walk,26,1,500,0,5000,yes,self,rudeattacked,,,,,,,
-1900,Valaris@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29
-1900,Valaris@MO_BODYRELOCATION,chase,264,1,200,200,1000,yes,target,always,0,,,,,,
-1900,Valaris@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,
-1900,Valaris@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,target,always,0,,,,,,
-1900,Valaris@NPC_CALLSLAVE,idle,352,1,10000,0,30000,yes,self,always,0,,,,,,
-1900,Valaris@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29
-1900,Valaris@NPC_DARKSTRIKE,chase,340,10,200,0,1000,yes,target,always,0,,,,,,
-1900,Valaris@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,
-1900,Valaris@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6
-1900,Valaris@NPC_SUMMONSLAVE,attack,196,6,10000,700,10000,no,self,slavele,3,1902,,,,,
-1900,Valaris@NPC_SUMMONSLAVE,idle,196,6,10000,700,10000,no,self,slavele,3,1902,,,,,
-1900,Valaris@WZ_VERMILION,attack,85,10,2000,500,2000,no,target,always,0,,,,,,29
-1900,Valaris@WZ_VERMILION,chase,85,10,200,500,2000,no,target,always,0,,,,,,29
-1900,Valaris@WZ_VERMILION,chase,85,10,500,500,2000,no,target,skillused,18,,,,,,29
-1901,Valaris's Worshipper@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-1901,Valaris's Worshipper@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
-1901,Valaris's Worshipper@NPC_DARKNESSATTACK,attack,190,2,500,500,5000,no,target,always,0,,,,,,6
-1901,Valaris's Worshipper@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1901,Valaris's Worshipper@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,1173,,,,
-1901,Valaris's Worshipper@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1901,Valaris's Worshipper@NPC_HALLUCINATION,attack,207,1,500,500,5000,yes,target,always,0,,,,,,29
-1901,Valaris's Worshipper@NPC_HALLUCINATION,chase,207,1,50,500,5000,yes,target,always,0,,,,,,29
-1901,Valaris's Worshipper@SA_DISPELL,attack,289,1,0,0,30000,yes,target,always,0,,,,,,29
-1902,MC Cameri@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-1902,MC Cameri@AL_TELEPORT,walk,26,1,500,0,5000,yes,self,rudeattacked,,,,,,,
-1902,MC Cameri@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29
-1902,MC Cameri@MO_BODYRELOCATION,chase,264,1,200,200,1000,yes,target,always,0,,,,,,
-1902,MC Cameri@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,
-1902,MC Cameri@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29
-1902,MC Cameri@NPC_DARKSTRIKE,chase,340,10,200,0,1000,yes,target,always,0,,,,,,
-1902,MC Cameri@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,
-1902,MC Cameri@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6
-1902,MC Cameri@WZ_VERMILION,attack,85,10,2000,500,2000,no,target,always,0,,,,,,29
-1902,MC Cameri@WZ_VERMILION,chase,85,10,200,500,2000,no,target,always,0,,,,,,29
-1902,MC Cameri@WZ_VERMILION,chase,85,10,500,500,2000,no,target,skillused,18,,,,,,29
-1903,Poki#3@AC_DOUBLE,attack,46,10,500,1000,5000,no,target,always,0,,,,,,
-1903,Poki#3@AC_SHOWER,attack,47,8,2000,1000,5000,no,target,attackpcgt,2,,,,,,
-1903,Poki#3@BS_MAXIMIZE,chase,114,5,500,1000,5000,no,self,always,0,,,,,,
-1903,Poki#3@BS_MAXIMIZE,attack,114,5,500,1000,5000,no,self,always,0,,,,,,
-1903,Poki#3@NPC_AGIUP,chase,350,5,2500,0,5000,no,self,always,0,,,,,,
-1903,Poki#3@NPC_POWERUP,attack,349,5,500,0,30000,yes,self,myhpltmaxrate,30,,,,,,
-1903,Poki#3@SN_SHARPSHOOTING,attack,382,5,500,1000,5000,no,target,always,0,,,,,,
-1903,Poki#3@HT_SKIDTRAP,idle,115,5,50,0,5000,yes,self,always,0,,,,,,29
-1903,Poki#3@HT_FREEZINGTRAP,idle,120,5,50,0,300000,yes,self,always,0,,,,,,
-1903,Poki#3@HT_FREEZINGTRAP,idle,121,5,50,0,300000,yes,self,always,0,,,,,,
-1903,Poki#3@AC_CHARGEARROW,attack,148,1,500,0,5000,yes,target,always,0,,,,,,
-1903,Poki#3@HT_FLASHER,idle,120,5,50,0,300000,yes,self,always,0,,,,,,
-1903,Poki#3@NPC_SUMMONSLAVE,idle,196,5,10000,2000,120000,no,self,slavele,1,1659,1660,1661,1662,1663,0
-1903,Poki#3@NPC_CALLSLAVE,attack,352,1,2000,0,10000,yes,target,always,0,,,,,,
-1903,Poki#3@NPC_CALLSLAVE,idle,352,1,2000,0,10000,yes,self,always,0,,,,,,
-1903,Poki#3@NPC_CHANGEWATER,attack,162,1,10000,2000,600000,no,self,myhpltmaxrate,30,,,,,,
-1903,Poki#3@NPC_CHANGETELEKINESIS,attack,169,1,500,2000,5000,no,self,myhpltmaxrate,10,,,,,,7
-1903,Poki#3@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-
-// Easter Bunny (not in the db?? it's in db2!)
-1921,Easter Bunny@NPC_SUMMONSLAVE,attack,196,5,10000,3000,10000,no,self,slavele,2,1063,,,,,
-1921,Easter Bunny@NPC_SUMMONSLAVE,idle,196,5,5000,2000,40000,no,self,always,2,1920,,,,,
-
-// eAthena's Custom Equipped Mobs
-1970,Poring@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
-1970,Poring@NPC_WATERATTACK,attack,184,1,2000,0,5000,yes,target,always,0,,,,,,
-1971,ChonChon@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
-1972,Spore@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,,,,,
-1972,Spore@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
-1972,Spore@NPC_SLEEPATTACK,attack,182,1,500,0,5000,yes,target,always,0,,,,,,
-1972,Spore@NPC_WATERATTACK,attack,184,1,2000,0,5000,yes,target,always,0,,,,,,
-1973,PecoPeco@AS_SONICBLOW,attack,136,5,500,800,5000,no,target,always,0,,,,,,6
-1973,PecoPeco@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,6,,,,,
-1973,PecoPeco@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
-1973,PecoPeco@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
-1974,Orc Warrior@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1974,Orc Warrior@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,,,,,,
-1974,Orc Warrior@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1974,Orc Warrior@NPC_EMOTION,follow,197,1,200,0,5000,yes,self,always,0,27,,,,,
-1974,Orc Warrior@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,32,2181,,,,
-1974,Orc Warrior@NPC_GROUNDATTACK,angry,185,2,500,500,5000,no,target,always,0,,,,,,6
-1974,Orc Warrior@NPC_GROUNDATTACK,attack,185,2,500,500,5000,no,target,always,0,,,,,,6
-1974,Orc Warrior@NPC_SMOKING,idle,195,1,50,0,36000000,yes,self,always,0,,,,,,9
-1975,Munak@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1975,Munak@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1975,Munak@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,2181,,,,
-1975,Munak@NPC_STUNATTACK,angry,179,2,500,1500,5000,no,target,always,0,,,,,,6
-1975,Munak@NPC_STUNATTACK,attack,179,2,500,1500,5000,no,target,always,0,,,,,,6
-1976,Isis@NPC_CRITICALSLASH,attack,170,1,500,500,5000,no,target,always,0,,,,,,6
-1976,Isis@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
-1976,Isis@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1976,Isis@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,149,,,,
-1977,Poporing@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
-1977,Poporing@NPC_POISON,attack,176,2,500,800,5000,no,target,always,0,,,,,,
-1977,Poporing@NPC_POISONATTACK,attack,188,1,2000,0,5000,yes,target,always,0,,,,,,
-1978,Hunter Fly@AL_TELEPORT,idle,26,1,50,0,5000,yes,self,always,0,,,,,,
-1978,Hunter Fly@NPC_BLOODDRAIN,angry,199,1,500,0,5000,yes,target,always,0,,,,,,2
-1978,Hunter Fly@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,2
-1978,Hunter Fly@NPC_COMBOATTACK,angry,171,1,500,700,5000,no,target,always,0,,,,,,6
-1978,Hunter Fly@NPC_COMBOATTACK,attack,171,1,500,700,5000,no,target,always,0,,,,,,6
-1978,Hunter Fly@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1978,Hunter Fly@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1978,Hunter Fly@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,9,2181,,,,
-1978,Hunter Fly@NPC_WINDATTACK,angry,187,1,2000,0,5000,yes,target,always,0,,,,,,
-1978,Hunter Fly@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
-1979,Steel ChonChon@NPC_SILENCEATTACK,attack,178,2,500,700,5000,no,target,always,0,,,,,,
-1979,Steel ChonChon@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
-1980,Picky@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1980,Picky@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
-1981,Rocker@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1981,Rocker@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
-1982,Smokie@AL_HEAL,idle,28,5,10000,0,5000,yes,self,mystatuson,hiding,,,,,,2
-1982,Smokie@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
-1982,Smokie@NPC_GROUNDATTACK,attack,185,2,500,500,5000,no,target,always,0,,,,,,6
-1982,Smokie@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
-1982,Smokie@TF_HIDING,attack,51,1,500,500,5000,no,self,myhpltmaxrate,50,,,,,,19
-1983,Yoyo@AM_POTIONPITCHER,idle,231,1,50,1500,5000,yes,self,always,0,,,,,,
-1983,Yoyo@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
-1983,Yoyo@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
-1983,Yoyo@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
-1983,Yoyo@SM_PROVOKE,chase,6,10,50,600,5000,yes,target,always,0,,,,,,
-1983,Yoyo@TF_THROWSTONE,chase,152,1,200,0,5000,yes,target,always,0,,,,,,6
-1984,Lunatic@AL_HEAL,idle,28,1,10,2000,60000,yes,self,always,0,,,,,,
-1984,Lunatic@NPC_PROVOCATION,idle,194,1,2,0,0,yes,self,always,0,,,,,,
-1985,Poison Spore@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1985,Poison Spore@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1985,Poison Spore@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,2181,,,,
-1985,Poison Spore@NPC_POISON,angry,176,3,500,800,5000,no,target,always,0,,,,,,6
-1985,Poison Spore@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,6
-1985,Poison Spore@NPC_POISONATTACK,angry,188,1,2000,0,5000,yes,target,always,0,,,,,,
-1985,Poison Spore@NPC_POISONATTACK,attack,188,1,2000,0,5000,yes,target,always,0,,,,,,
-1986,Baphomet Jr.@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-1986,Baphomet Jr.@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
-1986,Baphomet Jr.@NPC_DARKNESSATTACK,attack,190,2,500,500,5000,no,target,always,0,,,,,,6
-1986,Baphomet Jr.@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1986,Baphomet Jr.@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,1173,,,,
-1986,Baphomet Jr.@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1986,Baphomet Jr.@NPC_HALLUCINATION,attack,207,1,500,500,5000,yes,target,always,0,,,,,,29
-1986,Baphomet Jr.@NPC_HALLUCINATION,chase,207,1,50,500,5000,yes,target,always,0,,,,,,29
-1986,Baphomet Jr.@SA_DISPELL,attack,289,1,0,0,30000,yes,target,always,0,,,,,,29
-1987,Baby Desert Wolf@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1987,Baby Desert Wolf@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
-1988,Deviruchi@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-1988,Deviruchi@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
-1988,Deviruchi@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
-1988,Deviruchi@NPC_DARKTHUNDER,attack,341,3,500,1500,5000,yes,target,always,0,,,,,,29
-1988,Deviruchi@NPC_DARKTHUNDER,chase,341,3,50,1500,5000,yes,target,always,0,,,,,,29
-1988,Deviruchi@NPC_ENERGYDRAIN,attack,200,1,500,0,5000,yes,target,myhpltmaxrate,30,,,,,,19
-1988,Deviruchi@NPC_ENERGYDRAIN,chase,200,1,50,0,5000,yes,target,myhpltmaxrate,30,,,,,,19
-1989,Dokebi@BS_ADRENALINE,attack,111,1,500,1500,5000,no,self,always,0,,,,,,
-1989,Dokebi@BS_ADRENALINE,chase,111,1,50,1500,5000,no,self,always,0,,,,,,6
-1989,Dokebi@MC_MAMMONITE,attack,42,5,500,800,5000,no,target,always,0,,,,,,8
-1989,Dokebi@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
-1989,Dokebi@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1990,Drops@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
-1990,Drops@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
-1991,Petit@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
-1991,Petit@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,7,149,,,,
-1991,Petit@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
-1991,Petit@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6
-1991,Petit@NPC_TELEKINESISATTACK,chase,191,5,50,0,5000,yes,target,always,0,,,,,,
-1992,Savage Babe@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,19,,,,,
-1992,Savage Babe@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
-1993,Sohee@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,28,,,,,
-1993,Sohee@NPC_STOP,attack,342,1,500,0,30000,yes,target,always,0,,,,,,9
-1993,Sohee@NPC_SUICIDE,attack,175,1,500,0,5000,yes,target,myhpltmaxrate,80,,,,,,
-1993,Sohee@NPC_WATERATTACK,attack,184,3,500,500,5000,no,target,always,0,,,,,,6
-1994,Bon Gun@KN_SPEARSTAB,attack,58,5,500,800,5000,no,target,always,0,,,,,,
-1994,Bon Gun@NPC_STUNATTACK,attack,179,3,500,1500,5000,no,target,always,0,,,,,,0
-
-
-//Custom Fire Poring. Warning, Colides with META_DENIRO
-//1239,Fire Poring@AL_HEAL,idle,28,10,10000,0,2000,yes,self,always,0,,,,,,4
-//1239,Fire Poring@AL_HEAL,walk,28,10,10000,0,2000,yes,self,always,0,,,,,,4
-//1239,Fire Poring@AL_TELEPORT,attack,26,1,1000,5000,60000,no,self,myhpltmaxrate,30,,,,,,
-//1239,Fire Poring@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
-//1239,Fire Poring@NPC_DARKBLESSING,attack,203,1,1000,2000,5000,no,target,always,0,,,,,,18
-//1239,Fire Poring@NPC_SUMMONSLAVE,attack,196,16,10000,2000,10000,no,self,slavele,3,1491,1431,1433,,,18
-//1239,Fire Poring@NPC_SUMMONSLAVE,idle,196,16,10000,2000,10000,no,self,slavele,3,1491,1431,1433,,,18
-//1239,Fire Poring@RG_INTIMIDATE,attack,219,5,1000,0,3000,yes,target,always,0,,,,,,
-//1239,Fire Poring@RG_STRIPARMOR,attack,217,5,2000,0,3000,yes,target,always,0,,,,,,
-//1239,Fire Poring@RG_STRIPHELM,attack,218,5,2000,0,3000,yes,target,always,0,,,,,,
-//1239,Fire Poring@RG_STRIPSHIELD,attack,216,5,2000,0,3000,yes,target,always,0,,,,,,
-//1239,Fire Poring@RG_STRIPWEAPON,attack,215,5,2000,0,3000,yes,target,always,0,,,,,,
-
+// Custom mob skills
+//MOB_ID, a unused dummy character sequence (for information only), STATE, SKILL_ID, SKILL_LV,
+// rate (10000 = 100%), casttime, delay, cancelable, a target, a condition type, a condition value,
+// a value 1, a value 2, a value 3, a value 4, a value 5, emotion
+//Example
+//1001,Poring@TF_POISON,attack,52,3,100,1500,10000,no,target,always,0,,,,,7
+//
+//rate refers to the chance of the skill being casted when the condition is fulfilled.
+//delay is the time in milliseconds that has to be pass before recasting the same skill.
+//
+//STATE:
+// any / 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)
+//
+//target: The target of the skill can be: target (when a PC is targetted) / self / friend / master
+// (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 (11x11 area around self)
+//
+//conditions: (condition type) (value which specifies a condition value)
+// always uncondtional
+// myhpltmaxrate when the mob's hp drops to a certain %
+// mystatuson If the mob has any abnormalities in status (condition value),
+// mystatusoff If the mob has ended any abnormalities in status (condition value),
+// friendhpltmaxrate when the mobs' friend's hp drops to a certain %
+// friendstatuson If the friend has any abnormalities in status (condition value),
+// friendstatusoff If the friend has ended any abnormalities in status (condition value),
+// attackpcgt Attack PC becomes more than the number of specification
+// attackpcge Attack PC becomes equal or more than the number of specification.
+// slavelt when the number of slaves is lower than the original number of specification.
+// slavele when the number of slaves is lower or equal than the original number of specification.
+// closedattacked when melee attacked (close range attack)
+// longrangeattacked when long ranged attacked (like bows and far range weapons)
+// skillused when a skill is used on the mob
+// afterskill after the mob used certain skill.
+// casttargeted when a target is in cast range.
+// rudeattacked when a target is rude attacked
+//
+// The character's state which can be specified to be a condition value by the statuson/statusoff system
+// anybad any type of state change
+// stone condition of being in stone state
+// freeze condition of being in frozen state
+// stan condition of being in stunned state
+// sleep condition of being in sleep state
+// poison condition of being in poisoned state
+// curse condition of being in cursed state
+// silence condition of being in silenced state
+// confusion condition of being in confusion state
+// blind condition of being in blind state
+// hiding condition of being in hidden state
+// sight condition of being in unhidden state
+
+// eAthena Dev Team
+1900,Valaris@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+1900,Valaris@AL_TELEPORT,walk,26,1,500,0,5000,yes,self,rudeattacked,,,,,,,
+1900,Valaris@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29
+1900,Valaris@MO_BODYRELOCATION,chase,264,1,200,200,1000,yes,target,always,0,,,,,,
+1900,Valaris@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,
+1900,Valaris@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,target,always,0,,,,,,
+1900,Valaris@NPC_CALLSLAVE,idle,352,1,10000,0,30000,yes,self,always,0,,,,,,
+1900,Valaris@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29
+1900,Valaris@NPC_DARKSTRIKE,chase,340,10,200,0,1000,yes,target,always,0,,,,,,
+1900,Valaris@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,
+1900,Valaris@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6
+1900,Valaris@NPC_SUMMONSLAVE,attack,196,6,10000,700,10000,no,self,slavele,3,1902,,,,,
+1900,Valaris@NPC_SUMMONSLAVE,idle,196,6,10000,700,10000,no,self,slavele,3,1902,,,,,
+1900,Valaris@WZ_VERMILION,attack,85,10,2000,500,2000,no,target,always,0,,,,,,29
+1900,Valaris@WZ_VERMILION,chase,85,10,200,500,2000,no,target,always,0,,,,,,29
+1900,Valaris@WZ_VERMILION,chase,85,10,500,500,2000,no,target,skillused,18,,,,,,29
+1901,Valaris's Worshipper@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+1901,Valaris's Worshipper@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
+1901,Valaris's Worshipper@NPC_DARKNESSATTACK,attack,190,2,500,500,5000,no,target,always,0,,,,,,6
+1901,Valaris's Worshipper@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1901,Valaris's Worshipper@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,1173,,,,
+1901,Valaris's Worshipper@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1901,Valaris's Worshipper@NPC_HALLUCINATION,attack,207,1,500,500,5000,yes,target,always,0,,,,,,29
+1901,Valaris's Worshipper@NPC_HALLUCINATION,chase,207,1,50,500,5000,yes,target,always,0,,,,,,29
+1901,Valaris's Worshipper@SA_DISPELL,attack,289,1,0,0,30000,yes,target,always,0,,,,,,29
+1902,MC Cameri@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+1902,MC Cameri@AL_TELEPORT,walk,26,1,500,0,5000,yes,self,rudeattacked,,,,,,,
+1902,MC Cameri@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29
+1902,MC Cameri@MO_BODYRELOCATION,chase,264,1,200,200,1000,yes,target,always,0,,,,,,
+1902,MC Cameri@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,
+1902,MC Cameri@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29
+1902,MC Cameri@NPC_DARKSTRIKE,chase,340,10,200,0,1000,yes,target,always,0,,,,,,
+1902,MC Cameri@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,
+1902,MC Cameri@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6
+1902,MC Cameri@WZ_VERMILION,attack,85,10,2000,500,2000,no,target,always,0,,,,,,29
+1902,MC Cameri@WZ_VERMILION,chase,85,10,200,500,2000,no,target,always,0,,,,,,29
+1902,MC Cameri@WZ_VERMILION,chase,85,10,500,500,2000,no,target,skillused,18,,,,,,29
+1903,Poki#3@AC_DOUBLE,attack,46,10,500,1000,5000,no,target,always,0,,,,,,
+1903,Poki#3@AC_SHOWER,attack,47,8,2000,1000,5000,no,target,attackpcgt,2,,,,,,
+1903,Poki#3@BS_MAXIMIZE,chase,114,5,500,1000,5000,no,self,always,0,,,,,,
+1903,Poki#3@BS_MAXIMIZE,attack,114,5,500,1000,5000,no,self,always,0,,,,,,
+1903,Poki#3@NPC_AGIUP,chase,350,5,2500,0,5000,no,self,always,0,,,,,,
+1903,Poki#3@NPC_POWERUP,attack,349,5,500,0,30000,yes,self,myhpltmaxrate,30,,,,,,
+1903,Poki#3@SN_SHARPSHOOTING,attack,382,5,500,1000,5000,no,target,always,0,,,,,,
+1903,Poki#3@HT_SKIDTRAP,idle,115,5,50,0,5000,yes,self,always,0,,,,,,29
+1903,Poki#3@HT_FREEZINGTRAP,idle,120,5,50,0,300000,yes,self,always,0,,,,,,
+1903,Poki#3@HT_FREEZINGTRAP,idle,121,5,50,0,300000,yes,self,always,0,,,,,,
+1903,Poki#3@AC_CHARGEARROW,attack,148,1,500,0,5000,yes,target,always,0,,,,,,
+1903,Poki#3@HT_FLASHER,idle,120,5,50,0,300000,yes,self,always,0,,,,,,
+1903,Poki#3@NPC_SUMMONSLAVE,idle,196,5,10000,2000,120000,no,self,slavele,1,1659,1660,1661,1662,1663,0
+1903,Poki#3@NPC_CALLSLAVE,attack,352,1,2000,0,10000,yes,target,always,0,,,,,,
+1903,Poki#3@NPC_CALLSLAVE,idle,352,1,2000,0,10000,yes,self,always,0,,,,,,
+1903,Poki#3@NPC_CHANGEWATER,attack,162,1,10000,2000,600000,no,self,myhpltmaxrate,30,,,,,,
+1903,Poki#3@NPC_CHANGETELEKINESIS,attack,169,1,500,2000,5000,no,self,myhpltmaxrate,10,,,,,,7
+1903,Poki#3@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+
+// Easter Bunny (not in the db?? it's in db2!)
+1921,Easter Bunny@NPC_SUMMONSLAVE,attack,196,5,10000,3000,10000,no,self,slavele,2,1063,,,,,
+1921,Easter Bunny@NPC_SUMMONSLAVE,idle,196,5,5000,2000,40000,no,self,always,2,1920,,,,,
+
+// eAthena's Custom Equipped Mobs
+1970,Poring@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
+1970,Poring@NPC_WATERATTACK,attack,184,1,2000,0,5000,yes,target,always,0,,,,,,
+1971,ChonChon@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
+1972,Spore@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,,,,,
+1972,Spore@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
+1972,Spore@NPC_SLEEPATTACK,attack,182,1,500,0,5000,yes,target,always,0,,,,,,
+1972,Spore@NPC_WATERATTACK,attack,184,1,2000,0,5000,yes,target,always,0,,,,,,
+1973,PecoPeco@AS_SONICBLOW,attack,136,5,500,800,5000,no,target,always,0,,,,,,6
+1973,PecoPeco@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,6,,,,,
+1973,PecoPeco@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
+1973,PecoPeco@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
+1974,Orc Warrior@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1974,Orc Warrior@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,,,,,,
+1974,Orc Warrior@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1974,Orc Warrior@NPC_EMOTION,follow,197,1,200,0,5000,yes,self,always,0,27,,,,,
+1974,Orc Warrior@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,32,2181,,,,
+1974,Orc Warrior@NPC_GROUNDATTACK,angry,185,2,500,500,5000,no,target,always,0,,,,,,6
+1974,Orc Warrior@NPC_GROUNDATTACK,attack,185,2,500,500,5000,no,target,always,0,,,,,,6
+1974,Orc Warrior@NPC_SMOKING,idle,195,1,50,0,36000000,yes,self,always,0,,,,,,9
+1975,Munak@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1975,Munak@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1975,Munak@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,2181,,,,
+1975,Munak@NPC_STUNATTACK,angry,179,2,500,1500,5000,no,target,always,0,,,,,,6
+1975,Munak@NPC_STUNATTACK,attack,179,2,500,1500,5000,no,target,always,0,,,,,,6
+1976,Isis@NPC_CRITICALSLASH,attack,170,1,500,500,5000,no,target,always,0,,,,,,6
+1976,Isis@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
+1976,Isis@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1976,Isis@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,149,,,,
+1977,Poporing@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
+1977,Poporing@NPC_POISON,attack,176,2,500,800,5000,no,target,always,0,,,,,,
+1977,Poporing@NPC_POISONATTACK,attack,188,1,2000,0,5000,yes,target,always,0,,,,,,
+1978,Hunter Fly@AL_TELEPORT,idle,26,1,50,0,5000,yes,self,always,0,,,,,,
+1978,Hunter Fly@NPC_BLOODDRAIN,angry,199,1,500,0,5000,yes,target,always,0,,,,,,2
+1978,Hunter Fly@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,2
+1978,Hunter Fly@NPC_COMBOATTACK,angry,171,1,500,700,5000,no,target,always,0,,,,,,6
+1978,Hunter Fly@NPC_COMBOATTACK,attack,171,1,500,700,5000,no,target,always,0,,,,,,6
+1978,Hunter Fly@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1978,Hunter Fly@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1978,Hunter Fly@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,9,2181,,,,
+1978,Hunter Fly@NPC_WINDATTACK,angry,187,1,2000,0,5000,yes,target,always,0,,,,,,
+1978,Hunter Fly@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
+1979,Steel ChonChon@NPC_SILENCEATTACK,attack,178,2,500,700,5000,no,target,always,0,,,,,,
+1979,Steel ChonChon@NPC_WINDATTACK,attack,187,1,2000,0,5000,yes,target,always,0,,,,,,
+1980,Picky@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1980,Picky@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
+1981,Rocker@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1981,Rocker@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
+1982,Smokie@AL_HEAL,idle,28,5,10000,0,5000,yes,self,mystatuson,hiding,,,,,,2
+1982,Smokie@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
+1982,Smokie@NPC_GROUNDATTACK,attack,185,2,500,500,5000,no,target,always,0,,,,,,6
+1982,Smokie@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
+1982,Smokie@TF_HIDING,attack,51,1,500,500,5000,no,self,myhpltmaxrate,50,,,,,,19
+1983,Yoyo@AM_POTIONPITCHER,idle,231,1,50,1500,5000,yes,self,always,0,,,,,,
+1983,Yoyo@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
+1983,Yoyo@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
+1983,Yoyo@NPC_PROVOCATION,chase,194,1,20,0,5000,yes,target,always,0,,,,,,19
+1983,Yoyo@SM_PROVOKE,chase,6,10,50,600,5000,yes,target,always,0,,,,,,
+1983,Yoyo@TF_THROWSTONE,chase,152,1,200,0,5000,yes,target,always,0,,,,,,6
+1984,Lunatic@AL_HEAL,idle,28,1,10,2000,60000,yes,self,always,0,,,,,,
+1984,Lunatic@NPC_PROVOCATION,idle,194,1,2,0,0,yes,self,always,0,,,,,,
+1985,Poison Spore@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1985,Poison Spore@NPC_EMOTION,follow,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1985,Poison Spore@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,1,2181,,,,
+1985,Poison Spore@NPC_POISON,angry,176,3,500,800,5000,no,target,always,0,,,,,,6
+1985,Poison Spore@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,6
+1985,Poison Spore@NPC_POISONATTACK,angry,188,1,2000,0,5000,yes,target,always,0,,,,,,
+1985,Poison Spore@NPC_POISONATTACK,attack,188,1,2000,0,5000,yes,target,always,0,,,,,,
+1986,Baphomet Jr.@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+1986,Baphomet Jr.@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
+1986,Baphomet Jr.@NPC_DARKNESSATTACK,attack,190,2,500,500,5000,no,target,always,0,,,,,,6
+1986,Baphomet Jr.@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1986,Baphomet Jr.@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,6,1173,,,,
+1986,Baphomet Jr.@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1986,Baphomet Jr.@NPC_HALLUCINATION,attack,207,1,500,500,5000,yes,target,always,0,,,,,,29
+1986,Baphomet Jr.@NPC_HALLUCINATION,chase,207,1,50,500,5000,yes,target,always,0,,,,,,29
+1986,Baphomet Jr.@SA_DISPELL,attack,289,1,0,0,30000,yes,target,always,0,,,,,,29
+1987,Baby Desert Wolf@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1987,Baby Desert Wolf@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
+1988,Deviruchi@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+1988,Deviruchi@NPC_CURSEATTACK,attack,181,3,500,800,5000,no,target,always,0,,,,,,29
+1988,Deviruchi@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
+1988,Deviruchi@NPC_DARKTHUNDER,attack,341,3,500,1500,5000,yes,target,always,0,,,,,,29
+1988,Deviruchi@NPC_DARKTHUNDER,chase,341,3,50,1500,5000,yes,target,always,0,,,,,,29
+1988,Deviruchi@NPC_ENERGYDRAIN,attack,200,1,500,0,5000,yes,target,myhpltmaxrate,30,,,,,,19
+1988,Deviruchi@NPC_ENERGYDRAIN,chase,200,1,50,0,5000,yes,target,myhpltmaxrate,30,,,,,,19
+1989,Dokebi@BS_ADRENALINE,attack,111,1,500,1500,5000,no,self,always,0,,,,,,
+1989,Dokebi@BS_ADRENALINE,chase,111,1,50,1500,5000,no,self,always,0,,,,,,6
+1989,Dokebi@MC_MAMMONITE,attack,42,5,500,800,5000,no,target,always,0,,,,,,8
+1989,Dokebi@NPC_DARKNESSATTACK,attack,190,1,2000,0,5000,yes,target,always,0,,,,,,
+1989,Dokebi@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1990,Drops@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,2,,,,,
+1990,Drops@NPC_FIREATTACK,attack,186,1,2000,0,5000,yes,target,always,0,,,,,,
+1991,Petit@NPC_EMOTION,chase,197,1,20,0,5000,yes,self,always,0,19,129,,,,
+1991,Petit@NPC_EMOTION,idle,197,1,200,0,5000,yes,self,always,0,7,149,,,,
+1991,Petit@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,2,,,,,
+1991,Petit@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6
+1991,Petit@NPC_TELEKINESISATTACK,chase,191,5,50,0,5000,yes,target,always,0,,,,,,
+1992,Savage Babe@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,19,,,,,
+1992,Savage Babe@NPC_GROUNDATTACK,attack,185,1,2000,0,5000,yes,target,always,0,,,,,,
+1993,Sohee@NPC_EMOTION,walk,197,1,200,0,5000,yes,self,always,0,28,,,,,
+1993,Sohee@NPC_STOP,attack,342,1,500,0,30000,yes,target,always,0,,,,,,9
+1993,Sohee@NPC_SUICIDE,attack,175,1,500,0,5000,yes,target,myhpltmaxrate,80,,,,,,
+1993,Sohee@NPC_WATERATTACK,attack,184,3,500,500,5000,no,target,always,0,,,,,,6
+1994,Bon Gun@KN_SPEARSTAB,attack,58,5,500,800,5000,no,target,always,0,,,,,,
+1994,Bon Gun@NPC_STUNATTACK,attack,179,3,500,1500,5000,no,target,always,0,,,,,,0
+
+
+//Custom Fire Poring. Warning, Colides with META_DENIRO
+//1239,Fire Poring@AL_HEAL,idle,28,10,10000,0,2000,yes,self,always,0,,,,,,4
+//1239,Fire Poring@AL_HEAL,walk,28,10,10000,0,2000,yes,self,always,0,,,,,,4
+//1239,Fire Poring@AL_TELEPORT,attack,26,1,1000,5000,60000,no,self,myhpltmaxrate,30,,,,,,
+//1239,Fire Poring@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,
+//1239,Fire Poring@NPC_DARKBLESSING,attack,203,1,1000,2000,5000,no,target,always,0,,,,,,18
+//1239,Fire Poring@NPC_SUMMONSLAVE,attack,196,16,10000,2000,10000,no,self,slavele,3,1491,1431,1433,,,18
+//1239,Fire Poring@NPC_SUMMONSLAVE,idle,196,16,10000,2000,10000,no,self,slavele,3,1491,1431,1433,,,18
+//1239,Fire Poring@RG_INTIMIDATE,attack,219,5,1000,0,3000,yes,target,always,0,,,,,,
+//1239,Fire Poring@RG_STRIPARMOR,attack,217,5,2000,0,3000,yes,target,always,0,,,,,,
+//1239,Fire Poring@RG_STRIPHELM,attack,218,5,2000,0,3000,yes,target,always,0,,,,,,
+//1239,Fire Poring@RG_STRIPSHIELD,attack,216,5,2000,0,3000,yes,target,always,0,,,,,,
+//1239,Fire Poring@RG_STRIPWEAPON,attack,215,5,2000,0,3000,yes,target,always,0,,,,,,
+
// Here you can place your custom mob skills \ No newline at end of file
diff --git a/db/packet_db.txt b/db/packet_db.txt
index 29b9c0774..45684f9b6 100644
--- a/db/packet_db.txt
+++ b/db/packet_db.txt
@@ -1,821 +1,821 @@
-// The packet database allows you to add support for new clients,
-// because packets change every release.
-// Note: Every packet version needs a wanttoconnection specification, since
-// that is the packet used to identify a client's version, if multiple versions
-// have the same connection packet, the higher version will be used (unless
-// the lower one is specified as the default)
-
-// Main packet version of the DB to use (default = max available version)
-// Client detection is faster when all clients use the specified here version.
-packet_db_ver: default
-
-packet_ver: 5
-0x0064,55
-0x0065,17
-0x0066,3
-0x0067,37
-0x0068,46
-0x0069,-1
-0x006a,23
-0x006b,-1
-0x006c,3
-0x006d,108
-0x006e,3
-0x006f,2
-0x0070,3
-0x0071,28
-0x0072,19,wanttoconnection,2:6:10:14:18
-0x0073,11
-0x0074,3
-0x0075,-1
-0x0076,9
-0x0077,5
-0x0078,54
-0x0079,53
-0x007a,58
-0x007b,60
-0x007c,41
-0x007d,2,loadendack,0
-0x007e,6,ticksend,2
-0x007f,6
-0x0080,7
-0x0081,3
-0x0082,2
-0x0083,2
-0x0084,2
-0x0085,5,walktoxy,2
-0x0086,16
-0x0087,12
-0x0088,10
-0x0089,7,actionrequest,2:6
-0x008a,29
-0x008b,2
-0x008c,-1,globalmessage,2:4
-0x008d,-1
-0x008e,-1
-0x008f,0
-0x0090,7,npcclicked,2
-0x0091,22
-0x0092,28
-0x0093,2
-0x0094,6,getcharnamerequest,2
-0x0095,30
-0x0096,-1,wis,2:4:28
-0x0097,-1
-0x0098,3
-0x0099,-1,gmmessage,2:4
-0x009a,-1
-0x009b,5,changedir,2:4
-0x009c,9
-0x009d,17
-0x009e,17
-0x009f,6,takeitem,2
-0x00a0,23
-0x00a1,6
-0x00a2,6,dropitem,2:4
-0x00a3,-1
-0x00a4,-1
-0x00a5,-1
-0x00a6,-1
-0x00a7,8,useitem,2:4
-0x00a8,7
-0x00a9,6,equipitem,2:4
-0x00aa,7
-0x00ab,4,unequipitem,2
-0x00ac,7
-0x00ad,0
-0x00ae,-1
-0x00af,6
-0x00b0,8
-0x00b1,8
-0x00b2,3,restart,2
-0x00b3,3
-0x00b4,-1
-0x00b5,6
-0x00b6,6
-0x00b7,-1
-0x00b8,7,npcselectmenu,2:6
-0x00b9,6,npcnextclicked,2
-0x00ba,2
-0x00bb,5,statusup,2:4
-0x00bc,6
-0x00bd,44
-0x00be,5
-0x00bf,3,emotion,2
-0x00c0,7
-0x00c1,2,howmanyconnections,0
-0x00c2,6
-0x00c3,8
-0x00c4,6
-0x00c5,7,npcbuysellselected,2:6
-0x00c6,-1
-0x00c7,-1
-0x00c8,-1,npcbuylistsend,2:4
-0x00c9,-1,npcselllistsend,2:4
-0x00ca,3
-0x00cb,3
-0x00cc,6,gmkick,2
-0x00cd,3
-0x00ce,2,killall,0
-0x00cf,27,wisexin,2:26
-0x00d0,3,wisall,2
-0x00d1,4
-0x00d2,4
-0x00d3,2,wisexlist,0
-0x00d4,-1
-0x00d5,-1,createchatroom,2:4:6:7:15
-0x00d6,3
-0x00d7,-1
-0x00d8,6
-0x00d9,14,chataddmember,2:6
-0x00da,3
-0x00db,-1
-0x00dc,28
-0x00dd,29
-0x00de,-1,chatroomstatuschange,2:4:6:7:15
-0x00df,-1
-0x00e0,30,changechatowner,2:6
-0x00e1,30
-0x00e2,26,kickfromchat,2
-0x00e3,2,chatleave,0
-0x00e4,6,traderequest,2
-0x00e5,26
-0x00e6,3,tradeack,2
-0x00e7,3
-0x00e8,8,tradeadditem,2:4
-0x00e9,19
-0x00ea,5
-0x00eb,2,tradeok,0
-0x00ec,3
-0x00ed,2,tradecancel,0
-0x00ee,2
-0x00ef,2,tradecommit,0
-0x00f0,3
-0x00f1,2
-0x00f2,6
-0x00f3,8,movetokafra,2:4
-0x00f4,21
-0x00f5,8,movefromkafra,2:4
-0x00f6,8
-0x00f7,2,closekafra,0
-0x00f8,2
-0x00f9,26,createparty,2
-0x00fa,3
-0x00fb,-1
-0x00fc,6,partyinvite,2
-0x00fd,27
-0x00fe,30
-0x00ff,10,replypartyinvite,2:6
-0x0100,2,leaveparty,0
-0x0101,6
-0x0102,6,partychangeoption,2:4
-0x0103,30,removepartymember,2:6
-0x0104,79
-0x0105,31
-0x0106,10
-0x0107,10
-0x0108,-1,partymessage,2:4
-0x0109,-1
-0x010a,4
-0x010b,6
-0x010c,6
-0x010d,2
-0x010e,11
-0x010f,-1
-0x0110,10
-0x0111,39
-0x0112,4,skillup,2
-0x0113,10,useskilltoid,2:4:6
-0x0114,31
-0x0115,35
-0x0116,10,useskilltopos,2:4:6:8
-0x0117,18
-0x0118,2,stopattack,0
-0x0119,13
-0x011a,15
-0x011b,20,useskillmap,2:4
-0x011c,68
-0x011d,2,requestmemo,0
-0x011e,3
-0x011f,16
-0x0120,6
-0x0121,14
-0x0122,-1
-0x0123,-1
-0x0124,21
-0x0125,8
-0x0126,8,putitemtocart,2:4
-0x0127,8,getitemfromcart,2:4
-0x0128,8,movefromkafratocart,2:4
-0x0129,8,movetokafrafromcart,2:4
-0x012a,2,removeoption,0
-0x012b,2
-0x012c,3
-0x012d,4
-0x012e,2,closevending,0
-0x012f,-1
-0x0130,6,vendinglistreq,2
-0x0131,86
-0x0132,6
-0x0133,-1
-0x0134,-1,purchasereq,2:4:8
-0x0135,7
-0x0136,-1
-0x0137,6
-0x0138,3
-0x0139,16
-0x013a,4
-0x013b,4
-0x013c,4
-0x013d,6
-0x013e,24
-0x013f,26,itemmonster,2
-0x0140,22,mapmove,2:18:20
-0x0141,14
-0x0142,6
-0x0143,10,npcamountinput,2:6
-0x0144,23
-0x0145,19
-0x0146,6,npccloseclicked,2
-0x0147,39
-0x0148,8
-0x0149,9,gmreqnochat,2:6:7
-0x014a,6
-0x014b,27
-0x014c,-1
-0x014d,2,guildcheckmaster,0
-0x014e,6
-0x014f,6,guildrequestinfo,2
-0x0150,110
-0x0151,6,guildrequestemblem,2
-0x0152,-1
-0x0153,-1,guildchangeemblem,2:4
-0x0154,-1
-0x0155,-1,guildchangememberposition,2
-0x0156,-1
-0x0157,6
-0x0158,-1
-0x0159,54,guildleave,2:6:10:14
-0x015a,66
-0x015b,54,guildexplusion,2:6:10:14
-0x015c,90
-0x015d,42,guildbreak,2
-0x015e,6
-0x015f,42
-0x0160,-1
-0x0161,-1,guildchangepositioninfo,2
-0x0162,-1
-0x0163,-1
-0x0164,-1
-0x0165,30,createguild,6
-0x0166,-1
-0x0167,3
-0x0168,14,guildinvite,2
-0x0169,3
-0x016a,30
-0x016b,10,guildreplyinvite,2:6
-0x016c,43
-0x016d,14
-0x016e,186,guildchangenotice,2:6:66
-0x016f,182
-0x0170,14,guildrequestalliance,2
-0x0171,30
-0x0172,10,guildreplyalliance,2:6
-0x0173,3
-0x0174,-1
-0x0175,6
-0x0176,106
-0x0177,-1
-0x0178,4,itemidentify,2
-0x0179,5
-0x017a,4,usecard,2
-0x017b,-1
-0x017c,6,insertcard,2:4
-0x017d,7
-0x017e,-1,guildmessage,2:4
-0x017f,-1
-0x0180,6,guildopposition,2
-0x0181,3
-0x0182,106
-0x0183,10,guilddelalliance,2:6
-0x0184,10
-0x0185,34
-0x0186,0
-0x0187,6
-0x0188,8
-0x0189,4
-0x018a,4,quitgame,0
-0x018b,4
-0x018c,29
-0x018d,-1
-0x018e,10,producemix,2:4:6:8
-0x018f,6
-0x0190,90,useskilltoposinfo,2:4:6:8:10
-0x0191,86
-0x0192,24
-0x0193,6,solvecharname,2
-0x0194,30
-0x0195,102
-0x0196,9
-0x0197,4,resetchar,2
-0x0198,8
-0x0199,4
-0x019a,14
-0x019b,10
-0x019c,-1,lgmmessage,2:4
-0x019d,6,gmhide,0
-0x019e,2
-0x019f,6,catchpet,2
-0x01a0,3
-0x01a1,3,petmenu,2
-0x01a2,35
-0x01a3,5
-0x01a4,11
-0x01a5,26,changepetname,2
-0x01a6,-1
-0x01a7,4,selectegg,2
-0x01a8,4
-0x01a9,6,sendemotion,2
-0x01aa,10
-0x01ab,12
-0x01ac,6
-0x01ad,-1
-0x01ae,4,selectarrow,2
-0x01af,4,changecart,2
-0x01b0,11
-0x01b1,7
-0x01b2,-1,openvending,2:4:84:85
-0x01b3,67
-0x01b4,12
-0x01b5,18
-0x01b6,114
-0x01b7,6
-0x01b8,3
-0x01b9,6
-0x01ba,26
-0x01bb,26,shift,2
-0x01bc,26
-0x01bd,26,summon,2
-0x01be,2
-0x01bf,3
-0x01c0,2
-0x01c1,14
-0x01c2,10
-0x01c3,-1
-0x01c4,22
-0x01c5,22
-0x01c6,4
-0x01c7,2
-0x01c8,13
-0x01c9,97
-0x01ca,3
-0x01cb,9
-0x01cc,9
-0x01cd,30
-0x01ce,6,autospell,2
-0x01cf,28
-0x01d0,8
-0x01d1,14
-0x01d2,10
-0x01d3,35
-0x01d4,6
-0x01d5,-1,npcstringinput,2:4:8
-0x01d6,4
-0x01d7,11
-0x01d8,54
-0x01d9,53
-0x01da,60
-0x01db,2
-0x01dc,-1
-0x01dd,47
-0x01de,33
-0x01df,6,gmreqnochatcount,2
-0x01e0,30
-0x01e1,8
-0x01e2,34
-0x01e3,14
-0x01e4,2
-0x01e5,6
-0x01e6,26
-0x01e7,2,sndoridori,0
-0x01e8,28,createparty2,2
-0x01e9,81
-0x01ea,6
-0x01eb,10
-0x01ec,26
-0x01ed,2,snexplosionspirits,0
-0x01ee,-1
-0x01ef,-1
-0x01f0,-1
-0x01f1,-1
-0x01f2,20
-0x01f3,10
-0x01f4,32
-0x01f5,9
-0x01f6,34
-0x01f7,14
-0x01f8,2
-0x01f9,6,adopt,5
-0x01fa,48
-0x01fb,56
-0x01fc,-1
-0x01fd,4,repairitem,2
-0x01fe,5
-0x01ff,10
-0x0200,26
-0x0201,-1
-0x0202,26,friendslistadd,2
-0x0203,10,friendslistremove,2:6
-0x0204,18
-0x0205,26
-0x0206,11
-0x0207,34
-0x0208,14,friendslistreply,2:6:10
-0x0209,36
-0x020a,10
-0x020b,0
-0x020c,0
-0x020d,-1
-0x020e,24
-0x020f,10
-
-//2004-07-06kRO
-packet_ver: 6
-0x0072,22,wanttoconnection,5:9:13:17:21
-0x0085,8,walktoxy,5
-0x00a7,13,useitem,5:9
-0x0113,15,useskilltoid,4:9:11
-0x0116,15,useskilltopos,4:9:11:13
-0x0190,95,useskilltoposinfo,4:9:11:13:15
-
-//2004-07-13kRO
-packet_ver: 7
-0x0072,39,wanttoconnection,12:22:30:34:38
-0x0085,9,walktoxy,6
-0x009b,13,changedir,5:12
-0x009f,10,takeitem,6
-0x00a7,17,useitem,6:13
-0x0113,19,useskilltoid,7:9:15
-0x0116,19,useskilltopos,7:9:15:17
-0x0190,99,useskilltoposinfo,7:9:15:17:19
-
-//2004-07-26kRO
-packet_ver: 8
-0x0072,14,dropitem,5:12
-0x007e,33,wanttoconnection,12:18:24:28:32
-0x0085,20,useskilltoid,7:12:16
-0x0089,15,getcharnamerequest,11
-0x008c,23,useskilltopos,3:6:17:21
-0x0094,10,takeitem,6
-0x009b,6,walktoxy,3
-0x009f,13,changedir,5:12
-0x00a2,103,useskilltoposinfo,3:6:17:21:23
-0x00a7,12,solvecharname,8
-0x00f3,-1,globalmessage,2:4
-0x00f5,17,useitem,6:12
-0x00f7,10,ticksend,6
-0x0113,16,movetokafra,5:12
-0x0116,2,closekafra,0
-0x0190,26,movefromkafra,10:22
-0x0193,9,actionrequest,3:8
-
-//2004-08-09kRO
-packet_ver: 9
-0x0072,17,dropitem,8:15
-//9, +12, +7, +4, +4
-0x007e,37,wanttoconnection,9:21:28:32:36
-0x0085,26,useskilltoid,11:18:22
-0x0089,12,getcharnamerequest,8
-0x008c,40,useskilltopos,5:15:29:38
-0x0094,13,takeitem,9
-0x009b,15,walktoxy,12
-0x009f,12,changedir,7:11
-0x00a2,120,useskilltoposinfo,5:15:29:38:40
-0x00a7,11,solvecharname,7
-0x00f5,24,useitem,9:20
-0x00f7,13,ticksend,9
-0x0113,23,movetokafra,5:19
-0x0190,26,movefromkafra,11:22
-0x0193,18,actionrequest,7:17
-
-//2004-08-16aSakexe
-0x020f,0
-0x0210,0
-0x0211,0
-0x0212,26
-0x0213,26
-0x0214,42
-
-//2004-08-17aSakexe
-0x020f,10
-0x0210,22
-
-//2004-09-06aSakexe
-packet_ver: 10
-0x0072,20,useitem,9:20
-0x007e,19,movetokafra,3:15
-0x0085,23,actionrequest,9:22
-0x0089,9,walktoxy,6
-0x008c,105,useskilltoposinfo,10:14:18:23:25
-0x0094,17,dropitem,6:15
-0x009b,14,getcharnamerequest,10
-0x009f,-1,globalmessage,2:4
-0x00a2,14,solvecharname,10
-0x00a7,25,useskilltopos,10:14:18:23
-0x00f3,10,changedir,4:9
-//7, +7, +10, +4, +6
-0x00f5,34,wanttoconnection,7:15:25:29:33
-0x00f7,2,closekafra,0
-0x0113,11,takeitem,7
-0x0116,11,ticksend,7
-0x0190,22,useskilltoid,9:15:18
-0x0193,17,movefromkafra,3:13
-
-//2004-09-21aSakexe by Sara
-packet_ver: 11
-0x0072,18,useitem,10:14
-0x007e,25,movetokafra,6:21
-0x0085,9,actionrequest,3:8
-0x0089,14,walktoxy,11
-0x008c,109,useskilltoposinfo,16:20:23:27:29
-0x0094,19,dropitem,12:17
-0x00a2,10,solvecharname,6
-0x00a7,29,useskilltopos,6:20:23:27
-0x00f3,18,changedir,8:17
-0x00f5,32,wanttoconnection,10:17:23:27:31
-0x009b,10,getcharnamerequest,6
-0x0113,14,takeitem,10
-0x0116,14,ticksend,10
-0x0190,14,useskilltoid,4:7:10
-0x0193,12,movefromkafra,4:8
-
-//2004-10-11aSakexe by Sara
-packet_ver: 12
-0x0072,17,useitem,6:13
-0x007e,16,movetokafra,5:12
-0x0089,6,walktoxy,3
-0x008c,103,useskilltoposinfo,2:6:17:21:23
-0x0094,14,dropitem,5:12
-0x009b,15,getcharnamerequest,11
-0x00a2,12,solvecharname,8
-0x00a7,23,useskilltopos,3:6:17:21
-0x00f3,13,changedir,5:12
-0x00f5,33,wanttoconnection,12:18:24:28:32
-0x0113,10,takeitem,6
-0x0116,10,ticksend,6
-0x0190,20,useskilltoid,7:12:16
-0x0193,26,movefromkafra,10:22
-
-//2004-10-25aSakexe by Sara
-packet_ver: 13
-0x0072,13,useitem,5:9
-0x007e,13,movetokafra,6:9
-0x0085,15,actionrequest,4:14
-0x008c,108,useskilltoposinfo,6:9:23:26:28
-0x0094,12,dropitem,6:10
-0x009b,10,getcharnamerequest,6
-0x00a2,16,solvecharname,12
-0x00a7,28,useskilltopos,6:9:23:26
-0x00f3,15,changedir,6:14
-0x00f5,29,wanttoconnection,5:14:20:24:28
-0x0113,9,takeitem,5
-0x0116,9,ticksend,5
-0x0190,26,useskilltoid,4:10:22
-0x0193,22,movefromkafra,12:18
-
-//2004-11-01aSakexe by Sara
-//It has been reported that this npcamountinput line is WRONG. Therefore this
-//new data is now part of packet version 13
-//packet_ver: 14
-//0x00f5,29,wanttoconnection,5:14:20:24:28
-//0x0143,23,npcamountinput,2:6
-0x0215,6
-0x0216,6
-
-//2004-12-06aSakexe
-packet_ver: 15
-0x0190,15,useitem,3:11
-0x0094,14,movetokafra,4:10
-0x009f,18,actionrequest,6:17
-0x00a7,7,walktoxy,4
-0x007e,30,useskilltopos,4:9:22:28
-0x0116,12,dropitem,4:10
-0x008c,13,getcharnamerequest,9
-0x0085,-1,globalmessage,2:4
-0x00f7,14,solvecharname,10
-0x0113,110,useskilltoposinfo,4:9:22:28:30
-0x00f3,8,changedir,3:7
-0x00f5,29,wanttoconnection,3:10:20:24:28
-0x00a2,7,takeitem,3
-0x0089,7,ticksend,3
-0x0072,22,useskilltoid,8:12:18
-0x0193,21,movefromkafra,4:17
-0x009b,2,closekafra,0
-0x0217,2,blacksmith,0
-0x0218,2,alchemist,0
-0x0219,282
-0x021a,282
-0x021b,10
-0x021c,10
-0x021d,6
-0x021e,6
-0x0221,-1
-0x0222,6,weaponrefine,2
-0x0223,8
-
-//2005-01-10bSakexe by Sara
-packet_ver: 16
-0x009b,32,wanttoconnection,3:12:23:27:31
-0x0089,9,ticksend,5
-0x00a7,13,walktoxy,10
-0x0190,20,actionrequest,9:19
-0x00f3,-1,globalmessage,2:4
-0x008c,8,getcharnamerequest,4
-0x0085,23,changedir,12:22
-0x0094,20,movetokafra,10:16
-0x0193,2,closekafra,0
-0x00f7,21,movefromkafra,11:17
-0x009f,17,useitem,5:13
-0x0116,20,dropitem,15:18
-0x00f5,9,takeitem,5
-0x0113,34,useskilltopos,10:18:22:32
-0x0072,26,useskilltoid,8:16:22
-0x007e,114,useskilltoposinfo,10:18:22:32:34
-0x00a2,11,solvecharname,7
-0x0143,10,npcamountinput,2:6
-0x021f,66
-0x0220,10
-
-//2005-05-09aSakexe by Sara
-packet_ver: 17
-0x009b,26,wanttoconnection,4:9:17:18:25
-0x0089,8,ticksend,4
-0x00a7,8,walktoxy,5
-0x0190,19,actionrequest,5:18
-0x00f3,-1,globalmessage,2:4
-0x008c,11,getcharnamerequest,7
-0x0085,11,changedir,7:10
-0x0094,14,movetokafra,7:10
-0x0193,2,closekafra,0
-0x00f7,22,movefromkafra,14:18
-0x009f,14,useitem,4:10
-0x0116,10,dropitem,5:8
-0x00f5,8,takeitem,4
-0x0113,22,useskilltopos,5:9:12:20
-0x0072,25,useskilltoid,6:10:21
-0x007e,102,useskilltoposinfo,5:9:12:20:22
-0x00a2,15,solvecharname,11
-0x0143,10,npcamountinput,2:6
-0x0224,10
-0x0225,2,taekwon,0
-0x0226,282
-0x0227,18
-0x0228,18
-0x0229,15
-0x022a,58
-0x022b,57
-0x022c,64
-0x022d,5,hommenu,4
-0x022e,71
-0x022f,5
-0x0230,12
-0x0231,26,changehomunculusname,0
-0x0232,9,hommoveto,6
-0x0233,11,homattack,0
-0x0234,6,hommovetomaster,0
-0x0235,115
-
-//2005-06-28aSakexe by Sara
-packet_ver: 18
-0x0072,34,useskilltoid,6:17:30
-0x007e,113,useskilltoposinfo,12:15:18:31:33
-0x0085,17,changedir,8:16
-0x0089,13,ticksend,9
-0x008c,8,getcharnamerequest,4
-0x0094,31,movetokafra,16:27
-0x009b,32,wanttoconnection,9:15:23:27:31
-0x009f,19,useitem,9:15
-0x00a2,9,solvecharname,5
-0x00a7,11,walktoxy,8
-0x00f3,-1,globalmessage,2:4
-0x00f5,13,takeitem,9
-0x00f7,18,movefromkafra,11:14
-0x0113,33,useskilltopos,12:15:18:31
-0x0116,12,dropitem,3:10
-0x0143,10,npcamountinput,2:6
-0x0190,24,actionrequest,11:23
-0x0193,2,closekafra,0
-0x20e,10
-0x237,2,rankingpk,0
-0x23d,-1
-0x23e,4
-//Start mail system?
-0x23f,2
-0x240,-1
-0x241,-1
-0x242,-1
-0x243,-1
-0x244,-1
-0x245,3
-//Start writing a mail?
-0x246,4
-//Send Item/Zeny
-0x247,8
-//Message
-0x248,116
-//Delivered?
-0x249,3
-0x24a,70
-0x24b,4
-0x24c,8
-0x24d,12
-0x24e,4
-0x24f,10
-0x250,3
-0x251,32
-0x252,-1
-0x253,3
-0x254,3,feelsaveok,0
-0x255,5
-0x256,5
-0x257,8
-0x258,2
-0x259,3
-0x25a,-1
-0x25b,-1
-0x25c,4
-0x25d,-1
-0x25e,4
-
-//2006-04-03aSakexe by blackhole89
-packet_ver: 19
-0x009b,37,wanttoconnection,9:21:28:32:36
-0x00a2,11,solvecharname,7
-0x008c,12,getcharnamerequest,8
-0x00a7,15,walktoxy,12
-0x0116,17,dropitem,8:15
-0x00f5,13,takeitem,9
-0x009f,24,useitem,9:20
-0x0072,26,useskilltoid,11:18:22
-0x0113,40,useskilltopos,5:15:29:38
-0x0085,12,changedir,7:11
-0x007e,120,useskilltoposinfo,5:15:29:38:40
-0x0094,23,movetokafra,5:19
-0x00f7,26,movefromkafra,11:22
-0x0190,18,actionrequest,7:17
-
-//2006-06-07aSakexe
-0x025F,6
-0x0260,6
-0x0261,11
-0x0262,11
-0x0263,11
-0x0264,14
-0x0265,20
-0x0266,30
-0x0267,4
-0x0268,4
-0x0269,4
-0x026A,4
-0x026B,4
-0x026C,4
-0x026D,4
-0x026F,2
-0x0270,2
-0x0271,40
-0x0272,44
-0x0273,30
-0x0274,8
-0x0277,84
-0x0278,2
-0x0279,2
-0x027A,-1
-
-//2006-07-03aSakexe
-0x027D,62
-0x027B,14
-0x027C,60
-
-//2006-07-24aSakexe
-//0x025B,-1
-0x027E,-1
-
-//2006-08-07aSakexe
-0x025B,6
-//0x027F,4
-
-//2006-09-18aSakexe
-0x0284,14
-0x0281,4
-0x0282,284
-0x0280,12
-0x0285,6
-0x0286,4
-0x027F,8
-0x0283,6
-
-//2006-10-17aSakexe
-0x028A,18
-
-// Add new packets here
-packet_ver: 20
+// The packet database allows you to add support for new clients,
+// because packets change every release.
+// Note: Every packet version needs a wanttoconnection specification, since
+// that is the packet used to identify a client's version, if multiple versions
+// have the same connection packet, the higher version will be used (unless
+// the lower one is specified as the default)
+
+// Main packet version of the DB to use (default = max available version)
+// Client detection is faster when all clients use the specified here version.
+packet_db_ver: default
+
+packet_ver: 5
+0x0064,55
+0x0065,17
+0x0066,3
+0x0067,37
+0x0068,46
+0x0069,-1
+0x006a,23
+0x006b,-1
+0x006c,3
+0x006d,108
+0x006e,3
+0x006f,2
+0x0070,3
+0x0071,28
+0x0072,19,wanttoconnection,2:6:10:14:18
+0x0073,11
+0x0074,3
+0x0075,-1
+0x0076,9
+0x0077,5
+0x0078,54
+0x0079,53
+0x007a,58
+0x007b,60
+0x007c,41
+0x007d,2,loadendack,0
+0x007e,6,ticksend,2
+0x007f,6
+0x0080,7
+0x0081,3
+0x0082,2
+0x0083,2
+0x0084,2
+0x0085,5,walktoxy,2
+0x0086,16
+0x0087,12
+0x0088,10
+0x0089,7,actionrequest,2:6
+0x008a,29
+0x008b,2
+0x008c,-1,globalmessage,2:4
+0x008d,-1
+0x008e,-1
+0x008f,0
+0x0090,7,npcclicked,2
+0x0091,22
+0x0092,28
+0x0093,2
+0x0094,6,getcharnamerequest,2
+0x0095,30
+0x0096,-1,wis,2:4:28
+0x0097,-1
+0x0098,3
+0x0099,-1,gmmessage,2:4
+0x009a,-1
+0x009b,5,changedir,2:4
+0x009c,9
+0x009d,17
+0x009e,17
+0x009f,6,takeitem,2
+0x00a0,23
+0x00a1,6
+0x00a2,6,dropitem,2:4
+0x00a3,-1
+0x00a4,-1
+0x00a5,-1
+0x00a6,-1
+0x00a7,8,useitem,2:4
+0x00a8,7
+0x00a9,6,equipitem,2:4
+0x00aa,7
+0x00ab,4,unequipitem,2
+0x00ac,7
+0x00ad,0
+0x00ae,-1
+0x00af,6
+0x00b0,8
+0x00b1,8
+0x00b2,3,restart,2
+0x00b3,3
+0x00b4,-1
+0x00b5,6
+0x00b6,6
+0x00b7,-1
+0x00b8,7,npcselectmenu,2:6
+0x00b9,6,npcnextclicked,2
+0x00ba,2
+0x00bb,5,statusup,2:4
+0x00bc,6
+0x00bd,44
+0x00be,5
+0x00bf,3,emotion,2
+0x00c0,7
+0x00c1,2,howmanyconnections,0
+0x00c2,6
+0x00c3,8
+0x00c4,6
+0x00c5,7,npcbuysellselected,2:6
+0x00c6,-1
+0x00c7,-1
+0x00c8,-1,npcbuylistsend,2:4
+0x00c9,-1,npcselllistsend,2:4
+0x00ca,3
+0x00cb,3
+0x00cc,6,gmkick,2
+0x00cd,3
+0x00ce,2,killall,0
+0x00cf,27,wisexin,2:26
+0x00d0,3,wisall,2
+0x00d1,4
+0x00d2,4
+0x00d3,2,wisexlist,0
+0x00d4,-1
+0x00d5,-1,createchatroom,2:4:6:7:15
+0x00d6,3
+0x00d7,-1
+0x00d8,6
+0x00d9,14,chataddmember,2:6
+0x00da,3
+0x00db,-1
+0x00dc,28
+0x00dd,29
+0x00de,-1,chatroomstatuschange,2:4:6:7:15
+0x00df,-1
+0x00e0,30,changechatowner,2:6
+0x00e1,30
+0x00e2,26,kickfromchat,2
+0x00e3,2,chatleave,0
+0x00e4,6,traderequest,2
+0x00e5,26
+0x00e6,3,tradeack,2
+0x00e7,3
+0x00e8,8,tradeadditem,2:4
+0x00e9,19
+0x00ea,5
+0x00eb,2,tradeok,0
+0x00ec,3
+0x00ed,2,tradecancel,0
+0x00ee,2
+0x00ef,2,tradecommit,0
+0x00f0,3
+0x00f1,2
+0x00f2,6
+0x00f3,8,movetokafra,2:4
+0x00f4,21
+0x00f5,8,movefromkafra,2:4
+0x00f6,8
+0x00f7,2,closekafra,0
+0x00f8,2
+0x00f9,26,createparty,2
+0x00fa,3
+0x00fb,-1
+0x00fc,6,partyinvite,2
+0x00fd,27
+0x00fe,30
+0x00ff,10,replypartyinvite,2:6
+0x0100,2,leaveparty,0
+0x0101,6
+0x0102,6,partychangeoption,2:4
+0x0103,30,removepartymember,2:6
+0x0104,79
+0x0105,31
+0x0106,10
+0x0107,10
+0x0108,-1,partymessage,2:4
+0x0109,-1
+0x010a,4
+0x010b,6
+0x010c,6
+0x010d,2
+0x010e,11
+0x010f,-1
+0x0110,10
+0x0111,39
+0x0112,4,skillup,2
+0x0113,10,useskilltoid,2:4:6
+0x0114,31
+0x0115,35
+0x0116,10,useskilltopos,2:4:6:8
+0x0117,18
+0x0118,2,stopattack,0
+0x0119,13
+0x011a,15
+0x011b,20,useskillmap,2:4
+0x011c,68
+0x011d,2,requestmemo,0
+0x011e,3
+0x011f,16
+0x0120,6
+0x0121,14
+0x0122,-1
+0x0123,-1
+0x0124,21
+0x0125,8
+0x0126,8,putitemtocart,2:4
+0x0127,8,getitemfromcart,2:4
+0x0128,8,movefromkafratocart,2:4
+0x0129,8,movetokafrafromcart,2:4
+0x012a,2,removeoption,0
+0x012b,2
+0x012c,3
+0x012d,4
+0x012e,2,closevending,0
+0x012f,-1
+0x0130,6,vendinglistreq,2
+0x0131,86
+0x0132,6
+0x0133,-1
+0x0134,-1,purchasereq,2:4:8
+0x0135,7
+0x0136,-1
+0x0137,6
+0x0138,3
+0x0139,16
+0x013a,4
+0x013b,4
+0x013c,4
+0x013d,6
+0x013e,24
+0x013f,26,itemmonster,2
+0x0140,22,mapmove,2:18:20
+0x0141,14
+0x0142,6
+0x0143,10,npcamountinput,2:6
+0x0144,23
+0x0145,19
+0x0146,6,npccloseclicked,2
+0x0147,39
+0x0148,8
+0x0149,9,gmreqnochat,2:6:7
+0x014a,6
+0x014b,27
+0x014c,-1
+0x014d,2,guildcheckmaster,0
+0x014e,6
+0x014f,6,guildrequestinfo,2
+0x0150,110
+0x0151,6,guildrequestemblem,2
+0x0152,-1
+0x0153,-1,guildchangeemblem,2:4
+0x0154,-1
+0x0155,-1,guildchangememberposition,2
+0x0156,-1
+0x0157,6
+0x0158,-1
+0x0159,54,guildleave,2:6:10:14
+0x015a,66
+0x015b,54,guildexplusion,2:6:10:14
+0x015c,90
+0x015d,42,guildbreak,2
+0x015e,6
+0x015f,42
+0x0160,-1
+0x0161,-1,guildchangepositioninfo,2
+0x0162,-1
+0x0163,-1
+0x0164,-1
+0x0165,30,createguild,6
+0x0166,-1
+0x0167,3
+0x0168,14,guildinvite,2
+0x0169,3
+0x016a,30
+0x016b,10,guildreplyinvite,2:6
+0x016c,43
+0x016d,14
+0x016e,186,guildchangenotice,2:6:66
+0x016f,182
+0x0170,14,guildrequestalliance,2
+0x0171,30
+0x0172,10,guildreplyalliance,2:6
+0x0173,3
+0x0174,-1
+0x0175,6
+0x0176,106
+0x0177,-1
+0x0178,4,itemidentify,2
+0x0179,5
+0x017a,4,usecard,2
+0x017b,-1
+0x017c,6,insertcard,2:4
+0x017d,7
+0x017e,-1,guildmessage,2:4
+0x017f,-1
+0x0180,6,guildopposition,2
+0x0181,3
+0x0182,106
+0x0183,10,guilddelalliance,2:6
+0x0184,10
+0x0185,34
+0x0186,0
+0x0187,6
+0x0188,8
+0x0189,4
+0x018a,4,quitgame,0
+0x018b,4
+0x018c,29
+0x018d,-1
+0x018e,10,producemix,2:4:6:8
+0x018f,6
+0x0190,90,useskilltoposinfo,2:4:6:8:10
+0x0191,86
+0x0192,24
+0x0193,6,solvecharname,2
+0x0194,30
+0x0195,102
+0x0196,9
+0x0197,4,resetchar,2
+0x0198,8
+0x0199,4
+0x019a,14
+0x019b,10
+0x019c,-1,lgmmessage,2:4
+0x019d,6,gmhide,0
+0x019e,2
+0x019f,6,catchpet,2
+0x01a0,3
+0x01a1,3,petmenu,2
+0x01a2,35
+0x01a3,5
+0x01a4,11
+0x01a5,26,changepetname,2
+0x01a6,-1
+0x01a7,4,selectegg,2
+0x01a8,4
+0x01a9,6,sendemotion,2
+0x01aa,10
+0x01ab,12
+0x01ac,6
+0x01ad,-1
+0x01ae,4,selectarrow,2
+0x01af,4,changecart,2
+0x01b0,11
+0x01b1,7
+0x01b2,-1,openvending,2:4:84:85
+0x01b3,67
+0x01b4,12
+0x01b5,18
+0x01b6,114
+0x01b7,6
+0x01b8,3
+0x01b9,6
+0x01ba,26
+0x01bb,26,shift,2
+0x01bc,26
+0x01bd,26,summon,2
+0x01be,2
+0x01bf,3
+0x01c0,2
+0x01c1,14
+0x01c2,10
+0x01c3,-1
+0x01c4,22
+0x01c5,22
+0x01c6,4
+0x01c7,2
+0x01c8,13
+0x01c9,97
+0x01ca,3
+0x01cb,9
+0x01cc,9
+0x01cd,30
+0x01ce,6,autospell,2
+0x01cf,28
+0x01d0,8
+0x01d1,14
+0x01d2,10
+0x01d3,35
+0x01d4,6
+0x01d5,-1,npcstringinput,2:4:8
+0x01d6,4
+0x01d7,11
+0x01d8,54
+0x01d9,53
+0x01da,60
+0x01db,2
+0x01dc,-1
+0x01dd,47
+0x01de,33
+0x01df,6,gmreqnochatcount,2
+0x01e0,30
+0x01e1,8
+0x01e2,34
+0x01e3,14
+0x01e4,2
+0x01e5,6
+0x01e6,26
+0x01e7,2,sndoridori,0
+0x01e8,28,createparty2,2
+0x01e9,81
+0x01ea,6
+0x01eb,10
+0x01ec,26
+0x01ed,2,snexplosionspirits,0
+0x01ee,-1
+0x01ef,-1
+0x01f0,-1
+0x01f1,-1
+0x01f2,20
+0x01f3,10
+0x01f4,32
+0x01f5,9
+0x01f6,34
+0x01f7,14
+0x01f8,2
+0x01f9,6,adopt,5
+0x01fa,48
+0x01fb,56
+0x01fc,-1
+0x01fd,4,repairitem,2
+0x01fe,5
+0x01ff,10
+0x0200,26
+0x0201,-1
+0x0202,26,friendslistadd,2
+0x0203,10,friendslistremove,2:6
+0x0204,18
+0x0205,26
+0x0206,11
+0x0207,34
+0x0208,14,friendslistreply,2:6:10
+0x0209,36
+0x020a,10
+0x020b,0
+0x020c,0
+0x020d,-1
+0x020e,24
+0x020f,10
+
+//2004-07-06kRO
+packet_ver: 6
+0x0072,22,wanttoconnection,5:9:13:17:21
+0x0085,8,walktoxy,5
+0x00a7,13,useitem,5:9
+0x0113,15,useskilltoid,4:9:11
+0x0116,15,useskilltopos,4:9:11:13
+0x0190,95,useskilltoposinfo,4:9:11:13:15
+
+//2004-07-13kRO
+packet_ver: 7
+0x0072,39,wanttoconnection,12:22:30:34:38
+0x0085,9,walktoxy,6
+0x009b,13,changedir,5:12
+0x009f,10,takeitem,6
+0x00a7,17,useitem,6:13
+0x0113,19,useskilltoid,7:9:15
+0x0116,19,useskilltopos,7:9:15:17
+0x0190,99,useskilltoposinfo,7:9:15:17:19
+
+//2004-07-26kRO
+packet_ver: 8
+0x0072,14,dropitem,5:12
+0x007e,33,wanttoconnection,12:18:24:28:32
+0x0085,20,useskilltoid,7:12:16
+0x0089,15,getcharnamerequest,11
+0x008c,23,useskilltopos,3:6:17:21
+0x0094,10,takeitem,6
+0x009b,6,walktoxy,3
+0x009f,13,changedir,5:12
+0x00a2,103,useskilltoposinfo,3:6:17:21:23
+0x00a7,12,solvecharname,8
+0x00f3,-1,globalmessage,2:4
+0x00f5,17,useitem,6:12
+0x00f7,10,ticksend,6
+0x0113,16,movetokafra,5:12
+0x0116,2,closekafra,0
+0x0190,26,movefromkafra,10:22
+0x0193,9,actionrequest,3:8
+
+//2004-08-09kRO
+packet_ver: 9
+0x0072,17,dropitem,8:15
+//9, +12, +7, +4, +4
+0x007e,37,wanttoconnection,9:21:28:32:36
+0x0085,26,useskilltoid,11:18:22
+0x0089,12,getcharnamerequest,8
+0x008c,40,useskilltopos,5:15:29:38
+0x0094,13,takeitem,9
+0x009b,15,walktoxy,12
+0x009f,12,changedir,7:11
+0x00a2,120,useskilltoposinfo,5:15:29:38:40
+0x00a7,11,solvecharname,7
+0x00f5,24,useitem,9:20
+0x00f7,13,ticksend,9
+0x0113,23,movetokafra,5:19
+0x0190,26,movefromkafra,11:22
+0x0193,18,actionrequest,7:17
+
+//2004-08-16aSakexe
+0x020f,0
+0x0210,0
+0x0211,0
+0x0212,26
+0x0213,26
+0x0214,42
+
+//2004-08-17aSakexe
+0x020f,10
+0x0210,22
+
+//2004-09-06aSakexe
+packet_ver: 10
+0x0072,20,useitem,9:20
+0x007e,19,movetokafra,3:15
+0x0085,23,actionrequest,9:22
+0x0089,9,walktoxy,6
+0x008c,105,useskilltoposinfo,10:14:18:23:25
+0x0094,17,dropitem,6:15
+0x009b,14,getcharnamerequest,10
+0x009f,-1,globalmessage,2:4
+0x00a2,14,solvecharname,10
+0x00a7,25,useskilltopos,10:14:18:23
+0x00f3,10,changedir,4:9
+//7, +7, +10, +4, +6
+0x00f5,34,wanttoconnection,7:15:25:29:33
+0x00f7,2,closekafra,0
+0x0113,11,takeitem,7
+0x0116,11,ticksend,7
+0x0190,22,useskilltoid,9:15:18
+0x0193,17,movefromkafra,3:13
+
+//2004-09-21aSakexe by Sara
+packet_ver: 11
+0x0072,18,useitem,10:14
+0x007e,25,movetokafra,6:21
+0x0085,9,actionrequest,3:8
+0x0089,14,walktoxy,11
+0x008c,109,useskilltoposinfo,16:20:23:27:29
+0x0094,19,dropitem,12:17
+0x00a2,10,solvecharname,6
+0x00a7,29,useskilltopos,6:20:23:27
+0x00f3,18,changedir,8:17
+0x00f5,32,wanttoconnection,10:17:23:27:31
+0x009b,10,getcharnamerequest,6
+0x0113,14,takeitem,10
+0x0116,14,ticksend,10
+0x0190,14,useskilltoid,4:7:10
+0x0193,12,movefromkafra,4:8
+
+//2004-10-11aSakexe by Sara
+packet_ver: 12
+0x0072,17,useitem,6:13
+0x007e,16,movetokafra,5:12
+0x0089,6,walktoxy,3
+0x008c,103,useskilltoposinfo,2:6:17:21:23
+0x0094,14,dropitem,5:12
+0x009b,15,getcharnamerequest,11
+0x00a2,12,solvecharname,8
+0x00a7,23,useskilltopos,3:6:17:21
+0x00f3,13,changedir,5:12
+0x00f5,33,wanttoconnection,12:18:24:28:32
+0x0113,10,takeitem,6
+0x0116,10,ticksend,6
+0x0190,20,useskilltoid,7:12:16
+0x0193,26,movefromkafra,10:22
+
+//2004-10-25aSakexe by Sara
+packet_ver: 13
+0x0072,13,useitem,5:9
+0x007e,13,movetokafra,6:9
+0x0085,15,actionrequest,4:14
+0x008c,108,useskilltoposinfo,6:9:23:26:28
+0x0094,12,dropitem,6:10
+0x009b,10,getcharnamerequest,6
+0x00a2,16,solvecharname,12
+0x00a7,28,useskilltopos,6:9:23:26
+0x00f3,15,changedir,6:14
+0x00f5,29,wanttoconnection,5:14:20:24:28
+0x0113,9,takeitem,5
+0x0116,9,ticksend,5
+0x0190,26,useskilltoid,4:10:22
+0x0193,22,movefromkafra,12:18
+
+//2004-11-01aSakexe by Sara
+//It has been reported that this npcamountinput line is WRONG. Therefore this
+//new data is now part of packet version 13
+//packet_ver: 14
+//0x00f5,29,wanttoconnection,5:14:20:24:28
+//0x0143,23,npcamountinput,2:6
+0x0215,6
+0x0216,6
+
+//2004-12-06aSakexe
+packet_ver: 15
+0x0190,15,useitem,3:11
+0x0094,14,movetokafra,4:10
+0x009f,18,actionrequest,6:17
+0x00a7,7,walktoxy,4
+0x007e,30,useskilltopos,4:9:22:28
+0x0116,12,dropitem,4:10
+0x008c,13,getcharnamerequest,9
+0x0085,-1,globalmessage,2:4
+0x00f7,14,solvecharname,10
+0x0113,110,useskilltoposinfo,4:9:22:28:30
+0x00f3,8,changedir,3:7
+0x00f5,29,wanttoconnection,3:10:20:24:28
+0x00a2,7,takeitem,3
+0x0089,7,ticksend,3
+0x0072,22,useskilltoid,8:12:18
+0x0193,21,movefromkafra,4:17
+0x009b,2,closekafra,0
+0x0217,2,blacksmith,0
+0x0218,2,alchemist,0
+0x0219,282
+0x021a,282
+0x021b,10
+0x021c,10
+0x021d,6
+0x021e,6
+0x0221,-1
+0x0222,6,weaponrefine,2
+0x0223,8
+
+//2005-01-10bSakexe by Sara
+packet_ver: 16
+0x009b,32,wanttoconnection,3:12:23:27:31
+0x0089,9,ticksend,5
+0x00a7,13,walktoxy,10
+0x0190,20,actionrequest,9:19
+0x00f3,-1,globalmessage,2:4
+0x008c,8,getcharnamerequest,4
+0x0085,23,changedir,12:22
+0x0094,20,movetokafra,10:16
+0x0193,2,closekafra,0
+0x00f7,21,movefromkafra,11:17
+0x009f,17,useitem,5:13
+0x0116,20,dropitem,15:18
+0x00f5,9,takeitem,5
+0x0113,34,useskilltopos,10:18:22:32
+0x0072,26,useskilltoid,8:16:22
+0x007e,114,useskilltoposinfo,10:18:22:32:34
+0x00a2,11,solvecharname,7
+0x0143,10,npcamountinput,2:6
+0x021f,66
+0x0220,10
+
+//2005-05-09aSakexe by Sara
+packet_ver: 17
+0x009b,26,wanttoconnection,4:9:17:18:25
+0x0089,8,ticksend,4
+0x00a7,8,walktoxy,5
+0x0190,19,actionrequest,5:18
+0x00f3,-1,globalmessage,2:4
+0x008c,11,getcharnamerequest,7
+0x0085,11,changedir,7:10
+0x0094,14,movetokafra,7:10
+0x0193,2,closekafra,0
+0x00f7,22,movefromkafra,14:18
+0x009f,14,useitem,4:10
+0x0116,10,dropitem,5:8
+0x00f5,8,takeitem,4
+0x0113,22,useskilltopos,5:9:12:20
+0x0072,25,useskilltoid,6:10:21
+0x007e,102,useskilltoposinfo,5:9:12:20:22
+0x00a2,15,solvecharname,11
+0x0143,10,npcamountinput,2:6
+0x0224,10
+0x0225,2,taekwon,0
+0x0226,282
+0x0227,18
+0x0228,18
+0x0229,15
+0x022a,58
+0x022b,57
+0x022c,64
+0x022d,5,hommenu,4
+0x022e,71
+0x022f,5
+0x0230,12
+0x0231,26,changehomunculusname,0
+0x0232,9,hommoveto,6
+0x0233,11,homattack,0
+0x0234,6,hommovetomaster,0
+0x0235,115
+
+//2005-06-28aSakexe by Sara
+packet_ver: 18
+0x0072,34,useskilltoid,6:17:30
+0x007e,113,useskilltoposinfo,12:15:18:31:33
+0x0085,17,changedir,8:16
+0x0089,13,ticksend,9
+0x008c,8,getcharnamerequest,4
+0x0094,31,movetokafra,16:27
+0x009b,32,wanttoconnection,9:15:23:27:31
+0x009f,19,useitem,9:15
+0x00a2,9,solvecharname,5
+0x00a7,11,walktoxy,8
+0x00f3,-1,globalmessage,2:4
+0x00f5,13,takeitem,9
+0x00f7,18,movefromkafra,11:14
+0x0113,33,useskilltopos,12:15:18:31
+0x0116,12,dropitem,3:10
+0x0143,10,npcamountinput,2:6
+0x0190,24,actionrequest,11:23
+0x0193,2,closekafra,0
+0x20e,10
+0x237,2,rankingpk,0
+0x23d,-1
+0x23e,4
+//Start mail system?
+0x23f,2
+0x240,-1
+0x241,-1
+0x242,-1
+0x243,-1
+0x244,-1
+0x245,3
+//Start writing a mail?
+0x246,4
+//Send Item/Zeny
+0x247,8
+//Message
+0x248,116
+//Delivered?
+0x249,3
+0x24a,70
+0x24b,4
+0x24c,8
+0x24d,12
+0x24e,4
+0x24f,10
+0x250,3
+0x251,32
+0x252,-1
+0x253,3
+0x254,3,feelsaveok,0
+0x255,5
+0x256,5
+0x257,8
+0x258,2
+0x259,3
+0x25a,-1
+0x25b,-1
+0x25c,4
+0x25d,-1
+0x25e,4
+
+//2006-04-03aSakexe by blackhole89
+packet_ver: 19
+0x009b,37,wanttoconnection,9:21:28:32:36
+0x00a2,11,solvecharname,7
+0x008c,12,getcharnamerequest,8
+0x00a7,15,walktoxy,12
+0x0116,17,dropitem,8:15
+0x00f5,13,takeitem,9
+0x009f,24,useitem,9:20
+0x0072,26,useskilltoid,11:18:22
+0x0113,40,useskilltopos,5:15:29:38
+0x0085,12,changedir,7:11
+0x007e,120,useskilltoposinfo,5:15:29:38:40
+0x0094,23,movetokafra,5:19
+0x00f7,26,movefromkafra,11:22
+0x0190,18,actionrequest,7:17
+
+//2006-06-07aSakexe
+0x025F,6
+0x0260,6
+0x0261,11
+0x0262,11
+0x0263,11
+0x0264,14
+0x0265,20
+0x0266,30
+0x0267,4
+0x0268,4
+0x0269,4
+0x026A,4
+0x026B,4
+0x026C,4
+0x026D,4
+0x026F,2
+0x0270,2
+0x0271,40
+0x0272,44
+0x0273,30
+0x0274,8
+0x0277,84
+0x0278,2
+0x0279,2
+0x027A,-1
+
+//2006-07-03aSakexe
+0x027D,62
+0x027B,14
+0x027C,60
+
+//2006-07-24aSakexe
+//0x025B,-1
+0x027E,-1
+
+//2006-08-07aSakexe
+0x025B,6
+//0x027F,4
+
+//2006-09-18aSakexe
+0x0284,14
+0x0281,4
+0x0282,284
+0x0280,12
+0x0285,6
+0x0286,4
+0x027F,8
+0x0283,6
+
+//2006-10-17aSakexe
+0x028A,18
+
+// Add new packets here
+packet_ver: 20
diff --git a/db/pet_db.txt b/db/pet_db.txt
index 79625ce70..5ade34608 100644
--- a/db/pet_db.txt
+++ b/db/pet_db.txt
@@ -1,60 +1,60 @@
-//In theory you can use any valid script, but it is run only once upon pet
-//loading, so it is recommended you use the specific pet scripts:
-
-//petskillattack skillid, skilllv, rate, bonusrate
-//Skill attack that triggers while the pet is attacking. Rate is the base
-//chance of execution per attack. Bonusrate is an additional success rate when
-//intimacy reaches max.
-
-//petskillattack2 skillid, damage, hits, rate, bonusrate
-//Same as petskillattack, but the damage and number of hits is fixed
-//the damage specified is total, not per hit.
-
-//petskillsupport skillid, skilllv, delay, hp%, sp%
-//Casts a support skill when the health levels are below the specified hp% and
-//sp%. Delay is the minimum time in seconds before the skill can be cast again
-
-//petheal amount, delay, hp%, sp%
-//Similar to petskillsupport, but the skill is fixed to heal (28) and the
-//heal-amount is fixed to the value given.
-
-//petrecovery type, delay: Cures the "type" status effect after "delay" seconds
-
-//petskillbonus type, value, duration, delay
-//Gives bonus stats. Type is the stat to increase (bStr, bLuk), value is the
-//amount by which it is increased, duration signals how long the bonus lasts
-//delay is the time elapsed after the bonus ends and before it starts again.
-
-//A single pet can have petloot, petskillbonus, petskillattack (or
-//petskillattack2) and petskillsupport (or petheal) at the same time,
-//but only one of each.
-
-//NOTE: The max value (100%) of attack_rate, defense_rate & change_target_rate is 10000.
-// MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDelay,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
-1002,PORING,Poring,619,9001,10013,531,80,20,50,100,250,20,2000,400,1,0,350,400,800,{ petloot 10; }
-1011,CHONCHON,ChonChon,624,9006,10002,537,80,10,30,100,250,20,1500,200,1,0,500,500,250,{ petskillbonus bAgi,4,10,50; }
-1014,SPORE,Spore,630,9012,10017,537,80,20,30,100,250,20,1500,200,0,0,350,500,500,{ petrecovery SC_Poison,60; }
-1019,PECOPECO,PecoPeco,632,9014,10010,537,80,15,30,100,250,20,1000,200,1,0,400,500,800,{ petskillbonus bSpeedRate,25,20,20; }
-1023,ORC_WARRIOR,Orc Warrior,635,9017,10009,537,80,12,20,100,250,20,500,200,1,0,600,200,300,{ petskillattack2 158,100,1,0,10; }
-1026,MUNAK,Munak,636,9018,10008,537,80,20,20,100,250,20,500,100,0,0,300,750,300,{ petskillattack2 190,444,1,0,10; }
-1029,ISIS,Isis,639,9021,10006,537,80,20,10,100,250,20,500,200,0,0,650,450,150,{ petskillsupport 74,2,60,50,50; }
-1031,POPORING,Poporing,621,9003,10013,511,80,12,30,100,250,20,1000,300,1,0,300,500,400,{ petloot 15; }
-1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,12,10,100,250,20,500,150,1,0,500,500,200,{ petskillattack2 187,888,2,0,10;}
-1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,12,20,100,250,20,1000,150,1,0,500,500,200,{ petskillbonus bAgiVit,4,20,40; }
-1049,PICKY,Picky,623,9005,10012,507,80,15,40,100,250,20,2000,200,1,0,500,600,50,{ petskillbonus bStr,3,10,50;}
-1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,200,0,0,350,350,600,{ petskillbonus bAllStats,1,10,50; }
-1056,SMOKIE,Smokie,633,9015,10019,537,80,15,30,100,250,20,1000,200,1,0,600,600,100,{ petskillbonus bPerfectHide,1,3600,0; }
-1057,YOYO,Yoyo,634,9016,10018,532,80,12,20,100,250,20,1000,200,1,0,300,800,400,{ petloot 20; }
-1063,LUNATIC,Lunatic,622,9004,10007,534,80,15,40,100,250,20,1500,200,0,0,300,300,1000,{ petskillbonus bLuk,3,10,50; }
-1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,20,20,100,250,20,1000,200,0,0,600,200,400,{ petskillattack 176,20,0,10; }
-1101,BAPHOMET_Jr,Baphomet Jr.,642,9024,10001,518,80,30,10,100,250,20,200,100,0,0,1000,100,200,{ petskillattack2 190,1776,4,0,5; }
-1107,DESERT_WOLF_B,Baby Desert Wolf,628,9010,10003,537,80,10,40,100,250,20,1000,300,0,0,400,400,400,{ petskillattack 6,1,0,5;}
-1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,30,10,100,250,20,500,150,0,0,800,200,100,{ petskillbonus bAgiDexStr,6,20,40; }
-1110,DOKEBI,Dokebi,637,9019,10005,537,80,15,20,100,250,20,500,250,0,0,300,300,800,{ petskillattack 110,1,0,10; }
-1113,DROPS,Drops,620,9002,10013,508,80,15,40,100,250,20,1500,400,1,0,300,400,500,{ petloot 10; }
-1155,PETIT,Petit,640,9022,10011,537,80,15,20,100,250,20,500,200,0,0,800,400,100,{ petskillattack2 91,500,1,0,10; }
-1167,SAVAGE_BABE,Savage Bebe,627,9009,10015,537,80,9,40,100,250,20,1500,400,0,0,500,500,200,{ petskillbonus bVit,4,10,50; }
-1170,SOHEE,Sohee,638,9020,10016,537,80,20,10,100,250,20,500,300,0,0,100,1000,200,{ petheal 400,60,33,100; }
-1188,BON_GUN,Bon Gun,659,9025,10020,537,80,20,10,100,250,20,500,200,1,0,600,200,400,{ petskillattack2 190,555,1,1,1; }
-1200,ZHERLTHSH,Zherlthsh,660,9026,0,929,80,20,10,100,250,20,50,200,0,0,1000,100,500,{ petskillattack 136,1,0,3; }
-1275,ALICE,Alice,661,9027,0,504,80,20,10,100,250,20,100,200,0,0,100,1000,200,{ petskillsupport 28,5,60,25,100; }
+//In theory you can use any valid script, but it is run only once upon pet
+//loading, so it is recommended you use the specific pet scripts:
+
+//petskillattack skillid, skilllv, rate, bonusrate
+//Skill attack that triggers while the pet is attacking. Rate is the base
+//chance of execution per attack. Bonusrate is an additional success rate when
+//intimacy reaches max.
+
+//petskillattack2 skillid, damage, hits, rate, bonusrate
+//Same as petskillattack, but the damage and number of hits is fixed
+//the damage specified is total, not per hit.
+
+//petskillsupport skillid, skilllv, delay, hp%, sp%
+//Casts a support skill when the health levels are below the specified hp% and
+//sp%. Delay is the minimum time in seconds before the skill can be cast again
+
+//petheal amount, delay, hp%, sp%
+//Similar to petskillsupport, but the skill is fixed to heal (28) and the
+//heal-amount is fixed to the value given.
+
+//petrecovery type, delay: Cures the "type" status effect after "delay" seconds
+
+//petskillbonus type, value, duration, delay
+//Gives bonus stats. Type is the stat to increase (bStr, bLuk), value is the
+//amount by which it is increased, duration signals how long the bonus lasts
+//delay is the time elapsed after the bonus ends and before it starts again.
+
+//A single pet can have petloot, petskillbonus, petskillattack (or
+//petskillattack2) and petskillsupport (or petheal) at the same time,
+//but only one of each.
+
+//NOTE: The max value (100%) of attack_rate, defense_rate & change_target_rate is 10000.
+// MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDelay,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
+1002,PORING,Poring,619,9001,10013,531,80,20,50,100,250,20,2000,400,1,0,350,400,800,{ petloot 10; }
+1011,CHONCHON,ChonChon,624,9006,10002,537,80,10,30,100,250,20,1500,200,1,0,500,500,250,{ petskillbonus bAgi,4,10,50; }
+1014,SPORE,Spore,630,9012,10017,537,80,20,30,100,250,20,1500,200,0,0,350,500,500,{ petrecovery SC_Poison,60; }
+1019,PECOPECO,PecoPeco,632,9014,10010,537,80,15,30,100,250,20,1000,200,1,0,400,500,800,{ petskillbonus bSpeedRate,25,20,20; }
+1023,ORC_WARRIOR,Orc Warrior,635,9017,10009,537,80,12,20,100,250,20,500,200,1,0,600,200,300,{ petskillattack2 158,100,1,0,10; }
+1026,MUNAK,Munak,636,9018,10008,537,80,20,20,100,250,20,500,100,0,0,300,750,300,{ petskillattack2 190,444,1,0,10; }
+1029,ISIS,Isis,639,9021,10006,537,80,20,10,100,250,20,500,200,0,0,650,450,150,{ petskillsupport 74,2,60,50,50; }
+1031,POPORING,Poporing,621,9003,10013,511,80,12,30,100,250,20,1000,300,1,0,300,500,400,{ petloot 15; }
+1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,12,10,100,250,20,500,150,1,0,500,500,200,{ petskillattack2 187,888,2,0,10;}
+1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,12,20,100,250,20,1000,150,1,0,500,500,200,{ petskillbonus bAgiVit,4,20,40; }
+1049,PICKY,Picky,623,9005,10012,507,80,15,40,100,250,20,2000,200,1,0,500,600,50,{ petskillbonus bStr,3,10,50;}
+1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,200,0,0,350,350,600,{ petskillbonus bAllStats,1,10,50; }
+1056,SMOKIE,Smokie,633,9015,10019,537,80,15,30,100,250,20,1000,200,1,0,600,600,100,{ petskillbonus bPerfectHide,1,3600,0; }
+1057,YOYO,Yoyo,634,9016,10018,532,80,12,20,100,250,20,1000,200,1,0,300,800,400,{ petloot 20; }
+1063,LUNATIC,Lunatic,622,9004,10007,534,80,15,40,100,250,20,1500,200,0,0,300,300,1000,{ petskillbonus bLuk,3,10,50; }
+1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,20,20,100,250,20,1000,200,0,0,600,200,400,{ petskillattack 176,20,0,10; }
+1101,BAPHOMET_Jr,Baphomet Jr.,642,9024,10001,518,80,30,10,100,250,20,200,100,0,0,1000,100,200,{ petskillattack2 190,1776,4,0,5; }
+1107,DESERT_WOLF_B,Baby Desert Wolf,628,9010,10003,537,80,10,40,100,250,20,1000,300,0,0,400,400,400,{ petskillattack 6,1,0,5;}
+1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,30,10,100,250,20,500,150,0,0,800,200,100,{ petskillbonus bAgiDexStr,6,20,40; }
+1110,DOKEBI,Dokebi,637,9019,10005,537,80,15,20,100,250,20,500,250,0,0,300,300,800,{ petskillattack 110,1,0,10; }
+1113,DROPS,Drops,620,9002,10013,508,80,15,40,100,250,20,1500,400,1,0,300,400,500,{ petloot 10; }
+1155,PETIT,Petit,640,9022,10011,537,80,15,20,100,250,20,500,200,0,0,800,400,100,{ petskillattack2 91,500,1,0,10; }
+1167,SAVAGE_BABE,Savage Bebe,627,9009,10015,537,80,9,40,100,250,20,1500,400,0,0,500,500,200,{ petskillbonus bVit,4,10,50; }
+1170,SOHEE,Sohee,638,9020,10016,537,80,20,10,100,250,20,500,300,0,0,100,1000,200,{ petheal 400,60,33,100; }
+1188,BON_GUN,Bon Gun,659,9025,10020,537,80,20,10,100,250,20,500,200,1,0,600,200,400,{ petskillattack2 190,555,1,1,1; }
+1200,ZHERLTHSH,Zherlthsh,660,9026,0,929,80,20,10,100,250,20,50,200,0,0,1000,100,500,{ petskillattack 136,1,0,3; }
+1275,ALICE,Alice,661,9027,0,504,80,20,10,100,250,20,100,200,0,0,100,1000,200,{ petskillsupport 28,5,60,25,100; }
diff --git a/db/produce_db.txt b/db/produce_db.txt
index fa3e41005..b4defc84b 100644
--- a/db/produce_db.txt
+++ b/db/produce_db.txt
@@ -1,397 +1,397 @@
-// Blacksmith and Alchemist 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, ..).
-
-
-//===== Weapon === ItemLV=1~3 ==================
-
-//---- One Handed Swords -----------------------
-//-- Sword <-- BS_SWORD & 2 Iron
-1101,1,99,1,998,2
-//-- Falchion <-- BS_SWORD & 30 Iron
-1104,1,99,1,998,30
-//-- Blade <-- BS_SWORD & 45 Iron, 25 Tooth of Bat
-1107,1,99,1,998,45,913,25
-//-- Rapier <-- BS_SWORD & 20 Steel
-1110,2,99,2,999,20
-//-- Scimiter <-- BS_SWORD & 35 Steel
-1113,2,99,2,999,35
-//-- Ring Pommel Saber <-- BS_SWORD & 40 Steel, 50 Wolf Claw
-1122,2,99,2,999,40,920,50
-//-- Saber <-- BS_SWORD & 5 Steel, 8 Oridecon, 1 Opal
-1126,3,99,3,999,5,984,8,727,1
-//-- Haedongum <-- BS_SWORD & 8 Oridecon, 10 Steel, 1 Topaz
-1123,3,99,3,984,8,999,10,728,1
-//-- Tsurugi <-- BS_SWORD & 8 Oridecon, 15 Steel, 1 Garnet
-1119,3,99,3,984,8,999,15,718,1
-//-- Flamberge <-- BS_SWORD & 16 Oridecon, 1 Cursed Ruby
-1129,3,99,3,984,16,724,1
-//----------------------------------------------
-
-//---- Daggers ---------------------------------
-//-- Knife <-- BS_DAGGER & 1 Iron, 10 Jellopies
-1201,1,98,1,998,1,909,10
-//-- Cutter <-- BS_DAGGER & 25 Iron
-1204,1,98,1,998,25
-//-- Main Gauge <-- BS_DAGGER & 50 Iron
-1207,1,98,1,998,50
-//-- Dirk <-- BS_DAGGER & 17 Steel
-1210,2,98,2,999,17
-//-- Dagger <-- BS_DAGGER & 30 Steel
-1213,2,98,2,999,30
-//-- Stiletto <-- BS_DAGGER & 40 Steel
-1216,2,98,2,999,40
-//-- Gladius <-- BS_DAGGER & 4 Oridecon, 40 Steel, 1 Sapphire
-1219,3,98,3,984,4,999,40,726,1
-//-- Damascus <-- BS_DAGGER & 4 Oridecon, 60 Steel, 1 Zircon
-1222,3,98,3,984,4,999,60,729,1
-//----------------------------------------------
-
-//---- Two Handed Swords -----------------------
-//-- Katana <-- BS_TWOHANDSWORD & 35 Iron, 15 Horrendous Mouth
-1116,1,100,1,998,35,958,15
-//-- Slayer <-- BS_TWOHANDSWORD & 25 Steel, 20 Decayed Nail
-1151,2,100,2,999,25,957,20
-//-- Bastard Sword <-- BS_TWOHANDSWORD & 45 Steel
-1154,2,100,2,999,45
-//-- Two-Handed Sword <-- BS_TWOHANDSWORD & 12 Oridecon, 10 Steel
-1157,3,100,3,984,12,999,10
-//-- Broad Sword <-- BS_TWOHANDSWORD & 12 Oridecon, 20 Steel
-1160,3,100,3,984,12,999,20
-//-- Claymore <-- BS_TWOHANDSWORD & 16 Oridecon, 20 Steel, 1 Cracked Diamond
-1163,3,100,3,984,16,999,20,733,1
-//----------------------------------------------
-
-//---- Axes ------------------------------------
-//-- Axe <-- BS_AXE & 10 Iron
-1301,1,101,1,998,10
-//-- Battle Axe <-- BS_AXE & 110 Iron
-1351,1,101,1,998,110
-//-- Hammer <-- BS_AXE & 30 Steel
-1354,2,101,2,999,30
-//-- Buster <-- BS_AXE & 4 Oridecon, 20 Steel, 30 Orcish Fang
-1357,3,101,3,984,4,999,20,922,30
-//-- Two-Handed Axe <-- BS_AXE & 8 Oridecon, 10 Steel, 1 Amthyst
-1360,3,101,3,984,8,999,10,719,1
-//----------------------------------------------
-
-//---- Maces -----------------------------------
-//-- Club <-- BS_MACE & 3 Iron
-1501,1,102,1,998,3
-//-- Mace <-- BS_MACE & 30 Iron
-1504,1,102,1,998,30
-//-- Smasher <-- BS_MACE & 20 Steel
-1507,2,102,2,999,20
-//-- Flail <-- BS_MACE & 33 Steel
-1510,2,102,2,999,33
-//-- Chain <-- BS_MACE & 45 Steel
-1519,2,102,2,999,45
-//-- Morning Star <-- BS_MACE & 85 Steel, 1 1 Carat Diamond
-1513,3,102,3,999,85,730,1
-//-- Sword Mace <-- BS_MACE & 100 Steel, 20 Sharp Scale
-1516,3,102,3,999,100,963,20
-//-- Stunner <-- BS_MACE & 120 Steel, 1 Heroic Emblem
-1522,3,102,3,999,120,968,1
-//----------------------------------------------
-
-//---- Knucklebracers --------------------------
-//-- Waghnakh <-- BS_KNUCKLE & 160 Iron, 1 Pearl
-1801,1,103,1,998,160,722,1
-//-- Knuckle Duster <-- BS_KNUCKLE & 50 Steel
-1803,2,103,2,999,50
-//-- Hora <-- BS_KNUCKLE & 65 Steel
-1805,2,103,2,999,65
-//-- Fist <-- BS_KNUCKLE & 4 Oridecon, 10 Ruby
-1807,3,103,3,984,4,723,10
-//-- Claw <-- BS_KNUCKLE & 8 Oridecon, 10 Topaz
-1809,3,103,3,984,8,728,10
-//-- Finger <-- BS_KNUCKLE & 4 Oridecon, 10 Opal
-1811,3,103,3,984,4,727,10
-//----------------------------------------------
-
-//---- Spears ----------------------------------
-//-- Javelin <-- BS_SPEAR & 3 Iron
-1401,1,104,1,998,3
-//-- Spear <-- BS_SPEAR & 35 Iron
-1404,1,104,1,998,35
-//-- Pike <-- BS_SPEAR & 70 Iron
-1407,1,104,1,998,70
-//-- Guisarme <-- BS_SPEAR & 25 Steel
-1451,2,104,2,999,25
-//-- Glaive <-- BS_SPEAR & 40 Steel
-1454,2,104,2,999,40
-//-- Partizan <-- BS_SPEAR & 55 Steel
-1457,2,104,2,999,55
-//-- Trident <-- BS_SPEAR & 8 Oridecon, 10 Steel, 5 Aquamarine
-1460,3,104,3,984,8,999,10,720,5
-//-- Halberd <-- BS_SPEAR & 12 Oridecon, 10 Steel
-1463,3,104,3,984,12,999,10
-//-- Lance <-- BS_SPEAR & 12 Oridecon, 3 Ruby, 2 Evil Horn
-1410,3,104,3,984,12,723,3,923,2
-//----------------------------------------------
-
-//==============================================
-
-
-//==============================================
-// COOKING RECIPES (LV= 11 -> 20)
-//==============================================
-
-//--------------------LEVEL 1-----------
-
-//-- Boiled Down Locust <-- 5 Grasshopper's Leg, 1 Old Frying Pan, 1 Cooking Oil
-12041,11,0,0,7472,0,940,5,7031,1,7457,1
-//-- Herb Tea With Grape Juice <-- 3 Grape, 2 Red Potion
-12046,11,0,0,7472,0,514,3,501,2
-//-- Steamed Crab Pincer <-- 10 Nipper, 10 Green Herb, 1 Yellow Potion
-12051,11,0,0,7472,0,960,10,511,10,503,1
-//-- Frog Spawn Soup <-- 1 Grain, 10 Spawn, 1 Squid Ink
-12056,11,0,0,7472,0,577,1,908,10,1024,1
-//-- Grape Juice with Honey <-- 1 Honey, 2 Grape, 1 Red Potion
-12061,11,0,0,7472,0,518,1,514,2,501,1
-//-- Fried Monkey Tail <-- 5 Yoyo Tail, 1 Old Frying Pan, 1 Cooking Oil
-12066,11,0,0,7472,0,942,5,7031,1,7457,1
-
-//--------------------LEVEL 2-----------
-
-//-- Seasoned Webs <-- 20 Cobweb, 10 Green Herb, 10 Yellow Herb, 1 Plain Sauce
-12042,12,0,0,7473,0,918,20,511,10,508,10,7454,1
-//-- Sea Food <-- 10 Clam Flesh, 5 Gill, 5 Fin, 1 Yummy Fish
-12052,12,0,0,7473,0,966,10,956,5,951,5,579,1
-//-- Black Tea <-- 5 Blue Herb, 10 Red Herb, 10 Yellow Herb
-12047,12,0,0,7473,0,510,5,507,10,508,10
-//-- Smooth Noodle <-- 1 Grain, 1 Plain Sauce, 5 Jack o' Pumpkin, 3 Carrot
-12057,12,0,0,7473,0,577,1,7454,1,1062,5,515,3
-//-- Chocolate Mousse Cake <-- 10 Cacao, 1 Piece of Cake, 1 Milk, 1 China
-12062,12,0,0,7473,0,7182,10,539,1,519,1,736,1
-//-- Mixed Juice <-- 3 Apple Juice, 2 Carrot Juice, 1 Grape Juice, 2 Orange Juice
-12067,12,0,0,7473,0,531,3,534,2,533,1,620,2
-
-
-//--------------------LEVEL 3-----------
-
-//-- Fruit Punch <-- 5 Apple, 5 Banana, 5 Orange, 5 Strawberry, 1 Yellow Spice
-12063,13,0,0,7474,0,512,5,513,5,582,5,578,5,7452,1
-//-- Herb and Honey Tea <-- 2 Honey, 10 White Herb, 1 Yellow Spice
-12048,13,0,0,7474,0,518,2,509,10,7452,1
-//-- Bomber Steak <-- 4 Meat, 1 Old Frying Pan, 10 Green Herb, 5 Red Chili, 1 Hot Sauce
-12043,13,0,0,7474,0,517,4,7031,1,511,10,7286,5,7455,1
-//-- Clam Soup <-- 20 Clam Flesh, 10 Conch, 1 Honey, 1 Sweet Sauce
-12053,13,0,0,7474,0,966,20,961,10,518,1,7453,1
-//-- Tentacle and Cheese Gratin <-- 10 Tentacle, 10 Cheese, 5 Yam, 1 Sweet Sauce
-12058,13,0,0,7474,0,962,10,548,10,549,5,7453,1
-//-- Fried Sweet Potato with Syrup <-- 10 Potato, 10 Yam, 1 Sweet Potato, 1 Sweet Sauce
-12068,13,0,0,7474,0,516,10,549,10,633,1,7453,1
-
-//--------------------LEVEL 4-----------
-
-//-- Morroc Fruit Wine <-- 10 Strawberry, 4 Lemon, 10 Orange, 2 Alcohol, 5 Grape
-12049,14,0,0,7475,0,578,10,568,4,582,10,970,2,514,5
-//-- Seasoned Jellyfish <-- 30 Tentacle, 10 White Herb, 10 Soft Blade Grass, 1 Old Frying Pan, 20 Squid Ink
-12054,14,0,0,7475,0,962,30,509,10,7194,10,7031,1,1024,20
-//-- Rib with Herbs and Spices <-- 5 Meat, 3 Red Herb, 2 Yellow Herb, 3 Green Herb, 1 Sweet Sauce, 1 Lemon
-12044,14,0,0,7475,0,517,5,507,3,508,2,511,3,7453,1,568,1
-//-- Cream Sandwich <-- 5 Bread, 15 Milk, 10 Cheese, 10 Yellow Herb, 1 Meat, 1 Sweet Sauce
-12064,14,0,0,7475,0,580,5,519,15,548,10,508,10,517,1,7453,1
-//-- Lutie Mixed Cold Noodles <-- 3 Grain, 1 Hot Sauce, 10 Ice Cubic, 10 Carrot, 10 Jack o' Pumpkin
-12059,14,0,0,7475,0,577,3,7455,1,7066,10,515,10,1062,10
-//-- Ancient Fish Dish <-- 10 Ancient Lips, 10 Raccoon Leaf, 10 White Herb,5 Yummy Fish, 2 Sweet Sauce
-12069,14,0,0,7475,0,1054,10,945,10,509,10,579,5,7453,2
-
-//--------------------LEVEL 5-----------
-
-//-- Mastela Wine <-- 4 Mastela Fruit, 1 Blue Potion, 2 Alcohol, 2 Lemon, 1 Yellow Spice
-12050,15,0,0,7476,0,522,4,505,1,970,2,568,2,7452,1
-//-- Lutie Plat Cake <-- 10 Potato, 2 Honey, 1 Cooking Oil, 3 Carrot, 1 Grain
-12045,15,0,0,7476,0,516,10,518,2,7457,1,515,3,577,1
-//-- Green Salad <-- 2 Hinalle Leaflet, 3 Aloe Leaflet, 10 Sharp Leaf, 6 Huge Leaf, 1 Sweet Sauce, 1 Yellow Spice
-12065,15,0,0,7476,0,520,2,521,3,7100,10,7198,6,7453,1,7452,1
-//-- Steamed Bat Wing and Pumpkin <-- 20 Wing of Red Bat, 20 Jack o' Pumpkin, 1 Pot, 10 Hinalle Leaflet, 10 Red Herb
-12060,15,0,0,7476,0,7006,20,1062,20,7482,1,520,10,507,10
-//-- Peppery Roasted Dumpling <-- 20 Bao, 10 Yellow Herb, 1 Hot Sauce, 1 Red Spice, 20 Green Herb
-12055,15,0,0,7476,0,553,20,508,10,7455,1,7456,1,511,20
-//-- Broiled Down Scorpion <-- 20 Scorpion Tail, 10 Bug Leg, 10 Huge Leaf, 2 Old Frying Pan, 1 Cooking Oil
-12070,15,0,0,7476,0,904,20,1042,10,7198,10,7031,2,7457,1
-
-//--------------------LEVEL 6-----------
-
-//-- Flavored Grilled Beef <-- 10 Meat, 2 Honey, 1 Yellow Herb, 1 Mastela Fruit, 20 Shining Scale
-12071,16,0,0,7477,0,517,10,518,2,508,1,522,1,954,20
-//-- Red Mushroom Wine <-- 3 Mushroom, 3 Grape Juice, 20 Mushroom Spore, 1 Alcohol, 1 Red Spice
-12076,16,0,0,7477,0,581,3,533,3,921,20,970,1,7456,1
-//-- Peach Cake <-- 20 Solid Peach, 10 Piece of Cake, 10 Cheese, 10 Milk, 5 Orange Juice, 1 Sweet Sauce
-12091,16,0,0,7477,0,7164,20,539,10,548,10,519,10,620,5,7453,1
-//-- Chili and Prawn Gratin <-- 20 Red Chile, 20 Shrimp, 1 Sweet Sauce, 20 Lemon
-12086,16,0,0,7477,0,7286,20,567,20,7453,1,568,20
-//-- Very Bitter Invigorant <-- 20 Brown Root, 10 Maneater Root, 20 Mushroom Spore, 1 Mushroom, 2 Honey
-12081,16,0,0,7477,0,7188,20,1033,10,921,20,581,1,518,2
-//-- Soup of Great Luck <-- 5 Reptile Tongue, 5 Tongue, 10 Clover, 10 Witch Starsand, 1 Aloe
-12096,16,0,0,7477,0,903,5,1015,5,705,10,1061,10,704,1
-
-//--------------------LEVEL 7-----------
-
-//-- Barbecue <-- 10 Meat, 1 Live Coal, 2 Coal, 1 Hot Sauce, 15 Trunk, 10 White Herb
-12072,17,0,0,7478,0,517,10,7098,1,1003,2,7455,1,1019,15,509,10
-//-- Royal Jelly and Herb Tea <-- 4 Royal Jelly, 2 Honey, 5 White Herb, 10 Hinalle Leaflet, 1 Yellow Spice
-12077,17,0,0,7478,0,526,4,518,2,509,5,520,10,7452,1
-//-- Soul Hunt Bread <-- 10 Bread, 5 Mastela Fruit, 1 Sweet Sauce, 5 Ment, 5 Amulet, 2 Unripe Apple
-12092,17,0,0,7478,0,580,10,522,5,7453,1,708,5,609,5,619,2
-//-- Boiled Vegetable stuffed with Roasted Crocodile <-- 10 Anolian Skin, 10 Jack o' Pumpkin, 10 Carrot, 10 Aloe Leaflet, 10 Yellow Herb, 1 Yellow Spice
-12087,17,0,0,7478,0,7003,10,1062,10,515,10,521,10,508,10
-//-- Sumptuous Feast <-- 10 Fish Tail, 5 Aloe Leaflet, 10 Mane, 2 Yummy Fish, 10 Pet Food, 1 Sweet Sauce
-12082,17,0,0,7478,0,1023,10,521,5,1028,10,579,2,537,10,7453,1
-//-- Grilled Meat Skewer <-- 10 Scale Shell, 5 Gill, 10 Soft Blade of Grass, 5 Meat, 10 Mushroom, 10 Clam Flesh
-12097,17,0,0,7478,0,936,10,956,5,7194,10,517,5,581,10,966,10
-
-//--------------------LEVEL 8-----------
-
-//-- Bear Foot Dish <-- 20 Bear's Footskin, 10 Carrot, 10 Jack o' Pumpkin, 2 Aloe Leaflet, 1 Hinalle Leaflet, 1 Plain Sauce
-12073,18,0,0,7479,0,948,20,515,10,1062,10,521,2,520,1,7454,1
-//-- Royal Tea <-- 4 Prickly Fruit, 10 Hinalle Leaflet, 3 Yggdrasil Leaf, 10 Aloe Leaflet, 6 Royal Jelly, 1 Yellow Spice
-12078,18,0,0,7479,0,576,4,520,10,610,3,521,10,526,6,7452,1
-//-- Special Toast <-- 10 Bread, 2 Royal Jelly, 5 Meat, 10 Strawberry, 1 Hot Sauce, 10 Cheese, 1 Sweet Sauce
-12093,18,0,0,7479,0,580,10,526,2,517,5,578,10,7455,1,548,10,7453,1
-//-- Very Hot Curry <-- 1 Aloevera, 1 Hot Sauce, 10 Meat, 10 Hinalle Leaflet, 10 Jack o' Pumpkin, 10 Carrot
-12088,18,0,0,7479,0,606,1,7455,1,517,10,520,10,1062,10,515,10
-//-- Huge Stuffed Leaves <-- 20 Fig Leaf, 20 Meat, 5 Rainbow Carrot, 10 Jack o' Pumpkin, 1 Plain Sauce, 2 Grain
-12083,18,0,0,7479,0,7298,20,517,20,622,5,1062,10,7454,1,577,2
-//-- Strawberry Rice Ball <-- 10 Strawberry, 5 Grain, 10 Fig Leaf, 1 Yellow Spice, 2 Red Spice, 1 Plain Sauce
-12098,18,0,0,7479,0,578,10,577,5,7298,10,7452,1,7456,2,7454,1
-
-//--------------------LEVEL 9-----------
-
-//-- Sauted Meat Strips <-- 40 Tendon, 1 Pot, 10 Cheese, 1 Hot Sauce, 2 Coal, 30 Green Herb, 10 Squid Ink
-12074,19,0,0,7480,0,1050,40,7482,1,548,10,7455,1,1003,2,511,30,1024,10
-//-- Tristan 12 <-- 10 Yggdrasil Leaf, 10 Orange, 5 Alcohol, 4 Royal Jelly, 2 Blue Potion, 1 Yellow Spice, 10 Aloe Leaflet
-12079,19,0,0,7480,0,610,10,582,10,970,5,526,4,505,2,7452,1,521,10
-//-- Ethereal Fruit Juice <-- 5 Unripe Apple, 10 Orange, 10 Strawberry, 1 Red Spice, 1 Tropica Banana, 5 Grape Juice, 2 Alcohol
-12094,19,0,0,7480,0,619,5,582,10,578,10,7456,1,634,1,533,5,970,2
-//-- Delicious Boiled Meats <-- 10 Meat, 5 Royal Jelly, 20 Shoot, 4 Plain Sauce, 5 Yellow Herb, 10 White Herb, 5 Red Herb
-12089,19,0,0,7480,0,517,10,526,5,711,20,7454,4,508,5,509,10,507,5
-//-- Ascending Dragon Broth <-- 10 Dragon Skin, 20 Dragon Tail, 3 Yggdrasil Leaf, 6 Royal Jelly, 1 Hot Sauce, 1 Red Spice, 1 Fatty Chubby Earthworm
-12084,19,0,0,7480,0,7123,10,1037,20,610,3,526,6,7455,1,7456,1,632,1
-//-- Blood Flavored Sodapop <-- 1 Animal Gore, 2 Anodyne, 2 Aloevera, 2 Alcohol, 6 Royal Jelly, 1 Red Spice, 10 Apple Juice
-12099,19,0,0,7480,0,702,1,605,2,606,2,970,2,526,6,7456,1,531,10
-
-//--------------------LEVEL 10-----------
-
-//-- Tongue Dish <-- 20 Tongue, 1 Pot, 1 Alcohol, 2 Aloevera, 1 Hot Sauce, 5 Royal Jelly, 10 Yggdrasil Leaf, 2 Blue Potion
-12075,20,0,0,7481,0,1015,20,7482,1,970,1,606,2,7455,1,526,5,610,10,505,2
-//-- Dragon Breath Cocktail <-- 10 Maneater Root, 1 Singing Plant, 5 Aloe Leaflet, 5 Royal Jelly, 5 Lemon, 5 Prickly Fruit, 1 Yggdrasilberry, 10 Blue Herb
-12080,20,0,0,7481,0,1033,10,707,1,521,5,526,5,568,5,576,5,607,1,510,10
-//-- Wine of Bergelmir <-- 1 Yggdrasilberry, 10 Ice Cubic, 10 Bacillus, 4 Royal Jelly, 3 Concentration Potion, 5 Alcohol, 2 Prickly Fruit, 1 Illusion Flower
-12095,20,0,0,7481,0,607,1,7066,10,7119,10,526,4,645,3,970,5,576,2,710,1
-//-- Hot Sand Steamed Scorpion <-- 20 Scorpion Tail, 20 Scorpion Claw, 2 Aloevera, 3 Yggdrasil Leaf, 3 Bitter Herb, 10 Royal Jelly , 1 Hot Sauce, 1 Pot
-12090,20,0,0,7481,0,904,20,7125,20,606,2,610,3,621,3,526,10,7455,1,7482,1
-//-- Stew of Immortality <-- 20 Immortal Heart, 10 Memento, 1 Yggdrasil Seed, 2 Anodyne, 10 Heart of Mermaid, 2 Hot Sauce, 10 Amulet, 2 Bitter Herb
-12085,20,0,0,7481,0,929,20,934,10,608,1,605,2,950,10,7455,2,609,10,621,2
-//-- Nine Tail Dish <-- 10 Nine Tails, 2 Four Leaf Clover, 10 Maneater Root, 10 Sharp Leaf, 4 Yggdrasil Leaf, 1 Plain Sauce, 1 Yellow Spice, 2 Izidor
-12100,20,0,0,7481,0,1022,10,706,2,1033,10,7100,10,610,4,7454,1,7452,1,709,2
-//==============================================
-
-
-//===== Stones and Metals === ItemLV=21 ========
-
-//---- Metals ----------------------------------
-//-- Iron <-- BS_IRON & 1 Iron Ore
-998,21,94,1,1002,1
-//-- Steel <-- BS_STEEL & 5 Iron, 1 Coal
-999,21,95,1,998,5,1003,1
-//----------------------------------------------
-
-
-//---- Enchanted Stones ------------------------
-//-- Star Crumb <-- BS_ENCHANTSTONE & 10 Star Dust
-1000,21,96,1,1001,10
-//-- Flame Heart <-- BS_ENCHANTSTONE & 10 Red Blood
-994,21,96,1,990,10
-//-- Mystic Frozen <-- BS_ENCHANTSTONE & 10 Crystal Blue
-995,21,96,1,991,10
-//-- Rough Wind <-- BS_ENCHANTSTONE & 10 Wind of Verdure
-997,21,96,1,993,10
-//-- Great Nature <-- BS_ENCHANTSTONE & 10 Green Live
-996,21,96,1,992,10
-//----------------------------------------------
-
-//==============================================
-
-
-//===== Potions === ItemLV=22 ==================
-
-//---- Health Potions --------------------------
-//-- Red Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Red Herb, 1 Empty Potion Bottle
-501,22,228,1,7144,0,507,1,1093,1
-//-- Yellow Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Yellow Herb, 1 Empty Potion Bottle
-503,22,228,1,7144,0,508,1,1093,1
-//-- White Potion <-- AM_PHARMACY & Potion Creation Guide & 1 White Herb, 1 Empty Potion Bottle
-504,22,228,1,7144,0,509,1,1093,1
-//-- Blue Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Blue Herb, 1 Scell, 1 Empty Potion Bottle
-505,22,228,1,7144,0,510,1,911,1,1093,1
-//-- Condensed Red Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 Red Potion, 1 Empty Testtube, 1 Cactus Needle
-545,22,228,1,7133,0,501,1,1092,1,952,1
-//-- Condensed Yellow Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 Yellow Potion, 1 Empty Testtube, 1 Mole Whiskers
-546,22,228,1,7133,0,503,1,1092,1,1017,1
-//-- Condensed White Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 White Potion, 1 Empty Testtube, 1 Witched Starsand
-547,22,228,1,7133,0,504,1,1092,1,1061,1
-//----------------------------------------------
-
-//---- Skill-related Mixtures ------------------
-//-- Holy Water <-- AL_HOLYWATER & 1 Empty Bottle
-523,22,31,1,713,1
-//-- Deadly Poison Bottle <-- ASC_CDP & 1 Venom Canine, 1 Cactus Needle, 1 Bee Sting, 1 Poison Spore, 1 Karvodailnirol, 1 Berserk Potion, 1 Empty Bottle
-678,22,407,1,937,1,952,1,939,1,7033,1,972,1,657,1,713,1
-//-- Bottle Grenade <-- AM_PHARMACY & Bottle Grenade Creation Guide & 1 Alcohol, 1 Fabric, 1 Empty Bottle
-7135,22,228,1,7128,0,970,1,1059,1,713,1
-//-- Acid Bottle <-- AM_PHARMACY & Acid Bottle Creation Guide & 1 Empty Bottle, 1 Immortal Heart
-7136,22,228,1,7129,0,713,1,929,1
-//-- Plant Bottle <-- AM_PHARMACY & Plant Bottle Creation Guide & 1 Empty Bottle, 2 Maneater Blossom
-7137,22,228,1,7130,0,713,1,1032,2
-//-- Marine Sphere Bottle <-- AM_PHARMACY & Marine Sphere Creation Guide & 1 Empty Bottle, 1 Tendon, 1 Detonator
-7138,22,228,1,7131,0,713,1,1050,1,1051,1
-//-- Glistening Coat <-- AM_PHARMACY & Glistening Coat Creation Guide & 1 Alcohol, 1 Heart of Mermaid, 1 Zenorcs Fang, 1 Empty Bottle
-7139,22,228,1,7132,0,970,1,950,1,1044,1,713,1
-//----------------------------------------------
-
-//---- Elemental-resist Potions ----------------
-//-- Resist Fire Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 2 Frill, 1 Red Gemstone, 1 Empty Potion Bottle
-12118,22,228,1,7434,0,1012,2,716,1,1093,1
-//-- Resist Water Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 3 Heart of Mermaid, 1 Blue Gemstone, 1 Empty Potion Bottle
-12119,22,228,1,7434,0,950,3,717,1,1093,1
-//-- Resist Earth Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 2 Large Jellopy, 1 Yellow Gemstone, 1 Empty Potion Bottle
-12120,22,228,1,7434,0,7126,2,715,1,1093,1
-//-- Resist Wind Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 1 3 Moth Dust, 1 Blue Gemstone, 1 Empty Potion Bottle
-12121,22,228,1,7434,0,1057,3,717,1,1093,1
-//----------------------------------------------
-
-//---- Misc ------------------------------------
-//-- Anodyne <-- AM_PHARMACY & Potion Creation Guide & 1 Ment, 1 Alcohol, 1 Empty Bottle
-605,22,228,1,7144,0,708,1,970,1,713,1
-//-- Aloevera <-- AM_PHARMACY & Potion Creation Guide & 1 Aloe, 1 Honey, 1 Empty Bottle
-606,22,228,1,7144,0,704,1,518,1,713,1
-//-- Alcohol <-- AM_PHARMACY & Alcohol Creation Guide & 1 Empty Bottle, 5 Poison Spore, 5 Stem, 1 Empty Testtube
-970,22,228,1,7127,0,713,1,7033,5,905,5,1092,1
-//-- Embryo <-- AM_PHARMACY & Potion Creation Guide & 1 Seed of Life, 1 Morning Dew of Yggdrasil, 1 Glass Tube
-7142,22,228,1,7144,0,7140,1,7141,1,7143,1
-//----------------------------------------------
-
-//==============================================
-
-
-//===== Elemental Converters === ItemLV=23 =====
-
-//-- Fire Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Scorpion Tail
-12114,23,1007,1,7433,1,904,3
-//-- Water Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Snail's Shell
-12115,23,1007,1,7433,1,946,3
-//-- Earth Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Horn
-12116,23,1007,1,7433,1,947,3
-//-- Wind Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Rainbow Shell
-12117,23,1007,1,7433,1,1013,3
-
-//==============================================
+// Blacksmith and Alchemist 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, ..).
+
+
+//===== Weapon === ItemLV=1~3 ==================
+
+//---- One Handed Swords -----------------------
+//-- Sword <-- BS_SWORD & 2 Iron
+1101,1,99,1,998,2
+//-- Falchion <-- BS_SWORD & 30 Iron
+1104,1,99,1,998,30
+//-- Blade <-- BS_SWORD & 45 Iron, 25 Tooth of Bat
+1107,1,99,1,998,45,913,25
+//-- Rapier <-- BS_SWORD & 20 Steel
+1110,2,99,2,999,20
+//-- Scimiter <-- BS_SWORD & 35 Steel
+1113,2,99,2,999,35
+//-- Ring Pommel Saber <-- BS_SWORD & 40 Steel, 50 Wolf Claw
+1122,2,99,2,999,40,920,50
+//-- Saber <-- BS_SWORD & 5 Steel, 8 Oridecon, 1 Opal
+1126,3,99,3,999,5,984,8,727,1
+//-- Haedongum <-- BS_SWORD & 8 Oridecon, 10 Steel, 1 Topaz
+1123,3,99,3,984,8,999,10,728,1
+//-- Tsurugi <-- BS_SWORD & 8 Oridecon, 15 Steel, 1 Garnet
+1119,3,99,3,984,8,999,15,718,1
+//-- Flamberge <-- BS_SWORD & 16 Oridecon, 1 Cursed Ruby
+1129,3,99,3,984,16,724,1
+//----------------------------------------------
+
+//---- Daggers ---------------------------------
+//-- Knife <-- BS_DAGGER & 1 Iron, 10 Jellopies
+1201,1,98,1,998,1,909,10
+//-- Cutter <-- BS_DAGGER & 25 Iron
+1204,1,98,1,998,25
+//-- Main Gauge <-- BS_DAGGER & 50 Iron
+1207,1,98,1,998,50
+//-- Dirk <-- BS_DAGGER & 17 Steel
+1210,2,98,2,999,17
+//-- Dagger <-- BS_DAGGER & 30 Steel
+1213,2,98,2,999,30
+//-- Stiletto <-- BS_DAGGER & 40 Steel
+1216,2,98,2,999,40
+//-- Gladius <-- BS_DAGGER & 4 Oridecon, 40 Steel, 1 Sapphire
+1219,3,98,3,984,4,999,40,726,1
+//-- Damascus <-- BS_DAGGER & 4 Oridecon, 60 Steel, 1 Zircon
+1222,3,98,3,984,4,999,60,729,1
+//----------------------------------------------
+
+//---- Two Handed Swords -----------------------
+//-- Katana <-- BS_TWOHANDSWORD & 35 Iron, 15 Horrendous Mouth
+1116,1,100,1,998,35,958,15
+//-- Slayer <-- BS_TWOHANDSWORD & 25 Steel, 20 Decayed Nail
+1151,2,100,2,999,25,957,20
+//-- Bastard Sword <-- BS_TWOHANDSWORD & 45 Steel
+1154,2,100,2,999,45
+//-- Two-Handed Sword <-- BS_TWOHANDSWORD & 12 Oridecon, 10 Steel
+1157,3,100,3,984,12,999,10
+//-- Broad Sword <-- BS_TWOHANDSWORD & 12 Oridecon, 20 Steel
+1160,3,100,3,984,12,999,20
+//-- Claymore <-- BS_TWOHANDSWORD & 16 Oridecon, 20 Steel, 1 Cracked Diamond
+1163,3,100,3,984,16,999,20,733,1
+//----------------------------------------------
+
+//---- Axes ------------------------------------
+//-- Axe <-- BS_AXE & 10 Iron
+1301,1,101,1,998,10
+//-- Battle Axe <-- BS_AXE & 110 Iron
+1351,1,101,1,998,110
+//-- Hammer <-- BS_AXE & 30 Steel
+1354,2,101,2,999,30
+//-- Buster <-- BS_AXE & 4 Oridecon, 20 Steel, 30 Orcish Fang
+1357,3,101,3,984,4,999,20,922,30
+//-- Two-Handed Axe <-- BS_AXE & 8 Oridecon, 10 Steel, 1 Amthyst
+1360,3,101,3,984,8,999,10,719,1
+//----------------------------------------------
+
+//---- Maces -----------------------------------
+//-- Club <-- BS_MACE & 3 Iron
+1501,1,102,1,998,3
+//-- Mace <-- BS_MACE & 30 Iron
+1504,1,102,1,998,30
+//-- Smasher <-- BS_MACE & 20 Steel
+1507,2,102,2,999,20
+//-- Flail <-- BS_MACE & 33 Steel
+1510,2,102,2,999,33
+//-- Chain <-- BS_MACE & 45 Steel
+1519,2,102,2,999,45
+//-- Morning Star <-- BS_MACE & 85 Steel, 1 1 Carat Diamond
+1513,3,102,3,999,85,730,1
+//-- Sword Mace <-- BS_MACE & 100 Steel, 20 Sharp Scale
+1516,3,102,3,999,100,963,20
+//-- Stunner <-- BS_MACE & 120 Steel, 1 Heroic Emblem
+1522,3,102,3,999,120,968,1
+//----------------------------------------------
+
+//---- Knucklebracers --------------------------
+//-- Waghnakh <-- BS_KNUCKLE & 160 Iron, 1 Pearl
+1801,1,103,1,998,160,722,1
+//-- Knuckle Duster <-- BS_KNUCKLE & 50 Steel
+1803,2,103,2,999,50
+//-- Hora <-- BS_KNUCKLE & 65 Steel
+1805,2,103,2,999,65
+//-- Fist <-- BS_KNUCKLE & 4 Oridecon, 10 Ruby
+1807,3,103,3,984,4,723,10
+//-- Claw <-- BS_KNUCKLE & 8 Oridecon, 10 Topaz
+1809,3,103,3,984,8,728,10
+//-- Finger <-- BS_KNUCKLE & 4 Oridecon, 10 Opal
+1811,3,103,3,984,4,727,10
+//----------------------------------------------
+
+//---- Spears ----------------------------------
+//-- Javelin <-- BS_SPEAR & 3 Iron
+1401,1,104,1,998,3
+//-- Spear <-- BS_SPEAR & 35 Iron
+1404,1,104,1,998,35
+//-- Pike <-- BS_SPEAR & 70 Iron
+1407,1,104,1,998,70
+//-- Guisarme <-- BS_SPEAR & 25 Steel
+1451,2,104,2,999,25
+//-- Glaive <-- BS_SPEAR & 40 Steel
+1454,2,104,2,999,40
+//-- Partizan <-- BS_SPEAR & 55 Steel
+1457,2,104,2,999,55
+//-- Trident <-- BS_SPEAR & 8 Oridecon, 10 Steel, 5 Aquamarine
+1460,3,104,3,984,8,999,10,720,5
+//-- Halberd <-- BS_SPEAR & 12 Oridecon, 10 Steel
+1463,3,104,3,984,12,999,10
+//-- Lance <-- BS_SPEAR & 12 Oridecon, 3 Ruby, 2 Evil Horn
+1410,3,104,3,984,12,723,3,923,2
+//----------------------------------------------
+
+//==============================================
+
+
+//==============================================
+// COOKING RECIPES (LV= 11 -> 20)
+//==============================================
+
+//--------------------LEVEL 1-----------
+
+//-- Boiled Down Locust <-- 5 Grasshopper's Leg, 1 Old Frying Pan, 1 Cooking Oil
+12041,11,0,0,7472,0,940,5,7031,1,7457,1
+//-- Herb Tea With Grape Juice <-- 3 Grape, 2 Red Potion
+12046,11,0,0,7472,0,514,3,501,2
+//-- Steamed Crab Pincer <-- 10 Nipper, 10 Green Herb, 1 Yellow Potion
+12051,11,0,0,7472,0,960,10,511,10,503,1
+//-- Frog Spawn Soup <-- 1 Grain, 10 Spawn, 1 Squid Ink
+12056,11,0,0,7472,0,577,1,908,10,1024,1
+//-- Grape Juice with Honey <-- 1 Honey, 2 Grape, 1 Red Potion
+12061,11,0,0,7472,0,518,1,514,2,501,1
+//-- Fried Monkey Tail <-- 5 Yoyo Tail, 1 Old Frying Pan, 1 Cooking Oil
+12066,11,0,0,7472,0,942,5,7031,1,7457,1
+
+//--------------------LEVEL 2-----------
+
+//-- Seasoned Webs <-- 20 Cobweb, 10 Green Herb, 10 Yellow Herb, 1 Plain Sauce
+12042,12,0,0,7473,0,918,20,511,10,508,10,7454,1
+//-- Sea Food <-- 10 Clam Flesh, 5 Gill, 5 Fin, 1 Yummy Fish
+12052,12,0,0,7473,0,966,10,956,5,951,5,579,1
+//-- Black Tea <-- 5 Blue Herb, 10 Red Herb, 10 Yellow Herb
+12047,12,0,0,7473,0,510,5,507,10,508,10
+//-- Smooth Noodle <-- 1 Grain, 1 Plain Sauce, 5 Jack o' Pumpkin, 3 Carrot
+12057,12,0,0,7473,0,577,1,7454,1,1062,5,515,3
+//-- Chocolate Mousse Cake <-- 10 Cacao, 1 Piece of Cake, 1 Milk, 1 China
+12062,12,0,0,7473,0,7182,10,539,1,519,1,736,1
+//-- Mixed Juice <-- 3 Apple Juice, 2 Carrot Juice, 1 Grape Juice, 2 Orange Juice
+12067,12,0,0,7473,0,531,3,534,2,533,1,620,2
+
+
+//--------------------LEVEL 3-----------
+
+//-- Fruit Punch <-- 5 Apple, 5 Banana, 5 Orange, 5 Strawberry, 1 Yellow Spice
+12063,13,0,0,7474,0,512,5,513,5,582,5,578,5,7452,1
+//-- Herb and Honey Tea <-- 2 Honey, 10 White Herb, 1 Yellow Spice
+12048,13,0,0,7474,0,518,2,509,10,7452,1
+//-- Bomber Steak <-- 4 Meat, 1 Old Frying Pan, 10 Green Herb, 5 Red Chili, 1 Hot Sauce
+12043,13,0,0,7474,0,517,4,7031,1,511,10,7286,5,7455,1
+//-- Clam Soup <-- 20 Clam Flesh, 10 Conch, 1 Honey, 1 Sweet Sauce
+12053,13,0,0,7474,0,966,20,961,10,518,1,7453,1
+//-- Tentacle and Cheese Gratin <-- 10 Tentacle, 10 Cheese, 5 Yam, 1 Sweet Sauce
+12058,13,0,0,7474,0,962,10,548,10,549,5,7453,1
+//-- Fried Sweet Potato with Syrup <-- 10 Potato, 10 Yam, 1 Sweet Potato, 1 Sweet Sauce
+12068,13,0,0,7474,0,516,10,549,10,633,1,7453,1
+
+//--------------------LEVEL 4-----------
+
+//-- Morroc Fruit Wine <-- 10 Strawberry, 4 Lemon, 10 Orange, 2 Alcohol, 5 Grape
+12049,14,0,0,7475,0,578,10,568,4,582,10,970,2,514,5
+//-- Seasoned Jellyfish <-- 30 Tentacle, 10 White Herb, 10 Soft Blade Grass, 1 Old Frying Pan, 20 Squid Ink
+12054,14,0,0,7475,0,962,30,509,10,7194,10,7031,1,1024,20
+//-- Rib with Herbs and Spices <-- 5 Meat, 3 Red Herb, 2 Yellow Herb, 3 Green Herb, 1 Sweet Sauce, 1 Lemon
+12044,14,0,0,7475,0,517,5,507,3,508,2,511,3,7453,1,568,1
+//-- Cream Sandwich <-- 5 Bread, 15 Milk, 10 Cheese, 10 Yellow Herb, 1 Meat, 1 Sweet Sauce
+12064,14,0,0,7475,0,580,5,519,15,548,10,508,10,517,1,7453,1
+//-- Lutie Mixed Cold Noodles <-- 3 Grain, 1 Hot Sauce, 10 Ice Cubic, 10 Carrot, 10 Jack o' Pumpkin
+12059,14,0,0,7475,0,577,3,7455,1,7066,10,515,10,1062,10
+//-- Ancient Fish Dish <-- 10 Ancient Lips, 10 Raccoon Leaf, 10 White Herb,5 Yummy Fish, 2 Sweet Sauce
+12069,14,0,0,7475,0,1054,10,945,10,509,10,579,5,7453,2
+
+//--------------------LEVEL 5-----------
+
+//-- Mastela Wine <-- 4 Mastela Fruit, 1 Blue Potion, 2 Alcohol, 2 Lemon, 1 Yellow Spice
+12050,15,0,0,7476,0,522,4,505,1,970,2,568,2,7452,1
+//-- Lutie Plat Cake <-- 10 Potato, 2 Honey, 1 Cooking Oil, 3 Carrot, 1 Grain
+12045,15,0,0,7476,0,516,10,518,2,7457,1,515,3,577,1
+//-- Green Salad <-- 2 Hinalle Leaflet, 3 Aloe Leaflet, 10 Sharp Leaf, 6 Huge Leaf, 1 Sweet Sauce, 1 Yellow Spice
+12065,15,0,0,7476,0,520,2,521,3,7100,10,7198,6,7453,1,7452,1
+//-- Steamed Bat Wing and Pumpkin <-- 20 Wing of Red Bat, 20 Jack o' Pumpkin, 1 Pot, 10 Hinalle Leaflet, 10 Red Herb
+12060,15,0,0,7476,0,7006,20,1062,20,7482,1,520,10,507,10
+//-- Peppery Roasted Dumpling <-- 20 Bao, 10 Yellow Herb, 1 Hot Sauce, 1 Red Spice, 20 Green Herb
+12055,15,0,0,7476,0,553,20,508,10,7455,1,7456,1,511,20
+//-- Broiled Down Scorpion <-- 20 Scorpion Tail, 10 Bug Leg, 10 Huge Leaf, 2 Old Frying Pan, 1 Cooking Oil
+12070,15,0,0,7476,0,904,20,1042,10,7198,10,7031,2,7457,1
+
+//--------------------LEVEL 6-----------
+
+//-- Flavored Grilled Beef <-- 10 Meat, 2 Honey, 1 Yellow Herb, 1 Mastela Fruit, 20 Shining Scale
+12071,16,0,0,7477,0,517,10,518,2,508,1,522,1,954,20
+//-- Red Mushroom Wine <-- 3 Mushroom, 3 Grape Juice, 20 Mushroom Spore, 1 Alcohol, 1 Red Spice
+12076,16,0,0,7477,0,581,3,533,3,921,20,970,1,7456,1
+//-- Peach Cake <-- 20 Solid Peach, 10 Piece of Cake, 10 Cheese, 10 Milk, 5 Orange Juice, 1 Sweet Sauce
+12091,16,0,0,7477,0,7164,20,539,10,548,10,519,10,620,5,7453,1
+//-- Chili and Prawn Gratin <-- 20 Red Chile, 20 Shrimp, 1 Sweet Sauce, 20 Lemon
+12086,16,0,0,7477,0,7286,20,567,20,7453,1,568,20
+//-- Very Bitter Invigorant <-- 20 Brown Root, 10 Maneater Root, 20 Mushroom Spore, 1 Mushroom, 2 Honey
+12081,16,0,0,7477,0,7188,20,1033,10,921,20,581,1,518,2
+//-- Soup of Great Luck <-- 5 Reptile Tongue, 5 Tongue, 10 Clover, 10 Witch Starsand, 1 Aloe
+12096,16,0,0,7477,0,903,5,1015,5,705,10,1061,10,704,1
+
+//--------------------LEVEL 7-----------
+
+//-- Barbecue <-- 10 Meat, 1 Live Coal, 2 Coal, 1 Hot Sauce, 15 Trunk, 10 White Herb
+12072,17,0,0,7478,0,517,10,7098,1,1003,2,7455,1,1019,15,509,10
+//-- Royal Jelly and Herb Tea <-- 4 Royal Jelly, 2 Honey, 5 White Herb, 10 Hinalle Leaflet, 1 Yellow Spice
+12077,17,0,0,7478,0,526,4,518,2,509,5,520,10,7452,1
+//-- Soul Hunt Bread <-- 10 Bread, 5 Mastela Fruit, 1 Sweet Sauce, 5 Ment, 5 Amulet, 2 Unripe Apple
+12092,17,0,0,7478,0,580,10,522,5,7453,1,708,5,609,5,619,2
+//-- Boiled Vegetable stuffed with Roasted Crocodile <-- 10 Anolian Skin, 10 Jack o' Pumpkin, 10 Carrot, 10 Aloe Leaflet, 10 Yellow Herb, 1 Yellow Spice
+12087,17,0,0,7478,0,7003,10,1062,10,515,10,521,10,508,10
+//-- Sumptuous Feast <-- 10 Fish Tail, 5 Aloe Leaflet, 10 Mane, 2 Yummy Fish, 10 Pet Food, 1 Sweet Sauce
+12082,17,0,0,7478,0,1023,10,521,5,1028,10,579,2,537,10,7453,1
+//-- Grilled Meat Skewer <-- 10 Scale Shell, 5 Gill, 10 Soft Blade of Grass, 5 Meat, 10 Mushroom, 10 Clam Flesh
+12097,17,0,0,7478,0,936,10,956,5,7194,10,517,5,581,10,966,10
+
+//--------------------LEVEL 8-----------
+
+//-- Bear Foot Dish <-- 20 Bear's Footskin, 10 Carrot, 10 Jack o' Pumpkin, 2 Aloe Leaflet, 1 Hinalle Leaflet, 1 Plain Sauce
+12073,18,0,0,7479,0,948,20,515,10,1062,10,521,2,520,1,7454,1
+//-- Royal Tea <-- 4 Prickly Fruit, 10 Hinalle Leaflet, 3 Yggdrasil Leaf, 10 Aloe Leaflet, 6 Royal Jelly, 1 Yellow Spice
+12078,18,0,0,7479,0,576,4,520,10,610,3,521,10,526,6,7452,1
+//-- Special Toast <-- 10 Bread, 2 Royal Jelly, 5 Meat, 10 Strawberry, 1 Hot Sauce, 10 Cheese, 1 Sweet Sauce
+12093,18,0,0,7479,0,580,10,526,2,517,5,578,10,7455,1,548,10,7453,1
+//-- Very Hot Curry <-- 1 Aloevera, 1 Hot Sauce, 10 Meat, 10 Hinalle Leaflet, 10 Jack o' Pumpkin, 10 Carrot
+12088,18,0,0,7479,0,606,1,7455,1,517,10,520,10,1062,10,515,10
+//-- Huge Stuffed Leaves <-- 20 Fig Leaf, 20 Meat, 5 Rainbow Carrot, 10 Jack o' Pumpkin, 1 Plain Sauce, 2 Grain
+12083,18,0,0,7479,0,7298,20,517,20,622,5,1062,10,7454,1,577,2
+//-- Strawberry Rice Ball <-- 10 Strawberry, 5 Grain, 10 Fig Leaf, 1 Yellow Spice, 2 Red Spice, 1 Plain Sauce
+12098,18,0,0,7479,0,578,10,577,5,7298,10,7452,1,7456,2,7454,1
+
+//--------------------LEVEL 9-----------
+
+//-- Sauted Meat Strips <-- 40 Tendon, 1 Pot, 10 Cheese, 1 Hot Sauce, 2 Coal, 30 Green Herb, 10 Squid Ink
+12074,19,0,0,7480,0,1050,40,7482,1,548,10,7455,1,1003,2,511,30,1024,10
+//-- Tristan 12 <-- 10 Yggdrasil Leaf, 10 Orange, 5 Alcohol, 4 Royal Jelly, 2 Blue Potion, 1 Yellow Spice, 10 Aloe Leaflet
+12079,19,0,0,7480,0,610,10,582,10,970,5,526,4,505,2,7452,1,521,10
+//-- Ethereal Fruit Juice <-- 5 Unripe Apple, 10 Orange, 10 Strawberry, 1 Red Spice, 1 Tropica Banana, 5 Grape Juice, 2 Alcohol
+12094,19,0,0,7480,0,619,5,582,10,578,10,7456,1,634,1,533,5,970,2
+//-- Delicious Boiled Meats <-- 10 Meat, 5 Royal Jelly, 20 Shoot, 4 Plain Sauce, 5 Yellow Herb, 10 White Herb, 5 Red Herb
+12089,19,0,0,7480,0,517,10,526,5,711,20,7454,4,508,5,509,10,507,5
+//-- Ascending Dragon Broth <-- 10 Dragon Skin, 20 Dragon Tail, 3 Yggdrasil Leaf, 6 Royal Jelly, 1 Hot Sauce, 1 Red Spice, 1 Fatty Chubby Earthworm
+12084,19,0,0,7480,0,7123,10,1037,20,610,3,526,6,7455,1,7456,1,632,1
+//-- Blood Flavored Sodapop <-- 1 Animal Gore, 2 Anodyne, 2 Aloevera, 2 Alcohol, 6 Royal Jelly, 1 Red Spice, 10 Apple Juice
+12099,19,0,0,7480,0,702,1,605,2,606,2,970,2,526,6,7456,1,531,10
+
+//--------------------LEVEL 10-----------
+
+//-- Tongue Dish <-- 20 Tongue, 1 Pot, 1 Alcohol, 2 Aloevera, 1 Hot Sauce, 5 Royal Jelly, 10 Yggdrasil Leaf, 2 Blue Potion
+12075,20,0,0,7481,0,1015,20,7482,1,970,1,606,2,7455,1,526,5,610,10,505,2
+//-- Dragon Breath Cocktail <-- 10 Maneater Root, 1 Singing Plant, 5 Aloe Leaflet, 5 Royal Jelly, 5 Lemon, 5 Prickly Fruit, 1 Yggdrasilberry, 10 Blue Herb
+12080,20,0,0,7481,0,1033,10,707,1,521,5,526,5,568,5,576,5,607,1,510,10
+//-- Wine of Bergelmir <-- 1 Yggdrasilberry, 10 Ice Cubic, 10 Bacillus, 4 Royal Jelly, 3 Concentration Potion, 5 Alcohol, 2 Prickly Fruit, 1 Illusion Flower
+12095,20,0,0,7481,0,607,1,7066,10,7119,10,526,4,645,3,970,5,576,2,710,1
+//-- Hot Sand Steamed Scorpion <-- 20 Scorpion Tail, 20 Scorpion Claw, 2 Aloevera, 3 Yggdrasil Leaf, 3 Bitter Herb, 10 Royal Jelly , 1 Hot Sauce, 1 Pot
+12090,20,0,0,7481,0,904,20,7125,20,606,2,610,3,621,3,526,10,7455,1,7482,1
+//-- Stew of Immortality <-- 20 Immortal Heart, 10 Memento, 1 Yggdrasil Seed, 2 Anodyne, 10 Heart of Mermaid, 2 Hot Sauce, 10 Amulet, 2 Bitter Herb
+12085,20,0,0,7481,0,929,20,934,10,608,1,605,2,950,10,7455,2,609,10,621,2
+//-- Nine Tail Dish <-- 10 Nine Tails, 2 Four Leaf Clover, 10 Maneater Root, 10 Sharp Leaf, 4 Yggdrasil Leaf, 1 Plain Sauce, 1 Yellow Spice, 2 Izidor
+12100,20,0,0,7481,0,1022,10,706,2,1033,10,7100,10,610,4,7454,1,7452,1,709,2
+//==============================================
+
+
+//===== Stones and Metals === ItemLV=21 ========
+
+//---- Metals ----------------------------------
+//-- Iron <-- BS_IRON & 1 Iron Ore
+998,21,94,1,1002,1
+//-- Steel <-- BS_STEEL & 5 Iron, 1 Coal
+999,21,95,1,998,5,1003,1
+//----------------------------------------------
+
+
+//---- Enchanted Stones ------------------------
+//-- Star Crumb <-- BS_ENCHANTSTONE & 10 Star Dust
+1000,21,96,1,1001,10
+//-- Flame Heart <-- BS_ENCHANTSTONE & 10 Red Blood
+994,21,96,1,990,10
+//-- Mystic Frozen <-- BS_ENCHANTSTONE & 10 Crystal Blue
+995,21,96,1,991,10
+//-- Rough Wind <-- BS_ENCHANTSTONE & 10 Wind of Verdure
+997,21,96,1,993,10
+//-- Great Nature <-- BS_ENCHANTSTONE & 10 Green Live
+996,21,96,1,992,10
+//----------------------------------------------
+
+//==============================================
+
+
+//===== Potions === ItemLV=22 ==================
+
+//---- Health Potions --------------------------
+//-- Red Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Red Herb, 1 Empty Potion Bottle
+501,22,228,1,7144,0,507,1,1093,1
+//-- Yellow Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Yellow Herb, 1 Empty Potion Bottle
+503,22,228,1,7144,0,508,1,1093,1
+//-- White Potion <-- AM_PHARMACY & Potion Creation Guide & 1 White Herb, 1 Empty Potion Bottle
+504,22,228,1,7144,0,509,1,1093,1
+//-- Blue Potion <-- AM_PHARMACY & Potion Creation Guide & 1 Blue Herb, 1 Scell, 1 Empty Potion Bottle
+505,22,228,1,7144,0,510,1,911,1,1093,1
+//-- Condensed Red Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 Red Potion, 1 Empty Testtube, 1 Cactus Needle
+545,22,228,1,7133,0,501,1,1092,1,952,1
+//-- Condensed Yellow Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 Yellow Potion, 1 Empty Testtube, 1 Mole Whiskers
+546,22,228,1,7133,0,503,1,1092,1,1017,1
+//-- Condensed White Potion <-- AM_PHARMACY & Condensed Potion Creation Guide & 1 White Potion, 1 Empty Testtube, 1 Witched Starsand
+547,22,228,1,7133,0,504,1,1092,1,1061,1
+//----------------------------------------------
+
+//---- Skill-related Mixtures ------------------
+//-- Holy Water <-- AL_HOLYWATER & 1 Empty Bottle
+523,22,31,1,713,1
+//-- Deadly Poison Bottle <-- ASC_CDP & 1 Venom Canine, 1 Cactus Needle, 1 Bee Sting, 1 Poison Spore, 1 Karvodailnirol, 1 Berserk Potion, 1 Empty Bottle
+678,22,407,1,937,1,952,1,939,1,7033,1,972,1,657,1,713,1
+//-- Bottle Grenade <-- AM_PHARMACY & Bottle Grenade Creation Guide & 1 Alcohol, 1 Fabric, 1 Empty Bottle
+7135,22,228,1,7128,0,970,1,1059,1,713,1
+//-- Acid Bottle <-- AM_PHARMACY & Acid Bottle Creation Guide & 1 Empty Bottle, 1 Immortal Heart
+7136,22,228,1,7129,0,713,1,929,1
+//-- Plant Bottle <-- AM_PHARMACY & Plant Bottle Creation Guide & 1 Empty Bottle, 2 Maneater Blossom
+7137,22,228,1,7130,0,713,1,1032,2
+//-- Marine Sphere Bottle <-- AM_PHARMACY & Marine Sphere Creation Guide & 1 Empty Bottle, 1 Tendon, 1 Detonator
+7138,22,228,1,7131,0,713,1,1050,1,1051,1
+//-- Glistening Coat <-- AM_PHARMACY & Glistening Coat Creation Guide & 1 Alcohol, 1 Heart of Mermaid, 1 Zenorcs Fang, 1 Empty Bottle
+7139,22,228,1,7132,0,970,1,950,1,1044,1,713,1
+//----------------------------------------------
+
+//---- Elemental-resist Potions ----------------
+//-- Resist Fire Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 2 Frill, 1 Red Gemstone, 1 Empty Potion Bottle
+12118,22,228,1,7434,0,1012,2,716,1,1093,1
+//-- Resist Water Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 3 Heart of Mermaid, 1 Blue Gemstone, 1 Empty Potion Bottle
+12119,22,228,1,7434,0,950,3,717,1,1093,1
+//-- Resist Earth Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 2 Large Jellopy, 1 Yellow Gemstone, 1 Empty Potion Bottle
+12120,22,228,1,7434,0,7126,2,715,1,1093,1
+//-- Resist Wind Potion <-- AM_PHARMACY & Elemental Potion Creation Guide & 1 3 Moth Dust, 1 Blue Gemstone, 1 Empty Potion Bottle
+12121,22,228,1,7434,0,1057,3,717,1,1093,1
+//----------------------------------------------
+
+//---- Misc ------------------------------------
+//-- Anodyne <-- AM_PHARMACY & Potion Creation Guide & 1 Ment, 1 Alcohol, 1 Empty Bottle
+605,22,228,1,7144,0,708,1,970,1,713,1
+//-- Aloevera <-- AM_PHARMACY & Potion Creation Guide & 1 Aloe, 1 Honey, 1 Empty Bottle
+606,22,228,1,7144,0,704,1,518,1,713,1
+//-- Alcohol <-- AM_PHARMACY & Alcohol Creation Guide & 1 Empty Bottle, 5 Poison Spore, 5 Stem, 1 Empty Testtube
+970,22,228,1,7127,0,713,1,7033,5,905,5,1092,1
+//-- Embryo <-- AM_PHARMACY & Potion Creation Guide & 1 Seed of Life, 1 Morning Dew of Yggdrasil, 1 Glass Tube
+7142,22,228,1,7144,0,7140,1,7141,1,7143,1
+//----------------------------------------------
+
+//==============================================
+
+
+//===== Elemental Converters === ItemLV=23 =====
+
+//-- Fire Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Scorpion Tail
+12114,23,1007,1,7433,1,904,3
+//-- Water Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Snail's Shell
+12115,23,1007,1,7433,1,946,3
+//-- Earth Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Horn
+12116,23,1007,1,7433,1,947,3
+//-- Wind Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Rainbow Shell
+12117,23,1007,1,7433,1,1013,3
+
+//==============================================
diff --git a/db/refine_db.txt b/db/refine_db.txt
index 5d7f752e1..62fc5a174 100644
--- a/db/refine_db.txt
+++ b/db/refine_db.txt
@@ -1,12 +1,12 @@
-// Database for upgrading items.
-// Stats per level for safe upgrade, Stats per level after safe limit, Safe level limit, Lv.1 %, Lv 2 %, Lv.3%, ect...
-// Armor defense is done in percentage (ie 70 = .7 def)
-// Weapons are whole numbers (ie 3 = 3 atk)
-
- 70, 4,4, 100,100,100,100, 60, 40, 40, 20, 20, 10, // Armor
- 2, 3,7, 100,100,100,100,100,100,100, 60, 40, 20, // Lv.1 Weapons
- 3, 5,6, 100,100,100,100,100,100, 60, 40, 20, 20, // Lv.2 Weapons
- 5, 8,5, 100,100,100,100,100, 60, 50, 20, 20, 20, // Lv.3 Weapons
- 7,13,4, 100,100,100,100, 60, 40, 40, 20, 20, 10, // Lv.4 Weapons
-
-
+// Database for upgrading items.
+// Stats per level for safe upgrade, Stats per level after safe limit, Safe level limit, Lv.1 %, Lv 2 %, Lv.3%, ect...
+// Armor defense is done in percentage (ie 70 = .7 def)
+// Weapons are whole numbers (ie 3 = 3 atk)
+
+ 70, 4,4, 100,100,100,100, 60, 40, 40, 20, 20, 10, // Armor
+ 2, 3,7, 100,100,100,100,100,100,100, 60, 40, 20, // Lv.1 Weapons
+ 3, 5,6, 100,100,100,100,100,100, 60, 40, 20, 20, // Lv.2 Weapons
+ 5, 8,5, 100,100,100,100,100, 60, 50, 20, 20, 20, // Lv.3 Weapons
+ 7,13,4, 100,100,100,100, 60, 40, 40, 20, 20, 10, // Lv.4 Weapons
+
+
diff --git a/db/size_fix.txt b/db/size_fix.txt
index 3d33666fa..7ca8577f4 100644
--- a/db/size_fix.txt
+++ b/db/size_fix.txt
@@ -1,7 +1,7 @@
-// Database for size fix for weapon damage.
-
-//Columns: Weapon type, Rows: Target size.
-//Bare Fist,Knife,1H Sword, 2H Sword,1H Spear, 2H Spears, 1H Axe, 2H Axe, Mace, ?, Staff, Bow, Knuckle, Musical Instrument, Whip, Book, Katar, Revolver, Rifle, Shotgun, Gatling Gun, Grenade Launcher, Fuuma Shuriken
-100,100, 75, 75, 75, 75, 50, 50, 75,100,100,100,100, 75, 75,100, 75,100,100,100,100,100,100, // Size: Small
-100, 75,100, 75, 75, 75, 75, 75,100,100,100,100, 75,100,100,100,100,100,100,100,100,100,100, // Size: Medium
-100, 50, 75,100,100,100,100,100,100,100,100, 75, 50, 75, 50, 50, 75,100,100,100,100,100,100, // Size: Large
+// Database for size fix for weapon damage.
+
+//Columns: Weapon type, Rows: Target size.
+//Bare Fist,Knife,1H Sword, 2H Sword,1H Spear, 2H Spears, 1H Axe, 2H Axe, Mace, ?, Staff, Bow, Knuckle, Musical Instrument, Whip, Book, Katar, Revolver, Rifle, Shotgun, Gatling Gun, Grenade Launcher, Fuuma Shuriken
+100,100, 75, 75, 75, 75, 50, 50, 75,100,100,100,100, 75, 75,100, 75,100,100,100,100,100,100, // Size: Small
+100, 75,100, 75, 75, 75, 75, 75,100,100,100,100, 75,100,100,100,100,100,100,100,100,100,100, // Size: Medium
+100, 50, 75,100,100,100,100,100,100,100,100, 75, 50, 75, 50, 50, 75,100,100,100,100,100,100, // Size: Large
diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt
index 11c3284b1..6c64f0120 100644
--- a/db/skill_cast_db.txt
+++ b/db/skill_cast_db.txt
@@ -1,1011 +1,1011 @@
-// Skill Times Database
-//
-// Structure of Database:
-// SkillID,CastingTime,AfterCastActDelay,AfterCastWalkDelay,Duration1,Duration2
-//
-//==========================================
-// Rough list of Contents:
-//==========================================
-// 1. 1st Jobs Skills
-// 2. 2-1 Jobs Skills
-// 3. 1st Jobs Quest Skills
-// 4. NPC Skills (1)
-// 5. 2-2 Jobs Skills
-// 6. Wedding Skills
-// 7. NPC Skills (2)
-// 8. Advanced Jobs Skills (1)
-// 9. Adoption Skills
-// 10. Taekwon Jobs Skills (1)
-// 11. Advanced Jobs Skills (2)
-// 12. Taekwon Jobs Skills (2)
-// 13. 2nd Jobs Quest Skills
-// 14. Guild Skills
-//==========================================
-// This is just a rough overview to help
-// giving an overview on the document and
-// help navigating through it. (Vedurin)
-//==========================================
-
-
-
-
-
-//===== Swordman ===========================
-//-- SM_PROVOKE
-6,0,0,0,30000,0
-//-- SM_MAGNUM
-7,0,0,0,2000,10000
-//-- SM_ENDURE
-8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,10000
-//==========================================
-
-
-//===== Mage ===============================
-//-- MG_SIGHT
-10,0,0,0,10000,0
-//-- MG_NAPALMBEAT
-11,1000,1000:1000:1000:900:900:800:800:700:600:500,0,0,0
-//-- MG_SAFETYWALL
-12,4000:3500:3500:2500:2000:1500:1000:1000:1000:1000,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
-//-- MG_SOULSTRIKE
-13,500,1200:1000:1400:1200:1600:1400:1800:1600:2000:1800,0,0,0
-//-- MG_COLDBOLT
-14,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
-//-- MG_FROSTDRIVER
-15,800,1500,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000
-//-- MG_STONECURSE
-16,1000,0,0,5000,11000:12000:13000:14000:15000:16000:17000:18000:19000:20000
-//-- MG_FIREBALL
-17,1500:1500:1500:1500:1500:1000:1000:1000:1000:1000,1500:1500:1500:1500:1500:1000:1000:1000:1000:1000,0,0,0
-//-- MG_FIREWALL
-18,2000:1850:1700:1550:1400:1250:1100:950:800:650,0,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0
-//-- MG_FIREBOLT
-19,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
-//-- MG_LIGHTNINGBOLT
-20,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
-//-- MG_THUNDERSTORM
-21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,0,500,0
-//==========================================
-
-
-//===== Acolyte ============================
-//-- AL_RUWACH
-24,0,0,0,10000,0
-//-- AL_PNEUMA
-25,0,0,0,10000,0
-//-- AL_TELEPORT
-26,0,0,0,0,0
-//-- AL_WARP
-27,1000,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
-//-- AL_HEAL
-28,0,1000,0,0,0
-//-- AL_INCAGI
-29,1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
-//-- AL_DECAGI
-30,1000,1000,0,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000,0
-//-- AL_HOLYWATER
-31,1000,500,0,0,0
-//-- AL_CRUCIS
-32,500,2000,0,0,0
-//-- AL ANGELUS
-33,500,3500,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//-- AL_BLESSING
-34,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
-//-- AL_CURE
-35,0,1000,0,0,6000
-//==========================================
-
-
-//===== Archer =============================
-//-- AC_CONCENTRATION
-45,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
-//-- AC_DOUBLE
-46,0,100,0,100,0
-//-- AC_SHOWER
-47,0,100,0,100,0
-//==========================================
-
-
-//===== Thief ==============================
-//-- TF_HIDING
-51,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//-- TF_POISON
-52,0,100,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//==========================================
-
-
-//===== First planned to be shared =========
-//-- ALL_RESURRECTION
-54,6000:4000:2000:0,0:1000:2000:3000,0,0,0
-//==========================================
-
-
-//===== Knight =============================
-//-- KN_BRANDISHSPEAR
-57,700,0,0,0,0
-
-//-- KN_SPEARBOOMERANG
-59,0,1000,0,0,0
-//-- KN_TWOHANDQUICKEN
-60,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//-- KN_AUTOCOUNTER
-61,0,0,0,400:800:1200:1600:2000,0
-//-- KN_BOWLINGBASH
-62,700,0,0,0,0
-//==========================================
-
-
-//===== Priest =============================
-//-- PR_IMPOSITIO
-66,0,3000,0,60000,0
-//-- PR_SUFFRAGIUM
-67,0,2000,0,30000:20000:10000,0
-//-- PR_ASPERSIO
-68,0,2000,0,60000:90000:120000:150000:180000,0
-//-- PR_BENEDICTIO
-69,0,0,0,40000:80000:120000:160000:200000,0
-//-- PR_SANCTUARY
-70,5000,0,0,4000:7000:10000:13000:16000:19000:22000:25000:28000:31000,0
-//-- PR_SLOWPOISON
-71,0,0,0,10000:20000:30000:40000,0
-//-- PR_STRECOVERY
-72,0,2000,0,0,30000
-//-- PR_KYRIE
-73,2000,2000,0,120000,0
-//-- PR_MAGNIFICAT
-74,4000,2000,0,30000:45000:60000:75000:90000,0
-//-- PR_GLORIA
-75,0,2000,0,10000:15000:20000:25000:30000,0
-//-- PR_LEXDIVINA
-76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0
-//-- PR_TURNUNDEAD
-77,1000,3000,0,0,0
-//-- PR_LEXAETERNA
-78,0,3000,0,600000,0
-//-- PR_MAGNUS
-79,15000,4000,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0
-//==========================================
-
-
-//===== Wizard =============================
-//-- WZ_FIREPILLAR
-80,3000:2700:2400:2100:1800:1500:1200:900:600:300,1000,0,30000,0
-//-- WZ_SIGHTRASHER
-81,700,2000,0,500,0
-
-//-- WZ_METEOR
-83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,500,3000
-//-- WZ_JUPITEL
-84,2500:3000:3500:4000:4500:5000:5500:6000:6500:7000,0,0,0,0
-//-- WZ_VERMILION
-85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,4000,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000
-//-- WZ_WATERBALL
-86,1000:2000:3000:4000:5000,0,0,0,0
-//-- WZ_ICEWALL
-87,0,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
-//-- WZ_FROSTNOVA
-88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,0,1500:3000:4500:6000:7500:9000:10500:12000:13500:15000
-//-- WZ_STORMGUST
-89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,4600,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- WZ_EARTHSPIKE
-90,1000:2000:3000:4000:5000,700,0,0,0
-//-- WZ_HEAVENDRIVE
-91,1000:2000:3000:4000:5000,700,0,500,0
-//-- WZ_QUAGMIRE
-92,0,1000,0,5000:10000:15000:20000:25000,5000:10000:15000:20000:25000
-//==========================================
-
-
-//===== Blacksmith =========================
-//-- BS_REPAIRWEAPON
-108,7500,0,0,0,0
-//-- BS_HAMMERFALL
-110,0,0,0,0,5000
-//-- BS_ADRENALINE
-111,0,0,0,30000:60000:90000:120000:150000,0
-//-- BS_WEAPONPEFECT
-112,0,0,0,10000:20000:30000:40000:50000,0
-//-- BS_OVERTHRUST
-113,0,0,0,20000:40000:60000:80000:100000,0
-//-- BS_MAXIMIZE
-114,0,0,0,1000:2000:3000:4000:5000,0
-//==========================================
-
-
-//===== Hunter =============================
-//-- HT_SKIDTRAP
-115,0,0,0,300000:240000:180000:120000:60000,0
-//-- HT_LANDMINE
-116,0,0,0,200000:160000:120000:80000:40000,3000
-//-- HT_ANKLESNARE
-117,0,0,0,250000:200000:150000:100000:50000,4000:8000:12000:16000:20000
-//-- HT_SHOCKWAVE
-118,0,0,0,200000:160000:120000:80000:40000,0
-//-- HT_SANDMAN
-119,0,0,0,150000:120000:90000:60000:30000,12000:14000:16000:18000:20000
-//-- HT_FLASHER
-120,0,0,0,150000:120000:90000:60000:30000,10000:11000:12000:13000:14000
-//-- HT_FREEZINGTRAP
-121,0,0,0,150000:120000:90000:60000:30000,3000:6000:9000:12000:15000
-//-- HT_BLASTMINE
-122,0,0,0,25000:20000:15000:10000:5000,0
-//-- HT_CLAYMORETRAP
-123,0,0,0,20000:40000:60000:80000:100000,0
-
-//-- HT_TALKIEBOX
-125,0,0,0,600000,0
-
-//-- HT_BLITZBEAT
-129,1500,1000,0,0,0
-//==========================================
-
-
-//===== Assassin ===========================
-//-- AS_CLOAKING
-135,0,0,0,500:1000:2000:3000:4000:5000:6000:7000:8000:9000,0
-//-- AS_SONICBLOW
-136,0,2000,2000,0,3000
-//-- AS_GRIMTOOTH
-137,0,0,0,0,1000
-//-- AS_ENCHANTPOISON
-138,0,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,10000:20000:30000:40000:50000:60000:70000:80000:90000:100000
-//-- AS_POISONREACT
-139,0,0,0,20000:25000:30000:35000:40000:45000:50000:55000:60000:65000,0
-//-- AS_VENOMDUST
-140,0,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- AS_SPLASHER
-141,1000,0,0,11000:10000:9000:8000:7000:6000:5000:4000:3000:2000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-
-//==========================================
-
-
-//===== 1st Jobs Quest Skills===============
-//-- NV_TRICKDEAD
-143,0,0,0,600000,0
-
-//-- SM_FATALBLOW
-145,0,0,0,0,3000
-
-//-- AC_CHARGEARROW
-148,1500,0,0,0,0
-//-- TF_SPRINKLESAND
-149,0,0,0,0,10000
-
-//-- TF_PICKSTONE
-151,500,0,0,0,0
-//-- TF_THROWSTONE
-152,0,100,0,3000,8000
-
-//-- MC_LOUD
-155,0,0,0,300000,0
-//-- AL_HOLYLIGHT
-156,2000,0,0,0,0
-//-- MG_ENERGYCOAT
-157,5000,0,0,300000,0
-//==========================================
-
-
-//===== NPC Skills Part 1 ==================
-//-- NPC_ATTRICHANGE
-161,0,0,0,1800000,0
-//-- NPC_CHANGEWATER
-162,0,0,0,1800000,0
-//-- NPC_CHANGEGROUND
-163,0,0,0,1800000,0
-//-- NPC_CHANGEFIRE
-164,0,0,0,1800000,0
-//-- NPC_CHANGEWIND
-165,0,0,0,1800000,0
-//-- NPC_CHANGEPOISON
-166,0,0,0,1800000,0
-//-- NPC_CHANGEHOLY
-167,0,0,0,1800000,0
-//-- NPC_CHANGEDARKNESS
-168,0,0,0,1800000,0
-//-- NPC_CHANGETELEKINESIS
-169,0,0,0,1800000,0
-
-//-- NPC_SELFDESTRUCTION
-173,0,0,0,3500,0
-
-//-- NPC_POISON
-176,0,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NPC_BLINDATTACK
-177,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- NPC_SILENCEATTACK
-178,0,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000
-//-- NPC_STUNATTACK
-179,0,0,0,0,3000
-//-- NPC_PETRIFYATTACK
-180,0,0,0,5000,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- NPC_CURSEATTACK
-181,0,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NPC_SLEEPATTACK
-182,0,0,0,0,8000:10000:12000:14000:16000:18000:20000:22000:24000:26000
-
-//-- NPC_KEEPING
-201,0,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0
-
-//-- NPC_BARRIER
-204,0,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0
-
-//-- NPC_LICK
-206,0,0,0,0,3000
-//-- NPC_HALLUCINATION
-207,0,0,0,30000:40000:50000:60000:70000:80000:90000:100000:110000:120000,0
-//==========================================
-
-
-//===== Rogue ==============================
-//-- RG_BACKSTAB
-212,0,500,0,0,0
-
-//-- RG_RAID
-214,0,0,0,3000,8000:9000:10000:11000:12000
-//-- RG_STRIPEWEAPON
-215,1000,1000,0,75000:90000:105000:120000:135000,0
-//-- RG_STRIPSHIELD
-216,1000,1000,0,75000:90000:105000:120000:135000,0
-//-- RG_STRIPWEAPON
-217,1000,1000,0,75000:90000:105000:120000:135000,0
-//-- RG_STRIPHELM
-218,1000,1000,0,75000:90000:105000:120000:135000,0
-
-//-- RG_GRAFITTI
-220,0,0,0,180000,0
-//==========================================
-
-
-//===== Alchemist ==========================
-//-- AM_DEMONSTRATION
-229,1000,0,0,40000:45000:50000:55000:60000,0
-//-- AM_ACIDTERROR
-230,1000,0,0,3:7:10:12:13,120000
-//-- AM_POTIONPITCHER
-231,0,500,0,0,0
-//-- AM_CANNIBALIZE
-232,2000,500,0,300000:240000:180000:120000:60000,0
-//-- AM_SPHEREMINE
-233,2000,500,0,40000:50000:60000:70000:80000,0
-//-- AM_CP_WEAPON
-234,2000,0,0,120000:240000:360000:480000:600000,0
-//-- AM_CP_SHIELD
-235,2000,0,0,120000:240000:360000:480000:600000,0
-//-- AM_CP_ARMOR
-236,2000,0,0,120000:240000:360000:480000:600000,0
-//-- AM_CP_HELM
-237,2000,0,0,120000:240000:360000:480000:600000,0
-//==========================================
-//-- AM_CALLHOMUNCULUS
-243,0,0,0,0,0
-//-- AM_REST
-244,0,0,0,0,0
-//-- AM_RESURRECTHOMUN
-247,2000,0,0,0,0
-//==========================================
-
-
-//===== Crusader ===========================
-//-- CR_AUTOGUARD
-249,0,0,0,300000,0
-//-- CR_SHIELDCHARGE
-250,0,0,0,0,3000
-//-- CR_SHIELDBOOMERANG
-251,0,700,0,0,0
-//-- CR_REFLECTSHIELD
-252,0,0,0,300000,0
-//-- CR_HOLYCROSS
-253,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- CR_GRANDCROSS
-254,2000,1500,900,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- CR_DEVOTION
-255,3000,0,0,0,30000:45000:60000:75000:90000
-//-- CR_PROVIDENCE
-256,3000,0,0,180000,0
-//-- CR_DEFENDER
-257,0,800,0,180000,0
-//-- CR_SPEARQUICKEN
-258,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//==========================================
-
-
-//===== Monk ===============================
-//-- MO_CALLSPIRITS
-261,1000,0,0,600000,0
-//-- MO_ABSORBSPIRITS
-262,2000,0,0,0,0
-//-- MO_TRIPLEATTACK
-263,0,1000,0,0,0
-//-- MO_INVESTIGATE
-266,1000,500,0,0,0
-//-- MO_FINGEROFFENSIVE
-267,1000,500,0:200:400:600:800,0,0
-//-- MO_STEELBODY
-268,5000,0,0,30000:60000:90000:120000:150000,0
-//-- MO_BLADESTOP
-269,0,0,0,500:700:900:1100:1300,20000:30000:40000:50000:60000
-//-- MO_EXPLOSIONSPIRITS
-270,0,0,0,180000,0
-//-- MO_EXTREMITYFIST
-271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,0,300000
-//-- MO_CHAINCOMBO
-272,0,1000,0,0,0
-//-- MO_COMBOFINISH
-273,0,700,0,0,0
-//==========================================
-
-//===== Sage ===============================
-//-- SA_MAGICROD
-276,0,1500,0,400:600:800:1000:1200,0
-//-- SA_SPELLBREAKER
-277,700,0,0,0,0
-
-//-- SA_AUTOSPELL
-279,3000,0,0,120000:150000:180000:210000:240000:270000:300000:330000:360000:390000,0
-//-- SA_FLAMELAUNCHER
-280,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
-//-- SA_FROSTWEAPON
-281,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
-//-- SA_LIGHTNINGLOADER
-282,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
-//-- SA_SEISMICWEAPON
-283,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
-
-//-- SA_VOLCANO
-285,5000,0,0,60000:120000:180000:240000:300000,0
-//-- SA_DELUGE
-286,5000,0,0,60000:120000:180000:240000:300000,0
-//-- SA_VIOLENTGALE
-287,5000,0,0,60000:120000:180000:240000:300000,0
-//-- SA_LANDPROTECTOR
-288,5000,0,0,120000:165000:210000:245000:300000,0
-//-- SA_DISPELL
-289,2000,0,0,0,0
-//-- SA_REVERSEORCISH
-294,0,0,0,1200000,0
-//==========================================
-
-
-//===== Bard & Dancer (Ensemble Skills) ====
-//-- BD_ADAPTATION
-304,0,0,0,0,5000
-
-//-- BD_LULLABY
-306,0,0,0,60000,15000
-//-- BD_RICHMANKIM
-307,0,0,0,60000,60000
-//-- BD_ETERNALCHAOS
-308,0,0,0,60000,60000
-//-- BD_DRUMBATTLEFIELD
-309,0,0,0,60000,60000
-//-- BD_RINGNIBELUNGEN
-310,0,0,0,60000,60000
-//-- BD_ROKISWEIL
-311,0,0,0,60000,60000
-//-- BD_INTOABYSS
-312,0,0,0,60000,60000
-//-- BD_SIEGFRIED
-313,0,0,0,60000,60000
-//==========================================
-
-
-//===== Bard ===============================
-//-- BA_MUSICALSTRIKE
-316,1500,0,0,0,0
-//-- BA_DISSONANCE
-317,0,0,0,30000,3000
-//-- BA_FROSTJOKE
-318,0,3000,0,0,10000:11000:12000:13000:14000
-//-- BA_WHISTLE
-319,0,0,0,60000,20000
-//-- BA_ASSASSINCROSS
-320,0,0,0,120000,20000
-//-- BA_POEMBRAGI
-321,0,0,0,180000,20000
-//-- BA_APPLEIDUN
-322,0,0,0,180000,20000
-//==========================================
-
-
-//===== Dancer =============================
-//-- DC_THROWARROW
-324,1500,0,0,0,0
-//-- DC_UGLYDANCE
-325,0,0,0,30000,3000
-//-- DC_SCREAM
-326,0,3000,0,0,5000
-//-- DC_HUMMING
-327,0,0,0,60000,20000
-//-- DC_DONTFORGETME
-328,0,0,0,180000,20000
-//-- DC_FORTUNEKISS
-329,0,0,0,120000,20000
-//-- DC_SERVICEFORYOU
-330,0,0,0,180000,20000
-//==========================================
-
-
-//===== Wedding Skills =====================
-//-- WE_MALE
-334,3000,0,0,0,0
-//-- WE_FEMALE
-335,3000,0,0,0,0
-//-- WE_CALLPARTNER
-336,0,0,0,20000,0
-//==========================================
-
-
-//===== NPC Skills Part 2 ==================
-//-- NPC_DARKGRANDNESS
-339,2000,1500,900,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- NPC_STOP
-342,0,0,0,10000,0
-//-- NPC_CHANGEUNDEAD
-348,0,0,0,30000,0
-//-- NPC_POWERUP
-349,0,0,0,60000:120000:180000:240000:300000,0
-//-- NPC_AGIUP
-350,0,0,0,60000:120000:180000:240000:300000,0
-//-- NPC_INVISIBLE
-353,0,0,0,30000,0
-//-- NPC_RUN
-354,0,0:500:1000:1500:2000:2500,0,0,0
-//==========================================
-
-
-//===== Lord Knight ========================
-//-- LK_AURABLADE
-355,0,0,0,40000:60000:80000:100000:120000,0
-//-- LK_PARRYING
-356,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0
-//-- LK_CONCENTRATION
-357,0,0,0,25000:30000:35000:40000:45000,0
-//-- LK_TENSIONRELAX
-358,0,0,0,180000,0
-//-- LK_BERSERK
-359,0,0,0,300000,15000
-//-- LK_FURY
-360,0,0,0,300000,0
-//==========================================
-
-
-//===== High Priest ========================
-//-- HP_ASSUMPTIO
-361,1000:1500:2000:2500:3000,1100:1200:1300:1400:1500,0,20000:40000:60000:80000:100000,0
-//-- HP_BASILICA
-362,5000:6000:7000:8000:9000,2000:3000:4000:5000:6000,0,20000:25000:30000:35000:40000,20000:25000:30000:35000:40000
-//==========================================
-
-
-//===== High Wzard =========================
-//-- HW_MAGICCRASHER
-365,300,300,0,0,0
-//-- HW_MAGICPOWER
-366,700,0,0,30000,0
-//==========================================
-
-
-//===== Paladin ============================
-//-- PA_PRESSURE
-367,2000:2500:3000:3500:4000,2000:2500:3000:3500:4000,0,0,2000:3000:4000:5000:6000
-//-- PA_SACRIFICE
-368,0,2000,0,0,0
-//-- PA_GOSPEL
-369,0,0,0,60000,60000
-//==========================================
-
-
-//===== Champion ===========================
-//-- CH_PALMSTRIKE
-370,0,300,0,0,0
-//-- CH_TIGERFIST
-371,0,700,0,0,2000:4000:6000:8000:10000
-//-- CH_CHAINCRUSH
-372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,0
-//==========================================
-
-
-//===== Professor ==========================
-//-- PF_HPCONVERSION
-373,0,1000:1200:1400:1600:1800,0,0,0
-//-- PF_SOULCHANGE
-374,3000,5000,0,0,0
-//-- PF_SOULBURN
-375,0,0,0,0,0
-//==========================================
-
-
-//===== Assassin Cross =====================
-//-- ASC_EDP
-378,0,2000,0,20000:30000:40000:50000:60000,20000:30000:40000:50000:60000
-//-- ASC_BREAKER
-379,700,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
-//==========================================
-
-
-//===== Sniper =============================
-//-- SN_SIGHT
-380,0,0,0,30000,0
-//-- SN_FALCONASSAULT
-381,1000,3000,0,0,0,0
-//-- SN_SHARPSHOOTING
-382,2000,1500,0,0,0
-//-- SN_WINDWALK
-383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,2000,0,130000:160000:190000:220000:250000:280000:310000:340000:370000:400000,0
-//==========================================
-
-
-//===== Whitesmith =========================
-//-- WS_MELTDOWN
-384,500:500:600:600:700:700:800:800:900:1000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,5000
-
-//-- WS_CARTBOOST
-387,0,0,0,60000,0
-//==========================================
-
-
-//===== Stalker ============================
-//-- ST_CHASEWALK
-389,0,0,0,10000,30000
-//-- ST_REJECTSWORD
-390,0,0,0,300000,0
-//==========================================
-
-
-//===== Clown / Gypsy ======================
-//-- CG_ARROWVULCAN
-394,2000:2200:2400:2600:2800:3000:3200:3400:3600:3800,2800:2800:2800:2800:2800:3000:3000:3000:3000:3000,2000,0,0
-//-- CG_MOONLIT
-395,0,0,0,20000:25000:30000:35000:40000,0
-//-- CG_MARIONETTE
-396,0,0,0,300000,0
-//==========================================
-
-//===== Mixed Advanced Skills ==============
-//-- LK_SPIRALPIERCE
-397,300:500:700:900:1000,1200:1400:1600:1800:2000,0,0,1000
-//-- LK_HEADCRUSH
-398,0,500,0,0,120000
-//-- LK_JOINTBEAT
-399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,30000
-//-- HW_NAPALMVULCAN
-400,1700,1000,0,0,45000
-//-- CH_SOULCOLLECT
-401,2000,0,0,600000,0
-//-- PF_MINDBREAKER
-402,0,800:900:1000:1100:1200,0,30000,0
-//-- PF_MEMORIZE
-403,5000,0,0,0,0
-//-- PF_FOGWALL
-404,0,0,0,20000,10000
-//-- PF_SPIDERWEB
-405,0,0,0,30000,8000
-//-- ASC_METEORASSAULT (Upkeep2 times are duration of: blind(lv1), stun(lv2) or bleeding (lv3)
-406,500,500,0,0,10000:3000:120000
-//-- ASC_CDP
-407,0,500,0,0,0
-//==========================================
-
-
-//===== Adoption Skills ====================
-//-- WE_BABY
-408,3000,0,0,300000,0
-//-- WE_CALLPARENT
-409,0,0,0,20000,0
-//-- WE_CALLBABY
-410,0,0,0,20000,0
-//==========================================
-
-
-//===== Taekwon ============================
-//-- TK_RUN
-411,6000:5000:4000:3000:2000:1000:0:0:0:0,0,0,1000,150000
-//-- TK_DOWNKICK
-415,0,0,0,0,3000
-//-- TK_TURNKICK
-417,0,0,0,0,2000
-//-- TK_SPTIME
-423,0,0,0,1800000,0
-//-- TK_SEVENWIND
-425,0,0,0,300000,0
-//-- TK_HIGHJUMP
-426,5000:4000:3000:2000:1000,0,0,0,0
-//==========================================
-
-//===== Star Gladiator =====================
-//-- SG_FEEL
-427,1000,0,0,0,0
-//SG_SUN_WARM
-428,0,1000,0,10000:20000:60000,0
-//SG_MOON_WARM
-429,0,1000,0,10000:20000:60000,0
-//SG_STAR_WARM
-430,0,1000,0,10000:20000:60000,0
-//SG_SUN_COMFORT
-431,0,1000,0,80000:160000:240000:320000,0
-//SG_MOON_COMFORT
-432,0,1000,0,80000:160000:240000:320000,0
-//SG_STAR_COMFORT
-433,0,1000,0,80000:160000:240000:320000,0
-//-- SG_HATE
-434,1000,0,0,0,0
-//SG_FRIEND
-442,0,0,0,10000,0
-//SG_KNOWLEDGE
-443,0,0,0,600000,0
-//SG_FUSION
-444,0,1000,0,600000,0
-//==========================================
-
-//===== Soul Linker ========================
-//-- SL_ALCHEMIST
-445,1000,500,0,150000:200000:250000:300000:350000,0
-//-- AM_BERSERKPITCHER - Copy of AM_POTIONPITCHER for now
-446,0,500,0,0,0
-//-- SL_MONK
-447,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_STAR
-448,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_SAGE
-449,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_CRUSADER
-450,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_SUPERNOVICE
-451,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_KNIGHT
-452,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_WIZARD
-453,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_PRIEST
-454,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_BARDDANCER
-455,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_ROGUE
-456,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_ASSASSIN
-457,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_BLACKSMITH
-458,1000,500,0,150000:200000:250000:300000:350000,0
-//-- BS_ADRENALINE2
-459,0,0,0,150000,0
-//-- SL_HUNTER
-460,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_SOULLINKER
-461,1000,500,0,150000:200000:250000:300000:350000,0
-//-- SL_KAIZEL
-462,4500:4000:3500:3000:2500:2000:1500,0,0,1800000,2000
-//-- SL_KAAHI
-463,0,500,0,1800000,500
-//-- SL_KAUPE
-464,500,500,0,600000,0
-//-- SL_KAITE
-465,6000:5500:5000:4500:4000:3500:3000,0,0,60000:120000:180000:240000:300000:360000:600000,0
-//-- SL_STIN
-467,100,500,0,0,0
-//-- SL_STUN
-468,100,500,0,2000,0
-//-- SL_SMA
-469,2000,500,0,3000,0
-//-- SL_SWOO
-470,1000,500,0,1000:2000:3000:4000:5000:6000:7000,0
-//-- SL_SKE
-471,3000:2000:1000,500,0,10000:20000:30000,3000
-//-- SL_SKA
-472,3000:2000:1000,500,0,10000:20000:30000,0
-//==========================================
-
-//===== Mixed Advanced Skills ==============
-//-- ST_PRESERVE
-475,1000,0,0,600000,0
-//-- ST_FULLSTRIP
-476,0,1000,0,75000:90000:105000:120000:135000,0
-
-//-- CR_SLIMPITCHER
-478,1000,1000,0,0,0
-//-- CR_FULLPROTECTION
-479,2000,0,0,120000:240000:360000:480000:600000,0
-//-- PA_SHIELDCHAIN
-480,1000,1000,0,0,0
-//-- PF_DOUBLECASTING
-482,2000,0,0,90000,0
-//-- HW_GANBANTEIN
-483,3000,2000,0,0,0
-//-- HW_GRAVITATION
-484,5000,2000,0,5000:6000:7000:8000:9000,0
-//-- WS_CARTTERMINATION
-485,0,0,0,0,3000
-//-- WS_OVERTHRUSTMAX
-486,0,0,0,180000,0
-//-- CG_LONGINGFREEDOM
-487,0,0,0,180000,0
-//-- CG_HERMODE
-488,0,0,0,10000:15000:20000:25000:30000,10000:15000:20000:25000:30000
-//-- CG_TAROTCARD
-489,1000,3000,0,0,30000
-//-- CR_ACIDDEMONSTRATION
-490,1000,1000,0,0,0
-//==========================================
-
-
-//===== Mixed Taekwon Skills ===============
-//-- TK_MISSION
-493,1000,0,0,0,0
-//-- SL_HIGH
-494,1,0,0,150000:200000:250000:300000:350000,0
-//-- KN_ONEHAND
-495,0,0,0,300000,0
-//-- AM_TWILIGHT1
-496,3000,10000,0,50,0
-//-- AM_TWILIGHT2
-497,3000,10000,0,50,0
-//-- AM_TWILIGHT3
-498,3000,10000,0,50,0
-//-- HT_POWER
-499,0,-100,0,100,0
-//==========================================
-
-
-//===== Gunslinger =========================
-//-- GS_GLITTERING
-500,0,0,0,600000,0
-//-- GS_FLING
-501,0,0,0,30000,0
-//-- GS_BULLSEYE
-503,500,0,0,0,0
-//-- GS_MADNESSCANCEL
-504,3000,4000,0,15000,0
-//-- GS_ADJUSTMENT
-505,1000,1000,0,30000,0
-//-- GS_INCREASING
-506,0,1000,0,60000,0
-//-- GS_CRACKER
-508,0,1000,0,0,5000
-//-- GS_TRACKING
-512,1200:1400:1600:1800:2000:2200:2400:2600:2800:3000,0,0,0,0
-//-- GS_DISARM
-513,0,0,0,30000,0
-//-- GS_PIERCINGSHOT
-514,1500,0,0,0,120000
-//-- GS_RAPIDSHOWER
-515,0,1000,0,0,0
-//-- GS_DESPERADO
-516,0,1000,1000,1000,0
-//-- GS_GATLINGFEVER
-517,0,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0
-//-- GS_DUST
-518,1000,1000,0,0,0
-//-- GS_FULLBUSTER
-519,0,1200:1400:1600:1800:2000:2200:2400:2600:2800:3000,0,0,10000
-//-- GS_GROUNDDRIFT
-521,2000,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000,10000
-//==========================================
-
-
-//===== Ninja ==============================
-//-- NJ_KUNAI
-525,0,1000,0,0,0
-//-- NJ_HUUMA
-525,3000,2000,0,0,0
-//-- NJ_ZENYNAGE
-526,0,5000,0,0,0
-//-- NJ_TATAMIGAESHI
-527,0,3000,0,3000,3000
-//-- NJ_KASUMIKIRI
-528,0,1000,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
-//-- NJ_SHADOWJUMP
-529,0,1000,0,0,0
-//-- NJ_KIRIKAGE // Seems to have no delay (English Translation Project)
-530,0,0,0,0,0
-//-- NJ_UTSUSEMI
-531,0,1000,0,20000:30000:40000:50000:60000,0
-//-- NJ_BUNSINJYUTSU
-532,4000:3500:3000:2500:2000:1500:1000:1000:1000:1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
-
-//-- NJ_KOUENKA
-534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
-//-- NJ_KAENSIN
-535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,
-//-- NJ_BAKUENRYU
-536,3000,2000,0,0,0
-//-- NJ_HYOUSENSOU
-537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
-//-- NJ_SUITON
-538,3000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NJ_HYOUSYOURAKU
-539,2000:2500:3000:3500:4000,2000,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
-//-- NJ_HUUJIN
-540,1000:1500:2000:2500:3000:3500:4000:5000:5500:6000,1000,0,0,0
-//-- NJ_RAIGEKISAI
-541,4000,0,0,0,0
-//-- NJ_KAMAITACHI
-542,4000,0,0,0,0
-//-- NJ_NEN
-543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,0
-//-- NJ_ISSEN
-544,0,3000,0,0,0
-//==========================================
-
-
-//===== 2nd Jobs Quest Skills ==============
-//-- KN_CHARGEATK
-1001,300,300,0,0,0
-//-- CR_SHRINK
-1002,0,0,0,300000,0
-
-//-- AS_VENOMKNIFE
-1004,0,200,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- RG_CLOSECONFINE
-1005,0,0,0,10000,0
-//-- WZ_SIGHTBLASTER
-1006,2000,0,0,120000,0
-
-//-- SA_ELEMENTWATER
-1008,2000,1000,0,1800000,0
-//-- HT_PHANTASMIC
-1009,0,0,0,0,0
-//-- BA_PANGVOICE
-1010,1000,2000,0,17000,0
-//-- DC_WINKCHARM (time1: Charm, time2: Confusion)
-1011,1000,2000,0,10000,17000
-
-//-- BS_GREED
-1013,0,1000,0,0,0
-//-- PR_REDEMPTIO
-1014,4000,0,0,0,0
-//-- MO_KITRANSLATION
-1015,2000,1000,0,600000,0
-//-- MO_BALKYOUNG
-1016,0,2000,0,0,2000
-//-- SA_ELEMENTGROUND
-1017,2000,1000,0,1800000,0
-//-- SA_ELEMENTFIRE
-1018,2000,1000,0,1800000,0
-//-- SA_ELEMENTWIND
-1019,2000,1000,0,1800000,0
-//==========================================
-
-//==========================================
-//-- HLIF_HEAL
-8001,0,1000,0,0,1000
-//-- HLIF_AVOID
-8002,0,0,0,40000:35000:30000:25000:20000,40000:45000:50000:55000:60000
-//-- HLIF_CHANGE
-8004,0,600000:900000:1200000,0,60000:180000:300000,0
-//-- HAMI_CASTLE
-8005,0,0,0,0,60000:70000:80000:90000:129000
-//-- HAMI_DEFENCE
-8006,0,0,0,40000:35000:30000:25000:20000,30000
-//-- HAMI_BLOODLUST
-8008,0,0,0,60000:180000:300000,300000:600000:900000
-//-- HFLI_MOON
-8009,0,0,1000,0,0
-//-- HFLI_FLEET
-8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000
-//-- HFLI_SPEED
-8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000
-//-- HVAN_CAPRICE
-8013,0,1000:1200:1400:1600:1800,0,0,0
-//-- HVAN_CHAOTIC
-8014,0,0,1000,0,1000
-//-- HVAN_EXPLOSION
-8016,0,0,1000,0,0
-//==========================================
-
-//===== Guild Skills =======================
-//-- GD_LEADERSHIP
-10006,0,0,0,300000,0
-//-- GD_GLORYWOUNDS
-10007,0,0,0,300000,0
-//-- GD_SOULCOLD
-10008,0,0,0,300000,0
-//-- GD_HAWKEYES
-10009,0,0,0,300000,0
-//-- GD_BATTLEORDER
-10010,5000,1000,0,60000,300000
-//-- GD_REGENERATION
-10011,5000,1000,0,60000,300000
-//-- GD_RESTORE
-10012,5000,1000,0,0,300000
-//-- GD_EMERGENCYCALL
-10013,5000,1000,0,0,300000
-//==========================================
+// Skill Times Database
+//
+// Structure of Database:
+// SkillID,CastingTime,AfterCastActDelay,AfterCastWalkDelay,Duration1,Duration2
+//
+//==========================================
+// Rough list of Contents:
+//==========================================
+// 1. 1st Jobs Skills
+// 2. 2-1 Jobs Skills
+// 3. 1st Jobs Quest Skills
+// 4. NPC Skills (1)
+// 5. 2-2 Jobs Skills
+// 6. Wedding Skills
+// 7. NPC Skills (2)
+// 8. Advanced Jobs Skills (1)
+// 9. Adoption Skills
+// 10. Taekwon Jobs Skills (1)
+// 11. Advanced Jobs Skills (2)
+// 12. Taekwon Jobs Skills (2)
+// 13. 2nd Jobs Quest Skills
+// 14. Guild Skills
+//==========================================
+// This is just a rough overview to help
+// giving an overview on the document and
+// help navigating through it. (Vedurin)
+//==========================================
+
+
+
+
+
+//===== Swordman ===========================
+//-- SM_PROVOKE
+6,0,0,0,30000,0
+//-- SM_MAGNUM
+7,0,0,0,2000,10000
+//-- SM_ENDURE
+8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,10000
+//==========================================
+
+
+//===== Mage ===============================
+//-- MG_SIGHT
+10,0,0,0,10000,0
+//-- MG_NAPALMBEAT
+11,1000,1000:1000:1000:900:900:800:800:700:600:500,0,0,0
+//-- MG_SAFETYWALL
+12,4000:3500:3500:2500:2000:1500:1000:1000:1000:1000,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
+//-- MG_SOULSTRIKE
+13,500,1200:1000:1400:1200:1600:1400:1800:1600:2000:1800,0,0,0
+//-- MG_COLDBOLT
+14,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
+//-- MG_FROSTDRIVER
+15,800,1500,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000
+//-- MG_STONECURSE
+16,1000,0,0,5000,11000:12000:13000:14000:15000:16000:17000:18000:19000:20000
+//-- MG_FIREBALL
+17,1500:1500:1500:1500:1500:1000:1000:1000:1000:1000,1500:1500:1500:1500:1500:1000:1000:1000:1000:1000,0,0,0
+//-- MG_FIREWALL
+18,2000:1850:1700:1550:1400:1250:1100:950:800:650,0,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0
+//-- MG_FIREBOLT
+19,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
+//-- MG_LIGHTNINGBOLT
+20,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
+//-- MG_THUNDERSTORM
+21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,0,500,0
+//==========================================
+
+
+//===== Acolyte ============================
+//-- AL_RUWACH
+24,0,0,0,10000,0
+//-- AL_PNEUMA
+25,0,0,0,10000,0
+//-- AL_TELEPORT
+26,0,0,0,0,0
+//-- AL_WARP
+27,1000,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
+//-- AL_HEAL
+28,0,1000,0,0,0
+//-- AL_INCAGI
+29,1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
+//-- AL_DECAGI
+30,1000,1000,0,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000,0
+//-- AL_HOLYWATER
+31,1000,500,0,0,0
+//-- AL_CRUCIS
+32,500,2000,0,0,0
+//-- AL ANGELUS
+33,500,3500,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//-- AL_BLESSING
+34,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
+//-- AL_CURE
+35,0,1000,0,0,6000
+//==========================================
+
+
+//===== Archer =============================
+//-- AC_CONCENTRATION
+45,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
+//-- AC_DOUBLE
+46,0,100,0,100,0
+//-- AC_SHOWER
+47,0,100,0,100,0
+//==========================================
+
+
+//===== Thief ==============================
+//-- TF_HIDING
+51,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//-- TF_POISON
+52,0,100,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//==========================================
+
+
+//===== First planned to be shared =========
+//-- ALL_RESURRECTION
+54,6000:4000:2000:0,0:1000:2000:3000,0,0,0
+//==========================================
+
+
+//===== Knight =============================
+//-- KN_BRANDISHSPEAR
+57,700,0,0,0,0
+
+//-- KN_SPEARBOOMERANG
+59,0,1000,0,0,0
+//-- KN_TWOHANDQUICKEN
+60,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//-- KN_AUTOCOUNTER
+61,0,0,0,400:800:1200:1600:2000,0
+//-- KN_BOWLINGBASH
+62,700,0,0,0,0
+//==========================================
+
+
+//===== Priest =============================
+//-- PR_IMPOSITIO
+66,0,3000,0,60000,0
+//-- PR_SUFFRAGIUM
+67,0,2000,0,30000:20000:10000,0
+//-- PR_ASPERSIO
+68,0,2000,0,60000:90000:120000:150000:180000,0
+//-- PR_BENEDICTIO
+69,0,0,0,40000:80000:120000:160000:200000,0
+//-- PR_SANCTUARY
+70,5000,0,0,4000:7000:10000:13000:16000:19000:22000:25000:28000:31000,0
+//-- PR_SLOWPOISON
+71,0,0,0,10000:20000:30000:40000,0
+//-- PR_STRECOVERY
+72,0,2000,0,0,30000
+//-- PR_KYRIE
+73,2000,2000,0,120000,0
+//-- PR_MAGNIFICAT
+74,4000,2000,0,30000:45000:60000:75000:90000,0
+//-- PR_GLORIA
+75,0,2000,0,10000:15000:20000:25000:30000,0
+//-- PR_LEXDIVINA
+76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0
+//-- PR_TURNUNDEAD
+77,1000,3000,0,0,0
+//-- PR_LEXAETERNA
+78,0,3000,0,600000,0
+//-- PR_MAGNUS
+79,15000,4000,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0
+//==========================================
+
+
+//===== Wizard =============================
+//-- WZ_FIREPILLAR
+80,3000:2700:2400:2100:1800:1500:1200:900:600:300,1000,0,30000,0
+//-- WZ_SIGHTRASHER
+81,700,2000,0,500,0
+
+//-- WZ_METEOR
+83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,500,3000
+//-- WZ_JUPITEL
+84,2500:3000:3500:4000:4500:5000:5500:6000:6500:7000,0,0,0,0
+//-- WZ_VERMILION
+85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,4000,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000
+//-- WZ_WATERBALL
+86,1000:2000:3000:4000:5000,0,0,0,0
+//-- WZ_ICEWALL
+87,0,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0
+//-- WZ_FROSTNOVA
+88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,0,1500:3000:4500:6000:7500:9000:10500:12000:13500:15000
+//-- WZ_STORMGUST
+89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,4600,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- WZ_EARTHSPIKE
+90,1000:2000:3000:4000:5000,700,0,0,0
+//-- WZ_HEAVENDRIVE
+91,1000:2000:3000:4000:5000,700,0,500,0
+//-- WZ_QUAGMIRE
+92,0,1000,0,5000:10000:15000:20000:25000,5000:10000:15000:20000:25000
+//==========================================
+
+
+//===== Blacksmith =========================
+//-- BS_REPAIRWEAPON
+108,7500,0,0,0,0
+//-- BS_HAMMERFALL
+110,0,0,0,0,5000
+//-- BS_ADRENALINE
+111,0,0,0,30000:60000:90000:120000:150000,0
+//-- BS_WEAPONPEFECT
+112,0,0,0,10000:20000:30000:40000:50000,0
+//-- BS_OVERTHRUST
+113,0,0,0,20000:40000:60000:80000:100000,0
+//-- BS_MAXIMIZE
+114,0,0,0,1000:2000:3000:4000:5000,0
+//==========================================
+
+
+//===== Hunter =============================
+//-- HT_SKIDTRAP
+115,0,0,0,300000:240000:180000:120000:60000,0
+//-- HT_LANDMINE
+116,0,0,0,200000:160000:120000:80000:40000,3000
+//-- HT_ANKLESNARE
+117,0,0,0,250000:200000:150000:100000:50000,4000:8000:12000:16000:20000
+//-- HT_SHOCKWAVE
+118,0,0,0,200000:160000:120000:80000:40000,0
+//-- HT_SANDMAN
+119,0,0,0,150000:120000:90000:60000:30000,12000:14000:16000:18000:20000
+//-- HT_FLASHER
+120,0,0,0,150000:120000:90000:60000:30000,10000:11000:12000:13000:14000
+//-- HT_FREEZINGTRAP
+121,0,0,0,150000:120000:90000:60000:30000,3000:6000:9000:12000:15000
+//-- HT_BLASTMINE
+122,0,0,0,25000:20000:15000:10000:5000,0
+//-- HT_CLAYMORETRAP
+123,0,0,0,20000:40000:60000:80000:100000,0
+
+//-- HT_TALKIEBOX
+125,0,0,0,600000,0
+
+//-- HT_BLITZBEAT
+129,1500,1000,0,0,0
+//==========================================
+
+
+//===== Assassin ===========================
+//-- AS_CLOAKING
+135,0,0,0,500:1000:2000:3000:4000:5000:6000:7000:8000:9000,0
+//-- AS_SONICBLOW
+136,0,2000,2000,0,3000
+//-- AS_GRIMTOOTH
+137,0,0,0,0,1000
+//-- AS_ENCHANTPOISON
+138,0,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,10000:20000:30000:40000:50000:60000:70000:80000:90000:100000
+//-- AS_POISONREACT
+139,0,0,0,20000:25000:30000:35000:40000:45000:50000:55000:60000:65000,0
+//-- AS_VENOMDUST
+140,0,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//-- AS_SPLASHER
+141,1000,0,0,11000:10000:9000:8000:7000:6000:5000:4000:3000:2000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+
+//==========================================
+
+
+//===== 1st Jobs Quest Skills===============
+//-- NV_TRICKDEAD
+143,0,0,0,600000,0
+
+//-- SM_FATALBLOW
+145,0,0,0,0,3000
+
+//-- AC_CHARGEARROW
+148,1500,0,0,0,0
+//-- TF_SPRINKLESAND
+149,0,0,0,0,10000
+
+//-- TF_PICKSTONE
+151,500,0,0,0,0
+//-- TF_THROWSTONE
+152,0,100,0,3000,8000
+
+//-- MC_LOUD
+155,0,0,0,300000,0
+//-- AL_HOLYLIGHT
+156,2000,0,0,0,0
+//-- MG_ENERGYCOAT
+157,5000,0,0,300000,0
+//==========================================
+
+
+//===== NPC Skills Part 1 ==================
+//-- NPC_ATTRICHANGE
+161,0,0,0,1800000,0
+//-- NPC_CHANGEWATER
+162,0,0,0,1800000,0
+//-- NPC_CHANGEGROUND
+163,0,0,0,1800000,0
+//-- NPC_CHANGEFIRE
+164,0,0,0,1800000,0
+//-- NPC_CHANGEWIND
+165,0,0,0,1800000,0
+//-- NPC_CHANGEPOISON
+166,0,0,0,1800000,0
+//-- NPC_CHANGEHOLY
+167,0,0,0,1800000,0
+//-- NPC_CHANGEDARKNESS
+168,0,0,0,1800000,0
+//-- NPC_CHANGETELEKINESIS
+169,0,0,0,1800000,0
+
+//-- NPC_SELFDESTRUCTION
+173,0,0,0,3500,0
+
+//-- NPC_POISON
+176,0,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//-- NPC_BLINDATTACK
+177,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- NPC_SILENCEATTACK
+178,0,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000
+//-- NPC_STUNATTACK
+179,0,0,0,0,3000
+//-- NPC_PETRIFYATTACK
+180,0,0,0,5000,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- NPC_CURSEATTACK
+181,0,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//-- NPC_SLEEPATTACK
+182,0,0,0,0,8000:10000:12000:14000:16000:18000:20000:22000:24000:26000
+
+//-- NPC_KEEPING
+201,0,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0
+
+//-- NPC_BARRIER
+204,0,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0
+
+//-- NPC_LICK
+206,0,0,0,0,3000
+//-- NPC_HALLUCINATION
+207,0,0,0,30000:40000:50000:60000:70000:80000:90000:100000:110000:120000,0
+//==========================================
+
+
+//===== Rogue ==============================
+//-- RG_BACKSTAB
+212,0,500,0,0,0
+
+//-- RG_RAID
+214,0,0,0,3000,8000:9000:10000:11000:12000
+//-- RG_STRIPEWEAPON
+215,1000,1000,0,75000:90000:105000:120000:135000,0
+//-- RG_STRIPSHIELD
+216,1000,1000,0,75000:90000:105000:120000:135000,0
+//-- RG_STRIPWEAPON
+217,1000,1000,0,75000:90000:105000:120000:135000,0
+//-- RG_STRIPHELM
+218,1000,1000,0,75000:90000:105000:120000:135000,0
+
+//-- RG_GRAFITTI
+220,0,0,0,180000,0
+//==========================================
+
+
+//===== Alchemist ==========================
+//-- AM_DEMONSTRATION
+229,1000,0,0,40000:45000:50000:55000:60000,0
+//-- AM_ACIDTERROR
+230,1000,0,0,3:7:10:12:13,120000
+//-- AM_POTIONPITCHER
+231,0,500,0,0,0
+//-- AM_CANNIBALIZE
+232,2000,500,0,300000:240000:180000:120000:60000,0
+//-- AM_SPHEREMINE
+233,2000,500,0,40000:50000:60000:70000:80000,0
+//-- AM_CP_WEAPON
+234,2000,0,0,120000:240000:360000:480000:600000,0
+//-- AM_CP_SHIELD
+235,2000,0,0,120000:240000:360000:480000:600000,0
+//-- AM_CP_ARMOR
+236,2000,0,0,120000:240000:360000:480000:600000,0
+//-- AM_CP_HELM
+237,2000,0,0,120000:240000:360000:480000:600000,0
+//==========================================
+//-- AM_CALLHOMUNCULUS
+243,0,0,0,0,0
+//-- AM_REST
+244,0,0,0,0,0
+//-- AM_RESURRECTHOMUN
+247,2000,0,0,0,0
+//==========================================
+
+
+//===== Crusader ===========================
+//-- CR_AUTOGUARD
+249,0,0,0,300000,0
+//-- CR_SHIELDCHARGE
+250,0,0,0,0,3000
+//-- CR_SHIELDBOOMERANG
+251,0,700,0,0,0
+//-- CR_REFLECTSHIELD
+252,0,0,0,300000,0
+//-- CR_HOLYCROSS
+253,0,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- CR_GRANDCROSS
+254,2000,1500,900,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- CR_DEVOTION
+255,3000,0,0,0,30000:45000:60000:75000:90000
+//-- CR_PROVIDENCE
+256,3000,0,0,180000,0
+//-- CR_DEFENDER
+257,0,800,0,180000,0
+//-- CR_SPEARQUICKEN
+258,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//==========================================
+
+
+//===== Monk ===============================
+//-- MO_CALLSPIRITS
+261,1000,0,0,600000,0
+//-- MO_ABSORBSPIRITS
+262,2000,0,0,0,0
+//-- MO_TRIPLEATTACK
+263,0,1000,0,0,0
+//-- MO_INVESTIGATE
+266,1000,500,0,0,0
+//-- MO_FINGEROFFENSIVE
+267,1000,500,0:200:400:600:800,0,0
+//-- MO_STEELBODY
+268,5000,0,0,30000:60000:90000:120000:150000,0
+//-- MO_BLADESTOP
+269,0,0,0,500:700:900:1100:1300,20000:30000:40000:50000:60000
+//-- MO_EXPLOSIONSPIRITS
+270,0,0,0,180000,0
+//-- MO_EXTREMITYFIST
+271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,0,300000
+//-- MO_CHAINCOMBO
+272,0,1000,0,0,0
+//-- MO_COMBOFINISH
+273,0,700,0,0,0
+//==========================================
+
+//===== Sage ===============================
+//-- SA_MAGICROD
+276,0,1500,0,400:600:800:1000:1200,0
+//-- SA_SPELLBREAKER
+277,700,0,0,0,0
+
+//-- SA_AUTOSPELL
+279,3000,0,0,120000:150000:180000:210000:240000:270000:300000:330000:360000:390000,0
+//-- SA_FLAMELAUNCHER
+280,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
+//-- SA_FROSTWEAPON
+281,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
+//-- SA_LIGHTNINGLOADER
+282,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
+//-- SA_SEISMICWEAPON
+283,3000,0,0,1200000:1200000:1200000:1200000:1800000,0
+
+//-- SA_VOLCANO
+285,5000,0,0,60000:120000:180000:240000:300000,0
+//-- SA_DELUGE
+286,5000,0,0,60000:120000:180000:240000:300000,0
+//-- SA_VIOLENTGALE
+287,5000,0,0,60000:120000:180000:240000:300000,0
+//-- SA_LANDPROTECTOR
+288,5000,0,0,120000:165000:210000:245000:300000,0
+//-- SA_DISPELL
+289,2000,0,0,0,0
+//-- SA_REVERSEORCISH
+294,0,0,0,1200000,0
+//==========================================
+
+
+//===== Bard & Dancer (Ensemble Skills) ====
+//-- BD_ADAPTATION
+304,0,0,0,0,5000
+
+//-- BD_LULLABY
+306,0,0,0,60000,15000
+//-- BD_RICHMANKIM
+307,0,0,0,60000,60000
+//-- BD_ETERNALCHAOS
+308,0,0,0,60000,60000
+//-- BD_DRUMBATTLEFIELD
+309,0,0,0,60000,60000
+//-- BD_RINGNIBELUNGEN
+310,0,0,0,60000,60000
+//-- BD_ROKISWEIL
+311,0,0,0,60000,60000
+//-- BD_INTOABYSS
+312,0,0,0,60000,60000
+//-- BD_SIEGFRIED
+313,0,0,0,60000,60000
+//==========================================
+
+
+//===== Bard ===============================
+//-- BA_MUSICALSTRIKE
+316,1500,0,0,0,0
+//-- BA_DISSONANCE
+317,0,0,0,30000,3000
+//-- BA_FROSTJOKE
+318,0,3000,0,0,10000:11000:12000:13000:14000
+//-- BA_WHISTLE
+319,0,0,0,60000,20000
+//-- BA_ASSASSINCROSS
+320,0,0,0,120000,20000
+//-- BA_POEMBRAGI
+321,0,0,0,180000,20000
+//-- BA_APPLEIDUN
+322,0,0,0,180000,20000
+//==========================================
+
+
+//===== Dancer =============================
+//-- DC_THROWARROW
+324,1500,0,0,0,0
+//-- DC_UGLYDANCE
+325,0,0,0,30000,3000
+//-- DC_SCREAM
+326,0,3000,0,0,5000
+//-- DC_HUMMING
+327,0,0,0,60000,20000
+//-- DC_DONTFORGETME
+328,0,0,0,180000,20000
+//-- DC_FORTUNEKISS
+329,0,0,0,120000,20000
+//-- DC_SERVICEFORYOU
+330,0,0,0,180000,20000
+//==========================================
+
+
+//===== Wedding Skills =====================
+//-- WE_MALE
+334,3000,0,0,0,0
+//-- WE_FEMALE
+335,3000,0,0,0,0
+//-- WE_CALLPARTNER
+336,0,0,0,20000,0
+//==========================================
+
+
+//===== NPC Skills Part 2 ==================
+//-- NPC_DARKGRANDNESS
+339,2000,1500,900,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- NPC_STOP
+342,0,0,0,10000,0
+//-- NPC_CHANGEUNDEAD
+348,0,0,0,30000,0
+//-- NPC_POWERUP
+349,0,0,0,60000:120000:180000:240000:300000,0
+//-- NPC_AGIUP
+350,0,0,0,60000:120000:180000:240000:300000,0
+//-- NPC_INVISIBLE
+353,0,0,0,30000,0
+//-- NPC_RUN
+354,0,0:500:1000:1500:2000:2500,0,0,0
+//==========================================
+
+
+//===== Lord Knight ========================
+//-- LK_AURABLADE
+355,0,0,0,40000:60000:80000:100000:120000,0
+//-- LK_PARRYING
+356,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0
+//-- LK_CONCENTRATION
+357,0,0,0,25000:30000:35000:40000:45000,0
+//-- LK_TENSIONRELAX
+358,0,0,0,180000,0
+//-- LK_BERSERK
+359,0,0,0,300000,15000
+//-- LK_FURY
+360,0,0,0,300000,0
+//==========================================
+
+
+//===== High Priest ========================
+//-- HP_ASSUMPTIO
+361,1000:1500:2000:2500:3000,1100:1200:1300:1400:1500,0,20000:40000:60000:80000:100000,0
+//-- HP_BASILICA
+362,5000:6000:7000:8000:9000,2000:3000:4000:5000:6000,0,20000:25000:30000:35000:40000,20000:25000:30000:35000:40000
+//==========================================
+
+
+//===== High Wzard =========================
+//-- HW_MAGICCRASHER
+365,300,300,0,0,0
+//-- HW_MAGICPOWER
+366,700,0,0,30000,0
+//==========================================
+
+
+//===== Paladin ============================
+//-- PA_PRESSURE
+367,2000:2500:3000:3500:4000,2000:2500:3000:3500:4000,0,0,2000:3000:4000:5000:6000
+//-- PA_SACRIFICE
+368,0,2000,0,0,0
+//-- PA_GOSPEL
+369,0,0,0,60000,60000
+//==========================================
+
+
+//===== Champion ===========================
+//-- CH_PALMSTRIKE
+370,0,300,0,0,0
+//-- CH_TIGERFIST
+371,0,700,0,0,2000:4000:6000:8000:10000
+//-- CH_CHAINCRUSH
+372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,0
+//==========================================
+
+
+//===== Professor ==========================
+//-- PF_HPCONVERSION
+373,0,1000:1200:1400:1600:1800,0,0,0
+//-- PF_SOULCHANGE
+374,3000,5000,0,0,0
+//-- PF_SOULBURN
+375,0,0,0,0,0
+//==========================================
+
+
+//===== Assassin Cross =====================
+//-- ASC_EDP
+378,0,2000,0,20000:30000:40000:50000:60000,20000:30000:40000:50000:60000
+//-- ASC_BREAKER
+379,700,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
+//==========================================
+
+
+//===== Sniper =============================
+//-- SN_SIGHT
+380,0,0,0,30000,0
+//-- SN_FALCONASSAULT
+381,1000,3000,0,0,0,0
+//-- SN_SHARPSHOOTING
+382,2000,1500,0,0,0
+//-- SN_WINDWALK
+383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,2000,0,130000:160000:190000:220000:250000:280000:310000:340000:370000:400000,0
+//==========================================
+
+
+//===== Whitesmith =========================
+//-- WS_MELTDOWN
+384,500:500:600:600:700:700:800:800:900:1000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,5000
+
+//-- WS_CARTBOOST
+387,0,0,0,60000,0
+//==========================================
+
+
+//===== Stalker ============================
+//-- ST_CHASEWALK
+389,0,0,0,10000,30000
+//-- ST_REJECTSWORD
+390,0,0,0,300000,0
+//==========================================
+
+
+//===== Clown / Gypsy ======================
+//-- CG_ARROWVULCAN
+394,2000:2200:2400:2600:2800:3000:3200:3400:3600:3800,2800:2800:2800:2800:2800:3000:3000:3000:3000:3000,2000,0,0
+//-- CG_MOONLIT
+395,0,0,0,20000:25000:30000:35000:40000,0
+//-- CG_MARIONETTE
+396,0,0,0,300000,0
+//==========================================
+
+//===== Mixed Advanced Skills ==============
+//-- LK_SPIRALPIERCE
+397,300:500:700:900:1000,1200:1400:1600:1800:2000,0,0,1000
+//-- LK_HEADCRUSH
+398,0,500,0,0,120000
+//-- LK_JOINTBEAT
+399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,30000
+//-- HW_NAPALMVULCAN
+400,1700,1000,0,0,45000
+//-- CH_SOULCOLLECT
+401,2000,0,0,600000,0
+//-- PF_MINDBREAKER
+402,0,800:900:1000:1100:1200,0,30000,0
+//-- PF_MEMORIZE
+403,5000,0,0,0,0
+//-- PF_FOGWALL
+404,0,0,0,20000,10000
+//-- PF_SPIDERWEB
+405,0,0,0,30000,8000
+//-- ASC_METEORASSAULT (Upkeep2 times are duration of: blind(lv1), stun(lv2) or bleeding (lv3)
+406,500,500,0,0,10000:3000:120000
+//-- ASC_CDP
+407,0,500,0,0,0
+//==========================================
+
+
+//===== Adoption Skills ====================
+//-- WE_BABY
+408,3000,0,0,300000,0
+//-- WE_CALLPARENT
+409,0,0,0,20000,0
+//-- WE_CALLBABY
+410,0,0,0,20000,0
+//==========================================
+
+
+//===== Taekwon ============================
+//-- TK_RUN
+411,6000:5000:4000:3000:2000:1000:0:0:0:0,0,0,1000,150000
+//-- TK_DOWNKICK
+415,0,0,0,0,3000
+//-- TK_TURNKICK
+417,0,0,0,0,2000
+//-- TK_SPTIME
+423,0,0,0,1800000,0
+//-- TK_SEVENWIND
+425,0,0,0,300000,0
+//-- TK_HIGHJUMP
+426,5000:4000:3000:2000:1000,0,0,0,0
+//==========================================
+
+//===== Star Gladiator =====================
+//-- SG_FEEL
+427,1000,0,0,0,0
+//SG_SUN_WARM
+428,0,1000,0,10000:20000:60000,0
+//SG_MOON_WARM
+429,0,1000,0,10000:20000:60000,0
+//SG_STAR_WARM
+430,0,1000,0,10000:20000:60000,0
+//SG_SUN_COMFORT
+431,0,1000,0,80000:160000:240000:320000,0
+//SG_MOON_COMFORT
+432,0,1000,0,80000:160000:240000:320000,0
+//SG_STAR_COMFORT
+433,0,1000,0,80000:160000:240000:320000,0
+//-- SG_HATE
+434,1000,0,0,0,0
+//SG_FRIEND
+442,0,0,0,10000,0
+//SG_KNOWLEDGE
+443,0,0,0,600000,0
+//SG_FUSION
+444,0,1000,0,600000,0
+//==========================================
+
+//===== Soul Linker ========================
+//-- SL_ALCHEMIST
+445,1000,500,0,150000:200000:250000:300000:350000,0
+//-- AM_BERSERKPITCHER - Copy of AM_POTIONPITCHER for now
+446,0,500,0,0,0
+//-- SL_MONK
+447,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_STAR
+448,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_SAGE
+449,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_CRUSADER
+450,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_SUPERNOVICE
+451,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_KNIGHT
+452,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_WIZARD
+453,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_PRIEST
+454,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_BARDDANCER
+455,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_ROGUE
+456,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_ASSASSIN
+457,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_BLACKSMITH
+458,1000,500,0,150000:200000:250000:300000:350000,0
+//-- BS_ADRENALINE2
+459,0,0,0,150000,0
+//-- SL_HUNTER
+460,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_SOULLINKER
+461,1000,500,0,150000:200000:250000:300000:350000,0
+//-- SL_KAIZEL
+462,4500:4000:3500:3000:2500:2000:1500,0,0,1800000,2000
+//-- SL_KAAHI
+463,0,500,0,1800000,500
+//-- SL_KAUPE
+464,500,500,0,600000,0
+//-- SL_KAITE
+465,6000:5500:5000:4500:4000:3500:3000,0,0,60000:120000:180000:240000:300000:360000:600000,0
+//-- SL_STIN
+467,100,500,0,0,0
+//-- SL_STUN
+468,100,500,0,2000,0
+//-- SL_SMA
+469,2000,500,0,3000,0
+//-- SL_SWOO
+470,1000,500,0,1000:2000:3000:4000:5000:6000:7000,0
+//-- SL_SKE
+471,3000:2000:1000,500,0,10000:20000:30000,3000
+//-- SL_SKA
+472,3000:2000:1000,500,0,10000:20000:30000,0
+//==========================================
+
+//===== Mixed Advanced Skills ==============
+//-- ST_PRESERVE
+475,1000,0,0,600000,0
+//-- ST_FULLSTRIP
+476,0,1000,0,75000:90000:105000:120000:135000,0
+
+//-- CR_SLIMPITCHER
+478,1000,1000,0,0,0
+//-- CR_FULLPROTECTION
+479,2000,0,0,120000:240000:360000:480000:600000,0
+//-- PA_SHIELDCHAIN
+480,1000,1000,0,0,0
+//-- PF_DOUBLECASTING
+482,2000,0,0,90000,0
+//-- HW_GANBANTEIN
+483,3000,2000,0,0,0
+//-- HW_GRAVITATION
+484,5000,2000,0,5000:6000:7000:8000:9000,0
+//-- WS_CARTTERMINATION
+485,0,0,0,0,3000
+//-- WS_OVERTHRUSTMAX
+486,0,0,0,180000,0
+//-- CG_LONGINGFREEDOM
+487,0,0,0,180000,0
+//-- CG_HERMODE
+488,0,0,0,10000:15000:20000:25000:30000,10000:15000:20000:25000:30000
+//-- CG_TAROTCARD
+489,1000,3000,0,0,30000
+//-- CR_ACIDDEMONSTRATION
+490,1000,1000,0,0,0
+//==========================================
+
+
+//===== Mixed Taekwon Skills ===============
+//-- TK_MISSION
+493,1000,0,0,0,0
+//-- SL_HIGH
+494,1,0,0,150000:200000:250000:300000:350000,0
+//-- KN_ONEHAND
+495,0,0,0,300000,0
+//-- AM_TWILIGHT1
+496,3000,10000,0,50,0
+//-- AM_TWILIGHT2
+497,3000,10000,0,50,0
+//-- AM_TWILIGHT3
+498,3000,10000,0,50,0
+//-- HT_POWER
+499,0,-100,0,100,0
+//==========================================
+
+
+//===== Gunslinger =========================
+//-- GS_GLITTERING
+500,0,0,0,600000,0
+//-- GS_FLING
+501,0,0,0,30000,0
+//-- GS_BULLSEYE
+503,500,0,0,0,0
+//-- GS_MADNESSCANCEL
+504,3000,4000,0,15000,0
+//-- GS_ADJUSTMENT
+505,1000,1000,0,30000,0
+//-- GS_INCREASING
+506,0,1000,0,60000,0
+//-- GS_CRACKER
+508,0,1000,0,0,5000
+//-- GS_TRACKING
+512,1200:1400:1600:1800:2000:2200:2400:2600:2800:3000,0,0,0,0
+//-- GS_DISARM
+513,0,0,0,30000,0
+//-- GS_PIERCINGSHOT
+514,1500,0,0,0,120000
+//-- GS_RAPIDSHOWER
+515,0,1000,0,0,0
+//-- GS_DESPERADO
+516,0,1000,1000,1000,0
+//-- GS_GATLINGFEVER
+517,0,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0
+//-- GS_DUST
+518,1000,1000,0,0,0
+//-- GS_FULLBUSTER
+519,0,1200:1400:1600:1800:2000:2200:2400:2600:2800:3000,0,0,10000
+//-- GS_GROUNDDRIFT
+521,2000,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000,10000
+//==========================================
+
+
+//===== Ninja ==============================
+//-- NJ_KUNAI
+525,0,1000,0,0,0
+//-- NJ_HUUMA
+525,3000,2000,0,0,0
+//-- NJ_ZENYNAGE
+526,0,5000,0,0,0
+//-- NJ_TATAMIGAESHI
+527,0,3000,0,3000,3000
+//-- NJ_KASUMIKIRI
+528,0,1000,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
+//-- NJ_SHADOWJUMP
+529,0,1000,0,0,0
+//-- NJ_KIRIKAGE // Seems to have no delay (English Translation Project)
+530,0,0,0,0,0
+//-- NJ_UTSUSEMI
+531,0,1000,0,20000:30000:40000:50000:60000,0
+//-- NJ_BUNSINJYUTSU
+532,4000:3500:3000:2500:2000:1500:1000:1000:1000:1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
+
+//-- NJ_KOUENKA
+534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
+//-- NJ_KAENSIN
+535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,
+//-- NJ_BAKUENRYU
+536,3000,2000,0,0,0
+//-- NJ_HYOUSENSOU
+537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
+//-- NJ_SUITON
+538,3000,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//-- NJ_HYOUSYOURAKU
+539,2000:2500:3000:3500:4000,2000,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
+//-- NJ_HUUJIN
+540,1000:1500:2000:2500:3000:3500:4000:5000:5500:6000,1000,0,0,0
+//-- NJ_RAIGEKISAI
+541,4000,0,0,0,0
+//-- NJ_KAMAITACHI
+542,4000,0,0,0,0
+//-- NJ_NEN
+543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,0
+//-- NJ_ISSEN
+544,0,3000,0,0,0
+//==========================================
+
+
+//===== 2nd Jobs Quest Skills ==============
+//-- KN_CHARGEATK
+1001,300,300,0,0,0
+//-- CR_SHRINK
+1002,0,0,0,300000,0
+
+//-- AS_VENOMKNIFE
+1004,0,200,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
+//-- RG_CLOSECONFINE
+1005,0,0,0,10000,0
+//-- WZ_SIGHTBLASTER
+1006,2000,0,0,120000,0
+
+//-- SA_ELEMENTWATER
+1008,2000,1000,0,1800000,0
+//-- HT_PHANTASMIC
+1009,0,0,0,0,0
+//-- BA_PANGVOICE
+1010,1000,2000,0,17000,0
+//-- DC_WINKCHARM (time1: Charm, time2: Confusion)
+1011,1000,2000,0,10000,17000
+
+//-- BS_GREED
+1013,0,1000,0,0,0
+//-- PR_REDEMPTIO
+1014,4000,0,0,0,0
+//-- MO_KITRANSLATION
+1015,2000,1000,0,600000,0
+//-- MO_BALKYOUNG
+1016,0,2000,0,0,2000
+//-- SA_ELEMENTGROUND
+1017,2000,1000,0,1800000,0
+//-- SA_ELEMENTFIRE
+1018,2000,1000,0,1800000,0
+//-- SA_ELEMENTWIND
+1019,2000,1000,0,1800000,0
+//==========================================
+
+//==========================================
+//-- HLIF_HEAL
+8001,0,1000,0,0,1000
+//-- HLIF_AVOID
+8002,0,0,0,40000:35000:30000:25000:20000,40000:45000:50000:55000:60000
+//-- HLIF_CHANGE
+8004,0,600000:900000:1200000,0,60000:180000:300000,0
+//-- HAMI_CASTLE
+8005,0,0,0,0,60000:70000:80000:90000:129000
+//-- HAMI_DEFENCE
+8006,0,0,0,40000:35000:30000:25000:20000,30000
+//-- HAMI_BLOODLUST
+8008,0,0,0,60000:180000:300000,300000:600000:900000
+//-- HFLI_MOON
+8009,0,0,1000,0,0
+//-- HFLI_FLEET
+8010,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000
+//-- HFLI_SPEED
+8011,0,0,0,60000:55000:50000:45000:40000,60000:70000:80000:90000:120000
+//-- HVAN_CAPRICE
+8013,0,1000:1200:1400:1600:1800,0,0,0
+//-- HVAN_CHAOTIC
+8014,0,0,1000,0,1000
+//-- HVAN_EXPLOSION
+8016,0,0,1000,0,0
+//==========================================
+
+//===== Guild Skills =======================
+//-- GD_LEADERSHIP
+10006,0,0,0,300000,0
+//-- GD_GLORYWOUNDS
+10007,0,0,0,300000,0
+//-- GD_SOULCOLD
+10008,0,0,0,300000,0
+//-- GD_HAWKEYES
+10009,0,0,0,300000,0
+//-- GD_BATTLEORDER
+10010,5000,1000,0,60000,300000
+//-- GD_REGENERATION
+10011,5000,1000,0,60000,300000
+//-- GD_RESTORE
+10012,5000,1000,0,0,300000
+//-- GD_EMERGENCYCALL
+10013,5000,1000,0,0,300000
+//==========================================
diff --git a/db/skill_castnodex_db.txt b/db/skill_castnodex_db.txt
index 61699c7e8..74ce7b299 100644
--- a/db/skill_castnodex_db.txt
+++ b/db/skill_castnodex_db.txt
@@ -1,30 +1,30 @@
-//<Skill id>,<Cast: 1 or 0>,<Delay (Optional): 1 or 0>
-// Cast: With 1, dex does not affect the skill's cast rate
-// Cast: With 2, cast-rate cannot be reduced by Suffragium and the like
-// Cast: With 3, same effect as 1 + 2
-// Cast: With 0, dex affects the skill's cast rate
-// Delay: With 1, agi does not affect the skill's delay rate
-// Delay: With 2, delay cannot be reduced by Suffragium and the like
-// Delay: With 0, agi affects the skill's delay rate
-// Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex/agi.
-// By default, agi NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
-263,0,2 //MO_TRIPLEATTACK
-272,0,2 //MO_CHAINCOMBO
-273,0,2 //MO_COMBOFINISH
-336,1 //WE_CALLPARTNER
-366,1 //HW_MAGICPOWER
-370,1 //CH_PALMSTRIKE
-371,0,2 //CH_TIGERFIST
-372,0,2 //CH_CHAINCRUSH
-403,3 //PF_MEMORIZE
-408,1 //WE_BABY
-409,1 //WE_CALLPARENT
-410,1 //WE_CALLBABY
-482,1 //PF_DOUBLECASTING
-462,1 //SL_KAIZEL
-512,3 //GS_TRACKING
-1014,1 //PR_REDEMPTIO
-10010,3 //GD_BATTLEORDER
-10011,3 //GD_REGENERATION
-10012,3 //GD_RESTORE
-10013,3 //GD_EMERGENCYCALL
+//<Skill id>,<Cast: 1 or 0>,<Delay (Optional): 1 or 0>
+// Cast: With 1, dex does not affect the skill's cast rate
+// Cast: With 2, cast-rate cannot be reduced by Suffragium and the like
+// Cast: With 3, same effect as 1 + 2
+// Cast: With 0, dex affects the skill's cast rate
+// Delay: With 1, agi does not affect the skill's delay rate
+// Delay: With 2, delay cannot be reduced by Suffragium and the like
+// Delay: With 0, agi affects the skill's delay rate
+// Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex/agi.
+// By default, agi NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
+263,0,2 //MO_TRIPLEATTACK
+272,0,2 //MO_CHAINCOMBO
+273,0,2 //MO_COMBOFINISH
+336,1 //WE_CALLPARTNER
+366,1 //HW_MAGICPOWER
+370,1 //CH_PALMSTRIKE
+371,0,2 //CH_TIGERFIST
+372,0,2 //CH_CHAINCRUSH
+403,3 //PF_MEMORIZE
+408,1 //WE_BABY
+409,1 //WE_CALLPARENT
+410,1 //WE_CALLBABY
+482,1 //PF_DOUBLECASTING
+462,1 //SL_KAIZEL
+512,3 //GS_TRACKING
+1014,1 //PR_REDEMPTIO
+10010,3 //GD_BATTLEORDER
+10011,3 //GD_REGENERATION
+10012,3 //GD_RESTORE
+10013,3 //GD_EMERGENCYCALL
diff --git a/db/skill_db.txt b/db/skill_db.txt
index 8df120d21..a5347f5e8 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -1,626 +1,626 @@
-//id,range,hit,inf,pl,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
-// 01 ID
-// 02 range (combo skills do not check for range when used, if 0 and skill is
-// not inf = 4, use attack range)
-// 03 hit (8- repeated hitting, 6- single-hit)
-// 04 inf (0- passive, 1- enemy, 2- place, 4- self, 16- friend, 32- trap)
-// 05 pl attributes (0- nothing, 1- water, 2- earth, 3- fire, 4- wind,
-// 5- poison, 6- saint, 7- darkness, 8- sense, 9- immortality)
-// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill,
-// 3-no damage area skill, 4-splash and split damage skill)
-// 07 splash/effect range (-1 for screen-wide)
-// 08 MaxLv
-// 09 Number of hits (when positive, damage is increased by hits,
-// negative values just show number of hits without increasing total damage)
-// 10 castcancelled (it is cancelled at 1. Are not cancelled with 0)
-// 11 defense-reduction rate during cast.
-// 12 inf2 (skill information 2) (1- quest skill, 2- npc skill, 4- wedding skill
-// 8- spirit skill, 16- guild skill, 32- song/dance, 64- ensemble skill
-// 128- trap (can be targetted), 256- skill that damages/targets yourself
-// 512- cannot be casted on self (if inf = 4, auto-select target skill)
-// 1024- usable only on party-members, 2048- usable only on guild-mates
-// 4096- allow usage on enemies too (use with 1024/2048))
-// 13 maxcount: max amount of skill instances to place on the ground when
-// player_land_skill_limit/monster_land_skill_limit is enabled.
-// 14 attack type (none, weapon, magic, misc)
-// 15 Blowcount (amount of tiles skill knockbacks)
-1,0,0,0,0,0,0,9,0,no,0,0,0,none,0 //NV_BASIC#Basic Skill#
-2,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_SWORD#Sword Mastery#
-3,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SM_RECOVERY#Increase HP Recovery#
-5,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //SM_BASH#Bash#
-6,9,6,1,0,1,0,10,1,no,0,0,0,none,0 //SM_PROVOKE#Provoke#
-7,0,6,4,3,2,2,10,1,no,0,0,0,weapon,2 //SM_MAGNUM#Magnum Break#
-8,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //SM_ENDURE#Endure#
-9,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MG_SRECOVERY#Increase SP Recovery#
-10,0,6,4,3,3,3,1,1,yes,0,0,0,magic,0 //MG_SIGHT#Sight#
-11,9,6,1,8,4,1,10,1,yes,0,0,0,magic,0 //MG_NAPALMBEAT#Napalm Beat#
-12,9,8,2,8,1,0,10,1,yes,0,0,0,magic,0 //MG_SAFETYWALL#Safety Wall#
-13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //MG_SOULSTRIKE#Soul Strike#
-14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_COLDBOLT#Cold Bolt#
-15,9,6,1,1,0,0,10,1,yes,0,0,0,magic,0 //MG_FROSTDIVER#Frost Diver#
-16,2,6,1,2,1,0,10,1,yes,0,0,0,magic,0 //MG_STONECURSE#Stone Curse#
-17,9,6,1,3,2,2,10,1,yes,0,0,0,magic,0 //MG_FIREBALL#Fire Ball#
-18,9,6,2,3,0,0,10,1,yes,0,0,3,magic,1 //MG_FIREWALL#Fire Wall#
-19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_FIREBOLT#Fire Bolt#
-20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_THUNDERSTORM#Thunderstorm#
-22,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DP#Divine protection#
-23,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DEMONBANE#Demon Bane#
-24,0,6,4,6,3,2,1,1,yes,0,0,0,magic,0 //AL_RUWACH#Ruwach#
-25,9,6,2,0,1,0,1,1,yes,0,0,0,magic,0 //AL_PNEUMA#Pneuma#
-26,0,6,4,0,1,0,2,1,yes,0,0,0,magic,0 //AL_TELEPORT#Teleport#
-27,9,6,2,0,1,0,4,1,yes,0,0,3,magic,0 //AL_WARP#Warp Portal#
-28,9,6,16,6,1,0,10,1,yes,0,0,0,magic,0 //AL_HEAL#Heal#
-29,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //AL_INCAGI#Increase AGI#
-30,9,6,1,0,1,0,10,1,yes,0,0,0,magic,0 //AL_DECAGI#Decrease AGI#
-31,0,6,4,0,1,0,1,1,yes,0,0,0,magic,0 //AL_HOLYWATER#Aqua Benedicta#
-32,0,6,4,0,3,15,10,1,yes,0,0,0,magic,0 //AL_CRUCIS#Signum Crusis#
-33,0,6,4,0,3,-1,10,1,yes,0,0,0,magic,0 //AL_ANGELUS#Angelus#
-34,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //AL_BLESSING#Blessing#
-35,9,6,16,0,1,0,1,1,yes,0,0,0,magic,0 //AL_CURE#Cure#
-36,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_INCCARRY#Enlarge Weight Limit#
-37,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_DISCOUNT#Discount#
-38,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_OVERCHARGE#Overcharge#
-39,1,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_PUSHCART#Pushcart#
-40,1,6,4,0,1,0,1,1,no,0,0,0,none,0 //MC_IDENTIFY#Item Appraisal#
-41,1,6,4,0,1,0,10,1,no,0,0,0,none,0 //MC_VENDING#Vending#
-42,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //MC_MAMMONITE#Mammonite#
-43,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_OWL#Owl's Eye#
-44,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_VULTURE#Vulture's Eye#
-45,0,6,4,0,3,1,10,1,no,0,0,0,weapon,0 //AC_CONCENTRATION#Improve Concentration#
-46,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0 //AC_DOUBLE#Double Strafe#
-47,-9,6,2,-1,2,2,10,1,no,0,0,0,weapon,2 //AC_SHOWER#Arrow Shower#
-48,-1,8,0,-1,0,0,10,2,no,0,0,0,weapon,0 //TF_DOUBLE#Double Attack#
-49,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_MISS#Improve Dodge#
-50,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0 //TF_STEAL#Steal#
-51,1,6,4,0,1,0,10,1,no,0,0,0,none,0 //TF_HIDING#Hiding#
-52,-2,6,1,5,0,0,10,1,no,0,0,0,weapon,0 //TF_POISON#Envenom#
-53,9,6,16,5,1,0,1,1,no,0,0,0,weapon,0 //TF_DETOXIFY#Detoxify#
-54,9,6,16,6,1,0,4,1,yes,0,0,0,magic,0 //ALL_RESURRECTION#Resurrection#
-55,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //KN_SPEARMASTERY#Spear Mastery#
-56,-2,8,1,-1,0,0,10,3,no,0,0,0,weapon,0 //KN_PIERCE#Pierce#
-57,-2,6,1,-1,1,0,10,1,no,33,0,0,weapon,3 //KN_BRANDISHSPEAR#Brandish Spear#
-58,-4,6,1,-1,2,0,10,1,no,0,0,0,weapon,6 //KN_SPEARSTAB#Spear Stab#
-59,3:5:7:9:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-60,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-61,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,0 //KN_AUTOCOUNTER#Counter Attack#
-62,-2,6,1,-1,2,1,10,1,no,33,0,0,weapon,1:1:2:2:3:3:4:4:5:5 //KN_BOWLINGBASH#Bowling Bash#
-63,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //KN_RIDING#Peco Peco Riding#
-64,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-65,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //PR_MACEMASTERY#Mace Mastery#
-66,9,6,16,0,1,0,5,1,yes,0,0,0,magic,0 //PR_IMPOSITIO#Impositio Manus#
-67,9,6,16,0,1,0,3,1,yes,0,512,0,magic,0 //PR_SUFFRAGIUM#Suffragium#
-68,9,6,16,6,1,0,5,1,yes,0,0,0,magic,0 //PR_ASPERSIO#Aspersio#
-69,9,6,2,0,3,1,5,1,yes,0,64,0,magic,0 //PR_BENEDICTIO#B.S Sacramenti#
-70,9,6,2,6,1,0,10,1,yes,0,0,0,magic,1 //PR_SANCTUARY#Sanctuary#
-71,9,6,16,0,1,0,4,1,yes,0,0,0,magic,0 //PR_SLOWPOISON#Slow Poison#
-72,9,6,16,0,1,0,1,1,yes,0,0,0,magic,0 //PR_STRECOVERY#Status Recovery#
-73,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //PR_KYRIE#Kyrie Eleison#
-74,0,6,4,0,3,-1,5,1,yes,0,0,0,magic,0 //PR_MAGNIFICAT#Magnificat#
-75,0,6,4,0,3,-1,5,1,yes,0,0,0,magic,0 //PR_GLORIA#Gloria#
-76,5,6,1,0,1,0,10,0,yes,0,0,0,magic,0 //PR_LEXDIVINA#Lex Divina#
-77,5,6,1,6,0,0,10,1,yes,0,0,0,magic,0 //PR_TURNUNDEAD#Turn Undead#
-78,9,6,1,0,1,0,1,0,yes,0,0,0,magic,0 //PR_LEXAETERNA#Lex Aeterna#
-79,9,8,2,6,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //PR_MAGNUS#Magnus Exorcismus#
-80,9,8,2,3,0,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0,5,magic,0 //WZ_FIREPILLAR#Fire Pillar#
-81,0,6,4,3,0,3,10,1,yes,0,0,0,magic,5 //WZ_SIGHTRASHER#Sightrasher#
-//82,9,6,2,3,0,0,10,1,yes,0,0,0,magic,0 //WZ_FIREIVY#Fire Ivy#
-83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0,0,magic,0 //WZ_METEOR#Meteor Storm#
-84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,2:3:3:4:4:5:5:6:6:7 //WZ_JUPITEL#Jupiter Thunder#
-85,9,8,2,4,0,0,10,-10,yes,0,0,0,magic,0 //WZ_VERMILION#Lord of Vermilion#
-86,9,8,1,1,0,0,5,1,yes,0,0,0,magic,0 //WZ_WATERBALL#Water Ball#
-87,9,6,2,1,0,0,10,1,yes,0,0,0,magic,0 //WZ_ICEWALL#Ice Wall#
-88,0,6,4,1,2,2,10,1,yes,0,0,0,magic,0 //WZ_FROSTNOVA#Frost Nova#
-89,9,6,2,1,0,0,10,1,yes,0,0,0,magic,2 //WZ_STORMGUST#Storm Gust#
-90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_EARTHSPIKE#Earth Spike#
-91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-92,9,6,2,2,1,0,5,1,yes,0,0,3,magic,0 //WZ_QUAGMIRE#Quagmire#
-93,9,6,1,0,1,0,1,1,yes,0,0,0,magic,0 //WZ_ESTIMATION#Sense#
-94,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_IRON#Iron Tempering#
-95,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_STEEL#Steel Tempering#
-96,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
-97,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ORIDECON#Oridecon Research#
-98,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_DAGGER#Smith Dagger#
-99,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SWORD#Smith Sword#
-100,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
-101,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_AXE#Smith Axe#
-102,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_MACE#Smith Mace#
-103,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_KNUCKLE#Smith Knucklebrace#
-104,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SPEAR#Smith Spear#
-105,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_HILTBINDING#Hilt Binding#
-106,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_FINDINGORE#Ore Discovery#
-107,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BS_WEAPONRESEARCH#Weaponry Research#
-108,2,6,16,0,1,0,1,1,yes,0,0,0,weapon,0 //BS_REPAIRWEAPON#Weapon Repair#
-109,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_SKINTEMPER#Skin Tempering#
-110,1,6,2,0,3,2:2:2:2:2:14,5,1,no,0,0,0,weapon,0 //BS_HAMMERFALL#Hammer Fall#
-111,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_ADRENALINE#Adrenaline Rush#
-112,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_WEAPONPERFECT#Weapon Perfection#
-113,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_OVERTHRUST#Power-Thrust#
-114,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //BS_MAXIMIZE#Maximize Power#
-115,3,6,2,0,1,0,5,1,no,0,128,0,misc,6:7:8:9:10 //HT_SKIDTRAP#Skid Trap#
-116,3,6,2,2,0,0,5,1,no,0,128,0,misc,0 //HT_LANDMINE#Land Mine#
-117,3,6,2,0,1,0,5,1,no,0,128,0,misc,0 //HT_ANKLESNARE#Ankle Snare#
-118,3,6,2,0,2,1,5,1,no,0,128,0,misc,0 //HT_SHOCKWAVE#Shockwave Trap#
-119,3,6,2,0,3,2,5,1,no,0,128,0,misc,0 //HT_SANDMAN#Sandman#
-120,3,6,2,0,3,1,5,1,no,0,128,0,misc,0 //HT_FLASHER#Flasher#
-121,3,6,2,1,2,1,5,1,no,0,128,0,misc,0 //HT_FREEZINGTRAP#Freezing Trap#
-122,3,6,2,4,2,1,5,1,no,0,128,0,misc,0 //HT_BLASTMINE#Blast Mine#
-123,3,6,2,3,2,2,5,1,no,0,128,0,misc,0 //HT_CLAYMORETRAP#Claymore Trap#
-124,2,6,32,0,1,0,1,1,no,0,0,0,misc,0 //HT_REMOVETRAP#Remove Trap#
-125,3,6,2,0,1,0,1,1,no,0,0,0,misc,0 //HT_TALKIEBOX#Talkie Box#
-126,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //HT_BEASTBANE#Beast Bane#
-127,0,0,0,0,0,0,1,0,no,0,0,0,misc,0 //HT_FALCON#Falconry Mastery#
-128,0,0,0,0,0,0,10,0,no,0,0,0,misc,0 //HT_STEELCROW#Steel Crow#
-129,5,8,1,0,2,1,5,1:2:3:4:5,yes,0,0,0,misc,0 //HT_BLITZBEAT#Blitz Beat#
-130,3:5:7:9,6,2,0,3,3,4,1,no,0,0,0,misc,0 //HT_DETECTING#Detect#
-131,4:5:6:7:8,6,32,0,1,0,5,1,no,0,0,0,misc,0 //HT_SPRINGTRAP#Spring Trap#
-132,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_RIGHT#Righthand Mastery#
-133,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_LEFT#Lefthand Mastery#
-134,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AS_KATAR#Katar Mastery#
-135,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //AS_CLOAKING#Cloaking#
-136,-1,8,1,-1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#Sonic Blow#
-137,3:4:5:6:7,6,1,-1,2,1,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#Grimtooth#
-138,1,6,16,5,1,0,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#Enchant Poison#
-139,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#Poison React#
-140,2,6,2,5,1,0,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#Venom Dust#
-141,1,6,1,-1,1,2,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#Venom Splasher#
-142,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //NV_FIRSTAID#First Aid#
-143,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //NV_TRICKDEAD#Act Dead#
-144,0,0,0,0,0,0,1,0,no,0,1,0,none,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-145,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_FATALBLOW#Attack Weak Point#
-146,0,6,4,0,1,0,1,1,no,0,1,0,weapon,0 //SM_AUTOBERSERK#Auto Berserk#
-147,0,0,4,0,1,0,1,0,no,0,1,0,weapon,0 //AC_MAKINGARROW#Arrow Crafting#
-148,-9,6,1,-1,2,0,1,1,no,0,1,0,weapon,6 //AC_CHARGEARROW#Arrow Repel#
-149,1,6,1,2,0,0,1,1,no,0,1,0,weapon,0 //TF_SPRINKLESAND#Throw Sand#
-150,0,6,4,0,1,0,1,1,no,0,1,0,weapon,5 //TF_BACKSLIDING#Back Sliding#
-151,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //TF_PICKSTONE#Find Stone#
-152,7,6,1,0,0,0,1,1,no,0,1,0,misc,0 //TF_THROWSTONE#Stone Fling#
-153,1,6,1,-1,2,1,1,1,no,0,1,0,weapon,2 //MC_CARTREVOLUTION#Cart Revolution#
-154,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //MC_CHANGECART#Change Cart#
-155,0,6,4,0,1,0,1,1,no,0,1,0,weapon,0 //MC_LOUD#Crazy Uproar#
-156,9,6,1,6,0,0,1,1,yes,0,1,0,magic,0 //AL_HOLYLIGHT#Holy Light#
-157,0,6,4,0,1,0,1,1,yes,0,1,0,magic,0 //MG_ENERGYCOAT#Energy Coat#
-158,3,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PIERCINGATT#Thrusting attack#
-159,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_MENTALBREAKER#Spirit Destruction#
-160,9,6,1,0,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANGEATTACK#Stand off attack#
-161,0,0,4,0,1,0,1,1,no,0,2,0,magic,0 //NPC_ATTRICHANGE#Run Attribute Change#
-162,0,0,4,1,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEWATER#Water Attribute Change#
-163,0,0,4,2,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEGROUND#Earth Attribute Change#
-164,0,0,4,3,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEFIRE#Fire Attribute Change#
-165,0,0,4,4,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEWIND#Wind Attribute Change#
-166,0,0,4,5,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEPOISON#Poison Attribute Change#
-167,0,0,4,6,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEHOLY#Holy Attribute Change#
-168,0,0,4,7,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEDARKNESS#Shadow Attribute Change#
-169,0,0,4,8,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGETELEKINESIS#Sense Attribute Change#
-170,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CRITICALSLASH#Defense disregard attack#
-171,-1,8,1,-1,0,0,10,2:3:4:5:6:7:8:9:10:11,no,0,2,0,weapon,0 //NPC_COMBOATTACK#Multi-stage Attack#
-172,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_GUIDEATTACK#On-target Impact Attack#
-173,1,6,4,3,2,5,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION#Suicide bombing#
-174,-1,6,1,-1,2,3,1,1,no,0,2,0,weapon,0 //NPC_SPLASHATTACK#Splash attack#
-175,0,0,4,0,1,0,10,1,no,0,2,0,misc,0 //NPC_SUICIDE#Suicide#
-176,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_POISON#Poison Attack#
-177,7,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BLINDATTACK#Darkness Attack#
-178,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_SILENCEATTACK#Silence Attack#
-179,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_STUNATTACK#Stun Attack#
-180,7,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_PETRIFYATTACK#Petrify Attack#
-181,7,6,1,7,0,0,5,1,no,0,2,0,weapon,0 //NPC_CURSEATTACK#Cursing Attack #
-182,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_SLEEPATTACK#Sleep attack#
-183,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANDOMATTACK#Random Attack #
-184,-1,6,1,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_WATERATTACK#Water Attribute Attack#
-185,-1,6,1,2,0,0,10,1,no,0,2,0,weapon,0 //NPC_GROUNDATTACK#Earth Attribute Attack#
-186,-1,6,1,3,0,0,10,1,no,0,2,0,weapon,0 //NPC_FIREATTACK#Fire Attribute Attack#
-187,-1,6,1,4,0,0,10,1,no,0,2,0,weapon,0 //NPC_WINDATTACK#Wind Attribute Attack#
-188,-1,6,1,5,0,0,10,1,no,0,2,0,weapon,0 //NPC_POISONATTACK#Poison Attribute Attack#
-189,-1,6,1,6,0,0,10,1,no,0,2,0,weapon,0 //NPC_HOLYATTACK#Holy Attribute Attack#
-190,-1,6,1,7,0,0,10,1,no,0,2,0,weapon,0 //NPC_DARKNESSATTACK#Shadow Attribute Attack#
-191,-1,6,1,8,0,0,10,1,no,0,2,0,weapon,0 //NPC_TELEKINESISATTACK#Sense Attribute Attack#
-192,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MAGICALATTACK#Demon Shock Attack#
-193,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_METAMORPHOSIS#Metamorphosis#
-194,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_PROVOCATION#Provocation#
-195,0,6,4,0,0,0,10,1,no,0,2,0,misc,0 //NPC_SMOKING#Smoking#
-196,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_SUMMONSLAVE#Follower Summons#
-197,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_EMOTION#Emotion#
-198,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_TRANSFORMATION#Transformation#
-199,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLOODDRAIN#Sucking Blood#
-200,9,6,1,7,0,0,10,1,no,0,2,0,magic,0 //NPC_ENERGYDRAIN#Energy Drain#
-201,0,0,4,0,1,0,10,1,no,0,2,0,weapon,0 //NPC_KEEPING#Keeping#
-202,2,6,1,7,0,0,5,1,no,0,2,0,misc,0 //NPC_DARKBREATH#Dark Breath#
-203,9,6,1,7,1,0,10,1,no,0,2,0,magic,0 //NPC_DARKBLESSING#Dark Blessing#
-204,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_BARRIER#Barrier#
-205,0,0,4,0,1,0,10,1,no,0,2,0,weapon,0 //NPC_DEFENDER#Defender#
-206,1,6,1,-1,1,0,10,1,no,0,2,0,weapon,0 //NPC_LICK#Lick#
-207,9,0,1,0,1,0,10,1,no,0,2,0,magic,0 //NPC_HALLUCINATION#Hallucination#
-208,0,0,4,0,1,0,1,1,no,0,2,0,magic,0 //NPC_REBIRTH#Rebirth#
-209,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_SUMMONMONSTER#Monster Summons#
-210,0,0,0,-1,0,0,10,0,no,0,0,0,weapon,0 //RG_SNATCHER#Gank#
-211,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0 //RG_STEALCOIN#Mug#
-212,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //RG_BACKSTAP#Back Stab#
-213,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_TUNNELDRIVE#Stalk#
-214,0,6,4,-1,2,1,5,1,no,0,0,0,weapon,0 //RG_RAID#Sightless Raid#
-215,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPWEAPON#Divest Weapon#
-216,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPSHIELD#Divest Shield#
-217,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPARMOR#Divest Armor#
-218,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPHELM#Divest Helm#
-219,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //RG_INTIMIDATE#Snatch#
-220,1,6,2,0,1,0,1,1,no,0,0,0,none,0 //RG_GRAFFITI#Scribble#
-221,0,6,2,0,1,0,5,1,no,0,0,0,none,0 //RG_FLAGGRAFFITI#Piece#
-222,1,6,2,0,3,5,1,1,no,0,0,0,none,0 //RG_CLEANER#Remover#
-223,0,0,0,0,0,1,1,0,no,0,0,0,none,0 //RG_GANGSTER#Slyness#
-224,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_COMPULSION#Haggle#
-225,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //RG_PLAGIARISM#Intimidate#
-226,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AM_AXEMASTERY#Axe Mastery#
-227,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_LEARNINGPOTION#Potion Research#
-228,0,6,4,0,1,0,10,0,no,0,0,0,none,0 //AM_PHARMACY#Prepare Potion#
-229,9,6,2,3,1,0,5,1,yes,0,0,0,weapon,0 //AM_DEMONSTRATION#Bomb#
-230,9,6,1,0,0,0,5,1,yes,0,0,0,weapon,0 //AM_ACIDTERROR#Acid Terror#
-231,9,6,16,0,1,0,5,1,yes,0,3072,0,none,0 //AM_POTIONPITCHER#Aid Potion#
-232,4,6,2,0,1,0,5,1,no,0,0,5,none,0 //AM_CANNIBALIZE#Summon Flora#
-233,1,6,2,0,1,0,5,1,no,0,0,3,none,0 //AM_SPHEREMINE#Summon Marine Sphere#
-234,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_WEAPON#Alchemical Weapon#
-235,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_SHIELD#Synthesized Shield#
-236,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_ARMOR#Synthetic Armor#
-237,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_HELM#Biochemical Helm#
-238,0,0,0,0,0,0,1,0,no,0,1,0,none,0 //AM_BIOETHICS#Basis of Life#
-//239,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_BIOTECHNOLOGY#Biotechnology#
-//240,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CREATECREATURE#Life Creation#
-//241,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CULTIVATION#Cultivation#
-//242,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_FLAMECONTROL#Flame Control#
-243,0,0,4,0,1,1,1,0,no,0,0,0,none,0 //AM_CALLHOMUN#Call Homunculus#
-244,0,0,4,0,1,0,1,0,no,0,0,0,none,0 //AM_REST#Peaceful Rest#
-//245,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_DRILLMASTER#Drillmaster#
-//246,9,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_HEALHOMUN#Heal Homunculus#
-247,9,6,4,0,1,1,5,0,no,0,0,0,none,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
-248,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //CR_TRUST#Faith#
-249,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_AUTOGUARD#Guard#
-250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9 //CR_SHIELDCHARGE#Smite#
-251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#Shield Reflect#
-253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0 //CR_HOLYCROSS#Holy Cross#
-254,0,6,4,6,0,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#Grand Cross#
-255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,1536,0,none,0 //CR_DEVOTION#Sacrifice#
-256,9,6,16,0,1,0,5,1,yes,0,512,0,none,0 //CR_PROVIDENCE#Resistant Souls#
-257,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#Defending Aura#
-258,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#Spear Quicken#
-259,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_IRONHAND#Iron Fists#
-260,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
-261,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
-262,9,6,16,0,1,0,1,1,yes,0,0,0,weapon,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
-263,-1,8,0,-1,0,0,10,-3,no,0,0,0,weapon,0 //MO_TRIPLEATTACK#Raging Triple Blow#
-264,18,6,2,0,1,0,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#Snap#
-265,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_DODGE#Dodge#
-266,2,6,1,0,0,0,5,1,no,0,0,0,weapon,0 //MO_INVESTIGATE#Occult Impact#
-267,9,8,1,-1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
-268,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //MO_STEELBODY#Mental Strength#
-269,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //MO_BLADESTOP#Root#
-270,0,6,4,0,1,0,5,0,no,0,0,0,weapon,0 //MO_EXPLOSIONSPIRITS#Fury#
-271,-2,6,4,0,0,0,5,1,yes,0,512,0,weapon,0 //MO_EXTREMITYFIST#Asura Strike#
-272,-2,8,4,-1,0,0,5,-4,no,0,512,0,weapon,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
-273,-2,6,4,-1,2,2,5,1,no,0,512,0,weapon,0 //MO_COMBOFINISH#Raging Thrust#
-274,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SA_ADVANCEDBOOK#Study#
-275,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //SA_CASTCANCEL#Cast Cancel#
-276,0,6,4,0,1,0,5,1,yes,0,0,0,magic,0 //SA_MAGICROD#Magic Rod#
-277,9,6,1,0,1,0,5,1,yes,0,0,0,magic,0 //SA_SPELLBREAKER#Spell Break#
-278,0,0,0,0,0,0,10,0,no,0,0,0,magic,0 //SA_FREECAST#Free Cast#
-279,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //SA_AUTOSPELL#Hindsight#
-280,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_FLAMELAUNCHER#Endow Blaze#
-281,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_FROSTWEAPON#Endow Tsunami#
-282,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_LIGHTNINGLOADER#Endow Tornado#
-283,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_SEISMICWEAPON#Endow Quake#
-284,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //SA_DRAGONOLOGY#Dragonology#
-285,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_VOLCANO#Volcano#
-286,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_DELUGE#Deluge#
-287,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_VIOLENTGALE#Whirlwind#
-288,3,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_LANDPROTECTOR#Magnetic Earth#
-289,9,6,1,0,1,0,5,1,yes,0,7680,0,magic,0 //SA_DISPELL#Dispel#
-290,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //SA_ABRACADABRA#Hocus-pocus#
-291,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_MONOCELL#Monocell#
-292,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_CLASSCHANGE#Class Change#
-293,0,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_SUMMONMONSTER#Summon Monster#
-294,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_REVERSEORCISH#Orcish Face#
-295,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_DEATH#Death#
-296,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_FORTUNE#Fortune#
-297,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_TAMINGMONSTER#Tame Monster#
-298,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_QUESTION#Question#
-299,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_GRAVITY#Gravity#
-300,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_LEVELUP#Level Up#
-301,9,6,4,0,0,0,1,1,yes,0,2,0,magic,0 //SA_INSTANTDEATH#Instant Death#
-302,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_FULLRECOVERY#Full Recovery#
-303,9,6,4,0,0,0,1,1,yes,0,2,0,magic,0 //SA_COMA#Coma#
-304,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //BD_ADAPTATION#Amp#
-305,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //BD_ENCORE#Encore#
-306,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_LULLABY#Lullaby#
-307,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_RICHMANKIM#Mental Sensing#
-308,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_ETERNALCHAOS#Down Tempo#
-309,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-310,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-311,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_ROKISWEIL#Classical Pluck#
-312,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_INTOABYSS#Power Chord#
-313,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_SIEGFRIED#Acoustic Rhythm#
-//314,0,0,0,0,0,0,1,1,no,0,64,0,misc,0 //BD_RAGNAROK#Ragnarok#
-315,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BA_MUSICALLESSON#Music Lesson#
-316,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //BA_MUSICALSTRIKE#Melody Strike#
-317,0,8,4,0,1,0,5,1,no,0,32,0,misc,0 //BA_DISSONANCE#Unchained Serenade#
-318,0,6,4,0,3,-1,5,1,no,0,0,0,misc,0 //BA_FROSTJOKE#Unbarring Octave#
-319,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_WHISTLE#Perfect Tablature#
-320,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_ASSASSINCROSS#Impressive Riff#
-321,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_POEMBRAGI#Magic Strings#
-322,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_APPLEIDUN#Song of Lutie#
-323,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //DC_DANCINGLESSON#Dance Lessons#
-324,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //DC_THROWARROW#Slinging Arrow#
-325,0,8,4,0,1,0,5,1,no,0,32,0,misc,0 //DC_UGLYDANCE#Hip Shaker#
-326,0,6,4,0,3,-1,5,1,no,0,0,0,misc,0 //DC_SCREAM#Dazzler#
-327,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_HUMMING#Focus Ballet#
-328,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_DONTFORGETME#Slow Grace#
-329,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_FORTUNEKISS#Lady Luck#
-330,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
-331,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_RANDOMMOVE
-332,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_SPEEDUP
-333,0,6,4,0,1,0,1,0,no,0,2,0,none,0 //NPC_REVENGE
-334,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_MALE#I Will Protect You#
-335,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_FEMALE#I Look up to You#
-336,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLPARTNER#I miss You#
-337,9,6,1,-1,0,0,1,1,no,0,2,0,weapon,0 //ITM_TOMAHAWK#Throw Tomahawk#
-338,-1,8,1,7,0,0,0,-2,no,0,2,0,weapon,0 //NPC_DARKCROSS#Cross of Darkness#
-339,0,6,4,7,0,0,10,1,no,33,258,0,magic,0 //NPC_GRANDDARKNESS#Grand cross of Darkness#
-340,9,8,1,7,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,2,0,magic,0 //NPC_DARKSTRIKE#Soul Strike of Darkness#
-341,9,8,1,7,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,2,0,magic,2:3:3:4:4:5:5:6:6:7 //NPC_DARKTHUNDER#Darkness Jupiter#
-342,9,6,1,0,1,0,1,0,no,0,2,0,none,0 //NPC_STOP
-343,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKWEAPON#Break weapon#
-344,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKARMOR#Break armor#
-345,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKHELM#Break helm#
-346,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKSHIELD#Break shield#
-347,-1,6,1,9,0,0,10,1,no,0,2,0,weapon,0 //NPC_UNDEADATTACK
-348,9,0,1,9,1,0,10,1,no,0,2,0,magic,0 //NPC_CHANGEUNDEAD
-349,0,6,4,0,1,0,10,0,no,0,2,0,weapon,0 //NPC_POWERUP
-350,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_AGIUP
-351,0,0,0,0,1,0,0,0,no,0,2,0,none,0 //NPC_SIEGEMODE
-352,2,0,4,0,1,0,1,0,no,0,2,0,none,0 //NPC_CALLSLAVE
-353,0,0,0,0,1,0,0,0,no,0,2,0,none,0 //NPC_INVISIBLE
-354,2,6,4,0,1,0,20,0,no,0,2,0,misc,0 //NPC_RUN
-355,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //LK_AURABLADE#Aura Blade#
-356,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //LK_PARRYING#Parrying#
-357,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //LK_CONCENTRATION#Concentration#
-358,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_TENSIONRELAX#Relax#
-359,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_BERSERK#Frenzy#
-//360,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_FURY#Fury#
-361,9,6,16,0,3,1,5,1,yes,0,0,0,magic,0 //HP_ASSUMPTIO#Assumptio#
-362,4,6,4,0,1,0,5,1,yes,0,0,0,magic,2 //HP_BASILICA#Basilica#
-363,0,0,0,0,0,0,10,0,no,0,0,0,magic,0 //HP_MEDITATIO#Meditatio#
-364,0,0,0,0,0,0,10,1,no,0,0,0,magic,0 //HW_SOULDRAIN#Soul Drain#
-365,9,8,1,-1,0,0,1,1,yes,0,0,0,weapon,0 //HW_MAGICCRASHER#Stave Crasher#
-366,0,6,4,0,1,0,10,1,no,0,0,0,magic,0 //HW_MAGICPOWER#Mystical Amplification#
-367,9,8,1,0,0,0,5,1,no,0,0,0,misc,0 //PA_PRESSURE#Gloria Domini#
-368,0,6,4,0,1,0,5,1,yes,0,0,0,weapon,0 //PA_SACRIFICE# Martyr's Reckoning#
-369,0,6,4,0,1,0,10,1,yes,0,0,0,misc,0 //PA_GOSPEL#Battle Chant#
-370,-2,6,1,-1,0,0,5,1,yes,0,0,0,weapon,3 //CH_PALMSTRIKE#Raging Palm Strike#
-371,-2,8,4,-1,0,0,5,1,no,0,512,0,weapon,0 //CH_TIGERFIST#Glacier Fist#
-372,-2,8,4,-1,0,0,10,-1:-1:-2:-2:-3:-3:-4:-4:-5:-5,no,0,512,0,weapon,0 //CH_CHAINCRUSH#Chain Crush Combo#
-373,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#Health Conversion#
-374,9,6,16,0,1,0,1,1,yes,0,7168,0,none,0 //PF_SOULCHANGE#Soul Exhale#
-375,9,6,1,0,0,0,5,1,yes,0,0,0,magic,0 //PF_SOULBURN#Soul Siphon#
-376,0,0,0,0,1,0,5,1,no,0,0,0,weapon,0 //ASC_KATAR#Advanced Katar Mastery#
-//377,0,0,4,0,1,0,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#Hallucination Walk#
-378,0,6,4,5,1,0,5,1,no,0,1024,0,weapon,0 //ASC_EDP#Deadly Poison Enchantment#
-379,9,6,1,-1,0,0,10,1,yes,0,0,0,weapon,0 //ASC_BREAKER#Soul Destroyer#
-380,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //SN_SIGHT#Falcon Eyes#
-381,5,8,1,0,0,0,5,1,yes,0,0,0,misc,0 //SN_FALCONASSAULT#Falcon Assault#
-382,4,8,1,-1,0,2,5,1,yes,0,0,0,weapon,0 //SN_SHARPSHOOTING#Focused Arrow Strike#
-383,0,6,4,0,3,-1,10,1,yes,0,0,0,weapon,0 //SN_WINDWALK#Wind Walker#
-384,0,0,4,0,1,0,10,1,yes,0,0,0,weapon,0 //WS_MELTDOWN#Shattering Strike#
-//385,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //WS_CREATECOIN#Create Coins#
-//386,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //WS_CREATENUGGET#Create Nuggets#
-387,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //WS_CARTBOOST#Cart Boost#
-//388,9,6,2,0,1,0,5,1,no,0,0,0,none,0 //WS_SYSTEMCREATE#Auto Attack System#
-389,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //ST_CHASEWALK#Stealth#
-390,0,0,4,0,0,0,5,1,yes,0,0,0,weapon,0 //ST_REJECTSWORD#Counter Instinct#
-//391,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0 //ST_STEALBACKPACK#Steal Backpack#
-392,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //CR_ALCHEMY#Alchemy#
-393,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //CR_SYNTHESISPOTION#Potion Synthesis#
-394,9,8,1,-1,0,0,10,-9,yes,0,0,0,weapon,0 //CG_ARROWVULCAN#Vulcan Arrow#
-395,0,0,4,0,1,3,1,1,yes,0,64,0,misc,2 //CG_MOONLIT#Sheltering Bliss#
-396,-1,6,16,0,1,0,1,1,yes,0,1536,0,none,0 //CG_MARIONETTE#Marionette Control#
-397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#Spiral Pierce#
-398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#Traumatic Blow#
-399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#Vital Strike#
-400,9,8,1,8,4,1,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#Napalm Vulcan#
-401,0,6,4,0,1,0,1,1,yes,0,0,0,none,0 //CH_SOULCOLLECT#Zen#
-402,9,6,1,0,1,0,5,1,no,0,0,0,none,0 //PF_MINDBREAKER#Mind Breaker#
-403,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0 //PF_MEMORIZE#Foresight#
-404,9,6,2,2,1,0,5,1,yes,0,256,2,magic,0 //PF_FOGWALL#Blinding Mist#
-405,7,6,1,0,1,0,1,1,no,0,0,3,magic,0 //PF_SPIDERWEB#Fiber Lock#
-406,0,6,4,-1,2,2,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#Meteor Assault#
-407,0,6,4,0,1,0,1,0,no,0,0,0,none,0 //ASC_CDP#Create Deadly Poison#
-408,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_BABY#Baby#
-409,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLPARENT#Call Parent#
-410,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLBABY#Call Baby#
-411,0,6,4,0,1,0,10,1,yes,0,0,0,misc,4 //TK_RUN#Running#
-412,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYSTORM#Prepare Whirlwind#
-413,-2,8,4,-1,2,2,7,-3,no,0,512,0,weapon,0 //TK_STORMKICK#Whirlwind Kick#
-414,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYDOWN#Prepare Axe Kick#
-415,-2,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_DOWNKICK#Axe Kick#
-416,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYTURN#Prepare Round Kick#
-417,-2,8,4,-1,2,1,7,-3,no,0,512,0,weapon,2 //TK_TURNKICK#Round Kick#
-418,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYCOUNTER#Prepare Counter Kick#
-419,-2,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_COUNTER#Counter Kick#
-420,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_DODGE#Break Fall#
-421,9,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_JUMPKICK#Flying Side Kick#
-422,0,0,0,0,0,1,10,0,no,0,0,0,none,0 //TK_HPTIME#Peaceful Rest#
-423,0,0,0,0,0,1,10,0,no,0,0,0,none,0 //TK_SPTIME#Enjoyable Rest#
-424,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //TK_POWER#Fighting Chant#
-425,0,6,4,2:4:1:3:8:7:6,1,0,7,1,no,0,0,0,weapon,0 //TK_SEVENWIND#Mild Wind#
-426,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //TK_HIGHJUMP#Taekwon Jump#
-427,0,6,4,0,1,0,3,1,yes,0,0,0,magic,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
-428,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_SUN_WARM#Warmth of the Sun#
-429,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_MOON_WARM#Warmth of the Moon#
-430,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_STAR_WARM#Warmth of the Star#
-431,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_SUN_COMFORT#Comfort of the Sun#
-432,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_MOON_COMFORT#Comfort of the Moon#
-433,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_STAR_COMFORT#Comfort of the Star#
-434,10,6,1,0,1,0,3,1,yes,0,0,0,magic,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
-435,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_SUN_ANGER#Sun's Wrath#
-436,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_MOON_ANGER#Moon's Wrath#
-437,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_STAR_ANGER#Stars's Wrath#
-438,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_SUN_BLESS#Blessing of the Sun#
-439,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_MOON_BLESS#Blessing of the Moon#
-440,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_STAR_BLESS#Blessing of the Star#
-441,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
-442,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
-443,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
-444,0,6,4,0,1,0,1,1,no,0,0,0,misc,0 //SG_FUSION#Union of the Sun, Moon and Stars#
-445,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ALCHEMIST#Spirit of the Alchemist#
-446,9,6,16,0,1,0,1,1,yes,0,3080,0,none,0 //AM_BERSERKPITCHER#Berserk Pitcher#
-447,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_MONK#Spirit of the Monk#
-448,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_STAR#Spirit of the Star Knight#
-449,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SAGE#Spirit of the Professor#
-450,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_CRUSADER#Spirit of the Crusader#
-451,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SUPERNOVICE#Spirit of the Supernovice#
-452,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_KNIGHT#Spirit of the Knight#
-453,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_WIZARD#Spirit of the Wizard#
-454,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_PRIEST#Spirit of the Priest#
-455,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_BARDDANCER#Spirit of the Artist#
-456,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ROGUE#Spirit of the Rogue#
-457,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ASSASIN#Spirit of the Assasin#
-458,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_BLACKSMITH#Spirit of the Blacksmith#
-459,0,6,4,0,3,-1,1,1,no,0,8,0,weapon,0 //BS_ADRENALINE2#Full Adrenaline Rush#
-460,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_HUNTER#Spirit of the Hunter#
-461,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SOULLINKER#Spirit of the Soul Linker#
-462,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAIZEL#Kaizel#
-463,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAAHI#Kahai#
-464,9,6,16,0,1,0,3,1,yes,0,0,0,magic,0 //SL_KAUPE#Kauf#
-465,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAITE#Kaite#
-466,0,0,0,0,0,0,7,0,yes,0,0,0,magic,0 //SL_KAINA#Kaina#
-467,9,6,1,-2,0,0,7,1,no,0,0,0,magic,2 //SL_STIN#Estin#
-468,9,6,1,-2,0,0,7,1,no,0,0,0,magic,0 //SL_STUN#Estern#
-469,9,8,1,-2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //SL_SMA#Esma#
-470,9,6,1,0,1,0,7,1,no,0,0,0,magic,0 //SL_SWOO#Esu#
-471,9,6,1,0,1,0,3,1,no,0,0,0,magic,0 //SL_SKE#Esk#
-472,9,6,1,0,1,0,3,1,no,0,0,0,magic,0 //SL_SKA#Eska#
-473,0,0,0,0,0,0,0,0,no,0,0,0,none,0 //SM_SELFPROVOKE##
-474,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_EMOTION_ON##
-475,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //ST_PRESERVE#Preserve#
-476,1,6,1,0,1,0,5,1,yes,0,0,0,weapon,0 //ST_FULLSTRIP#Divest All#
-477,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //WS_WEAPONREFINE#Upgrade Weapon#
-478,3,6,2,0,3,3,10,1,no,0,0,0,none,0 //CR_SLIMPITCHER#Aid Condensed Potion#
-479,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //CR_FULLPROTECTION#Full Protection#
-480,4,8,1,0,0,0,5,5,no,0,0,0,weapon,0 //PA_SHIELDCHAIN#Shield Chain#
-481,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //HP_MANARECHARGE#Mana Recharge#
-482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_DOUBLECASTING#Double Casting#
-483,9,6,2,0,1,1,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein#
-484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field#
-485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //WS_CARTTERMINATION#Cart Termination#
-486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
-487,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //CG_LONGINGFREEDOM#Longing for Freedom#
-488,0,6,4,0,1,1,5,1,no,0,64,0,misc,0 //CG_HERMODE#Wand of Hermod#
-489,9,6,1,0,1,0,5,1,no,0,0,0,misc,0 //CG_TAROTCARD#Tarot Card of Fate#
-490,9,8,1,0,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,misc,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
-491,1,6,2,0,1,0,2,1,no,0,0,0,none,0 //CR_CULTIVATION#Cultivation#
-
-493,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //TK_MISSION#Taekwon Mission#
-494,9,6,16,0,1,0,5,1,yes,0,0,0,magic,0 //SL_HIGH#Spirit of Rebirth#
-495,0,6,4,0,1,0,1,1,no,0,8,0,weapon,0 //KN_ONEHAND#Onehand Quicken#
-496,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT1#Twilight Alchemy 1#
-497,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT2#Twilight Alchemy 2#
-498,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT3#Twilight Alchemy 3#
-499,-9,8,4,-1,0,0,1,2,no,0,520,0,weapon,0 //HT_POWER#Beast Strafing#
-//Temp Plugs(using bash as base)
-500,0,6,4,0,0,0,5,1,no,0,0,0,misc,0 //GS_GLITTERING#Flip the Coin#
-501,9,6,1,-1,0,0,1,1,no,0,0,0,misc,0 //GS_FLING#Fling#
-502,-9,8,1,-1,0,0,1,3,no,0,0,0,weapon,0 //GS_TRIPLEACTION#Triple Action#
-503,-9,6,1,-1,0,0,1,1,no,0,0,0,weapon,0 //GS_BULLSEYE#Bulls Eye#
-504,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_MADNESSCANCEL#Madness Canceler#
-505,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_ADJUSTMENT#AdJustment#
-506,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_INCREASING#Increasing Accuracy#
-507,-9,6,1,8,0,0,1,1,no,0,0,0,weapon,0 //GS_MAGICALBULLET#Magical Bullet#
-508,-9,6,1,-1,1,0,1,1,no,0,0,0,weapon,0 //GS_CRACKER#Cracker#
-509,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //GS_SINGLEACTION#Single Action#
-510,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //GS_SNAKEEYE#Snake Eye#
-511,-9,8,0,-1,0,0,10,2,no,0,0,0,weapon,0 //GS_CHAINACTION#Chain Action#
-512,-9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //GS_TRACKING#Tracking#
-513,-9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //GS_DISARM#Disarm#
-514,-9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //GS_PIERCINGSHOT#Piercing Shot#
-515,-9,8,1,-1,0,0,10,5,no,0,0,0,weapon,0 //GS_RAPIDSHOWER#Rapid Shower#
-516,0,8,4,-1,2,3,10,1,no,0,0,0,weapon,0 //GS_DESPERADO#Desperado#
-517,0,6,4,-1,1,0,10,1,no,0,0,0,weapon,0 //GS_GATLINGFEVER#Gatling Fever#
-518,2,6,1,-1,0,0,10,1,no,0,0,0,weapon,5 //GS_DUST#Dust#
-519,-9,6,1,-1,0,0,10,1,yes,0,0,0,weapon,0 //GS_FULLBUSTER#Full Buster#
-520,-9,6,1,-1,2,1:1:1:2:2:2:3:3:3:4,10,1,no,0,0,0,weapon,0 //GS_SPREADATTACK#Spread Attack#
-521,-9,6,2,-1,0,1,10,1,no,0,0,0,weapon,3 //GS_GROUNDDRIFT#Ground Drift#
-522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU#
-523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //NJ_SYURIKEN#NJ_SYURIKEN#
-524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0 //NJ_KUNAI#NJ_KUNAI#
-525,9,8,1,-1,4,1,5,-3:-3:-4:-4:-5,yes,0,0,0,weapon,0 //NJ_HUUMA#NJ_HUUMA#
-526,9,6,1,0,0,0,10,1,no,0,0,0,misc,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
-527,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,3 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
-528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
-529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
-530,7:9:11:13:15,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
-531,0,6,4,0,1,0,5,1,no,0,0,0,none,7 //NJ_UTSUSEMI#NJ_UTSUSEMI#
-532,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
-533,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //NJ_NINPOU#NJ_NINPOU#
-534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //NJ_KOUENKA#NJ_KOUENKA#
-535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0 //NJ_KAENSIN#NJ_KAENSIN#
-536,9,8,1,3,2,2,5,3,yes,0,0,0,magic,0 //NJ_BAKUENRYU#NJ_BAKUENRYU#
-537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU#
-538,9,6,2,0,1,0,10,1,yes,0,0,0,magic,0 //NJ_SUITON#NJ_SUITON#
-539,0,6,4,1,2,3,5,1,yes,0,0,0,magic,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
-540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0 //NJ_HUUJIN#NJ_HUUJIN#
-541,9,6,4,4,2,2:2:3:3:4,5,1,yes,0,0,0,magic,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI#
-542,5:6:7:8:9,8,1,4,0,1,5,1,yes,0,0,0,magic,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
-543,0,6,4,0,1,0,5,1,yes,0,0,0,none,0 //NJ_NEN#NJ_NEN#
-544,-5,6,1,0,0,0,10,1,no,0,0,0,weapon,0 //NJ_ISSEN#NJ_ISSEN#
-
-1001,9,6,1,-1,0,0,1,1,no,0,1,0,weapon,0 //KN_CHARGEATK#Charge Attack#
-1002,0,6,4,0,1,0,1,0,no,0,1,0,weapon,2 //CR_SHRINK#Shrink#
-1003,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //AS_SONICACCEL#Sonic Acceleration#
-1004,9,8,1,0,0,0,1,1,no,0,1,0,weapon,0 //AS_VENOMKNIFE#Throw Venom Knive#
-1005,1,6,1,0,1,0,1,1,no,0,1,0,weapon,0 //RG_CLOSECONFINE#Close Confine#
-1006,0,6,4,3,0,2,1,1,yes,0,1,0,magic,3 //WZ_SIGHTBLASTER#Sight Blaster#
-1007,0,6,4,0,1,0,10,0,no,0,1,0,none,0 //SA_CREATECON#Create Converter#
-1008,9,6,1,1,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTWATER#Elemental Change Water#
-1009,-9,6,1,0,0,0,1,1,no,0,1,0,weapon,3 //HT_PHANTASMIC#Phantasmic Arrow#
-1010,9,6,1,0,1,0,1,0,no,0,1,0,misc,0 //BA_PANGVOICE#Pang Voice#
-1011,9,6,1,0,1,0,1,0,no,0,1,0,misc,0 //DC_WINKCHARM#Wink of Charm#
-1012,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //BS_UNFAIRLYTRICK#Unfair Trick#
-1013,0,6,4,0,3,2,1,0,no,0,1,0,weapon,0 //BS_GREED#Greed#
-1014,0,6,4,6,3,14,1,0,yes,0,1,0,magic,0 //PR_REDEMPTIO#Redemptio#
-1015,9,6,16,0,1,0,1,1,no,0,1025,0,weapon,0 //MO_KITRANSLATION#Ki Translation#
-1016,-1,6,1,-1,2,1,1,1,no,0,1,0,weapon,5 //MO_BALKYOUNG#Ki Explosion#
-1017,9,6,1,2,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTGROUND#Elemental Change Earth#
-1018,9,6,1,3,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTFIRE#Elemental Change Fire#
-1019,9,6,1,4,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTWIND#Elemental Change Wind#
-
-//homunculus
-8001,9,6,4,0,1,0,5,1,no,0,0,0,magic,0 //HLIF_HEAL#Healing hand#
-8002,0,6,4,0,3,-1,5,1,no,0,0,0,none,0 //HLIF_AVOID
-8003,0,0,0,0,0,1,5,0,no,0,0,0,none,0 //HLIF_BRAIN
-8004,0,6,4,0,1,0,3,0,no,0,0,0,none,0 //HLIF_CHANGE
-8005,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HAMI_CASTLE
-8006,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HAMI_DEFENCE
-8007,0,0,0,0,1,0,5,0,no,0,0,0,none,0 //HAMI_SKIN
-8008,0,6,4,0,1,0,3,0,no,0,0,0,none,0 //HAMI_BLOODLUST
-8009,1,8,1,0,0,0,5,-1:-2:-2:-2:-3,no,0,0,0,weapon,0 //HFLI_MOON
-8010,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HFLI_FLEET
-8011,0,6,4,0,1,0,5,0,yes,0,0,0,misc,0 //HFLI_SPEED
-8012,1,6,1,0,0,0,3,0,no,0,0,0,none,0 //HFLI_SBR44
-8013,9,6,1,0,0,0,5,1:2:3:4:5,no,0,0,0,magic,0 //HVAN_CAPRICE
-8014,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HVAN_CHAOTIC
-8015,0,0,0,0,1,0,5,0,no,0,0,0,none,0 //HVAN_INSTRUCT
-8016,0,6,4,-1,2,4,3,1,no,0,0,0,misc,0 //HVAN_EXPLOSION
-
-//id,range,hit,inf,pl,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
-10000,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_APPROVAL#Approval#
-10001,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_KAFRACONTRACT#Kafra Contract#
-10002,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GUARDRESEARCH#Guardian Research#
-10003,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GUARDUP#Guardian Training#
-10004,0,0,0,0,0,0,10,0,no,0,16,0,none,0 //GD_EXTENSION#Guild Extension#
-10005,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GLORYGUILD#Guild's Glory#
-10006,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_LEADERSHIP#Great Leadership#
-10007,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_GLORYWOUNDS#Wounds of Glory#
-10008,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_SOULCOLD#Cold Soul#
-10009,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_HAWKEYES#Sharp Eyes#
-10010,0,0,4,0,3,15,1,0,yes,0,16,0,none,0 //GD_BATTLEORDER#Battle Orders#
-10011,0,0,4,0,3,15,3,0,yes,0,16,0,none,0 //GD_REGENERATION#Regeneration#
-10012,0,0,4,0,3,15,1,0,yes,0,16,0,none,0 //GD_RESTORE#Restore#
-10013,0,0,4,0,3,0,1,0,yes,0,16,0,none,0 //GD_EMERGENCYCALL#Rally Guild#
-10014,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_DEVELOPMENT#Extend Guild#
+//id,range,hit,inf,pl,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
+// 01 ID
+// 02 range (combo skills do not check for range when used, if 0 and skill is
+// not inf = 4, use attack range)
+// 03 hit (8- repeated hitting, 6- single-hit)
+// 04 inf (0- passive, 1- enemy, 2- place, 4- self, 16- friend, 32- trap)
+// 05 pl attributes (0- nothing, 1- water, 2- earth, 3- fire, 4- wind,
+// 5- poison, 6- saint, 7- darkness, 8- sense, 9- immortality)
+// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill,
+// 3-no damage area skill, 4-splash and split damage skill)
+// 07 splash/effect range (-1 for screen-wide)
+// 08 MaxLv
+// 09 Number of hits (when positive, damage is increased by hits,
+// negative values just show number of hits without increasing total damage)
+// 10 castcancelled (it is cancelled at 1. Are not cancelled with 0)
+// 11 defense-reduction rate during cast.
+// 12 inf2 (skill information 2) (1- quest skill, 2- npc skill, 4- wedding skill
+// 8- spirit skill, 16- guild skill, 32- song/dance, 64- ensemble skill
+// 128- trap (can be targetted), 256- skill that damages/targets yourself
+// 512- cannot be casted on self (if inf = 4, auto-select target skill)
+// 1024- usable only on party-members, 2048- usable only on guild-mates
+// 4096- allow usage on enemies too (use with 1024/2048))
+// 13 maxcount: max amount of skill instances to place on the ground when
+// player_land_skill_limit/monster_land_skill_limit is enabled.
+// 14 attack type (none, weapon, magic, misc)
+// 15 Blowcount (amount of tiles skill knockbacks)
+1,0,0,0,0,0,0,9,0,no,0,0,0,none,0 //NV_BASIC#Basic Skill#
+2,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_SWORD#Sword Mastery#
+3,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SM_RECOVERY#Increase HP Recovery#
+5,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //SM_BASH#Bash#
+6,9,6,1,0,1,0,10,1,no,0,0,0,none,0 //SM_PROVOKE#Provoke#
+7,0,6,4,3,2,2,10,1,no,0,0,0,weapon,2 //SM_MAGNUM#Magnum Break#
+8,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //SM_ENDURE#Endure#
+9,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MG_SRECOVERY#Increase SP Recovery#
+10,0,6,4,3,3,3,1,1,yes,0,0,0,magic,0 //MG_SIGHT#Sight#
+11,9,6,1,8,4,1,10,1,yes,0,0,0,magic,0 //MG_NAPALMBEAT#Napalm Beat#
+12,9,8,2,8,1,0,10,1,yes,0,0,0,magic,0 //MG_SAFETYWALL#Safety Wall#
+13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //MG_SOULSTRIKE#Soul Strike#
+14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_COLDBOLT#Cold Bolt#
+15,9,6,1,1,0,0,10,1,yes,0,0,0,magic,0 //MG_FROSTDIVER#Frost Diver#
+16,2,6,1,2,1,0,10,1,yes,0,0,0,magic,0 //MG_STONECURSE#Stone Curse#
+17,9,6,1,3,2,2,10,1,yes,0,0,0,magic,0 //MG_FIREBALL#Fire Ball#
+18,9,6,2,3,0,0,10,1,yes,0,0,3,magic,1 //MG_FIREWALL#Fire Wall#
+19,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_FIREBOLT#Fire Bolt#
+20,9,8,1,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+21,9,8,2,4,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_THUNDERSTORM#Thunderstorm#
+22,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DP#Divine protection#
+23,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DEMONBANE#Demon Bane#
+24,0,6,4,6,3,2,1,1,yes,0,0,0,magic,0 //AL_RUWACH#Ruwach#
+25,9,6,2,0,1,0,1,1,yes,0,0,0,magic,0 //AL_PNEUMA#Pneuma#
+26,0,6,4,0,1,0,2,1,yes,0,0,0,magic,0 //AL_TELEPORT#Teleport#
+27,9,6,2,0,1,0,4,1,yes,0,0,3,magic,0 //AL_WARP#Warp Portal#
+28,9,6,16,6,1,0,10,1,yes,0,0,0,magic,0 //AL_HEAL#Heal#
+29,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //AL_INCAGI#Increase AGI#
+30,9,6,1,0,1,0,10,1,yes,0,0,0,magic,0 //AL_DECAGI#Decrease AGI#
+31,0,6,4,0,1,0,1,1,yes,0,0,0,magic,0 //AL_HOLYWATER#Aqua Benedicta#
+32,0,6,4,0,3,15,10,1,yes,0,0,0,magic,0 //AL_CRUCIS#Signum Crusis#
+33,0,6,4,0,3,-1,10,1,yes,0,0,0,magic,0 //AL_ANGELUS#Angelus#
+34,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //AL_BLESSING#Blessing#
+35,9,6,16,0,1,0,1,1,yes,0,0,0,magic,0 //AL_CURE#Cure#
+36,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_INCCARRY#Enlarge Weight Limit#
+37,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_DISCOUNT#Discount#
+38,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_OVERCHARGE#Overcharge#
+39,1,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_PUSHCART#Pushcart#
+40,1,6,4,0,1,0,1,1,no,0,0,0,none,0 //MC_IDENTIFY#Item Appraisal#
+41,1,6,4,0,1,0,10,1,no,0,0,0,none,0 //MC_VENDING#Vending#
+42,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //MC_MAMMONITE#Mammonite#
+43,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_OWL#Owl's Eye#
+44,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_VULTURE#Vulture's Eye#
+45,0,6,4,0,3,1,10,1,no,0,0,0,weapon,0 //AC_CONCENTRATION#Improve Concentration#
+46,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0 //AC_DOUBLE#Double Strafe#
+47,-9,6,2,-1,2,2,10,1,no,0,0,0,weapon,2 //AC_SHOWER#Arrow Shower#
+48,-1,8,0,-1,0,0,10,2,no,0,0,0,weapon,0 //TF_DOUBLE#Double Attack#
+49,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_MISS#Improve Dodge#
+50,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0 //TF_STEAL#Steal#
+51,1,6,4,0,1,0,10,1,no,0,0,0,none,0 //TF_HIDING#Hiding#
+52,-2,6,1,5,0,0,10,1,no,0,0,0,weapon,0 //TF_POISON#Envenom#
+53,9,6,16,5,1,0,1,1,no,0,0,0,weapon,0 //TF_DETOXIFY#Detoxify#
+54,9,6,16,6,1,0,4,1,yes,0,0,0,magic,0 //ALL_RESURRECTION#Resurrection#
+55,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //KN_SPEARMASTERY#Spear Mastery#
+56,-2,8,1,-1,0,0,10,3,no,0,0,0,weapon,0 //KN_PIERCE#Pierce#
+57,-2,6,1,-1,1,0,10,1,no,33,0,0,weapon,3 //KN_BRANDISHSPEAR#Brandish Spear#
+58,-4,6,1,-1,2,0,10,1,no,0,0,0,weapon,6 //KN_SPEARSTAB#Spear Stab#
+59,3:5:7:9:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+60,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+61,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,0 //KN_AUTOCOUNTER#Counter Attack#
+62,-2,6,1,-1,2,1,10,1,no,33,0,0,weapon,1:1:2:2:3:3:4:4:5:5 //KN_BOWLINGBASH#Bowling Bash#
+63,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //KN_RIDING#Peco Peco Riding#
+64,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+65,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //PR_MACEMASTERY#Mace Mastery#
+66,9,6,16,0,1,0,5,1,yes,0,0,0,magic,0 //PR_IMPOSITIO#Impositio Manus#
+67,9,6,16,0,1,0,3,1,yes,0,512,0,magic,0 //PR_SUFFRAGIUM#Suffragium#
+68,9,6,16,6,1,0,5,1,yes,0,0,0,magic,0 //PR_ASPERSIO#Aspersio#
+69,9,6,2,0,3,1,5,1,yes,0,64,0,magic,0 //PR_BENEDICTIO#B.S Sacramenti#
+70,9,6,2,6,1,0,10,1,yes,0,0,0,magic,1 //PR_SANCTUARY#Sanctuary#
+71,9,6,16,0,1,0,4,1,yes,0,0,0,magic,0 //PR_SLOWPOISON#Slow Poison#
+72,9,6,16,0,1,0,1,1,yes,0,0,0,magic,0 //PR_STRECOVERY#Status Recovery#
+73,9,6,16,0,1,0,10,1,yes,0,0,0,magic,0 //PR_KYRIE#Kyrie Eleison#
+74,0,6,4,0,3,-1,5,1,yes,0,0,0,magic,0 //PR_MAGNIFICAT#Magnificat#
+75,0,6,4,0,3,-1,5,1,yes,0,0,0,magic,0 //PR_GLORIA#Gloria#
+76,5,6,1,0,1,0,10,0,yes,0,0,0,magic,0 //PR_LEXDIVINA#Lex Divina#
+77,5,6,1,6,0,0,10,1,yes,0,0,0,magic,0 //PR_TURNUNDEAD#Turn Undead#
+78,9,6,1,0,1,0,1,0,yes,0,0,0,magic,0 //PR_LEXAETERNA#Lex Aeterna#
+79,9,8,2,6,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //PR_MAGNUS#Magnus Exorcismus#
+80,9,8,2,3,0,1:1:1:1:1:2:2:2:2:2:2,10,3:4:5:6:7:8:9:10:11:12:12,yes,0,0,5,magic,0 //WZ_FIREPILLAR#Fire Pillar#
+81,0,6,4,3,0,3,10,1,yes,0,0,0,magic,5 //WZ_SIGHTRASHER#Sightrasher#
+//82,9,6,2,3,0,0,10,1,yes,0,0,0,magic,0 //WZ_FIREIVY#Fire Ivy#
+83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0,0,magic,0 //WZ_METEOR#Meteor Storm#
+84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,2:3:3:4:4:5:5:6:6:7 //WZ_JUPITEL#Jupiter Thunder#
+85,9,8,2,4,0,0,10,-10,yes,0,0,0,magic,0 //WZ_VERMILION#Lord of Vermilion#
+86,9,8,1,1,0,0,5,1,yes,0,0,0,magic,0 //WZ_WATERBALL#Water Ball#
+87,9,6,2,1,0,0,10,1,yes,0,0,0,magic,0 //WZ_ICEWALL#Ice Wall#
+88,0,6,4,1,2,2,10,1,yes,0,0,0,magic,0 //WZ_FROSTNOVA#Frost Nova#
+89,9,6,2,1,0,0,10,1,yes,0,0,0,magic,2 //WZ_STORMGUST#Storm Gust#
+90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_EARTHSPIKE#Earth Spike#
+91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+92,9,6,2,2,1,0,5,1,yes,0,0,3,magic,0 //WZ_QUAGMIRE#Quagmire#
+93,9,6,1,0,1,0,1,1,yes,0,0,0,magic,0 //WZ_ESTIMATION#Sense#
+94,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_IRON#Iron Tempering#
+95,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_STEEL#Steel Tempering#
+96,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
+97,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ORIDECON#Oridecon Research#
+98,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_DAGGER#Smith Dagger#
+99,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SWORD#Smith Sword#
+100,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
+101,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_AXE#Smith Axe#
+102,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_MACE#Smith Mace#
+103,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_KNUCKLE#Smith Knucklebrace#
+104,0,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SPEAR#Smith Spear#
+105,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_HILTBINDING#Hilt Binding#
+106,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_FINDINGORE#Ore Discovery#
+107,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BS_WEAPONRESEARCH#Weaponry Research#
+108,2,6,16,0,1,0,1,1,yes,0,0,0,weapon,0 //BS_REPAIRWEAPON#Weapon Repair#
+109,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_SKINTEMPER#Skin Tempering#
+110,1,6,2,0,3,2:2:2:2:2:14,5,1,no,0,0,0,weapon,0 //BS_HAMMERFALL#Hammer Fall#
+111,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_ADRENALINE#Adrenaline Rush#
+112,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_WEAPONPERFECT#Weapon Perfection#
+113,0,6,4,0,3,-1,5,1,no,0,0,0,weapon,0 //BS_OVERTHRUST#Power-Thrust#
+114,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //BS_MAXIMIZE#Maximize Power#
+115,3,6,2,0,1,0,5,1,no,0,128,0,misc,6:7:8:9:10 //HT_SKIDTRAP#Skid Trap#
+116,3,6,2,2,0,0,5,1,no,0,128,0,misc,0 //HT_LANDMINE#Land Mine#
+117,3,6,2,0,1,0,5,1,no,0,128,0,misc,0 //HT_ANKLESNARE#Ankle Snare#
+118,3,6,2,0,2,1,5,1,no,0,128,0,misc,0 //HT_SHOCKWAVE#Shockwave Trap#
+119,3,6,2,0,3,2,5,1,no,0,128,0,misc,0 //HT_SANDMAN#Sandman#
+120,3,6,2,0,3,1,5,1,no,0,128,0,misc,0 //HT_FLASHER#Flasher#
+121,3,6,2,1,2,1,5,1,no,0,128,0,misc,0 //HT_FREEZINGTRAP#Freezing Trap#
+122,3,6,2,4,2,1,5,1,no,0,128,0,misc,0 //HT_BLASTMINE#Blast Mine#
+123,3,6,2,3,2,2,5,1,no,0,128,0,misc,0 //HT_CLAYMORETRAP#Claymore Trap#
+124,2,6,32,0,1,0,1,1,no,0,0,0,misc,0 //HT_REMOVETRAP#Remove Trap#
+125,3,6,2,0,1,0,1,1,no,0,0,0,misc,0 //HT_TALKIEBOX#Talkie Box#
+126,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //HT_BEASTBANE#Beast Bane#
+127,0,0,0,0,0,0,1,0,no,0,0,0,misc,0 //HT_FALCON#Falconry Mastery#
+128,0,0,0,0,0,0,10,0,no,0,0,0,misc,0 //HT_STEELCROW#Steel Crow#
+129,5,8,1,0,2,1,5,1:2:3:4:5,yes,0,0,0,misc,0 //HT_BLITZBEAT#Blitz Beat#
+130,3:5:7:9,6,2,0,3,3,4,1,no,0,0,0,misc,0 //HT_DETECTING#Detect#
+131,4:5:6:7:8,6,32,0,1,0,5,1,no,0,0,0,misc,0 //HT_SPRINGTRAP#Spring Trap#
+132,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_RIGHT#Righthand Mastery#
+133,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_LEFT#Lefthand Mastery#
+134,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AS_KATAR#Katar Mastery#
+135,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //AS_CLOAKING#Cloaking#
+136,-1,8,1,-1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#Sonic Blow#
+137,3:4:5:6:7,6,1,-1,2,1,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#Grimtooth#
+138,1,6,16,5,1,0,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#Enchant Poison#
+139,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#Poison React#
+140,2,6,2,5,1,0,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#Venom Dust#
+141,1,6,1,-1,1,2,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#Venom Splasher#
+142,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //NV_FIRSTAID#First Aid#
+143,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //NV_TRICKDEAD#Act Dead#
+144,0,0,0,0,0,0,1,0,no,0,1,0,none,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+145,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_FATALBLOW#Attack Weak Point#
+146,0,6,4,0,1,0,1,1,no,0,1,0,weapon,0 //SM_AUTOBERSERK#Auto Berserk#
+147,0,0,4,0,1,0,1,0,no,0,1,0,weapon,0 //AC_MAKINGARROW#Arrow Crafting#
+148,-9,6,1,-1,2,0,1,1,no,0,1,0,weapon,6 //AC_CHARGEARROW#Arrow Repel#
+149,1,6,1,2,0,0,1,1,no,0,1,0,weapon,0 //TF_SPRINKLESAND#Throw Sand#
+150,0,6,4,0,1,0,1,1,no,0,1,0,weapon,5 //TF_BACKSLIDING#Back Sliding#
+151,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //TF_PICKSTONE#Find Stone#
+152,7,6,1,0,0,0,1,1,no,0,1,0,misc,0 //TF_THROWSTONE#Stone Fling#
+153,1,6,1,-1,2,1,1,1,no,0,1,0,weapon,2 //MC_CARTREVOLUTION#Cart Revolution#
+154,0,6,4,0,1,0,1,1,no,0,1,0,none,0 //MC_CHANGECART#Change Cart#
+155,0,6,4,0,1,0,1,1,no,0,1,0,weapon,0 //MC_LOUD#Crazy Uproar#
+156,9,6,1,6,0,0,1,1,yes,0,1,0,magic,0 //AL_HOLYLIGHT#Holy Light#
+157,0,6,4,0,1,0,1,1,yes,0,1,0,magic,0 //MG_ENERGYCOAT#Energy Coat#
+158,3,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PIERCINGATT#Thrusting attack#
+159,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_MENTALBREAKER#Spirit Destruction#
+160,9,6,1,0,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANGEATTACK#Stand off attack#
+161,0,0,4,0,1,0,1,1,no,0,2,0,magic,0 //NPC_ATTRICHANGE#Run Attribute Change#
+162,0,0,4,1,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEWATER#Water Attribute Change#
+163,0,0,4,2,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEGROUND#Earth Attribute Change#
+164,0,0,4,3,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEFIRE#Fire Attribute Change#
+165,0,0,4,4,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEWIND#Wind Attribute Change#
+166,0,0,4,5,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEPOISON#Poison Attribute Change#
+167,0,0,4,6,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEHOLY#Holy Attribute Change#
+168,0,0,4,7,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGEDARKNESS#Shadow Attribute Change#
+169,0,0,4,8,1,0,1,1,no,0,2,0,magic,0 //NPC_CHANGETELEKINESIS#Sense Attribute Change#
+170,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CRITICALSLASH#Defense disregard attack#
+171,-1,8,1,-1,0,0,10,2:3:4:5:6:7:8:9:10:11,no,0,2,0,weapon,0 //NPC_COMBOATTACK#Multi-stage Attack#
+172,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_GUIDEATTACK#On-target Impact Attack#
+173,1,6,4,3,2,5,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION#Suicide bombing#
+174,-1,6,1,-1,2,3,1,1,no,0,2,0,weapon,0 //NPC_SPLASHATTACK#Splash attack#
+175,0,0,4,0,1,0,10,1,no,0,2,0,misc,0 //NPC_SUICIDE#Suicide#
+176,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_POISON#Poison Attack#
+177,7,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BLINDATTACK#Darkness Attack#
+178,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_SILENCEATTACK#Silence Attack#
+179,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_STUNATTACK#Stun Attack#
+180,7,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_PETRIFYATTACK#Petrify Attack#
+181,7,6,1,7,0,0,5,1,no,0,2,0,weapon,0 //NPC_CURSEATTACK#Cursing Attack #
+182,-1,6,1,-1,0,0,5,1,no,0,2,0,weapon,0 //NPC_SLEEPATTACK#Sleep attack#
+183,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANDOMATTACK#Random Attack #
+184,-1,6,1,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_WATERATTACK#Water Attribute Attack#
+185,-1,6,1,2,0,0,10,1,no,0,2,0,weapon,0 //NPC_GROUNDATTACK#Earth Attribute Attack#
+186,-1,6,1,3,0,0,10,1,no,0,2,0,weapon,0 //NPC_FIREATTACK#Fire Attribute Attack#
+187,-1,6,1,4,0,0,10,1,no,0,2,0,weapon,0 //NPC_WINDATTACK#Wind Attribute Attack#
+188,-1,6,1,5,0,0,10,1,no,0,2,0,weapon,0 //NPC_POISONATTACK#Poison Attribute Attack#
+189,-1,6,1,6,0,0,10,1,no,0,2,0,weapon,0 //NPC_HOLYATTACK#Holy Attribute Attack#
+190,-1,6,1,7,0,0,10,1,no,0,2,0,weapon,0 //NPC_DARKNESSATTACK#Shadow Attribute Attack#
+191,-1,6,1,8,0,0,10,1,no,0,2,0,weapon,0 //NPC_TELEKINESISATTACK#Sense Attribute Attack#
+192,-1,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MAGICALATTACK#Demon Shock Attack#
+193,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_METAMORPHOSIS#Metamorphosis#
+194,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_PROVOCATION#Provocation#
+195,0,6,4,0,0,0,10,1,no,0,2,0,misc,0 //NPC_SMOKING#Smoking#
+196,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_SUMMONSLAVE#Follower Summons#
+197,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_EMOTION#Emotion#
+198,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_TRANSFORMATION#Transformation#
+199,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLOODDRAIN#Sucking Blood#
+200,9,6,1,7,0,0,10,1,no,0,2,0,magic,0 //NPC_ENERGYDRAIN#Energy Drain#
+201,0,0,4,0,1,0,10,1,no,0,2,0,weapon,0 //NPC_KEEPING#Keeping#
+202,2,6,1,7,0,0,5,1,no,0,2,0,misc,0 //NPC_DARKBREATH#Dark Breath#
+203,9,6,1,7,1,0,10,1,no,0,2,0,magic,0 //NPC_DARKBLESSING#Dark Blessing#
+204,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_BARRIER#Barrier#
+205,0,0,4,0,1,0,10,1,no,0,2,0,weapon,0 //NPC_DEFENDER#Defender#
+206,1,6,1,-1,1,0,10,1,no,0,2,0,weapon,0 //NPC_LICK#Lick#
+207,9,0,1,0,1,0,10,1,no,0,2,0,magic,0 //NPC_HALLUCINATION#Hallucination#
+208,0,0,4,0,1,0,1,1,no,0,2,0,magic,0 //NPC_REBIRTH#Rebirth#
+209,0,0,4,0,1,0,10,1,no,0,2,0,magic,0 //NPC_SUMMONMONSTER#Monster Summons#
+210,0,0,0,-1,0,0,10,0,no,0,0,0,weapon,0 //RG_SNATCHER#Gank#
+211,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0 //RG_STEALCOIN#Mug#
+212,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //RG_BACKSTAP#Back Stab#
+213,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_TUNNELDRIVE#Stalk#
+214,0,6,4,-1,2,1,5,1,no,0,0,0,weapon,0 //RG_RAID#Sightless Raid#
+215,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPWEAPON#Divest Weapon#
+216,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPSHIELD#Divest Shield#
+217,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPARMOR#Divest Armor#
+218,1,6,1,0,1,0,5,1,no,0,0,0,weapon,0 //RG_STRIPHELM#Divest Helm#
+219,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //RG_INTIMIDATE#Snatch#
+220,1,6,2,0,1,0,1,1,no,0,0,0,none,0 //RG_GRAFFITI#Scribble#
+221,0,6,2,0,1,0,5,1,no,0,0,0,none,0 //RG_FLAGGRAFFITI#Piece#
+222,1,6,2,0,3,5,1,1,no,0,0,0,none,0 //RG_CLEANER#Remover#
+223,0,0,0,0,0,1,1,0,no,0,0,0,none,0 //RG_GANGSTER#Slyness#
+224,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_COMPULSION#Haggle#
+225,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //RG_PLAGIARISM#Intimidate#
+226,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AM_AXEMASTERY#Axe Mastery#
+227,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_LEARNINGPOTION#Potion Research#
+228,0,6,4,0,1,0,10,0,no,0,0,0,none,0 //AM_PHARMACY#Prepare Potion#
+229,9,6,2,3,1,0,5,1,yes,0,0,0,weapon,0 //AM_DEMONSTRATION#Bomb#
+230,9,6,1,0,0,0,5,1,yes,0,0,0,weapon,0 //AM_ACIDTERROR#Acid Terror#
+231,9,6,16,0,1,0,5,1,yes,0,3072,0,none,0 //AM_POTIONPITCHER#Aid Potion#
+232,4,6,2,0,1,0,5,1,no,0,0,5,none,0 //AM_CANNIBALIZE#Summon Flora#
+233,1,6,2,0,1,0,5,1,no,0,0,3,none,0 //AM_SPHEREMINE#Summon Marine Sphere#
+234,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_WEAPON#Alchemical Weapon#
+235,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_SHIELD#Synthesized Shield#
+236,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_ARMOR#Synthetic Armor#
+237,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //AM_CP_HELM#Biochemical Helm#
+238,0,0,0,0,0,0,1,0,no,0,1,0,none,0 //AM_BIOETHICS#Basis of Life#
+//239,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_BIOTECHNOLOGY#Biotechnology#
+//240,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CREATECREATURE#Life Creation#
+//241,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CULTIVATION#Cultivation#
+//242,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_FLAMECONTROL#Flame Control#
+243,0,0,4,0,1,1,1,0,no,0,0,0,none,0 //AM_CALLHOMUN#Call Homunculus#
+244,0,0,4,0,1,0,1,0,no,0,0,0,none,0 //AM_REST#Peaceful Rest#
+//245,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_DRILLMASTER#Drillmaster#
+//246,9,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_HEALHOMUN#Heal Homunculus#
+247,9,6,4,0,1,1,5,0,no,0,0,0,none,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
+248,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //CR_TRUST#Faith#
+249,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_AUTOGUARD#Guard#
+250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9 //CR_SHIELDCHARGE#Smite#
+251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#Shield Reflect#
+253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0 //CR_HOLYCROSS#Holy Cross#
+254,0,6,4,6,0,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#Grand Cross#
+255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,1536,0,none,0 //CR_DEVOTION#Sacrifice#
+256,9,6,16,0,1,0,5,1,yes,0,512,0,none,0 //CR_PROVIDENCE#Resistant Souls#
+257,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#Defending Aura#
+258,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#Spear Quicken#
+259,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_IRONHAND#Iron Fists#
+260,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
+261,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
+262,9,6,16,0,1,0,1,1,yes,0,0,0,weapon,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
+263,-1,8,0,-1,0,0,10,-3,no,0,0,0,weapon,0 //MO_TRIPLEATTACK#Raging Triple Blow#
+264,18,6,2,0,1,0,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#Snap#
+265,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_DODGE#Dodge#
+266,2,6,1,0,0,0,5,1,no,0,0,0,weapon,0 //MO_INVESTIGATE#Occult Impact#
+267,9,8,1,-1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
+268,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //MO_STEELBODY#Mental Strength#
+269,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //MO_BLADESTOP#Root#
+270,0,6,4,0,1,0,5,0,no,0,0,0,weapon,0 //MO_EXPLOSIONSPIRITS#Fury#
+271,-2,6,4,0,0,0,5,1,yes,0,512,0,weapon,0 //MO_EXTREMITYFIST#Asura Strike#
+272,-2,8,4,-1,0,0,5,-4,no,0,512,0,weapon,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
+273,-2,6,4,-1,2,2,5,1,no,0,512,0,weapon,0 //MO_COMBOFINISH#Raging Thrust#
+274,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SA_ADVANCEDBOOK#Study#
+275,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //SA_CASTCANCEL#Cast Cancel#
+276,0,6,4,0,1,0,5,1,yes,0,0,0,magic,0 //SA_MAGICROD#Magic Rod#
+277,9,6,1,0,1,0,5,1,yes,0,0,0,magic,0 //SA_SPELLBREAKER#Spell Break#
+278,0,0,0,0,0,0,10,0,no,0,0,0,magic,0 //SA_FREECAST#Free Cast#
+279,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //SA_AUTOSPELL#Hindsight#
+280,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_FLAMELAUNCHER#Endow Blaze#
+281,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_FROSTWEAPON#Endow Tsunami#
+282,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_LIGHTNINGLOADER#Endow Tornado#
+283,9,6,16,0,1,0,5,1,yes,0,3072,0,magic,0 //SA_SEISMICWEAPON#Endow Quake#
+284,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //SA_DRAGONOLOGY#Dragonology#
+285,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_VOLCANO#Volcano#
+286,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_DELUGE#Deluge#
+287,2,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_VIOLENTGALE#Whirlwind#
+288,3,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //SA_LANDPROTECTOR#Magnetic Earth#
+289,9,6,1,0,1,0,5,1,yes,0,7680,0,magic,0 //SA_DISPELL#Dispel#
+290,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //SA_ABRACADABRA#Hocus-pocus#
+291,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_MONOCELL#Monocell#
+292,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_CLASSCHANGE#Class Change#
+293,0,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_SUMMONMONSTER#Summon Monster#
+294,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_REVERSEORCISH#Orcish Face#
+295,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_DEATH#Death#
+296,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_FORTUNE#Fortune#
+297,9,6,1,0,1,0,1,1,yes,0,2,0,magic,0 //SA_TAMINGMONSTER#Tame Monster#
+298,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_QUESTION#Question#
+299,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_GRAVITY#Gravity#
+300,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_LEVELUP#Level Up#
+301,9,6,4,0,0,0,1,1,yes,0,2,0,magic,0 //SA_INSTANTDEATH#Instant Death#
+302,9,6,4,0,1,0,1,1,yes,0,2,0,magic,0 //SA_FULLRECOVERY#Full Recovery#
+303,9,6,4,0,0,0,1,1,yes,0,2,0,magic,0 //SA_COMA#Coma#
+304,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //BD_ADAPTATION#Amp#
+305,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //BD_ENCORE#Encore#
+306,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_LULLABY#Lullaby#
+307,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_RICHMANKIM#Mental Sensing#
+308,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_ETERNALCHAOS#Down Tempo#
+309,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+310,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+311,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_ROKISWEIL#Classical Pluck#
+312,0,6,4,0,1,0,1,1,no,0,64,0,misc,0 //BD_INTOABYSS#Power Chord#
+313,0,6,4,0,1,0,5,1,no,0,64,0,misc,0 //BD_SIEGFRIED#Acoustic Rhythm#
+//314,0,0,0,0,0,0,1,1,no,0,64,0,misc,0 //BD_RAGNAROK#Ragnarok#
+315,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BA_MUSICALLESSON#Music Lesson#
+316,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //BA_MUSICALSTRIKE#Melody Strike#
+317,0,8,4,0,1,0,5,1,no,0,32,0,misc,0 //BA_DISSONANCE#Unchained Serenade#
+318,0,6,4,0,3,-1,5,1,no,0,0,0,misc,0 //BA_FROSTJOKE#Unbarring Octave#
+319,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_WHISTLE#Perfect Tablature#
+320,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_ASSASSINCROSS#Impressive Riff#
+321,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_POEMBRAGI#Magic Strings#
+322,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //BA_APPLEIDUN#Song of Lutie#
+323,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //DC_DANCINGLESSON#Dance Lessons#
+324,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //DC_THROWARROW#Slinging Arrow#
+325,0,8,4,0,1,0,5,1,no,0,32,0,misc,0 //DC_UGLYDANCE#Hip Shaker#
+326,0,6,4,0,3,-1,5,1,no,0,0,0,misc,0 //DC_SCREAM#Dazzler#
+327,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_HUMMING#Focus Ballet#
+328,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_DONTFORGETME#Slow Grace#
+329,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_FORTUNEKISS#Lady Luck#
+330,0,6,4,0,1,0,10,1,no,0,32,0,misc,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
+331,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_RANDOMMOVE
+332,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_SPEEDUP
+333,0,6,4,0,1,0,1,0,no,0,2,0,none,0 //NPC_REVENGE
+334,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_MALE#I Will Protect You#
+335,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_FEMALE#I Look up to You#
+336,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLPARTNER#I miss You#
+337,9,6,1,-1,0,0,1,1,no,0,2,0,weapon,0 //ITM_TOMAHAWK#Throw Tomahawk#
+338,-1,8,1,7,0,0,0,-2,no,0,2,0,weapon,0 //NPC_DARKCROSS#Cross of Darkness#
+339,0,6,4,7,0,0,10,1,no,33,258,0,magic,0 //NPC_GRANDDARKNESS#Grand cross of Darkness#
+340,9,8,1,7,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,2,0,magic,0 //NPC_DARKSTRIKE#Soul Strike of Darkness#
+341,9,8,1,7,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,2,0,magic,2:3:3:4:4:5:5:6:6:7 //NPC_DARKTHUNDER#Darkness Jupiter#
+342,9,6,1,0,1,0,1,0,no,0,2,0,none,0 //NPC_STOP
+343,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKWEAPON#Break weapon#
+344,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKARMOR#Break armor#
+345,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKHELM#Break helm#
+346,9,6,1,-1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BREAKSHIELD#Break shield#
+347,-1,6,1,9,0,0,10,1,no,0,2,0,weapon,0 //NPC_UNDEADATTACK
+348,9,0,1,9,1,0,10,1,no,0,2,0,magic,0 //NPC_CHANGEUNDEAD
+349,0,6,4,0,1,0,10,0,no,0,2,0,weapon,0 //NPC_POWERUP
+350,0,6,4,0,1,0,10,0,no,0,2,0,none,0 //NPC_AGIUP
+351,0,0,0,0,1,0,0,0,no,0,2,0,none,0 //NPC_SIEGEMODE
+352,2,0,4,0,1,0,1,0,no,0,2,0,none,0 //NPC_CALLSLAVE
+353,0,0,0,0,1,0,0,0,no,0,2,0,none,0 //NPC_INVISIBLE
+354,2,6,4,0,1,0,20,0,no,0,2,0,misc,0 //NPC_RUN
+355,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //LK_AURABLADE#Aura Blade#
+356,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //LK_PARRYING#Parrying#
+357,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //LK_CONCENTRATION#Concentration#
+358,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_TENSIONRELAX#Relax#
+359,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_BERSERK#Frenzy#
+//360,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //LK_FURY#Fury#
+361,9,6,16,0,3,1,5,1,yes,0,0,0,magic,0 //HP_ASSUMPTIO#Assumptio#
+362,4,6,4,0,1,0,5,1,yes,0,0,0,magic,2 //HP_BASILICA#Basilica#
+363,0,0,0,0,0,0,10,0,no,0,0,0,magic,0 //HP_MEDITATIO#Meditatio#
+364,0,0,0,0,0,0,10,1,no,0,0,0,magic,0 //HW_SOULDRAIN#Soul Drain#
+365,9,8,1,-1,0,0,1,1,yes,0,0,0,weapon,0 //HW_MAGICCRASHER#Stave Crasher#
+366,0,6,4,0,1,0,10,1,no,0,0,0,magic,0 //HW_MAGICPOWER#Mystical Amplification#
+367,9,8,1,0,0,0,5,1,no,0,0,0,misc,0 //PA_PRESSURE#Gloria Domini#
+368,0,6,4,0,1,0,5,1,yes,0,0,0,weapon,0 //PA_SACRIFICE# Martyr's Reckoning#
+369,0,6,4,0,1,0,10,1,yes,0,0,0,misc,0 //PA_GOSPEL#Battle Chant#
+370,-2,6,1,-1,0,0,5,1,yes,0,0,0,weapon,3 //CH_PALMSTRIKE#Raging Palm Strike#
+371,-2,8,4,-1,0,0,5,1,no,0,512,0,weapon,0 //CH_TIGERFIST#Glacier Fist#
+372,-2,8,4,-1,0,0,10,-1:-1:-2:-2:-3:-3:-4:-4:-5:-5,no,0,512,0,weapon,0 //CH_CHAINCRUSH#Chain Crush Combo#
+373,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#Health Conversion#
+374,9,6,16,0,1,0,1,1,yes,0,7168,0,none,0 //PF_SOULCHANGE#Soul Exhale#
+375,9,6,1,0,0,0,5,1,yes,0,0,0,magic,0 //PF_SOULBURN#Soul Siphon#
+376,0,0,0,0,1,0,5,1,no,0,0,0,weapon,0 //ASC_KATAR#Advanced Katar Mastery#
+//377,0,0,4,0,1,0,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#Hallucination Walk#
+378,0,6,4,5,1,0,5,1,no,0,1024,0,weapon,0 //ASC_EDP#Deadly Poison Enchantment#
+379,9,6,1,-1,0,0,10,1,yes,0,0,0,weapon,0 //ASC_BREAKER#Soul Destroyer#
+380,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //SN_SIGHT#Falcon Eyes#
+381,5,8,1,0,0,0,5,1,yes,0,0,0,misc,0 //SN_FALCONASSAULT#Falcon Assault#
+382,4,8,1,-1,0,2,5,1,yes,0,0,0,weapon,0 //SN_SHARPSHOOTING#Focused Arrow Strike#
+383,0,6,4,0,3,-1,10,1,yes,0,0,0,weapon,0 //SN_WINDWALK#Wind Walker#
+384,0,0,4,0,1,0,10,1,yes,0,0,0,weapon,0 //WS_MELTDOWN#Shattering Strike#
+//385,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //WS_CREATECOIN#Create Coins#
+//386,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //WS_CREATENUGGET#Create Nuggets#
+387,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //WS_CARTBOOST#Cart Boost#
+//388,9,6,2,0,1,0,5,1,no,0,0,0,none,0 //WS_SYSTEMCREATE#Auto Attack System#
+389,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //ST_CHASEWALK#Stealth#
+390,0,0,4,0,0,0,5,1,yes,0,0,0,weapon,0 //ST_REJECTSWORD#Counter Instinct#
+//391,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0 //ST_STEALBACKPACK#Steal Backpack#
+392,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //CR_ALCHEMY#Alchemy#
+393,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //CR_SYNTHESISPOTION#Potion Synthesis#
+394,9,8,1,-1,0,0,10,-9,yes,0,0,0,weapon,0 //CG_ARROWVULCAN#Vulcan Arrow#
+395,0,0,4,0,1,3,1,1,yes,0,64,0,misc,2 //CG_MOONLIT#Sheltering Bliss#
+396,-1,6,16,0,1,0,1,1,yes,0,1536,0,none,0 //CG_MARIONETTE#Marionette Control#
+397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#Spiral Pierce#
+398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#Traumatic Blow#
+399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#Vital Strike#
+400,9,8,1,8,4,1,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#Napalm Vulcan#
+401,0,6,4,0,1,0,1,1,yes,0,0,0,none,0 //CH_SOULCOLLECT#Zen#
+402,9,6,1,0,1,0,5,1,no,0,0,0,none,0 //PF_MINDBREAKER#Mind Breaker#
+403,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0 //PF_MEMORIZE#Foresight#
+404,9,6,2,2,1,0,5,1,yes,0,256,2,magic,0 //PF_FOGWALL#Blinding Mist#
+405,7,6,1,0,1,0,1,1,no,0,0,3,magic,0 //PF_SPIDERWEB#Fiber Lock#
+406,0,6,4,-1,2,2,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#Meteor Assault#
+407,0,6,4,0,1,0,1,0,no,0,0,0,none,0 //ASC_CDP#Create Deadly Poison#
+408,9,6,4,0,1,0,1,1,yes,0,4,0,none,0 //WE_BABY#Baby#
+409,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLPARENT#Call Parent#
+410,9,6,4,0,1,3,1,1,yes,0,4,1,none,0 //WE_CALLBABY#Call Baby#
+411,0,6,4,0,1,0,10,1,yes,0,0,0,misc,4 //TK_RUN#Running#
+412,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYSTORM#Prepare Whirlwind#
+413,-2,8,4,-1,2,2,7,-3,no,0,512,0,weapon,0 //TK_STORMKICK#Whirlwind Kick#
+414,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYDOWN#Prepare Axe Kick#
+415,-2,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_DOWNKICK#Axe Kick#
+416,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYTURN#Prepare Round Kick#
+417,-2,8,4,-1,2,1,7,-3,no,0,512,0,weapon,2 //TK_TURNKICK#Round Kick#
+418,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_READYCOUNTER#Prepare Counter Kick#
+419,-2,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_COUNTER#Counter Kick#
+420,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //TK_DODGE#Break Fall#
+421,9,8,4,-1,0,0,7,-3,no,0,512,0,weapon,0 //TK_JUMPKICK#Flying Side Kick#
+422,0,0,0,0,0,1,10,0,no,0,0,0,none,0 //TK_HPTIME#Peaceful Rest#
+423,0,0,0,0,0,1,10,0,no,0,0,0,none,0 //TK_SPTIME#Enjoyable Rest#
+424,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //TK_POWER#Fighting Chant#
+425,0,6,4,2:4:1:3:8:7:6,1,0,7,1,no,0,0,0,weapon,0 //TK_SEVENWIND#Mild Wind#
+426,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //TK_HIGHJUMP#Taekwon Jump#
+427,0,6,4,0,1,0,3,1,yes,0,0,0,magic,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
+428,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_SUN_WARM#Warmth of the Sun#
+429,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_MOON_WARM#Warmth of the Moon#
+430,1,6,4,-1,2,1,3,1,yes,0,0,0,weapon,2 //SG_STAR_WARM#Warmth of the Star#
+431,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_SUN_COMFORT#Comfort of the Sun#
+432,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_MOON_COMFORT#Comfort of the Moon#
+433,0,0,4,0,1,0,4,1,yes,0,0,0,magic,0 //SG_STAR_COMFORT#Comfort of the Star#
+434,10,6,1,0,1,0,3,1,yes,0,0,0,magic,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
+435,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_SUN_ANGER#Sun's Wrath#
+436,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_MOON_ANGER#Moon's Wrath#
+437,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_STAR_ANGER#Stars's Wrath#
+438,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_SUN_BLESS#Blessing of the Sun#
+439,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_MOON_BLESS#Blessing of the Moon#
+440,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //SG_STAR_BLESS#Blessing of the Star#
+441,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
+442,0,0,0,0,0,0,3,0,no,0,0,0,none,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
+443,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
+444,0,6,4,0,1,0,1,1,no,0,0,0,misc,0 //SG_FUSION#Union of the Sun, Moon and Stars#
+445,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ALCHEMIST#Spirit of the Alchemist#
+446,9,6,16,0,1,0,1,1,yes,0,3080,0,none,0 //AM_BERSERKPITCHER#Berserk Pitcher#
+447,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_MONK#Spirit of the Monk#
+448,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_STAR#Spirit of the Star Knight#
+449,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SAGE#Spirit of the Professor#
+450,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_CRUSADER#Spirit of the Crusader#
+451,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SUPERNOVICE#Spirit of the Supernovice#
+452,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_KNIGHT#Spirit of the Knight#
+453,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_WIZARD#Spirit of the Wizard#
+454,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_PRIEST#Spirit of the Priest#
+455,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_BARDDANCER#Spirit of the Artist#
+456,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ROGUE#Spirit of the Rogue#
+457,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_ASSASIN#Spirit of the Assasin#
+458,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_BLACKSMITH#Spirit of the Blacksmith#
+459,0,6,4,0,3,-1,1,1,no,0,8,0,weapon,0 //BS_ADRENALINE2#Full Adrenaline Rush#
+460,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_HUNTER#Spirit of the Hunter#
+461,9,6,16,0,1,0,5,1,yes,0,512,0,magic,0 //SL_SOULLINKER#Spirit of the Soul Linker#
+462,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAIZEL#Kaizel#
+463,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAAHI#Kahai#
+464,9,6,16,0,1,0,3,1,yes,0,0,0,magic,0 //SL_KAUPE#Kauf#
+465,9,6,16,0,1,0,7,1,yes,0,0,0,magic,0 //SL_KAITE#Kaite#
+466,0,0,0,0,0,0,7,0,yes,0,0,0,magic,0 //SL_KAINA#Kaina#
+467,9,6,1,-2,0,0,7,1,no,0,0,0,magic,2 //SL_STIN#Estin#
+468,9,6,1,-2,0,0,7,1,no,0,0,0,magic,0 //SL_STUN#Estern#
+469,9,8,1,-2,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //SL_SMA#Esma#
+470,9,6,1,0,1,0,7,1,no,0,0,0,magic,0 //SL_SWOO#Esu#
+471,9,6,1,0,1,0,3,1,no,0,0,0,magic,0 //SL_SKE#Esk#
+472,9,6,1,0,1,0,3,1,no,0,0,0,magic,0 //SL_SKA#Eska#
+473,0,0,0,0,0,0,0,0,no,0,0,0,none,0 //SM_SELFPROVOKE##
+474,0,0,4,0,1,0,10,1,no,0,2,0,none,0 //NPC_EMOTION_ON##
+475,0,0,4,0,1,0,1,1,yes,0,0,0,none,0 //ST_PRESERVE#Preserve#
+476,1,6,1,0,1,0,5,1,yes,0,0,0,weapon,0 //ST_FULLSTRIP#Divest All#
+477,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //WS_WEAPONREFINE#Upgrade Weapon#
+478,3,6,2,0,3,3,10,1,no,0,0,0,none,0 //CR_SLIMPITCHER#Aid Condensed Potion#
+479,1,6,16,0,1,0,5,1,yes,0,0,0,weapon,0 //CR_FULLPROTECTION#Full Protection#
+480,4,8,1,0,0,0,5,5,no,0,0,0,weapon,0 //PA_SHIELDCHAIN#Shield Chain#
+481,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //HP_MANARECHARGE#Mana Recharge#
+482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_DOUBLECASTING#Double Casting#
+483,9,6,2,0,1,1,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein#
+484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field#
+485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //WS_CARTTERMINATION#Cart Termination#
+486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
+487,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+488,0,6,4,0,1,1,5,1,no,0,64,0,misc,0 //CG_HERMODE#Wand of Hermod#
+489,9,6,1,0,1,0,5,1,no,0,0,0,misc,0 //CG_TAROTCARD#Tarot Card of Fate#
+490,9,8,1,0,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,misc,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
+491,1,6,2,0,1,0,2,1,no,0,0,0,none,0 //CR_CULTIVATION#Cultivation#
+
+493,0,6,4,0,1,0,1,1,no,0,0,0,none,0 //TK_MISSION#Taekwon Mission#
+494,9,6,16,0,1,0,5,1,yes,0,0,0,magic,0 //SL_HIGH#Spirit of Rebirth#
+495,0,6,4,0,1,0,1,1,no,0,8,0,weapon,0 //KN_ONEHAND#Onehand Quicken#
+496,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT1#Twilight Alchemy 1#
+497,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT2#Twilight Alchemy 2#
+498,0,6,4,0,1,0,1,0,no,0,8,0,none,0 //AM_TWILIGHT3#Twilight Alchemy 3#
+499,-9,8,4,-1,0,0,1,2,no,0,520,0,weapon,0 //HT_POWER#Beast Strafing#
+//Temp Plugs(using bash as base)
+500,0,6,4,0,0,0,5,1,no,0,0,0,misc,0 //GS_GLITTERING#Flip the Coin#
+501,9,6,1,-1,0,0,1,1,no,0,0,0,misc,0 //GS_FLING#Fling#
+502,-9,8,1,-1,0,0,1,3,no,0,0,0,weapon,0 //GS_TRIPLEACTION#Triple Action#
+503,-9,6,1,-1,0,0,1,1,no,0,0,0,weapon,0 //GS_BULLSEYE#Bulls Eye#
+504,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_MADNESSCANCEL#Madness Canceler#
+505,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_ADJUSTMENT#AdJustment#
+506,0,6,4,0,1,0,1,1,no,0,0,0,weapon,0 //GS_INCREASING#Increasing Accuracy#
+507,-9,6,1,8,0,0,1,1,no,0,0,0,weapon,0 //GS_MAGICALBULLET#Magical Bullet#
+508,-9,6,1,-1,1,0,1,1,no,0,0,0,weapon,0 //GS_CRACKER#Cracker#
+509,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //GS_SINGLEACTION#Single Action#
+510,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //GS_SNAKEEYE#Snake Eye#
+511,-9,8,0,-1,0,0,10,2,no,0,0,0,weapon,0 //GS_CHAINACTION#Chain Action#
+512,-9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //GS_TRACKING#Tracking#
+513,-9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //GS_DISARM#Disarm#
+514,-9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //GS_PIERCINGSHOT#Piercing Shot#
+515,-9,8,1,-1,0,0,10,5,no,0,0,0,weapon,0 //GS_RAPIDSHOWER#Rapid Shower#
+516,0,8,4,-1,2,3,10,1,no,0,0,0,weapon,0 //GS_DESPERADO#Desperado#
+517,0,6,4,-1,1,0,10,1,no,0,0,0,weapon,0 //GS_GATLINGFEVER#Gatling Fever#
+518,2,6,1,-1,0,0,10,1,no,0,0,0,weapon,5 //GS_DUST#Dust#
+519,-9,6,1,-1,0,0,10,1,yes,0,0,0,weapon,0 //GS_FULLBUSTER#Full Buster#
+520,-9,6,1,-1,2,1:1:1:2:2:2:3:3:3:4,10,1,no,0,0,0,weapon,0 //GS_SPREADATTACK#Spread Attack#
+521,-9,6,2,-1,0,1,10,1,no,0,0,0,weapon,3 //GS_GROUNDDRIFT#Ground Drift#
+522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU#
+523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //NJ_SYURIKEN#NJ_SYURIKEN#
+524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0 //NJ_KUNAI#NJ_KUNAI#
+525,9,8,1,-1,4,1,5,-3:-3:-4:-4:-5,yes,0,0,0,weapon,0 //NJ_HUUMA#NJ_HUUMA#
+526,9,6,1,0,0,0,10,1,no,0,0,0,misc,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
+527,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,3 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
+528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
+529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
+530,7:9:11:13:15,6,1,-1,0,0,5,1,no,0,0,0,weapon,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
+531,0,6,4,0,1,0,5,1,no,0,0,0,none,7 //NJ_UTSUSEMI#NJ_UTSUSEMI#
+532,0,6,4,0,1,0,10,1,yes,0,0,0,magic,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
+533,0,0,0,0,0,0,10,0,no,0,0,0,none,0 //NJ_NINPOU#NJ_NINPOU#
+534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //NJ_KOUENKA#NJ_KOUENKA#
+535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0 //NJ_KAENSIN#NJ_KAENSIN#
+536,9,8,1,3,2,2,5,3,yes,0,0,0,magic,0 //NJ_BAKUENRYU#NJ_BAKUENRYU#
+537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU#
+538,9,6,2,0,1,0,10,1,yes,0,0,0,magic,0 //NJ_SUITON#NJ_SUITON#
+539,0,6,4,1,2,3,5,1,yes,0,0,0,magic,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
+540,9,8,1,4,0,0,10,1:2:2:3:3:4:4:5:5:6,yes,0,0,0,magic,0 //NJ_HUUJIN#NJ_HUUJIN#
+541,9,6,4,4,2,2:2:3:3:4,5,1,yes,0,0,0,magic,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI#
+542,5:6:7:8:9,8,1,4,0,1,5,1,yes,0,0,0,magic,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
+543,0,6,4,0,1,0,5,1,yes,0,0,0,none,0 //NJ_NEN#NJ_NEN#
+544,-5,6,1,0,0,0,10,1,no,0,0,0,weapon,0 //NJ_ISSEN#NJ_ISSEN#
+
+1001,9,6,1,-1,0,0,1,1,no,0,1,0,weapon,0 //KN_CHARGEATK#Charge Attack#
+1002,0,6,4,0,1,0,1,0,no,0,1,0,weapon,2 //CR_SHRINK#Shrink#
+1003,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //AS_SONICACCEL#Sonic Acceleration#
+1004,9,8,1,0,0,0,1,1,no,0,1,0,weapon,0 //AS_VENOMKNIFE#Throw Venom Knive#
+1005,1,6,1,0,1,0,1,1,no,0,1,0,weapon,0 //RG_CLOSECONFINE#Close Confine#
+1006,0,6,4,3,0,2,1,1,yes,0,1,0,magic,3 //WZ_SIGHTBLASTER#Sight Blaster#
+1007,0,6,4,0,1,0,10,0,no,0,1,0,none,0 //SA_CREATECON#Create Converter#
+1008,9,6,1,1,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTWATER#Elemental Change Water#
+1009,-9,6,1,0,0,0,1,1,no,0,1,0,weapon,3 //HT_PHANTASMIC#Phantasmic Arrow#
+1010,9,6,1,0,1,0,1,0,no,0,1,0,misc,0 //BA_PANGVOICE#Pang Voice#
+1011,9,6,1,0,1,0,1,0,no,0,1,0,misc,0 //DC_WINKCHARM#Wink of Charm#
+1012,0,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //BS_UNFAIRLYTRICK#Unfair Trick#
+1013,0,6,4,0,3,2,1,0,no,0,1,0,weapon,0 //BS_GREED#Greed#
+1014,0,6,4,6,3,14,1,0,yes,0,1,0,magic,0 //PR_REDEMPTIO#Redemptio#
+1015,9,6,16,0,1,0,1,1,no,0,1025,0,weapon,0 //MO_KITRANSLATION#Ki Translation#
+1016,-1,6,1,-1,2,1,1,1,no,0,1,0,weapon,5 //MO_BALKYOUNG#Ki Explosion#
+1017,9,6,1,2,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTGROUND#Elemental Change Earth#
+1018,9,6,1,3,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTFIRE#Elemental Change Fire#
+1019,9,6,1,4,1,0,1,1,yes,0,1,0,magic,0 //SA_ELEMENTWIND#Elemental Change Wind#
+
+//homunculus
+8001,9,6,4,0,1,0,5,1,no,0,0,0,magic,0 //HLIF_HEAL#Healing hand#
+8002,0,6,4,0,3,-1,5,1,no,0,0,0,none,0 //HLIF_AVOID
+8003,0,0,0,0,0,1,5,0,no,0,0,0,none,0 //HLIF_BRAIN
+8004,0,6,4,0,1,0,3,0,no,0,0,0,none,0 //HLIF_CHANGE
+8005,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HAMI_CASTLE
+8006,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HAMI_DEFENCE
+8007,0,0,0,0,1,0,5,0,no,0,0,0,none,0 //HAMI_SKIN
+8008,0,6,4,0,1,0,3,0,no,0,0,0,none,0 //HAMI_BLOODLUST
+8009,1,8,1,0,0,0,5,-1:-2:-2:-2:-3,no,0,0,0,weapon,0 //HFLI_MOON
+8010,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HFLI_FLEET
+8011,0,6,4,0,1,0,5,0,yes,0,0,0,misc,0 //HFLI_SPEED
+8012,1,6,1,0,0,0,3,0,no,0,0,0,none,0 //HFLI_SBR44
+8013,9,6,1,0,0,0,5,1:2:3:4:5,no,0,0,0,magic,0 //HVAN_CAPRICE
+8014,0,6,4,0,1,0,5,0,no,0,0,0,none,0 //HVAN_CHAOTIC
+8015,0,0,0,0,1,0,5,0,no,0,0,0,none,0 //HVAN_INSTRUCT
+8016,0,6,4,-1,2,4,3,1,no,0,0,0,misc,0 //HVAN_EXPLOSION
+
+//id,range,hit,inf,pl,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
+10000,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_APPROVAL#Approval#
+10001,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_KAFRACONTRACT#Kafra Contract#
+10002,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GUARDRESEARCH#Guardian Research#
+10003,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GUARDUP#Guardian Training#
+10004,0,0,0,0,0,0,10,0,no,0,16,0,none,0 //GD_EXTENSION#Guild Extension#
+10005,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_GLORYGUILD#Guild's Glory#
+10006,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_LEADERSHIP#Great Leadership#
+10007,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_GLORYWOUNDS#Wounds of Glory#
+10008,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_SOULCOLD#Cold Soul#
+10009,0,0,0,0,0,2,1,0,no,0,16,0,none,0 //GD_HAWKEYES#Sharp Eyes#
+10010,0,0,4,0,3,15,1,0,yes,0,16,0,none,0 //GD_BATTLEORDER#Battle Orders#
+10011,0,0,4,0,3,15,3,0,yes,0,16,0,none,0 //GD_REGENERATION#Regeneration#
+10012,0,0,4,0,3,15,1,0,yes,0,16,0,none,0 //GD_RESTORE#Restore#
+10013,0,0,4,0,3,0,1,0,yes,0,16,0,none,0 //GD_EMERGENCYCALL#Rally Guild#
+10014,0,0,0,0,0,0,1,0,no,0,16,0,none,0 //GD_DEVELOPMENT#Extend Guild#
diff --git a/db/skill_nocast_db.txt b/db/skill_nocast_db.txt
index a126610f3..bae2a2931 100644
--- a/db/skill_nocast_db.txt
+++ b/db/skill_nocast_db.txt
@@ -1,58 +1,58 @@
-// Forbidden Skills Database
-//
-// Structure of Database:
-// SkillID,Flag
-//
-// Legend for 'Flag' field (bitmask):
-// 1 = Cannot be used in normal maps
-// 2 = Cannot be used in PvP maps (use this instead of 1 for PK-mode servers)
-// 4 = Cannot be used in GvG maps
-// 8 = Cannot be used when WoE is on
-// 16 = Cannot be cloned (clones will not copy this skill)
-// Restricted zones - they're configured by 'restricted <number>' mapflag
-// 32 = Cannot be used in zone 1 maps
-// 64 = Cannot be used in zone 2 maps
-// 128 = Cannot be used in zone 3 maps
-// 256 = Cannot be used in zone 4 maps
-// 512 = Cannot be used in zone 5 maps
-// 1024 = Cannot be used in zone 6 maps
-// 2048 = Cannot be used in zone 7 maps
-
-//
-// Example:
-// 8,6 = Endure cannot be used in PvP and GvG maps (2+4)
-
-//GVG
-26,4 //AL_TELEPORT
-27,4 //AL_WARP
-87,4 //WZ_ICEWALL
-150,4 //TF_BACKSLIDING
-361,4 //HP_ASSUMPTIO
-362,4 //HP_BASILICA
-395,4 //CG_MOONLIT
-491,4 //CR_CULTIVATION
-
-//mixed
-488,3 //CG_HERMODE
-
-//Clone Forbidden/pointless skills
-77,16 //PR_TURNUNDEAD
-79,16 //PR_MAGNUS
-
-//Zone 1 - Aldebaran Turbo Track
-219,32 //Snatch
-26,32 //Teleport
-27,32 //Warp portal
-51,32 //Hiding
-135,32 //Cloaking
-389,32 //Stealth
-35,32 //Cure
-87,32 //Ice Wall
-359,32 //Berserk (Frenzy)
-362,32 //Basilica
-395,32 //Sheltering Bliss
-357,32 //Spear Dynamo (Concentration)
-
-//Zone 2 - Jail
-421,64 //TK_JUMPKICK#Flying Side Kick#
-426,64 //TK_HIGHJUMP#Taekwon Jump#
+// Forbidden Skills Database
+//
+// Structure of Database:
+// SkillID,Flag
+//
+// Legend for 'Flag' field (bitmask):
+// 1 = Cannot be used in normal maps
+// 2 = Cannot be used in PvP maps (use this instead of 1 for PK-mode servers)
+// 4 = Cannot be used in GvG maps
+// 8 = Cannot be used when WoE is on
+// 16 = Cannot be cloned (clones will not copy this skill)
+// Restricted zones - they're configured by 'restricted <number>' mapflag
+// 32 = Cannot be used in zone 1 maps
+// 64 = Cannot be used in zone 2 maps
+// 128 = Cannot be used in zone 3 maps
+// 256 = Cannot be used in zone 4 maps
+// 512 = Cannot be used in zone 5 maps
+// 1024 = Cannot be used in zone 6 maps
+// 2048 = Cannot be used in zone 7 maps
+
+//
+// Example:
+// 8,6 = Endure cannot be used in PvP and GvG maps (2+4)
+
+//GVG
+26,4 //AL_TELEPORT
+27,4 //AL_WARP
+87,4 //WZ_ICEWALL
+150,4 //TF_BACKSLIDING
+361,4 //HP_ASSUMPTIO
+362,4 //HP_BASILICA
+395,4 //CG_MOONLIT
+491,4 //CR_CULTIVATION
+
+//mixed
+488,3 //CG_HERMODE
+
+//Clone Forbidden/pointless skills
+77,16 //PR_TURNUNDEAD
+79,16 //PR_MAGNUS
+
+//Zone 1 - Aldebaran Turbo Track
+219,32 //Snatch
+26,32 //Teleport
+27,32 //Warp portal
+51,32 //Hiding
+135,32 //Cloaking
+389,32 //Stealth
+35,32 //Cure
+87,32 //Ice Wall
+359,32 //Berserk (Frenzy)
+362,32 //Basilica
+395,32 //Sheltering Bliss
+357,32 //Spear Dynamo (Concentration)
+
+//Zone 2 - Jail
+421,64 //TK_JUMPKICK#Flying Side Kick#
+426,64 //TK_HIGHJUMP#Taekwon Jump#
diff --git a/db/skill_require_db.txt b/db/skill_require_db.txt
index 50bf3f256..3c55d2b97 100644
--- a/db/skill_require_db.txt
+++ b/db/skill_require_db.txt
@@ -1,472 +1,472 @@
-// Skill Requirements Database
-//
-// Structure of Database:
-// SkillID,HPCost,MaxHPTrigger,SPCost,HPRateCost,SPRateCost,ZenyCost,RequiredWeapons,RequiredAmmoTypes,RequiredAmmoAmount,RequiredState,SpiritSphereCost,RequiredItemID1,RequiredItemAmount1,RequiredItemID2,RequiredItemAmount2,RequiredItemID3,RequiredItemAmount3,RequiredItemID4,RequiredItemAmount4,RequiredItemID5,RequiredItemAmount5,RequiredItemID6,RequiredItemAmount6,RequiredItemID7,RequiredItemAmount7,RequiredItemID8,RequiredItemAmount8,RequiredItemID9,RequiredItemAmount9,RequiredItemID10,RequiredItemAmount10
-//
-// If HP/SPratecost is positive, it is a percent of your current life, otherwise it is a percent of your max life.
-//
-// Legend for 'RequiredState' field:
-// none = Nothing special
-// move_enable = Requires to be able to move
-// recover_weight_rate = Requires to be less than 50% weight
-// water = Requires to be standing on a water cell
-// cart = Requires a Pushcart
-// riding = Requires to ride a Peco
-// 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
-
-5,0,0,8:8:8:8:8:15:15:15:15:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#ƒoƒbƒVƒ…#
-6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
-7,20:20:19:19:18:18:17:17:16:16,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-8,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
-
-10,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#ƒTƒCƒg#
-11,0,0,9:9:9:12:12:12:15:15:15:18,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#ƒiƒp?ƒ€ƒr?ƒg#
-12,0,0,30:30:30:35:35:35:40:40:40:40,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH?ƒ‹#
-13,0,0,18:14:24:20:30:26:36:32:42:38,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-14,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#ƒR?ƒ‹ƒhƒ{ƒ‹ƒg#
-15,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo?#
-16,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#ƒXƒg?ƒ“ƒJ?ƒX#
-17,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBALL#ƒtƒ@ƒCƒA?ƒ{?ƒ‹#
-18,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREWALL#ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹#
-19,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA?ƒ{ƒ‹ƒg#
-20,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-21,0,0,29:34:39:44:49:54:59:64:69:74,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_?ƒXƒg?ƒ€#
-
-24,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#ƒ‹ƒAƒt#
-25,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_PNEUMA#ƒjƒ…?ƒ}#
-26,0,0,10:9,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_TELEPORT#ƒeƒŒƒ|?ƒg#
-27,0,0,35:32:29:26,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_WARP#ƒ?ƒvƒ|?ƒ^ƒ‹#
-28,0,0,13:16:19:22:25:28:31:34:37:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#ƒq?ƒ‹#
-29,15,0,18:21:24:27:30:33:36:39:42:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_INCAGI#‘¬“x?‰Á#
-30,0,0,15:17:19:21:23:25:27:29:31:33,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_DECAGI#‘¬“xŒ¸­#
-31,0,0,10,0,0,0,99,0,0,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-32,0,0,35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-33,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
-34,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
-35,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CURE#ƒLƒ…ƒA?#
-
-40,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#ƒAƒCƒeƒ€ŠÓ’è#
-41,0,0,30,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_VENDING#˜I“XŠJÝ#
-42,0,0,5,0,0,100:200:300:400:500:600:700:800:900:1000,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#ƒƒ}?ƒiƒCƒg#
-
-45,0,0,25:30:35:40:45:50:55:60:65:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#W’†—ÍŒüã#
-46,0,0,12,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-47,0,0,15,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_SHOWER#ƒAƒ?ƒVƒƒƒ?#
-
-50,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#ƒXƒeƒB?ƒ‹#
-51,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
-52,0,0,12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
-53,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_DETOXIFY#‰ð“Å#
-54,0,0,60,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-
-56,0,0,7,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_PIERCE#ƒsƒA?ƒX#
-57,0,0,12,0,0,0,4:5,0,0,riding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-58,0,0,9,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#ƒXƒsƒAƒXƒ^ƒu#
-59,0,0,10,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu?ƒƒ‰ƒ“#
-60,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,3,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#ƒc?ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-61,0,0,3,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#ƒI?ƒgƒJƒEƒ“ƒ^?#
-62,0,0,13:14:15:16:17:18:19:20:21:22,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-
-66,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-67,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
-68,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
-69,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_BENEDICTIO#¹?~•Ÿ#
-70,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-71,0,0,6:8:10:12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#ƒXƒ?ƒ|ƒCƒYƒ“#
-72,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ?#
-73,0,0,20:20:20:25:25:25:30:30:30:35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-74,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ?ƒg#
-75,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_GLORIA#ƒOƒƒŠƒA#
-76,0,0,20:20:20:20:20:18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr?ƒi#
-77,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_TURNUNDEAD#ƒ^?ƒ“ƒAƒ“ƒfƒbƒh#
-78,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi#
-79,0,0,40:42:44:46:48:50:52:54:56:58,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-80,0,0,75,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA?ƒsƒ‰?#
-81,0,0,35:37:39:41:43:45:47:49:51:53,0,0,0,99,0,0,sight,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ?#
-
-83,0,0,20:24:30:34:40:44:50:54:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_METEOR#ƒƒeƒIƒXƒg?ƒ€#
-84,0,0,20:23:26:29:32:35:38:41:44:47,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_JUPITEL#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_?#
-85,0,0,60:64:68:72:76:80:84:88:92:96,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_VERMILION#ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“#
-86,0,0,15:20:20:25:25,0,0,0,99,0,0,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_WATERBALL#ƒEƒH?ƒ^?ƒ{?ƒ‹#
-87,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH?ƒ‹#
-88,0,0,45:43:41:39:37:35:33:31:29:27,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
-89,0,0,78,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_STORMGUST#ƒXƒg?ƒ€ƒKƒXƒg#
-90,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#ƒA?ƒXƒXƒpƒCƒN#
-91,0,0,28:32:36:40:44,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-92,0,0,5:10:15:20:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
-93,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#ƒ‚ƒ“ƒXƒ^?î•ñ#
-
-108,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#•ŠíC—#
-
-110,0,0,10,0,0,0,6:7:8,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#ƒnƒ“ƒ}?ƒtƒH?ƒ‹#
-111,0,0,20:23:26:29:32,0,0,0,6:7:8,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-112,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“#
-113,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#ƒI?ƒo?ƒgƒ‰ƒXƒg#
-114,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ?#
-115,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-116,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-117,0,0,12,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-118,0,0,45,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv#
-119,0,0,12,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
-120,0,0,12,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ?#
-121,0,0,10,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-122,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-123,0,0,15,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
-124,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#ƒŠƒ€?ƒuƒgƒ‰ƒbƒv#
-125,0,0,1,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_TALKIEBOX#ƒg?ƒL?ƒ{ƒbƒNƒX#
-
-129,0,0,10:13:16:19:22,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr?ƒg#
-130,0,0,8,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_DETECTING#ƒfƒBƒeƒNƒeƒBƒ“ƒO#
-131,0,0,10,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SPRINGTRAP#ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
-
-135,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_CLOAKING#ƒNƒ?ƒLƒ“ƒO#
-136,0,0,16:18:20:22:24:26:28:30:32:34,0,0,0,16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ?#
-137,0,0,3,0,0,0,16,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_GRIMTOOTH#ƒOƒŠƒ€ƒgƒD?ƒX#
-138,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-139,0,0,20:25:30:35:40:45:50:55:60:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_POISONREACT#ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
-140,0,0,20,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
-141,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ?#
-142,0,0,3,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#?‹}Žè?#
-143,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
-
-146,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#ƒI?ƒgƒo?ƒT?ƒN#
-147,0,0,10,0,0,0,99,0,0,recover_weight_rate,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#–îì¬#
-148,0,0,15,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#ƒ`ƒƒ?ƒWƒAƒ?#
-149,0,0,9,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#»‚Ü‚«#
-150,0,0,7,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#ƒoƒbƒNƒXƒeƒbƒv#
-151,0,0,3,0,0,0,99,0,0,recover_weight_rate,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#ÎE‚¢#
-152,0,0,2,0,0,0,99,0,0,none,0,7049,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#ΓŠ‚°#
-153,0,0,12,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#ƒJ?ƒgƒŒƒ{ƒŠƒ…?ƒVƒ‡ƒ“#
-154,0,0,40,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#ƒ`ƒFƒ“ƒWƒJ?ƒg#
-155,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
-156,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#ƒz?ƒŠ?ƒ‰ƒCƒg#
-157,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#ƒGƒiƒW?ƒR?ƒg#
-
-211,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STEALCOIN#ƒXƒeƒB?ƒ‹ƒRƒCƒ“#
-212,0,0,16,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
-
-214,0,0,20,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-215,0,0,17:19:21:23:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
-216,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV?ƒ‹ƒh#
-217,0,0,17:19:21:23:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA?ƒ}?#
-218,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-219,0,0,13:16:19:22:25,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
-220,0,0,15,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
-221,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
-222,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLEANER#ƒNƒŠ?ƒi?#
-
-228,0,0,5,0,0,0,99,0,0,none,0,7134,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_PHARMACY#ƒtƒ@?ƒ}ƒV?#
-229,0,0,10,0,0,0,99,0,0,none,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“#
-230,0,0,15,0,0,0,99,0,0,none,0,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰?#
-231,0,0,1,0,0,0,99,0,0,none,0,501,1,502,1,503,1,504,1,505,1,522,1,526,1,608,1,607,1,657,1 //AM_POTIONPITCHER#ƒ|?ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ?#
-232,0,0,20,0,0,0,99,0,0,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-233,0,0,10,0,0,0,99,0,0,none,0,7138,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#ƒXƒtƒBƒA?ƒ}ƒCƒ“#
-234,0,0,30,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ?ƒW#
-235,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW#
-236,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA?ƒ}?ƒ`ƒƒ?ƒW#
-237,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ?ƒW#
-
-243,0,0,10,0,0,0,99,0,0,none,0,7142,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CALLHOMUNCULUS
-244,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_REST
-247,0,0,74:68:62:56:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN
-
-249,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#ƒI?ƒgƒK?ƒh#
-250,0,0,10,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW#
-251,0,0,12,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#ƒV?ƒ‹ƒhƒu?ƒƒ‰ƒ“#
-252,0,0,35:40:45:50:55:60:65:70:75:80,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒh#
-253,0,0,11:12:13:14:15:16:17:18:19:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#ƒz?ƒŠ?ƒNƒƒX#
-254,0,0,37:44:51:58:65:72:79:86:93:100,20,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
-255,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEVOTION#ƒfƒBƒ{?ƒVƒ‡ƒ“#
-256,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
-257,0,0,30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_?#
-258,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
-
-261,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#?Œ÷#
-262,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#?’D#
-
-264,0,0,14,0,0,0,99,0,0,move_enable,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BODYRELOCATION#?‰e#
-
-266,0,0,10:14:17:19:20,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#?™¤#
-267,0,0,10,0,0,0,99,0,0,none,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Žw?#
-268,0,0,1,0,50,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_STEELBODY#‹à„#
-269,0,0,10,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BLADESTOP#”’nŽæ‚è#
-270,0,0,15,0,0,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
-271,0,0,1,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,explosionspirits,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
-272,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#˜A‘Ŷ#
-273,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#–Ò—´Œ#
-
-275,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
-276,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
-277,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ?#
-
-279,0,0,35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#ƒI?ƒgƒXƒyƒ‹#
-280,0,0,40,0,0,0,99,0,0,none,0,990,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ?#
-281,0,0,40,0,0,0,99,0,0,none,0,991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-282,0,0,40,0,0,0,99,0,0,none,0,992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_?#
-283,0,0,40,0,0,0,99,0,0,none,0,993,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-
-285,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VOLCANO#ƒ{ƒ‹ƒP?ƒm#
-286,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DELUGE#ƒfƒŠƒ…?ƒW#
-287,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-288,0,0,66:62:58:54:50,0,0,0,99,0,0,none,0,717,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^?#
-289,0,0,1,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
-290,0,0,50,0,0,0,99,0,0,none,0,715,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ABRACADABRA#ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
-291,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MONOCELL#ƒ`ƒFƒ“ƒWƒ|ƒŠƒ“#
-292,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CLASSCHANGE#ƒNƒ‰ƒXƒ`ƒFƒ“ƒW#
-293,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SUMMONMONSTER#ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^?#
-294,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_REVERSEORCISH#ƒŠƒo?ƒXƒI?ƒLƒbƒVƒ…#
-295,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DEATH#ƒfƒX#
-296,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FORTUNE#ƒtƒH?ƒ`ƒ…ƒ“#
-297,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_TAMINGMONSTER#ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^?#
-298,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_QUESTION#H#
-299,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_GRAVITY#ƒOƒ‰ƒrƒeƒB#
-300,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LEVELUP#ƒŒƒxƒ‹ƒAƒbƒv#
-301,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_INSTANTDEATH#ƒCƒ“ƒXƒ^ƒ“ƒgƒfƒX#
-302,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FULLRECOVERY#ƒtƒ‹ƒŠƒJƒoƒŠ?#
-303,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_COMA#ƒR?ƒ}#
-
-304,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#ƒAƒhƒŠƒu#
-305,0,0,1,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ENCORE#ƒAƒ“ƒR?ƒ‹#
-306,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_LULLABY#ŽqŽç‰Ì#
-307,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
-308,0,0,30,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
-309,0,0,38:41:44:47:50,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#?‘¾ŒÛ‚Ì‹¿‚«#
-310,0,0,38:41:44:47:50,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
-311,0,0,15,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
-312,0,0,10,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_INTOABYSS#[•£‚Ì’†‚É#
-313,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#•sŽ€g‚̃W?ƒNƒtƒŠ?ƒh#
-
-316,0,0,1:3:5:7:9,0,0,0,13,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#ƒ~ƒ…?ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-317,0,0,18:21:24:27:30,0,0,0,13,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_DISSONANCE#•s‹¦˜a‰¹#
-318,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡?ƒN#
-319,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_WHISTLE#Œû“J#
-320,0,0,38:41:44:47:50:53:56:59:62:65,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-321,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
-322,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
-
-324,0,0,1:3:5:7:9,0,0,0,14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_THROWARROW#–î?‚¿#
-325,0,0,23:26:29:32:35,0,0,0,14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-326,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SCREAM#ƒXƒNƒŠ?ƒ€#
-327,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
-328,0,0,28:31:34:37:40:43:46:49:52:55,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-329,0,0,43:46:49:52:55:58:61:64:67:70,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#K‰^‚̃LƒX#
-330,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#ƒT?ƒrƒXƒtƒH?ƒ†?#
-
-334,0,0,1,-10,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
-335,0,0,1,0,-10,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_FEMALE#‚ ‚È‚½‚É?‚­‚µ‚Ü‚·#
-336,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
-337,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ITM_TOMAHAWK##
-
-355,0,0,18:26:34:42:50,0,0,0,1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_AURABLADE#ƒI?ƒ‰ƒuƒŒ?ƒh#
-356,0,0,50,0,0,0,3,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
-357,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“#
-358,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
-359,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#ƒo?ƒT?ƒN#
-361,0,0,20:30:40:50:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
-362,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,715,1,716,1,717,1,523,1,0,0,0,0,0,0,0,0,0,0,0,0 //HP_BASILICA#ƒoƒWƒŠƒJ#
-
-365,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ?#
-366,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICPOWER#–‚–@—Í?•#
-367,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_PRESSURE#ƒvƒŒƒbƒVƒƒ?#
-368,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SACRIFICE#ƒTƒNƒŠƒtƒ@ƒCƒX#
-369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
-370,0,0,2:4:6:8:10,0,0,0,99,0,0,explosionspirits,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#–ÒŒÕd”hŽR#
-371,0,0,4:6:8:10:12,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_TIGERFIST#•šŒÕŒ#
-372,0,0,4:6:8:10:12:14:16:18:20:22,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#˜A’Œ•ö?#
-373,0,0,1:2:3:4:5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_HPCONVERSION#???????#
-374,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
-375,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULBURN#?ƒEƒ‹ƒo?ƒ“#
-
-378,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ?ƒ|ƒCƒYƒ“#
-379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#ƒ\ƒEƒ‹ƒuƒŒ?ƒJ?#
-380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SIGHT#ƒgƒDƒ‹?ƒTƒCƒg#
-381,0,0,30:34:38:42:46,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_FALCONASSAULT#ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg#
-382,0,0,18:21:24:27:30,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SHARPSHOOTING#ƒVƒƒ?ƒvƒVƒ…?ƒeƒBƒ“ƒO#
-383,0,0,46:52:58:64:70:76:82:88:94:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH?ƒN#
-384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
-385,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATECOIN#ƒNƒŠƒGƒCƒgƒRƒCƒ“#
-386,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATENUGGET#‰ò»‘¢#
-387,0,0,20,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTBOOST#ƒJ?ƒgƒu?ƒXƒg#
-388,0,0,20,0,0,0,99,0,0,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_SYSTEMCREATE#Ž©“®U??’u»ì#
-389,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_CHASEWALK#ƒ`ƒFƒCƒXƒEƒH?ƒN#
-390,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\?ƒh#
-
-394,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,13:14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_ARROWVULCAN#ƒAƒ?ƒoƒ‹ƒJƒ“#
-395,0,0,30:40:50:60:70,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
-396,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹#
-397,0,0,18:21:24:27:30,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA?ƒX#
-398,0,0,23,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
-399,0,0,12:12:14:14:16:16:18:18:20:20,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr?ƒg#
-400,0,0,10:25:40:55:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#ƒiƒp?ƒ€ƒoƒ‹ƒJƒ“#
-401,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_SOULCOLLECT#‹¶?Œ÷#
-402,0,0,12:15:18:21:24,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MINDBREAKER#ƒ}ƒCƒ“ƒhƒuƒŒ?ƒJ?#
-403,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MEMORIZE#ƒƒ‚ƒ‰ƒCƒY#
-404,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_FOGWALL#ƒtƒHƒOƒEƒH?ƒ‹#
-405,0,0,50,0,0,0,99,0,0,none,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#ƒXƒpƒCƒ_?ƒEƒFƒbƒu#
-406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
-407,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_CDP#ƒfƒbƒhƒŠ?ƒ|ƒCƒYƒ“ì¬#
-408,0,0,1,0,-10,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_BABY##
-409,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT##
-410,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY##
-411,0,0,100:90:80:70:60:50:40:30:20:10,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_RUN
-412,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYSTORM
-413,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK
-414,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYDOWN
-415,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK
-416,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYTURN
-417,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK
-418,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYCOUNTER
-419,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_COUNTERKICK
-420,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_DODGE
-421,0,0,70:60:50:40:30:20:10,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK
-
-425,0,0,20:20:20:20:50:50:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_SEVENWIND
-426,0,0,50,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP
-
-427,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_FEEL
-428,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_SUN_WARM
-429,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_MOON_WARM
-430,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_STAR_WARM
-431,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT
-432,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT
-433,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT
-434,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_HATE
-444,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_FUSION
-
-445,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ALCHEMIST
-446,0,0,10,0,8,0,99,0,0,none,0,657,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
-447,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_MONK
-448,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STAR
-449,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SAGE
-450,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_CRUSADER
-451,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SUPERNOVICE
-452,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KNIGHT
-453,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_WIZARD
-454,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_PRIEST
-455,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_BARDDANCER
-456,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ROGUE
-457,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ASSASSIN
-458,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_BLACKSMITH
-459,0,0,64,0,0,0,1:2:3:4:5:6:7:8:9:10:12:13:14:15:16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#
-460,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_HUNTER
-461,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SOULLINKER
-462,0,0,120:110:100:90:80:70:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAIZEL#Kaizel#
-463,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAAHI#Kahai#
-464,0,0,20:30:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAUPE#Kauf#
-465,0,0,70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAITE#Kaite#
-467,0,0,18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STIN#Estin#
-468,0,0,18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STUN#Estern#
-469,0,0,8:16:24:32:40:48:56:64:72:80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SMA
-470,0,0,75:65:55:45:35:25:15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SWOO#Esu#
-471,0,0,55:35:15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SKE#Esk#
-472,0,0,100:80:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SKA#Eska#
-
-475,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_PRESERVE##
-476,0,0,22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_FULLSTRIP##
-477,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_WEAPONREFINE##
-478,0,0,30,0,0,0,99,0,0,none,0,545,1,545,1,545,1,545,1,545,1,546,1,546,1,546,1,546,1,547,1 //CR_SLIMPITCHER##
-479,0,0,40,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_FULLPROTECTION##
-480,0,0,28:31:34:37:40,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN##
-
-482,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_DOUBLECASTING##
-483,0,0,40,0,0,0,99,0,0,none,0,715,1,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_GANBANTEIN##
-484,0,0,20:40:60:80:100,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_GRAVITATION##
-485,0,0,15,0,0,600:700:800:900:1000:1100:1200:1300:1400:1500,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,cartboost,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTTERMINATION##
-486,0,0,15,0,0,3000:3500:4000:4500:5000,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_OVERTHRUSTMAX##
-487,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_LONGINGFREEDOM##
-488,0,0,20:30:40:50:60,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_HERMODE##
-489,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_TAROTCARD##
-490,0,0,30,0,0,0,99,0,0,none,0,7135,1,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION##
-491,0,0,10,0,0,0,99,0,0,none,0,921,1,905,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION##
-
-493,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_MISSION##
-494,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_HIGH##
-495,0,0,100,0,0,0,2,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_ONEHAND##
-496,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_TWILIGHT1##
-497,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_TWILIGHT2##
-498,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0//AM_TWILIGHT3##
-499,0,0,8,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_POWER##
-500,0,0,2,0,0,1,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GLITTERING
-501,0,0,10,0,0,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_FLING
-502,0,0,20,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_TRIPLEACTION
-503,0,0,30,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_BULLSEYE
-504,0,0,30,0,0,0,99,0,0,none,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_MADNESSCANCEL
-505,0,0,15,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_ADJUSTMENT
-506,0,0,30,0,0,0,99,0,0,none,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_INCREASING
-507,0,0,7,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_MAGICALBULLET
-508,0,0,10,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_CRACKER
-512,0,0,15:20:25:30:35:40:45:50:55:60,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_TRACKING
-513,0,0,15:20:25:30:35,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DISARM
-514,0,0,11:12:13:14:15,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_PIERCINGSHOT
-515,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,17,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_RAPIDSHOWER
-516,0,0,32:34:36:38:40:42:44:46:48:50,0,0,0,17,3,10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DESPERADO
-517,0,0,30:32:34:36:38:40:42:44:46:48,0,0,0,20,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GATLINGFEVER
-518,0,0,3:6:9:12:15:18:21:24:27:30,0,0,0,19,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DUST
-519,0,0,20:25:30:35:40:45:50:55:60:65,0,0,0,19,3,2:2:4:4:6:6:8:8:10:10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_FULLBUSTER
-520,0,0,15:20:25:30:35:40:45:50:55:60,0,0,0,19,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_SPREADATTACK
-521,0,0,4:8:12:16:20:24:28:32:36:40,0,0,0,21,5,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GROUNDDRIFT
-523,0,0,2,0,0,0,99,6,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SYURIKEN
-524,0,0,30:25:20:15:10,0,0,0,99,7,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KUNAI
-525,0,0,20:25:30:35:40,0,0,0,22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HUUMA
-526,0,0,50,0,0,500:1000:1500:2000:2500:3000:3500:4000:4500:5000,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_ZENYNAGE
-527,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI
-528,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI
-529,0,0,10,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP
-530,0,0,14:16:18:20:22,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE
-531,0,0,12:15:18:21:24,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI
-532,0,0,30:32:34:36:38:40:42:44:46:48,0,0,0,99,0,0,none,0,7524,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_BUNSINJYUTSU
-533,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU
-534,0,0,18:20:22:24:26:28:30:32:34:36,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KOUENKA
-535,0,0,25,0,0,0,99,0,0,none,0,7521,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KAENSIN
-536,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,7521,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_BAKUENRYU
-537,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU
-538,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,7522,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SUITON
-539,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,7522,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HYOUSYOURAKU
-540,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HUUJIN
-541,0,0,16:20:24:28:32,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI
-542,0,0,24:28:32:36:40,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KAMAITACHI
-543,0,0,20:30:40:50:60,-5,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_NEN
-544,0,0,55:60:65:70:75:80:85:90:95:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_ISSEN
-
-1001,0,0,40,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#ƒ`ƒƒ?[ƒWƒAƒ^ƒbƒN#
-1002,0,0,15,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#ƒVƒ…ƒŠƒ“ƒN#
-1004,0,0,15,0,0,0,99,2,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#ƒxƒiƒ€ƒiƒCƒt#
-1005,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#ƒNƒ??[ƒYƒRƒ“ƒtƒ@ƒCƒ“#
-1006,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#ƒTƒCƒgƒuƒ‰ƒXƒ^?[#
-1007,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#ƒGƒ‹ƒŒƒ?ƒ“ƒ^ƒ‹ƒRƒ“ƒo?[ƒ^?»‘¢#
-1008,0,0,30,0,0,0,99,0,0,none,0,12115,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#ƒGƒ‹ƒŒƒ?ƒ“ƒ^ƒ‹ƒ`ƒFƒ“ƒW#
-1009,0,0,10,0,0,0,11,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#ƒtƒ@ƒ“ƒ^ƒXƒ~ƒbƒNƒAƒ??[#
-1010,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#ƒpƒ“ƒ{ƒCƒX#
-1011,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#–£˜f‚̃EƒBƒ“ƒN#
-1013,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_GREED#æ×~#
-1014,0,0,400,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#ƒŒƒfƒ€ƒvƒeƒBƒI#
-1015,0,0,40,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#’¿Šï’?“ü(?U‹C’?“ü)#
-1016,10,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#‘«? (”­™¤)#
-1017,0,0,30,0,0,0,99,0,0,none,0,12116,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND
-1018,0,0,30,0,0,0,99,0,0,none,0,12114,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE
-1019,0,0,30,0,0,0,99,0,0,none,0,12117,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND
-
-10010,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_BATTLEORDER##
-10011,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_REGENERATION##
-10012,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_RESTORE##
-10013,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_EMERGENCYCALL##
-
-8001,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,545,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
-8002,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_AVOID
-8004,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
-8005,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
-8006,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
-8008,0,0,120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
-8009,0,0,4:8:12:16:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
-8010,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_FLEET
-8011,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_SPEED
-8012,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
-8013,0,0,22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE
-8014,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
-8016,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
+// Skill Requirements Database
+//
+// Structure of Database:
+// SkillID,HPCost,MaxHPTrigger,SPCost,HPRateCost,SPRateCost,ZenyCost,RequiredWeapons,RequiredAmmoTypes,RequiredAmmoAmount,RequiredState,SpiritSphereCost,RequiredItemID1,RequiredItemAmount1,RequiredItemID2,RequiredItemAmount2,RequiredItemID3,RequiredItemAmount3,RequiredItemID4,RequiredItemAmount4,RequiredItemID5,RequiredItemAmount5,RequiredItemID6,RequiredItemAmount6,RequiredItemID7,RequiredItemAmount7,RequiredItemID8,RequiredItemAmount8,RequiredItemID9,RequiredItemAmount9,RequiredItemID10,RequiredItemAmount10
+//
+// If HP/SPratecost is positive, it is a percent of your current life, otherwise it is a percent of your max life.
+//
+// Legend for 'RequiredState' field:
+// none = Nothing special
+// move_enable = Requires to be able to move
+// recover_weight_rate = Requires to be less than 50% weight
+// water = Requires to be standing on a water cell
+// cart = Requires a Pushcart
+// riding = Requires to ride a Peco
+// 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
+
+5,0,0,8:8:8:8:8:15:15:15:15:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#ƒoƒbƒVƒ…#
+6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
+7,20:20:19:19:18:18:17:17:16:16,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+8,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
+
+10,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#ƒTƒCƒg#
+11,0,0,9:9:9:12:12:12:15:15:15:18,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#ƒiƒp?ƒ€ƒr?ƒg#
+12,0,0,30:30:30:35:35:35:40:40:40:40,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH?ƒ‹#
+13,0,0,18:14:24:20:30:26:36:32:42:38,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+14,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#ƒR?ƒ‹ƒhƒ{ƒ‹ƒg#
+15,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo?#
+16,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#ƒXƒg?ƒ“ƒJ?ƒX#
+17,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBALL#ƒtƒ@ƒCƒA?ƒ{?ƒ‹#
+18,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREWALL#ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹#
+19,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA?ƒ{ƒ‹ƒg#
+20,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+21,0,0,29:34:39:44:49:54:59:64:69:74,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_?ƒXƒg?ƒ€#
+
+24,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#ƒ‹ƒAƒt#
+25,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_PNEUMA#ƒjƒ…?ƒ}#
+26,0,0,10:9,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_TELEPORT#ƒeƒŒƒ|?ƒg#
+27,0,0,35:32:29:26,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_WARP#ƒ?ƒvƒ|?ƒ^ƒ‹#
+28,0,0,13:16:19:22:25:28:31:34:37:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#ƒq?ƒ‹#
+29,15,0,18:21:24:27:30:33:36:39:42:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_INCAGI#‘¬“x?‰Á#
+30,0,0,15:17:19:21:23:25:27:29:31:33,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_DECAGI#‘¬“xŒ¸­#
+31,0,0,10,0,0,0,99,0,0,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+32,0,0,35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+33,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
+34,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
+35,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CURE#ƒLƒ…ƒA?#
+
+40,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#ƒAƒCƒeƒ€ŠÓ’è#
+41,0,0,30,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_VENDING#˜I“XŠJÝ#
+42,0,0,5,0,0,100:200:300:400:500:600:700:800:900:1000,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#ƒƒ}?ƒiƒCƒg#
+
+45,0,0,25:30:35:40:45:50:55:60:65:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#W’†—ÍŒüã#
+46,0,0,12,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+47,0,0,15,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_SHOWER#ƒAƒ?ƒVƒƒƒ?#
+
+50,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#ƒXƒeƒB?ƒ‹#
+51,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
+52,0,0,12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
+53,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_DETOXIFY#‰ð“Å#
+54,0,0,60,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+
+56,0,0,7,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_PIERCE#ƒsƒA?ƒX#
+57,0,0,12,0,0,0,4:5,0,0,riding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+58,0,0,9,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#ƒXƒsƒAƒXƒ^ƒu#
+59,0,0,10,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu?ƒƒ‰ƒ“#
+60,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,3,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#ƒc?ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+61,0,0,3,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#ƒI?ƒgƒJƒEƒ“ƒ^?#
+62,0,0,13:14:15:16:17:18:19:20:21:22,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+
+66,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+67,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
+68,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
+69,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_BENEDICTIO#¹?~•Ÿ#
+70,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+71,0,0,6:8:10:12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#ƒXƒ?ƒ|ƒCƒYƒ“#
+72,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ?#
+73,0,0,20:20:20:25:25:25:30:30:30:35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+74,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ?ƒg#
+75,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_GLORIA#ƒOƒƒŠƒA#
+76,0,0,20:20:20:20:20:18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr?ƒi#
+77,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_TURNUNDEAD#ƒ^?ƒ“ƒAƒ“ƒfƒbƒh#
+78,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi#
+79,0,0,40:42:44:46:48:50:52:54:56:58,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+80,0,0,75,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA?ƒsƒ‰?#
+81,0,0,35:37:39:41:43:45:47:49:51:53,0,0,0,99,0,0,sight,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ?#
+
+83,0,0,20:24:30:34:40:44:50:54:60:64,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_METEOR#ƒƒeƒIƒXƒg?ƒ€#
+84,0,0,20:23:26:29:32:35:38:41:44:47,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_JUPITEL#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_?#
+85,0,0,60:64:68:72:76:80:84:88:92:96,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_VERMILION#ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“#
+86,0,0,15:20:20:25:25,0,0,0,99,0,0,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_WATERBALL#ƒEƒH?ƒ^?ƒ{?ƒ‹#
+87,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH?ƒ‹#
+88,0,0,45:43:41:39:37:35:33:31:29:27,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
+89,0,0,78,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_STORMGUST#ƒXƒg?ƒ€ƒKƒXƒg#
+90,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#ƒA?ƒXƒXƒpƒCƒN#
+91,0,0,28:32:36:40:44,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+92,0,0,5:10:15:20:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
+93,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#ƒ‚ƒ“ƒXƒ^?î•ñ#
+
+108,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#•ŠíC—#
+
+110,0,0,10,0,0,0,6:7:8,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#ƒnƒ“ƒ}?ƒtƒH?ƒ‹#
+111,0,0,20:23:26:29:32,0,0,0,6:7:8,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+112,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“#
+113,0,0,18:16:14:12:10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#ƒI?ƒo?ƒgƒ‰ƒXƒg#
+114,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ?#
+115,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+116,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+117,0,0,12,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+118,0,0,45,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv#
+119,0,0,12,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
+120,0,0,12,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ?#
+121,0,0,10,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+122,0,0,10,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+123,0,0,15,0,0,0,99,0,0,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
+124,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#ƒŠƒ€?ƒuƒgƒ‰ƒbƒv#
+125,0,0,1,0,0,0,99,0,0,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_TALKIEBOX#ƒg?ƒL?ƒ{ƒbƒNƒX#
+
+129,0,0,10:13:16:19:22,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr?ƒg#
+130,0,0,8,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_DETECTING#ƒfƒBƒeƒNƒeƒBƒ“ƒO#
+131,0,0,10,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SPRINGTRAP#ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
+
+135,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_CLOAKING#ƒNƒ?ƒLƒ“ƒO#
+136,0,0,16:18:20:22:24:26:28:30:32:34,0,0,0,16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ?#
+137,0,0,3,0,0,0,16,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_GRIMTOOTH#ƒOƒŠƒ€ƒgƒD?ƒX#
+138,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+139,0,0,20:25:30:35:40:45:50:55:60:45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_POISONREACT#ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
+140,0,0,20,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
+141,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ?#
+142,0,0,3,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#?‹}Žè?#
+143,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
+
+146,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#ƒI?ƒgƒo?ƒT?ƒN#
+147,0,0,10,0,0,0,99,0,0,recover_weight_rate,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#–îì¬#
+148,0,0,15,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#ƒ`ƒƒ?ƒWƒAƒ?#
+149,0,0,9,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#»‚Ü‚«#
+150,0,0,7,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#ƒoƒbƒNƒXƒeƒbƒv#
+151,0,0,3,0,0,0,99,0,0,recover_weight_rate,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#ÎE‚¢#
+152,0,0,2,0,0,0,99,0,0,none,0,7049,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#ΓŠ‚°#
+153,0,0,12,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#ƒJ?ƒgƒŒƒ{ƒŠƒ…?ƒVƒ‡ƒ“#
+154,0,0,40,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#ƒ`ƒFƒ“ƒWƒJ?ƒg#
+155,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
+156,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#ƒz?ƒŠ?ƒ‰ƒCƒg#
+157,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#ƒGƒiƒW?ƒR?ƒg#
+
+211,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STEALCOIN#ƒXƒeƒB?ƒ‹ƒRƒCƒ“#
+212,0,0,16,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
+
+214,0,0,20,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+215,0,0,17:19:21:23:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
+216,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV?ƒ‹ƒh#
+217,0,0,17:19:21:23:25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA?ƒ}?#
+218,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+219,0,0,13:16:19:22:25,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
+220,0,0,15,0,0,0,99,0,0,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
+221,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
+222,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLEANER#ƒNƒŠ?ƒi?#
+
+228,0,0,5,0,0,0,99,0,0,none,0,7134,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_PHARMACY#ƒtƒ@?ƒ}ƒV?#
+229,0,0,10,0,0,0,99,0,0,none,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“#
+230,0,0,15,0,0,0,99,0,0,none,0,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰?#
+231,0,0,1,0,0,0,99,0,0,none,0,501,1,502,1,503,1,504,1,505,1,522,1,526,1,608,1,607,1,657,1 //AM_POTIONPITCHER#ƒ|?ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ?#
+232,0,0,20,0,0,0,99,0,0,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+233,0,0,10,0,0,0,99,0,0,none,0,7138,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#ƒXƒtƒBƒA?ƒ}ƒCƒ“#
+234,0,0,30,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ?ƒW#
+235,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW#
+236,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA?ƒ}?ƒ`ƒƒ?ƒW#
+237,0,0,25,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ?ƒW#
+
+243,0,0,10,0,0,0,99,0,0,none,0,7142,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CALLHOMUNCULUS
+244,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_REST
+247,0,0,74:68:62:56:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN
+
+249,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#ƒI?ƒgƒK?ƒh#
+250,0,0,10,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW#
+251,0,0,12,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#ƒV?ƒ‹ƒhƒu?ƒƒ‰ƒ“#
+252,0,0,35:40:45:50:55:60:65:70:75:80,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒh#
+253,0,0,11:12:13:14:15:16:17:18:19:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#ƒz?ƒŠ?ƒNƒƒX#
+254,0,0,37:44:51:58:65:72:79:86:93:100,20,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
+255,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEVOTION#ƒfƒBƒ{?ƒVƒ‡ƒ“#
+256,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
+257,0,0,30,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_?#
+258,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
+
+261,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#?Œ÷#
+262,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#?’D#
+
+264,0,0,14,0,0,0,99,0,0,move_enable,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BODYRELOCATION#?‰e#
+
+266,0,0,10:14:17:19:20,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#?™¤#
+267,0,0,10,0,0,0,99,0,0,none,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Žw?#
+268,0,0,1,0,50,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_STEELBODY#‹à„#
+269,0,0,10,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BLADESTOP#”’nŽæ‚è#
+270,0,0,15,0,0,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
+271,0,0,1,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,explosionspirits,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
+272,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#˜A‘Ŷ#
+273,0,0,11:12:13:14:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#–Ò—´Œ#
+
+275,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
+276,0,0,2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
+277,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ?#
+
+279,0,0,35,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#ƒI?ƒgƒXƒyƒ‹#
+280,0,0,40,0,0,0,99,0,0,none,0,990,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ?#
+281,0,0,40,0,0,0,99,0,0,none,0,991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+282,0,0,40,0,0,0,99,0,0,none,0,992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_?#
+283,0,0,40,0,0,0,99,0,0,none,0,993,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+
+285,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VOLCANO#ƒ{ƒ‹ƒP?ƒm#
+286,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DELUGE#ƒfƒŠƒ…?ƒW#
+287,0,0,48:46:44:42:40,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+288,0,0,66:62:58:54:50,0,0,0,99,0,0,none,0,717,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^?#
+289,0,0,1,0,0,0,99,0,0,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
+290,0,0,50,0,0,0,99,0,0,none,0,715,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ABRACADABRA#ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
+291,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MONOCELL#ƒ`ƒFƒ“ƒWƒ|ƒŠƒ“#
+292,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CLASSCHANGE#ƒNƒ‰ƒXƒ`ƒFƒ“ƒW#
+293,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SUMMONMONSTER#ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^?#
+294,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_REVERSEORCISH#ƒŠƒo?ƒXƒI?ƒLƒbƒVƒ…#
+295,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DEATH#ƒfƒX#
+296,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FORTUNE#ƒtƒH?ƒ`ƒ…ƒ“#
+297,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_TAMINGMONSTER#ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^?#
+298,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_QUESTION#H#
+299,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_GRAVITY#ƒOƒ‰ƒrƒeƒB#
+300,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LEVELUP#ƒŒƒxƒ‹ƒAƒbƒv#
+301,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_INSTANTDEATH#ƒCƒ“ƒXƒ^ƒ“ƒgƒfƒX#
+302,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FULLRECOVERY#ƒtƒ‹ƒŠƒJƒoƒŠ?#
+303,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_COMA#ƒR?ƒ}#
+
+304,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#ƒAƒhƒŠƒu#
+305,0,0,1,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ENCORE#ƒAƒ“ƒR?ƒ‹#
+306,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_LULLABY#ŽqŽç‰Ì#
+307,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
+308,0,0,30,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
+309,0,0,38:41:44:47:50,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#?‘¾ŒÛ‚Ì‹¿‚«#
+310,0,0,38:41:44:47:50,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
+311,0,0,15,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
+312,0,0,10,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_INTOABYSS#[•£‚Ì’†‚É#
+313,0,0,20,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#•sŽ€g‚̃W?ƒNƒtƒŠ?ƒh#
+
+316,0,0,1:3:5:7:9,0,0,0,13,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#ƒ~ƒ…?ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+317,0,0,18:21:24:27:30,0,0,0,13,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_DISSONANCE#•s‹¦˜a‰¹#
+318,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡?ƒN#
+319,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_WHISTLE#Œû“J#
+320,0,0,38:41:44:47:50:53:56:59:62:65,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+321,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
+322,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
+
+324,0,0,1:3:5:7:9,0,0,0,14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_THROWARROW#–î?‚¿#
+325,0,0,23:26:29:32:35,0,0,0,14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+326,0,0,12:14:16:18:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SCREAM#ƒXƒNƒŠ?ƒ€#
+327,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
+328,0,0,28:31:34:37:40:43:46:49:52:55,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+329,0,0,43:46:49:52:55:58:61:64:67:70,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#K‰^‚̃LƒX#
+330,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#ƒT?ƒrƒXƒtƒH?ƒ†?#
+
+334,0,0,1,-10,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
+335,0,0,1,0,-10,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_FEMALE#‚ ‚È‚½‚É?‚­‚µ‚Ü‚·#
+336,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
+337,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ITM_TOMAHAWK##
+
+355,0,0,18:26:34:42:50,0,0,0,1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_AURABLADE#ƒI?ƒ‰ƒuƒŒ?ƒh#
+356,0,0,50,0,0,0,3,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
+357,0,0,14:18:22:26:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“#
+358,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
+359,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#ƒo?ƒT?ƒN#
+361,0,0,20:30:40:50:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
+362,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,715,1,716,1,717,1,523,1,0,0,0,0,0,0,0,0,0,0,0,0 //HP_BASILICA#ƒoƒWƒŠƒJ#
+
+365,0,0,8,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ?#
+366,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICPOWER#–‚–@—Í?•#
+367,0,0,30:35:40:45:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_PRESSURE#ƒvƒŒƒbƒVƒƒ?#
+368,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SACRIFICE#ƒTƒNƒŠƒtƒ@ƒCƒX#
+369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
+370,0,0,2:4:6:8:10,0,0,0,99,0,0,explosionspirits,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#–ÒŒÕd”hŽR#
+371,0,0,4:6:8:10:12,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_TIGERFIST#•šŒÕŒ#
+372,0,0,4:6:8:10:12:14:16:18:20:22,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#˜A’Œ•ö?#
+373,0,0,1:2:3:4:5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_HPCONVERSION#???????#
+374,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
+375,0,0,80:90:100:110:120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SOULBURN#?ƒEƒ‹ƒo?ƒ“#
+
+378,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ?ƒ|ƒCƒYƒ“#
+379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#ƒ\ƒEƒ‹ƒuƒŒ?ƒJ?#
+380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SIGHT#ƒgƒDƒ‹?ƒTƒCƒg#
+381,0,0,30:34:38:42:46,0,0,0,99,0,0,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_FALCONASSAULT#ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg#
+382,0,0,18:21:24:27:30,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SHARPSHOOTING#ƒVƒƒ?ƒvƒVƒ…?ƒeƒBƒ“ƒO#
+383,0,0,46:52:58:64:70:76:82:88:94:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH?ƒN#
+384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
+385,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATECOIN#ƒNƒŠƒGƒCƒgƒRƒCƒ“#
+386,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATENUGGET#‰ò»‘¢#
+387,0,0,20,0,0,0,99,0,0,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTBOOST#ƒJ?ƒgƒu?ƒXƒg#
+388,0,0,20,0,0,0,99,0,0,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_SYSTEMCREATE#Ž©“®U??’u»ì#
+389,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_CHASEWALK#ƒ`ƒFƒCƒXƒEƒH?ƒN#
+390,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\?ƒh#
+
+394,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,13:14,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_ARROWVULCAN#ƒAƒ?ƒoƒ‹ƒJƒ“#
+395,0,0,30:40:50:60:70,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
+396,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹#
+397,0,0,18:21:24:27:30,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA?ƒX#
+398,0,0,23,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
+399,0,0,12:12:14:14:16:16:18:18:20:20,0,0,0,4:5,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr?ƒg#
+400,0,0,10:25:40:55:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#ƒiƒp?ƒ€ƒoƒ‹ƒJƒ“#
+401,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_SOULCOLLECT#‹¶?Œ÷#
+402,0,0,12:15:18:21:24,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MINDBREAKER#ƒ}ƒCƒ“ƒhƒuƒŒ?ƒJ?#
+403,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MEMORIZE#ƒƒ‚ƒ‰ƒCƒY#
+404,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_FOGWALL#ƒtƒHƒOƒEƒH?ƒ‹#
+405,0,0,50,0,0,0,99,0,0,none,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#ƒXƒpƒCƒ_?ƒEƒFƒbƒu#
+406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
+407,0,0,50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_CDP#ƒfƒbƒhƒŠ?ƒ|ƒCƒYƒ“ì¬#
+408,0,0,1,0,-10,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_BABY##
+409,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT##
+410,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY##
+411,0,0,100:90:80:70:60:50:40:30:20:10,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_RUN
+412,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYSTORM
+413,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK
+414,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYDOWN
+415,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK
+416,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYTURN
+417,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK
+418,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_READYCOUNTER
+419,0,0,14:12:10:8:6:4:2,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_COUNTERKICK
+420,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_DODGE
+421,0,0,70:60:50:40:30:20:10,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK
+
+425,0,0,20:20:20:20:50:50:50,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_SEVENWIND
+426,0,0,50,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP
+
+427,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_FEEL
+428,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_SUN_WARM
+429,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_MOON_WARM
+430,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_STAR_WARM
+431,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT
+432,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT
+433,0,0,70:60:50:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT
+434,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_HATE
+444,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SG_FUSION
+
+445,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ALCHEMIST
+446,0,0,10,0,8,0,99,0,0,none,0,657,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
+447,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_MONK
+448,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STAR
+449,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SAGE
+450,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_CRUSADER
+451,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SUPERNOVICE
+452,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KNIGHT
+453,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_WIZARD
+454,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_PRIEST
+455,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_BARDDANCER
+456,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ROGUE
+457,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_ASSASSIN
+458,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_BLACKSMITH
+459,0,0,64,0,0,0,1:2:3:4:5:6:7:8:9:10:12:13:14:15:16,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#
+460,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_HUNTER
+461,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SOULLINKER
+462,0,0,120:110:100:90:80:70:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAIZEL#Kaizel#
+463,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAAHI#Kahai#
+464,0,0,20:30:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAUPE#Kauf#
+465,0,0,70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_KAITE#Kaite#
+467,0,0,18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STIN#Estin#
+468,0,0,18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_STUN#Estern#
+469,0,0,8:16:24:32:40:48:56:64:72:80,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SMA
+470,0,0,75:65:55:45:35:25:15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SWOO#Esu#
+471,0,0,55:35:15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SKE#Esk#
+472,0,0,100:80:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_SKA#Eska#
+
+475,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_PRESERVE##
+476,0,0,22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_FULLSTRIP##
+477,0,0,5,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_WEAPONREFINE##
+478,0,0,30,0,0,0,99,0,0,none,0,545,1,545,1,545,1,545,1,545,1,546,1,546,1,546,1,546,1,547,1 //CR_SLIMPITCHER##
+479,0,0,40,0,0,0,99,0,0,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_FULLPROTECTION##
+480,0,0,28:31:34:37:40,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN##
+
+482,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_DOUBLECASTING##
+483,0,0,40,0,0,0,99,0,0,none,0,715,1,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_GANBANTEIN##
+484,0,0,20:40:60:80:100,0,0,0,99,0,0,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_GRAVITATION##
+485,0,0,15,0,0,600:700:800:900:1000:1100:1200:1300:1400:1500,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,cartboost,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTTERMINATION##
+486,0,0,15,0,0,3000:3500:4000:4500:5000,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_OVERTHRUSTMAX##
+487,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_LONGINGFREEDOM##
+488,0,0,20:30:40:50:60,0,0,0,13:14,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_HERMODE##
+489,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_TAROTCARD##
+490,0,0,30,0,0,0,99,0,0,none,0,7135,1,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION##
+491,0,0,10,0,0,0,99,0,0,none,0,921,1,905,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION##
+
+493,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TK_MISSION##
+494,0,0,460:360:260:160:60,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SL_HIGH##
+495,0,0,100,0,0,0,2,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_ONEHAND##
+496,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_TWILIGHT1##
+497,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_TWILIGHT2##
+498,0,0,200,0,0,0,99,0,0,none,0,7134,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0//AM_TWILIGHT3##
+499,0,0,8,0,0,0,11,1,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_POWER##
+500,0,0,2,0,0,1,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GLITTERING
+501,0,0,10,0,0,0,99,0,0,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_FLING
+502,0,0,20,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_TRIPLEACTION
+503,0,0,30,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_BULLSEYE
+504,0,0,30,0,0,0,99,0,0,none,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_MADNESSCANCEL
+505,0,0,15,0,0,0,99,0,0,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_ADJUSTMENT
+506,0,0,30,0,0,0,99,0,0,none,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_INCREASING
+507,0,0,7,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_MAGICALBULLET
+508,0,0,10,0,0,0,99,99,1,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_CRACKER
+512,0,0,15:20:25:30:35:40:45:50:55:60,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_TRACKING
+513,0,0,15:20:25:30:35,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DISARM
+514,0,0,11:12:13:14:15,0,0,0,17:18,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_PIERCINGSHOT
+515,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,17,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_RAPIDSHOWER
+516,0,0,32:34:36:38:40:42:44:46:48:50,0,0,0,17,3,10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DESPERADO
+517,0,0,30:32:34:36:38:40:42:44:46:48,0,0,0,20,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GATLINGFEVER
+518,0,0,3:6:9:12:15:18:21:24:27:30,0,0,0,19,3,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_DUST
+519,0,0,20:25:30:35:40:45:50:55:60:65,0,0,0,19,3,2:2:4:4:6:6:8:8:10:10,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_FULLBUSTER
+520,0,0,15:20:25:30:35:40:45:50:55:60,0,0,0,19,3,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_SPREADATTACK
+521,0,0,4:8:12:16:20:24:28:32:36:40,0,0,0,21,5,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GS_GROUNDDRIFT
+523,0,0,2,0,0,0,99,6,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SYURIKEN
+524,0,0,30:25:20:15:10,0,0,0,99,7,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KUNAI
+525,0,0,20:25:30:35:40,0,0,0,22,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HUUMA
+526,0,0,50,0,0,500:1000:1500:2000:2500:3000:3500:4000:4500:5000,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_ZENYNAGE
+527,0,0,15,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI
+528,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI
+529,0,0,10,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP
+530,0,0,14:16:18:20:22,0,0,0,99,0,0,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE
+531,0,0,12:15:18:21:24,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI
+532,0,0,30:32:34:36:38:40:42:44:46:48,0,0,0,99,0,0,none,0,7524,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_BUNSINJYUTSU
+533,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU
+534,0,0,18:20:22:24:26:28:30:32:34:36,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KOUENKA
+535,0,0,25,0,0,0,99,0,0,none,0,7521,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KAENSIN
+536,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,7521,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_BAKUENRYU
+537,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU
+538,0,0,15:18:21:24:27:30:33:36:39:42,0,0,0,99,0,0,none,0,7522,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_SUITON
+539,0,0,40:45:50:55:60,0,0,0,99,0,0,none,0,7522,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HYOUSYOURAKU
+540,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_HUUJIN
+541,0,0,16:20:24:28:32,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI
+542,0,0,24:28:32:36:40,0,0,0,99,0,0,none,0,7523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_KAMAITACHI
+543,0,0,20:30:40:50:60,-5,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_NEN
+544,0,0,55:60:65:70:75:80:85:90:95:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NJ_ISSEN
+
+1001,0,0,40,0,0,0,99,0,0,move_enable,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#ƒ`ƒƒ?[ƒWƒAƒ^ƒbƒN#
+1002,0,0,15,0,0,0,99,0,0,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#ƒVƒ…ƒŠƒ“ƒN#
+1004,0,0,15,0,0,0,99,2,1,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#ƒxƒiƒ€ƒiƒCƒt#
+1005,0,0,25,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#ƒNƒ??[ƒYƒRƒ“ƒtƒ@ƒCƒ“#
+1006,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#ƒTƒCƒgƒuƒ‰ƒXƒ^?[#
+1007,0,0,30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#ƒGƒ‹ƒŒƒ?ƒ“ƒ^ƒ‹ƒRƒ“ƒo?[ƒ^?»‘¢#
+1008,0,0,30,0,0,0,99,0,0,none,0,12115,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#ƒGƒ‹ƒŒƒ?ƒ“ƒ^ƒ‹ƒ`ƒFƒ“ƒW#
+1009,0,0,10,0,0,0,11,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#ƒtƒ@ƒ“ƒ^ƒXƒ~ƒbƒNƒAƒ??[#
+1010,0,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#ƒpƒ“ƒ{ƒCƒX#
+1011,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#–£˜f‚̃EƒBƒ“ƒN#
+1013,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_GREED#æ×~#
+1014,0,0,400,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#ƒŒƒfƒ€ƒvƒeƒBƒI#
+1015,0,0,40,0,0,0,99,0,0,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#’¿Šï’?“ü(?U‹C’?“ü)#
+1016,10,0,20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#‘«? (”­™¤)#
+1017,0,0,30,0,0,0,99,0,0,none,0,12116,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND
+1018,0,0,30,0,0,0,99,0,0,none,0,12114,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE
+1019,0,0,30,0,0,0,99,0,0,none,0,12117,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND
+
+10010,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_BATTLEORDER##
+10011,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_REGENERATION##
+10012,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_RESTORE##
+10013,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_EMERGENCYCALL##
+
+8001,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,545,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL
+8002,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_AVOID
+8004,0,0,100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_CHANGE
+8005,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_CASTLE
+8006,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_DEFENCE
+8008,0,0,120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HAMI_BLOODLUST
+8009,0,0,4:8:12:16:20,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_MOON
+8010,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_FLEET
+8011,0,0,30:40:50:60:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_SPEED
+8012,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HFLI_SBR44
+8013,0,0,22:24:26:28:30,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_CAPRICE
+8014,0,0,40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_CHAOTIC
+8016,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HVAN_EXPLOSION
diff --git a/db/skill_tree.txt b/db/skill_tree.txt
index 5e769593e..a4d43339e 100644
--- a/db/skill_tree.txt
+++ b/db/skill_tree.txt
@@ -1,2179 +1,2179 @@
-//JobNo,Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name#
-//Novice
-0,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-0,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-0,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
-0,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Swordman
-1,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-1,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-1,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-1,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-1,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-1,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-1,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-1,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-1,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-1,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-1,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-1,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-1,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Magician
-2,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-2,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-2,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-2,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-2,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-2,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-2,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-2,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-2,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-2,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-2,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-2,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-2,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-2,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-2,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-2,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-2,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Archer
-3,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-3,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-3,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-3,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-3,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-3,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-3,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-3,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-3,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-3,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Acolyte
-4,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Merchant
-5,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-5,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-5,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-5,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-5,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-5,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-5,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-5,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-5,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-5,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-5,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-5,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-5,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Thief
-6,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-6,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-6,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-6,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-6,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-6,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-6,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-6,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-6,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-6,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-6,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-6,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-6,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Knight
-7,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-7,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-7,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-7,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-7,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-7,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-7,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-7,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-7,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-7,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-7,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-7,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-7,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-7,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-7,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-7,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-7,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-7,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-7,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-7,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-7,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-7,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-7,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-7,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-7,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//Priest
-8,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-8,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-8,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-8,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-8,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-8,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-8,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-8,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-8,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-8,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-8,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-8,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-8,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-8,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-8,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-8,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-8,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-8,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-8,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-8,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
-8,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
-8,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
-8,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
-8,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
-8,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
-8,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
-8,71,4,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
-8,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
-8,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
-8,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
-8,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
-8,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
-8,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
-8,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
-8,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
-8,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
-8,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Wizard
-9,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-9,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-9,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-9,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-9,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-9,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-9,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-9,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-9,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-9,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-9,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-9,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-9,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-9,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-9,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-9,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-9,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
-9,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
-//9,82,10,0,0,0,0,0,0,0,0,0,0 //WZ_FIREIVY#Fire Ivy#
-9,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
-9,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
-9,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
-9,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
-9,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
-9,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
-9,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
-9,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-9,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-9,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
-9,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-9,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
-9,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Blacksmith
-10,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-10,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-10,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-10,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-10,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-10,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-10,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-10,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-10,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-10,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-10,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-10,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-10,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
-10,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
-10,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
-10,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
-10,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
-10,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
-10,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
-10,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
-10,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
-10,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
-10,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
-10,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
-10,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
-10,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
-10,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
-10,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
-10,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
-10,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
-10,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
-10,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
-10,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
-10,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
-10,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
-10,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-10,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
-//Hunter
-11,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-11,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-11,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-11,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-11,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-11,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-11,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-11,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-11,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-11,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
-11,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
-11,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
-11,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
-11,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
-11,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
-11,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
-11,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
-11,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
-11,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-11,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
-11,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
-11,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
-11,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
-11,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
-11,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
-11,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
-11,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
-11,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-11,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
-//Assassin
-12,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-12,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-12,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-12,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-12,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-12,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-12,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-12,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-12,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-12,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-12,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-12,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-12,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
-12,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
-12,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
-12,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
-12,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
-12,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
-12,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
-12,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
-12,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
-12,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
-12,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
-12,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
-12,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Knight(Peco)
-13,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-13,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-13,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-13,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-13,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-13,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-13,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-13,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-13,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-13,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-13,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-13,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-13,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-13,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-13,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-13,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-13,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-13,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-13,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-13,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-13,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-13,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-13,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-13,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-13,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//Crusader
-14,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-14,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-14,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-14,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-14,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-14,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-14,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-14,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-14,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-14,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-14,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-14,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-14,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-14,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-14,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-14,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-14,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-14,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-14,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-14,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-14,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-14,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-14,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-14,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-14,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-14,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-14,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-14,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-14,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-14,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-14,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-14,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Monk
-15,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-15,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-15,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-15,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-15,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-15,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-15,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-15,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-15,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-15,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-15,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-15,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-15,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-15,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-15,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-15,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-15,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-15,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
-15,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
-15,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
-15,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
-15,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
-15,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
-15,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
-15,266,5,261,5,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
-15,267,5,266,3,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
-15,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
-15,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
-15,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
-15,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
-15,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
-15,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
-15,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
-15,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
-15,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Sage
-16,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-16,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-16,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-16,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-16,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-16,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-16,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-16,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-16,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-16,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-16,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-16,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-16,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-16,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-16,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-16,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-16,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-16,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-16,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-16,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
-16,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
-16,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
-16,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
-16,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
-16,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
-16,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
-16,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
-16,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
-16,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
-16,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
-16,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
-16,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
-16,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
-16,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
-16,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
-16,290,10,279,5,289,1,288,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
-16,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
-16,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
-16,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
-16,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
-16,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
-16,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Rogue
-17,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-17,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-17,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-17,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-17,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-17,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-17,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-17,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-17,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-17,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-17,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-17,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-17,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-17,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-17,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-17,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-17,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
-17,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
-17,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
-17,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
-17,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
-17,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
-17,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
-17,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
-17,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
-17,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
-17,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
-17,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
-17,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
-17,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
-17,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
-17,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
-17,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
-17,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Alchemist
-18,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-18,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-18,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-18,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-18,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-18,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-18,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-18,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-18,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-18,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-18,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-18,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-18,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
-18,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
-18,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
-18,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
-18,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
-18,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
-18,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
-18,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
-18,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
-18,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
-18,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
-18,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
-18,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
-18,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
-18,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
-18,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
-18,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-18,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
-18,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
-18,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
-18,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
-//Bard
-19,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-19,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-19,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-19,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-19,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-19,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-19,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-19,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-19,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-19,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
-19,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
-19,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
-19,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
-19,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
-19,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
-19,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
-19,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
-19,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-19,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-19,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-19,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-19,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-19,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-19,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-19,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-19,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-19,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-19,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
-19,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Dancer
-20,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-20,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-20,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-20,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-20,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-20,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-20,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-20,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-20,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-20,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
-20,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
-20,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
-20,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
-20,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
-20,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
-20,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
-20,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
-20,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-20,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-20,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-20,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-20,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-20,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-20,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-20,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-20,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-20,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-20,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
-20,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Crusader(Peco)
-21,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-21,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-21,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-21,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-21,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-21,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-21,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-21,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-21,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-21,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-21,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-21,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-21,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-21,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-21,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-21,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-21,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-21,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-21,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-21,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-21,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-21,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-21,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-21,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-21,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-21,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-21,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-21,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-21,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-21,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-21,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-21,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//WeddingClass
-22,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-22,334,1,0,0,0,0,0,0,0,0,0,0 //WE_MALE#I Will Protect You#
-22,335,5,0,0,0,0,0,0,0,0,0,0 //WE_FEMALE#I Look up to You#
-22,336,5,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#I miss You#
-22,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//SuperNovice
-23,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-23,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-23,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-23,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-23,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-23,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-23,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-23,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-23,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-23,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-23,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-23,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-23,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-23,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-23,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-23,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-23,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-23,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-23,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-23,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-23,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-23,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-23,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-23,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-23,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-23,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-23,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-23,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-23,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-23,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-23,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-23,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-23,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-23,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-23,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-23,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-23,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-23,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-23,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-23,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-23,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-23,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-23,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-23,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-23,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-23,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-23,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-23,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-23,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-23,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-23,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-23,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Gunslinger
-24,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-24,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-24,500,5,0,0,0,0,0,0,0,0,0,0 //GS_GLITTERING#Flip the Coin#
-24,501,1,500,1,0,0,0,0,0,0,0,0 //GS_FLING#Fling#
-24,502,1,500,1,511,10,0,0,0,0,0,0 //GS_TRIPLEACTION#Triple Action#
-24,503,1,500,5,512,10,0,0,0,0,0,0 //GS_BULLSEYE#Bulls Eye#
-24,504,1,500,4,517,10,0,0,0,0,0,0 //GS_MADNESSCANCEL#Madness Canceler#
-24,505,1,500,4,513,5,0,0,0,0,0,0 //GS_ADJUSTMENT#AdJustment#
-24,506,1,500,2,510,10,0,0,0,0,0,0 //GS_INCREASING#Increasing Accuracy#
-24,507,1,500,1,0,0,0,0,0,0,0,0 //GS_MAGICALBULLET#Magical Bullet#
-24,508,1,500,1,0,0,0,0,0,0,0,0 //GS_CRACKER#Cracker#
-24,509,10,0,0,0,0,0,0,0,0,0,0 //GS_SINGLEACTION#Single Action#
-24,510,10,0,0,0,0,0,0,0,0,0,0 //GS_SNAKEEYE#Snake Eye#
-24,511,10,509,1,0,0,0,0,0,0,0,0 //GS_CHAINACTION#Chain Action#
-24,512,10,509,5,0,0,0,0,0,0,0,0 //GS_TRACKING#Tracking#
-24,513,5,512,7,0,0,0,0,0,0,0,0 //GS_DISARM#Disarm#
-24,514,5,512,5,0,0,0,0,0,0,0,0 //GS_PIERCINGSHOT#Piercing Shot#
-24,515,10,511,3,0,0,0,0,0,0,0,0 //GS_RAPIDSHOWER#Rapid Shower#
-24,516,10,515,5,0,0,0,0,0,0,0,0 //GS_DESPERADO#Desperado#
-24,517,10,515,7,516,5,0,0,0,0,0,0 //GS_GATLINGFEVER#Gatling Fever#
-24,518,10,509,5,0,0,0,0,0,0,0,0 //GS_DUST#Dust#
-24,519,10,518,3,0,0,0,0,0,0,0,0 //GS_FULLBUSTER#Full Buster#
-24,520,10,519,5,0,0,0,0,0,0,0,0 //GS_SPREADATTACK#Spread Attack#
-24,521,10,520,7,0,0,0,0,0,0,0,0 //GS_GROUNDDRIFT#Ground Drift#
-24,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Ninja
-25,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-25,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-25,522,10,0,0,0,0,0,0,0,0,0,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU#
-25,523,10,522,1,0,0,0,0,0,0,0,0 //NJ_SYURIKEN#NJ_SYURIKEN#
-25,524,5,523,5,0,0,0,0,0,0,0,0 //NJ_KUNAI#NJ_KUNAI#
-25,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA#
-25,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
-25,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
-25,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
-25,529,5,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
-25,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
-25,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
-25,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
-25,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU#
-25,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA#
-25,535,10,534,5,0,0,0,0,0,0,0,0 //NJ_KAENSIN#NJ_KAENSIN#
-25,536,5,533,10,535,7,0,0,0,0,0,0 //NJ_BAKUENRYU#NJ_BAKUENRYU#
-25,537,10,533,1,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU#
-25,538,10,537,5,0,0,0,0,0,0,0,0 //NJ_SUITON#NJ_SUITON#
-25,539,5,533,10,538,7,0,0,0,0,0,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
-25,540,10,533,1,0,0,0,0,0,0,0,0 //NJ_HUUJIN#NJ_HUUJIN#
-25,541,5,540,5,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI#
-25,542,5,533,10,541,5,0,0,0,0,0,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
-25,543,5,533,5,0,0,0,0,0,0,0,0 //NJ_NEN#NJ_NEN#
-25,544,10,522,7,530,5,543,1,0,0,0,0 //NJ_ISSEN#NJ_ISSEN#
-25,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//NoviceHigh
-4001,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4001,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4001,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
-4001,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//SwordmanHigh
-4002,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4002,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4002,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4002,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4002,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4002,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4002,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4002,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4002,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4002,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4002,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4002,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4002,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//MageHigh
-4003,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4003,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4003,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4003,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4003,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4003,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4003,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4003,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4003,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4003,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4003,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4003,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4003,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4003,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4003,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4003,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4003,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//ArcherHigh
-4004,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4004,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4004,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4004,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4004,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4004,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4004,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4004,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4004,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4004,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//AcolyteHigh
-4005,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4005,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4005,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4005,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4005,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4005,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4005,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4005,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4005,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4005,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4005,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4005,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4005,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4005,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4005,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4005,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4005,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4005,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//MerchantHigh
-4006,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4006,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4006,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4006,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4006,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4006,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4006,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4006,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4006,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4006,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4006,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4006,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4006,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//ThiefHigh
-4007,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4007,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4007,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4007,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4007,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4007,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4007,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4007,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4007,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4007,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4007,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4007,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4007,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//LordKnight
-4008,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4008,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4008,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4008,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4008,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4008,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4008,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4008,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4008,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4008,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4008,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4008,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4008,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4008,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-4008,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-4008,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-4008,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-4008,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-4008,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-4008,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-4008,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4008,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4008,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-4008,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade#
-4008,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
-4008,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
-4008,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
-4008,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //check this, the last ",0" shouldn't be needed I think
-4008,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
-4008,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
-4008,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#
-4008,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-4008,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//HighPriest
-4009,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4009,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4009,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4009,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4009,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4009,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4009,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4009,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4009,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4009,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4009,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4009,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4009,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4009,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4009,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4009,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4009,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4009,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4009,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4009,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
-4009,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
-4009,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
-4009,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
-4009,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
-4009,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
-4009,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
-4009,71,4,72,1,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
-4009,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
-4009,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
-4009,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
-4009,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
-4009,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
-4009,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
-4009,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
-4009,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
-4009,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
-4009,361,5,33,1,9,3,66,3,0,0,0,0 //HP_ASSUMPTIO#Assumptio#
-4009,362,5,75,2,9,1,73,3,0,0,0,0 //HP_BASILICA#Basilica#
-4009,363,10,68,3,9,5,76,5,0,0,0,0 //HP_MEDITATIO#Meditatio#
-4009,481,5,65,10,23,10,0,0,0,0,0,0 //HP_MANARECHARGE#Mana Recharge#
-4009,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//HighWizard
-4010,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4010,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4010,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4010,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4010,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4010,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4010,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4010,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4010,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4010,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4010,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4010,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4010,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4010,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4010,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4010,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4010,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
-4010,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
-4010,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
-4010,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
-4010,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
-4010,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
-4010,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
-4010,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
-4010,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
-4010,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-4010,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-4010,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
-4010,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-4010,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
-4010,364,10,9,5,13,7,0,0,0,0,0,0 //HW_SOULDRAIN#Soul Drain#
-4010,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher#
-4010,366,10,0,0,0,0,0,0,0,0,0,0 //HW_MAGICPOWER#Mystical Amplification#
-4010,400,5,11,5,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#Napalm Vulcan#
-4010,483,1,93,1,87,1,0,0,0,0,0,0 //HW_GANBANTEIN#Ganbantein#
-4010,484,5,365,1,366,10,92,1,0,0,0,0 //HW_GRAVITATION#Gravitation#
-4010,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Whitesmith
-4011,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4011,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4011,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4011,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4011,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4011,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4011,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4011,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4011,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4011,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4011,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4011,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4011,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
-4011,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
-4011,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
-4011,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
-4011,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
-4011,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
-4011,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
-4011,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
-4011,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
-4011,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
-4011,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
-4011,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
-4011,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
-4011,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
-4011,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
-4011,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
-4011,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
-4011,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
-4011,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
-4011,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
-4011,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
-4011,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
-4011,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
-4011,384,10,109,3,105,1,107,5,113,3,0,0 //WS_MELTDOWN#Shattering Strike#
-//4011,385,3,109,5,94,5,96,3,97,2,0,0 //WS_CREATECOIN#Create Coins#
-//4011,386,3,97,3,106,1,107,5,0,0,0,0 //WS_CREATENUGGET#Create Nuggets#
-4011,387,1,39,5,153,1,154,1,105,1,0,0 //WS_CARTBOOST#Cart Boost#
-//4011,388,1,107,10,112,3,0,0,0,0,0,0 //WS_SYSTEMCREATE#Auto Attack System#
-4011,477,10,107,10,0,0,0,0,0,0,0,0 //WS_WEAPONREFINE#Upgrade Weapon#
-4011,485,10,42,10,110,5,387,1,0,0,0,0 //WS_CARTTERMINATION#Cart Termination#
-4011,486,5,113,5,0,0,0,0,0,0,0,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
-4011,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-4011,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
-//Sniper
-4012,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4012,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4012,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4012,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4012,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4012,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4012,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4012,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4012,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4012,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
-4012,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
-4012,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
-4012,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
-4012,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
-4012,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
-4012,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
-4012,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
-4012,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
-4012,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-4012,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
-4012,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
-4012,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
-4012,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
-4012,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
-4012,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
-4012,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
-4012,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
-4012,380,10,43,10,44,10,45,10,127,1,0,0 //SN_SIGHT#Falcon Eyes#
-4012,381,5,128,3,44,5,129,5,127,1,0,0 //SN_FALCONASSAULT#Falcon Assault#
-4012,382,5,45,10,46,5,0,0,0,0,0,0 //SN_SHARPSHOOTING#Focused Arrow Strike#
-4012,383,10,45,9,0,0,0,0,0,0,0,0 //SN_WINDWALK#Wind Walker#
-4012,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-4012,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
-//AssassinCross
-4013,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4013,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4013,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4013,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4013,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4013,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4013,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4013,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4013,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4013,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4013,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4013,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4013,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
-4013,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
-4013,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
-4013,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
-4013,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
-4013,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
-4013,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
-4013,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
-4013,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
-4013,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
-4013,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
-4013,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
-4013,376,5,48,5,134,7,0,0,0,0,0,0 //ASC_KATAR#Advanced Katar Mastery#
-4013,378,5,407,1,0,0,0,0,0,0,0,0 //ASC_EDP#Deadly Poison Enchantment#
-4013,379,10,48,5,135,3,138,6,52,5,0,0 //ASC_BREAKER#Soul Destroyer#
-4013,406,10,132,3,134,5,136,5,379,1,0,0 //ASC_METEORASSAULT#Meteor Assault#
-4013,407,1,52,10,53,1,138,5,0,0,0,0 //ASC_CDP#Create Deadly Poison#
-4013,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//LordKnight(Peco)
-4014,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4014,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4014,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4014,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4014,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4014,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4014,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4014,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4014,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4014,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4014,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4014,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4014,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4014,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-4014,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-4014,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-4014,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-4014,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-4014,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-4014,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-4014,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4014,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4014,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-4014,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade#
-4014,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
-4014,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
-4014,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
-4014,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //check this, the last ",0" shouldn't be needed I think
-4014,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
-4014,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
-4014,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#
-4014,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-4014,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//Paladin
-4015,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4015,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4015,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4015,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4015,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4015,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4015,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4015,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4015,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4015,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4015,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4015,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4015,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4015,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4015,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4015,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4015,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4015,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4015,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-4015,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-4015,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-4015,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-4015,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-4015,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-4015,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-4015,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-4015,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-4015,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-4015,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-4015,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-4015,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-4015,367,5,8,5,248,5,250,2,0,0,0,0 //PA_PRESSURE#Gloria Domini#
-4015,368,5,8,1,248,5,255,3,0,0,0,0 //PA_SACRIFICE#Martyr's Reckoning#
-4015,369,10,248,8,22,3,23,5,0,0,0,0 //PA_GOSPEL#Battle Chant#
-4015,480,5,251,5,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN#Shield Chain#
-4015,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Champion
-4016,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4016,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4016,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4016,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4016,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4016,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4016,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4016,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4016,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4016,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4016,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4016,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4016,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4016,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4016,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4016,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4016,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4016,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
-4016,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
-4016,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
-4016,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
-4016,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
-4016,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
-4016,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
-4016,266,5,261,5,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
-4016,267,5,266,3,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
-4016,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
-4016,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
-4016,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
-4016,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
-4016,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
-4016,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
-4016,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
-4016,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
-4016,370,5,259,7,261,5,0,0,0,0,0,0 //CH_PALMSTRIKE#Raging Palm Strike#
-4016,371,5,259,5,263,5,261,5,273,3,0,0 //CH_TIGERFIST#Glacier Fist#
-4016,372,10,259,5,261,5,371,2,0,0,0,0 //CH_CHAINCRUSH#Chain Crush Combo#
-4016,401,1,261,5,262,1,270,5,0,0,0,0 //CH_SOULCOLLECT#Hyper Spirit Sphere#
-4016,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Professor
-4017,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4017,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4017,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4017,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4017,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4017,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4017,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4017,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4017,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4017,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4017,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4017,18,10,10,1,17,5,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4017,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4017,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4017,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4017,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-4017,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-4017,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-4017,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4017,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
-4017,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
-4017,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
-4017,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
-4017,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
-4017,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
-4017,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
-4017,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
-4017,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
-4017,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
-4017,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
-4017,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
-4017,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
-4017,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
-4017,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
-4017,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
-4017,290,10,279,5,288,1,289,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
-4017,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
-4017,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
-4017,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
-4017,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
-4017,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
-4017,373,5,9,1,276,1,0,0,0,0,0,0 //PF_HPCONVERSION#Indulge#
-4017,374,1,276,3,277,2,0,0,0,0,0,0 //PF_SOULCHANGE#Soul Exhale#
-4017,375,5,275,5,276,3,289,3,0,0,0,0 //PF_SOULBURN#Soul Siphon#
-4017,402,5,9,3,375,1,0,0,0,0,0,0 //PF_MINDBREAKER#Mind Breaker#
-4017,403,1,274,5,278,5,279,1,0,0,0,0 //PF_MEMORIZE#Foresight#
-4017,404,1,286,2,287,2,0,0,0,0,0,0 //PF_FOGWALL#Blinding Mist#
-4017,405,1,284,4,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#Fiber Lock#
-4017,482,5,279,1,0,0,0,0,0,0,0,0 //PF_DOUBLECASTING#Double Casting#
-4017,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Stalker
-4018,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4018,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4018,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4018,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4018,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4018,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4018,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4018,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4018,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4018,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4018,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4018,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4018,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4018,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4018,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4018,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-4018,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
-4018,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
-4018,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
-4018,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
-4018,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
-4018,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
-4018,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
-4018,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
-4018,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
-4018,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
-4018,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
-4018,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
-4018,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
-4018,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
-4018,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
-4018,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
-4018,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
-4018,389,5,51,5,213,3,0,0,0,0,0,0 //ST_CHASEWALK#Stealth#
-4018,390,5,215,1,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#Counter Instinct#
-4018,475,1,225,10,0,0,0,0,0,0,0,0 //ST_PRESERVE#Preserve#
-4018,476,5,215,5,216,5,217,5,218,5,0,0 //ST_FULLSTRIP#Divest All#
-4018,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Creator
-4019,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4019,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4019,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4019,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4019,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4019,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4019,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4019,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4019,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4019,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4019,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4019,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4019,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
-4019,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
-4019,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
-4019,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
-4019,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
-4019,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
-4019,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
-4019,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
-4019,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
-4019,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
-4019,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
-4019,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
-4019,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
-4019,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
-4019,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
-4019,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
-//4019,392,5,228,5,0,0,0,0,0,0,0,0 //CR_ALCHEMY#Alchemy#
-//4019,393,5,228,6,390,2,0,0,0,0,0,0 //CR_SYNTHESISPOTION#Potion Synthesis#
-4019,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion#
-4019,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection#
-4019,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
-4019,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation#
-4019,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-4019,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
-4019,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
-4019,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
-4019,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
-//Clown
-4020,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4020,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4020,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4020,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4020,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4020,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4020,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4020,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4020,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4020,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
-4020,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
-4020,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
-4020,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
-4020,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
-4020,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
-4020,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
-4020,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
-4020,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-4020,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-4020,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-4020,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-4020,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-4020,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-4020,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-4020,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-4020,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-4020,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-4020,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
-4020,394,10,47,5,316,1,0,0,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
-4020,395,5,45,5,315,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
-4020,396,1,45,5,315,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4020,487,5,315,10,396,1,0,0,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
-4020,488,5,45,10,315,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
-4020,489,5,45,10,317,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
-4020,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Gypsy
-4021,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4021,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4021,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4021,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4021,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4021,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4021,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4021,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4021,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4021,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
-4021,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
-4021,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
-4021,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
-4021,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
-4021,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
-4021,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
-4021,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
-4021,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-4021,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-4021,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-4021,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-4021,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-4021,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-4021,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-4021,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-4021,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-4021,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-4021,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
-4021,394,10,47,5,324,1,0,0,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
-4021,395,5,45,5,323,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
-4021,396,1,45,5,323,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
-4021,487,5,323,10,396,1,0,0,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
-4021,488,5,45,10,323,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
-4021,489,5,45,10,325,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
-4021,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Paladin(Peco)
-4022,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4022,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4022,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4022,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4022,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4022,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4022,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4022,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4022,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4022,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4022,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4022,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4022,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4022,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4022,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4022,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4022,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4022,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4022,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-4022,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-4022,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-4022,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-4022,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-4022,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-4022,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-4022,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-4022,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-4022,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-4022,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-4022,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-4022,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-4022,367,5,8,5,248,5,250,2,0,0,0,0 //PA_PRESSURE#Gloria Domini#
-4022,368,5,8,5,248,5,255,3,0,0,0,0 //PA_SACRIFICE#Martyr's Reckoning#
-4022,369,10,248,8,22,3,23,5,0,0,0,0 //PA_GOSPEL#Battle Chant#
-4022,480,5,251,5,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN#Shield Chain#
-4022,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Baby (Novice)
-4023,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4023,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4023,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
-4023,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4023,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Swordman
-4024,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4024,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4024,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4024,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4024,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4024,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4024,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4024,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4024,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4024,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4024,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4024,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4024,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4024,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Magician
-4025,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4025,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4025,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4025,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4025,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4025,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4025,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4025,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4025,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4025,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4025,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4025,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4025,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4025,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4025,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4025,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4025,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4025,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Archer
-4026,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4026,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4026,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4026,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4026,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4026,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4026,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4026,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4026,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4026,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4026,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Acolyte
-4027,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4027,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4027,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4027,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4027,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4027,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4027,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4027,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4027,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4027,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4027,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4027,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4027,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4027,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4027,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4027,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4027,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4027,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4027,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Merchant
-4028,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4028,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4028,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4028,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4028,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4028,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4028,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4028,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4028,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4028,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4028,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4028,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4028,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4028,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Thief
-4029,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4029,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4029,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4029,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4029,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4029,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4029,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4029,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4029,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4029,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4029,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4029,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4029,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4029,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Baby Knight
-4030,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4030,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4030,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4030,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4030,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4030,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4030,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4030,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4030,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4030,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4030,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4030,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4030,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4030,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4030,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4030,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-4030,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-4030,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-4030,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-4030,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-4030,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-4030,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-4030,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4030,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4030,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-4030,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//Baby Priest
-4031,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4031,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4031,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4031,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4031,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4031,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4031,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4031,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4031,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4031,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4031,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4031,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4031,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4031,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4031,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4031,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4031,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4031,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4031,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4031,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4031,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4031,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
-4031,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
-4031,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
-4031,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
-4031,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
-4031,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
-4031,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
-4031,71,4,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
-4031,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
-4031,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
-4031,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
-4031,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
-4031,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
-4031,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
-4031,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
-4031,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
-4031,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
-//Baby Wizard
-4032,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4032,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4032,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4032,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4032,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4032,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4032,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4032,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4032,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4032,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4032,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4032,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4032,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4032,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4032,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4032,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4032,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4032,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4032,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
-4032,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
-4032,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
-4032,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
-4032,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
-4032,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
-4032,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
-4032,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
-4032,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
-4032,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-4032,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-4032,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
-4032,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-4032,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
-//Baby Blacksmith
-4033,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4033,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4033,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4033,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4033,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4033,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4033,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4033,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4033,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4033,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4033,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4033,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4033,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4033,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4033,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
-4033,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
-4033,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
-4033,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
-4033,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
-4033,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
-4033,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
-4033,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
-4033,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
-4033,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
-4033,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
-4033,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
-4033,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
-4033,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
-4033,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
-4033,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
-4033,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
-4033,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
-4033,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
-4033,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
-4033,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
-4033,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
-4033,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
-4033,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
-//Baby Hunter
-4034,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4034,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4034,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4034,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4034,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4034,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4034,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4034,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4034,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4034,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4034,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4034,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
-4034,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
-4034,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
-4034,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
-4034,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
-4034,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
-4034,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
-4034,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
-4034,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
-4034,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-4034,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
-4034,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
-4034,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
-4034,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
-4034,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
-4034,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
-4034,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
-4034,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
-4034,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
-//Baby Assassin
-4035,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4035,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4035,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4035,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4035,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4035,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4035,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4035,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4035,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4035,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4035,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4035,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4035,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4035,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4035,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
-4035,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
-4035,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
-4035,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
-4035,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
-4035,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
-4035,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
-4035,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
-4035,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
-4035,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
-4035,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
-4035,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
-//Baby Knight(Peco)
-4036,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4036,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4036,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4036,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4036,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4036,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4036,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4036,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4036,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4036,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4036,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4036,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4036,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4036,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4036,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4036,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
-4036,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
-4036,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
-4036,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
-4036,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
-4036,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
-4036,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
-4036,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4036,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4036,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
-4036,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
-//Baby Crusader
-4037,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4037,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4037,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4037,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4037,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4037,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4037,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4037,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4037,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4037,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4037,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4037,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4037,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4037,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4037,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4037,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4037,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4037,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4037,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4037,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4037,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-4037,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-4037,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-4037,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-4037,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-4037,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-4037,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-4037,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-4037,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-4037,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-4037,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-4037,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-4037,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-//Baby Monk
-4038,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4038,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4038,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4038,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4038,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4038,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4038,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4038,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4038,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4038,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4038,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4038,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4038,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4038,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4038,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4038,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4038,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
-4038,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4038,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4038,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
-4038,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
-4038,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
-4038,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
-4038,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
-4038,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
-4038,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
-4038,266,5,261,5,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
-4038,267,5,266,3,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
-4038,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
-4038,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
-4038,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
-4038,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
-4038,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
-4038,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
-4038,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
-4038,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
-//Baby Sage
-4039,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4039,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4039,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4039,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4039,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4039,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4039,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4039,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4039,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4039,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4039,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4039,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4039,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4039,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4039,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4039,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
-4039,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4039,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4039,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
-4039,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
-4039,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
-4039,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
-4039,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
-4039,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
-4039,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
-4039,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
-4039,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
-4039,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
-4039,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
-4039,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
-4039,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
-4039,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
-4039,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
-4039,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
-4039,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
-4039,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
-4039,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
-4039,290,10,279,5,289,1,288,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
-4039,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
-4039,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
-4039,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
-4039,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
-4039,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
-//Baby Rogue
-4040,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4040,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4040,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4040,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4040,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4040,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4040,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4040,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4040,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
-4040,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
-4040,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
-4040,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
-4040,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4040,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4040,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4040,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4040,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4040,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
-4040,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
-4040,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
-4040,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
-4040,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
-4040,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
-4040,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
-4040,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
-4040,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
-4040,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
-4040,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
-4040,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
-4040,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
-4040,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
-4040,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
-4040,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
-4040,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
-4040,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
-//Baby Alchemist
-4041,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4041,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4041,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4041,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4041,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4041,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4041,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4041,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4041,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4041,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
-4041,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
-4041,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
-4041,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4041,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4041,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
-4041,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
-4041,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
-4041,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
-4041,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
-4041,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
-4041,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
-4041,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
-4041,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
-4041,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
-4041,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
-4041,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
-4041,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
-4041,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
-4041,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
-4041,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
-4041,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
-4041,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
-4041,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
-4041,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
-//Baby Bard
-4042,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4042,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4042,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4042,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4042,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4042,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4042,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4042,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4042,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4042,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4042,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4042,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
-4042,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
-4042,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
-4042,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
-4042,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
-4042,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
-4042,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
-4042,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
-4042,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-4042,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-4042,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-4042,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-4042,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-4042,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-4042,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-4042,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-4042,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-4042,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-4042,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
-//Baby Dancer
-4043,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4043,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4043,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4043,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4043,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4043,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
-4043,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
-4043,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
-4043,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
-4043,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4043,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4043,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
-4043,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
-4043,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
-4043,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
-4043,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
-4043,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
-4043,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
-4043,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
-4043,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
-4043,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
-4043,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
-4043,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
-4043,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
-4043,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
-4043,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
-4043,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
-4043,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
-4043,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
-4043,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
-//Baby Crusader(Peco)
-4044,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4044,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4044,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4044,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
-4044,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4044,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4044,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4044,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4044,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4044,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
-4044,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
-4044,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
-4044,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4044,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-4044,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
-4044,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
-4044,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
-4044,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4044,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4044,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4044,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
-4044,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
-4044,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
-4044,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
-4044,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
-4044,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
-4044,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
-4044,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
-4044,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
-4044,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
-4044,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
-4044,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
-4044,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
-//Super Baby
-4045,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4045,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4045,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
-4045,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
-4045,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
-4045,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
-4045,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
-4045,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
-4045,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
-4045,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
-4045,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
-4045,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
-4045,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
-4045,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
-4045,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
-4045,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
-4045,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
-4045,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
-4045,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
-4045,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
-4045,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
-4045,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
-4045,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
-4045,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
-4045,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
-4045,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
-4045,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
-4045,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
-4045,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
-4045,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
-4045,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
-4045,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
-4045,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
-4045,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
-4045,35,1,0,0,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
-4045,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
-4045,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
-4045,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
-4045,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
-4045,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4045,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
-4045,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
-4045,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
-4045,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
-4045,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
-4045,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
-4045,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
-4045,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
-4045,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
-4045,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
-4045,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
-4045,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
-4045,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
-//Taekwon
-4046,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4046,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4046,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
-4046,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
-4046,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
-4046,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
-4046,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
-4046,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
-4046,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
-4046,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
-4046,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
-4046,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
-4046,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
-4046,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
-4046,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
-4046,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
-4046,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
-4046,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
-4046,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
-4046,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Star Gladiator
-4047,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4047,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4047,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
-4047,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
-4047,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
-4047,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
-4047,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
-4047,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
-4047,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
-4047,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
-4047,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
-4047,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
-4047,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
-4047,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
-4047,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
-4047,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
-4047,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
-4047,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
-4047,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
-4047,427,3,0,0,0,0,0,0,0,0,0,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
-4047,428,3,427,1,0,0,0,0,0,0,0,0 //SG_SUN_WARM#Warmth of the Sun#
-4047,429,3,427,2,0,0,0,0,0,0,0,0 //SG_MOON_WARM#Warmth of the Moon#
-4047,430,3,427,3,0,0,0,0,0,0,0,0 //SG_STAR_WARM#Warmth of the Star#
-4047,431,4,427,1,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT#Comfort of the Sun#
-4047,432,4,427,2,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT#Comfort of the Moon#
-4047,433,4,427,3,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT#Comfort of the Star#
-4047,434,3,0,0,0,0,0,0,0,0,0,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
-4047,435,3,434,1,0,0,0,0,0,0,0,0 //SG_SUN_ANGER#Sun's Wrath#
-4047,436,3,434,2,0,0,0,0,0,0,0,0 //SG_MOON_ANGER#Moon's Wrath#
-4047,437,3,434,3,0,0,0,0,0,0,0,0 //SG_STAR_ANGER#Stars's Wrath#
-4047,438,5,427,1,434,1,0,0,0,0,0,0 //SG_SUN_BLESS#Blessing of the Sun#
-4047,439,5,427,2,434,2,0,0,0,0,0,0 //SG_MOON_BLESS#Blessing of the Moon#
-4047,440,5,427,3,434,3,0,0,0,0,0,0 //SG_STAR_BLESS#Blessing of the Star#
-4047,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
-4047,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
-4047,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
-4047,444,1,443,9,0,0,0,0,0,0,0,0
-//SG_FUSION#Union of the Sun, Moon and Stars#
-4047,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Star Gladiator (Flying)
-4048,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4048,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4048,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
-4048,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
-4048,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
-4048,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
-4048,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
-4048,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
-4048,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
-4048,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
-4048,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
-4048,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
-4048,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
-4048,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
-4048,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
-4048,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
-4048,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
-4048,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
-4048,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
-4048,427,3,0,0,0,0,0,0,0,0,0,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
-4048,428,3,427,1,0,0,0,0,0,0,0,0 //SG_SUN_WARM#Warmth of the Sun#
-4048,429,3,427,2,0,0,0,0,0,0,0,0 //SG_MOON_WARM#Warmth of the Moon#
-4048,430,3,427,3,0,0,0,0,0,0,0,0 //SG_STAR_WARM#Warmth of the Star#
-4048,431,4,427,1,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT#Comfort of the Sun#
-4048,432,4,427,2,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT#Comfort of the Moon#
-4048,433,4,427,3,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT#Comfort of the Star#
-4048,434,3,0,0,0,0,0,0,0,0,0,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
-4048,435,3,434,1,0,0,0,0,0,0,0,0 //SG_SUN_ANGER#Sun's Wrath#
-4048,436,3,434,2,0,0,0,0,0,0,0,0 //SG_MOON_ANGER#Moon's Wrath#
-4048,437,3,434,3,0,0,0,0,0,0,0,0 //SG_STAR_ANGER#Stars's Wrath#
-4048,438,5,427,1,434,1,0,0,0,0,0,0 //SG_SUN_BLESS#Blessing of the Sun#
-4048,439,5,427,2,434,2,0,0,0,0,0,0 //SG_MOON_BLESS#Blessing of the Moon#
-4048,440,5,427,3,434,3,0,0,0,0,0,0 //SG_STAR_BLESS#Blessing of the Star#
-4048,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
-4048,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
-4048,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
-4048,444,1,443,9,0,0,0,0,0,0,0,0
-//SG_FUSION#Union of the Sun, Moon and Stars#
-4048,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
-//Soul Linker
-4049,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
-4049,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
-4049,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
-4049,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
-4049,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
-4049,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
-4049,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
-4049,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
-4049,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
-4049,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
-4049,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
-4049,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
-4049,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
-4049,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
-4049,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
-4049,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
-4049,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
-4049,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
-4049,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
-4049,445,5,0,0,0,0,0,0,0,0,0,0 //SL_ALCHEMIST#Spirit of the Alchemist#
-4049,447,5,0,0,0,0,0,0,0,0,0,0 //SL_MONK#Spirit of the Monk#
-4049,448,5,0,0,0,0,0,0,0,0,0,0 //SL_STAR#Spirit of the Star Knight#
-4049,449,5,0,0,0,0,0,0,0,0,0,0 //SL_SAGE#Spirit of the Professor#
-4049,450,5,0,0,0,0,0,0,0,0,0,0 //SL_CRUSADER#Spirit of the Crusader#
-4049,451,5,0,0,0,0,0,0,0,0,0,0 //SL_SUPERNOVICE#Spirit of the Supernovice#
-4049,452,5,450,1,0,0,0,0,0,0,0,0 //SL_KNIGHT#Spirit of the Knight#
-4049,453,5,449,1,0,0,0,0,0,0,0,0 //SL_WIZARD#Spirit of the Wizard#
-4049,454,5,447,1,0,0,0,0,0,0,0,0 //SL_PRIEST#Spirit of the Priest#
-4049,455,5,0,0,0,0,0,0,0,0,0,0 //SL_BARDDANCER#Spirit of the Artist#
-4049,456,5,457,1,0,0,0,0,0,0,0,0 //SL_ROGUE#Spirit of the Rogue#
-4049,457,5,0,0,0,0,0,0,0,0,0,0 //SL_ASSASIN#Spirit of the Assasin#
-4049,458,5,445,1,0,0,0,0,0,0,0,0 //SL_BLACKSMITH#Spirit of the Blacksmith#
-4049,460,5,455,1,0,0,0,0,0,0,0,0 //SL_HUNTER#Spirit of the Hunter#
-4049,461,5,448,1,0,0,0,0,0,0,0,0 //SL_SOULLINKER#Spirit of the Soul Linker#
-4049,462,7,454,1,0,0,0,0,0,0,0,0 //SL_KAIZEL#Kaizel#
-4049,463,7,454,1,450,1,0,0,0,0,0,0 //SL_KAAHI#Kahai#
-4049,464,3,456,1,0,0,0,0,0,0,0,0 //SL_KAUPE#Kauf#
-4049,465,7,453,1,0,0,0,0,0,0,0,0 //SL_KAITE#Kaite#
-4049,466,7,423,1,0,0,0,0,0,0,0,0 //SL_KAINA#Kaina#
-4049,467,7,453,1,0,0,0,0,0,0,0,0 //SL_STIN#Estin#
-4049,468,7,453,1,0,0,0,0,0,0,0,0 //SL_STUN#Estern#
-4049,469,10,467,7,468,7,0,0,0,0,0,0 //SL_SMA#Esma#
-4049,470,7,454,1,0,0,0,0,0,0,0,0 //SL_SWOO#Esu#
-4049,471,3,452,1,0,0,0,0,0,0,0,0 //SL_SKE#Esk#
-4049,472,3,447,1,0,0,0,0,0,0,0,0 //SL_SKA#Eska#
-4049,494,5,451,1,0,0,0,0,0,0,0,0 //SL_HIGH#Spirit of Rebirth#
-4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//JobNo,Skill-ID,MaxLV,Prerequisite Skill-ID-1,Prerequisite Skill-ID-1-Lv,PrereqSkill-ID-2,PrereqSkill-ID-2-Lv,PrereqSkill-ID-3,PrereqSkill-ID-3-Lv,PrereqSkill-ID-4,PrereqSkill-ID-4-Lv,PrereqSkill-ID-5,PrereqSkill-ID-5-Lv//CLASS_SKILLNAME#Skill Name#
+//Novice
+0,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+0,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+0,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
+0,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Swordman
+1,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+1,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+1,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+1,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+1,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+1,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+1,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+1,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+1,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+1,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+1,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+1,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+1,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Magician
+2,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+2,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+2,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+2,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+2,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+2,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+2,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+2,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+2,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+2,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+2,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+2,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+2,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+2,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+2,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+2,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+2,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Archer
+3,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+3,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+3,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+3,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+3,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+3,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+3,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+3,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+3,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+3,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Acolyte
+4,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Merchant
+5,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+5,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+5,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+5,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+5,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+5,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+5,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+5,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+5,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+5,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+5,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+5,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+5,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Thief
+6,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+6,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+6,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+6,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+6,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+6,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+6,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+6,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+6,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+6,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+6,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+6,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+6,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Knight
+7,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+7,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+7,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+7,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+7,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+7,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+7,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+7,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+7,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+7,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+7,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+7,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+7,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+7,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+7,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+7,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+7,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+7,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+7,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+7,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+7,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+7,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+7,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+7,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+7,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//Priest
+8,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+8,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+8,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+8,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+8,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+8,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+8,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+8,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+8,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+8,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+8,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+8,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+8,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+8,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+8,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+8,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+8,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+8,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+8,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+8,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
+8,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
+8,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
+8,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
+8,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
+8,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
+8,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
+8,71,4,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
+8,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
+8,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
+8,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
+8,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
+8,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
+8,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
+8,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
+8,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
+8,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
+8,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Wizard
+9,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+9,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+9,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+9,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+9,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+9,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+9,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+9,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+9,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+9,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+9,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+9,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+9,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+9,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+9,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+9,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+9,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
+9,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
+//9,82,10,0,0,0,0,0,0,0,0,0,0 //WZ_FIREIVY#Fire Ivy#
+9,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
+9,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
+9,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
+9,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
+9,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
+9,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
+9,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
+9,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+9,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+9,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
+9,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+9,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
+9,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Blacksmith
+10,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+10,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+10,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+10,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+10,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+10,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+10,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+10,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+10,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+10,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+10,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+10,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+10,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
+10,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
+10,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
+10,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
+10,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
+10,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
+10,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
+10,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
+10,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
+10,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
+10,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
+10,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
+10,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
+10,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
+10,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
+10,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
+10,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
+10,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
+10,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
+10,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
+10,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
+10,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
+10,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
+10,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+10,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
+//Hunter
+11,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+11,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+11,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+11,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+11,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+11,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+11,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+11,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+11,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+11,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
+11,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
+11,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
+11,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
+11,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
+11,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
+11,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
+11,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
+11,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
+11,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+11,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
+11,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
+11,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
+11,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
+11,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
+11,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
+11,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
+11,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
+11,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+11,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
+//Assassin
+12,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+12,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+12,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+12,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+12,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+12,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+12,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+12,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+12,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+12,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+12,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+12,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+12,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
+12,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
+12,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
+12,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
+12,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
+12,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
+12,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
+12,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
+12,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
+12,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
+12,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
+12,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
+12,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Knight(Peco)
+13,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+13,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+13,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+13,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+13,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+13,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+13,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+13,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+13,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+13,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+13,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+13,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+13,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+13,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+13,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+13,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+13,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+13,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+13,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+13,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+13,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+13,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+13,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+13,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+13,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//Crusader
+14,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+14,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+14,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+14,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+14,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+14,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+14,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+14,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+14,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+14,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+14,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+14,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+14,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+14,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+14,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+14,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+14,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+14,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+14,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+14,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+14,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+14,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+14,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+14,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+14,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+14,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+14,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+14,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+14,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+14,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+14,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+14,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Monk
+15,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+15,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+15,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+15,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+15,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+15,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+15,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+15,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+15,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+15,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+15,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+15,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+15,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+15,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+15,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+15,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+15,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+15,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
+15,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
+15,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
+15,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
+15,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
+15,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
+15,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
+15,266,5,261,5,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
+15,267,5,266,3,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
+15,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
+15,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
+15,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
+15,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
+15,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
+15,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
+15,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
+15,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
+15,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Sage
+16,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+16,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+16,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+16,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+16,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+16,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+16,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+16,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+16,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+16,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+16,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+16,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+16,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+16,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+16,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+16,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+16,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+16,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+16,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+16,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
+16,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
+16,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
+16,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
+16,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
+16,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
+16,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
+16,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
+16,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
+16,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
+16,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
+16,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
+16,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
+16,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
+16,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
+16,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
+16,290,10,279,5,289,1,288,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
+16,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
+16,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
+16,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
+16,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
+16,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
+16,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Rogue
+17,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+17,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+17,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+17,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+17,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+17,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+17,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+17,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+17,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+17,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+17,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+17,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+17,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+17,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+17,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+17,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+17,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
+17,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
+17,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
+17,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
+17,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
+17,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
+17,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
+17,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
+17,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
+17,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
+17,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
+17,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
+17,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
+17,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
+17,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
+17,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
+17,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
+17,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Alchemist
+18,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+18,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+18,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+18,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+18,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+18,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+18,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+18,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+18,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+18,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+18,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+18,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+18,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
+18,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
+18,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
+18,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
+18,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
+18,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
+18,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
+18,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
+18,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
+18,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
+18,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
+18,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
+18,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
+18,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
+18,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
+18,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
+18,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+18,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
+18,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
+18,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
+18,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
+//Bard
+19,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+19,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+19,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+19,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+19,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+19,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+19,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+19,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+19,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+19,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
+19,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
+19,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
+19,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
+19,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
+19,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
+19,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
+19,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
+19,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+19,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+19,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+19,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+19,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+19,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+19,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+19,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+19,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+19,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+19,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
+19,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Dancer
+20,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+20,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+20,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+20,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+20,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+20,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+20,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+20,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+20,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+20,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
+20,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
+20,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
+20,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
+20,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
+20,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
+20,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
+20,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
+20,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+20,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+20,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+20,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+20,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+20,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+20,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+20,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+20,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+20,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+20,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
+20,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Crusader(Peco)
+21,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+21,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+21,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+21,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+21,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+21,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+21,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+21,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+21,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+21,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+21,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+21,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+21,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+21,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+21,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+21,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+21,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+21,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+21,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+21,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+21,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+21,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+21,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+21,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+21,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+21,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+21,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+21,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+21,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+21,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+21,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+21,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//WeddingClass
+22,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+22,334,1,0,0,0,0,0,0,0,0,0,0 //WE_MALE#I Will Protect You#
+22,335,5,0,0,0,0,0,0,0,0,0,0 //WE_FEMALE#I Look up to You#
+22,336,5,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#I miss You#
+22,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//SuperNovice
+23,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+23,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+23,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+23,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+23,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+23,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+23,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+23,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+23,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+23,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+23,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+23,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+23,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+23,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+23,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+23,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+23,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+23,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+23,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+23,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+23,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+23,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+23,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+23,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+23,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+23,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+23,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+23,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+23,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+23,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+23,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+23,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+23,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+23,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+23,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+23,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+23,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+23,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+23,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+23,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+23,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+23,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+23,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+23,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+23,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+23,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+23,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+23,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+23,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+23,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+23,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+23,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Gunslinger
+24,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+24,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+24,500,5,0,0,0,0,0,0,0,0,0,0 //GS_GLITTERING#Flip the Coin#
+24,501,1,500,1,0,0,0,0,0,0,0,0 //GS_FLING#Fling#
+24,502,1,500,1,511,10,0,0,0,0,0,0 //GS_TRIPLEACTION#Triple Action#
+24,503,1,500,5,512,10,0,0,0,0,0,0 //GS_BULLSEYE#Bulls Eye#
+24,504,1,500,4,517,10,0,0,0,0,0,0 //GS_MADNESSCANCEL#Madness Canceler#
+24,505,1,500,4,513,5,0,0,0,0,0,0 //GS_ADJUSTMENT#AdJustment#
+24,506,1,500,2,510,10,0,0,0,0,0,0 //GS_INCREASING#Increasing Accuracy#
+24,507,1,500,1,0,0,0,0,0,0,0,0 //GS_MAGICALBULLET#Magical Bullet#
+24,508,1,500,1,0,0,0,0,0,0,0,0 //GS_CRACKER#Cracker#
+24,509,10,0,0,0,0,0,0,0,0,0,0 //GS_SINGLEACTION#Single Action#
+24,510,10,0,0,0,0,0,0,0,0,0,0 //GS_SNAKEEYE#Snake Eye#
+24,511,10,509,1,0,0,0,0,0,0,0,0 //GS_CHAINACTION#Chain Action#
+24,512,10,509,5,0,0,0,0,0,0,0,0 //GS_TRACKING#Tracking#
+24,513,5,512,7,0,0,0,0,0,0,0,0 //GS_DISARM#Disarm#
+24,514,5,512,5,0,0,0,0,0,0,0,0 //GS_PIERCINGSHOT#Piercing Shot#
+24,515,10,511,3,0,0,0,0,0,0,0,0 //GS_RAPIDSHOWER#Rapid Shower#
+24,516,10,515,5,0,0,0,0,0,0,0,0 //GS_DESPERADO#Desperado#
+24,517,10,515,7,516,5,0,0,0,0,0,0 //GS_GATLINGFEVER#Gatling Fever#
+24,518,10,509,5,0,0,0,0,0,0,0,0 //GS_DUST#Dust#
+24,519,10,518,3,0,0,0,0,0,0,0,0 //GS_FULLBUSTER#Full Buster#
+24,520,10,519,5,0,0,0,0,0,0,0,0 //GS_SPREADATTACK#Spread Attack#
+24,521,10,520,7,0,0,0,0,0,0,0,0 //GS_GROUNDDRIFT#Ground Drift#
+24,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Ninja
+25,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+25,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+25,522,10,0,0,0,0,0,0,0,0,0,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU#
+25,523,10,522,1,0,0,0,0,0,0,0,0 //NJ_SYURIKEN#NJ_SYURIKEN#
+25,524,5,523,5,0,0,0,0,0,0,0,0 //NJ_KUNAI#NJ_KUNAI#
+25,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA#
+25,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
+25,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
+25,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
+25,529,5,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
+25,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
+25,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
+25,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
+25,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU#
+25,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA#
+25,535,10,534,5,0,0,0,0,0,0,0,0 //NJ_KAENSIN#NJ_KAENSIN#
+25,536,5,533,10,535,7,0,0,0,0,0,0 //NJ_BAKUENRYU#NJ_BAKUENRYU#
+25,537,10,533,1,0,0,0,0,0,0,0,0 //NJ_HYOUSENSOU#NJ_HYOUSENSOU#
+25,538,10,537,5,0,0,0,0,0,0,0,0 //NJ_SUITON#NJ_SUITON#
+25,539,5,533,10,538,7,0,0,0,0,0,0 //NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
+25,540,10,533,1,0,0,0,0,0,0,0,0 //NJ_HUUJIN#NJ_HUUJIN#
+25,541,5,540,5,0,0,0,0,0,0,0,0 //NJ_RAIGEKISAI#NJ_RAIGEKISAI#
+25,542,5,533,10,541,5,0,0,0,0,0,0 //NJ_KAMAITACHI#NJ_KAMAITACHI#
+25,543,5,533,5,0,0,0,0,0,0,0,0 //NJ_NEN#NJ_NEN#
+25,544,10,522,7,530,5,543,1,0,0,0,0 //NJ_ISSEN#NJ_ISSEN#
+25,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//NoviceHigh
+4001,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4001,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4001,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
+4001,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//SwordmanHigh
+4002,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4002,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4002,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4002,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4002,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4002,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4002,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4002,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4002,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4002,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4002,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4002,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4002,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//MageHigh
+4003,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4003,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4003,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4003,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4003,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4003,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4003,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4003,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4003,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4003,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4003,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4003,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4003,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4003,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4003,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4003,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4003,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//ArcherHigh
+4004,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4004,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4004,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4004,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4004,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4004,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4004,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4004,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4004,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4004,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//AcolyteHigh
+4005,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4005,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4005,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4005,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4005,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4005,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4005,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4005,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4005,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4005,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4005,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4005,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4005,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4005,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4005,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4005,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4005,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4005,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//MerchantHigh
+4006,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4006,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4006,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4006,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4006,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4006,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4006,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4006,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4006,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4006,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4006,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4006,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4006,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//ThiefHigh
+4007,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4007,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4007,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4007,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4007,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4007,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4007,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4007,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4007,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4007,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4007,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4007,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4007,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//LordKnight
+4008,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4008,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4008,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4008,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4008,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4008,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4008,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4008,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4008,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4008,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4008,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4008,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4008,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4008,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+4008,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+4008,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+4008,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+4008,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+4008,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+4008,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+4008,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4008,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4008,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+4008,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade#
+4008,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
+4008,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
+4008,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
+4008,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //check this, the last ",0" shouldn't be needed I think
+4008,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
+4008,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
+4008,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#
+4008,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4008,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//HighPriest
+4009,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4009,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4009,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4009,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4009,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4009,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4009,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4009,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4009,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4009,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4009,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4009,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4009,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4009,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4009,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4009,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4009,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4009,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4009,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4009,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
+4009,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
+4009,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
+4009,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
+4009,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
+4009,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
+4009,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
+4009,71,4,72,1,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
+4009,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
+4009,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
+4009,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
+4009,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
+4009,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
+4009,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
+4009,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
+4009,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
+4009,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
+4009,361,5,33,1,9,3,66,3,0,0,0,0 //HP_ASSUMPTIO#Assumptio#
+4009,362,5,75,2,9,1,73,3,0,0,0,0 //HP_BASILICA#Basilica#
+4009,363,10,68,3,9,5,76,5,0,0,0,0 //HP_MEDITATIO#Meditatio#
+4009,481,5,65,10,23,10,0,0,0,0,0,0 //HP_MANARECHARGE#Mana Recharge#
+4009,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//HighWizard
+4010,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4010,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4010,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4010,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4010,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4010,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4010,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4010,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4010,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4010,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4010,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4010,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4010,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4010,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4010,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4010,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4010,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
+4010,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
+4010,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
+4010,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
+4010,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
+4010,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
+4010,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
+4010,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
+4010,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
+4010,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+4010,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+4010,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
+4010,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+4010,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
+4010,364,10,9,5,13,7,0,0,0,0,0,0 //HW_SOULDRAIN#Soul Drain#
+4010,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher#
+4010,366,10,0,0,0,0,0,0,0,0,0,0 //HW_MAGICPOWER#Mystical Amplification#
+4010,400,5,11,5,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#Napalm Vulcan#
+4010,483,1,93,1,87,1,0,0,0,0,0,0 //HW_GANBANTEIN#Ganbantein#
+4010,484,5,365,1,366,10,92,1,0,0,0,0 //HW_GRAVITATION#Gravitation#
+4010,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Whitesmith
+4011,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4011,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4011,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4011,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4011,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4011,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4011,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4011,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4011,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4011,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4011,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4011,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4011,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
+4011,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
+4011,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
+4011,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
+4011,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
+4011,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
+4011,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
+4011,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
+4011,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
+4011,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
+4011,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
+4011,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
+4011,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
+4011,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
+4011,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
+4011,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
+4011,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
+4011,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
+4011,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
+4011,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
+4011,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
+4011,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
+4011,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
+4011,384,10,109,3,105,1,107,5,113,3,0,0 //WS_MELTDOWN#Shattering Strike#
+//4011,385,3,109,5,94,5,96,3,97,2,0,0 //WS_CREATECOIN#Create Coins#
+//4011,386,3,97,3,106,1,107,5,0,0,0,0 //WS_CREATENUGGET#Create Nuggets#
+4011,387,1,39,5,153,1,154,1,105,1,0,0 //WS_CARTBOOST#Cart Boost#
+//4011,388,1,107,10,112,3,0,0,0,0,0,0 //WS_SYSTEMCREATE#Auto Attack System#
+4011,477,10,107,10,0,0,0,0,0,0,0,0 //WS_WEAPONREFINE#Upgrade Weapon#
+4011,485,10,42,10,110,5,387,1,0,0,0,0 //WS_CARTTERMINATION#Cart Termination#
+4011,486,5,113,5,0,0,0,0,0,0,0,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
+4011,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4011,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
+//Sniper
+4012,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4012,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4012,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4012,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4012,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4012,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4012,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4012,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4012,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4012,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
+4012,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
+4012,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
+4012,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
+4012,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
+4012,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
+4012,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
+4012,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
+4012,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
+4012,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+4012,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
+4012,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
+4012,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
+4012,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
+4012,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
+4012,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
+4012,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
+4012,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
+4012,380,10,43,10,44,10,45,10,127,1,0,0 //SN_SIGHT#Falcon Eyes#
+4012,381,5,128,3,44,5,129,5,127,1,0,0 //SN_FALCONASSAULT#Falcon Assault#
+4012,382,5,45,10,46,5,0,0,0,0,0,0 //SN_SHARPSHOOTING#Focused Arrow Strike#
+4012,383,10,45,9,0,0,0,0,0,0,0,0 //SN_WINDWALK#Wind Walker#
+4012,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4012,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
+//AssassinCross
+4013,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4013,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4013,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4013,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4013,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4013,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4013,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4013,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4013,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4013,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4013,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4013,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4013,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
+4013,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
+4013,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
+4013,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
+4013,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
+4013,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
+4013,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
+4013,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
+4013,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
+4013,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
+4013,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
+4013,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
+4013,376,5,48,5,134,7,0,0,0,0,0,0 //ASC_KATAR#Advanced Katar Mastery#
+4013,378,5,407,1,0,0,0,0,0,0,0,0 //ASC_EDP#Deadly Poison Enchantment#
+4013,379,10,48,5,135,3,138,6,52,5,0,0 //ASC_BREAKER#Soul Destroyer#
+4013,406,10,132,3,134,5,136,5,379,1,0,0 //ASC_METEORASSAULT#Meteor Assault#
+4013,407,1,52,10,53,1,138,5,0,0,0,0 //ASC_CDP#Create Deadly Poison#
+4013,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//LordKnight(Peco)
+4014,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4014,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4014,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4014,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4014,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4014,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4014,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4014,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4014,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4014,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4014,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4014,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4014,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4014,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+4014,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+4014,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+4014,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+4014,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+4014,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+4014,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+4014,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4014,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4014,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+4014,355,5,5,5,7,5,3,5,0,0,0,0 //LK_AURABLADE#Aura Blade#
+4014,356,10,3,10,6,5,60,3,0,0,0,0 //LK_PARRYING#Parrying#
+4014,357,5,4,1,55,5,63,1,0,0,0,0 //LK_CONCENTRATION#Concentration#
+4014,358,1,4,10,6,5,8,3,0,0,0,0 //LK_TENSIONRELAX#Relax#
+4014,359,1,50,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#Frenzy# //check this, the last ",0" shouldn't be needed I think
+4014,397,5,55,10,56,5,58,5,63,1,0,0 //LK_SPIRALPIERCE#Spiral Pierce#
+4014,398,5,55,9,63,1,0,0,0,0,0,0 //LK_HEADCRUSH#Traumatic Blow#
+4014,399,10,55,9,64,3,398,3,0,0,0,0 //LK_JOINTBEAT#Vital Strike#
+4014,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4014,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//Paladin
+4015,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4015,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4015,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4015,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4015,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4015,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4015,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4015,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4015,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4015,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4015,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4015,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4015,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4015,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4015,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4015,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4015,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4015,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4015,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+4015,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+4015,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+4015,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+4015,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+4015,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+4015,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+4015,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+4015,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+4015,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+4015,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+4015,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+4015,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+4015,367,5,8,5,248,5,250,2,0,0,0,0 //PA_PRESSURE#Gloria Domini#
+4015,368,5,8,1,248,5,255,3,0,0,0,0 //PA_SACRIFICE#Martyr's Reckoning#
+4015,369,10,248,8,22,3,23,5,0,0,0,0 //PA_GOSPEL#Battle Chant#
+4015,480,5,251,5,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN#Shield Chain#
+4015,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Champion
+4016,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4016,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4016,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4016,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4016,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4016,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4016,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4016,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4016,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4016,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4016,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4016,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4016,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4016,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4016,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4016,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4016,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4016,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
+4016,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
+4016,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
+4016,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
+4016,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
+4016,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
+4016,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
+4016,266,5,261,5,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
+4016,267,5,266,3,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
+4016,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
+4016,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
+4016,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
+4016,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
+4016,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
+4016,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
+4016,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
+4016,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
+4016,370,5,259,7,261,5,0,0,0,0,0,0 //CH_PALMSTRIKE#Raging Palm Strike#
+4016,371,5,259,5,263,5,261,5,273,3,0,0 //CH_TIGERFIST#Glacier Fist#
+4016,372,10,259,5,261,5,371,2,0,0,0,0 //CH_CHAINCRUSH#Chain Crush Combo#
+4016,401,1,261,5,262,1,270,5,0,0,0,0 //CH_SOULCOLLECT#Hyper Spirit Sphere#
+4016,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Professor
+4017,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4017,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4017,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4017,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4017,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4017,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4017,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4017,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4017,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4017,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4017,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4017,18,10,10,1,17,5,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4017,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4017,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4017,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4017,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+4017,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+4017,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+4017,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4017,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
+4017,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
+4017,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
+4017,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
+4017,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
+4017,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
+4017,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
+4017,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
+4017,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
+4017,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
+4017,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
+4017,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
+4017,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
+4017,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
+4017,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
+4017,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
+4017,290,10,279,5,288,1,289,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
+4017,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
+4017,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
+4017,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
+4017,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
+4017,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
+4017,373,5,9,1,276,1,0,0,0,0,0,0 //PF_HPCONVERSION#Indulge#
+4017,374,1,276,3,277,2,0,0,0,0,0,0 //PF_SOULCHANGE#Soul Exhale#
+4017,375,5,275,5,276,3,289,3,0,0,0,0 //PF_SOULBURN#Soul Siphon#
+4017,402,5,9,3,375,1,0,0,0,0,0,0 //PF_MINDBREAKER#Mind Breaker#
+4017,403,1,274,5,278,5,279,1,0,0,0,0 //PF_MEMORIZE#Foresight#
+4017,404,1,286,2,287,2,0,0,0,0,0,0 //PF_FOGWALL#Blinding Mist#
+4017,405,1,284,4,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#Fiber Lock#
+4017,482,5,279,1,0,0,0,0,0,0,0,0 //PF_DOUBLECASTING#Double Casting#
+4017,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Stalker
+4018,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4018,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4018,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4018,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4018,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4018,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4018,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4018,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4018,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4018,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4018,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4018,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4018,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4018,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4018,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4018,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+4018,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
+4018,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
+4018,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
+4018,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
+4018,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
+4018,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
+4018,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
+4018,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
+4018,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
+4018,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
+4018,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
+4018,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
+4018,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
+4018,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
+4018,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
+4018,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
+4018,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
+4018,389,5,51,5,213,3,0,0,0,0,0,0 //ST_CHASEWALK#Stealth#
+4018,390,5,215,1,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#Counter Instinct#
+4018,475,1,225,10,0,0,0,0,0,0,0,0 //ST_PRESERVE#Preserve#
+4018,476,5,215,5,216,5,217,5,218,5,0,0 //ST_FULLSTRIP#Divest All#
+4018,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Creator
+4019,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4019,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4019,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4019,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4019,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4019,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4019,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4019,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4019,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4019,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4019,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4019,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4019,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
+4019,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
+4019,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
+4019,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
+4019,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
+4019,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
+4019,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
+4019,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
+4019,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
+4019,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
+4019,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
+4019,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
+4019,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
+4019,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
+4019,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
+4019,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
+//4019,392,5,228,5,0,0,0,0,0,0,0,0 //CR_ALCHEMY#Alchemy#
+//4019,393,5,228,6,390,2,0,0,0,0,0,0 //CR_SYNTHESISPOTION#Potion Synthesis#
+4019,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion#
+4019,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection#
+4019,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration#
+4019,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation#
+4019,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+4019,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
+4019,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
+4019,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
+4019,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
+//Clown
+4020,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4020,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4020,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4020,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4020,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4020,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4020,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4020,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4020,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4020,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
+4020,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
+4020,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
+4020,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
+4020,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
+4020,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
+4020,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
+4020,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
+4020,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+4020,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+4020,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+4020,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+4020,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+4020,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+4020,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+4020,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+4020,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+4020,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+4020,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
+4020,394,10,47,5,316,1,0,0,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
+4020,395,5,45,5,315,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
+4020,396,1,45,5,315,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
+4020,487,5,315,10,396,1,0,0,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+4020,488,5,45,10,315,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
+4020,489,5,45,10,317,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
+4020,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Gypsy
+4021,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4021,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4021,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4021,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4021,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4021,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4021,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4021,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4021,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4021,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
+4021,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
+4021,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
+4021,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
+4021,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
+4021,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
+4021,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
+4021,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
+4021,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+4021,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+4021,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+4021,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+4021,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+4021,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+4021,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+4021,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+4021,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+4021,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+4021,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
+4021,394,10,47,5,324,1,0,0,0,0,0,0 //CG_ARROWVULCAN#Vulcan Arrow#
+4021,395,5,45,5,323,7,0,0,0,0,0,0 //CG_MOONLIT#Sheltering Bliss#
+4021,396,1,45,5,323,5,0,0,0,0,0,0 //CG_MARIONETTE#Marionette Control#
+4021,487,5,323,10,396,1,0,0,0,0,0,0 //CG_LONGINGFREEDOM#Longing for Freedom#
+4021,488,5,45,10,323,10,0,0,0,0,0,0 //CG_HERMODE#Wand of Hermod#
+4021,489,5,45,10,325,3,0,0,0,0,0,0 //CG_TAROTCARD#Tarot Card of Fate#
+4021,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Paladin(Peco)
+4022,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4022,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4022,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4022,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4022,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4022,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4022,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4022,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4022,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4022,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4022,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4022,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4022,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4022,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4022,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4022,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4022,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4022,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4022,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+4022,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+4022,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+4022,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+4022,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+4022,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+4022,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+4022,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+4022,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+4022,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+4022,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+4022,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+4022,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+4022,367,5,8,5,248,5,250,2,0,0,0,0 //PA_PRESSURE#Gloria Domini#
+4022,368,5,8,5,248,5,255,3,0,0,0,0 //PA_SACRIFICE#Martyr's Reckoning#
+4022,369,10,248,8,22,3,23,5,0,0,0,0 //PA_GOSPEL#Battle Chant#
+4022,480,5,251,5,0,0,0,0,0,0,0,0 //PA_SHIELDCHAIN#Shield Chain#
+4022,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Baby (Novice)
+4023,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4023,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4023,143,1,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#Act Dead#
+4023,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4023,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Swordman
+4024,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4024,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4024,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4024,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4024,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4024,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4024,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4024,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4024,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4024,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4024,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4024,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4024,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4024,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Magician
+4025,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4025,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4025,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4025,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4025,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4025,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4025,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4025,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4025,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4025,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4025,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4025,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4025,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4025,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4025,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4025,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4025,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4025,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Archer
+4026,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4026,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4026,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4026,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4026,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4026,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4026,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4026,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4026,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4026,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4026,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Acolyte
+4027,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4027,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4027,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4027,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4027,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4027,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4027,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4027,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4027,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4027,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4027,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4027,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4027,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4027,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4027,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4027,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4027,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4027,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4027,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Merchant
+4028,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4028,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4028,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4028,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4028,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4028,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4028,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4028,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4028,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4028,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4028,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4028,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4028,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4028,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Thief
+4029,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4029,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4029,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4029,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4029,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4029,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4029,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4029,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4029,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4029,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4029,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4029,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4029,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4029,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Baby Knight
+4030,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4030,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4030,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4030,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4030,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4030,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4030,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4030,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4030,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4030,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4030,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4030,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4030,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4030,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4030,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4030,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+4030,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+4030,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+4030,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+4030,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+4030,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+4030,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+4030,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4030,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4030,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+4030,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//Baby Priest
+4031,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4031,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4031,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4031,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4031,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4031,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4031,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4031,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4031,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4031,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4031,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4031,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4031,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4031,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4031,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4031,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4031,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4031,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4031,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4031,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4031,12,10,68,4,70,3,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4031,54,4,72,1,9,4,0,0,0,0,0,0 //ALL_RESURRECTION#Resurrection#
+4031,65,10,0,0,0,0,0,0,0,0,0,0 //PR_MACEMASTERY#Mace Mastery#
+4031,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus#
+4031,67,3,66,2,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#Suffragium#
+4031,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio#
+4031,69,5,75,3,68,5,0,0,0,0,0,0 //PR_BENEDICTIO#B.S Sacramenti#
+4031,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary#
+4031,71,4,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#Slow Poison#
+4031,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery#
+4031,73,10,33,2,0,0,0,0,0,0,0,0 //PR_KYRIE#Kyrie Eleison#
+4031,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat#
+4031,75,5,73,4,74,3,0,0,0,0,0,0 //PR_GLORIA#Gloria#
+4031,76,10,24,1,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#Lex Divina#
+4031,77,10,54,1,76,3,0,0,0,0,0,0 //PR_TURNUNDEAD#Turn Undead#
+4031,78,1,76,5,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#Lex Aeterna#
+4031,79,10,12,1,78,1,77,3,0,0,0,0 //PR_MAGNUS#Magnus Exorcismus#
+4031,1014,1,0,0,0,0,0,0,0,0,0,0 //PR_REDEMPTIO#Redemptio#
+//Baby Wizard
+4032,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4032,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4032,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4032,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4032,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4032,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4032,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4032,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4032,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4032,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4032,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4032,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4032,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4032,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4032,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4032,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4032,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4032,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4032,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar#
+4032,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher#
+4032,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm#
+4032,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder#
+4032,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion#
+4032,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball#
+4032,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall#
+4032,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova#
+4032,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust#
+4032,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+4032,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+4032,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire#
+4032,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+4032,1006,1,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTBLASTER#Sight Blaster#
+//Baby Blacksmith
+4033,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4033,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4033,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4033,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4033,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4033,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4033,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4033,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4033,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4033,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4033,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4033,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4033,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4033,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4033,94,5,0,0,0,0,0,0,0,0,0,0 //BS_IRON#Iron Tempering#
+4033,95,5,94,1,0,0,0,0,0,0,0,0 //BS_STEEL#Steel Tempering#
+4033,96,5,94,1,0,0,0,0,0,0,0,0 //BS_ENCHANTEDSTONE#Enchanted Stone Craft#
+4033,97,5,96,1,0,0,0,0,0,0,0,0 //BS_ORIDEOCON#Oridecon Research#
+4033,98,3,0,0,0,0,0,0,0,0,0,0 //BS_DAGGER#Smith Dagger#
+4033,99,3,98,1,0,0,0,0,0,0,0,0 //BS_SWORD#Smith Sword#
+4033,100,3,99,1,0,0,0,0,0,0,0,0 //BS_TWOHANDSWORD#Smith Two-handed Sword#
+4033,101,3,99,2,0,0,0,0,0,0,0,0 //BS_AXE#Smith Axe#
+4033,102,3,103,1,0,0,0,0,0,0,0,0 //BS_MACE#Smith Mace#
+4033,103,3,98,1,0,0,0,0,0,0,0,0 //BS_KNUCKLE#Smith Knucklebrace#
+4033,104,3,98,2,0,0,0,0,0,0,0,0 //BS_SPEAR#Smith Spear#
+4033,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding#
+4033,106,1,95,1,105,1,0,0,0,0,0,0 //BS_FINDINGORE#Ore Discovery#
+4033,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research#
+4033,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair#
+4033,109,5,0,0,0,0,0,0,0,0,0,0 //BS_SKINTEMPER#Skin Tempering#
+4033,110,5,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#Hammer Fall#
+4033,111,5,110,2,0,0,0,0,0,0,0,0 //BS_ADRENALINE#Adrenaline Rush#
+4033,112,5,107,2,111,2,0,0,0,0,0,0 //BS_WEAPONPERFECT#Weapon Perfection#
+4033,113,5,111,3,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#Power-Thrust#
+4033,114,5,112,3,113,2,0,0,0,0,0,0 //BS_MAXIMIZE#Maximize Power#
+4033,1012,1,0,0,0,0,0,0,0,0,0,0 //BS_UNFAIRLYTRICK#Unfair Trick#
+4033,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
+4033,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
+//Baby Hunter
+4034,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4034,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4034,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4034,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4034,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4034,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4034,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4034,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4034,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4034,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4034,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4034,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap#
+4034,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine#
+4034,117,5,115,1,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#Ankle Snare#
+4034,118,5,117,1,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#Shockwave Trap#
+4034,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman#
+4034,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher#
+4034,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap#
+4034,122,5,116,1,119,1,121,1,0,0,0,0 //HT_BLASTMINE#Blast Mine#
+4034,123,5,118,1,122,1,0,0,0,0,0,0 //HT_CLAYMORETRAP#Claymore Trap#
+4034,124,1,116,1,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+4034,125,1,118,1,124,1,0,0,0,0,0,0 //HT_TALKIEBOX#Talkie Box#
+4034,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane#
+4034,127,1,126,1,0,0,0,0,0,0,0,0 //HT_FALCON#Falconry Mastery#
+4034,128,10,129,5,0,0,0,0,0,0,0,0 //HT_STEELCROW#Steel Crow#
+4034,129,5,127,1,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#Blitz Beat#
+4034,130,4,45,1,127,1,0,0,0,0,0,0 //HT_DETECTING#Detect#
+4034,131,5,124,1,127,1,0,0,0,0,0,0 //HT_SPRINGTRAP#Spring Trap#
+4034,1009,1,0,0,0,0,0,0,0,0,0,0 //HT_PHANTASMIC#Phantasmic Arrow#
+4034,499,1,46,10,0,0,0,0,0,0,0,0 //HT_POWER#Beast Strafing#
+//Baby Assassin
+4035,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4035,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4035,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4035,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4035,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4035,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4035,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4035,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4035,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4035,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4035,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4035,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4035,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4035,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4035,132,5,0,0,0,0,0,0,0,0,0,0 //AS_RIGHT#Righthand Mastery#
+4035,133,5,132,2,0,0,0,0,0,0,0,0 //AS_LEFT#Lefthand Mastery#
+4035,134,10,0,0,0,0,0,0,0,0,0,0 //AS_KATAR#Katar Mastery#
+4035,135,10,51,2,0,0,0,0,0,0,0,0 //AS_CLOAKING#Cloaking#
+4035,136,10,134,4,0,0,0,0,0,0,0,0 //AS_SONICBLOW#Sonic Blow#
+4035,137,5,135,2,136,5,0,0,0,0,0,0 //AS_GRIMTOOTH#Grimtooth#
+4035,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison#
+4035,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React#
+4035,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust#
+4035,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher#
+4035,1003,1,0,0,0,0,0,0,0,0,0,0 //AS_SONICACCEL#Sonic Acceleration#
+4035,1004,1,0,0,0,0,0,0,0,0,0,0 //AS_VENOMKNIFE#Throw Venom Knife#
+//Baby Knight(Peco)
+4036,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4036,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4036,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4036,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4036,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4036,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4036,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4036,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4036,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4036,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4036,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4036,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4036,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4036,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4036,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4036,56,10,55,1,0,0,0,0,0,0,0,0 //KN_PIERCE#Pierce#
+4036,57,10,63,1,58,3,0,0,0,0,0,0 //KN_BRANDISHSPEAR#Brandish Spear#
+4036,58,10,56,5,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#Spear Stab#
+4036,59,5,56,3,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#Spear Boomerang#
+4036,60,10,3,1,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#Twohand Quicken#
+4036,61,5,3,1,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#Counter Attack#
+4036,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH#Bowling Bash#
+4036,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4036,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4036,1001,1,0,0,0,0,0,0,0,0,0,0 //KN_CHARGEATK#Charge Attack#
+4036,495,1,60,10,0,0,0,0,0,0,0,0 //KN_ONEHAND#Onehand Quicken#
+//Baby Crusader
+4037,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4037,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4037,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4037,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4037,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4037,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4037,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4037,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4037,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4037,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4037,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4037,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4037,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4037,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4037,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4037,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4037,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4037,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4037,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4037,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4037,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+4037,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+4037,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+4037,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+4037,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+4037,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+4037,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+4037,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+4037,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+4037,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+4037,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+4037,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+4037,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+//Baby Monk
+4038,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4038,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4038,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4038,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4038,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4038,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4038,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4038,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4038,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4038,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4038,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4038,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4038,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4038,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4038,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4038,35,1,28,2,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4038,156,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#Holy Light#
+4038,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4038,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4038,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists#
+4038,260,5,269,2,0,0,0,0,0,0,0,0 //MO_SPIRITSRECOVERY#Spiritual Cadence#
+4038,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere#
+4038,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere#
+4038,263,10,265,5,0,0,0,0,0,0,0,0 //MO_TRIPLEATTACK#Raging Triple Blow#
+4038,264,1,271,3,260,2,268,3,0,0,0,0 //MO_BODYRELOCATION#Snap#
+4038,265,10,259,5,261,5,0,0,0,0,0,0 //MO_DODGE#Dodge#
+4038,266,5,261,5,0,0,0,0,0,0,0,0 //MO_INVESTIGATE#Occult Impact#
+4038,267,5,266,3,0,0,0,0,0,0,0,0 //MO_FINGEROFFENSIVE#Throw Spirit Sphere#
+4038,268,5,273,3,0,0,0,0,0,0,0,0 //MO_STEELBODY#Mental Strength#
+4038,269,5,265,5,0,0,0,0,0,0,0,0 //MO_BLADESTOP#Root#
+4038,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury#
+4038,271,5,270,3,267,3,0,0,0,0,0,0 //MO_EXTREMITYFIST#Asura Strike#
+4038,272,5,263,5,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#Raging Quadruple Blow#
+4038,273,5,272,3,0,0,0,0,0,0,0,0 //MO_COMBOFINISH#Raging Thrust#
+4038,1015,1,0,0,0,0,0,0,0,0,0,0 //MO_KITRANSLATION#Ki Translation#
+4038,1016,1,0,0,0,0,0,0,0,0,0,0 //MO_BALKYOUNG#Ki Explosion#
+//Baby Sage
+4039,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4039,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4039,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4039,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4039,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4039,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4039,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4039,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4039,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4039,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4039,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4039,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4039,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4039,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4039,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4039,157,1,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#Energy Coat#
+4039,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4039,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4039,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense#
+4039,90,5,283,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike#
+4039,91,5,90,1,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive#
+4039,274,10,0,0,0,0,0,0,0,0,0,0 //SA_ADVANCEDBOOK#Study#
+4039,275,5,274,2,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#Cast Cancel#
+4039,276,5,274,4,0,0,0,0,0,0,0,0 //SA_MAGICROD#Magic Rod#
+4039,277,5,276,1,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#Spell Break#
+4039,278,10,275,1,0,0,0,0,0,0,0,0 //SA_FREECAST#Free Cast#
+4039,279,10,278,4,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#Hindsight#
+4039,280,5,19,1,274,5,0,0,0,0,0,0 //SA_FLAMELAUNCHER#Endow Blaze#
+4039,281,5,14,1,274,5,0,0,0,0,0,0 //SA_FROSTWEAPON#Endow Tsunami#
+4039,282,5,20,1,274,5,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#Endow Tornado#
+4039,283,5,16,1,274,5,0,0,0,0,0,0 //SA_SEISMICWEAPON#Endow Quake#
+4039,284,5,274,9,0,0,0,0,0,0,0,0 //SA_DRAGONOLOGY#Dragonology#
+4039,285,5,280,2,0,0,0,0,0,0,0,0 //SA_VOLCANO#Volcano#
+4039,286,5,281,2,0,0,0,0,0,0,0,0 //SA_DELUGE#Deluge#
+4039,287,5,282,2,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#Whirlwind#
+4039,288,5,285,3,286,3,287,3,0,0,0,0 //SA_LANDPROTECTOR#Magnetic Earth#
+4039,289,5,277,3,0,0,0,0,0,0,0,0 //SA_DISPELL#Dispel#
+4039,290,10,279,5,289,1,288,1,0,0,0,0 //SA_ABRACADABRA#Hocus-pocus#
+4039,1007,1,0,0,0,0,0,0,0,0,0,0 //SA_CREATECON#Create Converter#
+4039,1008,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWATER#Elemental Change Water#
+4039,1017,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTGROUND#Elemental Change Earth#
+4039,1018,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE#Elemental Change Fire#
+4039,1019,1,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND#Elemental Change Wind#
+//Baby Rogue
+4040,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4040,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4040,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4040,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4040,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4040,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4040,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4040,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4040,149,1,0,0,0,0,0,0,0,0,0,0 //TF_SPRINKLESAND#Throw Sand#
+4040,150,1,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#Back Sliding#
+4040,151,1,0,0,0,0,0,0,0,0,0,0 //TF_PICKSTONE#Find Stone#
+4040,152,1,0,0,0,0,0,0,0,0,0,0 //TF_THROWSTONE#Stone Fling#
+4040,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4040,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4040,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4040,44,10,0,0,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4040,46,10,44,10,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4040,124,1,46,5,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#Remove Trap#
+4040,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank#
+4040,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug#
+4040,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab#
+4040,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk#
+4040,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid#
+4040,215,5,217,5,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#Divest Weapon#
+4040,216,5,218,5,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#Divest Shield#
+4040,217,5,216,5,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#Divest Armor#
+4040,218,5,211,2,0,0,0,0,0,0,0,0 //RG_STRIPHELM#Divest Helm#
+4040,219,5,212,4,214,5,0,0,0,0,0,0 //RG_INTIMIDATE#Snatch#
+4040,220,1,221,5,0,0,0,0,0,0,0,0 //RG_GRAFFITI#Scribble#
+4040,221,5,222,1,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#Piece#
+4040,222,1,223,1,0,0,0,0,0,0,0,0 //RG_CLEANER#Remover#
+4040,223,1,216,3,0,0,0,0,0,0,0,0 //RG_GANGSTER#Slyness#
+4040,224,5,223,1,0,0,0,0,0,0,0,0 //RG_COMPULSION#Haggle#
+4040,225,10,219,5,0,0,0,0,0,0,0,0 //RG_PLAGIARISM#Intimidate#
+4040,1005,1,0,0,0,0,0,0,0,0,0,0 //RG_CLOSECONFINE#Close Confine#
+//Baby Alchemist
+4041,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4041,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4041,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4041,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4041,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4041,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4041,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4041,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4041,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4041,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
+4041,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
+4041,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
+4041,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4041,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4041,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery#
+4041,227,10,0,0,0,0,0,0,0,0,0,0 //AM_LEARNINGPOTION#Potion Research#
+4041,228,10,227,5,0,0,0,0,0,0,0,0 //AM_PHARMACY#Prepare Potion#
+4041,229,5,228,4,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#Bomb#
+4041,230,5,228,5,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#Acid Terror#
+4041,231,5,228,3,0,0,0,0,0,0,0,0 //AM_POTIONPITCHER#Aid Potion#
+4041,232,5,228,6,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#Summon Flora#
+4041,233,5,228,2,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#Summon Marine Sphere#
+4041,234,5,236,3,0,0,0,0,0,0,0,0 //AM_CP_WEAPON#Alchemical Weapon#
+4041,235,5,237,3,0,0,0,0,0,0,0,0 //AM_CP_SHIELD#Synthesized Shield#
+4041,236,5,235,3,0,0,0,0,0,0,0,0 //AM_CP_ARMOR#Synthetic Armor#
+4041,237,5,228,2,0,0,0,0,0,0,0,0 //AM_CP_HELM#Biochemical Helm#
+4041,238,1,0,0,0,0,0,0,0,0,0,0 //AM_BIOETHICS#Basis of Life#
+4041,243,1,244,1,0,0,0,0,0,0,0,0 //AM_CALLHOMUN#Call Homunculus#
+4041,244,1,238,1,0,0,0,0,0,0,0,0 //AM_REST#Peaceful Rest#
+4041,247,5,243,1,0,0,0,0,0,0,0,0 //AM_RESURRECTHOMUN#Ressurect Homunculus#
+4041,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher#
+4041,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1#
+4041,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
+4041,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
+//Baby Bard
+4042,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4042,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4042,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4042,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4042,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4042,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4042,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4042,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4042,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4042,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4042,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4042,315,10,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALLESSON#Music Lesson#
+4042,316,5,315,3,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#Melody Strike#
+4042,317,5,315,1,304,1,0,0,0,0,0,0 //BA_DISSONANCE#Unchained Serenade#
+4042,318,5,305,1,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#Unbarring Octave#
+4042,319,10,317,3,0,0,0,0,0,0,0,0 //BA_WHISTLE#Perfect Tablature#
+4042,320,10,317,3,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#Impressive Riff#
+4042,321,10,317,3,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#Magic Strings#
+4042,322,10,317,3,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#Song of Lutie#
+4042,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+4042,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+4042,306,1,319,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+4042,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+4042,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+4042,309,5,322,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+4042,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+4042,311,1,320,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+4042,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+4042,313,5,321,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+4042,1010,1,0,0,0,0,0,0,0,0,0,0 //BA_PANGVOICE#Pang Voice#
+//Baby Dancer
+4043,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4043,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4043,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4043,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4043,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4043,46,10,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#Double Strafe#
+4043,47,10,46,5,0,0,0,0,0,0,0,0 //AC_SHOWER#Arrow Shower#
+4043,147,1,0,0,0,0,0,0,0,0,0,0 //AC_MAKINGARROW#Arrow Crafting#
+4043,148,1,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#Arrow Repel#
+4043,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4043,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4043,323,10,0,0,0,0,0,0,0,0,0,0 //DC_DANCINGLESSON#Dance Lessons#
+4043,324,5,323,3,0,0,0,0,0,0,0,0 //DC_THROWARROW#Slinging Arrow#
+4043,325,5,323,1,304,1,0,0,0,0,0,0 //DC_UGLYDANCE#Hip Shaker#
+4043,326,5,305,1,0,0,0,0,0,0,0,0 //DC_SCREAM#Dazzler#
+4043,327,10,325,3,0,0,0,0,0,0,0,0 //DC_HUMMING#Focus Ballet#
+4043,328,10,325,3,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#Slow Grace#
+4043,329,10,325,3,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#Lady Luck#
+4043,330,10,325,3,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#Gypsy's Kiss#
+4043,304,1,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#Amp#
+4043,305,1,304,1,0,0,0,0,0,0,0,0 //BD_ENCORE#Encore#
+4043,306,1,327,10,0,0,0,0,0,0,0,0 //BD_LULLABY#Lullaby#
+4043,307,5,313,3,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#Mental Sensing#
+4043,308,1,311,1,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#Down Tempo#
+4043,309,5,330,10,0,0,0,0,0,0,0,0 //BD_DRUMBATTLEFIELD#Battle Theme#
+4043,310,5,309,3,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#Harmonic Lick#
+4043,311,1,328,10,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#Classical Pluck#
+4043,312,1,306,1,0,0,0,0,0,0,0,0 //BD_INTOABYSS#Power Chord#
+4043,313,5,329,10,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#Acoustic Rhythm#
+4043,1011,1,0,0,0,0,0,0,0,0,0,0 //DC_WINKCHARM#Wink of Charm#
+//Baby Crusader(Peco)
+4044,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4044,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4044,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4044,3,10,2,1,0,0,0,0,0,0,0,0 //SM_TWOHAND#Two-Handed Sword Mastery#
+4044,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4044,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4044,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4044,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4044,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4044,144,1,0,0,0,0,0,0,0,0,0,0 //SM_MOVINGRECOVERY#Moving HP-Recovery#
+4044,145,1,0,0,0,0,0,0,0,0,0,0 //SM_FATALBLOW#Attack Weak Point#
+4044,146,1,0,0,0,0,0,0,0,0,0,0 //SM_AUTOBERSERK#Auto Berserk#
+4044,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4044,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+4044,63,1,8,1,0,0,0,0,0,0,0,0 //KN_RIDING#Peco Peco Riding#
+4044,64,5,63,1,0,0,0,0,0,0,0,0 //KN_CAVALIERMASTERY#Cavalier Mastery#
+4044,55,10,0,0,0,0,0,0,0,0,0,0 //KN_SPEARMASTERY#Spear Mastery#
+4044,35,1,248,5,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4044,22,10,35,1,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4044,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4044,28,10,23,5,248,10,0,0,0,0,0,0 //AL_HEAL#Heal#
+4044,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith#
+4044,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard#
+4044,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite#
+4044,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang#
+4044,252,10,251,3,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#Shield Reflect#
+4044,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross#
+4044,254,10,253,6,248,10,0,0,0,0,0,0 //CR_GRANDCROSS#Grand Cross#
+4044,255,5,252,5,254,4,0,0,0,0,0,0 //CR_DEVOTION#Sacrifice#
+4044,256,5,22,5,28,5,0,0,0,0,0,0 //CR_PROVIDENCE#Resistant Souls#
+4044,257,5,251,1,0,0,0,0,0,0,0,0 //CR_DEFENDER#Defending Aura#
+4044,258,10,55,10,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#Spear Quicken#
+4044,1002,1,0,0,0,0,0,0,0,0,0,0 //CR_SHRINK#Shrink#
+//Super Baby
+4045,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4045,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4045,2,10,0,0,0,0,0,0,0,0,0,0 //SM_SWORD#Sword Mastery#
+4045,4,10,0,0,0,0,0,0,0,0,0,0 //SM_RECOVERY#Increase HP Recovery#
+4045,5,10,0,0,0,0,0,0,0,0,0,0 //SM_BASH#Bash#
+4045,6,10,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#Provoke#
+4045,7,10,5,5,0,0,0,0,0,0,0,0 //SM_MAGNUM#Magnum Break#
+4045,8,10,6,5,0,0,0,0,0,0,0,0 //SM_ENDURE#Endure#
+4045,9,10,0,0,0,0,0,0,0,0,0,0 //MG_SRECOVERY#Increase SP Recovery#
+4045,10,1,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#Sight#
+4045,11,10,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#Napalm Beat#
+4045,12,10,11,7,13,5,0,0,0,0,0,0 //MG_SAFETYWALL#Safety Wall#
+4045,13,10,11,4,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#Soul Strike#
+4045,14,10,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#Cold Bolt#
+4045,15,10,14,5,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#Frost Diver#
+4045,16,10,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#Stone Curse#
+4045,17,10,19,4,0,0,0,0,0,0,0,0 //MG_FIREBALL#Fire Ball#
+4045,18,10,17,5,10,1,0,0,0,0,0,0 //MG_FIREWALL#Fire Wall#
+4045,19,10,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#Fire Bolt#
+4045,20,10,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#Lightning Bolt#
+4045,21,10,20,4,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#Thunderstorm#
+4045,22,10,0,0,0,0,0,0,0,0,0,0 //AL_DP#Divine Protection#
+4045,23,10,22,3,0,0,0,0,0,0,0,0 //AL_DEMONBANE#Demon Bane#
+4045,24,1,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#Ruwach#
+4045,25,1,27,4,0,0,0,0,0,0,0,0 //AL_PNEUMA#Pneuma#
+4045,26,2,24,1,0,0,0,0,0,0,0,0 //AL_TELEPORT#Teleport#
+4045,27,4,26,2,0,0,0,0,0,0,0,0 //AL_WARP#Warp Portal#
+4045,28,10,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#Heal#
+4045,29,10,28,3,0,0,0,0,0,0,0,0 //AL_INCAGI#Increase AGI#
+4045,30,10,29,1,0,0,0,0,0,0,0,0 //AL_DECAGI#Decrease AGI#
+4045,31,1,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#Aqua Benedicta#
+4045,32,10,23,3,0,0,0,0,0,0,0,0 //AL_CRUCIS#Signum Crusis#
+4045,33,10,22,3,0,0,0,0,0,0,0,0 //AL_ANGELUS#Angelus#
+4045,34,10,22,5,0,0,0,0,0,0,0,0 //AL_BLESSING#Blessing#
+4045,35,1,0,0,0,0,0,0,0,0,0,0 //AL_CURE#Cure#
+4045,36,10,0,0,0,0,0,0,0,0,0,0 //MC_INCCARRY#Enlarge Weight Limit#
+4045,37,10,36,3,0,0,0,0,0,0,0,0 //MC_DISCOUNT#Discount#
+4045,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
+4045,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
+4045,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
+4045,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4045,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
+4045,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
+4045,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
+4045,45,10,44,1,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#Improve Concentration#
+4045,48,10,0,0,0,0,0,0,0,0,0,0 //TF_DOUBLE#Double Attack#
+4045,49,10,0,0,0,0,0,0,0,0,0,0 //TF_MISS#Improve Dodge#
+4045,50,10,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#Steal#
+4045,51,10,50,5,0,0,0,0,0,0,0,0 //TF_HIDING#Hiding#
+4045,52,10,0,0,0,0,0,0,0,0,0,0 //TF_POISON#Envenom#
+4045,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
+4045,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
+4045,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
+//Taekwon
+4046,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4046,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4046,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
+4046,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
+4046,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
+4046,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
+4046,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
+4046,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
+4046,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
+4046,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
+4046,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
+4046,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
+4046,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
+4046,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
+4046,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
+4046,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
+4046,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
+4046,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
+4046,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
+4046,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Star Gladiator
+4047,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4047,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4047,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
+4047,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
+4047,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
+4047,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
+4047,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
+4047,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
+4047,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
+4047,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
+4047,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
+4047,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
+4047,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
+4047,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
+4047,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
+4047,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
+4047,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
+4047,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
+4047,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
+4047,427,3,0,0,0,0,0,0,0,0,0,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
+4047,428,3,427,1,0,0,0,0,0,0,0,0 //SG_SUN_WARM#Warmth of the Sun#
+4047,429,3,427,2,0,0,0,0,0,0,0,0 //SG_MOON_WARM#Warmth of the Moon#
+4047,430,3,427,3,0,0,0,0,0,0,0,0 //SG_STAR_WARM#Warmth of the Star#
+4047,431,4,427,1,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT#Comfort of the Sun#
+4047,432,4,427,2,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT#Comfort of the Moon#
+4047,433,4,427,3,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT#Comfort of the Star#
+4047,434,3,0,0,0,0,0,0,0,0,0,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
+4047,435,3,434,1,0,0,0,0,0,0,0,0 //SG_SUN_ANGER#Sun's Wrath#
+4047,436,3,434,2,0,0,0,0,0,0,0,0 //SG_MOON_ANGER#Moon's Wrath#
+4047,437,3,434,3,0,0,0,0,0,0,0,0 //SG_STAR_ANGER#Stars's Wrath#
+4047,438,5,427,1,434,1,0,0,0,0,0,0 //SG_SUN_BLESS#Blessing of the Sun#
+4047,439,5,427,2,434,2,0,0,0,0,0,0 //SG_MOON_BLESS#Blessing of the Moon#
+4047,440,5,427,3,434,3,0,0,0,0,0,0 //SG_STAR_BLESS#Blessing of the Star#
+4047,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
+4047,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
+4047,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
+4047,444,1,443,9,0,0,0,0,0,0,0,0
+//SG_FUSION#Union of the Sun, Moon and Stars#
+4047,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Star Gladiator (Flying)
+4048,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4048,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4048,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
+4048,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
+4048,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
+4048,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
+4048,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
+4048,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
+4048,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
+4048,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
+4048,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
+4048,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
+4048,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
+4048,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
+4048,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
+4048,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
+4048,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
+4048,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
+4048,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
+4048,427,3,0,0,0,0,0,0,0,0,0,0 //SG_FEEL#Feeling the Sun, Moon and Stars#
+4048,428,3,427,1,0,0,0,0,0,0,0,0 //SG_SUN_WARM#Warmth of the Sun#
+4048,429,3,427,2,0,0,0,0,0,0,0,0 //SG_MOON_WARM#Warmth of the Moon#
+4048,430,3,427,3,0,0,0,0,0,0,0,0 //SG_STAR_WARM#Warmth of the Star#
+4048,431,4,427,1,0,0,0,0,0,0,0,0 //SG_SUN_COMFORT#Comfort of the Sun#
+4048,432,4,427,2,0,0,0,0,0,0,0,0 //SG_MOON_COMFORT#Comfort of the Moon#
+4048,433,4,427,3,0,0,0,0,0,0,0,0 //SG_STAR_COMFORT#Comfort of the Star#
+4048,434,3,0,0,0,0,0,0,0,0,0,0 //SG_HATE#Hatred of the Sun, Moon and Stars#
+4048,435,3,434,1,0,0,0,0,0,0,0,0 //SG_SUN_ANGER#Sun's Wrath#
+4048,436,3,434,2,0,0,0,0,0,0,0,0 //SG_MOON_ANGER#Moon's Wrath#
+4048,437,3,434,3,0,0,0,0,0,0,0,0 //SG_STAR_ANGER#Stars's Wrath#
+4048,438,5,427,1,434,1,0,0,0,0,0,0 //SG_SUN_BLESS#Blessing of the Sun#
+4048,439,5,427,2,434,2,0,0,0,0,0,0 //SG_MOON_BLESS#Blessing of the Moon#
+4048,440,5,427,3,434,3,0,0,0,0,0,0 //SG_STAR_BLESS#Blessing of the Star#
+4048,441,10,0,0,0,0,0,0,0,0,0,0 //SG_DEVIL#Demon of the Sun, Moon and Stars#
+4048,442,3,0,0,0,0,0,0,0,0,0,0 //SG_FRIEND#Friend of the Sun, Moon and Stars#
+4048,443,10,0,0,0,0,0,0,0,0,0,0 //SG_KNOWLEDGE#Knowledge of the Sun, Moon and Stars#
+4048,444,1,443,9,0,0,0,0,0,0,0,0
+//SG_FUSION#Union of the Sun, Moon and Stars#
+4048,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
+//Soul Linker
+4049,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
+4049,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
+4049,411,10,0,0,0,0,0,0,0,0,0,0 //TK_RUN#Running#
+4049,412,1,413,1,0,0,0,0,0,0,0,0 //TK_READYSTORM#Prepare Whirlwind#
+4049,413,7,0,0,0,0,0,0,0,0,0,0 //TK_STORMKICK#Whirlwind Kick#
+4049,414,1,415,1,0,0,0,0,0,0,0,0 //TK_READYDOWN#Prepare Axe Kick#
+4049,415,7,0,0,0,0,0,0,0,0,0,0 //TK_DOWNKICK#Axe Kick#
+4049,416,1,417,1,0,0,0,0,0,0,0,0 //TK_READYTURN#Prepare Round Kick#
+4049,417,7,0,0,0,0,0,0,0,0,0,0 //TK_TURNKICK#Round Kick#
+4049,418,1,419,1,0,0,0,0,0,0,0,0 //TK_READYCOUNTER#Prepare Counter Kick#
+4049,419,7,0,0,0,0,0,0,0,0,0,0 //TK_COUNTER#Counter Kick#
+4049,420,1,421,7,0,0,0,0,0,0,0,0 //TK_DODGE#Break Fall#
+4049,421,7,0,0,0,0,0,0,0,0,0,0 //TK_JUMPKICK#Flying Side Kick#
+4049,422,10,0,0,0,0,0,0,0,0,0,0 //TK_HPTIME#Peacefull Rest#
+4049,423,10,0,0,0,0,0,0,0,0,0,0 //TK_SPTIME#Enjoyable Rest#
+4049,424,5,0,0,0,0,0,0,0,0,0,0 //TK_POWER#Fighting Chant#
+4049,425,7,422,5,423,5,424,5,0,0,0,0 //TK_SEVENWIND#Warm Wind#
+4049,426,5,0,0,0,0,0,0,0,0,0,0 //TK_HIGHJUMP#High Jump#
+4049,493,1,424,5,0,0,0,0,0,0,0,0 //TK_MISSION#Taekwon Mission#
+4049,445,5,0,0,0,0,0,0,0,0,0,0 //SL_ALCHEMIST#Spirit of the Alchemist#
+4049,447,5,0,0,0,0,0,0,0,0,0,0 //SL_MONK#Spirit of the Monk#
+4049,448,5,0,0,0,0,0,0,0,0,0,0 //SL_STAR#Spirit of the Star Knight#
+4049,449,5,0,0,0,0,0,0,0,0,0,0 //SL_SAGE#Spirit of the Professor#
+4049,450,5,0,0,0,0,0,0,0,0,0,0 //SL_CRUSADER#Spirit of the Crusader#
+4049,451,5,0,0,0,0,0,0,0,0,0,0 //SL_SUPERNOVICE#Spirit of the Supernovice#
+4049,452,5,450,1,0,0,0,0,0,0,0,0 //SL_KNIGHT#Spirit of the Knight#
+4049,453,5,449,1,0,0,0,0,0,0,0,0 //SL_WIZARD#Spirit of the Wizard#
+4049,454,5,447,1,0,0,0,0,0,0,0,0 //SL_PRIEST#Spirit of the Priest#
+4049,455,5,0,0,0,0,0,0,0,0,0,0 //SL_BARDDANCER#Spirit of the Artist#
+4049,456,5,457,1,0,0,0,0,0,0,0,0 //SL_ROGUE#Spirit of the Rogue#
+4049,457,5,0,0,0,0,0,0,0,0,0,0 //SL_ASSASIN#Spirit of the Assasin#
+4049,458,5,445,1,0,0,0,0,0,0,0,0 //SL_BLACKSMITH#Spirit of the Blacksmith#
+4049,460,5,455,1,0,0,0,0,0,0,0,0 //SL_HUNTER#Spirit of the Hunter#
+4049,461,5,448,1,0,0,0,0,0,0,0,0 //SL_SOULLINKER#Spirit of the Soul Linker#
+4049,462,7,454,1,0,0,0,0,0,0,0,0 //SL_KAIZEL#Kaizel#
+4049,463,7,454,1,450,1,0,0,0,0,0,0 //SL_KAAHI#Kahai#
+4049,464,3,456,1,0,0,0,0,0,0,0,0 //SL_KAUPE#Kauf#
+4049,465,7,453,1,0,0,0,0,0,0,0,0 //SL_KAITE#Kaite#
+4049,466,7,423,1,0,0,0,0,0,0,0,0 //SL_KAINA#Kaina#
+4049,467,7,453,1,0,0,0,0,0,0,0,0 //SL_STIN#Estin#
+4049,468,7,453,1,0,0,0,0,0,0,0,0 //SL_STUN#Estern#
+4049,469,10,467,7,468,7,0,0,0,0,0,0 //SL_SMA#Esma#
+4049,470,7,454,1,0,0,0,0,0,0,0,0 //SL_SWOO#Esu#
+4049,471,3,452,1,0,0,0,0,0,0,0,0 //SL_SKE#Esk#
+4049,472,3,447,1,0,0,0,0,0,0,0,0 //SL_SKA#Eska#
+4049,494,5,451,1,0,0,0,0,0,0,0,0 //SL_HIGH#Spirit of Rebirth#
+4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt
index d0d733900..35b3ad979 100644
--- a/db/skill_unit_db.txt
+++ b/db/skill_unit_db.txt
@@ -1,95 +1,95 @@
-// ID,unit ID,unit ID 2,layout,range,interval,target,flag
-//
-// layout = -1:special, 0:1*1, 1:3*3, 2:5*5, up to 5:11*11
-// target = friend (party +guildmates +neutral players) / party /
-// ally (party +guildmates) / all / enemy
-// flag 0x001(UF_DEFNOTENEMY) If 'defunit_not_enemy' is set, the target is changed to 'friend'
-// 0x002(UF_NOREITERRATION) Spell cannot be stacked
-// 0x004(UF_NOFOOTSET) Spell cannot be cast near/on targets
-// 0x008(UF_NOOVERLAP) Spell effects do not overlap
-// 0x010(UF_NOPC) Spell cannot affect players.
-// 0x020(UF_NOMOB) Spell cannot affect mobs.
-// 0x080(UF_SKILL) Spell CAN affect skills.
-// 0x100(UF_DANCE) Dance skill
-// 0x200(UF_ENSEMBLE) Ensemble skill
-// 0x400(UF_SONG) Song skill
-// 0x800(UF_DUALMODE) Spell has effects both at an interval and when you step in/out
-// Example: 0x006 = 0x002+0x004 -> Cannot be stacked nor cast near targets
-//
-// Notes:
-// ------
-// 0x89,0x8a,0x8b •\Ž¦–³‚µ
-//
-// u1 u2 lay r intr target flag
-//
-
- 12,0x7e, , 0, 0, -1,all, 0x003 //MG_SAFETYWALL
- 18,0x7f, , -1, 0, 1,enemy, 0x008 //MG_FIREWALL
- 21,0x86, , 0, 2,1000,enemy, 0x008 //MG_THUNDERSTORM
- 25,0x85, , 1, 0, -1,all, 0x003 //AL_PNEUMA
- 27,0x81,0x80, 0, 0, -1,all, 0x006 //AL_WARP
- 47,0x86, , 0, 2,1000,enemy, 0x080 //AC_SHOWER
- 70,0x83, , -1, 1,1000,all, 0x008 //PR_SANCTUARY
- 79,0x84, , -1, 1,3000,enemy, 0x008 //PR_MAGNUS
- 80,0x87,0x88, 0, 1,2000,enemy, 0x002 //WZ_FIREPILLAR
- 83,0x86, , 0, 3,1000,enemy, 0x000 //WZ_METEOR
- 85,0x86,,0,6:6:6:6:6:6:6:6:6:6:8,1250,enemy,0x008 //WZ_VERMILION
- 87,0x8d, , -1, 0, -1,all, 0x000 //WZ_ICEWALL
- 89,0x86, , 0, 5, 450,enemy, 0x008 //WZ_STORMGUST
- 91,0x86, , 0, 2,1000,enemy, 0x000 //WZ_HEAVENDRIVE
- 92,0x8e, , 2, 0, -1,enemy, 0x000 //WZ_QUAGMIRE
-115,0x90, , 0, 1,1000,enemy, 0x006 //HT_SKIDTRAP
-116,0x93, , 0, 1,1000,enemy, 0x006 //HT_LANDMINE
-117,0x91, , 0, 1,1000,enemy, 0x006 //HT_ANKLESNARE
-118,0x94, , 0, 1,1000,enemy, 0x006 //HT_SHOCKWAVE
-119,0x95, , 0, 1,1000,enemy, 0x006 //HT_SANDMAN
-120,0x96, , 0, 1,1000,enemy, 0x006 //HT_FLASHER
-121,0x97, , 0, 1,1000,enemy, 0x006 //HT_FREEZINGTRAP
-122,0x8f, , 0, 1,1000,enemy, 0x006 //HT_BLASTMINE
-123,0x98, , 0, 1,1000,enemy, 0x006 //HT_CLAYMORETRAP
-125,0x99, , 0, 1,1000,all, 0x002 //HT_TALKIEBOX
-140,0x92, , -1, 0,1000,enemy, 0x000 //AS_VENOMDUST
-220,0xb0, , 0, 0, -1,all, 0x002 //RG_GRAFFITI
-229,0xb1, , 0, 1,1000,enemy, 0x006 //AM_DEMONSTRATION
-254,0x86, , -1, 0, 400,enemy, 0x000 //CR_GRANDCROSS
-285,0x9a, , 3, 0, -1,all, 0x000 //SA_VOLCANO
-286,0x9b, , 3, 0, -1,all, 0x000 //SA_DELUGE
-287,0x9c, , 3, 0, -1,all, 0x000 //SA_VIOLENTGALE
-288,0x9d,,3:3:4:4:5,0, -1,all, 0x000 //SA_LANDPROTECTOR
-306,0x9e, , 4, 0,6000,all, 0x200 //BD_LULLABY
-307,0x9f, , 4, 0, -1,enemy, 0x210 //BD_RICHMANKIM
-308,0xa0, , 4, 0, -1,enemy, 0x200 //BD_ETERNALCHAOS
-309,0xa1, , 4, 0, -1,party, 0x200 //BD_DRUMBATTLEFIELD
-310,0xa2, , 4, 0, -1,party, 0x200 //BD_RINGNIBELUNGEN
-311,0xa3, , 4, 0, -1,all, 0x200 //BD_ROKISWEIL
-312,0xa4, , 4, 0, -1,party, 0x220 //BD_INTOABYSS
-313,0xa5, , 4, 0, -1,party, 0x200 //BD_SIEGFRIED
-317,0xa6, , 3, 0,3000,enemy, 0x400 //BA_DISSONANCE
-319,0xa7, , 3, 0, -1,all, 0x420 //BA_WHISTLE
-320,0xa8, , 3, 0, -1,all, 0x420 //BA_ASSASSINCROSS
-321,0xa9, , 3, 0, -1,all, 0x420 //BA_POEMBRAGI
-322,0xaa, , 3, 0,6000,all, 0xC20 //BA_APPLEIDUN
-325,0xab, , 3, 0,3000,enemy, 0x100 //DC_UGLYDANCE
-327,0xac, , 3, 0, -1,all, 0x120 //DC_HUMMING
-328,0xad, , 3, 0, -1,enemy, 0x100 //DC_DONTFORGETME
-329,0xae, , 3, 0, -1,all, 0x120 //DC_FORTUNEKISS
-330,0xaf, , 3, 0, -1,all, 0x120 //DC_SERVICEFORYOU
-336,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLPARTNER
-339,0x86, , -1, 0, 400,enemy, 0x000 //NPC_DARKGRANDCROSS
-362,0xb4, , 0, 3, -1,all, 0x000 //HP_BASILICA
-369,0xb3, , -1, 0,10000,all, 0x008 //PA_GOSPEL
-395,0xb5, , 4, 0, -1,all, 0x200 //CG_MOONLIT
-404,0xb6, , -1, 0, -1,all, 0x000 //PF_FOGWALL
-405,0xb7, , 0, 1,1000,enemy, 0x000 //PF_SPIDERWEB
-409,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLBABY
-410,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLPARENT
-428,0x86, , 0, 1, 200,enemy, 0x000 //SG_SUN_WARM
-429,0x86, , 0, 1, 200,enemy, 0x000 //SG_MOON_WARM
-430,0x86, , 0, 1, 200,enemy, 0x000 //SG_STAR_WARM
-484,0xb8, , 2, 0,1000,enemy, 0x808 //HW_GRAVITATION
-488,0xb9, , 3, 0, -1,all, 0x200 //CG_HERMODE
-516,0xba, , 3, 0, 100,enemy, 0x000 //GS_DESPERADO
-521,0xbe, , 0, 1,1000,enemy, 0x000 //GS_GROUNDDRIFT
-527,0xbc, , -1, 0,2000,enemy, 0x000 //NJ_TATAMIGAESHI
-535,0xbd, , -1, 0, 200,enemy, 0x008 //NJ_KAENSIN
-538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x000 //NJ_SUITON
+// ID,unit ID,unit ID 2,layout,range,interval,target,flag
+//
+// layout = -1:special, 0:1*1, 1:3*3, 2:5*5, up to 5:11*11
+// target = friend (party +guildmates +neutral players) / party /
+// ally (party +guildmates) / all / enemy
+// flag 0x001(UF_DEFNOTENEMY) If 'defunit_not_enemy' is set, the target is changed to 'friend'
+// 0x002(UF_NOREITERRATION) Spell cannot be stacked
+// 0x004(UF_NOFOOTSET) Spell cannot be cast near/on targets
+// 0x008(UF_NOOVERLAP) Spell effects do not overlap
+// 0x010(UF_NOPC) Spell cannot affect players.
+// 0x020(UF_NOMOB) Spell cannot affect mobs.
+// 0x080(UF_SKILL) Spell CAN affect skills.
+// 0x100(UF_DANCE) Dance skill
+// 0x200(UF_ENSEMBLE) Ensemble skill
+// 0x400(UF_SONG) Song skill
+// 0x800(UF_DUALMODE) Spell has effects both at an interval and when you step in/out
+// Example: 0x006 = 0x002+0x004 -> Cannot be stacked nor cast near targets
+//
+// Notes:
+// ------
+// 0x89,0x8a,0x8b •\Ž¦–³‚µ
+//
+// u1 u2 lay r intr target flag
+//
+
+ 12,0x7e, , 0, 0, -1,all, 0x003 //MG_SAFETYWALL
+ 18,0x7f, , -1, 0, 1,enemy, 0x008 //MG_FIREWALL
+ 21,0x86, , 0, 2,1000,enemy, 0x008 //MG_THUNDERSTORM
+ 25,0x85, , 1, 0, -1,all, 0x003 //AL_PNEUMA
+ 27,0x81,0x80, 0, 0, -1,all, 0x006 //AL_WARP
+ 47,0x86, , 0, 2,1000,enemy, 0x080 //AC_SHOWER
+ 70,0x83, , -1, 1,1000,all, 0x008 //PR_SANCTUARY
+ 79,0x84, , -1, 1,3000,enemy, 0x008 //PR_MAGNUS
+ 80,0x87,0x88, 0, 1,2000,enemy, 0x002 //WZ_FIREPILLAR
+ 83,0x86, , 0, 3,1000,enemy, 0x000 //WZ_METEOR
+ 85,0x86,,0,6:6:6:6:6:6:6:6:6:6:8,1250,enemy,0x008 //WZ_VERMILION
+ 87,0x8d, , -1, 0, -1,all, 0x000 //WZ_ICEWALL
+ 89,0x86, , 0, 5, 450,enemy, 0x008 //WZ_STORMGUST
+ 91,0x86, , 0, 2,1000,enemy, 0x000 //WZ_HEAVENDRIVE
+ 92,0x8e, , 2, 0, -1,enemy, 0x000 //WZ_QUAGMIRE
+115,0x90, , 0, 1,1000,enemy, 0x006 //HT_SKIDTRAP
+116,0x93, , 0, 1,1000,enemy, 0x006 //HT_LANDMINE
+117,0x91, , 0, 1,1000,enemy, 0x006 //HT_ANKLESNARE
+118,0x94, , 0, 1,1000,enemy, 0x006 //HT_SHOCKWAVE
+119,0x95, , 0, 1,1000,enemy, 0x006 //HT_SANDMAN
+120,0x96, , 0, 1,1000,enemy, 0x006 //HT_FLASHER
+121,0x97, , 0, 1,1000,enemy, 0x006 //HT_FREEZINGTRAP
+122,0x8f, , 0, 1,1000,enemy, 0x006 //HT_BLASTMINE
+123,0x98, , 0, 1,1000,enemy, 0x006 //HT_CLAYMORETRAP
+125,0x99, , 0, 1,1000,all, 0x002 //HT_TALKIEBOX
+140,0x92, , -1, 0,1000,enemy, 0x000 //AS_VENOMDUST
+220,0xb0, , 0, 0, -1,all, 0x002 //RG_GRAFFITI
+229,0xb1, , 0, 1,1000,enemy, 0x006 //AM_DEMONSTRATION
+254,0x86, , -1, 0, 400,enemy, 0x000 //CR_GRANDCROSS
+285,0x9a, , 3, 0, -1,all, 0x000 //SA_VOLCANO
+286,0x9b, , 3, 0, -1,all, 0x000 //SA_DELUGE
+287,0x9c, , 3, 0, -1,all, 0x000 //SA_VIOLENTGALE
+288,0x9d,,3:3:4:4:5,0, -1,all, 0x000 //SA_LANDPROTECTOR
+306,0x9e, , 4, 0,6000,all, 0x200 //BD_LULLABY
+307,0x9f, , 4, 0, -1,enemy, 0x210 //BD_RICHMANKIM
+308,0xa0, , 4, 0, -1,enemy, 0x200 //BD_ETERNALCHAOS
+309,0xa1, , 4, 0, -1,party, 0x200 //BD_DRUMBATTLEFIELD
+310,0xa2, , 4, 0, -1,party, 0x200 //BD_RINGNIBELUNGEN
+311,0xa3, , 4, 0, -1,all, 0x200 //BD_ROKISWEIL
+312,0xa4, , 4, 0, -1,party, 0x220 //BD_INTOABYSS
+313,0xa5, , 4, 0, -1,party, 0x200 //BD_SIEGFRIED
+317,0xa6, , 3, 0,3000,enemy, 0x400 //BA_DISSONANCE
+319,0xa7, , 3, 0, -1,all, 0x420 //BA_WHISTLE
+320,0xa8, , 3, 0, -1,all, 0x420 //BA_ASSASSINCROSS
+321,0xa9, , 3, 0, -1,all, 0x420 //BA_POEMBRAGI
+322,0xaa, , 3, 0,6000,all, 0xC20 //BA_APPLEIDUN
+325,0xab, , 3, 0,3000,enemy, 0x100 //DC_UGLYDANCE
+327,0xac, , 3, 0, -1,all, 0x120 //DC_HUMMING
+328,0xad, , 3, 0, -1,enemy, 0x100 //DC_DONTFORGETME
+329,0xae, , 3, 0, -1,all, 0x120 //DC_FORTUNEKISS
+330,0xaf, , 3, 0, -1,all, 0x120 //DC_SERVICEFORYOU
+336,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLPARTNER
+339,0x86, , -1, 0, 400,enemy, 0x000 //NPC_DARKGRANDCROSS
+362,0xb4, , 0, 3, -1,all, 0x000 //HP_BASILICA
+369,0xb3, , -1, 0,10000,all, 0x008 //PA_GOSPEL
+395,0xb5, , 4, 0, -1,all, 0x200 //CG_MOONLIT
+404,0xb6, , -1, 0, -1,all, 0x000 //PF_FOGWALL
+405,0xb7, , 0, 1,1000,enemy, 0x000 //PF_SPIDERWEB
+409,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLBABY
+410,0xb2, , 0,-1, -1,noone, 0x000 //WE_CALLPARENT
+428,0x86, , 0, 1, 200,enemy, 0x000 //SG_SUN_WARM
+429,0x86, , 0, 1, 200,enemy, 0x000 //SG_MOON_WARM
+430,0x86, , 0, 1, 200,enemy, 0x000 //SG_STAR_WARM
+484,0xb8, , 2, 0,1000,enemy, 0x808 //HW_GRAVITATION
+488,0xb9, , 3, 0, -1,all, 0x200 //CG_HERMODE
+516,0xba, , 3, 0, 100,enemy, 0x000 //GS_DESPERADO
+521,0xbe, , 0, 1,1000,enemy, 0x000 //GS_GROUNDDRIFT
+527,0xbc, , -1, 0,2000,enemy, 0x000 //NJ_TATAMIGAESHI
+535,0xbd, , -1, 0, 200,enemy, 0x008 //NJ_KAENSIN
+538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x000 //NJ_SUITON
diff --git a/db/statpoint.txt b/db/statpoint.txt
index fd1409e66..1b3f3d893 100644
--- a/db/statpoint.txt
+++ b/db/statpoint.txt
@@ -1,255 +1,255 @@
-48
-51
-54
-57
-60
-64
-68
-72
-76
-80
-85
-90
-95
-100
-105
-111
-117
-123
-129
-135
-142
-149
-156
-163
-170
-178
-186
-194
-202
-210
-219
-228
-237
-246
-255
-265
-275
-285
-295
-305
-316
-327
-338
-349
-360
-372
-384
-396
-408
-420
-433
-446
-459
-472
-485
-499
-513
-527
-541
-555
-570
-585
-600
-615
-630
-646
-662
-678
-694
-710
-727
-744
-761
-778
-795
-813
-831
-849
-867
-885
-904
-923
-942
-961
-980
-1000
-1020
-1040
-1060
-1080
-1101
-1122
-1143
-1164
-1185
-1207
-1229
-1251
-1273
-1295
-1318
-1341
-1364
-1387
-1410
-1434
-1458
-1482
-1506
-1530
-1555
-1580
-1605
-1630
-1655
-1681
-1707
-1733
-1759
-1785
-1812
-1839
-1866
-1893
-1920
-1948
-1976
-2004
-2032
-2060
-2089
-2118
-2147
-2176
-2205
-2235
-2265
-2295
-2325
-2355
-2386
-2417
-2448
-2479
-2510
-2542
-2574
-2606
-2638
-2670
-2703
-2736
-2769
-2802
-2835
-2869
-2903
-2937
-2971
-3005
-3040
-3075
-3110
-3145
-3180
-3216
-3252
-3288
-3324
-3360
-3397
-3434
-3471
-3508
-3545
-3583
-3621
-3659
-3697
-3735
-3774
-3813
-3852
-3891
-3930
-3970
-4010
-4050
-4090
-4130
-4171
-4212
-4253
-4294
-4335
-4377
-4419
-4461
-4503
-4545
-4588
-4631
-4674
-4717
-4760
-4804
-4848
-4892
-4936
-4980
-5025
-5070
-5115
-5160
-5205
-5251
-5297
-5343
-5389
-5435
-5482
-5529
-5576
-5623
-5670
-5718
-5766
-5814
-5862
-5910
-5959
-6008
-6057
-6106
-6155
-6205
-6255
-6305
-6355
-6405
-6456
-6507
-6558
-6609
-6660
-6712
-6764
-6816
-6868
-6920
-6973
-7026
-7079
-7132
-7185
+48
+51
+54
+57
+60
+64
+68
+72
+76
+80
+85
+90
+95
+100
+105
+111
+117
+123
+129
+135
+142
+149
+156
+163
+170
+178
+186
+194
+202
+210
+219
+228
+237
+246
+255
+265
+275
+285
+295
+305
+316
+327
+338
+349
+360
+372
+384
+396
+408
+420
+433
+446
+459
+472
+485
+499
+513
+527
+541
+555
+570
+585
+600
+615
+630
+646
+662
+678
+694
+710
+727
+744
+761
+778
+795
+813
+831
+849
+867
+885
+904
+923
+942
+961
+980
+1000
+1020
+1040
+1060
+1080
+1101
+1122
+1143
+1164
+1185
+1207
+1229
+1251
+1273
+1295
+1318
+1341
+1364
+1387
+1410
+1434
+1458
+1482
+1506
+1530
+1555
+1580
+1605
+1630
+1655
+1681
+1707
+1733
+1759
+1785
+1812
+1839
+1866
+1893
+1920
+1948
+1976
+2004
+2032
+2060
+2089
+2118
+2147
+2176
+2205
+2235
+2265
+2295
+2325
+2355
+2386
+2417
+2448
+2479
+2510
+2542
+2574
+2606
+2638
+2670
+2703
+2736
+2769
+2802
+2835
+2869
+2903
+2937
+2971
+3005
+3040
+3075
+3110
+3145
+3180
+3216
+3252
+3288
+3324
+3360
+3397
+3434
+3471
+3508
+3545
+3583
+3621
+3659
+3697
+3735
+3774
+3813
+3852
+3891
+3930
+3970
+4010
+4050
+4090
+4130
+4171
+4212
+4253
+4294
+4335
+4377
+4419
+4461
+4503
+4545
+4588
+4631
+4674
+4717
+4760
+4804
+4848
+4892
+4936
+4980
+5025
+5070
+5115
+5160
+5205
+5251
+5297
+5343
+5389
+5435
+5482
+5529
+5576
+5623
+5670
+5718
+5766
+5814
+5862
+5910
+5959
+6008
+6057
+6106
+6155
+6205
+6255
+6305
+6355
+6405
+6456
+6507
+6558
+6609
+6660
+6712
+6764
+6816
+6868
+6920
+6973
+7026
+7079
+7132
+7185
diff --git a/doc/admin_packet.txt b/doc/admin_packet.txt
index d40c8a370..670a03879 100644
--- a/doc/admin_packet.txt
+++ b/doc/admin_packet.txt
@@ -1,281 +1,281 @@
-===========================================================================
-===========================================================================
- DETAIL OF ADMINISTRATION PACKETS
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-
-===========================================================================
- COMMON PACKETS FOR ALL SERVERS
----------------------------------------------------------------------------
-S 7530 (void)
- It's a request to obtain the version of the server.
- Answer packet: 0x7531.
-
-R 7531 <major_version>.B <minor_version>.B <revision>.B <release_flag>.B <official_flag>.B <server_type>.B <mod_version>.w
- It's the reply to a request about the server version (0x7530).
- It gives the information about the version of the server.
- release_flag : 0 = release, 1 = debug
- official_flag: 0 = official, 1 = mod
- server_type: 1 = login, 2 = char, 4 = inter, 8 = map (add all values if the server have more than 1 type)
-
-S 7532 (void)
- End of connection (no reply is sended back)
-
-===========================================================================
- ADMINISTRATION PACKETS OF THE LOGIN-SERVER
----------------------------------------------------------------------------
-
-NB: All information about an account can be obtain by an administration packet, except the password.
- The login-server will never send back the password af an account.
- If someone sniffs the password from the login-server, he can not obtain it.
- But, it exists a packet to check the password.
- It's to secure the password.
-
-CONNECTION SYSTEM IN ADMINSTRATION MODE
-
-S 7918 <encrypt_flag>.w <administration_password>.24(16)B
- It's a request to obtain an (administration) connection on the login-server.
- The packet size changes according to the encrypted password or not.
- A non-encrypted password is sended with 24 bytes (plain text with NULL terminate),
- and an encrypted password is sended with 16 bytes.
- Answer packet: 0x7919.
- encrypt_flag: 0 = plain text, 1 = md5 (key + password), 2 = md5 (password + key)
-
-R 7919 <flag>.B
- It's the reply to a request for an (administration) connection (0x7918).
- Flag: 0 = accepted, 1 = refused
-
-S 791a (void)
- It's a request to obtain the encrypted key. This key is used to create the encrypted password.
- This packet must be called before the packet 0x7918 if you want connect you with an encrypted password.
- The reply is the packet 0x01dc, as like a player sends a connection request with the packet 0x01db.
-
-PACKETS OF ADMINISTRATION MODE
-
-R 791f (void)
- Ready signal (no reply is sended back). NOT USED.
-
-S 7920 <start_id>.l <end_id>.l
- It's a request to obtain an accounts list.
- start_id: 0 for begining of the list, or presumed start id value of the first account.
- end_id: 0 to go until the last id, or the upper id limit value that you want.
- If 'end_id' is lower to 'start_id', you give no limit for the last id.
- Answer packet: 0x7921.
-
-R 7921 <length>.w { <account_id>.l <GM_level>.B <account_name>.24B <sex>.B <count>.l <state>.l }.38B*
- It's tje reply packet of the packet 0x7920.
- It gives an accounts list.
- If you receive at least an account, you must do an additional request (packet 0x7920 begining with the last received account id +1)
- to be sure that you receive all asked accounts, because this packet is limited in size when it sends information.
- if <state> is 7, there are 2 possibilities: banishement or state{Your are Prohibited to log in until %s}.
-
-S 7930 <account_name>.24B <password>.24B <sex>.B <E-mail>.40B
- It's a request to create a new account.
- If e-mail is not valid, the e-mail is replaced by the default e-mail (a@a.com).
- The default e-mail is like no e-mail to protect your characters against a deletion.
- Answer packet: 0x7931.
-
-R 7931 <account_id>.l <account_name>.24B
- It's the reply to an account creation (0x7930).
- If the account_id value is -1, the login-server fails to create the new account
- (an account already exists with the same name, the request is invalid, etc.).
- Otherwise, the account_id is the id of the new account.
-
-S 7932 <account_name>.24B
- It's a request to delete an account.
- Answer packet: 0x7933.
-
-R 7933 <account_id>.l <account_name>.24B
- It's the reply to an account deletion (0x7932).
- If the account_id value is -1, the login-server fails to delete the account (the account doesn't exist).
- Otherwise, the account_id is the id of the deleted account.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7934 <account_name>.24B <password>.24B
- It's a request to modify the password of an account.
- Answer packet: 0x7935.
-
-R 7935 <account_id>.l <account_name>.24B
- It's the reply to an password modification (0x7934).
- If the account_id value is -1, the login-server fails to modify the password (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have modified the password.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7936 <account_name>.24B <state>.l <error_message>.20B
- It's a request to modify the state of an account.
- State: It's the state like the packet 0x006a +1.
- Error_message: it's the message of the error code #6 = Your are Prohibited to login until <error_message> (packet 0x006a).
- If state is 7 (6+1), the error_message is saved in the account.
- For another state, the error_message is deleted (voided) in the account.
- Answer packet: 0x7937.
-
-R 7937 <account_id>.l <account_name>.24B <state>.l
- It's the reply to a state modification (0x7936).
- If the account_id value is -1, the login-server fails to modify the state (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have modified the state.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7938 (void)
- It's a request to obtain information about the servers connected to the login-server (servers list with details)
- Answer packet: 0x7939.
-
-R 7939 <length>.w {<IP>.l <port>.w <server_name>.20B <#_of_users>.w <maintenance>.w <new>.w}.32B*
- It's the reply to an request to obtain servers information (0x7938).
- It returns all information about the servers connected on the login-server.
-
-S 793a <account_name>.24B <password>.24B
- It's a request to test a password. REMEMBER: Never create a packet to send the password from the login-server.
- Answer packet: 0x793b.
-
-S 793b <account_id>.l <account_name>.24B
- It's the reply to a password check (0x793a).
- If the account_id value is -1, the login-server doesn't valid the password (the account doesn't exist or the password is not the correct one).
- Otherwise, the account_id is the id of the account that the login-server have checked the password.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 793c <account_name>.24B <sex>.B
- It's a request to modify the sex of an account.
- Answer packet: 0x793d.
-
-R 793d <account_id>.l <account_name>.24B
- It's the reply to a request to modify a sex (0x793c).
- If the account_id value is -1, the login-server fails to modify the sex (the account doesn't exist or the sex is already the good sex).
- Otherwise, the account_id is the id of the account that the login-server have modified the sex.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 793e <account_name>.24B <GM_level>.B
- It's a request to modify the GM level of an account.
- Answer packet: 0x793f.
-
-R 793f <account_id>.l <account_name>.24B
- It's the reply to a request to modify a GM level (0x793e).
- If the account_id value is -1, the login-server fails to modify the GM level (the account doesn't exist, or GM_account file can not be modified or the GM level is already the good sex).
- Otherwise, the account_id is the id of the account that the login-server have modified the GM level.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7940 <account_name>.24B <e-mail>.40B
- It's a request to modify the email of an account.
- Answer packet: 0x7941.
-
-R 7941 <account_id>.l <account_name>.24B
- It's the reply to a request to modify an email (0x7940).
- If the account_id value is -1, the login-server fails to modify the e-mail (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have modified the email.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7942 <account_name>.24B <length_of_memo>.w <memo>.(length_of_memo)B
- It's a request to modify the memo of an account.
- The length can be 0 to have a void memo.
- Answer packet: 0x7943.
-
-R 7943 <account_id>.l <account_name>.24B
- It's the reply to an request to modify a memo (0x7942).
- If the account_id value is -1, the login-server fails to modify the memo (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have modified the memo.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7944 <account_name>.24B
- It's a request to obtain (by the name) the id of an account.
- Answer packet: 0x7945.
-
-R 7945 <account_id>.l <account_name>.24B
- It's the reply to an request (by the name) to obtain an account id (0x7944).
- If the account_id value is -1, the login-server fails to obtain the account id (the account doesn't exist).
- Otherwise, the account_id is the id of the found account.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 7946 <account_id>.l
- It's a request to obtain (by the id) the name of an account.
- Answer packet: 0x7947.
-
-R 7947 <account_id>.l <account_name>.24B
- It's the reply to an request (by the id) to obtain an account name (0x7946).
- If the account_name value is "" (void), the login-server fails to obtain the account name (the account id doesn't exist).
- Otherwise, the account_name is the name of the found account.
-
-S 7948 <account_name>.24B <validity>.l
- It's a request to set the validity date of an account.
- This packet fixes an absolute validity time.
- Answer packet: 0x7949.
-
-R 7949 <account_id>.l <account_name>.24B <validity>.l
- It's the reply to an request to set the validity date of an account (0x7948).
- If the account_id value is -1, the login-server fails to set the validity date (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have fixed the validity date.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 794a <account_name>.24B <end_date_of_banishment>.l
- It's a request to set the final date of a banishment of an account.
- This packet fixes an absolute time for the end of the banishment.
- Answer packet: 0x794b.
-
-R 794b <account_id>.l <account_name>.24B <end_date_of_banishment>.l
- It's the reply to an request to set the final date of a banishment of an account (0x794a).
- If the account_id value is -1, the login-server fails to set the final date of a banishment (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have fixed the final date of a banishment.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
-
-S 794c <account_name>.24B <+/-years_modification>.w <+/-months_modification>.w <+/-days_modification>.w <+/-hours_modification>.w <+/-minutes_modification>.w <+/-seconds_modification>.w
- It's a request to adjust the final date of a banishment of an account.
- This packet modifies the final date of a banishment by add/sustract of some parameters.
- If you adjust a non-banished account, you fix a banishment with actual time + adjustments.
- Answer packet: 0x794d.
-
-R 794d <account_id>.l <account_name>.24B <end_date_of_banishment>.l
- It's the reply to an request to adjust the final date of a banishment of an account (0x794c).
- If the account_id value is -1, the login-server fails to adjust the final date of a banishment (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have adjusted the final date of a banishment.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
- Note: if value is impossible, the returned value is the (unchanged) value of the final date of the banishment.
-
-S 794e <broadcast_type>.W <length_of_message>.L <message>.(length_of_message)B
- It's a request to send a broadcast to all map-servers.
- The length can not be 0.
- broadcast_type:
- 0: normal (yellow)
- 0x10: blue
- Answer packet: 794f.
-
-R 794f <answaer>.W
- It's the reply to an request to send a broadcast to all map-servers (794e).
- If the answer value is -1, the login-server fails to send the message (no char-server are conected).
- Otherwise, the answer is 0.
-
-S 7950 <account_name>.24B <+/-years_modification>.w <+/-months_modification>.w <+/-days_modification>.w <+/-hours_modification>.w <+/-minutes_modification>.w <+/-seconds_modification>.w
- It's a request to adjust the validity date of an account.
- This packet modifies the validity date by add/sustract of some parameters.
- You can not adjust an unlimited validity date.
- Answer packet: 0x7951.
-
-R 7951 <account_id>.l <account_name>.24B <validity>.l
- It's the reply to an request to adjust the validity date of an account (0x7950).
- If the account_id value is -1, the login-server fails to adjust the validity date (the account doesn't exist).
- Otherwise, the account_id is the id of the account that the login-server have found to try the adjustement of the validity date.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
- If the returned validity date is 0, the login-server haven't modify the validity date (the account have an unlimited validity,
- the modification is impossible because the new date is too far in the future, etc...).
- If the returned validity date is not 0, it's the new validity date of the account.
-
-S 7952 <account_name>.24B
- It's a request (by name) to obtain complete information about an account.
- Answer packet: 0x7953.
-
-R 7953 <account_id>.l <GM_level>.B <account_name>.24B <sex>.B <count>.l <state>.l <error_message>.20B <last_login_time>.24B <last_authorised_login_ip>.16B <email>.40B <validity_date>.l <until_ban_date>.l <length_of_memo>.w <memo>.(length_of_memo)B
- It's the reply to an request to obtain complete information about an account (0x7952 and 0x7954).
- It sends all informations about an account.
- Reply of 0x7952:
- If the account_id value is -1, the login-server fails to found the account (the account doesn't exist).
- Otherwise, the account_id is the id of the found account.
- The login-server returns the correct sensitive case account_name (use strcmpi to compare).
- Reply of 0x7954:
- If the account_name value is "" (void), the login-server fails to found the account (the account id doesn't exist).
- Otherwise, the account_name is the name of the found account.
-
-S 7954 <account_id>.l
- It's a request (by id) to obtain complete information about an account.
- Answer packet: 0x7953.
-
-S 7955
- It's a request to re-load GM file definition.
- Answer packet: NONE.
-
+===========================================================================
+===========================================================================
+ DETAIL OF ADMINISTRATION PACKETS
+---------------------------------------------------------------------------
+---------------------------------------------------------------------------
+
+===========================================================================
+ COMMON PACKETS FOR ALL SERVERS
+---------------------------------------------------------------------------
+S 7530 (void)
+ It's a request to obtain the version of the server.
+ Answer packet: 0x7531.
+
+R 7531 <major_version>.B <minor_version>.B <revision>.B <release_flag>.B <official_flag>.B <server_type>.B <mod_version>.w
+ It's the reply to a request about the server version (0x7530).
+ It gives the information about the version of the server.
+ release_flag : 0 = release, 1 = debug
+ official_flag: 0 = official, 1 = mod
+ server_type: 1 = login, 2 = char, 4 = inter, 8 = map (add all values if the server have more than 1 type)
+
+S 7532 (void)
+ End of connection (no reply is sended back)
+
+===========================================================================
+ ADMINISTRATION PACKETS OF THE LOGIN-SERVER
+---------------------------------------------------------------------------
+
+NB: All information about an account can be obtain by an administration packet, except the password.
+ The login-server will never send back the password af an account.
+ If someone sniffs the password from the login-server, he can not obtain it.
+ But, it exists a packet to check the password.
+ It's to secure the password.
+
+CONNECTION SYSTEM IN ADMINSTRATION MODE
+
+S 7918 <encrypt_flag>.w <administration_password>.24(16)B
+ It's a request to obtain an (administration) connection on the login-server.
+ The packet size changes according to the encrypted password or not.
+ A non-encrypted password is sended with 24 bytes (plain text with NULL terminate),
+ and an encrypted password is sended with 16 bytes.
+ Answer packet: 0x7919.
+ encrypt_flag: 0 = plain text, 1 = md5 (key + password), 2 = md5 (password + key)
+
+R 7919 <flag>.B
+ It's the reply to a request for an (administration) connection (0x7918).
+ Flag: 0 = accepted, 1 = refused
+
+S 791a (void)
+ It's a request to obtain the encrypted key. This key is used to create the encrypted password.
+ This packet must be called before the packet 0x7918 if you want connect you with an encrypted password.
+ The reply is the packet 0x01dc, as like a player sends a connection request with the packet 0x01db.
+
+PACKETS OF ADMINISTRATION MODE
+
+R 791f (void)
+ Ready signal (no reply is sended back). NOT USED.
+
+S 7920 <start_id>.l <end_id>.l
+ It's a request to obtain an accounts list.
+ start_id: 0 for begining of the list, or presumed start id value of the first account.
+ end_id: 0 to go until the last id, or the upper id limit value that you want.
+ If 'end_id' is lower to 'start_id', you give no limit for the last id.
+ Answer packet: 0x7921.
+
+R 7921 <length>.w { <account_id>.l <GM_level>.B <account_name>.24B <sex>.B <count>.l <state>.l }.38B*
+ It's tje reply packet of the packet 0x7920.
+ It gives an accounts list.
+ If you receive at least an account, you must do an additional request (packet 0x7920 begining with the last received account id +1)
+ to be sure that you receive all asked accounts, because this packet is limited in size when it sends information.
+ if <state> is 7, there are 2 possibilities: banishement or state{Your are Prohibited to log in until %s}.
+
+S 7930 <account_name>.24B <password>.24B <sex>.B <E-mail>.40B
+ It's a request to create a new account.
+ If e-mail is not valid, the e-mail is replaced by the default e-mail (a@a.com).
+ The default e-mail is like no e-mail to protect your characters against a deletion.
+ Answer packet: 0x7931.
+
+R 7931 <account_id>.l <account_name>.24B
+ It's the reply to an account creation (0x7930).
+ If the account_id value is -1, the login-server fails to create the new account
+ (an account already exists with the same name, the request is invalid, etc.).
+ Otherwise, the account_id is the id of the new account.
+
+S 7932 <account_name>.24B
+ It's a request to delete an account.
+ Answer packet: 0x7933.
+
+R 7933 <account_id>.l <account_name>.24B
+ It's the reply to an account deletion (0x7932).
+ If the account_id value is -1, the login-server fails to delete the account (the account doesn't exist).
+ Otherwise, the account_id is the id of the deleted account.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7934 <account_name>.24B <password>.24B
+ It's a request to modify the password of an account.
+ Answer packet: 0x7935.
+
+R 7935 <account_id>.l <account_name>.24B
+ It's the reply to an password modification (0x7934).
+ If the account_id value is -1, the login-server fails to modify the password (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have modified the password.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7936 <account_name>.24B <state>.l <error_message>.20B
+ It's a request to modify the state of an account.
+ State: It's the state like the packet 0x006a +1.
+ Error_message: it's the message of the error code #6 = Your are Prohibited to login until <error_message> (packet 0x006a).
+ If state is 7 (6+1), the error_message is saved in the account.
+ For another state, the error_message is deleted (voided) in the account.
+ Answer packet: 0x7937.
+
+R 7937 <account_id>.l <account_name>.24B <state>.l
+ It's the reply to a state modification (0x7936).
+ If the account_id value is -1, the login-server fails to modify the state (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have modified the state.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7938 (void)
+ It's a request to obtain information about the servers connected to the login-server (servers list with details)
+ Answer packet: 0x7939.
+
+R 7939 <length>.w {<IP>.l <port>.w <server_name>.20B <#_of_users>.w <maintenance>.w <new>.w}.32B*
+ It's the reply to an request to obtain servers information (0x7938).
+ It returns all information about the servers connected on the login-server.
+
+S 793a <account_name>.24B <password>.24B
+ It's a request to test a password. REMEMBER: Never create a packet to send the password from the login-server.
+ Answer packet: 0x793b.
+
+S 793b <account_id>.l <account_name>.24B
+ It's the reply to a password check (0x793a).
+ If the account_id value is -1, the login-server doesn't valid the password (the account doesn't exist or the password is not the correct one).
+ Otherwise, the account_id is the id of the account that the login-server have checked the password.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 793c <account_name>.24B <sex>.B
+ It's a request to modify the sex of an account.
+ Answer packet: 0x793d.
+
+R 793d <account_id>.l <account_name>.24B
+ It's the reply to a request to modify a sex (0x793c).
+ If the account_id value is -1, the login-server fails to modify the sex (the account doesn't exist or the sex is already the good sex).
+ Otherwise, the account_id is the id of the account that the login-server have modified the sex.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 793e <account_name>.24B <GM_level>.B
+ It's a request to modify the GM level of an account.
+ Answer packet: 0x793f.
+
+R 793f <account_id>.l <account_name>.24B
+ It's the reply to a request to modify a GM level (0x793e).
+ If the account_id value is -1, the login-server fails to modify the GM level (the account doesn't exist, or GM_account file can not be modified or the GM level is already the good sex).
+ Otherwise, the account_id is the id of the account that the login-server have modified the GM level.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7940 <account_name>.24B <e-mail>.40B
+ It's a request to modify the email of an account.
+ Answer packet: 0x7941.
+
+R 7941 <account_id>.l <account_name>.24B
+ It's the reply to a request to modify an email (0x7940).
+ If the account_id value is -1, the login-server fails to modify the e-mail (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have modified the email.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7942 <account_name>.24B <length_of_memo>.w <memo>.(length_of_memo)B
+ It's a request to modify the memo of an account.
+ The length can be 0 to have a void memo.
+ Answer packet: 0x7943.
+
+R 7943 <account_id>.l <account_name>.24B
+ It's the reply to an request to modify a memo (0x7942).
+ If the account_id value is -1, the login-server fails to modify the memo (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have modified the memo.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7944 <account_name>.24B
+ It's a request to obtain (by the name) the id of an account.
+ Answer packet: 0x7945.
+
+R 7945 <account_id>.l <account_name>.24B
+ It's the reply to an request (by the name) to obtain an account id (0x7944).
+ If the account_id value is -1, the login-server fails to obtain the account id (the account doesn't exist).
+ Otherwise, the account_id is the id of the found account.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 7946 <account_id>.l
+ It's a request to obtain (by the id) the name of an account.
+ Answer packet: 0x7947.
+
+R 7947 <account_id>.l <account_name>.24B
+ It's the reply to an request (by the id) to obtain an account name (0x7946).
+ If the account_name value is "" (void), the login-server fails to obtain the account name (the account id doesn't exist).
+ Otherwise, the account_name is the name of the found account.
+
+S 7948 <account_name>.24B <validity>.l
+ It's a request to set the validity date of an account.
+ This packet fixes an absolute validity time.
+ Answer packet: 0x7949.
+
+R 7949 <account_id>.l <account_name>.24B <validity>.l
+ It's the reply to an request to set the validity date of an account (0x7948).
+ If the account_id value is -1, the login-server fails to set the validity date (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have fixed the validity date.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 794a <account_name>.24B <end_date_of_banishment>.l
+ It's a request to set the final date of a banishment of an account.
+ This packet fixes an absolute time for the end of the banishment.
+ Answer packet: 0x794b.
+
+R 794b <account_id>.l <account_name>.24B <end_date_of_banishment>.l
+ It's the reply to an request to set the final date of a banishment of an account (0x794a).
+ If the account_id value is -1, the login-server fails to set the final date of a banishment (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have fixed the final date of a banishment.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+
+S 794c <account_name>.24B <+/-years_modification>.w <+/-months_modification>.w <+/-days_modification>.w <+/-hours_modification>.w <+/-minutes_modification>.w <+/-seconds_modification>.w
+ It's a request to adjust the final date of a banishment of an account.
+ This packet modifies the final date of a banishment by add/sustract of some parameters.
+ If you adjust a non-banished account, you fix a banishment with actual time + adjustments.
+ Answer packet: 0x794d.
+
+R 794d <account_id>.l <account_name>.24B <end_date_of_banishment>.l
+ It's the reply to an request to adjust the final date of a banishment of an account (0x794c).
+ If the account_id value is -1, the login-server fails to adjust the final date of a banishment (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have adjusted the final date of a banishment.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+ Note: if value is impossible, the returned value is the (unchanged) value of the final date of the banishment.
+
+S 794e <broadcast_type>.W <length_of_message>.L <message>.(length_of_message)B
+ It's a request to send a broadcast to all map-servers.
+ The length can not be 0.
+ broadcast_type:
+ 0: normal (yellow)
+ 0x10: blue
+ Answer packet: 794f.
+
+R 794f <answaer>.W
+ It's the reply to an request to send a broadcast to all map-servers (794e).
+ If the answer value is -1, the login-server fails to send the message (no char-server are conected).
+ Otherwise, the answer is 0.
+
+S 7950 <account_name>.24B <+/-years_modification>.w <+/-months_modification>.w <+/-days_modification>.w <+/-hours_modification>.w <+/-minutes_modification>.w <+/-seconds_modification>.w
+ It's a request to adjust the validity date of an account.
+ This packet modifies the validity date by add/sustract of some parameters.
+ You can not adjust an unlimited validity date.
+ Answer packet: 0x7951.
+
+R 7951 <account_id>.l <account_name>.24B <validity>.l
+ It's the reply to an request to adjust the validity date of an account (0x7950).
+ If the account_id value is -1, the login-server fails to adjust the validity date (the account doesn't exist).
+ Otherwise, the account_id is the id of the account that the login-server have found to try the adjustement of the validity date.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+ If the returned validity date is 0, the login-server haven't modify the validity date (the account have an unlimited validity,
+ the modification is impossible because the new date is too far in the future, etc...).
+ If the returned validity date is not 0, it's the new validity date of the account.
+
+S 7952 <account_name>.24B
+ It's a request (by name) to obtain complete information about an account.
+ Answer packet: 0x7953.
+
+R 7953 <account_id>.l <GM_level>.B <account_name>.24B <sex>.B <count>.l <state>.l <error_message>.20B <last_login_time>.24B <last_authorised_login_ip>.16B <email>.40B <validity_date>.l <until_ban_date>.l <length_of_memo>.w <memo>.(length_of_memo)B
+ It's the reply to an request to obtain complete information about an account (0x7952 and 0x7954).
+ It sends all informations about an account.
+ Reply of 0x7952:
+ If the account_id value is -1, the login-server fails to found the account (the account doesn't exist).
+ Otherwise, the account_id is the id of the found account.
+ The login-server returns the correct sensitive case account_name (use strcmpi to compare).
+ Reply of 0x7954:
+ If the account_name value is "" (void), the login-server fails to found the account (the account id doesn't exist).
+ Otherwise, the account_name is the name of the found account.
+
+S 7954 <account_id>.l
+ It's a request (by id) to obtain complete information about an account.
+ Answer packet: 0x7953.
+
+S 7955
+ It's a request to re-load GM file definition.
+ Answer packet: NONE.
+
diff --git a/doc/client_packet.txt b/doc/client_packet.txt
index e763ab5f6..61fb10719 100644
--- a/doc/client_packet.txt
+++ b/doc/client_packet.txt
@@ -1,1088 +1,1088 @@
-Client Version in date format (Client Version in 4 digit format):
-2004 06 28a (0628a)
-2004 10 25 (1025)
-2004 11 01 (1101)
-2004 12 13 (1213)
-2005 01 10 (0110)
-2005 03 15 (0315)
-2005 03 21 (0321)
-2005 04 04 (0404)
-2005 04 06 (0406)*
-2005 04 11a (0411a)
-2005 04 25a (0425a)
-2005 05 31b (0531b)
-2005 06 14 (0614)
-2005 06 28a (0628a)
-2005 08 08 (0808)
-
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-#0x0040
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2,
- 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
-#0x0080
- 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0,
- 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
- 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
- 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
-#0x00C0
- 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 6, 2, 27,
- 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
- 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
- 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
-#0x0100
- 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
- 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
- 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
- 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
-#0x0140
- 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6,
- 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
- -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182,
- 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
-#0x0180
- 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
- 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, 4, 6, 2, 6,
- 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4,
- 11, 7, -1, 67, 12, 18,114, 6, 3, 6, 26, 26, 26, 26, 2, 3,
-#0x01C0
- 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 29, 6, 28,
- 8, 14, 10, 35, 6, 8, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6,
- 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1,
- -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10,
-#0x200
- 26, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 19,
-
-S ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚Ä‘—M
-R ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚ÄŽóM
-
-B ƒoƒCƒg
-w ƒ[ƒh=2B
-l ƒƒ“ƒOƒ[ƒh=4B
-* 0ŒÂˆÈã‚­‚è‚©‚¦‚µ
-
-S 0064 <version>.l <account name>.24B <password>.24B <version2>.B
- ƒAƒJƒEƒ“ƒgID&ƒpƒXƒ[ƒh‘—M
-S 0065 <account ID>.l <login ID1>.l <login ID2>.l ?.2B <sex>.B
- ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±—v‹
-S 0066 <charactor number>.B
- ƒLƒƒƒ‰ƒNƒ^‘I‘ð—v‹
-S 0067 <charactor name>.24B <param etc>.11B
- ƒLƒƒƒ‰ƒNƒ^쬗v‹
-S 0068 <charactor ID>.l <mail address>.40B
- ƒLƒƒƒ‰ƒNƒ^휗v‹
-R 0069 <len>.w <login ID1>.l <account ID>.l <login ID2>.l ?.32B <sex>.B {<IP>.l <port>.w <server name>.20B <login users>.w <maintenance>.w <new>.w}.32B*
- login¬Œ÷&ŽIî•ñ
-R 006a <error No>.B
- loginŽ¸”s ‚»‚Ì‚P
- err No=00 –¢“o˜^‚ÌID‚Å‚·
- err No=01 ƒpƒXƒ[ƒh‚ªˆá‚¢‚Ü‚·
- err No=02 Žg—pŠúŠÔ‚ªI—¹‚µ‚Ä‚¢‚Ü‚·
- err No=03 ƒT[ƒo[‚©‚çÚ‘±‹‘”Û‚³‚ê‚Ü‚µ‚½
- err No=04 ‰ð–ñ‚³‚ꂽIDA‚Ü‚½‚̓AƒJƒEƒ“ƒgƒuƒƒbƒN‚³‚ê‚Ä‚¢‚éID‚Å‚·
- err No=05 ÅV‚̃pƒbƒ`‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
- err No=06 ‰ð–ñ‚³‚ꂽIDA‚Ü‚½‚̓AƒJƒEƒ“ƒgƒuƒƒbƒN‚³‚ê‚Ä‚¢‚éID‚Å‚·
- err No=07 ƒT[ƒo[‚ª¬ŽG‚µ‚Ä‚¢‚Ü‚·
-R 006b <len>.w <charactor select data>.106B*
- ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±¬Œ÷&ƒLƒƒƒ‰ƒNƒ^ƒf[ƒ^
- <charactor select data> = <charactor ID>.l <base exp>.l <zeny>.l <job exp>.l <job level>.l ?.8B <option>.l <karma>.l <manner>.l ?.2B <HP>.w <MaxHP>.w <SP>.w <MaxSP>.w <speed>.w <class>.w <hair>.w <weapon>.2w <base level>.w <skill point>.w <head_bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <name>.24B <STR>.B <AGI>.B <VIT>.B <INT>.B <DEX>.B <LUK>.B <charactor number>.B ?.B
-R 006c <error No>.B
- ƒLƒƒƒ‰ƒNƒ^‘I‘ðŽ¸”s
-R 006d <charactor select data>.106B
- ƒLƒƒƒ‰ƒNƒ^쬬Œ÷
-R 006e <error No>.B
- ƒLƒƒƒ‰ƒNƒ^쬎¸”s
-R 006f
- ƒLƒƒƒ‰ƒNƒ^휬Œ÷
-R 0070 <error No>.B
- ƒLƒƒƒ‰ƒNƒ^휎¸”s
- err No=00 ƒ[ƒ‹ƒAƒhƒŒƒX‚ªˆá‚¤
- err No=01 휂ª‹‘”Û‚³‚ꂽ
-R 0071 <charactor ID>.l <map name>.16B <ip>.l <port>.w
- ƒLƒƒƒ‰ƒNƒ^‘I‘ð¬Œ÷&ƒ}ƒbƒv–¼&ƒQ[ƒ€ŽIIP/port
-S 0072 <account ID>.l <charactor ID>.l <login ID1>.l <login ID2>.l <sex>.b
- ƒQ[ƒ€ŽIÚ‘±—v‹
-R 0073 <server tick>.l <coordidate>.3B ?.2B
- ƒQ[ƒ€ŽIÚ‘±¬Œ÷&ƒT[ƒo‘¤1msŽžŒv&oŒ»ˆÊ’u
-R 0078 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w <cloth color>.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B
- ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?
-R 0079 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B
- ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?
-R 007b <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <server tick>.l <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B
- •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ
-R 007c <ID>.l <speed>.w ?.6w <class>.w ?.7w <X_Y>.3B ?.2B
- NPC—p•\Ž¦”͈͓àƒLƒƒƒ‰î•ñ
-S 007d
- mapƒ[ƒhI‚è
-S 007e <client tick>.l
- ƒNƒ‰ƒCƒAƒ“ƒg‘¤1msƒ^ƒCƒ}‘—M
-R 007f <server tick>.l
- ƒT[ƒo‘¤1msƒ^ƒCƒ}‘—M
-R 0080 <ID>.l <type>.B
- type=00 ƒLƒƒƒ‰Á–Å (‰æ–ÊŠOˆÚ“®BŽ€‘ÌÁ–Å“™?)
- type=01 ƒLƒƒƒ‰Ž€–S
- type=02 ƒLƒƒƒ‰Á–Å (logout“™?)
- type=03 ƒeƒŒƒ|[ƒg (ƒeƒŒƒ|,”ˆ,’±“™H)
-R 0081 <type>.B
- loginŽ¸”s ‚»‚Ì‚Q
- type=01 ƒT[ƒo[Ú‘±I—¹
- type=02 “¯‚¶ID‚Å‘¼‚ÌŽg—pŽÒ‚ªƒƒOƒCƒ“‚µ‚Ü‚µ‚½
- type=03 ƒT[ƒo[‚Æ‚Ì“¯Šú‚ÉŽ¸”s‚µ‚Ü‚µ‚½
- type=04 ’nˆæ‚ÌŽû—elˆõ’´‰ß‚ÅÚ‘±‚Å‚«‚Ü‚¹‚ñ
- type=05 ‚P‚WΈȉº‚ÍÚ‘±‚Å‚«‚Ü‚¹‚ñ
- type=06 ŒˆÏ‚³‚ꂽƒAƒJƒEƒ“ƒg‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
- type=07 ƒT[ƒo[‚ª¬ŽG‚µ‚Ä‚¢‚Ü‚·
- type=08 ‘O‚ÌÚ‘±î•ñ‚ªŽc‚Á‚Ä‚¢‚Ü‚·
- type=0b ƒAƒJƒEƒ“ƒg‚ª•Û—¯‚³‚ê‚Ü‚µ‚½
- type=0c ‰Û‹àƒVƒXƒeƒ€•ÏX‚Ì‚½‚ßAˆêŽžI—¹‚µ‚Ü‚·
- type=0d IP‚ªˆê’v‚µ‚È‚¢‚½‚ßAÚ‘±‚ðI—¹‚µ‚Ü‚·
- type=10 —L—¿ƒT[ƒrƒX‚É‚È‚è‚Ü‚µ‚½
- type=11 ƒ`ƒPƒbƒg‚ª”ƒ‚í‚ê‚Ä‚¢‚È‚¢‚©A—LŒøŠúŒÀ‚ªØ‚ê‚Ä‚¢‚Ü‚·
-S 0085 <X_Y>.3B
- ˆÚ“®—v‹
-R 0087 <server tick>.l <X_Y_X_Y>.5B ?.B
- ˆÚ“®‰ž“š
-R 0088 <ID>.l <X>.w <Y>.w
- ˆÚ“®“r’†’âŽ~
-S 0089 <target ID>.l <type>.B
- type=00 target‚ð1‰ñ‰£‚é
- type=02 À‚é
- type=03 —§‚¿ã‚é
- type=07 target‚ð‰£‚è‘±‚¯‚é
-R 008a <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <type>.B <param3>.w
- type=00 param1=0 miss
- type=00 param1:ƒ_ƒ[ƒW(‚̇Œv?) param2:•ªŠ„” param3:ƒAƒTƒVƒ“2“—¬‹tŽèƒ_ƒ[ƒW
- NPC‚©‚ç‚ÌUŒ‚‚Ìê‡Aparam2,param3‚̓Sƒ~ƒf[ƒ^
- speed‚ÍPC‚Ìê‡“à•”ASPD‚ƈê’v
- type=01 item‚ðE‚¤ ID*2ˆÈŠOƒSƒ~
- type=02 À‚é src IDˆÈŠOƒSƒ~
- type=03 —§‚ src IDˆÈŠOƒSƒ~
- type=08 •¡”UŒ‚
- type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)
- type=0a ƒNƒŠƒeƒBƒJƒ‹
- type=0b Š®‘S‰ñ”ð
-S 008c <len>.w <str>.?B
- ’Êí”­Œ¾‘—MBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
- 擪‚Ì"<nick> : "‚Ì•”•ª‚̓Nƒ‰ƒCƒAƒ“ƒg‘¤‚Å•t‚¯‚鎖
-R 008d <len>.w <ID>.l <str>.?B
- ID‚³‚ñ‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
-R 008e <len>.w <str>.?B
- Ž©•ª‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
-S 0090 <ID>.l <type?>.B
- NPC‚ɘb‚µ‚©‚¯‚éBtype‚Í01‚µ‚©Œ©‚½Ž––³‚µ
-R 0091 <map name>.16B <X>.w <Y>.w
- ŽI“àƒ}ƒbƒvŠÔˆÚ“®AƒeƒŒƒ|,”ˆ“™—p
-R 0092 <map name>.16B <X>.w <Y>.w <IP>.l <port>.w
- ŽIŠÔˆÚ“®
-R 0093
- 8ŒŽ’†‚É1‰ñ‚¾‚¯ŠÏ‘ªB“ä
-S 0094 <ID>.l
- ID‚̃Lƒƒƒ‰–¼“™—v‹B0095‚©0195‚Ì•Ô“š‚ª‚ ‚é‚Í‚¸
-R 0095 <ID>.l <nick>.24B
- NPC,ƒMƒ‹ƒh–¢Š‘®PC‚Ì0094‚Ö‚Ì•Ô“š
- 0193 <charID>.l ‚Å–â‚¢‡‚킹‚Ä
- 0194 <charID>.l <name>.24B ‚̉ž“š‚Å“¾‚Ä‚Ü‚·B
-
-S 0096 <len>.w <nick>.24B <message>.?B
- wis‘—M
-R 0097 <len>.w <nick>.24B <message>.?B
- wisŽóM
-R 0098 <type>.B
- type=00 wis‘—M¬Œ÷
- type=01 wis‘ŠŽè‚ªlogin‚µ‚Ä‚È‚¢?
- type=02 wis‘ŠŽè‚©‚çignore‚³‚ê‚Ä‚é?
-S 0099
- _‚̺‘—M
-R 009a <len>.w <message>.?B
- GM‚©‚ç‚Ì“V‚̺
-S 009b <head dir>.w <dir>.B
- ‘Ì&“ª‚Ì•ûŒü•ÏX—v‹BƒNƒ‰ƒCƒAƒ“ƒg‚ւ̉ž“š‚Í–³‚¢–Í—l
- dir‚Í00`07‚Å‘Ì‚ÌŒü‚«B00‚Å–k‚©‚甽ŽžŒv‰ñ‚è‚É45‹’PˆÊ‚Å07‚Ü‚Å
- head dir‚Í00,01,02‚Å“ª‚ÌŒü‚«B00‚Å‘Ì‚Æ“¯‚¶A01‚ª‰EA02‚ª¶
-R 009c <ID>.l <head dir>.w <dir>.B
- ID‚Ì‘Ì&“ª‚Ì•ûŒü•ÏX
-R 009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
- ˆÚ“®“™‚Å°ƒAƒCƒeƒ€‚ª‰æ–Ê“à‚É“ü‚Á‚Ä‚«‚½Žž
-R 009e <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
- item dropB‰½ŒÌ‚©009d‚ƃ}ƒX–Ú“àˆÊ’u&ŒÂ”‚ª“ü‚ê•Ï‚Á‚Ä‚¢‚é
-S 009f <ID>.l
- ID‚Ì°ƒAƒCƒeƒ€‚ðE‚¤
-R 00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B
- fail=02 Žæ“¾Ž¸”s?
- fail=06 ƒ‹[ƒgŒ –³‚µBŽæ“¾Ž¸”s
-R 00a1 <ID>.l
- ID‚Ì°ƒAƒCƒeƒ€Á‹Ž
-S 00a2 <index>.w <amount>.w
- Š—LƒAƒCƒeƒ€‚ð—Ž‚·
-R 00a3 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
-R 00a4 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- Š—L‘•”õƒŠƒXƒg
-R 00a5 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
-R 00a6 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
-S 00a7 <index>.w <ID>.l
- ŠŽƒAƒCƒeƒ€index‚ðŽg—p‚·‚éBID‚ÍŽ©•ª‚Ì‚Ý?
-R 00a8 <index>.w <amount>.w <type>.B
- ƒAƒCƒeƒ€Žg—p‰ž“šBtype=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
- type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
-S 00a9 <index>.w <equip type>.w
- ƒAƒCƒeƒ€‘•”õ
-R 00aa <index>.w <equip point>.w <type>.B
- ƒAƒCƒeƒ€‘•”õ‰ž“šBtype=00‚Ìꇑ•”õŽ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
-S 00ab <index>.w
- ‘•”õ‰ðœ
-R 00ac <index>.w <equip point>.w <type>.B
- ‘•”õ‰ðœ‰ž“šBtype=00‚Ìꇎ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
-R 00af <index>.w <amount>.w
- ƒAƒCƒeƒ€”Œ¸­BamountŒÂ‚¾‚¯Œ¸‚ç‚·
-R 00b0 <type>.w <val>.l
- FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
- 0000:speed 0003:ˆ«s’l 0004:ƒ}ƒi[ƒ|ƒCƒ“ƒg 0005:HP 0006:MaxHP
- 0007:SP 0008:MaxSP 0009:ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg 000b:ƒx[ƒXƒŒƒxƒ‹
- 000c:ƒXƒLƒ‹ƒ|ƒCƒ“ƒg 0018:d—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
- 0019:Å‘åd—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
- 0029:ATK‘O 002a:ATKŒã 002b:MATK‘O 002c:MATKŒã
- 002d:DEF‘O 002e:DEFŒã 002f:MDEF‘O 0030:MDEFŒã
- 0031:HIT 0032:FLEE‘O 0033:FLEEŒã 0034:ƒNƒŠƒeƒBƒJƒ‹
- 0035:ASPD(2ms’PˆÊ‚ÌŽžŠÔ?) 0037:ƒWƒ‡ƒuƒŒƒxƒ‹
- 0082:“ä ATKŒã‚Æ“¯‚¶”Žš?
-R 00b1 <type>.w <val>.l
- FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
- 0001:ƒx[ƒX‘¤ŒoŒ±’l 0002:ƒWƒ‡ƒu‘¤ŒoŒ±’l 0014:zeny
- 0016:ƒx[ƒX‘¤•K—vŒoŒ±’l 0017:ƒWƒ‡ƒu‘¤•K—vŒoŒ±’l
- ƒÀ1‚Å‚Í00b0‚Íval‚ªshortA00b1‚Íval‚ªlong‚Æ‚¢‚¤Žg‚¢•ª‚¯‚ª‚ ‚Á‚½‚ñ‚¾‚¯‚Ç
- ¡‚Æ‚È‚Á‚Ä‚Í·‚ª–³‚­‚È‚Á‚ÄA–Ó’°‚Ý‚½‚¢‚È‚à‚Ì?
-S 00b2 <type>.B
- type=00 Ž€–SŽžƒŠƒXƒ^[ƒg
- type=01 ƒLƒƒƒ‰ƒZƒŒ—v‹
-R 00b3 <type>.B
- type=01 ƒLƒƒƒ‰ƒZƒŒ‰ž“š
-R 00b4 <len>.w <ID>.l <str>.?B
- ID‚ÌNPC‚©‚ç‚̃ƒbƒZ[ƒW
-R 00b5 <ID>.l
- ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"NEXT"ƒAƒCƒRƒ“‚ðo‚·
-R 00b6 <ID>.l
- ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"CLOSE"ƒAƒCƒRƒ“‚ðo‚·
-R 00b7 <len>.w <ID>.l <str>.?B
- ID‚ÌNPC‚̉ï˜b‚Å‘I‘ð€–Ú•\Ž¦BŠe€–Ú‚Í':'‚Å‹æØ‚ç‚ê‚é
-S 00b8 <ID>.l <select>.B
- ID‚ÌNPC‚̉ï˜b‚Ì‘I‘ðBŠe€–ڂɇ‚É1`‚ªU‚ç‚ê‚éBff‚ŃLƒƒƒ“ƒZƒ‹?
-S 00b9 <ID>.l
- ID‚ÌNPC‚Ƃ̉ï˜bBNEXTƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½
-S 00bb <type>.w <amount>.B
- ƒXƒe[ƒ^ƒXup—v‹Btype‚Í000d‚©‚ç0012‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
-R 00bc <type>.w <fail>.B <val>.B
- ƒXƒe[ƒ^ƒXup‰ž“šBfail=01‚Ȃ笌÷Btype‚Í00bb‚Æ“¯‚¶Bval‚Íã‚Á‚½Œã‚Ì”Žš
- Ž¸”s—á‚ÍŒ©‚½Ž––³‚¢‚Ì‚Å“äBƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‘«‚è‚È‚¢ó‘Ô‚Å
- 00bb‚ð”­s‚Å‚«‚éƒNƒ‰ƒCƒAƒ“ƒg‚ª—L‚ê‚ÎAfail=00‚É‚È‚é‚Ì‚Å‚Í‚È‚¢‚©‚Æ—\‘z
-R 00bd <status point>.w <STR>.B <STRupP>.B <AGI>.B <AGIupP>.B <VIT>.B <VITupP>.B <INT>.B <INTupP>.B <DEX>.B <DEXupP>.B <LUK>.B <LUKupP>.B <ATK>.w <ATKbonus>.w <MATKmax>.w <MATKmin>.w <DEF>.w <DEFbonus>.w <MDEF>.w <MDEFbonus>.w <HIT>.w <FLEE>.w <FLEEbonus>.w <critical>.w ?.w
- ‚܂Ƃ߂ăXƒe[ƒ^ƒXî•ñ‚ð‘—‚éƒpƒPƒbƒg
-R 00be <type>.w <val>.B
- •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgXVƒpƒPƒbƒgBtype‚Í0020`0025‚ª‡‚ÉSTR`LUK‚ɑΉž
-S 00bf <type>.B
- ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚·Btype‚Í00-0c(,0d)‚ªALT+1`ALT+9,ALT+0,ƒ`ƒ‡ƒL,ƒO[,ƒp[(,ŠØ‘Šø)‚ɑΉž
- 00=! 01=? 02=‚¤‚ꂵ‚¢(ô) 03=ƒn[ƒg 04=Š¾ 05=‚ ‚Í‚Í(“d‹…)
- 06=‚¢‚₾‚È(”) 07=“{‚è(‚à‚â‚à‚â)08=‚¨‹à() 09=c 0a=ƒ`ƒ‡ƒL
- 0b=ƒO[ 0c=ƒp[ 0d=ŠØ‘Šø 0e=‘å‚«‚¢ƒn[ƒg 0f=‚ ‚肪‚Æ‚¤(thanks)
- 10=–³”O 11=‚²‚ß‚ñ(sorry) 12=΂¢ 13=Š¾‚©‚« 14=‚ ‚Ì
- 15=Å‚(GoodJob)16=ƒLƒ‡ƒƒLƒ‡ƒ 17=ƒVƒ‡ƒbƒN 18=‚Ü‚é 19=ƒoƒc
- 1a=ƒwƒ‹ƒv(help) 1b=go 1c=‚¦[‚ñ 1d=‚­‚·‚­‚· 1e=‚¿‚ã
- 1f=‚¿‚ã‚¿‚ã 20=‚Ó‚ñ 21=‚¤‚ñ‚¤‚ñ
-R 00c0 <ID>.l <type>.B
- ID‚Ìl‚ªƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚½Btype‚Í00bf‚Æ“¯‚¶
-S 00c1
- loginl”–â‚¢‡‚킹
-R 00c2 <val>.l
- loginl”‰ž“š
-R 00c3 <ID>.l <type>.B <val>.B
- Œ©‚½–Ú•ÏXBtype‚Í00‚Å–{‘Ì(“]EŽž“™)A02‚ª•ŠíA03‚ª“ª(‰º)A04‚ª“ª(ã)A05‚ª“ª(’†)A08‚ª‚
-R 00c4 <ID>.l
- ˜b‚©‚¯‚½NPC‚ª¤l‚¾‚Á‚½‚Ì‚Åbuy/sell‘I‘ð‘‹o
-R 00c5 <ID>.l <type>.B
- buy/sell‘I‘ðBtype=00‚È‚çbuyBtype=01‚È‚çsell
-R 00c6 <len>.w {<value>.l <DCvalue>.l <type>.B <item ID>.w}.11B*
- NPC‚Ì‚¨“Xbuy‘I‘ðŽžBDCvalue‚ͤlDCŒã‚Ì’l’i
-R 00c7 <len>.w {<index>.w <value>.l <OCvalue>.l}.10B*
- NPC‚Ì‚¨“Xsell‘I‘ðŽžBOCvalue‚ͤlOCŒã‚Ì’l’i
-S 00c8 <len>.w {<amount>.w <item ID>.w}.4B*
- NPC‚Ì‚¨“X‚©‚甃‚¤
-S 00c9 <len>.w {<index>.w <amount>.w}.4B*
- NPC‚Ì‚¨“X‚É”„‚é
-R 00ca <type>.B
- NPC‚©‚çw“üI—¹Btype=00¬Œ÷
-R 00cb <type>.B
- NPC‚Ö”„‹pI—¹Btype=00¬Œ÷
-S 00cc <ID>.l
- GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽg—p
-R 00cd <IDH>.l
- GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹v‚̉ž“š
- <ID>‚ª0‚Ìꇂ͎¸”s‚Æ•\Ž¦B(‚±‚̃pƒPƒbƒg‚Í‚½‚¾‚̉ž“š‚Å‚·BÚ‘±I—¹‚Ì‹@”\‚Í‚ ‚è‚Ü‚¹‚ñB)
-S 00cf <nick>.24B <type>.B
- type=00 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/ex nick)
- type=01 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/in nick)
-S 00d0 <type>len.B
- type=00 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/exall)
- type=01 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/inall)
-R 00d1 <type>.B <fail>.B
- fail=00 ”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
- fail=01 ”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
-R 00d2 <type>.B <fail>.B
- fail=00 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
- fail=01 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
-S 00d5 <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
- ƒ`ƒƒƒbƒg—§‚ÄB‚±‚±‚©‚çƒ`ƒƒƒbƒgŠÖŒW‚ª‘±‚­‚¯‚Ç’²‚ׂªŠÃ‚¢‚̂ŕ⊮‚æ‚ë
-R 00d6 <fail>.B
- ƒ`ƒƒƒbƒg—§‚ĉž“š
-R 00d7 <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
- ‰æ–Ê“àƒ`ƒƒƒbƒgî•ñ
-R 00d8 <chat ID>.l
- ƒ`ƒƒƒbƒgÁ‹Ž
-S 00d9 <chat ID>.l <passwd>.8B
- ƒ`ƒƒƒbƒgŽQ‰Á—v¿
-R 00da <fail>.B
- ƒ`ƒƒƒbƒgŽQ‰ÁŽ¸”s
-R 00db <len>.w <chat ID>.l {<index>.l <nick>.24B}.28B*
- ƒ`ƒƒƒbƒgŽQ‰ÁŽÒƒŠƒXƒg
-R 00dc <users>.w <nick>.24B
- ƒ`ƒƒƒbƒg‚Ö‚ÌŽQ‰ÁŽÒ’ljÁ(?)
-R 00dd <index>.w <nick>.24B <fail>.B
- ƒ`ƒƒƒbƒg‚©‚çŽQ‰ÁŽÒ”²‚¯
-S 00de <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
- ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX
-R 00df <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
- ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX¬Œ÷
-S 00e0 ?.l <nick>.24B
- ƒ`ƒƒƒbƒgƒ‹[ƒ€Š—LŽÒ•ÏX—v‹?
-R 00e1 <index>.l <nick>.24B
- ƒ`ƒƒƒbƒgŽQ‰ÁŽÒ”Ô†•t‚¯’¼‚µ?
-S 00e2 <nick>.24B
- ƒ`ƒƒƒbƒgkick
-S 00e3
- ƒ`ƒƒƒbƒg”²‚¯
-S 00e4 <ID>.l
- Žæ‚èˆø‚«—v‹
-R 00e5 <nick>.24B
- Žæ‚èˆø‚«—v¿Žó‚¯
-S 00e6 <type>.B
- type=03 Žæ‚èˆø‚«—v¿ok
- type=04 Žæ‚èˆø‚«—v¿ƒLƒƒƒ“ƒZƒ‹
-R 00e7 <fail>.B
- Žæ‚èˆø‚«—v‹‰ž“š
- fail=00 ‹——£‚ª‰“‰ß‚¬
- fail=03 —v¿Žó‚¯‚Ä‚­‚ꂽ
- fail=04 ƒLƒƒƒ“ƒZƒ‹‚³‚ꂽ?
-S 00e8 <index>.w <amount>.l
- ƒAƒCƒeƒ€’ljÁBindex=0‚Åzeny’ljÁB³‹KƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Ízeny‚Í00eb‚Ì’¼‘O‚Ì‚Ý
-R 00e9 <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
-R 00ea <index>.w <fail>.B
- fail=00 ƒAƒCƒeƒ€’ljÁ¬Œ÷
- fail=01 ’ljÁŽ¸”sB‘ŠŽè‘¤d—ʃI[ƒo
-S 00eb
- ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
-R 00ec <fail>.B
- fail=00 Ž©•ª‚©‚ç‚ÌokŽó—Ì
- fail=01 ‘ŠŽè‚©‚ç‚ÌokŽó—Ì
-S 00ed
- Žæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹
-R 00ee
- Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
-S 00ef
- Žæ‚èˆø‚«‹–‘ø(trade‰Ÿ‚µ)
-R 00f0
- Žæ‚èˆø‚«Š®—¹
-R 00f2 <num>.w <limit>.w
- ƒJƒvƒ‰‚³‚ñ‹–—eƒAƒCƒeƒ€ŒÂ”&Œ»ó
-S 00f3 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚ɃAƒCƒeƒ€•ú‚èž‚Ý
-R 00f4 <index>.w <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€’ljÁ
-S 00f5 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ—v‹
-R 00f6 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ‰ž“š
-S 00f7
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶—v‹
-R 00f8
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶‰ž“š
-S 00f9 <party name>.24B
- ƒp[ƒeƒB쬗v‹
-R 00fa <fail>.B
- ƒp[ƒeƒB쬉ž“š
- fail=00 uƒp[ƒeƒB[‚ðŒ‹¬‚µ‚Ü‚µ‚½Bv
- fail=01 u“¯‚¶–¼‘O‚̃p[ƒeƒB[‚ª‚ ‚è‚Ü‚·Bv
- fail=02 u‚·‚łɃp[ƒeƒB[‚ɉÁ“ü‚µ‚Ä‚¢‚Ü‚·Bv
-R 00fb <len>.w <party name>.24B {<ID>.l <nick>.24B <map name>.16B <leader>.B <offline>.B}.46B*
- ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‚Ä‘—‚è
-S 00fc <ID>.l
- ƒp[ƒeƒBŠ©—U‚·‚é
-R 00fd <nick>.24B <fail>.B
- fail=00 ‘ŠŽè‚ÍŠù‚Ƀp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚½
- fail=01 ‘ŠŽè‚É‹‘”Û‚³‚ꂽ
- fail=02 Š©—U¬Œ÷
-R 00fe <ID>.l <party name>.24B
- ƒp[ƒeƒB‚É—U‚í‚ꂽ
-S 00ff <ID>.l <fail>.l
- ƒp[ƒeƒB‚É—U‚í‚ꂽŽž‚Ì•Ô“šBfail=1 ok•Ô“š?
-S 0100
- ƒp[ƒeƒB’E‘Þ—v‹
-R 0101 <exp>.w <item?>.w
- ƒp[ƒeƒBݒ茻ó? exp=2‚Ìꇂ͌ö•½”z•ªÝ’莸”s?
-S 0102 <exp>.w <item?>.w
- ƒp[ƒeƒBÝ’è•ÏX
-R 0104 <ID>.l ?.l <X>.w <Y>.w <offline>.B <party name>.24B <nick>.24B <map name>.16B
- ƒp[ƒeƒB1l•ªî•ñXV
-R 0105 <ID>.l <nick>.24B <fail>.B
- nick‚³‚ñ‚ªƒp[ƒeƒB‚©‚ç—£’E
-R 0106 <ID>,l <HP>.w <MaxHP>.w
- ƒp[ƒeƒBƒƒ“ƒoHPXV
-R 0107 <ID>.l <X>.w <Y>.w
- ƒp[ƒeƒBƒƒ“ƒoˆÊ’uXV
-S 0108 <len>.w <message>.?B
- ƒp[ƒeƒB“à”­Œ¾
-R 0109 <len>.w <ID>.l <message>.?B
- ƒp[ƒeƒB“à”­Œ¾ŽóM
-R 010a <type ID>.w
- MVPƒAƒCƒeƒ€Žæ“¾
-R 010b <exp>.l
- MVPŒoŒ±’lŽæ“¾
-R 010c <ID>.l
- MVPƒLƒƒƒ‰•\Ž¦
-R 010e <skill ID>.w <lv>.w <sp>.w <range>.w <up>.B
- ƒXƒLƒ‹î•ñXVBsp‚Í–¢Žg—p?
-R 010f <len>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
- ƒXƒLƒ‹î•ñ‚̉òBskill name‚͈ꕔ—¬‚ê‚Ä—ˆ‚È‚¢•¨‚ª‚ ‚é„AL_PNEUMA,PR_SLOWPOISON“™
- target type‚Í0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•û
- lv=0 up=0‚Ìꇂ̓ŠƒXƒg‚Éo‚µ‚Ä‚È‚¢?
-R 0110 <skill ID>.w <basic type>.w ?.w <fail>.B <type>.B
- fail=00‚ÌŽž‚ɃXƒLƒ‹—˜—pŽ¸”s?
- type 00:basic type‚Ì•û 01:SP•s‘« 02:HP•s‘« 03:memo–³‚µ 04:delay’†
- 05:‚¨‹à–³‚µ(‚ß‚Ü[) 06:•Ší‚ª‚æ‚낵‚­‚È‚¢ 07:ÔƒWƒFƒ€–³‚µ 08:ƒWƒFƒ€–³‚µ 09:“ä
- basic type 00:Žæ‚èˆø‚« 01:emotion 02:À‚è 03:ƒ`ƒƒƒbƒg 04:ƒp[ƒeƒB
- 05:shout? 06:PK 07:ƒ}ƒi[ƒ|ƒCƒ“ƒg
-R 0111 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
- 010f‚Ì1‚•ªBƒÀ2‚¾‚Æ–¢Žg—p?
- 20040415“]EŽž‚ÉŠÏ‘ª
-S 0112 <skill ID>.w
- ƒXƒLƒ‹lvup—v‹
-S 0113 <level>.w <skill ID>.w <ID>.l
- ID‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
-R 0114 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <param3>.w <type>.B
- UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@
- type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
- type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
- type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
- type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
- type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
-R 0115 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <X>.w <Y>.w <param1>.w <param2>.w <param3>.w <type>.B
- ’e‚«”ò‚΂µ—L‚èUŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg
- type=05 ƒ_ƒ[ƒW&’e‚«”ò‚΂µBparam1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=06 ”šS’n? ­‚È‚­‚Æ‚àparam1‚̓Sƒ~‚Ì–Í—l
- type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
-S 0116 <level>.w <skill ID>.w <X>.w <Y>.w
- (X,Y)‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
-R 0117 <skill ID>.w <src ID>.l <val>.w <X>.w <Y>.w <server tick>.l
- ꊑŠŽè‚̃XƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦Bval‚̓Œƒxƒ‹‚©Aˆê•”ŒÅ‚³?(•X•Ç)
-S 0118
- UŒ‚ƒLƒƒƒ“ƒZƒ‹
-R 0119 <ID>.l <param1>.w <param2>.w <param3>.w ?.B
- Œ©‚½–Ú•ÏX
- param1=02 ƒtƒƒXƒgƒ_ƒCƒo‚Å“€‚è’Ђ¯?
- param2=01 “Å?
- param2=20 ANGELUSó‘Ô?
- param3=01 ƒTƒCƒg‚©ƒ‹ƒƒbƒ`?
- param3=0b ƒnƒCƒfƒBƒ“ƒOó‘Ô?
- param3=0b ƒNƒ[ƒLƒ“ƒOó‘Ô?
- param3=0d ƒJ[ƒg•t‚«
- param3=0e ‘é•t‚«
- param3=0f ƒyƒRƒyƒRæ‚è
-
-R 011a <skill ID>.w <val>.w <dst ID>.l <src ID>.l <fail>.B
- ”ñƒ_ƒ[ƒWŒnƒXƒLƒ‹•\Ž¦Bƒq[ƒ‹‚Ìê‡val‚͉ñ•œ—Ê
- fail=00‚Ìꇎ¸”s‚Û‚¢‚ªAƒXƒ`[ƒ‹ˆÈŠO‚Å‚ÍŒ©‚½Ž––³‚µ
-S 011b <skill ID>.w <map name>.16B
- 011c‚ւ̉ž“šBŽg‚í‚È‚¢ê‡"cancel"Aƒ}ƒbƒv“àƒ‰ƒ“ƒ_ƒ€‚Ìê‡"Random"‚ð‘—‚é
-R 011c <skill ID>.w <map1>.16B <map2>.16B <map3>.16B <map4>.16B
- ƒeƒŒƒ|/ƒ|ƒ^‚ÌꊑI‘ðB
- ƒeƒŒƒ|‚Ìê‡ARandom/ƒZ[ƒuêŠAƒ|ƒ^‚Ìê‡AƒZ[ƒuêŠ/memo1/memo2/memo3‚Æ‚È‚é
- ƒ}ƒbƒv–¼‚Ì‚Ý‘—‚ç‚ê‚é
-S 011d
- Œ»Ý‹‚éŠ‚ðƒƒ‚—v‹
-R 011e <fail>.B
- fail=00 ƒƒ‚¬Œ÷
- fail=01 ƒƒ‚Ž¸”s
-R 011f <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B
- ƒXƒLƒ‹Œø”\’nì¬
- type 7e:SW 7f:‰Î•Ç 80:ƒ|ƒ^”­“®’† 81:ƒ|ƒ^”­“®‘O 83:ƒTƒ“ƒN 85:ƒtƒjƒ…[ƒ}
- 86:ƒo[ƒ~ƒŠƒIƒ“ 8c:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®Žž 8d:•X•Ç 8e:‚­‚ ‚®‚Ü‚¢‚â[ 91:‚ ‚ñ‚­‚é‚·‚Ë‚ 
- 93:‚ç‚ñ‚Ç‚Ü‚¢‚ñ 97:?? 99:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®‘O
- ‘¼î•ñ‹‚Þ
-R 0120 <ID>.l
- ƒXƒLƒ‹Œø”\’nÁ‹Ž
-R 0121 <num>.w <num limit>.w <weight>.l <weight limit>l
- ƒJ[ƒg‚ÌŽí—Þ&d‚³‚ÌŒ»Ý’l&ãŒÀ
-R 0122 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- ƒJ[ƒg“àƒAƒCƒeƒ€B‘•”õ•i
-R 0123 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
-R 0124 <index>.w <amount>.l <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
-R 0125 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
-S 0126 <index>.w <amount>.l
- ƒJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚é
-S 0127 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðŽæ‚èo‚·
-S 0128 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‚©‚çƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
-S 0129 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒJƒvƒ‰‚³‚ñ‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
-R 012c <fail>.B
- fail=00 ud—ʃI[ƒo[‚Å‚·Bv
- fail=01 uƒAƒCƒeƒ€Å‘åŽí—Þ”‚𒴉߂µ‚Ü‚µ‚½Bv
-R 012d <num>.w
- ˜I“XŠJÝBƒAƒCƒeƒ€ƒŠƒXƒg—v‹Bnum‚Í’u‚¯‚éÅ‘å”
-S 012e
- ˜I“X•Â½
-S 012f <len>.w <message>.80B {<index>.w <amount>.w <value>.l}.8B*
- ˜I“XŠJÝA˜I“X–¼&ƒAƒCƒeƒ€,’l’iƒŠƒXƒg
-S 0130 <ID>.l
- ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
-R 0131 <ID>.l <message>.80B
- ˜I“XŠÅ”•\Ž¦
-R 0132 <ID>.l
- ˜I“XŠÅ”ÂÁ‹Ž
-R 0133 <len>.w <ID>.l {<value>.l <amount>.w <index>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B
- ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
-S 0134 <len>.w <ID>.l {<amount>.w <index>.w}.4B*
- ˜I“XƒAƒCƒeƒ€w“ü
-R 0135 <index>.w <amount>.w <fail>.B
- ˜I“XƒAƒCƒeƒ€w“üŽ¸”sB
- fail=1 u‚¨‹à‚ª‘«‚è‚Ü‚¹‚ñBv
- fail=2 ud—ʃI[ƒo[‚Å‚·Bv
-R 0136 <len>.w <ID>.l {<value>.l <index>.w <amount>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B*
- ˜I“XŠJݬŒ÷
-R 0137 <index>.w <amount>.w
- ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
-R 0139 <ID>.l <X>.w <Y>.w <X2>.w <Y2>.w <range>.w
- ID‚Ì“G‚Í(X,Y)‚É‹‚ÄŽ©•ª‚Í(X2,Y2)‚É‹‚é‚Ì‚ÅUŒ‚‚ª“Í‚«‚Ü‚¹‚ñ‚Å‚µ‚½
- UŒ‚‰Â”\‹——£‚Írange‚È‚Ì‚ÅA‹ßŠñ‚Á‚ĉº‚³‚¢?
-R 013a <val>.w
- UŒ‚ŽË’ö
-R 013b <type>.w
- ŠeŽíƒƒbƒZ[ƒW•\Ž¦B3=–‘•”õ‚Å‚«‚Ü‚µ‚½
-R 013c <ID>.w
- ‘•”õ‚³‚ꂽ–î‚ÌItemIDB0‚ÅA–¢‘•”õó‘ÔB
-R 013d <type>.w <val>.w
- HP‰ñ•œƒXƒLƒ‹/SP‰ñ•œƒXƒLƒ‹‚É‚æ‚é‰ñ•œ
- type=5‚È‚çHP type=7‚È‚çSP
-R 013c <index>.w
- ‘•”õ‚µ‚Ä‚¢‚é–î
-
-R 013e <src ID>.l <dst ID>.l <X>.w <Y>.w <lv?>.w ?.w <wait>.l
- ƒXƒLƒ‹‰r¥’†BPC/NPC‚ª‘ŠŽè‚ÌꇂÍ(X,Y)‚Í0Bꊂªƒ^[ƒQƒbƒg‚ÌꇂÍdst ID‚Í0‚É‚È‚é
-
- 0x013e ‚Ì offset+16(dword) ‚̓XƒLƒ‹‘®«‚Å‚·(’²¸Ï)B
- 00:–³ 01:… 02:’n 03:‰Î 04:•— 05:“Å 06:¹ 07:ˆÃ 08:”O 09:Ž€
- «—ˆ“I‚ÉA‰r¥’†‚̃GƒtƒFƒNƒg‚ª‘®«‚Å•Ï‚í‚é‚Ì‚©‚ÆB
-
- wait‚Íms’PˆÊ‚©‚È?
-R 0141 <type>.l <base>.l <bonus>.l
- ƒXƒe[ƒ^ƒXî•ñBtype‚Í0d‚©‚ç12‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
- base+bonus‚Æ•\Ž¦‚³‚ê‚é
-R 0142 <ID>.l
- ”’l“ü—Í—p‘‹•\Ž¦
-S 0143 <ID>.l <amount>.l
- 0142‚Ì‘‹‚É“ü—Í‚µ‚½”’l‚Ì‘—M
-R 0144 <ID>.l <type>.l <X>.l <Y>.l <point ID>.B <color>.3B ?.B
- ˆÄ“àˆõ—pAƒ}ƒbƒvãƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg
- type=1 ƒAƒCƒRƒ“‚ð•\Ž¦
- type=2 ƒAƒCƒRƒ“‚ðÁ‹Ž
-R 0145 <file name>.16B <type>.B
- (¡‚ÌŠ)ƒJƒvƒ‰‚³‚ñcutin•\Ž¦
- type=02 •\Ž¦
- type=ff Á‹Ž
-S 0146 <ID>.l
- ID‚ÌNPC‚Ƃ̉ï˜bBCLOSEƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½Back–³‚µ‚ÉNPCƒƒbƒZ[ƒWƒEƒBƒ“ƒh‚𓯎ž‚ɕ‚¶‚é
-R 0147 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
- ƒAƒCƒeƒ€—˜—p‚ÌŒ‹‰ÊˆêŽž“I‚É“¾‚ç‚ꂽƒXƒLƒ‹î•ñ
-R 0148 <ID>.l
- ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Ì‘ŠŽèŒˆ‚ß? @ ƒÀ1
-S 0149 <ID>.l <type>.B <time>.w
- ID‚Ƀ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð•t‰Á type=0 ƒ}ƒCƒiƒX type=1 ƒvƒ‰ƒX
- tyme‚Í•ª’PˆÊ
-R 014a <fail>.l
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚½Œ‹‰ÊBfail=0 ¬Œ÷ fail=1 Ž¸”s
-R 014b <type>.B <nick>.24B
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð–á‚Á‚½Btype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
-R 014C <len>.w (<type>.l <guildID>.l <guild name>.24B).*
- “¯–¿E“G‘΃Mƒ‹ƒh•\Ž¦
- type=0 “¯–¿
- type=1 “G‘Î
-S 014D
- ƒMƒ‹ƒhî•ñ•\Ž¦ŠJŽnH
-R 014E <type?>.l
- type=0x57 ˆê”ʃMƒ‹ƒh’cˆõ
- type=0xD7 ƒMƒ‹ƒhƒ}ƒXƒ^[
-S 014F <page>.l
- ƒMƒ‹ƒh•\Ž¦ƒ^ƒu‘—M
-R 0150 <guildID>.l <guildLv>.l <Ú‘±”>.l <’èˆõ>.l <Avl.lvl>.l <ŒoŒ±’l>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«Œü¶‰EVW>.l <«Œü㉺RF>.l <l”H>.l <guild name>.24B <guild master>.24B <–{‹’’n>.16B
- ƒMƒ‹ƒhî•ñ
-S 0151 <guild ID>.l
- ƒGƒ“ƒuƒŒƒ€—v‹
-R 0152 <len>.w <guild ID>.l <emblem ID(•ÏX‰ñ”H)>.l <emblem data>.?B
- ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW‘—•t
-S 0153 <len>.w <emblem data>.?B
- ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW•ÏX
-R 0154 <len>.w {<accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l <ƒƒ‚H>.50B <nick>.24B}*
- ƒMƒ‹ƒhƒƒ“ƒoƒŠƒXƒg
-S 0155 <len>.w {<accID>.l <charaID>.l <index>.l}.12B*
- –ðE•ÏX
-R 0156 <len>.w {<accID>.l <charaID>.l <index>.l}.12B*
- –ðE•ÏX’Ê’m
-S 0159 <guildID>.l <accID>.l <charID>.l <mess>.40B
- ƒMƒ‹ƒh’E‘Þ‘—M
-R 015A <nic>.24B <mess>.40B
- ƒMƒ‹ƒh’E‘Þ(‘Sˆõ)ŽóM
-S 015B <guildID>.l <accID>.l <charID>.l <mess>.40B
- ƒMƒ‹ƒh’Ç•ú‘—M
-R 015C <nick>.24B <mess>.40B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B
- ƒMƒ‹ƒh’Ç•úi‘SˆõjŽóM
-S 015D <guild name>.24B <?>.16B
- ƒMƒ‹ƒh‰ðŽU
-R 015E <fail>.l
- ƒMƒ‹ƒh‰ðŽU³”Û’Ê’m
- 0x00F¬Œ÷
- 0x01FZ–¯“o˜^”Ô†•sˆê’v
-R 0160 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l}.16B
- EˆÊî•ñ
-S 0161 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l <nickname>.24B}.40B*
- EˆÊ•ÏX
-R 0162 <len>.w <skill_point>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
- ƒMƒ‹ƒhƒXƒLƒ‹
-R 0163 <len>.w { <nick>.24B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B <’Ç•ú——R>.40B }.88B*
- ƒMƒ‹ƒh’Ç•úƒŠƒXƒg
-S 0165 <myaccID>.l <guild name>.24B
- ƒMƒ‹ƒhì¬
-R 0166 <len>.w {<index>.l <name>.24B }.28B*
- EˆÊ–¼ƒŠƒXƒg
-R 0167 <type>.b
- ƒMƒ‹ƒh쬇”Û
- type = 0 ƒMƒ‹ƒh쬬Œ÷
- type = 1 ‚·‚łɃMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚é
- type = 2 “¯–¼‚̃Mƒ‹ƒh‚ª‚ ‚é
- type = 3 ƒGƒ“ƒyƒŠƒEƒ€–³‚µ
-S 0168 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
- ƒMƒ‹ƒhŠ©—U
-R 0169 <type>.B
- ƒMƒ‹ƒhŠ©—UŒ‹‰Ê
- type = 0 ‘¼‚̃Mƒ‹ƒh‚ɉÁ“ü‚µ‚Ä‚¢‚é
- type = 1 ‹‘”Û‚³‚ꂽ
- type = 2 ‰Á“ü‚µ‚½
- type = 3 ’èˆõ‚ð’´‰ß
-R 016A <guild ID>.l <guild name>.24B
- ƒMƒ‹ƒhŠ©—U‚³‚ꂽ
-S 016B <guild ID>.l <type>.l
- ƒMƒ‹ƒhŠ©—U•ÔM
- type=0 ‹‘”Û‚·‚é
- type=1 ‹–‘ø‚·‚é
-R 016c <guild ID>.l <emblem ID>.l <mode>.l ?.5B <guild name>.24B
- loginŽžƒMƒ‹ƒhî•ñ
- mode=Ž©•ª‚ÌŠ‘®EˆÊ‚Ìmode
-R 016d <ID>.l <charactor ID>.l <online>.l
- ƒMƒ‹ƒhƒƒ“ƒo‚ªlogin‚µ‚½”²‚¯‚½“™
-S 016E <guildID>.l <mess1>.60B <mess2>.120B
- ƒMƒ‹ƒh’mÝ’è
-R 016F <mess1>.60B <mess2>.120B
- ƒMƒ‹ƒh’m
-S 0170 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
- “¯–¿—v¿Š©—U
-R 0171 <SorceAccID>.l <guild name>.24B
- “¯–¿—v¿Š©—U‚³‚ꂽ
-S 0172 <SorceAccID>.l <type>.l
- “¯–¿—v¿•ÔM
- type=0 ‹‘”Û‚·‚é
- type=1 ‹–‘ø‚·‚é
-R 0173 <type>.B
- type = 0 ‚·‚Å‚É“¯–¿ŠÖŒW
- type = 1 “¯–¿‹‘”Û‚³‚ꂽ
- type = 2 “¯–¿¬Œ÷
- type = 3 ‘ŠŽèƒMƒ‹ƒh‚Ì“¯–¿ƒMƒ‹ƒh”‚ª’´‰ß
- type = 4 Ž©•ª‚̃Mƒ‹ƒh‚Ì“¯–¿ƒMƒ‹ƒh”‚ª’´‰ß
-R 0174 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l <nickname>.24B}.40B*
- EˆÊ•ÏX’Ê’m
-R 0177 <len>.w <index>.w*
- ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg
-S 0178 <index>.w
- ƒAƒCƒeƒ€ŠÓ’è
-R 0179 <index>.w <fail>.B
- ƒAƒCƒeƒ€ŠÓ’茋‰ÊBfail=00‚ŬŒ÷Bfail=01‚Á‚Ä‚ ‚é‚Ì‚©?
-S 017A <index>.w
- ƒJ[ƒh‚vƒNƒŠƒbƒN
-R 017B <len>.w {<index>.w}*
- ƒJ[ƒh‘}“ü‚Å‚«‚éƒAƒCƒeƒ€Index”Ô†
-S 017C <SrcIndex>.w <DescIndex>.w
- Src ‚ðDesc‚É“Ë‚Áž‚Þ
-R 017D <DescIndex>.w <SrcIndex>.w <fail>.b
- Src ‚ðDesc‚É“Ë‚Áž‚Ý<fail> 0=¬Œ÷ 1=Ž¸”sH
-S 017e <len>.w <message>.?B
- ƒMƒ‹ƒh“àƒƒbƒZ[ƒW”­Œ¾
-R 017f <len>.w <message>.?B
- ƒMƒ‹ƒh“àƒƒbƒZ[ƒWŽóM
-S 0180 <charactorID>.l
- ƒMƒ‹ƒh“G‘Î
-R 0181 <flag>.b
- ƒMƒ‹ƒh“G‘Ή”Û
- flag=0 “G‘άŒ÷
- flag=1 “G‘΃Mƒ‹ƒh”‚ª‘½‚·‚¬‚é
- flag=2 ‚·‚Å‚É“G‘Ί֌W
-R 0182 <accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l ?.50B <nick>.24B
-
-S 0183 <guild_id>.l <type>.l
- ƒMƒ‹ƒhŠÖŒW‰ðÁ
-R 0184 <guild_id>.l <type>.l
- ƒMƒ‹ƒhŠÖŒW‰ðÁ’Ê’m
-R 0185 <flag>.l <guild_id>.l <guild_name>.24B
- ƒMƒ‹ƒhŠÖŒW’ljÁ flag=0 “¯–¿/ 1 “G‘Î
-R 0187 <account ID>.l
- aliveM†?
-R 0188 <fail?>.w <index>.w <val>.w
- •Ší¸˜BBŒ‹‰Ê+val•Ší‚É
-R 0189 <fail?>.w
- “äBƒeƒŒƒ|(ƒ[ƒvƒ|[ƒ^ƒ‹memo)Ž¸”s?
- 1 memo‹ÖŽ~’nˆæ
-S 018a ?.w
- ƒQ[ƒ€I—¹
-R 018b <fail>.w
- ƒQ[ƒ€I—¹/ƒLƒƒƒ‰ƒZƒŒ‰ž“šBfail=0¬Œ÷Bfail=1Ž¸”s?
-R 018C <MonsID>.w <“™‹‰>.w <‘å¬>.w <¶–½’l>.w <?>.w <–hŒä—Í>.w <Ží‘°>.w <–‚–@–hŒä—Í>.w <‘®«>.w <–‚–@‘Š«‘®«>.9b
- wiz‚Ì“G‚̃Zƒ“ƒXŒ‹‰Ê
- 0 ¬Œ^
- 1 ’†Œ^
- 2 ‘åŒ^
-R 018d <length>.w { <ItemID>,w ?.w <CharID?>.l }.8B*
- »‘¢‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg•\Ž¦(?‚Ì•”•ª‚Í0012ŒÅ’è)
-S 018e <MakeItemID>.w <slot1ItemID>.w <slot2ItemID>,w <slot3.ItemID>.w
- »‘¢ƒAƒCƒeƒ€‚Ì‘I‘ð
-R 018f <flag>.w [00] <MakeItemID>.w
- »‘¢Œ‹‰Ê(flag = 00‚Ȃ笌÷ 01‚Ȃ玸”s)
-S 0190 <skill lv>.w <skill code>.w <x & y>.l <message>.80b
- ƒƒbƒZ[ƒW(ƒg[ƒL[ƒ{ƒbƒNƒXj
-R 0191 <ID>.l <message>.80B
- ƒg[ƒL[ƒ{ƒbƒNƒX‚̃ƒbƒZ[ƒW
-R 0192 <x & y>.l <type>.w <mapname>.16b
- ƒAƒCƒXƒEƒH[ƒ‹“™‚É‚æ‚é’nŒ`‘®«•Ï‰»
-S 0193 <ID>.l
- ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«?
-R 0194 <ID>.l <nick>.24B
- ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«‰ž“š?
-R 0195 <ID>.l <nick>.24B <party name>.24B <guild name>.24B <class name>.24B
- ƒMƒ‹ƒhŠ‘®PC‚ÌꇂÌ0094•Ô“š
-R 0196 <type>.w <ID>.l
- ‘‹­ŒnƒXƒLƒ‹Žg—pŽž‚̃ƒbƒZ[ƒWFXBID‚Ítarget‚ÆŽv‚í‚ê‚邪Ž©•ª‘ŠŽè‚Ì‚Ý‚µ‚©—ˆ‚È‚¢?
- type=00 2HQ•t—^uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
- type=01 2HQ‰ðœuUŒ‚‘¬“x‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- type=02 IMPOSITIO•t—^u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
- type=03 IMPOSITIO‰ðœu•Ší‚ÌUŒ‚—Í‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- type=04 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- type=05 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- type=07 ASPERSIO•t—^u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- type=08 ASPERSIO‰ðœu•Ší‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- type=09 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- type=0a u–h‹ï‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- type=0b KYRIE•t—^uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½Bv
- type=0c KYRIE‰ðœuƒoƒŠƒAó‘Ô‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- type=0d uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- type=0e uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- type=0f uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- type=10 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- type=11 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- type=12 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
-R 0196 <type>.w <ID>.l <switch>.b iƒRƒ‚ƒhˆÈ~j
- switch=0‚ʼnðœ,1‚Å•t‰Á
- type=00 ƒvƒƒ{ƒbƒN
- type=01 ƒCƒ“ƒfƒ…ƒA
- type=02 uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bvi2HQj
- type=03 W’†—ÍŒüã
- type=04 ƒnƒCƒfƒBƒ“ƒO
- type=05 ƒNƒ[ƒLƒ“ƒO
- type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½BviƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“j
- type=07 u“ł𔽎˂ł«‚éó‘Ô‚É‚È‚è‚Ü‚µ‚½Bviƒ|ƒCƒYƒ“ƒŠƒAƒNƒgj
- type=08 uƒNƒ@ƒOƒ}ƒCƒAó‘Ô‚É‚È‚èAEEEv
- type=09 uƒGƒ“ƒWƒFƒ‰ƒXó‘Ô‚É‚È‚èAEEEv
- type=0a ƒuƒŒƒbƒVƒ“ƒO
- type=0b ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX
- type=0c u‘¬‚³‚ª‘‰Á‚µ‚Ü‚µ‚½vi‘¬“x‘‰Áj
- type=0d u‘¬‚³‚ªŒ¸­‚µ‚Ü‚µ‚½vi‘¬“xŒ¸­j
- type=0e uƒXƒ[ƒ|ƒCƒYƒ“ó‘Ô‚É‚È‚è‚Ü‚µ‚½viƒXƒ[ƒ|ƒCƒYƒ“j
- type=0f u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½viƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXj
- type=10 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½viƒTƒtƒ‰ƒMƒEƒ€j
- type=11 u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½viƒAƒXƒyƒ‹ƒVƒIj
- type=12 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½vi¹‘Ì~—Õj
- type=13 uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½viƒLƒŠƒGƒGƒŒƒCƒ\ƒ“j
- type=14 uƒ}ƒOƒjƒtƒBƒJ[ƒgó‘Ô‚É‚È‚è‚Ü‚µ‚½v
- type=15 uƒOƒƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½v
- type=16 uƒŒƒbƒNƒXƒG[ƒeƒ‹ƒió‘Ô‚É‚È‚è‚Ü‚µ‚½v
- type=17 uƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…ó‘Ô‚É‚È‚è‚Ü‚µ‚½v
- type=18 uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
- type=19 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
- type=1a uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
- type=1b ƒyƒRƒyƒR‹Ræ
- type=1c ‘é
- type=1d Ž€‚ñ‚¾‚Ó‚è
- type=1e u‹©‚Ñ‚Ü‚µ‚½viƒ‰ƒEƒhƒ{ƒCƒXj
- type=1f uƒGƒiƒW[ƒR[ƒgó‘Ô‚É‚È‚è‚Ü‚µ‚½v
- type=20 u–h‹ï‚ª‰ó‚ê‚Ü‚µ‚½v
- type=21 u•Ší‚ª‰ó‚ê‚Ü‚µ‚½v
- type=22 “äi–ڂ̃Aƒbƒv‚Æ‚¢‚¤ƒAƒCƒRƒ“F–Ó–ÚHHj
- type=23 d—Ê50“’´‚¦
- type=24 d—Ê90“’´‚¦
- type=25 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
- type=26 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
- type=27 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
- type=28 (–¢Žg—p‚Á‚Û‚¢HF•s‰Â‚Ɖðœ‚ÅŒø‰Ê‚ªˆá‚¤)
- type=29 “äu‘¬‚³‚ª‘‰Á‚µ‚Ü‚µ‚½vi”’‚¢ƒAƒCƒRƒ“j
- type=32 ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“
- type=33 ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh
- type=34 ƒXƒgƒŠƒbƒvƒA[ƒ}[
- type=35 ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€
- type=36 ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW
- type=37 ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- type=38 ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW
- type=39 ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW
- type=3a ƒI[ƒgƒK[ƒh
- type=3b ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh
- type=3d ƒvƒƒ”ƒBƒfƒ“ƒX
- type=3e ƒfƒBƒtƒFƒ“ƒ_[
- type=41 ƒI[ƒgƒXƒyƒ‹
- type=44 ƒXƒsƒAƒNƒBƒbƒPƒ“
- type=56 ”š—ô”g“®(ƒAƒCƒRƒ“‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñB)
- type=57 ‹à„(•\Ž¦‚Í‚³‚ê‚È‚¢‚ª‹à„‚̉ðœ‚Í‚³‚ê‚é‚悤‚Å‚·B)
- type=59 ƒRƒ“ƒ{ƒfƒBƒŒƒC
- type=5a ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[
- type=5b ƒtƒƒXƒgƒEƒFƒ|ƒ“
- type=5c ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
- type=5d ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
-
-S 0197 <type>.w
- type=0 /resetstate
- type=1 /resetskill
- Œø”\‚Í–³‚µ?
-R 0199 <type>.w
- type=1 pvpƒ‚[ƒhŠJŽn?
- type=3 gvgƒ‚[ƒhŠJŽn?
-R 019a <ID>.l <rank>.l <num>.l
- pvp‡ˆÊ rank/num
-R 019b <ID>.l <type>.l
- ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
- type=0 base lvup?
- type=1 job lvup?
- type=2 •Ší¸˜BŽ¸”s
- type=3 •Ší¸˜B¬Œ÷
-
-R 019d <?>.4B
- GMƒRƒ}ƒ“ƒh/hide
-
-S 0149 <ID>.l <type>.B <time>.w
- GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð‰º‚°‚éi‰ð‚¯‚éjvŽg—p ¨ type=00
- GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ðã‚°‚éiŠ|‚¯‚éjvŽg—p ¨ type=01
- time‚Í•ª’PˆÊ‚Å‚·iŠm‚©
-
-R 019e
- •ßŠlƒ‚ƒ“ƒXƒ^[Œˆ‚ß
-S 019f <ID>.l
- •ßŠlƒ‚ƒ“ƒXƒ^[Žw’è
-R 01a0 <fail>.B
- •ßŠl”»’è
- fail=01‚ŬŒ÷A00‚ÅŽ¸”s
-S 01a1 <param>.1B
- <param>
- 0x00Fƒyƒbƒgó‘Ô•\Ž¦
- 0x01F‰a‚ð—^‚¦‚é
- 0x02FƒpƒtƒH[ƒ}ƒ“ƒX
- 0x03F—‘‚É–ß‚·
- 0x04FƒAƒNƒZƒTƒŠ‰ðœ
-R 01a2 <pet name>.24B <name flag>.B <lv>.w <hungry>.w <friendly>.w <accessory>.w
- ƒyƒbƒg‚Ìó‘Ô
- name flag:00=–¼‘O–¢Ý’è 01=–¼‘OÝ’èÏ‚Ý(•ÏX•s‰Â)
- lv=ƒyƒbƒg‚̃Œƒxƒ‹Ahungry=–ž• “x(0~100)Afriendly=e–§“x(‰Šú’l250?)Aaccessory=ƒAƒNƒZƒTƒŠ‚ÌItemID
-R 01a3 <fail>.B <itemID>.w
- <fail>
- 0x00F‰a‚â‚莸”s
- 0x01F‰a‚â‚謌÷
-R 01a4 <type>.B <ID>.l <val>.l
- ƒyƒbƒgŠÖ˜A’Ê’m
- type=00,val=00 ƒyƒbƒg›z‰»Žž‚É‘—‚ç‚ê‚Ä‚­‚éBƒyƒbƒg”FŽ¯—pH
- type=01 e–§“x•Ï‰»
- type=02 –ž• “x•Ï‰»
- type=03 ƒAƒNƒZƒTƒŠ•Ï‰»(0‚Å–¢‘•”õ)
- type=04 ƒpƒtƒH[ƒ}ƒ“ƒX Šm”F‚³‚ꂽval=1~3
- (4‚̓XƒyƒVƒƒƒ‹ƒpƒtƒH[ƒ}ƒ“ƒXH)
- type=05 HŠm”F‚³‚ꂽval=0x14
-S 01a5 <pet name>.24B
- ƒyƒbƒg‚Ì–¼‘OŒˆ‚ß
-R 01a6 <len>.w <index>.w*
- ƒyƒbƒg‚Ì—‘ƒŠƒXƒg
-S 01a7 <index>.w
- ƒyƒbƒg‚Ì—‘ƒŠƒXƒg‚ª‘I‘ð‚³‚ê‚½
-S 01a9 <emotion>.l
- ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“‘—M
-R 01aa <ID>.l <emotion>.l
- ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“ŽóM
- <emotion>
- 33ˆÈ‰º‚Ì‚Æ‚«FƒGƒ‚[ƒVƒ‡ƒ“
- 34ˆÈã‚Ì‚Æ‚«F”­Œ¾ƒe[ƒuƒ‹H
-R 01ac <object id>.l
- ƒAƒ“ƒNƒ‹‚Ì”­“®(‚Ý’u)Žž‚Ì‚Ý–ˆ‰ñoŒ»(‹@”\‚Í“ä)
-R 01ad <len>.l <item>.w
- –îì‚è‚Ì쬉”\ITEM•\ŽóM
-S 01ae <itemID>.w
- –îì‚è‚ÅŽg‚¤Þ—¿‘—M
-S 01af <type>.w
- ƒ`ƒFƒ“ƒWƒJ[ƒgiƒJ[ƒg‘I‘ðj
- type=1 ƒm[ƒ}ƒ‹ƒJ[ƒg
-R 01b0 <monster id>.l <?>.b <new monster code>.l
- –û‚̃Nƒ‰ƒXƒ`ƒFƒ“ƒW
- <new monster code>‚̓`ƒFƒ“ƒWŒã‚̃R[ƒh(1001`)‚ðdword‚Å
-S 01b2 <len>.w <message>.80B <flag>.B {<index>.w <amount>.w <value>.l}.8B*
- ˜I“XŠJÝ
- flag F 0=ƒLƒƒƒ“ƒZƒ‹ , 1=ƒI[ƒvƒ“
-R 01b3 <filename>.64B <type>.B
- R 0145‚ÌãˆÊŒÝŠ·
-R 01B6 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l <now_exp>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«ŒüF-V>.l <«ŒüR-W>.l <members>.l <guild name>.24B <guild master>.24B <agit?>.20B
- ƒMƒ‹ƒhî•ñ
-R 01b9 <ID>.I
- ”íƒ_ƒ“™‚É‚æ‚éID‚̉r¥’†’f
-R 01c4 <index>.w <amount>.l <itemID>.w <item data>.12B
- ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€
-R 01c8 <index>.w <item ID>.w <ID>.l <amount left>.w <type>.B
- ƒAƒCƒeƒ€Žg—p‰ž“šB(00a8‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
- type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
-R 01c9 <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B ?.81b
- ƒXƒLƒ‹Œø”\’nì¬(011f‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type 0x7e:SWA0x7f:‰Î•ÇA0x80 ƒ|ƒ^ŠJ‚«’†A0x81 ƒ|ƒ^ŠJ‚«’¼‘O
- 0x82 ¹‘ÌA0x83 ƒTƒ“ƒNA0x84 ƒ}ƒOƒkƒXA0x85 ƒjƒ…[ƒ}
- 0x86 0x86 ‘å–‚–@(SG/MS/LoV/GX)A0x87 ƒtƒ@ƒCƒ„[ƒsƒ‰‘Ò‹@
- 0x88 ƒtƒ@ƒCƒ„[ƒsƒ‰”š”­A0x87`0x8B •\Ž¦–³‚µA
- 0x8c ƒg[ƒL[ƒ{ƒbƒNƒX(”­“®’†)A0x8D ƒAƒCƒXƒEƒH[ƒ‹
- 0x8E ƒNƒƒOƒ}ƒCƒAA0x8f ƒuƒ‰ƒXƒgƒ}ƒCƒ“A0x90 ƒXƒLƒbƒh
- 0x91 ƒAƒ“ƒNƒ‹A0x92 ƒxƒmƒ€ƒ_ƒXƒgA0x93 ƒ‰ƒ“ƒhƒ}ƒCƒ“
- 0x94 ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒvA0x95 ƒTƒ“ƒhƒ}ƒ“
- 0x96 ƒtƒ‰ƒbƒVƒƒ[A0x97 ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv
- 0x98 ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA0x99 ƒg[ƒL[ƒ{ƒbƒNƒX
- 0x9A ƒ{ƒ‹ƒP[ƒmA0x9B ƒfƒŠƒ…[ƒWA0x9C ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- 0x9D ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[A0x9E Zenyƒ}[ƒNA0x9F Zeny‘Ü
- 0xA0 ‰ñ‚é—΂̗ÖA0xA1 ƒsƒ“ƒN‚̉¹•„ (“ñ˜A•„—L‚è
- 0xA2 ^‚ñ’†‚É“_‚Ì‚ ‚éŒõ‚Ì‹ÊA0xA3 ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒO
- 0xA4 [•£‚Ì’†‚ÉA0xA5 ‰ñ‚é‚¢—ÖA0xA6 •s‹¦˜a‰¹
- 0xA7 Œû“JA0xA8 —[—z‚̃AƒTƒVƒ“ƒNƒƒXA0xA9 ƒuƒ‰ƒM‚ÌŽ
- 0xAA ƒCƒhƒDƒ“‚Ì—ÑŒçA0xAB Ž©•ªŸŽè‚ȃ_ƒ“ƒXA0xAC ƒnƒ~ƒ“ƒO
- 0xAD Ž„‚ð–Y‚ê‚È‚¢‚ÅcA0xAE ƒT[ƒrƒXƒtƒH[ƒ†[
- 0xAF ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒOA0xB0 •\Ž¦–³‚µ
- 0xB0 ƒOƒ‰ƒtƒBƒeƒB,
- 0xB1 ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“A0xB2`0xBF •\Ž¦–³‚µ
- 0xB2 ƒsƒ“ƒN‚̃[ƒvƒ|[ƒ^ƒ‹•—
- 0xB3 ¬‚³‚È\Žš‰Ë‚ª‚Ó‚æ‚Ó‚æ
- 0xB4 ƒoƒWƒŠƒJA0xB5 ƒGƒtƒFƒNƒg‚È‚µH
- 0xB6 •‚¢~‚ª—§‘Ì“I‚É•‚‚©‚Ñオ‚é
- 0xB7 ƒNƒ‚‚Ì‘ƒA0xB8` ƒGƒtƒFƒNƒg‚È‚µH
-
- ‘¼î•ñ‹‚Þ
- ?.81b‚Í“äB
-R 01cd (<sid>.l)x7
- ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆŽóM
- <sid>x7 ‚É‚Í NB,CB,FB,LB,SS,FBL,FD ‚̇‚ŃXƒLƒ‹ƒR[ƒh‚ªdword‚Å“ü‚é
- ‚Ü‚¾‘I‘ð‚Å‚«‚È‚¢ƒXƒLƒ‹‚Ì•”•ª‚Í <sid> = 0x00000000 ‚ª“ü‚é
-S 01ce <sid>.l
- ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆ‘—M
-R 01cf <crusader id>.l <target id>.l <?>.18b
- Œ£gó‘Ôƒ^[ƒQƒbƒgON/OFFBŒ£g‚ªØ‚ê‚é‚Æ <target id> ‚ª 0x00000000 ‚É‚È‚é
-
-R 01d0 <ID>.l <num>.w
- <num> : ‹CŒ÷‚Ì”(”ñLv)
-R 01d1 <monk id>.l <target monster id>.l <bool>.l
- ”’‰HŽæ‚èó‘ÔON/OFFB<bool> ‚Í”’nŽæ‚謗§Žž‚É 0x00000001 ‰ðœŽž‚É 0x00000000 ‚ª—ˆ‚é
-R 01d2 <id>.l <delay>.l
- ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC(msec)
- ŽO’iE˜A‘Å‚ÍŠî–{ƒfƒBƒŒƒC1000(+300)A–Ò—´‚ÍŠî–{ƒfƒBƒŒƒC700(+300)
-R 01d4 <ID>.l
- •¶Žš—ñ“ü—Í‘‹•\Ž¦(ID‚ÍNPC‚ÌID‚ª“ü‚é)
-S 01d5 <len>.w <ID>.l <input>.?B 00
- •¶Žš—ñ“ü—Í“à—e‘—M(ID‚ÍNPC‚ÌID‚ª“ü‚é)
-R 01d7 <ID>.l <equip point>.b <item id1>.w <item id2>.w
- ‘•”õƒOƒ‰ƒtƒBƒbƒN <equip point> ‚Í 02Žè‚Æ09‘«‚Ì‚ÝŠm”FBid2‚ͶŽè
-R 01d8 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w <head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B ?.B
- ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?(0078‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-R 01d9 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w.<head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B ?.B
- ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?(0079‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-R 01da <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.<item id1>.w <item id2>.w <head option bottom>.w <server tick>.l <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B ?.B
- •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ(007b‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-S 01db
- ˆÃ†‰»key—v‹
-R 01dc <len>.w <key>.?B
- ˆÃ†‰»key‘—•t
-S 01dd <version>.l <account name>.24B <md5 binary>.16B <version2>.1B
- id&ˆÃ†‰»Ï‚Ýpass‘—M
- ‡‚ɃNƒ‰ƒCƒAƒ“ƒg‚ª01db‚ð‘—‚éA
- ŽI‚ª01dc‚Åkey‚ð•Ô‚·A
- ƒNƒ‰ƒCƒAƒ“ƒg‚ª"<key><password>"‚ɂ‚¢‚Ämd5ŒvŽZ‚µ
- <md5 binary>‚ÌŠ‚ð–„‚ß‚Ä01dd‚ð‘—‚éB
- <passwordencrypt2>‚ÌŽž‚Í
- "<key><password>"‚ɑ΂µ‚Ämd5ŒvŽZ‚Æ‚µ‚Ä‚¢‚銂ð
- "<password><key>"‚Æ•ÏX‚·‚é
-R 01de <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.l <param2>.w <param3>.w <type>.B
- UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@(0114‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
- type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
- type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
- type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
- type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
-S 01df <ID>.|
- GM‰EƒNƒŠƒbƒN‚É‚æ‚éID‚̃`ƒƒƒbƒg‹ÖŽ~‰ñ”ŽQÆH
-R 01e1 <ID>.l <num>.w
- <num> : ‹CŒ÷‚Ì”(”ñLv) ˆê“x•\Ž¦‚µ‚½‚çŒã‚Ç‚ñ‚Ènum‚ª—ˆ‚Ä‚à–³Ž‹‚³‚ê‚éB
-R 01e6 <partner name>.24B
- Œ‹¥ƒXƒLƒ‹‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž‚Ì‹©‚Ѻ
-S 01e7
- ƒXƒpƒmƒr‚Å/doridori‚µ‚½‚ç”ò‚ñ‚Å‚­‚éBSPR‰ñ•œ—Ê2”{ƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
-S 01e8 <party name>.24B <item1>B <item2>B
- <item1>ƒAƒCƒeƒ€ŽûW•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒBŒö—L
- <item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒB‚É‹Ï“™•ª”z
- (00f9‚ÌãˆÊƒo[ƒVƒ‡ƒ“)
-R 01ea <ID>.l
- Œ‹¥ƒGƒtƒFƒNƒg(‰¹ŠyAŽ†á)
- ID‚ÍV•w‚Ì‚à‚Ì‚ª“ü‚éH
-S 01ed
- ƒXƒpƒmƒr‚ª”š—ô”g“®‚É‚È‚éƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
-R 01ee <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
- –î‚ÌꇂÍ?.2B‚ª0x8000‚É‚È‚é
- 00a3‚©‚ç•ÏX
-R 01ef <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
- 0123‚©‚ç•ÏX
-R 01f0 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
- 00a5‚©‚ç•ÏX
-R 01f4 <name>.24B <trade id?>.L <LV>.w
- æ•û‚©‚çŽæˆø—v¿
- 00e5‚©‚ç•ÏX
-R 01f5 <result>.B <trade id?>.L <LV>.w
- ‚±‚¿‚ç‚©‚ç‚ÌŽæˆø—v¿‚ɑ΂·‚锽‰ž
- 00e7‚©‚ç•ÏX
-S 0200 <login name>.24B
- ragexe‚É/accountƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚Ä‹N“®‚·‚é‚ƃƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒg
-S 0204 <?>.16B
- ƒƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB16ƒoƒCƒg‚͌ŒèH
-S 020B <?>.17B
- ƒLƒƒƒ‰ƒNƒ^ƒT[ƒoÚ‘±—v‹0065‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB1+0204‚Ì16ƒoƒCƒg‚Å17ƒoƒCƒgH
+Client Version in date format (Client Version in 4 digit format):
+2004 06 28a (0628a)
+2004 10 25 (1025)
+2004 11 01 (1101)
+2004 12 13 (1213)
+2005 01 10 (0110)
+2005 03 15 (0315)
+2005 03 21 (0321)
+2005 04 04 (0404)
+2005 04 06 (0406)*
+2005 04 11a (0411a)
+2005 04 25a (0425a)
+2005 05 31b (0531b)
+2005 06 14 (0614)
+2005 06 28a (0628a)
+2005 08 08 (0808)
+
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#0x0040
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2,
+ 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
+#0x0080
+ 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0,
+ 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
+ 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
+ 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
+#0x00C0
+ 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 6, 2, 27,
+ 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
+ 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
+ 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
+#0x0100
+ 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
+ 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
+ 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
+ 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
+#0x0140
+ 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6,
+ 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
+ -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182,
+ 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
+#0x0180
+ 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
+ 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, 4, 6, 2, 6,
+ 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4,
+ 11, 7, -1, 67, 12, 18,114, 6, 3, 6, 26, 26, 26, 26, 2, 3,
+#0x01C0
+ 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 29, 6, 28,
+ 8, 14, 10, 35, 6, 8, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6,
+ 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1,
+ -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10,
+#0x200
+ 26, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 19,
+
+S ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚Ä‘—M
+R ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚ÄŽóM
+
+B ƒoƒCƒg
+w ƒ[ƒh=2B
+l ƒƒ“ƒOƒ[ƒh=4B
+* 0ŒÂˆÈã‚­‚è‚©‚¦‚µ
+
+S 0064 <version>.l <account name>.24B <password>.24B <version2>.B
+ ƒAƒJƒEƒ“ƒgID&ƒpƒXƒ[ƒh‘—M
+S 0065 <account ID>.l <login ID1>.l <login ID2>.l ?.2B <sex>.B
+ ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±—v‹
+S 0066 <charactor number>.B
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ð—v‹
+S 0067 <charactor name>.24B <param etc>.11B
+ ƒLƒƒƒ‰ƒNƒ^쬗v‹
+S 0068 <charactor ID>.l <mail address>.40B
+ ƒLƒƒƒ‰ƒNƒ^휗v‹
+R 0069 <len>.w <login ID1>.l <account ID>.l <login ID2>.l ?.32B <sex>.B {<IP>.l <port>.w <server name>.20B <login users>.w <maintenance>.w <new>.w}.32B*
+ login¬Œ÷&ŽIî•ñ
+R 006a <error No>.B
+ loginŽ¸”s ‚»‚Ì‚P
+ err No=00 –¢“o˜^‚ÌID‚Å‚·
+ err No=01 ƒpƒXƒ[ƒh‚ªˆá‚¢‚Ü‚·
+ err No=02 Žg—pŠúŠÔ‚ªI—¹‚µ‚Ä‚¢‚Ü‚·
+ err No=03 ƒT[ƒo[‚©‚çÚ‘±‹‘”Û‚³‚ê‚Ü‚µ‚½
+ err No=04 ‰ð–ñ‚³‚ꂽIDA‚Ü‚½‚̓AƒJƒEƒ“ƒgƒuƒƒbƒN‚³‚ê‚Ä‚¢‚éID‚Å‚·
+ err No=05 ÅV‚̃pƒbƒ`‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
+ err No=06 ‰ð–ñ‚³‚ꂽIDA‚Ü‚½‚̓AƒJƒEƒ“ƒgƒuƒƒbƒN‚³‚ê‚Ä‚¢‚éID‚Å‚·
+ err No=07 ƒT[ƒo[‚ª¬ŽG‚µ‚Ä‚¢‚Ü‚·
+R 006b <len>.w <charactor select data>.106B*
+ ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±¬Œ÷&ƒLƒƒƒ‰ƒNƒ^ƒf[ƒ^
+ <charactor select data> = <charactor ID>.l <base exp>.l <zeny>.l <job exp>.l <job level>.l ?.8B <option>.l <karma>.l <manner>.l ?.2B <HP>.w <MaxHP>.w <SP>.w <MaxSP>.w <speed>.w <class>.w <hair>.w <weapon>.2w <base level>.w <skill point>.w <head_bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <name>.24B <STR>.B <AGI>.B <VIT>.B <INT>.B <DEX>.B <LUK>.B <charactor number>.B ?.B
+R 006c <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ðŽ¸”s
+R 006d <charactor select data>.106B
+ ƒLƒƒƒ‰ƒNƒ^쬬Œ÷
+R 006e <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^쬎¸”s
+R 006f
+ ƒLƒƒƒ‰ƒNƒ^휬Œ÷
+R 0070 <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^휎¸”s
+ err No=00 ƒ[ƒ‹ƒAƒhƒŒƒX‚ªˆá‚¤
+ err No=01 휂ª‹‘”Û‚³‚ꂽ
+R 0071 <charactor ID>.l <map name>.16B <ip>.l <port>.w
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ð¬Œ÷&ƒ}ƒbƒv–¼&ƒQ[ƒ€ŽIIP/port
+S 0072 <account ID>.l <charactor ID>.l <login ID1>.l <login ID2>.l <sex>.b
+ ƒQ[ƒ€ŽIÚ‘±—v‹
+R 0073 <server tick>.l <coordidate>.3B ?.2B
+ ƒQ[ƒ€ŽIÚ‘±¬Œ÷&ƒT[ƒo‘¤1msŽžŒv&oŒ»ˆÊ’u
+R 0078 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w <cloth color>.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B
+ ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?
+R 0079 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B
+ ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?
+R 007b <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <server tick>.l <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B
+ •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ
+R 007c <ID>.l <speed>.w ?.6w <class>.w ?.7w <X_Y>.3B ?.2B
+ NPC—p•\Ž¦”͈͓àƒLƒƒƒ‰î•ñ
+S 007d
+ mapƒ[ƒhI‚è
+S 007e <client tick>.l
+ ƒNƒ‰ƒCƒAƒ“ƒg‘¤1msƒ^ƒCƒ}‘—M
+R 007f <server tick>.l
+ ƒT[ƒo‘¤1msƒ^ƒCƒ}‘—M
+R 0080 <ID>.l <type>.B
+ type=00 ƒLƒƒƒ‰Á–Å (‰æ–ÊŠOˆÚ“®BŽ€‘ÌÁ–Å“™?)
+ type=01 ƒLƒƒƒ‰Ž€–S
+ type=02 ƒLƒƒƒ‰Á–Å (logout“™?)
+ type=03 ƒeƒŒƒ|[ƒg (ƒeƒŒƒ|,”ˆ,’±“™H)
+R 0081 <type>.B
+ loginŽ¸”s ‚»‚Ì‚Q
+ type=01 ƒT[ƒo[Ú‘±I—¹
+ type=02 “¯‚¶ID‚Å‘¼‚ÌŽg—pŽÒ‚ªƒƒOƒCƒ“‚µ‚Ü‚µ‚½
+ type=03 ƒT[ƒo[‚Æ‚Ì“¯Šú‚ÉŽ¸”s‚µ‚Ü‚µ‚½
+ type=04 ’nˆæ‚ÌŽû—elˆõ’´‰ß‚ÅÚ‘±‚Å‚«‚Ü‚¹‚ñ
+ type=05 ‚P‚WΈȉº‚ÍÚ‘±‚Å‚«‚Ü‚¹‚ñ
+ type=06 ŒˆÏ‚³‚ꂽƒAƒJƒEƒ“ƒg‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
+ type=07 ƒT[ƒo[‚ª¬ŽG‚µ‚Ä‚¢‚Ü‚·
+ type=08 ‘O‚ÌÚ‘±î•ñ‚ªŽc‚Á‚Ä‚¢‚Ü‚·
+ type=0b ƒAƒJƒEƒ“ƒg‚ª•Û—¯‚³‚ê‚Ü‚µ‚½
+ type=0c ‰Û‹àƒVƒXƒeƒ€•ÏX‚Ì‚½‚ßAˆêŽžI—¹‚µ‚Ü‚·
+ type=0d IP‚ªˆê’v‚µ‚È‚¢‚½‚ßAÚ‘±‚ðI—¹‚µ‚Ü‚·
+ type=10 —L—¿ƒT[ƒrƒX‚É‚È‚è‚Ü‚µ‚½
+ type=11 ƒ`ƒPƒbƒg‚ª”ƒ‚í‚ê‚Ä‚¢‚È‚¢‚©A—LŒøŠúŒÀ‚ªØ‚ê‚Ä‚¢‚Ü‚·
+S 0085 <X_Y>.3B
+ ˆÚ“®—v‹
+R 0087 <server tick>.l <X_Y_X_Y>.5B ?.B
+ ˆÚ“®‰ž“š
+R 0088 <ID>.l <X>.w <Y>.w
+ ˆÚ“®“r’†’âŽ~
+S 0089 <target ID>.l <type>.B
+ type=00 target‚ð1‰ñ‰£‚é
+ type=02 À‚é
+ type=03 —§‚¿ã‚é
+ type=07 target‚ð‰£‚è‘±‚¯‚é
+R 008a <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <type>.B <param3>.w
+ type=00 param1=0 miss
+ type=00 param1:ƒ_ƒ[ƒW(‚̇Œv?) param2:•ªŠ„” param3:ƒAƒTƒVƒ“2“—¬‹tŽèƒ_ƒ[ƒW
+ NPC‚©‚ç‚ÌUŒ‚‚Ìê‡Aparam2,param3‚̓Sƒ~ƒf[ƒ^
+ speed‚ÍPC‚Ìê‡“à•”ASPD‚ƈê’v
+ type=01 item‚ðE‚¤ ID*2ˆÈŠOƒSƒ~
+ type=02 À‚é src IDˆÈŠOƒSƒ~
+ type=03 —§‚ src IDˆÈŠOƒSƒ~
+ type=08 •¡”UŒ‚
+ type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)
+ type=0a ƒNƒŠƒeƒBƒJƒ‹
+ type=0b Š®‘S‰ñ”ð
+S 008c <len>.w <str>.?B
+ ’Êí”­Œ¾‘—MBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+ 擪‚Ì"<nick> : "‚Ì•”•ª‚̓Nƒ‰ƒCƒAƒ“ƒg‘¤‚Å•t‚¯‚鎖
+R 008d <len>.w <ID>.l <str>.?B
+ ID‚³‚ñ‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+R 008e <len>.w <str>.?B
+ Ž©•ª‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+S 0090 <ID>.l <type?>.B
+ NPC‚ɘb‚µ‚©‚¯‚éBtype‚Í01‚µ‚©Œ©‚½Ž––³‚µ
+R 0091 <map name>.16B <X>.w <Y>.w
+ ŽI“àƒ}ƒbƒvŠÔˆÚ“®AƒeƒŒƒ|,”ˆ“™—p
+R 0092 <map name>.16B <X>.w <Y>.w <IP>.l <port>.w
+ ŽIŠÔˆÚ“®
+R 0093
+ 8ŒŽ’†‚É1‰ñ‚¾‚¯ŠÏ‘ªB“ä
+S 0094 <ID>.l
+ ID‚̃Lƒƒƒ‰–¼“™—v‹B0095‚©0195‚Ì•Ô“š‚ª‚ ‚é‚Í‚¸
+R 0095 <ID>.l <nick>.24B
+ NPC,ƒMƒ‹ƒh–¢Š‘®PC‚Ì0094‚Ö‚Ì•Ô“š
+ 0193 <charID>.l ‚Å–â‚¢‡‚킹‚Ä
+ 0194 <charID>.l <name>.24B ‚̉ž“š‚Å“¾‚Ä‚Ü‚·B
+
+S 0096 <len>.w <nick>.24B <message>.?B
+ wis‘—M
+R 0097 <len>.w <nick>.24B <message>.?B
+ wisŽóM
+R 0098 <type>.B
+ type=00 wis‘—M¬Œ÷
+ type=01 wis‘ŠŽè‚ªlogin‚µ‚Ä‚È‚¢?
+ type=02 wis‘ŠŽè‚©‚çignore‚³‚ê‚Ä‚é?
+S 0099
+ _‚̺‘—M
+R 009a <len>.w <message>.?B
+ GM‚©‚ç‚Ì“V‚̺
+S 009b <head dir>.w <dir>.B
+ ‘Ì&“ª‚Ì•ûŒü•ÏX—v‹BƒNƒ‰ƒCƒAƒ“ƒg‚ւ̉ž“š‚Í–³‚¢–Í—l
+ dir‚Í00`07‚Å‘Ì‚ÌŒü‚«B00‚Å–k‚©‚甽ŽžŒv‰ñ‚è‚É45‹’PˆÊ‚Å07‚Ü‚Å
+ head dir‚Í00,01,02‚Å“ª‚ÌŒü‚«B00‚Å‘Ì‚Æ“¯‚¶A01‚ª‰EA02‚ª¶
+R 009c <ID>.l <head dir>.w <dir>.B
+ ID‚Ì‘Ì&“ª‚Ì•ûŒü•ÏX
+R 009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
+ ˆÚ“®“™‚Å°ƒAƒCƒeƒ€‚ª‰æ–Ê“à‚É“ü‚Á‚Ä‚«‚½Žž
+R 009e <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
+ item dropB‰½ŒÌ‚©009d‚ƃ}ƒX–Ú“àˆÊ’u&ŒÂ”‚ª“ü‚ê•Ï‚Á‚Ä‚¢‚é
+S 009f <ID>.l
+ ID‚Ì°ƒAƒCƒeƒ€‚ðE‚¤
+R 00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B
+ fail=02 Žæ“¾Ž¸”s?
+ fail=06 ƒ‹[ƒgŒ –³‚µBŽæ“¾Ž¸”s
+R 00a1 <ID>.l
+ ID‚Ì°ƒAƒCƒeƒ€Á‹Ž
+S 00a2 <index>.w <amount>.w
+ Š—LƒAƒCƒeƒ€‚ð—Ž‚·
+R 00a3 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
+R 00a4 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ Š—L‘•”õƒŠƒXƒg
+R 00a5 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
+R 00a6 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
+S 00a7 <index>.w <ID>.l
+ ŠŽƒAƒCƒeƒ€index‚ðŽg—p‚·‚éBID‚ÍŽ©•ª‚Ì‚Ý?
+R 00a8 <index>.w <amount>.w <type>.B
+ ƒAƒCƒeƒ€Žg—p‰ž“šBtype=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
+ type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
+S 00a9 <index>.w <equip type>.w
+ ƒAƒCƒeƒ€‘•”õ
+R 00aa <index>.w <equip point>.w <type>.B
+ ƒAƒCƒeƒ€‘•”õ‰ž“šBtype=00‚Ìꇑ•”õŽ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
+S 00ab <index>.w
+ ‘•”õ‰ðœ
+R 00ac <index>.w <equip point>.w <type>.B
+ ‘•”õ‰ðœ‰ž“šBtype=00‚Ìꇎ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
+R 00af <index>.w <amount>.w
+ ƒAƒCƒeƒ€”Œ¸­BamountŒÂ‚¾‚¯Œ¸‚ç‚·
+R 00b0 <type>.w <val>.l
+ FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
+ 0000:speed 0003:ˆ«s’l 0004:ƒ}ƒi[ƒ|ƒCƒ“ƒg 0005:HP 0006:MaxHP
+ 0007:SP 0008:MaxSP 0009:ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg 000b:ƒx[ƒXƒŒƒxƒ‹
+ 000c:ƒXƒLƒ‹ƒ|ƒCƒ“ƒg 0018:d—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
+ 0019:Å‘åd—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
+ 0029:ATK‘O 002a:ATKŒã 002b:MATK‘O 002c:MATKŒã
+ 002d:DEF‘O 002e:DEFŒã 002f:MDEF‘O 0030:MDEFŒã
+ 0031:HIT 0032:FLEE‘O 0033:FLEEŒã 0034:ƒNƒŠƒeƒBƒJƒ‹
+ 0035:ASPD(2ms’PˆÊ‚ÌŽžŠÔ?) 0037:ƒWƒ‡ƒuƒŒƒxƒ‹
+ 0082:“ä ATKŒã‚Æ“¯‚¶”Žš?
+R 00b1 <type>.w <val>.l
+ FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
+ 0001:ƒx[ƒX‘¤ŒoŒ±’l 0002:ƒWƒ‡ƒu‘¤ŒoŒ±’l 0014:zeny
+ 0016:ƒx[ƒX‘¤•K—vŒoŒ±’l 0017:ƒWƒ‡ƒu‘¤•K—vŒoŒ±’l
+ ƒÀ1‚Å‚Í00b0‚Íval‚ªshortA00b1‚Íval‚ªlong‚Æ‚¢‚¤Žg‚¢•ª‚¯‚ª‚ ‚Á‚½‚ñ‚¾‚¯‚Ç
+ ¡‚Æ‚È‚Á‚Ä‚Í·‚ª–³‚­‚È‚Á‚ÄA–Ó’°‚Ý‚½‚¢‚È‚à‚Ì?
+S 00b2 <type>.B
+ type=00 Ž€–SŽžƒŠƒXƒ^[ƒg
+ type=01 ƒLƒƒƒ‰ƒZƒŒ—v‹
+R 00b3 <type>.B
+ type=01 ƒLƒƒƒ‰ƒZƒŒ‰ž“š
+R 00b4 <len>.w <ID>.l <str>.?B
+ ID‚ÌNPC‚©‚ç‚̃ƒbƒZ[ƒW
+R 00b5 <ID>.l
+ ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"NEXT"ƒAƒCƒRƒ“‚ðo‚·
+R 00b6 <ID>.l
+ ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"CLOSE"ƒAƒCƒRƒ“‚ðo‚·
+R 00b7 <len>.w <ID>.l <str>.?B
+ ID‚ÌNPC‚̉ï˜b‚Å‘I‘ð€–Ú•\Ž¦BŠe€–Ú‚Í':'‚Å‹æØ‚ç‚ê‚é
+S 00b8 <ID>.l <select>.B
+ ID‚ÌNPC‚̉ï˜b‚Ì‘I‘ðBŠe€–ڂɇ‚É1`‚ªU‚ç‚ê‚éBff‚ŃLƒƒƒ“ƒZƒ‹?
+S 00b9 <ID>.l
+ ID‚ÌNPC‚Ƃ̉ï˜bBNEXTƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½
+S 00bb <type>.w <amount>.B
+ ƒXƒe[ƒ^ƒXup—v‹Btype‚Í000d‚©‚ç0012‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
+R 00bc <type>.w <fail>.B <val>.B
+ ƒXƒe[ƒ^ƒXup‰ž“šBfail=01‚Ȃ笌÷Btype‚Í00bb‚Æ“¯‚¶Bval‚Íã‚Á‚½Œã‚Ì”Žš
+ Ž¸”s—á‚ÍŒ©‚½Ž––³‚¢‚Ì‚Å“äBƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‘«‚è‚È‚¢ó‘Ô‚Å
+ 00bb‚ð”­s‚Å‚«‚éƒNƒ‰ƒCƒAƒ“ƒg‚ª—L‚ê‚ÎAfail=00‚É‚È‚é‚Ì‚Å‚Í‚È‚¢‚©‚Æ—\‘z
+R 00bd <status point>.w <STR>.B <STRupP>.B <AGI>.B <AGIupP>.B <VIT>.B <VITupP>.B <INT>.B <INTupP>.B <DEX>.B <DEXupP>.B <LUK>.B <LUKupP>.B <ATK>.w <ATKbonus>.w <MATKmax>.w <MATKmin>.w <DEF>.w <DEFbonus>.w <MDEF>.w <MDEFbonus>.w <HIT>.w <FLEE>.w <FLEEbonus>.w <critical>.w ?.w
+ ‚܂Ƃ߂ăXƒe[ƒ^ƒXî•ñ‚ð‘—‚éƒpƒPƒbƒg
+R 00be <type>.w <val>.B
+ •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgXVƒpƒPƒbƒgBtype‚Í0020`0025‚ª‡‚ÉSTR`LUK‚ɑΉž
+S 00bf <type>.B
+ ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚·Btype‚Í00-0c(,0d)‚ªALT+1`ALT+9,ALT+0,ƒ`ƒ‡ƒL,ƒO[,ƒp[(,ŠØ‘Šø)‚ɑΉž
+ 00=! 01=? 02=‚¤‚ꂵ‚¢(ô) 03=ƒn[ƒg 04=Š¾ 05=‚ ‚Í‚Í(“d‹…)
+ 06=‚¢‚₾‚È(”) 07=“{‚è(‚à‚â‚à‚â)08=‚¨‹à() 09=c 0a=ƒ`ƒ‡ƒL
+ 0b=ƒO[ 0c=ƒp[ 0d=ŠØ‘Šø 0e=‘å‚«‚¢ƒn[ƒg 0f=‚ ‚肪‚Æ‚¤(thanks)
+ 10=–³”O 11=‚²‚ß‚ñ(sorry) 12=΂¢ 13=Š¾‚©‚« 14=‚ ‚Ì
+ 15=Å‚(GoodJob)16=ƒLƒ‡ƒƒLƒ‡ƒ 17=ƒVƒ‡ƒbƒN 18=‚Ü‚é 19=ƒoƒc
+ 1a=ƒwƒ‹ƒv(help) 1b=go 1c=‚¦[‚ñ 1d=‚­‚·‚­‚· 1e=‚¿‚ã
+ 1f=‚¿‚ã‚¿‚ã 20=‚Ó‚ñ 21=‚¤‚ñ‚¤‚ñ
+R 00c0 <ID>.l <type>.B
+ ID‚Ìl‚ªƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚½Btype‚Í00bf‚Æ“¯‚¶
+S 00c1
+ loginl”–â‚¢‡‚킹
+R 00c2 <val>.l
+ loginl”‰ž“š
+R 00c3 <ID>.l <type>.B <val>.B
+ Œ©‚½–Ú•ÏXBtype‚Í00‚Å–{‘Ì(“]EŽž“™)A02‚ª•ŠíA03‚ª“ª(‰º)A04‚ª“ª(ã)A05‚ª“ª(’†)A08‚ª‚
+R 00c4 <ID>.l
+ ˜b‚©‚¯‚½NPC‚ª¤l‚¾‚Á‚½‚Ì‚Åbuy/sell‘I‘ð‘‹o
+R 00c5 <ID>.l <type>.B
+ buy/sell‘I‘ðBtype=00‚È‚çbuyBtype=01‚È‚çsell
+R 00c6 <len>.w {<value>.l <DCvalue>.l <type>.B <item ID>.w}.11B*
+ NPC‚Ì‚¨“Xbuy‘I‘ðŽžBDCvalue‚ͤlDCŒã‚Ì’l’i
+R 00c7 <len>.w {<index>.w <value>.l <OCvalue>.l}.10B*
+ NPC‚Ì‚¨“Xsell‘I‘ðŽžBOCvalue‚ͤlOCŒã‚Ì’l’i
+S 00c8 <len>.w {<amount>.w <item ID>.w}.4B*
+ NPC‚Ì‚¨“X‚©‚甃‚¤
+S 00c9 <len>.w {<index>.w <amount>.w}.4B*
+ NPC‚Ì‚¨“X‚É”„‚é
+R 00ca <type>.B
+ NPC‚©‚çw“üI—¹Btype=00¬Œ÷
+R 00cb <type>.B
+ NPC‚Ö”„‹pI—¹Btype=00¬Œ÷
+S 00cc <ID>.l
+ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽg—p
+R 00cd <IDH>.l
+ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹v‚̉ž“š
+ <ID>‚ª0‚Ìꇂ͎¸”s‚Æ•\Ž¦B(‚±‚̃pƒPƒbƒg‚Í‚½‚¾‚̉ž“š‚Å‚·BÚ‘±I—¹‚Ì‹@”\‚Í‚ ‚è‚Ü‚¹‚ñB)
+S 00cf <nick>.24B <type>.B
+ type=00 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/ex nick)
+ type=01 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/in nick)
+S 00d0 <type>len.B
+ type=00 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/exall)
+ type=01 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/inall)
+R 00d1 <type>.B <fail>.B
+ fail=00 ”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
+ fail=01 ”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
+R 00d2 <type>.B <fail>.B
+ fail=00 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
+ fail=01 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
+S 00d5 <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
+ ƒ`ƒƒƒbƒg—§‚ÄB‚±‚±‚©‚çƒ`ƒƒƒbƒgŠÖŒW‚ª‘±‚­‚¯‚Ç’²‚ׂªŠÃ‚¢‚̂ŕ⊮‚æ‚ë
+R 00d6 <fail>.B
+ ƒ`ƒƒƒbƒg—§‚ĉž“š
+R 00d7 <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
+ ‰æ–Ê“àƒ`ƒƒƒbƒgî•ñ
+R 00d8 <chat ID>.l
+ ƒ`ƒƒƒbƒgÁ‹Ž
+S 00d9 <chat ID>.l <passwd>.8B
+ ƒ`ƒƒƒbƒgŽQ‰Á—v¿
+R 00da <fail>.B
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽ¸”s
+R 00db <len>.w <chat ID>.l {<index>.l <nick>.24B}.28B*
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽÒƒŠƒXƒg
+R 00dc <users>.w <nick>.24B
+ ƒ`ƒƒƒbƒg‚Ö‚ÌŽQ‰ÁŽÒ’ljÁ(?)
+R 00dd <index>.w <nick>.24B <fail>.B
+ ƒ`ƒƒƒbƒg‚©‚çŽQ‰ÁŽÒ”²‚¯
+S 00de <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
+ ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX
+R 00df <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
+ ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX¬Œ÷
+S 00e0 ?.l <nick>.24B
+ ƒ`ƒƒƒbƒgƒ‹[ƒ€Š—LŽÒ•ÏX—v‹?
+R 00e1 <index>.l <nick>.24B
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽÒ”Ô†•t‚¯’¼‚µ?
+S 00e2 <nick>.24B
+ ƒ`ƒƒƒbƒgkick
+S 00e3
+ ƒ`ƒƒƒbƒg”²‚¯
+S 00e4 <ID>.l
+ Žæ‚èˆø‚«—v‹
+R 00e5 <nick>.24B
+ Žæ‚èˆø‚«—v¿Žó‚¯
+S 00e6 <type>.B
+ type=03 Žæ‚èˆø‚«—v¿ok
+ type=04 Žæ‚èˆø‚«—v¿ƒLƒƒƒ“ƒZƒ‹
+R 00e7 <fail>.B
+ Žæ‚èˆø‚«—v‹‰ž“š
+ fail=00 ‹——£‚ª‰“‰ß‚¬
+ fail=03 —v¿Žó‚¯‚Ä‚­‚ꂽ
+ fail=04 ƒLƒƒƒ“ƒZƒ‹‚³‚ꂽ?
+S 00e8 <index>.w <amount>.l
+ ƒAƒCƒeƒ€’ljÁBindex=0‚Åzeny’ljÁB³‹KƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Ízeny‚Í00eb‚Ì’¼‘O‚Ì‚Ý
+R 00e9 <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
+R 00ea <index>.w <fail>.B
+ fail=00 ƒAƒCƒeƒ€’ljÁ¬Œ÷
+ fail=01 ’ljÁŽ¸”sB‘ŠŽè‘¤d—ʃI[ƒo
+S 00eb
+ ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
+R 00ec <fail>.B
+ fail=00 Ž©•ª‚©‚ç‚ÌokŽó—Ì
+ fail=01 ‘ŠŽè‚©‚ç‚ÌokŽó—Ì
+S 00ed
+ Žæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹
+R 00ee
+ Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
+S 00ef
+ Žæ‚èˆø‚«‹–‘ø(trade‰Ÿ‚µ)
+R 00f0
+ Žæ‚èˆø‚«Š®—¹
+R 00f2 <num>.w <limit>.w
+ ƒJƒvƒ‰‚³‚ñ‹–—eƒAƒCƒeƒ€ŒÂ”&Œ»ó
+S 00f3 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚ɃAƒCƒeƒ€•ú‚èž‚Ý
+R 00f4 <index>.w <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€’ljÁ
+S 00f5 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ—v‹
+R 00f6 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ‰ž“š
+S 00f7
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶—v‹
+R 00f8
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶‰ž“š
+S 00f9 <party name>.24B
+ ƒp[ƒeƒB쬗v‹
+R 00fa <fail>.B
+ ƒp[ƒeƒB쬉ž“š
+ fail=00 uƒp[ƒeƒB[‚ðŒ‹¬‚µ‚Ü‚µ‚½Bv
+ fail=01 u“¯‚¶–¼‘O‚̃p[ƒeƒB[‚ª‚ ‚è‚Ü‚·Bv
+ fail=02 u‚·‚łɃp[ƒeƒB[‚ɉÁ“ü‚µ‚Ä‚¢‚Ü‚·Bv
+R 00fb <len>.w <party name>.24B {<ID>.l <nick>.24B <map name>.16B <leader>.B <offline>.B}.46B*
+ ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‚Ä‘—‚è
+S 00fc <ID>.l
+ ƒp[ƒeƒBŠ©—U‚·‚é
+R 00fd <nick>.24B <fail>.B
+ fail=00 ‘ŠŽè‚ÍŠù‚Ƀp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚½
+ fail=01 ‘ŠŽè‚É‹‘”Û‚³‚ꂽ
+ fail=02 Š©—U¬Œ÷
+R 00fe <ID>.l <party name>.24B
+ ƒp[ƒeƒB‚É—U‚í‚ꂽ
+S 00ff <ID>.l <fail>.l
+ ƒp[ƒeƒB‚É—U‚í‚ꂽŽž‚Ì•Ô“šBfail=1 ok•Ô“š?
+S 0100
+ ƒp[ƒeƒB’E‘Þ—v‹
+R 0101 <exp>.w <item?>.w
+ ƒp[ƒeƒBݒ茻ó? exp=2‚Ìꇂ͌ö•½”z•ªÝ’莸”s?
+S 0102 <exp>.w <item?>.w
+ ƒp[ƒeƒBÝ’è•ÏX
+R 0104 <ID>.l ?.l <X>.w <Y>.w <offline>.B <party name>.24B <nick>.24B <map name>.16B
+ ƒp[ƒeƒB1l•ªî•ñXV
+R 0105 <ID>.l <nick>.24B <fail>.B
+ nick‚³‚ñ‚ªƒp[ƒeƒB‚©‚ç—£’E
+R 0106 <ID>,l <HP>.w <MaxHP>.w
+ ƒp[ƒeƒBƒƒ“ƒoHPXV
+R 0107 <ID>.l <X>.w <Y>.w
+ ƒp[ƒeƒBƒƒ“ƒoˆÊ’uXV
+S 0108 <len>.w <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾
+R 0109 <len>.w <ID>.l <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾ŽóM
+R 010a <type ID>.w
+ MVPƒAƒCƒeƒ€Žæ“¾
+R 010b <exp>.l
+ MVPŒoŒ±’lŽæ“¾
+R 010c <ID>.l
+ MVPƒLƒƒƒ‰•\Ž¦
+R 010e <skill ID>.w <lv>.w <sp>.w <range>.w <up>.B
+ ƒXƒLƒ‹î•ñXVBsp‚Í–¢Žg—p?
+R 010f <len>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
+ ƒXƒLƒ‹î•ñ‚̉òBskill name‚͈ꕔ—¬‚ê‚Ä—ˆ‚È‚¢•¨‚ª‚ ‚é„AL_PNEUMA,PR_SLOWPOISON“™
+ target type‚Í0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•û
+ lv=0 up=0‚Ìꇂ̓ŠƒXƒg‚Éo‚µ‚Ä‚È‚¢?
+R 0110 <skill ID>.w <basic type>.w ?.w <fail>.B <type>.B
+ fail=00‚ÌŽž‚ɃXƒLƒ‹—˜—pŽ¸”s?
+ type 00:basic type‚Ì•û 01:SP•s‘« 02:HP•s‘« 03:memo–³‚µ 04:delay’†
+ 05:‚¨‹à–³‚µ(‚ß‚Ü[) 06:•Ší‚ª‚æ‚낵‚­‚È‚¢ 07:ÔƒWƒFƒ€–³‚µ 08:ƒWƒFƒ€–³‚µ 09:“ä
+ basic type 00:Žæ‚èˆø‚« 01:emotion 02:À‚è 03:ƒ`ƒƒƒbƒg 04:ƒp[ƒeƒB
+ 05:shout? 06:PK 07:ƒ}ƒi[ƒ|ƒCƒ“ƒg
+R 0111 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
+ 010f‚Ì1‚•ªBƒÀ2‚¾‚Æ–¢Žg—p?
+ 20040415“]EŽž‚ÉŠÏ‘ª
+S 0112 <skill ID>.w
+ ƒXƒLƒ‹lvup—v‹
+S 0113 <level>.w <skill ID>.w <ID>.l
+ ID‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
+R 0114 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <param3>.w <type>.B
+ UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@
+ type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
+ type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
+ type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
+ type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
+ type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
+R 0115 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <X>.w <Y>.w <param1>.w <param2>.w <param3>.w <type>.B
+ ’e‚«”ò‚΂µ—L‚èUŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg
+ type=05 ƒ_ƒ[ƒW&’e‚«”ò‚΂µBparam1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=06 ”šS’n? ­‚È‚­‚Æ‚àparam1‚̓Sƒ~‚Ì–Í—l
+ type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
+S 0116 <level>.w <skill ID>.w <X>.w <Y>.w
+ (X,Y)‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
+R 0117 <skill ID>.w <src ID>.l <val>.w <X>.w <Y>.w <server tick>.l
+ ꊑŠŽè‚̃XƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦Bval‚̓Œƒxƒ‹‚©Aˆê•”ŒÅ‚³?(•X•Ç)
+S 0118
+ UŒ‚ƒLƒƒƒ“ƒZƒ‹
+R 0119 <ID>.l <param1>.w <param2>.w <param3>.w ?.B
+ Œ©‚½–Ú•ÏX
+ param1=02 ƒtƒƒXƒgƒ_ƒCƒo‚Å“€‚è’Ђ¯?
+ param2=01 “Å?
+ param2=20 ANGELUSó‘Ô?
+ param3=01 ƒTƒCƒg‚©ƒ‹ƒƒbƒ`?
+ param3=0b ƒnƒCƒfƒBƒ“ƒOó‘Ô?
+ param3=0b ƒNƒ[ƒLƒ“ƒOó‘Ô?
+ param3=0d ƒJ[ƒg•t‚«
+ param3=0e ‘é•t‚«
+ param3=0f ƒyƒRƒyƒRæ‚è
+
+R 011a <skill ID>.w <val>.w <dst ID>.l <src ID>.l <fail>.B
+ ”ñƒ_ƒ[ƒWŒnƒXƒLƒ‹•\Ž¦Bƒq[ƒ‹‚Ìê‡val‚͉ñ•œ—Ê
+ fail=00‚Ìꇎ¸”s‚Û‚¢‚ªAƒXƒ`[ƒ‹ˆÈŠO‚Å‚ÍŒ©‚½Ž––³‚µ
+S 011b <skill ID>.w <map name>.16B
+ 011c‚ւ̉ž“šBŽg‚í‚È‚¢ê‡"cancel"Aƒ}ƒbƒv“àƒ‰ƒ“ƒ_ƒ€‚Ìê‡"Random"‚ð‘—‚é
+R 011c <skill ID>.w <map1>.16B <map2>.16B <map3>.16B <map4>.16B
+ ƒeƒŒƒ|/ƒ|ƒ^‚ÌꊑI‘ðB
+ ƒeƒŒƒ|‚Ìê‡ARandom/ƒZ[ƒuêŠAƒ|ƒ^‚Ìê‡AƒZ[ƒuêŠ/memo1/memo2/memo3‚Æ‚È‚é
+ ƒ}ƒbƒv–¼‚Ì‚Ý‘—‚ç‚ê‚é
+S 011d
+ Œ»Ý‹‚éŠ‚ðƒƒ‚—v‹
+R 011e <fail>.B
+ fail=00 ƒƒ‚¬Œ÷
+ fail=01 ƒƒ‚Ž¸”s
+R 011f <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B
+ ƒXƒLƒ‹Œø”\’nì¬
+ type 7e:SW 7f:‰Î•Ç 80:ƒ|ƒ^”­“®’† 81:ƒ|ƒ^”­“®‘O 83:ƒTƒ“ƒN 85:ƒtƒjƒ…[ƒ}
+ 86:ƒo[ƒ~ƒŠƒIƒ“ 8c:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®Žž 8d:•X•Ç 8e:‚­‚ ‚®‚Ü‚¢‚â[ 91:‚ ‚ñ‚­‚é‚·‚Ë‚ 
+ 93:‚ç‚ñ‚Ç‚Ü‚¢‚ñ 97:?? 99:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®‘O
+ ‘¼î•ñ‹‚Þ
+R 0120 <ID>.l
+ ƒXƒLƒ‹Œø”\’nÁ‹Ž
+R 0121 <num>.w <num limit>.w <weight>.l <weight limit>l
+ ƒJ[ƒg‚ÌŽí—Þ&d‚³‚ÌŒ»Ý’l&ãŒÀ
+R 0122 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€B‘•”õ•i
+R 0123 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
+R 0124 <index>.w <amount>.l <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
+R 0125 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
+S 0126 <index>.w <amount>.l
+ ƒJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚é
+S 0127 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðŽæ‚èo‚·
+S 0128 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‚©‚çƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
+S 0129 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒJƒvƒ‰‚³‚ñ‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
+R 012c <fail>.B
+ fail=00 ud—ʃI[ƒo[‚Å‚·Bv
+ fail=01 uƒAƒCƒeƒ€Å‘åŽí—Þ”‚𒴉߂µ‚Ü‚µ‚½Bv
+R 012d <num>.w
+ ˜I“XŠJÝBƒAƒCƒeƒ€ƒŠƒXƒg—v‹Bnum‚Í’u‚¯‚éÅ‘å”
+S 012e
+ ˜I“X•Â½
+S 012f <len>.w <message>.80B {<index>.w <amount>.w <value>.l}.8B*
+ ˜I“XŠJÝA˜I“X–¼&ƒAƒCƒeƒ€,’l’iƒŠƒXƒg
+S 0130 <ID>.l
+ ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
+R 0131 <ID>.l <message>.80B
+ ˜I“XŠÅ”•\Ž¦
+R 0132 <ID>.l
+ ˜I“XŠÅ”ÂÁ‹Ž
+R 0133 <len>.w <ID>.l {<value>.l <amount>.w <index>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B
+ ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
+S 0134 <len>.w <ID>.l {<amount>.w <index>.w}.4B*
+ ˜I“XƒAƒCƒeƒ€w“ü
+R 0135 <index>.w <amount>.w <fail>.B
+ ˜I“XƒAƒCƒeƒ€w“üŽ¸”sB
+ fail=1 u‚¨‹à‚ª‘«‚è‚Ü‚¹‚ñBv
+ fail=2 ud—ʃI[ƒo[‚Å‚·Bv
+R 0136 <len>.w <ID>.l {<value>.l <index>.w <amount>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B*
+ ˜I“XŠJݬŒ÷
+R 0137 <index>.w <amount>.w
+ ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
+R 0139 <ID>.l <X>.w <Y>.w <X2>.w <Y2>.w <range>.w
+ ID‚Ì“G‚Í(X,Y)‚É‹‚ÄŽ©•ª‚Í(X2,Y2)‚É‹‚é‚Ì‚ÅUŒ‚‚ª“Í‚«‚Ü‚¹‚ñ‚Å‚µ‚½
+ UŒ‚‰Â”\‹——£‚Írange‚È‚Ì‚ÅA‹ßŠñ‚Á‚ĉº‚³‚¢?
+R 013a <val>.w
+ UŒ‚ŽË’ö
+R 013b <type>.w
+ ŠeŽíƒƒbƒZ[ƒW•\Ž¦B3=–‘•”õ‚Å‚«‚Ü‚µ‚½
+R 013c <ID>.w
+ ‘•”õ‚³‚ꂽ–î‚ÌItemIDB0‚ÅA–¢‘•”õó‘ÔB
+R 013d <type>.w <val>.w
+ HP‰ñ•œƒXƒLƒ‹/SP‰ñ•œƒXƒLƒ‹‚É‚æ‚é‰ñ•œ
+ type=5‚È‚çHP type=7‚È‚çSP
+R 013c <index>.w
+ ‘•”õ‚µ‚Ä‚¢‚é–î
+
+R 013e <src ID>.l <dst ID>.l <X>.w <Y>.w <lv?>.w ?.w <wait>.l
+ ƒXƒLƒ‹‰r¥’†BPC/NPC‚ª‘ŠŽè‚ÌꇂÍ(X,Y)‚Í0Bꊂªƒ^[ƒQƒbƒg‚ÌꇂÍdst ID‚Í0‚É‚È‚é
+
+ 0x013e ‚Ì offset+16(dword) ‚̓XƒLƒ‹‘®«‚Å‚·(’²¸Ï)B
+ 00:–³ 01:… 02:’n 03:‰Î 04:•— 05:“Å 06:¹ 07:ˆÃ 08:”O 09:Ž€
+ «—ˆ“I‚ÉA‰r¥’†‚̃GƒtƒFƒNƒg‚ª‘®«‚Å•Ï‚í‚é‚Ì‚©‚ÆB
+
+ wait‚Íms’PˆÊ‚©‚È?
+R 0141 <type>.l <base>.l <bonus>.l
+ ƒXƒe[ƒ^ƒXî•ñBtype‚Í0d‚©‚ç12‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
+ base+bonus‚Æ•\Ž¦‚³‚ê‚é
+R 0142 <ID>.l
+ ”’l“ü—Í—p‘‹•\Ž¦
+S 0143 <ID>.l <amount>.l
+ 0142‚Ì‘‹‚É“ü—Í‚µ‚½”’l‚Ì‘—M
+R 0144 <ID>.l <type>.l <X>.l <Y>.l <point ID>.B <color>.3B ?.B
+ ˆÄ“àˆõ—pAƒ}ƒbƒvãƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg
+ type=1 ƒAƒCƒRƒ“‚ð•\Ž¦
+ type=2 ƒAƒCƒRƒ“‚ðÁ‹Ž
+R 0145 <file name>.16B <type>.B
+ (¡‚ÌŠ)ƒJƒvƒ‰‚³‚ñcutin•\Ž¦
+ type=02 •\Ž¦
+ type=ff Á‹Ž
+S 0146 <ID>.l
+ ID‚ÌNPC‚Ƃ̉ï˜bBCLOSEƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½Back–³‚µ‚ÉNPCƒƒbƒZ[ƒWƒEƒBƒ“ƒh‚𓯎ž‚ɕ‚¶‚é
+R 0147 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
+ ƒAƒCƒeƒ€—˜—p‚ÌŒ‹‰ÊˆêŽž“I‚É“¾‚ç‚ꂽƒXƒLƒ‹î•ñ
+R 0148 <ID>.l
+ ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Ì‘ŠŽèŒˆ‚ß? @ ƒÀ1
+S 0149 <ID>.l <type>.B <time>.w
+ ID‚Ƀ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð•t‰Á type=0 ƒ}ƒCƒiƒX type=1 ƒvƒ‰ƒX
+ tyme‚Í•ª’PˆÊ
+R 014a <fail>.l
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚½Œ‹‰ÊBfail=0 ¬Œ÷ fail=1 Ž¸”s
+R 014b <type>.B <nick>.24B
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð–á‚Á‚½Btype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
+R 014C <len>.w (<type>.l <guildID>.l <guild name>.24B).*
+ “¯–¿E“G‘΃Mƒ‹ƒh•\Ž¦
+ type=0 “¯–¿
+ type=1 “G‘Î
+S 014D
+ ƒMƒ‹ƒhî•ñ•\Ž¦ŠJŽnH
+R 014E <type?>.l
+ type=0x57 ˆê”ʃMƒ‹ƒh’cˆõ
+ type=0xD7 ƒMƒ‹ƒhƒ}ƒXƒ^[
+S 014F <page>.l
+ ƒMƒ‹ƒh•\Ž¦ƒ^ƒu‘—M
+R 0150 <guildID>.l <guildLv>.l <Ú‘±”>.l <’èˆõ>.l <Avl.lvl>.l <ŒoŒ±’l>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«Œü¶‰EVW>.l <«Œü㉺RF>.l <l”H>.l <guild name>.24B <guild master>.24B <–{‹’’n>.16B
+ ƒMƒ‹ƒhî•ñ
+S 0151 <guild ID>.l
+ ƒGƒ“ƒuƒŒƒ€—v‹
+R 0152 <len>.w <guild ID>.l <emblem ID(•ÏX‰ñ”H)>.l <emblem data>.?B
+ ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW‘—•t
+S 0153 <len>.w <emblem data>.?B
+ ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW•ÏX
+R 0154 <len>.w {<accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l <ƒƒ‚H>.50B <nick>.24B}*
+ ƒMƒ‹ƒhƒƒ“ƒoƒŠƒXƒg
+S 0155 <len>.w {<accID>.l <charaID>.l <index>.l}.12B*
+ –ðE•ÏX
+R 0156 <len>.w {<accID>.l <charaID>.l <index>.l}.12B*
+ –ðE•ÏX’Ê’m
+S 0159 <guildID>.l <accID>.l <charID>.l <mess>.40B
+ ƒMƒ‹ƒh’E‘Þ‘—M
+R 015A <nic>.24B <mess>.40B
+ ƒMƒ‹ƒh’E‘Þ(‘Sˆõ)ŽóM
+S 015B <guildID>.l <accID>.l <charID>.l <mess>.40B
+ ƒMƒ‹ƒh’Ç•ú‘—M
+R 015C <nick>.24B <mess>.40B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B
+ ƒMƒ‹ƒh’Ç•úi‘SˆõjŽóM
+S 015D <guild name>.24B <?>.16B
+ ƒMƒ‹ƒh‰ðŽU
+R 015E <fail>.l
+ ƒMƒ‹ƒh‰ðŽU³”Û’Ê’m
+ 0x00F¬Œ÷
+ 0x01FZ–¯“o˜^”Ô†•sˆê’v
+R 0160 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l}.16B
+ EˆÊî•ñ
+S 0161 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l <nickname>.24B}.40B*
+ EˆÊ•ÏX
+R 0162 <len>.w <skill_point>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
+ ƒMƒ‹ƒhƒXƒLƒ‹
+R 0163 <len>.w { <nick>.24B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B <’Ç•ú——R>.40B }.88B*
+ ƒMƒ‹ƒh’Ç•úƒŠƒXƒg
+S 0165 <myaccID>.l <guild name>.24B
+ ƒMƒ‹ƒhì¬
+R 0166 <len>.w {<index>.l <name>.24B }.28B*
+ EˆÊ–¼ƒŠƒXƒg
+R 0167 <type>.b
+ ƒMƒ‹ƒh쬇”Û
+ type = 0 ƒMƒ‹ƒh쬬Œ÷
+ type = 1 ‚·‚łɃMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚é
+ type = 2 “¯–¼‚̃Mƒ‹ƒh‚ª‚ ‚é
+ type = 3 ƒGƒ“ƒyƒŠƒEƒ€–³‚µ
+S 0168 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
+ ƒMƒ‹ƒhŠ©—U
+R 0169 <type>.B
+ ƒMƒ‹ƒhŠ©—UŒ‹‰Ê
+ type = 0 ‘¼‚̃Mƒ‹ƒh‚ɉÁ“ü‚µ‚Ä‚¢‚é
+ type = 1 ‹‘”Û‚³‚ꂽ
+ type = 2 ‰Á“ü‚µ‚½
+ type = 3 ’èˆõ‚ð’´‰ß
+R 016A <guild ID>.l <guild name>.24B
+ ƒMƒ‹ƒhŠ©—U‚³‚ꂽ
+S 016B <guild ID>.l <type>.l
+ ƒMƒ‹ƒhŠ©—U•ÔM
+ type=0 ‹‘”Û‚·‚é
+ type=1 ‹–‘ø‚·‚é
+R 016c <guild ID>.l <emblem ID>.l <mode>.l ?.5B <guild name>.24B
+ loginŽžƒMƒ‹ƒhî•ñ
+ mode=Ž©•ª‚ÌŠ‘®EˆÊ‚Ìmode
+R 016d <ID>.l <charactor ID>.l <online>.l
+ ƒMƒ‹ƒhƒƒ“ƒo‚ªlogin‚µ‚½”²‚¯‚½“™
+S 016E <guildID>.l <mess1>.60B <mess2>.120B
+ ƒMƒ‹ƒh’mÝ’è
+R 016F <mess1>.60B <mess2>.120B
+ ƒMƒ‹ƒh’m
+S 0170 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
+ “¯–¿—v¿Š©—U
+R 0171 <SorceAccID>.l <guild name>.24B
+ “¯–¿—v¿Š©—U‚³‚ꂽ
+S 0172 <SorceAccID>.l <type>.l
+ “¯–¿—v¿•ÔM
+ type=0 ‹‘”Û‚·‚é
+ type=1 ‹–‘ø‚·‚é
+R 0173 <type>.B
+ type = 0 ‚·‚Å‚É“¯–¿ŠÖŒW
+ type = 1 “¯–¿‹‘”Û‚³‚ꂽ
+ type = 2 “¯–¿¬Œ÷
+ type = 3 ‘ŠŽèƒMƒ‹ƒh‚Ì“¯–¿ƒMƒ‹ƒh”‚ª’´‰ß
+ type = 4 Ž©•ª‚̃Mƒ‹ƒh‚Ì“¯–¿ƒMƒ‹ƒh”‚ª’´‰ß
+R 0174 <len>.w {<index>.l <mode>.l <index>.l <exp_mode>.l <nickname>.24B}.40B*
+ EˆÊ•ÏX’Ê’m
+R 0177 <len>.w <index>.w*
+ ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg
+S 0178 <index>.w
+ ƒAƒCƒeƒ€ŠÓ’è
+R 0179 <index>.w <fail>.B
+ ƒAƒCƒeƒ€ŠÓ’茋‰ÊBfail=00‚ŬŒ÷Bfail=01‚Á‚Ä‚ ‚é‚Ì‚©?
+S 017A <index>.w
+ ƒJ[ƒh‚vƒNƒŠƒbƒN
+R 017B <len>.w {<index>.w}*
+ ƒJ[ƒh‘}“ü‚Å‚«‚éƒAƒCƒeƒ€Index”Ô†
+S 017C <SrcIndex>.w <DescIndex>.w
+ Src ‚ðDesc‚É“Ë‚Áž‚Þ
+R 017D <DescIndex>.w <SrcIndex>.w <fail>.b
+ Src ‚ðDesc‚É“Ë‚Áž‚Ý<fail> 0=¬Œ÷ 1=Ž¸”sH
+S 017e <len>.w <message>.?B
+ ƒMƒ‹ƒh“àƒƒbƒZ[ƒW”­Œ¾
+R 017f <len>.w <message>.?B
+ ƒMƒ‹ƒh“àƒƒbƒZ[ƒWŽóM
+S 0180 <charactorID>.l
+ ƒMƒ‹ƒh“G‘Î
+R 0181 <flag>.b
+ ƒMƒ‹ƒh“G‘Ή”Û
+ flag=0 “G‘άŒ÷
+ flag=1 “G‘΃Mƒ‹ƒh”‚ª‘½‚·‚¬‚é
+ flag=2 ‚·‚Å‚É“G‘Ί֌W
+R 0182 <accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l ?.50B <nick>.24B
+
+S 0183 <guild_id>.l <type>.l
+ ƒMƒ‹ƒhŠÖŒW‰ðÁ
+R 0184 <guild_id>.l <type>.l
+ ƒMƒ‹ƒhŠÖŒW‰ðÁ’Ê’m
+R 0185 <flag>.l <guild_id>.l <guild_name>.24B
+ ƒMƒ‹ƒhŠÖŒW’ljÁ flag=0 “¯–¿/ 1 “G‘Î
+R 0187 <account ID>.l
+ aliveM†?
+R 0188 <fail?>.w <index>.w <val>.w
+ •Ší¸˜BBŒ‹‰Ê+val•Ší‚É
+R 0189 <fail?>.w
+ “äBƒeƒŒƒ|(ƒ[ƒvƒ|[ƒ^ƒ‹memo)Ž¸”s?
+ 1 memo‹ÖŽ~’nˆæ
+S 018a ?.w
+ ƒQ[ƒ€I—¹
+R 018b <fail>.w
+ ƒQ[ƒ€I—¹/ƒLƒƒƒ‰ƒZƒŒ‰ž“šBfail=0¬Œ÷Bfail=1Ž¸”s?
+R 018C <MonsID>.w <“™‹‰>.w <‘å¬>.w <¶–½’l>.w <?>.w <–hŒä—Í>.w <Ží‘°>.w <–‚–@–hŒä—Í>.w <‘®«>.w <–‚–@‘Š«‘®«>.9b
+ wiz‚Ì“G‚̃Zƒ“ƒXŒ‹‰Ê
+ 0 ¬Œ^
+ 1 ’†Œ^
+ 2 ‘åŒ^
+R 018d <length>.w { <ItemID>,w ?.w <CharID?>.l }.8B*
+ »‘¢‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg•\Ž¦(?‚Ì•”•ª‚Í0012ŒÅ’è)
+S 018e <MakeItemID>.w <slot1ItemID>.w <slot2ItemID>,w <slot3.ItemID>.w
+ »‘¢ƒAƒCƒeƒ€‚Ì‘I‘ð
+R 018f <flag>.w [00] <MakeItemID>.w
+ »‘¢Œ‹‰Ê(flag = 00‚Ȃ笌÷ 01‚Ȃ玸”s)
+S 0190 <skill lv>.w <skill code>.w <x & y>.l <message>.80b
+ ƒƒbƒZ[ƒW(ƒg[ƒL[ƒ{ƒbƒNƒXj
+R 0191 <ID>.l <message>.80B
+ ƒg[ƒL[ƒ{ƒbƒNƒX‚̃ƒbƒZ[ƒW
+R 0192 <x & y>.l <type>.w <mapname>.16b
+ ƒAƒCƒXƒEƒH[ƒ‹“™‚É‚æ‚é’nŒ`‘®«•Ï‰»
+S 0193 <ID>.l
+ ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«?
+R 0194 <ID>.l <nick>.24B
+ ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«‰ž“š?
+R 0195 <ID>.l <nick>.24B <party name>.24B <guild name>.24B <class name>.24B
+ ƒMƒ‹ƒhŠ‘®PC‚ÌꇂÌ0094•Ô“š
+R 0196 <type>.w <ID>.l
+ ‘‹­ŒnƒXƒLƒ‹Žg—pŽž‚̃ƒbƒZ[ƒWFXBID‚Ítarget‚ÆŽv‚í‚ê‚邪Ž©•ª‘ŠŽè‚Ì‚Ý‚µ‚©—ˆ‚È‚¢?
+ type=00 2HQ•t—^uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
+ type=01 2HQ‰ðœuUŒ‚‘¬“x‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ type=02 IMPOSITIO•t—^u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
+ type=03 IMPOSITIO‰ðœu•Ší‚ÌUŒ‚—Í‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ type=04 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ type=05 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ type=07 ASPERSIO•t—^u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ type=08 ASPERSIO‰ðœu•Ší‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ type=09 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ type=0a u–h‹ï‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ type=0b KYRIE•t—^uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½Bv
+ type=0c KYRIE‰ðœuƒoƒŠƒAó‘Ô‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ type=0d uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ type=0e uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ type=0f uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ type=10 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ type=11 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ type=12 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+R 0196 <type>.w <ID>.l <switch>.b iƒRƒ‚ƒhˆÈ~j
+ switch=0‚ʼnðœ,1‚Å•t‰Á
+ type=00 ƒvƒƒ{ƒbƒN
+ type=01 ƒCƒ“ƒfƒ…ƒA
+ type=02 uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bvi2HQj
+ type=03 W’†—ÍŒüã
+ type=04 ƒnƒCƒfƒBƒ“ƒO
+ type=05 ƒNƒ[ƒLƒ“ƒO
+ type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½BviƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“j
+ type=07 u“ł𔽎˂ł«‚éó‘Ô‚É‚È‚è‚Ü‚µ‚½Bviƒ|ƒCƒYƒ“ƒŠƒAƒNƒgj
+ type=08 uƒNƒ@ƒOƒ}ƒCƒAó‘Ô‚É‚È‚èAEEEv
+ type=09 uƒGƒ“ƒWƒFƒ‰ƒXó‘Ô‚É‚È‚èAEEEv
+ type=0a ƒuƒŒƒbƒVƒ“ƒO
+ type=0b ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX
+ type=0c u‘¬‚³‚ª‘‰Á‚µ‚Ü‚µ‚½vi‘¬“x‘‰Áj
+ type=0d u‘¬‚³‚ªŒ¸­‚µ‚Ü‚µ‚½vi‘¬“xŒ¸­j
+ type=0e uƒXƒ[ƒ|ƒCƒYƒ“ó‘Ô‚É‚È‚è‚Ü‚µ‚½viƒXƒ[ƒ|ƒCƒYƒ“j
+ type=0f u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½viƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXj
+ type=10 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½viƒTƒtƒ‰ƒMƒEƒ€j
+ type=11 u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½viƒAƒXƒyƒ‹ƒVƒIj
+ type=12 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½vi¹‘Ì~—Õj
+ type=13 uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½viƒLƒŠƒGƒGƒŒƒCƒ\ƒ“j
+ type=14 uƒ}ƒOƒjƒtƒBƒJ[ƒgó‘Ô‚É‚È‚è‚Ü‚µ‚½v
+ type=15 uƒOƒƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½v
+ type=16 uƒŒƒbƒNƒXƒG[ƒeƒ‹ƒió‘Ô‚É‚È‚è‚Ü‚µ‚½v
+ type=17 uƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…ó‘Ô‚É‚È‚è‚Ü‚µ‚½v
+ type=18 uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
+ type=19 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
+ type=1a uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½v
+ type=1b ƒyƒRƒyƒR‹Ræ
+ type=1c ‘é
+ type=1d Ž€‚ñ‚¾‚Ó‚è
+ type=1e u‹©‚Ñ‚Ü‚µ‚½viƒ‰ƒEƒhƒ{ƒCƒXj
+ type=1f uƒGƒiƒW[ƒR[ƒgó‘Ô‚É‚È‚è‚Ü‚µ‚½v
+ type=20 u–h‹ï‚ª‰ó‚ê‚Ü‚µ‚½v
+ type=21 u•Ší‚ª‰ó‚ê‚Ü‚µ‚½v
+ type=22 “äi–ڂ̃Aƒbƒv‚Æ‚¢‚¤ƒAƒCƒRƒ“F–Ó–ÚHHj
+ type=23 d—Ê50“’´‚¦
+ type=24 d—Ê90“’´‚¦
+ type=25 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
+ type=26 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
+ type=27 “äuUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½vi‚˜‚QƒAƒCƒRƒ“F‘¬“xŒnƒ|[ƒVƒ‡ƒ“Hj
+ type=28 (–¢Žg—p‚Á‚Û‚¢HF•s‰Â‚Ɖðœ‚ÅŒø‰Ê‚ªˆá‚¤)
+ type=29 “äu‘¬‚³‚ª‘‰Á‚µ‚Ü‚µ‚½vi”’‚¢ƒAƒCƒRƒ“j
+ type=32 ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“
+ type=33 ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh
+ type=34 ƒXƒgƒŠƒbƒvƒA[ƒ}[
+ type=35 ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€
+ type=36 ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW
+ type=37 ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
+ type=38 ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW
+ type=39 ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW
+ type=3a ƒI[ƒgƒK[ƒh
+ type=3b ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh
+ type=3d ƒvƒƒ”ƒBƒfƒ“ƒX
+ type=3e ƒfƒBƒtƒFƒ“ƒ_[
+ type=41 ƒI[ƒgƒXƒyƒ‹
+ type=44 ƒXƒsƒAƒNƒBƒbƒPƒ“
+ type=56 ”š—ô”g“®(ƒAƒCƒRƒ“‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñB)
+ type=57 ‹à„(•\Ž¦‚Í‚³‚ê‚È‚¢‚ª‹à„‚̉ðœ‚Í‚³‚ê‚é‚悤‚Å‚·B)
+ type=59 ƒRƒ“ƒ{ƒfƒBƒŒƒC
+ type=5a ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[
+ type=5b ƒtƒƒXƒgƒEƒFƒ|ƒ“
+ type=5c ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
+ type=5d ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
+
+S 0197 <type>.w
+ type=0 /resetstate
+ type=1 /resetskill
+ Œø”\‚Í–³‚µ?
+R 0199 <type>.w
+ type=1 pvpƒ‚[ƒhŠJŽn?
+ type=3 gvgƒ‚[ƒhŠJŽn?
+R 019a <ID>.l <rank>.l <num>.l
+ pvp‡ˆÊ rank/num
+R 019b <ID>.l <type>.l
+ ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
+ type=0 base lvup?
+ type=1 job lvup?
+ type=2 •Ší¸˜BŽ¸”s
+ type=3 •Ší¸˜B¬Œ÷
+
+R 019d <?>.4B
+ GMƒRƒ}ƒ“ƒh/hide
+
+S 0149 <ID>.l <type>.B <time>.w
+ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð‰º‚°‚éi‰ð‚¯‚éjvŽg—p ¨ type=00
+ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ðã‚°‚éiŠ|‚¯‚éjvŽg—p ¨ type=01
+ time‚Í•ª’PˆÊ‚Å‚·iŠm‚©
+
+R 019e
+ •ßŠlƒ‚ƒ“ƒXƒ^[Œˆ‚ß
+S 019f <ID>.l
+ •ßŠlƒ‚ƒ“ƒXƒ^[Žw’è
+R 01a0 <fail>.B
+ •ßŠl”»’è
+ fail=01‚ŬŒ÷A00‚ÅŽ¸”s
+S 01a1 <param>.1B
+ <param>
+ 0x00Fƒyƒbƒgó‘Ô•\Ž¦
+ 0x01F‰a‚ð—^‚¦‚é
+ 0x02FƒpƒtƒH[ƒ}ƒ“ƒX
+ 0x03F—‘‚É–ß‚·
+ 0x04FƒAƒNƒZƒTƒŠ‰ðœ
+R 01a2 <pet name>.24B <name flag>.B <lv>.w <hungry>.w <friendly>.w <accessory>.w
+ ƒyƒbƒg‚Ìó‘Ô
+ name flag:00=–¼‘O–¢Ý’è 01=–¼‘OÝ’èÏ‚Ý(•ÏX•s‰Â)
+ lv=ƒyƒbƒg‚̃Œƒxƒ‹Ahungry=–ž• “x(0~100)Afriendly=e–§“x(‰Šú’l250?)Aaccessory=ƒAƒNƒZƒTƒŠ‚ÌItemID
+R 01a3 <fail>.B <itemID>.w
+ <fail>
+ 0x00F‰a‚â‚莸”s
+ 0x01F‰a‚â‚謌÷
+R 01a4 <type>.B <ID>.l <val>.l
+ ƒyƒbƒgŠÖ˜A’Ê’m
+ type=00,val=00 ƒyƒbƒg›z‰»Žž‚É‘—‚ç‚ê‚Ä‚­‚éBƒyƒbƒg”FŽ¯—pH
+ type=01 e–§“x•Ï‰»
+ type=02 –ž• “x•Ï‰»
+ type=03 ƒAƒNƒZƒTƒŠ•Ï‰»(0‚Å–¢‘•”õ)
+ type=04 ƒpƒtƒH[ƒ}ƒ“ƒX Šm”F‚³‚ꂽval=1~3
+ (4‚̓XƒyƒVƒƒƒ‹ƒpƒtƒH[ƒ}ƒ“ƒXH)
+ type=05 HŠm”F‚³‚ꂽval=0x14
+S 01a5 <pet name>.24B
+ ƒyƒbƒg‚Ì–¼‘OŒˆ‚ß
+R 01a6 <len>.w <index>.w*
+ ƒyƒbƒg‚Ì—‘ƒŠƒXƒg
+S 01a7 <index>.w
+ ƒyƒbƒg‚Ì—‘ƒŠƒXƒg‚ª‘I‘ð‚³‚ê‚½
+S 01a9 <emotion>.l
+ ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“‘—M
+R 01aa <ID>.l <emotion>.l
+ ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“ŽóM
+ <emotion>
+ 33ˆÈ‰º‚Ì‚Æ‚«FƒGƒ‚[ƒVƒ‡ƒ“
+ 34ˆÈã‚Ì‚Æ‚«F”­Œ¾ƒe[ƒuƒ‹H
+R 01ac <object id>.l
+ ƒAƒ“ƒNƒ‹‚Ì”­“®(‚Ý’u)Žž‚Ì‚Ý–ˆ‰ñoŒ»(‹@”\‚Í“ä)
+R 01ad <len>.l <item>.w
+ –îì‚è‚Ì쬉”\ITEM•\ŽóM
+S 01ae <itemID>.w
+ –îì‚è‚ÅŽg‚¤Þ—¿‘—M
+S 01af <type>.w
+ ƒ`ƒFƒ“ƒWƒJ[ƒgiƒJ[ƒg‘I‘ðj
+ type=1 ƒm[ƒ}ƒ‹ƒJ[ƒg
+R 01b0 <monster id>.l <?>.b <new monster code>.l
+ –û‚̃Nƒ‰ƒXƒ`ƒFƒ“ƒW
+ <new monster code>‚̓`ƒFƒ“ƒWŒã‚̃R[ƒh(1001`)‚ðdword‚Å
+S 01b2 <len>.w <message>.80B <flag>.B {<index>.w <amount>.w <value>.l}.8B*
+ ˜I“XŠJÝ
+ flag F 0=ƒLƒƒƒ“ƒZƒ‹ , 1=ƒI[ƒvƒ“
+R 01b3 <filename>.64B <type>.B
+ R 0145‚ÌãˆÊŒÝŠ·
+R 01B6 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l <now_exp>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«ŒüF-V>.l <«ŒüR-W>.l <members>.l <guild name>.24B <guild master>.24B <agit?>.20B
+ ƒMƒ‹ƒhî•ñ
+R 01b9 <ID>.I
+ ”íƒ_ƒ“™‚É‚æ‚éID‚̉r¥’†’f
+R 01c4 <index>.w <amount>.l <itemID>.w <item data>.12B
+ ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€
+R 01c8 <index>.w <item ID>.w <ID>.l <amount left>.w <type>.B
+ ƒAƒCƒeƒ€Žg—p‰ž“šB(00a8‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
+ type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
+R 01c9 <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B ?.81b
+ ƒXƒLƒ‹Œø”\’nì¬(011f‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type 0x7e:SWA0x7f:‰Î•ÇA0x80 ƒ|ƒ^ŠJ‚«’†A0x81 ƒ|ƒ^ŠJ‚«’¼‘O
+ 0x82 ¹‘ÌA0x83 ƒTƒ“ƒNA0x84 ƒ}ƒOƒkƒXA0x85 ƒjƒ…[ƒ}
+ 0x86 0x86 ‘å–‚–@(SG/MS/LoV/GX)A0x87 ƒtƒ@ƒCƒ„[ƒsƒ‰‘Ò‹@
+ 0x88 ƒtƒ@ƒCƒ„[ƒsƒ‰”š”­A0x87`0x8B •\Ž¦–³‚µA
+ 0x8c ƒg[ƒL[ƒ{ƒbƒNƒX(”­“®’†)A0x8D ƒAƒCƒXƒEƒH[ƒ‹
+ 0x8E ƒNƒƒOƒ}ƒCƒAA0x8f ƒuƒ‰ƒXƒgƒ}ƒCƒ“A0x90 ƒXƒLƒbƒh
+ 0x91 ƒAƒ“ƒNƒ‹A0x92 ƒxƒmƒ€ƒ_ƒXƒgA0x93 ƒ‰ƒ“ƒhƒ}ƒCƒ“
+ 0x94 ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒvA0x95 ƒTƒ“ƒhƒ}ƒ“
+ 0x96 ƒtƒ‰ƒbƒVƒƒ[A0x97 ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv
+ 0x98 ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA0x99 ƒg[ƒL[ƒ{ƒbƒNƒX
+ 0x9A ƒ{ƒ‹ƒP[ƒmA0x9B ƒfƒŠƒ…[ƒWA0x9C ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
+ 0x9D ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[A0x9E Zenyƒ}[ƒNA0x9F Zeny‘Ü
+ 0xA0 ‰ñ‚é—΂̗ÖA0xA1 ƒsƒ“ƒN‚̉¹•„ (“ñ˜A•„—L‚è
+ 0xA2 ^‚ñ’†‚É“_‚Ì‚ ‚éŒõ‚Ì‹ÊA0xA3 ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒO
+ 0xA4 [•£‚Ì’†‚ÉA0xA5 ‰ñ‚é‚¢—ÖA0xA6 •s‹¦˜a‰¹
+ 0xA7 Œû“JA0xA8 —[—z‚̃AƒTƒVƒ“ƒNƒƒXA0xA9 ƒuƒ‰ƒM‚ÌŽ
+ 0xAA ƒCƒhƒDƒ“‚Ì—ÑŒçA0xAB Ž©•ªŸŽè‚ȃ_ƒ“ƒXA0xAC ƒnƒ~ƒ“ƒO
+ 0xAD Ž„‚ð–Y‚ê‚È‚¢‚ÅcA0xAE ƒT[ƒrƒXƒtƒH[ƒ†[
+ 0xAF ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒOA0xB0 •\Ž¦–³‚µ
+ 0xB0 ƒOƒ‰ƒtƒBƒeƒB,
+ 0xB1 ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“A0xB2`0xBF •\Ž¦–³‚µ
+ 0xB2 ƒsƒ“ƒN‚̃[ƒvƒ|[ƒ^ƒ‹•—
+ 0xB3 ¬‚³‚È\Žš‰Ë‚ª‚Ó‚æ‚Ó‚æ
+ 0xB4 ƒoƒWƒŠƒJA0xB5 ƒGƒtƒFƒNƒg‚È‚µH
+ 0xB6 •‚¢~‚ª—§‘Ì“I‚É•‚‚©‚Ñオ‚é
+ 0xB7 ƒNƒ‚‚Ì‘ƒA0xB8` ƒGƒtƒFƒNƒg‚È‚µH
+
+ ‘¼î•ñ‹‚Þ
+ ?.81b‚Í“äB
+R 01cd (<sid>.l)x7
+ ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆŽóM
+ <sid>x7 ‚É‚Í NB,CB,FB,LB,SS,FBL,FD ‚̇‚ŃXƒLƒ‹ƒR[ƒh‚ªdword‚Å“ü‚é
+ ‚Ü‚¾‘I‘ð‚Å‚«‚È‚¢ƒXƒLƒ‹‚Ì•”•ª‚Í <sid> = 0x00000000 ‚ª“ü‚é
+S 01ce <sid>.l
+ ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆ‘—M
+R 01cf <crusader id>.l <target id>.l <?>.18b
+ Œ£gó‘Ôƒ^[ƒQƒbƒgON/OFFBŒ£g‚ªØ‚ê‚é‚Æ <target id> ‚ª 0x00000000 ‚É‚È‚é
+
+R 01d0 <ID>.l <num>.w
+ <num> : ‹CŒ÷‚Ì”(”ñLv)
+R 01d1 <monk id>.l <target monster id>.l <bool>.l
+ ”’‰HŽæ‚èó‘ÔON/OFFB<bool> ‚Í”’nŽæ‚謗§Žž‚É 0x00000001 ‰ðœŽž‚É 0x00000000 ‚ª—ˆ‚é
+R 01d2 <id>.l <delay>.l
+ ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC(msec)
+ ŽO’iE˜A‘Å‚ÍŠî–{ƒfƒBƒŒƒC1000(+300)A–Ò—´‚ÍŠî–{ƒfƒBƒŒƒC700(+300)
+R 01d4 <ID>.l
+ •¶Žš—ñ“ü—Í‘‹•\Ž¦(ID‚ÍNPC‚ÌID‚ª“ü‚é)
+S 01d5 <len>.w <ID>.l <input>.?B 00
+ •¶Žš—ñ“ü—Í“à—e‘—M(ID‚ÍNPC‚ÌID‚ª“ü‚é)
+R 01d7 <ID>.l <equip point>.b <item id1>.w <item id2>.w
+ ‘•”õƒOƒ‰ƒtƒBƒbƒN <equip point> ‚Í 02Žè‚Æ09‘«‚Ì‚ÝŠm”FBid2‚ͶŽè
+R 01d8 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w <head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B ?.B
+ ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?(0078‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+R 01d9 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w.<head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B ?.B
+ ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?(0079‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+R 01da <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.<item id1>.w <item id2>.w <head option bottom>.w <server tick>.l <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B ?.B
+ •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ(007b‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+S 01db
+ ˆÃ†‰»key—v‹
+R 01dc <len>.w <key>.?B
+ ˆÃ†‰»key‘—•t
+S 01dd <version>.l <account name>.24B <md5 binary>.16B <version2>.1B
+ id&ˆÃ†‰»Ï‚Ýpass‘—M
+ ‡‚ɃNƒ‰ƒCƒAƒ“ƒg‚ª01db‚ð‘—‚éA
+ ŽI‚ª01dc‚Åkey‚ð•Ô‚·A
+ ƒNƒ‰ƒCƒAƒ“ƒg‚ª"<key><password>"‚ɂ‚¢‚Ämd5ŒvŽZ‚µ
+ <md5 binary>‚ÌŠ‚ð–„‚ß‚Ä01dd‚ð‘—‚éB
+ <passwordencrypt2>‚ÌŽž‚Í
+ "<key><password>"‚ɑ΂µ‚Ämd5ŒvŽZ‚Æ‚µ‚Ä‚¢‚銂ð
+ "<password><key>"‚Æ•ÏX‚·‚é
+R 01de <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.l <param2>.w <param3>.w <type>.B
+ UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@(0114‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
+ type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
+ type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
+ type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
+ type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
+S 01df <ID>.|
+ GM‰EƒNƒŠƒbƒN‚É‚æ‚éID‚̃`ƒƒƒbƒg‹ÖŽ~‰ñ”ŽQÆH
+R 01e1 <ID>.l <num>.w
+ <num> : ‹CŒ÷‚Ì”(”ñLv) ˆê“x•\Ž¦‚µ‚½‚çŒã‚Ç‚ñ‚Ènum‚ª—ˆ‚Ä‚à–³Ž‹‚³‚ê‚éB
+R 01e6 <partner name>.24B
+ Œ‹¥ƒXƒLƒ‹‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž‚Ì‹©‚Ѻ
+S 01e7
+ ƒXƒpƒmƒr‚Å/doridori‚µ‚½‚ç”ò‚ñ‚Å‚­‚éBSPR‰ñ•œ—Ê2”{ƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
+S 01e8 <party name>.24B <item1>B <item2>B
+ <item1>ƒAƒCƒeƒ€ŽûW•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒBŒö—L
+ <item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒB‚É‹Ï“™•ª”z
+ (00f9‚ÌãˆÊƒo[ƒVƒ‡ƒ“)
+R 01ea <ID>.l
+ Œ‹¥ƒGƒtƒFƒNƒg(‰¹ŠyAŽ†á)
+ ID‚ÍV•w‚Ì‚à‚Ì‚ª“ü‚éH
+S 01ed
+ ƒXƒpƒmƒr‚ª”š—ô”g“®‚É‚È‚éƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
+R 01ee <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ –î‚ÌꇂÍ?.2B‚ª0x8000‚É‚È‚é
+ 00a3‚©‚ç•ÏX
+R 01ef <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
+ 0123‚©‚ç•ÏX
+R 01f0 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ 00a5‚©‚ç•ÏX
+R 01f4 <name>.24B <trade id?>.L <LV>.w
+ æ•û‚©‚çŽæˆø—v¿
+ 00e5‚©‚ç•ÏX
+R 01f5 <result>.B <trade id?>.L <LV>.w
+ ‚±‚¿‚ç‚©‚ç‚ÌŽæˆø—v¿‚ɑ΂·‚锽‰ž
+ 00e7‚©‚ç•ÏX
+S 0200 <login name>.24B
+ ragexe‚É/accountƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚Ä‹N“®‚·‚é‚ƃƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒg
+S 0204 <?>.16B
+ ƒƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB16ƒoƒCƒg‚͌ŒèH
+S 020B <?>.17B
+ ƒLƒƒƒ‰ƒNƒ^ƒT[ƒoÚ‘±—v‹0065‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB1+0204‚Ì16ƒoƒCƒg‚Å17ƒoƒCƒgH
diff --git a/doc/conf_ref.txt b/doc/conf_ref.txt
index fc4cd72e6..b31ffc5c2 100644
--- a/doc/conf_ref.txt
+++ b/doc/conf_ref.txt
@@ -1,1996 +1,1996 @@
-==========================================================================
-eAthena dev 1.0.0 mod1004 Reference +alpha of the present conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- It is the reference of the setting method of an Athena setting file.
-although it is not a HowTo, it not Those who cannot use Athena even if they see this
- To give up obediently is safer.
-
-
-< The list of conf >
-
- login_athena.conf A setup of login-server
- char_athena.conf A setup of char-server
- inter_athena.conf A setup of inter-server
- map_athena.conf A setup of map-server
- battle_athena.conf This file has been splitted into 13 files, separating them
- depending on their function. Those files are:
-
- *battle.conf Regarding battle system configuration.
- *client.conf Regarding client configuration.
- *drops.conf Regarding mob drops configuration
- *guild.conf Regarding guild configuration.
- *monster.conf Regarding monsters guidance and settings.
- *player.conf Regarding player and/or character settings.
- *exp.conf Regarding exp settings.
- *items.conf Regarding items settings.
- *party.conf Regarding party settings.
- *skill.conf Regarding skill settings
- *gm.conf Regarding GM settings (not GM commands).
- *misc.conf Regarding various settings (such as PK)
- *pet.conf Regarding pet settings.
- atcommand_athena.conf A setup of map-server (setup of the GM command or @ command)
- ladmin_athena.conf A setup of ladmin ('c' version)
-
-
-< The fundamental setting method >
-
-One line "key: Enter as a value."
-<Example>
-key: value
-
-Head of the sentence It will become a comment if it begins by //.
-<Example>
-//Since this line is a comment, it is not processed.
-
-< Two or more same items >
-
-Priority is given to what was written later unless it is written especially clearly that two or more same items are written.
-login_athena.conf allow and deny -- and -- map_athena.conf map, npc, etc.
-Another processing will be carried out if two or more lines are written.
-
-==========================================================================
-1. conf/login_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- A setup of login-server (server which manages account) is described.
- It mainly becomes a setup of an administrator.
-
-
-< Explanation of a key >
-
-If you change one of these parameters, you must restart login-server to update.
-If you repeat one parameter (except 'allow', 'deny' or 'ladminallowip') in the configuration file, only the latest will be validated.
- 'Allow', 'deny' and 'ladminallowip' parameters are list parameters. Add as many 'allow', 'deny' or 'ladminallowip' as you need.
-
-login_port
- Port to bind login-server to (always binds to all IP addresses)
- It is the port used by login-server. It can be omitted and a default is 6900.
- Default value: 6900.
-
-admin_pass
- It is the administrator password used to administrate the login-server through a remote connection.
- You will found some tools in the tool directory, and specially the tool
- ./tool/ladmin (for Login ADMINistration), a perl software, which manages all accounts.
- Void password will not work.
- NOTICE: You must change this or attackers can exploit your server.
- Default value: admin. CHANGES this default value to avoid hack.
-
-ladminallowip
- It's a list parameter. To add an item in this list, just add a new line. Each line can only have 1 parameter.
- This list indicates the IP that the server accepts for a remote administration.
- This parameter accepts IP descriptions, like:
- IP or the begining of IP: it's a characters match. Write an IP (123.456.789.012) or the begining of the IP (123.456.).
- Because it's a characters match, the IP 123.4 matches with 123.4.xxx.yyy and 123.4z.xxx.yyy. So, add a final '.' to be sure of the IP.
- Example:
- allow: 127.0.0.1
- allow: 192.168.10.
- IP with number of bits for a network: it's a logical match. Write the network like this: 123.456.789.012/<#_of_mask_bits>
- Don't use the final '.', but use all four values.
- Example:
- allow: 127.0.0.1/32 (match only 1 IP, because 32 bits match all bits).
- allow: 192.168.10/24 (matches the network begining by 192.168.10).
- IP with mask of a network: it's a logical match. Write the network like this: 123.456.789.012/345.678.901.234
- Don't use the final '.', but use all four values for the IP and the mask.
- Example:
- allow: 127.0.0.1/255.255.255.255 (match only 1 IP).
- allow: 192.168.10.0/255.255.255.0 (matches the network begining by 192.168.10).
- all: matches any IP.
- Example:
- allow: all.
- clear: clears the list at this point. Really useful for 'import' parameter, in the new configuration file.
- Example:
- allow: clear.
- Add as many IP's as you wish.
- Default value: all.
-
-gm_pass
- It is the required password when a player wants to change its (normal) account to a GM (Game Master) account.
- It is used by the @gm command.
- Level of gm is set with level_new_gm parameter.
- NOTICE: You should also change this one.
- Default value: gm. CHANGES this default value to avoid player hack.
-
-level_new_gm
- Level of new GM created with @gm command. (default: 60)
- If you set to 0, you disable creation of new GM with @gm.
- To be able to create a gm with @gm, you must:
- - give a level to this value (not 0)
- - enable to level 0 the @gm command (atcommand_athena.conf) (default 100)
- - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
- - and normal player must give correct password when he use the @gm command
- Possible value: 0 to 99
- Default value: 60
-
-new_account
- It is whether to permit new account creation.
- When allowed, the player must add _F or _M at the end of its login account to create a new account.
- This extension of the account gives the sex of the new created account.
- Without the _F/M, the account must have at least 4 characters.
- The account will not have e-mail to protect characters against deletion.
- The given password at first connection (when the account is created) is the account password.
- The value can be: 1 (to allow creation) or 0 (to forbid creation).
- Default value: 1.
-
-account_filename
- It specifies the accounts save file.
- Gives the accounts txt database name and path to stores accounts information.
- Look into the file to have a short description of the database structure.
- Can be omited, a default is save/account.txt.
- Default value: save/account.txt.
-
-gm_account_filename
- It specifies which account IDs have GM privileges, and what level they have.
- We recommand to use only ID value lower than first normal player ID (2000000).
- Levels ranges from 0 (no privilege/normal player) to 99 (highest privilege).
- If you change a value inside this file, you must restart login-server to use the new value
- or use reloadgm ladmin command.
- Can be omited, a default is conf/GM_account.txt.
- Default value: conf/GM_account.txt
-
-gm_account_filename_check_timer
- Timer to check if GM_account file has been changed and reload GM account automaticaly
- (in seconds)
- Value: 0 (disabled), or 2 or more.
- Default: 15
-
-login_log_filename
- Gives the log file name and path to stores logs information.
- All operations done by the login-server are written in this file with a time stamp.
- Default value: log/login.log
-
-login_log_unknown_packets_filename
- Gives the file name and path of the file that logs the received unknown packets.
- It's used for debug or hack check.
- All information are displayed with the time stamp, the ip of the source, the packet number,
- the number of received bytes and the detail of the packet with hex and text values. Example:
- 01-06-2004 21:25:21.579: receiving of an unknown packet -> disconnection
- parse_login: connection #5 (ip: 82.64.111.96), packet: 0x4e92 (with being read: 28).
- Detail (in hex):
- 92 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ’N..............
- 00 00 00 00 00 00 00 00 00 00 00 00 ............
- Default value: log/login_unknown_packets.log
-
-save_unknown_packets
- It indicates if the unknown packets are saved or not.
- The unknown packets received from the char-server or remote administration does not relate to this parameter,
- because they are always saved.
- The value can be: 1 (to save unknown packets) or 0 (to not save them).
- Be careful: if you receive an attack, your hard disk can cause lag...
- So, active this option with a speed hard disk or for debug only.
- Default value: 0
-
-display_parse_login
- It indicates if you want display the parse of the packets received in a normal connection.
- At all received packets in normal connection, the server display a message about the size and the value.
- It's useful for debug. Possible values: 0: no (default), 1: yes.
- Default value: 0
-
-display_parse_admin
- It's same of 'display_parse_login' parameter, but only for remote administration received packets.
- It's useful for debug. Possible values: 0: no (default), 1: yes.
- Default value: 0
-
-display_parse_fromchar
- It's same of 'display_parse_login' parameter, but only for char-server received packets.
- It's useful for debug. Possible values: 0: no (default), 1: yes (without packet 0x2714), 2: all packets.
- Default value: 0
-
-date_format:
- indicate how to display date in logs, to players, etc.
- 0: 31-12-2004 23:59:59
- 1: 12-31-2004 23:59:59
- 2: 2004-31-12 23:59:59
- 3: 2004-12-31 23:59:59
- Default value: 3
-
-min_level_to_connect
- Indicate the minimum GM level of player that the server accepts to connection.
- 0: all players (normal player are 0. it's default), or
- 1-99: GM level at least with level x
- Default value: 0 (any player or GM)
-
-add_to_unlimited_account
- Give possibility to adjust (ladmin command: timeadd) the time of an unlimited account.
- If set to on/1/yes..., the adjustment is be done from actual time to set the final time of the account.
- If set to no/0/no..., the adjustment can not be done on an unlimited account.
- You must set (ladmin command: timeset) a final time before to adjust (ladmin command: timeadd)
- Default value: no
-
-start_limited_time
- 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)
- Default value: -1
-
-check_ip_flag
- It's to check IP of a player between login-server and char-server (part of anti-hacking system)
- If player doesn't have same IP, connection is refused.
- Set to 0/off/no to not check IP of player.
- Set to 1/on/yes if you want to check (default)
- Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
- and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
- if not correct, you can read list of char-servers, but not look slots of characters (rejected by server).
- Default value: yes
-
-order
- This parameter controls how the login-server must use the 'allow' and 'deny' lists.
- 'Allow' and 'deny' are used to do IP lists.
- 3 possibilities:
- 'deny,allow': to sum it up, it's like 'allow if not deny'. The login-server only checks the 'deny' list.
- If the connected IP is in the 'deny' list, the login-server refuses the connection, otherwise it accepts it.
- 'allow,deny': to sum it up, it's like 'deny if not allow'. The login-server only checks the 'allow' list.
- If the connected IP is in the 'allow' list, the login-server accepts the connection, otherwise it refuses it.
- 'mutual-failture': to sum it up, it's like 'allow if in allow list and not in the deny list'.
- The login-server checks the 'allow' list. If the connected IP is in the 'allow' list,
- the login-server checks it in the 'deny' list. If the connectec IP is not in the 'deny' list,
- the login-server accepts the conection, otherwise it refuses it.
- In this case, a non 'allow' IP or a 'deny' IP will be never accepted.
- If you don't use allow AND deny, all ip are authorised.
- Default value: deny,allow.
-
-allow
- It's a list parameter. To add an item in this list, just add a new line. Each line can only have 1 parameter.
- This list depends on the 'order' parameter (read 'order' parameter to known what the login-server do with this list).
- This parameter accepts IP descriptions, like:
- IP or the begining of IP: it's a characters match. Write an IP (123.456.789.012) or the begining of the IP (123.456.).
- Because it's a characters match, the IP 123.4 matches with 123.4.xxx.yyy and 123.4z.xxx.yyy. So, add a final '.' to be sure of the IP.
- Example:
- allow: 127.0.0.1
- allow: 192.168.10.
- IP with number of bits for a network: it's a logical match. Write the network like this: 123.456.789.012/<#_of_mask_bits>
- Don't use the final '.', but use all four values.
- Example:
- allow: 127.0.0.1/32 (match only 1 IP, because 32 bits match all bits).
- allow: 192.168.10/24 (matches the network begining by 192.168.10).
- IP with mask of a network: it's a logical match. Write the network like this: 123.456.789.012/345.678.901.234
- Don't use the final '.', but use all four values for the IP and the mask.
- Example:
- allow: 127.0.0.1/255.255.255.255 (match only 1 IP).
- allow: 192.168.10.0/255.255.255.0 (matches the network begining by 192.168.10).
- all: matches any IP.
- Example:
- allow: all.
- clear: clears the list at this point. Really useful for 'import' parameter, in the new configuration file.
- Example:
- allow: clear.
- It does not support the backward match of host name.
- Default value: <no list>.
-
-deny
- This list works exactly like the 'allow' list, but for the 'deny' list.
-
-import
- Gives an other configuration file to include in.
- You must write the additionnal configuration file name and path.
- The mentionned file can include any parameter of the login configuration.
- You can create a chain or configuration files if necessary.
- Default value: <no_additional_configuration_file>.
-
-<Example>
-login_port: 6900
-admin_pass: admin
-ladminallowip: all
-gm_pass: gm
-level_new_gm: 60
-new_account: 1
-account_filename: save/account.txt
-gm_account_filename: conf/GM_account.txt
-gm_account_filename_check_timer: 15
-login_log_filename: log/login.log
-login_log_unknown_packets_filename: log/login_unknown_packets.log
-save_unknown_packets: 0
-display_parse_login: 0
-display_parse_admin: 0
-display_parse_fromchar: 0
-date_format: 3
-min_level_to_connect: 0
-add_to_unlimited_account: off
-start_limited_time: -1
-check_ip_flag: yes
-order: deny,allow
-//deny: all
-//allow: 127.0.0.1
-//allow: 10.0.
-//allow: 172.16.0.0/16
-//allow: 192.168.0.0/255.255.255.0
-//import: import/new_login.conf
-
-==========================================================================
-2. conf/char_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- A setup of char-server (server which manages the character data in one world)
- It ???. The name of a world, the password of a world, a server's IP,
- A data file name etc. is described.
-
-
-<Explanation of a key>
-
-userid
- It is ID which this world uses. It registers with login-server.
- ID of account is specified.
- And also [ it uses it for connecting to map-server used in this world ]
- It is used also for discernment of the world within login-server.
- It is each when registering two or more worlds into the same login-server.
- It is necessary to use another ID by char-server.
-
-passwd
- It is a password corresponding to ID which this world uses.
- It is used for the time of the registration to login-server, and connecting to map-server.
-
-server_name
- It is the name of this world. It is displayed when logged in by the client.
-
-wisp_server_name
- Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
- Default: Server
-
-login_ip
- It is the IP address of login-server which registers a world seen from char-server.
-
-login_port
- It is the port used by login-server. It can omit and a default is 6900.
-
-char_ip
- It is the IP address of char-server seen from the client.
-
-char_port
- It is the port used by char-server. It can omit and a default is 6121.
-
-email_creation
- Option to force a player to create an e-mail.
- If a player have default e-mail, and if you activate this option, the player can only connect in the game (to arrive on a map) like follow:
- - Create at least 1 character
- - Select 1 character
- - Select DEL to enter his/her e-mail. (if OK is choosen, client says to the player: 'invalid e-mail')
- - If his/her e-mail is correct, the player enter in the game (an e-mail is saved definitively).
- - If his/her e-mail is incorrect, he/she have 'incorrect e-mail' and must select again DEL.
- - After entering in the game (when the player arrives on a map), DEL and SEL/OK button work normaly for all next connections.
- Resume: If a player have "incorrect/invalid e-mail" when he/she click on 'OK' button,
- the player must click 'DEL' button and register his/her NEW e-mail to enter in the game
- So, default is 0, because administrator must explain to their players before to activate this option.
-
-char_txt
- It is the data file name which stores character data.
- It is not omissible.
-
-char_maintenance
- If it is made 1, it will be in a maintenance state.
- It can omit and a default is 0.
-
-char_new
- If it is made 1, the time (new) of being displayed on a client will stick.
- It can omit and a default is 0.
-
-max_connect_user
- It is the maximum number of the user linked to a Char-server.
- If it is made 0, the maximum number restrictions will be lost.
- Please use to apply restriction of the connection number.
- It can omit and a default is 0.
-
-check_ip_flag
- It's to check IP of a player between char-server and other servers (part of anti-hacking system)
- If player doesn't have same IP, connection is refused.
- Set to 0/off/no to not check IP of player.
- Set to 1/on/yes if you want to check (default)
- Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
- and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
- default: yes
-
-autosave_time
- It is time to save data automatically at a file. A unit is a second.
- It can omit and a default is 300 (5 minutes).
-
-start_point
- When a new character is created, it is the place where they start.
- It describes like "a map file name, X coordinates, and Y coordinates."
- It can omit and is a default. It is new_1-1.gat and 53,111.
-
-start_weapon:
- Starting weapon for new characters
- default value: 1201 (Knife)
-
-start_armor:
- Starting armor for new characters
- default value: 2301 (Cotton Shirt)
-
-start_zeny
- When new character is made, the quantity of ZENY which it has from the start is set up.
- Being able to omit, a default is 500.
-
-unknown_char_name
- The name returned when the name request of character which does not exist in a character server is carried out
- It sets up. Being able to omit, a default is Unknown.
-
-char_log_filename
- A character server's log file is specified.
- Being able to omit, a default is log/char.log.
-
-name_ignoring_case
- Allow or not identical name for characters but with a different case (upper/lower): example: Test-test-TEST-TesT
- 0 (default): no character can have same name, instead of the case (no Test-TEST...)
- 1: more than 1 of character can have same name if names are not using same case (one with Test, another with TEST, etc...)
-
-char_name_option
- Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
- 0: no restriction (default)
- 1: only letters/symbols in 'char_name_letters' option.
- 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
- default: 0.
-
-char_name_letters
- Set the letters/symbols that you want use with the 'char_name_option' option.
- Note: add 'space' between 2 others letters/symbols.
- default: void.
-
-online_txt_filename
- It sets the filename of the file which receives the online players list in text
- default: online.txt
-
-online_html_filename
- It sets the filename of the file which receives the online players list, but in html version
- default: online.html
-
-online_sorting_option
- It sets how to display online players in the txt/html files.
- 0: no sorting (default)
- 1: by alphabetical order of their name
- 2: by number of their zenys
- 3: by their base level
- 4: by their job (and job level inside the same job)
- 5: by alphabetical order of their actual map location
- Note: sorting operation with a lot of online players can take time on a slow computer.
-
-online_display_option
- It sets which columns that you want display in the online files. Do the addition of these values:
- (if value is 0, no file is done)
- 1: name (just the name, no function like 'GM')
- 2: job
- 4: levels
- 8: map name
- 16: mapname and coordonates
- 32: zenys
- 64: name (with 'GM' if the player is a GM)
- default value: 1 (only name)
-
-online_gm_display_min_level
- minimum GM level to display 'GM' when we want to display it.
- default value: 1 (any GM)
-
-online_refresh_html
- refresh time (in sec) of the html file in the explorer
- default: 20
-
-import
- The line is replaced with the contents of another file.
-
-
-< Example >
-userid: s1
-passwd: p1
-server_name: eAthena
-wisp_server_name: Server
-login_ip: 127.0.0.1
-login_port: 6900
-char_ip: 127.0.0.1
-char_port: 6121
-email_creation: 0
-char_txt: save/athena.txt
-char_maintenance: 0
-char_new: 0
-max_connect_user: 0
-check_ip_flag: yes
-autosave_time: 15
-start_point: new_1-1.gat,53,111
-start_weapon: 1201
-start_armor: 2301
-start_zeny: 500
-unknown_char_name: Unknown
-char_log_filename: log/char.log
-name_ignoring_case: 0
-char_name_option: 0
-//char_name_letters:
-online_txt_filename: online.txt
-online_html_filename: online.html
-online_sorting_option: 0
-online_display_option: 1
-online_gm_display_min_level: 1
-online_refresh_html: 20
-//import: import/new_char.conf
-
-
-==========================================================================
-3. conf/inter_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- A setup of inter-server (server which manages the global data in one world)
- It ???. A data file name etc. is described.
- (It is operating as a part of char-server in program now.)
-
-< Explanation of a key >
-
-storage_txt
- It is the file name which stores warehouse data.
- It can omit and is a default. It is save/storage.txt.
-
-party_txt
- It is the file name which stores party data.
- It can omit and is a default. It is save/party.txt.
-
-guild_txt
- It is the file name which stores guild data.
- It can omit and is a default. It is save/guild.txt.
-
-pet_txt
- It is the file name which stores pet data.
- It can omit and is a default. It is save/pet.txt.
-
-castle_txt
- It is the file name which stores the castle data of a guild.
- It can omit and is a default. It is save/castle.txt.
-
-guild_storage_txt
- It is the file name which stores guild warehouse data.
- Being able to omit, a default is save/g_storage.txt.
-
-accreg_txt
- It is the file name which stores the account share variable data in a world.
- It can omit and is a default. It is save/accreg.txt.
-
-party_share_level
- The restriction level of a fair distribution party is set up.
- Being able to omit, a default is 10.
-
-inter_log_filename
- An interchange server's log file is specified.
- Being able to omit, a default is log/inter.log.
-
-import
- The line is replaced with the contents of another file.
-
-
-< Example >
-storage_txt: save/storage.txt
-party_txt: save/party.txt
-guild_txt: save/guild.txt
-pet_txt: save/pet.txt
-castle_txt: save/castle.txt
-guild_storage_txt: save/g_storage.txt
-accreg_txt: save/accreg.txt
-party_share_level: 10
-inter_log_file: log/inter.log
-
-
-==========================================================================
-4. conf/map_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- A fundamental setup of map-server (server which manages game advance on the map in his duty)
- It ???.
-
-
-< Explanation of a key >
-
-userid
- It is ID which this world uses. It is used for the connecting to char-server.
-
-passwd
- It is a password corresponding to ID which this world uses.
-
-char_ip
- map-server‚©‚ç‚Ý‚½A‚±‚̃T[ƒo[‚ª’S“–‚·‚éƒ}ƒbƒv‚̃[ƒ‹ƒh‚ðŠÇ—‚·‚é
- char-server‚ÌIP‚Å‚·B
-
-char_port
- ƒ}ƒbƒv‚ð“o˜^‚·‚échar-server‚̃|[ƒg‚Å‚·BÈ—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í6121‚Å‚·B
-
-map_ip
- ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚½‚±‚Ìmap-server‚ÌIP‚Å‚·B
-
-map_port
- map-server‚ÅŽg—p‚·‚éƒ|[ƒg‚Å‚·BÈ—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í5121‚Å‚·B
-
-autosave_time
- ƒf[ƒ^‚ðŽ©“®“I‚ɃLƒƒƒ‰ŽI‚É‘—‚鎞ŠÔ‚Å‚·B’PˆÊ‚Í•b‚Å‚·B
- È—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í60(1•ª)‚Å‚·B
-
-water_height
- …ê‚Ì‚‚³‚ðŽw’è‚·‚éƒtƒ@ƒCƒ‹‚ðŒˆ‚ß‚Ü‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/water_height.txt‚Å‚·B
-
-motd_txt
- Message of the Dayƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/motd.txt‚Å‚·B
-
-help_txt
- @help‚Å•\Ž¦‚·‚éƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/help.txt‚Å‚·B
-
-mapreg_txt
- MAPƒT[ƒo[“àƒLƒƒƒ‰ƒNƒ^[‹¤—L•Ï”‚ð•Û‘¶‚·‚éƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Ísave/mapreg_txt‚Å‚·B
-
-data_grf
- ROƒf[ƒ^ƒtƒ@ƒCƒ‹ data.grf ‚ւ̃pƒX‚Å‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./data.grf ‚Å‚·B
- grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
-
-sdata_grf
- ƒTƒNƒ‰ƒCƒf[ƒ^ƒtƒ@ƒCƒ‹ sdata.grf ‚ւ̃pƒX‚Å‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./sdata.grf ‚Å‚·B
- grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
-
-adata_grf
- ƒ¿ƒf[ƒ^ƒtƒ@ƒCƒ‹ adata.grf ‚ւ̃pƒX‚Å‚·B
- È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./adata.grf ‚Å‚·B
- grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
-
-npc
- “Ç‚Ýž‚Þnpcƒf[ƒ^ƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
- •¡”Žw’è‰Â”\‚ÅAŽw’肵‚½‡‚Ƀ[ƒh‚µ‚Ü‚·B
- clear ‚ðŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚É“o˜^‚µ‚½ƒpƒX‚ð‘S‚Ä휂µ‚Ü‚·B
-
-delnpc
- “Ç‚Ýž‚Ü‚È‚¢npcƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
- Žw’肵‚½ƒpƒX‚Ínpc‚ÅŽw’肳‚ꂽƒf[ƒ^ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚©‚ç휂³‚ê‚Ü‚·B
- all ‚ðŽw’è‚·‚é‚Æ‘S‚Ä휂µ‚Ü‚·( npc: clear ‚Æ“¯‹`)B
-
-map
- ‚±‚̃}ƒbƒv‚ª’S“–‚·‚éƒ}ƒbƒvƒtƒ@ƒCƒ‹–¼‚Å‚·B
- •¡”Žw’è‰Â”\‚ÅAŽw’肵‚½‡‚Ƀ[ƒh‚µ‚Ü‚·B
- ‘¶Ý‚µ‚È‚¢ƒ}ƒbƒv‚ðŽw’肵‚½ê‡ƒGƒ‰[‚É‚È‚è‚Ü‚·B
- clear ‚ðŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚É“o˜^‚µ‚½ƒtƒ@ƒCƒ‹–¼‚ð‘S‚Ä휂µ‚Ü‚·B
-
-delmap
- “Ç‚Ýž‚Ü‚È‚¢ƒ}ƒbƒvƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
- Žw’肵‚½ƒtƒ@ƒCƒ‹‚Ímap‚ÅŽw’肳‚ꂽƒŠƒXƒg‚©‚ç휂³‚ê‚Ü‚·B
- all ‚ðŽw’è‚·‚é‚Æ‘S‚Ä휂µ‚Ü‚·( map: clear ‚Æ“¯‹`)B
-
-import
- ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
-
-< Example >
-
-userid: s1
-passwd: p1
-char_ip: 127.0.0.1
-char_port: 6121
-map_ip: 127.0.0.1
-map_port: 5121
-autosave_time: 60
-nullpo_check: 1
-water_height: conf/water_height.txt
-data_grf: ./data.grf
-sdata_grf: ./sdata.grf
-npc: conf/warp/npc_warp.txt
-npc: conf/warp/npc_warp25.txt
-npc: conf/warp/npc_warp3.txt
-npc: conf/mob/npc_monster3J.txt
-map: prontera.gat
-map: prt_castle.gat
-inpcAmap‚Í‘½‚¢‚Ì‚ÅÈ—ªj
-delnpc: conf/sample/npc_test.txt
-npc: clear
-delmap: prontera.gat
-delmap: all
-
-==========================================================================
-5. conf/battle_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- Battle relation of map-server (server which manages game advance on the map in his duty),
- Other setup is described.
- All setup can be omitted and a default value is used at the time of an abbreviation.
-
-< The special character sequence which can be specified to be a value >
-
- yes on It is processed as 1. (Effective meaning)
- no off It is processed as 0. (Invalid meaning)
-
-
-< Explanation of a key >
-
-warp_point_debug
- ƒ[ƒvƒ|ƒCƒ“ƒg‚ð•’Ê‚É•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ
- ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì‚©‚í‚è‚ɃMƒ‹ƒhƒtƒ‰ƒO‚ª‚»‚ÌꊂÉo‚ă[ƒv
- ƒ|ƒCƒ“ƒg‚Ì–¼‘O‚ðŠm”F‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-enemy_critical
- ƒvƒŒƒCƒ„[‚Æ“¯‚¶LUK‚É‚æ‚éƒNƒŠƒeƒBƒJƒ‹”»’è‚ðMOB‚ƃyƒbƒg‚É—LŒø‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚̃NƒŠƒeƒBƒJƒ‹‚Í‚à‚¿‚ë‚ñ•K’†‚È‚Ì‚ÅAon‚É‚·‚é‚Æ‚Flee‚Å‚àA
- LUK‚Ì‚‚¢“G‚ÌUŒ‚‚ª”ð‚¯‚Ã‚ç‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-enemy_critical_rate
- ƒ‚ƒ“ƒXƒ^[‚ƃyƒbƒg‚̃NƒŠƒeƒBƒJƒ‹•p“x‚Ì•S•ª—¦‚Å‚·Benemy_critical‚ªyes‚¶‚á‚È‚¢‚Æݒ肵‚Ä‚à‰½‚̈Ӗ¡‚à‚ ‚è‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-enemy_str
- ƒ‚ƒ“ƒXƒ^[‚Ì‚ªUŒ‚‚·‚é‚Æ‚«‚ÌATKŒvŽZ‚ÉSTR‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-enemy_perfect_flee
- “G‚ªŠ®‘S‰ñ”ð‚ð‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ“G‚àŠ®‘S‰ñ”ð‚ð
- ‚·‚é‚悤‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-casting_rate
- ƒXƒLƒ‹‚̉r¥ŽžŠÔ‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 200‚É‚·‚é‚Ɖr¥ŽžŠÔ‚ª”{‚É‚È‚èA0‚É‚·‚é‚Ɖr¥‚ª‚È‚­‚È‚è‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-delay_rate
- ƒXƒLƒ‹Žg—pŒãƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-delay_dependon_dex
- ƒXƒLƒ‹Žg—pŒãƒfƒBƒŒƒC‚ª‰r¥ŽžŠÔ‚Æ“¯‚¶‚悤‚ÉDEX‚ʼne‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚ð
- Žw’肵‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-skill_delay_attack_enable
- ƒXƒLƒ‹ƒfƒBƒŒƒC‚ÌŠÔUŒ‚‚Å‚«‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚ê‚΃XƒLƒ‹ƒfƒBƒŒƒC‚ÌŠÔƒXƒLƒ‹‚ÍŽg‚¦‚È‚¢‚¯‚ÇUŒ‚‚Í‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-left_cardfix_to_right
- “ñ“—¬‚̶Žè•Ší‚ÌŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ð‰EŽè•Ší‚É“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƶŽè•Ší‚É‚ÍŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ªŠ|‚©‚ç‚È‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-player_skill_add_range
- ƒvƒŒƒCƒ„[‚̃XƒLƒ‹ŽË’ö‚©‚ç“G‚ª—£‚ꂽŽž‚Ç‚ê‚®‚ç‚¢‚Ì‹——£‚܂ŃXƒLƒ‹‚ðŽg—p‰Â”\‚É‚·‚é‚©‚ðŒˆ‚ß‚Ü‚·BƒXƒLƒ‹‚ÌŽË’ö+player_skill_add_range‚܂ŃXƒLƒ‹‚ª“Í‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·‚ª­‚µ‚Í“ü‚ꂽ•û‚ª‚¢‚¢‚Å‚·B
-
-skill_out_range_consume
- ƒXƒLƒ‹‚ÌŽË’ö‚©‚ç“G‚ª—£‚ê‚ăXƒLƒ‹‚ªŽ¸”s‚µ‚½ŽžSP‚âƒAƒCƒeƒ€‚ðÁ–Õ‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-monster_skill_add_range
- ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹ŽË’ö‚©‚ç“G‚ª—£‚ꂽŽž‚Ç‚ê‚®‚ç‚¢‚Ì‹——£‚܂ŃXƒLƒ‹‚ðŽg—p‰Â”\‚É‚·‚é‚©‚ðŒˆ‚ß‚Ü‚·BƒXƒLƒ‹‚ÌŽË’ö+monster_skill_add_range‚܂ŃXƒLƒ‹‚ª“Í‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-player_damage_delay
- ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð“ü‚ê‚é‚©‚Ç‚¤‚©‚Å‚·B
- yes‚É‚·‚é‚ƃCƒ“ƒfƒ…ƒA‚Å‚àŽg‚í‚È‚¢ŒÀ‚èƒ_ƒ[ƒW‚ðŽó‚¯‚½Žž
- ‚µ‚΂炭‚Í“®‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-player_damage_delay_rate
- ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
- player_damage_delay‚ªyes‚É‚µ‚Ä‚È‚¢‚ƈӖ¡‚ª‚ ‚è‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-defunit_not_enemy
- –hŒäƒ†ƒjƒbƒgiƒZƒCƒtƒeƒBƒEƒH[ƒ‹/ƒjƒ…[ƒ}‚È‚Çj‚ªMOB‚ÉŒø‰Ê‚ð
- ‹y‚Ú‚³‚È‚¢‚悤‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-random_monster_checklv
- ƒ‚ƒ“ƒXƒ^[¢ŠÒƒAƒCƒeƒ€‚ðŽg‚Á‚½‚Æ‚«‚ÉŽ©•ª‚æ‚èLV‚Ì‚‚¢ƒ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- yes‚É‚·‚é‚ÆAŽ©•ª‚æ‚èLV‚Ì‚‚¢ƒ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚µ‚È‚¢‚悤‚É‚È‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-attribute_recover
- ‘®«‚É‚æ‚Á‚ÄUŒ‚‚³‚ê‚Ä‚à‰ñ•œ‚·‚é‚©‚Ç‚¤‚©‚Å‚·Bno‚ÌꇂÍ-‘®«‚ð
- 0‚É‚µ‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-item_auto_get
- ƒAƒCƒeƒ€Ž©“®Žæ“¾‹@”\‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- yes‚É‚·‚é‚ƃAƒCƒeƒ€ƒhƒƒbƒv‚ðƒ‚ƒ“ƒXƒ^[‚Ɉê”Ô‘½‚­ƒ_ƒ[ƒW‚ð—^‚¦‚½ƒLƒƒƒ‰‚ª
- Ž©“®‚ŃAƒCƒeƒ€‚ðŽæ“¾‚·‚é‚悤‚É‚È‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-flooritem_lifetime
- °‚É—Ž‚¿‚½ƒAƒCƒeƒ€‚ªÁ‚¦‚é‚Ü‚Å‚©‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í60000(60•b)‚ÅŬ‚Í1000(1•b)‚Å‚·B1000–¢–ž‚È‚çƒfƒtƒHƒ‹ƒg‚ɃZƒbƒg‚³‚ê‚Ü‚·B
-
-item_first_get_time
- ƒ‚ƒ“ƒXƒ^[‚Ɉê”Ôƒ_ƒ[ƒW‚𑽂­—^‚¦‚½ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚Ì
- ƒhƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚ÌŽžŠÔ‚Å‚·B
- ’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
-
-item_second_get_time
- item_first_get_time‚̌ヂƒ“ƒXƒ^[‚É“ñ”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
- ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
- ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í7000(7•b)‚Å‚·B
-
-item_third_get_time
- item_second_get_time‚̌ヂƒ“ƒXƒ^[‚ÉŽO”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
- ƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
- ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í5000(5•b)‚Å‚·B
-
-mvp_item_first_get_time
- ƒ‚ƒ“ƒXƒ^[‚Ɉê”Ôƒ_ƒ[ƒW‚𑽂­—^‚¦‚½ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚Ì
- MVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚ÌŽžŠÔ‚Å‚·B
- ’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
-
-mvp_item_second_get_time
- mvp_item_first_get_time‚̌ヂƒ“ƒXƒ^[‚É“ñ”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
- ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚ÌMVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
- ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
-
-mvp_item_third_get_time
- mvp_item_second_get_time‚̌ヂƒ“ƒXƒ^[‚ÉŽO”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
- ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚ÌMVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
- ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í2000(2•b)‚Å‚·B
-
-item_rate
- ƒAƒCƒeƒ€ƒhƒƒbƒv—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-drop_rate0item
- —Ž‰ºŠm—¦0‚̃AƒCƒeƒ€(ˆê•”ƒ‚ƒ“ƒXƒ^[‚É‚¨‚¯‚郊ƒ“ƒS)‚𗎉º‚·‚é‚©‚Ç‚¤‚©‚ÌÝ’è‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-base_exp_rate
- BaseEXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-job_exp_rate
- JobEXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-death_penalty_type
- ƒfƒXƒyƒiƒ‹ƒeƒB‚̃^ƒCƒv‚ðŒˆ’è‚µ‚Ü‚·B
- 0‚ÅŽ€‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚·‚鎞‚É“K—p‚ÅŽ‚Á‚Ä‚¢‚éEXP‚Ì—Ê‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—lA1‚ÅŽ€‚ñ‚¾’¼Œã‚É“K—p‚ÅŽ‚Á‚Ä‚¢‚éEXP‚Ì—Ê‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—l‚Å‚·B
- 2‚ÅŽ€‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚·‚鎞‚É“K—p‚ÅŽŸ‚̃Œƒxƒ‹ƒAƒbƒv‚Ü‚Å‚ÌEXP‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—lA3‚ÅŽ€‚ñ‚¾’¼Œã‚É“K—p‚ÅŽŸ‚̃Œƒxƒ‹ƒAƒbƒv‚Ü‚Å‚ÌEXP‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—l‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-death_penalty_base
- ƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éBASEŒoŒ±’lŒ¸­—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- ‚ ‚Ü‚è’á‚·‚¬‚é’l‚ðŽg‚¤‚ÆŒ¸‚è‚Ü‚¹‚ñB’PˆÊ‚Í0.01%‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-death_penalty_job
- ƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éJOBŒoŒ±’lŒ¸­—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- ‚ ‚Ü‚è’á‚·‚¬‚é’l‚ðŽg‚¤‚ÆŒ¸‚è‚Ü‚¹‚ñB’PˆÊ‚Í0.01%‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-zeny_penalty
- Ž€‚ñ‚¾Žž–³‚­‚È‚éƒ[ƒj—ʂ̔䗦‚Å‚·B’PˆÊ‚Í0.01%‚Å‚·BŽ€‚ñ‚¾Žž
- Œ¸‚é‚킯‚Å‚Í‚È‚­Ž€‚ñ‚¾ŒãƒZ[ƒ”ƒ|ƒCƒ“ƒg‚ɖ߂鎞“K—p‚³‚ê‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-restart_hp_rate
- ƒŠƒXƒ^[ƒg‚·‚鎞‚ɉñ•œ‚·‚éHP”ä—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B0‚Ìê‡1‰ñ•œ‚É‚È‚è‚Ü‚·B
-
-restart_sp_rate
- ƒŠƒXƒ^[ƒg‚·‚鎞‚ɉñ•œ‚·‚éSP”ä—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B0‚Ìꇂ͉ñ•œ‚µ‚Ü‚¹‚ñB
- ‚»‚µ‚ÄSP‚ª”ä—¦‚æ‚è‚‚¢ê‡‚à‰ñ•œ‚µ‚Ü‚¹‚ñB
-
-mvp_hp_rate
- MVP ƒ‚ƒ“ƒXƒ^[‚ÌHP‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-mvp_item_rate
- MVPƒAƒCƒeƒ€‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-mvp_exp_rate
- MVP EXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-monster_hp_rate
- MVP ˆÈŠO‚̃‚ƒ“ƒXƒ^[‚ÌHP‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-monster_max_aspd
- ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åUŒ‚‘¬“x‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í199‚Å‚·BÅ‘å‚Í199‚ÅŬ‚Í100‚Å‚·B
-
-atcommand_gm_only
- —ƒRƒ}ƒ“ƒh‚ðGMê—p‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-gm_all_skill
- ‘S‚ẴXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
- ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚ÍJOB‚âƒXƒLƒ‹Š“¾ðŒ‚ÉŠÖŒW‚È‚­‘SƒXƒLƒ‹‚ªŠo‚¦‚ç‚ê‚Ü‚·B(ƒNƒFƒXƒgƒXƒLƒ‹‚àŠÜ‚ß‚Ä)
- ƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B0‚ÌꇂÍGM‚Å‚Í‚È‚¢‘S‚ẴLƒƒƒ‰‚̈Ӗ¡‚Å‚Í‚È‚­‘S‚Ä‚ÌGM‚ª‘S‚ẴXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Å‚·B
-
-gm_all_equipment
- ‘S‚Ä‚Ì‘•”õ•i‚ð‘•”õ‚Å‚«‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
- ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚ÍJOB‚⃌ƒxƒ‹A«•Ê‚ÉŠÖŒW‚È‚­
- ‘S‘•”õ•i‚ð‘•”õ‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B‚½‚¾‚µAƒNƒ‰ƒCƒAƒ“ƒg‘¤‚ŃGƒ‰[‚ð
- ‹N‚±‚·‘g‚݇‚킹‚à‚ ‚é‚ÆŽv‚¢‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B
- 0‚Ìꇂ͑S‚Ä‚ÌGM‚Í’ÊíƒvƒŒƒCƒ„[‚Æ“¯‚¶”»’肪s‚í‚ê‚Ü‚·B
-
-gm_skill_unconditional
- –³ðŒ‚ɃXƒLƒ‹‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
- ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚Í‘•”õ•Ší‚âÁ”ïƒAƒCƒeƒ€‚Ì—L–³
- ‚È‚Ç‚ÉŠÖŒW‚È‚­A‚»‚µ‚ĉ½‚àÁ”ï‚·‚邱‚Æ‚È‚­ƒXƒLƒ‹‚ðŽg—p‚Å‚«‚é‚悤‚É
- ‚È‚è‚Ü‚·B”»’舗‚𖳎‹‚·‚é‚Ì‚Å“®ì‚É•s“s‡‚ª‚Å‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B 0‚Ìꇂ͑S‚Ä‚ÌGM‚Í’ÊíƒvƒŒƒCƒ„[‚Æ“¯‚¶”»’肪
- s‚í‚ê‚Ü‚·B
-
-player_skillfree
- ƒXƒLƒ‹ƒcƒŠ[‚ÉŠÖŒW‚È‚­ƒXƒLƒ‹‚ðã‚°‚邱‚Æ‚ª‚Å‚«‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚ê‚΃vƒŒƒCƒ„[‚ÌE‹Æ‚ÅK‚¤‚±‚Æ‚ª‚Å‚«‚éƒXƒLƒ‹‘S‚Ä‚ð
- ƒXƒLƒ‹ƒcƒŠ[‚ÉŠÖŒW‚È‚­ã‚°‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-player_skillup_limit
- ƒXƒLƒ‹ƒŠƒZƒbƒg“™‚ð‚µ‚½ŽžƒXƒLƒ‹‚ð§ŒÀ‚È‚µ‚Éã‚°‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚ê‚ÎŽn‚߂̃XƒLƒ‹ƒ|ƒCƒ“ƒg9‚‚̓m[ƒrƒX‚ÅK‚¤ƒXƒLƒ‹‚É‚µ‚©
- Žg‚¦‚Ü‚¹‚ñB‚»‚µ‚Ä‚»‚ÌŒã‚Ì39‚Í1ŽŸE‹Æ‚ÅK‚¤•¨‚É‚¾‚¯Žg‚¦‚Ä‚»‚ÌŒã‚Ì
- ƒ|ƒCƒ“ƒg‚ÍŽ©—R‚ÉŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-weapon_produce_rate
- •Ší»‘¢ƒXƒLƒ‹‚Å‚Ì»‘¢¬Œ÷—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-potion_produce_rate
- ƒ|[ƒVƒ‡ƒ“»‘¢ƒXƒLƒ‹‚Å‚Ì»‘¢¬Œ÷—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-monster_active_enable
- æUƒ‚ƒ“ƒXƒ^[‚ðæU‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚é‚Æ
- æUƒ‚ƒ“ƒXƒ^[‚ª”ñæU‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-monster_damage_delay_rate
- ƒ‚ƒ“ƒXƒ^[‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-monster_loot_type
- ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚Ìs“®‚ÌŽd•û‚ðŽw’肵‚Ü‚·B
- 0‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂĂà‚Ü‚½ƒAƒCƒeƒ€‚ðH‚ׂÄA
- ‘O‚̃AƒCƒeƒ€‚ªÁ‚¦‚éŽd—lB1‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂé‚Æ
- ‚à‚¤ƒAƒCƒeƒ€‚ðH‚ׂȂ­‚È‚éŽd—lBƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-mob_skill_use
- MOB‚ªƒXƒLƒ‹‚ðŽg‚Á‚Ä‚­‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-mob_count_rate
- map_athena.conf‚ÅŽw’肳‚ꂽnpcƒf[ƒ^‚ð“Ç‚Ýž‚ÞÛA
- monster‚Å’è‹`‚³‚ꂽ”z’uMOB‚Ì”‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
- —áŠO‚Æ‚µ‚ÄA”z’u”1‚Æ‚µ‚Ä’è‹`‚³‚ꂽMOB‚Ì”‚Í•Ï‚í‚è‚Ü‚¹‚ñB(BOSS‘Îô)
- ‚Ü‚½A”z’u”‚ð‰º•ûC³‚µ‚½‚Æ‚«A1–¢–ž‚É‚È‚Á‚½ê‡‚Í1‚Æ‚µ‚Ĉ—‚µ‚Ü‚·B
- 0-1000’ö“x‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-quest_skill_learn
- ƒNƒFƒXƒgƒXƒLƒ‹‚ð•’Ê‚ÉK“¾‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚é‚ƃNƒFƒXƒgƒXƒLƒ‹‚ª•’Ê‚É•\Ž¦‚³‚ê‚ăXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽg‚Á‚ÄK“¾‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í no‚Å‚·B
-
-quest_skill_reset
- ƒXƒLƒ‹‚ðƒŠƒZƒbƒg‚·‚鎞ƒNƒFƒXƒgƒXƒLƒ‹‚ðƒŠƒZƒbƒg‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
- no‚É‚µ‚Ä‚àquest_skill_learn‚ðyes‚É‚·‚ê‚΃ŠƒZƒbƒg‚³‚ê‚Ü‚·B
-
-basic_skill_check
- À‚èAŒðŠ·Aƒp[ƒeƒBŒ‹¬Aƒ`ƒƒƒbƒgƒ‹[ƒ€ì‚è“™‚ÌŽžŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðno‚É‚·‚ê‚ÎÀ‚èAŒðŠ·“™‚ÌŠî–{ƒXƒLƒ‹‚ª•K—v‚Ès“®‚ðŠî–{ƒXƒLƒ‹‚ÉŠÖŒW‚È‚­Žg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í yes‚Å‚·B
-
-guild_emperium_check
- ƒMƒ‹ƒh‚ðì‚鎞ƒGƒ“ƒyƒŠƒEƒ€‚ðÁ”ï‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚ê‚Î
- ƒGƒ“ƒyƒŠƒEƒ€‚È‚µ‚Å‚àƒMƒ‹ƒh‚ªì‚ê‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í yes‚Å‚·B
-
-guild_exp_limit
- ƒMƒ‹ƒh‚Ì–ðE‚ÉÝ’è‚Å‚«‚éã”[ŒoŒ±’l‚ÌŠ„‡‚ÌãŒÀ‚ðÝ’è‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í50(%)‚Å‚·B
-
-player_invincible_time
- ƒ}ƒbƒvˆÚ“®‚âƒeƒŒƒ|[ƒgA•œŠˆ‚µ‚½Žž‚Ì–³“GŽžŠÔ‚ðݒ肵‚Ü‚·B’PˆÍ‚Í
- ms(ƒ~ƒŠ•b)BˆÚ“®AUŒ‚s“®AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚ð‚·‚é‚Æ‚±‚Ì
- ŽžŠÔ‚Í‚È‚­‚È‚éB(ƒV[ƒYƒ‚[ƒh‚Å‚ÍŽžŠÔ‚ð2”{‚É‚µ‚Ä“K—p)
- ƒfƒtƒHƒ‹ƒg‚Í5000(5•b)‚Å‚·B
-
-pet_catch_rate
- ƒyƒbƒg‚̕ߊl”{—¦‚ð•S•ª—¦‚Åݒ肵‚Ü‚·B
- 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-pet_rename
- ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
- yes‚͉½“x‚Å‚à–¼‘O‚Ì•ÏX‚ª‰Â”\Bno‚͈ê“x•ÏX‚·‚é‚Æ‚à‚¤•ÏX•s‰Â”\‚É‚È‚éB
-
-pet_friendly_rate
- ƒyƒbƒg‚ɉa‚ð‚ ‚°‚½Žžã‚ª‚ée–§“x‚Ì”{—¦‚Å‚·B
- e–§“x‚ªŒ¸‚éꇂ͓K—p‚³‚ê‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-pet_hungry_delay_rate
- ƒyƒbƒg‚Ì• ‚ªŒ¸‚鎞ŠÔ‚Ì”{—¦‚Å‚·B
- ”{—¦‚ª‚‚¢‚Æ• ‚ªŒ¸‚è“ï‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-pet_hungry_friendly_decrease
- ƒyƒbƒg‚Ì• ‚ªŠ®‘S‚ÉŒ¸‚Á‚½ŽžŒ¸‚ée–§“x‚Ì—Ê‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í5‚Å‚·B
-
-pet_str
- ƒyƒbƒg‚ÌATKŒvŽZ‚ÉSTR‚ð“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-pet_status_support
- ƒyƒbƒg‚É‚æ‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ð“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚é‚Æ
- ƒyƒbƒg‚ðŽ‚Á‚Ă鎞ƒyƒbƒg–ˆ‚Éݒ肳‚ê‚Ä‚¢‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ª
- •t‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-pet_attack_support
-pet_damage_support
- Žål‚ªƒ‚ƒ“ƒXƒ^[‚Ƀ_ƒ[ƒW‚ð—^‚¦‚½‚Æ‚«AŽó‚¯‚½‚Æ‚«‚É
- ƒyƒbƒg‚ªŽx‰‡UŒ‚‚ð‚·‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚é‚ƃyƒbƒg‚Ìe–§“x‚ª
- ‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚¾‚¯Žx‰‡UŒ‚‚ð‚µ‚Ä‚­‚ê‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-pet_support_rate
- ƒyƒbƒg‚ÌŽx‰‡UŒ‚Šm—¦‚Ì”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚Å‚·)
- ”{—¦‚ª‚‚¢‚ÆŽx‰‡UŒ‚‚æ‚­‚µ‚Ä‚­‚ê‚é‚悤‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-pet_attack_exp_to_master
- ƒyƒbƒg‚ª—^‚¦‚½ƒ_ƒ[ƒW‚Ì•ª‚ÌŒoŒ±’l‚ðŽål‚ªŽû“¾‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚é‚ƃyƒbƒg‚ÌUŒ‚‚É‚æ‚éƒ_ƒ[ƒW‚àŽål‚ª—^‚¦‚½•¨‚É‚È‚è
- Žål‚ªŒoŒ±’l‚ðŽû“¾‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-pet_attack_exp_rate
- ƒyƒbƒg‚ª—^‚¦‚½ƒ_ƒ[ƒW‚Ì•ª‚ÌŒoŒ±’l‚ðŽål‚ªŽû“¾‚·‚鎞‚Ì”{—¦‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-pet_lootitem
- ƒyƒbƒg‚ªƒAƒCƒeƒ€‚ðƒ‹[ƒg‚·‚é‚©‚Ç‚¤‚©‚ÌÝ’è‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-pet_weight
- ƒyƒbƒg‚Ƀ‹[ƒg‚³‚¹‚é‚Æ‚«‚Ìd—ʧŒÀ‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í1000‚Å‚·B
-
-skill_min_damage
- ƒXƒLƒ‹‚ðŽg‚Á‚½Žžƒ_ƒ[ƒW‚ª˜A‘Å”‚æ‚è–¢–ž‚ÌꇑS‚ă~ƒX‚É‚È‚é‚©1ƒ_ƒ[ƒW‚É‚È‚é‚©‚ðŒˆ’è‚µ‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-finger_offensive_type
- ƒXƒLƒ‹Žw’e‚Ì•\Ž¦ƒ^ƒCƒv‚ðŒˆ’è‚µ‚Ü‚·B
- 0‚Í–{ƒT[ƒo[Žd—l‚Å1‚̓AƒeƒiŽd—l‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-heal_exp
- ƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg‚Á‚½Û‚É‚à‚炦‚éƒWƒ‡ƒuŒoŒ±’l—Ê‚ÌÝ’è‚Å‚·B
- 100‚ʼnñ•œ‚µ‚½—Ê‚Æ“¯—Ê‚É‚È‚è‚Ü‚·B
- ƒ‚ƒ“ƒXƒ^[‚ÌŒoŒ±’l‚ð•ÏX‚µ‚Ä‚È‚¢ê‡‚Í5`10’ö“x‚ª“K“–‚¾‚ÆŽv‚í‚ê‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-resurrection_exp
- ƒXƒLƒ‹uƒŠƒUƒŒƒNƒVƒ‡ƒ“v‚ðŽg‚Á‚½Û‚É‚à‚炦‚éŒoŒ±’l—Ê‚ÌÝ’è‚Å‚·B
- ’PˆÊ‚Í0.01%‚Å‚·B•œŠˆ‚µ‚½ƒvƒŒƒCƒ„[‚ªŽ‚Á‚Ä‚¢‚éŒoŒ±’l * ƒŒƒxƒ‹·/100 * resurrection_exp/10000 •ª‚ÌŒoŒ±‚ª–Ⴆ‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-shop_exp
- ƒXƒLƒ‹ƒfƒBƒXƒJƒEƒ“ƒg‚ƃI[ƒo[ƒ`ƒƒ[ƒW‚ðK“¾‚µ‚Ä‚éê‡NPC—˜—p‹àŠz‚ɉž‚¶‚½JOBŒoŒ±’lŠl“¾”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚É‚È‚è‚Ü‚·j
- ŒvŽZŽ®‚Íln(‘ã‹à*ƒXƒLƒ‹ƒŒƒxƒ‹) * shop_exp / 100 ‚Å”ƒ‚¤ê‡‚̓fƒBƒXƒJƒEƒ“ƒg‚ª‚ ‚鎞‚Ì‚Ý“K—p‚Å”„‚éꇃI[ƒo[ƒ`ƒƒ[ƒW‚ª‚ ‚鎞‚Ì‚Ý“K—p‚³‚ê‚Ü‚·B
- ŒvŽZŽ®‚Í“K“x‚Éì‚Á‚½•¨‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-combo_delay_rate
- ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC‚ÌŽžŠÔ‚Ì”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚É‚È‚è‚Ü‚·Bj
- ‚½‚¾’ˆÓ‚·‚é‚ׂ«‚È‚Ì‚Í‚‚­Ý’è‚·‚é‚Ì‚ª‚¢‚¢‚±‚Æ‚Å‚Í‚È‚¢‚±‚Æ‚Å‚·B
- ƒRƒ“ƒ{ƒfƒBƒŒƒC‚ª’·‚¢‚ƃRƒ“ƒ{‚ÌŒq‚¬‚Í‚æ‚­‚È‚è‚Ü‚·‚ª‚»‚Ì’·‚­‚È‚Á‚½
- ŽžŠÔ‚ÌŠÔ‚Ís“®‚Å‚«‚È‚¢‚©‚ç‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-item_check
- ƒAƒCƒeƒ€‚̃`ƒFƒbƒN‚ðs‚¤‚©‚Ç‚¤‚©‚Å‚·B
- ƒƒOƒCƒ“Žž‚ƃ}ƒbƒvˆÚ“®Žž‚ÉŠŽƒAƒCƒeƒ€‚É•s³ƒAƒCƒeƒ€‚ª‚È‚¢‚©ƒ`ƒFƒbƒN‚µ‚Ü‚·B
- ‚Ü‚½@item‚Å•s³ƒAƒCƒeƒ€‚ðŠ“¾‚Å‚«‚È‚­‚µ‚Ü‚·B
- ƒfƒoƒO‚âƒAƒCƒeƒ€‚ÌŠm”F‚ðs‚¤‚Æ‚«‚È‚Ç‚Íoff‚É‚µ‚Ä‚­‚¾‚³‚¢B
- ƒfƒtƒHƒ‹ƒg‚Íon‚Å‚·B
-
-wedding_modifydisplay
- ƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- Œ‹¥ƒLƒƒƒ‰‚ð•\Ž¦‚µ‚½‚¢ê‡‚Í‚±‚ê‚ðyes‚É‚µ‚Ä‚­‚¾‚³‚¢B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-natural_healhp_interval
- HP‚ªŽ©“®‰ñ•œ‚·‚é‚Ü‚ÅŠ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í6000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
-
-natural_healsp_interval
- SP‚ªŽ©“®‰ñ•œ‚·‚é‚Ü‚ÅŠ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í8000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
-
-natural_heal_skill_interval
- ƒXƒLƒ‹‚É‚æ‚Á‚ÄŽ©“®‰ñ•œ‚·‚éꇊ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í10000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
-
-natural_heal_weight_rate
- Ž©“®‰ñ•œ‚ª‚Å‚«‚È‚­‚È‚éd—Ê‚ðݒ肵‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
- Ŭ‚Í50‚ÅÅ‘å‚Í101‚Å‚·Bő傪101‚È‚Ì‚Íd—Ê‚ª
- natural_heal_weight_rate–¢–ž‚ÌŽž‚ÉŽ©“®‰ñ•œ‚·‚é‚©‚ç‚Å‚·B(‚‚܂è101‚È‚ç
- ‚¢‚Â‚Å‚àŽ©“®‰ñ•œ‚Å‚«‚Ü‚·B)
- ƒfƒtƒHƒ‹ƒg‚Í50‚Å‚·B
-
-item_name_override_grffile
- ƒAƒCƒeƒ€‚Ì–¼‘O(‰pŒêˆÈŠO‚Ì–¼‘O‚Å‚·B)‚ð.grfƒtƒ@ƒCƒ‹‚©‚ç“Ç‚Þ‚©‚Ç‚¤‚©‚Å‚·B
- no‚É‚·‚é‚Æitem_db.txt‚Ì–¼‘O‚ðŽg‚¢‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-arrow_decrement
- ‹|‚ðŽg‚¤Žž–î‚ðÁ–Õ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚é‚Æ
- –Á–Õ‚³‚ê‚Ü‚¹‚ñB(–î‚ð‘•”õ‚·‚é•K—v‚Í‚ ‚è‚Ü‚·B)
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-max_aspd
- ƒvƒŒƒCƒ„[‚ÌÅ‘åUŒ‚‘¬“x‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í199‚Å‚·BÅ‘å‚Í199‚ÅŬ‚Í100‚Å‚·B
-
-max_hp
- Å‘åHP‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í32500‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
-
-max_sp
- Å‘åSP‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í32500‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
-
-max_parameter
- ƒvƒŒƒCƒ„[‚ÌŠî–{ƒpƒ‰ƒ[ƒ^‚ÌÅ‘å’l‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í99‚Å‚·BÅ‘å‚Í10000‚ÅŬ‚Í10‚Å‚·B
- Šî–{ƒpƒ‰ƒ[ƒ^‘å‚«‚¢‰ß‚¬‚é‚ƃNƒ‰ƒCƒAƒ“ƒg—Ž‚¿‚ª‹N‚±‚é‚Ì‚Å
- “K“–‚È’l‚ðÝ’è‚·‚é•û‚ª—Ç‚¢‚Å‚·B
-
-max_cart_weight
- ƒJ[ƒg‚ÌÅ‘åd—Ê‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í8000‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
-
-player_skill_log
- ƒvƒŒƒCƒ„[‚̃XƒLƒ‹Žg—pƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-monster_skill_log
- ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹Žg—pƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-battle_log
- 퓬ŠÖŒW‚̃ƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-save_log
- ƒLƒƒƒ‰‚Ì•Û‘¶‚ÉŠÖ‚·‚郃O‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-error_log
- ƒGƒ‰[ƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-etc_log
- ƒXƒLƒ‹A퓬AƒLƒƒƒ‰•Û‘¶AƒGƒ‰[ˆÈŠO‚̃ƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-save_clothcolor
- •ž‚ÌF‚ð•Û‘¶‚·‚é‚©‚Ç‚¤‚©A—LŒø‚É‚·‚é‚Æ–â‘肪‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-undead_detect_type
- ƒAƒ“ƒfƒbƒh‚ð”FŽ¯‚·‚é•û–@‚ðݒ肵‚Ü‚·B0‚Å‘®«‚Ì‚ÝA1‚ÅŽí‘°‚Ì‚ÝA
- 2‚Å‘®«‚ÆŽí‘°‚Ì—¼•û‚Ì‚Ç‚¿‚ç‚Å‚à‚ ‚Á‚Ä‚éꇂɂȂè‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-player_auto_counter_type
- ƒvƒŒƒCƒ„[‚̃I[ƒgƒJƒEƒ“ƒ^[‚ÌŽd—l‚ðݒ肵‚Ü‚·B0‚Å100%ƒNƒŠƒeƒBƒJƒ‹
- ‚ŃXƒLƒ‹”½Œ‚–³‚µA1‚Å–hŒä–³Ž‹AHit+20AƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚
- –³‚µA2‚Å100%ƒNƒŠƒeƒBƒJƒ‹‚ŃXƒLƒ‹”½Œ‚—L‚èA3‚Å–hŒä–³Ž‹AHit+20A
- ƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚—L‚è‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í1‚Å‚·B
-
-monster_auto_counter_type
- ƒ‚ƒ“ƒXƒ^[‚̃I[ƒgƒJƒEƒ“ƒ^[‚ÌŽd—l‚ðݒ肵‚Ü‚·B0‚Å100%ƒNƒŠƒeƒBƒJƒ‹
- ‚ŃXƒLƒ‹”½Œ‚–³‚µA1‚Å–hŒä–³Ž‹AHit+20AƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚
- –³‚µA2‚Å100%ƒNƒŠƒeƒBƒJƒ‹‚ŃXƒLƒ‹”½Œ‚—L‚èA3‚Å–hŒä–³Ž‹AHit+20A
- ƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚—L‚è‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í1‚Å‚·B
-
-agi_penaly_type
- agi_penaly_countˆÈã‚Ì“G‚ÉUŒ‚‚³‚ꂽŽž‚Ìagiƒyƒiƒ‹ƒeƒB‚ÌŽd—l‚ðݒ肵‚Ü‚·B
- 0‚Å‚È‚µA1‚Åagi_penaly_num%‚¸‚ÂŒ¸‚Á‚ÄA2‚Åagi_penaly_num‚¾‚¯Œ¸‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-agi_penaly_count
- agiƒyƒiƒ‹ƒeƒB‚ð“K—p‚·‚é“G‚Ì”‚ðݒ肵‚Ü‚·B
- 2–¢–ž‚ÉÝ’è‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í3‚Å‚·B
-
-agi_penaly_num
- agiƒyƒiƒ‹ƒeƒB‚É‚æ‚Á‚ÄŒ¸‚é‰ñ”ð‚Ì—Ê‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-vit_penaly_type
- vit_penaly_countˆÈã‚Ì“G‚ÉUŒ‚‚³‚ꂽŽž‚Ìvitƒyƒiƒ‹ƒeƒB‚ÌŽd—l‚ðݒ肵‚Ü‚·B
- 0‚Å‚È‚µA1‚Åvit_penaly_num%‚¸‚ÂŒ¸‚Á‚ÄA2‚Åvit_penaly_num‚¾‚¯Œ¸‚è‚Ü‚·B
- (Œ¸‚é‚Ì‚Ívit‚É‚æ‚é–hŒä‚Ì‚Ý)
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-vit_penaly_count
- vitƒyƒiƒ‹ƒeƒB‚ð“K—p‚·‚é“G‚Ì”‚ðݒ肵‚Ü‚·B
- 2–¢–ž‚ÉÝ’è‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í3‚Å‚·B
-
-vit_penaly_num
- vitƒyƒiƒ‹ƒeƒB‚É‚æ‚Á‚ÄŒ¸‚é‰ñ”ð‚Ì—Ê‚ðݒ肵‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-player_defense_type
- ƒvƒŒƒCƒ„[‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
-
-monster_defense_type
- ƒ‚ƒ“ƒXƒ^[‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
-
-pet_defense_type
- ƒyƒbƒg‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
-
-magic_defense_type
- MDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(MDEF*’l)
-
-player_skill_reiteration
- ƒvƒŒƒCƒ„[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹–‰Â‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚é‚ÆSW‚âƒjƒ…[ƒ}Aƒgƒ‰ƒbƒv‚ðd‚Ë‚Ä’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-monster_skill_reiteration
- ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹–‰Â‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ‚±‚ê‚ðyes‚É‚·‚é‚ÆSW‚âƒjƒ…[ƒ}Aƒgƒ‰ƒbƒv‚ðd‚Ë‚Ä’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-player_skill_nofootset
- ƒvƒŒƒCƒ„[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚ðƒvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚Ì‘«Œ³‚É
- ’u‚­‚Ì‚ð‹ÖŽ~‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƃXƒLƒ‹‚ðÝ’u‚·‚鎞‚»‚Ì
- Œø‰Ê”͈͂ɃvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚ª‚¢‚é‚ƃXƒLƒ‹‚ð’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-monster_skill_nofootset
- ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚ðƒvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚Ì‘«Œ³‚É
- ’u‚­‚Ì‚ð‹ÖŽ~‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƃXƒLƒ‹‚ðÝ’u‚·‚鎞‚»‚Ì
- Œø‰Ê”͈͂ɃvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚ª‚¢‚é‚ƃXƒLƒ‹‚ð’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-player_cloak_check_type
- ƒvƒŒƒCƒ„[ƒNƒ[ƒLƒ“ƒO‚ÌŽd—l‚ðݒ肵‚Ü‚·B
- 0‚͕ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
- 1‚͕ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
- 2‚͕͂ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
- 2‚͕͂ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-monster_cloak_check_type
- ƒ‚ƒ“ƒXƒ^[ƒNƒ[ƒLƒ“ƒO‚ÌŽd—l‚ðݒ肵‚Ü‚·B
- 0‚͕ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
- 1‚͕ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
- 2‚͕͂ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
- 2‚͕͂ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
- ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
-
-gvg_short_attack_damage_rate
- ƒV[ƒYƒ‚[ƒh‚Å‹ß‹——£•¨—UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-gvg_long_attack_damage_rate
- ƒV[ƒYƒ‚[ƒh‚ʼn“‹——£•¨—UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-gvg_magic_attack_damage_rate
- ƒV[ƒYƒ‚[ƒh‚Å–‚–@UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-gvg_misc_attack_damage_rate
- ƒV[ƒYƒ‚[ƒh‚Å•¨—UŒ‚‚Æ–‚–@UŒ‚ˆÈŠO‚ÌUŒ‚(‘é‚âƒgƒ‰ƒbƒv“™)‚Ì
- ƒ_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
-
-mob_changetarget_byskill: no
- ðŒ‚ªskillused‚̃XƒLƒ‹‚ðMOB‚ªPC‚ÉŽg—p‚·‚é‚Æ‚«A‚»‚Ì‘ÎÛ‚ðƒXƒLƒ‹Žg—pŽÒ‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- MOBƒXƒLƒ‹Žg—pŒã‚Ƀ^ƒQ‚Í–ß‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-player_attack_direction_change
- ƒvƒŒƒCƒ„[‚ªUŒ‚‚µ‚½Žž•ûŒü‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚Å‚·B–{ŽI‚Å‚Í“®‚¯‚È‚¢ŒÀ‚è•ûŒü‚ª•Ï‚¦‚ç‚È‚¢‚Ì‚Å‚·‚ªƒoƒO‚Û‚¢Žd—l‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
- no‚É‚·‚ê‚Γ®‚­‚±‚Æ‚¾‚¯‚Å•ûŒü‚ª•Ï‚¦‚é‚悤‚É‚È‚è‚Ü‚·B
-
-monster_attack_direction_change
- ƒ‚ƒ“ƒXƒ^[‚ªUŒ‚‚µ‚½Žž•ûŒü‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚Å‚·B–{ŽI‚Å‚Í“®‚¯‚È‚¢ŒÀ‚è•ûŒü‚ª•Ï‚¦‚ç‚È‚¢‚Ì‚Å‚·‚ªƒoƒO‚Û‚¢Žd—l‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
- no‚É‚·‚ê‚Γ®‚­‚±‚Æ‚¾‚¯‚Å•ûŒü‚ª•Ï‚¦‚é‚悤‚É‚È‚è‚Ü‚·B
-
-player_land_skill_limit
- skill_db.txt‚Åݒ肳‚ê‚Ä‚¢‚é’n–ʃXƒLƒ‹‚Ì”§ŒÀ‚ðƒvƒŒƒCƒ„[‚É
- “K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚ê‚Îݒ肳‚ê‚Ä‚¢‚锈Èã‚Í
- ’n–Ê‚ÉÝ’u‚·‚邱‚Æ‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚·‚ª”§ŒÀ‚ð‚Ç‚¤•Ï‚¦‚Ä‚à
- MAX_SKILLUNITGROUP‚ð‰z‚¦‚锂ÌÝ’u‚Í‚Å‚«‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-monster_land_skill_limit
- skill_db.txt‚Åݒ肳‚ê‚Ä‚¢‚é’n–ʃXƒLƒ‹‚Ì”§ŒÀ‚ðƒ‚ƒ“ƒXƒ^[‚É
- “K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚ê‚Îݒ肳‚ê‚Ä‚¢‚锈Èã‚Í
- ’n–Ê‚ÉÝ’u‚·‚邱‚Æ‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚·‚ª”§ŒÀ‚ð‚Ç‚¤•Ï‚¦‚Ä‚à
- MAX_MOBSKILLUNITGROUP‚ð‰z‚¦‚锂ÌÝ’u‚Í‚Å‚«‚Ü‚¹‚ñB
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-party_skill_penaly
- ˆê•”‚̃p[ƒeƒBƒXƒLƒ‹‚ðŽg—pŽÒ‚ƃp[ƒeƒB‚ŃXƒLƒ‹Œø‰Ê‚ªˆá‚¤‚悤‚É
- ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚̉e‹¿‚ðŽó‚¯‚éƒXƒLƒ‹‚Í¡‚ÌŠ
- ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“AƒI[ƒo[ƒgƒ‰ƒXƒg‚Ì‚Ý‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-monster_class_change_full_recover
- ƒ‚ƒ“ƒXƒ^[‚ªƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚ƃgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ““™‚É‚æ‚Á‚Ä
- ‘¼‚̃‚ƒ“ƒXƒ^[‚É•Ï‚í‚Á‚½Žž‚»‚̃‚ƒ“ƒXƒ^[‚ÌHP‚ðÅ‘å‚Ȃʼnñ•œ‚³‚¹‚é‚©
- ‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ•Ï‚í‚Á‚½ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åHP‚Ü‚Å
- ‰ñ•œ‚µ‚Ü‚·Bno‚È‚ç•Ï‚í‚é‘O‚ÌHP‚ÆÅ‘åHP‚̔䗦‚Ì•ª‚ÌHP‚É‚È‚è‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-produce_item_name_input
- »‘¢‚Åì‚ç‚ꂽ“S‚â‘®«Î‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-produce_potion_name_input
- »‘¢‚Åì‚ç‚ꂽƒ|[ƒVƒ‡ƒ“‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-making_arrow_name_input
- –î쬂Åì‚ç‚ꂽ–î‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-holywater_name_input
- ƒAƒNƒAƒxƒlƒfƒBƒNƒ^‚Åì‚ç‚ꂽ¹…‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-display_delay_skill_fail
- ƒXƒLƒ‹Žg—p‚̃fƒBƒŒƒC’†‚ÉuƒXƒLƒ‹Žg—p‚ÌŒã‚ÍA‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢v‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
-
-chat_warpportal
- ƒ`ƒƒƒbƒg’†‚ÌPC‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂¹‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-mob_warpportal
- MOB‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂¹‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-dead_branch_active
- ŒÃ–Ø‚ÌŽ}‚È‚Çmonster–½—ß‚Åmobid‚𕉔‚ÉŽw’肵‚½ê‡‚É¢Š«‚³‚ê‚郂ƒ“ƒXƒ^[‚ðƒAƒNƒeƒBƒu‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-vending_max_value
- ˜I“X‚Å’u‚¯‚éƒAƒCƒeƒ€‰¿Ši‚ÌÅ‚’l‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Í10000000‚Å‚·B
-
-show_steal_in_same_party
- ƒXƒeƒB[ƒ‹¬Œ÷ŽžA‰æ–Ê“à‚ÌPTƒƒ“ƒo[(Ž©•ªŠÜ‚Þ)‚É
- ƒXƒeƒB[ƒ‹‚µ‚½ƒAƒCƒeƒ€‚Ìî•ñ‚ðŒöŠJ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-enable_upper_class
- “]¶A—{ŽqE‚ð—LŒø‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-pet_atack_attr_none
- ƒyƒbƒg‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
- ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
-
-pc_atack_attr_none
- ƒvƒŒƒCƒ„[‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
- ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
-
-mob_atack_attr_none
- ƒ‚ƒ“ƒXƒ^[‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
- ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·
-
-player_skill_partner_check
- ¹‘Ì~•Ÿ‚⇑tƒXƒLƒ‹‚ðs‚¤Û‚Ƀp[ƒgƒi[‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íyes(ƒ`ƒFƒbƒN‚·‚é)‚Å‚·B
-
-hide_GM_session
- GMƒAƒJƒEƒ“ƒg‚̃Lƒƒƒ‰ƒNƒ^[‚ð@ƒRƒ}ƒ“ƒh“™‚Å•\Ž¦‚Ì‘ÎÛ‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
-unit_movement_type
- ƒ†ƒjƒbƒgˆÚ“®ˆ—•û–@‚ð‘I‘ð‚µ‚Ü‚·B
- 0‚Å–{ŽIŽd—l(‰ñü•‰‰×¨dAŽIˆ—¨Œy)A1‚ÅAthenaŽd—l(‰ñü•‰‰×¨ŒyAŽIˆ—¨d)
- ƒfƒtƒHƒ‹ƒg‚Í0(–{ŽIŽd—l)‚Å‚·
-invite_request_check
- ƒvƒŒƒCƒ„[‚ªŠeŽí—v¿’†(PT‰Á“üAGuild‰Á“üAŽæˆø)‚É‘¼‚Ì—v¿‚ðŽó‚¯“ü‚ê‚é‚©‚Ç‚¤‚©‚Å‚·B
- yes‚Å–{ŽIŽd—lAno‚ÅAthenaŽd—l(Žó‚¯“ü‚ê‚È‚¢)
- ƒfƒtƒHƒ‹ƒg‚Íyes(Žó‚¯“ü‚ê‚é)‚Å‚·B
-skill_removetrap_type
- ƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ÌŽd—l‚ð‘I‘ð‚µ‚Ü‚·B
- 0:–{ŽIŽd—l‚Åã©1ŒÂ‚ðŽæ“¾‚·‚é
- 1:AthenaŽd—l‚ÅŽg‚Á‚½ƒAƒCƒeƒ€‚ðŽg‚Á‚½ŒÂ”‚ðŽæ“¾‚·‚é
-disp_experience
- ŒoŒ±’l‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
- yes‚É‚·‚é‚ÆA“G‚ð“|‚µ‚½Žž‚È‚ÇŒoŒ±’l‚ª“ü‚Á‚½Žž‚É–{l‚É‚Ì‚Ý•\Ž¦‚³‚ê‚Ü‚·B
- ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
-
-night_at_start
- Choose if server begin with night (yes) or day (no)
- Default: No
-
-day_duration
- Define duration in msec of the day.
- Set to 0 to disable day cycle (but not @day command).
- Except 0, minimum is 60000 (1 minute).
- Default: 7,200,000 = 2 hours
-
-night_duration
- Define duration in msec of the night.
- Set to 0 to disable night cycle (but not @night command).
- Except 0, minimum is 60000 (1 minute).
- Default: 1,800,000 = 30 min
-
-ban_spoof_namer
- Ban people that try to use an other name of its name (spoof name).
- Duration of the ban, in minutes.
- Value from 0 to 32767. Set to 0 to do no ban.
- Default: 5 (minutes)
-
-hack_info_GM_level
- Set here minimum level of a (online) GM that can receive all informations about any player that try to hack, spoof a name, etc.
- Values are from 0 to 100.
- 100: disable information
- 0: send to any people, including normal players
- default: 60, according to GM definition in atcommand_athena.conf
-
-any_warp_GM_min_level
- Set here the minimum GM level to disable the nowarp (from) and nowarpto (to) flags.
- This option is mainly used in AT_commands (@memo, @warp, @charwarp, @go, etc...). All GM commands used to move or set a new map check nowarp and nowarpto flags.
- default: 20 (first level after normal player or super'normal' player)
-
-packet_ver_flag
- Set here which client version do you accept. Add all values of clients:
- 1: Clients before 2004-07-06 (old clients)
- 2: 2004-07-06 kRO client
- 4: 2004-07-13 kRO client
- 8: 2004-07-26 kRO client
- 16: 2004-08-09 kRO / 2004-08-16aSakray / 2004-08-17aSakray client
- 32: 2004-09-06aSakray client
- default value: 63 (all clients)
-
-import
- ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
-
-< Example >
-
-warp_point_debug: no
-enemy_critical: yes
-enemy_critical_rate: 100
-enemy_perfect_flee: no
-casting_rate: 100
-delay_rate: 100
-delay_dependon_dex: no
-skill_delay_attack_enable: no
-left_cardfix_to_right: no
-player_skill_add_range: 0
-skill_out_range_consume: yes
-monster_skill_add_range: 0
-player_damage_delay: yes
-player_damage_delay_rate: 100
-defunit_not_enemy: yes
-random_monster_checklv: yes
-attribute_recover: yes
-item_auto_get: no
-flooritem_lifetime: 60000
-item_first_get_time: 10000
-item_second_get_time: 7000
-item_third_get_time: 5000
-mvp_item_first_get_time: 10000
-mvp_item_second_get_time: 10000
-mvp_item_third_get_time: 2000
-item_rate: 100
-drop_rate0item: no
-base_exp_rate: 100
-job_exp_rate: 100
-death_penalty_type: 0
-death_penalty_base: 100
-death_penalty_job: 100
-zeny_penalty: 0
-restart_hp_rate: 0
-restart_sp_rate: 0
-mvp_hp_rate: 100
-mvp_item_rate: 100
-mvp_exp_rate: 100
-monster_hp_rate: 100
-monster_max_aspd: 199
-atcommand_gm_only: Yes
-gm_all_skill: 0
-gm_all_equipment: 0
-gm_skill_unconditional: 0
-player_skillfree: no
-player_skillup_limit: no
-weapon_produce_rate: 100
-potion_produce_rate: 100
-monster_active_enable: yes
-monster_damage_delay_rate: 100
-monster_loot_type: 0
-mob_skill_use: yes
-mob_count_rate: 100
-quest_skill_learn: no
-quest_skill_reset: yes
-basic_skill_check: yes
-guild_emperium_check: yes
-player_invincible_time: 5000
-pet_catch_rate: 100
-pet_rename: no
-pet_friendly_rate: 100
-pet_hungry_delay_rate: 100
-pet_hungry_friendly_decrease: 5
-pet_str: yes
-pet_status_support: no
-pet_support: no
-pet_support_rate: 100
-pet_attack_exp_to_master: no
-pet_attack_exp_rate: no
-pet_lootitem: no
-pet_weight: 1000
-skill_min_damage: no
-finger_offensive_type: 0
-heal_exp: 0
-resurrection_exp: 0
-hop_exp: 0
-combo_delay_rate: 100
-item_check: on
-wedding_modifydisplay: no
-natural_healhp_interval:4000
-natural_healsp_interval:8000
-natural_heal_skill_interval:10000
-natural_heal_weight_rate: 50
-item_name_override_grffile: yes
-arrow_decrement: yes
-max_aspd: 199
-max_hp: 32500
-max_sp: 32500
-max_parameter: 99
-max_cart_weight: 8000
-player_skill_log: off
-monster_skill_log: off
-battle_log: off
-save_log: off
-error_log: on
-etc_log: on
-save_clothcolor: no
-undead_detect_type: 2
-player_auto_counter_type: 1
-monster_auto_counter_type: 0
-agi_penaly_type: 0
-agi_penaly_count: 3
-agi_penaly_num: 0
-vit_penaly_type: 0
-vit_penaly_count: 3
-vit_penaly_num: 0
-player_defense_type: 0
-monster_defense_type: 0
-pet_defense_type: 0
-magic_defense_type: 0
-player_skill_reiteration: no
-monster_skill_reiteration: no
-player_skill_nofootset: no
-monster_skill_nofootset: no
-player_cloak_check_type: 0
-monster_cloak_check_type: 0
-gvg_short_attack_damage_rate: 100
-gvg_long_attack_damage_rate: 100
-gvg_magic_attack_damage_rate: 100
-gvg_misc_attack_damage_rate: 100
-mob_changetarget_byskill: no
-player_attack_direction_change:yes
-monster_attack_direction_change:yes
-player_land_skill_limit: yes
-monster_land_skill_limit: yes
-party_skill_penaly: yes
-monster_class_change_full_recover: no
-produce_item_name_input: yes
-produce_potion_name_input: yes
-making_arrow_name_input: yes
-holywater_name_input: yes
-display_delay_skill_fail: yes
-chat_warpportal: no
-mob_warpportal: no
-dead_branch_active: no
-vending_max_value: 10000000
-show_steal_in_same_party: no
-enable_upper_class: no
-pet_atack_attr_none: no
-pc_atack_attr_none: no
-mob_atack_attr_none: yes
-player_skill_partner_check: yes
-hide_GM_session: no
-invite_request_check: yes
-unit_movement_type: 0
-disp_experience: no
-night_at_start: No
-day_duration: 7200000
-night_duration: 1800000
-ban_spoof_namer: 5
-hack_info_GM_level: 60
-any_warp_GM_min_level: 20
-packet_ver_flag: 63
-
-
-==========================================================================
-6. atcommand_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- GMƒRƒ}ƒ“ƒh(/mmA/nb“™)‚â@ƒRƒ}ƒ“ƒh‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚éGM‚̃Œƒxƒ‹‚ðÝ’è‚·‚镨‚Å‚·B
- Ý’è‚Í‘S‚ÄÈ—ª‰Â”\‚ÅAÈ—ªŽž‚̓fƒtƒHƒ‹ƒg’l‚ª—˜—p‚³‚ê‚Ü‚·B(ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B)
-
-command_symbol
- Set here the symbol that you want to use for your commands
- Only 1 character is get (default is '@'). You can set any character,
- except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
- With default character, all commands begin by a '@': <example> @revive
- default: @
-
-Sets the level of the users that can use the GM commands.
-<command name>: level
-// When battle_athena.conf has atcommand_gm_only set to no,
-// normal players (gm level 0) can use GM commands if you set 0 to the command level.
-Max GM level is 99. If you want forbid a command to all people, set it with level 100.
-
-broadcast
- GMƒRƒ}ƒ“ƒh /nbA/bA/bb
-local_broadcast
- GMƒRƒ}ƒ“ƒh /lb
-mapmove
- GMƒRƒ}ƒ“ƒh /mm
-resetstate
- GMƒRƒ}ƒ“ƒh /resetstateA/resetskill
-rura+
- @ƒRƒ}ƒ“ƒh @rura+
-rura
- @ƒRƒ}ƒ“ƒh @rura
-where
- @ƒRƒ}ƒ“ƒh @where
-jumpto
- @ƒRƒ}ƒ“ƒh @jumpto
-jump
- @ƒRƒ}ƒ“ƒh @jump
-who
- @ƒRƒ}ƒ“ƒh @who
-save
- @ƒRƒ}ƒ“ƒh @save
-load
- @ƒRƒ}ƒ“ƒh @load
-speed
- @ƒRƒ}ƒ“ƒh @speed
-storage
- @ƒRƒ}ƒ“ƒh @storage
-gstorage
- @ƒRƒ}ƒ“ƒh @gstorage
-option
- @ƒRƒ}ƒ“ƒh @option
-hide
- GMƒRƒ}ƒ“ƒh /hide‚Æ@ƒRƒ}ƒ“ƒh @hide
-jobchange
- @ƒRƒ}ƒ“ƒh @jobchange
-die
- @ƒRƒ}ƒ“ƒh @die
-kill
- @ƒRƒ}ƒ“ƒh @kill
-alive
- @ƒRƒ}ƒ“ƒh @alive
-kami
- @ƒRƒ}ƒ“ƒh @kamiA@kamib
-heal
- @ƒRƒ}ƒ“ƒh @heal
-item
- @ƒRƒ}ƒ“ƒh @itemA@item2
-itemreset
- @ƒRƒ}ƒ“ƒh @itemreset
-itemcheck
- @ƒRƒ}ƒ“ƒh @itemcheck
-lvup
- @ƒRƒ}ƒ“ƒh @lvup
-joblvup
- @ƒRƒ}ƒ“ƒh @joblvup
-help
- @ƒRƒ}ƒ“ƒh @helpA@h
-gm
- To become GM (need password; password is set in login_athena.conf).
- special!: only a non-GM (player with gm level 0) need to have this command.
- if you change the value, be sure of what you do!
- To be able to create a gm with @gm, you must:
- - give a level to level_new_gm (parameter of login_athena.conf) (not 0)
- - enable to level 0 the @gm command (atcommand_athena.conf) (default 100) - Only level 0 can give access to this command
- - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
- - and normal player must give correct password when he use the @gm command (gm_pass paramter in login_athena.conf)
-pvpoff
- @ƒRƒ}ƒ“ƒh @pvpoff
-pvpon
- @ƒRƒ}ƒ“ƒh @pvpon
-gvgoff
- @ƒRƒ}ƒ“ƒh @gvgoff
-gvgon
- @ƒRƒ}ƒ“ƒh @gvgon
-model
- @ƒRƒ}ƒ“ƒh @model
-go
- @ƒRƒ}ƒ“ƒh @go
-monster
- @ƒRƒ}ƒ“ƒh @monster
-killmonster
- @ƒRƒ}ƒ“ƒh @killmonsterA@killmonster2
-refine
- @ƒRƒ}ƒ“ƒh @refine
-produce
- @ƒRƒ}ƒ“ƒh @produce
-memo
- @ƒRƒ}ƒ“ƒh @memo
-gat
- @ƒRƒ}ƒ“ƒh @gat
-packet
- @ƒRƒ}ƒ“ƒh @packet
-stpoint
- @ƒRƒ}ƒ“ƒh @stpoint
-skpoint
- @ƒRƒ}ƒ“ƒh @skpoint
-zeny
- @ƒRƒ}ƒ“ƒh @zeny
-param
- @ƒRƒ}ƒ“ƒh @strA@agiA@vitA@intA@dexA@luk
-guildlvup
- @ƒRƒ}ƒ“ƒh @guildlvup
-makeegg
- @ƒRƒ}ƒ“ƒh @makeegg
-petfriendly
- @ƒRƒ}ƒ“ƒh @petfriendly
-pethungry
- @ƒRƒ}ƒ“ƒh @pethungry
-petrename
- @ƒRƒ}ƒ“ƒh @petrename
-recall
- @ƒRƒ}ƒ“ƒh @recall
-charjob
- @ƒRƒ}ƒ“ƒh @charjob
-revive
- @ƒRƒ}ƒ“ƒh @revive
-charstats
- @ƒRƒ}ƒ“ƒh @charstats
-charoption
- @ƒRƒ}ƒ“ƒh @charoption
-charsave
- @ƒRƒ}ƒ“ƒh @charsave
-charload
- @ƒRƒ}ƒ“ƒh @charload
-night
- @ƒRƒ}ƒ“ƒh @night
-day
- @ƒRƒ}ƒ“ƒh @day
-doom
- @ƒRƒ}ƒ“ƒh @doom
-doommap
- @ƒRƒ}ƒ“ƒh @doommap
-raise
- @ƒRƒ}ƒ“ƒh @raise
-raisemap
- @ƒRƒ}ƒ“ƒh @raisemap
-charbaselvl
- @ƒRƒ}ƒ“ƒh @charbaselvl
-charjlvl
- @ƒRƒ}ƒ“ƒh @charjlvl
-kick
- @ƒRƒ}ƒ“ƒh @kick‚ÆGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v
-allskill
- @ƒRƒ}ƒ“ƒh @allskill
-questskill
- @ƒRƒ}ƒ“ƒh @questskill
-lostskill
- @ƒRƒ}ƒ“ƒh @lostskill
-spiritball
- @ƒRƒ}ƒ“ƒh @spiritball
-party
- @ƒRƒ}ƒ“ƒh @party
-guild
- @ƒRƒ}ƒ“ƒh @guild
-agitstart
- @ƒRƒ}ƒ“ƒh @agitstart
-agitend
- @ƒRƒ}ƒ“ƒh @agitend
-mapexit
- @ƒRƒ}ƒ“ƒh @mapexit
-idsearch
- @ƒRƒ}ƒ“ƒh @idsearch
-charchangesex
- Changes the sex of an online player (all characters on the account)
-ignorelist
- Displays your ignore list
-charignorelist
- Displays ignore list of a player
-inall
- Allows all wispers for the player
-exall
- Blocks all wispers for the player
-chardisguise
- Changes disguise of a player
-charundisguise
- Cancels disguise of a player
-email
- To change your (own) email (characters protection)
- note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
- if you want be sure of each e-mail disable this option (value: 100)
-
-
-import
- ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
-
-
-< Example >
-command_symbol: @
-
-broadcast: 1
-local_broadcast: 1
-mapmove: 1
-resetstate: 1
-rura+: 1
-rura: 1
-where: 1
-jumpto: 1
-jump: 1
-who: 1
-save: 1
-load: 1
-speed: 1
-storage: 1
-gstorage: 1
-option: 1
-hide: 1
-jobchange: 1
-die: 1
-kill: 1
-alive: 1
-kami: 1
-heal: 1
-item: 1
-itemreset: 1
-itemcheck: 1
-lvup: 1
-joblvup: 1
-help: 1
-gm: 100
-pvpoff: 1
-pvpon: 1
-gvgoff: 1
-gvgon: 1
-model: 1
-go: 1
-monster: 1
-killmonster: 1
-refine: 1
-produce: 1
-memo: 1
-gat: 1
-packet: 1
-stpoint : 1
-skpoint : 1
-zeny: 1
-param: 1
-guildlvup: 1
-makeegg: 60
-petfriendly: 1
-pethungry: 1
-petrename: 1
-recall: 1
-charjob: 1
-revive: 1
-charstats: 1
-charoption: 1
-charsave: 1
-charload: 1
-night: 1
-day: 1
-doom: 1
-doommap: 1
-raise: 1
-raisemap: 1
-charbaselvl: 1
-charjlvl: 1
-kick: 1
-allskill: 1
-questskill: 1
-lostskill: 1
-spiritball: 1
-party: 1
-guild: 1
-agitstart: 1
-agitend: 1
-mapexit: 1
-idsearch: 1
-charchangesex: 1
-ignorelist: 0
-charignorelist: 20
-inall: 20
-exall: 20
-chardisguise: 60
-charundisguise: 60
-email: 0
-
-==========================================================================
-7. conf/ladmin_athena.conf
---------------------------------------------------------------------------
-
-< What this file is. >
-
- A setup of ladmin (remote administration of the login-server) is described.
- It mainly becomes a setup of an administrator.
- Only 'c' version of the ladmin is concerned by this configuration file.
- 'Perl' ladmin doesn't use it.
-
-
-< Explanation of a key >
-
-If you change one of these parameters, you must restart ladmin to update.
-If you repeat one parameter in the configuration file, only the latest will be validated.
-
-login_ip
- IP adress to contact login-server.
- It is the IP adress of the login-server.
- Default value: 127.0.0.1 (same computer).
-
-login_port
- Port to contact login-server.
- It is the port used by login-server.
- Default value: 6900.
-
-admin_pass
- It is the administrator password used to administrate the login-server.
- You define it in login-athena.conf.
- Void password will not work.
- NOTICE: You must change this or attackers can exploit your server.
- Default value: admin. CHANGES this default value to avoid hack.
-
-passenc:
- You specify here how ladmin send password to login-server. 3 values are possible:
- 0: plain text
- 1: use md5 key (format: key + password)
- 2: use md5 key (format: password + key) (default)
- default: 2
-
-defaultlanguage
- You can specified a language to display information and for logs.
- There are 2 values:
- F: Français
- E: English (default)
- If a displayed information isn't translated, English is used.
- Default value: E
-
-ladmin_log_filename
- Gives the log file name and path to stores logs information.
- All operations done by the ladmin are written in this file with a time stamp.
- Default value: log/ladmin.log
-
-date_format:
- Indicate how to display date in logs, to players, etc.
- 0: 31-12-2004 23:59:59
- 1: 12-31-2004 23:59:59
- 2: 2004-31-12 23:59:59
- 3: 2004-12-31 23:59:59
- Default value: 3
-
-import
- Gives an other configuration file to include in.
- You must write the additionnal configuration file name and path.
- The mentionned file can include any parameter of the login configuration.
- You can create a chain or configuration files if necessary.
- Default value: <no_additional_configuration_file>.
-
-<Example>
-login_ip:127.0.0.1
-login_port: 6900
-admin_pass: admin
-passenc: 2
-defaultlanguage: E
-ladmin_log_filename: log/ladmin.log
-date_format: 3
-//import: path/additional_configuration_file
-
-
-==========================================================================
-EOF
---------------------------------------------------------------------------
+==========================================================================
+eAthena dev 1.0.0 mod1004 Reference +alpha of the present conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ It is the reference of the setting method of an Athena setting file.
+although it is not a HowTo, it not Those who cannot use Athena even if they see this
+ To give up obediently is safer.
+
+
+< The list of conf >
+
+ login_athena.conf A setup of login-server
+ char_athena.conf A setup of char-server
+ inter_athena.conf A setup of inter-server
+ map_athena.conf A setup of map-server
+ battle_athena.conf This file has been splitted into 13 files, separating them
+ depending on their function. Those files are:
+
+ *battle.conf Regarding battle system configuration.
+ *client.conf Regarding client configuration.
+ *drops.conf Regarding mob drops configuration
+ *guild.conf Regarding guild configuration.
+ *monster.conf Regarding monsters guidance and settings.
+ *player.conf Regarding player and/or character settings.
+ *exp.conf Regarding exp settings.
+ *items.conf Regarding items settings.
+ *party.conf Regarding party settings.
+ *skill.conf Regarding skill settings
+ *gm.conf Regarding GM settings (not GM commands).
+ *misc.conf Regarding various settings (such as PK)
+ *pet.conf Regarding pet settings.
+ atcommand_athena.conf A setup of map-server (setup of the GM command or @ command)
+ ladmin_athena.conf A setup of ladmin ('c' version)
+
+
+< The fundamental setting method >
+
+One line "key: Enter as a value."
+<Example>
+key: value
+
+Head of the sentence It will become a comment if it begins by //.
+<Example>
+//Since this line is a comment, it is not processed.
+
+< Two or more same items >
+
+Priority is given to what was written later unless it is written especially clearly that two or more same items are written.
+login_athena.conf allow and deny -- and -- map_athena.conf map, npc, etc.
+Another processing will be carried out if two or more lines are written.
+
+==========================================================================
+1. conf/login_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ A setup of login-server (server which manages account) is described.
+ It mainly becomes a setup of an administrator.
+
+
+< Explanation of a key >
+
+If you change one of these parameters, you must restart login-server to update.
+If you repeat one parameter (except 'allow', 'deny' or 'ladminallowip') in the configuration file, only the latest will be validated.
+ 'Allow', 'deny' and 'ladminallowip' parameters are list parameters. Add as many 'allow', 'deny' or 'ladminallowip' as you need.
+
+login_port
+ Port to bind login-server to (always binds to all IP addresses)
+ It is the port used by login-server. It can be omitted and a default is 6900.
+ Default value: 6900.
+
+admin_pass
+ It is the administrator password used to administrate the login-server through a remote connection.
+ You will found some tools in the tool directory, and specially the tool
+ ./tool/ladmin (for Login ADMINistration), a perl software, which manages all accounts.
+ Void password will not work.
+ NOTICE: You must change this or attackers can exploit your server.
+ Default value: admin. CHANGES this default value to avoid hack.
+
+ladminallowip
+ It's a list parameter. To add an item in this list, just add a new line. Each line can only have 1 parameter.
+ This list indicates the IP that the server accepts for a remote administration.
+ This parameter accepts IP descriptions, like:
+ IP or the begining of IP: it's a characters match. Write an IP (123.456.789.012) or the begining of the IP (123.456.).
+ Because it's a characters match, the IP 123.4 matches with 123.4.xxx.yyy and 123.4z.xxx.yyy. So, add a final '.' to be sure of the IP.
+ Example:
+ allow: 127.0.0.1
+ allow: 192.168.10.
+ IP with number of bits for a network: it's a logical match. Write the network like this: 123.456.789.012/<#_of_mask_bits>
+ Don't use the final '.', but use all four values.
+ Example:
+ allow: 127.0.0.1/32 (match only 1 IP, because 32 bits match all bits).
+ allow: 192.168.10/24 (matches the network begining by 192.168.10).
+ IP with mask of a network: it's a logical match. Write the network like this: 123.456.789.012/345.678.901.234
+ Don't use the final '.', but use all four values for the IP and the mask.
+ Example:
+ allow: 127.0.0.1/255.255.255.255 (match only 1 IP).
+ allow: 192.168.10.0/255.255.255.0 (matches the network begining by 192.168.10).
+ all: matches any IP.
+ Example:
+ allow: all.
+ clear: clears the list at this point. Really useful for 'import' parameter, in the new configuration file.
+ Example:
+ allow: clear.
+ Add as many IP's as you wish.
+ Default value: all.
+
+gm_pass
+ It is the required password when a player wants to change its (normal) account to a GM (Game Master) account.
+ It is used by the @gm command.
+ Level of gm is set with level_new_gm parameter.
+ NOTICE: You should also change this one.
+ Default value: gm. CHANGES this default value to avoid player hack.
+
+level_new_gm
+ Level of new GM created with @gm command. (default: 60)
+ If you set to 0, you disable creation of new GM with @gm.
+ To be able to create a gm with @gm, you must:
+ - give a level to this value (not 0)
+ - enable to level 0 the @gm command (atcommand_athena.conf) (default 100)
+ - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
+ - and normal player must give correct password when he use the @gm command
+ Possible value: 0 to 99
+ Default value: 60
+
+new_account
+ It is whether to permit new account creation.
+ When allowed, the player must add _F or _M at the end of its login account to create a new account.
+ This extension of the account gives the sex of the new created account.
+ Without the _F/M, the account must have at least 4 characters.
+ The account will not have e-mail to protect characters against deletion.
+ The given password at first connection (when the account is created) is the account password.
+ The value can be: 1 (to allow creation) or 0 (to forbid creation).
+ Default value: 1.
+
+account_filename
+ It specifies the accounts save file.
+ Gives the accounts txt database name and path to stores accounts information.
+ Look into the file to have a short description of the database structure.
+ Can be omited, a default is save/account.txt.
+ Default value: save/account.txt.
+
+gm_account_filename
+ It specifies which account IDs have GM privileges, and what level they have.
+ We recommand to use only ID value lower than first normal player ID (2000000).
+ Levels ranges from 0 (no privilege/normal player) to 99 (highest privilege).
+ If you change a value inside this file, you must restart login-server to use the new value
+ or use reloadgm ladmin command.
+ Can be omited, a default is conf/GM_account.txt.
+ Default value: conf/GM_account.txt
+
+gm_account_filename_check_timer
+ Timer to check if GM_account file has been changed and reload GM account automaticaly
+ (in seconds)
+ Value: 0 (disabled), or 2 or more.
+ Default: 15
+
+login_log_filename
+ Gives the log file name and path to stores logs information.
+ All operations done by the login-server are written in this file with a time stamp.
+ Default value: log/login.log
+
+login_log_unknown_packets_filename
+ Gives the file name and path of the file that logs the received unknown packets.
+ It's used for debug or hack check.
+ All information are displayed with the time stamp, the ip of the source, the packet number,
+ the number of received bytes and the detail of the packet with hex and text values. Example:
+ 01-06-2004 21:25:21.579: receiving of an unknown packet -> disconnection
+ parse_login: connection #5 (ip: 82.64.111.96), packet: 0x4e92 (with being read: 28).
+ Detail (in hex):
+ 92 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ’N..............
+ 00 00 00 00 00 00 00 00 00 00 00 00 ............
+ Default value: log/login_unknown_packets.log
+
+save_unknown_packets
+ It indicates if the unknown packets are saved or not.
+ The unknown packets received from the char-server or remote administration does not relate to this parameter,
+ because they are always saved.
+ The value can be: 1 (to save unknown packets) or 0 (to not save them).
+ Be careful: if you receive an attack, your hard disk can cause lag...
+ So, active this option with a speed hard disk or for debug only.
+ Default value: 0
+
+display_parse_login
+ It indicates if you want display the parse of the packets received in a normal connection.
+ At all received packets in normal connection, the server display a message about the size and the value.
+ It's useful for debug. Possible values: 0: no (default), 1: yes.
+ Default value: 0
+
+display_parse_admin
+ It's same of 'display_parse_login' parameter, but only for remote administration received packets.
+ It's useful for debug. Possible values: 0: no (default), 1: yes.
+ Default value: 0
+
+display_parse_fromchar
+ It's same of 'display_parse_login' parameter, but only for char-server received packets.
+ It's useful for debug. Possible values: 0: no (default), 1: yes (without packet 0x2714), 2: all packets.
+ Default value: 0
+
+date_format:
+ indicate how to display date in logs, to players, etc.
+ 0: 31-12-2004 23:59:59
+ 1: 12-31-2004 23:59:59
+ 2: 2004-31-12 23:59:59
+ 3: 2004-12-31 23:59:59
+ Default value: 3
+
+min_level_to_connect
+ Indicate the minimum GM level of player that the server accepts to connection.
+ 0: all players (normal player are 0. it's default), or
+ 1-99: GM level at least with level x
+ Default value: 0 (any player or GM)
+
+add_to_unlimited_account
+ Give possibility to adjust (ladmin command: timeadd) the time of an unlimited account.
+ If set to on/1/yes..., the adjustment is be done from actual time to set the final time of the account.
+ If set to no/0/no..., the adjustment can not be done on an unlimited account.
+ You must set (ladmin command: timeset) a final time before to adjust (ladmin command: timeadd)
+ Default value: no
+
+start_limited_time
+ 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)
+ Default value: -1
+
+check_ip_flag
+ It's to check IP of a player between login-server and char-server (part of anti-hacking system)
+ If player doesn't have same IP, connection is refused.
+ Set to 0/off/no to not check IP of player.
+ Set to 1/on/yes if you want to check (default)
+ Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
+ and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
+ if not correct, you can read list of char-servers, but not look slots of characters (rejected by server).
+ Default value: yes
+
+order
+ This parameter controls how the login-server must use the 'allow' and 'deny' lists.
+ 'Allow' and 'deny' are used to do IP lists.
+ 3 possibilities:
+ 'deny,allow': to sum it up, it's like 'allow if not deny'. The login-server only checks the 'deny' list.
+ If the connected IP is in the 'deny' list, the login-server refuses the connection, otherwise it accepts it.
+ 'allow,deny': to sum it up, it's like 'deny if not allow'. The login-server only checks the 'allow' list.
+ If the connected IP is in the 'allow' list, the login-server accepts the connection, otherwise it refuses it.
+ 'mutual-failture': to sum it up, it's like 'allow if in allow list and not in the deny list'.
+ The login-server checks the 'allow' list. If the connected IP is in the 'allow' list,
+ the login-server checks it in the 'deny' list. If the connectec IP is not in the 'deny' list,
+ the login-server accepts the conection, otherwise it refuses it.
+ In this case, a non 'allow' IP or a 'deny' IP will be never accepted.
+ If you don't use allow AND deny, all ip are authorised.
+ Default value: deny,allow.
+
+allow
+ It's a list parameter. To add an item in this list, just add a new line. Each line can only have 1 parameter.
+ This list depends on the 'order' parameter (read 'order' parameter to known what the login-server do with this list).
+ This parameter accepts IP descriptions, like:
+ IP or the begining of IP: it's a characters match. Write an IP (123.456.789.012) or the begining of the IP (123.456.).
+ Because it's a characters match, the IP 123.4 matches with 123.4.xxx.yyy and 123.4z.xxx.yyy. So, add a final '.' to be sure of the IP.
+ Example:
+ allow: 127.0.0.1
+ allow: 192.168.10.
+ IP with number of bits for a network: it's a logical match. Write the network like this: 123.456.789.012/<#_of_mask_bits>
+ Don't use the final '.', but use all four values.
+ Example:
+ allow: 127.0.0.1/32 (match only 1 IP, because 32 bits match all bits).
+ allow: 192.168.10/24 (matches the network begining by 192.168.10).
+ IP with mask of a network: it's a logical match. Write the network like this: 123.456.789.012/345.678.901.234
+ Don't use the final '.', but use all four values for the IP and the mask.
+ Example:
+ allow: 127.0.0.1/255.255.255.255 (match only 1 IP).
+ allow: 192.168.10.0/255.255.255.0 (matches the network begining by 192.168.10).
+ all: matches any IP.
+ Example:
+ allow: all.
+ clear: clears the list at this point. Really useful for 'import' parameter, in the new configuration file.
+ Example:
+ allow: clear.
+ It does not support the backward match of host name.
+ Default value: <no list>.
+
+deny
+ This list works exactly like the 'allow' list, but for the 'deny' list.
+
+import
+ Gives an other configuration file to include in.
+ You must write the additionnal configuration file name and path.
+ The mentionned file can include any parameter of the login configuration.
+ You can create a chain or configuration files if necessary.
+ Default value: <no_additional_configuration_file>.
+
+<Example>
+login_port: 6900
+admin_pass: admin
+ladminallowip: all
+gm_pass: gm
+level_new_gm: 60
+new_account: 1
+account_filename: save/account.txt
+gm_account_filename: conf/GM_account.txt
+gm_account_filename_check_timer: 15
+login_log_filename: log/login.log
+login_log_unknown_packets_filename: log/login_unknown_packets.log
+save_unknown_packets: 0
+display_parse_login: 0
+display_parse_admin: 0
+display_parse_fromchar: 0
+date_format: 3
+min_level_to_connect: 0
+add_to_unlimited_account: off
+start_limited_time: -1
+check_ip_flag: yes
+order: deny,allow
+//deny: all
+//allow: 127.0.0.1
+//allow: 10.0.
+//allow: 172.16.0.0/16
+//allow: 192.168.0.0/255.255.255.0
+//import: import/new_login.conf
+
+==========================================================================
+2. conf/char_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ A setup of char-server (server which manages the character data in one world)
+ It ???. The name of a world, the password of a world, a server's IP,
+ A data file name etc. is described.
+
+
+<Explanation of a key>
+
+userid
+ It is ID which this world uses. It registers with login-server.
+ ID of account is specified.
+ And also [ it uses it for connecting to map-server used in this world ]
+ It is used also for discernment of the world within login-server.
+ It is each when registering two or more worlds into the same login-server.
+ It is necessary to use another ID by char-server.
+
+passwd
+ It is a password corresponding to ID which this world uses.
+ It is used for the time of the registration to login-server, and connecting to map-server.
+
+server_name
+ It is the name of this world. It is displayed when logged in by the client.
+
+wisp_server_name
+ Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
+ Default: Server
+
+login_ip
+ It is the IP address of login-server which registers a world seen from char-server.
+
+login_port
+ It is the port used by login-server. It can omit and a default is 6900.
+
+char_ip
+ It is the IP address of char-server seen from the client.
+
+char_port
+ It is the port used by char-server. It can omit and a default is 6121.
+
+email_creation
+ Option to force a player to create an e-mail.
+ If a player have default e-mail, and if you activate this option, the player can only connect in the game (to arrive on a map) like follow:
+ - Create at least 1 character
+ - Select 1 character
+ - Select DEL to enter his/her e-mail. (if OK is choosen, client says to the player: 'invalid e-mail')
+ - If his/her e-mail is correct, the player enter in the game (an e-mail is saved definitively).
+ - If his/her e-mail is incorrect, he/she have 'incorrect e-mail' and must select again DEL.
+ - After entering in the game (when the player arrives on a map), DEL and SEL/OK button work normaly for all next connections.
+ Resume: If a player have "incorrect/invalid e-mail" when he/she click on 'OK' button,
+ the player must click 'DEL' button and register his/her NEW e-mail to enter in the game
+ So, default is 0, because administrator must explain to their players before to activate this option.
+
+char_txt
+ It is the data file name which stores character data.
+ It is not omissible.
+
+char_maintenance
+ If it is made 1, it will be in a maintenance state.
+ It can omit and a default is 0.
+
+char_new
+ If it is made 1, the time (new) of being displayed on a client will stick.
+ It can omit and a default is 0.
+
+max_connect_user
+ It is the maximum number of the user linked to a Char-server.
+ If it is made 0, the maximum number restrictions will be lost.
+ Please use to apply restriction of the connection number.
+ It can omit and a default is 0.
+
+check_ip_flag
+ It's to check IP of a player between char-server and other servers (part of anti-hacking system)
+ If player doesn't have same IP, connection is refused.
+ Set to 0/off/no to not check IP of player.
+ Set to 1/on/yes if you want to check (default)
+ Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
+ and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
+ default: yes
+
+autosave_time
+ It is time to save data automatically at a file. A unit is a second.
+ It can omit and a default is 300 (5 minutes).
+
+start_point
+ When a new character is created, it is the place where they start.
+ It describes like "a map file name, X coordinates, and Y coordinates."
+ It can omit and is a default. It is new_1-1.gat and 53,111.
+
+start_weapon:
+ Starting weapon for new characters
+ default value: 1201 (Knife)
+
+start_armor:
+ Starting armor for new characters
+ default value: 2301 (Cotton Shirt)
+
+start_zeny
+ When new character is made, the quantity of ZENY which it has from the start is set up.
+ Being able to omit, a default is 500.
+
+unknown_char_name
+ The name returned when the name request of character which does not exist in a character server is carried out
+ It sets up. Being able to omit, a default is Unknown.
+
+char_log_filename
+ A character server's log file is specified.
+ Being able to omit, a default is log/char.log.
+
+name_ignoring_case
+ Allow or not identical name for characters but with a different case (upper/lower): example: Test-test-TEST-TesT
+ 0 (default): no character can have same name, instead of the case (no Test-TEST...)
+ 1: more than 1 of character can have same name if names are not using same case (one with Test, another with TEST, etc...)
+
+char_name_option
+ Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
+ 0: no restriction (default)
+ 1: only letters/symbols in 'char_name_letters' option.
+ 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
+ default: 0.
+
+char_name_letters
+ Set the letters/symbols that you want use with the 'char_name_option' option.
+ Note: add 'space' between 2 others letters/symbols.
+ default: void.
+
+online_txt_filename
+ It sets the filename of the file which receives the online players list in text
+ default: online.txt
+
+online_html_filename
+ It sets the filename of the file which receives the online players list, but in html version
+ default: online.html
+
+online_sorting_option
+ It sets how to display online players in the txt/html files.
+ 0: no sorting (default)
+ 1: by alphabetical order of their name
+ 2: by number of their zenys
+ 3: by their base level
+ 4: by their job (and job level inside the same job)
+ 5: by alphabetical order of their actual map location
+ Note: sorting operation with a lot of online players can take time on a slow computer.
+
+online_display_option
+ It sets which columns that you want display in the online files. Do the addition of these values:
+ (if value is 0, no file is done)
+ 1: name (just the name, no function like 'GM')
+ 2: job
+ 4: levels
+ 8: map name
+ 16: mapname and coordonates
+ 32: zenys
+ 64: name (with 'GM' if the player is a GM)
+ default value: 1 (only name)
+
+online_gm_display_min_level
+ minimum GM level to display 'GM' when we want to display it.
+ default value: 1 (any GM)
+
+online_refresh_html
+ refresh time (in sec) of the html file in the explorer
+ default: 20
+
+import
+ The line is replaced with the contents of another file.
+
+
+< Example >
+userid: s1
+passwd: p1
+server_name: eAthena
+wisp_server_name: Server
+login_ip: 127.0.0.1
+login_port: 6900
+char_ip: 127.0.0.1
+char_port: 6121
+email_creation: 0
+char_txt: save/athena.txt
+char_maintenance: 0
+char_new: 0
+max_connect_user: 0
+check_ip_flag: yes
+autosave_time: 15
+start_point: new_1-1.gat,53,111
+start_weapon: 1201
+start_armor: 2301
+start_zeny: 500
+unknown_char_name: Unknown
+char_log_filename: log/char.log
+name_ignoring_case: 0
+char_name_option: 0
+//char_name_letters:
+online_txt_filename: online.txt
+online_html_filename: online.html
+online_sorting_option: 0
+online_display_option: 1
+online_gm_display_min_level: 1
+online_refresh_html: 20
+//import: import/new_char.conf
+
+
+==========================================================================
+3. conf/inter_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ A setup of inter-server (server which manages the global data in one world)
+ It ???. A data file name etc. is described.
+ (It is operating as a part of char-server in program now.)
+
+< Explanation of a key >
+
+storage_txt
+ It is the file name which stores warehouse data.
+ It can omit and is a default. It is save/storage.txt.
+
+party_txt
+ It is the file name which stores party data.
+ It can omit and is a default. It is save/party.txt.
+
+guild_txt
+ It is the file name which stores guild data.
+ It can omit and is a default. It is save/guild.txt.
+
+pet_txt
+ It is the file name which stores pet data.
+ It can omit and is a default. It is save/pet.txt.
+
+castle_txt
+ It is the file name which stores the castle data of a guild.
+ It can omit and is a default. It is save/castle.txt.
+
+guild_storage_txt
+ It is the file name which stores guild warehouse data.
+ Being able to omit, a default is save/g_storage.txt.
+
+accreg_txt
+ It is the file name which stores the account share variable data in a world.
+ It can omit and is a default. It is save/accreg.txt.
+
+party_share_level
+ The restriction level of a fair distribution party is set up.
+ Being able to omit, a default is 10.
+
+inter_log_filename
+ An interchange server's log file is specified.
+ Being able to omit, a default is log/inter.log.
+
+import
+ The line is replaced with the contents of another file.
+
+
+< Example >
+storage_txt: save/storage.txt
+party_txt: save/party.txt
+guild_txt: save/guild.txt
+pet_txt: save/pet.txt
+castle_txt: save/castle.txt
+guild_storage_txt: save/g_storage.txt
+accreg_txt: save/accreg.txt
+party_share_level: 10
+inter_log_file: log/inter.log
+
+
+==========================================================================
+4. conf/map_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ A fundamental setup of map-server (server which manages game advance on the map in his duty)
+ It ???.
+
+
+< Explanation of a key >
+
+userid
+ It is ID which this world uses. It is used for the connecting to char-server.
+
+passwd
+ It is a password corresponding to ID which this world uses.
+
+char_ip
+ map-server‚©‚ç‚Ý‚½A‚±‚̃T[ƒo[‚ª’S“–‚·‚éƒ}ƒbƒv‚̃[ƒ‹ƒh‚ðŠÇ—‚·‚é
+ char-server‚ÌIP‚Å‚·B
+
+char_port
+ ƒ}ƒbƒv‚ð“o˜^‚·‚échar-server‚̃|[ƒg‚Å‚·BÈ—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í6121‚Å‚·B
+
+map_ip
+ ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚½‚±‚Ìmap-server‚ÌIP‚Å‚·B
+
+map_port
+ map-server‚ÅŽg—p‚·‚éƒ|[ƒg‚Å‚·BÈ—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í5121‚Å‚·B
+
+autosave_time
+ ƒf[ƒ^‚ðŽ©“®“I‚ɃLƒƒƒ‰ŽI‚É‘—‚鎞ŠÔ‚Å‚·B’PˆÊ‚Í•b‚Å‚·B
+ È—ª‰Â”\‚ŃfƒtƒHƒ‹ƒg‚Í60(1•ª)‚Å‚·B
+
+water_height
+ …ê‚Ì‚‚³‚ðŽw’è‚·‚éƒtƒ@ƒCƒ‹‚ðŒˆ‚ß‚Ü‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/water_height.txt‚Å‚·B
+
+motd_txt
+ Message of the Dayƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/motd.txt‚Å‚·B
+
+help_txt
+ @help‚Å•\Ž¦‚·‚éƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Íconf/help.txt‚Å‚·B
+
+mapreg_txt
+ MAPƒT[ƒo[“àƒLƒƒƒ‰ƒNƒ^[‹¤—L•Ï”‚ð•Û‘¶‚·‚éƒtƒ@ƒCƒ‹‚ðŽw’肵‚Ü‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Ísave/mapreg_txt‚Å‚·B
+
+data_grf
+ ROƒf[ƒ^ƒtƒ@ƒCƒ‹ data.grf ‚ւ̃pƒX‚Å‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./data.grf ‚Å‚·B
+ grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
+
+sdata_grf
+ ƒTƒNƒ‰ƒCƒf[ƒ^ƒtƒ@ƒCƒ‹ sdata.grf ‚ւ̃pƒX‚Å‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./sdata.grf ‚Å‚·B
+ grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
+
+adata_grf
+ ƒ¿ƒf[ƒ^ƒtƒ@ƒCƒ‹ adata.grf ‚ւ̃pƒX‚Å‚·B
+ È—ª‰Â”\‚ÅAƒfƒtƒHƒ‹ƒg‚Í ./adata.grf ‚Å‚·B
+ grf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·B
+
+npc
+ “Ç‚Ýž‚Þnpcƒf[ƒ^ƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
+ •¡”Žw’è‰Â”\‚ÅAŽw’肵‚½‡‚Ƀ[ƒh‚µ‚Ü‚·B
+ clear ‚ðŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚É“o˜^‚µ‚½ƒpƒX‚ð‘S‚Ä휂µ‚Ü‚·B
+
+delnpc
+ “Ç‚Ýž‚Ü‚È‚¢npcƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
+ Žw’肵‚½ƒpƒX‚Ínpc‚ÅŽw’肳‚ꂽƒf[ƒ^ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚©‚ç휂³‚ê‚Ü‚·B
+ all ‚ðŽw’è‚·‚é‚Æ‘S‚Ä휂µ‚Ü‚·( npc: clear ‚Æ“¯‹`)B
+
+map
+ ‚±‚̃}ƒbƒv‚ª’S“–‚·‚éƒ}ƒbƒvƒtƒ@ƒCƒ‹–¼‚Å‚·B
+ •¡”Žw’è‰Â”\‚ÅAŽw’肵‚½‡‚Ƀ[ƒh‚µ‚Ü‚·B
+ ‘¶Ý‚µ‚È‚¢ƒ}ƒbƒv‚ðŽw’肵‚½ê‡ƒGƒ‰[‚É‚È‚è‚Ü‚·B
+ clear ‚ðŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚É“o˜^‚µ‚½ƒtƒ@ƒCƒ‹–¼‚ð‘S‚Ä휂µ‚Ü‚·B
+
+delmap
+ “Ç‚Ýž‚Ü‚È‚¢ƒ}ƒbƒvƒtƒ@ƒCƒ‹‚ւ̃pƒX‚Å‚·B
+ Žw’肵‚½ƒtƒ@ƒCƒ‹‚Ímap‚ÅŽw’肳‚ꂽƒŠƒXƒg‚©‚ç휂³‚ê‚Ü‚·B
+ all ‚ðŽw’è‚·‚é‚Æ‘S‚Ä휂µ‚Ü‚·( map: clear ‚Æ“¯‹`)B
+
+import
+ ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
+
+< Example >
+
+userid: s1
+passwd: p1
+char_ip: 127.0.0.1
+char_port: 6121
+map_ip: 127.0.0.1
+map_port: 5121
+autosave_time: 60
+nullpo_check: 1
+water_height: conf/water_height.txt
+data_grf: ./data.grf
+sdata_grf: ./sdata.grf
+npc: conf/warp/npc_warp.txt
+npc: conf/warp/npc_warp25.txt
+npc: conf/warp/npc_warp3.txt
+npc: conf/mob/npc_monster3J.txt
+map: prontera.gat
+map: prt_castle.gat
+inpcAmap‚Í‘½‚¢‚Ì‚ÅÈ—ªj
+delnpc: conf/sample/npc_test.txt
+npc: clear
+delmap: prontera.gat
+delmap: all
+
+==========================================================================
+5. conf/battle_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ Battle relation of map-server (server which manages game advance on the map in his duty),
+ Other setup is described.
+ All setup can be omitted and a default value is used at the time of an abbreviation.
+
+< The special character sequence which can be specified to be a value >
+
+ yes on It is processed as 1. (Effective meaning)
+ no off It is processed as 0. (Invalid meaning)
+
+
+< Explanation of a key >
+
+warp_point_debug
+ ƒ[ƒvƒ|ƒCƒ“ƒg‚ð•’Ê‚É•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ
+ ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì‚©‚í‚è‚ɃMƒ‹ƒhƒtƒ‰ƒO‚ª‚»‚ÌꊂÉo‚ă[ƒv
+ ƒ|ƒCƒ“ƒg‚Ì–¼‘O‚ðŠm”F‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+enemy_critical
+ ƒvƒŒƒCƒ„[‚Æ“¯‚¶LUK‚É‚æ‚éƒNƒŠƒeƒBƒJƒ‹”»’è‚ðMOB‚ƃyƒbƒg‚É—LŒø‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚̃NƒŠƒeƒBƒJƒ‹‚Í‚à‚¿‚ë‚ñ•K’†‚È‚Ì‚ÅAon‚É‚·‚é‚Æ‚Flee‚Å‚àA
+ LUK‚Ì‚‚¢“G‚ÌUŒ‚‚ª”ð‚¯‚Ã‚ç‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+enemy_critical_rate
+ ƒ‚ƒ“ƒXƒ^[‚ƃyƒbƒg‚̃NƒŠƒeƒBƒJƒ‹•p“x‚Ì•S•ª—¦‚Å‚·Benemy_critical‚ªyes‚¶‚á‚È‚¢‚Æݒ肵‚Ä‚à‰½‚̈Ӗ¡‚à‚ ‚è‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+enemy_str
+ ƒ‚ƒ“ƒXƒ^[‚Ì‚ªUŒ‚‚·‚é‚Æ‚«‚ÌATKŒvŽZ‚ÉSTR‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+enemy_perfect_flee
+ “G‚ªŠ®‘S‰ñ”ð‚ð‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ“G‚àŠ®‘S‰ñ”ð‚ð
+ ‚·‚é‚悤‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+casting_rate
+ ƒXƒLƒ‹‚̉r¥ŽžŠÔ‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 200‚É‚·‚é‚Ɖr¥ŽžŠÔ‚ª”{‚É‚È‚èA0‚É‚·‚é‚Ɖr¥‚ª‚È‚­‚È‚è‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+delay_rate
+ ƒXƒLƒ‹Žg—pŒãƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+delay_dependon_dex
+ ƒXƒLƒ‹Žg—pŒãƒfƒBƒŒƒC‚ª‰r¥ŽžŠÔ‚Æ“¯‚¶‚悤‚ÉDEX‚ʼne‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚ð
+ Žw’肵‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+skill_delay_attack_enable
+ ƒXƒLƒ‹ƒfƒBƒŒƒC‚ÌŠÔUŒ‚‚Å‚«‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚ê‚΃XƒLƒ‹ƒfƒBƒŒƒC‚ÌŠÔƒXƒLƒ‹‚ÍŽg‚¦‚È‚¢‚¯‚ÇUŒ‚‚Í‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+left_cardfix_to_right
+ “ñ“—¬‚̶Žè•Ší‚ÌŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ð‰EŽè•Ší‚É“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƶŽè•Ší‚É‚ÍŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ªŠ|‚©‚ç‚È‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+player_skill_add_range
+ ƒvƒŒƒCƒ„[‚̃XƒLƒ‹ŽË’ö‚©‚ç“G‚ª—£‚ꂽŽž‚Ç‚ê‚®‚ç‚¢‚Ì‹——£‚܂ŃXƒLƒ‹‚ðŽg—p‰Â”\‚É‚·‚é‚©‚ðŒˆ‚ß‚Ü‚·BƒXƒLƒ‹‚ÌŽË’ö+player_skill_add_range‚܂ŃXƒLƒ‹‚ª“Í‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·‚ª­‚µ‚Í“ü‚ꂽ•û‚ª‚¢‚¢‚Å‚·B
+
+skill_out_range_consume
+ ƒXƒLƒ‹‚ÌŽË’ö‚©‚ç“G‚ª—£‚ê‚ăXƒLƒ‹‚ªŽ¸”s‚µ‚½ŽžSP‚âƒAƒCƒeƒ€‚ðÁ–Õ‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+monster_skill_add_range
+ ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹ŽË’ö‚©‚ç“G‚ª—£‚ꂽŽž‚Ç‚ê‚®‚ç‚¢‚Ì‹——£‚܂ŃXƒLƒ‹‚ðŽg—p‰Â”\‚É‚·‚é‚©‚ðŒˆ‚ß‚Ü‚·BƒXƒLƒ‹‚ÌŽË’ö+monster_skill_add_range‚܂ŃXƒLƒ‹‚ª“Í‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+player_damage_delay
+ ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð“ü‚ê‚é‚©‚Ç‚¤‚©‚Å‚·B
+ yes‚É‚·‚é‚ƃCƒ“ƒfƒ…ƒA‚Å‚àŽg‚í‚È‚¢ŒÀ‚èƒ_ƒ[ƒW‚ðŽó‚¯‚½Žž
+ ‚µ‚΂炭‚Í“®‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+player_damage_delay_rate
+ ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
+ player_damage_delay‚ªyes‚É‚µ‚Ä‚È‚¢‚ƈӖ¡‚ª‚ ‚è‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+defunit_not_enemy
+ –hŒäƒ†ƒjƒbƒgiƒZƒCƒtƒeƒBƒEƒH[ƒ‹/ƒjƒ…[ƒ}‚È‚Çj‚ªMOB‚ÉŒø‰Ê‚ð
+ ‹y‚Ú‚³‚È‚¢‚悤‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+random_monster_checklv
+ ƒ‚ƒ“ƒXƒ^[¢ŠÒƒAƒCƒeƒ€‚ðŽg‚Á‚½‚Æ‚«‚ÉŽ©•ª‚æ‚èLV‚Ì‚‚¢ƒ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ yes‚É‚·‚é‚ÆAŽ©•ª‚æ‚èLV‚Ì‚‚¢ƒ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚µ‚È‚¢‚悤‚É‚È‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+attribute_recover
+ ‘®«‚É‚æ‚Á‚ÄUŒ‚‚³‚ê‚Ä‚à‰ñ•œ‚·‚é‚©‚Ç‚¤‚©‚Å‚·Bno‚ÌꇂÍ-‘®«‚ð
+ 0‚É‚µ‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+item_auto_get
+ ƒAƒCƒeƒ€Ž©“®Žæ“¾‹@”\‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ yes‚É‚·‚é‚ƃAƒCƒeƒ€ƒhƒƒbƒv‚ðƒ‚ƒ“ƒXƒ^[‚Ɉê”Ô‘½‚­ƒ_ƒ[ƒW‚ð—^‚¦‚½ƒLƒƒƒ‰‚ª
+ Ž©“®‚ŃAƒCƒeƒ€‚ðŽæ“¾‚·‚é‚悤‚É‚È‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+flooritem_lifetime
+ °‚É—Ž‚¿‚½ƒAƒCƒeƒ€‚ªÁ‚¦‚é‚Ü‚Å‚©‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í60000(60•b)‚ÅŬ‚Í1000(1•b)‚Å‚·B1000–¢–ž‚È‚çƒfƒtƒHƒ‹ƒg‚ɃZƒbƒg‚³‚ê‚Ü‚·B
+
+item_first_get_time
+ ƒ‚ƒ“ƒXƒ^[‚Ɉê”Ôƒ_ƒ[ƒW‚𑽂­—^‚¦‚½ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚Ì
+ ƒhƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚ÌŽžŠÔ‚Å‚·B
+ ’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
+
+item_second_get_time
+ item_first_get_time‚̌ヂƒ“ƒXƒ^[‚É“ñ”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
+ ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
+ ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í7000(7•b)‚Å‚·B
+
+item_third_get_time
+ item_second_get_time‚̌ヂƒ“ƒXƒ^[‚ÉŽO”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
+ ƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
+ ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í5000(5•b)‚Å‚·B
+
+mvp_item_first_get_time
+ ƒ‚ƒ“ƒXƒ^[‚Ɉê”Ôƒ_ƒ[ƒW‚𑽂­—^‚¦‚½ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚Ì
+ MVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚ÌŽžŠÔ‚Å‚·B
+ ’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
+
+mvp_item_second_get_time
+ mvp_item_first_get_time‚̌ヂƒ“ƒXƒ^[‚É“ñ”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
+ ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚ÌMVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
+ ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í10000(10•b)‚Å‚·B
+
+mvp_item_third_get_time
+ mvp_item_second_get_time‚̌ヂƒ“ƒXƒ^[‚ÉŽO”ԖڂɃ_ƒ[ƒW‚𑽂­—^‚¦‚½
+ ƒLƒƒƒ‰ˆÈŠO‚ª‚»‚̃‚ƒ“ƒXƒ^[‚ÌMVPƒAƒCƒeƒ€‚ðŽæ‚ê‚é‚悤‚É‚È‚é‚Ü‚Å‚Ì
+ ŽžŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í2000(2•b)‚Å‚·B
+
+item_rate
+ ƒAƒCƒeƒ€ƒhƒƒbƒv—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+drop_rate0item
+ —Ž‰ºŠm—¦0‚̃AƒCƒeƒ€(ˆê•”ƒ‚ƒ“ƒXƒ^[‚É‚¨‚¯‚郊ƒ“ƒS)‚𗎉º‚·‚é‚©‚Ç‚¤‚©‚ÌÝ’è‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+base_exp_rate
+ BaseEXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+job_exp_rate
+ JobEXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+death_penalty_type
+ ƒfƒXƒyƒiƒ‹ƒeƒB‚̃^ƒCƒv‚ðŒˆ’è‚µ‚Ü‚·B
+ 0‚ÅŽ€‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚·‚鎞‚É“K—p‚ÅŽ‚Á‚Ä‚¢‚éEXP‚Ì—Ê‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—lA1‚ÅŽ€‚ñ‚¾’¼Œã‚É“K—p‚ÅŽ‚Á‚Ä‚¢‚éEXP‚Ì—Ê‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—l‚Å‚·B
+ 2‚ÅŽ€‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚·‚鎞‚É“K—p‚ÅŽŸ‚̃Œƒxƒ‹ƒAƒbƒv‚Ü‚Å‚ÌEXP‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—lA3‚ÅŽ€‚ñ‚¾’¼Œã‚É“K—p‚ÅŽŸ‚̃Œƒxƒ‹ƒAƒbƒv‚Ü‚Å‚ÌEXP‚©‚ç”ä—¦‚Ì•ª‚ðŒ¸‚ç‚·Žd—l‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+death_penalty_base
+ ƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éBASEŒoŒ±’lŒ¸­—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ ‚ ‚Ü‚è’á‚·‚¬‚é’l‚ðŽg‚¤‚ÆŒ¸‚è‚Ü‚¹‚ñB’PˆÊ‚Í0.01%‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+death_penalty_job
+ ƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éJOBŒoŒ±’lŒ¸­—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ ‚ ‚Ü‚è’á‚·‚¬‚é’l‚ðŽg‚¤‚ÆŒ¸‚è‚Ü‚¹‚ñB’PˆÊ‚Í0.01%‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+zeny_penalty
+ Ž€‚ñ‚¾Žž–³‚­‚È‚éƒ[ƒj—ʂ̔䗦‚Å‚·B’PˆÊ‚Í0.01%‚Å‚·BŽ€‚ñ‚¾Žž
+ Œ¸‚é‚킯‚Å‚Í‚È‚­Ž€‚ñ‚¾ŒãƒZ[ƒ”ƒ|ƒCƒ“ƒg‚ɖ߂鎞“K—p‚³‚ê‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+restart_hp_rate
+ ƒŠƒXƒ^[ƒg‚·‚鎞‚ɉñ•œ‚·‚éHP”ä—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B0‚Ìê‡1‰ñ•œ‚É‚È‚è‚Ü‚·B
+
+restart_sp_rate
+ ƒŠƒXƒ^[ƒg‚·‚鎞‚ɉñ•œ‚·‚éSP”ä—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B0‚Ìꇂ͉ñ•œ‚µ‚Ü‚¹‚ñB
+ ‚»‚µ‚ÄSP‚ª”ä—¦‚æ‚è‚‚¢ê‡‚à‰ñ•œ‚µ‚Ü‚¹‚ñB
+
+mvp_hp_rate
+ MVP ƒ‚ƒ“ƒXƒ^[‚ÌHP‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+mvp_item_rate
+ MVPƒAƒCƒeƒ€‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+mvp_exp_rate
+ MVP EXP‚ÌŠ“¾”{—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+monster_hp_rate
+ MVP ˆÈŠO‚̃‚ƒ“ƒXƒ^[‚ÌHP‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+monster_max_aspd
+ ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åUŒ‚‘¬“x‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í199‚Å‚·BÅ‘å‚Í199‚ÅŬ‚Í100‚Å‚·B
+
+atcommand_gm_only
+ —ƒRƒ}ƒ“ƒh‚ðGMê—p‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+gm_all_skill
+ ‘S‚ẴXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
+ ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚ÍJOB‚âƒXƒLƒ‹Š“¾ðŒ‚ÉŠÖŒW‚È‚­‘SƒXƒLƒ‹‚ªŠo‚¦‚ç‚ê‚Ü‚·B(ƒNƒFƒXƒgƒXƒLƒ‹‚àŠÜ‚ß‚Ä)
+ ƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B0‚ÌꇂÍGM‚Å‚Í‚È‚¢‘S‚ẴLƒƒƒ‰‚̈Ӗ¡‚Å‚Í‚È‚­‘S‚Ä‚ÌGM‚ª‘S‚ẴXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Å‚·B
+
+gm_all_equipment
+ ‘S‚Ä‚Ì‘•”õ•i‚ð‘•”õ‚Å‚«‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
+ ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚ÍJOB‚⃌ƒxƒ‹A«•Ê‚ÉŠÖŒW‚È‚­
+ ‘S‘•”õ•i‚ð‘•”õ‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B‚½‚¾‚µAƒNƒ‰ƒCƒAƒ“ƒg‘¤‚ŃGƒ‰[‚ð
+ ‹N‚±‚·‘g‚݇‚킹‚à‚ ‚é‚ÆŽv‚¢‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B
+ 0‚Ìꇂ͑S‚Ä‚ÌGM‚Í’ÊíƒvƒŒƒCƒ„[‚Æ“¯‚¶”»’肪s‚í‚ê‚Ü‚·B
+
+gm_skill_unconditional
+ –³ðŒ‚ɃXƒLƒ‹‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éGM‚̃Œƒxƒ‹‚ðݒ肵‚Ü‚·B
+ ‚±‚ê‚ð0ˆÈŠO‚É‚·‚é‚ÆA‚»‚ÌGMƒŒƒxƒ‹ˆÈã‚ÌGM‚Í‘•”õ•Ší‚âÁ”ïƒAƒCƒeƒ€‚Ì—L–³
+ ‚È‚Ç‚ÉŠÖŒW‚È‚­A‚»‚µ‚ĉ½‚àÁ”ï‚·‚邱‚Æ‚È‚­ƒXƒLƒ‹‚ðŽg—p‚Å‚«‚é‚悤‚É
+ ‚È‚è‚Ü‚·B”»’舗‚𖳎‹‚·‚é‚Ì‚Å“®ì‚É•s“s‡‚ª‚Å‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í 0 ‚Å‚·B 0‚Ìꇂ͑S‚Ä‚ÌGM‚Í’ÊíƒvƒŒƒCƒ„[‚Æ“¯‚¶”»’肪
+ s‚í‚ê‚Ü‚·B
+
+player_skillfree
+ ƒXƒLƒ‹ƒcƒŠ[‚ÉŠÖŒW‚È‚­ƒXƒLƒ‹‚ðã‚°‚邱‚Æ‚ª‚Å‚«‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚ê‚΃vƒŒƒCƒ„[‚ÌE‹Æ‚ÅK‚¤‚±‚Æ‚ª‚Å‚«‚éƒXƒLƒ‹‘S‚Ä‚ð
+ ƒXƒLƒ‹ƒcƒŠ[‚ÉŠÖŒW‚È‚­ã‚°‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+player_skillup_limit
+ ƒXƒLƒ‹ƒŠƒZƒbƒg“™‚ð‚µ‚½ŽžƒXƒLƒ‹‚ð§ŒÀ‚È‚µ‚Éã‚°‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚ê‚ÎŽn‚߂̃XƒLƒ‹ƒ|ƒCƒ“ƒg9‚‚̓m[ƒrƒX‚ÅK‚¤ƒXƒLƒ‹‚É‚µ‚©
+ Žg‚¦‚Ü‚¹‚ñB‚»‚µ‚Ä‚»‚ÌŒã‚Ì39‚Í1ŽŸE‹Æ‚ÅK‚¤•¨‚É‚¾‚¯Žg‚¦‚Ä‚»‚ÌŒã‚Ì
+ ƒ|ƒCƒ“ƒg‚ÍŽ©—R‚ÉŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+weapon_produce_rate
+ •Ší»‘¢ƒXƒLƒ‹‚Å‚Ì»‘¢¬Œ÷—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+potion_produce_rate
+ ƒ|[ƒVƒ‡ƒ“»‘¢ƒXƒLƒ‹‚Å‚Ì»‘¢¬Œ÷—¦‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+monster_active_enable
+ æUƒ‚ƒ“ƒXƒ^[‚ðæU‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚é‚Æ
+ æUƒ‚ƒ“ƒXƒ^[‚ª”ñæU‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+monster_damage_delay_rate
+ ƒ‚ƒ“ƒXƒ^[‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚½ŽžˆÚ“®‚Å‚«‚È‚¢ƒfƒBƒŒƒC‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ 200‚É‚·‚é‚ƃfƒBƒŒƒC‚ª”{‚É‚È‚èA0‚É‚·‚é‚ƃfƒBƒŒƒC‚ª‚È‚­‚È‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+monster_loot_type
+ ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚Ìs“®‚ÌŽd•û‚ðŽw’肵‚Ü‚·B
+ 0‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂĂà‚Ü‚½ƒAƒCƒeƒ€‚ðH‚ׂÄA
+ ‘O‚̃AƒCƒeƒ€‚ªÁ‚¦‚éŽd—lB1‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂé‚Æ
+ ‚à‚¤ƒAƒCƒeƒ€‚ðH‚ׂȂ­‚È‚éŽd—lBƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+mob_skill_use
+ MOB‚ªƒXƒLƒ‹‚ðŽg‚Á‚Ä‚­‚é‚©‚Ç‚¤‚©‚Å‚·BƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+mob_count_rate
+ map_athena.conf‚ÅŽw’肳‚ꂽnpcƒf[ƒ^‚ð“Ç‚Ýž‚ÞÛA
+ monster‚Å’è‹`‚³‚ꂽ”z’uMOB‚Ì”‚ð•S•ª—¦‚Å’²®‚µ‚Ü‚·B
+ —áŠO‚Æ‚µ‚ÄA”z’u”1‚Æ‚µ‚Ä’è‹`‚³‚ꂽMOB‚Ì”‚Í•Ï‚í‚è‚Ü‚¹‚ñB(BOSS‘Îô)
+ ‚Ü‚½A”z’u”‚ð‰º•ûC³‚µ‚½‚Æ‚«A1–¢–ž‚É‚È‚Á‚½ê‡‚Í1‚Æ‚µ‚Ĉ—‚µ‚Ü‚·B
+ 0-1000’ö“x‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+quest_skill_learn
+ ƒNƒFƒXƒgƒXƒLƒ‹‚ð•’Ê‚ÉK“¾‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚é‚ƃNƒFƒXƒgƒXƒLƒ‹‚ª•’Ê‚É•\Ž¦‚³‚ê‚ăXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽg‚Á‚ÄK“¾‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í no‚Å‚·B
+
+quest_skill_reset
+ ƒXƒLƒ‹‚ðƒŠƒZƒbƒg‚·‚鎞ƒNƒFƒXƒgƒXƒLƒ‹‚ðƒŠƒZƒbƒg‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+ no‚É‚µ‚Ä‚àquest_skill_learn‚ðyes‚É‚·‚ê‚΃ŠƒZƒbƒg‚³‚ê‚Ü‚·B
+
+basic_skill_check
+ À‚èAŒðŠ·Aƒp[ƒeƒBŒ‹¬Aƒ`ƒƒƒbƒgƒ‹[ƒ€ì‚è“™‚ÌŽžŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðno‚É‚·‚ê‚ÎÀ‚èAŒðŠ·“™‚ÌŠî–{ƒXƒLƒ‹‚ª•K—v‚Ès“®‚ðŠî–{ƒXƒLƒ‹‚ÉŠÖŒW‚È‚­Žg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í yes‚Å‚·B
+
+guild_emperium_check
+ ƒMƒ‹ƒh‚ðì‚鎞ƒGƒ“ƒyƒŠƒEƒ€‚ðÁ”ï‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚ê‚Î
+ ƒGƒ“ƒyƒŠƒEƒ€‚È‚µ‚Å‚àƒMƒ‹ƒh‚ªì‚ê‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í yes‚Å‚·B
+
+guild_exp_limit
+ ƒMƒ‹ƒh‚Ì–ðE‚ÉÝ’è‚Å‚«‚éã”[ŒoŒ±’l‚ÌŠ„‡‚ÌãŒÀ‚ðÝ’è‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í50(%)‚Å‚·B
+
+player_invincible_time
+ ƒ}ƒbƒvˆÚ“®‚âƒeƒŒƒ|[ƒgA•œŠˆ‚µ‚½Žž‚Ì–³“GŽžŠÔ‚ðݒ肵‚Ü‚·B’PˆÍ‚Í
+ ms(ƒ~ƒŠ•b)BˆÚ“®AUŒ‚s“®AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚ð‚·‚é‚Æ‚±‚Ì
+ ŽžŠÔ‚Í‚È‚­‚È‚éB(ƒV[ƒYƒ‚[ƒh‚Å‚ÍŽžŠÔ‚ð2”{‚É‚µ‚Ä“K—p)
+ ƒfƒtƒHƒ‹ƒg‚Í5000(5•b)‚Å‚·B
+
+pet_catch_rate
+ ƒyƒbƒg‚̕ߊl”{—¦‚ð•S•ª—¦‚Åݒ肵‚Ü‚·B
+ 0-1000’ö“x‚Ì”’l‚ðŽw’肵‚Ä‚­‚¾‚³‚¢BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+pet_rename
+ ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+ yes‚͉½“x‚Å‚à–¼‘O‚Ì•ÏX‚ª‰Â”\Bno‚͈ê“x•ÏX‚·‚é‚Æ‚à‚¤•ÏX•s‰Â”\‚É‚È‚éB
+
+pet_friendly_rate
+ ƒyƒbƒg‚ɉa‚ð‚ ‚°‚½Žžã‚ª‚ée–§“x‚Ì”{—¦‚Å‚·B
+ e–§“x‚ªŒ¸‚éꇂ͓K—p‚³‚ê‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+pet_hungry_delay_rate
+ ƒyƒbƒg‚Ì• ‚ªŒ¸‚鎞ŠÔ‚Ì”{—¦‚Å‚·B
+ ”{—¦‚ª‚‚¢‚Æ• ‚ªŒ¸‚è“ï‚­‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+pet_hungry_friendly_decrease
+ ƒyƒbƒg‚Ì• ‚ªŠ®‘S‚ÉŒ¸‚Á‚½ŽžŒ¸‚ée–§“x‚Ì—Ê‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í5‚Å‚·B
+
+pet_str
+ ƒyƒbƒg‚ÌATKŒvŽZ‚ÉSTR‚ð“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+pet_status_support
+ ƒyƒbƒg‚É‚æ‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ð“K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚é‚Æ
+ ƒyƒbƒg‚ðŽ‚Á‚Ă鎞ƒyƒbƒg–ˆ‚Éݒ肳‚ê‚Ä‚¢‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ª
+ •t‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+pet_attack_support
+pet_damage_support
+ Žål‚ªƒ‚ƒ“ƒXƒ^[‚Ƀ_ƒ[ƒW‚ð—^‚¦‚½‚Æ‚«AŽó‚¯‚½‚Æ‚«‚É
+ ƒyƒbƒg‚ªŽx‰‡UŒ‚‚ð‚·‚é‚©‚Ç‚¤‚©‚Å‚·Byes‚É‚·‚é‚ƃyƒbƒg‚Ìe–§“x‚ª
+ ‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚¾‚¯Žx‰‡UŒ‚‚ð‚µ‚Ä‚­‚ê‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+pet_support_rate
+ ƒyƒbƒg‚ÌŽx‰‡UŒ‚Šm—¦‚Ì”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚Å‚·)
+ ”{—¦‚ª‚‚¢‚ÆŽx‰‡UŒ‚‚æ‚­‚µ‚Ä‚­‚ê‚é‚悤‚É‚È‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+pet_attack_exp_to_master
+ ƒyƒbƒg‚ª—^‚¦‚½ƒ_ƒ[ƒW‚Ì•ª‚ÌŒoŒ±’l‚ðŽål‚ªŽû“¾‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚é‚ƃyƒbƒg‚ÌUŒ‚‚É‚æ‚éƒ_ƒ[ƒW‚àŽål‚ª—^‚¦‚½•¨‚É‚È‚è
+ Žål‚ªŒoŒ±’l‚ðŽû“¾‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+pet_attack_exp_rate
+ ƒyƒbƒg‚ª—^‚¦‚½ƒ_ƒ[ƒW‚Ì•ª‚ÌŒoŒ±’l‚ðŽål‚ªŽû“¾‚·‚鎞‚Ì”{—¦‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+pet_lootitem
+ ƒyƒbƒg‚ªƒAƒCƒeƒ€‚ðƒ‹[ƒg‚·‚é‚©‚Ç‚¤‚©‚ÌÝ’è‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+pet_weight
+ ƒyƒbƒg‚Ƀ‹[ƒg‚³‚¹‚é‚Æ‚«‚Ìd—ʧŒÀ‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í1000‚Å‚·B
+
+skill_min_damage
+ ƒXƒLƒ‹‚ðŽg‚Á‚½Žžƒ_ƒ[ƒW‚ª˜A‘Å”‚æ‚è–¢–ž‚ÌꇑS‚ă~ƒX‚É‚È‚é‚©1ƒ_ƒ[ƒW‚É‚È‚é‚©‚ðŒˆ’è‚µ‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+finger_offensive_type
+ ƒXƒLƒ‹Žw’e‚Ì•\Ž¦ƒ^ƒCƒv‚ðŒˆ’è‚µ‚Ü‚·B
+ 0‚Í–{ƒT[ƒo[Žd—l‚Å1‚̓AƒeƒiŽd—l‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+heal_exp
+ ƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg‚Á‚½Û‚É‚à‚炦‚éƒWƒ‡ƒuŒoŒ±’l—Ê‚ÌÝ’è‚Å‚·B
+ 100‚ʼnñ•œ‚µ‚½—Ê‚Æ“¯—Ê‚É‚È‚è‚Ü‚·B
+ ƒ‚ƒ“ƒXƒ^[‚ÌŒoŒ±’l‚ð•ÏX‚µ‚Ä‚È‚¢ê‡‚Í5`10’ö“x‚ª“K“–‚¾‚ÆŽv‚í‚ê‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+resurrection_exp
+ ƒXƒLƒ‹uƒŠƒUƒŒƒNƒVƒ‡ƒ“v‚ðŽg‚Á‚½Û‚É‚à‚炦‚éŒoŒ±’l—Ê‚ÌÝ’è‚Å‚·B
+ ’PˆÊ‚Í0.01%‚Å‚·B•œŠˆ‚µ‚½ƒvƒŒƒCƒ„[‚ªŽ‚Á‚Ä‚¢‚éŒoŒ±’l * ƒŒƒxƒ‹·/100 * resurrection_exp/10000 •ª‚ÌŒoŒ±‚ª–Ⴆ‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+shop_exp
+ ƒXƒLƒ‹ƒfƒBƒXƒJƒEƒ“ƒg‚ƃI[ƒo[ƒ`ƒƒ[ƒW‚ðK“¾‚µ‚Ä‚éê‡NPC—˜—p‹àŠz‚ɉž‚¶‚½JOBŒoŒ±’lŠl“¾”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚É‚È‚è‚Ü‚·j
+ ŒvŽZŽ®‚Íln(‘ã‹à*ƒXƒLƒ‹ƒŒƒxƒ‹) * shop_exp / 100 ‚Å”ƒ‚¤ê‡‚̓fƒBƒXƒJƒEƒ“ƒg‚ª‚ ‚鎞‚Ì‚Ý“K—p‚Å”„‚éꇃI[ƒo[ƒ`ƒƒ[ƒW‚ª‚ ‚鎞‚Ì‚Ý“K—p‚³‚ê‚Ü‚·B
+ ŒvŽZŽ®‚Í“K“x‚Éì‚Á‚½•¨‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+combo_delay_rate
+ ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC‚ÌŽžŠÔ‚Ì”{—¦‚Å‚·Bi100‚Å’ÊíA200‚Å”{‚É‚È‚è‚Ü‚·Bj
+ ‚½‚¾’ˆÓ‚·‚é‚ׂ«‚È‚Ì‚Í‚‚­Ý’è‚·‚é‚Ì‚ª‚¢‚¢‚±‚Æ‚Å‚Í‚È‚¢‚±‚Æ‚Å‚·B
+ ƒRƒ“ƒ{ƒfƒBƒŒƒC‚ª’·‚¢‚ƃRƒ“ƒ{‚ÌŒq‚¬‚Í‚æ‚­‚È‚è‚Ü‚·‚ª‚»‚Ì’·‚­‚È‚Á‚½
+ ŽžŠÔ‚ÌŠÔ‚Ís“®‚Å‚«‚È‚¢‚©‚ç‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+item_check
+ ƒAƒCƒeƒ€‚̃`ƒFƒbƒN‚ðs‚¤‚©‚Ç‚¤‚©‚Å‚·B
+ ƒƒOƒCƒ“Žž‚ƃ}ƒbƒvˆÚ“®Žž‚ÉŠŽƒAƒCƒeƒ€‚É•s³ƒAƒCƒeƒ€‚ª‚È‚¢‚©ƒ`ƒFƒbƒN‚µ‚Ü‚·B
+ ‚Ü‚½@item‚Å•s³ƒAƒCƒeƒ€‚ðŠ“¾‚Å‚«‚È‚­‚µ‚Ü‚·B
+ ƒfƒoƒO‚âƒAƒCƒeƒ€‚ÌŠm”F‚ðs‚¤‚Æ‚«‚È‚Ç‚Íoff‚É‚µ‚Ä‚­‚¾‚³‚¢B
+ ƒfƒtƒHƒ‹ƒg‚Íon‚Å‚·B
+
+wedding_modifydisplay
+ ƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ Œ‹¥ƒLƒƒƒ‰‚ð•\Ž¦‚µ‚½‚¢ê‡‚Í‚±‚ê‚ðyes‚É‚µ‚Ä‚­‚¾‚³‚¢B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+natural_healhp_interval
+ HP‚ªŽ©“®‰ñ•œ‚·‚é‚Ü‚ÅŠ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í6000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+
+natural_healsp_interval
+ SP‚ªŽ©“®‰ñ•œ‚·‚é‚Ü‚ÅŠ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í8000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+
+natural_heal_skill_interval
+ ƒXƒLƒ‹‚É‚æ‚Á‚ÄŽ©“®‰ñ•œ‚·‚éꇊ|‚©‚鎞ŠÔ‚Å‚·B’PˆÊ‚Íms(ƒ~ƒŠ•b)‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í10000‚ÅNATURAL_HEAL_INTERVAL–¢–ž‚É‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+
+natural_heal_weight_rate
+ Ž©“®‰ñ•œ‚ª‚Å‚«‚È‚­‚È‚éd—Ê‚ðݒ肵‚Ü‚·B’PˆÊ‚Í%‚Å‚·B
+ Ŭ‚Í50‚ÅÅ‘å‚Í101‚Å‚·Bő傪101‚È‚Ì‚Íd—Ê‚ª
+ natural_heal_weight_rate–¢–ž‚ÌŽž‚ÉŽ©“®‰ñ•œ‚·‚é‚©‚ç‚Å‚·B(‚‚܂è101‚È‚ç
+ ‚¢‚Â‚Å‚àŽ©“®‰ñ•œ‚Å‚«‚Ü‚·B)
+ ƒfƒtƒHƒ‹ƒg‚Í50‚Å‚·B
+
+item_name_override_grffile
+ ƒAƒCƒeƒ€‚Ì–¼‘O(‰pŒêˆÈŠO‚Ì–¼‘O‚Å‚·B)‚ð.grfƒtƒ@ƒCƒ‹‚©‚ç“Ç‚Þ‚©‚Ç‚¤‚©‚Å‚·B
+ no‚É‚·‚é‚Æitem_db.txt‚Ì–¼‘O‚ðŽg‚¢‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+arrow_decrement
+ ‹|‚ðŽg‚¤Žž–î‚ðÁ–Õ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðno‚É‚·‚é‚Æ
+ –Á–Õ‚³‚ê‚Ü‚¹‚ñB(–î‚ð‘•”õ‚·‚é•K—v‚Í‚ ‚è‚Ü‚·B)
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+max_aspd
+ ƒvƒŒƒCƒ„[‚ÌÅ‘åUŒ‚‘¬“x‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í199‚Å‚·BÅ‘å‚Í199‚ÅŬ‚Í100‚Å‚·B
+
+max_hp
+ Å‘åHP‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í32500‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
+
+max_sp
+ Å‘åSP‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í32500‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
+
+max_parameter
+ ƒvƒŒƒCƒ„[‚ÌŠî–{ƒpƒ‰ƒ[ƒ^‚ÌÅ‘å’l‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í99‚Å‚·BÅ‘å‚Í10000‚ÅŬ‚Í10‚Å‚·B
+ Šî–{ƒpƒ‰ƒ[ƒ^‘å‚«‚¢‰ß‚¬‚é‚ƃNƒ‰ƒCƒAƒ“ƒg—Ž‚¿‚ª‹N‚±‚é‚Ì‚Å
+ “K“–‚È’l‚ðÝ’è‚·‚é•û‚ª—Ç‚¢‚Å‚·B
+
+max_cart_weight
+ ƒJ[ƒg‚ÌÅ‘åd—Ê‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í8000‚Å‚·BÅ‘å‚Í1000000‚ÅŬ‚Í100‚Å‚·B
+
+player_skill_log
+ ƒvƒŒƒCƒ„[‚̃XƒLƒ‹Žg—pƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+monster_skill_log
+ ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹Žg—pƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+battle_log
+ 퓬ŠÖŒW‚̃ƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+save_log
+ ƒLƒƒƒ‰‚Ì•Û‘¶‚ÉŠÖ‚·‚郃O‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+error_log
+ ƒGƒ‰[ƒƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+etc_log
+ ƒXƒLƒ‹A퓬AƒLƒƒƒ‰•Û‘¶AƒGƒ‰[ˆÈŠO‚̃ƒO‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+save_clothcolor
+ •ž‚ÌF‚ð•Û‘¶‚·‚é‚©‚Ç‚¤‚©A—LŒø‚É‚·‚é‚Æ–â‘肪‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+undead_detect_type
+ ƒAƒ“ƒfƒbƒh‚ð”FŽ¯‚·‚é•û–@‚ðݒ肵‚Ü‚·B0‚Å‘®«‚Ì‚ÝA1‚ÅŽí‘°‚Ì‚ÝA
+ 2‚Å‘®«‚ÆŽí‘°‚Ì—¼•û‚Ì‚Ç‚¿‚ç‚Å‚à‚ ‚Á‚Ä‚éꇂɂȂè‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+player_auto_counter_type
+ ƒvƒŒƒCƒ„[‚̃I[ƒgƒJƒEƒ“ƒ^[‚ÌŽd—l‚ðݒ肵‚Ü‚·B0‚Å100%ƒNƒŠƒeƒBƒJƒ‹
+ ‚ŃXƒLƒ‹”½Œ‚–³‚µA1‚Å–hŒä–³Ž‹AHit+20AƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚
+ –³‚µA2‚Å100%ƒNƒŠƒeƒBƒJƒ‹‚ŃXƒLƒ‹”½Œ‚—L‚èA3‚Å–hŒä–³Ž‹AHit+20A
+ ƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚—L‚è‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í1‚Å‚·B
+
+monster_auto_counter_type
+ ƒ‚ƒ“ƒXƒ^[‚̃I[ƒgƒJƒEƒ“ƒ^[‚ÌŽd—l‚ðݒ肵‚Ü‚·B0‚Å100%ƒNƒŠƒeƒBƒJƒ‹
+ ‚ŃXƒLƒ‹”½Œ‚–³‚µA1‚Å–hŒä–³Ž‹AHit+20AƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚
+ –³‚µA2‚Å100%ƒNƒŠƒeƒBƒJƒ‹‚ŃXƒLƒ‹”½Œ‚—L‚èA3‚Å–hŒä–³Ž‹AHit+20A
+ ƒNƒŠƒeƒBƒJƒ‹—¦2”{‚ŃXƒLƒ‹”½Œ‚—L‚è‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í1‚Å‚·B
+
+agi_penaly_type
+ agi_penaly_countˆÈã‚Ì“G‚ÉUŒ‚‚³‚ꂽŽž‚Ìagiƒyƒiƒ‹ƒeƒB‚ÌŽd—l‚ðݒ肵‚Ü‚·B
+ 0‚Å‚È‚µA1‚Åagi_penaly_num%‚¸‚ÂŒ¸‚Á‚ÄA2‚Åagi_penaly_num‚¾‚¯Œ¸‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+agi_penaly_count
+ agiƒyƒiƒ‹ƒeƒB‚ð“K—p‚·‚é“G‚Ì”‚ðݒ肵‚Ü‚·B
+ 2–¢–ž‚ÉÝ’è‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í3‚Å‚·B
+
+agi_penaly_num
+ agiƒyƒiƒ‹ƒeƒB‚É‚æ‚Á‚ÄŒ¸‚é‰ñ”ð‚Ì—Ê‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+vit_penaly_type
+ vit_penaly_countˆÈã‚Ì“G‚ÉUŒ‚‚³‚ꂽŽž‚Ìvitƒyƒiƒ‹ƒeƒB‚ÌŽd—l‚ðݒ肵‚Ü‚·B
+ 0‚Å‚È‚µA1‚Åvit_penaly_num%‚¸‚ÂŒ¸‚Á‚ÄA2‚Åvit_penaly_num‚¾‚¯Œ¸‚è‚Ü‚·B
+ (Œ¸‚é‚Ì‚Ívit‚É‚æ‚é–hŒä‚Ì‚Ý)
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+vit_penaly_count
+ vitƒyƒiƒ‹ƒeƒB‚ð“K—p‚·‚é“G‚Ì”‚ðݒ肵‚Ü‚·B
+ 2–¢–ž‚ÉÝ’è‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñBƒfƒtƒHƒ‹ƒg‚Í3‚Å‚·B
+
+vit_penaly_num
+ vitƒyƒiƒ‹ƒeƒB‚É‚æ‚Á‚ÄŒ¸‚é‰ñ”ð‚Ì—Ê‚ðݒ肵‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+player_defense_type
+ ƒvƒŒƒCƒ„[‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
+
+monster_defense_type
+ ƒ‚ƒ“ƒXƒ^[‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
+
+pet_defense_type
+ ƒyƒbƒg‚ª‘ÎÛ‚ÉUŒ‚‚·‚鎞‚ÌDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(DEF*’l)B
+
+magic_defense_type
+ MDEF‚ÌŒvŽZ•û–@B0‚Å–{ŽIŽd—lA1ˆÈã‚ÅŒ¸ŽZ(MDEF*’l)
+
+player_skill_reiteration
+ ƒvƒŒƒCƒ„[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹–‰Â‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚é‚ÆSW‚âƒjƒ…[ƒ}Aƒgƒ‰ƒbƒv‚ðd‚Ë‚Ä’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+monster_skill_reiteration
+ ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹–‰Â‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ‚±‚ê‚ðyes‚É‚·‚é‚ÆSW‚âƒjƒ…[ƒ}Aƒgƒ‰ƒbƒv‚ðd‚Ë‚Ä’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+player_skill_nofootset
+ ƒvƒŒƒCƒ„[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚ðƒvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚Ì‘«Œ³‚É
+ ’u‚­‚Ì‚ð‹ÖŽ~‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƃXƒLƒ‹‚ðÝ’u‚·‚鎞‚»‚Ì
+ Œø‰Ê”͈͂ɃvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚ª‚¢‚é‚ƃXƒLƒ‹‚ð’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+monster_skill_nofootset
+ ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤ˆê•”‚Ì’n–ʃXƒLƒ‹‚ðƒvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚Ì‘«Œ³‚É
+ ’u‚­‚Ì‚ð‹ÖŽ~‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚ƃXƒLƒ‹‚ðÝ’u‚·‚鎞‚»‚Ì
+ Œø‰Ê”͈͂ɃvƒŒƒCƒ„[‚⃂ƒ“ƒXƒ^[‚ª‚¢‚é‚ƃXƒLƒ‹‚ð’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+player_cloak_check_type
+ ƒvƒŒƒCƒ„[ƒNƒ[ƒLƒ“ƒO‚ÌŽd—l‚ðݒ肵‚Ü‚·B
+ 0‚͕ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
+ 1‚͕ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
+ 2‚͕͂ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
+ 2‚͕͂ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+monster_cloak_check_type
+ ƒ‚ƒ“ƒXƒ^[ƒNƒ[ƒLƒ“ƒO‚ÌŽd—l‚ðݒ肵‚Ü‚·B
+ 0‚͕ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
+ 1‚͕ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚éB
+ 2‚͕͂ǃ`ƒFƒbƒN—L‚èAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
+ 2‚͕͂ǃ`ƒFƒbƒN–³‚µAƒXƒLƒ‹Žg—p‚ÆUŒ‚‚ʼn𜂳‚ê‚È‚¢B
+ ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B
+
+gvg_short_attack_damage_rate
+ ƒV[ƒYƒ‚[ƒh‚Å‹ß‹——£•¨—UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+gvg_long_attack_damage_rate
+ ƒV[ƒYƒ‚[ƒh‚ʼn“‹——£•¨—UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+gvg_magic_attack_damage_rate
+ ƒV[ƒYƒ‚[ƒh‚Å–‚–@UŒ‚‚̃_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+gvg_misc_attack_damage_rate
+ ƒV[ƒYƒ‚[ƒh‚Å•¨—UŒ‚‚Æ–‚–@UŒ‚ˆÈŠO‚ÌUŒ‚(‘é‚âƒgƒ‰ƒbƒv“™)‚Ì
+ ƒ_ƒ[ƒW”{—¦‚Å‚·BƒfƒtƒHƒ‹ƒg‚Í100‚Å‚·B
+
+mob_changetarget_byskill: no
+ ðŒ‚ªskillused‚̃XƒLƒ‹‚ðMOB‚ªPC‚ÉŽg—p‚·‚é‚Æ‚«A‚»‚Ì‘ÎÛ‚ðƒXƒLƒ‹Žg—pŽÒ‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ MOBƒXƒLƒ‹Žg—pŒã‚Ƀ^ƒQ‚Í–ß‚è‚Ü‚·BƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+player_attack_direction_change
+ ƒvƒŒƒCƒ„[‚ªUŒ‚‚µ‚½Žž•ûŒü‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚Å‚·B–{ŽI‚Å‚Í“®‚¯‚È‚¢ŒÀ‚è•ûŒü‚ª•Ï‚¦‚ç‚È‚¢‚Ì‚Å‚·‚ªƒoƒO‚Û‚¢Žd—l‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+ no‚É‚·‚ê‚Γ®‚­‚±‚Æ‚¾‚¯‚Å•ûŒü‚ª•Ï‚¦‚é‚悤‚É‚È‚è‚Ü‚·B
+
+monster_attack_direction_change
+ ƒ‚ƒ“ƒXƒ^[‚ªUŒ‚‚µ‚½Žž•ûŒü‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚Å‚·B–{ŽI‚Å‚Í“®‚¯‚È‚¢ŒÀ‚è•ûŒü‚ª•Ï‚¦‚ç‚È‚¢‚Ì‚Å‚·‚ªƒoƒO‚Û‚¢Žd—l‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+ no‚É‚·‚ê‚Γ®‚­‚±‚Æ‚¾‚¯‚Å•ûŒü‚ª•Ï‚¦‚é‚悤‚É‚È‚è‚Ü‚·B
+
+player_land_skill_limit
+ skill_db.txt‚Åݒ肳‚ê‚Ä‚¢‚é’n–ʃXƒLƒ‹‚Ì”§ŒÀ‚ðƒvƒŒƒCƒ„[‚É
+ “K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚ê‚Îݒ肳‚ê‚Ä‚¢‚锈Èã‚Í
+ ’n–Ê‚ÉÝ’u‚·‚邱‚Æ‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚·‚ª”§ŒÀ‚ð‚Ç‚¤•Ï‚¦‚Ä‚à
+ MAX_SKILLUNITGROUP‚ð‰z‚¦‚锂ÌÝ’u‚Í‚Å‚«‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+monster_land_skill_limit
+ skill_db.txt‚Åݒ肳‚ê‚Ä‚¢‚é’n–ʃXƒLƒ‹‚Ì”§ŒÀ‚ðƒ‚ƒ“ƒXƒ^[‚É
+ “K—p‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚ê‚Îݒ肳‚ê‚Ä‚¢‚锈Èã‚Í
+ ’n–Ê‚ÉÝ’u‚·‚邱‚Æ‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚·‚ª”§ŒÀ‚ð‚Ç‚¤•Ï‚¦‚Ä‚à
+ MAX_MOBSKILLUNITGROUP‚ð‰z‚¦‚锂ÌÝ’u‚Í‚Å‚«‚Ü‚¹‚ñB
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+party_skill_penaly
+ ˆê•”‚̃p[ƒeƒBƒXƒLƒ‹‚ðŽg—pŽÒ‚ƃp[ƒeƒB‚ŃXƒLƒ‹Œø‰Ê‚ªˆá‚¤‚悤‚É
+ ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B‚±‚ê‚̉e‹¿‚ðŽó‚¯‚éƒXƒLƒ‹‚Í¡‚ÌŠ
+ ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“AƒI[ƒo[ƒgƒ‰ƒXƒg‚Ì‚Ý‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+monster_class_change_full_recover
+ ƒ‚ƒ“ƒXƒ^[‚ªƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚ƃgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ““™‚É‚æ‚Á‚Ä
+ ‘¼‚̃‚ƒ“ƒXƒ^[‚É•Ï‚í‚Á‚½Žž‚»‚̃‚ƒ“ƒXƒ^[‚ÌHP‚ðÅ‘å‚Ȃʼnñ•œ‚³‚¹‚é‚©
+ ‚Ç‚¤‚©‚Å‚·B‚±‚ê‚ðyes‚É‚·‚é‚Æ•Ï‚í‚Á‚½ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åHP‚Ü‚Å
+ ‰ñ•œ‚µ‚Ü‚·Bno‚È‚ç•Ï‚í‚é‘O‚ÌHP‚ÆÅ‘åHP‚̔䗦‚Ì•ª‚ÌHP‚É‚È‚è‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+produce_item_name_input
+ »‘¢‚Åì‚ç‚ꂽ“S‚â‘®«Î‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+produce_potion_name_input
+ »‘¢‚Åì‚ç‚ꂽƒ|[ƒVƒ‡ƒ“‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+making_arrow_name_input
+ –î쬂Åì‚ç‚ꂽ–î‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+holywater_name_input
+ ƒAƒNƒAƒxƒlƒfƒBƒNƒ^‚Åì‚ç‚ꂽ¹…‚É»‘¢ŽÒ‚Ì–¼‘O‚ð•t‚¯‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+display_delay_skill_fail
+ ƒXƒLƒ‹Žg—p‚̃fƒBƒŒƒC’†‚ÉuƒXƒLƒ‹Žg—p‚ÌŒã‚ÍA‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢v‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·B
+
+chat_warpportal
+ ƒ`ƒƒƒbƒg’†‚ÌPC‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂¹‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+mob_warpportal
+ MOB‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂¹‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+dead_branch_active
+ ŒÃ–Ø‚ÌŽ}‚È‚Çmonster–½—ß‚Åmobid‚𕉔‚ÉŽw’肵‚½ê‡‚É¢Š«‚³‚ê‚郂ƒ“ƒXƒ^[‚ðƒAƒNƒeƒBƒu‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+vending_max_value
+ ˜I“X‚Å’u‚¯‚éƒAƒCƒeƒ€‰¿Ši‚ÌÅ‚’l‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Í10000000‚Å‚·B
+
+show_steal_in_same_party
+ ƒXƒeƒB[ƒ‹¬Œ÷ŽžA‰æ–Ê“à‚ÌPTƒƒ“ƒo[(Ž©•ªŠÜ‚Þ)‚É
+ ƒXƒeƒB[ƒ‹‚µ‚½ƒAƒCƒeƒ€‚Ìî•ñ‚ðŒöŠJ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+enable_upper_class
+ “]¶A—{ŽqE‚ð—LŒø‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+pet_atack_attr_none
+ ƒyƒbƒg‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
+ ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
+
+pc_atack_attr_none
+ ƒvƒŒƒCƒ„[‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
+ ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
+
+mob_atack_attr_none
+ ƒ‚ƒ“ƒXƒ^[‚É‚æ‚é–³‘®«’ÊíUŒ‚‚ð
+ ‘®«–³‚µ(‘®«‚É‚æ‚é•â³–³‚µ)‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes‚Å‚·
+
+player_skill_partner_check
+ ¹‘Ì~•Ÿ‚⇑tƒXƒLƒ‹‚ðs‚¤Û‚Ƀp[ƒgƒi[‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íyes(ƒ`ƒFƒbƒN‚·‚é)‚Å‚·B
+
+hide_GM_session
+ GMƒAƒJƒEƒ“ƒg‚̃Lƒƒƒ‰ƒNƒ^[‚ð@ƒRƒ}ƒ“ƒh“™‚Å•\Ž¦‚Ì‘ÎÛ‚É‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·
+unit_movement_type
+ ƒ†ƒjƒbƒgˆÚ“®ˆ—•û–@‚ð‘I‘ð‚µ‚Ü‚·B
+ 0‚Å–{ŽIŽd—l(‰ñü•‰‰×¨dAŽIˆ—¨Œy)A1‚ÅAthenaŽd—l(‰ñü•‰‰×¨ŒyAŽIˆ—¨d)
+ ƒfƒtƒHƒ‹ƒg‚Í0(–{ŽIŽd—l)‚Å‚·
+invite_request_check
+ ƒvƒŒƒCƒ„[‚ªŠeŽí—v¿’†(PT‰Á“üAGuild‰Á“üAŽæˆø)‚É‘¼‚Ì—v¿‚ðŽó‚¯“ü‚ê‚é‚©‚Ç‚¤‚©‚Å‚·B
+ yes‚Å–{ŽIŽd—lAno‚ÅAthenaŽd—l(Žó‚¯“ü‚ê‚È‚¢)
+ ƒfƒtƒHƒ‹ƒg‚Íyes(Žó‚¯“ü‚ê‚é)‚Å‚·B
+skill_removetrap_type
+ ƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ÌŽd—l‚ð‘I‘ð‚µ‚Ü‚·B
+ 0:–{ŽIŽd—l‚Åã©1ŒÂ‚ðŽæ“¾‚·‚é
+ 1:AthenaŽd—l‚ÅŽg‚Á‚½ƒAƒCƒeƒ€‚ðŽg‚Á‚½ŒÂ”‚ðŽæ“¾‚·‚é
+disp_experience
+ ŒoŒ±’l‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Å‚·B
+ yes‚É‚·‚é‚ÆA“G‚ð“|‚µ‚½Žž‚È‚ÇŒoŒ±’l‚ª“ü‚Á‚½Žž‚É–{l‚É‚Ì‚Ý•\Ž¦‚³‚ê‚Ü‚·B
+ ƒfƒtƒHƒ‹ƒg‚Íno‚Å‚·B
+
+night_at_start
+ Choose if server begin with night (yes) or day (no)
+ Default: No
+
+day_duration
+ Define duration in msec of the day.
+ Set to 0 to disable day cycle (but not @day command).
+ Except 0, minimum is 60000 (1 minute).
+ Default: 7,200,000 = 2 hours
+
+night_duration
+ Define duration in msec of the night.
+ Set to 0 to disable night cycle (but not @night command).
+ Except 0, minimum is 60000 (1 minute).
+ Default: 1,800,000 = 30 min
+
+ban_spoof_namer
+ Ban people that try to use an other name of its name (spoof name).
+ Duration of the ban, in minutes.
+ Value from 0 to 32767. Set to 0 to do no ban.
+ Default: 5 (minutes)
+
+hack_info_GM_level
+ Set here minimum level of a (online) GM that can receive all informations about any player that try to hack, spoof a name, etc.
+ Values are from 0 to 100.
+ 100: disable information
+ 0: send to any people, including normal players
+ default: 60, according to GM definition in atcommand_athena.conf
+
+any_warp_GM_min_level
+ Set here the minimum GM level to disable the nowarp (from) and nowarpto (to) flags.
+ This option is mainly used in AT_commands (@memo, @warp, @charwarp, @go, etc...). All GM commands used to move or set a new map check nowarp and nowarpto flags.
+ default: 20 (first level after normal player or super'normal' player)
+
+packet_ver_flag
+ Set here which client version do you accept. Add all values of clients:
+ 1: Clients before 2004-07-06 (old clients)
+ 2: 2004-07-06 kRO client
+ 4: 2004-07-13 kRO client
+ 8: 2004-07-26 kRO client
+ 16: 2004-08-09 kRO / 2004-08-16aSakray / 2004-08-17aSakray client
+ 32: 2004-09-06aSakray client
+ default value: 63 (all clients)
+
+import
+ ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
+
+< Example >
+
+warp_point_debug: no
+enemy_critical: yes
+enemy_critical_rate: 100
+enemy_perfect_flee: no
+casting_rate: 100
+delay_rate: 100
+delay_dependon_dex: no
+skill_delay_attack_enable: no
+left_cardfix_to_right: no
+player_skill_add_range: 0
+skill_out_range_consume: yes
+monster_skill_add_range: 0
+player_damage_delay: yes
+player_damage_delay_rate: 100
+defunit_not_enemy: yes
+random_monster_checklv: yes
+attribute_recover: yes
+item_auto_get: no
+flooritem_lifetime: 60000
+item_first_get_time: 10000
+item_second_get_time: 7000
+item_third_get_time: 5000
+mvp_item_first_get_time: 10000
+mvp_item_second_get_time: 10000
+mvp_item_third_get_time: 2000
+item_rate: 100
+drop_rate0item: no
+base_exp_rate: 100
+job_exp_rate: 100
+death_penalty_type: 0
+death_penalty_base: 100
+death_penalty_job: 100
+zeny_penalty: 0
+restart_hp_rate: 0
+restart_sp_rate: 0
+mvp_hp_rate: 100
+mvp_item_rate: 100
+mvp_exp_rate: 100
+monster_hp_rate: 100
+monster_max_aspd: 199
+atcommand_gm_only: Yes
+gm_all_skill: 0
+gm_all_equipment: 0
+gm_skill_unconditional: 0
+player_skillfree: no
+player_skillup_limit: no
+weapon_produce_rate: 100
+potion_produce_rate: 100
+monster_active_enable: yes
+monster_damage_delay_rate: 100
+monster_loot_type: 0
+mob_skill_use: yes
+mob_count_rate: 100
+quest_skill_learn: no
+quest_skill_reset: yes
+basic_skill_check: yes
+guild_emperium_check: yes
+player_invincible_time: 5000
+pet_catch_rate: 100
+pet_rename: no
+pet_friendly_rate: 100
+pet_hungry_delay_rate: 100
+pet_hungry_friendly_decrease: 5
+pet_str: yes
+pet_status_support: no
+pet_support: no
+pet_support_rate: 100
+pet_attack_exp_to_master: no
+pet_attack_exp_rate: no
+pet_lootitem: no
+pet_weight: 1000
+skill_min_damage: no
+finger_offensive_type: 0
+heal_exp: 0
+resurrection_exp: 0
+hop_exp: 0
+combo_delay_rate: 100
+item_check: on
+wedding_modifydisplay: no
+natural_healhp_interval:4000
+natural_healsp_interval:8000
+natural_heal_skill_interval:10000
+natural_heal_weight_rate: 50
+item_name_override_grffile: yes
+arrow_decrement: yes
+max_aspd: 199
+max_hp: 32500
+max_sp: 32500
+max_parameter: 99
+max_cart_weight: 8000
+player_skill_log: off
+monster_skill_log: off
+battle_log: off
+save_log: off
+error_log: on
+etc_log: on
+save_clothcolor: no
+undead_detect_type: 2
+player_auto_counter_type: 1
+monster_auto_counter_type: 0
+agi_penaly_type: 0
+agi_penaly_count: 3
+agi_penaly_num: 0
+vit_penaly_type: 0
+vit_penaly_count: 3
+vit_penaly_num: 0
+player_defense_type: 0
+monster_defense_type: 0
+pet_defense_type: 0
+magic_defense_type: 0
+player_skill_reiteration: no
+monster_skill_reiteration: no
+player_skill_nofootset: no
+monster_skill_nofootset: no
+player_cloak_check_type: 0
+monster_cloak_check_type: 0
+gvg_short_attack_damage_rate: 100
+gvg_long_attack_damage_rate: 100
+gvg_magic_attack_damage_rate: 100
+gvg_misc_attack_damage_rate: 100
+mob_changetarget_byskill: no
+player_attack_direction_change:yes
+monster_attack_direction_change:yes
+player_land_skill_limit: yes
+monster_land_skill_limit: yes
+party_skill_penaly: yes
+monster_class_change_full_recover: no
+produce_item_name_input: yes
+produce_potion_name_input: yes
+making_arrow_name_input: yes
+holywater_name_input: yes
+display_delay_skill_fail: yes
+chat_warpportal: no
+mob_warpportal: no
+dead_branch_active: no
+vending_max_value: 10000000
+show_steal_in_same_party: no
+enable_upper_class: no
+pet_atack_attr_none: no
+pc_atack_attr_none: no
+mob_atack_attr_none: yes
+player_skill_partner_check: yes
+hide_GM_session: no
+invite_request_check: yes
+unit_movement_type: 0
+disp_experience: no
+night_at_start: No
+day_duration: 7200000
+night_duration: 1800000
+ban_spoof_namer: 5
+hack_info_GM_level: 60
+any_warp_GM_min_level: 20
+packet_ver_flag: 63
+
+
+==========================================================================
+6. atcommand_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ GMƒRƒ}ƒ“ƒh(/mmA/nb“™)‚â@ƒRƒ}ƒ“ƒh‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚éGM‚̃Œƒxƒ‹‚ðÝ’è‚·‚镨‚Å‚·B
+ Ý’è‚Í‘S‚ÄÈ—ª‰Â”\‚ÅAÈ—ªŽž‚̓fƒtƒHƒ‹ƒg’l‚ª—˜—p‚³‚ê‚Ü‚·B(ƒfƒtƒHƒ‹ƒg‚Í0‚Å‚·B)
+
+command_symbol
+ Set here the symbol that you want to use for your commands
+ Only 1 character is get (default is '@'). You can set any character,
+ except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
+ With default character, all commands begin by a '@': <example> @revive
+ default: @
+
+Sets the level of the users that can use the GM commands.
+<command name>: level
+// When battle_athena.conf has atcommand_gm_only set to no,
+// normal players (gm level 0) can use GM commands if you set 0 to the command level.
+Max GM level is 99. If you want forbid a command to all people, set it with level 100.
+
+broadcast
+ GMƒRƒ}ƒ“ƒh /nbA/bA/bb
+local_broadcast
+ GMƒRƒ}ƒ“ƒh /lb
+mapmove
+ GMƒRƒ}ƒ“ƒh /mm
+resetstate
+ GMƒRƒ}ƒ“ƒh /resetstateA/resetskill
+rura+
+ @ƒRƒ}ƒ“ƒh @rura+
+rura
+ @ƒRƒ}ƒ“ƒh @rura
+where
+ @ƒRƒ}ƒ“ƒh @where
+jumpto
+ @ƒRƒ}ƒ“ƒh @jumpto
+jump
+ @ƒRƒ}ƒ“ƒh @jump
+who
+ @ƒRƒ}ƒ“ƒh @who
+save
+ @ƒRƒ}ƒ“ƒh @save
+load
+ @ƒRƒ}ƒ“ƒh @load
+speed
+ @ƒRƒ}ƒ“ƒh @speed
+storage
+ @ƒRƒ}ƒ“ƒh @storage
+gstorage
+ @ƒRƒ}ƒ“ƒh @gstorage
+option
+ @ƒRƒ}ƒ“ƒh @option
+hide
+ GMƒRƒ}ƒ“ƒh /hide‚Æ@ƒRƒ}ƒ“ƒh @hide
+jobchange
+ @ƒRƒ}ƒ“ƒh @jobchange
+die
+ @ƒRƒ}ƒ“ƒh @die
+kill
+ @ƒRƒ}ƒ“ƒh @kill
+alive
+ @ƒRƒ}ƒ“ƒh @alive
+kami
+ @ƒRƒ}ƒ“ƒh @kamiA@kamib
+heal
+ @ƒRƒ}ƒ“ƒh @heal
+item
+ @ƒRƒ}ƒ“ƒh @itemA@item2
+itemreset
+ @ƒRƒ}ƒ“ƒh @itemreset
+itemcheck
+ @ƒRƒ}ƒ“ƒh @itemcheck
+lvup
+ @ƒRƒ}ƒ“ƒh @lvup
+joblvup
+ @ƒRƒ}ƒ“ƒh @joblvup
+help
+ @ƒRƒ}ƒ“ƒh @helpA@h
+gm
+ To become GM (need password; password is set in login_athena.conf).
+ special!: only a non-GM (player with gm level 0) need to have this command.
+ if you change the value, be sure of what you do!
+ To be able to create a gm with @gm, you must:
+ - give a level to level_new_gm (parameter of login_athena.conf) (not 0)
+ - enable to level 0 the @gm command (atcommand_athena.conf) (default 100) - Only level 0 can give access to this command
+ - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
+ - and normal player must give correct password when he use the @gm command (gm_pass paramter in login_athena.conf)
+pvpoff
+ @ƒRƒ}ƒ“ƒh @pvpoff
+pvpon
+ @ƒRƒ}ƒ“ƒh @pvpon
+gvgoff
+ @ƒRƒ}ƒ“ƒh @gvgoff
+gvgon
+ @ƒRƒ}ƒ“ƒh @gvgon
+model
+ @ƒRƒ}ƒ“ƒh @model
+go
+ @ƒRƒ}ƒ“ƒh @go
+monster
+ @ƒRƒ}ƒ“ƒh @monster
+killmonster
+ @ƒRƒ}ƒ“ƒh @killmonsterA@killmonster2
+refine
+ @ƒRƒ}ƒ“ƒh @refine
+produce
+ @ƒRƒ}ƒ“ƒh @produce
+memo
+ @ƒRƒ}ƒ“ƒh @memo
+gat
+ @ƒRƒ}ƒ“ƒh @gat
+packet
+ @ƒRƒ}ƒ“ƒh @packet
+stpoint
+ @ƒRƒ}ƒ“ƒh @stpoint
+skpoint
+ @ƒRƒ}ƒ“ƒh @skpoint
+zeny
+ @ƒRƒ}ƒ“ƒh @zeny
+param
+ @ƒRƒ}ƒ“ƒh @strA@agiA@vitA@intA@dexA@luk
+guildlvup
+ @ƒRƒ}ƒ“ƒh @guildlvup
+makeegg
+ @ƒRƒ}ƒ“ƒh @makeegg
+petfriendly
+ @ƒRƒ}ƒ“ƒh @petfriendly
+pethungry
+ @ƒRƒ}ƒ“ƒh @pethungry
+petrename
+ @ƒRƒ}ƒ“ƒh @petrename
+recall
+ @ƒRƒ}ƒ“ƒh @recall
+charjob
+ @ƒRƒ}ƒ“ƒh @charjob
+revive
+ @ƒRƒ}ƒ“ƒh @revive
+charstats
+ @ƒRƒ}ƒ“ƒh @charstats
+charoption
+ @ƒRƒ}ƒ“ƒh @charoption
+charsave
+ @ƒRƒ}ƒ“ƒh @charsave
+charload
+ @ƒRƒ}ƒ“ƒh @charload
+night
+ @ƒRƒ}ƒ“ƒh @night
+day
+ @ƒRƒ}ƒ“ƒh @day
+doom
+ @ƒRƒ}ƒ“ƒh @doom
+doommap
+ @ƒRƒ}ƒ“ƒh @doommap
+raise
+ @ƒRƒ}ƒ“ƒh @raise
+raisemap
+ @ƒRƒ}ƒ“ƒh @raisemap
+charbaselvl
+ @ƒRƒ}ƒ“ƒh @charbaselvl
+charjlvl
+ @ƒRƒ}ƒ“ƒh @charjlvl
+kick
+ @ƒRƒ}ƒ“ƒh @kick‚ÆGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v
+allskill
+ @ƒRƒ}ƒ“ƒh @allskill
+questskill
+ @ƒRƒ}ƒ“ƒh @questskill
+lostskill
+ @ƒRƒ}ƒ“ƒh @lostskill
+spiritball
+ @ƒRƒ}ƒ“ƒh @spiritball
+party
+ @ƒRƒ}ƒ“ƒh @party
+guild
+ @ƒRƒ}ƒ“ƒh @guild
+agitstart
+ @ƒRƒ}ƒ“ƒh @agitstart
+agitend
+ @ƒRƒ}ƒ“ƒh @agitend
+mapexit
+ @ƒRƒ}ƒ“ƒh @mapexit
+idsearch
+ @ƒRƒ}ƒ“ƒh @idsearch
+charchangesex
+ Changes the sex of an online player (all characters on the account)
+ignorelist
+ Displays your ignore list
+charignorelist
+ Displays ignore list of a player
+inall
+ Allows all wispers for the player
+exall
+ Blocks all wispers for the player
+chardisguise
+ Changes disguise of a player
+charundisguise
+ Cancels disguise of a player
+email
+ To change your (own) email (characters protection)
+ note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
+ if you want be sure of each e-mail disable this option (value: 100)
+
+
+import
+ ‚»‚Ìs‚ð•Êƒtƒ@ƒCƒ‹‚Ì’†g‚Æ’u‚«Š·‚¦‚Ü‚·B
+
+
+< Example >
+command_symbol: @
+
+broadcast: 1
+local_broadcast: 1
+mapmove: 1
+resetstate: 1
+rura+: 1
+rura: 1
+where: 1
+jumpto: 1
+jump: 1
+who: 1
+save: 1
+load: 1
+speed: 1
+storage: 1
+gstorage: 1
+option: 1
+hide: 1
+jobchange: 1
+die: 1
+kill: 1
+alive: 1
+kami: 1
+heal: 1
+item: 1
+itemreset: 1
+itemcheck: 1
+lvup: 1
+joblvup: 1
+help: 1
+gm: 100
+pvpoff: 1
+pvpon: 1
+gvgoff: 1
+gvgon: 1
+model: 1
+go: 1
+monster: 1
+killmonster: 1
+refine: 1
+produce: 1
+memo: 1
+gat: 1
+packet: 1
+stpoint : 1
+skpoint : 1
+zeny: 1
+param: 1
+guildlvup: 1
+makeegg: 60
+petfriendly: 1
+pethungry: 1
+petrename: 1
+recall: 1
+charjob: 1
+revive: 1
+charstats: 1
+charoption: 1
+charsave: 1
+charload: 1
+night: 1
+day: 1
+doom: 1
+doommap: 1
+raise: 1
+raisemap: 1
+charbaselvl: 1
+charjlvl: 1
+kick: 1
+allskill: 1
+questskill: 1
+lostskill: 1
+spiritball: 1
+party: 1
+guild: 1
+agitstart: 1
+agitend: 1
+mapexit: 1
+idsearch: 1
+charchangesex: 1
+ignorelist: 0
+charignorelist: 20
+inall: 20
+exall: 20
+chardisguise: 60
+charundisguise: 60
+email: 0
+
+==========================================================================
+7. conf/ladmin_athena.conf
+--------------------------------------------------------------------------
+
+< What this file is. >
+
+ A setup of ladmin (remote administration of the login-server) is described.
+ It mainly becomes a setup of an administrator.
+ Only 'c' version of the ladmin is concerned by this configuration file.
+ 'Perl' ladmin doesn't use it.
+
+
+< Explanation of a key >
+
+If you change one of these parameters, you must restart ladmin to update.
+If you repeat one parameter in the configuration file, only the latest will be validated.
+
+login_ip
+ IP adress to contact login-server.
+ It is the IP adress of the login-server.
+ Default value: 127.0.0.1 (same computer).
+
+login_port
+ Port to contact login-server.
+ It is the port used by login-server.
+ Default value: 6900.
+
+admin_pass
+ It is the administrator password used to administrate the login-server.
+ You define it in login-athena.conf.
+ Void password will not work.
+ NOTICE: You must change this or attackers can exploit your server.
+ Default value: admin. CHANGES this default value to avoid hack.
+
+passenc:
+ You specify here how ladmin send password to login-server. 3 values are possible:
+ 0: plain text
+ 1: use md5 key (format: key + password)
+ 2: use md5 key (format: password + key) (default)
+ default: 2
+
+defaultlanguage
+ You can specified a language to display information and for logs.
+ There are 2 values:
+ F: Français
+ E: English (default)
+ If a displayed information isn't translated, English is used.
+ Default value: E
+
+ladmin_log_filename
+ Gives the log file name and path to stores logs information.
+ All operations done by the ladmin are written in this file with a time stamp.
+ Default value: log/ladmin.log
+
+date_format:
+ Indicate how to display date in logs, to players, etc.
+ 0: 31-12-2004 23:59:59
+ 1: 12-31-2004 23:59:59
+ 2: 2004-31-12 23:59:59
+ 3: 2004-12-31 23:59:59
+ Default value: 3
+
+import
+ Gives an other configuration file to include in.
+ You must write the additionnal configuration file name and path.
+ The mentionned file can include any parameter of the login configuration.
+ You can create a chain or configuration files if necessary.
+ Default value: <no_additional_configuration_file>.
+
+<Example>
+login_ip:127.0.0.1
+login_port: 6900
+admin_pass: admin
+passenc: 2
+defaultlanguage: E
+ladmin_log_filename: log/ladmin.log
+date_format: 3
+//import: path/additional_configuration_file
+
+
+==========================================================================
+EOF
+--------------------------------------------------------------------------
diff --git a/doc/coredump_report.txt b/doc/coredump_report.txt
index f556b0366..670472f9b 100644
--- a/doc/coredump_report.txt
+++ b/doc/coredump_report.txt
@@ -1,109 +1,109 @@
-==========================================================================
- ƒT[ƒo[‚ª‹­§I—¹‚·‚éꇂÌcoredump‚É‚æ‚éÚׂȃoƒO•ñ•û–@
---------------------------------------------------------------------------
-
-< ‚±‚̃tƒ@ƒCƒ‹‚͉½H >
-
- AthenaŽg—p’†‚Émap-server.exe‚È‚Ç‚ª“Ë‘R—Ž‚¿‚½ê‡‚ÉA—Ž‚¿‚½‚Æ‚«‚̃Xƒ^ƒbƒN‚Ì
- ƒoƒbƒNƒgƒŒ[ƒX‚ð‚ðŠJ”­ŽÒ‚É“`‚¦‚é•û–@‚ð‰ðà‚·‚éB
- ƒoƒO•ñ‚ÌŽž‚É•¹—p‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ô‚©‚à‚µ‚ê‚È‚¢B
-
- ‚±‚±‚Å‚Ìu—Ž‚¿‚év‚Í‚ ‚­‚܂ŃT[ƒo[‚Å‚ ‚èAƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Í‚È‚¢B
- ‚Ü‚½ƒvƒƒZƒX‚ªcorei‚Ü‚½‚Ístackdumpj‚ð“f‚­Œ»Û‚Ì‚±‚Æ‚Å‚ ‚èA
- –³ŒÀƒ‹[ƒv‚Ȃǂ̃vƒƒZƒX‚Ͷ‚«‚Ä‚¢‚邪ƒT[ƒo[‚Ì‹@”\‚Í’ñ‹Ÿ‚³‚ê‚È‚¢ó‘Ô‚Ì
- ‚±‚Æ‚Å‚Í‚È‚¢B
-
-
---------------------------------------------------------------------------
-< –ÚŽŸ >
-
- * Cygwin‚Å‚Ìstackdump‚Æcore
- Cygwinã‚Åcoreƒtƒ@ƒCƒ‹‚ð“f‚­•û–@‚ðЉ‚éB
-
- * coreƒtƒ@ƒCƒ‹‚©‚çƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚𓾂é
- ƒvƒƒOƒ‰ƒ€‚ª“f‚¢‚½core‚©‚çƒoƒbƒNƒgƒŒ[ƒX‚𓾂é•û–@‚ðЉ‚éB
-
- * —á
- ŽÀÛ‚É‚Æ‚Á‚½ƒƒO‚Ì—á‚ðŽ¦‚·B
-
-
---------------------------------------------------------------------------
-< Cygwin‚Å‚Ìstackdump‚Æcore >
-
- Cygwin‚ŃvƒƒOƒ‰ƒ€‚ª‹­§I—¹‚·‚éiƒAƒNƒZƒXˆá”½‚È‚Ç‚É‚æ‚é‚à‚Ìjê‡A•W€‚Å‚Í
- core‚Å‚Í‚È‚­stackdump‚ð“f‚­B‚±‚ê‚Í‘S‚­‚Æ‚¢‚Á‚Ä—Ç‚¢‚Ù‚Ç–ð‚É—§‚½‚È‚¢‚½‚ßA
- stackdump‚ðƒRƒsƒy‚³‚ê‚Ä‚àŠJ”­ŽÒ‚Í‚¨‚»‚ç‚­Œ©‚È‚¢‚¾‚낤B
-
- ‚æ‚Á‚ÄŽŸ‚Ì•û–@‚ÅAstackdump‚Å‚Í‚È‚­core‚ð“f‚­‚悤‚É‚·‚éB
- ** ŠÂ‹«•Ï”‚Éuerror_start=dumper.exev‚ð’ljÁ‚·‚é **
-
- ‚æ‚­‚í‚©‚ç‚È‚¢ê‡AŽŸ‚̂悤‚Éì‹Æ‚·‚é‚Æ‚¢‚¢BiWin2000‚Å‚Ì‚ÝŠm”Fj
- * ƒfƒXƒNƒgƒbƒv‚Ìuƒ}ƒCƒRƒ“ƒsƒ…[ƒ^v‚ð‰EƒNƒŠƒbƒN‚µ‚ÄuƒvƒƒpƒeƒBv‚ðo‚·B
- * [Ú×]ƒ^ƒu‚ðŠJ‚«A[ŠÂ‹«•Ï”]ƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚·‚éB
- * ƒ†[ƒU[ŠÂ‹«•Ï”AƒVƒXƒeƒ€ŠÂ‹«•Ï”‚Ì‚Ç‚¿‚ç‚©uCYGWINv‚Æ‚¢‚¤•Ï”‚ª‚È‚¢‚©’T‚·
- * ‚ ‚éꇂÍA‘I‘ð‚µ‚Ä[•ÒW]ƒ{ƒ^ƒ“‚ð‰Ÿ‚µA[•Ï”’l]‚Éuerror_start=dumper.exev
- ‚ð’ljÁ‚·‚éBŠù‚ɉ½‚©‚Ì’PŒê‚ª‚ ‚éꇂÍA’PŒê‚ð‹æ؂邽‚ßA
- ’ljÁ‚·‚é•”•ª‚Ìʼn‚É”¼ŠpƒXƒy[ƒX‚ð“ü‚ê‚邱‚Æ‚ð–Y‚ê‚È‚¢‚±‚ÆB
- * ‚È‚¢ê‡‚ÍAƒVƒXƒeƒ€ŠÂ‹«•Ï”‚É(AdministratorŒ ŒÀ‚ª‚È‚¢‚Ȃ烆[ƒU[ŠÂ‹«•Ï”)
- ‚Ì[V‹K]ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚ÄA[•Ï”–¼]‚ÉuCYGWINvA•Ó”’l‚É
- uerror_start=dumper.exev‚ð“ü—Í‚·‚éB
- * OK‚ð‰Ÿ‚µ‚ăEƒBƒ“ƒhƒE‚ð•Â‚¶ACygwin‚ð‹N“®‚µ‚È‚¨‚¹‚΂悢
-
- ‚±‚¤‚µ‚Ä‚¨‚­‚ÆAstackdump‚Ì•Ï‚í‚è‚Écore‚ð“f‚­‚悤‚É‚È‚éB
- ƒTƒCƒY‚ª‘å‚«‚¢ê‡Acore‚ð“f‚­‚Ì‚É‚Í‘½­ŽžŠÔ‚ª‚©‚©‚éB
- ‚Ü‚½core‚ð“f‚¢‚Ä‚¢‚éŠÔAdumper.exe‚Æ‚¢‚¤ƒvƒƒOƒ‰ƒ€‚̃EƒBƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚éB
-
-
---------------------------------------------------------------------------
-< coreƒtƒ@ƒCƒ‹‚©‚çƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚𓾂é >
-
- core‚ð“f‚­ê‡A‚Ü‚¸ŠJ”­ŽÒ‚̓Xƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚ð—~‚µ‚ª‚éBƒGƒ‰[ŒÂŠ‚ð
- ”»’f‚µ‚â‚·‚¢‚©‚炾B‚æ‚Á‚ÄAgdb‚ŃoƒbƒNƒgƒŒ[ƒX‚ðŽæ‚èo‚»‚¤B
- ‚Ü‚¸AŽŸ‚̂悤‚É‚µ‚Ägdb‚ð‹N“®‚·‚éB‚±‚±‚Å‚Ímap-server.exe‚ð—á‚Éo‚·B
- UNIXŒnOS‚ł̓RƒAƒtƒ@ƒCƒ‹–¼‚ðC³‚·‚é•K—v‚ª‚ ‚邾‚낤Biucorev‚È‚Çj
-
- $ gdb -c map-server.exe.core
-
- ‚È‚É‚â‚çFX‰p•¶‚ª•\Ž¦‚³‚êAÅŒã‚É (gdb) ‚Æ‚¢‚¤ƒvƒƒ“ƒvƒg‚ªo‚½‚Í‚¸‚¾B
- ‚±‚Ì’¼‘O‚ɃGƒ‰[‚Ì‹N‚±‚Á‚½ŠÖ”‚âƒtƒ@ƒCƒ‹–¼‚È‚Ç‚ÆA‚»‚Ì“à—e‚ª•\Ž¦‚³‚ê‚Ä‚¢‚é
- ‚Í‚¸‚È‚Ì‚ÅA‚±‚ê‚̓Rƒsƒy‚·‚ׂ«‚¾B
-
- ‚Ü‚½A‚±‚±‚Åubtv‚Æ“ü—Í‚·‚é‚ÆAƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚ª•\Ž¦‚³‚ê‚éB
- ‚±‚ê‚àƒRƒsƒy‚·‚é‚Æ‚æ‚¢B‚½‚¾‚µA‚ ‚Ü‚è‚É‚à’·‚¢ê‡‚Íʼn‚Ì\”s’ö“x‚Å
- \•ª‚¾‚낤B
-
- ‚¿‚È‚Ý‚ÉAup •Ï”–¼v‚̂悤‚É“ü—Í‚·‚é‚Æ•Ï”‚ðŒ©‚½‚è‚ào—ˆ‚éB
- ŠÖ˜A‚µ‚»‚¤‚È•Ï”‚Ì’l‚ðFX•\Ž¦‚µ‚Ĉê‚ɃRƒsƒy‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ô‚©‚à‚µ‚ê‚È‚¢B
-
- gdb‚ðI—¹‚·‚éꇂÍAuqv‚Æ‘Å‚¿ž‚ÞB
-
-
---------------------------------------------------------------------------
-< —á >
-
- ˆÈ‰º‚Ímob.c‚Ìmob_warp()ŠÖ”‚Å‚í‚´‚ƃAƒNƒZƒXˆá”½‚ð‹N‚±‚µ‚Ä‚Æ‚Á‚½ƒƒO‚Å‚ ‚éB
- ƒGƒ‰[‚ÌêŠA‚Ç‚¤‚¢‚¤‡‚ŌĂÑo‚³‚ꂽ‚©‚ª‚í‚©‚邾‚낤B
-
- ‚à‚¿‚ë‚ñAAthena‚̃pƒbƒ`”Ô†‚Ì•ñ‚ð–Y‚ê‚È‚¢‚±‚ÆB
- ƒpƒbƒ`‚ªˆá‚¤‚ÆAƒ\[ƒXƒtƒ@ƒCƒ‹‚ª•Ï‚í‚é‚Ì‚ÅAs”Ô†‚ª–ð‚É—§‚½‚È‚­‚Ȃ邽‚ß‚¾B
-
- ‚È‚¨ˆÈ‰º‚Ì—á‚Å‚ÍAƒoƒbƒNƒgƒŒ[ƒXˆÈŠO‚ÉA
- pƒRƒ}ƒ“ƒh‚ðŽg‚Á‚ÄŠY“–‚ÌMOB‚Ì–¼‘Oi‰pŒêj‚ÆAƒ}ƒbƒv‚Ì–¼‘O‚ð•\Ž¦‚µ‚Ä‚¢‚éB
- (FAKE_ANGEL, gef_dun03.gat)
-
-#0 mob_warp (md=0x10119c88, x=-1, y=-1, type=-1) at mob.c:1845
-1845 memset(NULL,0,1);
-(gdb) bt
-#0 mob_warp (md=0x10119c88, x=-1, y=-1, type=-1) at mob.c:1845
-#1 0x0042609d in mob_ai_sub_lazy (key=0x68e77f5, data=0x10119c88,
- app=0x22fe88 "¤þ\"") at mob.c:1412
-#2 0x00455b54 in db_foreach (table=0x22fe88, func=0x610691f2 <select+242>)
- at db.c:414
-#3 0x10119c88 in ?? ()
-#4 0x0022fe88 in ?? ()
-#5 0x610691f2 in select ()
-(gdb) p mob_db[md->class].name
-$1 = "FAKE_ANGEL\000\203t\203F\203C\203N\203G\203\223\203"
-(gdb) p map[md->bl.m].name
-$2 = "gef_dun03.gat\000\000r"
-
+==========================================================================
+ ƒT[ƒo[‚ª‹­§I—¹‚·‚éꇂÌcoredump‚É‚æ‚éÚׂȃoƒO•ñ•û–@
+--------------------------------------------------------------------------
+
+< ‚±‚̃tƒ@ƒCƒ‹‚͉½H >
+
+ AthenaŽg—p’†‚Émap-server.exe‚È‚Ç‚ª“Ë‘R—Ž‚¿‚½ê‡‚ÉA—Ž‚¿‚½‚Æ‚«‚̃Xƒ^ƒbƒN‚Ì
+ ƒoƒbƒNƒgƒŒ[ƒX‚ð‚ðŠJ”­ŽÒ‚É“`‚¦‚é•û–@‚ð‰ðà‚·‚éB
+ ƒoƒO•ñ‚ÌŽž‚É•¹—p‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ô‚©‚à‚µ‚ê‚È‚¢B
+
+ ‚±‚±‚Å‚Ìu—Ž‚¿‚év‚Í‚ ‚­‚܂ŃT[ƒo[‚Å‚ ‚èAƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Í‚È‚¢B
+ ‚Ü‚½ƒvƒƒZƒX‚ªcorei‚Ü‚½‚Ístackdumpj‚ð“f‚­Œ»Û‚Ì‚±‚Æ‚Å‚ ‚èA
+ –³ŒÀƒ‹[ƒv‚Ȃǂ̃vƒƒZƒX‚Ͷ‚«‚Ä‚¢‚邪ƒT[ƒo[‚Ì‹@”\‚Í’ñ‹Ÿ‚³‚ê‚È‚¢ó‘Ô‚Ì
+ ‚±‚Æ‚Å‚Í‚È‚¢B
+
+
+--------------------------------------------------------------------------
+< –ÚŽŸ >
+
+ * Cygwin‚Å‚Ìstackdump‚Æcore
+ Cygwinã‚Åcoreƒtƒ@ƒCƒ‹‚ð“f‚­•û–@‚ðЉ‚éB
+
+ * coreƒtƒ@ƒCƒ‹‚©‚çƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚𓾂é
+ ƒvƒƒOƒ‰ƒ€‚ª“f‚¢‚½core‚©‚çƒoƒbƒNƒgƒŒ[ƒX‚𓾂é•û–@‚ðЉ‚éB
+
+ * —á
+ ŽÀÛ‚É‚Æ‚Á‚½ƒƒO‚Ì—á‚ðŽ¦‚·B
+
+
+--------------------------------------------------------------------------
+< Cygwin‚Å‚Ìstackdump‚Æcore >
+
+ Cygwin‚ŃvƒƒOƒ‰ƒ€‚ª‹­§I—¹‚·‚éiƒAƒNƒZƒXˆá”½‚È‚Ç‚É‚æ‚é‚à‚Ìjê‡A•W€‚Å‚Í
+ core‚Å‚Í‚È‚­stackdump‚ð“f‚­B‚±‚ê‚Í‘S‚­‚Æ‚¢‚Á‚Ä—Ç‚¢‚Ù‚Ç–ð‚É—§‚½‚È‚¢‚½‚ßA
+ stackdump‚ðƒRƒsƒy‚³‚ê‚Ä‚àŠJ”­ŽÒ‚Í‚¨‚»‚ç‚­Œ©‚È‚¢‚¾‚낤B
+
+ ‚æ‚Á‚ÄŽŸ‚Ì•û–@‚ÅAstackdump‚Å‚Í‚È‚­core‚ð“f‚­‚悤‚É‚·‚éB
+ ** ŠÂ‹«•Ï”‚Éuerror_start=dumper.exev‚ð’ljÁ‚·‚é **
+
+ ‚æ‚­‚í‚©‚ç‚È‚¢ê‡AŽŸ‚̂悤‚Éì‹Æ‚·‚é‚Æ‚¢‚¢BiWin2000‚Å‚Ì‚ÝŠm”Fj
+ * ƒfƒXƒNƒgƒbƒv‚Ìuƒ}ƒCƒRƒ“ƒsƒ…[ƒ^v‚ð‰EƒNƒŠƒbƒN‚µ‚ÄuƒvƒƒpƒeƒBv‚ðo‚·B
+ * [Ú×]ƒ^ƒu‚ðŠJ‚«A[ŠÂ‹«•Ï”]ƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚·‚éB
+ * ƒ†[ƒU[ŠÂ‹«•Ï”AƒVƒXƒeƒ€ŠÂ‹«•Ï”‚Ì‚Ç‚¿‚ç‚©uCYGWINv‚Æ‚¢‚¤•Ï”‚ª‚È‚¢‚©’T‚·
+ * ‚ ‚éꇂÍA‘I‘ð‚µ‚Ä[•ÒW]ƒ{ƒ^ƒ“‚ð‰Ÿ‚µA[•Ï”’l]‚Éuerror_start=dumper.exev
+ ‚ð’ljÁ‚·‚éBŠù‚ɉ½‚©‚Ì’PŒê‚ª‚ ‚éꇂÍA’PŒê‚ð‹æ؂邽‚ßA
+ ’ljÁ‚·‚é•”•ª‚Ìʼn‚É”¼ŠpƒXƒy[ƒX‚ð“ü‚ê‚邱‚Æ‚ð–Y‚ê‚È‚¢‚±‚ÆB
+ * ‚È‚¢ê‡‚ÍAƒVƒXƒeƒ€ŠÂ‹«•Ï”‚É(AdministratorŒ ŒÀ‚ª‚È‚¢‚Ȃ烆[ƒU[ŠÂ‹«•Ï”)
+ ‚Ì[V‹K]ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚ÄA[•Ï”–¼]‚ÉuCYGWINvA•Ó”’l‚É
+ uerror_start=dumper.exev‚ð“ü—Í‚·‚éB
+ * OK‚ð‰Ÿ‚µ‚ăEƒBƒ“ƒhƒE‚ð•Â‚¶ACygwin‚ð‹N“®‚µ‚È‚¨‚¹‚΂悢
+
+ ‚±‚¤‚µ‚Ä‚¨‚­‚ÆAstackdump‚Ì•Ï‚í‚è‚Écore‚ð“f‚­‚悤‚É‚È‚éB
+ ƒTƒCƒY‚ª‘å‚«‚¢ê‡Acore‚ð“f‚­‚Ì‚É‚Í‘½­ŽžŠÔ‚ª‚©‚©‚éB
+ ‚Ü‚½core‚ð“f‚¢‚Ä‚¢‚éŠÔAdumper.exe‚Æ‚¢‚¤ƒvƒƒOƒ‰ƒ€‚̃EƒBƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚éB
+
+
+--------------------------------------------------------------------------
+< coreƒtƒ@ƒCƒ‹‚©‚çƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚𓾂é >
+
+ core‚ð“f‚­ê‡A‚Ü‚¸ŠJ”­ŽÒ‚̓Xƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚ð—~‚µ‚ª‚éBƒGƒ‰[ŒÂŠ‚ð
+ ”»’f‚µ‚â‚·‚¢‚©‚炾B‚æ‚Á‚ÄAgdb‚ŃoƒbƒNƒgƒŒ[ƒX‚ðŽæ‚èo‚»‚¤B
+ ‚Ü‚¸AŽŸ‚̂悤‚É‚µ‚Ägdb‚ð‹N“®‚·‚éB‚±‚±‚Å‚Ímap-server.exe‚ð—á‚Éo‚·B
+ UNIXŒnOS‚ł̓RƒAƒtƒ@ƒCƒ‹–¼‚ðC³‚·‚é•K—v‚ª‚ ‚邾‚낤Biucorev‚È‚Çj
+
+ $ gdb -c map-server.exe.core
+
+ ‚È‚É‚â‚çFX‰p•¶‚ª•\Ž¦‚³‚êAÅŒã‚É (gdb) ‚Æ‚¢‚¤ƒvƒƒ“ƒvƒg‚ªo‚½‚Í‚¸‚¾B
+ ‚±‚Ì’¼‘O‚ɃGƒ‰[‚Ì‹N‚±‚Á‚½ŠÖ”‚âƒtƒ@ƒCƒ‹–¼‚È‚Ç‚ÆA‚»‚Ì“à—e‚ª•\Ž¦‚³‚ê‚Ä‚¢‚é
+ ‚Í‚¸‚È‚Ì‚ÅA‚±‚ê‚̓Rƒsƒy‚·‚ׂ«‚¾B
+
+ ‚Ü‚½A‚±‚±‚Åubtv‚Æ“ü—Í‚·‚é‚ÆAƒXƒ^ƒbƒN‚̃oƒbƒNƒgƒŒ[ƒX‚ª•\Ž¦‚³‚ê‚éB
+ ‚±‚ê‚àƒRƒsƒy‚·‚é‚Æ‚æ‚¢B‚½‚¾‚µA‚ ‚Ü‚è‚É‚à’·‚¢ê‡‚Íʼn‚Ì\”s’ö“x‚Å
+ \•ª‚¾‚낤B
+
+ ‚¿‚È‚Ý‚ÉAup •Ï”–¼v‚̂悤‚É“ü—Í‚·‚é‚Æ•Ï”‚ðŒ©‚½‚è‚ào—ˆ‚éB
+ ŠÖ˜A‚µ‚»‚¤‚È•Ï”‚Ì’l‚ðFX•\Ž¦‚µ‚Ĉê‚ɃRƒsƒy‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ô‚©‚à‚µ‚ê‚È‚¢B
+
+ gdb‚ðI—¹‚·‚éꇂÍAuqv‚Æ‘Å‚¿ž‚ÞB
+
+
+--------------------------------------------------------------------------
+< —á >
+
+ ˆÈ‰º‚Ímob.c‚Ìmob_warp()ŠÖ”‚Å‚í‚´‚ƃAƒNƒZƒXˆá”½‚ð‹N‚±‚µ‚Ä‚Æ‚Á‚½ƒƒO‚Å‚ ‚éB
+ ƒGƒ‰[‚ÌêŠA‚Ç‚¤‚¢‚¤‡‚ŌĂÑo‚³‚ꂽ‚©‚ª‚í‚©‚邾‚낤B
+
+ ‚à‚¿‚ë‚ñAAthena‚̃pƒbƒ`”Ô†‚Ì•ñ‚ð–Y‚ê‚È‚¢‚±‚ÆB
+ ƒpƒbƒ`‚ªˆá‚¤‚ÆAƒ\[ƒXƒtƒ@ƒCƒ‹‚ª•Ï‚í‚é‚Ì‚ÅAs”Ô†‚ª–ð‚É—§‚½‚È‚­‚Ȃ邽‚ß‚¾B
+
+ ‚È‚¨ˆÈ‰º‚Ì—á‚Å‚ÍAƒoƒbƒNƒgƒŒ[ƒXˆÈŠO‚ÉA
+ pƒRƒ}ƒ“ƒh‚ðŽg‚Á‚ÄŠY“–‚ÌMOB‚Ì–¼‘Oi‰pŒêj‚ÆAƒ}ƒbƒv‚Ì–¼‘O‚ð•\Ž¦‚µ‚Ä‚¢‚éB
+ (FAKE_ANGEL, gef_dun03.gat)
+
+#0 mob_warp (md=0x10119c88, x=-1, y=-1, type=-1) at mob.c:1845
+1845 memset(NULL,0,1);
+(gdb) bt
+#0 mob_warp (md=0x10119c88, x=-1, y=-1, type=-1) at mob.c:1845
+#1 0x0042609d in mob_ai_sub_lazy (key=0x68e77f5, data=0x10119c88,
+ app=0x22fe88 "¤þ\"") at mob.c:1412
+#2 0x00455b54 in db_foreach (table=0x22fe88, func=0x610691f2 <select+242>)
+ at db.c:414
+#3 0x10119c88 in ?? ()
+#4 0x0022fe88 in ?? ()
+#5 0x610691f2 in select ()
+(gdb) p mob_db[md->class].name
+$1 = "FAKE_ANGEL\000\203t\203F\203C\203N\203G\203\223\203"
+(gdb) p map[md->bl.m].name
+$2 = "gef_dun03.gat\000\000r"
+
diff --git a/doc/db_ref.txt b/doc/db_ref.txt
index fbdfad4d7..b4fd904b2 100644
--- a/doc/db_ref.txt
+++ b/doc/db_ref.txt
@@ -1,147 +1,147 @@
-==========================================================================
- Athena dev 2.1.1 mod0659 Œ»Ý‚Ìdb‚̃Šƒtƒ@ƒŒƒ“ƒX{ƒ¿
---------------------------------------------------------------------------
-
-< ‚±‚̃tƒ@ƒCƒ‹‚͉½H >
-
- Athena‚Ìdbƒtƒ@ƒCƒ‹‚ÌÝ’è•û–@‚̃Šƒtƒ@ƒŒƒ“ƒX‚Å‚·B
-
-
-< db‚̃ŠƒXƒg >
-
-cast_db.txt ƒXƒLƒ‹‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ƃfƒBƒŒƒCAˆÛŽŽžŠÔ“™‚ðÝ’èB
-skill_db.txt ƒXƒLƒ‹‚̃f[ƒ^‚ðÝ’èB
-skill_require_db.txt ƒXƒLƒ‹Žg—pðŒ‚ðÝ’èB
-pet_db.txt ƒyƒbƒg‚̃f[ƒ^‚ðÝ’èB
-
-
-==========================================================================
-1. db/cast_db.txt
---------------------------------------------------------------------------
-
-id,cast_list,delay_list,upkeep_time,upkeep_time2
-
-id: ƒXƒLƒ‹‚ÌID‚Å‚·B
-cast_list: ƒXƒLƒ‹‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-delay_list: ƒXƒLƒ‹‚̃fƒBƒŒƒCŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-upkeep_time:ƒXƒLƒ‹‚̈ێŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-upkeep_time2:ƒXƒLƒ‹‚É‚æ‚Á‚Ä‹N‚±‚éó‘ÔˆÙí‚̈ێŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(‚½‚¾‘¬“xŒ¸­‚Íupkeep_time‚ðŽg‚¢‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B)
-
-¦•Ší‚̒ljÁŒø‰Ê‚É‚æ‚éó‘ÔˆÙí‚ÍMG_STONECURSE(Ή»)AMG_FROSTDIVER(“€Œ‹)ANPC_STUNATTACK(ƒXƒ^ƒ“)ANPC_SLEEPATTACK(‡–°)ATF_POISON(“Å)ANPC_CURSEATTACK(Žô‚¢)ANPC_SILENCEATTACK(’¾–Ù)ANPC_BLINDATTACK(ˆÃ•)‚Ìupkeep_time2‚ðŽg‚¢‚Ü‚·B(ƒŒƒxƒ‹‚Í7‚Å“K—p)
-¦‹}ŠUŒ‚‚Ìê‡Å‘僌ƒxƒ‹‚Í1‚Å‚·‚ªƒoƒbƒVƒ…‚̃Œƒxƒ‹‚É‚æ‚Á‚ĈÙ펞ŠÔ‚ð•ÏX‚Å‚«‚é‚Ì‚Å•¡”Ý’è‚à‰Â”\‚Å‚·B
-¦ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ƃNƒ[ƒLƒ“ƒO‚Ìupkeep_time‚͈ێŽžŠÔ‚Å‚Í‚È‚­SP‚ª1Œ¸‚鎞ŠÔ‚Å‚·B
-
-
-==========================================================================
-2. db/skill_db.txt
---------------------------------------------------------------------------
-
-id,range,hit,inf,pl,nk,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
-
-id: ƒXƒLƒ‹‚ÌID‚Å‚·B
-range: ƒXƒLƒ‹‚ÌŽË’ö‹——£‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B-1‚̓Lƒƒƒ‰‚Ì•ŠíŽË’ö‚Æ“¯‚¶‚ÆŒ¾‚¤ˆÓ–¡‚Å-2‚È‚çƒLƒƒƒ‰‚Ì•ŠíŽË’ö+1A-3‚È‚çƒLƒƒƒ‰‚Ì•ŠíŽË’ö+2‚É‚È‚è‚Ü‚·B
-hit: ˜A‘Å‚È‚ç8A’P”­‚È‚ç6(ƒXƒLƒ‹‚̃qƒbƒg”‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
-inf: ƒXƒLƒ‹î•ñ‚Å‚·B
- 0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•ûA32-ã©
- •¡”‚Ì•¨‚ð“ü‚ê‚é‚Æ(”’l‚ð‘«‚µ‚Ä)³‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
-pl: ƒXƒLƒ‹‚Ì‘®«‚Å‚·B
- 0-–³ 1-… 2-’n 3-‰Î 4-•— 5-“Å 6-¹ 7-ˆÃ 8-”O 9-•sŽ€
-nk: •t‰Á@1Œø‰Ê@2‚«”ò‚΂µ
-MaxLv: ƒXƒLƒ‹‚Ìő僌ƒxƒ‹‚Å‚·B
-list_num: Hit‰ñ”‚̃ŠƒXƒg‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-castcancel: ƒXƒLƒ‹‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚é‚©‚Ç‚¤‚©‚ðݒ肵‚Ü‚·Byes‚̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚镨‚Åno‚̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢•¨‚Å‚·B
-cast_defence_rate: ƒLƒƒƒXƒeƒBƒ“ƒO’†‚ɒቺ‚·‚é–hŒä—͂̔䗦‚Å‚·Bƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚âƒNƒ‰ƒ“ƒhƒNƒƒX‚̂悤‚ɃXƒLƒ‹ƒLƒƒƒXƒeƒBƒ“ƒO’†‚É–hŒä‚ªŒ¸‚éƒXƒLƒ‹‚ÌÝ’è‚ÉŽg‚¢‚Ü‚·B
-inf2: ƒXƒLƒ‹î•ñ2‚Å‚·B1 - ƒNƒFƒXƒgƒXƒLƒ‹A2 - npc ƒXƒLƒ‹A4-“GA8-êŠA16-‘¦Žž”­“®A32-–¡•ûA64-ã©A128-PVPƒ‚[ƒh‚ÅŽ©•ª‚ðŠÜ‚Þ‘S‚Ä‚Ì•¨‚Ƀ_ƒ[ƒW‚ª“ü‚éƒXƒLƒ‹(’n–ʃXƒLƒ‹‚Ì‚Ý)A256-•’Ê‚ÌŽg—p‚ÅŽ©•ª‚É•K‚¸ƒ_ƒ[ƒW‚ª“ü‚éƒXƒLƒ‹(’n–ʃXƒLƒ‹‚Ì‚Ý)A512-Ž©•ª‚É‚ÍŽg‚¤‚±‚Æ‚ª‚Å‚«‚È‚¢ƒXƒLƒ‹A1024 - Ž©•ª‚©Ž©•ª‚̃p[ƒeƒB‚É‚µ‚©Žg‚¦‚È‚¢ƒXƒLƒ‹B2048 - Ž©•ª‚©Ž©•ª‚̃Mƒ‹ƒh‚É‚µ‚©Žg‚¦‚È‚¢ƒXƒLƒ‹A“¯–¿ƒMƒ‹ƒhƒ`ƒFƒbƒN‚Í–³‚µB(4A8A16A32A64‚͈ꕔ‚̃AƒNƒeƒBƒuƒXƒLƒ‹‚ªŽg—pB¡‚͈¢C—…”e–PŒ‚Ì‚ÝŽg—pB)
-maxcount: ’n–ʃXƒLƒ‹‚Ì‚Ý‚É“K—p‚³‚ê‚镨‚ŃXƒLƒ‹‚ð’u‚¯‚éő唂ł·B0‚Í’u‚¯‚È‚¢‚ÆŒ¾‚¤ˆÓ–¡‚Å‚Í‚È‚­§ŒÀ‚ª‚È‚¢•¨‚ÆŒ¾‚¤ˆÓ–¡‚Å‚·B
-skill_type: ƒXƒLƒ‹‚ÌŽí—Þ‚ðݒ肵‚Ü‚·Bweapon‚Í•ŠíƒXƒLƒ‹‚Åmagic‚Í–‚–@ƒXƒLƒ‹Amisc‚Í•Ší‚Å‚à–‚–@‚Å‚à‚È‚¢ƒXƒLƒ‹‚Å‚·Bnone‚ÍŒˆ‚ߓ‚¢•¨“™‚Éݒ肵‚Ü‚·B‚½‚¾‚±‚ê‚ð•Ï‚¦‚½‚Æ‚µ‚Ä‚àƒXƒLƒ‹‚̃_ƒ[ƒWŒvŽZ‚ª‚±‚ê‚ɇ‚킹‚Ä•Ï‚í‚é‚킯‚Å‚Í‚È‚­ƒ_ƒ[ƒW‚ÌŒvŽZ‚̓vƒƒOƒ‰ƒ€ƒŒƒxƒ‹‚Ås‚È‚Á‚Ä‚¢‚Ü‚·B‚±‚ê‚̓Xƒyƒ‹ƒuƒŒƒCƒJ[‚ʼnr¥’†Ž~‚³‚ê‚é‚©‚Ç‚¤‚©‚ðÝ’è‚·‚éˆ×‚Ì•¨‚Å‚·B(‘¼‚̃XƒLƒ‹‚Å‚±‚ÌÝ’è‚ðŽg—p‚·‚é‰Â”\«‚à‚ ‚è‚Ü‚·‚ª¡‚ÌŠƒXƒyƒ‹ƒuƒŒƒCƒJ[‚Ì‚Ý‚Å‚·B) magic‚ÉÝ’è‚·‚é‚ƃXƒyƒ‹ƒuƒŒƒCƒJ[‚ʼnr¥’†Ž~‚³‚ê‚Ü‚·B
-blow_count: ƒXƒLƒ‹‚æ‚éƒmƒbƒNƒoƒbƒN‹——£‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-
-
-==========================================================================
-3. db/skill_require_db.txt
---------------------------------------------------------------------------
-
-id,list_hp,list_sp,list_hp_rate,list_sp_rate,list_zeny,list_weapon,state,spiritball,itemid1,amount1,itemid2,amount2,itemid3,amount3,itemid4,amount4,itemid5,amount5,itemid6,amount6,itemid7,amount7,itemid8,amount8,itemid9,amount9,itemid10,amount10
-
-id: ƒXƒLƒ‹‚ÌID‚Å‚·B
-list_hp: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éHP‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-list_sp: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éSP‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-list_hp_rate: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éHP‚̔䗦‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(Å‘åHP‚̔䗦‚Å‚Í‚È‚­Œ»ÝHP‚̔䗦‚Å‚·B)
-list_sp_rate: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éSP‚̔䗦‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(Å‘åSP‚̔䗦‚Å‚Í‚È‚­Œ»ÝSP‚̔䗦‚Å‚·B)
-list_zeny: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éƒ[ƒj‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-list_weapon: ƒXƒLƒ‹‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚é•Ší‚ðݒ肵‚Ü‚·B
- 99 - ‘S‚Ä‚Ì•ŠíA0 - ‘fŽèA1 - ’ZŒ•A2 - •ÐŽèŒ•A3 - —¼ŽèŒ•A4 - •ÐŽè‘„A
- 5 - —¼Žè‘„A6 - •ÐŽè•€A7 - —¼Žè•€A8 - •ÐŽè“ÝŠíA9 - —¼Žè“ÝŠíA10 - ƒƒbƒhA
- 11 - ‹|A12 - ƒiƒbƒNƒ‹A13 - ŠyŠíA14 - •ÚA15 - –{A16 - ƒJƒ^[ƒ‹A
- 17~22: “ñ“—¬
- •¡”‚ðÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-state:ƒXƒLƒ‹‚ðŽg—p‚·‚éˆ×‚ÌðŒ‚ðݒ肵‚Ü‚·B•¡”‚ÌÝ’è‚Í‚Å‚«‚Ü‚¹‚ñB
- none - ðŒ–³‚µ
- hiding - ƒnƒCƒfƒBƒ“ƒOó‘Ô
- cloacking - ƒNƒ[ƒLƒ“ƒOó‘ÔB
- hidden: ƒnƒCƒfƒBƒ“ƒO‚âƒNƒƒbƒLƒ“ƒOó‘Ô
- riding: ƒyƒRƒyƒR‚Éæ‚Á‚Ä‚¢‚é
- falcon: ‘é‚ð˜A‚ê‚Ä‚¢‚é
- cart: ƒJ[ƒg‚ð’…‚¯‚Ä‚¢‚é
- shield: ƒV[ƒ‹ƒh‚ðŽ‚Á‚Ä‚¢‚é
- sight: ƒTƒCƒgó‘Ô
- explosionspirits: ”š—ô”g“®ó‘Ô
- recover_weight_rate: Ž©‘R‰ñ•œ‚Å‚«‚éd—Ê
- move_enable: ƒXƒLƒ‹Žg—pˆÊ’u‚ªˆÚ“®‰Â”\‚ÈêŠ
- water: ‘«Œ³‚ª…
-spiritball: ƒXƒLƒ‹Žg—p‚É•K—v‚È‹C’e‚Ì”‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
-itemid1: ƒXƒLƒ‹Žg—p‚É•K—v‚ȃAƒCƒeƒ€‚ÌIDAƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÌꇃŒƒxƒ‹•Ê‚ÉŽg‚¤‚±‚Æ‚É‚È‚éƒAƒCƒeƒ€ID
-amount1: ƒXƒLƒ‹Žg—p‚É•K—v‚ȃAƒCƒeƒ€‚Ì”(”‚ª0‚ÌꇃAƒCƒeƒ€‚ÌID‚ª‚ ‚é‚ƃAƒCƒeƒ€‚ÍŒ¸‚ç‚È‚¢‚¯‚ÇG”}‚Æ‚µ‚Ä‚»‚̃AƒCƒeƒ€‚ðŽ‚Á‚Ä‚¢‚é•K—v‚ª‚ ‚é‚悤‚É‚È‚è‚Ü‚·B) ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÌꇃŒƒxƒ‹•Ê‚ÉŽg‚¤‚±‚Æ‚É‚È‚éƒAƒCƒeƒ€”
-itemid2: 㓯
-amount2: 㓯
-itemid3: 㓯
-amount3: 㓯
-itemid4: 㓯
-amount4: 㓯
-itemid5: 㓯
-amount5: 㓯
-itemid6: 㓯
-amount6: 㓯
-itemid7: 㓯
-amount7: 㓯
-itemid8: 㓯
-amount8: 㓯
-itemid9: 㓯
-amount9: 㓯
-itemid10: 㓯
-amount10: 㓯
-
-
-==========================================================================
-4. db/pet_db.txt
---------------------------------------------------------------------------
-
- MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDelay ,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
-
-MobID: ƒ‚ƒ“ƒXƒ^[ID‚Å‚·B
-Name: ‰pŒê–¼‘O(ƒ_ƒ~[)
-JName: –¼‘O
-ItemID: •ßŠl—p‚̃AƒCƒeƒ€ID
-EggID: —‘‚̃AƒCƒeƒ€ID
-AcceID: ‘•”õƒAƒNƒZƒTƒŠ[‚̃AƒCƒeƒ€ID
-FoodID: ‰a‚̃AƒCƒeƒ€ID
-Fullness: 1‰ñ‚̉a‚Å‚Ì–ž• “x‘‰Á—¦%
-HungryDelay: –ž• “x‚ª1%Œ¸‚éˆ×‚É‚©‚©‚鎞ŠÔ(•b)
-R_Hungry: ‹ó• Žž‰a‚â‚èe–§“x‘‰Á—Ê
-R_Full: ‚Æ‚Ä‚à–ž• Žž‰a‚â‚èe–§“xŒ¸­—Ê
-Intimate: •ßŠlŽže–§“x
-Die: Ž€–SŽže–§“xŒ¸­—Ê
-Capture: •ßŠl—¦(–œ•ª—¦)
-Speed: ˆÚ“®‘¬“x
-S_Performance: ƒXƒyƒVƒƒƒ‹ƒpƒtƒHƒ}ƒ“ƒX‚ª‚ ‚é‚©‚Ç‚¤‚©(1‚Å‚ ‚è0‚Å‚È‚µ)
-talk_convert_class: ‘䎌‚𑼂̃yƒbƒg‚Ì•¨‚É•ÏXB•ÏX‚µ‚½‚¢ƒyƒbƒg‚̃‚ƒ“ƒXƒ^[ID‚ð“ü‚ê‚Ü‚·B0‚ÌꇕÏX‚È‚µ‚Ń}ƒCƒiƒX‚ð“ü‚ê‚é‚ƃGƒ‚[ƒVƒ‡ƒ“ˆÈŠO‚Ì•¨(‘䎌)‚Í‘S‚Ä–³Ž‹‚³‚ê‚Ü‚·B
-attack_rate: Žx‰‡UŒ‚Šm—¦B(–œ•ª—¦) Žål‚ªUŒ‚‚ð‚µ‚©‚¯‚½ê‡B
-defence_attack_rate: Žx‰‡UŒ‚Šm—¦B(–œ•ª—¦) Žål‚ªUŒ‚‚ðŽó‚¯‚½ê‡B
-change_target_rate: UŒ‚–Ú•W‚ð•ÏX‚·‚éŠm—¦B(–œ•ª—¦)
-pet_script: ƒyƒbƒg‚ðŽ‚Á‚Ä‚¢‚鎞“K—p‚³‚ê‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ðÝ’èB
-
-
-
-==========================================================================
-EOF
---------------------------------------------------------------------------
+==========================================================================
+ Athena dev 2.1.1 mod0659 Œ»Ý‚Ìdb‚̃Šƒtƒ@ƒŒƒ“ƒX{ƒ¿
+--------------------------------------------------------------------------
+
+< ‚±‚̃tƒ@ƒCƒ‹‚͉½H >
+
+ Athena‚Ìdbƒtƒ@ƒCƒ‹‚ÌÝ’è•û–@‚̃Šƒtƒ@ƒŒƒ“ƒX‚Å‚·B
+
+
+< db‚̃ŠƒXƒg >
+
+cast_db.txt ƒXƒLƒ‹‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ƃfƒBƒŒƒCAˆÛŽŽžŠÔ“™‚ðÝ’èB
+skill_db.txt ƒXƒLƒ‹‚̃f[ƒ^‚ðÝ’èB
+skill_require_db.txt ƒXƒLƒ‹Žg—pðŒ‚ðÝ’èB
+pet_db.txt ƒyƒbƒg‚̃f[ƒ^‚ðÝ’èB
+
+
+==========================================================================
+1. db/cast_db.txt
+--------------------------------------------------------------------------
+
+id,cast_list,delay_list,upkeep_time,upkeep_time2
+
+id: ƒXƒLƒ‹‚ÌID‚Å‚·B
+cast_list: ƒXƒLƒ‹‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+delay_list: ƒXƒLƒ‹‚̃fƒBƒŒƒCŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+upkeep_time:ƒXƒLƒ‹‚̈ێŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+upkeep_time2:ƒXƒLƒ‹‚É‚æ‚Á‚Ä‹N‚±‚éó‘ÔˆÙí‚̈ێŽžŠÔ‚ðݒ肵‚Ü‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(‚½‚¾‘¬“xŒ¸­‚Íupkeep_time‚ðŽg‚¢‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B)
+
+¦•Ší‚̒ljÁŒø‰Ê‚É‚æ‚éó‘ÔˆÙí‚ÍMG_STONECURSE(Ή»)AMG_FROSTDIVER(“€Œ‹)ANPC_STUNATTACK(ƒXƒ^ƒ“)ANPC_SLEEPATTACK(‡–°)ATF_POISON(“Å)ANPC_CURSEATTACK(Žô‚¢)ANPC_SILENCEATTACK(’¾–Ù)ANPC_BLINDATTACK(ˆÃ•)‚Ìupkeep_time2‚ðŽg‚¢‚Ü‚·B(ƒŒƒxƒ‹‚Í7‚Å“K—p)
+¦‹}ŠUŒ‚‚Ìê‡Å‘僌ƒxƒ‹‚Í1‚Å‚·‚ªƒoƒbƒVƒ…‚̃Œƒxƒ‹‚É‚æ‚Á‚ĈÙ펞ŠÔ‚ð•ÏX‚Å‚«‚é‚Ì‚Å•¡”Ý’è‚à‰Â”\‚Å‚·B
+¦ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ƃNƒ[ƒLƒ“ƒO‚Ìupkeep_time‚͈ێŽžŠÔ‚Å‚Í‚È‚­SP‚ª1Œ¸‚鎞ŠÔ‚Å‚·B
+
+
+==========================================================================
+2. db/skill_db.txt
+--------------------------------------------------------------------------
+
+id,range,hit,inf,pl,nk,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
+
+id: ƒXƒLƒ‹‚ÌID‚Å‚·B
+range: ƒXƒLƒ‹‚ÌŽË’ö‹——£‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B-1‚̓Lƒƒƒ‰‚Ì•ŠíŽË’ö‚Æ“¯‚¶‚ÆŒ¾‚¤ˆÓ–¡‚Å-2‚È‚çƒLƒƒƒ‰‚Ì•ŠíŽË’ö+1A-3‚È‚çƒLƒƒƒ‰‚Ì•ŠíŽË’ö+2‚É‚È‚è‚Ü‚·B
+hit: ˜A‘Å‚È‚ç8A’P”­‚È‚ç6(ƒXƒLƒ‹‚̃qƒbƒg”‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
+inf: ƒXƒLƒ‹î•ñ‚Å‚·B
+ 0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•ûA32-ã©
+ •¡”‚Ì•¨‚ð“ü‚ê‚é‚Æ(”’l‚ð‘«‚µ‚Ä)³‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
+pl: ƒXƒLƒ‹‚Ì‘®«‚Å‚·B
+ 0-–³ 1-… 2-’n 3-‰Î 4-•— 5-“Å 6-¹ 7-ˆÃ 8-”O 9-•sŽ€
+nk: •t‰Á@1Œø‰Ê@2‚«”ò‚΂µ
+MaxLv: ƒXƒLƒ‹‚Ìő僌ƒxƒ‹‚Å‚·B
+list_num: Hit‰ñ”‚̃ŠƒXƒg‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+castcancel: ƒXƒLƒ‹‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚é‚©‚Ç‚¤‚©‚ðݒ肵‚Ü‚·Byes‚̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚镨‚Åno‚̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢•¨‚Å‚·B
+cast_defence_rate: ƒLƒƒƒXƒeƒBƒ“ƒO’†‚ɒቺ‚·‚é–hŒä—͂̔䗦‚Å‚·Bƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚âƒNƒ‰ƒ“ƒhƒNƒƒX‚̂悤‚ɃXƒLƒ‹ƒLƒƒƒXƒeƒBƒ“ƒO’†‚É–hŒä‚ªŒ¸‚éƒXƒLƒ‹‚ÌÝ’è‚ÉŽg‚¢‚Ü‚·B
+inf2: ƒXƒLƒ‹î•ñ2‚Å‚·B1 - ƒNƒFƒXƒgƒXƒLƒ‹A2 - npc ƒXƒLƒ‹A4-“GA8-êŠA16-‘¦Žž”­“®A32-–¡•ûA64-ã©A128-PVPƒ‚[ƒh‚ÅŽ©•ª‚ðŠÜ‚Þ‘S‚Ä‚Ì•¨‚Ƀ_ƒ[ƒW‚ª“ü‚éƒXƒLƒ‹(’n–ʃXƒLƒ‹‚Ì‚Ý)A256-•’Ê‚ÌŽg—p‚ÅŽ©•ª‚É•K‚¸ƒ_ƒ[ƒW‚ª“ü‚éƒXƒLƒ‹(’n–ʃXƒLƒ‹‚Ì‚Ý)A512-Ž©•ª‚É‚ÍŽg‚¤‚±‚Æ‚ª‚Å‚«‚È‚¢ƒXƒLƒ‹A1024 - Ž©•ª‚©Ž©•ª‚̃p[ƒeƒB‚É‚µ‚©Žg‚¦‚È‚¢ƒXƒLƒ‹B2048 - Ž©•ª‚©Ž©•ª‚̃Mƒ‹ƒh‚É‚µ‚©Žg‚¦‚È‚¢ƒXƒLƒ‹A“¯–¿ƒMƒ‹ƒhƒ`ƒFƒbƒN‚Í–³‚µB(4A8A16A32A64‚͈ꕔ‚̃AƒNƒeƒBƒuƒXƒLƒ‹‚ªŽg—pB¡‚͈¢C—…”e–PŒ‚Ì‚ÝŽg—pB)
+maxcount: ’n–ʃXƒLƒ‹‚Ì‚Ý‚É“K—p‚³‚ê‚镨‚ŃXƒLƒ‹‚ð’u‚¯‚éő唂ł·B0‚Í’u‚¯‚È‚¢‚ÆŒ¾‚¤ˆÓ–¡‚Å‚Í‚È‚­§ŒÀ‚ª‚È‚¢•¨‚ÆŒ¾‚¤ˆÓ–¡‚Å‚·B
+skill_type: ƒXƒLƒ‹‚ÌŽí—Þ‚ðݒ肵‚Ü‚·Bweapon‚Í•ŠíƒXƒLƒ‹‚Åmagic‚Í–‚–@ƒXƒLƒ‹Amisc‚Í•Ší‚Å‚à–‚–@‚Å‚à‚È‚¢ƒXƒLƒ‹‚Å‚·Bnone‚ÍŒˆ‚ߓ‚¢•¨“™‚Éݒ肵‚Ü‚·B‚½‚¾‚±‚ê‚ð•Ï‚¦‚½‚Æ‚µ‚Ä‚àƒXƒLƒ‹‚̃_ƒ[ƒWŒvŽZ‚ª‚±‚ê‚ɇ‚킹‚Ä•Ï‚í‚é‚킯‚Å‚Í‚È‚­ƒ_ƒ[ƒW‚ÌŒvŽZ‚̓vƒƒOƒ‰ƒ€ƒŒƒxƒ‹‚Ås‚È‚Á‚Ä‚¢‚Ü‚·B‚±‚ê‚̓Xƒyƒ‹ƒuƒŒƒCƒJ[‚ʼnr¥’†Ž~‚³‚ê‚é‚©‚Ç‚¤‚©‚ðÝ’è‚·‚éˆ×‚Ì•¨‚Å‚·B(‘¼‚̃XƒLƒ‹‚Å‚±‚ÌÝ’è‚ðŽg—p‚·‚é‰Â”\«‚à‚ ‚è‚Ü‚·‚ª¡‚ÌŠƒXƒyƒ‹ƒuƒŒƒCƒJ[‚Ì‚Ý‚Å‚·B) magic‚ÉÝ’è‚·‚é‚ƃXƒyƒ‹ƒuƒŒƒCƒJ[‚ʼnr¥’†Ž~‚³‚ê‚Ü‚·B
+blow_count: ƒXƒLƒ‹‚æ‚éƒmƒbƒNƒoƒbƒN‹——£‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+
+
+==========================================================================
+3. db/skill_require_db.txt
+--------------------------------------------------------------------------
+
+id,list_hp,list_sp,list_hp_rate,list_sp_rate,list_zeny,list_weapon,state,spiritball,itemid1,amount1,itemid2,amount2,itemid3,amount3,itemid4,amount4,itemid5,amount5,itemid6,amount6,itemid7,amount7,itemid8,amount8,itemid9,amount9,itemid10,amount10
+
+id: ƒXƒLƒ‹‚ÌID‚Å‚·B
+list_hp: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éHP‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+list_sp: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éSP‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+list_hp_rate: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éHP‚̔䗦‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(Å‘åHP‚̔䗦‚Å‚Í‚È‚­Œ»ÝHP‚̔䗦‚Å‚·B)
+list_sp_rate: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éSP‚̔䗦‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B(Å‘åSP‚̔䗦‚Å‚Í‚È‚­Œ»ÝSP‚̔䗦‚Å‚·B)
+list_zeny: ƒXƒLƒ‹Žg—p‚ÅŒ¸‚éƒ[ƒj‚Ì—Ê‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+list_weapon: ƒXƒLƒ‹‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚é•Ší‚ðݒ肵‚Ü‚·B
+ 99 - ‘S‚Ä‚Ì•ŠíA0 - ‘fŽèA1 - ’ZŒ•A2 - •ÐŽèŒ•A3 - —¼ŽèŒ•A4 - •ÐŽè‘„A
+ 5 - —¼Žè‘„A6 - •ÐŽè•€A7 - —¼Žè•€A8 - •ÐŽè“ÝŠíA9 - —¼Žè“ÝŠíA10 - ƒƒbƒhA
+ 11 - ‹|A12 - ƒiƒbƒNƒ‹A13 - ŠyŠíA14 - •ÚA15 - –{A16 - ƒJƒ^[ƒ‹A
+ 17~22: “ñ“—¬
+ •¡”‚ðÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+state:ƒXƒLƒ‹‚ðŽg—p‚·‚éˆ×‚ÌðŒ‚ðݒ肵‚Ü‚·B•¡”‚ÌÝ’è‚Í‚Å‚«‚Ü‚¹‚ñB
+ none - ðŒ–³‚µ
+ hiding - ƒnƒCƒfƒBƒ“ƒOó‘Ô
+ cloacking - ƒNƒ[ƒLƒ“ƒOó‘ÔB
+ hidden: ƒnƒCƒfƒBƒ“ƒO‚âƒNƒƒbƒLƒ“ƒOó‘Ô
+ riding: ƒyƒRƒyƒR‚Éæ‚Á‚Ä‚¢‚é
+ falcon: ‘é‚ð˜A‚ê‚Ä‚¢‚é
+ cart: ƒJ[ƒg‚ð’…‚¯‚Ä‚¢‚é
+ shield: ƒV[ƒ‹ƒh‚ðŽ‚Á‚Ä‚¢‚é
+ sight: ƒTƒCƒgó‘Ô
+ explosionspirits: ”š—ô”g“®ó‘Ô
+ recover_weight_rate: Ž©‘R‰ñ•œ‚Å‚«‚éd—Ê
+ move_enable: ƒXƒLƒ‹Žg—pˆÊ’u‚ªˆÚ“®‰Â”\‚ÈêŠ
+ water: ‘«Œ³‚ª…
+spiritball: ƒXƒLƒ‹Žg—p‚É•K—v‚È‹C’e‚Ì”‚Å‚·BƒŒƒxƒ‹•Ê‚ÉÝ’è‚·‚éꇂÍu:v‚ðŽg‚¢‚Ü‚·B
+itemid1: ƒXƒLƒ‹Žg—p‚É•K—v‚ȃAƒCƒeƒ€‚ÌIDAƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÌꇃŒƒxƒ‹•Ê‚ÉŽg‚¤‚±‚Æ‚É‚È‚éƒAƒCƒeƒ€ID
+amount1: ƒXƒLƒ‹Žg—p‚É•K—v‚ȃAƒCƒeƒ€‚Ì”(”‚ª0‚ÌꇃAƒCƒeƒ€‚ÌID‚ª‚ ‚é‚ƃAƒCƒeƒ€‚ÍŒ¸‚ç‚È‚¢‚¯‚ÇG”}‚Æ‚µ‚Ä‚»‚̃AƒCƒeƒ€‚ðŽ‚Á‚Ä‚¢‚é•K—v‚ª‚ ‚é‚悤‚É‚È‚è‚Ü‚·B) ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÌꇃŒƒxƒ‹•Ê‚ÉŽg‚¤‚±‚Æ‚É‚È‚éƒAƒCƒeƒ€”
+itemid2: 㓯
+amount2: 㓯
+itemid3: 㓯
+amount3: 㓯
+itemid4: 㓯
+amount4: 㓯
+itemid5: 㓯
+amount5: 㓯
+itemid6: 㓯
+amount6: 㓯
+itemid7: 㓯
+amount7: 㓯
+itemid8: 㓯
+amount8: 㓯
+itemid9: 㓯
+amount9: 㓯
+itemid10: 㓯
+amount10: 㓯
+
+
+==========================================================================
+4. db/pet_db.txt
+--------------------------------------------------------------------------
+
+ MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDelay ,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
+
+MobID: ƒ‚ƒ“ƒXƒ^[ID‚Å‚·B
+Name: ‰pŒê–¼‘O(ƒ_ƒ~[)
+JName: –¼‘O
+ItemID: •ßŠl—p‚̃AƒCƒeƒ€ID
+EggID: —‘‚̃AƒCƒeƒ€ID
+AcceID: ‘•”õƒAƒNƒZƒTƒŠ[‚̃AƒCƒeƒ€ID
+FoodID: ‰a‚̃AƒCƒeƒ€ID
+Fullness: 1‰ñ‚̉a‚Å‚Ì–ž• “x‘‰Á—¦%
+HungryDelay: –ž• “x‚ª1%Œ¸‚éˆ×‚É‚©‚©‚鎞ŠÔ(•b)
+R_Hungry: ‹ó• Žž‰a‚â‚èe–§“x‘‰Á—Ê
+R_Full: ‚Æ‚Ä‚à–ž• Žž‰a‚â‚èe–§“xŒ¸­—Ê
+Intimate: •ßŠlŽže–§“x
+Die: Ž€–SŽže–§“xŒ¸­—Ê
+Capture: •ßŠl—¦(–œ•ª—¦)
+Speed: ˆÚ“®‘¬“x
+S_Performance: ƒXƒyƒVƒƒƒ‹ƒpƒtƒHƒ}ƒ“ƒX‚ª‚ ‚é‚©‚Ç‚¤‚©(1‚Å‚ ‚è0‚Å‚È‚µ)
+talk_convert_class: ‘䎌‚𑼂̃yƒbƒg‚Ì•¨‚É•ÏXB•ÏX‚µ‚½‚¢ƒyƒbƒg‚̃‚ƒ“ƒXƒ^[ID‚ð“ü‚ê‚Ü‚·B0‚ÌꇕÏX‚È‚µ‚Ń}ƒCƒiƒX‚ð“ü‚ê‚é‚ƃGƒ‚[ƒVƒ‡ƒ“ˆÈŠO‚Ì•¨(‘䎌)‚Í‘S‚Ä–³Ž‹‚³‚ê‚Ü‚·B
+attack_rate: Žx‰‡UŒ‚Šm—¦B(–œ•ª—¦) Žål‚ªUŒ‚‚ð‚µ‚©‚¯‚½ê‡B
+defence_attack_rate: Žx‰‡UŒ‚Šm—¦B(–œ•ª—¦) Žål‚ªUŒ‚‚ðŽó‚¯‚½ê‡B
+change_target_rate: UŒ‚–Ú•W‚ð•ÏX‚·‚éŠm—¦B(–œ•ª—¦)
+pet_script: ƒyƒbƒg‚ðŽ‚Á‚Ä‚¢‚鎞“K—p‚³‚ê‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚ðÝ’èB
+
+
+
+==========================================================================
+EOF
+--------------------------------------------------------------------------
diff --git a/doc/ea_job_system.txt b/doc/ea_job_system.txt
index 6265b4e30..8ea02735b 100644
--- a/doc/ea_job_system.txt
+++ b/doc/ea_job_system.txt
@@ -1,180 +1,180 @@
-//===== Athena Script =====================================
-//= eAthena Job System
-//===== By ================================================
-//= Skotlex
-//===== Version ===========================================
-//= 0.1
-//=========================================================
-//= 0.1 - First release, explained as well as I could.
-//===== Compatible With ===================================
-//= ... does not apply.
-//===== Description =======================================
-//= A reference description of eA's inner job system (for
-//= use on scripts through the eaclass and roclass script
-//= commands)
-//=========================================================
-
-Preface:
--------------------------------------------------------------------------------
-
- Most scripters are aware of the class values used in RO and their constants specified on db/const.txt. Each class has a number associated to it for referencing, so when someone's class is 9 that means they are a wizard. However, this list of job numbers has no real order behind it, and no logic behind it's assignation.
-
- You can add 3999 to a job to get their rebirth ID, but if you try to do the same to get the Baby class ID, that fails on the super Baby class. Also, there's no way to calculate, from a given first class, which classes would be their "evolution". That is, given the Archer's ID, you cannot just add a value that will return you "Hunter", and will still work if applied to the other classes. It didn't help much when they added Taekwon Boy, a first class, with an ID of 4046, and much later they added Ninja/Gunslinger with the IDs 25/24. How do you identify a first class on all this mess without recurring to very ugly range checks?
-
-The eA Job System:
--------------------------------------------------------------------------------
-
- Since the code also required to do this kind of checks for various skills (The Soul Linker Spirit buffs specially come to mind), an alternate job ID system was developed, which attempts to make more sense and make it easier to check where a particular job stands in relation to the rest.
-
- The scheme consists in that every job can be broken down by 3 criteria:
-
-- Base Job: This determines to which class-tree a job belongs. All jobs can be traced back to their root. The base job of all classes has to be one of the following:
-
- EAJ_NOVICE 0x0
- EAJ_SWORDMAN 0x1
- EAJ_MAGE 0x2
- EAJ_ARCHER 0x3
- EAJ_ACOLYTE 0x4
- EAJ_MERCHANT 0x5
- EAJ_THIEF 0x6
- EAJ_TAEKWON 0x7
- EAJ_GUNSLINGER 0x9
- EAJ_NINJA 0x10
-
-- Branch: All classes can be classified as "1st Class", "2-1 Class" or "2-2 Class":
-
- EAJL_2_1 0x100
- EAJL_2_2 0x200
- EAJL_2 0x300
-
-- The third category is type. Classes can either be normal, rebirth/advanced or adopted.
-
- EAJL_UPPER 0x1000
- EAJL_BABY 0x2000
-
-So using these three categories, any job class can be constructed from the others. Let's take a swordman, for example.
-
-The first step is basic swordman, with nothing else:
-
- EAJ_SWORDMAN
-
-The next step is to either become a 2-1 or a 2-2 job:
-
- EAJ_SWORDMAN|EAJL_2_1 -> EAJ_KNIGHT
- EAJ_SWORDMAN|EAJL_2_2 -> EAJ_CRUSADER
-
-if a swordman is adopted...
-
- EAJ_SWORDMAN|EAJL_BABY -> EAJ_BABY_SWORDMAN
-
-Or getting out the rebirth versions of a swordman:
-
- EAJ_SWORDMAN|EAJL_UPPER -> EAJ_SWORDMAN_HIGH
- EAJ_SWORDMAN|EAJL_2_1|EAJL_UPPER -> EAJ_LORD_KNIGHT
- EAJ_SWORDMAN|EAJL_2_2|EAJL_UPPER -> EAJ_PALADIN
-
-Why are we using the bitwise OR operand ('|') rather than just adding? Because the OR is wreck-proof:
-
- EAJ_SWORDMAN_HIGH|EAJL_UPPER -> EAJ_SWORDMAN_HIGH
-
-If we had used addition, we would have gotten a completely different result.
-
-The EAJL (eA Job Level) constants
--------------------------------------------------------------------------------
- There are a few constants which can be used to filter out and make job comparisons easier.
-
-EAJL_2_1:
- Checks if the class is a 2-1 class:
- if (@job&EAJL_2_1)
- mes "Using the classic 2-1 job, huh?";
-
-EAJL_2_2:
- Checks if the class is 2-2.
-
-EAJL_2:
- Checks if the class is a 2nd Class. If the check fails, you can be sure the character is a first class.
- if (!(@job&EAJL_2))
- mes "Will you wait until Job 50 to change?";
-
-EAJL_UPPER:
- Check if a class is Rebirth/Advanced:
- if(@job&EAJL_UPPER)
- mes "It must have taken you a LONG time...";
-
-EAJL_BABY:
- Check if a class is an adopted class.
- if (@job&EAJ_BABY)
- mes "Don't you hate being weak?";
-
-EAJ_UPPERMASK:
- The upper mask can be used to "strip" the upper/baby characteristics of a class, used when you want to know if someone is a certain class regardless of rebirth/adopted status. For example, the following code would go through for Monks, Champions and Baby Monks:
- if ((@job&EAJ_UPPERMASK) == EAJ_MONK)
- mes "Aren't knuckles such a cool weapon?";
-
- Note that if instead of EAJ_MONK you used EAJ_CHAMPION or EAJ_BABY_MONK, the check would had never passed, since the upper/baby state has been removed from the original job when checking.
-
-EAJ_BASEMASK:
- This mask strips also the 2nd class attributes. It can be used to check against the basic job of a character. For example, the following code would go through for Merchants (+Baby Merchant and High Merchant), Blacksmiths (+Baby blacksmiths and Whitesmith) and Alchemist (+Baby Alchemist and +Creator):
- if ((@job&EAJ_BASEMASK) == EAJ_MERCHANT)
- mes "Why I can't have discount like you guys do?";
-
- Note that, like before, if you try to check versus any of the other classes (High merchant, blacksmith, etc) instead of basic merchant, the check will always fail for the same reasons previously explained.
-
-The script commands eaclass, roclass:
--------------------------------------------------------------------------------
-
- These script commands are what you can use in scripts to convert between the RO classic job id, and eA's job system. The following script code demonstrates how to use these script commands to guess what your next job will be:
-
- set @eac, eaclass();
- if (@eac&EAJL_2)
- { //2nd class
- //If upper or baby, you can't rebirth
- if (@eac&(EAJL_UPPER|EAJL_BABY)) {
- mes "You can't go anywhere, can you?";
- close;
- }
- //Note that if we remove the EAJL_BABY check up there, the following check
- //will also fail, because there's no such thing as Rebirth-Baby classes.
- set @newclass, roclass(@eac|EAJL_UPPER);
- if (@newclass == -1) {
- //Don't you hate this of SG and SL?
- mes "Haha, your class doesn't has a rebirth version yet!";
- close;
- }
- mes "Still dreaming of the day you become a "+jobname(@newclass)+"?";
- close;
- }
- set @class1, roclass(@eac|EAJL_2_1);
- set @class2, roclass(@eac|EAJL_2_2);
- if (@class1 == -1) {
- //NJ/GS are the only classes who get stuck on their 1st class forever.
- mes "Looks like you are stuck forever on that class.";
- close;
- }
- if (@class2 == -1) {
- //Not quite true, currently the only 1st class that doesn't has two choices is Novice -> Supernovice (see s.novice section below)
- mes "Looks like you have no choice but to be a "+jobname(@class1)+".";
- close;
- }
- mes "Have you decided yet if you want to be a "+jobname(@class1)+" or a "+jobname(@class2)+"?";
- close;
-
-
-Oddities of the System:
--------------------------------------------------------------------------------
-About Bards and Dancers:
- These two classes are considered the same in eA's job system, since they both are the 2-2 job of archers. The only way to tell them apart is by using the gender of the character we are referring to. The script command roclass() will automatically use the gender of the attached player (or 'male' if there's no such player), but you can also explicitly pass the gender to the script command when there's no player attached.
-
-About Novices and Super Novices:
- These are treated a bit differently from you'd expect. Because.. for instance, a novice is not supposed to be a 1st class, but it is considered as one on this tree system:
-
- EAJ_NOVICE -> Novice
- EAJ_NOVICE|EAJL_2_1 -> EAJ_SUPER_NOVICE
- EAJ_NOVICE|EAJL_UPPER -> EAJ_NOVICE_HIGH
- EAJ_NOVICE|EAJL_BABY -> EAJ_BABY
- EAJ_NOVICE|EAJL_BABY|EAJL_2_1 -> EAJ_SUPER_BABY
-
- So as you can see, on this job system, the Super Novice is treated as the 2-1 job of a Novice, and the Novice job it's at the same level of the other 1st jobs. Even though that may seem like a hindrance, it makes it very easy to add a check to discard Novice types from a quest:
-
- if ((@job&EAJ_BASEMASK) == EAJ_NOVICE)
- //Novice class detected.
+//===== Athena Script =====================================
+//= eAthena Job System
+//===== By ================================================
+//= Skotlex
+//===== Version ===========================================
+//= 0.1
+//=========================================================
+//= 0.1 - First release, explained as well as I could.
+//===== Compatible With ===================================
+//= ... does not apply.
+//===== Description =======================================
+//= A reference description of eA's inner job system (for
+//= use on scripts through the eaclass and roclass script
+//= commands)
+//=========================================================
+
+Preface:
+-------------------------------------------------------------------------------
+
+ Most scripters are aware of the class values used in RO and their constants specified on db/const.txt. Each class has a number associated to it for referencing, so when someone's class is 9 that means they are a wizard. However, this list of job numbers has no real order behind it, and no logic behind it's assignation.
+
+ You can add 3999 to a job to get their rebirth ID, but if you try to do the same to get the Baby class ID, that fails on the super Baby class. Also, there's no way to calculate, from a given first class, which classes would be their "evolution". That is, given the Archer's ID, you cannot just add a value that will return you "Hunter", and will still work if applied to the other classes. It didn't help much when they added Taekwon Boy, a first class, with an ID of 4046, and much later they added Ninja/Gunslinger with the IDs 25/24. How do you identify a first class on all this mess without recurring to very ugly range checks?
+
+The eA Job System:
+-------------------------------------------------------------------------------
+
+ Since the code also required to do this kind of checks for various skills (The Soul Linker Spirit buffs specially come to mind), an alternate job ID system was developed, which attempts to make more sense and make it easier to check where a particular job stands in relation to the rest.
+
+ The scheme consists in that every job can be broken down by 3 criteria:
+
+- Base Job: This determines to which class-tree a job belongs. All jobs can be traced back to their root. The base job of all classes has to be one of the following:
+
+ EAJ_NOVICE 0x0
+ EAJ_SWORDMAN 0x1
+ EAJ_MAGE 0x2
+ EAJ_ARCHER 0x3
+ EAJ_ACOLYTE 0x4
+ EAJ_MERCHANT 0x5
+ EAJ_THIEF 0x6
+ EAJ_TAEKWON 0x7
+ EAJ_GUNSLINGER 0x9
+ EAJ_NINJA 0x10
+
+- Branch: All classes can be classified as "1st Class", "2-1 Class" or "2-2 Class":
+
+ EAJL_2_1 0x100
+ EAJL_2_2 0x200
+ EAJL_2 0x300
+
+- The third category is type. Classes can either be normal, rebirth/advanced or adopted.
+
+ EAJL_UPPER 0x1000
+ EAJL_BABY 0x2000
+
+So using these three categories, any job class can be constructed from the others. Let's take a swordman, for example.
+
+The first step is basic swordman, with nothing else:
+
+ EAJ_SWORDMAN
+
+The next step is to either become a 2-1 or a 2-2 job:
+
+ EAJ_SWORDMAN|EAJL_2_1 -> EAJ_KNIGHT
+ EAJ_SWORDMAN|EAJL_2_2 -> EAJ_CRUSADER
+
+if a swordman is adopted...
+
+ EAJ_SWORDMAN|EAJL_BABY -> EAJ_BABY_SWORDMAN
+
+Or getting out the rebirth versions of a swordman:
+
+ EAJ_SWORDMAN|EAJL_UPPER -> EAJ_SWORDMAN_HIGH
+ EAJ_SWORDMAN|EAJL_2_1|EAJL_UPPER -> EAJ_LORD_KNIGHT
+ EAJ_SWORDMAN|EAJL_2_2|EAJL_UPPER -> EAJ_PALADIN
+
+Why are we using the bitwise OR operand ('|') rather than just adding? Because the OR is wreck-proof:
+
+ EAJ_SWORDMAN_HIGH|EAJL_UPPER -> EAJ_SWORDMAN_HIGH
+
+If we had used addition, we would have gotten a completely different result.
+
+The EAJL (eA Job Level) constants
+-------------------------------------------------------------------------------
+ There are a few constants which can be used to filter out and make job comparisons easier.
+
+EAJL_2_1:
+ Checks if the class is a 2-1 class:
+ if (@job&EAJL_2_1)
+ mes "Using the classic 2-1 job, huh?";
+
+EAJL_2_2:
+ Checks if the class is 2-2.
+
+EAJL_2:
+ Checks if the class is a 2nd Class. If the check fails, you can be sure the character is a first class.
+ if (!(@job&EAJL_2))
+ mes "Will you wait until Job 50 to change?";
+
+EAJL_UPPER:
+ Check if a class is Rebirth/Advanced:
+ if(@job&EAJL_UPPER)
+ mes "It must have taken you a LONG time...";
+
+EAJL_BABY:
+ Check if a class is an adopted class.
+ if (@job&EAJ_BABY)
+ mes "Don't you hate being weak?";
+
+EAJ_UPPERMASK:
+ The upper mask can be used to "strip" the upper/baby characteristics of a class, used when you want to know if someone is a certain class regardless of rebirth/adopted status. For example, the following code would go through for Monks, Champions and Baby Monks:
+ if ((@job&EAJ_UPPERMASK) == EAJ_MONK)
+ mes "Aren't knuckles such a cool weapon?";
+
+ Note that if instead of EAJ_MONK you used EAJ_CHAMPION or EAJ_BABY_MONK, the check would had never passed, since the upper/baby state has been removed from the original job when checking.
+
+EAJ_BASEMASK:
+ This mask strips also the 2nd class attributes. It can be used to check against the basic job of a character. For example, the following code would go through for Merchants (+Baby Merchant and High Merchant), Blacksmiths (+Baby blacksmiths and Whitesmith) and Alchemist (+Baby Alchemist and +Creator):
+ if ((@job&EAJ_BASEMASK) == EAJ_MERCHANT)
+ mes "Why I can't have discount like you guys do?";
+
+ Note that, like before, if you try to check versus any of the other classes (High merchant, blacksmith, etc) instead of basic merchant, the check will always fail for the same reasons previously explained.
+
+The script commands eaclass, roclass:
+-------------------------------------------------------------------------------
+
+ These script commands are what you can use in scripts to convert between the RO classic job id, and eA's job system. The following script code demonstrates how to use these script commands to guess what your next job will be:
+
+ set @eac, eaclass();
+ if (@eac&EAJL_2)
+ { //2nd class
+ //If upper or baby, you can't rebirth
+ if (@eac&(EAJL_UPPER|EAJL_BABY)) {
+ mes "You can't go anywhere, can you?";
+ close;
+ }
+ //Note that if we remove the EAJL_BABY check up there, the following check
+ //will also fail, because there's no such thing as Rebirth-Baby classes.
+ set @newclass, roclass(@eac|EAJL_UPPER);
+ if (@newclass == -1) {
+ //Don't you hate this of SG and SL?
+ mes "Haha, your class doesn't has a rebirth version yet!";
+ close;
+ }
+ mes "Still dreaming of the day you become a "+jobname(@newclass)+"?";
+ close;
+ }
+ set @class1, roclass(@eac|EAJL_2_1);
+ set @class2, roclass(@eac|EAJL_2_2);
+ if (@class1 == -1) {
+ //NJ/GS are the only classes who get stuck on their 1st class forever.
+ mes "Looks like you are stuck forever on that class.";
+ close;
+ }
+ if (@class2 == -1) {
+ //Not quite true, currently the only 1st class that doesn't has two choices is Novice -> Supernovice (see s.novice section below)
+ mes "Looks like you have no choice but to be a "+jobname(@class1)+".";
+ close;
+ }
+ mes "Have you decided yet if you want to be a "+jobname(@class1)+" or a "+jobname(@class2)+"?";
+ close;
+
+
+Oddities of the System:
+-------------------------------------------------------------------------------
+About Bards and Dancers:
+ These two classes are considered the same in eA's job system, since they both are the 2-2 job of archers. The only way to tell them apart is by using the gender of the character we are referring to. The script command roclass() will automatically use the gender of the attached player (or 'male' if there's no such player), but you can also explicitly pass the gender to the script command when there's no player attached.
+
+About Novices and Super Novices:
+ These are treated a bit differently from you'd expect. Because.. for instance, a novice is not supposed to be a 1st class, but it is considered as one on this tree system:
+
+ EAJ_NOVICE -> Novice
+ EAJ_NOVICE|EAJL_2_1 -> EAJ_SUPER_NOVICE
+ EAJ_NOVICE|EAJL_UPPER -> EAJ_NOVICE_HIGH
+ EAJ_NOVICE|EAJL_BABY -> EAJ_BABY
+ EAJ_NOVICE|EAJL_BABY|EAJL_2_1 -> EAJ_SUPER_BABY
+
+ So as you can see, on this job system, the Super Novice is treated as the 2-1 job of a Novice, and the Novice job it's at the same level of the other 1st jobs. Even though that may seem like a hindrance, it makes it very easy to add a check to discard Novice types from a quest:
+
+ if ((@job&EAJ_BASEMASK) == EAJ_NOVICE)
+ //Novice class detected.
diff --git a/doc/effect_list.txt b/doc/effect_list.txt
index d8ec0cafb..715a94a39 100644
--- a/doc/effect_list.txt
+++ b/doc/effect_list.txt
@@ -1,360 +1,360 @@
-Effect list - #'s I found while testing, lots of possible advanced class effects we missed
-(mixed old effect list of valaris and spira's new list...)
-
-0-5. Attack Display
-6. Being Warped
-7. Being Healed
-8. Yellow Ripple Effect
-9. Different Type of Heal?
-10. Mammomite
-11. Endure
-12. Yellow cast aura
-13. Blue Box
-14. Blue heal? Blue pot?
-15. Soul Strike
-16. Hide animation
-17. Magnum Break
-18. Steal
-19. Invalid
-20. Envenom/Poison
-21. Slow Poison? (Envenom In Blue)
-22. Sight
-23. Stone Curse
-24. FireBall
-25. FireWall
-26. Nothing?
-27. Frost Driver Cast
-28. Frost Driver Hitting
-29. Lightning Bolt
-30. ThunderStorm
-31. Bubbles Appearing From The Character?
-32. Explosion
-33. Ruwach
-34. Warp out aura (blue)
-35. Casting Warp portal (blue)
-36. Warp portal (blue)
-37. Agi up
-38. Agi down
-39. Something being made
-40. Cross thing (paladin skill?)
-41. Angelus bell
-42. Blessing angels
-43. Dex + Agi up
-44. Little fog smoke.
-45. Faint little ball things.
-46. Sand?
-47. Torch
-48. Circle of blue flat things
-49. Firebolt/wall hits
-50. Spinning fire thing
-51. Icebolt hit
-52. JT Hit
-53. Puff of purpulish smoke?
-54-59. Cast animations
-60. Cast target circle
-61. Warp portal (for maps)
-62. Sight rasher
-63. Fire sphere from some skill
-64. Weird purple/red light
-65. some sort of mob hit???
-66. potion effect?
-67. Provoke
-68. MVP
-69. Skid trap sign
-70. Blue purple aura thing
-71. Spiral Yellow balls
-72. Bigger Spiral Yellow balls
-73. Blue/yellow ripple
-74. Icewall sicle
-75. Acolyte skill (3 singing girls)
-76. Big angel that spreads wings (some aco skill)
-77. Resurrection angel
-78. Status recovery
-79. Heaven drive spike? Earth spike?
-80. Spear boomerange
-81. Skill hit
-82. Detect hidden
-83. Another aco skill i don't know (angel comes out of green light)
-84. Yet another stupid angel.
-85. Lex Divinia
-86. Holy water?
-87. Lex aeterna
-88. Another damn priest/aco skill
-89. SG
-90. LoV
-91. Aco priest skill
-92. Meteor Storm
-93. JT ball
-94. JT hit
-95. Quagmire
-96. Some sort of cool looking fire hit?
-97. Firepillar hit
-98.
-99. Big blue light
-100. Yellow ball fountain
-101. Forge?
-102. Hammerfall
-103. Powerthrust?
-104. Weapon perfection?
-105. Nothing?
-106. Fire explosion.
-107. Fire explosion (from trap?)
-108. blue smoke with noise
-109. blue bubbles
-110. yellow smoke (trap?)
-111. some bs skill or something
-117. Waterball
-120. Sound effect
-132. Single Grimtooth
-138. Fire pillar
-139. Fireworks
-154. refine success
-155. refine fail
-156. Jobchange.str (crashes client)
-157. Levelup.str (crashes client)
-158. joblvup
-159. Pvp circle
-160. Woe circle?
-161. Rain
-162. Snow
-163. Sakura leaves
-164. nothing (npc/mob?)
-165. Weird ball thing
-166. turns sprite blue
-167. Taming Success (crashes client)
-168. Taming failed (crashes client)
-169. blue light
-170. explosion
-171. venom dust
-172. black aura
-173. red aura
-174. blue aura
-175. yellow aura
-176. purple aura
-177. red aura
-178. white aura
-179. purple aura
-180. darkness attack hit?
-181. water attack hit?
-182. wind attack hit
-183. self destruction
-184. nothing (npc/mob?)
-185. nothing (npc/mob?)
-186. yellow effect
-187. yellow effect
-188. yellow effect
-189. yellow effect
-190. yellow effect
-191. target (piercing attack or something)
-192. purple cloud hit
-193. mute or something (npc skill)
-194. stun attack?
-195. stone curse
-196. curse
-197. sleep
-198. nothing (npc/mob?)
-199. some weird bubble
-200-203. Parts of the level 99 Aura
-204-211. Healing Items Effect
-212. Damage Effect (9999)
-213. Shield Appears (Guard?)
-214. 3 Weird Things Appear Around You (They All Look The Same)
-215. Hide/Unhide?
-216. 2 Red Balls shoot out
-217. 2 Blue Balls shoot out
-218. Concentration Potion Effect
-219. Other Speed Potion
-220. Berserk Potion
-221. White Alien Abduction Beam
-222. Defender Skill Effect (Black Circle)
-223. Invalid Effect
-224. White Wisp Revolving around you
-225. Volcano Effect
-226. Grand Cross Effect
-227-230. Blank
-231. Yuno Effect (Takes Alittle While)
-232. Blank
-233. Fog
-234. Unknown To Me
-235. Unknown To Me
-236. Deluge Effect
-237. Wind Gale Effect
-238. Land Protect Effect
-239. Volcano Effect 2
-240. Deluge Effect 2
-241. Wind Gale Effect 2
-242. Land Protect Effect 2
-243. Invalid Effect
-244. Unknown To Me.
-245. Holy Cross Effect
-246. Shield Charge Effect
-247. Yuno Effect 2 (Larger)
-248. Status Recovery? (Shows An Angel On Top Of Your Head)
-249. Shield Boomerang
-250. Spear Quicken
-251. Devotion
-252. Reflect Shield (Yellow Circle)
-259. Green Abduction Beam
-260. Orange Abduction Beam
-261. red aura thing
-262. yellow things that shoot out
-263. Yellow ground effect.
-264. nothing (npc/mob?)
-265. laser beam ?!
-266. bunch of white shit flies out
-267. gun shot!
-268. money bag
-269. sword thing
-270. shield thing
-271. armor thing
-272. cape thing?
-273. Outter spinning white balls.
-274. flying gold
-275. spit
-276. stuff that flies out somewhat like crits
-277. white stuff that comes out around sprite
-295. frost joke
-296. scream
-298. fire bottle throwing
-300. Chemical Protection
-301. Blank
-302. Demonstration Fire Effect
-303. Weird Effect you turn yellow and see six lines (3 sets of 2) going slanted
-304. After being warped
-305. Pharmacy Success
-306. Pharmacy Failed
-307. Sunlight through the roof effect in Geffenia
-308. Blank
-309. Unknown to me
-310. Unknown to me
-311. Shout/Yell/Loud (Merchant Skill) Effect
-312-313. Heal Effect?
-314. Another Part of Warp/ Yuno Effect?
-315. Newer Safety Wall (Pink Portal)
-316. Another Part of Warp (The Ripple Floor Part)
-317. Full Warp Effect
-322. daylight
-323. daylight
-324. daylight
-328. asura strike word
-329. tripple strike
-333. Orange Leaves Falling
-334. blind (can stack it)
-335. poison (can stack it)
-336. defender shield?
-337. joblvup
-338. supernovice angel
-341. pink warp portal
-342. pink aura
-343. pink heart thing (cool)
-344. teleport in
-346. big blue ball
-347. wedding effect
-349. waterfall (horizonatal)
-350. waterfall (vertical)
-351. sm waterfall (horizonatal)
-352. sm waterfall (vertical)
-353. drk waterfall (horizonatal)
-354. drk waterfall (vertical)
-355. drk sm waterfall (horizonatal)
-356. drk sm waterfall (vertical)
-358. niflheim ghost
-359. niflheim bat slow
-360. niflheim bat fast
-361. shoots purple wave out
-362. nothing?
-363. valentine's day heart (wings)
-364. valentine's day heart
-365. falling cross
-368. make you red (berserk?)
-369. 2h quicken?
-371. lvup
-372. death
-373. smoke
-375. white outline around sprite
-376. makes red and shoots out stuff
-377. shoots out yellow shit
-380. shakes screen turns you all different colors
-387. spins you around shakes screen flashes white
-394. big red ball around you
-
-403 = mind breaker
-404 = spider web
-405 = nothing
-406 = explosion effect on the head
-407 = effect that starts big and fades in to your characters head
-
-408. Orange Bubble Grows Around
-409. Weird Poision Like Effect
-410. Rainbow
-411. (Usable, Just add in folder effect file called peong1.tga).errors/detoxify like.
-413. nothing?
-417. flash
-418. red critical explosion?
-419. Pulsating grey aura
-420. gradual shrink char (possible minimize effect?)
-421. instant minimize
-422. grow back, but not all the way (baby height)
-423. mega size
-424. makes sprite bright
-425. 4 brownish replicas of sprite fly off?
-426. shakes sprites (works on player sprites!)
-427. nothing? (maybe for npc/mobs)
-428. yellow sparks
-429. blue sparks
-430. blue sparks in different direction
-431. another blue spark variant
-432. can't find effect\elec1.tga
-433. nothing? (npc/mob?)
-434. white sparks
-435. can't find effect\storm2.tga (sometimes works and shows little tornado thing!
-436. white shield (for one of the defense skills?)
-437. blue aura (kinda like a comet!)
-438. another defense aura? blue ripples. blue pulsating shield
-439. can't fine effect\line3.tga
-440. high priest skill angel? Angelus type effect but with a cross
-441. another cast aura
-442. nothing? (npc/mob?)
-443. nothing? (npc/mob?)
-444. white lines that fire out
-445. your sprite flies up and disappears sometime sprite errors
-446. your sprite falls down
-447. nothing? (npc/mob?)
-448. nothing? (npc/mob?)
-449. turns you bright blue real quick
-450. darkcross effect (black grand cross)
-451. red soul strike?! (high wiz skill?)
-452. A jupital thunder type of effect, electricity pulsates around your char
-453. Smoke (electricity type) surrounds char, can move and effect is still their.
-454. black cast aura
-455. red electric that covers body
-456. looks like wind rushes up (reminds me of agi up but slower, bigger, and grey)
-457. forces attack animation. makes a dash like stance
-458. causes sprite to jiggle. char pulsates and distorts (like 426)
-459. effect\storm2.tga error, causes player sprite to spin around and you see a faint tornado aura
-460. same as 459.
-461. faint tornado aura
-462. same as 459.
-463. same as 459.
-464. same as 459.
-465. same as 459.
-466. nothing (npc/mob?)
-467. sprite error (effect\hanmoon1.tga?)
-468. sprite error (effect\hanmoon2.tga?)
-469. sprite error (effect\hanmoon3.tga?)
-470. sprite error (effect\hanmoon4.tga?)
-471. sprite error (effect\hanmoon5.tga?)
-472. sprite error (effect\hanmoon6.tga?)
-473. sprite error (effect\hanmoon7.tga?)
-474. nothing (npc/mob?)
-
-475-484 = slow fade to blind, each one continues to make it smaller and smaller
-485 = white critical explosion thing
-486 = blue critical explosion thing
-487 = black portal ground effect
-488 = orange spikey aura that stretches up to fire type points
-489 = yellow/gold of 488
-489 = blue version
-491 = a small expoision above the head
-492 = creates 1 small venom poison type of point on the ground
-493+ = invalid effects
+Effect list - #'s I found while testing, lots of possible advanced class effects we missed
+(mixed old effect list of valaris and spira's new list...)
+
+0-5. Attack Display
+6. Being Warped
+7. Being Healed
+8. Yellow Ripple Effect
+9. Different Type of Heal?
+10. Mammomite
+11. Endure
+12. Yellow cast aura
+13. Blue Box
+14. Blue heal? Blue pot?
+15. Soul Strike
+16. Hide animation
+17. Magnum Break
+18. Steal
+19. Invalid
+20. Envenom/Poison
+21. Slow Poison? (Envenom In Blue)
+22. Sight
+23. Stone Curse
+24. FireBall
+25. FireWall
+26. Nothing?
+27. Frost Driver Cast
+28. Frost Driver Hitting
+29. Lightning Bolt
+30. ThunderStorm
+31. Bubbles Appearing From The Character?
+32. Explosion
+33. Ruwach
+34. Warp out aura (blue)
+35. Casting Warp portal (blue)
+36. Warp portal (blue)
+37. Agi up
+38. Agi down
+39. Something being made
+40. Cross thing (paladin skill?)
+41. Angelus bell
+42. Blessing angels
+43. Dex + Agi up
+44. Little fog smoke.
+45. Faint little ball things.
+46. Sand?
+47. Torch
+48. Circle of blue flat things
+49. Firebolt/wall hits
+50. Spinning fire thing
+51. Icebolt hit
+52. JT Hit
+53. Puff of purpulish smoke?
+54-59. Cast animations
+60. Cast target circle
+61. Warp portal (for maps)
+62. Sight rasher
+63. Fire sphere from some skill
+64. Weird purple/red light
+65. some sort of mob hit???
+66. potion effect?
+67. Provoke
+68. MVP
+69. Skid trap sign
+70. Blue purple aura thing
+71. Spiral Yellow balls
+72. Bigger Spiral Yellow balls
+73. Blue/yellow ripple
+74. Icewall sicle
+75. Acolyte skill (3 singing girls)
+76. Big angel that spreads wings (some aco skill)
+77. Resurrection angel
+78. Status recovery
+79. Heaven drive spike? Earth spike?
+80. Spear boomerange
+81. Skill hit
+82. Detect hidden
+83. Another aco skill i don't know (angel comes out of green light)
+84. Yet another stupid angel.
+85. Lex Divinia
+86. Holy water?
+87. Lex aeterna
+88. Another damn priest/aco skill
+89. SG
+90. LoV
+91. Aco priest skill
+92. Meteor Storm
+93. JT ball
+94. JT hit
+95. Quagmire
+96. Some sort of cool looking fire hit?
+97. Firepillar hit
+98.
+99. Big blue light
+100. Yellow ball fountain
+101. Forge?
+102. Hammerfall
+103. Powerthrust?
+104. Weapon perfection?
+105. Nothing?
+106. Fire explosion.
+107. Fire explosion (from trap?)
+108. blue smoke with noise
+109. blue bubbles
+110. yellow smoke (trap?)
+111. some bs skill or something
+117. Waterball
+120. Sound effect
+132. Single Grimtooth
+138. Fire pillar
+139. Fireworks
+154. refine success
+155. refine fail
+156. Jobchange.str (crashes client)
+157. Levelup.str (crashes client)
+158. joblvup
+159. Pvp circle
+160. Woe circle?
+161. Rain
+162. Snow
+163. Sakura leaves
+164. nothing (npc/mob?)
+165. Weird ball thing
+166. turns sprite blue
+167. Taming Success (crashes client)
+168. Taming failed (crashes client)
+169. blue light
+170. explosion
+171. venom dust
+172. black aura
+173. red aura
+174. blue aura
+175. yellow aura
+176. purple aura
+177. red aura
+178. white aura
+179. purple aura
+180. darkness attack hit?
+181. water attack hit?
+182. wind attack hit
+183. self destruction
+184. nothing (npc/mob?)
+185. nothing (npc/mob?)
+186. yellow effect
+187. yellow effect
+188. yellow effect
+189. yellow effect
+190. yellow effect
+191. target (piercing attack or something)
+192. purple cloud hit
+193. mute or something (npc skill)
+194. stun attack?
+195. stone curse
+196. curse
+197. sleep
+198. nothing (npc/mob?)
+199. some weird bubble
+200-203. Parts of the level 99 Aura
+204-211. Healing Items Effect
+212. Damage Effect (9999)
+213. Shield Appears (Guard?)
+214. 3 Weird Things Appear Around You (They All Look The Same)
+215. Hide/Unhide?
+216. 2 Red Balls shoot out
+217. 2 Blue Balls shoot out
+218. Concentration Potion Effect
+219. Other Speed Potion
+220. Berserk Potion
+221. White Alien Abduction Beam
+222. Defender Skill Effect (Black Circle)
+223. Invalid Effect
+224. White Wisp Revolving around you
+225. Volcano Effect
+226. Grand Cross Effect
+227-230. Blank
+231. Yuno Effect (Takes Alittle While)
+232. Blank
+233. Fog
+234. Unknown To Me
+235. Unknown To Me
+236. Deluge Effect
+237. Wind Gale Effect
+238. Land Protect Effect
+239. Volcano Effect 2
+240. Deluge Effect 2
+241. Wind Gale Effect 2
+242. Land Protect Effect 2
+243. Invalid Effect
+244. Unknown To Me.
+245. Holy Cross Effect
+246. Shield Charge Effect
+247. Yuno Effect 2 (Larger)
+248. Status Recovery? (Shows An Angel On Top Of Your Head)
+249. Shield Boomerang
+250. Spear Quicken
+251. Devotion
+252. Reflect Shield (Yellow Circle)
+259. Green Abduction Beam
+260. Orange Abduction Beam
+261. red aura thing
+262. yellow things that shoot out
+263. Yellow ground effect.
+264. nothing (npc/mob?)
+265. laser beam ?!
+266. bunch of white shit flies out
+267. gun shot!
+268. money bag
+269. sword thing
+270. shield thing
+271. armor thing
+272. cape thing?
+273. Outter spinning white balls.
+274. flying gold
+275. spit
+276. stuff that flies out somewhat like crits
+277. white stuff that comes out around sprite
+295. frost joke
+296. scream
+298. fire bottle throwing
+300. Chemical Protection
+301. Blank
+302. Demonstration Fire Effect
+303. Weird Effect you turn yellow and see six lines (3 sets of 2) going slanted
+304. After being warped
+305. Pharmacy Success
+306. Pharmacy Failed
+307. Sunlight through the roof effect in Geffenia
+308. Blank
+309. Unknown to me
+310. Unknown to me
+311. Shout/Yell/Loud (Merchant Skill) Effect
+312-313. Heal Effect?
+314. Another Part of Warp/ Yuno Effect?
+315. Newer Safety Wall (Pink Portal)
+316. Another Part of Warp (The Ripple Floor Part)
+317. Full Warp Effect
+322. daylight
+323. daylight
+324. daylight
+328. asura strike word
+329. tripple strike
+333. Orange Leaves Falling
+334. blind (can stack it)
+335. poison (can stack it)
+336. defender shield?
+337. joblvup
+338. supernovice angel
+341. pink warp portal
+342. pink aura
+343. pink heart thing (cool)
+344. teleport in
+346. big blue ball
+347. wedding effect
+349. waterfall (horizonatal)
+350. waterfall (vertical)
+351. sm waterfall (horizonatal)
+352. sm waterfall (vertical)
+353. drk waterfall (horizonatal)
+354. drk waterfall (vertical)
+355. drk sm waterfall (horizonatal)
+356. drk sm waterfall (vertical)
+358. niflheim ghost
+359. niflheim bat slow
+360. niflheim bat fast
+361. shoots purple wave out
+362. nothing?
+363. valentine's day heart (wings)
+364. valentine's day heart
+365. falling cross
+368. make you red (berserk?)
+369. 2h quicken?
+371. lvup
+372. death
+373. smoke
+375. white outline around sprite
+376. makes red and shoots out stuff
+377. shoots out yellow shit
+380. shakes screen turns you all different colors
+387. spins you around shakes screen flashes white
+394. big red ball around you
+
+403 = mind breaker
+404 = spider web
+405 = nothing
+406 = explosion effect on the head
+407 = effect that starts big and fades in to your characters head
+
+408. Orange Bubble Grows Around
+409. Weird Poision Like Effect
+410. Rainbow
+411. (Usable, Just add in folder effect file called peong1.tga).errors/detoxify like.
+413. nothing?
+417. flash
+418. red critical explosion?
+419. Pulsating grey aura
+420. gradual shrink char (possible minimize effect?)
+421. instant minimize
+422. grow back, but not all the way (baby height)
+423. mega size
+424. makes sprite bright
+425. 4 brownish replicas of sprite fly off?
+426. shakes sprites (works on player sprites!)
+427. nothing? (maybe for npc/mobs)
+428. yellow sparks
+429. blue sparks
+430. blue sparks in different direction
+431. another blue spark variant
+432. can't find effect\elec1.tga
+433. nothing? (npc/mob?)
+434. white sparks
+435. can't find effect\storm2.tga (sometimes works and shows little tornado thing!
+436. white shield (for one of the defense skills?)
+437. blue aura (kinda like a comet!)
+438. another defense aura? blue ripples. blue pulsating shield
+439. can't fine effect\line3.tga
+440. high priest skill angel? Angelus type effect but with a cross
+441. another cast aura
+442. nothing? (npc/mob?)
+443. nothing? (npc/mob?)
+444. white lines that fire out
+445. your sprite flies up and disappears sometime sprite errors
+446. your sprite falls down
+447. nothing? (npc/mob?)
+448. nothing? (npc/mob?)
+449. turns you bright blue real quick
+450. darkcross effect (black grand cross)
+451. red soul strike?! (high wiz skill?)
+452. A jupital thunder type of effect, electricity pulsates around your char
+453. Smoke (electricity type) surrounds char, can move and effect is still their.
+454. black cast aura
+455. red electric that covers body
+456. looks like wind rushes up (reminds me of agi up but slower, bigger, and grey)
+457. forces attack animation. makes a dash like stance
+458. causes sprite to jiggle. char pulsates and distorts (like 426)
+459. effect\storm2.tga error, causes player sprite to spin around and you see a faint tornado aura
+460. same as 459.
+461. faint tornado aura
+462. same as 459.
+463. same as 459.
+464. same as 459.
+465. same as 459.
+466. nothing (npc/mob?)
+467. sprite error (effect\hanmoon1.tga?)
+468. sprite error (effect\hanmoon2.tga?)
+469. sprite error (effect\hanmoon3.tga?)
+470. sprite error (effect\hanmoon4.tga?)
+471. sprite error (effect\hanmoon5.tga?)
+472. sprite error (effect\hanmoon6.tga?)
+473. sprite error (effect\hanmoon7.tga?)
+474. nothing (npc/mob?)
+
+475-484 = slow fade to blind, each one continues to make it smaller and smaller
+485 = white critical explosion thing
+486 = blue critical explosion thing
+487 = black portal ground effect
+488 = orange spikey aura that stretches up to fire type points
+489 = yellow/gold of 488
+489 = blue version
+491 = a small expoision above the head
+492 = creates 1 small venom poison type of point on the ground
+493+ = invalid effects
diff --git a/doc/help.txt b/doc/help.txt
index 49ad23506..49502d8b1 100644
--- a/doc/help.txt
+++ b/doc/help.txt
@@ -1,478 +1,478 @@
-GM Commands Help File
-By Akaru (updated by erKURITA)
------------------------
-To use these commands, type them inside the message window where you usually type to chat.
-
-<ANNOUNCEMENT COMMANDS>
-
-/nb <message>
-@kami <message>
-Lets you make a GM global announcement without a name (in yellow)
-
-@kamib <message>
-Lets you make a GM global announcement without a name (in blue)
-
-/b/@broadcast <message>
-Lets you make a GM global announcement with your name
-
-/lb/@localbroadcast <message>
-Broadcasts a GM message with name of the GM (in yellow) ONLY on your map
-
-/nlb <message>
-Broadcasts a GM message without name of the GM (in yellow) ONLY on your map
-
-<INFORMATION COMMANDS>
-
-@who [match_text]
-Lists who is currently online in your server and their location
-@who2 [match_text]
-Lists who is currently online in your server and their job
-@who3 [match_text]
-Lists who is currently online in your server and their party/guild
-
-@whomap [map]
-Display a listing of who is online and where in a specifical map
-@whomap2 [map]
-Display a listing of who is online and their job in a specifical map
-@whomap3 [map]
-Display a listing of who is online and their party/guild in a specifical map
-
-@whogm [match_text]
-Like @who+@who2+who3, but only for GM.
-
-@where <char name>
-Tells you the location of a character
-
-@charstatsall
-Displays stats of all characters.
-
-@charitemlist <char name>
-Displays all items of a player.
-
-@charstoragelist <char name>
-Displays all items of a player's storage.
-
-@charcartlist <char name>
-Displays all items of a player's cart.
-
-@time/@date/@server_date/@serverdate/@server_time/@servertime
-Display the date/time of the server
-
-@idsearch <part_of_item_name>
-Search all items that name have part_of_item_name
-
-@ignorelist
-Displays your ignore list
-
-@mapinfo [<1-3> [map]]
-Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
-
-@rates
-Displays the server rates.
-
-@uptime
-Show server uptime
-
-@showdelay
-Shows/Hides the "there is a delay after a skill" message.
-
-@mobinfo / @monsterinfo / @mi
-Show Monster info (rates, stats, drops, MVP stuff)
-
-@iteminfo / @ii
-Show Item info (type, price, etc)
-
-@refresh
-Syncs the position of the player on the client with the one stored in the server.
-
-@time / @date / @server_date / @serverdate / @servertime / @server_time
-Gives server time
-
-@version
-Displays SVN Version of the server
-
-<CONTROL COMMANDS>
-
-@die
-Kill yourself :)
-
-@alive
-Revive yourself from death
-
-@kill <char name>
-Kills specified character name
-Example:
-@kill TestChar -> The character named TestChar is dead
-
-@nuke <char name>
-Kills specified character (nuclear effect).
-
-@save
-Sets save point as current location
-
-@load
-Warps you to your save point (a.k.a. butterfly wing)
-
-@warp <map name> <x> <y>
-@rura <map name> <x> <y>
-@mapmove <map name> <x> <y>
-/mm <map name> <x> <y>
-/mapmove <map name> <x> <y>
-Warps you to the selected position
-Example:
-@warp morocc 150 160 -> Warps you to Morroc (X:150, Y:160)
-@rura prontera 50 80 -> Warps you to Prontera (X:50, Y:80)
-
-@jump [x [y]]
-Teleports you randomly in the map (a.k.a. fly wing)
-
-/shift/@jumpto/@warpto/@goto <char name>
-Warps you to selected character
-Example:
-@jumpto TestChar -> You are warped to TestChar's current location
-
-@go <number/city_name>
-Warps you to a set city:
- -3: (Memo point 2) 1: morocc 5: izlude 9: yuno 13: niflheim
- -2: (Memo point 1) 2: geffen 6: aldebaran 10: amatsu 14: louyang
- -1: (Memo point 0) 3: payon 7: xmas (lutie) 11: gonryun 15: start point
- 0: prontera 4: alberta 8: comodo 12: umbala 16: prison/jail
-
-/hide/@hide
-GM Hide. Perfect hide that's totally invinsible.
-
-@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
-@storage - Opens storage
-
-/recall/@recall <char name> - Warps target character to you.
-@recallall - Recalls everyone on the server to you.
-@guildrecall <guild_name/id> - Warps all online character of a guild to you.
-@partyrecall <party_name/id> - Warps all online character of a party to you.
-@revive <char name> - Revives target character.
-
-<SPAWNING COMMANDS>
-
-/item <item_name> - Gives you 1 of the desired item.
-@item <item name or ID> <quantity> - Gives you the desired item.
-
-/monster <monster_name> - Spawns 1 of the desired monster.
-@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
-@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
-@spawn/@monster/@summon/@monster2 "desired monster name" <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
-@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
- Spawns the desired monster with any desired name.
-
-<MAP OPTIONS COMMANDS>
-
-@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
-
-<CHARACTER CONTROL COMMANDS>
-@baselvlup <number of levels> - Raises your base level the desired number of levels. The max is 99
-@joblvlup <number of levels> - Raises your job level the desired number of levels. The max is 50
-
-@job/@jobchange <job ID>
-Changes your job to the job assigned to the ID
- 0 Novice 7 Knight 14 Crusader 22 Formal
- 1 Swordman 8 Priest 15 Monk 23 Super Novice
- 2 Mage 9 Wizard 16 Sage
- 3 Archer 10 Blacksmith 17 Rogue
- 4 Acolyte 11 Hunter 18 Alchem
- 5 Merchant 12 Assassin 19 Bard
- 6 Thief 13 Knight2 20 Dancer
- 21 Crusader2
- 24 Novice High 31 Lord Knight 38 Paladin
- 25 Swordman High 32 High Priest 39 Monk
- 26 Mage High 33 High Wizard 40 Professor
- 27 Archer High 34 Whitesmith 41 Stalker
- 28 Acolyte High 35 Sniper 42 Creator
- 29 Merchant High 36 Assassin Cross 43 Clown
- 30 Thief High 37 Peko Knight 44 Gypsy
- 45 Paladin2
-
-@option <param1> <param2> <param3>
-Changes options for your character
- <param1> <param2> (Stackable) <param3> (Stackable)
- 01 Petrified 01 Poison 01 Sight
- 02 Frozen 02 Cursed 02 Hide
- 03 Stunned 04 Silenced 04 Cloak
- 04 Sleeping 08 ??? 08 Level 1 Cart
- 06 darkness 16 darkness 16 Falcon
- 32 Peco Peco riding
- 64 GM Perfect Hide
- 128 Level 2 Cart
- 256 Level 3 Cart
- 512 Level 4 Cart
- 1024 Level 5 Cart
- 2048 Orc Head
- 4096 Wedding Sprites
- 8192 Ruwach
-
-@speed <1-1000>
-Changes you walking speed.
-1(Fastest)<---140(Default)----------------->1000(Slowest)
-
-@disguise <monster_name_or_monster_ID>
-Change your appearence to other players to a mob.
-
-@undisguise
-Restore your normal appearance.
-
-@model <hair ID> <hair color> <clothes color>
-Changes your characters appearance (Hair type, Hair Colour and/or Clothes Colour)
-
- Hair ID (0-17) Hair Colour (0-8) Clothes Colour (0-4)
- 0 Default 0 Default
- 1 Blonde 1 Red
- 2 Purple 2 Green
- 3 Brown 3 White
- 4 Green 4 Brown
- 5 Blue
- 6 White
- 7 Black
- 8 Red
-
-@effect <effect_id> [flag]
-Give an efect to your character.
-
-@stpoint <number of points>
-Gives you the desired number of stat points.
-
-@skpoint <number of points>
-Gives you the desired number of skill points.
-
-@zeny <amount>
-Gives you desired amount of Zeny.
-
-@str <amount>
-@agi <amount>
-@vit <amount>
-@int <amount>
-@dex <amount>
-@luk <amount>
-Adds desired amount to any stat. For example "@str 10" raises your str by 10
-
-@spiritball <number>
-Number = 1-1000
-Gives you monk "spirit spheres" like from the skill "Call Spirits"
-(If the number you use is > 1000, your server may become instable or crash)
-
-@memo [memo_position]
-set/change a memo location (no position: display memo points).
-
-@questskill <id>
-Gives you the specified quest skill
-
-@lostskill <id>
-Takes away the specified quest skill from you
-
-Quest Skill ID:
- Novice
- 142 = Emergency Care
- 143 = Act dead
- Swordsman
- 144 = Moving HP Recovery
- 145 = Attack Weak Point
- 146 = Auto Berserk
- Magician
- 157 = Energy Coat
- Archer
- 147 = Arrow Creation
- 148 = Charge Arrows
- Acolyte
- 156 = Holy Light
- Merchant
- 153 = Cart Revolution
- 154 = Change Cart
- 155 = Crazy Uproar/Loud Voice
- Thief
- 149 = Throw Sand
- 150 = Back Sliding
- 151 = Take Stone
- 152 = Stone Throw
-
-<GUILD CONTROL COMMANDS>
-
-@guildlvup/@guildlvlup <# of levels> - Raise Guild by desired number of levels
-
-<EQUIPMENT COMMANDS>
-
-@refine <position> <+/-amount>
-Upgrades equipment at the position specified (Stackable)
-0 - All
-1 - Lower Head
-2 - Right Hand
-4 - Robe/Garment
-8 - Left Accessory
-16 - Body/Armor
-32 - Left Hand
-64 - Feet
-128 - Right Accessory
-256 - Top Head
-512 - Mid Head
-
-Example:
-@refine 34 10 - Refines a 2 handed weapon to +10
-@refine 16 4 - Refines the body/armor to +4
-
-@produce <equip name or equip ID> <element> <# of very's>
-Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
-# of very's: 0=None 1=Very Strong 2=Very Very Strong 3=Very Very Very Strong
-
-Example: @produce 1163 3 3 - Produces a Very Very Very Strong (Your Nick)'s Fire Claymore
-
-<Q-PET/cutePET COMMANDS>
-@hatch - Create a pet from your inventory eggs list.
-@makeegg <ID> - Gives pet egg for monster ID in pet DB
-@petfriendly <#> - Set pet friendly amount (0-1000) 0 = Min, 1000 = Max
-@pethungry <#> - Set pet hungry amount (0-100) 0 = Min, 100 = Max
-@petrename - Re-enable pet rename
-
-<REMOTE CHAR COMMANDS>
-@charwarp <map name> <x> <y> <char name>
-Warps character to location of choice
-Example:
-@charwarp morocc 150 160 TestChar -> Warps TestChar to Morroc (X:150, Y:160)
-
-@charstats <char name>
-Displays the character's stats.
-
-@charignorelist <char name>
-Displays ignore list of the player
-
-@inall <char name>
-Allows all wispers for the player
-
-@exall <char name>
-Blocks all wispers for the player
-
-@charoption <param1> <param2> <param3> <char name>
-Does the same as the @option command only to target character.
-
-@charmountpeco <charname>
-Give/remove to a player a peco (Class is required, but not skill).
-
-@charpetrename <charname>
-Re-enable pet rename to a player.
-
-@charsave <map> <x> <y> <char name>
-Changes the target player's respawn point.
-
-@charbaselvl <#> <char name>
-Change a character's base level.
-
-@charjlvl <#> <char name>
-Change a character's job level.
-
-@charjob/@charjobchange <job ID> <char name>
-Changes target character's job.
-
-@charzeny <amount> <char name>
-Give/take a player's Zeny
-
-@charstpoint <amount> <char name>
-Give/take a player's stat points
-
-@charskpoint <amount> <char name>
-give/take a player's skill points
-
-@charquestskill <#> <charname>
-Gives to a player the specified quest skill.
-
-@charlostskill <#> <charname>
-Takes away the specified quest skill from the player.
-
-@chardelitem <item_name_or_ID> <quantity> <player>
-Remove items from a character
-
-@charmodel <hair type> <hair color> <clothes color> <char name>
-Changes a player's model
-
-@chardisguise <monster_name_or_monster_ID> <char name>
-Changes disguise of a player
-
-@charundisguise <char name>
-Cancels disguise of a player
-
-@charchangesex <name>
-Changes sex of a player (all characters of the account)
-
-@charblock/@block <name>
-Blocks definitively a account
-
-@charunblock/@unblock <name>
-Unblocks a account
-
-@charban/@ban/@banish/@charbanish <time> <name>
-Ban temporarily a account
- time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
- Example: @ban +1m-2mn1s-6y testplayer
-
-@charunban/@unban/@unbanish/@uncharbanish <name>
-Unban a account
-
-@jail <char_name>
-Sends specified character in jails
-
-@unjail/@discharge <char_name>
-Discharges specified character/prisoner
-
-<MASS CONTROL COMMANDS>
-@night
-All characters are in darkness
-
-@day
-
-@option 00 00 00 are used on all characters
-
-@doom
-Kills all NON GM chars on the server.
-
-@doommap
-Kills all non GM characters on the map.
-
-@raise
-Resurrects all characters on the server.
-
-@raisemap
-Resurrects all characters on the map.
-
-@kick <charname>
-Kicks specified character off the server
-
-@kickall
-Kick all characters off the server
-
-<OTHER COMMANDS>
-
-@gat ---- ƒfƒoƒbƒO—p(Žü•Ógat‚𒲂ׂé)
-@packet ---- ƒfƒoƒbƒO—p(ƒpƒPƒbƒgFX)
-
-@mapexit
-Kick all players and shut down map-server.
-
-@reloaditemdb
-Reload item database (admin command)
-
-@reloadmobdb
-Reload monster database (admin command)
-
-@reloadskilldb
-Reload skills definition database (admin command)
-
-@reloadscript
-Reload all scripts (admin command)
-
-@reloadgmdb
-Reload GM levels (admin command)
-
-@enablenpc <NPC_name>
-Enable a NPC (admin command)
-
-@disablenpc <NPC_name>
-Disable a NPC (admin command)
-
-@email <actual@email> <new@email>
+GM Commands Help File
+By Akaru (updated by erKURITA)
+-----------------------
+To use these commands, type them inside the message window where you usually type to chat.
+
+<ANNOUNCEMENT COMMANDS>
+
+/nb <message>
+@kami <message>
+Lets you make a GM global announcement without a name (in yellow)
+
+@kamib <message>
+Lets you make a GM global announcement without a name (in blue)
+
+/b/@broadcast <message>
+Lets you make a GM global announcement with your name
+
+/lb/@localbroadcast <message>
+Broadcasts a GM message with name of the GM (in yellow) ONLY on your map
+
+/nlb <message>
+Broadcasts a GM message without name of the GM (in yellow) ONLY on your map
+
+<INFORMATION COMMANDS>
+
+@who [match_text]
+Lists who is currently online in your server and their location
+@who2 [match_text]
+Lists who is currently online in your server and their job
+@who3 [match_text]
+Lists who is currently online in your server and their party/guild
+
+@whomap [map]
+Display a listing of who is online and where in a specifical map
+@whomap2 [map]
+Display a listing of who is online and their job in a specifical map
+@whomap3 [map]
+Display a listing of who is online and their party/guild in a specifical map
+
+@whogm [match_text]
+Like @who+@who2+who3, but only for GM.
+
+@where <char name>
+Tells you the location of a character
+
+@charstatsall
+Displays stats of all characters.
+
+@charitemlist <char name>
+Displays all items of a player.
+
+@charstoragelist <char name>
+Displays all items of a player's storage.
+
+@charcartlist <char name>
+Displays all items of a player's cart.
+
+@time/@date/@server_date/@serverdate/@server_time/@servertime
+Display the date/time of the server
+
+@idsearch <part_of_item_name>
+Search all items that name have part_of_item_name
+
+@ignorelist
+Displays your ignore list
+
+@mapinfo [<1-3> [map]]
+Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
+
+@rates
+Displays the server rates.
+
+@uptime
+Show server uptime
+
+@showdelay
+Shows/Hides the "there is a delay after a skill" message.
+
+@mobinfo / @monsterinfo / @mi
+Show Monster info (rates, stats, drops, MVP stuff)
+
+@iteminfo / @ii
+Show Item info (type, price, etc)
+
+@refresh
+Syncs the position of the player on the client with the one stored in the server.
+
+@time / @date / @server_date / @serverdate / @servertime / @server_time
+Gives server time
+
+@version
+Displays SVN Version of the server
+
+<CONTROL COMMANDS>
+
+@die
+Kill yourself :)
+
+@alive
+Revive yourself from death
+
+@kill <char name>
+Kills specified character name
+Example:
+@kill TestChar -> The character named TestChar is dead
+
+@nuke <char name>
+Kills specified character (nuclear effect).
+
+@save
+Sets save point as current location
+
+@load
+Warps you to your save point (a.k.a. butterfly wing)
+
+@warp <map name> <x> <y>
+@rura <map name> <x> <y>
+@mapmove <map name> <x> <y>
+/mm <map name> <x> <y>
+/mapmove <map name> <x> <y>
+Warps you to the selected position
+Example:
+@warp morocc 150 160 -> Warps you to Morroc (X:150, Y:160)
+@rura prontera 50 80 -> Warps you to Prontera (X:50, Y:80)
+
+@jump [x [y]]
+Teleports you randomly in the map (a.k.a. fly wing)
+
+/shift/@jumpto/@warpto/@goto <char name>
+Warps you to selected character
+Example:
+@jumpto TestChar -> You are warped to TestChar's current location
+
+@go <number/city_name>
+Warps you to a set city:
+ -3: (Memo point 2) 1: morocc 5: izlude 9: yuno 13: niflheim
+ -2: (Memo point 1) 2: geffen 6: aldebaran 10: amatsu 14: louyang
+ -1: (Memo point 0) 3: payon 7: xmas (lutie) 11: gonryun 15: start point
+ 0: prontera 4: alberta 8: comodo 12: umbala 16: prison/jail
+
+/hide/@hide
+GM Hide. Perfect hide that's totally invinsible.
+
+@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
+@storage - Opens storage
+
+/recall/@recall <char name> - Warps target character to you.
+@recallall - Recalls everyone on the server to you.
+@guildrecall <guild_name/id> - Warps all online character of a guild to you.
+@partyrecall <party_name/id> - Warps all online character of a party to you.
+@revive <char name> - Revives target character.
+
+<SPAWNING COMMANDS>
+
+/item <item_name> - Gives you 1 of the desired item.
+@item <item name or ID> <quantity> - Gives you the desired item.
+
+/monster <monster_name> - Spawns 1 of the desired monster.
+@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
+@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
+@spawn/@monster/@summon/@monster2 "desired monster name" <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
+@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
+ Spawns the desired monster with any desired name.
+
+<MAP OPTIONS COMMANDS>
+
+@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
+
+<CHARACTER CONTROL COMMANDS>
+@baselvlup <number of levels> - Raises your base level the desired number of levels. The max is 99
+@joblvlup <number of levels> - Raises your job level the desired number of levels. The max is 50
+
+@job/@jobchange <job ID>
+Changes your job to the job assigned to the ID
+ 0 Novice 7 Knight 14 Crusader 22 Formal
+ 1 Swordman 8 Priest 15 Monk 23 Super Novice
+ 2 Mage 9 Wizard 16 Sage
+ 3 Archer 10 Blacksmith 17 Rogue
+ 4 Acolyte 11 Hunter 18 Alchem
+ 5 Merchant 12 Assassin 19 Bard
+ 6 Thief 13 Knight2 20 Dancer
+ 21 Crusader2
+ 24 Novice High 31 Lord Knight 38 Paladin
+ 25 Swordman High 32 High Priest 39 Monk
+ 26 Mage High 33 High Wizard 40 Professor
+ 27 Archer High 34 Whitesmith 41 Stalker
+ 28 Acolyte High 35 Sniper 42 Creator
+ 29 Merchant High 36 Assassin Cross 43 Clown
+ 30 Thief High 37 Peko Knight 44 Gypsy
+ 45 Paladin2
+
+@option <param1> <param2> <param3>
+Changes options for your character
+ <param1> <param2> (Stackable) <param3> (Stackable)
+ 01 Petrified 01 Poison 01 Sight
+ 02 Frozen 02 Cursed 02 Hide
+ 03 Stunned 04 Silenced 04 Cloak
+ 04 Sleeping 08 ??? 08 Level 1 Cart
+ 06 darkness 16 darkness 16 Falcon
+ 32 Peco Peco riding
+ 64 GM Perfect Hide
+ 128 Level 2 Cart
+ 256 Level 3 Cart
+ 512 Level 4 Cart
+ 1024 Level 5 Cart
+ 2048 Orc Head
+ 4096 Wedding Sprites
+ 8192 Ruwach
+
+@speed <1-1000>
+Changes you walking speed.
+1(Fastest)<---140(Default)----------------->1000(Slowest)
+
+@disguise <monster_name_or_monster_ID>
+Change your appearence to other players to a mob.
+
+@undisguise
+Restore your normal appearance.
+
+@model <hair ID> <hair color> <clothes color>
+Changes your characters appearance (Hair type, Hair Colour and/or Clothes Colour)
+
+ Hair ID (0-17) Hair Colour (0-8) Clothes Colour (0-4)
+ 0 Default 0 Default
+ 1 Blonde 1 Red
+ 2 Purple 2 Green
+ 3 Brown 3 White
+ 4 Green 4 Brown
+ 5 Blue
+ 6 White
+ 7 Black
+ 8 Red
+
+@effect <effect_id> [flag]
+Give an efect to your character.
+
+@stpoint <number of points>
+Gives you the desired number of stat points.
+
+@skpoint <number of points>
+Gives you the desired number of skill points.
+
+@zeny <amount>
+Gives you desired amount of Zeny.
+
+@str <amount>
+@agi <amount>
+@vit <amount>
+@int <amount>
+@dex <amount>
+@luk <amount>
+Adds desired amount to any stat. For example "@str 10" raises your str by 10
+
+@spiritball <number>
+Number = 1-1000
+Gives you monk "spirit spheres" like from the skill "Call Spirits"
+(If the number you use is > 1000, your server may become instable or crash)
+
+@memo [memo_position]
+set/change a memo location (no position: display memo points).
+
+@questskill <id>
+Gives you the specified quest skill
+
+@lostskill <id>
+Takes away the specified quest skill from you
+
+Quest Skill ID:
+ Novice
+ 142 = Emergency Care
+ 143 = Act dead
+ Swordsman
+ 144 = Moving HP Recovery
+ 145 = Attack Weak Point
+ 146 = Auto Berserk
+ Magician
+ 157 = Energy Coat
+ Archer
+ 147 = Arrow Creation
+ 148 = Charge Arrows
+ Acolyte
+ 156 = Holy Light
+ Merchant
+ 153 = Cart Revolution
+ 154 = Change Cart
+ 155 = Crazy Uproar/Loud Voice
+ Thief
+ 149 = Throw Sand
+ 150 = Back Sliding
+ 151 = Take Stone
+ 152 = Stone Throw
+
+<GUILD CONTROL COMMANDS>
+
+@guildlvup/@guildlvlup <# of levels> - Raise Guild by desired number of levels
+
+<EQUIPMENT COMMANDS>
+
+@refine <position> <+/-amount>
+Upgrades equipment at the position specified (Stackable)
+0 - All
+1 - Lower Head
+2 - Right Hand
+4 - Robe/Garment
+8 - Left Accessory
+16 - Body/Armor
+32 - Left Hand
+64 - Feet
+128 - Right Accessory
+256 - Top Head
+512 - Mid Head
+
+Example:
+@refine 34 10 - Refines a 2 handed weapon to +10
+@refine 16 4 - Refines the body/armor to +4
+
+@produce <equip name or equip ID> <element> <# of very's>
+Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
+# of very's: 0=None 1=Very Strong 2=Very Very Strong 3=Very Very Very Strong
+
+Example: @produce 1163 3 3 - Produces a Very Very Very Strong (Your Nick)'s Fire Claymore
+
+<Q-PET/cutePET COMMANDS>
+@hatch - Create a pet from your inventory eggs list.
+@makeegg <ID> - Gives pet egg for monster ID in pet DB
+@petfriendly <#> - Set pet friendly amount (0-1000) 0 = Min, 1000 = Max
+@pethungry <#> - Set pet hungry amount (0-100) 0 = Min, 100 = Max
+@petrename - Re-enable pet rename
+
+<REMOTE CHAR COMMANDS>
+@charwarp <map name> <x> <y> <char name>
+Warps character to location of choice
+Example:
+@charwarp morocc 150 160 TestChar -> Warps TestChar to Morroc (X:150, Y:160)
+
+@charstats <char name>
+Displays the character's stats.
+
+@charignorelist <char name>
+Displays ignore list of the player
+
+@inall <char name>
+Allows all wispers for the player
+
+@exall <char name>
+Blocks all wispers for the player
+
+@charoption <param1> <param2> <param3> <char name>
+Does the same as the @option command only to target character.
+
+@charmountpeco <charname>
+Give/remove to a player a peco (Class is required, but not skill).
+
+@charpetrename <charname>
+Re-enable pet rename to a player.
+
+@charsave <map> <x> <y> <char name>
+Changes the target player's respawn point.
+
+@charbaselvl <#> <char name>
+Change a character's base level.
+
+@charjlvl <#> <char name>
+Change a character's job level.
+
+@charjob/@charjobchange <job ID> <char name>
+Changes target character's job.
+
+@charzeny <amount> <char name>
+Give/take a player's Zeny
+
+@charstpoint <amount> <char name>
+Give/take a player's stat points
+
+@charskpoint <amount> <char name>
+give/take a player's skill points
+
+@charquestskill <#> <charname>
+Gives to a player the specified quest skill.
+
+@charlostskill <#> <charname>
+Takes away the specified quest skill from the player.
+
+@chardelitem <item_name_or_ID> <quantity> <player>
+Remove items from a character
+
+@charmodel <hair type> <hair color> <clothes color> <char name>
+Changes a player's model
+
+@chardisguise <monster_name_or_monster_ID> <char name>
+Changes disguise of a player
+
+@charundisguise <char name>
+Cancels disguise of a player
+
+@charchangesex <name>
+Changes sex of a player (all characters of the account)
+
+@charblock/@block <name>
+Blocks definitively a account
+
+@charunblock/@unblock <name>
+Unblocks a account
+
+@charban/@ban/@banish/@charbanish <time> <name>
+Ban temporarily a account
+ time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
+ Example: @ban +1m-2mn1s-6y testplayer
+
+@charunban/@unban/@unbanish/@uncharbanish <name>
+Unban a account
+
+@jail <char_name>
+Sends specified character in jails
+
+@unjail/@discharge <char_name>
+Discharges specified character/prisoner
+
+<MASS CONTROL COMMANDS>
+@night
+All characters are in darkness
+
+@day
+
+@option 00 00 00 are used on all characters
+
+@doom
+Kills all NON GM chars on the server.
+
+@doommap
+Kills all non GM characters on the map.
+
+@raise
+Resurrects all characters on the server.
+
+@raisemap
+Resurrects all characters on the map.
+
+@kick <charname>
+Kicks specified character off the server
+
+@kickall
+Kick all characters off the server
+
+<OTHER COMMANDS>
+
+@gat ---- ƒfƒoƒbƒO—p(Žü•Ógat‚𒲂ׂé)
+@packet ---- ƒfƒoƒbƒO—p(ƒpƒPƒbƒgFX)
+
+@mapexit
+Kick all players and shut down map-server.
+
+@reloaditemdb
+Reload item database (admin command)
+
+@reloadmobdb
+Reload monster database (admin command)
+
+@reloadskilldb
+Reload skills definition database (admin command)
+
+@reloadscript
+Reload all scripts (admin command)
+
+@reloadgmdb
+Reload GM levels (admin command)
+
+@enablenpc <NPC_name>
+Enable a NPC (admin command)
+
+@disablenpc <NPC_name>
+Disable a NPC (admin command)
+
+@email <actual@email> <new@email>
to change your e-mail (characters protection) \ No newline at end of file
diff --git a/doc/inter_server_packet.txt b/doc/inter_server_packet.txt
index a88694aa8..253280326 100644
--- a/doc/inter_server_packet.txt
+++ b/doc/inter_server_packet.txt
@@ -1,204 +1,204 @@
-S mapŽI=>interŽI
-R interŽI=>mapŽI
-
-ƒpƒPƒbƒg’·ƒŠƒXƒg
-R 3800-388f
- -1,-1,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,17, 7,-1, 0,-1,-1,-1, 14,67,186,-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,
- 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-S 3000-308f
- -1,-1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
- -1, 6,-1, 0, 55,17, 6,-1, 14,-1,-1,-1, 14,19,186,-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,
- 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
-
-
-S 3000 <len>.w <message>.?B
- GMƒƒbƒZ[ƒW‘—M—v‹
-R 3800 <len>.w <message>.?B
- GMƒƒbƒZ[ƒW
-S 3001 <len>.w <src-nick>.24B <dst-nick>.24B <message>.?B
- Wis‘—M—v‹
-R 3801 <len>.w <wis-id>.l <src-nick>.24B <dst-nick>.24B <message>.?B
- Wisƒf[ƒ^ŽóM
- wis-id=interŽI“à•”‚ÌWis-idFmapŽI‚Å‚Í3002‚Å‘—M‚·‚邽‚ß‚¾‚¯‚ÉŽg‚¤
-S 3002 <wis-id>.l <flag>.B
- ‚±‚ÌmapŽI‚Å‚ÌWis‚Ì‘—MŒ‹‰Ê
- flag=0 ‘—MŠ®—¹(‚±‚ÌmapŽI‚É‚¢‚½‚Ì‚ÅA‘—M‚µ‚½)
- flag=1 ‘—MŽ¸”s(‚±‚ÌmapŽI‚É‚Í‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ)
- flag=2 ‘—MI—¹(‚±‚ÌmapŽI‚É‚¢‚邪Aignore‚³‚ê‚Ä‚¢‚é)
-R 3802 <src-nick>.24B <flag>.B
- ‘SmapŽI‚Å‚ÌWis‘—MŒ‹‰Ê
- flag=0 ‘—MŠ®—¹
- flag=1 ‘—MŽ¸”s(‚Ç‚ÌmapŽI‚É‚à‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ)
- flag=2 ‘—MŽ¸”s(ignore‚³‚ꂽ)
-S 3010 <account_id>.l
- ‘qŒÉƒf[ƒ^—v‹
-R 3810 <len>.w <account_id>.l <storage>.?B
- ‘qŒÉƒf[ƒ^ŽóM
-S 3011 <len>.w <account_id>.l <storage>.?B
- ‘qŒÉƒf[ƒ^‘—M••Û‘¶—v‹
-R 3811 <account_id>.l <flag>.b
- ‘qŒÉƒf[ƒ^•Û‘¶I—¹
- flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚Å‚Í•K‚¸0‚È‚Ì‚ÅA•ÔM‚ð‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
-
-S 3020 <account_id>.l <party_name>.24B <nick_name>.24B <map_name>.16B <level>.w
- ƒp[ƒeƒB쬗v‹
-R 3820 <account_id>.l <fail>.B <party_id>.l <party_name>.24B
- ƒp[ƒeƒB¬Œ÷‰Â”ÛiŽ©•ª‚̃}ƒbƒvŽI‚Ì‚Ýj
- fail=00 ƒp[ƒeƒB쬬Œ÷
- fail=01 Ž¸”siparty_id,pary_name‚̓Sƒ~j
-S 3021 <party_id>.l
- ƒp[ƒeƒBî•ñ—v‹
-R 3821 <len>.w <struct party>.?B
- (struct party‚Ìʼn‚SƒoƒCƒg‚Íparty_id)
- len=8 ƒp[ƒeƒB‚Í‘¶Ý‚µ‚È‚¢iŽóM‚µ‚½‚çŠY“–ƒLƒƒƒ‰‚𖢊‘®‚É•ÏX‚·‚éj
- len>8 ƒp[ƒeƒBî•ñiŽóM‚µ‚½‚çƒNƒ‰ƒCƒAƒ“ƒg‚É‘—‚邱‚Æj
- i—v‹‚µ‚Ä‚«‚½ƒ}ƒbƒvŽI‚Öj
-S 3022 <party_id>.l <account_id>.l <nick>.24B <map_name>.16B <level>.w
- ƒp[ƒeƒB’ljÁ—v‹
-R 3822 <party_id>.l <account_id>.l <fail>.B
- ƒp[ƒeƒB’ljÁ’Ê’mi—v‹‚µ‚Ä‚«‚½ƒ}ƒbƒvŽI‚Öj
- fail=00‚ŬŒ÷Afail=01‚ÅŽ¸”s
- i¬Œ÷Žž‚Í‚±‚Ì’¼Œã‚É‘SŽI‚Ƀp[ƒeƒBî•ñ‚ª‘—‚ç‚ê‚éj
-S 3023 <party_id>.l <account_id>.l <exp>.w <item>.w
- ƒp[ƒeƒBÝ’è•ÏX—v‹
-R 3823 <party_id>.l <account_id>.l <exp>.w <item>.w <fail>.B
- ƒp[ƒeƒBÝ’è•ÏX’Ê’mi¬Œ÷‚ÌꇑSƒ}ƒbƒvŽI‚Ö’Ê’mj
- fail=0x00 ƒp[ƒeƒBÝ’è•ÏXŠ®—¹
- fail=0x01 exp‚Ì•ÏXŽ¸”s
- fail=0x10 item‚Ì•ÏXŽ¸”s
-S 3024 <party_id>.l <account_id>.l
- ƒp[ƒeƒB’E‘Þ—v‹
-R 3824 <party_id>.l <account_id>.l <nick>.24B
- ƒp[ƒeƒB’E‘Þ’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
-S 3025 <party_id>.l <account_id>.l <map_name>.16B <online>.B <level>.w
- ƒp[ƒeƒBƒ}ƒbƒvXV/ƒIƒ“ƒ‰ƒCƒ“—v‹
-R 3825 <party_id>.l <account_id>.l <map_name>.16B <online>.B <level>.w
- ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
-S 3026 <party_id>.l
- ƒp[ƒeƒB‰ðŽU—v‹i‘—‚ç‚ê‚邱‚Æ‚Í‚È‚¢‚ÆŽv‚í‚ê‚éj
-R 3026 <party_id>.l <fail>.B
- ƒp[ƒeƒB‰ðŽU
- fail=00 ƒp[ƒeƒB‚͉ðŽU‚³‚ꂽi¡‚Ì‚Æ‚±‚ë•K‚¸00j
- imapŽI“à‚Ì•s—vƒf[ƒ^휂̂½‚ß‚¾‚¯‚ÉŽg‚í‚ê‚éj
-S 3027 <len>.w <party_id>.l <account_id>.l <message>.?B
- ƒp[ƒeƒB“à”­Œ¾—v‹
-R 3827 <len>.w <party_id>.l <account_id>.l <message>.?B
- ƒp[ƒeƒB“à”­Œ¾’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
-S 3028 <party_id>.l <account_id>.l <nick>.24B
- •Êƒp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚©ƒ`ƒFƒbƒN<party_id>‚Í–{—ˆ‚ÌŠ‘®
-
-
-S 3030 <len>.w <account_id>.l <guild_name>.24B <struct guild_member>.?B
- ƒMƒ‹ƒh쬗v‹
-R 3830 <account_id>.l <guild_id>.l
- ƒMƒ‹ƒh쬉”Û(guild_id=0‚ÅŽ¸”s)
-S 3031 <guild_id>.l
- ƒMƒ‹ƒhî•ñ—v‹
-R 3831 <len>.w <struct guild>.?B
- ƒMƒ‹ƒhî•ñ
- len=8 ƒMƒ‹ƒh‚Í‘¶Ý‚µ‚È‚¢
- len>8 ƒMƒ‹ƒhî•ñ
-S 3032 <len>.w <guild_id>.l <struct guild_member>.?B
- ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
-R 3832 <guild_id>.l <account_id>.l <charactor_id>.l <fail>.B
- ƒMƒ‹ƒh’ljÁƒƒ“ƒo’Ê’m
- fail=0‚ŬŒ÷,1‚ÅŽ¸”s
-S 3034 <guild_id>.l <account_id>.l <charactor_id>.l <flag>.B <mes>.40B
- ƒMƒ‹ƒh’E‘Þ/’Ç•ú—v‹
- flag=0 ’E‘Þ / 1 ’Ç•ú
-R 3834 <guild_id>.l <account_id>.l <charactor_id>.l <flag>.B <mes>.40B <nick>.24B
- ƒMƒ‹ƒh’E‘Þ/’Ç•ú’Ê’m
-S 3035 <guild_id>.l <account_id>.l <charactor_id>.l <online>.B <lv>.w <class>.w
- ƒMƒ‹ƒhƒƒ“ƒoî•ñXV—v‹
-R 3835 <guild_id>.l <account_id>.l <charactor_id>.l <online>.B <lv>.w <class>.w
- ƒMƒ‹ƒhƒƒ“ƒoî•ñXV’Ê’m
-S 3036 <guild_id>.l
- ƒMƒ‹ƒh‰ðŽU—v‹
-R 3836 <guild_id>.l <fail>.B
- ƒMƒ‹ƒh‰ðŽU’Ê’m
- flag=00 ‰ðŽU¬Œ÷ / 01 Ž¸”s
-S 3037 <len>.w <guild_id>.l <account_id>.l <message>.?B
- ƒMƒ‹ƒh”­Œ¾—v‹
-R 3837 <len>.w <guild_id>.l <account_id>.l <message>.?B
- ƒMƒ‹ƒh”­Œ¾’Ê’m
-S 3038 <guild_id>.l <account_id>.l <charactor_id>.l
- •ÊƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚©ƒ`ƒFƒbƒN
-S 3039 <len>.w <guild_id>.l <type>.w <data>.?B
- ŠeŽíŠî–{î•ñXV—v‹
-R 3839 <len>.w <guild_id>.l <type>.w <data>.?B
- ŠeŽíŠî–{î•ñXV’Ê’m
-S 303A <len>.w <guild_id>.l <account_id>.l <char_id>.l <type>.w <data>.?B
- ŠeŽíƒMƒ‹ƒhƒƒ“ƒoî•ñXV—v‹
-R 383A <len>.w <guild_id>.l <account_id>.l <char_id>.l <type>.w <data>.?B
- ŠeŽíƒMƒ‹ƒhƒƒ“ƒoî•ñXV’Ê’m
-S 303B <len>.w <guild_id>.l <position>.l <struct guild_position>.?B
- ƒMƒ‹ƒh–ðE•ÏX—v‹
-R 383B <len>.w <guild_id>.l <position>.l <struct guild_position>.?B
- ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-S 303C <guild_id>.l <skill_num>.l <account_id>.l
- ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è
-R 383C <guild_id>.l <skill_num>.l <account_id>.l
- ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è(skill_num==0‚ÅŽ¸”s)
-S 303D <guild_id1>.l <guild_id2>.l <account_id1>.l <account_id2>.l <flag>.B
- ƒMƒ‹ƒh“¯–¿/“G‘Ηv‹
- flag=0 “¯–¿ / 1 “G‘Î / 8 “¯–¿‰ðœ / 9 “G‘Ήðœ
-R 383D <guild_id1>.l <guild_id2>.l <account_id1>.l <account_id2>.l <flag>.B <name1>.24B <name2>.24B
- ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
- flag=0 “¯–¿ / 1 “G‘Î
- flag=0x10 “¯–¿Ž¸”s / 0x11 “G‘ÎŽ¸”s
-S 303E <guild_id>.l <message1>.60B <message2>.120B
- ƒMƒ‹ƒh’mÝ’è—v‹
-R 383E <guild_id>.l <message1>.60B <message2>.120B
- ƒMƒ‹ƒh’mÝ’è’Ê’m
-S 303F <len>.w <guild_id>.l <dummy>.l <emblem_data>.?B
- ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹ dummy‚Í0ŒÅ’è
-R 383F <len>.w <guild_id>.l <dummy>.l <emblem_data>.?B
- ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-iˆÈ‰ºAƒMƒ‹ƒhŒn’ljÁ—\’èj
-
-S 3080 <account_id>.l <char_id>.I <pet_type>.w <pet_lv>.w <pet_egg_id>.w
- <pet_equip>.w <pet_intimate>.w <pet_hungry>.w <rename_flag>.B <incuvate>.B
- <pet_name>.24B
- ƒyƒbƒg¶¬—v‹
-R 3880 <account_id>.l <fail>.B <pet_id>.l
- ƒyƒbƒg¶¬¬Œ÷‰Â”Û
- fail=00 ƒyƒbƒg¶¬¬Œ÷
- fail=01 Ž¸”sipet_id‚̓Sƒ~j
-S 3081 <account_id>.l <char_id>.I <pet_id>.l
- ƒyƒbƒgƒf[ƒ^—v‹
-R 3881 <len>.w <account_id>.l <fail>.B <struct s_pet>.?B
- ƒyƒbƒgƒf[ƒ^ŽóM
- fail=00 ƒyƒbƒgƒf[ƒ^“]‘—
- fail=01 ƒyƒbƒg‚̃f[ƒ^‚ª‚È‚¢‚©‚à‚µ‚­‚Íaccount_id‚©char_id‚ª‡‚í‚È‚¢‚Ì‚Å
- Ž¸”sis_pet‚̓Sƒ~j
-S 3082 <len>.w <account_id>.l <struct s_pet>.?B
- ƒyƒbƒgƒf[ƒ^‘—M••Û‘¶—v‹
-R 3882 <account_id>.l <flag>.b
- ƒyƒbƒgƒf[ƒ^•Û‘¶I—¹
- flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚ł̓ƒ‚ƒŠ•s‘«ˆÈŠO‚É‚Í•K‚¸0‚È‚Ì‚ÅA•ÔM‚ð
- ‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
- flag=1 Ž¸”s
-S 3083 <pet_id>.l
- ƒyƒbƒgƒf[ƒ^휗v‹
-R 3883 <flag>.b
- ƒyƒbƒgƒf[ƒ^íœI—¹
- flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚Å‚ÍŠù‚Ƀf[ƒ^‚ª‚¢‚È‚¢ê‡ˆÈŠO‚Í•K‚¸0‚È‚Ì‚ÅA
- •ÔM‚ð‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
- flag=1 Ž¸”sipet_id‚É“–‚½‚éƒf[ƒ^‚ª‚È‚¢ê‡‚Ì•¨‚Å‚·‚ªŠù‚Ƀf[ƒ^‚ª
- ‚¢‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Í휂·‚é•K—v‚ª‚È‚¢‚±‚Æ‚É‚à‚È‚è‚Ü‚·‚Ì‚Å
- ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñj
-
+S mapŽI=>interŽI
+R interŽI=>mapŽI
+
+ƒpƒPƒbƒg’·ƒŠƒXƒg
+R 3800-388f
+ -1,-1,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10,-1,15, 0, 79,17, 7,-1, 0,-1,-1,-1, 14,67,186,-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,
+ 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+S 3000-308f
+ -1,-1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
+ -1, 6,-1, 0, 55,17, 6,-1, 14,-1,-1,-1, 14,19,186,-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,
+ 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+
+
+S 3000 <len>.w <message>.?B
+ GMƒƒbƒZ[ƒW‘—M—v‹
+R 3800 <len>.w <message>.?B
+ GMƒƒbƒZ[ƒW
+S 3001 <len>.w <src-nick>.24B <dst-nick>.24B <message>.?B
+ Wis‘—M—v‹
+R 3801 <len>.w <wis-id>.l <src-nick>.24B <dst-nick>.24B <message>.?B
+ Wisƒf[ƒ^ŽóM
+ wis-id=interŽI“à•”‚ÌWis-idFmapŽI‚Å‚Í3002‚Å‘—M‚·‚邽‚ß‚¾‚¯‚ÉŽg‚¤
+S 3002 <wis-id>.l <flag>.B
+ ‚±‚ÌmapŽI‚Å‚ÌWis‚Ì‘—MŒ‹‰Ê
+ flag=0 ‘—MŠ®—¹(‚±‚ÌmapŽI‚É‚¢‚½‚Ì‚ÅA‘—M‚µ‚½)
+ flag=1 ‘—MŽ¸”s(‚±‚ÌmapŽI‚É‚Í‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ)
+ flag=2 ‘—MI—¹(‚±‚ÌmapŽI‚É‚¢‚邪Aignore‚³‚ê‚Ä‚¢‚é)
+R 3802 <src-nick>.24B <flag>.B
+ ‘SmapŽI‚Å‚ÌWis‘—MŒ‹‰Ê
+ flag=0 ‘—MŠ®—¹
+ flag=1 ‘—MŽ¸”s(‚Ç‚ÌmapŽI‚É‚à‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ)
+ flag=2 ‘—MŽ¸”s(ignore‚³‚ꂽ)
+S 3010 <account_id>.l
+ ‘qŒÉƒf[ƒ^—v‹
+R 3810 <len>.w <account_id>.l <storage>.?B
+ ‘qŒÉƒf[ƒ^ŽóM
+S 3011 <len>.w <account_id>.l <storage>.?B
+ ‘qŒÉƒf[ƒ^‘—M••Û‘¶—v‹
+R 3811 <account_id>.l <flag>.b
+ ‘qŒÉƒf[ƒ^•Û‘¶I—¹
+ flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚Å‚Í•K‚¸0‚È‚Ì‚ÅA•ÔM‚ð‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
+
+S 3020 <account_id>.l <party_name>.24B <nick_name>.24B <map_name>.16B <level>.w
+ ƒp[ƒeƒB쬗v‹
+R 3820 <account_id>.l <fail>.B <party_id>.l <party_name>.24B
+ ƒp[ƒeƒB¬Œ÷‰Â”ÛiŽ©•ª‚̃}ƒbƒvŽI‚Ì‚Ýj
+ fail=00 ƒp[ƒeƒB쬬Œ÷
+ fail=01 Ž¸”siparty_id,pary_name‚̓Sƒ~j
+S 3021 <party_id>.l
+ ƒp[ƒeƒBî•ñ—v‹
+R 3821 <len>.w <struct party>.?B
+ (struct party‚Ìʼn‚SƒoƒCƒg‚Íparty_id)
+ len=8 ƒp[ƒeƒB‚Í‘¶Ý‚µ‚È‚¢iŽóM‚µ‚½‚çŠY“–ƒLƒƒƒ‰‚𖢊‘®‚É•ÏX‚·‚éj
+ len>8 ƒp[ƒeƒBî•ñiŽóM‚µ‚½‚çƒNƒ‰ƒCƒAƒ“ƒg‚É‘—‚邱‚Æj
+ i—v‹‚µ‚Ä‚«‚½ƒ}ƒbƒvŽI‚Öj
+S 3022 <party_id>.l <account_id>.l <nick>.24B <map_name>.16B <level>.w
+ ƒp[ƒeƒB’ljÁ—v‹
+R 3822 <party_id>.l <account_id>.l <fail>.B
+ ƒp[ƒeƒB’ljÁ’Ê’mi—v‹‚µ‚Ä‚«‚½ƒ}ƒbƒvŽI‚Öj
+ fail=00‚ŬŒ÷Afail=01‚ÅŽ¸”s
+ i¬Œ÷Žž‚Í‚±‚Ì’¼Œã‚É‘SŽI‚Ƀp[ƒeƒBî•ñ‚ª‘—‚ç‚ê‚éj
+S 3023 <party_id>.l <account_id>.l <exp>.w <item>.w
+ ƒp[ƒeƒBÝ’è•ÏX—v‹
+R 3823 <party_id>.l <account_id>.l <exp>.w <item>.w <fail>.B
+ ƒp[ƒeƒBÝ’è•ÏX’Ê’mi¬Œ÷‚ÌꇑSƒ}ƒbƒvŽI‚Ö’Ê’mj
+ fail=0x00 ƒp[ƒeƒBÝ’è•ÏXŠ®—¹
+ fail=0x01 exp‚Ì•ÏXŽ¸”s
+ fail=0x10 item‚Ì•ÏXŽ¸”s
+S 3024 <party_id>.l <account_id>.l
+ ƒp[ƒeƒB’E‘Þ—v‹
+R 3824 <party_id>.l <account_id>.l <nick>.24B
+ ƒp[ƒeƒB’E‘Þ’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
+S 3025 <party_id>.l <account_id>.l <map_name>.16B <online>.B <level>.w
+ ƒp[ƒeƒBƒ}ƒbƒvXV/ƒIƒ“ƒ‰ƒCƒ“—v‹
+R 3825 <party_id>.l <account_id>.l <map_name>.16B <online>.B <level>.w
+ ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
+S 3026 <party_id>.l
+ ƒp[ƒeƒB‰ðŽU—v‹i‘—‚ç‚ê‚邱‚Æ‚Í‚È‚¢‚ÆŽv‚í‚ê‚éj
+R 3026 <party_id>.l <fail>.B
+ ƒp[ƒeƒB‰ðŽU
+ fail=00 ƒp[ƒeƒB‚͉ðŽU‚³‚ꂽi¡‚Ì‚Æ‚±‚ë•K‚¸00j
+ imapŽI“à‚Ì•s—vƒf[ƒ^휂̂½‚ß‚¾‚¯‚ÉŽg‚í‚ê‚éj
+S 3027 <len>.w <party_id>.l <account_id>.l <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾—v‹
+R 3827 <len>.w <party_id>.l <account_id>.l <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾’Ê’mi‘Sƒ}ƒbƒvŽI‚Öj
+S 3028 <party_id>.l <account_id>.l <nick>.24B
+ •Êƒp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚©ƒ`ƒFƒbƒN<party_id>‚Í–{—ˆ‚ÌŠ‘®
+
+
+S 3030 <len>.w <account_id>.l <guild_name>.24B <struct guild_member>.?B
+ ƒMƒ‹ƒh쬗v‹
+R 3830 <account_id>.l <guild_id>.l
+ ƒMƒ‹ƒh쬉”Û(guild_id=0‚ÅŽ¸”s)
+S 3031 <guild_id>.l
+ ƒMƒ‹ƒhî•ñ—v‹
+R 3831 <len>.w <struct guild>.?B
+ ƒMƒ‹ƒhî•ñ
+ len=8 ƒMƒ‹ƒh‚Í‘¶Ý‚µ‚È‚¢
+ len>8 ƒMƒ‹ƒhî•ñ
+S 3032 <len>.w <guild_id>.l <struct guild_member>.?B
+ ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
+R 3832 <guild_id>.l <account_id>.l <charactor_id>.l <fail>.B
+ ƒMƒ‹ƒh’ljÁƒƒ“ƒo’Ê’m
+ fail=0‚ŬŒ÷,1‚ÅŽ¸”s
+S 3034 <guild_id>.l <account_id>.l <charactor_id>.l <flag>.B <mes>.40B
+ ƒMƒ‹ƒh’E‘Þ/’Ç•ú—v‹
+ flag=0 ’E‘Þ / 1 ’Ç•ú
+R 3834 <guild_id>.l <account_id>.l <charactor_id>.l <flag>.B <mes>.40B <nick>.24B
+ ƒMƒ‹ƒh’E‘Þ/’Ç•ú’Ê’m
+S 3035 <guild_id>.l <account_id>.l <charactor_id>.l <online>.B <lv>.w <class>.w
+ ƒMƒ‹ƒhƒƒ“ƒoî•ñXV—v‹
+R 3835 <guild_id>.l <account_id>.l <charactor_id>.l <online>.B <lv>.w <class>.w
+ ƒMƒ‹ƒhƒƒ“ƒoî•ñXV’Ê’m
+S 3036 <guild_id>.l
+ ƒMƒ‹ƒh‰ðŽU—v‹
+R 3836 <guild_id>.l <fail>.B
+ ƒMƒ‹ƒh‰ðŽU’Ê’m
+ flag=00 ‰ðŽU¬Œ÷ / 01 Ž¸”s
+S 3037 <len>.w <guild_id>.l <account_id>.l <message>.?B
+ ƒMƒ‹ƒh”­Œ¾—v‹
+R 3837 <len>.w <guild_id>.l <account_id>.l <message>.?B
+ ƒMƒ‹ƒh”­Œ¾’Ê’m
+S 3038 <guild_id>.l <account_id>.l <charactor_id>.l
+ •ÊƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚©ƒ`ƒFƒbƒN
+S 3039 <len>.w <guild_id>.l <type>.w <data>.?B
+ ŠeŽíŠî–{î•ñXV—v‹
+R 3839 <len>.w <guild_id>.l <type>.w <data>.?B
+ ŠeŽíŠî–{î•ñXV’Ê’m
+S 303A <len>.w <guild_id>.l <account_id>.l <char_id>.l <type>.w <data>.?B
+ ŠeŽíƒMƒ‹ƒhƒƒ“ƒoî•ñXV—v‹
+R 383A <len>.w <guild_id>.l <account_id>.l <char_id>.l <type>.w <data>.?B
+ ŠeŽíƒMƒ‹ƒhƒƒ“ƒoî•ñXV’Ê’m
+S 303B <len>.w <guild_id>.l <position>.l <struct guild_position>.?B
+ ƒMƒ‹ƒh–ðE•ÏX—v‹
+R 383B <len>.w <guild_id>.l <position>.l <struct guild_position>.?B
+ ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+S 303C <guild_id>.l <skill_num>.l <account_id>.l
+ ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è
+R 383C <guild_id>.l <skill_num>.l <account_id>.l
+ ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è(skill_num==0‚ÅŽ¸”s)
+S 303D <guild_id1>.l <guild_id2>.l <account_id1>.l <account_id2>.l <flag>.B
+ ƒMƒ‹ƒh“¯–¿/“G‘Ηv‹
+ flag=0 “¯–¿ / 1 “G‘Î / 8 “¯–¿‰ðœ / 9 “G‘Ήðœ
+R 383D <guild_id1>.l <guild_id2>.l <account_id1>.l <account_id2>.l <flag>.B <name1>.24B <name2>.24B
+ ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
+ flag=0 “¯–¿ / 1 “G‘Î
+ flag=0x10 “¯–¿Ž¸”s / 0x11 “G‘ÎŽ¸”s
+S 303E <guild_id>.l <message1>.60B <message2>.120B
+ ƒMƒ‹ƒh’mÝ’è—v‹
+R 383E <guild_id>.l <message1>.60B <message2>.120B
+ ƒMƒ‹ƒh’mÝ’è’Ê’m
+S 303F <len>.w <guild_id>.l <dummy>.l <emblem_data>.?B
+ ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹ dummy‚Í0ŒÅ’è
+R 383F <len>.w <guild_id>.l <dummy>.l <emblem_data>.?B
+ ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
+iˆÈ‰ºAƒMƒ‹ƒhŒn’ljÁ—\’èj
+
+S 3080 <account_id>.l <char_id>.I <pet_type>.w <pet_lv>.w <pet_egg_id>.w
+ <pet_equip>.w <pet_intimate>.w <pet_hungry>.w <rename_flag>.B <incuvate>.B
+ <pet_name>.24B
+ ƒyƒbƒg¶¬—v‹
+R 3880 <account_id>.l <fail>.B <pet_id>.l
+ ƒyƒbƒg¶¬¬Œ÷‰Â”Û
+ fail=00 ƒyƒbƒg¶¬¬Œ÷
+ fail=01 Ž¸”sipet_id‚̓Sƒ~j
+S 3081 <account_id>.l <char_id>.I <pet_id>.l
+ ƒyƒbƒgƒf[ƒ^—v‹
+R 3881 <len>.w <account_id>.l <fail>.B <struct s_pet>.?B
+ ƒyƒbƒgƒf[ƒ^ŽóM
+ fail=00 ƒyƒbƒgƒf[ƒ^“]‘—
+ fail=01 ƒyƒbƒg‚̃f[ƒ^‚ª‚È‚¢‚©‚à‚µ‚­‚Íaccount_id‚©char_id‚ª‡‚í‚È‚¢‚Ì‚Å
+ Ž¸”sis_pet‚̓Sƒ~j
+S 3082 <len>.w <account_id>.l <struct s_pet>.?B
+ ƒyƒbƒgƒf[ƒ^‘—M••Û‘¶—v‹
+R 3882 <account_id>.l <flag>.b
+ ƒyƒbƒgƒf[ƒ^•Û‘¶I—¹
+ flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚ł̓ƒ‚ƒŠ•s‘«ˆÈŠO‚É‚Í•K‚¸0‚È‚Ì‚ÅA•ÔM‚ð
+ ‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
+ flag=1 Ž¸”s
+S 3083 <pet_id>.l
+ ƒyƒbƒgƒf[ƒ^휗v‹
+R 3883 <flag>.b
+ ƒyƒbƒgƒf[ƒ^íœI—¹
+ flag=0 ¬Œ÷iŒ»Ý‚ÌŽd—l‚Å‚ÍŠù‚Ƀf[ƒ^‚ª‚¢‚È‚¢ê‡ˆÈŠO‚Í•K‚¸0‚È‚Ì‚ÅA
+ •ÔM‚ð‘Ò‚½‚È‚­‚Ä‚à‚¢‚¢j
+ flag=1 Ž¸”sipet_id‚É“–‚½‚éƒf[ƒ^‚ª‚È‚¢ê‡‚Ì•¨‚Å‚·‚ªŠù‚Ƀf[ƒ^‚ª
+ ‚¢‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Í휂·‚é•K—v‚ª‚È‚¢‚±‚Æ‚É‚à‚È‚è‚Ü‚·‚Ì‚Å
+ ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñj
+
diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt
index db2843933..87af2f39c 100644
--- a/doc/item_bonus.txt
+++ b/doc/item_bonus.txt
@@ -1,212 +1,212 @@
-//eAthena Items Scripting Manual
-
-skill i,n; Gives skill #i at level n
-
-bonus bStr,n; STR + n
-bonus bAgi,n; AGI + n
-bonus bVit,n; VIT + n
-bonus bInt,n; INT + n
-bonus bDex,n; DEX + n
-bonus bLuk,n; LUK + n
-bonus bAllStats,n; STR + n, AGI + n, VIT + n, INT + n, DEX + n, LUK + n
-bonus bMaxHP,n; MaxHP + n
-bonus bMaxSP,n; MaxSP + n
-bonus bMaxHPrate,n; MaxHP + n%
-bonus bMaxSPrate,n; MaxSP + n%
-bonus bAtk,n; ATK + n
-bonus bAtk2,n; ATK2 + n
-bonus bAtkRate Attack power + n%
-bonus bBaseAtk,n; Basic attack power + n
-bonus bMatk,n; Magical attack power 1 + n and magical attack power 2 + n
-bonus bMatk1,n; Magical attack power 1 + n
-bonus bMatk2,n; Magical attack power 2 + n
-bonus bMatkRate,n; Magical attack power + n%
-bonus bDef,n; Equipment DEF + n
-bonus bDef2,n; VIT DEF + n
-bonus bDefRate,n; Equipment DEF + n%
-bonus bDef2Rate,n; VIT DEF + n%
-bonus bMdef,n; Equipment MDEF + n
-bonus bMdefRate,n; Equipment MDEF + n%
-bonus bMdef2Rate,n; INT MDEF + n%
-bonus bHit,n; Hit + n
-bonus bHitRate,n; Hit + n%
-bonus bCritical,n; Critical + n
-bonus bCriticalRate,n; Critical + n%
-bonus bFlee,n; Flee + n
-bonus bFleeRate,n; Flee +n%
-bonus bFlee2,n; Lucky Flee + n
-bonus bFlee2Rate,n; Lucky Flee + n%
-bonus bSpeed,n; Moving speed + n
-bonus bAspd,n; Attack speed + n
-bonus bSpeedRate,n; Moving speed + n% (only the highest among all is applied)
-bonus bAspdRate,n; Attack speed + n% (only the highest among all is applied)
-bonus bSpeedAddRate Moving speed + n%
-bonus bAspdAddRate Attack speed + n%
-bonus bAtkRange,n; Attack range + n
-bonus bCastrate,n; Skill casting time rate + n%
-bonus bUseSPrate,n; SP consumption + n%
-bonus bHPrecovRate,n; Natural HP recovery ratio + n%
-bonus bSPrecovRate,n; Natural SP recovery ratio + n%
-bonus bDoubleRate,n; Double Attack probability n% (works with all weapons | only the highest among all is applied)
-bonus bDoubleAddRate,n; Double Attack probability + n% (works with all weapons)
-bonus bPerfectHitRate,n; On-target impact attack probability n% (only the highest among all is applied)
-bonus bPerfectHitAddRate,n; On-target impact attack probability + n%
-bonus bGetZenyNum,n; When killing the monster with physical attack, rand () ?? of %n+1 is obtained, (only the highest among all is applied)
-bonus bAddGetZenyNum,n; When killing the monster with physical attack, rand () ?? of %n+1 is obtained, (n is done +)
-bonus bCriticalDef,n; Critical ? and others the trap it is, probability + n%
-bonus bNearAtkDef,n; Adds n% damage reduction against melee physical attacks
-bonus bLongAtkDef,n; Adds n% damage reduction against ranged physical attacks
-bonus bMagicAtkDef,n; Adds n% damage reduction against magical attacks
-bonus bMiscAtkDef,n; Adds n% damage reduction against MISC attacks (traps, falcon, ...)
-bonus bIgnoreDefRace,n Disregard DEF against enemies of race n
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus bIgnoreDefEle,n; Disregard DEF against enemies of element n
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus bIgnoreMDefRace Disregard MDEF against enemies of race n
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus bIgnoreMDefEle Disregard MDEF against enemies of element n
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus bDefRatioAtkRace,n; n race if defensive power is high the high extent big damage is given, (defense disregard) :
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus bDefRatioAtkEle,n; n attribute if defensive power is high the high extent big damage is given, (defense disregard) :
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus bAtkEle,n; Gives the player's attacks element n
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus bDefEle,n; Gives the player's defense element n
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus bSplashRange n; Splash attack radius + n (e.g. n=1 makes a 3*3 cells area, n=2 a 5*5 area, etc | only the highest among all is applied)
-bonus bSplashAddRange n; Splash attack radius + n (e.g. n=1 makes a 3*3 cells area, n=2 a 5*5 area, etc)
-
-bonus bInfiniteEndure,n; Unlimited Endure effect, n is meaningless
-bonus bRestartFullRecover,n; When reviving, HP and SP are fully filled (n is meaningless)
-bonus bNoCastCancel,n; Prevents casting from being interrupted when hit (does not work in GvG | n is meaningless)
-bonus bNoCastCancel2,n; Prevents casting from being interrupted when hit (works even in GvG | n is meaningless)
-bonus bNoSizeFix,n; The attack revision with the size of the monster is not received (n is meaningless)
-bonus bNoWeaponDamage,n; Prevents from receiving any physical damage (n is meaningless)
-bonus bNoMagicDamage,n; Prevents from receiving any magical effect (Attack, Healing, Support spells are all blocked | n is meaningless)
-bonus bNoGemStone,n; Skills requiring Gemstones do no more require them (Hocus Pocus will still require 1 Yellow Gemstone | n is meaningless)
-bonus bIntravision,n; Always see Hiding and Cloaking players/mobs (n is meaningless)
-
-bonus2 bAddEff,e,x; Adds a x/10000 chance to cause effect e to the target when attacking (e.g. x=100 makes 1% chance, x=10000 makes 100% chance, etc)
- e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
-bonus2 bResEff,e,x; Adds a x/10000 tolerance to effect e (e.g. x=100 makes 1% tolerance, x=10000 makes 100% tolerance, etc)
- e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
-bonus2 bAddSize,n,x; In n size the damage addition of x%
- n: 0=Small 1=Medium 2=Large
-bonus2 bMagicAddSize,n,x; In n size the magic damage addition of x%
- n: 0=Small 1=Medium 2=Large
-bonus2 bSubSize,n,x; Damage x% reduction from n size
- n: 0=Small 1=Medium 2=Large
-bonus2 bAddRace,n,x; In n race the damage addition of x%
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus2 bMagicAddRace,n,x; In n race the damage addition of x% (only magical attack)
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus2 bSubRace,n,x; Damage x% reduction from n race
- n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus2 bAddEle,n,x; In n attribute the damage addition of x%
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus2 bMagicAddEle,n,x In n attribute the damage addition of x% (only magical attack)
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus2 bSubEle,n,x; Damage x% reduction from n attribute
- n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
-bonus2 bAddDamageClass,n,x; In monster of class n the damage addition of x% (only physical attack), in case of prayer in n occupation the damage addition of x%
-bonus2 bAddMagicDamageClass,n,x; In monster of class n in case of the magical damage addition and prayer of x% in n occupation the magical damage addition of x%
-bonus2 bAddDefClass,n,x; In monster of class n the damage reduction of x% (only physical attack), in case of prayer in n occupation the damage reduction of x%
-bonus2 bAddMDefClass,n,x; In monster of class n in case of the magical damage reduction and prayer of x% in n occupation the magical damage reduction of x%
-bonus2 bHPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n/10 % probability -- x % -- HP -- absorption (+ n and x are carried out)
-bonus2 bSPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n/10 % probability -- x % -- SP -- absorption (+ n and x are carried out)
-bonus2 bSPVanishRate,n,x; Add the (n/10)% chance of decreasing enemy's SP (player) amount by x% when attacking
-bonus2 bAddMonsterDropItem,n,x; When killing any monsters with physical attack, the probability which drops item n +x% (the item which the monster drops unrelated ones)
- if 'x' is negative value, then it's a part of formula
- chance = -x*(killed_mob_level/10)+1
-bonus3 bAddMonsterDropItem,n,x,y; When killing monsters from race x with physical attack, the probability which drops item n +y% (the item which the monster drops unrelated ones)
- 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
- if 'x' is negative value, then it's a part of formula
- chance = -x*(killed_mob_level/10)+1
-bonus3 bAutoSpell,n,x,y; Auto Spell casting of spell n at level x with y/10% chance
-
-// bAddDamageClass, bAddMagicDamageClass and bAddMonsterDropItem it is setting possible up to 10. Those which exceed 10 are ignored.
-// those which can be used with the arrow are only bCritical, bAtkEle, bHit, bAddEle, bAddRace, bAddSize and bAddEff. The other things are ignored.
-
-
-
-//---- 2/15 new card effects ----
-
-bonus bCritAtkRate,n; Increase critical damage by +n%
-bonus bNoRegen,n; Stops regeneration for n
- n: 1=HP, 2=SP
-bonus bUnstripableWeapon,n; Weapon cannot be taken off via Strip skills
-bonus bUnstripableArmor,n; Armor cannot be taken off via Strip skills
-bonus bUnstripableHelm,n; Helm cannot be taken off via Strip skills
-bonus bUnstripableShield,n; Shield cannot be taken off via Strip skills
-bonus bSPGainValue,n; When killing a monster by physical attack, you gain n SP
-bonus bHPGainValue,n; When killing a monster by physical attack, you gain n HP
-bonus bIgnoreDefMob,n; Ignore monster's DEF when attacking.
- n: 0=All normal monster except Bosses, 1=All monsters
-bonus bDamageWhenUnequip,n; You lose n HP when the item is unequipped
-bonus2 bCriticalAddRace,n,r; Critical + n vs. enemies of race r
- r: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
-bonus2 bHPLossRate,n,x; Lose n HP every x milliseconds
-bonus2 bAddEffWhenHit,n,x; n% chance to cause x state to the enemy when
- being hit by physical damage
-bonus2 bAddEffWhenHitShort,n,x; n% chance to cause x state to the enemy when
- being hit by physical close range damage
-bonus2 bSkillAtk,n,x; Increase damage of skill n by x%
-bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase
- damage taken by x%
-bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n
- (Check db/mob_race2_db.txt)
-
-bonus3 bHPLossRate,n,x,y; Lose n amount of hp every x amount of time
- y: 0=Don't show damage 1=Show damage
-bonus3 bAutoSpellWhenHit,x,y,n; n/10% chance to cast skill x of level y on
- attacker when being hit by a direct
- attack. Target must be within spell's
- range to go off.
-bonus3 bSPDrainRate,n,x,y; When attacking there is a n% chance to either
- gain SP equivalent to x% of damage dealt, OR
- drain the amount of sp from the enemy.
- y: 0=gain sp 1:drain enemy sp
-bonus3 bSPDrainValue,n,x,y; When attacking there is a n% chance to either
- gain x SP, OR drain the amount of sp from the
- enemy. y:0=gain sp 1:drain enemy sp
- (Note: setting x to -1 or below will reduce
- YOUR sp)
-
-bonus4 bAutoSpell,x,y,n,i; n/10% chance to cast skill x of level y when
- being attacking
- i:0=cast on self 1=cast on enemy
-bonus4 bAutoSpellWhenHit,x,y,n,i; n/10% chance to cast skill x of level y when
- being hit by a direct attack. Target
- must be within spell's range to go
- off. i:0=cast on self 1=cast on enemy
-
-//---- 2/22 new card effects ----
-
-bonus2 bAddItemHealRate,n,x; Increases HP recovered by n type items by x%,
- you can also use direct item IDs instead
- of group values.
- (Check db/item_group_db.txt)
-
-//---- 3/15 new card effects ----
-
-bonus bLoseSPWhenUnequip,n; Lose n SP when the item is unequipped
-
-bonus2 bSPLossRate,n,x; Lose n SP every x milliseconds
-bonus2 bExpAddRace,n,x; Increase exp gained by x% vs. enemies of race n
-bonus2 bSPGainRace,n,x; When killing a monster of race n by physical
- attack gain x amount of sp
-bonus2 bSPSubRace2,n,x; Damage x% reduction from enemies of race n
- (Check db/mob_race2_db.txt)
-
-bonus2 bAddMonsterDropItemGroup,n,x; x% chance to get an item of group type n when you kill a
- monster (Check db/item_group_db.txt)
- if 'x' is negative value, then it's a part of formula
- chance = -x*(killed_mob_level/10)+1
-
-
-bonus3 bAddMonsterDropItemGroup,n,x,y; y% chance to get an item of group type n when you kill a
- monster of race x (Check db/item_group_db.txt)
- 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
- if 'y' is negative value, then it's a part of formula
- chance = -y*(killed_mob_level/10)+1
+//eAthena Items Scripting Manual
+
+skill i,n; Gives skill #i at level n
+
+bonus bStr,n; STR + n
+bonus bAgi,n; AGI + n
+bonus bVit,n; VIT + n
+bonus bInt,n; INT + n
+bonus bDex,n; DEX + n
+bonus bLuk,n; LUK + n
+bonus bAllStats,n; STR + n, AGI + n, VIT + n, INT + n, DEX + n, LUK + n
+bonus bMaxHP,n; MaxHP + n
+bonus bMaxSP,n; MaxSP + n
+bonus bMaxHPrate,n; MaxHP + n%
+bonus bMaxSPrate,n; MaxSP + n%
+bonus bAtk,n; ATK + n
+bonus bAtk2,n; ATK2 + n
+bonus bAtkRate Attack power + n%
+bonus bBaseAtk,n; Basic attack power + n
+bonus bMatk,n; Magical attack power 1 + n and magical attack power 2 + n
+bonus bMatk1,n; Magical attack power 1 + n
+bonus bMatk2,n; Magical attack power 2 + n
+bonus bMatkRate,n; Magical attack power + n%
+bonus bDef,n; Equipment DEF + n
+bonus bDef2,n; VIT DEF + n
+bonus bDefRate,n; Equipment DEF + n%
+bonus bDef2Rate,n; VIT DEF + n%
+bonus bMdef,n; Equipment MDEF + n
+bonus bMdefRate,n; Equipment MDEF + n%
+bonus bMdef2Rate,n; INT MDEF + n%
+bonus bHit,n; Hit + n
+bonus bHitRate,n; Hit + n%
+bonus bCritical,n; Critical + n
+bonus bCriticalRate,n; Critical + n%
+bonus bFlee,n; Flee + n
+bonus bFleeRate,n; Flee +n%
+bonus bFlee2,n; Lucky Flee + n
+bonus bFlee2Rate,n; Lucky Flee + n%
+bonus bSpeed,n; Moving speed + n
+bonus bAspd,n; Attack speed + n
+bonus bSpeedRate,n; Moving speed + n% (only the highest among all is applied)
+bonus bAspdRate,n; Attack speed + n% (only the highest among all is applied)
+bonus bSpeedAddRate Moving speed + n%
+bonus bAspdAddRate Attack speed + n%
+bonus bAtkRange,n; Attack range + n
+bonus bCastrate,n; Skill casting time rate + n%
+bonus bUseSPrate,n; SP consumption + n%
+bonus bHPrecovRate,n; Natural HP recovery ratio + n%
+bonus bSPrecovRate,n; Natural SP recovery ratio + n%
+bonus bDoubleRate,n; Double Attack probability n% (works with all weapons | only the highest among all is applied)
+bonus bDoubleAddRate,n; Double Attack probability + n% (works with all weapons)
+bonus bPerfectHitRate,n; On-target impact attack probability n% (only the highest among all is applied)
+bonus bPerfectHitAddRate,n; On-target impact attack probability + n%
+bonus bGetZenyNum,n; When killing the monster with physical attack, rand () ?? of %n+1 is obtained, (only the highest among all is applied)
+bonus bAddGetZenyNum,n; When killing the monster with physical attack, rand () ?? of %n+1 is obtained, (n is done +)
+bonus bCriticalDef,n; Critical ? and others the trap it is, probability + n%
+bonus bNearAtkDef,n; Adds n% damage reduction against melee physical attacks
+bonus bLongAtkDef,n; Adds n% damage reduction against ranged physical attacks
+bonus bMagicAtkDef,n; Adds n% damage reduction against magical attacks
+bonus bMiscAtkDef,n; Adds n% damage reduction against MISC attacks (traps, falcon, ...)
+bonus bIgnoreDefRace,n Disregard DEF against enemies of race n
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus bIgnoreDefEle,n; Disregard DEF against enemies of element n
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus bIgnoreMDefRace Disregard MDEF against enemies of race n
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus bIgnoreMDefEle Disregard MDEF against enemies of element n
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus bDefRatioAtkRace,n; n race if defensive power is high the high extent big damage is given, (defense disregard) :
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus bDefRatioAtkEle,n; n attribute if defensive power is high the high extent big damage is given, (defense disregard) :
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus bAtkEle,n; Gives the player's attacks element n
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus bDefEle,n; Gives the player's defense element n
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus bSplashRange n; Splash attack radius + n (e.g. n=1 makes a 3*3 cells area, n=2 a 5*5 area, etc | only the highest among all is applied)
+bonus bSplashAddRange n; Splash attack radius + n (e.g. n=1 makes a 3*3 cells area, n=2 a 5*5 area, etc)
+
+bonus bInfiniteEndure,n; Unlimited Endure effect, n is meaningless
+bonus bRestartFullRecover,n; When reviving, HP and SP are fully filled (n is meaningless)
+bonus bNoCastCancel,n; Prevents casting from being interrupted when hit (does not work in GvG | n is meaningless)
+bonus bNoCastCancel2,n; Prevents casting from being interrupted when hit (works even in GvG | n is meaningless)
+bonus bNoSizeFix,n; The attack revision with the size of the monster is not received (n is meaningless)
+bonus bNoWeaponDamage,n; Prevents from receiving any physical damage (n is meaningless)
+bonus bNoMagicDamage,n; Prevents from receiving any magical effect (Attack, Healing, Support spells are all blocked | n is meaningless)
+bonus bNoGemStone,n; Skills requiring Gemstones do no more require them (Hocus Pocus will still require 1 Yellow Gemstone | n is meaningless)
+bonus bIntravision,n; Always see Hiding and Cloaking players/mobs (n is meaningless)
+
+bonus2 bAddEff,e,x; Adds a x/10000 chance to cause effect e to the target when attacking (e.g. x=100 makes 1% chance, x=10000 makes 100% chance, etc)
+ e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
+bonus2 bResEff,e,x; Adds a x/10000 tolerance to effect e (e.g. x=100 makes 1% tolerance, x=10000 makes 100% tolerance, etc)
+ e: Eff_Blind, Eff_Sleep, Eff_Poison, Eff_Freeze, Eff_Silence, Eff_Stan, Eff_Curse, Eff_Confusion, Eff_Stone, Eff_Bleeding
+bonus2 bAddSize,n,x; In n size the damage addition of x%
+ n: 0=Small 1=Medium 2=Large
+bonus2 bMagicAddSize,n,x; In n size the magic damage addition of x%
+ n: 0=Small 1=Medium 2=Large
+bonus2 bSubSize,n,x; Damage x% reduction from n size
+ n: 0=Small 1=Medium 2=Large
+bonus2 bAddRace,n,x; In n race the damage addition of x%
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus2 bMagicAddRace,n,x; In n race the damage addition of x% (only magical attack)
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus2 bSubRace,n,x; Damage x% reduction from n race
+ n: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus2 bAddEle,n,x; In n attribute the damage addition of x%
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus2 bMagicAddEle,n,x In n attribute the damage addition of x% (only magical attack)
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus2 bSubEle,n,x; Damage x% reduction from n attribute
+ n: 0=Neutral, 1=Water, 2=Earth, 3=Fire, 4=Wind, 5=Poison, 6=Holy, 7=Dark, 8=Spirit, 9=Undead
+bonus2 bAddDamageClass,n,x; In monster of class n the damage addition of x% (only physical attack), in case of prayer in n occupation the damage addition of x%
+bonus2 bAddMagicDamageClass,n,x; In monster of class n in case of the magical damage addition and prayer of x% in n occupation the magical damage addition of x%
+bonus2 bAddDefClass,n,x; In monster of class n the damage reduction of x% (only physical attack), in case of prayer in n occupation the damage reduction of x%
+bonus2 bAddMDefClass,n,x; In monster of class n in case of the magical damage reduction and prayer of x% in n occupation the magical damage reduction of x%
+bonus2 bHPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n/10 % probability -- x % -- HP -- absorption (+ n and x are carried out)
+bonus2 bSPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n/10 % probability -- x % -- SP -- absorption (+ n and x are carried out)
+bonus2 bSPVanishRate,n,x; Add the (n/10)% chance of decreasing enemy's SP (player) amount by x% when attacking
+bonus2 bAddMonsterDropItem,n,x; When killing any monsters with physical attack, the probability which drops item n +x% (the item which the monster drops unrelated ones)
+ if 'x' is negative value, then it's a part of formula
+ chance = -x*(killed_mob_level/10)+1
+bonus3 bAddMonsterDropItem,n,x,y; When killing monsters from race x with physical attack, the probability which drops item n +y% (the item which the monster drops unrelated ones)
+ 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+ if 'x' is negative value, then it's a part of formula
+ chance = -x*(killed_mob_level/10)+1
+bonus3 bAutoSpell,n,x,y; Auto Spell casting of spell n at level x with y/10% chance
+
+// bAddDamageClass, bAddMagicDamageClass and bAddMonsterDropItem it is setting possible up to 10. Those which exceed 10 are ignored.
+// those which can be used with the arrow are only bCritical, bAtkEle, bHit, bAddEle, bAddRace, bAddSize and bAddEff. The other things are ignored.
+
+
+
+//---- 2/15 new card effects ----
+
+bonus bCritAtkRate,n; Increase critical damage by +n%
+bonus bNoRegen,n; Stops regeneration for n
+ n: 1=HP, 2=SP
+bonus bUnstripableWeapon,n; Weapon cannot be taken off via Strip skills
+bonus bUnstripableArmor,n; Armor cannot be taken off via Strip skills
+bonus bUnstripableHelm,n; Helm cannot be taken off via Strip skills
+bonus bUnstripableShield,n; Shield cannot be taken off via Strip skills
+bonus bSPGainValue,n; When killing a monster by physical attack, you gain n SP
+bonus bHPGainValue,n; When killing a monster by physical attack, you gain n HP
+bonus bIgnoreDefMob,n; Ignore monster's DEF when attacking.
+ n: 0=All normal monster except Bosses, 1=All monsters
+bonus bDamageWhenUnequip,n; You lose n HP when the item is unequipped
+bonus2 bCriticalAddRace,n,r; Critical + n vs. enemies of race r
+ r: 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+bonus2 bHPLossRate,n,x; Lose n HP every x milliseconds
+bonus2 bAddEffWhenHit,n,x; n% chance to cause x state to the enemy when
+ being hit by physical damage
+bonus2 bAddEffWhenHitShort,n,x; n% chance to cause x state to the enemy when
+ being hit by physical close range damage
+bonus2 bSkillAtk,n,x; Increase damage of skill n by x%
+bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase
+ damage taken by x%
+bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n
+ (Check db/mob_race2_db.txt)
+
+bonus3 bHPLossRate,n,x,y; Lose n amount of hp every x amount of time
+ y: 0=Don't show damage 1=Show damage
+bonus3 bAutoSpellWhenHit,x,y,n; n/10% chance to cast skill x of level y on
+ attacker when being hit by a direct
+ attack. Target must be within spell's
+ range to go off.
+bonus3 bSPDrainRate,n,x,y; When attacking there is a n% chance to either
+ gain SP equivalent to x% of damage dealt, OR
+ drain the amount of sp from the enemy.
+ y: 0=gain sp 1:drain enemy sp
+bonus3 bSPDrainValue,n,x,y; When attacking there is a n% chance to either
+ gain x SP, OR drain the amount of sp from the
+ enemy. y:0=gain sp 1:drain enemy sp
+ (Note: setting x to -1 or below will reduce
+ YOUR sp)
+
+bonus4 bAutoSpell,x,y,n,i; n/10% chance to cast skill x of level y when
+ being attacking
+ i:0=cast on self 1=cast on enemy
+bonus4 bAutoSpellWhenHit,x,y,n,i; n/10% chance to cast skill x of level y when
+ being hit by a direct attack. Target
+ must be within spell's range to go
+ off. i:0=cast on self 1=cast on enemy
+
+//---- 2/22 new card effects ----
+
+bonus2 bAddItemHealRate,n,x; Increases HP recovered by n type items by x%,
+ you can also use direct item IDs instead
+ of group values.
+ (Check db/item_group_db.txt)
+
+//---- 3/15 new card effects ----
+
+bonus bLoseSPWhenUnequip,n; Lose n SP when the item is unequipped
+
+bonus2 bSPLossRate,n,x; Lose n SP every x milliseconds
+bonus2 bExpAddRace,n,x; Increase exp gained by x% vs. enemies of race n
+bonus2 bSPGainRace,n,x; When killing a monster of race n by physical
+ attack gain x amount of sp
+bonus2 bSPSubRace2,n,x; Damage x% reduction from enemies of race n
+ (Check db/mob_race2_db.txt)
+
+bonus2 bAddMonsterDropItemGroup,n,x; x% chance to get an item of group type n when you kill a
+ monster (Check db/item_group_db.txt)
+ if 'x' is negative value, then it's a part of formula
+ chance = -x*(killed_mob_level/10)+1
+
+
+bonus3 bAddMonsterDropItemGroup,n,x,y; y% chance to get an item of group type n when you kill a
+ monster of race x (Check db/item_group_db.txt)
+ 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon, 10=Boss monster, 11=Other than (normal monster) boss monster
+ if 'y' is negative value, then it's a part of formula
+ chance = -y*(killed_mob_level/10)+1
diff --git a/doc/item_db.txt b/doc/item_db.txt
index 4dcbe491c..dec53ffa9 100644
--- a/doc/item_db.txt
+++ b/doc/item_db.txt
@@ -1,125 +1,125 @@
-(FIXME: Someone give this file better formatting)
-
-- Explanation of the item_db.txt file and structure.
-
-ID: Item id
-JName: Server name to reference the item in scripts and lookups, should use no
-spaces.
-
-Name: Name in english for displaying as output for @ and script commands.
-
-Type:
- 0 Healing item.
- 2 Usable item.
- 3 Etc item
- 4 Weapon
- 5 Armor/Garment/Boots/Headgear
- 6 Card
- 7 Pet egg
- 8 Pet equipment
- 10 Ammo (Arrows/Bullets/etc)
- 11 Usable with delayed consumption (item is lost from inventory after
- selecting a target, for use with skills and pet lures)
-
-Price: Default buying price. When not specified, becomes double the sell price.
-Sell: Default buying price. When not specified, becomes half the buy price.
-
-Weight: Item's weight. Each 10 is 1 weight.
-
-ATK: Weapon's attack
-DEF: Armor's defense
-Range: Weapon's attack range
-Slot: Amount of slots item possesses.
-
-Job: Equippable jobs. Uses the following bitmask table:
-
- (S.) Novice (2^00): 0x00000001
- Swordman (2^01): 0x00000002
- Mage (2^02): 0x00000004
- Archer (2^03): 0x00000008
- Acolyte (2^04): 0x00000010
- Merchant (2^05): 0x00000020
- Thief (2^06): 0x00000040
- Knight (2^07): 0x00000080
- Priest (2^08): 0x00000100
- Wizard (2^09): 0x00000200
- Blacksmith (2^10): 0x00000400
- Hunter (2^11): 0x00000800
- Assassin (2^12): 0x00001000
- Unused (2^13): 0x00002000
- Crusader (2^14): 0x00004000
- Monk (2^15): 0x00008000
- Sage (2^16): 0x00010000
- Rogue (2^17): 0x00020000
- Alchemist (2^18): 0x00040000
- Bard/Dancer (2^19): 0x00080000
- Unused (2^20): 0x00100000
- Taekwon (2^21): 0x00200000
- StarGladi (2^22): 0x00400000
- Soul Linker (2^23): 0x00800000
- Gunslinger (2^24): 0x01000000
- Ninja (2^25): 0x02000000
-
-Upper: Equippable upper-types. Uses the following bitmasks:
- 1: Normal jobs
- 2: Upper jobs
- 4: Baby jobs
-
-Gender: Gender restriction. 0 is female, 1 is male, 2 for both.
-
-Loc: Equipment's placement. Values are:
-
- 2^8 256 = Upper Headgear
- 2^9 512 = Middle Headgear
- 2^0 001 = Lower Headgear
- 2^4 016 = Armor
- 2^1 002 = Weapon
- 2^5 032 = Shield
- 2^2 004 = Garment
- 2^6 064 = Footgear
- 2^3 008 = Accessory 1
- 2^7 128 = Accessory 2
-
-wLV: Weapon level.
-eLV: Base level required to be able to equip.
-Refineable: 1 if the item can be refined, 0 otherwise.
-
-View: For normal items, defines a replacement view-sprite for the item (eg:
- Making apples look like apple juice). The special case are weapons and ammo
- where this value indicates the weapon-class of the item.
-
- For weapons, the types are:
- 0: bare fist
- 1: Daggers
- 2: One-handed swords
- 3: Two-handed swords
- 4: One-handed spears
- 5: Two-handed spears
- 6: One-handed axes
- 7: Two-handed axes
- 8: Maces
- 9: Unused
- 10: Staves
- 11: Bows
- 12: Knuckles
- 13: Musical Instruments
- 14: Whips
- 15: Books
- 16: Katars
- 17: Revolvers
- 18: Rifles
- 19: Shotguns
- 20: Gatling guns
- 21: Grenade launchers
- 22: Fuuma Shurikens
-
- For ammo, the types are:
- 1: Arrows
- 2: Throwable daggers
- 3: Bullets
- 4: Shells
- 5: Grenades
- 6: Shurikens
- 7: Kunais
-
-Script: Script to execute when the item is used/equipped.
+(FIXME: Someone give this file better formatting)
+
+- Explanation of the item_db.txt file and structure.
+
+ID: Item id
+JName: Server name to reference the item in scripts and lookups, should use no
+spaces.
+
+Name: Name in english for displaying as output for @ and script commands.
+
+Type:
+ 0 Healing item.
+ 2 Usable item.
+ 3 Etc item
+ 4 Weapon
+ 5 Armor/Garment/Boots/Headgear
+ 6 Card
+ 7 Pet egg
+ 8 Pet equipment
+ 10 Ammo (Arrows/Bullets/etc)
+ 11 Usable with delayed consumption (item is lost from inventory after
+ selecting a target, for use with skills and pet lures)
+
+Price: Default buying price. When not specified, becomes double the sell price.
+Sell: Default buying price. When not specified, becomes half the buy price.
+
+Weight: Item's weight. Each 10 is 1 weight.
+
+ATK: Weapon's attack
+DEF: Armor's defense
+Range: Weapon's attack range
+Slot: Amount of slots item possesses.
+
+Job: Equippable jobs. Uses the following bitmask table:
+
+ (S.) Novice (2^00): 0x00000001
+ Swordman (2^01): 0x00000002
+ Mage (2^02): 0x00000004
+ Archer (2^03): 0x00000008
+ Acolyte (2^04): 0x00000010
+ Merchant (2^05): 0x00000020
+ Thief (2^06): 0x00000040
+ Knight (2^07): 0x00000080
+ Priest (2^08): 0x00000100
+ Wizard (2^09): 0x00000200
+ Blacksmith (2^10): 0x00000400
+ Hunter (2^11): 0x00000800
+ Assassin (2^12): 0x00001000
+ Unused (2^13): 0x00002000
+ Crusader (2^14): 0x00004000
+ Monk (2^15): 0x00008000
+ Sage (2^16): 0x00010000
+ Rogue (2^17): 0x00020000
+ Alchemist (2^18): 0x00040000
+ Bard/Dancer (2^19): 0x00080000
+ Unused (2^20): 0x00100000
+ Taekwon (2^21): 0x00200000
+ StarGladi (2^22): 0x00400000
+ Soul Linker (2^23): 0x00800000
+ Gunslinger (2^24): 0x01000000
+ Ninja (2^25): 0x02000000
+
+Upper: Equippable upper-types. Uses the following bitmasks:
+ 1: Normal jobs
+ 2: Upper jobs
+ 4: Baby jobs
+
+Gender: Gender restriction. 0 is female, 1 is male, 2 for both.
+
+Loc: Equipment's placement. Values are:
+
+ 2^8 256 = Upper Headgear
+ 2^9 512 = Middle Headgear
+ 2^0 001 = Lower Headgear
+ 2^4 016 = Armor
+ 2^1 002 = Weapon
+ 2^5 032 = Shield
+ 2^2 004 = Garment
+ 2^6 064 = Footgear
+ 2^3 008 = Accessory 1
+ 2^7 128 = Accessory 2
+
+wLV: Weapon level.
+eLV: Base level required to be able to equip.
+Refineable: 1 if the item can be refined, 0 otherwise.
+
+View: For normal items, defines a replacement view-sprite for the item (eg:
+ Making apples look like apple juice). The special case are weapons and ammo
+ where this value indicates the weapon-class of the item.
+
+ For weapons, the types are:
+ 0: bare fist
+ 1: Daggers
+ 2: One-handed swords
+ 3: Two-handed swords
+ 4: One-handed spears
+ 5: Two-handed spears
+ 6: One-handed axes
+ 7: Two-handed axes
+ 8: Maces
+ 9: Unused
+ 10: Staves
+ 11: Bows
+ 12: Knuckles
+ 13: Musical Instruments
+ 14: Whips
+ 15: Books
+ 16: Katars
+ 17: Revolvers
+ 18: Rifles
+ 19: Shotguns
+ 20: Gatling guns
+ 21: Grenade launchers
+ 22: Fuuma Shurikens
+
+ For ammo, the types are:
+ 1: Arrows
+ 2: Throwable daggers
+ 3: Bullets
+ 4: Shells
+ 5: Grenades
+ 6: Shurikens
+ 7: Kunais
+
+Script: Script to execute when the item is used/equipped.
diff --git a/doc/miscnotes.txt b/doc/miscnotes.txt
index 4850b77f3..b74a8fba6 100644
--- a/doc/miscnotes.txt
+++ b/doc/miscnotes.txt
@@ -1,552 +1,552 @@
-// ****************************************************
-// * Miscellaneous Notes (Added by MC Cameri) *
-// ****************************************************
-
-// *****************************************************************
-// * Emotions that will be shown if 'int type' is one of the case. *
-// *****************************************************************
-void clif_emotion(struct block_list *bl,int type);
-case for 'int type':
-0 = ! 10 = KO (Scissor) 20 = Hmmm 30 = Kiss 1 (R) 40 = Tsk tsk tsk (No)
-1 = ? 11 = Fist (Stone) 21 = Number 1! 31 = Kiss 2 (L) 41 = Petting
-2 = Music 12 = Hand (Paper) 22 = No (??) 32 = Smoking 42 = SP! (Timer)
-3 = Heart 1 13 = Korean Flag 23 = OMG!! 33 = Okay 43 = Obsessed 2 (Dumb face, eyes popping)
-4 = Sweat 14 = Heart 2 24 = O 34 = ... (Bugged) 44 = Come (Moving finger)
-5 = Light bulb 15 = Thanks 25 = X 35 = ??? Flag 45 = Yawn (Sleepy)
-6 = Annoyed 16 = Wah (Crying) 26 = Help! 36 = Evil 2 46 = Congratulations
-7 = Smoke cloud 17 = Sorry 27 = Go! 37 = Obsessed 1 47 = HP! (Timer)
-8 = $ 18 = Heh (Laughing) 28 = Sobbing 38 = Two Hearts
-9 = ... 19 = Sweating 29 = Evil 1 39 = Tongue
-
-// ********************************
-// * Elemental Defense Resistance *
-// ********************************
-sd->subele[0] - Neutral Property
-sd->subele[1] - Water Property
-sd->subele[2] - Earth Property
-sd->subele[3] - Fire Property
-sd->subele[4] - Wind Property
-sd->subele[5] - Poison Property
-sd->subele[6] - Holy Property
-sd->subele[7] - Shadow Property
-sd->subele[8] - Ghost Property
-sd->subele[9] - Undead Property
-
-// ***************************************
-// * Elemental Monster Attack Resistance *
-// ***************************************
-
-sd->subrace[0] - Neutral Type
-sd->subrace[1] - Undead Type
-sd->subrace[2] - Brute Type
-sd->subrace[3] - Plant Type
-sd->subrace[4] - Insect Type
-sd->subrace[5] - Fish Type
-sd->subrace[6] - Demon Type
-sd->subrace[7] - Demi-Human Type
-sd->subrace[8] - Angel Type
-sd->subrace[9] - Dragon Type
-sd->subrace[10] - Boss Type #1?
-sd->subrace[11] - Boss Type #2?
-
-// **************
-// * Misc stuff *
-// **************
-
-WFIFOL(fd,2)=1; - Sever Closed
-
-// *******************
-// * Skills List *
-// *******************
-// * ID = Skill Name *
-// *******************
-ID Skill Name
-1 = NV_BASIC
-2 = SM_SWORD
-3 = SM_TWOHAND
-4 = SM_RECOVERY
-5 = SM_BASH
-6 = SM_PROVOKE
-7 = SM_MAGNUM
-8 = SM_ENDURE
-9 = MG_SRECOVERY
-10 = MG_SIGHT
-11 = MG_NAPALMBEAT
-12 = MG_SAFETYWALL
-13 = MG_SOULSTRIKE
-14 = MG_COLDBOLT
-15 = MG_FROSTDIVER
-16 = MG_STONECURSE
-17 = MG_FIREBALL
-18 = MG_FIREWALL
-19 = MG_FIREBOLT
-20 = MG_LIGHTNINGBOLT
-21 = MG_THUNDERSTORM
-22 = AL_DP
-23 = AL_DEMONBANE
-24 = AL_RUWACH
-25 = AL_PNEUMA
-26 = AL_TELEPORT
-27 = AL_WARP
-28 = AL_HEAL
-29 = AL_INCAGI
-30 = AL_DECAGI
-31 = AL_HOLYWATER
-32 = AL_CRUCIS
-33 = AL_ANGELUS
-34 = AL_BLESSING
-35 = AL_CURE
-36 = MC_INCCARRY
-37 = MC_DISCOUNT
-38 = MC_OVERCHARGE
-39 = MC_PUSHCART
-40 = MC_IDENTIFY
-41 = MC_VENDING
-42 = MC_MAMMONITE
-43 = AC_OWL
-44 = AC_VULTURE
-45 = AC_CONCENTRATION
-46 = AC_DOUBLE
-47 = AC_SHOWER
-48 = TF_DOUBLE
-49 = TF_MISS
-50 = TF_STEAL
-51 = TF_HIDING
-52 = TF_POISON
-53 = TF_DETOXIFY
-54 = ALL_RESURRECTION
-55 = KN_SPEARMASTERY
-56 = KN_PIERCE
-57 = KN_BRANDISHSPEAR
-58 = KN_SPEARSTAB
-59 = KN_SPEARBOOMERANG
-60 = KN_TWOHANDQUICKEN
-61 = KN_AUTOCOUNTER
-62 = KN_BOWLINGBASH
-63 = KN_RIDING
-64 = KN_CAVALIERMASTERY
-65 = PR_MACEMASTERY
-66 = PR_IMPOSITIO
-67 = PR_SUFFRAGIUM
-68 = PR_ASPERSIO
-69 = PR_BENEDICTIO
-70 = PR_SANCTUARY
-71 = PR_SLOWPOISON
-72 = PR_STRECOVERY
-73 = PR_KYRIE
-74 = PR_MAGNIFICAT
-75 = PR_GLORIA
-76 = PR_LEXDIVINA
-77 = PR_TURNUNDEAD
-78 = PR_LEXAETERNA
-79 = PR_MAGNUS
-80 = WZ_FIREPILLAR
-81 = WZ_SIGHTRASHER
-83 = WZ_METEOR
-84 = WZ_JUPITEL
-85 = WZ_VERMILION
-86 = WZ_WATERBALL
-87 = WZ_ICEWALL
-88 = WZ_FROSTNOVA
-89 = WZ_STORMGUST
-90 = WZ_EARTHSPIKE
-91 = WZ_HEAVENDRIVE
-92 = WZ_QUAGMIRE
-93 = WZ_ESTIMATION
-94 = BS_IRON
-95 = BS_STEEL
-96 = BS_ENCHANTEDSTONE
-97 = BS_ORIDEOCON
-98 = BS_DAGGER
-99 = BS_SWORD
-100 = BS_TWOHANDSWORD
-101 = BS_AXE
-102 = BS_MACE
-103 = BS_KNUCKLE
-104 = BS_SPEAR
-105 = BS_HILTBINDING
-106 = BS_FINDINGORE
-107 = BS_WEAPONRESEARCH
-108 = BS_REPAIRWEAPON
-109 = BS_SKINTEMPER
-110 = BS_HAMMERFALL
-111 = BS_ADRENALINE
-112 = BS_WEAPONPERFECT
-113 = BS_OVERTHRUST
-114 = BS_MAXIMIZE
-115 = HT_SKIDTRAP
-116 = HT_LANDMINE
-117 = HT_ANKLESNARE
-118 = HT_SHOCKWAVE
-119 = HT_SANDMAN
-120 = HT_FLASHER
-121 = HT_FREEZINGTRAP
-122 = HT_BLASTMINE
-123 = HT_CLAYMORETRAP
-124 = HT_REMOVETRAP
-125 = HT_TALKIEBOX
-126 = HT_BEASTBANE
-127 = HT_FALCON
-128 = HT_STEELCROW
-129 = HT_BLITZBEAT
-130 = HT_DETECTING
-131 = HT_SPRINGTRAP
-132 = AS_RIGHT
-133 = AS_LEFT
-134 = AS_KATAR
-135 = AS_CLOAKING
-136 = AS_SONICBLOW
-137 = AS_GRIMTOOTH
-138 = AS_ENCHANTPOISON
-139 = AS_POISONREACT
-140 = AS_VENOMDUST
-141 = AS_SPLASHER
-142 = NV_FIRSTAID
-143 = NV_TRICKDEAD
-144 = SM_MOVINGRECOVERY
-145 = SM_FATALBLOW
-146 = SM_AUTOBERSERK
-147 = AC_MAKINGARROW
-148 = AC_CHARGEARROW
-149 = TF_SPRINKLESAND
-150 = TF_BACKSLIDING
-151 = TF_PICKSTONE
-152 = TF_THROWSTONE
-153 = MC_CARTREVOLUTION
-154 = MC_CHANGECART
-155 = MC_LOUD
-156 = AL_HOLYLIGHT
-157 = MG_ENERGYCOAT
-158 = NPC_PIERCINGATT
-159 = NPC_MENTALBREAKER
-160 = NPC_RANGEATTACK
-161 = NPC_ATTRICHANGE
-162 = NPC_CHANGEWATER
-163 = NPC_CHANGEGROUND
-164 = NPC_CHANGEFIRE
-165 = NPC_CHANGEWIND
-166 = NPC_CHANGEPOISON
-167 = NPC_CHANGEHOLY
-168 = NPC_CHANGEDARLNESS
-169 = NPC_CHANGETELEKINESIS
-170 = NPC_CRITICALSLASH
-171 = NPC_COMBOATTACK
-172 = NPC_GUIDEATTACK
-173 = NPC_SELFDESTRUCTION
-174 = NPC_SPLASHATTACK
-175 = NPC_SUICIDE
-176 = NPC_POISON
-177 = NPC_BLINDATTACK
-178 = NPC_SILENCEATTACK
-179 = NPC_STUNATTACK
-180 = NPC_PETRIFYATTACK
-181 = NPC_CURSEATTACK
-182 = NPC_SLEEPATTACK
-183 = NPC_RANDOMATTACK
-184 = NPC_WATERATTACK
-185 = NPC_GROUNDATTACK
-186 = NPC_FIREATTACK
-187 = NPC_WINDATTACK
-188 = NPC_POISONATTACK
-189 = NPC_HOLYATTACK
-190 = NPC_DARKNESSATTACK
-191 = NPC_TELEKINESISATTACK
-192 = NPC_MAGICALATTACK
-193 = NPC_METAMORPHOSIS
-194 = NPC_PROVOCATION
-195 = NPC_SMOKING
-196 = NPC_SUMMONSLAVE
-197 = NPC_EMOTION
-198 = NPC_TRANSFORMATION
-199 = NPC_BLOODDRAIN
-200 = NPC_ENERGYDRAIN
-201 = NPC_KEEPING
-202 = NPC_DARKBREATH
-203 = NPC_DARKBLESSING
-204 = NPC_BARRIER
-205 = NPC_DEFENDER
-206 = NPC_LICK
-207 = NPC_HALLUCINATION
-208 = NPC_REBIRTH
-209 = NPC_SUMMONMONSTER
-210 = RG_SNATCHER
-211 = RG_STEALCOIN
-212 = RG_BACKSTAP
-213 = RG_TUNNELDRIVE
-214 = RG_RAID
-215 = RG_STRIPWEAPON
-216 = RG_STRIPSHIELD
-217 = RG_STRIPARMOR
-218 = RG_STRIPHELM
-219 = RG_INTIMIDATE
-220 = RG_GRAFFITI
-221 = RG_FLAGGRAFFITI
-222 = RG_CLEANER
-223 = RG_GANGSTER
-224 = RG_COMPULSION
-225 = RG_PLAGIARISM
-226 = AM_AXEMASTERY
-227 = AM_LEARNINGPOTION
-228 = AM_PHARMACY
-229 = AM_DEMONSTRATION
-230 = AM_ACIDTERROR
-231 = AM_POTIONPITCHER
-232 = AM_CANNIBALIZE
-233 = AM_SPHEREMINE
-234 = AM_CP_WEAPON
-235 = AM_CP_SHIELD
-236 = AM_CP_ARMOR
-237 = AM_CP_HELM
-248 = CR_TRUST
-249 = CR_AUTOGUARD
-250 = CR_SHIELDCHARGE
-251 = CR_SHIELDBOOMERANG
-252 = CR_REFLECTSHIELD
-253 = CR_HOLYCROSS
-254 = CR_GRANDCROSS
-255 = CR_DEVOTION
-256 = CR_PROVIDENCE
-257 = CR_DEFENDER
-258 = CR_SPEARQUICKEN
-259 = MO_IRONHAND
-260 = MO_SPIRITSRECOVERY
-261 = MO_CALLSPIRITS
-262 = MO_ABSORBSPIRITS
-263 = MO_TRIPLEATTACK
-264 = MO_BODYRELOCATION
-265 = MO_DODGE
-266 = MO_INVESTIGATE
-267 = MO_FINGEROFFENSIVE
-268 = MO_STEELBODY
-269 = MO_BLADESTOP
-270 = MO_EXPLOSIONSPIRITS
-271 = MO_EXTREMITYFIST
-272 = MO_CHAINCOMBO
-273 = MO_COMBOFINISH
-274 = SA_ADVANCEDBOOK
-275 = SA_CASTCANCEL
-276 = SA_MAGICROD
-277 = SA_SPELLBREAKER
-278 = SA_FREECAST
-279 = SA_AUTOSPELL
-280 = SA_FLAMELAUNCHER
-281 = SA_FROSTWEAPON
-282 = SA_LIGHTNINGLOADER
-283 = SA_SEISMICWEAPON
-284 = SA_DRAGONOLOGY
-285 = SA_VOLCANO
-286 = SA_DELUGE
-287 = SA_VIOLENTGALE
-288 = SA_LANDPROTECTOR
-289 = SA_DISPELL
-290 = SA_ABRACADABRA
-291 = SA_MONOCELL
-292 = SA_CLASSCHANGE
-293 = SA_SUMMONMONSTER
-294 = SA_REVERSEORCISH
-295 = SA_DEATH
-296 = SA_FORTUNE
-297 = SA_TAMINGMONSTER
-298 = SA_QUESTION
-299 = SA_GRAVITY
-300 = SA_LEVELUP
-301 = SA_INSTANTDEATH
-302 = SA_FULLRECOVERY
-303 = SA_COMA
-304 = BD_ADAPTATION
-305 = BD_ENCORE
-306 = BD_LULLABY
-307 = BD_RICHMANKIM
-308 = BD_ETERNALCHAOS
-309 = BD_DRUMBATTLEFIELD
-310 = BD_RINGNIBELUNGEN
-311 = BD_ROKISWEIL
-312 = BD_INTOABYSS
-313 = BD_SIEGFRIED
-315 = BA_MUSICALLESSON
-316 = BA_MUSICALSTRIKE
-317 = BA_DISSONANCE
-318 = BA_FROSTJOKE
-319 = BA_WHISTLE
-320 = BA_ASSASSINCROSS
-321 = BA_POEMBRAGI
-322 = BA_APPLEIDUN
-323 = DC_DANCINGLESSON
-324 = DC_THROWARROW
-325 = DC_UGLYDANCE
-326 = DC_SCREAM
-327 = DC_HUMMING
-328 = DC_DONTFORGETME
-329 = DC_FORTUNEKISS
-330 = DC_SERVICEFORYOU
-334 = WE_MALE
-335 = WE_FEMALE
-336 = WE_CALLPARTNER
-355 = LK_AURABLADE
-356 = LK_PARRYING
-357 = LK_CONCENTRATION
-358 = LK_TENSIONRELAX
-359 = LK_BERSERK
-361 = HP_ASSUMPTIO
-362 = HP_BASILICA
-363 = HP_MEDITATIO
-364 = HW_SOULDRAIN
-365 = HW_MAGICCRASHER
-366 = HW_MAGICPOWER
-367 = PA_PRESSURE
-368 = PA_SACRIFICE
-369 = PA_GOSPEL
-370 = CH_PALMSTRIKE
-371 = CH_TIGERFIST
-372 = CH_CHAINCRUSH
-373 = PF_HPCONVERSION
-374 = PF_SOULCHANGE
-375 = PF_SOULBURN
-376 = ASC_KATAR
-377 = ASC_HALLUCINATION
-378 = ASC_EDP
-379 = ASC_BREAKER
-380 = SN_SIGHT
-381 = SN_FALCONASSAULT
-382 = SN_SHARPSHOOTING
-383 = SN_WINDWALK
-384 = WS_MELTDOWN
-385 = WS_CREATECOIN
-386 = WS_CREATENUGGET
-387 = WS_CARTBOOST
-388 = WS_SYSTEMCREATE
-389 = ST_CHASEWALK
-390 = ST_REJECTSWORD
-392 = CR_ALCHEMY
-393 = CR_SYNTHESISPOTION
-394 = CG_ARROWVULCAN
-395 = CG_MOONLIT
-396 = CG_MARIONETTE
-397 = LK_SPIRALPIERCE
-398 = LK_HEADCRUSH
-399 = LK_JOINTBEAT
-400 = HW_NAPALMVULCAN
-401 = CH_SOULCOLLECT
-402 = PF_MINDBREAKER
-403 = PF_MEMORIZE
-404 = PF_FOGWALL
-405 = PF_SPIDERWEB
-406 = ASC_METEORASSAULT
-407 = ASC_CDP
-408 = WE_BABY
-409 = WE_CALLPARENT
-410 = WE_CALLBABY
-411 = TK_RUN
-412 = TK_READYSTORM
-413 = TK_STORMKICK
-414 = TK_READYDOWN
-415 = TK_DOWNKICK
-416 = TK_READYTURN
-417 = TK_TURNKICK
-418 = TK_READYCOUNTER
-419 = TK_COUNTER
-420 = TK_DODGE
-421 = TK_JUMPKICK
-422 = TK_HPTIME
-423 = TK_SPTIME
-424 = TK_POWER
-425 = TK_SEVENWIND
-426 = TK_HIGHJUMP
-427 = SG_FEEL
-428 = SG_SUN_WARM
-429 = SG_MOON_WARM
-430 = SG_STAR_WARM
-431 = SG_SUN_COMFORT
-432 = SG_MOON_COMFORT
-433 = SG_STAR_COMFORT
-434 = SG_HATE
-435 = SG_SUN_ANGER
-436 = SG_MOON_ANGER
-437 = SG_STAR_ANGER
-438 = SG_SUN_BLESS
-439 = SG_MOON_BLESS
-440 = SG_STAR_BLESS
-441 = SG_DEVIL
-442 = SG_FRIEND
-443 = SG_KNOWLEDGE
-444 = SG_FUSION
-445 = SL_ALCHEMIST
-446 = AM_BERSERKPITCHER
-447 = SL_MONK
-448 = SL_STAR
-449 = SL_SAGE
-450 = SL_CRUSADER
-451 = SL_SUPERNOVICE
-452 = SL_KNIGHT
-453 = SL_WIZARD
-454 = SL_PRIEST
-455 = SL_BARDDANCER
-456 = SL_ROGUE
-457 = SL_ASSASIN
-458 = SL_BLACKSMITH
-459 = BS_ADRENALINE2
-460 = SL_HUNTER
-461 = SL_SOULLINKER
-462 = SL_KAIZEL
-463 = SL_KAAHI
-464 = SL_KAUPE
-465 = SL_KAITE
-466 = SL_KAINA
-467 = SL_STIN
-468 = SL_STUN
-469 = SL_SMA
-470 = SL_SWOO
-471 = SL_SKE
-472 = SL_SKA
-10000 = GD_APPROVAL
-10001 = GD_KAFRACONTRACT
-10002 = GD_GUARDRESEARCH
-10003 = GD_CHARISMA
-10004 = GD_EXTENSION
-
-// ************************
-// * Item DB - Use Script *
-// ************************
-itemskill:
- -Format: itemskill skill_id,skill_lvl,"name";
- -Example: itemskill 28,3,"Heal"; //Healing skill
-
-itemheal:
- -Format: itemheal hp,sp;
- -Example: itemheal 30,0; //+30 HP, +0 SP.
-
-sc_start:
- -Format: sc_start SC_CONSTANT,duration,value;
- -Example: sc_start SC_POISON,1800,; //Starts Poison Status for 30 seconds
-
-sc_end:
- -Format: sc_end SC_CONSTANT;
- -Example: sc_end SC_BLIND; //Ends Blind Status
-
-warp:
- -Format: warp "map",x,y;
- -Example: warp "Random",0,0; //Fly wing
- -Example: warp "SavePoint",0,0; //Butterfly wing
-
-getitem:
- -Format: getitem item_id,count;
- -Example: getitem 512,2; //Gives you two Apples
-
-produce:
- -Format: produce produce_type;
- -Example: produce 16; //Mini-furnace
-
-pet:
- -Format: pet pet_id;
- -Example: pet 1002; //Taming item for Poring
-
-monster:
- -Example: monster "this",0,0,"--ja--",-1,1,""; //Dead branch
-
-percentheal:
- -Format: percentheal percent_hp,percent_sp;
- -Example: percentheal 100,100; //Heals you 100% of both HP and SP
-
-// **************************
-// * Item DB - Equip Script *
+// ****************************************************
+// * Miscellaneous Notes (Added by MC Cameri) *
+// ****************************************************
+
+// *****************************************************************
+// * Emotions that will be shown if 'int type' is one of the case. *
+// *****************************************************************
+void clif_emotion(struct block_list *bl,int type);
+case for 'int type':
+0 = ! 10 = KO (Scissor) 20 = Hmmm 30 = Kiss 1 (R) 40 = Tsk tsk tsk (No)
+1 = ? 11 = Fist (Stone) 21 = Number 1! 31 = Kiss 2 (L) 41 = Petting
+2 = Music 12 = Hand (Paper) 22 = No (??) 32 = Smoking 42 = SP! (Timer)
+3 = Heart 1 13 = Korean Flag 23 = OMG!! 33 = Okay 43 = Obsessed 2 (Dumb face, eyes popping)
+4 = Sweat 14 = Heart 2 24 = O 34 = ... (Bugged) 44 = Come (Moving finger)
+5 = Light bulb 15 = Thanks 25 = X 35 = ??? Flag 45 = Yawn (Sleepy)
+6 = Annoyed 16 = Wah (Crying) 26 = Help! 36 = Evil 2 46 = Congratulations
+7 = Smoke cloud 17 = Sorry 27 = Go! 37 = Obsessed 1 47 = HP! (Timer)
+8 = $ 18 = Heh (Laughing) 28 = Sobbing 38 = Two Hearts
+9 = ... 19 = Sweating 29 = Evil 1 39 = Tongue
+
+// ********************************
+// * Elemental Defense Resistance *
+// ********************************
+sd->subele[0] - Neutral Property
+sd->subele[1] - Water Property
+sd->subele[2] - Earth Property
+sd->subele[3] - Fire Property
+sd->subele[4] - Wind Property
+sd->subele[5] - Poison Property
+sd->subele[6] - Holy Property
+sd->subele[7] - Shadow Property
+sd->subele[8] - Ghost Property
+sd->subele[9] - Undead Property
+
+// ***************************************
+// * Elemental Monster Attack Resistance *
+// ***************************************
+
+sd->subrace[0] - Neutral Type
+sd->subrace[1] - Undead Type
+sd->subrace[2] - Brute Type
+sd->subrace[3] - Plant Type
+sd->subrace[4] - Insect Type
+sd->subrace[5] - Fish Type
+sd->subrace[6] - Demon Type
+sd->subrace[7] - Demi-Human Type
+sd->subrace[8] - Angel Type
+sd->subrace[9] - Dragon Type
+sd->subrace[10] - Boss Type #1?
+sd->subrace[11] - Boss Type #2?
+
+// **************
+// * Misc stuff *
+// **************
+
+WFIFOL(fd,2)=1; - Sever Closed
+
+// *******************
+// * Skills List *
+// *******************
+// * ID = Skill Name *
+// *******************
+ID Skill Name
+1 = NV_BASIC
+2 = SM_SWORD
+3 = SM_TWOHAND
+4 = SM_RECOVERY
+5 = SM_BASH
+6 = SM_PROVOKE
+7 = SM_MAGNUM
+8 = SM_ENDURE
+9 = MG_SRECOVERY
+10 = MG_SIGHT
+11 = MG_NAPALMBEAT
+12 = MG_SAFETYWALL
+13 = MG_SOULSTRIKE
+14 = MG_COLDBOLT
+15 = MG_FROSTDIVER
+16 = MG_STONECURSE
+17 = MG_FIREBALL
+18 = MG_FIREWALL
+19 = MG_FIREBOLT
+20 = MG_LIGHTNINGBOLT
+21 = MG_THUNDERSTORM
+22 = AL_DP
+23 = AL_DEMONBANE
+24 = AL_RUWACH
+25 = AL_PNEUMA
+26 = AL_TELEPORT
+27 = AL_WARP
+28 = AL_HEAL
+29 = AL_INCAGI
+30 = AL_DECAGI
+31 = AL_HOLYWATER
+32 = AL_CRUCIS
+33 = AL_ANGELUS
+34 = AL_BLESSING
+35 = AL_CURE
+36 = MC_INCCARRY
+37 = MC_DISCOUNT
+38 = MC_OVERCHARGE
+39 = MC_PUSHCART
+40 = MC_IDENTIFY
+41 = MC_VENDING
+42 = MC_MAMMONITE
+43 = AC_OWL
+44 = AC_VULTURE
+45 = AC_CONCENTRATION
+46 = AC_DOUBLE
+47 = AC_SHOWER
+48 = TF_DOUBLE
+49 = TF_MISS
+50 = TF_STEAL
+51 = TF_HIDING
+52 = TF_POISON
+53 = TF_DETOXIFY
+54 = ALL_RESURRECTION
+55 = KN_SPEARMASTERY
+56 = KN_PIERCE
+57 = KN_BRANDISHSPEAR
+58 = KN_SPEARSTAB
+59 = KN_SPEARBOOMERANG
+60 = KN_TWOHANDQUICKEN
+61 = KN_AUTOCOUNTER
+62 = KN_BOWLINGBASH
+63 = KN_RIDING
+64 = KN_CAVALIERMASTERY
+65 = PR_MACEMASTERY
+66 = PR_IMPOSITIO
+67 = PR_SUFFRAGIUM
+68 = PR_ASPERSIO
+69 = PR_BENEDICTIO
+70 = PR_SANCTUARY
+71 = PR_SLOWPOISON
+72 = PR_STRECOVERY
+73 = PR_KYRIE
+74 = PR_MAGNIFICAT
+75 = PR_GLORIA
+76 = PR_LEXDIVINA
+77 = PR_TURNUNDEAD
+78 = PR_LEXAETERNA
+79 = PR_MAGNUS
+80 = WZ_FIREPILLAR
+81 = WZ_SIGHTRASHER
+83 = WZ_METEOR
+84 = WZ_JUPITEL
+85 = WZ_VERMILION
+86 = WZ_WATERBALL
+87 = WZ_ICEWALL
+88 = WZ_FROSTNOVA
+89 = WZ_STORMGUST
+90 = WZ_EARTHSPIKE
+91 = WZ_HEAVENDRIVE
+92 = WZ_QUAGMIRE
+93 = WZ_ESTIMATION
+94 = BS_IRON
+95 = BS_STEEL
+96 = BS_ENCHANTEDSTONE
+97 = BS_ORIDEOCON
+98 = BS_DAGGER
+99 = BS_SWORD
+100 = BS_TWOHANDSWORD
+101 = BS_AXE
+102 = BS_MACE
+103 = BS_KNUCKLE
+104 = BS_SPEAR
+105 = BS_HILTBINDING
+106 = BS_FINDINGORE
+107 = BS_WEAPONRESEARCH
+108 = BS_REPAIRWEAPON
+109 = BS_SKINTEMPER
+110 = BS_HAMMERFALL
+111 = BS_ADRENALINE
+112 = BS_WEAPONPERFECT
+113 = BS_OVERTHRUST
+114 = BS_MAXIMIZE
+115 = HT_SKIDTRAP
+116 = HT_LANDMINE
+117 = HT_ANKLESNARE
+118 = HT_SHOCKWAVE
+119 = HT_SANDMAN
+120 = HT_FLASHER
+121 = HT_FREEZINGTRAP
+122 = HT_BLASTMINE
+123 = HT_CLAYMORETRAP
+124 = HT_REMOVETRAP
+125 = HT_TALKIEBOX
+126 = HT_BEASTBANE
+127 = HT_FALCON
+128 = HT_STEELCROW
+129 = HT_BLITZBEAT
+130 = HT_DETECTING
+131 = HT_SPRINGTRAP
+132 = AS_RIGHT
+133 = AS_LEFT
+134 = AS_KATAR
+135 = AS_CLOAKING
+136 = AS_SONICBLOW
+137 = AS_GRIMTOOTH
+138 = AS_ENCHANTPOISON
+139 = AS_POISONREACT
+140 = AS_VENOMDUST
+141 = AS_SPLASHER
+142 = NV_FIRSTAID
+143 = NV_TRICKDEAD
+144 = SM_MOVINGRECOVERY
+145 = SM_FATALBLOW
+146 = SM_AUTOBERSERK
+147 = AC_MAKINGARROW
+148 = AC_CHARGEARROW
+149 = TF_SPRINKLESAND
+150 = TF_BACKSLIDING
+151 = TF_PICKSTONE
+152 = TF_THROWSTONE
+153 = MC_CARTREVOLUTION
+154 = MC_CHANGECART
+155 = MC_LOUD
+156 = AL_HOLYLIGHT
+157 = MG_ENERGYCOAT
+158 = NPC_PIERCINGATT
+159 = NPC_MENTALBREAKER
+160 = NPC_RANGEATTACK
+161 = NPC_ATTRICHANGE
+162 = NPC_CHANGEWATER
+163 = NPC_CHANGEGROUND
+164 = NPC_CHANGEFIRE
+165 = NPC_CHANGEWIND
+166 = NPC_CHANGEPOISON
+167 = NPC_CHANGEHOLY
+168 = NPC_CHANGEDARLNESS
+169 = NPC_CHANGETELEKINESIS
+170 = NPC_CRITICALSLASH
+171 = NPC_COMBOATTACK
+172 = NPC_GUIDEATTACK
+173 = NPC_SELFDESTRUCTION
+174 = NPC_SPLASHATTACK
+175 = NPC_SUICIDE
+176 = NPC_POISON
+177 = NPC_BLINDATTACK
+178 = NPC_SILENCEATTACK
+179 = NPC_STUNATTACK
+180 = NPC_PETRIFYATTACK
+181 = NPC_CURSEATTACK
+182 = NPC_SLEEPATTACK
+183 = NPC_RANDOMATTACK
+184 = NPC_WATERATTACK
+185 = NPC_GROUNDATTACK
+186 = NPC_FIREATTACK
+187 = NPC_WINDATTACK
+188 = NPC_POISONATTACK
+189 = NPC_HOLYATTACK
+190 = NPC_DARKNESSATTACK
+191 = NPC_TELEKINESISATTACK
+192 = NPC_MAGICALATTACK
+193 = NPC_METAMORPHOSIS
+194 = NPC_PROVOCATION
+195 = NPC_SMOKING
+196 = NPC_SUMMONSLAVE
+197 = NPC_EMOTION
+198 = NPC_TRANSFORMATION
+199 = NPC_BLOODDRAIN
+200 = NPC_ENERGYDRAIN
+201 = NPC_KEEPING
+202 = NPC_DARKBREATH
+203 = NPC_DARKBLESSING
+204 = NPC_BARRIER
+205 = NPC_DEFENDER
+206 = NPC_LICK
+207 = NPC_HALLUCINATION
+208 = NPC_REBIRTH
+209 = NPC_SUMMONMONSTER
+210 = RG_SNATCHER
+211 = RG_STEALCOIN
+212 = RG_BACKSTAP
+213 = RG_TUNNELDRIVE
+214 = RG_RAID
+215 = RG_STRIPWEAPON
+216 = RG_STRIPSHIELD
+217 = RG_STRIPARMOR
+218 = RG_STRIPHELM
+219 = RG_INTIMIDATE
+220 = RG_GRAFFITI
+221 = RG_FLAGGRAFFITI
+222 = RG_CLEANER
+223 = RG_GANGSTER
+224 = RG_COMPULSION
+225 = RG_PLAGIARISM
+226 = AM_AXEMASTERY
+227 = AM_LEARNINGPOTION
+228 = AM_PHARMACY
+229 = AM_DEMONSTRATION
+230 = AM_ACIDTERROR
+231 = AM_POTIONPITCHER
+232 = AM_CANNIBALIZE
+233 = AM_SPHEREMINE
+234 = AM_CP_WEAPON
+235 = AM_CP_SHIELD
+236 = AM_CP_ARMOR
+237 = AM_CP_HELM
+248 = CR_TRUST
+249 = CR_AUTOGUARD
+250 = CR_SHIELDCHARGE
+251 = CR_SHIELDBOOMERANG
+252 = CR_REFLECTSHIELD
+253 = CR_HOLYCROSS
+254 = CR_GRANDCROSS
+255 = CR_DEVOTION
+256 = CR_PROVIDENCE
+257 = CR_DEFENDER
+258 = CR_SPEARQUICKEN
+259 = MO_IRONHAND
+260 = MO_SPIRITSRECOVERY
+261 = MO_CALLSPIRITS
+262 = MO_ABSORBSPIRITS
+263 = MO_TRIPLEATTACK
+264 = MO_BODYRELOCATION
+265 = MO_DODGE
+266 = MO_INVESTIGATE
+267 = MO_FINGEROFFENSIVE
+268 = MO_STEELBODY
+269 = MO_BLADESTOP
+270 = MO_EXPLOSIONSPIRITS
+271 = MO_EXTREMITYFIST
+272 = MO_CHAINCOMBO
+273 = MO_COMBOFINISH
+274 = SA_ADVANCEDBOOK
+275 = SA_CASTCANCEL
+276 = SA_MAGICROD
+277 = SA_SPELLBREAKER
+278 = SA_FREECAST
+279 = SA_AUTOSPELL
+280 = SA_FLAMELAUNCHER
+281 = SA_FROSTWEAPON
+282 = SA_LIGHTNINGLOADER
+283 = SA_SEISMICWEAPON
+284 = SA_DRAGONOLOGY
+285 = SA_VOLCANO
+286 = SA_DELUGE
+287 = SA_VIOLENTGALE
+288 = SA_LANDPROTECTOR
+289 = SA_DISPELL
+290 = SA_ABRACADABRA
+291 = SA_MONOCELL
+292 = SA_CLASSCHANGE
+293 = SA_SUMMONMONSTER
+294 = SA_REVERSEORCISH
+295 = SA_DEATH
+296 = SA_FORTUNE
+297 = SA_TAMINGMONSTER
+298 = SA_QUESTION
+299 = SA_GRAVITY
+300 = SA_LEVELUP
+301 = SA_INSTANTDEATH
+302 = SA_FULLRECOVERY
+303 = SA_COMA
+304 = BD_ADAPTATION
+305 = BD_ENCORE
+306 = BD_LULLABY
+307 = BD_RICHMANKIM
+308 = BD_ETERNALCHAOS
+309 = BD_DRUMBATTLEFIELD
+310 = BD_RINGNIBELUNGEN
+311 = BD_ROKISWEIL
+312 = BD_INTOABYSS
+313 = BD_SIEGFRIED
+315 = BA_MUSICALLESSON
+316 = BA_MUSICALSTRIKE
+317 = BA_DISSONANCE
+318 = BA_FROSTJOKE
+319 = BA_WHISTLE
+320 = BA_ASSASSINCROSS
+321 = BA_POEMBRAGI
+322 = BA_APPLEIDUN
+323 = DC_DANCINGLESSON
+324 = DC_THROWARROW
+325 = DC_UGLYDANCE
+326 = DC_SCREAM
+327 = DC_HUMMING
+328 = DC_DONTFORGETME
+329 = DC_FORTUNEKISS
+330 = DC_SERVICEFORYOU
+334 = WE_MALE
+335 = WE_FEMALE
+336 = WE_CALLPARTNER
+355 = LK_AURABLADE
+356 = LK_PARRYING
+357 = LK_CONCENTRATION
+358 = LK_TENSIONRELAX
+359 = LK_BERSERK
+361 = HP_ASSUMPTIO
+362 = HP_BASILICA
+363 = HP_MEDITATIO
+364 = HW_SOULDRAIN
+365 = HW_MAGICCRASHER
+366 = HW_MAGICPOWER
+367 = PA_PRESSURE
+368 = PA_SACRIFICE
+369 = PA_GOSPEL
+370 = CH_PALMSTRIKE
+371 = CH_TIGERFIST
+372 = CH_CHAINCRUSH
+373 = PF_HPCONVERSION
+374 = PF_SOULCHANGE
+375 = PF_SOULBURN
+376 = ASC_KATAR
+377 = ASC_HALLUCINATION
+378 = ASC_EDP
+379 = ASC_BREAKER
+380 = SN_SIGHT
+381 = SN_FALCONASSAULT
+382 = SN_SHARPSHOOTING
+383 = SN_WINDWALK
+384 = WS_MELTDOWN
+385 = WS_CREATECOIN
+386 = WS_CREATENUGGET
+387 = WS_CARTBOOST
+388 = WS_SYSTEMCREATE
+389 = ST_CHASEWALK
+390 = ST_REJECTSWORD
+392 = CR_ALCHEMY
+393 = CR_SYNTHESISPOTION
+394 = CG_ARROWVULCAN
+395 = CG_MOONLIT
+396 = CG_MARIONETTE
+397 = LK_SPIRALPIERCE
+398 = LK_HEADCRUSH
+399 = LK_JOINTBEAT
+400 = HW_NAPALMVULCAN
+401 = CH_SOULCOLLECT
+402 = PF_MINDBREAKER
+403 = PF_MEMORIZE
+404 = PF_FOGWALL
+405 = PF_SPIDERWEB
+406 = ASC_METEORASSAULT
+407 = ASC_CDP
+408 = WE_BABY
+409 = WE_CALLPARENT
+410 = WE_CALLBABY
+411 = TK_RUN
+412 = TK_READYSTORM
+413 = TK_STORMKICK
+414 = TK_READYDOWN
+415 = TK_DOWNKICK
+416 = TK_READYTURN
+417 = TK_TURNKICK
+418 = TK_READYCOUNTER
+419 = TK_COUNTER
+420 = TK_DODGE
+421 = TK_JUMPKICK
+422 = TK_HPTIME
+423 = TK_SPTIME
+424 = TK_POWER
+425 = TK_SEVENWIND
+426 = TK_HIGHJUMP
+427 = SG_FEEL
+428 = SG_SUN_WARM
+429 = SG_MOON_WARM
+430 = SG_STAR_WARM
+431 = SG_SUN_COMFORT
+432 = SG_MOON_COMFORT
+433 = SG_STAR_COMFORT
+434 = SG_HATE
+435 = SG_SUN_ANGER
+436 = SG_MOON_ANGER
+437 = SG_STAR_ANGER
+438 = SG_SUN_BLESS
+439 = SG_MOON_BLESS
+440 = SG_STAR_BLESS
+441 = SG_DEVIL
+442 = SG_FRIEND
+443 = SG_KNOWLEDGE
+444 = SG_FUSION
+445 = SL_ALCHEMIST
+446 = AM_BERSERKPITCHER
+447 = SL_MONK
+448 = SL_STAR
+449 = SL_SAGE
+450 = SL_CRUSADER
+451 = SL_SUPERNOVICE
+452 = SL_KNIGHT
+453 = SL_WIZARD
+454 = SL_PRIEST
+455 = SL_BARDDANCER
+456 = SL_ROGUE
+457 = SL_ASSASIN
+458 = SL_BLACKSMITH
+459 = BS_ADRENALINE2
+460 = SL_HUNTER
+461 = SL_SOULLINKER
+462 = SL_KAIZEL
+463 = SL_KAAHI
+464 = SL_KAUPE
+465 = SL_KAITE
+466 = SL_KAINA
+467 = SL_STIN
+468 = SL_STUN
+469 = SL_SMA
+470 = SL_SWOO
+471 = SL_SKE
+472 = SL_SKA
+10000 = GD_APPROVAL
+10001 = GD_KAFRACONTRACT
+10002 = GD_GUARDRESEARCH
+10003 = GD_CHARISMA
+10004 = GD_EXTENSION
+
+// ************************
+// * Item DB - Use Script *
+// ************************
+itemskill:
+ -Format: itemskill skill_id,skill_lvl,"name";
+ -Example: itemskill 28,3,"Heal"; //Healing skill
+
+itemheal:
+ -Format: itemheal hp,sp;
+ -Example: itemheal 30,0; //+30 HP, +0 SP.
+
+sc_start:
+ -Format: sc_start SC_CONSTANT,duration,value;
+ -Example: sc_start SC_POISON,1800,; //Starts Poison Status for 30 seconds
+
+sc_end:
+ -Format: sc_end SC_CONSTANT;
+ -Example: sc_end SC_BLIND; //Ends Blind Status
+
+warp:
+ -Format: warp "map",x,y;
+ -Example: warp "Random",0,0; //Fly wing
+ -Example: warp "SavePoint",0,0; //Butterfly wing
+
+getitem:
+ -Format: getitem item_id,count;
+ -Example: getitem 512,2; //Gives you two Apples
+
+produce:
+ -Format: produce produce_type;
+ -Example: produce 16; //Mini-furnace
+
+pet:
+ -Format: pet pet_id;
+ -Example: pet 1002; //Taming item for Poring
+
+monster:
+ -Example: monster "this",0,0,"--ja--",-1,1,""; //Dead branch
+
+percentheal:
+ -Format: percentheal percent_hp,percent_sp;
+ -Example: percentheal 100,100; //Heals you 100% of both HP and SP
+
+// **************************
+// * Item DB - Equip Script *
// ************************** \ No newline at end of file
diff --git a/doc/mob_db_mode_list.txt b/doc/mob_db_mode_list.txt
index edd83a167..3fa713575 100644
--- a/doc/mob_db_mode_list.txt
+++ b/doc/mob_db_mode_list.txt
@@ -1,50 +1,50 @@
-Bit Legend:
-----------
-MD_CANMOVE | 0x001 | 1
-MD_LOOTER | 0x002 | 2
-MD_AGGRESSIVE | 0x004 | 4
-MD_ASSIST | 0x008 | 8
-MD_CASTSENSOR | 0x010 | 16
-MD_BOSS | 0x020 | 32
-MD_PLANT | 0x040 | 64
-MD_CANATTACK | 0x080 | 128
-MD_DETECTOR | 0x100 | 256
-MD_CHANGETARGET | 0x200 | 512 //removed, not needed
-MD_CHANGECHASE | 0x400 | 1024
-MD_ANGRY | 0x800 | 2048
-
-----------
-1: Can Move.
-2: looter.
-4: Aggressive: normal aggressive mob, will look for a close-by player and charge him until death. Aggressive mobs also can change target if they are hit by someone else while chasing someone else.
-8: Assist
-16: Cast Sensor: If mob is aggressive, it will also change targets while chasing/following someone else, otherwise, it'll also be cast-sensitive while idle/random-walking.
-32: Boss. Special flag which makes mobs inmune to certain stuff like status-changes and basilica.
-64: Plant. Always receives 1 damage from stuff.
-128: Can Attack. Everyone with a few exceptions has this. Only prevents normal attacks, not skills.
-256: Detector: can see hidden players. Insects, Demons, and Bosses automatically receive this.
-1024: ChangeChase: When the mob is chasing a player and it passes nearby another player, it will switch targets and hit this other player. Note this only applies if the new player is withing attack range, it won't change it's chase-path to another player!
-2048: Angry: These mobs are "hyper-active". They will change to the closest player while they are following up, They also have skill states "follow" and "angry" (instead of "chase"/"attack") when they pick a new target by their own (ie: not when they change targets due to being attacked). If attacked even once, they loose their Angry mode.
-
-Change Target: (coded)
-Only Assist, Angry or Aggressive+CastSensor mobs can change target while attacking. Target must be no more than 3 cells away.
-Mob in Hyper-active mode can change target unconditionally.
-Mob that chases player can change target only, when he's Aggresive and get attacked.
-
-Old -> New
-----------
-64 -> 64: Plants
-128 -> 0: Passive immobile beings (pupa)
-129 -> 129: Normal enemies
-131 -> 131: looters (porings)
-132 -> 132: Immobile attackers (hydra)
-133 -> 133: Aggressive
-137 -> 137: Assists others (wolves)
-139 -> 139: Assists & loots (thief bugs)
-141 -> 141: Aggressive & Assists (no idea how these would differ from plain aggressive, but there's a lot of enemies defined this way)
-145 -> 145: Detectors (Giearth)
-149 -> 149: Aggressive & Detector (Hunter Fly)
-159 -> 159: Cast sensor, Assist, Agressive, Looter
-171 -> 171: Boss, summons, assists & loots (Golden Thief Bug)
-181 -> 1461: Boss, summons, detector & aggressive (pretty much every MVP and miniboss)
+Bit Legend:
+----------
+MD_CANMOVE | 0x001 | 1
+MD_LOOTER | 0x002 | 2
+MD_AGGRESSIVE | 0x004 | 4
+MD_ASSIST | 0x008 | 8
+MD_CASTSENSOR | 0x010 | 16
+MD_BOSS | 0x020 | 32
+MD_PLANT | 0x040 | 64
+MD_CANATTACK | 0x080 | 128
+MD_DETECTOR | 0x100 | 256
+MD_CHANGETARGET | 0x200 | 512 //removed, not needed
+MD_CHANGECHASE | 0x400 | 1024
+MD_ANGRY | 0x800 | 2048
+
+----------
+1: Can Move.
+2: looter.
+4: Aggressive: normal aggressive mob, will look for a close-by player and charge him until death. Aggressive mobs also can change target if they are hit by someone else while chasing someone else.
+8: Assist
+16: Cast Sensor: If mob is aggressive, it will also change targets while chasing/following someone else, otherwise, it'll also be cast-sensitive while idle/random-walking.
+32: Boss. Special flag which makes mobs inmune to certain stuff like status-changes and basilica.
+64: Plant. Always receives 1 damage from stuff.
+128: Can Attack. Everyone with a few exceptions has this. Only prevents normal attacks, not skills.
+256: Detector: can see hidden players. Insects, Demons, and Bosses automatically receive this.
+1024: ChangeChase: When the mob is chasing a player and it passes nearby another player, it will switch targets and hit this other player. Note this only applies if the new player is withing attack range, it won't change it's chase-path to another player!
+2048: Angry: These mobs are "hyper-active". They will change to the closest player while they are following up, They also have skill states "follow" and "angry" (instead of "chase"/"attack") when they pick a new target by their own (ie: not when they change targets due to being attacked). If attacked even once, they loose their Angry mode.
+
+Change Target: (coded)
+Only Assist, Angry or Aggressive+CastSensor mobs can change target while attacking. Target must be no more than 3 cells away.
+Mob in Hyper-active mode can change target unconditionally.
+Mob that chases player can change target only, when he's Aggresive and get attacked.
+
+Old -> New
+----------
+64 -> 64: Plants
+128 -> 0: Passive immobile beings (pupa)
+129 -> 129: Normal enemies
+131 -> 131: looters (porings)
+132 -> 132: Immobile attackers (hydra)
+133 -> 133: Aggressive
+137 -> 137: Assists others (wolves)
+139 -> 139: Assists & loots (thief bugs)
+141 -> 141: Aggressive & Assists (no idea how these would differ from plain aggressive, but there's a lot of enemies defined this way)
+145 -> 145: Detectors (Giearth)
+149 -> 149: Aggressive & Detector (Hunter Fly)
+159 -> 159: Cast sensor, Assist, Agressive, Looter
+171 -> 171: Boss, summons, assists & loots (Golden Thief Bug)
+181 -> 1461: Boss, summons, detector & aggressive (pretty much every MVP and miniboss)
none -> 2181 : Hyper-active (Familiar) \ No newline at end of file
diff --git a/doc/notes/Changelog.txt b/doc/notes/Changelog.txt
index f01fd92da..ce98dee6c 100644
--- a/doc/notes/Changelog.txt
+++ b/doc/notes/Changelog.txt
@@ -1,11814 +1,11814 @@
-Date Added
-
--------- Read Changelog-SVN.txt for the newer SVN entries--------
-
-2006/04/30
- * Skills with the move_enable state won't get the walkdelay increased on a
- skill-cast. [Skotlex]
- * Some corrections in the clif_parse_whisper function which should fix
- crashes in the chat_log under "certain" conditions. [Skotlex]
- * Fixed dangling pointer in pc_steal_item (missing lines) causing crash. [Lance]
- * Fixed lack of initialization in chrif_authreq causing crashes in chrif_authok. [Lance]
- * Fixed a logic error that was likely the cause of pet loot drops not
- working. [Skotlex]
- * If someone is expulsed from a guild while the guild storage is open, it
- will be auto-closed now. [Skotlex]
- * Modified battle_consume_ammo to prevent consuming multiple arrows on
- AC_SHOWER. [Skotlex]
- * Readded script command skillpointcount... [Skotlex]
- * Fixed and enabled STEAL skill [Lupus]
- * Implemented NJ_SHADOWJUMP. [blackhole89]
- * Moved the soul-drain code to skill_counter_additionaleffect [Skotlex]
- * Fixed fake NPC missing code. Thanks to Skotlex for pointing out. [Lance]
-
-2006/04/29
- * Changed the HT_DETECTING method from invoking clif_changetraplook to
- clif_skill_setunit since in the first the client ignores the fact that it
- is now a trap (rendering skills like Remove Trap useless). [Skotlex]
- * added script command skillpointcount. Returns total amount of skill
- points a char has (the value returned is the same that SkillPoint would
- have after invoking a skill reset) [Skotlex]
- * Modified Defender. Speed reduction is 35-5*lv%, damage reduction on
- devoted chars is 5+5*lv%. These values are custom, but should be closer to
- "reality" than what we had. [Skotlex]
- * When you have the wrong ammo type equipped, the equip arrows first
- message will be sent, as suggested by Haplo [Skotlex]
- * Changed checks of item's identify field from 0/1 to 0/non-zero [Skotlex]
- * Corrected TK_JUMPKICK to place the caster on the tile next to the target
- rather than on top of it. [Skotlex]
- * Small change in pc_calc_skilltree which should fix the infinite loop...
- [Skotlex]
- * Added @noask command: enable/disable deals/invites autorejecting.
- [LuzZza]
- * Removed unreferenced local variable in pc.c [Lance]
- * Reverted npc_checknear to exclude check for class_ -1.
- * Removed npc_checknear in npc_buysellsel, npc_selllist and npc_buylist
- as enough preventive measures of hacking are already implemented.
- [Lance]
- * Updated STEAL skill (WIP), added a battle config option: [Lupus]
- 'skill_steal_max_tries' to set max number of stealing tries.
- It could help to fix stealing exploit on mobs with few drops
- * Added support for packet 0x229 (clif_changeoption). [Skotlex]
- * Bumped up PACKETVER to 7 to enable use of packets 0x229 and 0x22c
- [Skotlex]
- * Added missing next/prev initialization in chat-creation. [Skotlex]
- * Added missing sql-files/mob_db.sql... somehow it was missing from the
- mob_db update. [Skotlex]
- * Clones can't be class-changed now [Skotlex]
- * Readded the class == -1 distance check in npc_checknear [Skotlex]
- * Replaced check sd->trade_partner for sd->state.trading in clif.c [Skotlex]
- * Using malloc for memory allocations that doesn't need to be pre-initialized.
- * Eliminated initializations for pointers returned by calloc.
- * Moved grfio_final to do_init since it's not used after server boot.
- * Optimized scripts to return CONSTSTR instead of allocating memory just to return
- a constant string. Some buildin functions still need work.
- * Disabled graph since it doesn't work yet. [Lance]
-
-2006/04/28
- * Modified the mob_db structure. The mvp related columns were moved to
- before the drops, amount of drops increased from 10 to 15. [Skotlex]
- * Updated sql-files/mob_db.sql (and mob_db2.sql) to latest. [Skotlex]
- * Modified HP conversion so that it fails when you don't have enough Hp.
- [Skotlex]
- * Cleaned up Strip skills so that the skill animation will only show when
- something was stripped. [Skotlex]
- * Added constant MAX_MOB_DROP to specify the amount of normal drops a mob
- has. The mob_db reading code will automatically parse the file according to
- the number of drops expected (the Mexp/Mper and MVP item rewards must still
- be after the normal drops). Set to 10 currently. [Skotlex]
- * Mobinfo's drop list will use jName rather than Name for drop names.
- [Skotlex]
- * Some cleaning of the ASC_BREAKER code in skill_attack [Skotlex]
- * Modified skill_attack so that all skills with amotion get their damage
- delayed (should fix mob walk-teleport issues) [Skotlex]
- * Added function stristr to strlib.c, used by mob.c and item_db.c for
- case-insensitive seeks. [Skotlex]
- * Removed the sending of the online guild list when you log-on, may fix the
- "getting stuck" problem. [Skotlex]
- * Added battle config default_skill_delay. Specifies the default skill
- delay for most skills, it is also applied as a walkdelay (total skill
- walkdelay is default_skill_delay + that skill's can't walk delay) [Skotlex]
-2006/04/27
- * skill_castend_id and skill_castend_pos will trigger unit_stop_walking
- with flag 1 (fix pos) rather than none. Should fix some skills making you
- appear moving while doing them. [Skotlex]
- * Modified clif_skill_nodamage to allow for a NULL source. This is to
- simplify code related to AL_HEAL/MG_RECOVERY effects where someone shows a
- healing value, but there's no "caster" in sight (Pitcher skills, Blood
- Drain, Kaahi) [Skotlex]
- * Updated Kaahi to use clif_skill_nodamage to display amount healed.
- [Skotlex]
- * Added unlocking ud.target on mob_unlocktarget, fixes mobs chasing you
- around while cloaked. [Skotlex]
- * Changed the default rate of clone mob skills to 5% modified by
- mob_skill_rate setting. [Skotlex]
- * Applied some changes in unit.c to make mobs pick chase paths as they
- should. [Skotlex]
- * unit_remove_map will reset attackable-time, canact and canwalk delays.
- [Skotlex]
- * Added a timer in clif.c so that walk requests that are done while your
- cannot move duration will be delayed and processed afterwards (as long as
- the walk delay remaining is less than 2000 ms) [Skotlex]
- * Some changes in the slave skill conditions. All their skills are
- triggered at a 10% chance now. [Skotlex]
- * Changed in the behaviour of wedding skills, they should be getting all
- the land-skill checks now. [Skotlex]
- * Small change in @commands, may fix the null-pointer error. [Skotlex]
- * Changebase script command will also refresh the weapon sprites (in case
- you changed into Wedding/Xmas class) [Skotlex]
- * Small change in the pet_ai that should stop the "strange" catch-up
- behaviour of pets when you are much faster than them. [Skotlex]
- * Corrected the unequip script of the wedding dress/tuxedo (it should be
- Class, not bClass), item_db.sql was also corrected. [Skotlex]
- * Small change in the pet_ai that should stop the "strange" catch-up
- behaviour of pets when you are much faster than them. [Skotlex]
- * Now when you do @baselevel to reduce your level and you don't have enough
- stat points to deduct, you will get a stat-reset and THEN your stat points
- will be reduced. [Skotlex]
- * Added at command @commands, displays the list of commands available to
- you. Defaults to level 1. [Skotlex]
- * Added the missing clif_* calls to make changebase's view-class change
- update on the client. [Skotlex]
- * Added battle config hide_woe_damage which hides damage on woe maps
- packet-wise (battle/client.conf). [Skotlex]
- * Fixed base-level up @ command giving stat points instead of taking them
- away when leveling down. [Skotlex
- * Some small change in pc_heal which would let you have negative SP if you
- were killed on the same pc_heal invocation. [Skotlex]
- * Added 3rd argument to script command 'setmapflag' thx to Jbain [Lupus]
- setmapflag "prontera.gat",mf_pvp;
- setmapflag "prontera.gat",mf_jexp,100;
- Now you can dinamically increase/decrease EXP rate on set maps
- e.g. you can lower EXP on the cmd_fild02 ^_-
-2006/04/26
- * Updated sql-files/item_db.sql to current. [Skotlex]
- * Item use interval is set to a default of 100ms now since that should be
- low enough to not bother real players and it should cap somehow bot/macro
- spams. [Skotlex]
- * Updated Full Buster so that the can't act delay carries on to the weapon
- attack delay and can't use item intervals. [Skotlex]
- * Added script command getbattleflag to retrieve the current value of a
- battle_config switch. [Skotlex]
- * When Taekwons level up they get Bless and Agi Up level 10 instead of the
- S.Novice bonuses. [Skotlex]
- * Increased number of hits for TK kicks. 3 hits for TK_COUNTER and
- TK_TURNKICK, 2 hits for TK_STORMKICK and TK_DOWNKICK (until further
- information arrives) [Skotlex]
- * Modified how changebase script command works, the change caused by it is
- permanent (at least until logout). Updated the Tuxedo and Wedding dress to
- use onequip/onunequip scripts to change the look. [Skotlex]
- * Changed the skill_wall_check to use shoot-path seeking. May fix
- skill_wall_check setting. [Skotlex]
- * Fixed typo in skill.c: skill_clear_group [Lance]
-
-2006/04/25
- * Added battle config traps_setting to determine how traps should behave.
- With &1 traps are invisible if you didn't see them get set up. With &2
- traps will be removed after changing maps. The default is 2.
- (battle/skill.conf) [Skotlex]
- * Cleaned up a bit the implementation of SC_MAXIMIZEPOWER, SC_CHASEWALK and
- SC_CLOAKING to prevent infinite looping timers. [Skotlex]
- * Fixed NPC_SUICIDE dropping items. [Skotlex]
- * Moved the mapflag skill restrictions from skill_checkcondition to
- skillnotok, this makes auto-spells not work in maps where they aren't
- allowed. [Skotlex]
- * Added TK_HIGHJUMP to skillnotok, the skill is blocked in noteleport maps
- (with the exception of gvg ones) [Skotlex]
- * Modified and simplified the random item group format. It now is
- <GroupID>,<ItemID>,<Rate>, where Rate normally is 1, greater numbers is the
- equivalent of adding the line multiple times. Also has support for import
- lines. [Skotlex]
- * Added constants to identify all item groups to db/const.txt [Skotlex]
- * Cleaned up and updated item_db to use these new constants (warning:
- item_db.sql needs to be updated! Sql-db users should not update until this
- file is updated) [Skotlex]
-2006/04/24
- * Simplified npc_gettimerevent_tick so that it should return a tick value
- even after the last ontimer label has been reached. [Skotlex]
- * All GMs will be sent to the char server through packet 0x2aff now.
- (previously hidden gms were not sent to the char-server as online) [Skotlex]
- * Made mob_searchname compare versus sprite, name and jname now. [Skotlex]
- * Added script command escape_sql. It will return an escaped string for use
- in the sql_query script command (in case you want to use input of players
- in your queries). [Skotlex]
- * Removed the skill packet from TK_RUN as the client ignores the walkok
- packet sent right after it. It displays just fine on the client now. [Skotlex]
- * Added DNS Blocklist support. Set in login_athena.conf.
- I'll make it more customizable tomorrow, I coded it pretty bad. [Zido]
- * Corrected mob_spawn_delay/boss_spawn_delay/plant_spawn_delay settings
- (they were named rate rather than delay in monster.conf) [Skotlex]
- * Cleaned up @grind2, @monsterbig, @monstersmall. [Skotlex]
- * Modified override_mobs_names to work only on the mob spawn files instead
- of everywhere (so now script-summoned mobs should keep their custom names
- intact) [Skotlex]
- * Added logging of deleted characters when the char_log is enabled.
- [Skotlex]
- * Fixed skill_delayfix not altering delay at all after you reached 150.
- [Skotlex]
- * Applied ers to pet loot drops and cleaned up the pet loot drop function.
- [Skotlex]
- * Mob skill state MSS_ANY won't include MSS_DEAD now. [Skotlex]
- * Added mob skill state MSS_ANYTARGET ("anytarget") which means any state
- (except dead) on which the mob has a target set. [Skotlex]
-2006/04/23
- * Added new column to mob_db Sprite_Name to hold the mob's sprite name.
- Columns Name and JName now hold the mob's english and kro names
- respectively. [Skotlex]
- - Currently both Name and Jname have the KRO names, so someone will have to
- update the Name column with the english Mob Names.
- * Updated mob_db.sql and mob_db2.sql to latest. [Skotlex]
- * Added battle_config option override_mob_names to make the spawned mob use
- the mob_db names instead of the specified names in the spawn files.
- Defaults to 0, 1 is to use Name column while 2 is to use the JName column
- (see battle/monster.conf) [Skotlex]
- * Idle skills won't trigger while the mob is walking (that is for the state
- "walk") [Skotlex]
- * Idle skills will now trigger each IDLE_SKILL_INTERVAL iterations (10
- currently) [Skotlex]
- * Added support for walk packet 0x22c, will be used when PACKETVER is set
- to 7 or above (packetver is still set to 6 for now) [Skotlex]
- * Normal walking will now also trigger mob skills (due to the walk skill
- condition) [Skotlex]
- * additional experience multiplicator as mapflags which is based off battle.conf
- so with battle.conf rates 200 and "mapflag <jexp/bexp> 200" it will be 4x
- on this specific map and 2x anywhere else [Jbain]
-2006/04/22
- * Angelus was giving more bonus than it should. Fixed. [Zido]
- * Added Option constants for Carts, fixed OPTION_FLYING (it conflicts with
- OPTION_XMAS?) [Skotlex]
- * Updated clif.c to check for OPTION_WEDDING|OPTION_XMAS instead of view
- class to block attacks and skill usage. [Skotlex]
- * Cleaned up change-cart code. [Skotlex]
- * Modified SC_XMAS to not change your view anymore and only set the proper
- option value (OPTION_XMAS) [Skotlex]
- * Cleaned up the code regarding char_gm reading. [Skotlex]
- * Changed the option field to unsigned short to make room for the higher
- values. [Skotlex]
-2006/04/21
- * SC_CLOAKING's val4 now holds whether cloaking ends or not on attack.
- [Skotlex]
- * Implemented NPC_INVISIBLE, it starts SC_CLOAKING with val4 set to 1.
- [Skotlex]
- * Updated the HP/SP leech structures to have race-data attached to them.
- [Skotlex]
- * Merged all leeching code to new battle_drain function. [Skotlex]
- * Simplified a bit the code for Signum Crucis [Skotlex]
- * Added script bonuses: [Skotlex]
- bonus3 bHPDrainRateRace,<Race>,<Activation Rate>,<Drain %>;
- bonus3 bSPDrainRateRace,<Race>,<Activation Rate>,<Drain %>;
- bonus2 bHPDrainValueRace,<Race>,<Value>;
- bonus2 bSPDrainValueRace,<Race>,<Value>;
- * Fixed items not really getting unequipped when they should. [Skotlex]
-2006/04/20
- * Fixed the equip/unequip scripts not triggering for compounded cards.
- [Skotlex]
- * Char server will now ignore packet 0x65 for already authentified
- accounts. [Skotlex]
- * Added two columns to item_db: equip_script and unequip_script are scripts
- that are executed once when the corresponding item is equipped or
- unequipped respectively. [Skotlex]
- * Removed bonuses bDamageWhenUnequip, bLoseSPWhenUnequip as they are no
- longer needed. [Skotlex]
- * Updated sql-files/item_db.sql with latest. [Skotlex]
- * Fixed buffer overflow in clif_MainChatMessage. It now prints a Debug
- message with the offending line. [Skotlex]
- * Cleaned up a bunch of GS/NJ skills [Skotlex]
- * Fixed Gatling Fever crashing server when used by non players. [Skotlex]
- * Added support for n to specify minutes to @charban. [Skotlex]
- * Added state.trading to specify when a trading has started. Now you should
- be able to walk around until the trade is either rejected or started.
- [Skotlex]
- * Armor defense is no longer reduced by the amount of characters targetting
- you. [Skotlex]
-
-2006/04/19
- * Updated the doc/script_commands.txt documentation in regards to npc mob
- spawn lines. [Skotlex]
- * Added back the "you can't walk delay while attacking" to
- unit_attack_timer, now when you want to walk during your attack animation,
- you will only stop attacking, you will have to click again to move.
- [Skotlex]
- * Fixed a pair of wrong mapflag lines in nopvp.txt [Skotlex]
- * Removed the max cap of autoloot so you are now allowed to set autoloot
- values above 100. [Skotlex]
- * Initialized w1/w2/w3/w4 before reading each npc line to avoid sending
- unread values to the parsers (for example, if w4 has a value in one line
- and none on the next, it will be parsed with the previous value of w4 on
- the following lines), this could cause serious problems with mapflags and
- the recent "off" addition. [Skotlex]
- * Updated getpartymember to receive an int which specifies what to
- retrieve. 0: Character names (array $@partymembername$), 1 character char
- ids (array $@partymembercid), 2 character account ids (array
- $@partynameaid). By default it returns party member names. [Skotlex]
- * Updated script_commands.txt with the updated behaviour of getpartymember.
- [Skotlex]
-
-2006/04/18
- * Fixed a typo in map_search_freecell which was returning incorrect cells
- according to the ranges given. [Skotlex]
- * A tiny fix to @kami [Zido]
- * The IRC Bot can now autojoin when kicked, set in irc_athena. [Zido]
- * Added @who to the IRC Bot, outputs all online characters. [Zido]
- * Changed the memory manager fatal errors when allocating memory to print
- out the size request as well as the file and line where they originated.
- [Skotlex]
- * Fixed the delete_timer (@summons, alchemist plants) not invoking
- unit_free, hence causing memory leaks and the like. [Skotlex]
- * Applied jA's patch to fix a bug in the scripting engine in regards to
- priority of operators. Thanks to End of Exam for the information. [Skotlex]
- * Removed message 592 from trade.c [Skotlex]
- * Added support for disabling mapflags on a mapflag line: [Skotlex]
- comodo.gat mapflag nomemo <- turns on nomemo mapflag
- comodo.gat mapflag nomemo off <- turns off nomemo mapflag
- * Removed mapflag nopvp due to the above change. [Skotlex]
- * Cleaned up and optimized the restricted/zones mapflag. Restricted cards
- will just not work in disallowed maps rather than blocking the compounded
- equipement from being used. [Skotlex]
- * Converted the format of the battle conf files to windows format [Playtester]
- * Shinomori's method (kinda) of remote script execution with interaction. [Lance]
-
-2006/04/17
- * skill_clear_unitgroup is now invoked in unit_remove_map only on death if
- the applicable battle setting is set. [Skotlex]
- * Changed setting clear_unit_ondeath to a type 4 (bl-based) which defaults
- to BL_ALL. [Skotlex]
- * Fixed Absorb spirit sphere not working on mobs, thanks to Vividd.
- [Skotlex]
- * Cleared the ud->target on pc_stop_attack to prevent attack resuming an
- other such oddities. [Skotlex]
- * I seem to have broken @kami with my last commit, fixed. [Zido]
- * Added @users to the IRC Bot, outputs the # of users online. [Zido]
- * The baby check when wearing a tuxedo/dress now works [Zido]
- * Fixed pet being incorrectly removed when it had intimacy 0. [Skotlex]
- * Some cleanup in the TK_RUN related code. [Skotlex]
- * Added variable walk_count to unit_data to be use as a counter for cells
- walked for walk-triggered skills, on-chase skill triggers are now done
- every 5 cells (it is the closest value that makes the average mob trigger a
- chase skill every second). [Skotlex]
- * mob_skill_db needs updating since it's current use rates for chase-skills
- assume the trigger is every 100ms rather than every second.
- * Fixed TK_RUN having a cast-bar when attempting to stop-running and
- generating timer_delete errors when halting as well. [Skotlex]
- * Clearing the dummy npc after fooling the client. [Lance]
- * Updated DLLS. Please DO NOT update the libs from now on
- (except if mySQL has newer builds which are not compatible
- with client DLL). [Lance]
-
-2006/04/16
- * Fixed the first call to the walk timers having the tick interval halved,
- which made all walking timers be off by half cell with the actual position
- displayed client-side (so everyone reaches destination cell server-side
- half-cell before the client). [Skotlex]
- * Fixed being halted when you are walking so that: 1. Your position
- refreshed on the screen is correct (the current tile if you haven't reached
- at least half path between the current and next tile and the next tile
- otherwise) and 2. If you are halted before walking even one cell, you will
- be moved to the next cell (to effectively prevent stun-locking). [Skotlex]
- * Modified @monster command to use map_search_freecell (prevents mobs
- spawning on non-walkable tiles) [Skotlex]
- * Modified @nuke to invoke skill_cast_nodamage_id instead of the damage_id
- version (fixes sprite and splash damage for the skill) [Skotlex]
- * Fixed char-sql server still reading the old lanconfig format rather than
- the new one. [Skotlex]
- * Removed water_height.txt reading (since it is always done from the rsw
- now) [Skotlex]
- * Fixed a possible crash in grfio_find_file [Skotlex]
- * Corrected water-level-reading to account for a return of null from the
- previously mentioned function [Skotlex]
- * Fixed mysql ping setting being in minutes rather than hours. [Skotlex]
- * Removed npc_event_sub from npc.h and moved it to npc.c [Skotlex]
- * Cleaned up #warp to prevent spitting non-walkable tile warnings. [Skotlex]
- * Changed the meaning of msg_athena 2, it is now "invalid target cell,
- randomizing". [Skotlex]
- * Fixed wrong check of Deluge + Suiton which broke the water-requirement
- check for skills. [Skotlex]
- * Cleared ud->target on remove-map, it should fix the phantom mob sprite
- issue. [Skotlex]
- * Temperory fixed compiler warnings/errors. Please compile before commiting.
- [Lance]
- * Added pcre3.dll, zlib1.dll and libmysql.dll. DO NOT DELETE THEM.
- (Required by systems without these DLLs preinstalled) [Lance]
- * Experimental npc_event_doall_sub with queue and npc_id allocation when needed.
- [Lance]
- * Added warnings to npc_scriptcont for easier debugging. [Lance]
- * Missing lines in npc_parse_script! [Lance]
- * Sending fake npc for inputs and menus for NPC without map coordinates. [Lance]
-
-2006/04/15
- * Fixed upgrade_svn5902.sql, thanks to Koshiro for pointing it out.
- [Skotlex]
- * Updated skill_attack to allow characters not on a map to attack (enables
- traps and the like to work when they aren't cleared on the character's
- death) [Skotlex]
- * Removed use of packet 0x1c9 for skill_unit display, except for Graffiti
- (which is the only unit which requires the much larger packet) [Skotlex]
- * clif_getareachar_skillunit will send the unit_id of UNT_ATTACK_SKILLS for
- traps (this is to prevent them from displaying on the client) [Skotlex]
- * Updated libs, Updated vc project files, And deleted uneeded DLLs.
- Credits to ALZ. [Zido]
-2006/04/14
- * Updated sql-files/mob_db.sql to current. [Skotlex]
- * Fixed being able to do all the stuff you shouldn't be able to during the
- petrifying state. [Skotlex]
-2006/04/13
- * Updated sql-files/item_db.sql to current. [Skotlex]
- * Added an Info message when pinging the SQL servers. [Skotlex]
- * Fixed crash when looking for SC_MIRACLE in battle_calc_weapon_attack
- [Skotlex]
- * Some more standard C code cleanups. [Skotlex]
- * atcommand_param and charcommand_stats to make them standard C (so it may
- compile with the Borland C). Also cleaned atcommand_param against
- overflows. [Skotlex]
-2006/04/12
- * Removed the noteleport mapflags from two juperos maps [MasterOfMuppets]
- - added the nopenalty mapflag to hugel.gat
- * Halved the aftercast delay of auto-casted spells. [Skotlex]
- * Allowed auto-spells to retrigger themselves. [Skotlex]
- * Changed slave chasing from using unit_walktobl to map_search_freecell +
- unit_walktoxy, since the previous behaviour makes all slaves always end up
- on the same cell. [Skotlex]
- * Removed area of effect of Assumptio. [Skotlex]
- * Added "can't act" delay update when an auto-spell triggers. [Skotlex]
- * Expanded the warp warning so that it also warns when a warps takes you to
- a non-walkable tile. [Skotlex]
- * Simplified the mob-drops structure by using a single timer with a linked
- list of drops instead of separate timers for each drop. [Skotlex]
-2006/04/11
- * Added special_state changebase to identify when a character has a
- special-view associated with some equipment to correctly revert the look
- when you take off said equipment (fixes tuxedo/wedding dress when you use
- modify_wedding_display: yes) [Skotlex]
- * Removed the piece of code that "guesses" that job classes between 24 and
- 68 are advanced classes from mob_avail reading since they conflict with
- NJ/GS. Use the correct class numbers from now on! [Skotlex]
- * Cleaned up implementation of BlastMine and Claymore Trap. [Skotlex]
- * Added Freezing trap information to battle_calc_weapon attack. [Skotlex]
- * Merged the can't walk delay code into the weapon-damage delay one, means
- less timers for attacks, as well as fixing the ghost-mob issue that
- reappeared recently. [Skotlex]
- * Traps will not be displayed when you walk within their range. [Skotlex]
- * Added HT_DETECTING revealing traps. [Skotlex]
- * Added ers handling for skill_timerskill structures. [Skotlex]
- * You don't get critical'ed when in counter-attack stance anymore. [Skotlex]
- * Changed the default counter-type to "always critical". [Skotlex]
- * Implemented use of ers for skill_unit_groups to reduce memory usage.
- * Note that it's NOT TESTED yet. Use with caution, at least some obvious
- bugs are expected to be found... [Skotlex]
- * Modified battle_check_range to do a path-check on distances less than 2
- (rather than 3) to avoid being able to hit through walls. [Skotlex]
- * Modified unit_walktoxy_sub to always move at least one cell when a large
- chaserange is specified to prevent possible infinite loops where
- attack_timer says you are not within range, but unit_walktoxy says you are.
- [Skotlex]
- * Fixed Looted items always dropping in quantities of one. [Skotlex]
- * Removed the check that deletes Magnus Exorcism cells after they hit once.
- [Skotlex]
-2006/04/10
- * Temperory replaced strtoll to strtoul until the function changes. [Lance]
- * Multiple optimizations to the unit_data auto-chase upgrade, also
- simplified the mob and pet ai routines. [Skotlex]
- * Simplified the walk routines to half the number of timers required for
- walking. [Skotlex]
- * Finished fixing the unit_data auto-chase update. Still need to do some
- optimizations... but the current code-base should be usable. [Skotlex]
- * Fixes to the unit_data update that lets characters auto-chase while
- attacking. It seems to work mostly now, but there's still a few issues to
- be resolved with ranged-attackers. [Skotlex]
- * Modified the unit_data structure to handle automatically switching
- between chasing and attacking a character. Note that it's a work in
- progress and not yet properly tested/finished... [Skotlex]
- - DON'T USE THIS YET. There's much testing that needs be done, but I had to
- commit now so I may continue work on it later....
- * Updated the subnet support to not require specifying the subnet mask, it
- is auto-acquired from the char/map IP and the subnet-mask. [Skotlex]
- * skill_wall_check defaults to yes now. [Skotlex]
-2006/04/09
- * Added the missing last_thinktime initialization to pets. [Skotlex]
- * Reverted the change in skill_wall_check to let skills go over pits.
- [Skotlex]
- * Changed use of strtol to strtoll when reading the equip_jobs as strtol's
- result is just a signed int, fixes reading of equippable jobs for certain
- items. [Skotlex]
- * Corrected Knives being usable by Gunslinger. SQL users use
- upgrade_svn5972.sql to ugprade that. [Skotlex]
- * Modified @warp/@rura to prevent causing pc_setpos position error
- messages. [Skotlex]
- * Fixed the mob's last_thinktime not being updated on mob_spawn, causing
- them to not "think". [Skotlex]
- * Fixed @npcmove not sending the correct packets to make the moving refresh
- client-side. [Skotlex]
- * Fixed mobs with aggressive + looter mode never looting. [Skotlex]
- * skill_wall_check now also checks for pits so that skill effects don't go
- through them. [Skotlex]
- * Now you can't leave/be-kicked from a guild inside guild castles. [Skotlex]
- * Fixed map_waterheight prefixing extra "data\" [Lance]
- * Mob_ai update. The attacked checks will trigger even if the mob can't
- move. Being attacked while the mob can't move no longer will trigger
- rude-attacked skills. [Skotlex]
- * Changed the default of multi_hit_delay from 230 to 80 which seems more
- official. [Skotlex]
- * Wedding recall skills are now blocked by the nomemo mapflag instead of
- nowarpto. [Skotlex]
- * Skill delay for weapon types is now based on adelay (ASPD) rather than
- amotion (ASPD/2) [Skotlex]
- * Removed ending Endure when casting Berserk, may fix the timer mismatch
- issues. [Skotlex
-2006/04/08
- * Fixed skill_nocast_db reading so that when the same skill is specified
- multiple times, the blocked effects add up instead of replacing each other.
- [Skotlex]
- * Fixed @movenpc [Skotlex]
- * Cleaned up and improved the lootsearch routine to pick nearest item.
- [Skotlex]
- * Fixed trying to set the view_data for npcs who are located on a map, but
- have no visual data. [Skotlex]
- * Added irc_athena.conf :) from now on, set your irc configuration in
- conf/irc_athena.conf [Zido]
- * Removed the baby class check when using "changebase" to change to the
- Wedding Sprite, since it fixes the bug that the sprite doesn't show
- at all, and baby classes arn't messed up by it anymore.
- (or so it seems) [Zido]
- * Fixed up irc.c, no more crashes :D [Zido]
-
-2006/04/07
- * Likely fixed a mob not returning to their original class view on respawn
- after they changed class in their previous life. [Skotlex]
- * The map-server can now read the equip_job column of the item_db as both
- decimal and hexadecimal values. [Skotlex]
- * Updated item_db.sql current item_db.txt [Skotlex]
- * Added upgrade_svn5951.sql for those who would like to convert their
- existing items. (it converts the equip_jobs fields to the new values used)
- - See db/Changelog for further info regarding the equip_job fields change.
- [Skotlex]
-2006/04/07
- * Moved the Fusion HP penalty to battle_calc_weapon_attack [Skotlex]
- * Some cleaning to use battle_heal/damage rather than pc_heal/damage where
- appropiate. [Skotlex]
- * Cleaned up the deadly-poison hp reduction code. [Skotlex]
- * IRC User access levels now refresh on a mode set and join/part. [Zido]
- * Added missing creation/destruction of the expcache_ers in guild.c
- [Skotlex]
- * Unified status_remove_buffs/status_remove_debuffs into a single function.
- [Skotlex]
- * Fixed pc_setpos ignoring the clrtype sent to it. [Skotlex]
- * unit_free will now use clear type 3 for players (warping out effect)
- [Skotlex]
- * You can't invite someone to a guild now within Guild Castles. [Skotlex]
-2006/04/06
- * Hopefully fixed the wedding item-trade restriction. [Skotlex]
- * Fixed status_clear_buffs making SC_BERSERK's end send you to 100hp.
- [Skotlex]
- * Rewrote the guild exp cache code to prevent overflows and to use the
- entry reusage system. [Skotlex]
- * The IRC Bot is now able to check each users access level prefix
- in the channel (~/&/@/%/+), the IRC command @kami now requires the
- user to be at least channel operator(@). Now I need to make it store
- the users access level on every nick/mode change. [Zido]
- * Changed the default of skill_add_range to 0, said value now disables
- skill-range checking when casting ends. [Skotlex]
- * Corrected the Soul Drain formula, thanks to Haplo for pointing it out.
- [Skotlex]
- * Addded missing aldeg_cas01 to NOWARP mapflags, thanks to Justin84 [Lupus]
- - And we set lhz_dun03 nowarpto mapflag by default till check it on eRO/kRO
- * Changed the random warping of mobs with no players from mob_spawn to
- unit_warp, which prevents MSC_SPAWN skills from being retriggered for
- already spawned mobs. [Skotlex]
- * Modified @allstats to prevent negative/overflow issues. [Skotlex]
-2006/04/05
- * Fixed undisguising not clearing the mob sprite for the disguised
- character. [Skotlex]
- * Fixed parsing of job_db1.txt due to the MAX_WEAPON_TYPE change. [Skotlex]
- * TK ranking kicks can't be used on sucession now (can't use any of the
- kick skills twice in a row without using a different one first). [Skotlex]
- * Modified the ammo checks so that ammo is consumed at the end of
- battle_calc_weapon_attack (should fix element being lost on final arrow).
- [Skotlex]
- * Added a define list for weapon types in pc.h [Skotlex]
- * Cleaned up pc_checkallowskill and moved the Gatling fever check to it.
- [Skotlex]
- * Some cleanup of clif_parseloadendack, fixed guild-member list being sent
- on all map-changes. [Skotlex]
- * Removed the hardcoded removal of characters who spawn in a castle. All
- castle maps got the flag nosave now. [Skotlex]
- * Added support for the 2006/04/04a Sakexe packet version. [Zephiris]
-
-2006/04/04
- * Added inter config connection_ping_interval which specifies interval in
- hours at which mysql_ping's must be done on all connection handles to keep
- the mysql connection alive. Defaults to 0 (disabled) [Skotlex]
- * Made the login sql handle on the char-sql server be used only when
- gm_read_method 1 is enabled. [Skotlex]
- * Small fixes to npc_enable, added BL_NPC handling on status_get_sc.
- [Skotlex]
- - Some changes to close-confine, status start will fail when the source is
- not found or it doesn't has sc-data. [Skotlex]
- - pc_setoption no longer changes the character's class when
- mounting/dismounting, it only changes the view-class. [Skotlex]
- * Modified the char-txt server to modify the class of mounted characters to
- their non-mounted version. Added an upgrade_svn5902 file to handle the
- class update on the sql tables. [Skotlex]
-2006/04/03
- * Fixed pc_setpos using unit_remove_map with type 0 instead of 3, which
- confuses clients and makes them think the character in question is still
- standing on the spot where it was removed. This should fix the warp-portal
- issue. [Skotlex]
- * Fixed script command mapwarp. [Skotlex]
- * Fixed Auto-counter. [Skotlex]
- * Modified Rude-Attacked behaviour so that such skills only triggers when
- the rude-attacked count is greater than 3. [Skotlex]
- * Added config setting slaves_inherit_mode to determine whether slaves take
- on their master's aggressive/passive status (defaults to yes) [Skotlex]
- * Disabled NPCs are now handled through nd->sc.option&OPTION_INVISIBLE
- checks. Should fix disable/enablenpc calls not working. [Skotlex]
- * Moved skill_counter_additional_effect calls to trigger right after
- skill_additional_effect (which means they trigger at the end of the attack
- motion for physical attacks instead of at the beginning of the attack
- animation) [Skotlex]
- * Cleaned up (fixed?) a possible overflow in pc_isUseitem, thanks to
- foobar. [Skotlex]
- * When you have the wrong ammo-type equipped the skill-failed message is
- now "skill can't be used with this weapon", which is less misleading than
- "please equip arrows first". [Skotlex]
- * Corrected pet-equipment display (I originally assumed they went in the
- shield view-position, when they actually go in the head-bottom position).
- [Skotlex]
-2006/04/02
- * Fixed npc_gettimerevent_tick returning the difference since the last
- triggered label instead of total elapsed time for the npc-timer. [Skotlex]
- * Added a missing memset on ers_alloc'ing mob loot which was making data
- from looted items fill in normal drop info (in other words, you could get
- normal loots that were named after players, for example) [Skotlex]
- * Added preventing sending packet clif_clearchar_id when the character in
- question is invisible. [Skotlex]
- * Added packet 0x7c in clif_spawn which was supposed to be used for
- non-players (this fixes pets/mobs/npcs spawning as if they just teleported
- into view) [Skotlex]
- * Some cleanups to clif.c, removed some excess/broken packets/functions.
- [Skotlex]
- * Merged Larry's fix of using a timer to get rid of the glow-issue when you
- login to night-enabled map. [Skotlex]
- * Changed arrows View ID to 22 since daggers were already View ID 1.
- The server was looking for daggers to be in your arrow slot. [Reddozen]
- * Loading waterheight aliases from resnametable.txt. [Lance]
- * Workround the warnings for clif.c (what to do? the original codes are ugly.. passing
- values as pointers omgwtfbbq). [Lance]
-
-2006/04/01
- * Added a exp-even-share check when someone leaves a party. [Skotlex]
- * Added function clif_changetraplook to handle changing the appearance of
- traps as they are triggered. Fixes all the nullpos related to trap usage.
- [Skotlex]
- * Fixed berserk not raising your HP to your new cap. [Skotlex]
- * Fixed ground-skills not displaying damage done. [Skotlex]
- * Fixed a few functions sending a negative ID for disguised characters
- (such as clif_specialeffect) which very likely produced client crashes.
- [Skotlex]
- * A small cleanup on npc-whispering which could fix a reported crash on it.
- [Skotlex]
- * Removed the gm-whispering of the charnameack hack notice since it isn't
- perfected yet. It is still reported on the console for debugging
- purposes. [Skotlex]
- * Fixes to the mob_ai routines. Prevent casting rude-attacked skills in
- situations that shouldn't be considered as so. Fixed mobs failing to chase
- after enemies when attacked from out of their view_range. [Skotlex]
- * Should not exit when you can't find an NPC file.. [Lance]
- * Dynamic shops support with script callback. (needs testing) [Lance]
- * Cleaned up and fixed @where command. [Skotlex]
- * Fixed standing up no really making you stand up. [Skotlex]
- * Added upgrade_svn5834.sql to update view for item type 10. Because of the
- ammo upgrade, all arrows need their view set to 1. This query does that to
- all type 10 items (this includes all ninja weapons as well, but a proper
- item_db.sql update is pending until the rest of throwables are updated)
- [Skotlex]
- * Fixed compiler warnings. [Lance]
- * Added structure view_data to handle sprite information for all characters
- (equipment, weapons, hair, dyes, etc). [Skotlex]
- * Rewrote several clif functions to adapt to the new view_data class.
- [Skotlex]
- * Rewrote the way cloth dye packets are resent to optimize bandwidth usage.
- [Skotlex]
- * Fixed the npc_item_flag thing (enable_items/disable_items script command)
- [Skotlex]
- * Rewrote the disguise implementation to be bandwidth friendly. [Skotlex]
- * Modified the hide options to change your class to INVISIBLE_CLASS, since
- such classes don't even get their view packets sent around. [Skotlex]
- * Added class 139 to npcdb_checkid which was required by some npcs in the
- swordman quest. [Skotlex]
- * April fool! Improved soundeffectall script command. (No, this is not a lie) [Lance]
-
-2006/03/31
- * Fixed skill_require_db loading of the new ammo columns.
- * Added a column to specify the amount of ammo required for skills that
- require it. [Skotlex]
- * Added support for ArrowType requirement on skills. It checks for having
- an item equipped on the arrow-slot who's view has to match with the
- required arrow-type (works the same way it does for weapons). [Skotlex]
- * Skills will automatically be ranged and arrow-types when they have a
- arrow-requirement in battle_calc_weapon_attack [Skotlex]
- * Skills will automatically consume arrows if used with a bow and the skill
- is an attack weapon-based skill even if the skill_require_db doesn't
- specifies arrow requirements (this is for stuff like backstab used with
- bows) [Skotlex]
- * Fixed an infinite recursion in the Wedding Recall skills. [Skotlex]
- * UNT_ATTACK_SKILLS unit packets won't be sent to the client as they are
- supposed to be invisible anyway. [Skotlex]
- * Started work on commands for the IRC Bot, At the moment you can use !eakami <message>
- to broadcast a message, edit ALLOWED_NICK in irc.c to change the nickname
- of the person that is allowed to use it (Shitty authentication method, I know,
- but i'll make user/pass method soon enough.) [Zido]
- * Modified a bit the skill packets of Sharp-Shooting and Brandish Spear in
- hopes of fixing it. [Skotlex]
- * Should fix a bug in GM stealth mode (@hide). [Lance]
-
-2006/03/30
- * Updated char name option. [Vicious]
- * Added a missing return that fixes crashes on status_change_timer when
- source is not found. [Skotlex]
- * Added year day return in gettime function. gettime(8) returns 1~366
- [Foruken]
- * the auth function in login.c won't jstrescapecpy passwords that were
- encrypted. Thanks to foobar. (but are still more cases to check for? Dunno,
- the code is kinda long...) [Skotlex]
- * Endure level 11 and above are now considered infinite-endure, and invoked
- when Berserk is active. [Skotlex]
- * Set the minimum pet hungry delay to 10 [Skotlex]
- * modified functions skill_delayfix and skill_castfix to reduce number of
- arguments. Added function skill_castfix_sc for mobs (who only get status
- change cast reductions, not dex based ones). Also, skill_delayfix will
- never return a value below min_skill_delay_limit. [Skotlex]
- * Modified brandish spear so you won't see the skill-animation for every
- targetted mob. [Skotlex]
- * Added the Steel Body icon to auto-berserk. [Skotlex]
- * Now you can't cast auto-counter while the previous one is active.
- [Skotlex]
- * Added Veider's suggestion to do a hack-report when players request the
- name of an invisible/cloaked character. [Skotlex]
- * Added execution of OnInterIfInit, OnCharIfInit and OnInterIfInitOnce on script
- reload. [Lance]
- * Cleaned up mistakes in irc.c [Lance]
-
-2006/03/29
- * Now none of the pet-menu options will have any effect when the pet's
- intimacy is 0. [Skotlex]
- * Applied a fix to not do range checks on npc_doevent when the npc is not
- on a map. [Skotlex]
- * You can't return to egg a pet that has run away now. [Skotlex]
- * Added ers support to the delayed mob drops. [Skotlex]
- * Some cleaning of the mob_ai. Mobs should stop chasing once you are beyond
- their min_chase range. Improved rude-attacked checking when mobs can't
- move. [Skotlex]
- * range3 is now used as min-chase value of mobs. [Skotlex]
- * Added a debug message when status_change_timer fails. Report it next time
- it shows up. [Skotlex]
- * Fixed tick direct modifications increasing duration instead of decreasing
- it. [Skotlex]
- * You can't SG_FEEL maps already memorized. [Skotlex]
-2006/03/28
- * Fixed the Family recall warp skills. [Skotlex]
- * Fixed pc_percentheal giving life when the rates are negative. [Skotlex]
- * Fixed resetting stats losing the +52 bonus on high classes. [Skotlex]
- * Fixed Wedding support skills healing yourself instead of partner.
- [Skotlex]
- * Added a check to prevent knocking back the Emperium at all costs.
- [Skotlex]
- * Fixed summon mobs being able to cast "summon" skills. [Skotlex]
- * Summoned mobs will inherit the size and ai properties of the master. [Skotlex]
- * Added a debug function to locate all "looping warps". [Skotlex]
- - Now will someone help cleanup those warps?
- * Some cleanup of the skill-use functions in clif.c [Skotlex]
- * Fixed Gunslinger and Ninja skills not showing up and not working due to an error
- in skill_require_db
- - also commited a commented block for GS_FLING that needs to be looked at and posiably
- cleaned before it's uncommented.
- - fixed exp2 not accepting Gunslingers and ninjas
- - fixed the "jobmaster" having the same problem as rebirth
- - added the Gunslinger shops for guns and ammo [Reddozen]
- * Modified clif_getareachar_pc to hide hidden GMs from normal players (players with GM
- level > 0 still able to view) by NOT sending the coordinates. [Lance]
-
-2006/03/27
- * Removed the limits.h file which just breaks compilation on *nix systems
- [Skotlex]
- * Updated some DB work from jA [Vicious]
- * HW_GANBANTEIN now also removes traps. [Skotlex]
- * PF_DOUBLECASTING takes effect amotion time after the initial cast instead
- of amotion*div [Skotlex]
- * SG_KNOWLEDGE now lasts time1 after you quit a map before it clears out
- (defaults to 10 mins currently) [Skotlex]
- * Modified Intravision to modify the status-change packet to specify
- SI_INTRAVISION instead of cloaking/hiding/chasewalk. I believe this is how
- intravision actually works. [Skotlex]
- * Pet catching now uses the menuskill variables to prevent item usage from
- disrupting the catch process. [Skotlex]
- * Added Safetywall to the list not blocked by Dispell. [Skotlex]
- * Added some include limits.h required by window compiles. [Skotlex]
- * Corrected Wedding rings being trade-able. [Skotlex]
-2006/03/26
- * GCC on Cygwin still complaining, resorted to including limits.h in malloc.h [Lance]
- * Refixed the fix with a constant list for Win32 users - limits.h (imported from MSVC) [Lance]
- * Fixed a problem in chrif.c where USHRT_MAX was undefined. [Codemaster]
- * Added jAthena's new start and athena-start shell scripts. [Lance]
- * Changed status_point/skill_point to unsigned short. Adjusted the code as
-
- necessary to prevent overflows. [Skotlex]
-
- * itemdb_exists and itemdb_searchname should now ignore dummy_item matches. [Skotlex]
-
- * Fixed jstrescapecpy crashing when you pass a null string to parse. [Skotlex]
-
-
-2006/03/25
- * Fixed the map-server freeze/crash on Warp Portal. [Skotlex]
- * Fixed Grandcross/Granddarkness showing no skill animation. [Skotlex]
- * Fixed mob-casted grandcross doing nothing unless the target was "self" [Skotlex]
-2006/03/24
- * Fixed / finished most of Gunslinger [Reddozen]
- - fixed some bullets in the item DB
- - adjusted a few rates in skill_cast_db.txt for Gunslingers
- - adjusted a couple skills in skill_db.txt to act correctly
- - adjusted all the SP values for Gunslinger skills
- - changed piercing shot to lv 5 from lv 10
- - made ki Translation fail giving coins to Gunslingers
- - equipping a weapon other than a gatlin gun should cancel SC_GATLINGING. Also made Gatlinfeaver on/off togelable
- - GS_CRACKER will no longer stun players
- - added GS_Disarm
- * Fixed iteminfo only displaying first result when there were many. [Skotlex]
- * Fixed pet hatching. [Skotlex]
- * Small change that SHOULD fix the pet duplication issue. [Skotlex]
- * Fixed Warp Portal. [Skotlex]
- * Modified script commands atcommand/charcommand to execute even if there
- isn't a player attached. They'll use a dummy player data with the same
- position/name as the script's owner (usually an npc). Be careful when using
- this as the result of some @/# commands may be unexpected! [Skotlex]
- * Some cleaning around the return to egg code. Pets should stop duplicating
- now. [Skotlex]
- * Some cleaning of the egg hatching routine to prevent spawning the pet if
- the egg can't be found in the inventory. [Skotlex]
- * Removed a pair of autoadded "data/" strings on grfio.c to see if that
- helps with the data_dir map loading. [Skotlex]
- * Fixed skillidx not being set whenever a mob uses a skill. This explains
- skills like metamorphosis/summon_slaves not working at all. [Skotlex]
- * Fixed unit_skillcastcancel reading the nocastcancel flags the exact
- wrong way around [blackhole89]
- * Added function map_search_freecell to locate an available cell around an
- area (for recall/warping skills). UNTESTED. [Skotlex]
- * Added unit.c to the VC8 project files. Thanks to Joshuaali [Skotlex]
- * Fixed Magnum-break/GrandCross displaying multiple times the skill effect
- (once per target) [Skotlex]
-2006/03/23
- * Fixed a crash in unit_useskill_pos2 [Skotlex]
- * Updated mob_db.sql and item_db.sql to current txt versions. [Skotlex]
- * Fixed Devotion not properly being cleared on death/near death in some
- cases. [Skotlex]
- * Fixed Shield-Reflect not being correctly ended when devotion does.
- [Skotlex]
- * Fixed DEX-based casting time and delay reduction. [blackhole89]
- * Modified the function pc_percent_heal to prevent overflow problems. [Skotlex]
- * Changed the second entry in the water_height.txt listing to specify
- directly the .rsw file (instead of .gat). [Skotlex]
- * Fixed Potion Pitcher sometimes crashing the server. [Skotlex]
- * Fixed a compile warning by adjusting the acid demonstration formula.
- [Skotlex]
- * Added flag 2 to the skill_castnodex_db file for skills that shouldn't be
- affected by delay/cast reducing skills/effects. [Skotlex]
- * Added SantaPoring's water_height.txt modifications. [Lance]
- * Minor cleanups. [Lance]
-
-2006/03/22
- * Fixed function pc_isCardAllowedOn causing searches for non-existant item
- id 0. [Skotlex]
- * Fixed Arrow Shower. [Skotlex]
- * Merged the unit_data structure from jA for handling unit-related data
- (attack times, walking, auto-attack timers, skill related data). This is a
- huge change that affects walking, attacking, auto-attacking, skill usage
- and character clean up from maps. I spent the last two days clearing out
- bugs, and even though I couldn't find any more, I wouldn't be surprised for
- a corner-case or two I missed. [Skotlex]
- * Modified unit_skillcastcancel to receive flag&2, which stands for "cancel
- casting only if current skill is cancellable" [Skotlex]
- * Battle config options changed from yes/no to BL_TYPE settings:
- skillrange_by_distance, skill_noreiteration, skill_nofootset,
- gvg_traps_target_all, skill_log, attack_direction_change,
- auto_counter_type. See (Note 4) in the relevant battle config files.
- [Skotlex]
- * Clif.c will disconnect sessions that send an unknown command packet above
- 0x30000 instead of just ignoring it. [Skotlex]
- * Cleaned up error reporting during mob-skill loading to be less spamy with
- non-loaded mobs. [Skotlex]
- * Corrected water_height reading. It works now, with the exception that
- cloned maps don't get their water-level read because they don't have a rsw
- file. The solution is to add all cloned maps to water_level.txt (ie:
- "new_1-1.gat new_zone01.rsw" makes the new_zone01.rsw stored water-level be
- applied to map new_1-1.gat).
- Anyone can help collect all the clone maps to fill up water_height?
- * status_check_skilluse won't block skill-specific checks (silence,
- berserk, steel-body, etc) when the skill in use is an item-invoked skill.
- [Skotlex]
- * Merged LittleWolf's function to read the map-height directly from the rsw
- file. Now when building the map-cache, the water-heights should be
- automatically read as well directly from the rsw's. [Skotlex]
- WARNING: Not tested yet!
- The water-height config file now is for aliases. When the rsw for a
- certain map is not found, and this map exists in the water_height list,
- then the water height of the second map listed in that file is used.
- * Some cleanups in irc.c [Skotlex]
- * Magic skills that ignore element now also don't take into account
- elemental cards. [Skotlex]
- * Fixed compiler warnings in battle.c [Lance]
- * Changes by [reddozen] -->
- - Updated Full Buster's damage, status effects, and skill levels
- - Bullseye now only uses 1 coin
- - changed Adjustment's required SP
- - changed Incerase Accuracy's effect bonuses
- - changed Magical Bullet's SP cost
- - changed Piercing Shot's damage and SP
- - changed Desperado's range, hit count, aftercast delay, and SP
- - fixed Absorb Spirit Sphere being able to remove coins
- - changed Acid Demonstration's damage to the new Japanese formula
-
-2006/03/21
- * Fixed duel in pk-mode (same party/same guild/alliance non-targeting issue).
- Thanks to Hobbit for pointing that out. [LuzZza]
- * Fix on not showing guildmembers logins/logouts messages. [LuzZza]
- * Fixed SC_SWOO's opt3 value. Small monsters should stay small for skill's
- duration now. [Skotlex]
- * Fixed allowing multiple recast of Dissonance/Ugly-Dance [Skotlex]
- * Fixed those annoying irc.c compile warnings. [Skotlex]
-2006/03/20
- * Added monster_ai&16 setting for executing the hard ai on ALL mobs in maps
- with players instead of just mobs in the vecinity of players. [Skotlex]
- * Cleaned up some guild functions. [LuzZza]
- - Now guild leaving/explusion packets sends correctly.
- - Fix to prevent creation alliance/opposition with same guilds.
-2006/03/19
- * @stfu now allows negative intervals to be specified. [Skotlex]
- * Added overflow check to the login-server when sending GM accounts to
- char. [Skotlex]
- * Small fix to prevent killer/killable states from allowing you to target
- yourself. [Skotlex]
- * Added Explosion Spirits to list of effects that dispel on logout.
- [Skotlex]
- * Fixed handling of guild skills by pc_blockskill_start, moved it to
- skill.c [Skotlex]
- * Fixed autoguard icon showing with stun. [Skotlex]
- * Fixed acid demonstration breaking shield instead of armor. [Skotlex]
- * Fixed Slim Pitcher crashing server ocassionally. [Skotlex]
- * Hopefully fixed Ankle Snare lasting the whole trap's duration [Skotlex]
- * Added sc_start(SC_ENDURE) on infinite endure bonus. [Skotlex]
- * Fixed Berserk Pitcher consuming required items twice. [Skotlex]
-2006/03/18
- * Fixed BA_DISSONANCE and DC_UGLYDANCE not working. status_check_skilluse was blocking
- them due to the lack of an exception like BA_MUSICALSTRIKE has it. [blackhole89]
- * Documentation update on NPC whisper and rid2name. [Lance]
- * Fixed event_kill_pc to behave like what it should instead of another replication
- of event_death. Added script function rid2name to convert bl ids to name. [Lance]
- * Recoded setmobdata script function. Fixed mob_damage typo sd -> mvp_sd. [Lance]
- * Added 'GetMonsterInfo(MobID,Idx)' script function. [Lupus]
- You can get monsters name,level,race, etc by its Id. Check npc\sample\getmonsterinfo.txt
- * Fixed warnings on compilers again. [Lance]
-
-2006/03/17
- * Fixed the mob_skill_db by commenting out lines with targeted skills
- being cast during an idle state. (Thanks to LittleWolf) [Zephiris]
- * Removed a block of code from skill_check_condition that actually belongs
- to status_check_skilluse. Should fix silence/stun blocking skills
- regardless of settings. [Skotlex]
- * Fixed misleading and inaccurately documented events and added a missing flag. [Lance]
- * Fixed npc_cleanup_dbsub not removing key and caused pointer being freed problem. [Lance]
- * Fixed handling of the char_gm_read config for packet 0x2af7 (reloadgmdb)
- [Skotlex]
- * Added battle_config debuff_on_logout which removes Asura's SP regen delay
- and Strip-Equip effects on logout when set to yes (default,
- conf/battle/skill.conf). [Skotlex]
- * removed auto-attaching of player-run scripts in initnpctimer. You must
- use attachnpctimer instead! [Skotlex]
- * Final fix on Juperos NPC. [Lance]
- * Fix on initnpctimer not attaching rid. [Lance]
- * Fix on OnTouch ignoring -1 NPCs. [Lance]
- * Fix on @reloadscript crashing due to passing non BL_SKILL bl to a function that accepts only BL_SKILL bl.
- [Lance]
- * Added area NPC detection in clif_parseLoadEndAck. [Lance]
- * Fixed compiler warning in script.c get_mob_data. [Lance]
- * Temperory resolved issues on Juperos until I get the exact description on the behaviour
- in retail servers. [Lance]
-
-2006/03/16
- * Changed NJ_ZENYNAGE according to this weeks patch to deal a random [MasterOfMuppets]
- ammount of damage depending on the skill lvl.
- * @kill_monster/@kill_monster2 won't touch Guardians/Emperium now. [Skotlex]
- * Small change in the random item reading function, may fix @itemdbreload
- messing up random item searches. [Skotlex]
- * Restricted GS_BULLSEYE to only be used on demi-human or brute monster targets [MasterOfMuppets]
-2006/03/15
- * mob_chat_sub fix. Added buildin_pcblockmove. [Lance]
- * BL_PC and BL_MOB control script commands (experimental) [Lance]
- * Made an adjustment to addspiritball() to allow Gunslingers to summon up to 10 spheres [reddozen]
- * Fixed Tarot Card of Fate using time instead of time2 which is the one
- that actually holds the effect duration. [Skotlex]
- * Fixed mob random walk interval being set to up to 6K seconds in some
- instances. [Skotlex]
- * Added mapflag nodrop (prevents droping items to the ground). [Skotlex]
- * Fixed mapflag notrade doing nothing. [Skotlex]
- * Likely fixed Gravitation not hitting except for the last hit. [Skotlex]
- * Removed the hardcoded duration of 30 seconds for sleep. [Skotlex]
- * Fixed rangecheck for pet skill usage of INF_SELF_SKILL type of skills
- [Skotlex]
- * Removed inall/exall from atcommand.conf since those two do not exist!
- (pointed out by Ancyker) [Skotlex]
- * @me now uses entry 270 in msg_athena as output format. [Skotlex]
- * gm_skill_unconditional setting now also overrides skill_partner_check
- setting. [Skotlex]
- * Emulated strtok_r functions to work strictly with ANSI compilers. [Lance]
- * Added battle config options item_rate_adddrop, item_drop_add_min and
- item_drop_add_max to control drop rate of card-acquired loot bonuses.
- (conf/battle/drops.conf) [Skotlex]
- * Added item_db2.sql and mob_db2.sql, thanks to Joshuaali [Skotlex]
- * Added more usage of msg_athena on the slave atcommands messages. [Skotlex]
- * Fixed twilight pharmacy dropping 1 item to the ground instead of the qty
- produced. Thanks to k3dt [Skotlex]
- * Fixed Plagiarism not working unless you had some sc active. [Skotlex]
-2006/03/14
- * Fixed a possible crash in Venom Splasher if the countdown is too high.
- [Skotlex]
- * Fixed skill_notok blocking guild skills [Skotlex]
- * Fixed Napalm vulcan's time2 entry in the skill_cast_db [Skotlex]
- * Fixed the average_lv column size specification for levels above 255.
- Thanks to Joshuaali (upgrade_svn5607.sql) [Skotlex]
- * Updated @rura/@warp. Now you can use both "@warp mapname x y" and
- "@warp mapname,x,y". [LuzZza]
- * Added at-command @tonpc <NPC_name> (warp to NPC). [LuzZza]
- * Fixed @where at-command. [LuzZza]
- * Fixed WZ_WATERBALL + HW_MAGICPOWER [Skotlex]
- * Fixed incorrect range check in autospell-when-hit triggers. [Skotlex]
- * Modified Wedding recall skills to behave as in official [Skotlex]
- * Modified Arrow Shower to be a ground-based skill and work as it should on
- officials. However, the unit_id is still unknown. [Skotlex]
- * Fixed skill_additional_effect triggering every time you were being hit
- even if no damage was returned. [Skotlex]
- * Fixed battle_calc_damage_return to make magic damage be returned by 100%,
- and received damage nullified. [Skotlex]
- * Changed a bit status_check_skilluse to check for dead characters, should
- fix all the weird attack/attacked while dead bugs. [Skotlex]
- * Fixed player auto-attack not cancelling when dead. [Skotlex]
-2006/03/13
- * Finished some checks to make sure Land Protector Only blocks BF_MAGIC
- skills. Hammerfall is no longer blocked. [Skotlex]
- * Fixed script command warpparty looking for an attached player even when
- it is not needed. [Skotlex]
- * Shield Reflect is now passed through Devotion as well. [Skotlex]
- - Devoted characters lose the devotion effect when the Crusader is at less
- than 25% Hp. [Skotlex]
- * chrif_scdata_save will not send a save scdata request when the char has
- been already tagged as in the final save. [Skotlex]
- * Some status_change_start cleanups, stuff like blessing should now remove
- stone/curse even if the status does not begins because the character is
- already blessed. [Skotlex]
- * Cleaned SC_SUITON a bit to get rid of that compile warning. [Skotlex]
- * Added function battle_calc_gvg_damage for gvg related damage reductions.
- Fixes Gravitation being reduced as well as Pressure overriding max-castles
- restriction. [Skotlex]
- * Corrected char-server parameters so that the subnet config file is the
- third parameter, not the second (which was conflicting with
- inter_athena.conf's argument), thanks to foobar. [Skotlex]
- * PR_BENEDICTIO now ignores mdef [Skotlex]
- * Fixed chatlog's x/y column capacity in sql-files/logs.sql [Skotlex]
-2006/03/12
- * Updated clone skill copy to consider combo-skills. [Skotlex]
- * no_spawn_on_player won't work on mobs with no respawn delays now. [Skotlex]
-2006/03/10
- * Cleaned up the Skillbreaker implementation, HP gaining happens at level 5
- now. [Skotlex]
- * Autospells won't trigger now on maps where said skills are forbidden.
- [Skotlex]
- * Changed div (multi-hit) behaviour. Skills with div above zero will get
- their total damage increased by the number of hits, div less than zero is
- just for "show", total number of hits displayed is abs(div), but damage
- isn't increased by number of hits. [Skotlex]
- * Adjusted several skill damage equations to make up for the above change.
- [Skotlex]
- * Fixed a overflow bug when one of the item_random* files has too many
- random items. [Skotlex]
- * Fixed a variable loopback problem on NPC shop price checking routine. [Lance]
- * Fixed a memory overwrite crash on pc_readdb, thanks to foobar for the
- fix. [Skotlex]
- * Fixed only the first TK stance triggering when you have multiple of them
- active. [Skotlex]
- * Default of skill_attack_enable changed to yes. [Skotlex]
-2006/03/09
- * Fixed the dancer/bard soul-linked skills toggling on/off with each call
- to pc_calc_status. [Skotlex]
- * Fixed a bug in the pc_skillreset function which allowed TK rankers to
- accumulate skill points. [Skotlex]
- * Fixed a major memory leak in status.c causing the last column of job_db1.txt
- never being read. I have no idea how long this has been there, but signs point
- to us using Katars at a random ASPD from somewhere in memory for ages. [blackhole89]
- * Fixed a critical bug in job_db1.txt reading in status_readdb. [blackhole89]
- * Fixed pc_damage_sp not properly substracting SP. [Skotlex]
- * Made Magic Crasher a BF_WEAPON attack. [Skotlex]
- * Made skill_unit_range a per-level setting. meteor and Lov now have their
- unit range for bosses adjusted in the skill_unit_db rather than
- hardcoded. [Skotlex]
- * Added Gunslinger/Ninja Status Change icons. Somebody needs to look into
- them though for not all SCs have a matching SI. [blackhole89]
- * Changed ITEM_NAME_LENGTH to 50. [Skotlex]
- * Fixed stun's duration not getting reduced by vit + luk/3 [Skotlex]
- * Fixed #itemlist not taking into consideration crafted/forged items and
- pet eggs. [Skotlex]
-2006/03/08
- * More work on ninja/gs. Which made me do... [Vicious]
- - Add more weapon type(17~21 for guns) [Vicious]
- - Included MAX_WEAPON_TYPE in status.h and updated the codes
- (Whose idea was it to do static number... esp dual weapon) [Vicious]
- * Fixed a bug that was making the no_spawn_on_player setting useless.
- [Skotlex]
- * Added Deadly Poison and Bleeding to status_get_sc_def, meaning that now
- vit does increases defense against being inflicted from it. [Skotlex]
- * Fixed and tested @whodrops [Skotlex]
- * Updates to Gunslinger skills' DB entries. [blackhole89]
- * Rewrote pc_jobchange to be sane by using the map internal codes instead
- of a mesh of complicated nested comparisons. [Skotlex]
- * pc_authok will now change you to a novice if your class isn't identified
- as a valid one. BACK UP before updating, because.. well, just in case you
- start seeing novices filling up your city. [Skotlex]
- * Mobs will now chase you even if you hit them from outside their range of
- view. [Skotlex]
- * Fixed item disappearing from the floor when you attempted to pick it up
- and there was no room in your inventory. [Skotlex]
- * About half-ish nj/gs skills are semi/fully-done. No effect/status yet though. [Vicious]
- * Added atcommand @whodrops which lists mobs with the top drop-rates for a
- given item. List of stored mobs and their dropchances is also defined by
- MAX_SEARCH on map.h [Skotlex]
- * Modified atcommands @mobinfo and @iteminfo to display multiple matches
- instead of just one. Max number of matches to display is set in map.h
- (MAX_SEARCH) which is currently 5. [Skotlex]
-2006/03/07
- * Base for ninja/gunslinger is mostly done. need to work on skills now. [Vicious]
- - Updated sql-files/ mob_db.sql and item_db.sql to current txt dbs. [Skotlex]
- * @job ninja/gunslinger. No skill tree or anything yet. [Vicious]
- * Gospel won't start taking effect until after 10 secs have passed since
- invocation. [Skotlex]
- * Now if a skill has inf set to 4 (self skill) and inf2 512 (cannot target
- self) this skill becomes a target-auto-select skill, which targets your
- current attack target, and won't stop your current attack. The current
- attack is delayed by your aspd (except for a few skills such as the monk
- combo skills which readjust this delay). All Monk combo skills plus Taekwon
- kick skills have been updated to use this. [Skotlex]
- * Added a check that forces self skills (inf = 4) to select yourself as
- target to prevent oddities from crafted packets. [Skotlex]
- * More ground work for Ninja/Gunslinger [Vicious]
- * status_calc_pc now assumes that if your max hp is negative, it has
- overflowed, and as such, it is set to the max_hp setting instead of 1. This
- 'dangerous' assumptio is alright as long as there aren't equipment that can
- send your hp to negative values. [Skotlex]
- - Fixed the soul linker skill tree. (Thanks to muad_dib) [Zephiris]
- * Added Gunslinger and Ninja into @job. of course, you need latest EXE
- for make this work... and of course no skills yet! [Vicious]
- * Storm Gust now knocks back on a random direction instead of away from the
- storm. [Skotlex]
-2006/03/06
- * Some fixes due to the guild-skill changing location (being moved from
- 500->900 within the code) [Skotlex]
- * Fixed npc_event doing a map-check when the npc is not on any map.
- [Skotlex]
- * Fixed a debug message showing up on skill castend nodamage id when using
- a guild skill. [Skotlex]
- * Fixed #save not working on maps not in the current map server. [Skotlex]
- * Added battle config clear_skills_on_death to decide whether all
- ground-based skills should be removed when you die. Defaults to yes.
- [Skotlex]
-2006/03/05
- * Removed my EXP limit as it did not do what it was supposed to [Codemaster]
- * Fixed remove-trap [Skotlex]
- * Fixed animation of Redemptio [Skotlex]
- * Some reorganization of how the skill check functions behave
- (skill_get_*). Guild skills have been moved to the range 900~915 (instead
- of 500~519 in the code). [Skotlex]
- * Set the default for display_delay_skill_fail to 'no' as it should have been
- for a while (the kRO patch about that was last year, long time ago) [DracoRPG]
- * Fixed easter.txt typo. [Lance]
- * Extended summon command to enable custom timeouts. [Lance]
-
-2006/03/04
- * Fixed a bug in the subnet checking function, login-TXT server. Also
- changed the messages to be a bit more informative. [Skotlex]
-2006/03/03
- * Added function battle_set_walkdelay in charge of updating walkdelays of
- characters based on two criterias: when the delay is induced by damage, if
- the current walk delay isn't over yet, do not update it. If the delay is
- instead caused by a skill, then the current walk delay cannot be decreased,
- only increased. [Skotlex]
- * Added upgrade_svn5455.sql, it converts the manner and karma columns to
- signed. Apply this if your tables have the field as unsigned (which would
- explain mute always disappearing after relogging) [Skotlex]
- * status_change_start now checks on a 0->10000 scale, should fix sc-cards
- with very low rates never triggering (eg: some coma-inducing cards).
- [Skotlex]
- * Cleaned up the active guild skills. They should be usable now by
- non-players as well. [Skotlex]
- * Fixed crash on the NPC whisper system when the message's size was 1.
- [Skotlex]
- * Strip status changes are now removed on logout. [Skotlex]
- * Added a column in skill_cast_db for specifying can't walk delays. It's
- all set to 0 currently, so someone get updating them! [Skotlex]
- * Removed the apply walk-delay entry from skill_cast_nodex as the new walk
- delay column handles this now. [Skotlex]
- * Fixed autoloot dropping the item to the ground even when it was
- autolooted. [Skotlex]
- * Fixed character deletion working on SQL without an email address (Thanks to Valaris) [Zephiris]
- * Added event 8 for mobspawns that should spawn with special ai set. This
- means that now in the mob_spawn files if you use 8 as the last entry, the
- mob will use the special ai, and as such, it will only attack other mobs,
- not players (can obviously be combined with 2 for small mobs and 4 for
- large mobs, eg: 10 for a small mob with special ai set) [Skotlex]
- * Modifed battle_check_target so that mobs with special ai will only target
- by default mobs without said state (this will prevent normal clones from
- fighting among themselves, for example) [Skotlex]
- * Trick dead now ends on logout [Skotlex]
- * Added mapflag nocommand which blocks @/# commands unless your gm level is
- above gm_skill_unconditional's level. [Skotlex]
- * Fixed weapon scripts not being executed unless the weapon was forged.
- [Skotlex]
- * gm_skill_unconditional is now a no/gm-level setting instead of yes/no
- [Skotlex]
-2006/03/02
- * Slaves inherit speed will now only work if the master can move. [Skotlex]
- * Some cleanup and reorganization on the way pet-skill variables are
- handled. [Skotlex]
- * Fixed a typo that disabled all pet support skills from triggering (except
- ground-based ones) [Skotlex]
- * status_check_skilluse cleanup. Some status will only block skills when
- they are first used, not on cast-end (which includes auto-spells and
- ground-skill checks). Now when status_castcancel is 'no', skills WILL
- come off after the cast bar is done. [Skotlex]
- * Gravitation now only affects the caster, should have also fixed the skill
- not doing damage when skill_caster_check is set. [Skotlex]
- * Max fame list size is now defined by MAX_FAME_LIST constant (mmo.h)
- [Skotlex]
- * Individual fame lists sizes can now be specified through the char-server
- (check the fame list configs in char_athena.conf) [Skotlex]
- * Some cleanup on mob_can_reach code to prevent unnecessary path-searching
- [Skotlex]
- * Optimized the path-searching ai for mobs to try target cells around the
- target in order rather than randomly picked cells. [Skotlex]
- * Applied Snufkin's patch to fix compilation on FreeBSD. [Skotlex]
- * Fixed mobs targetting themselves after using a support skill. [Skotlex]
- * Gospel no longer blocks item usage of whoever is in the area of effect,
- only the caster of Gospel can't use healing items now. [Skotlex]
- * Added the long/near attack_def_rate card effects to battle_calc_magic
- (horn card and the like will now work with spells) [Skotlex]
- - Elemental fields should vanish on map-change now. [Skotlex]
- - Land Protector only blocks magical ground skills now. [Skotlex]
- * Fixed item pickup not picking anything unless you were in a party with
- item distribution set [Skotlex]
-2006/03/01
- * Made it so players that are at the max level do not receive EXP.
- This makes it so a player at the max level (ie - 99) cannot join a party
- and feed all of his or her EXP to the other party members [Codemaster]
- * Mapregsql will now fully depend on mmysql_handle. [Lance]
- * Optimized strcharinfo to use switch. [Lance]
- * Some cleanup of the mob skill reading. Added error reporting for unknown
- states/conditions, error reporting now specifies the file and line number.
- [Skotlex]
- * Silence will only block skills when they have begun casting, not when the
- cast bar is done. This also means that auto-spells will likely come-out
- even when silenced. [Skotlex]
- * opt1 status will block skills when they are done casting only if the
- sc_castcancel option is set. [Skotlex]
- * strcharinfo now returns blank instead of crashing the map server when
- there's no player attached. [Skotlex]
- * Added a missing mysql_init call to the mapreg sql handle. [Skotlex]
- * Checked and fixed the script engine barking when you try to have a label
- with the same name as a const.txt defined parameter. [Skotlex]
- * Turn Undead and Offensive Resurrection should now work on undead players.
- [Skotlex]
- * Fixed the range checking of Repair weapon [Skotlex]
- * Rude attacked is now also triggered when you hit a target that can't move
- out of their melee attack range. [Skotlex]
- * Mob ai will attempt to do a long-range attacked condition skill before
- unlocking a target when it is attacked and said target is out of melee
- range of a non-walking mob. [Skotlex]
- * Corrected mobskill event to set the target_id before triggering. This
- should fix shortrange/longrange attacked mob skill conditions. [Skotlex]
- * Moved MSC_SKILLUSED trigger to mobskill_event which is triggered in
- battle_calc_damage. It is also triggered on skill_castend_nodamage_id.
- [Skotlex]
- * Added party_share_loot for handling party-share loot. it should now work
- with autoloot as well. [Skotlex]
- * Fixed skill_break_rate breaking stuff even if the rate is 0. [Skotlex]
- * pc_stopwalking will not send a fixpos packet if you are sitting. [Skotlex]
- * mob_can_reach rude-attacked condition now uses the mob's field of view.
- [Skotlex]
- * SC_NOCHAT is automatically started on pc_authok if manner is negative.
- [Skotlex]
- * Map server now refuses to start if you try to define a label with the
- same name as some const.txt defined character parameter. [Skotlex]
- * Corrected a few Compiling Warnings [Codemaster]
- * Added the ability to select GM loading via Login (default) or Char [Codemaster]
- * Added script command 'setbattleflag'. [Lance]
-2006/02/28
- * Rewrote LAN support code. Changed configuration file name
- lan_support.conf to subnet_athena.conf, changed it syntax. [LuzZza]
- * Added script command 'equip' to equip items. [Lance]
- * Fixed dependancies in map-server compiling (VC7.1). [Lance]
- * Added autoequip flag check for pc_takeitem. If it impacts on perfomance, please remove it. [Lance]
-2006/02/24
- * Prevented guild/party recall to work on GMs of greater level than
- yourself. [Skotlex]
- * Prevent muting players with higher GM level than yourself. [Skotlex]
- * Fixed Lady Tanee's spawns. [Skotlex]
-2006/02/23
- * Fixed the CL_WHITE define, thanks to FlavioJS [Skotlex]
- * NPC break equipment stuff now has a 1.5% per skilllv success rate.
- - This is a custom value as 20%-lv10 seems too high and 10%-lv10 seems too
- low. [Skotlex]
- * pc_setpos won't random warp players if placed on top of Moonlight Petals
- [Skotlex]
- * Removed the check in clif.c for npc_shopid as the client never sends a
- packet when the trade is cancelled... [Skotlex]
- * Player-summoned mobs won't level up now. [Skotlex]
- * Fixed Super Novice explosion spirits triggering no matter what you said
- on the third line. It now triggers on the fourth line.... [Skotlex]
- * Fixed GTB blocking targetted spells when gtb_pvp_only was set. [Skotlex]
- * Merged the code of Ankle snare and Spider web. It no longer moves target
- if sc failed. [Skotlex]
- * Players should stop walking as soon as they start vending or get into a
- chat. [Skotlex]
- * Added mob skill conditions myhpinrate and friendhpinrate. [Skotlex]
- * Added monster_ai condition 16 (enable `friend` targetted skills to heal
- oneself) [Skotlex]
- * Fixed the shop id not clearing when buying/selling (which made you get
- stuck afterwards). [Skotlex]
- * Modified the way autospells stack to mimic official servers. Cards of the
- same ID cannot stack, but different cards with the same skill can each
- trigger indepedently of each other. [Skotlex]
- * Added battle_config autospell_stacking to enable stacking of cards of
- same ID. (see battle/item.conf) [Skotlex]
- * Moved card-specific battle options to items.conf [Skotlex]
- * Autospells triggered when hit will check the range to the target.
- [Skotlex]
- * Some cleaning up of status_calc_pc [Skotlex]
- * In status_change_start capped the passed success chance to 100% [Skotlex]
-2006/02/22
- * Windwalk's flee bonus is now +1 every 2 skill lvs. [Skotlex]
- * Changed the way equipment breaking works. Function pc_break_equip was
- removed and now skill_break_equip is used. Basicly, it's the same as
- before, except that when you 'break' a piece of equipment of a
- non-player, the corresponding strip(weapon/armor/shield/helm) status
- effect is induced (duration: strip skill lv 1) [Skotlex]
- * Cleaned up the Dev folder. [Skotlex]
- - Take note of the file todo-for-stable, which holds all modifications in
- trunk that have not yet made it into stable. Be sure to update the file
- as needed.
- * Updated the path searching code with jA's current implementation.
- [Skotlex]
- - There is a slight chance the CELL_NOSTACK mod broke, someone test that.
-2006/02/21
- * Fixed the range-check of targetted skills (was evaluating the range as 0
- always) [Skotlex]
- * Now you should receive the party/guild mini-dots on map-load without the
- need of waiting for others to "move" for you to receive the update (fixes
- dead characters never showing up on the map) [Skotlex]
- * Fix to prevent using main chat when it disabled in atcommand_athena. [LuzZza]
- - Fixed message codes in duel functions.
- - Small fix in log_refine, incorrect compare expression.
- * Some cleaning of the warp portal code so that when it is "pre-casted" it
- doesn't mess up with other casted skills. [Skotlex]
- * Some fixing on the weapon-refine code. [Skotlex]
- * Cleaned up some npc_event error reporting. [Skotlex]
- * Some cleanup of the castend routines to not clear the skill variables if
- for some reason the casted skill triggers another skill. [Skotlex]
- * Vending is now cancelled on a pc_setpos [Skotlex]
- * Pressure again ignores Basilica. [Skotlex]
- * Fixed attacker's sc being nulled when the target's sc is empty (fixes
- most status changes not taking effect during battle) [Skotlex]
- * Slaves now do a battle_check_target to check if the new target is an
- enemy when acquired through the master's skilltarget. [Skotlex]
- * Fixed SC_SKE halving de2 twice. [Skotlex]
-2006/02/20
- * The Super Novice Explosion Spirits skill will now trigger when the last
- sentence is said (not after the next sentence as it was currently) [Skotlex]
- * Now the default delay of amotion is applied only for BF_WEAPON, non
- NK_NO_DAMAGE skills (so stuff like Summon Spirit Sphere get the default
- skill delay rather than ASPD) [Skotlex]
- * Made the Char-SQL server send the GM listing when the map server
- connects. [Skotlex]
- * Play-dead and Basilica now block Gospel [Skotlex]
- * Map SQL server will no longer ignore the gm-list packets received from
- char. [Skotlex]
- * Login-SQL server will not free the current GM listing if the SQL reading
- of it failed (prevents GM lists being lost on SQL connection problems)
- [Skotlex]
- * Login-SQL will now read for the GM list ALL accounts with level above 0,
- not just those with level above min_gm_level (just like the TXT server
- does) [Skotlex]
- * SC_NOCHAT is not dispelled on death now. [Skotlex]
- * Cleaned up the global message function, Super Novice Explosion Spirits
- will not trigger on maps where said skill can't be used. [Skotlex]
- * Close confine won't get the bonus range on cast as other skills do due to
- exploits. [Skotlex]
- * Fixed a bug in setnpctimer. [Skotlex]
- * Menu-based skills now use their own variables separetly from the normal
- skill variables. This should enable them to work even when you keep doing
- other stuff between the menu invocation and selection. Also gives a better
- control over packet-based exploits. Affected skill/script-commands are:
- [Skotlex]
- - Arrow Crafting
- - Warp Portal / Teleport
- - Item producing
- - Identify
- - Repair weapon
- - Pet egg selection
- - Hindsight
- - Weapon refine.
- - Feel of the Stars, Moon and Stars.
- * Corrected the implementation of Gangster's Paradise to work as it should.
- [Skotlex]
- * Fixed Close-confine not properly ending on a knockback (that includes
- backsliding) [Skotlex]
- * Changed MAX_RANDITEM from 2000 to 10000 to fit new databases [Komurka]
- * Fixed Taekwon stances not triggering. [Skotlex]
- * Added atcommand @exp [Skotlex]
- * Added error reporting when add_timer_interval receives a negative/0
- interval value. [Skotlex]
- * Fixed a possible infinite recursion bug with splash self skills. [Skotlex]
- * Modified the way firewall_hits_on_undead works, to loop and invoke
- multiple skill_attacks based on the value. Now it behaves a lot closer to
- how Aegis Firewall does (except a good default value for this config switch
- is missing) [Skotlex]
- * Preparing eA for new mob_skill_db from Aegis 10.2 [Komurka]
- - increased MAX_MOBSKILL 32 -> 40
-
-2006/02/19
- * Some fixes to the last item usage tick. Items should be working fine now.
- [Skotlex]
- * Fixed parsing of @kamic/@kamib to check for case. [Skotlex]
- * Now you can hide from Pressure. [Skotlex]
- * Weapon endowing will work on targets already endowed with the same
- element. [Skotlex]
- * Now reseff cards will take effect even if the status change is passed
- with &8 flag. In short, now reseff are ALWAYS applied to the status change
- defense. [Skotlex]
- * Removed a missing break that was making AM_TWILIGHT2/3 always fail.
- [Skotlex]
-2006/02/18
- * Removed the SP_<stat> cases from status_get_sc_def as they were colliding
- with other status changes. [Skotlex]
- * Implemented SG_MIRACLE (Miracle of the Sun, Moon and Stars) [Komurka]
- - duration is stored in battle_config.sg_miracle_skill_duration (currently
- it's set to 10 minutes)
- - ratio is stored in battle_config.sg_miracle_skill_ratio (currently it's set
- to 0.01% chance per character move)
- - this skill enables you usage of all Warmth skills, Comfort skills, and also
- all mobs will be target of the Stars regardless of the day and map
- - you'll see message "[Miracle of the Sun, Moon and Stars]" when skill kicks in
- * Added upgrade file upgrade_svn5322.sql because apparently not everyone
- has the guild table with autoincremental guild_id defined. [Skotlex]
- - If you can't create guilds, chances are you need to apply this ugprade.
- * Fixed a missing break that was making Heal, Resurrection and some others
- become attack skills [Skotlex]
- * Some CELL_NOSTACK Mod updates: [Skotlex]
- - Made the free-cell lookup more extensive.
- - Allowed pc_setpos to place players on top of cells that are stacked
- - Fixed a logic bug in the mob-walk code that was making them get stuck and
- not move (triggered quite often when the cell no stack mod is enabled)
-2006/02/17
- * Cleaned up irc.c, may it compile now on Windows? [Skotlex]
- * Updated the VC project files by Joshuaali. [Skotlex]
- * Fixed possible crash on pet egg select. [Skotlex]
- * Massive update on the way splash/area (non-ground) skills work. [Skotlex]
- - the new column 'splash' in skill_db is now used to determine the area of
- effect of all related skills (eg: splash range of fireball, area of effect
- of angelus, the splash damage area of mines, etc)
- - nk definition update. &1 is no damage skills, &2 is for splash skills. A
- skill can be tagged 3 to indicate it is both. This is used to indicate the
- type of handling the skill should use, but it also helps as all splash
- skills get an extra check to prevent them from hitting 'unhittable'
- characters (ie: hidden) while all skills not tagged as non-damage can
- trigger auto-spells.
- - All self skills are automatically executed as no-damage skills and get
- re-routed as damage skills when the source and target do not coincide (this
- handles all combo skills)
- - Some skills may have screwed up (I fixed/moved all which I could find
- needed updating). As usual, report any issues.
- * Added an upgrade_svn file that should fix the party table by making the
- party_id auto-incremental. Apply this or new parties will always fail!
- [Skotlex]
- * Changed around the included files in irc.c to see if it compiles under
- Win32 native. [Skotlex]
- * Char-SQL server updates: [Skotlex]
- - Removed the unnecessary party/guild check on each char-save.
- - Removed the 'quick loaded char' messages.
- - Some code cleanup.
- - Fixed one or two memory leaks.
- * Applied the suggested fixes by Joshuaali to fix the compiling of the sql
- map server on Win32 systems. [Skotlex]
- - note that irc.c is still uncompilable, but the rest "should be fine" now.
- * Fixed the memory leak on opt_2str as pointed out by End of Exam [Skotlex]
- * Fixed a few char SQL memory leaks as pointed out by End of Exam [Skotlex]
-2006/02/16
- * Fixed a crash in AL_TELEPORT. [Skotlex]
- * Now you can't close-confine and already confined mob. [Skotlex]
- * mysql/my_global.h now includes winnt.h under Windows systems... [Skotlex]
- * Some code cleanup of status.c [Skotlex]
- * Removed the check that prevented mobs from walking into a basilica. [Skotlex]
- * Added a new column in the skill_db to specify the
- splash-range/area-of-effect of skills. (Work in progress) [Skotlex]
- * Autocasted AL_TELEPORT should now automatically pick menu entry rather
- than showing the box up. [Skotlex]
- * The battle config options sp_rate and hp_rate are now applied
- independently of the same type of bonuses from cards. [Skotlex]
- * In CELL_NOSTACK mode, mob_canreach will now ignore other players when
- checking if there's a path to the player. [Skotlex]
- * Added RG_RAID to the list of skills that need a status_checkskilluse on
- skill_attack. [Skotlex]
- * Added the mapflag check monster_noteleport to AL_TELEPORT. [Skotlex]
- * Fixed the sc_def rate not being reduced in status_change_start. [Skotlex]
- * Changed the include in irc.c from strings.h to string.h, which fixes a
- bunch of compilation warnings here... [Skotlex]
- * Updated the SQL login/char servers to let the mysql server grant the new
- IDs for accounts/chars/pets/parties/guilds instead of them being handled by
- the server. [Skotlex]
- * Some cleaning of the pc item use functions. [Skotlex]
- * Gospel shouldn't block enemies in certain situations from using items
- now. [Skotlex]
-2006/02/15
- * Fixed crash in chrif_load_scdata warning message. [Skotlex]
- * Fixed pets displaying "strangely" when they did not have their pet armor.
- [Skotlex]
- * Added battle config option pk_level_range for specifying valid level
- ranges to engage in PK (battle/misc.conf) [Skotlex]
- * Added battle config allow_es_magic_player to enable SL_S* skills to work
- on non-mobs. (battle/skill.conf) [Skotlex]
- * Fixed the char servers to store correctly exp as uints. They are also
- capped to LONG_MAX before being sent to the client. [Skotlex]
- * TK_DODGE now dodges all ranged attacks, when used with SPURT, dodges
- everything. [Skotlex]
- * The autospell loop now cancels after one successful cast. This means if
- you have 10 autospells with 100% casting rate, only one will come off with
- each hit instead of all of them. [Skotlex]
- * Warm skill update: [Skotlex]
- - they are type BF_WEAPON, so that they may trigger effect/spell cards.
- - Changed their element to -1 to carry on weapon's element.
- - Against player it only damages 60SP per "hit"
- - Against non-players it is a knockback skill as it was before.
- - Hit frequency increased to once every 100ms.
- * TK_DODGE now only dodges ranged weapon attacks, while under Spurt mode
- it dodges everything (provide better information if this is not how it
- should behave as the current info given is conflicting itself >.<)
- [Skotlex]
- * Cleaned up and expanded the sc_def_rate battle config. The new battle
- flags are mob_sc_def_rate, pc_sc_def_rate, mob_max_sc_def, pc_max_sc_def
- [Skotlex]
- * Modified Marionette Control so that the max bonus stats you get is capped
- to your server's defined max stats instead of 99. [Skotlex]
- * Mobs are no longer affected by the vs_traps_bctall switch. [Skotlex]
- * Added function pc_damage_sp to damage the SP of players, updated code as
- necessary. [Skotlex]
- * Fixed @lvup command adding levels instead of substracting when you
- specify a negative quantity. [Skotlex]
-2006/02/14
- * pc_setinventorydata won't use itemdb_search on empty inventory slots (id
- = 0) [Skotlex]
- * Fixed the icon from Provoke being gone. [Skotlex]
- * Fixed skill_timerskill (most notable skill broken: water ball doing 1
- hit) [Skotlex]
- * Removed the declaration of puchar and pchar from my_global.h which was
- preventing compiles on native win NT systems. Drawback is now Win9X systems
- will fail to compile instead... [Skotlex]
- * Hiding cancels Close Confine now. [Skotlex]
- * ST_MOVE_ENABLE now also checks for pc_can_move(), and only perform a walk
- check if the skill is ground targetted. [Skotlex]
- * Moved the berserk_cancel_buffs code to status_change_start. [Skotlex]
- * Moved most checks of status_isimmune() to status_get_sc_def [Skotlex]
- * Allowed Endow skills to go through status_isinmune characters. [Skotlex]
- * Fixed PR_BENEDICTIO not taking away all SP. [Skotlex]
- * Modified the way Status changes are linked to skills for an easier to
- read implementation (see status_initChangeTables). [Skotlex]
-2006/02/13
- * Added battle config sc_def_rate which adjusts natural defense of
- characters against status changes (see conf/battle/battle.conf). [Skotlex]
- * Pet eggs will now not be deleted from the inventory until they arrive
- from the char-server. [Skotlex]
- * pc_readdb will now print if any classes are missing their exp tables.
- Only exception are JOB_WEDDING and JOB_XMAS. [Skotlex]
- * Made the NPC_BREAK* skills attack skills again, their chance of equipment
- breaking code was moved to skill_additional_effect. [Skotlex]
- * Now when the exp table does not has enough data to reach the max level
- specified, the max level will not be reduced to enable leveling through
- quests/scripts/gm-commands/etc. [Skotlex]
- * Made Land Protector Block Hammerfall. [Skotlex]
- * Updated item_db code to stop creating items for every non-existant ID
- used. Instead it will complain, and use a dummy item that has the view ID
- of an apple, and it's type 3 (etc item). [Skotlex]
- * Modified PA_GOSPEL so that the random damage attack becomes a BF_MISC
- attack. [Skotlex]
- * Added pc_resetskill when lowering job level and there's not enough
- skill points to substract. [Skotlex]
- * Fixed SG_FUSION costing SP to deactivate. [Skotlex]
- * Some cleaning up at pc_setpos to prevent calling pc_clean_skilltree
- [Skotlex]
- * Enabled use of TF_HIDING while Cloaked. [Skotlex]
- * pc_resetstate won't remove wedding skills now [Skotlex]
- * NPC_POWERUP now gives +40% atk per level. [Skotlex]
- * Water elementals can be frozen again. [Skotlex]
- * Fixed the sc_def equation in status_change_start. [Skotlex]
- * Fixed an extra semi-colon that broke win32 compiles. [Skotlex]
- * Some rewriting of bounds checks in @baselvup, @joblvup and the #
- equivalents to prevent signed/unsigned comparisons. [Skotlex]
- * Now slaves give exp/loot (exception: player slaves still stick to the old
- rules of no exp/loot) [Skotlex]
-2006/02/12
- * Some path cleanups meant to get the CELL_NOSTACK mod working better with
- path searching and the like. [Skotlex]
- * Optimized functions skill_addtimerskill/skill_cleartimerskill [Skotlex]
- * Fixed SC_DANCING for non players (was making dances only last 1 second
- for them) [Skotlex]
- * Modified map_moveblock to handle updating dance's position as well as
- ending close confine status effects. [Skotlex]
-2006/02/10
- * Fixed Sonic Blow's damage for lvl 1~9 [Vicious]
- * The status window will now show the total power of both weapons instead
- of just the right-hand weapon for dual wielders. [Skotlex]
- * Removed #include <lcms.h> from irc.c, since it's unused and some people don't have it. [Valaris]
- * Changed the default MAX_LEVEL supported by the map server to 1000. [Skotlex]
- * Pet Lures won't be consumed now when used on a non-mob. [Skotlex]
- * Fixed map_searchrandcell function. [Skotlex]
- * Modified the NPC_BREAK* skills to break equipment at a 10%*lv rate. [Skotlex]
- * Modified the drop item routines to perform stacking checks only for
- player attempted item drops, therefore, mob drops will stack up to
- infinity. [Skotlex]
- * NPC_POWERUP now gives +20% attack per skill level. [Skotlex]
-2006/02/09
- * Fixed "set baselevel, X" sending one to a different level than the one
- requested. [Skotlex]
- * Added range checking to mob skill loading of permillage and delay to
- prevent overflows. [Skotlex]
- * Fixed pc_gainexp not working for next level exp requirements above
- INT_MAX. [Skotlex]
- * Fixed the display of @showexp not working right for exp values above
- INT_MAX. [Skotlex]
- * Removed the conf sql code for now. Maybe will continue later with that project.
- Lowered the irc keepalive timer, and added some checks for use_irc that should have been there.
- Added a return line \n to the beginning of the title screen. [Valaris]
- * Added function mob_respawn which makes a mob respawn on spot 3 seconds
- after defeat if SC_KAIZEL is active. [Skotlex]
- * Modified NPC_REBIRTH to use Kaizel level 1. [Skotlex]
- * Added setting max_exp_gain_rate which caps how much exp you can get from
- a single kill. See battle/exp.txt for details. [Skotlex]
- * pc_readdb will now cap experience required per level to UINT_MAX, it will
- warn if the exp table has exp values above said limit. [Skotlex]
- * Changed the default of skill_delay_attack_enable to no. [Skotlex]
- * Code rewrites in mob_damage and party_exp_even_share for correctly
- handling overflow issues. Now uses UINT_MAX for range comparisons, as it
- should be. [Skotlex]
- * Also modified the mob_db reading to use UINT_MAX for exp limits, changed
- their exp/job exp fields to unsigned int as well. [Skotlex]
- * Modified multi_level_up behaviour to work as specified by Kyoki. That is,
- on a level up, the max carry-over exp is the exp needed for the previous
- level -1. [Skotlex]
- * Modified the skill attack display of Meteor Assault and the Warm Skills
- (I think the caster should no longer do fancy animations now on each hit)
- [Skotlex]
- * Added back water elemental targets being inmune to SC_FREEZE [Skotlex]
- * SQL compile fix [Komurka]
-
-2006/02/08
- * Added battle config option skill_caster_check, which does a
- status_checkskilluse on all skill attacks. When enabled (default on) the
- caster of the skill is checked on all skill_attacks, which means that
- ground spells will make no effect if the caster is unable to fight
- (stunned, frozen, etc) [Skotlex]
- * Added battle config option status_cast_cancel. When enabled (default off)
- some status changes (freeze, stone, etc) will cancel your cast. [Skotlex]
- * Fixed the death exp penalty underflow bug. [Skotlex]
- * Rewrote/organized status_change_start, it now receives the base rate for
- the effect. It handles reducing this rate/duration through natural
- resistances and whatever else should reduce it. [Skotlex]
- * Fixes to exp2.txt on the novice job exp. Thanks to rollopop. [Skotlex]
- - Also modified exp2.txt to use the normal max levels by default.
-2006/02/07
- * Modified battle_check_distance, mobs should no longer find a diagonal
- spot on which they lock onto their target, yet fail to attack from. [Skotlex]
- * Removed the max level configs from battle/exp.txt [Skotlex]
- * Now NPC_POWERUP uses SC_INCATKRATE instead of SC_EXPLOSIONSPIRITS for
- enhancing damage. Instead of +1k atk per skilllv, it is +50% atk per
- skilllv. [Skotlex]
- * Fixed char server changing the save/last point to new grounds in certain
- situations. [Skotlex]
- * Fixed SG_STAR_ANGER not getting it's damage bonus at all. [Skotlex]
-2006/02/06
- * Added a custom exp table that goes up to level 1000 (db/exp2.txt). [Skotlex]
- - It uses a inverse exponential growth rate to mimic the official exp rate
- increase as close as possible.
- - It overrides the exp level of the last 5~10 official exp values for a
- smoother curve.
- - It's adjusted so that the Lv1000 exp requirement for Advanced Base/2nd
- Job is close to the unsigned int limit without going above it (limit is
- 4294967295 in my system. It goes up to 42k Million on Advanced
- Base lv1000, I think)
- * Fixed startnpctimer starting multiple timers instead of failing when the
- npc timer is already running. [Skotlex]
- * Venom Splasher update: [Skotlex]
- - always hits (but splash damage targets can still avoid it)
- - Being hit does not cancels it,
- - works at 75% or less of target's HP
- - being hit normally while under the count has a chance of causing poison.
- - Damage is +400% + 50*lv%
- * Using autoloot with no arguments now toggles it between @autoloot 0 and
- @autoloot 100% [Skotlex]
- * Falcon Assault now takes Blitz Beat lv5 as base damage. [Skotlex]
- * Fixed pc_makesavestatus not updating status.option correctly. [Skotlex]
- * Corrected Waterball so that higher levels can do insane amount of hits. [Skotlex]
- * Altered slave behaviour. No more random walking, will stay within 2 cells
- of their master. [Skotlex]
- * Reverted the Summon Slave behaviour to not adjust level based on number
- of current slaves. [Skotlex]
- * Coma no longer sends SP to 1. [Skotlex]
- * Updated Meteor so that when level 11 or more is casted, the area over
- which meteors fall is tripled. [Skotlex]
- * Dark elemental characters are now inmune to Curse. [Skotlex]
- * Fixed sc_data saving to sql buffer building method. Thanks to its_sparky. [Skotlex]
- * Changed the map zone reading from using pow to a bit shift. [Skotlex]
- * Experience has now been changed to unsigned int, and is read as such from
- the dbs. [Skotlex]
- * Increased HT_DETECTING seek range to 7x7 [Skotlex]
-2006/02/05
- * Added some of eAIRC bot code, written by me and LittleWolf.
- It is disabled and has no configuration options yet, as it is not finished. [Valaris]
- * Fixed and documented script command "callshop". [Skotlex]
- * Updated sq;-files/mob_db.sql with current mob_db. [Skotlex]
- * Updated sql-files/item_db.sql with current item_db. [Skotlex]
-2006/02/04
- * Skotlex's Falcon Assault fix. [Vicious]
-2006/02/03
- * Fixed the debug script messages specifying the wrong mapname for NPCs.
- [Skotlex]
- * Now you can't hide from earth elemental attacks (status_check_skilluse).
- [Skotlex]
- * Grand Cross/Grand Darkness can no longer get the ignore defense -armor
- piercing bonuses from cards. [Skotlex]
- * Loki's weil is now ignored by bosses. [Skotlex]
- * Land Protector and Gantantein should now ignore traps. [Skotlex]
- * Fixed Shinobi card so that it fails when you aren't next to a wall.
- [Skotlex]
- * After a guild master change, the new guild master has his guild skills
- blocked for 5 minutes to prevent abuse. [Skotlex]
- * Fixed txt-converter compilation errors [Komurka]
-
-2006/02/02
- * Fixed crash in status_change_timer. For some reason the block type switch was removed. [Valaris]
- * Crash fix in npc.c npc_timerevent.
- was: struct timer_event_data *ted = (struct timer_event_data*)ted;
- changed: struct timer_event_data *ted = (struct timer_event_data*)data;
- Skotlex, I am assuming it's calling from the passed data var, If I'm wrong
- please fix it. I just know what was there was definitely not correct. [Valaris]
- * Improved the NPC timer system to enable multiple timers going on at a
- time with different players attached to each. Now npc event timers are of
- two types: attached or global. The global timers don't have a player
- attached and can be started/halted by anyone. The character timers have a
- player attached, and they can only be stopped by a script that has the same
- player attached. [Skotlex]
- - Now player attached scripts will auto-abort when the atteched player
- quits the map server.
- - Of course, this requires some major testing as it's prone to have bugs...
- * Applied the Entry Reusage System to the battle delay damage timers.
- [Skotlex]
- * Fixed the map server complain when using the default user/password
- showing up if you set the new user/pass on the import file. [Skotlex]
-2006/02/01
- * Fixed compile errors and warning in chrif.c and charsave.c. [Valaris]
- * Map and char server now will complain if they are run using the default
- user/password set. [Skotlex]
- * Trick Dead makes you stop walking now. [Skotlex]
- * Soul Burn is not affected by Lex Aeterna, not affected by target's cards
- neither. [Skotlex]
- * Freeze and Stone take preference over Benedictio. [Skotlex]
- * Sleep/Stun/Petrify/Freeze block each other out. [Skotlex]
- * Fixed areamonster when the passed class is negative. [Skotlex]
- * Removed the clear screen when launching the server. [Skotlex]
- * Integrated the status change variables into a single structure for easier
- management. [Skotlex]
- * Break fall should no longer trigger when inflicted by freeze/stone/etc
- [Skotlex]
- * Fixed an overflow in grfio causing read problems in Win32 builds [celest]
- * Changed resnametable loading behaviour - grfio will load from data directory
- first, and then from the highest priority grf only if that fails [celest]
- * Increased grfio filelist limit to 1048576 to avoid problems when loading
- too many large grfs [celest]
-2006/01/31
- * Fixed skill_check_cloak to use the current skill level of the cloaking
- skill and not pc_checkskill() to know if a cloaker away from a wall should
- be uncloaked. [Skotlex]
- * Likely fixed opening guild storage. [Skotlex]
- * Removed no penelty mapflag for nifilheim. Confirmed on iRO. [Kayla]
- * Changed default value of gm_cant_drop_max_lvl to 98. Also reworded the
- comments for cant_drop_max and min. [Kayla]
- * Disabled pet skills by default. To my knowledge they are only enabled on
- cRO, not iRO nor kRO. [Kayla]
- * PF_SOULBURN no longer ignores mdef. [Skotlex]
- * HW_GRAVITATION should now invoke auto spells. [Skotlex]
- * Cleaned up damage return code. Reflect Shield and the like now should
- also trigger autospells from normal attacks (previously it was only worked
- on skill attack returned damage) [Skotlex]
- * Cleaned up Summon Slave mob skill to only summon number of missing mobs
- to complete the skill level (that is, SS level 5 will always bring the
- total count of slaves to 5, never above). [Skotlex]
- * Fixed being able to Encore skills you no longer have in your tree.
- [Skotlex]
- * Added no HP regen while Bleeding, -25% ATK and ASPD penalties as well.
- [Skotlex]
- * Added VIT reduces duration of confusion. [Skotlex]
- * Added "onspawn" mob skill condition. [Skotlex]
- * Changed the exp table format. The new format allows specifying exp tables
- for any particular class. Thanks to Playstester for converting the official
- exp table to the new format. [Skotlex]
- - UNTESTED: Report any problems asap.
-2006/01/30
- * Autoloot now uses the item's base drop chance rather than final drop rate
- to determine if it should autoloot the item or not. [Skotlex]
- * Fixed super novices getting +10 to all stats temporarily when their death
- count isn't zero. [Skotlex]
- * Fixed Kahai displaying HP-SP as the total healed instead of HP [Skotlex]
- * Cleaned up skill_repairweapon to prevent crashes when the target
- vanishes/changes/whatever before the weapon to repair has been selected.
- [Skotlex]
- * Parsing the Storage/Guild Storage from the char server will now fail if the
- storage has been modified and not saved yet. [Skotlex]
- * Being hit now cancels confuse. [Skotlex]
- * Added back the bleeding icon. [Skotlex]
- * Fixed Combo Finish Soul Linked Effect being a 11x11 area rather than 5x5
- [Skotlex]
- * Added 'restricted' mapflag, based on lordalfa patch [Komurka]
- - you can set restriction zone on map (see mapflag/restricted.txt)
- - you can turn off item usage on certain restricted map in item_noequip.txt
- - you can turn off skill usage on certain restricted map in skill_nocast_db.txt
- * Moved MVP log code so it can log all MVP, not only when player gets MVP item,
- thanks to Hatred_ [Komurka]
- * One more small fix on 'bSPVanishRate' (hp -> sp) [Komurka]
- * Added bSPVanishRate to const.txt - Dark Priest Card should work now ^^
- * Implemented bonus2 bSPVanishRate for Dark Priest Card [Komurka]
- - it isn't finished - I get '[Warning]: pc_bonus2: unknown type 0 50 10!' ><
- * Applied lordalfa patch - you can now forbid usage of certain cards on PVP/GVG/WoE
- defined in item_noequip.txt [Komurka]
-
-2006/01/29
- * Added support for more account states like "Unavailable due to hacking/bug
- investigation" etc, thanks to NeoSaro [DracoRPG]
-2006/01/28
- * Added the night mapflag to the new maps. Removed some indor maps. [Poki#3]
- * Added DISGUISE MobID; UNDISGUISE; script commands [Lupus]
- - Made them for Eastern Year of the Fire Dog Event.(to be uploaded today)
-2006/01/27
- * Added support for mob_avail.txt replacement for NPC classes. [Skotlex]
- * Added "sense_type" config to conf/battle/skill.conf to select which defense
- is displayed on the sense screen. Defaults to displaying def+def2. [Skotlex]
- * Modified traps so that once they trigger they set themselves as "Into the
- Abyss" casted traps, so that if you remove them, you won't earn the item.
- [Skotlex]
- * Fixed Basilica (small bug introduced yesterday) [Skotlex]
- * Hopefully cleaned out the warnings when compiling the char-SQL server.
- [Skotlex]
- * Updated the makefile for the plugins to take into account the ers.o file.
- [Skotlex]
-2006/01/26
- * Updated VC project files, thanks to D-Kalck. [Skotlex]
- * Rare drop announces will now be done based on the mvp_sd (character who
- did most damage) instead of sd (character that delivered final blow)
- [Skotlex]
- * Fixed TK Doridori bonuses to double your regen instead of giving 30Hp/3Sp
- [Skotlex]
- * Fixed Sense displaying def2/mdef2 when it should display def+def2 / mdef
- + mdef2. [Skotlex]
- * Fixed Super Novices losing their skill tree (showing up just basic skill)
- under certain circumstances. [Skotlex]
- * Cleanup and optimization of the movement routines. [Skotlex]
- * Added experimental feature "Cell Stack Limit". When enabled (see
- src/map/map.h) it should limit the amount of characters that can be placed
- on the same cell. That's assuming it works (experimental and untested as of
- yet) [Skotlex]
- * Hopefully fixed Benedicto checking on the west/east tiles instead of the
- left/right tiles of the caster. [Skotlex]
- * Fixed mobs being unable to move on tick loopback (which happens every ~51
- days) [Skotlex]
-2006/01/25
- * Reverted last change, when you log again it still shows the fake
- icon. [Foruken]
- * Temporary fix to fake mute status when using pk_mode and
- !muting_player [Foruken]
- * Probably fixed the max base/job battle config options actually enabling
- characters to reach one more level than the max specified. [Skotlex]
- * Fixed BSS Sacramenti not hitting demon type enemies. [Skotlex]
- * Now poisoned monsters will show HP updates as their health goes down
- (let's see if this finally convinces people that poison works u.u)
- [Skotlex]
- * Splitted up battle_athena.conf into multiple configuration files.
- battle_athena.conf only contains import lines now, and all the
- configuration options are located in conf/battle/* [Skotlex]
- * Updated the db version with the new one by FlavioJS [Skotlex]
- * Improved the error reporting when failing to load a mob skill due to
- insufficient fields. [Skotlex]
- * Changed map_getallusers to use the db interface getall (hope it doesn't
- breaks horribly) [Skotlex]
- * Added an attack delay to TK kicks to prevent the top10 rankers from
- attacking normally during the skill animation. [Skotlex]
- * Updated script.c to display the file not found error using braces as
- delimiters to help when npc filenames include spaces and the respective file
- is not found due to them) [Skotlex]
- * Changed TK_RUN to a misc attack type which should enable you to halt the
- skill quickly after starting it. Updated SC_SPURT to be triggered when you
- stop running if you stopped running one sec or less after you started.
- Corrected the icon of SPURT to be that yellow Running Man. The previous
- footsteps effect was assigned to CHASEWALK. [Skotlex]
- * fixed battle config item_auto_get setting autoloot to just 0.01% drops
- rather than 100%. [Skotlex]
- * Added Sharp Shooting check to skill_attack to prevent hitting hidden
- characters. [Skotlex]
-2006/01/24
- * Some cleaning up of battle_calc_damage, Assumptio should now also reduce
- damage of all types of attack, not just weapon-based ones. [Skotlex]
- * Incremented SL_MONK combo SP cost reduction to 25% [Skotlex]
- * Updated Full Adrenaline Rush to work on all weapons except bows. [Skotlex]
- * Updated the script engine to report the src of an error when there's a
- problem with one of the script functions. For example, if there's a "player
- not attached error", it will also print which NPC caused it. [Skotlex]
- * Added RFIFOSKIP(fd,RFIFOREST(fd)) to the end of the login server's parse functions.
- This is good for clearing out packets of one byte. [Valaris]
- * Fixed noteleport mapflag affecting Warp Portal. [Skotlex]
- * Fixed map server crashing when parsing an incomplete mob-skill line. [Skotlex]
- * @autoloot 100 will now pickup items that have drop rates ABOVE 100. [Skotlex]
-2006/01/23
- * Added battle config "no_spawn_on_player", see battle_athena.conf for
- details. [Skotlex]
- * Fixed bows doing less damage on criticals when having high dex. [Skotlex]
- * Moved the enemy_critical adjustment to status_get_critical. [Skotlex]
- * Fixed @chardisguise to use the same id checks as @disguise. [Skotlex]
- * Fixed SightBlaster 'hitting' dead characters. [Skotlex]
- * Basilica check in status_checkskilluse expanded to help mobs release
- their target as soon as they walk into a basilica. [Skotlex]
- * When a player stops walking their to_x and to_y is updated to their
- present position. This MAY fix warp portal not warping players that were
- already there waiting to be warped. [Skotlex]
-2006/01/22
- * typo fixes (fell -> feel) [Komurka]
- - mob_db_mode_list.txt updated
- - removed some unneeded comments (//komurka)
- * Some changes of @main. Now you can send main-chat messages by sending whisper
- to nick "Main" (or any other, it can be set in inter_athena.conf). [LuzZza]
-2006/01/21
- * Changed gm_can_drop_lv battle conf switch to gm_cant_drop_min_lv and gm_cant_drop_max_lv [Komurka]
- * SL_SWOO (Esu) will only lasts 1/5 of normal time when used on a Boss-type monster [Komurka]
- -SL_SKE (Esk) won't work on a Boss-type monster anymore (if you KNOW that it should work on them
- write about it on forum; either way don't bother guessing ... SL can solo ANY boss with this skill ~.~)
-2006/01/20
- * Fixed the login-TXT login Log. [Skotlex]
- * Small update to sql-files/item_db.sql to fix speed potions (a complete
- update will be done when possible...) [Skotlex]
- * Fixed clone script command's duration being in ms rather than seconds.
- [Skotlex]
- * Taekwon Ready Stances combo time is now 2000 - 4*agi -2*dex ms instead of
- a flat 2 secs (same reduction that Monk combos get) [Skotlex]
- * Cleaned up code of SG_HATE, may fix the skill seemingly not working.
- [Skotlex]
- * Likely fixed Even-Share parties not breaking up when a character with
- too high/low level rejoins in char-TXT servers. [Skotlex]
-2006/01/19
- * Added config option atc_slave_clone_limit to limit the amount of
- @slaveclone's a player can have. [Skotlex]
- * The clone commands now fail when used on someone of higher GM level than
- the caster. [Skotlex]
- * Increased the size of the clif_disp_onlyself packet by one to see if it
- fixes the mysterious cropping of the last character in the message.
- [Skotlex]
- * Now when use_statpoint_table is set to yes, it will be used to determine
- the stat points you earn on level up. [Skotlex]
- * Small fixes as pointed out by FlavioJs in the login TXT server to prevent
- crashes in Win32 compiles. [Skotlex]
- * Merged Marquis's implementation of Enjoyable Rest's earth scroll bonus.
- [Skotlex]
- * Fixed players being able to send custom crafted mute requests that would
- go through regardless of their gm level and mute others. [Skotlex]
- * Updated mapflags [Lupus]
- * Modified the client_connect function in socket.c to allow different parse_functions to be called
- based on the listening socket. After a make_listen_bind returns a listen fd, set that fd's
- func_parse member to whatever parse function to be used. If this value is not manually set
- it will just use the default_func_parse function. This only affects server listening sockets
- in which the func_parse member isn't even used. [Valaris]
- * gvg_traps_target_all now also affects traps in pvp maps. [Skotlex]
- * All reflected damage has now a chance to auto-cast spells. [Skotlex]
- * Fixed Casting ground spells from within basilica. [Skotlex]
-
-2006/01/17
- * Updated the map server code to use some of the new db functions. [Skotlex]
- * Fixed ground skills checking the wrong target-type on movement, hence
- making them mostly useless (this is what the Warp Portal report was about)
- [Skotlex]
- * Some code updates to implement the new db interface. [Skotlex]
- - SQL compilation not tested, so if it breaks someone report to fix it :X
- * Added @clouds2 and clouds2 mapflag using effect 516. [Valaris]
- * Fixed some weather effects not working or not functioning correctly. [Valaris]
- * Cleanups and organization to maps_athena.txt and map_index.txt, thanks to
- Poki for the cleanup work. [Skotlex]
- * Some cleanup of the SG_FEEL code [Skotlex]
- * Fixed debug mode compiling in VC7.1. Added optimizations to VC7.1 release mode.
- Defaulted VC7.1 SLN to debug mode. [Lance]
- * Temperory solved the freeing freed pointer error upon map-server shutdown. [Lance]
-
-2006/01/16
- * Fixed clif_disp_onlyself packet length, thanks to Orn. [Skotlex]
- * Imported Freya's autoloot system which enables one to specify the maximum
- drop-rate to loot. [Skotlex]
- * Refix of the mapreg SQL saving fix of a while ago... [Skotlex]
- * Playtester custom eamobs spawn updates: coal Mines, umbala fields, and
- minor changes to Sphinx and Geffen Dungeon. [Skotlex]
- * Incremented a bit clone skill usage rate, their rate/delays are now affected
- by the battle_config options mob_skill_rate and mob_skill_delay [Skotlex]
- * Optimized use of BL_* constants by making them stackable (meant for
- map_foreach* calls). Should improve performance by avoiding
- battle_check_target calls on a bunch of invalid targets such as
- items/skills/npcs on skills and other misc places. [Skotlex]
- * Fixed mob skills that should trigger on status on "any bad". [Skotlex]
- * TK classes no longer are inmune to the strip-effects of Jump Kick [Skotlex]
- * Fixed SQL mapreg saving. [Skotlex]
- * Reverted Ice Wall Behaviour (you can snipe/cast through it again) [Skotlex]
- * Fixed possible crash in skill_check_condition on consume-delayed items [Skotlex]
- * Skills whose range is increased by Vulture Eyes now get the range
- increased by 10 for non players (assumes VE level 10). [Skotlex]
- * Added cardfixes of near_attack_def_rate and long_attack_def_rate to misc
- attack calculations. [Skotlex]
- * Fixed Spirit of Wizard not working in a couple of instances. [Skotlex]
- * Advanced Book now gives 1%*skill level success chance to create element
- convert potion [Skotlex]
- * Changed the FEEL skill implementation to store/use map indexes instead of
- map names.[Skotlex]
- * Fixed compilation of plugins. [Skotlex]
- * Applied flaviojs's new db interface and fixed compatibility problems with Visual Studio. [Lance]
-
-2006/01/15
- * Fixed poison damaging player even when under 25% hp. [Skotlex]
- * Fixed permanent character variables in Char-TXT [Skotlex]
- * Fixed previous change for stable. Whoops my 5am work again. [Kayla]
- * Fixed the trade exploit allowing for a user to send packets while in a trade.
- For instance the bank NPC becoming a zeny dupe. Kudos to clown. [Kayla]
- * Added script source error reporting to set and getarrayelement, should
- print NPC name and location (map, coordinates) on the console when there's
- an error with these two commands. [Skotlex]
- * Removed treasure chests spawning upon agitbreak, leading to exploits. [Lance]
-
-2006/01/14
- * Removed the 5% success penalty for trying to make a convertor for which
- you don't have the relevant enchant skills. [Skotlex]
- * Fixed compilation of Login Converter. [Valaris]
- * Fixed bSPGainRace and bExpAddRace with RC_NonBoss and RC_Boss. [Valaris]
- * Lex Divina now shows the animation even when used on someone you can't
- (non-muted, non-enemy player) [Skotlex]
- * Quick hack to make Shield Reflect trigger auto-spells (only this kind of
- return damage does it? Because other reflect cards like Orc Lord behave
- exactly the same way...) [Skotlex]
- * Fixed grf loading to attempt to load from all grf files specified in
- grf-files.txt (looking for them in the same order specified in the file,
- returns the first match found) instead of only looking up on the last
- specified grf... [Skotlex]
- * Fixed compilation of plugins. [Skotlex]
- * Added error reporting to the db when a null key/data is attempted to be
- inserted and the db is configured to not allow them. [Skotlex]
-2006/01/13
- * Fixed labels located at the beginning of a script not being counted at
- all. [Skotlex]
- * Applied blackhole89's patch to enable dynamic menus. [Skotlex]
- - Script reference doc updated accordingly.
- * Ranking Taekwons with lv 90+ no longer get Quest/Wedding skills for free.[Skotlex]
- * Readjusted Scream And Frost Joke so now the effect goes off no matter
- where the caster went, but the effect will happen only around the area
- where the skill was done regardless of where the caster is (which is how it
- should work from a logical stand point) [Skotlex]
- * Scream and Frost Joke now take effect 2secs after casting, and caster
- must remain in same map for it to take effect. [Skotlex]
- * Flying Side Kick can't be used by Soul Linkers now. [Skotlex]
- * npc_reload should now correctly remove mobs and npcs that aren't placed
- in any map (such as mobs that were killed and are waiting for respawn) [Skotlex]
-2006/01/12
- * Fixed Ice-Wall range problem. [LuzZza]
- * Corrected the guild_db_final function in int_guild.c of SQL char-server to
- compile and function with the new db code. [Valaris]
- * Fixed some advanced skills being able to be copied even when restricted [Vicious]
- * Fixed a possible crash-source related to item-picking packets. [Skotlex]
- * Now Top 10 ranking Taekwons with base level 90+ get their whole
- skill-tree maxed out (but only as bonus-skills, they aren't saved on the
- dbs) [Skotlex]
- * Some cleaning of the char_name_letters implementation. Characters don't
- need a space between them, in fact, placing a space in that config makes
- the space count towards allowed/disallowed characters. [Skotlex]
- * Some modifications to the db code to make the code portable. It may
- compile on windows now. (note I can't test SQL compiles yet so report any
- problems ASAP) [Skotlex]
- * Fixed Venom Knife consuming two daggers. [Skotlex]
- * Inverted the packet order in many skills which cause status effects. The
- client expects the status-change packet to arrive before the skill packet
- in order for opt3-related changes to make effect on the character. [Skotlex]
-2006/01/11
- * Added @main command into atcommand_athena.conf. [LuzZza]
- * Tuxedo and Wedding Dress no longer get a 'forced' gender check regardless
- of config ignore_items_gender setting. [Skotlex]
- * Added support for 'invisible' shops. These are shops that are loaded but
- not placed on any map, so you can't click on them. [Skotlex]
- - Example: -<t>shop<t>Invisible Dealer<t>-,1750:-1,1751:-1,1752:-1,etc...
- - Make sure they have a unique name if you want to reference to it with...
- * Added script command 'callshop' for invoking shops from within a script. [Skotlex]
- - Usage: callshop "Shop Name", flag;
- - Distance to shop is still checked, so it's best to use 'invisible' shops.
- - flag determines shop selection: 1: Show buy list, 2: show sell list.
- Anything else: show the buy/sell/cancel menu.
- - Function returns 1 if successful, 0 otherwise, but it is recommended that
- the script should be closed right away to prevent problems.
- - Documentation to the scripts_command.txt reference file not yet added
- because this command is as of yet untested and may need further refining.
- * Newly created SQL guilds won't save the member-list right away (this
- seems to be the reason why sometimes when creating new guilds, the
- guild-master keeps guild_id == 0 in the tables) [Skotlex]
- * Fixed char/int_storage.c reporting lines with too many items when in
- reality said items had the exact max amount allowed. [Skotlex]
- * Moved the status_change_clear code below the exp penalty so that the
- SC_BABY effect will work. [Skotlex]
- * Fixed the map_index never finding the last map specified in the
- map_index file. [Skotlex]
- * Fixed an overflowed pointer in char/inter.c, and an already free'd pointer
- error in map/guild.c [Skotlex]
- * Added battle option party_item_share_type, now you can choose between
- round-robin (previous implementation) and random (default) [Skotlex]
- * Fixed compilation of the plugins (due to the db change) [Skotlex]
- * Fixed a few issues with the map server (notably npc_command_sub was
- broken) [Skotlex]
- * Added proper escaping of the motd string before inserting it on the rag
- server info SQL table. [Skotlex]
-2006/01/10
- * Updated the map-server to conform to the new db interface. Removed
- DB_DELAY_FINAL_CHANGES and related code from db.* as now eA fully complies
- to the new interface. [Skotlex]
- * Crafting Arrows, Weapon, Forging/Upgrading now all fail if you have an
- npc going on to prevent your inventory from being modified while selling.
- [Skotlex]
- * Updated the char-SQL server to etc etc etc new db etc etc etc. [Skotlex]
- * Cleaned up the description of size_fix.txt [Skotlex]
- * Updated the char-TXT server to be blah blah blah new db blah blah. [Skotlex]
- * Updated both login servers to be fully compliant with the new db
- interface. [Skotlex]
- * Moved skill damage bonuses from cards to the 'second layer' which means
- they are applied on top of previous damage bonuses rather than just adding
- to them. [Skotlex]
- * Some more updates to the db code as specified by FlavioJS [Skotlex]
- * Fixed the memory leak of npc_unload_ev. [Skotlex]
-2006/01/09
- * Some more updates regarding the new db system. [Skotlex]
- - Note that there's currently a leak regarding npc_events (ev_db), but this one is
- not a serious problem (unless you use a lot of npc_reloads) and will be
- fixed as the db gets improved.
- * Moved the Kaupe code to battle_calc_weapon_attack where it will dogde all
- weapon-based attacks that can be dodged (giving the illusion of infinite
- flee for skill's duration). [Skotlex]
- * Moved Sonic Acceleration and Soul Linked SB damage bonus to the second
- layer of skill modifiers. [Skotlex]
- * Enchant Deadly Poison and True Sight damage bonuses are now applied after
- skill modifiers rather than added with them (damage % stack type). [Skotlex]
- * Modified Ice-Wall to work using cell types defines instead of directly
- modifying the gat terrain information. Main reason for this is to enable
- pc_setpos to place players on top of an ice-wall, because otherwise it
- was forcing players to warp-around even in maps with noteleport set which
- is prone to exploits. [Skotlex]
- * Fixed SG_FUSION (SG_FUSION <-> SC_FUSION #_#) [Komurka]
- * Now sense elemental values are again uncapped (so enemy with -25% resist
- will show 230% instead of 0%), as requested :P [Skotlex]
- * Replaced the db subsystem for FlavioJS's implementation and initial work
- on updating the eA code to use it as intended. [Skotlex]
- * Fixed Char-TXT server saving last/save maps with spaces on the left. [Skotlex]
- * Fixed Char-SQL server saving new character's maps with spaces on the left. [Skotlex]
- * Fixed Charsave method 1 saving memo maps with spaces on the left. [Skotlex]
- * Changed the order of packets sent for Assumptio (may fix the visual not
- showing up?) [Skotlex]
-2006/01/08
- * Fixed the guild SQL cache removing guilds from memory when said guilds
- had no data to save (but were not yet marked for removal) [Skotlex]
- * Added a cap to limit Star Gladiator's job level to that of the normal
- classes (instead of 2nd classes) [Skotlex]
- * Fixed TXT char server parsing only the first character permanent variable
- received from the map server and ignoring the rest. [Skotlex]
- * Fixed @users crashing the server. [Skotlex]
- * Added Arrow Repel to the list of skills whose range is increased by Vulture Eye. [Skotlex]
- * Fixed the item pick-up rule for party options being working backwards. [Skotlex]
- * Fixed progress info in TK_MISSION [Komurka]
- * Fixed an aproximation error when calculating distances which causes stuff
- like mobs thinking they are within attack range when they actually aren't
- [Skotlex]
- * Char-server will now be notified after a character logs out when using
- charsave_method:1 [Skotlex]
- * Added check to update pet's position on pc_movepos (stuff like High Jump)
- when the master moves too far away or to a position the pet can't reach.
- [Skotlex]
- * Fixed char-save method 1 saving map names with padding spaces to the
- left. [Skotlex]
- * Now sense elemental values are capped to 0 as lower bound (so for an
- enemy with -25% resist, it'll show 0% instead of 230%) [Skotlex]
- * Updated sql-files/ mob_db.sql and item_db.sql to current TXT data.[Skotlex]
-2006/01/07
- * If player is dead, and is spawned (such as @refresh), death packet is sent. [Valaris]
- * Cleaned pc_attack_timer so that the attack timer will auto-readjust when
- it triggers during the can't act tick instead of cancelling the attack
- sequence. [Skotlex]
- * Fixed compilation of the TXT-converter. [Skotlex]
- * walkto x,y request packets are now ignored if you are sitting. [Skotlex]
- * Fixed a typo that was making the party item-pickup style shared not
- taking effect for the item_first_get_time regardless of setting. [Skotlex]
- * Applied Playtester's custom mob spawns to the eamobs/ set. [Skotlex]
- - These custom mob spawns are an experiment to balance out mob spawns and
- put some sense into them (no crap like too strong AND too weak mobs on the
- same floor, increasing mob difficulty the deeper into the dungeon you go,
- etc), without moving mobs too far from where players are used to see them neither.
- - To enable them, modify scripts_main to use scripts_eamonsters rather than scripts_monsters.
- - Currently, the modified dungeons are: Glast Heim, Geffen Tower, Clock
- Tower, Sphinx, Pyramids, Byalan.
- * Added check to make sure guildspy and partyspy variables have value. [Valaris]
- * Separated the permanent variables from the character status structure. [Skotlex]
- * permanent variables are now loaded on their own packets as needed to
- reduce the bandwidth wasted between servers. [Skotlex]
- * Permanent account variables are now saved when the script is finished
- instead of each time they were modified. [Skotlex]
- * OnInit scripts and related code now executes after all perm variables are
- received (so now account variables are accessible during it) [Skotlex]
- * Fixed typo in pc.c causing crashes in Line 769. [Lance]
- * Corrected VC7.1 prject files to include mapindex.c and mapindex.h [Lance]
- * Corrected Wrath of the Star formula (added missing STR in equation) [Komurka]
- - Added movement speed bonus to SG_FUSION (same as PecoPeco gives)
- - You can now 'turn off' SG_FUSION
- * updated NoIcewall maplags, thanks to Sir Loon [Lupus]
- * soundeffectall modified to rely on dependancies depending on situation. [Lance]
- * Modified getd to return 'pointer' (will be 'dereferenced' automatically) instead of value,
- making it very flexible when paired with getelementofarray() [Lance]
-2006/01/06
- * Corrected main.sql having incorrect syntax [Foruken]
- * Cleaned up some maps in maps_athena.txt and added a bunch of cloned maps
- to map_index.txt [Skotlex]
- * Refine bonus is no longer increased by the number of hits from the skill
- except for TSS [Skotlex]
- * Dispelled Berserk won't drop HP back to 100 now. [Skotlex]
- * Mobs that use NPC_SUICIDE won't give neither exp or loot now. [Skotlex]
- * Summoned mobs that cannot move will be removed from the map when the
- master is gone to another map AND the mob's map is a gvg ground. [Skotlex]
- * Fog of Wall effects now work in both directions (outside -> inside,
- inside->outside) [Skotlex]
- * Fixed the sql guild loading always returning a blank guild when the
- guild_id does not exists! [Skotlex]
-2006/01/05
- * Some changes to the guild SQL code to report whenever a guild's id is not
- matching the one it was stored with in the db, which in turn free's the
- guild and doesn't saves it to perhaps prevent data corruption. [Skotlex]
- * Corrected the fifo-buffer readjusting code to set a reserve-buffer size
- of 1/8th of the inter-server link (32K) for said links. [Skotlex]
- * The mapif_send* and charif_send* functions (char/login servers) will now
- adjust the buffer size when there isn't enough space to write data to them
- rather than abort sending the data. [Skotlex]
- * Increased inter-server socket buffer size to 256*1024. Should fix problems
- with 0x3004. [Kayla]
- * Increased inter-server socket buffer size to 192*1024. Should fix problems
- with 0x2b01. [Kayla]
-2006/01/04
- * Fixed buildin_monster not working for random classes (dead branch, etc). [Skotlex]
- * Reverted inter-server socket buffer size to 131072 bytes. [Valaris]
- * Removed reduction of socket buffer sizes after WFIFOSET if the max size
- is >= FIFOSIZE_SERVERLINK. This should reduce inter-server buffer overflows. [Valaris]
- * Script command 'monster' will now fail when trying to spawn a mob-class
- that is not in the mob_db (warning will be printed on the console) [Skotlex]
- * Fixed a crash when spawning a mob who's class is not in the mob_db. [Skotlex]
- * Some cleanups and improvements to the character saving algorithm meant to
- make it harder to have dupe exploits during char-map connection lag
- moments. [Skotlex]
- * Doubled the inter-server link buffer size. [Skotlex]
- * Fixed status_get_adelay messing up the mob's aspd :X [Skotlex]
- * Changed skill_delayfix to use the amotion value as default delay for
- weapon skills with no delay instead of attack delay (adelay is actually
- twice your aspd, amotion is the same as aspd) [Skotlex]
- * Added upgrade_svn4783.sql, which corrects the structure of the mapreg
- table to use varchars as it should. [Skotlex]
- * Fixed Meteor Assault. [Skotlex]
- * Fixed (I hope) the double free'd pointer issue in the login servers. [Skotlex]
-2006/01/03
- * Fixed the warp unloading code. [Skotlex]
- * Updated Jump Side Kick to also clear Berserk Pitcher. [Skotlex]
- * Preserve now protects against the stripping effects of Side Kick. Taekwon
- Classes (TK/SL/SG) are also inmune to it. [Skotlex]
- * Hopefully fixed the guild information not being sent in some situations
- when people are added/removed from a guild. [Skotlex]
- * Some cleaning up and bug fixes to the guild module of the char-sql
- server. Let's see if it fixes anything up... [Skotlex]
- * Added battle option show_party_share_picker. When enabled tells the
- picker of the item who received the item when in a party with 'Party Share'
- loot style. [Skotlex]
- * Added the nullpo_retv line required for win32 compiles... [Skotlex]
- * Added some cleanup code to properly remove all warp related information
- on npc_unload (untested as of yet!) [Skotlex]
-2006/01/02
- * Completed (almost) packet 0x1e9 which gives the party info. Now you can
- see the party's item options when opening the alt+p menu. [Skotlex]
- * Fixed regen only working when overweight. [Valaris]
- * Added body size to clones. [Valaris]
- * Corrected TK_JUMPKICK to remove Soul Linker spirit buffs and related
- effects (except Berserk-Pitched effect) [Skotlex]
- * Corrected TK_RUN to give +10 dmg bonus to kick skills when not wearing a
- weapon. [Skotlex]
- * Added Kaina's Enjoyable Rest bonus and Max SP bonus. [Skotlex]
- * Fixed Stone Curse consuming gems while Soul Linked. [Skotlex]
- * Fixed party-change-map packet incorrectly checking if the even share rule
- was broken (party share should now correctly break on map-change, or when a
- player has it's level reset) [Skotlex]
- * Corrected the Jump Kick base-level damage bonus when combo-used. [Skotlex]
- * Added the running damage bonus to the TK kicks. [Skotlex]
- * Made the TK kicks end the Soul Linked status on targets. [Skotlex]
- * Corrected Spirit of Wizard to nullify any bounced back spells. [Skotlex]
- * Cleaned up the natural/skill HP/SP regen routines. [Skotlex]
- * Fixed Turn Kick not knocking back nearby enemies. [Skotlex]
- * Added the damage bonus to Flying Side Kick when used from a combo.
- However I am waiting for the actual equation (currently just does +300%
- dmg) [Skotlex]
- * Fixed Counter Kick for ranking Taekwons. [Skotlex]
- * Added walk slowdown and aspd penalty to Eska. [Skotlex]
- * Fixed status_get_size which seemed severly broken. [Skotlex]
- * Fixed Kahai to only display actual amount of HP healed. [Skotlex]
- * Now when a script's map is not found (or not loaded on the map server)
- the script engine will skip the whole script instead of just the first
- line. [Skotlex]
- * Fixed Soul-Linked Dancers not receiving the Bard songs. [Skotlex]
- * Updated Joshuaali's VC-8 project files. [Skotlex]
-2006/01/01
- * Some improvements to the login server (txt/sql) to prevent memory 'leaks'
- from accounts that logged in but where never properly set as logged out.
- [Skotlex]
- * Fixed mapindex not working for last map loaded in map_index.txt [Skotlex]
- * Added support for packet 0x1e9, party_main_info. Packet is still
- incomplete and the client is ignoring it currently... [Skotlex]
- * Changing party options now does not alters item party options. [Skotlex]
- * Corrected Kahai healing even when there's not enough SP to do so. [Skotlex]
-2005/12/31
- * Fixed the additional effects on normal attacks of Enchant Poison, Enchant
- Deadly Poison and Kahai not taking effect except when the attacker was a
- player. [Skotlex]
- * Resurrection now fails on gvg maps (when reviving) [Skotlex]
- * Kaite now works on player-casted spells regardless of level... [Skotlex]
- * Fixed Kahii healing 0 rather than 200*skilllv... [Skotlex]
- * Mobs will now go after the loot as soon as they spot it rather than on
- their next random-walk time. [Skotlex]
- * Set the 56th byte in packets 7b and 1da. It deals with acceleration in directions.
- It's just like the final byte in packet 0x87. Server-side update of this still needs to be figured out. [Valaris]
- * Fixed Kaziel not starting Kyrie Elison upon resurrection. [Skotlex]
- * Fixed Kahai's healing display. [Skotlex]
- * Fixed Kaite bouncing back always one spell. [Skotlex]
- * Fixed and tested @waterlevel. It requires the grfs to be present as the
- map layout height information is stored there but not in the map data kept
- in memory. [Skotlex]
-2005/12/30
- * Disabled certain packets from taking effect during trades to prevent
- possible exploits (such as picking and dropping items, buying selling from
- npcs, etc) [Skotlex]
- * Now you can't move items to/from your inventory to the cart/storage
- during a trade (this is to prevent possible item dup exploits) [Skotlex]
- * Emergency Recall now only works from within woe grounds... [Skotlex]
- * Removed returns from non-null lines in MOTD. Replaced returns in null lines with a space. [Valaris]
- * Fixed a bug where MOTD wasn't displaying blank returned lines. [Valaris]
- * Updated mapindex so that name lookups ignore extensions, and the loaded
- maps are always terminated in .gat. Id lookups will always return a string
- terminated in gat. Purpose? It enables specifying mapnames without the .gat
- extension, so you can have npcs in prontera, no need for the .gat. And the
- returned string always has a .gat for needed when it is passed to the
- client. Now you can safely get rid of the .gat extension in all mapnames. [Skotlex]
- * Fixed the txt-converters so they compile cleanly again. [Skotlex]
- * Added mapflag script support for no loot, no exp, no return, no warp to,
- nightmare drops (see db/const.txt for names) [Skotlex]
- * Removed an extra } in int_party.c that caused compile errors. [Valaris]
- * Fixed a crash when warp portals passed from passive to active. [Skotlex]
- * Added a missing label (M_0) that was causing people to freeze when viewing the city list from "Miss Yoon" [Zephiris]
-2005/12/29
- * Newly created char-SQL guilds will be saved inmediately rather than at
- their next turn in the cache (may fix those guild disappearing errors)
- [Skotlex]
- * Implemented a map-index which maps map-names to a unique number, this
- reduces memory required to store maps as well as the size of related
- packets between the char/map server. Maps and their indexes are stored in
- db/map_index.txt, and the index of a map should NEVER change (see file for
- more details). The index is translated to/from map-names for saving, so
- save-structures are not required to be modified. [Skotlex]
- - PD: The new mapindex also found a bunch of broken map names in various
- NPCs, someone will have to go fix them up.
- * Updated the party member structure to hold the char_id. For end users,
- the most noticable change is that now you can have more than one
- character from the same account belong to the same party. [Skotlex]
- - TXT users will have to wipe the party files, SQL users use the respective
- upgrade file (upgrade_svn4726.sql) to generate the new party column.
- * Updated the char-sql server to hold parties in memories until they are no
- longer needed (like the guild-cache), also optimized the save routine to
- avoid needless SQL calls. [Skotlex]
- ** WARNING: Because of the previous optimizations, a lot of code was changed around
- the map/char servers, the char-sql's party system got pretty much a
- rewrite, so some problems are to be expected. Some basic testing with
- parties over here showed no problems, hence the work is getting commited
- as it is because it isn't getting any better without further testing.
- * Set value of the last byte in packet 0x87 (walkok) to 0x88 (10001000).
- This is a default value in Aegis, and has something to do with animation speed in certain directions.
- This byte is going to need to be fully analyzed since it does change in Aegis, just that I have
- been unable to figure out what the conditions are. [Valaris]
- * Mob skills are not even read now if mob skills are disabled in
- battle_athena. [Skotlex]
-2005/12/28
- * Fixed xmas and wedding palette ignore options. It will also no longer send the dye packet if @dye is used. [Valaris]
- * Some code cleanup meant to fix possible memory leaks regarding
- parse_script() [Skotlex]
- * Small fix to party-share item pickup which should fix the current item
- dup exploit. [Skotlex]
- * Merged Reddozen's implementation of Kahai. [Skotlex]
- * Implemented Kaite (it simply changes the target of spell to the caster,
- so the caster's status changes and defense are the ones considered)
- [Skotlex]
- * Removed Guilds Glory from guild skill tree, can be enabled with require_glory_guild
- battle conf switch [Komurka]
- * Cleaned up the implementation of Poison and Deadly Poison. Corrected a bug
- on Deadly Poison that was KO'ing human players when it triggers under
- certain circumstances. [Skotlex]
- * Added guild_skill_tree.txt [Komurka]
- - corrected guild skill tree
- * Battle Orders, Regeneration, Restore and Emergency Recall now share their
- 5 minute delay. [Skotlex]]
- * Implemented SC_INTRAVISION [DracoRPG]
- * Reorganized a bit DEF/MDEF calculation code [DracoRPG]
- * Added a small licence notice at the top of every Athena source/header file, I've tried
- to put it only where it should have been but I'm not a pro ^^ [DracoRPG]
-2005/12/27
- * The 50% Weight Icon will now show up at whatever % was specified in
- natural_heal_weight_rate [Skotlex]
- * Fixed char-txt server crashing if trying to read storage lines with more
- items than the max (excess items will simply not be read and a warning
- printed) [Skotlex]
- * Added silent_console config option to the servers to filter out the
- console output (login_athena, char_athena, map_athena config files). Makes
- it possible to hide unwanted messages by category, so for example you can
- remove all info messages, or all warning+notice messages, etc. [Skotlex]
- * Removed unused battle switches enable_upper_class and unit_movement_type. [Skotlex]
- * Reenabled battle switches pet_defense_type, mob_defense_type and
- mob_remove_damaged. [Skotlex]
- * Applied Irmin's patch to add support for SQL codepages. [Skotlex]
- * Fixed friend list saving if using a custom char table name (SQL version). [Valaris]
- * Added check for mute in main chat [Foruken]
- * Likely fixed lose Hp/Sp script commands when used on accesories. [Skotlex]
- * Added 2 new script commands: getfatherid, getmotherid [Lupus]
- * Fixed compatibility problems with stricter compilers. [Lance]
- * Added joshuali's new VC8 project files and SQL database upgrade script. [Lance]
- * Fixed juicer script typo, eliminating unlimited juicing capability with zero zeny. [Lance]
-2005/12/26
- * Added check for free'd guild pointer beforing freeing in guild_save in int_guild.c. [Valaris]
- * Added @kamic command. Now you can send colored GM-messages.
- Syntax: @kamic <color> <message>. Color is 3-bytes hexadecimal number RRGGBB. [LuzZza]
- * Implemented main chat (global chat channel). Usage: @main <on|off>, @main <message>. [LuzZza]
- * Chasewalk players can now be hit in the same way a Cloaked player could.
- [Skotlex]
- * Added option mob_npc_event_type, read battle_athena.conf for details.
- [Skotlex]
-2005/12/24
- * Fixed @go, thanks to Persian [Vicious]
- * Updated @go command for new cities, done by Harbin [Vicious]
- * Added root user check and warning to non-Windows compiles. [Valaris]
- * Added a check to remove characters that would normally be left unremoved
- during shutdown because they just happened to be between maps. [Skotlex]
- * Fixed the production code always giving 1 item instead of the value they
- should (50/100/200 for Twilight Pharmacy skills) [Skotlex]
- * Corrected easy path searching algorithm failing for some cases (which
- incidentally seemed to be the reason skill_wall_check was broken) [Skotlex]
- * Fixed compile for TXT map-server. [Valaris]
- * Fixed stone curse's defense being checked versus int rather than mdef. [Skotlex]
- * Fixed firewall treating everyone as undead/fire-element. [Skotlex]
- * Added SQL read of cast_db. [Valaris]
- * Added SQL read of skill_require_db. [Valaris]
- * Added SQL read of skill_db. [Valaris]
- * Added setting use_new_sql_db to inter_athena.conf for development.
- Do not enable this setting, it will be merged into use_sql_db once all work is finished. [Valaris]
- * Added some work towards sqlizing the rest of the databases. [Valaris]
- * Changed @help2 to #help to display char commands. Cut @help in half
- @help2 has the other half. [Kayla]
-2005/12/23
- * Missed a change in txt login.c for bind_up. [Valaris]
- * Cleanup organization of clif.c and script.c.
- Please don't put extra functions beyond inits, try and organize a little. [Valaris]
- * Removed login_ip option from login_athena.conf as it is not used. [Valaris]
- * Fixed bind_ip option in login servers. [Valaris]
- * Fixed a bunch of terrible typos in chrif.c [Skotlex]
- * Fixed a terrible typo in the handling of broadcast messages which was
- causing the map server to send garbage packets to the char server.
- [Skotlex]
- * Added resistance (int + luk/3) to Stone Curse's equation [Skotlex]
- * Updated sql-files/item_db.sql to current txt version. [Skotlex]
- * Fog of Wall update... Blindess won't affect bosses, blindness ends as
- soon as you step out (players only) [Skotlex]
- * Implemented the Strip equipment effects on mobs. [Skotlex]
- * Now when Berserk ends, the char's HP goes to 100. [Skotlex]
- * LK's Concentration now gives +50 hit rather than +50% [Skotlex]
- * Inverted the handling of Individual/Shared item pickup rule for parties.
- [Skotlex]
- * Fixed the item ruling for parties not being correctly read from the save
- files. [Skotlex]
- * Now Star Gladiator uses 2nd Adv.Class Job EXP table (13th column) [Lupus]
- - In future there could be added the 14th EXP column, specially for Star Gladiator
-2005/12/22
- * Begin work on packet optimization .. not done yet [MouseJstr]
- * Finished work on @help/@help2. @help will no longer show # commands. @help2 shows
- them instead. [Kayla]
- * Fixed compile warnings in atcommand.c and map.c. Fixed compile error in script.c. [Valaris]
- * wedding_modifydisplay's default is now no (that's how it is on official)
- [Skotlex]
- * Some cleaning to skill_attack, also added target checking for splash
- attacks/groundbased skills [Skotlex]
- * Mobs will now stop walking if their target no longer exists (picked up
- items, for instance) [Skotlex]
- * Modified firewall to cause no damage delay when hitting undead
- characters. It may fix undead mobs warping when walking through the
- firewall. [Skotlex]
- * Added script command "clone" for cloning of players. See
- doc/script_commands.txt for further information. [Skotlex]
- * Added @waterlevel debug command to read/change the current's map
- water-level (command untested) [Skotlex]
- * Enabled names for forged weapon/created Potions by default [Lupus]
- - Old issues have beed solved long time ago, now items by TOP10 BS/ALCH gain their TOP10 bonuses
-2005/12/21
- * Now left_cardfix_to_right won't take effect when there's no weapon equipped
- on the right hand. [Skotlex]
- * Updated slave AI to support player masters as well (that is, you could
- have a non aggressive slave, and it will target any mobs the master
- targets) [Skotlex]
- * Added battle option skill_wall_check, when enabled, all ground skills
- will do a check for each cell to guarantee a straight path between the
- cells and the target tile. Should prevent AOE skills from hitting through
- walls. Due to the possible performance penalty this setting brings, it
- defaults to no currently. [Skotlex]
- * Default skill delay for skills with no delay is now the normal attack
- delay. [Skotlex]
- * Extremity Fist/Charge Attack will fail if the player can't move to the
- target. [Skotlex]
- * Prepare kick skills now only fail for Soul Linkers. [Skotlex]
- * Merged in Marquis007's work on SL_SKA/SL_SWOO [Skotlex]
- * All skills except Shield Boomerang get the weapon's refine bonus now.
- [Skotlex]
- * Taekwon Ready Stances will now fail if you are a Second Job of the
- Taekwon Tree (SL, SG) [Skotlex]
- * Another fix to item picking for party-share. Hopefully it works alright
- now (at least I believe it should be dupe-proof now) [Skotlex]
-2005/12/20
- * Updated water heights for some maps, thanks to [Lupus]
- - removed p_track02.gat from the maps list. Thanks to Justin84
- * Fixed produce_db items always failing... [Skotlex]
- * Hopefully fixed picking up items on a party-share type of party. [Skotlex]
- * Txt map servers will now send the whole list of online characters at
- UPDATE_INTERVAL (10 secs) rather than CHECK_INTERVAL (1 hour) so that the
- online.html file will be correctly updated. [Skotlex]
- * Fixed char_sql and char crash because of buffer overrun. [Lance]
- * Added a flag to tag non-weapon based skills so that they don't get the
- following bonuses: Star crumb damage, Mastery bonuses, Weapon Refine damage
- upgrades. Currently applies only to shield skills. [Skotlex]
- * Removed use of castle_id for guilds in char-sql server (use corresponding
- upgrade_svn* file). TXT servers haven't been touched yet because that
- would mess up the guild save files. [Skotlex]
- * Online list of characters will be sync'ed every 10 secs for TXT servers.
- [Skotlex]
- * Merged in Reddozen's work to get Twilight Pharmacy working. [Skotlex]
- - Create Deadly Poison Bottle and Holy Water are now both handled by the
- item producing code.
-2005/12/19
- * Fixed char servers not parsing correctly the online count packet (/who
- should work fine now) [Skotlex]
- * Fixed the Dodge walking speed bonus to Assassin. [Skotlex]
- * Added the new Garden City Hugel and Kiehl maps. [Valaris]
- * Corrected Kaupe/Kaizel so that you can cast it on self/family when
- not-linked, and anyone when linked. [Skotlex]
- * Fixed the mob damage log not getting the ID of the attacker registered...
- [Skotlex]
- * Added a new timer which updates only the count of characters on the
- current map server to the char server. Update interval is 10 secs.
- [Skotlex]
- * Updated status_clear_debuffs to clear many other types of ailments
- (Gospel should be clearing up most negative status changes now) [Skotlex]
- * Fixed exp calc type 0 (dmg/total dmg) being calculated as 0 always. [Skotlex]
- * Implemented the item pickup style for parties. [Skotlex]
- - Party share distributes items in round-robin fashion among players who
- are in the same map.
- - Pick-up Style shared is needed for anyone to be able to pick up the item
- bypassing the timers set for first/second/third sd. [Skotlex]
- * Optimized map server's online-listing update timers. [Skotlex]
- * Some updates to the online db in the char/char_sql servers, should help
- fix some memory leaks due to chars left tagged as 'online' even though
- that's incorrect. [Skotlex]
- * Added buildin_warpchar script function. Useful for warp one player from
- another player npc-session. Sytax: warpchar "map.gat",x,y,Char_ID; [LuzZza]
- * Now opening storage will fial if the guild storage is open and viceversa.
- [Skotlex]
- * Total damage a mob receives is now stored on it's own variable. Damage
- log implementation clean-up. [Skotlex]
-2005/12/18
- * Fixed Close Confine not affecting the caster. [Skotlex]
- * Fixed all skills except Extremity Fist not getting the weapon size
- modifiers [Skotlex]
- * Fixed Warp Portal checking for noteleport instead of nowarp mapflag
- (again?) [Skotlex]
- * Fixed baseJob working as baseClass (I hope it works fine now) [Skotlex]
- * Fixed Doridori bonus for Super Novices [Skotlex]
- * Updated new MOTD code so that it can compile on VC. [Valaris]
- * Fixed clone's dyes changing when they attack. [Valaris]
- * Declared pc_read_motd(void) in pc.h for the motd reload command. [Valaris]
- * Added @reloadmotd for reloading the motd.txt into memory. [Valaris]
- * motd.txt will now load into memory at startup instead of being read everytime a player logs in. [Valaris]
- - motd.txt can now have lines commented with "//" .
- - MOTD_LINE_SIZE is defined in pc.c, change this to increase maximum amount of lines allowed in motd.txt.
- - Default motd line maximum is 128.
- * Added a new script function 'setitemscript ItemID,"{ end; }"' [Lupus]
- - Very useful for events that give TEMP item bonuses for short time period 8) A Custom New Year Event NPC's coming soon.
-2005/12/17
- * Updated the svn eol-style properties to make merging between
- linux and windows easier when we use more complex branching
- system [4544: MouseJstr]
-2005/12/16
- * left_cardfix_to_right now also moves the ignore race/element defense
- bonuses (Ice Pick, Weed Killer, etc) [Skotlex]
- * Some fixes to the job_name functions (rearranging inside msg_athena.txt
- as well) [Skotlex]
- * Left card to right fix will now also apply to defense piercing effects
- (Ice Pick) [Skotlex]
- * Fixed char-converter being broken for a type mismatch [Foruken]
-2005/12/15
- * Fixed clone skills again. This time ground-based skills are working, and
- support skills have a re-cast delay of half the skill's actual effect. [Skotlex]
- * Fixed clone commands sometimes spawning the clone on a non-walkable tile
- (which in turn sends the clone to a random map location) [Skotlex]
- * Added debug information to the guild cache. Total number of guilds in the
- db will be printed now (as long as the save log is active) [Skotlex]
- * Updated SG_HATE to pick the specific class (Select a Monk, and the bonus
- is against monks only, not Champions/Acolytes/Baby Monks) [Skotlex]
- * Removed hardcoded table names in login_sql/login.c [Foruken]
- * Some cleaning regarding the job tree skill-raising restrictions code.
- [Skotlex]
- * Optimized/cleaned up the job_name function, job names are now acquired
- from msg_athena.txt. [Skotlex]
- * Fixed race defense bonus against Boss/Nonboss checking versus the target
- instead of the attacker (should fix Alice Card) [Skotlex]
- * Some cleaning in clif.c [Skotlex]
-2005/12/14
- * Fixed 'dead_branch_active' option. [Skotlex]
- * Optimized use of weather effects, or should I say, no use.
- Also re-added clif_clearweather to some of the weather effects, when they are turned off.
- Why those were removed are beyond me.. [Valaris]
- * Temporarily changed the walk speed during Charge Attack and Extremity
- Fist to simulate a faster 'zoom' to the target (somewhat untested yet)
- [Skotlex]
- * Corrected SL_HIGH so that the total of each stat is always 50...
- [Skotlex]
- * Optimized graffiti display packets (what was I thinking?) [Valaris]
- * Corrected a statement in guild.c (== to =) in nulling out the guild cache. [Valaris]
- * Implemented a mini cache for guilds/parties in the map server. Looking up
- the same guild/party twice or more should result in instant seek times
- until a different one is looked up. [Skotlex]
- * Fixed saving account variables [Komurka]
- * Fixed SL_KAIZEL not starting the proper effect. [Skotlex]
- * Merged Reddozen's work of SL_KAUPE [Skotlex]
- * Updated checkweight() script command to return false when the player has
- inventory full. [Skotlex]
- * Soullink check for SG_FUSION [Komurka]
-2005/12/13
- * Fixed @slaveclone not attacking enemies. [Skotlex]
- * Some more cleaning to the clone skills, proper support for Heal,
- Resurrection, Double Attack, Triple Blows. [Skotlex]
- * Updates/fixes/corrections to battle check target so that mobs with
- special AI can fight mobs without it even if the mob doesn't has a human
- master. Also updated it so that mobs with no special AI are all friends by
- default. [Skotlex]
- * Clone skill fixes, support/self skills are now triggering (never
- triggered before), adjusted some of the skill usage rates. [Skotlex]
- * Dyes will now work correctly on cloned or mob_avail class monsters.
- save_clothcolor must be enable in battle_athena.conf. [Valaris]
- * Added carts, falcons and pecos to clone and mob_avail class monster spawns. [Valaris]
- * Likely fixed the @spawn names issue. [Skotlex]
- * Fixed @*clone commands not resolving properly the target char. [Skotlex]
- * Implemented the SL_ROGUE bonus to potions. They heal +100% more rather
- than 50% (potions from ranking Alchemists, that is) [Skotlex]
- * Merged in Reddozen's work with SL_KAIZEL [Skotlex]
- * Added the check to prevent KA skills from being usable until you are Soul
- Linked. [Skotlex]
- * Enabled clif_parse_Taekwon (Why was taekwon parsed as clif_parse_Alchemist?) [Vicious]
- * Moved the base attack code into it's own function to properly implement
- the magnum break's elemental damage bonus (watch out for bugs as the code
- was proof-read, but that usually doesn't says quite enough when it comes to
- code). [Skotlex]
- * Merged in Reddozen's work for SL_WIZARD [Skotlex]
- * Updated clone command to allow attaching the clone to the invoking player
- as a slave. @clone creates a friendly clone that attacks mobs. @slaveclone
- makes a clone that follows the creator (it's a slave), @evilclone is the
- stock clone as a mob). Also fixed min/max damage of clones. [Skotlex]
- * Added one extra tile of range to melee mobs in mob_attack, should fix
- mobs not attacking when they are range+1 tile from you, yet they refuse to
- move in that final tile. [Skotlex]
- * Corrected mob ai not moving closer to player if there's a distance of 2
- or less between them (which would do no good if the mob's range is just 1) [Skotlex]
- * Fixed SG_FRIEND - should work now [Komurka]
- * Realtered global_reg value size to 256. [Lance]
- * Adjusted pointers location for packets for new global_reg value (it's wrong + I adjusted the size) to 256 + 32 = 288 [Lance]
- * Improved variable scope for scripts to accept all string variables. [Lance]
- * Altered map, char and login server to correctly use global_reg [Lance]
- * do_sendrecv merges from Freya [Lance]
- = Requires recheck on packets again to see if I missed any pointer alterations =
- * Improved @evilclone to accept character IDs [Lance]
- * Corrected partywarp/guildwarp to correctly take into account nowarp/nowarpto mapflags. [Skotlex]
- * Added a few custom scripts due to high demand. [Lance]
- * Added monster museum. Adapted from Prometheus. [Lance]
- * Corrected OnTouch to use exname instead of name to prevent conflicts. [Lance]
-2005/12/12
- * added manner_system battle conf variable (now you can have PK server without manner system - which is unfinished ;/) [Komurka]
- - some corrections in SI_ data (night uses soullink effect)
- - changed global_reg value from int to char
- added two new functions (pc_readglobalreg_str and pc_setglobalreg_str)
- SG_FEEL now saves maps to global_reg
- I've 'marked' all changes that SHOULD be checked with '//komurka'
- - SG_FUSION hp penalty changed from 2% to 0.5%
- - SG_SUN_COMFORT now increase VIT DEF
- - implemented SG_FRIEND skill - this is the last SG skill - now it's a good time for bug reports :]
- * Updated the max number of ingredients of produce_db to 12. [Skotelx]
- * Updated clone code to also copy the skills from the source player. [Skotlex]
- * Added Reddozen's implementation of SL_SKE and SL_MONK (sp recovery, Combo
- Finisher splash damage, SP regen while in Fury) [Skotlex]
- * Some reorganization of the Star Gladiator map-based skills. [Skotlex]
- * Fixed @spawn/@monster atcommands 'freezing' server when used. [Skotlex]
- * Fixed ground-based skills having their range-check messed up... [Skotlex]
- * Corrected melee-ranged mobs failing the range check even if they were
- standing next to you. [Skotlex]
- * Added all duel-commands messages into msg_athena.conf. Commented out
- code of drawing PVP-circle in duel because it not hiding when player use hide. [LuzZza]
- * Removed @monster2, merged the code of atcommand_spawn/atcommand_monster
- as suggested by Flaviojs. [Skotlex]
- * Removed some unused entries in msg_athena.txt [Skotlex]
- * When there are unused stack sections (invoked functions and ignored
- return values) the unused stack section is free'd. This is still notified
- when the etc_log is active. [Skotlex]
- * Removed the TURBO code from socket.c as requested by MouseJstr. [Skotlex]
- - It was actually slower than the normal code.
- * Updated warp portal and script commands partywarp/guildwarp to take into
- consideration mapflag nowarp as restriction rather than noteleport.
- [Skotlex]
- * Applied dontBR's update to his configure script [Kayla]
- * Changed the bonus on Sonic blow.(It was giving 1500% instead of 1600%) [Vicious]
- * Updated gettimetick() to use flag 2 and return System's tick, thanks to
- Kyoki [Skotlex]
- * Removed the mismatch stack error message caused by scripts where the
- returning value of a function was ignored. [Skotlex]
- * Corrected the Spirit of Assassin damage bonus of Sonic Blows. [Skotlex]
- * Corrected BSS check versus undead, checking for partners on the Priest's
- exact left and right, and sending partner's SP to negative. [Skotlex]
- * Another Paladin's Gospel effect ends when you cast it (should fix Gospel
- in Gospel bugs). Also, now Gospel only blocks usage of items of type 0
- (healing). [Skotlex]
- * Corrected berserk Pitcher displaying 0 heal. [Skotlex]
- * Added Close Confine's flee bonus. [Skotlex]
- * Corrected Slow Poison. Can be used when not poisoned, will not "pause"
- poison's timer. [Skotlex]
- * Implemented SG_FUSION skill [Komurka]
- Don't ask me why in newer exe U see flying ... Santa ... -.-
- * Updated the distance() function definition with one which uses a much
- better approximation [Skotlex]
- * Updated sql-files/ mob_db.sql & item_db.sql to latest. [Skotlex]
- * Added @autotrade/@at and @away/@aw messages into msg_athena.conf (you can customize them) [Lupus]
- * Updated default hardcoded GMlevel values of some @ATCommands according atcommand_athena.conf [Lupus]
- and removed doubles of some commands, thanks to Rideword
-2005/12/11
- * Corrected guild deletion in SQL (both from /breakguild and guild master character deletion). [Valaris]
- * Added @evilclone commands. Syntax is @evilclone <playername>, [Valaris]
- It will spawn an aggresive clone of the given player.
- By default it will use mob id ranges 9001-10000, this range is #defined in mob.h.
- * Fixed VS compile error in mob_clone_spawn. [Valaris]
-2005/12/10
- * Added core player cloning code. Just need to create some commands. [Valaris]
- * Redid the @help2 (char commands). [Kayla]
- * Added jobname retrieving script function getJobName. [Lance]
-2005/12/09
- * Changed default GM level for @setbattleflag to 99. [Valaris]
- * Implemented the SL_SUPERNOVICE bonus to wear all heagears/various weapons
- at high base levels. [Skotlex]
- * Implemented SL_ROGUE bonuses: can't be dispelled, Chase Walk's str bonus
- lasts 10x longer. [Skotlex]
- * OneHand Quicken now dispels aspd potion effects. [Skotlex]
- * Updated SL_STIN/SL_STUN to do miserable damage if the target's size is
- 'incorrect'. [Skotlex]
- * Updated @disguise so the max npc id you can use is 1000 (1001 is already
- the first mob, Scorpion) [Skotlex]
- * Fixed a possible infinite loop in pc_calc_skilltree when receiving
- additional skills when Soul Linked. [Skotlex]
- * Added the Taekwon bonus that gives you triple Max HP/SP when you are a
- top 10 ranker and have base level 90+ [Skotlex]
- * Added support for skill_db pl == -2. These skills don't take the element
- of the weapon, but will take the element of any enchantment elemental
- change (so the element used is neutral unless you are enchanted with
- Fire/Wind/etc) [Skotlex]
- * Coded in SL_STIN, SL_STUN and SL_SMA. [Skotlex]
- * Should have fixed the crash with raw_time in char/char.c [Skotlex]
- * Pressure can now be cast-break. [Skotlex]
- * Likely fixed the client crash when hating a class rather than mob. [Skotlex]
- * Removed @help2, note to self: do not commit at 4 am. Will redo later. [Kayla]
- * Added @help2. @help did not fit in the screen. @help2 currently contains
- just the char (#) commands. [Kayla]
- * MAPREGSQL disabled (experimental) in VC7. To enable, define MAPREGSQL in preprocessor. [Lance]
-
-2005/12/08
- * Changed default value of start_zeny to 0 to prevent packet exploits.
- Also is 0z on offical servers. [Kayla]
- * Fixed bug with objects (npcs, monsters, players, etc) not appearing when using @refresh. [Valaris]
- * Updated effects for food production thx to Poki#3 [Komurka]
- * SG_STAR_BLESS now gives 20%*skill lvl additional exp [Komurka]
- * Modified clif_blown to use the clif_slide packet instead of clif_fixpos,
- as Komurka tested it and it appears to be handled better by current
- clients. [Skotlex]
- * Added two new battle_athena.conf options:
- duel_allow_teleport (def: no) and duel_autoleave_when_die (def: yes) [LuzZza]
- * Small fix in allskill [Komurka]
- * Updated Gloria Domini to bypass battle_calc_damage (misc damage
- reductions) [Skotlex]
- * Fixed a typo in pid.c, thanks to akusarujin [celest]
- * Exploit fix in SG_FEEL [Komurka]
- * Updated TK_MISSION to pick a random mob in the same way a dead branch
- does. [Skotlex]
- * Corrected SG_DEVIL giving the ASPD bonus below level 50. Only works at
- max level... [Skotlex]
- * Some cleaning to pc_calc_skilltree. Also updated it so that if you don't
- use player_skillfree, you can't have ANY skill if you don't have NV_BASIC at
- 9 (only exception are quest skills). [Skotlex]
- * Implemented HT_POWER/Beast Strafing. [Skotlex]
- - The damage equation is unknown.. for now it's the same as Double Strafe
- except the skill modifier is +10%*str
- - Currently the Combo is triggered 100% of Double Strafes done on beast
- monsters.
- * Added Reddozen's work for Hunter's Beast bane spirit bonus. [Skotlex]
- * Corrected the drop delay for mobs when killed by magic to be 500ms (will
- only work if killed by a player) [Skotlex]
- * Updated SG skills (kRO Patch - 11/29/05) [Komurka]
- * Enabled a few maps needed for the new novice training grounds, sorry I forgot to [MasterOfMuppets]
- * Removed duplicate maps in maps_athena.conf. Thanks for the report Dr. Evil [Kayla]
-2005/12/07
- * Pressure will always pull-off now after it has began casting. [Skotlex]
- * Implemented Close Confine. [Skotlex]
- * Change all 0x20e packets (18->26; 22->30) [Komurka]
- Also added job_name(mob_id) in clif_hate_mob
- (but it crashes client when U try to use SG_HATE skill on player ><)
- * Fixed compile error in status.c. Check your work skot <3 [Kayla & MoM]
- * Updated socket.c by adding a lots error reporting for functions that
- previously were assumed to not fail. May help figure out what's going on
- with the win32 builds... [Skotlex]
- * Reviewed and cleaned up a bit the latest SG additions from Komurka. [Skotlex]
- - My skill desc says that SG_DEVIL does not makes you blind until you reach
- max job level, so I implemented that. Report if this is incorrect.
- - SG_*_WARM skills should be working from what I read there.
- * Modified a bit the TK_MISSION packet, GUESSING where the progress of the
- current mission should go within said packet... [Skotlex]
- * Implemented TK_MISSION. [Skotlex]
- * Added more SG skills (Comfort, Warmth, Demon, Knowledge) [Komurka]
- All of them should be checked by someone ^^;;
- - SG_xx_WARM for now only shows cool red effect :> There is more code but for now it doesn't work
- * Added new Geffen Field maps [Harbin]
- * Disabled Atcommand Nuke (It was commented, not disabled) [Harbin]
- * Added skip_teleport_lv1_menu option to Battle_Athena. Allows players to cast Teleport level 1 without menu. [Harbin]
- * Merged in Reddozen's current Soul Linker work. [Skotlex]
- - Berserk Pitcher should be working now.
- - Bard/Dancer walk bonus when dancing/singing while soul-linked.
- - Partial work on Twilight Pharmacy.
- - proper skill effect
- * Fixed One Hand quicken doing nothing. [Skotlex]
- * skill_get_name now returns "UNKNOWN_SKILL" instead of null (should fix
- some crashes when using it on skills with no defined name) [Skotlex]
- * When weapon_delay_attack is enabled, items should drop inmediately after
- mobs are killed rather than 500ms afterwards. [Skotlex]
- * Added Exception Handling plugin to be used for native Win32 builds [celest]
- - crashes will be logged in <server type>.stackdump along with file name and line numbers
- - To activate, enable 'exchndl' in plugin_athena.conf
-
- Public Service Message - Crash reports can be VERY VERY helpful, so please enable the
- plugins if you can ('exchndl' for Win32, 'sig' for cygwin and linux) and send in any
- reports you might get! We all want eA to be stable, ne? ^^
-
- * Some compile error fixes for MinGW, FreeBSD and plugins [celest]
- * Updated Makefile to set platform defines for FreeBSD [celest]
- * Updated Makefile to auto-detect MinGW and include src/mysql [celest]
- * Debug logging flag for logging output messages (only works well with native Win32) :D (Not enabled by default) [Lance]
- * joshuali's new vcproj with debug mode correctly set up. [Lance]
- * Fixed compile errors for Valaris's commit on date.h [Lance]
- * Added updated vcproj for native VC8 win32 for date.h/c support. [Lance]
- * Removed extra returns in date.h. [Lance]
- * Probably fixed warnings in unzip.c [Lance]
-2005/12/06
- * Updated item 12132 for the Xmas suit effect in item_db.sql. [Valaris]
- * Implemented Xmas Suit: [Valaris]
- -Added status change state SC_XMAS, and added it to const.txt.
- -Cannot attack or use skills while in the Xmas state.
- -Will save if you logout.
- -"sc_start SC_XMAS,600000,0" added to item 12132 (using item will give you xmas suit for 10 minutes).
- -Added xmas_ignorepalette option to battle_athena.conf.
- * Fixed script error in Garm's Claw item causing an error. [Valaris]
- * Added a missing ; to Skotlex's Previous SG skill editions that caused compile errors. [Valaris]
- * Added JOB_GUNSLINGER(24), JOB_NINJA(25), and JOB_XMAS(26) to map.h enum list and const.txt. [Valaris]
- * Added SC_SCRESIST to const.txt. [Valaris]
- * Applied Komurka's Star Gladiator patch. [Skotlex]
- - The following skills are now working: SG_FEEL, SG_HATE, SG_SUN_ANGER,
- SG_MOON_ANGER, SG_STAR_ANGER, SG_SUN_BLESS, SG_MOON_BLESS, SG_STAR_BLESS
- - The designated maps cannot be stored currently (cannot save character
- string variables) and is pending on a script update to enable saving of
- said type of variables.
- * Added @away command. [LuzZza]
- * Mostly fixed intravision making everyone see hidden/cloacked characters.
- (the actual option value to see just the player's shadow is currently
- unknown) [Skotlex]
- * Updated Gospel [Skotlex]
- - It should clear all buffs/debuffs now.
- - Party-mates within range cannot use items.
- * Implemented the SL_BARDDANCER bonus that enables the caster to be buffed
- by their own song/dance/encore. [Skotlex]
- * Completed Sight Thrasher (the option value is still missing, though.
- Temporarily uses the one of Sight) [Skotlex]
- * Corrected possible exp exploits in jA's exp calc method. [Skotlex]
- * Corrected Spirit Skills showing up in all class trees. [Skotlex]
- * Invoking @reloadscript now also invokes the OnInit event after loading. [Skotlex]
- * Expanded Item Groups list from 20 to 32 item groups [Lupus]
- * Fixed healing experience bug. Now only healing another players gives experience. [Harbin]
-2005/12/05
- * Hopefully fixed gm_all_skill.... [Skotlex]
- * Modified a bit the player attack code to give an extra range cell when
- the target is moving. [Skotlex]
- * Added skip_teleport_lv1_menu battle_athena option. It give a possibility to
- disable (skip) Teleport Lv1 menu, that have only two lines `Random` and `Cancel`.
- Of course, by default this option have `no` (don't skip) value. [LuzZza]
- * Added FD_SETSIZE 4096 predefination to VC++ Project Files. Should fix 60 player limit bug with native compilations. [Harbin]
- * Fixed char crash (I hope) when checking for two parents + baby in a party
- with more than 3 characters, but from which only 3 were online at a time. [Skotlex]
- * Merged in Reddozen's work on SL_BARDDANCER and cleaned up a bit the
- Spirit Skills code when calculating the skill tree. [Skotlex]
- * Updated mob ai so that support/aggressive mobs can't 'see' a player until
- there's a direct line of sight between them. [Skotlex]
- * Updated monster_ai&1 so that when not set mob-chase type is Aegis-like
- (mobs will not change walk target tiles mid-walk) [Skotlex]
- * Added battle_athena.conf option mobs_level_up_exp_rate to set the extra
- exp rate a leveled up monsters gives. [Valaris]
- * Added a custom X-Mas quest *Sign Your Items* [Lupus]
- * Applied Harbin's patch to fix Arrow Shower + Traps. Someone test it out.
- [Skotlex]
- * Another fix to socket.c to enable TURBO mode to work on win32. [Skotlex]
- * Fixed the combo status not ending after using TK_TURNKICK [Skotlex]
- * Overflowed pointer fix in socket.c [Skotlex]
- * Added 'Einbech' into @go command (u have to type at least 5 letters) [Lupus]
- * More detailed error messages for missing '"'s in scripts. [Lance]
-2005/12/04
- * Removed mail server switch from battle_athena.conf and added
- full mail server configuration to inter_athena.conf. [Valaris]
- * Fixed too big VVS damage of TOP10 BS weapons [Lupus]
-2005/12/03
- * Fixed up TK Sprint (TK_RUN) skill: [Valaris]
- -Disabled movement during skill use.
- -Correct moves player server-side.
- -Stops without sp use if skill is used during running.
- -Server will not save status if player logs out.
- * Some cleaning of socket.c to see if TURBO will now work on Windows, it
- may also fix the select() problems on that platform as well. [Skotlex]
- * Fixex "gm_skill_all" crashing the server from generating huge packets (or
- so I hope) [Skotlex]
-2005/12/02
- * Gave the Spirit Status Change a custom effect for now. [Skotlex]
- * Merged in Reddozen's work for SL_HIGH (Spirit of Rebirth) [Skotlex]
- * The Bonus skills acquired from being Soul Linked should now show up in
- the skill tree. [Skotlex]
- * Merged Reddozen's work of One-Hand Quicken and Adrenaline Rush 2. [Skotlex]
- * Fixed Axe-Kick never triggering. [Skotlex]
- * Slaves walk once again. [Skotlex]
- * enable_items now also enables equipment stuff. [Skotlex]
- * The attack motion in packets for ground-based skills is now 0 (it may
- help somewhat with current firewall issues). [Skotlex]
- * Added char-server option "save_log", when disabled, the char server will
- stop printing info messages whenever something is loaded/saved. [Skotlex]
- * Disabled random-walking for slaves [Skotlex]
- * Added script commands enable_items/disable_items [Skotlex]
- * Likely fixed the mob-skill target type "master" [Skotlex]
- * Added target type "master" to the mobskill_db [Skotlex]
- * Modified NPC_RUN to allow the caster to run away from the target [Skotlex]
- * Implemented SL_SAGE (Soul Linker Sage buff for auto-cast bolts) [Skotlex]
- * Updated char-sql guild saving so that instead of saving ALL guilds when
- the time comes, the save interval is splitted on time-slots (based on guild
- count in memory) and a guild is saved per time-slot (just like the map
- server saves characters). [Skotlex]
- * Fixed client crashes with using baby and advanced player classes as pets. [Valaris]
- * Added missing ban_hack_trade option to battle_athena.conf. [Valaris]
- * Hopefully fixed Counter Kick. [Skotlex]
- * Uncommented and corrected the Soul Linker Monk buff (SP cost reduction
- for monk combos) [Skotlex]
- * Added a check in skills so that skills that are used on yourself, but had
- it's target auto-selected cannot be used on non-enemies if it's nk is
- different from 1 (1 = No damage skill) [Skotlex]
- * Various cleanups to the char-sql server to prevent corner-case crashes
- from queries that return no rows. [Skotlex]
- * Massive Taekwon Boy skills related code cleanup. [Skotlex]
- - Flying Side kick and Turn Kick should be fully working now, too.
- * Cleaned up and reorganized the SC_ data listing. Added sc's for food
- related bonuses: SC_HITFood, SC_FLEEFood, SC_BAtkFood, SC_WAtkFood,
- SC_MAtkFood. [Skotlex]
- - Some of the saved sc data will be wrong, so wipe the table/file if you
- want to play it safe.
- * Some corrects in duel code. [LuzZza]
- * Sonic Blow and Shield Boomerang's after cast delay is now properly
- adjusted by the Soul Link skills. [Skotlex]
- * Party even share will be now broken after a base level reset. [Skotlex]
- * Merged in Reddozen's Soul Linker current skills work. [Skotlex]
- * Added countitem2(itemID,....) script function. [Lupus]
- * Added axtoi script function that converts hex strings to integers. [Lance]
- * Fixed incorrect time (that leads to crashes) in login server. [Lance]
-2005/12/01
- * Moved KN_CHARGEATK code to merge it with Extremity Fist. Skill damage
- modifier is currently set to +15% per cell (need actual value here) [Skotlex]
- * Fixed client crash when logging in with Baby Knights and Crusaders riding Pecos. [Valaris]
- * Implemented Ki Explosion. [Skotlex]
- * Fixed client crashes with using baby and advanced player classes as monsters. [Valaris]
- Make sure to use Item ID for weapons and shields in mob_avail.txt for player monsters and not View ID.
- Updated Valaris and MC Cameri mobs in item_avail.txt to use Item IDs.
- * Fixed cutting Castle Name (was 14 instead of 24) [Lupus]
- * Corrected Grimtooth counting a short-range skill when it's actually
- ranged. [Skotlex]
- * Corrected Venom Splasher's splash range, and the splash damage is now
- divided by number of targets (sort of, skill % dmg is adjusted according
- number of targets) [Skotlex]
- * Tarot Card of Fate won't break equipment now if equip_skill_break_rate is
- 0. [Skotlex]
- * Improvements and optimizations to the online db management in the char
- txt/sql servers. [Skotlex]
- * Updated the guild cache (char sql) to have it load/unload characters
- whenever they are updated in the char online_db (previously they were only
- updated on normal char-select/char-quit when there were more cases where a
- char is set online/offline) [Skotlex]
- * Now when the guild is not found in the cache it will be loaded from the
- sql db first before failing. [Skotlex]
- * Fixed equip_skill_break_rate equation being messed up for Acid Demonstration. [Skotlex]
- * Fixed Aura Blade adding damage to Spiral Pierce (it shouldn't) [Skotlex]
- * Script function getnameditem now sets flag 254 (created) instead of 255 (forged) [Lupus]
- To prevent ADDITIONAL Blacksmith FAME TOP10 bonuses, applied to signed but not forged weapons
- e.g. You have a custom quest for rare weapons. You tag items with players name (using getnameditem command).
- if a TOP10 BS get an Infiltrator.. then it used to give extra atk bonus 8)
-2005/11/30
- * Updated item_db.sql to latest. [Skotlex]
- * Updated mob_db.sql to latest. [Skotlex]
- * Updated Gospel to force the removal of the ground-effect when the status
- change ends. [Skotlex]
- * Made Snatch/Intimidate work on Guild maps (I have read around this is how
- it is) [Skotlex]
- * Added the auction maps to maps_athena.conf [MasterOfMuppets]
- * When players are hit while moving, they should now move one last cell
- in the same direction they were walking when interrupted. [Skotlex]
- * Walk delay won't be applied now unless the attack deals damage... [Skotlex]
- * Major reorganization of player variables and bonuses. If something broke,
- report it up. Otherwise, struct map_session_data should look quite a bit
- more clean now. [Skotlex]
- * Fixed duel bug when you can't cast some skills on yourself. [LuzZza]
- * Fixed (I think) pets losing the "rename flag" when you sent them back to
- egg. [Skotlex]
- * Added a index check in the equip packet, should fix crashes from invalid
- packets. [Skotlex]
- * Fixed a horrible bug that was making the walk delay not work for sure x.x
- [Skotlex]
-2005/11/29
- * Fixed race exp bonuses. [Skotlex]
- * Fixed ## account variable saving disconnecting the char-login servers. [Skotlex]
- * Updated the way multi-hit skills add overrefine/star crumb/spirit sphere
- damage so that the total bonus is multiplied by the total number of this.
- [Skotlex]
- * Fixed the config variables being "lost" on startup. [Skotlex]
- * Fixed Restore requiring Regeneration lv2 [Skotlex]
- * Fixed the spirit sphere bonus not applying to Throw Spirit Sphere. [Skotlex]
- * Rewrote and cleaned up duel code. Formed independent duel_xxx functions.
- I suggest to place this functions in duel.c/duel.h. New features: [LuzZza]
- - Now when you in duel, you can't attack anything out of your duel
- (mobs, other players etc...);
- - Now you can't take part in duel more often than it set in battle_athena.
- Default delay is 60 minutes.
- - New battle_athena.conf options: duel_allow_pvp - allow/disallow duel
- on pvp-maps; duel_allow_gvg - allow/disallow duel on gvg-maps;
- duel_time_interval - delay between using duel in minutes.
- * Updated damage formula for Spiral Pierce. [Skotlex]
- * Fixed speed change being lost when speed is increased/decreased while
- walking with Free-cast. [Skotlex]
- * Fixed pets being renameable after turning them back into eggs. [Skotlex]
- * Reverted the guild data position in the mob/npc packets, should restore
- the emblems in flags. [Skotlex]
- * Corrected battle_check_target Guild checks returning true for non-guild,
- party'ed characters and viceversa. [Skotlex]
-2005/11/28
- * Added dontBR's experimental configure script. It's still in alpha stage,
- so use with caution! [Skotlex]
- * Fixed a pair of exp exploits possible with to Rich Man Kim and
- race-add-exp card bonuses. [Skotlex]
- * Updated behaviour of skillrange_from_weapon. If set, those skills with
- negative range use the weapon's range. If not set, then the skill range
- used is the absolute value of the range specified in the skill_db. [Skotlex]
- * Small cleanup of the color broadcast packet using data provided by Master
- of Muppets. It should hopefully fix the font-size on said colored messages.
- [Skotlex]
- * Fixed the setting of the guild id and guild emblem in packets 0x7b and
- 0x78 for mobs/npcs (this is assuming the position is correct when filling
- these same packets for players) [Skotlex]
- * Added battle_config option skillrange_from_weapon which, when set, allows
- weapon based, target-selected, offensive skills to take the equipped
- weapon's range instead of the range defined in the skill_db. [Skotlex]
- * WARNING/ACHTUNG! Update all your NPCs ASAP. Massive NPC fix's out. [Lupus]
- * Updated monster_ai&8 so that mobs scatter as soon as they lose their
- target. Use this setting for an effective counter measure to Grimtooth
- mass-mob training. [Skotlex]
- * Added pc_damage_walk_delay_rate to separate the walk delay adjustment of
- players from that of mobs. The adjustment for players is 20% while for mobs
- is 100%, pending further adjustments. [Skotlex]
- * Added the weapon upgrade damage bonus of Spiral Pierce [Skotlex]
- * Removed the mob_stop_walking code from mob_damage as it should be invoked
- on battle_walkdelay (the mob walk delay issue will likely need it's own
- config option) [Skotlex]
- * Added joshuali's new Visual Studio files. [Lance]
- * Novice Warp Portal fixes from jAthena. [Lance]
- * Final warning elimination in plugins.c (most of them are gone with warning level set to 1). [Lance]
- * Fixed typo in msg_athena.conf and 'users with autoloot turned on will not have their rare drops announced.'. Thanks to Kaseki.
- * Mob should stop walking when hit if not enduring. Thanks to Playtester. [Lance]
- * Included pcre.dll and libmysql.dll from joshuali. [Lance]
- * Eliminated Level 3 warnings. Setting compile warnings to Level 3. (Level 4 just kills eAthena XD) [Lance]
-2005/11/27
- * Fixed an overflow pointer bug in the gvg eliminate timer. [Skotlex]
- * Updated the damage code if Spiral Pierce, Shield Chain and Shield
- boomerang to be closer to official. [Skotlex]
- * Fixed a crash when setting all chars offline in the char-sql server. Also
- fixed that delete_timer mismatch on shutdown [Skotlex]
- * Autospells now won't trigger if the range between the source and the
- target is not satisfied. [Skotlex]
-2005/11/26
- * Added bonus2 bAddSkillBlown for adding a custom knockback value to a
- skill. Note that this knockback bonus is ADDED to whatever the default
- knockback of the skill is. [Skotlex]
- * Fixed Soul Linker skills showing up on the tree for leveling up. [Skotlex]
- * Probably fixed the crash in inter_guild_CharOffline [Skotlex]
- * Modified the skill get range routine to correctly account for the attack
- range and the AC_VULTURE range bonus where needed. [Skotlex]
- * Fixed alchemists Fame Points bug: It were giving 1 fame point [Lupus]
- on making 4 Condensed Potions in row, instead of 3, etc. Now tested ^_-
- * Some restructuring and cleaning up in map loading to make it easier for
- future plans (like removing Grfio) [celest]
- - split map loading into separate sources properly
- - added map server will display a list of enabled map sources on startup
- - added maps will be auto-imported into the map cache if it's loaded with
- AFM, AF2, or any other source
- The server looks for maps in this descending order: the map cache, AFM maps,
- AF2 maps, and finally GAT files from the GRF (slowest); so, if you enable map
- caching it should be a liiiittle bit faster then before ^^
-2005/11/25
- * Uploaded fixes to int_guild, tested and working safely. [Kevin]
- * Added @showzeny @ command. [Skotlex]
- * Some code cleanup to make AutoBerserk work the way it was intended to
- (skill toggles "auto-berserk" state on/off, if on, you automatically get
- Provoked when under 25%HP) [Skotlex]
- * Fixed Auto-Berserk auto-ending after a minute. [Skotlex]
- * Added a fix to mob skills to prevent them from being checked too
- frequently during battle (which was sort of bumping up their rate to double
- or more from what the skill db would state) [Skotlex]
- * Added cleaning up the fifo before sending the guild information (since
- the packet is big, the fifo should be cleared to avoid overflow problems)
- [Skotlex]
- * Added monster_ai&8, when set monsters stop walking as soon as they lose
- their current target [Skotlex]
- * Reflect Sword again reflects damage versus players. [Skotlex]
- * Corrections to the skill code so only Heaven's Drive may damage traps. [Skotlex]
- * Reverted the mob random walk delay after unlocking a target to 3~6 secs. [Skotlex]
- * Added pow, sqrt and distance to scripting commands. [Lance]
- * Removed players with 0 Fame Points from Blacksmith/Alchem/Taekwon TOP10 lists [Lupus]
- * Should fix night glowing bug. [Lance]
- * Added setd and getd variable retrieving and setting with dynamic names. [Lance]
- * Added petstat command as requested by Dubby. [Lance]
-2005/11/24
- * Fixed a small bug in the guild search by name routine. Should fix the
- crash on new guild creation. [Skotlex]
- * Added debug information in case the guild isn't found in the cache when
- it should be there. This should help fix any problems the guild cache
- might have (eg: for some function that may take effect on a guild which
- has no members online) [Skotlex]
- * Finished cleaning up and merging the guild cache withthe guild timers
- behaviour. It should be mostly safe to update now. [Skotlex]
- * Reverted the sql save behaviour. [Skotlex]
- - Now guilds timers and cache are both into effect, this requires a bit
- more of cleaning to be considered done.
- * Various things I made but already forgot xD [DracoRPG]
- * Fixed and updated damage bonus for forged weapons: VVVS is +40 (was previously +50
- for the right hand...) and "famous maker bonus" gives a no-miss +10 dmg, same as
- 2 additional Star Crumbs. [DracoRPG]
- * Added or updated several Taekwon skills [DracoRPG]
- - Jump Kick uses clif_slide to the target's exact pos , waiting for capture/video
- - Taekwon ranking is now supported by the fame system, but there's no way to gain
- points atm (Taekwon Mission has no effect), infinite kick combo should be OK
- - 4 basic kicks updated, you now stop attacking when a stance triggers, and have 2
- seconds to hit the button before attacking again
- - Run uses SC_SPORT to increase your STR and affect the way Break Fall works
- - Break Fall dodges ranged magic/weapon attacks, as well as melee weapon ones
- when SC_SPORT is active
- * Made Sword Reject / Counter Instinct reflect damage only against monsters (not
- 100% sure about it, but let's say 90%... iRO site says it, although it isn't
- the best source ever) [DracoRPG]
- * Made Spiral Pierce use SC_STOP instead of setting canwalk_tick, some other such things
- need to be reviewed [DracoRPG]
- * Fixed Pneuma. [Skotlex]
- * Fixed dead mobs reappearing on the map. [Skotlex]
- * Cleaned up the duel code in battle_check_target. [Skotlex]
- * Added config option summons_inherit_effects, defaults to yes, check
- battle_athena.conf for further details. [Skotlex]
- * Updated duel [LuzZza]
- - Now "@duel <Num>" may be used for indication max players limit of duel.
- - Now "@duel <Nick>" creating duel for two players and automatically send invitation to Nick.
- * Added a new script function: getequipcardid(equipSlot,CardSlot) [Lupus]
- Returns Card ID or just a value from your EQUIPPED item
- Useful to check equipped items PROPERTY, STRONG value, Author ID, etc
- Check npc\sample\getequipcardid.txt and read script.c comment ^_-
-2005/11/23
- * Fixed the crash on guild creation in new guild cache. [Kevin]
- * Implemented duel organizing commands: @duel, @invite, @accept, @reject, @leave. [LuzZza]
- * Made the walk-delay a timer, so that it triggers after the actual attack
- motion of the src. [Skotlex]
- * Added back the combo damage delay config, now renamed to
- multihit_delay, and set to the default of 230ms it had before. [Skotlex]
- * Added displaying file which caused an error on incorrect mob lines.
- [Skotlex]
- * Small memory corrections to sql castle saving/loading, mostly Lance's
- work. [Skotlex]
- * Updated the walk delay routine to not invoke stop-walking when character
- is not walking (fixes the case in which the packet is sent while sitting,
- which causes a 'standing' sprite even if the char is sitting). [Skotlex]
-2005/11/22
- * Implemented a guild cache in char sql, saves all online guilds every 5 minutes. [Kevin]
- * More grammar fixes [Kayla]
- * Added 1-tile of range grace in skill_use_id and skill_use_pos since
- that's how it is on Aegis servers. [Skotlex]
- * Updated the skill info packets to deliver the skill names as expected by
- the client. [Skotlex]
- * Updated mob ai to enable changing targets while attacking ONLY if the
- attacker is within melee range (Aegis AI). monster_ai&4 can be used to
- override this and allow mobs to change target and pursue ranged attackers.
- [Skotlex]
- * Updated the config comments for the ip-related settings. Thanks to
- akusarujin for the update. [Skotlex]
- * Added rates to at_command.conf, set it's default to GM lv1 [Skotlex]
- * Removed the icon from Fire Break's fire-elemental bonus. [Skotlex]
- * Updated the walkdelay function to only be invoked if the attack did
- damage. [Skotlex]
- * Some more fixes to the english in ShowInfo()'s [Kayla]
- * Cleaned out the SVN a bit [Kayla]
-2005/11/21
- * Removed "(now unlimited loop start!)" from char-sql in an info line...wtf xD..[Kayla]
- * Mob AI update: updated the conditions used to specify if a mob can change
- targets as per the forum provided information (by Komurka and Kyoki).
- Mode 512 (MD_CHANGETARGET) no longer does anything. [Skotlex]
- * Mobs that assist now link nearby mobs when they attack. [Skotlex]
- * Made the damage delay be applied after knockback rather than before
- (magical/misc instant effect attacks are still applied before the
- knockback) [Skotlex]
- * The damage delay timer now stores the distance between source/target, if
- this distance is increased by 2 or more, the damage delay fails and takes
- no effect (if the '2' needs to be made higher, do point it out. It
- shouldn't be much of a problem since you aren't supposed to be able to walk
- from the damage delay anyway). [Skotlex]
- * Changed the way damage delay works. It is no longer applied on
- mob_damage/pc_damage, but instead is invoked from clif_damage (or
- clif_skill_damage), which means the "can't walk" delay is sync'ed with the
- damage packets when they are sent. This should fix most delay-damage
- 'stun-lock' related issues. [Skotlex]
-2005/11/20
- * Mobs now can't move while casting. [Skotlex]
- * Updated mob_db.txt and mob_db.sql with the most recent data from Kyoki.
- [Skotlex]
- * Corrected the mob_db by adding the canmove/canattack bits to pretty much
- all mobs that needed them. [Skotlex]
- * Some fixes to the confusion code. [Skotlex]
- * Crash-fix in status_change_start [Skotlex]
- * Implemented confusion as it should be (not tested yet!) [Skotlex]
- * Updated run_script to backup the current script of a player and
- restore it if the current script ends inmediately. This should fix losing
- the script info if status_calc_pc is invoked while running a script.
- [Skotlex]
- * Fixed a memory leak in the guild eliminate timer. [Skotlex]
- * Removed the extra tile of range mobs have when walking. [Skotlex]
- * Added mob reloading to battleconfig reload @ command. [Skotlex]
- * Updated mob_db.sql with the new modes by Kyoki. [Skotlex]
-2005/11/19
- * Made characters stop walking when inflicted by SC_STOP, may fix
- GrimTooth's stop effect not seeming to take effect. [Skotlex]
- * Made the pk_min_level config not take effect in WoE/GvG grounds.
- [Skotlex]
- * Fixed showing falcon when player is hide. [LuzZza]
- * Updated mob_db.sql and item_db.sql to current [Skotlex]
- * Updated the skill db step guessing code to allow for negative ranges (Now
- spear boomerang should progressively get longer range with higher levels)
- [Skotlex]
- * Fixed Tarot Card, the card that gets two random effects can't retrigger
- itself, and it causes STOP instead of Stun where appropiate. [Skotlex]
- * Updated devotion to only work on damage attacks that have a source (will
- prevent it from "blocking" COMA, which is what caused the crash). [Skotlex]
- * Fixed not always showing CRIT attacks, thanks to Irmin [Lupus]
-2005/11/18
- * Updated mob_ai so aggressive mobs change target when chasing, and
- change-target mobs do so when attacking. [Skotlex]
- * Fixed weapon forging showing success even when it fails. [Skotlex]
- * Some cleaning up of @time, may fix the weird time displays. [Skotlex]
- * Modified mob_ai so hyper-active mobs change target if they are
- cast-sensors even if attacking (angry mode). They will also change target
- if attacked while in angry/follow mode regardless of their change-target
- mode. [Skotlex]
- * Moved the night-inducing code from "map loaded ack" to "spawn pc", should
- fix characters going ultra-blue after stuff like fly-wings. [Skotlex]
- * Delayed the mob emotion when doing skills so that it gets executed AFTER
- the skill is successfully performed. [Skotlex]
- * Implemented PR_REDEMPTIO. Is the penalty for both base and job exp?
- That's how it is currently. And if the map has the nopenalty flag,there's
- no exp penalty. Awaiting further input on the matter (altough, do note the
- skill isn't tested either) [Skotlex]
- * Fixed three memory issues (char txt shutdown, npc reloading, ore
- discovery logs) which were pointed out by End of Exam. [Skotlex]
- * Added support for hyper-active mobs (MD_CHANGECHASE = 0x400), these mobs
- will change to the closest target while chasing/following other players.
- Needs be added to the mob_db. [Skotlex]
- * Added support for hyper-aggressive mobs (MD_BERSERK = 0x800), these mobs
- change their skill state to angry/follow instead of attack/chase when they
- select/change target (except if they changed target because the new target
- attacked them). Needs be added to the mob_db, for now all aggressive mobs
- are considered hyper as well. [Skotlex]
- * Updated mob mode cast-sensor (MD_CASTSENSOR = 0x010), mobs that are
- Aggressive can also change target if they are chasing/following a player
- when someone else casts a skill on them. [Skotlex]
- * Fixed Dark Blessing. [Skotlex]
- * Changed the default battle_delay_damage value from no to yes. [Skotlex]
- * Added check to prevent reinitiating SC_GOSPEL on a character that already
- has GOSPEL and val4 == BCT_SELF, may fix multiple Gospels being placed on
- the ground. [Skotlex]
-2005/11/17
- * Altered behaviour of NPC_EMOTION/NPC_EMOTION_ON as requested by Komurka.
- [Skotlex]
- - val[0] (the first one) is the emotion the mob does. If val[1] is
- different from 0, then the mob's mode is changed to THIS value. If val[2]
- is different from zero, it'll add/remove a mode based on skill used
- (EMOTION_ON adds mode, EMOTION removes it), both can stack [Skotlex]
- * Fixed for sure the Makefile... [Skotlex]
- * Modified Wedding effects. That is, changing base to 22 does NOT displays
- wedding outfit anymore. To display the wedding outfits, you have to start
- SC_WEDDING instead. Tux/Wedding dress scripts likely need being updated.
- [Skotlex]
- * Added battle option disp_zeny, will display on console how much zeny you
- earned (be it from selling, trading, mobs, etc, as long as you "earned"
- zeny) [Skotlex]
- * Updated status_calc_pc to prevent infinite recursion loops. [Skotlex]
- * Applied End of Exam's suggested signedness fixes to npc.c [Skotlex]
- * Updated sting lib, to avoid SQL troubles [Lupus]
- * Fixed moonlit not properly checking for nearby walls. [Skotlex]
- * Added a recursion protection system to status_calc_pc which should avoid
- exploits derived from recursively calling status_calc_pc which certain
- equipment scripts could trigger. Thanks to End of Exam for pointing it out.
- [Skotlex]
- * Applied Celest's patch which should help compiling eA under mingwin.
- [Skotlex]
-2005/11/16
- * Fixed AFM map loading (something was missing there which was gonna make
- the map server crash for sure later on) [Skotlex]
- * Some corrections to the mob states, linked/cast-sensitive mobs engage in
- attach/chase modes, not angry/follow (which seem reserved entirely for
- aggressive mobs) [Skotlex]
- * Cleaned up and corrected target types MSS_AROUND->MSS_AROUND8, also added
- and documented them in mob_skill_db.txt [Skotlex]
- * Probably corrected whispers to GMs. Thanks to Slennox for pointing it
- out. [Skotlex]
- * Modified mob-skill states to use Aegis-based information. Modes are
- MSS_IDLE, MSS_WALK, MSS_LOOT, MSS_DEAD, MSS_BERSERK, MSS_ANGRY, MSS_RUSH
- and MSS_FOLLOW. Mob skill db is unaltered other than for the fact it now
- supports "angry" and "follow" states. [Skotlex]
- * Cleanup of how knockback routines are invoked. [Skotlex]
- * Added MOB_LAZYSKILLPERC to mob.c, determines probability of a mob doing a
- skill when there are no players nearby (but there has to be players in the
- same map for it to trigger). Currently set to 10/1000 chance. [Skotlex]
- * battle_check_target update. Rewrote the party/guild checks, this should
- hopefully fix any problems left with pvp/gvg and mapflags not working
- properly. [Skotlex]
- * Fixed playerattached() returning char id instead of account id. [Skotlex]
- * Added battle option party_even_share_bonus to enable use of Valaris's evn
- share experience bonus equation rather than the official one. [Skotlex]
- * Corrected @jump not displaying the actual coords you jumped to. Thanks to
- kitty74x9 for noticing (and fixing) it out. [Skotlex]
-2005/11/15
- * Fixed multi-hitting skills not increasing the "can-walk" delay
- accordingly. [Skotlex]
- * Modified way to updating hp/position of party members. [LuzZza]
- * Added battle config option "aura_lv", specifies which level characters
- have to be for the server to report their level as "max_lv" (which normally
- is used to enable the aura). See battle_athena.conf for more details. It
- may not work for your self, but only for other characters (this is,
- afterall, untested yet) [Skotlex]
- * Implemented High Jump (works 100%) and Fighting Chant (untested but should work). [DracoRPG]
- * Various cleanups and typo fixes here and there. [DracoRPG]
- * Corrected the upkeep SP cost of Moonlight Petals. [Skotlex]
- * Modified Magnum Break's fire bonus to be 20% ADDITIONAL fire damage of
- your total damage previous to the elemental modifier. [Skotlex]
- * Modified Fatal Blow's stun chance to kRO's equation (+5% stun chance per
- bash skill level over 5) [Skotlex]
- * Corrected Sharpshooting's damage equation to +50%*skill_lv [Skotlex]
- * Updated Magnum Break's bonus from 10% to 20% fire elemental. [Skotlex]
- * Updated Arrow Shower to be a ground based skill (untested yet) [Skotlex]
- * Pretty much rewrote how Moonlight Petals work, it should be working
- mostly right now. [Skotlex]
- * Splitted gat map information into gat and cell info. gat info is
- permanent map data (walls, ground, etc) while cell is temp map info
- (basilica, pneuma, etc). Modified Pneuma and Moonlight Petals to work based
- on map cells. [Skotlex]
-2005/11/14
- * New Visual Studio projects, compiling works, need zlib.dll for txt server. [Kevin]
- * Longing for Freedom can't be used during Moonlight Petals now. [Skotlex]
- * Corrected True Sight's critical bonus (from +0.1 cri per level to +1 cri
- per level) [Skotlex]
- * Made coma a status effect. SC_COMA. Sets HP/SP to 1. Bosses/Emperium are
- inmune to it. [Skotlex]
- * Fixed null pointer crash in battle_damage. [Skotlex]
- * Increased max account variables to 32. [Skotlex]
- * Pressure/Gloria Domini now isn't instant-cancelled by status effects, and
- bypasses the Devotion/Sacrifice check. [Skotlex]
- * Added handling of the /pk packet, even thought it just shows an empty
- listing for now. [Skotlex]
- * Applied zBuffer's suggested fix to prevent S. Novices from getting mental
- Strength at 100% exp. [Skotlex]
- * Fixed Friends List not able to add more than 20 friends (current clients support up to 40) [Lupus]
- thanks to CAHTEXNIK for pointing it out 8)
-2005/11/12
- * Probably fixed the name of freshly captured pet eggs. [Skotlex]
- * Changes Win32 to not require svnversion.h, but instead tries to peek in
- .svn\entries to check for svn version. If the file doesn't exist it'll
- display "Unknown" though, which I guess isn't a good thing ^^; [celest]
- * Removed the option to load zlib as a plugin for Win32 since it should be
- linked at compile time [celest]
- * Added zlib and libmysql .lib files for compiling in Visual Studio [celest]
- Note: The project files on SVN don't have them yet, you'll need to include
- them yourself for now
- * Fixed a compile error in Visual Studio [celest]
- * Readded a missing zlib file needed by Win32, sorry ^^; [celest]
-2005/11/11
- * New readme content/layout (IE warning: IE hates new readme) [Evera]
- * Imported use of the refine weapon packets from jA. [Skotlex]
- * Removed SC_MODE, now NPC_EMOTION and NPC_EMOTION_ON can change a mob's
- mode permanently (until their death, that is), and it won't work on
- player summoned mobs. As before, val1 is the emotion value, val2 is the
- mode to add/remove. Val3 is now ignored (used to be duration) [Skotlex]
- (no, no need to wipe SC data this time around either)
- * Cleaned up sql-files to use TYPE rather than ENGINE as TYPE is supported
- by older MySQL versions and not quite deprecated yet. [Skotlex]
- * Modified the party even share exp bonus to be +10% per extra party member
- as official sources state. [Skotlex]
- * Organized the clif_devotion packet, and added clif_marionette as per
- jA's implementation. [Skotlex]
- * Added db_path to map_athena.conf, used to specify an alternate directory
- to locate the db/ files. Defaults to "db", obviously. [Skotlex]
- * Removed SC_FALCON and SC_RIDING, the status icons are directly managed
- through the change of the character's option now. The actual defines were
- not removed to avoid shifting all the SC_ values again (no need to wipe sc
- data) [Skotlex]
- * Added additional debug information to battle_attr_fix until the cause of
- those errors are found and resolved. [Skotlex]
- * Fixed win32 compiles always reporting "unable to set socket to
- non-blocking mode", together with other minor win32 fixes. [Skotlex]
-2005/11/10
- * Fixed char-sql cart loading. [Skotlex]
- * Updated the function that specifies the cards to support more than four
- slots. [Skotlex]
- - Since the packets are fixed sized the client can never receive data of
- more than four cards, therefore if the client was compiled with MAX_SLOTS
- above 4, a random subset of cards will be sent each time the item data is
- sent (eg: if the item has 6 slots, it may randomly choose to send cards
- 1->4, 2->5, or 3->6).
- * Removed the OnAgitInit call when the map connects to char server. Fixes
- double guardian spawn. [Skotlex]
- * Fixed the sql query strings that would appear "incomplete" under certain
- *nix systems. [Skotlex]
- * Applied zBuffer's patches to correct memory leaks in the PCRE module
- (regular expression support for npcs) and prevent server crashing when
- scripts divide (or do mod %) by zero. [Skotlex
-2005/11/09
- * Fixed Ankle Snare and Spider Web not being cleared when the trapped
- target dies. [Skotlex]
- * Fixed the range flag being incorrectly set in BF_MISC skill attacks.
- [Skotlex]
- * Corrected Venom Knife using Level1 always for the poisoning chance rather
- than learned Envenom's level. [Skotlex]
- * Fixed the crash on shutdown if PCRE support was enabled. [Skotlex]
- * Fixed possible item duping while vending, thanks to End of Exam for
- pointing it out. [Skotlex]
- * Fixed the blue aura of Night effect. Thanks to zBuffer [Skotlex]
- * Fixed mobs moving one tile when hit even if they can't move (this is what
- broke Ankle Snare) [Skotlex]
- * Fixed night/day implementation (which broke due to the addition of SI_
- constants). [Skotlex]
- * Cleaned up the SI_ constants to have defined only those which actually
- display something on the client. [Skotlex]
- * Fixed a bug which caused a captured pet's name to be displayed as beloved
- even though it was just captured. [Skotlex]
- * Added temp skill quests for all complete 2nd Class Quest Skills [Lupus]
-2005/11/08
- * Updated the documentation on the announce script commands. [Skotlex]
- * Removed the global color message support as there's now a way to craft
- custom colored announces. [Skotlex]
- * Probably fixed mapannounce. [Skotlex]
- * Implemented SI_ constants to specify the icon number for different SC_
- changes, idea adopted from jAthena. All SC_ data was reorganized and
- several checks are now in place. It is likely all saved sc_data is wrong
- after this update due to the numbers changing places. It won't cause any
- glue-boots.. but the wrong status changes will be loaded the first time
- anyway, so it may be a good idea to wipe that file/table for this update.
- [Skotlex]
- * Added mob boss inmunity to status changes: poison, curse, deadly poison.
- [Skotlex]
- * Now when the mob starts casting a skill and stops walking, a packet will
- be sent to update the mob position on the clients. [Skotlex]
- * Fixed a bug in mob_stop_walking which may fix stun-lock. [Skotlex]
- * Fixed not showing named/carded items in Vending [Lupus]
- (when you drag'n'drop them from your cart into your shop list)
-2005/11/07
- * Expanded script commands announce/mapannounce/mapareaannounce to take an
- additional parameter to define the color. This uses the new packet 0x1c3 to
- send the broadcast, and even though the packet is not fully understood yet,
- it should be at the point where it can be used. [Skotlex]
- - eg: "announce "hello world", bc_map, 0xFFFF00;"
- * Cleaned up and optimized the way card data is set in packets. Should
- correct most, if not all, pet-egg related issues. [Skotlex]
- * Removed combo_damage_delay and added damage_walk_delay_rate. Now the total
- delay during which you can't move is a percent of the normal damage delay
- rate adjusted by number of hits and this rate. Defaults to 50% for now. [Skotlex]
- * Removed the random damage delay value from status_get_dmotion as it is
- not really helping the walk-stun-lock. [Skotlex]
- * Made Gravitation ignore target's cards. [Skotlex]
- * Updated readme with new layout [Evera]
- * Updated bAddMonsterDropItem bonuses to work with cards: Mimic Card, Mystcase Card
- where bonus_item_rate = base_rate * (killed_mob_level/10) + 1
- So if 2nd argument is negative, then it's 'rate'
- Now, if you kill Porings, u'd have OBB/GIFT BOX drops with 0.01% chance
- and if u kill Leaf Cats then u'd have them with 0.05% chance
- Max chance is 0.1% (when u kill MVPs with level > 94) [Lupus]
-2005/11/06
- * Cleaned up a bit the warp portal code. [Skotlex]
- * Added a timer to invoke the OnAgitInit event 10 seconds after the char/map
- servers are connected. Scripts should now carefully use OnInit to load the
- castle data, and OnAgitInit to check for castle owners, mobs, WoE, etc.
- [Skotlex]
- * Reverted the damage delay equation to 800 -4*agi, which is the correct
- data from packets examined. [Skotlex]
- * Slow motion Fix: Reverted weight packet, thanks to Momoko [Lupus]
-2005/11/05
- * Fixes on sending to client status of char (guild, position, etc). [LuzZza]
- * Updated backsliding to work as it should. [Skotlex]
- * Added back the GPL licence on the root directory (why was this removed?)
- [Skotlex]
- * Fixed knock-back packets, thanks to Vicious for collecting the packet
- samples. [Skotlex]
- * Fixed pretty much all ground skills not working when you "walked into
- them" (they were fine if casted on top of you, though) [Skotlex]
- * Fixed not working ZENY LOG. You can use logging filter as well. [Lupus]
- - Only SQL logs available.
- - Logs only Vending, Trade, Shops yet
- - Don't forget to update your logs SQL DB and log_athena.conf
- * Added previously removed (by an accident) "MVP Prize item log" into pick_log [Lupus]
-2005/11/04
- * Added support for new quest skills to @allskills/@skillall. Thanks again to blackhole89 for
- pointing that out! [Kayla]
- * Fixed various occurencies of assuming Guild Skills being >= ID 10000
- rather than 500<skill<1000 still after skill_chk. Thanks blackhole89! [Kayla]
- * Hopefully fixed Weapon Refine. [Skotlex]
- * Applied a change which prevents pc_setpos from working for characters
- between maps, as doing so makes the character appear on a different
- position on the client than the position stored in the server. [Skotlex]
- * Added friend_db option to inter_athena.conf, now friend table is
- usable in multi server and/or custom db configs. [Foruken]
-2005/11/03
- * Corrected the basilica check which should disable casting offensive
- skills from within inside the basilica. [Skotlex]
- * Modifed status_change_end to prevent peco-peco/falcon from ending until
- the player's 'falcon/peco option' value is removed first. [Skotlex]
- * Removed the knockback code for players and changed it for a "fix
- position" code. The new code is not right as it makes your character
- "teleport" to the position rather than walk really fast to it, but it fixes
- the "Do not use bot!" messages. [Skotlex]
- (someone has to log the actual packets used when being knocked/knocking
- back for this to really be fixed)
- * Heaven Drive now can target traps. [Skotlex]
- (I find it impossible to target a trap with Arrow Shower unless the
- skill's info is set to 32 -target traps-, but when it's done so, the
- client refuses to use the skill on enemies, and mode 33 makes the skill
- useless. How does one makes this work?)
- * Various cleanups to the skill system. [Skotlex]
- * Update: Now your cast cancels on recieving status change such as:
- Stun, Stone Curse, Freeze or Sleep [LuzZza]
- * Updated the code to allow the Emperium to be inflicted by Pneuma and
- Safety Wall. [Skotlex]
- * Updated @recallall to revive any dead characters before moving them,
- should fix that weird ghost bug. [Skotlex]
-2005/11/02
- * Made Spell breaker not be able to cancel Pressure/Gloria domini [Skotlex]
- * Another fix/optimization to thenight/day system. [Skotlex]
- * Fixed possibility of freezing / stunning already frozen/stunned players
- - Now you can't freeze an already frozen one [Lupus]
- * Fixed non-GMs allowing send trade requests from far places [Lupus]
- * Fix of lowest_gm_level (inter_athena), now logins with access under
- lowest_gm_level overides gm_can_drop_lv. [Kayla]
- * Spell Breaker now works on any skill with a cast time. [Skotlex]
- * Made Dispell not work on Meltdown and Cart Boost [Skotlex]
- * Made Meltdown not dispellable upon death. [Skotlex]
- * Probably fixed Warp Portal [Skotlex]
- * Fixed players being able to mute others even if their gm level is not
- high enough to use @mute [Skotlex]
- * Fixed Dispell not clearing a lot of status changes it should. [Skotlex]
- * Corrected the way the Emperium skill-defense works. Damage skills other
- than Gloria Domini, Raging Trifecta and Gravitation do no damage. Status
- changing skills have no effect, and normal heal heals for 0. [Skotlex]
- * Some more corrections to the night/day system. [Skotlex]
- * Multiple fixes to the skill system. Should fix Warp Portal, Teleport and
- mob skills crashing the server. [Skotlex]
- * Updated sql-files/item_db.sql with the latest. [Skotlex]
- * Some optimizations to the script config events loading/storing/saving.
- (Somehow it fixes the warning from the memory manager on shutdown...)
- [Skotlex]
-2005/11/01
- * Updated battle_check_target to allow ground skills that affect "Everyone"
- to affect the emperium, only the ones that target only enemies will have no
- effect. [Skotlex]
- * Changed the default of mob_max_skilllv from 11 to 100, as many of the
- recent mobs use higher level skills. [Skotlex]
- * Moved the check which made emperiums receive 0 damage to: [Skotlex]
- - status_check_skilluse, so that all targetted skills fail.
- - battle_check_target, so that all ground-based offensive skills fail.
- * Cleaned up a bit the skill related code. [Skotlex]
- * Updated @ commands. NO command comes at gm-level 0 by default now, that's how
- it should be, the new default minimum is 1 for most trivial @ commands. Also added
- a bunch of commands to conf/atcommand.conf which were missing. I STRONGLY
- recommend everyone to at least fetch the new atcommand file as there
- were abusable commands at level 0 (abusable in the sense they can incur
- performance penalties if over-used by everyone) [Skotlex]
- * Fixed crash when a mob was killed while under Rich Man Kim effect by a
- non-player, also fixes Rich Man Kim not giving the correct exp bonus.
- [Skotlex]
- * Modified the socket subsystem to not close all connections on an "Service
- Temporarily Unavailable" error (it is a non-fatal error which basicly means
- "try again later"). [Skotlex]
-
-2005/10/31
- * Fixed all players having the "plant" mode on... [Skotlex]
- * Added a timer to delay the automatic respawn of characters in gvg or pvp
- grounds. The delay is currently 1 second, but be warned that because of
- this it may be possible to revive the character if some priest is insanely
- fast as there's currently no way to "prevent" a character from being
- resurrected. [Skotlex]
- * More and more new quest skills! :3 [DracoRPG]
- * Removed the setting where characters could logout overriding the
- prevent_logout setting if they were dead (it made it extremely easy to
- accidentally log out if you were killed while trying to escape) [Skotlex]
- * Changed prevent_logout from yes/no to a "duration in ms" setting.
- Defaults to 10secs (10000ms), note the client always says "wait 10 seconds"
- regardless of the value of this setting. [Skotlex]
- * Moved the status change of SC_RIDING/SC_FALCON from clif_changeoption to
- pc_changeoption which correctly makes the falcon/riding states end on quit.
- [Skotlex]
- * Mob ai fix (mobs locking down into one target forever even if they should
- be able to change targets) [Skotlex]
- * Added routine to check party share level whenever one of the members
- levels up. It's checked on the map server, and then a share request is sent
- to the char-server if party_share_level is broken. [Skotlex]
- * Corrected "show drain" to show nothing if the leeched values are
- non positive. [Skotlex]
- * Probably fixed Wand of Hermode not blocking the caster from walking.
- [Skotlex]
- * Applied Silent's fix to @where [Skotlex]
- * Code cleanup regarding sign/unsigned comparisons. [Skotlex]
- * Updates to new quest skills, some are fully functionnal, some half, some
- not at all xD. [DracoRPG]
-2005/10/30
- * Fixed a bug that broke pet skills. [Skotlex]
- * @follow: Now to stop following, you may just type @follow, thx2Sartory [Lupus]
- * Fixed & finished what I did yesterday with SCs and quest skills, thanks
- to Silent. [DracoRPG]
-2005/10/29
- * Reorganized SC IDs to make room for 2nd jobs quest skills statuses: upped
- SC_SENDMAX to 300 and moved all required SC to 300+. BEWARE: as a side-
- effect of this, you might get 'glue boots' if an SC was saved and cannot
- be restored because the ID isn't used anymore, this should only happen
- with bonuses from cooked foods & dances/songs (unlikely since they last 20
- seconds only), and maybe a few other such things. Simply remove lines
- with SC IDs above 200 in your sc_data file/table. [DracoRPG]
- * Changed a bit the way Plant Cultivation fails: when it fails because of
- missing items, it does nothing and displays "Skill had failed"; when the
- 50% success rate test fails, the effect is displayed but no plant summoned.
- How should it work exactly? Because previous way was a bit confusing for
- the player, not explaining why it failed, so I'd like to know. [DracoRPG]
- * Changed food cooking success rate to unmodifiable 50%, temporary value
- waiting for accurate data ;) [DracoRPG]
- * Fixed the code in skill.c so that skills are considered as guild skills
- (for things such as inf, maxlv, etc) only when their ID >= 10k, enables
- use of 2nd jobs quest skills with 1k+ IDs, thanks to Silent. [DracoRPG]
- * Fixed the Flag guild script. Now one can only flag in using the flags infront
- of the castle. [Kayla]
- * Removed most of the built-in zlib files and the LOCALZLIB compile option
- Note: All native Windows builds now require zlib1.dll, you can just download
- it from http://www.zlib.org and place it in the main directory [celest]
- * Changed the unzip library to be static linked instead of dynamic [celest]
- * Small fix to the trading routing, should fix items with the no-trade flag
- being able to be vended. [Skotlex]
-2005/10/28
- * Fixed the size of the equip_job field in SQL item_db/item_db2, thanks to
- blackhole89. [DracoRPG]
- * Harmonized the way NPC events such as PCLoadMapEvent, PCBaseLvUpEvent, etc
- are implemented. Caution, now PCLoadMapEvent NPC is called globally: it
- is not needed to put it in a specific map. Use script functions to know
- which map the player has been warped to. Thanks to Z3RO. [DracoRPG]
- * Fixed the names of the job level up char commands. [Skotlex]
- * Tiny change to the script engine which may fix those crashes. [Skotlex]
- * Added blocking use of skills while sitting. [Skotlex]
- * Implemented Trancid's expanded global announce system. [Skotlex]
-2005/10/27
- * Applied Ilpalazzo-sama/Zzo's patch that cleans up and fixes some bugs
- with the script engine. [Skotlex]
- * Made land protectors from enemies cancel each other out. [Skotlex]
- * Made it so Guardians/Emperiums with no owning guild can be attacked out
- of woe. [Skotlex]
- * Corrected being able to attack and use skills during the first interval
- of Petrify [Skotlex]
- * Fixed packet exploit that allowed you to produce multiple times without
- first triggering the skill. [Skotlex]
- * Cleaned up/simplified the implementation of SC_NOCHAT [Skotlex]
- * Added file upgrade_svn3746.sql, use it to alter your `char` table column
- "manner", which should NOT be unsigned (if your column already is
- signed, then no need to apply this update) [Skotlex]
- * More code cleanup to make eA ANSI-C compliant. [Skotlex]
- * Some fixes to the night-day-system. [Skotlex]
-2005/10/26
- * Some more multi-map server work. It seems to work now correctly and with
- no memory leaks, however it likely needs more testing. Also added the
- support into the char-TXT server. [Skotlex]
- * Patched a crash where mobs with no space for looting would attempt to
- loot. [Skotlex]
- * Updated mapflags, readded gvg_dungeon. Now mapflags work according to
- this post: [Skotle]
- http://eathena.ws/board/index.php?showtopic=58201
- * Likely fixed Party Even Share. [Skotlex]
- * Added map flag "nightenabled", only maps with this flag will display the
- night effect when it's night. Said maps are specified in mapflag/night.txt [Skotlex]
- * Modified map flags gvg and gvg_dungeon. gvg now is basicly the same as
- pvp, except guilds are automatically teamed up, while gvg_dungeon was
- removed and replaced by gvg_castle, which is the flag now used for castle
- maps which only modify the behaviour during WoE times. [Skotlex]
- * Updated the login/char TXT Makefiles so the TXT_ONLY flag is passed, this
- SHOULD fix the guild size mismatch errors... [Skotlex]
- * Probably fixed a char-server crash related to whispers. [Skotlex]
- * Updated the custom jobmaster so it should stop second advanced classes
- from being able to re-change jobs. [Skotlex]
- * Implemented dynamix's night system which uses a status change rather than
- the "darkness levels", said config option removed as is no longer needed.
- [Skotlex]
- * Some fixes to the char-sql code when sending chars to another map server.
- [Skotlex]
- * LuzZza's ported Trade/Vending additional antispoof checks [Lupus]
- - thanks to Yor&Freya Team. So LuzZza is our new dev (it was his 2nd test)
-2005/10/25
- * Some work fixing up multi-map servers. It should now *work*, however each
- time the player swaps map-server it triggers all the relevant
- on-login/on-logout events, which likely needs to be corrected at a later
- date. Only SQL has been updated so far, TXT is still pending. [Skotlex]
- * Updated GrandCross so it does half damage on the caster (+half damage
- from Faith, it does just 25% or less damage to self now) [Skotlex]
- * Updated battle_check_target to consider normal mobs as always belonging
- to the same party (should fix them fighting out when pkmode is on)
- [Skotlex]
- * Fixed the Makefile for TXT char/login servers (fixes guild structure size
- mismatches) [Skotlex]
- * Added script command "playerattached", returns the char_id of the player
- currently attached to the script, 0 if there's no player attached (or
- attached player is no longer on the map server) [Skotlex]
- * Fixed @changegm in the char-txt server. [Skotlex]
- * Some code cleanup to make eA ANSI-C complaint (not quite there, but
- closer) [Skotlex]
-2005/10/24
- * Applied Ilpalazzo-sama/zzo's patch that optimizes the status_get_*
- functions. [Skotlex]
- * Fixed changegm (as far as I know) [Skotlex]
- * Modified again the code that checks who and what can target traps. It
- should be set to only let heaven's drive, arrow shower and remove trap
- target them. [Skotlex]
- * Breaker now ignores mdef. [Skotlex]
- * Fixed script command "makeitem" to only require an attached player if the
- map is defined as "this". [Skotlex]
- * Updated battle_check_target to enable only skills with inf 32 (can target
- traps) to hit traps. Implementation may not be perfect depending on how
- the client reacts to the associated skill_db change. [Skotlex]
- * Cleaned up battle_weapon_attack. [Skotlex]
- * Some optimizations to the struct mob_data. [Skotlex]
- * Applied Ipalazzo-sama/zzo's memory optimization patches. [Skotlex]
- * Fixed some quests and updated item_db. [Kayla]
- * Updated Grimtooth to cause "Stop" on enemies instead of slow down. The
- duration used is now skill's time 2. [Skotlex]
- * Updated the mob_ai code so they do nothing if they were attacked but
- can't attack back (and it did not invoke a rude attacked, that is,
- monster_ai does not has 2 set) [Skotlex]
-2005/10/23
- * Some fixes to @charmountpeco [Skotlex]
- * Some cleanups to pet.c, fixes pet_timer being invoked when the pet is
- idle. [Skotlex]
- * Added a clause to ignore name solve requests of chat-rooms (for some
- reason the client requests them...) [Skotlex]
- * Updated sql-files/item_db.sql to the latest. [Skotlex]
- * Removed that mob_spawn_once message that is just a debug message with no
- real purpose anymore. [Skotlex]
- * Fixed forging displaying success even when it fails. [Skotlex]
- * Changed main.sql so that sc_data only has indexes, not a primary key
- (I keep hearing mysql can't handle a triple column PK...) [Skotlex]
- * Fixed Doublecast's success chance [Skotlex]
- * 'Fixed' the warning on @reloadscript (just removed the warning and
- avoided memory leaks, because properly unloading the user functions and
- reloading them I could not get done) [Skotlex]
- * Fixed possible crash due to custom packets, thanks to Andz for the info.
- [Skotlex]
- * Fixed mob's Scream/Frost Joke crashing the server if the message was too
- long [Skotlex]
- * Fixed the wrong attribute being passed to the attribute fix in
- battle_calc_magic attack (strange deja vu feeling.. I am sure I fixed this
- same bug before). [Skotlex]
- * Fixed trading. [Skotlex]
- * Removed Mastery damage being applied to Grand Cross [Skotlex]
- * Some more fine-tuning of the Grand Cross equation. [Skotlex]
- * Fixed mobs that couldn't attack not being able to use skills (first half
- of why marine spheres were broken). [Skotlex]
- * Updated summoned marine spheres so they can move (second half of why
- marine spheres were broken). [Skotlex]
- * Rewrote the produce system for mixed foods creation [DracoRPG]
- * Small changes and optimizations to battle_calc_magic_attack, replaced redundant
- magic_subrace with missing magic_addsize, updated crappy doc about it [DracoRPG]
-2005/10/22
- * Modified Finger Offensive's formula to be 100% + 50%*skilllv which seems
- to be a more factually correct equation than what is shown in the websites.
- [Skotlex]
- * Applied Ilpalazzo-sama's patch which speeds up the data zeroing in
- status_calc_pc. [Skotlex]
- * Crashfix on invalid lines when reading castle_db.txt [Skotlex]
- * Updated GrandCross's damage formula according to Komurka's information.
- [Skotlex]
- * Also, now skills that ignore card modifiers only ignore the attacker's
- card modifiers, no the target's (does not apply to skills like Pressure
- that do fixed damage). [Skotlex]
- * Updated Bowling bash damage, knockback to current Kro values. [Skotlex]
- * Modified NPC_EMOTION and NPC_EMOTION_ON so they can be used to modify the
- current mob's mode (instead of setting it). [Skotlex]
- - Some examples:
- 1269,Clock@NPC_EMOTION_ON,attack,474,1,10000,0,30000,yes,self,always,0,6,4,300,,,
- Adds mode 4 (aggressive) for 300 seconds to Clocks when attacking.
- 1193,Alarm@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,19,4,10,,,
- Removes the aggressive mode (4) from Alarms when chasing for 10 seconds.
- - After a mob's mode is changed, their state is reset so they can stop
- chasing/seek a target.
- * Made GrimTooth be longranged, Soul Drain work only on targetted skills,
- and Extremity Fist only checks for enemy state right before attacking (I am
- not sure it is 100% as it should be still, though) [Skotlex]
- * Eh.. now Safety Wall blocks all skills tagged as short-ranged. Report any
- anomalies this causes. [Skotlex]
- * Added support for global mob skills. In essence, you can now specify a
- mob skill that is added to ALL mobs in a single line by using negative
- class IDs. -1 adds the skill to normal mobs, -2 adds the skill to
- bosses, and -3 to both. For example:
- -1,All@AL_HEAL,any,28,10,10000,500,5000,yes,friend,friendhpltmaxrate,60,,,,,,
- Adds Heal Lv10 to all normal mobs.
- * Readded the level up buff bonus from the Taekwon class T.T [Skotlex]
-2005/10/21
- * Removed the level up buff bonus from the Taekwon class T.T [Skotlex]
- * Small change in mob_ai_sub_hard which may fix mobs casting their Rude
- Attacked skill when they shouldn't. [Skotlex]
- * Moved the code so that SNovice Steel Body should trigger inmediately upon
- death, and bypass the exp loss penalty. [Skotlex]
- * Added Taekwon boy to the buff on level up system. [Skotlex]
- * Fixed Skills checking for water-cells instead of Land Protector cells.
- [Skotlex]
- * Added config option skillrange_by_distance, makes skills be long/short
- ranged based on the source/target distance. Defaults to 6 (mobs + pets).
- [Skotlex]
- * Fixed Magic Power totally messing up matk. [Skotlex]
- * Fixed Meteor Storm [Skotlex]
- * Some changes to Moonlight Petals, it should make the skill finally be
- considered an ensemble skill. [Skotlex]
- * Updated skill_split_atoi to guess linear increases up to half of the data
- provided. This means it can understand the more complex cast times of
- skills such as Meteor and Soul Strike. If you provide the data of ten
- levels, then it will check for patterns up to 5 steps long (meaning that
- the diff between 1 and 6 is the same as the diff between 2 and 7 and so on,
- and if they all match, the tested pattern is applied all the way to level
- 100) [Skotlex]
- * Some modifications to Magic Power, it should hopefully be working now. [Skotlex]
- * Cleanups and fixes to Tarot Card. [Skotlex]
- * Fixed a screwup in skill_split_atoi which was corrupting the skill db. [Skotlex]
- * Free up block chunks allocated by the memory manager when shutting down [celest]
- * Updated packets in packet_db and clif.c [celest]
-2005/10/20
- * Turned on the error_log by default (had this been on before, I would had
- noticed why Longing for Freedom was not working several WEEKS ago >.<)
- [Skotlex]
- * Fixed Longing for Freedom [Skotlex]
- * Hopefully fixed even-share party on char relog exploit. [Skotlex]
- * Modified Land Protector so it behaves more like Basilica. [Skotlex]
- * Removed GM account reading from the char-sql server and moved it into
- the login-sql server (Ancyker requested this was fixed... and this is how
- it was working on the TXT servers) [Skotlex]
- * Modified skill_split_atoi so it can guess linear changes in the values
- and fill out the rest of the array correctly (eg: blowcount is defined as
- 1:2:3:4:5, now the function can understand that and fill the rest of values
- with 6:7:8:9:10 and so on. It can also understand two-step increases, if
- the value is 1:2:2:3:3:4, it can guess that the following values should be
- 4:5:5:6:6:7:7 and so on). This allows mobs to cast stuff like Thunderstorm
- LV67 without the need of manually updating the dbs with the corresponding
- values :O [Skotlex]
- * Fixed monster_ai&1 doing the opposite of what it should do. [Skotlex]
- * Rewrote the skill unit reiteration code so that it'll work with any AoE
- skill that is set to not reiterate in skill_unit_db.txt, when no
- reiteration is set, the skill cannot be stacked with itself, but it can
- be placed on top of other AoE skills (except for Pneuma, Safety Wall,
- Warp Portal, Basilica and the Hunter traps who all have their own checks
- hardcoded) [Skotlex]
- * Modified the way Magic Power works for AoE magic skills, it should now
- work correctly for all AoE spells including Meteor. [Skotlex]
- * Added mode "change target" (0x200 = 512) to specify mobs that can change
- target while attacking. Since no mob in the db has been updated yet to
- include this mode, for the time being all aggressive mobs will also be
- considered as "change target" types (which is how eA has been managing it
- up to this point) [Skotlex]
- * Added a check in status_check_skilluse to make AoE skills fail if the
- caster is standing on Basilica. [Skotlex]
- * Reduced a bit the size of the party structure. [Skotlex]
- * Fixed Play Dead [Skotlex]
- * Reverted a memory fix in script.c which causes a crash.. [Skotlex]
- * Reverted a small change which likely made magic power not work anymore on
- ground skills. [Skotlex]
-2005/10/19
- * Added an SQL update update_logs2.sql Use it for more effecient work of your MySQL server [Luups]
- * Likely fixed Root and the Wedding Skills [Skotlex]
- * Fixed that crash in skill_use_id.. oops. [Skotlex]
- * Fixed demonstration triggering status effects. [Skotlex]
- * Fixed ground placed skills causing skill_counter_additional_effect
- triggering on the skill's owner. [Skotlex]
- * Added corrections/checks that should prevent the char servers from
- crashing if they parse a packet from a client where the session data is
- expected to be but is not set. [Skotlex]
- * Converted NPC_STOP to a status-inducing effect, SC_STOP which prevents
- characters from moving. [Skotlex]
- * General checks and cleanup (new function pc_can_move) to prevent chars
- from walking when they shouldn't be able to. [Skotlex]
- * Some changes to int_party, which may prevent crashes due to large parties
- in congested situations. [Skotlex]
- * Software Caused Connection Abort errors should inmediately terminate the
- connection now (rather than waiting for the timeout) [Skotlex]
- * Hopefully fixed Basilica by making battle_check_target use the mapcell
- instead of the status change when deciding the enemy state. [Skotlex]
- * Fixed being able to enable NPC clicks while a trading window is open. [Skotlex]
- * Added status change SC_MODE which allows to temporarily override a mob's
- mode. It can be invoked through mob skills NPC_EMOTION and NPC_EMOTION_ON
- using the second and third value (new mode and duration in seconds,
- respectively). Example:
- 1269,Clock@NPC_EMOTION_ON,attack,474,1,10000,0,30000,yes,self,always,0,6,133,300,,,
- Makes the Clock do the /an emotion, and his mode changes to 133 (can
- move, can attack, aggressive) for the following 300 seconds (if the mode
- is 0, then the mode is not changed).
- - Note that when a mob gets their mode changed, their state is reset (so
- they stop attacking/chasing)
- - Because of this update, the code that made mobs give up chasing after a
- while is no longer needed and hence, removed.
- * Implemented function status_check_skilluse which checks whether a skill
- (or melee attack) can be used on an enemy based on their status (restricts
- skills that may be used if opponent is cloaked/hidden, or blocks Aex
- Aeterna if opponent is petrified/frozen, blocks skills while silenced, etc
- etc). Note that the code simplification/modification is big, so beware of
- any new bugs that might have been caused by the function. [Skotlex]
-2005/10/18
- * Fixed card set bonuses for sure this time (or so I hope) [Skotlex]
- * Fixed the Dissonance song bug which allowed you to cast a song afterwards
- and it would not follow you around. [Skotlex]
- * Modified the counting function to never count in skills (traps, AoE
- skills) since traps were always being counted in for stuff like Napalm
- beat/Blitz Beat/etc. [Skotlex]
- * Fixed Devotion/Sacrifice check which should enable recasting on
- characters. Thanks to Irmin for pointing it out. [Skotlex]
- * Fixed offensive heal so it fails if not used on an enemy (instead of
- failing when used on an ally). [Skotlex]
- * Modified the char servers so they do a party range check when a character
- logs in. This should fix parties keeping their even share even after a
- low-level member rejoins the server. [Skotlex]
- * Updated mob AI so that aggressive mobs will change targets if they are
- attacked and their current target isn't attacking them (regardless of
- range) [Skotlex]
- * Some updates to the pet AI so their chase range is range3 instead of the
- hardcoded value of 13. [Skotlex]
- * Reverted Mika's fix since it makes it impossible for mobs to heal each
- other. (what is the so called exp bug about?) [Skotlex]
- * Fixed a possible crash in clif_equiplist(), thanks to Zoc [Skotlex]
- * Spells are now considered a "miss" if they do no damage (this prevents
- additional effects from triggering out such as freezing) [Skotlex]
- * Temp bug fix of Exp increase when healing non-undead mob (by MiKa) [Lupus]
-2005/10/17
- * Updated sql-files/mob_db.sql to match with the current one. [Skotlex]
- (someone else also did this, but missed a few values from Incantation
- Samurai. Altough who did it and why it is failed to be mentioned in the
- log files?) [Skotlex]
- * Fixed alchemists not being able to hit their marine spheres (how many
- times this same bug keeps coming back from the dead anyway?) [Skotlex]
- * Updated sql-files/item_db.sql to the current item_db.txt [Skotlex]
- * Fixed magic rod not cancelling the additional effects from skills. [Skotlex]
- * Cleaned up the card inserting code to prevent crashes from modified
- packets. [Skotlex]
- * Fixed offensive heal [Skotlex]
- * Applied a random chance when reducing the mob's chase duration. This
- should randomize how long the mob chases you around before giving up.
- [Skotlex]
- * Some modifications to the timer push heap function, may fix timer issues
- when creating timers with tick values that overflow. [Skotlex]
- * Modified the mob ai so it has a seek time, when the min_chase runs out
- (it is constantly decreased while chasing, starts out at range3) the mob
- will stop chasing, do a /swt, and stop being aggro for 10 secs. This is how
- it should be according to what I understood from Komurka's explanation.
- [Skotlex]
- * Added config monster_ai, it determines some of the mob behaviour:
- - If &1, mobs will use hard path finding to reach their target, otherwise
- only easy (straight line) path searches will be used (for most offensive
- purposes).
- - If &2, mobs will use the rude attacked skill if they can't attack back no
- matter what, otherwise they use it only if they can't reach the target.
- [Skotlex]
- - Still pending on what other things it could define. Currently defaults to
- 0 (seems to be the official mob ai) [Skotlex]
- * Now Atk/Matk potions duration don't get automatically multiplied by 1000,
- duration must be specified in ms in the scripts. [Skotlex]
- * Made all mobs with no guild belong to the same guild, this should prevent
- mobs from attacking each other on WoE. [Skotlex]
- * Fixed Into the Abyss + retrieving traps related exploits. [Skotlex]
- * Changed monster_skill_nofootset to no to enable mobs casting stuff like
- Bomb underneath characters. [Skotlex]
- * Fixed Sacrifice, it can now be recasted on a player as long as it's by
- the same crusader that is currently protecting the player. [Skotlex]
- * Fixed some unitialized values error in magic and misc attacks. [Skotlex]
- * Fixed 30% bonus from upper/baby classes affecting card bonuses. [Skotlex]
- * Fixed baseClass not working on Acolyte class, thanks to Silent. [Skotlex]
- * Made the stone curse animation only show up on successfully cursing. [Skotlex]
- * Added Meditation's bonus to offensive heal, thanks to Orn. [Skotlex]
- * Made devotion fail when already used on a char with that effect. [Skotlex]
- * Made it so you can't quit while cloaking/hiding, and said status will end
- on quit if force-quitting. [Skotlex]
- * Cleaned up and fixed isequipped script commands, it should be working
- correctly now (tested with the Assassin combo) [Skotlex]
- * Fixed not stacking Long Attack Rate bonuses [Lupus]
- - Bow Thimble +3%, Archer Skeleton Card +10%, Merman Card(when CARDS COMBO) +20%
- - We should get rid of that +-15% ranged damage varianc (it doesn't cure "stoprate bug" anyways)
-2005/10/16
- * Fixed wrong calculation of items max drop chance (when using MySQL MOB DB) [Lupus]
- * Added nomemo mapflag to more levels of Thanatos Tower, thx2Justin84 [Lupus]
-2005/10/14
- * Updated the gvg_dungeon mapflag to mean "guild versus guild regardless of
- woe schedule" and set it on the guild versus guild maps. [Skotlex]
- * Fixed perfect hiding. [Skotlex]
- * Cleaned up (or rewrote?) the Run and High Jump code to merge them better
- with the normal walking routines. [Skotlex]
- * Corrected Turn Undead from ignoring element. [Skotlex]
- * Updated Power Thrust Max & Power Thrust so that they don't stack (and
- only PT Max cancels PT) [Skotlex]
- * Some fine tuning in battle_check_attackable. [Skotlex]
- * Changed db_final's implementation to End of Exam's. [Skotlex]
- * Corrected Guardian removal routines to also update/save their respective
- Castle data (Guardian HP and visibility) [Skotlex]
- * Added map server setting "enable_spy", must be set to yes/on for @spy
- commands to work. [Skotlex]
- * Applied End of Exam's fix to the previous fix to the db. [Skotlex]
- * Fixed spyguild/spyparty sending packets to the spied guild/party instead
- of your own. [Skotlex]
- * Rewrote the card hash implementation. Now it should work correctly for
- any card set on any equipped item. Supports up to 4 slots in any of the
- equipped items. [Skotlex]
- * Updated the mob ai so it stops chasing right away if you
- hide/cloak/vanish/etc. [Skotlex]
- * Fixed some memory issues in the db handling. Credits to End of Exam.
- [Skotlex]
-2005/10/13
- * Updated the main.sql file with some of the recommendations by Zoc
- [Skotlex]
- - If your sc_data table works as it is, you don't have to touch it.
- * Fixed Maxmize Power/Cloaking sending the sever to an "infinite loop" when
- used by mobs. [Skotlex]
- * Some cleaning to clif_send in regards to guild-related packets. [Skotlex]
- * Added mob skill condition "afterskill", works like "skillused" except
- it's triggered after the mob was the one doing the mentioned skill.
- [Skotlex]
- * Small cleanup and optimization of data saved when received member
- information. [Skotlex]
- * Fixed some memory issues in script loading and the plugin loading
- mechanism. [Skotlex]
- * Fixed magic attacks always doing minimum damage. [Skotlex]
- * Fixed the crash in battle_check_attackable [Skotlex]
- * Fixed Fireball hitting twice on the targetted mob. [Skotlex]
- * Updated Recall Guild to work in gvg maps even if the nowarp flag is set.
- [Skotlex]
- * Updated Recall Partner to warp partner after 20 secs the thing is on the
- ground, skill is blocked from reusage during that time. [Skotlex]
- * Some updates to correctly decide whether skills hit cloaking and/or
- hidden chars. [Skotlex]
- * Updated skill code so that heaven's drive will hit and destroy traps
- (untested), also AoE skills will not trigger on hidden characters. [Skotlex]
- * Fixed the crash on magic rod. [Skotlex]
- * Updated Maximize Power and Cloaking to last forever (until reuse, I
- believe) for non-players. [Skotlex]
- * Made Berserk end when you logout. [Skotlex]
- * Made song/dances end when you unequip your weapon rather than on equip.
- [Skotlex]
- * Fixed one bug in battle_calc_magic attack and some cleaning of it as
- well. [Skotlex]
- * Updated sql-files/mob_db.sql to match the latest mob_db.txt [Skotlex]
- * Updated sql-files/item_db.sql to match the latest item_db.txt. [Skotlex]
- * Fixed stealing. Now it works like aegis one. [Lupus]
-2005/10/12
- * Fixed everyone gaining high speed after casting a ground-based skill.
- [Skotlex]
- * Corrected the magical part of Soul Breaker ignoring mdef. [Skotlex]
- * Updated Reverse Orcish to use the duration specified for the skill in
- skill_cast_db.txt [Skotlex]
- * Modified REVERSEORCISH to make it a status change (SC_ORCISH), since
- there's no data about duration, defense, or if any stat reduces it's
- duration, it currently is fixed to 5 minutes. [Skotlex]
- * Fixed crash when sending the insert card packet with an invalid index. [Skotlex]
- * Added script constant baseClass. [Skotlex]
- - Example: if (baseClass == Job_Novice) will match on all novices and super
- novices. if (baseClass == Job_Swordman) will match on all Swordmen, Knights
- and Crusaders. Once tested several item scripts can be simplified in the
- item_db.
- - In contrast, the already defined baseJob works by stripping the upper
- kind only. (eg: baseJob == Job_Swordman matches on swordman classes, but
- not Crusader/Knight)
- - I know the names can be confusing, but anyone has a better suggestion for
- a name?
- * Added a fix to prevent people from buying equipment in stackable from by
- hexing the packets and specifying an amount greater than 1. [Skotlex]
- - Thanks to End of Exam for pointing out the exploit.
- * Added flag "move delay" to skill_castnodex_db.txt [Skotlex]
- - By setting this flag to 1, players won't be able to move during the skill
- delay time. Some reorganization was needed in skill.c to make room for
- this, so some testing is required.
- * Fixed the Char SQL server unnecessarily loading AND saving parties each
- time a party-member changed maps. [Skotlex]
- * Modified skill_min_damage so that it defines the minimum damage for
- skills IF the skill does not misses/is blocked. Can be used to specify
- to any of weapon attacks, magic attacks, or misc attacks. Defaults to 6
- (magic + misc attacks) as that is what was set up previously. [Skotlex]
- * Fixed Wand of Hermod and a potential crash related to ground based
- skills. [Skotlex]
- * Probably corrected npc load count when using reloadscript. [Skotlex]
- * Likely fixed petheal [Skotlex]
- * Fixed PVP client crash bug. By a new cadidate into eA coders LuzZza [Lupus]
- * Updated maps comments, thanks to Justin84 [Lupus]
-2005/10/11
- * Fixed not being able to cast resurrection on dead players. [Skotlex]
- * Fixed party HP update crash. [Skotlex]
- * Fixed players being killed always in one hit. [Skotlex]
- * Fixed chars not being able to unhide. [Skotlex]
- * Rewrote/optimized the hp updating code (both party hp and disp_hpmeter),
- this should lower bandwidth a bit from all the unnecessary packets that
- were previously being sent. [Skotlex]
- * Removed the mysterious 2.2% drop chance for all items when read from the
- sql db. [Skotlex]
- * Updated targeted skills and normal attacking to fail when targetting
- hidden characters. [Skotlex]
- * Merged reddozen and Draco's code regarding TK skills. [Skotlex]
- * Added a function to allow guilds to delete alliances with nonexisting
- guilds. [Skotlex]
- * Corrected the weapon damage return in battle_weapon_attack, thanks to PeF
- for pointing it out. [Skotlex]
- * Added max_baby_parameter to define the max parameter for baby classes.
- Also fixed some instances where the baby parameter restriction was not
- being taken into account. [Skotlex]
- * Fixed Firewall doing knockback on the undead. [Skotlex]
- * Fixed Waterball count when casted by non-players, thanks to Orn [Skotlex]
- * Fixed the instrument/whips gender restriction being applied to Cap. [Skotlex]
- * Damn typo: Fixed Mobs Drops with the same % droprate. thanx 2rover 4bugreport [Lupus]
- * Fixed SQL Mob DB reading(no drops issue, etc) thanx to yoanykim for pointing it out [Lupus]
-2005/10/10
- * Probably fixed the peco-riding issue. [Skotlex]
- * Fixed clif_clearchar_delay (cause of the ghost mobs from my tests). [Skotlex]
- * Small fix on the mob ai (attacked_id was never being reset if the
- attacker no longer exists). [Skotlex]
- * Added a couple of checks to prevent the mob_ai from executing if the mob
- is dead. [Skotlex]
- * Fixed a typo in skill_attack which causes all sort of unpredictable
- behaviour, such as firewall never hitting. [Skotlex]
- * Fixed a memory leak involving pets and cast cancel. [Skotlex]
- * Made Wand of Hermod end when the caster is moved for whatever reason. [Skotlex]
- * Increased the random damage delay modifier to +/-15% [Skotlex]
- * Fixed "rare drop filter" considering "available in shops only items" as RARE items [Lupus]
- * The GM can drop level now also determines whether a GM can store items in
- the Guild Storage or not. Thanks to Kayla for pointing it out :P [Skotlex]
- * Fixed Grimtooth so that it's slowdown works on both players and mobs.
- [Skotlex]
- * Fixed Fireball's damage. [Skotlex]
- * Now the Wedding Dress and Tuxedo will always check for the correct
- gender. [Skotlex]
- * Cleaned up the code for Potion Pitcher. [Skotlex]
- * Reverted Falcon Assault to be 5x Blitz Beat's damage at level 5. [Skotlex]
- * The npc_counter is now reset in a @reloadscript. [Skotlex]
- * Cleaned up Falcon Assault and made it's %dmg increase be an addition on
- top of Blitz Beat (altough I am not so sure that's right) [Skotlex]
- * Hardcoded the gender restrictions for items with view 13 & 14 (Musical
- Instruments and Whips), changed ignore_item_genders to yes as default. [Skotlex]
- * Changed GX duration to 900ms. [Skotlex]
- * Cleared up the item get times descriptions in battle_athena.conf [Skotlex]
- * Some timer fixes in status_change_start regarding sc_data loading. [Skotlex]
-2005/10/09
- * Probably fixed Waterball so it does max number of hits when casted by a
- non-player regardless of water availability. [Skotlex]
- * Fixed perfect hiding. [Skotlex]
- * Corrected magic damage return to only work on targetted skills [Skotlex]
- * Some cleaning up of the skill_attack function. [Skotlex]
- * At last finished 2 last logs filters options: [Lupus]
- - Implemented 'Rare' items option (you can set rare_items_log value)
- - Implemented 'Big amount' of items option (it would always log big set amount of items (per 1 action!) despite on the other filter option)
- * Updated @iteminfo ATcommand. It would show you additional item info. [Lupus]
- - Monsters drop this item with ?.?% chance
- - Monsters don't drop this item
- - This item is available in the shops only
- - Tip: When you Trade/Vend goods, use @iteminfo to check items price and even rareness ^_-
- * Rearranged item_data struct units to make it compatible with some old script commands after Skotlex's changes
- - Tip: Now you can use GetItemInfo script command to find out if the item is rare or not
-2005/10/08
- * Some improvements to the mob ai. [Skotlex]
- * Fixed summoned marine spheres exploding on their own. [Skotlex]
- * Probably fixed the attribute fix for magical attacks. [Skotlex]
- * Made the gender check to not be ignored by default [Skotlex]
- - This is necessary because the new job ID system makes both Dancer and
- Bard be treated as the same job, so all bard/dancer comparisons were
- changed to be gender comparisons, thus, the gender check is indispensable
- for their weapons.
- * Updated item_db structure. new column upper (after equip_jobs) defines
- the type of job that can equip the item (1: Normal jobs, 2: Upper jobs,
- 4: Baby jobs), merged the use_script and equip_script columns into one.
- Also the equip_jobs column now has support for the following classes:
- Taekwon (2^24), Star Gladiator (2^25) and Soul Linker (2^26)
- The provided db/item_db.txt and sql-files/item_db,sql are already updated
- with all the necessary changes (all equipable/usable items have their
- upper set to 7)..
- - Lupus, Nexus, get working on updating the item_db.
- * Made FrostJoke/Scream work the same way out and inside woe grounds.
- [Skotlex]
- * Corrected Grand Cross Damage [Skotlex]
-2005/10/07
- * Took out Lighthalzen's noteleport mapflag. Added it by accident. [Nexon]
- * Some commented code cleanup and help.txt update [Foruken]
- * Applied Draco's fixes to battle_calc_magic_attack. [Skotlex]
- * Modified @showexp and @showdelay so they will work as people would expect
- them to. [Skotlex]
- * Figured out what ## variables are, and documented it on
- doc/script_commands.txt [Skotlex]
- * Foruken pointed out that the actual script problem was a certain
- acalloc() that was changed to realloc(), so undid the last revert and
- reverted this one instead. [Skotlex]
- * Fixed a char-sql issue where character variables seemed to be saving
- incorrectly. [Skotlex]
- * Removed a free() that was added on R3421 that was supposed to fix a
- memory leak but instead causes crashes :/ (so the memory leak is back in
- there, but no more crash) [Skotlex]
- * Applied End of Exam's script engine patch. [Skotlex]
- - This adds support for nested blocks, if/else, fors, switches. See
- <http://eathena.deltaanime.net/board/index.php?showtopic=50037>
- for more information. Note that he admits it is not fully tested, so be
- careful when trying out the new commands!
-2005/10/06
- * Some corrections to the script engine, should fix a few memory leaks.
- [Skotlex]
- * Minor corrections to the screen output of the char_sql server when
- saving. [Skotlex]
- * Corrected authorisation issues in msg_athena.conf [Skotlex]
- * Updated Wand of Hermod [Skotlex]
- - Can't amp out of it.
- - Affects everyone
- - Only prevents people from casting supportive skills.
- * Fixed mobs not doing their "rude-attacked" skill. [Skotlex]
- * Corrected casters being able to walk during Wand of Hermod [Skotlex]
- * Made Guild Recall be usable outside of WoE. [Skotlex]
- * Changed the default gvg_traps_target_all to yes. [Skotlex]
- * Changed the default for copyskill_restrict to 2 (cannot copy advanced
- skills) [Skotlex]
- * Added a bunch of code related to the 2nd job quest skills and Tae -second
- classes skills, as provided by Draco and acquired from jA [Skotlex]
- * Merged Draco's implementation of battle_calc_magic_attack. [Skotlex]
- * Modifications to the mob AI to more accurately use Range2 (mob's sight
- range) and Range3 (mob's chase distance ability) [Skotlex]
- * Cleaned up item_db.txt, updated sql-files/item_db.sql to match. [Skotlex]
- * Added logarithmic drops support for TXT itemdb loading (how could I had
- forgotten that?) [Skotlex]
- * Added battle options item_rate_treasure, item_drop_treasure_min,
- item_drop_treasure_max, these override all other rate options when it comes
- to Treasure box drops. [Skotlex]
- * Cleaned up battle_athena.conf regarding drop rates. mvp_item_rate has
- been changed to item_rate_mvp. [Skotlex]
- * Implemented Maya Purple card effect (you can see any hidden mob). Thanks to jA [Lupus]
- * Updated functions: pc_calc_base_job,pc_calc_base_job2 [Lupus]
- - They return 24:Taekwon, 25:StarGladiator, 27:Soul Linker
- Now someone should UPDATE Job fields of item_db.txt for TK,SL,SG classes
- then I'll remove ugly hardcoded "temp plug" from pc_isequip function
- [Item_DB JOB field note]: We don't check Knight2,Crusader2,Star Gladiator2 bits,
- so don't set them.
- In other words we use only these bits:
- 0-Novice,1-Swordman,2,3,4,5,6-Thief
- 7-Knight,8,9,10,11,12-Assassin,14-Crusader,15,16,17,18,19,20-Dancer
- 23-Super Novice
- 24-TK,25-SG,27-SL
- Don't ever use other bits e.g. for Advanced classes. It's useless
- * Added Poring Box logs (into dead branch logs)
-2005/10/05
- * Updated nomemo and noteleports for Lighthalzen/Einbroch/Einbech maps and others. [Nexon]
- * Fixed the mob AI. [Skotlex]
- * Updated alchemist_summon_reward [Skotlex]
- - Summons now never give exp, and they may drop items according to setting:
- 0: Never drop items
- 1: Only Marine spheres drop items (default)
- 2: All summons drop items.
- (maybe a different battle option can be made to make summons give exp?)
- * Simplified the Grand Cross code. [Skotlex]
- It is now entirely a magical attack with extra damage of the form base
- atk * skill% - armor def% - vit def. Note that weapon properties won't
- apply now as well as many of the offensive cards (those that do not apply
- to both magic and weapon attacks, that is), and the def penalty from
- having many mobs targeted on one is not applying neither (so the full
- def is being taken into consideration). Report any corrections further
- needed.
- * Cleaned up, organized and improved somewhat the mob ai code. [Skotlex]
- (update and test at your own risk as I can't test it currently)
- * Some corrections to the way the guild master's name is updated during a
- gm change. [Skotlex]
- * Added a check to avoid saving negative durations for status changes. [Skotlex]
- * Added a check to avoid loading status changes with negative durations
- (the walk freeze problems seem related to timers and sc_data loading, so I
- am shooting in the dark here at possible problem sources) [Skotlex]
- * Various cleanups to ensemble related code, Longing For Freedom may be
- working now. [Skotlex]
- * Added the water levels to ayo_dun01, gon_dun01 and lhz_dun03, thanks to
- Master of Muppets [Skotlex]
- * Made Autocounter trigger autospells (was not doing so because it's NK
- defines it as a no-damage skill) [Skotlex]
- * Some cleanups on the mob slave AI code. [Skotlex]
- * Added battle config retaliate_to_master, defaults to yes. [Skotlex]
- - Why? Because in official, summoned mobs are not attacked by other mobs
- (speaking about alchemists), if you set this to no, then mobs will
- retaliate against the summon (both @summon and alchemist ones).
- * Some fixes to the way the guildmaster flag is being set and checked. [Skotlex]
- * Made the skilllv be 1 if the client sends less than that (this is why
- active guild skills were not working. For some reason the client was
- sending a request to do the skill at level 0!) [Skotlex]
-2005/10/04
- * Likely fixed Aeterna + Soul Breaker/Destroyer. [Skotlex]
- * Some cleaning of the mob ai. May help with some of the current exploits.
- [Skotlex]
- * Corrected Mob_ai code to make supportive mobs properly gang up on
- summons. [Skotlex]
- * Moved the plagiarize code to execute it before dealing damage (because on
- WoE you are auto-restored when you get killed, hence the player was 'alive'
- and it would copy the skill when killed by it on WoE) [Skotlex]
- * Fixed Classical Pluck blocking AoE spells. [Skotlex]
- * Updated Spider Web code to not retrigger if already trapped by one
- (needed because spider webs can now stack) [Skotlex]
-2005/10/03
- * Fixed a mistake with my last fix. [Kevin]
- * Fixed often occurring memory leak in clif.c. [Kevin]
- * Made NPC_DARKCROSS work (it's just a copy of Holy Cross with dark
- attribute) [Skotlex]
- * Removed resetting the manner when a player is saved. [Skotlex]
- * Cleaned up map reading code to make it remove maps that could not be
- loaded. It prevents crashes related to maps that weren't correctly loaded
- on startup. [Skotlex]
- * Fixed Endure to make it add armor mdef. [Skotlex]
- * Small fixes to updating the guild master's name during a guild master
- change. [Skotlex]
- * Some corrections to the mob ai to enable mobs to attack other mobs
- (summoned ones, of course) [Skotlex]
- * Updated autotrading so that the char will close the shop and quit the map
- server automatically when there's nothing left to vend. [Skotlex]
- * Added checks to prevent a char from joining/creating multiple chat rooms
- (anti-crash fix, it is). [Skotlex]
- * Cleaned up and restructured the mob item drop code. It also fixes a
- possible crash during the autoloot check. [Skotlex]
- * Reupdated Wind Walk to add +5% flee bonus... AGAIN. [Skotlex]
-2005/10/02
- * Fixed STEAL issue. [Lupus]
- - Any Mob has 10 drop slots. If we pick an empty one, then we check previous slot, until we find a slot with an item.
- Then we apply STEAL FORMULA for the item. (During the tests I managed to steal 2 poring cards 8)
- If a mod doesn't have any slots then STEAL fails.
- - Possible exploit: If a mob (e.g. NEW MOBS) has only one rare drop, then STEAL would always try to steal that the only slot 8)
- How to fix: I suggest to fill other empty slots with Jellopies or Apples with zero chance.
-2005/10/01
- * Expanded NPC shop log info of sold items (cards, refine, etc) [Lupus]
- * Fixed compile errors in converters [celest]
- * Updating built-in zlib to 1.2.3 [celest]
- * Added unzip functions to grfio.c [celest]
- * Finished Fusion AF2 maps support - just put the .af2 files in the
- afm folder and start the map server as usual [celest]
- NOTE: It will need a new unzip library, so do 'make clean', or delete
- 'Makefile.cache' before recompiling!
-
-2005/09/30
- * Updated the slave warp code. Now when a master recalls their slaves,
- these will be placed 'randomly' around the master in an area_size/2 range.
- [Skotlex]
- * Cleaned up the mob link (supportive mode) code to prevent wasting time
- trying to link friends every 100ms. Now the interval for linking friends is
- MOB_MINLINKTIME (1 sec currently) [Skotlex]
- * Updated mob code so when a mob hits another, they set their 'attacked id'
- to the mob in question, and not the mob's master. [Skotlex]
- * Some cleaning up of the Taekwon stance skills. Added a attack delay when
- they trigger (same way as triple attack delays your continous attack) [Skotlex]
- * Modified the range check in skill_use_id/skill_use_pos so that if you try
- to use a skill while moving, it will change your path to move one cell towards the
- target before casting (as long as you are within one tile of being in
- range). [Skotlex]
- * Moved the bleeding reduction formula to status_change_start, modified the
- formula to be (lv/5+vit)% reduction. [Skotlex]
- * Fixed the blind duration reduction formula. [Skotlex]
- * Upgraded Meteor Assault so you can specify the duration of
- blind/stun/bleeding independently in skill_cast_db.txt [Skotlex]
- * Made TK_JUMPKICK share the same code as Ashura Strike (just to see what
- happens, both seem like they behave the same way, no?) [Skotlex]
-2005/09/29
- * Some tweaks and fixes around status.c, may fix the timer mismatches of
- status_change_timer. [Skotlex]
- * Fixed a memory leak regarding pet status recovery scripts. [Skotlex]
- * Added timestamp support. Set timestamp_format to whatever you want, and
- it will print a timestamp in said format before every Show* message. They
- can be set independently for each server (defined at login_athena.conf,
- char_athena.conf and map_athena.conf). Default is using no timestamps. [Skotlex]
- * Modified the new auth login system to take into consideration when the
- client tries to connect before the character data arrives from the char
- server. [Skotlex]
- (seems to work well, but could use more testing)
- * Corrected the description of the 'skill_add_range' switches and made them
- default to 5. Still pending further tuning (the official value of these
- switches should have is still unknown) [Skotlex]
- * Added Demonstration to list of skills affected by
- 'gvg_traps_target_all' [Skotlex]
- * Likely fixed Firepillar triggering multiple times when many characters
- step unto it. [Skotlex]
- * Increased the damage delay randomizer to be +/-10% rather than +/-5%, may
- fix 'stun-lock'. [Skotlex]
- * Added Consumable items log into pick_log [Lupus]
- - You can see logs when someone uses items (boxes, potions, etc)
- * Added AtCommands/CharCommands items deletion/creation log into pick_log [Lupus]
- * Removed some of the unnecessary verbose messages from the char server
- during data saving. [Skotlex]
- * Added the new "online check" system (more of a fixing of a system that
- was already there but was half working) [Skotlex]
- it is turned on/off by using the online_check config options for the
- login and char servers.
- - char server: When the check is on, players are kicked out of the char
- server when their character is already online, and the map servers are
- instructed to kick the account out as well. If there's no reply from the
- map servers, the char is automatically set offline after 15 secs.
- - login server: When the check is on, players get "rejected from server"
- when the account is online already, and afterwards the char servers are
- told to kick that account out (like in the first case), if after 30 secs
- there is no reply from the char servers logging off the account, the login
- server sets it offline on it's own.
- - The checks are by default on as they are meant to prevent possible
- exploits on multi-map servers.
- - However, I have not figured out where exactly a char server gets to know
- that a player has changed map-servers, so this could cause trouble in said
- enviroments until I figure it out (it won't go out of sync forever since
- the map servers do update their list of online characters every then
- seconds) :/
- * Fixed crash, related to STEAL logs [Lupus]
- * Added TXT logs for Pick_log [Lupus]
-2005/09/28
- * Added 'scripts items operations' and 'vending' into pick_log: [Lupus]
- Tested with refine, getitem, getnameditem, removecards, etc commands. They are all supported.
- Now you can see if a player breaks his armor in NPC Cards Remover, etc.
- You can track down any item within a single DB.
- You can make a SQL query to find which items are most popular, which quests are most popular, etc
- Of course, it could help you to find your local items exploits, cheaters and unfail admins ^_-
- - Added 'Autolooted' and 'Stolen' items into pick_log
- - TODO: Add TXT logs
- * Fixed JobMaster NPC. Thanks Amada [Kayla]
- * Removed card-fix flag from Cart Termination. [Skotlex]
- * Updated battle_check_target so that a mob will consither another mob an
- enemy if either one has special mob ai (is a @summon or summoned alchemist
- mob). Summons from the same master should not be attacking each other,
- however I do think they will attack summons from another player. [Skotlex]
- * Removed 10 chances to pick an item from STEAL skill (it should have only 1 chance) [Lupus]
-2005/09/27
- * Corrected again Wind Walk. Just +5 flee at lv10, walk bonus does not
- stacks with other speed giving skills. [Skotlex]
- * Corrected Wind Walk's walk and flee bonus (walk was a +4*skill_lv%
- increase! and flee was +5 flee, rather than +5% flee of your total).
- [Skotlex]
- * Added atcommand @changeleader, transfers the leadership of a party to
- someone else. [Skotlex]
- (defaults as a GM-level 10 command, not quite yet tested)
- * Added delitem2 script command with script sample by Mihilion [Lupus]
- * Removed the check that prevented chars from logging out during status
- changes, as the current system should save and restore these correctly.
- [Skotlex]
-2005/09/26
- * Fixed MAX GUILD capasity in mmo.h to allow correct +6 Guild Extension [Lupus]
- * Changed back the TIMER_MIN_INTERVAL to 50. Who changed it back to 25?
- (svn3015 skotlex: Changed TIMER_MIN_INTERVAL to 25 (from 10), it probably needs to be bumped even higher, awaiting results from testers to see if a higher value would be needed.
- svn1284 lupus: timers optimization / speed up / bug fix : no freezing mobs [TIMER_MIN_INTERVAL: 50->10])
- (note to self: make this a setting in inter_athena.conf) [Skotlex]
- * Guild Extension now adds 6 per level. [Skotlex]
- * Added define ENABLE_SC_SAVING in common/mmo.h, comment/remove this line
- to disable saving of status changes (temporary measure) [Skotlex]
- * Updated Double Casting to only work on Firebolt, Coldbolt and
- Thunderbolt. [Skotlex]
- * Fixed cloaking/hiding. [Skotlex]
- * Updates to status_change_start, scdata loading now should display on the
- targetted player. [Skotlex]
- * Removed card modifiers from Meteor Assault. [Skotlex]
- * Corrected skill_out_range_consume so that spells effectively fail if the
- target goes out of range. [Skotlex]
- * Another another check on the new auth system which may help prevent
- exploits. [Skotlex]
- * General cleanup and code improvements needed because of the new auth
- system. [Skotlex]
- * Fixed a bug in the new auth system (TXT) which was causing the gender to
- be pretty much randomly sent. [Skotlex]
- * Fixed a bug in changesex at the TXT char server level. [Skotlex]
- * Updated new logging system. Now logs TRADE, NPC Shops [Lupus]
- * Fixed a possible exploit in the new auth system. Thanks to End of Exam
- for the information. [Skotlex]
- * Corrected True Sight critical bonus. [Skotlex]
- * Water Ball will now do the full number of hits regardless of available
- water when used by non-players. [Skotlex]
- * Changed the emoticon delay to 1 second. [Skotlex]
- * Zeny/item kill bonuses now work on all skills, and not just physical
- weapon attacks. [Skotlex]
- * Added official Ayothaya Town script by MasterOfMuppets [Lupus]
- * Added new Players / Monster Drops / Pickups Logging system [Lupus]
- - Changed new log table, now it has field 'type':
- M = Monsters Drop, P = Players Drop/Take, L = Mobs Loot Drop/Take, T = Players Trade Give/Take,
- V = Players Vending Sell/Take, S = Shop Sell/Take, N = NPC Give/Take
- NOTE: 'looted drop' might has cards, refine, etc. 'common drop' has item w/o cards/refine
- - Now you can see Players(cheaters) passing any items w/o trade
- - Now MOBS+PLAYERS drops come in the same table (easy to query)
- Poring -5 Apple
- Zelgadis +5 Apple
- - You can tell off monsters by their LOW id. < 2000~
- - Negative value of AMOUNT shows that a mob, or a player has dropped that items amount
- - Positive value of AMOUNT shows that a player has pickedup that items amount
- - It works 5x faster than old DROPLOGS
- - TXT logs don't work yet
- - TODO: Add Autolooted & MVP items in the log, too.
- - TODO: Add Mobs Looters DROP items in the log. (Now only attacked mobs log loot drops)
- - TODO: Add Scripts/Vending logs
-
-2005/09/25
- * Modified battle_weapon_delay so that additional status effects are
- invoked even if the attack does no damage, as long as the attack connects
- (that is, it is not a miss/lucky dodge) [Skotlex]
-2005/09/24
- * Updated several mob stats for the Lighthalzen and later mobs from the
- data provided by Viccious Pucca. [Skotlex]
- * Updated sql-files/mob_db.sql to contain the most recent mob_db. [Skotlex]
- * Added support for saving/loading status changes when characters log
- in/out. [Skotlex]
- - TXT users: the file used by default is scdata.txt, can be changed by
- setting scdata_txt to something else in inter_athena.txt.
- - SQL users the table used by default is sc_data, can be changed by setting
- scdata_db to something else in inter_athena.txt. Use upgrade_svn3273.sql to
- generate the new table.
- - It is currently unknown the behaviour of restoring some status changes,
- if any anomality shows up, do report.
- - Currently, even thought the sc data is restored, the client does not
- receives the packet telling them that the effect started (like Gloria, you
- can see you have +30 luk, but the message is never there) nor the visual
- effects are in neither. This is a side effect of starting the status
- effects on a player before the client finished loading the maps and spawns
- in the map. Will be fixed later.
- * Some memory optimizations tothe new auth system. [Skotlex]
- * Moved the charsave_method config to inter_athena.txt [Skotlex]
- * Fixed Demonstration/Bomb getting 100% breaking chance on low skill break
- rates [Skotlex]
- * Fixed chars being able to cast skills while rooted if they didn't have at
- least root lv1 [Skotlex]
- * Removed Assert in pet_walk, use a less unstable debugging tool, causes
- errors in remote shells. [Kevin]
- * Fixed TXT char login with new auth system. [Kevin]
- * Done: Adjustable players titles for @who, @who2, @who3 commands [Lupus]
- - Check msg_athena.conf for new lines
-2005/09/23
- * Software Caused Connection Abort errors will now cause said socket to be
- removed inmediately from the listening list of sockets, this may help with
- the lag issues that arise when said error occurs. [Skotlex]
- * Fixed Demonstration having 100% breaking chance if you set skill breaking
- chance to 0. [Skotlex]
- * Swapped functions of @who and @who3 commands. Because it's a spoil [Lupus]
- to show players locations. You may enable @who for your common players now.
- there's a shortcut for @WHO: @W
- * Started adding adjustable players titles for @who, etc commands [Lupus]
- - e.g. Super Player, GM, GM+, etc
-2005/09/22
- * Updated sql-files/item_db.sql to have the most current version. [Skotlex]
- * Finished first part of new auth system, fully tested. Will reduce char->map
- lag by whatever it is you are haveing. [Kevin]
- * Added consideration of GrandDarkness in various code sections that were
- only checking for Grand Cross [Skotlex]
- * Deployed use of map_getallusers all over the map server where it makes
- sense to include disconnected players. [Skotlex]
- * Corrected map_getallusers to depend on the actual count of players in the
- db rather than the variable users (prevents possible crashes if the two
- differ) [Skotlex]
- * Updated the player counting function so that it correctly accounts for
- all players (including those not connected like in autotrade) [Skotlex]
- * Characters will now automatically stand if Soul Drain is triggered while
- sitting. [Skotlex]
- * Set default option gvg_traps_target_all: no [Lupus]
- - In kRO it used to be 'yes' some time ago but has been reverted back to 'no'
-2005/09/21
- * Corrected an error in the way guild alliances were being counted, as
- pointed out by Viccious Pucca. [Skotlex]
- * Fixed and deployed map_getallusers() on atcommands @who, @who2, @who3.
- [Skotlex]
- - This function should enable the aforementioned commands to work even on
- players who are in the server but are not connected (eg: autotrade
- players). It is temporarily only deployed on the @who functions pending on
- feedback (bug reports, anything) before going ahead and implementing it on
- all relevant atcommand/charcommand/script functions.
- * Replaced the trim() function with Furoken's implementation (it should
- remove tabs, consecutive spaces and other such unwanted characters from a
- char's name) [Skotlex]
- * Updated doc/script_commands.txt to explain the upper parameter of the
- function jobchange. [Skotlex]
- * Corrected sql query errors when logging trades and vending. [Skotlex]
- * Updated doc/script_commands.txt with the script commands I've modified
- or added that are not yet described within. [Skotlex]
- * Small fix to clif.c which corrects characters that can't log in again if
- they log out when the char and map server are not connected. [Skotlex]
- * Cleaned up all SQL error reporting. It now follows the same standard
- everywhere, and is followed by a debug line which includes the file, line
- number and contents of the attempted query which caused the error. [Skotlex]
- * Corrected an sql logs error when selecting a character with special
- characters (eg: single quotes) on it. [Skotlex]
-2005/09/20
- * Changed Palm Strike's initial animation display. [Skotlex]
- (it will show as a normal attack that misses instead of an skill, but at
- least the animation delay is correct and the skill can be chained now)
- * Adjusted Cart Revolution's damage to be based on the Cart's Max Weight
- (instead of the hardcoded 8000w value) [Skotlex]
- * Fixed a memory leak when pets cancel their casting. [Skotlex]
-2005/09/19
- * Added error reporting an item in the item_db.txt file has insufficient
- fields (rather than just crashing) [Skotlex]
- * Updated the item_db to use the new race and element constants. [Skotlex]
- * Fixed (I think) battle option muting_players. Defaulted it to yes. [Skotlex]
- * Added timers for displaying guildmates position. [Skotlex]
- - All the packet related code was already there by Valaris, so I wonder why
- this wasn't finished before?
- * Added battle_athena options max_def/over_def_bonus (read
- battle_athena.conf for desc) [Skotlex]
- * Added error reporting when the magreg file fails to be saved. [Skotlex]
- * Made berserk castable during the no-regen period when it expires. [Skotlex]
- * Fixed a query error on sql refine logging. [Skotlex]
- * General checks to the script engine string management. Should fix a bunch
- of memory leaks. [Skotlex]
-2005/09/18
- * More updates to status change IDs [DracoRPG]
- * Implemented TK_SEVENWIND, allowed simultaneous use of several stances, thanks to
- reddozen for all the info about that [DracoRPG]
- * Allowed to pickup/drop items while in Frenzy [DracoRPG]
-2005/09/17
- * Added a check that should prevent fighting against other guilds outside
- of WoE times. [Skotlex]
- * Hopefully fixed Hunter's Dectect skill. [Skotlex]
- * Fixed the packet issues on the char txt server. [Skotlex]
- * Miscellanous corrections to skill_attack. [Skotlex]
- * Corrected the AutoSpellWhenHit rate of all items in the db (TXT + SQL)
- [Skotlex]
-2005/09/16
- * Reverted some of the contents of skill_unit_move_unit_group since the
- previous algorithm was optimized. Walking during a Song/Dance should be
- smooth again. [Skotlex]
- * Rewrote the guild gm changing system. [Skotlex]
- - @changegm works now (tested in SQL, TXT should also be working)
- - Added script command "guildchangegm <guild id>,<new master's name>". Now
- go write some Guild Master changing npc if you want it to cost money, have
- a minimum guild level requirement, etc.
- * Added Ishizu's logarithmic drops equation. [Skotlex]
- (see battle_athena.conf for full details)
- * Added a sub-function call to clear Castle owners when their guild is
- broken. [Skotlex]
- * Added a char-server call to clear the alliance when a guild is broken
- (when a guild breaks, the alliance/opposition is removed from memory on the
- map server, so it seems said change is not sent/saved on the char-server
- side?) [Skotlex]
- * Added script function sc_start4, starts an status change with all four
- values. [Skotlex]
- Use: sc_start4 TYPE, DURATION, VAL1, VAL2, VAL3, VAL4, <target ID>
- * Added SC_ARMOR_ELEMENT/SC_DefEle, specifies elemental defense bonus
- against two elements at a time. For example:
- sc_start4 SC_DefEle, 60000, Ele_Fire, 20, Ele_Wind, -15;
- Gives 20% additional fire resistance and reduces 15% Wind resistance for
- 60 seconds.
- * Expanded battle_attr_fix to consider the status changes of the involved
- chars that affect elemental modifiers. [Skotlex]
- * Fixed some status effects not being correctly ended/recalculated when you
- stepped out of quagmire/song/dances. [Skotlex]
- * Made quagmire be affected by the "gvg_traps_target_all" battle switch. [Skotlex]
- * Added Bloody Branch log (along with Dead Branch) [Lupus]
-2005/09/15
- * The skill Vending will now fail on GM characters who do not satisfy the
- gm_can_drop level requirement. [Skotlex]
- * Updated the sql-files mob_db.sql and item_db.sql files to the current
- version (just feed'em to sql to have your item_db and mob_db tables
- updated). [Skotlex]
- * Now @allskill and it's ilk will give you ALL skills except the ones
- marked as "npc skills" (those have an inf2 value of 2). [Skotlex]
- * Some code optimization around song/dances, now the ensemble should be
- cancelled if you walk (or are knocked out or whatever) out of it.
- [Skotlex]
- * Added log support to N slots. Now all cards should be logged [Skotlex]
- - Note that I have not been able to test it yet, so report back any
- problems caused by it.
- * Fixed a memory leak when removing disconnected chars. [Skotlex]
- * Re-enabled the Memory Manager by default. [Skotlex]
- * Updated atcommand @rates so that it displays current exp rates in x form
- (eg: "Current rates: Base 4.5x, Job 8.0x") as suggested by Mellowz.
- [Skotlex]
- * Corrected resetskill messing up with Wedding Skills. [Skotlex]
- * Some adjustment to the status change defense (as per data provided by
- Viccious Pucca) [Skotlex]
- * VVVS weapons now give +50 damage instead of +40 (again thanks to
- Viccious) [Skotlex]
- * Success rate of making Star Crumbs now is 100% (regardless of skill
- level?) [Skotlex]
- * Couple of crash fixes on the map-server char saving method
- (char_save_method: 1) [Skotlex]
-2005/09/14
- * Yet another correction to SQL char saving. [Skotlex]
- * Added support for N slots. [Skotlex]
- - By changing the constant MAX_SLOTS in common/mmo.h, the server can be
- configured to support items with more than 4 slots. Saving/Loading and
- inserting of cards should be working correctly. Features still missing
- are including the extra slots in the log functions and updating clif.c to
- send the extra cards to the client (This is still work in progress).
- - SQL Users interested in using this, need to manually add columns card4,
- card5 and so on to the relevant tables (cart_inventory, guild_storage,
- inventory, storage), example query:
- ALTER TABLE inventory ADD COLUMN card4 int(11) NOT NULL default
- '0' AFTER card3;
- - TXT users need do nothing, the char server handles the
- expanding/contracting of slots internally (if the number of slots is
- shrinked, the additional slotted cards are lost)
- - Never set the amount of slots to less than 4, as they are needed for
- forged equipment.
- * Likely fixed Lex Divina. [Skotlex]
- * Likely fixed sql char-saving, too. [Skotlex]
- * Lex Divina can now be casted on allies as long as they are silenced.
- [Skotlex]
- * Fixed crashes on GVG grounds involving characters with no guild. [Skotlex]
- * Added a few socket features from Freya which hopefully will help
- stabilize eA on Windows (testing needed!) [Skotlex]
- * Miscellanous fixes and rewrites to memitemdata_to_sql, it'll probably
- fixed the stackable named items duplication exploit. [Skotlex]
- (note that it is not tested, so there's the chance I broke everything
- instead, so upgrade for testing purposes only and report back!)
- * Changed HP/SP drain rates so that the max (100%) is 1000. Adjusted item
- db accordingly. [Skotlex]
- * Disabled chars from muting themselves (as a temporary measure against the
- mysterious "don't use bot!" message) [Skotlex]
- * Added atcommand logging for /monster and /item (not quite tested yet, but
- I think it'll work) [Skotlex]
- * Changed autospell rates so that the max (100%) is 1000. Adjusted item
- database accordingly. [Skotlex]
- * Reverted displayed heal value. [Skotlex]
-2005/09/13
- * Fixed Basilica [Skotlex]
- * Rewrote the mechanics of how Devotion works. [Skotlex]
- * Updated Heal so that it displays on-screen the actual amount that was
- healed. [Skotlex]
- * Changed the damage motion equation to 1/4th of what it was before (now
- using player_damage_delay_rate: 100 is what was player_damage_delay_rate:
- 25 in previous revisions) [Skotlex]
- * The login servers will now notify when a player has an account ID under
- 700000 (which won't let them connect to the map server) [Skotlex]
- * Added support for SC_BLEEDING in skill_counter_additional_effect &
- skill_additional_effect [Skotlex]
- * Changed bonuses bAtkRate, bWeaponAtkRate and bCritRate to modify
- base+watk damage, not just watk. [Skotlex]
- * Corrected coma-effect killing bosses. [Skotlex]
-2005/09/12
- * Party even share code won't try to give dead players their share of the
- exp (since pc_gainexp would refuse so anyway) [Skotlex]
- * Added trim() usage to char servers to prevent creation of characters with
- spaces at the beginning or end of name. [Skotlex]
- (the client won't let me create chars with said names so I can't really
- test it, but on the very least valid names are not crashing it as far as
- I can see)
- * Expansion/optimization of the skill unit code. Now it should be correctly
- identified when a character walks into a skill cell, walks out of a skill
- cell, and walks out of the skill group (performance optimization,
- client-side: songs and dance effects will work correctly, and Quagmire
- won't spam "speed up/down" messages). [Skotlex]
- - Got basic testing only (casting, amp/encore, walking, being knocked back,
- warping), so report any problems found.
- * Bomb/Demonstration should now be cast-able under the Emperium. [Skotlex]
- * Acid Terror now knows ignores armor defense, but not vit defense. [Skotlex]
- * Added an official Bards Job Quest (check npc\changelog.txt) [Lupus]
-2005/09/11
- * Changed back the default of gx_all_hit to no. [Skotlex]
- * Added check to prevent ensemble skills from changing position. [Skotlex]
-2005/09/10
- * Removed the changing of targets for offensive songs in gvg grounds. [Skotlex]
- * Corrected Grand Cross not always hitting 3 times. [Skotlex]
- * Fixed the display of Auto Counter. [Skotlex]
- * Added check to prevent auto-spells from being casted when the source and
- target are the same (normally you can't hit yourself, though....) [Skotlex]
- * Fixed Root [Skotlex]
- * Fixed the issue which made mobs do nothing. [Skotlex]
- * Change Provoke to affect armor def of mobs, and vit def of mobs/players. [Skotlex]
- * Another change to autocounter, I think it will work now. [Skotlex]
- * Fixed Defender's aspd bonus. [Skotlex]
- * Fixed rooted character's root level (instead of using the caster's level) [Skotlex]
- * Windows builds will now abort and exit when there's a "Software Caused
- Connection Abort" error since it seems unrecoverable.. [Skotlex]
- * Reverted back my char.c/sql char.c changes 8) Have to re-check [Lupus]
- * Added official Louyang city (thanks to MasterOfMuppets), fixed some Kafra bugs [Lupus]
- check npc/changelog.txt
-2005/09/09
- * Fixed TXT/SQL char servers not reading properly their command line arguments [Lupus]
- * Refixed those compiler errors >.< [Skotlex]
- * Readded the damage delay to firewall. [Skotlex]
- * Added an extra db (pc_db) to hold players, it should speed up map_id2sd
- lookups. [Skotlex]
- (note that all functions which do a search on all connected players do a
- linear search on the connection sessions, and porting this to use the new
- system will take a pretty annoyingly long time)
- * Added checks to prevent dropped items from stacking (they can still
- stack, but at max 2 items per cell). [Skotlex]
- * Added Guild removing from memory upon guild break to Char SQL server
- (TXT already had this correctly) [Skotlex]
- * Changed Provoke to reduce armor defense, not vit defense. [Skotlex]
- * Likely fixed the direction check in Auto Counter. [Skotlex]
- * Removed the console functionality from socket.c (it was no good on the
- map server since that session is used on disconnected players), also added
- more checks to prevent parsing session 0. [Skotlex]
- * Added check to prevent skills from triggering auto-skills of the same id
- (prevents unlimited chain-reactions) [Skotlex]
- * General fixes to guardian spawning code. [Skotlex]
- (includes setting a timer so the Emperium gets it's guild data if not
- available at spawn time).
- * When the Emperium's guild is not found (in mob_spawn_sub, 5 secs after
- trying to spawn it) the Castle will be reset back to no guild owning. [Skotlex]
- * Fix to battle_check_target, should correct guardians/emperium [Skotlex]
- * Guardians will now be deleted if their guild is not found in
- mob_spawn_guardian_sub. [Skotlex]
-2005/09/08
- * Added filter into chat log. Check log_athena.conf for more info [Lupus]
- - Now you can turn off logs during WOE, etc
- * Made Musical Strike/Slinging Arrow work while in ensembles. [Skotlex]
- * Oops, fixed the compile error. [Skotlex]
- * Various checks to prevent trying to send data to disconnected players in
- clif_send [Skotlex]
- * Moved the auto-spell code from weapon attacks to skill_additional_effect
- and skill_counter_additional_effect. [Skotlex]
- - The autospells will trigger for all skills/normal-attacks except those
- with nk =1 (no damage skill) which is needed to prevent stuff like
- heal, traps or dances from triggering it.
- - Does not affect SC_HINDSIGHT triggered spells.
- - NOT properly tested as of yet, report any abnormalities and skills it
- should/should-not be working with.
- * Fixed the crash when attempting to target a Emperium. [Skotlex]
- * mob_spawn_guardian will now 'retry' to load the guild data five seconds
- later if the guild info is not available at spawn time. [Skotlex]
- * Fixed disconnected chars appearing as GMs on the console. [Skotlex]
- * clif_send_sub won't try to send any data to disconnected chars now. [Skotlex]
- (may fix possible buffer overflow crashes)
-2005/09/07
- * According to the patch, enabled Butterfly wings in the Castles [Lupus]
- * Adjusted MAX_GUILD constant according to Skotlex's changes [Lupus]
- * Now when the castle owner guild id is loaded, and the guild is not in
- memory, the map server will request it right away from the char server. [Skotlex]
- * Corrected Guild Extension to be +4 to the max guildmates per level. [Skotlex]
- * Changed the default max vending value to 1 Billion [Skotlex]
- * Inverted meaning of pvp_noguild and pvp_noparty flags. the default then
- for all maps where they are not set is: You can't attack parties/guildmates
- on pvp maps. [Skotlex]
- * Updated mapflag/pvp_noparty to mark only the gvg arenas. [Skotlex]
- * Added mapflag/pvp_noguild, by default includes all pvp arenas. [Skotlex]
- * Cleared up some of the warning messages on mob_spawn_guardian. [Skotlex]
- * Fixed the compile error on skill.c... [Skotlex]
- * Changed offensive song/dances target to BCT_ALL when invoked in pvp/gvg
- grounds. [Skotlex]
- * Added unit flags UF_NOMOB, UF_NOPC to give better control on who gets
- affected by ground skills [Skotlex]
- * Fixed the possible crash in map_foreachinpath. [Skotlex]
- * Removed the error message in mob_guardian_changeguild when the new guild
- has ID 0, the mob will just be removed instead. [Skotlex]
-2005/09/06
- * Changed Assumptio to target all players around target. Mobs are no longer
- affected. [Skotlex]
- * Fixed battle_check_target fails on guild-mates in pvp maps. [Skotlex]
- * Reverted battle_check_target to prevent floras from hitting themselves
- until a better scheme can be thought of. [Skotlex]
- * Reorganized battle_weapon_attack to allow counter/root from blocking
- autotriggered skills (like TripleBlows/Sacrificial Ritual) [Skotlex]
- * Fixed that crash on mob_spawn_guardian. [Skotlex]
- * Added battle option gvg_traps_target_all, defaults to yes for now. [Skotlex]
- * Added Zoc's fix to @autotrade (which made traders unable to login again..
- ever) [Skotlex]
- * Massive Guardian update. [Skotlex]
- - Rewrote the guardian stat-passing system to minimize the need of db
- lookups. Should greatly reduce the heavy lagging during WoE.
- - Not properly tested (lack of resources), update at your own risk AND
- PLEASE report any crashes/problems.
-2005/09/05
- * Fixed Endure. [Skotlex]
- * Fixed Harmonic Lick not adding status change resistant. [Skotlex]
- * Moved ensemble stats calculating from status_change_start to
- skill_unitsetting (performance purposes) [Skotlex]
- * Fixed song/dance effects lasting 30 secs rather than 20. [Skotlex]
- (still somewhat inefficient, needs better handling method)
- * Battle check target fix: Novices/Low levels being unable to target mobs. [Skotlex]
- * Temporarily made traps not target allies on gvg (Still up for dabate) [Skotlex]
- * Battle check target update: Summoned creatures won't be checked versus
- their master, means you should be able to target them as if they were
- normal enemies. [Skotlex]
- * Made Shield Chain long ranged (it has to be affected by pneuma/defender). [Skotlex]
- * Fixed both trader/seller not being saved when using autotrade. [Skotlex]
- * Added debug messages to figure out who is causing the rain of function
- mismatches on deleting skill_timerskill. [Skotlex]
-2005/09/04
- * Fixed Trade Bug (when Trade Window indication was wrong). Thanks to k3dt
- * Now Water Ball isn't affected by RAIN mapflag anymore. Also corrected
- caclulation of number of WB shots (was broken by a typo) [Lupus]
- - Rain has been removed from kRO long ago.
- * Now Safety Wall fails to protect against Acid Terror. [Skotlex]
- * Added battle_config option firewall_hits_on_undead (defaults to 1) [Skotlex]
- The deal is that each time the skill triggers on an undead, this number
- of hits will be dealt instead of just one.
- PROs: With a value of 5 or so, vertical firewall will work completely.
- CONs: A high value means the whole tile can be wasted killing a single mob.
- * Fixed working stealing with NOLOOT mapflag on. Thanks 2Lorky [Lupus]
- * Now Knockback won't work when the target is already dead (prevents
- ghosts) [Skotlex]
- * BSS now targets every player in the area of effect (might be updated to
- include mobs pending on further information) [Skotlex]
- * Acid terror is now considered a ranged attack. [Skotlex]
- * Crash fixes to the npc-whisper system. [Skotlex]
- * Fixed classchange-able Emperium/Guardians/Treasure Boxes, thanks to alsimons [DracoRPG]
- * Fixed songs/dances, updated Hip Shaker [DracoRPG]
- * Fixed some fields in sql-files\main.sql... Who the hell added back `broken`? The field
- `attribute` is the good one! Also changed `fame` type to the same as `zeny` (same max
- value in the source code, so samemax value in the SQL saves !) [DracoRPG
- * battle_check_target update: Fixed BCT_NOENEMY checks. [Skotlex]
- * Moved Mental Sensing bonus from pc_gainexp to mob_damage, it is now a
- status effect which the mob itself needs to be inflicted with to take
- effect (and everyone involved in killing it will benefit) [Skotlex]
- * Pets now won't move while casting (unless their master is like a screen
- away or so) [Skotlex]
-2005/09/03
- * Fixed speed calc for pushcart/stalk/dancing/singing. [Skotlex]
- * Some crash-fixes introduced by the rewritten status system. [Skotlex]
- * Adjusted the default gvg penalty values, added gvg_flee_penalty. [Skotlex]
- * Fixed skill_blown causing a dangling pointer in the map data. [Skotlex]
- (I believe this is the actual cause of all the crashes as of late)
- * Fixed @autotrade venders not being saved after they sell an item. [Skotlex]
- Now both characters are saved to prevent exploits, too.
- * Fix to mob_setdelayspawn, if lucky might help with the crashes as of late. [Skotlex]
- * Added status effect SC_WATK_ELEMENT, converts part of your weapon attacks
- into a different element. Used in magnum break to give 10% fire damage
- bonus to your attacks. [Skotlex]
- * Made firewall hits not have any "damage delay", it merely knockbacks. [Skotlex]
- * battle_check_target update: added novice/low-level pk prevention on
- pk_mode [Skotlex]
- * testing new SVN location [MouseJstr]
-2005/09/01
- * Entirely rewrote status_calc_pc and status_get_[stat] functions to have a clear code.
- They all use shared status_calc_[stat] functions to handle SC effects, this will avoid
- to have 2 almost identical codes in different places for those effects [DracoRPG]
- --> It compiles, it runs, it seems to work but I couldn't perform any extended testing
- as always, feel free to report bugs ;)
- * Added battle_option "slaves_inherit_speed" to decide whether slaves have
- or not the same walk speed as their master. Defaults to yes. [Skotlex]
- * Removed val4 from song/dances so that they won't be as bugged anymore.
- (still pending on Draco's status update, but at least now stuff like Poem
- of Bragi shouldn't cause insta-cast) [Skotlex]
- * Changed the way song/dance status effects last. The first time you step
- in a tile the status starts for 30 secs, not refreshed until it times out.
- Not the way it really should be, but it's much better for performance
- issues.
- * Fixed summoned slaves having the same walk-speed as their master (fixes
- metamorphosis-hatched mobs from having an egg's speed). [Skotlex]
- * Added fix_timer_heap, should correct timer problems when the tick
- overflows. Does it works? We'll find out in 48 days when the next
- loop occurs. [Skotlex]
- * Another update to battle_check_target [Skotlex]
- (Should fix slave-skills hitting a slave's master)
- * Corrected magic_damage_return code being double-invoked. [Skotlex]
- * clif_GM_kick will now invoke map_quit if the player doesn't has a session [Skotlex]
- (this should fix @kick and other such commands on autotrade chars and the
- like)
- * Fixed pc_damage/mob_damage returning 0 instead of damage dealt (which in
- turn made all attack/skills not trigger their additional effects) [Skotlex]
- * Updated Assumptio to target everyone instead of "not enemies" [Skotlex]
- * Fixed a fatal dangling pointer in the mob_setdelayspawn when handling
- mobs that don't respawn. [Skotlex]
- * Updated WE_CALLPARENT to not check for range (as it should?) [Skotlex]
- * Added flag accreg_dirty to identify when account variables have not been
- saved yet, it'll retry then on every call to save the character (it will
- prevent account variables from being lost when the char/map connection is
- not established)
-2005/08/31
- * Updated @npctalk to work as it should [Skotlex]
- - Usage @npctalk NPC Name, Your Message Goes here
- * Fixed Wind Walk's flee/speed bonus (as pointed out by Viccious Pucca). [Skotlex]
- * Fixed a crash in pc.c when the last save point was not found (thanks to
- Foruken) [Skotlex]
- * Rewrote map_foreachinpath, it should work mostly right now. [Skotlex]
- (the path 'stops' at the destination point rather than keep going
- forward, but it can probably be fixed later)
- * Moved battle_config spawndelay adjustments from mob.c (calculating it
- each time they were killed) to npc.c (calculate it once during parsing).
- [Skotlex]
- * Synchronized additional status effects with the delayed damage [Skotlex]
- (this should fix eg: enemies freezing when you start the attack
- animation, and then breaking the ice when your attack animation finishes
- and the damage shows up)
- * Moved knockback to effect after damage is applied. [Skotlex]
- * Fixed the Wedding Skills not displaying the actual amount healed. [Skotlex]
- * Moved skill induced status effects to take effect before knock back. [Skotlex]
- * Refixed "Don't Forget Me" [Skotlex]
- * Changed 'pet_hair_style''s description and default value to 100 [Skotlex]
- (100 is the value being reported to work with current clients)
- * Fixed Freeze 'counter' not resetting when killed. [Skotlex]
- * Fixed Endure adding to mdef2 instead of mdef. [Skotlex]
-08/30
- * Fixed Breaker's magical part of the damage having element -1 [Skotlex]
- (now it takes neutral element, because I don't think the magical part of
- an attack can get the weapon's property)
- * Fixed Magic Crasher having the min/max values inverted. [Skotlex]
- * Updated "Don't Forget Me"/"Slow Grace" to last 20 secs after you step out
- of the dance-zone. [Skotlex]
- * Changed the default of defunit_noenemy to no, and added comments
- explaining what it REALLY does. [Skotlex]
- * Fixed perfect tableture's lucky dodge bonus. [Skotlex]
- * Updated slave ai code to let slaves wander freely on the screen (will
- wander as far as battle_config.view_area lets them) [Skotlex]
- * Splitted Char-sql status saving into status/status2, the later is for
- values that will seldomly change. [Skotlex]
- * Updated servers so that when the player changes dye or hair color, the
- char-server is notified and the guild_member data is updated on all map
- servers. [Skotlex]
- * Updated servers so they also report on sex change. [Skotlex]
- (altough this one I have no tested yet)
- * Changed bGetZenyNum/bAddZenyNum to be a bonus2 type [Skotlex]
- (eg: bonus2 bGetZenyNum 10, 30 <- Receive 10z per mob level on 30% of
- your weapon-based kills)
- * Added script function groupranditem(i), returns a random item_id from the
- specified item-group given. [Skotlex]
- * Changed bLongAtkRate bonus to be more card-like (works just like
- bLongAtkDef, except it's for attack) [Skotlex]
- * [SQL] Added Storage Items sorting by nameid. On loading. [Lupus]
- * Added GetItemInfo(Item ID,n) script function. Returns Buy/Sell Price, Def, etc [Lupus]
- added sample/getiteminfo.txt Tested, fully working!
- * Added ID#2258 Spiky Band(Sharp Headgear) to allowed equipment of Star Gladiator [Lupus]
- * According to the 23 Aug Patch added complete equipment check for 3 new classes. [Lupus]
- Now they can't equip forbidden items 8)
-08/29
- * Added battle config option pet_hair_style and defaulted it to 24 [Skotlex]
- According to information relayed by End of Exam, this should fix the new
- clients showing the sword cursor for pets (older clients will be the ones
- screwed instead, in said case you'll want to change pet_hair_style to 20)
- * Updated battle_check_target to take into consideration the special states
- killer/killable. [Skotlex]
- * Corrected the Fury Guardian Angel not giving +50 critical. [Skotlex]
- * Made mob_walktoxy fail when the mob is dead. [Skotlex]
- (may fix the phantom mob issue?)
- * Updated spawn parsing to identify small/big mobs. [Skotlex]
- Use the "event" field (last column, the one after the two spawn delays)
- to identify the mob's size: 2: small mob, 4: big mob. 1-2 is not used
- because a hella lot of plants/mobs already use 1 in it (even though eA
- completely ignores this value)
- * Inverted the meaning of mapflags pvp_noparty/pvp_noguild [Skotlex]
- When the flag is set, then you should NOT be able to hit your
- party/guild-mates on pvp grounds.
-08/28
- * Fixed demonstration/Bomb stacking. [Skotlex]
- * Fixed damage versus plants in BF_WEAPON attacks. [Skotlex]
- * Fixed the whole sqrtl mess. Thanks to Shinomori for clearing things up.
- [Skotlex]
- * Added new maps, thanks to Poki#3 [DracoRPG]
- * Switched SCs between two taekwon kicks to get the proper icon ^^ [DracoRPG]
- * Added the falling animation to TK_HIGHJUMP, but now the client doesn't refresh the
- position u_u [DracoRPG]
- * Reverted default option to allow anyone to plagiarize advanced skill (vicious or
- someone else - I can't remember xD - told me it was like this on kRO, but not yet on
- iRO) [DracoRPG]
-08/27
- * Fixed the cast-bar from autocounter not disappearing after triggering the
- skill. [Skotlex]
- * Updated battle_check_target to make marine spheres universal enemies, so
- anyone can attack them. [Skotlex]
- * Cleaned up item_db.txt (format, commas, etc), added status bonuses to the
- cooked foods. [Skotlex]
- * Updated sql-files/item_db.sql to match with the current contents of
- item_db.txt [Skotlex]
- (sql users just feed it to mysql, it will drop and recreate the table)
- * Fixed IDs for Taekwon-class : 4047 is Star Gladiator, 4048 is a second Star Gladiator
- (probably used for a "Superman-mode" flying sprite) and 4049 is Soul Linker [DracoRPG]
-08/26
- * Fixed being able to move during Encore skills when you did not need a
- partner. [Skotlex]
- * Fixed @reloadmobdb not properly erasing mob skills before re-reading. [Skotlex]
- * Updated/fixed effect of most dances & songs according to kRO's website and ragnainfo's
- very good Bard/Dancer Guide [DracoRPG]
- * Fixed Raging Trifecta Blows missing Emperiums, thanks to happylight [DracoRPG]
- * Changed the way short|long|magic_damage_return work : previously they gave 100% chance
- to return x% damage, now it is x% chance to return 100% damage (Maya and High Orc Cards
- should behave like this, I'm not sure for Orc Lord Card but it seems logical to be the
- same system...) [DracoRPG]
- * Fixed bonuses from Wind Walker, thanks to vicious_puca [DracoRPG]
- * I also reorganized the hit/flee calc in status_calc_pc to consider first absolute values,
- and then apply relative (percentage) modificators.. if you make a mix of both, it'll be
- completely fucked up, and be sure it won't be like on officials (although my system maybe
- isn't the good one neither...) [DracoRPG]
- * Some rewrites to client version rejecting code [Skotlex]
- Should eliminate lag when players try to log-on with a rejected client,
- however there's the chance they won't be receiving the "your client is
- not latest EXE version" message, and that's why the previous, laggy,
- implementation was used :/
- * Fixed Enchant Deadly Poison lasting forever after killed. [Skotlex]
- * Fixed the duration argument of @summon [Skotlex]
- * Now @summoned mobs will follow their master everywhere and that includes
- warping from map to map. [Skotlex]
- (why? Because I think that's neat, and will probably be needed anyway
- once Homonculus get implemented)
-08/25
- * Cleaned up mob_db.txt and updated sql-files/mob_db.sql [Skotlex]
- Sql users can just feed mysql the .sql file and it will delete and refill
- the table with the most updated db data.
- * Corrections to damage versus plants. [Skotlex]
- MAGIC and MISC attacks do 1 damage per hit.
- WEAPON attacks do 1 damage, display miss if they hit multiple times.
- * Instead of knocking back (which wasn't even working), characters that are
- stepping on an icewall will cause that tile of the icewall to 'die' [Skotlex]
- * Final damage equation update to Acid Demonstration. [Skotlex]
- (it still won't ignore the raydric card, but why that is official in
- itself is a big mystery)
- * Added status change for temporary boosts of stats, plus added the
- following constants (db/const.txt): [Skotlex]
- - SC_IncAll, SC_IncStr, SC_IncAgi, SC_IncVit, SC_IncInt, SC_IncDex,
- SC_IncDex
- - It hasn't been tested yet what kind of visual these will cause
- client-side.
- (Now someone go and write down the script for the food items xP)
- * Updated @summon to take a second parameter: duration. [Skotlex]
- eg: "@summon lunatic 40" will summon a lunatic that lasts 40 mins or
- until killed. Max duration is one hour.
- * Updated Some Mobs Spawns, Drops check npc\changelog.txt [Lupus]
- * Some toning down of the damage of Acid Demonstration (should /100, not
- /10) [Skotlex]
- * Likely fixed Blitzbeat from hitting neutral chars. [Skotlex]
- * Updated Acid Demonstration to be a MISC skill who's damage is (base_Atk *
- caster's int * target's vit /10) (half that on players). It's much more
- closer to official values than the previous ones... [Skotlex]
- * Corrected Pressure sapping SP even if you hide from it. [Skotlex]
- (isn't Pressure a holy attack from the grand god himself? How can a thief
- HIDE from his eyes? o.O)
- * Updated Acid Demonstration damage formula. It's still wrong, but at least
- it considers int and vit now. [Skotlex]
- Current dummy formula: (100 + caster's int + target's vit)*(number of hits)%
-08/24
- * Updated pet skills database. [Skotlex]
- * Some corrections to socket.c, should stop all the recent crashing... [Skotlex]
- * Added a case to knockback enemies if they somehow end up stepping into an
- ice wall tile [Skotlex]
- * Added checks to prevent walking, attacking or using skills while the
- storage is open. [Skotlex]
- * Added Lupus's mob skills for Einbroch mobs [Skotlex]
- * (almost) rewrite of the storage system. [Skotlex]
- Storages are marked dirty after an item is stored/retrieved from them and
- will not be marked clean until the char-server acks the save request.
- Upon map-server reconnection to the char, all storages that are currently
- closed and dirty are saved.
- * Synched chrif_save with the storage save functions when either one is
- open to further prevent exploits. [Skotlex]
- * Updated the mob_skill_db with Komurka's translation (Aegis -> eA) [Skotlex]
- The max permilliage (rate) is now 10000 = 100%
- * Various mob related summon/metamorphosis changes: [Skotlex]
- - Summon Mob/Slave's level is the total number of mobs to summon, when the
- skill definition offers multiple mobs, they are spawned in order
- (round-robin scheme).
- - Metamorphosis/Transformation level is the total number of mobs to
- multiply into. Uses the same criteria as summon mob and the original mob
- is deleted/killed (no loot drop). If the level is 1, then the mob transforms
- into one of the defined classes randomly.
- - Note that beyond code-proofreading and making sure it compiles, this
- has not been tested yet!
- * Added the bonus provided by the /doridori command to TK_HPTIME and TK_SPTIME. [Dralnu]
- Thanks to Duduc.
- * Updated battle_check_target to check using the master instead of the
- slaves (applies for mobs/pets) [Skotlex]
- - Should prevent slaves from attacking their master
- * Implemented TK_HPTIME and TK_SPTIME exept the bonus provided by /doridori [Dralnu]
- * Implemented delayed character logout [Skotlex]
- How it works: When a player quits the server when they shouldn't (force
- disconnect before the 10 secs, or leave when the char server is not
- connected) his session is closed, but the player is left in-game just
- like in @autotrade, and a timer is added. Every 10 secs it'll check if
- the char server is online, and then save the character and delete it from
- the map server. NOT TESTED YET, so report any anomalies.
- * Fixed Shield Chain's skill-type (it's short ranged, not long?) [Skotlex]
- * Fixed Decrease Agility's equation. [Skotlex]
- * Fixed root'ed monks not being able to use root skills. [Skotlex]
- * Added inter-server option "kick_on_disconnect" (defaults to yes) [Skotlex]
- - The only people who may want to change it are overcrowded servers where
- the char/map server link breaks due to overload and then everyone is
- kicked out until said connection is reestablished.
- - Of course, use at your own discretion until all possible exploits
- caused by this are resolved.
-08/23
- * Fixed provoke's success chance. [Skotlex]
- * Battle_check_target update, should fix party/guild skills failing when
- checking against yourself. [Skotlex]
- * Updated map and char servers to allow them to reconnect without having to
- kick out all players. [Skotlex]
- - This is still experimental and what possible exploits may come from it
- are yet unknown (however, considering that the reconnection should take
- place in a few seconds after the disconnection...)
- - Note that storage contents and player contents are all kept in the map
- server's memory, unsaved data will be lost if player forces a
- disconnection, storage changes will also be lost if they are open/closed
- during said disconnection (and NOT reclosed after the connection is
- restablished)
- - These and more stuff might come up with time. Report away!
- * Updated Gospel to not buff up Guildmates, only Party members. [Skotlex]
- * Fixed @autotrade [Skotlex]
- (tested on a limited scenario with few characters, needs more testing.
- Test and report!)
- * Implemented TK_STORMKICK, TK_DOWNKICK, TK_COUNTER and TK_TURNKICK. [Dralnu]
- Note that at the moment if you use theses skills even if the corresponding
- SC is inactive, it will use SP and will stop you if you are attacking.
- Note too that because we don't know how it should work exactly, when a SC such as
- SC_STORMKICK will be launched, it will notice you by a little message over your
- head : Hit now !!. Finaly, TK_TURNKICK will not yet have the pushback effect.
- * Fixed everyone having 20 flee... I hope. [Skotlex]
- * Some corrections and updates to mob skill Metamorphosis [Skotlex]
- (don't know if it'll work now, but the way it was before definitely was
- not working)
- * Probably fixed infinite endure wearing out when being hit. [Skotlex]
- * Updated gvg range penalties to be as in official servers. [Skotlex]
- - Skills (weapon/magic/misc) get a 40% penalty
- - Ranged normal attacks get a 20% penalty, melee receives no penatly.
- (battle flag gvg_weapon_attack_rate added to complete configuration)
- * Added the -20 flee penalty on GVG grounds. [Skotlex]
- * Fixed Enchant Deadly Poison's Damage (it was 500% - 5x at level 5, not 400%
- - 4x) [Skotlex]
- * Fixed Soul Breaker's magical part of the attack taking element -1 rather
- than 0. [Skotlex]
- * Login sql server will now only clear sstatus data of connected servers
- rather than clean the table. [Skotlex]
- * Added some checks to prevent infinite looping in the char servers. [Skotlex]
- * Some updates to the way disconnections are handled in socket.c [Skotlex]
-08/22
- * Fixed typo in skill.c causing errors [Codemaster]
- * Added Irmin's recommendation to allow item names in getitenname() [Skotlex]
- (kinda odd to use an item's name to get the item's name, isn't it?)
- * Fixed Meteor Assault not displaying damage. [Skotlex]
- * Fixed WE_CALLPARENT crashing the map server when either parent is
- offline. [Skotlex]
- * Added TK_HIGHJUMP. Note : To be able to see properly the full jump animation,
- casting time will not depend on DEX. [Dralnu]
- * Somes fixes in skill_db.txt and skill_cast_db.txt about Taekwon's skills. [Dralnu]
- * Fully implemented the STR bonus part of TK_RUN [DracoRPG]
- * Added activation/unactivation of TK stances, but not their specific effects [DracoRPG]
- * Reverted magnum break, removed the Flame Launcher status change until
- actual bonus can be implemented. [Skotlex]
- * Skills update (mostly thanks to Vicious Pucca): [Skotlex]
- - Success chance and stats of Provoke, mental Break, Signum Crusis, Soul Burn
- - Decrease Agility duration halved for players.
- - Magnum Break's final damage is splitted 80% weapon's element, 20% fire
- element. No longer causes weapon endow.
- - Bash's hit bonus (+5 per lv now)
- * Fixed skill_db, Added perfect hit to TK_COUNTER [Dralnu]
- * Changed skill_tree and job_db1 the same way I changed job_db2, it was necessary for
- clear implementation of Taekwon (which has a very unusual ID for a 1st job) and renders
- the code less messy (at least it's my humble opinion ^^) although it could be slightly,
- but really slightly, more RAM-consuming [DracoRPG]
- * Fixed classchange not clearing on unequip, fixed the mob's max hp not being updated on
- class change [Skotlex]
- * Basic implementation of Taekwon's kicks. [Dralnu]
- * Likely fixed SP consumption of Warp Portal. [Skotlex]
- * Changed some default values in battle config to get the 'official gaming experience' by
- default [DracoRPG]
- - Noone can plagiarize advanced skills (from ragnainfo)
- - No rare drop announce
- - Riding a Peco does not increase one's size
- * Allowed Dispell to dispell songs/dances/ensembles [DracoRPG]
- * Updated SC IDs to get correct client-side status icons (used 0808 Sakexe) [DracoRPG]
- * Prevented from casting Ice Wall under self, independantly of UF_NOFOOTSET [DracoRPG]
- * Removed /omg from equipment breaking and added it to Acid Terror only [DracoRPG]
- * You can now change to Taekwon, but lots of things are still to do [DracoRPG]
- * Began implementation of Taekwon skills [DracoRPG]
-08/21
- * Changed how triple blows/sacrificial ritual triggers to enable
- plagiarizing them. [Skotlex]
- * Stolen items will be (un)identified using the same criteria normal drops
- use. [Skotlex]
- * Updated yet again battle_check_target. Guardians should stop attacking
- out of woe now and alchemist should be able to hit their mines. [Skotlex]
- * Fixed the map server going in an infinite loop if the connection breaks
- while parsing packets from the char server. [Skotlex]
- * Mostly rewrote Battle Chant, should be almost like the official one now... [DracoRPG]
- * Added enums for skill units, makes the code really clearer (check skill.h) [DracoRPG]
- * Merged battle_calc_weapon_attack_sub and battle_calc_weapon_attack [DracoRPG]
- * Fixed Acid Terror WEP breaking rate thx2 ShAPoNe [Lupus]
-08/19
- * More updates to battle_check_target, now you can't target any
- ground-based skills that don't have a physical manifestation (ie:
- Everything except traps and icewall) [Skotlex]
- * Fixed "for sure" battle_check_target when it comes to neutral targets. [Skotlex]
- * Removed pc_emotion, merged it with emotion. [Skotlex]
- Usage: emotion emotion_number <, target>
- - emotion number is the emotion's number (use e_* constants)
- - target is 1-> player, 0-> npc. If ommited defaults to zero.
- * Updated code so that when a guild master joins the game, their guild
- skills are automatically blocked for 5 minutes. [Skotlex]
- (prevents avoiding the skill-lock by relogging)
- * Another update to battle_check_target, this time neutral targets should
- work correctly (non allied/partied people who should be affected) [Skotlex]
- * More fixes to battle_check_target, skills should not hit yourself on
- pvp/gvg now. [Skotlex]
- * Updated classchange to not change the class of bosses. [Skotlex]
- * Optimization/Fixes to battle_check_target, GrandCross should work now. [Skotlex]
- * Reverted Lupus's change on guild auras' max lv... Please double check your sources and
- base yourself on kRO official website as much as possible, thanks. Link to kRO website:
- http://guide.ragnarok.co.kr/GuildSystem.asp#ggg03 [DracoRPG]
- * Fixed passive mobs incorrectly setting the attacked_id when hit by pets. [Skotlex]
- * Rewrote battle_check_target. [Skotlex]
- - Positive side-effects: offensive stuff won't hit your guildmates on gvg
- (such as traps)
- - Negative side-effects: Unknown, but there's bound to be some because of
- the big change. I tested it with traps, spells, pets, passive and
- aggressive mobs, but it's probable there's stuff I am still missing.
- * Updated mob spawns of Glast Heim (gl_sew3 and gk_knt2) [Skotlex]
- * Updated classchange code (Azoth, Heiroloist) to get random classes the
- same way a dead branch does. Cannot convert to bosses. [Skotlex]
- * Script/Npc/Item updates. [Skotlex]
- * Bonus b(HP/SP)GainValue will always be considered 100% (the first
- parameter) this is done to avoid exploits when combining it with
- b(HP/SP)DrainValue (eg: Immaterial Sword) [Skotlex]
- * Fixed max level of some guilds skills 5->1 [Lupus]
- according to http://eathena.deltaanime.net/board/index.php?showtopic=757
- * New items drops, new shop [Lupus]
-08/18
- * Changed the way 'pl' works (in skill_db) : now 0 for 'weapon' attack skills means the
- attack is always neutral. To make so that the skill takes the weapon's element, use -1
- instead: this removes the need of hardcoded ele_flag. [DracoRPG]
- * Fixed damage bonus from Sage's elemental flooring skills by moving the checks which were
- totally wrong placed... Thanks to Antoine for pointing out they were broken. [DracoRPG]
- * At the same time I had to change battle_calc_magic_attack quite alot. Maybe it won't work
- perfectly, but at least it'll compile. Also added (forgotten?) support for 'skillatk'
- bonus with magic skills. [DracoRPG]
- * Rewritten most of Gloria Domini to make it be a BF_MISC skill that can hit and damage
- Emperium and plants (yes it does), igonres WoE damage adjustments and other changes I
- don't remember ^^ [DracoRPG]
- * Modified mob_skilluse so that mobs NEVER use offensive heal. They'll now
- /swt if they try it (and the skill fails) [Skotlex]
- (there's still nothing that can be done about offensive Sanctuary)
-08/17
- * Added script command pc_emotion, works just like emotion, except the
- emotion is displayed on the character that's running the script. [Skotlex]
- * Fixed the vicious compile error I added with SC_SPEEDUP1 [DracoRPG]
- * Implemented Strengthen Guardians with a custom +10% ATK & ASPD / lv value [DracoRPG]
- NOTE : It compiles, but I couldn't test the effect since guilds seem completely
- broken on my test server...
- * Moved Weaponry Research hidden bonus a bit to get the exact effect [DracoRPG]
- * Implemented SC_SPEEDUP1 for Lightning Box effect [DracoRPG]
- * Entirely replaced SC_DIVINA with SC_SILENCE (the 1st was an alias of the 2nd) [DracoRPG]
- * Fixed the map-server disconnecting the char-server when kicking out all
- clients. (Thanks to End of Exam for pointing it out) [Skotlex]
- * Cleaned up error messages related to packet parsing in the char servers. [Skotlex]
-08/16
- * Likely fixed the char-server crashes on mapif_send* functions. [Skotlex]
- * Fixed auto-counter's display (it was working correctly, however the skill
- was not being shown properly on the client) [Skotlex]
- * Fixed Tomahawk not being considered a ranged attack. [Skotlex]
-08/15
- * Added a few bug fix recommendations [Codemaster]
- * Fixed a few problems with Wedding Skills [Codemaster]
- * Fixed a bug with old clients connecting and socket reuse which would kick
- all new connections on the same socket before even checking the packet version. [Skotlex]
- * Fixed the tabs in the ayothaya mobs :X [Skotlex]
- * Likely fixed the setsocketops error that was showing on every connection. [Skotlex]
- * Updated vending code so that items that can't be traded can't be vended
- either. [Skotlex]
- * Messed with socket.c, changing lots of stuff around using some earlier
- Freya SVN version as base, connection issues might hopefully get better. [Skotlex]
- (NOTE: I have yet to try to compile this under Windows/Cygwin, so report
- if it breaks)
- * Updated Magnum Break: Target selectable, damage is (100+20*level)%, hit
- bonus +10 per level. 5x5 splash area. [Skotlex]
- * Likely fixed the max hp display of tiny/big mobs. [Skotlex]
- * Updated Cloaking. It'll fail if the level is less than 3 and there's not
- a wall nearby. [Skotlex]
- If cloak_check is set to ignore walls, the wall-type speed will be used all
- the time.
- (I don't see what all the fuss is about as a Lv2 Cloak is just as good as
- Hide, and you can't even use GrimTooth from it. And since lv2 won't let
- you move anyway, why would anyone use Clock lv2 over Hiding?)
- * Updated Assumptio. It will affect anyone in a 3x3 area around the target. [Skotlex]
- (where anyone is anyone the same way Benedictio chooses it's target)
- * Updated the delay that a mob can't move after attacking to be 1/4th of
- the delay between attacks. [Skotlex]
- eg: The mob attacks once every 1000ms, that means it can start chasing
- you 250ms after an attack.
- * Likely fixed the #fakename crash. [Skotlex]
- * Updated the mob skill use code so that hopefully other players will be
- considered friends when using support skills. [Skotlex]
- NOTE: Not quite tested, use with care.
- * Fixed @monsterbig/@monstersmall [Skotlex]
- Support for said monster in normal spawn scripts is also fixed, however
- the implementation is not stable (currently you add 10K to the ID to make
- it a tiny mob, add 20K to make it a big mob, but those values depend on
- MAX_MOB_DB which can change in the future. :/)
- * When you drink a speed potion, the icon of the previous one will be
- removed (however, all speed potions are still in effect server-side). [Skotlex]
-08/14
- * Likely corrected the error printing in recv_to_fifo (reporting normal
- disconnections when they likely are not). [Skotlex]
- * Fixed the map-server spamming "Client does not has latest EXE message. [Skotlex]
- * Updated char-sql to consider 0 an invalid map-server session number. [Skotlex]
- * Fix in map->char auth request packet where char server spams data search error message, currently in testing. But works none the less. [Kevin]
- * Removed all close()'s in clif.c, made clif_parse the only one who closes
- a socket and deletes the session. [Skotlex]
- * Updated socket.c to be much more verbose about connections and when they
- are ended. [Skotlex]
- (excuse all the extra messages, but they are to help track down the
- current map-freeze bug)
-08/12
- * Updated sql-files: mob_db.sql, item_db,sql, main.sql [Skotlex]
- * Likely fixed mob reloading command. [Skotlex]
- * Added more reports and some fixes/optimizations to socket.c [Skotlex]
- * Added reporting of error when a connection can't be made non-blocking. [Skotlex]
- * Updated Logging Filter: [Lupus]
- - Implemented refine_items_log condition. You may log only certain refine value items.
- - Added 'log_steal' option. It'd log stolen items in the drops log DB
- * Added msg string and announce on stealing of rare items [Lupus]
-08/11
- * Fixed bio-cannibalize's max hp issue. [Skotlex]
- * Pneuma completely blocks Soul Breaker (as the forum consensus says it
- does so) [Skotlex]
- * clif_parse will now print the error message in case close(fd) fails. [Skotlex]
- * Fixed players clicking on players disguised as NPCs trying to execute the
- "npc". [Skotlex]
- * Fixed possible overflows and exploits in log.c, thanks to Irmin [Skotlex]
- * Probably fixed devotion's visual not updating. [Skotlex]
- * Added flag pet_no_gvg, when set to yes/1 the pet is returned to an egg when
- you enter Guild Grounds and you aren't allowed to hatch pets as well. Note
- that it only does the check when the player changes maps (should be safe
- because players are kicked out of castles when WoE starts)
-08/10
- * Fixed PNEUMA blocking magic part of Soul Breaker, instead of physiacal attack one [Lupus]
- * Fixed the Login/Char SQL crashing when determining the max id of empty
- tables. [Skotlex]
- Account and Char creation code tested, it is safe to use now.
- * Removed use of settick_timer (fixes the "can't move!" bug) [Skotlex]
- * Fixed (I think) being able to sit while casting. [Skotlex]
- * Updated Char-SQL server to guarantee that new chars are created with
- char_ids above 150K. [Skotlex]
- (note from last update applies too)
- * Updated Login-SQL server to guarantee that new accounts (_M/_F reg) are
- created with account_ids above 2M. [Skotlex]
- (note it hasn't been tested yet, but I think it should work)
- * Fixed @readmail 0 [Skotlex]
- * Fixed success rates for Dispell and Decrease Agility [Skotlex]
- * Fixed cultivation not being in the list of skills for GMs with
- gm_skill_all [Skotlex]
- * Fixed mob's hp becoming zero after mob_hp_rate adjustments. [Skotlex]
- * Skills update: [Skotlex]
- - Changed concentration from +10% hit per level to +10 hit per level.
- - Base level gives greater stun chance to Attack Weak Point (currently +1%
- every ten levels)
- - Changed Tiger Knuckle Fist to be a combo-only skill.
- - Updated Spell break to damage 2% of target's max hp, heals half that.
- * Small debug change in clif.c which forces a disconnection upon dual-login [Skotlex]
- * Updated char-sql deletion to take into consideration the mysql version [Skotlex]
- It should treat versions 4.1+ differently from the rest, please test and
- report if it is still failing.
- * Removed sql loading of storage every time you open it as it's an open
- exploit on lagging servers. [Skotlex]
- * Removed another "insufficient data" debug line. That should take care of
- incomplete packets spamming the console. [Skotlex]
- * Alright, removed the "insufficient data" debug line as it was just
- causing mass lag. [Skotlex]
-08/09
- * Fixed Magnum Break's damage display. [Skotlex]
- * Finished fixing and testing the sql char deletion update. [Skotlex]
- Deleted characters should now properly leave their party/guild.
- * Throw Stone is now blocked by Kyrie and Pneuma [Skotlex]
- * Fixed "[error] delete_timer error: no such timer -1" (stupid mistake x.x) [Skotlex]
- * Some modifications to char-sql char deletion, so that characters are
- correctly removed from parties and guilds. [Skotlex]
- (Note that this is yet to be tested, so upgrade at your own risk or if
- you want to help file bug reports until I can get to test it on my own
- later today)
- * Likely fixed Endure and the like not being 'disabled' on GvG grounds. [Skotlex]
- * More debug messages to clif.c (these can be ignored on normal situations,
- but might be useful during freezes) [Skotlex]
- * Optimized the packet-version failed rejecting code. [Skotlex]
- * Fixed Freezer Card combo casting Weapon Perfection on the enemy. [Skotlex]
- * Added more information to the map-char connection process, meant to help
- understand what is going on when things 'freeze'. [Skotlex]
-08/08
- * Fixed players not really being disconnected when the char-server is out. [Skotlex]
- * Added check to resend map server connection packets if the connection to
- the char server was established but the initial packets get somehow lost. [Skotlex]
- * Fixed Picky's pet-script being used for all pets... [Skotlex]
- * Fixed an ugly bug that was causing status-changes to crash the map server [Skotlex]
- * Added a timer to the map server. It'll try to reconnect 1 sec after it is
- disconnected from the char server (in addition to the default "try to
- connect every 10 secs" mechanism). [Skotlex]
- * Reverted Safety Wall to last known working state. [Skotlex]
- (from what I read in the code, it should be crash-safe anyway)
- * Mob level up is now capped to max_base_level rather than 99. [Skotlex]
- * Another fix to Safety Wall :X [Skotlex]
- * Fixed Safety Wall (I think). Do test and pray it crashes no more. [Skotlex]
- * Added settick_timer to timer.c, optimizes status retimings for dance
- skills. [Skotlex]
- * Made @autoloot and item_auto_get play along nicely (@autoloot toggles the
- mode, item_auto_get sets the default state of it) [Skotlex]
-
-08/07
- * Corrected the Payon Guild Flags [Codemaster]
- * Lots of debug message cleanup in clif.c which should make more clear the
- why characters are being disconnected. [Skotlex]
- * Added OnAgitInit to the list of npc events executed on connection (it
- will be executed only the first time it connects, thought) [Skotlex]
- * Fixed the exp bonus on pvp maps (it was set to +115%, not +15%) [Skotlex]
- * Updated skill_blown to avoid knocking back plants. [Skotlex]
- * Made the damage delay of the finishing blow the same delay before sending
- a char clear packet, this might fix mob sprites being left there after
- killed. [Skotlex]
- * More fixes to @autotrade
- (You still can't disconnect your autotrader by entering in the
- server again. And an autotrader rises map server usage to 70%+).
- Started adding Freya's anti-bot thing [Lupus]
- * Quick fix meant to prevent crashes when targetting "ghosts" of already
- dead mobs. [Skotlex]
- * Fixed Pneuma and Safety Wall crashing the server. [Skotlex]
- (was caused by yesterday's skill upgrade not being... eh, complete)
-08/06
- * Yet another @autotrade fix by irmin&Ultra. More fixes are coming soon 8)) [Lupus]
- * Pretty big change in the way ground skills are handled, meant to fix
- possible segmentation faults. [Skotlex]
- Report if you notice any ground skill got broken, as pretty much all of
- them have been affected.
- * Removed the data about packet_version 14 in the packet_db [Skotlex]
- This could mean that version 14 never really existed, and all following
- versions need to be shifted up (who decides how to call these versions?
- they certainly don't come coded in the login packet. We should ask
- Sara-chan, the awesome ex-eA dev who pwns us al with her packet finding abilities.).
- Note that no such changes have yet been decided other than removing version 14.
- * Updated Devotion/Sacrifice. AutoGuard and Defender skills are now kept in sync
- between the Crusader and those Devoted. [Skotlex]
- * Added a battle_stopwalking to NPC_STOP effect [DracoRPG]
-08/05
- * A li'l fix of @autotrade. Used some irmin's code and optimized a bit [Lupus]
- * Fixed pc_setcart... [Skotlex]
- * Updated Fireball and Stone Curse data [Skotlex]
- Source used: http://guide.ragnarok.co.kr/jobmagskill.asp
- * Updated map_server sql so that the storage is loaded from sql everytime [Skotlex]
- * Updated the char deletion routine (sql) so that only the correct pets
- will be deleted (those hatched and that are in the char's inventory/cart)
- [Skotlex]
- * Likely fixed the map server spamming the console when clients gets
- rejected due to packet version. [Skotlex]
- * Fixed the make_connection problem (sorry about that) [Skotlex]
- * Updated make_connection (socket.c) so that it actually returns -1 when
- the connection fails. [Skotlex]
- * Fixed change-cart clearing other options. [Skotlex]
- * Fixed @spawn not working with string names. [Skotlex]
- * Fixed songs/dances not being moved when knocked back. [Skotlex]
-08/04
- * Made mobs retaliate against a pet's master when for some reason a pet is
- attacking a passive mob which is not yet attacking back. [Skotlex]
- * Modified the mob_db to make it a dynamic array of mob databases. [Skotlex]
- This allows usage of high mob ids without wasting memory on large gaps of
- unused mob IDS.
- NOTE: Other than loading/unloading the map server, this has not
- been tested, if it crashes DO report right away (preferrably with a
- backtrace)
- * Bumped the MAX MOB ID to 10K [Skotlex]
- * Added 2 new mobs, updated and added some items. Thanks to Landarma [Lupus]
- Also fixed map-serv loading warnings (about wrong mob IDs)
-08/03
- * Removed the clif_waitclose timer message, and placed it instead around
- clif.c on the areas that are actually invoking the waitclose timer. [Skotlex]
- * Changed the "Player not identified with account id" message to be more
- descriptive (however I don't know how much of the player data is available
- when disconnecting this way, so if it crashes DO REPORT it) [Skotlex]
- * Modified @me so that it actually works as expected by IRC junkies. [Skotlex]
- (tested and works correctly)
- * Updated Enchant Deadly Poison: Can't be dispelled, won't end when you are killed. [Skotlex]
- * Fixed draining more HP/SP than you can have [Skotlex]
- * Fixed enchanted peach tree damaging you when attacking the undead [Skotlex]
- * Removed the tick check from the packet_version guessing as it is an
- unsigned int (so every value in said field is valid) [Skotlex]
-08/02
- * The char server now notifies the map server about which is the max
- account/char id available, this is used to help identify packet versions
- more reliably. [Skotlex]
- * Guardians won't level up now with mobs_level_up=1 [Skotlex]
- * Updated Deluge, Volcano, Violent Gale & Land Protector to not require
- gems when recasted, and the previous time remaining will be used instead.
- [Skotlex]
- * Fixed Zeny from mobs. [Skotlex]
- * Changed the visual effect when pets heal status ailments to "Detoxify" [Skotlex]
- * Fixed "bonus2 bSkillAtk" so that it works with up to five skills [Skotlex]
- (previously it only worked for one skill at a time)
- * Fixed Enchant Deadly Poison on normal attacks. [Skotlex]
- * Updated the packet-guessing code, trying to load negative char accounts
- should be fixed now. [Skotlex]
-08/01
- * Updated the login servers so that account registration can be done with
- _m/_f as well as _M/_F [Skotlex]
- * Fixed login sql server not using md5sum on the passwords before creating
- accounts (when md5 passwords are enabled) [Skotlex]
- * Updated Enchant Deadly Poison: Increases Sonic Blow's damage by 4x and
- affects all skills except Breaker/Meteor Assault [Skotlex]
- * Added a check to prevent char-server freezes when receiving unknown
- packets from the map server. [Skotlex]
- * Fixed some problems with the clif optimizations from earlier today (wrong
- animations being displayed for normal attacks/picking items) [Skotlex]
- * Rewrote Ensemble skill implementation to be more efficient and less
- error-prone [Skotlex]
- (say, when you do an ensemble skill, your partner has to be
- charged SP too? That is not the current case)
- * Dance/Song checks so that the ground effect is more tightly coupled with
- the status effect (if the dance's effect is cancelled for whatever reason,
- the ground skill WILL be removed) [Skotlex]
- * Fixed stat reset for Advanced Classes [Skotlex]
- * Updated Lord Knight's Concentration (damage, defense, endure effect) [Skotlex]
- * Likely fixed famous alchemist potion usage. [Skotlex]
- * Small optimization to the packet version guessing code. [Skotlex]
- * Added Warpparty and Warpguild script commands *requested* [Fredzilla]
- * Fixed the exp exploit bug dealing with expaddrace [Skotlex]
- * Added missing CharCommands logs (together with ATCommands) [Lupus]
- TODO: '/' commands 8)
- * Added mod for npc whisper system(lordalpha)[massdriller]
- * Added lordalfa's str1 and str2 compare and check commands [massdriller]
-07/31
- * Fixed (I think) the char sql server freezing when the map server sends it
- a GM whisper request. [Skotlex]
- * Rewrote the way that experience is given, this should prevent exp overflows
- even in even-share parties. [Skotlex]
- * Changed how the exp_calc_type works, take note that there's no longer a "2"
- value for it! [Skotlex]
- * Updated throw stone: Damage is modified by target's cards, 3% chance to
- cause Stun/Blind. [Skotlex]
- * Added rods/books to the list of items that can't break. [Skotlex]
- * Fixed map server rejecting clients of packet versions 9 and below
- (regardless of packet_ver_flag) [Skotlex]
- * Updated Steel Body: Consumes 50% sp and is not dispellable. [Skotlex]
- * Updated sprinkle sand's damage to 130%, Throw Stone's range and delay [Skotlex]
- * Fixed increased dodge's flee bonus and speed bonus (to Assassins). [Skotlex]
- * Simplified clif.c by removing all code related to hard-coded packet
- information (the packet_db.txt is an essential file now) [Skotlex]
- * Small fixes to provide clarity to # commands
- (So many people ask "why doesnt @char????? work, like OMGWTFBBQ") [Fredzilla]
- * Fixed a stupid typo in a drop rate display [Lupus]
-07/30
- * Some more fixes to the job calculating equations. This one should fix item
- usage for mounted classes and hopefully be the last fix needed regarding
- the job system upgrade. [Skotlex]
- * Corrected the parsing/reading of the skill tree. This fixes the Priest/Monk
- skills appearing in the skill trees of Paladings/Crusaders. [Skotlex]
- * Another fix about advanced/baby mounted characters not having skills. [Skotlex]
- * Fixed character's class not getting updated when mounting/dismounting peco. [Skotlex]
- * Fixed the default packet version checking in the guessing version code.
- as pointed out by End of Exam. [Skotlex]
- * Optimized the code that determines what packet version to use by default
- when you specify "packet_db_ver: default" [Skotlex]
- * Fixed job changing to high/baby classes [Skotlex]
-07/29
- * Moved messages "One Castle", "Two Castles", etc into msg_athena.conf [Lupus]
- * Fixed wrong msg_athena.conf messages in the trade hack spoof code [Lupus]
- * Added a Rare Item announce string into msg_athena.conf [Lupus]
- * Fixed compilation of the TXT server. [Skotlex]
- * Fixed song/dances not clearing when you run out of SP [Skotlex]
- * Fixed #fakename [Skotlex]
- * Optimized Apple of Idun's implementation [Skotlex]
- * Updated pc_calc_base_job and related functions and applied them around
- the map server. This should fix all item related problems with Super Babies
- and alike. [Skotlex]
- * Simplified/optimized the code that mounts/dismounts from Pecos. [Skotlex]
- * Changed Create Deadly Poison to not use the item producing interface (works simplier,
- like Aqua Benedicta) and added a separate config option to choose whether the maker's
- name is written on the Poison Bottle [DracoRPG]
- * Changed NPC_STOP to immobilize the target during 2 seconds (from ragnainfo) [DracoRPG]
- * Added "cartboost" state to skill_require_db (used for Cart Termination) [DracoRPG]
- * Rewrote Soul Destroyer's damage dealing and displaying code, now everything is done at
- once: no more people killed without damage displayed [DracoRPG]
- * Readded Assassin Cross not affecting bows [Skotlex]
- * Fixed Hip-Shaker (not tested, but I am assuming it works now) [Skotlex]
- * Fixed Brandish spear's damage [Skotlex]
- * Removed the after-cast delay of Recall Partner [Skotlex]
- * Added optional announce of rare drops. When a SomePlayer kills a monster [Lupus]
- with a rare drop then everyone gets announce: 'SomePlayer' won Pupa's Pupa Card (chance 0.01%)
-07/28
- * Fixed the Server Whisper to GMs in the char-sql server [Skotlex]
- (when an exploit that should be notified to GMs is triggered, the map
- server would just hang instead...)
- * Some code reorganization around the name-spoof exploit protection code. [Skotlex]
- * Fixed not being able to do Extremity Fist after Glacier Fist/Tiger
- Knuckle Fist [Skotlex]
- * Likely fixed the Famous Alchemist potions not having that 50% boost. [Skotlex]
- * Updated the Wedding Skills (they work with 10% HP/SP and heal 10% of
- their target's, summoning has a cast time of 20s) [Skotlex]
- * Reverted AssassinCross's song behaviour. [Skotlex]
- * Odd bug wanting all Account and Char IDs to end with 0?! [Codemaster]
- Note: Not all acc or char ids end with 0...this gave alot of problems with client version 16
- * Fixed that compiling issue with buildin_getequippercentrefinery [Skotlex]
- * Updated Bard's AssasinCross (Impressing Riff) to not affect Bows (is this
- how it really is?) [Skotlex]
- * Massive skills update (from now updated kRO website) [DracoRPG]
- - Weapon forging, ore/metals refining, potion making : tried to correct rates ^^
- - Weaponry Research : does NOT increase NPC equipment upgrading chance
- - Skin Tempering : (4*skilllv)% fire resistance and (1*skilllv)% neutral resistance
- - Hilt Binding : the original 'undropable weapon' part is dead
- - Meteor Storm : (3*skilllv)% stun chance
- - Lord of Vermilion : (4*skilllv)% blind chance
- - Sandman : (40+10*skilllv)% sleep chance
- - Ankle Snare : minimum trap time changed to (3+0.03*skill_lv) seconds
- Tons of other skills could and should be reviewed the same way ! ^^
- * Fixed massdriller's fixes ^_^ [Kevin]
- * Some fixes to Whisper system. [massdriller]
-07/27
- * Fixed the fame list packet mismatch bug. [Skotlex]
- * Even more cleanups to socket.c and chrif.c to prevent even handling
- Session #0 [Skotlex]
- * Some more cleanups to chrif.c (the interface to the char server)'s code. [Skotlex]
- * Appied End of Exam's socket/connection related fixes/suggestions. [Skotlex]
- * Fixed a Segmentation Fault with friends list loading. [Kevin]
- * Fixed the npc whisper system. [Kevin]
- * Fixed most of the matrix bug, note to devs: Don't use tmp_output anymore! [Kevin]
- * Fixed a small compile warning with previous fix. [Kevin]
- * Added ATCommand @AutoTrade. You open a shop, setup your goods. Then use @AUTOTRADE.
- Your will be closed, but your merchant would remain in the game. So you can vending
- without your client ON. (originally by Fantik, changed by Lupus)
- * Added ATCommand @ChangeGM. Your Guild Master can set another GM of the guild.
- Note: It works, but have to be optimized, WIP. (originally by Fantik, changed by Lupus)
- * Added lordalfa's npc whisper system [massdriller]
- * added lordalfa's fix/enhancement for Execute Scripts::labels [massdriller]
-07/26
- * Updated the packet-version guessing code, hopefully it does a better job now [Skotlex]
- * Fixed the mob bug where they "stick to you" and won't let you escape [Skotlex]
- * Reverted mob skill usage rates. A rate of 1000 (in mob_skill_db.txt) IS 100% usage. [Skotlex]
- * Corrected Gospel not dissipating when you die. [Skotlex]
- * Fixed Providence/Resistant soul so it can't be casted on yourself-other crusaders [Skotlex]
- * Updated Quagmire to affect everyone in GVG maps. [Skotlex]
- * Small fix to the packet_version identification [Skotlex]
- A more complete testing/verification code comes later...
- * Likely fixed the txt->sql converter. [Skotlex]
- * Corrected some refine success rates. [Skotlex]
- * Modified the packet client version guessing code (perhaps it more
- accurately guesses the version now?) [Skotlex]
- * Fixed reading of 'repairitem' packet in packet_db -> fixes Weapon Repair [DracoRPG]
- * Rewrote Weapon Repair to allow use on other players [DracoRPG]
- * Moved pc_item_repair, pc_item_refine and pc_item_identify to skill.c [DracoRPG]
-07/24
- * Enchant Deadly Potion now does count card modifiers. [Skotlex]
- * Fixed elemental modifiers not applying to skills. [Skotlex]
- * Fixed mob_ghostring_fix config. [Skotlex]
- * Fixed firewall stun-locking enemies that are not pushed back. [Skotlex]
- * Added some checks into MONSTER spawn command (reports wrong number, ID, delays, etc.) [Lupus]
- - somehow it doesn't report about wrong map names yet
- * Added check for missing TAB characters into script parser [Lupus]
-07/23
- * Fixed friend-saving on the new charsave sql method. [Skotlex]
- * Corrected the ghostfix description in battle_athena. [Skotlex]
- * Modified the Makefile to include FD_SETSIZE = 4096 when compiled under
- Cygwin [Skotlex]
- * Added a check for max mob skill level (when reading mob_skill db) [Lupus]
- * More fixes/updates to the txt->sql converter of inventory/cart (will it ever work?) [Skotlex]
- * Fixed job_db2 reading [Sasuke]
- Field count is MAX_LEVEL+1 since job ID is the first field of the 'split' table
-07/22
- * Changed a bit the aspd penalty for dual-wielding assassins. [Skotlex]
- The new factor is 2/3 rather than 0.7, which should be closer to what
- rodatazone says, but also makes them dual wielders a bit slower :X
- * Fixed job_db2.txt reading so that it will read up to MAX_LEVEL job bonuses. [Skotlex]
- * Changed the way the OS is detected in socket.h [Skotlex]
- This MIGHT fix the current 60 user limit problem.
- * Fixed characters not being able to attack and getting "there is a delay
- after a skill" messages instead. [Skotlex]
- * Fixed status changing cards not taking effect. [Skotlex]
- * Fixed packet_ver_flag reading. [Skotlex]
- (previously, if you tried setting it to 256 or 512 it would be
- resetted back to 255, which would cause problems with the later clients)
- * More fixes to the txt->sql converter. Does it works now? [Skotlex]
- * Added water height values of Ayothaya, Ayo_dun02, sec_in02 maps (thanx 2Lorky) [Lupus]
- * Fixed char-sql memo saving. [Skotlex]
- * Added the wantoconnection packet of version 13 to version 14 [Skotlex]
- Note that this will cause all ver13 clients to be identified as v14, it
- WILL cause problems if you use ver13 clients. There is no easy way around
- this as both versions seem to use the identical login packet. If you
- want to give preference to v13 over v14, you can specify the default to
- be it.
- * Fixed Encore skills working when the partner has no weapon equipped. [Skotlex]
-07/21
- * Fixed the fame lists, they work now. [Skotlex]
- * Rewrote the friends system, it now works. [Skotlex]
- Sql users upgrade with the 2574.sql upgrade, txt users will have to
- wipe their friends.txt (there's no easy way to convert that one).
- * Fixed the txt->sql converter not converting inventory/card. [Skotlex]
- The friend conversion was removed due to the new structure.
- * Restructured some of the logic behind auto-attacks and normal attacks
- which should prevent most speed-hacks and be more responsive to players. [Skotlex]
-07/20
- * Updated the txt->sql converter, I THINK it will work now. [Skotlex]
- * Fixed Plagiarized skill's level not being saved. [Skotlex]
- * Changed Pressure/Gloria Domini to take a % of current SP, not max SP (from a post on
- ragnainfo, not personal custom shit! :p) [DracoRPG]
- * Removed debug messages for fame list and signaled the bug that causes problems [DracoRPG]
- * Removed the need of job_db2-2 (advanced jobs' stat bonuses) and moved its use to
- job_db2 [DracoRPG]
-07/19
- * Reorganized the way sql chars are being saved. [Skotlex]
- * Merged battle options player_combo_damage_delay and
- mob_combo_damage_delay into combo_damage_delay [Skotlex]
- * Some code reorganization that hopefully should help with mobs not having
- the same damage delay on the client and within the server. [Skotlex]
- * corrected some bounds errors in the new packet_db code
- that was corrupting memory [MouseJstr]
- * Corrections to Tiger Knuckle Fist [Skotlex]
- * Rewriting of part of the skill-additional effect code. (Should fix
- Asura's penalty) [Skotlex]
-07/18
- * Added a check that might prevent sql char crashes when requesting info
- for non-existant Characters. [Skotlex]
- * Fixed main.sql (start char_id should be 150k) [Skotlex]
- * Some code-cleaning for Sacrificial Ritual [Skotlex]
- * Optimization of auto-triggering skills (double attack, sacrifice, triple
- blows) [Skotlex]
- * Small fix to Sanctuary (shouldn't start healing until after 1.5 secs of
- casted) [Skotlex]
- * Implemented Palm Strike (you cast the skill, it pushes back the enemy and
- deals damage 1 sec after it was casted) [Skotlex]
- * Rewrote and tested Gospel's code, currently it works as follows: [Skotlex]
- Offensive Effects:
- 0: Defense ignoring damage 1~9999
- 1: Curse enemy
- 2: Blind enemy
- 3: Poison enemy
- 4: Lv10 Provoke
- 5: Def, Def2 to 0
- 6: Base Atk, Watk to 0
- 7: Flee to 0
- 8: Speed/Aspd -25%
-
- Deffensive Effects:
- 0: Heal 1~9999
- 1: End all negative status effects
- 2: Lv10 Bless
- 3: Lv10 Inc Agi
- 4: Aspersio (holy weapon)
- 5: Benedictio (holy armor)
- 6: +100% max hp
- 7: +100% max sp
- 8: +20 to all stats
- 9: +25% def (armor and vit)
- 10: +100% base atk
- 11: +50 flee
- 12: +50 hit
- 13: Status effect inmunity
- - Effects have a chance of 10*Skill_lv% of triggering every 5~15 secs
- for whoever is on the skill area.
- - Report any modifications/corrections needed on the forums.
-07/17
- * More Sacrificial Ritual updates [Skotlex]
- * Added Jawaii's water level, thanks to Manipulator [Skotlex]
- * Sacrificial Ritual update [Skotlex]
- * Bumped max Vending price to MAX_ZENY (currently 1000M) [Skotlex]
- * Fixed a bug with Brandish Spear's damage. [Skotlex]
- * Changed the minimum valid char_id from 150k to 1 as apparently many sql
- servers somehow got their chars to start from id 1 instead of 150k. [Skotlex]
- * Added a bunch of debug information to help me understand why the client
- version check is failing. Report back the output on the forums. [Skotlex]
- * The memory manager is now OFF by default [Skotlex]
- (if the server now crashes instead of the matrix bug, then whoever
- gets the traceback first gets to locate it's source)
- * Various fixes to Sacrifice (self damage, display, defense reduction, etc) [Skotlex]
- * Fixed Assumptio's damage reduction in pvp/normal maps [Skotlex]
- * Tiny fix to #fakename [Codemaster]
- * Probable fix for matrix bug. [Kevin]
- * Fixed SegFault with friends list loading on sql. [Kevin]
- * Fixed the spamming of 'unknown packet received' when a client connects
- with an unidentifiable version. [Skotlex]
- * Optimized sql loading of data when displaying the Char Select Screen [Skotlex]
-07/16
- * Added NOLOOT, NOEXP mapflags files (thanks to Lorky,OSKOM) [Lupus]
- * Updated Louyang monsters spawn (thanks to MasterOfMuppets) [Lupus]
-07/15
- * Rewrote most of the packet_db handling code. [Skotlex]
- eA now really supports multiple packet versions at the same time,
- (so that transitioning from one packet version to another should be
- smooth), there is no longer any need to mess with the db/packet_db.txt
- file.
- * The values for packet_ver_flag have changed, check the battle_athena
- comments and set it up accordingly!
- * Using the packet_db is the only way to manage packets now. [Skotlex]
- * Added sql runservers to all branches as runserver-sql.bat [Evera]
-07/14
- * Fixed the login-sql registration issue. [Skotlex]
- * Made it so all ground-targetted skills fail if you try to cast them on a
- cell you can't step in. [Skotlex]
-07/13
- * Soul Change should now work on anyone in pvp/gvg maps [Skotlex]
- * Wand of Hermod's target change from 'friend' to 'party' [Skotlex]
- * Fixed triple blow's 'infinite damage delay'. [Skotlex
- * Added check to prevent placing traps on non-walkable cells. [Skotlex]
- * Fixed login-sql server not reading login_log value [Skotlex]
- * Adjusted my fix of buildin_getequipisequiped to not leave
- the return stack tweaked [MouseJstr]
- * Changed skill_unit_onlimit to use strncpy instead of memcpy
- in one spot to eliminate accessing unallocated memory [MouseJstr]
- * Added check into _mmalloc for allocations of less then zero
- to make debugging easier [MouseJstr]
- * Fixed USE_MEMMGR to disable when running bounds checker or
- the debugging malloc code [MouseJstr]
- * Fixed the debugging malloc MACRO's to use the correct arguments
- [MouseJstr]
- * increased max maps per server to 1024 [MouseJstr]
- * Added check into buildin_getequipisequiped to make sure arguments
- don't go outside of array boundries *crash* [MouseJstr]
- * Add a check into refine bonuses to not go outside of array
- boundries if somebody has a wlv above 5 in the database *crash* [MouseJstr]
- * Modified skill_tree code to confirm we are still inside the
- skill_tree array before accessing a element from the skill_tree
- array *crash* [MouseJstr]
- * Changed the mob spawning code to use strncpy instead of memcpy
- in some places to avoid copying unallocated and uninitialized
- memory *crash* [MouseJstr]
- * Fixed the compile problem on the previous upgrade. [Skotlex]
- * Changed refine success chances to match jRO information. [Skotlex]
- See http://tomcat1.s13.xrea.com/bs/calc.html and
- http://eathena.deltaanime.net/board/index.php?showtopic=39997
- for the details on the new equation.
- (changed because the current equations seem somewhat outdated)
- * Fixed max chance const of "mob skill usage". Now all mobs aren't hyperactive. [Lupus]
- * Fixed global vars not being saved instantly (used to cause some scripts exploits) [Lupus]
- Need some offensive testing.
-07/12
- * Added Loli Ruri to the Magician set [Skotlex]
- * Fixed 'theif' on the scripts. [Skotlex]
- * Added mapflag pvp_noparty to the pvp rooms [Skotlex]
- * More Dispell Fixes [Skotlex]
- * log_login option now also works for the SQL Login server [Skotlex]
-07/11
- * Fixed again Dispell. [Skotlex]
- * Added nomemo mapflag to Ayothaya Dungeon. Check your memo DBs and wipe forbidden entries [Lupus]
- - Yuno, Ayothaya Dungeon
- * Fixed Dispell succes rate reduction by MDef working reversed [DracoRPG]
- * Changed Guild auras to not be removed by Dispell (they came back when you walked
- anyway :p) [DracoRPG]
- * Changed the default for equip_natural_break_rate to 0 (official) [DracoRPG]
- * Fixed the function that checks whether the player has valid equipment for his buffs :
- don't return once one buff is stopped, since there can be more (e.g. Crus' shield buffs
- will now ALL be stopped when the shield is unequipped, not only Guard ^^) [DracoRPG]
-07/10
- * Fixed Alchemist Fame system using' account_id' instead of 'char_id', however this does
- NOT solve the names problem : I left debug messages so you can see by yourself that the
- bug comes from map_charid2nick that always returns null... [DracoRPG]
-07/09
- * Added Novice Castles Usher NPC. 4 new Castles for all but 2nd classes! [Lupus]
- * Updated Falcon Assault (now gives 500% at 5 lvl) [Lupus]
- * Fixed True Sight (now gives +10 Crit, instead of +10%) [Lupus]
- * Update Sharp Shooting (now gives 350% at 5lvl) [Lupus]
- * Check other DB related skills req changes in db\changelog.txt [Lupus]
- * Updated Palm Strike to push back even if it misses. [Skotlex]
- * Updated Palm Strike cost/sphere requirement. [Skotlex]
- (the delayed damage still needs to be coded in)
- * Now adoption.txt NPC can also teach parents/babies their missing family skills [Lupus]
- But the skills don't work yet (I tested)
- * Massive mapflags fix. Also added there Novice Guilds. [Lupus]
-07/08
- * Fixed below fix xD [DracoRPG]
- * Added another sql injection fix [Kevin]
- * Rewrote part of the name request code [Skotlex]
- This means that now you can see other people's party even if they don't
- belong to a guild, and the party/guild names are updated whenever someone
- joins/leaves them. Not fully tested but works alright on the client I use
- (0411)
- * More Adoption skill fixes. [Skotlex]
- * Added the Adoption skills to all classes [Skotlex]
- They should be auto-granted upon adoption (and are not resetable,
- learnable). This, of course, needs testing, do report if it does not
- works. (those that already have someone adopted will need a custom npc to
- give them the skills).
- * Reverted Wedding Rings as they don't need to give the adoption skills
- anymore [Skotlex]
- * Added script command getchildid() [Skotlex]
- * Updated wedding rings to give the adoption skill when equipped. [Skotlex]
- * Fixed some adoption skills [Skotlex]
- * Baby classes won't display the wedding sprite when they equip the
- tux/wedding dress since that resets their size. [Skotlex]
- * Added warning messages when mobs from the mob_db are not loaded due to
- invalid IDs. [Skotlex]
- * All the new monsters have been added. Check db\changelog.txt
-07/07
- * Moved some declarations causing errors with gcc 2.95 [veider]
- * Added valid fd test in inter.c char_sql - caused charserver crash [veider]
- * Fixed pet-exploit where you could use a bow with no arrow equipped to
- 'send' your pet to attack distant enemies. [Skotlex]
- * Added a visual skill effect when pets heal a status ailment. [Skotlex]
- (Adrenaline Rush was chosen because it's animation does resemble a
- 'curative spell')
- * Changed all SQL-related error messages to use ShowSQL [Skotlex]
- ShowSQL now is also printed on the stderr (like ShowError and ShowFatalError)
- * Beautified the output of the char server (sql) [Skotlex]
- * Modified Dispel so that it can fail. [Skotlex]
- As I have no information of how mdef protects against it, the current
- dummy equation is: (50+10*SkillLv - mdef)% (note that mdef2 is not used!)
- If someone knows the actual equation, do open a bug report.
-07/06
- * Fixed Spider-web (works like a ground-targeted trap) [Skotlex]
- * Fixed combo delay not working with skills that have a blowcount [Skotlex]
- * Set the default skill combo delay value to 230ms [Skotlex]
- (this default was empirically obtained testing with Jupitel Thunder as reference)
- * Beautified output of the char server (txt) [Skotlex]
- * Fixed script config import reading. [Skotlex]
- (was working incorrectly and causing memory leaks)
- * Another mob-ai fix, this time mobs should unlock their target once
- it has died for sure. [Skotlex]
- * Added player_combo_damage_delay & monster_combo_damage_delay [Skotlex]
- See battle_athena.conf for description of how they work.
- Defaults to 0 because it is not yet tested for an appropiate default.
- * Removed player_damage_delay & monster_damage_delay [Skotlex]
- Use player_damage_delay_rate:0 & monster_damage_delay_rate:0 instead.
- * Set item_use_interval to 0 (official default, isn't it ?) [DracoRPG]
- * Improved appearance of script-errors reported during loading. [Skotlex]
- * Some mob-ai cleanup. Mobs should now unlock their target when it has died. [Skotlex]
- * Some items, monster drops fixes [Lupus]
-07/05
- * Fixed double attack damage [Skotlex]
-07/04
- * Displayed name is now updated whenever a character leaves/joins a
- party/guild. [Skotlex]
- * Added some NEW official HEADGEARS quests thanks to Lorky [Lupus]
- * Added zbuffer/lance's "Dynamic NPC Look 'n Feel" feature. [massdriller]
-07/02
- * Fixed a small bug in PCloadmapevent thanks to lance. [massdriller]
- * Added lance's PCLoadMapEvent script event command. to trigger, type in
- -[TAB]script[TAB]PCLoadMapEvent[TAB]-1,{
- YOUR SCRIPT HERE
- PCLoadMapEvent as NPC Name will trigger when players step into the map.
- OnPCLoadMapEvent as Label will trigger when players step into all maps. [massdriller]
- * Added lordalfa's NPCKillEvent script event command. to trigger, type in
- -[TAB]script[TAB]NPCKillEvent[TAB]-1,{
- YOUR SCRIPT HERE
- }
- The script should run everytime a normal monster is killed. [massdriller]
- * Added lordalfa's edit where Labels from Event Monsters be executed using the MVP RID,
- and not the Last Hit guy RID. [massdriller]
- * Added lordalfa's PCBaseUpEvent script event command. to trigger, type in
- -[TAB]Script[TAB]PCBaseUpEvent[TAB]-1,{
- YOUR CODE HERE;
- }
- the script should run everytime the user gains a level. [massdriller]
- * Fixed Job Quests exploits (Advanced Classes were able to pass their 2nd job quests again) [Lupus]
- High Novices were able to pass Super Novice Job Quest as well. They weren't able to GET those
- professions, tough. But there were some items exploits.
- Now Advanced classes get reborn guides from all main Job Quest NPCs (1st, 2nd Classes)
-07/02
- * Fixed NEWnovice NPC set using gmcommand instead of atcommand. [Codemaster]
- * Maps and bugs updates, some cleanup in Weapon Repair code [DracoRPG]
- * Added new areas into map flags folder. According to the patch, added NOMEMO flag to Yuno [Lupus]
- * Some monsters drops changes, cards fixes. [Lupus]
- * Fixed sql-char server crash when deleting a Guild Master [Skotlex]
- * Massive cards update (also thx 2Landarma) [Lupus] read db\changelog.txt
-07/01
- * Fixed being able to steal from Treasure Box #1 [Skotlex]
- * Char-sql server now uses autosave_interval to decide when to save a
- modified guild. [Skotlex]
- * Temporary patch to fix the 'invalid pointer' error on shutdown. [Skotlex]
- * Changed all printf's to Show* messages (login/login-sql servers) [Skotlex]
- * Cleaned up sql-account creation code. [Skotlex]
- * Fixed 'unclean' guilds not getting saved on char-sql shutdown. [Skotlex]
- * Corrected map-length calculations when auto-adding .gat (#/@ commands) [Skotlex]
- * Fixed guild-skill sql loading. [Skotlex]
- * Added battle_config option guild_exp_rate to adjust taxed experience
- before adding it to the guild. [Skotlex]
- * Some Guild-Sql saving optimizations [Skotlex]
- * Changed all printfs to Show* messages (Map Server, common/ files) [Skotlex]
- * Fixed crashes of Baby Knight/Crusader Peco riders. Added Baby Class support into
- AT / CHAR commands @mountpeco [Lupus]
-06/30
- * Added web server (http daemon) plugin, originally by jA, ported to plugin form
- (but not yet finished) [celest]
- - To activate it just edit plugin_athena.conf
- - When running just access http://<your server IP>:<your server port>. The
- default home page is httpd/index.html, you can edit it if you want.
- - If graph creation is enabled you can view them in http://..../graph
- (by default only memory usage graphs are added)
- * Fixed crash when no grf's are loaded [celest]
- * Some tidying ups in clif.c, guild.c, skill.c, storage.c [celest]
- * Fixed a missing foreign key for guild_position in the SQL
- guild convert files (main.sql has it already) [Aru]
- * On Guild_skill table corruption in SQL: this is a problem with
- some MySQL versions not supporting the syntax used in
- convert_guild_tables properly. The solution is to drop table
- guild_skill and re-create it with the query from main.sql. [Aru]
-06/29
- * Fixed Bowling Bash and Spear Stab having knockback in
- situations where knockback should be disabled (GvG/MVP) [Aru]
- * Updated map configs with airport maps. [massdriller]
-06/28
- * Fixed Land Protector's range
- * Old Sakexes can now login to the server. [davidsiaw]
- * Doubled Investigate/Occult-Sight's damage and made it non-elemental as per
- ragnainfo sources. [Skotlex]
- * Sacrifice now always hits.
- * Added import of msg_conf.txt for custom message translations. [Skotlex]
-06/27
- * Fixed Pressure missing. [Skotlex]
- * Added 2Secs delay to Sonic Blows. [Skotlex]
- * Removed battle config option maximum_level and replaced it with max_base_level,
- max_job_level, max_super_novice_level and max_advanced_job_level. Refer to
- battle_athena.conf for more details. [Skotlex]
-06/26
- * Fixed typo 'identity'->'identify' in charsave.c [DracoRPG]
- * Added missing ',' to guild_position definition of main.sql [Lupus]
- * Added proper foreign keys to guild_position,
- SQL users run upgrade_svn2331.sql [Aru]
- * Added convert_guild_tables2.sql for use on guild tables
- created with a 2314-2321 main.sql. Run this or
- convert_guild_tables.sql if you are having issues with guild
- skill saving [Aru]
- * Fixed a bug with guild_skill table in main_old.sql if you're
- fool enough to use it [Aru]
- * @nuke++, ftw ;D [Valaris]
- * Modified friend list loading in char-server (sql) to be more efficient. [Valaris]
- * Modified mmo_friends_list_data_str (char-server txt) so it wouldn't make junk data. [Valaris]
- * Added 'character_size' to battle config:
- Do mounted (on Peco) characters increase their size [Lupus]
- * Added new guild database structures to main.sql.
- Removed obsolete guild_tables.sql.
- If for some reason the new main.sql doesn't work for you, you
- can use main_old.sql, but there will be garbage left in the DB
- if a guild is deleted. [Aru]
-06/25
- * Asura/Extremity-Fist needs Fury/Explosion-Spirits active no matter how
- it's triggered. Not yet tested, but it should work. [Skotlex]
- * Reorganized deletion process. Friends should now be no more problem [davidsiaw]
- * Added SQL returned row check to friend-list loading, thanks to Sasuke-. [Valaris]
- * Fixed drops_by_luk not behaving exactly the way it was before... ^^' [Skotlex]
- * Proper clear of class sprite if used as a mob when killed. [Valaris]
- * Added limit 10 to fame list SQL query (faster, when u got 1000+ bsm/alch in DB) [Lupus]
- * Added missing field guild/char_id to main.sql database definition [Lupus]
- Warning: Don't use guild_tables.sql databases yet! Use main.sql file
-06/24
- * Small bug fix on the Monk combos introduced by previous reorganization. [Skotlex]
- * Some corrections on player_cloak_type code. [Skotlex]
- * Some code reorganizing related to Monk combos [Skotlex]
- * Reverted behaviour of the drops_by_luk to Valaris's way [Skotlex]
- Added drops_by_luk2 for those who want the alternate behaviour instead.
- * Adjusted occult-sight/investigate damage modifier to be (def1+def2)/100 [Skotlex]
- * Removed remaining bits of code for the ex-guild skill Charisma [DracoRPG]
- * Added Lighthalzen to @go [DracoRPG]
- * Fixed bug in bowling bash that made the target's sprite remain. [Valaris]
- * Added status calculation to nude script command if anything was removed. [Valaris]
-06/23
- * Fixed LittleWolf's detect hidden mode 256 for mobs (missed a line while merging). [Valaris]
- * Disable AF2 loading -- eA doesn't support unzipping archives yet [celest]
- * Updated UPnP plugin to 1.0.3.2 [celest]
- - Added 'nat_ip' option to upnp.conf (use it to manually set your ip address
- if auto detecting doesn't work)
- - Fixed ip address not initialised properly
-06/22
- * Stopped looting from Chase Walk [Aru]
-06/21
- * Added send of fail packet on failing to pick up items under certain conditions
- (this allows you to get an item you tried to pick up while cloaked when you uncloak). [Valaris]
- * Updated map server to partially 1203~1249
- - Added 'buyer_name' to battle config: shows the buyer's name when an item
- has been sold through vending
- - Added skills with 'water' requirement can be used in rain-enabled maps
- - Fixed Soul Strike not dealing extra damage to undead
- - Fixed Advanced Book not giving its aspd bonus
- - Fixed skill name display when Frost Joke and Scream are casted by mobs
- - Fixed exp overflow with Rich Man Kim
- - Fixed exp overflow with party bonuses
- - Fixed mob names not updated properly when respawning to its base class
- - Reduced size of struct pet_db a bit
- - Prevent trying to respawn a one-time-only mob if it can't find any
- coordinates to add it
- - Added slave mobs with no master/master died will be removed in mob_ai()
- - Changed damage log by summoned mobs will use their masters' char_id instead
- of account id (old system)
- * Some tidying up in atcommand.c [celest]
-06/20
- * Large monsters now have 2x base stats, drop rates, exp, and zeny (if enabled). [Valaris]
- * Small monsters now have half base stats, drop rates, exp, and zeny (if enabled). [Valaris]
- ** Note: this is referring to size just as @monsterbig and @monstersmall, not small, medium, brute, etc... [Valaris]
- * Removed wedding rings from hasitems script command. [Valaris]
- * Removed monsters_ignore_gms from battle_athena.conf, and added @monsterignore command. [Valaris]
-06/19
- * Sirius: Even though the `id` field is never directly read or
- written by Athena it is neccesary for the SQL server which
- automatically handles it. Else each char may have only 1 item
- in a given table. [Aru]
- * overhauled PA_SACRIFICE. If you want to revert the old
- behavior, you can comment out the new line for it in
- skill_db.txt [Aru]
- * removed broken SQL "upgrade" script [Aru]
- * finished the mapservers direct char loading / Charsaving (SQL only!) [Sirius]
- - set charsave_method in char / map conf to 1 if u want to use the feature
- - please test it and make db backups, the save / load is completly rewritten.
- * Fixed some compilation errors on FreeBSD (old compilers [veider]
-06/18
- * Properly updated graph files (Oh god, i keep forgetting things now...
- sorry again! >.< [celest]
- * celest:
- added a graph.c / graph.h with void graph_init and graph_final functions
- due to compiling errors [sirius]
- * SQL USERS: upgrade with upgrade_2252.sql!
- * Added new maps, items. Thanks to Landarma [Lupus]
- * Added graph creation code by jA / End_of_exam (currently disabled until
- finished) [celest]
- * Added grfio_crc32() [celest]
-06/17
- !!!Bug: on optimizing run_script, Kafra NPC stopped working. Celest, read it plz. [Lupus]
- -- Fixed, sorry ^^; Please test and tell me if anything goes wrong [celest]
- --- Yes. It's fixed now. (Equipment upgraders, etc werent' working, too) [Lupus]
- * Started adding the charsave_method, Loading is working, saving will be finished @ 18.6.05 [Sirius]
- * SuperUser checking ... (never run athena as root!) [Sirius]
- * Added eprintf/eprint (eprintf is equal to printf) but it displays line / file ... (to stdrerr)[Sirius]
- * Fixed Ungoliatnt casting assumptio on it's target instead of self. [Skotlex]
- * Switched two frees around that might have caused problems [Codemaster]
- * Optimised run_script a bit, based on jA [celest]
- * Fixed a memory leak in script.c [celest]
-06/16
- * Fixed "unable to add to guild" bug. [Skotlex]
- * fixed a typo of the guilds sql file DB definition [Lupus]
- * Added left-out bonus bDef2 [celest]
- * Moved minicore .o files compiling to under 'common' [celest]
- * Fixed a client crash when using Advanced/Baby job sprites for mobs [Aru]
- * Added a random modifier to returned damage modifiers to prevent stun-lock
- abusers. [Skotlex]
- It's currently set at +/-5%, not tested to know if that's enough or not,
- feedback appreciated.
- * Updated missing grfio.c, sorry ^^; and thanks Skotlex! [celest]
- * Fixed crash in exporting ip address to plugins [celest]
-06/15
- * Small mod on the new attack function to prevent Asura Strike from
- overflowing and doing minimal damage instead of insane damage. [Skotlex]
- * Merged Iro's patch to get #changesex working. Try it out. [Skotlex]
- * nullpo fix (guild.c:550), it was an actual possible scenario when you
- invite someone to a guild and quit before they reply. [Skotlex]
- * Removed script command gmcommand and replaced it with atcommand &
- charcommand. [Skotlex]
- * Small fix regarding speed updating for Cast Cancel + Freedom of Cast [Skotlex]
- * Added 'make depend' for resetting Makefile dependencies [celest]
- * Readded 'make addons' (works the same as 'make plugins') [celest]
- * Split zlib dll opening from grf opening in grfio.c [celest]
- * Moved grfio.c back to /common, it'll be needed by the core later [celest]
- * SQL Logs crash likely fixed. [Skotlex]
- * Added Stone-Curse to the list of status effects undead chars are inmune
- to. So far undead chars are inmune to Freeze and Stone Curse. [Skotlex]
- * Fixed disp_hpmeter not working properly when set to 0/no [Skotlex]
- * Added malloc_usage() for checking total memory used [celest]
- * Added func_parse_table to assign a parse function according to SessionType
- -- still not used anywhere yet [celest]
- * Added 'SessionType' to session_data [celest]
- * Some tidying up in charcommand.c [celest]
- * Added temporary code for Shinobi's Rebirth skill [celest]
- * Added guild exp overflow fix for TXT char [celest]
-06/14
- * Various item_trade restriction fixes: [Skotlex]
- - Fixed guild/normal storage flags not working right.
- - Fixed a bug which allowed players to store items regardless of
- restrictions.
- - Modified the gm override level behaviour on trades so a high level gm
- can both give and receive the otherwise untradeable item.
- * Small fix to the sql-files/convert_guild_tables.sql script. [Skotlex]
- * Modified function status_calc_speed to be faster since it's only used for
- cloaking and freedom of casting. [Skotlex]
- * Changed the stacking type from speed-bonuses to make it harder to reach max
- walk speed. [Skotlex]
- * Fixed a bug on the way aspd bonuses stack. [Skotlex]
- * Changed map names length from 24 to 16 all over the char(txt/sq) and map
- servers, this could fix the "matrix" bug (if done right...). [Skotlex]
- * General cleanup and memory checks on char server (txt) [Skotlex]
- * Miscellanous memory checks around charcommand.c and atcommand.c [Skotlex]
- * Added Maeki's fix to Maeki's fix of SQL Char Server Guild Saving.
- * Fixed characters not being able to uncloak
- * Split used-by-plugins-only code to plugin.h [celest]
- * Standardised plugin functions and names -- dll.c is now plugins.c, addon_athena
- is now plugin_athena.conf and so on [celest]
- * Updated UPnP plugin to 1.0.3.1 [celest]
- - moved code in socket.c back into the plugin
- - added configuration file support (plugins/upnp.conf) -- you'll need to do
- 'make plugins' to install it
- * Added 'make zlib' for compiling a zlib.dll [celest]
-06/13
- * Fixed Asura Strike possibly doing minimal damage when it should do very
- large damage instead. [Skotlex]
- * Fixed another possible crash on chrif... [Skotlex]
- * Applied Maeki's fix for Guild Sql Char server [Skotlex]
- if it breaks, go stone him :X (I already got enough rocks to watch
- out for...)
- * Made berserk-cancels-users-other-self-buffs a battle_config
- option, default: off [Aru]
- * Some compiler warnings fixes [Skotlex]
- * Added battle_config option equip_natural_break_rate. [Skotlex]
- Default is 1 (0.01% chance).
- * Changed sprinkle sand's range from 8 to 1. [Skotlex]
- * Fixed map server failing to connect to char server... [Skotlex]
- * Char-Sql server revision [Skotlex]
- Miscellanous memory bounds/overflows checks/fixes.
- * Fixed options start_armor/start_weapon (char sql) [Skotlex]
- * Some more map server memory checks and cleanup (90%) [Skotlex]
- * Fixed cloaking re-cloaking you instead of cancelling cloak. [Skotlex]
- * Double Damage multiplier applied after vit/def reductions until further
- information is available. [Skotlex]
- * Restored previous speed stacking type until a fix for the new method can
- be devised. [Skotlex]
- * Removed MVP status from @summon'd monsters. [Valaris]
- * Had the "monster target reset to none" code inside of check for the monster level up code, moved it out. [Valaris]
- * Added update of mob hp display on monster level up if mob hp display and monster leveling are on. [Valaris]
- * Added mob_clear_delay option to battle_athena.conf.
- Can add a delay before sending monster death packet (time is in milliseconds and default 0 is off).
- Increasing this can fix the problem with monster sprites still appearing after it died. Recommended value: 10. [Valaris]
- * Fixed spawning multiple sized monsters via scripts. [Valaris]
- * Added LittleWolf's mode 256 (0x100 internally) for monsters (adds detect hidden to a monster, doesn't have to be an MVP, demon or insect). [Valaris]
- * Fixed bug allowing players to cast warp portal under players and other various invalid blocks. [Valaris]
- * Removed talk conversion of Zherlthsh and Alice pets since clients now support them. Thanks to Kholdstare for pointing it out. [Valaris]
- * Added "ORDER BY" statement to char-server SQL's reading of the memo db, fixing problems with people's memo lists
- screwing up when they log back in. Not sure if this problem exists in TXT char-server as well. [Valaris]
- * Map server memory cleanups... (85%) [Skotlex]
- * Removed battle option "enemy_critical" [Skotlex]
- Use enemy_critical_rate=0 instead.
- * Changed the default of enemy_critical_rate to 0 [Skotlex]
- * Ported oA's imalive and flushtimer system to eAthena plugin 'gui' [celest]
- - You will only need the plugin if you are using a gui program like wxOAGUI
- to run Athena
- - To configure it check addons/gui.conf
- - Passing "--gui" as a parameter, i.e "./map-server --gui" will activate it
- as well (GUI program creators, you should handle this transparently)
- * Added get_uptime to timer.c -- used by @uptime and the 'sig' plugin [celest]
- * Merged the 'uptime' plugin into 'dump' and renamed to 'sig' -- it'll now
- handle both crash and uptime logging [celest]
- * Guild SQL updated again, `exp` and `next_exp` to BIGINT UNSIGNED [CLOWNISIUS]
- * Updated the guild_upgrade made sure UNIQUE KEY guild_id is implemented [CLOWNISIUS]
- * Pets no longer lose intimacy when you die on a nopenalty map [Aru]
-06/12
- * Removed the dynamic mob messages (mobs spawned/removed) from default output [Skotlex]
- (Use battle_config etc_log to enable them again)
- * Fixed sql-files/convert_guild_tables.sql so that it actually works [Skotlex]
- (works only on non-modified guild tables previous the new guild system)
- * Small nullpo fix on @where.
- * Fixed new account flood protection blocking _M/_F registration (txt/sql) [Skotlex]
- The bug? The default disallowed time was 1 registration every 10K secs.
- * Found & fixed the bug that was causing server instability on clif.c [Skotlex]
- * Cloaked characters will uncloak on attack/skill-use [Skotlex]
- * Fix on aspd_rate affecting skills not working [Skotlex]
- * Miscellanous small fixes in map server. [Skotlex]
- * The new attack function is now the unchangeable default. [Skotlex]
- * Updated double_rate (side-winder) behaviour. [Skotlex]
- It no longer adds to double attack's skill rate, instead the higher of
- the two will be used on the currently equipped weapon.
- * Dec Agi now cancels Cart-Boost and viceversa as explained by Ishizu [Skotlex]
- * Cloaked characters now can't pick items. [Skotlex]
- * Made the max speed rate a battle_config option, default 300% [Skotlex]
- * Fixed the overflowed valstr free on skill.c:8840 [Skotlex]
-06/11
- * Lord Knight's Beserk now cancels all the caster's other
- self-buffs when used. It also cannot be re-used during the
- no-SP-recovery penalty period after it expires. (This penalty
- will now cancel on your death however.) [Aru]
- * Reverted the previous stacking type for aspd as per rodatazone
- information [Skotlex]
- Speed modifiers, however, still stack on the new way as there's been
- complains of characters reaching impossibly high walk speeds.
- * Modified bAspdAddRate code so that it stacks linearly. [Skotlex]
- * Changed default stacking type for skill modifiers [Skotlex]
- If you have +50 aspd and +50aspd you won't get 100% aspd, instead now you
- get 50% of the 50%, that is 75% aspd bonus. Changed meant to protect
- against stacking skills to get impossibly high walking speed/attack
- speeds.
- * Modified the way bAspdRate & bSpeedRate work. [Skotlex]
- They are meant to be non-stackable, so only the card/equipment with the
- highest bonus prevails.(items with stackable bonus should use
- bAspdAddRate & bSpeedAddRate instead.)
- * Changed the DoppelGanger Card definition from bAspdRate to bAspdAddRate
- to make it stackable. [Skotlex]
- * Capped walkspeed at 4x default [Aru]
- * Added Maeki's awesome convert_guild_tables.sql
- You must still manually add the `char_id` field to the `guild`
- table and fill it with the guildmasters' char_ids BEFORE
- running it. [Aru]
- * Removed inter_guild_storage_delete calls from int_guild,
- innodb tables make it unneccessary [Aru]
-06/10
- * Updated the default pet_db.txt support values [Skotlex]
- We don't have an official list of the support rates, but 1% as default
- (1.5% if they have max intimacy) is just ridiculous.
- * More map server memory cleanups... (70%) [Skotlex]
- * Fixed that crash upon login.... [Skotlex]
- * More map server memory cleanups... (45%) [Skotlex]
- * More map server memory bound cleanups and checks (35%) [Skotlex]
- * Fixed Stalkers being able to use (plagiarized) ground-target
- skills from Chase Walk
- * Fixed come confusion between MVPs (status_get_mexp) and
- mini-bosses (mode & 0x20) in battle.c
- * Added battle_config option item_use_interval with default 500ms [Skotlex]
- * Started map server memory bounds checking for overflows (20%) [Skotlex]
- * Small optimizations on ensemble skills [Skotlex]
- * Fixed some compile warnings on char-sql server [Skotlex]
- * Added script function getitemslots(item_id); [Skotlex]
- * Fixed a bunch of script functions generating a new dummy item instead of
- failing when the item was not found. [Skotlex]
- * Fixed mobhp display so that it will be displayed no matter which /showname option a player is using. [Valaris]
- * Fixed names with disguises (I tested it. It works. No more bitching. :P). [Valaris]
- * Completely overhauled SQL guild code to use innodb type tables
- unfortunately, old guild tables are not compatible.
- If you don't mind the data loss, wipe your current guild
- tables and run guild_tables.sql to create new guild tables.
- [Aru and CuteBoi]
- * If you want to manually convert your old guild tables, you'll
- need to add the foreign keys from guild_tables.sql to the
- databases. And add the `char_id` field to the guild table.
- Its value needs to be the char_id of the guildmaster [Aru]
- * Added 'alchemist' mob skill condition [celest]
- * Rewrote most of the old jA Self Destruction code [celest]
-06/09
- * Fixed a possible null_po in clif.c:7714 caused by lagged clients [Skotlex]
- * Fixed enemy damage_delay being modified by 400 instead of 100. [Skotlex]
- * Changed behaviour of map_freeblock/map_freeblock_unlock as the previous
- way seems to cause memory leaks. [Skotlex]
- * Tidied up code relating to skill_get_inf2() [Skotlex]
- * skill_db.txt updated. New inf2 values: [Skotlex]
- 16: Guild skill, 32: Song/Dance skill, 64: Encore skill
- * Other misc arrangements to skill_db.txt (see db/Changelog) [Skotlex]
- * Tidied up code relating to skill_get_nk() [Skotlex]
- * Readded the previously removed skills from item_db [Skotlex]
- * getpetinfo(2) will return "null" on no pet. [Skotlex]
- * Tidied up code relating to skill_get_inf() [Skotlex]
- * Some small fixes to @grind, @useskill [Skotlex]
- * Added fist (bare hands) to the list of unbreakable equipment in
- pc_break_equipment [Skotlex]
- * Reestructured battle_config options for equipment breaking [Skotlex]
- Removed equipment_breaking and added equip_self_break_rate,
- equip_skill_break_rate. Read battle_athena.conf for more info.
- * Fixed getpetinfo(2) crash. [Skotlex]
- * Added a couple missing lines from my PSIBlade merge of disguises. Name, attacking
- and such are fixed now with disguises. [Valaris]
- * Added battle_config option to set if advanced job skills may be plagiarized
- * Fixed ASC_BREAKER to ignore race/size/element cards like it should
- * Changed @fakename so it no longer needs to teleport the client to work [celest]
- * Removed the old day/night system that uses the blind effect [celest]
- * Fixed day/night cycles with darkness_level on not refreshing properly [celest]
- * Fixed pc_follow_timer cancels if the player or the target warps [celest]
- * Added @follow on the same target for the 2nd time will stop following [celest]
- * Added Memory manager will perform a hash check when freeing memory, by
- End_of_exam / jA 1213 -- fixes crashes when a pointer created by level 2 ALLOC
- is passed to level 1 aFree
-06/08
- * Updated idle time considerations. [Skotlex]
- A character's idle time is reset upon: Walking, attacking (auto-attack
- counts too), using a skill or using a item.
- * idle_no_share changed from a Yes/No setting to # of seconds before
- considering character idle (no/0 still disables). [Skotlex]
- * Updated idle_no_share description in battle_athena.conf
- * Modified @disguise so that it will always work with Npc/Mob names and Mob
- Ids. Only npc by id is hardcoded for now. [Skotlex]
- * Added atcommands cleanmap, npctalk, pettalk to atcommand_athena.conf with their
- description. [Skotlex]
- * Fixed spawn delays for anthell eggs [Skotlex]
- * Removed equipment_breaking, use equipment_break_rate = 0 instead.
- [Skotlex]
- * Clarified some of the comments in battle_athena.conf [Skotlex]
- * Steal/Snatcher won't work on summoned creatures now. [Skotlex]
- * Some db updates (see db/Changelog) [Skotlex]
- * Fixed rude_attacked state not being reset after triggered, credits to
- Komurka [Skotlex]
- * GM used Type 11 items will be exempt from the "GMs can do whatever they
- want" rule regarding skill_usage because otherwise the used item is never
- consumed. [Skotlex]
- * Fixed Ice Falchion/Firebrand giving skills, they just cast the spell [Skotlex]
- * Reduced Ice Falchion's freezing chance from 5% to 1% [Skotlex]
- * Added Makefile caching [celest]
- 'Makefile.cache' is created when you compile for the first time, and keeps
- all your makefile definitions so it can be read directly when you recompile,
- instead of redetecting things one-by-one.
- 'Make [char_sql/login_sql/map_sql]' will now work properly too.
- NOTE: A cache file created by compiling txt is NOT compatible with SQL, but
- a cache created by SQL is compatible with TXT! Delete the cache file first
- and compile SQL before TXT if you have to.
- * Skills will reset at level down. [davidsiaw]
-06/07
- * Temporary change of the way mob memory is removed when they don't have a
- respawn time (check for memory leaks fixed after killing all summoned mobs)
- [Skotlex]
- * Fixed map_quit being called twice when a player requests to change char [Skotlex]
- * Fixed compile issues on various versions of linux
- (please avoid inline in include files until we offically go
- over to being a c++ app) [MouseJstr]
- * Fixed aFreed messages of double freeing sd->reg and sd->reg_str [Skotlex]
- * Re-fixed sql-files/item_db.sql [Skotlex]
- * Plagiarism won't work if the skill to be copied killed you. [Skotlex]
- * Removed use of 'l' as prefix for temporary variables. [Skotlex]
- * Updated max hair styles in battle_conf to 23 [Skotlex]
- * Updated map server to jA1159~1203 [celest]
- - Added imbueing weapons with random element (with bonus bAtkEle,10;)
- - Added Soul Strike do additional damage on undead
- - Added Grand cross will not damage self when cast by mobs
- - Added Cannibalize & Marine Sphere summoned mobs will use their owner's name
- - Added clean up player info when switching characters
- - Added reinitialise storage when char server disconnects
- - Changed some cloaking/chasewalk checks
- - Fixed memory leak when map cache reading has an error
- - Fixed a bug when receiving member info for an empty guild
- - Skip still connecting players in clif_foreachclient()
- * Weather will now properly appear/disappear without having to refresh the client. [Valaris]
- * Complete monster disguise re-code: [Valaris]
- -No more client crashes in PVP caused by disguises.
- -Can view own attack/hit/cast/sit/turn animations.
- -Monster sprite syncs up better than before.
- -Fixed stat dupe exploit with disguises.
- -Fixed crashes that prevented peco riders with disguises.
- -No more refreshing of the screen when equipping/unequipping disguises.
- * Fixed crashes caused by Graffiti Cleaner. [Valaris]
- * Added following missing checks to Ensembles: [Valaris]
- -Partner's equipment is an instrument.
- -Partner is alive.
- -Partner is not casting another skill (This allowed dance floor panel duping).
- -That both people are in a party (before if both partner's were in no party (party ID 0)
- it would allow them to use an ensemble.
-06/06
- * Fixed and updated sql-files/item_db.sql to match with the current
- db/item_db.txt [Skotlex]
- * Removed variables with prefix "l" being treated as a temporary
- variables by the scripting engine. [Skotlex]
- * Updated description of idle_no_share battle_config option [Skotlex]
-06/05
- * Added more debugging information to login-in characters to track down the
- authook nullpo problem. [Skotlex]
- * Added a temporary string length check on trade-request. [Skotlex]
- (reports seem to indicate that the map-server garbage text bug could be
- related to trading string length overflow, check the map-server output
- for "name too long" messages).
- * Fixed a few Visual Studio compile errors and warnings - not completely fixed [Codemaster]
- * prevent_logout is now overriden by dead characters. There's no point in
- waiting 10 secs since you were killed to quit/change character. [Skotlex]
- * Passive mobs will now unlock their target once it's dead/gone too
- far/in another map. [Skotlex]
- Passive mobs are supposed to be defensive, not vengeful. Do report of any
- abuses that might be possible from this to take proper measures.
- * Fixed pet lures always failing (oops) [Skotlex]
- * Corrected Various Jur's (id 1264) equip script to bonus2 [Skotlex]
- * Fixed status_get_speed always returning 1000 when invoked on NPCs [Skotlex]
- * Added battle_config option pet_support_min_friendly [Skotlex]
- Specifies minimum pet intimacy/friendly value needed before attacking.
- Default 900, see battle_athena.conf for more information.
- * Some reorganizing of pet-catching code [Skotlex]
- * Now mobs will do the /ag emotion when you use a lure on them and they
- can't be caught (wrong lure, or mob not in the mob_db.txt). [Skotlex]
- * Fixed a timer mismatch situation with pc_walk timers [Skotlex]
- * Re-structured the pc_follow_timer code [Skotlex]
- * Updated the pet_heal_timer code to match behaviour with
- pet_supportskill_timer's one [Skotlex]
- * Added support for universal lure. [Skotlex]
- Use use_script "pet 0;" to create an item that will catch any non-boss
- mob (will work as long as said mob has an entry in mob_db.txt, of course)
- From what I read in the code, mapping multiple entries in mob_db.txt to
- the same egg_id should work, so it should be possible to have all mobs as
- pets using a single egg_id item and this custom lure.
- * Updated Weapon Repair from jA 1228 [celest]
- * Fixed TXT char disconnecting when sent a server packet from SQL map [celest]
- * Fixed login failing with md5 encryption, thanks to End_of_exam
- * Fixed lock_fclose() failing in Win32 builds, thanks to End_of_exam
- * Updated sql-files/mob_db.sql to match with db/mob_db.txt [Skotlex]
- * Corrected Zherlthsh's and Alice's attack animation speed (mob_db.txt) [Skotlex]
- sql-users can use upgrade_svn2068.sql to update table mob_db.
- * Re-fixed disp_hpmeter not getting disabled when set to 0/no [Skotlex]
- * Fixed Grandcross/DarkCross to do 3 hits instead of 4 [Skotlex]
- * Fixed #fakename =). [Kevin]
- * Tidied up and rearranged Makefile a bit [celest]
- - added 'make [common/map/login/char] options' -- only for txt though ^^;
- - readded sse, mmx and o3 optimisation flags (disabled by default) -- you'll
- have to edit and enable them yourself
-06/04
- * Moved @charchangesex to #changesec *still disabled*. [Kevin]
- * Fixed a major security hole in the mail system, thanks to Valaris for the info =). [Kevin]
- * Moved @charsk/stpoint to #sk/stpoint. [Kevin]
- * Moved @charmodel to #model. [Kevin]
- * Moved @charst/skreset to #st/skreset. [Kevin]
- * Re-updated sql-files/item_db.sql to use price buy/sell NULL instead of 0 [Skotlex]
- The file is full of REPLACE instead of INSERT, so if you already have the
- structure of the table right, you can just delete the table definition
- and apply the file to update your item_db table.
- * Commented out char_athena.conf. [Kevin]
- * Moved @charlostskill to #lostskill. [Kevin]
- * Moved @charquestskill to #questskill. [Kevin]
- * status_change_start will halt silently instead of printing null_po messages
- when trying to apply status effects on pets [Skotlex]
- (Fixes null_po's from pets doing magnum break and who knows what other
- skills)
- * Moved #showexp and #showdelay to @showexp and @showdelay. [Kevin]
- * Moved @charjoblvl and @charbaselvl to #joblvl and #baselvl. [Kevin]
- * Readded the cloth dye packet upon-walk. Sorry about that [Skotlex]
- * Fixed Party Exp Even Share [Skotlex]
- * Added #fakename, due to popular demand =)[Kevin]
- * Clothe dye is updated now on view_class change [Skotlex]
- Most noticeable effect: Dye is not lost un unequipping a tuxedo/wedding dress.
-06/03
- * Updated sql-files/item_db.sql to match with the current db/item_db.txt [Skotlex]
- * Added some initialization code regarding dynamic mobs during map startup. [Skotlex]
- * Fixed the typo on Thief's Sling Stone quest (Zargon->Garlet) [Skotlex]
- Why noone fixed this before? o.O
- * Removed a piece of code that updates your cloth's dye whenever you walk.
- I have been testing for a bit, and this piece of code seems unneeded, and
- not only that, it causes quite a bandwidth penalty by sending
- dye-changing packets every time every character walks! [Skotlex]
- If you get reports that the characters are getting displayed their
- default color instead of their selected dye, report it so I add back that
- piece of code (but it would be best if we could do without it, it would
- save quite some bandwidth).
- * Some compiler fixes in older versions of GCC, thanks to esca.
- * Some optimizations to petskill_use [Skotlex]
- * Fixed the default max hair dye color count, it is 8, not 9 @.@ [Skotlex]
- * Changed disp_hpmeter's behaviour so that you can disable it by setting it
- to "no" or 0. [Skotlex]
- * Fixed gm chat kick protection. [Skotlex]
- * 'Tidied' a bit party_exp_share (more like restructured it). [Skotlex]
- * Re-added party_idle_no_share code. When was it removed? [Skotlex]
- * Added skills going damanage when PVP isn't on fix. [Kevin]
- * Fixed the party-even-share bonus for large parties. [Skotlex]
- * Fixed gm chat kick protect.[Kevin]
- * GM of higher or equal level can use @where on another GM.[Kevin]
- * Fixed @fakename command.[Kevin]
- * Stopped the map-server from invoking "OnAgitStart" each time it connects
- to the char server. [Skotlex]
- * Modified Abracadabra code to make it work with Pet Skills [Skotlex]
- (Warning: Not yet tested)
- * fixed a bug with Abracadabra
-06/02
- * fixed compile issues on older gcc, thanks to esca [Shinomori]
- * Added @size and @fakename gm commands. [Kevin]
- * Added valaris's getstrlen and charisalpha functions into the script parser. [Kevin]
- * Added clif_guild_xy(_remove), rest needs to be added somewhere. [Kevin]
- * Fixed items lost on shutdown/crash, by valaris. [Kevin]
- -Note: Was partially finished by massdriller =).
- * A few things: [Kevin]
- -Fixed valaris's gms can't be kicked function.
- -Added battle_config option for valaris's function.
- -Added battle_config option for gms can join password protected chats of valaris's .
- * Moved "readme"'s and other non important files into doc/notes/ [massdriller]
- * Cleanup in chat.c, party.c, storage.c [celest]
- * Fixed an inconsistent message for log_chat in conf file reading [celest]
- * Fixed mob class changing not checking array bounds, by Shinomori
- * Fixed mob summoning slaves not checking array bounds, by Shinomori
- * Updated max packets in clif.c [celest]
- * Fixed some compile time warnings. [Kevin]
- * Added GM chat kick protections, thanks to Valaris [massdriller]
- * Added Password protection chat rooms access to gms, thanks to Valaris [massdriller]
- * Fixed a couple of things in map.c, thanks to Valaris [massdriller]
- * Storages now saves upon closing, thanks to Valaris [massdriller]
- * exp share and added zeny share/party bonus exp thanks to Valaris [massdriller]
-06/01
- * Fixed Divest Shield and Divest All not able to strip shields [DracoRPG]
- * Changed the default max_hitrate to 100% as specified in rodatazone [Skotlex]
- * Removed the console messages printed when the script command getmapxy is
- invoked [Skotlex]
- * Fixed non-droppable items blocking the client from further droping
- other items [Skotlex]
- * Changed the default of mob_remove_delay to 5 mins [Skotlex]
- * Changed the minimum mob_remove_delay to 15 secs since mobs with instant
- respawn actually take 5~10 secs to respawn [Skotlex]
- * Fixed again disp_hpmeter, it looks like this time it works properly. [Skotlex]
- * Added Esca's fixes to make eA properly compile under Sun-OS [Skotlex]
- * Tested and fixed script function getnameditem [Skotlex]
- Now you can use getnameditem(item,char) to get inscribed equipment (only
- works with what you can equip, arrows excluded). The item description can
- be the item id or the item name, and the character can as well be the
- character id or character name. Function returns 1 if successful and
- the character who's name is to be inscribed HAS to be online.
- * Changed the way dynamic mobs are removed. Now all mobs have are tagged as
- either cached/uncached, and only those cached are removed [Skotlex]
- Mob-Slaves are the only non-cached enemies that are also tagged as
- cached.
- * Fixed a delete_timer mismatch in pet.c [Skotlex]
- * Fixed some compile time things in older versions of gcc. [Kevin]
- * Removed the clif message when you can't drop items [Skotlex]
- Apparently this message breaks the clients and prevents further drops of
- items? Might need further testing.
- * Changed AspdRate and SpeedRate bonuses so they can stack [DracoRPG]
- * Added script function getnameditem [Skotlex]
- syntax: getnameditem itemid, inscribed char's name
- Needed at least for wedding scripts. Only works on equippable items,
- returns 1 on success, always makes only 1 item.
- (it should also be able to use char's id or item's name instead)
- Script function proof-read but not yet tested, so it might have a bug or
- two, use at your own risk for now.
- * Fixed dynamic mobs removing Guardians [Skotlex]
- * Fixed sql queries in logs giving an error. [Kevin]
- * Fixed @memo ignoring the nomemo map flag, thanks to Maeki. [Kevin]
- * Enabled an account flood protection system defaulting to 1 account every 10 seconds. [Kevin]
- * Corrected dynamic mob unloading to remove slaves. [Skotlex]
- * Added Maeki's fix for handling the sql connection to the log server [Skotlex]
- * A reminder to people who seem to have a broken item_db (wrong item
- sprites, doing nothing on click, etc): there was an update to item_db
- some days ago, a new column which is used to determine refineable
- items (which goes between eLv and View) The shipped item_db.txt is
- already updated, but if you have custom files, you can try updating
- them using the gawk line (further below this changelog) or this short
- sed command (from within the db directory):
- gsed -re 's/([^,]*,){16}/&,/' < item_db.txt > item_db.fix
- And then replace item_db.txt with the newly created file (if ya don't
- have gsed, try sed. All *nix should come with one or the other, and you
- can also get it with cygwin)
- * Moved the dynamic mob spawns/deletes to map_addblock/map_delblock [Skotlex]
- This pretty much guarantees that mobs won't be spawned/deleted twice from
- the same map.
- * Added random's battle_config flag for enabling/disabling dynamic mobs [Skotlex]
- Dynamic mobs is good for medium to small servers, but on large ones it
- gets to be somewhat pointless.
- * Fixed disp_hpmeter, I think (can't test it, but the code looks ok) [Skotlex]
- * Added battle athena option mob_remove_delay [Skotlex]
- Now dynamic mobs are not removed inmediately, but after some time has
- passed. Default value is 60 secs
- * Added debugging information about dynamic mobs [Skotlex]
- Helps keep track of how many mobs are being removed/spawned, use it to
- track any possible bugs! Should be removed after dynamic mobs are good
- enough.
- * Some changes to dynamic mob unloading to avoid remove summoned mobs and
- always remove mob slaves. [Skotlex]
- * Fixed a nasty pc.c bug thanks to komurka [massdriller]
- * Added Sasuke's modification to allow certain gm levels to see the
- hp bars [massdriller]
-
-05/31
- * Added Einbroch mobs to dead branch DB [Arutema]
- * Fixed NPC Typo [Codemaster]
- * Updated help.txt, fixed a compile time warning on BSD systems. [Kevin]
- * @marry auto-gives named rings, removed @rings as in-needed [Arutema]
- * Fixed some compilation errors in BSD systems. [Kevin]
- * Restored dynamic mob cleaning to what it was a couple of nights ago
- Should send the system back before all hell broke loose. [Skotlex]
- * Added battle_config options min_hitrate & max_hitrate [Skotlex]
- These only affect the new attack function, and th defaults are 5%-95%
- * Added client-messages for when an item can't be drop/stored [Skotlex]
- * Finished implementing the "optimization" item_trade.txt [Skotlex]
- * Optimised the long forgotten MVP arena [massdriller]
-
-05/30
- * Rewrote the trade-add-item function, it was hella messy [Skotlex]
- * Updated item_trade.txt implementation [Skotlex]
- GM-override lv is still to be implemented.
- Code has been reviewed, but not actually tested yet, use with caution.
- * Fixed fame list first loading, at server startup [DracoRPG]
- * added lordalfa's @me action command [massdriller]
- * Reverted changes to dynamic mob removal, now all mobs are removed [Skotlex]
- mob_remove_damaged is still respected.
- * Partial implementation of item_trade.txt, not quite finished yet [Skotlex]
- * Fixed mob_remove_damaged [Skotlex]
- * Added two new battle_athena options: [Skotlex]
- show_hp_sp_drain (yes/no): displays drained hp/sp from attacks (ie:
- Hunter Fly Card)
- show_hp_sp_gain (yes/no): displays gained hp/sp from killing mobs (ie:
- Sky Deleter Card)
- * bHPGainValue, bSPGainValue will only display gained hp/sp when said
- gain is above 0. [Skotlex]
- * Changed hp_dispmeter from yes/no to GM-level [Skotlex]
- Note that now the default value is hp_dispmeter: 100
- * Fixed item_avail.txt reading could crash on newline [celest]
- * Speedup and fixed @reloaditemdb messing up inventory data [celest]
-
-05/29
- * Optimised job quests scripts [massdriller]
- * Fixed guild expulsion bug, two chars on same account would be expelled. [Kevin]
- * Dynamic mob unloading won't touch mobs with a deletetimer now [Skotlex]
- this affects mobs scheduled to be removed (including @summon mobs)
- * Dynamic mobs now also removes mobs that have a master [Skotlex]
- * Fixed Knockback skills on the new attack function [Skotlex]
- * Rewrote the vitality reduction equation in the new attack funcion [Skotlex]
- The new equation conforms to rodatazone's information here:
- http://rodatazone.simgaming.net/mechanics/substats.php#def
- * Fixed item_db.txt to contain the new refinable column [Skotlex]
- (I accidentally commited the old item_db last time...)
- TXT users with custom items can update their custom db using gawk (*nix
- or under Cygwin) this way (thanks to Sasuke):
- gawk -F, '{ for (i=1; i<= NF; i++) { if (i==16) { printf $i; printf ",";printf ","; } else if ( i==NF ) { print $i; } else { printf $i; printf ","; } } }' db/item_db2.txt > item_db2.new.txt
- Run it from within the root eAthena directory, and you'll get an updated
- item_db2.txt in your root directory. However, all custom items are not
- refineable by default this way, you still have to set to 1 the refineable
- column where it applies on your custom item_db.
- * Improved uptime checking, by Shinomori
- * Improved calltable import/exporting, by Shinomori
- * Standardised init/finalise functions' names [celest]
- * Fixed SVN version display at client connection, thanks to Maeki [DracoRPG]
- * Prevented Snatcher to try stealing players and already stolen mobs, thanks to shadow [DracoRPG]
- * Fixed Parrying and slightly organized status_change_start [DracoRPG]
- * Removed fame list update timer and made it to refresh the list everytime pc_addfame is ran [DracoRPG]
-
-05/28
- ~ Name of NPC file in map_athena.conf is now scripts_main.conf
- ~ Added a new column to item_db.txt/item_db2.txt: refineable [Skotlex]
- The column goes between equip_level and view, use upgrade_svn1863.sql
- to update sql tables (including item_db2.txt). Custom item users of txt
- servers will have to update manually.
- When the column's value is 0, NULL (sql) or blank (txt), the item can't be
- refined.
- OLD ITEM_DBS WILL NOT WORK WITH THIS NEW UPDATE, update your custom
- items!
-
- * Fixed a crash bug in pet_heal_timer on timer mismatch. [Skotlex]
- Thanks to Celest for noticing it out.
- * Fixed the critical attacks bug in the new attack function. [Skotlex]
- * Added MassDriller's updated readme.html files. [committed by Skotlex]
- * Fixed script_athena.conf reading of "event_requires_trigger". [Skotlex]
- It was looking for "require_set_trigger" instead of
- "event_requires_trigger", which effectively ignored the
- event_require_trigger's value. Logout events should now be usable without
- the need of a global variable.
- * Registered all used timer functions to help debugging [celest]
- * Added -DMINICORE to compile core.c (for converters and ladmin) [celest]
- * Removed most unused code and files in char and login converters [celest]
- * Moved converters to /txt-converters [celest]
- * Some tidying up in core and socket.c [celest]
- * Fixed a bug in the new attack function dealing with dual-wielding [Skotlex]
-
-05/27
- * Removed YET AGAIN the mob's skill_idle_flag function. [Skotlex]
- Komurka updated the mob_skill_db so that it is not needed anymore.
- * Modified the critical equation on the new attack function [Skotlex]
- The original equation ((1 + LUK*0.3 + EquipmentBonuses) * CritModifier -
- TargetLuk/5) was meant for official servers, where mobs don't do
- criticals. If applied to mobs, they get very high critical rate, so the
- luk reduction was bumped up to TargetLuk*3/10 on situations where a player
- is targeted by a mob.
- * Re-Applied the idle_skill_flag [Skotlex]
- It was removed because people said it was broken, however it works
- exactly the way Komurka explained it to me:
- A mob can cast only one idle skill, and can't do another one until it
- moves. If the mob casts too many idle skills because it
- casts/moves/casts, then increase the skill's delay in the database! If it
- still does "not works", drop me a line explaining why, because it works
- exactly as I was told it should.
- * Small adjustment of the critical equation in the new attack function [Skotlex]
- * Fixed some crashes related to pet skills and timers [Skotlex]
- * Fixed 1 delete_timer error with pc_stopwalking [celest]
-
-05/26
- * Tidied up mob.c and map.c a bit [celest]
- * Removed rehash() in atcommand.c [celest]
- * Fixed @reloadscript issue with dynamic mobs [celest]
- * Added flush fifos first before reloading in @reloadscript [celest]
- * Added spawn mobs with 1 second delay instead if moblist is full, by Shinomori
- * Fixed wrong name saved when adding friends, thanks to Maeki
- * Fixed itemhealrate stackable, thanks to starlon
- * Set the new_attack_function to be used by default. [Skotlex]
- This function replaces the three previously used functions (pc/mob/pet)
- into a single one which was rewritten to follow the attack algorythm as
- described in http://rodatazone.simgaming.net/mechanics/attacks.php
- Please report any inconsistencies or strange behaviour that this new
- function brings (only affects physical attacks/skills) on the boards.
- If anyone can do some performance comparisons with the old method, that'd
- be useful too.
- If you absolutely don't want to test it and prefer the old method, in
- battle_athena.conf add a line that goes:
- new_attack_function: no
-
-05/25
- * Fixed typos in Absorb Spirits, Double Casting and Tarot Card, thanks to Komurka
- and Avaj
- * Added missing code for Flasher, thanks to Komurka
- * Fixed a string bug in grfio_resnametable [celest]
- * Updated the readme files to the current statistics. [Mass Zero]
-
-05/24
- * Added 'make addons' -- plugins will not be compiled by default now [celest]
- * Ported uptime logging function to eAthena plugin [celest]
- * Ported pid file creation function to eAthena plugin [celest]
- * Ported stackdump creation function to eAthena plugin [celest]
- * Added capability to export to plugins [celest]
- * Fixed ensemble skills, thanks to Komurka
- * Fixed Dissonance damage, thanks to shadow
- * Reverted db/pet_db.txt to it's original form. [Skotlex]
- The pet skills shipped with eA should be as close as possible to the
- original servers. If you prefer the current custom skills in place just don't
- update the pet_db.txt file.
-` (Somehow my custom pet skills table got updated to svn and I didn't notice
- it ^^')
-
-05/23
- * Fixed a few problems wit Dynamic Mobs [Wizputer]
- Increased max mobs per map from 32 -> 128
- Fix mob unloading
- Special Mobs w/ Spawn delays are exempted (MVPs, Gaurdians, Branches, and summoned)
- Added Option for damaged mobs not to be removed in battle config ( Default yes )
- * Mob count in scripts returned 1 less then it was supposed to. [Kevin]
- * Updated tool/stackdump script to support eA's own stackdumps [celest]
- - Type ./stackdump help to check
- * Changed mob_cleanup_sub simply to cleanup_sub [celest]
- * Fixed some memory leaks with dynamic mobs [celest]
- -- notes: Check bugs.txt
- * Fixed some compile warnings in gcc 4.0 [celest]
-
-05/22
- * Added Jbain's server restarter bat files. [massdriller]
- * Drastically Improved Memory usage by making mobs dynamic [Wizputer]
- Mobs load only when a PC is present on the map
- Mobs that have special spawn delays are not loaded/unloaded
- ( Reduced memory usage by 60% for 419 Maps )
- * FIFO size fixes [Shinomori]
- * Fame point system now uses pc_addfame [DracoRPG]
- * Added support for new NPC sprites in @disguise, thanks to akusarujin [DracoRPG]
- * CharSQL: changed the init / login connection issue, now 'online'
- players will be set offline in login @ start / login reconnect [Sirius]
-
-05/19
- * Fixed displaying new when char_new is set to one and changed the option to char_new_display. [Kevin]
- * Fixed mysql fix. [Kevin]
- * Fixed a previous fix with pet idle skills, needs db update not hard coding. [Kevin]
- * Fixed mysql queries to support the following: [Kevin]
- -Names now support the ' character
- -Runs faster because querying string fields doesn't do strlen.
- -Debug option to revert back to old debug queries, will disable the support of the two above.
- * Added No Dead Branching Mapflags in cities [massdriller]
- * Fixed Asura Strike to need only 1 spiritball if used after Chain Crush [celest]
- * Added Asura Strike can be chained after Tiger Fist [celest]
-
-05/18
- * Fixed up character creation, txt supports three status error and char_new is now enabled. [Kevin]
- * CharSQL: fixed the Delete Char issue, now it's using the sd->email instead if the sql email [Sirius]
- * Removed status points adding can be limited via gm level [celest]
- * Removed double clean up when char server disconnects from map [celest]
- * Removed 'mysql_real_escape_string' usage in SQL char until it'll no longer cause
- crashes [celest]
- * Added signal handler for SIGXFSZ [celest]
- * Fixed some compile errors [celest]
- * Fixed broken status changes [celest]
- * Fixed Max Overthrust not working [celest]
-
-05/17
- * Fixed null pointer in map.c. [Kevin]
- * Fixed on a compile time error in status.c/h [Kevin]
- * Fixed an invalid pointer in clif.c [Kevin]
- * Removed 'Agi Up' visual effect from Berserk [DracoRPG]
- * Tidied up npc.c a bit [celest]
- * Added crash check in SQL char creation [celest]
- * Changed Marionette Control's inf type [celest]
- * Added infinite emperium/guardian hp fix, thanks to random
-
-05/16
- * Fixed a slightly large inefficiency and bug in clif_foreachclient thanks to Sasuke-! [Kevin]
- * Fixed a bug in minimap thanks to Komurka. [Kevin]
- * Added mysql_real_escape_string() while creating a new character
- - Might fix a few character names if you have no restrictions [Codemaster]
- * Fixed 'rudeattacked' skill condition, thanks to Komurka
- * Replaced zlib_win32.h and zconf_win32.h with the v1.2.2 files in /zlib [celest]
- * Ported zlib.dll loading to eAthena plugin form [celest]
- * Fixed some NPC skills acquirable by @allskill [celest]
- * Merged sigpipe's handler with sig_proc [celest]
- * Optimised timer.c a bit (partially from Shinomori's changes) [celest]
- * Fixed up some more null pointers. [Kevin]
- * Added Chat-Logging (for Whisper, Party and GuildChat!) [Sirius]
- - Sql Log Users please upgrade: sql-files/upgrade_svn1759.sql
-
-05/15
- * Minor bug fix by NSSTrunks
- * Added Shinomori's MakeWord, MakeDWord and GetWord functions to split a 'long' into
- 'short' & assemble 'short' into 'long', used for produced items and pet eggs [DracoRPG]
- * Fixed famous player's produced items not giving bonuses if the producer had a too long
- character ID (exceeding 'short' capacity and then stored both in card2 and 3) [DracoRPG]
- * Added gm command symbol checks for atcommand/charcommand.c, thanks to akusarujin
- * Added valid session check in clif_additem, thanks to Sasuke
- * Fixed a heavy memory leak with the Memory Manager, by Shinomori
- * Fixed a memory leak with empty scripts, by Shinomori
- * Removed npc unloading via npcname_db finalising -- fixes some wild frees [celest]
- * Fixed monsters' attacked_count never cleared if it successfully casts a skill
- from 'rudeattacked' condition [celest]
- * Fixed some NPC skills can be copied by Plagiarism [celest]
- * Changed Enchant D.Poison's poisoning effect to not work on bosses instead of
- damage bonus [celest]
- * Fixed an item dupe bug, very rare occasions [Kevin]
- * Tidied up pc.c [celest]
- * Fixed some wild frees from npc unloading at shutdown [celest]
- * Changed Make Arrow to not display equipped items as material choices [celest]
- * Removed 'make_arrow_flag' -- use 'produce_flag' instead [celest]
- * Fixed equip breaking bug in pc.c. [Kevin]
- * Fixed alot of null pointers thanks to Sasuke-. [Kevin]
- * Set default in battle_athena.conf of player_skillup_limit to yes. [Kevin]
- * Extended hide_gm_session to @where [Kevin]
- * Fixed a guild exp overflow bug in guild.c & int_guild.c[Kevin]
- * new command @iteminfo item_name/id (@ii). It works, but will be improved [Lupus]
- * added all known mapflags into @mapinfo command. Rearranged output [Lupus]
-
-05/14
- * Simplified @cleanmap [celest]
- * Fixed finalizing clean up could miss 1 map [celest]
- * Added placeholder code for NPC_EMOTION_ON [celest]
- * Fixed damage bonuses (damage_rate) not working for normal attacks [celest]
- * Fixed Concentration (again ^^; ), thanks to lordalfa
- * Fixed base file name sometimes not retrieved properly in core [celest]
- * Removed "memwatch.h" includes for all source files other than malloc.h -- only
- 1 define is enough [celest]
- * Fixed wrong packet for 01-10aSakexe's UseSkillToPos [celest]
- * Skip rearranging large memory blocks while cleaning up on memory manager
- shutdown [celest]
- * Updated the guild aura skills -- gives +1 stat per level, and runs a bit
- faster [celest]
- * Fixed broken Marionette Control -- changed to clowns/gypsies that are under
- marionette will not be able to use the skill [celest]
- * Fixed Absorb Spirits working on boss-type monsters [celest]
- * Fixed Body Relocation hiding when used by monsters [celest]
- * You can only use mute commands when the system is enabled. [Kevin]
- * Fixed a guild bug in inif_guild_leave in intif.c, would expel are characters on an account [Kevin]
- * Added new mapflags (mainly for fixing jobquests abuse and arenas) by Lorky, fixed added by [Lupus]
- - noexp - on killing a monster you don't obtain both Base and Job EXP at all (including MVP EXP bonus)
- - nobaseexp - on killing a monster you don't obtain Base EXP at all (including MVP EXP bonus)
- - nojobexp - on killing a monster you don't obtain Job EXP at all (including MVP EXP bonus)
- nobaseexp+nojobexp=noexp
- in other words, 'noexp' set both mapflags 'nobaseexp' and 'nojobexp'
- - noloot - on killing ANY monster you get no loot at all
- - nomobloot - on killing a common monster you get no loot at all
- - nomvploot - on killing a MVP monster you get no MVP loot at all
- nomobloot+nomvploot=noloot
- in other words, 'noloot' set both mapflags 'nomobloot' and 'nomvploot'
-
-05/12
- * Very very very strong weapons (forged with 3 Star Crumbs) now give +40 dmg
- instead of +15 dmg [DracoRPG]
- * Weapons/potions made by a top-10 famous player now give bonus effects [DracoRPG]
- * Updated the battle.c change made to generate compile time
- errors if you put the wrong battle_config option with the
- wrong type into the wrong place [MouseJstr]
- * Added item type 11 into LOGs filter [Lupus]
- * Removed mob_skill_use, if you don't want mobskills, set mob_skill_rate to
- zero [Skotlex]
- * Modified drops_by_luk behaviour. See battle_athena.conf for details [Skotlex]
- The new system works a lot like Diablo 2, where having 100% better chance
- of finding items means that you basicly get double drop rates than others.
- * Implemented pet idle skills restrictions as explained by Komurka [Skotlex]
- From what I was told, a mob can only cast a skill while in idle state
- once, and it needs to move before it can do another idle-state skill.
- * Tested and fixed wedding_ignorepalette, it now works as it should [Skotlex]
- * Tested the new item type 11. I forgot to add the code for the sql
- version, but that's now fixed and the new system works as it should [Skotlex]
- * Put a fix in for the bug mentioned below [MouseJstr]
- * Added code to make min_hair_style, max_hair_style, min_hair_color,
- max_hair_color, min_cloth_color, max_cloth_color work [Skotlex]
- What it does, is cap the values whenever you try to change the
- character's dye via an npc/script, it won't touch character's dye colors
- upon loading.
- * Shrinked @mapinfo output, added 2 missing flags NOWARP / NOWARPTO [Lupus]
- * New item type (11) to item_db: delay-consumed usables. [Skotlex]
- . All items that have in their script "pet" or "itemskill" must be changed
- from type 2 to 11. The new type of item has the property of not being
- consumed on double click, but after a target is selected (hence it is
- ideal for lures, skill-casting items and the yggdrasil leaf)
- The item_db.txt file was updated to reflect these changes. Custom pet
- lure owners, update!
- SQL users can run upgrade_svn1705.sql which will upgrade both item
- databases (including all custom lures)
- * Added battle config option 'ignore_items_gender'. [Lupus]
- So any player can equip any item regardless of the gender restrictions.
- Note: It's ignored by default since gender check isn't implemented at
- official servers.
- There are 2 exceptions: Wedding Ring M/ Wedding Ring F (their gender check
- won't be affected)
-
-05/11
- * Added by popular demand battle config options mob_skill_rate &
- mob_skill_delay. See battle_athena.conf for further information. [Skotlex]
- * Added battle config option wedding_ignorepalette (default no)
- When enabled, the wedding dress/tux will always display with the default
- dye (not all palette packs bring palettes for the wedding class, nor
- they should) (Needs testing)
- * Changed most battle_athena options to unsigned short. This means the
- maximum valid value is around 60K (65535 on most systems) which
- translates to ~60 secs or 600% (600x) for most options. See
- conf-tmpl/battle_athena.conf for details on which variables were
- excluded (exp/drop rates values are excluded, obviously).
- * Removed boss warping code since it is currently supported by the mob skill DB
- 'rudeattacked' state [celest]
- * Fixed plagiarised skills replacing actual learnt skills [celest]
- * Fixed 'gmcommand' script command crashing when no players are attached [celest]
- ... which means the command does not work in script events like OnClock!
-05/10
- * Added code to prevent pet lures from being wasted until after selecting a
- target (only works with official lures). [Skotlex]
- * Added MAX_REFINE to status.h [Skotlex]
- Enables for custom max refine levels using the success rates in
- refine_db.txt, npcs will know they reached the max level when the success
- chance returns 0. (npcs still need updating to support this model)
- - Note: Whitesmith's refinery skill might need to be tweaked if you want
- them to be able to forge above lv10 and up to whatever custom max you
- wish.
- - Note2: Npc's refine_sucess script command ignores this max.
- * Skill updates [celest]
- - Fixed Charge Arrow not requiring bows
- - Fixed Enchant Deadly Poison working on bosses
- - Fixed Concentration (again! xD) def penalty, thanks to UniRing
- - Added code for NPC_REVENGE
- * Added 'masterattacked' mob skill condition [celest]
- * Added battle_config.use_statpoint_table [Skotlex]
- When set to no, a new equation is used to calculate stat points after a
- reset. I've tested the equation to death, so it should work flawlessly.
- Advantages of using the equation: No need for statpoint.txt (it is still
- read for the time being), and stat changes through npc buyers/sellers are
- preserved after a reset.
- * Restructured clif_parse_Wanttoconnection [celest]
- * Fixed packet version detecting not working properly if last version's connection
- packet is the same as the DB but with different values [celest]
- * Added built-in support for 2005-05-09aSakexe and changed 'packet_ver_flag'
- default in battle conf to 511 [celest]
- * Added load local resnametables.txt into memory instead of opening and reading
- it every time we look for a file [celest]
- * Fixed crash if resnametables.txt was not found in a grf [celest]
- * Removed some unnecessary steps in grf file lists loading [celest]
- * Added display_hallucination for clients where the effect lags badly [Skotlex]
- * Added the battle_config options for managing the pet-skills system [Skotlex]
- * Incorporated the new pet attack/skill system. [Skotlex]
- See db/pet_db.txt for explanation, or visit
- http://www.eathena.deltaanime.net/board/index.php?showtopic=29918 for
- details and support.
- * Fixed Marionette skill. Now you can't target other Clowns or Gypsies [Lupus]
- * Fixed all Hunters traps to affect Players in PVP/GVG places only. [Lupus]
- And Shockwave Trap doesn't work on monsters, because they don't have SP
-
-05/09
- ~ Added sql_files/upgrade_svn1665.sql to update hair, hair colour and clothes
- colours' field format (thanks to Zoc)
-
- * Updated char creation to support 24 hairstyles (from 5/10's patch) [celest]
- * Fixed broken stats check during SQL char creation, thanks to Sasuke
- * Removed an unnecessary check in plugins loading, thanks to Shinomori
- * Changed grfio_read + grfio_size usage to grfio_reads() -- a bit faster [celest]
- * Moved the win32 zlib .h files from /lib to /zlib [celest]
- * Moved 'afm_dir' setting to map_athena.conf [celest]
- * Moved grfio.c from /common to /map [celest]
- * Changed grf-files.txt loading: [celest]
- ~ 'data/sdata/adata' loading will still be supported, but is replaced with
- grf: <path to grf or gpf file>
- To load extra GRFs (if you have custom ones for your server for example,
- or to load weekly kRO gpf's) just add as many 'grf' commands as you want
- * Tidied up grfio.c a bit [celest]
- * Added FULLY updated mobs skills DB by Komurka (up to Aegis Zone 8.5) [Lupus]
- * added a packet to remove maps of other servers [Sirius]
-
-05/08
- * documented the packetlentable of chrif [Sirius]
- * fixed crash in clif_joinchatok [veider]
- * Optimising 2 party queries in SQL char, thanks to Zoc
- * Fixed a typo in SQL party saving, sorry ^^; [celest]
- * Fixed compile errors in login and char converters [celest]
- * Fixed ensemble skills and Benedictio, thanks to shaeh and massdriller
- * Fixed typo in Concentration's hit bonus, thanks to UniRing
- * Added additional hit bonus for Weapon Research [celest]
- * Fixed a missing check in Absorb Spirits [celest]
- * Made Meteor Assault cause Bleeding effect too. According the skill desc, it causes all effects
- to ANY enemy by chance now. [Lupus]
- * Typos and grammatical fixes in various files [DracoRPG]
- * Changed Hair style, Hair & Clothes colors fields to unsigned to allow use of 255 palettes [DracoRPG]
- * Enhanced @send to allow use of 20 additionnal arguments after the packet identifier [DracoRPG]
- * ATK % bonuses provided by Power-Thrust (and similar skills) and attack skills now add instead of multiplicating [DracoRPG]
- * Added sd->right_weapon and sd->left_weapon structs to store all weapon-specific values like watk [DracoRPG]
- * Added pc_istop10fame function [DracoRPG]
-
-05/07
- * Fixed plagiarised skills not updated when hit by different skill level [celest]
- * Added server type will be set in the core earlier -- Fixes some plugins cannot
- loaded if called before the server finished initialising [celest]
- * Added high priority plugins (explicitly set in conf file) will not be unloaded
- even if incompatible [celest]
- * Added 'DLL_Test' plugin event [celest]
- * Ported the upnp feature to eA plugin form [celest]
- * massdriller's npc update, fixing SIGPIPE in core and SunOS additions to makefile [Shinomori]
-
-05/06
- * Dev's pls take a look to Dev/mmo_change_report.txt [Sirius]
- * Fixed build issue under linux machines [MouseJstr]
- * Fixed possible stat exploit in char_sql, thanks WoWer [veider]
- * Fixed compilation warnings on NetBSD [veider]
- * Adding unequip script command, tnx to Spectre [Shinomori]
-
-05/04
- * Fixed monsters can't use Heal/Potion Pitcher when hidden, thanks to Komurka
- * Documented the sample plugin source a bit [celest]
- * Added sample plugin 'sample.dll' [celest]
- * Finished plugin events system [celest]
- * Finished plugin loading system [celest]
- * Added Shinomori's findfile function [celest]
-
-05/02
- * Tidied up pc and mob counttargetted code [celest]
- * Updated fame lists to display offline characters' names properly, and
- * Changed char server to send char id instead of account id in fame lists, thanks
- to Sara-chan
- * Fixed a mistake in the friends list code [celest]
- * Fixed friend's names not sent properly [celest]
- * Changed Concentration's hit bonus, thanks to ShAPoNe
-
-05/01
- ~ Added sql_files/upgrade_svn1623.sql to update item_db2's format, and mob stats
- in mob_db to unsigned int (thanks to Zoc, Wallex and akusarujin)
-
- * Added item_db2 and mob_db2 reading for SQL map, thanks to sbilly
- * Added new mob skills -- could be inaccurate though ^^; [celest]
- * Added proper support for script functions with no parameters, thanks to Wallex
- i.e getrefine() instead of getrefine(0)
- * Removed 'skill failed' message for Frost Diver [celest]
- * Moved Lullaby and Dissonance effect code to skill_onplace_timer [celest]
- * Updated some skill id's to fit in a few new mob skills (not coded yet) [celest]
- * Increased mob skills using base chance to 1/1000 instead of 1/10000, and monster
- delay base rate to 1/100 instead of 1/400, thanks to Komurka
- * Fixed players able to request trade with gm's even if gm_can_drop_lv was set,
- thanks to Komurka
-
-04/29
- * fd checks in send/recv fifo, thanks to Sasuke [Shinomori]
- * Restructured malloc.h / malloc.c a bit [celest]
- * Fixed a memory leak in console [celest]
- * Fixed console to be compatible with the dummy socket [celest]
- * Fixed TXT login and map not shutdown cleanly if exitting by console [celest]
- * Changed Spiral Pierce's effect to stop movement instead of stun [celest]
- * Fixed Chase Walk to properly add a STR bonus [celest]
- * Added effect for Tarot Card [celest]
- * Cleaned up clif_specialeffect [celest]
- * Added hidden gm's will not show warp effect when logging off, and will return
- 'target character not logged in' when /exall is on, thanks to starlon
- * Fixed non-movable monsters moving if they're blind [celest]
- * Added boss-type monsters will auto teleport when 'rude-attacked' [celest]
- -- note: Just a temporary fix, the mob skill db still needs updating
- * Added boss-type monsters cannot be knocked back by skills, thanks to Komurka
-
-04/28
- * Fixed a bot trading hack [celest]
- * 'isequipped' will now 'tag' items that are used in its set, so a 2nd set will
- not be able to use items from the 1st set [celest]
- * Changed bAddItemHealRate to be based on total hp healed including vit bonuses
- instead of base hp [celest]
- * Tweaked skill casting time and delay logic again [celest]
- * Fixed another typo in bAutospell, thanks to Komurka [celest]
-
-04/27
- * Updated friend list functions, much thanks to Tsusai / Fusion!
- * Added packet for a divorce notice ("<your name> has divorced with <your spouse>
- name>") [celest]
- * Added packet for /pvpinfo (only usable in pvp maps) [celest]
- * Added display for /blacksmith and /alchemist [celest]
- -- To-do: Offline characters won't have their name displayed properly yet
- * Added display when blacksmiths and alchemists gain fame points [celest]
- * Fixed talkie box not working when packet DB is enabled [celest]
- * Removed redundant monk() and parse_SkillMessage in clif.c [celest]
- * Updated @send to check send lengths from packet_db [celest]
- * Fixed @mutearea's time always set to 15 minutes [celest]
- * Fixed a typo in the bAutospell's, thanks to Komurka
- * Reverted a setting in skill casting time calculating [celest]
- * Fixed Gravitation not affecting enemies, and ignore element modifiers [celest]
- * Added 'bSPLossRate' effect [celest]
-
-04/26
- * Added @load/unloadnpc [celest]
- usage: @loadnpc <path to script file, i.e npc/other/test.txt>,
- @unloadnpc <NPC name>
- * Changed @enable/disablenpc to @show/hidenpc [celest]
- -- Note: the script commands 'enable/disablenpc' arent affected
- * Updated max packet to 0x234 for 205-04-25aSakexe [celest]
- * Added cannot use warps when hidden/cloaked [celest]
- * Re-fixed an exp overflow bug and raised cap to 2bil [celest]
- * Added some more of kRO's 04/26 patch [celest]
- * Fixed a crash in stripping skills [celest]
- * Tidied up battle.c a bit [celest]
- * Added Devotion's effects will be lost if changed map/teleported [celest]
- * Added bDoubleRate effects can stack with Double Attack [celest]
- * Added support to have up to 20 autocast skills from cards [celest]
- * Applied new advanced skills changes from 4/26 patch [DracoRPG]
- I could not do everything, things remaining to do :
- - Alter Double Casting success rate (did not find the code... is there one ? xD)
- - Check that all songs/dances/duets are uncancelable by Dispell
- - Make Wand of Hermod affect only party/guild members (and check for a warp portal !)
-
-04/25
- * Further improvements on stripping/breaking + added support for targeting mobs with strip skills [DracoRPG]
- * Added fd check to clif_additem [celest]
- * Optimised weapon stripping/breaking a bit -- skip searching from the item DB
- everything we call this [celest]
- * Fixed a possible crash when adding timer function strings [celest]
- * Tidied up skill casting time calculating a bit + Fixed a possible bad
- setting when dex > 'castrate_dex_scale', thanks to phabyo [celest]
- * Changed skill unit group checks in status_change_timer a bit [celest]
- * Fixed possible sql injection with SQL gm command logging, thanks to starlon [celest]
-
-04/24
- * Work on skills [DracoRPG]
- - Cleanup in skill.c, added missing guild skills and switched all names to iRO ones in skill names list
- - Fixed typo in a guild skill name : GD_KAFRACONTACT -> GD_KAFRACONTRACT
- - Entirely rewrote equipment stripping/breaking so that stripping/breaking weapon will affect BOTH weapons of
- a dual wielding Assassin, and that stripping/breaking shield won't affect two-handed or left-hand weapons
- * Pets can't attack Guardians and Emperium, WoE or not !! [DracoRPG]
- * Replaced autospell_type and autospell2_type with a simpler way to save auto-
- casting [celest] + Fixed a typo, thanks to Landarma
- * Fixed a typo in socket timeout messages [celest]
-
-04/23
- * Fixed not working PVPOFF in scripts. [Lupus]
- Due to the bug it could work only on maps with NOPVP flag.
- * Added item produce pentlty to Baby Class [Lupus]
- Comparing with common classes, Baby Alchemist/Blacksmith have 20% less chance of successful item making.
-
-04/22
- * Fix main.sql to include the fields that are in the
- upgrade files [MouseJstr]
- * Added bonus4 support for bAutoSpelll [celest]
- * Fixed Cast Cancel [celest]
- * Fixed compile error in log.c -- had to remove the 'Log refined items' option
- in log config [celest]
- * Fixed plagariased skills not cleaned up properly when copying another new skill,
- and corrected copying skill level [celest]
- * Added Spiral Pierce ignores defense, thanks to Komurka
- * Added base code for PK/Karma system (not completed) [celest]
- - Added equipment drop based on alignment (not enabled yet)
- - Added alignment shift after PK (not enabled yet)
- - Added 5 minute silenced status PK penalty
- * Added @packetmode (for debug only) [celest]
- * Added clif_gm_silence to clif.c and rearranged ReqNoChat abit [celest]
- * Added damage reduction in PK mode [celest]
- * Added /memo cannot be used when dead [celest]
- * Added bonus2 support for bAddMonsterDropItem [celest]
- * Added db/item_group_db.txt [celest]
- * Added bAddMonsterDropItemGroup [celest]
- ~ check doc/item_bonus.txt
- * Fixed bCriticalAddRace giving too little increments [celest]
- * Fixed Ruwach revealing Chasewalking players [DracoRPG]
- * Changed equipment breaking to 'on' by default [DracoRPG]
-
-04/21
- * Fixed a typo in mobs skills checking [celest]
-
-04/20
- * Fixed a few item errors with callfunc("Is_Merc_Class") (not checking if it returned 0)
- * Changed a bad mistake in map cache configuration (swap between compressed and uncompressed options) [DracoRPG]
- -> Check this !! using '1' you can get a 1MB mapinfo with all 450 maps inside !!
- * Added Intravision vars and all the stuff, but not the code (for Maya Purple Card) [DracoRPG]
- * Fixed memory leak in @reloadmobdb [celest]
- * Fixed logging settings reset to default after reading the conf file [celest]
- * Added support for 'masterhpltmaxrate' condition in the mob skill db [celest]
- * Fixed Ruwach not dealing damage to revealed players/mobs [DracoRPG]
-
-04/19
- * Fixed insert like item as card hack. [Ancyker]
- * Fixed adoption script [Codemaster]
- * Simplified @day and @night [celest]
- * Added script command 'adopt', 'day' and 'night' [celest]
- * Refixed the 'gtb_pvp_only' option, thanks to Zoc
- * Added Baby Class support to all renters, job quests, etc [Lupus]
- * Added UPnP plugin (will only load in Windows XP) [celest]
- - if everything loads successfully you should get a "Firewall port xxx
- successfully opened" and "Upnp mappings successfull" for each server.
- If it doesn't, either your router has it turned off or doesn't support it
- - Go here for the debug version and source code:
- http://svn2.stormbirds.org:8080/svn/ea/devel/Celest/addons/upnp/
-
- * Added extra info in 'goto' and 'if' script errors [celest]
- * Added new mapflag 'gvg_dungeon' -- Same as GvG, but doesn't show simplified
- effects for the client [celest]
- * Fixed blind mobs can still follow out-of-range attackers [celest]
- * Support for /blacksmith and /alchemist commands (doesn't do anything yet)
- * Added allow gm levels for the /[str/agi/..]+ commands to be set in atcommand
- config -- set to 0 by default [celest]
-
-04/18
- * Fixed exp overflow in mob.c and guild.c [celest]
- * Allow gm's to drop/trade limited items (i.e wedding rings) [celest]
- * Fixed super novices' guardian angel couldn't be summoned because the message
- was uncapitalised (yep you need to follow the caps too ^^) [celest]
- * Fixed wrong EXP table usage / Max possible Job Level calculation of BABY CLASS [Lupus]
- * Some changes to @send and @packet [celest]
- * Fixed a crash in @adjcmdlvl [celest]
-04/17
- * Corrected Strip skills rates [DracoRPG]
- * Moved timer and db finalising to core.c [celest]
- * Fixed a typo that was causing crashes from blind monsters [celest]
- * Added reset all character's status to offline when map disconnects from char
- (TXT) [celest]
- * Fixed Tarot Card damage not showing, and the Lover Card to warp the caster
- instead of target [celest]
- * Fixed ground-targetting skills usable with Blade Stop on [celest]
- * Started implementing Baby Class compatibility for items / job quests,
- some optimizations due to usage of BaseJob [Lupus]
-04/16
- * Fixed Frost Joke and Scream working on dead characters, and set them to not
- affect hidden GM's [celest]
- * Added support for 'rudeattacked' condition in the mob skill db [celest]
- * Added blind monsters will try and move to its attacker's position [celest]
- * Added monsters will try and escape if attacked but cannot retaliate
- (a 'rude attack') [celest]
- * Added a crash check in mob skill casting [celest]
- * Adding support for Fusion AF2 maps (not finished) [celest]
- * Added more correct Einbroch/Einbech monster spawn [Lupus]
-04/15
- * Fixed building under FreeBSD [MouseJstr]
- * Shield Chain and Acid Demonstration should now display damage properly [celest]
- * Fixed memory leak when an npc with no maps defined is loaded [celest]
- * Changed default mem manager log path to "log/[server name].leaks" [celest]
-04/14
- * The display of account/character IDs is now a setting in battle_athena [Ancyker]
- * Allow married couples to exchange normally untradeable rings with each other
- * Finished adding saving character online/offline for TXT char and login [celest]
- * Added save guild storage as well when auto saving characters to prevent duping
- if the server crashes, by End_of_exam / jA 1064
- * Moved Meditatio's effect back to status calculation [celest]
- * Updated the fame list sending between char and map to separate blacksmiths
- and alchemists [celest]
- * Added 'setcell' support in scripts. Usage:
- [map name]tab[cell type],[x0,y0,x1,y1]
- * Added REGEN cell (0x20) [celest]
- * Fixed a memory leak in SQL login [celest]
- * Made display version on login settable in battle_athena. [Ancyker]
-04/13
- * Removed Quagmire cancelling Crazy Uproar (Lord Exclamation) [DracoRPG]
- * Corrected Song of Lutie (Apple of Idun) healing [DracoRPG]
- * Moved server type info to version.h
- * Added dumping svn revision or Athena version when saving stacktrace
- * Added auto disable built-in stacktrace in Cygwin if 'error_start' is already
- set in the environment, thanks to Ser
- * Display a more appropriate message if items are not allowed in trading
- * Implemented Longing for Freedom (roughly), Wand of Hermod, Gravitation and
- Gambatein (14 of 14 skills done! Please post any problems, since they're done
- mostly in a rush ^^; ) [celest]
- * Added -1 skill id checks [celest]
- * Fixed event timers crashing when freeing memory [celest]
- * Fixed sage enchanting skills using up gems even if it failed [celest]
-
-04/12
- * Fixes and updates [DracoRPG]
- - Fixed Cart Boost speed bonus being not removed when the skill ended (missing calc_flag)
- - Lv4 weapons don't give fame point anymore when upgraded to +10
- - Axes and Maces can't be broken
- * Added checks in event timers from crashing when freeing memory [celest]
- * Implemented Acid Demonstration, fixed Double Casting [celest]
- (10 of 14 skills roughly done)
- * Implemented Double Casting, finished Tarot Card effects [celest]
- * Overhaul on status changes' numbering -- some statuses will show icons now
- * Implemented Mana Regeneration, Shield Chain, Plant Cultivation, Cart
- Termination, Max Overthrust and Tarot Card [celest]
- ~ To get the new skills you need 2005-04-11aSakexe!
- * Enable cards to be stolen with level 5, thanks to Ishizu-chan
-
-04/11
- ~ Please upgrade your SQL char DB with /sql-files/upgrade_svn1499.sql
- to accomodate Fame saving!
-
- * Fixed AC_DOUBLE and AC_SHOWER cast delays according to kRO Patch - 6/29/04
- they both have 0.1 sec cast delay thanks to Moraddin
- * Added SQL DB compatibility testing upon SQL char server startup -- now it
- will not run if any important fields are missing [celest]
- * Added sending list of characters with highest fame for TXT and SQL [celest]
- * Added saving of fame for TXT and SQL [celest]
- * Added saving of plagiarised skills for rogues [celest]
- * Corrected heal and max hp bonus for Apple of Idun [celest]
- * Added /tool/stackdump for Cygwin users to debug .stackdump files.
- Usage: ./stackdump [map/char/login] [sql]
- * Removed set_termfunc usage in char and login servers [celest]
- * Card fix - owl_duke_card should cast Imposito manus on self, not on
- enemy, wind_ghost_card should cast jupiter thunder level 10, not
- Sight level 10 [veider]
- * Finished coding fame point gain [DracoRPG]
- * Fixed crash in clif_guild_memberlist not checking sd->fd could be NULL [veider]
- * Fixed Punk card giving Sight (10) level 5 instead of Quagmarine (92)
- level 5 [veider]
-
-04/10
- * Performance improvements (currently protected with -DTURBO) to
- common/socket.c for very large servers (500+ users) [MouseJstr]
- * Fixed a warning in npc.c, started implementing fame point system [DracoRPG]
- * Added fix for "bad setting of guild members", thanks to Alex14
- * Fixed a bad typo in 'disp_hpmeter', thanks to starlon again ^^;
- * Fixed Bleeding and Poisoned status continueing even after death [celest]
- * Updated bleeding effect for Acid Terror, Head Crush and Pressure [celest]
- * Fixed 'make converters' not working in clean builds [celest]
- * Added capability for Mem manager to clean up ALL unfreed memory on shutdown.
- Leaks will still be reported [celest]
- * Added enable jA's MALLOC_DBN in db.c by default [celest]
- * Fixed compile error caused by strerror_r() [veider]
-
-04/09
- * We now can come up and shutdown leak free.. thanks go to celest for
- assisting me in this long and painful quest [MouseJstr]
- * hitting Control-C three times causes a instant shutdown without any
- cleanup [MouseJstr]
- * Fixed a NPC memory leak [MouseJstr]
- * Added Einbroch to @go [DracoRPG]
- * Fixed a NPC memory leak [MouseJstr]
- * Added lower level gm's shouldn't be able to see higher level gm's with the
- 'disp_hpmeter' option -- thanks to starlon
- * Added 'make converters' -- compiled converters will go under
- /tool [celest]
- * Fixed Weapon Refine not checking if the item type is refineable [celest]
- * Improved checking if items can be dropped, traded, refined or stored [celest]
- * Fixed a bug in SQL char.c, thanks to Alex14
- * Fixed some compile errors in the core [celest]
- * Fixed compile errors when Mem manager is enabled [celest]
- * Added Einbroch monsters spawn, fixed one mapflag for Einnech mines [Lupus]
-
-04/08
- * Changed how signals shut the process down so that we were
- not doing work in a signal handling thread but instead on
- the main thread.. which is important due to the limited
- stack size of a signal thread. [MouseJstr]
- * Eliminated the use of atexit() so that we could control
- the order objects were destroyed in as well as make
- high end debuggers happier about what we were doing after
- exit. [MouseJstr]
- * Fixed a bug in do_final_npc() that was hanging
- shutdown [MouseJstr]
- * Fixed use of deprecated strerror in common/lock.c [MouseJstr]
- * Fixed buffer read-overflow in mail system in char/char.c [MouseJstr]
- * Fixed msg_table definition mismatch in map server [MouseJstr]
- * Fixed memory leak when doubly allocating the scriptlabel_db [MouseJstr]
- * Fixed two uninitialized memory reads in map/skill.c [MouseJstr]
- * Fixed memory leak when accessing AFM files in map/map.c [MouseJstr]
- * Changed default limit for MaxHP/SP from 32500 to 1M in battle_athena.conf [DracoRPG]
- (this is because with Berserk and Tao Gunka Card, players can go up to 100k+ HP)
- * Added 'delay_battle_damage' [celest]
- * Fixed @kamib not working properly, thanks to maldersoft
- * Fixed compile warnings in pc.c [MouseJstr]
- * Fixed a crash in clif_send when sending messages to guild
- members [MouseJstr]
- * Added @shuffle map, @shuffle area, @shuffle world [MouseJstr]
- * Added @mutearea [MouseJstr]
- * Readded setting of sd->skilllv, sd->skillid to skill_use_id
- caused skill failures for BARD/DANCER combo skills [veider]
- * Changed how get_svn_revision() is implemented to compile the actual
- constant into the executable. [MouseJstr]
- * Replaced some printf's in the core with showmsg functions [celest]
- * Replaced 'exists' with a built in function for WIN32 builds [celest]
- * Added 'clouds' and 'fireworks' mapflag [celest]
- * Added a new @fog and @fireworks [celest]
- * Changed the old @fog to @clouds [celest]
-
-04/07
- * Added @version atcommand [Ancyker]
- * Readded @disablenpc (not the same as @hidenpc) [celest]
- * Fixed @reloadscript not removing old NPC's and monsters first [celest]
- * Some changes in mob and NPC unloading [celest]
- * Changed the original @disablenpc to @hidenpc [celest]
- * Fixed HP Conversion to properly not reduce HP if SP is full [celest]
- * Updated Defender -- should reduce walking speed, and does not reduce attack speed
- at level 5 [celest]
-
-04/06
- * Fixed a crash in clif_send when checking packet version, thanks to Alex14
- * Fixed a crash in Deluge, Volcano and Violent Gale, thanks to Alex14
- * Skip partner checking when calculating status with Marionette Control on [celest]
- * Fixed plagiarised skills become unuseable after saving character [celest]
- * Fixed double skill fail messages for stone curse, thanks to wind
- * Added modulus by zero check to rand(), thanks to starlon
- * Improved error messages during npc parsing [MouseJstr]
- * Fixed a crash in login_sql [MouseJstr]
- * Added logs filters in more logs [Lupus]
- now you can set individual bit-mask filter for each log file
- Example: (drops log)
- log_drop: 1 = logs ANY items
- log_drop: 332 = logs only Healing items, Cards and those items which price is >= price_items_log
-
-04/05
- * Fixed damage reflecting (silly typo xP) [celest]
- * Fixed Backstab to not have a push back effect [celest]
- * Fixed auto spell to not taking SP, thanks to Hekate
- * Fixed Sanctuary to have proper healing count, thanks to Hekate
- * Simplified Valaris' online_timer [celest]
- * Updated Fogwall, Spiderweb, and HP Conversion, thanks to redcard [celest]
- * Adding saving character online/offline for TXT char and login (unfinished)
- * Added SERVER_TYPE to core for future plugins support [celest]
- * Added support for the UPNP plugin to release port mappings and re-close firewall
- ports on shutdown [celest]
-
-04/04
- * Some work on re-enabling trade and storage logging [MouseJstr]
- * Updated showmsg with Shinomori's improvements [celest]
- * Fix showmsg for Visual Studio [MouseJstr]
- * Update base code for the UPNP plugin loading [celest]
- * Removed anti-freeze system for login and char -- Shinomori's update would
- be enough to keep inter connections alive [celest]
-
-04/03
- * integrating anti freeze system to status update [Shinomori]
- * Fixed impossible drops at 0.01% chance [Lupus]
- * Fixed some variable declarations in SQL login.c causing compilation errors [veider]
- * Added NetBSD support into Makefile (Still lots of warrnings during compilation [veider]
- * Finished Valkyrie. Now it correctly works. Valhallana reborns players to High Novices. [Lupus]
- (added missed kRO condition: to reborn, player shouldn't have money nor items(equipment) )
- Then Valhallana warps just reborn players to the home city of their main job.
- On Job Level 10 of High Novice they can get 1st Advanced Job from correct 1-1 job quests NPC.
- They'll get there all learnt skill quests.
- On reaching 45 Job Level they may visit Valkyrie and get 2-2-1 / 2-1-1 class (3rd Job)
- from a correct NPC.
- * Fixed SKILL POINTS exploit in Assassin Job Quest [Lupus]
-
-04/02
- * Added bonuses bUnstripable[Weapon|Armor|Helm|Shield]
- instead of just bUnstripable that worked only for armor [DracoRPG]
- * Updated Tiger Knucke Fist's 'fixed state' effect [celest]
- * Allowed people to enable/disable using the online column via
- 'register_users_online' in the login_athena.conf [Codemaster]
- * Added the 3 baby skills WE_BABY, CALLBABY and CALLPARENT [celest]
- * Some tidying up in skill.c [celest]
-
-04/01
- * Updated ShowMessage functions to use vprintf [celest]
- * Fixed a potential crash in pc_walk in Win32 builds [celest]
- * Added bAddEffWhenHitShort and changed bAddEffWhenHit back to all physical
- damage [celest]
-
-03/31
- * Fixed memory corruption during shutdown via the script_buf
- [SVN 1370: MouseJstr]
- * Added some useful filename info to the script parser so that
- it is easier to figure out what is going on [SVN 1370:
- MouseJstr]
- * updated the visual studio projects a little bit [SVN 1370:
- MouseJstr]
- * fixed memory corruption in mapif_guild_info:int_guild.c
- [SVN 1367: MouseJstr]
- * Fixed common/lock.c (problem with unistd.h include) [Codemaster]
- * Added father/mother/child fields to mmo_char_tostr() and
- mmo_char_fromstr() [veider]
- * Added exp sharing between family members for TXT version [veider]
- * Added char_married() and char_child() to TXT version [veider]
- * Fixed memory corruption associated with afm files [SVN 1363: MouseJstr]
- * More pedantic g++ fixes so that it builds without any and
- all warnings [SVN 1362: MouseJstr]
- * Removed some #include's causing warnings on some platforms
- [SVN 1360: MouseJstr]
- * Fixed a bug with InitTimer/StopTimer, thanks to ilpalazzo-sama
- * Set 'undead_detect_type' to 0 by default, thanks to Dino9021
- * Fixed Enchant Poison / Deadly Poison having too high poisoning chance
- * Reverted the pc_remove_map() change temporarily
- * Added back up old files in 'save' before saving new data -- also fixes
- 'Access denied' errors when saving in TXT
-
-03/30
- * sql native vc7 projects now build/link [1351: MouseJstr]
- * Began sql projects for VC7 [1349: MouseJstr]
- * text char-server and login-server now build using VC7. You
- can use the eAthena.sln solution to build all three. These
- are currently just the text versions of the servers. I have
- not added projects yet to build the sql versions.
- [SVN: 1347 MouseJstr]
- * Made the map-server build cleanly using Microsoft Visual
- Studio.. entirely native code without any cygwin dependency
- [SVN: 1345 MouseJstr]
- * Fixed @reloadgmdb in SQL -- after reloading ask the char to forward the new
- accounts back to the map [celest]
- * Added base code for loading Ser's UPNP plugin [celest]
- * Added 'idle_no_share' to battle_athena.conf [celest]
- * updated map server to jA1137~1159
- - Added @reloadatcommand, @reloadbattleconf, @reloadstatusdb, @reloadpcdb
-
- (Note: You should copy the latest msg_athena.conf from conf-tmpl and replace
- your current one EVERYTIME it's updated to prevent it from crashing when it
- can't find the newer messages!)
-
- - Updated packet DB to support /item and /monster
- - Added pc_remove_map()
- - Added 2 new mobs skills: NPC_RUNAWAY and RECALL
- - Updated BioCannibalize
- - Updated Hammerfall, Meteor Shower and Lord of Vermillion -- when MvP's
- cast them they should have much more range
- - Some other skill tweaks
- - Added item_findingore.txt
- * Some tidying up in mob.c and skill.c [celest]
-
-03/29
- * Please make sure to use the stable/sql-files/upgrade_svn1315.sql to
- upgrade your mysql as a result of the new adoption system. Thank you
- -MouseJstr
-
- * More ANSI C++/C conformance fixes [SVN 1341: MouseJstr]
- * Fixed SQL char server crashing when loading the item_db, my bad ^^; [celest]
- * More ANSI C++/C conformance fixes [SVN 1334: MouseJstr]
- * Added auto save guild data (only guardian HP and owner guild ID for now,
- both cached) every 5 minutes during WOE [celest]
- * Updated damage calculation for Magnum Break [celest]
- * Fixed #item not working properly, thanks to TripleOxygen
- * Fixed a lot of compile time problems with our mixed C++/C
- conformance [1328: MouseJstr]
- * Fixed use of storage variable to conform to ANSI C spec
- [1327: MouseJstr]
- * Added CIA-bot to the #athena channel [MouseJstr]
- * Some tidying up in mail.c [celest]
- * Added an invalid pointer check in clif_displaymessage [celest]
- * Added sql upgrade file in sql-files for svn1315's update [celest]
- * Added auto create 'save' folder from 'save-tmpl' when compiling for the
- first time, thanks to Jbain
- * Fixed 'use_sql_db' not read properly in SQL char server, thanks to Wallex
- * Changed db/const.txt to have right baby jobs IDs [veider]
- * Added three fields to mmo_charstatus - father/mother/child
- needed for adoption system [veider]
- * Added adoption support to charserver SQL version [veider]
- * Added atcommand_adopt - create a family of three [veider]
- * Added to char_commands showexp/showdelay so that
- players could remove some messages [veider]
- * Added percent to "Experience Gained" message [veider]
- * Added adoption system support to party_check_exp_share()
- so that parents can share exp with child [veider]
-
-03/28
- * Fixed Auto Berserk activating by itself when changing maps [celest]
- * Re-fixed the SQL syntax crash in logging [celest]
-
-03/27
- * Fixed AutospellWhenHit effect to only work on melee attacks [celest]
- * Fixed AddEffWhenHit effect to only work on melee attacks [celest]
- * Moved guardian hostility checking and monster_ignore_gm check to battle.c --
- processed earlier, and more appropiate [celest]
- * Fixed a SQL syntax crash when logging character names with "'" in them
- [celest]
- * Added use dynamic allocation when loading the msg_table [celest]
- * Fixed some memory leaks with the new timer changes [celest]
- * Refresh the client when day comes to get rid of the night effect (if
- night_darkness_level was used) [celest]
- * Changed @refresh to fake map loading, but without teleporting side effect
- (skill delays reset, extra load on server etc)[celest]
- * Updated SQL file for the item_db, thanks to Zoc
- * Fixed the 'show_mob_hp' option not updating when a monster is healed, thanks
- to leinsirk10
- * Added flexible Filter to the Monster Drops logging [Lupus]
- - Now you can choose what types of items either to log or not.
- - You can also log expensive items (you can set the min logging price)
- * Optimized a bit ATCommands.c functions (inspired by Freya) [Lupus]
- * Added missing parenthesis in my Improve Dodge code, not giving +4/lv to proper jobs [DracoRPG]
- * Added all released cards into monsters drops and Old Card Album [Lupus]
-
-03/25
- * Fixed a typo in my fix for Stalk / Tunnel Drive increasing instead of decreasing speed, sorry [DracoRPG]
- * Rewrote a little bit Improve Dodge [DracoRPG]
- - The speed bonus does not effect when Cloaked
- - Assassins & Rogues get +4 Flee/lv, but all other jobs can get +3/lv
- if they have the skill (not only Thiefs & Super Novices)
- * Some minor changes to Sacrifice in battle.c [celest]
- * Set the Emperium to be immune to Sacrifice [celest]
- * Set the Emperium to be have max status effects immunity [celest]
- * Fixed indoorsrwstable.txt reading even when 'indoors_override_grffile' is
- set to 'no' [celest]
- * Fixed @monsterbig/@monstersmall not working [celest]
- * Fixed @killmonster2 not working [celest]
-
-03/24
- * Updated obj_del to delete all GNUMakeFile and .o files + compiled exes [DracoRPG]
- * Fixed a typo in Stalk / Tunnel Drive speed calculation [DracoRPG]
- * Added some mapflags for new towns [Lupus]
- * Added timer.c optimization / timers sort fix. 'no freezing mobs anymore' Thanx 2 Yor/Freya [Lupus]
- * Added 'map_charid2id' [celest]
- * Changed monster damage logging to save char ID's for the most time -- also
- fixes an exp bug, thanks to Super Novice / Ezhik [celest]
- * Implemented 'event_script_type' -- no changes at '0', at '1' script events
- will work according to Qamera's original mod
- For more info please refer to his thread:
- http://www.eathena.deltaanime.net/board/index.php?showtopic=13305&hl=
- * Set Emsolute Develop as a learnable skill [celest]
- * Updated 'require_glory_guild' [celest]
- - the skill is only acquirable if this is set to 'yes', otherwise it will not
- appear in the guild skill tree. Default is changed to 'no'.
- * Allow monsters to cast skills near themselves even when monster_nofootset
- is set to 'yes' -- they're only not allowed to cast near players [celest]
- * Print number of online users in online.txt/.html even if there's only 1 user
- online [celest]
-
-03/23
- * Adjusted my trade fix [1280: MouseJstr]
- * Fixed possible memory corruption in storage if number of guilds
- in database exceeds the max server can support [1278 : MouseJstr]
- * Fixed @mapexit to properly flush the fifo's before shutting
- server down to help insure all the char data is properly flushed
- [1278: MouseJstr]
- * Fixed trade exploit/crash from invalid data being sent
- [1278: MouseJstr]
- * Possible use of uninitialized data used during mob walk
- calculation resulting in radical mob movement or crash
- [1278: MouseJstr]
- * Fixed some --addrace variables' sizes [celest]
- * Added' require_glory_guild' - sets whether changing guild emblems require
- the Glory of Guild skill [celest]
- * Fixed alot of memory leaks [celest]
- * Added stray memory cleaning routine to db.c [celest]
- * Fixed some compile errors, sorry xP [celest]
- * Corrected potion creation success chances, thanks to Avaj and DracoRPG
- * Removed some unused potion creation code, thanks to DracoRPG
- * Updated Joint Beat's effect, thanks to DracoRPG
-
-03/22
- * Fixed Alchemist's CANNIBALIZE, now it summons correct # of plants. With their real HP [Lupus]
- * Updated @reloadmobdb, @reloadskilldb, @reloaditemdb [celest]
- * Some tidying up in @reloadscript (more work needed) [celest]
- * Moved some gm command messages to msg_athena.conf [celest]
- * Removed skill_range_leniency [celest]
- * Removed enable_upper_class [celest]
- * Removed riding_weight [celest]
- * Added signal handler for SIGPIPE [celest]
- * Updated Frost Joke to affect everyone else in PvP/GvG, thanks to veider
- * Corrected Detect Trap range to be based on level, thanks to veider
- * Updated Tunnel Drive's movement speed, thanks to veider
- * Removed cdp_rate, suggested by leinsirk10
- * Fixed a typo in Acid Terror, thanks to leinsirk10
- * Fixed some typos/memory leak in script cleaning up, thanks to leinsirk10
- * Added gm_can_drop_lv limitations for trading and opening storage, thanks to
- Dino9021
- * Changed shop_exp's calculation to use 0.01% increments, suggested by tcdiem
- * Refixed "--en/ja--" usage in 'monster' script not working properly, thanks
- to sbilly
-
-03/21
- * Moved /tool and /webserver to under /src and added 'make tools' and 'make
- webserver' [celest]
- * Removed ladmin compiling from 'make sql' [celest]
-
-03/20
- * Don't register the day/night timers if any one is set to 0 [celest]
- * Fixed @storage / @gstorage ATcommands thanks2 Yor/Freya [Lupus]
- * Added 4 new card effects from 3/15's patch -- check item_bonus.txt [celest]
- * Added 'enable_ip_rules' to packet_athena.conf [celest]
- * Updated socket debug messages to be more readable [celest]
- * Added a sql upgrader to handle the mob_db changes to assist
- in migrating to the newer SVN servers [MouseJstr]
-
-03/19
- * Added getrefine() for 3/15's card patch -- returns the refined number
- of the current item [celest]
- * Fixed day and night settings not ignored even if they are set to 0,
- my bad ^^; [celest]
-
-03/18
- * Fixed a crash when freeing memory of pets [celest]
- * Added Cygwin support to the -DDUMPSTACK option, and changed its format
- to "<server type><number>.stackdump", thanks to Ser [celest]
- * Removed duplicate fopen in login_log [celest]
- * Don't log SQL char actions if log_char is not enabled in char_athena.conf
- [celest]
- * Updated shop_exp's calculation to give more exp, thanks to tcdiem [celest]
- * Fixed the bDamageWhenUnequip effect dealing damage when unequipping unrelated
- items [celest]
- * Fixed compile errors in SQL char.c [celest]
-
-03/17
- * Added ~86 new cards. Fixed new cards bugs, optimized [Lupus] thanks to Indiona,Landarma
- * Removed nullpo warning from trade.c (my prev anti-spoof protection) [Lupus]
- * Added the new Einbroch/Einbech maps to maps_athena.conf [celest]
- * Added display script filename when a script error is found while parsing
- [celest]
- * Added 2 char-server packets to support Freya's login server [celest]
- * Rewrite on Full Strip [celest]
- * Fixed heap corrupion in map.c caused while loading maps
- [SVN 1241: MouseJstr]
- * Re-fixed compile error in map.c -- sorry ^^; [celest]
- * trade.c fixed possibility of STORAGE+TRADE spooffing dupe [Lupus]
- Now, on accepting trade your active Storage window closes. (Either Common or Guils Storage)
- thanx to Sergey for the exploit test and report
-03/16
- * map.c fixed compilation error [Lupus]
- * Updated jA's dummy socket to mod1137 [celest]
- * Added jA's ddos protection system -- check packet_athena.conf [celest]
- * Moved stall_time's reading from inter_athena.conf to packet_athena.conf
-
-03/15
- * Fixed a compile warning in pc.c [celest]
- * Updated Soul Breaker's damage display, by DracoRPG [celest]
-
-03/14
- * Fixed @marry and @divorce. Also added Wedding music+confetti effect to @marry [Lupus]
- - @marry Player1,Player2
- (don't miss the COMMA ',' betwin the names)
- - @divorce Player
- (in @divorce use any name from the couple)
- * Added auto convert advanced job and baby class sprite ID's in mob_avail.txt
- to correct format [celest]
- * Added SC_Speedup cannot be stacked with Increase Agility [celest]
-
-03/13
- * Added PvP/GvG check for Tiger Knuckle fist [celest]
- * Fixed Pressure reducing the target's SP twice, thanks to deepin [celest]
- * Fixed SQL logging not checking if its supposed to use SQL or TXT logs, thanks
- to Alex14 [celest]
- * Fixed 23 new cards (some effects chances were divided by 100, some cards had no bonuses
- due to misplaced arguments, usage BONUS instead of BONUS2, etc) [Lupus]
-
-03/12
- * Fixed Status Recovery dealing too short blind time on undead [celest]
- * Fixed mobs not affected by Blind status [celest]
- * Added an invalid id check check in map_id2sd [celest]
- * Added sd check in clif_send [celest]
- * Fixed usage of mvp_hp_rate and monster_hp_rate. MVP rate was used for common monsters [Lupus]
- * Added additional random respawn delay for instant respawning monsters (0..5 seconds) [Lupus]
- - Should be made as an option of battle_athena.conf
-
-03/11
- * Speedup player autosaving -- don't save guild castle data at the same time,
- thanks to Alex14 [celest]
- * Optimised guild castle saving when autosaving player data, thanks to Yor /
- Freya (UPDATE: view above)
- * Added sd check in mob_damage, thanks to sbilly [celest]
- * Added Sage enchanting skills can only be cast on party members [celest]
- * Fixed Magic Power not working for ground-targeted skills [celest]
- * Fixed Frost Diver having double freezing chances [celest]
- * Added Breaker's magic damage to be blockable by Pneuma, thanks to DracoRPG
- [celest]
- * Corrected 1206Sakexe's packet detection, thanks to Yor / Freya [celest]
- * When casting cloaking stop displaying the skill title after its finished,
- thanks to Battitude [celest]
-
-03/09
- * Some changes in sig_dump to allow Cygwin produce stackdumps upon crash again,
- thanks to Ser [celest]
- * Changed the default stackdump creation folder from /save to /log [celest]
- * Fixed a typo in TXT login server logging, thanks to Skyer / eAthenaC [celest]
- * Added HP and SP rate underflow checking [celest]
- * Added stop auto attacking if no arrows were equipped [celest]
- * Added new script command: 'cardscnt'. It returns N of inserted cards in the same weapon. [Lupus]
- Now I can start fixing CARDS COMBO exploits. And it's possible to fix old cards power abuse, too.
- e.g. Assassins can equip 2 4-slot weapons and have HUGE card bonuses.
- It's said that you can have only ONE bonus per hand...
- * Fixed and tested script command 'isequippedcnt'. It didn't return real value [Lupus]
- Here's an easy way to test all items:
- 4149,Gargoyle_Card,Gargoyle Card,6,20,0,10,,,,,,,2,,,,{},{ dispbottom "Gagoyle OK:"; dispbottom isequipped(4149); dispbottom isequippedcnt(4149); dispbottom cardscnt(4149); }
- * Fixed "nice char save by the fountain of Prontera"; People (Helpers, GMs) did abuse their power and [Lupus]
- used to @jail friend / @unjail friend. To make his save point in the middle of the Prontera.
- So I made @unjail save coords to 0,0 (on unjail it makes player's save point to appear always in a random place of Prontera)
- You can use this query to "Clear nice save point of all jail/unjail abusers friends"
- SQL QUERY: update ragnarok.char set save_x = 0, save_y = 0 where (save_map = 'prontera.gat' and save_y = 191)
-03/08
- * Added chance for Enchant Poison to poison enemy, and reduced Deadly Poison
- chance [celest]
- * Compacted some code for Deadly Poison [celest]
- * Added DracoRPG's code for Soul Breaker - the magic attack part should work
- as it should now, thanks! ^^ [celest]
- * Reverted the reverted jA event change but this time without bugs (hopefully) [Shinomori]
- * corrected status_change_timer as far as I understand the functionality
- (better have a look at it, Celest), added a some security to prevent pending timers
- * moved two variable declarations to scope start (mob.c and skill.c)
- * Fixes Icewall can be directly cast on players and monsters -- also removes
- the 'unsupported layout' message [celest]
- * Added the new turbo_room and alde_tt to the maps config [celest]
- * Speedup SQL inventory and storage saving, thanks to Ilpalazzo-sama [celest]
- * Reverted a jA change in event loading [celest]
-
-03/07
- * Added uptime logging support whenever the server closes, to enable change
- the 0 to 1 in core.c [celest]
- #define LOG_UPTIME 0
- To-do: Add this as an option to log config
- * Fixed 'make clean' not removing the .o files in /common [celest]
- * Removed some unused code for Breaker and temporarily set Emperium to be
- immune to Breaker [celest]
-
- * Updated core and map-server to jA 1115~1137 [celest]
- - Added monster_delay_damage to battle conf
- - Increased some default settings in script conf
- - Updated Brandish Spear, Soul Change, Soul Burn
- - Updated Body Relocation (shorter distance)
- - Added monster skill NPC_EXPLOSIONSPIRITS
- - Corrected Mindbreaker level to 5
- - Updated Meteor Assault to instant-cast
- - Added command @users - shows the percentage of users in all maps
- - Don't save status if the player is set for disconnection
- - Added free block lock-checking system
- - Added saving the processes' ID into [xx-server.pid]
- - Fixed a memory leak with duplicate script labels
- + For more detailed logs check 'Readme-jap'
-
- * Fixed a typo in Volcano, thanks to Ilpalazzo-sama [celest]
- * Fixed Apple of Idun reading the wrong skill level and giving too much HP
- [celest]
-
-03/06
- * Added new anti-hacker trade protection from Freya. [Lupus]
- It also auto-ban hackers and broadcasts messages to all GMs. Good work, Yor!
- * Misc fixes. [Lupus]
- 2Shino: BTW Some players can't re-connect to the server. Due to the updated session checks in chrif.c
- actually impossible, because the checks handle the connection with the char server, not with users
- anyway, I checked again and rearranged code but functionality is still the same and valid [Shinomori]
-03/05
- * Reversed drop_rate0item option, corrected MVP Drop rate (thanks to Freya) [Lupus]
-03/04
- * Fixed SQL Guild Castle Saving (now fully working, tested on 100 players during WOE) [Lupus]
-03/02
- * Fixed SQL Guild Castle Saving (partial, yet it doesn't clear GuildID when you abandon a castle) [Lupus]
- + added 2 fixes by POW (Mac Guild Position fix, Max Guild Members fix)
- * Fixed Emotion Flood (by Yor) [Lupus]
- * SQL: Fixed temporary ban. Now banned players can enter the server when the ban time is over. [Lupus]
- It wasn't working because STATE hasn't been cleared properly.
- Also fixed wrong client messages (ban reasons: Banned by GM / Temp ban till DATE).
-03/01
- * Effects from dancer/bard skills will stay for 20 seconds after leaving the
- skill area [celest]
- * Fixed /resetstate /resetskill being unuseable at all [celest]
- * Fixed /mm /mapmove being useable by all players [celest]
- * Fixed some compile errors in mob_once_spawn [celest]
- * Corrected a typo in Chemical Protection skills, thanks to holyfork [celest]
-
-02/28
- * Fixed SQL Castle saving bugs [Lupus]
- * Corrected Tiger Fist, Chain Crush, and Palm Push Strike damage, thanks to
- Eskadron [celest]
- * Updated Endure to be usable in GvG, but only gives the mdef bonus [celest]
- * Some rewrites on the passive guild skills effects [celest]
-
-02/27
- * Fixed some bugs in Monk Job Quest. Now it's fully passable. [Lupus]
-02/26
- * Added jA's dummy socket to prevent fd crashes [celest]
- * Added some jA script commands: [Lupus] (first steps to add ELSE, FOR, WHILE, etc)
- - getusersname (works like @WHO ATCommand, outputs by 10 names in the Pop-up window)
- - dispbottom (print message in the common chat window)
- - recovery (restore MaxHP/SP and revives all players on the server)
- - getpetinfo (returns pet's name, type, class, hunger, intimacy)
- - globalmes (works like Announce, but outputs in the common chat window)
- - jump_zero (reserved - for future compatibility)
- - select (reserved - for future compatibility)
- - getmapmobs (# mobs on a named map, use "this" for current map)
- check script.c for their paremeters (in English)
-02/25
- * Fixed npc_dequeue, testing on remove of RoVeRT's npc timer system [Shinomori]
-02/24
-
- * Re-added missing cart dupe-proof code. From Freya [Lupus]
- * Some rewrites on Basilica [celest]
- * Fixed another bad typo in skill list_num reading, thanks to orn [celest]
- * Fixed Steal Item Rate. It has been multiplied twice on common_item_drop value for any kinds of items. [Lupus]
- e.g. If you set droprate of comman items to 500%, then even rare items could be stolen more easily. Thanks to Freya
- * Items Droprate fix. Now it adjusts correctly, w/o overflows. Thanks to Freya [Lupus]
- * mob DBbs EXP reading fix. w/o overflows. Thanks to Freya [Lupus]
-
-02/23
- * Added bAddItemHealRate [celest]
- * Fixed a crash if adding an offline player to a party, thanks to Alex14
- [celest]
- * Fixed a crash with Warp [celest]
- * New Cards: Some fixes, revisions, additions [Lupus]
- * Fixed char server crash when sending wisp with a "'" in the names [celest]
- * Fixed Backstab not checking for and consuming arrows [celest]
- * Fixed another bad typo causing @allskill to not add points into advanced job
- skills [celest]
- * Fixed a bad typo in status.c's StatusChangeTable [celest]
- * Corrected Spiral Pierce's hits in the skill_db [celest]
- * Moved /common/*.o into a obj folder when compiling [celest]
- * Updated core and map server to jA 1094~1115 [celest]
- - Added End_of_exam's Memory Manager for detecting memory problems.
- To enable remove the // in malloc.c line 11
- // #define USE_MEMMGR
- - Added @npctalk and @pettalk
- - Added support for jA's local zlib
- - Fixed a bug with path search long
- - Updated malloc.c to support Memwatch
- - Added DB data loss detection
- - Added db/skill_unit_db.txt
- - Updated skill unit system
- - Changed Waterball to the new timerskill system
- ~ For more detailed logs check 'Readme-jap' (knowledge in japanese required,
- obviously ^^;)
- Please test if there's any skills that might have suddenly stopped working,
- thanks ^^;
-
-02/22
- * Revised New Cards, added missing effects, fixed bugs [Lupus]
- ~20 cards to check left 8) But on 22 Feb some new cards have been announced T__T'
- * Cleaned up some compiler warnings [SVN 1158: MouseJstr]
- * Added perl regular expression support.. look at src/map/npc_chat.c
- for all the dirt on the new features. To build it, you have
- to enable the PCRE_SUPPORT #define and you also have to
- build/install the pcre library. [SVN 1157: MouseJstr]
-
-02/21
- * Added actual item_db.sql into sql-files. [Lupus]
- * Added actual mob_db.sql into sql-files. If you use SQL Mob DB then update it [Lupus]
- * Updated Bleeding effect [celest]
- * Removed some unused code for Graffiti [celest]
-
-02/20
- * Char SQL: Rewrote/Fixed the castle save function, now the sql version saves castles! [Sirius]
- * Fixed the /mm /mapmove command access bug [Sirius]
- * Added skill requirements for the new guild skills [celest]
- * Allow Emergency Recall to be cast in guild castles even if nowarp and
- nowarpto mapflags are enabled [celest]
- * Add 'minimum job level required' for skill_tree reading [celest]
- - Berserk now requires job level 50
- * Added Spring Trap to be able to trigger ankle snare traps that aren't
- activated yet [celest]
- * Added a fix in guild.c by Mellowz [celest]
- * Some rewrites on the pet skill bonuses system -- also fixes pet bonuses
- not effecting stats as they should [celest]
- * Check whether a monster is still alive before starting a status change
- -- also fixes the status_change_timer nullpo errors with grimtooth [celest]
-
-02/19
- * Added bSubSize, bHPGainValue, and bDamageWhenUnequip [celest]
- * Updated bSPDrainValue/Rate to accept a 'type' [celest]
- * Set baby class players' size to 0(small) [celest]
- * Fixed item_db2.txt reading printing wrong number of entries read [celest]
- * Fixed @allskill not giving the newer stalker, whitesmith and creator skills
- [celest]
-
-02/18
- * Fixed a bug with statpoint.txt reading and giving too much stat points,
- thanks to Benz / eAthenaC [celest]
- * Fixed client errors when pecopeco Lord Knights/Paladins log in with a weapon
- equipped [celest]
- * Added bAddRace2 -- check item_bonus.txt [celest]
- * Added mob_race2_db.txt -- contains 'main races' of certain monsters [celest]
- * Updated description for backup_txt in char_athena.conf a bit [celest]
- * Set read_map_from_cache to 2 (enable compression), and map_cache_file back to
- saving in /db instead of /save, as suggested by Poki#3 [celest]
- * Updated description for auto_counter_type, and set plaer_auto_counter_type
- to 0 by default, as suggested by Poki#3 [celest]
- * Use the event names from script_athena.conf to check whenever a player event
- trigger is being read/set [celest]
- * Removed an unused save/bank.txt [celest]
- * Added some new cards effects. (check DB\changelog.txt) [Lupus]
-
-02/17
- * Now all mobs have 10 drops slots. the last one is used for Cards Drops [Lupus]
- Don't forget to update your SQL files (Drop Log: logs.sql and db_tables.sql
- if u were using SQL Mobs DB. Update it from TXT! )
- * Fixed Branch Log TXT filename [Lupus]
- * Made all logs work with compiled TXT Server, too (removed old #ifndef) [Lupus]
- * Added 4 columns into mob_db.txt (check DB\changelog.txt) [Lupus]
- * Fixed some mobs drops (Whisper, etc) and some MVP mobs (bonuses were shifted...) [Lupus]
- * Readded Chemical Protection -- i forgot to check for it when changing some
- jA stuff earlier, sorry ^^; [celest]
- * Removed some old eA code that was causing Frost Nova to do an extra hit
- [celest]
- * Corrected Vulcan Arrow's hits in skill_db -- the bug appeared when the
- correct numbers hardcoded were removed [celest]
- * Readded zlib and zconf .h files to under /lib for compiling in Windows,
- thanks to Ser [celest]
- * Fixed some compile errors in Windows, thanks to Ser [celest]
- * Changed remove_control_characters back to supporting korean chars [celest]
- * Moved some other code around [celest]
- * Added Shinomori's changes to Dissonance -- don't increment the timer again
- if the target has died [celest]
- * Changed some nullpo checks back to normal null checks -- in some situations
- it would be normal to get a NULL [celest]
- * Changed some nullpo checks to print some debug information [celest]
- * Added some sd checks before calling pc_blockskill [celest]
- * Added Dino9021's fix for SQL char's friend list updating [celest]
- * Fixed a crash if the player invited to join a guild is not online, thanks to
- Alex14 [celest]
- * Find the guild invitation sender first before clearing its ID [celest]
-
- * Added 2 new script commands to support 2/15's cards patch... most of the
- effects in kRO should be available now ^^ [celest]
-
- - isequipped(...): Accepts a list of item ID's and checks whether all of
- the items/cards have been equipped.
- - isequippedcnt(...): Same as above, except it returns how many of the items
- are being equipped
-
- Example: if(isequipped(4002,4004,4006)) bonus bStr,1;
-
-02/16
- * Char SQL: Fixed the Whisper chat on splittet mapservers (i think now all features work!) [Sirius]
-
- * Added 3 more of the new card effects -- check item_bonus.txt [celest]
-
- * Added 'bonus4' to support the new card effects that might need up to 4
- parameters [celest]
- * Set 'killerrid' and do PCKillEvent before calling PCDieEvent, thanks to
- mrmagoo for pointing it out [celest]
-
- * Added some new script event related options to script config [celest]
-
- - [die/kill/login/logout]_event_name: Name of script to activate when an
- event has occured
- - event_requires_trigger: whether or not a 'set [EventName],1;' has to be
- defined first for the event to be activated
-
- * Added 8 of the new card effects on the 2/15's patch (still untested and
- not yet added to the item_db)
- - Refer to doc/item_bonus.txt for description
-
- * Minor rewrites on self and enemy weapon/armor breaking during battle [celest]
- * Added missing code for 'bBreakWeaponRate' and 'bBreakArmorRate' effects
- [celest]
- * Added missing code for 'bAddStealRate' effect [celest]
- * Removed redundant 'infinite_autospell' in map_session_data [celest]
- * Fixed Treasure Box spawn bug in all castles. [Lupus]
- * Fixed wrong PresentLOG (it wasn't showing PRESENT BOX type ID) [Lupus]
- * Expanded Monsters Drops Slots from 8 to 10. Everywhere in the sources. [Lupus]
- But in TXT / SQL monsters DB reading functions, I added a temp plug
- to make eA work fine with existing DBs. It reads only 8 drops and fills
- 9th and 10th drops with Zero.
- On expanding MOB_DB.TXT we'll remove that plug.
- We are adding new cards and some monsters
- have no free slots for them. Current state is tested and works fine.
-
-02/15
- * Allow Potion Pitcher to be able to cast on yourself -- i've almost forgot
- about this, thanks to Filougarou and Poki#3 for the fix ^^; [celest]
- * Added Wallex's changes for weapon skills to read list_num from the skill_db
- when calculating damage [celest]
- * Login / Login SQL: Fixed the EXE-Version check (now it works finally :) [Sirius]
- * Char SQL: Fixed the '0x2b05' reply to the mapserver (now multi - mapservers works again!)
- * Rewrote skill blocking system that was allowing people to bypass blocking
- time simply by casting a different skill [celest]
- * Edited out some inconsistencies with skillnotok [celest]
- * Corrected Investigate's damage calculation, thanks to matthias [celest]
- * Generate the remaining entries of the stat point DB if the number of
- entries in db/statuspoints.txt is less than MAX_LEVEL, or statuspoints.txt
- was not found [celest]
- * Try to spawn the player at a default map ("prontera.gat") when logging in if
- the save point map was not found [celest]
-
-02/13
- * added an @autoloot switch that Upa-kun has forgotten [Shinomori]
- * changed pet_skillattack_timer and corrected the poison spore attack
- * tighter check's on "unknown skill" error; but added prints to trace it
- * Added Wallex's changes to only evoke script_rid2sd if agitcheck(1) is used
- [celest]
- * Merged jA's equipment breaking system into the current one, and corrected
- items with unbreakable effects in the item_db [celest]
- - "bonus bUnbreakable,[chance];" changed to
- "bonus bUnbreakable[Weapon/Armor/Helm/Shield],0;"
-
-02/12
- * Merged Dexity's pc_statpointdb into pc_readdb, changed statp's string
- array to short (less memory), and fixed the db not giving status points if
- character level is above 255 [celest]
- * fixing and optimizing sharp shooting
- have implemented two different versions, just have a look and
- decide which to use, description is in the code [Shinomori]
- * Changed default map cache path from db/map.info to save/mapinfo.txt [celest]
- * Removed old code for Sharp Shooting (still a little buggy) [celest]
- * Merged Shinomori's code into map_foreachinpath [celest]
-
-02/11
- * mob.c fixed doubling entries in DROPS LOG, optimized [Lupus]
- * item_noequip.txt now you can disable named consumable items
- during GvG / PvP, too by Maya, optimized and checked [Lupus]
- NOTE: Get rid of old cards on your server!!! IDs: 4149-4332
- before using of this item_db.txt (some cards have changed their IDs)
- and it could cause ALIEN cards in your players equipment 8))
- i.g. a weapon compounding CARDS inserted in armor, etc...
- * item_db.txt Massive update: [Lupus]
- - Added all new missing items (up to st.Valentine's Day Event)
- - Added new cards 4149-4332, sorted them and set their sripts.
- - Fixed some names, typos, weigths and prices
- * Commented out old custom cards from Old_Card_Album.txt till we brush them up [Lupus]
- * Removed old custom cards from MOBs drops [Lupus]
- thanks to Landarma(new items templates) Poki#3(removing cards from drops)
- * Tidied up battle_check_target abit [celest]
- * Updated traps to affect allies as well in GvG [celest]
- * Check if login server is online before setting character to online (in SQL),
- thanks to Alex14 [celest]
- * Synchronise storage as well when saving character to cut down on item
- rollbacks or duping, by Yor / Frea [celest]
- * Added fix for super novices' Guardian Angel system crashing when base_exp = 0
- thanks to Alex14 [celest]
- * not realy fixing the "unknown skill" error
- but returning skill_castend_damage_id when called with skillid < 0
- still need to search a reason why it is called with -1 [Shinomori]
- * EXPERIMENTAL: Reduced memory used for the skill_tree DB by 30+mb [celest]
- * Added script commands isday and isnight - checks whether its night or
- daytime. Example: if(isnight()) ... [celest]
- * Skill Updates [celest]
- - Sharp Shooting: Dropped jA's and kA's code and wrote a new
- map_foreachinpath function in map.c -- about 14 times faster, but still
- uncomplete
- - Ankle Snare: Added matthias' suggestion to let agility reduce more trap
- time, but no less than 3 seconds.
- - Magnum Break: simplified code a bit, and changed to non-targetting /
- automatically damages an area around the caster
- - Tiger Fist: enable it to be used by its own besides as a part of
- the combo skills
- - Devotion: Fixed maximum level difference not reading its setting from
- battle_athena.conf, thanks to leinsirk
- - Soul Burn: Added some safety checks
-
-02/10
- * Login/Login SQL: fixed the client version check function [Sirius]
-
-02/09
- * Added conf-tmpl/readme.txt, explaining the import folder [1066: Ajarn]
- * SQL Char: Rewrote the char_create function (now it's faster/optimized) [Sirius]
- * SQL Char: Fixed the reply if a charname is invalid on create (now it replys denied..) [Sirius]
- * SQL Char: Added a Character limit per Account (can be set in the config) [Sirius]
- * SQL Char: Optimized some SQL-Querys [Sirius]
-
-02/06
- * NULL entries for guild data fixed [Credit to Sirius] [1060: Ajarn]
- * Login server uses login_db_userid and login_db_user_pass for
- queries now [Credit to Sirius] [1059: Ajarn]
- * Login server can now check clientversion in clientinfo
- [Credit to Sirius] [1059: Ajarn]
- * Fixed txt build compile problems[1057: MouseJstr]
- * Corrected end-of-line issues in source code [1056: MouseJstr]
- * Coded new command: @MOBINFO <monster name|monster N> [Lupus]
- the command has also 2 aliases: @monsterinfo, @mi
- It shows all Monster stats, Element, Race and stuff
- It shows all items with their drop chance
- It also shows MVP bonuses (MVP EXP, MVP Drops)
-
-02/05
- * increased the max_files allowed in a grf [1054: MouseJstr]
- * Changed the way char deletion works for SQL [1051: Ajarn]
- - If the email the client fails check then check if the
- email is blank and the DB email is a@a.com (default)
- If so, assume it was created with _M/_F, and delete it
- * SQL Login accepts _M/_F now [Credit to Sirius] [1049: Ajarn]
- * Map server now actually reads bind_ip [1048: Ajarn]
- Side note: login reads bind_ip, but doesn't use login_ip now.
- * Made eA compile under AMD64 64-bit native [1047: MouseJstr]
- * Changed interface binding to use a bind_ip instead of using
- the login_ip, char_ip, or map_ip. This lets you still be
- able to set your WAN IP seperate from what interface you
- wish to bind to. Also, the default is back to binding to
- all interfaces on the machine. [1045: MouseJstr]
- * optimizing OnTouch event name generation [Shinomori]
- * fixing Celests Sharp Shooting [Shinomori]
- * Updated Sharp Shooting AoE code, thanks to Neodis / k-Athena [celest]
- - Update: Adapt jA's path_search algorithm and removed the need of struct
- 'dev' in map_session_data
- - Update: Increase range to 14
- * Tidied up explicit typecasts in status_get_max_hp, thanks to Ilpalazzo-sama
- [celest]
- * Non-MVP / miniboss summoned monsters should give exp, my mistake ^^; [celest]
- Note:- minibosses are considered a 'Boss' as well, not just MVP's
- * Fixed a typo that was preventing packet version 5 clients (628sak) from
- logging in (it was supposed to only block those with 4 or below) [celest]
-
-02/04
- * Fixed more compile signed/unsigned errors [SVN 1040: MouseJstr]
- * TXT convertors now read the import command in inter_athena.conf
- [SVN 1038: Ajarn]
- * Fixed some compile errors [SVN 1037: MouseJstr]
- * Added common/buffer.(c/h) [SVN 1033: Ajarn]
- * Login server can now set it's ip address in the config [SVN 1033: Ajarn]
- * Servers now bind to a single ip address, thus allowing multiple servers to
- a single port [SVN 1033: Ajarn]
- * Added experimental code to generate a stack dump when it segfaults, thanks
- to Ser [celest]
- - does not work with Cygwin, as it does not have glibc
- - to enable, edit the Makefile and remove the # on the line:
-
- # OPT += -DDUMPSTACK -rdynamic
-
- - What it does: everytime eA crashes it'll generate a file "stackdump_
- <number>.txt" in your save folder with a backtrace, which you can
- examine and send to a dev to be fixed.
-
- * Some more tidying up in status_get_ functions [celest]
-
-02/03
- * When loading shop scripts automatically check if the prices can be exploited
- with OC/DC [celest]
- * If the buying price provided in item_db.txt is above 2x higher than selling
- price for an item no need to reset and redetermine the buying price [celest]
- * Fixed a mistake that was causing Ruwach to only work in PvP and PvM [celest]
- * Added DracoRPG's code for Joint Beat effects, thanks! [celest]
-
-02/02
- * Added checks to prevent some crashes in skill.c
- [Full credit to shinomori] [SVN 1022: Ajarn]
- * Removed nullpo check in skillnotok() -- otherwise it will display fail
- messages for monster skills [celest]
- * Added crash check for Ice Wall [celest]
- * Added some optimisations by Ilpalazzo-sama [celest]
- - reduce mob_data->size variable to 1 bytes
- - change from if-else to switch statements in buildin_strmobinfo
-
-01/31
- * Fixed a typo in Pressure causing it to deduct sp from the caster, and remove
- its sp_rate requirement [celest]
- * Updated skill_range_leniency code when casting a ground targetting spell
- ( as in Revision 968) [celest]
- * Added Karma and Manner to const.txt
- -- To change a player's alignment to more Good/Evil in scripting for example,
- use:
- set Karma, Karma + <number here>;
-
- In older exe's (11-08 or older) you can actually check your karma in the
- character alignment screen (alt-A)
- The rest is up to your scripting creativity ^^
-
- * Delete players' ID from id_db when kicking everyone from the map-server due
- to char disconnection -- Fixes an odd crash with lazy mob AI [celest]
- * Added at(@) command @autoloot, which turns autoloot on or off for the
- player who uses it [Upa-Kun]
-
-01/29
- * Fixed Storage Bug with Named Stackable items. Thanks to Nimion [Lupus]
- e.g. Arrows, Iron, Elemental stones, etc...
- * Added a crash check to Safety Wall, thanks to LebrEf[TaVu] / Freya for
- pointing it out [celest]
- * Added some optimisations in clif_parse_MapMove, by Ilpalazzo-sama [celest]
-
-01/28
- * Fixed a typo that was causing /in to always report failure even when the
- name was removed from the ignore list [celest]
- * Link "wisexin", "wisexlist" and "wisall" to the PM ignore functions, and
- "friendslistadd" and "friendslistremove" to the friends list functions
- when parsing the packet DB [celest]
- * added clif_parse_PMIgnoreList (packet 0xd3) from jA [celest]
- * Added DUMP_ALL_PACKETS and moved dump packets code in clif_parse a bit to
- support it [celest]
- * Added base code for Party Item Sharing -- still needs some work in client-
- server support [celest]
- * new GC link http://amber.stormbirds.org/~joshs/gc6.4.tar.gz
- This fixes some issues... works better
- * Added macros skill_chk and skill_get to check for out of bounds errors when
- retrieving info from the skill_db [celest]
-
-01/27
- * Added memory leak fixes with temporary script variables and pets-related
- actions, by End_of_exam / jA 1109 [celest]
- * Kick all characters when the char server disconnects from the map
- server [celest]
- * Added @changelook command for spriters to test view ID's [celest]
- * Added a check to Pneuma to prevent crashing, thanks to LebrEf[TaVu]/Freya for
- pointing it out [celest] [celest]
- * Tweaked garbage collection code after feedback from users
- [SVN 1002: MouseJstr]
- * Fixed TRADE exploits (it cures proxy hack / vending+trade hack) thanks to Freya [Lupus]
-
-01/26
- * Added bug fix for a memory leak caused when a character logs out,
- by End_of_exam / jA 1108 [celest]
- * Fixed a bug in gettick cache when compiling in Windows, thanks to Shinomori
- (jA 1094) [celest]
- * Added updates from jA 1092 [celest]
- - Changed "read_map_from_bitmap" to "read_map_from_cache",
- "map_bitmap_path" to "map_cache_file" in map_athena
- - Fixed item effects not showing when only one was used
- - Fixed a bug in Safety Wall
- - Allow only either Storm Gust or Lord of Vermillion to cause damage if
- stacked together
- - Added path_search_long, map_find_skill_unit_oncell
-
- * Added status_get_sc_def for calculating resistance against status
- abnormalities [celest]
- * Added status.c and status.h of jA 1091 update and moved some functions into
- the new source files:
- -- skill_status_change_ -> status_change_
- -- battle_get_ -> status_get_
- -- pc_calc_ -> status_calc_
- -- pc_getrefinebonus and pc_percentrefinery -> status_getrefinebonus and
- status_percentrefinery
-
- * Updated auto_counter_type's description in battle_athena, thanks to
- akusarujin for pointing it out [celest]
- * Removed some unnecessary skill level checks in battle.c [celest]
- * Removed my changes to /stable/Makefile which has libGC enabled by default
- that i've accidentally commited, sorry ^^; [celest]
- * Removed an unnecessary "cloneskill_lv" from map_session_data [celest]
- * Removed WATER.TXT (this file wasn't used at all. There's no such mapflag as WATER even). [Lupus]
- * Added Water Height of New Yuno Fileds 9 and 11.
- Now Water Ball works there as should. Wizards could levelup on sleepers, too. [Lupus]
- * libGC isn't ready to be the default quite yet... [MouseJstr]
-
- Enough people have asked so... Once you grab a copy of the
- libGC library from (http://amber.stormbirds.org/~joshs/gc6.3.tar),
- you start up a bash shell from inside cygwin and untar
- the gc6.3.tar. This will produce a gc6.3 directory. Then
- cd into that directory and type ./configure. Once that is
- done you type "make" and then "make install". This will
- spray the various includes and libraries all over your
- cygwin install (most in /usr/local).
-
- Now, edit Makefile and change the CC line to use the
-
- CC = gcc -pipe -DGCOLLECT
-
- entry. Also change the GCLIB to
-
- GCLIB = -L/usr/local/lib -lgc
-
- Remember to comment out the ones no longer used. Do a clean
- build and good luck. Obviously, this has not been tested
- by that many people so you really are on the cutting edge
- but if you have good results, send me a note
- (joshs@stormbirds.org) so that we can see if it really is
- ready for prime time.
-
- What should you see? Well, the map-server should not
- grow/consume extra memory anymore. More so, it should use
- dramatically less memory then it did before using the
- garbage collector.
-
- The downside is that it will consume a little more CPU...
-
- The question is, how much? how laggy? what effect on lots
- of players? I've heard stories saying it makes the server
- unplayable and others told me that they saw no
- player-visible effects at all.
-
-
-01/25
- * Fixed TXT compile problems with libGC [celest]
- * Added "Clients older than 2004-09-06aSakray" option to packet_ver_flag in
- battle_athena, just in case server owners still prefer the older clients.
- With so many changes to Sakray over the past months its much better upgrading
- to the newer clients (November or higher recommended) available ;P [celest]
- * Merged Full Strip into jA's tidier stripping skills code -- also fixes
- a typo that was causing Full Strip to do the reverse effect instead,
- and the skill not updating the target's status after successfully unequipping
- items [celest]
- * Tidy up the 4 chemical protection skills into one code block [celest]
- * Corrected Slim Pitcher's code -- sorry, i missed a few things ^^; [celest]
-
-01/24
- * Fixed a typo in Provoke that was causing crashes [celest]
- * Fixed another compile warning in src/char/char.c
- [SVN 985] [MouseJstr]
- * Fixed a account wipe bug in login/login.c (Thanks Wallex)
- [SVN 984] [MouseJstr]
- * Fixed a crash in char_sql/char.c where people were selecting
- chars before requesting connections [SVN 983] [MouseJstr]
- * some G++ compile tweaks and got through several files in the
- map server - [SVN 976] [MouseJstr]
-
- Why are we doing a C++ conversion? We have a lot of duplicate
- code and would like to make the "classes" in the server share
- code.. For example, a pet should be able to share code from
- the player or from a mob. Similerly, introducing a new type
- of entity in the game should be as simple as creating a
- sub-class instead of having to crawl through the entire source
- tree searching for every class check and introducing handler
- code in for your new type.
-
- Finally, while a garbage collector is "cool", it would still
- be nice to have enough object knowledge on how to clean up
- data that it is not absolutely required. It is faster for
- us to clean up our own messes then introduce a whole system
- for cleaning up after ourselves.
-
- Is there a C++ performance penalty? Not if the code is
- written correctly. For example
- 1) No templates - code bloat and destroys cpu cache
- coheriancy
- 2) No C++ exceptions - slows down entering and
- exiting functions
- 3) No operator overloading - makes it hard to
- understand what is going on.
- 4) No C++ STL libraries - Templates, huge, bloated,
- unportable
- 5) No method inlining - code bloat and reduces cache
- coheriancy. Let the optimizer do it...
-
-01/23
- * char-server (SQL & TXT), login-server (SQL & TXT), and txt-coonvertors
- (char and login) all compile on g++ now [svn 975] [Ajarn]
- * Fixed the sizeof errors in g++ [SVN 972] [Ajarn]
- * Reverted back some of the char* changes [SVN 972] [Ajarn]
- * Changed parse_script to now return char* [SVN 969] [Ajarn]
- * Converted run_script and run_script_main from unsigned char* to char*
- [SVN 969] [Ajarn]
- * Forgot a couple small changes [SVN 35] [Ajarn]
- * Changed map_data.gat and map_data_other_server.gat from unsigned char*
- to char* (this might be needed, because of unicode or something, please
- correct me if I'm wrong) [SVN 34] [Ajarn]
- * Converted decode_zip, encode_zip, remove_control_chars, mapif_sendall*,
- and e_mail_check to use char* instead of unsigned char* (again, please test)
- [SVN 34] [Ajarn]
- * Modified skill unit group checking in skill_unit_onplace that might have
- been causing crashes [celest]
- * Updated packet 0x143 length's for version 14 (2004-11-01Sakexe) and version
- 16 (2005-01-10Sakexe), thanks to jathena and ice2big [celest]
- * Fixed login-server compile error with the "new" -> "new_" changes [celest]
-
-01/22
- * Fixed an error that was in my last commit (optimising g++ build) [SVN 29]
- [Ajarn]
- * Made strlib functions char*, instead of unsigned char*. Strings are meant
- to be char. (Shouldn't break anything, but might, please test this for me)
- [SVN 26] [Ajarn]
- * Added cast for TXT version [SVN 25] [Ajarn]
- * Added cast from allocation calls, from void* to intended type [SVN 24] [Ajarn]
- * Changed bool -> bool_. Still need to make convertions between
- char* and unsigned char* valid, and some other convertions too.
- Also, sizeof is being used wierd in map.c, at least g++
- complains [SVN 22] [Ajarn]
- * Changed the rest of the class variable names to class_ and all the new
- variable names to new_, for futher g++ support [SVN 21] [Ajarn]
- * Update both caster and target's SP after using Soul Change -- thanks to Aalye
- / Freya [celest]
- * Force a monster to switch attack target when being casted Provoke [celest]
- * Corrected description for @enablenpc -- "@npcon" -> "@enablenpc" [celest]
- * Since job normalising is still buggy require all 1st class skills to check
- for Basic Skill level when calculating the skill tree [celest]
-
-01/21
- * Updated packet DB configurations : enable_packet_db, packet_db_ver,
- -- check the .txt for description [celest]
-
- Note: For people having connection problems try setting 'enable_packet_db'
- to 'no'... and use the latest client (01-10Sakexe)
-
- * Fixed a small typo in 12-06's packets -- 21b => 21d [celest]
- * Updated packet_db.txt to only contain the latest version, like jAthena,
- since there's not much point to re-read packets eA already supports
- (although if you remove all the //'s it can still read multiple versions)
- [celest]
- * Added clif_config in clif.c - for keeping packet/client connections related
- stuff [celest]
- * Send 'Game Exe not latest version' to a client if it hasn't been authentified
- yet, but is sending a non-connection-related packet to prevent crashing
- -- assume the client is using an unknown exe [celest]
-
-01/20
- * Fixed compile time problems with the non-GC case [MouseJstr]
- * Introduced aMallocA and aCallocA
-
- These two functions allocate "atomic" memory which means
- "memory that does not contain references to other memory".
-
- This lets the garbage collector ignore these objects when searching
- memory for references to other objects dramatically increasing
- performance of the GC.
-
- When in doubt, use aMalloc and aCalloc. It is better to add
- a tiny bit of work to the GC then do cause a crash due to memory
- being cleaned up when it shouldn't.
- [MouseJstr]
- * Modified all calls to aMalloc and aCalloc that reference
- atomic memory to use aMallocA and aCallocA
- [MouseJstr]
- * Modified the socket buffer allocator to use "atomic" memory
- for the fifo data buffers [MouseJstr]
-01/19
- * added support for the Hans-J. Boehm libC garbage collector
- (A copy is in http://amber.stormbirds.org/~joshs/gc6.3.tar).
-
- It is ABSOLUTELY critical for people to use
- aFree/aMalloc/aCalloc/aStrdup for this to work. If somebody
- has just used free or malloc, this will crash when used with
- the garbage collector.
-
- A amusing environmental variable to set is GC_PRINT_STATS (to 1)
- so that you see real time statistics of leaked data being
- recovered.
-
- grab a copy of the gc6.3.tar.. build it .. install it..
- modify the Makefile to have the
-
- CC = gcc -pipe -DGCOLLECT
- GCLIB = -lgc
-
- lines... and make the sql servers (the txt server doesn't
- build using this right now due to stupid Makefile issues)
-
- [MouseJstr]
- * SVN 3 on http://svn.stormbirds.org/svn/eathena will be what
- I diff against when I merge back into delta.. if we ever merge
- back into delta [MouseJstr]
- * Removed 12-06 Sakexe detection, since it doesn't seem to work, and
- might be conflicting with 10-25 clients [celest]
- * Update the Soul Burn target's SP when it has been successfully reduced to 0,
- thanks to Aalye / Freya [celest]
- * Moved SC_PRESERVE and SC_BATTLEORDERS's id so they'll display a status icon
- when cast, thanks XiaoLin of cAthena [celest]
- * Added missing code for Preserve -- i totally forgot to add it ^^; [celest]
-
-01/18
- * Added some skill bug fixes, thanks to Aalye / Freya [celest]
- - stop player attacking if the target goes into hiding
- - fixed Sword Reject not working against swords, only daggers
- - additional check in case Marionette Control doesn't end properly even
- when one of the partners has logged off
- * Added stun, bleeding and SP loss effect for Pressure, thanks to DracoRpg
- [celest]
- * TEST: Fixed more compile warnings in MSVC [celest]
- * TEST: Fixed some compile errors in MS Visual C++, thanks to Ser [celest]
-
-01/17
- * Some rewrites in skill_delayfix [celest]
- - If the delay is < 0, add the weapon aspd delay to it
- - If the skill is not weapon type, and has 0 delay, add 300ms as default
- * Added min_skill_delay_limit as the minimum allowed delay for any skills
- [celest]
- * Some tidying up in battle_get_ functions [celest]
- * Set exp table and job bonus table to 0 before reading - might solve some
- memory bugs [celest]
- * Updated skill range leniency code - If possible try and move towards the
- skill target so that when casting it no longer falls out of range [celest]
-
-01/15
- * Added effects to enemies for Gospel [celest]
- * Added mobs spawn to all Yuno fields (according to 4th Jan patch) [Lupus]
-
-01/14
- * Added party supporting effects for Gospel [celest]
-
-01/13
- * Added and testing support for 2004-12-06Sakexe [celest]
- * Removed emblem changing requiring Glory of Guild limited to TXT only [celest]
- * Corrected a typo preventing Plagiarism to work, thanks to orn [celest]
- * Fixed Berzebub card and other 'reduce cast delays' equipment not working
- [celest]
- * Updated packet_db.txt loading to support reading into multiple packet
- versions [celest]
- * Removed packet_db_ver defining in packet_db.txt -- it'll determine itself
- based on MAX_PACKET_VER [celest]
- * Integrated packet size and function DB's into 1 packet_db [celest]
- * Added MAX_PACKET_VER -- maximum versions supported by eA, including the
- packet_db -- and changed packet size and function DB's to use it [celest]
- * When sending 'Game exe not latest version' packet don't close the session
- immediately so it will still be delivered [celest]
- * Added map-server display if an unidentified client was rejected --
- also fixes the 'empty string sent to _showmessage' [celest]
- * Added a bug - Celest, LOOK AT THIS BUG ASAP. [Codemaster]
- * Tided up/fixed some mobs [Lupus]
-
-01/12
- * Implemented Vending Log [Lupus]
- TODO: use log option to log only important deals (much money, rare items, etc)
-
-01/11
- * Added Shinomori's changes to npc event timers (I never realised it, thanks
- ^^; ) [celest]
- * Updated clif.c to be able to identify client versions based on the packet DB
- [celest]
- * Correct packet_db_ver to the maximum version allowed if it was set too high
- or too low in packet_db.txt [celest]
- * Added support for 2005-01-10Sakexe [celest]
- * Updated packet functions for 2004-11-08 and 2004-12-06 (Note: eA *can*
- support 12-06, but still doesn't recognise it... so unless we find a way,
- it is *not* supported yet) [celest]
- * Updated packet_db, thanks to Sara-chan [celest]
- * REMOVED support for clients before packet version 10 (2004-08-25 and
- earlier) - the client will receive a 'Game Exe not latest version' message
- [celest]
- * Added a check to prevent crashing when trying to log in with
- 2005-01-10aSakexe in servers that don't support it [celest]
- * Added a fix to @sound where if you forgot the .wav exention, i'd attempt to play the file without it (it adds the .wav) [Codemaster] [SVN 949]
- * Added @disguiseall / @undisguiseall [Codemaster] [SVN 949]
- * Added misc. clif.c fixes (jAthena added alot of close(fd)'s, so i added them, too) [Codemaster] [SVN 949]
- * Added bug reports - Celest, you might want to check one of those out [Codemaster] [SVN 949]
- * Fixed a bug in clif.c which didn't allow to enther the map-server.
- It worked under win32, but didn't under Linux. [Lupus]
-
-01/10
- * Completed adding packet DB reading... still needs (a lot) more work in
- clif.c [celest]
- * Added Shinomori's suggestions for npc timers, thanks again ^^ [celest]
- * Removed checking for script event timers' length, and added Shinomori's
- changes [celest]
- * Start adding packet DB reading [celest]
- * Added 'max_eventtimer_length' (default is 32) to script_athena.conf. [celest]
- Some event timers with names longer than 24 could cause the server to close
- itself, change this if you need support for even longer names
- * Removed PCLoginEvent requiring 'PCLoginEvent' for the player to be set to 1
- first to be activated. [celest]
- * Added Shinomori and orn's fix for the skill tree to only check the first
- required skill in the DB and skipping the rest [celest]
- * Modified 'wedding' script command to work with "OnTimer" scripts even without
- doing 'attachnpctimer' (The 'player not attached' error will still display,
- but the effect will appear *over the NPC* instead of the player...
- at least it won't fail ^^) [celest]
- * Added 'attachnpctimer' script command for attaching the player to the current
- npc's timer in "OnTimerxxxx" scripts, thanks to Wallex for the idea. [celest]
- Syntax:
- attachnpctimer;
- attachnpctimer "<Player Name">;
-
- Check /npc/sample/npc_test_npctimer2.txt for example.
- * Added 'detachnpctimer' script command for detaching players from the npc's
- timer. [celest] Syntax:
- detachnpctimer;
- detachnpctimer "<NPC Name">;
-
- * Added 'OnInterIfInitOnce' for WoE scripts & modified the WoE scripts as well [Ajarn & Codemaster] [Thanks to FREYA] [SVN 943]
- * Added the @sound command and the NPC command of soundeffectall
- - works just like soundeffect, but plays for everyone in the area [Codemaster] [SVN 942]
- * Don't allow Pets to attack Guardians outside of WoE [Codemaster] [SVN 940]
- * Require 15% of HP or more for WE_MALE skill [Codemaster] [SVN 940]
- * Require 15% of SP or more for WE_FEMALE skill [Codemaster] [SVN 940]
-
-01/07
- * Upon changing to high novice 100 stat points should be given, not 88 [celest]
- * Give high novices First Aid and Trick Dead upon job changing [celest]
- * Remove some unnecessary checks in battle.c [celest]
- * Added some checks to prevent novices still allowed to attack when using
- Trick Dead [celest]
- * Added 'summon' script command. Syntax:
-
- summon <monster name>,<monster id>[,<event>];
-
- Example: 'summon "Poring", 1002, "OnPoringKilled"; 'will summon (note:
- not *spawn*) 1 poring that'll help its master for 1 minute,
- and activate the "OnPoringKilled" event when killed.
- 'summon "--ja--",-1;' will summon a random monster.
-
- * Added Wallex's fix for the wedding script functions [celest]
- * Added the below-mentioned alive packet to SQL's char and login [celest]
- * Enabled login server 'anti-freeze' by default as a temporary solution
- to char-login disconnection [celest]
- * The TXT char server was rejecting login's "i'm alive" packet and disconnecting
- it... fixed [celest]
- * Stall_time wasn't being read in login_athena at all (not by the login server,
- because the code didn't read it, nor by TXT map server, since its in the SQL
- inter_athena.conf reading)... so moved it to inter_athena.conf, and
- change sql_config_read in map.c to inter_config_read [celest]
- * Some tidying up of battle_get_def and _def2 [celest]
- * Added 'bDelayrate' and changed Phen card, Marduk Card and Berzebub Card's
- effects to use this instead of bCastrate (which was reducing casting time,
- not delay time) [celest]
- * Some tidying up of skill_castfix and skill_delayfix [celest]
- * Added Filougarou's fix for Bowling Bash causing it to only display damage,
- but doesn't do any - thanks! [celest]
- * Set delay_dependon_dex in battle_athena to 'no' by default [celest]
-
- Note: Just to clarify things, on official servers dex is not supposed to
- reduce skill delays, only Poem of Bragi and Berzebub card does!
-
- * Fixed typo in skill_delayfix - reduce delays only if delaynodex was *not* set,
- sorry ^^; [celest]
-
-01/06
- * Fixed various memory corruptions causing crashes (SVN 925) [MouseJstr]
- * Fixed typo in src/map/map.c causing compile
- errors (SVN 924) [MouseJstr]
- * Removed the alive_timer mechanism entirly replaced with
- a stall detection mechanism that will disconnect a player
- who has not sent any data for a configurable
- (conf/login_athena.conf:stall_time) amount of time. The default
- is currently 60 seconds.
-
- The root cause of the disconnect error is that some NAT based
- routers are not dropping the TCP connection when the aliased
- machine goes offline abnormally. This means that we are seeing
- a stalled but perfectly valid TCP connection.
-
- (SVN 924) [MouseJstr]
-01/05
- * Fixed some typos in map_versionscreen() [MC Cameri]
- * Removed loop freeing in map-server's do_final(), it was causing seg faults [MC Cameri]
- * Finished do_storage_final() in map-server's do_final(), it was there but doing nothing [MC Cameri]
- * Fixed Celest's typo making all vended items cost 0 zeny [Codemaster] [SVN 919]
- * If a vending item was priced at 0 it'll be auto changed to 1million [celest]
- * Fixed TXT logging - log_athena.conf reading was kind of messed up [celest]
- * Added a simplified version of Qamera's OnConnect: OnDisconnect: OnDeath:
- NPC events mod, (All credits go to him.) except adapted based on eA's current
- PCLoginEvent. (by davidsiaw) [celest]
- - Currently only 4 events have been added: PCDieEvent, PCKillEvent,
- PCLogoutEvent and PCLoginEvent
- - For notes and usage example check /npc/sample/PCLoginEvent.txt (by
- davidsiaw)
- - To enable them for a player in a script, do
- "set <name of event>, <0 or 1>;"
- (yes it's saved in a permanent character variable and auto read every time)
- - Simply put, if any of them is set to 1 the appropiate event will activate
- p.s - Scripters who are already using PcLoginEvent, you'll need to add a
- "set PCLoginEvent, 1;" now, sorry for the trouble.
-
- * Optimised PCLoginEvent activation a bit [celest]
- * Set 'droprate0item''s default to 'yes' so that items with 0 rate will never
- drop [celest]
- * Look at item type other than item ID as well to check whether it is a card
- in card-related script commands - better support for custom items [celest]
- * Reset all skill variables if the skill fails so certain skills can't be
- abused (such as Warp, thanks to Alex14 for pointing it out) [celest]
- * Added /mapflag/noreturn.txt for disabling butterfly wings (not fly wings)
- [celest]
- * Fixed skill_require_db reading somehow getting corrupted if weapons usable
- for the skill is more than 20, thus causing the skills to fail everytime
- [celest]
- * Fixed @killmonster crashing the server with summoned monsters, thanks to
- Alex14 [celest]
- * Added double_connection_system to battle_athena (not completed yet) [celest]
-
-01/04
- * Fixed GM Command Logging (Not sure why TXT logging still isn't working properly :( ) [Codemaster] [SVN 907]
- * Fixed one of Lupus' additions to the item_db [Codemaster] [SVN 907]
- * Fixed Seismic Weapon Skill (it 100% didn't break target's weapon at 4 level of the skill) [Lupus]
-
-01/02
- * Re-fixed map-server crashing if an empty line is in skill_castnodex.txt,
- thanks to Alex14 for pointing it out (SVN 899) [celest]
- * Modified breaking rates calculating - meltdown's chances is separated from
- self breaking chances (SVN 900) [celest]
- * Reduced MAX_SKILL_LEVEL to 10 to save a bit of memory and speed [celest]
- * Tidied up parts in skill_castfix a bit (SVN 895) [celest]
- * Fixed map-server crashing if an empty line was added in any of the skill-xx
- db files (SVN 895) [celest]
- * Updated skill_castnodex reading - An *optional* 3rd value can be added to set
- whether a skill's delay time can be affected by dex (SVN 895) [celest]
- Example: 46,1,1 - double strafe's delay is not affected by dex
- 46,1,0:0:0:0:1 - only level 5 double strafe is not affected by dex
- * More atempts at memory leak fixes [Codemaster] [SVN 890]
- * Updated weapon breaking rates, thanks to DracoRPG (SVN 891) [celest]
- * Optimized enchanting skills success rates calculation, thanks to Wallex
- (you were right! ^^; ) (SVN 891) [celest]
- * Modified Spiral Pierce and Breaker to type ranged (SVN 891) [celest]
-
-01/01/05
- * Attempted to fix a memory leak [Codemaster] - tell me if it works XD (NPC/Mob memory leak in npc_parse_mob(...)) [SVN 886]
- * Added a char config that allows GMs that have a certain level or above to
- bypass the server's user limit [Codemaster]
- * Changed some create arrow outputs for new kRO 12/21/04 patch [Aria]
- * Fixed some respawn delays of MVP/Miniboss monsters. Redo Umbala/Niflheim fields, added missing mobs, corrected
- monsters quantity. In Niflheim fixed wrong Lord of Death monster ID. [Lupus]
-12/30
- * Added ispartneron, getpartnerid, and warppartner script
- commands to properly support jawaii NPC's (SVN 880) [MouseJstr]
- * Moved supernovice guardian angel messages to msg_athena.conf [celest]
-
-12/29
- * Fix account register wipe issue (SVN 868) [MouseJstr]
- * Double storage/lag exploit fixed (SVN 867) [MouseJstr]
- * Another -1 alive_timer fix (SVN 866) [MouseJstr]
- * Added @dmstart and @dmtick for debugging malloc tests [MouseJstr]
- * Fix some more compile errors on different platforms [MouseJstr]
- * Fixing a crash if you change the name of a pet you don't have (SVN 863) [MouseJstr]
- * Eliminated src/common/malloc.c when not needed [MouseJstr]
- * Some code cleanup in prep for new debugging malloc (SVN 861) [MouseJstr]
- * Updated Soul Breaker's damage calculation [celest]
- * Updated Meteor Assault's cast delay to be not affected by dex [celest]
- * Changed int_guild.c so it will calculate average guild level only if > 0
- members are found - prevent divide by zero crashes (why would an empty guild
- be requested to update its' member info in the first place?) [celest]
- * Added Shinomori's fixes for string copying in script.c [celest]
- * Removed @giveitem since #item it's the one that does this and added some of it's support to #item [MC Cameri]
- -#item <item_name> <item_count> <charname|all|everyone>
- * Uncommented out import in charcommand_athena.conf, there is
- need to have it commented (all the others ones are
- uncommented) [Ajarn]
-
-12/28
- * When restarting the char-server, reset the online status
- of all characters and guild-members (SVN 849) [MouseJstr]
- * Fix double timer_delete caused by pc_alive_timer (SVN 848)
- [MouseJstr]
- * Fixed typo in npcs_athena.conf (mc_cameri verses mc_Cameri),
- thanks Mellow972 for pointing that out (SVN 845) [MouseJstr]
- * Reduced weapon breaking chance for Overthrust, thanks Draco - i almost
- forgot to add this update [celest]
- * added checks into the skill code to prevent proxy's/bots
- from crashing the server by using skillid's that
- are WAY out of range (SVN 841) [MouseJstr]
- * Fixed clif.c errors that prevent old clients from being used. [nsstrunks]
- * Fixed @jobchange to not default to upper (SVN 837) [MouseJstr]
- * Fixed a compile error in @mobsearch (SVN 836) [MouseJstr]
-12/27
- * Updated 1206's packet fuctions in clif.c [celest]
- * Updated the new guild skills - cannot be reused within 5 minutes of
- activating it [celest]
- * Added @mobsearch, @cleanmap and @giveitem from jA [celest]
- * Fixed the guild issues (SVN 832) [MouseJstr]
- * Updated description for player_check_cloak_type [celest]
- * Increased skill range limitations in pc_no_footset [celest]
- * Added exp_calc_type - to alternate between 3 different versions for exp
- calculating [celest]
- * Reinitialized variable 'c' in map_readmap, it's supposed to have a start value. Ex. '-'. [MC Cameri]
- * Commented out dump_timer_heap() again... [MC Cameri]
- * Added include of string.h in malloc.c, was causing compile errors/warnings [MC Cameri]
- * Modified the map progress bar to reduce updates (SVN 829) [MouseJstr]
- * Updated map cache system from jA 1087 - change read_map_from_bitmap to 2 to
- enable zlib compression [celest]
- * don't delete alive_timers of -1 (SVN 823) [MouseJstr]
- * switched malloc,calloc,realloc to aMalloc, aCalloc, aRealloc
- so support the use of a garbage collector (SVN 821) [MouseJstr]
- * Removed some printf's from map-sql [MC Cameri]
- * Uncommented MSG_SQL, for _ShowMessage(), usage: ShowSQL() [MC Cameri]
- * Removed fixed bugs in dev/bugs.txt [MC Cameri]
- * Now I remember what I was smoking.. (SVN 819) [MouseJstr]
- * Fixed a bug in the guild_castle persistance code
- in char_sql. What was I smoking? (SVN: 816) [MouseJstr]
- * Corrected a bad error in itemdb_read_itemslottable [celest]
- * Corrected wrong logging of text in int_guild.c, thanks to Alex14 [celest]
- * Summoned monsters will not give exp and items [celest]
- * Added the 6 new Yuno fields to maps_athena.conf [celest]
- * Added some Freya's optimisations in clif_parse [celest]
- * Added clif_update_mobhp - monsters' hp viewing now updates properly [celest]
- * Set alive_timer to -1 when quitting, not 0, or the map server might assume
- its still active [celest]
- * Changed the *_override_grffile to no by default, because many were having issues with it [Ajarn]
-
-12/26
- * Fixed ANOTHER pet crash (double free) (SVN: 804) [MouseJstr]
- * Added a proper #define for MAX_VENDING (SVN: 802) [MouseJstr]
- * Fixed crash associated with vending more then 12 items
- which walked on memory.. corrupting the pet data
- structure (SVN: 801) [MouseJstr]
- * Fixed a crash that resulted when disconnecting (SVN 800)
- the new client when the old client is still connected [MouseJstr]
- * Fixed some gcc 2.95 compile errors [MouseJstr]
- * Fixed some array bounds errors (SVN 799) [MouseJstr]
- * @mapexit (and do_final) now persist all data to the
- char server before exiting to eliminate storage/inventory
- inconsistancies.. [MouseJstr] (SVN 793)
- * Some cleanup of spiritball memory management [MouseJstr]
- * Dramatic performance work for exp updates to sql. Previously, [MouseJstr]
- when u killed a mob (in party share), it would cause the char_server to
-
- 1) Delete all guilds for all members of your party
- 2) Re-create all guilds for all members of your party with the new exp
- values.
-
- Now it just generates 2 sql statements per party member,
-
- 1) update the guild exp,
- 2) update the guild_member exp.
-
-
- src/common/socket.c src/common/socket.h src/char_sql/char.c
- src/char_sql/int_guild.c src/map/chrif.h src/map/pc.c
- src/map/map.c src/map/chrif.c
-
- * Disabled import charcommand_conf.txt by default [celest]
- * Added Bitmap File system from jA 1086 - automatically generates a cache
- from maps in the GRF to speed up loading. You can enable/disable it with
- read_map_from_bitmap in map_athena.conf. Note: AFM maps will override this
- cache [celest]
- * Added --run_once flag for the map server for testing purposes - closes itself
- when everything is done loading [celest]
- * Added some code for Moonlit Petals and Basilica [celest]
-
-12/24
- * Added suggested fix when client disconnected [celest]
- - send "disconnected due to time gap" and close session when timed out
- - send "server still recognises last login" message and close existing
- session when client reconnects
- * Upped windwalk to lv 10 in skill_tree [MouseJstr]
- * Fixed a scripting crash (SVN: 781) [MouseJstr]
- * removed @changesex and @charchangesex until we can
- fix it properly [MouseJstr]
- * Fixed item-dup bug in storage and cart [MouseJstr]
- * @skilltree was looking outside of the particular class
- of the char to see if they could do a skill [MouseJstr]
- * Fixed a calc_skill_tree bug where too many skills were
- visible [MouseJstr]
- * Added Dev/GDB_reports.txt, take a look in it devs [Ajarn]
- * Corrected description for player_skill_nofootset and monster_skill_nofootset
- in battle_athena.conf [celest]
- * Added a special NPC Logging command 'logmes'. It works as mes"Hello world!";
- It is useful for such NPC as BANKS, CASINO, etc. To keep track of won money, etc.
- Check kafra_bank.txt 1.1 for example.
- Note: mes = otput into client's NPC window
- debugmes = output into map-server window
- logmes = output into lognpc log DB.
-
-12/23
- * Fixed some bugs in the clif.c changes (SVN 766 to SVN 767) [MouseJstr]
- * Added ayo monsters to @disguise
- * Began updated clif.c to work with 1108 and 1206, tested and works [nsstrunks]
- * Fixed skills still being available after a job change [MouseJstr]
- * Changed pc_alive_timer to use map_id2sd - should be more accurate [celest]
- * Added jA 1084's fix to mob.c - check whether the player is still alive
- when calculating exp [celest]
- * Added clif_changed_dir, clif_adopt_process [celest]
- * updated Backstab to show the target's new direction [celest]
- * Corrected the file types of several files in the SVN tree to
- fix the newline issues [MouseJstr]
- * Updated mapflags (added missing payon_in03,ayo_in01,ayo_in02, que_god01, que_god02) [Lupus]
- * Updated Sacrifice : it's now self-activating, and lasts for 5 attacks [celest]
- * Fixed compile errors in party.c [celest]
- * Moved SC_EDP back to 114 [celest]
- * Added some of Shinomori's fixes [celest]
- * Added optimisation in intif_parse_WisMessage from Freya [celest]
-
-12/22
- * Eliminated skill tree mapping since we have entries
- for all the classes in the skill_tree.txt files [MouseJstr]
- * Added finding_ore_rate to battle_athena.conf, thanks to orn [celest]
- * Changed how party exp is passed out to eliminate players
- current in a chat window or those who havn't moved or attacked
- in 2 minutes [MouseJstr]
- * Fixed a bug in resnametable from local directories,
- by fixing a bug in grfio_read causing memory corruptions [MouseJstr]
- * Rearranged how guild messages, gm messages, and party messages
- are moved back and forth between the inter server and the
- map server.. eliminating unneeded round trips to eliminate
- lag on a loaded char-server. [MouseJstr]
-
- src\char_sql\int_party.c src\char_sql\int_guild.c
- src\char_sql\inter.c src\map\atcommand.c src\map\guild.c
- src\map\intif.c src\map\party.c src\char\int_guild.c
- src\char\inter.c src\char\int_party.c
-
- * Reverted npc.c back to before jA 1081. This fixes warp portals missing and other npc bugs [Ajarn]
- * Added conditional SHOW_DEBUG_MSG for displaying ShowDebug()'s output, it was missing before [MC Cameri]
- * Added #zeny, removed @charzeny [MC Cameri]
- * Fixed reading itemslottable.txt causing cards to become unuseable [celest]
- * Added error message if file renaming in lock_fclose fails [celest]
- * Fixed frost diver not working ... my bad =p [celest]
- * Corrected typo in clif_hpmeter - md -> sd [celest]
- * Check if the player has been authentified by the char server before
- clearing any timers in map_quit [celest]
- * Added eventtimercount and timerskill_count - check these before clearing
- or deleting timers [celest]
- * Added sc_count check in skill_stop_dancing [celest]
- * Translated the japanese part in battle_athena.conf [celest]
- * Added ignore the new skill delays when chaining monk combos [celest]
-
-12/21
- * Since conf/maps_list.txt was removed, added conf/maps_athena.conf [Ajarn]
- * Fixed a few NPCs that were giving curly errors. It seems to be caused by a bug that the NPCs' last line isn't read or something [Codemaster]
- * Fixed a tiny compile warning in npc.c [Codemaster]
- * Allowed the NPCs without proper curly brackets to still load, but give an error still [Codemaster]
- * Added variable 'current_file' which tells the filename of the script while loading npcs [MC Cameri]
- -the variable its set in do_init_npc() or something like that, so you can only access it
- after the use of do_init_npc().
- * Fixed the display of a warning saying that a right curly brace was missing [MC Cameri]
- * Removed @charwarp and @rura+ and added #warp, #rura, #rura+ [MC Cameri]
- * Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf [MC Cameri]
- * Moved some code in pc_break_equip that was causing compile errors [celest]
- * guild skills vanished due to incorrect placement of a
- check for quest skills in the calc_skilltree code [MouseJstr]
- * Fixed skill LK_HEADCRUSH, LK_JOINTBEAT to work on both on
- and off peco's for lord knights (fixed typo in
- skill_tree.txt) [MouseJstr]
- * removed LK_SPIRALPIERCE from lord knights not on peco's[MouseJstr]
- * Moved the code from map_quit to pc_makesavestatus that
- "adjusts" the skill tree before persisting to the character
- server [MouseJstr]
- * made pc_makesavestatus() properly persist skills that are
- unavailable but not forgotten (example, spiral pierce). You can now
- get spiral pierce, get off your peco, log out, log in, and
- get back on your peco and still have not lost the skill
- points you invested. This also solves the problems of when
- the skill tree gets changed, players loosing the points. [MouseJstr]
- * Made pc_resetskill() properly reset skills that are
- currently not visible due to skilltree changes [MouseJstr]
- * Finished updating most of the map-server to 1082... i'll leave the more
- technical ones for the other devs ^^; [celest]
- * Added other new battle_athena options from jA 1082 ... descriptions not
- translated yet [celest]
- * Removed my own additions for skill delays using aspd and added jA's code
- (-removed-) [celest]
- * Adapted skill_range_leniency to jA's code - should be more stable [celest]
- * Fixed drop rates only limited to multiples of 100's - thanks to jathena
- for pointing it out [celest]
- * Added missing code for castle_defense_rate [celest]
- * Removed pc_undead_nofreeze - no code for it [celest]
- * Updated unrefineable items table - thanks to jathena [celest]
- * Added 3 new script commands: [celest]
- - skilleffect : shows a skill effect on the player
- - doskill/skilluseid (originally by Qamera) : casts a skill on the player
- - skillusepos : casts a skill on a position
- * Added SC_SpeedUp0 [celest]
- * Merged itemdb_read for SQL and TXT [celest]
- * Moved itemdb_read_itemslottable in itemdb.c for better readability [celest]
- * Removed itemdb_read_cardillustnametable limited to TXT only [celest]
- * Added reading itemslotcounttable.txt from the GRF to auto set number of slots
- per item [celest]
- * Added a display message when reading itemslottable from the GRF [celest]
- * Added options in battle_athena.conf to enable/disable reading the GRF for
- indoorrswtable.txt, leveluseskillspamount.txt, num2cardillustnametable.txt,
- itemslottable.txt & itemslotcounttable.txt [celest]
- * Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf
-
-12/20
- * Fixed npc_parse_mob with large/tiny monsters causing
- memory corruption [MouseJstr]
- * Fixed a crash in char.c with new chars [MouseJstr]
- * Updated npcs_list.txt [Ajarn]
- * If last_pos.x or .y == 0, set to start point [MouseJstr]
- * Fixed map loading. If a map was not found, it would remove the next map in the list [Ajarn]
- * Moddified some *_athena.conf's (my typos and some inncorect default values) [Ajarn]
- * Added Valaris' double connection bug fix (imalive watchdog) [Valaris]
- * Fixed map-server exiting when it came across a bad NPC file [Codemaster]
- * Updated Valaris' large/tiny monsters - of course, he told us what he did wrong and how to fix it :) [Codemaster & Valaris]
- * Updated makefiles to new strlib locations [Codemaster]
- * Moved strlib.h and strlib.c into the common directory [Codemaster]
- * Updated a bit of jA 1081 - it's not completly updated yet!!! [Codemaster]
- * Fixed some gcc 2.95 problems [MouseJstr]
- * Speedups in socket code [MouseJstr]
- * made samesex weddings work and give out correct ring [MouseJstr]
- * CFixed wedding NPC halting after server reboot/crash (shadowlady put in comments but didn't add to code) [Aria]
- * Added reading leveluseskillspamount.txt from the GRF to auto set sp used for each skill [celest]
- * Added reading indoorrswtable.txt from the GRF to auto set 'indoor' mapflags
- [celest]
- * Added check in grfio.c to prevent crashing if a file wasn't found [celest]
- * Rolling GUILDCACHE and FASTCHAR into main branches/stable
- tree [MouseJstr]
- * Changed max_paramter to an unsigned int so that you can have over 255 as your max stat [Codemaster]
- * Experimental: Reverting a change on deleting any skill units when we're
- logging off - might reduce the 'delete_timer' errors [celest]
- * Added check whether an item is allowed to be dropped, for example wedding
- rings [celest]
- * Updated Acid Terror - should never miss [celest]
- * updated Sword Reject - should display reflected damage properly now [celest]
- * Updated Double Strafe - should only work with bows [celest]
- * Replaced checking whether items can be refined or not with a new function [celest]
- * Added Gengar's fix for npctalk outputting to chat [celest]
- * Allowed some values in script_config to be customised in script_athena.conf [celest]
-
-12/19
- * Added -DFASTCHAR to char_sql for testing performance work
- before I merge it into the main running code [MouseJstr]
- * Added ShowDebug(), Debug(), DisplayDebug(), printDebug(), CL_DEBUG, MSG_DEBUG to _ShowMessage() [MC Cameri]
- * Replaced many \033[x;xm with their corresponding CL_xx constants [MC Cameri]
- * Separated NPCs and Maps from map_athena.conf into npcs_list.txt and maps_list.conf [MC Cameri]
- * Modified all the *_athena.conf's to have the import command enabled by default [Ajarn]
- * Added charcommand_conf.txt and log_conf.txt in conf-tmpl/import [Ajarn]
- * Fixed import command for log_athena.conf file [Ajarn]
- * Updated charcommand.conf [nsstrunks]
-
-12/18
- * Added some of my info to Dev/quotes.txt, not done yet... [Ajarn]
- * Added some ideas to Dev/Ideas_Suggestions.txt [Ajarn]
- * Fixed import command in inter_athena.conf file [Ajarn]
- * Fixed a few command compiling problems for TXT [Codemaster]
- * Modified the main.sql to add the friend0 column; also added the upgrade_1.0.0.sql file [Codemaster]
- * Introduced StringBuf into utils for use in building larger queries [MouseJstr]
- * tested GUILD_CACHE (reducing guild related sql traffic to 30%) in
- prep for unleasing it on the sql using public [MouseJstr]
- * Fixed some SQL queries crashing char server [davidsiaw]
- * Added several PID GM commands, thanks to Dino9021 [nsstrunks]
- * Storage was merging items incorrectly [Mousejstr]
- * eliminated a uninitialized var when using afm maps [MouseJstr]
- * Added concept of dirty storage to reduce saves/load
- to the char server (do a clean build!) [MouseJstr]
- * Eliminated storage_storageopen2 as unused [MouseJstr]
- * Switched to account2storage2() whenever possible
- to eliminate the possibility of saving empty storage
- back to the character server (storage wipes) [MouseJstr]
- * Made it save storage as soon as you close the storage
- window to reduce possibility of loss/abuse [MouseJstr]
-
-12/17
- * Added #item [MC Cameri]
- * Added #storagelist, removed @charstoragelist [MC Cameri]
- * db.c: Fixed probs with OnInit, OnTime, and etc NPC probs
- Just reverted it back. [Lupus]
- * Fixed warning message in db.c line 445 [MC Cameri]
- * Added #effect, removed @chareffect [MC Cameri]
- * Reverted a change in map.c causing problems, sorry >.< [celest]
- * Updated Sphere Mine - it'll now move in the opposite direction if
- being hit by its master [celest]
- * Updated Wind Walk [celest]
- * Fixed skill #301 causing crashes [MouseJstr]
- * Fixed documentation error on gm_skills_unconditionl [MouseJstr]
- * added @grind test command.. only for testing [MouseJstr]
- * Added clearweather to the atcommand configuration file. [nsstrunks]
-
-12/16
- * Added a fix for AFM loading, thanks to Pete [celest]
- * Updated maximum levels for supernovice to 99 [celest]
- * Updated supernovice jobexp table - should be same from 50 onwards [celest]
- * Corrected maximum job level checking in @joblvup and @charjob [celest]
- * Added the new spell scrolls, thanks to Landarma [celest]
- * Corrected a few skills, thanks to orn [celest]
- * Corrected Extremity Fist to not require Explosion Spirits when being used
- right after using Combo Finish or Dilemma [celest]
- * Added instant cast weapon skills rely on attack speed as cast delays, not
- on dex [celest]
- * Fixed mob_ghostring_fix not working [celest]
- * Changed default value for mob_ghostring_fix to 'yes' [celest]
- * Added #itemlist, removed @charitemlist [MC Cameri]
- * Changed @job and #job so that when it's used it unequips all the items, to prevent sprite errors [MC Cameri]
- * Fixed a misuse of mysql_config (thanks Daegalus for
- creating a reproducable environment for me) [MouseJstr]
- * Fixed compile time errors for gcc 2.95 [MouseJstr]
- * Updated Forging and Potion making formulas by DracoRPG [celest]
- * Changes to the guild skills
- - Dropped using sc_data and use flag values instead
- - Changed moving guild skill units to once every 'move request' only instead
- of every movement - should reduce server load abit
- - Corrected crash when checking its skill requirements
- * Initialise 'canregen' when logging into map - forgot to add this earlier,
- sorry ^^; [celest]
-
-12/15
- * Fixed more compile errors gcc 2.95 [MouseJstr]
- * Removed log files from svn... they will be created when
- needed [MouseJstr]
- * Removed unused var in src/map/map.c:107 [MouseJstr]
- * fix compile error in text converters [MouseJstr]
- * Skill Updates [celest]
- - Corrected traps to last longer in GvG
- - Some minor changes to Hiding, Cloaking and Chasewalk to prevent it from
- not working if sc_data is null
- - Corrected an error in Cannibalize
- - Updated Marionette Control to check its range from the partner
- - Updated Berserk to disable hp and sp regen for 5 minutes after the skill
- * Changed the weather gm commands to be able to toggle on and off. For example,
- use @snow once to turn it on, reuse it again to turn it off. [celest]
- * Added Jawaii and Ayothaya to @go list [celest]
- * Changed the default values for ranged, magic and misc damage rate in
- battle_athena to 60, 50 and 60 [celest]
- * Removed redundant 'berserkdamagetick' from map_session_data [celest]
- * Added changes to map.h according to Shinomori [celest]
-
-12/14
- * Changed "Map-server can't connect to char-server" message to reduce output spamming and set it to
- display only once [MC Cameri]
- * Added a busy animation for npc loading [MC Cameri]
- * Replaced the way map loading was displayed into a progress-like way [MC Cameri]
- * Fixed some typos in _ShowMessage() [MC Cameri]
- * Replaced lots of more printf's in map-server with _ShowMessage() [MC Cameri]
- * Added constants for console colors in showmsg.h [MC Cameri]
- * src/char_sql/int_guild.c:56 - t_mes2 was not big enough causing
- stack overrun's, corruptions, and crashes [MouseJstr]
- * common/mmo.h: changed base_level and job_level to unsigned int to increase max levels [Codemaster]
- * char/char.c: added a NULL check for the file in parse_friend_txt [Codemaster]
- * map/atcommand.c/.h: added @clearweather (thanks to Dexity) [Codemaster]
- * map/charcommand.c/.h: added #spiritball [Codemaster]
- * map/mob.c: fixed a compiler warning (ln was an int and was supposed to be an unsigned long int) [Codemaster]
- * Added nullpo_retb to nullpo.c - does a break; if null [celest]
- * Replaced some parts in skill.c with nullpo checks [celest]
- * Corrected some typos - penaly -> penalty [celest]
- * Skill Updates [celest]
- - Most of 12/14's Sakray patch
- * The SKILL_MAX_DB (yes, a different #define from the one below)
- was not large enough for current skills causing memory
- corruptions and crashes [MouseJstr]
- * Fixed how socket handles EAGIN errors (retry instead of
- disconnecting) [MouseJstr]
-
-12/13
- * Skill Updates [celest]
- - Added the new 'Throw Tomahawk' skill (Requires Sakexe1129 or newer)
- - Added some new monster skills - but still not complete.
- - Adjusted Palm Strike, Tiger Fist and Chain Crush based on 12/14's patch
- * Removed redundant 'sg_count' for map_session_data and mob_data [celest]
- * Save both persons' data after trading in case a crash causes them to
- rollback - fix by Freya [celest]
- * Removed 'type' paramater from pc_unequipitem to use 'flag' instead[celest]
- * Moved unequip checking code from clif.c to pc.c [celest]
- * Replaced many printf's in map-server with _ShowMessage(). [MC Cameri]
- * Skill timers for skills with id's higher then 450 were
- corrupting memory [MouseJstr]
- * Increased max skills to 650 from 450 fixing MANY crashes [MouseJstr]
- * Creating Guild events were reading beyond supplied guild names ,
- causing crashes [MouseJstr]
- * trades were derefing -2 into the inventory table sometimes [MouseJstr]
- * Not having a arrow in your inventory but having a bow
- could cause it to set sd->status.inventory[-1].equip=32768
- resulting in a memory corruption [MouseJstr]
- * local broadcasts of messages larger then 64 bytes were
- corrupting the stack, causing crashes [MouseJstr]
- * mob eventnames were reading beyond source point, risking
- going over page boundries, causing crashes [MouseJstr]
- * Internal MAIL system: moved all strings to msg_athena.conf [Lupus]
-
-12/12
- * Made guild skills to check for skill levels first when casting [celest]
-
-12/11
- * Modified arrow checking in skill.c [celest]
- * Corrected Cart Revolution damage calculation [celest]
-
-12/10
- * Fixed players unable to move in AFM maps [celest]
- * Added error message if a player's last map couldn't be found [celest]
- * Moved AFM map check to map_mapname2mapid [celest]
- * Added USE_AFM and USE_AF2 to be used later [celest]
- * Modified sc_data check in pc_damage [celest]
-
-12/9
- * Moved a map_freeblock_unlock() around to eliminate a
- crash [MouseJstr]
- * Fixed how players are cleaned up when they disconnected
- during authentication [MouseJstr]
- * Adjusted some messages in @marry [MouseJstr]
- * Skill Updates [celest]
- - Fixed Auto Spell not working
- - Fixed skill level check causing Baphomet card not to work at all (possibly
- other problems too)
- - Added some new monster skills based on jA mod 1077
- * Changed @job to accept text job names - For example: @job wizard, @job high
- priestess, @job super baby [celest]
- * Added sc_data check for pc_damage [celest]
-
-12/8
- * Fixed @rings [MouseJstr]
- * Added @marry, @divorce, and @rings [MouseJstr]
- * fixed @revive [MouseJstr]
- * Added option to turn off login server logging [celest]
- * Moved char server starting logging to after we've read the configuration
- file first [celest]
- * Fixed crash with supernovices with 100% base exp [celest]
- * Updated the readme a little. [Mass Zero]
-
-12/7
- * Added GUILDCACHE #define to int_guild.c for testing performance
- effects [MouseJstr]
- * Skill Updates [celest]
- - Arrow Shower, Double Strafing, Charge Arrow, Throw Arrow, Sharp Shooting,
- Arrow Vulcan, and Musical Strike now take arrows when used
- - Level 6-10 Stone Curse will not consume a red gem now when it fails
- - Players should be able to use items when they're stoned but not yet
- completely petrified
- - Corrected Triple Blow to work with bows (they actually do ^^)
- * Added 'guildgetexp' script command [celest]
- * Added bLongAtkRate item effect [celest]
- * Implemented Confusion (50%) - still need more info on how monsters act
- when they're confused [celest]
- * Added 'Guardian Angel' code for supernovices [celest]
-
-12/6
- * Fixed file props for new npcs [MouseJstr]
- * Fixed weddings.txt as per Fress_Boy [MouseJstr]
- * Added a case_sensitive to login [MouseJstr]
- * Fixed follow crashing server when gm dies [MouseJstr]
- * Fixed global message not working on txt [Wizputer]
- * fixed a server crash in mobinsite [MouseJstr]
- * fixed a server crash in party sharing exp [MouseJstr]
- * fixed a server crash in BS_FINDINGORE [MouseJstr]
- * Updated Chase Walk [celest]
- * Added 'checkoption1' and 'checkoption2' script functions - Refer to
- /npc/sample/npc_testchkoption.txt for similiar examples [celest]
- * Updated maximum level for Guild Skills [celest]
-
-12/5
- * Fixed another crash sending updates to disconnected
- clients [MouseJstr]
- * Fixed the range_check again to stop it from crashing
- servers [MouseJstr]
- * removed stubbed out unfinished atcommands as per Cameri [MouseJstr]
- * Fixed nullpo's for gcc 2.95 [MouseJstr]
- * Fixed bug in which login-txt was crashing in do_final() due to some free's [MC Cameri]
- * Added nullpo's to all atcommand's functions, phew... [MC Cameri]
- Note: I point out that MouseJstr has added some @commands that start with char which
- havent been finished, they are just there but don't do anything.
- * Removed mapbug.txt and corresponding function in map.c (realized it's pointless) [MC Cameri]
- * Added allow_atcommand_when_mute - Change this to set whether muted players
- can use gm commands [celest]
- * Temporarily leaving the changing guild emblems requiring Glory of Guild
- feature only for TXT until the SQL char-server supports guild skills fully[celest]
- * Modified battle_range again to check if src's type is a player first [celest]
- * Corrected typo in battle_range [celest]
- * Fixed a crash where party chats can be sent to a
- partially disconnected player [MouseJstr]
-
-12/4
- * Fixed a crash in clif_send when player disconnects but player
- object is not fully removed from map [MouseJstr]
- * Fixed a crash associated with NPC_BARRIER [MouseJstr]
- * Renamed flush_fifos_at_exit to flush_fifos [MouseJstr]
- * call check_connect_char_server() on char_server disconnect [MouseJstr]
- * stale skill groups were crashing server [MouseJstr]
- * Fixed crash in SC_LULLABY [MouseJstr]
-12/3
- * hacked the frozen mob issue [MouseJstr]
- * Fixed a battle_range crash [MouseJstr]
- * Updated Stone Curse, Soul Drain, Auto Berserk [celest]
- * Added a fix for MVP exp being multiplied twice by Gengar
- * Modified battle_range to check for sd first [celest]
-
-12/2
- * Fixed double login feature, resets online users when map connects to char [Wizputer]
- * Changed all LOGS inserts to INSERT DELAYED (MySQL has this feature and cache unimportant queries, then
- executes them at once together = 10x faster) [Lupus]
- * Skill Updates [celest]
- - Modified Weapon Refine - should only +1 every time.
- - Updated Berserk, Chase Walk, Slim Pitcher
- - Added skill_range_leniency : In some cases when moving to cast a skill the
- exe will a send a UseSkill packet before the server has moved us to the
- correct position, causing it to fail. Leaving this at 1 should be enough.
- - Fixed a bug that was causing monsters not to move towards the target
- * Added check for clif.c in case the server didn't realise we've died [celest]
- * Added a fix for @npcmove by JohnC and Fredzilla
- * Added motd_type : Set this to 1 if your clients have langtype problems and
- can't display the motd properly[celest]
- * Edited atcommand.c to fix compile warnings [celest]
-
-12/1
- - Make it build against gcc 2.95 [MouseJstr]
- - Changed #define MAX_PET_DB to 300, it's easier for people adding new pets like this. [Nas]
- * Skill Updates [celest]
- - Updated Poison React
- - Added Soul Change, Soul Burn
- - Added a somewhat crude timer for Venom splasher
- - Added a fix for Guild Skills causing crashes by Sara, thanks!
-
-11/30
- * Fixed client crash when disguised characters die [celest]
- * Skill Updates [celest]
- - Fixed and finished Guild Skills (~90%)
- - Fixed Meltdown and Overthrust used together breaking your own weapon
- - Updated Weapon Repair :- uses different materials depending on repaired item
- (Iron Ore/Iron/Steel/Rough Oridecon)
- - Fixed sp recovery problem, thanks to OutSider for pointing it out
- - Updated Tiger Knuckle Fist stun time
- - Added cooldown time for Emergency Recall
- - Fixed typo in skill.c, thanks to Toster
-
-11/29
- * Fixed crash in src/char_sql/char.c when setting chars offline [MouseJstr]
- * Added mapbug.txt which is displayed in map-server, displays
- the last bug or w/e fixed for the map-server [MC Cameri]
- -You may change it whenever you want
- -It will only show if mapbug.txt exists
- -This file must not be included in releases
- * Made some changes in map_versionscreen() to make it easier to
- read/change in the source [MC Cameri]
- * Fixed a typo in _ShowMessage() removing the message caption. [MC Cameri]
- * Fixed typo in map_helpscreen() showing -h instead of --?. [MC Cameri]
- * Added more sc_data checks in skill.c and pc.c [celest]
- * Updated Quagmire, Enchant Deadly Poison, Fog Wall [celest]
-
-11/28
- * Fixed a crash in login_sql/login.c [MouseJstr]
- * made common/socket.c more crash resistant [MouseJstr]
- * Added flush_fifos to socket.c so that we can make sure everything
- has been sent before we shut the process down [MouseJstr]
- * Modified src/char_sql/char.c to flush fifos on exit [MouseJstr]
- * Fixed a crash in src/map/map.c shutdown where it would
- use the char_fd session after it was alrady cleaned up [MouseJstr]
- * removed conf-templ/atcommand_athena.conf.orig [MouseJstr]
- * removed a USE from sql-files/main.sql that should not be there [MouseJstr]
- * Changed MSG_INFO color to bright white, since bright blue want so bright... [MC Cameri]
- * Made Map Removed: %d string be displayed only if there were maps removed. [MC Cameri]
- * Fixed online system for char not sending players left "online" to login when restarting [Wizputer]
- * Fixed damage formula of Cart revolution: 150% +1% per 80ea [Lupus]
- * Removed 2x Chance of Equipment Breaking during CRITICAL attacks [Lupus]
- * Fix some file props [MouseJstr]
- * Added map_versionscreen(), displayed when --version flag is passed on command-line. [MC Cameri]
- * Finished map_helpscreen(), displayed when --help flag passed on command-line. [MC Cameri]
- * Changed Guilds Extention Skill to +6 people per level. [Lupus]
- (tested it for 2 weeks! or a big server)
- * Added a fix for gettimeofday() for WIN32 [Codemaster]
- * skill Updates:
- - Updated Slow Poison, modified checks for skill_unit_onplace abit. [celest]
- - Updated Finger Offensive, thanks to orn [celest]
- * Updated packet_ver_flag's default value, thanks to iscandium [celest]
- * Added warning if motd.txt was not found [celest]
- (Turn on error_log in battle_athena.conf to enable it)
-
-11/27
- * Fixed a few map crashes when char-server crashes [Wizputer]
- * Added fix of 0x2aff and 0x2af8 flooding [Wizputer - thanks Toster]
- * Fixed Map crash when person uses global message hacks [Wizputer]
- * Fixed online system, online column works and prevent double login at the login server [Wizputer]
- * Fixed some compile time errors associated with showmsg [MouseJstr]
- * Added get_svn_revision() in core.c [MC Cameri]
- -Only if you have the file .svn\entries, it will show the revision # at runtime.
-
-11/26
- * Fixed Abrakadabra (2 minor bugs of consumed items - they were ignored if placed in 0 pos) [Lupus]
- * Finished Full Strip, Weapon Refine, Slim Pitcher and Full Protection. [celest]
- * Added skill_nocast_db.txt. Use it to set which skills cannot be used in
- which conditions [celest]
-
-11/25
- * Added @skilltree to help GM's answer skill tree questions [MouseJstr]
- * Update Spider Web; I believe you cannot use it on yourself now. [Codemaster]
- * Added Ore Discovery, and base code for Slim Pitcher and Preservation [celest]
-
-11/24
- * @charreset #reset [MC Cameri]
- * @charstatsall is now #statsall [MC Cameri]
- * @charsave is now #save [MC Cameri]
- * Updated most of jA's 1067; battle.c and skill.c might need more updates! [Codemaster]
- * Fixed char-txt crashing when closing, Codemaster free()'s. [MC Cameri]
- * Skill Updates: [celest]
- - Updated guild skills (60%)
- - updated Weapon Repair and Aura Blade by DracoRPG
- - modified Weapon Repair to use Identify's packet, should show a list of
- repairable items now
-
-11/23
- * Fixed script loading small/large monsters. [Valaris]
- * @charoption is now #option [MC Cameri]
- * @charpetfriendly is now #petfriendly [MC Cameri]
- * @charstats is now #stats [MC Cameri]
- * Skill Updates: [celest]
- - Added some code for the new guild skills (50%) and Moonlit Petals (5%)
- - Notes to other devs: Guild skills with id's 10000-10014 will be stored in
- skill_db[500-514]
- - Corrected Hilt Binding
- - Corrected Assassin Cross' dual wield
- - Changed player_cloak_check_type to yes by default and edited description
- since it's already fully implemented.
- - Added a bit more restrictions to Call Partner and Emergency Recall and
- updated mapflag for sec_pri.gat
- - Added pc_calcspeed and updated Cloaking so it won't need to recalculate
- the player's entire status everytime there is movement.
-
-11/22
- * (TXT)Stripped some code off read_gm_accounts() and made with it addGM() [MC Cameri]
- -Usage: addGM(account_id,level);
- * (TXT)Changed GM_accounts.txt to meet new standards. [MC Cameri]
- * (TXT)Enabled the use of id ranges in GM_accounts.txt [MC Cameri]
- * Added a few free()'s so that I am sure it freed the allocated memory (char & login) [Codemaster]
- * Changed monsters_ignore_gm option to a level value. [Valaris]
- (accounts greater than or equal to this setting won't be attacked by aggressives.)
- * Fixed mapflag #s and constants for setmapflag and remove mapflag. [Valaris]
- * Added skill names for kRO 11/23's new skills [celest]
- - Preserve, Full Strip, Weapon Refine, Slim Pitcher, Full Chemical Protection,
- (Throw) Tomahawk
- * timer.c static int timer_heap_max=0; //fix by Shinomori from eA forums
- ititialize static var!!!
- * Added the old effect list # into effect_list.txt of spira's. [shadow]
- * Added new flag (#3) to clif_specialeffect [MC Cameri]
- * @doom,@die,@doommap now display the Dark Cross effect on you. [MC Cameri]
-11/21
- * Display IP when wdata is expanded [Wizputer]
- * Added bClassChange,%; Has random chance to turn monster into another monster. [Valaris]
- * Re-Fixed Trade/Vending exploit [Lupus]
- * Fixed @whozeny. [Valaris]
- * Added rest of mapflags to const.txt. [Valaris]
- * Closed AFM files after reading, this fixed the improper char-server session #. [Valaris]
- * Skill updates: [Celest]
- - Updated Basilica, Sharp Shooting, Berserk, Meditatio (Thanks to DracoRPG!)
- - Fixed a typo with Blade Stop that was causing crashes, sorry. ^^;
- - Reverted changes to Cloaking, ours is already more updated! ^_^
- - Added temporary code for guild skills to stop crashing
- * @alive, @raisemap, @raise, @revive now display the resurrection skill animation [MC Cameri]
- * @charpetrename(AtCommand) is now #petrename(CharCommand) [MC Cameri]
- * @charjob/(AtCommand) is now #jobchange(CharCommand) [MC Cameri]
- * Removed japanese interserver packets, should fix various problems (jumpto, where, charposreq). [Valaris]
- * Added Yor's trade exploit bug fix. Added 2 skills bugs in the bugs.txt [Lupus]
- * Added charcommand.c/.h for the following reasons: [MC Cameri]
- - Less congestion in atcommand.c
- - Port commands that start with @char to #, example:
- ~ @charoption will now be #option
-
-11/20
- * Added str_lower() function to atcommand.c (from OA). [MC Cameri]
- * Simplified @charchangesex to @charchangesex [player], your sex is changed to the opposite one [MC Cameri]
- * Added @refresh, which is like a @jumpto <<yourself>>. [MC Cameri]
- * Added @petid <pet name> to find pet names, useful when you dont know which pets have eggs. [MC Cameri]
- * Added an effect_list in docs/ for descriptions, free to add onto that later. [spira]
- - Attempt to find new skill effects.
- * Added "nogo" mapflag to prevent the use of @go on a specified map. [Valaris]
- * Fixed small/big monster spawning crashing (mixed up the merge). [Valaris]
- * Fixed crash with upgrading TXT and having more than 256 accounts. [Valaris]
- * TXT upgrades will convert broken flag to attribute column. [Valaris]
- * Prevent use of emotion packet to display red mute emote. [Valaris]
- * Initialized "day" variable in npc.c. [Valaris]
- * Added @whozeny. Shows list of top 50 online players and their zeny sorted from highest to lowest. [Valaris]
- * Added @happyhappyjoyjoy. Makes all players on server do a random emote. [Valaris]
- * Removed -funroll-loops from compile, thanks to kashy for pointing out the problems caused by this. (Do not re-add!) [Valaris]
- * Added check for max vending_max_value when reading config [kobra_k88]
- * Skill updates [celest]
- - Napalm vulcan, Enchant Deadly Poison, Slow Poison (based on jAthena 1066)
- - Create Deadly Poison, thanks to DracoRPG!
- - Added effect for Meteor Assault
- * Added night_darkness_level to battle_athena.conf. [celest]
- Use this to set 'how dark' it'll become during night time. Use 0 for default,
- or between 1-10. (Yeah, i know lots of people hated the original night! xP)
- Warning: It may cause errors with old exe's!
-
-11/19
- * Re-added check for empty bottle when using aqua benedicta. [Valaris]
- * Fixed skills not showing after using @allskill [celest]
-
-11/18
- * Added a line to @unmute, added @mute. [celest]
- Usage: @mute <time in minutes> <character name>
- * Added save_flag for skill_status_change_start [celest]
- * Fixed muting not being saved when you quit/change characters/log off [celest]
- * *Hopefully* fixed the skill tree problem where you have to use 49 skill
- points first before 2nd job skills will show... please report any bugs found
- with it, thank you. [celest]
- * Added flag to pc_unequipitem (thanks to DracoRPG for suggestion) [celest]
- * Skill updates [celest]
- - Updated Cloaking (thanks to orn), Endure
- - Pneuma (thanks to DracoRPG)
- - Changed sc_ id for Basilica
- - Cancel Basilica (100%) when caster moves or uses another skill
- - Updated Poison React (90%), Endure
- - Added SC_BLOCKSKILL, SC_SLOWDOWN
- * Modified pc_attack to fix monster npc's not working in certain exes, thanks
- to leinsirk10 [celest]
- * Moved mapflags organized by type to main mapflag folder and removed "type" folder.
- Removed mapflags organized by location.[kobra_k88]
-
-11/17
- * Added stub-handler for packet 0x3090 into char_sql [MouseJstr]
- * Fixed a crash in the afm reading/closing code [MouseJstr]
- * Added skill_steal_type to battle_athena.conf for the new (but unconfirmed)
- stealing formula [celest]
- * Skill updates: [celest]
- - Removed annoying skill fail messages from rogue's Snatcher
- - Add sc_data check for firewall and fogwall
- - Fixed Berserk (99% hopefully? ^_^)
-
-11/16
- * Fix for compiling against gcc 2.95 [MouseJstr]
- * Added day of week events (OnSat2000) into scripting engine [MouseJstr]
- * Temporarily Disabled GM Command Logs; Weren't working Properly >_<! [Codemaster]
- * Fixed a typo in ../db/Changelog.txt [Nana]
- * Added -funroll-loops argument to makefile to further increase performance [Shinigami]
- * Fixed 2 bugs in DELITEM script command. [Lupus]
- - added deleting priority: If you have some items with the same ID and want to delete some of them, then
- at first it'll delete common items then, if necessary, delete the rest items but upgraded/named/with cards. [Lupus]
- * Added checks for Perfect hiding [celest]
- * Modified level 0 skill check to allow auto blitz beat and steal. [celest]
- * Added constant BaseJob. [celest] Usage: For example, instead of
- If (Class==12) || (Class==4012) || (Class==4035)
- you can use
- If (BaseJob==12) or If (BaseJob==Job_Assassin)
- * Added 'indoors' mapflag : When in-doors players will not be affected by Night [celest]
- * Skill updates [celest]
- - Assumptio is now disabled in GvG maps.
- - Changed cloaking checks a bit.
- - Tidied up some parts of skill.c abit. ;P
- * Added pk_min_level option in battle_athena.conf. Change this to define the
- minimum level players can attack others when pk_mode is on. [celest]
-
-11/15
- * Added a Database Changelog.txt File, use it for any changes inside the db folder. [shadowlady]
- * Added GM Command Logs & Added TXT Logs + TXT Log Options [Codemaster]
- * Added spawning of monsters at specific level by adding ,# after the spawn name. [Valaris]
- mobs_level_up option should be on when using this.
- (Example: {ama_dun01.gat,0,0,0,0 monster Shinobi,99 1401,1,0,0,0} to spawn a level 99 shinobi.)
- * Added addtoskill script command for (levels can stack on top of existing levels). [Valaris]
- Use same usage as skill script command.
- * Added -ffast-math argument to makefile to increase performance, thanks to kashy. [Valaris]
- * Added small and big mob sprite spawning. [Valaris]
- -Added @monstersmall and @monsterbig commands.
- -For using in scripts, use id +2000 for small and id +4000 for big.
- (Example: 3002 for small poring and 5002 for big poring)
- * Added mobs_level_up option. [Valaris]
- -Everytime a monster kills a play their level will increase and show levelup animation.
- -Their 6 main stats and speed will increase as they level.
- -They will recover 10% of the max hp of the player it kills.
- -Player will gain extra exp based on how much stronger a monster is than normal.
- -Skill estimation will show monsters current level (instead of reading from db).
- -Will display level 99 aura if and when a monster hits level 99.
- -They will not go higher than level 99.
- * Fixed maximum skill levels not following skill tree [celest]
- * Updated HP/SP for baby classes [celest]
- * Corrected pc_calc_base_job [celest]
- * Skill updates [celest]
- - Marionette Control (70%), Berserk (thanks to DracoRPG)
- * Modified pc_jobchange code to work with new pc_calc_base_job [celest]
- * Corrected skill_tree_get_max, sorry >.< [celest]
-
-11/14
- * Made the Advance jobchangers to kRO standars with the following;
- - Checks if you are level 99/50 and 2nd class OR above.
- - Checks if you have an Cart of Falcon equiped.
- - Checks if you have any Quest Skills, stores a variable on you and gives them back
- when you change to 1st advance class.
- - Added minimum joblevel to change to an 2nd or 2-2 advance class to job 45 after kro. [Nana]
- * Fixed loading of AFMs when no resnametable is found. [Valaris]
- * mob_db.txt: Fixed Golden Thief Bug MVP MOB mode (it wasn't moving/attacking) [Lupus]
- * Added AFM (Advanced Fusion Map) support, thanks to alexkreuz and fusion. [Valaris]
- Use the afm_dir option in grf-files.txt (currently needs a resnametable.txt).
- * Initialized password variable in login.c. [Valaris]
- * Added zeny_from_mobs option. [Valaris]
- * Corrected the file type attribute on most of the files in three which fixes the
- newline issues between linux and dos [MouseJstr]
- svn propset -R svn:eol-style native .
- * Skill changes [celest]
- - Corrected steal formula, updated BladeStop, Headcrush.
-
-11/13
- * Fixed map-server loading, doesn't require data\resnametable.txt anymore [Wizputer]
- * Updated & Optimized TXT Login from FREYA. (need to do SQL now) [Codemaster]
- * Removed compile warnings in intif.c. [Valaris]
- * Fixed chrif_changesex and @changesex, now uses packet 0x3000. [MC Cameri]
- * Updated some skills, credits to orn and midas. [celest]
- - Magnum Break, Throw Stone, Sprinkle Sand, Magic Power, Memorise, Quagmire,
- Spider Web, Reject Sword, assassin's Dodge, Demonbane, Divine Protection.
- - Firewall, Quagmire, Fog Wall (100%), Marionette Control (30%), Sandman,
- Claymore Trap
- - Adjusted some mob skills for mod support.
- * Fixed weight increase when riding. [celest]
-
-11/12
- * added folder: /save-tmpl, removed folder /save
- * battle_athena.conf: Updated Packet Version Flags.
- * !!!Fixed Mobs Attacking!!!: Thanks for MagicalTux and Yor, I fixed the mobs attacking by using one of their files. [Codemaster]
- * Warps Update : Added ayothaya warps in ./npc/warps/ and in map_athena.conf [Nana]
-11/11
- * Skill Updates : (Need to revise skill_cast_db.txt for new updates)
- ( Sharp Shooting, Sword Reject, Chain Crush Combo, Tiger Knuckle Fist,
- Head Crush, Arrow Vulcan, HP COnversion) Thanks to DracoRPG.
- Fixed Devotion use requeriments. Thanks to Orn. [shadow]
-11/11
- * Corrected minor typo in item_db, and removed/commented out dupe items.[kobra_k88]
-
-11/10
-
- * Updated Sprout (Item #7193), Thin Trunk (Item #7186),
- Huge Leaf (Item #7198), and Rante Whip (Items #1956, #1957)
- - thanks to cheng - [Codemaster]
- * Updated Parasite (Mob #1500) Drops - thanks to cheng [Codemaster]
- * Updated Soft Grass Leaf (Item #7194) - thanks to cheng [Codemaster]
- * Added, Fixed & Updated ALOT of skills: [Codemaster]
- - Fire Pillar, Backstab, Grimtooth, Poison React, Falcon Assalt,
- Skin Tempering, Hilt Binding, Frost Nova, TEMPORARY fix for Create Deadly Poison,
- Enchant Deadly Poison, Endure, Sacrifice, Spider Web, Memorize,
- Hyper Spirit Sphere, Palm Strike, Sword Reject, Pressure, Magic Crasher,
- Amplify Magic Power, Napalm Vulcan, True Sight, Wind Walk, Aura Blade,
- Concentration, Cart Boost, Magic Power
- - Thanks goes to Celest, Midas, and DracoRPG!
- * Fixed spira's mistake in using the packet_len_table; no biggie ^_^ [Codemaster]
- * char/char.c & char_sql/char.c: Fixed start_armor and start_weapon - thanks to AppleGirl [Codemaster]
- * Added packetver 6 flag to makefile. [Valaris]
-
-11/09
- * mob_db.txt: Fixed Drake dropping the wrong card - thanks to roslen [Codemaster]
- * chat.c: Fixed multiple joins in a single chat - thanks to Alex14 and CHaNGeTe. [Codemaster]
- * clif.c: Fixed sitting. [spira]
- * - Fixed item 657 Job ID , 11/09 patch updates to item_db, Correct stats for item 5097
- - Added Unbreakable funcions to item_db armors/shields/garments/footgear [shadow]
- * Defined SO_REUSEPORT to allow the servers to re-use ports if server crashes [Wizputer]
-
-11/08
- * Added new script command: getMapXY(MapName$,MaxX,MapY,type,[CharName$]) by Lorky [Lupus]
- Get position for char/npc/pet/mob objects.
- * Attempted to fix the mob bug (still haven't :( ). Still updated mob.c/clif.c/chrif.c according to jA 1057. [Codemaster]
- * Fixed item_cardalbum.txt: Removed extra column which mad all albums empty [Lupus]
-11/07
- - Fixed a few npcs will start implementing new ones soon, have alot on paper, need to type them up. [Nasedo]
- * clif.c: Added a few things from jAthena 1057 [Codemaster]
- * Corrected some typos in item_db. Items 1143 and 1719 need to be re-checked.[kobra_k88]
- * Fixed compiling error in Map Server in which @repairall was using old broken system [Shinigami]
-
-11/06
- - Added missing items in item_db.txt and reorganised it.[Nasedo]
- - Fixed wrong coords for payon guild flags (it has the old map coords), fixed some weapon effects in item_db,
- updated the mob_db (90%+ done), added EP 5-9 mobs to mob_branch.txt and EP 6 cards to item_cardalbum.txt[shadowlady]
- * atcommand.c/.h,chrif.c/.h, added @changesex. [MC Cameri]
- * mob.c & clif.c: Added & Modified a few parts dealing with monsters and guilds [Codemaster]
- * mob.c: Re-did a few parts according to jA's 1057 version. [Codemaster]
-11/05
- * Fixed and redo optional Umbalian quests:
- - Wise Man Fabius' Umbalian Language Quest (you can learn Umbalian language in
- alternative way)
- - On speaking with Umbalian Chief about meaning of masks you activate Turban Thief Quest
- (For Sphinx Mask)
- * Fixed several bugs in Niflheim Piano Keys Quest (wrong variable name, missing CLOSE buttons)
- Zeny/Item Exploit in Niflhein Sairin NPC quest (should add similiar checks in every
- easy quests with expensive prizes to avoid exploits) [Lupus]
- * Revised and fixed all comodo,yuno,amatsu,gonryun,umbala mobs and drops. Also fixed mvp and woe mobs too [Shadowlady]
- * Fixed crash from guild skill point allocation, there seems to be a problem with guilds loading still. [Valaris]
- * Fixed committed typo in map_athena.conf, remove aria's dev npc (was giving errors preventing server startup). [Valaris]
-
-11/04
- * Added sara-chan's packet db with support for 11-1 [Valaris]
- * [alot of files >_<]: Changed connecting a bit, from oA source; it connected easier/better in my opinion so... [Codemaster]
- * map/skill.c: Added a few checks for level 0 skills being used. [Codemaster]
-
-11/03
- * Removed broken column, using attribute column for broken equip now. [Valaris]
-
-11/02
- * Fixed compile time errors for gcc 2.95 [MouseJstr]
- * Changed Blacksmith skill "Hammer Fall" to only be used with maces or Hammers [Aria]
-11/01
- * Set Comodo Kafra to warp to Umbala (11/2/04 patch) [Aria]
-10/31
- * Fixed Devnpcs giving off errors -_- [Aria]
- * Fixed showmsg.c compile warnings thanks to LittleWolf. [Valaris]
- * map/skill.c: removed a second declaration of sc_def_vit in skill_castend_nodamage_id; thanks to spira [Codemaster]
- * map/battle.c: re-did Water Ball's damage calculation [Codemaster]
-10/30
- * Added new guild skills to skill_db from sara-chan. [Valaris]
- * db/skill_cast_db, map/skill.c, map/pc.c: Corrected a few CHASEWALK things; Thanks to Celest [Codemaster]
- * char_sql/char.c: removed the double free()ing of gm_account [Codemaster]
- * Added check for c value in int_guild.c before dividing to calculate average level. [Valaris]
- * Commented unfinished dev npcs and added devnpc to map_athena. [Aria]
- * Removed item requirement of Aqua Benedicta (10/26 patch) [Aria]
- * Fixed some compiling error for Map-server [Shinigami]
- * Removed Rogue's backstab pushback effect (kRO style again) [Aria]
- * Changed requirement of Fire Pillar to fit kRO style; lv1-5 = no gem, but 6-10 = 1 gem. [Aria]
- * Added Mugendai's oA GUI support for map-server (previously not added) [davidsiaw]
- * Included Mugendai's oA GUI in the GUI folder [davidsiaw]
-
-10/29
- * another exploit fix for mult in script [MouseJstr]
- * Corrected mode for peco, condor mobs. Added custom mobs Easter Egg and Easter Bunny for easter egg event script.
- Corrected mysteltain card location, penomena card typo.[kobra_k88]
-10/28
- * Cloak Speed fixed [Aria]
- * Throw stone damage fixed [Aria]
- * Added new packets from Sara to packet database. [spira]
- * Fixed and changed command lists to reflect on new packet changes. [spira]
- - @jumpto, @recall, and @where
- - Removed old @ignore* functions because they are no longer needed.
- * Replaced old whisper ignoring code with better and more efficient code. [spira]
- * Added packet_db.txt support, removed old packet functions. [spira]
- * fixed forger-zeny exploit [MouseJstr]
-
- Doing script math that returns a number greater then (1<<31) will now
- return a (1<<31). This prevents you from finding a npc that
- asks for a quantity then mults the cost by that quantity to get
- what you need to pay.
-
-10/27
- * Updated CSS styles for readme a bit [Aria]
- * branched athena at version 340 to begin work on the packet_db
- stuff from jA. To retrieve it, do a svn co http://dev.deltaanime.net:8080/svn/eathena/packetdb
- later, once we are happy with it.. and feel it is stable, we will remerge it back into the main tree via the appropriate svn commands
- as a FYI, the command I used to create this branch was:
- svn copy http://dev.deltaanime.net:8080/svn/eathena/athena http://dev.deltaanime.net:8080/svn/eathena/packetdb -m "branch for packetdb work"
- * Fixed Aldebaran (gatekeeper conditions bugs and wrong Key ID). Fixed some typos in other cities [Lupus]
-
-10/26
- * Added more quotes -_- [Aria]
- * Modified a few things related to guild skills. I hope it doesn't interfere with anyone else's work, and isn't seen as bad. [Sara-chan]
- -Support for new guild skills, though they don't work yet. Added guild_skill_get_inf and guild_skill_get_max entries for them based on early info.
- -Changed guild_skillup functions based on japanese code, but for a good reason.
- It allows for guild skill trees, sort of. I made Kafra Contract and Guardian Research require Guild Approval, for instance.
- I think the first four new guild skill requirements are correct, at the least.
- I hope everything works alright, it's my first contribution to eA in quite some time and I'm rather rusty at programming of late.
- * Fixed compile errors in showmsg.c. [Sara-chan]
- * Fixed Mouse's devnpc only saying his quotes once per server reset [Aria]
- * Added log_athena.conf & the logs.sql file [Codemaster]
- * Added log configurations to inter_athena.conf [Codemaster]
-
-10/25
- * Fixed a compiling error in Login-server [Shinigami]
- * Added alot of Azndragon's spiffy logs & then added a few things of my own (Silly Dragon, structs are for kids!) [Codemaster]
- * Corrected a small bug (forgot to change a few variables!) in my different GM option. [Codemaster]
- * Fixed items and mobs in DB. Added new items. [Lupus]
- * Fixed some NPC bugs (check NPC=changelog.txt) [Lupus]
- * Fixed getting MAX PET ID (SQL only bug) [Lupus]
- * Fix char/char.c which was crashing after double freeing logs
- [MouseJstr]
- * Improved basic server rebooters [MC Cameri]
- * Commited common/showmsg.c/.h, previously missing x_X [MC Cameri]
- * Added a basic server rebooter program, just use 'runserver.bat' to start up the server. [Shinigami]
-
-10/24
- * Added files common/showmsg.c/.h which contain the function _ShowMessage(char *string, int flag) [MC Cameri]
- -Check showmsg.h to see how to use it.
- -This function is made to replace printf in all the cases, so it MUST be used instead of print from now on.
- -Begin your own journey of replacing/removing old printfs, and using the new function.
- -This function was previously called ShowMessage() in oA, it is now merged, some changes have been done:
- 1.Outputting messages to a file is now disabled(commented out).
- 2.MSG_SQL is now commented out.
- 3.If the server is out of memory, it will not use abort().
- 4.Returns 0 if successful, 1 otherwise.
- -Example: ShowInfo("hello\n"); will print this to the screen: [Info]: hello
- -Always add \n at the end. Unless someone edits the function to add the \n whether it exists or not.
- -Just add #include "showmsg.h" wherever you need it.
- * Edited ALL makefile's to include showmsg.o -> _ShowMessage(). [MC Cameri]
- * Updated readme/gmcommands.html with new @uptime command [MC Cameri]
- * Somebody had added some additional noskill checks that prevented
- vending from happening in prontera [MouseJstr]
- * Added bypass with gm_allskill of npc_selfdestruct2. [Valaris]
- * Corrected some minor bugs in some Quests [Shinigami]
- * Added new maps (from lateast kRO patch)
- Touched WOE (u can't surrender the castle during the WOE), misc fix of the bank [Lupus]
-10/23
- * Added the option to read GM accounts from a different table than login. Default set to login table. [Codemaster]
- * Finished Aria and MC Cameri "Dev edition" NPCs. [Aria]
- * Corrected extra stat points given to high classes. [Valaris]
- * Added high classes getting the extra 40 stat points on stat reset. [Valaris]
- * performance tweaks on socket.c to reduce lag [MouseJstr]
-
- do a "OPT="-g -DNSOCKET" to compile with the changes
- enabled.. and tell me if you notice a change in your
- performance/lag
-
- * Added @uptime to atcommand.c [MC Cameri]
- * Added the stuff for my npc to Dev/quotes.txt [MC Cameri]
-
-10/22
- * Replaced some checkcart and checkoption(x) with checkcart(0) in the guild folder [Aria]
- * Waiting for various devs to tell me their coords, map, biography, quotes,
- moving coords, etc. In the meantime, I replaced them with (x,y),(lols),
- (sprite),(somewhere), and if they didn't give me any info, I didn't
- add them yet =P. [Aria]
- * Added Davidsiaw, Shinigami, Lord, Codemaster, MouseJstr, MC Cameri, and Darkchild
- to "Dev edition" NPCs [Aria]
- * Revised "Dev edition" NPC layout a bit, should go smoother now. Should be final
- layout unless something goes wrong =O. [Aria]
- * Fixed the eol markers on some checked in files [Mousejstr]
- * Fix two crashes caused by calling isGM on mobs [MouseJstr]
- * Added folder "mc_cameri" in npc/other which contains my bank npc. [MC Cameri]
- * Changed "Dev edition" NPC layout so that they move by themselves by timers. [Aria]
- * Changed "Dev edition" NPCs to walk during quotes, and added biography. [Aria]
- * Fixed quest/all_quest.txt not showing the correct description of the binoculars. [Aria]
- * Fixed quest/all_quest.txt not going to stop pass and not displaying requirements. [Aria]
- * Fixed removing friends from the list [davidsiaw]
- * Added PCLoginEvent NPC (When a character logs on, NPC runs as if he/she clicked the NPC) [davidsiaw]
- The NPC sample is located in npc/sample/PCLoginEvent.txt (you only need one of these NPCs)
-
-10/21
- * Fixed clothes_dyer.txt: Disabled Assassing/Rogues Dye. Also fixed wrong labels [Lupus]
- * Fixed hair_dyer.txt: fixed missing menu label [Lupus]
- * new_hats.txt 1.4 fixed amount of Fish Tail (300 -> 30), Zeny bugs in Ear of Angel,
- Ear of Demon,Big Golden Bell, Mistress Crown,
- Crown of The Ancient Queen, Indian Headband, Orc Hero Helm [Lupus]
- * Fixed name of a flower in Prontera quest (Dreamy->Illusion) according to our DB [Lupus]
- * Fixed item names in the temp Crusader Job Quest according to our DB [Lupus]
-
-10/20
- * map/mob.c: Added mob_exclusion_add() & mob_exclusion_check() [Codemaster]
- * map/map.h: Changed Vending Struct: amount and value to unsigned variables (so they CAN'T be 0 or less) [Codemaster]
- * map/mob.h: Added mob_exclusion_add() & mob_exclusion_check() [Codemaster]
- * Aligned the list of commands at the beginning of atcommand.c,
- with tabs instead of spaces. [MC Cameri]
- * Fixed AtCommand_SetBattleFlag, it was previously being called by "@send"
- instead of "@setbattleflag". [MC Cameri]
- * Finished basic layout, finished Aria starting to create Shinigami [Aria]
- * Started to create "Dev edition" npcs [Aria]
- * Fixed a compile error in src/char/char.c [MouseJstr]
- * Fixed a bug in @trade where the distance was not ignored [MouseJstr]
- * Fixed a potential inf loop in pc.c when multi_level_up is set to no. [MouseJstr]
- * implemented Friends List support for TXT version [davidsiaw]
- * added queries in main.sql for Friends List. mySQL support for friends list pending [davidsiaw]
-10/19
- * switched login_sql/login.c to use binary when retrieving
- by account name [MouseJstr]
- * skill.c & skill.h: added skill_type_cloaking [Codemaster]
- * storage.c & storage.h: added storage_storageopen2() [Codemaster]
-10/18
- * Changed readme layout for 1.0 scheme. [Aria]
- * added check for console variable in login_sql [MouseJstr]
- * Fully translated the untranslated items in the database.sql for SQL. [Nana]
- * Dev/TODO, asigned myself to some items. [MC Cameri]
- * char/char.c: changed the online system to omniAthena's [Codemaster]
- * char/char.c: added log_char and log_inter [Codemaster]
- * char/char.c: added Mugendai's GUI Support [Codemaster]
- * char/int_guild.c: added log_inter and db_path [Codemaster]
- * char/inter.c: added log_inter [Codemaster]
- * char/char.c: added db_path [Codemaster]
- * char/inter.h: added log_inter [Codemaster]
- * char_sql/char.c: added log_char and log_inter [Codemaster]
- * char_sql/char.c: added Mugendai's GUI Support [Codemaster]
- * char_sql/int_guild.c: added log_inter and db_path [Codemaster]
- * char_sql/inter.c: added log_inter [Codemaster]
- * char_sql/char.c: added db_path [Codemaster]
- * char_sql/inter.h: added log_inter [Codemaster]
- * conf-tmpl/char_athena.conf: Added log_char & db_path [Codemaster]
- * conf-tmpl/inter_athena.conf: Added log_inter [Codemaster]
-
-10/18
- * clif.c,clif.h,map.h,npc.c,npc.h,script.c: Added NPC Walking. [Valaris]
- -npcspeed #; To change npc's walking speed.
- -npcwalkto x,y; Move an npc to a position (keep it less than area size, or sprite will glitch and disappear).
- -npcstop; Stops an npc's movement.
-
-10/17
- * Made the IP autodetection code work under a pure win32
- executable
- * Fixed the win32 build and made a src\map\Makefile.win32 to
- make it easier to do win32 builds of the map server
-
- src\common\utils.c src\common\utils.h src\common\grfio.c
- src\common\nullpo.h src\common\timer.c src\common\db.c
- src\common\socket.c src\common\core.c src\common\mmo.h
- src\common\socket.h src\map\script.c src\map\intif.c
- src\map\npc.c src\map\clif.c src\map\map.c src\map\clif.h
- src\map\chrif.c src\map\Makefile.win32
-
- * skill.c: Fixed noicewall flag. [Valaris]
- * battle.c: Battle calc weapon attack now checks to see if pc_breakweapon successfully broke the weapon then recalculates damage. [Valaris]
- * pc.c: Removed broken weapon and equip status, just unequips items again when broken. [Valaris]
- Removed useless code from pc_breakweapon and pc_breakarmor. [Valaris]
- * Added template for server control from the console [Wizputer]
- * conf-tmpl/login_athena.conf: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
- * login/login.c: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
- * login_sql/login.c: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
- * Usable GM commands from server console admin:<gm command>:<map of "GM"> <x> <y> [Wizputer]
- * Added server:shutdown to shutdown server and help [Wizputer]
- * Added user discretion for console commands in conf files [Wizputer]
-10/16
- * Fixed Umbala Language Quest, where a certain NPC would freeze you due to an unfinished script [Shinigami]
- * Fixed bug in new_hats.txt where free items are given out [Shinigami]
- * Correct Morroc warp npc overlaying Kafra npc. [Aria]
- * Corrected npc typos. [Aria]
- * Skip over npc_selfdestruction2 on allskillup (thanks to celest) [Valaris]
- * Fixed some typos in some of the NPCs [Shinigami]
- * tweaked the auto-configure stuff to deal better with
- machines that have no detectable IP addresses.. is this
- possible? [MouseJstr]
- src\char_sql\char.c src\char\char.c src\map\map.c
- * Made it compile under gcc 2.95 [MouseJstr]
- * made the char and map servers auto-configure their own IP's
- whenever possible [MouseJstr]
-
- If you do not specify the server IP address, it now determines it
- on its own. This means that to get a server running that is
- accessable from the internet you should only need to specify the
- location of the data.grf files. This eliminates one more point
- of misconfiguration.
-
- It does not correctly auto-configure for when you are behind a
- router or a firewall since there is no way of determining the
- external IP address. On the other hand, we should be able to
- eliminate the lan_conf file since we know our IP addresses as well
- as our netmask.
-10/15
- * added @setbattleflag to let me reset a battle_config at runtime [MouseJstr]
- * --- RC5 release
- * another fix to oA2eA-rc5.sql to fix the sell_price [MouseJstr]
- * Redid readme, updated content a bit, and made ps2 poster in preperation for 1.0 RC5 release. [Evera]
- * made MAX_HAIR_STYLE, MAX_HAIR_COLOR, and MAX_CLOTH_COLOR
- configurable via battle_config. [MouseJstr]
- * made the dex spell cast time scaling configurable via battle_config
- [MouseJstr]
- * made the visible area_size configurable via battle_config
- [MouseJstr]
- * Reorganized and added the warps into their respective folders, updated map_athena.conf. [Nana]
- * Added 2 script commands GETLOOK, GETSAVEPOINT (thanks to Lorky). [Lupus]
- * Added kafra_bank NPC - a new bank with daily interst of 0.1#%. [Lupus]
- * Changed cast time for champion soul collect to 1 sec (thanks to midas). [Valaris]
- * Added midas's fix for +30 hitrate with Sonic Blow. [Valaris]
-
-10/14
- * Fixed help.txt for some @gm commands [MouseJstr]
- * made login.c compile on gcc 2.95 [MouseJstr]
- * Fix backwards compatability with old mob skill formats [MouseJstr]
- * Added mail system commands and @refreshonline to help.txt. [Valaris]
- * Fixed char guild storage bug [MouseJstr]
- * Prevented breakage of Weapons/Armor if the respective Alchemist Chemical Protection skill is applied. [spira]
- * Added so nochat end will set manner to 0. [Valaris]
- * Added broken item check before breaking (to prevent an item from breaking more than once) [Valaris]
- * Re-wrote parts of equipment breaking. It will check to make sure it was not a miss before doing break calculations. [Valaris]
- * Re-added negative value exploit fix. [Valaris]
- * Fixed guardian opposition search. [Valaris]
- * Added @unmute. [Valaris]
- * Added check for map existing before cleanup (server will exit instead of crashing if maps aren't found). [Valaris]
-
-10/13
- * Fixed parse of antifreeze enable/disable flag. [Valaris]
- * Fixed end-of-line flags in source tree [MouseJstr]
-
-10/12
- * Prevent attack/skill usage while wearing tux/wedding dress. [Valaris]
- * Remove item unequip on tux/wedding equip. [Valaris]
-
-10/11
- * Added mail system (for SQL version only). [Valaris]
- - @checkmail
- - @listmail
- - @listnewmail
- - @readmail <#>
- - @deletemail <#>
- - @sendmail <name> <message>
- - @sendprioritymail <name> <message>
- - Added battle_athena.conf option to enable/disable mail system.
- - Added mail.sql for sql mail system.
- - Use "*" for name to send to all players. Level must be >= to @sendprioritymail level.
-
- * Added @refreshonline to refresh player online status in SQL version. [Valaris]
-
-10/10
- * Modified ja blacksmith repair code to function with our broken equipment system. [Valaris]
- * Removed ja repair script commands, they aren't compatible with our broken equipment. [Valaris]
- * Fixed error in Morroc jewel dealer. [Valaris]
- * Added so supernovices will get flee from improve dodge. [Valaris]
- * Fixed assassin and rogue flee bonus, was giving +50 instead of +40. [Valaris]
- * Fixed bug with using remove trap on a snared monsters and the monster would stay stuck. [Valaris]
- * Added a check for row return in an sql statement in login. [Valaris]
- * Added some pointer initializations in map.c. [Valaris]
- * Calculate pc status when equipping or unequipping pet items. [Valaris]
- * Fixed crash in looting pet skills if loot size was greater than 10. [Valaris]
-
-10/05
- * Fixed all mob spawn names (typos, errors, wrong names) according to the mob_db.txt [Lupus]
- * Added YggdrasilKid's fixed exp.txt. [valaris]
-
-10/04
- * Added missed close file functions in pc.c [Lupus]
- * Added some new items, fixed some item names and translated all grabled items in item_db.txt [Lupus]
- * Fixed bug in MOB_DB and in MOB_BRANCH DB related to wrong "Elder" ID number [Lupus]
- * Fixed toggle for using sql item db in char-server. [Valaris]
- * Added interval settings for anti-freeze system. [Valaris]
- * Added enable/disable options in char_athena.conf and login_athena.conf for anti-freeze system. [Valaris]
- * Re-added anti-freeze system. [Valaris]
- * Cleaned up warning in src/common/db.c. [MouseJstr]
- * Removed afm map checking from char. [Valaris]
- * npc.c - Re-enabled new "OnTouch" function. Added a missing line to npc_event in npc.c(line 667).
- pc.c - Added 2 missing "else" statements on (line 3702 and 3842). Now ontouch works correctly and activates
- everytime instead of only once like in RC4. [kobra_k88]
- * clif.c - Added: npc_scriptcont(sd,RFIFOL(fd,2)); to "void cliff_parse_NpcCloseClicked" function.
- Now "close2" script command works properly. Previously, it would freeze the server.[kobra_k88]
-
-10/03
- * added oA to eA database conversion .sql [MouseJstr]
- * renamed sql to sql-files to eliminate a problem with make [MouseJstr]
- * Fixed Assassin Quest where "Nameless One" NPC would freeze after clicking "next". [Shinigami]
- * charkillable now returns status on target [MouseJstr]
- * skill names now have descriptions pulled from the client [Mousejstr]
- * Mapflag "petals" has been changed to "sakura". [Valaris]
- * The weather @commands will now set that particular mapflag on until server is restarted, and will send weather effect
- to everyone on that map. It also will not allow the occurance of the command more than once. This method means
- everyone coming onto the map after the command has been used will see the effect. [Valaris]
- * Added yor's latest ladmin.c. [Valaris]
- * Fixed bug in delitem script command that caused it to delete all of an item. [Valaris]
- * Modified Makefile's to work better in non-sql environment [MouseJstr]
- * A lot of work on source tree making it more ANSI C compliant [MouseJstr]
- * Finalized the timers on shutdown
- turned off malloc debugging on db's. [MouseJstr]
- * Added release hook's into db's [MouseJstr]
- * Added runflag to core to allow cleaner shutdown [MouseJstr]
- * Work on LCCWIN32 for building under Windows natively [MouseJstr]
- * modified @mapexit to use runflag for cleaner shutdown [MouseJstr]
- * Improve cleanup on exit of map server of all objects [MouseJstr]
- * statpoint reader can now be larger then 1432 bytes [MouseJstr]
- * Fixed so dancing effect is cleared when warping. [Valaris]
-
-10/02
- * Modified battle config muting players option to work more effectively. [Valaris]
- * Fixed mute from showing red bubble to players. [Valaris]
- * Fixed disguise sprite staying when teleporting. [Valaris]
- * Added a special mob ai check in mob.c. [Valaris]
- * Fixed petit pet skill's damage from ever increasing. [Valaris]
- * Removed pet weight and pet loot options, someone re-added them, and this conflicts with pet skills. [Valaris]
- * Added new skills to mob_skill_db (skills for Alchemist summon marine sphere among others) [Valaris]
- * Updated skill_cast_db and skill_require_db for summon marine sphere and biocanniablize skills. [Valaris]
- * Fix for drops by luck crashing. [Valaris]
- * Removed @nuke for now. [Valaris]
- * Added japanese ankle snare code. [Valaris]
- * Using better code for alchemist marine sphere. [Valaris]
- * Reverted back to old method of OnTouch for now for compatibility with older scripts. [Valaris]
- * Fixed an infinite loop with preventing multi level up and high novices. [Valaris]
- * Storage saving in SQL was based on MAX_INVENTORY. Switched to MAX_STORAGE and MAX_GUILD_STORAGE. [Valaris]
- Should resolve items disappearing. Thanks to fov for pointing this out.
- * Updated skill_db entries for biocannibalize and summon marine sphere. [Valaris]
- * Changed sql item name row sizes to 24, and changed memory allocation to 25 bytes instead of 29. [Valaris]
- * Added upgrade_1.0.0-rc5_database.sql (will set name columns of item db to varchar(24). [Valaris]
- * Removed anti-freeze system. [Valaris]
- * Began removing AFM, unless someone wants to complete this. [Valaris]
- * Added an online status timer. Will check online status of players every hour (for sql version). [Valaris]
- * Added malloc to map.c. [Valaris]
- * Added some variables for new mob exclusion. [Valaris]
- * Using malloc in pc.c. [Valaris]
- * Added skill reset checks to high/advanced/baby classes. [Valaris]
-
-10/01
- * Fixed up const.db. [Valaris]
- - Added
- bBreakWeaponRate 1068
- bBreakArmorRate 1069
- bAddStealRate 1070
-
- - Fixed
- bMagicDamageReturn 1071
- bRandomAttackIncrease 1072
- bAllStats 1073
- bAgiVit 1074
- bAgiDexStr 1075
- bPerfectHide 1076
- bDisguise 1077
-
- * Rewrote mute disable option in clif.c, it did not need to end status. [Valaris]
- * Added a missing check for SC_NOCHAT in clif.c. [Valaris]
- * Changed comments on max_lv in battle_config to be less
- confusing [MouseJstr]
- * Fixed Gypsy Job Quest, added Crusader Job Quest [Lupus]
- * Adding missing noquests from previous tree [MouseJstr]
- * merged conf files between txt and sql [MouseJstr]
- * According to item_db.txt and mob_db.txt fixed some name differences, wrong item names in
- pet_db.txt,mob_branch.txt,item_violetbox.txt,item_giftbox.txt,item_cardalbum.txt [Lupus]
- * Added specialeffect2 script command. Works the same as specialeffect, but the effect will be applied
- to the player interacting with the npc instead of being applied on the npc. [Valaris]
- * Added hasitems script command. If a player has any items it will return 1 in an if statement. [Valaris]
- * Added npctalk script command. Syntax : npctalk "These are my words"; [Valaris]
- * Removed script::say in favor of Valaris's version. [MouseJstr]
- * Fixed a bug in guild alliances where it was treating a friend as a foe. [MouseJstr]
- * Fixed crash in weapon breaking. Was not doing a block type check on the source. [Valaris]
-
-
-09/29
- * Fixed small, almost non-existing memoryleak, in grfio.c that could
- cause some systems to exit the application [Kalaspuff]
-
-09/26
- (Dated On Aegis Website)
- *--Released 1.0.0 RC4--*
-09/25
- * Reorganized Npc folder for release
- * Updated map_athena.conf
- * Remove certain statuses when warping (Cloaking, Sitting, Gangster's Paradise) that would allow the effect to
- continue and a player to walk normally. [Valaris]
- * Remove speed increase of theif and high thief from improve dodge (only assassins and assassin cross's are
- supposed to get this bonus) [Valaris]
- * removed more #ifdef's between TXT and SQL [MouseJstr]
-09/24
-
- * Added @charkillable (to make players killable) [MouseJstr]
- * Added @dropall (throws all items on ground) [MouseJstr]
- * Added @chardropall (throws all players items on ground) [MouseJstr]
- * Added @storeall (put all items in store) [MouseJstr]
- * Added @charstoreall (put all players items in storage) [MouseJstr]
- * Added @skillid (look up a skill by name) [MouseJstr]
- * Added @useskill (use a skill by id) [MouseJstr]
-
-09/23
- * Update Some Npc Stuff In Payon [Darkchild]
- * Added Sage Quest [Darkchild]
- * added @killable - all players can hit you, even out of pvp [MouseJstr]
- * Changed Basilica to prevent the priest from walking [MouseJstr]
- * Restore base files in save directory [Yor]
- * Castle spawn/conquering fix: [Akaru]
- - Spawns monster when the guild is not owned when the server starts
- - Spawns emperium with the monsters when guild is not owned yet
- - If AgitStart and AgitEnd occurs while castle had not been owned, it is just ignored so that the monsters that are guarding the castle and the emperium would not be killed.
- - Prevent spawn of emperium/monsters after castle is owned
- - In short, you can clear and conquer the castle any time even when it's not agitstart'ed if the castle is unowned, like in official servers
-
-09/22
- * added @killer to let GM's hit players outside of pvp [MouseJstr]
- * added @skilloff to turn off skills on a map [MouseJstr]
- * added @skillon to turn on skills on a map [MouseJstr]
- * added @follow to follow players (including warping after them) [MouseJstr]
- * added battle_config option to control the max number of castles a guild can have [MouseJstr]
- * upgraded the guild alliance checker [MouseJstr]
- * added battle_config to control if ghosty armor works for mobs [MouseJstr]
- * Fixed battle_config to control how much GTB actually helps [MouseJstr]
- * Fixed battle_config to control if pvp battles give exp or drops [MouseJstr]
- * Added map aliasing [MouseJstr]
- * changed the map_nick2sd to be able to handle sub-strings for refering to players [MouseJstr]
- * made turning of skills on a map actually work [MouseJstr]
- * Updated Makefiles/GNUMakefiles to include the compilation of /common/malloc.o [PoW]
-
-09/19
- * Corrected @charstoragelist: [Yor]
- - because account2storage function create a void storage if it's not exist, somethimes a player could lost its storage.
- -> creation of account2storage2 to just ask pointer of storage if exist and use it in @charstoragelist.
- * Improved range system of @monster/@spawn (nearest of GM when less monsters) [Yor]
- * Client until 2004-09-06 (included) is now completely recognized [Yor]
- * Fixed kafra storage request for all new clients [Yor]
-
-09/18
- * Changed to Yor's code that doesn't try and read when it's already not found [Akaru]
- * Removed check for resnametable in data folder exit -> the resnametable isn't even used if present and it should be optional and not compulsory to have a resnametable in the data folder! [Akaru]
- * Added an option to choose which clients are accepted on the server (2nd part and finish: Check accepted versions) [Yor]
- * Added an option to choose which clients are accepted on the server (1st part: reading of the option) [Yor]
- * Fixed action request (sit, attack, etc..) for all new clients [Yor]
- * Fixed solve char name for all new clients [Yor]
- * Fixed get char name for all new clients [Yor]
- * Fixed an error about packet number on char name function [Yor]
- * Added items drop packet for all new clients [Yor]
- * Fixed: in clif_send (global send, not individual send) don't send a packet that client doesn't recognize [Yor]
-
-09/17
- * Added check to make sure mob is already moving before initiating random walk
- when the item they are going to loot disappears. [Valaris]
- * Client of 2004-07-13 is now completely recognized [Yor]
- * Fixed items take packet for all new clients [Yor]
- * Corrected packet sizes for each client version (not set packet size if packet doesn't exist) [Yor]
- * Fixed direction position for all new clients [Yor]
-
-09/16
- * Client of 2004-07-06 is now completely recognized [Yor]
- * Fixed skills to position with all new clients [Yor]
- * Fixed incomplete packet of authentification [Yor]
- * Fixed size of packets for all clients [Yor]
- * Improved detection of client version at authentification [Yor]
- * Improved packet parsing of client (search packet version before to parse) [Yor]
- * Added packets size of 0x20d and 0x20e [Yor]
-
-09/15
- * Added "nude" script command, will strip player of all equipment. Syntax : nude; [Valaris]
- * Removed sandstorm flag, since it does not work as intended (is not a constant effect like believed) [Valaris]
- * Added specialeffect script command. Syntax: specialeffect #; [Valaris]
- * Moved noicewall flag to a better position. [Valaris]
- * Added mob type check to skill_castfix to prevent crashing. [Valaris]
- * corrected error: skill to id (RFIFOW->RFIFOL) [Yor]
- * Added packets size of 0x204 and 0x20b [Yor]
- * Fixed skill_to_id with all new clients [Yor]
- * Fixed tick sending with all new clients [Yor]
- * Fixed items use with all new clients [Yor]
- * Fixed move with all new clients [Yor]
- * Speedup WantToConnect function [Yor]
- * Call correct function with any clients packet - size is not correctly set actually [Yor]
-
-09/14
- * Resetlvl will unequip items that require more than level 1. [Valaris]
- * Added message about new clients (not actually supported) [Yor]
- * Added correct call of clif_parse_WantToConnection function for all client types [Yor]
- * Added size of packet 0x0214 [Yor]
- * Fixed calls of 'clif_send' function [Yor]
-
-09/13
- * Modified item_db to have more name consistency, added more translations for items [Akaru]
- * Fixed in clif_sitting usage of a buffer [Yor]
- * Fixed in clif_movechar usage of a buffer for clif_set007b [Yor]
- * Fixed in clif_spawnpc usage of a buffer for clif_set0078 [Yor]
- * Corrected a commented printf in packet 0x2b0e for debug [Yor]
-
-09/12
- * Put (commented) parse printf in char.c at the right place (to have all informations) [Yor]
- * Added Alchemist JobQuest [Darkchild]
- * Added Inn Npcs [Darkchild]
-
-09/11
- * Added @charitemlist/@charstoragelist/@charcartlist GM commands to display items of a player [Yor]
-
-09/10
- * Added a better id control of monster id in @spawn/@monster... GM commands [Yor]
- * Correction of an error at reading of 'wisp_server_name' option (char.c) [Yor]
-
-09/09
- * Change @spawn/@monster2... GM commands to spawn in close area [Yor]
- * commented some printf in char.c to reduce (a little) lag [Yor]
- * Put @timer messages in msg_athena.conf [Yor]
- * Add a file for SQL developpers [Yor]
- * Changed name of newpacket variable of session (packet_ver) and add a message for nex client version [Yor]
- * Added new client packet sizes and expanded packet acception. [Valaris]
- * Added snow, fog, rain, leaves, petals, and sandstorm map flags. [Valaris]
-
-09/08
- * added clif_specialeffect to clif.c, for displaying a wide variety of effects (information from rofx) [Valaris]
- * Corrected in map: creation of new session before to delete previous session_data [Yor]
- * Corrected in login/char/ladmin: creation of new session before to delete previous session_data [Yor]
- * Prevented redeal dupe. Checks to make sure inventory index has not already been added (client prevents
- the possibility of stacking items, but server did not.) [Valaris]
-
-09/07
- * Added an option to determinate at which GM level nowarp and nowarpto flags are not more used [Yor]
- - new option in battle.conf: any_warp_GM_min_level
- - new checks and message about 'from' (nowarp) and 'to' (nowarpto) in GM commands
- * Third part of new authentification method (clif_parse_CloseKafra): ignore new 0xF7 [Yor]
- * Change name of new0x0072 variable by new_auth (because now, auth packet is 0x72 or 0x7E) [Yor]
- * Second part of new authentification method (clif_parse_WantToConnection): Auth by char-server of new packets resolved [Yor]
- * Improved check of new packet 0x7E to enter in WantToConnect Function [Yor]
-
-09/06
- * First part of new authentification method (clif_parse_WantToConnection) [Yor]
- - accepted new 0x7E for wantto connect
- - begin to found first authentificaiton and answer to client, but not found
- * Improved Char-server: [Yor]
- - Fixed a possible error on multi-map servers (no lastpoint)
- - Added log about character with same name of wisp server name.
- - Added a sub function to disconnect a player (used 3 times)
- * Improved. In global message, use buffer to send to other (avoid possible overwriting). [Yor]
- * Added Super Novice Job Quest [Darkchild]
-
-09/05
- * Fixed noskill flag to actually stop all usable skills when used. [AppleGirl]
- * Removed last lag on char-server causing by too much savings (on accreg) [Yor]
- * Removed a lag on char-server with a lot of players (for party, like guild) [Yor]
- * Removed a big lag on char-server with a lot of players: [Yor]
- - guilds was saved every time a player is online and a lot of other time (removed).
- - guilds are save only when characters are saved (no more bring forward with characters file, and less savings)
- * Added GM message that informs when a player blocks wisps of the server (against some bots that auto ignore wisps from a player) [Yor]
- * Added perfect GM hide in @where GM command [Yor on suggestion of PoW]
- * Correct NEW shops.txt with error displayed AT START of map-server! [Yor]
- * Correct NEW payon.txt that crash map-server AT START! [Yor]
- * More changes and official locations for new payon, things in correct place:
- - Guild Flags
- - Kafra
- - Shops/Refiners (except Pet Shop!)
- - Most Normal Npcs (not all!)
- All Based On ScreenShots From kRO!! [Darkchild]
- * Payon Warps about 80% finished, others were no screens taken from! [Darkchild]
- * Removed nowarp mapflag and new internal check about gmlevel [Yor]
- - gmlevel are checked before to call the function (of the GM comand). If you give gmlevel, people can use the function, including if you give level 0.
- if you want refuse some GM commands to normal players, set the level of the command with a value upper than 0 (of set GM_only_command option to yes).
- Not add new tests for nothing and use more cpu.
- - mapflag: no limit for GM commands: what'is the interest to have gm commands limited like player? (it's rule for all GM commands)
- A gm can have the possibility to go anywhere, specialy to check/control player ==> no mapflag!
- * Stopped client crashes when jobchanging into another class that doesn't support the weapon you are holding. [Valaris]
-
-09/04
- * Added nowarp mapflag [PoW]
- * Fixed nowarpto mapflag in atcommand.c [PoW]
- * Improved: On hack about name in global message, GM of ALL map-server received hack messages. [Yor]
- * Moved some GM messages of GM command from at_command.c to msg_athena.txt. [Yor]
- * Added @whogm GM command. [Yor]
- * Added a warning when a character has same name than wisp server name. [Yor]
-
-09/03
- * Added gm level display in all @who(map) GM command. [Yor]
- * Correction: [Yor] - Thanks to [EvilEden]
- - Soul Strike mistake (according to http://iro.ragnarokonline.com/game/jobmagskill.asp) - corrected cast time
- - npc/quests/monstertamers.txt: The Monster Tamer Shogo gives the Deviruchi 'Contracts in Shadow' (641) -> the Bapho Jr. Tamming Item 'Book_of_theDevil' (642).
- * Added monster/egg name to create egg in @makeegg GM command. [Yor]
- * Added an option to fix started limited time of a new account. [Yor]
- * Added @hatch in help.txt. [Yor]
- * Fixed ChaseWalk so now you can't use skills while in chase walk mode. [AppleGirl]
- * Fixed Looping of Broken Weapon if you continued to use it even after its broken [AppleGirl]
- * Updated Weapon Breaking So Now Icon Will Disappear when you unequip the broken item [AppleGirl]
- * Re-Added @hatch and added makepet to atcommand_athena.conf [Darkchild]
- * Moved job monsters to their respected files [Darkchild]
- * Fixed a bug in sence (showing wrong info!) [Darkchild]
- * Changed the npc/jobs/ folders heavily! [Darkchild]
- * Added COMPLETE Umbala NPC script [Darkchild]
- * Added New Payon maps @ bottom of the map_athena.conf [Darkchild]
- * Added New Payon NPCs and Warps [Darkchild]
- * Fixed typo and made layout a litle bit better of the readme files [Darkchild]
- * Added Items Ability to be unbreakable (using bonus bUnbreakable,100;) it will totally unbreakable
- any lower than a 100 it still has a chance of breaking but call it more durable ;p[AppleGirl]
- * Added Start_Weapon and Start_Armor to all the other starts in char_athena.conf [AppleGirl]
- * Updated skill_require_db and skill_cast_db.txt [AppleGirl]
- * Finish to add a (reserved) wisp name for server - part 3: in map-server replace name where server name is used for wisp [Yor]
- * Continue to add a (reserved) wisp name for server - part 2: in map-server, reception of the name [Yor]
- * Begin to add a (reserved) wisp name for server - part 1: in char-server [Yor]
-
-09/02
- * Added Meltdown's weapon breaking ability [AppleGirl]
- * Added GM level in front of each line to display only enable GM command of the help.txt. [Yor]
- * Removed message about limited time if your have unlimited account (that was for tests. sorry). [Yor]
- * Set day/night messages in msg_athena.conf (for foreign people). [Yor]
- * Added a function to return a string of msg_table outside of at_command. [Yor]
- * Fixed clean database at disconnect when session is not auth. [Yor]
- * Fixed a bug (but not solve the bug - need more research to found where solve it) in map_id2sd function. [Yor]
- * Set initialisation of ignore list after authentification (not need to be done before) [Yor]
- * Reduced size of packet 0x2afe (removed not used value) [Yor]
- * Improve first auth part (wanttoconnect) [Yor]
- * Added TODO 35 [Yor]
- * Made a few adjustments to Archer based class skills making more like normal classes instead of Uber Classes. [AppleGirl]
- * Updated the weapon and armor breaking to be more like official RO adding status icons and so on. [AppleGirl]
- * Updated a few skills based off a few sites, also fixed other skills that were coded incorrectly. [AppleGirl]
- * Fixed double connection with same account [Yor]
- - disconnect immediatly
- - no enter in database (block or others)
- - no creation of session
- - no more need to have 'new_fd'
- -> less memory usage, less tests
- * Removed 'other_fd' not used [Yor]
-
-09/01
- * Fixed Rainbow Egg quest in quests_lutie NPC [PoW]
- * Added packet length for client server-side friend list, if they choose add the client will not disconnect. [Valaris]
- Need to figure out the rest of the packets, then can implement.
- * Added server-side friend list 'add' send packet info to packet documentation. [Valaris]
- * Fixed: in chrif_authreq, don't send a request to char server if session is not found [Yor]
- * Fixed: amatsu.txt, when Carter Moores say: remove 10000 zeny, he removes them now! [Yor]
- * Removed an unknown item in shops.txt [Yor]
- * Fixed 3 goto in father - acolyte.txt [Yor]
- * Fixed bug with colors of 5 numbers/digits (warp to city instead of display with color) - wizard.txt [Yor]
- * Reduce size of mage.txt and fix a text in mes (no bug) [Yor]
- * Fixed thief.txt script (error on a goto) [Yor]
- * Fixed account length (WFIFOL(fd,2) instead of WFIFOW(fd,2)) when char-srv doesn't auth an account for map-srv (0x2afe packet) [Yor]
- * Added @job and @charjobchange to be similar with @charjob and @jobchange [Yor]
-
-08/31
- * Fixed messages of @(char)jobchange GM commands. [Yor]
- * Fixed a return value of jobchange function (pc.c). [Yor]
- * Added coredumps by system when crash. [Yor] - thanks MagicalTux
-
-08/30
- * Added some comments on gravity commands. [Yor]
- * Improved /mm, /monster and /item to have some answers. [Yor]
- * Modified skill_cast_db and skill.c to allow for status effect chance of wizard skills
- (stun for WZ_METEOR and blind for WZ_VERMILLION) [moonsoul]
- * Modified skill_cast_db and skill_db to properly reflect cast params and delay times for assassin cross
- skills Create Deadly Poison(407) and Soul Breaker(379) [moonsoul]
- * Added damage calcs to battle.c for Assassin Cross skill Soul Breaker(379) [moonsoul]
-
-08/29
- * Modified skill_require_db to reflect item requirements for assassin cross skills Create Deadly Poison(407)
- and Enchant Deadly Poison(378) [moonsoul]
- * Added @charmountpeco/@charpetrename/@charquestskill/@charlostskill GM commands. [Yor]
- * Added noicewall.txt to map_athena.conf (commented out), noicewall flag [Valaris]
- will not function when pvp is enabled on map.
- * Added noicewall flag, noicewall.txt. [Valaris]
- * Added wiz's temp fix for higher skill ids and skillnodex db. [Valaris]
- * Added: Usage of At command when failed (100%).
- * Modified: try to have samme presentation for all at-command code (100%).
- * Improved/fixed some GM commands [Yor]
- * Added some 'usages' in some GM commands [Yor]
- * Added baby classes to equipment codes, they will equip the same as their normal and advanced counter-parts. [Valaris]
- * Improved some GM commands [Yor]
- - Added in @(char)baselvlup/@(char)joblevelup GM command:
- When there are some status/skill points available and we reduce level -> remove points.
- - Added counter in @statsall GM command.
- - Fixed in @charsave GM command when map doesn't exist.
- - Fixed @charbaselvl GM command overflow
- - Fixed skill value (and crash) in @questskill/@lostskill GM command
- - Fixed number of spiritballs (@spiritball GM command)
- * Fixed random PvP crash bug [Lupus]
-
-08/28
- * Improved some GM commands [Yor]
- - Added memo points in @go GM commmand.
- - Added negativ value for @heal GM command.
- - Fixed @(6stat-adjustement) GM commands overflow.
- - Simplified @Statall GM commands.
- - Fixed @guildlvup GM commands.
-
-08/27
- * Fixed @(char)zeny/stpoint/skpoint GM commands (no more overflow, etc...) [Yor]
- * Improved @memo GM command: [Yor]
- You can memo anywhere (it's GM command, not /memo command like for any player).
- Without value, display actual memo points.
- * Improved @refine GM command: you can reduce refinement. [Yor]
- * Fixed @broadcast GM command send broadcast to all Map-servers. [Yor]
- * Fixed @(char)base/joblevelup command (any adjustement can be entered). [Yor]
-
-08/26
- * In at_command.c: [Yor]
- Fixed: initialisation of all strings.
- Added: Usage of At command when failed (75%).
- Modified: try to have samme presentation for all at-command code (75%).
- * Made it so that the pvp_nightmaredrop mapflag would work even without pvp being enabled, now works any time it is set. [Ancyker]
- * Added level check on /item and /monster. GM level must be >= both @monster and @item [Valaris]
- level specifications (both since they share the same packet)
- * Added my own extream mode map flags (disabled by default), makes players drop items at random everywhere (except towns). Full details in map_athena.conf. [Ancyker]
-
-08/25
- * Added: display usage when GM command failed (some GM commands) [Yor]
- * Added @email GM command to change your account e-mail [Yor]
-
-08/24
- * Modified changesex script command use same function as @charchangesex now [Yor]
- * Added @charchangesex GM command can be used on offline players [Yor]
- * Added gm ladmin command to change GM level of an account [Yor]
-
-08/23
- * Fixed some at_command messages: [yor]
- - remove all unused messages
- - create commented line of all messages in msg_athena.conf to have english, and under, translation if necessary
- - add some (arround 80, but not all) messages in msg_athena.conf
-
-08/22
- * Fixed: In GM commands, add a 'standard' message when GM level is too low [Yor]
- * Changed in battle_athena.conf [Yor]
- - atcommand_spawn_quantity_limit: 100 (20 is too short for mass spawnings.)
- - unknow: give translation of babelfish to help on the explanation (not writing: 'unknow' to not lost the information!)
- - day_duration: 7200000 & night_duration: 1800000 (set default to 30 min night, 2 hours day to show improvement of eathena by DEFAULT)
-
-08/21
- * Updated battle_athena.conf to be in English (not Engrish) [Ancyker]
- * Updated WZ_FIREPILLAR according 8-10 patch [AppleGirl]
- * Updated skill_cast_db and skill_require_db according to 8-10 kRO patch [AppleGirl]
- * Added how to use skill_castnodex_db.txt [AppleGirl]
- * Added skill_castnodex_db.txt, allowing some skills to be casted with out dex's effect on them
- Midas' idea [AppleGirl]
- * Improved answer messages of char-server on @(un)ban/@(un)block GM commands [Yor]
- * Added answer messages of char-server on @(un)ban/@(un)block GM commands [Yor]
- * Added block command (ladmin c) [Yor]
- * Added block command (ladmin perl) [Yor]
- * Fixed job_db1.txt comments to be in english, also spaced the columns to make it easier to read. [Ancyker]
- * Added: possibility to use "" or '' to give an account name in ladmin (Perl) (no more problem with account name which have spaces). [Yor]
- * Changed: atcommand_gm_only is set to 'no' by default, because: [Yor]
- - GM commands level now works correctly
- - GM commands levels are now set by default with diffrent types of GM
- * Added @inall/@exall GM command to block/unblock ALL wispers of a player [Yor]
-
-08/20
- * Added unblock command (ladmin C) [Yor]
- * Added unblock command (ladmin perl) [Yor]
- * Fixed: when limited time is in past, add new duration starts from actual time [Yor]
- * Added chardisguise/charundisguise [Kalaspuff]
- * Added default time [23:59:59] for timeset/banset ladmin (C) commands [Yor]
- * Fixed sage rebirth ability at professor job change NPC. [PoW]
- * Fixed pecopeco knight/crusader rebirth ability at LordKnight and Paladin job change NPCs. [PoW]
- * Added default time [23:59:59] for timeset/banset ladmin (perl) commands [Yor]
- * Added a check_ip_flag option in char-server [Yor]
- * Added a check_ip_flag option in login-server [Yor]
- * Added a display at start of login-server about IP checking configuration. [Yor]
-
-08/19
- * Added unban/unbanish command (ladmin c) [Yor]
- * Added unban/unbanish command (ladmin perl) [Yor]
- * Added parameter to choose how works timeadd (ladmin command) with unlimited time accounts [Yor]
- * Fixed @option/@charoption when player is disguised. [Yor]
- * Added: some information about TODO 19. [Yor]
- * Added: possibility to use "" or '' to give an account name in ladmin (C) (no more problem with account name which have spaces). [Yor]
-
-08/18
- * Guardians were immune to skills/spells, fixed. [Valaris]
- * Added custom draculax.txt script to display npcskilleffect command. [Valaris]
- * Added npc/events/custom folder. [Valaris]
- * Fixed Umbala Language Quest NPC bug [PoW]
- * Added temporary prevention of crash caused by peco + disguise, will look into a better solution. [Valaris]
- * Changed working of putting disguise on (much like Yor's setpos with undisguise) [Valaris]
- * Changed disguise id check to > 23 instead of max_pc_class. [Valaris]
- * Added bDisguise script command for items. [Valaris]
- Syntax : bonus bDisguise,npc_id/mob_id; Example bonus bDisguise,1002; for poring disguise
- * Added flag so @disguise command will override any disguise scripts. [Valaris]
- * Updated @disguise description in help.txt. [Valaris]
- * Added: @ignorelist/@charignorelist to know from which people a player ignore wisps [Yor]
- * Renamed: @makepet -> @makeegg (@makepet will be created later to create pet, not a egg) [Yor]
- * Fixed Phantom of Opera quest, fixed quests_aldebaren requirements [PoW]
- * Changed: anti-freeze disconnection in char-server set from 1mn 15s to 30s [Yor]
- * Fixed: free block memory on NULL pointer in char-server do_final [Yor]
- * Fixed: reset server information when map-server disconnected from char-server [Yor]
- * Changed: anti-freeze disconnection in login-server set from 1mn 15s to 30s [Yor]
- * Improved pecopeco checks in @option/@charoption/@jobchange/@charjob [Yor]
-
-08/17
- * Fixed pecopeco displayings in @option/@charoption/@jobchange/@charjob [Yor]
- * Correction of @rura, @where, @rurap and some other things in GM commands. [Yor]
- * Correction of a parameters' errors in GM commands. [Yor]
- * Correction of @charzeny Gm command (+ @zeny/@charzeny can add and remove zeny without problem). [Yor]
- * Acolyte Job Quest: Fixed Marthilda, Yosuke NPC bugs. [Lupus]
- * Added some comments in .conf about @gm [Yor]
- * Fixed max value of level_new_gm parameter (not 100, but 99) [Yor]
- * Added level_new_gm parameter in login-server to disable or set level of all GM created by @gm [Yor]
- * Fixed @GM GM command [Yor]
-
-08/16
- * Translation of final message of @gm [Yor]
- * Fixed on @GM: When login server is offline, char server sends impossible to create GM [Yor]
- * Fixed: refuse @gm GM command to ... a GM :) [Yor]
- * Added complete answers of /in /ex /inall /exall. [Yor]
- * Added option to send information to online GM when there is a hack, a spoof name, etc. [Yor]
- * Added individual ignore management, and wisp checks [Yor]
- * Added TODO 33 [Yor]
- * Fixed possible overflow with @ban GM command [Yor]
- * Speed up a little @ban GM command [Yor]
- * Added ignore all for wisps (to same map-server). Sorry, before, I was added only for not same map-server [Yor]
-
-08/15
- * Added a resume for 'email_creation' parameter [Yor]
- * Fixed double messages when a player wisp/page itself [Yor]
- * Added ignore all for wisps [Yor]
- * Added better explanation for the new 'email_creation' parameter [Yor]
- * Fixed: now, GM accounts are sended to all servers when auto-detect change of GM file is actived [Yor]
- * Fixed: at auto-creation of e-mail, don't ask the player if login-server is offline (we need login-server to save e-mail) [Yor]
- * Used config_switch instead of atoi for email_creation parameter [Yor]
- * Added an option to create e-mail at connection with client [Yor]
- * Added authentification with login_id2 (1040) - activated by default [Yor]
- * Added partial part of authentification with login_id2 (1040) [Yor]
- * Added some missing GM commands in help.txt [Yor]
- * Improved search of map-server when map is not found [Yor]
- * Added banish in ladmin (c) to be like of GM commands [Yor]
- * Fixed Angel Helm quest, fixed Spore Doll quest exploit, Fixed Morgenstein quest bug [Lupus]
-
-08/14
- * Added banish in ladmin (perl) to be like of GM commands [Yor]
- * Fixed some possible errors with maps management in char-server [Yor]
- * Fixed bug of map searching when to few maps on map-servers [Yor]
- * Changed some console displayings in char-server [Yor]
- * By default, activation of player ip check [Yor]
- * Added some of 1040: check of player ip between each server [Yor]
- * Fixed dupes in warp scripts, reorganized, thanks to midas fro GH warp [kobra_k88]
- * Added possibility to disable automatic reload of GM accounts file [Yor]
- * Added log when GM accounts file can not be readed [Yor]
- * Changed default of GM accounts file check for 120 sec to 15 sec [Yor]
- * Added automatic reload of GM accounts file if it was modified [Yor]
- * Added @mapmove, @broadcast, and @localbroadcast in help.txt [Yor]
- * Fixed possible error of monster id (GM command) if monster begins by a number. [Yor]
- * Added jobname in @charstats command. [Yor]
- * Fixed: If a GM command uses NULL pointer as command function, there is no more crash. [Yor]
- * Fixed Niflheim&Umbala guides. Fixed Niflheim city. removed 2 NPC clones. [Lupus]
- * Added Archer Skills quests, fixed Thief Skill Quest [kobra_k88]
-
-08/13
- * Add an option to fix a ban for hacker that spoof name (to set minutes of ban) [Yor]
- * Fixed incorrect mob IDs with Valaris's mob_db [Ancyker]
- * Added possibility to execute GM commands when you wisp someone [Yor]
- * Added a console message when a player try to spoof his name in Global message [Yor]
- * Added size of packet in packet send by map-srvr to char-srvr about online players [Yor]
- * Added check on individual stat at creation of a character [Yor]
- * Added npcskilleffect script command. Will allow npc to show effects of certain skills on specified XY coordinate.
- Syntax : npcskilleffect 21,10,148,150; skillid, skilllv, x, y. [Valaris]
- * Increase maximum weight can be used with an item now, thanks to orn. [Valaris]
- * Fixed mob names in Gonryun , thanks to unsul and Filougarou. [Valaris]
- * Fixed muramasa curse rate, thanks to OxiMoron. [Valaris]
- * Fixed Aldeabran&Comodo towns. Added Cheese quest to Comodo. Fixed Thief Job Quest [kobra_k88]
-
-08/12
- * Begin to add 1040 in login/char/chrif about authentification. not finished [Yor]
- * @mapmove, @broadcast, and @localbroadcast can now be used. [Valaris]
- * Looting mobs will not continue to item if it disappears, instead will walk away. [Valaris]
- * Unitinalized nameid in script.c [Valaris]
- * Added position in log when unknown packets are saved (login-server). [Yor]
- * Corrected possible error to contact not good player when a wisp concerns player on an other map-server. [Yor]
- * Added a function to obtain character name with index in auth structure (char.c). [Yor]
- * Corrected check/test error in mapif_send. [Yor]
-
-08/11
- * itemdb_searchname fixed (now firstly looks for item aliases 'name', if not found looks for item name 'jname'). [Lupus]
- * Optimized getitem, delitem. getweight, fixed there possible scripts exploits [Lupus]
- * Thief bug's long name in mob_db.txt was Thief Bug Larva, fixed. [Valaris]
- * Thief bug names were mixed around in monster.txt, fixed. [Valaris]
- * Fixed incorrect parse of usable item rate. [Valaris]
- * Added ban command in ladmin (C), like GM command [Yor]
- * Terminated some translations about wisp/page, and control/improvement/correction of wisp/page. All 'found' bugs are corrected [Yor]
- * Added translations in inter.c about wisp/page. [Yor]
- * Corrected printf datas in intif_parse_WisMessage when map-srv receives wisp message from inter-srv. [Yor]
- * Sended an answer when a wisp/page is supressed because of a timeout. [Yor]
- * Improved: if inter-srv is asked for a wisp, verify first if the character exists. Don't ask all map-server if it not exists. [Yor]
- * Changed Printf in intif_wis_message to have better information. [Yor]
- * Improved: Don't ask inter-server for a whisp/page if player is on the same map-server. [Yor]
- * Completed some printf and comments in char.c [Yor]
-
-08/10
- * Improved map_nick2sd function. Now, sensitiv case is removed when it's possible [Yor]
- * Corrected split of broadcast messages in char-server [Yor]
- * Message to Valaris from Yor (special file)
- * Improved accounts file saving: [Yor]
- - be sure that accounts file is save at least every minute.
- - save accounts file at end of login-server
- * Reduce displaying size on some errors about accounts file reading. [Yor]
- * Created log when change sex packet give an invalid value (login-server) [Yor]
- * Correction of unknow_packet displaying (in log). Separate is done after 8th char [Yor]
- * Give possibility to use account name with spaces in prompt commands finished by account name in ladmin (perl). [Yor]
-
-08/09
- * Fixed char-server lag. 3 tests from 3 people appeared to function properly again. [Valaris]
- * Basic Implementation of Basilica [AppleGirl]
- * Added ban command (ladmin perl) [Yor]
- * Correction of bug about auth_fifo when we block a player. Invalid value in array (login.c) [Yor]
- * Correction of some tests on server_fd array in login.c [Yor]
- * Improved Item_searching in all GM commands [Yor]
- * Created @undisguise GM command [Yor]
- * Added Umbala town&quests&guide. Some fixes in Yuno warps&shops&guides. Kafra fix. Added Valhallen quest. [kobra_k88],[Lupus]
- * Corrected char_divorce (char-server) to remove ring to both partner [Yor]
- * Eventual crashfix for clif_authfail_fd [Kalaspuff]
- * Corrected @jump GM command. [Yor]
- * Reduced size of conf/help.txt (max 200 lines in chat window). [Yor]
-
-08/08
- * Added NPCs to @disguise. [Valaris]
- * Mob disguises will now show up to player using it as well. Attack animation and sitting do show up to them yet. [Valaris]
- * Added @disguise GM command in help files [Yor]
- * Added @go 16 to visit prisoners [Yor]
- * Reduced number of accounts file saving when informations are not important: [Yor]
- - save immediatly any modification/creation/deletion of account (like before)
- - use counter before saving if only ip/time of last connection is changed (normal authentification)
- because these values are already save in log file.
- * Speed up account searching in login-server. [Yor]
- * Speed up character searching for @(un)block/@(un)ban. [Yor]
- * Created @unjail/@discharge GM command. [Yor]
- * According to GM definition level in at_command.conf, set level 20 to online_gm_display_min_level for online files. [Yor]
- * Speed up some sortings of online creation (strings based sortings) [Yor]
- * Fixed nullpointer crash with disguise in clif_changelook [Kalaspuff]
-
-08/07
- * Fixed so spells will still be cast if target walks out of range. (please don't overwrite this again) [Valaris]
- * Corrected a little error in online files creation (only 1 player was visible) [Yor]
- * Optimized memory management of online list [Yor]
- - less memory usage
- - less tests and loops (more speed)
- - more efficient (use directly char_dat position instead of search it)
- * Added Official Assassin Job Quest. Now eAthena contains all 2-1 Job Quests! [kobra_k88]
- * Fixed scripts: 32hats, warper2, platinum_skills, added/changed some mapflags and other misc script changes [Lupus]
- * Added @disguise command (enter a mob_id or name, and you will appear to others as that mob/npc!)
- * Fixed code for mob disguises, should not crash clients now.
- * Improved online management code when we receive char_id. [Yor]
- * Added code for mob disguises. Can not set yet. Atcommand needs created. [Valaris]
- * Improved mmo_char_send006b function [Yor]
- * Corrected: when save file of character can not be created, try backup file if flag is set to create it. [Yor]
- * Added an option to create backup of characters file [Yor]
- The backup_txt file was created because char deletion bug existed.
- Now this bug is corrected and no character disappear.
- But, create a file with a lot of characters can use CPU usage and decrease hard disk speed.
- So, I create an option with default value: no create backup.
- * Improved online management code and some others little codes (char.c). [Yor]
- * Respawn points of prisoners set to the jail rooms. Jail.txt mapflag addeed. So imprisoned players can't escape. [Lupus]
-
-08/06
- * Improved/Optimized some little code (char.c/login.c). [Yor]
- * Improved 0x2afa and 0x2afb (map transmissions between char and map). [Yor]
- * Optimized global message nick spoof fix. [Valaris]
- * Fixed crash in attacking guardians in a null guild. [Valaris]
- * Capped earned exp at 1000000000. [Valaris]
- * Set area size back to 20 for now, some things in path.c need to be fixed. [Valaris]
- * Fixed crash in guardian search. [Valaris]
-
-08/05
- * Added @jail <char_name> GM command [Yor]
- * Added explanation of @idsearch and @mapinfo in help.txt [Yor]
- * Improved @idsearch GM command [Yor]
- * Improved a little 3 loops in ladmin.c [Yor]
- * Improve some codes in char.c: [Yor]
- - less tests in online creation
- - mmo_char_send006b: remove duplicated memset, create a char_dat structure pointer
- - server_fd[] not seted/modified/checked correctly
- * Set max_walk_path back to 48. [Valaris]
- * Added translated Gonryun town. Fixed map names of Louyang shops. Added missing Blacksmith,
- added extra Rapairmen into refine.txt. In Inns added 4 different prices based on Base Lvl.[kobra_k88]
-
----------eAthena 1.0.0 RC3 TXT---------
-08/04
- * Set battle_athena.conf to more accurate settings. [Valaris]
- * Decreased default damage delay (stun after being hit) by 75%. [Valaris]
- * Max walk path is now correct (17). [Valaris]
- * Area size is now correct (14). [Valaris]
- * Improved some very little codes in char.c. [Yor]
- * Remove displayings of logs on console of map-server [Yor]
- use it for DEBUG, not by default, that decrease a lot the performance
- * Added (commented) printf in freeze function for debug if necessary [Yor]
- * Fixed melee ctrl-attack targetting. [Valaris]
- * Reset attack target when equipping arrows. [Valaris]
- * Improved (log and remove_control_chars functions). [Yor]
- * Added 'available free bytes' in displaying when size is expanded. [Yor]
- * Fixed incorrect returns in clif_authok. [Valaris]
- * Added pointer checks to chrif.c [Valaris]
- * Added some pointer checks to the mob ai. [Valaris]
- * New (lag-free) fix for NPCs / mobs not showing up when chars walk around [Kalaspuff]
-
-08/03
- * Made so if exp given is less than 0, 0 is given instead of 1 (plants were giving exp) [Valaris]
- * Added console displaying to have complete informations when we expand Wdata session. [Yor]
- * IMPORTANT: Add a TODO 31 for Guilds' coders. [Yor]
- * Old packet 0x2b16 use packet number 0x2b0e. [Yor]
- * remove packets 0x2b0e and 0x2b0f. [Yor]
- * on character_name ask packet: add account_id of asker. [Yor]
- * Improved script code in novice.txt. [Yor]
- * Fixed error in alberta.txt. [Valaris]
- * Allow player placement on afm-type maps. [Valaris]
- * Added afm loading. [Valaris]
- * Removed useless code for mob equipment. [Valaris]
- * Initial packet setup for possible playable mobs. [Valaris]
- * Added check for save_clothcolor for the dyefix, and added another check to make sure player is dyed before using the fix. [Valaris]
- * Improvement: Character asking of map-server to char-server is not more case sensitive. [Yor]
- * Added TODO 29 & 30. [Yor]
-
-08/02
- * Re-added "player not attached" error reporting. [Valaris]
- * Fixed errors in 32 hat quest that was causing player not attached errors. [Valaris]
- * Fixed input number function: commented out negative input check by Valaris in script.c (all scripts have been revised and fixed),
- made actual bug fix of buildin_input func (wrong variable type conversion (int)->(unsigned int) in clif.c
- Due to the fixed bug Merchant Job Quest works fine now [Lupus]
- * Fixed number input bugs/possible exploits: mage.txt IceCream.txt event_valentine.txt refine.txt
- milk_trader.txt grandpa_pharmacist.txt aldebaran.txt alberta.txt juice_maker.txt [Lupus]
- * Finished: offline player can be @ban/@block/@unban/@unblock by their character name. [Yor]
- * Added packet between map to char to work on offline players (@ban/@block/@unban/@unblock) [Yor]
- * Added check on character name with less than 4 characters [Yor]
- * Added @chardelitem GM command [Yor]
- * Fixed Kafras (no more buttonless msg bugs, Kafra Pass works fine) [Lupus]
- * Changed input exploit, only checks for negative now instead of having an input cap. Fixed up vending exploit. [Valaris]
- * Added check for src with High Wizard's soul drain. [Valaris]
- * Fixed up npc_suicide and npc_selfdestruction, should fix up crashes caused by them. [Valaris]
- * Added more pointer checks in the clif_authok function. [Valaris]
- * Added some pointer checks to clif.c, should prevent crashes. [Valaris]
- * Added some checks about writing errors of item names in GM commands (check cases). [Yor]
- * Fixed Hunter Job Quest 1.6 [Lupus]
- * Removed Kalaspuff's fix for mob/npc data not always being recieved. It was causing
- excessive amounts of lag. [Valaris]
-
-08/01
- * Added ability to spawn character pets. [Valaris]
- * Added show_mob_hp. [Valaris]
- * @item/@item2 GM commands now work correctly with name begining by a number. [Yor]
- * @spawn/@monster2 GM commands authorise spawn of guardians. [Yor]
- * Fixed so guardians may be spawned outside of castles. [Valaris]
- * Fixed/Improved @spawn/@monster2 GM command. [Yor]
- @spawn/@monster2 GM command: you can use space in the desired name now (use "") [Yor]
- * Added TODO 26 and 27. [Yor]
- * Guardians if owned by a guild will display guild name and castle on name request. [Valaris]
- * Added checks for null blocks in mapforeachin functions. [Valaris]
- * Addition of a GM level 99 account for test of GM commands. [Yor]
- * Creation of a default structure for GM levels (sub-gm, gm, admin, etc.). [Yor]
- * Improved @time GM command (better code and display more informations). [Yor]
- * Added informations about game time in @time command [Yor]
- * Added @time command to have server time [Yor]
- * Fix night at start if administrator want night and there is no duration for night and day [Yor]
- * Fix for NPCs / mobs not showing up when chars walk around [Kalaspuff]
- * Begin @unban/@unblock GM command (structure done). [Yor]
- * It's now possible to disable Night or Day (set to 0 in battle.conf). [Yor]
- * @day/@night: when already the desired cycle, display a message. [Yor]
- * Fixed overlapping Ice-Cream Maker NPC, duplicated NPCs, restored duplicated Akaru's MrSmile [Lupus]
-
-07/31
- * Terminated: night/day cycles. [Yor]
- * When a state comes back to normal, player stay in night if it's night. [Yor]
- * Started to add management of day/night: [Yor]
- creation of 3 parameters in battle.conf
- TODO: usage of these parameters (later).
- * added line '// $Id: Changelog.txt,v 1.65 2004/09/29 17:31:42 kalaspuff Exp $' in all code source files to avoid overwrite in CVS. [Yor]
- * Fixed number/quantity in @item command. [Yor]
- * Fixed when night and disconnect/reconnect, it's night. [Yor]
- * Removed extension to check a map in char.c (less tests). [Yor]
- * Added savepoint coordonates (x,y) if player is set to a new map (char.c). [Yor]
- * Added izlude to check major cities. [Yor]
- * Began adding developer mobs. [Valaris]
- * Added dyes and fixed client crashes with player mobs. [Valaris]
-
-07/30
- * Added temp fix for "nullpo player not attached" error message (script.c script_rid2sd) [Lupus]
- * Added checks for major cities in afm format. [Valaris]
- * Added preliminary AFM(Advanced Fusion Map) support. Actual map-reading works, but rest of server needs to recognize them.
- Thanks to alexkreuz [Valaris]
- * Changed Map and NPC loading display. [Valaris]
- * Removed unneeded 'End' and duplicate 'end' script commands. [Valaris]
- * Added 'language <language>' command in ladmin (perl) to change language of displaying. [Yor]
- * Fixed atcommand_gm_only parameter: [Yor]
- 0: you can define level command '0' for normal players (gm level 0)
- 1: even you define a level 0 for a command, normal player can not use it. Only GM level 1 or more can use command (if command level is possible for this GM)
- Note: This parameter is not like atcommand_for_all (this parameter doesn't exist actually) .
- * Fixed Kafras (Cart Service for Super Novice), some warps in Morroc, Aldebaran. [Lupus]
- Added official shop into St.Abbey. [Lupus]
- Added quests: Lutie Town Hat Quest by TonyMan, 23 new hats custom quest. [Lupus]
- Fixed jobchange.txt. [Lupus]
- Improved pvp.txt. [Lupus]
- Rearranged and updated! (now in 2 variants) mapflags. [Lupus]
- Updated map_athena.conf [Lupus]
- * Fixed: battle_athena config's atcommand_gm_only; yes was no and vice versa [Kalaspuff]
-
-07/29
- * Added 'language <language>' command in ladmin.c to change language of displaying. [Yor]
- * Re-added guardians don't attack guild members, someone must have removed it by accident. [Valaris]
- * Restore correct displaying (LAN/WAN) previous was good :) (sorry... prabably tiredness). [Yor]
- * Fixed some errors in novice.txt script. [Yor]
- * Kashy's script fixes. [Valaris]
- * Displaying of correct information in LAN/WAN test (displaying was reversed) in char.c [Yor]
- * Creation of a char_unblocked directory (char directory is blocked) [Yor]
- - modification of makefile
- * Added a note in TODO 14: encrypted password - problem with client versions [Yor]
-
----------eAthena 1.0.0 RC2 TXT---------
-07/28
- * Added metaller to equipped mobs. [Valaris]
- * Added a note in TODO 19 [Yor]
- * REMOVED last changelog: cvs server: [14:29:29] waiting for cvs's lock in /usr/cvsroot/athena/src/char [Yor]
- * Displaying of correct information in LAN/WAN test (displaying was reversed) in char.c [Yor]
- * Added "OMG" emotion to weapon/armor breaking. [Valaris]
- * Removed space in a pointer in mob.c. [Valaris]
- * Restored previous version of lan management in login.c, because: [Yor]
- - check test was incorrect (no mask for controled ip).
- - in check test, we recalculate every time the subnetwork (loss of time).
- - impossible to have a name definition for the sub-network (some network administrator use a name to define the sub-network).
- - no more default configuration of sub-network.
- - possible errors in the reading function of the lan file.
- - no more logs about sub-network.
- - BUT, conserved: - new default name for lan file
- - color for displaying of LAN/WAN
- * Removed some memsets from chrif.c that caused segfaults. [Valaris]
- * Added fix for anklesnare and spiderweb. [Valaris]
- * Added Kashy's Lan Support code. [Valaris]
- * Removed variables and assignment used by prevent_multi_login. [Valaris]
- * Removed prevent_multi_login. (many problems reported with it) [Valaris]
- * Fixed armor breaking. Was being broken when pc was attacking instead of when being attacked. [Valaris]
- * Fixed checkcart, checkfalcon, checkriding (they didn't return any value) in script.c [Lupus]
- * Fixed breeder.txt renter.npc, kafras NPC (added correct class check, added correct checkcart, checkfalcon, checkriding) [Lupus]
- * Fixed Kafra functions_kafras.txt NPC (added correct checkcart, fixed cmall cart giving bug) [Lupus]
- * Fixed Kafra functions_kafras.txt NPC (fixed Kafra Pass exploit) [Kobra_k88]
- * Fixed Hunter.txt coords of the Guild entrance warp [Lupus]
-
-07/27
- * Improved check command in ladmin.c [Yor]
- * Added map_id check in map_foreachinarea, to prevent eventual crashes [Kalaspuff]
- * Added @enablenpc and @disablenpc in help files [Yor]
- * Fixed Thunder Storm range (thanks midas) [Kalaspuff]
- * Added Anthell NPC trigger in Morroc.txt warps/town [Lupus]
- * Added missing Warps for Job Quests of Swordman, Hunter and Thief in jobquests.txt [Lupus]
- * Updated atcommand_conf, missing GM-level for @enablenpc and @disablenpc [Yor]
- * Removed possible overflow error in @enablenpc and @disablenpc [Yor]
- * Updated atcommand_conf, missing GM-level for haircolor [Kalaspuff]
- * Improved best job test in novice.txt [Yor]
- * Improved @go command: [Yor]
- - give list of cities if no value
- - added start point (to welcome newbies)
- - give possibilities to use city names (@go geffen): at least 3 characters, and some writing errors are tested
- * Replaced every Job Quest Script (excluding Assassin, 2-2 and 2-2-X ). Now all 2-1 Jobs have big quests. [Kobra_k88]
- * Replaced all Skill Quests (Added Sand Attack Skill Quest). [Kobra_k88]
- * Added Legendary Swords quest. [Kobra_k88]
- * Replaced 6 towns with new scripts: Izlude, Prontera, Morocc, Geffen, Alberta, Al De Baran. Splitted all towns quests into files. [Kobra_k88]
- * Splitted and optimized Kafras & Guides. [Kobra_k88]
- * Implemented Kafra Pass! [Kobra_k88]
- * Removed free Breeders (replaced by the correct ones). [Kobra_k88]
- * Placed all Sign Posts/Signs into a single file. [Lupus]
- * Files arrangement, additional warps/scripts correction. Fixed several scripts (NPC overlapping, bad sprites, etc). [Lupus]
-
-07/26
- * More accurate pvp point system. It skips ranks, needs more work. [Valaris]
- * Fixed crash in executioner card code. [Valaris]
- * Fixed mob respawn after death bug. [Valaris]
- * Fixed exp problem caused by bounds checking. [Valaris]
- * Fixed pvp rank so only one person may be rank 1. [Valaris]
- * Any time a person is on a pvp map, the rank will calculate, preventing bad rank packets from being sent. [Valaris]
- * Added Job Agencies for Training Ground (novice.txt). [Yor]
- * PVP respawn client crash fix. [Valaris]
- * Fixed small error in kafra.txt [Syrus22]
- * Finished adding special equipped mobs. [Valaris]
- * Added 2 living statues behind the NPC 'Monster Master'. [Yor]
- * Removed infinite possibilities to have items from helper (novice.txt, new_1-4.gat,60,149). [Yor]
- * Added 2 living statues behind the NPC 'Monster Expert'. [Yor]
- * Improved a little 1st course of novice training. [Yor]
-
-07/25
- * Allow mobs to be equipped with pet armor. mob_avail and clone mobs need to be created. [Valaris]
- * Removed [AppleGirl]'s armor breaking code. [Valaris]
- * Commented out data_dir. [Valaris]
- * Finished exp bounds checking. [valaris]
- * Added negative value checks to clif_updatestatus. [Valaris]
- * Added exp bounds checking for those rediculously high rate servers. [Valaris]
- * Added bounds checking to the @zeny and @charzeny commands. [Valaris]
- * Improved and corrected some errors 1st course of novice training. [Yor]
- * Removed no guild check for Guardians. Guardians SHOULD attack people with no guild. [Syrus22]
- * Fixed Alliance check in mob.c [Syrus22]
- * Added armor breaking to normal battle (crits will double the chance) [Valaris]
- * Fixed mistake in map.c causing compile errors. [Syrus22]
- * Fixed backstab bow penalty option. [Syrus22]
- * Fixed Alliance check in battle.c for emp/guardian damage. [Syrus22]
-
-07/24
- * Added backstab bow penalty option [Akaru]
- * Fixed OnGuardianDied events on prontera castles 3 to 5. [Valaris]
- * Another vending fix. [Valaris]
- * Fixed bugs in npc headers caused by someone using spaces and not tabs. (kafra.txt, guide.txt, yuno.txt) [Valaris]
- * Fixed a vending bug. [Valaris]
-
----------eAthena 1.0.0 RC1 TXT---------
-07/22
- * Fixed numerous startup errors in aldebaron castles and one geffen castle. [Valaris]
- * Full Guild Wars Script Complete!!! [Akaru]
- * Fixed rice ball item. [Valaris]
- * Fixed problems with options and peco riding. [Valaris]
- * Updated item_db with fix for Sleipnir and more translations. [Akaru]
- * Translated item_violetbox, mob_poring, mob_branch, mob_boss. Fixed wizard.txt (wrong item id), headgeatquest.txt(added Zeny check) [Lupus]
-
-07/21
- * Updated refine.txt. Added optional features and optimized the file. [Syrus22]
- * Evened out the # of columns in mob_db, filled in some blanks. [Valaris]
- * Undid compilation errors caused by Akaru's removal of nullpo.o from map-server compile [Valaris]
-
-07/20
- * Removed Ghostring from gef_fild13.gat [rg]
-
-07/19
- * Fixed Graffiti [Valaris]
- * Zeny Bug In Vending Fixed [Darkchild]
-
-07/18
- * Added a check about level of at_command when reading the file [Yor]
- * Updated /help and conf/help.txt [Yor]
- * Added @nuke command in conf/help.txt [Yor]
- * More WoE Castles Done [Hikaru]
- * Changed: inter.txt->inter.log in log directory [Yor]
- * Added some char_log when character can not be created (invalid value, invalid name, etc...) [Yor]
- * Changed: char.txt->char.log in log directory [Yor]
- * Update features.html/changlog.html [Yor]
- * Fixed compilationissue on FreeBSD [Kalaspuff]
-
-07/16
- * Remove limit for kami/kamib ladmin command. [Yor]
- * Fixed crash in weddingtxt.txt where it was checking an invalid equip index. [Valaris]
- * Added some TODO for next version. [Yor]
-
-07/15
- * Changed: login.txt->login.log in log directory [Yor]
- * added system to choice authorised ip for remote administration [Yor]
- * Added listBan/listOk commands in ladmin's. [Yor]
- * Speed up a little search_mapserver function. [Yor]
- * Init map strings of each servers when map-server send informations. [Yor]
- * Added some TODO for next version. [Yor]
-
-07/14
- * Fixed another lockup with multi_level_up [Valaris]
- * Added kami(yellow)/kamib(blue) commands in ladmin (terminated). [Yor]
- * Fixed name of ladmin_athena.conf. [Yor]
- * Fixed mvp item reading. [Valaris/Syrus22]
- * Added new move packet in map (ver.13jully04) [Yor]
- * Added new auth packet in map (ver.13jully04) [Yor]
- * Added kami/kamib commands in ladmin. not terminated: to do: login->char [Yor]
- * Updated Some Npcs [Darkchild]
- * Added Gefenia Warps [Darkchild]
- * Added Berzebub Quest [Darkchild]
- * Removed random alchemist marine sphere code, until some other system is worked out. [Valaris]
- * Fixed infinite loop caused by turning multi level off. [Valaris]
- * Added display id the char-server is freezed. [Yor]
- * Added debug printf about the max_connect_user in char-server. [Yor]
- * Added banadd command in ladmin.c [Yor]
- * Removed duplicate check in chrif.c. [Yor]
-
-07/13
- * Fixed GM_level code in map-server. [Yor]
- problem is in the hash system of the db -> use simple db until we found solution.
- note: for this db, it's not necessary to use a db system (little db, 2 values: key, value)
- * Improved GM_level code in map-srv, but not solve the problem. [Yor]
- * Fixed error of 'return' without value in chrif_parse (chrif.c). [Yor]
- * Added character name, account id and gm level on console in map-server when auth is accepted. [Yor]
- * Added gm_level of the account on console in char-server when auth is accepted. [Yor]
- * Added gm_level of the account on console in login-server when auth is accepted. [Yor]
- * Added timeadd command in ladmin.c [Yor]
- * Added help for each command (help <command>) in ladmin (perl and c). [Yor]
- * Fixed global message (normal speak) name spoof exploit. [Valaris]
- * Added timeset command in ladmin.c [Yor]
- * Added banset command in ladmin.c [Yor]
- * Added vending and trading dupe fixes, thanks to Kinko and Kazzy [AppleGirl]
- * Added multi_level_up command to battle_athena and commandline. [Valaris]
- Turning it off will allow a player to only level up once from a monster.
- * Added: explanations of ladmin_athena.conf keys in conf_ref.txt. [Yor]
- * Fixed: init mmo_map_server structure (to 0) in char-server. [Yor]
- * Added Gefenia Maps [Darkchild]
- * Added @nuke command do to user request. [Valaris]
- * Removed nick spoof fix code for now, it broke chat. [Valaris]
- * Added some code for @nuke command. [Valaris]
- * Finished adding battle_athena options to command line. Every option in battle_athena.conf
- can now be passed directly through the command prompt. [Valaris]
-
-07/12
- * Added many battle_athena options to command line arguments. [Valaris]
- * Allow battle_config_switch to be used globally in map-server. [Valaris]
- * Rewrote map-server command-line code. Will now begin implemented nice commands for map-server. [Valaris]
- * Added BETA version of ladmin in C. [Yor]
- * Added new packet structure of authentification and move - automatic detection. [Yor]
- * Added /item command. It is same as /monster. Both commands will search for mobid first, if not found will give item. [Valaris]
- * Fixed a displaying error in state command (perl ladmin). [Yor]
- * Added /monster command. Syntax is /monster <name/id>. [Valaris]
- * Fixed chat spoofing in global messages. [Valaris]
- * Prevent nick spoofing in whispers. [Valaris]
- * Added check about lenght of packet 0x72 for new client version [Yor]
- * Added Pet Equip Items Quest Npc
- * Added Pet Taming Items Quest Npc
- * Added Slotted Sunglasses Quest Npc
- * Added pet_equip_required option for pet skills. [Valaris]
- * Changed: create a sub-function for help command in ladmin (perl). [Yor]
-
-07/11
- * Added Petit pet skill. [Valaris]
- * Added some code for Petite Heaven Drive, still does not work, but doesn't crash. [Valaris]
- * Fixed dokebi and baby desert wolf pet skills. [Valaris]
- * Added Orc Warrior, Hunter Fly, Poison Spore, Baby Desert Wolf, Baphomet Jr, and Dokebi pet skills. [Valaris]
- * Added script command petskillattack.[Valaris]
- * Fixed search command in ldamin (perl) ignore sensitive case now. [Yor]
- * Fixed default to 0 for save_unknown_packets configuration in login. [Yor]
- * Fixed the warnings about implicit declarations. [Kalaspuff]
- * Added @guildrecall/@partyrecall commands. [Yor]
- * Added Isis pet skill. [Valaris]
- * Added petmag script command for magnificat. [Valaris]
-
-07/10
- * Added Banker NPC because alot of users wanted one. [Syrus22]
-
-07/09
- * Added Sohee pet skill. [Valaris]
- * Added petheal command. [Valaris]
- * Added Smokie pet skill. [Valaris]
- * Added bonus bPerfectHide for Smokie pet skill. [Valaris]
- * Added Spore pet skill. [Valaris]
- * Created petrecovery script command. [Valaris]
- * Added Poring, Drops, Poporing, and Yoyo loot skills. [Valaris]
- * Added petloot script command for pet looting. [Valaris]
- * Removed pet_loot config settings. [Valaris]
- * If pk_mode is on, a message will show up in map-server. [Valaris]
- * Fixed pk_mode extra experience and drops so will occur if monsters is 20 levels or higher than player. [Valaris]
- * Fixed @killmonster crash caused by implementation of pk_mode. [Valaris]
- * Finished setting up pk_mode, should be 100% complete now. [Valaris]
- * Added nopvp.txt for pk_mode. [Valaris]
- * Prevent novice engagement in pk_mode. [Valaris]
- * Fixed up and changed the exp penalty system. [Valaris]
- * Pk_mode will now give double exp loss if killed by player. [Valaris]
- * Updated conf/help with new commands [Yor]
- * Removed more pvp timer stuff from pk_mode [Valaris]
- * Increase drop rates +25% if over level 20 on pk_mode. [Valaris]
- * Changed +25% exp increase on pk_mode to 15%. [Valaris]
-
-07/08
- * Disabled pvp rank and timer if pk_mode is on. [Valaris]
- * All maps made pvp if pk_mode is on. [Valaris]
- * pk_mode additional 25% exp given over level 20 [Valaris]
- * Disable @pvpon and @pvpoff commands if pk_mode is on. [Valaris]
- * Added pk_mode option in battle_athena.conf (not yet implemented) [Valaris]
- * Reworked prevent_multi_login, should work perfectly now. [Valaris]
- * Removed need for eof=2 for prevent multilogin, will now just delete the blocks containing both sessions. [Valaris]
- * Added map-servers anti-freezed connection in char-server. [Yor]
- * Added char-servers anti-freezed connection in login-server. [Yor]
- * Fixed spy commands so that inputting the same id/name turns off the command. [Syrus22]
- * Created @partyspy command. [Syrus22]
- * Renamed search_guildname function to conform with normal naming standards in guild.c. [Syrus22]
- * Created @whomap/@whomap2/@whomap3 commands to show online players on a specifical map. [Yor]
- * Updated and Shrunk the Kafra Script. [Syrus22]
- * Create @reloadgmdb gm command. [Yor]
-
-07/07
- (Dated On Aegis Website)
- *--Released 1.0.0 RC3--*
- * Fixed crashed with prevent_multi_login. [Valaris]
- * Allow infinited local logins if prevent multi_login is on. [Valaris]
- * If prevent_multi_login is on, it will disconnect both clients on the same ip. [Valaris]
- * Prevent_multi_login will now list the character names of both accounts when logged out, and give a message. [Valaris]
- * added updated const.txt and pet_db.txt [Valaris]
- * GM accounts/level updating without restarting completed (by reloadgm ladmin command). [Yor]
- * Removed gm_account_filename definition from map.conf. [Yor]
- * Updated GM level by reloadGM ladmin command. [Yor]
- * Added a packet between char and map to send GM accounts and their level. [Yor]
- * Added a GM minimum level option to display 'GM' in online files. [Yor]
- * Added a warning when a GM account is defined twice in the file. [Yor]
- * Check for castle before guardian searches for emblem. [Valaris]
- * Prevent stealing from treasure boxes. [Valaris]
- * Enable mounted classes to use pedestrian counterpart's items. [Valaris]
- * Change so petskillbonus will only update stats(client-side) if need be to prevent errors. [Valaris]
- * Fixed crash with putting pets with skills back into egg. [Valaris]
- * Added Steel ChonChon, Rocker, and Deviruchi pet skills. [Valaris]
- * Added bAllStats(SP_ALL_STATS), bAgiVit(SP_AGI_VIT), bAgiDexStr(SP_AGI_DEX_STR) bonuses for pet skills. [Valaris]
- * Added ChonChon, Lunatic, Picky, and Savage Babe pet skills to pet_db.txt. [Valaris]
- * Added petskillbonus command for pet skills. Added pet_skill_bonus functions in pet.c. Made pointers for pet skills. [Valaris]
- * Added 'GM' display option for online files [Yor]
- * Improved GM accounts file reading in login-server [Yor]
-
-07/06
- * Changed heal dog in prontera to a poring. [Valaris]
- * NPCs with mob sprites can now be used in scripts. [Valaris]
- * Removed sd->brokencounter. Made getbrokenid more scripter friendly. Updated refine.txt getbrokenid commands. [Valaris]
- * Mounted classes will now use equipment of their pedestrian counterpart. [Valaris]
- * Improved management of GM account structure in char-server. [Yor]
- * Added packet betwen login to char to send GM accounts value. [Yor]
- * Added reloadGM command in ladmin to reload GM accounts file without stop the login-server. [Yor]
- * Added listGM/lsGM command in ladmin to list only GM. [Yor]
- * Correct an error in loop of char_divorce function (incorrect variable). [Yor]
- * Added some comments. [Yor]
- * Added a check on start_point.map when configuration is readed. [Yor]
- * Modified final message of login log at end of login-server. [Yor]
-
-07/05
- * Flamelauncher,frostweapon,lightningloader,seismicweapon, and enchant poison now check to make sure target's weapon is not already enchanted. [Valaris]
- * If sage breaks another person's weapon due to enchant failure, it will tell caster. [Valaris]
- * Modified venom splasher to hopefully stop crashes caused by spamming. [Valaris]
- * SA_FLAMELAUNCHER,SA_FROSTWEAPON,SA_LIGHTNINGLOADER,SA_SEISMICWEAPON now check to make sure target is holding a weapon. [Valaris]
- * SA_FLAMELAUNCHER,SA_FROSTWEAPON,SA_LIGHTNINGLOADER,SA_SEISMICWEAPON now will break target's weapon on failure (if one
- is being held and caster met requirements) [Valaris]
- * Prevent unidentified and broken items from being sold. [Valaris]
- * Added buildin_repair for equipment repair npc. [Valaris]
- * Added repair npc to forgery in prontera. (refine.txt) [Valaris]
- * Added sd->brokencounter and buildin_getbrokenid for item repair npc. [Valaris]
- * Corrected some item names [rg]
- * Fixed so @repairall success message and effect will only display once. [Valaris]
- * Added "No items needed to be repaired" message and added forge success effect to @repairall. [Valaris]
- * Added @repairall command. [Valaris]
- * Added equipment_breaking option, changed weapon_break_chance to weapon_break_rate (changed to %) [Valaris]
- * Crit's will now double weapon breaking chance if turned on. [Valaris]
- * Added missing commands in atcommand_athena.conf. [Yor]
- * Added @warpto command (same @jumpto). [Yor]
- * Added increase in chance to break weapon if using powerthrust. [Valaris]
- * Added weapon_break_chance to battle_athena.conf. [Valaris]
- * Modified multiple login from one ip prevention(and remove gm bypass). [Valaris]
- * Broken weapons will now have their description names in red. [Valaris]
- * Speed up characters saving [Yor]
- * Improved logs when a character isn't readed [Yor]
-
-07/04
- * Completed Prontera guild castles [Akaru]
- * break_weapon_chance now works, but broken weapon will not be displayed any differently than a normal weapon.
- Also does not yet affect a dual dagger assassin's 2nd weapon. No way to repair yet, and no skills/stats affect breaking chances. [Valaris]
- * Update int_storage to include broken column on all items (updates from old version) [Valaris]
- * Added @guildspy command. [Syrus22]
- * Added weapon_break_chance. (Not implemented yet) [Valaris]
- * Added break column for items in athena.txt (will upgrade older versions automatically) [Valaris]
- * Changed default required GM levels for GM commands (effective if corresponding directive(s) in /conf/atcommand_athena.conf is/are missing) to 1 [rg]
- * Added packet_table_en.txt in doc folder. Has some translations of the client_packet.txt. [Valaris]
- * Prevent @monster and @spawn of guardians/emperium. [Valaris]
- * Changed killmonster so it will not destroy guardians. [Valaris]
- * Added prevent_multi_login in battle_athena.conf to disable multiple logins from same ip (ignores gms, and will
- display ip of offending ip if turned on) [Valaris]
- * Added checks on player trading to prevent possible exploits. [Valaris]
- * Make sure cart is on before vending. [Valaris]
- * Cleaned up vending exploit fixes. Now checks to make sure not vending more than max items per skill level. [Valaris]
-
-07/03
- * Prevent use of potion pitcher on oneself, fixed potion pitcher so can be used on other targets. [Valaris]
- * Fixed the damage code for Falcon Assault, so its not totally useless. [?]
- * Update peco riders for people upgrading athena, fixed bug in unmounting pecos. [Valaris]
- * Removed option 32 from @option, added @mountpeco command. [?]
- * Removing peco will revert to proper job level, fixed so jobchanging from peco status to peco user without peco status,
- will update job to peco status. (ie going from Mounted crusader to Unmounted knight, will jobchange to mounted knight) [Valaris]
- * Fixed so Peco mounting will not reset job level. Set to remove peco status if jobchanging to a class that does not use them. [Valaris]
- * Peco mounting will now jobchange accordingly. [Valaris]
- * Added checkfalcon and checkriding script commands. [Valaris]
- * Added checkcart script command (since was already being used in scripts) [Valaris]
- * Re-added unix fd_setsize definitions, makefile will now pass -DFD_SETSIZE=4096 only for windows compiles.
- Tested new implementation of using -DFD_SETSIZE=4096 in makefile on windows box, and got past 64 connections even. [Valaris]
- * Improved messages between servers about connections. [Yor]
- * Improved pc_resetlvl, fixed the bug about options being left. [?]
-
-07/02
- * Added optional match_test in @who/who2/who3 commands (no sensitive case) [Yor]
- * If there is no map-server, send right message to client (char-server) [Yor]
- * Improved counter of users (char-server) [Yor]
- * Improved save of characters (char-server) [Yor]
- * Improved sorting of account before save (login-server) [Yor]
- * Improved map search at selection of a character (char-server) [Yor]
-
-07/01
- * Removed FD_SETSIZE definitions from socket.h, added -DFD_SETSIZE=4096 argument to makefiles. [Valaris]
- * Changed exploit fix in chrif.c [Valaris]
- * Added assassin mask view_id in item_db [Valaris]
- * Added a parameter to authorise minimum GM level at connection (login) [Yor]
- * Fixed crash caused by making raw connection to map-server. [Valaris]
- * Corrected a possible error at check of online players [Yor]
- * Improved characters names control/check [Yor]
- * Improved save/load of REG2 strings and values (login) [Yor]
- * When there is no char-server, login-server sends proper message instead of a void list of servers [Yor]
-
-06/30
- * Fixed a crash when used @charmodel,@charstpoint,@charskpoint and
- @charzeny with the wrong name [Kalaspuff]
- * Added possibilities for switchs in battle.conf (add some foreign language) [Yor]
- * Protected char-server again disconnection of login-server [Yor]
- * Added possible protection against packet exploits in chrif.c. [Valaris]
- * Login-server: Added an option for the format of the date (log, etc...) [Yor]
- Improved some little code.
- Added log for char-server packets.
- * Correction of prtg_cas03.txt that crash server AT START! [Yor]
- * Added functions of mapflag noskill [Kalaspuff]
-
-06/29
- (Dated On Aegis Website)
- *--Released 1.0.0 RC2--*
-
-06/28
- * Added monsters_ignore_gm option. Monster won't attack GMs if turned on unless attacked and within 1 cell. [Valaris]
- * Added drops_by_luk option in battle_athena.conf. Anything higher than 0 will turn this option on, and act as a mutiplier.
- Example : Setting of 10 with 50 luk would add 5 to the drop rate. So say a card has a drop rate of 2, it would become 7. [Valaris]
- * Fixed range and removed skill failed message from Venom Splasher, also moved some of it's code around. [Valaris]
- * When a player arrive on map-server, time limit of its account is displayed if not unlimited [Yor]
- * Fixed problem where warp portals broke in npc.c [Valaris]
- * Updated atcommand_heal so it works like it should [Kalaspuff]
-
-06/27
- * Changed Venom Splasher so it will increase damage based on level of Poison React (had it set so the player had to be
- using it, but it turns out it doesn't need to be) [Valaris]
- * Venom Splasher now works except for the counter part. Damage is instantly dealt if skill is successful. [Valaris]
- * Improved @item command to make correctly pet eggs [Yor]
- * Updated Chase Walk so you can't attack while you have it casted [?]
- * Removed un-needed code for graffiti from clif.c [Valaris]
- * Added @ban command (to ban a player for a limited time) [Yor]
- * Added @charblock command (you have been blocked by GM team) [Yor]
- * Added the mapflag nowarpto [Kalaspuff]
- * Updated the function of nowarp [Kalaspuff]
-
-06/26
- * When a player is banned (or with a state != 0), he is disconnected [Yor]
- * When sex is changed, skills of other sex are reseted (and skill points increased of the same number) [Yor]
- * To avoid problem with change sex and equipement, changed sex character is unequipped of all equipment [Yor]
-
-06/25
- * Added @charchangesex GM command [Yor]
- * Changed: Changesex is now done after that the login-server has confirmed the change [Yor].
- becuase sex is saved in account file.
-
-06/24
- * Added new classes in change sex script command (buildin_changesex). [Yor]
- * Translated pet_db.txt again [Valaris]
- * Initial implementation of Venom Splasher. Runs checks on target poison status and whether or not hp is less then 2/3.
- Will display skill failed if checks do not pass. Shows effect when successful. [Valaris]
- * Added administration system to change final date of a banishment. [Yor]
- * Added information about banishment in admin packets about an account. [Yor]
- * Updated Chase Walk so it cancels when recasted to fix it. [?]
- * Initial implementation for Chase Walk skill for Stalker Class [?]
- * When an account is banned, message_error_7 is not more modified [Yor].
-
-06/23
- (Dated On Aegis Website)
- *--Released 1.0.0 RC1--*
- * Added bRandomAttackIncrease for Executioner card. Chance stacks, attack does not. [Valaris]
- * Fixed magic_damage_return so it will actually work (for Maya card). [Valaris]
- * Add a ban timestamp in the structure of the accounts. Management not yet make [Yor]
-
-06/22
- * Don't send a message when it's void (packet 0x8e) - client doesn't display it [Yor].
- * Add a refresh time parameter for the html online file (refresh time in the explorer) [Yor].
- * Create a job_name function in atcommand to have the name of the job (suppress repeated code) [Yor].
- * Added New City: Jawaii
- * Fix free memory of online structure at end of char-server [Yor].
- * Remove possible duplicated online players (multiple map-servers) [Yor].
- * Add examples in state command (ladmin) [Yor].
- * Use a function to display warnings in login-server to avoid duplicated messages with import option [Yor].
- * Iinitial implementation for magicdamagereturn for Maya Card [?]
- * skill_out_range_consume - If it is set 'no' the skill will still be cast (like real servers).
- If it is set to yes, skill will fail and sp and items required will be lost. [Valaris]
-
-06/21
- * Updated Sacrifice skill code to be more flexible for user usage [?]
- * Changed SC_ATTACKPOTION and SC_MATTACKPOTION to SC_ATKPOT and SC_MATKPOT, also added it in item_db.txt [?]
- * Guild Territory will now display the # of castles owned or "None Taken". [Valaris]
- * Changed SC_ATTACKPOTION and SC_MATTACKPOTION so the increase can be specified in itemdb.txt.
- Example : sc_start SC_AtkPot,18,30; (+30 atk for 30 seconds) [Valaris]
- * Added SC_ATTACKPOTION and SC_MATTACKPOTION for +30 atk for specified time period (need to get the correct id's yet,
- right now giving wrong icons and wrong message). Added entries in const.txt, need more info to complete these. [Valaris]
- * Fixed so players will always spawn with guild emblem if one is needed. [Valaris]
- * Reduce number of tests in atcommand_character_stats_all (@charstatsall). [Yor]
- * Fix memory management for online players list. [Yor]
- * Party HP now updates instantly on change. [Valaris]
- * Fixed crash when non-guild members are in the area of guardians in attack mode.(Will ignore them) [Valaris]
- * A higher level GM is not displayed by who/who2/who3 if he uses HIDEGM. [Yor]
- * When a GM with HIDEGM relogs, he is always HIDEGM (only GM). [Yor]
- * Improve presentation of online.txt file. [Yor]
- * In /npc/quests/magicalhatquest, corrected checking for and deletion of Mage Hat instead of Wizard Hat. [rg]
-
-06/20
- * Fixed problem with guardian emblems disappearing [Valaris]
- * If a GM use GM HIDE, he is not counted in the number of players [Yor]
- * Setup prtg_cas01 to load guardians on server startup and to spawn them when purchased. Also switched from GuardianDied
- to OnGuardianDied (other way wasn't working). Changed so guardians won't be killed on agitend. [Valaris]
- * Guardians cannot attack and cannot be hurt during non woe time. [Valaris]
- * Switched checking of castle.txt format so it won't wipe guardian hp everytime it loads. [Valaris]
- * Made it so if guardians were installed in old db, that it will set guardians to full hp based on defense and class. [Valaris]
- * Autosave will save guardian HP data. [Valaris]
- * Castle.txt visibleG flags will be set when guardians are killed. [Valaris]
- * Moved emperium defense upgrade to mob.c. [Valaris]
- * Removed guardian hp saving from agitend. [Valaris]
- * Added option to choose which columns are displayed in the online files [Yor]
- * Added option to choose how to sort online players in the online files [Yor]
- * Correction of a new error on guild (from [Valaris]). Old castle.txt files couldn't be readed. [Yor]
- * Kafra Points And Rewards fixed [Darkchild]
- * Kafra file made a lot smaller with DoEvents [Darkchild]
- * Fixed lotsa bugs in Kafra's [Darkchild]
- * Initial implementation for paladin's skill sacrifice [?]
- * Loading/Saving of guardian hp (loads on agitstart, saves on agitend) [Valaris]
- * Added so guardian hp will change accordingly. Moved the guardian defense increase to mob.c [Valaris]
- * Implemented guardian and guardianinfo script commands [Valaris]
-
-06/19
- * Added Ghp0-7 into castle database [Valaris]
- * Added configuration parameters to choose online files filename [Yor]
- * Added online files (txt and html) [Yor]
- * Added choose of authorised letters/symbols for characters names [Yor]
- * Added 3 new Dragon Boat Festival monsters with temporary stats to mob_db [Akaru]
- * Translated more of item_db [Akaru]
- * Added correct effects for Dragon Boat Festival items [Akaru]
- * Solve problem about the change of MAX_GUILDPOSITION by [Valaris] when we load an old guild.txt file. [Yor]
- * Improve allow/deny configuration. Write warnings if necessary. [Yor]
-
-06/18
- * Add heal_payment.txt as an alternative to heal.txt. [Yor]
- * Sex change (char.C): Correct error in jobchange. Disconnect player if connected. [Yor]
- * Sex change/account deletion: Change authentification to avoid that player comes back on char-server within the 5 secondes before disconnection. [Yor]
- * Save configuration of login-server in log file at start. [Yor]
-
-06/17
- * Added fritz's vending exploit fixes. [Valaris]
- * Increased max guild castle size to accomodate for novice guild castles. [Valaris]
- * Fixed investment in prontera castle 1. [Valaris]
- * Implemented of showing guardian hp on guardian investment in prontera castle 1 (factors in defense investment) [Valaris]
- * Added strmobinfo script command. Syntax is strmobinfo(x,y). 'y' is the mob's id. x will show different values.
- 1=english name, 2=jap name, 3=level, 4=max_hp, 5=max_sp,6=base_exp,7=job_exp. [Valaris]
- * Disable % and / for 1st symbol of commands (party chat symbol and standard ragnarok GM commands) [Yor]
-
-06/16
- * Added fully functional economy for Prontera Castle 2 Guild Wars script [Akaru]
- * added fix for cross-class ensemble skills. [?]
- * Increased max guild member limit to accomodate for +2 member increase per extension level
- and increased max position to 56 to accomodate for all members. [Valaris]
- * More of fov's fixes for atcommand.c, chrif.c, and clif.c. [Valaris]
- * added fixes for class checking skills like bard & dancer skills and a priest skill. [?]
- * updated skill_cast_db and skill_require_db.txt [?]
- * changed int_guild.c added +4 for extension skill to match kRO [?]
- * remote administration: add a command/packet to change sex of an account [Yor]
- * Log detailled reason of refused connection in remote administration [Yor]
- * Create a mmo_auth_tostr for accounts [Yor]
- * Add a message when char-server is terminated [Yor]
- * Save deleted accounts (administration deletion) in log file [Yor]
- * Add a message when login-server is terminated [Yor]
-
-06/15
- * Added in fov's fixes for socket.c, atcommand.c, npc.c and skill.c [Valaris]
- * Added a char_log function. Save unreadable characters in log instead of a specific file [Yor]
- * Save invalid account lines in log file. Account will be never lost [Yor]
- * Sort characters of same player with the slot number in the characters file [Yor]
-
-06/14
- * Fix errors in prtg_cas01, prtg_cas05 and MrSmile scripts [Akaru]
- * Added fully functional economy for Prontera Castle 1 Guild Wars script [Akaru]
-
-06/13
- * If player is on map-server when the account is deleted, player is now disconnected [Yor]
- * Correction of char deletion bug when account is deleted [Yor]
- * Added Prontera Castle 5 guild wars script [Akaru]
- * Added Prontera Castle 4 guild wars script [Akaru]
- * Add checks about duplicated character ids and names [Yor]
- * Don't save a reg of a character if its string is void [Yor]
- * Read a character even if a reg string is void (don't suppress the char for that) [Yor]
- * Save characters in account_id order [Yor]
- * Save not readed characters in a file (char file name + "not_readed.txt") [Yor]
- * Display line number when a character can not be readed [Yor]
- * Initialise char_num! Display number of readed characters [Yor]
- * Do right initialization of char_dat [Yor]
- * Add red color for ERROR displays in char.c [Yor]
-
-06/12
- * Change 0 to '\0' for char in login.c. Add red color for ERROR displays [Yor]
- * Optimised Mr. Smile NPC script [Akaru]
- * Add a configuration in atcommand.conf to set the 1st character of ALL commands (Now, you can choose @, #, !..., any char that is not control character) [Yor]
- * Optimised Prontera Castle 1 and 2 guild wars scripts [Akaru]
- * Added Prontera Castle 3 guild wars script [Akaru]
- * Changed Graffiti placement, will allow placement of one painting at a time (old one will be replaced). [Valaris]
- * Graffiti displays to other plays and remains on map for set time period. [Valaris]
-
-06/11
- * Initial implementation of graffiti (does not change directions yet (vertical/upsidedown) and doesn't dissappear [Valaris]
- * Add config_switch (0/1, yes/no, ...) for char-server configuration [Yor]
- * Add a display when a player does a connection [Yor]
- * Add a display when a remote administration does a connection [Yor]
-
-06/10
- * Improve compiling instructions for cygwin (socket.h) (depends of the cygwin version). [Yor] with help of [Lostsoul]
- * Add parameters in login.conf to display or not parse information [Yor]
- * Remove some repeated codes in ladmin / add example when error of command [Yor]
- * Remove delete_session error in login.c (sorry) [Yor]
- * Display correct message for char-server disconnection [Yor]
- * Finish translation of ladmin [Yor]
- * Fixed Various Npc Bugs [Darkchild]
- * Added green colour for READY displays in char-server, login-server and map-server [Akaru]
-
-06/09
- * Add some comments in ladmin [Yor]
- * Remove displaying of packet 0x2714 from login-server [Yor]
- * Correct length of password send to login-server in char-server [Yor]
- * Char-server/login-server: put default lan to 127.0.0.1 instead of any hasardous value [Yor]
- * Change displaying of the title [Yor]
- * Optimised twin towers script to use duplicate [Akaru]
- * Edited to a more user friendly error message for invalid server communication password [Akaru]
- * Updated the item_db for more item name consistencies [Akaru]
- * Reverted training grounds back to new_1-?.gat maps. [Valaris]
- * Added added more variety to sending packets to guild members (same map, same map w/out self, ect) [Valaris]
-
-06/08
- * Put a HOWTO in lan_support.conf. [Yor]
- * Removed extra semicolons in char.c, map.c, and pc.c. [Valaris]
- * Added missing } to clif_storageitemlist in clif.c and found a couple lines ending with 2 semicolons, removed them. [Valaris]
-
-06/07
- * Translated refine_db.txt. [Valaris]
- * Negative vending fix. [Fritz]
- * Correction of mktime parameters in ladmin + some translations [Yor].
- * Add some checks on login-server configuration parameters [Yor].
-
-06/06
- * Fixed error in skill_tree.txt that would crash some people's servers when changing to Professor. [Valaris]
- * Added admin_state directive for enabling and disabling remote administration, instead of testing whether admin_pass == "" [rg]
- * Add title to the servers. [Yor]
- * Add warnings about default password usage (administration and gm passwords). [Yor]
- * Modify adduser.c for the default configuration. [Yor]
- * Write the complete admin_packet.txt. [Yor]
- * Champion NPC was looking for a priest instead of monk, changed to correct value. [Valaris]
- * Small fixes in guide.txt, kafra.txt, and swordsman.txt pointed out by StiNKy. [Valaris]
- * Begin splitting monsters.txt [Akaru]
- * Removed obselete monster spawn files [Akaru]
- * Complete Guild Wars for Prontera Castle 2 script done [Akaru]
- * Fixed prevent_logout option. [Valaris]
-
-06/05
- * Implemented guild castle regen.(Stackable 2x for castle owners) [Valaris]
- * Fixed player logout display on map-server console. [Valaris]
- * Added atcommand_spawn_quantity_limit directive to /conf/battle_athena.conf [rg]
- * Fixed noskill map flag [?]
- * Complete information about login configuration in conf_ref.txt [Yor]
- * Add possible configuration values on/off or yes/no in login-server [Yor]
- * Guardians and emp will now get +2000 hp for every defense investment within a castle [Valaris]
- * Changed the login server to reject all remote administration authentication if the admin_pass directive isn't set, and commented-out the admin_pass directive in /conf/login_athena.conf [rg]
- * Changed /src/common/grfio.c so it doesn't try to read GRF files with no respective directive in /conf/grf-files.txt [rg]
- * Changed so no one can spawn inside castles. [Valaris]
- * Updated item_db with more consistant names, fixed some unknown_items [Akaru]
- * Complete Guild Wars for Prontera Castle 1 script done [Akaru]
- * Disabled guild breaking, alliance breaking, and alliance making during WoE. [Valaris]
- * Will not default to prontera.gat if map-server is not connected. [Valaris]
- * Warp players who are not in guild out of castles when WoE starts. [Valaris]
-
-06/04
- * Allies now do no damage to guardians or emperium. [Valaris]
- * Prevent allies from being attacked by guardians. [Valaris]
- * Optimized guardian emblem code. [Valaris]
- * Fixed map-server crashing with spawning guardians in untaken castles. [Valaris]
- * Guardian emblems will change if castle is taken, but client needs to refresh map. [Valaris]
- * Fixed problem where guild emblem would vanish from guild info screen. [Valaris]
-
-06/03
- * Improve e-mails checks and LAN/WAN checks on char-server. [Yor].
- * Add some explanations in front of accounts file. [Yor]
- * Set a non LAN configuration for basic configuration in lan_support.conf. Explain parameters. [Yor]
- * add missing parameters of char_athena.conf, and explain them. [Yor]
- * Restore default admin pass and gm pass of login_athena.conf, and add missing parameters. [Yor]
- * fix missing include in char.c. [Yor]
- * Translation of checkversion. Add some explanations in front of file. [Yor]
- * Translation of getlogincount [Yor]
- * Finish translation of new login.c [Yor]
- * Implemented Guardian Emblems [Valaris]
-
-06/02
- * Added maximum_level option in battle_athena.conf [Valaris]
- * Added maximum level cap to all the level up commands. [Valaris]
- * Added "Deal has been cancelled" message to Fritz's input exploit fix. [Valaris]
-
-06/01
- * Fixed training ground npcs and warps, removed depreceated maps, using new ones. [Valaris]
-
-05/30
- * Small map-server crashing fix with Leo and Guide npcs in training ground [Valaris]
-
-05/29
- * Removed item_value_db.txt and all references to it [Valaris]
- * Removed unused class_equip_db.txt [Valaris]
- * Fixed stat and level reset bug where needed status points wouldnt reset unless relogged [Valaris]
- * @monster will summon monster without an amount specified [Valaris]
-
-05/28
- * Added heal and usable item rate modifier [Valaris]
- * Added pet equipment to equipment rate modifier [Valaris]
- * Added option to turn alchemist summon experience and drops on and off [Valaris]
- * Alchemist Marine Spheres now randomly explode [Valaris]
- * Fixed bug where if certain items lowered max hp (4 mysteltain, and 1 eddga) below 0
- would loop to server max hp value. [Valaris]
-
-05/26
- * Added New Hats [Darkchild]
- * Added New Monsters [Darkchild]
-05/23
- * Added @charstatsall, views all characters (easy for money bug scaning etc! [Fritz]
- * Max to input npc command, 0 is lowest, 99999999 is max, this to prevent money bugs! [Fritz]
-
-05/21
- (Dated On Aegis Website)
- *--Released 0.5.2--*
-
-05/20
- (Dated On Aegis Website)
- *--Released 0.5.1--*
- * got dye working again [Darkchild/fritz]
-
-05/19
- (Dated On Aegis Website)
- *--Released 0.5.0--*
-
-05/09
- * added Prontera Guild Castle 3 test guild wars test script [Akaru]
- * modified Prontera Guild Castle 1 and 2 guild wars test script [Akaru]
- * fixed several valkyrie jobchangers [Akaru]
-05/08
- (Dated On Aegis Website)
- *--Released 0.4.2--*
- *--Released 0.4.1--*
- * added Prontera Guild Castle 2 test guild wars test script [Akaru]
-
-05/07 (Dated On Aegis Website)
- *--Released 0.4.0--*
-
-05/06
- * added Prontera Guild Castle 1 test guild wars test script [Akaru]
-05/04
- * removed parses and added ENGLISH! [?]
-
-04/29 (Dated On Aegis Website)
- *--Released 953 Delta--*
-
-04/28 (Dated On Aegis Website) (Whose Ideas Were These?)
- *--Released 953 Gamma--*
-04/27
- *--Released 951 Beta--*
- * fixed @jobchange crash [credits to Mugendai, commited by Akaru]
-
-04/25 (Dated On Aegis Website)
- *--Released 947 Alpha--*
-04/23
- * added more Professor Skills and added checks [?]
-04/10
- * added more upper skills from moonsoul's works [?]
-02/12-04/10
- * CVS Down - Not Many changes could be made...*
-
-02/22 (Dated On Aegis Website)
- *--Released 817--*
-
-02/12
- * added more mob skill conditions (friendstatuseq, mysyatuseq, friendhpltmaxrate) [RoVeRT]
-02/06
- * dumped @skillall for @allskill [?]
-02/05
- * fixed provoke so it doesnt work on undead [RoVeRT]
- * added TyrNemesis^ card removal code and min/max settings [RoVeRT]
-02/04
- * added start_zeny and party_level_range to char_athena.conf [RoVeRT]
-02/03
- * Improved the prontera.gat map fallback. [Sara-chan]
- * Improved the way guild emblems act when logging in. [Sara-chan]
- * Undead-class armor, and Undead monster themselves will never be frozen [RoVeRT]
- * fixed negative values for NPC to always be 0
-01/26
- * mob_warpslave correction [RoVeRT]
-01/25
- * added poison hp reduction [AppleGirl]
-01/20
- * added intimidate [RoVeRT]
- * added mvp checks for some skills
-01/17
- * added skill check for empelium attack and removed drops from NULL kills [RoVeRT]
-01/16
- * added secondary effects for when characters with appropriate elemental armor
- are within area of effect of sage spells SA_VOLCANO(atk up), SA_DELUGE(max hp up),
- SA_VIOLENTGALE(flee up) [moonsoul]
- * removeal of @randmon as it isnt needed [RoVeRT]
-01/15
- * fixed auto spell so it works the prober way [RoVeRT]
-01/12
- * added mob_warpslave [RoVeRT]
- * added mob_warp to check noteleport mapflag
-01/07
- * added OnCommand for NPC [RoVeRT]
- * added new on death method for NPC spawned mobs [RoVeRT]
- * added mobcount [RoVeRT]
-01/06
- * fixed icon status for spear quicken [AppleGirl]
- * added quoted name support for @monster [RoVeRT]
-01/05
- * added indivudal support for card and equip drop rates [RoVeRT]
-01/04
- * added TF_PICKSTONE and skill check condition for TF_THROWSTONE [AppleGirl]
- * added updated cast_db.txt and fixed SA_VOLCANO, SA_DELUGE,
- SA_VIOLENTGALE, and SA_LANDPROTECTOR GRAPHICS [AppleGirl]
- * Fixed Effects of a few bard Skills. [AppleGirl]
- * added option to stop logout for 10 seconds after taking a hit [RoVeRT]
-01/03
- * added inet_ip support to char and map [RoVeRT]
- * added checkcart, checkfalcon and checkriding npc commands
-01/02
- * added new npc timer support that is independant of a player [RoVeRT]
-12/31
- * Added @refineall [Mark]
-12/30
- * added support for custom_item-db.txt with battle_athena.conf option [RoVeRT]
- * fixed @charzeny bug
- * translated help.txt to english anong with a few other files [RoVeRT]
-12/29
- * added umbala maps to map_athena.conf [RoVeRT]
-12/26
- * added Skill_range based on level, and partially working AutoGuard [Moonsoul]
- * added Correction of Whip and Instrument Damage Again [Sara-Chan]
-12/25
- * Spear Quicken Correct Graphics,Fixed Magnum Break (Which Fixes All Other
- Splash skills), and Fixed Brandish Spear [AppleGirl]
- * Updated Command For @SkillAll Added Atcommand_athena.conf [RoVeRT]
-12/24
- * Added Side Effects for multiple skills for 2-2 classes [AppleGirl]
-12/23
- * Added GM Command Called @Skillall [RoVeRT]
- * @skillall to skill-up all your current skills [RoVeRT]
- * @hide does hide you from all monsters [RoVeRT]
- * fire wall limited to 5 per map [RoVeRT]
- * to turn on PVP without @pvpon and to disable flywing search for mapflag [RoVeRT]
- * no luck with @morph at this time yet [RoVeRT]
- * splash attack added but still kinda buggy [RoVeRT]
- * Added in Dancing and Song Playing for Bard and Dancer [AppleGirl]
- * Added Skill Arrow Check For Archer Skills [AppleGirl]
- * Added Skill Status Recovery [AppleGirl]
- * Added Skill Bard and Dancer Skills Last Longer [AppleGirl]
- * Added Skill Grimtooth does splash damage [AppleGirl]
- * Added Skill Steal Fixed and Snatcher [AppleGirl]
- * Added Skill SonicBlow only works with Katars Now [AppleGirl]
-12/22
- * Added Skills Shield Boomerang, Shield Charge, and Defender [AppleGirl]
+Date Added
+
+-------- Read Changelog-SVN.txt for the newer SVN entries--------
+
+2006/04/30
+ * Skills with the move_enable state won't get the walkdelay increased on a
+ skill-cast. [Skotlex]
+ * Some corrections in the clif_parse_whisper function which should fix
+ crashes in the chat_log under "certain" conditions. [Skotlex]
+ * Fixed dangling pointer in pc_steal_item (missing lines) causing crash. [Lance]
+ * Fixed lack of initialization in chrif_authreq causing crashes in chrif_authok. [Lance]
+ * Fixed a logic error that was likely the cause of pet loot drops not
+ working. [Skotlex]
+ * If someone is expulsed from a guild while the guild storage is open, it
+ will be auto-closed now. [Skotlex]
+ * Modified battle_consume_ammo to prevent consuming multiple arrows on
+ AC_SHOWER. [Skotlex]
+ * Readded script command skillpointcount... [Skotlex]
+ * Fixed and enabled STEAL skill [Lupus]
+ * Implemented NJ_SHADOWJUMP. [blackhole89]
+ * Moved the soul-drain code to skill_counter_additionaleffect [Skotlex]
+ * Fixed fake NPC missing code. Thanks to Skotlex for pointing out. [Lance]
+
+2006/04/29
+ * Changed the HT_DETECTING method from invoking clif_changetraplook to
+ clif_skill_setunit since in the first the client ignores the fact that it
+ is now a trap (rendering skills like Remove Trap useless). [Skotlex]
+ * added script command skillpointcount. Returns total amount of skill
+ points a char has (the value returned is the same that SkillPoint would
+ have after invoking a skill reset) [Skotlex]
+ * Modified Defender. Speed reduction is 35-5*lv%, damage reduction on
+ devoted chars is 5+5*lv%. These values are custom, but should be closer to
+ "reality" than what we had. [Skotlex]
+ * When you have the wrong ammo type equipped, the equip arrows first
+ message will be sent, as suggested by Haplo [Skotlex]
+ * Changed checks of item's identify field from 0/1 to 0/non-zero [Skotlex]
+ * Corrected TK_JUMPKICK to place the caster on the tile next to the target
+ rather than on top of it. [Skotlex]
+ * Small change in pc_calc_skilltree which should fix the infinite loop...
+ [Skotlex]
+ * Added @noask command: enable/disable deals/invites autorejecting.
+ [LuzZza]
+ * Removed unreferenced local variable in pc.c [Lance]
+ * Reverted npc_checknear to exclude check for class_ -1.
+ * Removed npc_checknear in npc_buysellsel, npc_selllist and npc_buylist
+ as enough preventive measures of hacking are already implemented.
+ [Lance]
+ * Updated STEAL skill (WIP), added a battle config option: [Lupus]
+ 'skill_steal_max_tries' to set max number of stealing tries.
+ It could help to fix stealing exploit on mobs with few drops
+ * Added support for packet 0x229 (clif_changeoption). [Skotlex]
+ * Bumped up PACKETVER to 7 to enable use of packets 0x229 and 0x22c
+ [Skotlex]
+ * Added missing next/prev initialization in chat-creation. [Skotlex]
+ * Added missing sql-files/mob_db.sql... somehow it was missing from the
+ mob_db update. [Skotlex]
+ * Clones can't be class-changed now [Skotlex]
+ * Readded the class == -1 distance check in npc_checknear [Skotlex]
+ * Replaced check sd->trade_partner for sd->state.trading in clif.c [Skotlex]
+ * Using malloc for memory allocations that doesn't need to be pre-initialized.
+ * Eliminated initializations for pointers returned by calloc.
+ * Moved grfio_final to do_init since it's not used after server boot.
+ * Optimized scripts to return CONSTSTR instead of allocating memory just to return
+ a constant string. Some buildin functions still need work.
+ * Disabled graph since it doesn't work yet. [Lance]
+
+2006/04/28
+ * Modified the mob_db structure. The mvp related columns were moved to
+ before the drops, amount of drops increased from 10 to 15. [Skotlex]
+ * Updated sql-files/mob_db.sql (and mob_db2.sql) to latest. [Skotlex]
+ * Modified HP conversion so that it fails when you don't have enough Hp.
+ [Skotlex]
+ * Cleaned up Strip skills so that the skill animation will only show when
+ something was stripped. [Skotlex]
+ * Added constant MAX_MOB_DROP to specify the amount of normal drops a mob
+ has. The mob_db reading code will automatically parse the file according to
+ the number of drops expected (the Mexp/Mper and MVP item rewards must still
+ be after the normal drops). Set to 10 currently. [Skotlex]
+ * Mobinfo's drop list will use jName rather than Name for drop names.
+ [Skotlex]
+ * Some cleaning of the ASC_BREAKER code in skill_attack [Skotlex]
+ * Modified skill_attack so that all skills with amotion get their damage
+ delayed (should fix mob walk-teleport issues) [Skotlex]
+ * Added function stristr to strlib.c, used by mob.c and item_db.c for
+ case-insensitive seeks. [Skotlex]
+ * Removed the sending of the online guild list when you log-on, may fix the
+ "getting stuck" problem. [Skotlex]
+ * Added battle config default_skill_delay. Specifies the default skill
+ delay for most skills, it is also applied as a walkdelay (total skill
+ walkdelay is default_skill_delay + that skill's can't walk delay) [Skotlex]
+2006/04/27
+ * skill_castend_id and skill_castend_pos will trigger unit_stop_walking
+ with flag 1 (fix pos) rather than none. Should fix some skills making you
+ appear moving while doing them. [Skotlex]
+ * Modified clif_skill_nodamage to allow for a NULL source. This is to
+ simplify code related to AL_HEAL/MG_RECOVERY effects where someone shows a
+ healing value, but there's no "caster" in sight (Pitcher skills, Blood
+ Drain, Kaahi) [Skotlex]
+ * Updated Kaahi to use clif_skill_nodamage to display amount healed.
+ [Skotlex]
+ * Added unlocking ud.target on mob_unlocktarget, fixes mobs chasing you
+ around while cloaked. [Skotlex]
+ * Changed the default rate of clone mob skills to 5% modified by
+ mob_skill_rate setting. [Skotlex]
+ * Applied some changes in unit.c to make mobs pick chase paths as they
+ should. [Skotlex]
+ * unit_remove_map will reset attackable-time, canact and canwalk delays.
+ [Skotlex]
+ * Added a timer in clif.c so that walk requests that are done while your
+ cannot move duration will be delayed and processed afterwards (as long as
+ the walk delay remaining is less than 2000 ms) [Skotlex]
+ * Some changes in the slave skill conditions. All their skills are
+ triggered at a 10% chance now. [Skotlex]
+ * Changed in the behaviour of wedding skills, they should be getting all
+ the land-skill checks now. [Skotlex]
+ * Small change in @commands, may fix the null-pointer error. [Skotlex]
+ * Changebase script command will also refresh the weapon sprites (in case
+ you changed into Wedding/Xmas class) [Skotlex]
+ * Small change in the pet_ai that should stop the "strange" catch-up
+ behaviour of pets when you are much faster than them. [Skotlex]
+ * Corrected the unequip script of the wedding dress/tuxedo (it should be
+ Class, not bClass), item_db.sql was also corrected. [Skotlex]
+ * Small change in the pet_ai that should stop the "strange" catch-up
+ behaviour of pets when you are much faster than them. [Skotlex]
+ * Now when you do @baselevel to reduce your level and you don't have enough
+ stat points to deduct, you will get a stat-reset and THEN your stat points
+ will be reduced. [Skotlex]
+ * Added at command @commands, displays the list of commands available to
+ you. Defaults to level 1. [Skotlex]
+ * Added the missing clif_* calls to make changebase's view-class change
+ update on the client. [Skotlex]
+ * Added battle config hide_woe_damage which hides damage on woe maps
+ packet-wise (battle/client.conf). [Skotlex]
+ * Fixed base-level up @ command giving stat points instead of taking them
+ away when leveling down. [Skotlex
+ * Some small change in pc_heal which would let you have negative SP if you
+ were killed on the same pc_heal invocation. [Skotlex]
+ * Added 3rd argument to script command 'setmapflag' thx to Jbain [Lupus]
+ setmapflag "prontera.gat",mf_pvp;
+ setmapflag "prontera.gat",mf_jexp,100;
+ Now you can dinamically increase/decrease EXP rate on set maps
+ e.g. you can lower EXP on the cmd_fild02 ^_-
+2006/04/26
+ * Updated sql-files/item_db.sql to current. [Skotlex]
+ * Item use interval is set to a default of 100ms now since that should be
+ low enough to not bother real players and it should cap somehow bot/macro
+ spams. [Skotlex]
+ * Updated Full Buster so that the can't act delay carries on to the weapon
+ attack delay and can't use item intervals. [Skotlex]
+ * Added script command getbattleflag to retrieve the current value of a
+ battle_config switch. [Skotlex]
+ * When Taekwons level up they get Bless and Agi Up level 10 instead of the
+ S.Novice bonuses. [Skotlex]
+ * Increased number of hits for TK kicks. 3 hits for TK_COUNTER and
+ TK_TURNKICK, 2 hits for TK_STORMKICK and TK_DOWNKICK (until further
+ information arrives) [Skotlex]
+ * Modified how changebase script command works, the change caused by it is
+ permanent (at least until logout). Updated the Tuxedo and Wedding dress to
+ use onequip/onunequip scripts to change the look. [Skotlex]
+ * Changed the skill_wall_check to use shoot-path seeking. May fix
+ skill_wall_check setting. [Skotlex]
+ * Fixed typo in skill.c: skill_clear_group [Lance]
+
+2006/04/25
+ * Added battle config traps_setting to determine how traps should behave.
+ With &1 traps are invisible if you didn't see them get set up. With &2
+ traps will be removed after changing maps. The default is 2.
+ (battle/skill.conf) [Skotlex]
+ * Cleaned up a bit the implementation of SC_MAXIMIZEPOWER, SC_CHASEWALK and
+ SC_CLOAKING to prevent infinite looping timers. [Skotlex]
+ * Fixed NPC_SUICIDE dropping items. [Skotlex]
+ * Moved the mapflag skill restrictions from skill_checkcondition to
+ skillnotok, this makes auto-spells not work in maps where they aren't
+ allowed. [Skotlex]
+ * Added TK_HIGHJUMP to skillnotok, the skill is blocked in noteleport maps
+ (with the exception of gvg ones) [Skotlex]
+ * Modified and simplified the random item group format. It now is
+ <GroupID>,<ItemID>,<Rate>, where Rate normally is 1, greater numbers is the
+ equivalent of adding the line multiple times. Also has support for import
+ lines. [Skotlex]
+ * Added constants to identify all item groups to db/const.txt [Skotlex]
+ * Cleaned up and updated item_db to use these new constants (warning:
+ item_db.sql needs to be updated! Sql-db users should not update until this
+ file is updated) [Skotlex]
+2006/04/24
+ * Simplified npc_gettimerevent_tick so that it should return a tick value
+ even after the last ontimer label has been reached. [Skotlex]
+ * All GMs will be sent to the char server through packet 0x2aff now.
+ (previously hidden gms were not sent to the char-server as online) [Skotlex]
+ * Made mob_searchname compare versus sprite, name and jname now. [Skotlex]
+ * Added script command escape_sql. It will return an escaped string for use
+ in the sql_query script command (in case you want to use input of players
+ in your queries). [Skotlex]
+ * Removed the skill packet from TK_RUN as the client ignores the walkok
+ packet sent right after it. It displays just fine on the client now. [Skotlex]
+ * Added DNS Blocklist support. Set in login_athena.conf.
+ I'll make it more customizable tomorrow, I coded it pretty bad. [Zido]
+ * Corrected mob_spawn_delay/boss_spawn_delay/plant_spawn_delay settings
+ (they were named rate rather than delay in monster.conf) [Skotlex]
+ * Cleaned up @grind2, @monsterbig, @monstersmall. [Skotlex]
+ * Modified override_mobs_names to work only on the mob spawn files instead
+ of everywhere (so now script-summoned mobs should keep their custom names
+ intact) [Skotlex]
+ * Added logging of deleted characters when the char_log is enabled.
+ [Skotlex]
+ * Fixed skill_delayfix not altering delay at all after you reached 150.
+ [Skotlex]
+ * Applied ers to pet loot drops and cleaned up the pet loot drop function.
+ [Skotlex]
+ * Mob skill state MSS_ANY won't include MSS_DEAD now. [Skotlex]
+ * Added mob skill state MSS_ANYTARGET ("anytarget") which means any state
+ (except dead) on which the mob has a target set. [Skotlex]
+2006/04/23
+ * Added new column to mob_db Sprite_Name to hold the mob's sprite name.
+ Columns Name and JName now hold the mob's english and kro names
+ respectively. [Skotlex]
+ - Currently both Name and Jname have the KRO names, so someone will have to
+ update the Name column with the english Mob Names.
+ * Updated mob_db.sql and mob_db2.sql to latest. [Skotlex]
+ * Added battle_config option override_mob_names to make the spawned mob use
+ the mob_db names instead of the specified names in the spawn files.
+ Defaults to 0, 1 is to use Name column while 2 is to use the JName column
+ (see battle/monster.conf) [Skotlex]
+ * Idle skills won't trigger while the mob is walking (that is for the state
+ "walk") [Skotlex]
+ * Idle skills will now trigger each IDLE_SKILL_INTERVAL iterations (10
+ currently) [Skotlex]
+ * Added support for walk packet 0x22c, will be used when PACKETVER is set
+ to 7 or above (packetver is still set to 6 for now) [Skotlex]
+ * Normal walking will now also trigger mob skills (due to the walk skill
+ condition) [Skotlex]
+ * additional experience multiplicator as mapflags which is based off battle.conf
+ so with battle.conf rates 200 and "mapflag <jexp/bexp> 200" it will be 4x
+ on this specific map and 2x anywhere else [Jbain]
+2006/04/22
+ * Angelus was giving more bonus than it should. Fixed. [Zido]
+ * Added Option constants for Carts, fixed OPTION_FLYING (it conflicts with
+ OPTION_XMAS?) [Skotlex]
+ * Updated clif.c to check for OPTION_WEDDING|OPTION_XMAS instead of view
+ class to block attacks and skill usage. [Skotlex]
+ * Cleaned up change-cart code. [Skotlex]
+ * Modified SC_XMAS to not change your view anymore and only set the proper
+ option value (OPTION_XMAS) [Skotlex]
+ * Cleaned up the code regarding char_gm reading. [Skotlex]
+ * Changed the option field to unsigned short to make room for the higher
+ values. [Skotlex]
+2006/04/21
+ * SC_CLOAKING's val4 now holds whether cloaking ends or not on attack.
+ [Skotlex]
+ * Implemented NPC_INVISIBLE, it starts SC_CLOAKING with val4 set to 1.
+ [Skotlex]
+ * Updated the HP/SP leech structures to have race-data attached to them.
+ [Skotlex]
+ * Merged all leeching code to new battle_drain function. [Skotlex]
+ * Simplified a bit the code for Signum Crucis [Skotlex]
+ * Added script bonuses: [Skotlex]
+ bonus3 bHPDrainRateRace,<Race>,<Activation Rate>,<Drain %>;
+ bonus3 bSPDrainRateRace,<Race>,<Activation Rate>,<Drain %>;
+ bonus2 bHPDrainValueRace,<Race>,<Value>;
+ bonus2 bSPDrainValueRace,<Race>,<Value>;
+ * Fixed items not really getting unequipped when they should. [Skotlex]
+2006/04/20
+ * Fixed the equip/unequip scripts not triggering for compounded cards.
+ [Skotlex]
+ * Char server will now ignore packet 0x65 for already authentified
+ accounts. [Skotlex]
+ * Added two columns to item_db: equip_script and unequip_script are scripts
+ that are executed once when the corresponding item is equipped or
+ unequipped respectively. [Skotlex]
+ * Removed bonuses bDamageWhenUnequip, bLoseSPWhenUnequip as they are no
+ longer needed. [Skotlex]
+ * Updated sql-files/item_db.sql with latest. [Skotlex]
+ * Fixed buffer overflow in clif_MainChatMessage. It now prints a Debug
+ message with the offending line. [Skotlex]
+ * Cleaned up a bunch of GS/NJ skills [Skotlex]
+ * Fixed Gatling Fever crashing server when used by non players. [Skotlex]
+ * Added support for n to specify minutes to @charban. [Skotlex]
+ * Added state.trading to specify when a trading has started. Now you should
+ be able to walk around until the trade is either rejected or started.
+ [Skotlex]
+ * Armor defense is no longer reduced by the amount of characters targetting
+ you. [Skotlex]
+
+2006/04/19
+ * Updated the doc/script_commands.txt documentation in regards to npc mob
+ spawn lines. [Skotlex]
+ * Added back the "you can't walk delay while attacking" to
+ unit_attack_timer, now when you want to walk during your attack animation,
+ you will only stop attacking, you will have to click again to move.
+ [Skotlex]
+ * Fixed a pair of wrong mapflag lines in nopvp.txt [Skotlex]
+ * Removed the max cap of autoloot so you are now allowed to set autoloot
+ values above 100. [Skotlex]
+ * Initialized w1/w2/w3/w4 before reading each npc line to avoid sending
+ unread values to the parsers (for example, if w4 has a value in one line
+ and none on the next, it will be parsed with the previous value of w4 on
+ the following lines), this could cause serious problems with mapflags and
+ the recent "off" addition. [Skotlex]
+ * Updated getpartymember to receive an int which specifies what to
+ retrieve. 0: Character names (array $@partymembername$), 1 character char
+ ids (array $@partymembercid), 2 character account ids (array
+ $@partynameaid). By default it returns party member names. [Skotlex]
+ * Updated script_commands.txt with the updated behaviour of getpartymember.
+ [Skotlex]
+
+2006/04/18
+ * Fixed a typo in map_search_freecell which was returning incorrect cells
+ according to the ranges given. [Skotlex]
+ * A tiny fix to @kami [Zido]
+ * The IRC Bot can now autojoin when kicked, set in irc_athena. [Zido]
+ * Added @who to the IRC Bot, outputs all online characters. [Zido]
+ * Changed the memory manager fatal errors when allocating memory to print
+ out the size request as well as the file and line where they originated.
+ [Skotlex]
+ * Fixed the delete_timer (@summons, alchemist plants) not invoking
+ unit_free, hence causing memory leaks and the like. [Skotlex]
+ * Applied jA's patch to fix a bug in the scripting engine in regards to
+ priority of operators. Thanks to End of Exam for the information. [Skotlex]
+ * Removed message 592 from trade.c [Skotlex]
+ * Added support for disabling mapflags on a mapflag line: [Skotlex]
+ comodo.gat mapflag nomemo <- turns on nomemo mapflag
+ comodo.gat mapflag nomemo off <- turns off nomemo mapflag
+ * Removed mapflag nopvp due to the above change. [Skotlex]
+ * Cleaned up and optimized the restricted/zones mapflag. Restricted cards
+ will just not work in disallowed maps rather than blocking the compounded
+ equipement from being used. [Skotlex]
+ * Converted the format of the battle conf files to windows format [Playtester]
+ * Shinomori's method (kinda) of remote script execution with interaction. [Lance]
+
+2006/04/17
+ * skill_clear_unitgroup is now invoked in unit_remove_map only on death if
+ the applicable battle setting is set. [Skotlex]
+ * Changed setting clear_unit_ondeath to a type 4 (bl-based) which defaults
+ to BL_ALL. [Skotlex]
+ * Fixed Absorb spirit sphere not working on mobs, thanks to Vividd.
+ [Skotlex]
+ * Cleared the ud->target on pc_stop_attack to prevent attack resuming an
+ other such oddities. [Skotlex]
+ * I seem to have broken @kami with my last commit, fixed. [Zido]
+ * Added @users to the IRC Bot, outputs the # of users online. [Zido]
+ * The baby check when wearing a tuxedo/dress now works [Zido]
+ * Fixed pet being incorrectly removed when it had intimacy 0. [Skotlex]
+ * Some cleanup in the TK_RUN related code. [Skotlex]
+ * Added variable walk_count to unit_data to be use as a counter for cells
+ walked for walk-triggered skills, on-chase skill triggers are now done
+ every 5 cells (it is the closest value that makes the average mob trigger a
+ chase skill every second). [Skotlex]
+ * mob_skill_db needs updating since it's current use rates for chase-skills
+ assume the trigger is every 100ms rather than every second.
+ * Fixed TK_RUN having a cast-bar when attempting to stop-running and
+ generating timer_delete errors when halting as well. [Skotlex]
+ * Clearing the dummy npc after fooling the client. [Lance]
+ * Updated DLLS. Please DO NOT update the libs from now on
+ (except if mySQL has newer builds which are not compatible
+ with client DLL). [Lance]
+
+2006/04/16
+ * Fixed the first call to the walk timers having the tick interval halved,
+ which made all walking timers be off by half cell with the actual position
+ displayed client-side (so everyone reaches destination cell server-side
+ half-cell before the client). [Skotlex]
+ * Fixed being halted when you are walking so that: 1. Your position
+ refreshed on the screen is correct (the current tile if you haven't reached
+ at least half path between the current and next tile and the next tile
+ otherwise) and 2. If you are halted before walking even one cell, you will
+ be moved to the next cell (to effectively prevent stun-locking). [Skotlex]
+ * Modified @monster command to use map_search_freecell (prevents mobs
+ spawning on non-walkable tiles) [Skotlex]
+ * Modified @nuke to invoke skill_cast_nodamage_id instead of the damage_id
+ version (fixes sprite and splash damage for the skill) [Skotlex]
+ * Fixed char-sql server still reading the old lanconfig format rather than
+ the new one. [Skotlex]
+ * Removed water_height.txt reading (since it is always done from the rsw
+ now) [Skotlex]
+ * Fixed a possible crash in grfio_find_file [Skotlex]
+ * Corrected water-level-reading to account for a return of null from the
+ previously mentioned function [Skotlex]
+ * Fixed mysql ping setting being in minutes rather than hours. [Skotlex]
+ * Removed npc_event_sub from npc.h and moved it to npc.c [Skotlex]
+ * Cleaned up #warp to prevent spitting non-walkable tile warnings. [Skotlex]
+ * Changed the meaning of msg_athena 2, it is now "invalid target cell,
+ randomizing". [Skotlex]
+ * Fixed wrong check of Deluge + Suiton which broke the water-requirement
+ check for skills. [Skotlex]
+ * Cleared ud->target on remove-map, it should fix the phantom mob sprite
+ issue. [Skotlex]
+ * Temperory fixed compiler warnings/errors. Please compile before commiting.
+ [Lance]
+ * Added pcre3.dll, zlib1.dll and libmysql.dll. DO NOT DELETE THEM.
+ (Required by systems without these DLLs preinstalled) [Lance]
+ * Experimental npc_event_doall_sub with queue and npc_id allocation when needed.
+ [Lance]
+ * Added warnings to npc_scriptcont for easier debugging. [Lance]
+ * Missing lines in npc_parse_script! [Lance]
+ * Sending fake npc for inputs and menus for NPC without map coordinates. [Lance]
+
+2006/04/15
+ * Fixed upgrade_svn5902.sql, thanks to Koshiro for pointing it out.
+ [Skotlex]
+ * Updated skill_attack to allow characters not on a map to attack (enables
+ traps and the like to work when they aren't cleared on the character's
+ death) [Skotlex]
+ * Removed use of packet 0x1c9 for skill_unit display, except for Graffiti
+ (which is the only unit which requires the much larger packet) [Skotlex]
+ * clif_getareachar_skillunit will send the unit_id of UNT_ATTACK_SKILLS for
+ traps (this is to prevent them from displaying on the client) [Skotlex]
+ * Updated libs, Updated vc project files, And deleted uneeded DLLs.
+ Credits to ALZ. [Zido]
+2006/04/14
+ * Updated sql-files/mob_db.sql to current. [Skotlex]
+ * Fixed being able to do all the stuff you shouldn't be able to during the
+ petrifying state. [Skotlex]
+2006/04/13
+ * Updated sql-files/item_db.sql to current. [Skotlex]
+ * Added an Info message when pinging the SQL servers. [Skotlex]
+ * Fixed crash when looking for SC_MIRACLE in battle_calc_weapon_attack
+ [Skotlex]
+ * Some more standard C code cleanups. [Skotlex]
+ * atcommand_param and charcommand_stats to make them standard C (so it may
+ compile with the Borland C). Also cleaned atcommand_param against
+ overflows. [Skotlex]
+2006/04/12
+ * Removed the noteleport mapflags from two juperos maps [MasterOfMuppets]
+ - added the nopenalty mapflag to hugel.gat
+ * Halved the aftercast delay of auto-casted spells. [Skotlex]
+ * Allowed auto-spells to retrigger themselves. [Skotlex]
+ * Changed slave chasing from using unit_walktobl to map_search_freecell +
+ unit_walktoxy, since the previous behaviour makes all slaves always end up
+ on the same cell. [Skotlex]
+ * Removed area of effect of Assumptio. [Skotlex]
+ * Added "can't act" delay update when an auto-spell triggers. [Skotlex]
+ * Expanded the warp warning so that it also warns when a warps takes you to
+ a non-walkable tile. [Skotlex]
+ * Simplified the mob-drops structure by using a single timer with a linked
+ list of drops instead of separate timers for each drop. [Skotlex]
+2006/04/11
+ * Added special_state changebase to identify when a character has a
+ special-view associated with some equipment to correctly revert the look
+ when you take off said equipment (fixes tuxedo/wedding dress when you use
+ modify_wedding_display: yes) [Skotlex]
+ * Removed the piece of code that "guesses" that job classes between 24 and
+ 68 are advanced classes from mob_avail reading since they conflict with
+ NJ/GS. Use the correct class numbers from now on! [Skotlex]
+ * Cleaned up implementation of BlastMine and Claymore Trap. [Skotlex]
+ * Added Freezing trap information to battle_calc_weapon attack. [Skotlex]
+ * Merged the can't walk delay code into the weapon-damage delay one, means
+ less timers for attacks, as well as fixing the ghost-mob issue that
+ reappeared recently. [Skotlex]
+ * Traps will not be displayed when you walk within their range. [Skotlex]
+ * Added HT_DETECTING revealing traps. [Skotlex]
+ * Added ers handling for skill_timerskill structures. [Skotlex]
+ * You don't get critical'ed when in counter-attack stance anymore. [Skotlex]
+ * Changed the default counter-type to "always critical". [Skotlex]
+ * Implemented use of ers for skill_unit_groups to reduce memory usage.
+ * Note that it's NOT TESTED yet. Use with caution, at least some obvious
+ bugs are expected to be found... [Skotlex]
+ * Modified battle_check_range to do a path-check on distances less than 2
+ (rather than 3) to avoid being able to hit through walls. [Skotlex]
+ * Modified unit_walktoxy_sub to always move at least one cell when a large
+ chaserange is specified to prevent possible infinite loops where
+ attack_timer says you are not within range, but unit_walktoxy says you are.
+ [Skotlex]
+ * Fixed Looted items always dropping in quantities of one. [Skotlex]
+ * Removed the check that deletes Magnus Exorcism cells after they hit once.
+ [Skotlex]
+2006/04/10
+ * Temperory replaced strtoll to strtoul until the function changes. [Lance]
+ * Multiple optimizations to the unit_data auto-chase upgrade, also
+ simplified the mob and pet ai routines. [Skotlex]
+ * Simplified the walk routines to half the number of timers required for
+ walking. [Skotlex]
+ * Finished fixing the unit_data auto-chase update. Still need to do some
+ optimizations... but the current code-base should be usable. [Skotlex]
+ * Fixes to the unit_data update that lets characters auto-chase while
+ attacking. It seems to work mostly now, but there's still a few issues to
+ be resolved with ranged-attackers. [Skotlex]
+ * Modified the unit_data structure to handle automatically switching
+ between chasing and attacking a character. Note that it's a work in
+ progress and not yet properly tested/finished... [Skotlex]
+ - DON'T USE THIS YET. There's much testing that needs be done, but I had to
+ commit now so I may continue work on it later....
+ * Updated the subnet support to not require specifying the subnet mask, it
+ is auto-acquired from the char/map IP and the subnet-mask. [Skotlex]
+ * skill_wall_check defaults to yes now. [Skotlex]
+2006/04/09
+ * Added the missing last_thinktime initialization to pets. [Skotlex]
+ * Reverted the change in skill_wall_check to let skills go over pits.
+ [Skotlex]
+ * Changed use of strtol to strtoll when reading the equip_jobs as strtol's
+ result is just a signed int, fixes reading of equippable jobs for certain
+ items. [Skotlex]
+ * Corrected Knives being usable by Gunslinger. SQL users use
+ upgrade_svn5972.sql to ugprade that. [Skotlex]
+ * Modified @warp/@rura to prevent causing pc_setpos position error
+ messages. [Skotlex]
+ * Fixed the mob's last_thinktime not being updated on mob_spawn, causing
+ them to not "think". [Skotlex]
+ * Fixed @npcmove not sending the correct packets to make the moving refresh
+ client-side. [Skotlex]
+ * Fixed mobs with aggressive + looter mode never looting. [Skotlex]
+ * skill_wall_check now also checks for pits so that skill effects don't go
+ through them. [Skotlex]
+ * Now you can't leave/be-kicked from a guild inside guild castles. [Skotlex]
+ * Fixed map_waterheight prefixing extra "data\" [Lance]
+ * Mob_ai update. The attacked checks will trigger even if the mob can't
+ move. Being attacked while the mob can't move no longer will trigger
+ rude-attacked skills. [Skotlex]
+ * Changed the default of multi_hit_delay from 230 to 80 which seems more
+ official. [Skotlex]
+ * Wedding recall skills are now blocked by the nomemo mapflag instead of
+ nowarpto. [Skotlex]
+ * Skill delay for weapon types is now based on adelay (ASPD) rather than
+ amotion (ASPD/2) [Skotlex]
+ * Removed ending Endure when casting Berserk, may fix the timer mismatch
+ issues. [Skotlex
+2006/04/08
+ * Fixed skill_nocast_db reading so that when the same skill is specified
+ multiple times, the blocked effects add up instead of replacing each other.
+ [Skotlex]
+ * Fixed @movenpc [Skotlex]
+ * Cleaned up and improved the lootsearch routine to pick nearest item.
+ [Skotlex]
+ * Fixed trying to set the view_data for npcs who are located on a map, but
+ have no visual data. [Skotlex]
+ * Added irc_athena.conf :) from now on, set your irc configuration in
+ conf/irc_athena.conf [Zido]
+ * Removed the baby class check when using "changebase" to change to the
+ Wedding Sprite, since it fixes the bug that the sprite doesn't show
+ at all, and baby classes arn't messed up by it anymore.
+ (or so it seems) [Zido]
+ * Fixed up irc.c, no more crashes :D [Zido]
+
+2006/04/07
+ * Likely fixed a mob not returning to their original class view on respawn
+ after they changed class in their previous life. [Skotlex]
+ * The map-server can now read the equip_job column of the item_db as both
+ decimal and hexadecimal values. [Skotlex]
+ * Updated item_db.sql current item_db.txt [Skotlex]
+ * Added upgrade_svn5951.sql for those who would like to convert their
+ existing items. (it converts the equip_jobs fields to the new values used)
+ - See db/Changelog for further info regarding the equip_job fields change.
+ [Skotlex]
+2006/04/07
+ * Moved the Fusion HP penalty to battle_calc_weapon_attack [Skotlex]
+ * Some cleaning to use battle_heal/damage rather than pc_heal/damage where
+ appropiate. [Skotlex]
+ * Cleaned up the deadly-poison hp reduction code. [Skotlex]
+ * IRC User access levels now refresh on a mode set and join/part. [Zido]
+ * Added missing creation/destruction of the expcache_ers in guild.c
+ [Skotlex]
+ * Unified status_remove_buffs/status_remove_debuffs into a single function.
+ [Skotlex]
+ * Fixed pc_setpos ignoring the clrtype sent to it. [Skotlex]
+ * unit_free will now use clear type 3 for players (warping out effect)
+ [Skotlex]
+ * You can't invite someone to a guild now within Guild Castles. [Skotlex]
+2006/04/06
+ * Hopefully fixed the wedding item-trade restriction. [Skotlex]
+ * Fixed status_clear_buffs making SC_BERSERK's end send you to 100hp.
+ [Skotlex]
+ * Rewrote the guild exp cache code to prevent overflows and to use the
+ entry reusage system. [Skotlex]
+ * The IRC Bot is now able to check each users access level prefix
+ in the channel (~/&/@/%/+), the IRC command @kami now requires the
+ user to be at least channel operator(@). Now I need to make it store
+ the users access level on every nick/mode change. [Zido]
+ * Changed the default of skill_add_range to 0, said value now disables
+ skill-range checking when casting ends. [Skotlex]
+ * Corrected the Soul Drain formula, thanks to Haplo for pointing it out.
+ [Skotlex]
+ * Addded missing aldeg_cas01 to NOWARP mapflags, thanks to Justin84 [Lupus]
+ - And we set lhz_dun03 nowarpto mapflag by default till check it on eRO/kRO
+ * Changed the random warping of mobs with no players from mob_spawn to
+ unit_warp, which prevents MSC_SPAWN skills from being retriggered for
+ already spawned mobs. [Skotlex]
+ * Modified @allstats to prevent negative/overflow issues. [Skotlex]
+2006/04/05
+ * Fixed undisguising not clearing the mob sprite for the disguised
+ character. [Skotlex]
+ * Fixed parsing of job_db1.txt due to the MAX_WEAPON_TYPE change. [Skotlex]
+ * TK ranking kicks can't be used on sucession now (can't use any of the
+ kick skills twice in a row without using a different one first). [Skotlex]
+ * Modified the ammo checks so that ammo is consumed at the end of
+ battle_calc_weapon_attack (should fix element being lost on final arrow).
+ [Skotlex]
+ * Added a define list for weapon types in pc.h [Skotlex]
+ * Cleaned up pc_checkallowskill and moved the Gatling fever check to it.
+ [Skotlex]
+ * Some cleanup of clif_parseloadendack, fixed guild-member list being sent
+ on all map-changes. [Skotlex]
+ * Removed the hardcoded removal of characters who spawn in a castle. All
+ castle maps got the flag nosave now. [Skotlex]
+ * Added support for the 2006/04/04a Sakexe packet version. [Zephiris]
+
+2006/04/04
+ * Added inter config connection_ping_interval which specifies interval in
+ hours at which mysql_ping's must be done on all connection handles to keep
+ the mysql connection alive. Defaults to 0 (disabled) [Skotlex]
+ * Made the login sql handle on the char-sql server be used only when
+ gm_read_method 1 is enabled. [Skotlex]
+ * Small fixes to npc_enable, added BL_NPC handling on status_get_sc.
+ [Skotlex]
+ - Some changes to close-confine, status start will fail when the source is
+ not found or it doesn't has sc-data. [Skotlex]
+ - pc_setoption no longer changes the character's class when
+ mounting/dismounting, it only changes the view-class. [Skotlex]
+ * Modified the char-txt server to modify the class of mounted characters to
+ their non-mounted version. Added an upgrade_svn5902 file to handle the
+ class update on the sql tables. [Skotlex]
+2006/04/03
+ * Fixed pc_setpos using unit_remove_map with type 0 instead of 3, which
+ confuses clients and makes them think the character in question is still
+ standing on the spot where it was removed. This should fix the warp-portal
+ issue. [Skotlex]
+ * Fixed script command mapwarp. [Skotlex]
+ * Fixed Auto-counter. [Skotlex]
+ * Modified Rude-Attacked behaviour so that such skills only triggers when
+ the rude-attacked count is greater than 3. [Skotlex]
+ * Added config setting slaves_inherit_mode to determine whether slaves take
+ on their master's aggressive/passive status (defaults to yes) [Skotlex]
+ * Disabled NPCs are now handled through nd->sc.option&OPTION_INVISIBLE
+ checks. Should fix disable/enablenpc calls not working. [Skotlex]
+ * Moved skill_counter_additional_effect calls to trigger right after
+ skill_additional_effect (which means they trigger at the end of the attack
+ motion for physical attacks instead of at the beginning of the attack
+ animation) [Skotlex]
+ * Cleaned up (fixed?) a possible overflow in pc_isUseitem, thanks to
+ foobar. [Skotlex]
+ * When you have the wrong ammo-type equipped the skill-failed message is
+ now "skill can't be used with this weapon", which is less misleading than
+ "please equip arrows first". [Skotlex]
+ * Corrected pet-equipment display (I originally assumed they went in the
+ shield view-position, when they actually go in the head-bottom position).
+ [Skotlex]
+2006/04/02
+ * Fixed npc_gettimerevent_tick returning the difference since the last
+ triggered label instead of total elapsed time for the npc-timer. [Skotlex]
+ * Added a missing memset on ers_alloc'ing mob loot which was making data
+ from looted items fill in normal drop info (in other words, you could get
+ normal loots that were named after players, for example) [Skotlex]
+ * Added preventing sending packet clif_clearchar_id when the character in
+ question is invisible. [Skotlex]
+ * Added packet 0x7c in clif_spawn which was supposed to be used for
+ non-players (this fixes pets/mobs/npcs spawning as if they just teleported
+ into view) [Skotlex]
+ * Some cleanups to clif.c, removed some excess/broken packets/functions.
+ [Skotlex]
+ * Merged Larry's fix of using a timer to get rid of the glow-issue when you
+ login to night-enabled map. [Skotlex]
+ * Changed arrows View ID to 22 since daggers were already View ID 1.
+ The server was looking for daggers to be in your arrow slot. [Reddozen]
+ * Loading waterheight aliases from resnametable.txt. [Lance]
+ * Workround the warnings for clif.c (what to do? the original codes are ugly.. passing
+ values as pointers omgwtfbbq). [Lance]
+
+2006/04/01
+ * Added a exp-even-share check when someone leaves a party. [Skotlex]
+ * Added function clif_changetraplook to handle changing the appearance of
+ traps as they are triggered. Fixes all the nullpos related to trap usage.
+ [Skotlex]
+ * Fixed berserk not raising your HP to your new cap. [Skotlex]
+ * Fixed ground-skills not displaying damage done. [Skotlex]
+ * Fixed a few functions sending a negative ID for disguised characters
+ (such as clif_specialeffect) which very likely produced client crashes.
+ [Skotlex]
+ * A small cleanup on npc-whispering which could fix a reported crash on it.
+ [Skotlex]
+ * Removed the gm-whispering of the charnameack hack notice since it isn't
+ perfected yet. It is still reported on the console for debugging
+ purposes. [Skotlex]
+ * Fixes to the mob_ai routines. Prevent casting rude-attacked skills in
+ situations that shouldn't be considered as so. Fixed mobs failing to chase
+ after enemies when attacked from out of their view_range. [Skotlex]
+ * Should not exit when you can't find an NPC file.. [Lance]
+ * Dynamic shops support with script callback. (needs testing) [Lance]
+ * Cleaned up and fixed @where command. [Skotlex]
+ * Fixed standing up no really making you stand up. [Skotlex]
+ * Added upgrade_svn5834.sql to update view for item type 10. Because of the
+ ammo upgrade, all arrows need their view set to 1. This query does that to
+ all type 10 items (this includes all ninja weapons as well, but a proper
+ item_db.sql update is pending until the rest of throwables are updated)
+ [Skotlex]
+ * Fixed compiler warnings. [Lance]
+ * Added structure view_data to handle sprite information for all characters
+ (equipment, weapons, hair, dyes, etc). [Skotlex]
+ * Rewrote several clif functions to adapt to the new view_data class.
+ [Skotlex]
+ * Rewrote the way cloth dye packets are resent to optimize bandwidth usage.
+ [Skotlex]
+ * Fixed the npc_item_flag thing (enable_items/disable_items script command)
+ [Skotlex]
+ * Rewrote the disguise implementation to be bandwidth friendly. [Skotlex]
+ * Modified the hide options to change your class to INVISIBLE_CLASS, since
+ such classes don't even get their view packets sent around. [Skotlex]
+ * Added class 139 to npcdb_checkid which was required by some npcs in the
+ swordman quest. [Skotlex]
+ * April fool! Improved soundeffectall script command. (No, this is not a lie) [Lance]
+
+2006/03/31
+ * Fixed skill_require_db loading of the new ammo columns.
+ * Added a column to specify the amount of ammo required for skills that
+ require it. [Skotlex]
+ * Added support for ArrowType requirement on skills. It checks for having
+ an item equipped on the arrow-slot who's view has to match with the
+ required arrow-type (works the same way it does for weapons). [Skotlex]
+ * Skills will automatically be ranged and arrow-types when they have a
+ arrow-requirement in battle_calc_weapon_attack [Skotlex]
+ * Skills will automatically consume arrows if used with a bow and the skill
+ is an attack weapon-based skill even if the skill_require_db doesn't
+ specifies arrow requirements (this is for stuff like backstab used with
+ bows) [Skotlex]
+ * Fixed an infinite recursion in the Wedding Recall skills. [Skotlex]
+ * UNT_ATTACK_SKILLS unit packets won't be sent to the client as they are
+ supposed to be invisible anyway. [Skotlex]
+ * Started work on commands for the IRC Bot, At the moment you can use !eakami <message>
+ to broadcast a message, edit ALLOWED_NICK in irc.c to change the nickname
+ of the person that is allowed to use it (Shitty authentication method, I know,
+ but i'll make user/pass method soon enough.) [Zido]
+ * Modified a bit the skill packets of Sharp-Shooting and Brandish Spear in
+ hopes of fixing it. [Skotlex]
+ * Should fix a bug in GM stealth mode (@hide). [Lance]
+
+2006/03/30
+ * Updated char name option. [Vicious]
+ * Added a missing return that fixes crashes on status_change_timer when
+ source is not found. [Skotlex]
+ * Added year day return in gettime function. gettime(8) returns 1~366
+ [Foruken]
+ * the auth function in login.c won't jstrescapecpy passwords that were
+ encrypted. Thanks to foobar. (but are still more cases to check for? Dunno,
+ the code is kinda long...) [Skotlex]
+ * Endure level 11 and above are now considered infinite-endure, and invoked
+ when Berserk is active. [Skotlex]
+ * Set the minimum pet hungry delay to 10 [Skotlex]
+ * modified functions skill_delayfix and skill_castfix to reduce number of
+ arguments. Added function skill_castfix_sc for mobs (who only get status
+ change cast reductions, not dex based ones). Also, skill_delayfix will
+ never return a value below min_skill_delay_limit. [Skotlex]
+ * Modified brandish spear so you won't see the skill-animation for every
+ targetted mob. [Skotlex]
+ * Added the Steel Body icon to auto-berserk. [Skotlex]
+ * Now you can't cast auto-counter while the previous one is active.
+ [Skotlex]
+ * Added Veider's suggestion to do a hack-report when players request the
+ name of an invisible/cloaked character. [Skotlex]
+ * Added execution of OnInterIfInit, OnCharIfInit and OnInterIfInitOnce on script
+ reload. [Lance]
+ * Cleaned up mistakes in irc.c [Lance]
+
+2006/03/29
+ * Now none of the pet-menu options will have any effect when the pet's
+ intimacy is 0. [Skotlex]
+ * Applied a fix to not do range checks on npc_doevent when the npc is not
+ on a map. [Skotlex]
+ * You can't return to egg a pet that has run away now. [Skotlex]
+ * Added ers support to the delayed mob drops. [Skotlex]
+ * Some cleaning of the mob_ai. Mobs should stop chasing once you are beyond
+ their min_chase range. Improved rude-attacked checking when mobs can't
+ move. [Skotlex]
+ * range3 is now used as min-chase value of mobs. [Skotlex]
+ * Added a debug message when status_change_timer fails. Report it next time
+ it shows up. [Skotlex]
+ * Fixed tick direct modifications increasing duration instead of decreasing
+ it. [Skotlex]
+ * You can't SG_FEEL maps already memorized. [Skotlex]
+2006/03/28
+ * Fixed the Family recall warp skills. [Skotlex]
+ * Fixed pc_percentheal giving life when the rates are negative. [Skotlex]
+ * Fixed resetting stats losing the +52 bonus on high classes. [Skotlex]
+ * Fixed Wedding support skills healing yourself instead of partner.
+ [Skotlex]
+ * Added a check to prevent knocking back the Emperium at all costs.
+ [Skotlex]
+ * Fixed summon mobs being able to cast "summon" skills. [Skotlex]
+ * Summoned mobs will inherit the size and ai properties of the master. [Skotlex]
+ * Added a debug function to locate all "looping warps". [Skotlex]
+ - Now will someone help cleanup those warps?
+ * Some cleanup of the skill-use functions in clif.c [Skotlex]
+ * Fixed Gunslinger and Ninja skills not showing up and not working due to an error
+ in skill_require_db
+ - also commited a commented block for GS_FLING that needs to be looked at and posiably
+ cleaned before it's uncommented.
+ - fixed exp2 not accepting Gunslingers and ninjas
+ - fixed the "jobmaster" having the same problem as rebirth
+ - added the Gunslinger shops for guns and ammo [Reddozen]
+ * Modified clif_getareachar_pc to hide hidden GMs from normal players (players with GM
+ level > 0 still able to view) by NOT sending the coordinates. [Lance]
+
+2006/03/27
+ * Removed the limits.h file which just breaks compilation on *nix systems
+ [Skotlex]
+ * Updated some DB work from jA [Vicious]
+ * HW_GANBANTEIN now also removes traps. [Skotlex]
+ * PF_DOUBLECASTING takes effect amotion time after the initial cast instead
+ of amotion*div [Skotlex]
+ * SG_KNOWLEDGE now lasts time1 after you quit a map before it clears out
+ (defaults to 10 mins currently) [Skotlex]
+ * Modified Intravision to modify the status-change packet to specify
+ SI_INTRAVISION instead of cloaking/hiding/chasewalk. I believe this is how
+ intravision actually works. [Skotlex]
+ * Pet catching now uses the menuskill variables to prevent item usage from
+ disrupting the catch process. [Skotlex]
+ * Added Safetywall to the list not blocked by Dispell. [Skotlex]
+ * Added some include limits.h required by window compiles. [Skotlex]
+ * Corrected Wedding rings being trade-able. [Skotlex]
+2006/03/26
+ * GCC on Cygwin still complaining, resorted to including limits.h in malloc.h [Lance]
+ * Refixed the fix with a constant list for Win32 users - limits.h (imported from MSVC) [Lance]
+ * Fixed a problem in chrif.c where USHRT_MAX was undefined. [Codemaster]
+ * Added jAthena's new start and athena-start shell scripts. [Lance]
+ * Changed status_point/skill_point to unsigned short. Adjusted the code as
+
+ necessary to prevent overflows. [Skotlex]
+
+ * itemdb_exists and itemdb_searchname should now ignore dummy_item matches. [Skotlex]
+
+ * Fixed jstrescapecpy crashing when you pass a null string to parse. [Skotlex]
+
+
+2006/03/25
+ * Fixed the map-server freeze/crash on Warp Portal. [Skotlex]
+ * Fixed Grandcross/Granddarkness showing no skill animation. [Skotlex]
+ * Fixed mob-casted grandcross doing nothing unless the target was "self" [Skotlex]
+2006/03/24
+ * Fixed / finished most of Gunslinger [Reddozen]
+ - fixed some bullets in the item DB
+ - adjusted a few rates in skill_cast_db.txt for Gunslingers
+ - adjusted a couple skills in skill_db.txt to act correctly
+ - adjusted all the SP values for Gunslinger skills
+ - changed piercing shot to lv 5 from lv 10
+ - made ki Translation fail giving coins to Gunslingers
+ - equipping a weapon other than a gatlin gun should cancel SC_GATLINGING. Also made Gatlinfeaver on/off togelable
+ - GS_CRACKER will no longer stun players
+ - added GS_Disarm
+ * Fixed iteminfo only displaying first result when there were many. [Skotlex]
+ * Fixed pet hatching. [Skotlex]
+ * Small change that SHOULD fix the pet duplication issue. [Skotlex]
+ * Fixed Warp Portal. [Skotlex]
+ * Modified script commands atcommand/charcommand to execute even if there
+ isn't a player attached. They'll use a dummy player data with the same
+ position/name as the script's owner (usually an npc). Be careful when using
+ this as the result of some @/# commands may be unexpected! [Skotlex]
+ * Some cleaning around the return to egg code. Pets should stop duplicating
+ now. [Skotlex]
+ * Some cleaning of the egg hatching routine to prevent spawning the pet if
+ the egg can't be found in the inventory. [Skotlex]
+ * Removed a pair of autoadded "data/" strings on grfio.c to see if that
+ helps with the data_dir map loading. [Skotlex]
+ * Fixed skillidx not being set whenever a mob uses a skill. This explains
+ skills like metamorphosis/summon_slaves not working at all. [Skotlex]
+ * Fixed unit_skillcastcancel reading the nocastcancel flags the exact
+ wrong way around [blackhole89]
+ * Added function map_search_freecell to locate an available cell around an
+ area (for recall/warping skills). UNTESTED. [Skotlex]
+ * Added unit.c to the VC8 project files. Thanks to Joshuaali [Skotlex]
+ * Fixed Magnum-break/GrandCross displaying multiple times the skill effect
+ (once per target) [Skotlex]
+2006/03/23
+ * Fixed a crash in unit_useskill_pos2 [Skotlex]
+ * Updated mob_db.sql and item_db.sql to current txt versions. [Skotlex]
+ * Fixed Devotion not properly being cleared on death/near death in some
+ cases. [Skotlex]
+ * Fixed Shield-Reflect not being correctly ended when devotion does.
+ [Skotlex]
+ * Fixed DEX-based casting time and delay reduction. [blackhole89]
+ * Modified the function pc_percent_heal to prevent overflow problems. [Skotlex]
+ * Changed the second entry in the water_height.txt listing to specify
+ directly the .rsw file (instead of .gat). [Skotlex]
+ * Fixed Potion Pitcher sometimes crashing the server. [Skotlex]
+ * Fixed a compile warning by adjusting the acid demonstration formula.
+ [Skotlex]
+ * Added flag 2 to the skill_castnodex_db file for skills that shouldn't be
+ affected by delay/cast reducing skills/effects. [Skotlex]
+ * Added SantaPoring's water_height.txt modifications. [Lance]
+ * Minor cleanups. [Lance]
+
+2006/03/22
+ * Fixed function pc_isCardAllowedOn causing searches for non-existant item
+ id 0. [Skotlex]
+ * Fixed Arrow Shower. [Skotlex]
+ * Merged the unit_data structure from jA for handling unit-related data
+ (attack times, walking, auto-attack timers, skill related data). This is a
+ huge change that affects walking, attacking, auto-attacking, skill usage
+ and character clean up from maps. I spent the last two days clearing out
+ bugs, and even though I couldn't find any more, I wouldn't be surprised for
+ a corner-case or two I missed. [Skotlex]
+ * Modified unit_skillcastcancel to receive flag&2, which stands for "cancel
+ casting only if current skill is cancellable" [Skotlex]
+ * Battle config options changed from yes/no to BL_TYPE settings:
+ skillrange_by_distance, skill_noreiteration, skill_nofootset,
+ gvg_traps_target_all, skill_log, attack_direction_change,
+ auto_counter_type. See (Note 4) in the relevant battle config files.
+ [Skotlex]
+ * Clif.c will disconnect sessions that send an unknown command packet above
+ 0x30000 instead of just ignoring it. [Skotlex]
+ * Cleaned up error reporting during mob-skill loading to be less spamy with
+ non-loaded mobs. [Skotlex]
+ * Corrected water_height reading. It works now, with the exception that
+ cloned maps don't get their water-level read because they don't have a rsw
+ file. The solution is to add all cloned maps to water_level.txt (ie:
+ "new_1-1.gat new_zone01.rsw" makes the new_zone01.rsw stored water-level be
+ applied to map new_1-1.gat).
+ Anyone can help collect all the clone maps to fill up water_height?
+ * status_check_skilluse won't block skill-specific checks (silence,
+ berserk, steel-body, etc) when the skill in use is an item-invoked skill.
+ [Skotlex]
+ * Merged LittleWolf's function to read the map-height directly from the rsw
+ file. Now when building the map-cache, the water-heights should be
+ automatically read as well directly from the rsw's. [Skotlex]
+ WARNING: Not tested yet!
+ The water-height config file now is for aliases. When the rsw for a
+ certain map is not found, and this map exists in the water_height list,
+ then the water height of the second map listed in that file is used.
+ * Some cleanups in irc.c [Skotlex]
+ * Magic skills that ignore element now also don't take into account
+ elemental cards. [Skotlex]
+ * Fixed compiler warnings in battle.c [Lance]
+ * Changes by [reddozen] -->
+ - Updated Full Buster's damage, status effects, and skill levels
+ - Bullseye now only uses 1 coin
+ - changed Adjustment's required SP
+ - changed Incerase Accuracy's effect bonuses
+ - changed Magical Bullet's SP cost
+ - changed Piercing Shot's damage and SP
+ - changed Desperado's range, hit count, aftercast delay, and SP
+ - fixed Absorb Spirit Sphere being able to remove coins
+ - changed Acid Demonstration's damage to the new Japanese formula
+
+2006/03/21
+ * Fixed duel in pk-mode (same party/same guild/alliance non-targeting issue).
+ Thanks to Hobbit for pointing that out. [LuzZza]
+ * Fix on not showing guildmembers logins/logouts messages. [LuzZza]
+ * Fixed SC_SWOO's opt3 value. Small monsters should stay small for skill's
+ duration now. [Skotlex]
+ * Fixed allowing multiple recast of Dissonance/Ugly-Dance [Skotlex]
+ * Fixed those annoying irc.c compile warnings. [Skotlex]
+2006/03/20
+ * Added monster_ai&16 setting for executing the hard ai on ALL mobs in maps
+ with players instead of just mobs in the vecinity of players. [Skotlex]
+ * Cleaned up some guild functions. [LuzZza]
+ - Now guild leaving/explusion packets sends correctly.
+ - Fix to prevent creation alliance/opposition with same guilds.
+2006/03/19
+ * @stfu now allows negative intervals to be specified. [Skotlex]
+ * Added overflow check to the login-server when sending GM accounts to
+ char. [Skotlex]
+ * Small fix to prevent killer/killable states from allowing you to target
+ yourself. [Skotlex]
+ * Added Explosion Spirits to list of effects that dispel on logout.
+ [Skotlex]
+ * Fixed handling of guild skills by pc_blockskill_start, moved it to
+ skill.c [Skotlex]
+ * Fixed autoguard icon showing with stun. [Skotlex]
+ * Fixed acid demonstration breaking shield instead of armor. [Skotlex]
+ * Fixed Slim Pitcher crashing server ocassionally. [Skotlex]
+ * Hopefully fixed Ankle Snare lasting the whole trap's duration [Skotlex]
+ * Added sc_start(SC_ENDURE) on infinite endure bonus. [Skotlex]
+ * Fixed Berserk Pitcher consuming required items twice. [Skotlex]
+2006/03/18
+ * Fixed BA_DISSONANCE and DC_UGLYDANCE not working. status_check_skilluse was blocking
+ them due to the lack of an exception like BA_MUSICALSTRIKE has it. [blackhole89]
+ * Documentation update on NPC whisper and rid2name. [Lance]
+ * Fixed event_kill_pc to behave like what it should instead of another replication
+ of event_death. Added script function rid2name to convert bl ids to name. [Lance]
+ * Recoded setmobdata script function. Fixed mob_damage typo sd -> mvp_sd. [Lance]
+ * Added 'GetMonsterInfo(MobID,Idx)' script function. [Lupus]
+ You can get monsters name,level,race, etc by its Id. Check npc\sample\getmonsterinfo.txt
+ * Fixed warnings on compilers again. [Lance]
+
+2006/03/17
+ * Fixed the mob_skill_db by commenting out lines with targeted skills
+ being cast during an idle state. (Thanks to LittleWolf) [Zephiris]
+ * Removed a block of code from skill_check_condition that actually belongs
+ to status_check_skilluse. Should fix silence/stun blocking skills
+ regardless of settings. [Skotlex]
+ * Fixed misleading and inaccurately documented events and added a missing flag. [Lance]
+ * Fixed npc_cleanup_dbsub not removing key and caused pointer being freed problem. [Lance]
+ * Fixed handling of the char_gm_read config for packet 0x2af7 (reloadgmdb)
+ [Skotlex]
+ * Added battle_config debuff_on_logout which removes Asura's SP regen delay
+ and Strip-Equip effects on logout when set to yes (default,
+ conf/battle/skill.conf). [Skotlex]
+ * removed auto-attaching of player-run scripts in initnpctimer. You must
+ use attachnpctimer instead! [Skotlex]
+ * Final fix on Juperos NPC. [Lance]
+ * Fix on initnpctimer not attaching rid. [Lance]
+ * Fix on OnTouch ignoring -1 NPCs. [Lance]
+ * Fix on @reloadscript crashing due to passing non BL_SKILL bl to a function that accepts only BL_SKILL bl.
+ [Lance]
+ * Added area NPC detection in clif_parseLoadEndAck. [Lance]
+ * Fixed compiler warning in script.c get_mob_data. [Lance]
+ * Temperory resolved issues on Juperos until I get the exact description on the behaviour
+ in retail servers. [Lance]
+
+2006/03/16
+ * Changed NJ_ZENYNAGE according to this weeks patch to deal a random [MasterOfMuppets]
+ ammount of damage depending on the skill lvl.
+ * @kill_monster/@kill_monster2 won't touch Guardians/Emperium now. [Skotlex]
+ * Small change in the random item reading function, may fix @itemdbreload
+ messing up random item searches. [Skotlex]
+ * Restricted GS_BULLSEYE to only be used on demi-human or brute monster targets [MasterOfMuppets]
+2006/03/15
+ * mob_chat_sub fix. Added buildin_pcblockmove. [Lance]
+ * BL_PC and BL_MOB control script commands (experimental) [Lance]
+ * Made an adjustment to addspiritball() to allow Gunslingers to summon up to 10 spheres [reddozen]
+ * Fixed Tarot Card of Fate using time instead of time2 which is the one
+ that actually holds the effect duration. [Skotlex]
+ * Fixed mob random walk interval being set to up to 6K seconds in some
+ instances. [Skotlex]
+ * Added mapflag nodrop (prevents droping items to the ground). [Skotlex]
+ * Fixed mapflag notrade doing nothing. [Skotlex]
+ * Likely fixed Gravitation not hitting except for the last hit. [Skotlex]
+ * Removed the hardcoded duration of 30 seconds for sleep. [Skotlex]
+ * Fixed rangecheck for pet skill usage of INF_SELF_SKILL type of skills
+ [Skotlex]
+ * Removed inall/exall from atcommand.conf since those two do not exist!
+ (pointed out by Ancyker) [Skotlex]
+ * @me now uses entry 270 in msg_athena as output format. [Skotlex]
+ * gm_skill_unconditional setting now also overrides skill_partner_check
+ setting. [Skotlex]
+ * Emulated strtok_r functions to work strictly with ANSI compilers. [Lance]
+ * Added battle config options item_rate_adddrop, item_drop_add_min and
+ item_drop_add_max to control drop rate of card-acquired loot bonuses.
+ (conf/battle/drops.conf) [Skotlex]
+ * Added item_db2.sql and mob_db2.sql, thanks to Joshuaali [Skotlex]
+ * Added more usage of msg_athena on the slave atcommands messages. [Skotlex]
+ * Fixed twilight pharmacy dropping 1 item to the ground instead of the qty
+ produced. Thanks to k3dt [Skotlex]
+ * Fixed Plagiarism not working unless you had some sc active. [Skotlex]
+2006/03/14
+ * Fixed a possible crash in Venom Splasher if the countdown is too high.
+ [Skotlex]
+ * Fixed skill_notok blocking guild skills [Skotlex]
+ * Fixed Napalm vulcan's time2 entry in the skill_cast_db [Skotlex]
+ * Fixed the average_lv column size specification for levels above 255.
+ Thanks to Joshuaali (upgrade_svn5607.sql) [Skotlex]
+ * Updated @rura/@warp. Now you can use both "@warp mapname x y" and
+ "@warp mapname,x,y". [LuzZza]
+ * Added at-command @tonpc <NPC_name> (warp to NPC). [LuzZza]
+ * Fixed @where at-command. [LuzZza]
+ * Fixed WZ_WATERBALL + HW_MAGICPOWER [Skotlex]
+ * Fixed incorrect range check in autospell-when-hit triggers. [Skotlex]
+ * Modified Wedding recall skills to behave as in official [Skotlex]
+ * Modified Arrow Shower to be a ground-based skill and work as it should on
+ officials. However, the unit_id is still unknown. [Skotlex]
+ * Fixed skill_additional_effect triggering every time you were being hit
+ even if no damage was returned. [Skotlex]
+ * Fixed battle_calc_damage_return to make magic damage be returned by 100%,
+ and received damage nullified. [Skotlex]
+ * Changed a bit status_check_skilluse to check for dead characters, should
+ fix all the weird attack/attacked while dead bugs. [Skotlex]
+ * Fixed player auto-attack not cancelling when dead. [Skotlex]
+2006/03/13
+ * Finished some checks to make sure Land Protector Only blocks BF_MAGIC
+ skills. Hammerfall is no longer blocked. [Skotlex]
+ * Fixed script command warpparty looking for an attached player even when
+ it is not needed. [Skotlex]
+ * Shield Reflect is now passed through Devotion as well. [Skotlex]
+ - Devoted characters lose the devotion effect when the Crusader is at less
+ than 25% Hp. [Skotlex]
+ * chrif_scdata_save will not send a save scdata request when the char has
+ been already tagged as in the final save. [Skotlex]
+ * Some status_change_start cleanups, stuff like blessing should now remove
+ stone/curse even if the status does not begins because the character is
+ already blessed. [Skotlex]
+ * Cleaned SC_SUITON a bit to get rid of that compile warning. [Skotlex]
+ * Added function battle_calc_gvg_damage for gvg related damage reductions.
+ Fixes Gravitation being reduced as well as Pressure overriding max-castles
+ restriction. [Skotlex]
+ * Corrected char-server parameters so that the subnet config file is the
+ third parameter, not the second (which was conflicting with
+ inter_athena.conf's argument), thanks to foobar. [Skotlex]
+ * PR_BENEDICTIO now ignores mdef [Skotlex]
+ * Fixed chatlog's x/y column capacity in sql-files/logs.sql [Skotlex]
+2006/03/12
+ * Updated clone skill copy to consider combo-skills. [Skotlex]
+ * no_spawn_on_player won't work on mobs with no respawn delays now. [Skotlex]
+2006/03/10
+ * Cleaned up the Skillbreaker implementation, HP gaining happens at level 5
+ now. [Skotlex]
+ * Autospells won't trigger now on maps where said skills are forbidden.
+ [Skotlex]
+ * Changed div (multi-hit) behaviour. Skills with div above zero will get
+ their total damage increased by the number of hits, div less than zero is
+ just for "show", total number of hits displayed is abs(div), but damage
+ isn't increased by number of hits. [Skotlex]
+ * Adjusted several skill damage equations to make up for the above change.
+ [Skotlex]
+ * Fixed a overflow bug when one of the item_random* files has too many
+ random items. [Skotlex]
+ * Fixed a variable loopback problem on NPC shop price checking routine. [Lance]
+ * Fixed a memory overwrite crash on pc_readdb, thanks to foobar for the
+ fix. [Skotlex]
+ * Fixed only the first TK stance triggering when you have multiple of them
+ active. [Skotlex]
+ * Default of skill_attack_enable changed to yes. [Skotlex]
+2006/03/09
+ * Fixed the dancer/bard soul-linked skills toggling on/off with each call
+ to pc_calc_status. [Skotlex]
+ * Fixed a bug in the pc_skillreset function which allowed TK rankers to
+ accumulate skill points. [Skotlex]
+ * Fixed a major memory leak in status.c causing the last column of job_db1.txt
+ never being read. I have no idea how long this has been there, but signs point
+ to us using Katars at a random ASPD from somewhere in memory for ages. [blackhole89]
+ * Fixed a critical bug in job_db1.txt reading in status_readdb. [blackhole89]
+ * Fixed pc_damage_sp not properly substracting SP. [Skotlex]
+ * Made Magic Crasher a BF_WEAPON attack. [Skotlex]
+ * Made skill_unit_range a per-level setting. meteor and Lov now have their
+ unit range for bosses adjusted in the skill_unit_db rather than
+ hardcoded. [Skotlex]
+ * Added Gunslinger/Ninja Status Change icons. Somebody needs to look into
+ them though for not all SCs have a matching SI. [blackhole89]
+ * Changed ITEM_NAME_LENGTH to 50. [Skotlex]
+ * Fixed stun's duration not getting reduced by vit + luk/3 [Skotlex]
+ * Fixed #itemlist not taking into consideration crafted/forged items and
+ pet eggs. [Skotlex]
+2006/03/08
+ * More work on ninja/gs. Which made me do... [Vicious]
+ - Add more weapon type(17~21 for guns) [Vicious]
+ - Included MAX_WEAPON_TYPE in status.h and updated the codes
+ (Whose idea was it to do static number... esp dual weapon) [Vicious]
+ * Fixed a bug that was making the no_spawn_on_player setting useless.
+ [Skotlex]
+ * Added Deadly Poison and Bleeding to status_get_sc_def, meaning that now
+ vit does increases defense against being inflicted from it. [Skotlex]
+ * Fixed and tested @whodrops [Skotlex]
+ * Updates to Gunslinger skills' DB entries. [blackhole89]
+ * Rewrote pc_jobchange to be sane by using the map internal codes instead
+ of a mesh of complicated nested comparisons. [Skotlex]
+ * pc_authok will now change you to a novice if your class isn't identified
+ as a valid one. BACK UP before updating, because.. well, just in case you
+ start seeing novices filling up your city. [Skotlex]
+ * Mobs will now chase you even if you hit them from outside their range of
+ view. [Skotlex]
+ * Fixed item disappearing from the floor when you attempted to pick it up
+ and there was no room in your inventory. [Skotlex]
+ * About half-ish nj/gs skills are semi/fully-done. No effect/status yet though. [Vicious]
+ * Added atcommand @whodrops which lists mobs with the top drop-rates for a
+ given item. List of stored mobs and their dropchances is also defined by
+ MAX_SEARCH on map.h [Skotlex]
+ * Modified atcommands @mobinfo and @iteminfo to display multiple matches
+ instead of just one. Max number of matches to display is set in map.h
+ (MAX_SEARCH) which is currently 5. [Skotlex]
+2006/03/07
+ * Base for ninja/gunslinger is mostly done. need to work on skills now. [Vicious]
+ - Updated sql-files/ mob_db.sql and item_db.sql to current txt dbs. [Skotlex]
+ * @job ninja/gunslinger. No skill tree or anything yet. [Vicious]
+ * Gospel won't start taking effect until after 10 secs have passed since
+ invocation. [Skotlex]
+ * Now if a skill has inf set to 4 (self skill) and inf2 512 (cannot target
+ self) this skill becomes a target-auto-select skill, which targets your
+ current attack target, and won't stop your current attack. The current
+ attack is delayed by your aspd (except for a few skills such as the monk
+ combo skills which readjust this delay). All Monk combo skills plus Taekwon
+ kick skills have been updated to use this. [Skotlex]
+ * Added a check that forces self skills (inf = 4) to select yourself as
+ target to prevent oddities from crafted packets. [Skotlex]
+ * More ground work for Ninja/Gunslinger [Vicious]
+ * status_calc_pc now assumes that if your max hp is negative, it has
+ overflowed, and as such, it is set to the max_hp setting instead of 1. This
+ 'dangerous' assumptio is alright as long as there aren't equipment that can
+ send your hp to negative values. [Skotlex]
+ - Fixed the soul linker skill tree. (Thanks to muad_dib) [Zephiris]
+ * Added Gunslinger and Ninja into @job. of course, you need latest EXE
+ for make this work... and of course no skills yet! [Vicious]
+ * Storm Gust now knocks back on a random direction instead of away from the
+ storm. [Skotlex]
+2006/03/06
+ * Some fixes due to the guild-skill changing location (being moved from
+ 500->900 within the code) [Skotlex]
+ * Fixed npc_event doing a map-check when the npc is not on any map.
+ [Skotlex]
+ * Fixed a debug message showing up on skill castend nodamage id when using
+ a guild skill. [Skotlex]
+ * Fixed #save not working on maps not in the current map server. [Skotlex]
+ * Added battle config clear_skills_on_death to decide whether all
+ ground-based skills should be removed when you die. Defaults to yes.
+ [Skotlex]
+2006/03/05
+ * Removed my EXP limit as it did not do what it was supposed to [Codemaster]
+ * Fixed remove-trap [Skotlex]
+ * Fixed animation of Redemptio [Skotlex]
+ * Some reorganization of how the skill check functions behave
+ (skill_get_*). Guild skills have been moved to the range 900~915 (instead
+ of 500~519 in the code). [Skotlex]
+ * Set the default for display_delay_skill_fail to 'no' as it should have been
+ for a while (the kRO patch about that was last year, long time ago) [DracoRPG]
+ * Fixed easter.txt typo. [Lance]
+ * Extended summon command to enable custom timeouts. [Lance]
+
+2006/03/04
+ * Fixed a bug in the subnet checking function, login-TXT server. Also
+ changed the messages to be a bit more informative. [Skotlex]
+2006/03/03
+ * Added function battle_set_walkdelay in charge of updating walkdelays of
+ characters based on two criterias: when the delay is induced by damage, if
+ the current walk delay isn't over yet, do not update it. If the delay is
+ instead caused by a skill, then the current walk delay cannot be decreased,
+ only increased. [Skotlex]
+ * Added upgrade_svn5455.sql, it converts the manner and karma columns to
+ signed. Apply this if your tables have the field as unsigned (which would
+ explain mute always disappearing after relogging) [Skotlex]
+ * status_change_start now checks on a 0->10000 scale, should fix sc-cards
+ with very low rates never triggering (eg: some coma-inducing cards).
+ [Skotlex]
+ * Cleaned up the active guild skills. They should be usable now by
+ non-players as well. [Skotlex]
+ * Fixed crash on the NPC whisper system when the message's size was 1.
+ [Skotlex]
+ * Strip status changes are now removed on logout. [Skotlex]
+ * Added a column in skill_cast_db for specifying can't walk delays. It's
+ all set to 0 currently, so someone get updating them! [Skotlex]
+ * Removed the apply walk-delay entry from skill_cast_nodex as the new walk
+ delay column handles this now. [Skotlex]
+ * Fixed autoloot dropping the item to the ground even when it was
+ autolooted. [Skotlex]
+ * Fixed character deletion working on SQL without an email address (Thanks to Valaris) [Zephiris]
+ * Added event 8 for mobspawns that should spawn with special ai set. This
+ means that now in the mob_spawn files if you use 8 as the last entry, the
+ mob will use the special ai, and as such, it will only attack other mobs,
+ not players (can obviously be combined with 2 for small mobs and 4 for
+ large mobs, eg: 10 for a small mob with special ai set) [Skotlex]
+ * Modifed battle_check_target so that mobs with special ai will only target
+ by default mobs without said state (this will prevent normal clones from
+ fighting among themselves, for example) [Skotlex]
+ * Trick dead now ends on logout [Skotlex]
+ * Added mapflag nocommand which blocks @/# commands unless your gm level is
+ above gm_skill_unconditional's level. [Skotlex]
+ * Fixed weapon scripts not being executed unless the weapon was forged.
+ [Skotlex]
+ * gm_skill_unconditional is now a no/gm-level setting instead of yes/no
+ [Skotlex]
+2006/03/02
+ * Slaves inherit speed will now only work if the master can move. [Skotlex]
+ * Some cleanup and reorganization on the way pet-skill variables are
+ handled. [Skotlex]
+ * Fixed a typo that disabled all pet support skills from triggering (except
+ ground-based ones) [Skotlex]
+ * status_check_skilluse cleanup. Some status will only block skills when
+ they are first used, not on cast-end (which includes auto-spells and
+ ground-skill checks). Now when status_castcancel is 'no', skills WILL
+ come off after the cast bar is done. [Skotlex]
+ * Gravitation now only affects the caster, should have also fixed the skill
+ not doing damage when skill_caster_check is set. [Skotlex]
+ * Max fame list size is now defined by MAX_FAME_LIST constant (mmo.h)
+ [Skotlex]
+ * Individual fame lists sizes can now be specified through the char-server
+ (check the fame list configs in char_athena.conf) [Skotlex]
+ * Some cleanup on mob_can_reach code to prevent unnecessary path-searching
+ [Skotlex]
+ * Optimized the path-searching ai for mobs to try target cells around the
+ target in order rather than randomly picked cells. [Skotlex]
+ * Applied Snufkin's patch to fix compilation on FreeBSD. [Skotlex]
+ * Fixed mobs targetting themselves after using a support skill. [Skotlex]
+ * Gospel no longer blocks item usage of whoever is in the area of effect,
+ only the caster of Gospel can't use healing items now. [Skotlex]
+ * Added the long/near attack_def_rate card effects to battle_calc_magic
+ (horn card and the like will now work with spells) [Skotlex]
+ - Elemental fields should vanish on map-change now. [Skotlex]
+ - Land Protector only blocks magical ground skills now. [Skotlex]
+ * Fixed item pickup not picking anything unless you were in a party with
+ item distribution set [Skotlex]
+2006/03/01
+ * Made it so players that are at the max level do not receive EXP.
+ This makes it so a player at the max level (ie - 99) cannot join a party
+ and feed all of his or her EXP to the other party members [Codemaster]
+ * Mapregsql will now fully depend on mmysql_handle. [Lance]
+ * Optimized strcharinfo to use switch. [Lance]
+ * Some cleanup of the mob skill reading. Added error reporting for unknown
+ states/conditions, error reporting now specifies the file and line number.
+ [Skotlex]
+ * Silence will only block skills when they have begun casting, not when the
+ cast bar is done. This also means that auto-spells will likely come-out
+ even when silenced. [Skotlex]
+ * opt1 status will block skills when they are done casting only if the
+ sc_castcancel option is set. [Skotlex]
+ * strcharinfo now returns blank instead of crashing the map server when
+ there's no player attached. [Skotlex]
+ * Added a missing mysql_init call to the mapreg sql handle. [Skotlex]
+ * Checked and fixed the script engine barking when you try to have a label
+ with the same name as a const.txt defined parameter. [Skotlex]
+ * Turn Undead and Offensive Resurrection should now work on undead players.
+ [Skotlex]
+ * Fixed the range checking of Repair weapon [Skotlex]
+ * Rude attacked is now also triggered when you hit a target that can't move
+ out of their melee attack range. [Skotlex]
+ * Mob ai will attempt to do a long-range attacked condition skill before
+ unlocking a target when it is attacked and said target is out of melee
+ range of a non-walking mob. [Skotlex]
+ * Corrected mobskill event to set the target_id before triggering. This
+ should fix shortrange/longrange attacked mob skill conditions. [Skotlex]
+ * Moved MSC_SKILLUSED trigger to mobskill_event which is triggered in
+ battle_calc_damage. It is also triggered on skill_castend_nodamage_id.
+ [Skotlex]
+ * Added party_share_loot for handling party-share loot. it should now work
+ with autoloot as well. [Skotlex]
+ * Fixed skill_break_rate breaking stuff even if the rate is 0. [Skotlex]
+ * pc_stopwalking will not send a fixpos packet if you are sitting. [Skotlex]
+ * mob_can_reach rude-attacked condition now uses the mob's field of view.
+ [Skotlex]
+ * SC_NOCHAT is automatically started on pc_authok if manner is negative.
+ [Skotlex]
+ * Map server now refuses to start if you try to define a label with the
+ same name as some const.txt defined character parameter. [Skotlex]
+ * Corrected a few Compiling Warnings [Codemaster]
+ * Added the ability to select GM loading via Login (default) or Char [Codemaster]
+ * Added script command 'setbattleflag'. [Lance]
+2006/02/28
+ * Rewrote LAN support code. Changed configuration file name
+ lan_support.conf to subnet_athena.conf, changed it syntax. [LuzZza]
+ * Added script command 'equip' to equip items. [Lance]
+ * Fixed dependancies in map-server compiling (VC7.1). [Lance]
+ * Added autoequip flag check for pc_takeitem. If it impacts on perfomance, please remove it. [Lance]
+2006/02/24
+ * Prevented guild/party recall to work on GMs of greater level than
+ yourself. [Skotlex]
+ * Prevent muting players with higher GM level than yourself. [Skotlex]
+ * Fixed Lady Tanee's spawns. [Skotlex]
+2006/02/23
+ * Fixed the CL_WHITE define, thanks to FlavioJS [Skotlex]
+ * NPC break equipment stuff now has a 1.5% per skilllv success rate.
+ - This is a custom value as 20%-lv10 seems too high and 10%-lv10 seems too
+ low. [Skotlex]
+ * pc_setpos won't random warp players if placed on top of Moonlight Petals
+ [Skotlex]
+ * Removed the check in clif.c for npc_shopid as the client never sends a
+ packet when the trade is cancelled... [Skotlex]
+ * Player-summoned mobs won't level up now. [Skotlex]
+ * Fixed Super Novice explosion spirits triggering no matter what you said
+ on the third line. It now triggers on the fourth line.... [Skotlex]
+ * Fixed GTB blocking targetted spells when gtb_pvp_only was set. [Skotlex]
+ * Merged the code of Ankle snare and Spider web. It no longer moves target
+ if sc failed. [Skotlex]
+ * Players should stop walking as soon as they start vending or get into a
+ chat. [Skotlex]
+ * Added mob skill conditions myhpinrate and friendhpinrate. [Skotlex]
+ * Added monster_ai condition 16 (enable `friend` targetted skills to heal
+ oneself) [Skotlex]
+ * Fixed the shop id not clearing when buying/selling (which made you get
+ stuck afterwards). [Skotlex]
+ * Modified the way autospells stack to mimic official servers. Cards of the
+ same ID cannot stack, but different cards with the same skill can each
+ trigger indepedently of each other. [Skotlex]
+ * Added battle_config autospell_stacking to enable stacking of cards of
+ same ID. (see battle/item.conf) [Skotlex]
+ * Moved card-specific battle options to items.conf [Skotlex]
+ * Autospells triggered when hit will check the range to the target.
+ [Skotlex]
+ * Some cleaning up of status_calc_pc [Skotlex]
+ * In status_change_start capped the passed success chance to 100% [Skotlex]
+2006/02/22
+ * Windwalk's flee bonus is now +1 every 2 skill lvs. [Skotlex]
+ * Changed the way equipment breaking works. Function pc_break_equip was
+ removed and now skill_break_equip is used. Basicly, it's the same as
+ before, except that when you 'break' a piece of equipment of a
+ non-player, the corresponding strip(weapon/armor/shield/helm) status
+ effect is induced (duration: strip skill lv 1) [Skotlex]
+ * Cleaned up the Dev folder. [Skotlex]
+ - Take note of the file todo-for-stable, which holds all modifications in
+ trunk that have not yet made it into stable. Be sure to update the file
+ as needed.
+ * Updated the path searching code with jA's current implementation.
+ [Skotlex]
+ - There is a slight chance the CELL_NOSTACK mod broke, someone test that.
+2006/02/21
+ * Fixed the range-check of targetted skills (was evaluating the range as 0
+ always) [Skotlex]
+ * Now you should receive the party/guild mini-dots on map-load without the
+ need of waiting for others to "move" for you to receive the update (fixes
+ dead characters never showing up on the map) [Skotlex]
+ * Fix to prevent using main chat when it disabled in atcommand_athena. [LuzZza]
+ - Fixed message codes in duel functions.
+ - Small fix in log_refine, incorrect compare expression.
+ * Some cleaning of the warp portal code so that when it is "pre-casted" it
+ doesn't mess up with other casted skills. [Skotlex]
+ * Some fixing on the weapon-refine code. [Skotlex]
+ * Cleaned up some npc_event error reporting. [Skotlex]
+ * Some cleanup of the castend routines to not clear the skill variables if
+ for some reason the casted skill triggers another skill. [Skotlex]
+ * Vending is now cancelled on a pc_setpos [Skotlex]
+ * Pressure again ignores Basilica. [Skotlex]
+ * Fixed attacker's sc being nulled when the target's sc is empty (fixes
+ most status changes not taking effect during battle) [Skotlex]
+ * Slaves now do a battle_check_target to check if the new target is an
+ enemy when acquired through the master's skilltarget. [Skotlex]
+ * Fixed SC_SKE halving de2 twice. [Skotlex]
+2006/02/20
+ * The Super Novice Explosion Spirits skill will now trigger when the last
+ sentence is said (not after the next sentence as it was currently) [Skotlex]
+ * Now the default delay of amotion is applied only for BF_WEAPON, non
+ NK_NO_DAMAGE skills (so stuff like Summon Spirit Sphere get the default
+ skill delay rather than ASPD) [Skotlex]
+ * Made the Char-SQL server send the GM listing when the map server
+ connects. [Skotlex]
+ * Play-dead and Basilica now block Gospel [Skotlex]
+ * Map SQL server will no longer ignore the gm-list packets received from
+ char. [Skotlex]
+ * Login-SQL server will not free the current GM listing if the SQL reading
+ of it failed (prevents GM lists being lost on SQL connection problems)
+ [Skotlex]
+ * Login-SQL will now read for the GM list ALL accounts with level above 0,
+ not just those with level above min_gm_level (just like the TXT server
+ does) [Skotlex]
+ * SC_NOCHAT is not dispelled on death now. [Skotlex]
+ * Cleaned up the global message function, Super Novice Explosion Spirits
+ will not trigger on maps where said skill can't be used. [Skotlex]
+ * Close confine won't get the bonus range on cast as other skills do due to
+ exploits. [Skotlex]
+ * Fixed a bug in setnpctimer. [Skotlex]
+ * Menu-based skills now use their own variables separetly from the normal
+ skill variables. This should enable them to work even when you keep doing
+ other stuff between the menu invocation and selection. Also gives a better
+ control over packet-based exploits. Affected skill/script-commands are:
+ [Skotlex]
+ - Arrow Crafting
+ - Warp Portal / Teleport
+ - Item producing
+ - Identify
+ - Repair weapon
+ - Pet egg selection
+ - Hindsight
+ - Weapon refine.
+ - Feel of the Stars, Moon and Stars.
+ * Corrected the implementation of Gangster's Paradise to work as it should.
+ [Skotlex]
+ * Fixed Close-confine not properly ending on a knockback (that includes
+ backsliding) [Skotlex]
+ * Changed MAX_RANDITEM from 2000 to 10000 to fit new databases [Komurka]
+ * Fixed Taekwon stances not triggering. [Skotlex]
+ * Added atcommand @exp [Skotlex]
+ * Added error reporting when add_timer_interval receives a negative/0
+ interval value. [Skotlex]
+ * Fixed a possible infinite recursion bug with splash self skills. [Skotlex]
+ * Modified the way firewall_hits_on_undead works, to loop and invoke
+ multiple skill_attacks based on the value. Now it behaves a lot closer to
+ how Aegis Firewall does (except a good default value for this config switch
+ is missing) [Skotlex]
+ * Preparing eA for new mob_skill_db from Aegis 10.2 [Komurka]
+ - increased MAX_MOBSKILL 32 -> 40
+
+2006/02/19
+ * Some fixes to the last item usage tick. Items should be working fine now.
+ [Skotlex]
+ * Fixed parsing of @kamic/@kamib to check for case. [Skotlex]
+ * Now you can hide from Pressure. [Skotlex]
+ * Weapon endowing will work on targets already endowed with the same
+ element. [Skotlex]
+ * Now reseff cards will take effect even if the status change is passed
+ with &8 flag. In short, now reseff are ALWAYS applied to the status change
+ defense. [Skotlex]
+ * Removed a missing break that was making AM_TWILIGHT2/3 always fail.
+ [Skotlex]
+2006/02/18
+ * Removed the SP_<stat> cases from status_get_sc_def as they were colliding
+ with other status changes. [Skotlex]
+ * Implemented SG_MIRACLE (Miracle of the Sun, Moon and Stars) [Komurka]
+ - duration is stored in battle_config.sg_miracle_skill_duration (currently
+ it's set to 10 minutes)
+ - ratio is stored in battle_config.sg_miracle_skill_ratio (currently it's set
+ to 0.01% chance per character move)
+ - this skill enables you usage of all Warmth skills, Comfort skills, and also
+ all mobs will be target of the Stars regardless of the day and map
+ - you'll see message "[Miracle of the Sun, Moon and Stars]" when skill kicks in
+ * Added upgrade file upgrade_svn5322.sql because apparently not everyone
+ has the guild table with autoincremental guild_id defined. [Skotlex]
+ - If you can't create guilds, chances are you need to apply this ugprade.
+ * Fixed a missing break that was making Heal, Resurrection and some others
+ become attack skills [Skotlex]
+ * Some CELL_NOSTACK Mod updates: [Skotlex]
+ - Made the free-cell lookup more extensive.
+ - Allowed pc_setpos to place players on top of cells that are stacked
+ - Fixed a logic bug in the mob-walk code that was making them get stuck and
+ not move (triggered quite often when the cell no stack mod is enabled)
+2006/02/17
+ * Cleaned up irc.c, may it compile now on Windows? [Skotlex]
+ * Updated the VC project files by Joshuaali. [Skotlex]
+ * Fixed possible crash on pet egg select. [Skotlex]
+ * Massive update on the way splash/area (non-ground) skills work. [Skotlex]
+ - the new column 'splash' in skill_db is now used to determine the area of
+ effect of all related skills (eg: splash range of fireball, area of effect
+ of angelus, the splash damage area of mines, etc)
+ - nk definition update. &1 is no damage skills, &2 is for splash skills. A
+ skill can be tagged 3 to indicate it is both. This is used to indicate the
+ type of handling the skill should use, but it also helps as all splash
+ skills get an extra check to prevent them from hitting 'unhittable'
+ characters (ie: hidden) while all skills not tagged as non-damage can
+ trigger auto-spells.
+ - All self skills are automatically executed as no-damage skills and get
+ re-routed as damage skills when the source and target do not coincide (this
+ handles all combo skills)
+ - Some skills may have screwed up (I fixed/moved all which I could find
+ needed updating). As usual, report any issues.
+ * Added an upgrade_svn file that should fix the party table by making the
+ party_id auto-incremental. Apply this or new parties will always fail!
+ [Skotlex]
+ * Changed around the included files in irc.c to see if it compiles under
+ Win32 native. [Skotlex]
+ * Char-SQL server updates: [Skotlex]
+ - Removed the unnecessary party/guild check on each char-save.
+ - Removed the 'quick loaded char' messages.
+ - Some code cleanup.
+ - Fixed one or two memory leaks.
+ * Applied the suggested fixes by Joshuaali to fix the compiling of the sql
+ map server on Win32 systems. [Skotlex]
+ - note that irc.c is still uncompilable, but the rest "should be fine" now.
+ * Fixed the memory leak on opt_2str as pointed out by End of Exam [Skotlex]
+ * Fixed a few char SQL memory leaks as pointed out by End of Exam [Skotlex]
+2006/02/16
+ * Fixed a crash in AL_TELEPORT. [Skotlex]
+ * Now you can't close-confine and already confined mob. [Skotlex]
+ * mysql/my_global.h now includes winnt.h under Windows systems... [Skotlex]
+ * Some code cleanup of status.c [Skotlex]
+ * Removed the check that prevented mobs from walking into a basilica. [Skotlex]
+ * Added a new column in the skill_db to specify the
+ splash-range/area-of-effect of skills. (Work in progress) [Skotlex]
+ * Autocasted AL_TELEPORT should now automatically pick menu entry rather
+ than showing the box up. [Skotlex]
+ * The battle config options sp_rate and hp_rate are now applied
+ independently of the same type of bonuses from cards. [Skotlex]
+ * In CELL_NOSTACK mode, mob_canreach will now ignore other players when
+ checking if there's a path to the player. [Skotlex]
+ * Added RG_RAID to the list of skills that need a status_checkskilluse on
+ skill_attack. [Skotlex]
+ * Added the mapflag check monster_noteleport to AL_TELEPORT. [Skotlex]
+ * Fixed the sc_def rate not being reduced in status_change_start. [Skotlex]
+ * Changed the include in irc.c from strings.h to string.h, which fixes a
+ bunch of compilation warnings here... [Skotlex]
+ * Updated the SQL login/char servers to let the mysql server grant the new
+ IDs for accounts/chars/pets/parties/guilds instead of them being handled by
+ the server. [Skotlex]
+ * Some cleaning of the pc item use functions. [Skotlex]
+ * Gospel shouldn't block enemies in certain situations from using items
+ now. [Skotlex]
+2006/02/15
+ * Fixed crash in chrif_load_scdata warning message. [Skotlex]
+ * Fixed pets displaying "strangely" when they did not have their pet armor.
+ [Skotlex]
+ * Added battle config option pk_level_range for specifying valid level
+ ranges to engage in PK (battle/misc.conf) [Skotlex]
+ * Added battle config allow_es_magic_player to enable SL_S* skills to work
+ on non-mobs. (battle/skill.conf) [Skotlex]
+ * Fixed the char servers to store correctly exp as uints. They are also
+ capped to LONG_MAX before being sent to the client. [Skotlex]
+ * TK_DODGE now dodges all ranged attacks, when used with SPURT, dodges
+ everything. [Skotlex]
+ * The autospell loop now cancels after one successful cast. This means if
+ you have 10 autospells with 100% casting rate, only one will come off with
+ each hit instead of all of them. [Skotlex]
+ * Warm skill update: [Skotlex]
+ - they are type BF_WEAPON, so that they may trigger effect/spell cards.
+ - Changed their element to -1 to carry on weapon's element.
+ - Against player it only damages 60SP per "hit"
+ - Against non-players it is a knockback skill as it was before.
+ - Hit frequency increased to once every 100ms.
+ * TK_DODGE now only dodges ranged weapon attacks, while under Spurt mode
+ it dodges everything (provide better information if this is not how it
+ should behave as the current info given is conflicting itself >.<)
+ [Skotlex]
+ * Cleaned up and expanded the sc_def_rate battle config. The new battle
+ flags are mob_sc_def_rate, pc_sc_def_rate, mob_max_sc_def, pc_max_sc_def
+ [Skotlex]
+ * Modified Marionette Control so that the max bonus stats you get is capped
+ to your server's defined max stats instead of 99. [Skotlex]
+ * Mobs are no longer affected by the vs_traps_bctall switch. [Skotlex]
+ * Added function pc_damage_sp to damage the SP of players, updated code as
+ necessary. [Skotlex]
+ * Fixed @lvup command adding levels instead of substracting when you
+ specify a negative quantity. [Skotlex]
+2006/02/14
+ * pc_setinventorydata won't use itemdb_search on empty inventory slots (id
+ = 0) [Skotlex]
+ * Fixed the icon from Provoke being gone. [Skotlex]
+ * Fixed skill_timerskill (most notable skill broken: water ball doing 1
+ hit) [Skotlex]
+ * Removed the declaration of puchar and pchar from my_global.h which was
+ preventing compiles on native win NT systems. Drawback is now Win9X systems
+ will fail to compile instead... [Skotlex]
+ * Hiding cancels Close Confine now. [Skotlex]
+ * ST_MOVE_ENABLE now also checks for pc_can_move(), and only perform a walk
+ check if the skill is ground targetted. [Skotlex]
+ * Moved the berserk_cancel_buffs code to status_change_start. [Skotlex]
+ * Moved most checks of status_isimmune() to status_get_sc_def [Skotlex]
+ * Allowed Endow skills to go through status_isinmune characters. [Skotlex]
+ * Fixed PR_BENEDICTIO not taking away all SP. [Skotlex]
+ * Modified the way Status changes are linked to skills for an easier to
+ read implementation (see status_initChangeTables). [Skotlex]
+2006/02/13
+ * Added battle config sc_def_rate which adjusts natural defense of
+ characters against status changes (see conf/battle/battle.conf). [Skotlex]
+ * Pet eggs will now not be deleted from the inventory until they arrive
+ from the char-server. [Skotlex]
+ * pc_readdb will now print if any classes are missing their exp tables.
+ Only exception are JOB_WEDDING and JOB_XMAS. [Skotlex]
+ * Made the NPC_BREAK* skills attack skills again, their chance of equipment
+ breaking code was moved to skill_additional_effect. [Skotlex]
+ * Now when the exp table does not has enough data to reach the max level
+ specified, the max level will not be reduced to enable leveling through
+ quests/scripts/gm-commands/etc. [Skotlex]
+ * Made Land Protector Block Hammerfall. [Skotlex]
+ * Updated item_db code to stop creating items for every non-existant ID
+ used. Instead it will complain, and use a dummy item that has the view ID
+ of an apple, and it's type 3 (etc item). [Skotlex]
+ * Modified PA_GOSPEL so that the random damage attack becomes a BF_MISC
+ attack. [Skotlex]
+ * Added pc_resetskill when lowering job level and there's not enough
+ skill points to substract. [Skotlex]
+ * Fixed SG_FUSION costing SP to deactivate. [Skotlex]
+ * Some cleaning up at pc_setpos to prevent calling pc_clean_skilltree
+ [Skotlex]
+ * Enabled use of TF_HIDING while Cloaked. [Skotlex]
+ * pc_resetstate won't remove wedding skills now [Skotlex]
+ * NPC_POWERUP now gives +40% atk per level. [Skotlex]
+ * Water elementals can be frozen again. [Skotlex]
+ * Fixed the sc_def equation in status_change_start. [Skotlex]
+ * Fixed an extra semi-colon that broke win32 compiles. [Skotlex]
+ * Some rewriting of bounds checks in @baselvup, @joblvup and the #
+ equivalents to prevent signed/unsigned comparisons. [Skotlex]
+ * Now slaves give exp/loot (exception: player slaves still stick to the old
+ rules of no exp/loot) [Skotlex]
+2006/02/12
+ * Some path cleanups meant to get the CELL_NOSTACK mod working better with
+ path searching and the like. [Skotlex]
+ * Optimized functions skill_addtimerskill/skill_cleartimerskill [Skotlex]
+ * Fixed SC_DANCING for non players (was making dances only last 1 second
+ for them) [Skotlex]
+ * Modified map_moveblock to handle updating dance's position as well as
+ ending close confine status effects. [Skotlex]
+2006/02/10
+ * Fixed Sonic Blow's damage for lvl 1~9 [Vicious]
+ * The status window will now show the total power of both weapons instead
+ of just the right-hand weapon for dual wielders. [Skotlex]
+ * Removed #include <lcms.h> from irc.c, since it's unused and some people don't have it. [Valaris]
+ * Changed the default MAX_LEVEL supported by the map server to 1000. [Skotlex]
+ * Pet Lures won't be consumed now when used on a non-mob. [Skotlex]
+ * Fixed map_searchrandcell function. [Skotlex]
+ * Modified the NPC_BREAK* skills to break equipment at a 10%*lv rate. [Skotlex]
+ * Modified the drop item routines to perform stacking checks only for
+ player attempted item drops, therefore, mob drops will stack up to
+ infinity. [Skotlex]
+ * NPC_POWERUP now gives +20% attack per skill level. [Skotlex]
+2006/02/09
+ * Fixed "set baselevel, X" sending one to a different level than the one
+ requested. [Skotlex]
+ * Added range checking to mob skill loading of permillage and delay to
+ prevent overflows. [Skotlex]
+ * Fixed pc_gainexp not working for next level exp requirements above
+ INT_MAX. [Skotlex]
+ * Fixed the display of @showexp not working right for exp values above
+ INT_MAX. [Skotlex]
+ * Removed the conf sql code for now. Maybe will continue later with that project.
+ Lowered the irc keepalive timer, and added some checks for use_irc that should have been there.
+ Added a return line \n to the beginning of the title screen. [Valaris]
+ * Added function mob_respawn which makes a mob respawn on spot 3 seconds
+ after defeat if SC_KAIZEL is active. [Skotlex]
+ * Modified NPC_REBIRTH to use Kaizel level 1. [Skotlex]
+ * Added setting max_exp_gain_rate which caps how much exp you can get from
+ a single kill. See battle/exp.txt for details. [Skotlex]
+ * pc_readdb will now cap experience required per level to UINT_MAX, it will
+ warn if the exp table has exp values above said limit. [Skotlex]
+ * Changed the default of skill_delay_attack_enable to no. [Skotlex]
+ * Code rewrites in mob_damage and party_exp_even_share for correctly
+ handling overflow issues. Now uses UINT_MAX for range comparisons, as it
+ should be. [Skotlex]
+ * Also modified the mob_db reading to use UINT_MAX for exp limits, changed
+ their exp/job exp fields to unsigned int as well. [Skotlex]
+ * Modified multi_level_up behaviour to work as specified by Kyoki. That is,
+ on a level up, the max carry-over exp is the exp needed for the previous
+ level -1. [Skotlex]
+ * Modified the skill attack display of Meteor Assault and the Warm Skills
+ (I think the caster should no longer do fancy animations now on each hit)
+ [Skotlex]
+ * Added back water elemental targets being inmune to SC_FREEZE [Skotlex]
+ * SQL compile fix [Komurka]
+
+2006/02/08
+ * Added battle config option skill_caster_check, which does a
+ status_checkskilluse on all skill attacks. When enabled (default on) the
+ caster of the skill is checked on all skill_attacks, which means that
+ ground spells will make no effect if the caster is unable to fight
+ (stunned, frozen, etc) [Skotlex]
+ * Added battle config option status_cast_cancel. When enabled (default off)
+ some status changes (freeze, stone, etc) will cancel your cast. [Skotlex]
+ * Fixed the death exp penalty underflow bug. [Skotlex]
+ * Rewrote/organized status_change_start, it now receives the base rate for
+ the effect. It handles reducing this rate/duration through natural
+ resistances and whatever else should reduce it. [Skotlex]
+ * Fixes to exp2.txt on the novice job exp. Thanks to rollopop. [Skotlex]
+ - Also modified exp2.txt to use the normal max levels by default.
+2006/02/07
+ * Modified battle_check_distance, mobs should no longer find a diagonal
+ spot on which they lock onto their target, yet fail to attack from. [Skotlex]
+ * Removed the max level configs from battle/exp.txt [Skotlex]
+ * Now NPC_POWERUP uses SC_INCATKRATE instead of SC_EXPLOSIONSPIRITS for
+ enhancing damage. Instead of +1k atk per skilllv, it is +50% atk per
+ skilllv. [Skotlex]
+ * Fixed char server changing the save/last point to new grounds in certain
+ situations. [Skotlex]
+ * Fixed SG_STAR_ANGER not getting it's damage bonus at all. [Skotlex]
+2006/02/06
+ * Added a custom exp table that goes up to level 1000 (db/exp2.txt). [Skotlex]
+ - It uses a inverse exponential growth rate to mimic the official exp rate
+ increase as close as possible.
+ - It overrides the exp level of the last 5~10 official exp values for a
+ smoother curve.
+ - It's adjusted so that the Lv1000 exp requirement for Advanced Base/2nd
+ Job is close to the unsigned int limit without going above it (limit is
+ 4294967295 in my system. It goes up to 42k Million on Advanced
+ Base lv1000, I think)
+ * Fixed startnpctimer starting multiple timers instead of failing when the
+ npc timer is already running. [Skotlex]
+ * Venom Splasher update: [Skotlex]
+ - always hits (but splash damage targets can still avoid it)
+ - Being hit does not cancels it,
+ - works at 75% or less of target's HP
+ - being hit normally while under the count has a chance of causing poison.
+ - Damage is +400% + 50*lv%
+ * Using autoloot with no arguments now toggles it between @autoloot 0 and
+ @autoloot 100% [Skotlex]
+ * Falcon Assault now takes Blitz Beat lv5 as base damage. [Skotlex]
+ * Fixed pc_makesavestatus not updating status.option correctly. [Skotlex]
+ * Corrected Waterball so that higher levels can do insane amount of hits. [Skotlex]
+ * Altered slave behaviour. No more random walking, will stay within 2 cells
+ of their master. [Skotlex]
+ * Reverted the Summon Slave behaviour to not adjust level based on number
+ of current slaves. [Skotlex]
+ * Coma no longer sends SP to 1. [Skotlex]
+ * Updated Meteor so that when level 11 or more is casted, the area over
+ which meteors fall is tripled. [Skotlex]
+ * Dark elemental characters are now inmune to Curse. [Skotlex]
+ * Fixed sc_data saving to sql buffer building method. Thanks to its_sparky. [Skotlex]
+ * Changed the map zone reading from using pow to a bit shift. [Skotlex]
+ * Experience has now been changed to unsigned int, and is read as such from
+ the dbs. [Skotlex]
+ * Increased HT_DETECTING seek range to 7x7 [Skotlex]
+2006/02/05
+ * Added some of eAIRC bot code, written by me and LittleWolf.
+ It is disabled and has no configuration options yet, as it is not finished. [Valaris]
+ * Fixed and documented script command "callshop". [Skotlex]
+ * Updated sq;-files/mob_db.sql with current mob_db. [Skotlex]
+ * Updated sql-files/item_db.sql with current item_db. [Skotlex]
+2006/02/04
+ * Skotlex's Falcon Assault fix. [Vicious]
+2006/02/03
+ * Fixed the debug script messages specifying the wrong mapname for NPCs.
+ [Skotlex]
+ * Now you can't hide from earth elemental attacks (status_check_skilluse).
+ [Skotlex]
+ * Grand Cross/Grand Darkness can no longer get the ignore defense -armor
+ piercing bonuses from cards. [Skotlex]
+ * Loki's weil is now ignored by bosses. [Skotlex]
+ * Land Protector and Gantantein should now ignore traps. [Skotlex]
+ * Fixed Shinobi card so that it fails when you aren't next to a wall.
+ [Skotlex]
+ * After a guild master change, the new guild master has his guild skills
+ blocked for 5 minutes to prevent abuse. [Skotlex]
+ * Fixed txt-converter compilation errors [Komurka]
+
+2006/02/02
+ * Fixed crash in status_change_timer. For some reason the block type switch was removed. [Valaris]
+ * Crash fix in npc.c npc_timerevent.
+ was: struct timer_event_data *ted = (struct timer_event_data*)ted;
+ changed: struct timer_event_data *ted = (struct timer_event_data*)data;
+ Skotlex, I am assuming it's calling from the passed data var, If I'm wrong
+ please fix it. I just know what was there was definitely not correct. [Valaris]
+ * Improved the NPC timer system to enable multiple timers going on at a
+ time with different players attached to each. Now npc event timers are of
+ two types: attached or global. The global timers don't have a player
+ attached and can be started/halted by anyone. The character timers have a
+ player attached, and they can only be stopped by a script that has the same
+ player attached. [Skotlex]
+ - Now player attached scripts will auto-abort when the atteched player
+ quits the map server.
+ - Of course, this requires some major testing as it's prone to have bugs...
+ * Applied the Entry Reusage System to the battle delay damage timers.
+ [Skotlex]
+ * Fixed the map server complain when using the default user/password
+ showing up if you set the new user/pass on the import file. [Skotlex]
+2006/02/01
+ * Fixed compile errors and warning in chrif.c and charsave.c. [Valaris]
+ * Map and char server now will complain if they are run using the default
+ user/password set. [Skotlex]
+ * Trick Dead makes you stop walking now. [Skotlex]
+ * Soul Burn is not affected by Lex Aeterna, not affected by target's cards
+ neither. [Skotlex]
+ * Freeze and Stone take preference over Benedictio. [Skotlex]
+ * Sleep/Stun/Petrify/Freeze block each other out. [Skotlex]
+ * Fixed areamonster when the passed class is negative. [Skotlex]
+ * Removed the clear screen when launching the server. [Skotlex]
+ * Integrated the status change variables into a single structure for easier
+ management. [Skotlex]
+ * Break fall should no longer trigger when inflicted by freeze/stone/etc
+ [Skotlex]
+ * Fixed an overflow in grfio causing read problems in Win32 builds [celest]
+ * Changed resnametable loading behaviour - grfio will load from data directory
+ first, and then from the highest priority grf only if that fails [celest]
+ * Increased grfio filelist limit to 1048576 to avoid problems when loading
+ too many large grfs [celest]
+2006/01/31
+ * Fixed skill_check_cloak to use the current skill level of the cloaking
+ skill and not pc_checkskill() to know if a cloaker away from a wall should
+ be uncloaked. [Skotlex]
+ * Likely fixed opening guild storage. [Skotlex]
+ * Removed no penelty mapflag for nifilheim. Confirmed on iRO. [Kayla]
+ * Changed default value of gm_cant_drop_max_lvl to 98. Also reworded the
+ comments for cant_drop_max and min. [Kayla]
+ * Disabled pet skills by default. To my knowledge they are only enabled on
+ cRO, not iRO nor kRO. [Kayla]
+ * PF_SOULBURN no longer ignores mdef. [Skotlex]
+ * HW_GRAVITATION should now invoke auto spells. [Skotlex]
+ * Cleaned up damage return code. Reflect Shield and the like now should
+ also trigger autospells from normal attacks (previously it was only worked
+ on skill attack returned damage) [Skotlex]
+ * Cleaned up Summon Slave mob skill to only summon number of missing mobs
+ to complete the skill level (that is, SS level 5 will always bring the
+ total count of slaves to 5, never above). [Skotlex]
+ * Fixed being able to Encore skills you no longer have in your tree.
+ [Skotlex]
+ * Added no HP regen while Bleeding, -25% ATK and ASPD penalties as well.
+ [Skotlex]
+ * Added VIT reduces duration of confusion. [Skotlex]
+ * Added "onspawn" mob skill condition. [Skotlex]
+ * Changed the exp table format. The new format allows specifying exp tables
+ for any particular class. Thanks to Playstester for converting the official
+ exp table to the new format. [Skotlex]
+ - UNTESTED: Report any problems asap.
+2006/01/30
+ * Autoloot now uses the item's base drop chance rather than final drop rate
+ to determine if it should autoloot the item or not. [Skotlex]
+ * Fixed super novices getting +10 to all stats temporarily when their death
+ count isn't zero. [Skotlex]
+ * Fixed Kahai displaying HP-SP as the total healed instead of HP [Skotlex]
+ * Cleaned up skill_repairweapon to prevent crashes when the target
+ vanishes/changes/whatever before the weapon to repair has been selected.
+ [Skotlex]
+ * Parsing the Storage/Guild Storage from the char server will now fail if the
+ storage has been modified and not saved yet. [Skotlex]
+ * Being hit now cancels confuse. [Skotlex]
+ * Added back the bleeding icon. [Skotlex]
+ * Fixed Combo Finish Soul Linked Effect being a 11x11 area rather than 5x5
+ [Skotlex]
+ * Added 'restricted' mapflag, based on lordalfa patch [Komurka]
+ - you can set restriction zone on map (see mapflag/restricted.txt)
+ - you can turn off item usage on certain restricted map in item_noequip.txt
+ - you can turn off skill usage on certain restricted map in skill_nocast_db.txt
+ * Moved MVP log code so it can log all MVP, not only when player gets MVP item,
+ thanks to Hatred_ [Komurka]
+ * One more small fix on 'bSPVanishRate' (hp -> sp) [Komurka]
+ * Added bSPVanishRate to const.txt - Dark Priest Card should work now ^^
+ * Implemented bonus2 bSPVanishRate for Dark Priest Card [Komurka]
+ - it isn't finished - I get '[Warning]: pc_bonus2: unknown type 0 50 10!' ><
+ * Applied lordalfa patch - you can now forbid usage of certain cards on PVP/GVG/WoE
+ defined in item_noequip.txt [Komurka]
+
+2006/01/29
+ * Added support for more account states like "Unavailable due to hacking/bug
+ investigation" etc, thanks to NeoSaro [DracoRPG]
+2006/01/28
+ * Added the night mapflag to the new maps. Removed some indor maps. [Poki#3]
+ * Added DISGUISE MobID; UNDISGUISE; script commands [Lupus]
+ - Made them for Eastern Year of the Fire Dog Event.(to be uploaded today)
+2006/01/27
+ * Added support for mob_avail.txt replacement for NPC classes. [Skotlex]
+ * Added "sense_type" config to conf/battle/skill.conf to select which defense
+ is displayed on the sense screen. Defaults to displaying def+def2. [Skotlex]
+ * Modified traps so that once they trigger they set themselves as "Into the
+ Abyss" casted traps, so that if you remove them, you won't earn the item.
+ [Skotlex]
+ * Fixed Basilica (small bug introduced yesterday) [Skotlex]
+ * Hopefully cleaned out the warnings when compiling the char-SQL server.
+ [Skotlex]
+ * Updated the makefile for the plugins to take into account the ers.o file.
+ [Skotlex]
+2006/01/26
+ * Updated VC project files, thanks to D-Kalck. [Skotlex]
+ * Rare drop announces will now be done based on the mvp_sd (character who
+ did most damage) instead of sd (character that delivered final blow)
+ [Skotlex]
+ * Fixed TK Doridori bonuses to double your regen instead of giving 30Hp/3Sp
+ [Skotlex]
+ * Fixed Sense displaying def2/mdef2 when it should display def+def2 / mdef
+ + mdef2. [Skotlex]
+ * Fixed Super Novices losing their skill tree (showing up just basic skill)
+ under certain circumstances. [Skotlex]
+ * Cleanup and optimization of the movement routines. [Skotlex]
+ * Added experimental feature "Cell Stack Limit". When enabled (see
+ src/map/map.h) it should limit the amount of characters that can be placed
+ on the same cell. That's assuming it works (experimental and untested as of
+ yet) [Skotlex]
+ * Hopefully fixed Benedicto checking on the west/east tiles instead of the
+ left/right tiles of the caster. [Skotlex]
+ * Fixed mobs being unable to move on tick loopback (which happens every ~51
+ days) [Skotlex]
+2006/01/25
+ * Reverted last change, when you log again it still shows the fake
+ icon. [Foruken]
+ * Temporary fix to fake mute status when using pk_mode and
+ !muting_player [Foruken]
+ * Probably fixed the max base/job battle config options actually enabling
+ characters to reach one more level than the max specified. [Skotlex]
+ * Fixed BSS Sacramenti not hitting demon type enemies. [Skotlex]
+ * Now poisoned monsters will show HP updates as their health goes down
+ (let's see if this finally convinces people that poison works u.u)
+ [Skotlex]
+ * Splitted up battle_athena.conf into multiple configuration files.
+ battle_athena.conf only contains import lines now, and all the
+ configuration options are located in conf/battle/* [Skotlex]
+ * Updated the db version with the new one by FlavioJS [Skotlex]
+ * Improved the error reporting when failing to load a mob skill due to
+ insufficient fields. [Skotlex]
+ * Changed map_getallusers to use the db interface getall (hope it doesn't
+ breaks horribly) [Skotlex]
+ * Added an attack delay to TK kicks to prevent the top10 rankers from
+ attacking normally during the skill animation. [Skotlex]
+ * Updated script.c to display the file not found error using braces as
+ delimiters to help when npc filenames include spaces and the respective file
+ is not found due to them) [Skotlex]
+ * Changed TK_RUN to a misc attack type which should enable you to halt the
+ skill quickly after starting it. Updated SC_SPURT to be triggered when you
+ stop running if you stopped running one sec or less after you started.
+ Corrected the icon of SPURT to be that yellow Running Man. The previous
+ footsteps effect was assigned to CHASEWALK. [Skotlex]
+ * fixed battle config item_auto_get setting autoloot to just 0.01% drops
+ rather than 100%. [Skotlex]
+ * Added Sharp Shooting check to skill_attack to prevent hitting hidden
+ characters. [Skotlex]
+2006/01/24
+ * Some cleaning up of battle_calc_damage, Assumptio should now also reduce
+ damage of all types of attack, not just weapon-based ones. [Skotlex]
+ * Incremented SL_MONK combo SP cost reduction to 25% [Skotlex]
+ * Updated Full Adrenaline Rush to work on all weapons except bows. [Skotlex]
+ * Updated the script engine to report the src of an error when there's a
+ problem with one of the script functions. For example, if there's a "player
+ not attached error", it will also print which NPC caused it. [Skotlex]
+ * Added RFIFOSKIP(fd,RFIFOREST(fd)) to the end of the login server's parse functions.
+ This is good for clearing out packets of one byte. [Valaris]
+ * Fixed noteleport mapflag affecting Warp Portal. [Skotlex]
+ * Fixed map server crashing when parsing an incomplete mob-skill line. [Skotlex]
+ * @autoloot 100 will now pickup items that have drop rates ABOVE 100. [Skotlex]
+2006/01/23
+ * Added battle config "no_spawn_on_player", see battle_athena.conf for
+ details. [Skotlex]
+ * Fixed bows doing less damage on criticals when having high dex. [Skotlex]
+ * Moved the enemy_critical adjustment to status_get_critical. [Skotlex]
+ * Fixed @chardisguise to use the same id checks as @disguise. [Skotlex]
+ * Fixed SightBlaster 'hitting' dead characters. [Skotlex]
+ * Basilica check in status_checkskilluse expanded to help mobs release
+ their target as soon as they walk into a basilica. [Skotlex]
+ * When a player stops walking their to_x and to_y is updated to their
+ present position. This MAY fix warp portal not warping players that were
+ already there waiting to be warped. [Skotlex]
+2006/01/22
+ * typo fixes (fell -> feel) [Komurka]
+ - mob_db_mode_list.txt updated
+ - removed some unneeded comments (//komurka)
+ * Some changes of @main. Now you can send main-chat messages by sending whisper
+ to nick "Main" (or any other, it can be set in inter_athena.conf). [LuzZza]
+2006/01/21
+ * Changed gm_can_drop_lv battle conf switch to gm_cant_drop_min_lv and gm_cant_drop_max_lv [Komurka]
+ * SL_SWOO (Esu) will only lasts 1/5 of normal time when used on a Boss-type monster [Komurka]
+ -SL_SKE (Esk) won't work on a Boss-type monster anymore (if you KNOW that it should work on them
+ write about it on forum; either way don't bother guessing ... SL can solo ANY boss with this skill ~.~)
+2006/01/20
+ * Fixed the login-TXT login Log. [Skotlex]
+ * Small update to sql-files/item_db.sql to fix speed potions (a complete
+ update will be done when possible...) [Skotlex]
+ * Fixed clone script command's duration being in ms rather than seconds.
+ [Skotlex]
+ * Taekwon Ready Stances combo time is now 2000 - 4*agi -2*dex ms instead of
+ a flat 2 secs (same reduction that Monk combos get) [Skotlex]
+ * Cleaned up code of SG_HATE, may fix the skill seemingly not working.
+ [Skotlex]
+ * Likely fixed Even-Share parties not breaking up when a character with
+ too high/low level rejoins in char-TXT servers. [Skotlex]
+2006/01/19
+ * Added config option atc_slave_clone_limit to limit the amount of
+ @slaveclone's a player can have. [Skotlex]
+ * The clone commands now fail when used on someone of higher GM level than
+ the caster. [Skotlex]
+ * Increased the size of the clif_disp_onlyself packet by one to see if it
+ fixes the mysterious cropping of the last character in the message.
+ [Skotlex]
+ * Now when use_statpoint_table is set to yes, it will be used to determine
+ the stat points you earn on level up. [Skotlex]
+ * Small fixes as pointed out by FlavioJs in the login TXT server to prevent
+ crashes in Win32 compiles. [Skotlex]
+ * Merged Marquis's implementation of Enjoyable Rest's earth scroll bonus.
+ [Skotlex]
+ * Fixed players being able to send custom crafted mute requests that would
+ go through regardless of their gm level and mute others. [Skotlex]
+ * Updated mapflags [Lupus]
+ * Modified the client_connect function in socket.c to allow different parse_functions to be called
+ based on the listening socket. After a make_listen_bind returns a listen fd, set that fd's
+ func_parse member to whatever parse function to be used. If this value is not manually set
+ it will just use the default_func_parse function. This only affects server listening sockets
+ in which the func_parse member isn't even used. [Valaris]
+ * gvg_traps_target_all now also affects traps in pvp maps. [Skotlex]
+ * All reflected damage has now a chance to auto-cast spells. [Skotlex]
+ * Fixed Casting ground spells from within basilica. [Skotlex]
+
+2006/01/17
+ * Updated the map server code to use some of the new db functions. [Skotlex]
+ * Fixed ground skills checking the wrong target-type on movement, hence
+ making them mostly useless (this is what the Warp Portal report was about)
+ [Skotlex]
+ * Some code updates to implement the new db interface. [Skotlex]
+ - SQL compilation not tested, so if it breaks someone report to fix it :X
+ * Added @clouds2 and clouds2 mapflag using effect 516. [Valaris]
+ * Fixed some weather effects not working or not functioning correctly. [Valaris]
+ * Cleanups and organization to maps_athena.txt and map_index.txt, thanks to
+ Poki for the cleanup work. [Skotlex]
+ * Some cleanup of the SG_FEEL code [Skotlex]
+ * Fixed debug mode compiling in VC7.1. Added optimizations to VC7.1 release mode.
+ Defaulted VC7.1 SLN to debug mode. [Lance]
+ * Temperory solved the freeing freed pointer error upon map-server shutdown. [Lance]
+
+2006/01/16
+ * Fixed clif_disp_onlyself packet length, thanks to Orn. [Skotlex]
+ * Imported Freya's autoloot system which enables one to specify the maximum
+ drop-rate to loot. [Skotlex]
+ * Refix of the mapreg SQL saving fix of a while ago... [Skotlex]
+ * Playtester custom eamobs spawn updates: coal Mines, umbala fields, and
+ minor changes to Sphinx and Geffen Dungeon. [Skotlex]
+ * Incremented a bit clone skill usage rate, their rate/delays are now affected
+ by the battle_config options mob_skill_rate and mob_skill_delay [Skotlex]
+ * Optimized use of BL_* constants by making them stackable (meant for
+ map_foreach* calls). Should improve performance by avoiding
+ battle_check_target calls on a bunch of invalid targets such as
+ items/skills/npcs on skills and other misc places. [Skotlex]
+ * Fixed mob skills that should trigger on status on "any bad". [Skotlex]
+ * TK classes no longer are inmune to the strip-effects of Jump Kick [Skotlex]
+ * Fixed SQL mapreg saving. [Skotlex]
+ * Reverted Ice Wall Behaviour (you can snipe/cast through it again) [Skotlex]
+ * Fixed possible crash in skill_check_condition on consume-delayed items [Skotlex]
+ * Skills whose range is increased by Vulture Eyes now get the range
+ increased by 10 for non players (assumes VE level 10). [Skotlex]
+ * Added cardfixes of near_attack_def_rate and long_attack_def_rate to misc
+ attack calculations. [Skotlex]
+ * Fixed Spirit of Wizard not working in a couple of instances. [Skotlex]
+ * Advanced Book now gives 1%*skill level success chance to create element
+ convert potion [Skotlex]
+ * Changed the FEEL skill implementation to store/use map indexes instead of
+ map names.[Skotlex]
+ * Fixed compilation of plugins. [Skotlex]
+ * Applied flaviojs's new db interface and fixed compatibility problems with Visual Studio. [Lance]
+
+2006/01/15
+ * Fixed poison damaging player even when under 25% hp. [Skotlex]
+ * Fixed permanent character variables in Char-TXT [Skotlex]
+ * Fixed previous change for stable. Whoops my 5am work again. [Kayla]
+ * Fixed the trade exploit allowing for a user to send packets while in a trade.
+ For instance the bank NPC becoming a zeny dupe. Kudos to clown. [Kayla]
+ * Added script source error reporting to set and getarrayelement, should
+ print NPC name and location (map, coordinates) on the console when there's
+ an error with these two commands. [Skotlex]
+ * Removed treasure chests spawning upon agitbreak, leading to exploits. [Lance]
+
+2006/01/14
+ * Removed the 5% success penalty for trying to make a convertor for which
+ you don't have the relevant enchant skills. [Skotlex]
+ * Fixed compilation of Login Converter. [Valaris]
+ * Fixed bSPGainRace and bExpAddRace with RC_NonBoss and RC_Boss. [Valaris]
+ * Lex Divina now shows the animation even when used on someone you can't
+ (non-muted, non-enemy player) [Skotlex]
+ * Quick hack to make Shield Reflect trigger auto-spells (only this kind of
+ return damage does it? Because other reflect cards like Orc Lord behave
+ exactly the same way...) [Skotlex]
+ * Fixed grf loading to attempt to load from all grf files specified in
+ grf-files.txt (looking for them in the same order specified in the file,
+ returns the first match found) instead of only looking up on the last
+ specified grf... [Skotlex]
+ * Fixed compilation of plugins. [Skotlex]
+ * Added error reporting to the db when a null key/data is attempted to be
+ inserted and the db is configured to not allow them. [Skotlex]
+2006/01/13
+ * Fixed labels located at the beginning of a script not being counted at
+ all. [Skotlex]
+ * Applied blackhole89's patch to enable dynamic menus. [Skotlex]
+ - Script reference doc updated accordingly.
+ * Ranking Taekwons with lv 90+ no longer get Quest/Wedding skills for free.[Skotlex]
+ * Readjusted Scream And Frost Joke so now the effect goes off no matter
+ where the caster went, but the effect will happen only around the area
+ where the skill was done regardless of where the caster is (which is how it
+ should work from a logical stand point) [Skotlex]
+ * Scream and Frost Joke now take effect 2secs after casting, and caster
+ must remain in same map for it to take effect. [Skotlex]
+ * Flying Side Kick can't be used by Soul Linkers now. [Skotlex]
+ * npc_reload should now correctly remove mobs and npcs that aren't placed
+ in any map (such as mobs that were killed and are waiting for respawn) [Skotlex]
+2006/01/12
+ * Fixed Ice-Wall range problem. [LuzZza]
+ * Corrected the guild_db_final function in int_guild.c of SQL char-server to
+ compile and function with the new db code. [Valaris]
+ * Fixed some advanced skills being able to be copied even when restricted [Vicious]
+ * Fixed a possible crash-source related to item-picking packets. [Skotlex]
+ * Now Top 10 ranking Taekwons with base level 90+ get their whole
+ skill-tree maxed out (but only as bonus-skills, they aren't saved on the
+ dbs) [Skotlex]
+ * Some cleaning of the char_name_letters implementation. Characters don't
+ need a space between them, in fact, placing a space in that config makes
+ the space count towards allowed/disallowed characters. [Skotlex]
+ * Some modifications to the db code to make the code portable. It may
+ compile on windows now. (note I can't test SQL compiles yet so report any
+ problems ASAP) [Skotlex]
+ * Fixed Venom Knife consuming two daggers. [Skotlex]
+ * Inverted the packet order in many skills which cause status effects. The
+ client expects the status-change packet to arrive before the skill packet
+ in order for opt3-related changes to make effect on the character. [Skotlex]
+2006/01/11
+ * Added @main command into atcommand_athena.conf. [LuzZza]
+ * Tuxedo and Wedding Dress no longer get a 'forced' gender check regardless
+ of config ignore_items_gender setting. [Skotlex]
+ * Added support for 'invisible' shops. These are shops that are loaded but
+ not placed on any map, so you can't click on them. [Skotlex]
+ - Example: -<t>shop<t>Invisible Dealer<t>-,1750:-1,1751:-1,1752:-1,etc...
+ - Make sure they have a unique name if you want to reference to it with...
+ * Added script command 'callshop' for invoking shops from within a script. [Skotlex]
+ - Usage: callshop "Shop Name", flag;
+ - Distance to shop is still checked, so it's best to use 'invisible' shops.
+ - flag determines shop selection: 1: Show buy list, 2: show sell list.
+ Anything else: show the buy/sell/cancel menu.
+ - Function returns 1 if successful, 0 otherwise, but it is recommended that
+ the script should be closed right away to prevent problems.
+ - Documentation to the scripts_command.txt reference file not yet added
+ because this command is as of yet untested and may need further refining.
+ * Newly created SQL guilds won't save the member-list right away (this
+ seems to be the reason why sometimes when creating new guilds, the
+ guild-master keeps guild_id == 0 in the tables) [Skotlex]
+ * Fixed char/int_storage.c reporting lines with too many items when in
+ reality said items had the exact max amount allowed. [Skotlex]
+ * Moved the status_change_clear code below the exp penalty so that the
+ SC_BABY effect will work. [Skotlex]
+ * Fixed the map_index never finding the last map specified in the
+ map_index file. [Skotlex]
+ * Fixed an overflowed pointer in char/inter.c, and an already free'd pointer
+ error in map/guild.c [Skotlex]
+ * Added battle option party_item_share_type, now you can choose between
+ round-robin (previous implementation) and random (default) [Skotlex]
+ * Fixed compilation of the plugins (due to the db change) [Skotlex]
+ * Fixed a few issues with the map server (notably npc_command_sub was
+ broken) [Skotlex]
+ * Added proper escaping of the motd string before inserting it on the rag
+ server info SQL table. [Skotlex]
+2006/01/10
+ * Updated the map-server to conform to the new db interface. Removed
+ DB_DELAY_FINAL_CHANGES and related code from db.* as now eA fully complies
+ to the new interface. [Skotlex]
+ * Crafting Arrows, Weapon, Forging/Upgrading now all fail if you have an
+ npc going on to prevent your inventory from being modified while selling.
+ [Skotlex]
+ * Updated the char-SQL server to etc etc etc new db etc etc etc. [Skotlex]
+ * Cleaned up the description of size_fix.txt [Skotlex]
+ * Updated the char-TXT server to be blah blah blah new db blah blah. [Skotlex]
+ * Updated both login servers to be fully compliant with the new db
+ interface. [Skotlex]
+ * Moved skill damage bonuses from cards to the 'second layer' which means
+ they are applied on top of previous damage bonuses rather than just adding
+ to them. [Skotlex]
+ * Some more updates to the db code as specified by FlavioJS [Skotlex]
+ * Fixed the memory leak of npc_unload_ev. [Skotlex]
+2006/01/09
+ * Some more updates regarding the new db system. [Skotlex]
+ - Note that there's currently a leak regarding npc_events (ev_db), but this one is
+ not a serious problem (unless you use a lot of npc_reloads) and will be
+ fixed as the db gets improved.
+ * Moved the Kaupe code to battle_calc_weapon_attack where it will dogde all
+ weapon-based attacks that can be dodged (giving the illusion of infinite
+ flee for skill's duration). [Skotlex]
+ * Moved Sonic Acceleration and Soul Linked SB damage bonus to the second
+ layer of skill modifiers. [Skotlex]
+ * Enchant Deadly Poison and True Sight damage bonuses are now applied after
+ skill modifiers rather than added with them (damage % stack type). [Skotlex]
+ * Modified Ice-Wall to work using cell types defines instead of directly
+ modifying the gat terrain information. Main reason for this is to enable
+ pc_setpos to place players on top of an ice-wall, because otherwise it
+ was forcing players to warp-around even in maps with noteleport set which
+ is prone to exploits. [Skotlex]
+ * Fixed SG_FUSION (SG_FUSION <-> SC_FUSION #_#) [Komurka]
+ * Now sense elemental values are again uncapped (so enemy with -25% resist
+ will show 230% instead of 0%), as requested :P [Skotlex]
+ * Replaced the db subsystem for FlavioJS's implementation and initial work
+ on updating the eA code to use it as intended. [Skotlex]
+ * Fixed Char-TXT server saving last/save maps with spaces on the left. [Skotlex]
+ * Fixed Char-SQL server saving new character's maps with spaces on the left. [Skotlex]
+ * Fixed Charsave method 1 saving memo maps with spaces on the left. [Skotlex]
+ * Changed the order of packets sent for Assumptio (may fix the visual not
+ showing up?) [Skotlex]
+2006/01/08
+ * Fixed the guild SQL cache removing guilds from memory when said guilds
+ had no data to save (but were not yet marked for removal) [Skotlex]
+ * Added a cap to limit Star Gladiator's job level to that of the normal
+ classes (instead of 2nd classes) [Skotlex]
+ * Fixed TXT char server parsing only the first character permanent variable
+ received from the map server and ignoring the rest. [Skotlex]
+ * Fixed @users crashing the server. [Skotlex]
+ * Added Arrow Repel to the list of skills whose range is increased by Vulture Eye. [Skotlex]
+ * Fixed the item pick-up rule for party options being working backwards. [Skotlex]
+ * Fixed progress info in TK_MISSION [Komurka]
+ * Fixed an aproximation error when calculating distances which causes stuff
+ like mobs thinking they are within attack range when they actually aren't
+ [Skotlex]
+ * Char-server will now be notified after a character logs out when using
+ charsave_method:1 [Skotlex]
+ * Added check to update pet's position on pc_movepos (stuff like High Jump)
+ when the master moves too far away or to a position the pet can't reach.
+ [Skotlex]
+ * Fixed char-save method 1 saving map names with padding spaces to the
+ left. [Skotlex]
+ * Now sense elemental values are capped to 0 as lower bound (so for an
+ enemy with -25% resist, it'll show 0% instead of 230%) [Skotlex]
+ * Updated sql-files/ mob_db.sql and item_db.sql to current TXT data.[Skotlex]
+2006/01/07
+ * If player is dead, and is spawned (such as @refresh), death packet is sent. [Valaris]
+ * Cleaned pc_attack_timer so that the attack timer will auto-readjust when
+ it triggers during the can't act tick instead of cancelling the attack
+ sequence. [Skotlex]
+ * Fixed compilation of the TXT-converter. [Skotlex]
+ * walkto x,y request packets are now ignored if you are sitting. [Skotlex]
+ * Fixed a typo that was making the party item-pickup style shared not
+ taking effect for the item_first_get_time regardless of setting. [Skotlex]
+ * Applied Playtester's custom mob spawns to the eamobs/ set. [Skotlex]
+ - These custom mob spawns are an experiment to balance out mob spawns and
+ put some sense into them (no crap like too strong AND too weak mobs on the
+ same floor, increasing mob difficulty the deeper into the dungeon you go,
+ etc), without moving mobs too far from where players are used to see them neither.
+ - To enable them, modify scripts_main to use scripts_eamonsters rather than scripts_monsters.
+ - Currently, the modified dungeons are: Glast Heim, Geffen Tower, Clock
+ Tower, Sphinx, Pyramids, Byalan.
+ * Added check to make sure guildspy and partyspy variables have value. [Valaris]
+ * Separated the permanent variables from the character status structure. [Skotlex]
+ * permanent variables are now loaded on their own packets as needed to
+ reduce the bandwidth wasted between servers. [Skotlex]
+ * Permanent account variables are now saved when the script is finished
+ instead of each time they were modified. [Skotlex]
+ * OnInit scripts and related code now executes after all perm variables are
+ received (so now account variables are accessible during it) [Skotlex]
+ * Fixed typo in pc.c causing crashes in Line 769. [Lance]
+ * Corrected VC7.1 prject files to include mapindex.c and mapindex.h [Lance]
+ * Corrected Wrath of the Star formula (added missing STR in equation) [Komurka]
+ - Added movement speed bonus to SG_FUSION (same as PecoPeco gives)
+ - You can now 'turn off' SG_FUSION
+ * updated NoIcewall maplags, thanks to Sir Loon [Lupus]
+ * soundeffectall modified to rely on dependancies depending on situation. [Lance]
+ * Modified getd to return 'pointer' (will be 'dereferenced' automatically) instead of value,
+ making it very flexible when paired with getelementofarray() [Lance]
+2006/01/06
+ * Corrected main.sql having incorrect syntax [Foruken]
+ * Cleaned up some maps in maps_athena.txt and added a bunch of cloned maps
+ to map_index.txt [Skotlex]
+ * Refine bonus is no longer increased by the number of hits from the skill
+ except for TSS [Skotlex]
+ * Dispelled Berserk won't drop HP back to 100 now. [Skotlex]
+ * Mobs that use NPC_SUICIDE won't give neither exp or loot now. [Skotlex]
+ * Summoned mobs that cannot move will be removed from the map when the
+ master is gone to another map AND the mob's map is a gvg ground. [Skotlex]
+ * Fog of Wall effects now work in both directions (outside -> inside,
+ inside->outside) [Skotlex]
+ * Fixed the sql guild loading always returning a blank guild when the
+ guild_id does not exists! [Skotlex]
+2006/01/05
+ * Some changes to the guild SQL code to report whenever a guild's id is not
+ matching the one it was stored with in the db, which in turn free's the
+ guild and doesn't saves it to perhaps prevent data corruption. [Skotlex]
+ * Corrected the fifo-buffer readjusting code to set a reserve-buffer size
+ of 1/8th of the inter-server link (32K) for said links. [Skotlex]
+ * The mapif_send* and charif_send* functions (char/login servers) will now
+ adjust the buffer size when there isn't enough space to write data to them
+ rather than abort sending the data. [Skotlex]
+ * Increased inter-server socket buffer size to 256*1024. Should fix problems
+ with 0x3004. [Kayla]
+ * Increased inter-server socket buffer size to 192*1024. Should fix problems
+ with 0x2b01. [Kayla]
+2006/01/04
+ * Fixed buildin_monster not working for random classes (dead branch, etc). [Skotlex]
+ * Reverted inter-server socket buffer size to 131072 bytes. [Valaris]
+ * Removed reduction of socket buffer sizes after WFIFOSET if the max size
+ is >= FIFOSIZE_SERVERLINK. This should reduce inter-server buffer overflows. [Valaris]
+ * Script command 'monster' will now fail when trying to spawn a mob-class
+ that is not in the mob_db (warning will be printed on the console) [Skotlex]
+ * Fixed a crash when spawning a mob who's class is not in the mob_db. [Skotlex]
+ * Some cleanups and improvements to the character saving algorithm meant to
+ make it harder to have dupe exploits during char-map connection lag
+ moments. [Skotlex]
+ * Doubled the inter-server link buffer size. [Skotlex]
+ * Fixed status_get_adelay messing up the mob's aspd :X [Skotlex]
+ * Changed skill_delayfix to use the amotion value as default delay for
+ weapon skills with no delay instead of attack delay (adelay is actually
+ twice your aspd, amotion is the same as aspd) [Skotlex]
+ * Added upgrade_svn4783.sql, which corrects the structure of the mapreg
+ table to use varchars as it should. [Skotlex]
+ * Fixed Meteor Assault. [Skotlex]
+ * Fixed (I hope) the double free'd pointer issue in the login servers. [Skotlex]
+2006/01/03
+ * Fixed the warp unloading code. [Skotlex]
+ * Updated Jump Side Kick to also clear Berserk Pitcher. [Skotlex]
+ * Preserve now protects against the stripping effects of Side Kick. Taekwon
+ Classes (TK/SL/SG) are also inmune to it. [Skotlex]
+ * Hopefully fixed the guild information not being sent in some situations
+ when people are added/removed from a guild. [Skotlex]
+ * Some cleaning up and bug fixes to the guild module of the char-sql
+ server. Let's see if it fixes anything up... [Skotlex]
+ * Added battle option show_party_share_picker. When enabled tells the
+ picker of the item who received the item when in a party with 'Party Share'
+ loot style. [Skotlex]
+ * Added the nullpo_retv line required for win32 compiles... [Skotlex]
+ * Added some cleanup code to properly remove all warp related information
+ on npc_unload (untested as of yet!) [Skotlex]
+2006/01/02
+ * Completed (almost) packet 0x1e9 which gives the party info. Now you can
+ see the party's item options when opening the alt+p menu. [Skotlex]
+ * Fixed regen only working when overweight. [Valaris]
+ * Added body size to clones. [Valaris]
+ * Corrected TK_JUMPKICK to remove Soul Linker spirit buffs and related
+ effects (except Berserk-Pitched effect) [Skotlex]
+ * Corrected TK_RUN to give +10 dmg bonus to kick skills when not wearing a
+ weapon. [Skotlex]
+ * Added Kaina's Enjoyable Rest bonus and Max SP bonus. [Skotlex]
+ * Fixed Stone Curse consuming gems while Soul Linked. [Skotlex]
+ * Fixed party-change-map packet incorrectly checking if the even share rule
+ was broken (party share should now correctly break on map-change, or when a
+ player has it's level reset) [Skotlex]
+ * Corrected the Jump Kick base-level damage bonus when combo-used. [Skotlex]
+ * Added the running damage bonus to the TK kicks. [Skotlex]
+ * Made the TK kicks end the Soul Linked status on targets. [Skotlex]
+ * Corrected Spirit of Wizard to nullify any bounced back spells. [Skotlex]
+ * Cleaned up the natural/skill HP/SP regen routines. [Skotlex]
+ * Fixed Turn Kick not knocking back nearby enemies. [Skotlex]
+ * Added the damage bonus to Flying Side Kick when used from a combo.
+ However I am waiting for the actual equation (currently just does +300%
+ dmg) [Skotlex]
+ * Fixed Counter Kick for ranking Taekwons. [Skotlex]
+ * Added walk slowdown and aspd penalty to Eska. [Skotlex]
+ * Fixed status_get_size which seemed severly broken. [Skotlex]
+ * Fixed Kahai to only display actual amount of HP healed. [Skotlex]
+ * Now when a script's map is not found (or not loaded on the map server)
+ the script engine will skip the whole script instead of just the first
+ line. [Skotlex]
+ * Fixed Soul-Linked Dancers not receiving the Bard songs. [Skotlex]
+ * Updated Joshuaali's VC-8 project files. [Skotlex]
+2006/01/01
+ * Some improvements to the login server (txt/sql) to prevent memory 'leaks'
+ from accounts that logged in but where never properly set as logged out.
+ [Skotlex]
+ * Fixed mapindex not working for last map loaded in map_index.txt [Skotlex]
+ * Added support for packet 0x1e9, party_main_info. Packet is still
+ incomplete and the client is ignoring it currently... [Skotlex]
+ * Changing party options now does not alters item party options. [Skotlex]
+ * Corrected Kahai healing even when there's not enough SP to do so. [Skotlex]
+2005/12/31
+ * Fixed the additional effects on normal attacks of Enchant Poison, Enchant
+ Deadly Poison and Kahai not taking effect except when the attacker was a
+ player. [Skotlex]
+ * Resurrection now fails on gvg maps (when reviving) [Skotlex]
+ * Kaite now works on player-casted spells regardless of level... [Skotlex]
+ * Fixed Kahii healing 0 rather than 200*skilllv... [Skotlex]
+ * Mobs will now go after the loot as soon as they spot it rather than on
+ their next random-walk time. [Skotlex]
+ * Set the 56th byte in packets 7b and 1da. It deals with acceleration in directions.
+ It's just like the final byte in packet 0x87. Server-side update of this still needs to be figured out. [Valaris]
+ * Fixed Kaziel not starting Kyrie Elison upon resurrection. [Skotlex]
+ * Fixed Kahai's healing display. [Skotlex]
+ * Fixed Kaite bouncing back always one spell. [Skotlex]
+ * Fixed and tested @waterlevel. It requires the grfs to be present as the
+ map layout height information is stored there but not in the map data kept
+ in memory. [Skotlex]
+2005/12/30
+ * Disabled certain packets from taking effect during trades to prevent
+ possible exploits (such as picking and dropping items, buying selling from
+ npcs, etc) [Skotlex]
+ * Now you can't move items to/from your inventory to the cart/storage
+ during a trade (this is to prevent possible item dup exploits) [Skotlex]
+ * Emergency Recall now only works from within woe grounds... [Skotlex]
+ * Removed returns from non-null lines in MOTD. Replaced returns in null lines with a space. [Valaris]
+ * Fixed a bug where MOTD wasn't displaying blank returned lines. [Valaris]
+ * Updated mapindex so that name lookups ignore extensions, and the loaded
+ maps are always terminated in .gat. Id lookups will always return a string
+ terminated in gat. Purpose? It enables specifying mapnames without the .gat
+ extension, so you can have npcs in prontera, no need for the .gat. And the
+ returned string always has a .gat for needed when it is passed to the
+ client. Now you can safely get rid of the .gat extension in all mapnames. [Skotlex]
+ * Fixed the txt-converters so they compile cleanly again. [Skotlex]
+ * Added mapflag script support for no loot, no exp, no return, no warp to,
+ nightmare drops (see db/const.txt for names) [Skotlex]
+ * Removed an extra } in int_party.c that caused compile errors. [Valaris]
+ * Fixed a crash when warp portals passed from passive to active. [Skotlex]
+ * Added a missing label (M_0) that was causing people to freeze when viewing the city list from "Miss Yoon" [Zephiris]
+2005/12/29
+ * Newly created char-SQL guilds will be saved inmediately rather than at
+ their next turn in the cache (may fix those guild disappearing errors)
+ [Skotlex]
+ * Implemented a map-index which maps map-names to a unique number, this
+ reduces memory required to store maps as well as the size of related
+ packets between the char/map server. Maps and their indexes are stored in
+ db/map_index.txt, and the index of a map should NEVER change (see file for
+ more details). The index is translated to/from map-names for saving, so
+ save-structures are not required to be modified. [Skotlex]
+ - PD: The new mapindex also found a bunch of broken map names in various
+ NPCs, someone will have to go fix them up.
+ * Updated the party member structure to hold the char_id. For end users,
+ the most noticable change is that now you can have more than one
+ character from the same account belong to the same party. [Skotlex]
+ - TXT users will have to wipe the party files, SQL users use the respective
+ upgrade file (upgrade_svn4726.sql) to generate the new party column.
+ * Updated the char-sql server to hold parties in memories until they are no
+ longer needed (like the guild-cache), also optimized the save routine to
+ avoid needless SQL calls. [Skotlex]
+ ** WARNING: Because of the previous optimizations, a lot of code was changed around
+ the map/char servers, the char-sql's party system got pretty much a
+ rewrite, so some problems are to be expected. Some basic testing with
+ parties over here showed no problems, hence the work is getting commited
+ as it is because it isn't getting any better without further testing.
+ * Set value of the last byte in packet 0x87 (walkok) to 0x88 (10001000).
+ This is a default value in Aegis, and has something to do with animation speed in certain directions.
+ This byte is going to need to be fully analyzed since it does change in Aegis, just that I have
+ been unable to figure out what the conditions are. [Valaris]
+ * Mob skills are not even read now if mob skills are disabled in
+ battle_athena. [Skotlex]
+2005/12/28
+ * Fixed xmas and wedding palette ignore options. It will also no longer send the dye packet if @dye is used. [Valaris]
+ * Some code cleanup meant to fix possible memory leaks regarding
+ parse_script() [Skotlex]
+ * Small fix to party-share item pickup which should fix the current item
+ dup exploit. [Skotlex]
+ * Merged Reddozen's implementation of Kahai. [Skotlex]
+ * Implemented Kaite (it simply changes the target of spell to the caster,
+ so the caster's status changes and defense are the ones considered)
+ [Skotlex]
+ * Removed Guilds Glory from guild skill tree, can be enabled with require_glory_guild
+ battle conf switch [Komurka]
+ * Cleaned up the implementation of Poison and Deadly Poison. Corrected a bug
+ on Deadly Poison that was KO'ing human players when it triggers under
+ certain circumstances. [Skotlex]
+ * Added guild_skill_tree.txt [Komurka]
+ - corrected guild skill tree
+ * Battle Orders, Regeneration, Restore and Emergency Recall now share their
+ 5 minute delay. [Skotlex]]
+ * Implemented SC_INTRAVISION [DracoRPG]
+ * Reorganized a bit DEF/MDEF calculation code [DracoRPG]
+ * Added a small licence notice at the top of every Athena source/header file, I've tried
+ to put it only where it should have been but I'm not a pro ^^ [DracoRPG]
+2005/12/27
+ * The 50% Weight Icon will now show up at whatever % was specified in
+ natural_heal_weight_rate [Skotlex]
+ * Fixed char-txt server crashing if trying to read storage lines with more
+ items than the max (excess items will simply not be read and a warning
+ printed) [Skotlex]
+ * Added silent_console config option to the servers to filter out the
+ console output (login_athena, char_athena, map_athena config files). Makes
+ it possible to hide unwanted messages by category, so for example you can
+ remove all info messages, or all warning+notice messages, etc. [Skotlex]
+ * Removed unused battle switches enable_upper_class and unit_movement_type. [Skotlex]
+ * Reenabled battle switches pet_defense_type, mob_defense_type and
+ mob_remove_damaged. [Skotlex]
+ * Applied Irmin's patch to add support for SQL codepages. [Skotlex]
+ * Fixed friend list saving if using a custom char table name (SQL version). [Valaris]
+ * Added check for mute in main chat [Foruken]
+ * Likely fixed lose Hp/Sp script commands when used on accesories. [Skotlex]
+ * Added 2 new script commands: getfatherid, getmotherid [Lupus]
+ * Fixed compatibility problems with stricter compilers. [Lance]
+ * Added joshuali's new VC8 project files and SQL database upgrade script. [Lance]
+ * Fixed juicer script typo, eliminating unlimited juicing capability with zero zeny. [Lance]
+2005/12/26
+ * Added check for free'd guild pointer beforing freeing in guild_save in int_guild.c. [Valaris]
+ * Added @kamic command. Now you can send colored GM-messages.
+ Syntax: @kamic <color> <message>. Color is 3-bytes hexadecimal number RRGGBB. [LuzZza]
+ * Implemented main chat (global chat channel). Usage: @main <on|off>, @main <message>. [LuzZza]
+ * Chasewalk players can now be hit in the same way a Cloaked player could.
+ [Skotlex]
+ * Added option mob_npc_event_type, read battle_athena.conf for details.
+ [Skotlex]
+2005/12/24
+ * Fixed @go, thanks to Persian [Vicious]
+ * Updated @go command for new cities, done by Harbin [Vicious]
+ * Added root user check and warning to non-Windows compiles. [Valaris]
+ * Added a check to remove characters that would normally be left unremoved
+ during shutdown because they just happened to be between maps. [Skotlex]
+ * Fixed the production code always giving 1 item instead of the value they
+ should (50/100/200 for Twilight Pharmacy skills) [Skotlex]
+ * Corrected easy path searching algorithm failing for some cases (which
+ incidentally seemed to be the reason skill_wall_check was broken) [Skotlex]
+ * Fixed compile for TXT map-server. [Valaris]
+ * Fixed stone curse's defense being checked versus int rather than mdef. [Skotlex]
+ * Fixed firewall treating everyone as undead/fire-element. [Skotlex]
+ * Added SQL read of cast_db. [Valaris]
+ * Added SQL read of skill_require_db. [Valaris]
+ * Added SQL read of skill_db. [Valaris]
+ * Added setting use_new_sql_db to inter_athena.conf for development.
+ Do not enable this setting, it will be merged into use_sql_db once all work is finished. [Valaris]
+ * Added some work towards sqlizing the rest of the databases. [Valaris]
+ * Changed @help2 to #help to display char commands. Cut @help in half
+ @help2 has the other half. [Kayla]
+2005/12/23
+ * Missed a change in txt login.c for bind_up. [Valaris]
+ * Cleanup organization of clif.c and script.c.
+ Please don't put extra functions beyond inits, try and organize a little. [Valaris]
+ * Removed login_ip option from login_athena.conf as it is not used. [Valaris]
+ * Fixed bind_ip option in login servers. [Valaris]
+ * Fixed a bunch of terrible typos in chrif.c [Skotlex]
+ * Fixed a terrible typo in the handling of broadcast messages which was
+ causing the map server to send garbage packets to the char server.
+ [Skotlex]
+ * Added resistance (int + luk/3) to Stone Curse's equation [Skotlex]
+ * Updated sql-files/item_db.sql to current txt version. [Skotlex]
+ * Fog of Wall update... Blindess won't affect bosses, blindness ends as
+ soon as you step out (players only) [Skotlex]
+ * Implemented the Strip equipment effects on mobs. [Skotlex]
+ * Now when Berserk ends, the char's HP goes to 100. [Skotlex]
+ * LK's Concentration now gives +50 hit rather than +50% [Skotlex]
+ * Inverted the handling of Individual/Shared item pickup rule for parties.
+ [Skotlex]
+ * Fixed the item ruling for parties not being correctly read from the save
+ files. [Skotlex]
+ * Now Star Gladiator uses 2nd Adv.Class Job EXP table (13th column) [Lupus]
+ - In future there could be added the 14th EXP column, specially for Star Gladiator
+2005/12/22
+ * Begin work on packet optimization .. not done yet [MouseJstr]
+ * Finished work on @help/@help2. @help will no longer show # commands. @help2 shows
+ them instead. [Kayla]
+ * Fixed compile warnings in atcommand.c and map.c. Fixed compile error in script.c. [Valaris]
+ * wedding_modifydisplay's default is now no (that's how it is on official)
+ [Skotlex]
+ * Some cleaning to skill_attack, also added target checking for splash
+ attacks/groundbased skills [Skotlex]
+ * Mobs will now stop walking if their target no longer exists (picked up
+ items, for instance) [Skotlex]
+ * Modified firewall to cause no damage delay when hitting undead
+ characters. It may fix undead mobs warping when walking through the
+ firewall. [Skotlex]
+ * Added script command "clone" for cloning of players. See
+ doc/script_commands.txt for further information. [Skotlex]
+ * Added @waterlevel debug command to read/change the current's map
+ water-level (command untested) [Skotlex]
+ * Enabled names for forged weapon/created Potions by default [Lupus]
+ - Old issues have beed solved long time ago, now items by TOP10 BS/ALCH gain their TOP10 bonuses
+2005/12/21
+ * Now left_cardfix_to_right won't take effect when there's no weapon equipped
+ on the right hand. [Skotlex]
+ * Updated slave AI to support player masters as well (that is, you could
+ have a non aggressive slave, and it will target any mobs the master
+ targets) [Skotlex]
+ * Added battle option skill_wall_check, when enabled, all ground skills
+ will do a check for each cell to guarantee a straight path between the
+ cells and the target tile. Should prevent AOE skills from hitting through
+ walls. Due to the possible performance penalty this setting brings, it
+ defaults to no currently. [Skotlex]
+ * Default skill delay for skills with no delay is now the normal attack
+ delay. [Skotlex]
+ * Extremity Fist/Charge Attack will fail if the player can't move to the
+ target. [Skotlex]
+ * Prepare kick skills now only fail for Soul Linkers. [Skotlex]
+ * Merged in Marquis007's work on SL_SKA/SL_SWOO [Skotlex]
+ * All skills except Shield Boomerang get the weapon's refine bonus now.
+ [Skotlex]
+ * Taekwon Ready Stances will now fail if you are a Second Job of the
+ Taekwon Tree (SL, SG) [Skotlex]
+ * Another fix to item picking for party-share. Hopefully it works alright
+ now (at least I believe it should be dupe-proof now) [Skotlex]
+2005/12/20
+ * Updated water heights for some maps, thanks to [Lupus]
+ - removed p_track02.gat from the maps list. Thanks to Justin84
+ * Fixed produce_db items always failing... [Skotlex]
+ * Hopefully fixed picking up items on a party-share type of party. [Skotlex]
+ * Txt map servers will now send the whole list of online characters at
+ UPDATE_INTERVAL (10 secs) rather than CHECK_INTERVAL (1 hour) so that the
+ online.html file will be correctly updated. [Skotlex]
+ * Fixed char_sql and char crash because of buffer overrun. [Lance]
+ * Added a flag to tag non-weapon based skills so that they don't get the
+ following bonuses: Star crumb damage, Mastery bonuses, Weapon Refine damage
+ upgrades. Currently applies only to shield skills. [Skotlex]
+ * Removed use of castle_id for guilds in char-sql server (use corresponding
+ upgrade_svn* file). TXT servers haven't been touched yet because that
+ would mess up the guild save files. [Skotlex]
+ * Online list of characters will be sync'ed every 10 secs for TXT servers.
+ [Skotlex]
+ * Merged in Reddozen's work to get Twilight Pharmacy working. [Skotlex]
+ - Create Deadly Poison Bottle and Holy Water are now both handled by the
+ item producing code.
+2005/12/19
+ * Fixed char servers not parsing correctly the online count packet (/who
+ should work fine now) [Skotlex]
+ * Fixed the Dodge walking speed bonus to Assassin. [Skotlex]
+ * Added the new Garden City Hugel and Kiehl maps. [Valaris]
+ * Corrected Kaupe/Kaizel so that you can cast it on self/family when
+ not-linked, and anyone when linked. [Skotlex]
+ * Fixed the mob damage log not getting the ID of the attacker registered...
+ [Skotlex]
+ * Added a new timer which updates only the count of characters on the
+ current map server to the char server. Update interval is 10 secs.
+ [Skotlex]
+ * Updated status_clear_debuffs to clear many other types of ailments
+ (Gospel should be clearing up most negative status changes now) [Skotlex]
+ * Fixed exp calc type 0 (dmg/total dmg) being calculated as 0 always. [Skotlex]
+ * Implemented the item pickup style for parties. [Skotlex]
+ - Party share distributes items in round-robin fashion among players who
+ are in the same map.
+ - Pick-up Style shared is needed for anyone to be able to pick up the item
+ bypassing the timers set for first/second/third sd. [Skotlex]
+ * Optimized map server's online-listing update timers. [Skotlex]
+ * Some updates to the online db in the char/char_sql servers, should help
+ fix some memory leaks due to chars left tagged as 'online' even though
+ that's incorrect. [Skotlex]
+ * Added buildin_warpchar script function. Useful for warp one player from
+ another player npc-session. Sytax: warpchar "map.gat",x,y,Char_ID; [LuzZza]
+ * Now opening storage will fial if the guild storage is open and viceversa.
+ [Skotlex]
+ * Total damage a mob receives is now stored on it's own variable. Damage
+ log implementation clean-up. [Skotlex]
+2005/12/18
+ * Fixed Close Confine not affecting the caster. [Skotlex]
+ * Fixed all skills except Extremity Fist not getting the weapon size
+ modifiers [Skotlex]
+ * Fixed Warp Portal checking for noteleport instead of nowarp mapflag
+ (again?) [Skotlex]
+ * Fixed baseJob working as baseClass (I hope it works fine now) [Skotlex]
+ * Fixed Doridori bonus for Super Novices [Skotlex]
+ * Updated new MOTD code so that it can compile on VC. [Valaris]
+ * Fixed clone's dyes changing when they attack. [Valaris]
+ * Declared pc_read_motd(void) in pc.h for the motd reload command. [Valaris]
+ * Added @reloadmotd for reloading the motd.txt into memory. [Valaris]
+ * motd.txt will now load into memory at startup instead of being read everytime a player logs in. [Valaris]
+ - motd.txt can now have lines commented with "//" .
+ - MOTD_LINE_SIZE is defined in pc.c, change this to increase maximum amount of lines allowed in motd.txt.
+ - Default motd line maximum is 128.
+ * Added a new script function 'setitemscript ItemID,"{ end; }"' [Lupus]
+ - Very useful for events that give TEMP item bonuses for short time period 8) A Custom New Year Event NPC's coming soon.
+2005/12/17
+ * Updated the svn eol-style properties to make merging between
+ linux and windows easier when we use more complex branching
+ system [4544: MouseJstr]
+2005/12/16
+ * left_cardfix_to_right now also moves the ignore race/element defense
+ bonuses (Ice Pick, Weed Killer, etc) [Skotlex]
+ * Some fixes to the job_name functions (rearranging inside msg_athena.txt
+ as well) [Skotlex]
+ * Left card to right fix will now also apply to defense piercing effects
+ (Ice Pick) [Skotlex]
+ * Fixed char-converter being broken for a type mismatch [Foruken]
+2005/12/15
+ * Fixed clone skills again. This time ground-based skills are working, and
+ support skills have a re-cast delay of half the skill's actual effect. [Skotlex]
+ * Fixed clone commands sometimes spawning the clone on a non-walkable tile
+ (which in turn sends the clone to a random map location) [Skotlex]
+ * Added debug information to the guild cache. Total number of guilds in the
+ db will be printed now (as long as the save log is active) [Skotlex]
+ * Updated SG_HATE to pick the specific class (Select a Monk, and the bonus
+ is against monks only, not Champions/Acolytes/Baby Monks) [Skotlex]
+ * Removed hardcoded table names in login_sql/login.c [Foruken]
+ * Some cleaning regarding the job tree skill-raising restrictions code.
+ [Skotlex]
+ * Optimized/cleaned up the job_name function, job names are now acquired
+ from msg_athena.txt. [Skotlex]
+ * Fixed race defense bonus against Boss/Nonboss checking versus the target
+ instead of the attacker (should fix Alice Card) [Skotlex]
+ * Some cleaning in clif.c [Skotlex]
+2005/12/14
+ * Fixed 'dead_branch_active' option. [Skotlex]
+ * Optimized use of weather effects, or should I say, no use.
+ Also re-added clif_clearweather to some of the weather effects, when they are turned off.
+ Why those were removed are beyond me.. [Valaris]
+ * Temporarily changed the walk speed during Charge Attack and Extremity
+ Fist to simulate a faster 'zoom' to the target (somewhat untested yet)
+ [Skotlex]
+ * Corrected SL_HIGH so that the total of each stat is always 50...
+ [Skotlex]
+ * Optimized graffiti display packets (what was I thinking?) [Valaris]
+ * Corrected a statement in guild.c (== to =) in nulling out the guild cache. [Valaris]
+ * Implemented a mini cache for guilds/parties in the map server. Looking up
+ the same guild/party twice or more should result in instant seek times
+ until a different one is looked up. [Skotlex]
+ * Fixed saving account variables [Komurka]
+ * Fixed SL_KAIZEL not starting the proper effect. [Skotlex]
+ * Merged Reddozen's work of SL_KAUPE [Skotlex]
+ * Updated checkweight() script command to return false when the player has
+ inventory full. [Skotlex]
+ * Soullink check for SG_FUSION [Komurka]
+2005/12/13
+ * Fixed @slaveclone not attacking enemies. [Skotlex]
+ * Some more cleaning to the clone skills, proper support for Heal,
+ Resurrection, Double Attack, Triple Blows. [Skotlex]
+ * Updates/fixes/corrections to battle check target so that mobs with
+ special AI can fight mobs without it even if the mob doesn't has a human
+ master. Also updated it so that mobs with no special AI are all friends by
+ default. [Skotlex]
+ * Clone skill fixes, support/self skills are now triggering (never
+ triggered before), adjusted some of the skill usage rates. [Skotlex]
+ * Dyes will now work correctly on cloned or mob_avail class monsters.
+ save_clothcolor must be enable in battle_athena.conf. [Valaris]
+ * Added carts, falcons and pecos to clone and mob_avail class monster spawns. [Valaris]
+ * Likely fixed the @spawn names issue. [Skotlex]
+ * Fixed @*clone commands not resolving properly the target char. [Skotlex]
+ * Implemented the SL_ROGUE bonus to potions. They heal +100% more rather
+ than 50% (potions from ranking Alchemists, that is) [Skotlex]
+ * Merged in Reddozen's work with SL_KAIZEL [Skotlex]
+ * Added the check to prevent KA skills from being usable until you are Soul
+ Linked. [Skotlex]
+ * Enabled clif_parse_Taekwon (Why was taekwon parsed as clif_parse_Alchemist?) [Vicious]
+ * Moved the base attack code into it's own function to properly implement
+ the magnum break's elemental damage bonus (watch out for bugs as the code
+ was proof-read, but that usually doesn't says quite enough when it comes to
+ code). [Skotlex]
+ * Merged in Reddozen's work for SL_WIZARD [Skotlex]
+ * Updated clone command to allow attaching the clone to the invoking player
+ as a slave. @clone creates a friendly clone that attacks mobs. @slaveclone
+ makes a clone that follows the creator (it's a slave), @evilclone is the
+ stock clone as a mob). Also fixed min/max damage of clones. [Skotlex]
+ * Added one extra tile of range to melee mobs in mob_attack, should fix
+ mobs not attacking when they are range+1 tile from you, yet they refuse to
+ move in that final tile. [Skotlex]
+ * Corrected mob ai not moving closer to player if there's a distance of 2
+ or less between them (which would do no good if the mob's range is just 1) [Skotlex]
+ * Fixed SG_FRIEND - should work now [Komurka]
+ * Realtered global_reg value size to 256. [Lance]
+ * Adjusted pointers location for packets for new global_reg value (it's wrong + I adjusted the size) to 256 + 32 = 288 [Lance]
+ * Improved variable scope for scripts to accept all string variables. [Lance]
+ * Altered map, char and login server to correctly use global_reg [Lance]
+ * do_sendrecv merges from Freya [Lance]
+ = Requires recheck on packets again to see if I missed any pointer alterations =
+ * Improved @evilclone to accept character IDs [Lance]
+ * Corrected partywarp/guildwarp to correctly take into account nowarp/nowarpto mapflags. [Skotlex]
+ * Added a few custom scripts due to high demand. [Lance]
+ * Added monster museum. Adapted from Prometheus. [Lance]
+ * Corrected OnTouch to use exname instead of name to prevent conflicts. [Lance]
+2005/12/12
+ * added manner_system battle conf variable (now you can have PK server without manner system - which is unfinished ;/) [Komurka]
+ - some corrections in SI_ data (night uses soullink effect)
+ - changed global_reg value from int to char
+ added two new functions (pc_readglobalreg_str and pc_setglobalreg_str)
+ SG_FEEL now saves maps to global_reg
+ I've 'marked' all changes that SHOULD be checked with '//komurka'
+ - SG_FUSION hp penalty changed from 2% to 0.5%
+ - SG_SUN_COMFORT now increase VIT DEF
+ - implemented SG_FRIEND skill - this is the last SG skill - now it's a good time for bug reports :]
+ * Updated the max number of ingredients of produce_db to 12. [Skotelx]
+ * Updated clone code to also copy the skills from the source player. [Skotlex]
+ * Added Reddozen's implementation of SL_SKE and SL_MONK (sp recovery, Combo
+ Finisher splash damage, SP regen while in Fury) [Skotlex]
+ * Some reorganization of the Star Gladiator map-based skills. [Skotlex]
+ * Fixed @spawn/@monster atcommands 'freezing' server when used. [Skotlex]
+ * Fixed ground-based skills having their range-check messed up... [Skotlex]
+ * Corrected melee-ranged mobs failing the range check even if they were
+ standing next to you. [Skotlex]
+ * Added all duel-commands messages into msg_athena.conf. Commented out
+ code of drawing PVP-circle in duel because it not hiding when player use hide. [LuzZza]
+ * Removed @monster2, merged the code of atcommand_spawn/atcommand_monster
+ as suggested by Flaviojs. [Skotlex]
+ * Removed some unused entries in msg_athena.txt [Skotlex]
+ * When there are unused stack sections (invoked functions and ignored
+ return values) the unused stack section is free'd. This is still notified
+ when the etc_log is active. [Skotlex]
+ * Removed the TURBO code from socket.c as requested by MouseJstr. [Skotlex]
+ - It was actually slower than the normal code.
+ * Updated warp portal and script commands partywarp/guildwarp to take into
+ consideration mapflag nowarp as restriction rather than noteleport.
+ [Skotlex]
+ * Applied dontBR's update to his configure script [Kayla]
+ * Changed the bonus on Sonic blow.(It was giving 1500% instead of 1600%) [Vicious]
+ * Updated gettimetick() to use flag 2 and return System's tick, thanks to
+ Kyoki [Skotlex]
+ * Removed the mismatch stack error message caused by scripts where the
+ returning value of a function was ignored. [Skotlex]
+ * Corrected the Spirit of Assassin damage bonus of Sonic Blows. [Skotlex]
+ * Corrected BSS check versus undead, checking for partners on the Priest's
+ exact left and right, and sending partner's SP to negative. [Skotlex]
+ * Another Paladin's Gospel effect ends when you cast it (should fix Gospel
+ in Gospel bugs). Also, now Gospel only blocks usage of items of type 0
+ (healing). [Skotlex]
+ * Corrected berserk Pitcher displaying 0 heal. [Skotlex]
+ * Added Close Confine's flee bonus. [Skotlex]
+ * Corrected Slow Poison. Can be used when not poisoned, will not "pause"
+ poison's timer. [Skotlex]
+ * Implemented SG_FUSION skill [Komurka]
+ Don't ask me why in newer exe U see flying ... Santa ... -.-
+ * Updated the distance() function definition with one which uses a much
+ better approximation [Skotlex]
+ * Updated sql-files/ mob_db.sql & item_db.sql to latest. [Skotlex]
+ * Added @autotrade/@at and @away/@aw messages into msg_athena.conf (you can customize them) [Lupus]
+ * Updated default hardcoded GMlevel values of some @ATCommands according atcommand_athena.conf [Lupus]
+ and removed doubles of some commands, thanks to Rideword
+2005/12/11
+ * Corrected guild deletion in SQL (both from /breakguild and guild master character deletion). [Valaris]
+ * Added @evilclone commands. Syntax is @evilclone <playername>, [Valaris]
+ It will spawn an aggresive clone of the given player.
+ By default it will use mob id ranges 9001-10000, this range is #defined in mob.h.
+ * Fixed VS compile error in mob_clone_spawn. [Valaris]
+2005/12/10
+ * Added core player cloning code. Just need to create some commands. [Valaris]
+ * Redid the @help2 (char commands). [Kayla]
+ * Added jobname retrieving script function getJobName. [Lance]
+2005/12/09
+ * Changed default GM level for @setbattleflag to 99. [Valaris]
+ * Implemented the SL_SUPERNOVICE bonus to wear all heagears/various weapons
+ at high base levels. [Skotlex]
+ * Implemented SL_ROGUE bonuses: can't be dispelled, Chase Walk's str bonus
+ lasts 10x longer. [Skotlex]
+ * OneHand Quicken now dispels aspd potion effects. [Skotlex]
+ * Updated SL_STIN/SL_STUN to do miserable damage if the target's size is
+ 'incorrect'. [Skotlex]
+ * Updated @disguise so the max npc id you can use is 1000 (1001 is already
+ the first mob, Scorpion) [Skotlex]
+ * Fixed a possible infinite loop in pc_calc_skilltree when receiving
+ additional skills when Soul Linked. [Skotlex]
+ * Added the Taekwon bonus that gives you triple Max HP/SP when you are a
+ top 10 ranker and have base level 90+ [Skotlex]
+ * Added support for skill_db pl == -2. These skills don't take the element
+ of the weapon, but will take the element of any enchantment elemental
+ change (so the element used is neutral unless you are enchanted with
+ Fire/Wind/etc) [Skotlex]
+ * Coded in SL_STIN, SL_STUN and SL_SMA. [Skotlex]
+ * Should have fixed the crash with raw_time in char/char.c [Skotlex]
+ * Pressure can now be cast-break. [Skotlex]
+ * Likely fixed the client crash when hating a class rather than mob. [Skotlex]
+ * Removed @help2, note to self: do not commit at 4 am. Will redo later. [Kayla]
+ * Added @help2. @help did not fit in the screen. @help2 currently contains
+ just the char (#) commands. [Kayla]
+ * MAPREGSQL disabled (experimental) in VC7. To enable, define MAPREGSQL in preprocessor. [Lance]
+
+2005/12/08
+ * Changed default value of start_zeny to 0 to prevent packet exploits.
+ Also is 0z on offical servers. [Kayla]
+ * Fixed bug with objects (npcs, monsters, players, etc) not appearing when using @refresh. [Valaris]
+ * Updated effects for food production thx to Poki#3 [Komurka]
+ * SG_STAR_BLESS now gives 20%*skill lvl additional exp [Komurka]
+ * Modified clif_blown to use the clif_slide packet instead of clif_fixpos,
+ as Komurka tested it and it appears to be handled better by current
+ clients. [Skotlex]
+ * Added two new battle_athena.conf options:
+ duel_allow_teleport (def: no) and duel_autoleave_when_die (def: yes) [LuzZza]
+ * Small fix in allskill [Komurka]
+ * Updated Gloria Domini to bypass battle_calc_damage (misc damage
+ reductions) [Skotlex]
+ * Fixed a typo in pid.c, thanks to akusarujin [celest]
+ * Exploit fix in SG_FEEL [Komurka]
+ * Updated TK_MISSION to pick a random mob in the same way a dead branch
+ does. [Skotlex]
+ * Corrected SG_DEVIL giving the ASPD bonus below level 50. Only works at
+ max level... [Skotlex]
+ * Some cleaning to pc_calc_skilltree. Also updated it so that if you don't
+ use player_skillfree, you can't have ANY skill if you don't have NV_BASIC at
+ 9 (only exception are quest skills). [Skotlex]
+ * Implemented HT_POWER/Beast Strafing. [Skotlex]
+ - The damage equation is unknown.. for now it's the same as Double Strafe
+ except the skill modifier is +10%*str
+ - Currently the Combo is triggered 100% of Double Strafes done on beast
+ monsters.
+ * Added Reddozen's work for Hunter's Beast bane spirit bonus. [Skotlex]
+ * Corrected the drop delay for mobs when killed by magic to be 500ms (will
+ only work if killed by a player) [Skotlex]
+ * Updated SG skills (kRO Patch - 11/29/05) [Komurka]
+ * Enabled a few maps needed for the new novice training grounds, sorry I forgot to [MasterOfMuppets]
+ * Removed duplicate maps in maps_athena.conf. Thanks for the report Dr. Evil [Kayla]
+2005/12/07
+ * Pressure will always pull-off now after it has began casting. [Skotlex]
+ * Implemented Close Confine. [Skotlex]
+ * Change all 0x20e packets (18->26; 22->30) [Komurka]
+ Also added job_name(mob_id) in clif_hate_mob
+ (but it crashes client when U try to use SG_HATE skill on player ><)
+ * Fixed compile error in status.c. Check your work skot <3 [Kayla & MoM]
+ * Updated socket.c by adding a lots error reporting for functions that
+ previously were assumed to not fail. May help figure out what's going on
+ with the win32 builds... [Skotlex]
+ * Reviewed and cleaned up a bit the latest SG additions from Komurka. [Skotlex]
+ - My skill desc says that SG_DEVIL does not makes you blind until you reach
+ max job level, so I implemented that. Report if this is incorrect.
+ - SG_*_WARM skills should be working from what I read there.
+ * Modified a bit the TK_MISSION packet, GUESSING where the progress of the
+ current mission should go within said packet... [Skotlex]
+ * Implemented TK_MISSION. [Skotlex]
+ * Added more SG skills (Comfort, Warmth, Demon, Knowledge) [Komurka]
+ All of them should be checked by someone ^^;;
+ - SG_xx_WARM for now only shows cool red effect :> There is more code but for now it doesn't work
+ * Added new Geffen Field maps [Harbin]
+ * Disabled Atcommand Nuke (It was commented, not disabled) [Harbin]
+ * Added skip_teleport_lv1_menu option to Battle_Athena. Allows players to cast Teleport level 1 without menu. [Harbin]
+ * Merged in Reddozen's current Soul Linker work. [Skotlex]
+ - Berserk Pitcher should be working now.
+ - Bard/Dancer walk bonus when dancing/singing while soul-linked.
+ - Partial work on Twilight Pharmacy.
+ - proper skill effect
+ * Fixed One Hand quicken doing nothing. [Skotlex]
+ * skill_get_name now returns "UNKNOWN_SKILL" instead of null (should fix
+ some crashes when using it on skills with no defined name) [Skotlex]
+ * When weapon_delay_attack is enabled, items should drop inmediately after
+ mobs are killed rather than 500ms afterwards. [Skotlex]
+ * Added Exception Handling plugin to be used for native Win32 builds [celest]
+ - crashes will be logged in <server type>.stackdump along with file name and line numbers
+ - To activate, enable 'exchndl' in plugin_athena.conf
+
+ Public Service Message - Crash reports can be VERY VERY helpful, so please enable the
+ plugins if you can ('exchndl' for Win32, 'sig' for cygwin and linux) and send in any
+ reports you might get! We all want eA to be stable, ne? ^^
+
+ * Some compile error fixes for MinGW, FreeBSD and plugins [celest]
+ * Updated Makefile to set platform defines for FreeBSD [celest]
+ * Updated Makefile to auto-detect MinGW and include src/mysql [celest]
+ * Debug logging flag for logging output messages (only works well with native Win32) :D (Not enabled by default) [Lance]
+ * joshuali's new vcproj with debug mode correctly set up. [Lance]
+ * Fixed compile errors for Valaris's commit on date.h [Lance]
+ * Added updated vcproj for native VC8 win32 for date.h/c support. [Lance]
+ * Removed extra returns in date.h. [Lance]
+ * Probably fixed warnings in unzip.c [Lance]
+2005/12/06
+ * Updated item 12132 for the Xmas suit effect in item_db.sql. [Valaris]
+ * Implemented Xmas Suit: [Valaris]
+ -Added status change state SC_XMAS, and added it to const.txt.
+ -Cannot attack or use skills while in the Xmas state.
+ -Will save if you logout.
+ -"sc_start SC_XMAS,600000,0" added to item 12132 (using item will give you xmas suit for 10 minutes).
+ -Added xmas_ignorepalette option to battle_athena.conf.
+ * Fixed script error in Garm's Claw item causing an error. [Valaris]
+ * Added a missing ; to Skotlex's Previous SG skill editions that caused compile errors. [Valaris]
+ * Added JOB_GUNSLINGER(24), JOB_NINJA(25), and JOB_XMAS(26) to map.h enum list and const.txt. [Valaris]
+ * Added SC_SCRESIST to const.txt. [Valaris]
+ * Applied Komurka's Star Gladiator patch. [Skotlex]
+ - The following skills are now working: SG_FEEL, SG_HATE, SG_SUN_ANGER,
+ SG_MOON_ANGER, SG_STAR_ANGER, SG_SUN_BLESS, SG_MOON_BLESS, SG_STAR_BLESS
+ - The designated maps cannot be stored currently (cannot save character
+ string variables) and is pending on a script update to enable saving of
+ said type of variables.
+ * Added @away command. [LuzZza]
+ * Mostly fixed intravision making everyone see hidden/cloacked characters.
+ (the actual option value to see just the player's shadow is currently
+ unknown) [Skotlex]
+ * Updated Gospel [Skotlex]
+ - It should clear all buffs/debuffs now.
+ - Party-mates within range cannot use items.
+ * Implemented the SL_BARDDANCER bonus that enables the caster to be buffed
+ by their own song/dance/encore. [Skotlex]
+ * Completed Sight Thrasher (the option value is still missing, though.
+ Temporarily uses the one of Sight) [Skotlex]
+ * Corrected possible exp exploits in jA's exp calc method. [Skotlex]
+ * Corrected Spirit Skills showing up in all class trees. [Skotlex]
+ * Invoking @reloadscript now also invokes the OnInit event after loading. [Skotlex]
+ * Expanded Item Groups list from 20 to 32 item groups [Lupus]
+ * Fixed healing experience bug. Now only healing another players gives experience. [Harbin]
+2005/12/05
+ * Hopefully fixed gm_all_skill.... [Skotlex]
+ * Modified a bit the player attack code to give an extra range cell when
+ the target is moving. [Skotlex]
+ * Added skip_teleport_lv1_menu battle_athena option. It give a possibility to
+ disable (skip) Teleport Lv1 menu, that have only two lines `Random` and `Cancel`.
+ Of course, by default this option have `no` (don't skip) value. [LuzZza]
+ * Added FD_SETSIZE 4096 predefination to VC++ Project Files. Should fix 60 player limit bug with native compilations. [Harbin]
+ * Fixed char crash (I hope) when checking for two parents + baby in a party
+ with more than 3 characters, but from which only 3 were online at a time. [Skotlex]
+ * Merged in Reddozen's work on SL_BARDDANCER and cleaned up a bit the
+ Spirit Skills code when calculating the skill tree. [Skotlex]
+ * Updated mob ai so that support/aggressive mobs can't 'see' a player until
+ there's a direct line of sight between them. [Skotlex]
+ * Updated monster_ai&1 so that when not set mob-chase type is Aegis-like
+ (mobs will not change walk target tiles mid-walk) [Skotlex]
+ * Added battle_athena.conf option mobs_level_up_exp_rate to set the extra
+ exp rate a leveled up monsters gives. [Valaris]
+ * Added a custom X-Mas quest *Sign Your Items* [Lupus]
+ * Applied Harbin's patch to fix Arrow Shower + Traps. Someone test it out.
+ [Skotlex]
+ * Another fix to socket.c to enable TURBO mode to work on win32. [Skotlex]
+ * Fixed the combo status not ending after using TK_TURNKICK [Skotlex]
+ * Overflowed pointer fix in socket.c [Skotlex]
+ * Added 'Einbech' into @go command (u have to type at least 5 letters) [Lupus]
+ * More detailed error messages for missing '"'s in scripts. [Lance]
+2005/12/04
+ * Removed mail server switch from battle_athena.conf and added
+ full mail server configuration to inter_athena.conf. [Valaris]
+ * Fixed too big VVS damage of TOP10 BS weapons [Lupus]
+2005/12/03
+ * Fixed up TK Sprint (TK_RUN) skill: [Valaris]
+ -Disabled movement during skill use.
+ -Correct moves player server-side.
+ -Stops without sp use if skill is used during running.
+ -Server will not save status if player logs out.
+ * Some cleaning of socket.c to see if TURBO will now work on Windows, it
+ may also fix the select() problems on that platform as well. [Skotlex]
+ * Fixex "gm_skill_all" crashing the server from generating huge packets (or
+ so I hope) [Skotlex]
+2005/12/02
+ * Gave the Spirit Status Change a custom effect for now. [Skotlex]
+ * Merged in Reddozen's work for SL_HIGH (Spirit of Rebirth) [Skotlex]
+ * The Bonus skills acquired from being Soul Linked should now show up in
+ the skill tree. [Skotlex]
+ * Merged Reddozen's work of One-Hand Quicken and Adrenaline Rush 2. [Skotlex]
+ * Fixed Axe-Kick never triggering. [Skotlex]
+ * Slaves walk once again. [Skotlex]
+ * enable_items now also enables equipment stuff. [Skotlex]
+ * The attack motion in packets for ground-based skills is now 0 (it may
+ help somewhat with current firewall issues). [Skotlex]
+ * Added char-server option "save_log", when disabled, the char server will
+ stop printing info messages whenever something is loaded/saved. [Skotlex]
+ * Disabled random-walking for slaves [Skotlex]
+ * Added script commands enable_items/disable_items [Skotlex]
+ * Likely fixed the mob-skill target type "master" [Skotlex]
+ * Added target type "master" to the mobskill_db [Skotlex]
+ * Modified NPC_RUN to allow the caster to run away from the target [Skotlex]
+ * Implemented SL_SAGE (Soul Linker Sage buff for auto-cast bolts) [Skotlex]
+ * Updated char-sql guild saving so that instead of saving ALL guilds when
+ the time comes, the save interval is splitted on time-slots (based on guild
+ count in memory) and a guild is saved per time-slot (just like the map
+ server saves characters). [Skotlex]
+ * Fixed client crashes with using baby and advanced player classes as pets. [Valaris]
+ * Added missing ban_hack_trade option to battle_athena.conf. [Valaris]
+ * Hopefully fixed Counter Kick. [Skotlex]
+ * Uncommented and corrected the Soul Linker Monk buff (SP cost reduction
+ for monk combos) [Skotlex]
+ * Added a check in skills so that skills that are used on yourself, but had
+ it's target auto-selected cannot be used on non-enemies if it's nk is
+ different from 1 (1 = No damage skill) [Skotlex]
+ * Various cleanups to the char-sql server to prevent corner-case crashes
+ from queries that return no rows. [Skotlex]
+ * Massive Taekwon Boy skills related code cleanup. [Skotlex]
+ - Flying Side kick and Turn Kick should be fully working now, too.
+ * Cleaned up and reorganized the SC_ data listing. Added sc's for food
+ related bonuses: SC_HITFood, SC_FLEEFood, SC_BAtkFood, SC_WAtkFood,
+ SC_MAtkFood. [Skotlex]
+ - Some of the saved sc data will be wrong, so wipe the table/file if you
+ want to play it safe.
+ * Some corrects in duel code. [LuzZza]
+ * Sonic Blow and Shield Boomerang's after cast delay is now properly
+ adjusted by the Soul Link skills. [Skotlex]
+ * Party even share will be now broken after a base level reset. [Skotlex]
+ * Merged in Reddozen's Soul Linker current skills work. [Skotlex]
+ * Added countitem2(itemID,....) script function. [Lupus]
+ * Added axtoi script function that converts hex strings to integers. [Lance]
+ * Fixed incorrect time (that leads to crashes) in login server. [Lance]
+2005/12/01
+ * Moved KN_CHARGEATK code to merge it with Extremity Fist. Skill damage
+ modifier is currently set to +15% per cell (need actual value here) [Skotlex]
+ * Fixed client crash when logging in with Baby Knights and Crusaders riding Pecos. [Valaris]
+ * Implemented Ki Explosion. [Skotlex]
+ * Fixed client crashes with using baby and advanced player classes as monsters. [Valaris]
+ Make sure to use Item ID for weapons and shields in mob_avail.txt for player monsters and not View ID.
+ Updated Valaris and MC Cameri mobs in item_avail.txt to use Item IDs.
+ * Fixed cutting Castle Name (was 14 instead of 24) [Lupus]
+ * Corrected Grimtooth counting a short-range skill when it's actually
+ ranged. [Skotlex]
+ * Corrected Venom Splasher's splash range, and the splash damage is now
+ divided by number of targets (sort of, skill % dmg is adjusted according
+ number of targets) [Skotlex]
+ * Tarot Card of Fate won't break equipment now if equip_skill_break_rate is
+ 0. [Skotlex]
+ * Improvements and optimizations to the online db management in the char
+ txt/sql servers. [Skotlex]
+ * Updated the guild cache (char sql) to have it load/unload characters
+ whenever they are updated in the char online_db (previously they were only
+ updated on normal char-select/char-quit when there were more cases where a
+ char is set online/offline) [Skotlex]
+ * Now when the guild is not found in the cache it will be loaded from the
+ sql db first before failing. [Skotlex]
+ * Fixed equip_skill_break_rate equation being messed up for Acid Demonstration. [Skotlex]
+ * Fixed Aura Blade adding damage to Spiral Pierce (it shouldn't) [Skotlex]
+ * Script function getnameditem now sets flag 254 (created) instead of 255 (forged) [Lupus]
+ To prevent ADDITIONAL Blacksmith FAME TOP10 bonuses, applied to signed but not forged weapons
+ e.g. You have a custom quest for rare weapons. You tag items with players name (using getnameditem command).
+ if a TOP10 BS get an Infiltrator.. then it used to give extra atk bonus 8)
+2005/11/30
+ * Updated item_db.sql to latest. [Skotlex]
+ * Updated mob_db.sql to latest. [Skotlex]
+ * Updated Gospel to force the removal of the ground-effect when the status
+ change ends. [Skotlex]
+ * Made Snatch/Intimidate work on Guild maps (I have read around this is how
+ it is) [Skotlex]
+ * Added the auction maps to maps_athena.conf [MasterOfMuppets]
+ * When players are hit while moving, they should now move one last cell
+ in the same direction they were walking when interrupted. [Skotlex]
+ * Walk delay won't be applied now unless the attack deals damage... [Skotlex]
+ * Major reorganization of player variables and bonuses. If something broke,
+ report it up. Otherwise, struct map_session_data should look quite a bit
+ more clean now. [Skotlex]
+ * Fixed duel bug when you can't cast some skills on yourself. [LuzZza]
+ * Fixed (I think) pets losing the "rename flag" when you sent them back to
+ egg. [Skotlex]
+ * Added a index check in the equip packet, should fix crashes from invalid
+ packets. [Skotlex]
+ * Fixed a horrible bug that was making the walk delay not work for sure x.x
+ [Skotlex]
+2005/11/29
+ * Fixed race exp bonuses. [Skotlex]
+ * Fixed ## account variable saving disconnecting the char-login servers. [Skotlex]
+ * Updated the way multi-hit skills add overrefine/star crumb/spirit sphere
+ damage so that the total bonus is multiplied by the total number of this.
+ [Skotlex]
+ * Fixed the config variables being "lost" on startup. [Skotlex]
+ * Fixed Restore requiring Regeneration lv2 [Skotlex]
+ * Fixed the spirit sphere bonus not applying to Throw Spirit Sphere. [Skotlex]
+ * Rewrote and cleaned up duel code. Formed independent duel_xxx functions.
+ I suggest to place this functions in duel.c/duel.h. New features: [LuzZza]
+ - Now when you in duel, you can't attack anything out of your duel
+ (mobs, other players etc...);
+ - Now you can't take part in duel more often than it set in battle_athena.
+ Default delay is 60 minutes.
+ - New battle_athena.conf options: duel_allow_pvp - allow/disallow duel
+ on pvp-maps; duel_allow_gvg - allow/disallow duel on gvg-maps;
+ duel_time_interval - delay between using duel in minutes.
+ * Updated damage formula for Spiral Pierce. [Skotlex]
+ * Fixed speed change being lost when speed is increased/decreased while
+ walking with Free-cast. [Skotlex]
+ * Fixed pets being renameable after turning them back into eggs. [Skotlex]
+ * Reverted the guild data position in the mob/npc packets, should restore
+ the emblems in flags. [Skotlex]
+ * Corrected battle_check_target Guild checks returning true for non-guild,
+ party'ed characters and viceversa. [Skotlex]
+2005/11/28
+ * Added dontBR's experimental configure script. It's still in alpha stage,
+ so use with caution! [Skotlex]
+ * Fixed a pair of exp exploits possible with to Rich Man Kim and
+ race-add-exp card bonuses. [Skotlex]
+ * Updated behaviour of skillrange_from_weapon. If set, those skills with
+ negative range use the weapon's range. If not set, then the skill range
+ used is the absolute value of the range specified in the skill_db. [Skotlex]
+ * Small cleanup of the color broadcast packet using data provided by Master
+ of Muppets. It should hopefully fix the font-size on said colored messages.
+ [Skotlex]
+ * Fixed the setting of the guild id and guild emblem in packets 0x7b and
+ 0x78 for mobs/npcs (this is assuming the position is correct when filling
+ these same packets for players) [Skotlex]
+ * Added battle_config option skillrange_from_weapon which, when set, allows
+ weapon based, target-selected, offensive skills to take the equipped
+ weapon's range instead of the range defined in the skill_db. [Skotlex]
+ * WARNING/ACHTUNG! Update all your NPCs ASAP. Massive NPC fix's out. [Lupus]
+ * Updated monster_ai&8 so that mobs scatter as soon as they lose their
+ target. Use this setting for an effective counter measure to Grimtooth
+ mass-mob training. [Skotlex]
+ * Added pc_damage_walk_delay_rate to separate the walk delay adjustment of
+ players from that of mobs. The adjustment for players is 20% while for mobs
+ is 100%, pending further adjustments. [Skotlex]
+ * Added the weapon upgrade damage bonus of Spiral Pierce [Skotlex]
+ * Removed the mob_stop_walking code from mob_damage as it should be invoked
+ on battle_walkdelay (the mob walk delay issue will likely need it's own
+ config option) [Skotlex]
+ * Added joshuali's new Visual Studio files. [Lance]
+ * Novice Warp Portal fixes from jAthena. [Lance]
+ * Final warning elimination in plugins.c (most of them are gone with warning level set to 1). [Lance]
+ * Fixed typo in msg_athena.conf and 'users with autoloot turned on will not have their rare drops announced.'. Thanks to Kaseki.
+ * Mob should stop walking when hit if not enduring. Thanks to Playtester. [Lance]
+ * Included pcre.dll and libmysql.dll from joshuali. [Lance]
+ * Eliminated Level 3 warnings. Setting compile warnings to Level 3. (Level 4 just kills eAthena XD) [Lance]
+2005/11/27
+ * Fixed an overflow pointer bug in the gvg eliminate timer. [Skotlex]
+ * Updated the damage code if Spiral Pierce, Shield Chain and Shield
+ boomerang to be closer to official. [Skotlex]
+ * Fixed a crash when setting all chars offline in the char-sql server. Also
+ fixed that delete_timer mismatch on shutdown [Skotlex]
+ * Autospells now won't trigger if the range between the source and the
+ target is not satisfied. [Skotlex]
+2005/11/26
+ * Added bonus2 bAddSkillBlown for adding a custom knockback value to a
+ skill. Note that this knockback bonus is ADDED to whatever the default
+ knockback of the skill is. [Skotlex]
+ * Fixed Soul Linker skills showing up on the tree for leveling up. [Skotlex]
+ * Probably fixed the crash in inter_guild_CharOffline [Skotlex]
+ * Modified the skill get range routine to correctly account for the attack
+ range and the AC_VULTURE range bonus where needed. [Skotlex]
+ * Fixed alchemists Fame Points bug: It were giving 1 fame point [Lupus]
+ on making 4 Condensed Potions in row, instead of 3, etc. Now tested ^_-
+ * Some restructuring and cleaning up in map loading to make it easier for
+ future plans (like removing Grfio) [celest]
+ - split map loading into separate sources properly
+ - added map server will display a list of enabled map sources on startup
+ - added maps will be auto-imported into the map cache if it's loaded with
+ AFM, AF2, or any other source
+ The server looks for maps in this descending order: the map cache, AFM maps,
+ AF2 maps, and finally GAT files from the GRF (slowest); so, if you enable map
+ caching it should be a liiiittle bit faster then before ^^
+2005/11/25
+ * Uploaded fixes to int_guild, tested and working safely. [Kevin]
+ * Added @showzeny @ command. [Skotlex]
+ * Some code cleanup to make AutoBerserk work the way it was intended to
+ (skill toggles "auto-berserk" state on/off, if on, you automatically get
+ Provoked when under 25%HP) [Skotlex]
+ * Fixed Auto-Berserk auto-ending after a minute. [Skotlex]
+ * Added a fix to mob skills to prevent them from being checked too
+ frequently during battle (which was sort of bumping up their rate to double
+ or more from what the skill db would state) [Skotlex]
+ * Added cleaning up the fifo before sending the guild information (since
+ the packet is big, the fifo should be cleared to avoid overflow problems)
+ [Skotlex]
+ * Added monster_ai&8, when set monsters stop walking as soon as they lose
+ their current target [Skotlex]
+ * Reflect Sword again reflects damage versus players. [Skotlex]
+ * Corrections to the skill code so only Heaven's Drive may damage traps. [Skotlex]
+ * Reverted the mob random walk delay after unlocking a target to 3~6 secs. [Skotlex]
+ * Added pow, sqrt and distance to scripting commands. [Lance]
+ * Removed players with 0 Fame Points from Blacksmith/Alchem/Taekwon TOP10 lists [Lupus]
+ * Should fix night glowing bug. [Lance]
+ * Added setd and getd variable retrieving and setting with dynamic names. [Lance]
+ * Added petstat command as requested by Dubby. [Lance]
+2005/11/24
+ * Fixed a small bug in the guild search by name routine. Should fix the
+ crash on new guild creation. [Skotlex]
+ * Added debug information in case the guild isn't found in the cache when
+ it should be there. This should help fix any problems the guild cache
+ might have (eg: for some function that may take effect on a guild which
+ has no members online) [Skotlex]
+ * Finished cleaning up and merging the guild cache withthe guild timers
+ behaviour. It should be mostly safe to update now. [Skotlex]
+ * Reverted the sql save behaviour. [Skotlex]
+ - Now guilds timers and cache are both into effect, this requires a bit
+ more of cleaning to be considered done.
+ * Various things I made but already forgot xD [DracoRPG]
+ * Fixed and updated damage bonus for forged weapons: VVVS is +40 (was previously +50
+ for the right hand...) and "famous maker bonus" gives a no-miss +10 dmg, same as
+ 2 additional Star Crumbs. [DracoRPG]
+ * Added or updated several Taekwon skills [DracoRPG]
+ - Jump Kick uses clif_slide to the target's exact pos , waiting for capture/video
+ - Taekwon ranking is now supported by the fame system, but there's no way to gain
+ points atm (Taekwon Mission has no effect), infinite kick combo should be OK
+ - 4 basic kicks updated, you now stop attacking when a stance triggers, and have 2
+ seconds to hit the button before attacking again
+ - Run uses SC_SPORT to increase your STR and affect the way Break Fall works
+ - Break Fall dodges ranged magic/weapon attacks, as well as melee weapon ones
+ when SC_SPORT is active
+ * Made Sword Reject / Counter Instinct reflect damage only against monsters (not
+ 100% sure about it, but let's say 90%... iRO site says it, although it isn't
+ the best source ever) [DracoRPG]
+ * Made Spiral Pierce use SC_STOP instead of setting canwalk_tick, some other such things
+ need to be reviewed [DracoRPG]
+ * Fixed Pneuma. [Skotlex]
+ * Fixed dead mobs reappearing on the map. [Skotlex]
+ * Cleaned up the duel code in battle_check_target. [Skotlex]
+ * Added config option summons_inherit_effects, defaults to yes, check
+ battle_athena.conf for further details. [Skotlex]
+ * Updated duel [LuzZza]
+ - Now "@duel <Num>" may be used for indication max players limit of duel.
+ - Now "@duel <Nick>" creating duel for two players and automatically send invitation to Nick.
+ * Added a new script function: getequipcardid(equipSlot,CardSlot) [Lupus]
+ Returns Card ID or just a value from your EQUIPPED item
+ Useful to check equipped items PROPERTY, STRONG value, Author ID, etc
+ Check npc\sample\getequipcardid.txt and read script.c comment ^_-
+2005/11/23
+ * Fixed the crash on guild creation in new guild cache. [Kevin]
+ * Implemented duel organizing commands: @duel, @invite, @accept, @reject, @leave. [LuzZza]
+ * Made the walk-delay a timer, so that it triggers after the actual attack
+ motion of the src. [Skotlex]
+ * Added back the combo damage delay config, now renamed to
+ multihit_delay, and set to the default of 230ms it had before. [Skotlex]
+ * Added displaying file which caused an error on incorrect mob lines.
+ [Skotlex]
+ * Small memory corrections to sql castle saving/loading, mostly Lance's
+ work. [Skotlex]
+ * Updated the walk delay routine to not invoke stop-walking when character
+ is not walking (fixes the case in which the packet is sent while sitting,
+ which causes a 'standing' sprite even if the char is sitting). [Skotlex]
+2005/11/22
+ * Implemented a guild cache in char sql, saves all online guilds every 5 minutes. [Kevin]
+ * More grammar fixes [Kayla]
+ * Added 1-tile of range grace in skill_use_id and skill_use_pos since
+ that's how it is on Aegis servers. [Skotlex]
+ * Updated the skill info packets to deliver the skill names as expected by
+ the client. [Skotlex]
+ * Updated mob ai to enable changing targets while attacking ONLY if the
+ attacker is within melee range (Aegis AI). monster_ai&4 can be used to
+ override this and allow mobs to change target and pursue ranged attackers.
+ [Skotlex]
+ * Updated the config comments for the ip-related settings. Thanks to
+ akusarujin for the update. [Skotlex]
+ * Added rates to at_command.conf, set it's default to GM lv1 [Skotlex]
+ * Removed the icon from Fire Break's fire-elemental bonus. [Skotlex]
+ * Updated the walkdelay function to only be invoked if the attack did
+ damage. [Skotlex]
+ * Some more fixes to the english in ShowInfo()'s [Kayla]
+ * Cleaned out the SVN a bit [Kayla]
+2005/11/21
+ * Removed "(now unlimited loop start!)" from char-sql in an info line...wtf xD..[Kayla]
+ * Mob AI update: updated the conditions used to specify if a mob can change
+ targets as per the forum provided information (by Komurka and Kyoki).
+ Mode 512 (MD_CHANGETARGET) no longer does anything. [Skotlex]
+ * Mobs that assist now link nearby mobs when they attack. [Skotlex]
+ * Made the damage delay be applied after knockback rather than before
+ (magical/misc instant effect attacks are still applied before the
+ knockback) [Skotlex]
+ * The damage delay timer now stores the distance between source/target, if
+ this distance is increased by 2 or more, the damage delay fails and takes
+ no effect (if the '2' needs to be made higher, do point it out. It
+ shouldn't be much of a problem since you aren't supposed to be able to walk
+ from the damage delay anyway). [Skotlex]
+ * Changed the way damage delay works. It is no longer applied on
+ mob_damage/pc_damage, but instead is invoked from clif_damage (or
+ clif_skill_damage), which means the "can't walk" delay is sync'ed with the
+ damage packets when they are sent. This should fix most delay-damage
+ 'stun-lock' related issues. [Skotlex]
+2005/11/20
+ * Mobs now can't move while casting. [Skotlex]
+ * Updated mob_db.txt and mob_db.sql with the most recent data from Kyoki.
+ [Skotlex]
+ * Corrected the mob_db by adding the canmove/canattack bits to pretty much
+ all mobs that needed them. [Skotlex]
+ * Some fixes to the confusion code. [Skotlex]
+ * Crash-fix in status_change_start [Skotlex]
+ * Implemented confusion as it should be (not tested yet!) [Skotlex]
+ * Updated run_script to backup the current script of a player and
+ restore it if the current script ends inmediately. This should fix losing
+ the script info if status_calc_pc is invoked while running a script.
+ [Skotlex]
+ * Fixed a memory leak in the guild eliminate timer. [Skotlex]
+ * Removed the extra tile of range mobs have when walking. [Skotlex]
+ * Added mob reloading to battleconfig reload @ command. [Skotlex]
+ * Updated mob_db.sql with the new modes by Kyoki. [Skotlex]
+2005/11/19
+ * Made characters stop walking when inflicted by SC_STOP, may fix
+ GrimTooth's stop effect not seeming to take effect. [Skotlex]
+ * Made the pk_min_level config not take effect in WoE/GvG grounds.
+ [Skotlex]
+ * Fixed showing falcon when player is hide. [LuzZza]
+ * Updated mob_db.sql and item_db.sql to current [Skotlex]
+ * Updated the skill db step guessing code to allow for negative ranges (Now
+ spear boomerang should progressively get longer range with higher levels)
+ [Skotlex]
+ * Fixed Tarot Card, the card that gets two random effects can't retrigger
+ itself, and it causes STOP instead of Stun where appropiate. [Skotlex]
+ * Updated devotion to only work on damage attacks that have a source (will
+ prevent it from "blocking" COMA, which is what caused the crash). [Skotlex]
+ * Fixed not always showing CRIT attacks, thanks to Irmin [Lupus]
+2005/11/18
+ * Updated mob_ai so aggressive mobs change target when chasing, and
+ change-target mobs do so when attacking. [Skotlex]
+ * Fixed weapon forging showing success even when it fails. [Skotlex]
+ * Some cleaning up of @time, may fix the weird time displays. [Skotlex]
+ * Modified mob_ai so hyper-active mobs change target if they are
+ cast-sensors even if attacking (angry mode). They will also change target
+ if attacked while in angry/follow mode regardless of their change-target
+ mode. [Skotlex]
+ * Moved the night-inducing code from "map loaded ack" to "spawn pc", should
+ fix characters going ultra-blue after stuff like fly-wings. [Skotlex]
+ * Delayed the mob emotion when doing skills so that it gets executed AFTER
+ the skill is successfully performed. [Skotlex]
+ * Implemented PR_REDEMPTIO. Is the penalty for both base and job exp?
+ That's how it is currently. And if the map has the nopenalty flag,there's
+ no exp penalty. Awaiting further input on the matter (altough, do note the
+ skill isn't tested either) [Skotlex]
+ * Fixed three memory issues (char txt shutdown, npc reloading, ore
+ discovery logs) which were pointed out by End of Exam. [Skotlex]
+ * Added support for hyper-active mobs (MD_CHANGECHASE = 0x400), these mobs
+ will change to the closest target while chasing/following other players.
+ Needs be added to the mob_db. [Skotlex]
+ * Added support for hyper-aggressive mobs (MD_BERSERK = 0x800), these mobs
+ change their skill state to angry/follow instead of attack/chase when they
+ select/change target (except if they changed target because the new target
+ attacked them). Needs be added to the mob_db, for now all aggressive mobs
+ are considered hyper as well. [Skotlex]
+ * Updated mob mode cast-sensor (MD_CASTSENSOR = 0x010), mobs that are
+ Aggressive can also change target if they are chasing/following a player
+ when someone else casts a skill on them. [Skotlex]
+ * Fixed Dark Blessing. [Skotlex]
+ * Changed the default battle_delay_damage value from no to yes. [Skotlex]
+ * Added check to prevent reinitiating SC_GOSPEL on a character that already
+ has GOSPEL and val4 == BCT_SELF, may fix multiple Gospels being placed on
+ the ground. [Skotlex]
+2005/11/17
+ * Altered behaviour of NPC_EMOTION/NPC_EMOTION_ON as requested by Komurka.
+ [Skotlex]
+ - val[0] (the first one) is the emotion the mob does. If val[1] is
+ different from 0, then the mob's mode is changed to THIS value. If val[2]
+ is different from zero, it'll add/remove a mode based on skill used
+ (EMOTION_ON adds mode, EMOTION removes it), both can stack [Skotlex]
+ * Fixed for sure the Makefile... [Skotlex]
+ * Modified Wedding effects. That is, changing base to 22 does NOT displays
+ wedding outfit anymore. To display the wedding outfits, you have to start
+ SC_WEDDING instead. Tux/Wedding dress scripts likely need being updated.
+ [Skotlex]
+ * Added battle option disp_zeny, will display on console how much zeny you
+ earned (be it from selling, trading, mobs, etc, as long as you "earned"
+ zeny) [Skotlex]
+ * Updated status_calc_pc to prevent infinite recursion loops. [Skotlex]
+ * Applied End of Exam's suggested signedness fixes to npc.c [Skotlex]
+ * Updated sting lib, to avoid SQL troubles [Lupus]
+ * Fixed moonlit not properly checking for nearby walls. [Skotlex]
+ * Added a recursion protection system to status_calc_pc which should avoid
+ exploits derived from recursively calling status_calc_pc which certain
+ equipment scripts could trigger. Thanks to End of Exam for pointing it out.
+ [Skotlex]
+ * Applied Celest's patch which should help compiling eA under mingwin.
+ [Skotlex]
+2005/11/16
+ * Fixed AFM map loading (something was missing there which was gonna make
+ the map server crash for sure later on) [Skotlex]
+ * Some corrections to the mob states, linked/cast-sensitive mobs engage in
+ attach/chase modes, not angry/follow (which seem reserved entirely for
+ aggressive mobs) [Skotlex]
+ * Cleaned up and corrected target types MSS_AROUND->MSS_AROUND8, also added
+ and documented them in mob_skill_db.txt [Skotlex]
+ * Probably corrected whispers to GMs. Thanks to Slennox for pointing it
+ out. [Skotlex]
+ * Modified mob-skill states to use Aegis-based information. Modes are
+ MSS_IDLE, MSS_WALK, MSS_LOOT, MSS_DEAD, MSS_BERSERK, MSS_ANGRY, MSS_RUSH
+ and MSS_FOLLOW. Mob skill db is unaltered other than for the fact it now
+ supports "angry" and "follow" states. [Skotlex]
+ * Cleanup of how knockback routines are invoked. [Skotlex]
+ * Added MOB_LAZYSKILLPERC to mob.c, determines probability of a mob doing a
+ skill when there are no players nearby (but there has to be players in the
+ same map for it to trigger). Currently set to 10/1000 chance. [Skotlex]
+ * battle_check_target update. Rewrote the party/guild checks, this should
+ hopefully fix any problems left with pvp/gvg and mapflags not working
+ properly. [Skotlex]
+ * Fixed playerattached() returning char id instead of account id. [Skotlex]
+ * Added battle option party_even_share_bonus to enable use of Valaris's evn
+ share experience bonus equation rather than the official one. [Skotlex]
+ * Corrected @jump not displaying the actual coords you jumped to. Thanks to
+ kitty74x9 for noticing (and fixing) it out. [Skotlex]
+2005/11/15
+ * Fixed multi-hitting skills not increasing the "can-walk" delay
+ accordingly. [Skotlex]
+ * Modified way to updating hp/position of party members. [LuzZza]
+ * Added battle config option "aura_lv", specifies which level characters
+ have to be for the server to report their level as "max_lv" (which normally
+ is used to enable the aura). See battle_athena.conf for more details. It
+ may not work for your self, but only for other characters (this is,
+ afterall, untested yet) [Skotlex]
+ * Implemented High Jump (works 100%) and Fighting Chant (untested but should work). [DracoRPG]
+ * Various cleanups and typo fixes here and there. [DracoRPG]
+ * Corrected the upkeep SP cost of Moonlight Petals. [Skotlex]
+ * Modified Magnum Break's fire bonus to be 20% ADDITIONAL fire damage of
+ your total damage previous to the elemental modifier. [Skotlex]
+ * Modified Fatal Blow's stun chance to kRO's equation (+5% stun chance per
+ bash skill level over 5) [Skotlex]
+ * Corrected Sharpshooting's damage equation to +50%*skill_lv [Skotlex]
+ * Updated Magnum Break's bonus from 10% to 20% fire elemental. [Skotlex]
+ * Updated Arrow Shower to be a ground based skill (untested yet) [Skotlex]
+ * Pretty much rewrote how Moonlight Petals work, it should be working
+ mostly right now. [Skotlex]
+ * Splitted gat map information into gat and cell info. gat info is
+ permanent map data (walls, ground, etc) while cell is temp map info
+ (basilica, pneuma, etc). Modified Pneuma and Moonlight Petals to work based
+ on map cells. [Skotlex]
+2005/11/14
+ * New Visual Studio projects, compiling works, need zlib.dll for txt server. [Kevin]
+ * Longing for Freedom can't be used during Moonlight Petals now. [Skotlex]
+ * Corrected True Sight's critical bonus (from +0.1 cri per level to +1 cri
+ per level) [Skotlex]
+ * Made coma a status effect. SC_COMA. Sets HP/SP to 1. Bosses/Emperium are
+ inmune to it. [Skotlex]
+ * Fixed null pointer crash in battle_damage. [Skotlex]
+ * Increased max account variables to 32. [Skotlex]
+ * Pressure/Gloria Domini now isn't instant-cancelled by status effects, and
+ bypasses the Devotion/Sacrifice check. [Skotlex]
+ * Added handling of the /pk packet, even thought it just shows an empty
+ listing for now. [Skotlex]
+ * Applied zBuffer's suggested fix to prevent S. Novices from getting mental
+ Strength at 100% exp. [Skotlex]
+ * Fixed Friends List not able to add more than 20 friends (current clients support up to 40) [Lupus]
+ thanks to CAHTEXNIK for pointing it out 8)
+2005/11/12
+ * Probably fixed the name of freshly captured pet eggs. [Skotlex]
+ * Changes Win32 to not require svnversion.h, but instead tries to peek in
+ .svn\entries to check for svn version. If the file doesn't exist it'll
+ display "Unknown" though, which I guess isn't a good thing ^^; [celest]
+ * Removed the option to load zlib as a plugin for Win32 since it should be
+ linked at compile time [celest]
+ * Added zlib and libmysql .lib files for compiling in Visual Studio [celest]
+ Note: The project files on SVN don't have them yet, you'll need to include
+ them yourself for now
+ * Fixed a compile error in Visual Studio [celest]
+ * Readded a missing zlib file needed by Win32, sorry ^^; [celest]
+2005/11/11
+ * New readme content/layout (IE warning: IE hates new readme) [Evera]
+ * Imported use of the refine weapon packets from jA. [Skotlex]
+ * Removed SC_MODE, now NPC_EMOTION and NPC_EMOTION_ON can change a mob's
+ mode permanently (until their death, that is), and it won't work on
+ player summoned mobs. As before, val1 is the emotion value, val2 is the
+ mode to add/remove. Val3 is now ignored (used to be duration) [Skotlex]
+ (no, no need to wipe SC data this time around either)
+ * Cleaned up sql-files to use TYPE rather than ENGINE as TYPE is supported
+ by older MySQL versions and not quite deprecated yet. [Skotlex]
+ * Modified the party even share exp bonus to be +10% per extra party member
+ as official sources state. [Skotlex]
+ * Organized the clif_devotion packet, and added clif_marionette as per
+ jA's implementation. [Skotlex]
+ * Added db_path to map_athena.conf, used to specify an alternate directory
+ to locate the db/ files. Defaults to "db", obviously. [Skotlex]
+ * Removed SC_FALCON and SC_RIDING, the status icons are directly managed
+ through the change of the character's option now. The actual defines were
+ not removed to avoid shifting all the SC_ values again (no need to wipe sc
+ data) [Skotlex]
+ * Added additional debug information to battle_attr_fix until the cause of
+ those errors are found and resolved. [Skotlex]
+ * Fixed win32 compiles always reporting "unable to set socket to
+ non-blocking mode", together with other minor win32 fixes. [Skotlex]
+2005/11/10
+ * Fixed char-sql cart loading. [Skotlex]
+ * Updated the function that specifies the cards to support more than four
+ slots. [Skotlex]
+ - Since the packets are fixed sized the client can never receive data of
+ more than four cards, therefore if the client was compiled with MAX_SLOTS
+ above 4, a random subset of cards will be sent each time the item data is
+ sent (eg: if the item has 6 slots, it may randomly choose to send cards
+ 1->4, 2->5, or 3->6).
+ * Removed the OnAgitInit call when the map connects to char server. Fixes
+ double guardian spawn. [Skotlex]
+ * Fixed the sql query strings that would appear "incomplete" under certain
+ *nix systems. [Skotlex]
+ * Applied zBuffer's patches to correct memory leaks in the PCRE module
+ (regular expression support for npcs) and prevent server crashing when
+ scripts divide (or do mod %) by zero. [Skotlex
+2005/11/09
+ * Fixed Ankle Snare and Spider Web not being cleared when the trapped
+ target dies. [Skotlex]
+ * Fixed the range flag being incorrectly set in BF_MISC skill attacks.
+ [Skotlex]
+ * Corrected Venom Knife using Level1 always for the poisoning chance rather
+ than learned Envenom's level. [Skotlex]
+ * Fixed the crash on shutdown if PCRE support was enabled. [Skotlex]
+ * Fixed possible item duping while vending, thanks to End of Exam for
+ pointing it out. [Skotlex]
+ * Fixed the blue aura of Night effect. Thanks to zBuffer [Skotlex]
+ * Fixed mobs moving one tile when hit even if they can't move (this is what
+ broke Ankle Snare) [Skotlex]
+ * Fixed night/day implementation (which broke due to the addition of SI_
+ constants). [Skotlex]
+ * Cleaned up the SI_ constants to have defined only those which actually
+ display something on the client. [Skotlex]
+ * Fixed a bug which caused a captured pet's name to be displayed as beloved
+ even though it was just captured. [Skotlex]
+ * Added temp skill quests for all complete 2nd Class Quest Skills [Lupus]
+2005/11/08
+ * Updated the documentation on the announce script commands. [Skotlex]
+ * Removed the global color message support as there's now a way to craft
+ custom colored announces. [Skotlex]
+ * Probably fixed mapannounce. [Skotlex]
+ * Implemented SI_ constants to specify the icon number for different SC_
+ changes, idea adopted from jAthena. All SC_ data was reorganized and
+ several checks are now in place. It is likely all saved sc_data is wrong
+ after this update due to the numbers changing places. It won't cause any
+ glue-boots.. but the wrong status changes will be loaded the first time
+ anyway, so it may be a good idea to wipe that file/table for this update.
+ [Skotlex]
+ * Added mob boss inmunity to status changes: poison, curse, deadly poison.
+ [Skotlex]
+ * Now when the mob starts casting a skill and stops walking, a packet will
+ be sent to update the mob position on the clients. [Skotlex]
+ * Fixed a bug in mob_stop_walking which may fix stun-lock. [Skotlex]
+ * Fixed not showing named/carded items in Vending [Lupus]
+ (when you drag'n'drop them from your cart into your shop list)
+2005/11/07
+ * Expanded script commands announce/mapannounce/mapareaannounce to take an
+ additional parameter to define the color. This uses the new packet 0x1c3 to
+ send the broadcast, and even though the packet is not fully understood yet,
+ it should be at the point where it can be used. [Skotlex]
+ - eg: "announce "hello world", bc_map, 0xFFFF00;"
+ * Cleaned up and optimized the way card data is set in packets. Should
+ correct most, if not all, pet-egg related issues. [Skotlex]
+ * Removed combo_damage_delay and added damage_walk_delay_rate. Now the total
+ delay during which you can't move is a percent of the normal damage delay
+ rate adjusted by number of hits and this rate. Defaults to 50% for now. [Skotlex]
+ * Removed the random damage delay value from status_get_dmotion as it is
+ not really helping the walk-stun-lock. [Skotlex]
+ * Made Gravitation ignore target's cards. [Skotlex]
+ * Updated readme with new layout [Evera]
+ * Updated bAddMonsterDropItem bonuses to work with cards: Mimic Card, Mystcase Card
+ where bonus_item_rate = base_rate * (killed_mob_level/10) + 1
+ So if 2nd argument is negative, then it's 'rate'
+ Now, if you kill Porings, u'd have OBB/GIFT BOX drops with 0.01% chance
+ and if u kill Leaf Cats then u'd have them with 0.05% chance
+ Max chance is 0.1% (when u kill MVPs with level > 94) [Lupus]
+2005/11/06
+ * Cleaned up a bit the warp portal code. [Skotlex]
+ * Added a timer to invoke the OnAgitInit event 10 seconds after the char/map
+ servers are connected. Scripts should now carefully use OnInit to load the
+ castle data, and OnAgitInit to check for castle owners, mobs, WoE, etc.
+ [Skotlex]
+ * Reverted the damage delay equation to 800 -4*agi, which is the correct
+ data from packets examined. [Skotlex]
+ * Slow motion Fix: Reverted weight packet, thanks to Momoko [Lupus]
+2005/11/05
+ * Fixes on sending to client status of char (guild, position, etc). [LuzZza]
+ * Updated backsliding to work as it should. [Skotlex]
+ * Added back the GPL licence on the root directory (why was this removed?)
+ [Skotlex]
+ * Fixed knock-back packets, thanks to Vicious for collecting the packet
+ samples. [Skotlex]
+ * Fixed pretty much all ground skills not working when you "walked into
+ them" (they were fine if casted on top of you, though) [Skotlex]
+ * Fixed not working ZENY LOG. You can use logging filter as well. [Lupus]
+ - Only SQL logs available.
+ - Logs only Vending, Trade, Shops yet
+ - Don't forget to update your logs SQL DB and log_athena.conf
+ * Added previously removed (by an accident) "MVP Prize item log" into pick_log [Lupus]
+2005/11/04
+ * Added support for new quest skills to @allskills/@skillall. Thanks again to blackhole89 for
+ pointing that out! [Kayla]
+ * Fixed various occurencies of assuming Guild Skills being >= ID 10000
+ rather than 500<skill<1000 still after skill_chk. Thanks blackhole89! [Kayla]
+ * Hopefully fixed Weapon Refine. [Skotlex]
+ * Applied a change which prevents pc_setpos from working for characters
+ between maps, as doing so makes the character appear on a different
+ position on the client than the position stored in the server. [Skotlex]
+ * Added friend_db option to inter_athena.conf, now friend table is
+ usable in multi server and/or custom db configs. [Foruken]
+2005/11/03
+ * Corrected the basilica check which should disable casting offensive
+ skills from within inside the basilica. [Skotlex]
+ * Modifed status_change_end to prevent peco-peco/falcon from ending until
+ the player's 'falcon/peco option' value is removed first. [Skotlex]
+ * Removed the knockback code for players and changed it for a "fix
+ position" code. The new code is not right as it makes your character
+ "teleport" to the position rather than walk really fast to it, but it fixes
+ the "Do not use bot!" messages. [Skotlex]
+ (someone has to log the actual packets used when being knocked/knocking
+ back for this to really be fixed)
+ * Heaven Drive now can target traps. [Skotlex]
+ (I find it impossible to target a trap with Arrow Shower unless the
+ skill's info is set to 32 -target traps-, but when it's done so, the
+ client refuses to use the skill on enemies, and mode 33 makes the skill
+ useless. How does one makes this work?)
+ * Various cleanups to the skill system. [Skotlex]
+ * Update: Now your cast cancels on recieving status change such as:
+ Stun, Stone Curse, Freeze or Sleep [LuzZza]
+ * Updated the code to allow the Emperium to be inflicted by Pneuma and
+ Safety Wall. [Skotlex]
+ * Updated @recallall to revive any dead characters before moving them,
+ should fix that weird ghost bug. [Skotlex]
+2005/11/02
+ * Made Spell breaker not be able to cancel Pressure/Gloria domini [Skotlex]
+ * Another fix/optimization to thenight/day system. [Skotlex]
+ * Fixed possibility of freezing / stunning already frozen/stunned players
+ - Now you can't freeze an already frozen one [Lupus]
+ * Fixed non-GMs allowing send trade requests from far places [Lupus]
+ * Fix of lowest_gm_level (inter_athena), now logins with access under
+ lowest_gm_level overides gm_can_drop_lv. [Kayla]
+ * Spell Breaker now works on any skill with a cast time. [Skotlex]
+ * Made Dispell not work on Meltdown and Cart Boost [Skotlex]
+ * Made Meltdown not dispellable upon death. [Skotlex]
+ * Probably fixed Warp Portal [Skotlex]
+ * Fixed players being able to mute others even if their gm level is not
+ high enough to use @mute [Skotlex]
+ * Fixed Dispell not clearing a lot of status changes it should. [Skotlex]
+ * Corrected the way the Emperium skill-defense works. Damage skills other
+ than Gloria Domini, Raging Trifecta and Gravitation do no damage. Status
+ changing skills have no effect, and normal heal heals for 0. [Skotlex]
+ * Some more corrections to the night/day system. [Skotlex]
+ * Multiple fixes to the skill system. Should fix Warp Portal, Teleport and
+ mob skills crashing the server. [Skotlex]
+ * Updated sql-files/item_db.sql with the latest. [Skotlex]
+ * Some optimizations to the script config events loading/storing/saving.
+ (Somehow it fixes the warning from the memory manager on shutdown...)
+ [Skotlex]
+2005/11/01
+ * Updated battle_check_target to allow ground skills that affect "Everyone"
+ to affect the emperium, only the ones that target only enemies will have no
+ effect. [Skotlex]
+ * Changed the default of mob_max_skilllv from 11 to 100, as many of the
+ recent mobs use higher level skills. [Skotlex]
+ * Moved the check which made emperiums receive 0 damage to: [Skotlex]
+ - status_check_skilluse, so that all targetted skills fail.
+ - battle_check_target, so that all ground-based offensive skills fail.
+ * Cleaned up a bit the skill related code. [Skotlex]
+ * Updated @ commands. NO command comes at gm-level 0 by default now, that's how
+ it should be, the new default minimum is 1 for most trivial @ commands. Also added
+ a bunch of commands to conf/atcommand.conf which were missing. I STRONGLY
+ recommend everyone to at least fetch the new atcommand file as there
+ were abusable commands at level 0 (abusable in the sense they can incur
+ performance penalties if over-used by everyone) [Skotlex]
+ * Fixed crash when a mob was killed while under Rich Man Kim effect by a
+ non-player, also fixes Rich Man Kim not giving the correct exp bonus.
+ [Skotlex]
+ * Modified the socket subsystem to not close all connections on an "Service
+ Temporarily Unavailable" error (it is a non-fatal error which basicly means
+ "try again later"). [Skotlex]
+
+2005/10/31
+ * Fixed all players having the "plant" mode on... [Skotlex]
+ * Added a timer to delay the automatic respawn of characters in gvg or pvp
+ grounds. The delay is currently 1 second, but be warned that because of
+ this it may be possible to revive the character if some priest is insanely
+ fast as there's currently no way to "prevent" a character from being
+ resurrected. [Skotlex]
+ * More and more new quest skills! :3 [DracoRPG]
+ * Removed the setting where characters could logout overriding the
+ prevent_logout setting if they were dead (it made it extremely easy to
+ accidentally log out if you were killed while trying to escape) [Skotlex]
+ * Changed prevent_logout from yes/no to a "duration in ms" setting.
+ Defaults to 10secs (10000ms), note the client always says "wait 10 seconds"
+ regardless of the value of this setting. [Skotlex]
+ * Moved the status change of SC_RIDING/SC_FALCON from clif_changeoption to
+ pc_changeoption which correctly makes the falcon/riding states end on quit.
+ [Skotlex]
+ * Mob ai fix (mobs locking down into one target forever even if they should
+ be able to change targets) [Skotlex]
+ * Added routine to check party share level whenever one of the members
+ levels up. It's checked on the map server, and then a share request is sent
+ to the char-server if party_share_level is broken. [Skotlex]
+ * Corrected "show drain" to show nothing if the leeched values are
+ non positive. [Skotlex]
+ * Probably fixed Wand of Hermode not blocking the caster from walking.
+ [Skotlex]
+ * Applied Silent's fix to @where [Skotlex]
+ * Code cleanup regarding sign/unsigned comparisons. [Skotlex]
+ * Updates to new quest skills, some are fully functionnal, some half, some
+ not at all xD. [DracoRPG]
+2005/10/30
+ * Fixed a bug that broke pet skills. [Skotlex]
+ * @follow: Now to stop following, you may just type @follow, thx2Sartory [Lupus]
+ * Fixed & finished what I did yesterday with SCs and quest skills, thanks
+ to Silent. [DracoRPG]
+2005/10/29
+ * Reorganized SC IDs to make room for 2nd jobs quest skills statuses: upped
+ SC_SENDMAX to 300 and moved all required SC to 300+. BEWARE: as a side-
+ effect of this, you might get 'glue boots' if an SC was saved and cannot
+ be restored because the ID isn't used anymore, this should only happen
+ with bonuses from cooked foods & dances/songs (unlikely since they last 20
+ seconds only), and maybe a few other such things. Simply remove lines
+ with SC IDs above 200 in your sc_data file/table. [DracoRPG]
+ * Changed a bit the way Plant Cultivation fails: when it fails because of
+ missing items, it does nothing and displays "Skill had failed"; when the
+ 50% success rate test fails, the effect is displayed but no plant summoned.
+ How should it work exactly? Because previous way was a bit confusing for
+ the player, not explaining why it failed, so I'd like to know. [DracoRPG]
+ * Changed food cooking success rate to unmodifiable 50%, temporary value
+ waiting for accurate data ;) [DracoRPG]
+ * Fixed the code in skill.c so that skills are considered as guild skills
+ (for things such as inf, maxlv, etc) only when their ID >= 10k, enables
+ use of 2nd jobs quest skills with 1k+ IDs, thanks to Silent. [DracoRPG]
+ * Fixed the Flag guild script. Now one can only flag in using the flags infront
+ of the castle. [Kayla]
+ * Removed most of the built-in zlib files and the LOCALZLIB compile option
+ Note: All native Windows builds now require zlib1.dll, you can just download
+ it from http://www.zlib.org and place it in the main directory [celest]
+ * Changed the unzip library to be static linked instead of dynamic [celest]
+ * Small fix to the trading routing, should fix items with the no-trade flag
+ being able to be vended. [Skotlex]
+2005/10/28
+ * Fixed the size of the equip_job field in SQL item_db/item_db2, thanks to
+ blackhole89. [DracoRPG]
+ * Harmonized the way NPC events such as PCLoadMapEvent, PCBaseLvUpEvent, etc
+ are implemented. Caution, now PCLoadMapEvent NPC is called globally: it
+ is not needed to put it in a specific map. Use script functions to know
+ which map the player has been warped to. Thanks to Z3RO. [DracoRPG]
+ * Fixed the names of the job level up char commands. [Skotlex]
+ * Tiny change to the script engine which may fix those crashes. [Skotlex]
+ * Added blocking use of skills while sitting. [Skotlex]
+ * Implemented Trancid's expanded global announce system. [Skotlex]
+2005/10/27
+ * Applied Ilpalazzo-sama/Zzo's patch that cleans up and fixes some bugs
+ with the script engine. [Skotlex]
+ * Made land protectors from enemies cancel each other out. [Skotlex]
+ * Made it so Guardians/Emperiums with no owning guild can be attacked out
+ of woe. [Skotlex]
+ * Corrected being able to attack and use skills during the first interval
+ of Petrify [Skotlex]
+ * Fixed packet exploit that allowed you to produce multiple times without
+ first triggering the skill. [Skotlex]
+ * Cleaned up/simplified the implementation of SC_NOCHAT [Skotlex]
+ * Added file upgrade_svn3746.sql, use it to alter your `char` table column
+ "manner", which should NOT be unsigned (if your column already is
+ signed, then no need to apply this update) [Skotlex]
+ * More code cleanup to make eA ANSI-C compliant. [Skotlex]
+ * Some fixes to the night-day-system. [Skotlex]
+2005/10/26
+ * Some more multi-map server work. It seems to work now correctly and with
+ no memory leaks, however it likely needs more testing. Also added the
+ support into the char-TXT server. [Skotlex]
+ * Patched a crash where mobs with no space for looting would attempt to
+ loot. [Skotlex]
+ * Updated mapflags, readded gvg_dungeon. Now mapflags work according to
+ this post: [Skotle]
+ http://eathena.ws/board/index.php?showtopic=58201
+ * Likely fixed Party Even Share. [Skotlex]
+ * Added map flag "nightenabled", only maps with this flag will display the
+ night effect when it's night. Said maps are specified in mapflag/night.txt [Skotlex]
+ * Modified map flags gvg and gvg_dungeon. gvg now is basicly the same as
+ pvp, except guilds are automatically teamed up, while gvg_dungeon was
+ removed and replaced by gvg_castle, which is the flag now used for castle
+ maps which only modify the behaviour during WoE times. [Skotlex]
+ * Updated the login/char TXT Makefiles so the TXT_ONLY flag is passed, this
+ SHOULD fix the guild size mismatch errors... [Skotlex]
+ * Probably fixed a char-server crash related to whispers. [Skotlex]
+ * Updated the custom jobmaster so it should stop second advanced classes
+ from being able to re-change jobs. [Skotlex]
+ * Implemented dynamix's night system which uses a status change rather than
+ the "darkness levels", said config option removed as is no longer needed.
+ [Skotlex]
+ * Some fixes to the char-sql code when sending chars to another map server.
+ [Skotlex]
+ * LuzZza's ported Trade/Vending additional antispoof checks [Lupus]
+ - thanks to Yor&Freya Team. So LuzZza is our new dev (it was his 2nd test)
+2005/10/25
+ * Some work fixing up multi-map servers. It should now *work*, however each
+ time the player swaps map-server it triggers all the relevant
+ on-login/on-logout events, which likely needs to be corrected at a later
+ date. Only SQL has been updated so far, TXT is still pending. [Skotlex]
+ * Updated GrandCross so it does half damage on the caster (+half damage
+ from Faith, it does just 25% or less damage to self now) [Skotlex]
+ * Updated battle_check_target to consider normal mobs as always belonging
+ to the same party (should fix them fighting out when pkmode is on)
+ [Skotlex]
+ * Fixed the Makefile for TXT char/login servers (fixes guild structure size
+ mismatches) [Skotlex]
+ * Added script command "playerattached", returns the char_id of the player
+ currently attached to the script, 0 if there's no player attached (or
+ attached player is no longer on the map server) [Skotlex]
+ * Fixed @changegm in the char-txt server. [Skotlex]
+ * Some code cleanup to make eA ANSI-C complaint (not quite there, but
+ closer) [Skotlex]
+2005/10/24
+ * Applied Ilpalazzo-sama/zzo's patch that optimizes the status_get_*
+ functions. [Skotlex]
+ * Fixed changegm (as far as I know) [Skotlex]
+ * Modified again the code that checks who and what can target traps. It
+ should be set to only let heaven's drive, arrow shower and remove trap
+ target them. [Skotlex]
+ * Breaker now ignores mdef. [Skotlex]
+ * Fixed script command "makeitem" to only require an attached player if the
+ map is defined as "this". [Skotlex]
+ * Updated battle_check_target to enable only skills with inf 32 (can target
+ traps) to hit traps. Implementation may not be perfect depending on how
+ the client reacts to the associated skill_db change. [Skotlex]
+ * Cleaned up battle_weapon_attack. [Skotlex]
+ * Some optimizations to the struct mob_data. [Skotlex]
+ * Applied Ipalazzo-sama/zzo's memory optimization patches. [Skotlex]
+ * Fixed some quests and updated item_db. [Kayla]
+ * Updated Grimtooth to cause "Stop" on enemies instead of slow down. The
+ duration used is now skill's time 2. [Skotlex]
+ * Updated the mob_ai code so they do nothing if they were attacked but
+ can't attack back (and it did not invoke a rude attacked, that is,
+ monster_ai does not has 2 set) [Skotlex]
+2005/10/23
+ * Some fixes to @charmountpeco [Skotlex]
+ * Some cleanups to pet.c, fixes pet_timer being invoked when the pet is
+ idle. [Skotlex]
+ * Added a clause to ignore name solve requests of chat-rooms (for some
+ reason the client requests them...) [Skotlex]
+ * Updated sql-files/item_db.sql to the latest. [Skotlex]
+ * Removed that mob_spawn_once message that is just a debug message with no
+ real purpose anymore. [Skotlex]
+ * Fixed forging displaying success even when it fails. [Skotlex]
+ * Changed main.sql so that sc_data only has indexes, not a primary key
+ (I keep hearing mysql can't handle a triple column PK...) [Skotlex]
+ * Fixed Doublecast's success chance [Skotlex]
+ * 'Fixed' the warning on @reloadscript (just removed the warning and
+ avoided memory leaks, because properly unloading the user functions and
+ reloading them I could not get done) [Skotlex]
+ * Fixed possible crash due to custom packets, thanks to Andz for the info.
+ [Skotlex]
+ * Fixed mob's Scream/Frost Joke crashing the server if the message was too
+ long [Skotlex]
+ * Fixed the wrong attribute being passed to the attribute fix in
+ battle_calc_magic attack (strange deja vu feeling.. I am sure I fixed this
+ same bug before). [Skotlex]
+ * Fixed trading. [Skotlex]
+ * Removed Mastery damage being applied to Grand Cross [Skotlex]
+ * Some more fine-tuning of the Grand Cross equation. [Skotlex]
+ * Fixed mobs that couldn't attack not being able to use skills (first half
+ of why marine spheres were broken). [Skotlex]
+ * Updated summoned marine spheres so they can move (second half of why
+ marine spheres were broken). [Skotlex]
+ * Rewrote the produce system for mixed foods creation [DracoRPG]
+ * Small changes and optimizations to battle_calc_magic_attack, replaced redundant
+ magic_subrace with missing magic_addsize, updated crappy doc about it [DracoRPG]
+2005/10/22
+ * Modified Finger Offensive's formula to be 100% + 50%*skilllv which seems
+ to be a more factually correct equation than what is shown in the websites.
+ [Skotlex]
+ * Applied Ilpalazzo-sama's patch which speeds up the data zeroing in
+ status_calc_pc. [Skotlex]
+ * Crashfix on invalid lines when reading castle_db.txt [Skotlex]
+ * Updated GrandCross's damage formula according to Komurka's information.
+ [Skotlex]
+ * Also, now skills that ignore card modifiers only ignore the attacker's
+ card modifiers, no the target's (does not apply to skills like Pressure
+ that do fixed damage). [Skotlex]
+ * Updated Bowling bash damage, knockback to current Kro values. [Skotlex]
+ * Modified NPC_EMOTION and NPC_EMOTION_ON so they can be used to modify the
+ current mob's mode (instead of setting it). [Skotlex]
+ - Some examples:
+ 1269,Clock@NPC_EMOTION_ON,attack,474,1,10000,0,30000,yes,self,always,0,6,4,300,,,
+ Adds mode 4 (aggressive) for 300 seconds to Clocks when attacking.
+ 1193,Alarm@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,19,4,10,,,
+ Removes the aggressive mode (4) from Alarms when chasing for 10 seconds.
+ - After a mob's mode is changed, their state is reset so they can stop
+ chasing/seek a target.
+ * Made GrimTooth be longranged, Soul Drain work only on targetted skills,
+ and Extremity Fist only checks for enemy state right before attacking (I am
+ not sure it is 100% as it should be still, though) [Skotlex]
+ * Eh.. now Safety Wall blocks all skills tagged as short-ranged. Report any
+ anomalies this causes. [Skotlex]
+ * Added support for global mob skills. In essence, you can now specify a
+ mob skill that is added to ALL mobs in a single line by using negative
+ class IDs. -1 adds the skill to normal mobs, -2 adds the skill to
+ bosses, and -3 to both. For example:
+ -1,All@AL_HEAL,any,28,10,10000,500,5000,yes,friend,friendhpltmaxrate,60,,,,,,
+ Adds Heal Lv10 to all normal mobs.
+ * Readded the level up buff bonus from the Taekwon class T.T [Skotlex]
+2005/10/21
+ * Removed the level up buff bonus from the Taekwon class T.T [Skotlex]
+ * Small change in mob_ai_sub_hard which may fix mobs casting their Rude
+ Attacked skill when they shouldn't. [Skotlex]
+ * Moved the code so that SNovice Steel Body should trigger inmediately upon
+ death, and bypass the exp loss penalty. [Skotlex]
+ * Added Taekwon boy to the buff on level up system. [Skotlex]
+ * Fixed Skills checking for water-cells instead of Land Protector cells.
+ [Skotlex]
+ * Added config option skillrange_by_distance, makes skills be long/short
+ ranged based on the source/target distance. Defaults to 6 (mobs + pets).
+ [Skotlex]
+ * Fixed Magic Power totally messing up matk. [Skotlex]
+ * Fixed Meteor Storm [Skotlex]
+ * Some changes to Moonlight Petals, it should make the skill finally be
+ considered an ensemble skill. [Skotlex]
+ * Updated skill_split_atoi to guess linear increases up to half of the data
+ provided. This means it can understand the more complex cast times of
+ skills such as Meteor and Soul Strike. If you provide the data of ten
+ levels, then it will check for patterns up to 5 steps long (meaning that
+ the diff between 1 and 6 is the same as the diff between 2 and 7 and so on,
+ and if they all match, the tested pattern is applied all the way to level
+ 100) [Skotlex]
+ * Some modifications to Magic Power, it should hopefully be working now. [Skotlex]
+ * Cleanups and fixes to Tarot Card. [Skotlex]
+ * Fixed a screwup in skill_split_atoi which was corrupting the skill db. [Skotlex]
+ * Free up block chunks allocated by the memory manager when shutting down [celest]
+ * Updated packets in packet_db and clif.c [celest]
+2005/10/20
+ * Turned on the error_log by default (had this been on before, I would had
+ noticed why Longing for Freedom was not working several WEEKS ago >.<)
+ [Skotlex]
+ * Fixed Longing for Freedom [Skotlex]
+ * Hopefully fixed even-share party on char relog exploit. [Skotlex]
+ * Modified Land Protector so it behaves more like Basilica. [Skotlex]
+ * Removed GM account reading from the char-sql server and moved it into
+ the login-sql server (Ancyker requested this was fixed... and this is how
+ it was working on the TXT servers) [Skotlex]
+ * Modified skill_split_atoi so it can guess linear changes in the values
+ and fill out the rest of the array correctly (eg: blowcount is defined as
+ 1:2:3:4:5, now the function can understand that and fill the rest of values
+ with 6:7:8:9:10 and so on. It can also understand two-step increases, if
+ the value is 1:2:2:3:3:4, it can guess that the following values should be
+ 4:5:5:6:6:7:7 and so on). This allows mobs to cast stuff like Thunderstorm
+ LV67 without the need of manually updating the dbs with the corresponding
+ values :O [Skotlex]
+ * Fixed monster_ai&1 doing the opposite of what it should do. [Skotlex]
+ * Rewrote the skill unit reiteration code so that it'll work with any AoE
+ skill that is set to not reiterate in skill_unit_db.txt, when no
+ reiteration is set, the skill cannot be stacked with itself, but it can
+ be placed on top of other AoE skills (except for Pneuma, Safety Wall,
+ Warp Portal, Basilica and the Hunter traps who all have their own checks
+ hardcoded) [Skotlex]
+ * Modified the way Magic Power works for AoE magic skills, it should now
+ work correctly for all AoE spells including Meteor. [Skotlex]
+ * Added mode "change target" (0x200 = 512) to specify mobs that can change
+ target while attacking. Since no mob in the db has been updated yet to
+ include this mode, for the time being all aggressive mobs will also be
+ considered as "change target" types (which is how eA has been managing it
+ up to this point) [Skotlex]
+ * Added a check in status_check_skilluse to make AoE skills fail if the
+ caster is standing on Basilica. [Skotlex]
+ * Reduced a bit the size of the party structure. [Skotlex]
+ * Fixed Play Dead [Skotlex]
+ * Reverted a memory fix in script.c which causes a crash.. [Skotlex]
+ * Reverted a small change which likely made magic power not work anymore on
+ ground skills. [Skotlex]
+2005/10/19
+ * Added an SQL update update_logs2.sql Use it for more effecient work of your MySQL server [Luups]
+ * Likely fixed Root and the Wedding Skills [Skotlex]
+ * Fixed that crash in skill_use_id.. oops. [Skotlex]
+ * Fixed demonstration triggering status effects. [Skotlex]
+ * Fixed ground placed skills causing skill_counter_additional_effect
+ triggering on the skill's owner. [Skotlex]
+ * Added corrections/checks that should prevent the char servers from
+ crashing if they parse a packet from a client where the session data is
+ expected to be but is not set. [Skotlex]
+ * Converted NPC_STOP to a status-inducing effect, SC_STOP which prevents
+ characters from moving. [Skotlex]
+ * General checks and cleanup (new function pc_can_move) to prevent chars
+ from walking when they shouldn't be able to. [Skotlex]
+ * Some changes to int_party, which may prevent crashes due to large parties
+ in congested situations. [Skotlex]
+ * Software Caused Connection Abort errors should inmediately terminate the
+ connection now (rather than waiting for the timeout) [Skotlex]
+ * Hopefully fixed Basilica by making battle_check_target use the mapcell
+ instead of the status change when deciding the enemy state. [Skotlex]
+ * Fixed being able to enable NPC clicks while a trading window is open. [Skotlex]
+ * Added status change SC_MODE which allows to temporarily override a mob's
+ mode. It can be invoked through mob skills NPC_EMOTION and NPC_EMOTION_ON
+ using the second and third value (new mode and duration in seconds,
+ respectively). Example:
+ 1269,Clock@NPC_EMOTION_ON,attack,474,1,10000,0,30000,yes,self,always,0,6,133,300,,,
+ Makes the Clock do the /an emotion, and his mode changes to 133 (can
+ move, can attack, aggressive) for the following 300 seconds (if the mode
+ is 0, then the mode is not changed).
+ - Note that when a mob gets their mode changed, their state is reset (so
+ they stop attacking/chasing)
+ - Because of this update, the code that made mobs give up chasing after a
+ while is no longer needed and hence, removed.
+ * Implemented function status_check_skilluse which checks whether a skill
+ (or melee attack) can be used on an enemy based on their status (restricts
+ skills that may be used if opponent is cloaked/hidden, or blocks Aex
+ Aeterna if opponent is petrified/frozen, blocks skills while silenced, etc
+ etc). Note that the code simplification/modification is big, so beware of
+ any new bugs that might have been caused by the function. [Skotlex]
+2005/10/18
+ * Fixed card set bonuses for sure this time (or so I hope) [Skotlex]
+ * Fixed the Dissonance song bug which allowed you to cast a song afterwards
+ and it would not follow you around. [Skotlex]
+ * Modified the counting function to never count in skills (traps, AoE
+ skills) since traps were always being counted in for stuff like Napalm
+ beat/Blitz Beat/etc. [Skotlex]
+ * Fixed Devotion/Sacrifice check which should enable recasting on
+ characters. Thanks to Irmin for pointing it out. [Skotlex]
+ * Fixed offensive heal so it fails if not used on an enemy (instead of
+ failing when used on an ally). [Skotlex]
+ * Modified the char servers so they do a party range check when a character
+ logs in. This should fix parties keeping their even share even after a
+ low-level member rejoins the server. [Skotlex]
+ * Updated mob AI so that aggressive mobs will change targets if they are
+ attacked and their current target isn't attacking them (regardless of
+ range) [Skotlex]
+ * Some updates to the pet AI so their chase range is range3 instead of the
+ hardcoded value of 13. [Skotlex]
+ * Reverted Mika's fix since it makes it impossible for mobs to heal each
+ other. (what is the so called exp bug about?) [Skotlex]
+ * Fixed a possible crash in clif_equiplist(), thanks to Zoc [Skotlex]
+ * Spells are now considered a "miss" if they do no damage (this prevents
+ additional effects from triggering out such as freezing) [Skotlex]
+ * Temp bug fix of Exp increase when healing non-undead mob (by MiKa) [Lupus]
+2005/10/17
+ * Updated sql-files/mob_db.sql to match with the current one. [Skotlex]
+ (someone else also did this, but missed a few values from Incantation
+ Samurai. Altough who did it and why it is failed to be mentioned in the
+ log files?) [Skotlex]
+ * Fixed alchemists not being able to hit their marine spheres (how many
+ times this same bug keeps coming back from the dead anyway?) [Skotlex]
+ * Updated sql-files/item_db.sql to the current item_db.txt [Skotlex]
+ * Fixed magic rod not cancelling the additional effects from skills. [Skotlex]
+ * Cleaned up the card inserting code to prevent crashes from modified
+ packets. [Skotlex]
+ * Fixed offensive heal [Skotlex]
+ * Applied a random chance when reducing the mob's chase duration. This
+ should randomize how long the mob chases you around before giving up.
+ [Skotlex]
+ * Some modifications to the timer push heap function, may fix timer issues
+ when creating timers with tick values that overflow. [Skotlex]
+ * Modified the mob ai so it has a seek time, when the min_chase runs out
+ (it is constantly decreased while chasing, starts out at range3) the mob
+ will stop chasing, do a /swt, and stop being aggro for 10 secs. This is how
+ it should be according to what I understood from Komurka's explanation.
+ [Skotlex]
+ * Added config monster_ai, it determines some of the mob behaviour:
+ - If &1, mobs will use hard path finding to reach their target, otherwise
+ only easy (straight line) path searches will be used (for most offensive
+ purposes).
+ - If &2, mobs will use the rude attacked skill if they can't attack back no
+ matter what, otherwise they use it only if they can't reach the target.
+ [Skotlex]
+ - Still pending on what other things it could define. Currently defaults to
+ 0 (seems to be the official mob ai) [Skotlex]
+ * Now Atk/Matk potions duration don't get automatically multiplied by 1000,
+ duration must be specified in ms in the scripts. [Skotlex]
+ * Made all mobs with no guild belong to the same guild, this should prevent
+ mobs from attacking each other on WoE. [Skotlex]
+ * Fixed Into the Abyss + retrieving traps related exploits. [Skotlex]
+ * Changed monster_skill_nofootset to no to enable mobs casting stuff like
+ Bomb underneath characters. [Skotlex]
+ * Fixed Sacrifice, it can now be recasted on a player as long as it's by
+ the same crusader that is currently protecting the player. [Skotlex]
+ * Fixed some unitialized values error in magic and misc attacks. [Skotlex]
+ * Fixed 30% bonus from upper/baby classes affecting card bonuses. [Skotlex]
+ * Fixed baseClass not working on Acolyte class, thanks to Silent. [Skotlex]
+ * Made the stone curse animation only show up on successfully cursing. [Skotlex]
+ * Added Meditation's bonus to offensive heal, thanks to Orn. [Skotlex]
+ * Made devotion fail when already used on a char with that effect. [Skotlex]
+ * Made it so you can't quit while cloaking/hiding, and said status will end
+ on quit if force-quitting. [Skotlex]
+ * Cleaned up and fixed isequipped script commands, it should be working
+ correctly now (tested with the Assassin combo) [Skotlex]
+ * Fixed not stacking Long Attack Rate bonuses [Lupus]
+ - Bow Thimble +3%, Archer Skeleton Card +10%, Merman Card(when CARDS COMBO) +20%
+ - We should get rid of that +-15% ranged damage varianc (it doesn't cure "stoprate bug" anyways)
+2005/10/16
+ * Fixed wrong calculation of items max drop chance (when using MySQL MOB DB) [Lupus]
+ * Added nomemo mapflag to more levels of Thanatos Tower, thx2Justin84 [Lupus]
+2005/10/14
+ * Updated the gvg_dungeon mapflag to mean "guild versus guild regardless of
+ woe schedule" and set it on the guild versus guild maps. [Skotlex]
+ * Fixed perfect hiding. [Skotlex]
+ * Cleaned up (or rewrote?) the Run and High Jump code to merge them better
+ with the normal walking routines. [Skotlex]
+ * Corrected Turn Undead from ignoring element. [Skotlex]
+ * Updated Power Thrust Max & Power Thrust so that they don't stack (and
+ only PT Max cancels PT) [Skotlex]
+ * Some fine tuning in battle_check_attackable. [Skotlex]
+ * Changed db_final's implementation to End of Exam's. [Skotlex]
+ * Corrected Guardian removal routines to also update/save their respective
+ Castle data (Guardian HP and visibility) [Skotlex]
+ * Added map server setting "enable_spy", must be set to yes/on for @spy
+ commands to work. [Skotlex]
+ * Applied End of Exam's fix to the previous fix to the db. [Skotlex]
+ * Fixed spyguild/spyparty sending packets to the spied guild/party instead
+ of your own. [Skotlex]
+ * Rewrote the card hash implementation. Now it should work correctly for
+ any card set on any equipped item. Supports up to 4 slots in any of the
+ equipped items. [Skotlex]
+ * Updated the mob ai so it stops chasing right away if you
+ hide/cloak/vanish/etc. [Skotlex]
+ * Fixed some memory issues in the db handling. Credits to End of Exam.
+ [Skotlex]
+2005/10/13
+ * Updated the main.sql file with some of the recommendations by Zoc
+ [Skotlex]
+ - If your sc_data table works as it is, you don't have to touch it.
+ * Fixed Maxmize Power/Cloaking sending the sever to an "infinite loop" when
+ used by mobs. [Skotlex]
+ * Some cleaning to clif_send in regards to guild-related packets. [Skotlex]
+ * Added mob skill condition "afterskill", works like "skillused" except
+ it's triggered after the mob was the one doing the mentioned skill.
+ [Skotlex]
+ * Small cleanup and optimization of data saved when received member
+ information. [Skotlex]
+ * Fixed some memory issues in script loading and the plugin loading
+ mechanism. [Skotlex]
+ * Fixed magic attacks always doing minimum damage. [Skotlex]
+ * Fixed the crash in battle_check_attackable [Skotlex]
+ * Fixed Fireball hitting twice on the targetted mob. [Skotlex]
+ * Updated Recall Guild to work in gvg maps even if the nowarp flag is set.
+ [Skotlex]
+ * Updated Recall Partner to warp partner after 20 secs the thing is on the
+ ground, skill is blocked from reusage during that time. [Skotlex]
+ * Some updates to correctly decide whether skills hit cloaking and/or
+ hidden chars. [Skotlex]
+ * Updated skill code so that heaven's drive will hit and destroy traps
+ (untested), also AoE skills will not trigger on hidden characters. [Skotlex]
+ * Fixed the crash on magic rod. [Skotlex]
+ * Updated Maximize Power and Cloaking to last forever (until reuse, I
+ believe) for non-players. [Skotlex]
+ * Made Berserk end when you logout. [Skotlex]
+ * Made song/dances end when you unequip your weapon rather than on equip.
+ [Skotlex]
+ * Fixed one bug in battle_calc_magic attack and some cleaning of it as
+ well. [Skotlex]
+ * Updated sql-files/mob_db.sql to match the latest mob_db.txt [Skotlex]
+ * Updated sql-files/item_db.sql to match the latest item_db.txt. [Skotlex]
+ * Fixed stealing. Now it works like aegis one. [Lupus]
+2005/10/12
+ * Fixed everyone gaining high speed after casting a ground-based skill.
+ [Skotlex]
+ * Corrected the magical part of Soul Breaker ignoring mdef. [Skotlex]
+ * Updated Reverse Orcish to use the duration specified for the skill in
+ skill_cast_db.txt [Skotlex]
+ * Modified REVERSEORCISH to make it a status change (SC_ORCISH), since
+ there's no data about duration, defense, or if any stat reduces it's
+ duration, it currently is fixed to 5 minutes. [Skotlex]
+ * Fixed crash when sending the insert card packet with an invalid index. [Skotlex]
+ * Added script constant baseClass. [Skotlex]
+ - Example: if (baseClass == Job_Novice) will match on all novices and super
+ novices. if (baseClass == Job_Swordman) will match on all Swordmen, Knights
+ and Crusaders. Once tested several item scripts can be simplified in the
+ item_db.
+ - In contrast, the already defined baseJob works by stripping the upper
+ kind only. (eg: baseJob == Job_Swordman matches on swordman classes, but
+ not Crusader/Knight)
+ - I know the names can be confusing, but anyone has a better suggestion for
+ a name?
+ * Added a fix to prevent people from buying equipment in stackable from by
+ hexing the packets and specifying an amount greater than 1. [Skotlex]
+ - Thanks to End of Exam for pointing out the exploit.
+ * Added flag "move delay" to skill_castnodex_db.txt [Skotlex]
+ - By setting this flag to 1, players won't be able to move during the skill
+ delay time. Some reorganization was needed in skill.c to make room for
+ this, so some testing is required.
+ * Fixed the Char SQL server unnecessarily loading AND saving parties each
+ time a party-member changed maps. [Skotlex]
+ * Modified skill_min_damage so that it defines the minimum damage for
+ skills IF the skill does not misses/is blocked. Can be used to specify
+ to any of weapon attacks, magic attacks, or misc attacks. Defaults to 6
+ (magic + misc attacks) as that is what was set up previously. [Skotlex]
+ * Fixed Wand of Hermod and a potential crash related to ground based
+ skills. [Skotlex]
+ * Probably corrected npc load count when using reloadscript. [Skotlex]
+ * Likely fixed petheal [Skotlex]
+ * Fixed PVP client crash bug. By a new cadidate into eA coders LuzZza [Lupus]
+ * Updated maps comments, thanks to Justin84 [Lupus]
+2005/10/11
+ * Fixed not being able to cast resurrection on dead players. [Skotlex]
+ * Fixed party HP update crash. [Skotlex]
+ * Fixed players being killed always in one hit. [Skotlex]
+ * Fixed chars not being able to unhide. [Skotlex]
+ * Rewrote/optimized the hp updating code (both party hp and disp_hpmeter),
+ this should lower bandwidth a bit from all the unnecessary packets that
+ were previously being sent. [Skotlex]
+ * Removed the mysterious 2.2% drop chance for all items when read from the
+ sql db. [Skotlex]
+ * Updated targeted skills and normal attacking to fail when targetting
+ hidden characters. [Skotlex]
+ * Merged reddozen and Draco's code regarding TK skills. [Skotlex]
+ * Added a function to allow guilds to delete alliances with nonexisting
+ guilds. [Skotlex]
+ * Corrected the weapon damage return in battle_weapon_attack, thanks to PeF
+ for pointing it out. [Skotlex]
+ * Added max_baby_parameter to define the max parameter for baby classes.
+ Also fixed some instances where the baby parameter restriction was not
+ being taken into account. [Skotlex]
+ * Fixed Firewall doing knockback on the undead. [Skotlex]
+ * Fixed Waterball count when casted by non-players, thanks to Orn [Skotlex]
+ * Fixed the instrument/whips gender restriction being applied to Cap. [Skotlex]
+ * Damn typo: Fixed Mobs Drops with the same % droprate. thanx 2rover 4bugreport [Lupus]
+ * Fixed SQL Mob DB reading(no drops issue, etc) thanx to yoanykim for pointing it out [Lupus]
+2005/10/10
+ * Probably fixed the peco-riding issue. [Skotlex]
+ * Fixed clif_clearchar_delay (cause of the ghost mobs from my tests). [Skotlex]
+ * Small fix on the mob ai (attacked_id was never being reset if the
+ attacker no longer exists). [Skotlex]
+ * Added a couple of checks to prevent the mob_ai from executing if the mob
+ is dead. [Skotlex]
+ * Fixed a typo in skill_attack which causes all sort of unpredictable
+ behaviour, such as firewall never hitting. [Skotlex]
+ * Fixed a memory leak involving pets and cast cancel. [Skotlex]
+ * Made Wand of Hermod end when the caster is moved for whatever reason. [Skotlex]
+ * Increased the random damage delay modifier to +/-15% [Skotlex]
+ * Fixed "rare drop filter" considering "available in shops only items" as RARE items [Lupus]
+ * The GM can drop level now also determines whether a GM can store items in
+ the Guild Storage or not. Thanks to Kayla for pointing it out :P [Skotlex]
+ * Fixed Grimtooth so that it's slowdown works on both players and mobs.
+ [Skotlex]
+ * Fixed Fireball's damage. [Skotlex]
+ * Now the Wedding Dress and Tuxedo will always check for the correct
+ gender. [Skotlex]
+ * Cleaned up the code for Potion Pitcher. [Skotlex]
+ * Reverted Falcon Assault to be 5x Blitz Beat's damage at level 5. [Skotlex]
+ * The npc_counter is now reset in a @reloadscript. [Skotlex]
+ * Cleaned up Falcon Assault and made it's %dmg increase be an addition on
+ top of Blitz Beat (altough I am not so sure that's right) [Skotlex]
+ * Hardcoded the gender restrictions for items with view 13 & 14 (Musical
+ Instruments and Whips), changed ignore_item_genders to yes as default. [Skotlex]
+ * Changed GX duration to 900ms. [Skotlex]
+ * Cleared up the item get times descriptions in battle_athena.conf [Skotlex]
+ * Some timer fixes in status_change_start regarding sc_data loading. [Skotlex]
+2005/10/09
+ * Probably fixed Waterball so it does max number of hits when casted by a
+ non-player regardless of water availability. [Skotlex]
+ * Fixed perfect hiding. [Skotlex]
+ * Corrected magic damage return to only work on targetted skills [Skotlex]
+ * Some cleaning up of the skill_attack function. [Skotlex]
+ * At last finished 2 last logs filters options: [Lupus]
+ - Implemented 'Rare' items option (you can set rare_items_log value)
+ - Implemented 'Big amount' of items option (it would always log big set amount of items (per 1 action!) despite on the other filter option)
+ * Updated @iteminfo ATcommand. It would show you additional item info. [Lupus]
+ - Monsters drop this item with ?.?% chance
+ - Monsters don't drop this item
+ - This item is available in the shops only
+ - Tip: When you Trade/Vend goods, use @iteminfo to check items price and even rareness ^_-
+ * Rearranged item_data struct units to make it compatible with some old script commands after Skotlex's changes
+ - Tip: Now you can use GetItemInfo script command to find out if the item is rare or not
+2005/10/08
+ * Some improvements to the mob ai. [Skotlex]
+ * Fixed summoned marine spheres exploding on their own. [Skotlex]
+ * Probably fixed the attribute fix for magical attacks. [Skotlex]
+ * Made the gender check to not be ignored by default [Skotlex]
+ - This is necessary because the new job ID system makes both Dancer and
+ Bard be treated as the same job, so all bard/dancer comparisons were
+ changed to be gender comparisons, thus, the gender check is indispensable
+ for their weapons.
+ * Updated item_db structure. new column upper (after equip_jobs) defines
+ the type of job that can equip the item (1: Normal jobs, 2: Upper jobs,
+ 4: Baby jobs), merged the use_script and equip_script columns into one.
+ Also the equip_jobs column now has support for the following classes:
+ Taekwon (2^24), Star Gladiator (2^25) and Soul Linker (2^26)
+ The provided db/item_db.txt and sql-files/item_db,sql are already updated
+ with all the necessary changes (all equipable/usable items have their
+ upper set to 7)..
+ - Lupus, Nexus, get working on updating the item_db.
+ * Made FrostJoke/Scream work the same way out and inside woe grounds.
+ [Skotlex]
+ * Corrected Grand Cross Damage [Skotlex]
+2005/10/07
+ * Took out Lighthalzen's noteleport mapflag. Added it by accident. [Nexon]
+ * Some commented code cleanup and help.txt update [Foruken]
+ * Applied Draco's fixes to battle_calc_magic_attack. [Skotlex]
+ * Modified @showexp and @showdelay so they will work as people would expect
+ them to. [Skotlex]
+ * Figured out what ## variables are, and documented it on
+ doc/script_commands.txt [Skotlex]
+ * Foruken pointed out that the actual script problem was a certain
+ acalloc() that was changed to realloc(), so undid the last revert and
+ reverted this one instead. [Skotlex]
+ * Fixed a char-sql issue where character variables seemed to be saving
+ incorrectly. [Skotlex]
+ * Removed a free() that was added on R3421 that was supposed to fix a
+ memory leak but instead causes crashes :/ (so the memory leak is back in
+ there, but no more crash) [Skotlex]
+ * Applied End of Exam's script engine patch. [Skotlex]
+ - This adds support for nested blocks, if/else, fors, switches. See
+ <http://eathena.deltaanime.net/board/index.php?showtopic=50037>
+ for more information. Note that he admits it is not fully tested, so be
+ careful when trying out the new commands!
+2005/10/06
+ * Some corrections to the script engine, should fix a few memory leaks.
+ [Skotlex]
+ * Minor corrections to the screen output of the char_sql server when
+ saving. [Skotlex]
+ * Corrected authorisation issues in msg_athena.conf [Skotlex]
+ * Updated Wand of Hermod [Skotlex]
+ - Can't amp out of it.
+ - Affects everyone
+ - Only prevents people from casting supportive skills.
+ * Fixed mobs not doing their "rude-attacked" skill. [Skotlex]
+ * Corrected casters being able to walk during Wand of Hermod [Skotlex]
+ * Made Guild Recall be usable outside of WoE. [Skotlex]
+ * Changed the default gvg_traps_target_all to yes. [Skotlex]
+ * Changed the default for copyskill_restrict to 2 (cannot copy advanced
+ skills) [Skotlex]
+ * Added a bunch of code related to the 2nd job quest skills and Tae -second
+ classes skills, as provided by Draco and acquired from jA [Skotlex]
+ * Merged Draco's implementation of battle_calc_magic_attack. [Skotlex]
+ * Modifications to the mob AI to more accurately use Range2 (mob's sight
+ range) and Range3 (mob's chase distance ability) [Skotlex]
+ * Cleaned up item_db.txt, updated sql-files/item_db.sql to match. [Skotlex]
+ * Added logarithmic drops support for TXT itemdb loading (how could I had
+ forgotten that?) [Skotlex]
+ * Added battle options item_rate_treasure, item_drop_treasure_min,
+ item_drop_treasure_max, these override all other rate options when it comes
+ to Treasure box drops. [Skotlex]
+ * Cleaned up battle_athena.conf regarding drop rates. mvp_item_rate has
+ been changed to item_rate_mvp. [Skotlex]
+ * Implemented Maya Purple card effect (you can see any hidden mob). Thanks to jA [Lupus]
+ * Updated functions: pc_calc_base_job,pc_calc_base_job2 [Lupus]
+ - They return 24:Taekwon, 25:StarGladiator, 27:Soul Linker
+ Now someone should UPDATE Job fields of item_db.txt for TK,SL,SG classes
+ then I'll remove ugly hardcoded "temp plug" from pc_isequip function
+ [Item_DB JOB field note]: We don't check Knight2,Crusader2,Star Gladiator2 bits,
+ so don't set them.
+ In other words we use only these bits:
+ 0-Novice,1-Swordman,2,3,4,5,6-Thief
+ 7-Knight,8,9,10,11,12-Assassin,14-Crusader,15,16,17,18,19,20-Dancer
+ 23-Super Novice
+ 24-TK,25-SG,27-SL
+ Don't ever use other bits e.g. for Advanced classes. It's useless
+ * Added Poring Box logs (into dead branch logs)
+2005/10/05
+ * Updated nomemo and noteleports for Lighthalzen/Einbroch/Einbech maps and others. [Nexon]
+ * Fixed the mob AI. [Skotlex]
+ * Updated alchemist_summon_reward [Skotlex]
+ - Summons now never give exp, and they may drop items according to setting:
+ 0: Never drop items
+ 1: Only Marine spheres drop items (default)
+ 2: All summons drop items.
+ (maybe a different battle option can be made to make summons give exp?)
+ * Simplified the Grand Cross code. [Skotlex]
+ It is now entirely a magical attack with extra damage of the form base
+ atk * skill% - armor def% - vit def. Note that weapon properties won't
+ apply now as well as many of the offensive cards (those that do not apply
+ to both magic and weapon attacks, that is), and the def penalty from
+ having many mobs targeted on one is not applying neither (so the full
+ def is being taken into consideration). Report any corrections further
+ needed.
+ * Cleaned up, organized and improved somewhat the mob ai code. [Skotlex]
+ (update and test at your own risk as I can't test it currently)
+ * Some corrections to the way the guild master's name is updated during a
+ gm change. [Skotlex]
+ * Added a check to avoid saving negative durations for status changes. [Skotlex]
+ * Added a check to avoid loading status changes with negative durations
+ (the walk freeze problems seem related to timers and sc_data loading, so I
+ am shooting in the dark here at possible problem sources) [Skotlex]
+ * Various cleanups to ensemble related code, Longing For Freedom may be
+ working now. [Skotlex]
+ * Added the water levels to ayo_dun01, gon_dun01 and lhz_dun03, thanks to
+ Master of Muppets [Skotlex]
+ * Made Autocounter trigger autospells (was not doing so because it's NK
+ defines it as a no-damage skill) [Skotlex]
+ * Some cleanups on the mob slave AI code. [Skotlex]
+ * Added battle config retaliate_to_master, defaults to yes. [Skotlex]
+ - Why? Because in official, summoned mobs are not attacked by other mobs
+ (speaking about alchemists), if you set this to no, then mobs will
+ retaliate against the summon (both @summon and alchemist ones).
+ * Some fixes to the way the guildmaster flag is being set and checked. [Skotlex]
+ * Made the skilllv be 1 if the client sends less than that (this is why
+ active guild skills were not working. For some reason the client was
+ sending a request to do the skill at level 0!) [Skotlex]
+2005/10/04
+ * Likely fixed Aeterna + Soul Breaker/Destroyer. [Skotlex]
+ * Some cleaning of the mob ai. May help with some of the current exploits.
+ [Skotlex]
+ * Corrected Mob_ai code to make supportive mobs properly gang up on
+ summons. [Skotlex]
+ * Moved the plagiarize code to execute it before dealing damage (because on
+ WoE you are auto-restored when you get killed, hence the player was 'alive'
+ and it would copy the skill when killed by it on WoE) [Skotlex]
+ * Fixed Classical Pluck blocking AoE spells. [Skotlex]
+ * Updated Spider Web code to not retrigger if already trapped by one
+ (needed because spider webs can now stack) [Skotlex]
+2005/10/03
+ * Fixed a mistake with my last fix. [Kevin]
+ * Fixed often occurring memory leak in clif.c. [Kevin]
+ * Made NPC_DARKCROSS work (it's just a copy of Holy Cross with dark
+ attribute) [Skotlex]
+ * Removed resetting the manner when a player is saved. [Skotlex]
+ * Cleaned up map reading code to make it remove maps that could not be
+ loaded. It prevents crashes related to maps that weren't correctly loaded
+ on startup. [Skotlex]
+ * Fixed Endure to make it add armor mdef. [Skotlex]
+ * Small fixes to updating the guild master's name during a guild master
+ change. [Skotlex]
+ * Some corrections to the mob ai to enable mobs to attack other mobs
+ (summoned ones, of course) [Skotlex]
+ * Updated autotrading so that the char will close the shop and quit the map
+ server automatically when there's nothing left to vend. [Skotlex]
+ * Added checks to prevent a char from joining/creating multiple chat rooms
+ (anti-crash fix, it is). [Skotlex]
+ * Cleaned up and restructured the mob item drop code. It also fixes a
+ possible crash during the autoloot check. [Skotlex]
+ * Reupdated Wind Walk to add +5% flee bonus... AGAIN. [Skotlex]
+2005/10/02
+ * Fixed STEAL issue. [Lupus]
+ - Any Mob has 10 drop slots. If we pick an empty one, then we check previous slot, until we find a slot with an item.
+ Then we apply STEAL FORMULA for the item. (During the tests I managed to steal 2 poring cards 8)
+ If a mod doesn't have any slots then STEAL fails.
+ - Possible exploit: If a mob (e.g. NEW MOBS) has only one rare drop, then STEAL would always try to steal that the only slot 8)
+ How to fix: I suggest to fill other empty slots with Jellopies or Apples with zero chance.
+2005/10/01
+ * Expanded NPC shop log info of sold items (cards, refine, etc) [Lupus]
+ * Fixed compile errors in converters [celest]
+ * Updating built-in zlib to 1.2.3 [celest]
+ * Added unzip functions to grfio.c [celest]
+ * Finished Fusion AF2 maps support - just put the .af2 files in the
+ afm folder and start the map server as usual [celest]
+ NOTE: It will need a new unzip library, so do 'make clean', or delete
+ 'Makefile.cache' before recompiling!
+
+2005/09/30
+ * Updated the slave warp code. Now when a master recalls their slaves,
+ these will be placed 'randomly' around the master in an area_size/2 range.
+ [Skotlex]
+ * Cleaned up the mob link (supportive mode) code to prevent wasting time
+ trying to link friends every 100ms. Now the interval for linking friends is
+ MOB_MINLINKTIME (1 sec currently) [Skotlex]
+ * Updated mob code so when a mob hits another, they set their 'attacked id'
+ to the mob in question, and not the mob's master. [Skotlex]
+ * Some cleaning up of the Taekwon stance skills. Added a attack delay when
+ they trigger (same way as triple attack delays your continous attack) [Skotlex]
+ * Modified the range check in skill_use_id/skill_use_pos so that if you try
+ to use a skill while moving, it will change your path to move one cell towards the
+ target before casting (as long as you are within one tile of being in
+ range). [Skotlex]
+ * Moved the bleeding reduction formula to status_change_start, modified the
+ formula to be (lv/5+vit)% reduction. [Skotlex]
+ * Fixed the blind duration reduction formula. [Skotlex]
+ * Upgraded Meteor Assault so you can specify the duration of
+ blind/stun/bleeding independently in skill_cast_db.txt [Skotlex]
+ * Made TK_JUMPKICK share the same code as Ashura Strike (just to see what
+ happens, both seem like they behave the same way, no?) [Skotlex]
+2005/09/29
+ * Some tweaks and fixes around status.c, may fix the timer mismatches of
+ status_change_timer. [Skotlex]
+ * Fixed a memory leak regarding pet status recovery scripts. [Skotlex]
+ * Added timestamp support. Set timestamp_format to whatever you want, and
+ it will print a timestamp in said format before every Show* message. They
+ can be set independently for each server (defined at login_athena.conf,
+ char_athena.conf and map_athena.conf). Default is using no timestamps. [Skotlex]
+ * Modified the new auth login system to take into consideration when the
+ client tries to connect before the character data arrives from the char
+ server. [Skotlex]
+ (seems to work well, but could use more testing)
+ * Corrected the description of the 'skill_add_range' switches and made them
+ default to 5. Still pending further tuning (the official value of these
+ switches should have is still unknown) [Skotlex]
+ * Added Demonstration to list of skills affected by
+ 'gvg_traps_target_all' [Skotlex]
+ * Likely fixed Firepillar triggering multiple times when many characters
+ step unto it. [Skotlex]
+ * Increased the damage delay randomizer to be +/-10% rather than +/-5%, may
+ fix 'stun-lock'. [Skotlex]
+ * Added Consumable items log into pick_log [Lupus]
+ - You can see logs when someone uses items (boxes, potions, etc)
+ * Added AtCommands/CharCommands items deletion/creation log into pick_log [Lupus]
+ * Removed some of the unnecessary verbose messages from the char server
+ during data saving. [Skotlex]
+ * Added the new "online check" system (more of a fixing of a system that
+ was already there but was half working) [Skotlex]
+ it is turned on/off by using the online_check config options for the
+ login and char servers.
+ - char server: When the check is on, players are kicked out of the char
+ server when their character is already online, and the map servers are
+ instructed to kick the account out as well. If there's no reply from the
+ map servers, the char is automatically set offline after 15 secs.
+ - login server: When the check is on, players get "rejected from server"
+ when the account is online already, and afterwards the char servers are
+ told to kick that account out (like in the first case), if after 30 secs
+ there is no reply from the char servers logging off the account, the login
+ server sets it offline on it's own.
+ - The checks are by default on as they are meant to prevent possible
+ exploits on multi-map servers.
+ - However, I have not figured out where exactly a char server gets to know
+ that a player has changed map-servers, so this could cause trouble in said
+ enviroments until I figure it out (it won't go out of sync forever since
+ the map servers do update their list of online characters every then
+ seconds) :/
+ * Fixed crash, related to STEAL logs [Lupus]
+ * Added TXT logs for Pick_log [Lupus]
+2005/09/28
+ * Added 'scripts items operations' and 'vending' into pick_log: [Lupus]
+ Tested with refine, getitem, getnameditem, removecards, etc commands. They are all supported.
+ Now you can see if a player breaks his armor in NPC Cards Remover, etc.
+ You can track down any item within a single DB.
+ You can make a SQL query to find which items are most popular, which quests are most popular, etc
+ Of course, it could help you to find your local items exploits, cheaters and unfail admins ^_-
+ - Added 'Autolooted' and 'Stolen' items into pick_log
+ - TODO: Add TXT logs
+ * Fixed JobMaster NPC. Thanks Amada [Kayla]
+ * Removed card-fix flag from Cart Termination. [Skotlex]
+ * Updated battle_check_target so that a mob will consither another mob an
+ enemy if either one has special mob ai (is a @summon or summoned alchemist
+ mob). Summons from the same master should not be attacking each other,
+ however I do think they will attack summons from another player. [Skotlex]
+ * Removed 10 chances to pick an item from STEAL skill (it should have only 1 chance) [Lupus]
+2005/09/27
+ * Corrected again Wind Walk. Just +5 flee at lv10, walk bonus does not
+ stacks with other speed giving skills. [Skotlex]
+ * Corrected Wind Walk's walk and flee bonus (walk was a +4*skill_lv%
+ increase! and flee was +5 flee, rather than +5% flee of your total).
+ [Skotlex]
+ * Added atcommand @changeleader, transfers the leadership of a party to
+ someone else. [Skotlex]
+ (defaults as a GM-level 10 command, not quite yet tested)
+ * Added delitem2 script command with script sample by Mihilion [Lupus]
+ * Removed the check that prevented chars from logging out during status
+ changes, as the current system should save and restore these correctly.
+ [Skotlex]
+2005/09/26
+ * Fixed MAX GUILD capasity in mmo.h to allow correct +6 Guild Extension [Lupus]
+ * Changed back the TIMER_MIN_INTERVAL to 50. Who changed it back to 25?
+ (svn3015 skotlex: Changed TIMER_MIN_INTERVAL to 25 (from 10), it probably needs to be bumped even higher, awaiting results from testers to see if a higher value would be needed.
+ svn1284 lupus: timers optimization / speed up / bug fix : no freezing mobs [TIMER_MIN_INTERVAL: 50->10])
+ (note to self: make this a setting in inter_athena.conf) [Skotlex]
+ * Guild Extension now adds 6 per level. [Skotlex]
+ * Added define ENABLE_SC_SAVING in common/mmo.h, comment/remove this line
+ to disable saving of status changes (temporary measure) [Skotlex]
+ * Updated Double Casting to only work on Firebolt, Coldbolt and
+ Thunderbolt. [Skotlex]
+ * Fixed cloaking/hiding. [Skotlex]
+ * Updates to status_change_start, scdata loading now should display on the
+ targetted player. [Skotlex]
+ * Removed card modifiers from Meteor Assault. [Skotlex]
+ * Corrected skill_out_range_consume so that spells effectively fail if the
+ target goes out of range. [Skotlex]
+ * Another another check on the new auth system which may help prevent
+ exploits. [Skotlex]
+ * General cleanup and code improvements needed because of the new auth
+ system. [Skotlex]
+ * Fixed a bug in the new auth system (TXT) which was causing the gender to
+ be pretty much randomly sent. [Skotlex]
+ * Fixed a bug in changesex at the TXT char server level. [Skotlex]
+ * Updated new logging system. Now logs TRADE, NPC Shops [Lupus]
+ * Fixed a possible exploit in the new auth system. Thanks to End of Exam
+ for the information. [Skotlex]
+ * Corrected True Sight critical bonus. [Skotlex]
+ * Water Ball will now do the full number of hits regardless of available
+ water when used by non-players. [Skotlex]
+ * Changed the emoticon delay to 1 second. [Skotlex]
+ * Zeny/item kill bonuses now work on all skills, and not just physical
+ weapon attacks. [Skotlex]
+ * Added official Ayothaya Town script by MasterOfMuppets [Lupus]
+ * Added new Players / Monster Drops / Pickups Logging system [Lupus]
+ - Changed new log table, now it has field 'type':
+ M = Monsters Drop, P = Players Drop/Take, L = Mobs Loot Drop/Take, T = Players Trade Give/Take,
+ V = Players Vending Sell/Take, S = Shop Sell/Take, N = NPC Give/Take
+ NOTE: 'looted drop' might has cards, refine, etc. 'common drop' has item w/o cards/refine
+ - Now you can see Players(cheaters) passing any items w/o trade
+ - Now MOBS+PLAYERS drops come in the same table (easy to query)
+ Poring -5 Apple
+ Zelgadis +5 Apple
+ - You can tell off monsters by their LOW id. < 2000~
+ - Negative value of AMOUNT shows that a mob, or a player has dropped that items amount
+ - Positive value of AMOUNT shows that a player has pickedup that items amount
+ - It works 5x faster than old DROPLOGS
+ - TXT logs don't work yet
+ - TODO: Add Autolooted & MVP items in the log, too.
+ - TODO: Add Mobs Looters DROP items in the log. (Now only attacked mobs log loot drops)
+ - TODO: Add Scripts/Vending logs
+
+2005/09/25
+ * Modified battle_weapon_delay so that additional status effects are
+ invoked even if the attack does no damage, as long as the attack connects
+ (that is, it is not a miss/lucky dodge) [Skotlex]
+2005/09/24
+ * Updated several mob stats for the Lighthalzen and later mobs from the
+ data provided by Viccious Pucca. [Skotlex]
+ * Updated sql-files/mob_db.sql to contain the most recent mob_db. [Skotlex]
+ * Added support for saving/loading status changes when characters log
+ in/out. [Skotlex]
+ - TXT users: the file used by default is scdata.txt, can be changed by
+ setting scdata_txt to something else in inter_athena.txt.
+ - SQL users the table used by default is sc_data, can be changed by setting
+ scdata_db to something else in inter_athena.txt. Use upgrade_svn3273.sql to
+ generate the new table.
+ - It is currently unknown the behaviour of restoring some status changes,
+ if any anomality shows up, do report.
+ - Currently, even thought the sc data is restored, the client does not
+ receives the packet telling them that the effect started (like Gloria, you
+ can see you have +30 luk, but the message is never there) nor the visual
+ effects are in neither. This is a side effect of starting the status
+ effects on a player before the client finished loading the maps and spawns
+ in the map. Will be fixed later.
+ * Some memory optimizations tothe new auth system. [Skotlex]
+ * Moved the charsave_method config to inter_athena.txt [Skotlex]
+ * Fixed Demonstration/Bomb getting 100% breaking chance on low skill break
+ rates [Skotlex]
+ * Fixed chars being able to cast skills while rooted if they didn't have at
+ least root lv1 [Skotlex]
+ * Removed Assert in pet_walk, use a less unstable debugging tool, causes
+ errors in remote shells. [Kevin]
+ * Fixed TXT char login with new auth system. [Kevin]
+ * Done: Adjustable players titles for @who, @who2, @who3 commands [Lupus]
+ - Check msg_athena.conf for new lines
+2005/09/23
+ * Software Caused Connection Abort errors will now cause said socket to be
+ removed inmediately from the listening list of sockets, this may help with
+ the lag issues that arise when said error occurs. [Skotlex]
+ * Fixed Demonstration having 100% breaking chance if you set skill breaking
+ chance to 0. [Skotlex]
+ * Swapped functions of @who and @who3 commands. Because it's a spoil [Lupus]
+ to show players locations. You may enable @who for your common players now.
+ there's a shortcut for @WHO: @W
+ * Started adding adjustable players titles for @who, etc commands [Lupus]
+ - e.g. Super Player, GM, GM+, etc
+2005/09/22
+ * Updated sql-files/item_db.sql to have the most current version. [Skotlex]
+ * Finished first part of new auth system, fully tested. Will reduce char->map
+ lag by whatever it is you are haveing. [Kevin]
+ * Added consideration of GrandDarkness in various code sections that were
+ only checking for Grand Cross [Skotlex]
+ * Deployed use of map_getallusers all over the map server where it makes
+ sense to include disconnected players. [Skotlex]
+ * Corrected map_getallusers to depend on the actual count of players in the
+ db rather than the variable users (prevents possible crashes if the two
+ differ) [Skotlex]
+ * Updated the player counting function so that it correctly accounts for
+ all players (including those not connected like in autotrade) [Skotlex]
+ * Characters will now automatically stand if Soul Drain is triggered while
+ sitting. [Skotlex]
+ * Set default option gvg_traps_target_all: no [Lupus]
+ - In kRO it used to be 'yes' some time ago but has been reverted back to 'no'
+2005/09/21
+ * Corrected an error in the way guild alliances were being counted, as
+ pointed out by Viccious Pucca. [Skotlex]
+ * Fixed and deployed map_getallusers() on atcommands @who, @who2, @who3.
+ [Skotlex]
+ - This function should enable the aforementioned commands to work even on
+ players who are in the server but are not connected (eg: autotrade
+ players). It is temporarily only deployed on the @who functions pending on
+ feedback (bug reports, anything) before going ahead and implementing it on
+ all relevant atcommand/charcommand/script functions.
+ * Replaced the trim() function with Furoken's implementation (it should
+ remove tabs, consecutive spaces and other such unwanted characters from a
+ char's name) [Skotlex]
+ * Updated doc/script_commands.txt to explain the upper parameter of the
+ function jobchange. [Skotlex]
+ * Corrected sql query errors when logging trades and vending. [Skotlex]
+ * Updated doc/script_commands.txt with the script commands I've modified
+ or added that are not yet described within. [Skotlex]
+ * Small fix to clif.c which corrects characters that can't log in again if
+ they log out when the char and map server are not connected. [Skotlex]
+ * Cleaned up all SQL error reporting. It now follows the same standard
+ everywhere, and is followed by a debug line which includes the file, line
+ number and contents of the attempted query which caused the error. [Skotlex]
+ * Corrected an sql logs error when selecting a character with special
+ characters (eg: single quotes) on it. [Skotlex]
+2005/09/20
+ * Changed Palm Strike's initial animation display. [Skotlex]
+ (it will show as a normal attack that misses instead of an skill, but at
+ least the animation delay is correct and the skill can be chained now)
+ * Adjusted Cart Revolution's damage to be based on the Cart's Max Weight
+ (instead of the hardcoded 8000w value) [Skotlex]
+ * Fixed a memory leak when pets cancel their casting. [Skotlex]
+2005/09/19
+ * Added error reporting an item in the item_db.txt file has insufficient
+ fields (rather than just crashing) [Skotlex]
+ * Updated the item_db to use the new race and element constants. [Skotlex]
+ * Fixed (I think) battle option muting_players. Defaulted it to yes. [Skotlex]
+ * Added timers for displaying guildmates position. [Skotlex]
+ - All the packet related code was already there by Valaris, so I wonder why
+ this wasn't finished before?
+ * Added battle_athena options max_def/over_def_bonus (read
+ battle_athena.conf for desc) [Skotlex]
+ * Added error reporting when the magreg file fails to be saved. [Skotlex]
+ * Made berserk castable during the no-regen period when it expires. [Skotlex]
+ * Fixed a query error on sql refine logging. [Skotlex]
+ * General checks to the script engine string management. Should fix a bunch
+ of memory leaks. [Skotlex]
+2005/09/18
+ * More updates to status change IDs [DracoRPG]
+ * Implemented TK_SEVENWIND, allowed simultaneous use of several stances, thanks to
+ reddozen for all the info about that [DracoRPG]
+ * Allowed to pickup/drop items while in Frenzy [DracoRPG]
+2005/09/17
+ * Added a check that should prevent fighting against other guilds outside
+ of WoE times. [Skotlex]
+ * Hopefully fixed Hunter's Dectect skill. [Skotlex]
+ * Fixed the packet issues on the char txt server. [Skotlex]
+ * Miscellanous corrections to skill_attack. [Skotlex]
+ * Corrected the AutoSpellWhenHit rate of all items in the db (TXT + SQL)
+ [Skotlex]
+2005/09/16
+ * Reverted some of the contents of skill_unit_move_unit_group since the
+ previous algorithm was optimized. Walking during a Song/Dance should be
+ smooth again. [Skotlex]
+ * Rewrote the guild gm changing system. [Skotlex]
+ - @changegm works now (tested in SQL, TXT should also be working)
+ - Added script command "guildchangegm <guild id>,<new master's name>". Now
+ go write some Guild Master changing npc if you want it to cost money, have
+ a minimum guild level requirement, etc.
+ * Added Ishizu's logarithmic drops equation. [Skotlex]
+ (see battle_athena.conf for full details)
+ * Added a sub-function call to clear Castle owners when their guild is
+ broken. [Skotlex]
+ * Added a char-server call to clear the alliance when a guild is broken
+ (when a guild breaks, the alliance/opposition is removed from memory on the
+ map server, so it seems said change is not sent/saved on the char-server
+ side?) [Skotlex]
+ * Added script function sc_start4, starts an status change with all four
+ values. [Skotlex]
+ Use: sc_start4 TYPE, DURATION, VAL1, VAL2, VAL3, VAL4, <target ID>
+ * Added SC_ARMOR_ELEMENT/SC_DefEle, specifies elemental defense bonus
+ against two elements at a time. For example:
+ sc_start4 SC_DefEle, 60000, Ele_Fire, 20, Ele_Wind, -15;
+ Gives 20% additional fire resistance and reduces 15% Wind resistance for
+ 60 seconds.
+ * Expanded battle_attr_fix to consider the status changes of the involved
+ chars that affect elemental modifiers. [Skotlex]
+ * Fixed some status effects not being correctly ended/recalculated when you
+ stepped out of quagmire/song/dances. [Skotlex]
+ * Made quagmire be affected by the "gvg_traps_target_all" battle switch. [Skotlex]
+ * Added Bloody Branch log (along with Dead Branch) [Lupus]
+2005/09/15
+ * The skill Vending will now fail on GM characters who do not satisfy the
+ gm_can_drop level requirement. [Skotlex]
+ * Updated the sql-files mob_db.sql and item_db.sql files to the current
+ version (just feed'em to sql to have your item_db and mob_db tables
+ updated). [Skotlex]
+ * Now @allskill and it's ilk will give you ALL skills except the ones
+ marked as "npc skills" (those have an inf2 value of 2). [Skotlex]
+ * Some code optimization around song/dances, now the ensemble should be
+ cancelled if you walk (or are knocked out or whatever) out of it.
+ [Skotlex]
+ * Added log support to N slots. Now all cards should be logged [Skotlex]
+ - Note that I have not been able to test it yet, so report back any
+ problems caused by it.
+ * Fixed a memory leak when removing disconnected chars. [Skotlex]
+ * Re-enabled the Memory Manager by default. [Skotlex]
+ * Updated atcommand @rates so that it displays current exp rates in x form
+ (eg: "Current rates: Base 4.5x, Job 8.0x") as suggested by Mellowz.
+ [Skotlex]
+ * Corrected resetskill messing up with Wedding Skills. [Skotlex]
+ * Some adjustment to the status change defense (as per data provided by
+ Viccious Pucca) [Skotlex]
+ * VVVS weapons now give +50 damage instead of +40 (again thanks to
+ Viccious) [Skotlex]
+ * Success rate of making Star Crumbs now is 100% (regardless of skill
+ level?) [Skotlex]
+ * Couple of crash fixes on the map-server char saving method
+ (char_save_method: 1) [Skotlex]
+2005/09/14
+ * Yet another correction to SQL char saving. [Skotlex]
+ * Added support for N slots. [Skotlex]
+ - By changing the constant MAX_SLOTS in common/mmo.h, the server can be
+ configured to support items with more than 4 slots. Saving/Loading and
+ inserting of cards should be working correctly. Features still missing
+ are including the extra slots in the log functions and updating clif.c to
+ send the extra cards to the client (This is still work in progress).
+ - SQL Users interested in using this, need to manually add columns card4,
+ card5 and so on to the relevant tables (cart_inventory, guild_storage,
+ inventory, storage), example query:
+ ALTER TABLE inventory ADD COLUMN card4 int(11) NOT NULL default
+ '0' AFTER card3;
+ - TXT users need do nothing, the char server handles the
+ expanding/contracting of slots internally (if the number of slots is
+ shrinked, the additional slotted cards are lost)
+ - Never set the amount of slots to less than 4, as they are needed for
+ forged equipment.
+ * Likely fixed Lex Divina. [Skotlex]
+ * Likely fixed sql char-saving, too. [Skotlex]
+ * Lex Divina can now be casted on allies as long as they are silenced.
+ [Skotlex]
+ * Fixed crashes on GVG grounds involving characters with no guild. [Skotlex]
+ * Added a few socket features from Freya which hopefully will help
+ stabilize eA on Windows (testing needed!) [Skotlex]
+ * Miscellanous fixes and rewrites to memitemdata_to_sql, it'll probably
+ fixed the stackable named items duplication exploit. [Skotlex]
+ (note that it is not tested, so there's the chance I broke everything
+ instead, so upgrade for testing purposes only and report back!)
+ * Changed HP/SP drain rates so that the max (100%) is 1000. Adjusted item
+ db accordingly. [Skotlex]
+ * Disabled chars from muting themselves (as a temporary measure against the
+ mysterious "don't use bot!" message) [Skotlex]
+ * Added atcommand logging for /monster and /item (not quite tested yet, but
+ I think it'll work) [Skotlex]
+ * Changed autospell rates so that the max (100%) is 1000. Adjusted item
+ database accordingly. [Skotlex]
+ * Reverted displayed heal value. [Skotlex]
+2005/09/13
+ * Fixed Basilica [Skotlex]
+ * Rewrote the mechanics of how Devotion works. [Skotlex]
+ * Updated Heal so that it displays on-screen the actual amount that was
+ healed. [Skotlex]
+ * Changed the damage motion equation to 1/4th of what it was before (now
+ using player_damage_delay_rate: 100 is what was player_damage_delay_rate:
+ 25 in previous revisions) [Skotlex]
+ * The login servers will now notify when a player has an account ID under
+ 700000 (which won't let them connect to the map server) [Skotlex]
+ * Added support for SC_BLEEDING in skill_counter_additional_effect &
+ skill_additional_effect [Skotlex]
+ * Changed bonuses bAtkRate, bWeaponAtkRate and bCritRate to modify
+ base+watk damage, not just watk. [Skotlex]
+ * Corrected coma-effect killing bosses. [Skotlex]
+2005/09/12
+ * Party even share code won't try to give dead players their share of the
+ exp (since pc_gainexp would refuse so anyway) [Skotlex]
+ * Added trim() usage to char servers to prevent creation of characters with
+ spaces at the beginning or end of name. [Skotlex]
+ (the client won't let me create chars with said names so I can't really
+ test it, but on the very least valid names are not crashing it as far as
+ I can see)
+ * Expansion/optimization of the skill unit code. Now it should be correctly
+ identified when a character walks into a skill cell, walks out of a skill
+ cell, and walks out of the skill group (performance optimization,
+ client-side: songs and dance effects will work correctly, and Quagmire
+ won't spam "speed up/down" messages). [Skotlex]
+ - Got basic testing only (casting, amp/encore, walking, being knocked back,
+ warping), so report any problems found.
+ * Bomb/Demonstration should now be cast-able under the Emperium. [Skotlex]
+ * Acid Terror now knows ignores armor defense, but not vit defense. [Skotlex]
+ * Added an official Bards Job Quest (check npc\changelog.txt) [Lupus]
+2005/09/11
+ * Changed back the default of gx_all_hit to no. [Skotlex]
+ * Added check to prevent ensemble skills from changing position. [Skotlex]
+2005/09/10
+ * Removed the changing of targets for offensive songs in gvg grounds. [Skotlex]
+ * Corrected Grand Cross not always hitting 3 times. [Skotlex]
+ * Fixed the display of Auto Counter. [Skotlex]
+ * Added check to prevent auto-spells from being casted when the source and
+ target are the same (normally you can't hit yourself, though....) [Skotlex]
+ * Fixed Root [Skotlex]
+ * Fixed the issue which made mobs do nothing. [Skotlex]
+ * Change Provoke to affect armor def of mobs, and vit def of mobs/players. [Skotlex]
+ * Another change to autocounter, I think it will work now. [Skotlex]
+ * Fixed Defender's aspd bonus. [Skotlex]
+ * Fixed rooted character's root level (instead of using the caster's level) [Skotlex]
+ * Windows builds will now abort and exit when there's a "Software Caused
+ Connection Abort" error since it seems unrecoverable.. [Skotlex]
+ * Reverted back my char.c/sql char.c changes 8) Have to re-check [Lupus]
+ * Added official Louyang city (thanks to MasterOfMuppets), fixed some Kafra bugs [Lupus]
+ check npc/changelog.txt
+2005/09/09
+ * Fixed TXT/SQL char servers not reading properly their command line arguments [Lupus]
+ * Refixed those compiler errors >.< [Skotlex]
+ * Readded the damage delay to firewall. [Skotlex]
+ * Added an extra db (pc_db) to hold players, it should speed up map_id2sd
+ lookups. [Skotlex]
+ (note that all functions which do a search on all connected players do a
+ linear search on the connection sessions, and porting this to use the new
+ system will take a pretty annoyingly long time)
+ * Added checks to prevent dropped items from stacking (they can still
+ stack, but at max 2 items per cell). [Skotlex]
+ * Added Guild removing from memory upon guild break to Char SQL server
+ (TXT already had this correctly) [Skotlex]
+ * Changed Provoke to reduce armor defense, not vit defense. [Skotlex]
+ * Likely fixed the direction check in Auto Counter. [Skotlex]
+ * Removed the console functionality from socket.c (it was no good on the
+ map server since that session is used on disconnected players), also added
+ more checks to prevent parsing session 0. [Skotlex]
+ * Added check to prevent skills from triggering auto-skills of the same id
+ (prevents unlimited chain-reactions) [Skotlex]
+ * General fixes to guardian spawning code. [Skotlex]
+ (includes setting a timer so the Emperium gets it's guild data if not
+ available at spawn time).
+ * When the Emperium's guild is not found (in mob_spawn_sub, 5 secs after
+ trying to spawn it) the Castle will be reset back to no guild owning. [Skotlex]
+ * Fix to battle_check_target, should correct guardians/emperium [Skotlex]
+ * Guardians will now be deleted if their guild is not found in
+ mob_spawn_guardian_sub. [Skotlex]
+2005/09/08
+ * Added filter into chat log. Check log_athena.conf for more info [Lupus]
+ - Now you can turn off logs during WOE, etc
+ * Made Musical Strike/Slinging Arrow work while in ensembles. [Skotlex]
+ * Oops, fixed the compile error. [Skotlex]
+ * Various checks to prevent trying to send data to disconnected players in
+ clif_send [Skotlex]
+ * Moved the auto-spell code from weapon attacks to skill_additional_effect
+ and skill_counter_additional_effect. [Skotlex]
+ - The autospells will trigger for all skills/normal-attacks except those
+ with nk =1 (no damage skill) which is needed to prevent stuff like
+ heal, traps or dances from triggering it.
+ - Does not affect SC_HINDSIGHT triggered spells.
+ - NOT properly tested as of yet, report any abnormalities and skills it
+ should/should-not be working with.
+ * Fixed the crash when attempting to target a Emperium. [Skotlex]
+ * mob_spawn_guardian will now 'retry' to load the guild data five seconds
+ later if the guild info is not available at spawn time. [Skotlex]
+ * Fixed disconnected chars appearing as GMs on the console. [Skotlex]
+ * clif_send_sub won't try to send any data to disconnected chars now. [Skotlex]
+ (may fix possible buffer overflow crashes)
+2005/09/07
+ * According to the patch, enabled Butterfly wings in the Castles [Lupus]
+ * Adjusted MAX_GUILD constant according to Skotlex's changes [Lupus]
+ * Now when the castle owner guild id is loaded, and the guild is not in
+ memory, the map server will request it right away from the char server. [Skotlex]
+ * Corrected Guild Extension to be +4 to the max guildmates per level. [Skotlex]
+ * Changed the default max vending value to 1 Billion [Skotlex]
+ * Inverted meaning of pvp_noguild and pvp_noparty flags. the default then
+ for all maps where they are not set is: You can't attack parties/guildmates
+ on pvp maps. [Skotlex]
+ * Updated mapflag/pvp_noparty to mark only the gvg arenas. [Skotlex]
+ * Added mapflag/pvp_noguild, by default includes all pvp arenas. [Skotlex]
+ * Cleared up some of the warning messages on mob_spawn_guardian. [Skotlex]
+ * Fixed the compile error on skill.c... [Skotlex]
+ * Changed offensive song/dances target to BCT_ALL when invoked in pvp/gvg
+ grounds. [Skotlex]
+ * Added unit flags UF_NOMOB, UF_NOPC to give better control on who gets
+ affected by ground skills [Skotlex]
+ * Fixed the possible crash in map_foreachinpath. [Skotlex]
+ * Removed the error message in mob_guardian_changeguild when the new guild
+ has ID 0, the mob will just be removed instead. [Skotlex]
+2005/09/06
+ * Changed Assumptio to target all players around target. Mobs are no longer
+ affected. [Skotlex]
+ * Fixed battle_check_target fails on guild-mates in pvp maps. [Skotlex]
+ * Reverted battle_check_target to prevent floras from hitting themselves
+ until a better scheme can be thought of. [Skotlex]
+ * Reorganized battle_weapon_attack to allow counter/root from blocking
+ autotriggered skills (like TripleBlows/Sacrificial Ritual) [Skotlex]
+ * Fixed that crash on mob_spawn_guardian. [Skotlex]
+ * Added battle option gvg_traps_target_all, defaults to yes for now. [Skotlex]
+ * Added Zoc's fix to @autotrade (which made traders unable to login again..
+ ever) [Skotlex]
+ * Massive Guardian update. [Skotlex]
+ - Rewrote the guardian stat-passing system to minimize the need of db
+ lookups. Should greatly reduce the heavy lagging during WoE.
+ - Not properly tested (lack of resources), update at your own risk AND
+ PLEASE report any crashes/problems.
+2005/09/05
+ * Fixed Endure. [Skotlex]
+ * Fixed Harmonic Lick not adding status change resistant. [Skotlex]
+ * Moved ensemble stats calculating from status_change_start to
+ skill_unitsetting (performance purposes) [Skotlex]
+ * Fixed song/dance effects lasting 30 secs rather than 20. [Skotlex]
+ (still somewhat inefficient, needs better handling method)
+ * Battle check target fix: Novices/Low levels being unable to target mobs. [Skotlex]
+ * Temporarily made traps not target allies on gvg (Still up for dabate) [Skotlex]
+ * Battle check target update: Summoned creatures won't be checked versus
+ their master, means you should be able to target them as if they were
+ normal enemies. [Skotlex]
+ * Made Shield Chain long ranged (it has to be affected by pneuma/defender). [Skotlex]
+ * Fixed both trader/seller not being saved when using autotrade. [Skotlex]
+ * Added debug messages to figure out who is causing the rain of function
+ mismatches on deleting skill_timerskill. [Skotlex]
+2005/09/04
+ * Fixed Trade Bug (when Trade Window indication was wrong). Thanks to k3dt
+ * Now Water Ball isn't affected by RAIN mapflag anymore. Also corrected
+ caclulation of number of WB shots (was broken by a typo) [Lupus]
+ - Rain has been removed from kRO long ago.
+ * Now Safety Wall fails to protect against Acid Terror. [Skotlex]
+ * Added battle_config option firewall_hits_on_undead (defaults to 1) [Skotlex]
+ The deal is that each time the skill triggers on an undead, this number
+ of hits will be dealt instead of just one.
+ PROs: With a value of 5 or so, vertical firewall will work completely.
+ CONs: A high value means the whole tile can be wasted killing a single mob.
+ * Fixed working stealing with NOLOOT mapflag on. Thanks 2Lorky [Lupus]
+ * Now Knockback won't work when the target is already dead (prevents
+ ghosts) [Skotlex]
+ * BSS now targets every player in the area of effect (might be updated to
+ include mobs pending on further information) [Skotlex]
+ * Acid terror is now considered a ranged attack. [Skotlex]
+ * Crash fixes to the npc-whisper system. [Skotlex]
+ * Fixed classchange-able Emperium/Guardians/Treasure Boxes, thanks to alsimons [DracoRPG]
+ * Fixed songs/dances, updated Hip Shaker [DracoRPG]
+ * Fixed some fields in sql-files\main.sql... Who the hell added back `broken`? The field
+ `attribute` is the good one! Also changed `fame` type to the same as `zeny` (same max
+ value in the source code, so samemax value in the SQL saves !) [DracoRPG
+ * battle_check_target update: Fixed BCT_NOENEMY checks. [Skotlex]
+ * Moved Mental Sensing bonus from pc_gainexp to mob_damage, it is now a
+ status effect which the mob itself needs to be inflicted with to take
+ effect (and everyone involved in killing it will benefit) [Skotlex]
+ * Pets now won't move while casting (unless their master is like a screen
+ away or so) [Skotlex]
+2005/09/03
+ * Fixed speed calc for pushcart/stalk/dancing/singing. [Skotlex]
+ * Some crash-fixes introduced by the rewritten status system. [Skotlex]
+ * Adjusted the default gvg penalty values, added gvg_flee_penalty. [Skotlex]
+ * Fixed skill_blown causing a dangling pointer in the map data. [Skotlex]
+ (I believe this is the actual cause of all the crashes as of late)
+ * Fixed @autotrade venders not being saved after they sell an item. [Skotlex]
+ Now both characters are saved to prevent exploits, too.
+ * Fix to mob_setdelayspawn, if lucky might help with the crashes as of late. [Skotlex]
+ * Added status effect SC_WATK_ELEMENT, converts part of your weapon attacks
+ into a different element. Used in magnum break to give 10% fire damage
+ bonus to your attacks. [Skotlex]
+ * Made firewall hits not have any "damage delay", it merely knockbacks. [Skotlex]
+ * battle_check_target update: added novice/low-level pk prevention on
+ pk_mode [Skotlex]
+ * testing new SVN location [MouseJstr]
+2005/09/01
+ * Entirely rewrote status_calc_pc and status_get_[stat] functions to have a clear code.
+ They all use shared status_calc_[stat] functions to handle SC effects, this will avoid
+ to have 2 almost identical codes in different places for those effects [DracoRPG]
+ --> It compiles, it runs, it seems to work but I couldn't perform any extended testing
+ as always, feel free to report bugs ;)
+ * Added battle_option "slaves_inherit_speed" to decide whether slaves have
+ or not the same walk speed as their master. Defaults to yes. [Skotlex]
+ * Removed val4 from song/dances so that they won't be as bugged anymore.
+ (still pending on Draco's status update, but at least now stuff like Poem
+ of Bragi shouldn't cause insta-cast) [Skotlex]
+ * Changed the way song/dance status effects last. The first time you step
+ in a tile the status starts for 30 secs, not refreshed until it times out.
+ Not the way it really should be, but it's much better for performance
+ issues.
+ * Fixed summoned slaves having the same walk-speed as their master (fixes
+ metamorphosis-hatched mobs from having an egg's speed). [Skotlex]
+ * Added fix_timer_heap, should correct timer problems when the tick
+ overflows. Does it works? We'll find out in 48 days when the next
+ loop occurs. [Skotlex]
+ * Another update to battle_check_target [Skotlex]
+ (Should fix slave-skills hitting a slave's master)
+ * Corrected magic_damage_return code being double-invoked. [Skotlex]
+ * clif_GM_kick will now invoke map_quit if the player doesn't has a session [Skotlex]
+ (this should fix @kick and other such commands on autotrade chars and the
+ like)
+ * Fixed pc_damage/mob_damage returning 0 instead of damage dealt (which in
+ turn made all attack/skills not trigger their additional effects) [Skotlex]
+ * Updated Assumptio to target everyone instead of "not enemies" [Skotlex]
+ * Fixed a fatal dangling pointer in the mob_setdelayspawn when handling
+ mobs that don't respawn. [Skotlex]
+ * Updated WE_CALLPARENT to not check for range (as it should?) [Skotlex]
+ * Added flag accreg_dirty to identify when account variables have not been
+ saved yet, it'll retry then on every call to save the character (it will
+ prevent account variables from being lost when the char/map connection is
+ not established)
+2005/08/31
+ * Updated @npctalk to work as it should [Skotlex]
+ - Usage @npctalk NPC Name, Your Message Goes here
+ * Fixed Wind Walk's flee/speed bonus (as pointed out by Viccious Pucca). [Skotlex]
+ * Fixed a crash in pc.c when the last save point was not found (thanks to
+ Foruken) [Skotlex]
+ * Rewrote map_foreachinpath, it should work mostly right now. [Skotlex]
+ (the path 'stops' at the destination point rather than keep going
+ forward, but it can probably be fixed later)
+ * Moved battle_config spawndelay adjustments from mob.c (calculating it
+ each time they were killed) to npc.c (calculate it once during parsing).
+ [Skotlex]
+ * Synchronized additional status effects with the delayed damage [Skotlex]
+ (this should fix eg: enemies freezing when you start the attack
+ animation, and then breaking the ice when your attack animation finishes
+ and the damage shows up)
+ * Moved knockback to effect after damage is applied. [Skotlex]
+ * Fixed the Wedding Skills not displaying the actual amount healed. [Skotlex]
+ * Moved skill induced status effects to take effect before knock back. [Skotlex]
+ * Refixed "Don't Forget Me" [Skotlex]
+ * Changed 'pet_hair_style''s description and default value to 100 [Skotlex]
+ (100 is the value being reported to work with current clients)
+ * Fixed Freeze 'counter' not resetting when killed. [Skotlex]
+ * Fixed Endure adding to mdef2 instead of mdef. [Skotlex]
+08/30
+ * Fixed Breaker's magical part of the damage having element -1 [Skotlex]
+ (now it takes neutral element, because I don't think the magical part of
+ an attack can get the weapon's property)
+ * Fixed Magic Crasher having the min/max values inverted. [Skotlex]
+ * Updated "Don't Forget Me"/"Slow Grace" to last 20 secs after you step out
+ of the dance-zone. [Skotlex]
+ * Changed the default of defunit_noenemy to no, and added comments
+ explaining what it REALLY does. [Skotlex]
+ * Fixed perfect tableture's lucky dodge bonus. [Skotlex]
+ * Updated slave ai code to let slaves wander freely on the screen (will
+ wander as far as battle_config.view_area lets them) [Skotlex]
+ * Splitted Char-sql status saving into status/status2, the later is for
+ values that will seldomly change. [Skotlex]
+ * Updated servers so that when the player changes dye or hair color, the
+ char-server is notified and the guild_member data is updated on all map
+ servers. [Skotlex]
+ * Updated servers so they also report on sex change. [Skotlex]
+ (altough this one I have no tested yet)
+ * Changed bGetZenyNum/bAddZenyNum to be a bonus2 type [Skotlex]
+ (eg: bonus2 bGetZenyNum 10, 30 <- Receive 10z per mob level on 30% of
+ your weapon-based kills)
+ * Added script function groupranditem(i), returns a random item_id from the
+ specified item-group given. [Skotlex]
+ * Changed bLongAtkRate bonus to be more card-like (works just like
+ bLongAtkDef, except it's for attack) [Skotlex]
+ * [SQL] Added Storage Items sorting by nameid. On loading. [Lupus]
+ * Added GetItemInfo(Item ID,n) script function. Returns Buy/Sell Price, Def, etc [Lupus]
+ added sample/getiteminfo.txt Tested, fully working!
+ * Added ID#2258 Spiky Band(Sharp Headgear) to allowed equipment of Star Gladiator [Lupus]
+ * According to the 23 Aug Patch added complete equipment check for 3 new classes. [Lupus]
+ Now they can't equip forbidden items 8)
+08/29
+ * Added battle config option pet_hair_style and defaulted it to 24 [Skotlex]
+ According to information relayed by End of Exam, this should fix the new
+ clients showing the sword cursor for pets (older clients will be the ones
+ screwed instead, in said case you'll want to change pet_hair_style to 20)
+ * Updated battle_check_target to take into consideration the special states
+ killer/killable. [Skotlex]
+ * Corrected the Fury Guardian Angel not giving +50 critical. [Skotlex]
+ * Made mob_walktoxy fail when the mob is dead. [Skotlex]
+ (may fix the phantom mob issue?)
+ * Updated spawn parsing to identify small/big mobs. [Skotlex]
+ Use the "event" field (last column, the one after the two spawn delays)
+ to identify the mob's size: 2: small mob, 4: big mob. 1-2 is not used
+ because a hella lot of plants/mobs already use 1 in it (even though eA
+ completely ignores this value)
+ * Inverted the meaning of mapflags pvp_noparty/pvp_noguild [Skotlex]
+ When the flag is set, then you should NOT be able to hit your
+ party/guild-mates on pvp grounds.
+08/28
+ * Fixed demonstration/Bomb stacking. [Skotlex]
+ * Fixed damage versus plants in BF_WEAPON attacks. [Skotlex]
+ * Fixed the whole sqrtl mess. Thanks to Shinomori for clearing things up.
+ [Skotlex]
+ * Added new maps, thanks to Poki#3 [DracoRPG]
+ * Switched SCs between two taekwon kicks to get the proper icon ^^ [DracoRPG]
+ * Added the falling animation to TK_HIGHJUMP, but now the client doesn't refresh the
+ position u_u [DracoRPG]
+ * Reverted default option to allow anyone to plagiarize advanced skill (vicious or
+ someone else - I can't remember xD - told me it was like this on kRO, but not yet on
+ iRO) [DracoRPG]
+08/27
+ * Fixed the cast-bar from autocounter not disappearing after triggering the
+ skill. [Skotlex]
+ * Updated battle_check_target to make marine spheres universal enemies, so
+ anyone can attack them. [Skotlex]
+ * Cleaned up item_db.txt (format, commas, etc), added status bonuses to the
+ cooked foods. [Skotlex]
+ * Updated sql-files/item_db.sql to match with the current contents of
+ item_db.txt [Skotlex]
+ (sql users just feed it to mysql, it will drop and recreate the table)
+ * Fixed IDs for Taekwon-class : 4047 is Star Gladiator, 4048 is a second Star Gladiator
+ (probably used for a "Superman-mode" flying sprite) and 4049 is Soul Linker [DracoRPG]
+08/26
+ * Fixed being able to move during Encore skills when you did not need a
+ partner. [Skotlex]
+ * Fixed @reloadmobdb not properly erasing mob skills before re-reading. [Skotlex]
+ * Updated/fixed effect of most dances & songs according to kRO's website and ragnainfo's
+ very good Bard/Dancer Guide [DracoRPG]
+ * Fixed Raging Trifecta Blows missing Emperiums, thanks to happylight [DracoRPG]
+ * Changed the way short|long|magic_damage_return work : previously they gave 100% chance
+ to return x% damage, now it is x% chance to return 100% damage (Maya and High Orc Cards
+ should behave like this, I'm not sure for Orc Lord Card but it seems logical to be the
+ same system...) [DracoRPG]
+ * Fixed bonuses from Wind Walker, thanks to vicious_puca [DracoRPG]
+ * I also reorganized the hit/flee calc in status_calc_pc to consider first absolute values,
+ and then apply relative (percentage) modificators.. if you make a mix of both, it'll be
+ completely fucked up, and be sure it won't be like on officials (although my system maybe
+ isn't the good one neither...) [DracoRPG]
+ * Some rewrites to client version rejecting code [Skotlex]
+ Should eliminate lag when players try to log-on with a rejected client,
+ however there's the chance they won't be receiving the "your client is
+ not latest EXE version" message, and that's why the previous, laggy,
+ implementation was used :/
+ * Fixed Enchant Deadly Poison lasting forever after killed. [Skotlex]
+ * Fixed the duration argument of @summon [Skotlex]
+ * Now @summoned mobs will follow their master everywhere and that includes
+ warping from map to map. [Skotlex]
+ (why? Because I think that's neat, and will probably be needed anyway
+ once Homonculus get implemented)
+08/25
+ * Cleaned up mob_db.txt and updated sql-files/mob_db.sql [Skotlex]
+ Sql users can just feed mysql the .sql file and it will delete and refill
+ the table with the most updated db data.
+ * Corrections to damage versus plants. [Skotlex]
+ MAGIC and MISC attacks do 1 damage per hit.
+ WEAPON attacks do 1 damage, display miss if they hit multiple times.
+ * Instead of knocking back (which wasn't even working), characters that are
+ stepping on an icewall will cause that tile of the icewall to 'die' [Skotlex]
+ * Final damage equation update to Acid Demonstration. [Skotlex]
+ (it still won't ignore the raydric card, but why that is official in
+ itself is a big mystery)
+ * Added status change for temporary boosts of stats, plus added the
+ following constants (db/const.txt): [Skotlex]
+ - SC_IncAll, SC_IncStr, SC_IncAgi, SC_IncVit, SC_IncInt, SC_IncDex,
+ SC_IncDex
+ - It hasn't been tested yet what kind of visual these will cause
+ client-side.
+ (Now someone go and write down the script for the food items xP)
+ * Updated @summon to take a second parameter: duration. [Skotlex]
+ eg: "@summon lunatic 40" will summon a lunatic that lasts 40 mins or
+ until killed. Max duration is one hour.
+ * Updated Some Mobs Spawns, Drops check npc\changelog.txt [Lupus]
+ * Some toning down of the damage of Acid Demonstration (should /100, not
+ /10) [Skotlex]
+ * Likely fixed Blitzbeat from hitting neutral chars. [Skotlex]
+ * Updated Acid Demonstration to be a MISC skill who's damage is (base_Atk *
+ caster's int * target's vit /10) (half that on players). It's much more
+ closer to official values than the previous ones... [Skotlex]
+ * Corrected Pressure sapping SP even if you hide from it. [Skotlex]
+ (isn't Pressure a holy attack from the grand god himself? How can a thief
+ HIDE from his eyes? o.O)
+ * Updated Acid Demonstration damage formula. It's still wrong, but at least
+ it considers int and vit now. [Skotlex]
+ Current dummy formula: (100 + caster's int + target's vit)*(number of hits)%
+08/24
+ * Updated pet skills database. [Skotlex]
+ * Some corrections to socket.c, should stop all the recent crashing... [Skotlex]
+ * Added a case to knockback enemies if they somehow end up stepping into an
+ ice wall tile [Skotlex]
+ * Added checks to prevent walking, attacking or using skills while the
+ storage is open. [Skotlex]
+ * Added Lupus's mob skills for Einbroch mobs [Skotlex]
+ * (almost) rewrite of the storage system. [Skotlex]
+ Storages are marked dirty after an item is stored/retrieved from them and
+ will not be marked clean until the char-server acks the save request.
+ Upon map-server reconnection to the char, all storages that are currently
+ closed and dirty are saved.
+ * Synched chrif_save with the storage save functions when either one is
+ open to further prevent exploits. [Skotlex]
+ * Updated the mob_skill_db with Komurka's translation (Aegis -> eA) [Skotlex]
+ The max permilliage (rate) is now 10000 = 100%
+ * Various mob related summon/metamorphosis changes: [Skotlex]
+ - Summon Mob/Slave's level is the total number of mobs to summon, when the
+ skill definition offers multiple mobs, they are spawned in order
+ (round-robin scheme).
+ - Metamorphosis/Transformation level is the total number of mobs to
+ multiply into. Uses the same criteria as summon mob and the original mob
+ is deleted/killed (no loot drop). If the level is 1, then the mob transforms
+ into one of the defined classes randomly.
+ - Note that beyond code-proofreading and making sure it compiles, this
+ has not been tested yet!
+ * Added the bonus provided by the /doridori command to TK_HPTIME and TK_SPTIME. [Dralnu]
+ Thanks to Duduc.
+ * Updated battle_check_target to check using the master instead of the
+ slaves (applies for mobs/pets) [Skotlex]
+ - Should prevent slaves from attacking their master
+ * Implemented TK_HPTIME and TK_SPTIME exept the bonus provided by /doridori [Dralnu]
+ * Implemented delayed character logout [Skotlex]
+ How it works: When a player quits the server when they shouldn't (force
+ disconnect before the 10 secs, or leave when the char server is not
+ connected) his session is closed, but the player is left in-game just
+ like in @autotrade, and a timer is added. Every 10 secs it'll check if
+ the char server is online, and then save the character and delete it from
+ the map server. NOT TESTED YET, so report any anomalies.
+ * Fixed Shield Chain's skill-type (it's short ranged, not long?) [Skotlex]
+ * Fixed Decrease Agility's equation. [Skotlex]
+ * Fixed root'ed monks not being able to use root skills. [Skotlex]
+ * Added inter-server option "kick_on_disconnect" (defaults to yes) [Skotlex]
+ - The only people who may want to change it are overcrowded servers where
+ the char/map server link breaks due to overload and then everyone is
+ kicked out until said connection is reestablished.
+ - Of course, use at your own discretion until all possible exploits
+ caused by this are resolved.
+08/23
+ * Fixed provoke's success chance. [Skotlex]
+ * Battle_check_target update, should fix party/guild skills failing when
+ checking against yourself. [Skotlex]
+ * Updated map and char servers to allow them to reconnect without having to
+ kick out all players. [Skotlex]
+ - This is still experimental and what possible exploits may come from it
+ are yet unknown (however, considering that the reconnection should take
+ place in a few seconds after the disconnection...)
+ - Note that storage contents and player contents are all kept in the map
+ server's memory, unsaved data will be lost if player forces a
+ disconnection, storage changes will also be lost if they are open/closed
+ during said disconnection (and NOT reclosed after the connection is
+ restablished)
+ - These and more stuff might come up with time. Report away!
+ * Updated Gospel to not buff up Guildmates, only Party members. [Skotlex]
+ * Fixed @autotrade [Skotlex]
+ (tested on a limited scenario with few characters, needs more testing.
+ Test and report!)
+ * Implemented TK_STORMKICK, TK_DOWNKICK, TK_COUNTER and TK_TURNKICK. [Dralnu]
+ Note that at the moment if you use theses skills even if the corresponding
+ SC is inactive, it will use SP and will stop you if you are attacking.
+ Note too that because we don't know how it should work exactly, when a SC such as
+ SC_STORMKICK will be launched, it will notice you by a little message over your
+ head : Hit now !!. Finaly, TK_TURNKICK will not yet have the pushback effect.
+ * Fixed everyone having 20 flee... I hope. [Skotlex]
+ * Some corrections and updates to mob skill Metamorphosis [Skotlex]
+ (don't know if it'll work now, but the way it was before definitely was
+ not working)
+ * Probably fixed infinite endure wearing out when being hit. [Skotlex]
+ * Updated gvg range penalties to be as in official servers. [Skotlex]
+ - Skills (weapon/magic/misc) get a 40% penalty
+ - Ranged normal attacks get a 20% penalty, melee receives no penatly.
+ (battle flag gvg_weapon_attack_rate added to complete configuration)
+ * Added the -20 flee penalty on GVG grounds. [Skotlex]
+ * Fixed Enchant Deadly Poison's Damage (it was 500% - 5x at level 5, not 400%
+ - 4x) [Skotlex]
+ * Fixed Soul Breaker's magical part of the attack taking element -1 rather
+ than 0. [Skotlex]
+ * Login sql server will now only clear sstatus data of connected servers
+ rather than clean the table. [Skotlex]
+ * Added some checks to prevent infinite looping in the char servers. [Skotlex]
+ * Some updates to the way disconnections are handled in socket.c [Skotlex]
+08/22
+ * Fixed typo in skill.c causing errors [Codemaster]
+ * Added Irmin's recommendation to allow item names in getitenname() [Skotlex]
+ (kinda odd to use an item's name to get the item's name, isn't it?)
+ * Fixed Meteor Assault not displaying damage. [Skotlex]
+ * Fixed WE_CALLPARENT crashing the map server when either parent is
+ offline. [Skotlex]
+ * Added TK_HIGHJUMP. Note : To be able to see properly the full jump animation,
+ casting time will not depend on DEX. [Dralnu]
+ * Somes fixes in skill_db.txt and skill_cast_db.txt about Taekwon's skills. [Dralnu]
+ * Fully implemented the STR bonus part of TK_RUN [DracoRPG]
+ * Added activation/unactivation of TK stances, but not their specific effects [DracoRPG]
+ * Reverted magnum break, removed the Flame Launcher status change until
+ actual bonus can be implemented. [Skotlex]
+ * Skills update (mostly thanks to Vicious Pucca): [Skotlex]
+ - Success chance and stats of Provoke, mental Break, Signum Crusis, Soul Burn
+ - Decrease Agility duration halved for players.
+ - Magnum Break's final damage is splitted 80% weapon's element, 20% fire
+ element. No longer causes weapon endow.
+ - Bash's hit bonus (+5 per lv now)
+ * Fixed skill_db, Added perfect hit to TK_COUNTER [Dralnu]
+ * Changed skill_tree and job_db1 the same way I changed job_db2, it was necessary for
+ clear implementation of Taekwon (which has a very unusual ID for a 1st job) and renders
+ the code less messy (at least it's my humble opinion ^^) although it could be slightly,
+ but really slightly, more RAM-consuming [DracoRPG]
+ * Fixed classchange not clearing on unequip, fixed the mob's max hp not being updated on
+ class change [Skotlex]
+ * Basic implementation of Taekwon's kicks. [Dralnu]
+ * Likely fixed SP consumption of Warp Portal. [Skotlex]
+ * Changed some default values in battle config to get the 'official gaming experience' by
+ default [DracoRPG]
+ - Noone can plagiarize advanced skills (from ragnainfo)
+ - No rare drop announce
+ - Riding a Peco does not increase one's size
+ * Allowed Dispell to dispell songs/dances/ensembles [DracoRPG]
+ * Updated SC IDs to get correct client-side status icons (used 0808 Sakexe) [DracoRPG]
+ * Prevented from casting Ice Wall under self, independantly of UF_NOFOOTSET [DracoRPG]
+ * Removed /omg from equipment breaking and added it to Acid Terror only [DracoRPG]
+ * You can now change to Taekwon, but lots of things are still to do [DracoRPG]
+ * Began implementation of Taekwon skills [DracoRPG]
+08/21
+ * Changed how triple blows/sacrificial ritual triggers to enable
+ plagiarizing them. [Skotlex]
+ * Stolen items will be (un)identified using the same criteria normal drops
+ use. [Skotlex]
+ * Updated yet again battle_check_target. Guardians should stop attacking
+ out of woe now and alchemist should be able to hit their mines. [Skotlex]
+ * Fixed the map server going in an infinite loop if the connection breaks
+ while parsing packets from the char server. [Skotlex]
+ * Mostly rewrote Battle Chant, should be almost like the official one now... [DracoRPG]
+ * Added enums for skill units, makes the code really clearer (check skill.h) [DracoRPG]
+ * Merged battle_calc_weapon_attack_sub and battle_calc_weapon_attack [DracoRPG]
+ * Fixed Acid Terror WEP breaking rate thx2 ShAPoNe [Lupus]
+08/19
+ * More updates to battle_check_target, now you can't target any
+ ground-based skills that don't have a physical manifestation (ie:
+ Everything except traps and icewall) [Skotlex]
+ * Fixed "for sure" battle_check_target when it comes to neutral targets. [Skotlex]
+ * Removed pc_emotion, merged it with emotion. [Skotlex]
+ Usage: emotion emotion_number <, target>
+ - emotion number is the emotion's number (use e_* constants)
+ - target is 1-> player, 0-> npc. If ommited defaults to zero.
+ * Updated code so that when a guild master joins the game, their guild
+ skills are automatically blocked for 5 minutes. [Skotlex]
+ (prevents avoiding the skill-lock by relogging)
+ * Another update to battle_check_target, this time neutral targets should
+ work correctly (non allied/partied people who should be affected) [Skotlex]
+ * More fixes to battle_check_target, skills should not hit yourself on
+ pvp/gvg now. [Skotlex]
+ * Updated classchange to not change the class of bosses. [Skotlex]
+ * Optimization/Fixes to battle_check_target, GrandCross should work now. [Skotlex]
+ * Reverted Lupus's change on guild auras' max lv... Please double check your sources and
+ base yourself on kRO official website as much as possible, thanks. Link to kRO website:
+ http://guide.ragnarok.co.kr/GuildSystem.asp#ggg03 [DracoRPG]
+ * Fixed passive mobs incorrectly setting the attacked_id when hit by pets. [Skotlex]
+ * Rewrote battle_check_target. [Skotlex]
+ - Positive side-effects: offensive stuff won't hit your guildmates on gvg
+ (such as traps)
+ - Negative side-effects: Unknown, but there's bound to be some because of
+ the big change. I tested it with traps, spells, pets, passive and
+ aggressive mobs, but it's probable there's stuff I am still missing.
+ * Updated mob spawns of Glast Heim (gl_sew3 and gk_knt2) [Skotlex]
+ * Updated classchange code (Azoth, Heiroloist) to get random classes the
+ same way a dead branch does. Cannot convert to bosses. [Skotlex]
+ * Script/Npc/Item updates. [Skotlex]
+ * Bonus b(HP/SP)GainValue will always be considered 100% (the first
+ parameter) this is done to avoid exploits when combining it with
+ b(HP/SP)DrainValue (eg: Immaterial Sword) [Skotlex]
+ * Fixed max level of some guilds skills 5->1 [Lupus]
+ according to http://eathena.deltaanime.net/board/index.php?showtopic=757
+ * New items drops, new shop [Lupus]
+08/18
+ * Changed the way 'pl' works (in skill_db) : now 0 for 'weapon' attack skills means the
+ attack is always neutral. To make so that the skill takes the weapon's element, use -1
+ instead: this removes the need of hardcoded ele_flag. [DracoRPG]
+ * Fixed damage bonus from Sage's elemental flooring skills by moving the checks which were
+ totally wrong placed... Thanks to Antoine for pointing out they were broken. [DracoRPG]
+ * At the same time I had to change battle_calc_magic_attack quite alot. Maybe it won't work
+ perfectly, but at least it'll compile. Also added (forgotten?) support for 'skillatk'
+ bonus with magic skills. [DracoRPG]
+ * Rewritten most of Gloria Domini to make it be a BF_MISC skill that can hit and damage
+ Emperium and plants (yes it does), igonres WoE damage adjustments and other changes I
+ don't remember ^^ [DracoRPG]
+ * Modified mob_skilluse so that mobs NEVER use offensive heal. They'll now
+ /swt if they try it (and the skill fails) [Skotlex]
+ (there's still nothing that can be done about offensive Sanctuary)
+08/17
+ * Added script command pc_emotion, works just like emotion, except the
+ emotion is displayed on the character that's running the script. [Skotlex]
+ * Fixed the vicious compile error I added with SC_SPEEDUP1 [DracoRPG]
+ * Implemented Strengthen Guardians with a custom +10% ATK & ASPD / lv value [DracoRPG]
+ NOTE : It compiles, but I couldn't test the effect since guilds seem completely
+ broken on my test server...
+ * Moved Weaponry Research hidden bonus a bit to get the exact effect [DracoRPG]
+ * Implemented SC_SPEEDUP1 for Lightning Box effect [DracoRPG]
+ * Entirely replaced SC_DIVINA with SC_SILENCE (the 1st was an alias of the 2nd) [DracoRPG]
+ * Fixed the map-server disconnecting the char-server when kicking out all
+ clients. (Thanks to End of Exam for pointing it out) [Skotlex]
+ * Cleaned up error messages related to packet parsing in the char servers. [Skotlex]
+08/16
+ * Likely fixed the char-server crashes on mapif_send* functions. [Skotlex]
+ * Fixed auto-counter's display (it was working correctly, however the skill
+ was not being shown properly on the client) [Skotlex]
+ * Fixed Tomahawk not being considered a ranged attack. [Skotlex]
+08/15
+ * Added a few bug fix recommendations [Codemaster]
+ * Fixed a few problems with Wedding Skills [Codemaster]
+ * Fixed a bug with old clients connecting and socket reuse which would kick
+ all new connections on the same socket before even checking the packet version. [Skotlex]
+ * Fixed the tabs in the ayothaya mobs :X [Skotlex]
+ * Likely fixed the setsocketops error that was showing on every connection. [Skotlex]
+ * Updated vending code so that items that can't be traded can't be vended
+ either. [Skotlex]
+ * Messed with socket.c, changing lots of stuff around using some earlier
+ Freya SVN version as base, connection issues might hopefully get better. [Skotlex]
+ (NOTE: I have yet to try to compile this under Windows/Cygwin, so report
+ if it breaks)
+ * Updated Magnum Break: Target selectable, damage is (100+20*level)%, hit
+ bonus +10 per level. 5x5 splash area. [Skotlex]
+ * Likely fixed the max hp display of tiny/big mobs. [Skotlex]
+ * Updated Cloaking. It'll fail if the level is less than 3 and there's not
+ a wall nearby. [Skotlex]
+ If cloak_check is set to ignore walls, the wall-type speed will be used all
+ the time.
+ (I don't see what all the fuss is about as a Lv2 Cloak is just as good as
+ Hide, and you can't even use GrimTooth from it. And since lv2 won't let
+ you move anyway, why would anyone use Clock lv2 over Hiding?)
+ * Updated Assumptio. It will affect anyone in a 3x3 area around the target. [Skotlex]
+ (where anyone is anyone the same way Benedictio chooses it's target)
+ * Updated the delay that a mob can't move after attacking to be 1/4th of
+ the delay between attacks. [Skotlex]
+ eg: The mob attacks once every 1000ms, that means it can start chasing
+ you 250ms after an attack.
+ * Likely fixed the #fakename crash. [Skotlex]
+ * Updated the mob skill use code so that hopefully other players will be
+ considered friends when using support skills. [Skotlex]
+ NOTE: Not quite tested, use with care.
+ * Fixed @monsterbig/@monstersmall [Skotlex]
+ Support for said monster in normal spawn scripts is also fixed, however
+ the implementation is not stable (currently you add 10K to the ID to make
+ it a tiny mob, add 20K to make it a big mob, but those values depend on
+ MAX_MOB_DB which can change in the future. :/)
+ * When you drink a speed potion, the icon of the previous one will be
+ removed (however, all speed potions are still in effect server-side). [Skotlex]
+08/14
+ * Likely corrected the error printing in recv_to_fifo (reporting normal
+ disconnections when they likely are not). [Skotlex]
+ * Fixed the map-server spamming "Client does not has latest EXE message. [Skotlex]
+ * Updated char-sql to consider 0 an invalid map-server session number. [Skotlex]
+ * Fix in map->char auth request packet where char server spams data search error message, currently in testing. But works none the less. [Kevin]
+ * Removed all close()'s in clif.c, made clif_parse the only one who closes
+ a socket and deletes the session. [Skotlex]
+ * Updated socket.c to be much more verbose about connections and when they
+ are ended. [Skotlex]
+ (excuse all the extra messages, but they are to help track down the
+ current map-freeze bug)
+08/12
+ * Updated sql-files: mob_db.sql, item_db,sql, main.sql [Skotlex]
+ * Likely fixed mob reloading command. [Skotlex]
+ * Added more reports and some fixes/optimizations to socket.c [Skotlex]
+ * Added reporting of error when a connection can't be made non-blocking. [Skotlex]
+ * Updated Logging Filter: [Lupus]
+ - Implemented refine_items_log condition. You may log only certain refine value items.
+ - Added 'log_steal' option. It'd log stolen items in the drops log DB
+ * Added msg string and announce on stealing of rare items [Lupus]
+08/11
+ * Fixed bio-cannibalize's max hp issue. [Skotlex]
+ * Pneuma completely blocks Soul Breaker (as the forum consensus says it
+ does so) [Skotlex]
+ * clif_parse will now print the error message in case close(fd) fails. [Skotlex]
+ * Fixed players clicking on players disguised as NPCs trying to execute the
+ "npc". [Skotlex]
+ * Fixed possible overflows and exploits in log.c, thanks to Irmin [Skotlex]
+ * Probably fixed devotion's visual not updating. [Skotlex]
+ * Added flag pet_no_gvg, when set to yes/1 the pet is returned to an egg when
+ you enter Guild Grounds and you aren't allowed to hatch pets as well. Note
+ that it only does the check when the player changes maps (should be safe
+ because players are kicked out of castles when WoE starts)
+08/10
+ * Fixed PNEUMA blocking magic part of Soul Breaker, instead of physiacal attack one [Lupus]
+ * Fixed the Login/Char SQL crashing when determining the max id of empty
+ tables. [Skotlex]
+ Account and Char creation code tested, it is safe to use now.
+ * Removed use of settick_timer (fixes the "can't move!" bug) [Skotlex]
+ * Fixed (I think) being able to sit while casting. [Skotlex]
+ * Updated Char-SQL server to guarantee that new chars are created with
+ char_ids above 150K. [Skotlex]
+ (note from last update applies too)
+ * Updated Login-SQL server to guarantee that new accounts (_M/_F reg) are
+ created with account_ids above 2M. [Skotlex]
+ (note it hasn't been tested yet, but I think it should work)
+ * Fixed @readmail 0 [Skotlex]
+ * Fixed success rates for Dispell and Decrease Agility [Skotlex]
+ * Fixed cultivation not being in the list of skills for GMs with
+ gm_skill_all [Skotlex]
+ * Fixed mob's hp becoming zero after mob_hp_rate adjustments. [Skotlex]
+ * Skills update: [Skotlex]
+ - Changed concentration from +10% hit per level to +10 hit per level.
+ - Base level gives greater stun chance to Attack Weak Point (currently +1%
+ every ten levels)
+ - Changed Tiger Knuckle Fist to be a combo-only skill.
+ - Updated Spell break to damage 2% of target's max hp, heals half that.
+ * Small debug change in clif.c which forces a disconnection upon dual-login [Skotlex]
+ * Updated char-sql deletion to take into consideration the mysql version [Skotlex]
+ It should treat versions 4.1+ differently from the rest, please test and
+ report if it is still failing.
+ * Removed sql loading of storage every time you open it as it's an open
+ exploit on lagging servers. [Skotlex]
+ * Removed another "insufficient data" debug line. That should take care of
+ incomplete packets spamming the console. [Skotlex]
+ * Alright, removed the "insufficient data" debug line as it was just
+ causing mass lag. [Skotlex]
+08/09
+ * Fixed Magnum Break's damage display. [Skotlex]
+ * Finished fixing and testing the sql char deletion update. [Skotlex]
+ Deleted characters should now properly leave their party/guild.
+ * Throw Stone is now blocked by Kyrie and Pneuma [Skotlex]
+ * Fixed "[error] delete_timer error: no such timer -1" (stupid mistake x.x) [Skotlex]
+ * Some modifications to char-sql char deletion, so that characters are
+ correctly removed from parties and guilds. [Skotlex]
+ (Note that this is yet to be tested, so upgrade at your own risk or if
+ you want to help file bug reports until I can get to test it on my own
+ later today)
+ * Likely fixed Endure and the like not being 'disabled' on GvG grounds. [Skotlex]
+ * More debug messages to clif.c (these can be ignored on normal situations,
+ but might be useful during freezes) [Skotlex]
+ * Optimized the packet-version failed rejecting code. [Skotlex]
+ * Fixed Freezer Card combo casting Weapon Perfection on the enemy. [Skotlex]
+ * Added more information to the map-char connection process, meant to help
+ understand what is going on when things 'freeze'. [Skotlex]
+08/08
+ * Fixed players not really being disconnected when the char-server is out. [Skotlex]
+ * Added check to resend map server connection packets if the connection to
+ the char server was established but the initial packets get somehow lost. [Skotlex]
+ * Fixed Picky's pet-script being used for all pets... [Skotlex]
+ * Fixed an ugly bug that was causing status-changes to crash the map server [Skotlex]
+ * Added a timer to the map server. It'll try to reconnect 1 sec after it is
+ disconnected from the char server (in addition to the default "try to
+ connect every 10 secs" mechanism). [Skotlex]
+ * Reverted Safety Wall to last known working state. [Skotlex]
+ (from what I read in the code, it should be crash-safe anyway)
+ * Mob level up is now capped to max_base_level rather than 99. [Skotlex]
+ * Another fix to Safety Wall :X [Skotlex]
+ * Fixed Safety Wall (I think). Do test and pray it crashes no more. [Skotlex]
+ * Added settick_timer to timer.c, optimizes status retimings for dance
+ skills. [Skotlex]
+ * Made @autoloot and item_auto_get play along nicely (@autoloot toggles the
+ mode, item_auto_get sets the default state of it) [Skotlex]
+
+08/07
+ * Corrected the Payon Guild Flags [Codemaster]
+ * Lots of debug message cleanup in clif.c which should make more clear the
+ why characters are being disconnected. [Skotlex]
+ * Added OnAgitInit to the list of npc events executed on connection (it
+ will be executed only the first time it connects, thought) [Skotlex]
+ * Fixed the exp bonus on pvp maps (it was set to +115%, not +15%) [Skotlex]
+ * Updated skill_blown to avoid knocking back plants. [Skotlex]
+ * Made the damage delay of the finishing blow the same delay before sending
+ a char clear packet, this might fix mob sprites being left there after
+ killed. [Skotlex]
+ * More fixes to @autotrade
+ (You still can't disconnect your autotrader by entering in the
+ server again. And an autotrader rises map server usage to 70%+).
+ Started adding Freya's anti-bot thing [Lupus]
+ * Quick fix meant to prevent crashes when targetting "ghosts" of already
+ dead mobs. [Skotlex]
+ * Fixed Pneuma and Safety Wall crashing the server. [Skotlex]
+ (was caused by yesterday's skill upgrade not being... eh, complete)
+08/06
+ * Yet another @autotrade fix by irmin&Ultra. More fixes are coming soon 8)) [Lupus]
+ * Pretty big change in the way ground skills are handled, meant to fix
+ possible segmentation faults. [Skotlex]
+ Report if you notice any ground skill got broken, as pretty much all of
+ them have been affected.
+ * Removed the data about packet_version 14 in the packet_db [Skotlex]
+ This could mean that version 14 never really existed, and all following
+ versions need to be shifted up (who decides how to call these versions?
+ they certainly don't come coded in the login packet. We should ask
+ Sara-chan, the awesome ex-eA dev who pwns us al with her packet finding abilities.).
+ Note that no such changes have yet been decided other than removing version 14.
+ * Updated Devotion/Sacrifice. AutoGuard and Defender skills are now kept in sync
+ between the Crusader and those Devoted. [Skotlex]
+ * Added a battle_stopwalking to NPC_STOP effect [DracoRPG]
+08/05
+ * A li'l fix of @autotrade. Used some irmin's code and optimized a bit [Lupus]
+ * Fixed pc_setcart... [Skotlex]
+ * Updated Fireball and Stone Curse data [Skotlex]
+ Source used: http://guide.ragnarok.co.kr/jobmagskill.asp
+ * Updated map_server sql so that the storage is loaded from sql everytime [Skotlex]
+ * Updated the char deletion routine (sql) so that only the correct pets
+ will be deleted (those hatched and that are in the char's inventory/cart)
+ [Skotlex]
+ * Likely fixed the map server spamming the console when clients gets
+ rejected due to packet version. [Skotlex]
+ * Fixed the make_connection problem (sorry about that) [Skotlex]
+ * Updated make_connection (socket.c) so that it actually returns -1 when
+ the connection fails. [Skotlex]
+ * Fixed change-cart clearing other options. [Skotlex]
+ * Fixed @spawn not working with string names. [Skotlex]
+ * Fixed songs/dances not being moved when knocked back. [Skotlex]
+08/04
+ * Made mobs retaliate against a pet's master when for some reason a pet is
+ attacking a passive mob which is not yet attacking back. [Skotlex]
+ * Modified the mob_db to make it a dynamic array of mob databases. [Skotlex]
+ This allows usage of high mob ids without wasting memory on large gaps of
+ unused mob IDS.
+ NOTE: Other than loading/unloading the map server, this has not
+ been tested, if it crashes DO report right away (preferrably with a
+ backtrace)
+ * Bumped the MAX MOB ID to 10K [Skotlex]
+ * Added 2 new mobs, updated and added some items. Thanks to Landarma [Lupus]
+ Also fixed map-serv loading warnings (about wrong mob IDs)
+08/03
+ * Removed the clif_waitclose timer message, and placed it instead around
+ clif.c on the areas that are actually invoking the waitclose timer. [Skotlex]
+ * Changed the "Player not identified with account id" message to be more
+ descriptive (however I don't know how much of the player data is available
+ when disconnecting this way, so if it crashes DO REPORT it) [Skotlex]
+ * Modified @me so that it actually works as expected by IRC junkies. [Skotlex]
+ (tested and works correctly)
+ * Updated Enchant Deadly Poison: Can't be dispelled, won't end when you are killed. [Skotlex]
+ * Fixed draining more HP/SP than you can have [Skotlex]
+ * Fixed enchanted peach tree damaging you when attacking the undead [Skotlex]
+ * Removed the tick check from the packet_version guessing as it is an
+ unsigned int (so every value in said field is valid) [Skotlex]
+08/02
+ * The char server now notifies the map server about which is the max
+ account/char id available, this is used to help identify packet versions
+ more reliably. [Skotlex]
+ * Guardians won't level up now with mobs_level_up=1 [Skotlex]
+ * Updated Deluge, Volcano, Violent Gale & Land Protector to not require
+ gems when recasted, and the previous time remaining will be used instead.
+ [Skotlex]
+ * Fixed Zeny from mobs. [Skotlex]
+ * Changed the visual effect when pets heal status ailments to "Detoxify" [Skotlex]
+ * Fixed "bonus2 bSkillAtk" so that it works with up to five skills [Skotlex]
+ (previously it only worked for one skill at a time)
+ * Fixed Enchant Deadly Poison on normal attacks. [Skotlex]
+ * Updated the packet-guessing code, trying to load negative char accounts
+ should be fixed now. [Skotlex]
+08/01
+ * Updated the login servers so that account registration can be done with
+ _m/_f as well as _M/_F [Skotlex]
+ * Fixed login sql server not using md5sum on the passwords before creating
+ accounts (when md5 passwords are enabled) [Skotlex]
+ * Updated Enchant Deadly Poison: Increases Sonic Blow's damage by 4x and
+ affects all skills except Breaker/Meteor Assault [Skotlex]
+ * Added a check to prevent char-server freezes when receiving unknown
+ packets from the map server. [Skotlex]
+ * Fixed some problems with the clif optimizations from earlier today (wrong
+ animations being displayed for normal attacks/picking items) [Skotlex]
+ * Rewrote Ensemble skill implementation to be more efficient and less
+ error-prone [Skotlex]
+ (say, when you do an ensemble skill, your partner has to be
+ charged SP too? That is not the current case)
+ * Dance/Song checks so that the ground effect is more tightly coupled with
+ the status effect (if the dance's effect is cancelled for whatever reason,
+ the ground skill WILL be removed) [Skotlex]
+ * Fixed stat reset for Advanced Classes [Skotlex]
+ * Updated Lord Knight's Concentration (damage, defense, endure effect) [Skotlex]
+ * Likely fixed famous alchemist potion usage. [Skotlex]
+ * Small optimization to the packet version guessing code. [Skotlex]
+ * Added Warpparty and Warpguild script commands *requested* [Fredzilla]
+ * Fixed the exp exploit bug dealing with expaddrace [Skotlex]
+ * Added missing CharCommands logs (together with ATCommands) [Lupus]
+ TODO: '/' commands 8)
+ * Added mod for npc whisper system(lordalpha)[massdriller]
+ * Added lordalfa's str1 and str2 compare and check commands [massdriller]
+07/31
+ * Fixed (I think) the char sql server freezing when the map server sends it
+ a GM whisper request. [Skotlex]
+ * Rewrote the way that experience is given, this should prevent exp overflows
+ even in even-share parties. [Skotlex]
+ * Changed how the exp_calc_type works, take note that there's no longer a "2"
+ value for it! [Skotlex]
+ * Updated throw stone: Damage is modified by target's cards, 3% chance to
+ cause Stun/Blind. [Skotlex]
+ * Added rods/books to the list of items that can't break. [Skotlex]
+ * Fixed map server rejecting clients of packet versions 9 and below
+ (regardless of packet_ver_flag) [Skotlex]
+ * Updated Steel Body: Consumes 50% sp and is not dispellable. [Skotlex]
+ * Updated sprinkle sand's damage to 130%, Throw Stone's range and delay [Skotlex]
+ * Fixed increased dodge's flee bonus and speed bonus (to Assassins). [Skotlex]
+ * Simplified clif.c by removing all code related to hard-coded packet
+ information (the packet_db.txt is an essential file now) [Skotlex]
+ * Small fixes to provide clarity to # commands
+ (So many people ask "why doesnt @char????? work, like OMGWTFBBQ") [Fredzilla]
+ * Fixed a stupid typo in a drop rate display [Lupus]
+07/30
+ * Some more fixes to the job calculating equations. This one should fix item
+ usage for mounted classes and hopefully be the last fix needed regarding
+ the job system upgrade. [Skotlex]
+ * Corrected the parsing/reading of the skill tree. This fixes the Priest/Monk
+ skills appearing in the skill trees of Paladings/Crusaders. [Skotlex]
+ * Another fix about advanced/baby mounted characters not having skills. [Skotlex]
+ * Fixed character's class not getting updated when mounting/dismounting peco. [Skotlex]
+ * Fixed the default packet version checking in the guessing version code.
+ as pointed out by End of Exam. [Skotlex]
+ * Optimized the code that determines what packet version to use by default
+ when you specify "packet_db_ver: default" [Skotlex]
+ * Fixed job changing to high/baby classes [Skotlex]
+07/29
+ * Moved messages "One Castle", "Two Castles", etc into msg_athena.conf [Lupus]
+ * Fixed wrong msg_athena.conf messages in the trade hack spoof code [Lupus]
+ * Added a Rare Item announce string into msg_athena.conf [Lupus]
+ * Fixed compilation of the TXT server. [Skotlex]
+ * Fixed song/dances not clearing when you run out of SP [Skotlex]
+ * Fixed #fakename [Skotlex]
+ * Optimized Apple of Idun's implementation [Skotlex]
+ * Updated pc_calc_base_job and related functions and applied them around
+ the map server. This should fix all item related problems with Super Babies
+ and alike. [Skotlex]
+ * Simplified/optimized the code that mounts/dismounts from Pecos. [Skotlex]
+ * Changed Create Deadly Poison to not use the item producing interface (works simplier,
+ like Aqua Benedicta) and added a separate config option to choose whether the maker's
+ name is written on the Poison Bottle [DracoRPG]
+ * Changed NPC_STOP to immobilize the target during 2 seconds (from ragnainfo) [DracoRPG]
+ * Added "cartboost" state to skill_require_db (used for Cart Termination) [DracoRPG]
+ * Rewrote Soul Destroyer's damage dealing and displaying code, now everything is done at
+ once: no more people killed without damage displayed [DracoRPG]
+ * Readded Assassin Cross not affecting bows [Skotlex]
+ * Fixed Hip-Shaker (not tested, but I am assuming it works now) [Skotlex]
+ * Fixed Brandish spear's damage [Skotlex]
+ * Removed the after-cast delay of Recall Partner [Skotlex]
+ * Added optional announce of rare drops. When a SomePlayer kills a monster [Lupus]
+ with a rare drop then everyone gets announce: 'SomePlayer' won Pupa's Pupa Card (chance 0.01%)
+07/28
+ * Fixed the Server Whisper to GMs in the char-sql server [Skotlex]
+ (when an exploit that should be notified to GMs is triggered, the map
+ server would just hang instead...)
+ * Some code reorganization around the name-spoof exploit protection code. [Skotlex]
+ * Fixed not being able to do Extremity Fist after Glacier Fist/Tiger
+ Knuckle Fist [Skotlex]
+ * Likely fixed the Famous Alchemist potions not having that 50% boost. [Skotlex]
+ * Updated the Wedding Skills (they work with 10% HP/SP and heal 10% of
+ their target's, summoning has a cast time of 20s) [Skotlex]
+ * Reverted AssassinCross's song behaviour. [Skotlex]
+ * Odd bug wanting all Account and Char IDs to end with 0?! [Codemaster]
+ Note: Not all acc or char ids end with 0...this gave alot of problems with client version 16
+ * Fixed that compiling issue with buildin_getequippercentrefinery [Skotlex]
+ * Updated Bard's AssasinCross (Impressing Riff) to not affect Bows (is this
+ how it really is?) [Skotlex]
+ * Massive skills update (from now updated kRO website) [DracoRPG]
+ - Weapon forging, ore/metals refining, potion making : tried to correct rates ^^
+ - Weaponry Research : does NOT increase NPC equipment upgrading chance
+ - Skin Tempering : (4*skilllv)% fire resistance and (1*skilllv)% neutral resistance
+ - Hilt Binding : the original 'undropable weapon' part is dead
+ - Meteor Storm : (3*skilllv)% stun chance
+ - Lord of Vermilion : (4*skilllv)% blind chance
+ - Sandman : (40+10*skilllv)% sleep chance
+ - Ankle Snare : minimum trap time changed to (3+0.03*skill_lv) seconds
+ Tons of other skills could and should be reviewed the same way ! ^^
+ * Fixed massdriller's fixes ^_^ [Kevin]
+ * Some fixes to Whisper system. [massdriller]
+07/27
+ * Fixed the fame list packet mismatch bug. [Skotlex]
+ * Even more cleanups to socket.c and chrif.c to prevent even handling
+ Session #0 [Skotlex]
+ * Some more cleanups to chrif.c (the interface to the char server)'s code. [Skotlex]
+ * Appied End of Exam's socket/connection related fixes/suggestions. [Skotlex]
+ * Fixed a Segmentation Fault with friends list loading. [Kevin]
+ * Fixed the npc whisper system. [Kevin]
+ * Fixed most of the matrix bug, note to devs: Don't use tmp_output anymore! [Kevin]
+ * Fixed a small compile warning with previous fix. [Kevin]
+ * Added ATCommand @AutoTrade. You open a shop, setup your goods. Then use @AUTOTRADE.
+ Your will be closed, but your merchant would remain in the game. So you can vending
+ without your client ON. (originally by Fantik, changed by Lupus)
+ * Added ATCommand @ChangeGM. Your Guild Master can set another GM of the guild.
+ Note: It works, but have to be optimized, WIP. (originally by Fantik, changed by Lupus)
+ * Added lordalfa's npc whisper system [massdriller]
+ * added lordalfa's fix/enhancement for Execute Scripts::labels [massdriller]
+07/26
+ * Updated the packet-version guessing code, hopefully it does a better job now [Skotlex]
+ * Fixed the mob bug where they "stick to you" and won't let you escape [Skotlex]
+ * Reverted mob skill usage rates. A rate of 1000 (in mob_skill_db.txt) IS 100% usage. [Skotlex]
+ * Corrected Gospel not dissipating when you die. [Skotlex]
+ * Fixed Providence/Resistant soul so it can't be casted on yourself-other crusaders [Skotlex]
+ * Updated Quagmire to affect everyone in GVG maps. [Skotlex]
+ * Small fix to the packet_version identification [Skotlex]
+ A more complete testing/verification code comes later...
+ * Likely fixed the txt->sql converter. [Skotlex]
+ * Corrected some refine success rates. [Skotlex]
+ * Modified the packet client version guessing code (perhaps it more
+ accurately guesses the version now?) [Skotlex]
+ * Fixed reading of 'repairitem' packet in packet_db -> fixes Weapon Repair [DracoRPG]
+ * Rewrote Weapon Repair to allow use on other players [DracoRPG]
+ * Moved pc_item_repair, pc_item_refine and pc_item_identify to skill.c [DracoRPG]
+07/24
+ * Enchant Deadly Potion now does count card modifiers. [Skotlex]
+ * Fixed elemental modifiers not applying to skills. [Skotlex]
+ * Fixed mob_ghostring_fix config. [Skotlex]
+ * Fixed firewall stun-locking enemies that are not pushed back. [Skotlex]
+ * Added some checks into MONSTER spawn command (reports wrong number, ID, delays, etc.) [Lupus]
+ - somehow it doesn't report about wrong map names yet
+ * Added check for missing TAB characters into script parser [Lupus]
+07/23
+ * Fixed friend-saving on the new charsave sql method. [Skotlex]
+ * Corrected the ghostfix description in battle_athena. [Skotlex]
+ * Modified the Makefile to include FD_SETSIZE = 4096 when compiled under
+ Cygwin [Skotlex]
+ * Added a check for max mob skill level (when reading mob_skill db) [Lupus]
+ * More fixes/updates to the txt->sql converter of inventory/cart (will it ever work?) [Skotlex]
+ * Fixed job_db2 reading [Sasuke]
+ Field count is MAX_LEVEL+1 since job ID is the first field of the 'split' table
+07/22
+ * Changed a bit the aspd penalty for dual-wielding assassins. [Skotlex]
+ The new factor is 2/3 rather than 0.7, which should be closer to what
+ rodatazone says, but also makes them dual wielders a bit slower :X
+ * Fixed job_db2.txt reading so that it will read up to MAX_LEVEL job bonuses. [Skotlex]
+ * Changed the way the OS is detected in socket.h [Skotlex]
+ This MIGHT fix the current 60 user limit problem.
+ * Fixed characters not being able to attack and getting "there is a delay
+ after a skill" messages instead. [Skotlex]
+ * Fixed status changing cards not taking effect. [Skotlex]
+ * Fixed packet_ver_flag reading. [Skotlex]
+ (previously, if you tried setting it to 256 or 512 it would be
+ resetted back to 255, which would cause problems with the later clients)
+ * More fixes to the txt->sql converter. Does it works now? [Skotlex]
+ * Added water height values of Ayothaya, Ayo_dun02, sec_in02 maps (thanx 2Lorky) [Lupus]
+ * Fixed char-sql memo saving. [Skotlex]
+ * Added the wantoconnection packet of version 13 to version 14 [Skotlex]
+ Note that this will cause all ver13 clients to be identified as v14, it
+ WILL cause problems if you use ver13 clients. There is no easy way around
+ this as both versions seem to use the identical login packet. If you
+ want to give preference to v13 over v14, you can specify the default to
+ be it.
+ * Fixed Encore skills working when the partner has no weapon equipped. [Skotlex]
+07/21
+ * Fixed the fame lists, they work now. [Skotlex]
+ * Rewrote the friends system, it now works. [Skotlex]
+ Sql users upgrade with the 2574.sql upgrade, txt users will have to
+ wipe their friends.txt (there's no easy way to convert that one).
+ * Fixed the txt->sql converter not converting inventory/card. [Skotlex]
+ The friend conversion was removed due to the new structure.
+ * Restructured some of the logic behind auto-attacks and normal attacks
+ which should prevent most speed-hacks and be more responsive to players. [Skotlex]
+07/20
+ * Updated the txt->sql converter, I THINK it will work now. [Skotlex]
+ * Fixed Plagiarized skill's level not being saved. [Skotlex]
+ * Changed Pressure/Gloria Domini to take a % of current SP, not max SP (from a post on
+ ragnainfo, not personal custom shit! :p) [DracoRPG]
+ * Removed debug messages for fame list and signaled the bug that causes problems [DracoRPG]
+ * Removed the need of job_db2-2 (advanced jobs' stat bonuses) and moved its use to
+ job_db2 [DracoRPG]
+07/19
+ * Reorganized the way sql chars are being saved. [Skotlex]
+ * Merged battle options player_combo_damage_delay and
+ mob_combo_damage_delay into combo_damage_delay [Skotlex]
+ * Some code reorganization that hopefully should help with mobs not having
+ the same damage delay on the client and within the server. [Skotlex]
+ * corrected some bounds errors in the new packet_db code
+ that was corrupting memory [MouseJstr]
+ * Corrections to Tiger Knuckle Fist [Skotlex]
+ * Rewriting of part of the skill-additional effect code. (Should fix
+ Asura's penalty) [Skotlex]
+07/18
+ * Added a check that might prevent sql char crashes when requesting info
+ for non-existant Characters. [Skotlex]
+ * Fixed main.sql (start char_id should be 150k) [Skotlex]
+ * Some code-cleaning for Sacrificial Ritual [Skotlex]
+ * Optimization of auto-triggering skills (double attack, sacrifice, triple
+ blows) [Skotlex]
+ * Small fix to Sanctuary (shouldn't start healing until after 1.5 secs of
+ casted) [Skotlex]
+ * Implemented Palm Strike (you cast the skill, it pushes back the enemy and
+ deals damage 1 sec after it was casted) [Skotlex]
+ * Rewrote and tested Gospel's code, currently it works as follows: [Skotlex]
+ Offensive Effects:
+ 0: Defense ignoring damage 1~9999
+ 1: Curse enemy
+ 2: Blind enemy
+ 3: Poison enemy
+ 4: Lv10 Provoke
+ 5: Def, Def2 to 0
+ 6: Base Atk, Watk to 0
+ 7: Flee to 0
+ 8: Speed/Aspd -25%
+
+ Deffensive Effects:
+ 0: Heal 1~9999
+ 1: End all negative status effects
+ 2: Lv10 Bless
+ 3: Lv10 Inc Agi
+ 4: Aspersio (holy weapon)
+ 5: Benedictio (holy armor)
+ 6: +100% max hp
+ 7: +100% max sp
+ 8: +20 to all stats
+ 9: +25% def (armor and vit)
+ 10: +100% base atk
+ 11: +50 flee
+ 12: +50 hit
+ 13: Status effect inmunity
+ - Effects have a chance of 10*Skill_lv% of triggering every 5~15 secs
+ for whoever is on the skill area.
+ - Report any modifications/corrections needed on the forums.
+07/17
+ * More Sacrificial Ritual updates [Skotlex]
+ * Added Jawaii's water level, thanks to Manipulator [Skotlex]
+ * Sacrificial Ritual update [Skotlex]
+ * Bumped max Vending price to MAX_ZENY (currently 1000M) [Skotlex]
+ * Fixed a bug with Brandish Spear's damage. [Skotlex]
+ * Changed the minimum valid char_id from 150k to 1 as apparently many sql
+ servers somehow got their chars to start from id 1 instead of 150k. [Skotlex]
+ * Added a bunch of debug information to help me understand why the client
+ version check is failing. Report back the output on the forums. [Skotlex]
+ * The memory manager is now OFF by default [Skotlex]
+ (if the server now crashes instead of the matrix bug, then whoever
+ gets the traceback first gets to locate it's source)
+ * Various fixes to Sacrifice (self damage, display, defense reduction, etc) [Skotlex]
+ * Fixed Assumptio's damage reduction in pvp/normal maps [Skotlex]
+ * Tiny fix to #fakename [Codemaster]
+ * Probable fix for matrix bug. [Kevin]
+ * Fixed SegFault with friends list loading on sql. [Kevin]
+ * Fixed the spamming of 'unknown packet received' when a client connects
+ with an unidentifiable version. [Skotlex]
+ * Optimized sql loading of data when displaying the Char Select Screen [Skotlex]
+07/16
+ * Added NOLOOT, NOEXP mapflags files (thanks to Lorky,OSKOM) [Lupus]
+ * Updated Louyang monsters spawn (thanks to MasterOfMuppets) [Lupus]
+07/15
+ * Rewrote most of the packet_db handling code. [Skotlex]
+ eA now really supports multiple packet versions at the same time,
+ (so that transitioning from one packet version to another should be
+ smooth), there is no longer any need to mess with the db/packet_db.txt
+ file.
+ * The values for packet_ver_flag have changed, check the battle_athena
+ comments and set it up accordingly!
+ * Using the packet_db is the only way to manage packets now. [Skotlex]
+ * Added sql runservers to all branches as runserver-sql.bat [Evera]
+07/14
+ * Fixed the login-sql registration issue. [Skotlex]
+ * Made it so all ground-targetted skills fail if you try to cast them on a
+ cell you can't step in. [Skotlex]
+07/13
+ * Soul Change should now work on anyone in pvp/gvg maps [Skotlex]
+ * Wand of Hermod's target change from 'friend' to 'party' [Skotlex]
+ * Fixed triple blow's 'infinite damage delay'. [Skotlex
+ * Added check to prevent placing traps on non-walkable cells. [Skotlex]
+ * Fixed login-sql server not reading login_log value [Skotlex]
+ * Adjusted my fix of buildin_getequipisequiped to not leave
+ the return stack tweaked [MouseJstr]
+ * Changed skill_unit_onlimit to use strncpy instead of memcpy
+ in one spot to eliminate accessing unallocated memory [MouseJstr]
+ * Added check into _mmalloc for allocations of less then zero
+ to make debugging easier [MouseJstr]
+ * Fixed USE_MEMMGR to disable when running bounds checker or
+ the debugging malloc code [MouseJstr]
+ * Fixed the debugging malloc MACRO's to use the correct arguments
+ [MouseJstr]
+ * increased max maps per server to 1024 [MouseJstr]
+ * Added check into buildin_getequipisequiped to make sure arguments
+ don't go outside of array boundries *crash* [MouseJstr]
+ * Add a check into refine bonuses to not go outside of array
+ boundries if somebody has a wlv above 5 in the database *crash* [MouseJstr]
+ * Modified skill_tree code to confirm we are still inside the
+ skill_tree array before accessing a element from the skill_tree
+ array *crash* [MouseJstr]
+ * Changed the mob spawning code to use strncpy instead of memcpy
+ in some places to avoid copying unallocated and uninitialized
+ memory *crash* [MouseJstr]
+ * Fixed the compile problem on the previous upgrade. [Skotlex]
+ * Changed refine success chances to match jRO information. [Skotlex]
+ See http://tomcat1.s13.xrea.com/bs/calc.html and
+ http://eathena.deltaanime.net/board/index.php?showtopic=39997
+ for the details on the new equation.
+ (changed because the current equations seem somewhat outdated)
+ * Fixed max chance const of "mob skill usage". Now all mobs aren't hyperactive. [Lupus]
+ * Fixed global vars not being saved instantly (used to cause some scripts exploits) [Lupus]
+ Need some offensive testing.
+07/12
+ * Added Loli Ruri to the Magician set [Skotlex]
+ * Fixed 'theif' on the scripts. [Skotlex]
+ * Added mapflag pvp_noparty to the pvp rooms [Skotlex]
+ * More Dispell Fixes [Skotlex]
+ * log_login option now also works for the SQL Login server [Skotlex]
+07/11
+ * Fixed again Dispell. [Skotlex]
+ * Added nomemo mapflag to Ayothaya Dungeon. Check your memo DBs and wipe forbidden entries [Lupus]
+ - Yuno, Ayothaya Dungeon
+ * Fixed Dispell succes rate reduction by MDef working reversed [DracoRPG]
+ * Changed Guild auras to not be removed by Dispell (they came back when you walked
+ anyway :p) [DracoRPG]
+ * Changed the default for equip_natural_break_rate to 0 (official) [DracoRPG]
+ * Fixed the function that checks whether the player has valid equipment for his buffs :
+ don't return once one buff is stopped, since there can be more (e.g. Crus' shield buffs
+ will now ALL be stopped when the shield is unequipped, not only Guard ^^) [DracoRPG]
+07/10
+ * Fixed Alchemist Fame system using' account_id' instead of 'char_id', however this does
+ NOT solve the names problem : I left debug messages so you can see by yourself that the
+ bug comes from map_charid2nick that always returns null... [DracoRPG]
+07/09
+ * Added Novice Castles Usher NPC. 4 new Castles for all but 2nd classes! [Lupus]
+ * Updated Falcon Assault (now gives 500% at 5 lvl) [Lupus]
+ * Fixed True Sight (now gives +10 Crit, instead of +10%) [Lupus]
+ * Update Sharp Shooting (now gives 350% at 5lvl) [Lupus]
+ * Check other DB related skills req changes in db\changelog.txt [Lupus]
+ * Updated Palm Strike to push back even if it misses. [Skotlex]
+ * Updated Palm Strike cost/sphere requirement. [Skotlex]
+ (the delayed damage still needs to be coded in)
+ * Now adoption.txt NPC can also teach parents/babies their missing family skills [Lupus]
+ But the skills don't work yet (I tested)
+ * Massive mapflags fix. Also added there Novice Guilds. [Lupus]
+07/08
+ * Fixed below fix xD [DracoRPG]
+ * Added another sql injection fix [Kevin]
+ * Rewrote part of the name request code [Skotlex]
+ This means that now you can see other people's party even if they don't
+ belong to a guild, and the party/guild names are updated whenever someone
+ joins/leaves them. Not fully tested but works alright on the client I use
+ (0411)
+ * More Adoption skill fixes. [Skotlex]
+ * Added the Adoption skills to all classes [Skotlex]
+ They should be auto-granted upon adoption (and are not resetable,
+ learnable). This, of course, needs testing, do report if it does not
+ works. (those that already have someone adopted will need a custom npc to
+ give them the skills).
+ * Reverted Wedding Rings as they don't need to give the adoption skills
+ anymore [Skotlex]
+ * Added script command getchildid() [Skotlex]
+ * Updated wedding rings to give the adoption skill when equipped. [Skotlex]
+ * Fixed some adoption skills [Skotlex]
+ * Baby classes won't display the wedding sprite when they equip the
+ tux/wedding dress since that resets their size. [Skotlex]
+ * Added warning messages when mobs from the mob_db are not loaded due to
+ invalid IDs. [Skotlex]
+ * All the new monsters have been added. Check db\changelog.txt
+07/07
+ * Moved some declarations causing errors with gcc 2.95 [veider]
+ * Added valid fd test in inter.c char_sql - caused charserver crash [veider]
+ * Fixed pet-exploit where you could use a bow with no arrow equipped to
+ 'send' your pet to attack distant enemies. [Skotlex]
+ * Added a visual skill effect when pets heal a status ailment. [Skotlex]
+ (Adrenaline Rush was chosen because it's animation does resemble a
+ 'curative spell')
+ * Changed all SQL-related error messages to use ShowSQL [Skotlex]
+ ShowSQL now is also printed on the stderr (like ShowError and ShowFatalError)
+ * Beautified the output of the char server (sql) [Skotlex]
+ * Modified Dispel so that it can fail. [Skotlex]
+ As I have no information of how mdef protects against it, the current
+ dummy equation is: (50+10*SkillLv - mdef)% (note that mdef2 is not used!)
+ If someone knows the actual equation, do open a bug report.
+07/06
+ * Fixed Spider-web (works like a ground-targeted trap) [Skotlex]
+ * Fixed combo delay not working with skills that have a blowcount [Skotlex]
+ * Set the default skill combo delay value to 230ms [Skotlex]
+ (this default was empirically obtained testing with Jupitel Thunder as reference)
+ * Beautified output of the char server (txt) [Skotlex]
+ * Fixed script config import reading. [Skotlex]
+ (was working incorrectly and causing memory leaks)
+ * Another mob-ai fix, this time mobs should unlock their target once
+ it has died for sure. [Skotlex]
+ * Added player_combo_damage_delay & monster_combo_damage_delay [Skotlex]
+ See battle_athena.conf for description of how they work.
+ Defaults to 0 because it is not yet tested for an appropiate default.
+ * Removed player_damage_delay & monster_damage_delay [Skotlex]
+ Use player_damage_delay_rate:0 & monster_damage_delay_rate:0 instead.
+ * Set item_use_interval to 0 (official default, isn't it ?) [DracoRPG]
+ * Improved appearance of script-errors reported during loading. [Skotlex]
+ * Some mob-ai cleanup. Mobs should now unlock their target when it has died. [Skotlex]
+ * Some items, monster drops fixes [Lupus]
+07/05
+ * Fixed double attack damage [Skotlex]
+07/04
+ * Displayed name is now updated whenever a character leaves/joins a
+ party/guild. [Skotlex]
+ * Added some NEW official HEADGEARS quests thanks to Lorky [Lupus]
+ * Added zbuffer/lance's "Dynamic NPC Look 'n Feel" feature. [massdriller]
+07/02
+ * Fixed a small bug in PCloadmapevent thanks to lance. [massdriller]
+ * Added lance's PCLoadMapEvent script event command. to trigger, type in
+ -[TAB]script[TAB]PCLoadMapEvent[TAB]-1,{
+ YOUR SCRIPT HERE
+ PCLoadMapEvent as NPC Name will trigger when players step into the map.
+ OnPCLoadMapEvent as Label will trigger when players step into all maps. [massdriller]
+ * Added lordalfa's NPCKillEvent script event command. to trigger, type in
+ -[TAB]script[TAB]NPCKillEvent[TAB]-1,{
+ YOUR SCRIPT HERE
+ }
+ The script should run everytime a normal monster is killed. [massdriller]
+ * Added lordalfa's edit where Labels from Event Monsters be executed using the MVP RID,
+ and not the Last Hit guy RID. [massdriller]
+ * Added lordalfa's PCBaseUpEvent script event command. to trigger, type in
+ -[TAB]Script[TAB]PCBaseUpEvent[TAB]-1,{
+ YOUR CODE HERE;
+ }
+ the script should run everytime the user gains a level. [massdriller]
+ * Fixed Job Quests exploits (Advanced Classes were able to pass their 2nd job quests again) [Lupus]
+ High Novices were able to pass Super Novice Job Quest as well. They weren't able to GET those
+ professions, tough. But there were some items exploits.
+ Now Advanced classes get reborn guides from all main Job Quest NPCs (1st, 2nd Classes)
+07/02
+ * Fixed NEWnovice NPC set using gmcommand instead of atcommand. [Codemaster]
+ * Maps and bugs updates, some cleanup in Weapon Repair code [DracoRPG]
+ * Added new areas into map flags folder. According to the patch, added NOMEMO flag to Yuno [Lupus]
+ * Some monsters drops changes, cards fixes. [Lupus]
+ * Fixed sql-char server crash when deleting a Guild Master [Skotlex]
+ * Massive cards update (also thx 2Landarma) [Lupus] read db\changelog.txt
+07/01
+ * Fixed being able to steal from Treasure Box #1 [Skotlex]
+ * Char-sql server now uses autosave_interval to decide when to save a
+ modified guild. [Skotlex]
+ * Temporary patch to fix the 'invalid pointer' error on shutdown. [Skotlex]
+ * Changed all printf's to Show* messages (login/login-sql servers) [Skotlex]
+ * Cleaned up sql-account creation code. [Skotlex]
+ * Fixed 'unclean' guilds not getting saved on char-sql shutdown. [Skotlex]
+ * Corrected map-length calculations when auto-adding .gat (#/@ commands) [Skotlex]
+ * Fixed guild-skill sql loading. [Skotlex]
+ * Added battle_config option guild_exp_rate to adjust taxed experience
+ before adding it to the guild. [Skotlex]
+ * Some Guild-Sql saving optimizations [Skotlex]
+ * Changed all printfs to Show* messages (Map Server, common/ files) [Skotlex]
+ * Fixed crashes of Baby Knight/Crusader Peco riders. Added Baby Class support into
+ AT / CHAR commands @mountpeco [Lupus]
+06/30
+ * Added web server (http daemon) plugin, originally by jA, ported to plugin form
+ (but not yet finished) [celest]
+ - To activate it just edit plugin_athena.conf
+ - When running just access http://<your server IP>:<your server port>. The
+ default home page is httpd/index.html, you can edit it if you want.
+ - If graph creation is enabled you can view them in http://..../graph
+ (by default only memory usage graphs are added)
+ * Fixed crash when no grf's are loaded [celest]
+ * Some tidying ups in clif.c, guild.c, skill.c, storage.c [celest]
+ * Fixed a missing foreign key for guild_position in the SQL
+ guild convert files (main.sql has it already) [Aru]
+ * On Guild_skill table corruption in SQL: this is a problem with
+ some MySQL versions not supporting the syntax used in
+ convert_guild_tables properly. The solution is to drop table
+ guild_skill and re-create it with the query from main.sql. [Aru]
+06/29
+ * Fixed Bowling Bash and Spear Stab having knockback in
+ situations where knockback should be disabled (GvG/MVP) [Aru]
+ * Updated map configs with airport maps. [massdriller]
+06/28
+ * Fixed Land Protector's range
+ * Old Sakexes can now login to the server. [davidsiaw]
+ * Doubled Investigate/Occult-Sight's damage and made it non-elemental as per
+ ragnainfo sources. [Skotlex]
+ * Sacrifice now always hits.
+ * Added import of msg_conf.txt for custom message translations. [Skotlex]
+06/27
+ * Fixed Pressure missing. [Skotlex]
+ * Added 2Secs delay to Sonic Blows. [Skotlex]
+ * Removed battle config option maximum_level and replaced it with max_base_level,
+ max_job_level, max_super_novice_level and max_advanced_job_level. Refer to
+ battle_athena.conf for more details. [Skotlex]
+06/26
+ * Fixed typo 'identity'->'identify' in charsave.c [DracoRPG]
+ * Added missing ',' to guild_position definition of main.sql [Lupus]
+ * Added proper foreign keys to guild_position,
+ SQL users run upgrade_svn2331.sql [Aru]
+ * Added convert_guild_tables2.sql for use on guild tables
+ created with a 2314-2321 main.sql. Run this or
+ convert_guild_tables.sql if you are having issues with guild
+ skill saving [Aru]
+ * Fixed a bug with guild_skill table in main_old.sql if you're
+ fool enough to use it [Aru]
+ * @nuke++, ftw ;D [Valaris]
+ * Modified friend list loading in char-server (sql) to be more efficient. [Valaris]
+ * Modified mmo_friends_list_data_str (char-server txt) so it wouldn't make junk data. [Valaris]
+ * Added 'character_size' to battle config:
+ Do mounted (on Peco) characters increase their size [Lupus]
+ * Added new guild database structures to main.sql.
+ Removed obsolete guild_tables.sql.
+ If for some reason the new main.sql doesn't work for you, you
+ can use main_old.sql, but there will be garbage left in the DB
+ if a guild is deleted. [Aru]
+06/25
+ * Asura/Extremity-Fist needs Fury/Explosion-Spirits active no matter how
+ it's triggered. Not yet tested, but it should work. [Skotlex]
+ * Reorganized deletion process. Friends should now be no more problem [davidsiaw]
+ * Added SQL returned row check to friend-list loading, thanks to Sasuke-. [Valaris]
+ * Fixed drops_by_luk not behaving exactly the way it was before... ^^' [Skotlex]
+ * Proper clear of class sprite if used as a mob when killed. [Valaris]
+ * Added limit 10 to fame list SQL query (faster, when u got 1000+ bsm/alch in DB) [Lupus]
+ * Added missing field guild/char_id to main.sql database definition [Lupus]
+ Warning: Don't use guild_tables.sql databases yet! Use main.sql file
+06/24
+ * Small bug fix on the Monk combos introduced by previous reorganization. [Skotlex]
+ * Some corrections on player_cloak_type code. [Skotlex]
+ * Some code reorganizing related to Monk combos [Skotlex]
+ * Reverted behaviour of the drops_by_luk to Valaris's way [Skotlex]
+ Added drops_by_luk2 for those who want the alternate behaviour instead.
+ * Adjusted occult-sight/investigate damage modifier to be (def1+def2)/100 [Skotlex]
+ * Removed remaining bits of code for the ex-guild skill Charisma [DracoRPG]
+ * Added Lighthalzen to @go [DracoRPG]
+ * Fixed bug in bowling bash that made the target's sprite remain. [Valaris]
+ * Added status calculation to nude script command if anything was removed. [Valaris]
+06/23
+ * Fixed LittleWolf's detect hidden mode 256 for mobs (missed a line while merging). [Valaris]
+ * Disable AF2 loading -- eA doesn't support unzipping archives yet [celest]
+ * Updated UPnP plugin to 1.0.3.2 [celest]
+ - Added 'nat_ip' option to upnp.conf (use it to manually set your ip address
+ if auto detecting doesn't work)
+ - Fixed ip address not initialised properly
+06/22
+ * Stopped looting from Chase Walk [Aru]
+06/21
+ * Added send of fail packet on failing to pick up items under certain conditions
+ (this allows you to get an item you tried to pick up while cloaked when you uncloak). [Valaris]
+ * Updated map server to partially 1203~1249
+ - Added 'buyer_name' to battle config: shows the buyer's name when an item
+ has been sold through vending
+ - Added skills with 'water' requirement can be used in rain-enabled maps
+ - Fixed Soul Strike not dealing extra damage to undead
+ - Fixed Advanced Book not giving its aspd bonus
+ - Fixed skill name display when Frost Joke and Scream are casted by mobs
+ - Fixed exp overflow with Rich Man Kim
+ - Fixed exp overflow with party bonuses
+ - Fixed mob names not updated properly when respawning to its base class
+ - Reduced size of struct pet_db a bit
+ - Prevent trying to respawn a one-time-only mob if it can't find any
+ coordinates to add it
+ - Added slave mobs with no master/master died will be removed in mob_ai()
+ - Changed damage log by summoned mobs will use their masters' char_id instead
+ of account id (old system)
+ * Some tidying up in atcommand.c [celest]
+06/20
+ * Large monsters now have 2x base stats, drop rates, exp, and zeny (if enabled). [Valaris]
+ * Small monsters now have half base stats, drop rates, exp, and zeny (if enabled). [Valaris]
+ ** Note: this is referring to size just as @monsterbig and @monstersmall, not small, medium, brute, etc... [Valaris]
+ * Removed wedding rings from hasitems script command. [Valaris]
+ * Removed monsters_ignore_gms from battle_athena.conf, and added @monsterignore command. [Valaris]
+06/19
+ * Sirius: Even though the `id` field is never directly read or
+ written by Athena it is neccesary for the SQL server which
+ automatically handles it. Else each char may have only 1 item
+ in a given table. [Aru]
+ * overhauled PA_SACRIFICE. If you want to revert the old
+ behavior, you can comment out the new line for it in
+ skill_db.txt [Aru]
+ * removed broken SQL "upgrade" script [Aru]
+ * finished the mapservers direct char loading / Charsaving (SQL only!) [Sirius]
+ - set charsave_method in char / map conf to 1 if u want to use the feature
+ - please test it and make db backups, the save / load is completly rewritten.
+ * Fixed some compilation errors on FreeBSD (old compilers [veider]
+06/18
+ * Properly updated graph files (Oh god, i keep forgetting things now...
+ sorry again! >.< [celest]
+ * celest:
+ added a graph.c / graph.h with void graph_init and graph_final functions
+ due to compiling errors [sirius]
+ * SQL USERS: upgrade with upgrade_2252.sql!
+ * Added new maps, items. Thanks to Landarma [Lupus]
+ * Added graph creation code by jA / End_of_exam (currently disabled until
+ finished) [celest]
+ * Added grfio_crc32() [celest]
+06/17
+ !!!Bug: on optimizing run_script, Kafra NPC stopped working. Celest, read it plz. [Lupus]
+ -- Fixed, sorry ^^; Please test and tell me if anything goes wrong [celest]
+ --- Yes. It's fixed now. (Equipment upgraders, etc werent' working, too) [Lupus]
+ * Started adding the charsave_method, Loading is working, saving will be finished @ 18.6.05 [Sirius]
+ * SuperUser checking ... (never run athena as root!) [Sirius]
+ * Added eprintf/eprint (eprintf is equal to printf) but it displays line / file ... (to stdrerr)[Sirius]
+ * Fixed Ungoliatnt casting assumptio on it's target instead of self. [Skotlex]
+ * Switched two frees around that might have caused problems [Codemaster]
+ * Optimised run_script a bit, based on jA [celest]
+ * Fixed a memory leak in script.c [celest]
+06/16
+ * Fixed "unable to add to guild" bug. [Skotlex]
+ * fixed a typo of the guilds sql file DB definition [Lupus]
+ * Added left-out bonus bDef2 [celest]
+ * Moved minicore .o files compiling to under 'common' [celest]
+ * Fixed a client crash when using Advanced/Baby job sprites for mobs [Aru]
+ * Added a random modifier to returned damage modifiers to prevent stun-lock
+ abusers. [Skotlex]
+ It's currently set at +/-5%, not tested to know if that's enough or not,
+ feedback appreciated.
+ * Updated missing grfio.c, sorry ^^; and thanks Skotlex! [celest]
+ * Fixed crash in exporting ip address to plugins [celest]
+06/15
+ * Small mod on the new attack function to prevent Asura Strike from
+ overflowing and doing minimal damage instead of insane damage. [Skotlex]
+ * Merged Iro's patch to get #changesex working. Try it out. [Skotlex]
+ * nullpo fix (guild.c:550), it was an actual possible scenario when you
+ invite someone to a guild and quit before they reply. [Skotlex]
+ * Removed script command gmcommand and replaced it with atcommand &
+ charcommand. [Skotlex]
+ * Small fix regarding speed updating for Cast Cancel + Freedom of Cast [Skotlex]
+ * Added 'make depend' for resetting Makefile dependencies [celest]
+ * Readded 'make addons' (works the same as 'make plugins') [celest]
+ * Split zlib dll opening from grf opening in grfio.c [celest]
+ * Moved grfio.c back to /common, it'll be needed by the core later [celest]
+ * SQL Logs crash likely fixed. [Skotlex]
+ * Added Stone-Curse to the list of status effects undead chars are inmune
+ to. So far undead chars are inmune to Freeze and Stone Curse. [Skotlex]
+ * Fixed disp_hpmeter not working properly when set to 0/no [Skotlex]
+ * Added malloc_usage() for checking total memory used [celest]
+ * Added func_parse_table to assign a parse function according to SessionType
+ -- still not used anywhere yet [celest]
+ * Added 'SessionType' to session_data [celest]
+ * Some tidying up in charcommand.c [celest]
+ * Added temporary code for Shinobi's Rebirth skill [celest]
+ * Added guild exp overflow fix for TXT char [celest]
+06/14
+ * Various item_trade restriction fixes: [Skotlex]
+ - Fixed guild/normal storage flags not working right.
+ - Fixed a bug which allowed players to store items regardless of
+ restrictions.
+ - Modified the gm override level behaviour on trades so a high level gm
+ can both give and receive the otherwise untradeable item.
+ * Small fix to the sql-files/convert_guild_tables.sql script. [Skotlex]
+ * Modified function status_calc_speed to be faster since it's only used for
+ cloaking and freedom of casting. [Skotlex]
+ * Changed the stacking type from speed-bonuses to make it harder to reach max
+ walk speed. [Skotlex]
+ * Fixed a bug on the way aspd bonuses stack. [Skotlex]
+ * Changed map names length from 24 to 16 all over the char(txt/sq) and map
+ servers, this could fix the "matrix" bug (if done right...). [Skotlex]
+ * General cleanup and memory checks on char server (txt) [Skotlex]
+ * Miscellanous memory checks around charcommand.c and atcommand.c [Skotlex]
+ * Added Maeki's fix to Maeki's fix of SQL Char Server Guild Saving.
+ * Fixed characters not being able to uncloak
+ * Split used-by-plugins-only code to plugin.h [celest]
+ * Standardised plugin functions and names -- dll.c is now plugins.c, addon_athena
+ is now plugin_athena.conf and so on [celest]
+ * Updated UPnP plugin to 1.0.3.1 [celest]
+ - moved code in socket.c back into the plugin
+ - added configuration file support (plugins/upnp.conf) -- you'll need to do
+ 'make plugins' to install it
+ * Added 'make zlib' for compiling a zlib.dll [celest]
+06/13
+ * Fixed Asura Strike possibly doing minimal damage when it should do very
+ large damage instead. [Skotlex]
+ * Fixed another possible crash on chrif... [Skotlex]
+ * Applied Maeki's fix for Guild Sql Char server [Skotlex]
+ if it breaks, go stone him :X (I already got enough rocks to watch
+ out for...)
+ * Made berserk-cancels-users-other-self-buffs a battle_config
+ option, default: off [Aru]
+ * Some compiler warnings fixes [Skotlex]
+ * Added battle_config option equip_natural_break_rate. [Skotlex]
+ Default is 1 (0.01% chance).
+ * Changed sprinkle sand's range from 8 to 1. [Skotlex]
+ * Fixed map server failing to connect to char server... [Skotlex]
+ * Char-Sql server revision [Skotlex]
+ Miscellanous memory bounds/overflows checks/fixes.
+ * Fixed options start_armor/start_weapon (char sql) [Skotlex]
+ * Some more map server memory checks and cleanup (90%) [Skotlex]
+ * Fixed cloaking re-cloaking you instead of cancelling cloak. [Skotlex]
+ * Double Damage multiplier applied after vit/def reductions until further
+ information is available. [Skotlex]
+ * Restored previous speed stacking type until a fix for the new method can
+ be devised. [Skotlex]
+ * Removed MVP status from @summon'd monsters. [Valaris]
+ * Had the "monster target reset to none" code inside of check for the monster level up code, moved it out. [Valaris]
+ * Added update of mob hp display on monster level up if mob hp display and monster leveling are on. [Valaris]
+ * Added mob_clear_delay option to battle_athena.conf.
+ Can add a delay before sending monster death packet (time is in milliseconds and default 0 is off).
+ Increasing this can fix the problem with monster sprites still appearing after it died. Recommended value: 10. [Valaris]
+ * Fixed spawning multiple sized monsters via scripts. [Valaris]
+ * Added LittleWolf's mode 256 (0x100 internally) for monsters (adds detect hidden to a monster, doesn't have to be an MVP, demon or insect). [Valaris]
+ * Fixed bug allowing players to cast warp portal under players and other various invalid blocks. [Valaris]
+ * Removed talk conversion of Zherlthsh and Alice pets since clients now support them. Thanks to Kholdstare for pointing it out. [Valaris]
+ * Added "ORDER BY" statement to char-server SQL's reading of the memo db, fixing problems with people's memo lists
+ screwing up when they log back in. Not sure if this problem exists in TXT char-server as well. [Valaris]
+ * Map server memory cleanups... (85%) [Skotlex]
+ * Removed battle option "enemy_critical" [Skotlex]
+ Use enemy_critical_rate=0 instead.
+ * Changed the default of enemy_critical_rate to 0 [Skotlex]
+ * Ported oA's imalive and flushtimer system to eAthena plugin 'gui' [celest]
+ - You will only need the plugin if you are using a gui program like wxOAGUI
+ to run Athena
+ - To configure it check addons/gui.conf
+ - Passing "--gui" as a parameter, i.e "./map-server --gui" will activate it
+ as well (GUI program creators, you should handle this transparently)
+ * Added get_uptime to timer.c -- used by @uptime and the 'sig' plugin [celest]
+ * Merged the 'uptime' plugin into 'dump' and renamed to 'sig' -- it'll now
+ handle both crash and uptime logging [celest]
+ * Guild SQL updated again, `exp` and `next_exp` to BIGINT UNSIGNED [CLOWNISIUS]
+ * Updated the guild_upgrade made sure UNIQUE KEY guild_id is implemented [CLOWNISIUS]
+ * Pets no longer lose intimacy when you die on a nopenalty map [Aru]
+06/12
+ * Removed the dynamic mob messages (mobs spawned/removed) from default output [Skotlex]
+ (Use battle_config etc_log to enable them again)
+ * Fixed sql-files/convert_guild_tables.sql so that it actually works [Skotlex]
+ (works only on non-modified guild tables previous the new guild system)
+ * Small nullpo fix on @where.
+ * Fixed new account flood protection blocking _M/_F registration (txt/sql) [Skotlex]
+ The bug? The default disallowed time was 1 registration every 10K secs.
+ * Found & fixed the bug that was causing server instability on clif.c [Skotlex]
+ * Cloaked characters will uncloak on attack/skill-use [Skotlex]
+ * Fix on aspd_rate affecting skills not working [Skotlex]
+ * Miscellanous small fixes in map server. [Skotlex]
+ * The new attack function is now the unchangeable default. [Skotlex]
+ * Updated double_rate (side-winder) behaviour. [Skotlex]
+ It no longer adds to double attack's skill rate, instead the higher of
+ the two will be used on the currently equipped weapon.
+ * Dec Agi now cancels Cart-Boost and viceversa as explained by Ishizu [Skotlex]
+ * Cloaked characters now can't pick items. [Skotlex]
+ * Made the max speed rate a battle_config option, default 300% [Skotlex]
+ * Fixed the overflowed valstr free on skill.c:8840 [Skotlex]
+06/11
+ * Lord Knight's Beserk now cancels all the caster's other
+ self-buffs when used. It also cannot be re-used during the
+ no-SP-recovery penalty period after it expires. (This penalty
+ will now cancel on your death however.) [Aru]
+ * Reverted the previous stacking type for aspd as per rodatazone
+ information [Skotlex]
+ Speed modifiers, however, still stack on the new way as there's been
+ complains of characters reaching impossibly high walk speeds.
+ * Modified bAspdAddRate code so that it stacks linearly. [Skotlex]
+ * Changed default stacking type for skill modifiers [Skotlex]
+ If you have +50 aspd and +50aspd you won't get 100% aspd, instead now you
+ get 50% of the 50%, that is 75% aspd bonus. Changed meant to protect
+ against stacking skills to get impossibly high walking speed/attack
+ speeds.
+ * Modified the way bAspdRate & bSpeedRate work. [Skotlex]
+ They are meant to be non-stackable, so only the card/equipment with the
+ highest bonus prevails.(items with stackable bonus should use
+ bAspdAddRate & bSpeedAddRate instead.)
+ * Changed the DoppelGanger Card definition from bAspdRate to bAspdAddRate
+ to make it stackable. [Skotlex]
+ * Capped walkspeed at 4x default [Aru]
+ * Added Maeki's awesome convert_guild_tables.sql
+ You must still manually add the `char_id` field to the `guild`
+ table and fill it with the guildmasters' char_ids BEFORE
+ running it. [Aru]
+ * Removed inter_guild_storage_delete calls from int_guild,
+ innodb tables make it unneccessary [Aru]
+06/10
+ * Updated the default pet_db.txt support values [Skotlex]
+ We don't have an official list of the support rates, but 1% as default
+ (1.5% if they have max intimacy) is just ridiculous.
+ * More map server memory cleanups... (70%) [Skotlex]
+ * Fixed that crash upon login.... [Skotlex]
+ * More map server memory cleanups... (45%) [Skotlex]
+ * More map server memory bound cleanups and checks (35%) [Skotlex]
+ * Fixed Stalkers being able to use (plagiarized) ground-target
+ skills from Chase Walk
+ * Fixed come confusion between MVPs (status_get_mexp) and
+ mini-bosses (mode & 0x20) in battle.c
+ * Added battle_config option item_use_interval with default 500ms [Skotlex]
+ * Started map server memory bounds checking for overflows (20%) [Skotlex]
+ * Small optimizations on ensemble skills [Skotlex]
+ * Fixed some compile warnings on char-sql server [Skotlex]
+ * Added script function getitemslots(item_id); [Skotlex]
+ * Fixed a bunch of script functions generating a new dummy item instead of
+ failing when the item was not found. [Skotlex]
+ * Fixed mobhp display so that it will be displayed no matter which /showname option a player is using. [Valaris]
+ * Fixed names with disguises (I tested it. It works. No more bitching. :P). [Valaris]
+ * Completely overhauled SQL guild code to use innodb type tables
+ unfortunately, old guild tables are not compatible.
+ If you don't mind the data loss, wipe your current guild
+ tables and run guild_tables.sql to create new guild tables.
+ [Aru and CuteBoi]
+ * If you want to manually convert your old guild tables, you'll
+ need to add the foreign keys from guild_tables.sql to the
+ databases. And add the `char_id` field to the guild table.
+ Its value needs to be the char_id of the guildmaster [Aru]
+ * Added 'alchemist' mob skill condition [celest]
+ * Rewrote most of the old jA Self Destruction code [celest]
+06/09
+ * Fixed a possible null_po in clif.c:7714 caused by lagged clients [Skotlex]
+ * Fixed enemy damage_delay being modified by 400 instead of 100. [Skotlex]
+ * Changed behaviour of map_freeblock/map_freeblock_unlock as the previous
+ way seems to cause memory leaks. [Skotlex]
+ * Tidied up code relating to skill_get_inf2() [Skotlex]
+ * skill_db.txt updated. New inf2 values: [Skotlex]
+ 16: Guild skill, 32: Song/Dance skill, 64: Encore skill
+ * Other misc arrangements to skill_db.txt (see db/Changelog) [Skotlex]
+ * Tidied up code relating to skill_get_nk() [Skotlex]
+ * Readded the previously removed skills from item_db [Skotlex]
+ * getpetinfo(2) will return "null" on no pet. [Skotlex]
+ * Tidied up code relating to skill_get_inf() [Skotlex]
+ * Some small fixes to @grind, @useskill [Skotlex]
+ * Added fist (bare hands) to the list of unbreakable equipment in
+ pc_break_equipment [Skotlex]
+ * Reestructured battle_config options for equipment breaking [Skotlex]
+ Removed equipment_breaking and added equip_self_break_rate,
+ equip_skill_break_rate. Read battle_athena.conf for more info.
+ * Fixed getpetinfo(2) crash. [Skotlex]
+ * Added a couple missing lines from my PSIBlade merge of disguises. Name, attacking
+ and such are fixed now with disguises. [Valaris]
+ * Added battle_config option to set if advanced job skills may be plagiarized
+ * Fixed ASC_BREAKER to ignore race/size/element cards like it should
+ * Changed @fakename so it no longer needs to teleport the client to work [celest]
+ * Removed the old day/night system that uses the blind effect [celest]
+ * Fixed day/night cycles with darkness_level on not refreshing properly [celest]
+ * Fixed pc_follow_timer cancels if the player or the target warps [celest]
+ * Added @follow on the same target for the 2nd time will stop following [celest]
+ * Added Memory manager will perform a hash check when freeing memory, by
+ End_of_exam / jA 1213 -- fixes crashes when a pointer created by level 2 ALLOC
+ is passed to level 1 aFree
+06/08
+ * Updated idle time considerations. [Skotlex]
+ A character's idle time is reset upon: Walking, attacking (auto-attack
+ counts too), using a skill or using a item.
+ * idle_no_share changed from a Yes/No setting to # of seconds before
+ considering character idle (no/0 still disables). [Skotlex]
+ * Updated idle_no_share description in battle_athena.conf
+ * Modified @disguise so that it will always work with Npc/Mob names and Mob
+ Ids. Only npc by id is hardcoded for now. [Skotlex]
+ * Added atcommands cleanmap, npctalk, pettalk to atcommand_athena.conf with their
+ description. [Skotlex]
+ * Fixed spawn delays for anthell eggs [Skotlex]
+ * Removed equipment_breaking, use equipment_break_rate = 0 instead.
+ [Skotlex]
+ * Clarified some of the comments in battle_athena.conf [Skotlex]
+ * Steal/Snatcher won't work on summoned creatures now. [Skotlex]
+ * Some db updates (see db/Changelog) [Skotlex]
+ * Fixed rude_attacked state not being reset after triggered, credits to
+ Komurka [Skotlex]
+ * GM used Type 11 items will be exempt from the "GMs can do whatever they
+ want" rule regarding skill_usage because otherwise the used item is never
+ consumed. [Skotlex]
+ * Fixed Ice Falchion/Firebrand giving skills, they just cast the spell [Skotlex]
+ * Reduced Ice Falchion's freezing chance from 5% to 1% [Skotlex]
+ * Added Makefile caching [celest]
+ 'Makefile.cache' is created when you compile for the first time, and keeps
+ all your makefile definitions so it can be read directly when you recompile,
+ instead of redetecting things one-by-one.
+ 'Make [char_sql/login_sql/map_sql]' will now work properly too.
+ NOTE: A cache file created by compiling txt is NOT compatible with SQL, but
+ a cache created by SQL is compatible with TXT! Delete the cache file first
+ and compile SQL before TXT if you have to.
+ * Skills will reset at level down. [davidsiaw]
+06/07
+ * Temporary change of the way mob memory is removed when they don't have a
+ respawn time (check for memory leaks fixed after killing all summoned mobs)
+ [Skotlex]
+ * Fixed map_quit being called twice when a player requests to change char [Skotlex]
+ * Fixed compile issues on various versions of linux
+ (please avoid inline in include files until we offically go
+ over to being a c++ app) [MouseJstr]
+ * Fixed aFreed messages of double freeing sd->reg and sd->reg_str [Skotlex]
+ * Re-fixed sql-files/item_db.sql [Skotlex]
+ * Plagiarism won't work if the skill to be copied killed you. [Skotlex]
+ * Removed use of 'l' as prefix for temporary variables. [Skotlex]
+ * Updated max hair styles in battle_conf to 23 [Skotlex]
+ * Updated map server to jA1159~1203 [celest]
+ - Added imbueing weapons with random element (with bonus bAtkEle,10;)
+ - Added Soul Strike do additional damage on undead
+ - Added Grand cross will not damage self when cast by mobs
+ - Added Cannibalize & Marine Sphere summoned mobs will use their owner's name
+ - Added clean up player info when switching characters
+ - Added reinitialise storage when char server disconnects
+ - Changed some cloaking/chasewalk checks
+ - Fixed memory leak when map cache reading has an error
+ - Fixed a bug when receiving member info for an empty guild
+ - Skip still connecting players in clif_foreachclient()
+ * Weather will now properly appear/disappear without having to refresh the client. [Valaris]
+ * Complete monster disguise re-code: [Valaris]
+ -No more client crashes in PVP caused by disguises.
+ -Can view own attack/hit/cast/sit/turn animations.
+ -Monster sprite syncs up better than before.
+ -Fixed stat dupe exploit with disguises.
+ -Fixed crashes that prevented peco riders with disguises.
+ -No more refreshing of the screen when equipping/unequipping disguises.
+ * Fixed crashes caused by Graffiti Cleaner. [Valaris]
+ * Added following missing checks to Ensembles: [Valaris]
+ -Partner's equipment is an instrument.
+ -Partner is alive.
+ -Partner is not casting another skill (This allowed dance floor panel duping).
+ -That both people are in a party (before if both partner's were in no party (party ID 0)
+ it would allow them to use an ensemble.
+06/06
+ * Fixed and updated sql-files/item_db.sql to match with the current
+ db/item_db.txt [Skotlex]
+ * Removed variables with prefix "l" being treated as a temporary
+ variables by the scripting engine. [Skotlex]
+ * Updated description of idle_no_share battle_config option [Skotlex]
+06/05
+ * Added more debugging information to login-in characters to track down the
+ authook nullpo problem. [Skotlex]
+ * Added a temporary string length check on trade-request. [Skotlex]
+ (reports seem to indicate that the map-server garbage text bug could be
+ related to trading string length overflow, check the map-server output
+ for "name too long" messages).
+ * Fixed a few Visual Studio compile errors and warnings - not completely fixed [Codemaster]
+ * prevent_logout is now overriden by dead characters. There's no point in
+ waiting 10 secs since you were killed to quit/change character. [Skotlex]
+ * Passive mobs will now unlock their target once it's dead/gone too
+ far/in another map. [Skotlex]
+ Passive mobs are supposed to be defensive, not vengeful. Do report of any
+ abuses that might be possible from this to take proper measures.
+ * Fixed pet lures always failing (oops) [Skotlex]
+ * Corrected Various Jur's (id 1264) equip script to bonus2 [Skotlex]
+ * Fixed status_get_speed always returning 1000 when invoked on NPCs [Skotlex]
+ * Added battle_config option pet_support_min_friendly [Skotlex]
+ Specifies minimum pet intimacy/friendly value needed before attacking.
+ Default 900, see battle_athena.conf for more information.
+ * Some reorganizing of pet-catching code [Skotlex]
+ * Now mobs will do the /ag emotion when you use a lure on them and they
+ can't be caught (wrong lure, or mob not in the mob_db.txt). [Skotlex]
+ * Fixed a timer mismatch situation with pc_walk timers [Skotlex]
+ * Re-structured the pc_follow_timer code [Skotlex]
+ * Updated the pet_heal_timer code to match behaviour with
+ pet_supportskill_timer's one [Skotlex]
+ * Added support for universal lure. [Skotlex]
+ Use use_script "pet 0;" to create an item that will catch any non-boss
+ mob (will work as long as said mob has an entry in mob_db.txt, of course)
+ From what I read in the code, mapping multiple entries in mob_db.txt to
+ the same egg_id should work, so it should be possible to have all mobs as
+ pets using a single egg_id item and this custom lure.
+ * Updated Weapon Repair from jA 1228 [celest]
+ * Fixed TXT char disconnecting when sent a server packet from SQL map [celest]
+ * Fixed login failing with md5 encryption, thanks to End_of_exam
+ * Fixed lock_fclose() failing in Win32 builds, thanks to End_of_exam
+ * Updated sql-files/mob_db.sql to match with db/mob_db.txt [Skotlex]
+ * Corrected Zherlthsh's and Alice's attack animation speed (mob_db.txt) [Skotlex]
+ sql-users can use upgrade_svn2068.sql to update table mob_db.
+ * Re-fixed disp_hpmeter not getting disabled when set to 0/no [Skotlex]
+ * Fixed Grandcross/DarkCross to do 3 hits instead of 4 [Skotlex]
+ * Fixed #fakename =). [Kevin]
+ * Tidied up and rearranged Makefile a bit [celest]
+ - added 'make [common/map/login/char] options' -- only for txt though ^^;
+ - readded sse, mmx and o3 optimisation flags (disabled by default) -- you'll
+ have to edit and enable them yourself
+06/04
+ * Moved @charchangesex to #changesec *still disabled*. [Kevin]
+ * Fixed a major security hole in the mail system, thanks to Valaris for the info =). [Kevin]
+ * Moved @charsk/stpoint to #sk/stpoint. [Kevin]
+ * Moved @charmodel to #model. [Kevin]
+ * Moved @charst/skreset to #st/skreset. [Kevin]
+ * Re-updated sql-files/item_db.sql to use price buy/sell NULL instead of 0 [Skotlex]
+ The file is full of REPLACE instead of INSERT, so if you already have the
+ structure of the table right, you can just delete the table definition
+ and apply the file to update your item_db table.
+ * Commented out char_athena.conf. [Kevin]
+ * Moved @charlostskill to #lostskill. [Kevin]
+ * Moved @charquestskill to #questskill. [Kevin]
+ * status_change_start will halt silently instead of printing null_po messages
+ when trying to apply status effects on pets [Skotlex]
+ (Fixes null_po's from pets doing magnum break and who knows what other
+ skills)
+ * Moved #showexp and #showdelay to @showexp and @showdelay. [Kevin]
+ * Moved @charjoblvl and @charbaselvl to #joblvl and #baselvl. [Kevin]
+ * Readded the cloth dye packet upon-walk. Sorry about that [Skotlex]
+ * Fixed Party Exp Even Share [Skotlex]
+ * Added #fakename, due to popular demand =)[Kevin]
+ * Clothe dye is updated now on view_class change [Skotlex]
+ Most noticeable effect: Dye is not lost un unequipping a tuxedo/wedding dress.
+06/03
+ * Updated sql-files/item_db.sql to match with the current db/item_db.txt [Skotlex]
+ * Added some initialization code regarding dynamic mobs during map startup. [Skotlex]
+ * Fixed the typo on Thief's Sling Stone quest (Zargon->Garlet) [Skotlex]
+ Why noone fixed this before? o.O
+ * Removed a piece of code that updates your cloth's dye whenever you walk.
+ I have been testing for a bit, and this piece of code seems unneeded, and
+ not only that, it causes quite a bandwidth penalty by sending
+ dye-changing packets every time every character walks! [Skotlex]
+ If you get reports that the characters are getting displayed their
+ default color instead of their selected dye, report it so I add back that
+ piece of code (but it would be best if we could do without it, it would
+ save quite some bandwidth).
+ * Some compiler fixes in older versions of GCC, thanks to esca.
+ * Some optimizations to petskill_use [Skotlex]
+ * Fixed the default max hair dye color count, it is 8, not 9 @.@ [Skotlex]
+ * Changed disp_hpmeter's behaviour so that you can disable it by setting it
+ to "no" or 0. [Skotlex]
+ * Fixed gm chat kick protection. [Skotlex]
+ * 'Tidied' a bit party_exp_share (more like restructured it). [Skotlex]
+ * Re-added party_idle_no_share code. When was it removed? [Skotlex]
+ * Added skills going damanage when PVP isn't on fix. [Kevin]
+ * Fixed the party-even-share bonus for large parties. [Skotlex]
+ * Fixed gm chat kick protect.[Kevin]
+ * GM of higher or equal level can use @where on another GM.[Kevin]
+ * Fixed @fakename command.[Kevin]
+ * Stopped the map-server from invoking "OnAgitStart" each time it connects
+ to the char server. [Skotlex]
+ * Modified Abracadabra code to make it work with Pet Skills [Skotlex]
+ (Warning: Not yet tested)
+ * fixed a bug with Abracadabra
+06/02
+ * fixed compile issues on older gcc, thanks to esca [Shinomori]
+ * Added @size and @fakename gm commands. [Kevin]
+ * Added valaris's getstrlen and charisalpha functions into the script parser. [Kevin]
+ * Added clif_guild_xy(_remove), rest needs to be added somewhere. [Kevin]
+ * Fixed items lost on shutdown/crash, by valaris. [Kevin]
+ -Note: Was partially finished by massdriller =).
+ * A few things: [Kevin]
+ -Fixed valaris's gms can't be kicked function.
+ -Added battle_config option for valaris's function.
+ -Added battle_config option for gms can join password protected chats of valaris's .
+ * Moved "readme"'s and other non important files into doc/notes/ [massdriller]
+ * Cleanup in chat.c, party.c, storage.c [celest]
+ * Fixed an inconsistent message for log_chat in conf file reading [celest]
+ * Fixed mob class changing not checking array bounds, by Shinomori
+ * Fixed mob summoning slaves not checking array bounds, by Shinomori
+ * Updated max packets in clif.c [celest]
+ * Fixed some compile time warnings. [Kevin]
+ * Added GM chat kick protections, thanks to Valaris [massdriller]
+ * Added Password protection chat rooms access to gms, thanks to Valaris [massdriller]
+ * Fixed a couple of things in map.c, thanks to Valaris [massdriller]
+ * Storages now saves upon closing, thanks to Valaris [massdriller]
+ * exp share and added zeny share/party bonus exp thanks to Valaris [massdriller]
+06/01
+ * Fixed Divest Shield and Divest All not able to strip shields [DracoRPG]
+ * Changed the default max_hitrate to 100% as specified in rodatazone [Skotlex]
+ * Removed the console messages printed when the script command getmapxy is
+ invoked [Skotlex]
+ * Fixed non-droppable items blocking the client from further droping
+ other items [Skotlex]
+ * Changed the default of mob_remove_delay to 5 mins [Skotlex]
+ * Changed the minimum mob_remove_delay to 15 secs since mobs with instant
+ respawn actually take 5~10 secs to respawn [Skotlex]
+ * Fixed again disp_hpmeter, it looks like this time it works properly. [Skotlex]
+ * Added Esca's fixes to make eA properly compile under Sun-OS [Skotlex]
+ * Tested and fixed script function getnameditem [Skotlex]
+ Now you can use getnameditem(item,char) to get inscribed equipment (only
+ works with what you can equip, arrows excluded). The item description can
+ be the item id or the item name, and the character can as well be the
+ character id or character name. Function returns 1 if successful and
+ the character who's name is to be inscribed HAS to be online.
+ * Changed the way dynamic mobs are removed. Now all mobs have are tagged as
+ either cached/uncached, and only those cached are removed [Skotlex]
+ Mob-Slaves are the only non-cached enemies that are also tagged as
+ cached.
+ * Fixed a delete_timer mismatch in pet.c [Skotlex]
+ * Fixed some compile time things in older versions of gcc. [Kevin]
+ * Removed the clif message when you can't drop items [Skotlex]
+ Apparently this message breaks the clients and prevents further drops of
+ items? Might need further testing.
+ * Changed AspdRate and SpeedRate bonuses so they can stack [DracoRPG]
+ * Added script function getnameditem [Skotlex]
+ syntax: getnameditem itemid, inscribed char's name
+ Needed at least for wedding scripts. Only works on equippable items,
+ returns 1 on success, always makes only 1 item.
+ (it should also be able to use char's id or item's name instead)
+ Script function proof-read but not yet tested, so it might have a bug or
+ two, use at your own risk for now.
+ * Fixed dynamic mobs removing Guardians [Skotlex]
+ * Fixed sql queries in logs giving an error. [Kevin]
+ * Fixed @memo ignoring the nomemo map flag, thanks to Maeki. [Kevin]
+ * Enabled an account flood protection system defaulting to 1 account every 10 seconds. [Kevin]
+ * Corrected dynamic mob unloading to remove slaves. [Skotlex]
+ * Added Maeki's fix for handling the sql connection to the log server [Skotlex]
+ * A reminder to people who seem to have a broken item_db (wrong item
+ sprites, doing nothing on click, etc): there was an update to item_db
+ some days ago, a new column which is used to determine refineable
+ items (which goes between eLv and View) The shipped item_db.txt is
+ already updated, but if you have custom files, you can try updating
+ them using the gawk line (further below this changelog) or this short
+ sed command (from within the db directory):
+ gsed -re 's/([^,]*,){16}/&,/' < item_db.txt > item_db.fix
+ And then replace item_db.txt with the newly created file (if ya don't
+ have gsed, try sed. All *nix should come with one or the other, and you
+ can also get it with cygwin)
+ * Moved the dynamic mob spawns/deletes to map_addblock/map_delblock [Skotlex]
+ This pretty much guarantees that mobs won't be spawned/deleted twice from
+ the same map.
+ * Added random's battle_config flag for enabling/disabling dynamic mobs [Skotlex]
+ Dynamic mobs is good for medium to small servers, but on large ones it
+ gets to be somewhat pointless.
+ * Fixed disp_hpmeter, I think (can't test it, but the code looks ok) [Skotlex]
+ * Added battle athena option mob_remove_delay [Skotlex]
+ Now dynamic mobs are not removed inmediately, but after some time has
+ passed. Default value is 60 secs
+ * Added debugging information about dynamic mobs [Skotlex]
+ Helps keep track of how many mobs are being removed/spawned, use it to
+ track any possible bugs! Should be removed after dynamic mobs are good
+ enough.
+ * Some changes to dynamic mob unloading to avoid remove summoned mobs and
+ always remove mob slaves. [Skotlex]
+ * Fixed a nasty pc.c bug thanks to komurka [massdriller]
+ * Added Sasuke's modification to allow certain gm levels to see the
+ hp bars [massdriller]
+
+05/31
+ * Added Einbroch mobs to dead branch DB [Arutema]
+ * Fixed NPC Typo [Codemaster]
+ * Updated help.txt, fixed a compile time warning on BSD systems. [Kevin]
+ * @marry auto-gives named rings, removed @rings as in-needed [Arutema]
+ * Fixed some compilation errors in BSD systems. [Kevin]
+ * Restored dynamic mob cleaning to what it was a couple of nights ago
+ Should send the system back before all hell broke loose. [Skotlex]
+ * Added battle_config options min_hitrate & max_hitrate [Skotlex]
+ These only affect the new attack function, and th defaults are 5%-95%
+ * Added client-messages for when an item can't be drop/stored [Skotlex]
+ * Finished implementing the "optimization" item_trade.txt [Skotlex]
+ * Optimised the long forgotten MVP arena [massdriller]
+
+05/30
+ * Rewrote the trade-add-item function, it was hella messy [Skotlex]
+ * Updated item_trade.txt implementation [Skotlex]
+ GM-override lv is still to be implemented.
+ Code has been reviewed, but not actually tested yet, use with caution.
+ * Fixed fame list first loading, at server startup [DracoRPG]
+ * added lordalfa's @me action command [massdriller]
+ * Reverted changes to dynamic mob removal, now all mobs are removed [Skotlex]
+ mob_remove_damaged is still respected.
+ * Partial implementation of item_trade.txt, not quite finished yet [Skotlex]
+ * Fixed mob_remove_damaged [Skotlex]
+ * Added two new battle_athena options: [Skotlex]
+ show_hp_sp_drain (yes/no): displays drained hp/sp from attacks (ie:
+ Hunter Fly Card)
+ show_hp_sp_gain (yes/no): displays gained hp/sp from killing mobs (ie:
+ Sky Deleter Card)
+ * bHPGainValue, bSPGainValue will only display gained hp/sp when said
+ gain is above 0. [Skotlex]
+ * Changed hp_dispmeter from yes/no to GM-level [Skotlex]
+ Note that now the default value is hp_dispmeter: 100
+ * Fixed item_avail.txt reading could crash on newline [celest]
+ * Speedup and fixed @reloaditemdb messing up inventory data [celest]
+
+05/29
+ * Optimised job quests scripts [massdriller]
+ * Fixed guild expulsion bug, two chars on same account would be expelled. [Kevin]
+ * Dynamic mob unloading won't touch mobs with a deletetimer now [Skotlex]
+ this affects mobs scheduled to be removed (including @summon mobs)
+ * Dynamic mobs now also removes mobs that have a master [Skotlex]
+ * Fixed Knockback skills on the new attack function [Skotlex]
+ * Rewrote the vitality reduction equation in the new attack funcion [Skotlex]
+ The new equation conforms to rodatazone's information here:
+ http://rodatazone.simgaming.net/mechanics/substats.php#def
+ * Fixed item_db.txt to contain the new refinable column [Skotlex]
+ (I accidentally commited the old item_db last time...)
+ TXT users with custom items can update their custom db using gawk (*nix
+ or under Cygwin) this way (thanks to Sasuke):
+ gawk -F, '{ for (i=1; i<= NF; i++) { if (i==16) { printf $i; printf ",";printf ","; } else if ( i==NF ) { print $i; } else { printf $i; printf ","; } } }' db/item_db2.txt > item_db2.new.txt
+ Run it from within the root eAthena directory, and you'll get an updated
+ item_db2.txt in your root directory. However, all custom items are not
+ refineable by default this way, you still have to set to 1 the refineable
+ column where it applies on your custom item_db.
+ * Improved uptime checking, by Shinomori
+ * Improved calltable import/exporting, by Shinomori
+ * Standardised init/finalise functions' names [celest]
+ * Fixed SVN version display at client connection, thanks to Maeki [DracoRPG]
+ * Prevented Snatcher to try stealing players and already stolen mobs, thanks to shadow [DracoRPG]
+ * Fixed Parrying and slightly organized status_change_start [DracoRPG]
+ * Removed fame list update timer and made it to refresh the list everytime pc_addfame is ran [DracoRPG]
+
+05/28
+ ~ Name of NPC file in map_athena.conf is now scripts_main.conf
+ ~ Added a new column to item_db.txt/item_db2.txt: refineable [Skotlex]
+ The column goes between equip_level and view, use upgrade_svn1863.sql
+ to update sql tables (including item_db2.txt). Custom item users of txt
+ servers will have to update manually.
+ When the column's value is 0, NULL (sql) or blank (txt), the item can't be
+ refined.
+ OLD ITEM_DBS WILL NOT WORK WITH THIS NEW UPDATE, update your custom
+ items!
+
+ * Fixed a crash bug in pet_heal_timer on timer mismatch. [Skotlex]
+ Thanks to Celest for noticing it out.
+ * Fixed the critical attacks bug in the new attack function. [Skotlex]
+ * Added MassDriller's updated readme.html files. [committed by Skotlex]
+ * Fixed script_athena.conf reading of "event_requires_trigger". [Skotlex]
+ It was looking for "require_set_trigger" instead of
+ "event_requires_trigger", which effectively ignored the
+ event_require_trigger's value. Logout events should now be usable without
+ the need of a global variable.
+ * Registered all used timer functions to help debugging [celest]
+ * Added -DMINICORE to compile core.c (for converters and ladmin) [celest]
+ * Removed most unused code and files in char and login converters [celest]
+ * Moved converters to /txt-converters [celest]
+ * Some tidying up in core and socket.c [celest]
+ * Fixed a bug in the new attack function dealing with dual-wielding [Skotlex]
+
+05/27
+ * Removed YET AGAIN the mob's skill_idle_flag function. [Skotlex]
+ Komurka updated the mob_skill_db so that it is not needed anymore.
+ * Modified the critical equation on the new attack function [Skotlex]
+ The original equation ((1 + LUK*0.3 + EquipmentBonuses) * CritModifier -
+ TargetLuk/5) was meant for official servers, where mobs don't do
+ criticals. If applied to mobs, they get very high critical rate, so the
+ luk reduction was bumped up to TargetLuk*3/10 on situations where a player
+ is targeted by a mob.
+ * Re-Applied the idle_skill_flag [Skotlex]
+ It was removed because people said it was broken, however it works
+ exactly the way Komurka explained it to me:
+ A mob can cast only one idle skill, and can't do another one until it
+ moves. If the mob casts too many idle skills because it
+ casts/moves/casts, then increase the skill's delay in the database! If it
+ still does "not works", drop me a line explaining why, because it works
+ exactly as I was told it should.
+ * Small adjustment of the critical equation in the new attack function [Skotlex]
+ * Fixed some crashes related to pet skills and timers [Skotlex]
+ * Fixed 1 delete_timer error with pc_stopwalking [celest]
+
+05/26
+ * Tidied up mob.c and map.c a bit [celest]
+ * Removed rehash() in atcommand.c [celest]
+ * Fixed @reloadscript issue with dynamic mobs [celest]
+ * Added flush fifos first before reloading in @reloadscript [celest]
+ * Added spawn mobs with 1 second delay instead if moblist is full, by Shinomori
+ * Fixed wrong name saved when adding friends, thanks to Maeki
+ * Fixed itemhealrate stackable, thanks to starlon
+ * Set the new_attack_function to be used by default. [Skotlex]
+ This function replaces the three previously used functions (pc/mob/pet)
+ into a single one which was rewritten to follow the attack algorythm as
+ described in http://rodatazone.simgaming.net/mechanics/attacks.php
+ Please report any inconsistencies or strange behaviour that this new
+ function brings (only affects physical attacks/skills) on the boards.
+ If anyone can do some performance comparisons with the old method, that'd
+ be useful too.
+ If you absolutely don't want to test it and prefer the old method, in
+ battle_athena.conf add a line that goes:
+ new_attack_function: no
+
+05/25
+ * Fixed typos in Absorb Spirits, Double Casting and Tarot Card, thanks to Komurka
+ and Avaj
+ * Added missing code for Flasher, thanks to Komurka
+ * Fixed a string bug in grfio_resnametable [celest]
+ * Updated the readme files to the current statistics. [Mass Zero]
+
+05/24
+ * Added 'make addons' -- plugins will not be compiled by default now [celest]
+ * Ported uptime logging function to eAthena plugin [celest]
+ * Ported pid file creation function to eAthena plugin [celest]
+ * Ported stackdump creation function to eAthena plugin [celest]
+ * Added capability to export to plugins [celest]
+ * Fixed ensemble skills, thanks to Komurka
+ * Fixed Dissonance damage, thanks to shadow
+ * Reverted db/pet_db.txt to it's original form. [Skotlex]
+ The pet skills shipped with eA should be as close as possible to the
+ original servers. If you prefer the current custom skills in place just don't
+ update the pet_db.txt file.
+` (Somehow my custom pet skills table got updated to svn and I didn't notice
+ it ^^')
+
+05/23
+ * Fixed a few problems wit Dynamic Mobs [Wizputer]
+ Increased max mobs per map from 32 -> 128
+ Fix mob unloading
+ Special Mobs w/ Spawn delays are exempted (MVPs, Gaurdians, Branches, and summoned)
+ Added Option for damaged mobs not to be removed in battle config ( Default yes )
+ * Mob count in scripts returned 1 less then it was supposed to. [Kevin]
+ * Updated tool/stackdump script to support eA's own stackdumps [celest]
+ - Type ./stackdump help to check
+ * Changed mob_cleanup_sub simply to cleanup_sub [celest]
+ * Fixed some memory leaks with dynamic mobs [celest]
+ -- notes: Check bugs.txt
+ * Fixed some compile warnings in gcc 4.0 [celest]
+
+05/22
+ * Added Jbain's server restarter bat files. [massdriller]
+ * Drastically Improved Memory usage by making mobs dynamic [Wizputer]
+ Mobs load only when a PC is present on the map
+ Mobs that have special spawn delays are not loaded/unloaded
+ ( Reduced memory usage by 60% for 419 Maps )
+ * FIFO size fixes [Shinomori]
+ * Fame point system now uses pc_addfame [DracoRPG]
+ * Added support for new NPC sprites in @disguise, thanks to akusarujin [DracoRPG]
+ * CharSQL: changed the init / login connection issue, now 'online'
+ players will be set offline in login @ start / login reconnect [Sirius]
+
+05/19
+ * Fixed displaying new when char_new is set to one and changed the option to char_new_display. [Kevin]
+ * Fixed mysql fix. [Kevin]
+ * Fixed a previous fix with pet idle skills, needs db update not hard coding. [Kevin]
+ * Fixed mysql queries to support the following: [Kevin]
+ -Names now support the ' character
+ -Runs faster because querying string fields doesn't do strlen.
+ -Debug option to revert back to old debug queries, will disable the support of the two above.
+ * Added No Dead Branching Mapflags in cities [massdriller]
+ * Fixed Asura Strike to need only 1 spiritball if used after Chain Crush [celest]
+ * Added Asura Strike can be chained after Tiger Fist [celest]
+
+05/18
+ * Fixed up character creation, txt supports three status error and char_new is now enabled. [Kevin]
+ * CharSQL: fixed the Delete Char issue, now it's using the sd->email instead if the sql email [Sirius]
+ * Removed status points adding can be limited via gm level [celest]
+ * Removed double clean up when char server disconnects from map [celest]
+ * Removed 'mysql_real_escape_string' usage in SQL char until it'll no longer cause
+ crashes [celest]
+ * Added signal handler for SIGXFSZ [celest]
+ * Fixed some compile errors [celest]
+ * Fixed broken status changes [celest]
+ * Fixed Max Overthrust not working [celest]
+
+05/17
+ * Fixed null pointer in map.c. [Kevin]
+ * Fixed on a compile time error in status.c/h [Kevin]
+ * Fixed an invalid pointer in clif.c [Kevin]
+ * Removed 'Agi Up' visual effect from Berserk [DracoRPG]
+ * Tidied up npc.c a bit [celest]
+ * Added crash check in SQL char creation [celest]
+ * Changed Marionette Control's inf type [celest]
+ * Added infinite emperium/guardian hp fix, thanks to random
+
+05/16
+ * Fixed a slightly large inefficiency and bug in clif_foreachclient thanks to Sasuke-! [Kevin]
+ * Fixed a bug in minimap thanks to Komurka. [Kevin]
+ * Added mysql_real_escape_string() while creating a new character
+ - Might fix a few character names if you have no restrictions [Codemaster]
+ * Fixed 'rudeattacked' skill condition, thanks to Komurka
+ * Replaced zlib_win32.h and zconf_win32.h with the v1.2.2 files in /zlib [celest]
+ * Ported zlib.dll loading to eAthena plugin form [celest]
+ * Fixed some NPC skills acquirable by @allskill [celest]
+ * Merged sigpipe's handler with sig_proc [celest]
+ * Optimised timer.c a bit (partially from Shinomori's changes) [celest]
+ * Fixed up some more null pointers. [Kevin]
+ * Added Chat-Logging (for Whisper, Party and GuildChat!) [Sirius]
+ - Sql Log Users please upgrade: sql-files/upgrade_svn1759.sql
+
+05/15
+ * Minor bug fix by NSSTrunks
+ * Added Shinomori's MakeWord, MakeDWord and GetWord functions to split a 'long' into
+ 'short' & assemble 'short' into 'long', used for produced items and pet eggs [DracoRPG]
+ * Fixed famous player's produced items not giving bonuses if the producer had a too long
+ character ID (exceeding 'short' capacity and then stored both in card2 and 3) [DracoRPG]
+ * Added gm command symbol checks for atcommand/charcommand.c, thanks to akusarujin
+ * Added valid session check in clif_additem, thanks to Sasuke
+ * Fixed a heavy memory leak with the Memory Manager, by Shinomori
+ * Fixed a memory leak with empty scripts, by Shinomori
+ * Removed npc unloading via npcname_db finalising -- fixes some wild frees [celest]
+ * Fixed monsters' attacked_count never cleared if it successfully casts a skill
+ from 'rudeattacked' condition [celest]
+ * Fixed some NPC skills can be copied by Plagiarism [celest]
+ * Changed Enchant D.Poison's poisoning effect to not work on bosses instead of
+ damage bonus [celest]
+ * Fixed an item dupe bug, very rare occasions [Kevin]
+ * Tidied up pc.c [celest]
+ * Fixed some wild frees from npc unloading at shutdown [celest]
+ * Changed Make Arrow to not display equipped items as material choices [celest]
+ * Removed 'make_arrow_flag' -- use 'produce_flag' instead [celest]
+ * Fixed equip breaking bug in pc.c. [Kevin]
+ * Fixed alot of null pointers thanks to Sasuke-. [Kevin]
+ * Set default in battle_athena.conf of player_skillup_limit to yes. [Kevin]
+ * Extended hide_gm_session to @where [Kevin]
+ * Fixed a guild exp overflow bug in guild.c & int_guild.c[Kevin]
+ * new command @iteminfo item_name/id (@ii). It works, but will be improved [Lupus]
+ * added all known mapflags into @mapinfo command. Rearranged output [Lupus]
+
+05/14
+ * Simplified @cleanmap [celest]
+ * Fixed finalizing clean up could miss 1 map [celest]
+ * Added placeholder code for NPC_EMOTION_ON [celest]
+ * Fixed damage bonuses (damage_rate) not working for normal attacks [celest]
+ * Fixed Concentration (again ^^; ), thanks to lordalfa
+ * Fixed base file name sometimes not retrieved properly in core [celest]
+ * Removed "memwatch.h" includes for all source files other than malloc.h -- only
+ 1 define is enough [celest]
+ * Fixed wrong packet for 01-10aSakexe's UseSkillToPos [celest]
+ * Skip rearranging large memory blocks while cleaning up on memory manager
+ shutdown [celest]
+ * Updated the guild aura skills -- gives +1 stat per level, and runs a bit
+ faster [celest]
+ * Fixed broken Marionette Control -- changed to clowns/gypsies that are under
+ marionette will not be able to use the skill [celest]
+ * Fixed Absorb Spirits working on boss-type monsters [celest]
+ * Fixed Body Relocation hiding when used by monsters [celest]
+ * You can only use mute commands when the system is enabled. [Kevin]
+ * Fixed a guild bug in inif_guild_leave in intif.c, would expel are characters on an account [Kevin]
+ * Added new mapflags (mainly for fixing jobquests abuse and arenas) by Lorky, fixed added by [Lupus]
+ - noexp - on killing a monster you don't obtain both Base and Job EXP at all (including MVP EXP bonus)
+ - nobaseexp - on killing a monster you don't obtain Base EXP at all (including MVP EXP bonus)
+ - nojobexp - on killing a monster you don't obtain Job EXP at all (including MVP EXP bonus)
+ nobaseexp+nojobexp=noexp
+ in other words, 'noexp' set both mapflags 'nobaseexp' and 'nojobexp'
+ - noloot - on killing ANY monster you get no loot at all
+ - nomobloot - on killing a common monster you get no loot at all
+ - nomvploot - on killing a MVP monster you get no MVP loot at all
+ nomobloot+nomvploot=noloot
+ in other words, 'noloot' set both mapflags 'nomobloot' and 'nomvploot'
+
+05/12
+ * Very very very strong weapons (forged with 3 Star Crumbs) now give +40 dmg
+ instead of +15 dmg [DracoRPG]
+ * Weapons/potions made by a top-10 famous player now give bonus effects [DracoRPG]
+ * Updated the battle.c change made to generate compile time
+ errors if you put the wrong battle_config option with the
+ wrong type into the wrong place [MouseJstr]
+ * Added item type 11 into LOGs filter [Lupus]
+ * Removed mob_skill_use, if you don't want mobskills, set mob_skill_rate to
+ zero [Skotlex]
+ * Modified drops_by_luk behaviour. See battle_athena.conf for details [Skotlex]
+ The new system works a lot like Diablo 2, where having 100% better chance
+ of finding items means that you basicly get double drop rates than others.
+ * Implemented pet idle skills restrictions as explained by Komurka [Skotlex]
+ From what I was told, a mob can only cast a skill while in idle state
+ once, and it needs to move before it can do another idle-state skill.
+ * Tested and fixed wedding_ignorepalette, it now works as it should [Skotlex]
+ * Tested the new item type 11. I forgot to add the code for the sql
+ version, but that's now fixed and the new system works as it should [Skotlex]
+ * Put a fix in for the bug mentioned below [MouseJstr]
+ * Added code to make min_hair_style, max_hair_style, min_hair_color,
+ max_hair_color, min_cloth_color, max_cloth_color work [Skotlex]
+ What it does, is cap the values whenever you try to change the
+ character's dye via an npc/script, it won't touch character's dye colors
+ upon loading.
+ * Shrinked @mapinfo output, added 2 missing flags NOWARP / NOWARPTO [Lupus]
+ * New item type (11) to item_db: delay-consumed usables. [Skotlex]
+ . All items that have in their script "pet" or "itemskill" must be changed
+ from type 2 to 11. The new type of item has the property of not being
+ consumed on double click, but after a target is selected (hence it is
+ ideal for lures, skill-casting items and the yggdrasil leaf)
+ The item_db.txt file was updated to reflect these changes. Custom pet
+ lure owners, update!
+ SQL users can run upgrade_svn1705.sql which will upgrade both item
+ databases (including all custom lures)
+ * Added battle config option 'ignore_items_gender'. [Lupus]
+ So any player can equip any item regardless of the gender restrictions.
+ Note: It's ignored by default since gender check isn't implemented at
+ official servers.
+ There are 2 exceptions: Wedding Ring M/ Wedding Ring F (their gender check
+ won't be affected)
+
+05/11
+ * Added by popular demand battle config options mob_skill_rate &
+ mob_skill_delay. See battle_athena.conf for further information. [Skotlex]
+ * Added battle config option wedding_ignorepalette (default no)
+ When enabled, the wedding dress/tux will always display with the default
+ dye (not all palette packs bring palettes for the wedding class, nor
+ they should) (Needs testing)
+ * Changed most battle_athena options to unsigned short. This means the
+ maximum valid value is around 60K (65535 on most systems) which
+ translates to ~60 secs or 600% (600x) for most options. See
+ conf-tmpl/battle_athena.conf for details on which variables were
+ excluded (exp/drop rates values are excluded, obviously).
+ * Removed boss warping code since it is currently supported by the mob skill DB
+ 'rudeattacked' state [celest]
+ * Fixed plagiarised skills replacing actual learnt skills [celest]
+ * Fixed 'gmcommand' script command crashing when no players are attached [celest]
+ ... which means the command does not work in script events like OnClock!
+05/10
+ * Added code to prevent pet lures from being wasted until after selecting a
+ target (only works with official lures). [Skotlex]
+ * Added MAX_REFINE to status.h [Skotlex]
+ Enables for custom max refine levels using the success rates in
+ refine_db.txt, npcs will know they reached the max level when the success
+ chance returns 0. (npcs still need updating to support this model)
+ - Note: Whitesmith's refinery skill might need to be tweaked if you want
+ them to be able to forge above lv10 and up to whatever custom max you
+ wish.
+ - Note2: Npc's refine_sucess script command ignores this max.
+ * Skill updates [celest]
+ - Fixed Charge Arrow not requiring bows
+ - Fixed Enchant Deadly Poison working on bosses
+ - Fixed Concentration (again! xD) def penalty, thanks to UniRing
+ - Added code for NPC_REVENGE
+ * Added 'masterattacked' mob skill condition [celest]
+ * Added battle_config.use_statpoint_table [Skotlex]
+ When set to no, a new equation is used to calculate stat points after a
+ reset. I've tested the equation to death, so it should work flawlessly.
+ Advantages of using the equation: No need for statpoint.txt (it is still
+ read for the time being), and stat changes through npc buyers/sellers are
+ preserved after a reset.
+ * Restructured clif_parse_Wanttoconnection [celest]
+ * Fixed packet version detecting not working properly if last version's connection
+ packet is the same as the DB but with different values [celest]
+ * Added built-in support for 2005-05-09aSakexe and changed 'packet_ver_flag'
+ default in battle conf to 511 [celest]
+ * Added load local resnametables.txt into memory instead of opening and reading
+ it every time we look for a file [celest]
+ * Fixed crash if resnametables.txt was not found in a grf [celest]
+ * Removed some unnecessary steps in grf file lists loading [celest]
+ * Added display_hallucination for clients where the effect lags badly [Skotlex]
+ * Added the battle_config options for managing the pet-skills system [Skotlex]
+ * Incorporated the new pet attack/skill system. [Skotlex]
+ See db/pet_db.txt for explanation, or visit
+ http://www.eathena.deltaanime.net/board/index.php?showtopic=29918 for
+ details and support.
+ * Fixed Marionette skill. Now you can't target other Clowns or Gypsies [Lupus]
+ * Fixed all Hunters traps to affect Players in PVP/GVG places only. [Lupus]
+ And Shockwave Trap doesn't work on monsters, because they don't have SP
+
+05/09
+ ~ Added sql_files/upgrade_svn1665.sql to update hair, hair colour and clothes
+ colours' field format (thanks to Zoc)
+
+ * Updated char creation to support 24 hairstyles (from 5/10's patch) [celest]
+ * Fixed broken stats check during SQL char creation, thanks to Sasuke
+ * Removed an unnecessary check in plugins loading, thanks to Shinomori
+ * Changed grfio_read + grfio_size usage to grfio_reads() -- a bit faster [celest]
+ * Moved the win32 zlib .h files from /lib to /zlib [celest]
+ * Moved 'afm_dir' setting to map_athena.conf [celest]
+ * Moved grfio.c from /common to /map [celest]
+ * Changed grf-files.txt loading: [celest]
+ ~ 'data/sdata/adata' loading will still be supported, but is replaced with
+ grf: <path to grf or gpf file>
+ To load extra GRFs (if you have custom ones for your server for example,
+ or to load weekly kRO gpf's) just add as many 'grf' commands as you want
+ * Tidied up grfio.c a bit [celest]
+ * Added FULLY updated mobs skills DB by Komurka (up to Aegis Zone 8.5) [Lupus]
+ * added a packet to remove maps of other servers [Sirius]
+
+05/08
+ * documented the packetlentable of chrif [Sirius]
+ * fixed crash in clif_joinchatok [veider]
+ * Optimising 2 party queries in SQL char, thanks to Zoc
+ * Fixed a typo in SQL party saving, sorry ^^; [celest]
+ * Fixed compile errors in login and char converters [celest]
+ * Fixed ensemble skills and Benedictio, thanks to shaeh and massdriller
+ * Fixed typo in Concentration's hit bonus, thanks to UniRing
+ * Added additional hit bonus for Weapon Research [celest]
+ * Fixed a missing check in Absorb Spirits [celest]
+ * Made Meteor Assault cause Bleeding effect too. According the skill desc, it causes all effects
+ to ANY enemy by chance now. [Lupus]
+ * Typos and grammatical fixes in various files [DracoRPG]
+ * Changed Hair style, Hair & Clothes colors fields to unsigned to allow use of 255 palettes [DracoRPG]
+ * Enhanced @send to allow use of 20 additionnal arguments after the packet identifier [DracoRPG]
+ * ATK % bonuses provided by Power-Thrust (and similar skills) and attack skills now add instead of multiplicating [DracoRPG]
+ * Added sd->right_weapon and sd->left_weapon structs to store all weapon-specific values like watk [DracoRPG]
+ * Added pc_istop10fame function [DracoRPG]
+
+05/07
+ * Fixed plagiarised skills not updated when hit by different skill level [celest]
+ * Added server type will be set in the core earlier -- Fixes some plugins cannot
+ loaded if called before the server finished initialising [celest]
+ * Added high priority plugins (explicitly set in conf file) will not be unloaded
+ even if incompatible [celest]
+ * Added 'DLL_Test' plugin event [celest]
+ * Ported the upnp feature to eA plugin form [celest]
+ * massdriller's npc update, fixing SIGPIPE in core and SunOS additions to makefile [Shinomori]
+
+05/06
+ * Dev's pls take a look to Dev/mmo_change_report.txt [Sirius]
+ * Fixed build issue under linux machines [MouseJstr]
+ * Fixed possible stat exploit in char_sql, thanks WoWer [veider]
+ * Fixed compilation warnings on NetBSD [veider]
+ * Adding unequip script command, tnx to Spectre [Shinomori]
+
+05/04
+ * Fixed monsters can't use Heal/Potion Pitcher when hidden, thanks to Komurka
+ * Documented the sample plugin source a bit [celest]
+ * Added sample plugin 'sample.dll' [celest]
+ * Finished plugin events system [celest]
+ * Finished plugin loading system [celest]
+ * Added Shinomori's findfile function [celest]
+
+05/02
+ * Tidied up pc and mob counttargetted code [celest]
+ * Updated fame lists to display offline characters' names properly, and
+ * Changed char server to send char id instead of account id in fame lists, thanks
+ to Sara-chan
+ * Fixed a mistake in the friends list code [celest]
+ * Fixed friend's names not sent properly [celest]
+ * Changed Concentration's hit bonus, thanks to ShAPoNe
+
+05/01
+ ~ Added sql_files/upgrade_svn1623.sql to update item_db2's format, and mob stats
+ in mob_db to unsigned int (thanks to Zoc, Wallex and akusarujin)
+
+ * Added item_db2 and mob_db2 reading for SQL map, thanks to sbilly
+ * Added new mob skills -- could be inaccurate though ^^; [celest]
+ * Added proper support for script functions with no parameters, thanks to Wallex
+ i.e getrefine() instead of getrefine(0)
+ * Removed 'skill failed' message for Frost Diver [celest]
+ * Moved Lullaby and Dissonance effect code to skill_onplace_timer [celest]
+ * Updated some skill id's to fit in a few new mob skills (not coded yet) [celest]
+ * Increased mob skills using base chance to 1/1000 instead of 1/10000, and monster
+ delay base rate to 1/100 instead of 1/400, thanks to Komurka
+ * Fixed players able to request trade with gm's even if gm_can_drop_lv was set,
+ thanks to Komurka
+
+04/29
+ * fd checks in send/recv fifo, thanks to Sasuke [Shinomori]
+ * Restructured malloc.h / malloc.c a bit [celest]
+ * Fixed a memory leak in console [celest]
+ * Fixed console to be compatible with the dummy socket [celest]
+ * Fixed TXT login and map not shutdown cleanly if exitting by console [celest]
+ * Changed Spiral Pierce's effect to stop movement instead of stun [celest]
+ * Fixed Chase Walk to properly add a STR bonus [celest]
+ * Added effect for Tarot Card [celest]
+ * Cleaned up clif_specialeffect [celest]
+ * Added hidden gm's will not show warp effect when logging off, and will return
+ 'target character not logged in' when /exall is on, thanks to starlon
+ * Fixed non-movable monsters moving if they're blind [celest]
+ * Added boss-type monsters will auto teleport when 'rude-attacked' [celest]
+ -- note: Just a temporary fix, the mob skill db still needs updating
+ * Added boss-type monsters cannot be knocked back by skills, thanks to Komurka
+
+04/28
+ * Fixed a bot trading hack [celest]
+ * 'isequipped' will now 'tag' items that are used in its set, so a 2nd set will
+ not be able to use items from the 1st set [celest]
+ * Changed bAddItemHealRate to be based on total hp healed including vit bonuses
+ instead of base hp [celest]
+ * Tweaked skill casting time and delay logic again [celest]
+ * Fixed another typo in bAutospell, thanks to Komurka [celest]
+
+04/27
+ * Updated friend list functions, much thanks to Tsusai / Fusion!
+ * Added packet for a divorce notice ("<your name> has divorced with <your spouse>
+ name>") [celest]
+ * Added packet for /pvpinfo (only usable in pvp maps) [celest]
+ * Added display for /blacksmith and /alchemist [celest]
+ -- To-do: Offline characters won't have their name displayed properly yet
+ * Added display when blacksmiths and alchemists gain fame points [celest]
+ * Fixed talkie box not working when packet DB is enabled [celest]
+ * Removed redundant monk() and parse_SkillMessage in clif.c [celest]
+ * Updated @send to check send lengths from packet_db [celest]
+ * Fixed @mutearea's time always set to 15 minutes [celest]
+ * Fixed a typo in the bAutospell's, thanks to Komurka
+ * Reverted a setting in skill casting time calculating [celest]
+ * Fixed Gravitation not affecting enemies, and ignore element modifiers [celest]
+ * Added 'bSPLossRate' effect [celest]
+
+04/26
+ * Added @load/unloadnpc [celest]
+ usage: @loadnpc <path to script file, i.e npc/other/test.txt>,
+ @unloadnpc <NPC name>
+ * Changed @enable/disablenpc to @show/hidenpc [celest]
+ -- Note: the script commands 'enable/disablenpc' arent affected
+ * Updated max packet to 0x234 for 205-04-25aSakexe [celest]
+ * Added cannot use warps when hidden/cloaked [celest]
+ * Re-fixed an exp overflow bug and raised cap to 2bil [celest]
+ * Added some more of kRO's 04/26 patch [celest]
+ * Fixed a crash in stripping skills [celest]
+ * Tidied up battle.c a bit [celest]
+ * Added Devotion's effects will be lost if changed map/teleported [celest]
+ * Added bDoubleRate effects can stack with Double Attack [celest]
+ * Added support to have up to 20 autocast skills from cards [celest]
+ * Applied new advanced skills changes from 4/26 patch [DracoRPG]
+ I could not do everything, things remaining to do :
+ - Alter Double Casting success rate (did not find the code... is there one ? xD)
+ - Check that all songs/dances/duets are uncancelable by Dispell
+ - Make Wand of Hermod affect only party/guild members (and check for a warp portal !)
+
+04/25
+ * Further improvements on stripping/breaking + added support for targeting mobs with strip skills [DracoRPG]
+ * Added fd check to clif_additem [celest]
+ * Optimised weapon stripping/breaking a bit -- skip searching from the item DB
+ everything we call this [celest]
+ * Fixed a possible crash when adding timer function strings [celest]
+ * Tidied up skill casting time calculating a bit + Fixed a possible bad
+ setting when dex > 'castrate_dex_scale', thanks to phabyo [celest]
+ * Changed skill unit group checks in status_change_timer a bit [celest]
+ * Fixed possible sql injection with SQL gm command logging, thanks to starlon [celest]
+
+04/24
+ * Work on skills [DracoRPG]
+ - Cleanup in skill.c, added missing guild skills and switched all names to iRO ones in skill names list
+ - Fixed typo in a guild skill name : GD_KAFRACONTACT -> GD_KAFRACONTRACT
+ - Entirely rewrote equipment stripping/breaking so that stripping/breaking weapon will affect BOTH weapons of
+ a dual wielding Assassin, and that stripping/breaking shield won't affect two-handed or left-hand weapons
+ * Pets can't attack Guardians and Emperium, WoE or not !! [DracoRPG]
+ * Replaced autospell_type and autospell2_type with a simpler way to save auto-
+ casting [celest] + Fixed a typo, thanks to Landarma
+ * Fixed a typo in socket timeout messages [celest]
+
+04/23
+ * Fixed not working PVPOFF in scripts. [Lupus]
+ Due to the bug it could work only on maps with NOPVP flag.
+ * Added item produce pentlty to Baby Class [Lupus]
+ Comparing with common classes, Baby Alchemist/Blacksmith have 20% less chance of successful item making.
+
+04/22
+ * Fix main.sql to include the fields that are in the
+ upgrade files [MouseJstr]
+ * Added bonus4 support for bAutoSpelll [celest]
+ * Fixed Cast Cancel [celest]
+ * Fixed compile error in log.c -- had to remove the 'Log refined items' option
+ in log config [celest]
+ * Fixed plagariased skills not cleaned up properly when copying another new skill,
+ and corrected copying skill level [celest]
+ * Added Spiral Pierce ignores defense, thanks to Komurka
+ * Added base code for PK/Karma system (not completed) [celest]
+ - Added equipment drop based on alignment (not enabled yet)
+ - Added alignment shift after PK (not enabled yet)
+ - Added 5 minute silenced status PK penalty
+ * Added @packetmode (for debug only) [celest]
+ * Added clif_gm_silence to clif.c and rearranged ReqNoChat abit [celest]
+ * Added damage reduction in PK mode [celest]
+ * Added /memo cannot be used when dead [celest]
+ * Added bonus2 support for bAddMonsterDropItem [celest]
+ * Added db/item_group_db.txt [celest]
+ * Added bAddMonsterDropItemGroup [celest]
+ ~ check doc/item_bonus.txt
+ * Fixed bCriticalAddRace giving too little increments [celest]
+ * Fixed Ruwach revealing Chasewalking players [DracoRPG]
+ * Changed equipment breaking to 'on' by default [DracoRPG]
+
+04/21
+ * Fixed a typo in mobs skills checking [celest]
+
+04/20
+ * Fixed a few item errors with callfunc("Is_Merc_Class") (not checking if it returned 0)
+ * Changed a bad mistake in map cache configuration (swap between compressed and uncompressed options) [DracoRPG]
+ -> Check this !! using '1' you can get a 1MB mapinfo with all 450 maps inside !!
+ * Added Intravision vars and all the stuff, but not the code (for Maya Purple Card) [DracoRPG]
+ * Fixed memory leak in @reloadmobdb [celest]
+ * Fixed logging settings reset to default after reading the conf file [celest]
+ * Added support for 'masterhpltmaxrate' condition in the mob skill db [celest]
+ * Fixed Ruwach not dealing damage to revealed players/mobs [DracoRPG]
+
+04/19
+ * Fixed insert like item as card hack. [Ancyker]
+ * Fixed adoption script [Codemaster]
+ * Simplified @day and @night [celest]
+ * Added script command 'adopt', 'day' and 'night' [celest]
+ * Refixed the 'gtb_pvp_only' option, thanks to Zoc
+ * Added Baby Class support to all renters, job quests, etc [Lupus]
+ * Added UPnP plugin (will only load in Windows XP) [celest]
+ - if everything loads successfully you should get a "Firewall port xxx
+ successfully opened" and "Upnp mappings successfull" for each server.
+ If it doesn't, either your router has it turned off or doesn't support it
+ - Go here for the debug version and source code:
+ http://svn2.stormbirds.org:8080/svn/ea/devel/Celest/addons/upnp/
+
+ * Added extra info in 'goto' and 'if' script errors [celest]
+ * Added new mapflag 'gvg_dungeon' -- Same as GvG, but doesn't show simplified
+ effects for the client [celest]
+ * Fixed blind mobs can still follow out-of-range attackers [celest]
+ * Support for /blacksmith and /alchemist commands (doesn't do anything yet)
+ * Added allow gm levels for the /[str/agi/..]+ commands to be set in atcommand
+ config -- set to 0 by default [celest]
+
+04/18
+ * Fixed exp overflow in mob.c and guild.c [celest]
+ * Allow gm's to drop/trade limited items (i.e wedding rings) [celest]
+ * Fixed super novices' guardian angel couldn't be summoned because the message
+ was uncapitalised (yep you need to follow the caps too ^^) [celest]
+ * Fixed wrong EXP table usage / Max possible Job Level calculation of BABY CLASS [Lupus]
+ * Some changes to @send and @packet [celest]
+ * Fixed a crash in @adjcmdlvl [celest]
+04/17
+ * Corrected Strip skills rates [DracoRPG]
+ * Moved timer and db finalising to core.c [celest]
+ * Fixed a typo that was causing crashes from blind monsters [celest]
+ * Added reset all character's status to offline when map disconnects from char
+ (TXT) [celest]
+ * Fixed Tarot Card damage not showing, and the Lover Card to warp the caster
+ instead of target [celest]
+ * Fixed ground-targetting skills usable with Blade Stop on [celest]
+ * Started implementing Baby Class compatibility for items / job quests,
+ some optimizations due to usage of BaseJob [Lupus]
+04/16
+ * Fixed Frost Joke and Scream working on dead characters, and set them to not
+ affect hidden GM's [celest]
+ * Added support for 'rudeattacked' condition in the mob skill db [celest]
+ * Added blind monsters will try and move to its attacker's position [celest]
+ * Added monsters will try and escape if attacked but cannot retaliate
+ (a 'rude attack') [celest]
+ * Added a crash check in mob skill casting [celest]
+ * Adding support for Fusion AF2 maps (not finished) [celest]
+ * Added more correct Einbroch/Einbech monster spawn [Lupus]
+04/15
+ * Fixed building under FreeBSD [MouseJstr]
+ * Shield Chain and Acid Demonstration should now display damage properly [celest]
+ * Fixed memory leak when an npc with no maps defined is loaded [celest]
+ * Changed default mem manager log path to "log/[server name].leaks" [celest]
+04/14
+ * The display of account/character IDs is now a setting in battle_athena [Ancyker]
+ * Allow married couples to exchange normally untradeable rings with each other
+ * Finished adding saving character online/offline for TXT char and login [celest]
+ * Added save guild storage as well when auto saving characters to prevent duping
+ if the server crashes, by End_of_exam / jA 1064
+ * Moved Meditatio's effect back to status calculation [celest]
+ * Updated the fame list sending between char and map to separate blacksmiths
+ and alchemists [celest]
+ * Added 'setcell' support in scripts. Usage:
+ [map name]tab[cell type],[x0,y0,x1,y1]
+ * Added REGEN cell (0x20) [celest]
+ * Fixed a memory leak in SQL login [celest]
+ * Made display version on login settable in battle_athena. [Ancyker]
+04/13
+ * Removed Quagmire cancelling Crazy Uproar (Lord Exclamation) [DracoRPG]
+ * Corrected Song of Lutie (Apple of Idun) healing [DracoRPG]
+ * Moved server type info to version.h
+ * Added dumping svn revision or Athena version when saving stacktrace
+ * Added auto disable built-in stacktrace in Cygwin if 'error_start' is already
+ set in the environment, thanks to Ser
+ * Display a more appropriate message if items are not allowed in trading
+ * Implemented Longing for Freedom (roughly), Wand of Hermod, Gravitation and
+ Gambatein (14 of 14 skills done! Please post any problems, since they're done
+ mostly in a rush ^^; ) [celest]
+ * Added -1 skill id checks [celest]
+ * Fixed event timers crashing when freeing memory [celest]
+ * Fixed sage enchanting skills using up gems even if it failed [celest]
+
+04/12
+ * Fixes and updates [DracoRPG]
+ - Fixed Cart Boost speed bonus being not removed when the skill ended (missing calc_flag)
+ - Lv4 weapons don't give fame point anymore when upgraded to +10
+ - Axes and Maces can't be broken
+ * Added checks in event timers from crashing when freeing memory [celest]
+ * Implemented Acid Demonstration, fixed Double Casting [celest]
+ (10 of 14 skills roughly done)
+ * Implemented Double Casting, finished Tarot Card effects [celest]
+ * Overhaul on status changes' numbering -- some statuses will show icons now
+ * Implemented Mana Regeneration, Shield Chain, Plant Cultivation, Cart
+ Termination, Max Overthrust and Tarot Card [celest]
+ ~ To get the new skills you need 2005-04-11aSakexe!
+ * Enable cards to be stolen with level 5, thanks to Ishizu-chan
+
+04/11
+ ~ Please upgrade your SQL char DB with /sql-files/upgrade_svn1499.sql
+ to accomodate Fame saving!
+
+ * Fixed AC_DOUBLE and AC_SHOWER cast delays according to kRO Patch - 6/29/04
+ they both have 0.1 sec cast delay thanks to Moraddin
+ * Added SQL DB compatibility testing upon SQL char server startup -- now it
+ will not run if any important fields are missing [celest]
+ * Added sending list of characters with highest fame for TXT and SQL [celest]
+ * Added saving of fame for TXT and SQL [celest]
+ * Added saving of plagiarised skills for rogues [celest]
+ * Corrected heal and max hp bonus for Apple of Idun [celest]
+ * Added /tool/stackdump for Cygwin users to debug .stackdump files.
+ Usage: ./stackdump [map/char/login] [sql]
+ * Removed set_termfunc usage in char and login servers [celest]
+ * Card fix - owl_duke_card should cast Imposito manus on self, not on
+ enemy, wind_ghost_card should cast jupiter thunder level 10, not
+ Sight level 10 [veider]
+ * Finished coding fame point gain [DracoRPG]
+ * Fixed crash in clif_guild_memberlist not checking sd->fd could be NULL [veider]
+ * Fixed Punk card giving Sight (10) level 5 instead of Quagmarine (92)
+ level 5 [veider]
+
+04/10
+ * Performance improvements (currently protected with -DTURBO) to
+ common/socket.c for very large servers (500+ users) [MouseJstr]
+ * Fixed a warning in npc.c, started implementing fame point system [DracoRPG]
+ * Added fix for "bad setting of guild members", thanks to Alex14
+ * Fixed a bad typo in 'disp_hpmeter', thanks to starlon again ^^;
+ * Fixed Bleeding and Poisoned status continueing even after death [celest]
+ * Updated bleeding effect for Acid Terror, Head Crush and Pressure [celest]
+ * Fixed 'make converters' not working in clean builds [celest]
+ * Added capability for Mem manager to clean up ALL unfreed memory on shutdown.
+ Leaks will still be reported [celest]
+ * Added enable jA's MALLOC_DBN in db.c by default [celest]
+ * Fixed compile error caused by strerror_r() [veider]
+
+04/09
+ * We now can come up and shutdown leak free.. thanks go to celest for
+ assisting me in this long and painful quest [MouseJstr]
+ * hitting Control-C three times causes a instant shutdown without any
+ cleanup [MouseJstr]
+ * Fixed a NPC memory leak [MouseJstr]
+ * Added Einbroch to @go [DracoRPG]
+ * Fixed a NPC memory leak [MouseJstr]
+ * Added lower level gm's shouldn't be able to see higher level gm's with the
+ 'disp_hpmeter' option -- thanks to starlon
+ * Added 'make converters' -- compiled converters will go under
+ /tool [celest]
+ * Fixed Weapon Refine not checking if the item type is refineable [celest]
+ * Improved checking if items can be dropped, traded, refined or stored [celest]
+ * Fixed a bug in SQL char.c, thanks to Alex14
+ * Fixed some compile errors in the core [celest]
+ * Fixed compile errors when Mem manager is enabled [celest]
+ * Added Einbroch monsters spawn, fixed one mapflag for Einnech mines [Lupus]
+
+04/08
+ * Changed how signals shut the process down so that we were
+ not doing work in a signal handling thread but instead on
+ the main thread.. which is important due to the limited
+ stack size of a signal thread. [MouseJstr]
+ * Eliminated the use of atexit() so that we could control
+ the order objects were destroyed in as well as make
+ high end debuggers happier about what we were doing after
+ exit. [MouseJstr]
+ * Fixed a bug in do_final_npc() that was hanging
+ shutdown [MouseJstr]
+ * Fixed use of deprecated strerror in common/lock.c [MouseJstr]
+ * Fixed buffer read-overflow in mail system in char/char.c [MouseJstr]
+ * Fixed msg_table definition mismatch in map server [MouseJstr]
+ * Fixed memory leak when doubly allocating the scriptlabel_db [MouseJstr]
+ * Fixed two uninitialized memory reads in map/skill.c [MouseJstr]
+ * Fixed memory leak when accessing AFM files in map/map.c [MouseJstr]
+ * Changed default limit for MaxHP/SP from 32500 to 1M in battle_athena.conf [DracoRPG]
+ (this is because with Berserk and Tao Gunka Card, players can go up to 100k+ HP)
+ * Added 'delay_battle_damage' [celest]
+ * Fixed @kamib not working properly, thanks to maldersoft
+ * Fixed compile warnings in pc.c [MouseJstr]
+ * Fixed a crash in clif_send when sending messages to guild
+ members [MouseJstr]
+ * Added @shuffle map, @shuffle area, @shuffle world [MouseJstr]
+ * Added @mutearea [MouseJstr]
+ * Readded setting of sd->skilllv, sd->skillid to skill_use_id
+ caused skill failures for BARD/DANCER combo skills [veider]
+ * Changed how get_svn_revision() is implemented to compile the actual
+ constant into the executable. [MouseJstr]
+ * Replaced some printf's in the core with showmsg functions [celest]
+ * Replaced 'exists' with a built in function for WIN32 builds [celest]
+ * Added 'clouds' and 'fireworks' mapflag [celest]
+ * Added a new @fog and @fireworks [celest]
+ * Changed the old @fog to @clouds [celest]
+
+04/07
+ * Added @version atcommand [Ancyker]
+ * Readded @disablenpc (not the same as @hidenpc) [celest]
+ * Fixed @reloadscript not removing old NPC's and monsters first [celest]
+ * Some changes in mob and NPC unloading [celest]
+ * Changed the original @disablenpc to @hidenpc [celest]
+ * Fixed HP Conversion to properly not reduce HP if SP is full [celest]
+ * Updated Defender -- should reduce walking speed, and does not reduce attack speed
+ at level 5 [celest]
+
+04/06
+ * Fixed a crash in clif_send when checking packet version, thanks to Alex14
+ * Fixed a crash in Deluge, Volcano and Violent Gale, thanks to Alex14
+ * Skip partner checking when calculating status with Marionette Control on [celest]
+ * Fixed plagiarised skills become unuseable after saving character [celest]
+ * Fixed double skill fail messages for stone curse, thanks to wind
+ * Added modulus by zero check to rand(), thanks to starlon
+ * Improved error messages during npc parsing [MouseJstr]
+ * Fixed a crash in login_sql [MouseJstr]
+ * Added logs filters in more logs [Lupus]
+ now you can set individual bit-mask filter for each log file
+ Example: (drops log)
+ log_drop: 1 = logs ANY items
+ log_drop: 332 = logs only Healing items, Cards and those items which price is >= price_items_log
+
+04/05
+ * Fixed damage reflecting (silly typo xP) [celest]
+ * Fixed Backstab to not have a push back effect [celest]
+ * Fixed auto spell to not taking SP, thanks to Hekate
+ * Fixed Sanctuary to have proper healing count, thanks to Hekate
+ * Simplified Valaris' online_timer [celest]
+ * Updated Fogwall, Spiderweb, and HP Conversion, thanks to redcard [celest]
+ * Adding saving character online/offline for TXT char and login (unfinished)
+ * Added SERVER_TYPE to core for future plugins support [celest]
+ * Added support for the UPNP plugin to release port mappings and re-close firewall
+ ports on shutdown [celest]
+
+04/04
+ * Some work on re-enabling trade and storage logging [MouseJstr]
+ * Updated showmsg with Shinomori's improvements [celest]
+ * Fix showmsg for Visual Studio [MouseJstr]
+ * Update base code for the UPNP plugin loading [celest]
+ * Removed anti-freeze system for login and char -- Shinomori's update would
+ be enough to keep inter connections alive [celest]
+
+04/03
+ * integrating anti freeze system to status update [Shinomori]
+ * Fixed impossible drops at 0.01% chance [Lupus]
+ * Fixed some variable declarations in SQL login.c causing compilation errors [veider]
+ * Added NetBSD support into Makefile (Still lots of warrnings during compilation [veider]
+ * Finished Valkyrie. Now it correctly works. Valhallana reborns players to High Novices. [Lupus]
+ (added missed kRO condition: to reborn, player shouldn't have money nor items(equipment) )
+ Then Valhallana warps just reborn players to the home city of their main job.
+ On Job Level 10 of High Novice they can get 1st Advanced Job from correct 1-1 job quests NPC.
+ They'll get there all learnt skill quests.
+ On reaching 45 Job Level they may visit Valkyrie and get 2-2-1 / 2-1-1 class (3rd Job)
+ from a correct NPC.
+ * Fixed SKILL POINTS exploit in Assassin Job Quest [Lupus]
+
+04/02
+ * Added bonuses bUnstripable[Weapon|Armor|Helm|Shield]
+ instead of just bUnstripable that worked only for armor [DracoRPG]
+ * Updated Tiger Knucke Fist's 'fixed state' effect [celest]
+ * Allowed people to enable/disable using the online column via
+ 'register_users_online' in the login_athena.conf [Codemaster]
+ * Added the 3 baby skills WE_BABY, CALLBABY and CALLPARENT [celest]
+ * Some tidying up in skill.c [celest]
+
+04/01
+ * Updated ShowMessage functions to use vprintf [celest]
+ * Fixed a potential crash in pc_walk in Win32 builds [celest]
+ * Added bAddEffWhenHitShort and changed bAddEffWhenHit back to all physical
+ damage [celest]
+
+03/31
+ * Fixed memory corruption during shutdown via the script_buf
+ [SVN 1370: MouseJstr]
+ * Added some useful filename info to the script parser so that
+ it is easier to figure out what is going on [SVN 1370:
+ MouseJstr]
+ * updated the visual studio projects a little bit [SVN 1370:
+ MouseJstr]
+ * fixed memory corruption in mapif_guild_info:int_guild.c
+ [SVN 1367: MouseJstr]
+ * Fixed common/lock.c (problem with unistd.h include) [Codemaster]
+ * Added father/mother/child fields to mmo_char_tostr() and
+ mmo_char_fromstr() [veider]
+ * Added exp sharing between family members for TXT version [veider]
+ * Added char_married() and char_child() to TXT version [veider]
+ * Fixed memory corruption associated with afm files [SVN 1363: MouseJstr]
+ * More pedantic g++ fixes so that it builds without any and
+ all warnings [SVN 1362: MouseJstr]
+ * Removed some #include's causing warnings on some platforms
+ [SVN 1360: MouseJstr]
+ * Fixed a bug with InitTimer/StopTimer, thanks to ilpalazzo-sama
+ * Set 'undead_detect_type' to 0 by default, thanks to Dino9021
+ * Fixed Enchant Poison / Deadly Poison having too high poisoning chance
+ * Reverted the pc_remove_map() change temporarily
+ * Added back up old files in 'save' before saving new data -- also fixes
+ 'Access denied' errors when saving in TXT
+
+03/30
+ * sql native vc7 projects now build/link [1351: MouseJstr]
+ * Began sql projects for VC7 [1349: MouseJstr]
+ * text char-server and login-server now build using VC7. You
+ can use the eAthena.sln solution to build all three. These
+ are currently just the text versions of the servers. I have
+ not added projects yet to build the sql versions.
+ [SVN: 1347 MouseJstr]
+ * Made the map-server build cleanly using Microsoft Visual
+ Studio.. entirely native code without any cygwin dependency
+ [SVN: 1345 MouseJstr]
+ * Fixed @reloadgmdb in SQL -- after reloading ask the char to forward the new
+ accounts back to the map [celest]
+ * Added base code for loading Ser's UPNP plugin [celest]
+ * Added 'idle_no_share' to battle_athena.conf [celest]
+ * updated map server to jA1137~1159
+ - Added @reloadatcommand, @reloadbattleconf, @reloadstatusdb, @reloadpcdb
+
+ (Note: You should copy the latest msg_athena.conf from conf-tmpl and replace
+ your current one EVERYTIME it's updated to prevent it from crashing when it
+ can't find the newer messages!)
+
+ - Updated packet DB to support /item and /monster
+ - Added pc_remove_map()
+ - Added 2 new mobs skills: NPC_RUNAWAY and RECALL
+ - Updated BioCannibalize
+ - Updated Hammerfall, Meteor Shower and Lord of Vermillion -- when MvP's
+ cast them they should have much more range
+ - Some other skill tweaks
+ - Added item_findingore.txt
+ * Some tidying up in mob.c and skill.c [celest]
+
+03/29
+ * Please make sure to use the stable/sql-files/upgrade_svn1315.sql to
+ upgrade your mysql as a result of the new adoption system. Thank you
+ -MouseJstr
+
+ * More ANSI C++/C conformance fixes [SVN 1341: MouseJstr]
+ * Fixed SQL char server crashing when loading the item_db, my bad ^^; [celest]
+ * More ANSI C++/C conformance fixes [SVN 1334: MouseJstr]
+ * Added auto save guild data (only guardian HP and owner guild ID for now,
+ both cached) every 5 minutes during WOE [celest]
+ * Updated damage calculation for Magnum Break [celest]
+ * Fixed #item not working properly, thanks to TripleOxygen
+ * Fixed a lot of compile time problems with our mixed C++/C
+ conformance [1328: MouseJstr]
+ * Fixed use of storage variable to conform to ANSI C spec
+ [1327: MouseJstr]
+ * Added CIA-bot to the #athena channel [MouseJstr]
+ * Some tidying up in mail.c [celest]
+ * Added an invalid pointer check in clif_displaymessage [celest]
+ * Added sql upgrade file in sql-files for svn1315's update [celest]
+ * Added auto create 'save' folder from 'save-tmpl' when compiling for the
+ first time, thanks to Jbain
+ * Fixed 'use_sql_db' not read properly in SQL char server, thanks to Wallex
+ * Changed db/const.txt to have right baby jobs IDs [veider]
+ * Added three fields to mmo_charstatus - father/mother/child
+ needed for adoption system [veider]
+ * Added adoption support to charserver SQL version [veider]
+ * Added atcommand_adopt - create a family of three [veider]
+ * Added to char_commands showexp/showdelay so that
+ players could remove some messages [veider]
+ * Added percent to "Experience Gained" message [veider]
+ * Added adoption system support to party_check_exp_share()
+ so that parents can share exp with child [veider]
+
+03/28
+ * Fixed Auto Berserk activating by itself when changing maps [celest]
+ * Re-fixed the SQL syntax crash in logging [celest]
+
+03/27
+ * Fixed AutospellWhenHit effect to only work on melee attacks [celest]
+ * Fixed AddEffWhenHit effect to only work on melee attacks [celest]
+ * Moved guardian hostility checking and monster_ignore_gm check to battle.c --
+ processed earlier, and more appropiate [celest]
+ * Fixed a SQL syntax crash when logging character names with "'" in them
+ [celest]
+ * Added use dynamic allocation when loading the msg_table [celest]
+ * Fixed some memory leaks with the new timer changes [celest]
+ * Refresh the client when day comes to get rid of the night effect (if
+ night_darkness_level was used) [celest]
+ * Changed @refresh to fake map loading, but without teleporting side effect
+ (skill delays reset, extra load on server etc)[celest]
+ * Updated SQL file for the item_db, thanks to Zoc
+ * Fixed the 'show_mob_hp' option not updating when a monster is healed, thanks
+ to leinsirk10
+ * Added flexible Filter to the Monster Drops logging [Lupus]
+ - Now you can choose what types of items either to log or not.
+ - You can also log expensive items (you can set the min logging price)
+ * Optimized a bit ATCommands.c functions (inspired by Freya) [Lupus]
+ * Added missing parenthesis in my Improve Dodge code, not giving +4/lv to proper jobs [DracoRPG]
+ * Added all released cards into monsters drops and Old Card Album [Lupus]
+
+03/25
+ * Fixed a typo in my fix for Stalk / Tunnel Drive increasing instead of decreasing speed, sorry [DracoRPG]
+ * Rewrote a little bit Improve Dodge [DracoRPG]
+ - The speed bonus does not effect when Cloaked
+ - Assassins & Rogues get +4 Flee/lv, but all other jobs can get +3/lv
+ if they have the skill (not only Thiefs & Super Novices)
+ * Some minor changes to Sacrifice in battle.c [celest]
+ * Set the Emperium to be immune to Sacrifice [celest]
+ * Set the Emperium to be have max status effects immunity [celest]
+ * Fixed indoorsrwstable.txt reading even when 'indoors_override_grffile' is
+ set to 'no' [celest]
+ * Fixed @monsterbig/@monstersmall not working [celest]
+ * Fixed @killmonster2 not working [celest]
+
+03/24
+ * Updated obj_del to delete all GNUMakeFile and .o files + compiled exes [DracoRPG]
+ * Fixed a typo in Stalk / Tunnel Drive speed calculation [DracoRPG]
+ * Added some mapflags for new towns [Lupus]
+ * Added timer.c optimization / timers sort fix. 'no freezing mobs anymore' Thanx 2 Yor/Freya [Lupus]
+ * Added 'map_charid2id' [celest]
+ * Changed monster damage logging to save char ID's for the most time -- also
+ fixes an exp bug, thanks to Super Novice / Ezhik [celest]
+ * Implemented 'event_script_type' -- no changes at '0', at '1' script events
+ will work according to Qamera's original mod
+ For more info please refer to his thread:
+ http://www.eathena.deltaanime.net/board/index.php?showtopic=13305&hl=
+ * Set Emsolute Develop as a learnable skill [celest]
+ * Updated 'require_glory_guild' [celest]
+ - the skill is only acquirable if this is set to 'yes', otherwise it will not
+ appear in the guild skill tree. Default is changed to 'no'.
+ * Allow monsters to cast skills near themselves even when monster_nofootset
+ is set to 'yes' -- they're only not allowed to cast near players [celest]
+ * Print number of online users in online.txt/.html even if there's only 1 user
+ online [celest]
+
+03/23
+ * Adjusted my trade fix [1280: MouseJstr]
+ * Fixed possible memory corruption in storage if number of guilds
+ in database exceeds the max server can support [1278 : MouseJstr]
+ * Fixed @mapexit to properly flush the fifo's before shutting
+ server down to help insure all the char data is properly flushed
+ [1278: MouseJstr]
+ * Fixed trade exploit/crash from invalid data being sent
+ [1278: MouseJstr]
+ * Possible use of uninitialized data used during mob walk
+ calculation resulting in radical mob movement or crash
+ [1278: MouseJstr]
+ * Fixed some --addrace variables' sizes [celest]
+ * Added' require_glory_guild' - sets whether changing guild emblems require
+ the Glory of Guild skill [celest]
+ * Fixed alot of memory leaks [celest]
+ * Added stray memory cleaning routine to db.c [celest]
+ * Fixed some compile errors, sorry xP [celest]
+ * Corrected potion creation success chances, thanks to Avaj and DracoRPG
+ * Removed some unused potion creation code, thanks to DracoRPG
+ * Updated Joint Beat's effect, thanks to DracoRPG
+
+03/22
+ * Fixed Alchemist's CANNIBALIZE, now it summons correct # of plants. With their real HP [Lupus]
+ * Updated @reloadmobdb, @reloadskilldb, @reloaditemdb [celest]
+ * Some tidying up in @reloadscript (more work needed) [celest]
+ * Moved some gm command messages to msg_athena.conf [celest]
+ * Removed skill_range_leniency [celest]
+ * Removed enable_upper_class [celest]
+ * Removed riding_weight [celest]
+ * Added signal handler for SIGPIPE [celest]
+ * Updated Frost Joke to affect everyone else in PvP/GvG, thanks to veider
+ * Corrected Detect Trap range to be based on level, thanks to veider
+ * Updated Tunnel Drive's movement speed, thanks to veider
+ * Removed cdp_rate, suggested by leinsirk10
+ * Fixed a typo in Acid Terror, thanks to leinsirk10
+ * Fixed some typos/memory leak in script cleaning up, thanks to leinsirk10
+ * Added gm_can_drop_lv limitations for trading and opening storage, thanks to
+ Dino9021
+ * Changed shop_exp's calculation to use 0.01% increments, suggested by tcdiem
+ * Refixed "--en/ja--" usage in 'monster' script not working properly, thanks
+ to sbilly
+
+03/21
+ * Moved /tool and /webserver to under /src and added 'make tools' and 'make
+ webserver' [celest]
+ * Removed ladmin compiling from 'make sql' [celest]
+
+03/20
+ * Don't register the day/night timers if any one is set to 0 [celest]
+ * Fixed @storage / @gstorage ATcommands thanks2 Yor/Freya [Lupus]
+ * Added 4 new card effects from 3/15's patch -- check item_bonus.txt [celest]
+ * Added 'enable_ip_rules' to packet_athena.conf [celest]
+ * Updated socket debug messages to be more readable [celest]
+ * Added a sql upgrader to handle the mob_db changes to assist
+ in migrating to the newer SVN servers [MouseJstr]
+
+03/19
+ * Added getrefine() for 3/15's card patch -- returns the refined number
+ of the current item [celest]
+ * Fixed day and night settings not ignored even if they are set to 0,
+ my bad ^^; [celest]
+
+03/18
+ * Fixed a crash when freeing memory of pets [celest]
+ * Added Cygwin support to the -DDUMPSTACK option, and changed its format
+ to "<server type><number>.stackdump", thanks to Ser [celest]
+ * Removed duplicate fopen in login_log [celest]
+ * Don't log SQL char actions if log_char is not enabled in char_athena.conf
+ [celest]
+ * Updated shop_exp's calculation to give more exp, thanks to tcdiem [celest]
+ * Fixed the bDamageWhenUnequip effect dealing damage when unequipping unrelated
+ items [celest]
+ * Fixed compile errors in SQL char.c [celest]
+
+03/17
+ * Added ~86 new cards. Fixed new cards bugs, optimized [Lupus] thanks to Indiona,Landarma
+ * Removed nullpo warning from trade.c (my prev anti-spoof protection) [Lupus]
+ * Added the new Einbroch/Einbech maps to maps_athena.conf [celest]
+ * Added display script filename when a script error is found while parsing
+ [celest]
+ * Added 2 char-server packets to support Freya's login server [celest]
+ * Rewrite on Full Strip [celest]
+ * Fixed heap corrupion in map.c caused while loading maps
+ [SVN 1241: MouseJstr]
+ * Re-fixed compile error in map.c -- sorry ^^; [celest]
+ * trade.c fixed possibility of STORAGE+TRADE spooffing dupe [Lupus]
+ Now, on accepting trade your active Storage window closes. (Either Common or Guils Storage)
+ thanx to Sergey for the exploit test and report
+03/16
+ * map.c fixed compilation error [Lupus]
+ * Updated jA's dummy socket to mod1137 [celest]
+ * Added jA's ddos protection system -- check packet_athena.conf [celest]
+ * Moved stall_time's reading from inter_athena.conf to packet_athena.conf
+
+03/15
+ * Fixed a compile warning in pc.c [celest]
+ * Updated Soul Breaker's damage display, by DracoRPG [celest]
+
+03/14
+ * Fixed @marry and @divorce. Also added Wedding music+confetti effect to @marry [Lupus]
+ - @marry Player1,Player2
+ (don't miss the COMMA ',' betwin the names)
+ - @divorce Player
+ (in @divorce use any name from the couple)
+ * Added auto convert advanced job and baby class sprite ID's in mob_avail.txt
+ to correct format [celest]
+ * Added SC_Speedup cannot be stacked with Increase Agility [celest]
+
+03/13
+ * Added PvP/GvG check for Tiger Knuckle fist [celest]
+ * Fixed Pressure reducing the target's SP twice, thanks to deepin [celest]
+ * Fixed SQL logging not checking if its supposed to use SQL or TXT logs, thanks
+ to Alex14 [celest]
+ * Fixed 23 new cards (some effects chances were divided by 100, some cards had no bonuses
+ due to misplaced arguments, usage BONUS instead of BONUS2, etc) [Lupus]
+
+03/12
+ * Fixed Status Recovery dealing too short blind time on undead [celest]
+ * Fixed mobs not affected by Blind status [celest]
+ * Added an invalid id check check in map_id2sd [celest]
+ * Added sd check in clif_send [celest]
+ * Fixed usage of mvp_hp_rate and monster_hp_rate. MVP rate was used for common monsters [Lupus]
+ * Added additional random respawn delay for instant respawning monsters (0..5 seconds) [Lupus]
+ - Should be made as an option of battle_athena.conf
+
+03/11
+ * Speedup player autosaving -- don't save guild castle data at the same time,
+ thanks to Alex14 [celest]
+ * Optimised guild castle saving when autosaving player data, thanks to Yor /
+ Freya (UPDATE: view above)
+ * Added sd check in mob_damage, thanks to sbilly [celest]
+ * Added Sage enchanting skills can only be cast on party members [celest]
+ * Fixed Magic Power not working for ground-targeted skills [celest]
+ * Fixed Frost Diver having double freezing chances [celest]
+ * Added Breaker's magic damage to be blockable by Pneuma, thanks to DracoRPG
+ [celest]
+ * Corrected 1206Sakexe's packet detection, thanks to Yor / Freya [celest]
+ * When casting cloaking stop displaying the skill title after its finished,
+ thanks to Battitude [celest]
+
+03/09
+ * Some changes in sig_dump to allow Cygwin produce stackdumps upon crash again,
+ thanks to Ser [celest]
+ * Changed the default stackdump creation folder from /save to /log [celest]
+ * Fixed a typo in TXT login server logging, thanks to Skyer / eAthenaC [celest]
+ * Added HP and SP rate underflow checking [celest]
+ * Added stop auto attacking if no arrows were equipped [celest]
+ * Added new script command: 'cardscnt'. It returns N of inserted cards in the same weapon. [Lupus]
+ Now I can start fixing CARDS COMBO exploits. And it's possible to fix old cards power abuse, too.
+ e.g. Assassins can equip 2 4-slot weapons and have HUGE card bonuses.
+ It's said that you can have only ONE bonus per hand...
+ * Fixed and tested script command 'isequippedcnt'. It didn't return real value [Lupus]
+ Here's an easy way to test all items:
+ 4149,Gargoyle_Card,Gargoyle Card,6,20,0,10,,,,,,,2,,,,{},{ dispbottom "Gagoyle OK:"; dispbottom isequipped(4149); dispbottom isequippedcnt(4149); dispbottom cardscnt(4149); }
+ * Fixed "nice char save by the fountain of Prontera"; People (Helpers, GMs) did abuse their power and [Lupus]
+ used to @jail friend / @unjail friend. To make his save point in the middle of the Prontera.
+ So I made @unjail save coords to 0,0 (on unjail it makes player's save point to appear always in a random place of Prontera)
+ You can use this query to "Clear nice save point of all jail/unjail abusers friends"
+ SQL QUERY: update ragnarok.char set save_x = 0, save_y = 0 where (save_map = 'prontera.gat' and save_y = 191)
+03/08
+ * Added chance for Enchant Poison to poison enemy, and reduced Deadly Poison
+ chance [celest]
+ * Compacted some code for Deadly Poison [celest]
+ * Added DracoRPG's code for Soul Breaker - the magic attack part should work
+ as it should now, thanks! ^^ [celest]
+ * Reverted the reverted jA event change but this time without bugs (hopefully) [Shinomori]
+ * corrected status_change_timer as far as I understand the functionality
+ (better have a look at it, Celest), added a some security to prevent pending timers
+ * moved two variable declarations to scope start (mob.c and skill.c)
+ * Fixes Icewall can be directly cast on players and monsters -- also removes
+ the 'unsupported layout' message [celest]
+ * Added the new turbo_room and alde_tt to the maps config [celest]
+ * Speedup SQL inventory and storage saving, thanks to Ilpalazzo-sama [celest]
+ * Reverted a jA change in event loading [celest]
+
+03/07
+ * Added uptime logging support whenever the server closes, to enable change
+ the 0 to 1 in core.c [celest]
+ #define LOG_UPTIME 0
+ To-do: Add this as an option to log config
+ * Fixed 'make clean' not removing the .o files in /common [celest]
+ * Removed some unused code for Breaker and temporarily set Emperium to be
+ immune to Breaker [celest]
+
+ * Updated core and map-server to jA 1115~1137 [celest]
+ - Added monster_delay_damage to battle conf
+ - Increased some default settings in script conf
+ - Updated Brandish Spear, Soul Change, Soul Burn
+ - Updated Body Relocation (shorter distance)
+ - Added monster skill NPC_EXPLOSIONSPIRITS
+ - Corrected Mindbreaker level to 5
+ - Updated Meteor Assault to instant-cast
+ - Added command @users - shows the percentage of users in all maps
+ - Don't save status if the player is set for disconnection
+ - Added free block lock-checking system
+ - Added saving the processes' ID into [xx-server.pid]
+ - Fixed a memory leak with duplicate script labels
+ + For more detailed logs check 'Readme-jap'
+
+ * Fixed a typo in Volcano, thanks to Ilpalazzo-sama [celest]
+ * Fixed Apple of Idun reading the wrong skill level and giving too much HP
+ [celest]
+
+03/06
+ * Added new anti-hacker trade protection from Freya. [Lupus]
+ It also auto-ban hackers and broadcasts messages to all GMs. Good work, Yor!
+ * Misc fixes. [Lupus]
+ 2Shino: BTW Some players can't re-connect to the server. Due to the updated session checks in chrif.c
+ actually impossible, because the checks handle the connection with the char server, not with users
+ anyway, I checked again and rearranged code but functionality is still the same and valid [Shinomori]
+03/05
+ * Reversed drop_rate0item option, corrected MVP Drop rate (thanks to Freya) [Lupus]
+03/04
+ * Fixed SQL Guild Castle Saving (now fully working, tested on 100 players during WOE) [Lupus]
+03/02
+ * Fixed SQL Guild Castle Saving (partial, yet it doesn't clear GuildID when you abandon a castle) [Lupus]
+ + added 2 fixes by POW (Mac Guild Position fix, Max Guild Members fix)
+ * Fixed Emotion Flood (by Yor) [Lupus]
+ * SQL: Fixed temporary ban. Now banned players can enter the server when the ban time is over. [Lupus]
+ It wasn't working because STATE hasn't been cleared properly.
+ Also fixed wrong client messages (ban reasons: Banned by GM / Temp ban till DATE).
+03/01
+ * Effects from dancer/bard skills will stay for 20 seconds after leaving the
+ skill area [celest]
+ * Fixed /resetstate /resetskill being unuseable at all [celest]
+ * Fixed /mm /mapmove being useable by all players [celest]
+ * Fixed some compile errors in mob_once_spawn [celest]
+ * Corrected a typo in Chemical Protection skills, thanks to holyfork [celest]
+
+02/28
+ * Fixed SQL Castle saving bugs [Lupus]
+ * Corrected Tiger Fist, Chain Crush, and Palm Push Strike damage, thanks to
+ Eskadron [celest]
+ * Updated Endure to be usable in GvG, but only gives the mdef bonus [celest]
+ * Some rewrites on the passive guild skills effects [celest]
+
+02/27
+ * Fixed some bugs in Monk Job Quest. Now it's fully passable. [Lupus]
+02/26
+ * Added jA's dummy socket to prevent fd crashes [celest]
+ * Added some jA script commands: [Lupus] (first steps to add ELSE, FOR, WHILE, etc)
+ - getusersname (works like @WHO ATCommand, outputs by 10 names in the Pop-up window)
+ - dispbottom (print message in the common chat window)
+ - recovery (restore MaxHP/SP and revives all players on the server)
+ - getpetinfo (returns pet's name, type, class, hunger, intimacy)
+ - globalmes (works like Announce, but outputs in the common chat window)
+ - jump_zero (reserved - for future compatibility)
+ - select (reserved - for future compatibility)
+ - getmapmobs (# mobs on a named map, use "this" for current map)
+ check script.c for their paremeters (in English)
+02/25
+ * Fixed npc_dequeue, testing on remove of RoVeRT's npc timer system [Shinomori]
+02/24
+
+ * Re-added missing cart dupe-proof code. From Freya [Lupus]
+ * Some rewrites on Basilica [celest]
+ * Fixed another bad typo in skill list_num reading, thanks to orn [celest]
+ * Fixed Steal Item Rate. It has been multiplied twice on common_item_drop value for any kinds of items. [Lupus]
+ e.g. If you set droprate of comman items to 500%, then even rare items could be stolen more easily. Thanks to Freya
+ * Items Droprate fix. Now it adjusts correctly, w/o overflows. Thanks to Freya [Lupus]
+ * mob DBbs EXP reading fix. w/o overflows. Thanks to Freya [Lupus]
+
+02/23
+ * Added bAddItemHealRate [celest]
+ * Fixed a crash if adding an offline player to a party, thanks to Alex14
+ [celest]
+ * Fixed a crash with Warp [celest]
+ * New Cards: Some fixes, revisions, additions [Lupus]
+ * Fixed char server crash when sending wisp with a "'" in the names [celest]
+ * Fixed Backstab not checking for and consuming arrows [celest]
+ * Fixed another bad typo causing @allskill to not add points into advanced job
+ skills [celest]
+ * Fixed a bad typo in status.c's StatusChangeTable [celest]
+ * Corrected Spiral Pierce's hits in the skill_db [celest]
+ * Moved /common/*.o into a obj folder when compiling [celest]
+ * Updated core and map server to jA 1094~1115 [celest]
+ - Added End_of_exam's Memory Manager for detecting memory problems.
+ To enable remove the // in malloc.c line 11
+ // #define USE_MEMMGR
+ - Added @npctalk and @pettalk
+ - Added support for jA's local zlib
+ - Fixed a bug with path search long
+ - Updated malloc.c to support Memwatch
+ - Added DB data loss detection
+ - Added db/skill_unit_db.txt
+ - Updated skill unit system
+ - Changed Waterball to the new timerskill system
+ ~ For more detailed logs check 'Readme-jap' (knowledge in japanese required,
+ obviously ^^;)
+ Please test if there's any skills that might have suddenly stopped working,
+ thanks ^^;
+
+02/22
+ * Revised New Cards, added missing effects, fixed bugs [Lupus]
+ ~20 cards to check left 8) But on 22 Feb some new cards have been announced T__T'
+ * Cleaned up some compiler warnings [SVN 1158: MouseJstr]
+ * Added perl regular expression support.. look at src/map/npc_chat.c
+ for all the dirt on the new features. To build it, you have
+ to enable the PCRE_SUPPORT #define and you also have to
+ build/install the pcre library. [SVN 1157: MouseJstr]
+
+02/21
+ * Added actual item_db.sql into sql-files. [Lupus]
+ * Added actual mob_db.sql into sql-files. If you use SQL Mob DB then update it [Lupus]
+ * Updated Bleeding effect [celest]
+ * Removed some unused code for Graffiti [celest]
+
+02/20
+ * Char SQL: Rewrote/Fixed the castle save function, now the sql version saves castles! [Sirius]
+ * Fixed the /mm /mapmove command access bug [Sirius]
+ * Added skill requirements for the new guild skills [celest]
+ * Allow Emergency Recall to be cast in guild castles even if nowarp and
+ nowarpto mapflags are enabled [celest]
+ * Add 'minimum job level required' for skill_tree reading [celest]
+ - Berserk now requires job level 50
+ * Added Spring Trap to be able to trigger ankle snare traps that aren't
+ activated yet [celest]
+ * Added a fix in guild.c by Mellowz [celest]
+ * Some rewrites on the pet skill bonuses system -- also fixes pet bonuses
+ not effecting stats as they should [celest]
+ * Check whether a monster is still alive before starting a status change
+ -- also fixes the status_change_timer nullpo errors with grimtooth [celest]
+
+02/19
+ * Added bSubSize, bHPGainValue, and bDamageWhenUnequip [celest]
+ * Updated bSPDrainValue/Rate to accept a 'type' [celest]
+ * Set baby class players' size to 0(small) [celest]
+ * Fixed item_db2.txt reading printing wrong number of entries read [celest]
+ * Fixed @allskill not giving the newer stalker, whitesmith and creator skills
+ [celest]
+
+02/18
+ * Fixed a bug with statpoint.txt reading and giving too much stat points,
+ thanks to Benz / eAthenaC [celest]
+ * Fixed client errors when pecopeco Lord Knights/Paladins log in with a weapon
+ equipped [celest]
+ * Added bAddRace2 -- check item_bonus.txt [celest]
+ * Added mob_race2_db.txt -- contains 'main races' of certain monsters [celest]
+ * Updated description for backup_txt in char_athena.conf a bit [celest]
+ * Set read_map_from_cache to 2 (enable compression), and map_cache_file back to
+ saving in /db instead of /save, as suggested by Poki#3 [celest]
+ * Updated description for auto_counter_type, and set plaer_auto_counter_type
+ to 0 by default, as suggested by Poki#3 [celest]
+ * Use the event names from script_athena.conf to check whenever a player event
+ trigger is being read/set [celest]
+ * Removed an unused save/bank.txt [celest]
+ * Added some new cards effects. (check DB\changelog.txt) [Lupus]
+
+02/17
+ * Now all mobs have 10 drops slots. the last one is used for Cards Drops [Lupus]
+ Don't forget to update your SQL files (Drop Log: logs.sql and db_tables.sql
+ if u were using SQL Mobs DB. Update it from TXT! )
+ * Fixed Branch Log TXT filename [Lupus]
+ * Made all logs work with compiled TXT Server, too (removed old #ifndef) [Lupus]
+ * Added 4 columns into mob_db.txt (check DB\changelog.txt) [Lupus]
+ * Fixed some mobs drops (Whisper, etc) and some MVP mobs (bonuses were shifted...) [Lupus]
+ * Readded Chemical Protection -- i forgot to check for it when changing some
+ jA stuff earlier, sorry ^^; [celest]
+ * Removed some old eA code that was causing Frost Nova to do an extra hit
+ [celest]
+ * Corrected Vulcan Arrow's hits in skill_db -- the bug appeared when the
+ correct numbers hardcoded were removed [celest]
+ * Readded zlib and zconf .h files to under /lib for compiling in Windows,
+ thanks to Ser [celest]
+ * Fixed some compile errors in Windows, thanks to Ser [celest]
+ * Changed remove_control_characters back to supporting korean chars [celest]
+ * Moved some other code around [celest]
+ * Added Shinomori's changes to Dissonance -- don't increment the timer again
+ if the target has died [celest]
+ * Changed some nullpo checks back to normal null checks -- in some situations
+ it would be normal to get a NULL [celest]
+ * Changed some nullpo checks to print some debug information [celest]
+ * Added some sd checks before calling pc_blockskill [celest]
+ * Added Dino9021's fix for SQL char's friend list updating [celest]
+ * Fixed a crash if the player invited to join a guild is not online, thanks to
+ Alex14 [celest]
+ * Find the guild invitation sender first before clearing its ID [celest]
+
+ * Added 2 new script commands to support 2/15's cards patch... most of the
+ effects in kRO should be available now ^^ [celest]
+
+ - isequipped(...): Accepts a list of item ID's and checks whether all of
+ the items/cards have been equipped.
+ - isequippedcnt(...): Same as above, except it returns how many of the items
+ are being equipped
+
+ Example: if(isequipped(4002,4004,4006)) bonus bStr,1;
+
+02/16
+ * Char SQL: Fixed the Whisper chat on splittet mapservers (i think now all features work!) [Sirius]
+
+ * Added 3 more of the new card effects -- check item_bonus.txt [celest]
+
+ * Added 'bonus4' to support the new card effects that might need up to 4
+ parameters [celest]
+ * Set 'killerrid' and do PCKillEvent before calling PCDieEvent, thanks to
+ mrmagoo for pointing it out [celest]
+
+ * Added some new script event related options to script config [celest]
+
+ - [die/kill/login/logout]_event_name: Name of script to activate when an
+ event has occured
+ - event_requires_trigger: whether or not a 'set [EventName],1;' has to be
+ defined first for the event to be activated
+
+ * Added 8 of the new card effects on the 2/15's patch (still untested and
+ not yet added to the item_db)
+ - Refer to doc/item_bonus.txt for description
+
+ * Minor rewrites on self and enemy weapon/armor breaking during battle [celest]
+ * Added missing code for 'bBreakWeaponRate' and 'bBreakArmorRate' effects
+ [celest]
+ * Added missing code for 'bAddStealRate' effect [celest]
+ * Removed redundant 'infinite_autospell' in map_session_data [celest]
+ * Fixed Treasure Box spawn bug in all castles. [Lupus]
+ * Fixed wrong PresentLOG (it wasn't showing PRESENT BOX type ID) [Lupus]
+ * Expanded Monsters Drops Slots from 8 to 10. Everywhere in the sources. [Lupus]
+ But in TXT / SQL monsters DB reading functions, I added a temp plug
+ to make eA work fine with existing DBs. It reads only 8 drops and fills
+ 9th and 10th drops with Zero.
+ On expanding MOB_DB.TXT we'll remove that plug.
+ We are adding new cards and some monsters
+ have no free slots for them. Current state is tested and works fine.
+
+02/15
+ * Allow Potion Pitcher to be able to cast on yourself -- i've almost forgot
+ about this, thanks to Filougarou and Poki#3 for the fix ^^; [celest]
+ * Added Wallex's changes for weapon skills to read list_num from the skill_db
+ when calculating damage [celest]
+ * Login / Login SQL: Fixed the EXE-Version check (now it works finally :) [Sirius]
+ * Char SQL: Fixed the '0x2b05' reply to the mapserver (now multi - mapservers works again!)
+ * Rewrote skill blocking system that was allowing people to bypass blocking
+ time simply by casting a different skill [celest]
+ * Edited out some inconsistencies with skillnotok [celest]
+ * Corrected Investigate's damage calculation, thanks to matthias [celest]
+ * Generate the remaining entries of the stat point DB if the number of
+ entries in db/statuspoints.txt is less than MAX_LEVEL, or statuspoints.txt
+ was not found [celest]
+ * Try to spawn the player at a default map ("prontera.gat") when logging in if
+ the save point map was not found [celest]
+
+02/13
+ * added an @autoloot switch that Upa-kun has forgotten [Shinomori]
+ * changed pet_skillattack_timer and corrected the poison spore attack
+ * tighter check's on "unknown skill" error; but added prints to trace it
+ * Added Wallex's changes to only evoke script_rid2sd if agitcheck(1) is used
+ [celest]
+ * Merged jA's equipment breaking system into the current one, and corrected
+ items with unbreakable effects in the item_db [celest]
+ - "bonus bUnbreakable,[chance];" changed to
+ "bonus bUnbreakable[Weapon/Armor/Helm/Shield],0;"
+
+02/12
+ * Merged Dexity's pc_statpointdb into pc_readdb, changed statp's string
+ array to short (less memory), and fixed the db not giving status points if
+ character level is above 255 [celest]
+ * fixing and optimizing sharp shooting
+ have implemented two different versions, just have a look and
+ decide which to use, description is in the code [Shinomori]
+ * Changed default map cache path from db/map.info to save/mapinfo.txt [celest]
+ * Removed old code for Sharp Shooting (still a little buggy) [celest]
+ * Merged Shinomori's code into map_foreachinpath [celest]
+
+02/11
+ * mob.c fixed doubling entries in DROPS LOG, optimized [Lupus]
+ * item_noequip.txt now you can disable named consumable items
+ during GvG / PvP, too by Maya, optimized and checked [Lupus]
+ NOTE: Get rid of old cards on your server!!! IDs: 4149-4332
+ before using of this item_db.txt (some cards have changed their IDs)
+ and it could cause ALIEN cards in your players equipment 8))
+ i.g. a weapon compounding CARDS inserted in armor, etc...
+ * item_db.txt Massive update: [Lupus]
+ - Added all new missing items (up to st.Valentine's Day Event)
+ - Added new cards 4149-4332, sorted them and set their sripts.
+ - Fixed some names, typos, weigths and prices
+ * Commented out old custom cards from Old_Card_Album.txt till we brush them up [Lupus]
+ * Removed old custom cards from MOBs drops [Lupus]
+ thanks to Landarma(new items templates) Poki#3(removing cards from drops)
+ * Tidied up battle_check_target abit [celest]
+ * Updated traps to affect allies as well in GvG [celest]
+ * Check if login server is online before setting character to online (in SQL),
+ thanks to Alex14 [celest]
+ * Synchronise storage as well when saving character to cut down on item
+ rollbacks or duping, by Yor / Frea [celest]
+ * Added fix for super novices' Guardian Angel system crashing when base_exp = 0
+ thanks to Alex14 [celest]
+ * not realy fixing the "unknown skill" error
+ but returning skill_castend_damage_id when called with skillid < 0
+ still need to search a reason why it is called with -1 [Shinomori]
+ * EXPERIMENTAL: Reduced memory used for the skill_tree DB by 30+mb [celest]
+ * Added script commands isday and isnight - checks whether its night or
+ daytime. Example: if(isnight()) ... [celest]
+ * Skill Updates [celest]
+ - Sharp Shooting: Dropped jA's and kA's code and wrote a new
+ map_foreachinpath function in map.c -- about 14 times faster, but still
+ uncomplete
+ - Ankle Snare: Added matthias' suggestion to let agility reduce more trap
+ time, but no less than 3 seconds.
+ - Magnum Break: simplified code a bit, and changed to non-targetting /
+ automatically damages an area around the caster
+ - Tiger Fist: enable it to be used by its own besides as a part of
+ the combo skills
+ - Devotion: Fixed maximum level difference not reading its setting from
+ battle_athena.conf, thanks to leinsirk
+ - Soul Burn: Added some safety checks
+
+02/10
+ * Login/Login SQL: fixed the client version check function [Sirius]
+
+02/09
+ * Added conf-tmpl/readme.txt, explaining the import folder [1066: Ajarn]
+ * SQL Char: Rewrote the char_create function (now it's faster/optimized) [Sirius]
+ * SQL Char: Fixed the reply if a charname is invalid on create (now it replys denied..) [Sirius]
+ * SQL Char: Added a Character limit per Account (can be set in the config) [Sirius]
+ * SQL Char: Optimized some SQL-Querys [Sirius]
+
+02/06
+ * NULL entries for guild data fixed [Credit to Sirius] [1060: Ajarn]
+ * Login server uses login_db_userid and login_db_user_pass for
+ queries now [Credit to Sirius] [1059: Ajarn]
+ * Login server can now check clientversion in clientinfo
+ [Credit to Sirius] [1059: Ajarn]
+ * Fixed txt build compile problems[1057: MouseJstr]
+ * Corrected end-of-line issues in source code [1056: MouseJstr]
+ * Coded new command: @MOBINFO <monster name|monster N> [Lupus]
+ the command has also 2 aliases: @monsterinfo, @mi
+ It shows all Monster stats, Element, Race and stuff
+ It shows all items with their drop chance
+ It also shows MVP bonuses (MVP EXP, MVP Drops)
+
+02/05
+ * increased the max_files allowed in a grf [1054: MouseJstr]
+ * Changed the way char deletion works for SQL [1051: Ajarn]
+ - If the email the client fails check then check if the
+ email is blank and the DB email is a@a.com (default)
+ If so, assume it was created with _M/_F, and delete it
+ * SQL Login accepts _M/_F now [Credit to Sirius] [1049: Ajarn]
+ * Map server now actually reads bind_ip [1048: Ajarn]
+ Side note: login reads bind_ip, but doesn't use login_ip now.
+ * Made eA compile under AMD64 64-bit native [1047: MouseJstr]
+ * Changed interface binding to use a bind_ip instead of using
+ the login_ip, char_ip, or map_ip. This lets you still be
+ able to set your WAN IP seperate from what interface you
+ wish to bind to. Also, the default is back to binding to
+ all interfaces on the machine. [1045: MouseJstr]
+ * optimizing OnTouch event name generation [Shinomori]
+ * fixing Celests Sharp Shooting [Shinomori]
+ * Updated Sharp Shooting AoE code, thanks to Neodis / k-Athena [celest]
+ - Update: Adapt jA's path_search algorithm and removed the need of struct
+ 'dev' in map_session_data
+ - Update: Increase range to 14
+ * Tidied up explicit typecasts in status_get_max_hp, thanks to Ilpalazzo-sama
+ [celest]
+ * Non-MVP / miniboss summoned monsters should give exp, my mistake ^^; [celest]
+ Note:- minibosses are considered a 'Boss' as well, not just MVP's
+ * Fixed a typo that was preventing packet version 5 clients (628sak) from
+ logging in (it was supposed to only block those with 4 or below) [celest]
+
+02/04
+ * Fixed more compile signed/unsigned errors [SVN 1040: MouseJstr]
+ * TXT convertors now read the import command in inter_athena.conf
+ [SVN 1038: Ajarn]
+ * Fixed some compile errors [SVN 1037: MouseJstr]
+ * Added common/buffer.(c/h) [SVN 1033: Ajarn]
+ * Login server can now set it's ip address in the config [SVN 1033: Ajarn]
+ * Servers now bind to a single ip address, thus allowing multiple servers to
+ a single port [SVN 1033: Ajarn]
+ * Added experimental code to generate a stack dump when it segfaults, thanks
+ to Ser [celest]
+ - does not work with Cygwin, as it does not have glibc
+ - to enable, edit the Makefile and remove the # on the line:
+
+ # OPT += -DDUMPSTACK -rdynamic
+
+ - What it does: everytime eA crashes it'll generate a file "stackdump_
+ <number>.txt" in your save folder with a backtrace, which you can
+ examine and send to a dev to be fixed.
+
+ * Some more tidying up in status_get_ functions [celest]
+
+02/03
+ * When loading shop scripts automatically check if the prices can be exploited
+ with OC/DC [celest]
+ * If the buying price provided in item_db.txt is above 2x higher than selling
+ price for an item no need to reset and redetermine the buying price [celest]
+ * Fixed a mistake that was causing Ruwach to only work in PvP and PvM [celest]
+ * Added DracoRPG's code for Joint Beat effects, thanks! [celest]
+
+02/02
+ * Added checks to prevent some crashes in skill.c
+ [Full credit to shinomori] [SVN 1022: Ajarn]
+ * Removed nullpo check in skillnotok() -- otherwise it will display fail
+ messages for monster skills [celest]
+ * Added crash check for Ice Wall [celest]
+ * Added some optimisations by Ilpalazzo-sama [celest]
+ - reduce mob_data->size variable to 1 bytes
+ - change from if-else to switch statements in buildin_strmobinfo
+
+01/31
+ * Fixed a typo in Pressure causing it to deduct sp from the caster, and remove
+ its sp_rate requirement [celest]
+ * Updated skill_range_leniency code when casting a ground targetting spell
+ ( as in Revision 968) [celest]
+ * Added Karma and Manner to const.txt
+ -- To change a player's alignment to more Good/Evil in scripting for example,
+ use:
+ set Karma, Karma + <number here>;
+
+ In older exe's (11-08 or older) you can actually check your karma in the
+ character alignment screen (alt-A)
+ The rest is up to your scripting creativity ^^
+
+ * Delete players' ID from id_db when kicking everyone from the map-server due
+ to char disconnection -- Fixes an odd crash with lazy mob AI [celest]
+ * Added at(@) command @autoloot, which turns autoloot on or off for the
+ player who uses it [Upa-Kun]
+
+01/29
+ * Fixed Storage Bug with Named Stackable items. Thanks to Nimion [Lupus]
+ e.g. Arrows, Iron, Elemental stones, etc...
+ * Added a crash check to Safety Wall, thanks to LebrEf[TaVu] / Freya for
+ pointing it out [celest]
+ * Added some optimisations in clif_parse_MapMove, by Ilpalazzo-sama [celest]
+
+01/28
+ * Fixed a typo that was causing /in to always report failure even when the
+ name was removed from the ignore list [celest]
+ * Link "wisexin", "wisexlist" and "wisall" to the PM ignore functions, and
+ "friendslistadd" and "friendslistremove" to the friends list functions
+ when parsing the packet DB [celest]
+ * added clif_parse_PMIgnoreList (packet 0xd3) from jA [celest]
+ * Added DUMP_ALL_PACKETS and moved dump packets code in clif_parse a bit to
+ support it [celest]
+ * Added base code for Party Item Sharing -- still needs some work in client-
+ server support [celest]
+ * new GC link http://amber.stormbirds.org/~joshs/gc6.4.tar.gz
+ This fixes some issues... works better
+ * Added macros skill_chk and skill_get to check for out of bounds errors when
+ retrieving info from the skill_db [celest]
+
+01/27
+ * Added memory leak fixes with temporary script variables and pets-related
+ actions, by End_of_exam / jA 1109 [celest]
+ * Kick all characters when the char server disconnects from the map
+ server [celest]
+ * Added @changelook command for spriters to test view ID's [celest]
+ * Added a check to Pneuma to prevent crashing, thanks to LebrEf[TaVu]/Freya for
+ pointing it out [celest] [celest]
+ * Tweaked garbage collection code after feedback from users
+ [SVN 1002: MouseJstr]
+ * Fixed TRADE exploits (it cures proxy hack / vending+trade hack) thanks to Freya [Lupus]
+
+01/26
+ * Added bug fix for a memory leak caused when a character logs out,
+ by End_of_exam / jA 1108 [celest]
+ * Fixed a bug in gettick cache when compiling in Windows, thanks to Shinomori
+ (jA 1094) [celest]
+ * Added updates from jA 1092 [celest]
+ - Changed "read_map_from_bitmap" to "read_map_from_cache",
+ "map_bitmap_path" to "map_cache_file" in map_athena
+ - Fixed item effects not showing when only one was used
+ - Fixed a bug in Safety Wall
+ - Allow only either Storm Gust or Lord of Vermillion to cause damage if
+ stacked together
+ - Added path_search_long, map_find_skill_unit_oncell
+
+ * Added status_get_sc_def for calculating resistance against status
+ abnormalities [celest]
+ * Added status.c and status.h of jA 1091 update and moved some functions into
+ the new source files:
+ -- skill_status_change_ -> status_change_
+ -- battle_get_ -> status_get_
+ -- pc_calc_ -> status_calc_
+ -- pc_getrefinebonus and pc_percentrefinery -> status_getrefinebonus and
+ status_percentrefinery
+
+ * Updated auto_counter_type's description in battle_athena, thanks to
+ akusarujin for pointing it out [celest]
+ * Removed some unnecessary skill level checks in battle.c [celest]
+ * Removed my changes to /stable/Makefile which has libGC enabled by default
+ that i've accidentally commited, sorry ^^; [celest]
+ * Removed an unnecessary "cloneskill_lv" from map_session_data [celest]
+ * Removed WATER.TXT (this file wasn't used at all. There's no such mapflag as WATER even). [Lupus]
+ * Added Water Height of New Yuno Fileds 9 and 11.
+ Now Water Ball works there as should. Wizards could levelup on sleepers, too. [Lupus]
+ * libGC isn't ready to be the default quite yet... [MouseJstr]
+
+ Enough people have asked so... Once you grab a copy of the
+ libGC library from (http://amber.stormbirds.org/~joshs/gc6.3.tar),
+ you start up a bash shell from inside cygwin and untar
+ the gc6.3.tar. This will produce a gc6.3 directory. Then
+ cd into that directory and type ./configure. Once that is
+ done you type "make" and then "make install". This will
+ spray the various includes and libraries all over your
+ cygwin install (most in /usr/local).
+
+ Now, edit Makefile and change the CC line to use the
+
+ CC = gcc -pipe -DGCOLLECT
+
+ entry. Also change the GCLIB to
+
+ GCLIB = -L/usr/local/lib -lgc
+
+ Remember to comment out the ones no longer used. Do a clean
+ build and good luck. Obviously, this has not been tested
+ by that many people so you really are on the cutting edge
+ but if you have good results, send me a note
+ (joshs@stormbirds.org) so that we can see if it really is
+ ready for prime time.
+
+ What should you see? Well, the map-server should not
+ grow/consume extra memory anymore. More so, it should use
+ dramatically less memory then it did before using the
+ garbage collector.
+
+ The downside is that it will consume a little more CPU...
+
+ The question is, how much? how laggy? what effect on lots
+ of players? I've heard stories saying it makes the server
+ unplayable and others told me that they saw no
+ player-visible effects at all.
+
+
+01/25
+ * Fixed TXT compile problems with libGC [celest]
+ * Added "Clients older than 2004-09-06aSakray" option to packet_ver_flag in
+ battle_athena, just in case server owners still prefer the older clients.
+ With so many changes to Sakray over the past months its much better upgrading
+ to the newer clients (November or higher recommended) available ;P [celest]
+ * Merged Full Strip into jA's tidier stripping skills code -- also fixes
+ a typo that was causing Full Strip to do the reverse effect instead,
+ and the skill not updating the target's status after successfully unequipping
+ items [celest]
+ * Tidy up the 4 chemical protection skills into one code block [celest]
+ * Corrected Slim Pitcher's code -- sorry, i missed a few things ^^; [celest]
+
+01/24
+ * Fixed a typo in Provoke that was causing crashes [celest]
+ * Fixed another compile warning in src/char/char.c
+ [SVN 985] [MouseJstr]
+ * Fixed a account wipe bug in login/login.c (Thanks Wallex)
+ [SVN 984] [MouseJstr]
+ * Fixed a crash in char_sql/char.c where people were selecting
+ chars before requesting connections [SVN 983] [MouseJstr]
+ * some G++ compile tweaks and got through several files in the
+ map server - [SVN 976] [MouseJstr]
+
+ Why are we doing a C++ conversion? We have a lot of duplicate
+ code and would like to make the "classes" in the server share
+ code.. For example, a pet should be able to share code from
+ the player or from a mob. Similerly, introducing a new type
+ of entity in the game should be as simple as creating a
+ sub-class instead of having to crawl through the entire source
+ tree searching for every class check and introducing handler
+ code in for your new type.
+
+ Finally, while a garbage collector is "cool", it would still
+ be nice to have enough object knowledge on how to clean up
+ data that it is not absolutely required. It is faster for
+ us to clean up our own messes then introduce a whole system
+ for cleaning up after ourselves.
+
+ Is there a C++ performance penalty? Not if the code is
+ written correctly. For example
+ 1) No templates - code bloat and destroys cpu cache
+ coheriancy
+ 2) No C++ exceptions - slows down entering and
+ exiting functions
+ 3) No operator overloading - makes it hard to
+ understand what is going on.
+ 4) No C++ STL libraries - Templates, huge, bloated,
+ unportable
+ 5) No method inlining - code bloat and reduces cache
+ coheriancy. Let the optimizer do it...
+
+01/23
+ * char-server (SQL & TXT), login-server (SQL & TXT), and txt-coonvertors
+ (char and login) all compile on g++ now [svn 975] [Ajarn]
+ * Fixed the sizeof errors in g++ [SVN 972] [Ajarn]
+ * Reverted back some of the char* changes [SVN 972] [Ajarn]
+ * Changed parse_script to now return char* [SVN 969] [Ajarn]
+ * Converted run_script and run_script_main from unsigned char* to char*
+ [SVN 969] [Ajarn]
+ * Forgot a couple small changes [SVN 35] [Ajarn]
+ * Changed map_data.gat and map_data_other_server.gat from unsigned char*
+ to char* (this might be needed, because of unicode or something, please
+ correct me if I'm wrong) [SVN 34] [Ajarn]
+ * Converted decode_zip, encode_zip, remove_control_chars, mapif_sendall*,
+ and e_mail_check to use char* instead of unsigned char* (again, please test)
+ [SVN 34] [Ajarn]
+ * Modified skill unit group checking in skill_unit_onplace that might have
+ been causing crashes [celest]
+ * Updated packet 0x143 length's for version 14 (2004-11-01Sakexe) and version
+ 16 (2005-01-10Sakexe), thanks to jathena and ice2big [celest]
+ * Fixed login-server compile error with the "new" -> "new_" changes [celest]
+
+01/22
+ * Fixed an error that was in my last commit (optimising g++ build) [SVN 29]
+ [Ajarn]
+ * Made strlib functions char*, instead of unsigned char*. Strings are meant
+ to be char. (Shouldn't break anything, but might, please test this for me)
+ [SVN 26] [Ajarn]
+ * Added cast for TXT version [SVN 25] [Ajarn]
+ * Added cast from allocation calls, from void* to intended type [SVN 24] [Ajarn]
+ * Changed bool -> bool_. Still need to make convertions between
+ char* and unsigned char* valid, and some other convertions too.
+ Also, sizeof is being used wierd in map.c, at least g++
+ complains [SVN 22] [Ajarn]
+ * Changed the rest of the class variable names to class_ and all the new
+ variable names to new_, for futher g++ support [SVN 21] [Ajarn]
+ * Update both caster and target's SP after using Soul Change -- thanks to Aalye
+ / Freya [celest]
+ * Force a monster to switch attack target when being casted Provoke [celest]
+ * Corrected description for @enablenpc -- "@npcon" -> "@enablenpc" [celest]
+ * Since job normalising is still buggy require all 1st class skills to check
+ for Basic Skill level when calculating the skill tree [celest]
+
+01/21
+ * Updated packet DB configurations : enable_packet_db, packet_db_ver,
+ -- check the .txt for description [celest]
+
+ Note: For people having connection problems try setting 'enable_packet_db'
+ to 'no'... and use the latest client (01-10Sakexe)
+
+ * Fixed a small typo in 12-06's packets -- 21b => 21d [celest]
+ * Updated packet_db.txt to only contain the latest version, like jAthena,
+ since there's not much point to re-read packets eA already supports
+ (although if you remove all the //'s it can still read multiple versions)
+ [celest]
+ * Added clif_config in clif.c - for keeping packet/client connections related
+ stuff [celest]
+ * Send 'Game Exe not latest version' to a client if it hasn't been authentified
+ yet, but is sending a non-connection-related packet to prevent crashing
+ -- assume the client is using an unknown exe [celest]
+
+01/20
+ * Fixed compile time problems with the non-GC case [MouseJstr]
+ * Introduced aMallocA and aCallocA
+
+ These two functions allocate "atomic" memory which means
+ "memory that does not contain references to other memory".
+
+ This lets the garbage collector ignore these objects when searching
+ memory for references to other objects dramatically increasing
+ performance of the GC.
+
+ When in doubt, use aMalloc and aCalloc. It is better to add
+ a tiny bit of work to the GC then do cause a crash due to memory
+ being cleaned up when it shouldn't.
+ [MouseJstr]
+ * Modified all calls to aMalloc and aCalloc that reference
+ atomic memory to use aMallocA and aCallocA
+ [MouseJstr]
+ * Modified the socket buffer allocator to use "atomic" memory
+ for the fifo data buffers [MouseJstr]
+01/19
+ * added support for the Hans-J. Boehm libC garbage collector
+ (A copy is in http://amber.stormbirds.org/~joshs/gc6.3.tar).
+
+ It is ABSOLUTELY critical for people to use
+ aFree/aMalloc/aCalloc/aStrdup for this to work. If somebody
+ has just used free or malloc, this will crash when used with
+ the garbage collector.
+
+ A amusing environmental variable to set is GC_PRINT_STATS (to 1)
+ so that you see real time statistics of leaked data being
+ recovered.
+
+ grab a copy of the gc6.3.tar.. build it .. install it..
+ modify the Makefile to have the
+
+ CC = gcc -pipe -DGCOLLECT
+ GCLIB = -lgc
+
+ lines... and make the sql servers (the txt server doesn't
+ build using this right now due to stupid Makefile issues)
+
+ [MouseJstr]
+ * SVN 3 on http://svn.stormbirds.org/svn/eathena will be what
+ I diff against when I merge back into delta.. if we ever merge
+ back into delta [MouseJstr]
+ * Removed 12-06 Sakexe detection, since it doesn't seem to work, and
+ might be conflicting with 10-25 clients [celest]
+ * Update the Soul Burn target's SP when it has been successfully reduced to 0,
+ thanks to Aalye / Freya [celest]
+ * Moved SC_PRESERVE and SC_BATTLEORDERS's id so they'll display a status icon
+ when cast, thanks XiaoLin of cAthena [celest]
+ * Added missing code for Preserve -- i totally forgot to add it ^^; [celest]
+
+01/18
+ * Added some skill bug fixes, thanks to Aalye / Freya [celest]
+ - stop player attacking if the target goes into hiding
+ - fixed Sword Reject not working against swords, only daggers
+ - additional check in case Marionette Control doesn't end properly even
+ when one of the partners has logged off
+ * Added stun, bleeding and SP loss effect for Pressure, thanks to DracoRpg
+ [celest]
+ * TEST: Fixed more compile warnings in MSVC [celest]
+ * TEST: Fixed some compile errors in MS Visual C++, thanks to Ser [celest]
+
+01/17
+ * Some rewrites in skill_delayfix [celest]
+ - If the delay is < 0, add the weapon aspd delay to it
+ - If the skill is not weapon type, and has 0 delay, add 300ms as default
+ * Added min_skill_delay_limit as the minimum allowed delay for any skills
+ [celest]
+ * Some tidying up in battle_get_ functions [celest]
+ * Set exp table and job bonus table to 0 before reading - might solve some
+ memory bugs [celest]
+ * Updated skill range leniency code - If possible try and move towards the
+ skill target so that when casting it no longer falls out of range [celest]
+
+01/15
+ * Added effects to enemies for Gospel [celest]
+ * Added mobs spawn to all Yuno fields (according to 4th Jan patch) [Lupus]
+
+01/14
+ * Added party supporting effects for Gospel [celest]
+
+01/13
+ * Added and testing support for 2004-12-06Sakexe [celest]
+ * Removed emblem changing requiring Glory of Guild limited to TXT only [celest]
+ * Corrected a typo preventing Plagiarism to work, thanks to orn [celest]
+ * Fixed Berzebub card and other 'reduce cast delays' equipment not working
+ [celest]
+ * Updated packet_db.txt loading to support reading into multiple packet
+ versions [celest]
+ * Removed packet_db_ver defining in packet_db.txt -- it'll determine itself
+ based on MAX_PACKET_VER [celest]
+ * Integrated packet size and function DB's into 1 packet_db [celest]
+ * Added MAX_PACKET_VER -- maximum versions supported by eA, including the
+ packet_db -- and changed packet size and function DB's to use it [celest]
+ * When sending 'Game exe not latest version' packet don't close the session
+ immediately so it will still be delivered [celest]
+ * Added map-server display if an unidentified client was rejected --
+ also fixes the 'empty string sent to _showmessage' [celest]
+ * Added a bug - Celest, LOOK AT THIS BUG ASAP. [Codemaster]
+ * Tided up/fixed some mobs [Lupus]
+
+01/12
+ * Implemented Vending Log [Lupus]
+ TODO: use log option to log only important deals (much money, rare items, etc)
+
+01/11
+ * Added Shinomori's changes to npc event timers (I never realised it, thanks
+ ^^; ) [celest]
+ * Updated clif.c to be able to identify client versions based on the packet DB
+ [celest]
+ * Correct packet_db_ver to the maximum version allowed if it was set too high
+ or too low in packet_db.txt [celest]
+ * Added support for 2005-01-10Sakexe [celest]
+ * Updated packet functions for 2004-11-08 and 2004-12-06 (Note: eA *can*
+ support 12-06, but still doesn't recognise it... so unless we find a way,
+ it is *not* supported yet) [celest]
+ * Updated packet_db, thanks to Sara-chan [celest]
+ * REMOVED support for clients before packet version 10 (2004-08-25 and
+ earlier) - the client will receive a 'Game Exe not latest version' message
+ [celest]
+ * Added a check to prevent crashing when trying to log in with
+ 2005-01-10aSakexe in servers that don't support it [celest]
+ * Added a fix to @sound where if you forgot the .wav exention, i'd attempt to play the file without it (it adds the .wav) [Codemaster] [SVN 949]
+ * Added @disguiseall / @undisguiseall [Codemaster] [SVN 949]
+ * Added misc. clif.c fixes (jAthena added alot of close(fd)'s, so i added them, too) [Codemaster] [SVN 949]
+ * Added bug reports - Celest, you might want to check one of those out [Codemaster] [SVN 949]
+ * Fixed a bug in clif.c which didn't allow to enther the map-server.
+ It worked under win32, but didn't under Linux. [Lupus]
+
+01/10
+ * Completed adding packet DB reading... still needs (a lot) more work in
+ clif.c [celest]
+ * Added Shinomori's suggestions for npc timers, thanks again ^^ [celest]
+ * Removed checking for script event timers' length, and added Shinomori's
+ changes [celest]
+ * Start adding packet DB reading [celest]
+ * Added 'max_eventtimer_length' (default is 32) to script_athena.conf. [celest]
+ Some event timers with names longer than 24 could cause the server to close
+ itself, change this if you need support for even longer names
+ * Removed PCLoginEvent requiring 'PCLoginEvent' for the player to be set to 1
+ first to be activated. [celest]
+ * Added Shinomori and orn's fix for the skill tree to only check the first
+ required skill in the DB and skipping the rest [celest]
+ * Modified 'wedding' script command to work with "OnTimer" scripts even without
+ doing 'attachnpctimer' (The 'player not attached' error will still display,
+ but the effect will appear *over the NPC* instead of the player...
+ at least it won't fail ^^) [celest]
+ * Added 'attachnpctimer' script command for attaching the player to the current
+ npc's timer in "OnTimerxxxx" scripts, thanks to Wallex for the idea. [celest]
+ Syntax:
+ attachnpctimer;
+ attachnpctimer "<Player Name">;
+
+ Check /npc/sample/npc_test_npctimer2.txt for example.
+ * Added 'detachnpctimer' script command for detaching players from the npc's
+ timer. [celest] Syntax:
+ detachnpctimer;
+ detachnpctimer "<NPC Name">;
+
+ * Added 'OnInterIfInitOnce' for WoE scripts & modified the WoE scripts as well [Ajarn & Codemaster] [Thanks to FREYA] [SVN 943]
+ * Added the @sound command and the NPC command of soundeffectall
+ - works just like soundeffect, but plays for everyone in the area [Codemaster] [SVN 942]
+ * Don't allow Pets to attack Guardians outside of WoE [Codemaster] [SVN 940]
+ * Require 15% of HP or more for WE_MALE skill [Codemaster] [SVN 940]
+ * Require 15% of SP or more for WE_FEMALE skill [Codemaster] [SVN 940]
+
+01/07
+ * Upon changing to high novice 100 stat points should be given, not 88 [celest]
+ * Give high novices First Aid and Trick Dead upon job changing [celest]
+ * Remove some unnecessary checks in battle.c [celest]
+ * Added some checks to prevent novices still allowed to attack when using
+ Trick Dead [celest]
+ * Added 'summon' script command. Syntax:
+
+ summon <monster name>,<monster id>[,<event>];
+
+ Example: 'summon "Poring", 1002, "OnPoringKilled"; 'will summon (note:
+ not *spawn*) 1 poring that'll help its master for 1 minute,
+ and activate the "OnPoringKilled" event when killed.
+ 'summon "--ja--",-1;' will summon a random monster.
+
+ * Added Wallex's fix for the wedding script functions [celest]
+ * Added the below-mentioned alive packet to SQL's char and login [celest]
+ * Enabled login server 'anti-freeze' by default as a temporary solution
+ to char-login disconnection [celest]
+ * The TXT char server was rejecting login's "i'm alive" packet and disconnecting
+ it... fixed [celest]
+ * Stall_time wasn't being read in login_athena at all (not by the login server,
+ because the code didn't read it, nor by TXT map server, since its in the SQL
+ inter_athena.conf reading)... so moved it to inter_athena.conf, and
+ change sql_config_read in map.c to inter_config_read [celest]
+ * Some tidying up of battle_get_def and _def2 [celest]
+ * Added 'bDelayrate' and changed Phen card, Marduk Card and Berzebub Card's
+ effects to use this instead of bCastrate (which was reducing casting time,
+ not delay time) [celest]
+ * Some tidying up of skill_castfix and skill_delayfix [celest]
+ * Added Filougarou's fix for Bowling Bash causing it to only display damage,
+ but doesn't do any - thanks! [celest]
+ * Set delay_dependon_dex in battle_athena to 'no' by default [celest]
+
+ Note: Just to clarify things, on official servers dex is not supposed to
+ reduce skill delays, only Poem of Bragi and Berzebub card does!
+
+ * Fixed typo in skill_delayfix - reduce delays only if delaynodex was *not* set,
+ sorry ^^; [celest]
+
+01/06
+ * Fixed various memory corruptions causing crashes (SVN 925) [MouseJstr]
+ * Fixed typo in src/map/map.c causing compile
+ errors (SVN 924) [MouseJstr]
+ * Removed the alive_timer mechanism entirly replaced with
+ a stall detection mechanism that will disconnect a player
+ who has not sent any data for a configurable
+ (conf/login_athena.conf:stall_time) amount of time. The default
+ is currently 60 seconds.
+
+ The root cause of the disconnect error is that some NAT based
+ routers are not dropping the TCP connection when the aliased
+ machine goes offline abnormally. This means that we are seeing
+ a stalled but perfectly valid TCP connection.
+
+ (SVN 924) [MouseJstr]
+01/05
+ * Fixed some typos in map_versionscreen() [MC Cameri]
+ * Removed loop freeing in map-server's do_final(), it was causing seg faults [MC Cameri]
+ * Finished do_storage_final() in map-server's do_final(), it was there but doing nothing [MC Cameri]
+ * Fixed Celest's typo making all vended items cost 0 zeny [Codemaster] [SVN 919]
+ * If a vending item was priced at 0 it'll be auto changed to 1million [celest]
+ * Fixed TXT logging - log_athena.conf reading was kind of messed up [celest]
+ * Added a simplified version of Qamera's OnConnect: OnDisconnect: OnDeath:
+ NPC events mod, (All credits go to him.) except adapted based on eA's current
+ PCLoginEvent. (by davidsiaw) [celest]
+ - Currently only 4 events have been added: PCDieEvent, PCKillEvent,
+ PCLogoutEvent and PCLoginEvent
+ - For notes and usage example check /npc/sample/PCLoginEvent.txt (by
+ davidsiaw)
+ - To enable them for a player in a script, do
+ "set <name of event>, <0 or 1>;"
+ (yes it's saved in a permanent character variable and auto read every time)
+ - Simply put, if any of them is set to 1 the appropiate event will activate
+ p.s - Scripters who are already using PcLoginEvent, you'll need to add a
+ "set PCLoginEvent, 1;" now, sorry for the trouble.
+
+ * Optimised PCLoginEvent activation a bit [celest]
+ * Set 'droprate0item''s default to 'yes' so that items with 0 rate will never
+ drop [celest]
+ * Look at item type other than item ID as well to check whether it is a card
+ in card-related script commands - better support for custom items [celest]
+ * Reset all skill variables if the skill fails so certain skills can't be
+ abused (such as Warp, thanks to Alex14 for pointing it out) [celest]
+ * Added /mapflag/noreturn.txt for disabling butterfly wings (not fly wings)
+ [celest]
+ * Fixed skill_require_db reading somehow getting corrupted if weapons usable
+ for the skill is more than 20, thus causing the skills to fail everytime
+ [celest]
+ * Fixed @killmonster crashing the server with summoned monsters, thanks to
+ Alex14 [celest]
+ * Added double_connection_system to battle_athena (not completed yet) [celest]
+
+01/04
+ * Fixed GM Command Logging (Not sure why TXT logging still isn't working properly :( ) [Codemaster] [SVN 907]
+ * Fixed one of Lupus' additions to the item_db [Codemaster] [SVN 907]
+ * Fixed Seismic Weapon Skill (it 100% didn't break target's weapon at 4 level of the skill) [Lupus]
+
+01/02
+ * Re-fixed map-server crashing if an empty line is in skill_castnodex.txt,
+ thanks to Alex14 for pointing it out (SVN 899) [celest]
+ * Modified breaking rates calculating - meltdown's chances is separated from
+ self breaking chances (SVN 900) [celest]
+ * Reduced MAX_SKILL_LEVEL to 10 to save a bit of memory and speed [celest]
+ * Tidied up parts in skill_castfix a bit (SVN 895) [celest]
+ * Fixed map-server crashing if an empty line was added in any of the skill-xx
+ db files (SVN 895) [celest]
+ * Updated skill_castnodex reading - An *optional* 3rd value can be added to set
+ whether a skill's delay time can be affected by dex (SVN 895) [celest]
+ Example: 46,1,1 - double strafe's delay is not affected by dex
+ 46,1,0:0:0:0:1 - only level 5 double strafe is not affected by dex
+ * More atempts at memory leak fixes [Codemaster] [SVN 890]
+ * Updated weapon breaking rates, thanks to DracoRPG (SVN 891) [celest]
+ * Optimized enchanting skills success rates calculation, thanks to Wallex
+ (you were right! ^^; ) (SVN 891) [celest]
+ * Modified Spiral Pierce and Breaker to type ranged (SVN 891) [celest]
+
+01/01/05
+ * Attempted to fix a memory leak [Codemaster] - tell me if it works XD (NPC/Mob memory leak in npc_parse_mob(...)) [SVN 886]
+ * Added a char config that allows GMs that have a certain level or above to
+ bypass the server's user limit [Codemaster]
+ * Changed some create arrow outputs for new kRO 12/21/04 patch [Aria]
+ * Fixed some respawn delays of MVP/Miniboss monsters. Redo Umbala/Niflheim fields, added missing mobs, corrected
+ monsters quantity. In Niflheim fixed wrong Lord of Death monster ID. [Lupus]
+12/30
+ * Added ispartneron, getpartnerid, and warppartner script
+ commands to properly support jawaii NPC's (SVN 880) [MouseJstr]
+ * Moved supernovice guardian angel messages to msg_athena.conf [celest]
+
+12/29
+ * Fix account register wipe issue (SVN 868) [MouseJstr]
+ * Double storage/lag exploit fixed (SVN 867) [MouseJstr]
+ * Another -1 alive_timer fix (SVN 866) [MouseJstr]
+ * Added @dmstart and @dmtick for debugging malloc tests [MouseJstr]
+ * Fix some more compile errors on different platforms [MouseJstr]
+ * Fixing a crash if you change the name of a pet you don't have (SVN 863) [MouseJstr]
+ * Eliminated src/common/malloc.c when not needed [MouseJstr]
+ * Some code cleanup in prep for new debugging malloc (SVN 861) [MouseJstr]
+ * Updated Soul Breaker's damage calculation [celest]
+ * Updated Meteor Assault's cast delay to be not affected by dex [celest]
+ * Changed int_guild.c so it will calculate average guild level only if > 0
+ members are found - prevent divide by zero crashes (why would an empty guild
+ be requested to update its' member info in the first place?) [celest]
+ * Added Shinomori's fixes for string copying in script.c [celest]
+ * Removed @giveitem since #item it's the one that does this and added some of it's support to #item [MC Cameri]
+ -#item <item_name> <item_count> <charname|all|everyone>
+ * Uncommented out import in charcommand_athena.conf, there is
+ need to have it commented (all the others ones are
+ uncommented) [Ajarn]
+
+12/28
+ * When restarting the char-server, reset the online status
+ of all characters and guild-members (SVN 849) [MouseJstr]
+ * Fix double timer_delete caused by pc_alive_timer (SVN 848)
+ [MouseJstr]
+ * Fixed typo in npcs_athena.conf (mc_cameri verses mc_Cameri),
+ thanks Mellow972 for pointing that out (SVN 845) [MouseJstr]
+ * Reduced weapon breaking chance for Overthrust, thanks Draco - i almost
+ forgot to add this update [celest]
+ * added checks into the skill code to prevent proxy's/bots
+ from crashing the server by using skillid's that
+ are WAY out of range (SVN 841) [MouseJstr]
+ * Fixed clif.c errors that prevent old clients from being used. [nsstrunks]
+ * Fixed @jobchange to not default to upper (SVN 837) [MouseJstr]
+ * Fixed a compile error in @mobsearch (SVN 836) [MouseJstr]
+12/27
+ * Updated 1206's packet fuctions in clif.c [celest]
+ * Updated the new guild skills - cannot be reused within 5 minutes of
+ activating it [celest]
+ * Added @mobsearch, @cleanmap and @giveitem from jA [celest]
+ * Fixed the guild issues (SVN 832) [MouseJstr]
+ * Updated description for player_check_cloak_type [celest]
+ * Increased skill range limitations in pc_no_footset [celest]
+ * Added exp_calc_type - to alternate between 3 different versions for exp
+ calculating [celest]
+ * Reinitialized variable 'c' in map_readmap, it's supposed to have a start value. Ex. '-'. [MC Cameri]
+ * Commented out dump_timer_heap() again... [MC Cameri]
+ * Added include of string.h in malloc.c, was causing compile errors/warnings [MC Cameri]
+ * Modified the map progress bar to reduce updates (SVN 829) [MouseJstr]
+ * Updated map cache system from jA 1087 - change read_map_from_bitmap to 2 to
+ enable zlib compression [celest]
+ * don't delete alive_timers of -1 (SVN 823) [MouseJstr]
+ * switched malloc,calloc,realloc to aMalloc, aCalloc, aRealloc
+ so support the use of a garbage collector (SVN 821) [MouseJstr]
+ * Removed some printf's from map-sql [MC Cameri]
+ * Uncommented MSG_SQL, for _ShowMessage(), usage: ShowSQL() [MC Cameri]
+ * Removed fixed bugs in dev/bugs.txt [MC Cameri]
+ * Now I remember what I was smoking.. (SVN 819) [MouseJstr]
+ * Fixed a bug in the guild_castle persistance code
+ in char_sql. What was I smoking? (SVN: 816) [MouseJstr]
+ * Corrected a bad error in itemdb_read_itemslottable [celest]
+ * Corrected wrong logging of text in int_guild.c, thanks to Alex14 [celest]
+ * Summoned monsters will not give exp and items [celest]
+ * Added the 6 new Yuno fields to maps_athena.conf [celest]
+ * Added some Freya's optimisations in clif_parse [celest]
+ * Added clif_update_mobhp - monsters' hp viewing now updates properly [celest]
+ * Set alive_timer to -1 when quitting, not 0, or the map server might assume
+ its still active [celest]
+ * Changed the *_override_grffile to no by default, because many were having issues with it [Ajarn]
+
+12/26
+ * Fixed ANOTHER pet crash (double free) (SVN: 804) [MouseJstr]
+ * Added a proper #define for MAX_VENDING (SVN: 802) [MouseJstr]
+ * Fixed crash associated with vending more then 12 items
+ which walked on memory.. corrupting the pet data
+ structure (SVN: 801) [MouseJstr]
+ * Fixed a crash that resulted when disconnecting (SVN 800)
+ the new client when the old client is still connected [MouseJstr]
+ * Fixed some gcc 2.95 compile errors [MouseJstr]
+ * Fixed some array bounds errors (SVN 799) [MouseJstr]
+ * @mapexit (and do_final) now persist all data to the
+ char server before exiting to eliminate storage/inventory
+ inconsistancies.. [MouseJstr] (SVN 793)
+ * Some cleanup of spiritball memory management [MouseJstr]
+ * Dramatic performance work for exp updates to sql. Previously, [MouseJstr]
+ when u killed a mob (in party share), it would cause the char_server to
+
+ 1) Delete all guilds for all members of your party
+ 2) Re-create all guilds for all members of your party with the new exp
+ values.
+
+ Now it just generates 2 sql statements per party member,
+
+ 1) update the guild exp,
+ 2) update the guild_member exp.
+
+
+ src/common/socket.c src/common/socket.h src/char_sql/char.c
+ src/char_sql/int_guild.c src/map/chrif.h src/map/pc.c
+ src/map/map.c src/map/chrif.c
+
+ * Disabled import charcommand_conf.txt by default [celest]
+ * Added Bitmap File system from jA 1086 - automatically generates a cache
+ from maps in the GRF to speed up loading. You can enable/disable it with
+ read_map_from_bitmap in map_athena.conf. Note: AFM maps will override this
+ cache [celest]
+ * Added --run_once flag for the map server for testing purposes - closes itself
+ when everything is done loading [celest]
+ * Added some code for Moonlit Petals and Basilica [celest]
+
+12/24
+ * Added suggested fix when client disconnected [celest]
+ - send "disconnected due to time gap" and close session when timed out
+ - send "server still recognises last login" message and close existing
+ session when client reconnects
+ * Upped windwalk to lv 10 in skill_tree [MouseJstr]
+ * Fixed a scripting crash (SVN: 781) [MouseJstr]
+ * removed @changesex and @charchangesex until we can
+ fix it properly [MouseJstr]
+ * Fixed item-dup bug in storage and cart [MouseJstr]
+ * @skilltree was looking outside of the particular class
+ of the char to see if they could do a skill [MouseJstr]
+ * Fixed a calc_skill_tree bug where too many skills were
+ visible [MouseJstr]
+ * Added Dev/GDB_reports.txt, take a look in it devs [Ajarn]
+ * Corrected description for player_skill_nofootset and monster_skill_nofootset
+ in battle_athena.conf [celest]
+ * Added a special NPC Logging command 'logmes'. It works as mes"Hello world!";
+ It is useful for such NPC as BANKS, CASINO, etc. To keep track of won money, etc.
+ Check kafra_bank.txt 1.1 for example.
+ Note: mes = otput into client's NPC window
+ debugmes = output into map-server window
+ logmes = output into lognpc log DB.
+
+12/23
+ * Fixed some bugs in the clif.c changes (SVN 766 to SVN 767) [MouseJstr]
+ * Added ayo monsters to @disguise
+ * Began updated clif.c to work with 1108 and 1206, tested and works [nsstrunks]
+ * Fixed skills still being available after a job change [MouseJstr]
+ * Changed pc_alive_timer to use map_id2sd - should be more accurate [celest]
+ * Added jA 1084's fix to mob.c - check whether the player is still alive
+ when calculating exp [celest]
+ * Added clif_changed_dir, clif_adopt_process [celest]
+ * updated Backstab to show the target's new direction [celest]
+ * Corrected the file types of several files in the SVN tree to
+ fix the newline issues [MouseJstr]
+ * Updated mapflags (added missing payon_in03,ayo_in01,ayo_in02, que_god01, que_god02) [Lupus]
+ * Updated Sacrifice : it's now self-activating, and lasts for 5 attacks [celest]
+ * Fixed compile errors in party.c [celest]
+ * Moved SC_EDP back to 114 [celest]
+ * Added some of Shinomori's fixes [celest]
+ * Added optimisation in intif_parse_WisMessage from Freya [celest]
+
+12/22
+ * Eliminated skill tree mapping since we have entries
+ for all the classes in the skill_tree.txt files [MouseJstr]
+ * Added finding_ore_rate to battle_athena.conf, thanks to orn [celest]
+ * Changed how party exp is passed out to eliminate players
+ current in a chat window or those who havn't moved or attacked
+ in 2 minutes [MouseJstr]
+ * Fixed a bug in resnametable from local directories,
+ by fixing a bug in grfio_read causing memory corruptions [MouseJstr]
+ * Rearranged how guild messages, gm messages, and party messages
+ are moved back and forth between the inter server and the
+ map server.. eliminating unneeded round trips to eliminate
+ lag on a loaded char-server. [MouseJstr]
+
+ src\char_sql\int_party.c src\char_sql\int_guild.c
+ src\char_sql\inter.c src\map\atcommand.c src\map\guild.c
+ src\map\intif.c src\map\party.c src\char\int_guild.c
+ src\char\inter.c src\char\int_party.c
+
+ * Reverted npc.c back to before jA 1081. This fixes warp portals missing and other npc bugs [Ajarn]
+ * Added conditional SHOW_DEBUG_MSG for displaying ShowDebug()'s output, it was missing before [MC Cameri]
+ * Added #zeny, removed @charzeny [MC Cameri]
+ * Fixed reading itemslottable.txt causing cards to become unuseable [celest]
+ * Added error message if file renaming in lock_fclose fails [celest]
+ * Fixed frost diver not working ... my bad =p [celest]
+ * Corrected typo in clif_hpmeter - md -> sd [celest]
+ * Check if the player has been authentified by the char server before
+ clearing any timers in map_quit [celest]
+ * Added eventtimercount and timerskill_count - check these before clearing
+ or deleting timers [celest]
+ * Added sc_count check in skill_stop_dancing [celest]
+ * Translated the japanese part in battle_athena.conf [celest]
+ * Added ignore the new skill delays when chaining monk combos [celest]
+
+12/21
+ * Since conf/maps_list.txt was removed, added conf/maps_athena.conf [Ajarn]
+ * Fixed a few NPCs that were giving curly errors. It seems to be caused by a bug that the NPCs' last line isn't read or something [Codemaster]
+ * Fixed a tiny compile warning in npc.c [Codemaster]
+ * Allowed the NPCs without proper curly brackets to still load, but give an error still [Codemaster]
+ * Added variable 'current_file' which tells the filename of the script while loading npcs [MC Cameri]
+ -the variable its set in do_init_npc() or something like that, so you can only access it
+ after the use of do_init_npc().
+ * Fixed the display of a warning saying that a right curly brace was missing [MC Cameri]
+ * Removed @charwarp and @rura+ and added #warp, #rura, #rura+ [MC Cameri]
+ * Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf [MC Cameri]
+ * Moved some code in pc_break_equip that was causing compile errors [celest]
+ * guild skills vanished due to incorrect placement of a
+ check for quest skills in the calc_skilltree code [MouseJstr]
+ * Fixed skill LK_HEADCRUSH, LK_JOINTBEAT to work on both on
+ and off peco's for lord knights (fixed typo in
+ skill_tree.txt) [MouseJstr]
+ * removed LK_SPIRALPIERCE from lord knights not on peco's[MouseJstr]
+ * Moved the code from map_quit to pc_makesavestatus that
+ "adjusts" the skill tree before persisting to the character
+ server [MouseJstr]
+ * made pc_makesavestatus() properly persist skills that are
+ unavailable but not forgotten (example, spiral pierce). You can now
+ get spiral pierce, get off your peco, log out, log in, and
+ get back on your peco and still have not lost the skill
+ points you invested. This also solves the problems of when
+ the skill tree gets changed, players loosing the points. [MouseJstr]
+ * Made pc_resetskill() properly reset skills that are
+ currently not visible due to skilltree changes [MouseJstr]
+ * Finished updating most of the map-server to 1082... i'll leave the more
+ technical ones for the other devs ^^; [celest]
+ * Added other new battle_athena options from jA 1082 ... descriptions not
+ translated yet [celest]
+ * Removed my own additions for skill delays using aspd and added jA's code
+ (-removed-) [celest]
+ * Adapted skill_range_leniency to jA's code - should be more stable [celest]
+ * Fixed drop rates only limited to multiples of 100's - thanks to jathena
+ for pointing it out [celest]
+ * Added missing code for castle_defense_rate [celest]
+ * Removed pc_undead_nofreeze - no code for it [celest]
+ * Updated unrefineable items table - thanks to jathena [celest]
+ * Added 3 new script commands: [celest]
+ - skilleffect : shows a skill effect on the player
+ - doskill/skilluseid (originally by Qamera) : casts a skill on the player
+ - skillusepos : casts a skill on a position
+ * Added SC_SpeedUp0 [celest]
+ * Merged itemdb_read for SQL and TXT [celest]
+ * Moved itemdb_read_itemslottable in itemdb.c for better readability [celest]
+ * Removed itemdb_read_cardillustnametable limited to TXT only [celest]
+ * Added reading itemslotcounttable.txt from the GRF to auto set number of slots
+ per item [celest]
+ * Added a display message when reading itemslottable from the GRF [celest]
+ * Added options in battle_athena.conf to enable/disable reading the GRF for
+ indoorrswtable.txt, leveluseskillspamount.txt, num2cardillustnametable.txt,
+ itemslottable.txt & itemslotcounttable.txt [celest]
+ * Removed conf/npcs_list.txt, and placed it in npc/npcs_athena.conf
+
+12/20
+ * Fixed npc_parse_mob with large/tiny monsters causing
+ memory corruption [MouseJstr]
+ * Fixed a crash in char.c with new chars [MouseJstr]
+ * Updated npcs_list.txt [Ajarn]
+ * If last_pos.x or .y == 0, set to start point [MouseJstr]
+ * Fixed map loading. If a map was not found, it would remove the next map in the list [Ajarn]
+ * Moddified some *_athena.conf's (my typos and some inncorect default values) [Ajarn]
+ * Added Valaris' double connection bug fix (imalive watchdog) [Valaris]
+ * Fixed map-server exiting when it came across a bad NPC file [Codemaster]
+ * Updated Valaris' large/tiny monsters - of course, he told us what he did wrong and how to fix it :) [Codemaster & Valaris]
+ * Updated makefiles to new strlib locations [Codemaster]
+ * Moved strlib.h and strlib.c into the common directory [Codemaster]
+ * Updated a bit of jA 1081 - it's not completly updated yet!!! [Codemaster]
+ * Fixed some gcc 2.95 problems [MouseJstr]
+ * Speedups in socket code [MouseJstr]
+ * made samesex weddings work and give out correct ring [MouseJstr]
+ * CFixed wedding NPC halting after server reboot/crash (shadowlady put in comments but didn't add to code) [Aria]
+ * Added reading leveluseskillspamount.txt from the GRF to auto set sp used for each skill [celest]
+ * Added reading indoorrswtable.txt from the GRF to auto set 'indoor' mapflags
+ [celest]
+ * Added check in grfio.c to prevent crashing if a file wasn't found [celest]
+ * Rolling GUILDCACHE and FASTCHAR into main branches/stable
+ tree [MouseJstr]
+ * Changed max_paramter to an unsigned int so that you can have over 255 as your max stat [Codemaster]
+ * Experimental: Reverting a change on deleting any skill units when we're
+ logging off - might reduce the 'delete_timer' errors [celest]
+ * Added check whether an item is allowed to be dropped, for example wedding
+ rings [celest]
+ * Updated Acid Terror - should never miss [celest]
+ * updated Sword Reject - should display reflected damage properly now [celest]
+ * Updated Double Strafe - should only work with bows [celest]
+ * Replaced checking whether items can be refined or not with a new function [celest]
+ * Added Gengar's fix for npctalk outputting to chat [celest]
+ * Allowed some values in script_config to be customised in script_athena.conf [celest]
+
+12/19
+ * Added -DFASTCHAR to char_sql for testing performance work
+ before I merge it into the main running code [MouseJstr]
+ * Added ShowDebug(), Debug(), DisplayDebug(), printDebug(), CL_DEBUG, MSG_DEBUG to _ShowMessage() [MC Cameri]
+ * Replaced many \033[x;xm with their corresponding CL_xx constants [MC Cameri]
+ * Separated NPCs and Maps from map_athena.conf into npcs_list.txt and maps_list.conf [MC Cameri]
+ * Modified all the *_athena.conf's to have the import command enabled by default [Ajarn]
+ * Added charcommand_conf.txt and log_conf.txt in conf-tmpl/import [Ajarn]
+ * Fixed import command for log_athena.conf file [Ajarn]
+ * Updated charcommand.conf [nsstrunks]
+
+12/18
+ * Added some of my info to Dev/quotes.txt, not done yet... [Ajarn]
+ * Added some ideas to Dev/Ideas_Suggestions.txt [Ajarn]
+ * Fixed import command in inter_athena.conf file [Ajarn]
+ * Fixed a few command compiling problems for TXT [Codemaster]
+ * Modified the main.sql to add the friend0 column; also added the upgrade_1.0.0.sql file [Codemaster]
+ * Introduced StringBuf into utils for use in building larger queries [MouseJstr]
+ * tested GUILD_CACHE (reducing guild related sql traffic to 30%) in
+ prep for unleasing it on the sql using public [MouseJstr]
+ * Fixed some SQL queries crashing char server [davidsiaw]
+ * Added several PID GM commands, thanks to Dino9021 [nsstrunks]
+ * Storage was merging items incorrectly [Mousejstr]
+ * eliminated a uninitialized var when using afm maps [MouseJstr]
+ * Added concept of dirty storage to reduce saves/load
+ to the char server (do a clean build!) [MouseJstr]
+ * Eliminated storage_storageopen2 as unused [MouseJstr]
+ * Switched to account2storage2() whenever possible
+ to eliminate the possibility of saving empty storage
+ back to the character server (storage wipes) [MouseJstr]
+ * Made it save storage as soon as you close the storage
+ window to reduce possibility of loss/abuse [MouseJstr]
+
+12/17
+ * Added #item [MC Cameri]
+ * Added #storagelist, removed @charstoragelist [MC Cameri]
+ * db.c: Fixed probs with OnInit, OnTime, and etc NPC probs
+ Just reverted it back. [Lupus]
+ * Fixed warning message in db.c line 445 [MC Cameri]
+ * Added #effect, removed @chareffect [MC Cameri]
+ * Reverted a change in map.c causing problems, sorry >.< [celest]
+ * Updated Sphere Mine - it'll now move in the opposite direction if
+ being hit by its master [celest]
+ * Updated Wind Walk [celest]
+ * Fixed skill #301 causing crashes [MouseJstr]
+ * Fixed documentation error on gm_skills_unconditionl [MouseJstr]
+ * added @grind test command.. only for testing [MouseJstr]
+ * Added clearweather to the atcommand configuration file. [nsstrunks]
+
+12/16
+ * Added a fix for AFM loading, thanks to Pete [celest]
+ * Updated maximum levels for supernovice to 99 [celest]
+ * Updated supernovice jobexp table - should be same from 50 onwards [celest]
+ * Corrected maximum job level checking in @joblvup and @charjob [celest]
+ * Added the new spell scrolls, thanks to Landarma [celest]
+ * Corrected a few skills, thanks to orn [celest]
+ * Corrected Extremity Fist to not require Explosion Spirits when being used
+ right after using Combo Finish or Dilemma [celest]
+ * Added instant cast weapon skills rely on attack speed as cast delays, not
+ on dex [celest]
+ * Fixed mob_ghostring_fix not working [celest]
+ * Changed default value for mob_ghostring_fix to 'yes' [celest]
+ * Added #itemlist, removed @charitemlist [MC Cameri]
+ * Changed @job and #job so that when it's used it unequips all the items, to prevent sprite errors [MC Cameri]
+ * Fixed a misuse of mysql_config (thanks Daegalus for
+ creating a reproducable environment for me) [MouseJstr]
+ * Fixed compile time errors for gcc 2.95 [MouseJstr]
+ * Updated Forging and Potion making formulas by DracoRPG [celest]
+ * Changes to the guild skills
+ - Dropped using sc_data and use flag values instead
+ - Changed moving guild skill units to once every 'move request' only instead
+ of every movement - should reduce server load abit
+ - Corrected crash when checking its skill requirements
+ * Initialise 'canregen' when logging into map - forgot to add this earlier,
+ sorry ^^; [celest]
+
+12/15
+ * Fixed more compile errors gcc 2.95 [MouseJstr]
+ * Removed log files from svn... they will be created when
+ needed [MouseJstr]
+ * Removed unused var in src/map/map.c:107 [MouseJstr]
+ * fix compile error in text converters [MouseJstr]
+ * Skill Updates [celest]
+ - Corrected traps to last longer in GvG
+ - Some minor changes to Hiding, Cloaking and Chasewalk to prevent it from
+ not working if sc_data is null
+ - Corrected an error in Cannibalize
+ - Updated Marionette Control to check its range from the partner
+ - Updated Berserk to disable hp and sp regen for 5 minutes after the skill
+ * Changed the weather gm commands to be able to toggle on and off. For example,
+ use @snow once to turn it on, reuse it again to turn it off. [celest]
+ * Added Jawaii and Ayothaya to @go list [celest]
+ * Changed the default values for ranged, magic and misc damage rate in
+ battle_athena to 60, 50 and 60 [celest]
+ * Removed redundant 'berserkdamagetick' from map_session_data [celest]
+ * Added changes to map.h according to Shinomori [celest]
+
+12/14
+ * Changed "Map-server can't connect to char-server" message to reduce output spamming and set it to
+ display only once [MC Cameri]
+ * Added a busy animation for npc loading [MC Cameri]
+ * Replaced the way map loading was displayed into a progress-like way [MC Cameri]
+ * Fixed some typos in _ShowMessage() [MC Cameri]
+ * Replaced lots of more printf's in map-server with _ShowMessage() [MC Cameri]
+ * Added constants for console colors in showmsg.h [MC Cameri]
+ * src/char_sql/int_guild.c:56 - t_mes2 was not big enough causing
+ stack overrun's, corruptions, and crashes [MouseJstr]
+ * common/mmo.h: changed base_level and job_level to unsigned int to increase max levels [Codemaster]
+ * char/char.c: added a NULL check for the file in parse_friend_txt [Codemaster]
+ * map/atcommand.c/.h: added @clearweather (thanks to Dexity) [Codemaster]
+ * map/charcommand.c/.h: added #spiritball [Codemaster]
+ * map/mob.c: fixed a compiler warning (ln was an int and was supposed to be an unsigned long int) [Codemaster]
+ * Added nullpo_retb to nullpo.c - does a break; if null [celest]
+ * Replaced some parts in skill.c with nullpo checks [celest]
+ * Corrected some typos - penaly -> penalty [celest]
+ * Skill Updates [celest]
+ - Most of 12/14's Sakray patch
+ * The SKILL_MAX_DB (yes, a different #define from the one below)
+ was not large enough for current skills causing memory
+ corruptions and crashes [MouseJstr]
+ * Fixed how socket handles EAGIN errors (retry instead of
+ disconnecting) [MouseJstr]
+
+12/13
+ * Skill Updates [celest]
+ - Added the new 'Throw Tomahawk' skill (Requires Sakexe1129 or newer)
+ - Added some new monster skills - but still not complete.
+ - Adjusted Palm Strike, Tiger Fist and Chain Crush based on 12/14's patch
+ * Removed redundant 'sg_count' for map_session_data and mob_data [celest]
+ * Save both persons' data after trading in case a crash causes them to
+ rollback - fix by Freya [celest]
+ * Removed 'type' paramater from pc_unequipitem to use 'flag' instead[celest]
+ * Moved unequip checking code from clif.c to pc.c [celest]
+ * Replaced many printf's in map-server with _ShowMessage(). [MC Cameri]
+ * Skill timers for skills with id's higher then 450 were
+ corrupting memory [MouseJstr]
+ * Increased max skills to 650 from 450 fixing MANY crashes [MouseJstr]
+ * Creating Guild events were reading beyond supplied guild names ,
+ causing crashes [MouseJstr]
+ * trades were derefing -2 into the inventory table sometimes [MouseJstr]
+ * Not having a arrow in your inventory but having a bow
+ could cause it to set sd->status.inventory[-1].equip=32768
+ resulting in a memory corruption [MouseJstr]
+ * local broadcasts of messages larger then 64 bytes were
+ corrupting the stack, causing crashes [MouseJstr]
+ * mob eventnames were reading beyond source point, risking
+ going over page boundries, causing crashes [MouseJstr]
+ * Internal MAIL system: moved all strings to msg_athena.conf [Lupus]
+
+12/12
+ * Made guild skills to check for skill levels first when casting [celest]
+
+12/11
+ * Modified arrow checking in skill.c [celest]
+ * Corrected Cart Revolution damage calculation [celest]
+
+12/10
+ * Fixed players unable to move in AFM maps [celest]
+ * Added error message if a player's last map couldn't be found [celest]
+ * Moved AFM map check to map_mapname2mapid [celest]
+ * Added USE_AFM and USE_AF2 to be used later [celest]
+ * Modified sc_data check in pc_damage [celest]
+
+12/9
+ * Moved a map_freeblock_unlock() around to eliminate a
+ crash [MouseJstr]
+ * Fixed how players are cleaned up when they disconnected
+ during authentication [MouseJstr]
+ * Adjusted some messages in @marry [MouseJstr]
+ * Skill Updates [celest]
+ - Fixed Auto Spell not working
+ - Fixed skill level check causing Baphomet card not to work at all (possibly
+ other problems too)
+ - Added some new monster skills based on jA mod 1077
+ * Changed @job to accept text job names - For example: @job wizard, @job high
+ priestess, @job super baby [celest]
+ * Added sc_data check for pc_damage [celest]
+
+12/8
+ * Fixed @rings [MouseJstr]
+ * Added @marry, @divorce, and @rings [MouseJstr]
+ * fixed @revive [MouseJstr]
+ * Added option to turn off login server logging [celest]
+ * Moved char server starting logging to after we've read the configuration
+ file first [celest]
+ * Fixed crash with supernovices with 100% base exp [celest]
+ * Updated the readme a little. [Mass Zero]
+
+12/7
+ * Added GUILDCACHE #define to int_guild.c for testing performance
+ effects [MouseJstr]
+ * Skill Updates [celest]
+ - Arrow Shower, Double Strafing, Charge Arrow, Throw Arrow, Sharp Shooting,
+ Arrow Vulcan, and Musical Strike now take arrows when used
+ - Level 6-10 Stone Curse will not consume a red gem now when it fails
+ - Players should be able to use items when they're stoned but not yet
+ completely petrified
+ - Corrected Triple Blow to work with bows (they actually do ^^)
+ * Added 'guildgetexp' script command [celest]
+ * Added bLongAtkRate item effect [celest]
+ * Implemented Confusion (50%) - still need more info on how monsters act
+ when they're confused [celest]
+ * Added 'Guardian Angel' code for supernovices [celest]
+
+12/6
+ * Fixed file props for new npcs [MouseJstr]
+ * Fixed weddings.txt as per Fress_Boy [MouseJstr]
+ * Added a case_sensitive to login [MouseJstr]
+ * Fixed follow crashing server when gm dies [MouseJstr]
+ * Fixed global message not working on txt [Wizputer]
+ * fixed a server crash in mobinsite [MouseJstr]
+ * fixed a server crash in party sharing exp [MouseJstr]
+ * fixed a server crash in BS_FINDINGORE [MouseJstr]
+ * Updated Chase Walk [celest]
+ * Added 'checkoption1' and 'checkoption2' script functions - Refer to
+ /npc/sample/npc_testchkoption.txt for similiar examples [celest]
+ * Updated maximum level for Guild Skills [celest]
+
+12/5
+ * Fixed another crash sending updates to disconnected
+ clients [MouseJstr]
+ * Fixed the range_check again to stop it from crashing
+ servers [MouseJstr]
+ * removed stubbed out unfinished atcommands as per Cameri [MouseJstr]
+ * Fixed nullpo's for gcc 2.95 [MouseJstr]
+ * Fixed bug in which login-txt was crashing in do_final() due to some free's [MC Cameri]
+ * Added nullpo's to all atcommand's functions, phew... [MC Cameri]
+ Note: I point out that MouseJstr has added some @commands that start with char which
+ havent been finished, they are just there but don't do anything.
+ * Removed mapbug.txt and corresponding function in map.c (realized it's pointless) [MC Cameri]
+ * Added allow_atcommand_when_mute - Change this to set whether muted players
+ can use gm commands [celest]
+ * Temporarily leaving the changing guild emblems requiring Glory of Guild
+ feature only for TXT until the SQL char-server supports guild skills fully[celest]
+ * Modified battle_range again to check if src's type is a player first [celest]
+ * Corrected typo in battle_range [celest]
+ * Fixed a crash where party chats can be sent to a
+ partially disconnected player [MouseJstr]
+
+12/4
+ * Fixed a crash in clif_send when player disconnects but player
+ object is not fully removed from map [MouseJstr]
+ * Fixed a crash associated with NPC_BARRIER [MouseJstr]
+ * Renamed flush_fifos_at_exit to flush_fifos [MouseJstr]
+ * call check_connect_char_server() on char_server disconnect [MouseJstr]
+ * stale skill groups were crashing server [MouseJstr]
+ * Fixed crash in SC_LULLABY [MouseJstr]
+12/3
+ * hacked the frozen mob issue [MouseJstr]
+ * Fixed a battle_range crash [MouseJstr]
+ * Updated Stone Curse, Soul Drain, Auto Berserk [celest]
+ * Added a fix for MVP exp being multiplied twice by Gengar
+ * Modified battle_range to check for sd first [celest]
+
+12/2
+ * Fixed double login feature, resets online users when map connects to char [Wizputer]
+ * Changed all LOGS inserts to INSERT DELAYED (MySQL has this feature and cache unimportant queries, then
+ executes them at once together = 10x faster) [Lupus]
+ * Skill Updates [celest]
+ - Modified Weapon Refine - should only +1 every time.
+ - Updated Berserk, Chase Walk, Slim Pitcher
+ - Added skill_range_leniency : In some cases when moving to cast a skill the
+ exe will a send a UseSkill packet before the server has moved us to the
+ correct position, causing it to fail. Leaving this at 1 should be enough.
+ - Fixed a bug that was causing monsters not to move towards the target
+ * Added check for clif.c in case the server didn't realise we've died [celest]
+ * Added a fix for @npcmove by JohnC and Fredzilla
+ * Added motd_type : Set this to 1 if your clients have langtype problems and
+ can't display the motd properly[celest]
+ * Edited atcommand.c to fix compile warnings [celest]
+
+12/1
+ - Make it build against gcc 2.95 [MouseJstr]
+ - Changed #define MAX_PET_DB to 300, it's easier for people adding new pets like this. [Nas]
+ * Skill Updates [celest]
+ - Updated Poison React
+ - Added Soul Change, Soul Burn
+ - Added a somewhat crude timer for Venom splasher
+ - Added a fix for Guild Skills causing crashes by Sara, thanks!
+
+11/30
+ * Fixed client crash when disguised characters die [celest]
+ * Skill Updates [celest]
+ - Fixed and finished Guild Skills (~90%)
+ - Fixed Meltdown and Overthrust used together breaking your own weapon
+ - Updated Weapon Repair :- uses different materials depending on repaired item
+ (Iron Ore/Iron/Steel/Rough Oridecon)
+ - Fixed sp recovery problem, thanks to OutSider for pointing it out
+ - Updated Tiger Knuckle Fist stun time
+ - Added cooldown time for Emergency Recall
+ - Fixed typo in skill.c, thanks to Toster
+
+11/29
+ * Fixed crash in src/char_sql/char.c when setting chars offline [MouseJstr]
+ * Added mapbug.txt which is displayed in map-server, displays
+ the last bug or w/e fixed for the map-server [MC Cameri]
+ -You may change it whenever you want
+ -It will only show if mapbug.txt exists
+ -This file must not be included in releases
+ * Made some changes in map_versionscreen() to make it easier to
+ read/change in the source [MC Cameri]
+ * Fixed a typo in _ShowMessage() removing the message caption. [MC Cameri]
+ * Fixed typo in map_helpscreen() showing -h instead of --?. [MC Cameri]
+ * Added more sc_data checks in skill.c and pc.c [celest]
+ * Updated Quagmire, Enchant Deadly Poison, Fog Wall [celest]
+
+11/28
+ * Fixed a crash in login_sql/login.c [MouseJstr]
+ * made common/socket.c more crash resistant [MouseJstr]
+ * Added flush_fifos to socket.c so that we can make sure everything
+ has been sent before we shut the process down [MouseJstr]
+ * Modified src/char_sql/char.c to flush fifos on exit [MouseJstr]
+ * Fixed a crash in src/map/map.c shutdown where it would
+ use the char_fd session after it was alrady cleaned up [MouseJstr]
+ * removed conf-templ/atcommand_athena.conf.orig [MouseJstr]
+ * removed a USE from sql-files/main.sql that should not be there [MouseJstr]
+ * Changed MSG_INFO color to bright white, since bright blue want so bright... [MC Cameri]
+ * Made Map Removed: %d string be displayed only if there were maps removed. [MC Cameri]
+ * Fixed online system for char not sending players left "online" to login when restarting [Wizputer]
+ * Fixed damage formula of Cart revolution: 150% +1% per 80ea [Lupus]
+ * Removed 2x Chance of Equipment Breaking during CRITICAL attacks [Lupus]
+ * Fix some file props [MouseJstr]
+ * Added map_versionscreen(), displayed when --version flag is passed on command-line. [MC Cameri]
+ * Finished map_helpscreen(), displayed when --help flag passed on command-line. [MC Cameri]
+ * Changed Guilds Extention Skill to +6 people per level. [Lupus]
+ (tested it for 2 weeks! or a big server)
+ * Added a fix for gettimeofday() for WIN32 [Codemaster]
+ * skill Updates:
+ - Updated Slow Poison, modified checks for skill_unit_onplace abit. [celest]
+ - Updated Finger Offensive, thanks to orn [celest]
+ * Updated packet_ver_flag's default value, thanks to iscandium [celest]
+ * Added warning if motd.txt was not found [celest]
+ (Turn on error_log in battle_athena.conf to enable it)
+
+11/27
+ * Fixed a few map crashes when char-server crashes [Wizputer]
+ * Added fix of 0x2aff and 0x2af8 flooding [Wizputer - thanks Toster]
+ * Fixed Map crash when person uses global message hacks [Wizputer]
+ * Fixed online system, online column works and prevent double login at the login server [Wizputer]
+ * Fixed some compile time errors associated with showmsg [MouseJstr]
+ * Added get_svn_revision() in core.c [MC Cameri]
+ -Only if you have the file .svn\entries, it will show the revision # at runtime.
+
+11/26
+ * Fixed Abrakadabra (2 minor bugs of consumed items - they were ignored if placed in 0 pos) [Lupus]
+ * Finished Full Strip, Weapon Refine, Slim Pitcher and Full Protection. [celest]
+ * Added skill_nocast_db.txt. Use it to set which skills cannot be used in
+ which conditions [celest]
+
+11/25
+ * Added @skilltree to help GM's answer skill tree questions [MouseJstr]
+ * Update Spider Web; I believe you cannot use it on yourself now. [Codemaster]
+ * Added Ore Discovery, and base code for Slim Pitcher and Preservation [celest]
+
+11/24
+ * @charreset #reset [MC Cameri]
+ * @charstatsall is now #statsall [MC Cameri]
+ * @charsave is now #save [MC Cameri]
+ * Updated most of jA's 1067; battle.c and skill.c might need more updates! [Codemaster]
+ * Fixed char-txt crashing when closing, Codemaster free()'s. [MC Cameri]
+ * Skill Updates: [celest]
+ - Updated guild skills (60%)
+ - updated Weapon Repair and Aura Blade by DracoRPG
+ - modified Weapon Repair to use Identify's packet, should show a list of
+ repairable items now
+
+11/23
+ * Fixed script loading small/large monsters. [Valaris]
+ * @charoption is now #option [MC Cameri]
+ * @charpetfriendly is now #petfriendly [MC Cameri]
+ * @charstats is now #stats [MC Cameri]
+ * Skill Updates: [celest]
+ - Added some code for the new guild skills (50%) and Moonlit Petals (5%)
+ - Notes to other devs: Guild skills with id's 10000-10014 will be stored in
+ skill_db[500-514]
+ - Corrected Hilt Binding
+ - Corrected Assassin Cross' dual wield
+ - Changed player_cloak_check_type to yes by default and edited description
+ since it's already fully implemented.
+ - Added a bit more restrictions to Call Partner and Emergency Recall and
+ updated mapflag for sec_pri.gat
+ - Added pc_calcspeed and updated Cloaking so it won't need to recalculate
+ the player's entire status everytime there is movement.
+
+11/22
+ * (TXT)Stripped some code off read_gm_accounts() and made with it addGM() [MC Cameri]
+ -Usage: addGM(account_id,level);
+ * (TXT)Changed GM_accounts.txt to meet new standards. [MC Cameri]
+ * (TXT)Enabled the use of id ranges in GM_accounts.txt [MC Cameri]
+ * Added a few free()'s so that I am sure it freed the allocated memory (char & login) [Codemaster]
+ * Changed monsters_ignore_gm option to a level value. [Valaris]
+ (accounts greater than or equal to this setting won't be attacked by aggressives.)
+ * Fixed mapflag #s and constants for setmapflag and remove mapflag. [Valaris]
+ * Added skill names for kRO 11/23's new skills [celest]
+ - Preserve, Full Strip, Weapon Refine, Slim Pitcher, Full Chemical Protection,
+ (Throw) Tomahawk
+ * timer.c static int timer_heap_max=0; //fix by Shinomori from eA forums
+ ititialize static var!!!
+ * Added the old effect list # into effect_list.txt of spira's. [shadow]
+ * Added new flag (#3) to clif_specialeffect [MC Cameri]
+ * @doom,@die,@doommap now display the Dark Cross effect on you. [MC Cameri]
+11/21
+ * Display IP when wdata is expanded [Wizputer]
+ * Added bClassChange,%; Has random chance to turn monster into another monster. [Valaris]
+ * Re-Fixed Trade/Vending exploit [Lupus]
+ * Fixed @whozeny. [Valaris]
+ * Added rest of mapflags to const.txt. [Valaris]
+ * Closed AFM files after reading, this fixed the improper char-server session #. [Valaris]
+ * Skill updates: [Celest]
+ - Updated Basilica, Sharp Shooting, Berserk, Meditatio (Thanks to DracoRPG!)
+ - Fixed a typo with Blade Stop that was causing crashes, sorry. ^^;
+ - Reverted changes to Cloaking, ours is already more updated! ^_^
+ - Added temporary code for guild skills to stop crashing
+ * @alive, @raisemap, @raise, @revive now display the resurrection skill animation [MC Cameri]
+ * @charpetrename(AtCommand) is now #petrename(CharCommand) [MC Cameri]
+ * @charjob/(AtCommand) is now #jobchange(CharCommand) [MC Cameri]
+ * Removed japanese interserver packets, should fix various problems (jumpto, where, charposreq). [Valaris]
+ * Added Yor's trade exploit bug fix. Added 2 skills bugs in the bugs.txt [Lupus]
+ * Added charcommand.c/.h for the following reasons: [MC Cameri]
+ - Less congestion in atcommand.c
+ - Port commands that start with @char to #, example:
+ ~ @charoption will now be #option
+
+11/20
+ * Added str_lower() function to atcommand.c (from OA). [MC Cameri]
+ * Simplified @charchangesex to @charchangesex [player], your sex is changed to the opposite one [MC Cameri]
+ * Added @refresh, which is like a @jumpto <<yourself>>. [MC Cameri]
+ * Added @petid <pet name> to find pet names, useful when you dont know which pets have eggs. [MC Cameri]
+ * Added an effect_list in docs/ for descriptions, free to add onto that later. [spira]
+ - Attempt to find new skill effects.
+ * Added "nogo" mapflag to prevent the use of @go on a specified map. [Valaris]
+ * Fixed small/big monster spawning crashing (mixed up the merge). [Valaris]
+ * Fixed crash with upgrading TXT and having more than 256 accounts. [Valaris]
+ * TXT upgrades will convert broken flag to attribute column. [Valaris]
+ * Prevent use of emotion packet to display red mute emote. [Valaris]
+ * Initialized "day" variable in npc.c. [Valaris]
+ * Added @whozeny. Shows list of top 50 online players and their zeny sorted from highest to lowest. [Valaris]
+ * Added @happyhappyjoyjoy. Makes all players on server do a random emote. [Valaris]
+ * Removed -funroll-loops from compile, thanks to kashy for pointing out the problems caused by this. (Do not re-add!) [Valaris]
+ * Added check for max vending_max_value when reading config [kobra_k88]
+ * Skill updates [celest]
+ - Napalm vulcan, Enchant Deadly Poison, Slow Poison (based on jAthena 1066)
+ - Create Deadly Poison, thanks to DracoRPG!
+ - Added effect for Meteor Assault
+ * Added night_darkness_level to battle_athena.conf. [celest]
+ Use this to set 'how dark' it'll become during night time. Use 0 for default,
+ or between 1-10. (Yeah, i know lots of people hated the original night! xP)
+ Warning: It may cause errors with old exe's!
+
+11/19
+ * Re-added check for empty bottle when using aqua benedicta. [Valaris]
+ * Fixed skills not showing after using @allskill [celest]
+
+11/18
+ * Added a line to @unmute, added @mute. [celest]
+ Usage: @mute <time in minutes> <character name>
+ * Added save_flag for skill_status_change_start [celest]
+ * Fixed muting not being saved when you quit/change characters/log off [celest]
+ * *Hopefully* fixed the skill tree problem where you have to use 49 skill
+ points first before 2nd job skills will show... please report any bugs found
+ with it, thank you. [celest]
+ * Added flag to pc_unequipitem (thanks to DracoRPG for suggestion) [celest]
+ * Skill updates [celest]
+ - Updated Cloaking (thanks to orn), Endure
+ - Pneuma (thanks to DracoRPG)
+ - Changed sc_ id for Basilica
+ - Cancel Basilica (100%) when caster moves or uses another skill
+ - Updated Poison React (90%), Endure
+ - Added SC_BLOCKSKILL, SC_SLOWDOWN
+ * Modified pc_attack to fix monster npc's not working in certain exes, thanks
+ to leinsirk10 [celest]
+ * Moved mapflags organized by type to main mapflag folder and removed "type" folder.
+ Removed mapflags organized by location.[kobra_k88]
+
+11/17
+ * Added stub-handler for packet 0x3090 into char_sql [MouseJstr]
+ * Fixed a crash in the afm reading/closing code [MouseJstr]
+ * Added skill_steal_type to battle_athena.conf for the new (but unconfirmed)
+ stealing formula [celest]
+ * Skill updates: [celest]
+ - Removed annoying skill fail messages from rogue's Snatcher
+ - Add sc_data check for firewall and fogwall
+ - Fixed Berserk (99% hopefully? ^_^)
+
+11/16
+ * Fix for compiling against gcc 2.95 [MouseJstr]
+ * Added day of week events (OnSat2000) into scripting engine [MouseJstr]
+ * Temporarily Disabled GM Command Logs; Weren't working Properly >_<! [Codemaster]
+ * Fixed a typo in ../db/Changelog.txt [Nana]
+ * Added -funroll-loops argument to makefile to further increase performance [Shinigami]
+ * Fixed 2 bugs in DELITEM script command. [Lupus]
+ - added deleting priority: If you have some items with the same ID and want to delete some of them, then
+ at first it'll delete common items then, if necessary, delete the rest items but upgraded/named/with cards. [Lupus]
+ * Added checks for Perfect hiding [celest]
+ * Modified level 0 skill check to allow auto blitz beat and steal. [celest]
+ * Added constant BaseJob. [celest] Usage: For example, instead of
+ If (Class==12) || (Class==4012) || (Class==4035)
+ you can use
+ If (BaseJob==12) or If (BaseJob==Job_Assassin)
+ * Added 'indoors' mapflag : When in-doors players will not be affected by Night [celest]
+ * Skill updates [celest]
+ - Assumptio is now disabled in GvG maps.
+ - Changed cloaking checks a bit.
+ - Tidied up some parts of skill.c abit. ;P
+ * Added pk_min_level option in battle_athena.conf. Change this to define the
+ minimum level players can attack others when pk_mode is on. [celest]
+
+11/15
+ * Added a Database Changelog.txt File, use it for any changes inside the db folder. [shadowlady]
+ * Added GM Command Logs & Added TXT Logs + TXT Log Options [Codemaster]
+ * Added spawning of monsters at specific level by adding ,# after the spawn name. [Valaris]
+ mobs_level_up option should be on when using this.
+ (Example: {ama_dun01.gat,0,0,0,0 monster Shinobi,99 1401,1,0,0,0} to spawn a level 99 shinobi.)
+ * Added addtoskill script command for (levels can stack on top of existing levels). [Valaris]
+ Use same usage as skill script command.
+ * Added -ffast-math argument to makefile to increase performance, thanks to kashy. [Valaris]
+ * Added small and big mob sprite spawning. [Valaris]
+ -Added @monstersmall and @monsterbig commands.
+ -For using in scripts, use id +2000 for small and id +4000 for big.
+ (Example: 3002 for small poring and 5002 for big poring)
+ * Added mobs_level_up option. [Valaris]
+ -Everytime a monster kills a play their level will increase and show levelup animation.
+ -Their 6 main stats and speed will increase as they level.
+ -They will recover 10% of the max hp of the player it kills.
+ -Player will gain extra exp based on how much stronger a monster is than normal.
+ -Skill estimation will show monsters current level (instead of reading from db).
+ -Will display level 99 aura if and when a monster hits level 99.
+ -They will not go higher than level 99.
+ * Fixed maximum skill levels not following skill tree [celest]
+ * Updated HP/SP for baby classes [celest]
+ * Corrected pc_calc_base_job [celest]
+ * Skill updates [celest]
+ - Marionette Control (70%), Berserk (thanks to DracoRPG)
+ * Modified pc_jobchange code to work with new pc_calc_base_job [celest]
+ * Corrected skill_tree_get_max, sorry >.< [celest]
+
+11/14
+ * Made the Advance jobchangers to kRO standars with the following;
+ - Checks if you are level 99/50 and 2nd class OR above.
+ - Checks if you have an Cart of Falcon equiped.
+ - Checks if you have any Quest Skills, stores a variable on you and gives them back
+ when you change to 1st advance class.
+ - Added minimum joblevel to change to an 2nd or 2-2 advance class to job 45 after kro. [Nana]
+ * Fixed loading of AFMs when no resnametable is found. [Valaris]
+ * mob_db.txt: Fixed Golden Thief Bug MVP MOB mode (it wasn't moving/attacking) [Lupus]
+ * Added AFM (Advanced Fusion Map) support, thanks to alexkreuz and fusion. [Valaris]
+ Use the afm_dir option in grf-files.txt (currently needs a resnametable.txt).
+ * Initialized password variable in login.c. [Valaris]
+ * Added zeny_from_mobs option. [Valaris]
+ * Corrected the file type attribute on most of the files in three which fixes the
+ newline issues between linux and dos [MouseJstr]
+ svn propset -R svn:eol-style native .
+ * Skill changes [celest]
+ - Corrected steal formula, updated BladeStop, Headcrush.
+
+11/13
+ * Fixed map-server loading, doesn't require data\resnametable.txt anymore [Wizputer]
+ * Updated & Optimized TXT Login from FREYA. (need to do SQL now) [Codemaster]
+ * Removed compile warnings in intif.c. [Valaris]
+ * Fixed chrif_changesex and @changesex, now uses packet 0x3000. [MC Cameri]
+ * Updated some skills, credits to orn and midas. [celest]
+ - Magnum Break, Throw Stone, Sprinkle Sand, Magic Power, Memorise, Quagmire,
+ Spider Web, Reject Sword, assassin's Dodge, Demonbane, Divine Protection.
+ - Firewall, Quagmire, Fog Wall (100%), Marionette Control (30%), Sandman,
+ Claymore Trap
+ - Adjusted some mob skills for mod support.
+ * Fixed weight increase when riding. [celest]
+
+11/12
+ * added folder: /save-tmpl, removed folder /save
+ * battle_athena.conf: Updated Packet Version Flags.
+ * !!!Fixed Mobs Attacking!!!: Thanks for MagicalTux and Yor, I fixed the mobs attacking by using one of their files. [Codemaster]
+ * Warps Update : Added ayothaya warps in ./npc/warps/ and in map_athena.conf [Nana]
+11/11
+ * Skill Updates : (Need to revise skill_cast_db.txt for new updates)
+ ( Sharp Shooting, Sword Reject, Chain Crush Combo, Tiger Knuckle Fist,
+ Head Crush, Arrow Vulcan, HP COnversion) Thanks to DracoRPG.
+ Fixed Devotion use requeriments. Thanks to Orn. [shadow]
+11/11
+ * Corrected minor typo in item_db, and removed/commented out dupe items.[kobra_k88]
+
+11/10
+
+ * Updated Sprout (Item #7193), Thin Trunk (Item #7186),
+ Huge Leaf (Item #7198), and Rante Whip (Items #1956, #1957)
+ - thanks to cheng - [Codemaster]
+ * Updated Parasite (Mob #1500) Drops - thanks to cheng [Codemaster]
+ * Updated Soft Grass Leaf (Item #7194) - thanks to cheng [Codemaster]
+ * Added, Fixed & Updated ALOT of skills: [Codemaster]
+ - Fire Pillar, Backstab, Grimtooth, Poison React, Falcon Assalt,
+ Skin Tempering, Hilt Binding, Frost Nova, TEMPORARY fix for Create Deadly Poison,
+ Enchant Deadly Poison, Endure, Sacrifice, Spider Web, Memorize,
+ Hyper Spirit Sphere, Palm Strike, Sword Reject, Pressure, Magic Crasher,
+ Amplify Magic Power, Napalm Vulcan, True Sight, Wind Walk, Aura Blade,
+ Concentration, Cart Boost, Magic Power
+ - Thanks goes to Celest, Midas, and DracoRPG!
+ * Fixed spira's mistake in using the packet_len_table; no biggie ^_^ [Codemaster]
+ * char/char.c & char_sql/char.c: Fixed start_armor and start_weapon - thanks to AppleGirl [Codemaster]
+ * Added packetver 6 flag to makefile. [Valaris]
+
+11/09
+ * mob_db.txt: Fixed Drake dropping the wrong card - thanks to roslen [Codemaster]
+ * chat.c: Fixed multiple joins in a single chat - thanks to Alex14 and CHaNGeTe. [Codemaster]
+ * clif.c: Fixed sitting. [spira]
+ * - Fixed item 657 Job ID , 11/09 patch updates to item_db, Correct stats for item 5097
+ - Added Unbreakable funcions to item_db armors/shields/garments/footgear [shadow]
+ * Defined SO_REUSEPORT to allow the servers to re-use ports if server crashes [Wizputer]
+
+11/08
+ * Added new script command: getMapXY(MapName$,MaxX,MapY,type,[CharName$]) by Lorky [Lupus]
+ Get position for char/npc/pet/mob objects.
+ * Attempted to fix the mob bug (still haven't :( ). Still updated mob.c/clif.c/chrif.c according to jA 1057. [Codemaster]
+ * Fixed item_cardalbum.txt: Removed extra column which mad all albums empty [Lupus]
+11/07
+ - Fixed a few npcs will start implementing new ones soon, have alot on paper, need to type them up. [Nasedo]
+ * clif.c: Added a few things from jAthena 1057 [Codemaster]
+ * Corrected some typos in item_db. Items 1143 and 1719 need to be re-checked.[kobra_k88]
+ * Fixed compiling error in Map Server in which @repairall was using old broken system [Shinigami]
+
+11/06
+ - Added missing items in item_db.txt and reorganised it.[Nasedo]
+ - Fixed wrong coords for payon guild flags (it has the old map coords), fixed some weapon effects in item_db,
+ updated the mob_db (90%+ done), added EP 5-9 mobs to mob_branch.txt and EP 6 cards to item_cardalbum.txt[shadowlady]
+ * atcommand.c/.h,chrif.c/.h, added @changesex. [MC Cameri]
+ * mob.c & clif.c: Added & Modified a few parts dealing with monsters and guilds [Codemaster]
+ * mob.c: Re-did a few parts according to jA's 1057 version. [Codemaster]
+11/05
+ * Fixed and redo optional Umbalian quests:
+ - Wise Man Fabius' Umbalian Language Quest (you can learn Umbalian language in
+ alternative way)
+ - On speaking with Umbalian Chief about meaning of masks you activate Turban Thief Quest
+ (For Sphinx Mask)
+ * Fixed several bugs in Niflheim Piano Keys Quest (wrong variable name, missing CLOSE buttons)
+ Zeny/Item Exploit in Niflhein Sairin NPC quest (should add similiar checks in every
+ easy quests with expensive prizes to avoid exploits) [Lupus]
+ * Revised and fixed all comodo,yuno,amatsu,gonryun,umbala mobs and drops. Also fixed mvp and woe mobs too [Shadowlady]
+ * Fixed crash from guild skill point allocation, there seems to be a problem with guilds loading still. [Valaris]
+ * Fixed committed typo in map_athena.conf, remove aria's dev npc (was giving errors preventing server startup). [Valaris]
+
+11/04
+ * Added sara-chan's packet db with support for 11-1 [Valaris]
+ * [alot of files >_<]: Changed connecting a bit, from oA source; it connected easier/better in my opinion so... [Codemaster]
+ * map/skill.c: Added a few checks for level 0 skills being used. [Codemaster]
+
+11/03
+ * Removed broken column, using attribute column for broken equip now. [Valaris]
+
+11/02
+ * Fixed compile time errors for gcc 2.95 [MouseJstr]
+ * Changed Blacksmith skill "Hammer Fall" to only be used with maces or Hammers [Aria]
+11/01
+ * Set Comodo Kafra to warp to Umbala (11/2/04 patch) [Aria]
+10/31
+ * Fixed Devnpcs giving off errors -_- [Aria]
+ * Fixed showmsg.c compile warnings thanks to LittleWolf. [Valaris]
+ * map/skill.c: removed a second declaration of sc_def_vit in skill_castend_nodamage_id; thanks to spira [Codemaster]
+ * map/battle.c: re-did Water Ball's damage calculation [Codemaster]
+10/30
+ * Added new guild skills to skill_db from sara-chan. [Valaris]
+ * db/skill_cast_db, map/skill.c, map/pc.c: Corrected a few CHASEWALK things; Thanks to Celest [Codemaster]
+ * char_sql/char.c: removed the double free()ing of gm_account [Codemaster]
+ * Added check for c value in int_guild.c before dividing to calculate average level. [Valaris]
+ * Commented unfinished dev npcs and added devnpc to map_athena. [Aria]
+ * Removed item requirement of Aqua Benedicta (10/26 patch) [Aria]
+ * Fixed some compiling error for Map-server [Shinigami]
+ * Removed Rogue's backstab pushback effect (kRO style again) [Aria]
+ * Changed requirement of Fire Pillar to fit kRO style; lv1-5 = no gem, but 6-10 = 1 gem. [Aria]
+ * Added Mugendai's oA GUI support for map-server (previously not added) [davidsiaw]
+ * Included Mugendai's oA GUI in the GUI folder [davidsiaw]
+
+10/29
+ * another exploit fix for mult in script [MouseJstr]
+ * Corrected mode for peco, condor mobs. Added custom mobs Easter Egg and Easter Bunny for easter egg event script.
+ Corrected mysteltain card location, penomena card typo.[kobra_k88]
+10/28
+ * Cloak Speed fixed [Aria]
+ * Throw stone damage fixed [Aria]
+ * Added new packets from Sara to packet database. [spira]
+ * Fixed and changed command lists to reflect on new packet changes. [spira]
+ - @jumpto, @recall, and @where
+ - Removed old @ignore* functions because they are no longer needed.
+ * Replaced old whisper ignoring code with better and more efficient code. [spira]
+ * Added packet_db.txt support, removed old packet functions. [spira]
+ * fixed forger-zeny exploit [MouseJstr]
+
+ Doing script math that returns a number greater then (1<<31) will now
+ return a (1<<31). This prevents you from finding a npc that
+ asks for a quantity then mults the cost by that quantity to get
+ what you need to pay.
+
+10/27
+ * Updated CSS styles for readme a bit [Aria]
+ * branched athena at version 340 to begin work on the packet_db
+ stuff from jA. To retrieve it, do a svn co http://dev.deltaanime.net:8080/svn/eathena/packetdb
+ later, once we are happy with it.. and feel it is stable, we will remerge it back into the main tree via the appropriate svn commands
+ as a FYI, the command I used to create this branch was:
+ svn copy http://dev.deltaanime.net:8080/svn/eathena/athena http://dev.deltaanime.net:8080/svn/eathena/packetdb -m "branch for packetdb work"
+ * Fixed Aldebaran (gatekeeper conditions bugs and wrong Key ID). Fixed some typos in other cities [Lupus]
+
+10/26
+ * Added more quotes -_- [Aria]
+ * Modified a few things related to guild skills. I hope it doesn't interfere with anyone else's work, and isn't seen as bad. [Sara-chan]
+ -Support for new guild skills, though they don't work yet. Added guild_skill_get_inf and guild_skill_get_max entries for them based on early info.
+ -Changed guild_skillup functions based on japanese code, but for a good reason.
+ It allows for guild skill trees, sort of. I made Kafra Contract and Guardian Research require Guild Approval, for instance.
+ I think the first four new guild skill requirements are correct, at the least.
+ I hope everything works alright, it's my first contribution to eA in quite some time and I'm rather rusty at programming of late.
+ * Fixed compile errors in showmsg.c. [Sara-chan]
+ * Fixed Mouse's devnpc only saying his quotes once per server reset [Aria]
+ * Added log_athena.conf & the logs.sql file [Codemaster]
+ * Added log configurations to inter_athena.conf [Codemaster]
+
+10/25
+ * Fixed a compiling error in Login-server [Shinigami]
+ * Added alot of Azndragon's spiffy logs & then added a few things of my own (Silly Dragon, structs are for kids!) [Codemaster]
+ * Corrected a small bug (forgot to change a few variables!) in my different GM option. [Codemaster]
+ * Fixed items and mobs in DB. Added new items. [Lupus]
+ * Fixed some NPC bugs (check NPC=changelog.txt) [Lupus]
+ * Fixed getting MAX PET ID (SQL only bug) [Lupus]
+ * Fix char/char.c which was crashing after double freeing logs
+ [MouseJstr]
+ * Improved basic server rebooters [MC Cameri]
+ * Commited common/showmsg.c/.h, previously missing x_X [MC Cameri]
+ * Added a basic server rebooter program, just use 'runserver.bat' to start up the server. [Shinigami]
+
+10/24
+ * Added files common/showmsg.c/.h which contain the function _ShowMessage(char *string, int flag) [MC Cameri]
+ -Check showmsg.h to see how to use it.
+ -This function is made to replace printf in all the cases, so it MUST be used instead of print from now on.
+ -Begin your own journey of replacing/removing old printfs, and using the new function.
+ -This function was previously called ShowMessage() in oA, it is now merged, some changes have been done:
+ 1.Outputting messages to a file is now disabled(commented out).
+ 2.MSG_SQL is now commented out.
+ 3.If the server is out of memory, it will not use abort().
+ 4.Returns 0 if successful, 1 otherwise.
+ -Example: ShowInfo("hello\n"); will print this to the screen: [Info]: hello
+ -Always add \n at the end. Unless someone edits the function to add the \n whether it exists or not.
+ -Just add #include "showmsg.h" wherever you need it.
+ * Edited ALL makefile's to include showmsg.o -> _ShowMessage(). [MC Cameri]
+ * Updated readme/gmcommands.html with new @uptime command [MC Cameri]
+ * Somebody had added some additional noskill checks that prevented
+ vending from happening in prontera [MouseJstr]
+ * Added bypass with gm_allskill of npc_selfdestruct2. [Valaris]
+ * Corrected some minor bugs in some Quests [Shinigami]
+ * Added new maps (from lateast kRO patch)
+ Touched WOE (u can't surrender the castle during the WOE), misc fix of the bank [Lupus]
+10/23
+ * Added the option to read GM accounts from a different table than login. Default set to login table. [Codemaster]
+ * Finished Aria and MC Cameri "Dev edition" NPCs. [Aria]
+ * Corrected extra stat points given to high classes. [Valaris]
+ * Added high classes getting the extra 40 stat points on stat reset. [Valaris]
+ * performance tweaks on socket.c to reduce lag [MouseJstr]
+
+ do a "OPT="-g -DNSOCKET" to compile with the changes
+ enabled.. and tell me if you notice a change in your
+ performance/lag
+
+ * Added @uptime to atcommand.c [MC Cameri]
+ * Added the stuff for my npc to Dev/quotes.txt [MC Cameri]
+
+10/22
+ * Replaced some checkcart and checkoption(x) with checkcart(0) in the guild folder [Aria]
+ * Waiting for various devs to tell me their coords, map, biography, quotes,
+ moving coords, etc. In the meantime, I replaced them with (x,y),(lols),
+ (sprite),(somewhere), and if they didn't give me any info, I didn't
+ add them yet =P. [Aria]
+ * Added Davidsiaw, Shinigami, Lord, Codemaster, MouseJstr, MC Cameri, and Darkchild
+ to "Dev edition" NPCs [Aria]
+ * Revised "Dev edition" NPC layout a bit, should go smoother now. Should be final
+ layout unless something goes wrong =O. [Aria]
+ * Fixed the eol markers on some checked in files [Mousejstr]
+ * Fix two crashes caused by calling isGM on mobs [MouseJstr]
+ * Added folder "mc_cameri" in npc/other which contains my bank npc. [MC Cameri]
+ * Changed "Dev edition" NPC layout so that they move by themselves by timers. [Aria]
+ * Changed "Dev edition" NPCs to walk during quotes, and added biography. [Aria]
+ * Fixed quest/all_quest.txt not showing the correct description of the binoculars. [Aria]
+ * Fixed quest/all_quest.txt not going to stop pass and not displaying requirements. [Aria]
+ * Fixed removing friends from the list [davidsiaw]
+ * Added PCLoginEvent NPC (When a character logs on, NPC runs as if he/she clicked the NPC) [davidsiaw]
+ The NPC sample is located in npc/sample/PCLoginEvent.txt (you only need one of these NPCs)
+
+10/21
+ * Fixed clothes_dyer.txt: Disabled Assassing/Rogues Dye. Also fixed wrong labels [Lupus]
+ * Fixed hair_dyer.txt: fixed missing menu label [Lupus]
+ * new_hats.txt 1.4 fixed amount of Fish Tail (300 -> 30), Zeny bugs in Ear of Angel,
+ Ear of Demon,Big Golden Bell, Mistress Crown,
+ Crown of The Ancient Queen, Indian Headband, Orc Hero Helm [Lupus]
+ * Fixed name of a flower in Prontera quest (Dreamy->Illusion) according to our DB [Lupus]
+ * Fixed item names in the temp Crusader Job Quest according to our DB [Lupus]
+
+10/20
+ * map/mob.c: Added mob_exclusion_add() & mob_exclusion_check() [Codemaster]
+ * map/map.h: Changed Vending Struct: amount and value to unsigned variables (so they CAN'T be 0 or less) [Codemaster]
+ * map/mob.h: Added mob_exclusion_add() & mob_exclusion_check() [Codemaster]
+ * Aligned the list of commands at the beginning of atcommand.c,
+ with tabs instead of spaces. [MC Cameri]
+ * Fixed AtCommand_SetBattleFlag, it was previously being called by "@send"
+ instead of "@setbattleflag". [MC Cameri]
+ * Finished basic layout, finished Aria starting to create Shinigami [Aria]
+ * Started to create "Dev edition" npcs [Aria]
+ * Fixed a compile error in src/char/char.c [MouseJstr]
+ * Fixed a bug in @trade where the distance was not ignored [MouseJstr]
+ * Fixed a potential inf loop in pc.c when multi_level_up is set to no. [MouseJstr]
+ * implemented Friends List support for TXT version [davidsiaw]
+ * added queries in main.sql for Friends List. mySQL support for friends list pending [davidsiaw]
+10/19
+ * switched login_sql/login.c to use binary when retrieving
+ by account name [MouseJstr]
+ * skill.c & skill.h: added skill_type_cloaking [Codemaster]
+ * storage.c & storage.h: added storage_storageopen2() [Codemaster]
+10/18
+ * Changed readme layout for 1.0 scheme. [Aria]
+ * added check for console variable in login_sql [MouseJstr]
+ * Fully translated the untranslated items in the database.sql for SQL. [Nana]
+ * Dev/TODO, asigned myself to some items. [MC Cameri]
+ * char/char.c: changed the online system to omniAthena's [Codemaster]
+ * char/char.c: added log_char and log_inter [Codemaster]
+ * char/char.c: added Mugendai's GUI Support [Codemaster]
+ * char/int_guild.c: added log_inter and db_path [Codemaster]
+ * char/inter.c: added log_inter [Codemaster]
+ * char/char.c: added db_path [Codemaster]
+ * char/inter.h: added log_inter [Codemaster]
+ * char_sql/char.c: added log_char and log_inter [Codemaster]
+ * char_sql/char.c: added Mugendai's GUI Support [Codemaster]
+ * char_sql/int_guild.c: added log_inter and db_path [Codemaster]
+ * char_sql/inter.c: added log_inter [Codemaster]
+ * char_sql/char.c: added db_path [Codemaster]
+ * char_sql/inter.h: added log_inter [Codemaster]
+ * conf-tmpl/char_athena.conf: Added log_char & db_path [Codemaster]
+ * conf-tmpl/inter_athena.conf: Added log_inter [Codemaster]
+
+10/18
+ * clif.c,clif.h,map.h,npc.c,npc.h,script.c: Added NPC Walking. [Valaris]
+ -npcspeed #; To change npc's walking speed.
+ -npcwalkto x,y; Move an npc to a position (keep it less than area size, or sprite will glitch and disappear).
+ -npcstop; Stops an npc's movement.
+
+10/17
+ * Made the IP autodetection code work under a pure win32
+ executable
+ * Fixed the win32 build and made a src\map\Makefile.win32 to
+ make it easier to do win32 builds of the map server
+
+ src\common\utils.c src\common\utils.h src\common\grfio.c
+ src\common\nullpo.h src\common\timer.c src\common\db.c
+ src\common\socket.c src\common\core.c src\common\mmo.h
+ src\common\socket.h src\map\script.c src\map\intif.c
+ src\map\npc.c src\map\clif.c src\map\map.c src\map\clif.h
+ src\map\chrif.c src\map\Makefile.win32
+
+ * skill.c: Fixed noicewall flag. [Valaris]
+ * battle.c: Battle calc weapon attack now checks to see if pc_breakweapon successfully broke the weapon then recalculates damage. [Valaris]
+ * pc.c: Removed broken weapon and equip status, just unequips items again when broken. [Valaris]
+ Removed useless code from pc_breakweapon and pc_breakarmor. [Valaris]
+ * Added template for server control from the console [Wizputer]
+ * conf-tmpl/login_athena.conf: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
+ * login/login.c: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
+ * login_sql/login.c: added support for Mugendai's "I'm Alive" Timer and GUI Flush [Codemaster]
+ * Usable GM commands from server console admin:<gm command>:<map of "GM"> <x> <y> [Wizputer]
+ * Added server:shutdown to shutdown server and help [Wizputer]
+ * Added user discretion for console commands in conf files [Wizputer]
+10/16
+ * Fixed Umbala Language Quest, where a certain NPC would freeze you due to an unfinished script [Shinigami]
+ * Fixed bug in new_hats.txt where free items are given out [Shinigami]
+ * Correct Morroc warp npc overlaying Kafra npc. [Aria]
+ * Corrected npc typos. [Aria]
+ * Skip over npc_selfdestruction2 on allskillup (thanks to celest) [Valaris]
+ * Fixed some typos in some of the NPCs [Shinigami]
+ * tweaked the auto-configure stuff to deal better with
+ machines that have no detectable IP addresses.. is this
+ possible? [MouseJstr]
+ src\char_sql\char.c src\char\char.c src\map\map.c
+ * Made it compile under gcc 2.95 [MouseJstr]
+ * made the char and map servers auto-configure their own IP's
+ whenever possible [MouseJstr]
+
+ If you do not specify the server IP address, it now determines it
+ on its own. This means that to get a server running that is
+ accessable from the internet you should only need to specify the
+ location of the data.grf files. This eliminates one more point
+ of misconfiguration.
+
+ It does not correctly auto-configure for when you are behind a
+ router or a firewall since there is no way of determining the
+ external IP address. On the other hand, we should be able to
+ eliminate the lan_conf file since we know our IP addresses as well
+ as our netmask.
+10/15
+ * added @setbattleflag to let me reset a battle_config at runtime [MouseJstr]
+ * --- RC5 release
+ * another fix to oA2eA-rc5.sql to fix the sell_price [MouseJstr]
+ * Redid readme, updated content a bit, and made ps2 poster in preperation for 1.0 RC5 release. [Evera]
+ * made MAX_HAIR_STYLE, MAX_HAIR_COLOR, and MAX_CLOTH_COLOR
+ configurable via battle_config. [MouseJstr]
+ * made the dex spell cast time scaling configurable via battle_config
+ [MouseJstr]
+ * made the visible area_size configurable via battle_config
+ [MouseJstr]
+ * Reorganized and added the warps into their respective folders, updated map_athena.conf. [Nana]
+ * Added 2 script commands GETLOOK, GETSAVEPOINT (thanks to Lorky). [Lupus]
+ * Added kafra_bank NPC - a new bank with daily interst of 0.1#%. [Lupus]
+ * Changed cast time for champion soul collect to 1 sec (thanks to midas). [Valaris]
+ * Added midas's fix for +30 hitrate with Sonic Blow. [Valaris]
+
+10/14
+ * Fixed help.txt for some @gm commands [MouseJstr]
+ * made login.c compile on gcc 2.95 [MouseJstr]
+ * Fix backwards compatability with old mob skill formats [MouseJstr]
+ * Added mail system commands and @refreshonline to help.txt. [Valaris]
+ * Fixed char guild storage bug [MouseJstr]
+ * Prevented breakage of Weapons/Armor if the respective Alchemist Chemical Protection skill is applied. [spira]
+ * Added so nochat end will set manner to 0. [Valaris]
+ * Added broken item check before breaking (to prevent an item from breaking more than once) [Valaris]
+ * Re-wrote parts of equipment breaking. It will check to make sure it was not a miss before doing break calculations. [Valaris]
+ * Re-added negative value exploit fix. [Valaris]
+ * Fixed guardian opposition search. [Valaris]
+ * Added @unmute. [Valaris]
+ * Added check for map existing before cleanup (server will exit instead of crashing if maps aren't found). [Valaris]
+
+10/13
+ * Fixed parse of antifreeze enable/disable flag. [Valaris]
+ * Fixed end-of-line flags in source tree [MouseJstr]
+
+10/12
+ * Prevent attack/skill usage while wearing tux/wedding dress. [Valaris]
+ * Remove item unequip on tux/wedding equip. [Valaris]
+
+10/11
+ * Added mail system (for SQL version only). [Valaris]
+ - @checkmail
+ - @listmail
+ - @listnewmail
+ - @readmail <#>
+ - @deletemail <#>
+ - @sendmail <name> <message>
+ - @sendprioritymail <name> <message>
+ - Added battle_athena.conf option to enable/disable mail system.
+ - Added mail.sql for sql mail system.
+ - Use "*" for name to send to all players. Level must be >= to @sendprioritymail level.
+
+ * Added @refreshonline to refresh player online status in SQL version. [Valaris]
+
+10/10
+ * Modified ja blacksmith repair code to function with our broken equipment system. [Valaris]
+ * Removed ja repair script commands, they aren't compatible with our broken equipment. [Valaris]
+ * Fixed error in Morroc jewel dealer. [Valaris]
+ * Added so supernovices will get flee from improve dodge. [Valaris]
+ * Fixed assassin and rogue flee bonus, was giving +50 instead of +40. [Valaris]
+ * Fixed bug with using remove trap on a snared monsters and the monster would stay stuck. [Valaris]
+ * Added a check for row return in an sql statement in login. [Valaris]
+ * Added some pointer initializations in map.c. [Valaris]
+ * Calculate pc status when equipping or unequipping pet items. [Valaris]
+ * Fixed crash in looting pet skills if loot size was greater than 10. [Valaris]
+
+10/05
+ * Fixed all mob spawn names (typos, errors, wrong names) according to the mob_db.txt [Lupus]
+ * Added YggdrasilKid's fixed exp.txt. [valaris]
+
+10/04
+ * Added missed close file functions in pc.c [Lupus]
+ * Added some new items, fixed some item names and translated all grabled items in item_db.txt [Lupus]
+ * Fixed bug in MOB_DB and in MOB_BRANCH DB related to wrong "Elder" ID number [Lupus]
+ * Fixed toggle for using sql item db in char-server. [Valaris]
+ * Added interval settings for anti-freeze system. [Valaris]
+ * Added enable/disable options in char_athena.conf and login_athena.conf for anti-freeze system. [Valaris]
+ * Re-added anti-freeze system. [Valaris]
+ * Cleaned up warning in src/common/db.c. [MouseJstr]
+ * Removed afm map checking from char. [Valaris]
+ * npc.c - Re-enabled new "OnTouch" function. Added a missing line to npc_event in npc.c(line 667).
+ pc.c - Added 2 missing "else" statements on (line 3702 and 3842). Now ontouch works correctly and activates
+ everytime instead of only once like in RC4. [kobra_k88]
+ * clif.c - Added: npc_scriptcont(sd,RFIFOL(fd,2)); to "void cliff_parse_NpcCloseClicked" function.
+ Now "close2" script command works properly. Previously, it would freeze the server.[kobra_k88]
+
+10/03
+ * added oA to eA database conversion .sql [MouseJstr]
+ * renamed sql to sql-files to eliminate a problem with make [MouseJstr]
+ * Fixed Assassin Quest where "Nameless One" NPC would freeze after clicking "next". [Shinigami]
+ * charkillable now returns status on target [MouseJstr]
+ * skill names now have descriptions pulled from the client [Mousejstr]
+ * Mapflag "petals" has been changed to "sakura". [Valaris]
+ * The weather @commands will now set that particular mapflag on until server is restarted, and will send weather effect
+ to everyone on that map. It also will not allow the occurance of the command more than once. This method means
+ everyone coming onto the map after the command has been used will see the effect. [Valaris]
+ * Added yor's latest ladmin.c. [Valaris]
+ * Fixed bug in delitem script command that caused it to delete all of an item. [Valaris]
+ * Modified Makefile's to work better in non-sql environment [MouseJstr]
+ * A lot of work on source tree making it more ANSI C compliant [MouseJstr]
+ * Finalized the timers on shutdown
+ turned off malloc debugging on db's. [MouseJstr]
+ * Added release hook's into db's [MouseJstr]
+ * Added runflag to core to allow cleaner shutdown [MouseJstr]
+ * Work on LCCWIN32 for building under Windows natively [MouseJstr]
+ * modified @mapexit to use runflag for cleaner shutdown [MouseJstr]
+ * Improve cleanup on exit of map server of all objects [MouseJstr]
+ * statpoint reader can now be larger then 1432 bytes [MouseJstr]
+ * Fixed so dancing effect is cleared when warping. [Valaris]
+
+10/02
+ * Modified battle config muting players option to work more effectively. [Valaris]
+ * Fixed mute from showing red bubble to players. [Valaris]
+ * Fixed disguise sprite staying when teleporting. [Valaris]
+ * Added a special mob ai check in mob.c. [Valaris]
+ * Fixed petit pet skill's damage from ever increasing. [Valaris]
+ * Removed pet weight and pet loot options, someone re-added them, and this conflicts with pet skills. [Valaris]
+ * Added new skills to mob_skill_db (skills for Alchemist summon marine sphere among others) [Valaris]
+ * Updated skill_cast_db and skill_require_db for summon marine sphere and biocanniablize skills. [Valaris]
+ * Fix for drops by luck crashing. [Valaris]
+ * Removed @nuke for now. [Valaris]
+ * Added japanese ankle snare code. [Valaris]
+ * Using better code for alchemist marine sphere. [Valaris]
+ * Reverted back to old method of OnTouch for now for compatibility with older scripts. [Valaris]
+ * Fixed an infinite loop with preventing multi level up and high novices. [Valaris]
+ * Storage saving in SQL was based on MAX_INVENTORY. Switched to MAX_STORAGE and MAX_GUILD_STORAGE. [Valaris]
+ Should resolve items disappearing. Thanks to fov for pointing this out.
+ * Updated skill_db entries for biocannibalize and summon marine sphere. [Valaris]
+ * Changed sql item name row sizes to 24, and changed memory allocation to 25 bytes instead of 29. [Valaris]
+ * Added upgrade_1.0.0-rc5_database.sql (will set name columns of item db to varchar(24). [Valaris]
+ * Removed anti-freeze system. [Valaris]
+ * Began removing AFM, unless someone wants to complete this. [Valaris]
+ * Added an online status timer. Will check online status of players every hour (for sql version). [Valaris]
+ * Added malloc to map.c. [Valaris]
+ * Added some variables for new mob exclusion. [Valaris]
+ * Using malloc in pc.c. [Valaris]
+ * Added skill reset checks to high/advanced/baby classes. [Valaris]
+
+10/01
+ * Fixed up const.db. [Valaris]
+ - Added
+ bBreakWeaponRate 1068
+ bBreakArmorRate 1069
+ bAddStealRate 1070
+
+ - Fixed
+ bMagicDamageReturn 1071
+ bRandomAttackIncrease 1072
+ bAllStats 1073
+ bAgiVit 1074
+ bAgiDexStr 1075
+ bPerfectHide 1076
+ bDisguise 1077
+
+ * Rewrote mute disable option in clif.c, it did not need to end status. [Valaris]
+ * Added a missing check for SC_NOCHAT in clif.c. [Valaris]
+ * Changed comments on max_lv in battle_config to be less
+ confusing [MouseJstr]
+ * Fixed Gypsy Job Quest, added Crusader Job Quest [Lupus]
+ * Adding missing noquests from previous tree [MouseJstr]
+ * merged conf files between txt and sql [MouseJstr]
+ * According to item_db.txt and mob_db.txt fixed some name differences, wrong item names in
+ pet_db.txt,mob_branch.txt,item_violetbox.txt,item_giftbox.txt,item_cardalbum.txt [Lupus]
+ * Added specialeffect2 script command. Works the same as specialeffect, but the effect will be applied
+ to the player interacting with the npc instead of being applied on the npc. [Valaris]
+ * Added hasitems script command. If a player has any items it will return 1 in an if statement. [Valaris]
+ * Added npctalk script command. Syntax : npctalk "These are my words"; [Valaris]
+ * Removed script::say in favor of Valaris's version. [MouseJstr]
+ * Fixed a bug in guild alliances where it was treating a friend as a foe. [MouseJstr]
+ * Fixed crash in weapon breaking. Was not doing a block type check on the source. [Valaris]
+
+
+09/29
+ * Fixed small, almost non-existing memoryleak, in grfio.c that could
+ cause some systems to exit the application [Kalaspuff]
+
+09/26
+ (Dated On Aegis Website)
+ *--Released 1.0.0 RC4--*
+09/25
+ * Reorganized Npc folder for release
+ * Updated map_athena.conf
+ * Remove certain statuses when warping (Cloaking, Sitting, Gangster's Paradise) that would allow the effect to
+ continue and a player to walk normally. [Valaris]
+ * Remove speed increase of theif and high thief from improve dodge (only assassins and assassin cross's are
+ supposed to get this bonus) [Valaris]
+ * removed more #ifdef's between TXT and SQL [MouseJstr]
+09/24
+
+ * Added @charkillable (to make players killable) [MouseJstr]
+ * Added @dropall (throws all items on ground) [MouseJstr]
+ * Added @chardropall (throws all players items on ground) [MouseJstr]
+ * Added @storeall (put all items in store) [MouseJstr]
+ * Added @charstoreall (put all players items in storage) [MouseJstr]
+ * Added @skillid (look up a skill by name) [MouseJstr]
+ * Added @useskill (use a skill by id) [MouseJstr]
+
+09/23
+ * Update Some Npc Stuff In Payon [Darkchild]
+ * Added Sage Quest [Darkchild]
+ * added @killable - all players can hit you, even out of pvp [MouseJstr]
+ * Changed Basilica to prevent the priest from walking [MouseJstr]
+ * Restore base files in save directory [Yor]
+ * Castle spawn/conquering fix: [Akaru]
+ - Spawns monster when the guild is not owned when the server starts
+ - Spawns emperium with the monsters when guild is not owned yet
+ - If AgitStart and AgitEnd occurs while castle had not been owned, it is just ignored so that the monsters that are guarding the castle and the emperium would not be killed.
+ - Prevent spawn of emperium/monsters after castle is owned
+ - In short, you can clear and conquer the castle any time even when it's not agitstart'ed if the castle is unowned, like in official servers
+
+09/22
+ * added @killer to let GM's hit players outside of pvp [MouseJstr]
+ * added @skilloff to turn off skills on a map [MouseJstr]
+ * added @skillon to turn on skills on a map [MouseJstr]
+ * added @follow to follow players (including warping after them) [MouseJstr]
+ * added battle_config option to control the max number of castles a guild can have [MouseJstr]
+ * upgraded the guild alliance checker [MouseJstr]
+ * added battle_config to control if ghosty armor works for mobs [MouseJstr]
+ * Fixed battle_config to control how much GTB actually helps [MouseJstr]
+ * Fixed battle_config to control if pvp battles give exp or drops [MouseJstr]
+ * Added map aliasing [MouseJstr]
+ * changed the map_nick2sd to be able to handle sub-strings for refering to players [MouseJstr]
+ * made turning of skills on a map actually work [MouseJstr]
+ * Updated Makefiles/GNUMakefiles to include the compilation of /common/malloc.o [PoW]
+
+09/19
+ * Corrected @charstoragelist: [Yor]
+ - because account2storage function create a void storage if it's not exist, somethimes a player could lost its storage.
+ -> creation of account2storage2 to just ask pointer of storage if exist and use it in @charstoragelist.
+ * Improved range system of @monster/@spawn (nearest of GM when less monsters) [Yor]
+ * Client until 2004-09-06 (included) is now completely recognized [Yor]
+ * Fixed kafra storage request for all new clients [Yor]
+
+09/18
+ * Changed to Yor's code that doesn't try and read when it's already not found [Akaru]
+ * Removed check for resnametable in data folder exit -> the resnametable isn't even used if present and it should be optional and not compulsory to have a resnametable in the data folder! [Akaru]
+ * Added an option to choose which clients are accepted on the server (2nd part and finish: Check accepted versions) [Yor]
+ * Added an option to choose which clients are accepted on the server (1st part: reading of the option) [Yor]
+ * Fixed action request (sit, attack, etc..) for all new clients [Yor]
+ * Fixed solve char name for all new clients [Yor]
+ * Fixed get char name for all new clients [Yor]
+ * Fixed an error about packet number on char name function [Yor]
+ * Added items drop packet for all new clients [Yor]
+ * Fixed: in clif_send (global send, not individual send) don't send a packet that client doesn't recognize [Yor]
+
+09/17
+ * Added check to make sure mob is already moving before initiating random walk
+ when the item they are going to loot disappears. [Valaris]
+ * Client of 2004-07-13 is now completely recognized [Yor]
+ * Fixed items take packet for all new clients [Yor]
+ * Corrected packet sizes for each client version (not set packet size if packet doesn't exist) [Yor]
+ * Fixed direction position for all new clients [Yor]
+
+09/16
+ * Client of 2004-07-06 is now completely recognized [Yor]
+ * Fixed skills to position with all new clients [Yor]
+ * Fixed incomplete packet of authentification [Yor]
+ * Fixed size of packets for all clients [Yor]
+ * Improved detection of client version at authentification [Yor]
+ * Improved packet parsing of client (search packet version before to parse) [Yor]
+ * Added packets size of 0x20d and 0x20e [Yor]
+
+09/15
+ * Added "nude" script command, will strip player of all equipment. Syntax : nude; [Valaris]
+ * Removed sandstorm flag, since it does not work as intended (is not a constant effect like believed) [Valaris]
+ * Added specialeffect script command. Syntax: specialeffect #; [Valaris]
+ * Moved noicewall flag to a better position. [Valaris]
+ * Added mob type check to skill_castfix to prevent crashing. [Valaris]
+ * corrected error: skill to id (RFIFOW->RFIFOL) [Yor]
+ * Added packets size of 0x204 and 0x20b [Yor]
+ * Fixed skill_to_id with all new clients [Yor]
+ * Fixed tick sending with all new clients [Yor]
+ * Fixed items use with all new clients [Yor]
+ * Fixed move with all new clients [Yor]
+ * Speedup WantToConnect function [Yor]
+ * Call correct function with any clients packet - size is not correctly set actually [Yor]
+
+09/14
+ * Resetlvl will unequip items that require more than level 1. [Valaris]
+ * Added message about new clients (not actually supported) [Yor]
+ * Added correct call of clif_parse_WantToConnection function for all client types [Yor]
+ * Added size of packet 0x0214 [Yor]
+ * Fixed calls of 'clif_send' function [Yor]
+
+09/13
+ * Modified item_db to have more name consistency, added more translations for items [Akaru]
+ * Fixed in clif_sitting usage of a buffer [Yor]
+ * Fixed in clif_movechar usage of a buffer for clif_set007b [Yor]
+ * Fixed in clif_spawnpc usage of a buffer for clif_set0078 [Yor]
+ * Corrected a commented printf in packet 0x2b0e for debug [Yor]
+
+09/12
+ * Put (commented) parse printf in char.c at the right place (to have all informations) [Yor]
+ * Added Alchemist JobQuest [Darkchild]
+ * Added Inn Npcs [Darkchild]
+
+09/11
+ * Added @charitemlist/@charstoragelist/@charcartlist GM commands to display items of a player [Yor]
+
+09/10
+ * Added a better id control of monster id in @spawn/@monster... GM commands [Yor]
+ * Correction of an error at reading of 'wisp_server_name' option (char.c) [Yor]
+
+09/09
+ * Change @spawn/@monster2... GM commands to spawn in close area [Yor]
+ * commented some printf in char.c to reduce (a little) lag [Yor]
+ * Put @timer messages in msg_athena.conf [Yor]
+ * Add a file for SQL developpers [Yor]
+ * Changed name of newpacket variable of session (packet_ver) and add a message for nex client version [Yor]
+ * Added new client packet sizes and expanded packet acception. [Valaris]
+ * Added snow, fog, rain, leaves, petals, and sandstorm map flags. [Valaris]
+
+09/08
+ * added clif_specialeffect to clif.c, for displaying a wide variety of effects (information from rofx) [Valaris]
+ * Corrected in map: creation of new session before to delete previous session_data [Yor]
+ * Corrected in login/char/ladmin: creation of new session before to delete previous session_data [Yor]
+ * Prevented redeal dupe. Checks to make sure inventory index has not already been added (client prevents
+ the possibility of stacking items, but server did not.) [Valaris]
+
+09/07
+ * Added an option to determinate at which GM level nowarp and nowarpto flags are not more used [Yor]
+ - new option in battle.conf: any_warp_GM_min_level
+ - new checks and message about 'from' (nowarp) and 'to' (nowarpto) in GM commands
+ * Third part of new authentification method (clif_parse_CloseKafra): ignore new 0xF7 [Yor]
+ * Change name of new0x0072 variable by new_auth (because now, auth packet is 0x72 or 0x7E) [Yor]
+ * Second part of new authentification method (clif_parse_WantToConnection): Auth by char-server of new packets resolved [Yor]
+ * Improved check of new packet 0x7E to enter in WantToConnect Function [Yor]
+
+09/06
+ * First part of new authentification method (clif_parse_WantToConnection) [Yor]
+ - accepted new 0x7E for wantto connect
+ - begin to found first authentificaiton and answer to client, but not found
+ * Improved Char-server: [Yor]
+ - Fixed a possible error on multi-map servers (no lastpoint)
+ - Added log about character with same name of wisp server name.
+ - Added a sub function to disconnect a player (used 3 times)
+ * Improved. In global message, use buffer to send to other (avoid possible overwriting). [Yor]
+ * Added Super Novice Job Quest [Darkchild]
+
+09/05
+ * Fixed noskill flag to actually stop all usable skills when used. [AppleGirl]
+ * Removed last lag on char-server causing by too much savings (on accreg) [Yor]
+ * Removed a lag on char-server with a lot of players (for party, like guild) [Yor]
+ * Removed a big lag on char-server with a lot of players: [Yor]
+ - guilds was saved every time a player is online and a lot of other time (removed).
+ - guilds are save only when characters are saved (no more bring forward with characters file, and less savings)
+ * Added GM message that informs when a player blocks wisps of the server (against some bots that auto ignore wisps from a player) [Yor]
+ * Added perfect GM hide in @where GM command [Yor on suggestion of PoW]
+ * Correct NEW shops.txt with error displayed AT START of map-server! [Yor]
+ * Correct NEW payon.txt that crash map-server AT START! [Yor]
+ * More changes and official locations for new payon, things in correct place:
+ - Guild Flags
+ - Kafra
+ - Shops/Refiners (except Pet Shop!)
+ - Most Normal Npcs (not all!)
+ All Based On ScreenShots From kRO!! [Darkchild]
+ * Payon Warps about 80% finished, others were no screens taken from! [Darkchild]
+ * Removed nowarp mapflag and new internal check about gmlevel [Yor]
+ - gmlevel are checked before to call the function (of the GM comand). If you give gmlevel, people can use the function, including if you give level 0.
+ if you want refuse some GM commands to normal players, set the level of the command with a value upper than 0 (of set GM_only_command option to yes).
+ Not add new tests for nothing and use more cpu.
+ - mapflag: no limit for GM commands: what'is the interest to have gm commands limited like player? (it's rule for all GM commands)
+ A gm can have the possibility to go anywhere, specialy to check/control player ==> no mapflag!
+ * Stopped client crashes when jobchanging into another class that doesn't support the weapon you are holding. [Valaris]
+
+09/04
+ * Added nowarp mapflag [PoW]
+ * Fixed nowarpto mapflag in atcommand.c [PoW]
+ * Improved: On hack about name in global message, GM of ALL map-server received hack messages. [Yor]
+ * Moved some GM messages of GM command from at_command.c to msg_athena.txt. [Yor]
+ * Added @whogm GM command. [Yor]
+ * Added a warning when a character has same name than wisp server name. [Yor]
+
+09/03
+ * Added gm level display in all @who(map) GM command. [Yor]
+ * Correction: [Yor] - Thanks to [EvilEden]
+ - Soul Strike mistake (according to http://iro.ragnarokonline.com/game/jobmagskill.asp) - corrected cast time
+ - npc/quests/monstertamers.txt: The Monster Tamer Shogo gives the Deviruchi 'Contracts in Shadow' (641) -> the Bapho Jr. Tamming Item 'Book_of_theDevil' (642).
+ * Added monster/egg name to create egg in @makeegg GM command. [Yor]
+ * Added an option to fix started limited time of a new account. [Yor]
+ * Added @hatch in help.txt. [Yor]
+ * Fixed ChaseWalk so now you can't use skills while in chase walk mode. [AppleGirl]
+ * Fixed Looping of Broken Weapon if you continued to use it even after its broken [AppleGirl]
+ * Updated Weapon Breaking So Now Icon Will Disappear when you unequip the broken item [AppleGirl]
+ * Re-Added @hatch and added makepet to atcommand_athena.conf [Darkchild]
+ * Moved job monsters to their respected files [Darkchild]
+ * Fixed a bug in sence (showing wrong info!) [Darkchild]
+ * Changed the npc/jobs/ folders heavily! [Darkchild]
+ * Added COMPLETE Umbala NPC script [Darkchild]
+ * Added New Payon maps @ bottom of the map_athena.conf [Darkchild]
+ * Added New Payon NPCs and Warps [Darkchild]
+ * Fixed typo and made layout a litle bit better of the readme files [Darkchild]
+ * Added Items Ability to be unbreakable (using bonus bUnbreakable,100;) it will totally unbreakable
+ any lower than a 100 it still has a chance of breaking but call it more durable ;p[AppleGirl]
+ * Added Start_Weapon and Start_Armor to all the other starts in char_athena.conf [AppleGirl]
+ * Updated skill_require_db and skill_cast_db.txt [AppleGirl]
+ * Finish to add a (reserved) wisp name for server - part 3: in map-server replace name where server name is used for wisp [Yor]
+ * Continue to add a (reserved) wisp name for server - part 2: in map-server, reception of the name [Yor]
+ * Begin to add a (reserved) wisp name for server - part 1: in char-server [Yor]
+
+09/02
+ * Added Meltdown's weapon breaking ability [AppleGirl]
+ * Added GM level in front of each line to display only enable GM command of the help.txt. [Yor]
+ * Removed message about limited time if your have unlimited account (that was for tests. sorry). [Yor]
+ * Set day/night messages in msg_athena.conf (for foreign people). [Yor]
+ * Added a function to return a string of msg_table outside of at_command. [Yor]
+ * Fixed clean database at disconnect when session is not auth. [Yor]
+ * Fixed a bug (but not solve the bug - need more research to found where solve it) in map_id2sd function. [Yor]
+ * Set initialisation of ignore list after authentification (not need to be done before) [Yor]
+ * Reduced size of packet 0x2afe (removed not used value) [Yor]
+ * Improve first auth part (wanttoconnect) [Yor]
+ * Added TODO 35 [Yor]
+ * Made a few adjustments to Archer based class skills making more like normal classes instead of Uber Classes. [AppleGirl]
+ * Updated the weapon and armor breaking to be more like official RO adding status icons and so on. [AppleGirl]
+ * Updated a few skills based off a few sites, also fixed other skills that were coded incorrectly. [AppleGirl]
+ * Fixed double connection with same account [Yor]
+ - disconnect immediatly
+ - no enter in database (block or others)
+ - no creation of session
+ - no more need to have 'new_fd'
+ -> less memory usage, less tests
+ * Removed 'other_fd' not used [Yor]
+
+09/01
+ * Fixed Rainbow Egg quest in quests_lutie NPC [PoW]
+ * Added packet length for client server-side friend list, if they choose add the client will not disconnect. [Valaris]
+ Need to figure out the rest of the packets, then can implement.
+ * Added server-side friend list 'add' send packet info to packet documentation. [Valaris]
+ * Fixed: in chrif_authreq, don't send a request to char server if session is not found [Yor]
+ * Fixed: amatsu.txt, when Carter Moores say: remove 10000 zeny, he removes them now! [Yor]
+ * Removed an unknown item in shops.txt [Yor]
+ * Fixed 3 goto in father - acolyte.txt [Yor]
+ * Fixed bug with colors of 5 numbers/digits (warp to city instead of display with color) - wizard.txt [Yor]
+ * Reduce size of mage.txt and fix a text in mes (no bug) [Yor]
+ * Fixed thief.txt script (error on a goto) [Yor]
+ * Fixed account length (WFIFOL(fd,2) instead of WFIFOW(fd,2)) when char-srv doesn't auth an account for map-srv (0x2afe packet) [Yor]
+ * Added @job and @charjobchange to be similar with @charjob and @jobchange [Yor]
+
+08/31
+ * Fixed messages of @(char)jobchange GM commands. [Yor]
+ * Fixed a return value of jobchange function (pc.c). [Yor]
+ * Added coredumps by system when crash. [Yor] - thanks MagicalTux
+
+08/30
+ * Added some comments on gravity commands. [Yor]
+ * Improved /mm, /monster and /item to have some answers. [Yor]
+ * Modified skill_cast_db and skill.c to allow for status effect chance of wizard skills
+ (stun for WZ_METEOR and blind for WZ_VERMILLION) [moonsoul]
+ * Modified skill_cast_db and skill_db to properly reflect cast params and delay times for assassin cross
+ skills Create Deadly Poison(407) and Soul Breaker(379) [moonsoul]
+ * Added damage calcs to battle.c for Assassin Cross skill Soul Breaker(379) [moonsoul]
+
+08/29
+ * Modified skill_require_db to reflect item requirements for assassin cross skills Create Deadly Poison(407)
+ and Enchant Deadly Poison(378) [moonsoul]
+ * Added @charmountpeco/@charpetrename/@charquestskill/@charlostskill GM commands. [Yor]
+ * Added noicewall.txt to map_athena.conf (commented out), noicewall flag [Valaris]
+ will not function when pvp is enabled on map.
+ * Added noicewall flag, noicewall.txt. [Valaris]
+ * Added wiz's temp fix for higher skill ids and skillnodex db. [Valaris]
+ * Added: Usage of At command when failed (100%).
+ * Modified: try to have samme presentation for all at-command code (100%).
+ * Improved/fixed some GM commands [Yor]
+ * Added some 'usages' in some GM commands [Yor]
+ * Added baby classes to equipment codes, they will equip the same as their normal and advanced counter-parts. [Valaris]
+ * Improved some GM commands [Yor]
+ - Added in @(char)baselvlup/@(char)joblevelup GM command:
+ When there are some status/skill points available and we reduce level -> remove points.
+ - Added counter in @statsall GM command.
+ - Fixed in @charsave GM command when map doesn't exist.
+ - Fixed @charbaselvl GM command overflow
+ - Fixed skill value (and crash) in @questskill/@lostskill GM command
+ - Fixed number of spiritballs (@spiritball GM command)
+ * Fixed random PvP crash bug [Lupus]
+
+08/28
+ * Improved some GM commands [Yor]
+ - Added memo points in @go GM commmand.
+ - Added negativ value for @heal GM command.
+ - Fixed @(6stat-adjustement) GM commands overflow.
+ - Simplified @Statall GM commands.
+ - Fixed @guildlvup GM commands.
+
+08/27
+ * Fixed @(char)zeny/stpoint/skpoint GM commands (no more overflow, etc...) [Yor]
+ * Improved @memo GM command: [Yor]
+ You can memo anywhere (it's GM command, not /memo command like for any player).
+ Without value, display actual memo points.
+ * Improved @refine GM command: you can reduce refinement. [Yor]
+ * Fixed @broadcast GM command send broadcast to all Map-servers. [Yor]
+ * Fixed @(char)base/joblevelup command (any adjustement can be entered). [Yor]
+
+08/26
+ * In at_command.c: [Yor]
+ Fixed: initialisation of all strings.
+ Added: Usage of At command when failed (75%).
+ Modified: try to have samme presentation for all at-command code (75%).
+ * Made it so that the pvp_nightmaredrop mapflag would work even without pvp being enabled, now works any time it is set. [Ancyker]
+ * Added level check on /item and /monster. GM level must be >= both @monster and @item [Valaris]
+ level specifications (both since they share the same packet)
+ * Added my own extream mode map flags (disabled by default), makes players drop items at random everywhere (except towns). Full details in map_athena.conf. [Ancyker]
+
+08/25
+ * Added: display usage when GM command failed (some GM commands) [Yor]
+ * Added @email GM command to change your account e-mail [Yor]
+
+08/24
+ * Modified changesex script command use same function as @charchangesex now [Yor]
+ * Added @charchangesex GM command can be used on offline players [Yor]
+ * Added gm ladmin command to change GM level of an account [Yor]
+
+08/23
+ * Fixed some at_command messages: [yor]
+ - remove all unused messages
+ - create commented line of all messages in msg_athena.conf to have english, and under, translation if necessary
+ - add some (arround 80, but not all) messages in msg_athena.conf
+
+08/22
+ * Fixed: In GM commands, add a 'standard' message when GM level is too low [Yor]
+ * Changed in battle_athena.conf [Yor]
+ - atcommand_spawn_quantity_limit: 100 (20 is too short for mass spawnings.)
+ - unknow: give translation of babelfish to help on the explanation (not writing: 'unknow' to not lost the information!)
+ - day_duration: 7200000 & night_duration: 1800000 (set default to 30 min night, 2 hours day to show improvement of eathena by DEFAULT)
+
+08/21
+ * Updated battle_athena.conf to be in English (not Engrish) [Ancyker]
+ * Updated WZ_FIREPILLAR according 8-10 patch [AppleGirl]
+ * Updated skill_cast_db and skill_require_db according to 8-10 kRO patch [AppleGirl]
+ * Added how to use skill_castnodex_db.txt [AppleGirl]
+ * Added skill_castnodex_db.txt, allowing some skills to be casted with out dex's effect on them
+ Midas' idea [AppleGirl]
+ * Improved answer messages of char-server on @(un)ban/@(un)block GM commands [Yor]
+ * Added answer messages of char-server on @(un)ban/@(un)block GM commands [Yor]
+ * Added block command (ladmin c) [Yor]
+ * Added block command (ladmin perl) [Yor]
+ * Fixed job_db1.txt comments to be in english, also spaced the columns to make it easier to read. [Ancyker]
+ * Added: possibility to use "" or '' to give an account name in ladmin (Perl) (no more problem with account name which have spaces). [Yor]
+ * Changed: atcommand_gm_only is set to 'no' by default, because: [Yor]
+ - GM commands level now works correctly
+ - GM commands levels are now set by default with diffrent types of GM
+ * Added @inall/@exall GM command to block/unblock ALL wispers of a player [Yor]
+
+08/20
+ * Added unblock command (ladmin C) [Yor]
+ * Added unblock command (ladmin perl) [Yor]
+ * Fixed: when limited time is in past, add new duration starts from actual time [Yor]
+ * Added chardisguise/charundisguise [Kalaspuff]
+ * Added default time [23:59:59] for timeset/banset ladmin (C) commands [Yor]
+ * Fixed sage rebirth ability at professor job change NPC. [PoW]
+ * Fixed pecopeco knight/crusader rebirth ability at LordKnight and Paladin job change NPCs. [PoW]
+ * Added default time [23:59:59] for timeset/banset ladmin (perl) commands [Yor]
+ * Added a check_ip_flag option in char-server [Yor]
+ * Added a check_ip_flag option in login-server [Yor]
+ * Added a display at start of login-server about IP checking configuration. [Yor]
+
+08/19
+ * Added unban/unbanish command (ladmin c) [Yor]
+ * Added unban/unbanish command (ladmin perl) [Yor]
+ * Added parameter to choose how works timeadd (ladmin command) with unlimited time accounts [Yor]
+ * Fixed @option/@charoption when player is disguised. [Yor]
+ * Added: some information about TODO 19. [Yor]
+ * Added: possibility to use "" or '' to give an account name in ladmin (C) (no more problem with account name which have spaces). [Yor]
+
+08/18
+ * Guardians were immune to skills/spells, fixed. [Valaris]
+ * Added custom draculax.txt script to display npcskilleffect command. [Valaris]
+ * Added npc/events/custom folder. [Valaris]
+ * Fixed Umbala Language Quest NPC bug [PoW]
+ * Added temporary prevention of crash caused by peco + disguise, will look into a better solution. [Valaris]
+ * Changed working of putting disguise on (much like Yor's setpos with undisguise) [Valaris]
+ * Changed disguise id check to > 23 instead of max_pc_class. [Valaris]
+ * Added bDisguise script command for items. [Valaris]
+ Syntax : bonus bDisguise,npc_id/mob_id; Example bonus bDisguise,1002; for poring disguise
+ * Added flag so @disguise command will override any disguise scripts. [Valaris]
+ * Updated @disguise description in help.txt. [Valaris]
+ * Added: @ignorelist/@charignorelist to know from which people a player ignore wisps [Yor]
+ * Renamed: @makepet -> @makeegg (@makepet will be created later to create pet, not a egg) [Yor]
+ * Fixed Phantom of Opera quest, fixed quests_aldebaren requirements [PoW]
+ * Changed: anti-freeze disconnection in char-server set from 1mn 15s to 30s [Yor]
+ * Fixed: free block memory on NULL pointer in char-server do_final [Yor]
+ * Fixed: reset server information when map-server disconnected from char-server [Yor]
+ * Changed: anti-freeze disconnection in login-server set from 1mn 15s to 30s [Yor]
+ * Improved pecopeco checks in @option/@charoption/@jobchange/@charjob [Yor]
+
+08/17
+ * Fixed pecopeco displayings in @option/@charoption/@jobchange/@charjob [Yor]
+ * Correction of @rura, @where, @rurap and some other things in GM commands. [Yor]
+ * Correction of a parameters' errors in GM commands. [Yor]
+ * Correction of @charzeny Gm command (+ @zeny/@charzeny can add and remove zeny without problem). [Yor]
+ * Acolyte Job Quest: Fixed Marthilda, Yosuke NPC bugs. [Lupus]
+ * Added some comments in .conf about @gm [Yor]
+ * Fixed max value of level_new_gm parameter (not 100, but 99) [Yor]
+ * Added level_new_gm parameter in login-server to disable or set level of all GM created by @gm [Yor]
+ * Fixed @GM GM command [Yor]
+
+08/16
+ * Translation of final message of @gm [Yor]
+ * Fixed on @GM: When login server is offline, char server sends impossible to create GM [Yor]
+ * Fixed: refuse @gm GM command to ... a GM :) [Yor]
+ * Added complete answers of /in /ex /inall /exall. [Yor]
+ * Added option to send information to online GM when there is a hack, a spoof name, etc. [Yor]
+ * Added individual ignore management, and wisp checks [Yor]
+ * Added TODO 33 [Yor]
+ * Fixed possible overflow with @ban GM command [Yor]
+ * Speed up a little @ban GM command [Yor]
+ * Added ignore all for wisps (to same map-server). Sorry, before, I was added only for not same map-server [Yor]
+
+08/15
+ * Added a resume for 'email_creation' parameter [Yor]
+ * Fixed double messages when a player wisp/page itself [Yor]
+ * Added ignore all for wisps [Yor]
+ * Added better explanation for the new 'email_creation' parameter [Yor]
+ * Fixed: now, GM accounts are sended to all servers when auto-detect change of GM file is actived [Yor]
+ * Fixed: at auto-creation of e-mail, don't ask the player if login-server is offline (we need login-server to save e-mail) [Yor]
+ * Used config_switch instead of atoi for email_creation parameter [Yor]
+ * Added an option to create e-mail at connection with client [Yor]
+ * Added authentification with login_id2 (1040) - activated by default [Yor]
+ * Added partial part of authentification with login_id2 (1040) [Yor]
+ * Added some missing GM commands in help.txt [Yor]
+ * Improved search of map-server when map is not found [Yor]
+ * Added banish in ladmin (c) to be like of GM commands [Yor]
+ * Fixed Angel Helm quest, fixed Spore Doll quest exploit, Fixed Morgenstein quest bug [Lupus]
+
+08/14
+ * Added banish in ladmin (perl) to be like of GM commands [Yor]
+ * Fixed some possible errors with maps management in char-server [Yor]
+ * Fixed bug of map searching when to few maps on map-servers [Yor]
+ * Changed some console displayings in char-server [Yor]
+ * By default, activation of player ip check [Yor]
+ * Added some of 1040: check of player ip between each server [Yor]
+ * Fixed dupes in warp scripts, reorganized, thanks to midas fro GH warp [kobra_k88]
+ * Added possibility to disable automatic reload of GM accounts file [Yor]
+ * Added log when GM accounts file can not be readed [Yor]
+ * Changed default of GM accounts file check for 120 sec to 15 sec [Yor]
+ * Added automatic reload of GM accounts file if it was modified [Yor]
+ * Added @mapmove, @broadcast, and @localbroadcast in help.txt [Yor]
+ * Fixed possible error of monster id (GM command) if monster begins by a number. [Yor]
+ * Added jobname in @charstats command. [Yor]
+ * Fixed: If a GM command uses NULL pointer as command function, there is no more crash. [Yor]
+ * Fixed Niflheim&Umbala guides. Fixed Niflheim city. removed 2 NPC clones. [Lupus]
+ * Added Archer Skills quests, fixed Thief Skill Quest [kobra_k88]
+
+08/13
+ * Add an option to fix a ban for hacker that spoof name (to set minutes of ban) [Yor]
+ * Fixed incorrect mob IDs with Valaris's mob_db [Ancyker]
+ * Added possibility to execute GM commands when you wisp someone [Yor]
+ * Added a console message when a player try to spoof his name in Global message [Yor]
+ * Added size of packet in packet send by map-srvr to char-srvr about online players [Yor]
+ * Added check on individual stat at creation of a character [Yor]
+ * Added npcskilleffect script command. Will allow npc to show effects of certain skills on specified XY coordinate.
+ Syntax : npcskilleffect 21,10,148,150; skillid, skilllv, x, y. [Valaris]
+ * Increase maximum weight can be used with an item now, thanks to orn. [Valaris]
+ * Fixed mob names in Gonryun , thanks to unsul and Filougarou. [Valaris]
+ * Fixed muramasa curse rate, thanks to OxiMoron. [Valaris]
+ * Fixed Aldeabran&Comodo towns. Added Cheese quest to Comodo. Fixed Thief Job Quest [kobra_k88]
+
+08/12
+ * Begin to add 1040 in login/char/chrif about authentification. not finished [Yor]
+ * @mapmove, @broadcast, and @localbroadcast can now be used. [Valaris]
+ * Looting mobs will not continue to item if it disappears, instead will walk away. [Valaris]
+ * Unitinalized nameid in script.c [Valaris]
+ * Added position in log when unknown packets are saved (login-server). [Yor]
+ * Corrected possible error to contact not good player when a wisp concerns player on an other map-server. [Yor]
+ * Added a function to obtain character name with index in auth structure (char.c). [Yor]
+ * Corrected check/test error in mapif_send. [Yor]
+
+08/11
+ * itemdb_searchname fixed (now firstly looks for item aliases 'name', if not found looks for item name 'jname'). [Lupus]
+ * Optimized getitem, delitem. getweight, fixed there possible scripts exploits [Lupus]
+ * Thief bug's long name in mob_db.txt was Thief Bug Larva, fixed. [Valaris]
+ * Thief bug names were mixed around in monster.txt, fixed. [Valaris]
+ * Fixed incorrect parse of usable item rate. [Valaris]
+ * Added ban command in ladmin (C), like GM command [Yor]
+ * Terminated some translations about wisp/page, and control/improvement/correction of wisp/page. All 'found' bugs are corrected [Yor]
+ * Added translations in inter.c about wisp/page. [Yor]
+ * Corrected printf datas in intif_parse_WisMessage when map-srv receives wisp message from inter-srv. [Yor]
+ * Sended an answer when a wisp/page is supressed because of a timeout. [Yor]
+ * Improved: if inter-srv is asked for a wisp, verify first if the character exists. Don't ask all map-server if it not exists. [Yor]
+ * Changed Printf in intif_wis_message to have better information. [Yor]
+ * Improved: Don't ask inter-server for a whisp/page if player is on the same map-server. [Yor]
+ * Completed some printf and comments in char.c [Yor]
+
+08/10
+ * Improved map_nick2sd function. Now, sensitiv case is removed when it's possible [Yor]
+ * Corrected split of broadcast messages in char-server [Yor]
+ * Message to Valaris from Yor (special file)
+ * Improved accounts file saving: [Yor]
+ - be sure that accounts file is save at least every minute.
+ - save accounts file at end of login-server
+ * Reduce displaying size on some errors about accounts file reading. [Yor]
+ * Created log when change sex packet give an invalid value (login-server) [Yor]
+ * Correction of unknow_packet displaying (in log). Separate is done after 8th char [Yor]
+ * Give possibility to use account name with spaces in prompt commands finished by account name in ladmin (perl). [Yor]
+
+08/09
+ * Fixed char-server lag. 3 tests from 3 people appeared to function properly again. [Valaris]
+ * Basic Implementation of Basilica [AppleGirl]
+ * Added ban command (ladmin perl) [Yor]
+ * Correction of bug about auth_fifo when we block a player. Invalid value in array (login.c) [Yor]
+ * Correction of some tests on server_fd array in login.c [Yor]
+ * Improved Item_searching in all GM commands [Yor]
+ * Created @undisguise GM command [Yor]
+ * Added Umbala town&quests&guide. Some fixes in Yuno warps&shops&guides. Kafra fix. Added Valhallen quest. [kobra_k88],[Lupus]
+ * Corrected char_divorce (char-server) to remove ring to both partner [Yor]
+ * Eventual crashfix for clif_authfail_fd [Kalaspuff]
+ * Corrected @jump GM command. [Yor]
+ * Reduced size of conf/help.txt (max 200 lines in chat window). [Yor]
+
+08/08
+ * Added NPCs to @disguise. [Valaris]
+ * Mob disguises will now show up to player using it as well. Attack animation and sitting do show up to them yet. [Valaris]
+ * Added @disguise GM command in help files [Yor]
+ * Added @go 16 to visit prisoners [Yor]
+ * Reduced number of accounts file saving when informations are not important: [Yor]
+ - save immediatly any modification/creation/deletion of account (like before)
+ - use counter before saving if only ip/time of last connection is changed (normal authentification)
+ because these values are already save in log file.
+ * Speed up account searching in login-server. [Yor]
+ * Speed up character searching for @(un)block/@(un)ban. [Yor]
+ * Created @unjail/@discharge GM command. [Yor]
+ * According to GM definition level in at_command.conf, set level 20 to online_gm_display_min_level for online files. [Yor]
+ * Speed up some sortings of online creation (strings based sortings) [Yor]
+ * Fixed nullpointer crash with disguise in clif_changelook [Kalaspuff]
+
+08/07
+ * Fixed so spells will still be cast if target walks out of range. (please don't overwrite this again) [Valaris]
+ * Corrected a little error in online files creation (only 1 player was visible) [Yor]
+ * Optimized memory management of online list [Yor]
+ - less memory usage
+ - less tests and loops (more speed)
+ - more efficient (use directly char_dat position instead of search it)
+ * Added Official Assassin Job Quest. Now eAthena contains all 2-1 Job Quests! [kobra_k88]
+ * Fixed scripts: 32hats, warper2, platinum_skills, added/changed some mapflags and other misc script changes [Lupus]
+ * Added @disguise command (enter a mob_id or name, and you will appear to others as that mob/npc!)
+ * Fixed code for mob disguises, should not crash clients now.
+ * Improved online management code when we receive char_id. [Yor]
+ * Added code for mob disguises. Can not set yet. Atcommand needs created. [Valaris]
+ * Improved mmo_char_send006b function [Yor]
+ * Corrected: when save file of character can not be created, try backup file if flag is set to create it. [Yor]
+ * Added an option to create backup of characters file [Yor]
+ The backup_txt file was created because char deletion bug existed.
+ Now this bug is corrected and no character disappear.
+ But, create a file with a lot of characters can use CPU usage and decrease hard disk speed.
+ So, I create an option with default value: no create backup.
+ * Improved online management code and some others little codes (char.c). [Yor]
+ * Respawn points of prisoners set to the jail rooms. Jail.txt mapflag addeed. So imprisoned players can't escape. [Lupus]
+
+08/06
+ * Improved/Optimized some little code (char.c/login.c). [Yor]
+ * Improved 0x2afa and 0x2afb (map transmissions between char and map). [Yor]
+ * Optimized global message nick spoof fix. [Valaris]
+ * Fixed crash in attacking guardians in a null guild. [Valaris]
+ * Capped earned exp at 1000000000. [Valaris]
+ * Set area size back to 20 for now, some things in path.c need to be fixed. [Valaris]
+ * Fixed crash in guardian search. [Valaris]
+
+08/05
+ * Added @jail <char_name> GM command [Yor]
+ * Added explanation of @idsearch and @mapinfo in help.txt [Yor]
+ * Improved @idsearch GM command [Yor]
+ * Improved a little 3 loops in ladmin.c [Yor]
+ * Improve some codes in char.c: [Yor]
+ - less tests in online creation
+ - mmo_char_send006b: remove duplicated memset, create a char_dat structure pointer
+ - server_fd[] not seted/modified/checked correctly
+ * Set max_walk_path back to 48. [Valaris]
+ * Added translated Gonryun town. Fixed map names of Louyang shops. Added missing Blacksmith,
+ added extra Rapairmen into refine.txt. In Inns added 4 different prices based on Base Lvl.[kobra_k88]
+
+---------eAthena 1.0.0 RC3 TXT---------
+08/04
+ * Set battle_athena.conf to more accurate settings. [Valaris]
+ * Decreased default damage delay (stun after being hit) by 75%. [Valaris]
+ * Max walk path is now correct (17). [Valaris]
+ * Area size is now correct (14). [Valaris]
+ * Improved some very little codes in char.c. [Yor]
+ * Remove displayings of logs on console of map-server [Yor]
+ use it for DEBUG, not by default, that decrease a lot the performance
+ * Added (commented) printf in freeze function for debug if necessary [Yor]
+ * Fixed melee ctrl-attack targetting. [Valaris]
+ * Reset attack target when equipping arrows. [Valaris]
+ * Improved (log and remove_control_chars functions). [Yor]
+ * Added 'available free bytes' in displaying when size is expanded. [Yor]
+ * Fixed incorrect returns in clif_authok. [Valaris]
+ * Added pointer checks to chrif.c [Valaris]
+ * Added some pointer checks to the mob ai. [Valaris]
+ * New (lag-free) fix for NPCs / mobs not showing up when chars walk around [Kalaspuff]
+
+08/03
+ * Made so if exp given is less than 0, 0 is given instead of 1 (plants were giving exp) [Valaris]
+ * Added console displaying to have complete informations when we expand Wdata session. [Yor]
+ * IMPORTANT: Add a TODO 31 for Guilds' coders. [Yor]
+ * Old packet 0x2b16 use packet number 0x2b0e. [Yor]
+ * remove packets 0x2b0e and 0x2b0f. [Yor]
+ * on character_name ask packet: add account_id of asker. [Yor]
+ * Improved script code in novice.txt. [Yor]
+ * Fixed error in alberta.txt. [Valaris]
+ * Allow player placement on afm-type maps. [Valaris]
+ * Added afm loading. [Valaris]
+ * Removed useless code for mob equipment. [Valaris]
+ * Initial packet setup for possible playable mobs. [Valaris]
+ * Added check for save_clothcolor for the dyefix, and added another check to make sure player is dyed before using the fix. [Valaris]
+ * Improvement: Character asking of map-server to char-server is not more case sensitive. [Yor]
+ * Added TODO 29 & 30. [Yor]
+
+08/02
+ * Re-added "player not attached" error reporting. [Valaris]
+ * Fixed errors in 32 hat quest that was causing player not attached errors. [Valaris]
+ * Fixed input number function: commented out negative input check by Valaris in script.c (all scripts have been revised and fixed),
+ made actual bug fix of buildin_input func (wrong variable type conversion (int)->(unsigned int) in clif.c
+ Due to the fixed bug Merchant Job Quest works fine now [Lupus]
+ * Fixed number input bugs/possible exploits: mage.txt IceCream.txt event_valentine.txt refine.txt
+ milk_trader.txt grandpa_pharmacist.txt aldebaran.txt alberta.txt juice_maker.txt [Lupus]
+ * Finished: offline player can be @ban/@block/@unban/@unblock by their character name. [Yor]
+ * Added packet between map to char to work on offline players (@ban/@block/@unban/@unblock) [Yor]
+ * Added check on character name with less than 4 characters [Yor]
+ * Added @chardelitem GM command [Yor]
+ * Fixed Kafras (no more buttonless msg bugs, Kafra Pass works fine) [Lupus]
+ * Changed input exploit, only checks for negative now instead of having an input cap. Fixed up vending exploit. [Valaris]
+ * Added check for src with High Wizard's soul drain. [Valaris]
+ * Fixed up npc_suicide and npc_selfdestruction, should fix up crashes caused by them. [Valaris]
+ * Added more pointer checks in the clif_authok function. [Valaris]
+ * Added some pointer checks to clif.c, should prevent crashes. [Valaris]
+ * Added some checks about writing errors of item names in GM commands (check cases). [Yor]
+ * Fixed Hunter Job Quest 1.6 [Lupus]
+ * Removed Kalaspuff's fix for mob/npc data not always being recieved. It was causing
+ excessive amounts of lag. [Valaris]
+
+08/01
+ * Added ability to spawn character pets. [Valaris]
+ * Added show_mob_hp. [Valaris]
+ * @item/@item2 GM commands now work correctly with name begining by a number. [Yor]
+ * @spawn/@monster2 GM commands authorise spawn of guardians. [Yor]
+ * Fixed so guardians may be spawned outside of castles. [Valaris]
+ * Fixed/Improved @spawn/@monster2 GM command. [Yor]
+ @spawn/@monster2 GM command: you can use space in the desired name now (use "") [Yor]
+ * Added TODO 26 and 27. [Yor]
+ * Guardians if owned by a guild will display guild name and castle on name request. [Valaris]
+ * Added checks for null blocks in mapforeachin functions. [Valaris]
+ * Addition of a GM level 99 account for test of GM commands. [Yor]
+ * Creation of a default structure for GM levels (sub-gm, gm, admin, etc.). [Yor]
+ * Improved @time GM command (better code and display more informations). [Yor]
+ * Added informations about game time in @time command [Yor]
+ * Added @time command to have server time [Yor]
+ * Fix night at start if administrator want night and there is no duration for night and day [Yor]
+ * Fix for NPCs / mobs not showing up when chars walk around [Kalaspuff]
+ * Begin @unban/@unblock GM command (structure done). [Yor]
+ * It's now possible to disable Night or Day (set to 0 in battle.conf). [Yor]
+ * @day/@night: when already the desired cycle, display a message. [Yor]
+ * Fixed overlapping Ice-Cream Maker NPC, duplicated NPCs, restored duplicated Akaru's MrSmile [Lupus]
+
+07/31
+ * Terminated: night/day cycles. [Yor]
+ * When a state comes back to normal, player stay in night if it's night. [Yor]
+ * Started to add management of day/night: [Yor]
+ creation of 3 parameters in battle.conf
+ TODO: usage of these parameters (later).
+ * added line '// $Id: Changelog.txt,v 1.65 2004/09/29 17:31:42 kalaspuff Exp $' in all code source files to avoid overwrite in CVS. [Yor]
+ * Fixed number/quantity in @item command. [Yor]
+ * Fixed when night and disconnect/reconnect, it's night. [Yor]
+ * Removed extension to check a map in char.c (less tests). [Yor]
+ * Added savepoint coordonates (x,y) if player is set to a new map (char.c). [Yor]
+ * Added izlude to check major cities. [Yor]
+ * Began adding developer mobs. [Valaris]
+ * Added dyes and fixed client crashes with player mobs. [Valaris]
+
+07/30
+ * Added temp fix for "nullpo player not attached" error message (script.c script_rid2sd) [Lupus]
+ * Added checks for major cities in afm format. [Valaris]
+ * Added preliminary AFM(Advanced Fusion Map) support. Actual map-reading works, but rest of server needs to recognize them.
+ Thanks to alexkreuz [Valaris]
+ * Changed Map and NPC loading display. [Valaris]
+ * Removed unneeded 'End' and duplicate 'end' script commands. [Valaris]
+ * Added 'language <language>' command in ladmin (perl) to change language of displaying. [Yor]
+ * Fixed atcommand_gm_only parameter: [Yor]
+ 0: you can define level command '0' for normal players (gm level 0)
+ 1: even you define a level 0 for a command, normal player can not use it. Only GM level 1 or more can use command (if command level is possible for this GM)
+ Note: This parameter is not like atcommand_for_all (this parameter doesn't exist actually) .
+ * Fixed Kafras (Cart Service for Super Novice), some warps in Morroc, Aldebaran. [Lupus]
+ Added official shop into St.Abbey. [Lupus]
+ Added quests: Lutie Town Hat Quest by TonyMan, 23 new hats custom quest. [Lupus]
+ Fixed jobchange.txt. [Lupus]
+ Improved pvp.txt. [Lupus]
+ Rearranged and updated! (now in 2 variants) mapflags. [Lupus]
+ Updated map_athena.conf [Lupus]
+ * Fixed: battle_athena config's atcommand_gm_only; yes was no and vice versa [Kalaspuff]
+
+07/29
+ * Added 'language <language>' command in ladmin.c to change language of displaying. [Yor]
+ * Re-added guardians don't attack guild members, someone must have removed it by accident. [Valaris]
+ * Restore correct displaying (LAN/WAN) previous was good :) (sorry... prabably tiredness). [Yor]
+ * Fixed some errors in novice.txt script. [Yor]
+ * Kashy's script fixes. [Valaris]
+ * Displaying of correct information in LAN/WAN test (displaying was reversed) in char.c [Yor]
+ * Creation of a char_unblocked directory (char directory is blocked) [Yor]
+ - modification of makefile
+ * Added a note in TODO 14: encrypted password - problem with client versions [Yor]
+
+---------eAthena 1.0.0 RC2 TXT---------
+07/28
+ * Added metaller to equipped mobs. [Valaris]
+ * Added a note in TODO 19 [Yor]
+ * REMOVED last changelog: cvs server: [14:29:29] waiting for cvs's lock in /usr/cvsroot/athena/src/char [Yor]
+ * Displaying of correct information in LAN/WAN test (displaying was reversed) in char.c [Yor]
+ * Added "OMG" emotion to weapon/armor breaking. [Valaris]
+ * Removed space in a pointer in mob.c. [Valaris]
+ * Restored previous version of lan management in login.c, because: [Yor]
+ - check test was incorrect (no mask for controled ip).
+ - in check test, we recalculate every time the subnetwork (loss of time).
+ - impossible to have a name definition for the sub-network (some network administrator use a name to define the sub-network).
+ - no more default configuration of sub-network.
+ - possible errors in the reading function of the lan file.
+ - no more logs about sub-network.
+ - BUT, conserved: - new default name for lan file
+ - color for displaying of LAN/WAN
+ * Removed some memsets from chrif.c that caused segfaults. [Valaris]
+ * Added fix for anklesnare and spiderweb. [Valaris]
+ * Added Kashy's Lan Support code. [Valaris]
+ * Removed variables and assignment used by prevent_multi_login. [Valaris]
+ * Removed prevent_multi_login. (many problems reported with it) [Valaris]
+ * Fixed armor breaking. Was being broken when pc was attacking instead of when being attacked. [Valaris]
+ * Fixed checkcart, checkfalcon, checkriding (they didn't return any value) in script.c [Lupus]
+ * Fixed breeder.txt renter.npc, kafras NPC (added correct class check, added correct checkcart, checkfalcon, checkriding) [Lupus]
+ * Fixed Kafra functions_kafras.txt NPC (added correct checkcart, fixed cmall cart giving bug) [Lupus]
+ * Fixed Kafra functions_kafras.txt NPC (fixed Kafra Pass exploit) [Kobra_k88]
+ * Fixed Hunter.txt coords of the Guild entrance warp [Lupus]
+
+07/27
+ * Improved check command in ladmin.c [Yor]
+ * Added map_id check in map_foreachinarea, to prevent eventual crashes [Kalaspuff]
+ * Added @enablenpc and @disablenpc in help files [Yor]
+ * Fixed Thunder Storm range (thanks midas) [Kalaspuff]
+ * Added Anthell NPC trigger in Morroc.txt warps/town [Lupus]
+ * Added missing Warps for Job Quests of Swordman, Hunter and Thief in jobquests.txt [Lupus]
+ * Updated atcommand_conf, missing GM-level for @enablenpc and @disablenpc [Yor]
+ * Removed possible overflow error in @enablenpc and @disablenpc [Yor]
+ * Updated atcommand_conf, missing GM-level for haircolor [Kalaspuff]
+ * Improved best job test in novice.txt [Yor]
+ * Improved @go command: [Yor]
+ - give list of cities if no value
+ - added start point (to welcome newbies)
+ - give possibilities to use city names (@go geffen): at least 3 characters, and some writing errors are tested
+ * Replaced every Job Quest Script (excluding Assassin, 2-2 and 2-2-X ). Now all 2-1 Jobs have big quests. [Kobra_k88]
+ * Replaced all Skill Quests (Added Sand Attack Skill Quest). [Kobra_k88]
+ * Added Legendary Swords quest. [Kobra_k88]
+ * Replaced 6 towns with new scripts: Izlude, Prontera, Morocc, Geffen, Alberta, Al De Baran. Splitted all towns quests into files. [Kobra_k88]
+ * Splitted and optimized Kafras & Guides. [Kobra_k88]
+ * Implemented Kafra Pass! [Kobra_k88]
+ * Removed free Breeders (replaced by the correct ones). [Kobra_k88]
+ * Placed all Sign Posts/Signs into a single file. [Lupus]
+ * Files arrangement, additional warps/scripts correction. Fixed several scripts (NPC overlapping, bad sprites, etc). [Lupus]
+
+07/26
+ * More accurate pvp point system. It skips ranks, needs more work. [Valaris]
+ * Fixed crash in executioner card code. [Valaris]
+ * Fixed mob respawn after death bug. [Valaris]
+ * Fixed exp problem caused by bounds checking. [Valaris]
+ * Fixed pvp rank so only one person may be rank 1. [Valaris]
+ * Any time a person is on a pvp map, the rank will calculate, preventing bad rank packets from being sent. [Valaris]
+ * Added Job Agencies for Training Ground (novice.txt). [Yor]
+ * PVP respawn client crash fix. [Valaris]
+ * Fixed small error in kafra.txt [Syrus22]
+ * Finished adding special equipped mobs. [Valaris]
+ * Added 2 living statues behind the NPC 'Monster Master'. [Yor]
+ * Removed infinite possibilities to have items from helper (novice.txt, new_1-4.gat,60,149). [Yor]
+ * Added 2 living statues behind the NPC 'Monster Expert'. [Yor]
+ * Improved a little 1st course of novice training. [Yor]
+
+07/25
+ * Allow mobs to be equipped with pet armor. mob_avail and clone mobs need to be created. [Valaris]
+ * Removed [AppleGirl]'s armor breaking code. [Valaris]
+ * Commented out data_dir. [Valaris]
+ * Finished exp bounds checking. [valaris]
+ * Added negative value checks to clif_updatestatus. [Valaris]
+ * Added exp bounds checking for those rediculously high rate servers. [Valaris]
+ * Added bounds checking to the @zeny and @charzeny commands. [Valaris]
+ * Improved and corrected some errors 1st course of novice training. [Yor]
+ * Removed no guild check for Guardians. Guardians SHOULD attack people with no guild. [Syrus22]
+ * Fixed Alliance check in mob.c [Syrus22]
+ * Added armor breaking to normal battle (crits will double the chance) [Valaris]
+ * Fixed mistake in map.c causing compile errors. [Syrus22]
+ * Fixed backstab bow penalty option. [Syrus22]
+ * Fixed Alliance check in battle.c for emp/guardian damage. [Syrus22]
+
+07/24
+ * Added backstab bow penalty option [Akaru]
+ * Fixed OnGuardianDied events on prontera castles 3 to 5. [Valaris]
+ * Another vending fix. [Valaris]
+ * Fixed bugs in npc headers caused by someone using spaces and not tabs. (kafra.txt, guide.txt, yuno.txt) [Valaris]
+ * Fixed a vending bug. [Valaris]
+
+---------eAthena 1.0.0 RC1 TXT---------
+07/22
+ * Fixed numerous startup errors in aldebaron castles and one geffen castle. [Valaris]
+ * Full Guild Wars Script Complete!!! [Akaru]
+ * Fixed rice ball item. [Valaris]
+ * Fixed problems with options and peco riding. [Valaris]
+ * Updated item_db with fix for Sleipnir and more translations. [Akaru]
+ * Translated item_violetbox, mob_poring, mob_branch, mob_boss. Fixed wizard.txt (wrong item id), headgeatquest.txt(added Zeny check) [Lupus]
+
+07/21
+ * Updated refine.txt. Added optional features and optimized the file. [Syrus22]
+ * Evened out the # of columns in mob_db, filled in some blanks. [Valaris]
+ * Undid compilation errors caused by Akaru's removal of nullpo.o from map-server compile [Valaris]
+
+07/20
+ * Removed Ghostring from gef_fild13.gat [rg]
+
+07/19
+ * Fixed Graffiti [Valaris]
+ * Zeny Bug In Vending Fixed [Darkchild]
+
+07/18
+ * Added a check about level of at_command when reading the file [Yor]
+ * Updated /help and conf/help.txt [Yor]
+ * Added @nuke command in conf/help.txt [Yor]
+ * More WoE Castles Done [Hikaru]
+ * Changed: inter.txt->inter.log in log directory [Yor]
+ * Added some char_log when character can not be created (invalid value, invalid name, etc...) [Yor]
+ * Changed: char.txt->char.log in log directory [Yor]
+ * Update features.html/changlog.html [Yor]
+ * Fixed compilationissue on FreeBSD [Kalaspuff]
+
+07/16
+ * Remove limit for kami/kamib ladmin command. [Yor]
+ * Fixed crash in weddingtxt.txt where it was checking an invalid equip index. [Valaris]
+ * Added some TODO for next version. [Yor]
+
+07/15
+ * Changed: login.txt->login.log in log directory [Yor]
+ * added system to choice authorised ip for remote administration [Yor]
+ * Added listBan/listOk commands in ladmin's. [Yor]
+ * Speed up a little search_mapserver function. [Yor]
+ * Init map strings of each servers when map-server send informations. [Yor]
+ * Added some TODO for next version. [Yor]
+
+07/14
+ * Fixed another lockup with multi_level_up [Valaris]
+ * Added kami(yellow)/kamib(blue) commands in ladmin (terminated). [Yor]
+ * Fixed name of ladmin_athena.conf. [Yor]
+ * Fixed mvp item reading. [Valaris/Syrus22]
+ * Added new move packet in map (ver.13jully04) [Yor]
+ * Added new auth packet in map (ver.13jully04) [Yor]
+ * Added kami/kamib commands in ladmin. not terminated: to do: login->char [Yor]
+ * Updated Some Npcs [Darkchild]
+ * Added Gefenia Warps [Darkchild]
+ * Added Berzebub Quest [Darkchild]
+ * Removed random alchemist marine sphere code, until some other system is worked out. [Valaris]
+ * Fixed infinite loop caused by turning multi level off. [Valaris]
+ * Added display id the char-server is freezed. [Yor]
+ * Added debug printf about the max_connect_user in char-server. [Yor]
+ * Added banadd command in ladmin.c [Yor]
+ * Removed duplicate check in chrif.c. [Yor]
+
+07/13
+ * Fixed GM_level code in map-server. [Yor]
+ problem is in the hash system of the db -> use simple db until we found solution.
+ note: for this db, it's not necessary to use a db system (little db, 2 values: key, value)
+ * Improved GM_level code in map-srv, but not solve the problem. [Yor]
+ * Fixed error of 'return' without value in chrif_parse (chrif.c). [Yor]
+ * Added character name, account id and gm level on console in map-server when auth is accepted. [Yor]
+ * Added gm_level of the account on console in char-server when auth is accepted. [Yor]
+ * Added gm_level of the account on console in login-server when auth is accepted. [Yor]
+ * Added timeadd command in ladmin.c [Yor]
+ * Added help for each command (help <command>) in ladmin (perl and c). [Yor]
+ * Fixed global message (normal speak) name spoof exploit. [Valaris]
+ * Added timeset command in ladmin.c [Yor]
+ * Added banset command in ladmin.c [Yor]
+ * Added vending and trading dupe fixes, thanks to Kinko and Kazzy [AppleGirl]
+ * Added multi_level_up command to battle_athena and commandline. [Valaris]
+ Turning it off will allow a player to only level up once from a monster.
+ * Added: explanations of ladmin_athena.conf keys in conf_ref.txt. [Yor]
+ * Fixed: init mmo_map_server structure (to 0) in char-server. [Yor]
+ * Added Gefenia Maps [Darkchild]
+ * Added @nuke command do to user request. [Valaris]
+ * Removed nick spoof fix code for now, it broke chat. [Valaris]
+ * Added some code for @nuke command. [Valaris]
+ * Finished adding battle_athena options to command line. Every option in battle_athena.conf
+ can now be passed directly through the command prompt. [Valaris]
+
+07/12
+ * Added many battle_athena options to command line arguments. [Valaris]
+ * Allow battle_config_switch to be used globally in map-server. [Valaris]
+ * Rewrote map-server command-line code. Will now begin implemented nice commands for map-server. [Valaris]
+ * Added BETA version of ladmin in C. [Yor]
+ * Added new packet structure of authentification and move - automatic detection. [Yor]
+ * Added /item command. It is same as /monster. Both commands will search for mobid first, if not found will give item. [Valaris]
+ * Fixed a displaying error in state command (perl ladmin). [Yor]
+ * Added /monster command. Syntax is /monster <name/id>. [Valaris]
+ * Fixed chat spoofing in global messages. [Valaris]
+ * Prevent nick spoofing in whispers. [Valaris]
+ * Added check about lenght of packet 0x72 for new client version [Yor]
+ * Added Pet Equip Items Quest Npc
+ * Added Pet Taming Items Quest Npc
+ * Added Slotted Sunglasses Quest Npc
+ * Added pet_equip_required option for pet skills. [Valaris]
+ * Changed: create a sub-function for help command in ladmin (perl). [Yor]
+
+07/11
+ * Added Petit pet skill. [Valaris]
+ * Added some code for Petite Heaven Drive, still does not work, but doesn't crash. [Valaris]
+ * Fixed dokebi and baby desert wolf pet skills. [Valaris]
+ * Added Orc Warrior, Hunter Fly, Poison Spore, Baby Desert Wolf, Baphomet Jr, and Dokebi pet skills. [Valaris]
+ * Added script command petskillattack.[Valaris]
+ * Fixed search command in ldamin (perl) ignore sensitive case now. [Yor]
+ * Fixed default to 0 for save_unknown_packets configuration in login. [Yor]
+ * Fixed the warnings about implicit declarations. [Kalaspuff]
+ * Added @guildrecall/@partyrecall commands. [Yor]
+ * Added Isis pet skill. [Valaris]
+ * Added petmag script command for magnificat. [Valaris]
+
+07/10
+ * Added Banker NPC because alot of users wanted one. [Syrus22]
+
+07/09
+ * Added Sohee pet skill. [Valaris]
+ * Added petheal command. [Valaris]
+ * Added Smokie pet skill. [Valaris]
+ * Added bonus bPerfectHide for Smokie pet skill. [Valaris]
+ * Added Spore pet skill. [Valaris]
+ * Created petrecovery script command. [Valaris]
+ * Added Poring, Drops, Poporing, and Yoyo loot skills. [Valaris]
+ * Added petloot script command for pet looting. [Valaris]
+ * Removed pet_loot config settings. [Valaris]
+ * If pk_mode is on, a message will show up in map-server. [Valaris]
+ * Fixed pk_mode extra experience and drops so will occur if monsters is 20 levels or higher than player. [Valaris]
+ * Fixed @killmonster crash caused by implementation of pk_mode. [Valaris]
+ * Finished setting up pk_mode, should be 100% complete now. [Valaris]
+ * Added nopvp.txt for pk_mode. [Valaris]
+ * Prevent novice engagement in pk_mode. [Valaris]
+ * Fixed up and changed the exp penalty system. [Valaris]
+ * Pk_mode will now give double exp loss if killed by player. [Valaris]
+ * Updated conf/help with new commands [Yor]
+ * Removed more pvp timer stuff from pk_mode [Valaris]
+ * Increase drop rates +25% if over level 20 on pk_mode. [Valaris]
+ * Changed +25% exp increase on pk_mode to 15%. [Valaris]
+
+07/08
+ * Disabled pvp rank and timer if pk_mode is on. [Valaris]
+ * All maps made pvp if pk_mode is on. [Valaris]
+ * pk_mode additional 25% exp given over level 20 [Valaris]
+ * Disable @pvpon and @pvpoff commands if pk_mode is on. [Valaris]
+ * Added pk_mode option in battle_athena.conf (not yet implemented) [Valaris]
+ * Reworked prevent_multi_login, should work perfectly now. [Valaris]
+ * Removed need for eof=2 for prevent multilogin, will now just delete the blocks containing both sessions. [Valaris]
+ * Added map-servers anti-freezed connection in char-server. [Yor]
+ * Added char-servers anti-freezed connection in login-server. [Yor]
+ * Fixed spy commands so that inputting the same id/name turns off the command. [Syrus22]
+ * Created @partyspy command. [Syrus22]
+ * Renamed search_guildname function to conform with normal naming standards in guild.c. [Syrus22]
+ * Created @whomap/@whomap2/@whomap3 commands to show online players on a specifical map. [Yor]
+ * Updated and Shrunk the Kafra Script. [Syrus22]
+ * Create @reloadgmdb gm command. [Yor]
+
+07/07
+ (Dated On Aegis Website)
+ *--Released 1.0.0 RC3--*
+ * Fixed crashed with prevent_multi_login. [Valaris]
+ * Allow infinited local logins if prevent multi_login is on. [Valaris]
+ * If prevent_multi_login is on, it will disconnect both clients on the same ip. [Valaris]
+ * Prevent_multi_login will now list the character names of both accounts when logged out, and give a message. [Valaris]
+ * added updated const.txt and pet_db.txt [Valaris]
+ * GM accounts/level updating without restarting completed (by reloadgm ladmin command). [Yor]
+ * Removed gm_account_filename definition from map.conf. [Yor]
+ * Updated GM level by reloadGM ladmin command. [Yor]
+ * Added a packet between char and map to send GM accounts and their level. [Yor]
+ * Added a GM minimum level option to display 'GM' in online files. [Yor]
+ * Added a warning when a GM account is defined twice in the file. [Yor]
+ * Check for castle before guardian searches for emblem. [Valaris]
+ * Prevent stealing from treasure boxes. [Valaris]
+ * Enable mounted classes to use pedestrian counterpart's items. [Valaris]
+ * Change so petskillbonus will only update stats(client-side) if need be to prevent errors. [Valaris]
+ * Fixed crash with putting pets with skills back into egg. [Valaris]
+ * Added Steel ChonChon, Rocker, and Deviruchi pet skills. [Valaris]
+ * Added bAllStats(SP_ALL_STATS), bAgiVit(SP_AGI_VIT), bAgiDexStr(SP_AGI_DEX_STR) bonuses for pet skills. [Valaris]
+ * Added ChonChon, Lunatic, Picky, and Savage Babe pet skills to pet_db.txt. [Valaris]
+ * Added petskillbonus command for pet skills. Added pet_skill_bonus functions in pet.c. Made pointers for pet skills. [Valaris]
+ * Added 'GM' display option for online files [Yor]
+ * Improved GM accounts file reading in login-server [Yor]
+
+07/06
+ * Changed heal dog in prontera to a poring. [Valaris]
+ * NPCs with mob sprites can now be used in scripts. [Valaris]
+ * Removed sd->brokencounter. Made getbrokenid more scripter friendly. Updated refine.txt getbrokenid commands. [Valaris]
+ * Mounted classes will now use equipment of their pedestrian counterpart. [Valaris]
+ * Improved management of GM account structure in char-server. [Yor]
+ * Added packet betwen login to char to send GM accounts value. [Yor]
+ * Added reloadGM command in ladmin to reload GM accounts file without stop the login-server. [Yor]
+ * Added listGM/lsGM command in ladmin to list only GM. [Yor]
+ * Correct an error in loop of char_divorce function (incorrect variable). [Yor]
+ * Added some comments. [Yor]
+ * Added a check on start_point.map when configuration is readed. [Yor]
+ * Modified final message of login log at end of login-server. [Yor]
+
+07/05
+ * Flamelauncher,frostweapon,lightningloader,seismicweapon, and enchant poison now check to make sure target's weapon is not already enchanted. [Valaris]
+ * If sage breaks another person's weapon due to enchant failure, it will tell caster. [Valaris]
+ * Modified venom splasher to hopefully stop crashes caused by spamming. [Valaris]
+ * SA_FLAMELAUNCHER,SA_FROSTWEAPON,SA_LIGHTNINGLOADER,SA_SEISMICWEAPON now check to make sure target is holding a weapon. [Valaris]
+ * SA_FLAMELAUNCHER,SA_FROSTWEAPON,SA_LIGHTNINGLOADER,SA_SEISMICWEAPON now will break target's weapon on failure (if one
+ is being held and caster met requirements) [Valaris]
+ * Prevent unidentified and broken items from being sold. [Valaris]
+ * Added buildin_repair for equipment repair npc. [Valaris]
+ * Added repair npc to forgery in prontera. (refine.txt) [Valaris]
+ * Added sd->brokencounter and buildin_getbrokenid for item repair npc. [Valaris]
+ * Corrected some item names [rg]
+ * Fixed so @repairall success message and effect will only display once. [Valaris]
+ * Added "No items needed to be repaired" message and added forge success effect to @repairall. [Valaris]
+ * Added @repairall command. [Valaris]
+ * Added equipment_breaking option, changed weapon_break_chance to weapon_break_rate (changed to %) [Valaris]
+ * Crit's will now double weapon breaking chance if turned on. [Valaris]
+ * Added missing commands in atcommand_athena.conf. [Yor]
+ * Added @warpto command (same @jumpto). [Yor]
+ * Added increase in chance to break weapon if using powerthrust. [Valaris]
+ * Added weapon_break_chance to battle_athena.conf. [Valaris]
+ * Modified multiple login from one ip prevention(and remove gm bypass). [Valaris]
+ * Broken weapons will now have their description names in red. [Valaris]
+ * Speed up characters saving [Yor]
+ * Improved logs when a character isn't readed [Yor]
+
+07/04
+ * Completed Prontera guild castles [Akaru]
+ * break_weapon_chance now works, but broken weapon will not be displayed any differently than a normal weapon.
+ Also does not yet affect a dual dagger assassin's 2nd weapon. No way to repair yet, and no skills/stats affect breaking chances. [Valaris]
+ * Update int_storage to include broken column on all items (updates from old version) [Valaris]
+ * Added @guildspy command. [Syrus22]
+ * Added weapon_break_chance. (Not implemented yet) [Valaris]
+ * Added break column for items in athena.txt (will upgrade older versions automatically) [Valaris]
+ * Changed default required GM levels for GM commands (effective if corresponding directive(s) in /conf/atcommand_athena.conf is/are missing) to 1 [rg]
+ * Added packet_table_en.txt in doc folder. Has some translations of the client_packet.txt. [Valaris]
+ * Prevent @monster and @spawn of guardians/emperium. [Valaris]
+ * Changed killmonster so it will not destroy guardians. [Valaris]
+ * Added prevent_multi_login in battle_athena.conf to disable multiple logins from same ip (ignores gms, and will
+ display ip of offending ip if turned on) [Valaris]
+ * Added checks on player trading to prevent possible exploits. [Valaris]
+ * Make sure cart is on before vending. [Valaris]
+ * Cleaned up vending exploit fixes. Now checks to make sure not vending more than max items per skill level. [Valaris]
+
+07/03
+ * Prevent use of potion pitcher on oneself, fixed potion pitcher so can be used on other targets. [Valaris]
+ * Fixed the damage code for Falcon Assault, so its not totally useless. [?]
+ * Update peco riders for people upgrading athena, fixed bug in unmounting pecos. [Valaris]
+ * Removed option 32 from @option, added @mountpeco command. [?]
+ * Removing peco will revert to proper job level, fixed so jobchanging from peco status to peco user without peco status,
+ will update job to peco status. (ie going from Mounted crusader to Unmounted knight, will jobchange to mounted knight) [Valaris]
+ * Fixed so Peco mounting will not reset job level. Set to remove peco status if jobchanging to a class that does not use them. [Valaris]
+ * Peco mounting will now jobchange accordingly. [Valaris]
+ * Added checkfalcon and checkriding script commands. [Valaris]
+ * Added checkcart script command (since was already being used in scripts) [Valaris]
+ * Re-added unix fd_setsize definitions, makefile will now pass -DFD_SETSIZE=4096 only for windows compiles.
+ Tested new implementation of using -DFD_SETSIZE=4096 in makefile on windows box, and got past 64 connections even. [Valaris]
+ * Improved messages between servers about connections. [Yor]
+ * Improved pc_resetlvl, fixed the bug about options being left. [?]
+
+07/02
+ * Added optional match_test in @who/who2/who3 commands (no sensitive case) [Yor]
+ * If there is no map-server, send right message to client (char-server) [Yor]
+ * Improved counter of users (char-server) [Yor]
+ * Improved save of characters (char-server) [Yor]
+ * Improved sorting of account before save (login-server) [Yor]
+ * Improved map search at selection of a character (char-server) [Yor]
+
+07/01
+ * Removed FD_SETSIZE definitions from socket.h, added -DFD_SETSIZE=4096 argument to makefiles. [Valaris]
+ * Changed exploit fix in chrif.c [Valaris]
+ * Added assassin mask view_id in item_db [Valaris]
+ * Added a parameter to authorise minimum GM level at connection (login) [Yor]
+ * Fixed crash caused by making raw connection to map-server. [Valaris]
+ * Corrected a possible error at check of online players [Yor]
+ * Improved characters names control/check [Yor]
+ * Improved save/load of REG2 strings and values (login) [Yor]
+ * When there is no char-server, login-server sends proper message instead of a void list of servers [Yor]
+
+06/30
+ * Fixed a crash when used @charmodel,@charstpoint,@charskpoint and
+ @charzeny with the wrong name [Kalaspuff]
+ * Added possibilities for switchs in battle.conf (add some foreign language) [Yor]
+ * Protected char-server again disconnection of login-server [Yor]
+ * Added possible protection against packet exploits in chrif.c. [Valaris]
+ * Login-server: Added an option for the format of the date (log, etc...) [Yor]
+ Improved some little code.
+ Added log for char-server packets.
+ * Correction of prtg_cas03.txt that crash server AT START! [Yor]
+ * Added functions of mapflag noskill [Kalaspuff]
+
+06/29
+ (Dated On Aegis Website)
+ *--Released 1.0.0 RC2--*
+
+06/28
+ * Added monsters_ignore_gm option. Monster won't attack GMs if turned on unless attacked and within 1 cell. [Valaris]
+ * Added drops_by_luk option in battle_athena.conf. Anything higher than 0 will turn this option on, and act as a mutiplier.
+ Example : Setting of 10 with 50 luk would add 5 to the drop rate. So say a card has a drop rate of 2, it would become 7. [Valaris]
+ * Fixed range and removed skill failed message from Venom Splasher, also moved some of it's code around. [Valaris]
+ * When a player arrive on map-server, time limit of its account is displayed if not unlimited [Yor]
+ * Fixed problem where warp portals broke in npc.c [Valaris]
+ * Updated atcommand_heal so it works like it should [Kalaspuff]
+
+06/27
+ * Changed Venom Splasher so it will increase damage based on level of Poison React (had it set so the player had to be
+ using it, but it turns out it doesn't need to be) [Valaris]
+ * Venom Splasher now works except for the counter part. Damage is instantly dealt if skill is successful. [Valaris]
+ * Improved @item command to make correctly pet eggs [Yor]
+ * Updated Chase Walk so you can't attack while you have it casted [?]
+ * Removed un-needed code for graffiti from clif.c [Valaris]
+ * Added @ban command (to ban a player for a limited time) [Yor]
+ * Added @charblock command (you have been blocked by GM team) [Yor]
+ * Added the mapflag nowarpto [Kalaspuff]
+ * Updated the function of nowarp [Kalaspuff]
+
+06/26
+ * When a player is banned (or with a state != 0), he is disconnected [Yor]
+ * When sex is changed, skills of other sex are reseted (and skill points increased of the same number) [Yor]
+ * To avoid problem with change sex and equipement, changed sex character is unequipped of all equipment [Yor]
+
+06/25
+ * Added @charchangesex GM command [Yor]
+ * Changed: Changesex is now done after that the login-server has confirmed the change [Yor].
+ becuase sex is saved in account file.
+
+06/24
+ * Added new classes in change sex script command (buildin_changesex). [Yor]
+ * Translated pet_db.txt again [Valaris]
+ * Initial implementation of Venom Splasher. Runs checks on target poison status and whether or not hp is less then 2/3.
+ Will display skill failed if checks do not pass. Shows effect when successful. [Valaris]
+ * Added administration system to change final date of a banishment. [Yor]
+ * Added information about banishment in admin packets about an account. [Yor]
+ * Updated Chase Walk so it cancels when recasted to fix it. [?]
+ * Initial implementation for Chase Walk skill for Stalker Class [?]
+ * When an account is banned, message_error_7 is not more modified [Yor].
+
+06/23
+ (Dated On Aegis Website)
+ *--Released 1.0.0 RC1--*
+ * Added bRandomAttackIncrease for Executioner card. Chance stacks, attack does not. [Valaris]
+ * Fixed magic_damage_return so it will actually work (for Maya card). [Valaris]
+ * Add a ban timestamp in the structure of the accounts. Management not yet make [Yor]
+
+06/22
+ * Don't send a message when it's void (packet 0x8e) - client doesn't display it [Yor].
+ * Add a refresh time parameter for the html online file (refresh time in the explorer) [Yor].
+ * Create a job_name function in atcommand to have the name of the job (suppress repeated code) [Yor].
+ * Added New City: Jawaii
+ * Fix free memory of online structure at end of char-server [Yor].
+ * Remove possible duplicated online players (multiple map-servers) [Yor].
+ * Add examples in state command (ladmin) [Yor].
+ * Use a function to display warnings in login-server to avoid duplicated messages with import option [Yor].
+ * Iinitial implementation for magicdamagereturn for Maya Card [?]
+ * skill_out_range_consume - If it is set 'no' the skill will still be cast (like real servers).
+ If it is set to yes, skill will fail and sp and items required will be lost. [Valaris]
+
+06/21
+ * Updated Sacrifice skill code to be more flexible for user usage [?]
+ * Changed SC_ATTACKPOTION and SC_MATTACKPOTION to SC_ATKPOT and SC_MATKPOT, also added it in item_db.txt [?]
+ * Guild Territory will now display the # of castles owned or "None Taken". [Valaris]
+ * Changed SC_ATTACKPOTION and SC_MATTACKPOTION so the increase can be specified in itemdb.txt.
+ Example : sc_start SC_AtkPot,18,30; (+30 atk for 30 seconds) [Valaris]
+ * Added SC_ATTACKPOTION and SC_MATTACKPOTION for +30 atk for specified time period (need to get the correct id's yet,
+ right now giving wrong icons and wrong message). Added entries in const.txt, need more info to complete these. [Valaris]
+ * Fixed so players will always spawn with guild emblem if one is needed. [Valaris]
+ * Reduce number of tests in atcommand_character_stats_all (@charstatsall). [Yor]
+ * Fix memory management for online players list. [Yor]
+ * Party HP now updates instantly on change. [Valaris]
+ * Fixed crash when non-guild members are in the area of guardians in attack mode.(Will ignore them) [Valaris]
+ * A higher level GM is not displayed by who/who2/who3 if he uses HIDEGM. [Yor]
+ * When a GM with HIDEGM relogs, he is always HIDEGM (only GM). [Yor]
+ * Improve presentation of online.txt file. [Yor]
+ * In /npc/quests/magicalhatquest, corrected checking for and deletion of Mage Hat instead of Wizard Hat. [rg]
+
+06/20
+ * Fixed problem with guardian emblems disappearing [Valaris]
+ * If a GM use GM HIDE, he is not counted in the number of players [Yor]
+ * Setup prtg_cas01 to load guardians on server startup and to spawn them when purchased. Also switched from GuardianDied
+ to OnGuardianDied (other way wasn't working). Changed so guardians won't be killed on agitend. [Valaris]
+ * Guardians cannot attack and cannot be hurt during non woe time. [Valaris]
+ * Switched checking of castle.txt format so it won't wipe guardian hp everytime it loads. [Valaris]
+ * Made it so if guardians were installed in old db, that it will set guardians to full hp based on defense and class. [Valaris]
+ * Autosave will save guardian HP data. [Valaris]
+ * Castle.txt visibleG flags will be set when guardians are killed. [Valaris]
+ * Moved emperium defense upgrade to mob.c. [Valaris]
+ * Removed guardian hp saving from agitend. [Valaris]
+ * Added option to choose which columns are displayed in the online files [Yor]
+ * Added option to choose how to sort online players in the online files [Yor]
+ * Correction of a new error on guild (from [Valaris]). Old castle.txt files couldn't be readed. [Yor]
+ * Kafra Points And Rewards fixed [Darkchild]
+ * Kafra file made a lot smaller with DoEvents [Darkchild]
+ * Fixed lotsa bugs in Kafra's [Darkchild]
+ * Initial implementation for paladin's skill sacrifice [?]
+ * Loading/Saving of guardian hp (loads on agitstart, saves on agitend) [Valaris]
+ * Added so guardian hp will change accordingly. Moved the guardian defense increase to mob.c [Valaris]
+ * Implemented guardian and guardianinfo script commands [Valaris]
+
+06/19
+ * Added Ghp0-7 into castle database [Valaris]
+ * Added configuration parameters to choose online files filename [Yor]
+ * Added online files (txt and html) [Yor]
+ * Added choose of authorised letters/symbols for characters names [Yor]
+ * Added 3 new Dragon Boat Festival monsters with temporary stats to mob_db [Akaru]
+ * Translated more of item_db [Akaru]
+ * Added correct effects for Dragon Boat Festival items [Akaru]
+ * Solve problem about the change of MAX_GUILDPOSITION by [Valaris] when we load an old guild.txt file. [Yor]
+ * Improve allow/deny configuration. Write warnings if necessary. [Yor]
+
+06/18
+ * Add heal_payment.txt as an alternative to heal.txt. [Yor]
+ * Sex change (char.C): Correct error in jobchange. Disconnect player if connected. [Yor]
+ * Sex change/account deletion: Change authentification to avoid that player comes back on char-server within the 5 secondes before disconnection. [Yor]
+ * Save configuration of login-server in log file at start. [Yor]
+
+06/17
+ * Added fritz's vending exploit fixes. [Valaris]
+ * Increased max guild castle size to accomodate for novice guild castles. [Valaris]
+ * Fixed investment in prontera castle 1. [Valaris]
+ * Implemented of showing guardian hp on guardian investment in prontera castle 1 (factors in defense investment) [Valaris]
+ * Added strmobinfo script command. Syntax is strmobinfo(x,y). 'y' is the mob's id. x will show different values.
+ 1=english name, 2=jap name, 3=level, 4=max_hp, 5=max_sp,6=base_exp,7=job_exp. [Valaris]
+ * Disable % and / for 1st symbol of commands (party chat symbol and standard ragnarok GM commands) [Yor]
+
+06/16
+ * Added fully functional economy for Prontera Castle 2 Guild Wars script [Akaru]
+ * added fix for cross-class ensemble skills. [?]
+ * Increased max guild member limit to accomodate for +2 member increase per extension level
+ and increased max position to 56 to accomodate for all members. [Valaris]
+ * More of fov's fixes for atcommand.c, chrif.c, and clif.c. [Valaris]
+ * added fixes for class checking skills like bard & dancer skills and a priest skill. [?]
+ * updated skill_cast_db and skill_require_db.txt [?]
+ * changed int_guild.c added +4 for extension skill to match kRO [?]
+ * remote administration: add a command/packet to change sex of an account [Yor]
+ * Log detailled reason of refused connection in remote administration [Yor]
+ * Create a mmo_auth_tostr for accounts [Yor]
+ * Add a message when char-server is terminated [Yor]
+ * Save deleted accounts (administration deletion) in log file [Yor]
+ * Add a message when login-server is terminated [Yor]
+
+06/15
+ * Added in fov's fixes for socket.c, atcommand.c, npc.c and skill.c [Valaris]
+ * Added a char_log function. Save unreadable characters in log instead of a specific file [Yor]
+ * Save invalid account lines in log file. Account will be never lost [Yor]
+ * Sort characters of same player with the slot number in the characters file [Yor]
+
+06/14
+ * Fix errors in prtg_cas01, prtg_cas05 and MrSmile scripts [Akaru]
+ * Added fully functional economy for Prontera Castle 1 Guild Wars script [Akaru]
+
+06/13
+ * If player is on map-server when the account is deleted, player is now disconnected [Yor]
+ * Correction of char deletion bug when account is deleted [Yor]
+ * Added Prontera Castle 5 guild wars script [Akaru]
+ * Added Prontera Castle 4 guild wars script [Akaru]
+ * Add checks about duplicated character ids and names [Yor]
+ * Don't save a reg of a character if its string is void [Yor]
+ * Read a character even if a reg string is void (don't suppress the char for that) [Yor]
+ * Save characters in account_id order [Yor]
+ * Save not readed characters in a file (char file name + "not_readed.txt") [Yor]
+ * Display line number when a character can not be readed [Yor]
+ * Initialise char_num! Display number of readed characters [Yor]
+ * Do right initialization of char_dat [Yor]
+ * Add red color for ERROR displays in char.c [Yor]
+
+06/12
+ * Change 0 to '\0' for char in login.c. Add red color for ERROR displays [Yor]
+ * Optimised Mr. Smile NPC script [Akaru]
+ * Add a configuration in atcommand.conf to set the 1st character of ALL commands (Now, you can choose @, #, !..., any char that is not control character) [Yor]
+ * Optimised Prontera Castle 1 and 2 guild wars scripts [Akaru]
+ * Added Prontera Castle 3 guild wars script [Akaru]
+ * Changed Graffiti placement, will allow placement of one painting at a time (old one will be replaced). [Valaris]
+ * Graffiti displays to other plays and remains on map for set time period. [Valaris]
+
+06/11
+ * Initial implementation of graffiti (does not change directions yet (vertical/upsidedown) and doesn't dissappear [Valaris]
+ * Add config_switch (0/1, yes/no, ...) for char-server configuration [Yor]
+ * Add a display when a player does a connection [Yor]
+ * Add a display when a remote administration does a connection [Yor]
+
+06/10
+ * Improve compiling instructions for cygwin (socket.h) (depends of the cygwin version). [Yor] with help of [Lostsoul]
+ * Add parameters in login.conf to display or not parse information [Yor]
+ * Remove some repeated codes in ladmin / add example when error of command [Yor]
+ * Remove delete_session error in login.c (sorry) [Yor]
+ * Display correct message for char-server disconnection [Yor]
+ * Finish translation of ladmin [Yor]
+ * Fixed Various Npc Bugs [Darkchild]
+ * Added green colour for READY displays in char-server, login-server and map-server [Akaru]
+
+06/09
+ * Add some comments in ladmin [Yor]
+ * Remove displaying of packet 0x2714 from login-server [Yor]
+ * Correct length of password send to login-server in char-server [Yor]
+ * Char-server/login-server: put default lan to 127.0.0.1 instead of any hasardous value [Yor]
+ * Change displaying of the title [Yor]
+ * Optimised twin towers script to use duplicate [Akaru]
+ * Edited to a more user friendly error message for invalid server communication password [Akaru]
+ * Updated the item_db for more item name consistencies [Akaru]
+ * Reverted training grounds back to new_1-?.gat maps. [Valaris]
+ * Added added more variety to sending packets to guild members (same map, same map w/out self, ect) [Valaris]
+
+06/08
+ * Put a HOWTO in lan_support.conf. [Yor]
+ * Removed extra semicolons in char.c, map.c, and pc.c. [Valaris]
+ * Added missing } to clif_storageitemlist in clif.c and found a couple lines ending with 2 semicolons, removed them. [Valaris]
+
+06/07
+ * Translated refine_db.txt. [Valaris]
+ * Negative vending fix. [Fritz]
+ * Correction of mktime parameters in ladmin + some translations [Yor].
+ * Add some checks on login-server configuration parameters [Yor].
+
+06/06
+ * Fixed error in skill_tree.txt that would crash some people's servers when changing to Professor. [Valaris]
+ * Added admin_state directive for enabling and disabling remote administration, instead of testing whether admin_pass == "" [rg]
+ * Add title to the servers. [Yor]
+ * Add warnings about default password usage (administration and gm passwords). [Yor]
+ * Modify adduser.c for the default configuration. [Yor]
+ * Write the complete admin_packet.txt. [Yor]
+ * Champion NPC was looking for a priest instead of monk, changed to correct value. [Valaris]
+ * Small fixes in guide.txt, kafra.txt, and swordsman.txt pointed out by StiNKy. [Valaris]
+ * Begin splitting monsters.txt [Akaru]
+ * Removed obselete monster spawn files [Akaru]
+ * Complete Guild Wars for Prontera Castle 2 script done [Akaru]
+ * Fixed prevent_logout option. [Valaris]
+
+06/05
+ * Implemented guild castle regen.(Stackable 2x for castle owners) [Valaris]
+ * Fixed player logout display on map-server console. [Valaris]
+ * Added atcommand_spawn_quantity_limit directive to /conf/battle_athena.conf [rg]
+ * Fixed noskill map flag [?]
+ * Complete information about login configuration in conf_ref.txt [Yor]
+ * Add possible configuration values on/off or yes/no in login-server [Yor]
+ * Guardians and emp will now get +2000 hp for every defense investment within a castle [Valaris]
+ * Changed the login server to reject all remote administration authentication if the admin_pass directive isn't set, and commented-out the admin_pass directive in /conf/login_athena.conf [rg]
+ * Changed /src/common/grfio.c so it doesn't try to read GRF files with no respective directive in /conf/grf-files.txt [rg]
+ * Changed so no one can spawn inside castles. [Valaris]
+ * Updated item_db with more consistant names, fixed some unknown_items [Akaru]
+ * Complete Guild Wars for Prontera Castle 1 script done [Akaru]
+ * Disabled guild breaking, alliance breaking, and alliance making during WoE. [Valaris]
+ * Will not default to prontera.gat if map-server is not connected. [Valaris]
+ * Warp players who are not in guild out of castles when WoE starts. [Valaris]
+
+06/04
+ * Allies now do no damage to guardians or emperium. [Valaris]
+ * Prevent allies from being attacked by guardians. [Valaris]
+ * Optimized guardian emblem code. [Valaris]
+ * Fixed map-server crashing with spawning guardians in untaken castles. [Valaris]
+ * Guardian emblems will change if castle is taken, but client needs to refresh map. [Valaris]
+ * Fixed problem where guild emblem would vanish from guild info screen. [Valaris]
+
+06/03
+ * Improve e-mails checks and LAN/WAN checks on char-server. [Yor].
+ * Add some explanations in front of accounts file. [Yor]
+ * Set a non LAN configuration for basic configuration in lan_support.conf. Explain parameters. [Yor]
+ * add missing parameters of char_athena.conf, and explain them. [Yor]
+ * Restore default admin pass and gm pass of login_athena.conf, and add missing parameters. [Yor]
+ * fix missing include in char.c. [Yor]
+ * Translation of checkversion. Add some explanations in front of file. [Yor]
+ * Translation of getlogincount [Yor]
+ * Finish translation of new login.c [Yor]
+ * Implemented Guardian Emblems [Valaris]
+
+06/02
+ * Added maximum_level option in battle_athena.conf [Valaris]
+ * Added maximum level cap to all the level up commands. [Valaris]
+ * Added "Deal has been cancelled" message to Fritz's input exploit fix. [Valaris]
+
+06/01
+ * Fixed training ground npcs and warps, removed depreceated maps, using new ones. [Valaris]
+
+05/30
+ * Small map-server crashing fix with Leo and Guide npcs in training ground [Valaris]
+
+05/29
+ * Removed item_value_db.txt and all references to it [Valaris]
+ * Removed unused class_equip_db.txt [Valaris]
+ * Fixed stat and level reset bug where needed status points wouldnt reset unless relogged [Valaris]
+ * @monster will summon monster without an amount specified [Valaris]
+
+05/28
+ * Added heal and usable item rate modifier [Valaris]
+ * Added pet equipment to equipment rate modifier [Valaris]
+ * Added option to turn alchemist summon experience and drops on and off [Valaris]
+ * Alchemist Marine Spheres now randomly explode [Valaris]
+ * Fixed bug where if certain items lowered max hp (4 mysteltain, and 1 eddga) below 0
+ would loop to server max hp value. [Valaris]
+
+05/26
+ * Added New Hats [Darkchild]
+ * Added New Monsters [Darkchild]
+05/23
+ * Added @charstatsall, views all characters (easy for money bug scaning etc! [Fritz]
+ * Max to input npc command, 0 is lowest, 99999999 is max, this to prevent money bugs! [Fritz]
+
+05/21
+ (Dated On Aegis Website)
+ *--Released 0.5.2--*
+
+05/20
+ (Dated On Aegis Website)
+ *--Released 0.5.1--*
+ * got dye working again [Darkchild/fritz]
+
+05/19
+ (Dated On Aegis Website)
+ *--Released 0.5.0--*
+
+05/09
+ * added Prontera Guild Castle 3 test guild wars test script [Akaru]
+ * modified Prontera Guild Castle 1 and 2 guild wars test script [Akaru]
+ * fixed several valkyrie jobchangers [Akaru]
+05/08
+ (Dated On Aegis Website)
+ *--Released 0.4.2--*
+ *--Released 0.4.1--*
+ * added Prontera Guild Castle 2 test guild wars test script [Akaru]
+
+05/07 (Dated On Aegis Website)
+ *--Released 0.4.0--*
+
+05/06
+ * added Prontera Guild Castle 1 test guild wars test script [Akaru]
+05/04
+ * removed parses and added ENGLISH! [?]
+
+04/29 (Dated On Aegis Website)
+ *--Released 953 Delta--*
+
+04/28 (Dated On Aegis Website) (Whose Ideas Were These?)
+ *--Released 953 Gamma--*
+04/27
+ *--Released 951 Beta--*
+ * fixed @jobchange crash [credits to Mugendai, commited by Akaru]
+
+04/25 (Dated On Aegis Website)
+ *--Released 947 Alpha--*
+04/23
+ * added more Professor Skills and added checks [?]
+04/10
+ * added more upper skills from moonsoul's works [?]
+02/12-04/10
+ * CVS Down - Not Many changes could be made...*
+
+02/22 (Dated On Aegis Website)
+ *--Released 817--*
+
+02/12
+ * added more mob skill conditions (friendstatuseq, mysyatuseq, friendhpltmaxrate) [RoVeRT]
+02/06
+ * dumped @skillall for @allskill [?]
+02/05
+ * fixed provoke so it doesnt work on undead [RoVeRT]
+ * added TyrNemesis^ card removal code and min/max settings [RoVeRT]
+02/04
+ * added start_zeny and party_level_range to char_athena.conf [RoVeRT]
+02/03
+ * Improved the prontera.gat map fallback. [Sara-chan]
+ * Improved the way guild emblems act when logging in. [Sara-chan]
+ * Undead-class armor, and Undead monster themselves will never be frozen [RoVeRT]
+ * fixed negative values for NPC to always be 0
+01/26
+ * mob_warpslave correction [RoVeRT]
+01/25
+ * added poison hp reduction [AppleGirl]
+01/20
+ * added intimidate [RoVeRT]
+ * added mvp checks for some skills
+01/17
+ * added skill check for empelium attack and removed drops from NULL kills [RoVeRT]
+01/16
+ * added secondary effects for when characters with appropriate elemental armor
+ are within area of effect of sage spells SA_VOLCANO(atk up), SA_DELUGE(max hp up),
+ SA_VIOLENTGALE(flee up) [moonsoul]
+ * removeal of @randmon as it isnt needed [RoVeRT]
+01/15
+ * fixed auto spell so it works the prober way [RoVeRT]
+01/12
+ * added mob_warpslave [RoVeRT]
+ * added mob_warp to check noteleport mapflag
+01/07
+ * added OnCommand for NPC [RoVeRT]
+ * added new on death method for NPC spawned mobs [RoVeRT]
+ * added mobcount [RoVeRT]
+01/06
+ * fixed icon status for spear quicken [AppleGirl]
+ * added quoted name support for @monster [RoVeRT]
+01/05
+ * added indivudal support for card and equip drop rates [RoVeRT]
+01/04
+ * added TF_PICKSTONE and skill check condition for TF_THROWSTONE [AppleGirl]
+ * added updated cast_db.txt and fixed SA_VOLCANO, SA_DELUGE,
+ SA_VIOLENTGALE, and SA_LANDPROTECTOR GRAPHICS [AppleGirl]
+ * Fixed Effects of a few bard Skills. [AppleGirl]
+ * added option to stop logout for 10 seconds after taking a hit [RoVeRT]
+01/03
+ * added inet_ip support to char and map [RoVeRT]
+ * added checkcart, checkfalcon and checkriding npc commands
+01/02
+ * added new npc timer support that is independant of a player [RoVeRT]
+12/31
+ * Added @refineall [Mark]
+12/30
+ * added support for custom_item-db.txt with battle_athena.conf option [RoVeRT]
+ * fixed @charzeny bug
+ * translated help.txt to english anong with a few other files [RoVeRT]
+12/29
+ * added umbala maps to map_athena.conf [RoVeRT]
+12/26
+ * added Skill_range based on level, and partially working AutoGuard [Moonsoul]
+ * added Correction of Whip and Instrument Damage Again [Sara-Chan]
+12/25
+ * Spear Quicken Correct Graphics,Fixed Magnum Break (Which Fixes All Other
+ Splash skills), and Fixed Brandish Spear [AppleGirl]
+ * Updated Command For @SkillAll Added Atcommand_athena.conf [RoVeRT]
+12/24
+ * Added Side Effects for multiple skills for 2-2 classes [AppleGirl]
+12/23
+ * Added GM Command Called @Skillall [RoVeRT]
+ * @skillall to skill-up all your current skills [RoVeRT]
+ * @hide does hide you from all monsters [RoVeRT]
+ * fire wall limited to 5 per map [RoVeRT]
+ * to turn on PVP without @pvpon and to disable flywing search for mapflag [RoVeRT]
+ * no luck with @morph at this time yet [RoVeRT]
+ * splash attack added but still kinda buggy [RoVeRT]
+ * Added in Dancing and Song Playing for Bard and Dancer [AppleGirl]
+ * Added Skill Arrow Check For Archer Skills [AppleGirl]
+ * Added Skill Status Recovery [AppleGirl]
+ * Added Skill Bard and Dancer Skills Last Longer [AppleGirl]
+ * Added Skill Grimtooth does splash damage [AppleGirl]
+ * Added Skill Steal Fixed and Snatcher [AppleGirl]
+ * Added Skill SonicBlow only works with Katars Now [AppleGirl]
+12/22
+ * Added Skills Shield Boomerang, Shield Charge, and Defender [AppleGirl]
diff --git a/doc/notes/INSTALL.txt b/doc/notes/INSTALL.txt
index ab8609bf3..c98db12b4 100644
--- a/doc/notes/INSTALL.txt
+++ b/doc/notes/INSTALL.txt
@@ -1,246 +1,246 @@
-eAthena SQL Installation and Upgrade Instructions
-
-1 Installation
- 1.1 Windows
- 1.2 Linux
- 1.3 FreeBSD
-2 Upgrading
- 2.1 Upgrading from version 817
- 2.2 Upgrading from version 0.5.2
- 2.3 Upgrading from version 1.0 RC 1
-3 Mail System
- 3.1 Adding the mail database
- 3.2 Activating the mail system
-
-1 Installation
-==============
-
-1.1 Windows
------------
-
-1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
-
-- 2.2.1 Installing MySQL on Windows
-- 2.4 Post-Installation Setup and Testing
-- 5.4 General Security Issues
-- 5.5 The MySQL Access Privilege System
-- 5.6 MySQL User Account Management
-
-2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
-
-3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
-
-CREATE DATABASE ragnarok;
-GRANT
- SELECT,INSERT,UPDATE,DELETE
- ON `ragnarok`.* # database
- TO 'ragnarok'@'localhost' # username@address
- IDENTIFIED BY 'password'; # password
-
-For security, do not use the password "password" for your user account.
-
-4. Execute the batch queries stored in sql\main.sql. If you want your item and monster databases stored in your MySQL database, execute sql\database.sql too. For example:
-
-mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
-
-5. Add an inter-server account for every character server you intend to link to your login server. For example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`)
- VALUES ('inter-server_chaos','password','S','');
-
-Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
-
-- The "sex" field value must equal "S"
-- The "e-mail" field value is unused and therefore should be set to ""
-- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
-
-Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
-
-6. Add accounts or convert existing accounts from a text file database.
-
-To add new accounts, use, for example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`,`level`)
- VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
-
-Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
-
-To convert existing accounts stored in a text file database, use login-converter.exe and char-converter.exe. Parties and guilds cannot be converted.
-
-7. Edit the configuration files in conf\ (except import\, mapflag\, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
-
-8. Download the latest cygwin1-yyyymmdd.dll.bz2 snapshot, where "yyyymmdd" is the build date, from http://cygwin.com/snapshots/. Extract cygwin1-yyyymmdd.dll from the archive, rename it to cygwin1.dll, and move it to your system or system32 directory -- depending on your version of Windows -- in your system root directory.
-
-9. Optionally compile:
-
-a. Install Cygwin with these packages:
-
-devel/
- gcc,
- gcc-g++,
- gcc-mingw-core,
- gcc-mingw-g++,
- make,
- mingw-runtime,
- mktemp
-
-b. Using Cygwin, install the MySQL libraries by compiling and installing the MySQL database server source distribution for Linux with "./configure --without-server && make && make install".
-
-c. Using Cygwin, enter "make" in the eAthena SQL directory. Recompile with "make clean && make".
-
-1.2 Linux
----------
-
-1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
-
-- 2.2.2 Installing MySQL on Linux
-- 2.4 Post-Installation Setup and Testing
-- 5.4 General Security Issues
-- 5.5 The MySQL Access Privilege System
-- 5.6 MySQL User Account Management
-
-2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
-
-3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
-
-CREATE DATABASE ragnarok;
-GRANT
- SELECT,INSERT,UPDATE,DELETE
- ON `ragnarok`.* # database
- TO 'ragnarok'@'localhost' # username@address
- IDENTIFIED BY 'password'; # password
-
-For security, do not use the password "password" for your user account.
-
-4. Execute the batch queries stored in sql/main.sql. If you want your item and monster databases stored in your MySQL database, execute sql/database.sql too. For example:
-
-mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
-
-5. Add an inter-server account for every character server you intend to link to your login server. For example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`)
- VALUES ('inter-server_chaos','password','S','');
-
-Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
-
-- The "sex" field value must equal "S"
-- The "e-mail" field value is unused and therefore should be set to ""
-- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
-
-Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
-
-6. Add accounts or convert existing accounts from a text file database.
-
-To add new accounts, use, for example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`,`level`)
- VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
-
-Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
-
-To convert existing accounts stored in a text file database, use login-converter and char-converter. Parties and guilds cannot be converted.
-
-7. Edit the configuration files in conf/ (except import/, mapflag/, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
-
-8. Compile with "make". Recompile with "make clean && make".
-
-1.3 FreeBSD
------------
-
-1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
-
-- 2.2.5 Installing MySQL on Other Unix-Like Systems
-- 2.4 Post-Installation Setup and Testing
-- 5.4 General Security Issues
-- 5.5 The MySQL Access Privilege System
-- 5.6 MySQL User Account Management
-
-2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
-
-3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
-
-CREATE DATABASE ragnarok;
-GRANT
- SELECT,INSERT,UPDATE,DELETE
- ON `ragnarok`.* # database
- TO 'ragnarok'@'localhost' # username@address
- IDENTIFIED BY 'password'; # password
-
-For security, do not use the password "password" for your user account.
-
-4. Execute the batch queries stored in sql/main.sql. If you want your item and monster databases stored in your MySQL database, execute sql/database.sql too. For example:
-
-mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
-
-5. Add an inter-server account for every character server you intend to link to your login server. For example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`)
- VALUES ('inter-server_chaos','password','S','');
-
-Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
-
-- The "sex" field value must equal "S"
-- The "e-mail" field value is unused and therefore should be set to ""
-- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
-
-Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
-
-6. Add accounts or convert existing accounts from a text file database.
-
-To add new accounts, use, for example:
-
-USE ragnarok
-INSERT INTO `login`
- (`userid`,`user_pass`,`sex`,`email`,`level`)
- VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
-
-Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
-
-To convert existing accounts stored in a text file database, use login-converter and char-converter. Parties and guilds cannot be converted.
-
-7. Edit the configuration files in conf/ (except import/, mapflag/, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
-
-8. Compile with "gmake". Recompile with "gmake clean && gmake".
-
-
-2 Upgrading
-===========
-
-2.1 Upgrading from version 817
-------------------------------
-
-1. Execute the batch queries stored in sql/upgrade_817.sql and sql/upgrade_0.5.2_main.sql.
-
-2. If you want your item and monster databases stored in your MySQL database, execute the batch queries stored in sql/database.sql.
-
-2.2 Upgrading from version 0.5.2
---------------------------------
-
-1. Execute the batch queries stored in sql/upgrade_0.5.2_main.sql.
-
-2. If you created the item_db and mob_db tables, execute the batch queries stored in sql/upgrade_0.5.2_database.sql.
-
-2.3 Upgrading from version 1.0 RC 1
------------------------------------
-
-1. Execute the batch queries stored in sql/upgrade_1.0.0-rc1_main.sql.
-
-
-3 Mail System
-=============
-
-2.1 Adding the mail database
-----------------------------
-1. Execute the batch queries stored in sql/mail.sql
-
-2. Set mail_system option in conf/battle_athena.conf to 1 or yes.
+eAthena SQL Installation and Upgrade Instructions
+
+1 Installation
+ 1.1 Windows
+ 1.2 Linux
+ 1.3 FreeBSD
+2 Upgrading
+ 2.1 Upgrading from version 817
+ 2.2 Upgrading from version 0.5.2
+ 2.3 Upgrading from version 1.0 RC 1
+3 Mail System
+ 3.1 Adding the mail database
+ 3.2 Activating the mail system
+
+1 Installation
+==============
+
+1.1 Windows
+-----------
+
+1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
+
+- 2.2.1 Installing MySQL on Windows
+- 2.4 Post-Installation Setup and Testing
+- 5.4 General Security Issues
+- 5.5 The MySQL Access Privilege System
+- 5.6 MySQL User Account Management
+
+2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
+
+3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
+
+CREATE DATABASE ragnarok;
+GRANT
+ SELECT,INSERT,UPDATE,DELETE
+ ON `ragnarok`.* # database
+ TO 'ragnarok'@'localhost' # username@address
+ IDENTIFIED BY 'password'; # password
+
+For security, do not use the password "password" for your user account.
+
+4. Execute the batch queries stored in sql\main.sql. If you want your item and monster databases stored in your MySQL database, execute sql\database.sql too. For example:
+
+mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
+
+5. Add an inter-server account for every character server you intend to link to your login server. For example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`)
+ VALUES ('inter-server_chaos','password','S','');
+
+Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
+
+- The "sex" field value must equal "S"
+- The "e-mail" field value is unused and therefore should be set to ""
+- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
+
+Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
+
+6. Add accounts or convert existing accounts from a text file database.
+
+To add new accounts, use, for example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`,`level`)
+ VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
+
+Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
+
+To convert existing accounts stored in a text file database, use login-converter.exe and char-converter.exe. Parties and guilds cannot be converted.
+
+7. Edit the configuration files in conf\ (except import\, mapflag\, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
+
+8. Download the latest cygwin1-yyyymmdd.dll.bz2 snapshot, where "yyyymmdd" is the build date, from http://cygwin.com/snapshots/. Extract cygwin1-yyyymmdd.dll from the archive, rename it to cygwin1.dll, and move it to your system or system32 directory -- depending on your version of Windows -- in your system root directory.
+
+9. Optionally compile:
+
+a. Install Cygwin with these packages:
+
+devel/
+ gcc,
+ gcc-g++,
+ gcc-mingw-core,
+ gcc-mingw-g++,
+ make,
+ mingw-runtime,
+ mktemp
+
+b. Using Cygwin, install the MySQL libraries by compiling and installing the MySQL database server source distribution for Linux with "./configure --without-server && make && make install".
+
+c. Using Cygwin, enter "make" in the eAthena SQL directory. Recompile with "make clean && make".
+
+1.2 Linux
+---------
+
+1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
+
+- 2.2.2 Installing MySQL on Linux
+- 2.4 Post-Installation Setup and Testing
+- 5.4 General Security Issues
+- 5.5 The MySQL Access Privilege System
+- 5.6 MySQL User Account Management
+
+2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
+
+3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
+
+CREATE DATABASE ragnarok;
+GRANT
+ SELECT,INSERT,UPDATE,DELETE
+ ON `ragnarok`.* # database
+ TO 'ragnarok'@'localhost' # username@address
+ IDENTIFIED BY 'password'; # password
+
+For security, do not use the password "password" for your user account.
+
+4. Execute the batch queries stored in sql/main.sql. If you want your item and monster databases stored in your MySQL database, execute sql/database.sql too. For example:
+
+mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
+
+5. Add an inter-server account for every character server you intend to link to your login server. For example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`)
+ VALUES ('inter-server_chaos','password','S','');
+
+Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
+
+- The "sex" field value must equal "S"
+- The "e-mail" field value is unused and therefore should be set to ""
+- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
+
+Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
+
+6. Add accounts or convert existing accounts from a text file database.
+
+To add new accounts, use, for example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`,`level`)
+ VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
+
+Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
+
+To convert existing accounts stored in a text file database, use login-converter and char-converter. Parties and guilds cannot be converted.
+
+7. Edit the configuration files in conf/ (except import/, mapflag/, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
+
+8. Compile with "make". Recompile with "make clean && make".
+
+1.3 FreeBSD
+-----------
+
+1. It is not the aim of this document to explain the installation, concepts or usage of MySQL. If you are unfamiliar with MySQL, familiarise yourself with it and read at least these sections of the MySQL reference manual (http://dev.mysql.com/doc/mysql/en/index.html):
+
+- 2.2.5 Installing MySQL on Other Unix-Like Systems
+- 2.4 Post-Installation Setup and Testing
+- 5.4 General Security Issues
+- 5.5 The MySQL Access Privilege System
+- 5.6 MySQL User Account Management
+
+2. If fast and secure access to a MySQL server is unavailable, install, start and configure MySQL database server version 4.0.x. If you are using a version of Windows which is a member of the NT family, we recommend that you install MySQL as a service.
+
+3. Create a new database and a new user account with only SELECT, INSERT, UPDATE and DELETE privileges on the database. For example:
+
+CREATE DATABASE ragnarok;
+GRANT
+ SELECT,INSERT,UPDATE,DELETE
+ ON `ragnarok`.* # database
+ TO 'ragnarok'@'localhost' # username@address
+ IDENTIFIED BY 'password'; # password
+
+For security, do not use the password "password" for your user account.
+
+4. Execute the batch queries stored in sql/main.sql. If you want your item and monster databases stored in your MySQL database, execute sql/database.sql too. For example:
+
+mysql -D ragnarok -h localhost -u root -p < sql/main.sql | more && mysql -D ragnarok -h localhost -u root -p < sql/database.sql | more
+
+5. Add an inter-server account for every character server you intend to link to your login server. For example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`)
+ VALUES ('inter-server_chaos','password','S','');
+
+Every character server linked to your login server requires its own inter-server account; inter-server accounts are used by the servers to communicate with each other. The differences between user and inter-server accounts are:
+
+- The "sex" field value must equal "S"
+- The "e-mail" field value is unused and therefore should be set to ""
+- The "level", "error_message", "connect_until", "memo", "ban_until" and "state" field values are unsued and therefore should be set to 0
+
+Anyone who knows the username and password of an inter-server account can control a character server using that account. Therefore, choose secure passwords for your inter-server accounts.
+
+6. Add accounts or convert existing accounts from a text file database.
+
+To add new accounts, use, for example:
+
+USE ragnarok
+INSERT INTO `login`
+ (`userid`,`user_pass`,`sex`,`email`,`level`)
+ VALUES ('<username>','<password>','<gender>','<e-mail address>',<game master level>);
+
+Where <gender> is either M, F, or S for male, female, and inter-server respectively and <e-mail address> is the e-mail address (for confirmation of character deletion).
+
+To convert existing accounts stored in a text file database, use login-converter and char-converter. Parties and guilds cannot be converted.
+
+7. Edit the configuration files in conf/ (except import/, mapflag/, help.txt, water.txt and water_height.txt) according to your computer configuration, network configuration, MySQL database server configuration and personal preferences.
+
+8. Compile with "gmake". Recompile with "gmake clean && gmake".
+
+
+2 Upgrading
+===========
+
+2.1 Upgrading from version 817
+------------------------------
+
+1. Execute the batch queries stored in sql/upgrade_817.sql and sql/upgrade_0.5.2_main.sql.
+
+2. If you want your item and monster databases stored in your MySQL database, execute the batch queries stored in sql/database.sql.
+
+2.2 Upgrading from version 0.5.2
+--------------------------------
+
+1. Execute the batch queries stored in sql/upgrade_0.5.2_main.sql.
+
+2. If you created the item_db and mob_db tables, execute the batch queries stored in sql/upgrade_0.5.2_database.sql.
+
+2.3 Upgrading from version 1.0 RC 1
+-----------------------------------
+
+1. Execute the batch queries stored in sql/upgrade_1.0.0-rc1_main.sql.
+
+
+3 Mail System
+=============
+
+2.1 Adding the mail database
+----------------------------
+1. Execute the batch queries stored in sql/mail.sql
+
+2. Set mail_system option in conf/battle_athena.conf to 1 or yes.
diff --git a/doc/notes/README.win32.txt b/doc/notes/README.win32.txt
index 16a8c9524..22f3bac3a 100644
--- a/doc/notes/README.win32.txt
+++ b/doc/notes/README.win32.txt
@@ -1,32 +1,32 @@
- Building eAthena under win32
-
-There are currently two ways to build eAthena. The first and oldest way is by using cygwin (www.cygwin.org). This was the only way until the svn 1370 timeframe. The second way is by using Visual Studio .NET 2003.
-
-Building using cygwin:
-
- 1) delete every copy of cygwin1.dll on your system
- 2) Go to www.cygwin.com and run the setup.exe.
- 3) install gcc, make, bash, g++, and gdb. Basically install
- all developer tools if possible. If later you find you are
- missing something, re-run the setup and install that
- 4) make sure the ../bin of wherever you installed cygwin to is in your
- path. ie, if you put cygwin in C:/cygwin then add c:/cygwin/bin
- to your path
- 5) return to this directory and type "make txt"
-
-Building using Visual Studio .NET 2003
-
- 1) Make sure you have the platform SDK installed when you install
- this. If you don't have it, you can go to microsoft and download a
- copy.
- 2) open the eAthena.sln file
- 3) Build the components you wish..
-
- if you wish mysql support (http://dev.mysql.com/), grab a windows
- install of mysql
-
- http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-4.1.10a-win32.zip/from/pick#mirrors
-
- and install it into the default location on the C drive. This will
- best match how I set up the solutions/project files
-
+ Building eAthena under win32
+
+There are currently two ways to build eAthena. The first and oldest way is by using cygwin (www.cygwin.org). This was the only way until the svn 1370 timeframe. The second way is by using Visual Studio .NET 2003.
+
+Building using cygwin:
+
+ 1) delete every copy of cygwin1.dll on your system
+ 2) Go to www.cygwin.com and run the setup.exe.
+ 3) install gcc, make, bash, g++, and gdb. Basically install
+ all developer tools if possible. If later you find you are
+ missing something, re-run the setup and install that
+ 4) make sure the ../bin of wherever you installed cygwin to is in your
+ path. ie, if you put cygwin in C:/cygwin then add c:/cygwin/bin
+ to your path
+ 5) return to this directory and type "make txt"
+
+Building using Visual Studio .NET 2003
+
+ 1) Make sure you have the platform SDK installed when you install
+ this. If you don't have it, you can go to microsoft and download a
+ copy.
+ 2) open the eAthena.sln file
+ 3) Build the components you wish..
+
+ if you wish mysql support (http://dev.mysql.com/), grab a windows
+ install of mysql
+
+ http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-4.1.10a-win32.zip/from/pick#mirrors
+
+ and install it into the default location on the C drive. This will
+ best match how I set up the solutions/project files
+
diff --git a/doc/notes/Readme-jap.txt b/doc/notes/Readme-jap.txt
index daef9665a..f43c0499c 100644
--- a/doc/notes/Readme-jap.txt
+++ b/doc/notes/Readme-jap.txt
@@ -1,21260 +1,21260 @@
---------------------
-//1162 by pizza
-EƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒXEƒ\ƒEƒ‹ƒuƒŒ[ƒJ[E”­™¤Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ɂ‚¢‚Ä–{ŽI€‹’‚ÉC³
-
- (db)
- skill_db.txt
- ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒXEƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚ÌŽË’ö
- ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚ª‰r¥–WŠQ‰Â
- skill_cast_db.txt
- ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚̉r¥ŽžŠÔ
-
- (src/map)
- battle.c
- ”­™¤Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ÌŒvŽZŽ®
- ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚ªƒjƒ…ƒ}‚Å–³Œø‰»
-
---------------------
-//1161 by Nameless
-
-EƒoƒCƒIƒvƒ‰ƒ“ƒg‚É‚æ‚颊Òmob‚ÌID‚ƃXƒLƒ‹‚ð–{ŽI€‹’‚ÉC³
-@¦ŒÄ‚Ño‚¹‚锂ɂ‚¢‚Ä‚Í‚Ü‚¾–¢ŽÀ‘•c
-
- (db)
- mob_avail.txt
- ƒNƒ‰ƒCƒAƒ“ƒg‚É‚æ‚Á‚Ä”­¶‚·‚é‰Â”\«‚Ì‚ ‚éƒOƒ‰–â‘è‚Ì
- Žb’è‘Ήž
- mob_db.txt
- ƒoƒCƒIƒvƒ‰ƒ“ƒg—pmob‚̃Xƒe‚ðˆê•”C³
- mob_skill_db.txt
- ƒoƒCƒIƒvƒ‰ƒ“ƒg—pmob‚ɃXƒLƒ‹‚ðC³
-
- (src/map)
- skill.c - case AM_CANNIBALIZE: C³
-
---------------------
-//1160 by Nameless
-
-E1158‚Ìfix
-@ƒtƒFƒAƒŠ[ƒt‚Ì”ñˆÚ“®‰»‚ƌĂÑo‚³‚ꂽMOB‚ÌHP‚ð‰º•ûC³
-
- (src/map)
- skill.c - case AM_CANNIBALIZE: C³
-
---------------------
-//1158 by ‚à‚Á‚³‚è
-EmobŒã‘ÞŽÀ‘• @Ž©•ª‚ªŒü‚¢‚Ä‚é•û‚Æ‚Í‹t‚Éskilllv‚Ì•ª‚®‚ç‚¢“®‚«‚Ü‚·
- —£‚ê‚·‚¬‚éŒÄ‚Ñ–ß‚³‚ê‚È‚¢‚Ì‚ÅŽæ‚芪‚«ŒÄ‚Ñ–ß‚µ‚ðC³
- IW‚̎΂߈ʒu‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³iƒoƒO•ñƒXƒŒƒbƒh part8 >>110)
-
- (src/map)
- skill.c ŒÄ‚Ñ–ß‚µC³AŒã‘ޒljÁAIWC³
- skill.h
- mob.c
- map.h
- (db)
- skill_db.txt
---------------------
-//1158 by Nameless
-
-EƒAƒ‹ƒPƒ~‚̃oƒCƒIƒvƒ‰ƒ“ƒg‚ðC³
-@ŠeLV‚É‚ ‚킹‚ÄAƒ}ƒ“ƒhƒ‰ƒSƒ‰Aƒqƒhƒ‰Aƒtƒ[ƒ‰AƒtƒFƒAƒŠ[ƒtAƒWƒIƒOƒ‰ƒtƒ@[
-@‚ðŒÄ‚Ño‚·‚悤‚É‚µ‚½
-
- (src/map)
- skill.c - case AM_CANNIBALIZE: C³
-
---------------------
-//1157 by eigen
-
-Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹‚ÌŽg—p‚ÅMAPŽI‚ª—Ž‚¿‚é•s‹ï‡‚ðC³
-
- (src/map)
- skill.c - skill_unit_onout() C³
-
---------------------
-//1156 by eigen
-
-E¹‘Ì~•ŸŽg—pŽžAƒ‚ƒ“ƒN‚ªl”ƒJƒEƒ“ƒg‚³‚ê‚Ä‚¢‚È‚©‚Á‚½•s‹ï‡‚ðC³
-ithanks to –{ŽI‘ŠˆáƒXƒŒpart3 >>121Žj
-Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹‚ÌŒø‰Ê‚ªØ‚ê‚È‚©‚Á‚½•s‹ï‡‚ðC³
-
- (src/map)
- skill.c - skill_unit_onout(), skill_check_condition_char_sub() C³
-
---------------------
-//1155 by latte
-EƒfƒBƒ{[ƒVƒ‡ƒ“‚ɉr¥ŽžŠÔ•t—^
-EƒTƒNƒŠƒtƒ@ƒCƒXF”{—¦C³‚ƃ{ƒX‚É—LŒø‚ÉB
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚̃GƒtƒFƒNƒg‚ÌC³
-
- (db)
- skill_cast_db.txt
- skill_db.txt
- (src/map)
- battle.c
-
---------------------
-//1154 by eigen
-
-Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹Žg—p‚ÅMAPŽI‚ª—Ž‚¿‚é–â‘è‚ðC³
-EƒSƒXƒyƒ‹‚ÌŽÀ‘•
-Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÌŽd—l‚ð–{ŽI‚ɇ‚킹‚Ä•ÏX(‰Î‘®«’ljÁƒ_ƒ[ƒW‚Í–¢ŽÀ‘•‚Å‚·)
-
- (db)
- skill_cast_db.txt - ƒSƒXƒyƒ‹, ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÉŠÖ‚·‚éC³
- skill_require_db.txt - ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÉŠÖ‚·‚éC³
- skill_unit_db.txt - ƒSƒXƒyƒ‹‚ÉŠÖ‚·‚éC³
- (src/map)
- battle.c - battle_calc_pet_weapon_attack(), battle_calc_mob_weapon_attack(),
- battle_calc_pc_weapon_attack(), battle_calc_magic_attack() C³
- clif.c - clif_parse_UseSkillToId(), clif_parse_UseSkillToId(),
- clif_parse_WalkToXY(), clif_parse_ActionRequest(),
- clif_parse_UseSkillToId(), clif_parse_UseSkillMap() C³
- map.h - MAX_STATUSCHANGE‚Ì‘‰Á
- pc.c - pc_natural_heal_sub() C³
- skill.h - ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN, ƒSƒXƒyƒ‹‚ÉŠÖ‚·‚éó‘ÔˆÙíƒe[ƒuƒ‹’ljÁ
- skill.c - skill_castend_damage_id(), skill_castend_nodamage_id(),
- skill_unit_onout(), skill_unit_onplace_timer(),
- skill_init_unit_layout() C³
- status.c - status_change_start(), status_change_end() C³
-
---------------------
-//1153 by ‚Û‚¦
-
-Eƒq[ƒ‹AƒTƒ“ƒN‚ÌC³
-@(ƒCƒrƒ‹ƒhƒ‹ƒCƒhC‘•”õ’†‚ÉPv,GvˆÈŠO‚¾‚ƃ_ƒ[ƒW‚ªo‚È‚¢‚悤‚ÉC³)
-@(ŠY“–PC‚Ƀq[ƒ‹‚ðŽg—p‚µ‚½ê‡SP‚¾‚¯Á”ï)
-E•ú’u‚³‚ê‚Ä‚éversion.h‚ÌXV
- (src/map)
- skill.c - skill_castend_id(),skill_unit_onplace_timer() C³
- (src/common)
- version.h - mod version 1153
---------------------
-//1152 by p
-
-EzΔ­Œ©C³
- (db)
- item_db.txt - ŒÃ‚¢Šª•¨‚Ì getitem ”Ô†‚ð–ß‚µ
- (src/map)
- itemdb.c - zΔ­Œ©Žž¶¬ˆ—‚Ì•ÏX
- mob.c - zΔ­Œ©ˆ—‚Ì•ÏX
---------------------
-//1151 by p
-
-Eƒuƒ‰ƒbƒNƒXƒ~ƒXƒXƒLƒ‹zΔ­Œ©‚ÌŽÀ‘•(‰¼)
- (conf)
- battle_athena.conf - zΔ­Œ©—¦‚ÌŽw’è
- (db)
- item_findingore.txt - z΃hƒƒbƒv—¦‚ÌŽw’è
- item_db.txt - ŒÃ‚¢Šª•¨‚Ì getitem ”Ô†•ÏX
- (src/map)
- itemdb.c - db/item_findingore.txt ‚Ì“Ç‚Ýž‚Ý‚Æ”­Œ©Žž¶¬
- battle.h - Ý’è•ÛŽ—p‚Ì€–ڒljÁ
- battle.c - Ý’è“Ç‚Ýž‚݈—’ljÁ
- mob.c - zΔ­Œ©ˆ—’ljÁ
-
---------------------
-//1150 by Theia
-
-Eƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ðjROŽd—l‚É•ÏX
-@(Š®‘S‚Å‚Í‚È‚¢‚̂ŕ⊮Šó–])
-EƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŒvŽZŽ®‚ð•ÏX
-@(¡‚Ü‚Å‚ÌŒvŽZŽ®‚¾‚Æ•K’†‚µ‚Ä‚¢‚½)
- (db)
- skill_cast.txt
- skill_require_db.txt
- (src/map)
- skill.c - ƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Ì”­“®ðŒ‚ð•ÏX
- battle.c - ƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[,ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚Ì”{—¦‚ð•ÏX
-
---------------------
-//1149 by eigen
-
-Eˆê•”‚̃_ƒ“ƒT[ƒo[ƒhƒXƒLƒ‹‚̉‰‘tƒXƒLƒ‹ã‚©‚ço‚é‚ÆMAPŽI‚ª—Ž‚¿‚é•s‹ï‡‚ðC³
-
- (src/map)
- skill.c - skill_unit_onout() C³
-
---------------------
-//1148 by eigen
-
-EƒXƒgƒŠƒbƒvƒXƒLƒ‹‚ª‰r¥’†’f‚³‚ê‚È‚¢‚悤•ÏX
-EƒXƒgƒŠƒbƒvƒXƒLƒ‹¬Œ÷—¦‚̃XƒLƒ‹ƒŒƒxƒ‹”äd‚ð5‚É•ÏX
-EƒoƒbƒNƒXƒ^ƒu‚ÌŽË’ö‚ð•Ší‚ÉŠÖŒW‚È‚­1‚É•ÏX
-EƒoƒbƒNƒXƒ^ƒuŽg—pŽžA‹|‚ð‘•”õ‚µ‚Ä‚¢‚é‚È‚çƒ_ƒ[ƒW”¼Œ¸‚É•ÏX
-EƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚ª‰r¥’†’f‚³‚ê‚é‚悤•ÏX
-EƒAƒVƒbƒhƒeƒ‰[Žg—pŒãA‘ŠŽè‚ÌŠZ‚ð”j‰ó‚·‚邱‚ƂɬŒ÷‚µ‚½ê‡ƒVƒ‡ƒbƒNƒGƒ‚‚ðo‚·‚悤•ÏX
-Eƒƒ‹ƒgƒ_ƒEƒ“‚Å”j‰ó‚Å‚«‚é‰ÓŠ‚ð•Ší‚ÆŠZ‚Ì‚Ý‚É•ÏX
-Eƒ_ƒ“ƒT[ƒo[ƒh‚̉‰‘tƒXƒLƒ‹”͈͊O‚Éo‚Ä‚àŒø‰Ê‚ª20•bŽ‘±‚·‚é‚悤•ÏX
-i‚½‚¾‚µŽ„‚ð–Y‚ê‚È‚¢‚łƇ‘tƒXƒLƒ‹‚Íœ‚­j
-E‘qŒÉ‚ÌÅ‘åŽû—e—Ê‚ð300‚É•ÏX
-iˆÈãthanks to –{ŽI‘ŠˆáƒXƒŒPart3 >>115Žj
-Eƒƒ‹ƒgƒ_ƒEƒ“ŠZ”j‰óŠm—¦‚ð0.7`7%‚É•ÏX
-
- (db)
- skill_db.txt - cast_cancelArange‚ÌC³
- skill_unit_db.txt - (1148-fix‚ÌŽæ‚èž‚Ý)
- (src/common)
- mmo.h - MAX_STORAGE‚ð300‚É
- (src/map)
- battle.c - battle_calc_pc_weapon_attack() C³
- skill.c - skill_additional_effect(), skill_castend_nodamage_id(),
- skill_castend_damage_id(), skill_unit_onout() C³
-
---------------------
-//1147 by eigen
-
-EƒCƒ“ƒfƒ…ƒAŽg—pŒãA10•bŒo‚½‚È‚¢‚ÆÄŽg—p‚Å‚«‚È‚¢‚悤•ÏX
-EƒV[ƒYƒ‚[ƒh‚ł̓Cƒ“ƒfƒ…ƒA‚ðŽg—p‚·‚é‚ÆMDEF‚ªã‚ª‚邾‚¯‚É•ÏX
-EŽc‰eŽg—pŒãA2•bŒo‚½‚È‚¢‚ƈ¢C—…‚ðŽg—p‚Å‚«‚È‚¢‚悤•ÏX
-
- (src/map)
- map.h - #define MAX_SKILL_ID, unsigned int skillstatictimer[MAX_SKILL_ID] ’ljÁ
- clif.c - clif_parse_UseSkillToId(), clif_damage() C³
- skill.c - skill_castend_nodamage_id(), skill_castend_pos2(), skill_use_id() C³
- pc.c - pc_setnewpc(), pc_authok() C³
- status.c - status_get_dmotion() C³
- battle.c - battle_calc_damage() C³
-
---------------------
-//1146 by eigen
-
-EƒCƒ“ƒfƒ…ƒAŽg—pŽžLv‚ɉž‚¶‚ÄMDEF‚ªã‚ª‚é‚悤‚É•ÏX
-EƒCƒ“ƒfƒ…ƒAŽg—p’†7‰ñƒ_ƒ[ƒW‚ðŽó‚¯‚é‚Ɖ𜂷‚é‚悤•ÏX
-EΓŠ‚°‚̌Œèƒ_ƒ[ƒW‚ð50‚É•ÏX
-
- (src/map)
- battle.c - battle_calc_damage(), battle_calc_misc_attack() C³
- status.c - status_calc_pc(), status_change_start(), status_change_end() C³
-
---------------------
-//1145 by End_of_exam
-
-Estart ‚̃`ƒFƒbƒNŠÔŠu‚ª’Z‚·‚¬‚½‚Ì‚ðC³(start)
-Eskill_unit_effect() ‚©‚ç–³ŒÀƒ‹[ƒv‚É“Ë“ü‚µ‚ÄAƒXƒ^ƒbƒNƒI[ƒo[ƒtƒ[‚Å—Ž‚¿‚é
-@‰Â”\«‚ª‚ ‚éƒoƒO‚ðC³(skill.c)
-Eƒyƒbƒg‚Ì“Ç‚Ýž‚Ý‚ÉŽ¸”s‚µ‚½Žž‚É—Ž‚¿‚éƒoƒO‚ðC³(pet.c)
-E‚QdƒƒOƒCƒ“‚ÌØ’fˆ—‚ªˆá‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
-
-E1142‚̃}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÌC³‚ðŒ³‚É–ß‚·(skill.c)
-EƒƒfƒBƒ^ƒeƒBƒI‚ÌSP‰ñ•œ—ÊC³‚ÌŽæ‚èž‚Ý(skill.c thanks to ‚È‚È‚µ‚³‚ñ)
-
- (/)
- start - ƒ`ƒFƒbƒNŠÔŠu‚ðC³
-
- (src/map)
- map.c - map_quit() C³
- pet.c - pet_recv_petdata() C³
- skill.c - skill_unit_onplace_timer() , skill_unit_effect() C³
- status.c - status_calc_pc() C³
-
---------------------
-//1144 by ¹
-
-EVC‚ŃRƒ“ƒpƒCƒ‹‚µ‚½‚Æ‚«Œx‚ªo‚é‚Ì‚ðC³B
-EŠÈˆÕƒAƒCƒeƒ€Eƒ‚ƒ“ƒXƒ^[¢ŠÒƒRƒ}ƒ“ƒh@im‚ð’ljÁB
-E@im’ljÁ‚É”º‚¢AEGIS‚ÅŽg‚í‚ê‚Ä‚¢‚é/item,/monster‚ðŽÀ‘•B
-@(AEGIS‚ÌŽd—l‚É‘¥‚è‘•”õ‚Í1ŒÂ’PˆÊE–¢ŠÓ’è‚Å
-@‚Ù‚©‚̃AƒCƒeƒ€‚Í30ŒÂ’PˆÊEŠÓ’èÏ‚Ý‚Åo‚Ü‚·B)
-E@monster‚ð¢ŠÒ•C”“ü—Í‚È‚µ‚Å¢ŠÒ‚Å‚«‚é‚悤‚É‚µ‚½B
-EƒRƒ}ƒ“ƒh“ü—Í‚ÌÛ‚Æ‚ ‚éðŒ‚ð–ž‚½‚·‚Æ
-@ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ª”­¶‚·‚éƒoƒO‚ðC³B
- (src/map)
- atcommand.h C³B
- atcommand.c
- atcommand_monster() C³B
- atcommand_itemmonster() ’ljÁB
- clif.c
- clif_parse_GMkillall() C³B
- clif_parse_GMsummon() C³B
- clif_parse_GMitemmonster() ’ljÁB
- status.c
- status_change_start() C³B
- (db)
- packet_db.txt C³B
- (conf)
- msg_athena.conf C³B
- atcommand_athena.conf C³B
-
---------------------
-//1143 by End_of_exam
-
-Emap_quit(), pc_setpos() ‚ðFX®—(map.c pc.c)
-Eƒ‚ƒ“ƒXƒ^[‚ªƒoƒVƒŠƒJ‚ðŽg‚¤‚Æ—Ž‚¿‚éƒoƒO‚ðC³(skill.c)
-Eƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɃƒL‚Ì‹©‚Ñ‚ªŒø‚¢‚Ä‚¢‚½‚Ì‚ðC³(mob.c)
-Eƒ_ƒ“ƒX“r’†‚ɃT[ƒo[“à‚̕ʂ̃}ƒbƒv‚Ɉړ®‚µ‚½ê‡AƒXƒLƒ‹ƒ†ƒjƒbƒg‚ªÁ‚¦‚È‚¢
-@i“]‘—‘O‚̃}ƒbƒv‚ÉŽc‚Á‚Ä‚¢‚éjƒoƒO‚ðC³B(pc.c)
-E1134‚ŃT[ƒo[ŠÔ‚̃[ƒvƒ|[ƒ^ƒ‹‚ðŽg‚Á‚½Žž‚ÉAƒXƒLƒ‹Žg—pŽÒ‚ªæ‚Á‚½‚çƒT[ƒo[‚ª
-@—Ž‚¿‚éƒoƒO‚ðC³(skill.c)
-E1134‚ŃnƒG‚̉H‚ðŽg‚Á‚ăT[ƒo[ŠÔ‚ðˆÚ“®‚µ‚½ê‡AƒAƒCƒeƒ€‚ªŒ¸‚ç‚È‚¢ƒoƒO‚ðC³(pc.c)
-
- (src/map)
- map.c - map_quit() C³
- mob.c - mobskill_castend_id() , mobskill_castend_pos(),
- mobskill_use_id(), mobskill_use_pos() C³
- pc.c - pc_useitem(), pc_setpos() C³Apc_remove_map() ’ljÁ
- pc.h - pc_remove_map() ’ljÁ
- skill.c - skill_castend_nodamege_id(), skill_unit_onplace() C³
-
---------------------
-//1142 by ‚Âñ
-Eƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÅŽí‘°‚ɃAƒ“ƒfƒbƒg‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚É“–‚½‚ç‚È‚©‚Á‚½‚Ì‚ðC³
- (src/map)
- skill.c - && race!=1‚ð’ljÁ
-
---------------------
-//1141.1 by BDPQ‹â [ 2005/02/21 ]
-E1141‚Ì“Y•t–Y‚ê‚̒ljÁ‚Å‚·B\‚µ–ó‚ ‚è‚Ü‚¹‚ñ‚Å‚µ‚½B
-EGMƒRƒ}ƒ“ƒh‚ðs‚Á‚½Žž‚̃ƒbƒZ[ƒW‚ð’ljÁ‚µ‚Ü‚µ‚½B
-
- (conf)
- msg_athena.conf - 113`117 ’ljÁ (@reload` ‚ðs‚Á‚½Žž‚̃ƒbƒZ[ƒW‚ð’ljÁ)
-
---------------------
-//1141 by BDPQ‹â [ 2005/02/20 ]
-EGMƒRƒ}ƒ“ƒh‚ð’ljÁ
- @reloadatcommand - atcommand_athena.conf ‚ðÄ“Çž‚·‚é
- @reloadbattleconf - battle_athena.conf ‚ðÄ“Çž‚·‚é
- @reloadgmaccount - gm_account_filename (ƒfƒtƒHƒ‹ƒg GM_account.txt ) ‚ðÄ“Çž‚·‚é
- @reloadstatusdb - job_db1.txt / job_db2.txt / job_db2-2.txt / refine_db.txt / size_fix.txt ‚ðÄ“Çž‚·‚é
- @reloadpcdb - exp.txt / skill_tree.txt / attr_fix.txt ‚ðÄ“Çž‚·‚é
-EGMƒRƒ}ƒ“ƒhu@reloadmobdbv‚Ńyƒbƒg‚̃f[ƒ^ƒx[ƒX‚àÄ“Çž‚·‚é‚悤‚É•ÏX
- * @reload` ‚ɂ̓Nƒ‰ƒCƒAƒ“ƒg‚̃ŠƒƒO‚ª•K—v‚Èꇂà—L‚è‚Ü‚·B
-EGMƒRƒ}ƒ“ƒhu@who+v‚ŃŒƒxƒ‹‚à•\Ž¦‚·‚é‚悤‚É•ÏX
-Eƒq[ƒ‹‚ð‰½ƒŒƒxƒ‹ˆÈã‚Å9999ŒÅ’è‚É‚·‚é‚©‚̃IƒvƒVƒ‡ƒ“(heal_counterstop)’ljÁ
-
- (conf)
- atcommand_athena.conf - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb ’ljÁ (ƒfƒtƒHƒ‹ƒg99)
- battle_athena.conf - heal_counterstop ’ljÁ (ƒfƒtƒHƒ‹ƒg11)
- help.txt - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb who+ ‚Ìà–¾‚ð’ljÁ
-
- (doc)
- conf_ref.txt - 5. conf/battle_athena.conf •ÒW (heal_counterstop ‚Ìà–¾‚ƃTƒ“ƒvƒ‹‚ð’ljÁ)
- - 6. atcommand_athena.conf •ÒW (à–¾‚ƃTƒ“ƒvƒ‹‚ÉÄ“ÇžŠÖ˜A‚ð’ljÁ)
-
- (src/map)
- atcommand.c - AtCommandInfo atcommand_info •ÒW (\‘¢‘Ì’è‹`)
- - atcommand_whop() •ÒW (ƒvƒŒƒCƒ„[‚̃Œƒxƒ‹‚à•\Ž¦‚·‚é‚悤•ÏX)
- - atcommand_reloadatcommand() ’ljÁ (atcommand_athena.conf Ä“Çž)
- - atcommand_reloadbattleconf() ’ljÁ (battle_athena.conf Ä“Çž)
- - atcommand_reloadgmaccount() ’ljÁ (gm_account_filename Ä“Çž)
- - atcommand_reloadstatusdb() ’ljÁ (ƒXƒe[ƒ^ƒXŠÖ˜ADB Ä“Çž)
- - atcommand_reloadpcdb() ’ljÁ (ƒvƒŒƒCƒ„[ŠÖ˜ADB Ä“Çž)
- - atcommand_reloadmobdb() •ÒW (ƒyƒbƒg‚̃f[ƒ^ƒx[ƒX‚à“Çž‚ނ悤•ÏX)
- atcommand.h - AtCommandType •ÒW (\‘¢‘Ì’è‹`)
-
- battle.c - battle_config_read() •ÒW (heal_counterstop ‚̒ljÁ)
- battle.h - Battle_Config •ÒW (heal_counterstop ‚̒ljÁ)
-
- skill.c - skill_castend_nodamage_id() •ÒW (9999ƒq[ƒ‹•”‚ð battle_athena.conf ‚ðŽQÆ‚·‚é‚悤•ÏX)
-
- pet.h - int read_petdb(); ’ljÁ (ƒyƒbƒgŠÖ˜ADB Ä“Çž—p)
-
- pc.h - int pc_readdb(void); ’ljÁ (ƒvƒŒƒCƒ„[ŠÖ˜ADB Ä“Çž—p)
-
- status.h - int status_readdb(void); ’ljÁ (ƒXƒe[ƒ^ƒXŠÖ˜ADB Ä“Çž—p)
-
---------------------
-//1140 by eigen
-Eˆê•”‚̊‹«‚Åathena-start‚Æstart‚ª³í‚É“®ì‚µ‚Ä‚¢‚È‚©‚Á‚½ƒoƒO‚ðC³
-
- athena-start - ‰üsƒR[ƒh‚ð0A‚É“ˆê
- start - ‰üsƒR[ƒh‚ð0A‚É“ˆê
-
---------------------
-//1139 by ‚à‚Á‚³‚è
-ENPCŽæ‚芪‚«ŒÄ‚Ñ–ß‚µƒXƒLƒ‹ŽÀ‘•
-EƒRƒƒ“ƒg‚³‚ê‚Ä‚é9999ƒq[ƒ‹(skilllv>10‚ÌŽž)AL”͈̓ƒeƒI(skilllv>10‚ÌŽž)AL”͈̓nƒ“ƒ}[ƒtƒH[ƒ‹(skilllv>5‚ÌŽž)‚̃Rƒƒ“ƒgŽæ‚èŠO‚µB
-EL”͈Ílov‚Ì•t‚¯‰Á‚¦(skilllv>10‚ÌŽž)
-—á
-1312,Žæ‚芪‚«ŒÄ‚Ñ–ß‚µ—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,354,1,3000,0,0,no,self,always,0,,,,,,10
-1063,9999ƒq[ƒ‹—ƒ‹ƒiƒeƒBƒbƒN,idle,28,11,10,2000,60000,yes,self,always,0,,,,,,@
-
- (src/map)
- skill.c npc_recallƒXƒLƒ‹’ljÁ,ã‹L‚̃Rƒƒ“ƒgŽæ‚èŠO‚µ
- skill.h NPC_RECALL = 354‚ð’ljÁ
- mob.c ƒXƒLƒ‹’ljÁ‚Ì‚½‚ß‚ÉuŽæ‚芪‚«ƒ‚ƒ“ƒXƒ^[‚̈—v•”•ª‚É•t‚¯‰Á‚¦
- mob.h int mob_countslave(struct mob_data *md);‚ð’ljÁ
- map.h struct mob_data‚Érecall_flag‚Ærecallmob_countƒƒ“ƒo[’ljÁ
- (db)
- skill_db.txt ƒXƒLƒ‹’ljÁ
-
---------------------
-//1138 by End_of_exam
-
-E1132‚Ìsocket.c‚É•´‚êž‚ñ‚Å‚¢‚½‚©‚È‚è[‚ȃoƒOi‘—Mƒf[ƒ^‚ªƒ‰ƒ“ƒ_ƒ€‚É
-@‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚éƒoƒOj‚ðC³(socket.c)
-E1134‚Å‘g‚Ýž‚ñ‚¾ƒAƒCƒeƒ€dupe‘Îô‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(pc.c party.c guild.c)
-
- (src/common/)
- socket.c - send_from_fifo() C³
-
- (src/map)
- pc.c - pc_setpos() C³
- party.c - FXC³
- guild.c - FXC³
-
---------------------
-//1137 by ‚¢‚Ç
-
-EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
-
---------------------
-//1136 by by eigen
-
-E1135‚ÅÁ‚¦‚Ä‚¢‚½battle_athena.conf‚Ì€–ڂƃfƒtƒHƒ‹ƒg’l‚𕜊ˆ
-Econf_ref.txt‚Énext_exp_limit‚Ìà–¾‚ð’ljÁ
-
- (conf)
- battle_athena.conf - Á‚¦‚½€–ڂƃfƒtƒHƒ‹ƒg’l‚𕜊ˆ
- (doc)
- conf_ref.txt - next_exp_limit‚Ìà–¾‚ð’ljÁ
-
---------------------
-//1135 by by Toshi^2
-Eƒpƒbƒ`1125‚ÅC³‚³‚ꂽAŒoŒ±’l‚ÌãŒÀÝ’è‚ð]—ˆ•ûŽ®‚̧ŒÀ–³‚µ‚à‘I‚ׂé‚悤‚É•ÏX
-
- (db)
- battle_athena.conf - next_exp_limit‚ð’ljÁB
- (src/map)
- battle.c - battle_config_read() C³
- battle.h - struct Battle_Config{}‚É int next_exp_limit; ‚ð’ljÁB
- pc.c - pc_gainexp() C³
-
---------------------
-//1134 by End_of_exam
-
-E1132‚Å#undef close‚ð–Y‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(socket.c)
-E1133‚̃AƒCƒeƒ€dupe‘Îô‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(map.c)
-Eathena-start stop , kill ‚̇”Ô‚ðmap -> char -> login ‚É•ÏX
-@@@@(athena-start thanks to eigen‚³‚ñ)
-
- (/)
- athena-start - athena-start stop , kill ‚̇”ÔC³
-
- (src/common)
- socket.c - #undef close ’ljÁ
-
- (src/map)
- map.c - map_quit() C³
-
---------------------
-//1133 by End_of_exam
-
-Emapflag nosave ‚ªŽw’肳‚ꂽƒ}ƒbƒv‚ÅŽ€‚ñ‚ŃŠƒXƒ^[ƒg‚·‚鎞‚ÉAƒZ[ƒuƒ|ƒCƒ“ƒg‚ª
-@•Êƒ}ƒbƒvƒT[ƒo[‚É‚ ‚é‚ÆA(nul,0,0)‚É”ò‚΂³‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(pc.c)
-Eƒ}ƒbƒvƒT[ƒo[‚𕪔z‚µ‚Ä‚¢‚鎞‚ÉA×H‚ð‚µ‚½“ÁŽê‚ȃc[ƒ‹‚ðŽg‚¤‚±‚Æ‚É‚æ‚Á‚ÄA
-@ƒAƒCƒeƒ€‚ªdupe‚Å‚«‚½ƒoƒO‚ðC³B(pc.c)
-Ebuildin_menu, buildin_select() ‚ªƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ð‹N‚±‚µ‚Ä‚¢‚½
-@ƒoƒO‚ðC³(script.c)
-
- (src/map)
- pc.c - pc_makesavestatus(), pc_setpos(), pc_autosave_sub() C³
- script.c - buildin_menu(), buildin_select() C³
-
---------------------
-//1132 by End_of_exam
-E@users ƒRƒ}ƒ“ƒh(ƒT[ƒo[“à‚Ìl”ƒ}ƒbƒv‚ð•\Ž¦)‚ð’ljÁ(atcommand.c / h)
-Eguild_check_alliance() ‚ðŒÄ‚Ño‚·‚Æ‚«‚̃`ƒFƒbƒN‚ð’ljÁ(mob.c battle.c)
-Eƒ}ƒbƒvƒT[ƒo[•ª”zŽž‚ɃMƒ‹ƒh‚̃ƒ“ƒo[‚ª”²‚¯‚½ŽžA‚»‚̃Mƒ‹ƒhƒƒ“ƒo[‚ª
-@ˆêl‚àƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢ƒ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚Ä‚¢‚½‚Ì‚ðC³(guild.c)
-E1130‚ÅŒ©Ø‚è‚̉ñ”ð—¦ã¸‚ªÁ‚¦‚Ä‚¢‚½‚Ì‚ð–ß‚·(status.c)
-Epid ‘Ήž”Å‚Ìstart, athena-start ‚ð“‡(start , athena_start)
-E“c‘ã–C‘ÎôAShinomori‚³‚ñ‚Ì do_sendrecv() ‚‘¬‰»‚ð‘g‚Ýž‚Þ
-@(socket.c socket.conf Makefile)
-Esocket ‚Ì‚‘¬‰»
-@@1. FIFOFLUSH ‚ªŽÀs‚³‚ê‚é•p“x‚ð‰º‚°‚é(socket.c char.c)
-@@2. •s³‚Èfd‚ð0 ‚É•ÏX(socket.c socket.h chrif.c char.c)
-
- (/)
- start - pid ƒtƒ@ƒCƒ‹‚ɑΉž‚·‚é‚悤‚ÉC³
- sthena-start - pid ƒtƒ@ƒCƒ‹‚ɑΉž‚·‚é‚悤‚ÉC³
- Makefile - "-D_XOPEN_SOURCE -D_BSD_SOURCE" ’ljÁ
-
- (conf/)
- help.txt - @users ’ljÁA@mes ‚ÌC³
- socket.conf - ƒAƒNƒZƒX§ŒÀ‚ÌÝ’èƒtƒ@ƒCƒ‹
-
- (src/common/)
- socket.c - ƒAƒNƒZƒX§ŒÀ‚̒ljÁAFX‚‘¬‰»
- socket.h - FIFO–½—ß‚Ì‚‘¬‰»
-
- (src/char/)
- char.c - parse_tologin(), parse_char() XV
-
- (src/map/)
- atcommand.c - @users ’ljÁ
- atcommand.h - @users ’ljÁ
- battle.c - battle_calc_damage() C³
- chrif.c - •s³‚Èfd‚ð0 ‚É•ÏX‚µ‚½‚Ì‚É”º‚¤C³
- guild.c - guild_member_leaved() C³
- mob.c - mob_gvmobcheck() C³
- status.c - status_calc_pc() C³
-
---------------------
-//1131 by eigen
-EƒMƒ‹ƒhŠg’£‚Ìl”‘•ª‚ð+2/Lv‚©‚ç+4/Lv‚É•ÏX
-EƒƒeƒIƒXƒg[ƒ€‚ɃXƒ^ƒ“‚ª‚©‚©‚é‚悤C³
-Eƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ɈÈłª‚©‚©‚é‚悤C³
-Eƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO‚ðŽæ‚Á‚Ä‚¢‚ê‚ÎSTR+1 ATK+4‚ª•t‚­‚悤•ÏX
-Eƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO‚ðŽæ‚Á‚Ä‚¢‚ê‚ÎAREOTEWP‚ª‚ÌŒø‰ÊŽžŠÔ‚ª10%’·‚­‚È‚é‚悤•ÏX
-EAREOT‚̃p[ƒeƒB[ƒƒ“ƒo[Œø‰ÊŽžŠÔŒ¸­‚ð“P”p
-EƒtƒƒXƒgƒ_ƒCƒo[‚Å“€Œ‹‚·‚éÛA“€Œ‹ŽžŠÔ‚ªMDEF‚ɉe‹¿‚³‚ê‚é‚悤•ÏX
-Eskill_db.txtAskill_require_db.txtAskill_cast_db.txt‚ðOWN‚âŠeEWiki‚È‚Ç‚ðŽQl‚ÉC³
-
- (src/map)
- skill.c
- status.c
- (db)
- skill_db.txt
- skill_cast_db.txt
- skill_require_db.txt
-
---------------------
-//1130 by eigen
-EŠŽŒÀŠE—Ê‘‰Á‚Ì+100/Lv‚ð+200/Lv‚ÉC³
-EƒV[ƒt‚ÌãˆÊE‚ɉ—‚¢‚ĉñ”𗦑‰Á‚ÌFlee㸗¦+3/Lv‚ð+4/Lv‚ÉC³
-EƒAƒTƒVƒ“Œn‚ª‰ñ”𗦑‰Á‚ðŽæ“¾‚µ‚Ä‚¢‚éê‡AˆÚ“®‘¬“x‚ª+0.5%/Lv‚É‚È‚é‚悤C³
-EƒvƒŒƒbƒVƒƒ[‚ÌSPUŒ‚‚ðŽÀ‘•
-EƒvƒŠƒU[ƒuAƒtƒ‹ƒXƒgƒŠƒbƒvA•Ší¸˜BAƒXƒŠƒ€ƒsƒbƒ`ƒƒ[Aƒtƒ‹ƒPƒ~ƒJƒ‹ƒ`ƒƒ[ƒW
-‚ðdb‚ɒljÁ
-
- (src/map)
- skill.c - skill_additional_effect() C³
- status.c - status_calc_pc() C³
- (db)
- skill_db.txt
- skill_cast_db.txt
- skill_require_db.txt
- skill_tree.txt
-
---------------------
-//1129 by En_of_exam
-
-ENPC ƒCƒxƒ“ƒg‚ªd•¡‚µ‚½ê‡‚̃ƒ‚ƒŠ‰ð•úŽè‡‚ªˆá‚Á‚Ä‚¢‚½ƒoƒO‚ðC³
-@@(npc.c thanks to TOSHI^2‚³‚ñ)
-
- (src/map)
- npc.c - npc_parse_script() C³
-
---------------------
-//1128 by ”Y‚ß‚él
-EƒAƒCƒeƒ€‚ðÁ”‚¸‚ÉŽg—p‚·‚é‚©‚̃IƒvƒVƒ‡ƒ“’ljÁ
-EƒJ[ƒhA‘•”õ•iAƒGƒ‹EƒIƒŠ‚̃hƒƒbƒv—¦‚ð•Ê‚ÉÝ’èo—ˆ‚é‚悤‚ɃIƒvƒVƒ‡ƒ“’ljÁ
-Ebattle_athena.conf‚̉ŠúÝ’è‚Å–îE¹…“™‚ð쬎ž‚É–¼‘O‚ð•t‚¯‚È‚¢‚悤‚É•ÏX
-@i–{ŽI‚Å‚Í‚Ü‚¾—ˆ‚Ä‚È‚¢‚ÆŽv‚Á‚½‚̂ʼnŠúÝ’è‚ð•Ï‚¦‚Ü‚µ‚½j
- (src/map)
- battle.c
- mob.c
- pc.c
- battle.h
- (conf)
- battle_athena.conf
-
---------------------
-//1127 by End_of_exam
-
-Egetarraysize() ‚ª³‚µ‚¢’l‚ð•Ô‚³‚È‚¢ƒoƒO‚ðC³(script.c)
-@‚±‚̃oƒO‚̉e‹¿‚ÅAdeletearray() –½—ß‚Ì“®ì‚ª³í‚È‚à‚̂ƈقȂÁ‚Ä‚¢‚Ü‚µ‚½B
-
-Ebuildin_deletearray() ‚ÌÅ“K‰»(script.c)
-EƒVƒOƒiƒ‹ˆ—’†‚ÉÄ“xƒVƒOƒiƒ‹‚ªŒÄ‚΂ê‚é‰Â”\«‚ɑΈ‚·‚é(core.c)
-EˆÏ‘õ”Ì”„‚ð’ljÁ‚µ‚Ä‚Ý‚é(npc_test_seller.txt)
-
- (src/map)
- script.c - getarraysize() , buildin_deletearray() C³
-
- (src/common)
- core.c - sig_proc() C³
-
- (script/sample)
- npc_test_seller.txt - ˆÏ‘õ”Ì”„NPC
-
---------------------
-//1126 by eigen
-Eƒƒ‚ƒ‰ƒCƒY‚ÌŒø‰Ê‰ñ”‚Ɖr¥’Zk”ä—¦‚ð‚»‚ê‚¼‚ê5‰ñA1/2‚ÉC³
-
- (src/map)
- skill.c - 1/3‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ð1/2‚ÉC³
- status.c - 3‰ñ‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ð5‰ñ‚ÉC³
-
---------------------
-//1125 by lizorett
-Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA‚̃mƒbƒNƒoƒbƒN‚ð3ƒZƒ‹‚É‚µAƒ~ƒXŽž‚ɂ̓mƒbƒNƒoƒbƒN‚µ‚È‚¢
-‚悤•ÏX
-EƒXƒsƒAƒXƒ^ƒu‚ð‘ÎÛ‚©‚玩•ª‚ÉŒü‚©‚Á‚Ä4ƒ}ƒX‚͈̔ÍUŒ‚‚É•ÏX(–{ŽIŽd—l)
-E‘é/“ŠÎ‚ðƒjƒ…ƒ}‚Å–h‚°‚é‚悤•ÏX
-Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ª‘ÎۂɃ~ƒX‚µ‚½ê‡‚ɂ̓mƒbƒNƒoƒbƒN‚µ‚È‚¢‚悤•ÏX
-Eƒ\ƒEƒ‹ƒuƒŒƒCƒJ[‚̃_ƒ[ƒWŒvŽZAƒjƒ…ƒ}‚Ń~ƒX‚É‚È‚é‚悤•ÏX
-EŠl“¾ŒoŒ±’l‚ÌãŒÀ(Œ»ƒŒƒxƒ‹‚Ì•K—vŒoŒ±’l-1)‚ðÝ’è
-EƒoƒWƒŠƒJ“WŠJŽž‚É“WŠJŽÒ‚̓mƒbƒNƒoƒbƒN‚µ‚È‚¢‚悤•ÏX
-EƒƒeƒIƒAƒTƒ‹ƒg‚𑦎ž”­“®AŽg—pŽÒ’†SA‰r¥500msŒÅ’èAƒGƒtƒFƒNƒg—L‚É•ÏX
-EƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“Žž‚Ìmob‚ÌUŒ‚—͒ቺ‚ð10%‚É•ÏX
-EŠ|‚¯‚ç‚ê‚Ä‚¢‚é‚à‚Ì‚æ‚è’჌ƒxƒ‹‚̃uƒŒƒX‚É‚æ‚èŽô‚¢/Ή»‚ª‰ðœ‚Å‚«‚é‚悤•ÏX
-Eƒ\ƒEƒ‹ƒo[ƒ“/ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[/ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒWŽÀ‘•
-EƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ðŽËü‚É‚¢‚é“G‚É‚àƒ_ƒ[ƒW‚ð—^‚¦‚é‚悤•ÏXAƒNƒŠƒeƒBƒJƒ‹
-Šm—¦+20%‚Å–hŒä–³Ž‹ƒ_ƒ[ƒW‚É•ÏX
-E“ŠÎ‚ȂLjꕔ‚̃XƒLƒ‹‚ª‘‚È‚Ç‚É1ƒ_ƒ[ƒW‚É‚È‚ç‚È‚¢–â‘è‚ðC³
-
- (db)
- skill_db.txt- BDS/ƒƒeƒIƒAƒTƒ‹ƒg•ÏXAƒXƒLƒ‹’ljÁ
- skill_cast_db.txt
- - ƒXƒLƒ‹’ljÁ
- skill_require_db.txt
- - ƒXƒLƒ‹’ljÁ
- (src/map)
- battle.c - ƒ\ƒEƒ‹ƒuƒŒƒCƒJ[‚̃_ƒ[ƒWŒvŽZ‚ð•ÏX
- - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚̃NƒŠƒeƒBƒJƒ‹Šm—¦C³
- - ‘é/“ŠÎ‚ðƒjƒ…ƒ}‚Å–h‚°‚é‚悤•ÏX
- skill.h - SC_MINDBREAKER’ljÁ
- skill.c - BDS/BB‚̃mƒbƒNƒoƒbƒN‚ðC³
- - ƒXƒsƒAƒXƒ^ƒu‚ð”͈ÍUŒ‚‚É•ÏX
- - ƒƒeƒIƒAƒTƒ‹ƒgC³
- - ƒ\ƒEƒ‹ƒo[ƒ“/ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[/ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒWŽÀ‘•
- path.c - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŽËüŒvŽZ‚ð’ljÁ
- pc.c - Šl“¾ŒoŒ±’l‚ÌãŒÀ(‘O‚̃Œƒxƒ‹‚ÌŒoŒ±’l-1)‚ðÝ’è
- status.c - ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[‚Ìmatkã¸/mdefŒ¸­‚ÌŽÀ‘•
- map.h - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŽËüŒvŽZ—p\‘¢‘Ì‚ð’ljÁ
-
---------------------
-//1124 by ‚à‚Á‚³‚è
-“G‚ªŽg‚¤”š—ô”g“®ŽÀ‘•
-Œø‰Ê
-atk1,atk2 1000*skilllv‰ÁŽZ
-hit 20*skilllv‰ÁŽZ
-
- (src/map)
- skill.c
- skill.h NPC_EXPLOSIONSPIRITSŠÖŒW‚ð’ljÁ
- status.c@@@@
- (db)
- skill_db.txt
- skill_cast_db.txt
-
-
-
---------------------
-//1123 by Nameless
-EAthenaƒT[ƒrƒX‰»ƒLƒbƒg‚ð’ljÁ‚µ‚Ü‚µ‚½B(NT/2000/XP/2003/LH)
-@Ú‚µ‚¢•û–@‚Ídoc“à‚Ìinstasv.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢
-
- (bin/tool)
- instasv.bat - ƒT[ƒrƒX“o˜^—pƒoƒbƒ`
- delasv.bat - ƒT[ƒrƒX–•Á—pƒoƒbƒ`
- (doc/)
- instasv.txt - à–¾‘(ƒeƒLƒXƒg”Å)
-
---------------------
-//1122 by End_of_exam
-
-E1120‚Ìstrdb ‚̃L[‚ð•Û‘¶‚µ–Y‚ê‚Ä‚¢‚½ƒoƒOC³idb.cj
-E”O‚Ì‚½‚ß1121A1120‚Ìreadme ‚ðƒ}[ƒW‚µ‚ÄA—¼•û‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ð“Y•t‚·‚é
-
- (src/char)
- char.c - 1121‚Ì‚à‚Ì‚ð“Y•t
-
- (src/common)
- mmo.h - 1121‚Ì‚à‚Ì‚ð“Y•t
- db.h - 1120‚Ì‚à‚Ì‚ð“Y•t
- db.c - strdb ‚̃L[‚ð•Û‘¶‚·‚é‚悤‚É‚·‚é
-
- (src/map)
- battle.c - 1121‚Ì‚à‚Ì‚ð“Y•t
- guild.c - 1121‚Ì‚à‚Ì‚ð“Y•t
- guild.h - 1121‚Ì‚à‚Ì‚ð“Y•t
- mob.c - 1121‚Ì‚à‚Ì‚ð“Y•t
- skill.c - 1121‚Ì‚à‚Ì‚ð“Y•t
- skill.h - 1121‚Ì‚à‚Ì‚ð“Y•t
-
---------------------
-//1121 by _
-
-Eƒ[ƒhƒiƒCƒg/ƒpƒ‰ƒfƒBƒ“‚̃ƒOƒCƒ“Žž‚̃Gƒ‰[‘Îô
-EGv‚Å‚Ì“¯–¿‚̈µ‚¢‚ðC³
-@ƒGƒ“ƒyƒŠƒEƒ€UŒ‚•s‰ÂAƒK[ƒfƒBƒAƒ“‚©‚çUŒ‚‚³‚ê‚È‚¢‚悤‚ÉC³
-EV’ljÁƒXƒLƒ‹—p‚̒蔒ljÁC³
-
- (src/char)
- char.c
- C³ mmo_char_send006b()
- (src/common)
- mmo.h
- C³ MAX_SKILL=500
- ’ljÁ VƒMƒ‹ƒhƒXƒLƒ‹(ƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚Ü‚·)
- (src/map)
- battle.c
- C³ battle_calc_damage()
- guild.c
- guild.h
- ’ljÁ guild_check_alliance()
- mob.c
- C³ mob_gvmobcheck()
- skill.c
- C³ SkillStatusChangeTable[] (420-490)
- skill.h
- C³ MAX_SKILL_DB=500
- ’ljÁ 475ˆÈ~‚ÌVƒXƒLƒ‹ID
-
---------------------
-//1120 by End_of_exam
-
-Edb_foreach()‚̌ĂÑo‚µæ‚Ådb_erase()‚ªŒÄ‚Ño‚³‚ê‚Ä‚¢‚邳‚ê‚Ä‚¢‚éê‡A
-@•¡”‰ñ“¯‚¶ƒL[‚ÅŠÖ”‚ðŒÄ‚Ño‚·‰Â”\«‚ª‚ ‚éƒoƒO‚ðC³(db.h db.c)
-
-@cygwinã‚Å‚Qdfree‚ð‚µ‚½ê‡AƒvƒƒOƒ‰ƒ€‚ª–\‘–‚·‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
-@charŽI‚Æ‚ÌÚ‘±‚ªØ‚ꂽmap ŽI‚ª–\‘–‚·‚éƒoƒO‚ÍA‚±‚ê‚É‹Nˆö‚µ‚Ä‚¢‚Ü‚·B
-
- (src/common)
- db.c - db_erase‚ðˆêŽž“I‚ɃƒbƒN‚·‚é‹@”\’ljÁ
- db.h - db_erase‚ðˆêŽž“I‚ɃƒbƒN‚·‚é‹@”\’ljÁ
-
---------------------
-//1119 by ICO
-
-ENPCƒXƒLƒ‹(ƒuƒŒƒCƒNƒEƒFƒ|ƒ“AƒuƒŒƒCƒNƒA[ƒ}[AƒuƒŒƒCƒNƒwƒ‹ƒ€AƒuƒŒƒCƒNƒV[ƒ‹ƒh)‚ÌŽÀ‘•
-Ebattle_athena.conf‚Émonster_damage_delay‚ð’ljÁB
-@no‚ðŽw’è‚·‚é‚ÆFW“™‚̃mƒbƒNƒoƒbƒNƒXƒLƒ‹‚Ì‹““®‚ª‘½­–{ŽI‚ɋ߂­‚©‚àcH
-
- (db)
- skill_db.txt
- skill_cast_db.txt
- (conf/)
- battle_athena.conf
- monster_damage_delay ’ljÁ
- (map/)
- battle.c
- battle.h
- mob.c
- monster_damage_delayŠÖ˜A‚ð’ljÁ
- skill.c
- skill.h
- skill_additional_effect,skill_castend_damage_id C³
-
---------------------
-//1118 by BDPQ‹â [ 2005/02/10 ]
-¡ƒf[ƒ^ƒx[ƒX‚ª•ÏX‚³‚ê‚Ä‚¢‚Ü‚·B“±“üŽž‚ɂ͌䒈ӂ­‚¾‚³‚¢¡
-EƒXƒLƒ‹‚̌Œè‰r¥ŽžŠÔ‚ð skill_cast_db.txt ‚Ɉړ®B
- ‰r¥ŽžŠÔ‚ÌŒvŽZ‚ÍA (’Êí‰r¥ + ŒÅ’è‰r¥)*ƒƒ‚ƒ‰ƒCƒY•â³ ‚Æ‚È‚è‚Ü‚·B
- skill_cast_db‚Ì‘Ž®‚Í
- [ID],[cast_list(’Êí‰r¥)],[fixed_cast_list(ŒÅ’è‰r¥)],[delay_list(ƒfƒBƒŒƒC)],[upkeep_time(ˆÛŽŽžŠÔ)],[upkeep_time2(ˆÛŽŽžŠÔ2)] ‚Å‚·B
-EƒAƒuƒ‰ƒJƒ^ƒuƒ‰‚ðƒfƒBƒŒƒC‚ÉASPD‚É‚æ‚éƒfƒBƒŒƒC‚ð•t‰Á‚µ‚È‚¢‚悤C³(‘¦”­“®ƒXƒLƒ‹—p)
-EV2ŽŸE‚Ìskill_cast_db‚ÉŠÖ‚·‚逖ڂÌC³
-
- (src/map)
- skill.c - skill_use_id() C³ (‰r¥ŽžŠÔŒvŽZ•” E ƒƒ‚ƒ‰ƒCƒY/–‚–@—Í‘• ŒÅ’è‰r¥ŽžŠÔ•”íœ)
- (ƒAƒuƒ‰ƒJƒ^ƒuƒ‰‚ÌC³)
- skill_use_pos() C³ (‰r¥ŽžŠÔŒvŽZ•”)
- skill_readdb() C³ (cast_db “Çž•”)
- skill.h - skill_db C³ (fixedcast‚̒ljÁ)
- skill_get_fixedcast() ’ljÁ (db‚©‚çŒÅ’è‰r¥ŽžŠÔ‚̎擾)
-
- (db)
- skill_cast_db.txt- fixed_cast_list ’ljÁ (ŒÅ’è‰r¥ŽžŠÔ)
- –‚–@—Í‘•-700Aƒƒ‚ƒ‰ƒCƒY-5000‚ÉÝ’è
-
- 361(ƒAƒXƒ€ƒvƒeƒBƒI) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ðC³ )
- 365(ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[)C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ð’ljÁ )
- 373(ƒ‰ƒCƒt’u‚«Š·‚¦) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ðC³ )
- 375(ƒ\ƒEƒ‹ƒo[ƒ“) ’ljÁ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ð’ljÁ ) ( ƒXƒLƒ‹Œø‰Ê‚ÍŽÀ‘•‚µ‚Ä‚¢‚Ü‚¹‚ñ )
- 381(ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ðC³ )
- 383(ƒEƒBƒ“ƒhƒEƒH[ƒN) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC/Œø‰ÊŽžŠÔ‚ðC³ )
- 384(ƒƒ‹ƒgƒ_ƒEƒ“) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ðC³ )
- 387(ƒJ[ƒgƒu[ƒXƒg) C³ ( R.O.M 776‚ðŽQl‚ÉŒø‰ÊŽžŠÔ‚ðC³ )
- 398(ƒwƒbƒhƒNƒ‰ƒbƒVƒ…) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒCŽ‘±ŽžŠÔ‚ðC³ )
- 406(ƒƒeƒIƒAƒTƒ‹ƒg) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ð’ljÁ )
-
- (doc)
- db_ref.txt - 1. db/skill_cast_db.txt C³ (fixed_cast_list‚Ì€–Ú‚ð’ljÁ)
-
---------------------
-//1117 by End_of_exam
-
-Eƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ð“Åó‘Ô‚Ì“G‚ÉŽg—p‚µ‚½‚ªAŽ¸”s‚µ‚½Žži“Gƒ‚ƒ“ƒXƒ^[‚Ì
-@HP‚ª2/3 ˆÈゾ‚Á‚½Žžj‚É[‚ȃƒ‚ƒŠƒŠ[ƒN‚ª‹N‚«‚Ä‚¢‚½ƒoƒO‚ðC³(skill.c)
-E‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ªŽ¸”s‚µ‚½Žž‚É[‚ȃƒ‚ƒŠƒŠ[ƒN‚ª‹N‚«‚Ä‚¢‚½ƒoƒO‚ðC³(skill.c)
-
-@ã‚Q‚‚ÍA‹¤‚Émap_freeblock_unlock() ‚ª”²‚¯‚Ä‚¢‚éˆ×‚É”­¶‚µ‚Ä‚¢‚Ü‚µ‚½B
-@ƒhƒƒbƒvƒAƒCƒeƒ€AƒXƒLƒ‹ƒ†ƒjƒbƒgAŽæ‚芪‚«‚È‚Ç‚ÅŠm•Û‚³‚ꂽƒƒ‚ƒŠ‚ªA
-@ˆÈ~‘S‚­ŠJ•ú‚³‚ê‚È‚­‚È‚é‚Æ‚¢‚¤‚©‚È‚è[‚ȃƒ‚ƒŠƒŠ[ƒN‚̃oƒO‚Å‚·B
-@map_freeblock_lock() ‚ðŒÄ‚Ôƒ‹[ƒ`ƒ“‚ðC³‚·‚éê‡Aƒ‹[ƒ`ƒ“‚𔲂¯‚é‚Æ‚«‚ÉA
-@map_freeblock_unlock() ‚ªŒÄ‚΂ê‚é‚悤‚É‹C‚ð•t‚¯‚Ä‚­‚¾‚³‚¢(return ‚É’ˆÓ!)B
-
-Emap_freeblock_unlock() ‚ð–Y‚ê‚Ä‚à—Ç‚¢‚悤‚ÉA’èŠú“I‚Éblock_free_lock‚ð
-@ƒNƒŠƒA‚·‚é‚悤‚ÉC³(map.c)
-EDebianD‚« ‚³‚ñ‚ÌMPVƒ‚ƒ“ƒXƒ^[‚ÌHPŒvŽZ‚ªƒI[ƒo[ƒtƒ[‚·‚éƒoƒOC³‚ÌŽæ‚èž‚Ý(status.c)
-
- (src/map)
- skill.c - skill_castend_nodamage_id() C³
- map.c - map_freeblock_timer() ’ljÁA do_init() C³
- status.c - status_get_max_hp() C³
-
---------------------
-//1116 by End_of_exam
-
-Ecopyarray ‚Å“¯‚¶”z—ñ‚ðŽw’肵‚½ŽžAƒRƒs[æ‚Ì—v‘f”Ô†‚ªƒRƒs[Œ³‚Ì—v‘f”Ô†‚æ‚è
-@‘å‚«‚¢Žž‚Ì“®ì‚ª•s’è‚É‚È‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(script.c npc_test_array.txt)
-EŠÖ”錾‚¹‚¸‚ÉŠÖ”’è‹`‚µ‚½ƒ†[ƒU[’è‹`ŠÖ”‚ðŒÄ‚Ño‚»‚¤‚Æ‚·‚é‚ÆAƒGƒ‰[‚ªo‚é
-@ƒoƒO‚ðC³(script.c)
-EƒXƒNƒŠƒvƒg‚̃I[ƒo[ƒtƒ[”»’èŠî€‚ðŠÉ˜a‚³‚¹‚é(script.c)
-EƒMƒ‹ƒh‚Ì’m‚É\n‚ªŽg‚¦‚éƒoƒO‚ðC³(int_guild.c)
-EƒCƒxƒ“ƒgdb‚̃ƒ‚ƒŠƒŠ[ƒNC³‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(npc.c)
-Edb_foreach‚̃`ƒFƒbƒN•û–@‚ð•ÏX(db.c)
-E‹N“®Žž‚É*.pid (ƒvƒƒZƒXID‚̃tƒ@ƒCƒ‹)‚ð쬂·‚é‚悤‚É‚·‚é(core.c)
-EŒoŒ±’lŠ“¾‚ª‘S‘Ì”­Œ¾‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ðC³(clif.c)
-E‹©‚Ô‚ð‘S‘Ì”­Œ¾‚É•ÏX(clif.c)
-Etester‚³‚ñ쬂ÌVC++ Toolkit2003 —p‚̃oƒbƒ`ƒtƒ@ƒCƒ‹‚𓯔º(vc07_make.bat)
-
- (/)
- vc07_make.bat - tester‚³‚ñ쬂̃oƒbƒ`ƒtƒ@ƒCƒ‹‚𓯔º
-
- (src/common)
- db.c - db_foreach() C³
- core.c - main() C³ , pid_create() , pid_delete() ’ljÁ
-
- (src/char)
- int_guild.c - mapif_parse_GuildPosition() C³
-
- (src/map)
- clif.c - clif_disp_onlyself() , clif_onlymessage() C³
- npc.c - npc_parse_script() C³
- script.c - buildin_copyarray() , parse_syntax() C³
-
- (script/sample)
- npc_test_array.txt - ƒ`ƒFƒbƒN€–ڂ̒ljÁ
-
---------------------
-//1115 by ‚¢‚Ç
-
-EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
-
---------------------
-//1114-fix1 by ‹HŽ}
-
-Ezlib‚ðmap-server“à•”‚ÉŽæ‚èž‚ß‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ
-Emake‚ªMinGW+Msys‚ųí‚É’Ê‚é‚悤C³
-Ewin32_start.bat‚Ƀ`ƒFƒbƒN’ljÁ
-
- (src/common/zlib)
- trees.h - anybody's guessã‚Ìzlib_1_2_1_staticlib‚æ‚èŽæ‚èž‚Ý
- inffixed.h - “¯ã
- inffast.h - “¯ã
- crc32.h - “¯ã
- compress.c - “¯ã
- deflate.h - “¯ã
- inftrees.h - “¯ã
- zutil.c - “¯ã
- crc32.c - “¯ã
- inflate.h - “¯ã
- inffast.c - “¯ã
- trees.c - “¯ã
- inflate.c - “¯ã
- zconf.h - “¯ã
- deflate.c - “¯ã
- inftrees.c - “¯ã
- zutil.h - “¯ã
- zlib.h - “¯ã
- adler32.c - “¯ã
- Makefile - LOCALZLIB‚ªŽw’肳‚ê‚Ä‚¢‚鎞‚̂݃Rƒ“ƒpƒCƒ‹‚µ‚Ü‚·B
-
- (src/map/)
- Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
- - LOCALZLIB‚ªŽw’肳‚ê‚Ä‚¢‚éꇃŠƒ“ƒN‚µ‚Ü‚·B
- - LOCALZLIB‚ª–³‚¢ê‡‚¾‚¯zlib.a‚ðƒŠƒ“ƒN‚µ‚Ü‚·B
- (src/char/)
- Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
- (src/login/)
- Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
- (src/common/grfio.c) - Zlib‚ð“à•ï‚µ‚½Û‚É_WIN32‚Æ‹£‡‚µ‚È‚¢‚悤•ÏX
- - zlib_win32.h zconf_win32.h‚ð”pŽ~
-
- (./)
- Makefile - #Link Zlib(NOTrecommended)Azlib‚ð“à•ï‚µ‚Ü‚·B
- win32_start.bat - athena-start‚Ì”¼ƒNƒ[ƒ“‰»B‰Šú‹N“®‚Å‚±‚¯‚È‚­‚È‚é‚Í‚¸‚Å‚·B
-
---------------------
-//1113 by End_of_exam
-
-Elinux ŠÂ‹«‚Å‘å—Ê‚Ìwarning ‚ªo‚Ä‚¢‚½‚Ì‚ðC³(malloc.h)
-Emap_quit() ‚Åcharid_db ‚̃f[ƒ^‚ð휂µ‚È‚¢‚悤‚É•ÏX(map.c thanks to lemit‚³‚ñ)
-Epc_eventtimer(), npc_event_timer() ‚Ìfree()‚ÅŒx‚ªo‚Ä‚¢‚½‚Ì‚ðC³(pc.c npc.c)
-Emap_eraseipport() ‚ªƒƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
-Eaddtimer –½—ß‚ÉŽw’è‚·‚éƒCƒxƒ“ƒg–¼‚ª‚Q‚R•¶Žš‚ɧŒÀ‚³‚ê‚Ä‚¢‚½‚̂𖳧ŒÀ‚É‚·‚é(pc.c)
-Epc_cleareventtimer() , pc_deleventtimer() ‚ªƒƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³
-@(pc.c thanks to Shinomori‚³‚ñ)
-
- (src/common/)
- malloc.h - "#undef strdup" ‚ð’ljÁ
-
- (src/map/)
- npc.c - npc_event_timer() C³
- pc.c - pc_eventtimer() , pc_addeventtimer() , pc_cleareventtimer(),
- pc_deleventtimer() C³
- map.c - map_quit() , map_eraseipport() C³
-
---------------------
-//1112 by lizorett
-EPC‚ªƒ}ƒbƒvˆÚ“®’†‚ÉA‚»‚ÌPC‚ªÝ’u‚µ‚½ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ìskill_unit_onout‚ªŒÄ‚΂ê
-‚È‚¢–â‘è(map-sever‚ª—Ž‚¿‚é‰Â”\«‚ ‚è)‚ðC³
-EƒoƒWƒŠƒJ‚ðŽd—l‚É•¹‚¹‚ÄC³
-E³íI—¹Žž‚Échar-server‚ªƒRƒAƒ_ƒ“ƒv‚·‚é–â‘è‚ðC³
-Emob‚ªƒEƒH[ƒ^ƒ{[ƒ‹Žg—pŽž‚̃qƒbƒg”‚ðC³(skill_db.txt‚ÉŽw’肵‚½”ƒqƒbƒg)
-EƒR[ƒeƒBƒ“ƒO‚³‚ê‚Ä‚¢‚éꇂɂ̓XƒgƒŠƒbƒv‚Å‚«‚È‚¢‚悤•ÏX
-E‘®«ê‚ðŽg—p‚µ‚½ÛA‘O‚Éo‚µ‚Ä‚¢‚½‘®«ê‚ªÁ‚¦‚È‚¢‚±‚Æ‚ª‚ ‚é–â‘è‚ðC³
-
- (db)
- skill_db.txt
- - mob‚̃EƒH[ƒ^ƒ{[ƒ‹‚̃JƒEƒ“ƒg”‚ðDB‚É‚¢‚ꂽ
- skill_unit_db.txt
- - ƒoƒWƒŠƒJ‚ðC³
- (char)
- char.c - do_final()‚Ìchar_dat‚̃ƒ‚ƒŠŠJ•úˆÊ’u‚ð•ÏX
- (map)
- clif.c - ƒoƒWƒŠƒJŽž‚ÉUŒ‚‚È‚Ç‚ª‚Å‚«‚È‚¢‚悤•ÏX
- map.c - ƒoƒWƒŠƒJˆÊ’u‚ðƒZƒ‹‚̃tƒ‰ƒO‚É“ü‚ê‚é‚悤•ÏX
- map.h - ƒoƒWƒŠƒJ—p‚̃Zƒ‹ƒtƒ‰ƒO’ljÁ
- mob.c - ƒoƒWƒŠƒJ‚Éi“ü‚Å‚«‚È‚¢‚悤‚É•ÏX
- pc.c - ˆÚ“®Žž(”ˆ‚È‚Ç)‚ɃoƒWƒŠƒJ‚ðÁ‚·‚悤C³
- skill.c - ƒoƒWƒŠƒJC³
- - ƒEƒH[ƒ^ƒ{[ƒ‹C³
- - skill_unit_onout‚̌ĂÑo‚µ‚ðC³
- - ƒR[ƒeƒBƒ“ƒO‚³‚ê‚Ä‚¢‚é‰ÓŠ‚̓XƒgƒŠƒbƒv•s‰Â‚É•ÏX
-
---------------------
-//1111 by Toshi^2
-EpcŒnmob‚É“]¶•—{Žq‚ðŽw’è‚Å‚«‚é‚悤‚É•ÏXB
-@db/mob_avail.txt‚Éà–¾•¶‚ð’ljÁ‚µ‚½‚Ì‚ÅA‚»‚ê‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-
- (db)
- mob_avail.txt - ˆø”‚Ìà–¾‚ð’ljÁB
- (src/map)
- clif.c - clif_mob0078() clif_mob007b() clif_pet0078() clif_pet007b() C³
- mob.c - mob_readdb_mobavail() C³
- mob.h - \‘¢‘Ìmob_db‚Éushort transv‚ð’ljÁAmob_avail‚Ìtransƒtƒ‰ƒO‚ðŠi”[B
-
---------------------
-//1110 by lizorett
-Eƒ†ƒjƒbƒgŒnƒXƒLƒ‹(ƒjƒ…ƒ}Aƒ_ƒ“ƒX“™)‚Åmap_server.exe‚ª—Ž‚¿‚é–â‘è‚ðC³
- (ƒgƒŒ[ƒX‚Å‚Ískill_unit_onplace/skill_unit_onout‚Å—Ž‚¿‚é)
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚Ìl”ƒJƒEƒ“ƒg•û–@‚ð•ÏX(–{ŽIŽd—l)
-Eƒ}ƒOƒkƒX‚͈̔͂ðL‚°AŽg—p‚µ‚½ƒ†ƒjƒbƒg‚ªíœ‚³‚ê‚é‚悤‚É‚·‚é(–{ŽIŽd—l)
-Eƒfƒ{[ƒVƒ‡ƒ“‚Ì‹——£‚ª’Z‚­‚È‚é–â‘è‚ðC³(ƒoƒO•ñƒXƒŒƒbƒh part8 >>15)
-Eƒfƒ{[ƒVƒ‡ƒ“‚Ånullpo‚ªo‚é–â‘è‚ðC³
-Emob‚̃Cƒ“ƒeƒBƒ~ƒfƒCƒg‚ª¬Œ÷‚·‚é‚Æmap-server‚ª—Ž‚¿‚é–â‘è‚ðC³(ƒoƒO•ñƒXƒŒƒb
-ƒh part8 >>42)
-EƒEƒH[ƒ^[ƒ{[ƒ‹‚ÌŽd—l‚ð–{ŽI‚ɋ߂¯‚é(…ꂪ­‚È‚¢ê‡‚É‚Íhit”‚ªŒ¸‚éA
-ƒfƒŠƒ…[ƒWã‚ÅŽÀs‚·‚é‚ƃ†ƒjƒbƒg‚ªŒ‡‚¯‚é)
-Eƒtƒ@[ƒ}ƒV[‚Ì»‘¢¬Œ÷Šm—¦‚̃R[ƒh‚ð•ÏX
-
- (db)
- skill_unit_db.txt
- - ƒ†ƒjƒbƒgID/”z’u‚È‚Ç‚ðdb‰»‚µ‚Ä‚¢‚Ü‚·
- (src/map)
- map.h - skill_unit_group‚̃ƒ“ƒo•ÏX
- mob.c - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(skill_unit_out_all/skill_unit_move)
- ‚ð’ljÁ
- - ‘«Œ³’u‚«/d•¡’u‚«”»’f‚ð•ÏX
- pc.c - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
- - –³“GŽžŠÔ‚ªI‚í‚éۂɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
- skill.h - skill_db‚ÌŽQÆŠÖ”‚ðdefine‚É•ÏX
- - ƒXƒLƒ‹”z’u‚ð“ü‚ê‚éskill_unit_layout\‘¢‘Ì‚ð’è‹`
- - SC_WATERBALLíœ
- skill.c - unit_id‚ðdb‰»(skill_unit_db.txt)
- - ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̃ŒƒCƒAƒEƒg‚ð‹N“®Žž‚É’è‹`
- - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
- - ‘«Œ³’u‚«/d•¡’u‚«”»’f‚ð•ÏX
- - ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̈ړ®ˆ—‚ð•ÏX
- - ƒfƒ{[ƒVƒ‡ƒ“‚ÌC³
- - mob‚̃Cƒ“ƒeƒBƒ~ƒfƒCƒg‚Å—Ž‚¿‚é–â‘è‚ðC³
- - ƒEƒH[ƒ^ƒ{[ƒ‹‚ÌŽd—l•ÏX
- status.c- SC_WATERBALL‚̈—‚ðíœ
-
---------------------
-//1109 by End_of_exam
-
-1108‚Ɉø‚«‘±‚«ƒƒ‚ƒŠƒŠ[ƒN‚̃oƒOC³‚Å‚·B‚Q‚‹¤‚É[‚ȃoƒO‚È‚Ì‚ÅA
-ÅV”Å‚ÉXV‚µ‚È‚¢•û‚Å‚àC³‚·‚邱‚Æ‚ð‚¨‚·‚·‚ß‚µ‚Ü‚·B
-
-Eƒyƒbƒg‚ª°‚ɃAƒCƒeƒ€‚ð—Ž‚Æ‚·ŽžAƒyƒbƒg‚ð—‘‚É–ß‚·Žž‚Ƀƒ‚ƒŠƒŠ[ƒN‚ª”­¶
-@‚µ‚Ä‚¢‚½ƒoƒO‚ðC³B(pet.c)
-
-EƒLƒƒƒ‰ƒNƒ^[ˆË‘¶ˆêŽž•Ï”‚Ì—˜—p‚µ‚½ƒLƒƒƒ‰‚ªƒƒOƒAƒEƒg‚·‚é‚ƃƒ‚ƒŠƒŠ[ƒN‚ª
-@”­¶‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
-
- (src/map)
- map.c - map_quit() C³
- pet.c - pet_remove_map(), pet_return_egg() pet_lootitem_drop() C³
-
---------------------
-//1108 by End_of_exam
-
-EˆÈ‘Oì‚Á‚½ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ[‚ð“‡B(malloc.c core.c)
-@—LŒø‚É‚·‚é‚É‚ÍAmalloc.c“à•”‚̃Rƒƒ“ƒg‚ðŠO‚·•K—v‚ª‚ ‚è‚Ü‚·BŠJ”­‚É‹¦—Í‚µ‚Ä
-@’¸‚¯‚é•û‚ÍAƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚ð—LŒø‚É‚µ‚ÄAƒ`ƒFƒbƒNŒ‹‰Ê(map-server.log‚È‚Ç)‚ð
-@ƒAƒbƒvƒ[ƒh‚µ‚Ä‚­‚ê‚é‚Æ•‚©‚è‚Ü‚·B
-
-@@1. guild.c ‚ªƒRƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚Á‚½‚Ì‚ÅC³(guild.c)
-@@2. pet.c ‚ªƒƒ‚ƒŠ‰ð•ú‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ÅAdo_final_pet() ‚ð’ljÁ(pet.c)
-@@3. do_final_socket ‚ð’ljÁ‚µ‚ÄAI—¹Žž‚É‘S‚Ä‚ÌÚ‘±‚ðØ’f‚·‚é(socket.c)
-@@4. deplicate ‚ÌŒ³ƒXƒNƒŠƒvƒg‚ªI—¹Žž‚Éfree‚³‚ê‚È‚¢ƒoƒO‚ðC³(npc.c)
-@@5. do_final_script ‚ÅŠJ•ú‚³‚ê‚È‚¢ƒƒ‚ƒŠ‚ª‚ ‚éƒoƒO‚ðC³(script.c)
-@@6. do_init_*** ‚̌Ă΂ê‚釔Ԃª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³(map.c)
-@@7. ƒCƒxƒ“ƒg–¼‚ªd•¡‚µ‚½‚Æ‚«‚ɃƒbƒZ[ƒW‚ðo‚·‚悤‚É•ÏX(npc.c)
-@@8. map_quit() “à•”‚Åcharid_db ‚ðfree‚µ–Y‚ê‚Ä‚¢‚éƒoƒO‚ðC³(map.c)
-
-@“Á‚É8.‚ÍÅd—v‚ÅAƒLƒƒƒ‰‚ªƒƒOƒAƒEƒg‚·‚é“x‚Ƀƒ‚ƒŠƒŠ[ƒN‚ª”­¶‚·‚é‚Æ‚¢‚¤A
-@ň«‚ÈŒ‹‰Ê‚É‚È‚Á‚Ä‚¢‚Ü‚µ‚½B‹C‚É‚È‚é•û‚ÍC³‚µ‚Ä‚¨‚«‚Ü‚µ‚傤B
-
-Edelete_session ‚ÅNULLƒ`ƒFƒbƒN‚ð‘Ó‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(socket.c)
-Echrif_disconnect_sub ‚Ådelete_session ‚ðŒÄ‚Ԃ悤‚É•ÏX(chrif.c)
-Eƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒgi/* ` */j‚̉ðÍ‚ð–Y‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(npc.c)
-E‹âs‚È‚Ç‚ÌNPC ‚ÅZeny‚ªMAX_ZENY‚É‚È‚ç‚È‚¢ƒoƒO‚ðC³(pc.c)
-E1107‚Ì»‘¢Šm—¦‚ªˆê•”Á‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³(skill.c thanks to lizorett‚³‚ñ)
-EƒZ[ƒW“]EŽŽŒ±‚̃Cƒxƒ“ƒg‚ªÕ“Ë‚ð‹N‚±‚µ‚Ä‚¢‚½‚Ì‚ðC³(npc.c)
-@@npc_parse_script : dup event jobsage_2nd::OnTimer150000
-@@npc_parse_script : dup event jobsage_2nd::OnTimer30000
-@@npc_parse_script : dup event jobsage_success::OnTimer7000
-@@npc_parse_script : dup event jobsage_success::OnTimer3000
-
- (src/common)
- core.c - do_init_memmgr() ’ljÁ
- malloc.c - ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚̒ljÁ
- malloc.h - ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚̒ljÁ
- socket.c - delete_session‚̃oƒOAdo_final_socket‚̒ljÁ
-
- (src/map)
- chrif.c - chrif_disconnect_sub() ‚ðC³
- guild.c - guild_recv_info(), guild_castledataloadack() C³
- map.c - map_quit() ‚̃ƒ‚ƒŠƒŠ[ƒNAdo_final,do_init C³
- npc.c - npc_parse_script_line() , npc_parse_script() ‘¼C³
- pc.c - pc_setparam() C³
- pet.c - do_final_pet() ’ljÁ
- pet.h - do_final_pet() ’ljÁ
- script.c - do_init_script(), do_final_script() C³
- skill.c - skill_produce_mix() C³
-
---------------------
-//1107 by code
-E@npctalk, @pettalkƒRƒ}ƒ“ƒh’ljÁ
-Eƒ_ƒ[ƒW‚Ì’x‰„‚ðŽÀ‘•
-E@mes‚ð‘S‘Ì”­Œ¾‚ÉC³
-Eƒtƒ@[ƒ}ƒV[‚Ì»‘¢¬Œ÷Šm—¦C³
-E@storage‚Å‘qŒÉ‚ª“ñd‚ÅŠJ‚­‚±‚Æ‚ª‚È‚¢‚悤C³
-Escript‚É globalmes, getmapmobs ŠÖ”‚ð’ljÁ
-
- (/src/map)
- atcommand.c
- atcommand.h
- battle.c
- clif.c
- clif.h
- npc.c
- npc.h
- script.c
- skill.c
- storage.c
-
---------------------
-//1106 by sylpheed
-
-Eitem_rate_details:1‚ª“®‚©‚È‚©‚Á‚½‚Ì‚ðC³
-
- (src/map/)
- mob.c
-
---------------------
-//1105 by End_of_exam
-
-E1101‚̃}ƒbƒv‚ÌÄ•ª”z‚ªãŽè‚­‚¢‚©‚È‚¢ƒoƒO‚ðC³(char.c thanks to Mystle‚³‚ñ)
-
- (src/char/)
- char.c - parse_frommap() C³
-
---------------------
-//1104 by nameless
-EBCC32‚̃Rƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚È‚Ç‚ÌÅ“K‰»
-EBCC32/VC++‚ÅÅ“K‚ÈÅ“K‰»ƒIƒvƒVƒ‡ƒ“‚ðŒ©‚Â‚¯‚邽‚߂̃xƒ“ƒ`
-Ebcc32_clean.bat‚Æbcc32_make.bat‚ð“‡AƒNƒŠ[ƒ“ƒrƒ‹ƒh‚ÌŽ¸”s‚ð‚µ‚È‚¢‚悤‚ÉB
-
-¦P4‚¾‚©‚ç‚Æ‚©Opteron‚¾‚©‚ç“Á’èƒIƒvƒVƒ‡ƒ“‚Å‘‚¢‚Æ‚¢‚¤‚±‚Æ‚Å‚Í‚È‚¢‚悤‚Å‚·B
-¦P4‚Å‚àƒƒbƒg‚É‚æ‚Á‚Ä‚Í-5‚ªÅ“K‚¾‚Á‚½‚è-3 -O2‚ªÅ“K‚¾‚Á‚½‚è‚·‚é‚à‚Ì‚ª‚ ‚é‚悤‚Å‚·
-¦Žv‚¢ž‚݂ŃIƒvƒVƒ‡ƒ“‚ð‚‚¯‚È‚¢‚悤‚É‚·‚邽‚ß‚Éì‚è‚Ü‚µ‚½B
-¦­‚µ‚Å‚àƒŒƒXƒ|ƒ“ƒX‚ðã‚°‚ĉ^—p‚µ‚½‚¢‚Æ‚¢‚¤l‚ÍŠˆ—p‚µ‚Ä‚­‚¾‚³‚¢B
-
- (/)
- bcc32_make.bat
-
- Å“K‰»ƒIƒvƒVƒ‡ƒ“‚̒ljÁ‚ÆŒxƒƒbƒZ[ƒW‚Å[‚Å‚Í‚È‚¢‚à‚Ì‚ð
- Š®‘S‚É•\Ž¦‚µ‚È‚¢‚悤‚ÉÝ’èAbcc32_clean.bat‚ðmake‚É“‡‚µ‚½
- ‚Ì‚ÅŠmŽÀ‚ɃNƒŠ[ƒ“ƒrƒ‹ƒh‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- bench.bat
- bench.c
-
- Å“K‚ȃRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚ðŒ©‚Â‚¯‚邽‚߂̃xƒ“ƒ`‚Å‚·B
- bench.bat‚ŃRƒ“ƒpƒCƒ‹•ŽÀs‚ªs‚í‚ê‚Ü‚·B
- Œ‹‰Ê‚Íbench.txt‚ÉŠi”[‚³‚ê‚Ü‚·‚Ì‚Å”’l‚̈ê”Ô¬‚³‚¢‚à‚Ì‚ð‘I‚ñ
- ‚Åbcc32_make.bat‚Ì23s–ڂɒljÁEC³‚µ‚Ä‚ ‚°‚Ä‚­‚¾‚³‚¢B
- ¦‰Šúó‘Ô‚Å‚Íbcc32—p‚É‚È‚Á‚Ä‚¢‚Ü‚·‚Ì‚Å
---------------------
-//1103 by End_of_exam
-
-Echar_athena.conf ‚Ìdefault_map_type‚ª0 ‚É‚È‚Á‚Ä‚¢‚鎞‚ÉAPVPƒKƒCƒh‚Å
-@ƒZ[ƒu‚µ‚½ŒãAPVPƒGƒŠƒA“à‚ŃƒOƒAƒEƒg‚µ‚½ƒLƒƒƒ‰‚ªƒƒOƒCƒ“‚Å‚«‚È‚­‚È‚é
-@ƒoƒO‚ðC³B(npc_etc_pvp.txt) ‘½‚­‚Ì•ûX‚©‚ç‚Ìî•ñ’ñ‹ŸŠ´ŽÓ‚µ‚Ü‚·B
-@inpc_etc_pvp.txt “à•”‚Ì ".gat" ‚Ì•t‚¯–Y‚ê‚ÆA‚±‚̃~ƒX‚ɑΉž‚µ‚Ä‚¢‚È‚¢
-@@pc.c ‚̃oƒO‚Å‚·B‚±‚̃pƒbƒ`‚ð“–‚Ä‚È‚¢‚Å‚±‚̃oƒO‚ðC³‚µ‚½‚¢ê‡A
-@@“Y•t‚µ‚½C³ƒtƒ@ƒCƒ‹‚ðŽQl‚É‚µ‚È‚ª‚çAnpc_etc_pvp.txt‚É".gat"‚ð
-@@•t‰Á‚µ‚Ä‚­‚¾‚³‚¢Bj
-
-Edo_final“à•”‚Å•s³‚Ȉ—‚ðs‚¤ê‡‚ª‚ ‚é‚Ì‚ðC³(map.c thanks to lizorett‚³‚ñ)
-Eƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚Ì“Ç‚Ýž‚Ý‚ÉŽ¸”s‚µ‚½‚Æ‚«‚Ƀƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
-
- (src/map)
- pc.c - pc_setsavepoint() C³
- map.c - do_final(), map_cache_read() C³
-
- (src/char)
- char.c - search_mapserver() , parse_char() C³
-
- (script/npc/etc)
- npc_etc_pvp.txt - ".gat" ‚ð•t‰Á‚·‚é
-
---------------------
-//1102 by l’Œ‚³‚ñA
-EƒoƒO•ñƒXƒŒ >>35-37‚É‚ ‚Á‚½C³”Å
-@Ú‚µ‚¢‚±‚Ƃ̓XƒŒ‚ðŒ©‚Ä‚­‚¾‚³‚¢
- (src/map)
- pc.c
-
---------------------
-//1101 by End_of_exam
-
-EsocketŠÖ˜A‚ÌC³(socket.c socket.h)
-
-@1. FIFOŠÖ˜A‚ðfd ‚ª•s³(fd<=0)‚ÌŽž‚É‚à³í‚É“®ì‚·‚é‚悤‚É•ÏX
-@2. socket.h ‚Ì“à•”‚ðFX‚Æ®—
-@3. make_connection() ‚ªÚ‘±‚ÉŽ¸”s‚µ‚½Žž‚ɃGƒ‰[‚ð•Ô‚³‚È‚¢ƒoƒO‚ðC³
-@@@‚»‚Ì•ÏX‚ɇ‚킹‚ÄAchrif.c check_connect_char_server() , char.c
-@@@check_connect_login_server() ‚ðC³B‚±‚ê‚ŃT[ƒo[ƒ]ƒ“ƒr‰»‚̃oƒO‚Í
-@@@‰ðŒˆ‚µ‚½‚ÆŽv‚¢‚Ü‚·‚ªAÄ”­‚µ‚½‚ç•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-
-Echar - map ŠÔ‚̃RƒlƒNƒVƒ‡ƒ“‚ðŒ©’¼‚µ(char.c chrif.c map.c map.h)
-
-@1. char - map ŠÔ‚̃RƒlƒNƒVƒ‡ƒ“‚ªØ‚ꂽ‚çAmap ŽI‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰‚ð
-@@‘S‚ÄØ’f‚·‚é‚悤‚É‚·‚éB‚±‚ê‚ÍA“¯Šú‚ðŽæ‚é‚Ì‚ª“‚¢‚Ì‚ÆAcharŽI‚Æ‚Ì
-@@’ÊM‚ª•K—v‚Ȉ—iƒp[ƒeƒBAƒMƒ‹ƒhAƒyƒbƒg‘¼j‚ª‚Å‚«‚È‚­‚Ȃ邽‚ß‚Å‚·B
-@2. •¡”‚Ìmap ŽI‚Å“¯‚¶ƒ}ƒbƒv‚ð’S“–‚·‚邱‚Æ‚ª‚ ‚éƒoƒO‚ðC³
-@3. map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
-@@•¡”‚Ìmap ŽI‚Å“¯‚¶ƒ}ƒbƒv‚ð“Ç‚Ýž‚ß‚ÎA‚Ç‚ê‚©‚P‚‚ª—Ž‚¿‚Ä‚¢‚鎞‚Å‚àA
-@@³í‚Èmap ŽI‚ɃƒOƒCƒ“‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B—Ⴆ‚ÎA“¯‚¶ƒ}ƒbƒv‚ð
-@@mapŽIA‚ÆB‚É“Ç‚Ýž‚Ü‚¹‚Ä‚¨‚¯‚ÎAA‚ª—Ž‚¿‚Ä‚¢‚鎞‚É‚ÍB‚ÉAB‚ª—Ž‚¿‚Ä‚¢‚é
-@@Žž‚É‚ÍA‚É“]‘—‚³‚ê‚Ü‚·B‚½‚¾‚µA—D懈ʂ̎w’è‚Í‚Ü‚¾o—ˆ‚Ä‚È‚¢‚Ì‚ÅA
-@@‚P‚‚Ìmap ŽI‚Él”‚ªW’†‚µ‚·‚¬‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
-
- (src/map)
- chrif.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
- map.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
- map.h - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
-
- (src/char)
- char.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
-
- (src/common)
- socket.c - FXC³iã‹LŽQÆj
- socket.h - FXC³iã‹LŽQÆj
-
---------------------
-//1100 by nyankochan
-E1098‚ÌC³
- (src/map)
- pc.c
-
---------------------
-//1099 by End_of_exam
-
-Emapflag nosave ‚ª•s³‚ÈŽž‚É‹N“®‚ð’†’f‚³‚¹‚é‚悤‚É‚·‚é(npc.c)
-Epc_autosave ‚ªŒÄ‚΂ê‚é‰ñ”‚ªˆÙí‚É‚‚­‚È‚éƒoƒO‚ðC³(pc.c)
-
-pc_autosave() ‚Ì“à•”‚ªA
-
-> interval = autosave_interval/(clif_countusers()+1);
-> if(interval <= 0)
-> interval = 1;
-
-‚Æ‚¢‚¤•—‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ÅA‚Pƒ}ƒbƒvƒT[ƒo[‚É200l‚̃Lƒƒƒ‰‚ªÚ‘±‚µ‚Ä‚é‚ÆA
-autosave_interval(def:15 * 1000) / 200 = 0.075 •b‚²‚Æ‚ÉŠÖ”‚ªŒÄ‚΂ê‚Ü‚·B
-‚³‚·‚ª‚É‚±‚Ìó‘Ô‚¾‚ÆcharŽI‚ªŒµ‚µ‚­‚È‚é‚Ì‚ÅAŠÖ”‚ðŒÄ‚Ño‚·Å¬ŠÔŠu‚ð
-0.2 •b‚É•ÏX‚µ‚Ü‚µ‚½B
-
- (src/map)
- pc.c - pc_autosave ‚ªŒÄ‚΂ê‚é‰ñ”‚ªˆÙí‚É‚‚­‚È‚éƒoƒO‚ðC³
- npc.c - mapflag nosave ‚ª•s³‚ÈŽž‚É‹N“®‚ð’†’f‚³‚¹‚é
-
---------------------
-//1098 by nyankochan
-E“üŽè‘•”õ•i‚̌”1ŒÅ’è
- (src/map)
- pc.c
-
---------------------
-//1097 by End_of_exam
-
-Žå‚ɃoƒOC³‚Å‚·BƒoƒO•ñ‚µ‚Ä‚­‚ꂽŠF—l‚ÉŠ´ŽÓAŠ´ŽÓB
-
-EZeny‘B‘Îô(pc.c trade.c script.c)
- 1. ŒðŠ·Apc_setparam ‚ÅMAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
- 2. ƒXƒNƒŠƒvƒg‚ɃI[ƒo[ƒtƒ[‘Îô‚ð’ljÁ
-
-EƒƒOƒCƒ“¬Œ÷ŽžEƒAƒJƒEƒ“ƒg•Ï”XVŽž‚É–³ðŒ‚Émmo_auth_sync ‚ð
-@ŒÄ‚ñ‚Å‚¢‚½‚Ì‚ðƒ^ƒCƒ}[‚ðŽg—p‚µ‚½’èŠúXV‚É•ÏX(login.c login_athena.conf)
-
-EdbŠÖŒW‚ɃoƒO‚ªö‚ñ‚Å‚¢‚é–Í—l‚È‚Ì‚ÅAƒ`ƒFƒbƒN‹@\‚ð’ljÁ‚·‚é(db.c db.h)
-@ˆê•”ƒAƒJƒEƒ“ƒg‚̂݃ƒOƒCƒ“•s‰ÂA‘qŒÉƒƒXƒgA@who‚Å•\Ž¦‚³‚ê‚éƒLƒƒƒ‰‚ª
-@ˆê•”Á‚¦‚é‚Ȃǂ̃oƒO‚ÌŒ´ˆö‚ªdbŠÖ˜A‚É‚ ‚é–Í—l‚Å‚·B
-@udb_foreach : data lost %d of %d item(s)v‚Æ‚¢‚¤ƒƒbƒZ[ƒW‚ª•\Ž¦
-@‚³‚ꂽꇂ̓oƒO‚ª‚ ‚éidb‚É“ü‚Á‚Ä‚¢‚é‚Í‚¸‚̃f[ƒ^‚ªÁ‚¦‚½j‚Ì‚ÅA
-@•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-
-E‚ ‚é•û–@‚Å’Êí‚æ‚è‹­‚¢ƒLƒƒƒ‰‚ªì‚ê‚Ä‚µ‚Ü‚¤ƒoƒO‚ÌC³(char.c)
-EƒMƒ‹ƒh‚Ì–ðE–¼‚É•s³‚È•¶Žš‚ªŽg‚¦‚éƒoƒO‚ðC³(int_guild.c)
-EƒXƒNƒŠƒvƒg“à‚Å‚O‚Å‚ÌœŽZŽž‚ª‹N‚±‚Á‚½Žž‚ÉINT_MAX‚ð•Ô‚·‚悤‚É‚·‚é(script.c)
-
- (conf/)
- login_athena.conf - autosave_time ‚̒ljÁ
-
- (src/common)
- db.h - ƒ`ƒFƒbƒN‹@\‚̒ljÁ
- db.c - ƒ`ƒFƒbƒN‹@\‚̒ljÁ
-
- (src/login)
- login.c - mmo_auth_sync ‚Ƀ^ƒCƒ}[‚ð“K—p
-
- (src/char)
- char.c - ’Êí‚æ‚è‹­‚¢ƒLƒƒƒ‰‚ªì‚ê‚Ä‚µ‚Ü‚¤ƒoƒO‚ÌC³
- int_guild.c - ƒMƒ‹ƒh‚Ì–ðE–¼‚É•s³‚È•¶Žš‚ªŽg‚¦‚éƒoƒO‚ðC³
-
- (src/map)
- trade.c - MAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
- pc.c - MAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
- script.c - ƒI[ƒo[ƒtƒ[‘ÎôA‚O‚Å‚ÌœŽZŽž‚̈—‚ð’ljÁ
-
---------------------
-//1096 by lizorett
-E•Ç‰z‚µ‚ɃXƒLƒ‹‚ªŒ‚‚Ä‚Ä‚µ‚Ü‚¤ƒoƒO‚ðC³(ƒoƒO•ñƒXƒŒƒbƒh part8 >>28)
-
- (src/map)
- path.c - •Ç‰z‚µ‚ɃXƒLƒ‹‚ªŒ‚‚Ä‚Ä‚µ‚Ü‚¤ƒoƒO‚ðC³
-
---------------------
-//1095 by lizorett
-EƒXƒNƒŠƒvƒg‚̃GƒXƒP[ƒv”»’f‚ð•ÏX
-EƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìgroup_id‚͈̔͂ð•ÏX
-Eskill_unitsetting()‚Å‘S‚ẴXƒLƒ‹‚Åskill_get_time()‚ðŽg—p‚·‚é‚悤•ÏX
-EƒTƒCƒgƒ‰ƒbƒVƒƒ[‚ðƒ†ƒjƒbƒgƒXƒLƒ‹‚©‚ç”͈ÍUŒ‚–‚–@‚É•ÏX(–{ŽIŽd—l)
-
- (src/map)
- skill.c - skill_unitgrouptickset_* ‚Å skill_id/group_id‚ªd‚È‚ç‚È‚¢‚悤
- ‚Égroup_id‚͈̔͂ð§ŒÀ
- - SkillStatusChangeTable‚ÉSC_SAFETYWALL,SC_PNEUMA’ljÁ
- - skill_unitsetting()‚Å‘S‚ẴXƒLƒ‹‚Åskill_get_time()‚ðŽg—p‚·‚é
- ‚悤•ÏX
- - ƒTƒCƒgƒ‰ƒbƒVƒƒ[‚ð”͈ÍUŒ‚–‚–@‚É•ÏX
- npc.c - ƒGƒXƒP[ƒv”»’f‚ðparse_simpleexpr()‚Æ“¯—l‚É‚µA‘SŠp”»’f‚ðíœ
- (db)
- skill_cast_db.txt
- - TS/MS/LoV/FN/SG/HD/GX‚Éupkeep_time‚ðÝ’è
-
---------------------
-//1094 by End_of_exam
-
-EƒTƒuƒ‹[ƒ`ƒ“ŒÄ‚Ño‚µ\•¶‚̒ljÁ(script.c npc.c npc_convertlabel_db())
-E‹tƒAƒZƒ“ƒuƒ‹ˆ—‚̒ljÁ(script.c , DEBUG_DISASM ‚ð—LŒø‚É‚µ‚Ä‚­‚¾‚³‚¢B)
-Eswitch ‚̈ꎞ•Ï”Á‹ŽˆÊ’u‚ð•ÏX(script.c)
-ERERUNLINE‚ÌÕ“®‚ª‰ö‚µ‚©‚Á‚½‚Ì‚ÅC³(script.c / h , map.h)
-Eƒ\[ƒX‚ð“Ç‚Ý‚â‚·‚­‚·‚邽‚ß‚Ébuildin_*‚ðƒtƒ@ƒCƒ‹ÅŒã‚Ɉړ®(script.c)
-EV‚µ‚­‰Á‚í‚Á‚½\•¶‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚ÄuƒnƒmƒC‚Ì“ƒv‚ð’ljÁ(npc_test_hanoi.txt)
-Ebuildin_getitemname C³(script.c , Ž¿–âƒXƒŒƒbƒh Part14 >>129-130)
-
-Ebcc ‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚É—Ž‚¿‚éƒoƒO‚ðC³(map.c map_id2bl “à•”)
-EWindows‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚ÉAgettick()‚̃LƒƒƒbƒVƒ…‚ª–³Œø‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð
-@C³(timer.c , thanks to Shinomori)
-
- (src/common)
- timer.c gettick() ‚̃oƒOC³
-
- (src/map)
- script.c FX•ÏXiã‹LŽQÆj
- script.h struct script_state C³
- npc.c npc_convertlabel_db() ‚Å—Ž‚¿‚é‚Ì‚ðC³
- map.c map_id2bl() ‚ðC³(—Ž‚¿‚é‚Ì‚Íbcc ‚¾‚¯H)
- map.h map_session_data C³
-
- (doc/)
- script_ref.txt function \•¶‚̒ljÁ
-
- (script/sample/)
- npc_test_hanoi.txt ƒnƒmƒC‚Ì“ƒ
-
---------------------
-//1093 by ‚¢‚Ç
-
-EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
-
---------------------
-//1092 by lizorett
-E‰“‹——£UŒ‚‚̃pƒXŒŸõƒAƒ‹ƒSƒŠƒYƒ€‚ð–{ŽI‚Æ“¯‚¶‚É‚È‚é‚悤•ÏX
-EƒXƒg[ƒ€ƒKƒXƒgAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ðd‚Ë‚½ê‡A•Ð•û‚©‚炾‚¯ƒ_ƒ[ƒW‚ð
-Žó‚¯‚é‚悤C³(Žd—l‚ª•s–¾‚È‚Ì‚Åæ‚ÉŒ©‚‚¯‚½ƒ†ƒjƒbƒg‚©‚çUŒ‚‚·‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·)
-EƒAƒCƒeƒ€‚ªˆê‚‚µ‚©‚È‚¢ê‡AƒAƒCƒeƒ€‚ðŽg—p‚µ‚Ä‚àƒGƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚È‚¢–â‘è
-‚ðC³
-EƒZ[ƒtƒeƒB[ƒEƒH[ƒ‹Žg—pŽž‚ɃAƒhƒŒƒX•s³‚Æ‚È‚éꇂª‚ ‚é–â‘è‚ðC³
-Emap_getcell/map_setcell‚ÌŽd—l•ÏX
-E1085‚̃rƒbƒgƒ}ƒbƒv‘Ήž‚Ì­Õ‚ÌÁ‹Ž
-E1088‚̃AƒCƒXƒEƒH[ƒ‹‚Ì•ÏX‚ðŠª‚«–ß‚µ(–{ŽI‚ɇ‚킹‚é)
-E‘SŠp”»’f(npc.c)‚ðC³(For English User Forum >>54)
-
- (’ˆÓ) map_athena.conf‚̃}ƒbƒvƒLƒƒƒbƒVƒ…Žw’è‚ðs‚¤ƒpƒ‰ƒ[ƒ^–¼‚ð•ÏX‚µ‚Ä‚¢‚Ü‚·
-
- (conf)
- map_athena.conf - read_map_from_bitmap‚ðread_map_from_cache ‚É•ÏX
- - map_bitmap_path‚ðmap_cache_file‚É•ÏX
- (src/map)
- map.h - ƒZƒ‹ƒ^ƒCƒv–¼Ì•ÏX(CELL_CHKHIGH,CELL_CHKTYPE)A
- íœ(CELL_SET*)
- - skill_unit_group_ticksetƒƒ“ƒo–¼•ÏX(group_id -> id)
- - ƒrƒbƒgƒ}ƒbƒvŠÖ˜A‚Ì‹Lq‚Ì­Õ‚ðíœ
- map.c - map_getcell() ƒZƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚Ǝ኱‚̃R[ƒh•ÏX
- - map_setcell()‚ð1084ˆÈ‘O‚ÌŽd—l‚É–ß‚µACELL_SETNPC‚Ì
- ƒtƒ‰ƒO‚ð’ljÁ
- - map_cacheŠÖ˜A‚Ìׂ©‚ÈC³
- npc.c - ‘SŠp”»’f(is_zenkaku)‚ð³Šm‚És‚¤‚悤•ÏX
- - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
- pc.c - ƒAƒCƒeƒ€‚ªˆê‚‚µ‚©‚È‚¢ê‡AŽg—pŽž‚̃GƒtƒFƒNƒg‚ª•\Ž¦
- ‚³‚ê‚È‚¢–â‘è‚ðC³
- - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
- skill.c - ƒXƒg[ƒ€ƒKƒXƒgAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ðd‚Ë‚½ê‡
- •Ð•û‚©‚炾‚¯ƒ_ƒ[ƒW‚ðŽó‚¯‚é‚悤C³
- - ƒZ[ƒtƒeƒB[ƒEƒH[ƒ‹Žg—pŽž‚ɃAƒhƒŒƒX•s³‚Æ‚È‚éꇂª
- ‚ ‚é–â‘è‚ðC³
- - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
- skill.h - ŠÖ”’è‹`•ÏX
- path.c - ‰“‹——£UŒ‚‚̃pƒXŒŸõˆ—‚ð’ljÁ(path_search_long)
- - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
- battle.c - ‰“‹——£UŒ‚‚̃pƒXŒŸõ‚ðŽg—p‚·‚é‚悤•ÏX
-
---------------------
-//1091 by End_of_exam
-
-––@’ˆÓ@––
-
-@¡‰ñ‚̃pƒbƒ`‚͉ü‘¢“à—e‚ª•¡ŽG‚È‚Ì‚ÅA“±“ü‚ÍTd‚És‚Á‚Ä‚­‚¾‚³‚¢B
-@status.c / h ‚Ö‚Ì•ª—£‚ÍAŠÖ”–¼‚Ì’u‚«Š·‚¦‚¾‚¯‚É—¯‚ß‚½‚‚à‚è‚Å‚·‚ªA
-@Žv‚í‚ʃoƒO‚ªö‚ñ‚Å‚¢‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
-
-EƒXƒpƒQƒeƒB‘Îô‚̈êŠÂ‚Æ‚µ‚ÄAƒXƒe[ƒ^ƒXŒvŽZAó‘ÔˆÙí‚ÉŠÖ‚í‚é•”•ª‚ð
-@status.c / h ‚Æ‚µ‚Ä•ª—£Bbattle.c ‚©‚ç39KB’ö , skill.c ‚©‚ç41KB’ö ,
-@pc.c ‚©‚ç38KB’öˆÚ“®‚Å‚«‚Ü‚µ‚½B­X‹­ˆø‚Å‚·‚ªAƒXƒLƒ‹Žg—p‚âUŒ‚‚È‚Ç‚Ì
-@ˆ—‚Ì—¬‚ê‚ð‚‚©‚Ý‚â‚·‚­‚·‚邽‚ß‚É‚ÍAbattle.c / skill.c ‚Ì’†g‚ð
-@Œ¸‚ç‚·•K—v‚ª‚ ‚é‚Æl‚¦‚½‚½‚ß‚Å‚·B
-
- battle_get_* => status_get_*
- skill_status_change_* => status_change_*
- pc_calcstatus => status_calc_pc
- pc_calc_sigma => status_calc_sigma
- pc_getrefinebonus => status_getrefinebonus
- pc_percentrefinery => status_percentrefinery
-
-Ebattle.c , script.c ‚ÌŠª‚«–ß‚è‚ð–ß‚·
-Enpc.c ‚̉ö‚µ‚¢•ÏX‚ð–ß‚µA‚«‚¿‚ñ‚ÆNUL ‚ð•t‚¯‰Á‚¦‚é‚悤‚É‚·‚é
-Escript.c ‚̃~ƒX‚𒼂·ijump_non_zero => jump_zero@ˆÓ–¡‚ª‹t‚É‚È‚Á‚Ä‚Ü‚µ‚½cj
-Eskill.c ‚Ì•ŠíC— ‚̃Rƒƒ“ƒgƒ~ƒX‚ðC³
-EWIN32‚ŃRƒ“ƒpƒCƒ‹‚µ‚½ŽžAÅ‘åÚ‘±l”‚ª60l’ö‚ɧŒÀ‚³‚ê‚Ä‚¢‚½ƒoƒO‚ðC³
-
- (/)
- athena.dsw , athena.dsp , bcc32_make.bat , src/login/login.dsp
- src/char/char.dsp , src/map/map.dsp
- ƒRƒ“ƒpƒCƒ‹ðŒ‚Ì•ÏX
-
- (src/map/)
- ã‚Ì•ª—£‚ɇ‚킹‚ăRƒ“ƒpƒCƒ‹ƒGƒ‰[‚Ìo‚È‚¢‚悤‚ÉC³
-
---------------------
-//1090 by Sapientia
-Eƒ`ƒƒƒbƒg‚Ì•Ö—˜‚³‚Ì‚½‚ß‚É‹©‚ԒljÁ (ƒMƒ‹ƒhƒ`ƒƒƒbƒg‚Ƌ敪‚·‚邽‚߂ɃEƒFƒ`ƒMƒV‚Ì‘O‚É [‹©‚Ô‚±‚Æ]‚ª•t‚«)
-Eatcomand_athena.conf ‚Å onlymes ‚ð 0‚Åݒ肵‚ÄŠFŽg‚¤‚悤‚ÉŠˆ«‰»
- ƒIƒŠƒWƒiƒ‹‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Å GM‚¾‚¯Žg‚¤‚±‚Æ‚ª‚Å‚«‚é‚悤‚Éݒ肵‚Ü‚µ‚½.
-E@mes [Œ¾‚¤‚±‚Æ] ‚ÅŽg—p
-
- (src/map)
- atcommand.c atcommand_charkami ’ljÁ
- atcommand.h
- clif.c clif_onlymessage ’ljÁ
- clif.h
- (src/conf)
- atcommand_athena.conf onlymes ’ljÁ
- help.txt @mes à–¾’ljÁ
-
-
---------------------
-//1089 by ¹
-EVC.NET2003‚ŃRƒ“ƒpƒCƒ‹‚·‚é‚Æ‘å—Ê‚ÉŒx‚ªo‚é‚Ì‚ðC³
-E‚»‚Ì‘¼ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[“™‚Ìׂ©‚¢ƒoƒOC³
-
- (src/char)
- int_guild.c Œx‰ÓŠ‚ðC³
-
- (src/map)
- atcommand.c, battle.c, clif.c, itemdb.c, pc.c, pc.h, script.c, skill.c
- Œx‰ÓŠ‚ðC³
- npc.c Œx‰ÓŠ‚ƃoƒbƒtƒ@ƒI[ƒo[ƒtƒ[C³
-
---------------------
-//1088 by Sapientia
-EƒEƒBƒUƒhƒXƒLƒ‹ Icewall ‚±‚̃Lƒƒƒ‰ƒNƒ^[‚⃂ƒ“ƒXƒ^[‘«‚à‚Æ‚ÉÝ’u‚³‚ê‚邱‚Æ‚ð–hŽ~
-Eƒ[ƒhƒiƒCƒgƒXƒLƒ‹ Berserk Žg—p‚ÌŽž HP‚ª 1/3‚É‚È‚ê‚Ήñ•œ‚·‚éƒoƒOC³
-
- (src/map)
- pc.c Berserk C³
- skill.c Icewall C³
-
---------------------
-//1087 by End_of_exam
-
-Eƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚Ɉ³k‹@”\‚ð’ljÁ(1MB’ö‚Ék‚Ü‚é‚悤‚Å‚·)
-Enpc.c ‚ÌŠª‚«–ß‚è‚ðC³(Ž¿–âƒXƒŒƒbƒh Part14 , 111)
-Emap_athena.conf ‚̃Rƒƒ“ƒgƒAƒEƒg‚ðC³(AthenaŽG’kƒXƒŒƒbƒhPart7 , 146)
-EWindows —p‚Ì‹N“®ƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚Ä‚Ý‚é(eAthena ‚Ì‚ðŒ³‚É‰ü‘¢j
-
- (/)
- win32_start.bat Windows —p‚Ì‹N“®ƒtƒ@ƒCƒ‹
-
- (src/map)
- map.c ˆ³k‹@”\‚̒ljÁ
- npc.c Šª‚«–ß‚è‚ðC³
-
- (src/common)
- grfio.c decode_zip , encode_zip ‚̃GƒNƒXƒ|[ƒg
- grfio.h decode_zip , encode_zip ‚̃GƒNƒXƒ|[ƒg
-
- (conf/)
- map_athena.conf C³
-
---------------------
-//1086 by End_of_exam
-
-Žå‚É1085‚̃oƒOC³‚¾‚Á‚½‚è‚à‚µ‚Ü‚·B
-u‚Ä‚ß[A‚P‚©‚ç‘‚«’¼‚µ‚₪‚Á‚Äv‚Æ‚¢‚¤“Ë‚Áž‚Ý‚¾‚¯‚ÍŠ¨•Ù‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚¹B
-
-Eƒf[ƒ^\‘¢‚Ì‘å•ÏX(map.c)
- ƒ}ƒbƒv‚ð휕’ljÁ‚µ‚Ăೂµ‚­“®‚­‚悤‚É•ÏX
- ƒ}ƒbƒvƒLƒƒƒbƒVƒ…쬒†‚É‹­§I—¹‚·‚é‚ÆÄ‹N“®Žž‚É•sˆÀ’è‚É‚È‚éƒoƒO‚ðC³
- ˆ³kƒtƒ‰ƒO‚̒ljÁiŽù—v‚ ‚é‚Ì‚©•s–¾Bcompress‚ð^‚É‚·‚é‚ÆAŒ»Ý‚̃\[ƒX‚Å
- “Ç‚ß‚È‚­‚È‚è‚Ü‚·Bj
-
-E‚È‚ñ‚©Õ“®‚ª‚ ‚₵‚·‚¬‚é‚Ì‚ÅAƒrƒbƒgƒ}ƒbƒvˆ—‚ð“P”p‚·‚é(map.c map.h)
- npc_touch_areanpc : some bug@‚ª‚½‚­‚³‚ño‚Ä‚­‚é -> Œ´ˆö•s–¾H
- ‹°‚ç‚­’Ês‰Â”\”»’肪³‚µ‚­Ý’肳‚ê‚Ä‚¢‚È‚¢‚Á‚Û‚¢‚ñ‚Å‚·‚ª“ä‚Å‚·B
- ”read_map_from_bitmap ‚ÌÝ’è‚ðÈ‚­‚ƃƒOƒCƒ“Žž‚É—Ž‚¿‚éƒoƒO‚ðC³
-
-EƒLƒƒƒbƒVƒ…“à‚É‘S‚Ẵ}ƒbƒv‚ª‚ ‚ê‚ÎAgrf –³‚µ‚Å‚à“®ì‚·‚é‚悤‚É•ÏXB(grfio.c map.c)
-
- (src/map)
- map.c ƒoƒOC³‘¼
- map.h ƒoƒOC³‘¼
-
- (src/common)
- grfio.c ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢Žž‚Éexit ‚ðŒÄ‚΂Ȃ¢‚悤‚ÉC³
-
---------------------
-//1085 by zalem
-Eƒ}ƒbƒvƒf[ƒ^‚Ì“Ç‚Ýž‚݂̓rƒbƒgƒ}ƒbƒvƒtƒ@ƒCƒ‹‚©‚çs‚È‚¦‚é‚悤‚È‹@”\’ljÁ
-
- grfƒtƒ@ƒCƒ‹‚©‚çˆê“xƒrƒbƒgƒ}ƒbƒvƒtƒ@ƒCƒ‹‚ð쬂µ‚ĈȌã‚Í‚»‚Ì
- 쬂³‚ꂽƒrƒbƒgƒ}ƒbƒvƒtƒH[ƒ}ƒbƒg‚̃tƒ@ƒCƒ‹‚©‚çƒ}ƒbƒvî•ñ‚ð“Ç‚Ýž‚Þ
- ‚Æ‚¢‚¤•û–@‚ð̂邱‚Æ‚É‚æ‚Á‚ÄAmap-server‚ª—§‚¿ã‚ª‚鎞ƒ}ƒbƒvî•ñ‚ð“Ç‚ÝŽæ‚é
- ‚Ì‚ÉŠ|‚©‚鎞ŠÔ‚ª‚Ù‚Æ‚ñ‚Ç‚È‚­‚È‚éA‚Ü‚½1int‚É32ŒÂ‚̃Zƒ‹î•ñ‚ªŠi”[‚Å‚«‚é‚Ì
- ‚ÅAmapî•ñ‚ÉŠÖ‚·‚郃‚ƒŠŽg—p—Ê‚à‚RŠ„‚è‹ß‚­‚Ü‚ÅŒ¸‚é‚Ì‚Å(‚»‚Ì‚©‚í‚è‚É
- ‚ ‚é’ö“xCPU‚Ì•‰’S‚ª‘å‚«‚­‚È‚é)A’ljÁ‚µ‚Ä‚Ý‚½B
- conf/map_athena.conf‚Ìread_map_from_bitmapƒIƒvƒVƒ‡ƒ“‚Å—˜—p‚·‚é
- ‚©‚Ç‚¤‚©‚ðŽw’è‚Å‚«A‚»‚̉º‚É‚ ‚émap_bitmap_path‚Ńtƒ@ƒCƒ‹–¼‚ð•ÏX‚·‚é
- (ƒfƒtƒHƒ‹ƒg‚Ådb/map.info)
- ‚Ü‚¾ƒeƒXƒg’iŠK‚È‚Ì‚ÅA“±“ü‚Í‚²Td‚É(ˆê‰žLinux‚ÅA‚¢‚ë‚¢‚ë‚Æ
- ƒeƒXƒg‚µ‚Ä‚Ý‚½‚ª...)
-
-Emap_getcell()‚É4”Ô–Úˆø”‚̒ljÁ‚Æmap_setcell()‚Ì4”Ô–Úˆø”‚Ì•ÏX
-
- ŠÖ”‚Ì—˜—pˆÓ}‚ª‚í‚©‚è‚â‚·‚¢‚悤‚ÉA‚»‚µ‚Ä‚±‚ê‚©‚ç‚Ì•ÏX‚ð—eˆÕ‚É‚·‚é
- ‚½‚ß‚ÉAmap_getcell()‚Æmap_setcell()‚Ì‚»‚ꂼ‚ê4”Ԗڂ̈ø”‚ð’ljÁA•ÏX‚µ‚Ä‚Ý‚½A
- map_getcell()‚Ì4”Ԗڂ̈ø”‚Ímap.h‚Å’è‹`‚³‚ê‚Ä‚éCELL_CHK—ñ‹“Œ^Amap_setcell()
- ‚Ì4”Ԗڂ̈ø”‚Ímap.h‚Å’è‹`‚³‚ê‚Ä‚éCELL_SET—ñ‹“Œ^‚ð‚Æ‚é‚悤‚É•ÏX.‚Ü‚½Aã‚Ì
- Feature‚ɑΉž‚·‚邽‚ßAmap_getcell()‚ðƒ|ƒCƒ“ƒ^‚É•ÏX‚µ‚½B
-
- Žå‚È•ÏX“_F
-
- src/map/map.h read_gat(),read_gatp()ƒ}ƒNƒ‚Ì•ÏX
- —ñ‹“Œ^ CELL_CHK,CELL_SET‚ð’ljÁ,map_getcell(),map_setcel()—p
- map_data\‘¢‘̂Ƀƒ“ƒo[int* gat_fileused[MAX_CELL_TYPE+2]’ljÁ
- src/map/map.c map_getcell()‚ðŠÖ”Œ^ƒ|ƒCƒ“ƒ^‚É•ÏX,map_getcellp()‚ðread_gatp()
- ‚Ì‚½‚߂ɒljÁ,ŽÀۂɉº‚ÌŽl‚‚̊֔‚Ì‚Ç‚Á‚¿‚ÉŽw‚·‚©‚Ímap_read_flag‚É‚æ‚é
- map_getcell_gat(),map_getcell_bitmap() ’ljÁ
- map_getcellp_gat(),map_getcellp_bitmap() ’ljÁ
- map_setcell() •ÏX
- map_createbitmap() ’ljÁ
- map_readmapfromfile() ’ljÁ
- map_readallmap() •ÏX
- map_config_read() •ÏX
- do_final() •ÏX
- ˆÈ‰º‚Ì*.cƒtƒ@ƒCƒ‹“à‚Ìmap_getcell(),map_setcell(),read_gat(),read_gatp()‚ðŒÄo‚µ‚½•”•ª‚ð‚·‚×‚Ä•ÏX
- src/map/atcommand.c
- src/map/mob.c
- src/map/npc.c
- src/map/path.c
- src/map/pc.c
- src/map/pet.c
- src/map/skill.c
-
- conf/map_athena.conf read_map_from_bitmap,map_bitmap_path ’ljÁ
-
---------------------
-//1084 by lizorett
-EŒoŒ±’lŠl“¾‚̃oƒOC³(ƒoƒO•ñƒXƒŒƒbƒh part7 >>134)
- (src/map)
- mob.c ŒoŒ±’lŒvŽZC³
-
---------------------
-//1083 by End_of_exam special thanks to lizorett‚³‚ñ
-Eƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚̒ljÁ
- (common/socket.c common/socket.h login/login.c char/char.c map/clif.c map/chrif.c)
- ƒ\ƒPƒbƒg‚ð•Â‚¶‚鎞‚̈—‚Ì—¬‚ꂪ•ÏX‚É‚È‚è‚Ü‚·B¡‚܂Ń\ƒPƒbƒg‚ð•Â‚¶‚éꇂÍA
- ‚Ü‚¸session[fd]->eof ‚ð^‚É‚µ‚½ŒãAƒp[ƒYƒ‹[ƒ`ƒ““à‚Ō㈗iƒƒ‚ƒŠ‰ð•ú‚È‚Çj
- ‚µ‚Ä‚¢‚Ü‚µ‚½B‚Å‚·‚ªAclose(fd); ‚ª‚Qd‚ÉŽÀs‚³‚ê‚ăT[ƒo[‚ª—Ž‚¿‚é‚È‚Ç‚Ì
- ƒoƒO‚ª”­¶‚µ‚Ä‚¢‚½‚èAˆ—‚Ì—¬‚ꂪ‚‚©‚Ý‚É‚­‚¢‚Æ‚¢‚Á‚½——R‚©‚çAsocket.c “à•”‚Å
- ‘S‚Ĉ—‚·‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½Bƒ\ƒPƒbƒg‚ð•Â‚¶‚鎞‚ÌŽå‚È—¬‚ê‚ÍŽŸ‚Ì’Ê‚è‚Å‚·B
-
- 1. ƒ\[ƒX“à‚©‚çsession[fd]->eof = 1; ‚ð‚·‚é
- 2. socket.c “à‚©‚çsession[fd]->destruct() ‚ªŒÄ‚΂ê‚é
- 3. ƒƒ‚ƒŠ‚̉ð•ú•Œãˆ—(socket.c delete_session“à•”)
-
- close(fd) ‚ÍAsession[fd]->eof = 1; ‚É’u‚«Š·‚¦‚Ü‚µ‚½(#define)B
- ‚Ü‚½Adelete_session() ‚𖾎¦“I‚ɌĂԕK—v‚Í‚ ‚è‚Ü‚¹‚ñB
-
-Eƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³(map/map.c map/pc.c map/chrif.c)
- ƒ\ƒPƒbƒgØ’fŽž‚É‘qŒÉƒf[ƒ^‚̃LƒƒƒbƒVƒ…‚ðÁ‚·‚悤‚É•ÏX
- ‚QdƒƒOƒCƒ“Žž‚Ƀ}ƒbƒvƒT[ƒo[‚ªˆá‚Á‚½ê‡‚É‚àØ’f‚Å‚«‚é‚悤‚ÉC³
-
-EŒÃ‚¢ƒo[ƒWƒ‡ƒ“‚ŃƒOƒCƒ“‚µ‚½Žž‚ÉmapŽI‚ª—Ž‚¿‚éƒoƒO‚ðC³(map/clif.c)
- clif_parse() “à•”
-
- if(packet_db[cmd].len==0) {
- -> if(cmd<MAX_PACKET_DB && packet_db[cmd].len==0) {
-
-Egcc ‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚Étimer.c ‚Åwarning ‚ªo‚½‚Ì‚ðC³(common/timer.c)
- timer.c:116: warning: `check_timer_heap' defined but not used
-
- (src/common/)
- socket.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
- socket.h ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
- timer.c warning C³
-
- (src/map/)
- clif.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
- chrif.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
- map.c ƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³
- pc.c ƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³
-
- (src/char/)
- char.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
-
- (src/login/)
- login.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
-
---------------------
-//1082 by lizorett (2004/12/18) special thanks to –¼–³‚µ—l@‚‡—‚‚…
-E”’nŽæ‚è‚ðƒ{ƒX‚É–³Œø‚É•ÏX
-E1079‚Ì•ÏX•”•ª‚ÉNULLƒ`ƒFƒbƒN‚ð’ljÁ
-EƒJ[ƒh‚ÌŒø‰Ê‚ªæ‚ç‚È‚¢ƒXƒLƒ‹‚ɃGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“Œø‰Ê‚ªæ‚ç‚È‚¢‚æ
- ‚¤‚É•ÏX
-EƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ÌŒø‰Ê‚ɶŽè‚ªÚ‚ç‚È‚¢‚悤‚É•ÏX
-EƒTƒNƒŠƒtƒ@ƒCƒX‚ðŽÀ‘•
-EƒXƒg[ƒ€ƒKƒXƒg‚̃mƒbƒNƒoƒbƒN‚ªƒXƒLƒ‹Žw’èˆÊ’u‚ð’†S‚Æ‚·‚é‚悤•ÏX
-EƒXƒLƒ‹‚ÌŽË’ö‹——£‚©‚ç1ƒZƒ‹—£‚ꂽꊂðŽw’肵‚ăXƒLƒ‹‚ðŽg‚¤‚Ɖ½‚à‹N‚±‚ç‚È‚¢–â‘è
- ‚ðC³
-EŒoŒ±’l‚Ì”z•ª‚ðC³(ƒ_ƒ[ƒW‚ð—^‚¦‚½l‚ª‚¢‚È‚¢ê‡‚âA“Ń_ƒ[ƒW‚ª‚ ‚éꇂɌo
- Œ±’l‚ª­‚È‚­‚È‚Á‚Ä‚¢‚½)
-E‘•”õ‚µ‚Ä‚¢‚È‚¢‰ÓŠ‚ւ̃XƒgƒŠƒbƒvƒXƒLƒ‹‚ªŽ¸”s‚·‚é‚悤•ÏX
-Eƒpƒbƒ`ƒAƒbƒvƒXƒŒƒbƒh Part 6H‚Ì>>116,>>125,>>126 ‚̃tƒ@ƒCƒ‹‚ð”O‚Ì‚½‚߃}[ƒW
-
- (db/)
- skill_db.txt, skill_cast_db.txt, skill_require_db.txt
- - ƒTƒNƒŠƒtƒ@ƒCƒX‚Ì‹Lq‚ðC³/’ljÁ
- (src/map/)
- battle.c - ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚Ì•ÏX
- - ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌŽÀ‘•
- - ƒXƒg[ƒ€ƒKƒXƒg‚̃mƒbƒNƒoƒbƒN•ûŒü‚ð•ÏX
- - ”’nŽæ‚è‚ðƒ{ƒX‚É–³Œø‚É•ÏX
- skill.h - SC_SACRIFICE‚ð’ljÁ
- skill.c - ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌŽÀ‘•
- - skill_castend_damage_id()‚ÌMG_FROSTDIVER/MG_STONECURSE‚É
- NULLƒ`ƒFƒbƒN‚ð’ljÁ
- mob.c - ŒoŒ±’l‚Ì”z•ª‚ðC³
- script.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>125)
- npc.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>126)
- (src/common)
- core.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>116)
-
---------------------
-//1081 by End_of_exam
-Euƒ‹[ƒv\•¶‚Ì•û‚àŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢v‚Æ‚¢‚¤—v–]‚ð–á‚Á‚½‚Ì‚ÅA
-@for , while , do - while \•¶‚𓱓üBŒÂl“I‚É—]‚èŽù—v‚Í–³‚¢‚ÆŽv‚¤‚Ì‚Å‚·‚ªcB
-
-Eelse‚ªŠ®‘S‚ɉðÍ‚Å‚«‚Ä‚È‚©‚Á‚½ƒoƒO‚ðC³B
-Eswitch ‚Ìbreak; ‚ªêŠ‚É‚æ‚Á‚Ă̓Rƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚éƒoƒO‚ðC³B
-
- (src/map/)
- script.c : \•¶‚ðŠg’£BFX®—B
-
- (doc/)
- script_ref.txt : ã‚ÌC³‚ɇ‚킹‚Ä•ÏXB
-
---------------------
-//1080 by End_of_exam
-
-EƒXƒNƒŠƒvƒg‚ð if - else if - else \•¶ , switch \•¶‚ɑΉž‚³‚¹‚Ü‚µ‚½B
-@‘½dƒlƒXƒg‚ª‰Â”\‚Å‚·‚Ì‚ÅA¡‚Ü‚Å‚æ‚茩‚â‚·‚¢ƒXƒNƒŠƒvƒg‚ª‘‚¯‚é‚ÆŽv‚¢‚Ü‚·B
-@if(aa) { aaa(); } else if(bb) { cc; if(dd) { ee() } else { ff(); } }
-@‚»‚ê‚É”º‚¢A__ ‚©‚çŽn‚Ü‚é•Ï”‚⃉ƒxƒ‹‚ð—p‚¢‚é‚ÆA•s“s‡‚ª¶‚¶‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
-
-EƒXƒNƒŠƒvƒg‚ÉV‚µ‚¢ŠÖ”(selectŠÖ”Emenu–½—ß‚ÌŠÖ””Å)‚ð’ljÁ‚µ‚Ü‚µ‚½B
-
- (src/map/)
- script.c : \•¶‚ðŠg’£
- npc.c : npc_perse_script ‚ÌC³( { , } ‚̃lƒXƒg‚ɑΉž )
-
- (script/)
- npc/town/npc_town_alberta.txt : ˆêƒJŠ goto ‚ª”²‚¯‚Ä‚½‚Ì‚ÅC³
- sample/npc_debug_pota.txt : switch , select ‚ðŽg‚Á‚Ä‘‚«’¼‚µ
- (ƒfƒoƒbƒO‚ÉŽg‚킹‚Ä–á‚¢‚Ü‚µ‚½)
-
- (doc/)
- script_ref.txt : ã‚ÌC³‚ɇ‚킹‚Ä•ÏX
---------------------
-//1079 by Yuuki
-EΉ»’†‚ɃXƒg[ƒ“ƒJ[ƒX‚ðŽg‚¤‚ÆΉ»‰ðœ
-EFD‚ŃXƒLƒ‹’ljÁŒø‰Ê‚ðŽg‚¤‚Æ•X‰»’†ƒ_ƒ[ƒW”»’è‚Åæ‚ÉŠ„‚ê‚Ä‚à‚¤ˆê“x•X‰»”»’肪‚­‚é‚̂ŃXƒLƒ‹’ljÁŒø‰Ê‚‚©‚킸
-EBB‚Ň–°Î‰»•X‰»‚ªŠ„‚ê‚È‚¢ƒoƒO‚ÌC³(“ÆŽ©‚̃_ƒ[ƒW”»’èŽg‚Á‚Ä‚½‚Ì‚ÅÁ‚µ‚ij‹K‚̃_ƒ[ƒW”»’è‚É–ß‚µ‚½)
-EƒfƒBƒŒƒC0‚̃XƒLƒ‹‚Éadelay/2’ljÁ(GŽI‚ÅTSŽg‚Á‚ÄŒŸØ‚µ‚½Œ‹‰ÊÅ‚à‚±‚ꂪ‹ß‚©‚Á‚½’ÊíUŒ‚‚æ‚è‚Í‚â‚©‚Á‚½‚Ì‚Å)
-
- (src/map)
- skill.c
-
---------------------
-//1078 by End_of_exam
-
-EVisual C++ 6.0 / bcc32 ‚ŃRƒ“ƒpƒCƒ‹o—ˆ‚é‚悤‚ÉC³(•Ê“rzlib.dll ‚ª•K—v)
-E1074‚ÍŒ‡”Ô‚É‚µ‚Ü‚·BFX‚Æ‚²–À˜f‚ð‚©‚¯‚½Ž–‚ð‚¨˜l‚Ñ‚µ‚Ü‚·B
-
-––@’ˆÓ@––
- ¡‰ñ‚̃o[ƒWƒ‡ƒ“‚ÌŠ®‘S‚È“®ìŠm”F‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñil’Œ”ňµ‚¢‚É‚µ‚Ä‚­‚¾‚³‚¢jB
- –{Ši“I‚ȉ^—p‚É“¥‚ÝØ‚é‘O‚É‚ÍA•K‚¸“®ìŠm”F‚ð‚·‚é‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
- ꇂɂæ‚Á‚Ä‚ÍAƒRƒ“ƒpƒCƒ‹o—ˆ‚È‚¢A•s³‚È“®ì‚É‚È‚éc“™X‚Ì–â‘肪‹N‚±‚é‚©‚à
- ‚µ‚ê‚Ü‚¹‚ñ‚ªA‚»‚Ì‚Æ‚«‚ÍA‘›‚ª‚¸AQ‚Ä‚¸‚ÉAƒl\‚Ì~—Õ‚ð‘҂‚悤‚¨Šè‚¢‚µ‚Ü‚·B
-
-–– ‚¨Šè‚¢ ––
- ‚±‚̃pƒbƒ`‚ðŠ®‘S”Å‚É‚µ‚Ä‚­‚ê‚é•ûAŽg—pŠ´ƒŒƒ|[ƒg‚ð“Še‚µ‚Ä‚­‚ê‚é•û‚ð•åW‚µ‚Ü‚·B
- ƒpƒbƒ`‚ðŒöŠJ‚·‚é‚‚¢‚Å‚ÉA‘å—Ê‚Ìwarning ‚ðC³‚µ‚Ä‚­‚ꂽ‚çŠð‚µ‚¢‚È`A‚ÆŽv‚Á‚Ä‚Ý‚½‚èB
-
- (/)
- bcc32_make.bat , bcc32_clean.bat
- bcc32 ‚ŃRƒ“ƒpƒCƒ‹ / ƒNƒŠ[ƒ“@‚ðŠÈ’P‚É‚·‚邽‚߂̃oƒbƒ`ƒtƒ@ƒCƒ‹B
-
- athena.dsp , athena.dsw , src/login/login.dsp , src/char/char.dsp ,
- src/map/map.dsp
- Visual C++ —p‚̃vƒƒWƒFƒNƒgƒtƒ@ƒCƒ‹ & ƒ[ƒNƒXƒy[ƒX
-
- (src/)
- ƒRƒ“ƒpƒCƒ‹o—ˆ‚é‚悤‚ÉFXC³B
-
- (src/common/timer.c)
- “ÆŽ©‚̎蔲‚«ƒAƒ‹ƒSƒŠƒYƒ€i‚Q•ªƒ\[ƒgj‚ðÌ—p‚µ‚½ƒo[ƒWƒ‡ƒ“B
-
---------------------
-//1077 by sylpheed
-EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
-E‰º‹L“ñ‚‚ðŽæ‚èž‚Ý
-Ž¿–âƒXƒŒƒbƒh Part14-41 Plala‚³‚ñ
-ƒoƒO•ñƒXƒŒƒbƒh part7-68 ...‚³‚ñ
-
-1074‚ÍŽæ‚èž‚ñ‚Å‚¢‚Ü‚¹‚ñB
-
---------------------
-//1076 by mare
-EŠØ‘Œö’m‚Ì’Ê‚èƒAƒŠƒX‚ƃWƒ‹ƒ^ƒX‚̃GƒT‚Ì•ÏXB
-EGM‚̃Aƒuƒ‰ƒJƒ^ƒuƒ‰ê—pƒXƒLƒ‹‚̃tƒ‰ƒO‚ªÁ‚¦‚Ä‚½‚Ì‚Å•œŠˆB
-Eƒuƒ‰ƒbƒNƒXƒ~ƒXƒMƒ‹ƒhˆõ‚ɃvƒŠ[ƒXƒg‚Ìꇂ̃ZƒŠƒt‚ð’ljÁB
-EƒNƒ‰ƒXƒ`ƒFƒ“ƒW‚Å‘S‚Ä‚ÌŽw’èIDƒ{ƒX‚ªo‚é‚悤‚Éi‚È‚Á‚Ä‚é‚Æ‚¢‚¢‚È‚Ÿj
- (db)
- pet_db.txt
- (conf)
- battle_athena.conf
- (script/npc/job)
- npc_job_10blacksmith.txt
- (src/map)
- mob.c
---------------------
-//1075 by kag
-E‹|Žè—p‚ÌŽwŠÑ‚ÌŒø‰ÊŽÀ‘•‚Ì•zÎ
-EŒø‰Ê‚ª‚Í‚Á‚«‚è‚Æ‚µ‚È‚¢‚Ì‚Åitem_db‚ÌC³‚Í‚¢‚ê‚Ä‚¢‚Ü‚¹‚ñB
-E1075”Ô‚Å‚¢‚¢‚Ì‚©‚È‚Ÿ‚ÆŽv‚Á‚½‚èB
-
- (db)
- const.txt
- bWeponAtk=1073‚ÆbWeponAtkRate=1074‚ð’ljÁ
-
- (src/map)
- battle.c
- int battle_get_baseatk()C³
- static struct Damage battle_calc_pc_weapon_attack()C³
- map.h
- int weapon_atk[16],weapon_atk_rate[16];
- SP_WEPON_ATK,SP_WEPON_ATK_RATE, // 1073-1074‚ð’ljÁ
- pc.c
- memset(sd->weapon_atk,0,sizeof(sd->weapon_atk));
- memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));‚ð’ljÁ
-
- pc_bonus2() C³
- (doc)
- item_bonus.txt
- bWeponAtk,bWeponAtkRate,bHPDrainValue,bSPDrainValue@’ljÁB
-
---------------------
-//1073 by LP@@
-EƒAƒRƒXƒLƒ‹‚̈ꕔ‹y‚уTƒCƒgƒXƒLƒ‹‚ÌC³(“ú–{‚É‚Í¡ŒŽ––‚É—ˆ‚锤H@2004/12/06)
-‘¬“xŒ¸­‚͈ړ®‘¬“xŒ¸­—Ê‚ªAƒVƒOƒiƒ€ƒNƒ‹ƒVƒX‚ͬŒ÷—¦ADEFŒ¸­—Ê‚Ì‘‰Á—Ê‚ª
-‚Í‚Á‚«‚肵‚È‚©‚Á‚½‚̂ŘM‚Á‚Ä‚¢‚Ü‚¹‚ñB
- (src/map)
- battle.c
- ƒf[ƒ‚ƒ“ƒxƒCƒ“AƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“ŒvŽZŽ®‚ðC³B
- skill.c
- ƒ‹ƒAƒtAƒTƒCƒg‚Ì—LŒø”͈͂ðC³i—¼•û10x10¨ƒ‹ƒAƒt5x5,ƒTƒCƒg7x7jB
-
- (db)
- skill_cast.db
- ƒAƒNƒAƒxƒlƒfƒBƒNƒ^‚̉r¥‹y‚уfƒBƒŒƒC‚ðC³B
-
-//1072 by kag
-E“]¶ƒXƒLƒ‹‚ð’†S‚ÉC³
- (src/map)
- battle.c
- –‚–@—Í‘•‚ðƒXƒLƒ‹ƒŒƒxƒ‹*5%‚ÉC³B
- –‚¿‚É–î‚ÌATK‚ªæ‚ç‚È‚­‚È‚é‚悤‚ÉC³B
- ƒI[ƒ‰ƒuƒŒ[ƒh‚̒ljÁƒ_ƒ[ƒW‚ð100‚ÉC³B
- ƒo[ƒT[ƒN‚Ì—^ƒ_ƒ‚ð‚Q”{‚É‚È‚é‚悤‚ÉC³B
- ƒwƒbƒhƒNƒ‰ƒbƒVƒ…‚ÌŒvŽZŽ®‚ðC³B
- ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚ÌŒvŽZŽ®‚¾‚¯C³B
- ƒvƒŒƒbƒVƒƒ[‚ÌŒvŽZŽ®‚ðC³B
- ˜A’Œ•öŒ‚‚ÌŒvŽZŽ®‚ðC³B
- ƒ\[ƒhƒŠƒWƒFƒNƒg‚Ì”½ŽË—¦‚ðƒXƒLƒ‹ƒŒƒxƒ‹*15%‚ÉC³B
- ƒAƒ[ƒoƒ‹ƒJƒ“‚ÌŒvŽZŽ®‚ðC³B–î‚Ì‘®«‚ªæ‚é‚悤‚ÉC³B
- ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ÌŒvŽZŽ®‚ðC³BŠæ‹­ƒtƒ‰ƒO‚Å‚Pƒ_ƒ‚É‚È‚é‚悤‚ÉC³B
- ƒuƒŠƒbƒcƒr[ƒg‚ðŠæ‹­ƒtƒ‰ƒO‚Å‚Pƒ_ƒ‚É‚È‚é‚悤‚ÉC³B
- ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚ð•K’†AƒJ[ƒh‚ðæ‚ç‚È‚¢‚悤‚ÉC³B
- ƒAƒVƒbƒhƒeƒ‰[‚ð–hŒä–³Ž‹A•K’†A–³‘®«AƒJ[ƒh‚ðæ‚ç‚È‚¢‚悤‚ÉC³B
- skill.c
- –‚–@—Í‘•‚É0.7•b‚̌Œè‰r¥’ljÁB
- LP@@ ‚³‚ñ‚̃AƒXƒ€ƒLƒŠƒGd•¡•s‰Â‚ð’ljÁB
-
- (db)
- skill_db.txt
- ‹¶‹CE‚ð‰r¥–WŠQ‚Å‚«‚é‚悤‚ÉC³B
- skill_cast_db.txt
- ƒvƒŒƒbƒVƒƒ[‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
- –ÒŒÕd”hŽR‚̃fƒBƒŒƒC‚ð’ljÁB
- ƒ‰ƒCƒt’u‚«Š·‚¦‚̃fƒBƒŒƒC‚ð’ljÁB
- ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
- ƒEƒCƒ“ƒhƒEƒH[ƒN‚̃fƒBƒŒƒCAŽ‘±ŽžŠÔ‚ð•ÏXB
- ƒAƒ[ƒoƒ‹ƒJƒ“‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
- ƒNƒŠƒGƒCƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚̃fƒBƒŒƒC‚ð’ljÁB
- skill_require_db.txt
- ƒI[ƒ‰ƒuƒŒ[ƒh‚ÌÁ”ïSP‚ðC³B
- ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ÌÁ”ïSP‚ðC³B
- –‚–@—Í‘•‚ÌÁ”ïSP‚ðC³B
- ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌÁ”ïSP‚ðC³B
- ƒvƒŒƒbƒVƒƒ[‚ÌÁ”ïSP‚ðC³B
- ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌÁ”ïSP‚ðC³B
- –ÒŒÕd”hŽR‚ÌÁ”ïSP‚ðC³B
- ƒŠƒWƒFƒNƒgƒ\[ƒh‚ÌÁ”ïSP‚ðC³B
-
-//1071 by ICO
-Enpc_job_09wizard.txt,npc_job_16sage.txt‚ðC³
-EŽæ‚芪‚«‚ª¢Š«ŒnƒXƒLƒ‹‚ðŽg—p‚·‚éÛ‚Ì‹““®‚ðC³
-
- (src/map)
- mob.c
- Žæ‚芪‚«‚Ì¢Š«ŒnƒXƒLƒ‹‚ð‹K§‚·‚éƒ^ƒCƒ~ƒ“ƒO‚ð•ÏX
- skill.c
- ¢Š«ŒnƒXƒLƒ‹‚Ì”­“®ðŒ‚ðC³
-
-//1070 by sylpheed
-Eƒhƒƒbƒv—¦‚̃Œ[ƒg‚²‚Æ‚Ì’²®‚ð’ljÁ
- ƒhƒƒbƒvÝ’è1`9 10`99 100`999 1000`10000‚Ō•ʂɔ{—¦‚ÆÅ’á/Å‚’l‚Ìݒ肪‰Â”\‚Å‚·
-E@weather 0 ‚ª“®‚©‚È‚¢‚Ì‚ðC³
-E“]¶“ñŽŸE‚ÌHP/SP25“㸎À‘•
-ƒhƒƒbƒv”{—¦‚ÍeAthena‚̃AƒCƒeƒ€Ží—Þ–ˆ‚ÌÝ’è‚ðˆÚA‚µ‚Ä‚à—Ç‚©‚Á‚½‚Ì‚Å‚·‚ª
-Ží—Þ–ˆ‚¾‚ƃŒ[ƒg‚ÌŠJ‚«‚ª‘å‚«‚¢ê‡‚ª‚ ‚èA‚ ‚Ü‚èˆÓ–¡‚ª‚È‚¢‚½‚ß
-‚±‚̂悤‚ÈŒ`‚ŃŒ[ƒgÚ×Ý’è‚ð’ljÁ‚µ‚Ä‚Ý‚Ü‚µ‚½B
-mob_db‚ð˜M‚é‚æ‚èŠy‚Ƀhƒƒbƒv—¦‚Ì•ÏX‚ª‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·B
-
-weather 0‚ª“®‚©‚È‚¢‚Ì‚Í——R‚ª—Ç‚­‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å
-“®‚­‚悤‚ÉC³‚·‚é‚‚¢‚Å‚ÉA‰Jƒtƒ‰ƒOÁ‹ŽŽž‚É
-“ø‚ªo‚é‚悤‚ɒljÁ‚µ‚Ä‚Ý‚Ü‚µ‚½B
-
-“]¶‚ÌHP/SP‚ÉŠÖ‚µ‚Ä‚ÍA“]¶‚µ‚Ä‚¢‚Ä‚à“ñŽŸE‚É‚È‚Á‚Ä‚È‚¢ê‡
-‘‰Á‚Í‚µ‚È‚¢‚悤‚È‚Ì‚ÅA‚»‚̂悤‚ÉŽÀ‘•‚µ‚Ä‚Ý‚Ü‚µ‚½B
-wedding_modifydisplay: yes ‚ÌŽž‚ɃhƒŒƒX/ƒ^ƒLƒV[ƒh‚ð‘•”õ‰ðœ‚·‚é‚Æ
-‘‰Á•ª‚ªÁ‚¦‚Ä‚µ‚Ü‚¢‚Ü‚·¥¥¥
-‚í‚©‚é•û‚¢‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·orz
-
- (src/map)
- atcommand.c
- @weatherŠÖ˜A‚ÌC³(case 0‚ðŽÀs‚·‚é‚悤‚ÉC³)
- ‰Jƒtƒ‰ƒO‚ðÁ‚µ‚½ê‡“ø‚ªo‚é‚悤‚É‚µ‚Ä‚Ý‚Ü‚µ‚½(JP‘ ‚ÅŽg‚¦‚é‚©•s–¾)
- (ƒ}ƒbƒvˆÚ“®‚µ‚È‚¢‚Æ“VŒó‚ªÁ‚¦‚È‚¢‚Ì‚Íragexe‚ÌŽd—l‚©‚ÈH)
- battle.c
- battle.h
- mob.c
- item_rate_detailsŠÖ˜A‚ð’ljÁ
- pc.c
- “]¶“ñŽŸEŽž‚ÌHP/SPÅ‘å’l25%‘‰Á‚ð’ljÁ
- “]¶‚µ‚Ä‚¢‚Ä‚à“ñŽŸE‚Å‚È‚¢ê‡‚ÍHP/SP‘‰Á‚Í–³‚µ‚̂悤‚Å‚·
- (conf)
- help.txt C³
- msg_athena.conf 112’ljÁ
-
- (doc)
- conf_ref.txt C³
- help.txt C³
-
-//1069 by lizorett (2004/11/26) special thanks to –¼–³‚µ—l@‚‡—‚‚…
-Eƒƒ‹ƒgƒ_ƒEƒ“‚ÌŽÀ‘•
-E–‚–@—Í‘•‚ª‰r¥‚Ì‚ ‚é–‚–@‚Å—LŒø‚É‚È‚ç‚È‚©‚Á‚½–â‘è‚ðC³
-Emap-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³(Ž¿–âƒXƒŒƒbƒh Part13 >>55)
-Emap-server‚É•s³ID‚ŃƒOƒCƒ“‚·‚é‚Æchar-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
-EƒTƒtƒ‰ƒMƒEƒ€‚ª–³‰r¥ƒXƒLƒ‹‚ÅŽæ‚èÁ‚³‚ê‚È‚¢–â‘è‚ðC³
-Ed•¡‚µ‚Ä–Ò“Åó‘Ô‚Æ‚È‚ç‚È‚¢‚悤C³
-Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚̃_ƒ[ƒW‚ðC³
-Eƒo[ƒTƒN’†‚ÉHP/SP‹zŽûA“łȂǂ̃_ƒ[ƒW‚ðŽó‚¯‚é‚悤C³
-EŒŽŒõŒ•‚ÌSP‹zŽû—Ê‚ª‘‰Á‚µ‚Ä‚¢‚­–â‘è‚ðC³(Žb’è)
-E@help‚ɃL[ƒ[ƒhŒŸõ‹@”\‚ð’ljÁ
-
- (src/map)
- battle.c - ƒ}ƒWƒbƒNƒpƒ[‚É‚æ‚éMATK‘‰Á‚ÌŽÀ‘•
- - •ŠíŠZ”j‰ó‚ðpc_break_equip()‚É‘‚«Š·‚¦
- - HP/SP‹zŽû‚ðC³
- map.h - ‘•”õ”j‰ó‚Ì’è‹`‚ð’ljÁ
- pc.c - pc_break_armor()/pc_break_weapon()‚ðAV‹K‚Ì‘•”õ”j‰ó‚Ì
- ŠÖ”pc_break_equip()‚É“‡
- - –‚–@—Í‘•‚̃R[ƒh‚ðíœ(battle.c‚Ås‚¤)
- - HP/SP‹zŽûŠÖŒW‚Ì•Ï”‚̉Šú‰»‚ð’ljÁ
- pc.h - ŠÖ”’è‹`‚ðC³
- skill.c - ƒƒ‹ƒgƒ_ƒEƒ“‚É‚æ‚é‘•”õ”j‰ó‚ðŽÀ‘•
- - –‚–@—Í‘•‚ÉŠÖ‚·‚éC³
- - d•¡‚µ‚Ä–Ò“Åó‘Ô‚Æ‚È‚ç‚È‚¢‚悤C³
- clif.c - map-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
- atcommand.c - @help‚ɃL[ƒ[ƒhŒŸõ‚ð’ljÁ("@help jobchange"‚È‚Ç)
- (src/char)
- char.c - char-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
- (db)
- const.txt - bUnbreakableHelm, bUnbreakableShield’ljÁ
- skill_cast_db.txt
- - ƒƒ‹ƒgƒ_ƒEƒ“‚Ìó‘ÔˆÙ펞ŠÔ‚ðÝ’è
-
-//1068 by huge
-Eatcommand‚ð‚¢‚­‚‚©’ljÁ‚ÆAeAthena‚©‚ç‚¢‚­‚‚©ˆÚAB(help.txtŽQÆ)
-E”ñGMƒLƒƒƒ‰‚ª@‚ÅŽn‚Ü‚é”­Œ¾‚ð‚µ‚½ŽžA‚»‚Ì‚Ü‚Ü•\Ž¦‚·‚é‚悤‚É‚µ‚½B(GMƒŒƒxƒ‹0‚̃Rƒ}ƒ“ƒh‚ÍŽÀs)
-E“V‹CƒRƒ}ƒ“ƒh‚ɇ‚킹‚ÄAmapflagÝ’è‚Å‚«‚é‚悤‚ÉB
-Escript‚ð‚¢‚­‚‚©’ljÁ‚ÆAeAthena‚©‚çˆê‚ˆÚAB
-E‰ŠúHP”{—¦‚ÆSP”{—¦‚ðbattle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
-E‘SƒLƒƒƒ‰‚ªAGM‚ɂ͈ʒuEHP‚ð’Ê’m‚³‚¹‚é‚悤battle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
-EƒhƒNƒƒhƒƒbƒv‚ɂ‚¢‚ÄAbattle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
-EGM‚̃AƒCƒeƒ€ƒhƒƒbƒv‚âŒðŠ·‚ɂ‚¢‚ÄGMƒŒƒxƒ‹‚ð§ŒÀ‚Å‚«‚é‚悤‚É‚µ‚½B
-EƒfƒBƒeƒNƒeƒBƒ“ƒOƒXƒLƒ‹C³B
-¦ƒfƒtƒHƒ‹ƒg‚Ì“ú–{ƒNƒ‰ƒCƒAƒ“ƒg‚¾‚ÆA‰J‚Å—Ž‚¿‚Ü‚·B
-
- (conf/)
- atcommand_athena.conf C³
- battle_athena.conf C³
- help.txt C³
- msg_athena.conf C³
-
- (doc/)
- help.txt C³
- script_ref.txt C³
- conf_ref.txt C³
-
- (src/map/)
- atcommand.c
- atcommnad.h
- guild.h party.h‚ð“Ç‚Þ—l‚ÉC³
- is_atcommand() C³
- atcommand() C³
- ¦ˆÚAEV‹KƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Í help.txt ‚ðŠm”F‚µ‚ĉº‚³‚¢B
- battle.c
- battle.h
- hp_rate,sp_rate,hp_meter,bone_drop ’ljÁ
- clif.c
- clif.h
- clif_spawnpc() C³
- clif_hpmeter() ’ljÁ
- guild.c
- guild.h
- guild_searchname() ’ljÁ
- guild_searchname_sub() ’ljÁ
- map.h
- “VŒó‚ÉŠÖ‚·‚éflag’ljÁ
- npc.c
- npc_parse_mapflag() C³
- party.c
- party.h
- party_searchname() ’ljÁ
- party_searchname_sub() ’ljÁ
- pc.c
- pc.h
- pc_calcstatus() C³
- pc_damage() C³
- pc_walk() C³
- pc_can_drop() ’ljÁ
- script.c
- gmcommand ˆÚA’ljÁ
- dispbottom ’ljÁ
- getusersname ’ljÁ
- recovery ’ljÁ
- petinfo ’ljÁ
- checkequipedcard ’ljÁ
- getexp íœ(set‚ðŽg‚¤‚悤‚É‚µ‚ĉº‚³‚¢)
- skill.c
- skill.h
- skill_castend_pos2() C³
-
- {AthenaŽG’kƒXƒŒƒbƒhPart7 >>54 ‚à‚Á‚³‚肳‚ñ‚Ì•ª
- ‹Lq˜R‚ꂪ‚ ‚Á‚½‚ç‚·‚¢‚Ü‚¹‚ñB
---------------------
-//1067 by kai
-EƒƒfƒBƒeƒCƒeƒBƒI‚É‚æ‚éƒq[ƒ‹‰ñ•œ—Ê‘‰Á‚ÌŒø‰Ê‚ðC³
-EƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†‚ÌC³
-EPvPŽž‚É‚¨‚¯‚éƒAƒXƒ€ƒvƒeƒBƒI‚ÌŒø‰Ê‚ðC³
-
- (src/map)
- skill.c
- 2120s@heal += heal*(skill*2)/100; //ƒƒfƒBƒeƒCƒeƒBƒI‚ÌC³
-
- battle.c
- 1723s@damage += dmg*(10+(skill * 2))/100; //ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†‚ÌC³
-
- 2598`2599A3580`3582s@ƒAƒXƒ€ƒvƒeƒBƒI‚ÌC³
- if(map[target->m].flag.pvp)‚Æ‚µƒ_ƒ[ƒWŒvŽZ‚ð2/3‚ÉC³
-
---------------------
-//1066 by lizorett (2004/11/17) special thanks to –¼–³‚µ—l@‚‡—‚‚…
-EƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬎À‘•
-EƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“ŽÀ‘•
-Eƒ\ƒEƒ‹ƒuƒŒƒCƒJ[ŽÀ‘•
-Ebattle_weapon_attack‚Å–¢‰Šú‰»‚Ì’l‚ª–ß‚³‚ê‚éƒoƒOC³
-E‘¼Žg—pSP‚Ì•ÏX“™‚Ìׂ©‚¢C³
-
- (db)
- const.txt - –Ò“Å(SC_DPoison)‚ð’ljÁ
- item_db.txt - —΃n[ƒu,—΃|[ƒVƒ‡ƒ“,–œ”\–ò‚É–Ò“Å‚ðŽ¡‚·Œø‰Ê‚ð’ljÁ
- produce_db.txt - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ÌÞ—¿‚Ì’è‹`‚ð’ljÁ
- skill_cast_db.txtƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“Aƒ\ƒEƒ‹ƒuƒŒƒCƒJ[
- ‚Ì’è‹`‚ðC³/’ljÁ
- skill_db.txt - ƒ\ƒEƒ‹ƒuƒŒƒCƒJ[/ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“/
- ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂̒è‹`‚ðC³
- - ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚̃qƒbƒg”C³
- skill_require_db.txt
- - ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ª“Å–ò‚Ì•r‚ðŽg—p‚·‚é
- ‚悤‚ÉC³
- - ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[/ƒƒeƒIƒAƒTƒ‹ƒg‚ÌŽg—pSP‚ðC³
- (src/map)
- battle.h - battle_config.cdp_rate‚ð’ljÁ
- battle.c - ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[ŽÀ‘•
- - ƒƒeƒIƒAƒTƒ‹ƒg‚ɃJ[ƒhŒø‰Ê‚ª‚©‚©‚ç‚È‚¢‚悤•ÏX
- - 4213s‚ÌðŒ‚Å–¢‰Šú‰»‚Ì’l‚ª–ß‚³‚ê‚éƒoƒOC³
- - battle_config.cdp_rate‚ð’ljÁ
- skill.h - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂ÌÞ—¿‚ª7‚‚Ȃ̂ÅAƒe[ƒuƒ‹
- ‚ð’ljÁBÞ—¿‚Ìő唂ðdefine‚Å•ÏX‚Å‚«‚é‚悤C³
- - SC_DPOISON(182)/SC_EDP(183)‚ð’ljÁ
- skill.c - –Ò“ÅŒø‰Ê‚ð’ljÁ
- - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂ðŽÀ‘•
---------------------
-//1065 by End_of_exam
-
-EƒT[ƒo[ƒ]ƒ“ƒr‰»‚ÉŽb’è‘Έ
-Ecalc_index(path.c)‚Ì•s“s‡‚ðC³
-
- (common/)
- timer.c
- TIMER_MIN_INTERVEL(ƒ^ƒCƒ}[‚ÌŬƒCƒ“ƒ^[ƒoƒ‹j‚ð’ljÁ‚µ‚Ü‚µ‚½B
- ‚»‚ê‚É”º‚¢Ado_timer() ‚Ì–ß‚è’l‚ÌÅ’á‚ð 10ms ‚©‚ç 50ms ‚É•ÏX‚µ‚Ü‚µ‚½B
-
- select‚ª10msˆÈ“à‚ÉI‚í‚ç‚È‚¢ŠÂ‹«‚¾‚ÆAƒ‚ƒ“ƒXƒ^[‚ð‘å—Ê¢ŠÒ‚µ‚½Žž‚È‚Ç‚ÉA
- ƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‚̃pƒPƒbƒg‚É”½‰ž‚µ‚È‚­‚È‚é–Í—l‚Å‚·B
- ƒ[ƒJƒ‹ƒeƒXƒgiƒ‚ƒ“ƒXƒ^[‘å—Ê¢ŠÒj‚ð‚µ‚Ä‚Ý‚½‚Æ‚±‚ëA25ms‚É•ÏX‚µ‚½Žž“_‚Å
- ‰ü‘P‚µ‚Ü‚µ‚½‚ªAŠÂ‹«‚É‚æ‚Á‚Ä‚Í50ms‚Å‚à•s\•ª‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- ‚»‚ÌꇂÍATIMER_MIN_INTERVEL‚ð‘‚₵‚Ä—lŽq‚ðŒ©‚Ä‚­‚¾‚³‚¢B
-
- “¯—l‚ÌŒ»Û‚Æ‚µ‚ÄA‘½”‚̃Nƒ‰ƒCƒAƒ“ƒg‚ªÚ‘±‚·‚é‚ƃT[ƒo[‚ª”½‰ž‚µ‚È‚­‚È‚é
- ‚Æ‚¢‚¤‚Ì‚ª‚ ‚è‚Ü‚·‚ªA‚±‚̃pƒbƒ`‚É‚æ‚Á‚Ä‚ ‚é’ö“x‰ü‘P‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-
- (map/)
- map.h : MAX_WALKPATH
- path.c “à‚Ì calc_index‚ª•s“s‡‚ð‹N‚±‚·(48*48-1 = 1000 1111 1111(b)) ‚½‚ßA
- MAX_WALKPATH‚ð 48 ‚©‚ç 32 ‚É•ÏX‚µ‚Ü‚µ‚½B(32*32-1 = 0011 1111 1111(b))
-
- #define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
---------------------
-//1064 by nameless
-EGCC 3.3.0/3.3.1‚ª“à•ï‚·‚é0/0=•Ï”Å‘å’l‚Ì–â‘è‘Îô(int:65535/long:4294967294)
-E–‚–@–hŒäE–hŒäE‘®«–hŒä‚ª³‚µ‚­“K—p‚³‚ê‚È‚¢–â‘è‚ðC³
-Eƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ð’P‘Ì–‚–@‚̃R[ƒh‚ÉC³‚µAŽô‚¢Œø‰Ê‚ðŽÀ‘•
-
- (src/map)
- skill.c
- 442`448s •s“™†[<]‚ð[>]‚ÉC³
- 512`519s •s“™†[>]‚ð[<]‚ÉC³
- 529`538s ƒRƒ“ƒpƒCƒ‰ƒoƒO‚Ì’ù³•û–@‚Æ—á/*`*/‚Ì•”•ª‚ð
- gcc‚̃o[ƒWƒ‡ƒ“‚ɇ‚킹‚Ķ‚©‚µ‚½‚èŽE‚µ‚½‚è
- ‚µ‚Ä‚­‚¾‚³‚¢B3.3.2‚©‚ç‚Í’¼‚Á‚Ä‚¢‚é‚悤‚Å‚·
- 1857s ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ð’ljÁ
- 660`664s ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌŽô‚¢Œø‰Ê‚ð’ljÁ
- (src/char)
- char.c
- C³‚µ‚«‚ê‚Ä‚¢‚È‚©‚Á‚½•”•ª‚ðC³‚µ‚Ü‚µ‚½B
-
---------------------
-//1063 by ŽµŽ
-EŒŽŒõŒ•‚ÌŒø‰ÊŽÀ‘•
-E¶ŽèƒJ[ƒh‚É‚æ‚éA•ŠíUŒ‚Žž‚ÌHP/SP‹zŽûŒø‰Ê‚ª‰EŽè‚ɉe‹¿‚·‚é—l‚ÉC³(–{ŽIŽd—l)
- (left_cardfix_to_right‚ªyes‚ÌŽž‚Ì‚ÝBno‚¾‚Æ]—ˆ’Ê‚è)
-
- (db)
- const.txt
- bHPDrainValue=1071‚ÆbSPDrainValue=1072‚ð’ljÁ
- item_db.txt
- ŒŽŒõŒ•‚ÌEquipScript‚Ébonus2 bSPDrainValue,100,3‚ð’ljÁ
-
- (src/map)
- battle.c
- battle_weapon_attack() C³
- map.h
- short hp_drain_value,sp_drain_value,hp_drain_value_,sp_drain_value_;‚ð’ljÁ
- SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1071-1072‚ð’ljÁ
- pc.c
- pc_bonus2() C³
-
---------------------
-//1062 by nameless
-EƒpƒPƒbƒg‘—ŽóM‚ł̌둗MC³
-EƒoƒO•ñƒXƒŒƒbƒh part7 ‚©‚ç‚ÌŽæ‚èž‚ÝEC³ >> 56,57,58
-Efix1059‚ÌŽæ‚èž‚Ý
-EƒnƒCƒEƒBƒY‚̃lƒCƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌŽÀ‘•(eAŽæ‚èž‚Ý)
-ECPUÅ“K‰»ƒR[ƒh‚ÌC³(athlonŒn)E’ljÁ(Œºl” /Linux Zaurus)
-
- (/)
- Makefile
- athlonŒnÅ“K‰»‚ÌC³
- Œºl” (Kuro-Box 200MHz”Å[PPC 603x])
- Œºl” (Kuro-Box 266MHz”Å[PPC 604x])
- Linux Zaurus (SL-C7xx)
- ‚ÌÅ“K‰»ƒR[ƒh‚ð‹Lq
-
- (db)
- skill_cast_db.txt
- 400,500,1200:1600:2000:2400:2500,0,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
- (src/map)
- clif.c
- clif_parse() C³
- (src/char)
- char.c
- 1367s cmd = RFIFOW(fd,0);’ljÁ
- (src/map)
- skill.c
- switch(skillid)‚Écase HW_NAPALMVULCAN:ˆÈ‰º20s‚قǒljÁ
---------------------
-//1061 by lizorett (2004/11/9)
-E•s³‚ȃMƒ‹ƒhƒXƒLƒ‹ƒpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚Émap/charƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
-E•s³‚ȃpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚ÉcharƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
-EŒ‹¥‚µ‚½ƒLƒƒƒ‰‚ð휂·‚é‚ÆcharƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
-E” ‚ðˆê‚‚¾‚¯Ž‚Á‚½ó‘Ô‚Å” ‚©‚ç” ‚ª‚Å‚é‚ÆA” ‚ªÁ‚¦‚邽‚悤‚ÉŒ©‚¦‚é
- (ƒŠƒƒO‚·‚é‚ÆŒ©‚¦‚é)–â‘è‚ðC³
-EƒXƒiƒbƒ`ƒƒ[‚̃XƒLƒ‹Ž¸”s‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚Å‚«‚éÝ’è‚ð’ljÁ
-Eƒfƒ{[ƒVƒ‡ƒ“‚̃Œƒxƒ‹§ŒÀ(10ƒŒƒxƒ‹·)‚ð•ÏX‚Å‚«‚éÝ’è‚ð’ljÁ
-
- (src/common)
- mmo.h
- ƒMƒ‹ƒhƒXƒLƒ‹‚Ìenum‚ð’ljÁ(src/map/skill.h‚©‚çˆÚ“®)
- (src/map)
- skill.h
- ƒMƒ‹ƒhƒXƒLƒ‹‚Ìenum‚ðíœ(src/common/mmo.h‚Ɉړ®)
- guild.c
- guild_checkskill ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
- guild_skillup ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
- skill.c
- skill_additional_effect display_snatcher_skill_fail‚̈—‚ð’ljÁ
- skill_castend_nodamage_id devotion_level_difference‚̈—‚ð’ljÁ
- battle.c
- display_snatcher_skill_fail,devotion_level_difference‚̉Šú‰»‚ð’ljÁ
- (src/char)
- int_guild.c
- guild_checkskill ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
- mapif_parse_GuildSkillUp ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
- char.c
- parse_char •s³‚ȃpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚ɂ̓_ƒ“ƒv‚·‚é‚悤C³
- char_divorce i<MAX_INVENTORY‚ðj<MAX_INVENTORY‚É•ÏX
- (conf)
- battle_athena.conf
- display_snatcher_skill_fail,devotion_level_difference‚ð’ljÁ
---------------------
-//1060 by mosya
-Eƒ‚ƒ“ƒXƒ^[‚ªƒXƒLƒ‹‰r¥’†‚ÉÀ•WƒYƒŒ‚ð‹N‚±‚·–â‘è‚ðC³
-EMOB‚ÌAI•ÏXB‘O‰q‚ªƒ^ƒQ‚ðŽæ‚Á‚Ä‚¢‚é‚Ì‚ÉAŒã‰q‚ÉUŒ‚‚ð‚µ‚É‚ä‚­‚Ì‚ðC³
- (src/map)
- mob.c
- mob_ai_sub_hard() •ÏX
- mobskill_castend_id() •ÏX
- mobskill_castend_pos() •ÏX
- mobskill_use_id() •ÏX
- mobskill_use_pos() •ÏX
---------------------
-//1059 by SPDFMember
-EeAthena‚ðŽQl‚ɃŠƒ[ƒhDBŒn“‚ð’ljÁ‚µ‚Ü‚µ‚½B
- (conf/)
- atcommand_athena.conf
- reloaditemdb
- reloadmobdb
- reloadskilldb‚ð’ljÁ
- help.txt
- reloaditemdb
- reloadmobdb
- reloadskilldb‚Ìà–¾‚ð’ljÁ
- msg_athena.conf
- 89
- 90
- 91‚ð’ljÁ
- (src/map)
- atcommand.c
- reloaditemdb
- reloadmobdb
- reloadskilldb‚ð’ljÁB
- atcommand.h
- AtCommand_ReloadItemDB,
- AtCommand_ReloadMobDB,
- AtCommand_ReloadSkillDB,‚ð’ljÁ
- itemdb.c
- static int itemdb_readdb(void);’ljÁ
- itemdb.h
- void itemdb_reload(void);’ljÁ
- mob.c
- void mob_reload(void)’ljÁ
- mob.h
- void mob_reload(void);’ljÁ
- skill.c
- void skill_reload(void)’ljÁ
- skill.h
- void skill_reload(void);’ljÁ
---------------------
-//1058 by lizorett
-EƒMƒ‹ƒh‘qŒÉƒAƒCƒeƒ€‚ªMAX_STORAGEŒÂˆÈã‚ ‚é‚ÆŽæ‚èo‚¹‚È‚¢‚à‚Ì‚ª‚ ‚é–â‘è‚ðC³
- (src/map)
- clif.c
- clif_parse_DropItem item_index/item_amount‚͈̔̓`ƒFƒbƒN‚ðíœ
- (pc_dropitem ‚Ń`ƒFƒbƒN‚·‚é)
- clif_parse_MoveToKafra item_amount‚̃`ƒFƒbƒN‚ðíœ
- (storage_*storageadd‚Ń`ƒFƒbƒN‚³‚ê‚Ä‚¢‚é)
- clif_parse_MoveFromKafra item_index/item_amount‚̃`ƒFƒbƒN‚ðíœ
- (storage_*storageget‚Ń`ƒFƒbƒN‚³‚ê‚Ä‚¢‚é)
- pc.c
- pc_dropitem n/amount‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
---------------------
-//1057 by BDPQ‹â
-EƒEƒH[ƒ^[ƒ{[ƒ‹‚̃_ƒ[ƒW‚ð–{ŽI’m’l¨ŽÀ‘ª’l‚ÉC³B
- [ MATK+SkillLv*30 ¨ MATK*(1+SkillLv*0.3) ]
-
- (src/map)
- battle.c
- battle_calc_magic_attack •ÏX [ 3848s–Ú‚ ‚½‚è ]
-
---------------------
-//1056 by robert
-‡”Ô‚ðŒŸ¸‚·‚é‚Ì‚Í•s–@‚©‚Ç‚¤‚©
- (src/map)
- clif.c
- clif_parse_DropItem
- clif_parse_MoveToKafra
- clif_parse_MoveFromKafra
---------------------
-//1055 by Nameless
-EŠeŽíCPU‚ɑ΂·‚éƒR[ƒhÅ“K‰»ƒIƒvƒVƒ‡ƒ“‚ðÝ’è(‘S27Ží) ¦GCC 3.3.1 €‹’
-EPentium 3‚̃IƒvƒVƒ‡ƒ“‚ªSSE2‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð’ù³
-E‹HŽ}‚³‚ñArobert‚³‚ñ‚ÌPacketî•ñ‚ÌŽæ‚èž‚Ý(‚¨“ñl‚ÉŠ´ŽÓ)
-
- (/)
- makefile
- i486/586/p54c/mmx/P3/P4/Cele
- k6/k6-2/k6-3/athlonŒn
- Via C3(Eden)
- PowerPC/G4Œn
-
- (src/map/)
- clif.c
- clif_parse_MoveToKafra{}
- ƒR[ƒhŽæ‚èž‚Ý
-
---------------------
-//1054 by Nameless
-ECygwin‚ŃRƒ“ƒpƒCƒ‹‚µ‚½athena‚ªÚ‘±53`58l•t‹ß‚ÅÚ‘±•s”\‚É‚È‚éƒoƒO‚ð‰ðÁ
-
- (src/common/)
- socket.h
- #ifdef CYGWIN
- #undef FD_SETSIZE
- #define FD_SETSIZE 4096
- #endif
- ˆÈã‚Ìs‚ðíœ
- (/)
- makefile
- OS_TYPE = -DCYGWIN
- «
- OS_TYPE = -DCYGWIN -DFD_SETSIZE=4096
- ‚ÉC³
-
- #optimize for Athlon-4(mobile Athlon)
- #CFLAGS += -march=athlon -mcpu=athlon-4 -mfpmath=sse
-
- #optimize for Athlon-mp
- #CFLAGS += -march=athlon -mcpu=athlon-mp -mfpmath=sse
-
- #optimize for Athlon-xp
- #CFLAGS += -march=athlon -mcpu=athlon-xp -mfpmath=sse
-
- #optimize for pentium3
- #CFLAGS += -march=i686 -mcpu=pentium3 -mfpmath=sse -mmmx -msse2
-
- ŠeŽíCPU‚ÌÅ“K‰»‚ð’ljÁgcc3.1ˆÈã‚ðŽg‚Á‚Ä‚¢‚éꇂÍ#‚ðŠO‚µ
- ‚ÄÅ“K‰»‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·B
-
- ¦makefile‚ŃZƒbƒg‚µ‚Ä‚¨‚©‚È‚¢‚ÆAƒRƒ“ƒpƒCƒ‹‚ÌۂɈꕔ
- FD_SETSIZE‚ª¬‚³‚­‚È‚Á‚Ä‚µ‚Ü‚¤ƒoƒO(?)‚ª‚ ‚é‚炵‚­AÚ‘±l”‚ª
- 60lŽã‚ÅÚ‘±•s”\‚ª”­¶‚µ‚Ä‚µ‚Ü‚¢‚Ü‚·B
-
---------------------
-//1053 by TEILU
-EƒpƒPƒbƒgƒp[ƒT[‚ðƒ^ƒCƒ}[ŒÄo‚µ‚É•ÏX‚Å‚«‚éÝ’è‚̒ljÁ
-E¸˜B‚̉”۔»’è‚Å‚c‚a‚ɂǂ̂悤‚ÈÝ’è‚ð“ü‚ê‚Ä‚àƒAƒNƒZƒTƒŠ‚Í
- ¸˜B‚Å‚«‚È‚©‚Á‚½•s‹ï‡‚ðC³
-
- (conf/)
- map_athena.conf
- packet_parse_time: 0 ’ljÁ
- (src/common/)
- core.c
- packet_parse_time ’ljÁ
- main() •ÏX
- socket.c
- parsepacket_timer() ’ljÁ
- socket.h
- parsepacket_timer() ’ljÁ
- (src/map/)
- map.c
- packet_parse_time ’ljÁ
- map_config_read() •ÏX
- script.c
- buildin_getequipisenableref() •ÏX
-
---------------------
-//1052 by
-‹êŠ‚‚«‚ÅŒŸõƒRƒ}ƒ“ƒh’ljÁB
- GMƒRƒ}ƒ“ƒh’ljÁ
- @who+ ‹êŠ‚‚«ŒŸõ
-
- (conf/)
- atcommand_athena.conf
- who+: 1 ’ljÁ
- (/src/common/)
- version.h
- Ver 1051->1052 •ÏX
- (/src/map)
- atcommand.c
- ATCOMMAND_FUNC(whop); ’ljÁ
- { AtCommand_WhoP,"@who+",0, atcommand_whop }, ’ljÁ
- atcommand.h
- AtCommand_WhoP, ’ljÁ
---------------------
-//1051 by Plala
-EƒyƒRƒyƒR‹R掞MAX Weight‚ð‘‚₹‚é‚悤‚É‚µ‚Ü‚µ‚½B
-battle_athena.conf‚ÅÝ’è‰Â”\‚Å‚·B
-
- (conf/)
- battle_athena.conf
- riding_weight ’ljÁ
- (map/)
- battle.c
- battle_config.riding_weight ’ljÁ
- battle.h
- int riding_weight; ’ljÁ
- clif.c
- clif_parse_RemoveOption •ÏX
- pc.c
- int pc_calcstatus •ÏX
- 1415‚Ésd->max_weight +=battle_config.riding_weight; ‚ð’ljÁ
- (common/)
- version.h
- Ver 1050->1051 •ÏX
---------------------
-//1050 by code
-EŠeŽí“VŒó‘€ìƒRƒ}ƒ“ƒh‚ÌŒ©’¼‚µ
-¦‚¢‚¿‚¢‚¿@misceffect‚ŌĂÑo‚³‚¸‚ÉŠÈ’P‚É“VŒó‘€ì‚ðs‚¦‚é‚悤‚É
-¦ƒNƒ‰ƒCƒAƒ“ƒgˆË‘¶‚Í—Ž‚¿—t‚Å‚Í‚È‚­‰J‚Å‚µ‚½AŠÔˆá‚¢‚Ü‚µ‚½(^-^;
-
- (src/common/)
- version.h
- Ver 1049->1050 •ÏX
- (/src/map)
- atcommand.c
- AtCommand_Rain{} •ÏX
- AtCommand_Snow{} •ÏX
- AtCommand_Cherry{} •ÏX
- AtCommand_Fog{} •ÏX
- AtCommand_Maple{} •ÏX
-
---------------------
-//1049 by code
-E–¶A—Ž—t‚Ì2‚‚̓VŒó‘€ìƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
-¦—Ž‚¿—t‚ÉŠÖ‚µ‚Ă̓Nƒ‰ƒCƒAƒ“ƒgˆË‘¶‚È‚Ì‚ÅjRO‚¾‚Æ—Ž‚¿‚é‚©‚àc
-
- GMƒRƒ}ƒ“ƒh’ljÁ
- @fog –¶
- @maple —Ž—t
-
- (conf/)
- atcommand_athena.conf
- fog: 1 ’ljÁ
- maple: 1 ’ljÁ
-
- msg_athena.conf
- 87: –¶‚ª—§‚¿ž‚ß‚Ü‚µ‚½B ’ljÁ
- 88: —Ž‚¿—t‚ª~‚Á‚Ä‚«‚Ü‚µ‚½B ’ljÁ
- (/src/common/)
- version.h
- Ver 1048->1049 •ÏX
- (/src/map)
- atcommand.c
- ATCOMMAND_FUNC(fog); ’ljÁ
- ATCOMMAND_FUNC(maple); ’ljÁ
- { AtCommand_fog,"@fog",0, atcommand_fog }, ’ljÁ
- { AtCommand_maple,"@maple",0, atcommand_maple }, ’ljÁ
-
- atcommand.h
- AtCommand_Fog, ’ljÁ
- AtCommand_Maple, ’ljÁ
-
---------------------
-//1048 by code
-E‰JAáAƒTƒNƒ‰á‚Ì3‚‚̓VŒó‘€ìƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
-¦Õ“®“I‚ɒljÁ‚µ‚Ä‚µ‚Ü‚Á‚½‚̂ŃoƒO‚ª‚ ‚é‚©‚à’m‚ê‚Ü‚¹‚ñ(Š¾
-
- GMƒRƒ}ƒ“ƒh’ljÁ
- @rain ‰J
- @snow á
- @cherry ƒTƒNƒ‰á
-
- (conf/)
- atcommand_athena.conf
- rain: 1 ’ljÁ
- snow: 1 ’ljÁ
- cherry: 1 ’ljÁ
-
- msg_athena.conf
- 84: ‰J‚ª~‚èo‚µ‚Ü‚µ‚½B ’ljÁ
- 85: Ⴊ~‚èo‚µ‚Ü‚µ‚½B ’ljÁ
- 86: ƒTƒNƒ‰á‚ð~‚点‚Ü‚·B ’ljÁ
- (/src/common/)
- version.h
- Ver 1047->1048 •ÏX
- (/src/map)
- atcommand.c
- ATCOMMAND_FUNC(rain); ’ljÁ
- ATCOMMAND_FUNC(snow); ’ljÁ
- ATCOMMAND_FUNC(cherry); ’ljÁ
- { AtCommand_rain,"@rain",0, atcommand_rain }, ’ljÁ
- { AtCommand_snow,"@snow",0, atcommand_snow }, ’ljÁ
- { AtCommand_cherry,"@cherry",0, atcommand_cherry }, ’ljÁ
-
- atcommand.h
- AtCommand_Rain, ’ljÁ
- AtCommand_Snow, ’ljÁ
- AtCommand_Cherry, ’ljÁ
-
---------------------
-//1047 by SVN
-E»‘¢ƒAƒCƒeƒ€‚Ì»ìŽÒ‚Ì–¼‘O‚ðˆø‚­map©¨char‚̃pƒPƒbƒg‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
-E“ñdƒƒOƒCƒ“‚ð‚µ‚½Žž‚Échar-server‚ª—Ž‚¿‚é‰Â”\«‚ª‚ ‚Á‚½‚Ì‚ðC³
-EƒK[ƒfƒBƒAƒ“‚ðGvŽžŠÔŠO‚ɉ£‚ꂽAIDŽw’è‚̃XƒLƒ‹‚ª“–‚½‚Á‚½Askill_unit‚ȃXƒLƒ‹UŒ‚‚ª“–‚½‚Á‚½‚Ì‚ðC³
-EƒOƒ‰ƒtƒBƒeƒB‚ÌRange‚ð‚Æ‚è‚ ‚¦‚¸3‚É‚µ‚Ä‚Ý‚½
- (db/)
- skill_db.txt
- (char/)
- char.c
- parse_frommap()
- (map/)
- clif.c
- clif_parse_ActionRequest() •ÏX
- clif_parse_UseSkillToId() •ÏX
- mob.c
- mob_gvmobcheck() ’ljÁ
- mob.h
- mob_gvmobcheck() ’è‹`’ljÁ
- skill.c
- skill_attack() •ÏX
-
---------------------
-//1046 by SVN
-¦db/packet_db.txt‚Í2004-09-06aSakexe—p‚È‚Ì‚ÅAjROƒNƒ‰ƒCƒAƒ“ƒg‚ÅŽg—p‚·‚éÛ‚Íu//jRO‚Í‚±‚±‚Ü‚ÅvˆÈ‰º‚ðƒRƒƒ“ƒgƒAƒEƒg‚·‚邩휂µ‚Ä‚­‚¾‚³‚¢
-
-E•ÏX“_‚ª‘½‚¢‚Ì‚ÅÚׂ̓tƒ@ƒCƒ‹AŠÖ”‚²‚Æ‚É‹Lq‚µ‚Ä‚¢‚Ü‚·
-E1045‚É‚»‚Ì‚Ü‚Üã‘‚«‚µ‚Ä‚à“®ì‚µ‚Ü‚·‚ªAŽg‚í‚ê‚È‚¢ƒtƒ@ƒCƒ‹‚ª‚¢‚­‚‚©Žc‚è‚Ü‚·
-Escript/ˆÈ‰º‚Í–¼‘O‚ª•ÏX‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ª‘å—Ê‚É‚ ‚é‚Ì‚Åscript/‚Ì•ÏX“_‚ðŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢
-EƒXƒNƒŠƒvƒg—p‚ÌŠÖ”‚â–½—ß‚ª‘‚¦‚½‚èŽd—l‚ª•ÏX‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ª‚ ‚è‚Ü‚·
- Šî–{“I‚ɂ͌݊·«‚ª‚ ‚é‚Í‚¸‚Å‚·‚ªAgetgdskilllv()‚¾‚¯‚Í‘æ“ñˆø”‚𔎚‚Å‚Í‚È‚­ƒXƒLƒ‹–¼(GD_APPROVAL‚È‚Ç)‚É’u‚«Š·‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·
- getgdskilllv()‚ªŽg‚í‚ê‚Ä‚¢‚é/script/npc/gvg_big5/*.* ‚Í’†‘Œê‚Å•K—v‚È‚¢‚Ì‚Å휂µ‚Ä‚­‚¾‚³‚¢
- ’ljÁ‚â•ÏX‚ÉŠÖ‚µ‚Ä‚ÍŠT‚Ëscript_ref.txt‚É”½‰f‚µ‚Ä‚ ‚è‚Ü‚·‚ªAÚׂÍscript.c‚Ì•ÏX“_‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢
-E’ljÁ‚³‚ꂽ@ƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Í@help‚Æatcommand.c‚Ì•ÏX“_‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢
-E’ljÁ‚³‚ꂽݒè‚Íconf_ref.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢
-E‹Lq˜R‚ê‚Ì•ÏX“_‚à‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
-
-’ljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuAv
-•ÏX‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuCv
-휂µ‚½ƒtƒ@ƒCƒ‹‚ÍuDv
-ˆÚ“®‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuMv
- /
- C athena-start
- ./conf/import ˆÈ‰º‚ð‹N“®Žž‚ÉŽ©“®ì¬‚·‚é‚悤‚É•ÏX
- seqƒRƒ}ƒ“ƒh‚ðŽg‚í‚È‚¢‚悤‚É‚µ‚ÄFreeBSD‚Å‚à“®ì‚·‚é‚悤‚É•ÏX
- start
- ‚·‚Å‚ÉAthena‚ª‹N“®‚µ‚Ä‚¢‚鎞‚͉½‚à‚µ‚È‚¢‚悤‚É•ÏX
- exec‚Å ./ ‚ªƒ_ƒu‚Á‚Ä‚¢‚½‚Ì‚Åíœ
- stop
- FreeBSD‚Å‚àƒVƒFƒ‹‚É–ß‚é‚悤‚É•ÏX
- kill
- “¯ã
- C Makefile
- PACKETDEF ‚É PACKETVER=6 ‚ð’ljÁ
- FreeBSD‚𔻒肵‚Ä make ‚Æ gmake ‚ðØ‚è‘Ö‚¦‚é‚悤‚É•ÏX
- CFLAGS ‚ð•ª‰ð‚µ‚Ä˜M‚è‚â‚·‚¢‚悤‚É•ÏX
- C start
- 1s–ڂ̃VƒFƒ‹Žw’肪³‚µ‚­‚È‚©‚Á‚½‚Ì‚ð•ÏX
- ‚·‚Å‚ÉAthena‚ª‹N“®‚µ‚Ä‚¢‚鎞‚͉½‚à‚µ‚È‚¢‚悤‚É•ÏX
- ‹N“®Šm”F‚ÌðŒŽ®‚ð athena-start ‚Æ“¯‚¶•¨‚É•ÏX
- bin/tool/
- ƒVƒFƒ‹ƒXƒNƒŠƒvƒg‚̉üsƒR[ƒh‚ð CRLF ‚©‚ç LF ‚Ì‚Ý‚É•ÏX
- C getlogincount
- ƒƒOƒCƒ“ƒo[ƒWƒ‡ƒ“‚ð $loginversion ‚Æ‚µ‚Ä•ÏX‚Å‚«‚é‚悤‚É•ÏX
- C ladmin
- ƒAƒJƒEƒ“ƒg–¼‚Éu-v‚ðŽg‚¦‚é‚悤‚É•ÏX
-
- conf/
- D import/
- ”z•z•¨‚©‚çíœ(athena-start start ‚ÅŽ©“®ì¬‚³‚ê‚é)
- C atcommand_athena.conf
- shuffle maintenance misceffect ’ljÁ
- C char_athena.conf
- default_map_type default_map_name ’ljÁ
- C help.txt
- à–¾’ljÁ
- C login_athena.conf
- login_version login_type ’ljÁ
- C map_athena.conf
- npc map FX•ÏX
- C mapflag.txt
- ÅV”Å‚ÉXV
- C msg_athena.conf
- 81ˆÈ~’ljÁ
- C water_height.txt
- ÅV”Å‚ÉXV
- db/
- C castle_db.txt
- ƒMƒ‹ƒh‰ð‘ÌŽž‚É”­¶‚·‚é OnGuildBreak ƒCƒxƒ“ƒg‚Ì‚½‚ß‚É <Event_Name> ’ljÁ
- C const.txt
- GvG‚ÌŠJŽnŽžŠÔ“™‚ðÝ’è‚Å‚«‚é‚悤‚ɒljÁ
- ƒ}ƒbƒvƒtƒ‰ƒO mf_notrade mf_noskill ’ljÁ
- ƒpƒ‰ƒ[ƒ^ PartnerId Cart ’ljÁ
- ƒ{[ƒiƒX bBreakWeaponRate bBreakArmorRate bAddStealRate bUnbreakableWeapon bUnbreakableArmor ’ljÁ
- ƒXƒe[ƒ^ƒX•Ï‰» SC_WEDDING ’ljÁ
- ƒXƒNƒŠƒvƒg–½—ß getgdskilllv —p‚É GD_APPROVAL ‚ȂǒljÁ
- C exp.txt
- “]¶“ñŽŸE‚ªBaseLv12‚É‚È‚é‚Æ‚«‚É•K—v‚ÈŒoŒ±’l‚ð41¨481‚ÉC³
- C item_db.txt
- C mob_db.txt
- C mob_skill_db.txt
- C skill_cast_db.txt
- C skill_db.txt
- C skill_require_db.txt
- C skill_tree.txt
- ÅV”Å‚ÉXV
- A packet_db.txt
- ƒpƒPƒbƒg’è‹`ƒtƒ@ƒCƒ‹’ljÁ
- doc/
- C client_packet.txt
- V‚µ‚­”»–¾‚µ‚½ƒpƒPƒbƒg‚ð‚¢‚­‚‚©’ljÁ
- C conf_ref.txt
- V‚µ‚­’ljÁ‚µ‚½Ý’è‚Ìà–¾‚ð’ljÁ
- C db_ref.txt
- skill_cast_db.txt ‚Ì list_hp_rate list_sp_rate ‚Å•‰”‚ðŽw’肵‚½Žž‚Ì‹““®‚ð’ljÁ
- C help.txt
- conf/help.txt “¯—l‚É•ÏX
- C inter_server_packet.txt
- V‹K‚ŒljÁ‚µ‚½ƒpƒPƒbƒg‚ð’ljÁ‚ÆŽÀ‘Ô‚Æ‚ ‚Á‚Ä‚¢‚È‚©‚Á‚½•”•ª‚ðC³
- C item.txt
- ÅV”Å‚ÉXV
- C item_bonus.txt
- V‹K‚ŒljÁ‚³‚ꂽƒ{[ƒiƒX‚ð’ljÁ
- C script_ref.txt
- V‹K–½—߂̒ljÁ‚ÆŠù‘¶–½—ß‚Ì•ÏX‚È‚Ç
- C serverlink_packet.txt
- V‹K‚ŒljÁ‚µ‚½ƒpƒPƒbƒg‚ð’ljÁ‚ÆŠù‘¶‚Å‘‚©‚ê‚Ä‚¢‚È‚©‚Á‚½ƒpƒPƒbƒg‚̒ljÁ
- script/
- mob/
- C npc_monster.txt
- ÅV”Å‚ÉXV
- ƒjƒuƒ‹ƒwƒCƒ€‚ÌMob‚Ínpc_parse_mob()‚Ì•ÏXƒTƒ“ƒvƒ‹‚É‚È‚Á‚Ä‚Ü‚·
- npc/
- ‚Ù‚Ú‚·‚ׂĂÌNPC‚ðnpc_function.txt‚ðŽg‚Á‚½ƒ†[ƒU[’è‹`ŠÖ”‚Æ•¡»‚È‚Ç‚Å‘‚«Š·‚¦
- ˆÚ“®‚µ‚½ƒtƒ@ƒCƒ‹‚ÉŠÖ‚µ‚Ă͈ړ®Œã‚̃tƒ@ƒCƒ‹‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚̂ňړ®‘O‚̃tƒ@ƒCƒ‹‚Ì‚Ý휂µ‚Ä‚­‚¾‚³‚¢
- —á) etc/npc_etc_cTower.txt ‚ÍŠÜ‚Ü‚ê‚Ä‚¢‚é‚Ì‚Å npc_cTower.txt ‚ðíœ
- M npc_cTower.txt
- ¨etc/npc_etc_cTower.txt
- A npc_function.txt
- M npc_pota.txt
- ¨../sample/npc_debug_pota.txt
- M npc_pvp.txt
- M npc_pvproom.txt
- 2ƒtƒ@ƒCƒ‹‡‘Ì
- ¨etc/npc_etc_pvp.txt
- M npc_resetJ.txt
- ¨../sample/npc_debug_reset.txt
- A etc/
- A npc_etc_gefenia.txt
- C gvg/
- ‚·‚ׂÄev_agit_common.txt‚ðŽg‚Á‚½ƒ†[ƒU[’è‹`ŠÖ”‚Å‘‚«Š·‚¦
- ‚·‚ׂÄ휂µ‚Ä‚©‚炱‚̃pƒbƒ`‚ð“–‚Ä‚Ä‚­‚¾‚³‚¢
- ƒMƒ‹ƒh‰ðŽUŽž‚ÉÔ‚ð•úŠü‚·‚邽‚ß‚Éev_agit_Ô.txt‚ÉOnGuildBreakƒCƒxƒ“ƒg‚ð’ljÁ
- D test/
- A ev_agit_common.txt
- D ev_agit_event.txt
- D TEST_prtg_cas01_AbraiJ.txt
- D TEST_prtg_cas01_mob.txt
- D gvg_big5/
- C job/
- “]EƒXƒNƒŠƒvƒg‚Ì–¼‘O‚ðnpc_job_[JOB”Ô†][ƒWƒ‡ƒu–¼].txt‚É•ÏX
- ‚·‚ׂÄ휂µ‚Ä‚©‚炱‚̃pƒbƒ`‚ð“–‚Ä‚Ä‚­‚¾‚³‚¢
- C quest/
- M npc_event_arrow.txt
- ¨../../sample/npc_debug_arrow.txt
- A npc_event_hat2.txt
- ƒjƒuƒ‹“¯ŽžŽÀ‘•‚ÌV“ª‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ
- src/
- calloc() realloc() ‚ð‹É—ÍŠeŒ^‚ɃLƒƒƒXƒg‚·‚é‚悤‚É•ÏX
- calloc() Œã‚É memset() ‚Å \0 ‚ð–„‚ß‚Ä‚¢‚½‚Ì‚ðíœ
- calloc() ‚È‚Ì‚É(ƒTƒCƒY*ŒÂ”,1)‚ÅŽw’肵‚Ä‚¢‚½‚Ì‚ð(ŒÂ”,ƒTƒCƒY)‚É•ÏX
- ƒƒ‚ƒŠŠm•Û‚ðƒGƒ‰[ˆ—‚ð‚Ü‚Æ‚ß‚½ŠÖ”‚É‘‚«Š·‚¦
- malloc() ¨ aMalloc()
- calloc() ¨ aCalloc()
- realloc() ¨ aRealloc()
- strcpy() ‚ð strncpy() ‚É‹É—Í•ÏX
-
- char/
- C char.c
- ƒXƒy[ƒX‚ŃCƒ“ƒfƒ“ƒg‚³‚ê‚Ä‚¢‚½‚Æ‚±‚ë‚ðƒ^ƒu‚Å“ˆê
- A isGM()
- A read_gm_account()
- GMƒAƒJƒEƒ“ƒg‚ª•K—v‚É‚È‚Á‚½‚̂ŒljÁ
- C mmo_char_tostr()
- C mmo_char_fromstr()
- nullpoƒ`ƒFƒbƒN’ljÁ
- C count_users()
- •K—v‚È‚¢{}‚ðíœ
- C char_delete()
- nullƒ`ƒFƒbƒN’ljÁ
- 휃ƒbƒZ[ƒW‚ðƒRƒ“ƒ\[ƒ‹‚É•\Ž¦‚·‚é‚悤‚É‚µ‚½
- 휎ž‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰‚ðØ’f‚·‚é‚悤map-server‚É’Ê’m(0x2b19ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- C parse_tologin()
- C 0x2713
- char-serverƒƒ“ƒeƒiƒ“ƒXݒ莞‚ÍGMˆÈŠO“ü‚ê‚È‚¢‚悤‚É‚µ‚½
- Ú‘±”§ŒÀ‚ÅÅ‘å’l‚Å‚àGM‚ÍÚ‘±‚Å‚«‚é‚悤‚É‚µ‚½
- C 0x272a
- 0x2730‚ð0x272a‚É•ÏX‚µ‚ĔԆ‚ð‹l‚ß‚½
- ƒAƒJƒEƒ“ƒg휂µ‚½Žž‚ɃLƒƒƒ‰‚ªˆê•”Á‚³‚ê‚È‚¢–â‘è‚ðC³
- A 0x272c
- ŽóMŽž‚Élogin-server‚É’Ê’m(0x2b15ƒpƒPƒbƒg)‚µ‚ăƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚È‚é‚悤‚É‚µ‚½
- A char_erasemap()
- map-serverØ’fŽž‚É‘¼map-server‚Ƀ}ƒbƒv‚Ì휂ð’Ê’m(0x2b16ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- ‚±‚ê‚É‚æ‚葼map-serverŠÇŠ‚̃}ƒbƒv‚Ɉړ®‚µ‚悤‚Æ‚µ‚ÄA‚»‚Ìmap-server‚ªØ’f‚³‚ê‚Ä‚¢‚½‚çA
- pc_setpos()‚Å‘¶Ý‚µ‚È‚¢ƒ}ƒbƒv‚Æ‚¢‚¤‚±‚Ƃňړ®‚µ‚悤‚Æ‚µ‚È‚­‚È‚é‚Ì‚ÅA
- ƒNƒ‰ƒCƒAƒ“ƒg‚ªu‰i‰“‚É‚¨‘Ò‚¿‚­‚¾‚³‚¢ó‘Ôv‚É‚È‚ç‚È‚¢‚悤‚É‚È‚è‚Ü‚·
- C parse_frommap()
- map-serverØ’fŽž‚Échar_erasemap()‚ðŽÀs‚·‚é‚悤‚É‚µ‚½
- map-serverØ’fŽž‚ÉŠÇŠ‚̃}ƒbƒv‚ɃLƒƒƒ‰‚ªŽc‚Á‚Ä‚¢‚½‚çØ’f‚ð‘¼map-server‚É’Ê’m(0x2b17ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- C 0x2afc
- ”FØŽ¸”sŽž‚É char_dat[].mapip/mapport ‚ð 0 ‚É‚·‚é‚悤‚É‚µ‚½
- ”FجŒ÷Žž‚É char_dat[].mapip/mapport ‚ðmap-server‚ÌIPƒAƒhƒŒƒX‚ƃ|[ƒg‚É‚·‚é‚悤‚É‚µ‚½
- ”FجŒ÷Žž‚É‘¼map-server‚ɃLƒƒƒ‰‚ªƒƒOƒCƒ“‚µ‚½‚±‚Æ‚ð’Ê’m(0x2b09ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- C 0x2b02
- C 0x2b05
- ƒRƒ“ƒ\[ƒ‹‚Ö‚Ìo—͂ɃpƒPƒbƒg”Ô†‚ð‹Lq‚·‚é‚悤‚É‚µ‚½
- C 0x2b08
- ƒpƒPƒbƒgŽd—l‚ð•ÏX‚µ‚Ä account_id mapip mapport ‚à’Ê’m‚·‚é‚悤‚É•ÏX
- map-server‚ÉÚ‘±‚µ‚Ä‚¢‚È‚¢Žž‚Í‚·‚×‚Ä 0 ‚ª“ü‚è‚Ü‚·
- A 0x2b13
- map-server‹N“®“r’†‚ȂǂŃLƒƒƒ‰‚ªƒƒOƒCƒ“‚Å‚«‚È‚¢‚悤‚É‚·‚é server[].active ƒtƒ‰ƒO‚ð‘€ì‚·‚é
- active = 0 ‚ŃLƒƒƒ‰‚̓ƒOƒCƒ“‚Å‚«‚¸‚ÉØ’f‚³‚ê‚é
- map-server‚ª‹N“®‚ðŠ®—¹‚µ‚½‚Æ‚«‚É active = 1 ‚É‚·‚éƒpƒPƒbƒg‚ª‘—‚ç‚ê‚Ä‚­‚é
- A 0x2b14
- char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚·‚é char_maintenance ƒtƒ‰ƒO‚ð‘€ì‚·‚é
- login-server‚É‚à’Ê’m(0x272bƒpƒPƒbƒg)‚µ‚ă[ƒ‹ƒh‘I‘ð‰æ–ʂŃƒ“ƒeƒiƒ“ƒX•\Ž¦‚ð‚·‚é
- ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚Å‚ÍGMˆÈŠO‚̃†[ƒU[‚̓ƒOƒCƒ“‚Å‚«‚Ü‚¹‚ñ
- A 0x2b18
- ƒLƒƒƒ‰ƒNƒ^[‚ÌØ’f‚ð‘¼map-server‚É’Ê’m(0x2b17ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- C search_mapserver()
- ˆø”‚É struct mmo_charstatus *cd ‚ð’ljÁ
- cd‚ª“n‚³‚ꂽ•’T‚µ‚Ä‚¢‚éƒ}ƒbƒv‚ªÚ‘±‚µ‚Ä‚¢‚émap-server‚É–³‚©‚Á‚½‚Æ‚«‚ÉAʼn‚ÉŒ©‚‚¯‚½map-server‚Ìʼn‚ÉŒ©‚‚¯‚½ƒ}ƒbƒv‚ÉÚ‘±‚·‚é‚悤‚É‚µ‚½
- ‚±‚ê‚Í char_athena.conf default_map_type: 2 ‚ÌŽž‚Ì‹““®‚Å‚·
- C parse_char()
- C 0x65
- ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚ÌŽž‚ÉGMˆÈŠO‚ðØ’f‚·‚é‚悤‚É‚µ‚½
- Å‘åÚ‘±”‚ªÝ’肳‚ê‚Ä‚¢‚ÄÅ‘åÚ‘±”‚Ì‚Æ‚«‚àGM‚ÍÚ‘±‚Å‚«‚é‚悤‚É‚µ‚½
- C 0x66
- char-server‚ÉÚ‘±‚µ‚Ä‚¢‚émap-server‚Élast_point‚ªŒ©‚‚¯‚ç‚ê‚È‚©‚Á‚½‚Æ‚«‚ÉA
- default_map_type&1 ‚ÌŽž‚Í default_map_name ‚ÉÚ‘±‚·‚é
- default_map_type&2 ‚ÌŽž‚Í Å‰‚ÉŒ©‚‚¯‚½map-server‚Ìʼn‚ÉŒ©‚‚¯‚½ƒ}ƒbƒv‚ÉÚ‘±‚·‚é
- ‚»‚ê‚Å‚àŒ©‚‚©‚ç‚È‚¢Žž‚ÍØ’f‚·‚é‚悤‚É‚µ‚½
- ƒRƒ“ƒ\[ƒ‹‚Ö‚Ìo—͂ɃpƒPƒbƒg”Ô†‚ð‹Lq‚·‚é‚悤‚É‚µ‚½
- C 0x2af8
- ‘¼ƒ}ƒbƒv‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰î•ñ‚ð’Ê’m(0x2b09ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
- C 0x187
- S 0187ƒpƒPƒbƒg‚ð•ÔM‚·‚é‚悤‚É‚µ‚½
- C check_connect_login_server()
- char_port‚ðWFIFOL‚Å‘—‚Á‚Ä‚¢‚½‚Ì‚ðWFIFOW‚ÉC³
- 80‚Æ82‚ÌŠÔ‚ª‹ó‚¢‚Ä‚¢‚½‚Ì‚ð‹l‚߂ăpƒPƒbƒg’·‚ð86¨84‚É•ÏX
- C char_config_read()
- default_map_type default_map_name ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- A gm_account_db_final()
- Šm•Û‚µ‚½ gm_account_db ‚̃ƒ‚ƒŠ‚ðI—¹Žž‚ÉŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C do_final()
- inter.c ‚È‚Ç‘¼ƒtƒ@ƒCƒ‹‚ÌI—¹ˆ—(do_final_*)‚ð’ljÁ‚µ‚½
- exit_dbn() ‚Ådb—p‚̃ƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- Ú‘±‚³‚ê‚Ä‚¢‚émap-server‚̃ZƒbƒVƒ‡ƒ“‚ð휂·‚é‚悤‚É‚µ‚½
- do_final_timer()‚Åtimer‚ðI—¹‚³‚¹‚é‚悤‚É‚µ‚½
- C do_init()
- server[].active = 0 ‚ʼnŠú‰»
- read_gm_account() ‚ÅGMƒAƒJƒEƒ“ƒgƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- C char.h
- mmo_map_server ‚É active ƒtƒ‰ƒO‚ð’ljÁ‚µ‚½
- C int_guild.c
- C mapif_parse_GuildSkillUp()
- ƒMƒ‹ƒhƒ|ƒCƒ“ƒg‚ðÁ”‚È‚¢‚ŃMƒ‹ƒhƒXƒLƒ‹‚ðã‚°‚邽‚ß‚É int flag ‚ð’ljÁ
- C inter_guild_parse_frommap()
- 0x303C
- ƒpƒPƒbƒg’è‹`‚ð•ÏX‚µ‚Äflag‚ð’ljÁ‚µ‚½
- A guild_db_final()
- A castle_db_final()
- A do_final_int_guild()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C int_guild.h
- A do_final_int_guild()
- ’è‹`‚ð’ljÁ
- C int_party.c
- A party_db_final()
- A do_final_int_party()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C int_party.h
- A do_final_int_party()
- ’è‹`‚ð’ljÁ
- C int_pet.c
- A pet_db_final()
- A do_final_int_pet()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C int_pet.h
- A do_final_int_pet()
- ’è‹`‚ð’ljÁ
- C int_storage.c
- A storage_db_final()
- A guild_storage_db_final()
- A do_final_int_storage()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C int_storage.h
- A do_final_int_storage()
- ’è‹`‚ð’ljÁ
- C inter.c
- ƒpƒPƒbƒg’·’è‹`‚ð•ÏX
- A mapif_parse_CharPosReq()
- 0x3090ƒpƒPƒbƒg‚ւ̑Ήž
- ƒLƒƒƒ‰‚̈ʒu—v‹‚ðmap-server‚É’Ê’m(0x3890ƒpƒPƒbƒg)‚·‚é
- A mapif_parse_CharPos()
- 0x3091ƒpƒPƒbƒg‚ւ̑Ήž
- ƒLƒƒƒ‰‚̈ʒu—v‹‚ð‚µ‚½ƒLƒƒƒ‰‚Ɉʒuî•ñ‚ð’Ê’m(0x3891ƒpƒPƒbƒg)‚·‚é
- A mapif_parse_CharMoveReq()
- 0x3092ƒpƒPƒbƒg‚ւ̑Ήž
- —v‹‚µ‚½ƒLƒƒƒ‰‚Ü‚Å‘Îۂ̃Lƒƒƒ‰‚ð”ò‚΂·—v‹‚ð’Ê’m(0x3892ƒpƒPƒbƒg)‚ð‚·‚é
- A mapif_parse_DisplayMessage()
- 0x3093ƒpƒPƒbƒg‚ւ̑Ήž
- ƒLƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—M(0x3893ƒpƒPƒbƒg)‚·‚é
- C inter_parse_frommap()
- Še’ljÁƒpƒPƒbƒg‚ւ̑Ήž‚ð’ljÁ‚µ‚½
- A wis_db_final()
- A accreg_db_final()
- A do_final_inter()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C inter.h
- A do_final_inter()
- ’è‹`‚ð’ljÁ
- C Makefile
- A nullpo.o nullpo.h ‚ð’ljÁ
- A malloc.o malloc.h ‚ð’ljÁ
- common/
- C db.c
- A exit_dbn()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚邽‚߂ɒljÁ
- C db.h
- A exit_dbn()
- ’è‹`’ljÁ
- A malloc.h
- A malloc.c
- ƒƒ‚ƒŠŠm•ÛŠÖ”‚Ì‚Ü‚Æ‚ß
- C mmo.h
- C mmp_charstatus
- mapip mapport ’ljÁ
- C guild_castle
- castle_event ’ljÁ
- C Makefile
- A malloc.o malloc.h malloc.c ‚ð’ljÁ
- C nullpo.h
- ŒÃ‚¢gcc‚ŃRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É\‚ðíœ
- C socket.c
- C recv_to_fifo()
- ”Ä—p«‚ð‚‚߂邽‚ß‚É read() ‚ð recv() ‚É•ÏX
- C send_from_fifo()
- ”Ä—p«‚ð‚‚߂邽‚ß‚É write() ‚ð send() ‚É•ÏX
- C timer.c
- A do_final_timer()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C timer.h
- A do_final_timer()
- ’è‹`’ljÁ
- login/
- C login.c
- A login_version login_type
- clientinfo.xml‚ÅŽw’è‚·‚é login_version login_type ‚ŃƒOƒCƒ“‚ð‹K§‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·
- C parse_fromchar()
- A 0x272b
- server[].maintenance ƒtƒ‰ƒO‚ð•ÏX‚·‚é
- •ÏX‚µ‚½“à—e‚ðchar-server‚É•ÔM(0x272cƒpƒPƒbƒg)‚·‚é
- C parse_admin()
- C 0x7932
- 0x2730¨0x272a ‚É•ÏX
- C parse_login()
- C 0x64 0x01dd
- login_version login_type ‚ð”»’è‚·‚é‚悤‚É‚µ‚½
- C 0x2710
- ƒpƒPƒbƒg’·‚Ì’è‹`‚ª³‚µ‚­‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚½
- char.c check_connect_login_server ‚Ì•ÏX‚𔽉f
- C login_config_read()
- login_version login_type‚Ì“Ç‚Ýž‚Ý‚ð’ljÁ
- A gm_account_db_final()
- C do_final()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É•ÏX
- C Makefile
- A malloc.o malloc.h ‚ð’ljÁ
- map/
- C atcommand.c
- ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚Åmemwatch‚ð“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚½
- C atcommand_where()
- ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚̋ꊂà•\Ž¦‚Å‚«‚é‚悤‚É‚µ‚½
- C atcommand_jumpto()
- ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚É‚à”ò‚ׂé‚悤‚É‚µ‚½
- C atcommand_who()
- ƒ[ƒ‹ƒh“à‚Ì‚·‚ׂĂɂ¢‚éƒLƒƒƒ‰‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
- C atcommand_go()
- ƒjƒuƒ‹ƒwƒ‹ƒ€‚̈ړ®ƒ|ƒCƒ“ƒg‚ð•ÏX
- C atcommand_recall()
- ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚àŒÄ‚Ño‚¹‚é‚悤‚É‚µ‚½
- A atshuffle_sub()
- A atcommand_shuffle()
- PC‚ÆMOB‚̃Vƒƒƒbƒtƒ‹‚ðs‚¤ @shuffle ‚ð’ljÁ
- A atcommand_maintenance()
- char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚·‚é @maintenance ‚ð’ljÁ
- A atcommand_misceffect()
- ŽÀs‚µ‚½ƒLƒƒƒ‰‚©‚ç0x1f3ƒpƒPƒbƒg‚ð”­M‚µ‚ăGƒtƒFƒNƒg‚ð•\Ž¦‚·‚é @misceffect ‚ð’ljÁ
- A atcommand_summon()
- ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX‚Æ‹©‚ñ‚ÅŽw’肵‚½Mob‚𢊫‚·‚é @summon ‚ð’ljÁ
- ¢Š«‚³‚ꂽMob‚Í‘¼‚ÌMob(Pv“™‚Å‚Í“G‘ÎPCŠÜ‚Þ)‚ðUŒ‚‚µ‚Ü‚·
- ¢Š«‚³‚ꂽMob‚ÉUŒ‚‚³‚ꂽMob‚Í¢Š«Žå‚ðUŒ‚‚µ‚Ü‚·(ƒoƒCƒIƒvƒ‰ƒ“ƒg‚̃tƒ[ƒ‰‚Æ“¯‚¶‹““®)
- ¢Š«‚³‚ꂽMob‚Í1•ªŒã‚ÉÁ–Å‚µ‚Ü‚·
- ƒlƒ^‚Ȃ̂ʼnB‚µƒRƒ}ƒ“ƒh‚Æ‚µ‚Ähelp.txt‚É‚Í‹Lq‚µ‚Ä‚Ü‚¹‚ñ
- C atcommand.h
- ’ljÁ‚µ‚½@ƒRƒ}ƒ“ƒh‚ð AtCommandType ‚ɒljÁ
- C msg_table[] ‚ðŠO‚©‚çŽg‚¦‚é‚悤‚É‚·‚邽‚ß‚Éextern‚µ‚½
- C battle.c
- ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚Åmemwatch‚ð“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚½
- A battle_config.castle_defense_rate
- –{ŽI‚Å–hŒä’l‚ª‚ǂ̂悤‚ɉe‹¿‚·‚é‚©‹ï‘Ì“I‚É‚Í•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAÔ‚Ì–hŒä’l‚𔽉f‚³‚¹‚é—¦‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
- C battle_get_opt1()
- C battle_get_opt2()
- C battle_get_option()
- NPC‚̃IƒvƒVƒ‡ƒ“‚à•Ô‚·‚悤‚É‚µ‚½
- A battle_get_opt3()
- opt3‚ð•Ô‚·‚悤‚ɒljÁ
- C battle_calc_damage()
- Ô“à‚ÌMob‚ւ̃_ƒ[ƒW‚Í–hŒä’l‚ÅŒ¸ŽZ(ƒ_ƒ[ƒW*(–hŒä’l/100)*(castle_defense_rate/100))‚³‚ê‚é‚悤‚É‚µ‚½
- ƒK[ƒfƒBƒAƒ“‚ɂ̓XƒLƒ‹‚ªŒø‚­‚悤‚É‚µ‚½
- C battle_calc_pet_weapon_attack()
- C battle_calc_mob_weapon_attack()
- C battle_calc_pc_weapon_attack()
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚̃_ƒ[ƒWŒvŽZ‚ð‚·‚é‚悤‚É‚µ‚½
- C battle_weapon_attack()
- •ŠíUŒ‚‚É‚æ‚鑦Ž€‚ÌŽd—l‚ð•ÏX
- •ŠíAŠZ”j‰ó‚ÌŠm—¦ŒvŽZ‚ð‚·‚é‚悤‚É•ÏX
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ª‰ðœ‚³‚ê‚é‚悤‚É•ÏX
- C battle_check_target()
- src ‚¶‚á‚È‚­‚Ä ss ‚©‚çparty_id guild_id‚ðŽæ“¾‚·‚é‚悤‚ÉC³
- target=BCT_NOENEMY ‚ȃXƒLƒ‹ Œû“JAƒnƒ~ƒ“ƒO‚È‚Ç‚ªPvPAGvG‚ÌŽž‚É‚à‘¼PC‚ɉe‹¿‚·‚é‚悤‚É‚µ‚½
- Mob‚ªspecial_ai‚È‚çMob‚ð“G‚Æ‚Ý‚È‚·‚悤‚É‚µ‚½
- C battle_config_read()
- castle_defense_rate ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- C battle.h
- A battle_get_opt3()
- ’è‹`’ljÁ
- C Battle_Config
- castle_defense_rate ’ljÁ
- C chat.c
- C chat_createnpcchat()
- ˆø”‚É int pub ‚ð’ljÁ
- pub=3 ‚ł̓`ƒƒƒbƒg‚̊Ŕ‚É(0/20)‚̂悤‚È•\Ž¦‚ª‚³‚ê‚È‚­‚È‚è‚Ü‚·
- A do_final_chat()
- ‰½‚à‚µ‚Ä‚È‚¢‚¯‚Ç‚Æ‚è‚ ‚¦‚¸’ljÁ
- C chat.h
- C chat_createnpcchat()
- ’è‹`‚ð•ÏX
- A do_final_chat()
- ’è‹`‚ð’ljÁ
- C chrif.c
- ƒpƒPƒbƒg’·ƒe[ƒuƒ‹‚ðŠg’£
- C chrif_connect()
- C chrif_changemapserver()
- WFIFOL‚Ń|[ƒg‚ð‘—‚Á‚Ä‚¢‚½‚Ì‚ðWFIFOW‚ÉC³
- A chrif_recverasemap()
- ‘¼map-server‚ªØ’f‚³‚ꂽ‚±‚Æ‚ªchar-server‚æ‚è’Ê’m‚³‚ꂽŽž‚ÉA‚»‚Ìmap-server‚ªŠÇ—‚µ‚Ä‚¢‚½ƒ}ƒbƒv‚Ìî•ñ‚ð휂·‚é‚悤‚É‚µ‚½
- A chrif_mapactive()
- map-server‹N“®€”õ’†‚É0AŠ®—¹Žž‚É1‚ðchar-server‚É’Ê’m(0x2b13)‚µ‚Ä‹N“®“r’†‚Ƀ†[ƒU[‚ªƒƒOƒCƒ“‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- A chrif_maintenance()
- char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½‚è‰ðœ‚µ‚½‚è‚ð’Ê’m(0x2b14)‚·‚é
- A chrif_maintenanceack()
- char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½Žž‚̉ž“š
- ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½Ž|‚ðƒ}ƒbƒv“à‚É’Ê’m‚·‚é
- A chrif_chardisconnect()
- char-server‚ɃLƒƒƒ‰‚ªØ’f‚³‚ꂽ‚±‚Æ‚ð’Ê’m(0x2b18)‚·‚é
- A chrif_parse_chardisconnectreq()
- char-server‚©‚ç‚̃Lƒƒƒ‰Ø’f—v‹‚ðŽó‚¯‚ÄA‘ÎÛƒLƒƒƒ‰‚ª‚¢‚éꇂɂÍØ’f‚·‚é
- C chrif_parse()
- C 0x2b09
- map_addchariddb() ‚̈ø”‘‰Á‚ɑΉž
- A 0x2b15
- A 0x2b16
- A 0x2b17
- A 0x2b19
- ŠeV‹KƒpƒPƒbƒg‚ɑΉž
- C check_connect_char_server()
- Ú‘±Žžchar-server‚Émap-server‚Ì€”õ‚ªo—ˆ‚½‚±‚Æ‚ð’Ê’m‚·‚é‚悤‚É‚µ‚½
- A do_final_chrif()
- I—¹Žž‚Échar-server‚Æ‚ÌÚ‘±‚ð휂·‚é‚悤‚É‚µ‚½
- C chrif.h
- A chrif_mapactive()
- A chrif_maintenance()
- A chrif_chardisconnect()
- A do_final_chrif()
- ’è‹`‚ð’ljÁ
- C clif.c
- ‚·‚ׂẴpƒPƒbƒg’è‹`‚ð packet_db ‚©‚ç“Ç‚Ýž‚ނ悤‚É•ÏX
- packet_db.txt‚ð•ÏX‚·‚邱‚Æ‚ÅA“xX•ÏX‚³‚ê‚éŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚̃pƒPƒbƒg’è‹`‚ɑΉž‚µ‚â‚·‚­‚È‚è‚Ü‚·
- packet_len_table[] ‚Í packet_db[].len ‚É’u‚«Š·‚í‚è‚Ü‚µ‚½
- <time.h> ‚ðinclude
- clif_parse_*‚ð擪‚Å錾‚·‚é‚悤‚É‚µ‚½
- clif_parse_*“à‚ÌRFIFOŒn‚ÅŽg‚í‚ê‚Ä‚¢‚é‘æ2ˆø”‚Í packet_db[cmd].pos[] ‚Å•\‹L‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- ƒpƒPƒbƒg”Ô†‚ÌÅ‘å’l‚ð MAX_PACKET_DB ‚Å’è‹`‚·‚é‚悤‚É‚µ‚½
- C clif_set0078()
- C clif_set007b()
- ƒpƒPƒbƒg‚Ì“à—e‚ª–{ŽI‚ƈá‚Á‚Ä‚¢‚½‚Ì‚Åguild_emblem_id,manner,opt3‚𳂵‚­‘—‚é‚悤‚É•ÏX
- C clif_class_change()
- MobˆÈŠO‚ÌNPC‚Å‚àŽg‚¦‚é‚悤‚É‚µ‚½
- C clif_mob0078()
- C clif_mob007b()
- ƒK[ƒfƒBƒAƒ“‚ɃMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
- C clif_npc0078()
- ƒ[ƒvƒ|[ƒ^ƒ‹‚ðƒMƒ‹ƒhƒtƒ‰ƒbƒO‚É‚·‚éƒIƒvƒVƒ‡ƒ“‚ð—LŒø‚É‚µ‚½Žž‚Émap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
- C clif_spawnnpc()
- NPC‚ª–³Œø‚Å‚àHideó‘Ô‚ÌŽž‚̓pƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏX
- C clif_quitsave()
- ƒLƒƒƒ‰I—¹Žž‚Échar-server‚ÉØ’f‚ð’Ê’m‚·‚é‚悤‚É‚µ‚½
- C clif_scriptmenu()
- C clif_dispchat()
- C clif_changechatstatus()
- len‚É1ƒoƒCƒg’ljÁ
- C clif_updatestatus()
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð‘—M‚·‚é‚悤‚É‚µ‚½
- A clif_changestatus()
- ŽüˆÍ‚ÉÔƒGƒ‚ó‘Ô‚Å‚ ‚邱‚Æ‚ð‘—M
- A clif_misceffect2()
- ƒGƒtƒFƒNƒg‚ð”­¶‚³‚¹‚éƒpƒPƒbƒg‚ð‘—M
- @misceffect, misceffect–½—ß‚ÅŽg—p
- C clif_changeoption()
- ó‘ÔˆÙ펞ˆÈŠO‚Íó‘ÔˆÙíƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg‚ð‘—‚ç‚È‚¢‚悤‚É‚µ‚½
- PC‚ÌŽž‚Í clif_changelook() ‚ð‘—M‚·‚é‚悤‚É‚µ‚½(Œ‹¥ˆßÖ•\Ž¦—pH)
- C clif_traderequest()
- ŽæˆøƒpƒPƒbƒg‚Ì 0xe5 ¨ 0x1f4 ‚ɉ¼‘Ήž(–{ŽI‚Å‚ÌŽZoŽ®‚Í•s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ char_id ‚ð‘—M)
- C clif_tradestart()
- ŽæˆøƒpƒPƒbƒg‚Ì 0xe7 ¨ 0x1f5 ‚ɉ¼‘Ήž(–{ŽI‚Å‚ÌŽZoŽ®‚Í•s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ char_id ‚ð‘—M)
- C clif_getareachar_pc()
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª•‰”‚ÌŽž‚É‚ÍÔƒGƒ‚•\Ž¦ƒpƒPƒbƒg‚ð‘—M‚·‚é‚悤‚É‚µ‚½
- C clif_getareachar_npc()
- NPC‚ÌHideó‘ԂɑΉž
- C clif_getareachar_skillunit()
- C clif_skill_nodamage()
- Ž©”š‚ÌŽž‚Íheal‚𕉔‚É‚Å‚«‚é‚悤‚É‚µ‚½
- C clif_skill_setunit()
- ƒOƒ‰ƒtƒBƒeƒB‚ɑΉž
- A clif_item_repair_list()
- •ŠíC—ƒXƒLƒ‹‚ɑΉž‚µ‚悤‚Æ‚µ‚½‚¯‚ǃpƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“ÚÁ’†
- C clif_produceeffect()
- map_addchariddb() ‚̈ø”‘‰Á‚ɑΉž
- C clif_guild_skillinfo()
- –¢ŽÀ‘•ƒMƒ‹ƒhƒXƒLƒ‹ ƒJƒŠƒXƒ}‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
- C clif_callpartner()
- ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ Žg—pŽž‚É‘ŠŽè‚Ì–¼‘O‚ð‹©‚Ô‚æ‚¤‚É‚µ‚½
- C clif_sitting()
- ˆø” fd ‚Í•s—v‚È‚Ì‚Åíœ
- C clif_GM_kick()
- ƒtƒ‰ƒO‚ð0‚É‚·‚é‚悤‚É‚µ‚½
- A clif_wisexin()
- Wis‹‘”Û‹–‰Â‚̉ž“š‚ð‘—M
- A clif_wisall()
- Wis‘S‹‘”Û‹–‰Â‚̉ž“š‚ð‘—M
- A clif_soundeffect()
- SE‚ð–‚炷ƒpƒPƒbƒg‚ð‘—M
- soundeffect–½—ß‚ÅŽg—p
- C clif_parse_LoadEndAck()
- Œ‹¥Œã‚̃EƒFƒfƒBƒ“ƒOƒhƒŒƒX‚âƒ^ƒLƒV[ƒh‚Ìó‘Ô‚ðƒƒOƒAƒEƒg‚µ‚Ä‚à1ŽžŠÔ‚ÍŒp‘±‚³‚ê‚é‚悤‚É‚µ‚½
- ÔƒGƒ‚ó‘Ԃ̓ƒOƒAƒEƒg‚µ‚Ä‚àƒƒOƒCƒ“‚µ‚½Žž‚©‚ç‚Ü‚½Œp‘±‚·‚é‚悤‚É‚µ‚½
- C clif_parse_QuitGame()
- C clif_parse_Restart()
- I—¹‚Å‚«‚È‚¢ðŒ‚ð pc_isquitable() ‚É‚Ü‚Æ‚ß‚½
- C clif_parse_GlobalMessage()
- C clif_parse_Wis()
- C clif_parse_PartyMessage()
- C clif_parse_GuildMessage()
- ÔƒGƒ‚ó‘Ô‚Å‚Í”­Œ¾‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_ActionRequest()
- ƒMƒ‹ƒh–¢‰Á“ü‚È‚Ç‚Ìꇂ̓K[ƒfƒBƒAƒ“‚âƒGƒ“ƒyƒŠƒEƒ€‚ð‰£‚ê‚È‚¢‚悤‚É‚µ‚½
- clif_sitting()‚̈ø”•ÏX‚ɑΉž
- C clif_parse_UseItem()
- ÔƒGƒ‚ó‘Ԃł̓AƒCƒeƒ€‚ðŽg‚¦‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_EquipItem()
- ƒAƒCƒeƒ€‚ª”j‰ó‚³‚ê‚Ä‚¢‚鎞‚Í‘•”õ‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_TradeRequest()
- C clif_parse_TradeAck()
- notradeƒ}ƒbƒv‚Å‚ÍŽæˆø—v¿‚ð‘—‚ê‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_UseSkillToId()
- C clif_parse_UseSkillToPos()
- C clif_parse_UseSkillMap()
- noskillƒ}ƒbƒv‚ł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- ƒ`ƒƒƒbƒg’†‚̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- ÔƒGƒ‚’†‚̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- ƒEƒFƒfƒBƒ“ƒOó‘Ԃł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_MoveToKafra()
- itemdb_isdropable()==0 ‚Í‘qŒÉ‚É“ü‚ê‚ç‚ê‚È‚¢‚悤‚É‚µ‚½
- C clif_parse_GMReqNoChat()
- GM‰EƒNƒŠƒbƒN‚ÅÔƒGƒ‚‚ð•t—^E‰ðœ‚Å‚«‚é‚悤‚É‚µ‚½
- C clif_parse_GMReqNoChatCount()
- –{ŽI‚Å‚Ì•Ô“šƒpƒPƒbƒg‚ª‚æ‚­•ª‚©‚ç‚È‚¢‚̂ʼn¼‘Ήž
- –{“–‚̓AƒJƒEƒ“ƒg–¼‚ª•Ô‚é‚Ì‚©‚ÈH
- C clif_parse_sn_explosionspirits()
- ƒNƒ‰ƒCƒAƒ“ƒg‚©‚çƒpƒPƒbƒg‚ª—ˆ‚½Žž‚ɃRƒ“ƒ\[ƒ‹‚ɃƒO‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
- BaseLv99ˆÈã‚ÌŽž‚É0‚ÅœŽZ‚·‚é‰Â”\«‚ª‚ ‚é‚Ì‚ð‰ñ”ð
- A pstrcmp()
- clif_parse_wisexin()‚Ìqsort()‚ÅŽg—p
- A clif_parse_wisexin()
- Wis‹‘”Û‹–‰Â‚ɑΉž
- A clif_parse_wisexlist()
- Wis‹‘”ÛƒŠƒXƒg•\Ž¦‚ɑΉž
- A clif_parse_wisall()
- Wis‘S‹‘”Û‹–‰Â‚ɑΉž
- A clif_parse_GMkillall()
- GMƒRƒ}ƒ“ƒh/killall(=@kickall)‚ɑΉž
- A clif_parse_GMsummon()
- GMƒRƒ}ƒ“ƒh/summon(=@recall)‚ɑΉž
- A clif_parse_GMshift()
- GMƒRƒ}ƒ“ƒh/shift(=@jumpto)‚ɑΉž
- A clif_parse_debug()
- packet_db.txt‚̃fƒoƒO—p‚ɒljÁ
- ƒpƒPƒbƒg“à—e‚ðƒ_ƒ“ƒv‚µ‚Ü‚·
- C clif_parse()
- clif_parse_func_table ‚ðíœ(packet_db[cmd].func‚É“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½)
- A packetdb_readdb()
- packet_db.txt‚ð“Ç‚Ýž‚Ý‚Ü‚·
- ƒtƒH[ƒ}ƒbƒg‚Í ƒpƒPƒbƒg”Ô†,ƒpƒPƒbƒg’·[,ƒRƒ}ƒ“ƒh,ƒRƒ}ƒ“ƒhˆø”‚̈ʒu(:‹æØ‚è‚Å•¡”Žw’è)]
- ƒRƒ}ƒ“ƒhˆø”‚̈ʒu‚ÍŠeƒRƒ}ƒ“ƒh‚ɑΉž‚·‚éŠÖ”“à‚Åݒ肳‚ê‚Ä‚¢‚é‚Ì‚Åclif.c‚ð“Ç‚Ü‚È‚¢‚Æ•ª‚©‚ç‚È‚¢“ï‰ð‚ȃtƒH[ƒ}ƒbƒg‚Å‚·
- •ÏX‚³‚ꂽƒpƒPƒbƒg‚Ípacket_db.txt‚Ì––”ö‚ɒljÁ‚µ‚Ü‚·
- ŒÃ‚¢ƒNƒ‰ƒCƒAƒ“ƒg‚ð—˜—p‚·‚éꇂɂ͕s—v‚È’è‹`‚ð––”ö‚©‚ç휂·‚ê‚΂悢‚悤‚É‚µ‚Ü‚·
- A do_final_clif()
- I—¹Žž‚ɃZƒbƒVƒ‡ƒ“‚ð휂·‚é‚悤‚É‚µ‚½
- C do_init_clif()
- packet_db‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- I—¹Žž‚ɃZƒbƒVƒ‡ƒ“‚ð휂ł«‚é‚悤‚É make_listen_port() ‚Ì–ß‚è’l‚ð map_fd ‚É“ü‚ê‚é‚悤‚É‚µ‚½
- C clif.h
- A MAX_PACKET_DB
- A struct packet_db
- A clif_changestatus()
- A clif_misceffect2()
- A clif_callpartner()
- A clif_sitting()
- A clif_soundeffect()
- A clif_item_repair_list()
- A do_final_clif()
- ’è‹`‚ð’ljÁ
- C clif_class_change
- clif_mob_class_change() ‚©‚ç•ÏX
- C guild.c
- C guild_read_castledb()
- castle_event ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- C guild_skillup()
- ˆø”‚ð•ÏX
- flag=1 ‚ŃMƒ‹ƒhƒ|ƒCƒ“ƒg‚ðŽg—p‚µ‚È‚¢‚悤‚É‚µ‚½
- C guild_broken()
- ƒMƒ‹ƒh‰ðŽUŽž‚ÉŠ—LÔ‚ð”jŠü‚·‚邽‚ß‚Ì OnGuildBreak ƒCƒxƒ“ƒg‚ð’ljÁ
- A guild_db_final()
- A castle_db_final()
- A guild_expcache_db_final()
- A guild_infoevent_db_final()
- A do_final_guild()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C guild.h
- C guild_skillup()
- ’è‹`‚ð•ÏX
- A do_final_guild()
- ’è‹`‚ð’ljÁ
- C intif.c
- atcommand.h ‚ðinclude
- packet_len_table[] Šg’£
- C intif_guild_skillup()
- ˆø” flag ’ljÁ
- A intif_charposreq()
- ƒLƒƒƒ‰‚Ìꊗv‹ƒpƒPƒbƒg‚ð‘—M
- flag=1 @jumpto
- flag=0 @where
- A intif_jumpto()
- ‘¼map-server‚̃Lƒƒƒ‰‚É @jumpto o—ˆ‚é‚悤‚É‚µ‚½
- A intif_where()
- ‘¼map-server‚̃Lƒƒƒ‰‚É @where o—ˆ‚é‚悤‚É‚µ‚½
- A intif_charmovereq()
- ƒLƒƒƒ‰‚ðŒÄ‚ÑŠñ‚¹‚é
- flag=1 @recall
- flag=0 ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢
- A intif_displaymessage()
- ‘¼map-server‚̃Lƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—‚ê‚é‚悤‚É‚µ‚½
- (Wis‚Å‚Í‚È‚­‚Ä‘—‚è‚Á‚Ï‚È‚µB@recall ¬Œ÷Žž—p)
- C intif_parse_WisMessage()
- Wis‹‘”Û‚Ì”»’è‚ð‚·‚é‚悤‚É‚µ‚½
- A intif_parse_CharPosReq()
- ƒLƒƒƒ‰‚̋ꊂðInter‚Ö•Ô“š
- A intif_parse_CharPos()
- ƒLƒƒƒ‰‚̋ꊂªInter‚©‚ç‘—‚ç‚ê‚Ä‚«‚½‚Ì‚Å
- flag=1 ƒLƒƒƒ‰‚Ìꊂֈړ®(@jumpto)
- flag=0 ƒLƒƒƒ‰‚Ìꊂð•\Ž¦(@where)
- A intif_parse_CharMoveReq()
- ƒLƒƒƒ‰‚ª‚¢‚½‚çŽw’èˆÊ’u‚Ɉړ®‚³‚¹‚é
- flag=1 @recall ‚È‚Ì‚ÅGMƒŒƒxƒ‹‚ð”äŠrAƒƒbƒZ[ƒW‚ð•\Ž¦
- A intif_parse_DisplayMessage()
- Žw’èƒLƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—M
- C intif_parse()
- VƒpƒPƒbƒg‚ð’ljÁ
- C intif.h
- C intif_guild_skillup()
- ’è‹`•ÏX
- A intif_jumpto()
- A intif_where()
- A intif_charmovereq()
- A intif_displaymessage()
- ’è‹`‚̒ljÁ
- C itemdb.c
- A itemdb_isdropable()
- ƒAƒCƒeƒ€‚ªŽÌ‚Ä‚ç‚ê‚é‚©‚Ç‚¤‚©‚Ì”»’è‚ð‚·‚é
- A itemdb_read_cardillustnametable()
- grfƒtƒ@ƒCƒ‹‚©‚ç num2cardillustnametable.txt ‚ð“Ç‚Ýž‚Þ
- cutincard–½—ß‚ÅŽg—p
- C do_init_itemdb()
- itemdb_read_cardillustnametable() ‚ð’ljÁ
- C itemdb.h
- C struct item_data
- char cardillustname[64] ’ljÁ
- A itemdb_isdropable()
- ’è‹`‚̒ljÁ
- C Makefile
- A malloc.o malloc.h ‚ð’ljÁ
- C map.c
- C struct charid2nick
- @who‚Å‘¼map-server‚̃Lƒƒƒ‰‚à•\Ž¦‚Å‚«‚é‚悤‚É account_id ip port ‚ð’ljÁ
- C map_freeblock()
- C map_freeblock_unlock()
- “ñdfree()‘Îô‚ÅNULL‚ð‘ã“ü‚·‚é‚悤‚É‚µ‚½
- C map_delblock()
- Œ©‚â‚·‚¢‚悤‚ÉŒJ‚è•Ô‚µŽg—p‚³‚ê‚é•Ï”‚ð‚Ü‚Æ‚ß‚½
- C map_addchariddb()
- charid2nick ‚ÌŠg’£‚É‚ ‚킹‚Ĉø”‚ð‘‚₵‚½
- A map_delchariddb()
- charid_db ‚©‚çƒLƒƒƒ‰‚ðíœ(ŽÀÛ‚É‚Íip port‚ð0‚É)‚·‚é
- C map_quit()
- Œ‹¥ó‘Ô’†‚̓ƒOƒAƒEƒg‚µ‚Ä‚à1ŽžŠÔ‚Íó‘Ô‚ª‘±‚­‚悤‚ÉPCƒOƒ[ƒoƒ‹•Ï” PC_WEDDING_TIME ‚ÉŠJŽnŽžŠÔ‚ð‹L˜^‚·‚é‚悤‚É‚µ‚½
- C map_id2bl()
- Œ©‚â‚·‚¢‚悤‚É‘‚«Š·‚¦
- A map_eraseipport()
- ‘¼map-serverŠÇ—‚̃}ƒbƒv‚ð map_db ‚©‚ç휂·‚é
- A map_who_sub()
- A map_who()
- ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚à @who ‚Å•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚½
- •\Ž¦ãƒLƒƒƒ‰‚ªŽc‚邱‚Æ‚ª‚ ‚é‚Ì‚Í’²¸’†
- A id_db_final()
- A map_db_final()
- A nick_db_final()
- A charid_db_final()
- C do_final()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É•ÏX
- C map.h
- A MAX_WIS_REFUSAL
- Wis‹‘”ÛƒŠƒXƒg‚Ì•Û‘¶Å‘å’l
- C struct map_session_data
- C special_state
- A unbreakable_weapon
- •Ší‚ªâ‘΂ɉó‚ê‚È‚¢
- A unbreakable_armor
- ŠZ‚ªâ‘΂ɉó‚ê‚È‚¢
- A opt3
- ‰æ–ÊŠO‚©‚ç“ü‚Á‚Ä‚«‚½ƒLƒƒƒ‰‚Ìó‘Ô
- A areanpc_id
- OnTouchƒCƒxƒ“ƒg‚ðŽÀs‚µ‚½NPC‚ÌID
- A wis_refusal[][]
- Wis‹‘”ÛƒŠƒXƒg
- A wis_all
- Wis‘S‹‘”Ûƒtƒ‰ƒO
- A break_weapon_rate
- •Ší”j‰ó—¦
- A break_armor_rate
- ŠZ”j‰ó—¦
- A add_steal_rate
- ’ljÁƒXƒeƒB[ƒ‹—¦
- C struct npc_data
- A opt1,opt2,opt3,option
- PC‚Æ“¯‚¶
- C u.scr
- A src_id
- I—¹Žž‚̃ƒ‚ƒŠŠJ•ú—p
- C struct mob_data
- A opt3
- PC‚Æ“¯‚¶
- A guild_id
- ƒK[ƒfƒBƒAƒ“‚È‚Ç‚ÅŽg—p
- D exclusion_*
- ŠÖ˜AŠÖ”‚ðÁ‚µ‚½‚Ì‚Å휂µ‚½
- C struct map_data
- C flag
- A notrade
- Žæˆø‹ÖŽ~ƒ}ƒbƒvƒtƒ‰ƒO
- A noskill
- ƒXƒLƒ‹Žg—p‹ÖŽ~ƒ}ƒbƒvƒtƒ‰ƒO
- ’蔂̒ljÁ
- SP_PARTNER SP_CART
- SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE
- SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR
- D talkie_mes[]
- ’è‹`íœ
- C map_addchariddb()
- ’è‹`•ÏX
- A map_delchariddb()
- A map_eraseipport()
- A map_who()
- ’è‹`’ljÁ
- C mob.c
- D mob_exclusion_add()
- D mob_exclusion_check()
- ˆÓ–¡‚ª‚ ‚éŽg—p‚ð‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Æbattle_check_target()‚Å‘ã—p‚Å‚«‚é‚Ì‚Å휂µ‚½
- C mob_stop_walking()
- type&4‚Å–Ú“I‚Ìꊂ܂ŋ——£‚ª‚ ‚ê‚Î1•ài‚ñ‚ÅŽ~‚Ü‚é‚悤‚É‚µ‚½
- C mob_attack()
- Mob‚ªMob‚ðUŒ‚‚Å‚«‚é‚悤‚É‚µ‚½
- C mob_target()
- C mob_ai_sub_hard_slavemob()
- mob_exclusion_check()‚ðíœ
- C mob_ai_sub_hard_activesearch()
- C mob_ai_sub_hard()
- special_mob_ai‚ÈꇂÍMob‚àõ“G‚·‚é‚悤‚É‚µ‚½
- ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚ª–Ú•W‚̃AƒCƒeƒ€‚ðŒ©Ž¸‚Á‚½Žž‚Í–Ú“I‚ÌêŠ‚Ü‚Å•à‚©‚È‚¢‚悤‚É‚µ‚½
- C mob_damage()
- ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ꂽŽž‚ÉŽ©”š‚µ‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚½
- ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ê‚ÄŽ©”š‚·‚鎞‚Ɉړ®‚·‚é‚悤‚É‚µ‚½
- src‚ªMob‚ÌŽž‚Ísrc‚̃^[ƒQƒbƒg‚ðŠO‚·‚悤‚É‚µ‚½
- C mob_skillid2skillidx()
- ƒCƒ“ƒfƒbƒNƒX‚ª0‚©‚çŽn‚Ü‚é‚̂ɃGƒ‰[‚à0‚ð•Ô‚·‚µ‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½
- ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ê‚Ä‚àŽ©”š‚µ‚È‚¢Œ´ˆö‚Í‚±‚ê
- C mobskill_use()
- Ž©”šó‘Ԃł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- C mob_spawn()
- ƒK[ƒfƒBƒAƒ“‚ƃGƒ“ƒyƒŠƒEƒ€‚ªÔ‚Å”­¶‚µ‚½ê‡‚Í guild_id ‚ðÝ’è
- opt3 ‚ð 0 ‚ʼnŠú‰»
- C mob_can_reach()
- GvGˆÈŠO‚ł̓K[ƒfƒBƒAƒ“‚͉½‚à‚µ‚È‚¢‚悤‚É‚µ‚½
- C mob_catch_delete()
- Mob‚ªÁ‚¦‚é‚Æ‚«‚̃GƒtƒFƒNƒg‚ð type ‚ÅŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
- C mob_timer_delete()
- ƒXƒtƒBƒAƒ}ƒCƒ“‚ƃoƒCƒIƒvƒ‰ƒ“ƒg‚ªÁ‚¦‚é‚Æ‚«‚̓eƒŒƒ|ƒGƒtƒFƒNƒg‚ÅÁ‚¦‚é‚悤‚É‚µ‚½
- C mob_deleteslave_sub()
- nullƒ`ƒFƒbƒN‘O‚É‘ã“ü‚µ‚Ä‚¢‚é•”•ª‚ðC³
- C mob_class_change()
- clif_class_change() ‚Ì•ÏX‚ɑΉž
- C mob.h
- C mob_catch_delete()
- ’è‹`•ÏX
- D mob_exclusion_add()
- D mob_exclusion_check()
- ’è‹`íœ
- C npc.c
- C struct npc_src_list
- A prev
- I—¹Žž‚̃ƒ‚ƒŠŠJ•ú—p‚ɒljÁ
- C npc_checknear()
- ƒCƒxƒ“ƒgPC‚ÌꇂÉí‚ÉOK‚ð•Ô‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
- A npc_enable_sub()
- npc_enable() ‚©‚çŒÄ‚΂ê‚ÄŽüˆÍ‚ÌPC‚ÉOnTouchƒCƒxƒ“ƒg‚ðŽÀs‚·‚é
- C npc_enable()
- flag ‚É‚æ‚é‹““®‚ð’ljÁ
- flag=2 NPC‚ÌHideó‘Ô‚ð‰ðœ‚·‚é
- flag=4 NPC‚ðHideó‘Ô‚É‚·‚é
- Hide‚µ‚Ä‚¢‚éNPC‚Í–³Œø‚É‚È‚è‚Ü‚·
- —LŒø‚É‚µ‚½Žž‚É npc_enable_sub() ‚ðŒÄ‚Ԃ悤‚É‚µ‚½
- C npc_event()
- ƒGƒ‰[Žž‚Í1‚ð•Ô‚·‚悤‚É•ÏX
- OnTouchƒCƒxƒ“ƒg‚©‚çŒÄ‚΂ꂽ‚Æ‚«‚̓Cƒxƒ“ƒg‚ªŒ©‚‚©‚ç‚È‚¢ƒGƒ‰[‚ð•Ô‚³‚È‚¢‚悤‚É‚µ‚½
- C npc_touch_areanpc()
- PC‚ªƒGƒŠƒA“à‚ð’Ê‚Á‚½Žž‚ɉ½“x‚àŽÀs‚³‚ê‚é‚Ì‚ðC³
- NPC‚ÉOnTouchƒCƒxƒ“ƒg‚ª‚ ‚Á‚½ê‡‚É‚ÍŽÀs‚·‚é‚悤‚É‚µ‚½
- ŒÝŠ·«‚ð•Û‚‚½‚ß‚ÉOnTouchƒCƒxƒ“ƒg‚ª–³‚¢ê‡‚Í¡‚Ü‚Å‚Æ“¯‚¶‚悤‚É“®‚«‚Ü‚·
- C npc_parse_warp()
- option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
- C npc_parse_warp()
- C npc_parse_shop()
- ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
- option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
- C npc_convertlabel_db()
- ƒƒ‚ƒŠŠm•ÛŒã‚Énull‚©‚Ç‚¤‚©Šm”F‚µ‚Ä‚¢‚È‚¢‚Ì‚ðC³
- C npc_parse_script()
- bad duplicate name!ƒGƒ‰[•\Ž¦‚ª‰üs‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
- I—¹Žžƒƒ‚ƒŠŠJ•ú—p‚Éduplicate‚Å src_id ‚ð‘}“ü
- ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
- option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
- C npc_parse_mob()
- memwatch‘Îô‚Ńƒ‚ƒŠ‚ðˆêŠ‡Šm•Û‚µ‚È‚¢‚悤‚É‚µ‚½
- ƒ‚ƒ“ƒXƒ^[–¼‚É --ja-- --en-- ‚ðŽw’è‚·‚é‚Æmob_db‚Ì–¼‘O‚ðŽg‚¤‚悤‚É‚µ‚½
- ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
- C npc_parse_mapflag()
- notrade noskill ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
- A ev_db_final()
- A npcname_db_final()
- A do_final_npc()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C do_init_npc()
- ƒƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C npc.h
- A do_final_npc()
- ’è‹`‚̒ljÁ
- C party.c
- A party_db_final()
- A do_final_party()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C party.h
- A do_final_party()
- ’è‹`‚̒ljÁ
- C pc.c
- A pc_numisGM()
- account_id‚ÅGM‚©‚Ç‚¤‚©”»’f‚·‚é
- A pc_isquitable()
- PC‚ªI—¹‚Å‚«‚éó‘Ô‚É‚ ‚é‚©‚Ç‚¤‚©”»’f‚·‚é
- 1‚ð•Ô‚·‚Æ‚«‚ÍI—¹‚Å‚«‚È‚¢
- C pc_counttargeted_sub()
- Mobó‘Ô‚É‚æ‚Á‚Ä’l‚𳂵‚­•Ô‚³‚È‚¢‚悤‚È‹C‚ª‚·‚é‚Ì‚ÅðŒ‚ð‰¼•ÏX
- C pc_makesavestatus()
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª³”‚Ìê‡‚Í 0 ‚É‚·‚é
- C pc_authok()
- wis_all ‚ð 0 ‚ʼnŠú‰»
- map_addchariddb() ‚Ì•ÏX‚ɑΉž‚Æí‚ÉŽÀs‚·‚é‚悤‚É‚µ‚½
- C pc_calcstatus()
- break_weapon_rate break_armor_rate add_steal_rate ‚ð 0 ‚ʼnŠú‰»
- Œ‹¥ó‘Ô‚Å‚Í•à‚­‘¬“x‚ª”¼•ª‚É‚È‚é‚悤‚É‚µ‚½
- C pc_bonus()
- SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE
- ˆ—‚ð’ljÁ
- C pc_dropitem()
- ƒAƒCƒeƒ€‚ðŽÌ‚Ä‚ç‚ê‚é‚©‚Ç‚¤‚©”»’è‚·‚é‚悤‚É‚µ‚½
- C pc_putitemtocart()
- ƒAƒCƒeƒ€‚ðƒJ[ƒg‚Ɉړ®‚Å‚«‚é‚©”»’è‚·‚é‚悤‚É‚µ‚½
- C pc_steal_item()
- ƒXƒeƒB[ƒ‹—¦‚É add_steal_rate ‚ð‰ÁŽZ‚·‚é‚悤‚É‚µ‚½
- C pc_walk()
- C pc_movepos()
- ”͈ÍNPC‚ª‚¢‚È‚¢‚Æ‚«‚É‚Í areanpc_id=0 ‚É‚µ‚½
- C pc_checkbaselevelup()
- ƒXƒpƒmƒr‚ªƒŒƒxƒ‹ƒAƒbƒv‚µ‚½Žž‚É‚©‚©‚éƒXƒLƒ‹‚̃Œƒxƒ‹‚ð–{ŽI‚É‚ ‚킹‚½
- C pc_skillup()
- guild_skillup() ‚Ì•ÏX‚ɑΉž
- C pc_damage()
- ƒXƒpƒmƒr‚ªExp99%‚ÅHP‚ª0‚É‚È‚é‚ÆHP‚ª‰ñ•œ‚µ‚Ä‹à„ó‘Ô‚É‚È‚é‚悤‚É‚µ‚½
- C pc_readparam()
- nullƒ`ƒFƒbƒN‘O‚Ésd‚ðŽg‚Á‚Ä‚¢‚½‚Ì‚ðC³
- A SP_PARTNER
- Œ‹¥‘ŠŽè‚Ìchar_id
- A SP_CART
- ƒJ[ƒg‚ðˆø‚¢‚Ä‚¢‚éꇂÍ0ˆÈオ•Ô‚é
- C pc_jobchange()
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª•‰”‚ÌꇂÍÔƒGƒ‚•\Ž¦‚·‚é‚悤‚É‚µ‚½
- A pc_break_weapon()
- •Ší”j‰ó‚ð‚·‚é
- A pc_break_armor()
- ŠZ”j‰ó‚ð‚·‚é
- C pc_natural_heal_sp()
- ƒXƒpƒmƒr‚Í”š—ôó‘Ô‚Å‚àSP‚ªŽ©‘R‰ñ•œ‚·‚é‚悤‚É‚µ‚½
- A gm_account_db_final()
- A do_final_pc()
- I—¹Žž‚Ƀƒ‚ƒŠŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C pc.h
- A pc_numisGM()
- A pc_isquitable()
- A pc_break_weapon()
- A pc_break_armor()
- A do_final_pc()
- ’è‹`’ljÁ
- C pet.c
- C pet_data_init()
- C pet_lootitem_drop()
- ƒƒ‚ƒŠŠm•Û‚Å‚«‚½‚©‚Ç‚¤‚©Šm”F‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ÅC³
- C pet_catch_process2()
- mob_catch_delete() ‚Ì•ÏX‚ɑΉž
- C script.c
- ’ljÁ‚µ‚½ŠÖ”‚̃vƒƒgƒ^ƒCƒv‚ð擪‚ɒljÁ
- buildin_func[]‚ɒljÁ‚µ‚½–½—ß‚âŠÖ”‚ð’ljÁ
- ‰‰ŽZŽq‚É C_R_SHIFT C_L_SHIFT ‚ð’ljÁ
- C parse_subexpr()
- ‰‰ŽZŽq >> << ’ljÁ
- C get_val()
- PCŽå‘Ì‚Ì•Ï”‚ÅPC‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚çƒGƒ‰[‚ðo‚·‚悤‚É‚µ‚½
- PCŽå‘Ì‚Ì•Ï”‚Åsd=NULL‚¾‚Á‚½ê‡‚É‚Ípc_read*‚Ŏ擾‚És‚©‚È‚¢‚悤‚É‚µ‚½
- A buildin_close2()
- ƒXƒNƒŠƒvƒg‚ð’†’f‚µ‚ÄCloseƒ{ƒ^ƒ“‚ð•\Ž¦‚µ‚Ü‚·
- C buildin_areawarp_sub()
- Random‚¾‚¯‚Å‚È‚­SavePoint‚É‚à”ò‚΂¹‚é‚悤‚É‚µ‚½
- A buildin_cutincard()
- ƒJ[ƒh‚̃AƒCƒeƒ€ID‚ðŽw’è‚·‚邱‚ƂŃJ[ƒh‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
- C buildin_getitem()
- ˆø”‚ð•ÏX‚µ‚ĊӒ肵‚½ó‘Ô‚Å“n‚·‚©‚Ç‚¤‚©‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
- account_id‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ɃAƒCƒeƒ€‚ð“n‚¹‚é‚悤‚É‚µ‚½(Œ‹¥—pŠg’£)
- C buildin_getitem2()
- account_id‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ɃAƒCƒeƒ€‚ð“n‚¹‚é‚悤‚É‚µ‚½(Œ‹¥—pŠg’£)
- C buildin_readparam()
- ƒLƒƒƒ‰–¼‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚̃pƒ‰ƒ[ƒ^‚ð“Ç‚ÝŽæ‚ê‚é‚悤‚É‚µ‚½
- C buildin_getcharid()
- ƒLƒƒƒ‰–¼‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ÌŠÖŒWID‚ðŽæ“¾‚Å‚«‚é‚悤‚É‚µ‚½
- A buildin_getpartymember()
- Žw’èID‚̃p[ƒeƒBl”‚̎擾‚ƃp[ƒeƒB[ƒƒ“ƒo[‚ÌID‚ð”z—ñ‚Ŏ擾‚Å‚«‚Ü‚·
- A buildin_guildskill()
- ƒMƒ‹ƒhƒXƒLƒ‹‚ðŠo‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·
- C buildin_getgdskilllv()
- ƒMƒ‹ƒhƒXƒLƒ‹ID‚ðGD_APPROVAL‚̂悤‚ȃXƒLƒ‹–¼‚ÅŽw’è‚·‚é‚悤‚É‚µ‚½
- A buildin_hideoffnpc()
- Hideó‘Ô‚ÌNPC‚ð•\Ž¦‚·‚é
- A buildin_hideonnpc()
- NPC‚ðHideó‘Ô‚É‚·‚é
- C buildin_sc_start()
- IDŽw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚Å‚«‚é‚悤‚É‚µ‚½
- A buildin_sc_start2()
- Šm—¦Žw’è‚ŃLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚Å‚«‚Ü‚·(ƒAƒCƒXA‚¨‚à‚¿“™‚ÅŽg—p)
- A buildin_getscrate()
- ó‘ÔˆÙí‘Ï«‚ðŒvŽZ‚µ‚½Šm—¦‚ð•Ô‚·
- C buildin_changebase()
- ID‚ÅŽw’肵‚½ƒLƒƒƒ‰‚ÌŒ©‚½–Ú‚ð•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚½
- C buildin_waitingroom()
- limit=0‚ÌŽž‚Í(1/10)‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
- C buildin_setmapflag()
- MF_NOTRADE MF_NOSKILL ‚ð’ljÁ
- C buildin_flagemblem()
- NPC‚ª“Á’è‚Å‚«‚È‚©‚Á‚½‚Æ‚«‚Émap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
- A buildin_getinventorylist()
- ”z—ñ‚ÅŠŽ•i‚ð•Ô‚µ‚Ü‚·
- A buildin_getskilllist()
- ”z—ñ‚ÅŠ—LƒXƒLƒ‹‚ð•Ô‚µ‚Ü‚·
- A buildin_clearitem()
- ŠŽƒAƒCƒeƒ€‚ð휂µ‚Ü‚·
- A buildin_getrepairableitemcount()
- ‰ó‚ê‚Ä‚¢‚éƒAƒCƒeƒ€‚𔂦‚Ü‚·
- A buildin_repairitem()
- ‰ó‚ê‚Ä‚¢‚éƒAƒCƒeƒ€‚ð‚·‚×‚ÄC—‚µ‚Ü‚·
- A buildin_classchange()
- NPC‚ðƒNƒ‰ƒXƒ`ƒFƒ“ƒW‚µ‚Ü‚·
- A buildin_misceffect()
- ƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·
- A buildin_soundeffect()
- Žw’肵‚½SE‚ð–‚炵‚Ü‚·
- C op_2num()
- C run_script_main()
- ƒVƒtƒg‰‰ŽZŽq‚ð’ljÁ
- A mapreg_db_final()
- A mapregstr_db_final()
- A scriptlabel_db_final()
- A userfunc_db_final()
- C do_final_script()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C skill.c
- <timer.h> intif.h ‚ðinclude
- ƒRƒƒ“ƒg‚̃XƒLƒ‹–¼‚ðjROŽd—l‚É‘‚«Š·‚¦
- C SkillStatusChangeTable[]
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ ƒOƒ‰ƒtƒBƒeƒB Ž©”š Ž©”š2 ‚ð’ljÁ
- C skill_additional_effect()
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[’ljÁ
- ƒAƒ“ƒNƒ‹ƒXƒlƒA‚ðíœ
- C skill_attack()
- ƒ`ƒƒƒbƒg’†‚ɃXƒLƒ‹‚ª‰e‹¿‚µ‚È‚¢‚悤‚É‚µ‚½(ƒ`ƒƒƒbƒgƒLƒƒƒ“ƒZƒ‹)
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ÍSkillLv=-1‚Åclif_skill_damage()‚·‚é‚悤‚É‚µ‚½
- Ž©”š‚̓_ƒ[ƒW•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
- C skill_castend_damage_id()
- ƒAƒVƒbƒhƒeƒ‰[‚Å•Ší”j‰ó‚ð‚·‚é‚悤‚É‚µ‚½
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ª3*3‚͈̔ÍUŒ‚‚ð‚·‚é‚悤‚É‚µ‚½
- Ž©”š‚̈—‚ð•ÏX‚µ‚½
- C skill_castend_nodamage_id()
- sd‚Ædstsd‚ÅPC‚©‚Ç‚¤‚©‚ð”»’è‚·‚é‚悤‚É‚µ‚½
- ƒXƒpƒmƒr‚̉łªƒq[ƒ‹‚ðŽg‚¤‚Ɖñ•œ—Ê‚ª2”{‚É‚È‚é‚悤‚É‚µ‚½
- clif_sitting()‚Ì•ÏX‚ɑΉž
- •ŠíC—‚̓pƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚̂ŃRƒƒ“ƒgƒAƒEƒg
- ƒXƒgƒŠƒbƒv`AƒPƒ~ƒJƒ‹`‚ðƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÉŽg—p‚µ‚½ê‡Amap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
- ŒN‚¾‚¯‚ÍŒì‚é‚æA‚ ‚È‚½‚ׂ̈ɋ]µ‚É‚È‚è‚Ü‚·‚ÌŒvŽZ‚ðMAX_HP‚Ü‚½‚ÍMAX_SP‚©‚ç‚·‚é‚悤‚É‚µ‚½
- ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ ‚ð‘ŠŽè‚Ì–¼‘O‚ð‹©‚ÔA•¡”Ý’u‚Å‚«‚È‚¢“™A–{ŽI•—‚É‚µ‚½
- ƒAƒ“ƒNƒ‹ƒXƒlƒA‚ÅPC‚ªˆø‚Á‚©‚©‚Á‚Ä‚¢‚鎞‚ɃŠƒ€[ƒuƒgƒ‰ƒbƒv‚µ‚Ä‚àPC‚ª“®‚¯‚é‚悤‚É‚È‚ç‚È‚©‚Á‚½‚Ì‚ðC³
- ƒAƒ“ƒR[ƒ‹‚ð‹©‚Ô‚æ‚¤‚É‚µ‚½
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ðŽÀ‘•‚µ‚½
- Ž©”š‚ÅŽ©”šó‘Ô‚ðŠJŽn‚·‚é‚悤‚É‚µ‚½
- C skill_castend_pos2()
- ƒoƒCƒIƒvƒ‰ƒ“ƒgAƒXƒtƒBƒAƒ}ƒCƒ“
- ƒpƒPƒbƒg‡”Ô‚ð•ÏX
- Žw’肵‚½êŠ‚ÉÝ’u‚·‚é‚悤‚É‚µ‚½
- Œø‰ÊŽžŠÔ‚ðskill_cast_db.txt‚ÅŽw’è‚·‚é‚悤‚É‚µ‚½
- mob_exclusion_add()‚ðíœ
- ƒOƒ‰ƒtƒBƒeƒB‚ðŽÀ‘•A1ŒÂ‚µ‚©’u‚¯‚Ü‚¹‚ñ
- C skill_castend_map()
- ƒ[ƒvƒ|[ƒ^ƒ‹‚ÍŽÀÛ‚ÌÝ’uŽž‚Ƀuƒ‹[ƒWƒFƒ€ƒXƒg[ƒ“‚ðÁ”ï‚·‚é‚悤‚É‚µ‚½
- C skill_unitsetting()
- ƒOƒ‰ƒtƒBƒeƒB‚̃XƒLƒ‹ƒ†ƒjƒbƒg‚ð1ŒÂ‚ÉC³
- ƒg[ƒL[ƒ{ƒbƒNƒXAƒOƒ‰ƒtƒBƒeƒB‚Ì•¶Žš—ñ‚Í sd->message ‚ÉŠi”[‚·‚é‚悤‚É‚µ‚½
- C skill_unit_onplace()
- ƒ`ƒƒƒbƒgŽž‚̓XƒLƒ‹ƒ†ƒjƒbƒg‚ª“®ì‚µ‚È‚¢‚悤‚É‚µ‚½(ƒ`ƒƒƒbƒgƒLƒƒƒ“ƒZƒ‹)
- ƒAƒ“ƒNƒ‹ƒXƒlƒA‚É‚©‚©‚鈗‚ðskill_additional_effect()‚©‚çˆÚ“®
- ƒ[ƒvƒ|[ƒ^ƒ‹‚ÉpŽÒ‚ªæ‚Á‚½‚çÁ‚¦‚é‚悤‚É‚µ‚½
- ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚É‚æ‚é•Ší”j‰ó‚ð‚·‚é‚悤‚É‚µ‚½
- ƒAƒ“ƒNƒ‹ƒXƒlƒAAƒXƒpƒCƒ_[ƒEƒFƒbƒu‚Ńƒ‚ƒŠƒAƒNƒZƒXˆá”½‚ª‹N‚«‚é‰Â”\«‚ª‚ ‚Á‚½‚Ì‚ðC³
- C skill_unit_onout()
- ƒAƒ“ƒNƒ‹ƒXƒlƒA‚Åu}v‚ª‘«‚è‚È‚©‚Á‚½‚½‚ß‚É‹ß‚­‚ð’Ê‚è‚©‚©‚Á‚½‚¾‚¯‚Å1•bŒãã©‚É–ß‚Á‚Ä‚µ‚Ü‚Á‚½‚Ì‚ðC³
- C skill_unit_onlimit()
- ƒ[ƒvƒ|[ƒ^ƒ‹”­“®‘O‚̈—‚ðíœ
- ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ð‘¼map-server‚É‚¢‚Ä‚àŒÄ‚ׂé‚悤‚É‚µ‚½
- A skill_check_condition_mob_master_sub()
- ƒ}ƒbƒv“à‚Å“¯‚¶PC‚©‚ço‚½ƒoƒCƒIƒvƒ‰ƒ“ƒg‚âƒXƒtƒBƒAƒ}ƒCƒ“‚Ì”‚𔂦‚é
- C skill_check_condition()
- hp_rate‚Æsp_rate‚É•‰”‚ðŽw’è‚·‚é‚ÆÁ”ïŒvŽZ‚ðMax’l‚©‚ç‚·‚é‚悤‚É‚µ‚½
- ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ðŒ‹¥‚µ‚Ä‚¢‚È‚¢ó‘Ô‚ÅŽg‚Á‚½‚çŽg—pŽ¸”s‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
- ƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒAƒ}ƒCƒ“‚ÌÝ’u”‚ðskill_cast_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
- ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚Ì”§ŒÀ‚ð skill_use_pos() ‚©‚çˆÚ“®
- C skill_use_id()
- ƒoƒWƒŠƒJ‚ðGvG‚Å‚ÍŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Í‘ÎÛ‚ª“Åó‘Ô‚Å‚È‚¯‚ê‚ÎŽg—pŽ¸”s
- C skill_use_pos()
- ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚Ì”§ŒÀ‚ð skill_check_condition() ‚Ɉړ®
- C skill_status_change_end()
- opt3‚̈—‚ð’ljÁ
- Œ‹¥ó‘Ô‚ÌI—¹‚ð’ljÁ
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ð’ljÁ
- Ž©”š‚ð’ljÁ
- C skill_status_change_timer()
- Œ‹¥ó‘Ô‚ÆÔƒGƒ‚ó‘Ԃ̃^ƒCƒ}[ÄÝ’è‚ð’ljÁ
- Ž©”šó‘Ô‚Å‚Í1•b‚²‚Æ‚É‘¬“x‚ª•Ï‰»‚·‚é‚悤‚É‚µ‚½
- C skill_status_change_start()
- opt3‚̈—‚ð’ljÁ
- ƒOƒ‰ƒtƒBƒeƒB‚͒ljÁ‚Å’u‚¢‚½‚ç‘O‚Ì‚ÍÁ‚¦‚é‚悤‚É‚µ‚½
- Œ‹¥ó‘Ô‚ÆÔƒGƒ‚ó‘Ô‚ð’ljÁ
- ƒOƒ‰ƒtƒBƒeƒB‚Íó‘ÔˆÙíŠJŽnŽž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg‚ðÝ’u‚·‚é‚悤‚É‚µ‚½
- ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Í“Á‚ɉ½‚à’ljÁ‚Í‚È‚µ
- Ž©”š‚͉r¥ƒpƒPƒbƒg‚ð‚±‚±‚Å‘—‚é‚悤‚É‚µ‚½
- C skill_status_change_clear()
- opt3‚̈—‚ð’ljÁ
- C skill_unit_timer_sub()
- ƒ[ƒvƒ|[ƒ^ƒ‹”­“®‘O‚ªŽžŠÔØ‚ê‚É‚È‚é‚Æ‚«‚ÉŒ©‚½–Ú‚ð•ÏX‚µ‚Ä–{ŽI‚̂悤‚ÉŒø‰Ê‰¹‚ªo‚é‚悤‚É‚µ‚½
- ƒuƒ‰ƒXƒgƒ}ƒCƒ“ˆÈŠO‚Ìã©‚ÍŽžŠÔØ‚ê‚Åã©‚É–ß‚é‚悤‚É‚µ‚½
- C skill.h
- ó‘ÔˆÙí‚ɃXƒLƒ‹–¼‚ð‚¢‚­‚‚©‚‚¯‚½‚èAV‹K‚Ìó‘ÔˆÙí‚ð‘‚₵‚½
- C storage.c
- A storage_db_final()
- A guild_storage_db_final()
- C do_final_storage()
- I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
- C trade.c
- C trade_tradeadditem()
- C trade_tradecommit()
- itemdb_isdropable()‚ÅŒðŠ·‚Å‚«‚È‚¢ƒAƒCƒeƒ€‚ð”»’è‚·‚é‚悤‚É‚µ‚½
- C vending.c
- vending_purchasereq()
- ‹àŠzŒvŽZ‚ðdouble‚Å‚·‚é‚悤‚É‚µ‚Äint‚ÅŒ…‚ ‚ӂꂵ‚È‚¢‚悤‚É‚µ‚½
-
---------------------
-//1045 by TEILU
-
-EƒXƒeƒB[ƒ‹AƒXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌŽ¸”sƒƒbƒZ[ƒW‚ª
- ƒŒƒxƒ‹‚ª‚P`‚X‚ÌŽž‚É•Ï‚¾‚Á‚½‚Ì‚ÅC³B
- (map/)
- skill.c
-
-E¸˜B‚̉”ۂðî•ñƒTƒCƒg‚ðŒ³‚É‚c‚a‚ÉÝ’èBi“ª‘•”õ‚Írusi‚³‚ñ쬕ª‚ðŽg—pj
- (db/)
- item_db.txt
-
-Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚ª§ŒÀ”‚ð’´‚¦‚½‚Æ‚«‚ɃXƒLƒ‹Žg—pŽ¸”s‚ª
- o‚éƒ^ƒCƒ~ƒ“ƒO‚ð•ÏXB
- (map/)
- skill.c
-
-EƒAƒuƒ‰ƒJƒ^ƒuƒ‰ê—pƒXƒLƒ‹‚ðgm_all_skillݒ莞‚É•\Ž¦‚Å‚«‚é‚悤‚É•ÏXB
- battle_athena.conf‚Ìgm_all_skill_add_abra‚Éyes‚ðÝ’è‚·‚ê‚Î
- ƒXƒLƒ‹ƒŠƒXƒg‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚·B
- (conf/)
- battle_athena.conf
- (db/)
- skill_require_db.txt
- (map/)
- battle.c
- battle.h
- pc.c
-
---------------------
-//1044 by TEILU
-
-E1042‚Å@itemidentify‚ÌŒ ŒÀ‚ÌÝ’è‚ð–Y‚ê‚Ä‚¢‚½‚̂ŒljÁB
- (conf/)
- atcommand_athena.conf
-
-EƒXƒeƒB[ƒ‹AƒXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌŽ¸”sŽž‚É
- Ž¸”sƒƒbƒZ[ƒW‚ð•\Ž¦‚·‚é‚悤‚É•ÏXB
- (map/)
- skill.c
-
-EƒAƒCƒeƒ€‚c‚a‚ɸ˜B‰Â”Ûƒtƒ‰ƒO‚̃Jƒ‰ƒ€‚ð’ljÁ
- ¸˜B‚̉”ۂð‚c‚a‚ðŽQÆ‚·‚é‚悤‚ÉC³
- ¦‚Æ‚è‚ ‚¦‚¸’†’iA‰º’iA’†‰º’i‚Ì“ª‘•”õ‚ƃAƒNƒZƒTƒŠˆÈŠO‚Ì
- ‘•”õ•i‚Í‚·‚ׂĸ˜B‰Â‚ÌÝ’è‚Å‚c‚a‚ðì‚è‚Ü‚µ‚½B
- ‚c‚a‚ÍC³‚ª•K—v‚É‚È‚è‚Ü‚·B
- (db/)
- item_db.txt
- (map/)
- itemdb.c
- itemdb.h
- script.c
-
---------------------
-//1043 by dusk
-EdocƒtƒHƒ‹ƒ_EconfƒtƒHƒ‹ƒ_“à‚Ìhelp.txt‚É1042(TEILU‚³‚ñ)‚Ìà–¾’ljÁ
- @itemidentify‚Ìà–¾‚Í‚V‚Qs–Ú‚Ì@itemreset‚̉º‚ÉB
-
-EValkyrie Realms 5 (‰Eã)‚ÌŠø‚ÌC³
- Valkyrie Realms 5 (‰Eã)‚ÌŠø‚ðŒ©‚é‚Æ–¢Žæ“¾ó‘ÔƒRƒƒ“ƒg‚΂Á‚©‚èo‚Ä‚¢‚½‚Ì‚ð
- ‚¿‚á‚ñ‚ÆŠm”F‚Å‚«‚é‚悤‚ÉB
- ¦ Valkyrie Realms‚ÌŠeÔ‚É–ß‚éŠø‚Ƃ͈Ⴂ‚Ü‚·B
- prtg_cas05.txt“à‚̃Mƒ‹ƒhƒ_ƒ“ƒWƒ‡ƒ“‚É“ü‚郌ƒo[ˆÈŠO‚Ì
- getcastledata "prtg_cas05.gat",1,@GIDp5;‚ð
- set @GIDp5,getcastledata("prtg_cas05.gat",1);‚ÉC³B
-
---------------------
-//1042 by TEILU
-
-E@healƒRƒ}ƒ“ƒh‚ɉ½‚à“n‚³‚È‚¢‚ÆŠ®‘S‰ñ•œ‚·‚é‚悤‚É•ÏXB
- (map/)
- atcommand.c
-
-E@itemitemidentifyƒRƒ}ƒ“ƒh‚̒ljÁ
- –¢ŠÓ’è‚ÌŠŽƒAƒCƒeƒ€‚ð‘S‚ĊӒ肵‚Ü‚·B
- (conf/)
- msg_athena.conf
- (map/)
- atcommand.c
- atcommand.h
-
---------------------
-//1041 by mare
- FIX NPC Script Command - buildin_getgdskilllv()
- Add NPC Sctipt Command - buildin_agitcheck()
- (script/npc/job/)
- npc_job_wizard.txt
- ƒ‰ƒEƒŒƒ‹‚³‚ñ‚̑䎌Aƒmƒr‚ƃvƒŠ‚Ìꇂ̕ª’ljÁ
--------------------
-//1040 by ŒÓ’±—–
-
-EƒT[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒg•\’ljÁ
- (doc/)
- serverlink_packet.txt
- inter<->map ˆÈŠO‚̃T[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒg•\
-
-EŽd—lƒXƒŒ‚Ì Login_ID2 ŠÖŒW‚Å‚²‚ɂ傲‚É‚å
-EƒT[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒgˆê•”•ÏX
- (login/)
- login.c
- auth_fifo ‚É ip ƒƒ“ƒo’ljÁ
- ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
- (char/)
- char.c
- auth_fifo ‚É login_id2, ip ƒƒ“ƒo’ljÁ
- ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
- (map/)
- chrif.c
- chrif_authok()’ljÁ
- ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
-
-EŽ©“®Ä‹N“®ƒXƒNƒŠƒvƒg start ‚ɃRƒƒ“ƒg‚ÅŠÈ’P‚Èà–¾’ljÁ
- start
- ƒRƒƒ“ƒg’ljÁ
-
---------------------
-//1039 by Ni+S
- EƒMƒ‹ƒhŠÖŒW‚̃XƒNƒŠƒvƒg
- Š—LŽÒ‚Ì‹‚È‚¢ƒAƒWƒg‚©‚çAƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢ƒLƒƒƒ‰‚È‚ç
- ƒMƒ‹ƒhƒ_ƒ“ƒWƒ‡ƒ“‚É“ü‚ê‚Ä‚µ‚Ü‚¤‚Æ‚¢‚¤•s‹ï‡‚ª‚ ‚è‚Ü‚µ‚½
-
- ‚±‚ê‚ÍAŠ—LŽÒ‚Ì‹‚È‚¢ƒAƒWƒg‚Ì’l‚ª0‚Å‚ ‚èA
- getcharid(2)‚ŃMƒ‹ƒhID‚ð•Ô‚·‚Ì‚Å‚·‚ªA
- ƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢ƒLƒƒƒ‰‚Ígetcharid(2)‚Å0‚ð•Ô‚·ˆ×A
- ’l‚ªˆê’v‚µ‚Ä‚µ‚Ü‚¢‹N‚±‚Á‚Ä‚¢‚½Œ»Û‚Å‚µ‚½
- –¢Š‘®ƒLƒƒƒ‰‚ª“ü‚ê‚È‚¢‚悤‚ÉC³‚µ‚Ü‚µ‚½
-
- Eƒtƒ@[ƒ}ƒV[/ƒ|[ƒVƒ‡ƒ“ì¬DB
- ƒŒƒbƒhƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
- ƒCƒGƒ[ƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
- ƒzƒƒCƒgƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
- ‚ÌÞ—¿‚ðA‹ó‚̃|[ƒVƒ‡ƒ“•r‚©‚玎Œ±ŠÇ‚ÉC³
-
---------------------
-//1038 by Plala
-E“]ENPCŠÖ˜A‚Ìd‘å‚ȃoƒOC³
- (script/npc/job)
- npc_job_aco.txt C³
- npc_job_merchant.txt C³
- npc_job_thief.txt C³
-
- Eã‹LNPC‚Å“r’†‚܂ŃNƒGƒXƒg‚ði‚ß‚Ä‘¼‚ÌE‚É“]E‚·‚é‚ÆA
- Ä‚Ñ“]E‰Â”\‚¾‚Á‚½“_‚ðC³‚µ‚Ü‚µ‚½
-
-
---------------------
-//1037 by ŒÓ’±—–
-
-** FOR ENGLISH DEVELOPERS **
-DO NOT UPLOAD IF YOU DON'T USE JAPANESE ENCODE (SHIFT-JIS) !
-WHY WE(JAPANESE) REPAIR ERROR CHARACTER AFTER EVERY YOUR UPLOADING ?
-BREAKING IS EASY, REPAIRING IS VERY DIFFICULT !
-
-** ‰pŒêŒ—‚ÌŠJ”­ŽÒ‚Ì•û‚Ö(“ú–{Œê–ó) **
-“ú–{ŒêƒGƒ“ƒR[ƒh(ƒVƒtƒgJIS)‚ðŽg‚¤‹C‚ª–³‚¢‚È‚çƒAƒbƒvƒ[ƒh‚µ‚È‚¢‚Ä‚­‚¾‚³‚¢I
-‚È‚º‰äXi“ú–{lj‚ª‚ ‚È‚½•û‚̃Aƒbƒvƒ[ƒh‚Ì‚½‚Ñ‚É•¶Žš‰»‚¯‚𒼂³‚È‚¯‚ê‚΂Ȃç‚È‚¢‚ñ‚Å‚·‚©H
-‰ó‚·‚Ì‚ÍŠÈ’P‚Å‚·‚ªA’¼‚·‚Ì‚Í‚Æ‚Ä‚à“‚¢‚ñ‚Å‚·I
-
-E•¶Žš‰»‚¯‚𪫂ÅC³
- (map/)
- script.c
-
-Eladmin‚ªPOSIX•K{‚ÉBDigest::MD5‚ª–³‚­‚Ä‚àŽÀs‚Å‚«‚é‚悤‚ÉC³
-Eserverstatus.cgi‚ÅANet::Ping‚ª–³‚­‚Ä‚àŽÀs‚Å‚«‚é‚悤‚ÉC³
- (bin/tool/)
- ladmin
- (bin/tool/cgi/)
- serverstatus.cgi
-
-Escript_ref‚Å”²‚¯‚Ä‚é‚à‚Ì‚Å‚í‚©‚é‚à‚Ì‚ðC³
- ‰½ŒÌ‚©script_ref‚©‚甲‚¯‚Ä‚é‚à‚Ì(getarg‚È‚Ç)‚̈ꕔ‚ðĂђljÁ
- ** ƒAƒbƒvƒ[ƒh‚·‚é‚Æ‚«‚ÍÅVƒpƒbƒ`‚©‚ç‚Ì·•ª‚ðƒAƒbƒvƒ[ƒh‚µ‚Ü‚µ‚傤 **
- (doc/)
- script_ref.txt
-
-Eaccount_making.txtC³
- ladminƒXƒNƒŠƒvƒg‚̃pƒX
- (doc/)
- accoun_tmaking.txt
-
---------------------
-//1036 by Michael
-E’ljÁ Script Command:
- getequipid(EquipPos); EquipPos: 1-10
- gettimetick(Type); Type: 0 SystemTick, 1 TimeSecondTick(0-86399)
- gettime(Type); Type: 1 Sec, 2 Min, 3 Hour, 4 Weekday, 5, Monthday, 6 Month, 7 Year
- gettimestr("TimeFMT", Len); TimeFMT: Time format strinf / Len: String Length
-
- (map/)
- script.c
- buildin_getequipid(); ’ljÁ
- buildin_gettimetick(); ’ljÁ
- buildin_gettime(); ’ljÁ
- buildin_gettimestr(); ’ljÁ
-
---------------------
-//1035 by Michael
-E’ljÁ GVG Script NPC edit from Aegis NPC(Chinese-big5 version), Please someone translate to Japanese.
-EC³ NPC Script Command - buildin_getgdskilllv()
- getgdskilllv(Guild_ID, Skill_ID);
-
- (map/)
- script.c
- buildin_getgdskilllv() C³
-
---------------------
-//1034 by (Pepermint)
- FIX NPC Script Command - buildin_getgdskilllv()
- Add NPC Sctipt Command - buildin_agitcheck()
- (map/)
- script.c
- buildin_getgdskilllv() C³
- buildin_agitcheck() ’ljÁ
-
---------------------
-//1033 by Michael
-E’ljÁ NPC Script Command - buildin_getgdskilllv()
- getgdskilllv(Guild_ID, Skill_ID);
- skill_id = 1:GD_APPROVAL,2:GD_KAFRACONTACT,3:GD_GUARDIANRESEARCH,4:GD_CHARISMA,5:GD_EXTENSION
-
- (map/)
- script.c
- buildin_getgdskilllv() ’ljÁ
-
---------------------
-//1032 by (“Ê)
-E1031‚ʼn½ŒÌ‚©íœ‚³‚ê‚Ä‚¢‚½buildin_getitemname()‚𕜊ˆ
-EƒoƒOƒXƒŒ‚È‚Ç‚Éo‚½C³‚𔽉f
-E‚»‚Ì‘¼×‚©‚¢C³
-
- (map/)
- clif.c
- clif_disp_onlyself() NULLƒ`ƒFƒbƒN’ljÁ
- map.c
- map_nick2sd() nick‚ªNULL‚¾‚Æ‚·‚®NULL‚ð•Ô‚·‚悤‚É•ÏX
- mob.c
- mob_setdelayspawn() NULLƒ`ƒFƒbƒN•ÏX
- mob_delete() C³
- npc.c
- npc_parse_warp() C³
- script.c
- buildin_getitemname() •œŠˆ
-
---------------------
-//1031 by huge
-ENPC‚Ìscript‚ÉAmakepet‚ð’ljÁB
- makepet —‘ID; ‚ÅAƒyƒbƒg‚ð쬂µ‚Ü‚·B
-ENPC‚Ìscript‚ÉAgetexp‚ð’ljÁB
- getexp Base,Job; ‚ÅA‚»‚ꂼ‚ê‚ÌŒoŒ±’l‚ð‘‚₵‚Ü‚·B
-Eƒyƒbƒg‚Ì—‘‚ðNPC‚Ìdelitem‚ÅÁ‚µ‚½‚èshop‚Å”„‚Á‚½ŽžAƒyƒbƒgƒZ[ƒuƒf[ƒ^‚©‚ç휂·‚é‚悤C³B
-EƒfƒBƒ{[ƒVƒ‡ƒ“¬Œ÷ðŒC³B(–¢Šm”F)
-EŒoŒ±’l•\Ž¦‚ð‰Â”\‚É‚µ‚Ä‚Ý‚Ü‚µ‚½Bconf‚É‚Äݒ肵‚Ä‚­‚¾‚³‚¢B
-
- (conf/)
- battle_athena.conf C³
- (doc/)
- conf_ref.txt C³
- script_ref.txt C³
- (map/)
- battle.c
- battle.h
- disp_experience ’ljÁ
- clif.c
- clif.h
- clif_disp_onlyself() ’ljÁ
- pc.c
- pc_gainexp() C³
- script.c
- buildin_delitem() C³
- buildin_makepet() ’ljÁ
- buildin_getexp() ’ljÁ
- npc.c
- #include C³
- npc_selllist() C³
- skill.c
- skill_castend_nodamage_id() C³
-
-
---------------------
-//1030 by (“Ê)
-Emap_athena.conf‚ÉV¥“‡ƒUƒƒC‚ðƒRƒƒ“ƒgƒAƒEƒg‚µ‚ĒljÁ
-EƒNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ðŽ©“®ƒZ[ƒu‚²‚Æ‚É–Y‚ê‚Ä‚¢‚½‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ƒƒOƒIƒtŽž‚É‚Ì‚Ý–Y‚ê‚é‚悤‚É•ÏX‚µ‚½‚‚à‚è
-Emobskill_castend_pos‚Ì–³ŠQnullpoƒ`ƒFƒbƒN‚ð•ÏX
-EEmotion‚Ìݒ肪‚È‚¢Mob‚ªƒXƒLƒ‹‚ðŽg—p‚·‚é‚Æ‚«‚É/!‚ðo‚µ‚Ä‚¢‚½‚Ì‚ðC³
-EƒoƒOƒXƒŒ‚É“Š‚°‚½trade.c‚ð“Y•tB‚Æ‚è‚ ‚¦‚¸‘ŠŽè‚ªŠŽ‚Å‚«‚éŽí—Þ‚ÌŒÀŠE‚ð’´‚¦‚½ê‡‚Í“n‚³‚¸‚ÉŒ³‚É–ß‚·‚悤‚É•ÏX
-
- (conf/)
- map_athena.conf ƒUƒƒC’ljÁ
- (doc/)
- client_packet.txt ƒpƒPƒbƒg’·‚ÌXV
- (map/)
- map.c
- map_quit() I—¹Žž‚ɃNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ð–Y‚ê‚é‚悤‚É•ÏX
- mob.c
- mobskill_castend_pos() nullpoƒ`ƒFƒbƒN•ÏX
- mob_readskilldb() C³
- pc.c
- pc_makesavestatus() ƒNƒ[ƒ“ƒXƒLƒ‹‚ð–Y‚ê‚é‚Ì‚ðmap_quit‚É”C‚¹‚½
- trade.c
- trade_tradecommit() ŠŽ‚Å‚«‚éŽí—ÞˆÈã‚ðŽæˆø‚µ‚½ê‡‚ɃAƒCƒeƒ€‚ªÁ‚¦‚È‚¢‚悤‚É
-
---------------------
-//1029 by (“Ê)
-E20040619RagexeHC_jp.rgz‚Ì0x204‚Æ0x20bƒpƒPƒbƒg‚ɑΉž
-Echar‚Ælogin‚à’m‚ç‚È‚¢ƒpƒPƒbƒg‚ª—ˆ‚½‚çƒpƒPƒbƒgƒ_ƒ“ƒv‚ðo—Í‚·‚é‚悤‚Éclif.c‚©‚çƒRƒsƒy
-
- (doc/)
- client_packet.txt VƒpƒPƒbƒg’ljÁ
- (char/)
- char.c
- parse_char() 0x20b‘Ήž
- (login/)
- login.c
- parse_login() 0x204‘Ήž
-
---------------------
-//1028 by (“Ê)
-EƒEƒ“ƒoƒ‰ˆÈ~AMob‚ªƒXƒLƒ‹‚ðŽg—p‚·‚é‚Æ‚«‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðo‚·‚悤‚É‚È‚Á‚½‚Ì‚ÅAmob_skill_db‚ðŠg’£
- ƒTƒ“ƒvƒ‹‚ŃI[ƒNƒEƒH[ƒŠƒA[‚ª‹i‰Œ‚·‚é‚Æu/cv‚ðo‚·‚̂ƃI[ƒNƒŒƒfƒB‚ª‘¬“x‚ðŽg‚¤‚Æu/‚¿‚ãv‚ðo‚µ‚Ü‚·
-EƒAƒCƒeƒ€682,683‚ðŽg—p‚·‚é‚Æ30•bŠÔATK‚âMATK‚ª‘‚¦‚é‚炵‚¢‚Ì‚Å‚»‚ê‚Á‚Û‚­
-Ejob_db2.txt‚É“ä‚Ìs‚ª2s‚ ‚Á‚½‚Ì‚ðíœ
-E”͈͖‚–@‚ȂǂŃXƒLƒ‹ƒ†ƒjƒbƒg‘ŠŽè‚ɃXƒe[ƒ^ƒX•ÏX‚ð‚©‚¯‚悤‚Æ‚µ‚½ê‡‚Énullpo‚ªo‚½‚Ì‚ðC³
-
- (db/)
- const.txt SC_INCATK SC_INCMATK’ljÁ
- item_db.txt ª‚ð682,683‚ɒljÁ
- job_db2.txt “ä‚Ì2s‚ðíœ
- mob_skill_db.txt Emotion’ljÁ
- (map/)
- mob.c
- mobskill_use() ƒXƒLƒ‹Žg—pŽž‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðo‚·‚悤‚É•ÏX
- mob_readskilldb() Emotion‚ð“Ç‚Ýž‚ނ悤‚É•ÏX
- mob.h •ÏX
- pc.c
- pc_calcstatus() •ÏX
- skill.c
-
- skill_status_change_end() •ÏX
- skill_status_change_start() •ÏX‚ÆNULLƒ`ƒFƒbƒNC³
- skill.h •ÏX
-
---------------------
-//1027 by Ni+S
-EgetitemnameŠÖ”’ljÁ
-EƒXƒNƒŠƒvƒg‚ÉgetitemnameŠÖ”‚ð’ljÁ
-Eitemid‚æ‚èAjname‚𕶎š—ñ‚Å•Ô‚µ‚Ü‚·
-EÚ‚µ‚­‚Íscript_ref.txt‚ÅB
-
- script.c
- getitemname()’ljÁ
-
---------------------
-//1026 by (“Ê)
-E1023‚Å“ü‚ê‚Ä‚È‚©‚Á‚½clif.h‚𓯫
-EƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒA[ƒ}ƒCƒ“‚Åo‚µ‚½mob‚ð“|‚·‚Æmob_timer_delete()‚Ånullpo‚ªo‚é–â‘è‚ð‰ðŒˆ‚µ‚½‚‚à‚è
-EƒoƒO•ñƒXƒŒƒbƒh part6 >>63 Dest‚³‚ñ‚Ìscript.cC³‚ðŽæ‚èž‚Ý
-
- (map/)
- clif.h •ÏX
- map.h •ÏX
- mob.c
- mob_changestate() •ÏX
- skill.c
- skill_castend_pos2() •ÏX
- mob_spawn() •ÏX
- do_init_mob() add_timer_func_list‚Émob_timer_delete‚ª–³‚©‚Á‚½‚̂ŒljÁ‚µ‚Ä‚Ý‚½
- script.c
- script_load_mapreg() •ÏX
-
-------------------------
-//1025 by Sel
-Eƒ[ƒhƒiƒCƒg‚̃Wƒ‡ƒu•â³‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
-EƒI[ƒ‰ƒuƒŒ[ƒhŒø‰ÊŽžŠÔ‚ðC³
-EƒI[ƒ‰ƒuƒŒ[ƒh•Ší§ŒÀ‚ð‘fŽèˆÈŠO‘S‚Ä‚ÉC³
-EƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“•Ší§ŒÀ‚𗼎葄‚Ì‚Ý‚©‚ç•ÐŽè‘„+—¼Žè‘„‚ÖC³
-EƒgƒDƒ‹[ƒTƒCƒgŒø‰ÊŽžŠÔ‚ðC³
-
- (db/)
- job_db2-2.txt •ÏX
- skill_cast_db.txt •ÏX
- skill_require_db.txt •ÏX
---------------------
-//1024 by mare
-Eƒtƒ@[ƒ}ƒV[Þ—¿‚Ì•ÏXA»‘¢‰Â”\–ò•i‚̒ljÁ
- 6/8“ú–{ŽI‚É‚«‚½‚à‚Ì‚Æ“¯‚¶‚É‚µ‚Ü‚µ‚½
-
- (db/)
- produce_db.txt •ÏX
-
---------------------
-//1023 by (“Ê)
-E1022‚ŃGƒ“ƒoƒO‚µ‚½npc_parse_script()‚ð–ß‚µ
-EƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚Ìd—ʒljÁƒ_ƒ[ƒWŒvŽZŽ®‚ð‚¿‚å‚Á‚Æ•ÏX
-E–‚–@—Í‘•‚ÌŒvŽZŽ®‚ð‚¿‚å‚Á‚Æ•ÏX
-Eƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚ªÀ‚Á‚ÄŽg‚¤‚Ì‚Å‚Í‚È‚­Žg‚¤‚ÆÀ‚é‚Æ‚¢‚¤î•ñ‚ðŒ©‚©‚¯‚½‚Ì‚Å•ÏX
-Eª‚É”º‚¢skill_require‚ÌsittingðŒ”pŽ~
-Eƒo[ƒT[ƒN‚ðGvG‚ÅŽg—p‚Å‚«‚È‚¢‚悤‚É•ÏX
-
- (db/)
- skill_cast_db.txt •ÏX
- skill_require_db.txt •ÏX
- (doc/)
- db_ref.txt C³
- (map/)
- battle.c
- battle_calc_pc_weapon_attack() •ÏX
- clif.c
- clif_sitting() ’ljÁ
- clif_parse_ActionRequest() •ÏX
- npc.c
- npc_parse_script() C³
- pc.h •ÏX
- pc.c
- pc_calcstatus() •ÏX
- pc_natural_heal_hp() •ÏX
- pc_setstand() ’ljÁ
- skill.c
- skill_castend_nodamage_id() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚ðŽg‚¤‚ÆÀ‚é‚悤‚É
- skill_check_condition() ST_SITTING”pŽ~
- skill_use_id() ƒo[ƒT[ƒN‚ðGvG‚ÅŽg—p‚Å‚«‚È‚¢‚悤‚É
- skill_status_change_timer() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚Í10•b‚²‚Æ‚ÉSP‚ð12Á”ï
- skill_status_change_start() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX•ÏX
- skill_readdb() sitting”pŽ~
- skill.h •ÏX
-
---------------------
-//1022 by (“Ê)
-ENULLƒ`ƒFƒbƒN•ÏX
-Elogin,char,mapI—¹Žž‚ÉŠJ•ú‚³‚ê‚Ä‚¢‚È‚©‚Á‚½ƒƒ‚ƒŠ‚ð”÷–­‚ÉŠJ•ú‚·‚é“w—Í‚ð‚µ‚Ä‚Ý‚½
-EƒXƒpƒmƒr”š—ô”g“®ŽÀ‘•AƒNƒŠƒeƒBƒJƒ‹+50
-EƒXƒpƒmƒrƒ{[ƒiƒX‚ð•ÏXAʼn‚©‚çˆê“x‚àŽ€‚ñ‚Å‚È‚¢JobLv70‚ÉAll+15ABaseLv99‚ÉMHP+2000
-
- (doc/)
- client_packet.txt S 01ed’ljÁ
- (char/)
- do_final() •ÏX
- do_init() •ÏX
- (login/)
- do_final() ’ljÁ
- do_init() •ÏX
- (map/)
- atcommand.c Dest‚³‚ñ‚Ì•ÏX‚ðŽæ‚èž‚Ý
- battle.c “¯ã
- chat.c NULLƒ`ƒFƒbƒN•ÏX
- chrif.c NULLƒ`ƒFƒbƒN•ÏX
- clif.c NULLƒ`ƒFƒbƒN•ÏX
- clif_parse() •ÏX
- clif_parse_sn_explosionspirits() ’ljÁ
- clif_parse_sn_doridori() –¼‘O•ÏX
- guild.c NULLƒ`ƒFƒbƒN•ÏX
- intif.c NULLƒ`ƒFƒbƒN•ÏX
- itemdb.c NULLƒ`ƒFƒbƒN•ÏX
- map.c NULLƒ`ƒFƒbƒN•ÏX
- do_final() •ÏX
- mob.c NULLƒ`ƒFƒbƒN•ÏX
- npc.c NULLƒ`ƒFƒbƒN•ÏX
- npc_parse_script() bufŠJ•ú–Y‚êH‚ðŠJ•ú
- party.c NULLƒ`ƒFƒbƒN•ÏX
- path.c NULLƒ`ƒFƒbƒN•ÏX
- pc.c NULLƒ`ƒFƒbƒN•ÏX
- pc_calcstatus() ƒXƒpƒmƒr•ÏX
- pet.c NULLƒ`ƒFƒbƒN•ÏX
- storage.c NULLƒ`ƒFƒbƒN•ÏX
- trade.c NULLƒ`ƒFƒbƒN•ÏX
- vending.c NULLƒ`ƒFƒbƒN•ÏX
-
---------------------
-//1021 by Kalen
-Eƒvƒƒ“ƒeƒ‰Š¥¥•iNPC‚ɂă^ƒLƒV[ƒh”Ì”„
-EUmbala‚̃[ƒvŒ©’¼‚µ
- D2F‚̃[ƒv‚ð–{ŽIŽg—p‚É•ÏXBd•¡ƒ|ƒCƒ“ƒgC³
-EUmbalaNPCC³
- ƒ‰ƒxƒ‹‚ðŽg—p‚µ‚È‚­‚¢‚¢êŠ‚Í‹É—Ííœ(-)
- ƒZ[ƒuƒ|ƒCƒ“ƒgC³
- ƒoƒ“ƒW[ƒWƒƒƒ“ƒv‘ä’ljÁ
- Š[œ–å’ljÁ
- •ª‰ðA‡¬ˆ—’ljÁ
- ƒJƒvƒ‰AˆÄ“à—vˆõ‚ð‚ ‚é‚ׂ«êŠ‚ÖˆÚ“®B
- ¦ˆê•”Emo‚ɂ‚¢‚ÄAŠà•ðŽ©g‚ª‹t‚ÉŽæ‚èˆá‚¦‚Ä‚¢‚é‚Ý‚½‚¢‚È‚Ì‚Å“ÆŽ©‚Å•Ï‚¦‚Ü‚µ‚½B
- Œ©‚Ä‚à‚炦‚Εª‚©‚è‚Ü‚·‚ª18‚Æ28‚ð‹t‚É‚·‚é‚ÆNPC‚̉ï˜b“à—e‚ɇ‚¤Emo‚ªo‚½‚Ì‚Å
- ƒNƒGƒXƒgƒtƒ‰ƒO‚ÌðŒ’ljÁ
- @‚±‚ê‚É‚æ‚è‚·‚Å‚ÉI‚¦‚Ä‚¢‚éꇂłà“r’†‚É‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
-EƒXƒpƒmƒr“]ENPC’ljÁ
- “Ê‚³‚ñ‚̃ƒO‚ðŠî‚É쬂µ‚Ü‚µ‚½B
-EƒAƒ‹ƒPƒ~ƒXƒgƒMƒ‹ƒh‚̃mƒr‚Ìꇂ̑ΉžC³(“Ê‚³‚ñ‚©‚ç‚̃ƒO‚æ‚è)
-EŒ‹¥NPC’ljÁ
- ‚½‚¾‚µA‚Ü‚¾ƒeƒXƒg’iŠK‚Å‚·B–â‘è“_‚ª‚ ‚邽‚ߌ‹¥•s‰Â”\‚Å‚·B
- (/script)
- (/warp)
- npc_warp_umbala.txt
- (/npc)
- (/town)
- npc_town_umbala.txt
- npc_town_kafra.txt
- npc_town_guide.txt
- npc_town_prontera.txt
- (/quest)
- npc_event_marriage.txt(VEƒeƒXƒg)
- (/job)
- npc_job_alchemist.txt
- npc_job_supernovice.txt(V)
-
---------------------
-//1020 by (“Ê)
-Enullpo‚Ì•ÏX‚ɑΉž‚µ‚Ämap_athena.conf‚ÌÝ’è휕skill.c‘‚«Š·‚¦
-EÀ‚Á‚Ä‚¢‚é‚ÆHPR‚ÆSPR‚ª’Êí‚Ì”¼•ª‚Å”­“®‚µ‚½‚Ì‚ðC³
-EƒXƒpƒmƒr‚ªˆê’èðŒ(ƒNƒ‰ƒCƒAƒ“ƒgˆË‘¶)‚Å/doridori‚·‚é‚ÆSPR‰ñ•œ—Ê‚ª”{‚É‚È‚é‚悤‚É•ÏX
-EŒ‹¥Ž®—p‚̃GƒtƒFƒNƒg‚ðƒXƒNƒŠƒvƒg‚©‚çwedding–½—ß‚Å”­¶‚³‚¹‚邱‚Æ‚ªo—ˆ‚é‚悤‚µ‚½
-E‡‘t‚ðŠJŽn‚µ‚½PC‚͇‘t’†‚ÉI—¹‚Å‚«‚È‚¢‚悤‚É‚µ‚½‚‚à‚è(–¢Šm”F)
-
- (conf/)
- map_athena.conf nullpo_checkíœ
- (doc/)
- client_packet.txt XV
- conf_ref.txt nullpo_checkíœ
- (map/)
- map.c
- map_config_read() nullpo_checkíœ
- map.h “¯ã
- skill.c NULLƒ`ƒFƒbƒNÄ“x‘“ü‚ê‘Ö‚¦
- clif.c
- clif_wedding_effect() ’ljÁ
- clif_parse_QuitGame() ‡‘tŠJŽnŽÒ‚͇‘t’†‚ÉI—¹‚Å‚«‚È‚¢‚悤‚É•ÏX
- clif_parse_doridori() ’ljÁ
- clif_parse() doridori’ljÁ
- clif.h •ÏX
- pc.c
- pc_authok() doridori‰Šú‰»’ljÁ
- pc_natural_heal_hp() À‚Á‚Ä‚¢‚é‚Æ‚«‚ÌHPRŽžŠÔC³
- pc_natural_heal_sp() À‚Á‚Ä‚¢‚é‚Æ‚«‚ÌHPRŽžŠÔC³Adoridori’ljÁ
- script.c
- buildin_wedding_effect() ’ljÁ
-
-
---------------------
-//1019 by Dest
-Enullpoƒ‚ƒWƒ…[ƒ‹‚ɃR[ƒfƒBƒ“ƒOƒ~ƒX”­Œ©/C³
-E“¯Avoid‚ÈŠÖ”‚©‚çŒÄ‚΂ꂽŽž‚Ìnullpo_retv_f()‚ð’ljÁ
-E“¯AðŒƒRƒ“ƒpƒCƒ‹‚ɑΉž
-
- (common/)
- nullpo.c
- nullpo_info_core() ƒR[ƒfƒBƒ“ƒOƒ~ƒXC³
- nullpo.h
- NULLPO_CHECKƒtƒ‰ƒO‚É‚æ‚éðŒƒRƒ“ƒpƒCƒ‹’ljÁ
- nullpo_retv_f() ’ljÁ
-
---------------------
-//1018 by chloe
-EƒEƒ“ƒoƒ‰ƒ‚ƒ“ƒXƒ^[‚ð’ljÁ
-
- (script/mob/)
- npc_monster.txt •ÏX
- ŠeƒEƒ“ƒoƒ‰ƒ}ƒbƒv‚ÉMob”z’u
- (db/)
- mob_db.txt •ÏX
- 1495,STONE_SHOOTER,ƒtƒŒƒCƒ€ƒVƒ…[ƒ^[ C³
- 1511,AMON_RA,ƒAƒ‚ƒ“ƒ‰[ C³
-
---------------------
-//1017 by (“Ê)
-EƒoƒO•ñƒXƒŒƒbƒh part6 >>46 Dest‚³‚ñ‚Ìnullpoƒ‚ƒWƒ…[ƒ‹‚ð’ljÁ•void‚ÈŠÖ”‚©‚çŒÄ‚΂ꂽŽž‚Ìnullpo_retv()‚ð’ljÁ(‚Æ‚è‚ ‚¦‚¸skill.c‚ÌNULLƒ`ƒFƒbƒN‚¾‚¯“ü‚ê‘Ö‚¦)
-E“¯>>39 Sel‚³‚ñ‚©‚ç•ñ‚ª‚ ‚Á‚½ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ðC³
-EŽd—l‚ɂ‚¢‚ÄŒê‚臂¤ƒXƒŒƒbƒh >>33 Kalen‚³‚ñ‚Ìî•ñ‚ðclient_packet.txt‚É”½‰f
-E–{ŽI‘ŠˆáƒXƒŒƒbƒh part3 >>24 M —zqcM6jBw‚³‚ñ‚Ìî•ñ‚ðª
-E“¯>>30 ‚Í‚¿‚³‚ñ‚ÌC³‚𔽉f
-
- (conf/)
- map_athena.conf nullpo_check’ljÁ
- (db/)
- item_db.txt Œ‹¥Žw—Ö‚ð•Ší-ƒAƒNƒZƒTƒŠ‚É•ÏX•ÅV”Å
- (doc/)
- client_packet.txt XV
- conf_ref.txt nullpo_check’ljÁ
- (common/)
- Makefile •ÏX
- nullpo.c ’ljÁ
- nullpo.h ’ljÁ
- (map/)
- Makefile •ÏX
- map.c
- map_config_read() nullpo_check’ljÁ
- map.h “¯ã
- skill.c NULLƒ`ƒFƒbƒN‘“ü‚ê‘Ö‚¦
- skill_status_change_start() ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“C³
- skill_castend_nodamage_id() ƒeƒŒƒ|[ƒgC³
- clif.c
- clif_skill_setunit() ƒRƒƒ“ƒgC³
- pc.c
- pc_calcstatus() ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“C³
-
---------------------
-//1016 by ‚ÈB
-EAthenaŽG’kƒXƒŒƒbƒhPart4 42 ‚©‚éŽì‚̃Eƒ“ƒoƒ‰NPC‚ð’ljÁ
-
- (script/npc/town/)
- npc_town_umbala.txt’ljÁ
- ƒCƒxƒ“ƒgƒfƒoƒbƒO—l(230`256s–Ú)‚̓Rƒƒ“ƒgƒAƒEƒg
- (conf/)
- map_athena.conf town ‚É npc: script/npc/town/npc_town_umbala.txt ’ljÁ
-
---------------------
-//1015 by (“Ê)
-EƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ð–{ŽIŽd—l‚ÆAthenaŽd—l‚Å‘I‚ׂé‚悤‚É‚µ‚½
-EƒXƒpƒmƒr‚ÉAll+10‚·‚éðŒ‚ª—Ç‚­•ª‚©‚ç‚È‚©‚Á‚½‚¯‚Çʼn‚©‚ç+10‚¶‚á‚È‚¢‚Ì‚ÍŠm‚©‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸Base99‚ňê“x‚àŽ€‚ñ‚Å‚È‚¯‚ê‚΂Ƃ¢‚¤ðŒ‚É•ÏX
-Eƒ_ƒ“ƒX’†‚É‚«”ò‚΂³‚ê‚Ä‚àƒGƒtƒFƒNƒg‚͈ړ®‚µ‚È‚¢‚»‚¤‚È‚Ì‚Å•ÏX
-E@go 13”÷’²®
-
-
- (conf/)
- battle_athena.conf skill_removetrap_type’ljÁ
- (doc/)
- client_packet.txt –{ŽI‘ŠˆáƒXƒŒƒbƒh part3 23 M —zqcM6jBw‚³‚ñ‚Ìî•ñ‚ð’ljÁ
- conf_ref.txt skill_removetrap_type’ljÁ
- (map/)
- atcommand.c
- atcommand_go() ƒEƒ“ƒoƒ‰‚ÌoŒ»ˆÊ’u”÷’²®
- battle.c
- battle_config_read() skill_removetrap_type’ljÁ
- battle.h “¯ã
- pc.c
- pc_calcstatus() ƒXƒpƒmƒrAll+10ðŒ•ÏX
- skill.c
- skill_blown() ƒ_ƒ“ƒX’†‚Ì‚«”ò‚΂µ‚ðŒ³‚É–ß‚µ‚½
- skill_castend_nodamage_id() ƒŠƒ€[ƒuƒgƒ‰ƒbƒvŽd—l•ÏX
-
- --------------------
-//1014 by (Pepermint)
-I fixed again the problem if you put minus sign(-) in front of digits,
-the error comes up when you puchase a item.
-When you put a minus sign(-), the error sign will be changed shrotage of
-amount as original server dose.
-
-I tested with it in ver. 1013, it was working
-
---------------------
-//1013 by (“Ê)
-EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
-
---------------------
-//1012 by (“Ê)
-Ehelp.txt‚É‚ ‚é@go‚Ìà–¾‚©‚ç13‚Æ14‚ðíœ
-@‹@”\‚ÍÁ‚¦‚Ä‚È‚¢‚Ì‚ÅŽg‚¦‚邱‚Æ‚ÍŽg‚¦‚Ü‚·‚ªAhelp‚ÉÚ‚¹‚é‚Ì‚ÍjRO‚É—ˆ‚Ä‚©‚ç‚Æ‚¢‚¤‚±‚Æ‚Å
-Ecast_db.txt‚ðskill_cast_db.txt‚ɉü–¼
-E‚‚¢‚Å‚Émake clean‚ÅGNUmakefile‚àÁ‚µ‚Ă݂邱‚Æ‚É‚·‚é
-Eu-0‚³‚ñ‚ÌŒŸØ‚Ȃǂ𑇂µ‚ă_ƒ“ƒXƒ†ƒjƒbƒgŠÖ˜A‚ð•ÏX
-@‰‰‘tEƒ_ƒ“ƒX’†‚̃nƒG‚̓†ƒjƒbƒg•t‚«‚Å”ò‚Ô‚»‚¤‚Å‚·
-@‰‰‘tEƒ_ƒ“ƒX’†‚Ƀ[ƒvƒ|ƒCƒ“ƒg‚Éæ‚Á‚½‚çó‘Ô‚ª‰ðœ‚³‚ê‚é‚悤‚Å‚·
-@‡‘t’†‚ɕЕû‚ªƒnƒG”ò‚Ñ‚µ‚½‚çƒGƒtƒFƒNƒg‚ÍŒ³‚ÌꊂɎc‚èA”ò‚ñ‚¾æ‚ł͇‘tó‘Ô‚ªŒp‘±‚µ‚Ä“®‚¯‚È‚¢•ŽžŠÔ‚²‚Æ‚ÉSPÁ”ï‚·‚é‚悤‚Å‚·
-EPC_DIE_COUNTER‚ªƒXƒNƒŠƒvƒg‚©‚ç•ÏX‚³‚ꂽŽž‚É‚·‚®‚É”½‰f‚³‚ê‚é‚悤‚É•ÏX
-
- (conf/)
- help.txt @goà–¾•ÏX
- (db/)
- skill_cast_db.txt ‰ü–¼
- (map/)
- pc.c
- pc_setpos() ƒ_ƒ“ƒX’†’f‚̃^ƒCƒ~ƒ“ƒO•ÏX
- pc_setglobalreg() PC_DIE_COUNTER“Á•Êˆ—’ljÁ
- skill.c
- skill_castend_id() NULLƒ`ƒFƒbƒN•ÏX
- skill_stop_dancing() ƒ}ƒbƒvˆÚ“®‚È‚Ç‚Å‚Ì‹““®‚ð•ÏX
- skill_readdb() skill_cast_db‚ɉü–¼
- skill_blown() ”ò‚΂³‚ꂽ‚çƒ_ƒ“ƒXˆÚ“®
- npc.c
- npc_touch_areanpc() ƒ[ƒvƒ|ƒCƒ“ƒg‚Éæ‚Á‚½‚çƒ_ƒ“ƒX‰ðœ
-
---------------------
-//1011 by ƒpƒCƒ“
-Eƒp[ƒeƒB—v¿‚âƒMƒ‹ƒh—v¿‚ðo‚µ‚Ä‚¢‚é‚Æ‚«‚É‘¼‚Ì—v¿‚ð‹‘”Û‚éˆ—‚ð’ljÁ
-@battle_athena.conf‚ÅØ‚è‘Ö‚¦‚ªo—ˆ‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
-Emake clean ‚ÅŽ–‚ª‘«‚è‚é‚Ì‚ÅAobjectdel.bat‚ðÁ‹Ž
-
- (map)
- clif.c
- clif_party_invite()•ÏX(nullpo‚Ì•¶Œ¾ˆá‚Á‚Ä‚Ü‚µ‚½)
- guild.c
- guild_invite()•ÏX
- party.c
- party_invite()•ÏX
- battle.c
- battle_config_read()•ÏX
- battle.h•ÏX
- trade.c
- trade_traderequest()•ÏX
-
---------------------
-//1010 by (“Ê)
-Egcc 2.95‘Îô
-EƒXƒpƒmƒr‚Ì1“xŽ€‚Ê‚Ü‚ÅAll+10‚ðƒXƒNƒŠƒvƒg•Ï”‚ÅŽÀ‘•‚µ‚Ă݂鎎‚Ý
- PC_DIE_COUNTER Ž€‚Ê‚Æ+1A“]E‚·‚é‚Æ0‚É‚È‚è‚Ü‚·
- ª‚̓Lƒƒƒ‰ƒNƒ^‰i‘±‚ȃXƒNƒŠƒvƒg•Ï”‚È‚Ì‚ÅNPC‚ÅŽQÆ•ÄÝ’è‚Æ‚©”äŠr“IŠy‚©‚à
-
- (map/)
- chrif.c
- chrif_divorce() gcc2.95‘Îô
- skill.c
- skill_attack() gcc2.95‘Îô
- skill_unit_move_unit_group() gcc2.95‘Îô
- map.h map_session_data‚Édie_counter‚ð’ljÁ
- npc.c
- npc_click() nullpoƒƒbƒZ[ƒW‚ðC³
- pc.c
- pc_setrestartvalue() nullpoƒƒbƒZ[ƒW‚ðC³
- pc_authok() die_counter‰Šú‰»‚̒ljÁ
- pc_calcstatus() die_counter=0‚̃Xƒpƒmƒr‚ÍAll+10
- pc_damage() PC_DIE_COUNTERÝ’è
- pc_jobchange() PC_DIE_COUNTERÝ’è
- pc_readparam() gcc2.95‘Îô
- pc_divorce() gcc2.95‘Îô
- pc_get_partner() gcc2.95‘Îô
-
---------------------
-//1009 by ‚Ò‚´‚Ü‚ñ
-Eƒ_ƒ“ƒXˆÚ“®Œy—ʉ»ŽÀ‘•
-@battle_athena.conf‚ÅØ‚è‘Ö‚¦‰Â”\‚Å‚·BÚ‚µ‚­‚Íconf_ref‚ð
-@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×AƒfƒtƒHƒ‹ƒg‚Å‚Íoff‚É‚µ‚Ä‚¢‚Ü‚·
-@‚Ü‚½A‚±‚ÌŒy—ʉ»ƒ‚[ƒh‚͉ñü•‰‰×‚ð‘å•‚É팸‚Å‚«‚é(‚‚à‚è)‚Å‚·‚ªA
-@‚»‚Ì•ªƒT[ƒo[‘¤‚̈—‚ªd‚½‚­‚È‚è‚Ü‚·(‚Æ‚¢‚Á‚Ä‚à‚ ‚é’ö“x‚ÌCPU‚ª‚ ‚ê‚ΑS‘R–â‘è‚É‚È‚ç‚È‚¢’ö“x‚Ì•‰‰×‚Å‚·‚ª)
-EŒ‹¥ƒVƒXƒeƒ€^Œ‹¥ƒXƒLƒ‹ŽÀ‘•
-@Œ‹¥Žw—Ö‚Ì“Á•Êˆµ‚¢‚ª–¢ŽÀ‘•‚Å‚·(—Ž‚Æ‚¹‚½‚èŽæˆø‚Éo‚¹‚½‚肵‚Ü‚·)
-@—£¥‚Ì‚Ý–¢ƒeƒXƒg‚Å‚·B
-EŒ‹¥—pƒXƒNƒŠƒvƒg(marriageAdivorce)’ljÁB
-@Emarriage <partner_name>
-@@<partner_name>: Œ‹¥‘ŠŽè‚Ì–¼‘O
-@@–ß‚è’l: ¬Œ÷:1@Ž¸”s:0
-@@Œ‹¥ˆ—‚ðs‚¢‚Ü‚·B‘Îۂ͘b‚µŠ|‚¯‚½ƒvƒŒƒCƒ„[‚Æ<partner_name>‚̃Lƒƒƒ‰ƒNƒ^[‚ÅA‚Ç‚¿‚ç‚©‚ªŠù¥‚Ìꇂ͎¸”s‚µ‚Ü‚·B
-@@1‰ñ‚ÌmarriageƒXƒNƒŠƒvƒg‚ÅV˜Y¨V•w‚ÆV•w¨V˜Y‚ÌŒ‹¥ˆ—‚𓯎ž‚És‚¢‚Ü‚·B
-@@‚Ü‚½A‚±‚̃XƒNƒŠƒvƒg‚ÅŒ‹¥Žw—Ö‚Í—^‚¦‚ç‚ê‚Ü‚¹‚ñB
-@Edevorce
-@@ˆø”–³‚µ
-@@–ß‚è’l: ¬Œ÷:1@Ž¸”s:0
-@@—£¥ˆ—‚ðs‚¢‚Ü‚·B‘Îۂ͘b‚µŠ|‚¯‚½ƒvƒŒƒCƒ„[‚ÅA–¢¥‚Ìꇂ͎¸”s‚µ‚Ü‚·B
-@@marriageƒXƒNƒŠƒvƒg‚Æ“¯—l‚Ɍ݂¢‚Ì—£¥ˆ—‚𓯎ž‚És‚¢‚Ü‚·B
-@@‚Ü‚½A‚±‚̃XƒNƒŠƒvƒg‚ª¬Œ÷‚·‚é‚ÆŽ©“®“I‚É‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ÌŒ‹¥Žw—Ö‚Í”’D‚³‚ê‚Ü‚·B
-
-@‚Ç‚¿‚ç‚̃XƒNƒŠƒvƒg‚̈—‚àA2l‹¤ƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢‚ƬŒ÷‚µ‚Ü‚¹‚ñB
-
- (map/)
- pc.c
- pc_ismarried()Apc_marriage()Apc_divorce()Apc_authok()•ÏX
- pc_get_partner() ’ljÁ
- map.c
- map_quit() •ÏX
- skill.c
- skill_use_id()Askill_castend_nodamage_id() •ÏX
- skill_unitsetting()Askill_unit_onlimit() •ÏX
- script.c
- buildin_marriage()Abuildin_devorce() ’ljÁ
- pc.h •ÏX
- battle.h •ÏX
-
---------------------
-//1008 by ‚Ò‚´‚Ü‚ñ
-EGMƒZƒbƒVƒ‡ƒ“‰B‚µŽÀ‘•(–¢ƒeƒXƒg)
-@GMƒAƒJƒEƒ“ƒg‚̃Lƒƒƒ‰ƒNƒ^[‚ð@who“™‚Å•\Ž¦‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚Ü‚·B
-@Ú‚µ‚­‚Íconf_ref.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-EŒ‹¥ƒVƒXƒeƒ€‰¼ŽÀ‘•
-@char-mapŠÔ’ÊM‚Ì‚ÝŽÀ‘•‚Å‚·B‚Ü‚¾Œ‹¥‚·‚邱‚Æ‚Ío—ˆ‚Ü‚¹‚ñB
-@®A‚±‚̃pƒbƒ`‚©‚çathena.txt‚̃o[ƒWƒ‡ƒ“‚ª•Ï‚í‚è‚Ü‚·B
-@ƒf[ƒ^‚̌݊·«‚Í•Û‚Á‚½‚‚à‚è‚Å‚·‚ªA”O‚̈׃oƒbƒNƒAƒbƒv‚ðŽæ‚Á‚Ä‚¨‚­Ž–‚ð‹­‚­„§‚µ‚Ü‚·B
-
- (map/)
- clif.c
- clif_countusers() •ÏX
- battle.c
- battle_config_read() •ÏX
- atcommand.c
- atcommand_who() •ÏX
- pc.c
- pc_ismarried()Apc_marriage()Apc_divorce() ’ljÁ
- chrif.c
- chrif_divorce() ’ljÁ
- chrif_parse() •ÏX
- (char/)
- char.c
- char_divorce() ’ljÁ
- char_delete()Ammo_char_fromstr()Ammo_char_tostr() •ÏX
-
---------------------
-//1007 by (“Ê)
-ENULLƒ`ƒFƒbƒN‚ÌŒ©’¼‚µ
-
- (map/)
- clif.c
- clif_send() •ÏX
- skill.c
- skill_delunit() •ÏX
-
---------------------
-//1006 by (ruhu)
-¥@go‚É—Œ—z‚ƃjƒtƒ‹ƒwƒCƒ€’ljÁ
-
- (conf/)
- help.txt ƒjƒtƒ‹ƒwƒCƒ€A—Œ—z’ljÁ
- (map/)
- atcommand.c
- atcommand go() ƒjƒtƒ‹ƒwƒCƒ€A—Œ—z’ljÁ
---------------------
-//1005 by (“Ê)
-ENULLƒ`ƒFƒbƒN‚ÌŒ©’¼‚µ‚ƒljÁA‘å—Ê‚É•ÏX‚µ‚½‚Ì‚Å–â‘肪o‚é‰Â”\«‚ª‘å‚Å‚·
-EƒEƒ“ƒoƒ‰•ªŠ„ƒpƒbƒ`‚ª”z•z‚³‚ꂽ‚Ì‚Å@go 12‚ɃEƒ“ƒoƒ‰‚ð’ljÁ
-Eƒ[ƒhƒiƒCƒg ƒo[ƒT[ƒN‚ð‚¿‚å‚Á‚Æ‚»‚ê‚Á‚Û‚­(ASPD‘‰Á‚È‚Ç‚Í–¢ŽÀ‘•)
-EƒNƒ‰ƒEƒ“¥ƒWƒvƒV[ ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç‚ÌŽg—pðŒ‚ð‡‘t‚Æ“¯‚¶‚É•ÏX(Œø‰Ê“™‚Í–¢ŽÀ‘•)
-EƒuƒŒƒbƒVƒ“ƒO‚ª–{ŽI‚ł̓Xƒe[ƒ^ƒXƒAƒbƒv¨ƒGƒtƒFƒNƒg‚¾‚Á‚½‚Ì‚Å‚»‚̂悤‚É•ÏX
-E–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>145 zzz‚³‚ñ‚Ì•ñ‚𔽉f
-E“¯ƒXƒŒ >>143 plala‚³‚ñ‚Ì•ñ‚𔽉f
-
- (db/)
- skill_require_db.txt •ÏX
- (conf/)
- help.txt ƒEƒ“ƒoƒ‰’ljÁ
- map_athena.conf ƒEƒ“ƒoƒ‰ŠÖ˜A‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
- (map/)
- atcommand.c NULLƒ`ƒFƒbƒN‹­‰»
- atcommand() @mapmove‚È‚Ç‚Å—Ž‚¿‚é–â‘è‚ðC³
- atcommand_go() ƒEƒ“ƒoƒ‰’ljÁ
- battle.c NULLƒ`ƒFƒbƒN‹­‰»
- battle_calc_mob_weapon_attack() ƒo[ƒT[ƒNŽžƒ_ƒ[ƒW150%
- battle_calc_pc_weapon_attack() ƒo[ƒT[ƒNŽžƒ_ƒ[ƒW150%
- chat.c NULLƒ`ƒFƒbƒN‹­‰»
- chrif.c NULLƒ`ƒFƒbƒN‹­‰»
- clif.c NULLƒ`ƒFƒbƒN‹­‰»
- clif_parse_ActionRequest() ƒ_ƒ“ƒXŽž‚̈—‚ðŽáŠ±•ÏX
- clif_parse_GlobalMessage() ƒo[ƒT[ƒNŽž‚͉ï˜b‚ªo—ˆ‚È‚¢‚悤‚É•ÏX
- clif_parse_Wis() ƒo[ƒT[ƒNŽž‚͉ï˜b‚ªo—ˆ‚È‚¢‚悤‚É•ÏX
- clif_parse_PartyMessage() “¯ã
- clif_parse_GuildMessage() “¯ã
- clif_parse_TakeItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ðŽæ‚ê‚È‚¢‚悤‚É•ÏX
- clif_parse_DropItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ð—Ž‚Æ‚¹‚È‚¢‚悤‚É•ÏX
- clif_parse_UseItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
- clif_parse_EquipItem() ƒo[ƒT[ƒNŽž‚Í‘•”õ‚Å‚«‚È‚¢‚悤‚É•ÏX
- clif_parse_UnequipItem() ƒo[ƒT[ƒNŽž‚Í‘•”õ‰ðœ‚Å‚«‚È‚¢‚悤‚É•ÏX
- clif_parse_UseSkillToId() ƒo[ƒT[ƒNŽž‚̓XƒLƒ‹Žg—p‚ª‚Å‚«‚È‚¢‚悤‚É•ÏX
- clif_parse_UseSkillToPos() “¯ã
- clif_parse_UseSkillMap() “¯ã
- guild.c NULLƒ`ƒFƒbƒN‹­‰»
- intif.c NULLƒ`ƒFƒbƒN‹­‰»
- itemdb.c NULLƒ`ƒFƒbƒN‹­‰»
- map.c NULLƒ`ƒFƒbƒN‹­‰»
- map_quit() ƒo[ƒT[ƒNŽž‚ɃƒOƒAƒEƒg‚·‚é‚ÆHP 100/SP 0‚É‚È‚é‚悤‚É•ÏX
- mob.c
- mob_attack() clif_fixmobpos()‚ð‘—M‚µ‚È‚¢‚悤‚É•ÏX
- mob_timer() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏX
- mobskill_castend_id() “¯ãAƒo[ƒT[ƒNŽžƒXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
- mobskill_castend_pos() ƒo[ƒT[ƒNŽžƒXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
- mobskill_use_id() “¯ã
- mobskill_use_pos() “¯ã
- npc.c NULLƒ`ƒFƒbƒN‹­‰»
- party.c NULLƒ`ƒFƒbƒN‹­‰»
- path.c NULLƒ`ƒFƒbƒN‹­‰»
- pc.c NULLƒ`ƒFƒbƒN‹­‰»
- pc_calcstatus() ƒo[ƒT[ƒNŽž‚Í‘¬“xUP•MHP3”{AƒƒfƒBƒeƒCƒeƒBƒI‚ÌSP‰ñ•œ‘‰Á‚ðSPR‚Å‚Í‚È‚­’Êí‰ñ•œ‚É‚©‚©‚é‚悤‚É‚µ‚½
- pc_heal() ƒo[ƒT[ƒNŽž‚͉ñ•œ‚µ‚È‚¢
- pc_jobchange() “]E’¼Œã1•à“®‚©‚È‚¢‚Æ•ž‚ÌF‚ª”½‰f‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³
- pc_natural_heal_sub() ƒo[ƒT[ƒN’†‚ÍSP‚ªŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX(HP‚Í—Ç‚­•ª‚©‚ç‚È‚©‚Á‚½‚̂ʼnñ•œ‚·‚é‚悤‚É‚µ‚Ä‚ ‚é)
- pet.c NULLƒ`ƒFƒbƒN‹­‰»
- skill.c
- skill_castend_nodamage_id() ƒuƒŒƒbƒVƒ“ƒO“™‚̃pƒPƒbƒg‡‚ð•ÏXAƒXƒg[ƒ“ƒJ[ƒX‚ð•sŽ€‚É‚Í–³Œø‚É‚µ‚½
- skill_castend_map() ‚µ‚‚±‚¢‚­‚ç‚¢‚Ƀo[ƒT[ƒNŽž‚ɃXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
- skill_check_condition() “¯ã
- skill_use_pos() “¯ã
- skill_use_id() “¯ã•ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç’ljÁ
- skill_status_change_end() ƒo[ƒT[ƒNŽž‚É‚ÍIAƒAƒCƒRƒ“‚ðÁ‹Ž‚·‚é‚悤‚É•ÏX
- skill_status_change_timer() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏXAŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚т玞SPÁ”ïAƒo[ƒT[ƒNŽžHP100ˆÈã‚È‚ç10•b‚ ‚½‚è1%Œ¸‚ç‚·‚悤‚É•ÏX
- skill_status_change_start() ƒo[ƒT[ƒNŽž‚É‚ÍIAƒAƒCƒRƒ“‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
- skill_delunit() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏX
- skill_check_condition_char_sub() ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç’ljÁ
- skill_check_condition_use_sub() “¯ã
- skill_is_danceskill() “¯ã
- skill_initunitgroup() “¯ã
- trade.c NULLƒ`ƒFƒbƒN‹­‰»
- vending.c NULLƒ`ƒFƒbƒN‹­‰»
-
---------------------
-//1004 by (“Ê)
-ENULLƒ`ƒFƒbƒN‚ŃGƒ“ƒoƒO‚µ‚Ä‚¢‚½‚Æ‚±‚ë‚ð‚¢‚­‚‚©C³‚Æ‘¼‚ÌNULLƒ`ƒFƒbƒN‹­‰»
-Eskill.c‚Å‚ànullpo‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
-
- (map/)
- battle.c
- battle_damage() NULLƒ`ƒFƒbƒN‹­‰»
- battle_heal() “¯ã
- clif.c
- clif_damage() “¯ã
- map.c
- map_addflooritem() NULLƒ`ƒFƒbƒN‹­‰»
- mob.c
- mob_once_spawn() —]Œv‚ÈNULLƒ`ƒFƒbƒN‚ðíœ
- mob_once_spawn_area() “¯ã
- mob_damage() “¯ã
- mob_counttargeted() “¯ã
- mobskill_castend_id() “¯ã
- mob_summonslave() ƒƒbƒZ[ƒWŠÔˆá‚¢‚ðC³
- pc.c
- pc_damage() NULLƒ`ƒFƒbƒN‹­‰»
- skill.c ‚Ù‚Ú‘S•” NULLŠÖ˜AC³
-
---------------------
-//1003 by (“Ê)
-EjROƒNƒ‰ƒCƒAƒ“ƒg‚Å/accountŽg—pŽž‚ÉŒq‚ª‚ç‚È‚¢Œ´ˆö‚Ì0x200ƒpƒPƒbƒg–â‘è‚ðC³
-E0x1c9ƒpƒPƒbƒg‚ÌŒŠ–„‚ß‚ðˆø‚«‘±‚«Œp‘±’†
-Eˆêl‚Ź‘̂⇑t‚ðŽg—p‚Å‚«‚éÝ’è(player_skill_partner_check)‚ð’ljÁ
- ˆêl‚Ň‘t‚ðŽÀs‚µ‚½ê‡‚É‚Í’Êí‚̃_ƒ“ƒX‚Æ‹““®‚ª“¯‚¶‚É‚È‚è‚Ü‚·
-Eƒvƒƒ{ƒbƒN‚Í•sŽ€‚ɑ΂µ‚Ä”­“®‚µ‚È‚¢‚悤‚É•ÏX
-EFW‚Ì‚«”ò‚΂µ”»’è‚ð•ÏX
-EƒfƒŠƒ…[ƒW‚É…ê”»’è‚ð’ljÁA¹…‚ðì‚ê‚é‚Ì‚ðŠm”F
-EƒnƒCƒfƒBƒ“ƒO‚Ì—LŒøŽžŠÔ‚ª³‚µ‚­‹@”\‚·‚é‚悤‚ÉC³
-EƒAƒXƒyƒ‹ƒVƒI‚ð•sŽ€‚ÉŽg—p‚µ‚½ê‡A¹‘®«‚Ì40ƒ_ƒ[ƒW‚ð—^‚¦‚é‚悤‚É•ÏX
-EƒAƒXƒyƒ‹ƒVƒI‚ð•sŽ€ˆÈŠO‚ÌMOB‚ÉŽg—p‚µ‚Ä‚àŒø‰Ê‚ª–³‚¢‚悤‚É•ÏX
-E‡‘tAƒ_ƒ“ƒXA‰‰‘t’†‚ÌŒo‰ßŽžŠÔ‚É‚æ‚éSPÁ”ï‚ðŽÀ‘•
-E•ñ‚Ì‚ ‚Á‚½ƒK[ƒfƒBƒAƒ“‚ªƒMƒ‹ƒh–¢‰Á“üPC‚ðƒ^[ƒQƒbƒg‚µ‚½‚çmap‚ª—Ž‚¿‚é–â‘è‚ÌC³(ƒK[ƒfƒBƒAƒ“ŽÀ‘•“–Žž‚©‚炸‚Á‚Æ—Ž‚¿‚Ä‚½H)
-Emob.cAstorage.c‚Ìnullƒ`ƒFƒbƒN‚ð‹­‰»
- ƒGƒ‰[‚Å—Ž‚¿‚é‚ׂ«‚Æ‚±‚ë‚ð–³—‚â‚è’Ê툗‚É–ß‚µ‚Ä‚¢‚é‚Ì‚Å‘¼‚Å–â‘肪‚Å‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
- ‚»‚Ìê‡AƒRƒ“ƒ\[ƒ‹‚ÉuŠÖ”–¼ nullpov‚Æ•\Ž¦‚³‚ê‚é‚Ì‚Å•\Ž¦‚³‚ꂽꇂ͕ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·
- ‚à‚µ‚©‚µ‚½‚ç³í‚Ȉ—‚Å‚à•\Ž¦‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ªA‚»‚ÌÛ‚à•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·
- –{—ˆƒGƒ‰[AŽÀ‚ͳíA‚Ç‚¿‚ç‚É‚µ‚Ä‚à‚±‚ꂪ•\Ž¦‚³‚ê‚é‚̂̓oƒO‚Å‚·
-
- (conf/)
- battle_athena.conf player_skill_partner_check’ljÁ
- (db/)
- skill_db.txt ƒAƒXƒyƒ‹ƒVƒI‚Ì‘®«‚ð¹‚É•ÏX
- (doc/)
- conf_ref.txt player_skill_partner_checkà–¾’ljÁ
- (login/)
- login.c
- parse_login() 0x200ƒpƒPƒbƒg‘Ήž
- (map/)
- mob.c NULLƒ`ƒFƒbƒN‚Å‚Ù‚Ú‘S•”
- storage.c NULLƒ`ƒFƒbƒN‚Å‚Ù‚Ú‘S•”
- battle.h •ÏX
- battle.c
- battle_calc_magic_attack() ƒAƒXƒyƒ‹ƒVƒI‚ð’ljÁAFW‚ð•ÏX
- battle_config_read() Ý’è’ljÁ
- clif.c
- clif_getareachar_skillunit() ’²¸Œ‹‰Ê‚Ì”½‰f
- clif_skill_setunit() “¯ã
- [1001‚Æ1002‚ÌŠÔ‚Ì•ÏX“_]
- skill.c NULLƒ`ƒFƒbƒN‚ð‘òŽR
- skill_castend_damage_id() ƒAƒXƒyƒ‹ƒVƒI’ljÁ
- skill_castend_nodamage_id() ƒAƒXƒyƒ‹ƒVƒIAƒvƒƒ{ƒbƒNˆ—•ÏX
- skill_castend_id() ƒAƒXƒyƒ‹ƒVƒIˆ—•ÏX
- skill_check_condition_char_sub() player_skill_partner_check‚ɑΉž
- skill_check_condition_use_sub() “¯ã
- skill_use_id() “¯ã
- skill_check_condition() “¯ã•ƒfƒŠƒ…[ƒW‘Ήž
- skill_status_change_timer() ƒnƒCƒfƒBƒ“ƒOC³Aƒ_ƒ“ƒX‰‰‘t‡‘t’†‚ÌSPÁ”ïŽÀ‘•
- skill_initunitgroup() ƒ_ƒ“ƒXSPÁ”ï—p•ÏX
- skill_status_change_start() “¯ã•ƒvƒƒ{ƒbƒN‚ðƒ{ƒX‚ÉŒø‚©‚È‚¢‚悤‚É(‚Å‚àbattle.c‚ÅŽ~‚ß‚Ä‚é‚©‚ç’Ê킱‚±‚Ü‚Å—ˆ‚È‚¢)
-
---------------------
-//1002 by ‚Ò‚´‚Ü‚ñ
-Eƒ|[ƒ^ƒ‹ƒoƒOC³
-EƒXƒLƒ‹ŠÖŒW‚ÌNullƒ`ƒFƒbƒN‹­‰»(by(“Ê))
- (map/)
- skill.c
- skill_castend_map() C³
-
---------------------
-//1001 by (“Ê)
-E0x1c9‚Å‚¢‚­‚‚©ƒpƒPƒbƒg‚ðŒ©”ä‚ׂĕω»‚Ì‚È‚¢‚Æ‚±‚ë‚ðŒÅ’è’l‚Å–„‚ßž‚Ý(¡Œãî•ñ‚ªW‚Ü‚é‚Æ•Ï‚í‚é‰Â”\«‘å)
-Eƒ_ƒ“ƒX’†‚ÍSP‚¾‚¯‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX
-E¹‘Ì‚Å‘Š•û‚ÌSP‚ª10ˆÈ‰º‚¾‚ÆŽg—pŽ¸”s‚É‚µ‚ÄŽg—p‚µ‚½‚çSP‚ð10Œ¸‚炵‚Ä‚Ý‚é(–¢Šm”F)
-E‡‘t‚̃XƒLƒ‹Žg—pƒpƒPƒbƒg‚ðŽáŠ±•ÏX
-
- (map/)
- clif.c
- clif_getareachar_skillunit() 0x1c9‚ÌŒŠ–„‚ߊJŽn
- clif_skill_setunit() 0x1c9‚ÌŒŠ–„‚ߊJŽn
- pc.c
- pc_natural_heal_sub() ƒ_ƒ“ƒX’†‚ÍSP‚̂݉ñ•œ‚µ‚È‚¢‚悤‚É•ÏX
- skill.c
- skill_check_condition() •ÏX
- skill_check_condition_char_sub() ¹‘Ì‚Í‘Š•û‚ÌSPƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏX
- skill_check_condition_use_sub() ¹‘Ì‚Í‘Š•û‚ÌSP‚ðŒ¸‚ç‚·‚悤‚É•ÏX
-
---------------------
-//1000 by ‚Ò‚´‚Ü‚ñ
-E0999‚Ì•ÏXŽæ‚è–ß‚µ
-Eƒgƒ‰ƒbƒv‚ÌŠª‚«ž‚ÝŽÀ‘•
-EƒCƒhƒDƒ“‚Ì—ÑŒç‚ÅNPC‚܂ʼnñ•œ‚µ‚½(‚悤‚ÉŒ©‚¦‚é)–â‘èC³(–¢ƒeƒXƒg)
-Eƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̃GƒtƒFƒNƒg•ÏX(‚±‚¿‚ç‚É–¾‹L)
- (map/)
- skill.c
- skill_count_target() ’ljÁ
- skill_unit_onplace()Askill_trap_splash() •ÏX
---------------------
-//0999 by eAthena Dev Team (Yor's Fixes)
-(login/)
- added email for accounts
-(char/)
- added email for character deletion
---------------------
-//0998 by (“Ê)
-Ebattle.c‚ňø”‚Ì‘¶Ý‚ðŠm”F‚¹‚¸‚É’l‚ðŒ©‚És‚Á‚Ä‚éŠÖ”‚ð‚¢‚­‚‚©C³
-Eƒ_ƒ“ƒX’†‚ÍÀ‚ê‚È‚¢‚悤‚É‚µ‚½(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>114 DoT‚³‚ñ)
-Eƒ_ƒ“ƒX’†‚ÍHPASP‚ª‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX(“¯ã)
-Eƒ_ƒ“ƒX’†‚Í’ÊíUŒ‚‚Å‚«‚È‚¢‚悤‚É‚µ‚½(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>116 EEE‚³‚ñ)
-E‡‘t’†•Ð•û‚ª—Ž‚¿‚½ê‡AŽc‚Á‚½‚Ù‚¤‚ʼn‰‘t‚ðŒp‘±‚·‚é‚悤‚É‚µ‚½(“¯ã)
-E‡‘t’†‚̓AƒhƒŠƒuˆÈŠO‚Å‚«‚È‚¢‚悤‚É•ÏX(“¯ã)
-E‡‘t”­“®ðŒ‚Ƀ_ƒ“ƒX’†‚¶‚á‚È‚¢•À‚Á‚Ä‚¢‚È‚¢‚ð’ljÁ(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>118 ‚ë‚낳‚ñ)
-Eˆ¢C—…Žg—pŒã‚ÉHP‚à‰ñ•œ‚µ‚È‚©‚Á‚½‚Ì‚ðC³
-
- (map/)
- battle.c
- battle_counttargeted() C³
- battle_getŒn ‚½‚Ô‚ñ‘S•”C³
- clif.c
- clif_parse_WalkToXY() ‡‘t‚Ì”»’f•û–@‚Ì•ÏX
- clif_parse_ActionRequest() ƒ_ƒ“ƒX’†‚͉£‚ç‚È‚¢À‚ç‚È‚¢‚悤‚É•ÏX
- map.c
- map_quit() ƒ_ƒ“ƒX’†’f’ljÁ
- mob.c
- mob_damage() skill_stop_dancing‚̈ø”‘‰Á‚É‚æ‚é•ÏX
- pc.c
- pc_setpos() “¯ã
- pc_damage() “¯ã
- pc_equipitem() “¯ã
- pc_natural_heal_sub() ƒ_ƒ“ƒX’†‚ÍŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ˆ¢C—…Žž‚ÍSP‚̂݉ñ•œ‚µ‚È‚¢‚悤‚É
- skill.c
- skill_castend_nodamage_id() skill_stop_dancing‚̈ø”‘‰Á‚É‚æ‚é•ÏX
- skill_status_change_start() “¯ã
- skill_check_condition_char_sub() ‘ŠŽè‚ªƒ_ƒ“ƒX’†‚âÀ‚Á‚Ä‚¢‚Ä‚à‡‘t‚Å‚«‚È‚¢‚悤‚É•ÏX
- skill_check_condition_use_sub() “¯ã
- skill_use_id() ‡‘t‚Ì”»’f•û–@‚Ì•ÏX•‡‘t’†‚̓AƒhƒŠƒuˆÈŠO‹ÖŽ~‚É
- skill_status_change_end() ‡‘t‚̃_ƒ“ƒXó‘Ô‰ðœ‚Í‘ŠŽè‚Ìval4‚ð0‚É‚·‚é‚悤‚É‚µ‚½
- skill_is_danceskill() –ß‚è’l•ÏX
- skill_stop_dancing() ˆø”‘‰ÁA‡‘t‚ŕЕû‚¾‚¯—Ž‚¿‚½‚Æ‚«‚̈—’ljÁ
- skill_delunitgroup() ‡‘tŽž‚̃Xƒe[ƒ^ƒX•ÏXˆ—‚ðª‚Ɉڂµ‚½
- skill_clear_unitgroup() Ž©•ª‚Ìbl->id‚ƃ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìgroup->src_id‚ªˆá‚¤‚Æ‚«‚Í휂µ‚È‚¢‚悤‚É•ÏX
- skill.h •ÏX
-
---------------------
-//0997 by (“Ê)
-E“ñl‚Ň‘tAŽOl‚Ź‘Ì‚ðŽÀ‘•
- ‡‘t ƒo[ƒhEƒ_ƒ“ƒT[‚ª—×Ú‚µ‚½ƒZƒ‹‚É‚¢‚Ä“¯‚¶ƒXƒLƒ‹‚ðŽ‚Á‚Ä‚¢‚鎞‚É”­“®
- ƒXƒLƒ‹ƒŒƒxƒ‹‚Í—¼ŽÒ‚̃XƒLƒ‹ƒŒƒxƒ‹‚Ì’†ŠÔ
- –{ŽIŽd—l‚ª•ª‚©‚ç‚È‚¢‚¯‚ǎ΂ߗ×Ú‚àOK
- ¹‘Ì Žg—pŽÒ‚ÌXŽ²‚Å-1‚Æ+1‚ÌꊂɈêl‚¸‚ƒAƒRƒ‰ƒCƒg‚©ƒvƒŠ[ƒXƒg‚ª‚¢‚鎞‚É”­“®‚·‚é‚ÆŽv‚¤(–¢ƒeƒXƒg)
- Žg—pŽÒ › ƒAƒRƒvƒŠ œ
- OK œ›œ
-
- NG œ
- ›œ
-Eƒg[ƒL[ƒ{ƒbƒNƒX‚ðŽg‚Á‚ÄÝ’uŽž‚ÉÀ‚Á‚Ä‚¢‚½Žž‚̓XƒLƒ‹Žg—pŽ¸”s‚É‚µ‚Ä‚Ý‚½
-
- (db/)
- item_db.txt ‘º³‚ÌŽô‚¢—¦‚ð5%‚É(by e2‚³‚ñ)
- (map/)
- skill.c
- skill_check_condition_char_sub() ’ljÁ
- skill_check_condition_use_sub() ’ljÁ
- skill_check_condition() •ÏX
- skill_use_id() •ÏX
- skill_initunitgroup() •ÏX
- skill_delunitgroup() •ÏX
- clif.c
- clif_parse_UseSkillToPos() •ÏX
-
---------------------
-//0996 by (“Ê)
-EƒAƒhƒŠƒu‚Ì5•b§ŒÀ‚ðcast_db.txt‚Ìupkeep_time2‚ŧŒä‚Å‚«‚é‚悤‚É•ÏX
-E‘º³‚ÅŽ©•ª‚ðŽô‚킹‚邽‚ß‚Ébonus2 bAddEff2‚ð’ljÁ
-EŽô‚í‚ê‚Ä‚¢‚ÄI—¹‚Å‚«‚È‚¢Žž‚É‚àu¡‚ÍI—¹‚Å‚«‚Ü‚¹‚ñv‚ª•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚½
-Eƒ_ƒ“ƒXƒGƒtƒFƒNƒg“™ˆÚ“®Žž‚ÉŒø‰Ê‚Ì“K—p”»’f‚ªˆÚ“®‘O‚És‚í‚ê‚Ä‚¢‚½‚Ì‚ðˆÚ“®Œã‚É•ÏX•Žg‚í‚È‚­‚Ä‚¢‚¢•Ï”‚ð”pŽ~
-
- (db/)
- cast_db.txt
- const.txt
- item_db.txt
- (doc/)
- item_bonus.txt
- (src/)
- clif.c
- clif_parse_QuitGame() •ÏX
- map.h addeff2,arrow_addeff2 ’ljÁ
- pc.c
- pc_calcstatus() •ÏX
- pc_bonus2() •ÏX
- skill.c
- skill_additional_effect() •ÏX
- skill_check_condition() •ÏX
- skill_unit_move_unit_group() •ÏX
-
---------------------
-//0995 by (“Ê)
-Ebattle.pet_lootitem‚̃fƒtƒHƒ‹ƒg‚ªyes‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
-Ebattle.pet_lootitem‚Ì“K—p‚ðforeach‘O‚Å‚â‚é‚悤‚ÉC³
-Eƒyƒbƒg‚̉Šú‰»‚Åpd->lootitem‚ª‚ ‚鎞‚µ‚©‰Šú‰»‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
-E—̈悪ˆÚ“®‚µ‚Ä‘ÎÛ‚ª—̈悩‚甲‚¯‚Ä‚àŒø‰Ê‚ª‰ðœ‚³‚ê‚È‚¢–â‘è‚ðC³
-EƒAƒhƒŠƒu‚̓_ƒ“ƒX”­“®‚©‚ç5•bˆÈãŒo‚½‚È‚¢‚ÆŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
-
- (map/)
- pet.c
- pet_data_init() C³
- pet_ai_sub_hard() C³
- pet_ai_sub_hard_lootsearch() C³
- skill.c
- skill_blown() •ÏX
- skill_unit_onlimit() ƒGƒ‰[ƒƒbƒZ[ƒWC³
- skill_check_condition() •ÏX
- skill_initunitgroup() sd_data[SC_DANCING].val3‚Égettick()
- skill_unit_move_unit_group_sub() ’ljÁ
- skill_unit_move_unit_group() •ÏX
- skill.h skill_unit_move_unit_group() ˆø”•ÏX
- battle.c
- battle_config_read() pet_lootitem=0‚ÉC³
- pc.c
- pc_walk() •ÏX
-
---------------------
-//0994 by huge
-Ebattle.pet_lootitem‚ª“K‰ž‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
-Eƒyƒbƒg‚ɃpƒtƒH[ƒ}ƒ“ƒX‚ð‚³‚¹‚½ŒãA10•bŠÔ‚­‚ç‚¢‚ÍE‚킹‚È‚¢‚悤‚ÉB
-
- (map/)
- map.h pet_data‚Élootitem_timer’ljÁB
- pet.c
- pet_ai_sub_hard_lootsearch() C³B
- pet_lootitem_drop() C³B
-
---------------------
-//0993 by (“Ê)
-Eˆêl‚Ň‘t‚¾‚¯‚LJ‘tƒXƒLƒ‹’†‚Í“®‚¯‚È‚¢‚悤‚É
-EƒAƒ“ƒR[ƒ‹ŽÀ‘•B’¼‘O‚ÉŽg‚Á‚½ƒ_ƒ“ƒXƒXƒLƒ‹‚𔼕ª‚ÌSP‚ÅŽg‚¦‚Ü‚·
-Eƒ_ƒ“ƒX’†‚Ɉړ®‚·‚é‚ƃGƒtƒFƒNƒg‚àˆÚ“®‚·‚é‚悤‚É‚µ‚½
-E–¢ŽÀ‘•‚̃XƒLƒ‹‚ªŽg‚í‚ê‚é‚ÆUnknown skill‚Æ•\Ž¦‚³‚ê‚邱‚Æ‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
-ESage‚̃LƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚ÅŽÀ‚Í‘O‚̃XƒLƒ‹‚ðŠo‚¦‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ÌC³
-
- (map/)
- clif.c
- clif_parse_WalkToXY() •ÏX
- map.h ƒAƒ“ƒR[ƒ‹—p•Ï”‚̒ljÁ
- pc.c
- pc_walk()
- skill.c
- skill_blown
- skill_castend_nodamage_id
- skill_unitsetting() •ÏX
- skill_unit_onplace() ã©‚Å“¯‚¶ˆ—‚ð‚µ‚Ä‚¢‚écase‚ð‚Ü‚Æ‚ß‚½
- skill_unit_onout() Žg‚í‚ê‚Ä‚È‚¢unit2‚ðíœ
- skill_check_condition() •ÏX
- skill_use_id
- skill_initunitgroup() Žg‚Á‚½ƒ_ƒ“ƒXƒXƒLƒ‹‚ð•Ï”‚É“ü‚ê‚é‚悤‚É‚µ‚½
- skill_unit_move_unit_group() ’ljÁ
- skill.h •ÏX
-
---------------------
-//0992 by nokia
-
-map_quit‚ðC³‚µ‚ăƒ‚ƒŠ‚ðŽß•ú‚·‚鎞‰½“x‚à‚ðŽß•ú‚·‚邽‚߃ƒ‚ƒŠ‚̊ԈႢ‚ª‹N‚±‚é–â‘è‚𵂭
-
- (map/)
- map.c
- map_quit()
-
---------------------
-//0991 by (“Ê)
-Eƒg[ƒL[ƒ{ƒbƒNƒX‚ðŽ©•ª‚ª“¥‚ñ‚Å‚à”­“®‚µ‚È‚¢–{ŽIŽd—l‚É•ÏX
-EƒXƒLƒ‹‰r¥’†‚ƃfƒBƒŒƒC’†‚̓Nƒ‰ƒCƒAƒ“ƒg‚ðI—¹‚Å‚«‚È‚¢‚悤‚É‚µ‚½‚¯‚ÇA“G‚ÉUŒ‚‚³‚ê‚Ä‚¢‚é‚Æ‚«‚ÍI—¹‚Å‚«‚Ü‚·(‚²‚ß‚ñ‚È‚³‚¢‚ÁII)
-
- (map/)
- clif.c
- clif_parse_QuitGame() •ÏX
- skill.c
- skill_unitsetting() •ÏX
-
---------------------
-//0990 by ‚Ò‚´‚Ü‚ñ
-Eˆê•”‚̃gƒ‰ƒbƒv‚ð”͈ÍUŒ‚‚É•ÏXiŠª‚«ž‚Ý‚Í–¢ŽÀ‘•jB
-Emapflag‚Épvp_nocalcrank‚Æpvp_nightmaredrop’ljÁB
- E<gatname><tab>mapflag<tab>pvp_nocalcrank<tab>dummy
- @PvP‚É‚æ‚郉ƒ“ƒLƒ“ƒOŒvŽZ‚ð‚µ‚È‚¢‚悤‚É‚µ‚Ü‚·B
- E<gatname><tab>mapflag<tab>pvp_nightmaredrop<tab><item>,<type>,<per>
- @PvP‚É‚ÄŽ€–S‚µ‚½ê‡A<per>‚ÌŠm—¦‚ŃAƒCƒeƒ€‚ðƒhƒƒbƒv‚µ‚Ü‚·B
- @<item>: ƒhƒƒbƒv‚·‚éƒAƒCƒeƒ€ID‚ðŽw’肵‚Ü‚·Brandom‚Æ‹Lq‚·‚é‚ÆŠŽ•i‚©‚烉ƒ“ƒ_ƒ€‚Ƀhƒƒbƒv‚µ‚Ü‚·B
- @<type>: ƒhƒƒbƒv‚·‚éƒAƒCƒeƒ€‚̃^ƒCƒv‚ðŽw’肵‚Ü‚·Binventory:ŠŽ•i equip:‘•”õ•i all:‘S•”
- @<per>: ƒhƒƒbƒv‚·‚éŠm—¦‚Å‚·B–œ•ª—¦‚ÅŽw’肵‚Ü‚·B
- (map/)
- skill.c
- skill_unit_onplace() •ÏX
- skill_trap_splash() ’ljÁ
- pc.c
- pc_damage() •ÏX
- npc.c
- npc_parse_mapflag() •ÏX
- map.h
- map_data‚Ƀƒ“ƒo’ljÁ
- (conf/)
- mapflag.txt
- ƒiƒCƒgƒƒAƒ‚[ƒh‚ɃhƒƒbƒvÝ’è’ljÁ
-
---------------------
-//0989 by (“Ê)
-EƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv‚ð–^Š‚ÅŒ©‚½SS‚ðŒ³‚ÉŽÀ‘•‚µ‚Ä‚Ý‚½Bˆá‚Á‚½‚ç‘ŠˆáƒXƒŒ‚Ö
-EƒfƒBƒeƒNƒeƒBƒ“ƒO‚ð–^Š‚ÅŒ©‚½‰ðà•¶‚ðŒ³‚ÉŽÀ‘•‚µ‚Ä‚Ý‚½Bˆá‚Á‚½‚ç‘ŠˆáƒXƒŒ‚Ö
-EƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹Žž‚Ìdelete_timerƒGƒ‰[‚ɒljÁ‚ŃXƒLƒ‹ID‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½B‚ ‚킹‚Ä•ñ‚·‚é‚ƃGƒ‰[‚ÌŒ´ˆö‚ª•ª‚©‚é‚©‚à
-
- (map/)
- skill.c
- skill_castend_nodamage_id() •ÏX
- skill_castend_pos2() •ÏX
- skill_castcancel() •ÏX
-
---------------------
-//0988 by (“Ê)
-Eƒg[ƒL[ƒ{ƒbƒNƒX‚Íí‚É‘«Œ³‚É’u‚¯‚é‚悤‚É•ÏX‚ÆKalen‚³‚ñ‚É–á‚Á‚½î•ñ“™‚ðŒ³‚ÉƒpƒPƒbƒg‚ð–{ŽI‚É‚ ‚킹‚Ä‚Ý‚½
-EƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv‚ÉŒø‰Ê‚ð’ljÁ‚µ‚½‚‚à‚è(–¢Šm”F)
-Eƒuƒ‰ƒXƒgƒ}ƒCƒ“‚ƃNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv‚ð‰£‚é‚Æ‚«”ò‚Ԃ悤‚É‚µ‚½
-EƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚Åã©(skill_require_db‚ÅŽw’肵‚½ƒAƒCƒeƒ€)‚ð‰ñŽû‚Å‚«‚é‚悤‚É‚µ‚½
-Eª‚ÌŽÀ‘•‚É‚æ‚èã©‚ÌŽžŠÔØ‚ê‚Åã©‚ªo‚éƒIƒŠƒWƒiƒ‹Žd—l‚̓Rƒƒ“ƒgƒAƒEƒg
-Eƒuƒ‰ƒXƒgƒ}ƒCƒ“‚ÌŒø‰ÊŽžŠÔ‚ª’·‚¢‚Ì‚ðC³
-
- (db/)
- cast_db.txt
- (map/)
- battle.c
- battle_check_target() •ÏX
- mob.c
- mobskill_castend_pos() •ÏX
- skill.c
- skill_additional_effect() •ÏX
- skill_blown() •ÏX
- skill_castend_nodamage_id() •ÏX
- skill_castend_pos2() •ÏX
- skill_unitsetting() •ÏX
- skill_unit_onplace() •ÏX
- skill_unit_ondamaged() •ÏX
- skill_castend_pos() •ÏX
- skill_unit_timer_sub() •ÏX
-
---------------------
-//0987 by ŒÓ’±—–
-
-Eƒ†[ƒU[’è‹`ŠÖ”/ƒTƒuƒ‹[ƒeƒBƒ“‚Ɉø”‚ðŽw’è‰Â”\‚É
- Ú‚µ‚­‚Í script_ref.txt ‚ðŽQÆ
-
- (map/)
- scirpt.c
- buildin_getarg()’ljÁ
- buildin_callsub(),buildin_callfunc(),run_func()C³
- (doc/)
- script_ref.txt
- ˆø”‚ɂ‚¢‚Ä‚Ìà–¾’ljÁ
-
-Egetguildname,getpartyname,getcastlename,strcharinfoC³
- C_STR‚Œ蔕¶Žš—ñ(C_CONSTSTR)‚ð•Ô‚µ‚Ä‚¢‚½–â‘èC³
- strcharinfo‚ŃMƒ‹ƒh–¼‚È‚Ç‚ðŠ“¾‚·‚éÛA–¢Š‘®‚¾‚Á‚½‚Æ‚«‚Ì–â‘è
-
- (map/)
- script.c
- buildin_getguildname(),buildin_getpartyname()
- buildin_getcastlename(),buildin_strcharinfo()
-
---------------------
-//0986 by (“Ê)
-Eclient_packet‚Ì‹Lq‚©‚ç„Ž@‚µ‚ăg[ƒL[ƒ{ƒbƒNƒX‚ðŽÀ‘•‚µ‚Ä‚Ý‚½‚‚à‚è
-
- (db/)
- skill_db.txt
- (map/)
- clif.c
- clif_talkiebox() ’ljÁ
- clif_parse_UseSkillToPos() •ÏX
- clif_parse() •ÏX
- clif.h •ÏX
- map.h •ÏX
- skill.c
- skill_castend_pos2() •ÏX
- skill_unitsetting() •ÏX
- skill_unit_onplace() •ÏX
-
---------------------
-//0985 by (“Ê)
-EƒT[ƒo[snapshot
-E/script/extension‚ÉŒê‚è•”‚ð’ljÁ‚µ‚½‚è
-E0984‚ÅAthenaŽG’kƒXƒŒƒbƒh part3>>92 Michael‚³‚ñ‚ÌC³‚ðŽæ‚èž‚ñ‚Å‚½
-EƒoƒO•ñƒXƒŒƒbƒh part5 >>45‚É“]Ú‚³‚ê‚Ä‚½ ‚ ‚â‚Ë‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
-EƒoƒO•ñƒXƒŒƒbƒh part5 >>54 rari‚³‚ñ‚Ì‚½‚Ê‚«–XC³‚ðŽæ‚èž‚Ý
-
- (script/extension/)
- npc_event_kataribe6.txt ’ljÁ
- npc_event_kataribe7.txt ’ljÁ
- (script/npc/)
- quest/npc_event_hat.txt C³
- job/npc_job_magician.txt C³
-
---------------------
-//0984 by (“Ê)
-EƒZ[ƒW‚̃tƒŠ[ƒLƒƒƒXƒg‚Æ‚¢‚¤ƒXƒLƒ‹‚Ì‘¶Ý‚ð’m‚ç‚È‚©‚Á‚½‚Ì‚Å0983‚Ì•ÏX‚ðˆê•”–ß‚µ
-EƒAƒCƒeƒ€XV‚µ‚½‚¯‚Ç‚‚ê”L‚ƃCƒ“ƒfƒBƒAƒ“ƒoƒ“ƒ_ƒi‚ª‘•”õ‚Å‚«‚È‚¢H
-Eƒ}ƒbƒvƒtƒ‰ƒO‚ƃ‚ƒ“ƒXƒ^[”z’u‚ðÅV”Å‚É
-
- (db/)
- item_db.txt
- (conf/)
- mapflag.txt
- (script/mob/)
- npc_monster.txt
- (map/)
- clif.c
- clif_parse_WalkToXY() C³
-
---------------------
-//0983 by (“Ê)
-E’·‚¢‰r¥’†‚É•à‚«‚Ü‚í‚ꂽ‹C‚ª‚·‚é‚Ì‚ÅC³
-Eƒyƒbƒgƒ‹[ƒŒƒbƒg‰ñ“]’†‚É‘ÎÛ‚ª’@‚«ŽE‚³‚ꂽ‚çmap-server‚ª¢‚é‚Ì‚ðC³
-EƒvƒƒtƒFƒbƒT[ ƒ‰ƒCƒt’u‚«Š·‚¦‚̎蔲‚«ˆ—‚ð‚¿‚å‚Á‚ƃ}ƒV‚É‚µ‚½
-
- (map/)
- clif.c
- clif_parse_WalkToXY() C³
- pet.c
- pet_catch_process2() C³
- skill.c
- skill_castend_nodamage_id() C³
-
---------------------
-//0982 by (“Ê)
-E“]¶ƒXƒLƒ‹‚Ì`
- ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ‘ŠŽè‚ªPC‚Ìꇂ͌•‚¶‚á‚È‚¯‚ê‚Î’µ‚Ë•Ô‚³‚È‚¢—\’è
- ƒvƒƒtƒFƒbƒT[ ƒƒ‚ƒ‰ƒCƒY 12•b‚̌ŒèƒLƒƒƒXƒgƒ^ƒCƒ€A‚»‚ÌŒãƒXƒLƒ‹Žg—p‚̃LƒƒƒXƒgƒ^ƒCƒ€‚ª3‰ñ‚¾‚¯1/3‚É‚È‚é
- ƒvƒƒtƒFƒbƒT[ ƒ‰ƒCƒt’u‚«Š·‚¦ HP‚ð10%Œ¸‚炵‚ÄSP‚ð‘‚â‚·BŒ¸‚Á‚½HP‚̃GƒtƒFƒNƒg‚Í–³‚µ‚É‚µ‚Ä‚Ý‚½
-EŒ©Ø‚è‚Ɖñ”𗦑‰Á‚ÌFlee㸂ªƒXƒe[ƒ^ƒX•Ï‰»Žž‚É‚µ‚©”½‰f‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
-E0981‚ÅŽ©•ªˆÈŠO‚Í•à‚¢‚½‚ç•ž‚ÌF‚ª–ß‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð‚È‚ñ‚Æ‚©‚µ‚½‚‚à‚è
-
- (db/)
- skill_require_db.txt
- (map/)
- battle.c
- battle_calc_damage() C³
- clif.c
- clif_movechar() C³
- clif_getareachar_pc() C³
- pc.c
- pc_calcstatus() C³
- skill.c
- SkillStatusChangeTable •ÏX
- skill_castend_nodamage_id() •ÏX
- skill_use_id() •ÏX
- skill_use_pos() •ÏX
- skill_status_change_timer() •ÏX
- skill_status_change_start() •ÏX
- skill.h •ÏX
-
---------------------
-//0981 by (“Ê)
-E“]¶ƒXƒLƒ‹‚Ì`
- ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ˆê’èŠm—¦‚Ń_ƒ[ƒW‚𔼕ª‚É‚µ‚ÄŒ¸‚炵‚½•ª‚ð‘ŠŽè‚É’µ‚Ë•Ô‚·‚悤‚É‚µ‚½c‚ªA’µ‚Ë•Ô‚µ‚½ƒ_ƒ[ƒW‚̃GƒtƒFƒNƒgo‚Ü‚¹‚ñ
-E•ž‚ÌF‚ð•ÏX••Û‘¶‚µ‚Ä‚¢‚éꇂɃŠƒƒO‚·‚é‚ÆŒ³‚ÌF‚É–ß‚Á‚Ä‚é‚悤‚ÉŒ©‚¦‚é–â‘è‚ÌC³
-
- (db/)
- skill_db.txt
- (map/)
- clif.c
- clif_parse_LoadEndAck() C³
- battle.c
- battle_calc_damage() C³
- skill.c
- skill_status_change_timer() C³
- skill_status_change_start() C³
-
---------------------
-//0980 by (“Ê)
-E—á‚É‚æ‚Á‚Ä“]¶ƒXƒLƒ‹‚ƃ‚ƒ“ƒNŠÖ˜A
- ƒXƒiƒCƒp[ ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO ƒNƒŠƒeƒBƒJƒ‹—¦’²®H
- ƒnƒCƒEƒBƒU[ƒh ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ MSP‘—Ê‚ÆMob‚ð“|‚µ‚½‚Æ‚«‚ÉSP(mobLv*(65+15*SkillLv)/100)‰ñ•œB‚Å‚à–{“–‚͔͈ÍUŒ‚‚Ìꇂ͉ñ•œ‚µ‚È‚¢‚炵‚¢H
- ƒnƒCƒEƒBƒU[ƒh –‚–@—Í‘• Žg‚Á‚½‚çMATK‚ªSkillLv%‘—ÊBŽŸ‚̃XƒLƒ‹Žg—pŽž‚ÉŒ³‚É–ß‚é
- ƒ‚ƒ“ƒN ‹C’D ‚¿‚å‚Á‚ÆæŽæ‚肵‚Ä20%‚ÌŠm—¦‚Å“G‚ÌLv*2‚ÌSP‚ð‹zŽûB¬Œ÷‚µ‚½‚Æ‚«‚̓^[ƒQƒbƒg‚ðŽæ“¾‚·‚é‚悤‚É‚µ‚Ä‚Ý‚½
-EƒAƒCƒeƒ€–¼‚ðjROƒEƒ“ƒoƒ‰‚É€‹’‚³‚¹‚Ä‚Ý‚½‚‚à‚è
-
- (db/)
- cast_db.txt
- item_db.txt
- (map/)
- battle.c
- battle_calc_pc_weapon_attack() •ÏX
- mob.c
- mob_damage() •ÏX
- pc.c
- pc_calcstatus() •ÏX
- skill.c
- skill_castend_nodamage_id() •ÏX
- skill_use_id() •ÏX
- skill_use_pos() •ÏX
- skill_status_change_end() •ÏX
- skill_status_change_timer() •ÏX
- skill_status_change_start() •ÏX
-
---------------------
-//0979 by (“Ê)
-E“]¶ƒXƒLƒ‹‚ð‚¿‚å‚Á‚Æ’²®
- ƒnƒCƒEƒBƒU[ƒh ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[ •ŠíUŒ‚‚ÅBaseATKŒvŽZ‚ðMATK2‚Å‚µ‚Ä‚Ý‚é
-E‘§‚ð–{ŽIŽd—l•—‚ÉHP‚ÆSP‚̉ñ•œƒ^ƒCƒ}[‚𕪂¯‚ÄÀ‚Á‚Ä‚¢‚È‚­‚Ä‚à“®‚©‚È‚¯‚ê‚΃^ƒCƒ}[‚ªi‚ނ悤‚É‚µ‚½
-Eˆ¢C—…Žg—pŒã‚ÉHP‚ÆSP‚ª5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢–{ŽIŽg—p•—‚É‚µ‚½(csat_db.txt‚Ìupkeep_time2‚Å’²®‰Â”\)
-EŒÃ‚¢gcc‚Åskill_unit_timer_sub_onplace()‚ ‚½‚è‚ŃRƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚Á‚½‚Ì‚ðC³
-
- (db/)
- cast_db.txt
- (map/)
- battle.c
- battle_calc_pet_weapon_attack() •ÏX
- battle_calc_mob_weapon_attack() •ÏX
- battle_calc_pc_weapon_attack() •ÏX
- map.h
- pc.c
- pc_authok() •ÏX
- pc_walk() •ÏX
- pc_spirit_heal() íœ
- pc_spirit_heal_hp() ’ljÁ
- pc_spirit_heal_sp() ’ljÁ
- pc_natural_heal_sub() •ÏX
- skill.c
- skill_additional_effect() •ÏX
- skill_castend_damage_id() •ÏX
- skill_status_change_start() •ÏX
- skill_unit_timer_sub_onplace() C³
-
---------------------
-//0978 by (“Ê)
-E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
- ƒXƒiƒCƒp[ ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg ‚Æ‚è‚ ‚¦‚¸”ò‚Ô‚¾‚¯‚¾‚ÆŽv‚Á‚Ä‚­‚¾‚³‚¢
- ƒXƒiƒCƒp[ ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO ƒ_ƒ[ƒW‘‰Á‚¾‚¯‚Ç1‘Ì‚¾‚¯
- ƒNƒ‰ƒEƒ“EƒWƒvƒV[ ƒAƒ[ƒoƒ‹ƒJƒ“ ƒ_ƒ[ƒW‘‰Á‚Æ9‰ñUŒ‚
- ƒnƒCƒEƒBƒU[ƒh ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[ ƒGƒtƒFƒNƒg‚¾‚¯
-
-EƒAƒCƒeƒ€ŒðŠ·‚Åd—Ê‚ÌŒvŽZ‚ªˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
- (doc/)
- client_packet.txt ƒpƒPƒbƒg’·ƒe[ƒuƒ‹XV
- (map/)
- battle.c
- battle_calc_misc_attack() •ÏX
- battle_calc_pet_weapon_attack() •ÏX
- battle_calc_mob_weapon_attack() •ÏX
- battle_calc_pc_weapon_attack() •ÏX
- clif.c ƒpƒPƒbƒg’·‚Ì’è‹`‚ðXV
- skill.c
- skill_castend_damage_id() •ÏX
- trade.c
- trade_tradeadditem() C³
-
---------------------
-//0977 by (“Ê)
-E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
- ƒAƒTƒVƒ“ƒNƒƒX ƒƒeƒIƒAƒTƒ‹ƒg ƒGƒtƒFƒNƒg‚ªˆá‚¤H
- ƒ[ƒhƒiƒCƒg ƒvƒŒƒbƒVƒƒ[ •K’†ƒ_ƒ[ƒW‚É‚µ‚Ä‚Ý‚½
- ƒ[ƒhƒiƒCƒg ƒI[ƒ‰ƒuƒŒ[ƒh‚Ì•K’†damage2‚ª‘¼‚Å‚à“K—p‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³
- ƒ[ƒhƒiƒCƒg ƒSƒXƒyƒ‹ ƒGƒtƒFƒNƒgoŒ»ˆÊ’u‚Ì’²®
- ƒnƒCƒvƒŠ[ƒXƒg ƒAƒVƒƒƒ“ƒvƒeƒBƒI Œø‰ÊŽÀ‘•
- ƒnƒCƒvƒŠ[ƒXƒg ƒƒfƒBƒeƒCƒeƒBƒI Œø‰ÊŽÀ‘•
- ƒnƒCƒvƒŠ[ƒXƒg ƒoƒWƒŠƒJ SG‚Ý‚½‚¢‚ÉMob‚ªN“ü‚µ‚悤‚Æ‚·‚é‚Æ‚«”ò‚΂³‚ê‚é‚悤‚É‚µ‚½
- ƒzƒƒCƒgƒXƒ~ƒX ƒJ[ƒgƒu[ƒXƒg Œø‰ÊŽÀ‘•
- ƒzƒƒCƒgƒXƒ~ƒX ƒƒ‹ƒgƒ_ƒEƒ“ ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
- ƒzƒƒCƒgƒXƒ~ƒX ƒNƒŠƒGƒCƒgƒRƒCƒ“ –¼‘O“ü‚è‚Ì‹à‰Ý‚Æ‚©ì‚ê‚邾‚¯
- ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
- ƒNƒ‰ƒEƒ“EƒWƒvƒV[ ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹ ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
- ƒvƒƒtƒFƒbƒT[ ƒtƒHƒOƒEƒH[ƒ‹ ƒGƒtƒFƒNƒg‚Æ—LŒøŽžŠÔ‚¾‚¯
- ƒXƒiƒCƒp[ ƒEƒCƒ“ƒhƒEƒH[ƒN ‘¬“x㸂ÆQMAŽ„‚ð–Y‚ê‚È‚¢‚Å‚ª‚©‚©‚é‚Ɖ𜂳‚ê‚é‚悤‚É‚µ‚½
- ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg QMAŽ„‚ð–Y‚ê‚È‚¢‚łʼn𜂳‚ê‚é‚悤‚É‚µ‚Ä‚Ý‚½
-EƒgƒDƒ‹[ƒTƒCƒg‚Ì’Ô‚èŠÔˆá‚¢‚ðC³
-Estorage.c‚ŃRƒ“ƒpƒCƒ‹Œx‚ªo‚È‚¢‚悤‚É‚µ‚½‚‚à‚è
-
- (db/)
- cast_db.txt
- skill_db.txt
- skill_require_db.txt
- produce_db.txt
- (map/)
- battle.c
- battle_get_str() C³
- battle_get_agi() C³
- battle_get_vit() C³
- battle_get_int() C³
- battle_get_dex() C³
- battle_get_luk() C³
- battle_get_flee() C³
- battle_get_hit() C³
- battle_get_critical() C³
- battle_get_baseatk() C³
- battle_get_atk() C³
- battle_get_atk2() C³
- battle_get_def() C³
- battle_get_def2() C³
- battle_get_speed() C³
- battle_calc_damage() C³
- battle_calc_pet_weapon_attack() •ÏX
- battle_calc_mob_weapon_attack() •ÏX
- battle_calc_pc_weapon_attack() •ÏX
- pc.c
- pc_calcstatus() C³
- skill.c
- skill_get_unit_id() C³
- skill_additional_effect() C³
- skill_castend_nodamage_id() C³
- skill_castend_pos2() C³
- skill_unit_group() C³
- skill_unit_onplace() C³
- skill_unit_onout() C³
- skill_castend_pos() C³
- skill_check_condition() C³
- skill_status_change_end() C³
- skill_status_change_start() C³
- skill_can_produce_mix() C³
- skill_produce_mix() C³
- skill.h C³
- storage.c
- storage_comp_item() C³
- storage.h C³
-
---------------------
-//0976 by (“Ê)
-E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
-E€”õ‚¾‚¯‚µ‚ÄŽÀ‘•‚Å‚«‚Ä‚È‚¢ƒXƒLƒ‹‚à‚ ‚è‚Ü‚·
- ƒ[ƒhƒiƒCƒg ƒI[ƒ‰ƒuƒŒ[ƒh ‘½•ª‚±‚ñ‚ÈŠ´‚¶H
- ƒ[ƒhƒiƒCƒg ƒpƒŠƒCƒ“ƒO ’µ‚Ë•Ô‚·‚¯‚ÇUŒ‚‚ð1‰ñŽ~‚ß‚é‚Ì‚Í–¢ŽÀ‘•
- ƒ[ƒhƒiƒCƒg ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ ƒCƒ“ƒfƒ…ƒA`‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å•ú’u
- ƒ[ƒhƒiƒCƒg ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX ’Êíƒ_ƒ[ƒW‘‰Á‚Æd—ʃ_ƒ[ƒW‘‰Á‚ƈꉞ5‰ñUŒ‚(‚È‚ñ‚©ˆá‚¤‹C‚ª‚·‚é)
- ƒ[ƒhƒiƒCƒg ƒwƒbƒhƒNƒ‰ƒbƒVƒ… ƒ_ƒ[ƒW‘‰Á‚ƃXƒe[ƒ^ƒX•ÏXH
- ƒ[ƒhƒiƒCƒg ƒWƒ‡ƒCƒ“ƒgƒr[ƒg ƒ_ƒ[ƒW‘‰Á‚ƃXƒe[ƒ^ƒX•ÏXH
- ƒAƒTƒVƒ“ƒNƒƒX ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹† ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H
- ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H
- ƒXƒiƒCƒp[ ƒEƒBƒ“ƒhƒEƒH[ƒN ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H‚Å‚à‘¬“x㸂Ƃ©‚Æ‹£‡‚µ‚½Žž‚̈—‚Í–¢ŽÀ‘•
- ƒXƒpƒCƒ_[ƒEƒFƒbƒu ‚Æ‚è‚ ‚¦‚¸ƒAƒ“ƒNƒ‹ƒXƒlƒA‚Æ“¯‚¶‚悤‚ÈŠ´‚¶•‰ñ”𗦔¼Œ¸
- ƒ`ƒƒƒ“ƒsƒIƒ“ ‹¶‹CŒ÷ “K“–‚É‘‚₵‚Ä‚¢‚½‚Ì‚ð‚¿‚á‚ñ‚Æ‘‚â‚·‚悤‚É‚µ‚½
-EoŒŒó‘Ô‚ÆœÜó‘Ô‚ÌŽæ‚舵‚¢‚ª‚æ‚­‚í‚©‚è‚Ü‚¹‚ñ‚ÁII
-
- (db/)
- cast_db.txt
- skill_db.txt
- skill_require_db.txt
- (doc/)
- db_ref.txt
- (map/)
- battle.c
- battle_get_str() C³
- battle_get_agi() C³
- battle_get_vit() C³
- battle_get_int() C³
- battle_get_dex() C³
- battle_get_luk() C³
- battle_get_flee() C³
- battle_get_hit() C³
- battle_get_critical() C³
- battle_get_baseatk() C³
- battle_get_atk() C³
- battle_get_atk2() C³
- battle_get_def() C³
- battle_get_def2() C³
- battle_get_speed() C³
- battle_calc_damage() C³
- clif.c
- clif_parse_WalkToXY() C³
- mob.c
- mob_can_move() C³
- mobskill_castend_pos() C³
- pc.c
- pc_calcstatus() C³
- pc_checkallowskill() C³
- skill.c
- skill_get_unit_id() C³
- skill_additional_effect() C³
- skill_castend_nodamage_id() C³
- skill_castend_pos2() C³
- skill_unit_group() C³
- skill_unit_onplace() C³
- skill_unit_onout() C³
- skill_castend_pos() C³
- skill_check_condition() C³
- skill_status_change_end() C³
- skill_status_change_start() C³
- skill_readdb() C³
- skill.h C³
---------------------
-//0975 by Sin
-E0973‚ÅŽÀ‘•‚³‚ꂽƒXƒNƒŠƒvƒg‚É‚æ‚éBaseLv, JobLv‚Ì•ÏXŽž‚ÉA
-@ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚âƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽæ“¾‚Å‚«‚é‚悤‚ÉC³B
-@¦Ž¿–âƒXƒŒpart5 >>115 ”Y‚ß‚él ‚³‚ñ‚Ìpc.c‚ðŽQl‚É‚³‚¹‚Ä’¸‚«‚Ü‚µ‚½B‘½ŽÓB
-
- (map/)
- pc.c
- pc_setparam()
- case SP_BASELEVEL: C³
- case SP_JOBLEVEL: C³
---------------------
-//0974 by latte
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚ð–{ŽI‚ÉŠî‚«C³
- ƒAƒ“ƒfƒbƒhˆ«–‚‹­§ˆÃˆÅ•t—^
- ”½“®ƒ_ƒ[ƒW”¼Œ¸Aƒ‚[ƒVƒ‡ƒ“‚È‚µ
- MOB(PC)‚ªd‚È‚Á‚½‚Æ‚«‚ÌHIT”
- %UPŒn•ŠíƒJ[ƒhŒø‰Ê‚È‚µ
- ‘®«‘Š«“ñdŒvŽZ
- MOBƒ_ƒ[ƒW•\Ž¦”’
-
- Œã”¼4€–Ú‚ÍÝ’è‰Â
-
-E퓬Šî–{ŒvŽZ‚ð–{ŽI‚ÉŠî‚«”÷C³iDEXƒTƒCƒY•â³A‹|Å’áƒ_ƒAPCƒTƒCƒY•â³j
-
-EŠ®‘S‰ñ”ð
- ƒXƒ^ƒ““™‚ÅŠ®‘S‰ñ”ð‚ª”­¶‚µ‚È‚©‚Á‚½‚Ì‚ðC³
- AGIVITƒyƒiƒ‹ƒeƒB‚ªŠ®‘S‰ñ”ð‚Ì“G‚àƒJƒEƒ“ƒg‚µ‚ÄŒvŽZ‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³@Ý’è‰Â
- ƒI[ƒgƒJƒEƒ“ƒ^[‚Í–¢C³
-
-E‘qŒÉ‚ð•Â‚¶‚é‚Æ‚«AƒAƒCƒeƒ€ID‚Ń\[ƒg‚·‚é‚悤‚É‚µ‚½
-
-Ekalen‚³‚ñ‚̃vƒ‚PŽ·Ž–NPCƒXƒNƒŠƒvƒg‚ð‰ü‘¢‚µ‚Ä
- ¤‹Æ–h‰q’lA“ŠŽ‘‹àŠzA•ó” ‚Ì”‚ð–{ŽI‚É€‹’(¤‹Æ’l‚Í1~100)
- ‘SÔ‚ÉÝ’u
-
- (/script/npc)
- aldeg_cas01.txt ... prtg_cas05.txt C³
- (/script/npc/gvg)
- aldeg_cas01.txt ... prtg_cas05.txt ’ljÁ
- tbox.txt ’ljÁ
-
- (/conf)
- battle_athena.conf
- 6€–ڒljÁ
-
- (/map)
- mob.c/mob.h
- mob_attack() C³
- mob_counttargeted_sub(),mob_counttargeted() C³
- mobskill_use() C³iª‚̈ø”‚¾‚¯j
- pc.c/pc.h
- pc_counttargeted_sub(),pc_counttargeted() C³
- pc_attack_timer() C³
- pet.c
- pet_attack() C³
-
- map.h
- pc_data, mob_data, map_data •Ï”‚P‚’ljÁ
- enum1‚’ljÁ
- map.c/map.h
- map_count_oncell() ’ljÁ skill.c‚Å‚æ‚©‚Á‚½‚©‚àEEE
-
- skill.c
- GXŠÖ˜AC³(skill_additional_effect(), skill_attack(), skill_castend_damage_id(), skill_unit_onplace())
-
- battle.c C³
- battle.h C³
-
- storage.c/storage.h
- storage_comp_item() ’ljÁ
- sortage_sortitem(), sortage_gsortitem() ’ljÁ
- storage_storageclose(), storage_guild_storageclose() C³
---------------------
-//0973 by Ž‚Žqo^.^o
-EƒXƒNƒŠƒvƒg‚ÌBASELEVEL,JOBLEVEL–½—ߒljÁ
- —á: set BASELEVEL,1;
- —á: set JOBLEVEL,1;
- (map/)
- pc.c
- pc_setparam()
- case SP_BASELEVEL: €–ڒljÁ
- case SP_JOBLEVEL: €–ڒljÁ
-
---------------------
-//0972 by (“Ê)
-E“]¶ƒXƒLƒ‹‚ðƒGƒtƒFƒNƒg‚¾‚¯‚¢‚­‚‚©’ljÁ‚µ‚½‚è
-Eó‘ԕω»‚Í‚»‚Ì‚¤‚¿’N‚©‚ª
- ƒGƒtƒFƒNƒg(ƒXƒe[ƒ^ƒX•Ï‰»ƒAƒCƒRƒ“ŠÜ‚Þ)‚Ì‚Ý
- SC_AURABLADE: /* ƒI[ƒ‰ƒuƒŒ[ƒh */
- SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
- SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
- SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- SC_BERSERK: /* ƒo[ƒT[ƒN */
- SC_ASSUMPTIO: /* */
- SC_TURESIGHT: /* ƒgƒDƒ‹[ƒTƒCƒg */
- SC_CARTBOOST: /* ƒJ[ƒgƒu[ƒXƒg */
- SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH[ƒN */
-
- (db/)
- cast_db.txt
- (map/)
- skill.h
- skill.c
- SkillStatusChangeTable[] €–ڒljÁ
- skill_castend_nodamage_id() €–ڒljÁ
- skill_status_change_end() €–ڒljÁ
- skill_status_change_start() €–ڒljÁ
-
---------------------
-//0971 by (“Ê)
-Eatcommand.h‚ÉŽc‚Á‚Ä‚¢‚½jobchange2‚Æ‚©‚ÌŽcŠ[‚ðíœ
-E“]¶ƒXƒLƒ‹‚ðƒGƒtƒFƒNƒg‚¾‚¯‚¢‚­‚‚©’ljÁ‚µ‚½‚èƒ`ƒƒƒ“ƒsƒIƒ“‚Í‚»‚ê‚È‚è‚ɒljÁ‚µ‚½‚è
- ƒGƒtƒFƒNƒg‚Ì‚Ý
- ƒnƒCƒvƒŠ[ƒXƒg ƒoƒWƒŠƒJ(HP_BASILICA)
- ƒzƒƒCƒgƒXƒ~ƒX ƒJ[ƒgƒu[ƒXƒg(WS_CARTBOOST)
- ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg(SN_SIGHT)
- ƒWƒvƒV[ ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç(CG_MOONLIT)
- ƒpƒ‰ƒfƒBƒ“ ƒSƒXƒyƒ‹(PA_GOSPEL)
- ’ljÁƒ_ƒ[ƒW“™‚È‚µ
- ƒ[ƒhƒiƒCƒg ƒwƒbƒhƒNƒ‰ƒbƒVƒ…(LK_HEADCRUSH)
- ƒ[ƒhƒiƒCƒg ƒWƒ‡ƒCƒ“ƒgƒr[ƒg(LK_JOINTBEAT)
- ƒ[ƒhƒiƒCƒg ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX(LK_SPIRALPIERCE)
- ƒpƒ‰ƒfƒBƒ“ ƒvƒŒƒbƒVƒƒ[(PA_PRESSURE)
- ƒpƒ‰ƒfƒBƒ“ ƒTƒNƒŠƒtƒ@ƒCƒX(PA_SACRIFICE)
- ‚»‚ê‚È‚è(ƒRƒ“ƒ{‚ÍŒq‚ª‚è‚Ü‚·‚ªƒfƒBƒŒƒC‚Í“K“–Aƒ_ƒ[ƒW’ljÁ‚Í‚ ‚邯‚Ç‚»‚êˆÈŠO‚̒ljÁŒø‰Ê‚Í–³‚µ)
- ƒ`ƒƒƒ“ƒsƒIƒ“ –ÒŒÕd”hŽR(CH_PALMSTRIKE)
- ƒ`ƒƒƒ“ƒsƒIƒ“ •šŒÕŒ(CH_TIGERFIST)
- ƒ`ƒƒƒ“ƒsƒIƒ“ ˜A’Œ•öŒ‚(CH_CHAINCRUSH)
- ƒ`ƒƒƒ“ƒsƒIƒ“ ‹¶‹CŒ÷(CH_SOULCOLLECT)
-
- (db/)
- cast_db.txt
- skill_db.txt
- skill_require_db.txt
- (map/)
- atcommand.h ƒSƒ~íœ
- battle.c
- battle_calc_pet_weapon_attack() •ÏX
- battle_calc_mob_weapon_attack() •ÏX
- battle_calc_pc_weapon_attack() •ÏX
- clif.c
- clif_parse_UseSkillToId() •ÏX
- skill.c
- skill_get_unit_id() €–ڒljÁ
- skill_attack() ƒ`ƒƒƒ“ƒsƒIƒ“ƒRƒ“ƒ{ˆ—’ljÁ
- skill_castend_damage_id() •ÏX
- skill_castend_nodamage_id() •ÏX
- skill_castend_id() •ÏX
- skill_unitsetting() •ÏX
- skill_check_condition() •ÏX
- skill_use_id() •ÏX
-
---------------------
-//0970 by (“Ê)
-EƒhƒŒƒCƒN‚̃EƒH[ƒ^[ƒ{[ƒ‹‚ªˆÙí‚É’É‚¢(121”­H‚炤)‚Ì‚ÅLv5ˆÈã‚ÌꇂÍ25”­‚ɧŒÀ
-EƒVƒOƒiƒ€ƒNƒ‹ƒVƒX‚ÌŒvŽZŽ®‚ð14+SkillLv‚©‚ç10+SkillLv*2•ÏX
-Eƒ\[ƒX‚Ì‹C‚ªŒü‚¢‚½‚Æ‚±‚ë‚É—Ž‘‚«
-EDBŠÖŒW‚ð‚Ü‚Æ‚ß‚Ä“¯«
-
- (map/)
- battle.c ƒRƒƒ“ƒgQY(BB)¶·¶·
- skill.c skill_status_change_start()
- (db/)
- cast_db.txt
- item_db.txt
- mob_skill_db.txt
- skill_db.txt
- skill_require_db.txt
- skill_tree.txt
-
---------------------
-//0969 by ‚Ò‚´‚Ü‚ñ
-
-E”’nŽæ‚èó‘ԂŕЕû‚ªŽ€–S‚µ‚½ê‡A•Ð•û‚Ì”’nŽæ‚肪‰ðœ‚³‚ê‚È‚¢–â‘èC³
-Ebattle_athena.conf‚É€–ڒljÁ
-@ƒyƒbƒgEƒvƒŒƒCƒ„[Eƒ‚ƒ“ƒXƒ^[‚Ì–³‘®«’ÊíUŒ‚‚ð‘®«–³‚µ‚É‚·‚é‚©”Û‚©‚ðÝ’è‚Å‚«‚Ü‚·
-@Ú‚µ‚­‚Íconf_ref‚ðB
-E—ƒRƒ}ƒ“ƒh@idsearchŽÀ‘•
-@ƒ[ƒh‚µ‚½item_db‚©‚猟õŒê‹å‚Ƀ}ƒbƒ`‚·‚éƒAƒCƒeƒ€‚ÆID‚ð—…—ñ‚·‚éƒRƒ}ƒ“ƒh‚Å‚·
-@—Ⴆ‚Îu@idsearch ƒŒƒCv‚Æ“ü—Í‚µ‚½ê‡AƒuƒŒƒCƒh‚⃌ƒCƒhƒŠƒbƒNƒJ[ƒh“™‚ªˆø‚Á‚©‚©‚è‚Ü‚·
-EƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“ŽÀ‘•
-@‘•”õ”j‰ó‚Í–¢ŽÀ‘•‚Å‚·
-EƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œŽd—l‚ðŠÛ‚²‚Æ•ÏXB
- (map/)
- battle.c
- battle.h
- ‘®«•â³‚ÌC³‚âƒAƒVƒbƒhƒeƒ‰[Eƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŽZoŽ®’ljÁ“™B
- battle_config‚É€–ڒljÁ
- skill.c
- skill_idun_heal()’ljÁBforeachinarea‚ň—‚·‚é‚悤‚É•ÏX
- ƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̈—’ljÁB
- atcommand.c
- atcommand.h
- @idsearch’ljÁB
-
---------------------
-//0968 by ŒÓ’±—–
-
-EƒLƒƒƒ‰ƒNƒ^[ID‚ªŽg‚¢‚܂킳‚ê‚È‚¢‚悤‚ÉC³
-EƒLƒƒƒ‰ƒNƒ^[휎žAƒp[ƒeƒB[AƒMƒ‹ƒh‚ð’E‘Þ‚·‚é‚悤‚ÉC³
-EƒAƒJƒEƒ“ƒg휎žAƒLƒƒƒ‰ƒNƒ^[‚Æ‘qŒÉ‚ð휂·‚é‚悤‚ÉC³
-E‘qŒÉ/ƒMƒ‹ƒh‘qŒÉ휎žA‘qŒÉ“à‚̃yƒbƒg‚ð휂·‚é‚悤‚ÉC³
- E’ˆÓFƒƒOƒCƒ“‚µ‚Ä‚¢‚éƒAƒJƒEƒ“ƒg‚ð휂µ‚½ê‡‚Ì“®ì‚Í•s–¾
-
- (char/)
- char.c
- ƒpƒPƒbƒg2730‚̈—Achar_delete()’ljÁA휈—C³‚È‚Ç
- int_storage.c/int_party.c/int_guild.c/int_party.h/int_guild.h
- inter_party_leave(),inter_guild_leave()’ljÁA
- inter_storage_delete(),inter_guild_storage_delete()C³‚È‚Ç
- (login/)
- login.c
- parse_admin()‚ðƒAƒJƒEƒ“ƒg휎ž‚ɃpƒPƒbƒg2730‚ð‘—‚é‚悤‚ÉC³
-
-Eathena-start stop ‚Å’âŽ~‚³‚¹‚½ê‡Aƒf[ƒ^‚ª•Û‘¶‚³‚ê‚È‚¢–â‘è‚ðC³
- kill‚Å‘—‚éƒVƒOƒiƒ‹‚ðSIGKILL‚©‚çSIGTERM‚É•ÏXB
- ‚Ç‚¤‚µ‚Ä‚àSIGKILL‚𑗂肽‚¢ê‡‚Í athena-start kill ‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
-
- athena-start
- stopC³Akill’ljÁ
-
---------------------
-//0967 by Asong
-Eƒ‚ƒ“ƒXƒ^[‚ÌŽc‰e‚ðŽÀ‘•B
-@’Ê탂ƒ“ƒXƒ^[‚̓XƒLƒ‹‚É‚æ‚éƒtƒBƒ‹ƒ^[‚ª‚©‚©‚ç‚È‚¢‚Ì‚ÅŽc‘œ‚ªo‚Ü‚¹‚ñB
-@‚o‚bŒ^ƒ‚ƒ“ƒXƒ^[‚É‚ÍŽc‘œ‚ªo‚Ü‚·B
-Eƒ‚ƒ“ƒXƒ^[ƒXƒLƒ‹Žg—p‘ÎÛ‚ð’ljÁB
-@around5`around8‚̓^[ƒQƒbƒg‚ÌŽü•ÓƒZƒ‹‚ð‘ÎÛ‚É‚µ‚Ü‚·B
-@
-@ (map)
-@ mob.c
-@ mobskill_use() C³
-@ mob_readskill() C³
-@ mob.h C³
-@ skill.c
-@ skill_castend_pos2() C³
-
---------------------
-//0966 by (“Ê)
-EƒT[ƒo[snapshot
-EƒfƒBƒŒƒNƒgƒŠ\‘¢‚ð•ÏX(common,login,char,map‚Í/srcˆÈ‰º‚Ɉړ])
-@‚»‚ê‚É”º‚¤Makefile“™‚̃pƒX‘‚«Š·‚¦
-Enpc_turtle.txt‚ðnpc_town_alberta.txt‚É“‡
-Eƒ‚ƒ“ƒN‚̃Rƒ“ƒ{‚ÉŠÖ‚·‚éƒfƒBƒŒƒC‚ð•ÏX
-Ebattle_config.enemy_critical‚̃fƒtƒHƒ‹ƒg‚ðno‚É•ÏX
-E“]¶E“™‚𖳌ø‚É‚·‚éenable_upper_class‚̒ljÁ
-E@joblvup,@charjlvl‚ÅJobƒŒƒxƒ‹‚ªÅ‚‚Ì‚Æ‚«‚É•‰”‚ðŽw’肵‚Ä‚àƒŒƒxƒ‹‚ð‰º‚°‚ç‚ê‚È‚©‚Á‚½–â‘è‚ðC³
-
- (conf)
- battle_athena.conf C³
- (doc)
- conf_ref.txt C³
- (map)
- atcommand.c
- atcommand_joblevelup() C³
- atcommand_character_joblevel() C³
- battle.c
- battle_calc_attack() C³
- battle_config_read() C³
- battle.h C³
- pc.c
- pc_calc_skilltree() C³
- pc_calc_base_job() C³
- pc_jobchange() C³
- pc_readdb() C³
- skill.c
- skill_attack() C³
---------------------
-//0965 by ‚Ò‚´‚Ü‚ñ
-E@mapexitŽÀsŽž‘SƒZƒbƒVƒ‡ƒ“‚ðkick‚·‚é‚悤‚É•ÏXB
-E”’nŽæ‚莞‚ɕЕû‚ª“|‚ê‚Ä‚àA‚à‚¤•Ð•û‚Ì”’n‚ª‰ðœ‚³‚ê‚È‚¢–â‘èC³B(–¢ƒeƒXƒg)
-EƒXƒeƒB[ƒ‹î•ñŒöŠJ‹@”\ŽÀ‘•B(–¢ƒeƒXƒg)
-@ƒXƒeƒB[ƒ‹‚ɬŒ÷‚·‚é‚ÆA‰½‚ðƒXƒeƒB[ƒ‹‚µ‚½‚Ì‚©
-@‰æ–Ê“à‚ÌPTƒƒ“ƒo[‘Sˆõ‚É’m‚点‚é‹@”\‚Å‚·B
-@battle_athena.conf‚Ìshow_steal_in_same_party‚ÅÝ’è‚Å‚«‚Ü‚·B
-@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×AƒfƒtƒHƒ‹ƒg‚Íno‚É‚µ‚Ä‚¢‚Ü‚·B
-EƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œŒø‰ÊŽÀ‘•B
-
- (conf/)
- battle_athena.conf‚É€–ڒljÁB
- (map/)
- atcommand.c
- atcommand_mapexit() C³B
- pc.c
- pc_steal_item() C³B
- pc_show_steal() ’ljÁB
- skill.c
- skill_unitsetting()Askill_unit_onplace() C³B
- battle.c
- battle_config_read() C³B
- battle.h C³B
- (doc/)
- conf_ref.txt ”²‚¯‚Ä‚½‚Ì‚ðFX’ljÁB
-
---------------------
-//0964 by (“Ê)
-
-E‚±‚Ì‘O’ljÁ‚µ‚½skill_tree2.txt‚ð”pŽ~‚µ‚½‚Ì‚Å휂µ‚Ä‚­‚¾‚³‚¢
-Eskill_tree.txt‚̃tƒH[ƒ}ƒbƒg‚ð•ÏX•Kalen‚³‚ñ‚È‚Ç‚Ìî•ñ‚ðŒ³‚É“]¶ƒcƒŠ[‚ÌŒ©’¼‚µ
-E‚»‚ê‚É‚Æ‚à‚È‚Á‚Äpc.c‚̃tƒ@ƒCƒ‹“Ç‚Ýo‚µ•”•ª‚È‚Ç‚ð•ÏX
-EAthenaŽG’kƒXƒŒƒbƒh part3 >>14 miya‚³‚ñ‚ÌŽw“E‚ª‚ ‚é‚Ü‚Å‚·‚Á‚©‚è–Y‚ê‚Ä‚¢‚½atcommand_athena.conf‚ÌC³‚𓯫
-
- (conf/)
- atcommand_athena.conf C³
- (db/)
- skill_tree.txt C³
- skill_tree2.txt ”pŽ~
- (map/)
- map.h PC_CLASS_BASE“™’ljÁ
- pc.c
- pc_calc_skilltree() C³
- pc_allskillup() C³
- pc_readdb() C³
-
---------------------
-//0963 by (“Ê)
-
-E@jobchange2, @jobchange3”pŽ~ @jobchange‚Ɉø”’ljÁ @helpŽQÆ
- —á: @jobchange2 10 ¨ @jobchange 10 1
-E“¯—l‚É@charjob2, @charjob3”pŽ~ @charjob‚Ɉø”’ljÁ @helpŽQÆ
- —á: @charjob2 10 ‚Ù‚°‚Ù‚° ¨ @charjob 10 1 ‚Ù‚°‚Ù‚°
-E“¯—l‚ɃXƒNƒŠƒvƒg‚Ìjobchange2, jobchange3–½—ß”pŽ~ jobchange‚Ɉø”’ljÁ script_ref.txtŽQÆ
- —á: jobchange2 10; ¨ jobchange 10,1;
-Eª‚Ç‚ê‚à’ljÁ‚³‚ꂽˆø”‚ÍÈ—ª‰Â”\‚Å‚·B‚È‚Ì‚ÅA“]¶ƒm[ƒrƒX‚ÍŒ»ó‚̃XƒNƒŠƒvƒg‚Å“]¶ˆêŽŸE‚É“]E‚Å‚«‚Ü‚·B
- —á: Novice High ¨ @jobchange 10 ¨ Whitesmith
- Novice ¨ @jobchange 10 ¨ Blacksmith
-EƒXƒNƒŠƒvƒg‚©‚ç“]¶‚µ‚Ä‚¢‚é‚©”»’è‚·‚邽‚ß‚ÉUpper‚ð’ljÁ‚µ‚Ü‚µ‚½BUpper 0=’Êí, 1=“]¶, 2=—{Žq
- Upper=0‚ÌŽž‚ÉBaseLevel=99‚È‚ç“]¶‚³‚¹‚é`‚Æ‚©‚»‚¤‚¢‚¤ƒXƒNƒŠƒvƒg’N‚©‘‚¢‚Ä‚­‚¾‚³‚¢
- ‚»‚ÌŽž‚ÉŒ³‚ÌE‹Æ‚Í‹L‰¯‚µ‚Ä‚¢‚È‚¢‚̂ʼni‘±•Ï”‚Æ‚©‚ÅŠo‚¦‚³‚¹‚Ä”»’肳‚¹‚È‚¢‚Æ“]¶Œã‰½‚É‚Å‚à“]E‚Å‚«‚¿‚ႤH
-EƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒAƒ}ƒCƒ“‚ŌĂÑo‚³‚ê‚éMob‚Ì–¼‘O‚ð--ja--‚É‚µ‚Ämob_db.txt‚©‚ç“ǂނ悤‚É‚µ‚½
-
- (conf/)
- help.txt C³
- (db/)
- const.txt
- (doc/)
- help.txt C³
- script_ref.txt C³
- (map/)
- atcommand.c
- atcommand_jobchange() C³
- atcommand_jobchange2() íœ
- atcommand_jobchange3() íœ
- atcommand_character_job() C³
- atcommand_character_job2() íœ
- atcommand_character_job3() íœ
- map.h C³
- pc.c
- pc_readparam() C³
- pc_jobchange() C³
- pc.h C³
- script.c
- buildin_jobchange() C³
- buildin_jobchange2() íœ
- buildin_jobchange3() íœ
- skill.c
- skill_castend_pos2() C³
-
---------------------
-//0962 by (“Ê)
-
-EE‹Æ‚Í0`23‚ň—‚µ‚½‚¢‚Ì‚Å“]¶E—p‚̃XƒLƒ‹ƒcƒŠ[’ljÁAeAthena‚ðŽQl‚ÉŠg’£
- ‚Á‚Ä‚¢‚¤‚©ŠØ‘–{ƒT[ƒo‚Å‚ÌŽÀ‘•‚ÌŽ‘—¿‚ªŒ©“–‚½‚ç‚È‚¢‚Ì‚Å“K“–
-Esakexe.exe‚ð‰ðÍ‚µ‚Äskill_db.txt•ÏXA‚±‚ê‚àeAthena‚ðŽQl‚ÉŠg’£
- ‚ǂꂪ–{ƒT[ƒo‚ÅŽÀ‘•‚³‚ê‚Ä‚¢‚éƒXƒLƒ‹‚©•ª‚©‚è‚Ü‚¹‚ñ‚ÁII
-¦ƒXƒLƒ‹ƒcƒŠ[‚ª•\Ž¦‚³‚ꂽ‚©‚ç‚Æ‚¢‚Á‚ÄŽg‚¦‚é‚킯‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ÁII
-
- (common/)
- mmo.h ’è”C³
- (db/)
- skill_db.txt •ÏX
- skill_require_db.txt •ÏX
- skill_tree2.txt ’ljÁ
- (map/)
- skill.h ’è”C³
- pc.c
- pc_calcstatus() C³
- pc_allskillup() C³
- pc_calc_skilltree() C³
- pc_readdb() C³
-
---------------------
-//0961 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚ɃTƒuƒ‹[ƒ`ƒ“/ƒ†[ƒU[’è‹`ŠÖ”‹@”\’ljÁ
- Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚Æscript_ref.txt‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢B
- ’n–¡‚É‘å‰ü‘¢‚È‚Ì‚ÅAƒXƒNƒŠƒvƒgŠÖŒW‚ŃoƒO‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-
- (map/)
- map.h/map.c
- struct map_session_data ‚ɃXƒNƒŠƒvƒgî•ñ‘Þ”ð—p‚̃ƒ“ƒo’ljÁ
- map_quit()C³
- script.h/script.c
- FXC³(run_script(),run_func()‚ªŽå)
- npc.c
- npc_parse_function()’ljÁ‘¼
- (conf/sample)
- npc_test_func.txt
- ƒ†[ƒU[’è‹`ŠÖ”/ƒTƒuƒ‹[ƒeƒBƒ“‚̃eƒXƒgƒXƒNƒŠƒvƒg
- (doc/)
- script_ref.txt
- ƒTƒuƒ‹[ƒeƒBƒ“‚È‚Ç‚Ìà–¾’ljÁ
-
---------------------
-//0960 by (“Ê)
-E–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>62 KK‚³‚ñ‚̃Aƒ“ƒNƒ‹ƒXƒlƒAC³‚𓯫
-EƒoƒO•ñƒXƒŒƒbƒh part5 >>14-16 rb‚³‚ñ‚̃oƒOC³‚𓯫
-EFor English User Forum >>15 Mugendai‚³‚ñ‚ÌŽw“E‚Å0x1d7‚ðŽg‚¤‚Ì‚ÍVal>255‚ÉC³(0xc3‚ÌVal‚Í1ƒoƒCƒg‚¾‚©‚ç0x1d7‚ðŽg‚¤‚Ì‚©‚Æ”[“¾)
-Epc_calc_base_job()‚ð•ÏX‚µ‚ÄŒ³job‚¾‚¯‚Å‚È‚­ƒmƒr‚©ˆêŽŸE‚©“ñŽŸE(type)A’Êí‚©“]¶‚©—{Žq(upper)‚ð•Ô‚·‚悤‚É‚µ‚½
-
- (map/)
- atcommand.c
- atcommand_joblevelup() C³
- atcommand_character_joblevel() C³
- clif.c
- clif_changelook() C³
- pc.h C³
- pc.c
- pc_setrestartvalue() C³
- pc_equippoint() C³
- pc_isequip() C³
- pc_calc_skilltree() C³
- pc_calcstatus() C³
- pc_isUseitem() C³
- pc_calc_base_job() C³
- pc_allskillup() C³
- pc_damage() C³
- pc_jobchange() C³
- pc_equipitem() C³
- script.c
- buildin_changesex() C³
- skill.c
- skill_castend_nodamage_id() C³
- skill_unit_onplace() C³
-
---------------------
-//0959 by (“Ê)
-Ehelp.txt‚ªdoc‚¶‚á‚È‚­‚Äconf‚Ì‚ª“Ç‚Ýo‚³‚ê‚Ä‚½Q|P|›
-Egamejoke‚ðŽQl‚É“]¶“ñŽŸE‚̃Xƒe[ƒ^ƒX‰Ád’l‚ðjob_db2-2.txt‚É‹Lq
-EƒXƒNƒŠƒvƒg‚Éjobchange2‚Æjobchange3‚ð’ljÁ‚»‚ꂼ‚ê“]¶E‚Æ—{ŽqE‚Ö“]E‚³‚¹‚é–½—ß‚Å‚·
-
- (conf/)
- help.txt C³
- (db/)
- job_db2.txt C³
- job_db2-2.txt ’ljÁ
- (doc/)
- help.txt C³
- script_ref.txt C³
- (map/)
- pc.c
- pc_calcstatus() C³
- pc_readdb() C³
- script.c
- buildin_jobchange() C³
- buildin_jobchange2() ’ljÁ
- buildin_jobchange3() ’ljÁ
-
---------------------
-//0958 by (“Ê)
-E“]¶E•û–Ê‚ÌŽÀ‘•‚ðFX
-Ed—ʧŒÀ‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŒ³‚ÌE‹Æ‚Ì’l‚ð‚»‚Ì‚Ü‚ÜŽg‚Á‚Ä‚¢‚Ü‚·(ƒ‚ƒ“ƒNƒ`ƒƒƒ“ƒsƒIƒ““™)
-E‘•”õ•i‚à“¯ãAHP‚âSP‚̃e[ƒuƒ‹‚à“¯ã‚È‚Ì‚ÅA“]¶‚µ‚Ä‚àHP‚È‚Ç‚ª‘‚¦‚È‚¢ƒKƒbƒJƒŠŽd—l‚Å‚·
-
- (map/)
- atcommand.c
- atcommand_joblevelup() C³
- atcommand_character_joblevel() C³
- pc.c
- pc_setrestartvalue() C³
- pc_equippoint() C³
- pc_isequip() C³
- pc_calcstatus() C³
- pc_isUseitem() C³
- pc_calc_base_job() ’ljÁ
- pc_damage() C³
- pc_jobchange() C³
- pc_equipitem() C³
- pc.h C³
- script.c
- buildin_changesex() C³
- skill.c
- skill_castend_nodamage_id() C³
-
---------------------
-//0957 by (“Ê)
-E@charjob2‚Æ@charjob3‚ð’ljÁAŠÖŒW‚Æ‚µ‚Ä‚Í@charjobÌ@jobchangeA@charjob2Ì@jobchange2A(ry
-E@mapexit‚ð’ljÁAmap-server‚ð—Ž‚Æ‚·ƒRƒ}ƒ“ƒh‚Å‚·atcommand_athena.conf‚Å‚Í99Ý’è‚É‚³‚ê‚Ä‚Ü‚·‚Ì‚ÅŽg—p‚É‚Í\•ª’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-
- (map/)
- atcommand.c
- atcommand_character_job2() ’ljÁ
- atcommand_character_job3() ’ljÁ
- atcommand.h C³
- (conf/)
- atcommand_athena.conf C³
- (doc/)
- help.txt C³
-
---------------------
-//0956 by (“Ê)
-E“]¶E‰¼ŽÀ‘•(@jobchange2)AŒ©‚½–Ú‚ÆŒoŒ±’lƒe[ƒuƒ‹‚¾‚¯‚Å‚·
-E—{ŽqE‰¼ŽÀ‘•(@jobchange3)AŒ©‚½–Ú‚¾‚¯‚Å‚·Œ»ó‚Å‚ÍŒoŒ±’l‚Í“]¶“ñŽŸE‚Æ“¯‚¶‚Æ‚¢‚¤ƒ}ƒ]Žd—l
-¦ã‹L2“_‚Í“]¶E‚ªŽÀ‘•‚³‚ê‚Ä‚¢‚éƒNƒ‰ƒCƒAƒ“ƒg‚Å‚È‚¯‚ê‚ÎŽÀs‚·‚é‚ƃGƒ‰[—Ž‚¿‚·‚é‚Ì‚Å’ˆÓII
-@‚»‚̌㒼ڃZ[ƒuƒf[ƒ^‚ð˜M‚ç‚È‚¢‚ƃLƒƒƒ‰ƒZƒŒ‚É‚às‚¯‚È‚­‚È‚è‚Ü‚·II
-EAthenaŽG’kƒXƒŒƒbƒh part2 >>149 ‹HŽ}‚³‚ñ‚Ì•ñ‚ðŒ³‚ÉƒK[ƒfƒBƒAƒ“‚ðC³
-EԈȊO‚ŃK[ƒfƒBƒAƒ“‚Æ‚©ƒGƒ“ƒyƒŠƒEƒ€‚ð‰£‚é‚Æmap-server‚ª—Ž‚¿‚Ä‚¢‚½‚Ì‚àC³(–¢Šm”F)
-EƒXƒpƒmƒr‚ÌJobƒe[ƒuƒ‹‚ÍFor English User Forum >>13 kingbo‚³‚ñ‚̃f[ƒ^‚ðŒ³‚ÉC³
-E“]¶E‚ÌŒoŒ±’lƒe[ƒuƒ‹‚ÍOWN‚ðŽQÆ‚µ‚ÄBase99‚ÌŒoŒ±’l‚Í•s–¾‚¾‚Á‚½‚Ì‚Å“K“–‚ÉÝ’è
-
- (map/)
- atcommand.c
- atcommand_jobchange() C³
- atcommand_jobchange2() ’ljÁ
- atcommand_jobchange3() ’ljÁ
- atcommand.h C³
- clif.c
- clif_changelook() C³
- pc.c
- pc_nextbaseexp() C³
- pc_nextjobexp() C³
- pc_jobchange() C³
- pc_readdb() C³
- battle.c
- battle_calc_damage() C³
- mob_can_reach() C³
-
---------------------
-//0955 by huge
-Eƒyƒbƒg‚̃‹[ƒg‹@”\B
- EŽd—l‚Ímob‚̃‹[ƒg‚É‹ß‚¢Š´‚¶‚Å‚·‚ªAŽË’ö‚ð’Z‚­‚µ‚Ä‚Ü‚·B
- EE‚Á‚½ƒAƒCƒeƒ€‚ÍAƒpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚Æ°‚É—Ž‚Æ‚µ‚Ü‚·B
- E—‘‚É–ß‚µ‚½‚èAƒƒOƒIƒt‚µ‚½‚Æ‚«‚ÍPC‚̎茳‚É“ü‚é‚悤‚É‚µ‚Ü‚µ‚½B(d—Ê’´‰ß‚̓hƒƒbƒv)
- EE‚¦‚éŒÂ”‚̓‹[ƒgmob“¯—l‚Ì10ŒÂ‚Å‚·‚ªA11ŒÂ–Ú‚ÍE‚¢‚És‚«‚Ü‚¹‚ñB
- Eƒ‹[ƒgŒ ‚Ì–â‘è‚©‚çAƒAƒCƒeƒ€‚Éfirst_id‚ª“ü‚Á‚Ä‚¢‚ÄA‚»‚ꂪŽ”‚¢ŽåˆÈŠO‚¾‚Á‚½‚çA‰½•bŒo‚Æ‚¤‚ÆE‚¢‚Ü‚¹‚ñB(–¢Šm”F)
- E‚»‚ê‚ÆA‰×•¨Ž‚¿‚É‚³‚ê‚é‚Ɖˆ£‘z‚È‚Ì‚ÅAd—ʧŒÀ‚à‚‚¯‚Ü‚µ‚½B‚±‚ê‚Íconf‚ÅÝ’è‰Â”\‚Å‚·B
-Eatcommand‚ÅA@where‚ª‚¤‚Ü‚­“­‚¢‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³(‚Ü‚½ƒEƒ`‚¾‚¯‚©‚È‚Ÿ¥¥¥j
-E@memo‚Åmemo‚·‚鎞‚ÍAmapflag‚𖳎‹‚·‚é‚悤‚ÉB
-EƒXƒtƒBƒAƒ}ƒCƒ“‚Ì–¼‘O‚¾‚¯C³B
-
- (conf/)
- battle_athena.conf
- pet_lootitem,pet_weight ’ljÁ
- (doc/)
- conf_ref.txt C³
- (map/)
- atcommand.c
- atcommand_memo() C³
- atcommand_where() C³
- battle.c
- battle_config_read() C³
- battle.h C³
- map.c
- map_quit() C³
- map.h
- pet_data{} C³
- pc.c
- pc_memo() C³
- pet.c
- pet_performance() C³
- pet_return_egg() C³
- pet_data_init() C³
- pet_ai_sub_hard() C³
- pet_lootitem_drop() ’ljÁ
- pet_delay_item_drop2() ’ljÁ
- pet_ai_sub_hard_lootsearch() ’ljÁ
- pet.h C³
- skill.c
- skill_castend_pos2() C³
-
---------------------
-//0954 by (“Ê)
-Eobject_del.bat‚ÅŠeserver.exe‚à휂·‚é‚悤‚É‚µ‚½
-EFor English User Forum >>11 kingbo‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
-EƒoƒO•ñƒXƒŒƒbƒh part5 >>10 Sin‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
-E‚‚¢‚Å‚ÉŒ©‚©‚¯‚½atcommand_character_joblevel‚Ì•s‹ï‡‚ðC³
-E@ƒRƒ}ƒ“ƒh‚ŃWƒ‡ƒuƒŒƒxƒ‹‚ðã‚°‚é‚Æ‚«‚ɃXƒpƒmƒr‚ÍJob70‚܂őΉž(–¢Šm”F)
-
- (/)
- object_del.bat C³
- (map/)
- atcommand.c
- atcommand_joblevelup() C³
- atcommand_character_joblevel() C³
- atcommand_character_baselevel() C³
-
- code by kingbo 2004/4/29 PM 06:15
- base on 0953
- now i sure it works well
- (map/)
- mob.c
- mob_can_reach() fix
-
---------------------
-//0953 by (“Ê)
-Emob_skill_db.txt‚ÌðŒ’l‚É0ˆÈŠO“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ð’ù³
-Egcc 2.95‚ŃRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É’ù³(by ƒoƒOƒXƒŒpart5 >>2 ˆ©‚³‚ñ)
-Eª‚âLinux‚È‚Ç‚ðl—¶‚µ‚Ästart‚âMakefile‚Ȃǂ̉üs‚ðLF‚É•ÏX
-E0952‚Åo‚½ƒRƒ“ƒpƒCƒ‹Œx‚ðo‚È‚¢‚悤‚ÉC³
-E0952‚ÅXV‚³‚ê‚È‚©‚Á‚½conf_ref.txt‚ðC³
-
- (/)
- start ‰üsƒR[ƒh•ÏX
- athena-start ‰üsƒR[ƒh•ÏX
- (db/)
- mob_skill_db.txt C³
- (doc/)
- conf_ref.txt C³
- (login/)
- Makefile ‰üsƒR[ƒh•ÏX
- (map/)
- Makefile ‰üsƒR[ƒh•ÏX
- atcommand.c
- atcommand() 錾ˆÊ’uC³
- atcommand_where() 錾ˆÊ’uC³
- battle.c
- battle_calc_pet_weapon_attack() C³
- battle_calc_mob_weapon_attack() C³
- battle_calc_pc_weapon_attack() C³
- battle_calc_magic_attack() C³
- clif.c
- clif_skill_fail() 錾ˆÊ’uC³
- guild.c
- guild_gvg_eliminate_timer() 錾ˆÊ’uC³
- mob.c
- mob_damage() 錾ˆÊ’uC³
- script.c
- buildin_deletearray() 錾ˆÊ’uC³
- buildin_getequipcardcnt() 錾ˆÊ’uC³
- buildin_successremovecards() 錾ˆÊ’uC³
-
---------------------
-//0952 by CG
-Econf‚ÅDEF‚ÆMDEF‚ÌŒvŽZ•û–@‚ð‘I‘ð‚Å‚«‚é‚悤‚ÉB
-
- (conf/)
- battle_athena.conf •ÏX
- (map/)
- battle.c
- battle_calc_pet_weapon_attack() C³
- battle_calc_mob_weapon_attack() C³
- battle_calc_pc_weapon_attack() C³
- battle_calc_magic_attack() C³
- battle.h C³
-
---------------------
-//0951 by (“Ê)
-EƒT[ƒo[snapshot
-EƒoƒO•ñƒXƒŒƒbƒh part4 >>95 KAJIKEN‚³‚ñ‚ÌC³‚𓯫
-E“¯ >>138 ƒoƒO‚©‚ÈH‚³‚ñ‚ÌC³‚𓯫
-EAthenaŽG’kƒXƒŒƒbƒh part2 >>112 –¼–³‚µ‚³‚ñ‚ÌPVPƒiƒCƒgƒƒAƒ‚[ƒh‚̃Aƒ“ƒ_[ƒNƒƒXƒ}ƒbƒvƒ[ƒvƒ|ƒCƒ“ƒg‚𓯫
-E“¯ >>96 ‹HŽ}‚³‚ñ‚Ìnpc_gldcheck.txt‚𓯫
-EƒXƒiƒbƒvƒVƒ‡ƒbƒg‚Ésave/‚ð“ü‚ê‚é‚Ì‚ð‚â‚ß‚Ü‚µ‚½B–³‚¢ê‡‚Íathena-start‚ªì‚Á‚Ä‚­‚ê‚Ü‚·
-Eathena-start‚Ålog/‚ª–³‚¢ê‡‚Éì‚é‚悤‚É•ÏX
-E‚»‚Ì‘¼H
-
- (/)
- athena-start •ÏX
- (db/)
- mob_db.txt •ÏX
- (conf/)
- map_athena.conf •ÏX
- (conf/extension/)
- npc_gldcheck.txt ’ljÁ
- (conf/npc/)
- npc_event_ice.txt •ÏX
- npc_job_alchemist.txt •ÏX
- npc_event_valentine.txt •ÏX
- npc_town_geffen.txt •ÏX
- npc_event_whiteday.txt •ÏX
- npc_event_potion.txt •ÏX
- npc_town_comodo.txt •ÏX
- (conf/warp/)
- npc_warp_pvp.txt ’ljÁ
-
---------------------
-//0950 by (“Ê)
-Emob_db‚ÌModeƒtƒ‰ƒO‚Ɉȉº‚Ì•¨‚ð’ljÁ
- 0x40(64) ƒ_ƒ[ƒW‚ð1‚ɌŒè(‘‚âƒNƒŠƒXƒ^ƒ‹‚È‚Ç)
- 0x80(128) UŒ‚‚ðŽó‚¯‚½‚Æ‚«‚É”½Œ‚‚ð‚·‚é
-Eã‹L‚Ì•ÏX‚Ì‚½‚ßmob_db.txt‚Ù‚Ú‘S•”•ÏXAmob_db2.txt‚ðì‚Á‚Ä‚¢‚él‚Í
- ‘‚È‚Ç1ƒ_ƒŒÅ’è‚É‚ÍMode‚É64‚ð‘«‚³‚È‚¢‚Æ•’ʂɃ_ƒ[ƒW
- ‚»‚Ì‘¼Mob‚ÍMode‚É128‚ð‘«‚³‚È‚¢‚Æ”½Œ‚‚µ‚Ä‚±‚È‚­‚È‚é‚Ì‚Å’ˆÓ
-
- (db/)
- mob_db.txt C³
- (map/)
- battle.c
- battle_calc_pet_weapon_attack()
- battle_calc_mob_weapon_attack()
- battle_calc_pc_weapon_attack()
- battle_calc_magic_attack()
- mob.c
- mob_once_spawn()
- mob_attack()
- mob_target()
- mob_ai_sub_hard()
-
---------------------
-//0949 by ‚Ò‚´‚Ü‚ñ
-
-EƒXƒe[ƒ^ƒXˆÙí‘Ï«‘S–ÊC³B
-@‘Ï«ŽZoŽ®‘S–ÊC³B
-@ƒXƒe[ƒ^ƒXˆÙí‘Ï«100%‚̃Lƒƒƒ‰ƒNƒ^[‚É‚Íó‘ÔˆÙí‚ðs‚í‚È‚¢‚悤‚ÉC³B
-EƒfƒBƒXƒyƒ‹‚ÌŽd—l•ÏXB
-@‰ðœ‚µ‚½‚çƒVƒXƒeƒ€ã–â‘è‚Ì‚ ‚éƒXƒe[ƒ^ƒX•Ï‰»ˆÈŠO•Ð‚Á’[‚©‚ç‰ðœ‚·‚é‚悤‚ÉC³B
-EƒtƒƒXƒgƒ_ƒCƒo[‚ÌŽd—l•ÏXB
-@“€Œ‹—¦C³(ƒ}ƒWƒXƒŒƒeƒ“ƒvƒŒ€‹’)B
-EƒŠƒJƒoƒŠ[‚ÌŽd—l•ÏXB
-@ƒmƒ“ƒAƒNƒeƒBƒuƒ‚ƒ“ƒXƒ^[‚ÉŽg—p‚·‚é‚ƃ^[ƒQƒbƒg‚ªƒŠƒZƒbƒg‚³‚ê‚é‚悤‚ÉC³B
-EƒNƒ@ƒOƒ}ƒCƒA‚ÌŽd—l‚ªƒAƒŒ‚¾‚Á‚½‚Ì‚ÅC³B
-@‰‰‘t‚â‘®«ê‚Æ“¯—l‚Érange‚ň—‚·‚é‚悤‚ÉC³B
-@DEX/AGI”¼Œ¸‚̉e‹¿‚ª‰r¥ˆÈŠO‚É‚à‹y‚Ô—l‚ÉC³B
-EƒXƒLƒ‹ƒ^[ƒQƒbƒg’†‚ÉŽ€‚ñ‚¾U‚è‚ðŽg—p‚µ‚Ä‚àƒXƒLƒ‹‚ª‰ñ”ð‚Å‚«‚È‚¢–â‘èC³B
-E”’nŽæ‚肪“®ì‚µ‚È‚¢–â‘èC³(cast_db‚ª”²‚¯‚Ä‚Ü‚µ‚½)B
- (map/)
- pc.c
- pc_calcstatus()C³
- skill.c
- skill_additional_effect()Askill_attack() C³
- skill_status_change_start()Askill_unitsetting() C³
- (db/)
- cast_db.txt C³B
-
---------------------
-//0948 by ŒÓ’±—–
-
-Ewarpwaitingpc‚ª³‚µ‚­PC‚ð“]‘—‚Å‚«‚È‚¢–â‘è‚ðC³
-EƒXƒNƒŠƒvƒg‚Ì“Ç‚Ýž‚ÝŽž‚ɃGƒ‰[‚Ü‚½‚ÍŒx‚ªo‚éê‡AŒx‰¹‚ð–‚炷‚悤‚ÉB
- i—¬‚ꂽƒƒO‚ðŒ©‚È‚¢l‘Îô‚Å‚·j
-
- (map/)
- script.c
- buildin_warpwaitingpc()C³
- disp_error_message()C³
-
-Eatcommand.cC³
- Eatcommand_athena.conf‚Ìmapmove‚ð“ǂނ悤‚É
- E@str‚È‚Ç‚ÌÈ—ªŽž‚Ì•K{ƒŒƒxƒ‹‚ð0‚ÉB
- E@param‚ÍŽg‚í‚È‚¢‚̂ŃRƒƒ“ƒg‰»
-
- (map/)
- atcommand.c
- ŠY“–ŒÂŠC³
-
-Emob‚ªÅ‘å15•b‚قLjړ®‚µ‚È‚¢ê‡‚ª‚ ‚é–â‘èC³
- EŽè”²‚«‚Å‚È‚¢mobˆ—‚ÅAˆÚ“®‚µ‚È‚¢ŽžŠÔ‚ª7•bˆÈ㑱‚©‚È‚¢‚悤‚ÉC³
-
- (map/)
- mob.c
- mob_ai_sub_hard()C³
-
-E‰õ‘¬‘Dˆõ‚̈ɓ¤`s‚«‚Ì”»•ÊŽ®C³ (by ID:F8nKKuY)
- (conf/npc/)
- npc_town_comodo.txt
-
---------------------
-//0947 by (“Ê)
-EŽæ‚芪‚«‚ÍŽæ‚芪‚«‚𢊫‚µ‚È‚¢‚悤‚ÉC³
-E˜I“V‚̔̔„‰¿Ši‚ÌãŒÀ‚ðbattle_athena.conf‚ÅÝ’è‚Å‚«‚é‚悤‚ÉC³
-
- (conf/)
- battle_athena.conf
- vending_max_value’ljÁ
- (doc/)
- conf_ref.txt C³
- (map/)
- skill.c
- skill_castend_nodamage_id() C³
- battle.c
- battle_config_read() C³
- battle.h C³B
- vending.c
- vending_openvending() C³B
-
---------------------
-//0946 by Kalen
-Eƒvƒ–kWarpŒ©’¼‚µ
-ŽQlF–{ŽI(1F,2F)‚ç‚®‚Ȃ̉½‚©(3F)
- (conf/warp/)
- npc_warp.txt
-
-EŒê‚è•”‚Ì2T3T’ljÁ(‚Ç‚¤‚¹Œ©‚È‚¢‚ÆŽv‚¢‚Ü‚·‚ªc)
- (conf/npc/)
- npc_event_kataribe.txt
-
---------------------
-//0945 by ŒÓ’±—–
-
-ENPCƒ^ƒCƒ}[ƒ‰ƒxƒ‹ƒf[ƒ^‚ª³‚µ‚­ƒCƒ“ƒ|[ƒg‚³‚ê‚È‚¢–â‘è‚ðC³
-ENPCƒ^ƒCƒ}[‰Šú’l‚âƒ^ƒCƒ}[ID‚ª³‚µ‚­‰Šú‰»‚³‚ê‚È‚¢–â‘è‚ðC³
-ENPC‚Ìduplicate‚ðs‚¤‚ƃAƒNƒZƒXˆá”½‚ª‹N‚±‚éꇂª‚ ‚é–â‘è‚ðC³
-
- (map/)
- npc.c
- npc_parse_scriptC³
-
-Eƒpƒbƒ`ƒAƒbƒvƒXƒŒ‚S‚Ì87‚Ìpc.c‚Ƃ肱‚Ý
- (map/)
- pc.c
- ƒJ[ƒhd—ʧŒÀ‚ðŒ³‚É–ß‚µ‚½‚à‚Ì
-
---------------------
-//0944 by huge
-EƒMƒ‹ƒh‚Ìã”[ŒoŒ±’l‚ÌãŒÀ‚ðAconf‚ŧŒÀ‚Å‚«‚é‚悤‚ÉB
-E˜I“X‚̔̔„‰¿Ši‚ð10M‚܂łɧŒÀB
-EƒJ[ƒg‚Ìd—ʧŒÀ‚ªˆêŒ…‰º‚ª‚Á‚Ä‚½‚ñ‚Å‚·‚ªAƒEƒ`‚¾‚¯‚Å‚·‚©HC³‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªB
-
- (conf/)
- battle_athena.conf
- guild_exp_limit’ljÁ
- (doc/)
- conf_ref.txt C³
- (map/)
- atcommand.c
- ‘h¶Žž‚ÌSP‰ñ•œ‚ÅAׂ©‚¢C³B
- battle.c
- battle_config_read() C³
- battle.h C³B
- guild.c
- guild_change_position() C³B
- pc.c
- pc_calcstatus() C³B
- vending.c
- vending_openvending() C³B
-
---------------------
-//0943 by (“Ê)
-Ebattle_athena.conf‚Ådead_branch_active‚ðyes‚É‚·‚é‚ƌÖ؂̎}‚Å¢Š«‚³‚ê‚郂ƒ“ƒXƒ^[‚ªƒAƒNƒeƒBƒu‚É‚È‚é‚悤‚É•ÏX
-E”÷–­‚É•ÏX‚µ‚½client_packet.txt‚𓯫
-
- (conf/)
- battle_athena.conf
- dead_branch_active’ljÁ
- (doc/)
- client_packet.txt C³
- conf_ref.txt C³
- (map/)
- battle.c
- battle_config_read() C³
- battle.h C³
- map.h C³
- mob.c
- mob_once_spawn() C³
- mob_attack() C³
- mob_target() C³
- mob_ai_sub_hard_lootsearch() C³
- mob_ai_sub_hard() C³
-
-E‰pŒêƒXƒŒ‚Ìkingbo‚³‚ñ‚Ì•ÏX‚𓯫
- code by kingbo 2004/4/16 PM 09:47
-
- support guildcastle guardian
- maybe still have problems..need to try
- Good Luck Q^^Q
- P.S: sorry my poor english ^^a
-
- (map/)
- mob.c
- mob_can_reach() fix
- battle.c
- battle_calc_damage() fix
-
- (conf/gvg/)
- prtg_cas01_guardian.txt
-
---------------------
-//0942 by ŒÓ’±—–
-
-EƒAƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‚Å•s³‚ȃƒ‚ƒŠ‚ɃAƒNƒZƒX‚·‚éꇂª‚ ‚éƒoƒO‚ðC³
- (login/)
- login.c
- check_ipmask()C³
-
-EƒXƒNƒŠƒvƒgƒŠƒtƒ@ƒŒƒ“ƒX­‚µ’ljÁ‚ÆC³
- (doc/)
- script_ref.txt
- C³
-
---------------------
-//0941 by (“Ê)
-
-Ee2‚³‚ñ‚Ì•ñ‚ðŒ³‚É¢Š«‚³‚ꂽŽè‰º‚̃Xƒs[ƒh‚𢊫Žå‚Æ“¯‚¶‚É‚µ‚Ä‚Ý‚é
-
- (map/)
- battle.c
- battle_get_speed() C³
- mob.c
- mob_spawn() C³
- mob_summonslave() C³
-
---------------------
-//0940 by End_of_exam
-
-Eƒq[ƒ‹‚âƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ðŽg—p‚µ‚Ä‚à‰ñ•œ‚µ‚È‚¢ƒoƒO‚ðC³(0938`)B
-
-@Thanks for Pepermint, reporting the bug that using PotionPitcher with
-@BluePotion was no effective.
-@iƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[{‚o‚ÅŒø‰Ê‚ª‚È‚¢Ž–‚ð•ñ‚µ‚Ä‚­‚ꂽPepermintŽ‚ÉŠ´ŽÓj
-
- (map/)
- battle.c
- battle_heal() C³
-
---------------------
-//0939 by (“Ê)
-EcutinƒpƒPƒbƒg‚ð0x145(ƒtƒ@ƒCƒ‹–¼16•¶Žš)‚©‚ç0x1b3(64•¶Žš)‚É•ÏX
-E‚‚¢‚Å‚ÉŽG’kƒXƒŒ‚Éã‚°‚½athena-start‚𓯫
-
- (/)
- athena-start saveƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚Éì‚é‚悤‚É
- (map/)
- clif.c
- clif_cutin() –{ŽIƒpƒPƒbƒg€‹’‚É•ÏX
- (doc/)
- client_packet.txt C³
-
---------------------
-//0938 by ‚Ò‚´‚Ü‚ñ
-
-Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚Ń|‚ð“Š‚°‚Ä‚àƒGƒtƒFƒNƒg‚¾‚¯‚¾‚Á‚½ƒoƒOC³B
-E˜I“XŠJÝ‚ª“Á’è‚̃AƒCƒeƒ€”z’u‚ÅŽ¸”s‚·‚éƒoƒOC³B
-EƒXƒNƒŠƒvƒgŠÖ”getareadropitemŽÀ‘•B
-@Žw’èƒGƒŠƒA“à‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðƒJƒEƒ“ƒg‚·‚éŠÖ”‚Å‚·
-
-@‘Ž®Fgetareadropitem <mapname>,<x0>,<y0>,<x1>,<y1>,<item>;
-@@mapnameF‘ÎÛƒ}ƒbƒv–¼(—áFprontera.gat)
-@@x0‚Æx1F‘ÎÛXÀ•W”͈Í
-@@y0‚Æy1F‘ÎÛYÀ•W”͈Í
-@@itemFƒJƒEƒ“ƒg‚·‚é‘ÎÛƒAƒCƒeƒ€
-
-@–ß‚è’lFmapname“àÀ•W(x0,y0)-(x1,y1)‚͈͓̔à‚É—Ž‚¿‚Ä‚¢‚éitem‚Ì‘ŒÂ”
-@@@@@Žæ“¾Ž¸”sŽž‚É‚Í-1‚ð•Ô‚µ‚Ü‚·B
-@Eitem‚Ì’l‚ÍID‚Å‚àƒAƒCƒeƒ€–¼("Red_Jemstone"‚Æ‚©)‚Å‚à‚¢‚¢‚Å‚·B
-
- (map/)
- battle.c
- battle_heal() C³B
- vending.c
- vending_openvending() C³B
- script.c
- ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾C³B
- struct buildin_func[] C³B
- buildin_getareadropitem()Abuildin_getareadropitem_sub() ’ljÁB
-
---------------------
-//0937 by netwarrior
-
-- Fix Japanese remarks problem in 0936
-- Fix minor problem in battle_heal()
-
---------------------
-//0936 by Pepermint
-
-Retouch about problem of increase in quantity at the CART,
-when enter the an minus quantity in the CLIENT.
-
-Retouch about problem of not recovery,use POTIONPITCHER skill.
-
- (map/)
- battle.c
- battle_heal()
-
- vending.c
- vending_purchasereq()
-
---------------------
-//0935 by ŒÓ’±—–
-
-E“à—e‚Ì“¯‚¶ƒXƒNƒŠƒvƒgNPC‚ð‰½“x‚à‹Lq‚µ‚È‚­‚Ä‚àŒ¾‚¢‚悤‚ÉC³
- ENPC’è‹`‚Ì"script"‚Æ‘‚­•”•ª‚ð"duplicate(NPC–¼)"‚Æ‚·‚é‚ÆA
- ŠY“–‚ÌNPC‚ƃXƒNƒŠƒvƒg‚ð‹¤—L‚·‚é‚悤‚ÉBNPC–¼‚Í•\Ž¦–¼‚Å‚Í‚È‚­
- ƒGƒNƒXƒ|[ƒg‚³‚ê‚é–¼‘O‚ðŽw’肵‚Ü‚·B
- <—á>
-prontera.gat,165,195,1 duplicate(ƒJƒvƒ‰Eˆõ) ƒJƒvƒ‰Eˆõ2 112
-
- E‹¤—LŒ³‚ÌNPC‚Í“¯‚¶ƒ}ƒbƒvƒT[ƒo[‚É‘¶Ý‚·‚é•K—v‚ª‚ ‚邽‚ßA
- “¯‚¶ƒ}ƒbƒv‚Å‚È‚¢ê‡‚Íduplicate‚·‚ׂ«‚Å‚Í‚È‚¢B
- ‚½‚¾‚µANPC‚̈ʒu‚ð"-"‚É‚·‚邱‚Æ‚ÅAƒ}ƒbƒvã‚É‚Í‘¶Ý‚µ‚È‚¢‚ªA
- ƒ}ƒbƒvƒT[ƒo[“à‚É‚Í‘¶Ý‚·‚éNPC‚ð쬂ł«‚é‚Ì‚ÅA
- ‚»‚ÌNPC‚ð‹¤—LŒ³‚É‚·‚é‚Ì‚Å‚ ‚ê‚΂ǂ̃}ƒbƒv‚Ö‚à‹¤—L‚Å‚«‚éB
- <—á>
-
-- script ƒeƒXƒg::test1 112,{ // ‚±‚ÌNPCƒOƒ‰ƒtƒBƒbƒNID‚ÍŽg—p‚µ‚È‚¢
-// (—ª)
-}
-prontera.gat,165,195,1 duplicate(test1) ƒeƒXƒg2 112
-geffen.gat,99,99,1 duplicate(test1) ƒeƒXƒg3 112
-
- Eã‚̃}ƒbƒv‚É‘¶Ý‚µ‚È‚¢NPC‚̓Cƒxƒ“ƒg‚É‚à‚·‚邱‚Æ‚ª‚Å‚«‚éB
- i‚ǂ̃}ƒbƒvƒT[ƒo[‚©‚ç‚Å‚à•K‚¸ŒÄ‚Ño‚¹‚éƒCƒxƒ“ƒg‚É‚È‚éj
-
- (map/)
- map.h
- struct npc_label_list’ljÁ,struct npc_dataC³
- npc.c
- npc_parse_script()C³
- •s—v‚É‚È‚Á‚½ƒ‰ƒxƒ‹ƒf[ƒ^ƒx[ƒXŠÖ˜A‚ÌŠÖ”‚ðíœ
-
---------------------
-//0934 by ‚Ò‚´‚Ü‚ñ
-
-EMOB‚Ìó‘ÔˆÙí‘Ï«‚ª‚₽‚ç‚‚©‚Á‚½‚Ì‚ðC³B
-E‘¬“xŒ¸­‚ÌŽd—l•ÏX(¬Œ÷—¦ŒvŽZŽ®•ÏXEŽ¸”sŽž‚ɂ̓GƒtƒFƒNƒg–³‚µ)B
-E‰½Žž‚ÌŠÔ‚É‚©ó‘ÔˆÙí‚ÌŒp‚¬‘«‚µ‹ÖŽ~‚ªƒRƒƒ“ƒgƒAƒEƒg‚³‚ê‚Ä‚¢‚½‚Ì‚Å–ß‚µB
-Eƒ|ƒCƒYƒ“ƒŠƒAƒNƒg‚̃AƒCƒRƒ“•\Ž¦‚ª–³‚­‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³(‚Å‚ào‚邾‚¯c)
-E”’nŽæ‚èŽÀ‘•B
-
- (map/)
- battle.c
- battle_weapon_attack() C³B
- clif.c
- clif_parse_WalkToXY()Aclif_parse_ActionRequest() C³B
- clif_parse_TakeItem()Aclif_parse_UseItem() C³B
- clif_parse_DropItem()Aclif_parse_EquipItem() C³B
- clif_parse_UnequipItem() C³B
- mob.c
- mob_can_move()Amob_attack()Amob_ai_sub_hard() C³B
- mobskill_use_id()Amobskill_use_pos() C³B
- mobskill_castend_id()Amobskill_castend_pos() C³B
- pc.c
- pc_attack_timer()Apc_setpos() C³B
- skill.c
- SkillStatusChangeTable[] C³B
- skill_additional_effect()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_check_condition() C³B
- skill_status_change_start()Askill_status_change_end() C³B
- skill_use_id() C³B
- skill.h C³B
- (db/)
- cast_db.txt C³B
-
---------------------
-//0933 by ŒÓ’±—–
-
-EƒEƒBƒU[ƒh“]EŠNPC‰¼ŽÀ‘•
- Eeathena‚̃f[ƒ^‚Ì–|–óA‚¨‚æ‚Ñ–^Š‚Ì̂̃f[ƒ^‚ðŒ³‚Éì‚Á‚½‚Ì‚Å
- ŠàŽI‚Æ‚Í”÷–­‚ɈقȂÁ‚Ä‚é‚ÆŽv‚¢‚Ü‚·B
- uŒÃ‚¢Šª•¨v‚Æ‚©Žg‚¦‚Ü‚¹‚ñ‚µB
- EŒ»s‚Ìjob_2nd.txt‚ƈê‚É“Ç‚Ýž‚Þ‚ÆANPC‚ªd‚È‚é‚Ì‚ÅA
- job_2nd.txt‚ÌŠY“–ƒXƒNƒŠƒvƒg‚ðƒRƒƒ“ƒg‰»‚µ‚Ä‚­‚¾‚³‚¢B
- ‚½‚¾‚µA‚»‚Ìꇂ̓Z[ƒW‚É“]E‚³‚¹‚Ä‚à‚炦‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-
- (conf/npc/)
- npc_job_wizard.txt
- ’ljÁ
- (conf/warp/)
- npc_warp_job.txt
- ƒEƒBƒU[ƒh“]EŠ‚̃[ƒv‚ðƒRƒƒ“ƒg‰»
-
-EƒoƒOC³
- Egoto‚âmenu‚щƒxƒ‹‚ªŒ©‚‚©‚ç‚È‚¢‚Æ‚«ƒXƒNƒŠƒvƒg‚ÌŽÀs‚ð’†’f‚·‚é‚悤‚É.
- E‚P‰ñ‚̃XƒNƒŠƒvƒg‚ÌŽÀs‚É‚¨‚¢‚ÄAŽÀs–½—ß”‚ª–ñ8000‚ð’´‚¦‚é‚©A
- goto‚âmenu‚ÌŽÀs‰ñ”‚ª–ñ500‰ñ‚ð’´‚¦‚é‚ÆŽÀs‚ð’†’f‚·‚é‚悤‚ÉB
- EŠÖ”/–½—ߎÀsŽž‚É‚àƒGƒ‰[ƒ`ƒFƒbƒN‚ð“ü‚ꂽ
- EƒMƒ‹ƒh/ƒp[ƒeƒB/ƒyƒbƒg‚Ì–¼‘O‚É“ú–{Œê‚ªŽg‚¦‚È‚¢–â‘èC³
-
-
- (char/)
- int_guild.c/int_party.c
- –¼‘O–â‘èC³
- (map/)
- pet.c
- –¼‘O–â‘èC³
- script.c
- C³
-
---------------------
-//0932 by End_of_exam
-
-E0930‚ŃMƒ‹ƒh‘qŒÉ‚Ì’†g‚ªÁ‚¦‚éƒoƒO‚ðC³B
-
- (char/)
- int_storage.c guild_storage_tostr() C³B
-
---------------------
-//0931 by (“Ê)
-EƒT[ƒo[snapshot
-EAthenaDBŒv‰æ‚©‚çXV‚Ì‚ ‚Á‚½•¨‚𔽉f
-Eatcommand_athena.conf‚Éstr“™‚ð’ljÁ
-Eƒ[ƒvƒ|[ƒ^ƒ‹‚Ì–{ŽI‘Šˆá“_‚ðC³
-E–¶‚³‚ñ‚Ìaldeg_cas03`05‚𓯫
-Ep‚³‚ñ‚Ìnpc_event_kataribe.txt“¯«
-EKAJIKEN‚³‚ñ‚Ìnpc_warp_louyang.txt“¯«
-
- (db/)
- item_db.txt •ÏX
- (conf/)
- atcommand_athena.conf •ÏX
- map_athena.conf •ÏX
- (conf/gvg/)
- aldeg_cas03.txt •ÏX
- aldeg_cas04.txt •ÏX
- aldeg_cas05.txt •ÏX
- (conf/mob/)
- npc_monster.txt •ÏX
- (conf/npc/)
- npc_event_kataribe.txt ’ljÁ
- (conf/warp/)
- npc_warp_louyang.txt ’ljÁ
- (map/)
- pc.c pc_memo() •ÏX
-
---------------------
-//0930 by ŒÓ’±—–
-
- Šù‘¶‚Ì char/ ‚É‚ ‚élock.c‚Ælock.h‚Í휂µ‚Ä‚­‚¾‚³‚¢B
- ‚±‚ê‚ç‚Í common/ ‚Ɉړ®‚³‚ê‚Ü‚·B
-
-EƒXƒNƒŠƒvƒg’ljÁC³
- Esetarrayi”z—ñ‚ÖƒŠƒXƒg‘ã“üj’ljÁ
- Ecleararrayi”z—ñ‚ðŽw’è’l‚ŃNƒŠƒAj’ljÁ
- Ecopyarrayi”z—ñ‚ðƒRƒs[j’ljÁ
- Egetarraysizei”z—ñ‚Ì—LŒø‚È—v‘f”‚ð‹‚ß‚éj’ljÁ
- Edeletearrayi”z—ñ‚Ì—v‘f‚ð휂µ‚Â߂éj’ljÁ
- EwarpwaitingpcFl”‚âƒAƒJƒEƒ“ƒgID‚ðƒ}ƒbƒv•Ï”‚ɃZƒbƒg‚·‚é‚悤‚ÉC³
-
- (map/)
- script.c
- FX
- (doc/)
- script_ref.txt
- –½—ߒljÁ‚È‚Ç
- (npc/sample/)
- npc_test_array.txt
- ”z—ñŒnƒeƒXƒg—pNPCƒXƒNƒŠƒvƒg
-
-EƒoƒOC³‚È‚Ç
- EƒLƒƒƒ‰ƒNƒ^[–¼/ƒAƒJƒEƒ“ƒg–¼/ƒp[ƒeƒB–¼/ƒMƒ‹ƒh–¼/ƒyƒbƒg–¼‚É
- ƒRƒ“ƒgƒ[ƒ‹ƒR[ƒh‚ðŽg‚¦‚È‚¢‚悤‚ÉC³B
- Echar.c‚È‚Ç‚Ì•Û‘¶‚ÌŒø—¦‚ðX‚ɃAƒbƒvB
- E‘qŒÉƒtƒ@ƒCƒ‹/ƒMƒ‹ƒh‘qŒÉƒtƒ@ƒCƒ‹‚É‹ós‚ªŽc‚ç‚È‚¢‚悤‚ÉC³
- Elock.*‚ðcommon/‚Ɉړ®Aƒtƒ@ƒCƒ‹‚ª•Û‘¶‚Å‚«‚È‚­‚È‚éƒoƒOC³A
- ƒAƒJƒEƒ“ƒg‚ƃ}ƒbƒv•Ï”‚Ì•Û‘¶‚É‚àlock_fopen‚ðŽg‚¤‚悤‚ÉB
-
- (common/)
- lock.c/lock.h
- ƒtƒHƒ‹ƒ_ˆÚ“®Alock_fopenC³
- (login/)
- login.c
- mmo_auth_new()C³
- (char/)
- char.c
- mmo_char_tostr(),make_new_char()C³
- int_storage.c
- storage_tostr(),guild_storage_tostr(),
- inter_storage_save_sub(),inter_guild_storage_save_sub()C³
- int_party.c
- int_guild.c
- –¼‘O–â‘èC³
- (map/)
- pet.c
- –¼‘O–â‘èC³
-
---------------------
-//0929 by ‚Ò‚´‚Ü‚ñ
-
-Eƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[Š®‘SŽÀ‘•B
-Eƒvƒƒ{ƒbƒN‚̃XƒLƒ‹Žd—l•ÏX(‰r¥–WŠQE“€Œ‹AΉ»A‡–°‰ðœ)B
-EƒŠƒJƒoƒŠ[‚̃XƒLƒ‹Žd—l•ÏX(ƒAƒ“ƒfƒbƒh‚ÉŽg—p‚·‚é‚ƈê’èŠm—¦‚ňÈŌø‰Ê)B
-Eó‘ÔˆÙí’†‚Å‚à‘•”õ‚ÌØ‚è‘Ö‚¦‚ªo—ˆ‚é‚悤‚É•ÏXB
-EƒAƒCƒeƒ€Ž©“®Žæ“¾’†‚É@killmonster‚ðŽg—p‚·‚é‚Æ—Ž‚¿‚éƒoƒOC³B
-EŒÓ’±—–‚³‚ñ‚ªã‚°‚Ä‚¢‚½npc.c‚𓯫‚µ‚Ü‚µ‚½B
-Eskill_db‚Å‹C‚É‚È‚Á‚Ä‚½‚Æ‚±‚ð‚¿‚å‚±‚Á‚ÆC³B
-
- (map/)
- clif.c
- clif_parse_EquipItem() C³B
- skill.c
- skill_castend_nodamage_id() C³B
- skill_unitsetting()Askill_unit_onplace() C³B
- skill_landprotector() ’ljÁB
- mob.c
- mob_delay_item_drop()Amob_delay_item_drop2() C³B
- npc.c C³
-
- (db/)
- skill_db.txt C³B
-
---------------------
-//0928 by End_of_exam
-
-EƒLƒƒƒ‰‚â‘qŒÉ“àƒAƒCƒeƒ€‚ªÁ‚¦‚é–â‘è‚ÉŽb’è‘ΈiƒLƒƒƒ‰ŽI‚̉ü—ÇjB
-
-@1.ƒLƒƒƒ‰ƒf[ƒ^E‘qŒÉƒf[ƒ^‚̃f[ƒ^•ÏŠ·ˆ—‚ð‰ü—ÇB
-@@(char/char.c , char/int_storage.c)
-
-@2.ƒtƒ@ƒCƒ‹‘‚«o‚µ‚ªI‚í‚é‚Ü‚ÅA‹Œƒtƒ@ƒCƒ‹‚ðŽc‚·‚悤‚ÉC³B
-@ichar/lock.c, char/lock.h ‚̒ljÁBƒƒCƒNƒtƒ@ƒCƒ‹‚ÌC³B
-@@char/int_storage.c,int_guild.c,int_party.c,int_pet.c,char.c,inter.c
-@@“à‚É‚ ‚éAƒf[ƒ^‘‚«o‚µˆ—‚ð•ÏXBj
-
---------------------
-//0927 by ‚Ò‚´‚Ü‚ñ
-
-E•ŠíUŒ‚ˆÈŠO‚ÉŽí‘°•â³‚ª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
-E‰‰‘t’†‚ÉŠyŠíE•ÚˆÈŠO‚Ì•Ší‚ÉŽ‚¿•Ï‚¦‚é‚Ɖ‰‘t‚ªŽ~‚Ü‚é—l‚ÉC³B
-E‰‰‘t‚ÌŒø‰Ê‚ª‰‰‘tŽÒŽ©g‚É‚Í‚©‚©‚ç‚È‚¢‚悤‚ÉC³B
-EƒAƒCƒeƒ€Ž©“®Žæ“¾‹@”\ŽÀ‘•
-@“G‚ð“|‚µ‚½Žž‚ÉAƒAƒCƒeƒ€‚ªƒhƒƒbƒv‚³‚ê‚é‚Ì‚Å‚Í‚È‚­A‚»‚Ì“G‚Ɉê”Ô‘½‚­‚̃_ƒ[ƒW‚ð
-@—^‚¦‚½l(ƒ‹[ƒgŒ 1ˆÊ‚Ìl)‚ɃhƒƒbƒvƒAƒCƒeƒ€‚ªŽ©“®‚Å—^‚¦‚ç‚ê‚é‹@”\‚Å‚·B
-@battle_athena.conf‚Ìitem_auto_get‚ÅÝ’è‚Å‚«‚Ü‚·B
-@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×Abattle_athena.conf‚ł̃fƒtƒHƒ‹ƒg‚Å‚Íno‚É‚µ‚Ä‚¢‚Ü‚·B
-E‘®«ê(ƒfƒŠƒ…[ƒWEƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹Eƒ{ƒ‹ƒP[ƒmEƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[)‰¼ŽÀ‘•
-@ˆê•”‚Ì‹@”\‚ª–¢ŽÀ‘•‚Å‚·
-@@ƒfƒŠƒ…[ƒWF…ê‚ð—p‚¢‚½ƒEƒH[ƒ^[ƒ{[ƒ‹
-@@ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹Fƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚ÌŽ‘±ŽžŠÔ•â³
-@@ƒ{ƒ‹ƒP[ƒmFƒAƒCƒXƒEƒH[ƒ‹‹ÖŽ~
-@@ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[FƒIƒuƒWƒFƒNƒgÝ’uŒnƒXƒLƒ‹‹ÖŽ~(‚‚܂èo‚邾‚¯‚ÌLP‚Å‚·)
-
- (map/)
- battle.c
- battle_calc_damage()Abattle_calc_magic_attack() C³B
- battle_calc_misc_attack()Abattle_config_read() C³B
- mob.c
- mob_delay_item_drop()Amob_delay_item_drop2() C³B
- pc.c
- pc_calcstatus()Apc_equipitem() C³B
- skill.c
- ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾C³B
- SkillStatusChangeTable[] C³B
- skill_castend_nodamage_id()Askill_castend_pos2() C³B
- skill_unitsetting()Askill_unit_onplace() C³B
- skill_unit_onout()Askill_unit_ondelete() C³B
- skill_status_change_start()Askill_status_change_end() C³B
- skill_clear_element_field() ’ljÁB
- battle.h C³B
- skill.h C³B
- (conf/)
- battle_athena.conf
- item_auto_get€–Ú‚ð’ljÁB
- (db/)
- cast_db.txt C³B
-
---------------------
-//0926 by ŒÓ’±—–
-
-EƒMƒ‹ƒhé‚̉Šú‰»•û–@•ÏX
- E‘S‚ẴMƒ‹ƒhéi{è‹’ƒMƒ‹ƒhî•ñj‚ðŠ“¾‚µ‚½‚Æ‚«‚ÉOnAgitInit‚ª
- ‚æ‚΂ê‚é‚悤‚ÉBGetCastleData‚âRequestGuildInfo‚Ì•K—v‚ª‚È‚­‚È‚è‚Ü‚·B
- ]‚Á‚ÄAŒ»Ý‚ÌgvgƒXƒNƒŠƒvƒg‚ÌOnInterIfInit‚âOnRecvCastleXXX‚Í
- •K—v‚È‚­‚È‚è‚Ü‚·Bi‚¨‚»‚ç‚­Œ»s‚̃XƒNƒŠƒvƒg‚à“®ì‚͉”\‚Å‚·j
- ‰Šú‰»‚ª•K—v‚ÈNPC‚Í•Ï‚í‚è‚ÉOnAgitInit‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
- ‚È‚¨A•s—v‚É‚È‚Á‚½–½—ß‚È‚Ç‚ð휂·‚é—\’è‚Í‚ ‚è‚Ü‚¹‚ñB
-
- (char/)
- inter.c/inter.h/char.c/int_guild.c/int_guild.h
- ƒ}ƒbƒvƒT[ƒo[Ú‘±Žž‚Ɉ—‚ðs‚¦‚é‚悤‚ÉC³
- Ú‘±Žž‚ɃMƒ‹ƒhéƒf[ƒ^‚ð‘—M‚·‚é‚悤‚É
- (map/)
- intif.c/guild.c/guild.h
- Ú‘±Žž‚̃Mƒ‹ƒhéƒf[ƒ^ˆêŠ‡ŽóMˆ—•ƒMƒ‹ƒhî•ñ—v‹A
- OnAgitInit‚̌ĂÑo‚µ‚È‚Ç
- chrif.c
- ‹ŒOnAgitInit‚̌ĂÑo‚µíœ
- (doc/)
- inter_server_packet.txt
- ƒMƒ‹ƒhéƒf[ƒ^ˆêŠ‡‘—MƒpƒPƒbƒg0x3842’ljÁ
-
-EƒXƒNƒŠƒvƒg‚ÉNPCŽå‘̃Cƒxƒ“ƒgŽÀs–½—ߒljÁ
- Edonpcevent(NPCŽå‘̃Cƒxƒ“ƒgŽÀs)’ljÁ
- ‚±‚¿‚ç‚Ídoevent‚ƈႢƒuƒ[ƒhƒLƒƒƒXƒg‰Â”\‚Å‚·BÚׂÍscript_refB
- Eisloggedin‚̃Rƒ“ƒpƒCƒ‹Œx‚ª‚Å‚È‚¢‚悤‚ÉC³
- (map/)
- script.c
- buildin_donpcevent()’ljÁ‚È‚Ç
- (doc/)
- script_ref.txt
- doevent,donpcevent,OnAgitInit’ljÁ‚È‚Ç
-
-E‚»‚Ì‘¼C³
- (map/)
- clif.c
- clif_parse_GMReqNoChat()’ljÁ
-
-
---------------------
-//0925 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚̃oƒOC³
- Emonster,areamonster‚Ì–â‘èC³
- ‚±‚ê‚ç‚Íscript_rid2sd‚ðŽg—p‚µ‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
- sd‚ªNULL‚Ì‚Æ‚«AƒŒƒxƒ‹ƒ`ƒFƒbƒN‚ðs‚í‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
-
- (map/)
- script.c/mob.c
- buildin_monster(),buildin_areamonster(),mob_once_spawn()‘¼
-
-EƒXƒNƒŠƒvƒg‚Ì‹@”\’ljÁ
- Edetachrid–½—ßiƒvƒŒƒCƒ„[‚̃fƒ^ƒbƒ`j’ljÁ
- EisloggedinŠÖ”iƒvƒŒƒCƒ„[‚̃ƒOƒCƒ“ƒ`ƒFƒbƒNj’ljÁ
- Egetitem,getitem2–½—ß,countitem,checkweightŠÖ”‚Å
- nameid‚ɃAƒCƒeƒ€‚Ì–¼‘O‚ðŽw’è‰Â”\‚ÉB
- (item_db‚ȂǂɈˑ¶‚·‚邽‚ßAŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAˆê‰ž)
-
- (map/)
- script.c
- FX
- (doc/)
- script_ref.txt
- •ÏX•”•ª‚ƃGƒ‰[à–¾C³
-
-Eathena-start‚Æstart‚ðC³
- Eathena-start stop‚ŃvƒƒZƒX‚ªI—¹‚·‚é‚܂ő҂‚悤‚É
- Estart‚ÅÄ‹N“®‚³‚¹‚é‚Æ‚«athena-start restart‚ðŒÄ‚Ԃ悤‚ÉB
-
---------------------
-//0924 by (“Ê)
-
-EƒoƒO•ñƒXƒŒƒbƒh part4 >>66‚Ìnpc‚ðŽæ‚èž‚Ý
-E“¯ >>51‚Ìguild.c‚𔽉f
-E“¯ >>38‚Ìatcommand_athena.conf‚Ö‚Ì•ÏX‚ðŽæ‚èž‚Ý
-E‚È‚º‚©npcƒtƒHƒ‹ƒ_‚É‚ ‚Á‚Ämap_athena.conf‚È‚¢ƒtƒ@ƒCƒ‹‚ðˆê——‚ɒljÁB‚‚¢‚łɃMƒ‹ƒhƒtƒ‰ƒbƒO‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
-Econf/npc/npc_job_1st.txt npc_script2.txt npc_shop3.txt‚̓XƒiƒbƒvƒVƒ‡ƒbƒg‚©‚ç휂µ‚Ä‚­‚¾‚³‚¢
-
- (map/)
- guild.c C³
- (conf/)
- map_athena.conf C³
- atcommand_athena.conf C³
- (conf/npc/)
- npc_event_hat.txt C³
- npc_event_oni.txt C³
- npc_job_1st.txt íœ
- npc_script2.txt íœ
- npc_shop3.txt íœ
-
---------------------
-//0923 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚̃oƒOC³
-Escript_rid2sd‚ªŽ¸”s‚µ‚Ä‚àƒT[ƒo[‚ðI—¹‚µ‚È‚¢‚悤‚É•ÏX
- Emonster,areamonster‚È‚Ç‚ªŽÀs‚Å‚«‚È‚¢–â‘èC³
-
- (map/)
- script.c/mob.c
- buildin_monster()‚È‚ÇC³
-
- (doc/)
- script_ref.txt
- ƒ‰ƒxƒ‹‚ƃGƒ‰[‚Ìà–¾C³
-
---------------------
-//0922 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒgƒGƒ‰[‚Ìs”Ô†‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚É
-
- (map/)
- itemdb.c / npc.c
- itemdb_readdb(),npc_parse_script()C³
-
-EƒLƒƒƒ‰ƒNƒ^[î•ñ‚ɃAƒNƒZƒX‚Å‚«‚È‚¢ó‘ԂŃAƒNƒZƒX‚·‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉC³
-Egoto/menu‚щƒxƒ‹‚ªŽw’肳‚ê‚éꊂɃ‰ƒxƒ‹ˆÈŠO‚ªŽw’肳‚ê‚é‚ÆŒx‚ðo‚·‚悤‚É
-Escript_ref‚ɃGƒ‰[ƒƒbƒZ[ƒW‚Ìà–¾’ljÁ
-EƒCƒxƒ“ƒg‹N“®‚³‚ꂽƒXƒNƒŠƒvƒg‚ŃLƒƒƒ‰ƒNƒ^[‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éŠÖ”’ljÁ
- EattachridiŽw’肵‚½ID‚Ìî•ñ‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éj’ljÁ
- Egetcharidi3‚ŃAƒJƒEƒ“ƒgID‚ðŠ“¾‚Å‚«‚é‚悤‚ÉjC³
- (map/)
- script.c
- script_rid2sd(),buildin_attachrid()’ljÁ
- ‘½XC³B
- (doc/)
- script_ref.txt
- ƒGƒ‰[ƒƒbƒZ[ƒW‚Ìà–¾’ljÁA•Ï”/ƒ‰ƒxƒ‹‚Ìà–¾C³
- ‘¼C³
-
---------------------
-//0921 by RR
-EƒXƒNƒŠƒvƒgƒoƒOC³(‚²–À˜f‚ð‚¨‚©‚¯‚µ‚Ü‚µ‚½)
- (conf/npc/)
- npc_event_tougijou.txt
-
-Esteal—¦C³(Ž©DEX - “GDEX + SLv*3 +10‚Ì•”•ª‚ňê“x”»’è‚ð‚µ‚Ä‚¢‚½‚Ì‚Å)
-E0918‚Å0914ˆÈ‘O‚ÉŠª‚«–ß‚Á‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½•”•ª‚ðŒ³‚É–ß‚µ‚½
- (map/)
- pc.c
- pc_steal_item() C³
- itemdb.c
- pet.c
- skill.c C³
-
---------------------
-//0920 by Ž‚Žqo^.^o
-E Steal—¦ = Drop—¦ * (Ž©DEX - “GDEX + SLv*3 +10) /100
- (map/)
- pc.c
- int pc_steal_item()C³
-
---------------------
-//0919 by RR
-Eatcommand‚Ìlvup‚ðŽg‚¤‚Ǝ擾ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‚¨‚©‚µ‚¢–â‘è‚ÌC³
-EƒoƒOC³(ƒoƒO•ñƒXƒŒ‚ÅC³‚Ìo‚½‚à‚Ì‚ÌŽæ‚èž‚Ý@ŒÓ’±—–‚³‚ñAp‚³‚ñA‹¤‚É‚¨”æ‚ê—l‚Å‚·)
- (map/)
- atcommand.c
- atcommand_baselevelup()C³
- guild.c
- guild_gvg_eliminate_timer()C³
- pc.c
- pc_setreg(),pc_setregstr()C³
- (login/)
- login.c
- parse_login()C³
---------------------
-//0918 by ¹
-Eitem_dbŽ©‘Ì‚ªƒI[ƒo[ƒ‰ƒCƒh‰Â”\‚É‚È‚Á‚½‚Ì‚ÅAclass_equip_db.txt‚Ì”pŽ~B
-Epet_db.txtAproduce_db.txt‚àƒI[ƒo[ƒ‰ƒCƒh‰Â”\‚ÉC³B
- (map/)
- itemdb.c
- do_init_itemdb() C³B
- pet.c
- read_petdb() C³B
- skill.c
- skill_readdb() C³B
-
---------------------
-//0917 by RR
-EƒXƒNƒŠƒvƒgC³
- “‘¾˜YƒCƒxƒ“ƒg‚Æ“¬‹ZêƒCƒxƒ“ƒg‚ðNPCƒ^ƒCƒ}[‚É•ÏX
- (conf/npc/)
- npc_event_momotarou.txt
- npc_event_tougijou.txt C³
-EƒXƒLƒ‹ƒcƒŠ[C³(ƒoƒO•ñƒXƒŒ25‚æ‚è)
- (db/)
- skill_db.txt C³
-
---------------------
-//0916 by (“Ê)
-Enpc_monster‚Énpc_mob_job‚ð“‡Bnpc_mob_job.txt‚Í휂µ‚Ä‚©‚Ü‚¢‚Ü‚¹‚ñ
-
- (conf/)
- map_athena.conf npc_mob_job‚ðíœ
- (conf/mob/)
- npc_monster.txt XV
-
---------------------
-//0915 by ŒÓ’±—–
-
-ENPCƒ^ƒCƒ}[ŠÖŒW‚Ì–½—ߒljÁ•C³‘¼
- EdelwaitingroomiNPCƒ`ƒƒƒbƒgI—¹jˆø”‚ðŒ©‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³
- EinitnpctimeriNPCƒ^ƒCƒ}[‰Šú‰»j’ljÁ
- EstopnpctimeriNPCƒ^ƒCƒ}[’âŽ~j’ljÁ
- EstartnpctimeriNPCƒ^ƒCƒ}[ŠJŽnj’ljÁ
- EgetnpctimeriNPCƒ^ƒCƒ}[î•ñŠ“¾j’ljÁ
- EsetnpctimeriNPCƒ^ƒCƒ}[’lÝ’èj’ljÁ
-
- Šù‘¶‚Ìaddtimer‚Ȃǂ̓vƒŒƒCƒ„[’PˆÊ‚Ì‚½‚ßANPC’PˆÊ‚̃^ƒCƒ}[‚ðì‚è‚Ü‚µ‚½B
- ‚±‚¿‚ç‚ÍAaddtimer‚ȂǂƂ͈ႢAOnTimerXXX‚Æ‚¢‚¤•—‚Ƀ‰ƒxƒ‹‚ðŽw’肵‚Ü‚·B
- Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚Æscrit_ref.txt‚ðŽQÆB
-
- (map/)
- map.h
- struct npc_data C³Astruct npc_timerevent_list’ljÁ
- npc.c / npc.h
- npc_timerevent(),npc_timerevent_start(),npc_timerevent_stop(),
- npc_gettimerevent_tick(),npc_settimerevent_tick()’ljÁ
- npc_parse_script()C³
- script.c
- buildin_*npctimer()’ljÁ‚È‚Ç
- (conf/sample/)
- npc_test_npctimer.txt
- NPCƒ^ƒCƒ}[Žg—pƒTƒ“ƒvƒ‹
- (doc/)
- script_ref.txt
- NPCƒ^ƒCƒ}[ŠÖŒW‚Ì–½—ß/ŠÖ”’ljÁA’蔃‰ƒxƒ‹‚Ìà–¾C³
-
-ESage‚̃A[ƒXƒXƒpƒCƒN‚ÌŠ“¾ðŒC³
- (db/)
- skill_tree.txt
- ƒA[ƒXƒXƒpƒCƒN‚ÌsiƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“‚ðLv1‚Éj
-
---------------------
-//0914 by p
-E”͈̓XƒLƒ‹Žg—pŽž‚ɉð•úς݃ƒ‚ƒŠ‚ðŽQÆ‚µ‚Ä‚¢‚½–â‘è‚ɑΉž
-Eƒƒ‚ƒŠ‚ð‰Šú‰»‚¹‚¸‚ÉŽg—p‚µ‚Ä‚¢‚½—̈æ‚ðA‰Šú‰»‚µ‚Ä‚©‚çŽg—p‚·‚é‚悤‚É•ÏX
- (common/)
- db.c
- grfio.c
- socket.c
- timer.c
- (char/)
- char.c
- int_guild.c
- int_party.c
- int_pet.c
- int_storage.c
- inter.c
- (login/)
- login.c
- (map/)
- ‚Ù‚Æ‚ñ‚Ç.c
-
---------------------
-//0913 by Kalen
-
-EGVGScript‚ÌC³
-@911‘Ήž
-@ƒtƒ‰ƒO‚©‚çƒAƒWƒg‚Ö–ß‚é‹@”\’ljÁ
-@–ß‚é‚Æ‚«‚É•·‚©‚ê‚é‚悤‚ÉC³(TESTscript)
-@Ԏ擾Žž::OnRecvCastleXXX‚ð”­“®‚·‚é‚悤‚ÉC³
- (conf/gvg/)
- ‚Ù‚Æ‚ñ‚Ç.txt
-
---------------------
-//0912 by (“Ê)
-E‚±‚̃tƒ@ƒCƒ‹‚Ì•¶Žš‰»‚¯‚ÆTEST_prtg_cas01_AbraiJ‚Ì•¶Žš‰»‚¯‚ðC³
-EƒoƒO•ñƒXƒŒ‚Ì>>19-20‚ðŽæ‚èž‚Ý
-EÌ‚â‚Á‚¿‚Ü‚Á‚½battle_athena.conf‚̌뎚‚Ì’ù³
-
- (common)
- mmo.h
- #define MAX_STAR 3‚ÉC³
- (conf)
- battle_athena.conf
- (conf/gvg/)
- TEST_prtg_cas01_AbraiJ.txt
- (map)
- atcommand.c
- get_atcommandinfo_byname() C³
-
-
---------------------
-//0911 by Michael_Huang
-
- Mounting Emblem of the Flag-NPC.
- (Added Script Command: FlagEmblem).
-
-(conf/gvg/)
- TEST_prtg_cas01_AbraiJ.txt (FlagEmblem Test)
-
- (map/)
- map.h struct npc_data{}
- clif.c clif_npc0078()
- script.c buildin_flagemblem()
-
---------------------
-//0910 by RR
-EƒXƒNƒŠƒvƒg‚̊ԈႢ‚ðC³
-(conf/gvg/)
- ev_agit_payg.txt
- ev_agit_gefg.txt
-
-E‚ЂÈÕ‚è‚Ɉê“x“ü‚Á‚½‚çƒ}ƒbƒv•Ï”‚ªŽc‚Á‚½‚Ü‚Ü‚É‚È‚é‚Ì‚ÅAƒ}ƒbƒv•Ï”‚ðŽg‚í‚È‚¢‚悤•ÏX
-(ˆêŽž“Iƒ}ƒbƒv•Ï”‚É‚·‚ê‚Ζâ‘è‚È‚¢‚Æ‚àŒ¾‚¦‚Ü‚·‚ªA
-town_guide‚Ætown_kafra‚ÉŽžŠúŒÀ’è‚Ì•¨‚ªí’“‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ª‹C‚É‚È‚Á‚½‚Ì‚ÅA
-‚»‚ê‚ç‚ðevent_hinamatsuri‚ÖˆÚ“®‚µA•’i‚Ì‚ðdisable‚µ‚Ä‚¢‚Ü‚·)
- (conf/npc/)
- npc_event_hinamatsuri
- npc_town_guide
- npc_town_kafra
-
-EƒXƒLƒ‹ƒŠƒZƒbƒgŽž‚̃XƒLƒ‹Žæ“¾§ŒÀ”»’è‚ðƒXƒLƒ‹ƒ|ƒCƒ“ƒg48ˆÈãÁ”ï‚©‚çA
- ƒXƒLƒ‹ƒ|ƒCƒ“ƒg58ˆÈãÁ”ï‚©Žc‚èƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ªJOBLEVEL‚æ‚謂³‚­‚È‚Á‚½‚Æ‚«‚É•ÏX
-E@modelŽž‚Ì•žFõF§ŒÀ‚ðŠÉ˜a(’jƒAƒTAƒ[ƒO‚Ì‚Ý‚Ö)
- (map/)
- pc.c pc_calc_skilltree()
- atcommand.c atcommand_model()
-
-
---------------------
-//0909 by ŒÓ’±—–
-
-ENPCƒ`ƒƒƒbƒgŠÖŒW‚Ì–½—ߒljÁ
- EwaitingroomiNPCƒ`ƒƒƒbƒgì¬jC³iƒCƒxƒ“ƒg‚ð‹N‚±‚·l”‚ðŽw’è‰Â”\j
- EdelwaitingroomiNPCƒ`ƒƒƒbƒgI—¹j’ljÁ
- EenablewaitingroomeventiNPCƒ`ƒƒƒbƒgƒCƒxƒ“ƒg—LŒø‰»j’ljÁ
- EdisablewaitingroomeventiNPCƒ`ƒƒƒbƒgƒCƒxƒ“ƒg–³Œø‰»j’ljÁ
- EgetwaitingroomstateiNPCƒ`ƒƒƒbƒgó‘ÔŠ“¾j’ljÁ
- EwarpwaitingpciNPCƒ`ƒƒƒbƒgƒƒ“ƒo[ƒ[ƒvjC³
- Ú‚µ‚­‚Íscript_ref.txt‚ðŽQÆ
-
- (map/)
- script.c/npc.c/npc.h/chat.c/chat.h/clif.c
- ‘½XC³
- (doc/)
- script_ref.txt
- C³
- (conf/sample/)
- npc_test_chat.txt
- ’ljÁ–½—߂̃eƒXƒgƒXƒNƒŠƒvƒg
-
-EƒXƒNƒŠƒvƒg‚̊ԈႢ‚ðC³
- (conf/npc/)
- npc_event_skillget.txt
- npc_event_yuno.txt
- npc_town_lutie.txt
- npc_turtle.txt
- “ä–½—ßadditem‚ðgetitem‚É’uŠ·
- npc_town_guide.txt
- “ä–½—ßscriptlabel‚ðƒRƒƒ“ƒg‰»
- npc_event_momotaro.txt
- npc_job_swordman.txt
- npc_job_magician.txt
- ';'•t‚¯–Y‚êC³
- (conf/gvg/)
- ev_agit_aldeg.txt
- @GID4‚ð@GIDa4‚É’uŠ·
- ev_agit_gefg.txt
- ev_agit_payg.txt
- Annouce‚ÉFŽw’è‚Æ';'‚Ì•t‚¯–Y‚ê‚ðK«
-
-
-EAthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚ÝA‚»‚Ì‘¼C³
- ˆÀ’肵‚Ä‚¢‚éƒf[ƒ^‚©‚Ç‚¤‚©‚í‚©‚è‚Ü‚¹‚ñ‚ªB
-
- (db/)
- item_db.txt/mob_db.txt/mob_skill_db.txt
- AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
- mob_skill_db.txt.orig
- ˆÈ‘O‚̃f[ƒ^iƒRƒƒ“ƒg•”•ª‚È‚Ç‚ÌŽQl‚Éj
- (conf/)
- water_height.txt/mapflag.txt
- AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
- map_athena.conf
- npc_monster3*.txt‚ðíœ
- ’ljÁƒ}ƒbƒvƒf[ƒ^ (by ID:UVsq5AE)
- (conf/mob/)
- npc_monster.txt
- AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
-
---------------------
-//0908 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚̃Gƒ‰[ƒ`ƒFƒbƒNˆ—‚ð‘‚₵‚½
- E•¶Žš—ñ‚Ì“r’†‚ʼnüs‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
- EŠÖ”ŒÄ‚Ño‚µ‰‰ŽZŽq'('‚Ì’¼‘O‚ÉŠÖ”–¼ˆÈŠO‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
- E–½—ß‚ª‚ ‚é‚ׂ«‚Æ‚±‚ë‚ÉŠÖ”–¼ˆÈŠO‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
- E–½—ß‚¨‚æ‚ÑŠÖ”‚̈ø”‹æØ‚è‚Ì','‚ðÈ—ª‚·‚é‚ÆŒx‚ðo‚·‚悤‚ÉB
- E–½—ß‚¨‚æ‚ÑŠÖ”‚̈ø”‚Ì”‚ªˆÙ‚È‚é‚ÆŒx‚ðo‚·‚悤‚ÉB
-
- (map/)
- script.c
- FXC³
-
-ENPCƒXƒNƒŠƒvƒgC³
- (conf/npc/)
- npc_town_guide.txt
- ‚Ss–Ú‚Í‚¢‚ç‚È‚¢‚悤‚Ȃ̂ŃGƒ‰[‚ªo‚È‚¢‚悤‚ɃRƒƒ“ƒg‰»
- npc_event_hat.txt
- ƒRƒ‚ƒh‚̉¼–ÊEl‚ƃtƒFƒCƒˆƒ“‚Ì”N (by ID:dS8kRnc)
- (conf/sample/)
- npc_card_remover.txt
- @menu‚ðŽg‚Á‚Ä’Z‚­‚µ‚½••¶Í­‚µC³
-
-E‚»‚Ì‘¼
- (db/)
- skill_tree.txt
- Sage‰ž‹}Žè“–
-
---------------------
-//0907 by p
-Eatcommand() ‚Ì”ì‘剻‚ª‚Ђǂ¢‚̂ŃŠƒtƒ@ƒNƒ^ƒŠƒ“ƒO
- @ ƒRƒ}ƒ“ƒh‚ð’ljÁ‚·‚éꇂÍAatcommand.h “à‚Œ蔂ðAatcommand.c “à‚Å
- ŠÖ”’è‹`ƒ}ƒNƒ‚ƃ}ƒbƒsƒ“ƒOƒe[ƒuƒ‹Aˆ——p‚ÌŠÖ”‚ð‹Lq‚µ‚Ä‚­‚¾‚³‚¢B
-Eglobal •Ï”‚Ì atcommand_config ‚ðÁ‹ŽB
- @ ƒRƒ}ƒ“ƒh–ˆ‚̃Œƒxƒ‹‚Í get_atcommand_level() ‚Ŏ擾‚µ‚Ä‚­‚¾‚³‚¢B
-Eˆê•”‚̃Lƒƒƒ‰–¼‚ðŽæ‚é @ ƒRƒ}ƒ“ƒh‚ÅA”¼ŠpƒXƒy[ƒX‚ðŠÜ‚Þ–¼‘O‚̃Lƒƒƒ‰‚ð
- ³í‚Ɉ—‚Å‚«‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ðC³B
- ‚±‚̉e‹¿‚É‚æ‚èA@rura+ ‚È‚ÇAƒLƒƒƒ‰–¼‚ªƒpƒ‰ƒ[ƒ^‚Ì“r’†‚É‚ ‚Á‚½‚à‚Ì‚Í
- ‘S‚ÄÅŒã‚ɉñ‚³‚ê‚Ä‚¢‚Ü‚·B
-E@ ƒRƒ}ƒ“ƒh‚Ì•¶Žš—ñ‚ð³í‚Ɏ擾‚Å‚«‚È‚©‚Á‚½ê‡‚ÉAƒoƒbƒtƒ@‚Ì“à—e‚ð
- ƒ`ƒFƒbƒN‚¹‚¸‚Ɉ—‚ðs‚¨‚¤‚Æ‚µ‚Ä‚¢‚½•”•ª‚ðC³‚µ‚Ü‚µ‚½B
-
- (common/)
- mmo.h
- (map/)
- atcommand.h
- atcommand.c
- clif.h
- clif.c
-
---------------------
-//0906 by Selena
-EŒÓ’±—–‚³‚ñ‚ÌC³‚É‚ ‚킹‚ÄAƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚PˆÈŠO‚̃XƒNƒŠƒvƒg‚ÌC³B
-E@ƒRƒ}ƒ“ƒh“ü—̓~ƒX‚ÌۂɃGƒ‰[ƒƒbƒZ[ƒW‚ð•\Ž¦B
- (conf/gvg/)
- ev_agit_aldeg.txt
- ev_agit_gefg.txt
- ev_agit_payg.txt
- ev_agit_prtg.txt
- aldeg_cas01`05.txt
- gefg_cas01`05.txt
- payg_cas01`05.txt
- prtg_cas02`05.txt
- (map/)
- atcommand.c
-
---------------------
-//0905 by ŠÇ—l
-
-EƒT[ƒo[snapshot
-E‘OƒXƒŒ‚̃tƒ@ƒCƒ‹Žæ‚è–Y‚ꂽl‚ª‚¢‚é‚©‚à‚µ‚ê‚È‚¢‚Ì‚Å
-
---------------------
-//0904 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒgˆ—C³
- Echar/interƒT[ƒo[‚ÉÚ‘±‚µ‚½Žž‚ÉOnCharIfInit/OnInterIfInitƒCƒxƒ“ƒg‚ª
- ŒÄ‚΂ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- OnAgitInit‚ÍOnInterIfInit‚É•ÏX‚·‚ׂ«‚Å‚·B
- Egetcastledata–½—ß‚Å‘æ‚Qƒpƒ‰ƒ[ƒ^‚ª0‚Ì‚Æ‚«A‘æ‚Rƒpƒ‰ƒ[ƒ^‚É
- ƒCƒxƒ“ƒg–¼‚ðÝ’è‚Å‚«‚Ü‚·B‚±‚̃Cƒxƒ“ƒg‚̓Mƒ‹ƒhé‚̃f[ƒ^‚ð
- InterƒT[ƒo[‚©‚犓¾Š®—¹‚µ‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
- E‹N‚±‚·NPCƒCƒxƒ“ƒg–¼‚ð"::"‚ÅŽn‚ß‚é‚ÆA“¯–¼ƒ‰ƒxƒ‹‚ðŽ‚‘SNPC‚̃Cƒxƒ“ƒg
- ‚ðŽÀs‚Å‚«‚Ü‚·B
- ‚½‚Æ‚¦‚ÎAgetcastledata "prtg_cas01.gat",0,"::OnRecvCastleP01";
- ‚Æ‚·‚é‚Æ‘S‚Ä‚ÌNPC‚Ì OnRecvCastleP01ƒ‰ƒxƒ‹‚ªŽÀs‚³‚ê‚Ü‚·B
- Erequestguildinfo–½—ߒljÁB“Á’èƒMƒ‹ƒh‚Ìî•ñ‚ðInterƒT[ƒo[‚É
- —v‹‚Å‚«‚Ü‚·B‘æ‚Pƒpƒ‰ƒ[ƒ^‚̓Mƒ‹ƒhIDA‘æ‚Qƒpƒ‰ƒ[ƒ^‚̓Cƒxƒ“ƒg–¼‚Å
- ‚±‚̃Cƒxƒ“ƒg‚̓Mƒ‹ƒhî•ñ‚ðInterƒT[ƒo[‚©‚犓¾Š®—¹‚µ‚½‚Æ‚«‚É
- ŽÀs‚³‚ê‚Ü‚·B
-
- (map/)
- guild.c/guild.h/npc.c/npc.h/script.c/intif.c/chrif.c
- FXC³
-
-EƒMƒ‹ƒhéŠÖ˜ANPCC³
- iƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚P‚Ì‚ÝC³B‘¼‚Ìé‚̃XƒNƒŠƒvƒg‚ÍŠeŽ©‚ŘM‚Á‚Ä‚­‚¾‚³‚¢B
- ‚Æ‚¢‚¤‚©A‚Þ‚µ‚ë˜M‚Á‚½‚ç‚ ‚Á‚Õ‚µ‚Ü‚µ‚傤j
- E‰Šú‰»ˆ—‚ðOnAgitInit‚Å‚È‚­OnInterIfInit‚É•ÏXB
- Eéƒf[ƒ^Š“¾Š®—¹ˆ—‚Æ‚µ‚ÄOnRecvCastleP01‚ð’ljÁB
- EŽIÄ‹N“®ŽžAƒMƒ‹ƒhê‘®ƒJƒvƒ‰‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚ÉB
- EƒMƒ‹ƒhê‘®ƒJƒvƒ‰‚Ì–¼‘O‚ð"ƒJƒvƒ‰Eˆõ::kapra_prtg01"‚É•ÏXB
- i"::"ˆÈ~‚̓GƒNƒXƒ|[ƒg‚³‚ê‚é–¼‘O‚ÅA"::"ˆÈ‘O‚ª•\Ž¦–¼j
- "ƒJƒvƒ‰Eˆõ#prt"‚æ‚è–¼‘O‚ð’·‚­‚µ‚Ä‹£‡‚µ‚É‚­‚­‚·‚邽‚ß‚Å‚·B
- ‚±‚ÌŠÖŒW‚ÅAdisablenpc‚Ȃǂ̃pƒ‰ƒ[ƒ^‚ð"kapra_prtg01"‚ÉC³B
- (conf/gvg/)
- prtg_cas01.txt
- ƒMƒ‹ƒhê‘®ƒJƒvƒ‰C³
- ev_agit_prtg.txt
- ‰Šú‰»ˆ—C³iƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚P‚Ì‚Ýj
- TEST_prtg_cas01_AbraiJ.txt
- ƒMƒ‹ƒhê‘®ƒJƒvƒ‰ŒÙ—p/é”jŠüC³
-
-ENPC‚ÌC³
- (conf/npc/)
- npc_job_swordman.txt
- npc_event_hat.txt
- C³
-
-EƒAƒJƒEƒ“ƒg‚ð휂µ‚Ä‚àƒAƒJƒEƒ“ƒgID‚ðÄ—˜—p‚µ‚È‚¢‚悤‚ÉC³
-EƒMƒ‹ƒh/ƒp[ƒeƒB‚ɂ‚¢‚Ä‚àˆê‰ž“¯“™‚̈—’ljÁiƒRƒƒ“ƒg‰»‚³‚ê‚Ä‚¢‚Ü‚·B
- ƒMƒ‹ƒh‚âƒp[ƒeƒB‚ÍID‚ðÄ—˜—p‚µ‚Ä‚à‚¨‚»‚ç‚­–â‘è‚È‚¢‚½‚ßj
-
- (login/)
- login.c
- “Ç‚Ýž‚Ý/•Û‘¶ˆ—C³
- (char/)
- int_guild.c/int_party.c
- “Ç‚Ýž‚Ý/•Û‘¶ˆ—C³
-
---------------------
-//0903 by ŒÓ’±—–
-
-El14/l15‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒXl‚ð"„§‚³‚ê‚È‚¢(deprecated)"‹@”\‚Æ‚µ‚Ü‚µ‚½B
- E‚Ü‚¾Žg—p‚Å‚«‚Ü‚·‚ªA¡Œã‚Ì“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚ÅA‘¬‚â‚©‚É‘ã‘Ö‹@”\‚ð
- Žg—p‚·‚é‚悤‚ɈÚs‚µ‚Ä‚­‚¾‚³‚¢B
- EƒvƒŒƒtƒBƒbƒNƒX'l'‚Í‘ã‘Ö‹@”\‚̃vƒŒƒtƒBƒbƒNƒX'@'‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
- El15‚Í‘ã‘Ö‹@”\‚Ì@menu‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
- El14‚Í‘ã‘Ö‹@”\‚Í‚ ‚è‚Ü‚¹‚ñBinput–½—߂̈ø”‚ðÈ—ª‚µ‚È‚¢‚ʼnº‚³‚¢B
- E‚±‚ê‚ç‚Ì„§‚³‚ê‚È‚¢‹@”\‚ðŽg—p‚·‚é‚ÆŒxƒƒbƒZ[ƒW‚ª‚Å‚Ü‚·B
-
- (map/)
- script.c
- parse_simpleexpr()C³
- (conf/warp/)
- npc_warp.txt/npc_warp25.txt/npc_warp30.txt
- •Ï”–¼l0‚ð@warp0‚ÉC³
- (conf/npc/)
- npc_event_hat.txt
- •Ï”–¼l15‚ð@menu‚ÉC³
- (doc/)
- script_ref.txt
- ”z—ñ•Ï”‚Ìà–¾’ljÁ
- •Ï”‚̃vƒŒƒtƒBƒbƒNƒX'l'Ainput–½—ß‚Ìl14Amenu–½—ß‚Ìl15‚Ì
- à–¾‚ðC³
-
---------------------
-//0902 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚ª”z—ñ•Ï”‚ɑΉžB
- Earray[number]‚̂悤‚ÉŽg‚¢‚Ü‚·B”’lŒ^A•¶Žš—ñŒ^—¼•ûŽg‚¦‚Ü‚·B
- EŽg‚¦‚éƒvƒŒƒtƒBƒbƒNƒX‚Í @, $, $@ ‚Å‚·B
- iˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”AˆêŽž“I/‰i‘±“Iƒ}ƒbƒvƒT[ƒo[•Ï”j
- Enumber==0‚Í”z—ñ‚¶‚á‚È‚¢•Ï”‚Æ’l‚ð‹¤—L‚µ‚Ü‚·B
- i@hoge[0]‚Æ@hoge‚Í“¯‚¶•Ï”‚ð•\‚·j
- E‚Ü‚¾‰¼ŽÀ‘•’iŠK‚Ȃ̂ŃoƒO•ñ‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B
-Eƒ}ƒbƒvƒT[ƒo[•Ï”‚Ì“Çž’†‚ÉCtrl+C‚ð‚·‚é‚ƃf[ƒ^”j‘¹‚̉”\«‚ª‚ ‚é–â‘è‚ðC³.
-Eƒ}ƒbƒvƒtƒ@ƒCƒ‹“Ç‚Ýž‚݉æ–Ê‚ª‚³‚Ñ‚µ‚¢‚Ì‚Å‚¹‚߂ătƒ@ƒCƒ‹–¼‚ð•\Ž¦‚·‚é‚悤‚ÉB
-
- (conf/sample/)
- npc_test_array.txt
- ”z—ñ•Ï”ƒeƒXƒgƒXƒNƒŠƒvƒg
- (map/)
- script.c
- buildin_set(),buildin_input(),get_val(),
- parse_simpleexpr()C³
- buildin_getelementofarray()’ljÁ
- do_final_script()C³‚È‚Ç
- map.c
- map_readmap(),map_readallmap()C³
-
---------------------
-//0901 by ‚Ò‚´‚Ü‚ñ
-
-E˜I“XƒoƒO‚ÌC³
-
- (map/)
- pc.c
- pc_cartitem_amount() ’ljÁB
- vending.c
- vending_openvending() C³B
- clif.c
- clif_parse_NpcClicked() C³B
- pc.h C³B
-
---------------------
-//0900 by ‚Ò‚´‚Ü‚ñ
-
-EƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚̃‰ƒ“ƒ_ƒ€ƒXƒLƒ‹”­“®—¦‚ðabra_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚ÉB
-EƒXƒtƒBƒA[ƒ}ƒCƒ“‚ƃoƒCƒIƒvƒ‰ƒ“ƒg‚Ì”÷C³B
-ENoreturnƒ}ƒbƒv‚Å’±‚ªÁ”‚¯‚³‚ê‚éƒoƒOC³B
-Eˆê•”‚̃Aƒuƒ‰ŒÅ—LƒXƒLƒ‹‚ª³‚µ‚­“®ì‚µ‚È‚©‚Á‚½ƒoƒOC³B
- (map/)
- mob.c
- mob_damage()Amobskill_use() C³B
- mob_skillid2skillidx() ’ljÁB
- skill.c
- skill_readdb()Askill_abra_dataset() C³B
- skill_castend_nodamage_id()Askill_castend_pos2() C³B
- script.c
- buildin_warp() C³B
-
- skill.h C³B
- map.h C³B
- (db/)
- abra_db.txt ’ljÁB
- skill_db.txt C³B
-
---------------------
-//0899 by ŒÓ’±—–
-
-EŽæ‚芪‚«MOB‚̈—C³
- EŽæ‚芪‚«¢Š«‚ŃRƒA‚ð“f‚­ƒoƒOC³
- EŽå‚ª•Êƒ}ƒbƒv‚É”ò‚Ô‚ÆAƒeƒŒƒ|[ƒg‚Å’Ç‚¢‚©‚¯‚é‚悤‚ÉC³
- EŽæ‚芪‚«ˆ—‚ð‚æ‚èŒy‚­•ÏX
-
- (map/)
- mob.c
- mob_ai_sub_hard_mastersearch()‚ðmob_ai_sub_hard_slavemob()
- ‚É–¼‘O‚ð•Ï‚¦‚Ĉ—C³B
- mob_summonslave()C³
-
---------------------
-//0898 by ŒÓ’±—–
-
-Eeathena‚©‚çCardRemoverNPC‚ÌŽæ‚èž‚Ý
- NPCƒf[ƒ^‚à“ú–{Œê–󂵂Ă܂·‚ªA‚©‚È‚è“K“–‚Å‚·B
-
- (map/)
- script.c
- buildin_getequipcardcnt(),buildin_successremovecards()
- buildin_failedremovecards()’ljÁ
- (conf/sample/)
- npc_card_remover.txt
- ƒJ[ƒhŽæ‚èŠO‚µNPC‚Ì“ú–{Œê–ó
- ƒvƒƒ“ƒeƒ‰‚̸˜BŠ‚Ì’†‚̶‰º‚Ì•”‰®‚É‚¢‚Ü‚·
-
-Eƒ|[ƒ^ƒ‹‚ŕʃ}ƒbƒv‚É”ò‚΂µ‚½MOB‚ª‚»‚̃}ƒbƒv‚É•¦‚«’¼‚·ƒoƒOC³
- (map/)
- map.h
- struct mob_data‚Émƒƒ“ƒo’ljÁ
- mob.c
- mob_spawn(),mob_once_spawn()C³
- npc.c
- npc_parse_mob()C³
-
-
---------------------
-//0897 by ‚Ò‚´‚Ü‚ñ
-
-Eׂ©‚¢’²®
-EƒXƒgƒŠƒbƒvŒn‚ƃPƒ~ƒJƒ‹ƒvƒƒeƒNƒVƒ‡ƒ“ŒnƒXƒLƒ‹‚Ì‘SŽÀ‘•
-@–{ŽI‚Å‚Ìׂ©‚¢Žd—l‚ª•ª‚Á‚½‚Ì‚ÅŽÀ‘•‚µ‚Ü‚µ‚½B
-@Šm—¦‚ÍŽb’è‚Å‚·B
-
- (map/)
- pc.c
- pc_isequip() C³
- skill.c
- skill_status_change_start()Askill_castend_nodamage_id() C³B
- skill_abra_dataset() C³B
- battle.c
- battle_get_def()Abattle_get_atk2() C³B
- battle_get_vit()Abattle_get_int() C³B
- (db/)
- const.txt C³B
- skill_db.txt C³B
- cast_db.txt C³B
-
---------------------
-//0896 by ŒÓ’±—–
-
-E‰i‘±“Iƒ}ƒbƒv•Ï”‹@”\’ljÁ
-Eƒ}ƒbƒv•Ï”‚𕶎š—ñŒ^•Ï”‚Æ‚µ‚Ä‚àŽg—p‚Å‚«‚é‚悤‚É‚µ‚½
- E¡‚܂ł̃vƒŒƒtƒBƒbƒNƒX $ ‚͉i‘±“I‚É‚È‚è‚Ü‚·B
- ˆêŽž“Iƒ}ƒbƒv•Ï”‚ðŽg—p‚·‚éꇂ̓vƒŒƒtƒBƒbƒNƒX $@ ‚ðŽw’肵‚Ä‚­‚¾‚³‚¢.
-
- E‰i‘±“I/ˆêŽž“I‚Æ‚à‚É•¶Žš—ñŒ^‚ɑΉž‚µ‚Ä‚¢‚Ü‚·B
- •¶Žš—ñŒ^‚̃|ƒXƒgƒtƒBƒbƒNƒX‚Í$‚Å‚·B
-
- <—á> $@hoge ”’lŒ^ˆêŽžƒ}ƒbƒv•Ï”A$hoge$ •¶Žš—ñŒ^‰i‘±ƒ}ƒbƒv•Ï”
- E‰i‘±ƒ}ƒbƒv•Ï”‚̓fƒtƒHƒ‹ƒg‚Å‚Í save/mapreg.txt ‚É•Û‘¶‚³‚ê‚Ü‚·B
- ‚±‚ê‚Ímap_athena.conf‚Ìmapreg_txt‚ÅÝ’è‚Å‚«‚Ü‚·B
-
-Estr_data‚ªÄŠ„‚è“–‚Ä‚³‚ê‚é‚ƃ}ƒbƒv•Ï”‚ª³í‚ÉŽg—p‚Å‚«‚È‚¢ƒoƒOC³
- Estrdb‚©‚çnumdb‚É‚µ‚ÄA•Ï”–¼‚Ístr_buf‚É“ü‚ê‚é‚悤‚ÉB
-
-Emap_athena.conf‚Ìdelnpc,npc:clear‚ª³‚µ‚­“­‚©‚È‚¢ƒoƒOC³
-
- (map/)
- npc.c
- npc_delsrcfile(),npc_clearsrcfile()C³
- script.c / script.h
- ƒ}ƒbƒv•Ï”Œn‚©‚È‚èC³
- map.c
- map_read_config()C³‚È‚Ç
- (conf/)
- map_athena.conf
- mapreg_txt’ljÁ
- (doc/)
- conf_ref.txt
- mapreg_txt,help_txt,motd_txt’ljÁ
- script_ref.txt
- •¶Žš—ñŒ^•Ï”‚Ìà–¾C³
-
---------------------
-//0895 by Selena
-
-Emapflag‚Énozenypenalty‚ð’ljÁB
-@GVG‚âŠX’†‚̃eƒ‚È‚Ç‚ÅŽ€–S‚µ‚½Û‚ÉAZenyƒyƒiƒ‹ƒeƒB[”­¶‚ðŠO‚·—pB
-
- (map/)
- pc.c
- pc_setrestartvalue() C³
- script.c
- buildin_setmapflag()Abuildin_removemapflag() C³
- npc.c
- npc_parse_mapflag() C³
- map.h
- map_data() C³
- (db/)
- const.txt C³B
-
---------------------
-//0894 by ‚Ò‚´‚Ü‚ñ
-
-EƒR[ƒ}ˆÈŠO‚̃Aƒuƒ‰ƒJƒ_ƒuƒ‰ŒÅ—LƒXƒLƒ‹‘SŽÀ‘•B
-@ƒI[ƒgƒXƒyƒ‹‚ɂ̓Œƒxƒ‹ƒAƒbƒvˆÈŠO‘½•ª‘S•”悹‚ê‚Ü‚·B(ƒI[ƒgƒXƒyƒ‹ƒŒƒxƒ‹ƒAƒbƒv‚Í–¢ƒeƒXƒg)
-EƒAƒuƒ‰ƒJƒ_ƒuƒ‰‰¼ŽÀ‘•
-@”­“®ƒXƒLƒ‹‚ªƒŒƒxƒ‹ˆË‘¶‚¶‚á‚ ‚è‚Ü‚¹‚ñB
-@‘S‚Ä‚Ì”­“®—¦‚ª—˜_ã‹Ïˆê‚Å‚·B
-@ƒAƒCƒeƒ€ƒXƒLƒ‹‚ðŽg‚Á‚ÄŽÀ‘•‚µ‚Ä‚¢‚é‚̂ňꕔ‚ÌŽg—pðŒ‚𖳎‹‚µ‚Ü‚·iƒWƒFƒ€ã©‹C‹…“™j
-EƒAƒCƒeƒ€ƒXƒLƒ‹‚ªƒLƒƒƒXƒgEƒfƒBƒŒƒC–³‚µ‚¾‚Á‚½‚Ì‚ðC³B
-
- (map/)
- skill.c
- skill_castend_nodamage_id()Askill_use_id()Askill_use_pos() C³B
- skill_abra_dataset() ’ljÁB
- (db/)
- skill_db.txt C³B
-
---------------------
-//0893 by ŒÓ’±—–
-
-E‘¼ƒ}ƒbƒv‚©‚çƒ|[ƒ^ƒ‹‚Ìã‚Ƀ[ƒv‚µ‚Ä‚«‚½PC‚ªƒ[ƒv‚µ‚È‚¢–â‘è‚ðC³
-Eƒ`ƒƒƒbƒg’†‚ÌPC‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂·‚©‚Ç‚¤‚©Ý’è‰Â”\‚É
-EMOB‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂·‚©‚Ç‚¤‚©Ý’è‰Â”\‚É
- MOB‚̃[ƒvƒ|[ƒ^ƒ‹‚ð‹–‰Â‚·‚é‚ÆAƒeƒ‚ªŠÈ’P‚É‚Å‚«‚é‚Ì‚Å’ˆÓB
-
-EƒAƒJƒEƒ“ƒg•Ï”•ÏX‚Æ“¯Žž‚Ƀtƒ@ƒCƒ‹‚É‘‚«o‚·‚悤‚ÉC³
-Eƒ}ƒbƒvƒf[ƒ^‚̃[ƒh•”•ª‚̃ƒO•\Ž¦‚Í‚ ‚Ü‚èd—v‚¶‚á‚È‚¢‚ÆŽv‚¤‚Ì‚Å•ÏXB
-
- (char/)
- inter.c
- mapif_parse_AccReg()‚Åinter_accreg_save()‚ðŒÄ‚Ԃ悤‚ÉC³
- (map/)
- mob.c/mob.h
- mob_warp()‚̈ø”•ÏX‚ÆC³
- battle.c/battle.h
- mob_warp()ŒÄ‚Ño‚µ‚̈ø”C³
- battle_configŠÖ˜A
- map.c
- map_readallmap(),map_readmap()C³
- pc.c
- pc_setpos()C³
- skill.c
- mob_warp()ŒÄ‚Ño‚µ‚̈ø”C³
- skill_unit_onplace()C³
- (conf/)
- battle_athena.conf
- chat_warpportal,mob_warpportal‚̒ljÁ
- (doc/)
- conf_ref.txt
- chat_warpportal,mob_warpportal‚̒ljÁ
-
---------------------
-//0892 by ŒÓ’±—–
-
-EŠeŽíconfƒtƒ@ƒCƒ‹‚ŕʃtƒ@ƒCƒ‹‚ðƒCƒ“ƒ|[ƒg‚Å‚«‚é‚悤‚É‚µ‚½
- EŽ©•ª‚̃T[ƒo[—p‚ÌÝ’è‚ð•Êƒtƒ@ƒCƒ‹‚É‹Lq‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B
- E‘S‚Äuimport: ƒtƒ@ƒCƒ‹–¼vŒ`Ž®‚Å‹Lq‚µ‚Ü‚·B
- EŠeŽíconfƒtƒ@ƒCƒ‹ilogin,char,map,inter,atcommand,battlej‚ÌÅŒã‚É
- conf/import/*_conf ‚ð“ǂނ悤‚ÉŽw’肵‚½‚Ì‚ÅA‚»‚±‚ÉŽ©•ª—p‚ÌÝ’è‚ð
- ‘‚¢‚Ä‚¨‚¯‚ÎA•ÏX•”•ª‚̂݃I[ƒo[ƒ‰ƒCƒh‚µ‚Ü‚·B
- msg,script‚Ìconf‚ɂ‚¢‚Ä‚ÍA‚±‚ÌŒÀ‚è‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAimport–½—ß‚Ì
- ˆ—‚͒ljÁ‚³‚ê‚Ä‚¢‚é‚Ì‚ÅAŽ©•ª‚Åimport–½—߂𑂯‚Γ®‚«‚Ü‚·B
- EV‚µ‚¢ƒXƒiƒbƒvƒVƒ‡ƒbƒg‚ªo‚½ê‡‚È‚Ç‚ÉA‚±‚Ìconf/importƒtƒHƒ‹ƒ_‚ð
- Ì‚ÌAthena‚©‚çƒRƒs[‚·‚邾‚¯‚ÅŽ©•ª—p‚ÌÝ’è‚ð“K—p‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·.
-
-Emap_athena.conf‚Ìmap‚Ænpc‚ŒljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ð휂ł«‚é‚悤‚É‚µ‚½
- Eã‚ÉŠÖ˜A‚·‚é•ÏX‚Å‚·B
- Edelmap,delnpc–½—ß‚ðŽg—p‚·‚ê‚ÎAmap,npc–½—߂ŒljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ð
- “Ç‚Ýž‚Ü‚È‚¢‚悤‚ÉŽw’è‚Å‚«‚Ü‚·B‚±‚±‚Ńtƒ@ƒCƒ‹–¼‚Å‚Í‚È‚­A
- all ‚ÆŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚ÉŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ð‘S‚Ä“Ç‚Ýž‚Ü‚È‚­‚µ‚Ü‚·.
- Emap,npc–½—ß‚ÅAƒtƒ@ƒCƒ‹–¼‚Éclear‚ðŽw’è‚·‚é‚ÆA
- delmap,delnpc‚Ìall‚Æ“¯“™‚Ì“®ì‚ð‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
-
-Elogin_athena.conf‚Ìallow‚Ædeny‚ðƒNƒŠƒA‚Å‚«‚é‚悤‚É‚“‚½
- Eallow‚¨‚æ‚Ñdeny–½—ß‚Åclear‚ðŽw’è‚·‚é‚ƈȑO‚̃zƒXƒgî•ñ‚ð‘S휂µ‚Ü‚·.
-
- (conf/)
- ŠeŽíconfƒtƒ@ƒCƒ‹‚ÌÅŒã‚Éimport–½—ߒljÁ
- (conf/import)
- *.txt
- ƒCƒ“ƒ|[ƒg‚³‚ê‚éƒtƒ@ƒCƒ‹B‚±‚ê‚ç‚ÉŽ©•ª—p‚ÌÝ’è‚ð‘‚­‚Æ‚æ‚¢B
- (login/)
- login.c
- login_read_config()C³
- (char/)
- char.c/inter.c
- char_read_config(),inter_read_config()C³
- (map/)
- map.c
- map_read_config(),map_addmap()C³Amap_delmap()’ljÁ
- npc.c
- npc_addsrcfile()C³,npc_delsrcfile(),npc_clearsrcfile()’ljÁ
- battle.c/atcommand.c/script.c
- battle_read_config(),atcommand_read_config(),
- msg_read_config(),script_read_config()C³
- (doc/)
- conf_ref.txt
- C³
-
---------------------
-//0891 by (“Ê)
-
-EuƒXƒLƒ‹Žg—p‚ÌŒã‚ÍA‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢v‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚é‚悤‚É‚µ‚½B
- E–{ŽI‘ŠˆáƒXƒŒƒbƒh@‘´‚̇U>>5‚³‚ñ‚̃R[ƒh‚ðƒpƒNƒŠ‚Ü‚µ‚½B
- (doc/)
- conf_ref.txt C³B
- (conf/)
- battle_athena.conf C³B
- (map/)
- battle.h C³B
- battle.c
- battle_config_read() C³B
- clif.c
- clif_skill_fail() C³B
-
---------------------
-//0890 by Ž€_
-
-EƒMƒ‹ƒh‘qŒÉ‚ðˆê“x‚Ɉêl‚¾‚¯‚ªŽg—p‚·‚é‚悤‚É•ÏXB(–¢ƒeƒXƒg)
-Ebattle_athena.conf‚©‚çplayer_undead_nofreeze íœB
-E@ƒRƒ}ƒ“ƒh@gstorage ’ljÁB
-EƒXƒNƒŠƒvƒgguildstorage‚ðguildopenstorage‚É•ÏXB
-E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
- (doc/)
- conf_ref.txt C³B
- script_ref.txt C³B
- (conf/)
- atcommand_athena.conf C³B
- battle_athena.conf C³B
- help.txt C³B
- (conf/sample/)
- gstorage_test.txt ’ljÁB
- (char/)
- makefile C³B
- int_storage.h C³B
- int_storage.c
- inter_storage_delete()Ainter_guild_storage_delete() ’ljÁB
- int_guild.c
- guild_check_empty()Amapif_parse_BreakGuild() C³B
- (map/)
- makefile C³B
- battle.h C³B
- battle.c
- battle_config_read() C³B
- guild.c
- guild_broken() C³B
- storage.h C³B
- storage.c
- storage_guild_storageopen() C³B
- storage_delete()Aguild_storage_delete() ’ljÁB
- script.c
- buildin_guildstorage() ‚ð buildin_guildopenstorage()‚É•ÏXB
- intif.c
- intif_parse_LoadGuildStorage() C³B
- mob.c
- mob_summonslave()Amob_damage()Amob_delete() C³B
- mob_catch_delete()Amob_readdb() C³B
- skill.c
- skill_castend_nodamage_id()Askill_status_change_start() C³B
- clif.c
- clif_parse_ActionRequest() C³B
- atcommand.h C³B
- atcommand.c
- atcommand() C³B
-
---------------------
-//0889 by ŒÓ’±—–
-
-E•¶Žš—ñŒ^ˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”‹@”\’ljÁB
- EƒvƒŒƒtƒBƒbƒNƒX@,ƒ|ƒXƒgƒtƒBƒbƒNƒX$‚ðŽg—p‚µ‚Ü‚·Bi@hoge$‚È‚Çj
- Einput‚Å•¶Žš—ñ•Ï”‚ðŽw’è‚·‚é‚Æ•¶Žš—ñ“ü—Í‚É‚È‚è‚Ü‚·B
- EŠÖŒW‰‰ŽZŽqi”äŠr‰‰ŽZŽqj‚Å•¶Žš—ñ‚Ç‚¤‚µ‚ðŽw’è‚·‚é‚Æ•¶Žš—ñ‚Ì”äŠr‚ª
- ‚Å‚«‚Ü‚·B”’l‚Æ•¶Žš—ñ‚𬂺‚Ä”äŠr‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
- E‚Æ‚è‚ ‚¦‚¸ƒTƒ“ƒvƒ‹•t‚¯‚Ä‚Ü‚·B
-
- (map/)
- map.h
- struct map_session_data‚Énpc_str,regstr,regstr_numƒƒ“ƒo’ljÁ
- script.c
- buildin_set(),get_val(),buildin_input(),op_2num()‚È‚ÇC³
- op_2str(),op_2()’ljÁ
- clif.c / clif.h
- 01d5ƒpƒPƒbƒg’·C³
- clif_parse_NpcStringInput(),clif_scriptinputstr()’ljÁ
- pc.c / pc.h
- pc_readregstr(),pc_setregstr()’ljÁ
- (doc/)
- script_ref.txt
- ‰‰ŽZŽq‚Ìà–¾’ljÁA•Ï”‚Ìà–¾C³Ainput,menuC³
- (conf/sample/)
- npc_test_str.txt
- •¶Žš—ñ•Ï”‚ðŽg—p‚µ‚½ƒXƒNƒŠƒvƒg‚Ì—áB
- •¶Žš—ñ‚Ì‘ã“üAŒ‹‡A”äŠrA“ü—͂Ȃǂ̃eƒXƒg‚ðs‚¤‚à‚ÌB
-
---------------------
-//0888 by Ž€_
-
-EÝŒv‚©‚çŠÔˆá‚Á‚Ä‚¢‚½ƒMƒ‹ƒh‘qŒÉC³B(‚½‚¾•¡”l‚ÌŽg—p‚É‚æ‚éƒoƒO‚ª‚ ‚é‰Â”\«‚Í‚Ü‚¾‚ ‚è‚Ü‚·B)
-Eׂ©‚¢ƒoƒOC³B
- (doc/)
- inter_server_packet.txt C³B
- conf_ref.txt C³B
- (conf/)
- inter_athena.conf C³B
- help.txt C³B
- (common/)
- mmo.h C³B
- (char/)
- makefile C³B
- int_storage.h C³B
- int_storage.c
- account2storage()Ainter_storage_init()Astorage_fromstr() C³B
- inter_storage_save()Amapif_load_storage() C³B
- mapif_parse_SaveStorage() C³B
- guild_storage_fromstr()Aguild_storage_tostr() ’ljÁB
- inter_storage_save_sub()Ainter_guild_storage_save_sub() ’ljÁB
- inter_guild_storage_save()Amapif_parse_LoadGuildStorage() ’ljÁB
- mapif_parse_SaveGuildStorage()Amapif_load_guild_storage() ’ljÁB
- mapif_save_guild_storage_ack()Aguild2storage() ’ljÁB
- int_party.c
- inter_party_init() C³B
- int_guild.h C³B
- int_guild.c
- inter_guild_init() C³B
- inter_guild_search() ’ljÁB
- int_pet.c
- inter_pet_init() C³B
- inter.c
- inter_init()Ainter_save()Ainter_config_read() C³B
- (map/)
- makefile C³B
- map.h C³B
- map.c
- map_quit()Ado_init() C³B
- pc.c
- pc_setpos() C³B
- storage.h C³B
- storage.c
- do_init_storage()Ado_final_storage()Aaccount2storage() C³B
- storage_storageopen()Astorage_storageadd()Astorage_storageget() C³B
- storage_storageaddfromcart()Astorage_storagegettocart() C³B
- storage_storageclose()Astorage_storage_quit() C³B
- storage_storage_save() C³B
- guild2storage()Astorage_guild_storageopen() ’ljÁB
- guild_storage_additem() Aguild_storage_delitem() ’ljÁB
- storage_guild_storageadd()Astorage_guild_storageget() ’ljÁB
- storage_guild_storageaddfromcart()Astorage_guild_storagegettocart() ’ljÁB
- storage_guild_storageclose()Astorage_guild_storage_quit() ’ljÁB
- intif.h C³B
- intif.c
- intif_send_storage()Aintif_parse_LoadStorage()Aintif_parse() C³B
- intif_request_guild_storage()Aintif_send_guild_storage() ’ljÁB
- intif_parse_SaveGuildStorage()Aintif_parse_LoadGuildStorage() ’ljÁB
- clif.h C³B
- clif.c
- clif_additem()Aclif_parse_MoveToKafra() C³B
- clif_parse_MoveFromKafra()Aclif_parse_MoveToKafraFromCart() C³B
- clif_parse_MoveFromKafraToCart()Aclif_parse_CloseKafra() C³B
- clif_parse_LoadEndAck() C³B
- clif_guildstorageitemlist()Aclif_guildstorageequiplist() ’ljÁB
- clif_updateguildstorageamount()Aclif_guildstorageitemadded() ’ljÁB
- guild.c
- guild_broken() C³B
- script.c
- buildin_openstorage()Abuildin_guildstorage() C³B
- skill.c
- skill_castend_nodamage_id() C³B
- mob.c
- mob_summonslave()Amob_damage() C³B
- atcommand.c
- atkillmonster_sub()Aatcommand() C³B
-
---------------------
-//0887 by Ž‚Žqo^.^o
-
-E(db/)
- skill_tree.txt C³
-
---------------------
-//0886 by ‚Ò‚´‚Ü‚ñ
-
-EƒT[ƒo[snapshot
-Eƒtƒ@ƒCƒ‹’²®
-
---------------------
-//0885 by huge
-
-EƒMƒ‹ƒh‹¤—L‘qŒÉ‚ÌŽÀ‘•Bguildstorage‚ÅŠJ‚¯‚Ü‚·B
- Ž©•ª‚ÌŽI‚ÅŽÀŒ±‚Í‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªA‰ß‘a’n‚È‚Ì‚Å‘½l”ƒMƒ‹ƒh‚É‚È‚é‚Æ‚Ç‚¤“®‚­‚©•ª‚©‚è‚Ü‚¹‚ñB
- (”O‚Ì‚½‚߃oƒbƒNƒAƒbƒv‚Í•K‚¸Žæ‚Á‚Ä‚¨‚¢‚ĉº‚³‚¢)
-Eareawarp‚ÅA‘ÎÛƒ}ƒbƒv–¼‚ð"Random"‚É‚·‚é‚ÆA“¯ƒ}ƒbƒv“à‚щƒ“ƒ_ƒ€‚É”ò‚Ԃ悤‚ÉC³B
-EGMƒRƒ}ƒ“ƒh‚Ŷ‚«•Ô‚µ‚½‚Æ‚«‚ÉSP‚à‘S‰ñ•œ‚·‚é‚悤‚ÉC³B
-EƒfƒBƒ{[ƒVƒ‡ƒ“‚ÌðŒ‚ð‚¿‚å‚Á‚ÆC³B
-
- (char/)
- int_storage.c
- mapif_load_storage() C³B
- mapif_parse_SaveStorage() C³B
- inter.c
- inter_send_packet_length[] C³B
- inter_recv_packet_length[] C³B
- (map/)
- atcommand.c
- @alive,@raise,@raisemap C³B
- intif.c
- packet_len_table[] C³B
- intif_request_storage() C³B
- intif_send_storage() C³B
- intif_parse_LoadStorage() C³B
-
- map.h
- map_session_data state‚Éstorage_flag ’ljÁB
- script.c
- buildin_areawarp_sub() C³B
- buildin_openstorage() C³B
- buildin_guildstorage() ’ljÁB
- skill.c
- skill_castend_nodamage_id() C³B
- storage.c
- account2storage() C³B
- storage_storageopen() C³B
- storage_storage_save() C³B
-
---------------------
-//0884 by Ž€_
-
-Eׂ©‚¢ƒoƒOC³B
-Ebattle_athena.conf‚Épet_strAzeny_penaltyAresurrection_exp ’ljÁB
-E0878‚Ì‹âsŠÖŒW‚̃R[ƒh‚Í‚à‚¤‚¢‚ç‚È‚¢‚Ì‚Å‘S‚ÄíœB
-Ezeny_penalty‚ðݒ肵‚ÄŽg‚¤ê‡‚ÍŽè”—¿‚Í‚È‚­‚µ‚½•û‚ª‚¢‚¢‚©‚àB
-Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚Åpercentheal‚É‚àPP‚ÆLP‚É‚æ‚é‰ñ•œƒ{[ƒiƒX‚ª•t‚­‚悤‚É•ÏXB(‚½‚¾vit‚âintAHPRAMPR‚É‚æ‚é‰ñ•œƒ{[ƒiƒX‚ª•t‚«‚Ü‚¹‚ñB)
-E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒgB
- (common/)
- mmo.h C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- map.c
- do_init()Ado_final() C³B
- script.c
- buildin_openbank() íœB
- buildin_failedrefitem() C³B
- storage.h C³B
- storage.c
- do_init_bank()Ado_final_bank()Aaccount2bank() íœB
- storage_bank()Astorage_readbank() íœB
- skill.c
- skill_castend_nodamage_id()Askill_attack() C³B
- battle.h C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_config_read() C³B
- pc.c
- pc_setrestartvalue() C³B
- clif.c
- clif_skill_nodamage()Aclif_refine() C³B
- itemdb.c
- itemdb_isequip3() C³B
- atcommand.c
- atcommand() C³B
-
---------------------
-//0883 by Kalen
-
-EWarpFXC³
- EƒAƒTƒVƒ“ƒMƒ‹ƒhŽü‚èC³(̂̂܂܂̃Šƒ“ƒN‚¾‚Á‚½‚Ì‚ÅŒ»Ý‚Ìó‘Ô‚ÉC³B)
- EYuno‚ÌWarp‘S–ÊŒ©’¼‚µ(YumilLoopC³ASageCastleRandomWarp’ljÁA—ˆã‚³‚ñ‚̉ƒljÁ)
- Eƒ‚ƒ“ƒNƒMƒ‹ƒhŽü‚è’ljÁ
-ENPCFXC³
- E–XŽqì¬NPC‚ð•Êƒtƒ@ƒCƒ‹‚ÖBˆê•”’ljÁ(ep2.5’ljÁ•ª)
- @ŽQlData(R.O.M776): ttp://green.sakura.ne.jp/~youc/ro/data/itemmaking.html#04
- EƒAƒTƒVƒ“ƒMƒ‹ƒhC³
- E“ñŽŸE“]EŠÖŒWNPCˆê•”’ljÁ(‚±‚ê‚ŃRƒ‚ƒh¬Œ€ê‚Ös‚¯‚Ü‚·)
- Eƒ}ƒXƒ^[ƒAƒ‹ƒPƒ~ƒXƒg‚̑䎌C³
- EƒAƒ‹ƒfƒoƒ‰ƒ“‚̈ēà—vˆõ‚ðˆÚ“®&‘䎌C³&ƒCƒ[ƒW’ljÁ
- EBBS‚É‚ ‚ª‚Á‚Ä‚¢‚½ƒRƒ‚ƒhƒXƒNƒŠƒvƒg’ljÁ(event_hat“™‚Ö•ªŽU)
- EƒRƒ“ƒƒ“ƒNƒGƒXƒgŠÖŒWNPCˆê•”’ljÁ(—ˆã[yuno]Aƒlƒ‹[prontera])
- (conf/warp/)
- npc_warp.txt
- npc_warp30.txt
- npc_warp_job.txt
- (conf/npc/)
- npc_event_hat.txt(V‹K)
- npc_job_2nd.txt
- npc_job_alchemist.txt
- npc_town_aldebaran.txt
- npc_town_comodo.txt
- npc_town_gonryun.txt
- npc_town_guide.txt
- npc_town_yuno.txt
- npc_town_lutie.txt
-
---------------------
-//0882 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚É0881‘Š“–‚̃AƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\‚̃vƒŒƒtƒBƒbƒNƒX•ÏX
- E0881‚̃AƒJƒEƒ“ƒg•Ï”‚̓vƒŒƒtƒBƒbƒNƒX##‚É‚È‚è‚Ü‚µ‚½B
- E0881‚̃AƒJƒEƒ“ƒg•Ï”‚Í‘Sƒ[ƒ‹ƒh‚Å‹¤—L‚³‚ê‚Ü‚·B
- E•Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG2_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·(16)B
-Eƒ[ƒ‹ƒh“à‚̃AƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\’ljÁ
- E•Ï”–¼‚̃vƒŒƒtƒBƒbƒNƒX‚Í#‚Å‚·B
- E•Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·(16)B
- E0881‚Ì‹âsƒXƒNƒŠƒvƒg‚Í‚±‚¿‚ç‚ðŽg—p‚·‚é‚悤‚É‚È‚è‚Ü‚·B
- ‚æ‚Á‚ĈȑO‚̃f[ƒ^‚ª‚‚©‚¦‚È‚¢‚Ì‚Å‚ ‚ç‚©‚¶‚߈ø‚«o‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢.
- E•Ï”ƒf[ƒ^‚Í save/accreg.txt ‚É•Û‘¶‚³‚ê‚Ü‚·B
- ‚±‚̃tƒ@ƒCƒ‹–¼‚Í inter_athena.conf ‚Å•ÏX‰Â”\‚Å‚·Bconf_ref.txtŽQÆB
-
- (common/)
- mmo.h
- ACCOUNT_REG_NUM‚ð16‚ÉAACCOUNT_REG_NUM2’ljÁ
- struct mmo_charstatus‚Éaccount_reg2_num,account_reg2ƒƒ“ƒo’ljÁ
- (login/)
- login.c
- account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
- (char/)
- char.c
- account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
- inter.c
- ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”‹@”\’ljÁB
- inter_accreg*()’ljÁAaccreg_db’ljÁ‚È‚ÇB
- (map/)
- chrif.c/chrif.h
- account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
- 0881‚ł̃oƒO‚ðC³
- intif.c/intif.h
- ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”‹@”\’ljÁB
- pc.c/pc.h
- pc_*accountreg()=>pc_*accountreg2()‚ÉB
- pc_setaccountreg(),pc_readaccountreg()’ljÁB
- script.c
- buildin_set(),buildin_get_val(),buildin_input()C³
- (doc/)
- inter_server_packet.txt
- ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”ŠÖŒW
- conf_ref.txt
- accreg_txt’ljÁ
-
---------------------
-//0881 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚ɃAƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\’ljÁ
- E•Ï”–¼‚ɃvƒŒƒtƒBƒbƒNƒX#‚ð•t‚¯‚邱‚ƂŃAƒJƒEƒ“ƒg‹¤—L•Ï”‚É‚È‚è‚Ü‚·B
- EƒAƒJƒEƒ“ƒg•Ï”‚Í•ÏX‚µ‚½Žž“_‚Å‘SƒT[ƒo[‚Ƀ|ƒXƒg‚³‚ê‚é‚Ì‚Å
- •p”É‚É‘‚«Š·‚¦‚é‚ƃT[ƒo[ŠÔ’ÊM‚ª”ì‘剻‚µ‚Ü‚·B
- EƒAƒJƒEƒ“ƒg•Ï”‚Í•ÏX‚µ‚½Žž“_i‚»‚µ‚Ä‚»‚ꂪloginŽI‚É“Í‚¢‚½Žž“_j‚Å
- account.txt‚É‘‚«o‚³‚ê‚Ü‚·B
- EƒOƒ[ƒoƒ‹•Ï”i‰i‘±•Ï”j‚̌”‚ð96‚ÉŒ¸‚炵AŒ¸‚Á‚½32ŒÂ•ª‚ð
- ƒAƒJƒEƒ“ƒg•Ï”‚É‚µ‚Ä‚¢‚Ü‚·‚ªAmmo_charstatus‚̃TƒCƒY‚ª
- 16000byte‚ð’´‚¦‚È‚¢ŒÀ‚è‘‚â‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·Bƒ0879‚Ì•ÏX‚ðŽQÆ
- •Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·B
- E0878‚Ì‹âs‚ðƒAƒJƒEƒ“ƒg•Ï”‚ðŽg—p‚·‚é‚悤‚ÉC³
- bank.txt‚̃f[ƒ^‚ªŽg‚¦‚È‚­‚È‚é‚Ì‚Å‚ ‚ç‚©‚¶‚߈ø‚«o‚µ‚Ä‚¨‚¢‚ĉº‚³‚¢B
-
- (common/)
- mmo.h
- GLOBAL_REG_NUM‚ð96‚ÉAACCOUNT_REG_NUM‚ð’ljÁ
- struct mmo_charstatus‚Éaccount_reg_num,account_regƒƒ“ƒo’ljÁ
- (login/)
- login.c
- ƒpƒPƒbƒg2728ˆ—’ljÁ
- (char/)
- char.c
- ƒpƒPƒbƒg2729,2b10ˆ—’ljÁ
- (map/)
- chrif.c
- chrif_saveaccountreg(),chrif_accountreg()
- (ƒpƒPƒbƒg2b10,2b11ˆ—)’ljÁB
- pc.c/pc.h
- pc_readaccountreg(),pc_setaccountreg()’ljÁ
- script.c
- buildin_set(),buildin_get_val(),buildin_input()C³
- (conf/sample/)
- bank_test.txt
- ƒAƒJƒEƒ“ƒg•Ï”Žg—p”Å‚Ì‹âsƒXƒNƒŠƒvƒg
-
---------------------
-//0880 by Ž€_
-
-Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚𳂵‚­ŽÀ‘•‚Æ‚¿‚å‚Á‚Æ‹@”\Šg’£B
-Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ŃŒƒxƒ‹•Ê‚ÉŽg‚¦‚éƒAƒCƒeƒ€‚ðskill_require_db.txt‚ÉÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B‚½‚¾ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÅŽg‚¦‚éƒAƒCƒeƒ€‚ÍitemhealApercenthealAsc_startAsc_endˆÈŠO‚Ì•¨‚ª“ü‚Á‚Ä‚¢‚é‚Ƴ‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
-ƒŒƒxƒ‹5‚Ü‚Å‚Í–{ŽI‚ɇ‚킹‚Ä‚¢‚Ü‚·‚ªÅ‘僌ƒxƒ‹‚ð10‚Ü‚ÅŠg’£‚·‚é‚ƃŒƒxƒ‹6 - ƒ}ƒXƒeƒ‰‚ÌŽÀA7 - ƒ[ƒ„ƒ‹ƒ[ƒŠ[A8 - ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽíA9 - ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀA10 - ƒo[ƒT[ƒNƒ|[ƒVƒ‡ƒ“‚Éݒ肵‚Ä‚¢‚Ü‚·Bskill_db.txt‚ðC³‚·‚ê‚΂±‚ꂪ—LŒø‚É‚È‚è‚Ü‚·B(‚Ç‚±‚ðC³‚·‚é‚©‚à‚í‚©‚ç‚È‚¢l‚Í’ú‚߂邱‚Æ‚Å‚·B) ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚É‚æ‚éƒAƒCƒeƒ€Žg—p‚ÍŽg—pðŒ‚𖳎‹‚µ‚Ü‚·B­‚µ‚̓Aƒ‹ƒPƒ~ƒXƒg‚ÉŠó–]‚ª‚Å‚«‚½‚©‚à...(‘½•ª–³—...)
-Ebattle_athane.conf‚Éproduce_item_name_inputAproduce_potion_name_inputAmaking_arrow_name_inputAholywater_name_input ’ljÁB
-Eƒp[ƒeƒBˆõ‚É‚¾‚¯Žg‚¤ƒXƒLƒ‹‚ƃMƒ‹ƒhˆõ‚É‚¾‚¯Žg‚¤ƒXƒLƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
-E‚»‚Ì‘¼×‚©‚¢C³B
- (conf/)
- battle_athane.conf C³B
- (doc/)
- conf_ref.txt C³B
- db_ref.txt C³B
- (db/)
- skill_db.txt C³B
- skill_require_db.txt C³B
- (map/)
- map.h C³B
- skill.h C³B
- skill.c
- skill_status_change_timer()Askill_attack()Askill_use_id() C³B
- skill_castend_nodamage_id()Askill_castend_damage_id() C³B
- skill_castend_id()Askill_castend_pos()Askill_produce_mix() C³B
- skill_arrow_create()Askill_check_condition() C³B
- skill_status_change_clear()Askill_readdb() C³B
- mob.c
- mobskill_use_id()Amob_changestate() C³B
- pc.c
- pc_itemheal()Apc_percentheal()Apc_calcstatus() C³B
- battle.h C³B
- battle.c
- battle_delay_damage()Abattle_damage()Abattle_heal() C³B
- battle_get_adelay()Abattle_get_amotion() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack()Abattle_config_read() C³B
- clif.c
- clif_skill_fail() C³B
- script.c
- buildin_sc_start()Abuildin_sc_end() C³B
- makefile C³B
-
---------------------
-//0879 by ŒÓ’±—–
-
-E‘—MFIFO‚̃oƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ÌÆŽã«‚ÌC³
- E2048ƒoƒCƒgˆÈã‚̃pƒPƒbƒg‚ð‘—‚é‚Æ‚«AFIFO‚ª–ž”t‚É‹ß‚¯‚ê‚Î
- ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚É‚æ‚é•s³ƒAƒNƒZƒX‚ª‹N‚±‚Á‚Ä‚¢‚½–â‘èC³B
- EFIFO‚ª–ž”t‚É‹ß‚¢‚Æ‚«WFIFOSET‚³‚ꂽƒpƒPƒbƒg‚ªŽÌ‚Ä‚ç‚ê‚Ä‚¢‚½–â‘èC³B
- EFIFO‚ªƒI[ƒo[ƒtƒ[‚·‚éê‡AŽ©“®“I‚ÉFIFO‚ðŠg’£‚·‚é‚悤‚É‚µ‚½B
- i‚½‚¾‚µAˆê“x‚ÉWFIFOSET‚·‚éƒpƒPƒbƒg‚ª16384ƒoƒCƒgˆÈ‰º‚Ɖ¼’肵‚Ä‚¢‚éj
- Eusocket: ? wdata expanded to ???? bytesv‚ÍFIFO‚ªŠg’£‚³‚ꂽ‚Æ‚«‚É
- ‚ł郃O‚¾‚ªAƒGƒ‰[‚Å‚Í‚È‚­AƒpƒPƒbƒg‚ͳ‚µ‚­‘—M‚³‚ê‚éB
- Eusocket: ? wdata lost !!v‚̓pƒPƒbƒg‚ª‘rŽ¸‚µ‚½‚±‚Æ‚ð•\‚·ƒƒO‚ÅA
- ƒGƒ‰[‚Å‚ ‚邪64KB‚ð’´‚¦‚é’´‹‘å‚ȃpƒPƒbƒg‚ðWFIFOSET‚µ‚È‚¢‚Æo‚È‚¢B
- E16384ƒoƒCƒg‚ð’´‚¦‚éƒpƒPƒbƒg‚ðWFIFOSET‚·‚é‚ƃGƒ‰[ƒƒbƒZ[ƒW‚È‚µ‚ÉA
- •s³ƒAƒNƒZƒX‚ª‹N‚±‚é‰Â”\«‚ª‚ ‚é‚Ì‚ÅA’´‚¦‚È‚¢‚悤‚É‚·‚邱‚ÆB
-
- (common/)
- socket.c /socket.h
- WFIFOSET()‚ðƒ}ƒNƒ‚©‚çŠÖ”‚É•ÏX
- realloc_fifo()’ljÁ
-
-EƒT[ƒo[ŠÔ’ÊMFIFO‚̃oƒbƒtƒ@ƒTƒCƒY‚ð‘å‚«‚­‚µ‚½
- E‘å—ʂ̃f[ƒ^‚ª’ÊM‚³‚ꂽ‚Æ‚«‚Ƀf[ƒ^ˆ—’x‰„‚ª‹N‚«‚É‚­‚­‚·‚邽‚ßB
- Eƒƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚½B(‚¬‚肬‚è‚Ìl‚Í65536‚ÉÝ’è‚·‚é‚ÆŒ³’Ê‚è‚É‚È‚é)
- EƒT[ƒo[ŠÔ’ÊM‚ÌFIFOƒTƒCƒY‚Í mmo.h ‚Å’è‹`‚³‚ê‚Ä‚¢‚éB
- •ÏX‚·‚éꇂÍ64KB(65536)ˆÈã‚Ì’l‚É‚·‚邱‚ÆB
- ‘å‚«‚­‚·‚é‚Æ‹‘åƒf[ƒ^ŽóMŽž‚Ì’x‰„‚ªŒ¸‚邪ƒƒ‚ƒŠ‚𑽂­Žg‚¤B
- E@kickallŽž‚ȂǂɃf[ƒ^‘—M‚ªŒƒ‚µ‚­‚È‚é‚Ì‚Å•ÏX‚µ‚½‚ªA
- “¯ŽžƒƒOƒCƒ“l”‚ª­‚È‚¢‚Æ‘‚₵‚Ä‚àˆÓ–¡‚Í–³‚¢B
-
- (common/)
- mmo.h
- FIFOSIZE_SERVERLINKƒ}ƒNƒ’ljÁB
- (login/)
- login.c
- 2710ƒpƒPƒbƒg‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
- (char/)
- char.c
- 2af8ƒpƒPƒbƒg‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
- check_connect_login_server()‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
- (map/)
- chrif.c
- check_connect_char_server()‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
-
---------------------
-//0878 by huge
-
-EƒJƒvƒ‰‹âsƒT[ƒrƒXB
- Ž©•ª‚ÌŽI‚ÅŽÀ‘•‚µ‚Ä‚½‚ñ‚Å‚·‚ªAˆÓŠO‚ÆDŠ´G‚¾‚Á‚½‚Ì‚Åo‚µ‚Ä‚Ý‚Ü‚·B
- NPCscript‚ÅAopenbank(0);‚Å—a‹àŠz‚ð•Ô‚µ‚ÄA’†‚É”Žš‚ð“ü‚ê‚é‚Æo‚µ“ü‚ꂵ‚Ü‚·B
- Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚𓯕•‚µ‚½‚Ì‚ÅA‚»‚ê‚ðŽQÆB
-
- (common/)
- mmo.h
- struct bank ’ljÁB
- (map/)
- map.c
- do_final(),do_init() C³B
- script.c
- buildin_openbank() ’ljÁB
- storage.c
- storage.h
- ƒOƒ[ƒoƒ‹•Ï”’ljÁB
- do_init_bank(),do_final_bank(),account2bank() ’ljÁB
- storage_bank(),storage_readbank() ’ljÁB
-
---------------------
-//0877 by ŒÓ’±—–
-
-EloginŽI‚̃AƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‚ªƒlƒbƒgƒ}ƒXƒN•\‹L‚ɑΉž
- 192.168.0.0/24 ‚â 192.168.0.0/255.255.0.0 ‚Æ‚¢‚Á‚½•\‹L‚ɑΉžB
-Ebattle_athena.conf‚ÉGM‚ª–³ðŒ‚Å‘•”õ•i‚ð‘•”õ‚Å‚«‚é•
- –³ðŒ‚ŃXƒLƒ‹‚ðŽg—p‚Å‚«‚éÝ’è’ljÁ
- ‚±‚ê‚ç‚̓fƒoƒO—p‚È‚Ì‚Å“®ì‚É•s“s‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-
- (login/)
- login.c
- check_ip()C³,check_ipmask()’ljÁ
- (map/)
- battle.c/battle.h
- battle_config‚Égm_allequip,gm_skilluncond’ljÁ
- battle_config_read()C³X
- skill.c
- skill_check_conditio()C³
- pc.c
- pc_isequp()C³
- (doc/)
- conf_ref.txt
- allow•ÏXAgm_all_equipmentAgm_skill_unconditional’ljÁ
-
---------------------
-//0876 by Ž€_
-
-Eׂ©‚¢ƒoƒOC³B
-E@ƒRƒ}ƒ“ƒh‚ɃeƒXƒg‚ׂ̈ɓü‚ê‚Ä‚¢‚½•¨‚ª“ü‚Á‚Ä‚¢‚½‚Ì‚ÅC³B
-Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚ÌŽË’ö‚ð5‚©‚ç4‚ÉC³(–{ŽIŽË’ö‚Í•s–¾)‚ƃŠƒUƒŒƒNƒVƒ‡ƒ“‚ª–³‘®«‚¾‚Á‚½‚̂𹑮«‚ÉC³B
- (db/)
- skill_db.txt C³B
- (map/)
- mob.c
- mob_catch_delete()Amob_stop_walking() C³B
- storage.c
- storage_additem() C³B
- pc.c
- pc_damage()Apc_stop_walking() C³B
- clif.c
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
- battle.c
- battle_calc_magic_attack() C³B
- skill.c
- skill_check_condition() C³B
- atcommand.c C³B
-
---------------------
-//0875 by ŒÓ’±—–
-
-Eparty_share_level‚ðinter_athena.conf‚Ɉڂµ‚½
- (ƒp[ƒeƒBŠÖ˜A‚̈—‚ÌŠÇŠ‚ªinterŽI‚Ì‚½‚ß)
-Einter_athena.conf‚Éinter_log_file€–ڒljÁ
-EƒMƒ‹ƒhì¬/‰ðŽU/éè—Ì/é”jŠü‚ªƒƒO‚ÉŽc‚é‚悤‚É
-EƒMƒ‹ƒh‰ðŽUŽž‚Ƀƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½–â‘è‚ðC³
- (char/)
- char.c/char.h
- party_share_levelŠÖ˜A
- (inter/)
- inter.c/inter.h
- party_share_level / inter_log_file ŠÖ˜A
- ƒƒOo—Í—p‚Éinter_log()’ljÁ
- int_guild.c
- ì¬/‰ðŽU/éè—Ì/é”jŠü‚ðƒƒO‚Éo—Í
- ƒƒ‚ƒŠƒŠ[ƒNC³
- (doc/)
- conf_ref.txt
- C³
-
-EƒT[ƒo[ó‘ÔŠm”F—pCGIƒXƒNƒŠƒvƒg“Y•t‚È‚Ç
- EŽ©ŒÈÓ”C•Úׂȉðà–³‚µAŽ¿–₳‚ê‚Ä‚àƒXƒ‹[‚·‚é‰Â”\«—L‚è
- EƒGƒfƒBƒ^‚ÅŠJ‚¢‚½‚ç­‚µà–¾—L‚è
- ECGIÝ’u‚ÌŠî–{‚³‚¦‚í‚©‚ê‚Ζâ‘è‚È‚¢‚Í‚¸
-
- (tool/cgi/)
- serverstatus.cgi
- ƒT[ƒo[ó‘ÔŠm”F—pCGIƒXƒNƒŠƒvƒg
- addaccount.cgi
- à–¾C³
-
---------------------
-//0874 by Kalen
-EWhiteDayƒCƒxƒ“ƒg’ljÁ
- conf/npc/npc_event_whiteday.txt(V‹K)
- ‚½‚¾A‚¨‰ÙŽq”„‚Á‚Ă邾‚¯‚Ý‚½‚¢cGM‚ª‚È‚É‚â‚é‚Ì‚©‚Í’m‚è‚Ü‚¹‚ñ‚ªB
- sakRO‚Ì‚Ù‚¤‚ł̓zƒƒCƒgƒ`ƒ‡ƒR‚炵‚«‚à‚Ì‚ª’ljÁ‚³‚ꂽ‚Ì‚É
- jRO‚ŒljÁ‚³‚ꂽ‚Ì‚Í—’d“P‹Žƒpƒbƒ`‚Ì‚Ý(*L„t`;)c
-
-EAlchemistƒMƒ‹ƒh‚Å“û”«A»‘¢‘‚ð•Ï‚¦‚é‚悤‚É
- conf/npc/npc_job_alchemist.txt(V‹K)
- “]EƒNƒGƒXƒg‚ª•ª‚©‚ç‚È‚©‚Á‚½‚̂ʼn·‚ß‚Ä‚¢‚Ü‚µ‚½‚ª
- ”ƒ‚¦‚È‚¢‚Æ•s•Ö‚Æ•·‚¢‚½‚Ì‚ÅA’ljÁ
-
-EõFNPCŽÀ‘•
- conf/npc/npc_event_dye.txt(XV)
- ”¯Œ^•ÏX‚ªsakRO‚É—ˆ‚½‚炵‚¢‚Ì‚Å
- ‚È‚ñ‚Æ‚È[‚­XV
-
---------------------
-//0873 by Ž€_
-
-E@ƒRƒ}ƒ“ƒhitem2‚Ækillmonster ’ljÁB
-EƒXƒNƒŠƒvƒggetitem2‚Ækillmonsterall ’ljÁB
-E–î쬂Åì‚ç‚ꂽ–î‚໑¢ŽÒ‚Ì–¼‘O‚ª•t‚­‚悤‚ÉC³B
-Ebattle_athena.conf‚Émonster_class_change_full_recover’ljÁB
-E‘•”õƒXƒNƒŠƒvƒg‚ÉbWeaponComaEle‚ÆbWeaponComaRace ’ljÁB
-E­‚µŠÔˆá‚¢‚ª‚ ‚Á‚½ƒ_ƒ[ƒWŒvŽZŽ®C³B
-EbInfiniteEndure‚̈—‚ðƒCƒ“ƒfƒ…ƒA•\Ž¦‚È‚µ‚Å“à•”ˆ—‚·‚é‚悤‚É•ÏXB
-EƒI[ƒgƒXƒyƒ‹‚Åcastend_nodamage_id()‚ðŒÄ‚ÔƒXƒLƒ‹‚àŽg—p‚Å‚«‚é‚悤‚ÉC³B
-E‚»‚Ì‘¼×‚©‚¢C³‚ƃoƒOC³B
-E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒg‚Ȃ̂ŃoƒO‚ª‚ ‚Á‚½‚ç•ñ‚¨Šè‚¢‚µ‚Ü‚·B
- (conf/)
- help.txt C³B
- atcommand_athena.conf C³B
- battle_athena.conf C³B
- char_athena.conf C³B
- (db/)
- const.txt C³B
- item_db.txt C³B
- (doc/)
- item_bonus.txt C³B
- script_ref.txt C³B
- conf_ref.txt C³B
- (map/)
- map.h C³B
- map.c
- map_quit() C³B
- skill.h C³B
- skill.c
- skill_castend_nodamage_id()Askill_status_change_clear() C³B
- skill_castend_id()Askill_castend_pos()Askill_arrow_create() C³B
- skill_status_change_timer() C³B
- pc.c
- pc_calcstatus()Apc_bonus2()Apc_equipitem() C³B
- pc_unequipitem()Apc_damage() C³B
- battle.h C³B
- battle.c
- battle_get_dmotion()Abattle_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_config_read() C³B
- clif.c
- clif_parse_LoadEndAck()Aclif_damage()Aclif_skill_damage() C³B
- clif_skill_damage2() C³B
- itemdb.h C³B
- itemdb.c
- itemdb_isequip3() ’ljÁB
- mob.h C³B
- mob.c
- mob_delay_item_drop()Amob_damage()Amob_changestate() C³B
- mob_class_change()Amob_delete()Amob_catch_delete() C³B
- script.c
- buildin_getitem() C³B
- buildin_killmonsterall_sub()Abuildin_killmonsterall() ’ljÁB
- atcommand.h C³B
- atcommand.c
- atcommand() C³B
- atkillmonster_sub() ’ljÁB
-
---------------------
-//0872 by ElFinLazz
-
-EƒXƒLƒ‹ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[C³
-EƒXƒLƒ‹ƒMƒ€ƒ\ƒoƒ“ƒOƒhƒ“ƒ{ƒ‹ƒIƒbƒl‹ïŒ»
-EƒXƒLƒ‹ƒAƒuƒ‰ƒJƒ_ƒu‚È‚ç‹`ƒR[ƒ}‹ïŒ»
-EƒR[ƒ}‚Ì•ŠíƒIƒvƒVƒ‡ƒ“’ljÁ(Ží‘°, 番—¦)
-EƒIƒvƒVƒ‡ƒ“à–¾’ljÁ
- (db/)
- const.txt C³.
- (doc/)
- item_bonus.txt C³.
- (map/)
- map.h C³.
- skill.c
- skill_castend_nodamage_id(), skill_unit_group(), skill_status_change_start() C³.
- pc.c
- pc_calcstatus(), pc_bonus2(), pc_gainexp() C³.
- battle.c
- battle_weapon_attack() C³.
-
---------------------
-//0871 by Ž€_
-
-E0869‚̃oƒOC³B
-Echar_athena.conf‚Ælogin_athena.conf‚É€–ڒljÁB(ƒLƒƒƒ‰ŽI‚ƃƒOƒCƒ“ŽI‚̃ƒOƒtƒ@ƒCƒ‹‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½BƒfƒtƒHƒ‹ƒg‚Ålog/ƒtƒHƒ‹ƒ_[‚É“ü‚é‚Ì‚ÅlogƒtƒHƒ‹ƒ_[‚ðì‚é•K—v‚ª‚ ‚è‚Ü‚·B)
-EƒGƒiƒW[ƒR[ƒg‚̈—‚ð­‚µC³Bƒ‚ƒ“ƒXƒ^[‚ªŽg‚Á‚½ê‡‚̓XƒLƒ‹ƒŒƒxƒ‹*6%‚Ì•¨—ƒ_ƒ[ƒW‚ðŒ¸‚ç‚·‚悤‚É•ÏXB
-E•ŠíˆÈŠO‚Ì•¨‚ł໑¢ŽÒ‚Ì–¼‘O‚ð•\Ž¦‚·‚é‚悤‚É•ÏXB(–{ŽI‚ł̓vƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX‚ÆŽèì‚èƒ`ƒ‡ƒRƒŒƒbƒgˆÈŠO‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñ‚ªƒpƒPƒbƒg‚Í‚ ‚邱‚Æ‚¾‚µ“ü‚ê‚Ä‚Ý‚Ü‚µ‚½B)
-E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
-E@ƒRƒ}ƒ“ƒhˆê‚‚ƃXƒNƒŠƒvƒgˆê‚‚ð’ljÁ‚µ‚Ü‚µ‚½‚ªà–¾‚ÍŒã‚̃pƒbƒ`‚Å‘‚«‚Ü‚·B
- (conf/)
- char_athena.conf C³B
- login_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (login/)
- login.c
- parse_login()Alogin_config_read()Alogin_log() C³B
- (char/)
- char.h C³B
- char.c
- char_config_read()Amake_new_char()Aparse_char() C³B
- int_party.c C³B
- int_storage.c C³B
- int_guild.c C³B
- int_pet.c C³B
- (map/)
- map.h C³B
- skill.c
- skill_status_change_start()Askill_additional_effect() C³B
- skill_castend_nodamage_id()Askill_check_condition() C³B
- skill_status_change_clear()Askill_produce_mix() C³B
- skill_status_change_timer() C³B
- pc.c
- pc_calcstatus()Apc_insert_card()Apc_additem()Apc_cart_additem() C³B
- storage.c
- storage_additem() C³B
- battle.c
- battle_get_adelay()Abattle_get_amotion()Abattle_calc_damage() C³B
- clif.c
- clif_additem()Aclif_equiplist()Aclif_storageequiplist() C³B
- clif_tradeadditem()Aclif_storageitemadded()Aclif_use_card() C³B
- clif_cart_additem()Aclif_cart_equiplist()Aclif_vendinglist() C³B
- clif_openvending()Aclif_arrow_create_list() C³B
- clif_skill_produce_mix_list()Aclif_parse_SelectArrow() C³B
- clif_parse_ProduceMix() C³B
- script.c
- buildin_produce() C³B
- buildin_getitem2() ’ljÁB
- atcommand.c
- atcommand() C³B
-
---------------------
-//0870 by shuto
-
-Emapflag‚ÌUéíMAP‚Énomemo’ljÁ
-EƒMƒ‹ƒh•ó” ‚ÅA•ó” oŒ»‚Æ“¯Žž‚ÉMAPŽI‚ª—Ž‚¿‚é–â‘èC³(by ‚Ò‚´‚Ü‚ñ)
-
---------------------
-//0869 by Ž€_
-
-Ebattle_athena.conf‚Éplayer_land_skill_limitAmonster_land_skill_limitAparty_skill_penaly ’ljÁB
-Echar_athena.conf‚Éparty_share_level ’ljÁB
-E‚»‚Ì‘¼×‚©‚¢C³B
- (conf/)
- char_athena.conf C³B
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (char/)
- char.h C³B
- char.c
- char_config_read() C³B
- int_party.c
- party_check_exp_share() C³B
- (map/)
- map.h C³B
- skill.c
- skill_attack()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_status_change_start() C³B
- skill_castend_pos() C³B
- pc.c
- pc_calcstatus() C³B
- mob.c
- mobskill_castend_pos() C³B
- battle.h
- battle.c
- battle_get_adelay()Abattle_get_amotion()Abattle_calc_damage() C³B
- battle_config_read() C³B
- pet.c
- pet_data_init() C³B
-
---------------------
-//0868 by Ž€_
-
-Eƒ}ƒWƒbƒNƒƒbƒhŽÀ‘•‚ƃXƒyƒ‹ƒuƒŒƒCƒJ[C³B
-Eƒ}ƒWƒbƒNƒƒbƒh‚Ìꇖ{ŽI‚ÅŽg‚Á‚Ä‚à‚È‚ñ‚Ì•\Ž¦‚à‚È‚­”­“®‚Ì‘O‚É‚ÍŽg‚Á‚½‚©‚Ç‚¤‚©‚ÌŠm”F‚ª‚Å‚«‚È‚¢‚̂ŃXƒLƒ‹‰r¥ƒpƒPƒbƒg(0x13e)‚ð—˜—p‚µ‚ÄŽg—p‚·‚鎞ƒXƒLƒ‹–¼‚ªo‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·B(–{ŽI‚ƈႤ‚¼‚Æ‚©‚Å•¶‹å‚ª‚±‚È‚¢‚悤‚É)
-EƒXƒyƒ‹ƒuƒŒƒCƒJ[‰r¥ƒLƒƒƒ“ƒZƒ‹‚ÉŠÖŒW‚È‚­skill_db.txt‚Éݒ肳‚ê‚Ä‚éskill_type‚ªmagic‚̃XƒLƒ‹‚Ì‚Ý”j‚邱‚Æ‚ª‚Å‚«‚Ü‚·B(ƒ‰ƒOƒiƒQ[ƒg‚Ìà–¾‚ð“K—p)
-Eskill_db.txt‚Ì‘Ž®‚ª•Ï‚í‚Á‚½‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢BƒmƒbƒNƒoƒbƒN‹——£‚ÌÝ’è‚à‚Å‚«‚Ü‚·‚ª”O‚ׂ̈ɂ¢‚Á‚Ä‚¨‚«‚Ü‚·‚ªAŽI‚ł̃eƒXƒg‚ÅFW‚̃mƒbƒNƒoƒbƒN‹——£‚Í2‚ŃTƒ“ƒN‚à2‚Å‚ ‚邱‚Æ‚ðŠm”F‚µ‚Ä‚¢‚Ü‚·BŠØ‘‚Ì2003”N11ŒŽ19“úƒpƒbƒ`‘O‚ÌŽI‚Å‚Í‚ ‚è‚Ü‚·‚ª2-2‚Í“K—p‚³‚ê‚Ä‚¢‚銂Ȃ̂Ŗ{ŽI‚̈Ⴂ‚Í‚È‚¢‚ÆŽv‚¢‚Ü‚·B
-E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
-E0867‚Å‘‚«–Y‚êBƒ‚ƒ“ƒXƒ^[‚̃q[ƒ‹‚ŃAƒ“ƒfƒbƒhƒ‚ƒ“ƒXƒ^[‚ªUŒ‚‚³‚ê‚ÄŽ©–Å‚·‚é‚̂Ńq[ƒ‹‚⃊ƒU‚Ìê‡mob_skill_db.txt‚Ìval1(’l1)‚É1‚ð“ü‚ê‚é‚ƃAƒ“ƒfƒbƒhƒ‚ƒ“ƒXƒ^[‚àUŒ‚‚ðŽó‚¯‚¸‰ñ•œ‚·‚é‚悤‚É‚È‚è‚Ü‚·B–{ŽI‚ł̓‚ƒ“ƒXƒ^[‚̃q[ƒ‹‚̓Aƒ“ƒfƒbƒh‚ÉŠÖŒW‚È‚­‰ñ•œ‚·‚é‚悤‚Å‚·B‚½‚¾ŒÂl“I‚ɂ̓]ƒ“ƒr‚ªƒq[ƒ‹‚µ‚ÄŽ©–Å‚·‚é•û‚ª³‚µ‚¢‚ÆŽv‚¤‚Ì‚Åmob_skill_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ä‚¨‚è‚Ü‚·B
- (doc/)
- db_ref.txt C³B
- (db/)
- cast_db.txt C³B
- skill_db.txt C³B
- (map/)
- skill.h C³B
- skill.c
- skill_status_change_start()Askill_status_change_end() C³B
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- skill_attack()Askill_status_change_timer()Askill_castcancel() C³B
- skill_unit_onplace()Askill_use_id()Askill_castend_id() C³B
- skill_readdb() C³B
- skill_get_blewcount() ’ljÁB
- mob.c
- mobskill_use_id()Amob_spawn()Amob_attack() C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_calc_misc_attack()Abattle_weapon_attack() C³B
- clif.c
- clif_damage() C³B
- pet.c
- pet_attack() C³B
- pc.c
- pc_attack_timer()Apc_authok() C³B
- pc_spirit_heal()Apc_natural_heal_sub() C³B
-
---------------------
-//0867 by Ž€_
-
-EƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
-Ebattle_athena.conf‚Éplayer_undead_nofreeze’ljÁB
-EV‚µ‚¢ƒAƒCƒeƒ€ƒpƒPƒbƒg‚ɑΉžB(PACKETVER‚ð5ˆÈã‚É‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B)
-Emob_avail.txt‚ŃvƒŒƒCƒ„[‚ÌŽp‚ðŽw’肵‚½ŽžƒyƒRƒyƒR‚â‘é‚ð•t‚¯‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É•ÏXB“ª‰º’iŽŸ‚ɃIƒvƒVƒ‡ƒ“‚ðÝ’è‚Å‚«‚Ü‚·B(‚½‚¾ƒnƒCƒfƒBƒ“ƒO‚ƃNƒ[ƒLƒ“ƒO‚ÍŽw’è‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
- makefile C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- client_packet.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_config_read() C³B
- clif.c
- clif_mob_class_change()Aclif_spawnmob()Aclif_spawnpet() C³B
- clif_damage()Aclif_skill_damage()Aclif_skill_damage2() C³B
- clif_itemlist()Aclif_cart_itemlist()Aclif_storageitemlist() C³B
- clif_mob0078()Aclif_mob007b()Aclif_pet0078()Aclif_pet007b() C³B
- pc.c
- pc_attack_timer() C³B
- skill.c
- skill_castend_nodamage_id()Askill_additional_effect() C³B
- skill_status_change_start() C³B
- mob.h C³B
- mob.c
- mobskill_castend_id()Amob_getfriendstatus_sub() C³B
- mob_readdb_mobavail() C³B
-
---------------------
-//0866 by ‚Ò‚´‚Ü‚ñ
-
-EMOTD‚̃ƒbƒZ[ƒW‚ð‘S‚Ä•ÒW‚Å‚«‚é‚悤‚É•ÏXB
-EƒNƒ[ƒ“ƒXƒLƒ‹ŽÀ‘•B
-@ƒhƒ‹•ž‚̃q[ƒ‹ƒAƒ^ƒbƒN‚É‚æ‚éƒq[ƒ‹K“¾‚Í–¢ƒeƒXƒg‚Å‚·B
-EƒMƒ‹ƒh•ó” ‰¼ŽÀ‘•B
-@ƒ”ƒ@ƒ‹ƒLƒŠ[‚P‚Ì‚Ý‚Å‚·B
-@¤‹Æ“ŠŽ‘‚É‚æ‚é•ó” ŒÂ”‚ÌŽZoŽ®‚Í“K“–‚Å‚·(‰ŠúŒÂ”4ŒÂ‚Æ‚µ‚©’m‚ç‚È‚¢‚Ì‚Å)B
-@OnclockƒCƒxƒ“ƒg‚Å“®ì‚³‚¹‚Ä‚¢‚Ü‚·B”CˆÓ‚ÌŽž‚É•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
-EAthenaDBŒv‰æ‚Ìmob_db.txt‚Æmapflag.txt‚ð“ü‚ê‚Ä‚¨‚«‚Ü‚µ‚½B
-
- (map/)
- pc.c
- pc_makesavestatus()Apc_calc_skilltree() C³B
- pc_allskillup()Apc_calc_skillpoint() C³B
- pc_resetskill()Apc_authok() C³B
- skill.c
- skill_attack() C³B
- map.h C³B
- (conf/)
- gvg/TEST_prtg_cas01_AbraiJ.txt C³B
- motd.txt C³B
- mapflag.txt C³B
- (db/)
- mob_db.txt C³B
-
---------------------
-//0865 by ‚Ò‚´‚Ü‚ñ
-
-EŽ©•ª‚ªè—Ì‚µ‚Ä‚¢‚éƒAƒWƒg‚̃Gƒ“ƒyƒŠƒEƒ€‚ðUŒ‚‚Å‚«‚½ƒoƒOC³B
-EƒAƒuƒ‰ƒC‚ªè—̃Mƒ‹ƒhƒƒ“ƒo[‘Sˆõ‚ðƒ}ƒXƒ^[‚Æ‚Ý‚È‚µ‚Ä‚¢‚½ƒoƒOC³B
-@‚±‚ÌC³‚É”º‚Á‚ăXƒNƒŠƒvƒgƒŠƒtƒ@ƒŒƒ“ƒX‚ɉü•Ï‚ª‚ ‚è‚Ü‚·B
- Egetcharid(0)‚ÅAŽ©•ª‚ÌcharID‚ð•Ô‚·‚悤‚ÉB
- Egetguildmasterid(<n>)’ljÁB
- @<n>=ƒMƒ‹ƒhID
- @ŠY“–ƒMƒ‹ƒh‚̃}ƒXƒ^[‚ÌcharID‚ð•Ô‚µ‚Ü‚·B
-
- (map/)
- guild.c
- guild_mapname2gc() ’ljÁB
- battle.c
- battle_calc_damage() C³B
- script.c
- buildin_getcharid() C³B
- buildin_getguildmasterid() ’ljÁB
- ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾‚̈ꕔ‚ðC³A’ljÁB
- guild.h C³B
-
---------------------
-//0864 by ŒÓ’±—–
-
-EinterŽI‚Ìwis‚̈—•ÏX
- EŽ©‘OƒŠƒ“ƒNƒŠƒXƒg‚©‚çdb.h‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚éƒf[ƒ^ƒx[ƒX‚ðŽg—p‚·‚é‚悤‚É
- EWIS‚ÌID‚ð16ƒrƒbƒg‚©‚ç32ƒrƒbƒg‚É‘‚₵‚½iƒpƒPƒbƒg‚àC³j
- EƒƒbƒZ[ƒW‚̃TƒCƒYƒ`ƒFƒbƒN‚ð“ü‚ꂽ
- EƒpƒPƒbƒgƒXƒLƒbƒv‚ª“ñ‰ñs‚í‚ê‚é‰Â”\«‚ª‚ ‚éƒoƒOC³
-
- (char/)
- inter.c
- wisŠÖŒW‘å••ÏX
- (map/)
- intif.c
- wisŠÖŒW‚ÌC³BŽå‚ɃpƒPƒbƒgˆ—B
- (doc/)
- inter_server_packet.txt
- ƒpƒPƒbƒg3002,3801‚ð•ÏX
-
---------------------
-//0863 by Ž€_
-
-Eׂ©‚¢C³B
-Ebattle_athena.conf‚Éplayer_attack_direction_change’ljÁB
-Emob_skill_db.txt‚ðC³‚·‚鎞’§”­‚ÌC³‚ðŠÔˆá‚Á‚ÄC³B
-Eƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹Ž©”š–â‘èC³B(–¢ƒeƒXƒg)
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- mob_skill_db.txt C³B
- (map/)
- mob.c
- mobskill_use_id()Amobskill_use()Amobskill_castend_id() C³B
- pc.c
- pc_skill()Apc_attack_timer() C³B
- skill.c
- skill_castend_damage_id() C³B
- battle.h C³B
- battle.c
- battle_weapon_attack()Abattle_config_read() C³B
-
---------------------
-//0862 by ŒÓ’±—–
-
-EmobƒXƒLƒ‹Žg—pðŒ’ljÁ
- Efriendhpltmaxrate : –¡•û‚ÌHP‚ªŽw’è“–¢–ž‚Ì‚Æ‚«(ƒeƒXƒgÏ‚Ý)
- Efriendstatuson : –¡•û‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚é‚Æ‚«
- Efriendstatusoff : –¡•û‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚È‚¢‚Æ‚«
- Emystatuson : Ž©•ª‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚é‚Æ‚«
- Emystatusoff : Ž©•ª‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚È‚¢‚Æ‚«
- ƒXƒe[ƒ^ƒXŒn‚Í–¢ƒeƒXƒg‚Å‚·Bmob_skill_db.txt‚ÉŽw’è•û–@‚ð‘‚¢‚Ä‚¢‚Ü‚·B
- ‚½‚Æ‚¦‚ÎŽ©•ª‚ª“Å‚©‚Ç‚¤‚©‚Í mystatus,poison ‚ÅA
- ƒnƒCƒfƒBƒ“ƒO’†‚©‚Ç‚¤‚©‚Í mystatuson,hiding ‚ÅŽw’肵‚Ü‚·B
-EmobƒXƒLƒ‹Žg—pƒ^[ƒQƒbƒg’ljÁ
- Efriend : –¡•û
- Earound : Ž©•ª‚ÌŽüˆÍiŒ»Ý‚ÌŽd—l‚Å‚ÍŽüˆÍ81ƒ}ƒXj‚Ì‚Ç‚ê‚©
- Earound1`around4 : Ž©•ª‚ÌŽüˆÍ‚X,25,49,81ƒ}ƒX‚Ì‚Ç‚ê‚©(”͈͂𖾎¦)
- friend‚ÍðŒ‚ªfriendŒn(friendhpltmaxrate‚È‚Ç)‚Ì‚Æ‚«‚ÉŽg—p‰Â”\B
- aroundŒn‚Íꊎw’èƒXƒLƒ‹‚ÅŽg—p‰Â”\B
-
- (map/)
- mob.c / mob.h
- mob_getfriend*()’ljÁAmobskill_use()C³‚È‚Ç
- (db/)
- mob_skill_db.txt
- ʼn‚Ìà–¾‚Ì‚ÝC³Bƒf[ƒ^‚ÍC³‚µ‚Ä‚¢‚Ü‚¹‚ñB
-
---------------------
-//0861 by ‚¢‚Ç
-
-EƒT[ƒo[snapshot
-
---------------------
-//0860 by J
-
-EŽ€_‚³‚ñ‚̎艺¢Š«‚ÌC³‚ɇ‚킹‚ÄMOBƒXƒLƒ‹DB‚ðC³
-(/conf)
- mob_skill_db.txt C³B
-
---------------------
-//0859 by Ž‚Žqo^.^o
-Alchemist warp C³(AegisŽQl)
-(/conf)
- (/warp)
- npc_warp_job.txt C³
-
---------------------
-//0858 by Ž€_
-
-Eׂ©‚¢C³B
-EMAX_MOBSKILL‚ð24‚©‚ç32‚É•ÏXB(‚½‚¾­‚µ‚Å‚·‚ª‚Ü‚½ƒƒ‚ƒŠ[Žg—p—Ê‚ª‘‚¦‚Ü‚·B)
-Eƒvƒƒ{ƒP[ƒVƒ‡ƒ“‚ÅŽæ‚és“®‚ðmob_skill_db.txt‚Ìval1(’l1)‚ÅÝ’è‚Å‚«‚é‚悤‚ÉC³B
-EŽè‰º¢Š«‚Å•¡”‚ÌŽí—Þ‚ðÝ’èoØ‚é‚悤‚ÉC³B(Å‘å5‚‚܂Å)
-Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚ƃgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“‚à•¡”‚ÌŽí—Þ‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
- (db/)
- skill_db.txt C³B
- mob_skill_db.txt C³B
- (map/)
- skill.c
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- map.h C³B
- mob.h C³B
- mob.c
- mob_readskilldb()Amob_summonslave()Amob_class_change() C³B
-
---------------------
-//0857 by J
-
-EOWN Ragnarok‚É‚Ì‚Á‚Ä‚¢‚½î•ñ‚ðŒ³‚ÉMOBƒXƒLƒ‹‚ðC³B
-Echase(“ËŒ‚)‚ªŽÀ‘•‚³‚ê‚Ä‚¢‚é‚Æ‚Ì‚±‚Æ‚È‚Ì‚Å“ËŒ‚(?)‚ðchase‚É‚©‚¦‚Ä
-ƒRƒƒ“ƒgƒAƒEƒg‚ð‚Í‚¸‚µ‚Ü‚µ‚½B
-EŽ€_‚³‚ñ‚ªŽÀ‘•‚µ‚½MOBƒXƒLƒ‹‚ðŽg—p‚·‚郂ƒ“ƒXƒ^[‚ðŽëêî•ñ‚ÉÚ‚Á‚Ä‚éî•ñ‚ðŒ³‚ÉŽÀ‘•B
- (/conf)
- mob_skill_db.txt
-
---------------------
-//0856 by Ž€_
-
-EƒoƒOC³‚Æׂ©‚¢C³B
-Ebattle_athena.conf‚Émonster_attack_direction_change’ljÁB
-Ebattle_athena.conf‚Ìbasic_skill_check‚ƃJƒvƒ‰‚Ì‘qŒÉ—˜—p‚ð‡‚킹‚Ä‚¢‚Ü‚µ‚½‚ª‚¢‚‚̂܂ɂ©‚È‚­‚È‚Á‚½‚Ì‚ÅŽæ‚è–ß‚µB(basic_skill_check‚ªno‚È‚çŠî–{‹@”\ƒXƒLƒ‹ƒŒƒxƒ‹‚ÉŠÖŒW‚È‚­‘qŒÉ‚ðŽg‚¦‚Ü‚·B)
-EƒsƒA[ƒVƒ“ƒOƒAƒ^ƒbƒN‚ÌŽË’ö‚ð3ƒZƒ‹‚É•ÏX‚µ‚Ä‹ßÚUŒ‚‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚ÉC³B
-EAŽI‚ł̃eƒXƒg‚ŃAƒ“ƒfƒbƒh‚Ì”FŽ¯‚ð‘®«‚É‚æ‚Á‚Ä‚·‚邱‚Æ‚ª‚í‚©‚Á‚½‚Ì‚Åundead_detect_type‚̃fƒtƒHƒ‹ƒg‚ð0‚É•ÏXB
-Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚âƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“‚ÅŒ©‚½–Ú‚ªƒvƒŒƒCƒ„[‚È‚ç0x1b0ƒpƒPƒbƒg‚ð‘—‚ç‚È‚¢‚悤‚É•ÏXB
-Eƒjƒ…[ƒ}ƒoƒO‚ÍC³‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŽžŠÔ‚É‚æ‚éì“®Žd—l‚Í‚Ü‚¾•ªÍ‚ªŠ®‘S‚¶‚á‚È‚¢‚Ì‚Å‘¼‚Ì•s‹ï‡‚ªo‚Ä‚­‚é‚©‚à...
- (conf/)
- battle_athena.conf C³B
- mapflag.txt C³B(•’ʂ̃_ƒ“ƒWƒ‡ƒ“‚ªƒV[ƒYƒ‚[ƒh‚Å‚ ‚é‚Í‚¸‚ª‚È‚¢‚Ì‚Å)
- (conf/npc/)
- npc_town_kafra.txt C³B
- (db/)
- skill_db.txt C³B
- (doc/)
- conf_ref.txt C³B
- script_ref.txt C³B
- (map/)
- pc.c
- pc_modifybuyvalue()Apc_modifysellvalue() C³B
- battle.h
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
- battle_config_read() C³B
- skill.c
- skill_unitsetting()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id() C³B
- mob.c
- mob_attack() C³B
- pet.c
- pet_attack() C³B
- clif.c
- mob_class_change() C³B
-
---------------------
-//0855 by asong
-
-Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚Å‚o‚b‚Æ‚µ‚Ä•\Ž¦‚·‚é‚l‚n‚a‚ðŽw’肵‚½ê‡‘q—Ž‚¿‚·‚éƒoƒO‚ðuŽb’èvC³B
-E0x1b0ƒpƒP‚Å‚Í–³‚­0x7b‚ðŽg‚¤‚±‚Ƃʼn½‚Æ‚©‚µ‚Ä‚¢‚Ü‚·B
-EŽg‚¢•ª‚¯‚ð‚µ‚½‚¢‚Æ‚±‚ë‚Å‚·‚ª“–•û‚b‚Ì’mŽ¯‚ª–³‚­ðŒ•ªŠò‚ªãŽè‚­‚¢‚«‚Ü‚¹‚ñ‚Å‚µ‚½B
-E‚à‚µ‚©‚µ‚½‚çƒvƒp‚Ì›z‰»i‰H‰»Hj‚ª‚¨‚©‚µ‚­‚È‚Á‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- (/map)
- clif.c
- mob_class_change() C³B
-
---------------------
-//0854 by Kalen
-
-E•s‘«‚µ‚Ä‚¢‚½ˆêŽŸE“]EƒNƒGƒXƒg’ljÁ‹y‚ÑA‚»‚ê‚É”º‚¤WarpAMobC³)
- (/conf)
- (/npc)
- npc_job_archer.txt
- npc_job_swordman.txt
- npc_job_thief.txt(‘䎌C³A“_”ˆ—•ÏX)
- npc_job_magician.txt
- (/warp)
- npc_warp25.txt(ˆê•”ˆÚ“®)
- npc_warp.txt(ˆê•”ˆÚ“®)
- npc_warp_job.txt(VÝ)
- (/mob)
- npc_mob_job.txt
-E—Õ‚èQuest’ljÁ‹y‚ÑA‚»‚ê‚É”º‚¤NPCC³BƒAƒ}ƒcs‚«‘D‚Å—¿‹à‚ðŽæ‚ç‚È‚©‚Á‚½–â‘èC³
- (/conf)
- npc_event_hinamatsuri.txt
- npc_town_amatsu.txt
- npc_town_guide.txt
- npc_town_kafra.txt
- —Õ‚è‚ð—LŒø‚É‚·‚é‚ƃAƒ}ƒcƒJƒvƒ‰‚ðW‚ÉA
- ƒAƒ‹ƒxƒ‹ƒ^“ìƒJƒvƒ‰‚ð휂ɂ·‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·B
-
---------------------
-//0853 by Ž€_
-
-EƒoƒOC³‚ÆNPCƒXƒLƒ‹ŠÖŒW‚ÌC³B
-Eƒ_[ƒNƒuƒŒƒX‚ðMISCUŒ‚‚É•ÏXB(‚½‚¾–½’†”»’è—L‚è)
-EƒNƒŠƒeƒBƒJƒ‹ƒXƒ‰ƒbƒVƒ…AƒRƒ“ƒ{ƒAƒ^ƒbƒNAƒKƒCƒfƒbƒhƒAƒ^ƒbƒNAƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒNAƒuƒ‰ƒCƒ“ƒhƒAƒ^ƒbƒNAƒJ[ƒXƒAƒ^ƒbƒNAƒyƒgƒŠƒtƒ@ƒCƒAƒ^ƒbƒNAƒ|ƒCƒYƒ“ƒAƒ^ƒbƒNAƒTƒCƒŒƒ“ƒXƒAƒ^ƒbƒNAƒXƒŠ[ƒvƒAƒ^ƒbƒNAƒXƒ^ƒ“ƒAƒ^ƒbƒNAƒ‰ƒ“ƒ_ƒ€ƒAƒ^ƒbƒNAƒ_[ƒNƒlƒXƒAƒ^ƒbƒNAƒtƒ@ƒCƒAƒAƒ^ƒbƒNAƒOƒ‰ƒEƒ“ƒhƒAƒ^ƒbƒNAƒz[ƒŠ[ƒAƒ^ƒbƒNAƒ|ƒCƒYƒ“ƒAƒ^ƒbƒNAƒeƒŒƒLƒlƒXƒAƒ^ƒbƒNAƒEƒH[ƒ^[ƒAƒ^ƒbƒNAƒEƒBƒ“ƒhƒAƒ^ƒbƒNAƒ}ƒWƒJƒ‹ƒAƒ^ƒbƒNAƒuƒ‰ƒbƒhƒhƒŒƒCƒ“Aƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[‚̓‚ƒ“ƒXƒ^[‚Ì•ŠíŽË’ö‚É•ÏXB‚»‚µ‚Ä‚±‚ê‚ç‚̃XƒLƒ‹‚ðƒ‚ƒ“ƒXƒ^[‚ÌUŒ‚ŽË’ö‚É‚æ‚Á‚ĉ“‹——£UŒ‚‚Æ‹ß‹——£UŒ‚‚É‚È‚é‚悤‚É•ÏXB
-EƒsƒA[ƒVƒ“ƒOƒAƒ^ƒbƒN‚Í•ŠíŽË’ö+2‚É•ÏXB
-EƒGƒiƒW[ƒhƒŒƒCƒ“Aƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“‚Í–‚–@ŽË’ö‚É•ÏXB
-Eƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO‚ÌŽË’ö‚ð4‚É•ÏX‚Æ‚©‚©‚éŠm—¦‚ð50+ƒXƒLƒ‹ƒŒƒxƒ‹*5%‚É•ÏXB(ˆê‰ž‚±‚ê‚à–‚–@‚È‚Ì‚Å­‚µŽË’ö‚ðL‚­‚µ‚Ü‚µ‚½BŠî–{–‚–@ŽË’ö‚Å‚ ‚é8‚É•Ï‚¦‚é‚ׂ«‚È‚Ì‚©‚Ç‚¤‚©‚Í”÷–­...)
-EƒKƒCƒfƒbƒhƒAƒ^ƒbƒN‚̓ZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚𖳌ø‚É‚·‚é•ñ‚ª‚ ‚è‚Ü‚µ‚½‚̂ŃZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚ªŒø‚©‚È‚¢‚悤‚ÉC³B
-EƒfƒBƒtƒFƒ“ƒ_[‚̓GƒtƒFƒNƒg‚¾‚¯o‚é‚悤‚ÉC³B(ƒXƒLƒ‹‚ÌŽd—l“™‚ð‚í‚©‚é•û‚Íî•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
-Eƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“ŽÀ‘•B(ƒƒ^ƒ‚[ƒtƒHƒVƒX‚Æ“¯‚¶•¨‚¾‚»‚¤‚Å‚·B‚½‚¾‚±‚ê‚Í‘S‘RŠÖŒW‚È‚¢•Ê‚̃‚ƒ“ƒXƒ^[‚ɂȂ镨‚炵‚¢‚Å‚·Bƒjƒtƒ‹ƒwƒCƒ€‚ÉŽg‚¤‚â‚‚ª‚¢‚é‚Ý‚½‚¢‚Å‚·B)
-EAthenaŽG’kƒXƒŒƒbƒh ‘´‚Ì“ó‚Ì80‚ðscript_ref.txt‚Æ‚µ‚ĒljÁ‚Æ‚¿‚å‚Á‚ÆC³B
- (db/)
- skill_db.txt C³B
- (doc/)
- script_ref.txt ’ljÁB
- (map/)
- battle.c
- battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
- skill.c
- castend_damage_id()Acastend_nodamage_id()Askill_use_pos() C³B
- clif.c
- clif_spawnnpc()Aclif_parse_Restart()Aclif_parse_QuitGame() C³B
- mob.c
- mobskill_castend_id()Amobskill_castend_pos() C³B
- mobskill_use_id()Amobskill_use_pos() C³B
-
---------------------
-//0852 by ‚Ò‚´‚Ü‚ñ
-
-E‹T“‡4FE‹aD2FEƒAƒ}ƒcD1F‚ðƒeƒŒƒ|•s‰ÂAƒV[ƒYƒ‚[ƒh‚É•ÏXB
-Enosave‚̈ø”‚ÉSavePoint‚ªŽw’è‚Å‚«‚Ä‚È‚©‚Á‚½‚̂ŒljÁB
-EPVP‚Ìmapflag‚ðmapflag.txt‚É“‡B
- (map/)
- npc.c
- npc_parse_mapflag() C³B
- (conf/)
- mapflag.txt C³B
- npc/npc_pvp.txt C³B
-
---------------------
-//0851 by ŒÓ’±—–
-
-EƒƒOƒCƒ“Žž‚̈Ɖ»key‚ªí‚É“¯‚¶‚Æ‚¢‚¤‘å‚«‚È–â‘肪‚ ‚Á‚½‚Ì‚ÅC³
-EƒƒOƒCƒ“ŠÇ—ŽÒƒƒOƒCƒ“(ladmin‚ÅŽg—p)‚ŃpƒXƒ[ƒh‚̈Ɖ»‚ɑΉž
- (login/)
- login.c
- login_session_dataì¬AˆÃ†‰»key‚ðƒNƒ‰ƒCƒAƒ“ƒg‚²‚Æ‚É쬂ȂÇ
- (tool/)
- ladmin
- ver.1.05‚ÉBƒfƒtƒHƒ‹ƒg‚ŃpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é‚悤‚ÉB
- ˆÃ†‰»‚Ì‚½‚ß‚ÉDigest::MD5ƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚µ‚Ü‚·B
- Digest::MD5‚ª–³‚¢ê‡‚̓pƒXƒ[ƒh‚̈Ɖ»‚ðs‚¢‚Ü‚¹‚ñB
- (doc/)
- admin_packet.txt
- ƒƒOƒCƒ“ƒT[ƒo[ŠÇ—ƒƒOƒCƒ“•”•ª•ÏX
-
---------------------
-//0850 by Ž€_
-
-ENPCƒXƒLƒ‹ŽÀ‘•B(ƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“AƒL[ƒsƒ“ƒOAƒŠƒbƒNAƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[Aƒvƒƒ{ƒP[ƒVƒ‡ƒ“AƒoƒŠƒ„[Aƒ_[ƒNƒuƒŒƒbƒVƒ“ƒOAƒ_[ƒNƒuƒŒƒX)
-EƒXƒLƒ‹Ž©”š‚̧ŒÀ‚Ímob_skill_db.txt‚Å‚â‚ê‚΂¢‚¢‚à‚Ì‚È‚Ì‚ÅŽæ‚è–ß‚µB
-Ebattle_athena.conf‚Épet_hungry_friendly_decrease’ljÁB
-Eƒyƒbƒg‚Ì• ‚ªŠ®‘S‚ÉŒ¸‚é‚ÆŽx‰‡UŒ‚‚𒆎~‚·‚é‚悤‚É•ÏXB
-E‘®«•ÏXƒXƒLƒ‹‚ªì“®‚µ‚È‚©‚Á‚½–â‘èC³B
-Eƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[‚Í10+ƒXƒLƒ‹ƒŒƒxƒ‹*5%‚ÌSP‚ðŒ¸‚ç‚·B(UŒ‚‚Í’Êí•ŠíƒXƒLƒ‹UŒ‚)
-EƒŠƒbƒN‚Í•K’†‚ÅSP-100AƒXƒ^ƒ“Šm—¦ƒXƒLƒ‹ƒŒƒxƒ‹*5%B(ƒ_ƒ[ƒW‚Í–³‚µAbNoWeaponDamage‚Å–³Œø)
-Eƒvƒƒ{ƒP[ƒVƒ‡ƒ“‚̓‚[ƒVƒ‡ƒ“‚ª€”õ‚³‚ê‚Ä‚È‚¢ƒ‚ƒ“ƒXƒ^[‚Í“ü‚ê‚Ä‚à‚È‚ñ‚ÌŒø‰Ê‚à‚È‚µB
-Eƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO‚Í‚©‚©‚é‚ÆHP‚ª1‚É‚È‚éB‘Ï«‚Í–‚–@–hŒä‚Å“K—pB
-Eƒ_[ƒNƒuƒŒƒX‚Í500+(ƒXƒLƒ‹ƒŒƒxƒ‹-1)*1000+rand(0,1000)‚̃_ƒ[ƒWB‰ñ”ð‚Å‚«‚邪–hŒä–³Ž‹‚Å‹ß‹——£•¨—UŒ‚‚¾‚ªƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚Í–³Ž‹‚µ‚Ĉő®«UŒ‚B(–{ŽI‚ÌŒvŽZŽ®‚É‚ ‚Á‚Ä‚¢‚é‰Â”\«‚Í‚È‚¢‚©‚àB‚½‚¾ƒ_ƒ[ƒW—Ê‚Æ–½’†•â³ˆÈŠO‚Í–{ŽI‡‚킹)
-ENPCƒXƒLƒ‹‚̈ێŽžŠÔ‚Í“K“x‚ÉÝ’èB
-Eƒ‚ƒ“ƒXƒ^[‚Ì‘®«UŒ‚‚ƃKƒCƒfƒbƒhƒAƒ^ƒbƒN‚ªƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚𖳎‹‚·‚é‚Æ‚Ì•ñ‚ðŽó‚¯‚½‚Ì‚Å‚·‚ªC³‚·‚é‚©‚Ç‚¤‚©‚Í‚¿‚å‚Á‚Æ”÷–­B(ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN‚àƒZƒCƒtƒeƒBƒEƒH[ƒ‹–³Ž‹‚©‚à)
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- cast_db.txt C³B
- skill_db.txt C³B
- (map/)
- mob.c
- mob_damage() C³B
- clif.h C³B
- clif.c
- clif_skill_estimation()Aclif_damage()Aclif_skill_damage() C³B
- clif_skill_damage2()Aclif_pet_performance() C³B
- pet.c
- pet_performance()Apet_target_check()Apet_hungry() C³B
- skill.h C³B
- skill.c
- skill_additional_effect()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_status_change_start() C³B
- battle.h C³B
- battle.c
- battle_get_def()Abattle_get_mdef()Abattle_calc_damage() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_config_read() C³B
-
---------------------
-//0849 by lapis
-
-EŠX’†‚̃eƒXƒgƒMƒ‹ƒhƒtƒ‰ƒO‚Ì•\Ž¦‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³B
-EƒMƒ‹ƒhƒƒ“ƒo[‚ÍŠø‚©‚çƒAƒWƒg‚É”ò‚ׂé‚悤‚ÉC³B
- (conf/gvg)
- TEST_prtg_cas01_AbraiJ.txt C³B
-
---------------------
-//0848 by huge
-
-EƒXƒLƒ‹Ž©”š‚ðAHP‚ª‘S‰ñ•œ‚µ‚Ä‚¢‚鎞‚ÍŽg‚¦‚È‚¢‚悤C³B
-EƒXƒtƒBƒAƒ}ƒCƒ“EƒoƒCƒIƒvƒ‰ƒ“ƒgEEEƒ^[ƒQƒbƒg•ÏX‚Å‚«‚È‚¢...B
-Emob‚Ƀ^[ƒQƒbƒg–³Ž‹ID‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B(Gv—pmob‚ÉŽg‚¦‚éH)
- (map/)
- map.h C³B
- mob_data‚É int exclusion_src,exclusion_party,exclusion_guild ’ljÁB
- mob.h C³B
- mob.c
- mob_exclusion_add() ’ljÁB
- mob_exclusion_check() ’ljÁB
- mob_timer_delete() ’ljÁB
- mob_attack() C³B
- mob_target() C³B
- mob_ai_sub_hard_activesearch() C³B
- mob_ai_sub_hard_mastersearch() C³B
- mob_ai_sub_hard() C³B
- skill.c
- skill_castend_damage_id() C³B
- skill_castend_pos2() C³B
-
---------------------
-//0847 by Ž€_
-
-E˜I“XƒoƒOC³B
- (map/)
- clif.c
- clif_vendinglist()Aclif_openvending() C³B
- vending.c
- vending_openvending() C³B
- skill.c
- skill_castend_nodamage_id() C³B
-
---------------------
-//0846 by Ž€_
-
-EƒoƒOC³‚Æׂ©‚¢C³B
-Ebattle_athena.conf‚Ìenemy_str‚ªƒyƒbƒg‚É‚à“K—p‚·‚é‚悤‚É•ÏXB
-EbHPDrainRate‚ÆbSPDrainRate‚Åx‚ªƒ}ƒCƒiƒX‚Å‚àì“®‚·‚é‚悤‚É•ÏXB
-EPC‚âNPC‚ÌŽp‚ð‚µ‚½ƒ‚ƒ“ƒXƒ^[‚àŽ€‚Ê‚Æ5•bŒãƒ}ƒbƒv‚©‚çÁ‚¦‚é‚悤‚É•ÏXB
- (map/)
- battle.c
- battle_calc_pet_weapon_attack()Abattle_weapon_attack() C³B
- skill.c
- skill_attack()Askill_castend_damage_id() C³B
- pc.c
- pc_allskillup() C³B
- clif.h C³B
- clif.c
- clif_openvending()Ado_init_clif() C³B
- clif_clearchar_delay()Aclif_clearchar_delay_sub() ’ljÁB
- mob.c
- mob_damage() C³B
-
---------------------
-//0845 by ‚Û‚Û‚Û
-
-Emob_avail.txt‚ÅPCƒOƒ‰ƒtƒBƒbƒN(0`23)‚ðŽw’肵‚½ƒyƒbƒg‚ªoŒ»‚µ‚½‚Æ‚«ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ª‚Å‚é‚Ì‚ðŽb’èC³B
-Emob_avail.txt‚Ńyƒbƒg‚É‚àPCƒLƒƒƒ‰‚Ì«•ÊE”¯Œ^&FE•ŠíE‚E“ª‘•”õ‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
-EMOB‚ÌATKŒvŽZ‚ÉSTR‚ð“K—p‚·‚é‚©‚Ç‚¤‚©Ý’è‰Â”\‚É‚µ‚½B
- (map/)
- clif.c
- clif_pet0078()Aclif_pet007b()Aclif_spawnpet()C³B
- battle.hC³B
- battle.c
- battle_config_read()Abattle_calc_mob_weapon_attack()C³B
-
---------------------
-//0844 by ‚Û‚Û‚Û
-
-Emob_avail.txt‚ÅPCƒOƒ‰ƒtƒBƒbƒN(0`23)‚ðŽw’肵‚½MOB‚ªoŒ»‚µ‚½‚Æ‚«ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ª‚Å‚é‚Ì‚ðŽb’èC³B
-Emob_avail.txt‚ÅPCƒLƒƒƒ‰‚Ì«•ÊE”¯Œ^&FE•ŠíE‚E“ª‘•”õ‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
-@ƒOƒ‰ƒtƒBƒbƒN‚·‚è‘Ö‚¦æID‚ª0`23‚ÌŽž‚¾‚¯—LŒø‚ÅAŽw’è•û–@‚Í
- MOB-ID,ƒOƒ‰ƒtƒBƒbƒN‚·‚è‘Ö‚¦æID,«•Ê(0=female,1=male),”¯Œ^,”¯F,•Ší,‚,ã’i“ª‘•”õ,’†’i“ª‘•”õ,‰º’i“ª‘•”õ
-@‚Æ‚È‚è‚Ü‚·B‘•”õ‚Íitem_db‚ÌView—“ŽQÆ‚Ì‚±‚ÆB
- (map/)
- clif.c
- clif_mob_0078()Aclif_mob007b()Aclif_spawnmob()C³B
- mob.hC³B
- mob.c
- mob_get_sex()Amob_get_hair()Amob_get_hair_color()Aob_get_weapon()A
- mob_get_shield()Amob_get_head_top()Amob_get_head_mid()Amob_get_head_buttom()’ljÁB
- mob_readdb()Amob_readdb_mobavail()C³B
-
---------------------
-//0843 by Ž€_
-
-EƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒhŽÀ‘•B
-EƒAƒCƒeƒ€ƒXƒNƒŠƒvƒg‚ÉbShortWeaponDamageReturn‚Æ
-bLongWeaponDamageReturn ’ljÁB
-E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚⑼‚ÌŠC³B
- (db/)
- item_db.txt C³B
- skill_db.txt C³B
- cast_db.txt C³B
- const.txt C³B
- (doc/)
- item_bonus.txt C³B
- (map/)
- map.h C³B
- battle.c
- battle_get_def()Abattle_get_def2()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack()Abattle_calc_magic_attack() C³B
- pc.c
- pc_calcstatus()Apc_bonus()Apc_bonus2()Apc_equipitem() C³B
- pc_unequipitem()Apc_checkallowskill() C³B
- skill.c
- skill_attack()Askill_unit_onplace()Askill_status_change_start() C³B
- skill_status_change_end()Askill_status_change_timer() C³B
- skill_castend_nodamage_id() C³B
- clif.c
- clif_additem()Aclif_equiplist()Aclif_storageequiplist() C³B
- clif_tradeadditem()Aclif_storageitemadded()Aclif_cart_additem() C³B
- clif_cart_equiplist()Aclif_vendinglist()Aclif_openvending() C³B
- clif_damage()Aclif_skill_damage()Aclif_parse_LoadEndAck() C³B
-
---------------------
-//0842 by Ž€_
-
-EƒXƒLƒ‹ŠÖŒW‚ÌC³‚Æׂ©‚¢C³B
-EaegisŽI‚ÅFX‚ÆŒŸØ‚µ‚½•¨‚ð“K—pB
-EƒƒeƒI‚͈̔͂ð7*7ALoV13*13ASG11*11AFN5*5‚ÉC³B
-EƒVƒOƒiƒ€ŽÀ‘•B(‚½‚¾PVP‚ŃvƒŒƒCƒ„[‚É‚©‚©‚é‚©‚Ç‚¤‚©‚ª‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å
-‚©‚©‚é•ûŒü‚ÅŽÀ‘•B)‚±‚ê‚Å1ŽŸE‹Æ‚̃XƒLƒ‹‚̓NƒŠƒA‚©‚à...
-E‘•”õƒXƒNƒŠƒvƒg‚ÉbHPDrainRate‚ÆbSPDrainRate’ljÁB
-E‚»‚Ì‘¼×‚©‚¢C³­‚µB
- (doc/)
- item_bonus.txt C³B
- (db/)
- cast_db.txt C³B
- item_db.txt C³B
- const.txt C³B
- (map/)
- map.h C³B
- skill.c
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- skill_unitsetting()Askill_castend_pos2()Askill_castend_id() C³B
- skill_status_change_start()Askill_status_change_timer() C³B
- skill_status_change_end()Askill_unit_onplace() C³B
- skill_frostjoke_scream()Askill_attack() C³B
- skill_attack_area() ’ljÁB
- battle.c
- battle_calc_magic_attack()Abattle_get_element()Abattle_get_def() C³B
- battle_get_def2()Abattle_get_mdef()Abattle_damage() C³B
- battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack() C³B
- mob.c
- mobskill_castend_id() C³B
- pc.c
- pc_calcstatus()Apc_bonus2()Apc_attack_timer() C³B
- clif.c
- clif_spawnmob()Aclif_spawnpet()Aclif_spawnnpc() C³B
- clif_parse_ActionRequest() C³B
-
---------------------
-//0841 by Kalen
-
-E…—n‰t‚ªì‚ê‚È‚©‚Á‚½‚̂ŒljÁ
- conf/npc/npc_job_magician.txt
-
---------------------
-//0840 by Kalen
-
-E‹SƒCƒxƒ“ƒg’ljÁ
- conf/npc/npc_event_oni.txt
-
-Emap_athena.confC³(ƒoƒŒƒ“ƒ^ƒCƒ“ƒRƒƒ“ƒgƒAƒEƒgB‹S’ljÁ)
- conf/map_athena.conf
-
---------------------
-//0839 by shuto
-
-EƒRƒ“ƒƒ“NPC’ljÁ(ƒJƒ“ ƒ\ƒ“ƒ\ƒ“‚ª”²‚¯‚Ä‚½)
-
---------------------
-//0838 by Ž€_
-
-EƒXƒLƒ‹ƒTƒCƒgƒ‰ƒbƒVƒƒ[ŽÀ‘•B
-Eƒ‚ƒ“ƒXƒ^[‚̃Nƒ[ƒLƒ“ƒO‚ƃ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ÍŽ‘±ŽžŠÔ‚ðƒŒƒxƒ‹*5•b‚É•ÏXB
-E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
- (db/)
- skill_db.txt C³B
- (map/)
- skill.c
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- skill_castend_pos2()Askill_unitsetting()Askill_get_unit_id() C³B
- skill_status_change_start() C³B
- battle.c
- battle_calc_magic_attack() C³B
-
---------------------
-//0837 by Ž€_
-
-EƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
-EƒtƒƒXƒgƒmƒ”ƒ@‚ðƒ†ƒjƒbƒgÝ’uŽ®‚É•ÏXB
-Eƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚͈̔͂ð11*11‚ÉC³‚Æ40ƒqƒbƒg‚·‚é‚悤‚É•ÏXB(ƒ‰ƒOƒiƒQ[ƒg‚Ìî•ñB
-13*13à‚à‚ ‚è‚Ü‚·‚ª...)
-Eƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[‚̃mƒbƒNƒoƒbƒN‚ð2~7‚É•ÏXB
-EƒXƒg[ƒ€ƒKƒXƒg‚ÌUŒ‚‰ñ”‚ðƒŒƒxƒ‹ˆË‘¶‚©‚ç10‰ñ‚ɌŒèB
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚̃mƒbƒNƒoƒbƒN‚ð3‚©‚ç2‚É•ÏXB(aegisŽI‚ŃmƒbƒNƒoƒbƒN‚ª‚ ‚邱‚Æ‚ÍŠm”F‚µ‚Ü‚µ‚½‚ª‚Ç‚ê‚®‚ç‚¢‚È‚Ì‚©‚ª•s–¾‚¾‚Á‚½‚Ì‚Å­‚µŒ¸‚炵‚Ä‚Ý‚Ü‚µ‚½B)
-Eƒ‚ƒ“ƒXƒ^[‚̉r¥ŽžŠÔ‚ª‘‚­‚È‚Á‚Ä‚¢‚½–â‘èC³B(dex•â³‚ª“ü‚Á‚Ä‚µ‚Ü‚Á‚½‚¹‚¢‚Å‚·B)
-E‚»‚Ì‘¼ƒI[ƒgƒXƒyƒ‹“–‚½‚è‚Ìׂ©‚¢C³B
- (db/)
- skill_db.txt C³B
- (map/)
- skill.c
- skill_castfix()Askill_delayfix()Askill_timerskill() C³B
- skill_castend_pos2()Askill_unitsetting()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_get_unit_id()Askill_attack() C³B
- battle.c
- battle_calc_magic_attack()Abattle_weapon_attack() C³B
-
---------------------
-//0836 by Žß‘¸
-
-Eƒ‚ƒ“ƒXƒ^[‚ÌŽæ‚芪‚«¢ŠÒ‚ÌŠÔŠu‚𒆃{ƒXˆÈŠOŠ®‘SC³B
- (db/)
- mob_skill_db.txt C³B
-
---------------------
-//0835 by (“Ê)
-
-E”’nŽæ‚è‚Ń|[ƒY‚ð‚Æ‚é‚悤‚É‚µ‚½B
-(ƒ|[ƒY‚¾‚¯‚È‚Ì‚ÅAŽÀÛ‚ÉUŒ‚‚ðŽó‚¯Ž~‚ß‚½‚è‚Í‚Å‚«‚Ü‚¹‚ñ)
-clif_bladestop()‚ðŒÄ‚Ô‚±‚Æ‚Å”’nŽæ‚èó‘Ô‚ÌONAOFF‚̃pƒPƒbƒg‚ª‘—‚ê‚Ü‚·B
-
- (map/)
- clif.h C³B
- clif,c
- clif_bladestop() ’ljÁ
- skill.c
- skill_castend_nodamage_id() C³B
-
---------------------
-//0834 by Žß‘¸
-
-Eƒ‚ƒ“ƒXƒ^[Žæ‚芪‚«¢ŠÒ‚ÌŠÔŠu‚ª’Z‚·‚¬‚é‚Æ‚ÌŽ–‚ʼnž‹}ˆ’uB(¡‰ñ‚͉©‹à峂̂Ý)
- (db/)
- mob_skill_db.txt C³B
-
---------------------
-//0833 by (“Ê)
-
-Ememo‹ÖŽ~’nˆæ‚Å/memoŽž‚ÌC³B
-E‚‚¢‚Å‚Éitem_db‚ðXVB
-
- (doc/)
- client_packet.txt
- R 0189 XVB
- (db/)
- item_db.txt ÅV”Å‚ÖXVB
- (map/)
- pc.c
- pc_memo() C³B
-
---------------------
-//0832 by Ž€_
-
-EƒR[ƒhÅ“K‰»‚Æׂ©‚¢C³B
-EƒI[ƒgƒXƒyƒ‹‚ð’n–Ê–‚–@‚ɑΉžB
-EƒTƒ“ƒ_[ƒXƒg[ƒ€‚ƃwƒ”ƒ“ƒYƒhƒ‰ƒCƒu‚ðƒ†ƒjƒbƒgÝ’uŽ®‚É•ÏXB
-EƒfƒBƒtƒFƒ“ƒ_[‚ÌUŒ‚‘¬“x’ቺ‚ð–{ŽI‚É‚ ‚킹B
-E‚»‚Ì‘¼×‚©‚¢C³B
- (doc/)
- item_bonus.txt C³B
- (db/)
- skill_require_db.txt C³B
- cast_db.txt C³B
- (map/)
- map.h C³B
- path.c
- calc_index()Apath_search() C³B
- skill.c
- skill_unitsetting()Askill_castend_pos2()Askill_get_unit_id() C³B
- skill_status_change_timer_sub()Askill_castend_nodamage_id() C³B
- skill_additional_effect()Askill_frostjoke_scream() C³B
- pc.c
- pc_calcstatus()Apc_skill()Apc_allskillup() C³B
- battle.c
- battle_get_speed()Abattle_get_adelay()Abattle_get_amotion() C³B
- battle_weapon_attack() C³B
-
---------------------
-//0831 by Ž€_
-
-E­‚µC³B
-EƒI[ƒgƒXƒyƒ‹C³B‘•”õ‚É‚æ‚镨‚ƃXƒLƒ‹‚É‚æ‚镨‚ð•ÊX‚É“K—pA”­“®Šm—¦C³B
-E‘•”õ‚É‚æ‚éƒI[ƒgƒXƒyƒ‹‚ÍŽw’肵‚½ƒŒƒxƒ‹‚æ‚è2‚‰º‚Ü‚Å”»’è‚ð‚µ‚Ü‚·B‚‚܂背ƒxƒ‹5‚ðÝ’è‚·‚é‚ƃŒƒxƒ‹3‚©‚ç5‚Ü‚Å”­“®‚µ‚Ü‚·B
-Ebattle_athana.conf‚Ìplayer_cloak_check_wallAmonster_cloak_check_wall‚ðplayer_cloak_check_typeAmonster_cloak_check_type‚É•ÏXB
-EƒAƒCƒeƒ€ƒ‹[ƒgŒ ŒÀŽžŠÔ‚ð–{ŽI‚ɇ‚킹‚ÄC³B
-E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
- (doc/)
- conf_ref.txt C³B
- db_ref.txt C³B
- item_bonus.txt C³B
- (conf/)
- battle_athana.conf C³B
- (db/)
- item_db.txt C³B
- (map/)
- map.h
- map.c
- block_free_maxABL_LIST_MAX C³B
- skill.h C³B
- skill.c
- skill_additional_effect()Askill_attack()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_unit_onplace() C³B
- skill_status_change_end()Askill_status_change_start() C³B
- skill_initunitgroup()Askill_unitsetting()Askill_castfix() C³B
- skill_delayfix()Askill_autospell()Askill_use_id()Askill_use_pos() C³B
- skill_check_cloaking()Askill_unit_timer_sub()Askill_check_condition() C³B
- battle.h C³B
- battle.c
- battle_damage()Abattle_get_agi()Abattle_get_speed() C³B
- battle_get_adelay()Abattle_get_amotion()Abattle_get_flee() C³B
- battle_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_config_read() C³B
- mob.c
- mob_attack()Amob_damage()Amobskill_use_id() C³B
- mobskill_use_pos()Amob_spawn()Amob_class_change() C³B
- mob_can_move() C³B
- pc.c
- pc_attack_timer()Apc_checkweighticon()Apc_calcstatus() C³B
- pc_damage()Apc_equipitem()Apc_unequipitem() C³B
- pc_bonus2()Apc_bonus3()Apc_memo()Apc_authok() C³B
- pc_isUseitem() C³B
- clif.h C³B
- clif.c
- clif_changeoption()Aclif_parse_LoadEndAck()Aclif_autospell() C³B
- clif_skill_memo() C³B
- clif_skill_teleportmessage() ’ljÁB
- script.c
- buildin_sc_start() C³B
- atcommnad.c
- atcommand() C³B
-
---------------------
-//0830 by huge
-
-EƒI[ƒgƒXƒyƒ‹‚ÅAŽ©•ª‚ÌK“¾‚µ‚Ă郌ƒxƒ‹‚æ‚è‚à‚‚¢ƒŒƒxƒ‹‚Å
- –‚–@‚ª”­“®‚µ‚Ä‚¢‚½‚Å‚ ‚낤–â‘è‚ðC³B
-EƒI[ƒgƒXƒyƒ‹‚Å‚àA‚¿‚á‚ñ‚ÆSP‚ªŒ¸‚é‚悤‚ÉC³(‚Ç–Y‚ê)
- (map/)
- battle.c
- battle_weapon_attack() C³B
- skill.c
- skill_autospell() C³B
-
---------------------
-//0829 by Kalen
-
-Emob_dbC³
- Ž©ŽI—p‚Ì‚ÆŠÔˆá‚Á‚ÄUP‚µ‚Ä‚µ‚Ü‚Á‚½‚悤‚Å‚·B
- –{—ˆ‚Ì‚à‚Ì‚É’¼‚µ‚Ü‚µ‚½B
-
---------------------
-//0828 by ¹
-
-EƒT[ƒo‚ÌSnapshot
-EMVPƒ{ƒXŒn‚©‚çƒoƒJƒ“ƒXƒ`ƒPƒbƒg‚ª‘å—Ê‚Éo‚Ä‚¢‚½–â‘è‚ðC³B
- (common/)
- version.h C³B
- (db/)
- mob_db.txt C³B
-
---------------------
-//0827 by J
-
-EŒÅ’èMOB‚Ì‚Í‚¸‚̃ƒKƒŠƒX‚Æl–Ê“Ž÷‚ª•à‚¢‚Ä‚¢‚½‚Ì‚ðC³B
-E“¬‹Zê‚ÌMOB‚ɃXƒLƒ‹‚ðŽÀ‘•B
-EƒpƒTƒi‚ƃtƒ@ƒ‰ƒI‚ªƒXƒLƒ‹‚ªÝ’肳‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðŽÀ‘•B
- (db/)
- mob_db.txt C³B
- mob_skill_db.txt C³B
-
---------------------
-//0826 by ‚Ò‚´‚Ü‚ñ
-
-Eˆê•”‚̉‰‘tƒXƒLƒ‹‚ðŽg‚¤‚ÆŽI‚ª—Ž‚¿‚éƒoƒOC³B
-EƒNƒ[ƒLƒ“ƒO’†‚ɃXƒLƒ‹‚ðŽg—p‚Å‚«A
-@Žg—p‚·‚é‚ƃNƒ[ƒLƒ“ƒO‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
-EKalen‚³‚ñ‚Ìmob_db.txt‚ð‚Ü‚Æ‚ß‚Ü‚µ‚½B
- (map/)
- skill.c
- skill_unit_onplace()Askill_unit_onout() C³B
- skill_status_change_start()Askill_status_change_timer() C³B
- skill_use_id()Askill_use_pos() C³B
- (db/)
- mob_db.txt C³B
-
---------------------
-//0825 by Ž€_
-
-Eׂ©‚¢C³B(ׂ©‚¢‚±‚Æ‚Ì‚í‚è‚É‚ÍC³‚µ‚½Š‚ª‘½‚¢‚¯‚Ç...)
-Eƒ[ƒvƒ|[ƒ^ƒ‹‚Ì’†‚ÉŽ~‚Ü‚Á‚½ŽžˆÈŠO‚̓[ƒv‚µ‚È‚¢‚悤‚ÉC³B
-Ebattle_athena.conf‚Éplayer_skill_nofootsetAmonster_skill_nofootset ’ljÁB
-ENPC‚ðƒNƒŠƒbƒN‚µ‚½Œã˜I“X‚ðƒNƒŠƒbƒN‚µ‚ĘI“X‚ð•Â‚¶‚é‚Æ“®‚¯‚È‚­‚È‚éƒoƒOC³B
-‚½‚¾˜I“X‚ð•Â‚¶‚鎞‰½‚̃pƒPƒbƒg‚à“]‘—‚µ‚Ä‚±‚È‚¢‚̂ŘI“X‚ðƒNƒŠƒbƒN‚·‚é‚ÆNPC‚̈—‚©‚甲‚¯‚é‚悤‚É‚µ‚Ü‚µ‚½B(–{ŽI‚Å‚ÍNPC‚̈—‚ª”²‚¯‚È‚¢‚炵‚¢‚Å‚·‚ª‚»‚êˆÈŠO•û–@‚ª‚È‚©‚Á‚½‚Ì‚Á‚ÅB)
-Ekillmonster‚ÌAll‚Å¢Š«‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚¾‚¯Á‚·‚悤‚É•ÏXB
-Eƒ\[ƒXÅ“K‰»‚âƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³‘½”B
- (doc/)
- conf_ref.txt C³B
- db_ref.txt C³B
- (conf/)
- battle_athana.conf C³B
- atcommnad_athena.conf C³B
- (db/)
- item_db.txt C³B
- skill_db.txt C³B
- (login/)
- parse_fromchar() C³B
- (map/)
- map.h C³B
- clif.c
- clif_closevendingboard()Aclif_parse_VendingListReq() C³B
- clif_mob0078()Aclif_mob007b()Aclif_pet0078()Aclif_pet007b() C³B
- skill.h C³B
- skill.c
- skill_check_condition()Askill_castend_pos2() C³B
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- skill_castend_id()Askill_status_change_start()Askill_castfix() C³B
- skill_delayfix()Askill_check_unit_range_sub() C³B
- skill_check_unit_range()Askill_castend_pos()Askill_stop_dancing() C³B
- skill_unit_onplace()Askill_readdb()Askill_timerskill()Askill_blown() C³B
- skill_check_unit_range2_sub()Askill_check_unit_range2() ’ljÁB
- skill_get_maxcount() ’ljÁB
- mob.c
- mobskill_castend_id()Amobskill_castend_pos()Amob_deleteslave() C³B
- mob_stop_walking()Amob_walk()Amob_damage() C³B
- pc.c
- pc_calcstatus()Apc_checkskill()Apc_stop_walking() C³B
- pc_walk()Apc_damage() C³B
- npc.c
- npc_touch_areanpc() C³B
- pet.c
- pet_stop_walking() C³B
- script.c
- buildin_killmonster()Abuildin_killmonster_sub() C³B
- battle.h
- battle.c
- battle_calc_magic_attack()Abattle_get_flee()Abattle_get_flee2() C³B
- battle_get_adelay()Abattle_get_amotion()Abattle_get_max_hp() C³B
- battle_get_hit()Abattle_get_critical()Abattle_get_atk2() C³B
- battle_damage()Abattle_config_read() C³B
- atcommand.h C³B
- atcommand.c C³B
-
---------------------
-//0824 by ‚Ò‚´‚Ü‚ñ
-
-EƒZƒCƒtƒeƒBƒEƒH[ƒ‹Eƒjƒ…[ƒ}‚Ì‘«Œ³’u‚«‚ª‚Å‚«‚È‚©‚Á‚½–â‘èC³B
-EƒGƒ“ƒyƒŠƒEƒ€‚Ƀq[ƒ‹“™‚ÌŽx‰‡ƒXƒLƒ‹‚ªŒø‚¢‚Ä‚¢‚½–â‘èC³B
-E“¬‹Zê‚Ń‚ƒ“ƒXƒ^[ƒŠƒZƒbƒg‚ª‚Å‚«‚È‚©‚Á‚½–â‘èC³B
-@killmonster‚Í"killmonster <mapname>,<eventname>"‚Æ‹Lq‚µ‚Ä
-@ŠY“–eventname‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð휂µ‚Ü‚·‚ª
-@eventname‚ÉAll‚Æ“ü‚ê‚é‚ÆŠY“–MAP‚Ì‘Sƒ‚ƒ“ƒXƒ^[‚ðÁ‹Ž‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
-
- (map/)
- skill.c
- skill_check_unit_range_sub()Askill_castend_nodamage_id() C³B
- script.c
- buildin_killmonster()Abuildin_killmonster_sub() C³B
- (conf/npc/)
- npc_event_tougijou.txt C³B
-
---------------------
-//0823 by Kalen
-
-E“¬‹Zêƒf[ƒ^‘µ‚Á‚½‚Ì‚ÅAŠ®¬
- conf/npc/npc_event_tougijou.txt
- ‚½‚¾‚µA‚±‚¿‚ç‚Ń`ƒFƒbƒN‚µ‚½‚Æ‚±‚ëkillmonster‚ª‚¤‚Ü‚­‚¢‚©‚¸A
- Ž¸”sAŽžŠÔ؂ꂵ‚½ê‡ƒ‚ƒ“ƒXƒ^[ƒŠƒZƒbƒg‚ªo—ˆ‚Ü‚¹‚ñB
- ƒCƒxƒ“ƒg‚ªÝ’肳‚ê‚Ä‚¢‚郂ƒ“ƒXƒ^[‚͈—‚Å‚«‚È‚¢‚Ì‚©‚ÆŽv‚¢‚Ü‚µ‚½‚ª
- Agit‚Ì‚Ù‚¤‚̃Gƒ“ƒy‚ÌKillmonster‚Í‚¿‚á‚ñ‚Æ“®‚¢‚Ä‚Ü‚·‚µc
- Œ´ˆö•ª‚©‚é•û‚¨Šè‚¢‚µ‚Ü‚·<(_ _)>
-
-Egon_test‚Ìmapflag’ljÁ
- conf/mapflag.txt
-
-Emob_dbXV
- 1419`1491‚ªŠù‘¶‚ÌMob‚Ì’è‹`‚΂©‚è‚Ȃ̂ŒljÁ‚µ‚Ü‚¹‚ñ‚Å‚µ‚½‚ªA
- ’²‚ׂ½Š“¬‹Zê‚ÌMob‚̃f[ƒ^‚Å‚ ‚邱‚Æ‚ª•ª‚©‚è‚Ü‚µ‚½(Drop‚ð˜M‚Á‚½‚à‚Ì)
- –{ŽI‚ł͈łè‚ñ‚²‚ª•ñ‚³‚ê‚Ä‚¢‚Ü‚·B‚ªA‚±‚¿‚ç‚ÍDrop‹ó”’‚ň—‚µ‚Ü‚µ‚½B
- ƒNƒ‰ƒCƒAƒ“ƒgã‚Å‚Í“¯–¼‚Å‚µ‚½‚ªA‹æ•Ê‚Ì‚½‚ßÚ“ª‚ÉG_‚ð‚‚¯‚Ä‹æ•Ê‚µ‚Ä‚Ü‚·B
- mob_skill_db‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½«
-
---------------------
-//0822 by ‚Ò‚´‚Ü‚ñ
-
-E‰‰‘tƒXƒLƒ‹‚ł̕Ⳃðƒ_ƒ“ƒT[‚É‚à“K—pB
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠƒoƒOC³B
-EKalen‚³‚ñ‚ÌMOBƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ð‚Ü‚Æ‚ß‚Æ‚«‚Ü‚µ‚½B
-
- (map/)
- skill.c
- skill_status_change_start()Askill_unit_onplace() C³B
- battle.c
- battle_get_critical()Abattle_get_hit() C³B
- pc.c
- pc_calcstatus() C³B
-
---------------------
-//0821 by huge
-
-EƒI[ƒgƒXƒyƒ‹‰¼ŽÀ‘•B
-Etimer‚Å”»’肵‚悤‚©‚Æ‚àŽv‚¢‚Ü‚µ‚½‚ªA‘•”õ‚Ì–³ŒÀƒI[ƒgƒXƒyƒ‹‚ׂ̈Ésc_[].val1‚ÅŒ©‚ă}ƒXB
-Ebonus2 bAutoSpell’ljÁBˆê‰ž‚Ç‚ñ‚ȃXƒLƒ‹‚Å‚àŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ä‚Ü‚·‚ª(”Ô†‚Ískill_treeŽQÆ)
- skill_castend_damage_id‚̃^ƒCƒvˆÈŠO‚̃XƒLƒ‹‚ðŽw’肵‚È‚¢‚Å‚­‚¾‚³‚¢B
- ”­“®Šm—¦‚ÍALv1:50%ALv2:35%ALv3:15%A‚»‚êˆÈã‚Í 5%ŒÅ’è‚Å‚·B
- ‚ ‚ÆAƒXƒLƒ‹ƒŒƒxƒ‹‚àŽw’è‚Å‚«‚Ü‚·‚ªAŒÀŠE‚ð’´‚¦‚½”Žš‚ð“ü‚ê‚é‚Æ’Ä‚¿‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-¡‘‚«•û—áFiƒtƒ@ƒCƒAƒ{ƒ‹ƒgLv3‚ÌŽžjbonus2 bAutoSpell 19,3;
-
- (db/)
- const.txt C³B
- (map/)
- battle.c
- battle_weapon_attack() C³B
- clif.h
- clif.c
- packet_len_table C³B
- clif_autospell() ’ljÁB
- clif_parse_AutoSpell() ’ljÁB
- map.h C³B
- pc.c
- pc_bonus2() C³B
- pc_equipitem() C³B
- pc_unequipitem() C³B
- skill.h
- skill.c
- skill_castend_nodamage_id() C³B
- skill_autospell() ’ljÁB
- skill_status_change_end() C³B
- skill_status_change_start() C³B
- status_change‚̔Ԇƒe[ƒuƒ‹C³B
-
---------------------
-//0820 by ‚Ò‚´‚Ü‚ñ
-
-EƒAƒhƒŠƒu‚̃ƒbƒZ[ƒW‚ª“ü‚Á‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³
-Eƒo[ƒh‚̉‰‘tƒXƒLƒ‹‚ÅŠyŠí‚Ì—ûK‚⎩ƒXƒe[ƒ^ƒX‚̕Ⳃª“ü‚Á‚Ä‚È‚©‚Á‚½‚Ì‚ðC³B
-@struct status_change‚Ìval‚ª3‚•K—v‚¾‚Á‚½‚Ì‚Å(val4‚Í—\–ñ‚³‚ê‚Ä‚½‚Á‚Û‚¢‚Ì‚Å)val5‚ð’ljÁ‚µ‚Ü‚µ‚½
- (map/)
- map.h C³B
- skill.c
- skill_status_change_start()Askill_castend_nodamage_id() C³B
- skill_castfix()Askill_delayfix() C³B
- battle.c
- battle_get_flee()Abattle_get_max_hp() C³B
- battle_get_adelay()Abattle_get_amotion() C³B
- battle_calc_misc_attack() C³B
- pc.c
- pc_calcstatus() C³B
-
---------------------
-//0819 by Kalen
-
-EƒRƒ“ƒƒ“(NPCAWarp)C³
- conf/npc/npc_town_gonryun.txt(ˆÄ“àˆõ•â[)
- conf/npc/npc_event_tougijou.txt
- conf/warp/npc_warp_gonryun.txt(h2F‚ÆD2F‚È‚Ç)
-
-EMOBC³
- conf/mob/npc_monster30.txt(ˆê”½–Ø–È•s‘«’ljÁ)
- conf/mob/npc_monster35.txt(ƒRƒ“ƒƒ“Mob’ljÁ)
-
-EDBC³
- db/mob_db.txt(ƒRƒ“ƒƒ“[‘S‚Ä]+ƒEƒ“ƒoƒ‰[’è‹`]’ljÁBAspeed“™“K“–‚Å‚·B‚Ü‚Ÿ–³‚¢‚æ‚è‚Ü‚µ‚Æ‚¢‚¤‚±‚Æ‚Å)
- db/mob_skill_db.txt(î•ñ‚ðŒ³‚ÉƒRƒ“ƒƒ“‚ÌMob•ª’ljÁ)
- db/item_db.txt(Athena DB Project 2/19 21:10DL•ª)
-
---------------------
-//0818 by ‚ ‚ä‚Ý
-
-EƒeƒŒƒ|[ƒgƒXƒLƒ‹Lv1‚ÅA‘I‘ðƒEƒCƒ“ƒhƒE‚ªo‚Ä‚±‚È‚¢ƒoƒO‚ðC³B
-Ed—Ê‚ª90“ˆÈã‚ÌꇂłàAˆê•”‚̃XƒLƒ‹‚ªŽg—p‰Â”\‚¾‚Á‚½ƒoƒO‚ðC³B
-E@allskillƒRƒ}ƒ“ƒh‚ÌC³‚Æ‚©B
-
- (conf/)
- msg_athena.conf C³B
- (map/)
- atcommand.c
- atcommand() C³B
- pc.c
- pc_allskillup() C³B
- skill.c
- skill_castend_nodamage_id() C³B
- skill_check_condition() C³B
-
---------------------
-//0817 by huge
-
-EƒfƒBƒ{[ƒVƒ‡ƒ“‚̈—C³
- EŽ…‚Ìo‚µ•û‚̓pƒP‚ð–á‚Á‚½‚Ì‚Å‚Å‚«‚Ü‚µ‚½‚ªAƒAƒCƒRƒ“‚Ì•û‚Í‚Ü‚¾•ª‚©‚ç‚È‚¢‚Å‚·B
- E‚ ‚ÆAŽ©•ª‚̊‹«‚Å2lˆÈã‚É“¯Žž‚ÉŠ|‚¯‚ê‚È‚©‚Á‚½‚Ì‚ÅA•¡”l‚É‚©‚¯‚½ê‡
- ‘½•ª0‚Ì—…—ñ‚ÌŠ‚É2l–ÚA3l–ÚEEE‚ÌID‚ª“ü‚é‚ñ‚¶‚á‚È‚¢‚©‚È‚Ÿ‚Æ‚¢‚¤—\‘ª‚Å‚â‚Á‚Ä‚Ü‚·B
-EƒnƒCƒfƒBƒ“ƒO’†A‹y‚уNƒ[ƒLƒ“ƒO’†‚Ƀ_ƒ[ƒW‚ðŽó‚¯‚é‚Æ‰ð‚¯‚é‚悤C³B
-
- (map/)
- battle.c
- battle_damage() C³B
- clif.c
- clif_devotion() C³B
- pc.c
- pc_walk() C³B
- skill.c
- skill.h
- skill_castend_nodamage_id() C³B
- skill_devotion() skill_devotion2() C³B
- skill_devotion3()skill_devotion_end() C³B
-
---------------------
-//0816 by ‚Ò‚´‚Ü‚ñ
-Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹3–‡§ŒÀŽÀ‘•B
-Ed‚Ë’u‚«‹ÖŽ~‚ðƒvƒŒƒCƒ„[Eƒ‚ƒ“ƒXƒ^[‚É‚à“K—p‚·‚é‚悤‚ÉC³B
-EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€‚ÌPvPEGvG‚ÅAŒø‰Ê‚ªŽ©•ª‚É‚à‹y‚ÔƒoƒOC³B
-@‚‚¢‚Å‚ÉPTƒƒ“ƒo[‚É‚Í’áŠm—¦‚Å‚©‚©‚é‚Ì‚àŽÀ‘•B
-EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€EƒXƒsƒAƒu[ƒƒ‰ƒ“‚̃fƒBƒŒƒCC³B
-@ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒNE–‚¿‚̉r¥ŽžŠÔC³B
- (map/)
- skill.c
- skill_check_condition()Askill_check_unit_range_sub() C³B
- skill_check_unit_range()Askill_delunitgroup() C³B
- skill_castend_pos2()Askill_frostjoke_scream() C³B
- map.h C³B
- (db/)
- cast_db.txt C³B
-
---------------------
-//0815 by Ž€_
-
-E0814‚̃oƒOC³‚Æׂ©‚¢C³B
-Emapflag monster_noteleportAnoreturn’ljÁ‚Ænoteleport‚ÌŽd—l•ÏXB
-noteleport‚̓vƒŒƒCƒ„[‚̃nƒG‚ƃeƒŒƒ|[ƒgAƒ[ƒvƒXƒLƒ‹‚̧ŒÀ‚ð‚·‚é‚ª’±‚ͧŒÀ‚µ‚È‚¢‚悤‚É•ÏXAmonster_noteleport‚̓‚ƒ“ƒXƒ^[‚̃eƒŒƒ|[ƒg‚ð§ŒÀ‚·‚镨‚Ånoreturn‚Í’±‚ÌŽg—p‚ð§ŒÀ‚·‚镨‚Å‚·B‚½‚¾mapflag.txt‚ÍC³‚µ‚Ä‚¢‚Ü‚¹‚ñB(noreturn‚ðÝ’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B)
-Ebattle_athena.conf‚Ìplayer_auto_counter_type‚Æmonster_auto_counter_type‚ªà–¾’Ê‚è‚É‹@”\‚µ‚È‚©‚Á‚½–â‘èC³B
-Ebattle_athena.conf‚Éplayer_cloak_check_wall ‚Æmonster_cloak_check_wall ’ljÁB
-Eƒ{ƒXƒ‚ƒ“ƒXƒ^[‚Ì”FŽ¯‚ðMVPŒoŒ±‚Æmode‚Ì0x20‚Ås‚È‚Á‚Ä‚¢‚½•¨‚ðmode‚¾‚¯‚É‚·‚é‚悤‚É•ÏXB(–{ŽI‚̃Cƒxƒ“ƒgƒ‚ƒ“ƒXƒ^[‚ÅMVPŒoŒ±‚ð‚­‚ê‚邪ó‘ÔˆÙí‚ÉŠ|‚©‚é‚â‚‚ª‚ ‚Á‚½‚炵‚­C³BHP‚ª1‰­‚à‚ ‚Á‚Ä“Å‚¶‚á‚È‚¢‚Æ“|‚¹‚È‚©‚Á‚½‚炵‚¢‚Ì‚Å...) ‚‚܂èMVPŒoŒ±‚ª‚ ‚Á‚Ä‚àƒ{ƒXˆµ‚¢‚Å‚Í‚È‚¢ƒ‚ƒ“ƒXƒ^[‚ðì‚邱‚Æ‚à‰Â”\‚Å‚·B
-Eó‘ÔˆÙí‚ÉŠ|‚©‚Á‚½ó‘Ô‚ÅÚ‘±Ø’f‚ª‚Å‚«‚È‚¢‚悤‚ÉC³B(‚½‚¾ƒ^ƒCƒ}[ƒ`ƒFƒbƒN‚Å‚Í‚È‚­opt1‚Æopt2‚ðƒ`ƒFƒbƒN‚·‚邾‚¯‚È‚Ì‚ÅŒ©‚½–Ú‚ª•Ï‚í‚éó‘ÔˆÙ킾‚¯‚É“K—p‚³‚ê‚Ü‚·B)
-E¡‚³‚ç‚Å‚·‚ªÌ‚ÌyareCVS(2003”N9ŒŽƒo[ƒWƒ‡ƒ“)‚Å“K—p‚³‚ê‚Ä‚¢‚½ƒ‰ƒO‚ðŒ¸‚ç‚·ˆ×‚̈—‚ð“ü‚ê‚Ä‚Ý‚Ü‚µ‚½B‚Ç‚ñ‚ÈŒø‰Ê‚ª‚ ‚é‚©‚ÍŽ©•ª‚Å‚à‚í‚©‚è‚Ü‚¹‚ñB(‚½‚¾“ü‚ê‚Ä‚Ý‚½‚¾‚¯...)
-EƒV[ƒYƒ‚[ƒh‚ÆPVP‚Å‹ÖŽ~‘•”õ‚ªŠO‚³‚ê‚Ä‚àŒø‰Ê‚ªÁ‚¦‚È‚¢ƒoƒOC³B
-E‚»‚Ì‘¼×‚©‚¢C³B
-E–¢ƒeƒXƒg‚Ì•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·B
- (common/)
- socket.c
- connect_client()Amake_listen_port()Amake_connection() C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_config_read() C³B
- skill.c
- skill_unit_onplace()Askill_status_change_timer() C³B
- skill_castend_nodamage_id()Askill_use_id() C³B
- skill_check_unit_range_sub()Askill_timerskill() C³B
- skill_additional_effect()Askill_attack()Askill_status_change_start() C³B
- skill_check_cloaking() C³B
- clif.c
- clif_item_identify_list()Aclif_parse_QuitGame()Aclif_GM_kick() C³B
- pc.c
- pc_attack_timer()Apc_isUseitem()Apc_checkitem C³B
- mob.c
- mob_warp()Amob_walk()Amob_attack()Amob_target() C³B
- mob_ai_sub_hard_activesearch()Amob_ai_sub_hard_mastersearch() C³B
- mob_ai_sub_lazy()Amob_damage() C³B
- npc.c
- npc_parse_mapflag() C³B
- map.h C³B
-
---------------------
-//0814 by Ž€_
-
-EƒoƒOC³‚Æׂ©‚¢C³B
-Ebattle_athena.conf‚Ìplayer_auto_counter_type‚Æmonster_auto_counter_type‚ÌŽd—l‚ð•ÏXB(–{ŽI‚ł̓XƒLƒ‹”½Œ‚‚Í‚Å‚«‚È‚¢‚Ý‚½‚¢‚È‚Ì‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB)
-E“Å‚ÆΉ»‚É‚æ‚éHPŒ¸­‚ð–{ŽI‚ɇ‚킹‚ÄC³‚ÆŠ®‘SΉ»‚Ì‘O‚Å‚Í“®‚¯‚é‚悤‚É•ÏXB(“Å‚Í1•b‚É3+Å‘åHP‚Ì1.5%(ƒ‚ƒ“ƒXƒ^[‚Í0.5%)AΉ»‚Í5•b‚É1%) –¢ƒeƒXƒg
-EMVPŒoŒ±’l‚Í–{ŽI‚Å‚¢‚‚à“ü‚é‚悤‚É‚È‚Á‚½‚Ì‚ÅC³B
-EƒXƒeƒB[ƒ‹‚ÌŠm—¦‚ð­‚µ‰º‚°B
-Eƒ‚ƒ“ƒXƒ^[‚̃nƒCƒfƒBƒ“ƒOAƒNƒ[ƒLƒ“ƒOAƒ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ª‚·‚®‚ɉ𜂳‚ê‚é–â‘èC³B(ƒ‚ƒ“ƒXƒ^[‚É‚ÍSP‚ª‚È‚¢‚¹‚¢‚Å‚·BŽæ‚芸‚¦‚¸ƒNƒ[ƒLƒ“ƒO‚̓nƒCƒfƒBƒ“ƒO‚ÌŽžŠÔ‚ð“K—p‚µ‚ă}ƒLƒVƒ}ƒCƒYƒpƒ[‚̓EƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“‚ÌŽžŠÔ‚ð“K—p‚µ‚Ü‚·B) –¢ƒeƒXƒg
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ðl”‚©‚ç‰ñ”‚É•ÏXB
-EPVP‚ÅŽ©•ª‚̃gƒ‰ƒbƒv‚ÉUŒ‚‘ÎÛ‚É‚È‚é‚悤‚É•ÏXB
-Evitƒyƒiƒ‹ƒeƒB‚Ì“K—p‚ÅæŽZ–hŒä‚àŒ¸‚é‚悤‚É•ÏXB(–¢ƒeƒXƒg)
-E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
- (conf/)
- battle_athena.conf
- (doc/)
- conf_ref.txt
- (db/)
- skill_db.txt
- (map/)
- map.h C³B
- script.c
- buildin_itemskill() C³B
- mob.c
- mob_can_move()Amob_ai_sub_hard()Amob_damage() C³B
- skill.c
- skill_unitsetting()Askill_unit_onplace()Askill_castend_nodamage_id() C³B
- skill_attack()Askill_status_change_start() C³B
- skill_status_change_timer()Askill_status_change_timer_sub() C³B
- skill_addtimerskill()Askill_cleartimerskill() C³B
- skill_check_unit_range_sub() C³B
- battle.c
- battle_calc_damage()Abattle_check_target() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack() C³B
- pc.c
- pc_steal_item() C³B
- clif.c
- clif_parse_WalkToXY()Aclif_closevendingboard() C³B
-
---------------------
-//0813 by Kalen
-EƒRƒ“ƒƒ“NPC’ljÁ
- conf/npc/npc_town_gonryun.txt(ƒNƒGƒXƒg‚Í•s–¾
- conf/npc/npc_town_kafra.txt
- conf/npc/npc_town_guide.txt
- (conf/npc/npc_event_tougijou.txt)ƒf[ƒ^•s‘«
-
-E‘SGvGMAP‚ÌMobƒf[ƒ^’ljÁ
- conf/mob/npc_monster_gvg.txt
-
-ETESTmob‚©‚çƒeƒXƒgƒMƒ‹ƒhƒtƒ‰ƒOˆÚ“®
- conf/gvg/TEST_prtg_cas01_AbraiJ.txt
-
---------------------
-//0812 by huge
-
-EƒfƒBƒ{[ƒVƒ‡ƒ“‚̉¼ŽÀ‘•
- EƒpƒPƒbƒg‚ª‘S‘R•ª‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½‚Ì‚ÅA
- ‚¢Ž…‚ào‚È‚¢‚µAƒAƒCƒRƒ“‚·‚ç•\Ž¦‚Å‚«‚Ü‚¹‚ñB
- Eƒ_ƒˆÚ“®‚¾‚¯‚ÅAƒmƒbƒNƒoƒbƒNEƒI[ƒgƒK[ƒh‚Í“K‰ž‚³‚ê‚Ü‚¹‚ñB
-
- (map/)
- clif.c
- clif.h
- clif_devotion() ’ljÁB
- skill.c
- skill_castend_nodamage_id() C³B
- skill_devotion() skill_devotion2() ’ljÁB
- skill_devotion3() skill_devotion_end() ’ljÁB
- skill_status_change_end() C³B
- skill_status_change_start() C³B
- skill_brandishspear_first() C³B
- skill_brandishspear_dir() C³B
- pc.c
- pc_authok() C³B
- pc_walk() C³B
- pc_damage() C³B
- battle.c
- battle_damage() C³B
- map.h
- map_session_data{}
- struct square dev ’ljÁB
- skill.h ‚Ìbrandish‚ðsquare‚ɉü–¼‚µA
- (common/) mmo.h ‚Ɉړ®
-
---------------------
-//0811 by ‚Ò‚´‚Ü‚ñ
-
-EUé’†‚Í’±‚ªŽg‚¦‚é‚悤‚ÉC³
-EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€ŽÀ‘•(PTƒƒ“ƒo[‚É’áŠm—¦‚ʼn]X‚Í–¢ŽÀ‘•‚Å‚·)
-EGVGƒXƒNƒŠƒvƒg‚ðC³(ŽŽsöŒë‚µ‚·‚¬‚Ä‚Ç‚±‚ð‚Ç‚¤‚µ‚½‚©Šo‚¦‚Ä‚Ü‚¹‚ñc)
-@GVGƒXƒNƒŠƒvƒg‚ÉŠÖ‚µ‚Ä‚Å‚·‚ªAŠù’m‚̃oƒO‚ª‚ ‚è‚Ü‚·
-@‚»‚ê‚ÍAè—̃Mƒ‹ƒhƒ}ƒXƒ^[ˆÈŠO‚ÌPC‚ªAè—̃Mƒ‹ƒhƒ}ƒXƒ^[‚æ‚èæ‚ÉNPC‚ɘb‚µŠ|‚¯‚é‚Æ
-@ƒ}ƒbƒvƒT[ƒo‚ª—Ž‚¿‚é‚Æ‚¢‚¤‚à‚Ì‚Å‚·B
-@‚±‚ê‚ÍAgetguildmasterEgetguildname‚ðŽg—p‚µ‚Ä‚¢‚éƒXƒNƒŠƒvƒg‚·‚ׂĂɋN‚±‚蓾‚邱‚Æ‚Å‚ ‚è
-@æ‚Éè—̃Mƒ‹ƒhƒ}ƒXƒ^[ˆÈŠO‚Řb‚µŠ|‚¯‚é‚ÆAguild_search‚ª‰½ŒÌ‚©(ŠY“–ID‚̃Mƒ‹ƒh‚ª‚ ‚é‚É‚àŠÖ‚í‚炸)
-@NULL‚ð•Ô‚·Ž–‚É‹Nˆö‚µ‚Ü‚·B
-@³’¼ƒXƒNƒŠƒvƒgŠÖŒW‚Í‚æ‚­‚í‚©‚Á‚Ä‚¢‚È‚¢‚Ì‚ÅA‚±‚ê‚ÍŽ„‚Ì‹Zp‚Å‚ÍC³‚Ì‚µ‚悤‚ª‚ ‚è‚Ü‚¹‚ñB
-@Žb’è“I‚ȑΈ‚Æ‚µ‚ÄNULL‚ð•Ô‚µ‚ÄMAPŽI‚ª—Ž‚¿‚é‚­‚ç‚¢‚Ȃ當Žš—ñunullv‚ð•Ô‚·‚悤‚É‚µ‚Ü‚µ‚½B
-
- (map/)
- skill.c
- skill_frostjoke_scream() ’ljÁB
- skill_additional_effect()Askill_timerskill() C³B
- skill_castend_nodamage_id() C³B
- pc.c
- pc_isUseitem() C³B
- script.c
- buildin_getpartyname()Abuildin_getguildname() C³B
- buildin_getguildmaster() C³B
- (db/)
- cast_db.txt C³B
- (conf/gvg/)
- ev_*.txtˆÈŠO‚Ìtxt‘S‚Ä‚ðC³B
-
---------------------
-//0810 by ¹
-
-EMVP‚̈—‚ð•ÏXB(Šm—¦‚Å10000‚ª‚ ‚Á‚Ä‚àA‘¼‚̃AƒCƒeƒ€‚ào‚é‚悤‚É‚µ‚Ü‚µ‚½)
-EMVP‚Å‘•”õ‚ð“üŽè‚µ‚½ê‡AŠÓ’èÏ‚Ý‚Å“üŽè‚µ‚Ä‚¢‚½–â‘è‚ðC³B
-EƒXƒLƒ‹‰r¥’†‚ɃCƒO—t‚âŠg‘勾‚ðŽg‚¤‚ƃvƒŒ[ƒ„[‚ÌŽg—p‰Â”\‚È
-@‘SƒXƒLƒ‹‚ÌLV‚ª1‚ɌŒ肳‚ê‚Ä‚µ‚Ü‚¤–â‘è‚ðC³B
-EƒI[ƒNƒA[ƒ`ƒƒ[“™Aƒ‚ƒ“ƒXƒ^[‚É‚æ‚é㩃XƒLƒ‹‚Ì—LŒøŠúŒÀ‚ªØ‚ꂽ‚Æ‚«‚ÉA
-@Ý’u—pƒgƒ‰ƒbƒv‚ªo‚é–â‘è‚ðC³B
-EƒƒOƒCƒ“ƒGƒ‰[(ƒpƒXƒ[ƒh“ü—̓~ƒX‚âBAN“™)‚̃Gƒ‰[ƒƒbƒZ[ƒW‚ª
-@³‚µ‚­ƒNƒ‰ƒCƒAƒ“ƒg‚É’Ê’m‚³‚ê‚È‚¢–â‘è‚ðC³B
-E‚»‚Ì‘¼×‚©‚ÈC³B
- (common/)
- version.h C³B
- (login/)
- login.c
- parse_login() C³B
- parse_fromchar() C³B
- (char/)
- int_guild.c
- mapif_parse_GuildLeave() C³B
- (map/)
- itemdb.c
- itemdb_read_itemnametable() C³B
- atcommand.c
- atcommand() C³B
- skill.c
- skill_unit_timer_sub() C³B
- script.c
- buildin_itemskill() C³B
- mob.c
- mob_damage() C³B
-
---------------------
-//0809 by Kalen
-
-E“ŒŒÎéƒ[ƒvƒ|ƒCƒ“ƒgC³
-EƒAƒ}ƒcŽõŽi‰®C³
-EƒoƒOƒXƒŒ129‚Ì–â‘èC³H
-
-
---------------------
-//0808 by ‚Ò‚´‚Ü‚ñ
-
-E‘•”õ§ŒÀ‚ªãŽè‚­“®ì‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
-Eƒ‚ƒ“ƒnƒEƒMƒ‹ƒh‚ÍGvGŠJŽnŽž‚Éì‚ç‚ê‚é‚悤‚É•ÏXB
-EGvGŠJŽnŽž‚ÉŠY“–ƒ}ƒbƒv‚É‚¢‚é‘SPC(è—̃Mƒ‹ƒhˆõˆÈŠO)‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚悤‚ÉC³B
-Eƒ‚ƒ“ƒnƒEƒMƒ‹ƒhƒAƒWƒg‚ŃGƒ“ƒy‚ð‰ó‚·‚ÆAƒ‚ƒ“ƒnƒE‚ªÁ‚¦‚é‚悤‚ÉC³B
-@‚±‚ÌC³‚É”º‚Á‚Ämaprespawnguildid‚̈ø”‚Ìflag‚ÌŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½
-@flag‚̓rƒbƒgƒtƒ‰ƒO‚É‚È‚èA
-@@1ƒrƒbƒg–ÚFè—̃Mƒ‹ƒhˆõ‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚©
-@@2ƒrƒbƒg–ÚFè—̃Mƒ‹ƒhˆõˆÈŠO‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚©
-@@3ƒrƒbƒg–ÚFƒGƒ“ƒyEƒK[ƒfƒBƒAƒ“ˆÈŠO‚ÌMOB‚ðÁ‚·‚©
-@‚¢‚¸‚ê‚àA0=NOA1=YES‚É‚È‚è‚Ü‚·
-
- (conf/gvg/)
- ev_agit_aldeg.txt C³B
- ev_agit_gefg.txt C³B
- ev_agit_payg.txt C³B
- ev_agit_prtg.txt C³B
- TEST_prtg_cas01_AbraiJ.txt C³B
- TEST_prtg_cas01_mob.txt C³B
- (map/)
- pc.c
- pc_checkitem() C³B
- script.c
- buildin_maprespawnguildid_sub() C³B
- buildin_maprespawnguildid() C³B
-
---------------------
-//0807 by Ž€_
-
-E0805‚ÅFD_SETSIZE‚ðC³‚·‚銂ðŠÔˆá‚Á‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B56–¼Ž~‚܂肪Ž¡‚é‚ÆŒ¾‚¤•ÛØ‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...
-Eˆê“x‚É“]‘—‚·‚éƒpƒPƒbƒg‚Ì’·‚³‚ð32768bytes‚©‚ç65536bytes‚É•ÏXB
- (common/)
- mmo.h C³B
- socket.h C³B
- socket.c C³B
-
---------------------
-//0806 by Kalen
-
-EagitƒtƒHƒ‹ƒ_¨gvgƒtƒHƒ‹ƒ_‚ÖˆÚs
- ”ˆÓŒ©‚ ‚é‚ÆŽv‚¢‚Ü‚·‚ªAjRO‚Å‚ÍUéí‚ðgvg‚ƌĂԂ±‚Æ‚ªˆê”Ê“I‚È‚Ì‚Å‚±‚¿‚ç‚É“‡‚µ‚Ü‚·B
- conf/gvg/
- ###agitƒtƒHƒ‹ƒ_‚ð휂µ‚Ä‚­‚¾‚³‚¢###@(Please delete the "agit" folder.)
- getmaster‘Ήž
-
-EƒAƒ}ƒc‚ÌŽõŽi‰®ƒoƒOC³‚Æ€–ڒljÁ(thx 114
- conf/npc/npc_town_amatsu.txt
-
-Emap_flagÄC³
- conf/map_flag.txt
- [GVGMAP]Šm‚©‚Éí‚ɃV[ƒYƒ‚[ƒh‚È‚ç–â‘è‚È‚¢‚Å‚·‚ªA휂³‚ê‚Ü‚µ‚½‚Ì‚Å
- í‚ɃV[ƒYƒ‚[ƒh‚Å‚Í‚ ‚è‚Ü‚¹‚ñB]‚Á‚ĉ𜎞(ŽžŠÔŠO)‚É‚ÍŽ}AƒeƒŒƒ|‚ªŽg‚¦‚Ü‚·
- ŽžŠÔ‘O‚ÉŽ}ŽT‚«A‚Ü‚¾ŽÀ‘•‚µ‚Ä‚Ü‚¹‚ñ‚ª•ó” ’DŽæ‚à‰Â”\‚É‚È‚é‚Ì‚ÅŽ}AƒeƒŒƒ|‚Íí‚ÉŽg—p•s‰Â‚Å–â‘è‚È‚¢‚ÆŽv‚¢‚Ü‚·B
-
-Œã‘O‰ñ‘‚«–Y‚ê‚Ü‚µ‚½‚ªAmomotaroƒCƒxƒ“ƒg‚Å‚·‚ªA‚¿‚å‚Á‚Æ•sˆÀ’è‚ȉ”\«‚ª‚ ‚è‚Ü‚·B
-Œ´ˆö‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å‚·‚ªAƒ‹[ƒv‚µ‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñBˆê‰žƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚ ‚è‚Ü‚·
-
---------------------
-//0805 by Ž€_
-
-E•¶Žš‰»‚¯C³B
-EƒV[ƒYƒ‚[ƒh‚ł̃eƒŒƒ|[ƒg‹ÖŽ~‚âŒÃ–Ø‚ÌŽ}Žg—p‹ÖŽ~‚̓\[ƒXƒŒƒxƒ‹‚Å
-ˆ—‚µ‚Ä‚¢‚é‚Ì‚Åmapflag.txt‚©‚çíœB(ˆö‚Ý‚Énopenalty‚àƒ\[ƒXƒŒƒxƒ‹‚Å
-ˆ—‚µ‚Ä‚¢‚Ü‚·B)
-Ebattle_athena.conf‚Ìagit_eliminate_time‚ðgvg_eliminate_time‚É•ÏXB
-E@ƒRƒ}ƒ“ƒh@GMíœB
-EFD_SETSIZE‚©cygwin‚Å64‚Éݒ肳‚ê‚Ä‚¢‚½‚Ì‚¹‚¢‚ÅÅ‘åÚ‘±l”‚ª56–¼‚ð
-‰z‚¦‚é‚ƃ}ƒbƒvŽI‚ª–³ŒÀƒ‹[ƒv‚·‚é–â‘èC³B(‚½‚¾ƒeƒXƒg‚ª‚Å‚«‚È‚©‚Á‚½•¨‚È‚Ì‚Å–{“–‚É‘åä•v‚É‚È‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·B‚ ‚­‚Ü‚Å‚àŽ©•ª‚Ì—\‘ª‚É‚·‚¬‚È‚¢•¨‚Å‚·‚ª...)
-E•¶Žš‰»‚¯‚Ì‚¹‚¢‚Å‚Ç‚±‚ð‚Ç‚¤C³‚µ‚½‚©Šo‚¦‚Ä‚È‚¢‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯B
- (conf/)
- atcommand_athena.conf
- battle_athena.conf
- mapflag.txt
- (db/)
- castle_db.txt
- (doc/)
- conf_ref.txt
- (common/)
- mmo.h
- (login/)
- login.c
- (char/)
- inter.c
- int_guild.c
- (map/)
- atcommand.h
- atcommand.c
- battle.h
- battle.c
- chrif.c
- guild.h
- guild.c
- intif.h
- intif.c
- map.h
- map.c
- mob.c
- npc.c
- npc.h
- script.c
- skill.c
- pc.c
- makefile
-
---------------------
-//0804 by Žß‘¸
-
-EƒAƒ‹ƒxƒ‹ƒ^‚Ì‚Ê‚¢‚®‚é‚݃Cƒxƒ“ƒg‚Å‚¤‚³‚¬‚Ì‚Ê‚¢‚®‚é‚Ý‚ð‚ ‚°‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
-
- (conf/npc/)
- npc_event_doll.txt C³B
-
---------------------
-//0803 by ‚Ò‚´‚Ü‚ñ
-
- GvG‚ŃGƒ“ƒyƒŠƒEƒ€•ö‰óŽžgvg_eliminate_time‚Ì’l‚ÉŠÖ‚í‚炸‘¦À‚É‘Þ‹Ž‚³‚¹‚ç‚ê‚Ä‚¢‚½ƒoƒOC³
- GvG‚̃ZƒŠƒt‚ðˆê•”C³
- interŽI‚Åcastle.txt‚ª‚È‚¢‚Æ‹N‚±‚éFX‚ȃGƒ‰[‚ðC³
- help.txt‚ðC³(@gvgstart¨@agitstart‰]X)
-
- (conf/)
- gvg/TEST_prtg_cas01_AbraiJ.txt C³B
- agit/ev_agit_prtgJ.txt C³B
- help.txt C³B
- (map/)
- int_guild.c
- inter_guild_init() C³B
-
---------------------
-//0802 by Michael_Huang
-
- Added NPC Script - 'GetGuildMaster' Command.
- (common/)
- version.h
- Mod_Version 0802
- (map/)
- script.c
- buildin_getguildmaster_sub() buildin_getguildmaster()
-
---------------------
-//0801 by Kalen
-EƒAƒ}ƒcC³
-@@ŽÀ‘•‘O‚̃f[ƒ^A”²‚¯‚Ä‚éƒf[ƒ^‚Ȃǂ𒲸‚µC³
- conf/npc/npc_town_guide.txt
- conf/npc/npc_town_amatsu.txt
- conf/npc/npc_event_momotaro.txt
- conf/npc/npc_event_alchemist.txt
- conf/mob/npc_monster35.txt
- conf/warp/npc_warp_amatsu.txt
-Emap_flagC³
- [GVGMAP]Ž}AƒeƒŒƒ|‚Íí‚ÉŽg—p•s‰Â
-EGVGŠÖŒW
- 0800‚̃Rƒ}ƒ“ƒh‚ɑΉž
-
---------------------
-//0800 by Michael_Huang
-
- Added Agit NPC Script & Command.
- Fix FreeBSD GCC compatibility.
- Attachment Agit Demo NPCs.
-
- (char/)
- int_guild.c
- mapif_guild_castle_dataload() mapif_guild_castle_datasave()
- int mapif_parse_GuildCastleDataLoad() int mapif_parse_GuildCastleDataSave()
- inter_guild_parse_frommap() inter_guildcastle_tostr() inter_guildcastle_fromstr()
- inter.c
- inter_send_packet_length[] inter_recv_packet_length[]
- (common/)
- mmo.h
- GLOBAL_REG_NUM, struct global_reg {}
- version.h
- Mod_Version 0799.
- (conf/)
- atcommand_athena.conf
- agitstart: 1,agitend: 1
- battle_athena.conf
- agit_eliminate_time: 7000
- map_athena.conf
- conf/agit/ev_agit_*.txt
- (doc/)
- conf_ref.txt
- battle_athena.cnf
- agitdb_ref.txt
- (login/)
- login.c
- parse_login()
- (map/)
- atcommand.h
- agitster, agitend
-
- atcommand.c
- @agitstart, @agitend
- battle.h
- battle_config.agit_eliminate_time
- battle.c
- battle_config_read()
- chrif.c
- chrif_changedsex() chrif_connectack()
- guild.h
- guild_agit_start() guild_agit_end() guild_agit_break()
- guild.c
- guild_read_castledb() do_init_guild()
- guild_agit_start() guild_agit_end() guild_agit_eliminate_timer() guild_agit_break()
- intif.h
- intif_guild_castle_dataload() intif_guild_castle_datasave()
- intif.c
- packet_len_table[] intif_guild_castle_dataload() intif_guild_castle_datasave()
- intif_parse_GuildCastleDataLoad() intif_parse_GuildCastleDataSave() intif_parse()
- map.h
- agit_flag
- map.c
- agit_flag
- npc.h
- npc_event_doall() npc_event_do()
- npc.c
- npc_event_do_sub() npc_event_do()
- script.c
- buildin_maprespawnguildid() buildin_agitstart() buildin_agitend()
- buildin_getcastlename() buildin_getcastledata() buildin_setcastledata()
- skill.c
- skill_unit_onplace()
- skill_gangster_count()
-
---------------------
-//0799 by ‚Ò‚´‚Ü‚ñ
-
-EGvGŽÀ‘•‚ׂ̈Éinter-mapŠÔ‚Ì’ÊMŽd—l•ÏX
-E0798‚̃Rƒ“ƒpƒCƒ‹ƒGƒ‰[C³(byƒoƒO•ñƒXƒŒ82Ž)
- (login/)
- login.c
- parse_login() C³B
- (map/)
- intif.c
- packet_len_table[] C³B
- intif_parse_GuildCastleInfo() C³B
- intif_parse_GuildCastleChange()‚ðintif_parse_GuildCastleChangeErr()‚ɉü–¼EC³B
- intif_parse() C³B
- guild.c
- guild_read_castledb() C³B
-
- (char/)
- inter.c
- inter_send_packet_length[] C³B
- int_guild.c
- inter_guildcastle_tostr() C³B
- inter_guildcastle_fromstr() C³B
- mapif_parse_GuildChangeCastle() C³B
- mapif_parse_GuildCastleInfo() C³B
- mapif_guild_castle_info() C³B
- mapif_guild_change_castle()‚ðmapif_guild_change_castle_err()‚ɉü–¼EC³B
- (common/)
- mmo.h C³B
- version.h C³B
-
---------------------
-//0798 by ŒÓ’±—–
-
-Elogin-server‚̃ƒOƒCƒ“Ž¸”sƒpƒPƒbƒg‚Ì’·‚³‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
-Elogin-server‚ɃAƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‹@”\’ljÁ
- Elogin_athena.cnf‚Éorder,allow,deny‚ð‹Lq‚·‚邱‚Æ‚ÅA
- IP’PˆÊ(‘O•ûˆê’v)‚ŃAƒNƒZƒX‚ð‹ÖŽ~‚·‚é‹@”\B
- EŽw’è•û–@‚Í doc/conf_ref.txt ‚ðŽQÆ
-
- (doc/)
- conf_ref.txt
- login_athena.cnf‚Ì•”•ªC³
- (login/)
- login.c
- ƒOƒ[ƒoƒ‹•Ï” access_* ’ljÁ
- parse_login()C³,check_ip()’ljÁ
-
-EƒAƒJƒEƒ“ƒg쬗pCGIƒXƒNƒŠƒvƒg’ljÁ
- EŽ©ŒÈÓ”C•Úׂȉðà–³‚µAŽ¿–₳‚ê‚Ä‚àƒXƒ‹[‚·‚é‰Â”\«—L‚è
- EƒGƒfƒBƒ^‚ÅŠJ‚¢‚½‚ç­‚µà–¾—L‚è
- ECGIÝ’u‚ÌŠî–{‚³‚¦‚í‚©‚ê‚Ζâ‘è‚È‚¢‚Í‚¸
- EƒƒbƒZ[ƒW‚͉pŒêA“ú–{Œê—¼‘Ήž
- iAccept-Language‚ªja‚È‚ç“ú–{Œê‚É•ÏŠ·‚µ‚Ü‚·j
- EŠÇ—ŽÒƒpƒXƒ[ƒh‚È‚µ‚Å“®‚­‚̂ŃZƒLƒ…ƒŠƒeƒB‚É‚Í’ˆÓ(.htaccess‚È‚Ç„§)
-
- (tool/cgi/)
- addaccount.cgi
- ƒAƒJƒEƒ“ƒg쬗pCGIB
-
-E‚»‚Ì‘¼
- (tool/)
- backup
- castle.txt‚àƒoƒbƒNƒAƒbƒv‚·‚é‚悤‚É
-
---------------------
-//0797 by Ž€_
-
-E­‚µC³B
-Ebattle_athena.conf‚Ì€–Ú•ÏXB(lootitem_time íœAitem_first_get_timeA
-item_second_get_timeAitem_third_get_timeAmvp_item_first_get_timeA
-mvp_item_second_get_timeAmvp_item_third_get_time ’ljÁB)
-EƒAƒCƒeƒ€ƒ‹[ƒgŒ ŒÀ‚𳂵‚­ŽÀ‘•BʼnUŒ‚‚Å‚Í‚È‚­—^‚¦‚½ƒ_ƒ[ƒW‚Ì
-—Ê‚É‚æ‚Á‚ÄŽû“¾Œ ŒÀ‚ð—^‚¦‚é‚悤‚É•ÏXB(ʼnŽû“¾Œ ŒÀ‚̂݃eƒXƒg)
-ƒp[ƒeƒB‚Ìꇃp[ƒeƒB‚ÌÝ’è‚ɇ‚킹‚é•K—v‚ª‚ ‚è‚Ü‚·‚ª‚Ü‚¾ƒpƒPƒbƒg‚ª
-•s–¾‚ÈŠ‚ª‚ ‚éˆ×“¯‚¶ƒp[ƒeƒB‚È‚çŽû“¾‚Å‚«‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
-Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚̃oƒOC³B(‘½•ªC³‚³‚ꂽ‚Í‚¸...)
-E‘•”õƒXƒNƒŠƒvƒgbonus‚ÉbSplashRange‚ÆbSplashAddRange’ljÁB
-bSplashRange‚ÆbSplashAddRange‚Í•Ší‚Ń_ƒ[ƒW‚ð—^‚¦‚½Žž‚Ì‚Ý”­“®A’Êí‚Ì•ŠíUŒ‚ˆµ‚¢‚È‚Ì‚Å”ð‚¯‚ç‚ê‚邪(Flee2‚É‚æ‚銮‘S‰ñ”ð‚Í•s‰Â”\)ƒNƒŠ‚Ío‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ä•Ší‚É‚æ‚éó‘ÔˆÙí‚Í”­¶‚µ‚Ü‚¹‚ñB–{ŽIŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñB
-EƒXƒLƒ‹‚Ìd‚Ë’u‚«ˆ—‚ð–{ŽI‚ɇ‚킹‚ÄC³B
-Emapflag‚Ìgvg‚Í‚¢‚‚à‚È‚Á‚Ä‚¢‚é‚킯‚¶‚á‚È‚¢‚Ì‚ÅíœB
-E‚»‚Ì‘¼×‚©‚¢C³B
- athena-start C³B
- (common/)
- mmo.h C³B
- (conf/)
- mapflag.txt C³B
- battle_athena.conf C³B
- (db/)
- const.txt C³B
- item_db.txt C³B
- (doc/)
- conf_ref.txt C³B
- item_bonus.txt C³B
- (map/)
- mob.c
- mob_spawn()Amob_damage()Amob_class_change()Amob_warp() C³B
- mob_delay_item_drop()Amob_delay_item_drop2() C³B
- mobskill_castend_pos() C³B
- pc.c
- pc_takeitem()Apc_dropitem()Apc_equipitem() C³B
- pc_calcstatus()Apc_bonus() C³B
- skill.c
- skill_attack()Askill_additional_effect()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_produce_mix() C³B
- skill_arrow_create()Askill_unit_timer_sub()Askill_castend_pos() C³B
- map.h C³B
- map.c
- map_addflooritem() C³B
- script.c
- buildin_getitem() C³B
- pet.c
- pet_return_egg()Apet_get_egg()Apet_unequipitem() C³B
- battle.h C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack() C³B
- battle_weapon_attack()Abattle_config_read() C³B
-
---------------------
-//0796 by huge
-
-Eׂ©‚¢C³
- (conf/npc/)
- npc_event_valentine.txt C³B
-
- (map/)
- pc.c
- pc_takeitem() C³B
- skill.c
- skill_unit_timer_sub() C³B
-
---------------------
-//0795 by Kalen
-
-EŽG’k341‚Ìnpc_warp_niflheim.txt’ljÁ
- conf/warp/npc_warp_niflheim.txt
-
-Emapflag.txtC³(GVGMAPÝ’è)
- @nosave‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñ
-
-Emap_athena.conf‚ÌC³
- @umbala niflheim“™‚̒ljÁ
- @ƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚ ‚è‚Ü‚·B
-
-EƒoƒŒƒ“ƒ^ƒCƒ“ƒXƒNƒŠƒvƒg’ljÁ
- conf/npc/npc_event_valentine.txt
- @ƒ`ƒ‡ƒR’B‚ÌDrop‚͘M‚Á‚Ä‚¢‚Ü‚¹‚ñB‚¨D‚Ý‚Å‚Ç‚¤‚¼
- @®AŽèì‚èƒ`ƒ‡ƒR‚ðH‚ׂ½‚Æ‚«‚̃GƒtƒFƒNƒg‚Í
- @ÅVƒNƒ‰ƒCƒAƒ“ƒg‚É‚·‚ê‚ÎŒ©‚¦‚Ü‚·B
-
-EGVGScript’ljÁ
- conf/gvg/ˆÈ‰º
- @WeissŽž‘ã‚É쬂µ‚½‚à‚Ì‚ðAthena—p‚ɃRƒ“ƒo[ƒg&‘䎌C³
- @prtg_cas01ˆÈŠO‚ÍŠø‚Ì‚Ý‚Å‚·B
- @GVGDATA‚ÍŽIÄ‹N“®‚ÅÁ–Å‚µ‚Ü‚·B
- @ƒGƒ‰[‚ªo‚é‚悤‚È‚çƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚­‚¾‚³‚¢B
- @MobDataAŽ·Ž–Script‚àprtg_cas01‚Ì‚Ý‚Å‚·B(TestScript)
- @‚ ‚­‚܂ŃeƒXƒgƒXƒNƒŠƒvƒg‚Å‚·BGVGŽÀ‘•‚ÌŽQl‚É‚Ç‚¤‚¼
-
---------------------
-//0794 by DRG
-
-Eskillused‚ÅŽw’肵‚½IW,QM‚È‚Ç‚É‚Ì‚Á‚Ä‚éŠÔMOBƒXƒLƒ‹‚ðŽg—p‚·‚é‚悤‚É•ÏX
-EƒAƒbƒvƒXƒŒ‚R‚Ì7‚Ìathena-start‚ðˆê‰žŠÜ‚ß‚Æ‚«‚Ü‚µ‚½
-
- athena-start
- (map/)
- skill.c
- skill_unit_onplace() C³B
-
---------------------
-//0793 by huge
-
-EƒT[ƒo[snapshot
-EƒT[ƒo[‚ªƒNƒ‰ƒbƒVƒ…‚·‚éƒoƒO‚ðC³
-E”­“®‚¹‚¸‚Éã©‚ªÁ‚¦‚½‚çAÝ’u—pƒgƒ‰ƒbƒv‚ª•Ô‚Á‚Ä‚­‚é‚悤‚ÉC³B
-Eƒ‹[ƒgŒ ŒÀ‚ÅA“¯‚¶ƒp[ƒeƒB[‚̃Lƒƒƒ‰‚Í‚·‚®E‚¦‚é‚悤‚ÉC³B
-EƒoƒO•ñƒXƒŒ‚R >>54 ‚̃oƒOC³B
-EƒƒOƒCƒ“Žž‚ɃT[ƒo[‘¤‚ÉID‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
- (login/)
- login.c
- parse_login() C³B
- (conf/npc/)
- npc_event_doll.txt C³B
- (map/)
- skill.c
- skill_unit_timer_sub() C³B
- mob.c
- mob_spawn_dataset() C³B
- mob_damage() C³B
- pc.c
- pc_additem() C³B
-
---------------------
-//0791 by ¹
-
-Eƒ}ƒbƒvƒT[ƒo‚ªƒNƒ‰ƒbƒVƒ…‚·‚éƒoƒOC³B
-EƒCƒO—t‚ðŽg‚Á‚Ä‚àƒWƒFƒ€‚ª•K—v‚É‚È‚é–â‘è‚ðC³B
-EPvP‹­§‘—ŠÒŽÀ‘•B
-EPvP‚ŃŠƒUƒŒƒNƒVƒ‡ƒ“‚ªo—ˆ‚È‚©‚Á‚½–â‘è‚ðC³B
-E‚»‚Ì‘¼×‚©‚ÈC³B
- (map/)
- guild.c
- mob.c
- pc.c
- skill.c
-
---------------------
-//0790 by Ž€_
-
-EƒoƒOC³B
- (conf/)
- battle_athena.conf ŒëŽšC³B
- (doc/)
- conf_ref.txt ŒëŽšC³B
- (common/)
- mmo.h C³B
- (map/)
- itemdb.h C³B
- map.h C³B
- skill.c
- skill_check_condition()Askill_use_pos()Askill_unit_onplace() C³B
-
---------------------
-//0789 by huge
-
-EƒhƒƒbƒvƒAƒCƒeƒ€‚Ƀ‹[ƒgŒ ŒÀ‚ðŽÀ‘•B
-Eʼn‚ÉUŒ‚‚µ‚½lˆÈŠO‚ªƒhƒƒbƒvƒAƒCƒeƒ€‚ðE‚¦‚é‚Ü‚Å‚ÌŽžŠÔ‚ðÝ’è‚Å‚«‚é‚悤‚ÉB
- (/conf)
- battle_athena.conf €–ڒljÁB
-
- (/doc)
- conf_doc.txt à–¾’ljÁB
-
- (/map)
- battle.h
- Battle_Config{} C³B
- battle.c
- battle_config_read() C³B
- itemdb.h
- item_data {} C³B
- map.h
- flooritem_data {} C³B
- mob_data {} C³B
- map.c
- map_addflooritem() C³B
- mob.c
- delay_item_drop{} C³B
- mob_spawn() C³B
- mob_damage() C³B
- mob_delay_item_drop() C³B
- mob_warp() C³B
- pc.c
- pc_takeitem() C³B
-
---------------------
-//0788 by ‚ ‚ä‚Ý
-
-EcardƒXƒLƒ‹‚̈—H‚ðC³B
-E@allskillƒRƒ}ƒ“ƒh‚ÌÄC³B
-
- (map/)
- pc.c
- pc_skill() C³B
- pc_allskillup() C³B
-
---------------------
-//0787 by ‚Û‚Û‚Û
-
-Eƒyƒbƒg‚É‚àmob_avail.txt‚ÌÝ’è‚ð“K—p‚·‚é‚悤‚É‚µ‚½B
-EMOBƒXƒLƒ‹‚Ìskillused‚Åval1‚É0‚ð“ü‚ê‚é‚Æ‚ ‚ç‚ä‚éƒXƒLƒ‹‚ɑ΂µ‚Ä”­“®‚·‚é‚悤‚É‚µ‚½B
-Eskillused‚Å”­“®‚µ‚½ƒXƒLƒ‹‚Ì‘ÎÛ‚ðA”­“®‚³‚¹‚½PC‚É‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚é‚悤‚É‚µ‚½(‘ÎIWƒnƒ‚È‚ÇH)B
- (/map)
- clif.c
- clif_pet0078()Aclif_pet007b()C³B
- mob.c
- mobskill_use()C³B
- skill.c
- skill_attack() Askill_castend_damage_id()C³B
- battle.h
- battle.c
- battle_config_read()C³B
-
---------------------
-//0786 by huge
-
-EBDSC³
- ‘O‚©‚ç‚«”ò‚΂µ‚Äs‚­‚Æ—Ç‚­‚È‚¢‚©‚à‚µ‚ê‚È‚¢‚Ì‚ÅAŒã‚ë‚©‚爗
- —LŒø”͈͂ÌC³
-
- (/map)
-
- skill.h
- skill.c
- skill_castend_damage_id() C³B
- skill_castend_nodamage_id() C³B
- skill_brandishspear_first() C³B
- skill_brandishspear_dir() C³B
-
---------------------
-//0785 by Ž€_
-
-E–{ŽI‚ɇ‚킹‚ÄC³B(ŠØ‘ˆÆ‚̃pƒbƒ`notice‚ðŽQl‚µ‚ÄC³‚µ‚Ü‚µ‚½B)
-EBB‚ÆBS‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ð0.7•b‚É‚µ‚ăfƒBƒŒƒC‚Í0‚É•ÏXB
-Eghost‚Ì•Ï‚í‚è‚Ƀ}ƒbƒvˆÚ“®Œã‚Ì–³“GŽžŠÔ‚ðÝ’èB‚±‚ÌŽžŠÔ‚ÌŠÔ‚Í‚Ç‚ñ‚ÈUŒ‚‚àŽó‚¯‚È‚¢‚ªˆÚ“®‚âUŒ‚AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚Å‚±‚ÌŽžŠÔ‚Í‚È‚­‚È‚è‚Ü‚·BƒV[ƒYƒ‚[ƒh‚Å‚Í‚±‚Ì–³“GŽžŠÔ‚ð2”{‚Æ‚µ‚Ä“K—pB
-EƒV[ƒYƒ‚[ƒh‚ÅŽ€‚ñ‚Å‚àŒoŒ±‚ªŒ¸‚ç‚È‚¢‚悤‚ÉC³B(mapflag‚Ìnopenalty‚ðÝ’è‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB)
-EƒXƒLƒbƒh‚ÅŠŠ‚ׂ鋗—£‘‰ÁB
-EŠù‚É’¾–Ù‚É‚©‚©‚Á‚Ä‚é‘ÎۂɃŒƒbƒNƒXƒfƒBƒr[ƒi‚ðŽg‚¤‚Æ’¾–Ù‚ª‰ðœ‚³‚ê‚é‚悤‚É•ÏXB
-EŽô‚¢‚É‚©‚©‚é‚ƈړ®‘¬“x‚àŒ¸‚é‚悤‚ÉC³B
-Ebattle_athena.conf‚É€–Ú•ÏXB
-EƒXƒLƒ‹‚Ìd‚Ë’u‚«‚ð”»’fˆ—‚ð­‚µ•ÏXB
-EHP‚ÌŽ©‘R‰ñ•œŽžŠÔ‚ª4•b‚Å‚Í‚È‚­6•b‚¾‚Æ‚í‚©‚Á‚½‚̂ŃfƒtƒHƒ‹ƒgC³‚Æbattle_athena.confC³B
-E‚»‚Ì‘¼×‚©‚¢C³‚âƒoƒOC³B
-E–w‚ǃeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB
- (conf/)
- atcommand_athena.conf C³B
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- cast_db.txt C³B
- (map/)
- atcommand.c C³B
- clif.c
- clif_mob0078()Aclif_mob007b()Aclif_skill_estimation() C³B
- clif_mob_class_change()Aclif_parse_WalkToXY() C³B
- clif_parse_ActionRequest()Aclif_parse_LoadEndAck() C³B
- clif_parse_UseItem()Aclif_parse_UseSkillToId() C³B
- clif_parse_UseSkillToPos()Aclif_parse_UseSkillMap() C³B
- mob.h C³B
- mob.c
- mob_get_viewclass()Amob_attack()Amob_target() C³B
- mob_ai_sub_hard_activesearch()Amob_ai_sub_hard() C³B
- mobskill_castend_id()Amobskill_castend_pos() C³B
- skill.h C³B
- skill.c
- skill_can_produce_mix()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_castend_id() C³B
- skill_castend_pos()Askill_use_id()Askill_readdb() C³B
- skill_check_condition()Askill_unit_onplace()Askill_unitsetting() C³B
- skill_additional_effect()Askill_check_unit_range() C³B
- skill_check_unit_range_sub()Askill_status_change_end() C³B
- skill_status_change_start() C³B
- pc.h
- pc.c
- pc_ghost_timer()Apc_setghosttimer()Apc_delghosttimer() íœB
- pc_gvg_invincible_timer() -> pc_invincible_timer()‚É•ÏXB
- pc_setgvginvincibletimer() -> pc_setinvincibletimer()‚É•ÏXB
- pc_delgvginvincibletimer() -> pc_delinvincibletimer()‚É•ÏXB
- pc_authok()Apc_attack_timer()Apc_calcstatus() C³B
- pc_setrestartvalue()Apc_damage()Apc_allskillup() C³B
- do_init_pc() C³B
- battle.h C³B
- battle.c
- battle_config_read()Abattle_weapon_attack()Abattle_check_target() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_get_speed() C³B
- map.h C³B
- map.c
- map_quit() C³B
-
---------------------
-//0784 by ‚ ‚ä‚Ý
-
-EƒJ[ƒhƒXƒLƒ‹‚ðŠo‚¦‚Ä‚¢‚éó‘Ô‚Å@allskillƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é‚Æmap-server‚ª–\‘–‚·‚é–â‘è‚ðC³B
-
- (map/)
- pc.c
- pc_allskillup() C³B
-
---------------------
-//0783 by huge
-
-Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA‚ÌC³
- ”͈͎w’èAŽÎ‚ß‚ÌÛ‚ÌŠiŽq”͈ÍAUŒ‚—ÍŒvŽZ
- ‘½•ª‡‚Á‚Ä‚é‚ÆŽv‚¤‚ñ‚Å‚·‚¯‚ÇAƒCƒ}ƒCƒ`Ž©M‚ªŽ‚Ä‚È‚¢EEE
- (ŽQl)‚Ý‚·‚Ƃꑃ -ƒXƒLƒ‹ŠÖ˜A“¤î•ñ
-EƒXƒyƒ‹ƒuƒŒƒCƒJ[‚ð‚¿‚å‚Á‚ÆC³
-Eƒvƒƒ{ƒbƒN‚ðMVPmob‚ÉŒø‚©‚È‚¢‚悤C³
-EƒoƒO•ñƒXƒŒ‚R >>8 ‚Å•ñ‚³‚ꂽ‚à‚Ì‚ÌŽæ‚èž‚Ý
-
- (/db)
- create_arrow.txt C³B
- skill_db.txt C³B
-
- (/map)
- battle.c
- battle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack() C³B
-
- skill.h
- skill.c
- skill_brandishspear_first() ’ljÁB
- skill_brandishspear_dir() ’ljÁB
- skill_castend_nodamage_id() C³B
- skill_castend_damage_id() C³B
- skill_unit_group() C³B
-
---------------------
-//0782 by ‚Ò‚´‚Ü‚ñ
-E@allskillƒRƒ}ƒ“ƒh‚ÌŽg—pðŒ‚ªŽQÆ‚³‚ê‚Ä‚¢‚È‚©‚Á‚½ƒoƒOC³
- (/map)
- atcommand.c
- atcommand() C³B
-
---------------------
-//0781 by Chunglyeng
-Eƒoƒh, ƒ_ƒ“ƒT[‰¹Šy‹ïŒ»
- (/map)
- skill.c C³B
-
---------------------
-//0780 by reia
-EƒyƒRƒyƒR‚Ì—‘‚È‚Ç‚ª›z‰»‚·‚é‚ƃmƒr‚É‚È‚Á‚Ä‚µ‚Ü‚¤–â‘èC³B
-EGMƒRƒ}ƒ“ƒhu@kickallv‚ª‰½Žž‚ÌŠÔ‚É‚©–³Œø‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³B
-
- (/conf)
- atcommand_athena.conf C³B
- (db/)
- mob_skill_db.txt C³B
- (map/)
- atcommand.c
- atcommand_config_read() C³B
-
---------------------
-//0779 by ‚ ‚ä‚Ý
-
-E‘SƒXƒLƒ‹Žæ“¾ƒRƒ}ƒ“ƒh‚̒ljÁB
- EGM‚Å‘SƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚悤‚É‚µ‚Ä‚¢‚éꇂâAƒXƒLƒ‹‚Ì”‚ª‘½‚¢E‹Æ‚͈ꕔ‚̃XƒLƒ‹•\Ž¦‚ª‚¨‚©‚µ‚­‚È‚è‚Ü‚·B‚»‚Ìꇂ̓ŠƒƒO‚µ‚ĉº‚³‚¢B
- @allskill : Œ»Ý‚ÌE‹Æ‚Ŏ擾‰Â”\‚È‘SƒXƒLƒ‹‚ðŽæ“¾‚·‚éB(ƒNƒGƒXƒgƒXƒLƒ‹ŠÜ‚Þ)
-
- (conf/)
- battle_athena.conf C³B
- help.txt C³B
- (map/)
- atcommand.h C³B
- atcommand.c
- atcommand() C³B
- pc.h C³B
- pc.c
- pc_allskillup() ’ljÁB
- (doc/)
- conf_ref.txt C³B
- help.txt C³B
-
---------------------
-//0778 by huge
-
-EƒXƒyƒ‹ƒuƒŒƒCƒJ[‚ÌC³
- EƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚Ì–³‚¢ƒXƒLƒ‹‚É‚ÍŒø‚©‚È‚¢‚悤‚ÉC³B
- EŽg—p‚³‚ꂽ‘ŠŽè‚ÌÁ”ïSP‚ÌC³B
-
- (map/)
- skill.c
- skill_castend_nodamage_id() C³B
-
---------------------
-//0777 by ‚Ò‚´‚Ü‚ñ
-
-EƒMƒ‹ƒhUé퉼ŽÀ‘•
-@EŠî–{“I‚È•”•ª‚¾‚¯‚µ‚©ŽÀ‘•‚µ‚Ä‚È‚¢ãA‚¢‚­‚‚©‚Ì“_‚Å–{ŽI‚Æ‘Šˆá‚ª‚ ‚è‚Ü‚·B
-@EUéíŠJŽn‚ÆI—¹‚Í@ƒRƒ}ƒ“ƒh‚Ås‚¢‚Ü‚·
- @gvgstart : UéíŠJŽn
- @gvgend : UéíI—¹
-@Ebattle_athena.conf‚É€–ڒljÁB
- (char/)
- int_guild.c
- inter_guild_init()Ainter_guild_readdb()Ainter_guild_save() C³B
- inter_castle_save_sub()Amapif_guild_castle_info() ’ljÁB
- mapif_guild_change_castle()Amapif_parse_GuildCastleInfo() ’ljÁB
- mapif_parse_GuildChangeCastle() ’ljÁB
- inter.c
- inter_config_read() C³B
- inter_send_packet_length[]Ainter_recv_packet_length[] C³B
- int_guild.h C³B
- (map/)
- atcommand.c
- atcommand()Aatcommand_config_read() C³B
- battle.c
- battle_config_read() C³B
- guild.c
- guild_castle_search()Aguild_read_castledb()’ljÁB
- do_init_guild() C³B
- guild_gvg_init()Aguild_gvg_final()Aguild_gvg_final_sub() ’ljÁB
- guild_gvg_eliminate()Aguild_gvg_eliminate_sub() ’ljÁB
- guild_gvg_eliminate_timer()Aguild_gvg_empelium_pos() ’ljÁB
- guild_gvg_break_empelium() ’ljÁB
- intif.c
- intif_parse()Apacket_len_table[] C³B
- intif_parse_GuildCastleInfo()Aintif_parse_GuildCastleChange() ’ljÁB
- intif_guild_castle_info()Aintif_guild_castle_change() ’ljÁB
- mob.c
- mob_damage() C³B
- atcommand.h C³B
- battle.h C³B
- guild.h C³B
- intif.h C³B
- mob.h C³B
- (common/)
- mmo.h C³B
- (conf/)
- battle_athena.conf C³B
- inter_athena.conf C³B
- msg_athena.conf C³B
- atcommand_athena.conf C³B
- (db/)
- castle_db.txt ’ljÁB
---------------------
-//0776 by Ž€_
-
-ENPCƒXƒLƒ‹›z‰»ŽÀ‘•B(mob_skill_db.txt‚Ìval1‚ðŽg‚¢‚Ü‚·B)
-Emob_skill_db.txt‚ÌŠm—¦‚ð番—¦‚©‚ç–œ•ª—¦‚É•ÏXB(‚½‚¾mob_skill_db.txt‚ÌC³‚Í‚µ‚Ä‚Ü‚¹‚ñB)
-Eƒ‚ƒ“ƒXƒ^[‚ªƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚·‚é–â‘èC³B(C³‚³‚ꂽ‚©‚Ç‚¤‚©‚ÌŽ©M‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
-E‚»‚Ì‘¼×‚©‚¢C³B
- (db/)
- mob_skill_db.txt C³B
- skill_db.txt C³B
- (map/)
- map.h C³B
- mob.h C³B
- mob.c
- mob_spawn_dataset()Amob_spawn() C³B
- mob_changestate()Amobskill_use() C³B
- mob_class_change() ’ljÁB
- npc.c
- npc_parse_mob() C³B
- battle.c
- battle_check_target() C³B
- clif.h C³B
- clif.c
- clif_mob_class_change() ’ljÁB
- skill.c
- skill_castend_nodamage_id() C³B
-
---------------------
-//0775 by Ž€_
-
-EƒV[ƒYƒ‚[ƒh‚̈—C³B
-EƒV[ƒYƒ‚[ƒh‚Ì–³“GŽžŠÔ‚ÌŠÔ‚Í‚Ç‚ñ‚ÈUŒ‚‚àŽó‚¯‚È‚¢‚悤‚ÉC³B
-EƒV[ƒYƒ‚[ƒh‚Ì–³“GŽžŠÔ‚ªŽžŠÔØ‚ê‚É‚È‚é‘O‚ɂ͉𜂳‚ê‚È‚¢‚悤‚ÉC³B
-Ebattle_athena.conf‚É€–ڒljÁB
-E@hide‚â/hide‚É‚æ‚éGMƒnƒCƒfƒBƒ“ƒO’†‚ÍŽ©•ª‚ÉŽ©“®Žg—p‚³‚ê‚éƒXƒLƒ‹ˆÈŠO‚̃XƒLƒ‹Žg—p‚âUŒ‚‚ðŽó‚¯‚È‚¢‚悤‚ÉC³B
-EƒnƒCƒfƒBƒ“ƒO’†’n‘®«ƒXƒLƒ‹ˆÈŠO‚ÌUŒ‚‚ðŽó‚¯‚È‚¢‚悤‚ÉC³B(ƒgƒ‰ƒbƒv‚âƒNƒ@ƒOƒ}ƒCƒA“™‚̃XƒLƒ‹‚͉e‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©•s–¾‚È‚Ì‚Å¡‚Ü‚Å‚Æ“¯‚¶‚悤‚ɉe‹¿‚ðŽó‚¯‚é‚悤‚Ɉ—B)
-Eƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu‚̈ړ®‘¬“x‚ð–{ŽI‚ɇ‚킹‚Ü‚µ‚½B
-E‚»‚Ì‘¼ƒoƒOC³‚âׂ©‚¢C³B(–w‚Ç–¢ƒeƒXƒg)
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_check_target()Abattle_calc_damage() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_calc_misc_attack() C³B
- battle_config_read()Abattle_weapon_attack() C³B
- pc.h C³B
- pc.c
- do_init_pc()Apc_authok() C³B
- pc_attack()Apc_attack_timer() C³B
- pc_setgvg_ghosttimer()Apc_delgvg_ghosttimer()‚ð
- pc_setgvginvincibletimer()Apc_delgvginvincibletimer()‚ÉC³B
- pc_gvg_invincible_timer() ’ljÁB
- pc_attack_timer()Apc_steal_item()Apc_calcstatus() C³B
- clif.c
- clif_parse_ActionRequest()Aclif_parse_UseItem() C³B
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
- clif_parse_UseSkillMap()Aclif_parse_WalkToXY() C³B
- map.h C³B
- map.c
- map_quit() C³B
- mob.c
- mob_attack()Amob_target()Amob_ai_sub_hard_activesearch() C³B
- mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
- mob_damage()Amobskill_castend_id()Amobskill_castend_pos() C³B
- skill.c
- skill_castend_damage_id()Askill_attack() C³B
- skill_castend_id()Askill_castend_pos()Askill_castend_map() C³B
-
---------------------
-//0774 by Ž‚Žqo^.^o
-EMonk job bouns C³
-EƒhƒPƒr C³
-(db/)
- job_db2.txt C³
- pet_db.txt C³
-
---------------------
-//0773 by ¹
-
-Eׂ©‚¢ƒoƒOC³
- (map/)
- skill.c C³B
- battle.c C³B
-
---------------------
-//0772 by ‚Ò‚´‚Ü‚ñ
-
-EƒV[ƒYƒ‚[ƒh‰º‚ňȉº‚Ì“_‚ðC³
-@E˜A‘±‚µ‚ÄUŒ‚‚Å‚«‚È‚­‚È‚Á‚Ä‚¢‚½ƒoƒOC³
-@Eƒ_ƒ[ƒWŒyŒ¸—¦‚ª³‚µ‚­Ý’è‚Å‚«‚È‚©‚Á‚½ƒoƒOC³
-@E–³“GŽžŠÔŽÀ‘•Bbattle_athena.conf‚Ìgvg_ghost_time‚ÅÝ’è‚Å‚«‚Ü‚·
-
-EƒnƒCƒfƒBƒ“ƒO‚Å–‚–@UŒ‚“™‚ð‰ñ”ð‚Å‚«‚È‚©‚Á‚½ƒoƒOC³
-
- (map/)
- skill.c
- skill_attack()Askill_unit_onplace()Askill_check_condition() C³B
- clif.c
- clif_parse_ActionRequest()Aclif_parse_UseItem() C³B
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
- clif_parse_UseSkillMap()Aclif_parse_WalkToXY() C³B
- pc.c
- do_init_pc()Apc_authok() C³B
- pc_attack()Apc_attack_timer() C³B
- pc_setgvg_ghosttimer()Apc_delgvg_ghosttimer() ’ljÁB
- pc_gvg_ghost_timer() ’ljÁB
- map.c
- map_quit() C³
- battle.c
- battle_config_read()Abattle_weapon_attack() C³B
- battle.h C³B
- pc.h C³B
-
---------------------
-//0771 by huge
-
-EƒXƒyƒ‹ƒuƒŒƒCƒJ[ŽÀ‘•
- (map/)
- skill.c
- skill_castend_nodamage_id() C³B
- (db/)
- skill_db.txt C³B
-
---------------------
-//0770 by ¹
-
-E” Œn‚̈—•ÏX
-E‚»‚Ì‘¼ƒoƒOC³
- (map/)
- battle.c C³B
- itemdb.c C³B
- mob.c C³B
- script.c C³B
-
---------------------
-//0769 by Ž€_
-
-EƒV[ƒYƒ‚[ƒhC³B
-E–³“GŽžŠÔ‚Ì•û‚Íghost_timerˆÈŠO‚Ì•û–@‚ÅŽÀ‘•‚·‚é‚‚à‚è‚È‚Ì‚Å¡‚Í휂µ‚Ä‚¢‚Ü‚·B
-EƒXƒNƒŠƒvƒgviewpoint‚ª³‚µ‚­“®ì‚µ‚È‚¢–â‘èC³B
-Eproduce_db.txt‚ðC³B(“û”«‚Ískill_require_db.txt‚ň—‚µ‚Ä‚¢‚Ü‚·B‚»‚µ‚ăAƒCƒeƒ€‚Ì”‚ð0‚É‚·‚ê‚ÎÁ–Õ‚Í‚³‚ê‚È‚¢‚¯‚Çì‚鎞•K—v‚ȃAƒCƒeƒ€‚É‚È‚è‚Ü‚·B)
-E‚»‚Ì‘¼×‚©‚¢C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- produce_db.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_calc_damage()Abattle_calc_weapon_attack() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_calc_misc_attack()Abattle_check_target()Abattle_config_read() C³B
- skill.c
- skill_unit_onplace()Askill_castend_damage_id()Askill_castend_id() C³B
- skill_use_id()Askill_use_pos()Askill_check_condition() C³B
- skill_can_produce_mix() C³B
- pc.c
- pc_attack_timer()Apc_attack()Apc_isUseitem()Apc_delitem() C³B
- pc_damage() C³B
- mob.c
- mob_damage()Amobskill_use_id()Amobskill_use_pos() C³B
- script.c
- buildin_viewpoint()Abuildin_emotion() C³B
- makefile C³B
-
---------------------
-//0768 by ‚Ò‚´‚Ü‚ñ
-
-EƒV[ƒYƒ‚[ƒh‰º‚ÅAˆÈ‰º‚Ì“_‚ðC³
-@EŽ€–S‚µ‚½‚çƒZ[ƒuƒ|ƒCƒ“ƒg‚É‹­§‘—ŠÒ‚·‚é‚悤‚ÉC³
-@E“Á’è‚̃AƒCƒeƒ€‚ªŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³(ƒAƒ“ƒeƒBƒyƒCƒ“ƒƒ“ƒgEƒnƒG‚̉H)
-@E“Á’è‚̃XƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³(ƒ[ƒvƒ|[ƒ^ƒ‹EƒoƒbƒNƒXƒeƒbƒvEƒCƒ“ƒeƒBƒ~ƒfƒCƒgEƒeƒŒƒ|[ƒgEƒCƒ“ƒfƒ…ƒA)
-@E“¯–¿ƒMƒ‹ƒh‚É‚Í–³ðŒ‚ÅUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³
-@E“G‘΃Mƒ‹ƒh‚É‚Í–³ðŒ‚ÅUŒ‚‚Å‚«‚é‚悤‚ÉC³
-@E–³“GŽžŠÔ’†‚Í—¼ŽÒ‚Æ‚àUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³
-
-ƒ\[ƒXƒŒƒxƒ‹‚ŃeƒŒƒ|AƒnƒG‚ÌŽg—p‚ð‹Ö‚¶‚Ä‚¢‚邽‚ßUéíMAP‚Ìmapflag‚Énoteleport‚Í•K—v‚ ‚è‚Ü‚¹‚ñ
-‚Ü‚½A–³“GŽžŠÔ‚Íghost_timerˆË‘¶‚Å‚·B‚‚܂èbattle_athena.conf“à‚Ìghost_time‚ª–³“GŽžŠÔ‚É‚È‚è‚Ü‚·
-
- (map/)
- skill.c
- skill_castend_damage_id()Askill_castend_id() C³
- skill_check_condition() C³
- pc.c
- pc_damage() C³
- battle.c
- battle_weapon_attack() C³
-
---------------------
-//0767 by huge
-
-Eƒtƒ@[ƒ}ƒV[‚ÅA»‘¢‚Ì‘‚ªŒ¸‚é–â‘è‚ðC³
-E•Ší»‘¢DB‚ÅA‚¢‚­‚‚©”²‚¯‚Ä‚¢‚½‚Ì‚ðC³
-
- (map/)
- skill.c C³B
- (db/)
- produce_db.txt C³B
-
---------------------
-//0766 by ‚Ò‚´‚Ü‚ñ
-
-EƒV[ƒYƒ‚[ƒh‰º‚ÅAˆÈ‰º‚Ì“_‚ðC³
-@E³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃGƒ“ƒyƒŠƒEƒ€‚ÉUŒ‚‚ªŒø‚©‚È‚¢‚悤‚ÉC³
-@EƒGƒ“ƒyƒŠƒEƒ€‚ɑ΂·‚éƒXƒLƒ‹UŒ‚‚ªŒø‚©‚È‚¢‚悤‚ÉC³
-@E–‚–@UŒ‚A‰“‹——£UŒ‚A㩂̃_ƒ[ƒW•â³‚ðŽÀ‘•
-@@–‚–@UŒ‚F50%@‰“‹——£UŒ‚F75%@ã©F60%
-@@‚±‚ê‚Íl‚É‚àƒGƒ“ƒyƒŠƒEƒ€‚É‚à“K—p‚³‚ê‚Ü‚·
- (map/)
- battle.c
- #include "guild.h" ’ljÁ
- battle_calc_damage()Abattle_calc_weapon_attack() C³
-
---------------------
-//0765 by ‚Ò‚´‚Ü‚ñ
-
-E‘•”õ§ŒÀŽÀ‘•
-E‘•”õ§ŒÀ‚ª‚©‚©‚Á‚½‘•”õ•i‚ÍŠY“–ƒ}ƒbƒv‚Ɉړ®‚µ‚½Û‚ÉŽ©“®“I‚É‘•”õ‚ªŠO‚êA
-@Ä‘•”õ‚à‚Å‚«‚È‚­‚È‚è‚Ü‚·
-E§ŒÀ‚Å‚«‚é‚Ì‚Í‘•”õ•i‚Ì‚Ý‚Å‚·BƒJ[ƒh—ނͧŒÀ‚Å‚«‚Ü‚¹‚ñ
- (db/)
- item_noequip.txt ’ljÁ
- (map/)
- itemdb.h C³
- itemdb.c
- do_init_itemdb()Aitemdb_search() C³
- itemdb_read_noequip ’ljÁ
- pc.c
- pc_checkitem()Apc_isequip() C³
-
---------------------
-//0764 by Ž€_
-
-E‘S‚Ẵ_ƒ[ƒW‚ª1‚É‚È‚é–hŒä‚ð10000‚©‚ç1000000‚É•ÏXB
-Ebattle_athena.conf‚É€–ڒljÁB
-Eƒ‚ƒ“ƒXƒ^[‚©‚çŒoŒ±’l‚ð–Ⴄˆ—‚ð–{ŽI‚̂悤‚ÉC³B
-EƒXƒLƒ‹ƒXƒ[ƒ|ƒCƒYƒ“ŽÀ‘•B
-EŒðŠ·ƒoƒOC³B
-E‚»‚Ì‘¼×‚©‚¢C³B
-EƒeƒXƒg‚Í–w‚Ç‚µ‚Ä‚Ü‚¹‚ñB
- (db/)
- mob_db.txt C³B
- skill_db.txt C³B
- (doc/)
- conf_ref.txt C³B
- db_ref.txt C³B
- (conf/)
- battle_athena.conf C³B
- (map/)
- makefile C³B
- battle.h C³B
- battle.c
- battle_get_def()Abattle_get_mdef() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_calc_misc_attack()Abattle_config_read() C³B
- skill.h C³B
- skill.c
- skill_castend_nodamage_id()Askill_castend_damage_id() C³B
- skill_check_condition()Askill_status_change_timer() C³B
- skill_status_change_end()Askill_status_change_start() C³B
- skill_additional_effect()Askill_produce_mix()Askill_unit_timer_sub() C³B
- skill_check_unit_sub()‚ð skill_check_unit_range_sub()‚É•ÏXB
- skill_check_unit_range() ’ljÁB
- skill_castend_pos()Askill_area_sub_count() C³B
- mob.c
- mobskill_castend_pos()Amob_damage() C³B
- clif.c
- clif_parse_TradeRequest()Aclif_parse_TradeAck() C³B
- clif_parse_TradeAddItem()Aclif_parse_TradeOk() C³B
- clif_parse_TradeCansel()Aclif_parse_TradeCommit() C³B
- map.h C³B
- map.c
- do_init() C³B
- pc.c
- pc_calc_skilltree()Apc_calcstatus() C³B
- tarde.c
- trade_tradeack() C³B
-
---------------------
-//0763 by ŒÓ’±—–
-
-EƒT[ƒo[snapshot
- ƒtƒHƒ‹ƒ_‚ð®—‚µ‚½‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- ˆÈ‘O‚̃Z[ƒuƒf[ƒ^(account.txt‚È‚Ç)‚ÍsaveƒtƒHƒ‹ƒ_‚É’u‚¢‚Ä‚­‚¾‚³‚¢
- cnfƒtƒ@ƒCƒ‹‚ÍŠeŽíƒtƒ@ƒCƒ‹‚̃pƒX‚ª•Ï‚í‚Á‚Ä‚é‚Ì‚ÅA
- ‚±‚̌¢‚à‚Ì‚ðƒRƒs[‚Å‚Í‚È‚­AV‚µ‚­‘‚«Š·‚¦‚È‚¨‚µ‚Ä‚­‚¾‚³‚¢B
-
-EƒtƒHƒ‹ƒ_®—
- confƒtƒHƒ‹ƒ_
- NPCŠÖ˜A‚ðconf/npc/AMOB”z’uŠÖ˜A‚ðconf/mob/AWARPŠÖ˜A‚ðconf/warp/
- ƒeƒXƒg‚âƒTƒ“ƒvƒ‹‚ðconf/sample/‚Ɉړ®‚µ‚Ü‚µ‚½B
- dbƒtƒHƒ‹ƒ_
- sampleƒtƒHƒ‹ƒ_‚Ì‚¤‚¿dbŠÖŒW‚ð db/sample‚Ɉړ®‚µ‚Ü‚µ‚½B
- help.txt/motd.txt
- confƒtƒHƒ‹ƒ_‚Ɉړ®‚µ‚Ü‚µ‚½
- account.txt/athena.txt/guild.txt/party.txt/pet.txt/storage.txt
- saveƒtƒHƒ‹ƒ_‚Ɉړ®‚µ‚Ü‚µ‚½
- tool/backup
- ƒpƒXC³
-
-Emotd.txt/help.txt‚̃pƒX‚ðmap_athena.cnf‚ÅŽw’è‚Å‚«‚é‚悤‚É
- map.h/map.c/atcommand.c/atcommand.hC³
-
-Eathena-start‚ÉrestartƒIƒvƒVƒ‡ƒ“’ljÁ
- ./athena-start restart‚ÅAthena‚ðÄ‹N“®‚µ‚Ü‚·
-
---------------
-//0761 by ‚Û‚Û‚Û
-
-EMOB‚ÌMDEF‚É10000ˆÈãŽw’肵‚Ä‚àƒtƒ@ƒCƒAƒsƒ‰[‚Å•’ʂɃ_ƒ[ƒW‚ð—^‚¦‚Ä‚µ‚Ü‚¤‚Ì‚ðC³B
- (map/)
- battle.c
-
---------------
-//0760 by ll3y
-
-E•¶Žš‰»‚¯C³
- (map/)
- script.c
-
---------------
-//0759 by Ž‚Žqo^.^o
-EƒXƒsƒAƒNƒCƒbƒPƒ“ C³
-EDancer skill tree C³
-(db/)
- cast_db.txt C³
- skill_tree.txt C³
-
---------------
-//0758 by hack
-EPut GM messages into msg_table which is loaded from msg_athena.conf.
-(Easy to translate into other language)
- (map/)
- atcommand.h
- atcommand.c
- msg_conf_read() Read conf/msg_athena.conf
- Put messages into msg_table which is loaded from msg_athena.conf.
- map.c
- do_init()
- (conf/)
- msg_athena.conf Store the message of atcommand, easy to translate into other language.
-
---------------
-//0757 by Michael
- (map/)
- script.c
- buildin_viewpoint()
- Fix packet sequence of viewpoint command.
-
---------------
-//0756 by ll3y
-
-EInterix(Windows Services for Unix 3.5)‚ŃRƒ“ƒpƒCƒ‹‚ª’Ê‚é‚悤‚ÉC³
- Interop Systems(http://www.interopsystems.com/)‚æ‚ègmake‚Æzlib‚ðŽæ‚Á‚Ä‚­‚é‚©A
- Ž©‘O‚ÅInterix—p‚ð—pˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
- (common/)
- socket.h C³B
-
---------------
-//0755 by Ž€_
-
-EƒoƒOC³‚Æà–¾’ljÁB(•ñ‚³‚ꂽ‚Ì‚Í‘½•ª‘S‚ÄC³‚³‚ꂽ‚Ì‚©‚Æ...)
-E0751‚ŃXƒLƒ‹‚Ìő僌ƒxƒ‹‚ð100‚Ü‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
-Ecast_db.txt‚É“ü‚Á‚Ä‚¢‚éó‘ÔˆÙí‚̈ێŽžŠÔ‚ÍŽ©•ª‚ª“K“x‚É“ü‚ꂽ•¨‚Å‚·B–{ŽI‚ÌŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñ‚Ì‚ÅB
- (doc/)
- db_ref.txt C³B
- (db/)
- cast_db.txt C³B
- skill_db.txt C³B
- (map/)
- skill.h C³B
- skill.c
- skill_check_unit_sub()Askill_castend_id()Askill_use_id() C³B
- skill_status_change_end()Askill_status_change_start() C³B
- skill_castend_map() C³B
- mob.c
- mobskill_castend_id()Amobskill_castend_pos() C³B
- pc.c
- pc_calcstatus() C³B
- battle.c
- battle_calc_pc_weapon_attack()
- battle_calc_mob_weapon_attack()
- battle_calc_magic_attack()
-
---------------
-//0754 by Ž‚Žqo^.^o
-(db/)
- cast_db.txt C³
-
---------------
-//0753 by ¹
-
-EIW‚Ì”­¶ƒ|ƒCƒ“ƒg‚ðŽw’è‚·‚é‚ƃƒeƒI‚̃GƒtƒFƒNƒg‚ªˆêØo‚È‚­‚È‚é
-@–â‘肪•œŠˆ‚µ‚Ä‚¢‚½‚Ì‚ÅC³B
-Ewarning‚ðo‚È‚¢‚悤‚ɃR[ƒhC³B
- (map/)
- skill.c
- skill_castend_pos2() C³B
- chrif.h
-
---------------
-//0752 by ‚Ò‚´‚Ü‚ñ
-
-EchangesexƒXƒNƒŠƒvƒgŽÀ‘•B«•Ê‚𔽓]‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·
-@«•Ê”½“]¬Œ÷Œã‚ÍA‚»‚̃vƒŒƒCƒ„[‚Í‹­§“I‚ÉÚ‘±‚ðØ’f‚³‚ê‚Ü‚·
-@‚Ü‚½Aƒ_ƒ“ƒT[Eƒo[ƒh‚̌݊·«‚Í‚©‚È‚è‰ö‚µ‚¢‚Å‚·
-@ƒ_ƒ“ƒT[Eƒo[ƒh‚ªƒXƒƒbƒg“à‚Ç‚±‚©‚É‹‚éƒAƒJƒEƒ“ƒg‚Å‚Ì”½“]‚ÍAˆÈ‰º‚Ì“_‚É’ˆÓ‚µ‚ĉº‚³‚¢
-@E•K‚¸”½“]‚³‚¹‚é‘O‚É‚»‚̃Lƒƒƒ‰ƒNƒ^[‚ðƒXƒLƒ‹ƒŠƒZƒbƒg‚µ‚Ä‚­‚¾‚³‚¢
-@@‚»‚Ì‚Ü‚Ü”½“]‚³‚¹‚é‚ÆA‹¤’Ê‚·‚éƒXƒLƒ‹(ŠyŠí‚Ì—ûK“™)‚µ‚©Žc‚ç‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·
-@Eƒ_ƒ“ƒT[Eƒo[ƒhê—p•Ší‚ð‘•”õ‚µ‚Ä‚¢‚éꇂÍAŠO‚µ‚Ä‚©‚甽“]‚³‚¹‚Ä‚­‚¾‚³‚¢
-@@‚»‚Ì‚Ü‚Ü”½“]‚³‚¹‚é‚ÆA‚»‚̃Lƒƒƒ‰ƒNƒ^[‚ÌŠJŽnŽž‚É
-@@ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ªo‚Ü‚·io‚邾‚¯‚ÅA—Ž‚¿‚邱‚Æ‚Í‚È‚¢‚Ì‚Å‚·‚ªcj
-Eƒf[ƒ^ƒx[ƒXC³ by Ž‚Žqo^.^o
- (map/)
- chrif.c
- packet_len_table[]Achrif_parse()C³
- chrif_changesex()Achrif_changedsex()’ljÁ
- chrif.h C³
- (char/)
- char.c
- parse_frommap()Aparse_tologin()C³
- (login/)
- login.c
- parse_fromchar()C³
- (db/)
- cast_db.txt C³
- skill_require_db.txt C³
-
---------------
-//0751 by Ž€_
-
-Eskill_db.txt‚Æcast_db.txt‚Ì•ÏX‚Æskill_require_db.txt‚̒ljÁB
-E“Å‚É‚©‚©‚é‚ÆHP‚ªŒ¸‚é‚悤‚É•ÏXBHP‚Í1•b‚ÉÅ‘åHP‚Ì1%Œ¸‚è‚Ü‚·B(–¢ƒeƒXƒg)
-EΉ»‚ðis’†‚Ì•¨‚ÆŠ®‘S‚È•¨‚É•ª‚¯‚ÄHP‚ªŒ¸‚é‚悤‚É•ÏXB(1•b‚ÉÅ‘åHP‚Ì1%)ƒuƒŒƒbƒVƒ“ƒO‚ÅŠ®‘SΉ»‚¾‚¯Ž¡‚¹‚é‚悤‚ÉC³B(–¢ƒeƒXƒg)
-Eƒnƒ“ƒ^[‚̃gƒ‰ƒbƒv‚ɃGƒtƒFƒNƒgŽÀ‘•B‚½‚¾ƒ‰ƒ“ƒhƒ}ƒCƒ“‚ƃVƒ‡ƒbƒNƒEƒF[ƒu‚Í”š”­ƒGƒtƒFƒNƒg‚ªo‚È‚¢‚悤‚Å‚·Bƒ‰ƒ“ƒhƒ}ƒCƒ“‚̓tƒ@ƒCƒAƒsƒ‰[‚Ì”š”­ƒGƒtƒFƒNƒg‚ªo‚é‚悤‚É•Ï‚¦‚Ä‚¢‚Ü‚·B
-EƒI[ƒgƒJƒEƒ“ƒ^[‚Ì•ûŒüƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚É•ÏX‚Æ–{ŽIŽd—l‚ɇ‚킹‚Ü‚µ‚½B
-EƒoƒbƒNƒXƒ^ƒu‚à•ûŒüƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚É•ÏXB
-EƒCƒ“ƒeƒBƒ~ƒfƒCƒg‚̈—•ÏXB
-EƒfƒBƒtƒFƒ“ƒ_[‚̈ړ®‘¬“xŒ¸­‚ð–{ŽI‚ɇ‚킹‚Ü‚µ‚½BASPD‚ÍŸŽè‚È‚ª‚ç
-(30 - (skilllv*5))%‚ªŒ¸‚é‚悤‚É‚µ‚Ü‚µ‚½‚ª–{ŽI‚Å‚¢‚­‚ç’öŒ¸‚é‚Ì‚©‚Ìî•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-Eƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒuLV1‚ňړ®‘¬“x‚ª150‚©‚ç312‚É‚È‚é‚Ì‚ªŠm”F‚³‚ê‚ÄŒvŽZ‚ð•ÏX‚µ‚Ü‚µ‚½‚ªƒŒƒxƒ‹‚É‚æ‚Á‚Ä‚Ç‚ê‚®‚ç‚¢‘‰Á‚·‚é‚©‚Í•s–¾‚Å‚·Bî•ñ‚ð‹‚ß‚Ü‚·B(¡‚ÌŒvŽZŽ®‚Í“K“x‚Éì‚Á‚½•¨‚Å‚·B)
-Eƒ|[ƒVƒ‡ƒ“»‘¢‚ÌŒvŽZŽ®•ÏX‚Æ‚¿‚å‚Á‚ÆC³B
-Eˆê•”’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹ÖŽ~B
-EbNoMagicDamage‚Å–‚–@‚É‚æ‚éˆÙí‚âƒXƒe[ƒ^ƒXƒAƒbƒvŒø‰Ê‚ªo‚È‚¢‚悤‚ÉC³B(ƒŠƒUƒŒƒNƒVƒ‡ƒ“ˆÈŠO‚Ì–‚–@‚Í–³Œø‚É‚È‚è‚Ü‚·B)
-Ebattle_athena.conf‚É€–ڒljÁB
-E‚»‚Ì‘¼FX‚ÆC³B
-E•ÏX‚³‚ꂽskill_db.txtAcastdb.txt‚ƒljÁ‚³‚ꂽskill_require_db.txt‚Ì\‘¢‚Í¡‚ÌŠŽ©•ª‚µ‚©’m‚ç‚È‚¢‚Ì‚Ådb_ref.txt‚Éà–¾‚ð’ljÁ‚·‚é—\’è‚È‚Ì‚Å‚»‚ê‚Ü‚Å‚Í‚±‚ê‚ç‚Ì•ÏX‚ÍT‚¦‚Ä‚­‚¾‚³‚¢B
- (char/)
- int_guild.c C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- skill_db.txt C³B
- skill_require_db.txt C³B
- cast_db.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_counttargeted()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack()Abattle_config_read() C³B
- skill.h C³B
- skill.c
- skill_attack()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_status_change_start() C³B
- skill_check_condition()Askill_castend_pos() C³B
- skill_use_id()Askill_use_pos() C³B
- skill_status_change_timer()Askill_status_change_start() C³B
- skill_check_unit_sub() ’ljÁB
- pc.h C³B
- pc.c
- pc_damage()Apc_counttargeted()Apc_counttargeted_sub() C³B
- mob.h C³B
- mob.c
- mob_countslave()Amob_counttargeted()Amob_counttargeted_sub() C³B
- mobskill_use()Amob_can_move()Amob_damage() C³B
- mobskill_use_id()Amobskill_use_pos()Amobskill_castend_id() C³B
- mobskill_castend_pos() C³B
- map.c
- map_quit() C³B
-
---------------
-//0750 by CHRIS
-
-EƒXƒLƒ‹ŠÖŒW‚ÌDB‚ð’²®
- (db/)
- skill_db.txt
- cast_db.txt
- skill_require_db.txt
-
---------------
-//0749 by Ž€_
-
-EFX‚Æ•ÏX‚ÆC³B
-EƒXƒLƒ‹‚ÌŽd—l•ÏX‚âŽÀ‘•Aó‘ÔˆÙí‚ÌŽd—l•ÏX‚âŽÀ‘•B
-EƒXƒLƒ‹‚ÌŽg—pðŒ‚ðdb‚ÉÝ’è‚Å‚«‚é‚悤‚É•ÏXB
-Eskill_db.txt‚Æcast_db.txt‚ÌŽd—l•ÏXB
-Eƒ}ƒbƒvŽI‚Ì–³ŒÀƒ‹[ƒv‰Â”\«‚ª‚ ‚é•”•ª‚ðC³B(‚ ‚­‚Ü‚Å‚à‰Â”\«‚ª
-‚ ‚Á‚½‚¾‚¯‚Ì•¨‚Å‚·B–³ŒÀƒ‹[ƒv‚ÌŒ´ˆö‚Æ‚Í’fŒ¾‚Å‚«‚Ü‚¹‚ñB)
-Eƒgƒ‰ƒbƒv‚Ì”­“®ŽÀ‘•B(‚½‚¾ŽÀÛ‚É“®ì‚Í‚Ü‚¾C³‚µ‚Ä‚¢‚Ü‚¹‚ñB
-Œ©‚½–Ú‚ª•Ï‚í‚Á‚½‚¾‚¯‚Å‚·B)
-Ebattle_athena.conf‚É€–ڒljÁ‚ðíœB
-E0748‚ÌC³íœ‚Æ•¶Žš‰»‚¯C³B
-Eskill_db.txtAcast_db.txtAskill_require_db.txt‚Ì•û‚ª‚Ü‚¾Š®¬‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Å
-‚©‚È‚è‚̗ʂ̃XƒLƒ‹‚ª³‚µ‚­“®ì‚µ‚Ü‚¹‚ñB(db_ref.txt‚ÉÝ’è•û–@‚ð“ü‚ê‚È‚¢‚Æ
- ‚¯‚È‚¢‚Ì‚Å‚·‚ªŽžŠÔ‚ª‚È‚©‚Á‚½‚Ì‚Å...) ‚»‚µ‚ÄC³‚Í‚µ‚Ü‚µ‚½‚ªƒeƒXƒg‚Í
-–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- (char/)
- char.c C³B
- int_party.h C³B
- int_party.c C³B
- int_guild.h C³B
- int_guild.c C³B
- int_pet.h C³B
- int_pet.c C³B
- int_storage.h C³B
- int_storage.c C³B
- char‚Ì•û‚͑債‚½C³‚Í‚µ‚Ä‚Ü‚¹‚ñB
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (db/)
- skill_db.txt C³B
- cast_db.txt C³B
- skill_require_db.txt ’ljÁB
- produce_db.txt C³B
- (map/)
- map.h C³B
- map.c
- map_check_dir() ’ljÁB
- map_readmap()Amap_addblock()Amap_delblock() C³B
- map_foreachinarea()Amap_foreachinmovearea() C³B
- map_addflooritem() C³B
- pc.h C³B
- pc.c
- pc_spiritball_timer()Apc_addspiritball()Apc_delspiritball() C³B
- pc_steal_item()Apc_steal_coin()Apc_calcstatus() C³B
- pc_checkallowskill()Apc_jobchange()Apc_checkweighticon() C³B
- pc_damage()Apc_equipitem()Apc_walk()Apc_stop_walking() C³B
- pc_authok()Apc_counttargeted()Apc_counttargeted_sub() C³B
- pc_damage()Apc_setpos() C³B
- skill.h C³B
- skill.c
- skill_get_range()Askill_get_sp()Askill_get_num() C³B
- skill_get_cast()Askill_get_delay() C³B
- skill_get_hp()Askill_get_zeny()Askill_get_time() ’ljÁB
- skill_get_time2()Askill_get_weapontype() ’ljÁB
- skill_get_unit_id()Askill_blown()Askill_additional_effect() C³B
- skill_attack()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id()Askill_castend_id() C³B
- skill_castend_pos()Askill_unit_onplace() C³B
- skill_unit_timer_sub_onplace()Askill_unitsetting() C³B
- skill_use_id()Askill_use_pos()Askill_check_condition() C³B
- skill_status_change_end()Askill_status_change_timer() C³B
- skill_status_change_start()Askill_can_produce_mix() C³B
- skill_produce_mix()Askill_gangsterparadise() C³B
- skill_gangster_out()Askill_gangster_in() C³B
- skill_gangster_count() ’ljÁB
- skill_readdb() C³B
- battle.h C³B
- battle.c
- distance()Abattle_counttargeted()Abattle_get_range() ’ljÁB
- battle_get_dir() ’ljÁB
- battle_get_maxhp()Abattle_get_str()Abattle_get_agi() C³B
- battle_get_vit()Abattle_get_dex()Abattle_get_int() C³B
- battle_get_luk()Abattle_get_flee()Abattle_get_hit() C³B
- battle_get_flee2()Abattle_get_critical()Abattle_get_baseatk() C³B
- battle_get_atk()Abattle_get_atk2()Abattle_get_def() C³B
- battle_get_def2()Abattle_get_mdef()Abattle_get_speed() C³B
- battle_get_adelay()Abattle_get_amotion()Abattle_get_party_id() C³B
- battle_get_guild_id()Abattle_get_size() C³B
- battle_check_undead() ’ljÁB
- battle_check_target()Abattle_addmastery() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
- clif.h C³B
- clif.c
- clif_skillinfo()Aclif_skillinfoblock()Aclif_skillup() C³B
- clif_item_skill()Aclif_changeoption()Aclif_parse_LoadEndAck() C³B
- clif_01ac() ’ljÁB
- clif_parse_WalkToXY()Aclif_parse_ActionRequest() C³B
- clif_parse_TakeItem()Aclif_parse_DropItem() C³B
- mob.h C³B
- mob.c
- mobskill_castend_id()Amobskill_castend_pos() C³B
- mobskill_use_id()Amobskill_use_pos()Amob_heal() C³B
- mob_spawn()Amob_damage()Amob_walk() C³B
- mob_stop_walking()Amob_warp()Amob_counttargeted() C³B
- mob_counttargeted_sub()Amob_countslave() C³B
- mob_attack()Amob_target()Amob_ai_sub_hard_activesearch() C³B
- mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
- script.c
- buildin_sc_start() C³B
- path.c
- can_move() C³B
- pet.c
- pet_data_init()Apet_stop_walking() C³B
- npc.c
- npc_parse_warp()Anpc_parse_shop()Anpc_parse_script() C³B
-
---------------
-//0748 by Michael
- (map/)
- pc.c
- pc_walk();
- Fix Player cannot move in ICEWALL but have Path.
- mob.c
- mob_walk();
- Fix Monster cannot move in ICEWALL but have Path.
- path.c
- can_move();
- Fix Player&Monster cannot move in ICEWALL.
-
---------------
-//0747 by ¹
-Eƒyƒbƒg‚ªƒGƒ‚‚ðo‚·‚Æmap-server‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚Á‚½–â‘è‚ðC³B
- (map/)
- clif_parse_SendEmotion() C³B
-
---------------
-//0746 by Michael
- (map/)
- script.c
- Add Script command - checkoption(type);
- Attach a npc_testchkoption.txt npc script!
-
---------------
-//0745 by ‚Ò‚´‚Ü‚ñ
-EƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒXŽÀ‘•
-EPvPƒGƒŠƒA‚Ìmapflag‚ðC³(“¯Žm“¢‚¿‚ª–³‚­‚È‚Á‚½‚©‚ÆŽv‚¢‚Ü‚·)
-EƒV[ƒYƒ‚[ƒh‚ŃmƒbƒNƒoƒbƒN‚ª‚ ‚Á‚½ƒoƒO‚ðC³
-EƒCƒ“ƒeƒBƒ~‚Ì’x‰„ŽžŠÔ‚ð­‚µ’²®
- (map/)
- skill.c
- skill_attack()Askill_additional_effect()C³
- skill_gangsterparadise()Askill_gangster_in()Askill_gangster_out()’ljÁ
- clif.c
- clif_parse_ActionRequest()C³
- mob.c
- mob_target()Amob_attack()C³
- mob_ai_sub_hard()Amob_ai_sub_hard_mastersearch()C³
- mob_ai_sub_hard_activesearch()C³
- map.h C³
- skill.h C³
- (conf/)
- npc_pvp.txt C³
-
---------------
-//0744 by ¹
-
-EƒAƒCƒXƒEƒH[ƒ‹AƒƒeƒIƒXƒg[ƒ€‚̃Rƒ“ƒ{‚ŃƒeƒIƒXƒg[ƒ€‚̃GƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚È‚­‚È‚é–â‘è‚ðC³B
-EHP‹zŽûƒXƒLƒ‹‚̃GƒtƒFƒNƒgC³B
-Ebattle_athena.conf‚É€–ڒljÁB
-EƒpƒPŽü‚è‚Ìׂ©‚¢C³B
- (conf/)
- battle_athena.conf
- (doc/)
- conf_ref.txt
- (map/)
- battle.c
- battle.h
- clif.c
- pc.c
- pet.c
- skill.c
-
---------------
-//0743 by J
-
-EŽæ‚芪‚«¢Š«‚È‚Ç‚ð–{ŽI‚ÉŽ—‚¹‚éˆ×‚ÌC³B
-@‚ ‚Æ–{ŽI‘ŠˆáƒXƒŒ‚É‚ ‚Á‚½ƒSƒXƒŠƒ“‚ÌŽæ‚芪‚«‚ðC³B
-@ƒfƒŠ[ƒ^[‚Ì‹ó‚Æ’n‚̃XƒLƒ‹‚ª‹t‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³B
- (db/)
- mob_skill_db.txt C³
-
---------------
-//0742 by ‚Ò‚´‚Ü‚ñ
-
-EƒCƒ“ƒeƒBƒ~ƒfƒCƒg‚ðŽÀ‘•
-@UŒ‚‚ƃ[ƒv‚Ì•ª•Ê‚ª‚¤‚Ü‚­‚¢‚©‚È‚©‚Á‚½‚Ì‚Å
-@SC_INTIMIDATE‚ðŽg‚Á‚Ä’x‰„ˆ—‚ð‚µ‚Ü‚µ‚½
-Eskill_db‚̌뎚“™‚ðC³
- (map/)
- skill.c
- skill_additional_effect()Askill_castend_map()C³
- skill_castend_nodamage_id()AC³
- skill_status_change_start()Askill_status_change_end()C³
- map.h C³
- skill.h C³
- (db/)
- skill_db.txt C³
-
---------------------
-//0741 by whitedog
-
-snapshot
-
---------------
-//0740 by ‚Û‚Û‚Û
-EPC‚ªMOB‚Ƀ^ƒQ‚ç‚ꂽ‚Æ‚«3•C–Ú‚©‚ç–hŒä‚Ɖñ”ð‚ªŒ¸‚é‚悤‚É‚µ‚½B
-@1•C‚ɂ‚«‰ñ”ð‚Í10%A–hŒä‚Í5%Œ¸‚è‚Ü‚·B
- (map/)
- pc.h
- pc.c
- pc_counttargeted()Apc_counttargeted_sub()’ljÁ
- battle.c
- battle_get_flee()Abattle_get_def()Abattle_get_def2()C³B
-
---------------
-//0739 by ¹
-Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹“™‚ÌÝ’uŒnƒXƒLƒ‹‚ª³‚µ‚­•\Ž¦‚³‚ê‚È‚¢–â‘è‚ðC³B
-Eƒ}ƒŠƒ“ƒXƒtƒBƒA‚ªŽ©”š‚·‚é‚ƃTƒ“ƒ_[ƒXƒg[ƒ€“™‚̃_ƒ[ƒW‚ª•\Ž¦‚³‚ê‚È‚­‚È‚é–â‘è‚ðC³B
-EHP‹zŽûŒnƒXƒLƒ‹‚Å“G‚ª‰ñ•œ‚µ‚Ä‚éƒGƒtƒFƒNƒg‚ªo‚é‚悤C³B
- (map/)
- skill.c
- skill_castend_damage_id() C³B
- battle.c
- battle_calc_misc_attack() C³B
- clif.c
- clif_getareachar_skillunit() C³B
- clif_skill_setunit() C³B
-
---------------
-//0738 by ‚Ò‚´‚Ü‚ñ
-EƒXƒg[ƒ€ƒKƒXƒg‚ðŠ®‘S‚É–{ŽIŽd—l‚ÉC³(3‰ñ‚Åâ‘Γ€Œ‹•“€Œ‹ó‘Ô‚Ì“G‚ÍSG‚ð‚­‚ç‚í‚È‚¢)
-EƒTƒtƒ‰ƒMƒEƒ€‚ªŽ©•ª‚É‚©‚¯‚ç‚ê‚éƒoƒOC³
- (map/)
- skill.c
- skill_additional_effect()Askill_attack()C³
- skill_castend_nodamage_id()C³
- map.h C³
-
---------------
-//0737 by ‚Û‚Û‚Û
-EƒAƒ“ƒNƒ‹‚ª•à‚¢‚Ä‚¢‚é“G‚ÉŒø‚©‚È‚¢&•¡”‚Ì“G‚ÉŒø‚­‚Ì‚ðC³B
- (map/)
- skill.c
- skill_unit_onplace()Askill_unit_onout()C³
- mob.c
- mob_stop_walking()C³
-
---------------
-//0736 by ‚Ò‚´‚Ü‚ñ
-Eó‘ÔˆÙí‘Ï«‚ªŒø‰ÊŽžŠÔ‚É‚à‹y‚Ô—l‚ÉC³B”­“®—¦‚Æ“¯—¦‚ÅŒø‰ÊŽžŠÔ‚ªŠ„‚èˆø‚©‚ê‚Ü‚·
-EƒXƒg[ƒ“ƒJ[ƒX‚ÌŒø‰ÊŽžŠÔ‚ð‰i‹v‚©‚çƒ}ƒWƒXƒŒƒeƒ“ƒvƒŒ€‹’‚É
-EUŒ‚‚ðŽó‚¯‚½Žž‚Ƀyƒbƒg‚ÌŽx‰‡UŒ‚‚ðŽó‚¯‚ç‚ê‚È‚¢‚悤C³(ƒRƒƒ“ƒgƒAƒEƒg‚µ‚½‚¾‚¯)
-@‚±‚ê‚ÍVITŒ^‚Ƀyƒbƒg‚ð•t‚¯‚Ä•ú’u‚·‚邾‚¯‚ÅŽ©“®‚ŃŒƒxƒ‹ã‚°‚ª‚Å‚«‚é‚Ì‚ð
-@–h‚®‚½‚ß‚ÌŽb’è“I‚Ȉ’u‚Å‚·
- (map/)
- skill.c
- skill_castend_nodamage_id()Askill_addisional_effect()C³
- skill_status_change_start()C³
- pc.c
- pc_damage() C³
-
---------------
-//0735 by ‚Û‚Û‚Û
-
-E“G‚ð“|‚µ‚ăŒƒxƒ‹‚ªã‚ª‚Á‚½‚Æ‚«PTŒö•½”͈͂̃`ƒFƒbƒN‚ð‚·‚é‚悤‚É‚µ‚½B
-EƒI[ƒgƒJƒEƒ“ƒ^[‰¼ŽÀ‘•B
-@Œü‚«‚âŽË’öƒ`ƒFƒbƒN‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñB‚Ü‚½ƒ^ƒCƒ~ƒ“ƒO‚ª‚¨‚©‚µ‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-@MOBƒXƒLƒ‹‚Æ‚µ‚ÄŽg‚¤‚Æ‚«‚̓^[ƒQƒbƒg‚ðself‚É‚µ‚Ä‚­‚¾‚³‚¢B
- (conf/)
- battle_athena.conf€–ڒljÁ
- (doc/)
- conf_refC³
- (map/)
- battle.h
- battle.c
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack()
- battle_config_read()C³
- pc.c
- pc_checkbaselevelup()Apc_attack_timer()C³
- skill.c
- skill_castend_nodamage_id()Askill_status_change_start()C³
- clif.c
- clif_parse_WalkToXY()C³
- mob.c
- mob_attack()C³
-
---------------
-//0734 by Ž€_
-
-Eplayer_skillup_limit‚̈—C³‚Æׂ©‚¢C³B
-Eplayer_skillup_limit‚ªyes‚Ìê‡skill_tree.txt‚Åݒ肳‚ê‚Ä‚é‚»‚̉ºˆÊE‹Æ‚Ì
-ƒXƒLƒ‹ƒcƒŠ[‚ðŽg‚¢‚Ü‚·‚Ì‚Å‚»‚ÌE‹Æ‚Å‚Í–³‚­‚È‚é‚Í‚¸‚̃XƒLƒ‹‚ªo‚邱‚Æ‚ª
-‚ ‚è‚Ü‚·‚ª‚±‚ê‚ÍŽd—l‚Å‚ ‚èƒoƒO‚Å‚Í‚ ‚è‚Ü‚¹‚ñBƒoƒO•ñ‚³‚ê‚Ä‚à–³Ž‹‚µ‚Ü‚·B
- (doc/)
- conf_ref.txt C³B
- (char/)
- char.c
- mmo_char_sync_timer()Ado_init() C³B
- inter.c
- inter_init() C³B
- inter_save_timer() íœB
- (map/)
- pc.c
- pc_calc_skilltree() C³B
- pc_resetskill() C³B
-
---------------
-//0733 by Ž€_
-
-EƒoƒOC³‚Æׂ©‚¢C³B
-EŽ€‚ñ‚¾Œã‚É‚·‚®‚ɃZ[ƒuƒ|ƒCƒ“ƒg‚ɖ߂炸‚É‚µ‚΂炭•ú’u‚µ‚Ä‚é‚ÆA
-•ú’u‚µ‚Ă鎞ŠÔ‚É‚æ‚Á‚ÄŒoŒ±’l‚ªŒ¸­‚·‚éƒoƒOC³B(–¢ƒeƒXƒg)
-Emob_availe.txt‚Åݒ肵‚½ƒ‚ƒ“ƒXƒ^[‚Ƀ‚ƒ“ƒXƒ^[î•ñ‚ðŽg‚¤‚¿ˆÆ—Ž‚¿‚·‚é–â‘èC³B
-Ebattle_athena.conf‚É€–ڒljÁB
-E‚»‚Ì‘¼×‚©‚¢C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- clif.c
- clif_skill_estimation()Aclif_parse_Restart() C³B
- pc.c
- pc_setrestartvalue()Apc_makesavestatus() C³B
- pc_read_gm_account()Apc_calc_skilltree() C³B
- pc_calc_skillpoint() ’ljÁB
- map.c
- map_quit() C³B
- mob.c
- mob_damage() C³B
- skill.c
- skill_unit_timer_sub()Askill_unit_timer() C³B
- battle.h C³B
- battle.c
- battle_config_read() C³B
-
---------------
-//0732 by Kalen
-
-Enpc_town_kafra.txt‚Ì‘S–ÊŒ©’¼‚µ
- ƒJƒvƒ‰—˜—pŒ”‚Ì”pŽ~
- ‘qŒÉ—˜—p—¿‚ð–{ŽI(jRO)‚Æ“¯ˆê‰¿Ši‚É’²®
- ƒJ[ƒgŽg—p—¿‚ð–{ŽI(jRO)‚Æ“¯ˆê‰¿Ši‚É’²®
- ƒ|ƒCƒ“ƒgŽQÆ•ÏX
- ƒWƒ…ƒm[‚̃Z[ƒuƒ|ƒCƒ“ƒgC³
- ƒAƒ}ƒc‚̃Z[ƒuƒ|ƒCƒ“ƒgC³
-
---------------
-//0731 by ‚Û‚Û‚Û
-
-E•ž‚ÌF‚ð•Û‘¶‚·‚é‚©battle_athena.conf‚Å‘I‘ð‚Å‚«‚é‚悤‚ÉB
-@•¾ŠQ‚ª‚ ‚é‚Ì‚Å•Û‘¶‚µ‚È‚¢‚悤‚É‚Æ‘‚¢‚Ä‚ ‚Á‚½‚̂ŃfƒtƒHƒ‹ƒg‚Å‚Í•Û‘¶‚µ‚Ü‚¹‚ñB
-EƒXƒNƒŠƒvƒg’ljÁ
-@strcharinfo(1) Ž©•ª‚̃p[ƒeƒB[–¼‚ðŽæ“¾‚µ‚Ü‚·B
-@strcharinfo(2) Ž©•ª‚̃Mƒ‹ƒh–¼‚ðŽæ“¾‚µ‚Ü‚·B
-@getcharid(1) Ž©•ª‚̃p[ƒeƒB[ID‚ðŽæ“¾‚µ‚Ü‚·B
-@getcharid(2) Ž©•ª‚̃Mƒ‹ƒhID‚ðŽæ“¾‚µ‚Ü‚·B
-@getpartyname(ID) ID‚ÅŽw’肵‚½ƒp[ƒeƒB[‚Ì–¼‘O‚ðŽæ“¾‚µ‚Ü‚·B
-@getguildname(ID) ID‚ÅŽw’肵‚½ƒMƒ‹ƒh‚Ì–¼‘O‚ðŽæ“¾‚µ‚Ü‚·B
- (map/)
- battle.h
- battle.c
- battle_config_read()C³
- pc.c
- pc_makesavestatus()C³
- script.c
- buildin_strcharinfo()C³
- buildin_getcharid()Abuildin_getpartyname()Abuildin_getpartyname_sub()
- buildin_getguildname()Abuildin_getguildname_sub()’ljÁ
-
---------------
-//0730 by ‚Ò‚´‚Ü‚ñ
-
-EƒXƒg[ƒ€ƒKƒXƒg‚Ì“€Œ‹ŽžŠÔ‚ð–{ŽI‚É‚ ‚킹‚ÄC³(ƒXƒLƒ‹ƒŒƒxƒ‹‚ÉŠÖŒW‚È‚­ˆê’è‚Ì“€Œ‹ŽžŠÔ(10•b)‚É‚È‚è‚Ü‚·)
-EƒXƒ^ƒ“AˆÃˆÅA’¾–ÙA“Å‚Ìó‘ÔˆÙ펞ŠÔ‚ÌuŒp‚¬‘«‚µv‚ª‚Å‚«‚È‚¢‚悤‚ÉC³
-Eó‘ÔˆÙ킪Š|‚©‚è‚É‚­‚·‚¬‚Ä‚½‚Ì‚ÅMOB‚Ìó‘ÔˆÙí‘Ï«‚ðŠÉ˜a(‚Ü‚½’²®‚·‚é‚©‚à)
- (map/)
- skill.c
- skill_castend_nodamage_id()Askill_addisional_effect()C³
- skill_status_change_start()C³
-
---------------
-//0729 by DRG
-
-EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚ªƒJ[ƒg‚È‚µ‚ÅŽg‚¦‚½•s‹ï‡‚ÌC³
-EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚ªJOBLV30‚ÅŠo‚¦‚ꂽ‚Ì‚ðC³
- (conf/)
- npc_event_skillget.txt
- ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“€C³
- (map/)
- skill.c
- skill_check_condition()C³
-
---------------
-//0728 by ‚Û‚Û‚Û
-
-EE‚ª•Ï‚í‚Á‚Ä‚àƒMƒ‹ƒh‚ÌE‹Æ—“‚ªXV‚³‚ê‚È‚¢•s‹ï‡‚ÌC³B
-
- (char/)
- inter.c
- ƒpƒPƒbƒg’·ƒŠƒXƒgC³B
- int_guild.c
- mapif_guild_memberinfoshort()Amapif_parse_GuildChangeMemberInfoShort()A
- inter_guild_parse_frommap()C³
- (map/)
- intif.h
- intif.c
- intif_guild_memberinfoshort()Aintif_parse_GuildMemberInfoShort()
- intif_parse()C³
- guild.h
- guild_send_memberinfoshort()Aguild_recv_memberinfoshort()C³
-
-
---------------
-//0727 by ¹
-
-E•ŠíŒ¤‹†ƒXƒLƒ‹‚É‚æ‚Á‚ăzƒ‹ƒOƒŒƒ“‚Ȃǂ̸˜BNPC‚ª
-@³í‚É“®ì‚µ‚È‚¢–â‘è‚ðC³B
-
- (map/)
- pc.c
- pc_percentrefinery() C³B
-
---------------
-//0726 by ŒÓ’±—–
-
-Emob_skill_db2.txt‚ª‚ ‚ê‚Îmob_skill_db.txt‚ðƒI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚ÉC³
- ƒIƒŠƒWƒiƒ‹‚ÌMOBŽg—pŽž‚âAŒ»sMOB‚ÌŽg—pƒXƒLƒ‹‚ð•ÏX‚µ‚½‚¢ê‡‚ÉB
-
-Emob_skill_db.txt‚Åmob_id‚ÌŽŸ‚̃_ƒ~[•¶Žš—ñ‚ª"clear"‚¾‚Á‚½ê‡A
- ‚»‚ÌMOB‚̃XƒLƒ‹‚ð‰Šú‰»‚·‚é‹@”\’ljÁB
- Emob_skill_db2.txt‚Å‚ ‚éMOB‚̃XƒLƒ‹‚ðŠ®‘S‚É‘‚«Š·‚¦‚é‚Æ‚«‚ÉŽg—p‚µ‚Ä
- ‚­‚¾‚³‚¢B
- Eclear‚µ‚È‚©‚Á‚½ê‡‚Ímob_skill_db.txt‚Ì‚à‚̂ɒljÁ‚³‚ê‚Ü‚·B
-
- mob.c
- mob_readskilldb()C³
-
-
-EƒAƒCƒeƒ€–¼/MOB–¼‚ª‘SŠp12•¶Žši24ƒoƒCƒgj‚ ‚éƒAƒCƒeƒ€/MOB‚ªA
- @ƒRƒ}ƒ“ƒh‚ÅŽæ‚èŠñ‚¹/¢Š«‚Å‚«‚È‚¢–â‘èC³B
- mob.c
- mobdb_searchname()C³
- itemdb.c
- itemdb_searchname_sub()C³
-
-EŒ»ÝŽž‚ŃCƒxƒ“ƒg‚ð‹N‚±‚·uŽžŒvƒCƒxƒ“ƒgv‹@”\‚ð’ljÁ
- EOnInit‚Æ“¯‚¶‚悤‚É‚»‚ꂼ‚ê‚ÌNPC‚ÅAOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚µ‚Ü‚·B
- OnMinute?? F–ˆŽžA??•ª‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B(0-59)
- OnHour?? F–ˆ“úA??Žž‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B(0-23)
- OnClock???? F–ˆ“úA??Žž??•ª‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
- OnDate???? F–ˆ”NA??ŒŽ??“ú‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
- EÚ‚µ‚­‚Í npc_test_ev.txt ‚ðŽQÆ
-
- (conf/)
- npc_test_ev.txt
- “à—e’ljÁ
- (map/)
- npc.c
- FXC³
-
-E‚»‚Ì‘¼
- clif.c
- ƒRƒ“ƒpƒCƒ‹Œx‚ªo‚È‚¢‚悤‚ÉC³
-
---------------
-//0725 by Ž€_
-
-EŽI—Ž‚¿ƒoƒOC³B
-Eƒ‚ƒ“ƒXƒ^[‚ɃCƒxƒ“ƒg‚ªÝ’肳‚ê‚Ä‚¢‚ÄŽ©ŽE‚â‚È‚É‚©‚Ń_ƒ[ƒW‚ð—^‚¦‚½
-•¨‚ª‚È‚¢ê‡ŽI—Ž‚¿Šm’è‚È‚Ì‚Å‚»‚̃}ƒbƒv‚É‚ ‚éƒvƒŒƒCƒ„[‚ð—˜—p‚µ‚Ä
-ƒCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚ðŽÀs‚·‚é‚悤‚É•ÏXB
- (map/)
- makefile C³B
- mob.c
- mob_timer()Amob_damage() C³B
-
---------------
-//0724 by Ž€_
-
-EƒoƒOC³‚ƈÀ’艻‚ׂ̈ÌC³B
-Eƒyƒbƒg‚ÌUŒ‚‚ŃCƒxƒ“ƒg‚ªˆ—‚³‚ꂸŽI—Ž‚¿‚É‚È‚é–â‘èC³B(–¢ƒeƒXƒg)
-Eƒ‚ƒ“ƒXƒ^[‚Ì‘å—Ê”­¶‚ÅŽI‚ª—Ž‚¿‚é–â‘èC³B(ƒ‚ƒ“ƒXƒ^[‚ð10000•C‚ðŒÄ‚ñ‚Å
-–‚–@‚Å“|‚·‚±‚Æ‚ð5‰ñ’öƒeƒXƒgB‚½‚¾“®‚©‚È‚¢‚â‚‚̂ÝB)
-EŽæ‚芪‚«‚ªƒ{ƒX‚ƈê‚ÉŽ€‚ÊŽžƒAƒCƒeƒ€‚ð—Ž‚Æ‚³‚È‚¢‚悤‚É•ÏXB(–¢ƒeƒXƒg)
-Ebattle_athena.conf‚Ìpc_skillflee‚ðplayer_skillfree‚É•ÏX‚µ‚Ĉ—‚ð•ÏXB
-EƒAƒCƒXƒEƒH[ƒ‹‚Éskill_unit_setting‚ðŽg‚¤ƒXƒLƒ‹‚ÅUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³B
-E‚»‚Ì‘¼×‚©‚¢C³­‚µBˆÀ’艻‚³‚ꂽ‚©‚Ç‚¤‚©‚Í‚Ü‚¾‚í‚©‚è‚Ü‚¹‚ñ‚ªXP1800+A512MAƒ‚ƒ“ƒXƒ^[”z’u50%‚Å10000•C¢Š«‚µ‚ĈÙí‚È‚©‚Á‚½‚Ì‚Å‘åä•v‚É‚È‚Á‚½‚ÆŽv‚¢‚Ü‚·B‘åä•v‚¶‚á‚È‚­‚Ä‚àÓ”C‚Í‚Æ‚ê‚Ü‚¹‚ñ‚ª...
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- mob.h C³B
- mob.c
- mob_timer()Amob_deleteslave_sub()Amob_damage() C³B
- npc.c
- npc_event() C³B
- skill.c
- skill_area_sub()Askill_unit_onplace()Askill_castend_nodamage_id() C³B
- clif.c
- clif_parse_GMKick() C³B
- battle.h
- battle.c
- battle_damage()Abattle_check_target()Abattle_config_read() C³B
- pc.c
- pc_calc_skilltree()Apc_checkskill() C³B
- map.h C³B
- map.c
- map_foreachinarea()Amap_foreachinmovearea() C³B
- map_foreachobject() C³B
-
---------------
-//0723 by DRG
-
-E0719‚ÌC³
- (map/)
- pc.c pc_calc_skilltree()C³
-
---------------
-//0722 by ƒpƒCƒ“
-
-Egcc 2.29Œn—ñ‚Å‚àƒRƒ“ƒpƒCƒ‹‚ª’Ê‚é‚悤‚ÉC³B
-@‚±‚ê‚͈ȑO‚É‚à’¼‚µ‚½‚Í‚¸‚È‚Ì‚Å‚·‚ªA‚È‚º‚©Œ³‚É–ß‚Á‚Ä‚¢‚Ü‚µ‚½‚Ì‚Å
-@ŠF‚³‚ñ’ˆÓ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-@‚ ‚ÆAgcc3Œn—ñ‚È‚ç’蔂͂ǂ±‚É‘‚¢‚Ä‚à–â‘è‚È‚¢‚Ì‚Å‚·‚ªA
-@gcc2.29Œn—ñ‚Å‚Íu•K‚¸ƒuƒƒbƒN—v‘f‚̈ê”Ôʼnv‚É‘‚©‚È‚¢‚ƃRƒ“ƒpƒCƒ‹‚ª
-@’Ê‚è‚Ü‚¹‚ñ‚Ì‚Å‚±‚¿‚ç‚à‚²’ˆÓŠè‚¢‚Ü‚·B
-
-ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚é—á
-void hoge() {
- const char booboo = 1;
- c
-
-ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚ç‚È‚¢—á
-void hoge() {
- c
- const char booboo = 1;
- c
-
- (map/)
- skill.h ƒ}ƒNƒ‚ðC³
- skill.c skill_addisional_effect()C³
-
---------------
-//0721 by ¹
-
-Eƒ{ƒX‚ɃŒƒbƒNƒXƒfƒr[ƒi‚ªŒø‚¢‚½–â‘è‚ðC³B
-Eƒ{ƒX‚ɃJ[ƒh‚É‚æ‚éó‘ÔˆÙ킪Œø‚©‚È‚©‚Á‚½–â‘è‚ðC³B
-@–{ŽI‚ł̓}ƒŠƒiƒJ[ƒh“™‚ŃI[ƒNƒq[ƒ[‚È‚Ç‚ð‰£‚é‚ÆŽžX“€Œ‹‚µ‚Ü‚·B
-@(Œ‹\”÷–­‚ÈŽÀ‘••û–@‚È‚Ì‚ÅA‰½‚©–â‘肪‚ ‚Á‚½ê‡
-@ ‚»‚Ì•ÓÚ‚µ‚¢•û‚¨‚è‚Ü‚µ‚½‚çC³‚µ‚Ä‚â‚Á‚Ä‚­‚¾‚³‚¢(^^; ))
-
---------------
-//0720 by ŒÓ’±—–
-
-EPC‚ÉIW‚ðd‚Ë‚é‚ÆMOB‚ªUŒ‚‚µ‚Ä‚±‚È‚¢–â‘è‚ðC³
- EIW‚Éd‚È‚Á‚Ä‚¢‚Ä‚àA—×ډ”\‚È‚çMOB‚ª‹ßŠñ‚Á‚Ä‚«‚Ü‚·
- E‚Ç‚ñ‚È’nŒ`‚É‚¢‚Ä‚àA—×Ú‚µ‚Ä‚¢‚é‚È‚çUŒ‚‰Â”\‚É‚È‚è‚Ü‚·
- E‚½‚¾‚µAMOB‚ª‰“‹——£UŒ‚‰Â”\‚ÅAUŒ‚”͈͓à‚ÉPC‚ª‚¢‚Ä‚àA
- —×Ú•s‰Â”\‚È‚çUŒ‚‚µ‚Ä‚«‚Ü‚¹‚ñB‚±‚ê‚Ì‰ðŒˆ‚Í‚©‚È‚è–Ê“|‚È‚Ì‚ÅB
-
- mob.c
- mob_can_reach()C³
- battle.c
- battle_check_range()C³
-
---------------
-//0719 by DRG
-
-E‰ºˆÊƒXƒLƒ‹‚ª‚È‚¢ê‡‚ÍãˆÊƒXƒLƒ‹‚ª‚Ó‚ê‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
-@battle_athena.conf‚Ìskillflee‚ÅÝ’è‰Â”\‚Å‚·B
-@‰ºˆÊƒXƒLƒ‹‚ª‚È‚¢‚Ü‚ÜãˆÊƒXƒLƒ‹‚ð‚Ó‚Á‚½ó‘Ô‚ÅA‚±‚̃IƒvƒVƒ‡ƒ“‚ðŽg‚¤ê‡‚̓XƒLƒ‹ƒŠƒZƒbƒg‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
-@ˆê”ʃAƒJ‚ɃXƒLƒ‹ƒŠƒZƒbƒg‚ð‰ð•ú‚µ‚½‚¢‚Æ‚«‚ÉŽg‚Á‚Ä‚â‚Á‚ĉº‚³‚¢B
- (conf/)
- battle_athena.conf
- (map/)
- battle.c
- battle.h
- pc.c pc_calc_skilltree(),pc_checkskill()C³
-
---------------
-//0718 by Ž€_
-
-EFX‚ÆC³B
-E“Å‚É‚æ‚Á‚Ä–hŒä‚ªŒ¸‚é‚悤‚É•ÏXB(HP‚Í‚Ü‚¾Œ¸‚è‚Ü‚¹‚ñB)
-EƒAƒCƒXƒEƒH[ƒ‹‚ÉUŒ‚‚Å‚«‚é‚悤‚É•ÏXB(¡‚Í‘S‚Ä‚ÌUŒ‚‚É“–‚½‚è‚Ü‚·B)
-‚½‚¾ˆÆ‚̃oƒO‚炵‚­ƒAƒCƒXƒEƒH[ƒ‹‚ðƒNƒŠƒbƒN‚·‚é‚ƈƂ©‚ç0x89ƒpƒPƒbƒg‚ª30‰ñˆÈã˜A‘±‚Å‘—‚Á‚Ä‚­‚邱‚Æ‚ª‹N‚±‚è‚Ü‚·‚ªŒ´ˆö‚Í•s–¾‚Å‚·B‘½•ªˆÆ‚̃oƒO‚¾‚ÆŽv‚¢‚Ü‚·‚ª...)
-E퓬‚ÉŠÖ‚í‚éŒvŽZ“™‚ðC³B
-Eƒ[ƒj‚ª‘‚¦‚éƒoƒOC³B(‘½•ª‚±‚ê‚Å‚±‚̃oƒO‚Í‚È‚­‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª‚Ç‚¤‚È‚Ì‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
-E“ñ“—¬‚̶Žè•Ší‚ÌŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ð‰EŽè•Ší‚É“K—p‚·‚é‚©‚Ç‚¤‚©‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB
-E‚»‚Ì‘¼C³‚Í‚µ‚½‚Í‚¸‚Å‚·‚ªŠo‚¦‚Ä‚Ü‚¹‚ñB(C³‚µ‚Ä‚È‚¢•¨‚à‚ ‚è‚Ü‚·‚ªdiff“–‚Ä‚Ì“r’†‚Å‚Ç‚ê‚ðì‹Æ‚µ‚½‚Ì‚©‚ð–Y‚ꂽ‚Ì‚Å...)
- (common/)
- mmo.h C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_get_baseatk()Abattle_get_speed()Abattle_get_adelay() ’ljÁB
- battle_get_amotion() Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_get_atk()Abattle_get_atk_()Abattle_get_atk2() C³B
- battle_get_attack_element()Abattle_get_attack_element2() C³B
- battle_get_str()Abattle_get_agi()Abattle_get_vit()Abattle_get_int() C³B
- battle_get_dex()Abattle_get_luk()Abattle_get_flee() C³B
- battle_get_flee2()Abattle_get_hit()Abattle_get_critical() C³B
- battle_get_def()Abattle_get_def2()Abattle_get_mdef() C³B
- battle_get_element()Abattle_check_target()Abattle_check_range() C³B
- battle_weapon_attack()Abattle_config_read() C³B
- clif.c
- clif_skill_estimation()Aclif_mob0078()Aclif_mob007b() C³B
- pc.c
- pc_attack_timer()Apc_attack()Apc_calcstatus()Apc_payzeny() C³B
- pc_getzeny() C³B
- npc.c
- npc_buylist()Anpc_selllist() C³B
- pet.c
- pet_attack()Apet_randomwalk()Apet_ai_sub_hard() C³B
- mob.h C³B
- mob.c
- calc_next_walk_step()Amob_attack()Amobskill_castend_id() C³B
- mobskill_use_id()Amobskill_use_pos()Amob_ai_sub_hard() C³B
- mob_damage()Amob_changestate() C³B
- mob_get_adelay()Amob_get_speed() íœB
- skill.h C³B
- skill.c
- skill_unitsetting()Askill_unit_ondamaged()Askill_unit_timer_sub() C³B
- skill_unit_timer()Askill_area_sub()Askill_unit_onplace() C³B
- skill_status_change_start() C³B
- chat.c C³B
- makefile C³B
- chrif.c C³B
- guild.c C³B
- itemdb.c C³B
- map.c C³B
- party.c C³B
- script.c C³B
- path.c C³B
-
---------------
-//0717 by ¹
-
-E‘å—ʂɃ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚µ‚Ĉê“x‚É“|‚·‚Æmap-server‚ª—Ž‚¿‚é–â‘è‚ðC³B
-@(ƒJƒz‚ð100‘Ì‚¸‚¢ŠÒ‚µ‚Ä50‰ñƒeƒXƒg‚ð‚µ‚½‚Ì‚Å‹°‚ç‚­‘åä•v‚¾‚ÆŽv‚¢‚Ü‚·B)
-E‚»‚Ì‘¼Œ‹\ׂ©‚¢C³
- (common/)
- mmo.h
- (map/)
- chat.c
- chrif.c
- clif.c
- guild.c
- itemdb.c
- map.c
- mob.c
- npc.c
- party.c
- path.c
- pc.c
- pet.c
- script.c
- skill.c
- skill.h
-
---------------
-//0716 by ¹
-
-E¸˜B¬Œ÷—¦‚ɑ΂µ‚ÄBS‚Ì•ŠíŒ¤‹†‚ª³‚µ‚­“K—p‚³‚ê‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ðC³B
- (map/)
- pc.c
- pc_percentrefinery() C³B
-
---------------
-//0715 by Ž€_
-
-Eƒ}ƒbƒvƒT[ƒo[‚©‚ç•\Ž¦‚³‚ê‚镨‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Ìݒ肪‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½BƒXƒLƒ‹•\Ž¦‚¾‚¯‚Å‚à‚È‚­‚µ‚Ä‚â‚é‚ƃT[ƒo[‚ª‚©‚È‚èŠy‚É‚È‚Á‚½‚è‚à‚µ‚Ü‚·B
-ŠJ”­‚âƒoƒOƒgƒŒ[ƒX‚ÌŽž‚Í•\Ž¦‚·‚邱‚Æ‚ð‚¨Š©‚ß‚µ‚Ü‚·B
-E‚»‚Ì‘¼×‚©‚¢C³B
-EC³‚µ‚½Š‚ð‘S‚Ä‘‚¯‚È‚¢‚̂Ńtƒ@ƒCƒ‹‚¾‚¯B
- (doc/)
- conf_ref.txt
- (conf/)
- battle_athena.conf
- (map/)
- makefile
- skill.c
- script.c
- pet.c
- pc.c
- path.c
- party.c
- npc.c
- itemdb.c
- intif.c
- guild.c
- chat.c
- battle.h
- battle.c
- chrif.c
- atcommand.c
- clif.c
- mob.c
- map.c
-
---------------
-//0714 by Ž€_
-
-Eׂ©‚¢C³B
-EƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“‚Å‚‚Ìd—ʂƸ˜B‚É‚æ‚Á‚ă_ƒ[ƒW‚ª‘‚¦‚é‚悤‚ÉC³B¸˜Bƒ_ƒ[ƒW‚ð‘«‚·Žž“K—p‚Ń_ƒ[ƒW+d—Ê+‚¸˜B*4(‚±‚Ì4‚Írefine_db.txt‚Ì–h‹ï‚̉ß踘Bƒ{[ƒiƒX‚ðŽg‚Á‚Ä‚é‚Ì‚Å•ÏX‰Â”\‚Å‚·B)‚É‚È‚è‚Ü‚·B
-EƒXƒLƒ‹‚É‚æ‚é‚«”ò‚΂µˆ—‚Å0x88ƒpƒPƒbƒg‚ðŽg‚Á‚Ä‚¢‚Ü‚µ‚½‚ª‚»‚̃pƒPƒbƒg‚Ì—D懈ʂª‚©‚È‚è’á‚¢‚炵‚­Œã‚Å—ˆ‚éƒpƒPƒbƒg‚É‚æ‚Á‚Ä–³Ž‹‚³‚ê‚邱‚Æ‚à‚ ‚é‚悤‚Ȃ̂ŃvƒŒƒCƒ„[‚¾‚¯‚É“K—p‚µ‚ă‚ƒ“ƒXƒ^[‚É‚Í0x78‚ðŽg‚¤‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
-‚Å‚àˆÊ’u‚¸‚ê‚ÍŠ®‘S‚É‚È‚­‚È‚ç‚È‚¢‚悤‚Å‚·B(‹°‚ç‚­ˆÆ‚̃oƒO‚¾‚ÆŽv‚¢‚Ü‚·BŽI‚Ì
-À•W‚ðŠm”F‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªŽI‚Ì•û‚Í–â‘肪‚ ‚è‚Ü‚¹‚ñ‚Å‚µ‚½B)
-ƒvƒŒƒCƒ„[‚Ìê‡0x78(PACKETVER‚ª4ˆÈã‚È‚ç0x1d8)‚ªŽg‚¦‚Ü‚¹‚ñB•ªg‚ðì‚Á‚Ä‚µ‚Ü‚¤‚Ì‚Å...
-EƒoƒO•ñƒXƒŒƒbƒh2 ‚Ì47‚ðŽæ‚èž‚Ý‚Ü‚µ‚½B
-E‚»‚Ì‘¼C³‚µ‚½Š­‚µ‚ ‚èB
- (db/)
- refine_db.txt C³B
- item_db.txt C³B
- (map/)
- battle.c
- battle_stopattack()Abattle_stopwalking() C³B
- battle_get_attack_element2()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack() C³B
- path.c
- path_blownpos() C³B
- pc.h C³B
- pc.c
- pc_stop_walking()Apc_damage() C³B
- pc_getrefinebonus() ’ljÁB
- mob.c
- mob_damage() C³B
- pet.c
- pet_target_check()Apet_stop_walking()Apet_performance() C³B
- skill.c
- skill_attack()Askill_blown()Askill_status_change_start() C³B
- skill_castend_damage_id() C³B
- makefile C³B
-
---------------
-//0713 by ‚Û‚Û‚Û
-
-Emob_avail.txt’ljÁBitem_avail.txt‚Æ“¯—l‚ÌŽw’è‚Ń‚ƒ“ƒXƒ^[‚ÌŒ©‚½–ڂ𑼂ÌID‚Ì‚à‚Ì‚É•ÏX‚µ‚Ü‚·B
-@ƒ‚ƒ“ƒXƒ^[‚ÌIDˆÈŠO‚ðŽw’肵‚½‚è‚·‚é‚ÆPC‚âNPC‚ÌŽp‚ð‚µ‚½MOB‚Ɉê•û“I‚ÉUŒ‚‚³‚ê‚éꇂª‚ ‚é‚Ì‚Å’ˆÓB
- (db/)
- mob_avail.txt ’ljÁB
- (map/)
- clif.c
- clif_mob0078()Aclif_mob007b() C³B
- mob.h C³B
- mob.c
- mob_readdb_mobavail()Amob_get_viewclass()’ljÁB
- do_init_mob()Amob_readdb() C³B
-
---------------
-//0712 by Ž€_
-
-EƒV[ƒ‹ƒhƒ`ƒƒ[ƒWAƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“ŽÀ‘•B
-EƒI[ƒgƒK[ƒh‚Í‚Æ‚è‚ ‚¦‚¸ƒGƒtƒFƒNƒg‚ªo‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
-E0708‚Å‘‚«–Y‚êBƒfƒBƒtƒFƒ“ƒ_[‚ðŽg‚Á‚½ŽžASPD‚ƈړ®‘¬“x‚Í20%’ቺ‚µ‚Ü‚·B
-–{ŽI‚Œቺ‚·‚é‚Ì‚ÍŠm‚©‚̂悤‚Å‚·‚ª‚Ç‚ê‚®‚ç‚¢‰º‚ª‚é‚Ì‚©‚Í‚³‚Á‚Ï‚è‚í‚©‚è‚Ü‚ñ‚Ì‚Å...
-E‚»‚Ì‘¼×‚©‚¢C³B
- (db/)
- cast_db.txt C³B
- skill_db.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
- skill.c
- skill_additional_effect()Askill_attack()Askill_castend_nodamage_id() C³B
- skill_check_condition()Askill_status_change_start() C³B
- skill_castend_damage_id() C³B
- pc.h C³B
- pc.c
- pc_calcstatus()Apc_checkallowskill()Apc_unequipitem() C³B
-
---------------
-//0711 by npc
-
-Ezλ‘¢ƒGƒtƒFƒNƒg‚ÌC³
-EƒXƒNƒŠƒvƒg–„‚ßž‚Ý•Ï”‚ÉHp,MaxHp,Sp,MaxSp‚ð’ljÁ(“Ç‚Ýž‚Ý‚Ì‚Ý)
- (map/)
- skill.c
- skill_produce_mix()C³B
- pc.c
- pc_readparam()C³B
- (db/)
- const.txt C³B
-
---------------
-//0710 by ŒÓ’±—–
-
-E–¼‘O‚É”¼ŠpƒXƒy[ƒX‚ª“ü‚Á‚½ƒp[ƒeƒB[‚ð쬂µ‚½‚Æ‚«A‚¨‚æ‚ÑA
- ”¼ŠpƒXƒy[ƒX‚ª“ü‚Á‚½–¼‘O‚ÌPC‚ðƒp[ƒeƒBƒƒ“ƒo‚É‚µ‚½‚Æ‚«A
- party.txt‚ª³‚µ‚­“Ç‚Ýž‚ß‚È‚­‚È‚é–â‘è‚ðC³
-
- (char/)
- int_party.c
- inter_party_fromstr()C³
-
-EMessage of the Day ‹@”\’ljÁ
- EƒƒOƒCƒ“‚µ‚½ƒ†[ƒU[‚ÉMOTD‚ð•\Ž¦‚³‚¹‚邱‚Æ‚ªo—ˆ‚Ü‚·B
- Emap-server.exeŽÀsŽž‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠihelp.txt‚Æ“¯‚¶
- ƒfƒBƒŒƒNƒgƒŠj‚Émotd.txt‚ðì‚é‚Æ•\Ž¦‚µ‚Ü‚·B
- EMOTD‚ª•\Ž¦‚³‚ê‚éƒ^ƒCƒ~ƒ“ƒO‚ÍA
- uƒ}ƒbƒvƒT[ƒo[‚ɃƒOƒCƒ“‚µ‚½’¼Œã‚ÌAƒ}ƒbƒvƒ[ƒhŠ®—¹Žžv‚Å‚·B
- ‚‚܂èAƒƒOƒCƒ“’¼ŒãAƒLƒƒƒ‰ƒZƒŒ’¼Œã‚¨‚æ‚ÑA
- ƒ}ƒbƒvƒT[ƒo[ŠÔˆÚ“®‚ÌŽž(ƒ}ƒbƒvƒT[ƒo[‚Ì•ªŽU‚ðs‚Á‚Ä‚¢‚éꇂ̂Ý)
- ‚̃}ƒbƒvƒ[ƒh‚ªI‚í‚Á‚½Žž‚É•\Ž¦‚³‚ê‚Ü‚·B
- E•\Ž¦•û–@‚Íhelp.txt‚Æ“¯‚¶‚Å•’ʂ̃ƒbƒZ[ƒW‚Æ‚µ‚Ä‘—M‚µ‚Ü‚·B
- iƒMƒ‹ƒh’mƒƒbƒZ[ƒW‚Í•¶Žš”§ŒÀ‚ª‚ ‚èAGMƒAƒiƒEƒ“ƒX‚Í’·ŽžŠÔ
- ‰æ–Ê‚Ìã•”‚É•\Ž¦‚³‚ê‚Ä‚µ‚Ü‚¤‚½‚ßj
- E‰ï˜b‚Æ‹æ•Ê‚ª‚‚­‚悤‚ÉA"< Message of the Day >"A"< End of MOTD >"
- ‚Ì•¶‚Å㉺‚ðˆÍ‚¢‚Ü‚·B
-
- (map/)
- pc.c
- pc_authok()C³
-
-
---------------
-//0709 by ‚Û‚Û‚Û
-
-EƒXƒNƒŠƒvƒg‚Éemotion’ljÁ
-@emotion n;‚ÆŽg‚¤‚ÆNPC‚ªƒGƒ‚‚ðo‚µ‚Ü‚·Bn‚Í0`33‚ªŽg—p‰Â”\B
-E¸˜B‚ÆŠXƒKƒCƒh‚ÌNPC‚ð–{ŽI‚̑䎌‚ɇ‚킹‚ÄC³B
- (conf/)
- npc_town_refine.txtAnpc_town_guide.txt C³B
- (map/)
- script.c
- buildin_emotion() ’ljÁB
-
---------------
-//0708 by Ž€_
-
-EƒXƒLƒ‹ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹AƒfƒBƒtƒFƒ“ƒ_[AƒI[ƒgƒK[ƒhŽÀ‘•B
-EƒI[ƒgƒK[ƒh‚ÌꇃK[ƒh‚µ‚Ä‚àƒGƒtƒFƒNƒg‚Ío‚Ü‚¹‚ñBƒ~ƒX‚ɂȂ邾‚¯‚Å‚·B–{ŽI‚Ì•û‚Í•\Ž¦‚³‚ê‚é‚©‚Ç‚¤‚©‚à‚í‚©‚ç‚È‚¢‚µƒpƒPƒbƒgî•ñ‚à‚È‚¢‚Ì‚Å...
-EƒfƒBƒtƒFƒ“ƒ_[‚Í–¢ƒeƒXƒgBbLongAtkDef‚ðŽg‚Á‚Ä‚é‚̂Ńzƒ‹ƒ“ƒJ[ƒh‚̂悤‚ÉbLongAtkDef‚ðã‚°‚镨‚ð‘•”õ‚µ‚ÄŽg‚¤‚Ɖ“‹——£•¨—UŒ‚‚ð‘S‚Ä–³Œø‚É‚Å‚«‚Ü‚·B(‚±‚ê‚à–{ŽI‚ÌŽd—l‚ª‚Ç‚¤‚È‚Ì‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB)
-E‚»‚Ì‘¼×‚©‚¢C³B
- (db/)
- cast_db.txt C³B
- (map/)
- map.h C³B
- map.c
- map_quit() C³B
- skill.h C³B
- skill.c
- skill_castend_nodamage_id()Askill_use_id()Askill_check_condition() C³B
- skill_castend_id()Askill_castend_nodamage_id()Askill_castcancel() C³B
- pc.c
- pc_calcstatus()Apc_setpos()Apc_damage() C³B
- battle.c
- battle_calc_damage()Abattle_damage() C³B
- clif.c
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
- mob.c
- mob_damage() C³B
- itemdb.c
- itemdb_searchrandomid() C³B
-
---------------
-//0707 by Ž€_
-
-E0705‚̈¢C—…”e–PŒ‚̃oƒOC³B
- (db/)
- skill_db.txt
- (map/)
- skill.c
- skill_castend_id()
- skill_castend_pos()
- battle.c
- battle_calc_pc_weapon_attack()
- clif.c
- clif_parse_UseSkillToId()
-
---------------
-//0706 by kalen
-EC³
- conf/npc_warp_umbala.txt
-
---------------
-//0705 by Ž€_
-
-EFX‚ÆC³B
-EƒvƒŒƒCƒ„[‚̃NƒŠƒeƒBƒJƒ‹ŒvŽZ‚ɃoƒO‚ª‚ ‚Á‚½‚Ì‚ÅC³B
-E”š—ô”g“®‚̈—C³B
-Eƒ‚ƒ“ƒN‚̃Rƒ“ƒ{‚ðC³B
-Eˆ¢C—…”e–PŒ‚ÌŽg—p‚É‚æ‚Á‚ă}ƒbƒvŽI‚Ì–³ŒÀƒ‹[ƒvƒoƒOC³B(‚±‚ê‚©‚È‚è’v–½“I‚È•¨‚¾‚Á‚½‚悤‚Å‚·B)
-EƒRƒ“ƒ{‚ÅŽg‚¤ˆ¢C—…”e–PŒ‚Í“G‚ðƒNƒŠƒbƒN‚·‚é•K—v‚ª‚È‚¢‚悤‚ÉC³B
-E–Ò—´Œ‚Å“G‚ð‚«”ò‚΂·‹——£‚ð5ƒZƒ‹‚É•ÏXB‚æ‚Á‚ăRƒ“ƒ{‚ÅŽg‚¤ˆ¢C—…”e–PŒ‚Í‹——£ƒ`ƒFƒbƒN‚ð‚µ‚Ü‚¹‚ñB5ƒZƒ‹”ò‚΂³‚ꂽ“G‚͈¢C—…”e–PŒ‚ÌŽË’ö‚©‚ç—£‚ꂽ‚킯‚È‚Ì‚Å‹——£ƒ`ƒFƒbƒN‚È‚µ‚Å”­“®‚µ‚Ü‚·B(–{ŽI‚ÌŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñB)
-Eƒ}ƒbƒv‚Ì–¼‘O‚ð16byte‚©‚ç24bytes‚É•ÏXB(‘債‚½ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ªˆÀ‘S‚ׂ̈̕¨‚Å‚·B)
-EƒEƒFƒfƒBƒ“ƒOƒLƒƒƒ‰‚É‚æ‚éˆÆ—Ž‚¿‚ð–h‚®ˆ×‚ÉC³B
-E‚»‚Ì‘¼­‚µC³B(ƒeƒXƒg‚Í–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñB)
- (conf/)
- battle_athena.conf C³B
- (db/)
- skill_db.txt C³B
- (common/)
- mmo.h C³B
- (doc/)
- conf_ref.txt C³B
- item_bonus.txt C³B
- (map/)
- battle.h C³B
- battle.c
- battle_get_flee2()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_config_read() C³B
- skill.h C³B
- skill.c
- skill_status_change_start()Askill_castend_damage_id() C³B
- skill_check_condition()Askill_use_id()Askill_blown() C³B
- skill_castend_map()Askill_unit_onlimit()Askill_attack() C³B
- pc.c
- pc_attack_timer()Apc_setpos()Apc_setsavepoint() C³B
- pc_movepos()Apc_calcstatus()Apc_bonus() C³B
- clif.h C³B
- clif.c
- clif_set0078()Aclif_set007b() C³B
- clif_updatestatus()Aclif_initialstatus()Aclif_parse_UseSkillToId() C³B
- clif_skillinfo() ’ljÁB
- map.h C³B
- map.c
- map_setipport()Amap_addmap() C³B
- ‚»‚Ì‘¼”²‚¯‚½Š­‚µ‚ ‚èB
-
---------------------
-//0704 by kalen
-
-EUmbala Warp’ljÁ
- conf/npc_warp_umbala.txt
-
---------------------
-//0703 by ‚¢‚Ç
-
-EƒT[ƒo[snapshot
-
---------------
-//0702 by ‚Û‚Û‚Û
-
-Eƒtƒ@[ƒ}ƒV[‚̃GƒtƒFƒNƒg‚ð–{—ˆ‚Ì‚à‚Ì‚É•ÏX
-EƒXƒNƒŠƒvƒg‚Å‚Ì–„‚ßž‚Ý•Ï”‚ÉBaseExp,JobExp,NextBaseExp,NextJobExp’ljÁ
- (map/)
- skill.c
- skill_produce_mix() C³B
- pc.c
- pc_readparam()Apc_setparam() C³B
- (db/)
- const.txt C³B
-
---------------
-//0701 by ‚Ò‚´‚Ü‚ñ
-
-EƒXƒe[ƒ^ƒXˆÙí”»•ÊŽ®“±“üBŠeƒXƒe[ƒ^ƒXˆÙí‚Ì”­“®—¦‚ªVIT/INT/MDEF‚ɉe‹¿‚·‚é‚悤‚É‚È‚è‚Ü‚·BŽ‘±ŽžŠÔ’Zk‚Í‚Ü‚½¡“x‚Å_|P|›
-E•sŽ€‚É“€Œ‹‚ªŒø‚¢‚½ƒoƒOC³B
- (map/)
- skill.c
- skill_additional_effect()Askill_castend_nodamage_id() C³B
-
---------------
-//0700 by “ì
-
-E697‚̃oƒOC³B
-@@@@(db/)
- mob_db.txt
-
---------------
-//0699 by Ž€_
-
-E‘•”õ‚̃{[ƒiƒXƒNƒŠƒeƒBƒJƒ‹‚ÍŽ©•ª‚̊ԈႢ‚¾‚Á‚½‚Ì‚ÅbCriticalRate‚ðbCritical‚É•ÏXB‚»‚ê‚Æ0695‚Å‘‚«–Y‚ê‚Å‚·‚ªASPD‚ðã‚°‚éƒJ[ƒh‚â‘•”õ‚̈ꕔ‚ðbAspdAddRate‚©‚çbAspdRate‚É•ÏX‚µ‚Ü‚µ‚½B‚Ý‚·‚Ƃꑃ‚̃Vƒ~ƒ…ƒŒ[ƒ^[‚É‚æ‚é‚ƃhƒbƒyƒ‹ƒJ[ƒh‚Í•¡”‚Å‚àˆê‚‚µ‚©“K—p‚³‚ê‚È‚¢‚Ý‚½‚¢‚¾‚Á‚½‚Ì‚ÅB
- (db/)
- item_db.txt
-
---------------
-//0698 by Ž€_
-
-Eˆê•”‚̃Lƒƒƒ‰‚Éd—Ê‚ª‚O‚É‚È‚Á‚ăJƒvƒ‰‚Ȃlj½‚à‚o‚bC‚m‚b‚o‚ª•\Ž¦‚³‚ê‚È‚­‚È‚éƒoƒOC³B(‚»‚ꂾ‚¯)
- (common/)
- mmo.h C³B
- (map/)
- clif.c
- clif_updatestatus() C³B
- pc.c
- pc_calcstatus() C³B
-
---------------
-//0697 by “ì
-
-Emob_dbC³
-@ƒhƒƒbƒv‚ð’†S‚ÉC³B
-@@@@(db/)
- mob_db.txt
-
---------------
-//0696 by Ž€_
-
-EƒoƒOC³B
-EƒeƒŒƒ|[ƒg‚âƒ[ƒv“™‚ÌŽžƒXƒLƒ‹ƒ†ƒjƒbƒg‚©‚甲‚¯‚鈗‚ª“ü‚Á‚Ä
-‚È‚©‚Á‚½‚Ì‚ÅSAFETYWALL“™‚É‚æ‚Á‚ÄŽI—Ž‚¿‚ª‹N‚±‚Á‚½‚悤‚Å‚·B(Šm‚©•ñ‚à
-‚ ‚Á‚½‚ÆŽv‚¢‚Ü‚·‚ª...) ‚æ‚Á‚ÄC³‚Í‚µ‚Ü‚µ‚½‚ªŠm”F‚Í‚µ‚Ä‚Ü‚¹‚ñB•ñ‚ð
-‚¨Šè‚¢‚µ‚Ü‚·B
-EƒXƒLƒ‹‚É‚æ‚é‚«”ò‚΂µˆ—‚ð‚¿‚å‚Á‚ÆC³‚ƃ‚ƒ“ƒXƒ^[‚̃R[ƒh‚ð­‚µC³B
-‘½•ª•Ï‚É‚È‚Á‚½‚±‚Æ‚Í‚È‚¢‚ÆŽv‚¢‚Ü‚·‚ª•Ï‚¾‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
-E‚»‚Ì‘¼×‚©‚¢C³B
- (map/)
- skill.h C³B
- skill.c
- skill_blown()Askill_attack()Askill_unit_move() C³B
- skill_castend_nodamage_id()Askill_castend_damage_id() C³B
- skill_unit_out_all()Askill_unit_out_all_sub() ’ljÁB
- mob.c
- mob_stop_walking()Amob_spawn()Amob_warp() C³B
- mob_can_move()Amob_changestate() C³B
- map.h C³B
- pc.c
- pc_setpos() C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack() C³B
-
---------------
-//0695 by Ž€_
-
-E­‚µC³B
-EƒvƒŒƒCƒ„[‚ÌŠî–{ƒpƒ‰ƒ[ƒ^‚ð2byte‚ÉŠg’£B
-Eitem_db.txt‚ðƒ‰ƒOƒiƒQ[ƒg‚Ìà–¾‚ɇ‚킹‚ÄC³B
-EbAddEff‚ÆbResEff‚ÌŠm—¦‚ð•S•ª—¦‚©‚ç–œ•ª—¦‚É•ÏXB
-EƒXƒNƒŠƒvƒgstatusup‚Æstatusup2’ljÁB
-statusup bStr; ‚̂悤‚ÉŽg‚Á‚Ä‹@”\‚̓Xƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðŒ¸‚ç‚µ‚Ä
-Šî–{ƒpƒ‰ƒ[ƒ^‚ð1ã‚°‚éB
-statusup2 bInt,n; ‚̂悤‚ÉŽg‚Á‚Ä‹@”\‚̓Xƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðŒ¸‚ç‚³‚¸‚É
-Šî–{ƒpƒ‰ƒ[ƒ^‚ðnã‚°‚éB
-E‚»‚Ì‘¼×‚©‚¢C³B
- (conf/)
- battle_athena.conf C³B
- (db/)
- item_db.txt C³B
- const.txt C³B
- (doc/)
- item_bonus.txt C³B
- conf_ref.txt C³B
- (common/)
- mmo.h C³B
- (char/)
- char.c
- mmo_char_send006b()Aparse_char() C³B
- (map/)
- map.h C³B
- clif.h C³B
- clif.c
- clif_initialstatus()Aclif_updatestatus() C³B
- pc.h C³B
- pc.c
- pc_bonus()Apc_calcstatus()Apc_equippoint()Apc_equipitem() C³B
- pc_jobchange()Apc_checkbaselevelup()Apc_statusup() C³B
- pc_statusup2() ’ljÁB
- battle.h C³B
- battle.c
- battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pc_weapon_attack()Abattle_config_read() C³B
- skill.c
- skill_additional_effect()Askill_status_change_start() C³B
- script.c
- buildin_statusup()Abuildin_statusup2() ’ljÁB
- atcommnad.c C³B
-
---------------
-//0694 by Ž€_
-
-EƒoƒOC³‚Æׂ©‚¢C³B
-EbCriticalRate‚ª³‚µ‚­“K—p‚³‚ê‚È‚©‚Á‚½–â‘èC³B
-Eƒyƒbƒg‚É‚æ‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX’ljÁBƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚Í‘•”õ‚Ì
-ƒXƒNƒŠƒvƒg‚É‚æ‚Á‚Äݒ肵‚Ü‚·B‚½‚¾ƒyƒbƒg‚É‚æ‚éƒ{[ƒiƒX‚̓J[ƒh‚É‚æ‚镨‚Æ“¯‚¶ˆµ‚¢‚ð‚µ‚Ü‚·B‚»‚µ‚Ä‘®«‚Ì“K—p‚͈ê”Ô—D懈ʒႢ‚Å‚·B¡‚͉½‚à“ü‚Á‚Ä‚Ü‚¹‚ñ‚ª...
- (conf/)
- battle_athena.conf C³B
- (db/)
- const.txt C³B
- pet_db.txt C³B
- (doc/)
- item_bonus.txt C³B
- conf_ref.txt C³B
- db_ref.txt C³B
- (map/)
- map.h C³B
- map.c
- map_quit() C³B
- battle.h C³B
- battle.c
- battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
- battle_config_read() C³B
- pc.c
- pc_calcstatus()Apc_bonus()Apc_setpos()Apc_authok() C³B
- pc_damage()Apc_autosave_sub() C³B
- pet.h C³B
- pet.c
- pet_hungry()Apet_birth_process()Apet_recv_petdata()Apet_food() C³B
- pet_return_egg()Apet_ai_sub_hard()Aread_petdb() C³B
- clif.c
- clif_sendegg()Aclif_parse_LoadEndAck() C³B
- atcommand.c C³B
- makefile C³B
-
---------------
-//0693 by ŒÓ’±—–
-
-ESC_*‚Ì—ñ‹“•\‚ðƒŠƒiƒ“ƒoƒŠƒ“ƒO
- ƒNƒ‰ƒCƒAƒ“ƒg‚É’Ê’m‚·‚é‚Ì‚ð64–¢–ž‚©‚ç128–¢–ž‚É‘‚₵‚½
- ƒpƒPƒbƒgî•ñ‚ɇ‚¤‚悤‚ɃŠƒiƒ“ƒo[
- StatusChange‚Ì”z—ñ‚ð128‚©‚ç192‚É‘‚₵‚½‚̂Ńƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚Ü‚·B
-
- (db/)
- const.txt
- SC_* ‚Ì”’l‚ð•ÏX
- (map/)
- skill.h
- SC_* ‚Ì—ñ‹“‚Ì”’l‚ð•ÏX
- map.h
- MAX_STATUSCHANGE‚ð128‚©‚ç192‚É‘‚₵‚½
- skill.c
- skill_status_change_start(),skill_status_change_end(),
- skill_status_change_clear()‚Ì’Ê’mˆ—‚ð•ÏX
-
-E‰‰‘t/ƒ_ƒ“ƒX‚̈—‚ð•ÏX
- ‰‰‘t/ƒ_ƒ“ƒX’†‚©‚Ç‚¤‚©‚ðSC_DANCING‚Å”»’è‚·‚é‚悤‚É•ÏX
- i”»’舗‚ª‘½­‚‘¬‰»‚³‚ꂽ‚Í‚¸j
- ƒ[ƒv(ƒ}ƒbƒvˆÚ“®‚┈‚È‚Ç)‚·‚é‚Ɖ‰‘t/ƒ_ƒ“ƒX‚ð’†’f‚·‚é‚悤‚É•ÏX
-
- skill.h/skill.c
- skill_check_dancing()íœAskill_stop_dancing()’ljÁ
- skill_delunitgroup(),skill_initunitgroup()•ÏX
- skill_status_change_start()•ÏX
- skill_castend_nodamage_id()•ÏX
- ‘‚«‘¹‚¶‚ª‚ ‚é‚©‚àEE
- pc.c
- pc_calcstatus(),pc_setpos(),pc_damage()•ÏX
-
-E•s‹¦˜a‰¹ƒXƒLƒ‹‚ÌC³
- (db/)
- skill_db.txt
- •s‹¦˜a‰¹ƒXƒLƒ‹‚ÌHIT”C³
- (map/)
- skill.c
- skill_status_change_timer()•ÏX
- battle.c
- battle_calc_misc_attack()C³
-
---------------
-//0692 by ŒÓ’±—–
-
-EƒAƒhƒŠƒuƒXƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢–â‘èC³iskill_db‚Ì“Y•t‚µ–Y‚êj
- (db/)
- skill_db.txt
- ƒAƒhƒŠƒu‚ÌÁ”ïSP‚ð1‚ÉC³
-
-Emob_db2.txt‚ª‚ ‚ê‚Îmob_db.txt‚ɃI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É
- ƒIƒŠƒWƒiƒ‹mob‚ðì‚Á‚Ä‚él‚ÍŽg‚¤‚Æ•Ö—˜‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-
- mob.c
- mob_readdb()
-
-EŽI—Ž‚¿ƒoƒO•ñŽž‚Ì‚½‚߂̃Xƒ^ƒbƒNƒoƒbƒNƒgƒŒ[ƒXƒƒOŠ“¾•û–@‚ðЉî
- ŽI—Ž‚¿ƒoƒO‚Ì•ñŽž‚ÉA‚±‚Ìî•ñ‚ðƒRƒsƒy‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ñ‚Ü‚·B
- Cygwin‚Åcore‚Ì“f‚©‚¹‚é•û–@‚àЉ‚Ä‚Ü‚·B
-
- (doc/)
- coredump_report.txt
-
---------------
-//0691 by ŒÓ’±—–
-
-Eitem_db2.txt‚ª‚ ‚ê‚Îitem_db.txt‚ɃI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É
- ƒIƒŠƒWƒiƒ‹ƒAƒCƒeƒ€‚ðì‚Á‚Ä‚él‚ÍŽg‚¤‚Æ•Ö—˜‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-
- itemdb.c
- itemdb_readdb()C³
-
-E‰‰‘t/ƒ_ƒ“ƒXŒnƒXƒLƒ‹‰¼ŽÀ‘•
- E‰‰‘t/ƒ_ƒ“ƒX’†‚͈ړ®‚ª’x‚­AƒXƒLƒ‹‚àŽg‚¦‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
- EƒAƒhƒŠƒuƒXƒLƒ‹‚ʼn‰‘t/ƒ_ƒ“ƒX‚ð’†’f‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- E‰‰‘t/ƒ_ƒ“ƒX‚ÍΉ»‚Ȃǂ̈ÙíAMHP‚Ì1/4ˆÈã‚̃_ƒ[ƒW‚Å’†’f‚µ‚Ü‚·
- EƒLƒƒƒ‰ƒNƒ^[ƒOƒ‰ƒtƒBƒbƒN‚͉‰‘t/ƒ_ƒ“ƒX‚µ‚Ü‚¹‚ñ
- E‰‰‘t/ƒ_ƒ“ƒX’†‚ÌSPÁ”ï‚Í–¢ŽÀ‘•‚Å‚·
- EˆÚ“®‚µ‚Ä‚àŒø‰Ê”͈͂͂‚¢‚Ä‚«‚Ü‚¹‚ñ
- Ed•¡‚µ‚Ä‚à•s‹¦˜a‰¹‚Ȃǂɕω»‚µ‚Ü‚¹‚ñ
- EƒGƒtƒFƒNƒg‚ªo‚Ä‚àŒø‰Ê‚Í–¢ŽÀ‘•‚Ì‚à‚Ì‚ª‚ ‚è‚Ü‚·
- E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒg‚È‚Ì‚Å‘½”‚Ì•s“s‡‚ª‚ ‚é‚ÆŽv‚¢‚Ü‚·
-
- skill.h
- SC_* ‚Ì—ñ‹“•\‚ðC³
- skill.c
- skill_check_dancing()’ljÁ
- SkillStatusChangeTable[]C³
- skill_unit_onout(), skill_status_change_start(),
- skill_status_change_timer(),skill_unitsetting(),
- skill_castend_id(),skill_castend_pos(),skill_castend_map(),
- skill_castend_nodamage_id()C³
- ‚»‚Ì‘¼‚Í–Y‚ê‚Ü‚µ‚½
- pc.c
- pc_calcstatus(),pc_damage()C³
-
---------------
-//0690 by ”g˜Q
-
-Eׂ©‚¢C³
- (db/)
- item_db.txt ‚ƃƒMƒ“ƒMƒ‡ƒ‹ƒh‚Ìbonus‚ðC³B
- (doc/)
- item_bonus.txt C³B
-
---------------
-//0689 by Ž€_
-
-E‘qŒÉƒoƒOC³‚Æׂ©‚¢C³B
- (map/)
- pc.c
- pc_modifybuyvalue()Apc_modifysellvalue() C³B
- storage.c
- storage_storageopen() C³B
- storage_storage_quit()Astorage_storage_save() C³B
-
---------------
-//0688 by ¹
-
-EƒfƒBƒXƒJƒEƒ“ƒgAƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒgAƒI[ƒo[ƒ`ƒƒ[ƒW‚ª“K—p‚³‚ê‚È‚©‚Á‚½–â‘è‚ðC³B
- (map/)
- pc.c
- pc_modifybuyvalue() C³B
- pc_modifysellvalue() C³B
-
---------------
-//0687 by Ž€_
-
-E­‚µC³B
-Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
-Eitem_avail.txt‚̈—‚ð•ÏXBƒAƒCƒeƒ€ID‚ÌŒã‚É0‚ð“ü‚ê‚é‚Æ¡‚Ü‚Å’Ê‚è‚ÉŽg—p•s‰Â”\‚ɂȂ邪0ˆÈŠO‚Ì”’l‚ð“ü‚ê‚é‚ÆŽg—p•s‰Â”\‚Å‚Í‚È‚­‚»‚Ì”’l‚ðƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚ÄŒ©‚½–Ú‚¾‚¯‚ð‚»‚ê‚É•ÏX‚µ‚Ü‚·B‚æ‚Á‚ĈƗŽ‚¿ƒAƒCƒeƒ€‚ð•Ê‚Ì•¨‚É•\Ž¦‚µ‚ĈƗŽ‚¿‚ð–h‚®‚±‚Æ‚ª‚Å‚«‚Ü‚·B(•\Ž¦‚¾‚¯•Ï‚¦‚ÄŽI‚̈—‚Í–{“–‚̃AƒCƒeƒ€ID‚Ì•¨‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·BC³‚Í‘S‚Ä‚µ‚½‚ÆŽv‚¢‚Ü‚·‚ª”²‚¯‚½Š‚ª‚ ‚é‚©‚à’m‚è‚Ü‚¹‚Ì‚ÅŒ©‚½–Ú•ÏX‚µ‚½ƒAƒCƒeƒ€‚ňƗŽ‚¿‚ª‹N‚±‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B) ŽI‚̈—‚Í‚±‚ꂪŒÀŠE‚Å‚·B(­‚È‚­‚Æ‚àŽ©•ª‚É‚Í) ƒAƒCƒeƒ€‚ª“¯‚¶•¨‚ª“ñ‚•\Ž¦‚³‚ê‚ĊԈႢˆÀ‚¢‚Æ‚©‚Ç‚¤‚±‚¤‚Æ‚©‚Ì•¶‹å‚ðŒ¾‚¢‚½‚¢l‚͈Æì‚ê‚æBˆÈãB
-EƒWƒ‹ƒ^ƒX‚ƃAƒŠƒX‚̃Rƒ}ƒ“ƒgƒAƒEƒg‰ðœBitem_avail.txt‚Å—‘‚ðƒ‹ƒr[‚ƃAƒNƒAƒ}ƒŠƒ“‚Å•\Ž¦‚µ‚ĕߊlƒAƒCƒeƒ€‚à‘¼‚Ì•¨‚É•\Ž¦‚·‚é‚悤‚É•ÏX‚µ‚Ä‚¢‚Ü‚·B
-Eƒ_ƒ[ƒWŒvŽZ‚̃oƒOC³B(‘債‚½•¨‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª‹|‚¾‚¯‚¿‚å‚Á‚Æ–â‘肪‚ ‚Á‚½‚悤‚Å‚·B)
-E” “™‚̃AƒCƒeƒ€‚Å“¾‚½‘•”õ•i‚Í–¢ŠÓ’è‚É‚È‚é‚悤‚É•ÏXB
-E‘•”õƒ{[ƒiƒX‚Ì“à•”ˆ—C³‚Æ­‚µ•ÏXB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
-EƒLƒƒƒ‰ŽI‚Ƀe[ƒ^‚𑗂鎞ƒLƒƒƒ‰A‘qŒÉAƒyƒbƒg‚̃e[ƒ^‚𓯎ž‚É‘—‚é‚悤‚É•ÏXB(ƒLƒƒƒ‰ŽI‚ƃ}ƒbƒvŽI‚ÌŠÔ‚Ì“]‘——Ê‚ª‘‚¦‚é‚©‚à’m‚è‚ê‚Ü‚¹‚ñ‚ªƒf[ƒ^‚𓯊ú‰»‚ׂ̈ł·B)
-EFW‚Ì“®ìŠÔŠu‚ð0.25•b‚©‚ç0.1•b‚É•ÏXB(‚±‚ê‚Å ‚蔲‚Í­‚µŒ¸‚é‚Í‚¸‚Å‚·B)
-EƒJ[ƒgƒŒƒ{ƒŠƒ…ƒVƒ‡ƒ“‚Å‚Ç‚ñ‚Èó‘ÔˆÙí‚à‚©‚©‚ç‚È‚¢‚悤‚É•ÏXB
- (conf/)
- battle_athena.conf C³B
- (db/)
- const.txt C³B
- item_avail.txt C³B
- pet_db.txt C³B
- (doc/)
- conf_ref.txt C³B
- item_bonus.txt C³B
- (map/)
- map.h C³B
- map.c
- map_quit() C³B
- battle.h C³B
- battle.c
- battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_get_dmotion()Abattle_config_read() C³B
- pc.c
- pc_calcstatus()Apc_bonus()Apc_bonus3()Apc_setpos() C³B
- pc_makesavestatus()Apc_autosave_sub()Apc_modifybuyvalue() C³B
- pc_modifysellvalue()Apc_stop_walking() C³B
- skill.c
- skill_additional_effect()Askill_unitsetting() C³B
- clif.c
- clif_buylist()Aclif_selllist()Aclif_set009e()Aclif_set0078() C³B
- clif_set007b()Aclif_additem()Aclif_itemlist()Aclif_equiplist() C³B
- clif_storageitemlist()Aclif_storageequiplist()Aclif_changelook() C³B
- clif_arrow_create_list()Aclif_useitemack()Aclif_tradeadditem() C³B
- clif_storageitemadded()Aclif_getareachar_item() C³B
- clif_skill_produce_mix_list()Aclif_cart_additem()Aclif_cart_itemlist() C³B
- clif_cart_equiplist()Aclif_vendinglist()Aclif_openvending() C³B
- clif_produceeffect()Aclif_sendegg()Aclif_pet_equip()Aclif_mvp_item() C³B
- clif_pet0078()Aclif_pet007b() C³B
- itemdb.h C³B
- itemdb.c
- itemdb_searchrandomid()Aitemdb_search()Aitemdb_readdb() C³B
- itemdb_read_itemavail()Aitemdb_read_itemvaluedb() C³B
- itemdb_equippoint() íœB
- storage.h C³B
- storage.c
- storage_storage_quitsave() ->storage_storage_quit()‚É•ÏX‚ÆC³B
- storage_storageclose() C³B
- atcommand.c C³B
- pet.c
- pet_change_name()Apet_equipitem()Apet_unequipitem() C³B
- pet_birth_process()Apet_return_egg() C³B
- script.c
- buildin_getitem() C³B
- mob.c
- mob_stop_walking() C³B
- makefile C³B
-
---------------
-//0686 by ¹
-
-Eׂ©‚¢C³B
- (map/)
- pc.h C³B
-
---------------
-//0685 by ”g˜Q
-
-E0683A0684‚Å‚Ìbonus‚̒ljÁ‚É‚Æ‚à‚È‚Á‚Äitem_db.txt‚ðC³
-E‘¼FXC³
- (db/)
- item_db.txt C³B
- (doc/)
- item_bonus.txt C³B
-
---------------
-//0684 by Ž€_
-
-Eׂ©‚¢C³B
-EŽ€‚ñ‚¾‚Ó‚è‚ÌŽžƒXƒLƒ‹‚ƃAƒCƒeƒ€‚ªŽg‚¦‚È‚¢‚悤‚É•ÏXB
-EbInfiniteEndure’ljÁB‹@”\‚Í–³ŒÀƒCƒ“ƒfƒ…ƒAB
-Eƒ_ƒ[ƒW•\Ž¦‚̈—­‚µ•ÏXB
- (db/)
- const.txt C³B
- (doc/)
- item_bonus.txt C³B
- (map/)
- map.h C³B
- pc.c
- pc_calcstatus() C³B
- pc_equipitem()Apc_unequipitem() C³B
- clif.c
- clif_parse_UseItem()Aclif_parse_UseSkillToId() C³B
- clif_parse_UseSkillToPos()Aclif_parse_UseSkillMap() C³B
- clif_damage()Aclif_skill_damage()Aclif_skill_damage2() C³B
- clif_parse_LoadEndAck() C³B
- skill.c
- skill_status_change_timer() C³B
-
---------------
-//0683 by Ž€_
-
-EƒoƒOC³‚Æbonus’ljÁB
-E‘qŒÉƒoƒOA‘®«ƒoƒOC³‚Æ‚»‚Ì‘¼‚̃oƒOC³B
-EƒXƒNƒŠƒvƒgbonus3’ljÁB¡‚ÍbAddMonsterDropItem‚¾‚¯‚ª‘Ήž‚É‚È‚Á‚Ä‚¢‚Ü‚·B
-Ebonus bRestartFullRecover;n;“™‚Ån‚Í–³ˆÓ–¡‚¾‚¯‚ÇÁ‚·‚Ì‚Í‚¿‚å‚Á‚Æ‚Ü‚¸‚¢‚Å‚·‚Ì‚Å0‚É‚µ‚Ä“ü‚ꂽ•û‚ª‚¢‚¢‚Å‚·Bbonus‚Í2‚‚̔’l‚ª•K—v‚ȃXƒNƒŠƒvƒg‚È‚Ì‚ÅB
-EbDefRatioAtk‚ð–hŒä–³Ž‹‚É•ÏXB
-E0677‚Å‘‚«–Y‚êB
-E•Ší‚Ì‘®«“K—p—D懈ʂ𻑢>ƒJ[ƒh>•Ší‚É•ÏXB»‘¢‚ªÅ—Dæ‚Å‚·B(‘®«‚ª‚ ‚鎞‚ɘb‚Å‚·B‘®«‚ª‚È‚¢ê‡‘®«‚ ‚镨‚Éã‘‚«‚³‚ꂽ‚è‚Í‚µ‚Ü‚¹‚ñB)
-E‘•”õ‚Å“K—p‚³‚ê‚éŒø‰Ê‚Ì—D懈ʂð‰EŽè>¶Žè>‘Ì>“ªã>“ª’†>“ª‰º>ƒ[ƒu>ŒC>ƒAƒNƒZƒTƒŠ[1>ƒAƒNƒZƒTƒŠ[2>–î‚ÉÝ’èB(–{ŽIŽd—l‚ª‚Ç‚¤‚È‚Ì‚©•ª‚©‚邱‚Æ‚ª‚Å‚«‚»‚¤‚È•¨‚Å‚à‚È‚¢‚̂ŃAƒeƒi‚ÌŽd—l‚ÆŒ¾‚¤‚±‚Æ‚ÅB) ‰EŽè‚ªÅ—Dæ‚Å‚·B
-E•Ší‚ÌŽË’ö‚ð‰EŽè‚ƶŽè‚Ì•Ší‚Ì’†‚Å’·‚¢•¨‚ð“K—p‚·‚é‚悤‚É•ÏXB
- (db/)
- const.txt C³B
- (doc/)
- item_bonus.txt C³B
- (map/)
- map.h C³B
- battle.c
- battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_calc_pet_weapon_attack()Abattle_calc_magic_attack() C³B
- battle_damage() C³B
- pc.c
- pc_autosave_sub()Apc_calcstatus() C³B
- pc_bonus()Apc_bonus2() C³B
- pc_bonus3() ’ljÁB
- script.c
- buildin_bonus3() ’ljÁB
- mob.c
- mob_once_spawn()Amob_damage() C³B
- storage.h C³B
- storage.c
- storage_storage_save() ’ljÁ
- atcommand.c C³B
-
---------------
-//0682 by ¹
-
-EƒXƒs[ƒhƒAƒbƒvƒ|[ƒVƒ‡ƒ“Œn‚̃oƒOC³
- (map/)
- pc.c
- pc_calcstatus() C³B
-
---------------
-//0681 by Ž€_
-
-E‘•”õƒoƒOC³B
- (map/)
- pc.c
- pc_equipitem() C³B
-
---------------
-//0680 by ¹
-
-Eׂ©‚¢C³B
-Eu@monstervƒRƒ}ƒ“ƒh‚Ń‚ƒ“ƒXƒ^[ID‚ÌŽw’è‚Éu-1vAu-2v“™‚ðŽw’è‚·‚é‚Æ
-@ƒ‚ƒ“ƒXƒ^[‚ðƒ‰ƒ“ƒ_ƒ€‚Å¢ŠÒ‚Å‚«‚é‹@”\‚ð’ljÁB
- (map/)
- mob.c
- atcommand.c
-
---------------
-//0679 by ”g˜Q
-
-E0676‚ÅV‚µ‚¢ƒAƒCƒeƒ€Œø‰Ê‚ªŽÀ‘•‚³‚ꂽ‚Ì‚ÅAitem_db.txt‚ðC³(bonus bAddMonsterDropItem,n,x; ‚ÍAŽí‘°”»’肪‚Å‚«‚È‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸•Û—¯‚µ‚Ü‚µ‚½B)
-E‘¼FXC³
- (db/)
- item_db.txt
- job_db1.txt
- (doc/)
- item_bonus.txt
-
---------------
-//0678 by ¹
-
-E¢ŠÒŠÖ˜A‚Ìׂ©‚¢C³B
- (map/)
- mob.c
- mob_once_spawn_area() C³B
-
---------------
-//0677 by Ž€_
-
-Eׂ©‚¢C³B
-EƒAƒCƒeƒ€”„”ƒ‚É‚æ‚Á‚Ä“¾‚ç‚ê‚éŒoŒ±’l‚ðƒJ[ƒh‚É‚æ‚éƒXƒLƒ‹‚Å‚Í“¾‚ç‚ê‚È‚¢‚悤‚ÉC³B
-E“Å‚ÉŠ|‚©‚é‚ÆŽ©‘R‰ñ•œ‚Å‚«‚È‚¢‚悤‚ÉC³B
-E0676‚Å‘‚«–Y‚êB»‘¢•Ší‚Ìꇻ‘¢‚É‚æ‚Á‚Ä—^‚¦‚½‘®«‚ª•Ší‚Ì‘®«‚æ‚è—D悵‚Ä“K—p‚³‚ê‚é‚悤‚É•ÏXB(»‘¢•Ší‚ª–³‘®«‚Ìꇂ͓K—p‚³‚ê‚Ü‚¹‚ñB)
- (doc/)
- item_bonus.txt ŒëŽšC³B
- (map/)
- npc.c
- npc_buylist()Anpc_selllist() C³B
- pc.c
- pc_calcstatus()Apc_natural_heal_sub() C³B
-
---------------
-//0676 by Ž€_
-
-EFX‚ÆC³B
-Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
-E‚Ý‚·‚Ƃꑃ‚ðŽQl‚µ‚ă_ƒ[ƒWŒvŽZ‚ð­‚µC³B
-E‘•”õbonus‚ÉFX‚ƒljÁB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
-EŽ©“®ƒZ[ƒu‚·‚鎞(ƒLƒƒƒ‰ŽI‚Ƀf[ƒ^‚𑗂鎞)‘qŒÉ‚̃f[ƒ^‚à‘—‚é‚悤‚É•ÏXB
-E0667‚ÅŒ¾‚¢–Y‚êBƒJ[ƒg‚ðŠO‚µ‚Ä‚àƒAƒCƒeƒ€‚ªÁ‚¦‚È‚¢‚悤‚É•ÏXB(–{ŽI‚ÅÁ‚¦‚é‚Ì‚ªŽd—l‚¾‚ÆŽv‚Á‚Ä‚¢‚½‚¯‚ÇC³‚³‚ꂽ‚Ý‚½‚¢‚È‚Ì‚ÅB)
-EŽæˆø—v¿‚ðŽó‚¯‚鑤‚ÍŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚µ‚È‚¢‚悤‚ÉC³B(Žó‚¯‚鑤‚ÌŠî–{ƒXƒLƒ‹ƒ`ƒFƒbƒN‚ÍŽ©•ª‚ª“ü‚ꂽ•¨‚Å‚Í‚È‚¢‚Å‚·B‚¢‚‚̊Ԃɂ©“ü‚Á‚Ä‚¢‚½‚Ì‚Å휂µ‚Ü‚µ‚½B)
-E–h‹ï‚̸˜Bƒ{[ƒiƒX‚ð’[”–³Ž‹‚É•ÏXB(‚±‚ꂪ–{ŽI‚ÌŽd—l‚Ý‚½‚¢‚È‚Ì‚Å)
-EƒAƒ“ƒNƒ‹‚̈—­‚µ•ÏXB(‚©‚©‚ç‚È‚¢‚ÆŒ¾‚¤•ñ‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚Å...)
-EƒvƒŒƒCƒ„[‚̃Xƒe[ƒ^ƒXŒvŽZ‚Å–â‘è‚ ‚è‚»‚¤‚ÈŠC³B
-EƒJ[ƒh‚ÌID‚Å‹@”\‚ªŒˆ‚Ü‚Á‚Ä‚¢‚½ƒJ[ƒh‚àƒXƒNƒŠƒvƒg‚É‚æ‚Á‚Ä•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É•ÏXB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
-EaspdŒvŽZ•û–@­‚µ•ÏXB
-E–î‚ÉbCriticalAbAtkEleAbHitAbAddEleAbAddRaceAbAddSizeAbAddEff‚ð“K—p‚Å‚«‚é‚悤‚É•ÏXB–î‚ðŽg‚¤ƒXƒLƒ‹‚â‹|‚É‚æ‚éUŒ‚‚¾‚¯‚É–î‚ÌbCriticalAbAtkEleAbHitAbAddEleAbAddRaceAbAddSizeAbAddEff‚ª“K—p‚³‚ê‚é‚悤‚ÉC³B
-EƒLƒŠ‚ÌŽÀ‘•‚ɈׂÉC³‚Í‚µ‚Ü‚µ‚½‚ªƒLƒŠ‚ª–hŒä–³Ž‹‚È‚Ì‚©‚Ç‚¤‚©‚ª‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å–hŒä–³Ž‹‚Í‚µ‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
-EƒeƒXƒg‚µ‚½•¨‚ÍbAddMonsterDropItem‚ÆbGetZenyNum‚¾‚¯‚Ȃ̂ųí‚É“®ì‚·‚é‚©‚Ç‚¤‚©‚Ì•ñ‚ª—~‚µ‚¢Š‚Å‚·B(‚‚¢‚Å‚Éitem_db‚ÌC³‚à...‚±‚ê‚Å‹zŽûŒn‚ƃI[ƒgƒXƒyƒ‹ŒnˆÈŠO‚Í–w‚ÇŽÀ‘•‚Å‚«‚é‚Í‚¸‚Å‚·B‘½•ª...)
-E‚»‚Ì‘¼‚ÍŠo‚¦‚Ä‚È‚¢‚¯‚ÇC³‚µ‚½Š‚ª­‚µ‚ ‚é‚©‚à...
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- item_bonus.txt C³B
- (db/)
- const.txt C³B
- (char/)
- inter.c
- inter_init() C³B
- int_storage.c
- mapif_parse_SaveStorage() C³B
- (map/)
- trade.c
- trade_traderequest() C³B
- pc.h C³B
- pc.c
- pc_autosave_sub()Apc_calcstatus() C³B
- pc_bonus()Apc_bonus2() C³B
- pc_setrestartvalue()Apc_setequipindex() C³B
- pc_check_equip_wcard()Apc_check_equip_dcard()Apc_check_equip_card() íœ
- ‚»‚Ì‘¼C³B
- skill.h C³B
- skill.c C³B
- skill_castend_nodamage_id()Askill_unit_onplace() C³B
- skill_check_condition()Askill_additional_effect() C³B
- skill_attack()Askill_status_change_start() C³B
- map.h C³B
- battle.h C³B
- battle.c
- battle_get_def()Abattle_get_mdef2() C³B
- battle_weapon_attack()Abattle_damage() C³B
- battle_calc_magic_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pet_weapon_attack() C³B
- battle_calc_misc_attack()Abattle_config_read() C³B
- mob.c
- mob_damage() C³B
- pet.c
- pet_target_check() C³B
- clif.c
- clif_set0078()Aclif_set007b()Aclif_changelook() C³B
- atcommand.c C³B
-
---------------
-//0675 by ”g˜Q
-
-EŠØŽI‚Å‘º³‚ÌŒø‰Ê‚ª•ÏX‚³‚ꂽ‚Ì‚Å•ñ‚ðŒ³‚Éitem_db.txt‚ðC³
-Ejob_db1.txt‚ðC³
- (db/)
- item_db.txt
- job_db1.txt
-
---------------
-//0674 by npc
-
-Eƒtƒ@[ƒ}ƒV[‚̉¼ŽÀ‘•B
- (db/)
- produce_db.txt
- (map/)
- skill.c
-
---------------
-//0673 by “ì
-
-EW’†—ÍŒüã‚É‘•”õ•i‚̕Ⳃª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
-@@@@@(map/)@@@
-@@@@@ pc.c
-
---------------
-//0672 by “ì
-
-EW’†—ÍŒüã‚É‘•”õ•i‚̕Ⳃª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
-@@@@@(map/)@@@
-@@@@@ pc.c
-
---------------
-//0672 by ¹
-
-Eƒ‚ƒ“ƒXƒ^[Œn‚̃oƒOC³(‚·‚Ý‚Ü‚¹‚ñA‚Ü‚¾Žc‚Á‚Ä‚Ü‚µ‚½(^^; )
- (map/)
- mob.c
-
---------------
-//0671 by ¹
-
-EIDƒ`ƒFƒbƒN”͈͂ÌC³‘¼B
-E@monster‚Å”‚ðŽw’肵‚È‚­‚Ăࢊ҂ł«‚é‚悤‚ÉC³B
- (map/)
- atcommand.c
- battle.c
- battle.h
- mob.c
- pet.c
- (conf/)
- battle_athena.conf
- (doc/)
- conf_ref.txt
-
---------------
-//0670 by RR
-
-Eƒ‚ƒ“ƒXƒ^[ƒhƒƒbƒv—¦‚ðC³(–{ŽI€‹’ADB‚Å‚ÌÝ’è+1/10000)B
-E—Ž‰º—¦‚O‚Éݒ肵‚½ƒAƒCƒeƒ€‚ð—Ž‚Æ‚·‚©‚Ç‚¤‚©‚ðbattle_athena.conf‚ÅÝ’è‰Â”\‚ÉB
- (map/)
- mob.c
- mob_damage() C³B
- battle.c
- battle.h
- (conf/)
- battle_athena.conf
-
---------------
-//0669 by ¹
-
-Eƒ‚ƒ“ƒXƒ^[ƒhƒƒbƒv‚ÌC³B
- (map/)
- mob.c
- mob_damage() C³B
-
---------------
-//0668 by ¹
-
-Eƒ‚ƒ“ƒXƒ^[ID‚͈̔̓`ƒFƒbƒN‚ðC³B
- (map/)
- mob.c
- mob_dbAmob_once_spawn()Amob_once_spawn_area()A
- mob_summonslave()Amob_read_randommonster()Amob_readdb() C³B
-
---------------
-//0667 by Ž€_
-
-EÅ‘åHPŒvŽZŽ®‚ðƒ~ƒXƒgƒŒ‘ƒ‚ðŽQl‚µ‚ÄC³B(‘½•ª‚±‚ê‚Å–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚ÆŽv‚¢‚Ü‚·B)
-E–h‹ï‚̸˜Bƒ{[ƒiƒX‚ð0.7‚É•ÏXB(¡‚Í’[”‚ðŽlŽÌŒÜ“ü‚µ‚Ä‚¢‚Ü‚·‚ª–{ŽI‚ª’[”–³Ž‹‚È‚çC³‚µ‚Ä‚¨‚«‚Ü‚·B)
-E@refineƒRƒ}ƒ“ƒh‚Å‘•”õêŠID‚É0‚ð“ü‚ê‚é‚Æ‘•”õ‚µ‚Ä‚¢‚é‘S‚Ä‚Ì‘•”õ‚ð¸˜B‚·‚é‚悤‚É•ÏXB
-E‚»‚Ì‘¼×‚©‚¢C³B
- (db/)
- item_db.txt
- 7140A7142‚ðŒ³‚É–ß‚µ‚Ä0666‚Ì•¨‚̓Rƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B
- job_db1.txt C³B
- refine_db.txt C³B
- (map/)
- mob.c
- mob_once_spawn() C³B
- itemdb.c
- itemdb_read_randomitem() C³B
- pet.c
- pet_food() C³B
- pc.c
- pc_readdb()Ado_init_pc()Apc_calcstatus()Apc_setoption() C³B
- pc_calc_sigma() ’ljÁB
- ‚»‚Ì‘¼C³B
- map.h C³B
- battle.c
- battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
- atcommand.c C³B
-
---------------
-//0666 by ¹
-
-Eƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€‚Ìׂ©‚¢C³B
-Ebattle_athena.conf‚Ì€–ڒljÁB
-EŒÃ–Ø‚ÌŽ}‚Å¢ŠÒ‚·‚郂ƒ“ƒXƒ^[‚ÌŠm—¦‚ðÝ’èo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B
-Eƒ‚ƒ“ƒXƒ^[¢ŠÒƒAƒCƒeƒ€‚ð•¡”ì‚鎖‚ªo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B
-E¢ŠÒƒAƒCƒeƒ€‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚Ä
-@¶–½‚ÌŽíŽq‚ðƒ|ƒŠƒ“Œn¢ŠÒA
-@ƒGƒ“ƒuƒŠƒI‚ðMVPƒ{ƒXŒn¢ŠÒ‚É‚µ‚Ä‚Ý‚Ü‚µ‚½B
-@‚ ‚Ü‚è‚¢‚¢ƒTƒ“ƒvƒ‹‚ðŽv‚¢‚‚©‚È‚©‚Á‚½‚Ì‚ÅA
-@‰½‚©‚¢‚¢ˆÄ‚ðŽv‚¢‚‚¢‚½l‚Í‘‚«Š·‚¦‚Ä‚â‚Á‚Ä‚­‚¾‚³‚¢(^^;
- (conf/)
- battle_athena.conf
- (doc/)
- conf_ref.txt
- (map/)
- mob.h
- mob_db C³B
- mob.c
- mob_once_spawn()Amob_makedummymobdb()Amob_readdb() C³B
- mob_readbranch() -> mob_read_randommonster()‚É•ÏXB
- battle.h
- battle_config C³B
- battle.c
- battle_config_read() C³B
- itemdb.c
- itemdb_read_randomitem() C³B
- (db/)
- item_db.txt
- item_bluebox.txt
- item_cardalbum.txt
- item_giftbox.txt
- item_scroll.txt
- item_violetbox.txt
- mob_branch.txt
- mob_poring.txt ’ljÁB
- mob_boss.txt ’ljÁB
-
---------------
-//0665 by J
-
-E‰…—ì•Žm‚ÌŽæ‚芪‚«‚ªƒJƒuƒL”EŽÒ‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðŽð“V‹ç‚ÉC³B
-EƒIƒbƒg[‚ɃtƒFƒCƒNƒGƒ“ƒWƒFƒ‹‚ªo‚·‚Í‚¸‚ÌŽæ‚芪‚«‚ª‚‚¢‚Ä‚½‚Ì‚ðC³B
- (db/)
- mob_skill_db.txt
-
---------------
-//0664 by ¹
-
-E¸˜BŽ¸”sŽž‘¼‚̃vƒŒ[ƒ„[‚É‚àƒGƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚é‚悤‚ÉC³B
- (map/)
- script.c
- buildin_failedrefitem() C³B
-
---------------
-//0663 by lide
-
-Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒAC³
- (map/)
- battle.c
- skill.c
-
---------------
-//0662 by Ž€_
-
-Eׂ©‚¢C³‚ƃoƒOC³B
-Eƒvƒƒ{ƒbƒN‚É‚æ‚Á‚ă‚ƒ“ƒXƒ^[‚ÍæŽZ–hŒä‚ÆŒ¸ŽZ–hŒä‚ªŒ¸‚é‚悤‚ÉC³‚µ‚ăvƒŒƒCƒ„[‚ÍŒ¸ŽZ–hŒä‚¾‚¯Œ¸‚é‚悤‚ÉC³B
-EƒXƒNƒŠƒvƒggetgmlevel’ljÁB‹@”\‚Í‚»‚ÌNPC‚Ƙb‚µ‚Ä‚¢‚éƒvƒŒƒCƒ„[‚ÌGMƒŒƒxƒ‹‚ð•Ô‚µ‚Ü‚·B
-E0659‚Ì‘‚«–Y‚ê‚Å‚·‚ªƒyƒbƒg‚̃pƒtƒHƒ}ƒ“ƒX‚ÌŽí—Þ‚ªe–§“x‚É‚æ‚Á‚Ä‘‚¦‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
- (map/)
- clif.c
- pc.c
- script.c
-
---------------
-//0661 by Ž€_
-
-Eׂ©‚¢C³B
-EÚ‘±‚µ‚½Žž‚̃yƒbƒg‚̃ƒbƒZ[ƒW‚ðe–§“x‚ª‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚Ì‚Ý‚Éo‚é‚悤‚É•ÏXB
-E0659‚Å‘‚«–Y‚ê‚Å‚·‚ªƒyƒbƒg‚ÌŽx‰‡UŒ‚‚Íe–§“x‚ª‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚Ì‚Ý‚É”­¶‚µ‚Ü‚·B(‚»‚ê‚Æe–§“x‚É‚æ‚Á‚ÄŽx‰‡UŒ‚Šm—¦‚ª­‚µ•Ï‰»‚µ‚Ü‚·B)
-EƒWƒ‹ƒ^ƒX‚ƃAƒŠƒX‚Ì—‘‚ÌID‚ðitem_db.txt‚ɇ‚킹‚Ü‚µ‚½B(Ž©•ª‚ªì‚Á‚½pet_db.txt‚Ì•û‚ªŽ©•ªŸŽè‚Éݒ肵‚Ä‚¢‚½•¨‚Å‚µ‚½‚Ì‚ÅB‚ÄŒ¾‚¤‚©–¢ŽÀ‘•ƒAƒCƒeƒ€‚¾‚©‚ç”Ô†‚ª‚í‚©‚ç‚È‚©‚Á‚½‚¾‚¯‚Å‚·‚ª...)
-Epet_db.txt‚Ìattack_rate‚ª³‚µ‚­“K—p‚³‚ê‚È‚©‚Á‚½ƒoƒOC³B
- (db/)
- pet_db.txt
- (map/)
- clif.c
- clif_parse_LoadEndAck() C³B
- pc.c
- pc_attack_timer() C³B
-
---------------------
-//0660 by ‚¢‚Ç
-
-EƒT[ƒo[snapshot
-
---------------
-//0659 by Ž€_
-
-Eƒyƒbƒg‚ðFX‚ÆC³B(ƒyƒbƒg‚̃R[ƒh‚ð‚Ù‚Æ‚ñ‚Ç•Ï‚¦‚Ü‚µ‚½B)
-EŽè“®“I‚¾‚Á‚½ƒyƒbƒg‚Ì“®‚«‚ðƒ‚ƒ“ƒXƒ^[‚̂悤‚ÉAI‚Æ‚µ‚Ĉ—B
-EÚ‘±‚µ‚½Žž‚̃yƒbƒg‚̃ƒbƒZ[ƒWŽÀ‘•B(–{ŽI‚Í‚Ç‚¤‚È‚Ì‚©‚í‚©‚è‚Ü‚¹‚ñ‚ª
-Athena‚ÍÚ‘±‚·‚é‚Æ100%˜b‚·‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
-Eƒyƒbƒg‚̃XƒyƒVƒƒƒ‹ƒpƒtƒHƒ}ƒ“ƒXŽÀ‘•B(‚½‚¾‘䎌‚ª‚¿‚å‚Á‚Æ•Ï‚Å‚·B‚¢‚­‚ç’T‚µ‚Ä‚àŠY“–‚·‚éƒpƒPƒbƒg‚ªŒ©‚‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅB)
-Eƒyƒbƒg‚̑䎌‚𑼂̃yƒbƒg‚Ì•¨‚É•ÏX‚·‚é‹@”\’ljÁB(Ú‚µ‚¢‚±‚Æ‚Ídb_ref.txt‚Æpet_db.txt‚ÅB)
-Eƒyƒbƒg‚É‚æ‚éŽx‰‡UŒ‚•ÏXBpet_db.txt‚ÅUŒ‚‚·‚鎞‚ÆUŒ‚‚ðŽó‚¯‚½Žž‚ÌŽx‰‡UŒ‚
-Šm—¦‚ð•ÊX‚ÉÝ’è‚Å‚«‚Ü‚·BUŒ‚‚·‚鎞‚Ìê‡UŒ‚‚·‚é“x‚Ƀ`ƒFƒbƒN‚ð‚µ‚Ü‚·‚Ì‚Å
-UŒ‚‘¬“x‚ª‘¬‚¢‚ÆŽx‰‡UŒ‚‚ðŽó‚¯‚â‚·‚­‚È‚è‚Ü‚·BUŒ‚‚ðŽó‚¯‚½Žž‚à“¯‚¶‚Å‚·B(‚±‚¿‚ç‚̓_ƒ[ƒW‚ð‹ò‚炤“x‚É‚È‚è‚Ü‚·‚ªB) Žx‰‡UŒ‚Šm—¦‚̓\ƒq[AƒWƒ‹ƒ^ƒXAƒAƒŠƒX‚¾‚¯Ž©•ªŸŽè‚Éݒ肵‚Ä‚¢‚Ü‚·B(‘¼‚Ì‚Í‘S•”1%‚ÉBƒyƒbƒg‚ÌŽx‰‡UŒ‚‚Í“¯‚¶ƒ‚ƒ“ƒXƒ^[‚É‚Í‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚»‚µ‚ăyƒbƒg‚Ì퓬”\—͂̓‚ƒ“ƒXƒ^[‚Æ“¯‚¶‚Å‚·B)
-E/hideƒRƒ}ƒ“ƒhŽÀ‘•B
-Eƒvƒƒ{ƒbƒN‚É‚æ‚Á‚ÄæŽZ–hŒä‚àŒ¸‚é‚悤‚ÉC³B
-EƒtƒŠ[ƒLƒƒƒXƒg‚̃oƒOC³B
-Eƒm[ƒrƒX‚̃Xƒe[ƒ^ƒXƒ{[ƒiƒXíœB
-Ebattle_athena.conf‚Ì€–ڒljÁ‚ÆíœB
-EC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯B–¢ƒeƒXƒg‚µ‚½•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
- (conf/)
- battle_athena.conf
- (doc/)
- conf_ref.txt
- db_ref.txt ’ljÁB(¡à–¾‚ª“ü‚Á‚Ä‚¢‚é‚Ì‚Ípet_db.txt‚Ì‚Ý‚Å‚·B )
- client_packet.txt
- (db/)
- pet_db.txt
- job_db2.txt
- (map)
- clif.h
- clif.c
- map.h
- map.c
- pet.h
- pet.c
- pc.c
- mob.h
- mob.c
- npc.c
- atcommand.c
- skill.c
- battle.h
- battle.c
-
---------------
-//0658 by huge
-
-Eƒyƒbƒg‚ª‚Æ‚Ç‚ß‚ð‚³‚·‚ÆAŽ”‚¢Žå‚ÉŒoŒ±’l‚ª“ü‚é‚悤‚É‚µ‚Ü‚µ‚½B
-EŒÅ’è’lƒ_ƒ[ƒW‚¶‚á–¡‚ª–³‚¢‚Ì‚ÅATK1`ATK2‚ÌŠÔ‚Å—”‚ðŽæ‚é‚悤‚É‚µ‚Ü‚µ‚½B
-E‚ ‚ÆAƒyƒbƒg‚ª‚Æ‚Ç‚ß‚ð‚³‚·‚©‚Ç‚¤‚©‚ÌÝ’è‚ðAbattle_athena.conf‚ɉÁ‚¦‚Ü‚µ‚½B
-
- (conf/)
- battle_athena.conf pet_finish’ljÁB
- (map/)
- battle.c
- battle_config_read() C³B
- battle.h C³B
- pet.c
- pet_attack() C³B
- (doc/)
- conf_ref.txt à–¾’Ç‹LB
-
---------------
-//0657 by huge
-
-Eƒyƒbƒg‚É‚æ‚éUŒ‚‚ðŽÀ‘•B
-Eƒyƒbƒg‚ðŽ‚Á‚Ä‚¢‚ÄAƒyƒbƒg‚ª‘•”õ•i‚ð‚‚¯‚Ä‚ÄA‚³‚ç‚Ƀ‰ƒ“ƒ_ƒ€‚É‚æ‚é”»’è‚Å”­“®‚µ‚Ü‚·B
-E‚½‚¾‚Ì—V‚ÑS‚Å‚·‚—
-Ebattle_athena.conf‚Å•p“x‚ðÝ’è‚Å‚«‚Ü‚·BÚׂÍdoc‚ÅB
-
- (conf/)
- battle_athena.conf pet_attack’ljÁB
-
- (map/)
- battle.c
- battle_config_read() C³B
- battle.h C³B
- pc.c
- pc_attack_timer() C³B
- pet.c
- pet.h
- pet_attack() ’ljÁB
- (doc/)
- conf_ref.txt à–¾’Ç‹LB
-
- ‚Æ‚è‚ ‚¦‚¸Aƒyƒbƒg‚ª“®‚¢‚Ä‚é‚È‚Ÿ‚Á‚ÄŠ´‚¶‚ÆAƒ_ƒ‰ñ”‚ð‘‚₵‚½’ö“x‚Å‚·B
-
---------------
-//0656 by Ž€_
-
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³B(‚¨‚¢‚¨‚¢‰½“x–Ú‚¾...)
-EƒOƒ‰ƒ“ƒhƒNƒƒXŒvŽZŽ®ŠÔˆá‚¢‚ÅC³B(€3‚ª‚Ü‚¸‚©‚Á‚½‚Ý‚½‚¢‚Å‚·B)
-‚Å‚à‚Ü‚¾”½ŽËƒ_ƒ[ƒW‚ª‚Ý‚·‚Ƃꑃ‚æ‚è‚¿‚å‚Á‚Æ‚‚¢‚Å‚·B(10‚®‚ç‚¢‚¾‚©‚ç
-ŠÖŒW‚È‚¢‚©‚à)
-Eƒ‚ƒ“ƒN‚Ì‹C‹…‚ð•K’†‚ÉC³B(Ž©•ª‚̊ԈႢ‚̂悤‚Å‚·‚Ì‚Å...)
- (map/)
- skill.c C³B
- battle.c C³B
-
---------------
-//0655 by Ž€_
-
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³B
-EŽ©•ª‚È‚è‚Éî•ñ‚ðŽûW‚µ‚Ä‚Ý‚½Œ‹‰ÊƒOƒ‰ƒ“ƒhƒNƒƒX”½ŽËƒ_ƒ[ƒW‚Í
-ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ª‚»‚̃Lƒƒƒ‰Ž©g‚ɃOƒ‰ƒ“ƒhƒNƒƒX‚ðŽg‚Á‚½Žž‚Ì
-ƒ_ƒ[ƒW‚¾‚»‚¤‚È‚Ì‚ÅC³‚µ‚Ü‚µ‚½B(‚Ý‚·‚Ƃꑃ‚ÌŒvŽZ‚Æ‚Í‚©‚È‚èˆá‚¤‚悤‚È
-‹C‚à‚µ‚Ü‚·‚ª...)
-E–‚–@‚ƃgƒ‰ƒbƒvA‘é‚ÌUŒ‚‚É‚à‘®«‘Ï«‚ÆŽí‘°‘Ï«‚ð“K—p‚·‚é‚悤‚ÉC³B
-(–{ŽI‚ÌŽd—l‚É‚ ‚Á‚Ä‚¢‚é‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·‚ª“K—p‚µ‚½•û‚ª³‚µ‚¢‚ÆŽv‚Á‚½‚Ì‚Å
-C³‚µ‚Ü‚µ‚½B)
- (map/)
- skill.c C³B
- map.h C³B
- battle.c C³B
-
---------------
-//0654 by Ž€_
-
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³‚Æׂ©‚¢C³B(ŒvŽZŽ®ŠÔˆá‚¢‚ÅC³B)
-E0653‚Å‘‚«–Y‚êB‹CŒ÷‚É‚æ‚é’ljÁƒ_ƒ[ƒW‚Í•K’†‚Å‚Í‚È‚¢‚炵‚¢‚Ì‚Å
-C—û‚̉ÁŽZ‚Æ“¯‚¶Š‚ÉŒvŽZ‚·‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
-EƒJ[ƒg‚ɃoƒO‚ª‚ ‚è‚»‚¤‚¾‚Á‚½‚Ì‚Å‚¿‚å‚Á‚ÆC³B
-Eƒ_ƒ[ƒWŒvŽZ‚ð‚Ù‚ñ‚Ì­‚µC³B(ƒ_ƒ[ƒW—Ê‚ª•Ï‚í‚Á‚½‚è‚Í‚µ‚Ü‚¹‚ñB)
- (map/)
- battle.c
- battle_calc_magic_attack() C³B
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- skill.c
- pc_damage_feedback() -> skill_damage_feedback()‚É•ÏXB
- skill_unit_timer() C³B
- pc.c
- pc_setoption() C³B
- atcommand.c C³B
-
---------------
-//0653 by Ž€_
-
-E0652‚ÌC³‚Æׂ©‚¢C³B¡‚Ü‚Å’Ê‚è–¢ƒeƒXƒg‚à‘½‚¢‚Å‚·B
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚̈—C³B(–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ÌŽ©g‚Í‚ ‚è‚Ü‚¹‚ñB)
-ƒ‰ƒOƒi[ƒQ[ƒg‚Ìà–¾‚É‚æ‚é‚ÆŽn‚ß‚ÉŒ»ÝHP‚Ì20%‚ªÁ–Õ‚³‚ê‚Ä‚»‚ÌŒã“G‚É—^‚¦‚½
-ƒ_ƒ[ƒW‚Ì’†‚ňê”Ô‚‚¢•¨‚ª–ß‚Á‚Ä‚­‚é‚悤‚Å‚·B‚»‚µ‚Ä‚»‚Ì–ß‚Á‚Ä‚«‚½
-ƒ_ƒ[ƒW‚͹‚Ì‘®«‚ðŽ‚¿ƒgƒ‰ƒXƒg‚É‚æ‚Á‚Ĺ‚Ì‘Ï«‚ª50%‚É‚È‚Á‚Ä‚¢‚é‚Ì‚Å
-”¼•ª‚ð‹ò‚炤‚±‚Æ‚É‚È‚é‚悤‚Å‚·B(¹‚̑ϫオ‚é‘•”õ‚ð‚µ‚Ä‚¢‚ê‚Ζ߂Á‚Ä‚­‚é
-ƒ_ƒ[ƒW‚͎󂯂Ȃ¢‚悤‚Å‚·B)
-–â‘è‚Ȃ̂̓vƒŒƒCƒ„[‚Ì–hŒä‘®«‚ðŒvŽZ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B¡‚Í–hŒä‘®«ŒvŽZ‚Ì
-Œã‚Ź‚Ì‘®«‚ðŒvŽZ‚µ‚Ä‚¢‚Ü‚·B‚»‚µ‚Ä–ß‚Á‚Ä‚­‚éƒ_ƒ[ƒW‚ÍHPƒo[‚ÍŒ¸‚邯‚Ç
-•\Ž¦‚Í‚³‚ê‚Ü‚¹‚ñB–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©•s–¾‚È‚Ì‚Å...
-‚»‚ê‚ƈꉞƒ‚ƒ“ƒXƒ^[‚àƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌŽg—p‚ª‰Â”\‚Å‚·B‚½‚¾ƒ‚ƒ“ƒXƒ^[‚Ìê‡
-Œ»ÝHP‚Ì20%Á–Õ‚ÌŒã‚̃_ƒ[ƒW‚͎󂯂܂¹‚ñB(ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤
-ƒOƒ‰ƒ“ƒhƒNƒƒX‚̃eƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB)
-Eƒ_ƒ[ƒW‚É‚æ‚éƒfƒBƒŒƒC’†‚É‚Ü‚½ƒfƒBƒŒƒC‚ª‚©‚©‚ç‚È‚¢‚悤‚ÉC³B(‘債‚½ˆÓ–¡‚Í‚È‚¢‚©‚à...)
-E’l’i‚ªƒ[ƒ‚̃AƒCƒeƒ€‚à”„‚ê‚é‚悤‚É•ÏXB
-E@ƒRƒ}ƒ“ƒhheal‚̈—­‚µC³B
-EˆÚ“®ƒR[ƒh­‚µC³B
- (map/)
- clif.c
- clif_selllist() C³B
- battle.c
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
- skill.c
- skill_additional_effect()Askill_unit_onplace() C³B
- skill_status_change_start()Askill_unit_onplace() C³B
- skill_castend_damage_id()Askill_castend_id()Askill_attack() C³B
- skill_unitsetting()Askill_check_condition() C³B
- skill_use_id()Askill_use_pos() C³B
- npc.c
- npc_parse_script() C³B
- pc.h C³B
- pc.c
- pc_walk()Apc_walktoxy_sub()Apc_stop_walking() C³B
- map.h C³B
- mob.h C³B
- mob.c
- mob_stop_walking()Amob_changestate()Amob_walk() C³B
- pet.c
- pet_changestate() C³B
- atcommand.c C³B
- (db/)
- skill_db.txt ƒOƒ‰ƒ“ƒhƒNƒƒXC³B
- cast_db.txt ƒOƒ‰ƒ“ƒhƒNƒƒXC³B
-
---------------
-//0652 by ŒŽ‰r‚Ý
-
-EƒOƒ‰ƒ“ƒhƒNƒƒX‚ð‰¼ŽÀ‘•
- (db/)
- skill_db.txt
- cast_db.txt
- (map/)
- battle.c
- Damage battle_calc_misc_attack
- Damage battle_calc_magic_attack
- skill.c
- skill_additional_effect
- skill_castend_damage_id
- skill_castend_pos2
- skill_unit_group *skill_unitsetting
- skill_unit_onplace
- skill_check_condition
-
---------------
-//0651 by ”g˜Q
-
-Eitem_db.txt‚ðC³
- (db/)
- item_db.txt
- ‘•”õ•i‚̃AƒCƒeƒ€Œø‰Ê‚ðC³
-
---------------
-//0650 by Ž€_
-
-EŽO’i¶‚Ì”­“®ðŒ‚ð‹|‚Æ“ñ“—¬ˆÈŠO‚É•ÏXB
-E•\Ž¦‚ð‚¹‚¸‚É“à•”‚ň—‚¾‚¯‚·‚éNPC‚ÌCLASS‚ð111‚©‚ç32767‚É•ÏXB
-Eׂ©‚¢C³B
- (map/)
- clif.c
- clif_getareachar_npc()Aclif_spawnnpc()Aclif_pcoutsight() C³B
- npc.h C³B
- battle.c
- battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
-
---------------
-//0649 by ”g˜Q
-
-EDB‚ÆDOCC³
- (db/)
- item_db.txt
- ƒOƒ“ƒOƒj[ƒ‹‚ÍLV4•Ší‚È‚Ì‚ÅAŠØ‘‚̃f[ƒ^‚É‚ ‚킹‚Ä•—‘®«‚Å‚Í‚È‚­‚µ‚Ü‚·B
- mob_db.txt
- size_fix.txt
- ŠyŠí‚Í‘åŒ^‚ɑ΂µ‚Ä75%‚¾‚»‚¤‚Å‚·B
- (doc/)
- item_bonus.txt
-
---------------
-//0648 by Ž€_
-
-EƒVƒ‡ƒbƒv‚Ì’l’i‚É-‚ð“ü‚ê‚é‚ÆŽI‚ª—Ž‚¿‚é–â‘èC³B(itemdb‚̉Šú‰»‚ðnpc‚æ‚è
-æ‚É‚·‚é‚悤‚É•ÏXB) ‚»‚ꂾ‚¯‚Å‚·B
- (map/)
- map.c
- do_init()
-
---------------
-//0647 by nini
-
-Eitem_dbC³
-EƒXƒiƒbƒ`ƒƒ[Žd—l•ÏXB‹|ˆÈŠO‚Ì‚·‚ׂĂ̕Ší‚Åo‚é‚悤‚É‚È‚Á‚Ä‚Ü‚·B
- (/map/)
- battle.c
- ŽO’i¶‚Ì”­“®ðŒ’ljÁ
- skill.c
- ƒXƒiƒbƒ`ƒƒ[‚Ì”­“®ðŒ’ljÁ
- (/db/)
- item_db.txt
- ƒVƒ‹ƒNƒnƒbƒg‚ÉSP㸒ljÁ
-
---------------
-//0646 by last
-
-Eitem_db.txt‚ÌC³(‘®«ŠÖ˜A)
- (/db/)
- item_db.txt
-
---------------
-//0645 by ‚é‚é‚éi•ree_ronj
-
-Eitem_value_db.txt‚ɃfƒBƒXƒJƒEƒ“ƒg•ƒI[ƒo[ƒ`ƒƒ[ƒW“™‚̃XƒLƒ‹‚É‚æ‚鉿Ši•Ï“®‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒOƒƒ“ƒg‚ð’ljÁB
-@ŽÀÛ‚ÌŒ`Ž®‚̓Tƒ“ƒvƒ‹‚Æ‚µ‚Ä—pˆÓ‚µ‚½item_value_db.sample.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢Biݒ艿Ši‚ÍŠ®‘S‚É“Æ’f‚Æ•ÎŒ©‚Å‚·j
-@“¯—l‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚Ä‚m‚o‚bÝ’uƒXƒNƒŠƒvƒg‚à“Y•t‚µ‚Ä‚¨‚«‚Ü‚·B
-Eitem_value_db.txt‚̃AƒCƒeƒ€‰¿ŠiÝ’è‚ÅA”„’l‚Æ”ƒ’l‚ÌÝ’è‚ð“Æ—§Biitem_db.txt‚Í]—ˆ‚Ç‚¨‚蔃’l‚Í”„’l‚Ì”¼Šz‚Æ‚µ‚ÄŽ©“®ˆ—j
-E‚m‚o‚bƒVƒ‡ƒbƒv‚É‚ÄA‚P‚m‚o‚b‚ňµ‚¦‚éƒAƒCƒeƒ€”‚ðÅ‘å64‚©‚çÅ‘å100‚É•ÏXBiƒNƒ‰Ž©‘Ì‚Í120‚®‚ç‚¢‚܂ʼn”\‚Å‚·‚ªj
- (/db)
- item_value_db.txt
- ƒJƒ‰ƒ€”‚ð®—‚µ‚½‚¾‚¯‚Å‚·B“à—e‚Í‚Ü‚Á‚½‚­•ÏX‚µ‚Ä‚¢‚Ü‚¹‚ñB
- (/map/)
- clif.c
- clif_buylist() clif_selllist() •ÏX
- itemdb.h
- item_data \‘¢‘Ì•ÏX
- itemdb_value_buy() itemdb_value_sell() itemdb_value_notdc() itemdb_value_notoc() ƒ}ƒNƒ’ljÁ
- itemdb.c
- itemdb_search() itemdb_readdb() itemdb_read_itemvaluedb() •ÏX
- itemdb_sellvalue() íœ
- npc.c
- npc_buylist() npc_selllist() npc_parse_shop() •ÏX
- (/sample/)
- ƒIƒ}ƒP‚Å‚·BŽŸ‰ñSnapShot‚É‚ÍŠÜ‚Ü‚È‚¢‚Å‹X‚µ‚¢‚Å‚·B
-
-ƒRƒƒ“ƒg
-Œ´Œ^‚ÍŽ„‚Ì—Flree_ron‚ªs‚¢AŽ„‚ªX‚Éׂ©‚¢ƒ~ƒX‚𒼂µ‚½‚¾‚¯‚Å‚·‚ªAƒeƒXƒg‚Í‚µ‚Ü‚µ‚½‚Ì‚Å‘åä•v‚Å‚µ‚傤B
-Œ³X‚±‚̈—‚𓱓ü‚·‚é——R‚Æ‚µ‚ÄA“Á’èƒAƒCƒeƒ€‚Ì”„’l‚ª1zŒÅ’è‚É‚Å‚«‚È‚¢‚à‚Ì‚©A‚Æ‚¢‚¤“_‚¾‚Á‚½‚©‚ç‚Å‚·B
-‚»‚µ‚Ä‚â‚Á‚Ä‚¢‚­‚¤‚¿‚ÉA‚m‚o‚bƒVƒ‡ƒbƒv‚ð—˜—p‚µ‚½ƒŒƒAƒAƒCƒeƒ€‚̔̔„‚Æ‚©‚Å–{ŽI˜I“X‚É‹ß‚¢‚±‚Æ‚ªo—ˆ‚é‚Ì‚Å‚Í‚È‚¢‚©A
-‚Æ‚¢‚¤‚±‚Æ‚ª”»‚Á‚Ä‚«‚½‚킯‚Å‚·B
-‚»‚ê‚ňꉞ‚̓f[ƒ^‚ð—pˆÓ‚µ‚Ü‚µ‚½‚ªA‚ ‚­‚Ü‚Å‚àƒTƒ“ƒvƒ‹‚Æ‚µ‚Ä—˜—p‚µ‚Ä‚­‚¾‚³‚¢B‚à‚µ‰Â”\‚È‚ç‚ÎA
-‚³‚ç‚ÉC³‚ð‰Á‚¦‚ăAƒeƒi“ÆŽ©‚Æ‚µ‚Ä–{Ì—p‚Æ‚µ‚½ƒf[ƒ^‚ðƒpƒbƒ`ƒAƒbƒv‚µ‚Ä‚­‚ê‚ê‚΂ƂàŽv‚¢‚Ü‚·‚ª‚—
-
-
---------------
-//0644 by nini
-
-EDB‚̊ԈႢA643‚ŒljÁ‚³‚ꂽƒXƒNƒŠƒvƒg’ljÁB
- (/db/)
- item_db.txt
- cast_db.txt
- ƒ`ƒƒ[ƒWƒAƒ[‚̃LƒƒƒXƒg’ljÁB
- exp_guild.txt
- 46-50‚Ü‚Å‚Ìexp”²‚¯‚ɒljÁB
- size_fix.txt
- ŠyŠíA•ÚAƒiƒbƒNƒ‹‚̃TƒCƒY•â³C³B
-
---------------
-//0643 by Ž€_
-
-EFX‚ÆC³B
-EbMVPaddAtkRateíœBbAddRace‚ň—‚·‚é‚悤‚É•ÏXB
-EbIgnoreDefEle‚ÆbIgnoreDefRace’ljÁB
-bonus bIgnoreDefEle,n; n‘®«‚Ì“G‚Ì–hŒä–³Ž‹
-bonus bIgnoreDefRace,n; nŽí‘°‚Ì“G‚Ì–hŒä–³Ž‹
-EbMatkRate’ljÁB–‚–@UŒ‚—Í‚ð+n%ã‚°‚Ü‚·B‚æ‚Á‚Äbattle.c‚ÅŒvŽZ‚µ‚Ä‚¢‚½ƒƒbƒh‚É‚æ‚é–‚–@UŒ‚—Í‘•‚ÌŒvŽZ‚Í‚È‚­‚µ‚Ü‚µ‚½BƒXƒe[ƒ^ƒX‰æ–Ê‚Éオ‚Á‚½”’l‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñBƒ_ƒ[ƒWŒvŽZ‚ÌŽž‚É“K—p‚µ‚Ä‚¢‚Ü‚·B
-EbCriticalDef‚É-‚ð“ü‚ê‚é‚ƃNƒŠƒeƒBƒJƒ‹‚ð‹ò‚炤Šm—¦‚ªã‚ª‚é‚悤‚É•ÏXB
-ENPC”Ô†111‚Í“§–¾NPC‚Å‚·‚ª—Ž‚Æ‚µŒŠ“™‚Ì‚±‚Æ‚ðl‚¦‚Ä•\Ž¦‚ðˆêØ‚¹‚¸‚É
-“à•”‚ň—‚¾‚¯‚·‚é‚悤‚É•ÏXB(flag‚ðŽg‚¤‚Ɖ½‚Æ‚©‚È‚è‚»‚¤‚Å‚·‚ª‚»‚Ì
-ˆ—‚ª‘S‘R‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“§–¾NPC‚ɃNƒŠƒbƒN‚â–¼‘O‚Ì•\Ž¦‚à‚Å‚«‚È‚¢‚悤‚É•ÏX‚µ‚Ü‚µ‚½B)
-EƒVƒ‡ƒbƒv‚Ì’l’i‚É-‚ð“ü‚ê‚é‚Æitem_db.txt‚à‚µ‚­‚Íitem_value_db.txt‚Ì•¨‚ðŽg‚¤‚悤‚É•ÏXB
-EƒXƒLƒ‹ƒ‹ƒAƒt‚̃GƒtƒFƒNƒg‚ªƒTƒCƒg‚Æ“¯‚¶‚¾‚Á‚½‚Ì‚ÅC³B‚‚¢‚łɃ‹ƒAƒt‚Ì
-ƒ_ƒ[ƒW‚àC³B
-E‚Ý‚·‚Ƃꑃ‚É‚æ‚é‚ƃ‚ƒ“ƒXƒ^[î•ñ‚Å•\Ž¦‚³‚ê‚é–hŒä‚Æ–‚–@–hŒä‚ÍæŽZ‚Å‚Í‚È‚­Œ¸ŽZ‚Ý‚½‚¢‚È‚Ì‚ÅC³B
-E‘¼—Í–{Šè‚Å‚·‚ªitem_db.txt‚ÌC³‚ð‚¨Šè‚¢‚µ‚Ü‚·B(‘S‚Ẵƒbƒh‚Ébonus bMatkRate,15; ‚ð“ü‚ê‚é•K—v‚ª‚ ‚è‚Ü‚·B‚»‚Ì‘¼‚ÌC³‚à•K—v‚Å‚·B)
-EƒeƒXƒg‚µ‚Ä‚¢‚È‚¢•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
- (map/)
- map.h C³B
- map.c
- map_quit() C³B
- pc.h C³B
- pc.c
- pc_walk()Apc_stop_walking()Apc_setpos()Apc_authok() C³B
- pc_calcstatus()Apc_bonus()Apc_natural_heal_sub() C³B
- npc.h C³B
- npc.c
- npc_touch_areanpc()Anpc_parse_shop() C³B
- clif.c
- clif_quitsave()Aclif_getareachar_npc()Aclif_spawnnpc() C³B
- clif_skill_estimation() C³B
- battle.c
- battle_calc_magic_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_calc_mob_weapon_attack() C³B
- mob.c
- mobskill_use() C³B
- skill.c
- skill_status_change_end()Askill_status_change_timer() C³B
- skill_status_change_start() C³B
- (db/)
- const.txt C³B
- (doc/)
- item_bonus.txt C³B
-
---------------
-//0642 by Ž€_
-
-E‘•”õƒoƒOC³B(‚»‚ꂾ‚¯)
- (map/)
- pc.c
- pc_authok()Apc_checkitem() C³B
-
---------------
-//0641 by Ž€_
-
-EbAspdRate‚ÆbSpeedRate‚̃oƒOC³B(‚»‚ꂾ‚¯)0640‚ÅŒvŽZ‚ð‚¿‚å‚Á‚Æ•Ï‚¦‚ÄŒ©‚Ü‚µ‚½‚ª‚»‚ꂪ‚Ü‚¸‚©‚Á‚½‚Ý‚½‚¢‚Å‚·B¡“x‚àŒvŽZŽ®‚ð•Ï‚¦‚Ü‚µ‚½‚ª‚à‚¤‘åä•v‚¾‚ÆŽv‚¢‚Ü‚·B(‘½•ª)
- (map/)
- pc.c
- pc_calcstatus()Apc_bonus()Apc_delitem()
-
---------------
-//0640 by Ž€_
-
-EƒoƒOC³‚Æ­‚µC³B
-E‚Ý‚·‚Ƃꑃ‚ðŽQl‚µ‚ă_ƒ[ƒWŒvŽZ‚ð­‚µC³B
-Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
-EƒLƒƒƒ‰‚ÌHP‚ÆSP‚ð2byte‚©‚ç4byte‚É•ÏXB(ƒeƒXƒg‚Í‚µ‚Ä‚¢‚Ü‚·‚ªƒoƒO‚ªo‚é
-‰Â”\«‚à‚©‚È‚è‚ ‚è‚Ü‚·B‚½‚¾ƒLƒƒƒ‰ƒZƒŒƒNƒg‰æ–Ê‚ÅHP‚âSP‚ª32768‚ð‰z‚¦‚鎞
-•\Ž¦‚Í32768‚ɂȂ邯‚Ç“à•”‚̈—‚ͳí‚É“®‚«‚Ü‚·‚Ì‚Å‚»‚ê‚̓oƒO‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-ƒpƒPƒbƒg‚Ì’·‚³‚Ì‚¹‚¢‚Å‚»‚êˆÈŠOŽè’i‚ª‚È‚©‚Á‚½‚Ì‚Å...)
-EbCriticalDef(ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢Šm—¦+n%)‚̈—•ÏXB100‚É‚·‚ê‚Î
-ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢‚悤‚É‚È‚è‚Ü‚·B)
-EbInnerAtk‚ðbBaseAtk‚É•ÏXB‚Ý‚·‚Ƃꑃ‚ŃJ[ƒh‚ÌUŒ‚‚ÍŠî–{UŒ‚—Í‚Ì•û‚É‘«‚³‚ê‚é‚Æ‚ ‚è‚Ü‚µ‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½B¡“x‚Íオ‚Á‚½UŒ‚—Í‚ª•\Ž¦‚³‚ê‚Ü‚·B
-EbDoubleRate‚̈—•ÏXBŠm—¦‚ð‘«‚³‚¸‚Ɉê”Ô‚‚¢•¨‚¾‚¯“K—p‚µ‚Ü‚·B‚»‚ê‚ƶŽè
-‘•”õ‚Ìꇖ³Ž‹‚·‚é‚悤‚É•ÏX‚µ‚Ü‚½B(¶Žè‚̓_ƒuƒ‹‚ª“K—p‚³‚ê‚Ü‚¹‚ñ‚Ì‚Å)
-EbDoubleAddRate’ljÁB‹@”\‚̓_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦+n%(•Ší–³Ž‹)‚Å‚·B
-¶Žè‘•”õ‚Í–³Ž‹‚³‚ê‚Ü‚·B
-E0635‚ÅUŒ‚—Í•\Ž¦‚ð–{ŽI‚É‚ ‚킹‚Ü‚µ‚½B‚»‚µ‚Ä¡“x‚Í‹|‚¾‚¯‚Å‚Í‚È‚­
-ŠyŠí‚ƃ€ƒ`‚àdex‚É‚æ‚Á‚ÄUŒ‚—Í‚ªã‚ª‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
-E‘•”õ‚µ‚½•Ší‚ªÁ‚¦‚éƒoƒOC³‚ׂ̈ɭ‚µC³‚Í‚µ‚Ü‚µ‚½‚ª–{“–‚É
-‘åä•v‚È‚Ì‚©‚Í•s–¾‚Å‚·B•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
- (conf/)
- battle_athena.conf C³B
- (db/)
- const.txt C³B
- item_db.txt C³B
- (doc/)
- item_bonus.txt C³B
- conf_ref.txt C³B
- (map/)
- map.h C³B
- pc.c
- pc_calcstatus()Apc_bonus()Apc_equipitem() C³B
- battle.h C³B
- battle.c
- battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
- battle_config_read() C³B
- clif.c
- clif_updatestatus()Aclif_parse_LoadEndAck()Aclif_party_hp() C³B
- (common/)
- mmo.h C³B
- (char/)
- char.c
- mmo_char_send006b()Aparse_char() C³B
-
---------------
-//0639 by ŒÓ’±—–
-
-Eladmin‚ÌC³‚È‚Ç
- Eƒvƒƒ“ƒvƒg‚Ì“ü—Í‚ÉTerm::ReadLine‚ðŽg‚¤‚悤‚É‚µ‚½
- @i“ü—Í—š—ð‚âƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ì•ÒW‚ª‰Â”\‚Éj
- EPOSIXŠÖŒW‚̈—‚Ì—áŠOƒGƒ‰[‚ðƒgƒ‰ƒbƒv‚·‚é‚悤‚É‚µ‚Ü‚µ‚½
- @iPOSIX‚ª‘S‚­Žg‚¦‚È‚¢ŠÂ‹«‚Å‚àÅ’áŒÀA“®‚­‚悤‚É‚È‚Á‚½‚©‚à‚µ‚ê‚È‚¢j
- Eו”C³
-
- (tool/)
- ladmin
- Ver.1.04‚ÉB
-
-EMODƒo[ƒWƒ‡ƒ“‚ª‚¨‚©‚µ‚¢–â‘è‚ðC³
- (common/)
- version.h
- ATHENA_MOD_VERSION‚ª‚Wi”‚Å‹Lq‚³‚ê‚Ä‚¢‚é–â‘è‚ðC³
- ”Žš‚Ì“ª‚É0‚ð‚‚¯‚é‚Æ‚Wi”‚É‚È‚é‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢
-
---------------
-//0638 by ”g˜Q
-
-E0635E0637‚ÅV‚µ‚­ƒAƒCƒeƒ€Œø‰Ê‚ªŽÀ‘•‚³‚ꂽ‚Ì‚ÅA‚»‚ê‚É”º‚Á‚Äitem_db.txt‚ðC³
-Eitem_bonus.txt‚ðC³
- (db/)
- item_db.txt C³
- (doc/)
- item_bonus.txt C³
-
---------------
-//0637 by Ž€_
-
-E0635‚̃oƒOC³B
-Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B)
-EŽžŠÔ‚ª’x‚·‚¬‚Ä0635‚Åà–¾‚µ‚Ä‚È‚©‚Á‚½‚Å‚·B(Q•s‘«‚¾‚Á‚½‚Ì‚Å...)
-‚Ü‚¸Žd—l‚ª•Ï‚í‚Á‚½‚Ì‚Í“ñ“—¬‚̃_ƒ[ƒW‚ð•Ší•Ê‚ÉŠ®‘S‚É•ª‚¯‚Äs‚¤‚悤‚É
-•ÏX‚ƃAƒTƒVƒ“‚¶‚á‚È‚­‚ĂඎèC—û‚ðŠo‚¦‚Ä‚¢‚ê‚Γñ“—¬‚ðŽg‚¦‚é‚悤‚É
-•ÏX‚µ‚Ü‚µ‚½B‚»‚ê‚ƃ_ƒ[ƒW‚ÌŒvŽZ‚ð‚¿‚å‚Á‚ÆC³B
-‚»‚µ‚Äbonus‚ɒljÁ‚³‚ꂽ‚Ì‚Í
-bonus bInnerAtk,n; “à•”UŒ‚—Í+n
-ƒJ[ƒh‚̈ø‚«ã‚°ƒ_ƒ[ƒW—p‚Å‚·B•\Ž¦‚Í‚³‚ê‚È‚¢‚¯‚ǃ_ƒ[ƒW‚ÉŒvŽZ‚³‚ê‚Ü‚·B
-bonus bSpeed,n; ˆÚ“®‘¬“x+n
-ˆÚ“®‘¬“x‚ðnã‚°‚Ü‚·B
-bonus bAspd,n; UŒ‚‘¬“x+n
-UŒ‚‘¬“x‚ðnã‚°‚Ü‚·B
-bonus bSpeedRate,n; ˆÚ“®‘¬“x+n%
-ˆÚ“®‘¬“x‚ðn%ã‚°‚Ü‚·B
-bonus bAspdRate,n; UŒ‚‘¬“x+n%
-UŒ‚‘¬“x‚ðn%ã‚°‚Ü‚·B
-bonus bHPrecovRate,n; HPŽ©“®‰ñ•œ—¦+n%
-Ž©“®‰ñ•œ‚·‚éHP‚Ì—Ê‚ðn%ã‚°‚Ü‚·BƒXƒLƒ‹‚É‚æ‚é‰ñ•œ‚ɂ͉e‹¿‚ª‚ ‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚Æ‚ ‚Á‚Ä‚¢‚é‚©‚Í•s–¾‚Å‚·B
-bonus bSPrecovRate,n; SPŽ©“®‰ñ•œ—¦+n%
-Ž©“®‰ñ•œ‚·‚éSP‚Ì—Ê‚ðn%ã‚°‚Ü‚·BƒXƒLƒ‹‚É‚æ‚é‰ñ•œ‚ɂ͉e‹¿‚ª‚ ‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚Æ‚ ‚Á‚Ä‚¢‚é‚©‚Í•s–¾‚Å‚·B
-bonus bCriticalDef,n; ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢Šm—¦+n%
-ƒNƒŠƒeƒBƒJƒ‹‚Ì‘Ï«‚ðnã‚°‚Ü‚·B10000ˆÈã‚É‚·‚é‚ƃNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚¢‚Ü‚¹‚ñB
-bonus bMVPaddAtkRate,n; MVPƒ‚ƒ“ƒXƒ^[‚Én%‚̒ljÁƒ_ƒ[ƒW
-ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚Én%‚̒ljÁƒ_ƒ[ƒW‚ð—^‚¦‚Ü‚·B[•£‚Ì‹RŽmƒJ[ƒh—pB
-bonus bNearAtkDef,n; ‹ß‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚ç‚·
-‘S‚Ä‹ß‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚炵‚Ü‚·B(–‚–@‚ƃgƒ‰ƒbƒvA‘é‚𜂭)
-bonus bLongAtkDef,n; ‰“‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚ç‚·
-‘S‚ĉ“‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚炵‚Ü‚·B(–‚–@‚ƃgƒ‰ƒbƒvA‘é‚𜂭)
-bonus bDoubleRate,n; ƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦+n%(•Ší–³Ž‹)
-•Ší‚ÉŠÖŒW‚È‚­”­“®‚·‚éƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦‚ðn%ã‚°‚Ü‚·B
-ƒ_ƒuƒ‹ƒAƒ^ƒbƒNƒXƒLƒ‹‚Æ•Ê‚Ì”»’è‚ðs‚¤ˆ×ƒ_ƒuƒ‹ƒAƒ^ƒbƒNƒXƒLƒ‹‚ª
-‚ ‚Á‚Ä‚àƒXƒLƒ‹‚É‚æ‚éƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦‚ªã‚ª‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-ƒTƒCƒhƒƒCƒ“ƒ_[ƒJ[ƒh—pB
- (map/)
- pc.c
- pc_bonus()Apc_calcstatus() C³B
- pc_natural_heal_sub() C³B
- battle.h
- struct Battle_Config {} C³B
- battle.c
- battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
- battle_config_read() C³B
- (db/)
- skill_db.txt
- ƒXƒeƒB[ƒ‹‚ÌSP‚ð10‚ÉC³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
-
---------------
-//0636 by Sin
-
-EƒfƒoƒbƒO—pƒ|ƒ^Žq‚³‚ñƒXƒNƒŠƒvƒg(npc_pota.txt)‚̃Aƒ}ƒcEƒRƒ“ƒƒ“‚ւ̑ΉžB
-@‚·‚Å‚ÉŽ©—ÍŽÀ‘•‚³‚ê‚Ä‚¢‚ç‚Á‚µ‚á‚é•ûX‚à‘½‚¢‚©‚ÆŽv‚¢‚Ü‚·‚ªcB
-@ƒRƒ“ƒƒ“ƒ_ƒ“ƒWƒ‡ƒ“‚Ì–¼‘O‚ª‚í‚©‚ç‚È‚¢‚½‚ßu›À›ÄD1v‚È‚Ç‚Æ‚³‚¹‚Ä‚¢‚½‚¾‚¢‚Ä‚¢‚Ü‚·B
- (conf/) npc_pota.txt
-
---------------
-//0635 by Ž€_
-
-Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B)
-Ebonus‚ÉbInnerAtk(ƒJ[ƒh“™‚Å•\Ž¦‚Í‚³‚ê‚È‚¢‚¯‚ÇŽÀÛ‚É‚ÍUŒ‚—Í‚É”½‰f‚³‚ê‚镨—p‚Å‚·B)“™‚ð’ljÁB‘¼‚Ì‚Íitem_bonus.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B(’ljÁ‚Í‚µ‚½‚¯‚Çitem_db.txt‚Í–w‚ñ‚ÇC³‚µ‚Ä‚Ü‚¹‚ñB)
-E‚»‚Ì‘¼ƒoƒOC³‚âŽd—l•ÏX‚à‚â‚è‚Ü‚µ‚½‚ªˆêX‘‚­ŽžŠÔ‚ª‚È‚¢‚Ì‚Å...
- (map/)
- makeile C³B
- pc.c C³B
- map.h C³B
- clif.c C³B
- battle.h C³B
- battle.c C³B
- itemdb.c C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- item_bonus.txt C³B
- (db/)
- const.txt C³B
- item_db.txt C³B
-
---------------
-//0634 by Ž€_
-
-EweddingƒNƒ‰ƒX‚É‚Í“]E‚Å‚«‚È‚¢‚悤‚ÉC³B
-EƒX[ƒp[ƒm[ƒrƒX‚ׂ̈Éexpƒe[ƒuƒ‹‚ðbase 4‚Âjob 4‚‚Ɋg’£B
-exp.txt‚ª•Ï‚í‚èƒX[ƒp[ƒm[ƒrƒX‚¾‚¯‚ÌŒoŒ±’l‚ðÝ’è‚Å‚«‚Ü‚·B(exp.txt‚Ì
-4‚–ڂªƒX[ƒp[ƒm[ƒrƒX‚Ìbase exp‚Å8‚–ڂªjob exp‚Å‚·B¡‚Í2ŽŸE‹Æ‚Ì•¨‚ð
-ƒRƒs[‚µ‚½•¨‚ɉ߂¬‚Ü‚¹‚ñ‚ªB) exp.txt‚ÌÝ’è•û–@‚à’m‚ç‚È‚¢•û‚Í‚¢‚È‚¢‚Æ
-Žv‚¢‚Ü‚·‚Ì‚Åà–¾‚ÍÈ—ª‚µ‚Ü‚·B
-EƒX[ƒp[ƒm[ƒrƒX‚Í“]¶‚̃eƒXƒg‚ׂ̈ɊؑƒTƒNƒ‰ƒC‚¾‚¯ŽÀ‘•‚µ‚Ä‚¢‚镨‚Æ
-Žv‚í‚ê‚Ü‚·‚ª(“]¶‚ªŽÀ‘•‚³‚ê‚ê‚΂Ȃ­‚È‚é‚Æ—\‘ª‚µ‚Ä‚¢‚Ü‚·B)‚»‚ê‚ð
-ŽÀ‘•‚µ‚Ä‚¢‚¢‚Ì‚©‚ÆŽv‚Á‚½‚è‚à‚µ‚Ü‚·‚ª...
-EŒ‹¥ˆßÖ‚ÍŠù‚É0629‚ÅŽÀ‘•‚µ‚Ä‚¢‚é‚Ì‚É‚Ü‚½ƒpƒbƒ`‚Æ‚µ‚Ä
-ƒAƒbƒv‚³‚ê‚é‚Ì‚à‚¿‚å‚Á‚Æ•Ï(H)‚Å‚·‚ËB‚»‚¤‚¢‚¦‚Îà–¾‚µ‚Ä‚È‚©‚Á‚½‚ñ‚Å‚·‚ËB
-E‘•”õê—pƒXƒNƒŠƒvƒg‚Å‚ ‚échangebase‚̒ljÁ‚É‚æ‚Á‚ă^ƒLƒV[ƒh‚Æ
-ƒEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ªŽÀ‘•‚µ‚Ä‚¢‚Ü‚·B‚±‚ê‚ÍE‹Æ‚ð•ÏX‚¹‚¸‚ÉŒ©‚½–Ú‚¾‚¯
-•Ï‚¦‚镨‚Å‚·BweddingƒNƒ‰ƒXˆÈŠO‚Ì“K—p‚à‰Â”\‚Å•Ï‘•ƒZƒbƒg‚Æ‚©‚àì‚ê‚é
-‚킯‚Å‚·‚ª“à•”ˆ—‚Í•ÏX‚¹‚¸‚ÉŒ©‚½–Ú‚¾‚¯•Ï‚¦‚Ä‚¢‚é‚Ì‚Å0631‚Åà–¾‚µ‚½‚悤‚É
-‘•”õ‚Å‚«‚È‚¢•¨‚ð‘•”õ‚µ‚Ä‚¢‚éꇈƗŽ‚¿‚ª‹N‚±‚é‰Â”\«‚ª‚ ‚è‚Ü‚·‚Ì‚Å
-‘¼‚ÌE‹Æ‚ÅŽg‚¤‚Ì‚Í‚¨Š©‚ß‚µ‚Ü‚¹‚ñB‰¼ŽÀ‘•‚È‚Ì‚Í¡‚ÌŽd—l‚̓^ƒLƒV[ƒh‚Æ
-ƒEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ð‘•”õ‚·‚邾‚¯‚ÅŒ©‚½–Ú‚ª•Ï‚í‚é‚©‚ç‚Å‚·BŠØ‘ƒTƒNƒ‰ƒC‚Ì
-•û‚ł͉½‚©‚ÌðŒ‚ª•K—v‚¾‚ÆŽv‚Á‚Ä‚¢‚é‚Ì‚Å‚»‚ÌðŒ‚ª‚Ü‚¾ŽÀ‘•‚³‚ê‚¢‚È‚¢‚©‚ç
-‰¼ŽÀ‘•‚Å‚·B‚»‚ê‚ÉweddingƒNƒ‰ƒX‚ðE‹Æ‚É‚µ‚Ä‚µ‚Ü‚¤‚ÆŒ‹¥‚·‚é‚ƃXƒLƒ‹“™‚ª
-ƒŠƒZƒbƒg‚³‚ê‚é‚©•Ï‚É‚È‚é‚©‚Ì‚Ç‚¿‚ç‚È‚Ì‚Å•Ï‚¾‚ÆŽv‚Á‚Ä‚È‚©‚Á‚½‚Ì‚Å‚µ‚傤‚©H
- help.txt C³B
- (db/)
- job_db1.txt C³B
- exp.txt C³B
- (map/)
- pc.c
- pc_jobchange()Apc_readdb() C³B
- pc_nextbaseexp()Apc_nextjobexp() C³B
-
---------------
-//0633 by ”g˜Q
-
-E‘•”õ‚ÌÝ’èC³BŒ‹¥ˆßÖ‚ÌE‚ÍAŽÀÛ‚É“]E‚·‚é‚Ì‚Å‚Í‚È‚­ƒyƒRƒiƒCƒg(13)AƒyƒRƒNƒ‹ƒZ(21)‚̂悤‚ɉ摜‚ðŽg‚¤‚¾‚¯‚¾‚ÆŽv‚¤‚Ì‚Å
-@‰½‚à‘•”õ‚Å‚«‚È‚¢Ý’è‚É‚µ‚Ü‚µ‚½BƒXƒpƒmƒr‚̓mƒr‚ª‘•”õ‚Å‚«‚é‚à‚Ì‚¾‚¯Ý’肵‚Ü‚µ‚½B
-EŒÃ–Ø‚ÌŽ}‚ÌoŒ»ƒ‚ƒ“ƒXƒ^[‚ð’ljÁ
-EƒAƒ}ƒc‚̃‚ƒ“ƒX‚Ì•¦‚«‹ï‡‚ð–{ŽI‚É‹ß‚­‚È‚é‚悤‚ÉC³(‚Ü‚¾‚Ü‚¾ˆá‚¢‚Ü‚·‚ªEEE)
- (conf/)
- npc_monster.txt ƒ‚ƒ“ƒX–¼C³
- npc_monster_amatsu.txt C³
- (db/)
- item_avail.txt ˆÆ—Ž‚¿ƒAƒCƒeƒ€’ljÁ
- item_db.txt ‘•”õÝ’è‚ðC³A‘¼‘½”
- mob_branch.txt C³
- mob_db.txt ƒ‚ƒ“ƒX–¼C³
- skill_tree.txt C³
-
---------------
-//0632 by nini
-
-E@jobchange‚ÅŒ‹¥ˆßւƃX[ƒp[ƒm[ƒrƒX‚É‚È‚ê‚é‚悤‚ÉB(’ˆÓFŠØ‘÷ˆäƒNƒ‰ƒCƒAƒ“ƒg‚Ì‚Ý)
-ESƒmƒr‚̃XƒeAƒXƒLƒ‹‚È‚Ç‚àŽb’è’ljÁB(ƒm[ƒrƒX‚̃Rƒs[‚Å‚·‚ª)
-@‚Æ‚è‚ ‚¦‚¸Œ©‚½–Ú‚¾‚¯‚Æ‚¢‚¤‚±‚Æ‚ÅAŒ‹¥ˆßÖ‚Å‚àUŒ‚‚Å‚«‚Ü‚·‚ª(‚½‚¾‚µƒm[ƒ‚[ƒVƒ‡ƒ“)A–{—ˆ‚Í‚Å‚«‚Ü‚¹‚ñB
-Eã‚É‚ ‚킹‚Äitem_db•ÒWB
-@Œ‹¥ˆßÖ‚Å•Ší‚à‚‚ÆactAsprƒGƒ‰[o‚·‚Ì‚ÅAŒ‹¥ˆßÖ‚Å‚Í•Ší‚ðŽ‚Ä‚È‚¢‚悤‚É‚µ‚½(‚Í‚¸)B
- (db/)
- job_db1.txt
- job_db2.txt
- item_db.txt
- Œ‹¥ˆßÖASƒmƒr‚̃f[ƒ^
- skill_tree.txt
- Sƒmƒr‚̃XƒLƒ‹
- (map/)
- map.h
- MAX_PC_CLASS‚ɒljÁ
-
---------------
-//0631 by Ž€_
-
-Eׂ©‚¢C³B
-Eƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚Ì•\Ž¦‚ðbattle_athena.conf‚ÅÝ’è‚Å‚«‚é
-‚悤‚É•ÏXB
-E•ŠíƒOƒ‰ƒpƒbƒ`‚ɂ‚¢‚Ä‚Å‚·‚ªƒpƒbƒ`‘O‚ÍŽg‚¦‚È‚¢E‹Æ‚ª‘•”õ‚ð‚µ‚Ä‚à•\Ž¦‚Í
-‚³‚ê‚È‚¢‚¾‚¯‚ňƗŽ‚¿‚Ü‚Å‚Í‹N‚±‚ç‚È‚©‚Á‚½‚¯‚Ç•ŠíƒOƒ‰ƒpƒbƒ`‚ÌŒã‚Í‚»‚Ì•Ší‚ð
-‘•”õ‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢E‹Æ(–{ŽI‚Å)‚ª‘•”õ‚µ‚Ä‚µ‚Ü‚Á‚½ê‡ˆÆ—Ž‚¿‚ª‹N‚±‚é
-‚±‚Æ‚ª‚ ‚è‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- (db/)
- item_db.txt
- 1161A2338A7170 C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- battle.h
- struct Battle_Config‚Éwedding_modifydisplay ’ljÁB
- battle.c
- battle_config_read() C³B
- pc.h
- pc_cart_delitem() C³B
- pc.c
- pc_jobchange()Apc_additem()Apc_delitem()Apc_cart_delitem() C³B
- pc_checkitem()Apc_getitemfromcart() C³B
- clif.c
- clif_changelook()Aclif_send()Aclif_parse_GlobalMessage() C³B
- script.c
- buildin_changebase() C³B
- storage.c
- storage_storageaddfromcart() C³B
- vending.c
- vending_purchasereq() C³B
-
---------------
-//0630 by ˆø‘Þl
-
-EƒMƒ‹ƒh’E‘ÞŽž‚ÉcharƒT[ƒo‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚é‚Ì‚ðC³
-Ewater_height.txt‚ðXV
-E0627‚ÉŠÖ˜A‚µ‚ÄmodifydisplayŠÖ˜A‚ðíœ
- (char/)
- int_guild.c
- mapif_guild_leaved()‚̃oƒbƒtƒ@—e—Ê‚ª‘«‚è‚È‚©‚Á‚½‚Ì‚ÅA
- unsigned char buf[64]; -> unsigned char buf[128];
- ‚ÆC³B
- (conf/)
- battle_athena.conf
- equip_modifydisplay‚ðíœ
- water_height.txt
- prt_fild04.gat‚Æmoc_fild01.gat‚Ì•ª‚ð’ljÁ
- (doc/)
- conf_ref.txt
- equip_modifydisplay‚Ìà–¾‚ðíœ
- (map/)
- battle.h
- struct Battle_Config ‚©‚çequip_modifydisplay‚ðíœ
-
---------------
-//0629 by Ž€_
-
-E0627‚̃oƒOˆê•”C³‚ÆV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ɑΉžB(Ž©•ª‚̊ԈႢ‚Å‚µ‚½B
-ƒ‚ƒ“ƒXƒ^[‚âNPC‚àV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ðŽg‚¤‚ÆŽv‚Á‚Ä‚¢‚½‚Ì‚Å‚·‚ª
-V‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚̓vƒŒƒCƒ„[‚݂̂̂悤‚Å‚·B)
-Eƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‰¼ŽÀ‘•B(ŠØ‘‚̃TƒNƒ‰ƒCˆÆ‚¶‚á‚È‚¢‚Æ
-ˆÆ—Ž‚¿‚³‚ê‚Ü‚·BŽg—p‚·‚鎞‚Íitem_db.txt‚̃Rƒ}ƒ“ƒgƒAƒEƒg‚³‚ê‚Ä‚¢‚é
-2338‚Æ7170‚ð‰ðœ‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B)
-ESP‰ñ•œƒAƒCƒeƒ€‚àint‚É‚æ‚Á‚ÄŒø‰Ê‚ª‘‚¦‚é‚悤‚É•ÏXB
-E0627‚Å‘‚«–Y‚ê‚Å‚·‚ªƒJ[ƒg‚̃AƒCƒeƒ€ŒvŽZ‚Æitemdb_‚ðŒÄ‚Ô‚Ì‚ðŬ‰»‚·‚é
-ˆ—‚ð“ü‚Á‚Ă邹‚¢‚Åpc_additem()Apc_delitem()Apc_cart_additem()Apc_cart_delitem()ˆÈŠO‚Ì•û–@‚ŃJ[ƒgƒAƒCƒeƒ€‚âƒAƒCƒeƒ€‚É•Ï“®‚ª‚ ‚éê‡
-³í‚É“®ì‚·‚é•ÛØ‚ª‚È‚¢‚Ì‚ÅC³‚Ì‚³‚¢‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- readme0754‚ðreadme0574‚ÉC³B
- makefile C³B
- (map/)
- map.h C³B
- clif.c C³B
- pc.c C³B
- battle.c C³B
- mob.c C³B
- script.c C³B
- (db/)
- item_db.txt C³B
- class_equip_db.txt C³B
- skill_db.txt C³B(ŒëŽš‚ðŽ¡‚µ‚½‚¾‚¯‚Å‚·B)
- (conf/)
- npc_event_doll.txt C³B(—¬˜Ql‚³‚ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
-
---------------
-//0628 by NOCTURNE
-
-Esnapshot
-Esnapshot‚©‚çsnapshot‚Ü‚Å‚ÌReadme•ªŠ„
-E—v–]‚ª‘½‚©‚Á‚½‚Ì‚Åsnapì¬iƒvƒƒOƒ‰ƒ€“I‚È•ÏX“_‚Í–³‚µ
-
---------------
-//0627 by Ž€_
-
-EƒR[ƒh‚ÌÅ“K‰»‚Æ­‚µC³B(­‚µ‚ÍŒy‚­‚È‚é‚ÆŽv‚¢‚Ü‚·B)
-E @modifydisplayƒRƒ}ƒ“ƒhíœB
-EV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ɑΉž‚¾‚ÆŽv‚Á‚½‚ç0x1d8A0x1d9A0x1daƒpƒPƒbƒg‚̈ꕔ‚ª
-0x78A0x79A0x7b‚Æ•Ï‚í‚Á‚Ä‚é‚Ý‚½‚¢‚Å‚·B‚‚܂衂̂܂܂ł͑Ήž‚Å‚«‚Ü‚¹‚ñB
-X,Y‚ÌÀ•W‚Ì•”•ª‚Ì‘Ž®‚ª•Ï‚í‚Á‚½‚Ì‚©‚Æ—\‘ª‚Í‚µ‚Ä‚¢‚Ü‚·‚ª...
-î•ñ‚ð‹‚Ý‚Ü‚·B(makefile‚ÌDPACKETVER‚ð4‚É‚·‚ê‚Î0x1d8A0x1d9A0x1da‚ð
-Žg‚¢‚Ü‚·‚ªÀ•W‚ª‚¸‚ꂽ‚炵‚­‰½‚à•WŽ¦‚³‚ê‚Ü‚¹‚ñB)
-E100000‚©‚炾‚Á‚½char_id‚ð150000‚©‚ç‚É•ÏXB(ƒyƒbƒg‚Ì—‘‚Ì–â‘è‚Å•Ší‚Ì–¼‘O‚ª‚¿‚å‚Á‚Æ•Ï‚É‚È‚Á‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B)
-Eƒyƒbƒg‚̃R[ƒh­‚µC³B(pet_id‚ðcard[2]‚Æcard[3]‚©‚çcard[1]‚Æcard[2]‚É•ÏX‚µ‚Ü‚µ‚½B‚æ‚Á‚Ä‘O‚Éì‚Á‚½—‘‚ÍŽg‚¦‚Ü‚¹‚ñBˆÆ‚Åcard[3]‚Ì‹@”\‚ª•Ï‚í‚Á‚½‚Ì‚Å
-Žd•û‚È‚­C³‚µ‚Ü‚µ‚½B¡“x‚Íconvertƒc[ƒ‹‚ª‚ ‚è‚Ü‚¹‚ñBì‚鎞ŠÔ‚ª‚È‚©‚Á‚½‚Ì‚Å...)
-EÅ“K‰»‚ׂ̈ÉC³‚µ‚½Š‚ª‘½‚¢‚Å‚·‚ª‘S‚ij퓮삷‚é•ÛØ‚Í‚ ‚è‚Ü‚¹‚ñB
-ŽI—Ž‚¿ƒoƒO‚ª”­¶‚µ‚½‚ç•ñ‚¨Šè‚¢‚µ‚Ü‚·B(batte.c‚Í‚Ü‚¾Å“K‰»‚µ‚Ä‚Ü‚¹‚ñB)
-ƒJ[ƒg‚̃AƒCƒeƒ€ŒvŽZ‚âƒAƒCƒeƒ€‚Ìd—Ê‚ÌŒvŽZ‚ðʼn‚É‚¾‚¯‚·‚é‚悤‚É‚µ‚Ä‚¢‚é‚Ì‚Å•\Ž¦‚É­‚µ–â‘肪‚ ‚é‚©‚à...
-EC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯‘‚¢‚Ä‚¨‚«‚Ü‚·B
- makefile
- help.txt
- (common/)
- mmo.h
- (map/)
- map.h
- atcommnad.h
- atcommnad.c
- pc.h
- pc.c
- clif.c
- script.c
- trade.c
- itemdb.h
- itemdb.c
- battle.h
- battle.c
- pet.c
- map.c
- mob.c
- (char/)
- char.c
- (conf/)
- battle_athena-conf
- atcommand_athena.conf
-
---------------
-//0626 by ˆø‘Þl
-
-EƒpƒPƒbƒg’·ƒe[ƒuƒ‹iVˆÚ“®ƒpƒPƒbƒg‚È‚ÇjC³
- (doc/)
- client_packet.txt ƒpƒPƒbƒg‰ð̓XƒŒ M‚³‚ñ‚Ìî•ñ‚𔽉f
- conf_ref.txt 0624‚ɇ‚킹‚ÄC³
- (map/)
- clif.c
- packet_len_table[] client_packet.txt‚ɇ‚킹‚ÄC³
-
---------------
-//0625 by ˆø‘Þl
-
-E@hide“§–¾‰»‚ðBOSS‚È‚Ç‚ÉŒ©”j‚ç‚ê‚È‚¢‚悤‚ÉC³
- (map/)
- pc.h
- #define pc_iscarton(sd) C³
- #define pc_isinvisible(sd) ’ljÁ
- mob.c
- mob_attack()
- mob_target()
- mob_ai_sub_hard_activesearch()
- mob_ai_sub_hard_mastersearch()
- mob_ai_sub_hard()
- “§–¾ipc_isinvisible(sd)!=0j‚ÅŽ€l‚Æ“¯—l‚É”»’肳‚ê‚é‚悤‚ÉC³
- (conf/)
- npc_cTower.txt C³ithx to holyzard‚³‚ñj
-
---------------
-//0624 by ‚é‚é‚é
-
-E•Ší‰æ‘œ•\Ž¦ˆ—‚̈êViVˆÚ“®ƒpƒPƒbƒgŽg—pj
-Eã‚ÆŠÖ˜A‚µ‚ÄA@modifydisplayƒRƒ}ƒ“ƒh‚ðÝ‚¯‚½
-@@@@‹@”\‚Æ‚µ‚Ä‚ÍAŒ»Ý‚̃AƒTƒVƒ“•Ší‚È‚Ç‚Ì‚ª‚¨‚©‚µ‚¢ê‡‚ÉA‚Ü‚½‚Í‹C‚É“ü‚ç‚È‚¢‚Æ‚©‚ÅA
-@@@@ƒLƒƒƒ‰–ˆ‚É‹ŒƒpƒP‚ðŽg—p‚·‚é‚悤‚É‚µ‚Ä‚¢‚éB
-
- (map/)
- atcommand.c
- atcommand() @modifydisplayƒRƒ}ƒ“ƒh‚ð’ljÁ
- atcommand.h
- struct Atcommand_Config {
-'7d •ÏX
- clif.c
- clif_set0078_and01d8() , clif_set007b_and01da() ŠÖ”–¼•ˆ—‚Ì•ÏX
- clif_spawnpc() , clif_movechar() , clif_changelook() , clif_getareachar_pc() ,
- clif_fixpcpos() , clif_parse_LoadEndAck() •ÏX
- map.h
- struct map_session_data Eb} •ÏX
- pc.c
- pc_setnewpc() , pc_calcstatus() , pc_equiplookall() , pc_changelook() •ÏX
-
- (conf/)
- atcommand_athena.conf
- equip_modifydisplay ’ljÁ
-
- •ÏX‰ÓŠ‚Í‘S‚ăL[ƒ[ƒhumodifydisplayv‚ŃT[ƒ`‚·‚ê‚΂قڂ킩‚é‚©‚ÆB
-
-ƒRƒƒ“ƒgF‚à‚¤‚±‚ê‚Å–â‘è‚Í–³‚¢‚Í‚¸BŽÀ‚Í‘å‚¢‚Ȃ銨ˆá‚¢‚ð‚µ‚Ä‚½ŒÂŠ‚ª‚ ‚Á‚½‚Ì‚Í“àiƒ}ƒew
-
---------------
-//0623 by ˆø‘Þl
-
-E@hide‚Å“§–¾‰»iŒ©‚ç‚ê‚È‚¢•MOB‚Ƀ^ƒQ‚ç‚ê‚È‚¢j‚·‚é‚悤‚ÉC³‚È‚Ç
- (map/)
- atcommand.c
- @hide‚ÌoptionÝ’è‚ð0x04‚©‚ç0x40‚É•ÏX
- mob.c
- mob_attack()
- mob_target()
- mob_ai_sub_hard_activesearch()
- mob_ai_sub_hard_mastersearch()
- mob_ai_sub_hard()
- option”»’è‚ð0x06‚©‚ç0x46‚ÉC³
- (conf/)
- npc_event_potion.txt MORISON_MEATC³ithx to holyzard‚³‚ñj
-
---------------
-//0622 by ˆø‘Þl
-
-Emob‚ªƒXƒLƒ‹Žg—p‚ÉŽ¸”s‚µ‚½ê‡A’ÊíUŒ‚‚·‚é‚悤‚É
- (map/)
- mob.c
- mobskill_use_id() ƒXƒLƒ‹Žg—pŽ¸”s‚Å0A¬Œ÷‚Å1‚ð•Ô‚·‚悤‚ÉC³
- mobskill_use_pos() ƒXƒLƒ‹Žg—pŽ¸”s‚Å0A¬Œ÷‚Å1‚ð•Ô‚·‚悤‚ÉC³
- mobskill_use() ã‹L‚𔽉f‚µ‚ÄŽ¸”sŽž‚É‚Í0‚ð•Ô‚·‚悤‚ÉC³
-
---------------
-//0621 by ŒÓ’±—–
-
-EƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚ðs‚¤‚©‚Ç‚¤‚©conf/battle_athena.cnf‚É‘‚¯‚é‚悤‚É
-EƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚Å•s³‚Æ”»’f‚·‚é‚©‚Ç‚¤‚©‚ðdb/item_avail.txt‚É‘‚¯‚é‚悤‚É
-E@itemcheck‚Å–¾Ž¦“I‚ɃAƒCƒeƒ€ƒ`ƒFƒbƒN‚Å‚«‚é‚悤‚É
-
- ƒfƒoƒO‚âƒeƒXƒg‚È‚Ç‚ÅFX‚ȃAƒCƒeƒ€ID‚ðŽg—p‚µ‚½‚¢ê‡‚Í
- ƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚𖳌ø‚É‚µ‚ĉº‚³‚¢B(item_check: off)
- –³Œø‚É‚µ‚½ê‡‚Å‚à@itemcheckƒRƒ}ƒ“ƒh‚Ń`ƒFƒbƒN‚·‚邱‚Æ‚ªo—ˆ‚Ü‚·B
- cnfƒtƒ@ƒCƒ‹‚Í—pˆÓ‚µ‚Ä‚È‚¢‚Ì‚Å•K—v‚È‚çŠeŽ©“K“–‚É‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
-
- (db/)
- item_avail.txt
- V‹K’ljÁB•s³ƒAƒCƒeƒ€‚Ì—ñ‹“‚ÉŽg—pB–¢Š®¬B‘¼—Í–{ŠèB
- item_db.txt‚É’è‹`‚³‚ê‚Ă邪ŽÀÛ‚É‚ÍŽg—p‚Å‚«‚È‚¢ƒAƒCƒeƒ€‚ð‘‚­B
- (doc/)
- conf_ref.txt
- battle_athena.cnf‚Æatcommand_athena.cnf‚Ìà–¾C³
- (map/)
- itemdb.c/itemdb.h
- itemdb_availableƒ}ƒNƒ’ljÁ
- itemdb_read_itemavail()’ljÁ
- itemdb_readdb()‚Åavailable=1‚É‚·‚é‚悤‚É
- itemdb_search()‚Å‘¶Ý‚µ‚È‚¢ID‚Íavailable=0‚Ńf[ƒ^‚ðì‚é‚悤‚É
- do_init_itemdb()‚Åitemdb_read_itemavail()‚ðŒÄ‚Ԃ悤‚É
- pc.c/pc.h
- pc_checkitem()‚ðƒGƒNƒXƒ|[ƒg
- pc_checkitem()‚Åavailable‚Æbattleconfig‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É
- atcommand.c/atcommand.h
- @item‚Åbattleconfig‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É
- @itemcheckƒRƒ}ƒ“ƒh’ljÁ
- atcommandconfig‚Éitemcheckƒƒ“ƒo’ljÁ
- battle.c/battle.h
- battle_config‚Éitem_checkƒƒ“ƒo’ljÁ
-
-Eladmin‚ÌC³‚È‚Ç
- ƒAƒJƒEƒ“ƒg’ljÁAƒpƒXƒ[ƒh•ÏX‚ÌۂɃpƒXƒ[ƒh‚ðÈ—ª‚·‚é‚ÆA
- ƒpƒXƒ[ƒh—p‚̃GƒR[‚µ‚È‚¢ê—pƒvƒƒ“ƒvƒg‚Å“ü—Í‚Å‚«‚Ü‚·i•“ü—ÍŠm”FjB
- ’ljÁ‚ÌۂɃpƒXƒ[ƒh‚ª•\Ž¦‚³‚ꂽ‚碂éꇂȂǂÉB
- ƒpƒXƒ[ƒh“ü—Í’†‚ÍCtrl+C‚ªŒø‚©‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-
- ƒpƒXƒ[ƒh‚Ì•s³•¶Žš‚Ì•\Ž¦‚ªA‰½•¶Žš–Ú‚©‚Å•\Ž¦‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- ‚»‚Ì‘¼”÷–­‚Ƀ`ƒFƒbƒN’ljÁ‚È‚ÇB
-
- Cygwin‚Å‚µ‚©“®ìŠm”F‚µ‚Ä‚¢‚Ü‚¹‚ñBPOSIXƒ‚ƒWƒ…[ƒ‹‚ðŽg‚Á‚Ä‚¢‚é‚Ì‚ÅA
- POSIX‚Å‚È‚¢(•ƒGƒ~ƒ…ƒŒ[ƒVƒ‡ƒ“‚à‚Å‚«‚È‚¢)ƒvƒ‰ƒbƒgƒtƒH[ƒ€‚¾‚Æ
- “®‚©‚È‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- UNIXŒn‚Å‚Ínkf‚ȂǂʼnüsƒR[ƒh‚ð•ÏŠ·‚µ‚È‚¢‚Æ‚¾‚ß‚©‚àH
-
- (tool/)
- ladmin
- Ver.1.03‚ÉB
-
--------------
-//0620 by ŒŽ‰r‚Ý
-
-Eƒz[ƒŠ[ƒNƒƒXŽÀ‘•
-
- (db)
- skill_db.txt C³
- (map)
- skill.c
- skill_additional_effect()C³(ƒRƒƒ“ƒg‚Ì‚Ý)
- battle.c
- Damage battle_calc_weapon_attack()C³
-
--------------
-//0619 by ‚é‚é‚é
-
-Eƒpƒbƒ`0617‚Ì‚Å‚â‚è–Y‚ê‚Æ”÷–­‚ÈC³
-
- clif.c
- clif_movechar(),clif_parse_LoadEndAck() C³
-
---------------
-//0618 by nini
-
-EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚̉r¥AƒfƒBƒŒƒC’ljÁB‰ñ•œ—ÊC³B
-EÁ”ïSPC³
-EƒAƒ[ƒVƒƒƒ[‚͈̔͂ð5*5‚É‚µ‚Ä2ƒZƒ‹‚«”ò‚΂µB
-Eƒ`ƒƒ[ƒWƒAƒ[‚ÌŽg—p•ŠíðŒ–³‚µB
-EƒXƒsƒAƒXƒ^ƒu‚Ì”ò‹——£‚ð6ƒZƒ‹‚ÉB
- (/db)
- cast_db.txt C³
- skill_db.txt C³
- (/map)
- battle.c
- battle_calc_weapon_attack() C³
- skill.c
- skill_castend_damage_id() C³
- skill_check_condition() C³
- skill_castend_nodamage_id() C³
-
---------------
-//0617 by ‚é‚é‚é
-
-E•Ší‰æ‘œ•\Ž¦‚Å‘¼ƒLƒƒƒ‰‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðu‚Æ‚è‚ ‚¦‚¸vC³
-EŒC•\Ž¦‚̃pƒPƒbƒg‚ð‘—M’âŽ~iŒ»Žž“_‚ł̓€ƒ_BƒRƒƒ“ƒg‚µ‚½‚¾‚¯‚Å‚·‚ªj
- clif.c
- clif_spawnpc(),clif_getareachar_pc(),clif_fixpcpos(),clif_changelook()C³
- pc.c
- clif_changelook()‚ª‚ ‚é•”•ª‚ðC³i•Ší[„‚‚Ƈ‚É‚È‚é‚悤‚Ɉ—‚Ì“ü‚ê‘Ö‚¦j
-
-ƒRƒƒ“ƒgB
-Vƒ}ƒbƒvˆÚ“®ƒpƒP(0x1d8`0x1daj‚ðFX‚Æ‚â‚Á‚½‚ªA‚»‚̃pƒP‚P‚‚ŕŠí•\Ž¦‚ªVŽ®‚̂ɑΉž‚µ‚Ä‚é
-‚Æ‚¢‚¤‚킯‚Å‚Í‚È‚¢‚Á‚Û‚¢B‹ŒˆÚ“®ƒpƒP‚¾‚ÆŽ©•ªˆÈŠO‚̃Lƒƒƒ‰‚ªˆÚ“®‚·‚é‚Æ‹ŒŽ®•\Ž¦‚É‚È‚Á‚Ä‚µ‚È‚¤B
-X‚ÉAV•Ší•\Ž¦ƒpƒP‚Í•Ší‚Æ‚‚Ì“¯Žžˆ—‚ªo—ˆ‚Ä‚È‚¢B‚¨‚»‚ç‚­ƒNƒ‰ƒCƒAƒ“ƒg‚Ì–â‘肾‚ÆŽv‚¤B
-‚Æ‚è‚ ‚¦‚¸AƒLƒƒƒ‰‚ª“®‚­‚½‚Ñ‚ÉV•ŠíƒpƒP„‹Œ‚ƒpƒP‚Ì‚Q‚‚̑•”õƒpƒP‚𑗂邱‚Æ‚Å‰ðŒˆ‚³‚¹‚Ä‚¢‚éB
-–{ŽI‚Å‚Í‚Ç‚¤‚È‚Ì‚©‚ÌŽÀÛ‚Ì‚Æ‚±‚ë‚̃f[ƒ^‚ª–³‚¢‚½‚ßA‚±‚êˆÈã‚Ì‚±‚Ƃ̓€ƒŠB
-
---------------
-//0616 by ŒÓ’±—–
-
-Ewater_height.txt‚ð“Ç‚ñ‚Å‚¢‚È‚¢‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
- map.c
- map_waterheight()C³
-
-EPC‚̃}ƒbƒvˆÚ“®Žž‚̃AƒCƒeƒ€ƒ`ƒFƒbƒN‚ŃAƒCƒeƒ€ID‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³
-Eˆê•”‚Ì—ƒRƒ}ƒ“ƒh‚ŃAƒCƒeƒ€ID‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³
- pc.c
- pc_checkitem()C³
- pc_authok()C³ pc_checkitem()’ljÁ
- clif.c
- clif_parse_LoadEndAck()C³
- itemdb.c
- itemdb_exists()’ljÁiitemdb_search‚Æ“¯‚¶‚¾‚ªAdb‚É‘¶Ý‚µ‚È‚¢
- ꇂÍV‚µ‚¢ƒf[ƒ^‚ðì‚炸‚ÉNULL‚ð•Ô‚·j
- itemdb_read_classequipdb()C³ itemdb_search=>itemdb_exists
- itemdb_read_itemnametable()C³ itemdb_search=>itemdb_exists
- itemdb_read_itemvaluedb()C³ itemdb_search=>itemdb_exists
- atcommand.c
- @itemC³ itemdb_search=>itemdb_exists
- @produceC³ itemdb_exists‚Ń`ƒFƒbƒN‚·‚é‚悤‚É
-
---------------
-//0615 by ”g˜Q
-
-EƒAƒCƒeƒ€DATA‘å•C³
-@Žå‚ÈC³‰ÓŠ‚ÍA‰ñ•œƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ÌC³AÁ”ïƒAƒCƒeƒ€‚ðclass_equip_db.txt–³‚µ‚Å‚àŽg—p‚Å‚«‚é—l‚ÉC³A
-@‘•”õ•i‚Ì‘•”õ‰Â”\E‚ð‘S‚ÄC³AƒJ[ƒhŒø‰Ê‚ðC³AetcEEE‚Å‚·B
-
---------------
-//0614 by Nikita
-
-EƒAƒCƒeƒ€DATA‚ÌC³iŽå‚ɉñ•œ—Êj
-EƒXƒLƒ‹‰ð“Å‚ÌŽË’öC³
-E0612‚Ìׂ©‚¢C³
- (conf/)
- npc_town_prontera.txt C³
- (db/)
- item_db.txt C³
- skill_db.txt C³
-
---------------
-//0613 by ˆø‘Þl
-EcheckweightC³
- (conf/)
- npc_event_making.txt checkweight•”•ª‚ðC³
- npc_event_potion.txt ƒ|[ƒVƒ‡ƒ“AƒWƒ…[ƒXNPC‚ÌcheckweightC³
-
---------------
-//0612 by nini
-
-EƒAƒCƒeƒ€DATAC³
- (db/)
- item_db.txt C³
- (conf/)
- npc_town_***.txt C³
- R.O.M776‚³‚ñ‚ðŽQÆ‚µ‚Ü‚µ‚½B
-
---------------
-//0611 by Ž€_
-
-EƒAƒCƒeƒ€Žg—pðŒ‚ª‚ ‚í‚È‚¢Žž0xa8ƒpƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏXB(ƒoƒO•ñƒXƒŒƒbƒh 243‚Ìno name‚³‚ñî•ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
-EQM‚ÅW’†—ÍŒüã‚Æ‘¬“xã¸AƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Aƒ‰ƒEƒhƒ{ƒCƒXAƒXƒsƒAƒNƒCƒbƒPƒ“Aƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“‚ð‰ðœ‚·‚é‚悤‚ÉC³B
-E‘¬“x㸂Ƒ¬“xŒ¸­‚Å‹t‚̃XƒLƒ‹‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
-E0609‚Å‘‚«–Y‚êBƒ‚ƒ“ƒXƒ^[‚ªQM‚͈̔͂©‚甲‚¯‚Ä‚àŒø‰Ê‚ªˆÛŽ‚·‚é‚悤‚É
-•ÏX‚ƃuƒŒƒbƒVƒ“ƒO‚ÅŽô‚¢‚ÆΉ»‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
- clif.c
- clif_useitemack() C³B
- skill.c
- skill_status_change_start() C³B
- pc.c
- pc_insert_card() C³B(‚±‚ê‚̓J[ƒhƒoƒO‚Æ‚ÍŠÖŒW‚È‚¢C³‚Å‚·B‚»‚̃oƒO‚ÌC³‚ÍŽ©•ª‚ª05xx“–‚½‚è‚ÅC³‚µ‚Ü‚µ‚½‚Ì‚ÅB)
-
---------------
-//0610 by ”g˜Q
-
-EƒAƒCƒeƒ€DATAC³
- (db/)
- item_db.txt C³
-
---------------
-//0609 by Ž€_
-
-EFX‚ÆC³B
-Eƒ‚ƒ“ƒXƒ^[‚ªŽ~‚Ü‚é‚悤‚É“®‚­–â‘èC³B
-EŽw’e‚̃fƒBƒŒƒCC³B
-E–î쬂̃R[ƒh•Ð•t‚¯B
-E“G‚ªƒXƒLƒ‹”͈͂©‚瓦‚°‚½ê‡ƒXƒLƒ‹‚ªŽ¸”s‚·‚é‚悤‚É•ÏXB
-Eclass_equip_db.txt‚ÌŽd—l•ÏXB
- «•Ê‚Æ‘•”õƒŒƒxƒ‹‚àÝ’è‰Â”\‚É•ÏX‚ÆŽg—pƒAƒCƒeƒ€‚ÌŽg—pE‹ÆA«•Ê‚ÆŽg—p
- ƒŒƒxƒ‹‚Ìݒ肪‚Å‚«‚é‚悤‚É•ÏXB(‚½‚¾ƒf[ƒ^‚ª‘½‚¢‚¹‚¢‚ÅC³‚µ‚½
- class_equip_db.txt‚̓Tƒ“ƒvƒ‹’ö“x‚Ì•¨‚Å‚·B–„‚ß‚Ä‚­‚¾‚³‚¢B‘¼—Í–{Šè‚Å‚·‚ª...)
- ‚»‚ê‚ƃAƒCƒeƒ€Žg—pðŒ‚ª‚ ‚í‚È‚¢‚ƃAƒCƒeƒ€‚ªŽg‚í‚È‚¢‚悤‚É‚µ‚Ä‚Í
- ‚¢‚Ü‚·‚ª01c8ƒpƒPƒbƒg‚Ì<type>‚ð0‚É‚µ‚Ä‚àƒAƒCƒeƒ€‚ðŽg—p‚µ‚½Žž‚Æ“¯‚¶
- ƒGƒtƒFƒNƒg‚ªo‚Ü‚·B–{ŽI‚̃AƒCƒeƒ€Žg—pƒpƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚Ü‚Ü‚¶‚á
- ‚±‚¤‚·‚邵‚©‚È‚©‚Á‚½‚Ì‚Å‚·‚ª...
-Ebattle_athena.conf‚É€–ڒljÁB
-E‚»‚Ì‘¼ƒXƒLƒ‹­‚µC³‚Æׂ©‚¢C³B
-EC³‚µ‚½Š‚ð‘S‚ÄŠo‚¦‚Ä‚Ü‚¹‚ñ‚̂Ńtƒ@ƒCƒ‹‚¾‚¯B
- (map/)
- clif.c C³B
- mob.c C³B
- mob.h C³B
- pc.c C³B
- map.h C³B
- skill.c C³B
- skill.h C³B
- itemdb.c C³B
- battle.c C³B
- battle.h C³B
- (conf/)
- battle_athena.conf C³B
- (db/)
- cast_db.txt C³B
- skill_db.txt C³B
- create_arrow_db.txt C³B
- class_equip_db.txt C³B
- item_db.txt C³B
- (doc/)
- client_packet.txt C³B
- conf_ref.txt C³B
-
---------------
-//0608 by sk
-EƒAƒ}ƒcNPC’ljÁ
- (conf/)
- npc_town_amatsu.txt é“àNPC’ljÁ
- npc_warp_amatsu.txt é“àƒ[ƒvƒ|ƒCƒ“ƒg’ljÁ
-
---------------
-//0607 by J
-EƒAƒTƒ‹ƒgƒ^[ƒgƒ‹‚̎艺¢Š«‚̃oƒOC³(•ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚· ‚é‚é‚邳‚ñ)
- (db/)
- mob_skill_db.txt ƒAƒTƒ‹ƒg‚ÌC³‚‚¢‚łɃeƒŒƒ|‚ðŽg‚¤MOB‚̃XƒLƒ‹ƒfƒBƒŒƒC‚àC³
-
---------------
-//0606 by ˆø‘Þl
-EƒXƒLƒ‹ƒŒƒxƒ‹Å‘å’lˆÈã‚ɃNƒŠƒbƒN‚µ‚½Žž“_‚Å‘¼ƒXƒLƒ‹‚ªã‚°‚ç‚ê‚È‚­‚È‚éƒoƒO‚ðC³iThanx to 227‚³‚ñj
- (map/)
- clif.c
- clif_skillup()
- ƒXƒLƒ‹ƒŒƒxƒ‹‚ªÅ‘å’l‚Ì‚Æ‚«AƒpƒPƒbƒg––”ö‚ð0‚É‚·‚é‚悤‚ÉC³
-
---------------
-//0605 by ‚é‚é‚é
-
-E•Ší‘®«•t—^ƒXƒLƒ‹‚Ì•s“s‡C³
- •Ší‚ðŽ‚¿‘Ö‚¦‚½‚èŠO‚µ‚½‚肵‚½ê‡‚àA‘®«•t—^‚ð‰ðœ‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
- ’A‚µA‘fŽè„•Ší‘•”õ‚Ì‚Ýó‘ÔˆÛŽ‚µ‚Ü‚·B
-EƒXƒsƒAƒNƒCƒbƒPƒ“‚̃Xƒe[ƒ^ƒXƒAƒCƒRƒ“‚𳂵‚­•\Ž¦
-E‚Q‚g‚pAƒXƒsƒAƒNƒCƒbƒPƒ“AƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ÅŠY“–ˆÈŠO‚Ì•ŠíŽ‚¿‘Ö‚¦‚Åó‘ÔÁ–Å
- ƒXƒsƒAƒNƒCƒbƒPƒ“‚Í–¢Šm”F‚Å‚·‚ªA‚Q‚g‚p‚ÍŠmŽÀ‚È‚Ì‚Å‚Q‚g‚p‚Æ•sŒö•½‚ÈŽd—l‚Æ‚Í
- l‚¦‚É‚­‚¢‚Ì‚Å“¯—l‚ȃpƒ^[ƒ“‚Æ‚µ‚Ü‚µ‚½B–{ŽI‚Æ‘Šˆá‚ª‚ ‚éꇂ͕ñŠè‚¢‚Ü‚·B
-E“G‚Ì‚p‚l‚ÅW’†—ÍŒüã‚Æ‘¬“x㸂ð‰ðœ
- ‚p‚l‚ʼne‹¿‚·‚éƒXƒLƒ‹‚Í‚±‚ê‚Q‚‚¾‚¯‚©‚ÈH@Ž„‚Ì‹L‰¯‚ÆŒfŽ¦”‚ł̕ñ‚Æ‚Å
- ”»’f‚µ‚½‚Ì‚Å‚·‚ªA‚à‚µ‘Šˆá‚ª‚ ‚è‚Ü‚µ‚½‚ç•ñŠè‚¢‚Ü‚·B
-
- (map/)
- clif.c
- clif_parse_UnequipItem() C³
- pc.c
- pc_checkallowskill() pc_equipitem() C³
- skill.h
- skill_encchant_eremental_end() ’ljÁ
- skill.c
- skill_status_change_start() skill_status_change_end()
- skill_status_change_clear() skill_encchant_eremental_end() C³
- ‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ë­X
-
---------------
-//0604 by J
-EMOBƒXƒLƒ‹ÄC³
-EMOBDBC³
- (db/)
- mob_skill_db.txt
- ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO‚ƃ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹‚ª1‰ñ‚É2Ží—Þ‚Ü‚Å‚µ‚©
- MOB‚ðo‚³‚È‚©‚Á‚½‚Ì‚ðC³
- mob_db.txt
- ƒ[ƒhƒIƒuƒfƒX‚̃hƒƒbƒv‚ŃGƒ‰[‚ªo‚é‚Ì‚ðC³(–¢Šm”F)
- ‰…—ì•Žm‚̃hƒƒbƒv‚ÆMVP‚ð’ljÁ(–¢Šm”F)
---------------
-//0603 by ˆø‘Þl
-EV‹KƒAƒCƒeƒ€Žž‚É‚àŠŽ‰Â”\ŒÂ”ƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚ÉC³
- (map/)
- pc.c
- pc_checkadditem()
- V‹KƒAƒCƒeƒ€Žž‚ÉMAX_AMOUNT‚ð’´‚¦‚Ä‚¢‚½‚ç
- ADDITEM_OVERAMOUNT‚ð•Ô‚·‚悤‚ÉC³
-
---------------
-//0602 by ˆø‘Þl
-EGeffen’b–艮‚Å—Ž‚¿‚é–â‘è‚ðC³
- (conf/)
- npc_town_geffen.txt if (!checkweight(,)) ‚©‚ç if (!(checkweight(,))) ‚ÉC³
-
---------------
-//0601 by J
-EMOBƒXƒLƒ‹‚ÌŠë‚È‚¢Š‚ð‚¢‚­‚ç‚©C³
-EŠoÁ‚Æ‹¶‹C‚ÌŽg‚¦‚éE‚ðC³
-EƒQƒtƒFƒjƒAƒ_ƒ“ƒWƒ‡ƒ“‚Ì”z’u‚ðƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg‚Å“ü‚ꂽ‚Æ‚«‚Ì”z’u‚ÉC³
- ‚½‚¾‚µƒ{ƒX‚ªDOP2‘Ì‚Å‚Í‚È‚­ƒhƒ‰ƒLƒ…ƒ‰‚É‚µ‚Ä‚¢‚Ü‚·B
- (conf/)
- npc_monster.txt ƒ‚ƒ“ƒXƒ^[”z’u”÷•ÏX
- (db/)
- mob_skill_db.txt ‰ö‚µ‚¢Ý’è‚È‚Ç‚ÌC³
- item_db.txt ‘‘¬POT‚ÌC³
-
---------------
-//0600 by ˆø‘Þl
-Eƒvƒƒ“ƒeƒ‰¸˜BŠ‚̉¡‚̃tƒ@ƒ“‚ɘb‚µŠ|‚¯‚é‚ƌł܂é–â‘è‚ðC³
-EMOBƒXƒLƒ‹Žæ‚èž‚ÝiThanx to J‚³‚ñj
- (conf/)
- npc_event_skillget.txt ƒtƒ@ƒ“‚ÌLabel‚ðC³
- npc_town_prontera.txt ƒtƒ@ƒ“‚ªd•¡‚µ‚Ä‚¢‚½‚Ì‚Åíœ
- (db/)
- mob_skill_db.txt ƒWƒ…ƒm[ˆÈ~‚ÌMOBƒXƒLƒ‹’ljÁ
-
---------------
-//0599 by ‚é‚é‚é
-
-EƒZ[ƒW‚Ì•Ší‘®«•t—^ƒXƒLƒ‹‚Ì•s“s‡C³‚ƃXƒe[ƒ^ƒXƒAƒCƒRƒ“•\Ž¦
- ƒAƒXƒyƒ‹ƒVƒI‚ƃGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‚Æ‚Å‘½d‚É‚©‚©‚Á‚Ä‚µ‚Ü‚Á‚Ä‚½‚Ì‚ÅA
- ÅŒã‚É•t—^‚µ‚½‚à‚Ì‚P‚‚ɂȂé‚悤‚É‚µ‚Ü‚µ‚½B
- ‚»‚̂‚¢‚łɃXƒe[ƒ^ƒXƒAƒCƒRƒ“‚à•\Ž¦‚·‚é‚悤‚É‚à‚µ‚Ü‚µ‚½B
- i–¢ƒeƒXƒg‚Å‚·‚ªAƒAƒCƒRƒ“o‚È‚©‚Á‚½ƒXƒsƒAƒNƒCƒbƒPƒ“‚à‚Å‚é‚Í‚¸‚Å‚·Bj
-EƒAƒCƒeƒ€DB‚É‚ÄA‘‘¬ƒ|[ƒVƒ‡ƒ“‚ÌŽg—p§ŒÀ‚ð’ljÁ
- Jazz‚³‚ñ’ñ‹Ÿ‚Å‚·B
- ‚»‚ê‚ÆŽ„‚ÌŽï–¡‚щƒOƒiƒƒNTƒVƒƒƒc‚ðƒAƒŒƒiƒj‚µ‚Ü‚µ‚½‚ª‚—@‹C‚É“ü‚ç‚È‚¯‚ê‚Î
- Á‚·‚Ȃ茳’Ê‚è‚ÉC³‚·‚é‚Ȃ肵‚Ä‚µ‚¿‚á‚Á‚Ä‚­‚¾‚³‚¢‚Ü‚¹`B
-
- (conf/)
- battle_athena.conf 598‚Å‚Ì“ü‚ê–Y‚ê
- (map/)
- skill_encchant_eremental_end() ’ljÁ
- skill_status_change_end() skill_status_change_start() skill_status_change_clear() C³
- (db/)
- iten_db.txt C³
-
---------------
-//0598 by ‚é‚é‚é
-
-E‘•”õ•Ší‚̉摜•ÏX‚ɑΉž
- ˆê‰ž‚È‚ª‚çƒNƒ‹ƒZƒCƒ_[‚Ì—¼Žè‘„‚Æ‚©ƒvƒŠ[ƒXƒg‚Ì“ÝŠí‚Æ‚©‚̓eƒXƒg‚µ‚Ü‚µ‚½‚ªA
- ‘S‚Ä‚ÌE‚ðƒ`ƒFƒbƒN‚Í‚¢‚Ü‚¹‚ñB‚Ü‚½‚±‚ÌŽž“_‚ł̓Nƒ‰ƒCƒAƒ“ƒgŽ©‘Ì‚Ì•\Ž¦ƒf[ƒ^‚É
- –â‘è‚Ì—L‚é‚Ì‚ª‘½‚¢‚Ì‚à•t‚¯‰Á‚¦‚Ä‚¨‚«‚Ü‚·B
- ‚ ‚ÆAŒC‚àˆê‰ž‚͑Ήž‚µ‚Ü‚µ‚½B’A‚µ‚±‚ê‚ÍŒ»Žž“_‚Å‚Í–{ŽI‚·‚ç‚à–¢‘Ήž‚È‚Ì‚Å‚·‚ªB
- •\Ž¦‚ª‰»‚¯‚ÄŒ™‚¾‚Æ‚¢‚¤ê‡‚Í]—ˆ‚Ì‚â‚è•û‚ào—ˆ‚Ü‚·B
-
- (conf/)
- battle_athena.conf
- ƒIƒvƒVƒ‡ƒ“ equip_modifydisplay ‚ð’ljÁ
- (map/)
- battle.h
- Battle_Config C³
- battle.c
- battle_config_read() C³
- clif.c
- packet_len_table[] clif_changelook() C³
- map.h
- enum {} C³
- pc.c
- pc_calcstatus() pc_equiplookall() pc_changelook() C³
- (common/)
- mmo.h
- mmo_charstatus {} C³
-
---------------
-//0597 by ”g˜Q
-
-EƒAƒ}ƒc‚ÉŠÖ‚·‚éC³•”÷C³
- (conf/)
- npc_mob_job.txt
- npc_monster.txt
- npc_monster30.txt
- ƒ‚ƒ“ƒX–¼C³
- npc_monster_amatsu.txt
- ’ljÁiƒ‚ƒ“ƒX”‚ª‚©‚È‚èŽè”²‚«‚Å‚·EEE
- npc_town_amatsu.txt
- ƒVƒ‡ƒbƒvNPC‚ð“‡inpc_shop3.txt‚ðÁ‚µ‚Ä‚àOK‚Å‚·
- (db/)
- mob_db.txt
- ƒAƒ}ƒc‚̃‚ƒ“ƒXƒf[ƒ^‚ðŒ»Ý•ª‚©‚é”͈͂ÅC³•‘‚Æ‚«‚Ì‚±‚Ìdef,mdef‚ðC³
-
---------------
-//0596 by Ž€_
-
-E0595‚ÌC³‚Æׂ©‚¢C³B
-EƒtƒŠ[ƒLƒƒƒXƒg‚ŃLƒƒƒXƒg‚µ‚Ä‚¢‚éŠÔ‚ÍUŒ‚‰Â”\‚Å‚·‚ªƒLƒƒƒXƒg‚µ‚½Œã‚Ì
-ƒfƒBƒŒƒCƒ^ƒCƒ€‚Å‚ÍUŒ‚‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B–{ŽI‚ÌŽd—l‚ª‚Ç‚¤‚È‚Ì‚©‚Í
-‚í‚©‚è‚Ü‚¹‚ñB
-E“®‚¢‚Ä‚¢‚éPC‚Ƀ‚ƒ“ƒXƒ^[‚ªUŒ‚‚Å‚«‚È‚¢–â‘èC³B(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ‚ª
-‘½•ª‚±‚ê‚Å‘åä•v‚©‚ÆB)
- (map/)
- skill.h
- SC_FREECAST íœB
- skill.c
- skill_use_id()Askill_use_pos() C³B
- skill_castend_id()Askill_castend_pos() C³B
- ‚»‚Ì‘¼­‚µC³B
- pc.c
- calc_next_walk_step()Apc_attack_timer()Apc_calcstatus() C³B
- clif.c
- clif_parse_ActionRequest()Aclif_parse() C³B
- map.h
- struct map_session_data‚Éprev_speed’ljÁB
- mob.c
- mob_ai_sub_hard()Amob_changestate()Amob_attack() C³B
-
---------------
-//0595 by PRevEv
-EƒtƒŠ[ƒLƒƒƒXƒgC³AŽÀ‘•(ƒLƒƒƒXƒeƒBƒ“ƒO’†UŒ‚‚à‚Å‚«‚Ü‚·B)
- (/map)
- pc.c
- pc_calcstatus() C³B
- calc_next_walk_step() C³B
- pc_attack_timer() C³B
- skill.c
- skill_castend_id()Askill_castend_pos()Askill_use_id()Askill_use_pos() C³B
-
---------------
-//0594 by Ž€_
-
-EŠØ‘ˆÆ‚̃p[ƒeƒB–â‘èC³‚Æׂ©‚¢C³B
-E@partyƒRƒ}ƒ“ƒhC³‚Æ@guildƒRƒ}ƒ“ƒh’ljÁB
-Ebattle_athena.conf‚Éguild_emperium_check’ljÁB
-EƒXƒLƒ‹Žg—p‚ªŽ¸”s‚µ‚Ä‚àƒfƒBƒŒƒC‚ª‚©‚©‚é–â‘èC³B
- help.txt C³B
- (map/)
- clif.c
- clif_parse_CreateParty2() ’ljÁB
- clif_parse_ItemIdentify() C³B
- ‚»‚Ì‘¼­‚µC³B
- atcommand.hAatcommand.c C³B
- battle.h
- struct Battle_Config‚Éguild_emperium_check’ljÁB
- battle.c
- battle_config_read() C³B
- guild.c
- guild_create()Aguild_created() C³B
- skill.c
- skill_castend_id()Askill_castend_pos() C³B
- Makefile C³B
- (doc/)
- client_packet.txt
- ƒpƒPƒbƒg0x01e8 ’ljÁB
- conf_ref.txt C³B
- (conf/)
- atcommand_athena.conf C³B
- battle_athena.conf C³B
-
---------------
-//0593 by Ž€_
-
-EƒƒeƒI‚ƃoƒ~ƒŠƒIƒ“‚̃_ƒ[ƒWC³‚Æׂ©‚¢C³B
-EƒƒeƒI‚Ìè¦Î‚ª—Ž‚¿‚Ä‚­‚é”͈͂ð7*7‚©‚ç5*5‚É•ÏXB(‚±‚ê‚Å’†‰›‚Í‘S‚Ä‚Ìè¦Î‚Ì
-ƒ_ƒ[ƒW‚ðŽó‚¯‚邱‚Æ‚É‚È‚è‚Ü‚·B)
-EŽ©“®‰ñ•œŒvŽZŽ®•ÏXB
- ƒXƒLƒ‹ƒŒƒxƒ‹*5 + (max_hp/50)‚©‚ç
- ƒXƒLƒ‹ƒŒƒxƒ‹*5 + (max_hp*ƒXƒLƒ‹ƒŒƒxƒ‹/500)‚É•ÏXB(SP‚Æ‘§‚à“¯‚¶‚悤‚É•ÏXB)
-EGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v‚Åatcommand_athena.conf‚Ìkick‚Ì
-ƒŒƒxƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏXB
- (db/)
- skill_db.txt
- ƒXƒLƒ‹‹CŒ÷‚Ìsp‚ð10‚©‚ç8‚ÉC³B
- (map/)
- map.c
- NO_WATER‚ð100‚©‚ç1000000‚É•ÏXB
- battle.c
- battle_calc_magic_attack() C³B
- skill.c
- skill_castend_pos2() C³B
- pc.c
- pc_natural_heal_hp()Apc_natural_heal_sp()Apc_spirit_heal() C³B
- clif.c
- clif_parse_GMKick() C³B
- (doc/)
- conf_ref.txt C³B
-
---------------
-//0592 by ˆø‘Þl
-
-E…ê‚Ì—L‚è–³‚µ‚ðwater_height.txt‚¾‚¯‚ÅŒˆ‚ß‚é‚悤‚É•ÏXBnpc_water.txt‚Í•s—v‚ÉB
-EƒJ[ƒhƒXƒLƒ‹‚ł̓Œƒxƒ‹ã‚°‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚½‚½‚ß•s—v‚É‚È‚Á‚½ˆ—‚ðíœB
- (conf/)
- map_athena.conf
- npc: conf/npc_water.txt Á‹Ž
- water_height.txt
- ƒfƒtƒHƒ‹ƒg‚‚³3‚̃}ƒbƒv•ª‚ð’ljÁ•all_water‚ð‚‚³-100‚Æ‚µ‚ăRƒƒ“ƒg‚ŒljÁ
- (map/)
- map.c
- waterlist‚Ímap_readwater()“à‚Ńƒ‚ƒŠŠm•Û
- gatÝ’èŒã‚Í•s—v‚È‚Ì‚Åmap_readallmap()‚Ńƒ‚ƒŠŠJ•ú‚µ‚Ä‚¢‚Ü‚·
- map.h
- struct map_data‚Ìflag‚©‚çwater_flag‚ðÁ‹Ž
- npc.c
- npc_parse_mapflag()
- ƒ}ƒbƒvƒtƒ‰ƒOwater‚Æall_water‚ðÁ‹Ž
- pc.c
- pc_skillup()
- — ‚ŃXƒLƒ‹LvUP‚Å‚«‚È‚­‚È‚Á‚½‚Ì‚Åskill[id].flag‚Ì•ª‚ÍÁ‹Ž
- skill.c
- skill_check_condition()
- map_getcell‚Å…ê”»’è‚·‚é‚悤‚ÉC³
-
---------------
-//0591 by CHRIS
-
-Eƒ‚ƒ“ƒN‚ªŸ†’e‚ð‚à‚Á‚Ä‚¢‚é‚Æ‚«AŸ†’e*3‚Ì•K’†ƒ_ƒ[ƒW‚ª“ü‚é—l‚É‚È‚è‚Ü‚µ‚½B„Ÿ@battle.cC³
-Eƒ‚ƒ“ƒNƒXƒLƒ‹uŽw’ev‚Æu”­™¤v‚Æu‹CEv‚̉r¥ŽžŠÔ‚ª³‚µ‚­C³‚³‚ê‚Ü‚µ‚½B„Ÿ@cast_db.txtC³
-
---------------
-//0590 by Ž€_
-
-Egrf-files.txt‚âconfƒtƒ@ƒCƒ‹Aaccount.txtƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ƈʒu‚ð•Ï‚¦‚é‚悤‚É•ÏXB
-Eƒ}ƒbƒvˆÚ“®‚É‚æ‚éŽI—Ž‚¿‚ð–h‚®ˆ×‚ÉC³B(ƒ}ƒbƒv‚ª“ñ“xƒ[ƒh‚³‚ê‚ÄŽI—Ž‚¿‚ª
-‹N‚±‚Á‚½‚Æ‚Ì•ñ‚ðŽó‚¯‚½‚Ì‚ÅB)
-E0586‚ð‚¿‚å‚Á‚ÆC³B‘•”õ‚É‚æ‚éƒXƒLƒ‹‚ÌꇃŒƒxƒ‹ã‚°‚ª‚Å‚«‚È‚¢‚悤‚ÉC³B
-‚½‚¾‘•”õ‚É‚æ‚éƒXƒLƒ‹‚ðƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽg‚Á‚Äã‚°‚鎞‚Í‘•”õ‚ðŠO‚·•K—v‚ª
-‚ ‚è‚Ü‚·B
-E@party‚¿‚å‚Á‚ÆC³B(–¼‘O‚É‹ó”’‚ª‚ ‚Á‚Ä‚à‘åä•v‚Ȃ悤‚ÉB)
-E…ê‚Ì‚‚³‚ðwater_height.txt‚Å“Ç‚Ýž‚ނ悤‚É•ÏXB
-Econfƒtƒ@ƒCƒ‹‚ÅÝ’è‚·‚镨‚ðƒtƒ@ƒCƒ‹‚̃pƒX‚É‹ó”’‚ª‚ ‚Á‚Ä‚à‘åä•v‚È
-‚悤‚É•ÏXB
-EGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v‚Ń‚ƒ“ƒXƒ^[‚ð“|‚¹‚é‚悤‚É•ÏXB
-(Œ´ˆö‚Í•s–¾‚Å‚·‚ª‚±‚ê‚Ń‚ƒ“ƒXƒ^[‚ðŽE‚·‚ÆŽI‚ª‚ß‚¿‚á‚­‚¿‚á‚É’x‚­‚Ȃ邱‚Æ‚ª
-‚ ‚è‚Ü‚·B)
-E‚»‚Ì‘¼­‚µC³B
-EƒeƒXƒg‚Í–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- athena-start C³B
- (map/)
- pc.c
- pc_skill()Apc_resetskill()Apc_setpos()Apc_read_gm_account() C³B
- pc_set_gm_account_fname() ’ljÁB
- pc.h
- pc_set_gm_account_fname() ’ljÁB
- clif.c
- clif_skillinfoblock()Aclif_parse_LoadEndAck()Aclif_parse_GMKick() C³B
- clif_changemap() C³B
- atcommand.c
- @partty C³B
- skill.c
- skill_castend_nodamage_id() C³B
- map.c
- map_config_read()Amap_readwater() C³B
- script.c
- script_config_read()Ado_init_script() C³B
- script.h
- script_config_read() ’ljÁB
- (common/)
- version.h C³B
- grfio.h
- grfio.c
- grfio_init() C³B
- mmo.h
- GRF_PATH_FILENAME ’ljÁB
- (conf/)
- map_athena.conf C³B
- npc_water.txt C³B
- water_height.txt ’ljÁB
- login_athena.conf C³B
- (login/)
- login.c
- login_config_read()Aread_gm_account() C³B
- (char/)
- char.c
- do_init() C³B
- char_config_read() ’ljÁB
- inter.c
- inter_config_read() C³B
- (doc/)
- conf_ref.txt C³B
-
---------------
-//0589 by ŒÓ’±—–
-
-EGM‚̉EƒNƒŠƒbƒN‚ÅØ’f‚³‚ê‚é–â‘è‚ðC³
- ‚Æ‚è‚ ‚¦‚¸01dfƒpƒPƒbƒg‚𖳎‹‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
- ‚È‚ñ‚Æ‚È‚­‚±‚̃pƒPƒbƒg‚̓`ƒƒƒbƒg‹ÖŽ~‰ñ”‚Æ‚ÍŠÖŒW–³‚¢‚悤‚È‹C‚àcc
-
- clif.c
- clif_parse_GMReqNoChatCount()’ljÁ
-
-Estart‚ðathena.sh‚Å‚È‚­athena-start‚ðŽg‚¤‚悤‚É•ÏX
- start
- athena.sh => athena-start start‚É’u‚«Š·‚¦‚µ‚½‚¾‚¯
-
---------------
-//0588 by Kalen
-
-EAmatsuNPC’ljÁ
-
---------------
-//0587 by ŒÓ’±—–
-
-EloginƒT[ƒo[‚ÌŠÇ—ƒpƒPƒbƒg‚ÌŽd—l‚ð•ÏXi0579‚̃ƒOƒCƒ“‹‘”Ûî•ñ‚ɑΉžj
- (login/)
- login.c
- ƒAƒJƒEƒ“ƒgƒoƒ“ó‘Ô•ÏXƒpƒPƒbƒg’ljÁ(7936,7937)
- ƒAƒJƒEƒ“ƒgƒŠƒXƒgŠ“¾ƒpƒPƒbƒgC³(7921)
- (doc/)
- admin_packet.txt
-
-Eladmin‚Ì‹@”\’ljÁ
- Eƒoƒ“ó‘Ô‚ð•ÏX‚·‚éƒRƒ}ƒ“ƒh’ljÁ
- EƒŠƒXƒg•\Ž¦‚ÆŒŸõ‚Ńoƒ“ó‘Ô‚à•\Ž¦‚³‚ê‚é‚悤‚É‚È‚Á‚½
- E"?"‚Å‚àƒwƒ‹ƒv‚ªo‚é‚悤‚ÉC³
- EƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Éstateaccount‚ª’ljÁ‚³‚ê‚Ü‚µ‚½B
- Žg‚¤l‚Íladmin‚Ì--makesymlink‚ð‚à‚¤ˆê“xŽÀs‚µ‚Ä‚­‚¾‚³‚¢
-
- (tool/)
- ladmin
- ‹@”\’ljÁ
-
---------------
-//0586 by ˆø‘Þl
-EƒJ[ƒhƒXƒLƒ‹‚ðC³
- (/map)
- pc.c
- pc_calc_skilltree()
- pc_skill()
- Šo‚¦‚ç‚ê‚È‚¢ƒXƒLƒ‹‚È‚çskill[id].flag=1‚Æ‚·‚é
- ‚Ü‚½‚Ískill[id].flag‚É–{—ˆ‚Ìlv‚ð+2‚µ‚Ä‹L‰¯
- pc_skillup()
- skill[id].flag‚à‘‚â‚·
- clif.c
- clif_skillinfoblock()
- skill[id].flag==1‚È‚çŠo‚¦‚ç‚ê‚È‚¢ƒXƒLƒ‹
- (/char)
- char.c
- mmo_char_tostr()
- skill[id].flag‚©‚ç–{—ˆ‚Ìlv’l‚ð•Û‘¶‚·‚é
-
---------------
-//0585 by kalen
-EscriptC³
- npc_town_guid.txt ŠOŒ©•ÏX
-
---------------
-//0584 by ˆø‘Þl
-EƒJ[ƒhƒXƒLƒ‹‚ðC³
- (/map)
- pc.c
- pc_calc_skilltree() cardƒXƒLƒ‹‚ð–Y‚ꂳ‚¹‚鈗‚ð’ljÁ
- pc_skill() ®—
-
---------------
-//0583 by kalen
-EscriptC³
- npc_event_doll.txt ”²‚¯‚Ä‚¢‚½•”•ª‚̉ï˜b’ljÁ
- npc_town_guid.txt ’¬‚̈ēà—vˆõ‚̉摜‚ð•\Ž¦‚Å‚«‚é‚悤‚ÉC³
- Šî–{“I‚ÉÅVjRO‚Å–â‘è‚È‚µ‚Å‚·B
-
---------------
-//0582 by PRevEv
-E580‚̃oƒOC³B
- (/map)
- skill.c
- skill_use_pos() C³B
---------------
-//0581 by ˆø‘Þl
-E…ê‚‚³Ý’èŠÖ˜A‚ð­‚µC³
- (/map)
- map.c
- map_waterheight()
- map_readwater()
- map_readmap()
- waterlist[512] -> *waterlist‚É‚µ‚ÄAmalloc‚Ńƒ‚ƒŠŠm•Û‚·‚é‚悤‚ÉC³B
- map_readallmap()
- free(waterlist);’ljÁ
-
-EƒoƒO•ñƒXƒŒƒbƒh‚ÌC³ƒpƒbƒ`‚ðŽæ‚èž‚Ý
- (conf/)
- npc_town_refine.txt ƒZƒ~ƒRƒƒ“”²‚¯C³
- (db/)
- item_db.txt 1161,ƒoƒ‹ƒ€ƒ“C³
-
---------------
-//0580 by PRevEv
-EƒtƒŠ[ƒLƒƒƒXƒg‰¼ŽÀ‘•(ƒLƒƒƒXƒeƒBƒ“ƒO’†UŒ‚‚Í•s‰Â”\)
- (/map)
- clif.c
- clif_parse_WalkToXY() C³B
- pc.c
- pc_calcstatus() C³B
- skill.c
- skill_castend_id()Askill_castend_pos()Askill_use_id()Askill_use_pos() C³B
---------------
-//0579 by A‚Ìl
-EƒƒOƒCƒ“‚ð’e‚­ˆ—‚ð‰¼ŽÀ‘•
- conf/login.c
- auth_dat\‘¢‘Ì‚Éstate‚ð’ljÁ
- mmo_authŠÖ”C³
- mmo_auth_newŠÖ”C³
- mmo_auth_syncŠÖ”C³
- mmo_auth_initŠÖ”C³
-
- ‚±‚Ì’l‚ð•ÏX‚·‚éƒc[ƒ‹A‰ü‘PôB‘¼—Í–{Šè‚Å‚·i„ƒG
---------------
-//0578 by ˆø‘Þl
-EƒoƒO•ñƒXƒŒƒbƒh‚ÌC³ƒpƒbƒ`‚ðŽæ‚èž‚Ý‚È‚Çithanx to ‚é‚é‚邳‚ñ,Athefans‚³‚ñ,sage‚³‚ñ,zupport‚³‚ñj
- help.txt @go‚Ìà–¾‚¿‚å‚Á‚ÆC³
- (conf/)
- npc_mob_job.txt ‘æ4—ñ–Ú‚ðTab‹æØ‚è‚ÉC³
- npc_water.txt …ê‚‚³C³
- (db/)
- item_db.txt 640,...,{ pet 1155; },{},,‚ÉC³
- mob_db.txt 1162,RAFFLESIA,ƒ‰ƒtƒŒƒVƒA...C³
-
---------------
-//0577 by ‚é‚é‚é
-E@ƒRƒ}ƒ“ƒh‚ð’ljÁ•C³
- atcommand.c
- atcommand() @itemresetƒRƒ}ƒ“ƒh’ljÁ @goƒRƒ}ƒ“ƒhC³iƒAƒ}ƒcEƒRƒ“ƒƒ“‚ð’ljÁj
- atcommand_config_read() ã‚ɇ‚킹‚ÄitemresetŽg—pƒŒƒxƒ‹Žw’è‚ð’ljÁ
-
- doc/conf_ref.txt
- conf/atcommand_athena.conf itemresetŽg—pƒŒƒxƒ‹Žw’è‚ð’ljÁ
- help.txt @itemreset‚Ìà–¾’ljÁ‚Æ@go‚Ìà–¾C³
-
--------------
-//0576 by V&S
-EƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh‚ƃo[ƒXƒŠ[ƒJ[ƒh‚ÌŒø‰Ê‚ª‹t‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
- { bonus bDefEle,7; }¨ƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh(”O)
- { bonus bDefEle,8; }¨ƒo[ƒXƒŠ[ƒJ[ƒh(ˆÅ)
- ª‚¾‚Á‚½‚Ì‚ð«‚ÉC³
- { bonus bDefEle,7; }¨ƒo[ƒXƒŠ[ƒJ[ƒh(ˆÅ)
- { bonus bDefEle,8; }¨ƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh(”O)
-
- |“S‚Ìd—Ê‚ðC³
-
---------------
-//0575 by ˆø‘Þl
-E…êƒtƒ@ƒCƒ‹‚ª"conf/npc_water.txt"ŒÅ’肾‚Á‚½‚Ì‚ðC³
-iconf/map_athena.conf‚Ìnpc:‚É‘‚©‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð‚Ý‚Ä…ê‚‚³Ý’è‚·‚é‚悤‚Éj
- map.c
- struct waterlist[512]; V‹K’ljÁBƒ}ƒbƒvƒtƒ@ƒCƒ‹–¼‚Æ…ê‚‚³‚ð‹L‰¯B
- map_waterheight() V‹K’ljÁB…ê‚Ì‚‚³‚ð•Ô‚·B
- map_readwater() …êƒtƒ@ƒCƒ‹‚ð‚Ý‚Äwaterlist‚ðÝ’è‚·‚é‚悤‚ÉC³B
- map_readmap() map_waterheight()‚ðŒÄ‚Ԃ悤‚ÉC³B
- map_config_read() "npc"‚Åmap_readwater(w2);’ljÁB
-
---------------
-//0574 by ‚¢‚Ç
-
-EƒT[ƒo[Snapshot
-Econf/shop_*.txt‚Ì“à—e‚ðconf/npc_town_*.txt‚É“‡
-
---------------
-//0573 by Jazz
-
-Emap‚Ì penalty, nomemo, noteleport, nobranch‚Ì option‚ðÝ’èB
-Emap ƒT[ƒo[‚ª cpu‚𖳌Àè—L‚·‚邱‚Æ‚ðŒŸ¸‚·‚邽‚ß‚Ì script “Y•t. cygwinŠÂ‹«‚Å쬂ƎÀŒ±‚ð‚µ‚Ü‚µ‚½.
- (/conf)
- mapflag.txt ’ljÁB
- (/tool)
- mapcheck.sh ’ljÁB
-
---------------
-//0572 by ˆø‘Þl
-E"conf/npc_water.txt"‚Ì‘æ4—ñ‚Å…ê‚‚³Ý’è
-@i‚¿‚á‚ñ‚Æ‚µ‚½…ê”»’肪ŽÀ‘•‚³‚ê‚é‚܂ł̂‚Ȃ¬‚Æ‚µ‚ÄEEEj
- (/conf)
- npc_water.txt ƒTƒ“ƒvƒ‹C³B
- E‘æ4—ñ‚Å…ê‚Ì‚‚³‚ðݒ肵‚Ü‚·B
- E‚‚³‚ð‘‚©‚È‚©‚Á‚½ê‡‚̃fƒtƒHƒ‹ƒg’l‚Í3‚É‚È‚è‚Ü‚·B
- (/map)
- map.c
- E…ê‚‚³Ý’èŠÖ” map_readwater() ’ljÁB
-
---------------
-//0571 by code
-“V’ÃtƒB[ƒ‹ƒh‚ÌMOB‚Ì”z’u‚ƃ[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è‚ÌC³
-“V’Ãpƒbƒ`‚É›À›Ä‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚Ì‚ðŠm”F‚µ‚½‚Ì‚Å›À›Ä‚̃[ƒv‚Æmob‚ð”z’u
-
-conf/npc_monster35.txt
- mob‚Ì”z’u
-
-conf/npc_warp_amatsu.txt
-@@ “V’Ãwarp point‚ÌÝ’u
-
-conf/npc_warp_gonryun.txt
- ›À›Äwarp point‚ÌÝ’u
-
-conf/npc_town_amatsu.txt
-@@ Žb’è“I‚Ƀvƒƒ“ƒeƒ‰•¬…‘O©¨“V’Ã`^ƒvƒƒ“ƒeƒ‰•¬…‘O©¨›À›Ä‚ÌÚ‘±NPC
-
---------------
-//0570 by code
-“V’ÃtƒB[ƒ‹ƒh‚ÌMOB‚Ì”z’u‚ƃ[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è‚Å‚·B
-conf/npc_monster35.txt
- mob‚Ì”z’u
-
-conf/npc_warp_amatsu.txt
-@@ warp point‚ÌÝ’u
-
-conf/npc_town_amatsu.txt
-@@ Žb’è“I‚Ƀvƒƒ“ƒeƒ‰•¬…‘O©¨“V’Ã`‚ÌÚ‘±NPC
-
---------------
-//0569 by Ž€_
-
-E0561‚Ì@jobcange ‚Å‚ÌŠƒo[ƒh•‰ƒ_ƒ“ƒT[‚É‚æ‚éˆÆ—Ž‚¿–hŽ~‚ðpc_jobchange()‚Å‚·‚é‚悤‚É•ÏXB
-E@ƒRƒ}ƒ“ƒh@party’ljÁBƒp[ƒeƒB‚ðì‚é–½—ß‚Å‚·BŠØ‘ˆÆ‚ðŽg‚¤‚ƃp[ƒeƒB‚ðì‚鎞Ž~‚Ü‚é‚Ì‚Å—ÕŽž“I‚É‚±‚ê‚ðŽg‚Á‚ăp[ƒeƒB‚ðì‚Á‚Ä‚­‚¾‚³‚¢B
-E…‚Ì”»’fˆ—C³B
-Eƒ}ƒbƒvƒtƒ‰ƒO‚Éwater‚Æall_water’ljÁBÚ‚µ‚­‚Ínpc_water.txt‚ðŽQl‚µ‚Ä‚­‚¾‚³‚¢B
-iz_dun0x‚¾‚¯“ü—Í‚µ‚Ä‚¢‚Ü‚·‚Ì‚Å‘¼‚Ì‚Í–„‚ß‚Ä‚­‚¾‚³‚¢Bƒ}ƒbƒvƒtƒ‰ƒOwater‚©all_water‚ª“ü‚Á‚Ä‚È‚¢‚ƃZƒ‹‚Ìtype‚ª3‚Å‚à…‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚¹‚ñB‚»‚µ‚Ä…‚¾‚炯‚Ìiz_dun02‚©‚ç04‚Ü‚Å‚Í‘S‚Ä…‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚Éall_water‚ð“ü‚ê‚Ä‚¢‚Ü‚·B(‚±‚êˆÈŠO‚Í•û–@‚ª‚È‚©‚Á‚½‚Ì‚Å...)
-Ebattle_athena.conf‚É€–ڒljÁBˆê•”‚ÍWeiss‚ðŽQl‚µ‚Äì‚Á‚½•¨‚Å‚·B
-EƒeƒXƒg‚µ‚Ä‚È‚¢•¨‚à­‚µ‚ ‚è‚Ü‚·B
- (/conf)
- atcommand_athena.conf C³B
- battle_athena.conf C³B
- map_athena.conf C³B
- npc_water.txt ’ljÁB
- (/doc)
- conf_ref.txt C³B
- (/map)
- atcommand.hAatcommand.c C³B
- battle.h C³B
- battle.c
- battle_config_read() C³B
- pc.c
- pc_jobchange()Apc_stop_walking() C³B
- npc.c
- npc_parse_warp()Ado_init_npc()Anpc_parse_mapflag() C³B
- mob.c
- mob_ai_sub_hard() C³B
- pet.c
- pet_food() C³B
- skill.c
- skill_check_condition() C³B
- map.h
- struct map_data C³B
-
---------------
-//0568 by ˆø‘Þl
-
-EƒAƒNƒAƒxƒlƒfƒBƒNƒ^…ê”»’è‚È‚Ç
-EƒEƒH[ƒ^[ƒ{[ƒ‹…ê”»’èiread_gat(m,x,y)==3‚Å…ê‚Æ”»’èj
- skill.c
- skill_castend_nodamage_id()
- case AL_HOLYWATER: ƒAƒNƒAƒxƒlƒfƒBƒNƒ^i¹…Žæ“¾j
- skill_check_condition()
- case AL_HOLYWATER: ƒAƒNƒAƒxƒlƒfƒBƒNƒ^i…ê”»’èj
- case WZ_WATERBALL: ƒEƒH[ƒ^[ƒ{[ƒ‹i…ê”»’èj
-
---------------
-//0567 by ‚é‚é‚é
-
-EƒAƒRƒ‰ƒCƒg‚̃AƒNƒAƒxƒlƒfƒBƒNƒ^‚ð‰¼ŽÀ‘•i…êŒÀ’èŽg—p‚Ì‚Ý–¢ŽÀ‘•j
-EƒvƒŠ[ƒXƒg‚̃AƒXƒyƒ‹ƒVƒIAƒZ[ƒW‚̃tƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[‚ŃXƒLƒ‹Žg—pŽž‚ɃAƒCƒeƒ€Á”ï
-Eƒ~ƒXƒgƒŒƒXƒJ[ƒh‘•”õŽž‚ɃZ[ƒW‚Ì‘®«Œ´Î•ƒnƒ“ƒ^[‚Ìã©‚ªÁ”‚ê‚È‚¢ƒoƒO‚ðC³
-
- (/map)
- skill.c
- skill_check_condition() C³
-
---------------
-//0566 by ƒpƒCƒ“
-
-E0563‚̃XƒLƒ‹‰ðœðŒ‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ÅC³B•Ší‚ð‚Í‚¸‚·&•Ší‚ð•Ï‚¦‚½ê‡‚Í
-@–³ðŒ‚ʼn𜂷‚é‚悤‚É‚µ‚½B
-
-# pc_checkallowskill ‚ɂ‚¢‚Ä(‘O‰ñà–¾‘‚­‚Ì‚ð–Y‚ê‚Ä‚¢‚½‚Ì‚Åc)
-@ˆê‰ž¡Œã‚ÌŠÜ‚Ý‚Æ‚µ‚Äreturn‚ð•Ô‚·‚悤‚É‚µ‚Ä‚¢‚Ü‚·‚ªAŒ»Ý‚Í(–ß‚èæ‚Å‚Í)Žg‚Á‚Ä‚¢‚Ü‚¹‚ñB
-@¡Œ»Ý‚Í‹RŽmEƒNƒ‹ƒZƒCƒ_[‚­‚ç‚¢‚µ‚©ƒXƒLƒ‹Žg—pŽž‚Ì•Ší§ŒÀ‚ª‚ ‚è‚Ü‚¹‚ñ‚ªA¡Œão‚Ä‚±‚È‚¢
-@‚Æ‚àŒÀ‚ç‚È‚¢‚Ì‚ÅA‚à‚µ(2ŽŸãˆÊ‚©3ŽŸH)o‚Ä‚«‚½‚炱‚±‚Ń`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B
-
- (/map)
- pc.c
- pc_checkallowskill() C³
-
---------------
-//0565 by ˆø‘Þl
-
-Eƒ}ƒbƒvˆÚ“®Žž‚É–î‘•”õ‚ªŠO‚ê‚È‚¢‚悤‚ÉC³
-EƒƒOƒCƒ“Žž‚É–î‘•”õ‚ª•\Ž¦‚³‚ê‚é‚悤‚ÉC³
- (/common)
- mmo.h
- i–î‘•”õ‚Í0x8000‚È‚Ì‚Åjshort‚¾‚Æint‚ւ̃LƒƒƒXƒgŽž‚È‚Ç‚É
- •‰’l‚Æ‚È‚Á‚Ä‚µ‚Ü‚¤‚½‚ßunsigned short‚ÉC³
- struct item
- short equip; -> unsigned short equip;
- (/map)
- clif.c
- clif_itemlist() ƒAƒCƒeƒ€ƒŠƒXƒg‚Ì–î‚̂‚¢‚Å‚É–î‘•”õ‚àƒ`ƒFƒbƒN
- clif_arrowequip() ƒVƒ“ƒvƒ‹‰»
- pc.c
- pc_equipitem() C³
-
---------------
-//0564 by g—t
-
-E@model‚Ì•žõ‚ß•s‰Â”\”»’èC³B
-E@model‚ÅA‘I‚ׂéƒnƒY‚Ì”¯Œ`‚É•ÏXo—ˆ‚È‚©‚Á‚½•”•ª‚ðC³B
-@ã‹L•ÏX“_‚ɇ‚킹‚Ähelp.txt‚ÌC³B
-
---------------
-//0563 by ƒpƒCƒ“
-
-EMOB‚̈ÈŃXƒLƒ‹‚ðH‚ç‚Á‚½Œã‚ɉñ•œ‚µ‚È‚¢‚Ì‚ðC³Bc‚È‚ñ‚¾‚¯‚ÇA“K³‚È’l‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å
-@“Å‚â’¾–Ù‚Æ“¯‚¶ŽžŠÔ‚É‚µ‚Ä‚ ‚è‚Ü‚·
-@¡ŒãA‚Ü‚½Žè‚ð‰Á‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
-E2HQ‚ƃXƒsƒAƒNƒCƒbƒPƒ“‚ðŽg—p’†‚É•Ší‚ð•Ï‚¦‚½ê‡‚͉𜂷‚é‚悤‚É•ÏXB
-
- (/map)
- skill.c
- skill_castend_damage_id() C³B
- skill_status_change_timer() C³B
- pc.c
- pc_checkallowskill() VÝB
- pc_equipitem() C³B
- pc.h
- pc_checkallowskill() VÝB
-
---------------
-//0562 by huge
-
-E–î‚ð‹|‘•”õŽžˆÈŠO‚Å‚à‘•”õ‚Å‚«‚é‚悤‚É–ß‚µ‚Ü‚µ‚½B
-E–î‚Ì‘®«‚ð“K—p‚·‚é‚Ì‚ð‹|‘•”õŽž‚Ì‚Ý‚ÉC³B
-
- pc.c
- pc_equipitem() C³B
- pc_calcstatus() C³B
-
---------------
-//0561 by ˆø‘Þl
-
-ELinux‚Å‚àƒRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É
- (/map)
- skill.c
- skill_castend_damage_id() •Ï”dx,dy‚Ì錾ˆÊ’u•ÏX
- Makefile
- LIBS ‚É -lm ’ljÁ
-
-E@jobcange ‚Å‚ÌŠƒo[ƒh•‰ƒ_ƒ“ƒT[‚É‚æ‚éˆÆ—Ž‚¿–hŽ~B by (no name)‚³‚ñ
- atcommand.c
- @jobchange,@charjob‚É«•Êƒ`ƒFƒbƒN’ljÁ
-
-// ƒiƒiƒX‚³‚ñC³
-Eclif.c“à‚Åatcommand.h‚ð‚Q“xinclude‚µ‚Ä‚¢‚½‚̂ňê‚ÂíœB
-Eƒp[ƒeƒB[‰ï˜bAƒMƒ‹ƒh‰ï˜b‚Å‚à@ƒRƒ}ƒ“ƒh‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³B
- (/map)
- clif.c
- clif_parse_PartyMessage()Aclif_parse_GuildMessage C³B
-
---------------
-//0560 by ƒpƒCƒ“
-
-E0559 ‚Ì athena-start ‚ð Unix Like OS ‚Å‚à“®‚­‚悤‚ɃŠƒtƒ@ƒCƒ“B
-
---------------
-//0559 by rowla
-
-Eathena.sh‚ð‘S–Ê“I‚É‘‚«’¼‚µAathena-start‚ÉBathena-start start‚ÅŠJŽnAathena-start stop‚ŃT[ƒo[’âŽ~Bcygwin‚ŃeƒXƒgA*BSD|Linux‚Å‚Í–¢ƒeƒXƒg(ŠÂ‹«‚ª‚È‚¢‚½‚ß)B
-
---------------
-//0558 by Ž€_
-
-EƒuƒŠƒbƒcƒr[ƒg‚ðŽ©“®‚¾‚¯‹|‚ð‘•”õ‚µ‚Ä‚¢‚È‚¢‚Æ”­“®‚Å‚«‚È‚¢‚悤‚É•ÏXB(Žè“®‚Í•Ší‚ÉŠÖŒW‚È‚­Žg‚¦‚Ü‚·B) –¢ƒeƒXƒgB
-Eƒgƒ‰ƒbƒv‚Ìd‚³C³B(‰½ŒÌ‚©‚Í’m‚ç‚È‚¢‚¯‚Ç100‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð10‚ÉC³Bˆö‚Ý‚É‘q‚Ì•\Ž¦‚Í100‚ª10‚Å10‚ª1‚Å‚·B)
-E‹|‚ÅŽg‚¤ƒXƒLƒ‹‚ÌꇖŒ¸‚ç‚È‚¢‚Ì‚ªŽd—l‚¾‚Á‚½‚ÆŠo‚¦‚Ä‚¢‚é‚Ì‚Å–î‚ðƒ`ƒFƒbƒN‚µ‚È‚¢‚悤‚ÉC³B
-Eƒ‚ƒ“ƒNƒXƒLƒ‹ŽO’i¶‚Ì•\Ž¦‚ðƒpƒbƒVƒu‚É•ÏXB
-Eƒ}ƒbƒvƒtƒ‰ƒO‚ðƒZƒbƒg‚·‚鎞dummy‚ª‚È‚­‚Ä‚àƒZƒbƒg‚Å‚«‚é‚悤‚ÉC³B
-(mapflag nomomo dummy‚©‚çmapflag nomemo‚Å‚à‘åä•v‚Ȃ悤‚É•ÏXB)
-–¢ƒeƒXƒgB
- (/db)
- item_db.txt C³B
- skill_db.txt C³B
- (/map)
- skill.c
- skill_check_condition()Askill_additional_effect() C³B
- skill_status_change_start() C³B
- npc.c
- do_init_npc() C³B
-
---------------
-//0557 by huge
-
-E–î‚ðA‹|‘•”õŽž‚Ì‚Ý‘•”õ‚Å‚«‚é‚悤‚ÉC³B
-E‹|‚ð‘•”õ‚©‚çŠO‚µ‚½‚çA–î‚àŠO‚ê‚é‚悤‚ÉC³B
-E–î‚ðÁ”ï‚·‚éƒXƒLƒ‹‚ð‚¢‚­‚‚©C³B
-E‘é‚ðA‹|‚ð‘•”õ‚µ‚Ä‚¢‚é‚Æ‚«‚Ì‚Ý”­“®‚·‚é‚悤‚ÉC³B(–¢ƒeƒXƒg)
-
- pc.c
- pc_equipitem() C³B
- pc_unequipitem() C³B
- skill.c
- skill_additional_effect() C³B
- skill_check_condition() C³B
-
---------------
-//0555 by Ž€_
-
-Eׂ©‚¢C³‚ƃvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒXAŒÃ‚¢Šª•¨‚̃oƒOC³B
-E@ƒRƒ}ƒ“ƒh@refineA@produce­‚µC³B
-EƒT[ƒo[‚ÌIP‚ÉDNS–¼‚ðŽg‚¦‚é‚悤‚É•ÏXB(¡‚³‚ç‚Å‚·‚ªYare‚©‚ç
-Ž‚Á‚Ä‚«‚½•¨‚Å‚·B)
-EƒXƒeƒB[ƒ‹ŒvŽZŽ®•ÏX‚ÆMVPƒAƒCƒeƒ€ˆ—•ÏXB
-E“XNPC‚ð—˜—p‚É‚æ‚éƒWƒ‡ƒuŒoŒ±’lŠl“¾ŒvŽZŽ®•ÏXB
- Šl“¾ƒWƒ‡ƒuŒoŒ±’l = ln(‹à*ƒXƒLƒ‹ƒŒƒxƒ‹) * shop_exp / 100
-E‚Ù‚Æ‚ñ‚ǃeƒXƒg‚µ‚Ä‚È‚¢‚̂ŃoƒO‚̉”\«‚ª‚ ‚è‚Ü‚·B
- help.txt C³B
- (/conf)
- atcommand_athena.conf C³B
- battle_athena.conf C³B
- (/db)
- item_db.txt C³B
- (/doc)
- conf_ref.txt C³B
- (/char)
- char.c
- do_init()Acheck_connect_login_server() C³‚Æ­‚µC³B
- (/map)
- mob.c
- mob_damage() C³B
- pc.c
- pc_getitemfromcart()Apc_steal_item() C³B
- pet.c
- pet_return_egg()Apet_get_egg()Apet_unequipitem() C³B
- script.c
- buildin_getitem() C³B
- skill.c
- skill_produce_mix() C³B
- storage.c
- storage_storageget() C³B
- atcommand.c C³B
- map.c
- map_config_read() C³‚Æ­‚µC³B
- chrif.c
- check_connect_char_server()Ado_init_chrif()Achrif_setip() C³‚Æ­‚µC³B
- npc.c
- npc_buylist()Anpc_selllist() C³B
-
---------------
-//0554 by NOCTURNE
-EƒT[ƒo[SnapShot
-Etoo/addaccount‚Ìíœ
-Ehelp.txt‚ÌXV
-
---------------
-//0553 by ŒÓ’±—–
-
-Eladmin‚̃oƒOC³‚Æ‹@”\’ljÁ
- EƒL[ƒ[ƒh‚É‚æ‚éƒAƒJƒEƒ“ƒgŒŸõ‹@”\’ljÁ
- EƒVƒFƒ‹ƒRƒ}ƒ“ƒh‚Æ‚µ‚ÄŽg—p‚Å‚«‚é‚悤‚Ƀvƒƒ“ƒvƒg‚ðŽg‚í‚È‚¢ƒ‚[ƒh’ljÁ
- E’ljÁ‹@”\‚ɂ‚¢‚Ä‚Íladmin‚ðŒ©‚Ä‚­‚¾‚³‚¢
- E ladmin‚Ì--makesymlink‚É‚æ‚èAƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚Äaddaccount‚ð
- 쬂·‚邽‚ßAˆÈ‘O‚Ìaddaccount‚Í휂·‚é•K—v‚ª‚ ‚è‚Ü‚·B
- ‚±‚ê‚ç‚̃Vƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN(Cygwin‚ł̓Vƒ‡[ƒgƒJƒbƒg)‚ÆA
- ŒÃ‚¢addaccount‚ÍŽIsnapshot‚É‚ÍŠÜ‚Ü‚È‚¢‚ʼnº‚³‚¢B
-
- (tool/)
- ladmin
- ‹@”\’ljÁ‚ÆC³
-
-E—«ƒAƒJƒEƒ“ƒg‚µ‚©ì¬‚Å‚«‚È‚¢ƒoƒOC³
-EladminAcheckversionŽg—pŽžloginƒT[ƒo[‚ª–\‘–‚·‚éƒoƒOC³
-EGMƒAƒJƒEƒ“ƒgŽü•Ó‚ÌID‚ð”ð‚¯‚é‚½‚ß‚ÉSTART_ACCOUNT_NUM‚ð•ÏX
- (Šù‚ÉGMƒAƒJƒEƒ“ƒg‚Í”ð‚¯‚éŽd—l‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA¬—–hŽ~‚Ì‚½‚ß)
-
- (login/)
- login.h
- START_ACCOUNT_NUM‚ð500000‚©‚ç2000000‚É•ÏX
- login.c
- 7532(Ø’f)ƒpƒPƒbƒg‚̈—C³
- mmo_auth_new()C³
-
-Ebackup‚ªƒoƒbƒNƒAƒbƒv‚·‚éƒtƒ@ƒCƒ‹‚Épet.txt‚ð’ljÁ
- (tool/)
- backup
- ƒtƒ@ƒCƒ‹’ljÁC³
-
---------------
-//0552 by Ž€_
-
-EˆÀ’è«‚ðã‚°‚éˆ×‚ÌC³‚Å‚·‚ª–{“–‚ɈÀ’è«ã‚ª‚Á‚½‚©
-‚Ç‚¤‚©‚Í•s–¾‚Å‚·B
-EPVP‚É‚æ‚èƒNƒ‰ƒCƒAƒ“ƒg‚ª—Ž‚¿‚é–â‘èC³B
- atcommand.c
- @pvpoffA@pvponA@gvgonA@gvgoff C³B
- script.c
- buildin_pvpon()Abuildin_pvpoff()Abuildin_gvgon()Abuildin_gvgoff() C³B
- clif.c
- clif_pvpset() C³B
- skill.c
- skill_attack()Askill_unit_onplace()Askill_unit_onout() C³B
- skill_unit_ondelete() C³B
-
---------------
-//0551 by Kalen
-EDBC³
- db/create_arrow_db.txt Š®¬
- SourceID‡‚Ƀ\[ƒg‚µ‚Ü‚µ‚½B
-
---------------
-//0550 by huge
-
-E–î쬃XƒLƒ‹ŽÀ‘•
-
- clif.c
- clif.h
- clif_arrow_create_list() ’ljÁ
- clif_arrow_created() ’ljÁ
- clif_parse() C³
-
- pc.c
- pc_search_inventory() C³
-
- skill.c
- skill.h
- skill_arrow_db() ’ljÁ
- skill_readdb() C³
- skill_castend_damage_id() C³
-
- db/create_arrow_db.txt ’ljÁ
- db/skill_db.txt C³
-
- ‚Ü‚¾db‚Í–¢Š®¬‚Å‚·B
-
---------------
-//0549 by Kalen
-
-Emap_athena.conf
- ƒIƒŠƒWƒiƒ‹ƒXƒNƒŠƒvƒgA‹GߌÀ’èƒXƒNƒŠƒvƒg‚ð®“Ú
- shop3.txt’ljÁ
-
-EŠeŽíNPC’ljÁ•C³
- npc_event_yuno.txt [’ljÁ]ƒWƒ…ƒm[ƒCƒxƒ“ƒg(ÂÎ5ŒÂGET)
- npc_cTower.txt [’ljÁ]’nã’n‰º‚ÌŒ®NPC
- npc_town_yuno.txt [C³]‘䎌C³
-
- npc_event_carnival.txt [’ljÁ]‹ŒŽIƒJ[ƒjƒoƒ‹ƒCƒxƒ“ƒgŽž‚ÌNPC
-
---------------
-//0548 by huge
-
-E–î‚ð‘•”õ‚µ‚½Žž‚Ì•\Ž¦ƒoƒO–â‘è‚ðC³B
- clif.c
- clif_arrowequip() C³B
- pc.c
- pc_equipitem() C³B
-
-‚ ‚Æ‚ÍAƒ}ƒbƒv‚ðˆÚ“®‚·‚邽‚Ñ‚É‘•”õ‚ªŠO‚ê‚¿‚Ⴄ“_‚Å‚·‚ËEEEB
-
---------------
-//0547 by Ž€_
-
-EˆÀ’è«‚ðã‚°‚éˆ×‚ÌC³‚Æׂ©‚¢C³B
-EƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”»’è‚ð‚µ‚Ä‚¢‚éŠÔƒƒ‚ƒŠ[‚ð‰ðœ‚Å‚«‚È‚¢‚悤‚É•ÏXB
- map.c
- map_foreachinarea()Amap_foreachinmovearea() C³B
- map_foreachobject() C³B
- block_free_max‚ð32000‚©‚ç50000‚É•ÏXB
- pc.c
- pc_calcstatus() C³B
- skill.c
- do_init_skill()Askill_unit_timer()Askill_status_change_clear() C³B
- skill.cAbattle.cAbattle.h
- struct battle_config‚Ìsanctury_type‚ðsanctuary_type‚É•ÏXB
- (‰pŒêƒXƒyƒ‹ŠÔˆá‚¢‚ÅC³B)
- battle_athena.conf
- sanctury_type‚ðsanctuary_type‚É•ÏXB
- conf_ref.txt
- sanctury_type‚ðsanctuary_type‚É•ÏXB
-
---------------
-//0546 by Ž‚Žqo^.^o
-
-conf/npc_shop2.txt
-DƒoˆêƒhAƒ_ƒ“ƒTˆê—p‚Ì•ŠíBƒRƒ‚ƒh‚Ì•Ší‰®‚Ŕ̔„‚µ‚Ä‚¢‚éB
-Dƒ‚ƒ“ƒN—p‚Ì•ŠíBƒJƒsƒgˆêƒŠƒiC“¹‰@‚Ŕ̔„‚µ‚Ä‚¢‚éB
-
---------------
-//0545 by Ž€_
-
-EƒuƒŠƒbƒc‚̃_ƒ[ƒW‚ðŽ©“®‚Å•ªŽUAŽè“®‚Å•’Ê‚É‚È‚é‚悤‚É•ÏXB
-EƒI[ƒgƒuƒŠƒbƒcƒoƒOC³B(‚±‚ê‚Å‘åä•v‚¾‚Æ‚¢‚¢‚¯‚Ç...)
- map.c
- block_free_max‚ð16000‚©‚ç32000‚ÉC³B
- block_list_max‚ð4096‚©‚ç5120‚ÉC³B
- battle.c
- battle_weapon_attack() C³B
- skill.c
- skill_attack()Askill_castend_damage_id() C³B
-
---------------
-//0544 by Diex
-E–Ò—´Œ‚©‚爢C—…”e™€Œ‚ւ̃Rƒ“ƒ{ŽÀ‘•B
-Eˆ¢C—…”e™€Œ”­“®ŒãA“G‚Ì”wŒã‚Ɉړ®‚·‚é‚悤AC³B
-EŽO’i¶‚̃_ƒ[ƒWC³B
- (/map)
- skill.c
- skill_castend_damage_id() C³B
- skill_check_condition() C³B
- skill_use_id() C³B
- pc.c
- pc_attack_timer() C³B
- pc_authok() C³B
- battle.c
- battle_calc_weapon_attack() C³B
- battle.h
- struct Battle_Config C³B
- map.h
- struct map_session_data C³B
- (/conf)
- battle_athena.conf C³B
-
-‚Í‚Á‚«‚è‚¢‚Á‚ăRƒ“ƒ{Œq‚°‚Â炢‚Å‚·B‚»‚Ì‚½‚߈¢C—…‚ւ̃Rƒ“ƒ{‚Í‚©‚È‚èŠÃ‚¢”»’è‚É
-‚µ‚Ä‚Ü‚·iˆêŽž“I‚É‚Å‚·‚ªjBŒq‚°‚Â炯‚ê‚Îbattle_athena.conf‚Ì‚Ù‚¤‚Ńfƒ…ƒŒƒCŽž
-ŠÔ‚ð‘å‚«‚­‚µ‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B
- “®‰æŒ©‚Ä‚Ä‹C‚¢‚½‚Ì‚Å‚·‚ªAˆ¢C—…”e™€Œ‚Í–Ò—´Œ‚ª”­“®‚µ‚½ŒãA‘¦Žž”­“®‚̃XƒL
-ƒ‹‚É•Ï‚í‚Á‚Ä‚é‚悤‚È‚Ì‚Å‚·B‘¼—Í–{Šè‚Å‚·‚ªAˆ¢C—…‚܂ł̃Rƒ“ƒ{‚̃pƒP‚ð‹L˜^‚µ‚½
-•¨‚ð‚Ç‚È‚½‚©ƒAƒbƒv‚µ‚Ä‚à‚炦‚È‚¢‚Å‚µ‚傤‚©HÚׂª‚í‚©‚莟‘æAC³‚µ‚Ü‚·B
-
---------------
-//0543 by Ž€_
-
-EƒuƒŠƒbƒc‚̃_ƒ[ƒW‚𕪎U‚³‚ê‚é‚悤‚É•ÏXB
-E•’ʂ̃AƒJƒEƒ“ƒgì‚è‚Å‚ÍGMƒAƒJƒEƒ“ƒg‚ðì‚ê‚È‚¢‚悤‚É•ÏXB
-(‘O‚ÉŽ©•ª‚ª“ü‚ꂽ•¨‚ª‚È‚­‚È‚Á‚½‚Ì‚Å–ß‚µ‚½‚¾‚¯‚Å‚·‚ª...)
-EŽæ‚芪‚«‚ªŽå‚ƈê‚ÉŽ€‚ʂ悤‚É•ÏXB(‚½‚¾‚¿‚å‚Á‚Æd‚­‚È‚é
-‰Â”\«‚ª‚ ‚è‚Ü‚·B) –¢ƒeƒXƒgB
-EMVPŒoŒ±’l‚ª•\Ž¦‚¾‚¯‚³‚ê‚ÄŽÀÛ‚É‚Í“ü‚Á‚Ä‚È‚¢–â‘èC³B
- (/login)
- login.c
- mmo_auth_new() C³B
- (/map)
- skill.c
- skill_castend_damage_id() C³B
- battle.c
- battle_calc_misc_attack() C³B
- mob.c
- mob_damage() C³B
- mob_deleteslave()Amob_deleteslave_sub() ’ljÁB
-
---------------
-//0542 by Ž€_
-
-EƒI[ƒgƒuƒŠƒbƒcƒoƒOC³B(¡“x‚±‚»‘åä•v‚Ì‚Í‚¸...)
-EŽ©•ª‚ÉŽg‚Á‚½ƒq[ƒ‹‚Å‚ÍŒoŒ±‚ª“ü‚ç‚È‚¢‚悤‚É•ÏXB
-E“XNPC‚ð—˜—p‚É‚æ‚éƒWƒ‡ƒuŒoŒ±’lŠl“¾ŒvŽZŽ®•ÏXB
- Šl“¾ƒWƒ‡ƒuŒoŒ±’l = ln(‹à) * shop_exp / 100
-‚É‚È‚è‚Ü‚·B
-log‚ðŽg‚¤‚±‚Æ‚Å‹à‚ª‘½‚­‚Ä‚à“ü‚éŒoŒ±’l‚ª‘½‚­“ü‚ç‚È‚¢‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
- (/map)
- battle.c
- battle_damage() C³B
- skill.c
- skill_attack()Askill_castend_damage_id() C³B
- skill_castend_nodamage_id C³B
- npc.c
- npc_buylist()Anpc_selllist() C³B
- map.c
- map_foreachinarea()Amap_foreachinmovearea()Amap_foreachobject()
- C³B(‘債‚½C³‚Å‚Í‚È‚¢‚Å‚·B)
- (/conf)
- battle_athena.conf C³B
- (/doc)
- conf_ref.txt C³B
-
---------------
-//0541 by huge
-
-E–î‚ð‚Ü‚Æ‚ß‚ÄŽ‚Ä‚é‚悤‚ÉC³B
-E‹|‚ÅUŒ‚‚µ‚½‚Æ‚«‚ÉA‘•”õ‚µ‚Ä‚¢‚é–î‚ðÁ”ï‚·‚é‚悤‚ÉC³B
-
- itemdb.c
- itemdb_search() C³
- itemdb_isequip() C³
-
- battle.c
- battle_weapon_attack() C³
- battle_calc_weapon_attack() C³
-
- clif.c
- clif.h
- clif_arrow_fail() ’ljÁ
- clif_parse_EquipItem() C³
-
---------------
-//0540 by Ž€_
-
-EƒoƒOC³‚Æ–â‘è‚ ‚è‚»‚¤‚ÈŠC³B(‚±‚ê‚ÅWZ_FIREPILLAR‚ƃuƒŠƒbƒc‚É
-‚æ‚éŽIƒ_ƒEƒ“‚Í‚È‚­‚È‚é‚Í‚¸...)
- map.c
- map_foreachinarea()Amap_foreachinmovearea() C³B
- skill.c
- skill_unitsetting()Askill_delunitgroup() C³B
- pc.c
- pc_damage() C³B
- battle.c
- battle_damage() C³B
- npc.c
- npc_parse_mob() C³B
- mob.c
- mob_spawn_dataset() C³B
-
---------------
-//0539 by Ž€_
-
-Eclif_pvpset()‚ðƒ}ƒbƒv‚©‚çAREA‚©ƒ}ƒbƒv‚©‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB(pvp‚ÌŽž‚̈—‚Í0535ˆÈ‘O‚Ì•¨‚É–ß‚»‚Ü‚µ‚½BŽ©•ª‚¾‚¯‚É“]‘—‚µ‚Ä‚à‚¢‚¢‚悤‚È‹C‚à‚µ‚Ü‚·‚ª...)
- clif.hAclif.c
- clif_pvpset() C³B
- clif_parse_LoadEndAck() C³B
- script.c
- buildin_pvpoff() C³B
- buildin_pvpon() C³B
- atcommand.c C³B
-EUŒ‚“r’†‚ŃAƒCƒeƒ€‚ðE‚¤‚ÆUŒ‚‚ªŽ~‚Ü‚é‚悤‚ÉC³B
- pc.c
- pc_takeitem() C³B
-E0535à–¾‚ª”š—ô”g“®‚É‚È‚Á‚Ä‚¢‚邪‚»‚ê‚Í‹à„‚ÉŠÔˆá‚¢‚Å‚·B
-E0537‚Åà–¾‚ð–Y‚ê‚Ü‚µ‚½‚ªƒ‚ƒ“ƒXƒ^[‚Ìdef‚Æmdef‚ð10000ˆÈã‚ÉÝ’è‚·‚ê‚ΑS‚Ä‚ÌUŒ‚‚É1ƒ_ƒ[ƒW‚ɂȂ郂ƒ“ƒXƒ^[‚É‚È‚è‚Ü‚·B‚»‚µ‚ă‚ƒ“ƒXƒ^[î•ñ‚Ådef‚Æ
-mdef‚ª10000ˆÈã‚Ìê‡def 100Amdef 99‚É•\Ž¦‚·‚é‚悤‚É•ÏXB–{ŽIŽd—l‚É
-‚·‚é‚É‚Ímob_db.txt‚ðC³‚µ‚Ä‚­‚¾‚³‚¢B
-
---------------
-//0538 by huge
-
-EƒOƒŠƒ€ƒgƒD[ƒX‚ð”͈ÍUŒ‚‚ÉC³
-EƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒNŽÀ‘• (—LŒø”͈͂Á‚ÄA‚±‚ê‚Å‚ ‚Á‚Ä‚é‚Ì‚©‚ÈH)
-EƒoƒbƒNƒXƒ^ƒu‚̉¼ŽÀ‘•
- –{ŽI‚Å‚â‚Á‚Ä‚él‚©‚ç˜b‚ð•·‚¢‚ÄAꊎw’肶‚á‚È‚­‚Ä
- ƒ^ƒQŽæ‚Á‚Ä‚à—Ç‚³‚»‚¤‚¾‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½Bi‚â‚è‚â‚·‚©‚Á‚½‚Ì‚Å (^^;
- ‚Ü‚¾Amob‚ÌŒã‚ë‚É‹‚é‚©‚Ç‚¤‚©‚Ì”»’è‚Í“ü‚Á‚Ä‚Ü‚¹‚ñB
-
-Ebattle.c
- battle_calc_weapon_attack() C³
-
-Eskill.c
- skill_additional_effect() C³
- skill_castend_damage_id() C³
- skill_check_condition() C³
- skill_use_id() C³
- skill_castend_nodamage_id() C³
-
-Eskilldb.txt
- ƒoƒbƒNƒXƒ^ƒu‚ÌŽí—Þ‚ð[êŠ]‚©‚ç[“G]‚Ö•ÏX
-
---------------
-//0537 by Ž€_
-
-EƒXƒeƒB[ƒ‹ƒoƒOC³‚Æbattle_athena.conf‚Ì€–ڒljÁAŽd—l•ÏX‚Æׂ©‚¢C³‚Å‚·B
-(ƒXƒeƒB[ƒ‹‚ÍŒvŽZŽ®‚É–â‘肪‚ ‚Á‚½‚Ì‚ÅC³‚µ‚ÄŠm—¦‚ðX‚É—Ž‚Æ‚µ‚Ü‚µ‚½B)
- battle.h
- finger_offencive_type‚ðfinger_offensive_type‚ÉC³B(‰pŒêƒXƒyƒ‹ŠÔˆá‚¢‚ÅC³‚µ‚Ü‚µ‚½B)
- struct battle_config‚Érestart_hp_rateArestart_sp_rate ’ljÁB
- battle.c
- battle_calc_weapon_attack()Abattle_calc_magic_attack() C³B
- skill.c
- skill_attack() C³B
- clif_skill_nodamage()‚ɃXƒLƒ‹ƒŒƒxƒ‹‚ð‘—‚é‚悤‚É•ÏXB(M‚³‚ñ‚ÌŽw“E‚É‚æ‚èC³B)
- clif.c
- clif_skill_estimation() C³B
- conf_ref.txt
- finger_offencive_type‚ðfinger_offensive_type‚ÉC³‚Æ­‚µ’ljÁB
- mob.c
- mob_ai_sub_hard()Amob_target()Amob_damage() C³B
- pc.c
- pc_steal_item() C³B
- atcommnad.cAatcommnd.h
- @ƒRƒ}ƒ“ƒh@gvgon , @gvgoff ’ljÁB
- battle_athena.conf
- finger_offencive_type‚ðfinger_offensive_type‚ÉC³‚Æ­‚µ’ljÁB
-
---------------
-//0536 by hogefuga3 (Athena staff)
-
-EVGRFƒtƒ@ƒCƒ‹ƒtƒH[ƒ}ƒbƒg‘Ήž
-@- Athena staff —l‚Ì쬂³‚ꂽƒpƒbƒ`‚ð“K—p‚µ‚Ü‚µ‚½B
- XV—š—ð‚Ì•”•ª‚̓pƒbƒ`ƒ~ƒX‚É‚È‚Á‚½‚Ì‚ÅŽè“®‚Å‘g‚Ýž‚ÝB
-
-i•ÏXj
- common/
- grfio.c
-
---------------
-//0535 by Ž€_
-
-E0533‚Ì–â‘肪‚ ‚è‚»‚¤‚È•”•ª‘S‚ÄC³BC³‚µ‚½Š‚ð‘S•”ƒ`ƒFƒbƒN‚µ‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯...
-EƒXƒNƒŠƒvƒgsetmapflagnosave ’ljÁB
- setmapflagnosave ƒ}ƒbƒv–¼AƒZ[ƒu‚·‚éƒ}ƒbƒv–¼AÀ•W(XAY)
- nosaveƒtƒ‰ƒO‚ðon‚É‚µ‚Ü‚·B
-Ebattle_athena.conf‚ɒljÁ‚ƈꕔŽd—l•ÏXB(Ú‚µ‚­‚Íconf_ref.txt‚ðŽQl‚µ‚Ä‚­‚¾‚³‚¢B)
-Eƒ‚ƒ“ƒXƒ^[‚Ìdef‚Æmdef‚ª10000ˆÈã‚ÌꇑS‚Ä‚ÌUŒ‚(ƒNƒŠƒeƒBƒJƒ‹ŠÜ‚ß‚Ä)‚ª1ƒ_ƒ[ƒW‚É‚È‚é‚悤‚É•ÏXB(ƒgƒ‰ƒbƒv‚âƒuƒŠƒbƒc‚Ìꇗ¼•û‚ª10000ˆÈã‚Ìꇂ̂Ý1‚É‚È‚è‚Ü‚·B) ‘‚ƃLƒmƒR‚É‚Pƒ_ƒ[ƒWŒÅ’è‚Í휂µ‚Ü‚µ‚½B(Œ³X–{ŽI‚Å‚à1ŒÅ’è‚Å‚Í‚È‚¢‚Å‚·B¸—û“™‚É‚æ‚éˆø‚«ã‚°ƒ_ƒ[ƒW‚Í‚»‚Ì‚Ü‚Üo‚Ü‚·‚Ì‚Å... ŒÅ’肵‚½‚¢‚Ì‚È‚çdef‚Æmdef‚ð10000‚É‚µ‚Ä‚­‚¾‚³‚¢BŽÀ‚Í‚±‚ê‚̓NƒŠƒXƒ^ƒ‹‚ɈׂÉì‚낤‚Æ‚µ‚½•¨‚Å‚·‚ª...)
-E”š—ô”g“®‚ÌŽžƒAƒCƒeƒ€‚É‚æ‚éƒXƒLƒ‹‚ÍŽg—p‚Å‚«‚é‚悤‚ÉC³B
-E‚»‚Ì‘¼­‚µC³B(C³‚Ì•¨‚Ì’†‚ɃeƒXƒg‚µ‚Ä‚È‚¢•¨‚à‚ ‚è‚Ü‚·B)
- (/doc)
- conf_ref.txt C³B
- (/conf)
- battle_athena.conf C³B
- (/map)
- battle.h C³B
- battle.c C³B
- mob.h C³B
- mob.c C³B
- skill.c C³B
- npc.c C³B
- pc.c C³B
- script.c C³B
- clif.c C³B
- chrif.c C³B
-
---------------
-//0534 by Diex
-
-EƒRƒ“ƒ{ƒVƒXƒeƒ€‰¼ŽÀ‘•
- map/
- battle.c
- battle_weapon_attack() C³B
- clif.c
- clif.h
- clif_combo_delay()@ŠÖ”’ljÁB
- map.h
- map_session_data@•Ï”’ljÁB
- pc.c
- pc_authok()@•Ï”’ljÁB
- pc_attack_timer()@C³B
- skill.c
- skill_castend_damage_id()@C³B
- skill_check_condition@C³B
- skill_use_id@C³B
- db/
- skill_db.txt@C³B
-
-’j–Ò—´Œ‚©‚爢C—…”e–PŒ‚É‚Í‚Ü‚¾‚‚Ȃ°‚Ü‚¹‚ñB
- ˆ¢C—…”e–PŒ‚ð•ú‚Á‚½ŒãAPC‚ÍMOB‚Ì”wŒã(?)‚Ɉړ®‚µ‚Ä‚é‚Á‚Û‚¢‚Ì‚Å‚·‚ªA
-@@‚»‚±‚ç‚Ö‚ñ‚Ìî•ñ‚ª‘«‚è‚Ü‚¹‚ñBî•ñ’ñ‹Ÿ‚¨Šè‚¢‚µ‚Ü‚·B
-
---------------
-//0533 by ‚é‚é‚é
-
-E‘‚ƃLƒmƒR‚É‚Pƒ_ƒ[ƒWŒÅ’è
-battle.c ‚Ì battle_weapon_attack() ‚Æ battle_calc_attack() ‚ðC³
-battle.c ‚Ì battle_get_mobid() ‚ð’ljÁ
-mob.c ‚Ì mob_makedummymobdb() ‚Æ mob_readdb() ‚ðC³
-
-EƒXƒLƒ‹ƒƒO‚Ƀ‚ƒu‚̌ŗL”Ô†•‚o‚b‚Ì‚h‚c”Ô†‚ð•\Ž¦
-ibattle.c ‚Ì battle_get_mobid() ‚ð’ljÁ‚µ‚½‚Ì‚Å‚»‚̂‚¢‚Å‚Éj
-mob.c skill.c ‚Ì•ÏX‰ÓŠ‘½”iŠ¾
-i"MOB %d" ‚à‚µ‚­‚Í "PC %d" ‚ÅŒŸõ‚·‚ê‚ΕÏX‰ÓŠ‚ª‚í‚©‚é‚©‚Æj
-
-Eƒnƒ“ƒ^[‚Ìã©‚ðŽg‚Á‚½ƒXƒLƒ‹‚Åã©‚ðÁ”ï‚·‚é‚悤‚É‚µ‚½
-batttle.c ‚Ì skill_check_condition() ‚ðC³
-iƒWƒFƒ€Á”‚Ì—¬—p‚Á‚Û‚¢‚±‚Æ‚ð‚â‚Á‚Ä‚é‚ñ‚¾‚¯‚Lj—’†g‚Í—‰ð‚µ‚Ä‚È‚¢‚—j
-
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ•ƒ}ƒOƒkƒX‚̃_ƒ[ƒW”»’è‚ð•sŽ€‘®«•ˆ«–‚Ží‘°‚ÉÄ“xC³
-0532‚ÅÄ‚ÑŒ³‚É–ß‚Á‚Ä‚µ‚Ü‚Á‚½‚Ì‚ð‚È‚¨‚µ‚Ü‚µ‚½B
-‚½‚¾‚µA‰ñ”•l””»’è‚É‚ÍŽè‚ð‰Á‚¦‚Ä‚¢‚Ü‚¹‚ñi‚Á‚Ä‚©Ž©•ª‚É‚Í‚Ü‚¾ƒ€ƒŠj
-
-ˆÈãB
-Ø‚Á‚½“\‚Á‚½‚ÌŒ©—lŒ©^Ž—‚Å‚â‚Á‚½‚Ì‚ÅŒ¾Œê“I‚ɉʂ½‚µ‚Ä‚±‚ê‚Å‚æ‚¢‚Ì‚©BBB
-‚à‚µˆ—•û–@‚É–â‘è—L‚肾‚Á‚½‚çC³‚È‚è‚ð‚µ‚Ä‚¢‚½‚¾‚¯‚é‚ÆŠð‚µ‚¢‚Å‚·B
-
---------------
-//0532 by Ž€_
-
-EC³‚µ‚½Š‚ð‘S‘Rƒ`ƒFƒbƒN‚µ‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯...Š¾
-Emapflag‚Énopenalty’ljÁBŽg—p•û–@‚Í
- mapflag nopenalty dummy
-‚Å‚·B‹@”\‚Í‚»‚̃}ƒbƒv‚ÅŽ€‚ñ‚¾ŽžŒoŒ±‚ªŒ¸‚ç‚È‚¢‚悤‚É‚µ‚Ü‚·B
-Emapflag‚Épvp_nopartyApvp_noguildAgvgAgvg_noparty’ljÁB
-pvp_noparty‚ÍPVPƒ‚[ƒh‚Å“¯‚¶ƒp[ƒeƒB‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢Apvp_noguild‚ÍPVPƒ‚[ƒh‚Å“¯‚¶ƒMƒ‹ƒh‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢Agvg‚̓V[ƒYƒ‚[ƒh‚ÉAgvg_noparty‚̓V[ƒYƒ‚[ƒh‚Å“¯‚¶ƒp[ƒeƒB‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢•¨‚Å‚·B
-E‰Â“®‚µ‚Ä‚È‚¢ƒ^ƒCƒ}[‚Í‘S‚Ä-1‚É‚È‚é‚悤‚É•ÏXB
-E‚«”ò‚΂µˆ—C³B
-Eƒ}ƒbƒvƒ[ƒh’¼Œã‹CŒ÷‚ªŒ©‚¦‚È‚¢–â‘èC³B
-EŽc‰e‚̈—C³B
-Eƒ}ƒbƒv‚ðƒ[ƒh‚·‚é‚ÆŽ€‚ñ‚¾‚ӂ肪‰ðœ‚³‚ê‚é‚悤‚É•ÏXB
-EPVP‚ð­‚µ•ÏXB
-EŒÃ–Ø‚ÌŽ}‚Åo‚郂ƒ“ƒXƒ^[‚ðŽ©•ª‚̃Œƒxƒ‹‚æ‚è‚‚¢•¨‚Ío‚È‚¢‚悤‚É•ÏXB
-E‰Á‘¬ƒ|[ƒVƒ‡ƒ“‚Ìsc_start SC_SpeedPot0,1,0;‚ðsc_start SC_SpeedPot0,1800,0;‚̂悤‚É•ÏXBSC_SpeedPotH‚ÌŒã‚Ì”’l‚ÍŽ‘±ŽžŠÔ‚Å‚·B(’PˆÊ‚Í•b)
-E@ƒRƒ}ƒ“ƒh@pvp‚ð@pvpon‚É•ÏX‚Æ@pvpon‚Æ@pvpoffA@gat‚Ì‹@”\•ÏXB
-Ebattle_athena.conf‚ÌpvpíœB
-Ebattle_athena.conf‚Édeath_penalty_type’ljÁB
-Eƒyƒiƒ‹ƒeƒB‚Ì“K—p‚ðŽ€‚ñ‚¾Žž‚©‚玀‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚µ‚½Žž‚É•ÏXB(ƒŠƒU‚Å•œŠˆ‚·‚é‚ÆŒoŒ±‚ªŒ¸‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚ª‚©‚È‚è‹C‚É‚¢‚ç‚È‚©‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½B)
-EƒXƒNƒŠƒvƒgsetmapflagAremovemapflagApvponApvpoffAgvgonAgvgoff’ljÁB
- setmapflag ƒ}ƒbƒv–¼Aƒ}ƒbƒvƒtƒ‰ƒOƒ^ƒCƒv
- Žw’肵‚½ƒ}ƒbƒvƒtƒ‰ƒO‚ðon‚µ‚Ü‚·B(‚½‚¾pvpAgvg‚ÍpvponAgvgon‚Å‚Å‚«‚é‚Ì‚ÅŽw’肵‚Ä‚à“®ì‚µ‚Ü‚¹‚ñB‚ ‚Ænosave‚Ìꇈ—‚ª‚¿‚å‚Á‚Æ•¡ŽG‚É‚È‚é‚̂őΉž‚µ‚Ä‚Ü‚¹‚ñB)
- removemapflag ƒ}ƒbƒv–¼Aƒ}ƒbƒvƒtƒ‰ƒOƒ^ƒCƒv
- Žw’肵‚½ƒ}ƒbƒvƒtƒ‰ƒO‚ðoff‚µ‚Ü‚·B(‚½‚¾pvpAgvg‚ÍpvpoffAgvgoff‚Å‚Å‚«‚é‚Ì‚ÅŽw’肵‚Ä‚à“®ì‚µ‚Ü‚¹‚ñB‚±‚¿‚ç‚Ínosave‚à‰Â”\‚Å‚·B)
- pvpon ƒ}ƒbƒv–¼
- Žw’肵‚½ƒ}ƒbƒv‚ðPVPƒ‚[ƒh‚É‚µ‚Ü‚·B
- pvpoff ƒ}ƒbƒv–¼
- Žw’肵‚½ƒ}ƒbƒv‚ÌPVPƒ‚[ƒh‚ð‰ðœ‚µ‚Ü‚·B
- gvgon ƒ}ƒbƒv–¼
- Žw’肵‚½ƒ}ƒbƒv‚ðƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
- gvgoff ƒ}ƒbƒv–¼
- Žw’肵‚½ƒ}ƒbƒv‚̃V[ƒYƒ‚[ƒh‚ð‰ðœ‚µ‚Ü‚·B
-‚½‚¾‘S‚ẴXƒNƒŠƒvƒg‚Ì“®ì‚ÍŠm”F‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-EƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚̈—‚ð0529‚É–ß‚µ‚Ü‚µ‚½B
-Ž©•ª‚Ì’²¸‚ł̓Tƒ“ƒNƒ`ƒ…ƒAƒŠ‚Íl”‚̧ŒÀ‚ª‚ ‚è‚Ü‚·B(ƒŒƒxƒ‹1‚Å4–¼‚Å
-1ƒŒƒxƒ‹‚Ɉêl‚¸‚‘‚¦‚Ü‚·B)
-E‚»‚̌㭂µC³B(‚µ‚½‚Í‚¸...)
- (db/)
- const.txt C³B
- item_db.txt C³B
- (conf/)
- battle_athena.conf C³B
- (doc/)
- conf_ref.txt C³B
- (map/)
- clif.hAclif.c C³B
- mob.c C³B
- pc.hApc.c C³B
- skill.c C³B
- pet.c C³B
- npc.c C³B
- map.hAmap.c C³B
- battle.hAbattle.c C³B
- atcommand.hAatcommand.c C³B
- script.c C³B
- makefile C³B
-
---------------
-//0531 by Ž‚Žqo^.^o
-
-conf/npc_turtle.txt
-Dƒ^[ƒgƒ‹ƒAƒCƒ‰ƒ“ƒh‚És‚­ŽžAƒTˆêƒoˆê‚ð—Ž‚Á‚Ä–â‘èC³
-Dnpc_turtle.txt‚Ì508s–Ú
-set Zeny - 10000,0; --> set Zeny,Zeny-10000; C³
-
---------------
-//0530 by RR
-EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚ÅUŒ‚‘ÎÛ‚ðƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚©‚ç•sŽ€‘®«/ˆ«–‚Ží‘°‚É•ÏX
-EƒXƒLƒ‹uƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€v‚ÅUŒ‚‘ÎÛ‚ðƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚©‚ç•sŽ€‘®«/ˆ«–‚Ží‘°‚É•ÏX
-EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚̉ñ•œ‰ñ”‚ðl”‚©‚çƒJƒEƒ“ƒg‚É•ÏX
- skill.c
- skill_unit_onplace()C³
- skill_unit_onout()C³
-
-‘½•ª‚±‚ÌŽd—l‚Ň‚Á‚Ä‚é‚Í‚¸‚Å‚·cB
-
---------------
-//0529 by ŒÓ’±—–
-
-EMOB‚ªƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg—p‚·‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éꇂª‚ ‚Á‚½–â‘è‚ðC³
-EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚ÅUŒ‚‘ÎÛ‚ð•sŽ€‘®«‚©‚çƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚É•ÏX
-
- skill.c
- skill_unit_onplace()C³
- skill_castend_nodamage_id()C³
-
-EƒƒOƒCƒ“ƒT[ƒo[‚̃AƒJƒEƒ“ƒgƒf[ƒ^ƒx[ƒX•ÛŽçƒc[ƒ‹‚ð“Y•t
- Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
- Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
- Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
-
- “Á‚É——R‚ª–³‚¢ŒÀ‚èƒAƒJƒEƒ“ƒgì¬‚à‚±‚¿‚ç‚̃c[ƒ‹‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
- addaccount‚̓pƒPƒbƒg‚Ì“s‡ãƒpƒXƒ[ƒh•¶Žš”‚̧ŒÀ‚ª‚«‚‚¢‚Ì‚ÅB
-
- ƒAƒJƒEƒ“ƒg‚ð휂µ‚Ä‚àƒLƒƒƒ‰ƒNƒ^[ƒf[ƒ^A‘qŒÉƒf[ƒ^A
- ‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒgˆÈŠO‚̃f[ƒ^‚ÍÁ‚¦‚Ü‚¹‚ñB‘ŠŽè‚ªƒƒOƒCƒ“’†‚¾‚Á‚½ê‡
- ‹­§Ø’f‚Í‚³‚ê‚Ü‚¹‚ñ‚ªAŽŸ‰ñ‚©‚ç‚̓ƒOƒCƒ“‚Å‚«‚È‚¢‚Í‚¸‚Å‚·B
- i‚‚܂è‚ÍA’P‚Élogin-serverã‚̃AƒJƒEƒ“ƒg‚ðÁ‚µ‚Ä‚¢‚邾‚¯‚Å‚·j
-
- (login/)
- login.c
- parse_admin()’ljÁAparse_login()C³
- (doc/)
- admin_packet.txt
- V‹K’ljÁBŠÇ—ƒpƒPƒbƒgî•ñ
- (tool/)
- ladmin
- login-server administration tool‚ÌPerlƒXƒNƒŠƒvƒg
-
-
---------------
-//0528 by RR
-EƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg—p‚µ‚½Û‚ɉñ•œ—Ê‚É”ä—Ⴕ‚½•ª‚¾‚¯ƒWƒ‡ƒuŒoŒ±’l‚ªŠl“¾‚Å‚«‚é‚悤‚É•ÏX
-E¤lŒnE‹Æ‚ª“XNPC‚ð—˜—p‚µ‚½Û‚ɃWƒ‡ƒuŒoŒ±’l‚ªŠl“¾‚Å‚«‚é‚悤‚É•ÏX
-E—¼•û‚Æ‚àbattle_athena.conf‚Å’²®‰Â”\‚É‚µ‚Ü‚µ‚½B‰ŠúÝ’è‚Í0”{i”ñ“K—pj
-Emap_athena.conf‚É‚Ä‚©‚Ú‚¿‚áƒNƒGƒXƒg‚Ì‚à‚Ì‚ª“ü‚Á‚Ä‚È‚©‚Á‚½‚̂ŃRƒƒ“ƒgƒAƒEƒg‚µ‚È‚ª‚ç’ljÁB
-
- map_athena.conf
-
- battle.c battle_config_read()
- battle.h Battle_Config
- battle_athena.conf
- ˆÈãAbattle_athena.conf—˜—p‚½‚ß‚É•ÏX
-
- pc.c pc_heal()
- –ß‚è’l‚ðhp+sp‚ÉB–ß‚è’l‚ð—˜—p‚µ‚Ä‚é•”•ª‚ª‚È‚³‚»‚¤‚¾‚Á‚½‚Ì‚ÅŽg‚킹‚Ä–á‚¢‚Ü‚µ‚½BƒoƒO‚ª‹N‚«‚½‚ç‚·‚Ý‚Ü‚¹‚ñB
-
- skill.c skill_casted_nodamage_id()‚̃q[ƒ‹•”‚ɂăWƒ‡ƒuŒoŒ±’lŠl“¾‚·‚é‚悤•ÏX
-
- npc.c npc_buylist()
- npc_selllist() •ÏX
- ‚±‚ê‚ç‚Æ‚ÌŒ“‚ˇ‚¢‚Åskill.h‚ðincludeB
-
-
-¤l‚Ì“X—˜—pƒWƒ‡ƒuŒoŒ±’lŠl“¾‚Å‚·‚ªAŒvŽZŽ®‚Í‚Ü‚¾l‚¦’†‚Ȃ̂ʼn¼‚ÅB
-ŒvŽZŽ®‚̓AƒCƒeƒ€w“ü‚ª@‘ã‹à * ƒXƒLƒ‹ƒŒƒxƒ‹iƒfƒBƒXƒJƒEƒ“ƒgj/ ((1{300/ƒAƒCƒeƒ€ŒÂ”) * 4000)
-ƒAƒCƒeƒ€”„‹p‚ª@‘ã‹à * ƒXƒLƒ‹ƒŒƒxƒ‹iƒI[ƒo[ƒ`ƒƒ[ƒWj / ((1{500/ƒAƒCƒeƒ€ŒÂ”) * 4000)‚Å‚·B
-í‚É–î‚ð‚½‚­‚³‚ñˆê‚Éw“ü‚·‚邱‚Æ‚ÅŒoŒ±’l‚𑽗ʂɉ҂®‚±‚Æ‚ª‰Â”\‚Å‚·‚ËcB
-‚Ç‚È‚½‚©‚¢‚¢Ž®‚ðŽv‚¢‚‚¢‚½‚ç•ÏX‚¨Šè‚¢‚µ‚Ü‚·B
-
-‚Æ‚±‚ë‚Å“]ENPC‚ªˆê•”‚©‚Ô‚Á‚Ä‚é‚ñ‚Å‚·‚ªC³‚µ‚È‚¢‚Å‚¢‚¢‚ñ‚Å‚µ‚傤‚©H
-
---------------
-//0527 by Ž€_
-
-E0526‚̃oƒOC³B(ƒeƒXƒg‚ׂ̈ɕς¦‚Ä‚¢‚½•¨‚ð“ü‚ꂽ‚܂܃Aƒbƒv‚µ‚Ä‚µ‚Ü‚Á‚½‚Ì‚ªŒ´ˆö‚Å‚µ‚½B)
- skill.c C³B
- pc.c C³B
- mob.c C³B
- clif.c C³B
-
---------------
-//0526 by Ž€_
-
-E0525‚̃ŠƒUƒŒƒNƒVƒ‡ƒ“‚ðŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉŽg‚¦‚È‚¢ƒoƒOC³B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñ‚ªŽ¡‚Á‚½‚Í‚¸‚Å‚·B‘½•ª...)
- skill.c C³B
- clif.c C³B
-
---------------
-//0525 by Ž€_
-
-Edmotion‚̊Ԃ̓Lƒƒƒ‰‚ª“®‚©‚È‚¢‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB)
-EƒƒeƒI‚̃_ƒ[ƒW•\Ž¦ƒ^ƒCƒ~ƒ“ƒOC³B(­‚µ’x‚¢‹C‚à‚µ‚Ü‚·‚ª...)
-EƒoƒbƒNƒXƒ‰ƒCƒfƒBƒ“ƒO‚ÌŽž‚Ƀ‚[ƒVƒ‡ƒ“‚ªo‚é‚悤‚É•ÏXB(ƒXƒLƒ‹Žg—pŒã
-0.2•bŒã‚ɃXƒLƒ‹Žg—pƒpƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½Bƒ‰ƒO“™‚É‚æ‚Á‚Ä•Ï‚È“®ì‚ð‚·‚é‰Â”\«‚à‚ ‚è‚Ü‚·B)
-E0524‚ÌC³B
-EƒnƒCƒfƒBƒ“ƒO‚µ‚Ä‚¢‚鎞Ž©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏXB
-E0519‚ÅŠÔˆá‚Á‚½conf‚ÌC³‚Æׂ©‚¢ŠC³B
- map.h
- struct map_session_data‚Ìcanmove_tick‚ðcanact_tick‚É•ÏXB
- skillcanmove_tick‚ðcanmove_tick‚É•ÏXB
- skill.c C³B
- pc.c C³B
- pc.h C³B
- clif.c C³B
- battle.c C³B
- battle.h C³B
- mob.c C³B
- mob.h C³B
- char_athena.conf C³B
- map_athena.conf C³B
-
---------------
-//0524 by huge
-
-Eƒ[ƒO ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒuŽÀ‘•
- clif.c
- clif_parse_WalkToXY()
- pc.c
- pc_calcstatus()
-
- ‚Ç‚Ì‚­‚ç‚¢‘¬“xŒ¸­‚·‚é‚Ì‚©•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAŽb’è“I‚É
- speed += speed * (20-ƒXƒLƒ‹ƒŒƒxƒ‹)/40
- ‚ÆA‚µ‚Ü‚µ‚½B–{ŽIŽd—l‚ª•ª‚©‚é•û‹‚Ü‚µ‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·B
-
---------------
-//0523 by NOCTURNE
-
-Enpc_event_rental.txt‚ɃNƒ‹ƒZƒCƒ_[—p‚̃yƒRƒyƒRŠÇ—•º‚ð’ljÁ
---------------
-//0522 by ”g˜Q
-
-Emob_db.txt‚ðƒWƒ…ƒm[Œã‚̃f[ƒ^‚ÉC³
-
---------------
-//0521 by ŒÓ’±—–
-
-EmapƒT[ƒo[‚ÉŒq‚ª‚ç‚È‚¢–â‘è‚ðC³
- clif.c
- clif_parse()‚ÌC³
-
---------------
-//0520 by ŒÓ’±—–
-
-EcharƒT[ƒo[ƒƒO‚Ìuset map X.Y HOGE.gatv‚ª•\Ž¦‚³‚ê‚È‚­‚È‚è‚Ü‚µ‚½
- •Ï‚í‚è‚ÉAuset map M from XX.YY.ZZ.WW:PP (CC maps)v
- ‚Æ‚¢‚¤‚Ó‚¤‚ɉ½ŒÂ‚̃}ƒbƒv‚ðƒZƒbƒg‚µ‚½‚©‚¾‚¯‚ð•\Ž¦‚·‚é‚悤‚É‚È‚è‚Ü‚·B
-
- char/char.c
- parse_frommapC³
-
-E•¡”mapƒT[ƒo[‚ɉ¼‘Ήž
- ENPC‚̃}ƒbƒvƒT[ƒo[•Ï”‚ÍŽIŠÔ‚Å‚Í‹¤—L‚³‚ê‚Ü‚¹‚ñB‹¤—L‚·‚ׂ«•Ï”‚ð
- Ž‚ÂNPC‚ª‚¢‚éƒ}ƒbƒv“¯Žm‚Í“¯‚¶mapƒT[ƒo[‚Å“®‚©‚·‚ׂ«‚Å‚·B
- ‚¨‚»‚ç‚­PC‚̃Oƒ[ƒoƒ‹•Ï”‚Í‹¤—L‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·(–¢ƒeƒXƒg)
- EŽb’è“I‚É“®‚­‚悤‚É‚µ‚½‚¾‚¯‚È‚Ì‚ÅA•s“s‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- “Á‚ÉAƒp[ƒeƒB/ƒMƒ‹ƒh/‘qŒÉ/ƒyƒbƒg/Wis‚È‚Ç‚ÌinterƒT[ƒo[‚ðŽg‚¤‹@”\‚ª
- ³‚µ‚­ì“®‚·‚é‚©‘S‚­ƒ`ƒFƒbƒN‚µ‚Ä‚¢‚Ü‚¹‚ñB
- Eurecv map on XX.YY.ZZ.WW:PP (CC maps)v‚Æ‚¢‚¤ƒƒO‚ª•\Ž¦‚³‚ê‚Ü‚·B
- ‚±‚ê‚Í‘¼‚ÌmapƒT[ƒo[‚ª’S“–‚·‚éƒ}ƒbƒv‚̃ŠƒXƒg‚ªA‚±‚ÌmapƒT[ƒo[‚É
- ³í‚ÉŽóM‚³‚ꂽ‚Æ‚¢‚¤ˆÓ–¡‚Å‚·B
-
- (char/)
- char.c/char.h
- parse_frommap()C³
- mapif_sendallwos()’ljÁ
- (map/)
- map.c/map.h
- map_setipport()‚ðC³
- struct map_session_data‚Ìstateƒƒ“ƒo‚Éwaitingdisconnect’ljÁ
- chrif.c/chrif.h
- FX’ljÁ
- clif.c
- waitingdisconnect‚ª‚P‚È‚çƒpƒPƒbƒg‚𖳎‹‚·‚é‚悤‚É‚µ‚½
- pc.c
- pc_setpos()C³iƒ}ƒbƒvƒT[ƒo[•ÏXˆ—‚È‚Çj
- pc_setnewpc()C³
-
---------------
-//0519 by Ž€_
-
-EƒT[ƒo[snapshot‚ÆFXC³B
-EŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉUŒ‚‚ª“–‚½‚éƒoƒOC³B(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©•ñ‚¨Šè‚¢‚µ‚Ü‚·B)
-E0517‚̃AƒCƒXƒEƒH[ƒ‹‚̈—‚ð­‚µ•ÏXB
-EƒƒeƒI‚ðƒ‚ƒ“ƒXƒ^[‚àŽg‚¦‚é‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB•ñ‚¨Šè‚¢‚µ‚Ü‚·B) ‚Å‚à‚¿‚å‚Á‚ƃƒ‚ƒŠ[‚ÌŽg—p—Ê‚ª‘‚¦‚Ü‚µ‚½B(–ñ10M’öオ‚é‚悤‚Å‚·B)
-Eƒ{ƒX‚ÌŽæ‚芪‚«‚ªƒ{ƒX‚ƈê‚És“®‚·‚é‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚Ç‚ñ‚È“®‚«‚ð‚·‚é‚©‚ÍŠm”F‚µ‚Ä‚Ü‚¹‚ñBUŒ‚‚àŽó‚¯‚Ä‚È‚¢‚̂Ƀ{ƒX‚ׂ̗©‚矎è‚É—£‚ê‚é‚©‚Ç‚¤‚©‚ÌŠm”F‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
-E‚»‚Ì‘¼×‚©‚¢•¨C³B
- client-packet.txt C³B
- map.h
- AREA_SIZE‚ð15‚©‚ç20‚É•ÏXB
- struct map_session_dataAstruct mob_dataAstruct skill_timerskill C³B
- map.c
- map_quit() C³B
- clif.h
- clif_changemapcell() C³B
- clif.c
- clif_getareachar_skillunit()Aclif_clearchar_skillunit()Aclif_changemapcell() C³B
- skill.c
- skill_unitsetting()Askill_unit_onlimit()Askill_castend_pos2() C³B
- skill_castend_nodamage_id()Askill_check_condition()Askill_attack() C³B
- skill_timerskill()Askill_addtimerskill()Askill_cleartimerskill() C³B
- ‚»‚Ì‘¼­‚µC³B
- skill.h
- skill_addtimerskill()Askill_cleartimerskill() C³B
- pc.c
- pc_movepos()Apc_walk()Apc_authok() C³B
- mob.c
- mob_spawn_dataset()Amob_spawn() C³B
- mob_changestate()Amob_damage() C³B
- mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
- ‚»‚Ì‘¼­‚µC³B
- battle.c
- battle_calc_weapon_attack()Abattle_weapon_attack() C³B
- ‚»‚Ì‘¼­‚µC³B
-
---------------
-//0518 by Kalen
-EEvent_pumpkinŠÖ˜A‚̃tƒ‰ƒO•s‹ï‡C³
-
---------------
-//0517 by Ž€_
-
-EƒAƒCƒXƒEƒH[ƒ‹‚Å ‚蔲‚é–â‘èC³‚Æ­‚µC³B(M‚³‚ñƒpƒPƒbƒg‚Ì’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
- clif.h
- clif_changemapcell() ’ljÁB
- clif.c
- clif_changemapcell() ’ljÁB
- skill.h
- SC_STEELBODY‚ð84‚©‚ç87‚É•ÏXB
- skill.c
- skill_unitsetting()Askill_unit_onlimit() C³B
- skill_status_change_end()Askill_status_change_start() C³B
- client_packet.txt C³B
-
---------------
-//0516 by Ž€_
-
-Eƒ‚ƒ“ƒXƒ^[‚̃ƒeƒI‚É‚æ‚éŽIƒ_ƒEƒ“‚ð—ÕŽž‚É–h‚¢‚Å’u‚«‚Ü‚µ‚½B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB) ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹‚ɂ‚¢‚Ä‚¿‚å‚Á‚Æ•ªÍ•s‘«‚Å‚·‚Ì‚Å•ªÍ‚µ‚½Œã‚ÉC³‚µ‚Ä’u‚«‚Ü‚·B
-EƒXƒLƒ‹Žw’e‚ÌŽd—l‚ðbattle_athena.conf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB(0515‚Ì•¨‚ª‚¿‚å‚Á‚Æ‚à‚Á‚½‚¢‚È‚©‚Á‚½‚Ì‚Å...)
- skill.c
- skill_castend_pos2() C³B
- battlc.hAbattle.c
- battle_config‚Éfinger_offencive_type ’ljÁB
- battle_calc_weapon_attack() C³B
- battle_athena.conf C³B
- conf_ref.txt C³B
-
---------------
-//0515 by Ž€_
-
-EƒXƒLƒ‹ƒƒeƒI‚ÆŽw’eC³‚ƃpƒPƒbƒgC³A0512‚Ì—Ž‚Æ‚µ•¨C³‚Æ­‚µ‚¾‚¯‚ÌŽd—l•ÏX‚Å‚·B
-EŽw’e‚Ìê‡à–¾‚ðŒ©‚Ä‚±‚ñ‚ÈŠ´‚¶‚©‚È‚ÆŽv‚Á‚Äì‚Á‚½•¨‚Å‚·BˆÈ‘O‚Ì•¨‚ª–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚Ȃ猳‚É–ß‚µ‚Ü‚·B
-EƒƒeƒI‚Ì1”­‚͈̔͂Í5*5ƒZƒ‹(range = 2)‚Å‚·B
-EƒAƒCƒeƒ€Žg—pƒpƒPƒbƒg‚ðV‚µ‚¢•¨‚É•ÏX‚µ‚½‚ªƒGƒtƒFƒNƒg‚ªo‚È‚¢•¨‚Ío‚È‚¢‚悤‚Å‚·B(FXƒGƒtƒFƒNƒg‚ª“ü‚Á‚Ä‚¢‚é‚Ý‚½‚¢‚¾‚©‚çŒã‚ÍŽg‚Á‚ÄŠm”F‚Å‚·‚¯‚Ç‚ËB)
-E0512‚Åhitrate‚ª10000ˆÈã‚Å•K’†‚Å‚Í‚È‚­100000ˆÈã‚Å•K’†‚Å‚·‚̂ŃR[ƒh‚ÌC³‚Ì‚³‚¢‚É‚Í‹C‚ð‚Á‚‚¯‚Ä‚­‚¾‚³‚¢B
-Ebattle_athena‚Éݒ肳‚ê‚Ä‚¢‚é•Ší‚Ì»‘¢—¦‚ƃyƒbƒg‚̕ߊlŠm—¦‚ÌŒvŽZ•û–@‚ð­‚µ•Ï‚¦‚Ü‚µ‚½B(‹C‚É‚·‚é•K—v‚à‚È‚¢•¨‚Å‚·‚¯‚Ç‚ËB)
- skill.h
- skill_addtimerskill()Askill_cleartimerskill ’ljÁB
- skill.c
- skill_attack() fixAskill_use_id()Askill_use_pos() C³B
- skill_castend_damage_id()Askill_castend_nodamage_id() C³B
- skill_timerskill()Askill_addtimerskill()Askill_cleartimerskill ’ljÁB
- skill_castcancel()Askill_castend_pos2()Askill_unitsetting() C³B
- skill_produce_mix()Ado_init_skill() C³B
- mob.c
- mob_damage() C³B
- battle.c
- battle_calc_weapon_attack() C³B
- map.h
- struct skill_timerskill ’ljÁB
- struct map_session_data C³B
- map.c
- map_quit() C³B
- pc.c
- pc_authok() C³B
- pc_damage() C³B
- clif.c
- clif_parse_WalkToXY() C³B
- clif_useitemack() C³B(Ž‘—¿’ñ‹Ÿ: Kalen‚³‚ñ)
- pet.c
- pet_catch_process2() C³B
- skill_db.txt
- ‹CŒ÷‚ÌSP‚ð10‚É•ÏXB(ƒlƒbƒg‚ÌŒŸõ‚Å‚Í10‚¾‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½BŠØ‘‘ ‚Å‚Í15‚Æ•\Ž¦‚³‚ê‚Ü‚·‚ª...)
- client_packet.txt
- 01c8‚Ì•ÏX‚Å‚·BKalen‚³‚ñî•ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B
-
---------------
-//0514 by Kalen
-
-EscriptC³+’ljÁ
-
- conf/npc_event_pumpkin.txt (V‹K)ƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg
- conf/npc_town_guide.txt (C³)Juno‚Ìu+vƒAƒCƒRƒ“ƒJƒ‰[C³
- conf/npc_town_lutie.txt (ˆê•”’ljÁ)ƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg‚ɉe‹¿‚·‚éNPC‚̉ï˜b’ljÁ
-
---------------
-//0513 by RR
-
-E“]EŽž‚É‘•”õ‚ª‘S‚ÄŠO‚ê‚é‚悤‚É‚µ‚Ü‚µ‚½BŠÖ”ˆÊ’u‚Ì•ÏX‚µ‚Ä‚È‚¢‚Ì‚ÅA‚Ђå‚Á‚Æ‚µ‚½‚炨‚©‚µ‚­‚È‚Á‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB‚¤‚¿‚̊‹«(win2k cygwin)‚Å‚Í•½‹C‚Å‚µ‚½‚Ì‚Å‚»‚Ì‚Ü‚Ü‚É‚µ‚Ä‚ ‚è‚Ü‚·BB
-Eƒm[ƒrƒXŽž‚ÌŽ€–S‚Å‚ÍAÅ‘åHP‚Ì‚Q•ª‚Ì‚P‚Å•œŠˆ‚Å‚«‚é‚悤C³B(ƒXƒLƒ‹‚É‚æ‚é•œŠˆ‚Í–¢Šm”F)
-EƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éŒoŒ±’lŒ¸­‚ð’ljÁBbattle_athena.conf‚É‚ÄAŒ¸­—¦‚ð•ÏX‚Å‚«‚é‚悤‚ÉÝ’èBŒ¸‚éŒoŒ±’l‚ͬ”“_ˆÈ‰ºØ‚èŽÌ‚Ä‚È‚Ì‚ÅA•K—vŒoŒ±’l‚ª’á‚¢‚¤‚¿‚É‚Í‚¿‚傤‚Ç‚»‚Ì“•ªˆø‚©‚ê‚é‚Æ‚¢‚¤•—‚É‚Í‚È‚è‚Ü‚¹‚ñB
- battle.h
- Battle_Config‚Édeath_penalty_base‚Ædeath_penalty_job‚ð’ljÁB
- battle.c
- battle_config_read‚Ådeath_penalty_base‚Ædeath_penalty_job‚ð“ǂނ悤‚ÉC³B
- pc.c
- pc_makesavestatus() C³B
- pc_damege() C³B
- pc_jobchange() C³B
- battle_athena.conf
- death_penalty_base,death_penalty_job’ljÁB
-
---------------
-//0512 by Ž€_
-
-E–â‘è‚É‚È‚è‚»‚¤‚È•”•ª‚ÌC³‚ÆV‚µ‚¢ƒpƒPƒbƒg‚̑Ήž‚ªƒƒCƒ“‚Å‚·BŒãƒoƒO‚à­‚µŽ¡‚µ‚Ü‚µ‚½B(“®‚¯‚È‚¢ó‘ÔˆÙí‚É‚È‚Á‚Ä‚à“®‚­–â‘è‚ÌC³“™‚Å‚·B)
- athena.sh C³B(‚¢‚‚àŽI‚ðŒÂ•Ê‚ÉŽÀs‚µ‚Ä‚¢‚½‚Ì‚Å‹C‚ª‚‚«‚Ü‚¹‚ñ‚Å‚µ‚½B)
- makefile
- DPACKETVER‚ð2‚©‚ç3 ‚ÉC³BƒWƒ…[ƒmˆÈŒã‚Ì‘ ‚ðŽg‚¤‚Ì‚È‚ç3‚É‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B(‚»‚̈ȑO‚È‚ç2‚©1)
- clif.c
- DPACKETVER=3‚ɑΉž(¡‚ÌŠ0x114‚ð0x1de‚É•ÏŠ·‚Æ0x11f‚ð01c9‚É•ÏŠ·‚·‚é‚̂ݑΉž)
- clif_skill_damage3() íœB
- clif_skillcastcancel() ’ljÁB
- clif_skill_damage()Aclif_getareachar_skillunit()Aclif_skill_setunit() C³B
- clif_fixmobpos()Aclif_fixpetpos()Aclif_fixpcpos() C³B
- ‘¼‚É­‚µC³B
- clif.h
- clif_skill_damage3() íœB
- clif_skillcastcancel() ’ljÁB
- battle.c
- battle_calc_weapon_attack() C³B
- hitrate‚ð10000ˆÈã‚É‚·‚ê‚ΕK’†‚É‚È‚é‚悤‚É•ÏXB(¡‚ÌŽd—l‚ł̓‚ƒ“ƒXƒ^[‚Ì•K’†UŒ‚ˆÈŠO‚Í•K’†‚É‚È‚è‚Ü‚¹‚ñB)
- ‘¼‚É­‚µC³B
- client_packet.txt
- V‚µ‚¢ƒpƒPƒbƒgî•ñ’ljÁB
- pc.c
- pc_spiritball_timer()Apc_delspiritball() C³B
- pc_damage()Apc_skill() C³B
- skill.h
- SC_EXPLOSIONSPIRITS‚ð89‚©‚ç86‚É•ÏXB(86 = 0x56)
- SC_DELUGE‚ð86‚©‚ç89‚É•ÏXB
- skill.c
- skill_castcancel()Askill_use_id()Askill_use_pos() C³B
- skill_check_condition() C³B
- skill_castend_damage_id()Askill_castend_nodamage_id C³B
- skill_status_change_end()Askill_status_change_start() C³B
- skill_db.txt
- ‹CŒ÷‚ÌÁ”ïSP‚ðC³B(‘O‚Ì15‚ª–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚Ý‚½‚¢‚Å‚·‚Ì‚Å...)
- mob.c
- mobskill_use_id()Amobskill_use_pos() C³B
- map.c
- map_quit() C³B
- atcommand.h
- atcommand.c
- @ƒRƒ}ƒ“ƒh@spiritball’ljÁB(‹@”\‚ÍŽg‚¦‚΂킩‚è‚Ü‚·B‚½‚¾1000ˆÈã‚Í“ü‚ê‚È‚¢•û‚ª‚¢‚¢‚Å‚·B‘ ‚ªƒpƒ“ƒN‚µ‚Ü‚·‚Ì‚Å...)
- atcommand_athena.conf
- C³B
- conf_ref.txt
- C³B
-E0x196ƒpƒPƒbƒg‚ÉV‚µ‚¢•¨‚ª’ljÁ‚³‚ê‚Ä‚¢‚é‚Ì‚Åó‘ԕω»‚É’¼Ú‚ÉŠÖŒW‚È‚¢SC_xxxx‚̔Ԇ‚ð’²®‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B(¡‚ÍSC_EXPLOSIONSPIRITS‚É‚¾‚¯‘Ήž‚µ‚Ü‚µ‚½B) ‚»‚ê‚Æskill_status_change_end()Askill_status_change_start()‚Åclif_status_change()‚ðŒÄ‚Ôtype‚͈̔͂ª64(0x40)–¢–ž‚É‚È‚Á‚Ä‚¢‚邪‚»‚ê‚à’ljÁ‚³‚ê‚Ä‚¢‚镨‚ɇ‚킹‚ÄC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚·‚ª’ljÁ‚³‚ê‚Ä‚¢‚镨‚ª‘S‚Ä‚í‚©‚Á‚½‚킯‚Å‚à‚È‚¢‚Ì‚ÅSC_EXPLOSIONSPIRITS‚É‚¾‚¯‘Ήž‚µ‚Ü‚µ‚½B¡“x‚©‚ç‚Í”š—ô”g“®‚̉𜂪³Šm‚ÉŒ©‚¦‚Ü‚·B‹à„‚̓f[ƒ^‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B
-¦V‚µ‚¢ƒpƒPƒbƒg‚ɑΉž‚·‚éì‹Æ‚ð‚µ‚Ä‚¢‚Ü‚·‚ªî•ñ‚ª•s‘«‚Å‚·B
-ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚âƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚̃GƒtƒFƒNƒg‚ªo‚é‚悤‚É‚·‚éˆ×‚É01c8‚ðŽg‚Á‚Ä‚Ý‚Ü‚µ‚½‚ª‘Ê–Ú‚Å‚µ‚½Bclient_packet.txt‚̃f[ƒ^‚ł͉½‚à‹N‚±‚ç‚È‚¢‚̂ʼn½•û‚ª–{ŽI‚ŃCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚âƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ðŽg‚Á‚½Žž‚̃pƒPƒbƒg‚ð’ñ‹Ÿ‚µ‚Ä‚­‚ê‚Ü‚¹‚ñ‚©HS 00a7‚ÌŒã00a8‚ª—ˆ‚é‚Ì‚©‚»‚ê‚Æ‚à01c8‚ª—ˆ‚é‚Ì‚©‚ÌŠm”F‚Æ00a8‚ÌŒã‚É01c8‚ª—ˆ‚é‚Ì‚©‚ÌŠm”F‚ª‚Å‚«‚ê‚Ή½‚Æ‚©‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª...
-‚»‚ê‚Æ01c9‚ÌŒã‚É—ˆ‚é?.81b‚ª‚í‚©‚ê‚΃AƒCƒXƒEƒH[ƒ‹‚ð ‚蔲‚é–â‘è‚à‰ðŒˆ‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·‚ª...
-î•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-
---------------
-//0511 by Diex
-
-EŽw’e‚ÌUŒ‚‰ñ”C³B
-Eˆ¢C—…”e–PŒA”­™¤‚ªC—û‚𖳎‹‚µA–³‘®«‚É‚È‚é‚悤‚ÉC³B
-E‹à„Žg—pŽžAMDEF‚ª³‚µ‚­•\Ž¦‚³‚ê‚Ä‚È‚©‚Á‚½ƒoƒO‚ðC³B
-E‹CŒ÷‚ÌÁ”ïSP‚ðC³B
- pc.c
- pc_calcstatus() C³B
- battle.c
- battle_calc_weapon_attack() C³B
- skill.c
- skill_check_condition() C³B
-
- skill_db.txt C³B
-
---------------
-//0510 by Diex
-
-EŽO’i¶‚Ì•\Ž¦ƒoƒOC³
-EŽw’e‚ª‹C’e‚ª–³‚­‚Ä‚àŒ‚‚Ä‚éƒoƒO‚ðC³
- map.h
- struct map_session_data‚Éspiritball_old•Ï”’ljÁB
- skill.c
- skill_check_condition() C³B
- clif.c
- clif_skill_damage3() C³B
- battle.c
- battle_weapon_attack()Abattle_calc_weapon_attack C³B
-
---------------
-//0509 by
-
-Enpc_warp.txt
- ƒvƒé¨ƒvƒƒtƒB[ƒ‹ƒh‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðA
- ƒvƒé¨ƒ”ƒ@ƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚ÉC³B
- ƒvƒƒtƒB[ƒ‹ƒh¨ƒvƒé‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðƒvƒƒtƒB[ƒ‹ƒh¨ƒ”ƒ@ƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚ÉC³
-
---------------
-//0508 by Ž€_
-
-EƒoƒOC³‚Æ‘§A‹CŒ÷A‹C’D‚ÌC³‚ªƒƒCƒ“‚Å‚·B(¡“x‚©‚ç‚Í‘¼‚Ìl‚É‚à‹C‚ª‚¿‚á‚ñ‚ÆŒ©‚¦‚Ü‚·B)
-EŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉŒoŒ±’l‚ª“ü‚é–â‘èC³B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB‚Ç‚¤‚È‚Ì‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
- pc.h
- pc_addspiritball()Apc_delspiritball() ’ljÁB
- pc_is50overweight() C³B
- pc.c
- pc_gainexp() C³B
- pc_insert_card()Apc_item_identify() C³B(‘債‚½C³‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª...)
- pc_authok() C³B
- pc_addspiritball()Apc_delspiritball() ’ljÁB
- pc_spiritball_timer() ’ljÁB
- do_init_pc()Apc_calcstatus()C³B
- pc_spirit_heal() ’ljÁB
- pc_natural_heal()‚ÉŠÖ‚í‚镨‚ÌC³B
- map.h
- struct map_session_data C³B
- map.c
- map_quit() C³B
- map_addflooritem() C³B
- clif.h
- clif_spiritball_int()‚ðclif_spiritball()‚É•ÏXB
- clif_spiritball_ext() íœB
- clif.c
- clif_spiritball_int() ‚ðclif_spiritball()‚É•Ï‚¦‚ÄC³B
- clif_spiritball_ext() íœB
- clif_set01e1() ’ljÁB
- clif_getareachar_pc() C³B
- skill.h
- SC_CALLSPIRITS íœB
- skill.c
- SC_CALLSPIRITS íœB
- skill_castend_nodamage_id()Askill_check_condition() C³B
- skill_status_change_start() C³B
-E°‚É—Ž‚¿‚½ƒAƒCƒeƒ€‚ªÁ‚¦‚é‚Ü‚Å‚ÌŽžŠÔ‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB
- battle.hAbattle.c
- battle_config_read() C³B
- conf_ref.txt C³B
- battle_athena.conf C³B
-
---------------
-//0507 by Diex
-0505‚ÌC³
-EŽO’i¶‚̃GƒtƒFƒNƒgŽÀ‘•
-
---------------
-//0506 by hoenny
-‘S‘Ì“I‚É­‚µŽ®C³
-ƒZƒCƒW‚̃XƒLƒ‹‚ªƒAƒCƒeƒ€‚ðÁ–Õ‚·‚é‚悤‚ÉC³
-(ƒXƒLƒ‹‚ÌDB‚É zeny, spiritball, item, equip‚ð“ü‚ꂽ‚¢‚ªŽžŠÔ‚ª‚È‚­‚Ä—ÕŽž“I‚É ...)
-
---------------
-//0505 by Diex
-
-Eˆ¢C—…”e–PŒ‚̃_ƒ[ƒWC³
-E–Ò—´Œ‚̃_ƒ[ƒWC³
-EŽw’eŽÀ‘•
-E”­™¤ŽÀ‘•
-E‹à„‚ªŒ¸ŽZDEF‚ÆŒ¸ŽZMDEF‚ª90‚ɌŒ肳‚ê‚Ä‚¢‚½‚Ì‚ðæŽZDEF‚ÆæŽZMDEF‚ª90‚É‚È‚é‚悤‚ÉC³
-EŽO’i¶ŽÀ‘•i‚½‚¾‚µƒRƒ“ƒ{‚Í–¢ŽÀ‘•j
- map/clif.c
- map/clif.h
- clif_skill_damage3()’ljÁ
- map/pc.c
- map/skill.c
- map/battle.c
- C³E‹y‚ђljÁ
-iŒvŽZŽ®‚Í+ Acolyte Maniax +‚ðŽQl‚É‚µ‚Ü‚µ‚½Bj
-
---------------
-//0504 by Ž€_
-
-Eatcommand.c C³B(‚½‚Á‚½2•¶Žš‚ð’ljÁ‚µ‚½‚¾‚¯‚Å‚·B)
-atcommnad_gm_only‚ªno‚¶‚á‚È‚­‚Ä‚àŽg—pƒŒƒxƒ‹Ý’è‚ð0‚É‚µ‚½ƒRƒ}ƒ“ƒh‚ÍGM‚¶‚á‚È‚¢ƒLƒƒƒ‰‚Å‚àŽg‚¦‚Ü‚·BƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB
-
---------------
-//0503 by nabe
-
-E¸˜BC³‚ÆLinux—p‚É‚¿‚å‚Á‚Æ•ÏX‚È‚Ç
- conf/map_athena.conf
- npc_event_doll.txt,
- npc_turtle.txt,
- //npc_pota.txt€–ڒljÁ
- conf/npc_pota.txt’ljÁisocie‚³‚ñì‚̃_ƒ“ƒWƒ‡ƒ“ƒ|ƒ^Žq‚³‚ñj
- conf/npc_shop.txt
- ƒCƒYƒ‹[ƒh•Ší¤l‚̉¿ŠiC³
- conf/script_athena.conf
- 0499‚Å‚Ì•¶Žš‰»‚¯HC³
- login/login.c
- #include <time.h>’ljÁ
- map/script.c
- buildin_getequipname()
- ¸˜Bƒƒjƒ…[‚Ìmalloc‚ðC³
- buildin_getequipisenableref()
- ¸˜B‰Â”\ðŒC³iAthefans‚³‚ñ‚ÌðŒ•¶‚É‚µ‚Ä‚Ý‚Ü‚µ‚½j
- map/skill.c
- skill_check_condition()•Ï”錾ˆÊ’u‚Ì•ÏX‚Ì‚Ý
-
---------------
-//0502 by Ž€_
-
-EƒJƒvƒ‰‚Ì‘qŒÉ‚àbattle_athena.conf‚Ìbasic_skill_check‚É‚æ‚Á‚ÄŠî–{ƒXƒLƒ‹‚ª‘«‚è‚È‚­‚Ä‚àŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚ÉC³‚µ‚Ü‚µ‚½B(ƒvƒƒ“ƒeƒ‰’†‰›‚̃Jƒvƒ‰‚Ì‚ÝŠm”FB)
-EƒNƒFƒXƒgƒXƒLƒ‹‚̎擾‚Í0492‚Ì‚¹‚¢‚Å‚·B0481‚Éskill‚ÌŌオ,2‚¶‚á‚È‚­,0‚¾‚Æ‘‚¢‚½‚Ì‚Å‚·‚ª‰½ŒÌ‚©0492‚Å,2‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Å,0‚ÉC³‚µ‚Ü‚µ‚½B
-EƒXƒNƒŠƒvƒggetbaseskillcheck‚ðbaseskillcheck‚É•ÏX‚ÆŽ©•ª‚ÅC³‚µ‚Ü‚µ‚½‚ª–½—ß‚ÌŒã‚É‚È‚ñ‚Ì”’l‚à“ü‚ç‚È‚¢ê‡‚̓XƒNƒŠƒvƒg‚ª³‚µ‚­ì“®‚µ‚È‚©‚Á‚½‚Ì‚ÅŽg—p‚·‚éꇂÍbaseskillcheck(0)‚É‚µ‚ÄŽg‚í‚È‚¢‚Ƴ‚µ‚¢Œ‹‰Ê‚𓾂邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
-(Ú‚µ‚­‚Ínpc_town_kafra.txtŽQÆB)
- npc_event_skillget.txt C³B
- npc_town_kafra.txt C³B
- script.c C³B
-EGM_account.txt‚ÉŽ©•ª‚ªƒeƒXƒg‚ׂ̈Ɏg‚Á‚Ä‚¢‚½500000‚ª“ü‚Á‚Ä‚¢‚½‚Ì‚Å휂µ‚Ü‚µ‚½B(GM_account.txtì‚Á‚½——R‚ÍŽ©•ªŸŽè‚ɃAƒJƒEƒ“ƒg‚ðGM‚É‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚·‚éˆ×‚Å‚·B‚‚܂èGM‚Æ‚µ‚Ä•\Ž¦‚³‚ê‚È‚­‚Ä‚àGM‚Æ‚µ‚ÄF‚ñ‚ÈŒ ŒÀ‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B‚³‚·‚ª‚ÉGMê—p‚̉EƒNƒŠƒbƒNƒRƒ}ƒ“ƒh‚ÍŽg‚¦‚Ü‚¹‚ñ‚ª... ‚Å‚à‚±‚ê‚ðŠˆ—p‚µ‚Ä‚¢‚é•û‚Í‚¢‚È‚¢‚Ý‚½‚¢‚È‚ñ‚Å‚·‚Ë...)
-
---------------
-//0501 by hoenny
-
-E500‚Ì–â‘è“_C³
--HP‰ñ•œ—ÍŒüã,SP‰ñ•œ—ÍŒüã
- map/pc.c
- pc_natural_heal_hp()C³
- pc_natural_heal_sp()C³
-
-500SP‰ñ•œ—ÍŒüã
---------------
-//0500 by hoenny
-
-EC“¹‘m‚Ì‘§ŽÀ‘•
--Šî–{“I‚ÉÀ‚Á‚½Žž 10•b‚²‚Ƃɉñ•œ‚µ‚Ü‚·.
--ŠŽ—Ê‚ª 50%‚ðƒI[ƒo[‚µ‚½ê‡ 20•b‚²‚Ƃɉñ•œ‚µ‚Ü‚·.
-EC“¹‘m‚Ì‹C’DŽÀ‘•
--‘¼‚ÌC“¹‘m‚ÌŸ†‹…‚à‹zŽû‚ª‰Â”\‚Å‚·.
-EC“¹‘m‚Ì‹à„ŽÀ‘•
--‹à„ó‘Ô‚Å‚Í‚·‚ׂẴAƒNƒeƒBƒuƒXƒLƒ‹‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚È‚¢‚Å‚·.
- db/skill_db.txt
- ‹C’DC³
- ‹à„C³
- map/pc.h
- pc_is50overweight()’ljÁ
- pc_is90overweight()’ljÁ
- map/pc.c
- pc_calcstatus()C³
- pc_spheal()C³
- pc_hpheal()C³
- pc_natural_heal_hp()C³
- pc_natural_heal_sp()C³
- pc_natural_heal_sub()C³
- map/skill.c
- skill_check_condition()C³
- skill_castend_nodamage_id()C³
- skill_status_change_start()C³
-
---------------
-//0499 by Ž€_
-
-EƒT[ƒo[snapshot‚ƃoƒOC³B
-EƒXƒeƒB[ƒ‹ƒRƒCƒ“‚̃[ƒj—Ê‚ðƒ‚ƒ“ƒXƒ^[ƒŒƒxƒ‹*10 + rand(100)‚É•ÏXB
-EƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚ª‚È‚¢ƒXƒLƒ‹‚̓^ƒCƒ}[‚ðŽg‚í‚È‚¢‚悤‚É•ÏXB
-EƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ð–h‚®ˆ×‚ÉC³B(¡“x‚±‚»Ž¡‚Á‚½‚Í‚¸...) ‚»‚µ‚ÄŠg‘勾‚à“¯‚¶‚悤‚È‚±‚Æ‚ª‚Å‚«‚é‚Ì‚ÅC³B(‚±‚ê‚ÍŽIƒ_ƒEƒ“‚Ü‚Å‚Í‹N‚±‚³‚È‚¢‚悤‚Å‚·‚ª...)
-EƒLƒƒƒ‰‚Ƀ}ƒbƒv‚̃[ƒh‚ªI‚í‚é‚܂Ńyƒbƒg‚̃f[ƒ^‚ª—ˆ‚È‚¢‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚é–â‘èC³B(–Å‘½‚È‚±‚Æ‚ª‚È‚¢ŒÀ‚è‹N‚±‚ç‚È‚¢‚Å‚·‚¯‚Ç‚ËB)
-EƒI[ƒgƒo[ƒT[ƒNAd‚³‚̃AƒCƒRƒ“‚ƃ`ƒFƒbƒN‚ª³‚µ‚­“K—p‚³‚ê‚é‚悤‚ÉC³B
-E‘‘¬ƒ|[ƒVƒ‡ƒ“‚Ì“K—p‡”Ô•ÏXB¡‚܂ł̓Xƒs[ƒhƒAƒbƒvƒ|[ƒVƒ‡ƒ“‚ªÅ—Dæ‚ÅŽŸ‚ªƒnƒCƒXƒs[ƒhƒ|[ƒVƒ‡ƒ“AŌオƒo[ƒT[ƒNƒ|[ƒVƒ‡ƒ“‚¾‚Á‚½‚Ì‚Å‚·‚ª‡”Ô‚ð‹t‚É•ÏX‚µ‚Ü‚µ‚½B
-EƒAƒCƒeƒ€‚ÅŽg‚¤ƒXƒLƒ‹‚̓LƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚ƃfƒBƒŒƒC‚ª0‚É‚È‚é‚悤‚É•ÏXB
-EƒAƒCƒeƒ€‚ÅŽg‚¤ƒXƒLƒ‹‚̃Œƒxƒ‹‚ªitem_db‚Éݒ肵‚Ä‚¢‚郌ƒxƒ‹‚æ‚è‚‚­‚È‚éƒoƒOC³B
- pc.h
- pc_move()‚ðpc_movepos()‚É•ÏXB
- pc.c
- pc_steal_coin()Apc_insert_card()Apc_item_identify()Apc_authok()A
- pc_calcstatus()Apc_checkweighticon()Apc_damage() C³B
- skill.c
- skill_castend_pos2()Askill_check_condition()Askill_use_id()A
- skill_use_pos() C³B
- pet.c
- pet_recv_petdata()Apet_change_name() C³B
- map.h
- struct map_session_data‚Éskillitemlv ’ljÁB
- script.c
- buildin_itemskill() C³B
- clif.c
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos()A
- clif_parse_LoadEndAck() C³B
- mob.c
- mobskill_use_id()Amobskill_use_pos() C³B
-
---------------
-//0498 by hoenny
-
-DŸ†‹…‚ª‚·‚Á‚©‚茩‚¦‚é‚悤‚ÉC³(Á–ÕƒXƒLƒ‹Žg—p‚ÌŽžÁ–Õ‚·‚é‚悤‚ÉC³)
-DƒXƒLƒ‹Žc‰e‚ðŽg—p‚ÌŽžŸ†‹…‚ðÁ–Õ‚·‚é‚悤‚ÉC³
- doc/client_packet.txt
- 0x1d0’ljÁ
- map/map.h
- sd‚Ìstructure‚É spiritball’ljÁ
- map/clif.h
- clif_spiritball_del() -> clif_spiritball_int()C³
- clif_spiritball_cre() -> clif_spiritball_ext()C³
- map/clif.c
- packet_len_table[]C³
- clif_spiritball_del() -> clif_spiritball_int()C³
- clif_spiritball_cre() -> clif_spiritball_ext()C³
- map/pc.h
- pc_item_steal() -> pc_steal_item()C³
- pc_coin_steal() -> pc_steal_coin()C³
- map/pc.c
- pc_item_steal() -> pc_steal_item()C³
- pc_coin_steal() -> pc_steal_coin()C³
- pc_calcstatus()C³
- map/skill.c
- skill_check_conditon()C³
-
---------------
-//0497 by Ž€_
-
-E0491‚̃XƒLƒ‹Žc‰e‚̃oƒOC³‚ƃXƒeƒB[ƒ‹‚ƃXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌC³Amob_target‚̃oƒOC³B
-EŒðŠ·AÀ‚èAƒp[ƒeƒBŒ‹¬“™‚ÌŽž‚ÉŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³B(battle_athena.conf‚Ń`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B)
-‚½‚¾ƒJƒvƒ‰‚Ì‘qŒÉ‚̓XƒNƒŠƒvƒg‚ŧŒÀ‚ð‚©‚¯‚邵‚©‚ ‚è‚Ü‚¹‚ñB
-EƒXƒNƒŠƒvƒggetbasicskillcheck’ljÁB
- Žg—p•û–@„ getbasicskillcheck
- –ß‚è’l‚Íbattle_athena.conf‚Ìbasic_skill_check‚Å‚·B0‚Ìꇂ͊î–{ƒXƒLƒ‹‚̃`ƒFƒbƒN‚È‚µ‚Å1‚Ìꇂ͊î–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚Ì‚ðˆÓ–¡‚µ‚Ü‚·B
- skill.c
- skill_castend_pos2() C³B
- skill_additional_effect() C³B
- pc.c
- pc_move() ’ljÁB
- pc_item_steal()Apc_coin_steal() C³B
- pc.h
- pc_move() ’ljÁB
- map.h
- struct mob_data C³B
- mob.c
- mob_spawn() C³B
- mob_target() C³B
- clif.c
- clif_pcinsight()Aclif_pcoutsight() C³B
- clif_parse_ActionRequest()Aclif_parse_Emotion()A
- clif_parse_TradeRequest()Aclif_parse_CreateParty()A
- clif_parse_ReplyPartyInvite() C³B
- battle_athena.conf C³B
- conf_ref.txt C³B
- skill_db.txt
- ƒXƒeƒB[ƒ‹‚ÌŽË’ö‚ð3‚©‚ç1‚ÉC³B
- battle.hAbattle.c
- battle_config‚Ébasic_skill_check ’ljÁB
- battle_config_read() C³B
- trade.c
- trade_traderequest() C³B
- script.c
- buildin_getbasicskillcheck() ’ljÁB
- map/makefile C³B
-¦ƒXƒeƒB[ƒ‹‚ƃXƒeƒB[ƒ‹ƒRƒCƒ“‚ÌŒvŽZŽ®‚Í“K“–‚Éì‚Á‚½•¨‚Å‚·B–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©‘S‘R‚í‚©‚ç‚È‚¢‚Ì‚Å...
-
- ƒXƒeƒB[ƒ‹—¦ = (ƒ‚ƒ“ƒXƒ^[‚̃AƒCƒeƒ€drop—¦ * (ƒLƒƒƒ‰ƒŒƒxƒ‹*0.5 + dex*0.4 +ƒXƒLƒ‹ƒŒƒxƒ‹*5))%
- ƒXƒeƒB[ƒ‹ƒRƒCƒ“—¦ = (ƒXƒLƒ‹ƒŒƒxƒ‹ + (ƒLƒƒƒ‰ƒŒƒxƒ‹ - ƒ‚ƒ“ƒXƒ^[‚̃Œƒxƒ‹)*0.3 + dex*0.2 + luk*0.2)%
- ƒXƒiƒbƒ`ƒƒ[”­“®—¦ = (5.5 + ƒXƒLƒ‹ƒŒƒxƒ‹*1.5 +ƒXƒeƒB[ƒ‹‚̃XƒLƒ‹ƒŒƒxƒ‹)%
-
-–{ŽI‚ÌŒvŽZŽ®‚ª‚í‚©‚é•û‚Íî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-ƒXƒeƒB[ƒ‹ƒRƒCƒ“‚̃[ƒj‚̗ʂ̓‚ƒ“ƒXƒ^[‚̃Œƒxƒ‹*100‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚±‚ê‚ɂ‚¢‚Ä‚àî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-¦Žc‰e‚Ìꇎg‚Á‚½Œã•’Ê‚É•à‚­‘O‚ɂ̓yƒbƒg‚Ì‘•”õ‚ªŒ©‚¦‚È‚¢ƒoƒO‚ª‚ ‚è‚Ü‚·‚ªŒ´ˆö‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å•ú’u‚·‚邱‚Æ‚É‚µ‚Ü‚µ‚½B
-¦Šî–{ƒXƒLƒ‹‚ª‘«‚è‚È‚¢Žžo‚郃bƒZ[ƒW‚Í–w‚LJ‚킹‚Ä‚¢‚Ü‚·‚ªƒp[ƒeƒB‚É“ü‚鎞‚ÉŠî–{ƒŒƒxƒ‹‚ª‘«‚è‚È‚¢Žž‚ɇ‚¤•¨‚ª‚È‚©‚Á‚½‚̂Ńp[ƒeƒB‚ðì‚ê‚È‚¢(Šî–{ƒXƒLƒ‹ƒŒƒxƒ‹7‚Ì•¨)‚Æ•\Ž¦‚µ‚ÄŠ©—U‚µ‚½•û‚É‚Í‹‘₳‚ꂽ‚Æ•\Ž¦‚³‚ê‚Ü‚·B
-
---------------
-//0496 by hoenny
-
-DWZ‚̃ƒeƒIƒXƒg[ƒ€ŽÀ‘•
-DƒXƒeƒB[ƒ‹ƒRƒCƒ“C³
- db/skill_db.txt
- ƒƒeƒIƒXƒg[ƒ€C³
- map/pc.c
- pc_coin_steal()C³
- map/skill.c
- skill_castend_pos2()C³
-
---------------
-//495 by nini
-
-EAR‚ª•ÐŽè•€A—¼Žè•€‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨•ÐŽè•€A—¼Žè•€A“ÝŠí
- map/skill.c
- skill_check_condition()@C³
-
-‘O‰ñC³‚Ì‚Æ‚«“ÝŠí“ü‚ê–Y‚ê‚Ä‚½‚悤‚Å‚·B
-
---------------
-//0494 by Ž‚Žqo^.^o
-
-conf/mpc_warp.txt
-Dƒnƒ“ƒ^ˆê“]E’no‚Ä‚¢‚È‚¢C³
-
---------------
-//0493 by ”g˜Q
-
-EscriptC³
- npc_town_comodo.txt ƒRƒ‚ƒhˆÄ“à—vˆõ•”•ª‚ðíœ(npc_town_guide.txt‚Æd•¡‚µ‚Ä‚¢‚½‚Ì‚Å)
- npc_town_guide.txt ƒWƒ…ƒm[ˆÄ“à—vˆõ‚ð’ljÁ(viewpoint‚ÌF‚ªc)
- npc_town_kafra.txt ƒWƒ…ƒm[ƒJƒvƒ‰•”•ª‚ðnpc_town_yuno.txt‚©‚çˆÚ“®
- npc_town_refine.txt ƒWƒ…ƒm[¸˜BŠ•”•ª‚ðnpc_town_yuno.txt‚©‚çˆÚ“®
- npc_town_yuno.txt ˆÄ“à—vˆõ‚ƃJƒvƒ‰‚Ƹ˜BŠ•”•ª‚ðíœ
- npc_turtle.txt ‰ï˜b‚ð”÷C³
-
---------------
-//0492 by Kalen
-
-EscriptC³+’ljÁ
-
- conf/npc_event_doll.txt (V‹K)
- conf/npc_turtle.txt (V‹K)‹T“‡ŠÖ˜ANPC+‹T“‡ƒNƒGƒXƒg(qŠC“úŽ)’ljÁ
-
- conf/npc_event_skillget.txt (C³)‰ž‹}ˆ’u‚Ì•s‹ï‡+‚Ö‚ñ‚Ètabíœetc..
- conf/npc_town_alberta.txt (C³)Turtle•ª—£A‚¿‚Ñ‚ÁŽqíœ(Event_doll‚ÖˆÚ“®)
- conf/npc_town_guide.txt (C³)‘䎌‚ª‚©‚È‚è•ÏX‚³‚ê‚Ä‚¢‚½‚Ì‚ÅAC³
-
-
---------------
-//0491 by Ž€_
-
-EƒXƒLƒ‹Žc‰e(ŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Í‹|gœ[‰e)ŽÀ‘•B(‚½‚¾‹C’e‚̃`ƒFƒbƒN‚Í‚µ‚Ä‚Ü‚¹‚ñB)
- pc.h
- pc.c
- pc_can_reach() ’ljÁB
- skill.c
- skill_check_condition()Askill_castend_pos2() C³B
- skill_db.txt
- Žc‰eC³B
-Escript.c
- set_posword() C³B
-¦ˆêl‚ŃeƒXƒg‚ÍÏ‚ñ‚Å‚¢‚Ü‚·‚ª‘¼‚Ìl‚ɳ‚µ‚­Œ©‚¦‚é‚©‚Ç‚¤‚©‚Í–¢Šm”F‚Å‚·B
-•Ï‚È‚Ì‚©‚Ç‚¤‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
-
---------------
-//0490 by nabe
-
-EꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚Ń}ƒbƒvŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚Á‚½‚Ì‚ðC³B
- clif.c
- clif_skill_poseffect()‚Ì
- unsigned char buf[16];‚ðAunsigned char buf[32];‚ÉC³B
-
---------------
-//0489 by Ž€_
-
-E0483‚̃oƒOC³Bbattle_athena.conf‚Ìquest_skill_learn‚ª³‚µ‚­“K—p‚³‚ê‚é‚悤‚É•ÏX‚Æ–â‘肪‚ ‚Á‚½•”•ª‚ÌC³B(ƒeƒXƒgÏ‚Ý)
- pc.c
- pc_calc_skilltree()Apc_skill() C³B
- atcommand.c
- @lostskill ­‚µC³B
-EƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ð–h‚®‚½‚ß‚É­‚µC³B(‚½‚¾ƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ðÄŒ»‚Å‚«‚È‚©‚Á‚½‚Ì‚Å–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾...Š¾)
- pc.c
- pc_insert_card() C³B
-Epc.h
- pc_ishiding() C³B
-
---------------
-//0488 by hoenny
-
-ERG‚̃XƒeƒB[ƒ‹ƒRƒCƒ“ŽÀ‘•
-EƒXƒeƒB[ƒ‹C³
-(“ñƒXƒLƒ‹ŠFˆê“xƒXƒ`[ƒ‹‚µ‚½ê‡‚Ü‚½ƒXƒ`[ƒ‹‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢.‚»‚µ‚ăXƒLƒ‹¬Œ÷‚ÌŽžƒ‚ƒ“ƒXƒ^[‚ÍUŒ‚‚·‚é‚悤‚ÉC³‚µ‚½.ƒGƒtƒFƒNƒg‚ͬŒ÷‚ÌŽž‚¾‚¯o‚é‚悤‚ÉC³‚µ‚½.)
- db/skill_db.txt
- ƒXƒeƒB[ƒ‹ƒRƒCƒ“C³
- map/pc.h
- pc_coin_steal()’ljÁ
- map/pc.c
- pc_coin_steal()’ljÁ
- pc_item_steal()C³
- map/skill.c
- skill_castend_nodamage_id()C³
-
---------------
-//0487 by hoenny
-
-E485‚Ì–â‘è“_‚¿‚å‚Á‚ÆC³
- map/pc.c
- pc_item_steal()C³
- map/skill.c
- skill_castend_nodamage_id()C³
-
---------------
-//0486 by Ž‚Žqo^.^o
-
-db/class_equip_db.txtC³
-—ô‚¯‚½‘å’n‚Ì‘A”R‚¦‚鑾—z‚Ì‘AŠ£‚¢‚Ä‚é•—‚Ì‘AàÒŽ¦˜^AƒvƒŠ[ƒXƒg‚Í‘•”õ‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢–â‘èC³
-
---------------
-//0485 by hoenny
-
-E RG‚̃Xƒiƒbƒ`ƒƒ[ŽÀ‘•
-E ƒXƒeƒB[ƒ‹C³
-E ˜I“XŠJÝ‚ÌŽž skill_check_condition‚Åó‘Ô‚ðƒ`ƒFƒN‚·‚é‚悤‚ÉC³
- map/pc.h
- pc_ishiding()’ljÁ
- pc_item_steal()’ljÁ
- map/pc.c
- pc_item_steal()’ljÁ
- map/skill.c
- skill_castend_nodamage_id()C³
- skill_additional_effect()C³
- skill_check_condition()C³
-
---------------
-//0484 by ŒÓ’±—–
-
-EŠo‚¦‚Ä‚È‚¢ƒNƒGƒXƒgƒXƒLƒ‹‚ɃXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðU‚ê‚é–â‘èC³
- pc.c
- pc_calc_skilltree()‚ŃNƒGƒXƒgƒXƒLƒ‹‚̃`ƒFƒbƒN’ljÁ
- skill.c
- skill_readdb()‚Åinf2‚ð“ǂނ悤‚ÉC³
-
-EƒyƒRƒyƒR‹RæAƒtƒ@ƒ‹ƒRƒ“‚̃AƒCƒRƒ“‚ªƒƒOƒCƒ“’¼Œã‚É‚Í•\Ž¦‚³‚ê‚È‚¢–â‘èC³
- clif.c
- clif_parse_LoadEndAck()C³
-
---------------
-//0483 by Ž€_
-
-E0482‚Ì“K—pB
- npc_event_skillget.txt C³B
- script.c C³B
- skill.c C³B
- pc.c C³B
-
---------------
-//0482 by ŒÓ’±—–
-
-EƒNƒGƒXƒgƒXƒLƒ‹‚̃XƒNƒŠƒvƒg­‚µC³
-EƒXƒNƒŠƒvƒggetskilllv‚ðŒÄ‚Ԃƃ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
- (conf/)
- npc_event_skillget.txt
- o—ˆ‚邾‚¯•Ï”‚ðŽg‚í‚È‚¢‚悤‚ÉC³i–¢ƒeƒXƒgj
- (map/)
- script.c
- buildin_getskilllv()C³
-
-EƒXƒeƒB[ƒ‹‚ÅŽ¸”sŽž‚̃GƒtƒFƒNƒg•ÏX
-E“¯‚¶MOB‚É‚Í‚P‰ñ‚µ‚©ƒXƒeƒB[ƒ‹‚Å‚«‚È‚¢‚悤‚ÉC³
- (map/)
- skill.c
- skill_castend_nodamage_id()C³
- map.h
- struct mob_data‚Ésteal_countƒƒ“ƒo’ljÁ
- mob.c
- mob_spawn()C³Asteal_count‚ð0‚ɉŠú‰»‚·‚é‚悤‚É
-
-EƒCƒhƒDƒ“‚Ì—ÑŒç‚ÅHP‚ª32767‚ð’´‚¦‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³i–¢ƒeƒXƒgj
- (map/)
- pc.c
- pc_calcstatus()C³
-
---------------
-//0481 by Ž€_
-
-E‚±‚ê‚Ì“K—p‚É‚Í‹C‚ð‚‚¯‚Ä‚­‚¾‚³‚¢B0478‚̌Ӓ±—–‚³‚ñ‚Ì•¨‚ð Athena.txt‚̃f[ƒ^Œ`Ž®•ÏX‚¹‚¸‚ɃNƒFƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚é‚悤‚Éì‚Á‚½•¨‚Å‚·BŽ©•ª‚ªì‚Á‚Ä‚éÅ’†‚ɌӒ±—–‚³‚ñ‚ª“¯‚¶•¨‚ðƒAƒbƒv‚µ‚Ä‚­‚ꂽ‚Ì‚Å‚·‚ªƒf[ƒ^‚Í•Ï‚¦‚È‚¢•û‚ª‚¢‚¢‚ÆŽv‚Á‚ÄŽ©•ª‚Ì•¨‚àƒAƒbƒv‚µ‚Ü‚µ‚½B’ˆÓ‚·‚邱‚Æ‚Í0478‚Ìathena.txt‚ÍŽg‚¦‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Å‚·B0478‘O‚Ì•¨‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
-Eskill_db.txt‚Éinf2‚ð’ljÁ‚µ‚Ä‚±‚ê‚ðŽg‚Á‚ăNƒFƒXƒgƒXƒLƒ‹‚©‚Ç‚¤‚©‚ð”»’f‚·‚éŽd‘g‚Ý‚Å‚·B
- skill.h C³B
- skill.c
- skill_readdb()C³‚Æ­‚µC³B
- skill_get_inf2() ’ljÁB
- skill_db.txt C³B
- skill_tree.txt C³B(0478‘O‚Ì•¨)
- clif.c
- clif_skillinfoblock() C³B
- char.c C³B(0478‘O‚Ì•¨)
-Ebattle_athena.conf‚Équest_skill_learn’ljÁB
- battle.h C³B
- battle.c
- battle_config_read() C³B
- battle_athena.conf C³B
-E/resetskill‚ðbattle_athena.conf‚Équest_skill_learn‚ÌÝ’è‚ɇ‚킹‚Äquest_skill_learn‚ªyes‚Ìꇂ̓XƒLƒ‹ƒ|ƒCƒ“ƒg‚ɉÁŽZ‚µ‚Äquest_skill_learn‚ªno‚Ȃ烊ƒZƒbƒg‚Í‚³‚ê‚邪ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ɉÁŽZ‚³‚ê‚Ü‚¹‚ñB
- pc.c
- pc_skill()Apc_resetskill() C³‚Æ­‚µC³B
- pc.h C³B
- atcommand.c C³B
- atcommnad_athena.conf C³B
-EƒXƒNƒŠƒvƒg‚ÌskillƒRƒ}ƒ“ƒh‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚Ì‚Í“¯‚¶‚Å‚·‚ªÅŒã‚̃tƒ‰ƒO‚ª2‚©‚ç0‚É•Ï‚í‚Á‚Ä‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- npc_test_skill.txt C³B
- npc_event_skillget.txt C³B
- conf_ref.txt C³B
- client_packet.txt C³B
-
---------------
-//0480 by Kalen
-
-EEventskill’ljÁ
- conf/npc_event_skillget.txt
-
-Emap_athena.conf•ÏX
- warp.txt‚Ì“Ç‚Ýž‚Ý—Dæ“x‚ð•ÏX
- prt_castle“™A‹ŒEP‚̃[ƒv‚ƈقȂéꊂɕÏX‚³‚ꂽê‡
- æ‚É“Ç‚Ýž‚ñ‚¾•û‚ª—D悳‚ê‚é‚Ì‚ÅAEP‚Ì‚‚¢‡‚Ì‚ª‚æ‚낵‚¢‚©‚Æ
- conf/map_athena.conf
-
---------------
-//0478 by ŒÓ’±—–
-
-***
- Athena.txt‚̃f[ƒ^Œ`Ž®•ÏX!! (Ž©“®“I‚É•ÏŠ·‚³‚ê‚Ü‚·)
- ƒoƒbƒNƒAƒbƒv‚ð–Y‚ꂸ‚É!
- Data format of athena.txt is changed!! (convert automatically)
- DONT FORGET BACKUP!!
-***
-
-EƒNƒGƒXƒgƒXƒLƒ‹ŽÀ‘•
-EƒXƒNƒŠƒvƒg‚ŃXƒLƒ‹ƒŒƒxƒ‹‚ðƒ`ƒFƒbƒN‚Å‚«‚é‚悤‚É
- EƒXƒNƒŠƒvƒg‚ÌskillƒRƒ}ƒ“ƒh‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚Ü‚·B
- Žg—p•û–@„ skill ƒXƒLƒ‹ID,ƒXƒLƒ‹LV[,ƒtƒ‰ƒO]
- ƒtƒ‰ƒO‚ÍÈ—ª‰Â”\‚ÅAÈ—ª‚·‚é‚Æ‚P‚ðŽw’肵‚½‚±‚Æ‚É‚È‚è‚Ü‚·B
- ‚P‚Å‘•”õ•i‚É‚æ‚éˆêŽž“I‚ÈK“¾A‚Q‚ŃNƒGƒXƒg‚É‚æ‚éP‹v“I‚ÈK“¾‚Å‚·B
- P‹v“I‚ÈK“¾‚Ìê‡Askill_tree.txt‚Ɉˑ¶‚µ‚Ü‚·
- EgetskilllvƒRƒ}ƒ“ƒh’ljÁ
- Žg—p•û–@„ getskilllv(ƒXƒLƒ‹ID) –ß‚è’l‚̓Œƒxƒ‹‚Å‚·B0‚Å–¢K“¾B
-
- (conf/)
- npc_test_skill.txt
- ƒTƒ“ƒvƒ‹
- (db/)
- skill_tree.txt
- ƒNƒGƒXƒgƒXƒLƒ‹‚Æ‚µ‚Ä•K—vƒXƒLƒ‹ID‚É-1‚ðÝ’èB
- (char/)
- char.c
- ƒtƒ‰ƒO‚àathena.txt‚É•Û‘¶‚·‚é‚悤‚ÉB
- ˆÈ‘O‚ÌŒ`Ž®‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚Ü‚·B
- (map/)
- pc.c/pc.h
- pc_skill(),pc_calc_skilltree()‚È‚ÇC³
- script.c
- buildin_skill(),buildin_getskillid()‚È‚ÇC³
-
-E@questskill,@lostskill’ljÁ
- E@questskill ƒXƒLƒ‹ID ‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚Ü‚·B(ƒNƒGƒXƒgƒXƒLƒ‹‚Ì‚Ý)
- E@lostskill ƒXƒLƒ‹ID ‚ŃXƒLƒ‹‚ð–Y‚ê‚Ü‚·B(ƒNƒGƒXƒgƒXƒLƒ‹ˆÈŠO‚àOK)
-
- atcommand.c/atcommand.h
- struct Atcommand_Config‚Élostskill,questskillƒƒ“ƒo’ljÁ
- @questskill,@lostskillˆ—’ljÁ
-
---------------
-//0477 by nabe
-
-Eˆê•”•Ï”‚Ì錾ˆÊ’u‚Ì•ÏX‚Ì‚ÝiLinux“™‚ŃRƒ“ƒpƒCƒ‹‚µ‚â‚·‚¢‚悤‚ÉjB
- atcommand.c,battle.c,clif.c,mob.c,npc.c,skill.c
-
---------------
-//0476 by nabe
-
-Econf/ ‚¿‚å‚Á‚Æ®—
- conf/map_athena.confC³B
- tortoise.txt‚ðnpc_town_alberta.txt’†‚Ɉړ®B
- npc_script2.txt‚̃Rƒ‚ƒhƒKƒCƒh‚ðnpc_town_comodo.txt’†‚Ɉړ®B
-
-Enpc‚ªƒLƒƒƒ‰–¼‚ð’‚é‚Æ‚«‚̃oƒOC³
- map/script.c
- buildin_strcharinfo()‚ŃLƒƒƒ‰–¼—p‚̃ƒ‚ƒŠ‚ð
- static‚ÉŠm•Û‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‚Ì‚ðAmalloc‚ÉC³B
-
---------------
-//0475 by hoenny
-
-“D–_‚̃XƒeƒB[ƒ‹ŽÀ‘•B
-ƒMƒ‹ƒh¶¬‚ÌŽžƒGƒ“ƒyƒŠƒEƒ€Á–Õ‚·‚é‚悤‚ÉC³B
- map/guild.c
- guild_create()C³B
- guild_created()C³B
- map/skill.c
- skill_castend_nodamage_id()C³B
-
---------------
-//0474 by Ž€_
-
-E0471‚̸—û‚ÌŽž•\Ž¦‚³‚ê‚镶Žš‚ÌÝ’è‚ðmap_athena.conf‚©‚çscript_athena.conf‚É•ÏXB
- script.c
- do_init_script() C³‚Æ­‚µC³B
- script.h C³B
- script_athena.conf ’ljÁB
- map_athena.conf C³B
- map.c
- map_config_read() C³B
-EŒÃ‚¢Šª•¨AƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒXŽÀ‘•‚Æ­‚µŽd—l•ÏXB
-ƒ‰ƒ“ƒ_ƒ€‚ŃAƒCƒeƒ€‚𓾂镨‚ɃfƒtƒHƒ‹ƒg‚Åo‚éƒAƒCƒeƒ€‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB¡‚ÌŽd—l‚Å‚Í1000‰ñ‚܂ŃAƒCƒeƒ€‚ª‘I‘ð‚³‚ê‚È‚©‚Á‚½‚çƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ªo‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·BƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ª0‚Ìꇂ̓AƒCƒeƒ€‚𓾂ç‚ê‚Ü‚¹‚ñB
-Ý’è‚·‚éŠm—¦‚ð*1000‚©‚ç*10000‚É•ÏXB‚½‚¾item_~.txt‚ÌC³‚Í‚â‚Á‚Ä‚¢‚Ü‚¹‚ñB’N‚©‚â‚Á‚Ä‚­‚¾‚³‚¢B(‘¼—Í–{Šè)
- itemdb.c
- temdb_read_randomitem() C³B
- itemdb_searchrandomid() C³B
- item_purplebox.txt ‚©‚ç item_violetbox.txt ‚ÉC³B
- item_giftbox.txtAitem_scroll.txt ’ljÁB(move‚³‚ñ‚ ‚肪‚Æ‚¤B)
- item_db.txt
- ŒÃ‚¢Šª•¨AƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX C³B
-Etrade.c
- trade_tradecommit() C³Bpc_delitem()‚ðŽg‚¤‚悤‚É•ÏXB
-¦ƒeƒXƒg‚Í‚â‚Á‚Ä‚¢‚Ü‚¹‚ñ‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
-
---------------
-//0473 by Kuro
-
-Eclass_equip_db‚ðˆê•”C³
- db/class_equip_db.txt
-
---------------
-//0471 by hoenny
-
-»˜B‚ÌŽžo‚镶‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½.(map_athena.conf‚Å’²ß‰Â”\)
-‹CŒ÷‚Ì”Žš‚ªŽsœD‚ÌŽžŽÀÛ…˜H•\Ž¦}—ÎC³
- conf/map_athena.conf
- refine_posword:’ljÁB
- map/map.c
- map_config_read()C³B
- map/script.h
- do_set_posword()’ljÁB
- map/script.c
- do_set_posword()’ljÁB
- buildin_getequipname()C³B
- map/skill.c
- skill_status_change_start()C³B
-
---------------
-//0470 by Ž€_
-
-E»‘¢‚ÌŽž‘®«Î‚ª“ñ“xŒ¸‚é–â‘èC³B(ŽÀ‚Í“ñ“xŒ¸‚é‚悤‚ÉŒ©‚¦‚邾‚¯‚Ń}ƒbƒv‚ðˆÚ“®‚·‚é‚Ƴ‚µ‚­•\Ž¦‚³‚ê‚Ü‚·‚ª...)
- pc.hApc.c
- pc_delitem() C³B
- npc.cAscript.cAstorage.cApet.c
- pc_delitem()‚ð‘S‚ÄC³B
- skill.c
- skill_produce_mix() C³B
-
---------------
-//469 by ”g˜Q
-
-Enpc_mob_job.txtAnpc_monster.txtAnpc_monster30.txtAmob_db.txt‚̃‚ƒ“ƒX–¼‚ðC³
-Eitem_db.txt‚̉ñ•œƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ðƒWƒ…ƒm[Œã‚Ì‚à‚Ì‚ÉC³
-
---------------
-//468 by Kuro
-
-E–‚Œ•»ìƒNƒGƒXƒg’ljÁ
- conf/npc_event_ma_sword.txt
-
---------------
-//467 by nini
-
-EBB‚ª—¼ŽèŒ•‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨‚·‚ׂĂ̕Ší‚Å
-EAR‚ª—¼Žè•€‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨•ÐŽè•€A—¼Žè•€A“ÝŠí
-EƒXƒsƒAƒNƒCƒbƒPƒ“”­“®‚ð‘„‚¾‚¯‚É
-EƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢‚à‚̂ɃOƒ‰ƒ“ƒhƒNƒƒXAƒ[ƒO‚̃XƒgƒŠƒbƒvƒVƒŠ[ƒY’ljÁ
-EƒuƒŠƒbƒcƒr[ƒg‚ªƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚³‚ê‚È‚­‚È‚Á‚Ä‚½“_C³
- map/skill.c
- skill_use_id()@C³
- skill_check_condition()@C³
-E2-2EƒXƒLƒ‹‚̃LƒƒƒXƒgEƒfƒBƒŒƒC’ljÁ
- db/cast_db.txt
-
-
---------------
-//466 by hoenny
-
-Eˆ¢C—…”e–PŒC³(ŒöŽ®C³‹y‚Ñ spÁ–Õ‚ª‚·‚®Œ©‚¦‚é‚悤‚É)
-E’~‹C‚ÌŽž‹C’e‚ªŒ©‚¦‚é‚悤‚ÉC³(Mr.NO NAME—l‚̃pƒPî•ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·.‹C’e‚ªÁ‚¦‚éƒpƒPî•ñ‚ª•s‘«‚Å‚·.)
-EƒpƒŠ‚̉H‚âƒeƒŒƒ|[ƒg1‚ð˜A‘±Žg—p‚ÌŽž,ŽIƒI[ƒo[‚ª”­¶‚µ‚È‚¢‚悤‚ɉ¼‰‚ß‚ÅC³
- doc/client_packet.txt
- 0x1e1ƒpƒPî•ñ’ljÁ
- map/battle.c
- battle_calc_weapon_attack()C³
- map/clif.h
- clif_spiritball_cre()’ljÁ
- clif_spiritball_del()’ljÁ
- map/clif.c
- packet_len_table[]C³
- clif_spiritball_cre()’ljÁ
- clif_spiritball_del()’ljÁ
- clif_changemap()C³
- map/skill.c
- skill_castend_nodamage_id()C³
- skill_check_condition()C³
-
---------------
-//0465 by Ž€_
-
-EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ƃnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚̃oƒOC³B(ƒuƒŠƒbƒcƒr[ƒg‚Í•ñ‚Í‚È‚©‚Á‚½‚Ì‚Å‚·‚ª•ªÍ‚µ‚½‚ç–â‘肪‚ ‚Á‚½‚Ì‚ÅC³B)
- skill.c
- skill_use_id() C³B
- skill_castend_nodamage_id() C³B
-E0455‚ÌNPC‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B
- npc_event_ice.txt C³B
- npc_event_potion.txt C³B
- npc_town_geffen.txt C³Bi454‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½Bj
-E0451‚̃¿ƒ}ƒbƒv‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B•K—v‚È•û‚̓Rƒ}ƒ“ƒgƒAƒEƒg‚ð‚È‚­‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B
- map_athena.conf C³B
-EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Í0442‚Ì–â‘è‚ŃnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚Í0445‚Ì–â‘è‚Å‚µ‚½B‚»‚ê‚Æ0445‚ÌC³‚ŃXƒLƒ‹”Ô†‚ðenum‚Å錾‚µ‚½•¶Žš‚É•Ï‚¦‚Ä‚¢‚Ü‚·‚ª‚»‚ê‚É—Ž‚Æ‚µ‚ª‚ ‚é‚悤‚Å‚·B(ƒnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚Í‚»‚Ì‚¹‚¢‚Å‚µ‚½B)‘O‚̔Ԇƒ\[ƒX‚Æ”ä‚ׂĖâ‘肪‚ ‚é•”•ª‚ÍC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B‚¿‚å‚Á‚Æ–Ê“|‚Å‚·‚ª...
-
---------------
-//464 by ”g˜Q
-
-Eƒ‚ƒ“ƒNƒXƒLƒ‹‚Ì•”•ª‚ɂ‚¢‚ÄC³(–¢ŽÀ‘•ƒXƒŒ‚É‘‚©‚ê‚Ä‚¢‚½‚à‚Ì‚ð’ljÁ‚µ‚½‚¾‚¯‚Å‚·B
- skill.c
- skill_use_id()C³
- cast_db.txt
- ƒ‚ƒ“ƒNƒXƒLƒ‹’ljÁ
-
---------------
-//463 by ŒÓ’±—–
-
-E462‚̃oƒOC³
- ENPC‚ÌSHOP‚Ì•s“s‡C³
- EREADME‚̊ԈႢC³iwarpwaitingpc‚ªwarpwaitingroom‚É‚È‚Á‚Ä‚¢‚½j
-
- map.h
- struct npc_data‚Ìchat_id‚̈ʒu‚ðC³
-
---------------
-//462 by ŒÓ’±—–
-
-ENPCƒ`ƒƒƒbƒgì¬
- Ewaitingroom–½—ß‚ÅNPCƒ`ƒƒƒbƒg‚ð쬂µ‚Ü‚·B
- ˆø”‚Í waitingroom "ƒ`ƒƒƒbƒg–¼",§ŒÀl”,ƒCƒxƒ“ƒg–¼ ‚Å‚·B
- ƒCƒxƒ“ƒg–¼‚Íl”‚ªÅ‘å‚É‚È‚Á‚½‚Æ‚«‚É‹N‚±‚·ƒCƒxƒ“ƒg–¼‚ÅAÈ—ª‰Â”\B
- Ewarpwaitingpc–½—ß‚ÅAƒ`ƒƒƒbƒg“à‚É‚¢‚éPC‘Sˆõ‚ðƒ[ƒv‚Å‚«‚Ü‚·B
- ˆø”‚Íwarp‚Æ“¯‚¶‚ÅAwarpwaitingpc "ƒ}ƒbƒv–¼",x,y ‚Å‚·B
-
- map.h
- struct npc_data‚Æchat_data‚ðC³
- script.c
- buildin_waitingroom(),buildin_warpwaitingpc()’ljÁ
- chat.c/chat.h
- FXC³
- clif.c
- clif_getareachar_npc()Aclif_joinchatok()‚È‚ÇC³
-
-ENPC‚ÌOnInitƒCƒxƒ“ƒg‚ðƒT[ƒo[‹N“®Žž‚ɌĂԂ悤‚ÉB
-EƒGƒNƒXƒ|[ƒg‚·‚é‚Æ‚«‚ÌNPC–¼‚Æ•\Ž¦ã‚ÌNPC–¼‚ð•ÊX‚ÉÝ’è‰Â”\‚ÉB
- E“¯‚¶NPC–¼‚̃Cƒxƒ“ƒg‚Íd•¡‚Å‚«‚È‚¢‚½‚ßAƒGƒNƒXƒ|[ƒg—pNPC–¼‚ðŽg‚¢A
- “¯‚¶NPC–¼‚Å‚à•Ê‚ÌNPC‚Æ‚µ‚ÄŽ¯•Ê‚Å‚«‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
- (‚à‚¿‚ë‚ñAƒCƒxƒ“ƒgˆ—‚ðs‚í‚È‚¢ê‡‚Í‚»‚Ì•K—v‚Í‚ ‚è‚Ü‚¹‚ñB)
- Enpc_*.txt‚Ìscript–½—ß‚ÅNPC‚Ì–¼‘O‚ðÝ’è‚·‚é‚Æ‚«A
- u•\Ž¦–¼::ƒGƒNƒXƒ|[ƒg–¼v‚Æ‚·‚é‚ÆA•\Ž¦‚·‚é–¼‘O‚ÆAƒCƒxƒ“ƒg—p‚É
- ƒGƒNƒXƒ|[ƒg‚·‚é–¼‘O‚ð•ÊX‚ÉŽw’è‚Å‚«‚Ü‚·B
- •\Ž¦–¼‚ª‘S‚­“¯‚¶•ÊX‚ÌNPC‚ŃCƒxƒ“ƒg‚ð“®ì‚³‚¹‚é‚Æ‚«‚ÉŽg—p‚µ‚Ü‚·B
- E‚â‚₱‚µ‚¢‚Ì‚ÅPVP‚ÌnpcƒXƒNƒŠƒvƒg‚ðŒ©‚ÄƒCƒ[ƒW‚ð’Í‚ñ‚Å‚­‚¾‚³‚¢B
-
- npc.c/npc.h
- npc_parse_*()‚ÌC³
- npc_event_do_oninit(),npc_event_do_oninit_sub()‚ȂǒljÁ
- map.c/map.h
- do_init()‚Ånpc_event_do_oninit()‚ðŒÄ‚Ԃ悤‚É
- struct npc_dataC³
-
-EƒXƒNƒŠƒvƒggetmapusersAgetareausers‚Ì’v–½“I‚ȃoƒOC³
- EŠY“–ƒ}ƒbƒv‚ª‘¶Ý‚µ‚È‚¢ê‡Aƒ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚é‚Ì‚ðC³B
- Eƒ}ƒbƒv‚ª‘¶Ý‚µ‚È‚¢‚ÆA-1‚ð•Ô‚·‚悤‚É‚µ‚½B
-
- script.c
- buildin_getmapusers(),buildin_getareausers()C³
-
-Epvp‚̃XƒNƒŠƒvƒgC³
- Eƒ`ƒƒƒbƒgƒ‹[ƒ€‚ðì‚é‚悤‚É‚µ‚½
-
- (conf/)
- npc_pvproom.txt
- ‘S‚Ä‚ÌNPC‚̃GƒNƒXƒ|[ƒg–¼(pvp??r)Ý’è
- OnInit:‚Åwaitingroom‚ðŽÀs‚·‚é‚悤‚É
-
---------------
-//461 by Kuro
-EƒAƒRƒ‰ƒCƒg“]EƒNƒGƒXƒgˆê•”C³
- conf/npc_job_aco.txt
-
---------------
-//460 by sagitarius
-Eitem_db‚̊ԈႢC³
- 4032,Ambernite_Card,ƒAƒ“ƒo[ƒiƒCƒgƒJ[ƒh,6,20,,10,,2,,,,,32,,,,{},{},,C³
-
---------------
-//459 by hoenny
-EƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Žg—p‚ÌŽž•€ƒ`ƒFƒbƒN(Ž©•ª‚¾‚¯)
-EOld_Blue_Box‚ÌŠm—¦‚ª‚‚¢‚Æ‚¢‚¤•ñ‚É‚æ‚Á‚ÄC³
-EScript.c‚Í0455ˆÈ‘O‚±‚ƂňøŠ·(NPC‚ð‚±‚±‚ɇ‚킹‚ÄC³‚µ‚Ä‚­‚¾‚³‚¢)
-Eˆ¢C—…”e–PŒC³(ŒöŽ®‚ðC³‚µ‚½‚ñ‚Å‚·‚ª, ³Šm‚©‚Í‚æ‚­•ª‚©‚ç‚È‚¢‚Å‚·‚Ë.)
-EC“¹‘m‚Ì’~‹C,”šŠú‚̉¼ŽÀ‘•.(ˆ¢C—…”e–PŒŽg—p‚ÌŽž’~‹C,”šŠúó‘Ô‚ðƒ`ƒFƒbƒN‚µ‚Ü‚·. )
-EƒyƒRƒyƒR‚Éæ‚Á‚½Œã‚ÉAADPD‚ªŠÔˆá‚Á‚½‚±‚ÆC³(ƒoƒO‚𒼂µ‚Ä‚ ‚°‚½‚ª, ’¼‚·‘O‚±‚Æ‚É•Ï‚í‚邹‚¢‚Å‚Ü‚½C³)
-‚»‚ÌŠO‚É‚àC³‚ð‚µ‚½‚悤‚È‚Ì‚ÉŠo‚¦‚È‚¢‚Å‚·‚Ë.‚»‚µ‚ÄŒë‚Á‚½•”•ª‚ª‚ ‚ê‚ÎŽw“E‚µ‚Ä‚­‚¾‚³‚¢.
- conf/npc_event_ice.txt
- checkweightC³
- conf/npc_town_geffen.txt
- checkweightC³
- db/item_purplebox.txt
- Old_Blue_BoxC³
- map/battle.c
- battle_calc_weapon_attack()C³
- map/pc.c
- pc_spheal()C³
- pc_calcstatus()C³
- map/script.c
- buildin_checkweight()C³
- map/skill.h
- SC_ EXPLOSIONSPIRITS’ljÁ
- map/skill.c
- SkillStatusChangeTable[]C³
- skill_castend_nodamage_id()C³
- skill_check_condition()C³
-
---------------
-//458 by Kuro
-EƒAƒRƒ‰ƒCƒg“]EƒNƒGƒXƒg’ljÁ
- conf/npc_job_aco.txt
- ‰ï˜b•¶‚ª•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“K“–‚É‚µ‚Ä‚ ‚è‚Ü‚·B‚Ü‚½ANPC‚ÌŠOŒ©‚Ì•Ï‚¦•û‚ª•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“K“–‚É‚µ‚Ä‚ ‚è‚Ü‚·B
- •ª‚©‚é•û‚ÍC³‚µ‚Ä‚¨‚¢‚ĉº‚³‚¢B
-
---------------
-//0457 by Kalen
-
-EPVPŠÖ˜A‚ÌNPC’ljÁ
- conf/npc_pvp.txt
- conf/npc_pvproom.txt
-
---------------
-//0456 by Ž€_
-
-Eƒ‚ƒ“ƒXƒ^[‚ÌʼnUŒ‚ŽžŠÔ‚ª’·‚·‚¬‚é–â‘èC³B
-ƒ‚ƒ“ƒXƒ^[‚ÌʼnUŒ‚ŽžŠÔ‚ð¡‚Ü‚Å‚Ímob_db‚ÌaDelay‚ðŽg‚Á‚Ä‚¢‚Ü‚µ‚½‚ª‚±‚ê‚ðaMotion‚É•ÏX‚µ‚Ü‚µ‚½B¡‚Ü‚Å‚Ímob_db‚ÌaMotion‚̓Sƒ~‚Å‚µ‚½‚ª¡“x‚©‚ç‚̓Sƒ~‚Å‚Í‚ ‚è‚Ü‚¹‚ñBaMotion‚³‚¦³‚µ‚¯‚ê‚΃‚ƒ“ƒXƒ^[‚ÌUŒ‚‚̃‚[ƒVƒ‡ƒ“‚Ì‘O‚Ƀ_ƒ[ƒW‚ªo‚Ä‚­‚é–â‘è‚à‚È‚­‚È‚é‚Í‚¸‚Å‚·B
- mob.c
- mob_changestate() C³B
-EƒAƒCƒeƒ€‚ð“üŽè‚Å‚«‚È‚¢Žž‚»‚Ì——R‚É“–‚½‚郃bƒZ[ƒW‚ªo‚é‚悤‚É•ÏXB
- pc.c
- pc_additem() C³B
-Ejob_db1.txt‚Ì‚Å–â‘è‚É‚È‚Á‚½.‚ð,‚ÉC³B
-
---------------
-//455 by Mr.NO NAME
-ENPC‚Ƃ̃AƒCƒeƒ€ŒðŠ·‚┃‚¢•¨ŠÖŒW‚ÌScript‚ªo—ˆã‚ª‚Á‚½“–‰‚Ì
-@NPCƒf[ƒ^(npc_event_making.txtAnpc_town_geffen.txt“™)‚Éæ‚ÁŽæ‚èAˆÈ‰º‚ðC³B
- conf/npc_event_ice.txt
- npc_event_potion.txt
- npc_town_geffen.txti454ˆÈ‘O‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½Bj
- map/script.c
- buildin_checkweight()‚ðC³B
-
---------------
-//454 by Kuro
-EƒQƒbƒtƒFƒ“’b–艮‚Å”ƒ‚¢•¨‚ªo—ˆ‚é‚悤‚ÉC³
- conf/npc_town_geffen.txt
-
---------------
-//0451 by code
-E ¡X‚Å‚·‚ªƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚ɑΉž(ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Ìdata.grf‚ðadata.grf‚Æ‚µ‚Ägrf-files.txt‚Ìadata‚Ì‚Æ‚±‚ë‚É‘‚¢‚Ä‚­‚¾‚³‚¢)
- common/grfio.c
- grfio_setadatafile()’ljÁ
- /grfio.h
- grfio_setadatafile()’ljÁ
- conf/map_athena.conf
- ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚̃}ƒbƒv‚ð“Ç‚Ýž‚ނ悤‚É•ÏX
- /npc_warp_a.txt
- ƒ¿ƒ}ƒbƒv‚̃[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è(‚¿‚å‚Á‚Æ‚¸‚ê‚Ä‚é‚©‚à)
- /grf-files.txt
- ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Ìdata.grf‚ðadata.grf‚Æ‚µ‚Ä“Ç‚Ýž‚ނ悤‚ÉÝ’è
- adata: ‚É‹Lq
-¦ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Í
-@ttp://www.castledragmire.com/ragnarok/
-@‚ ‚½‚è‚©‚ç“üŽè‚µ‚Ä‚­‚¾‚³‚¢B
-
---------------
-//0450 by hoenny
-E ‹R•ºC—ûŽÀ‘•
-E ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒgŽÀ‘•
-E ƒfƒBƒXƒJƒEƒ“ƒgEƒI[ƒo[ƒ`ƒƒ[ƒWC³(”‚ª‚‚¢ê‡ŒvŽZ–@‚ªŠÔˆá‚Á‚½‚±‚Ƃ𒼂µ‚Ü‚µ‚½.)
-E “SŒC³(‘fŽè‚ÈŽž‚à“K—p‚³‚ê‚é‚悤‚É)
-E •€C—ûC³(•ÐŽè•€‚ÈŽž‚à“K—p‚³‚ê‚é‚悤‚É)
-E ƒ{ƒ“ƒSƒ“‚ªUŒ‚‚·‚é‚悤‚ÉC³
- map/pc.c
- pc_calcstatus()C³
- pc_modifybuyvalue()C³
- pc_modifysellvalue()C³
- map/battle.c
- battle_addmastery()C³
- db/mob_db.txt
- ƒ{ƒ“ƒSƒ“C³
-
---------------
-//0449 by Ž€_
-
-E•Ï‚É‚È‚Á‚½ŠC³B
- const.txt
- bAtk‚ÆbDef ’ljÁB
- battle.c
- battle_calc_weapon_attack()‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0445‚Ì•¨)
- map.h
- map_session_data‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0445‚Ì•¨)
- pc.c
- pc_calcstatus() C³B
- pc_bonus() C³B
- item_db.txt‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0446‚Ì•¨)
-
---------------
-//0448 by hoenny
-E‘‘¬C³(pc_walk()‚©‚ç pc_calcstatus()‚Ɉړ®)
-Eő劎—ÊC³
- map/pc.c
- pc_calcstatus()C³B
-
---------------
-//0447 by ‚䂤
-E“ñ“—¬E–î‚Ì‘®«‚𳂵‚­“K‰ž
-EATK‚Ìオ‚éƒJ[ƒh‚ÌŒø‰Ê‚ð•ŠíƒTƒCƒYC³‚È‚µ‚Ì’êã‚°‚É•ÏX
-EATKEDEF‚Ìオ‚éƒJ[ƒh‚ÌŒø‰Ê‚Ì“K‰ž‚ÌŽd•û‚ð•ÏX
-
-map.h
- map_session_data‚Écatk(ƒJ[ƒhATK)‚ð’ljÁ
-
-pc.c
- pc_calcstatus()
- ƒAƒTƒVƒ“‚Ì“ñ“—¬‚ÌUŒ‚‘¬“x‚ðC³‚µ‚½
- ƒXƒNƒŠƒvƒg‚É‚æ‚é‘®«‚ð¶‰E³‚µ‚­“K‰ž‚·‚é‚悤‚É‚µ‚½
- –î‚Ì‘®«‚𳂵‚­“K‰ž‚·‚é‚悤‚É‚µ‚½i‹|‚Ì‘®«—Dæj
- ‚½‚¾‚µA–‚·‚ׂĂÌUŒ‚‚É“K‰ž‚³‚ê‚Ü‚·
- ƒJ[ƒhATK‚̈—‚ð’ljÁ‚µ‚½
-
-battle.c
- battle_calc_weapon_attack()
- ƒJ[ƒgATK‚ð’êã‚°ƒ_ƒ[ƒW‚Æ‚µ‚ÄŒvŽZ‚·‚é‚悤‚É‚µ‚½
-
-item_db.txt
- ƒJ[ƒh‚Ì bonus bAtkAbDef ‚ðíœ
- ‚©‚í‚è‚ÉA‘•”õ‚Æ“¯—l‚ÉATK‚ÆDEF‚ðÝ’è
- i•ÏX‘O‚ðitem_db2.txt‚Æ‚µ‚Ä‚¢‚é‚Ì‚ÅA•s‹ï‡‚ª‚ ‚ê‚Ζ߂µ‚Ä‚­‚¾‚³‚¢j
-
-
---------------
-//0446 by hoenny
-Eƒ~ƒXƒgƒŒƒXƒJ[ƒhŽÀ‘•B
-EƒXƒLƒ‹Žg—p‚ÌŽžƒWƒFƒ€ƒXƒg[ƒ“Á”ïB
-EƒXƒLƒ‹Žg—p‚ÌŽž‘•”õƒ`ƒFƒbƒNB(ƒnƒ“ƒ}[ƒtƒH[ƒ‹‚¾‚¯C³‚µ‚悤‚Æ‚µ‚½‚ª...)
-Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚͈̔͂𠔼Œa5ƒZƒ‹(‘S25ƒZƒ‹)ƒC³
- map/skill.c
- skill_check_condition()C³B
- skill_castend_pos2()C³B
-
-Eƒ~ƒXƒgƒŒƒXƒJ[ƒhC³B
- db/item_db.txt
-
---------------
-//0445 by Aya
-
-EŠî–{ASPD‚ÆŒvŽZˆ—‚ðC³B
- db/job_db1.txt
- map/pc.c
-ESPŒW”‚ÆŒvŽZˆ—‚ðC³B
- db/job_db1.txt
- map/pc.c
-EƒXƒLƒ‹–¼‚ðenum‚Å錾‚µA‚»‚ê‚ðŽg‚¤‚悤‚É•ÏXB
- map/skill.h
- map/battle.c
- map/pc.c
- map/skill.c
-EƒŠƒJƒoƒŠ[‚̃XƒLƒ‹ID‚ªƒXƒ[ƒ|ƒCƒYƒ“‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³B
- map/skill.c
-EW’†—ÍŒüã‚ɃJ[ƒhŒø‰Ê‚ª“K—p‚³‚ê‚Ä‚¢‚½–â‘è‚ÌC³B
- map/pc.c
-EƒŠƒ€[ƒuƒgƒ‰ƒbƒvAƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒvAƒ|ƒCƒYƒ“ƒŠƒAƒNƒg‚̃^[ƒQƒbƒg‚ðC³B
- db/skill_db.txt
-EGMƒAƒJƒEƒ“ƒg‚ðjRO‚Ìclientinfo.xml‚©‚ç’ljÁB
- conf/GM_account.txt
-EwarningC³B
- map/party.c
-EƒLƒƒƒ‰ƒZƒŒ”FØŽž‚Élogin_id2‚̓`ƒFƒbƒN‚µ‚È‚¢‚悤‚É•ÏXB
- login/login.c
-Eobject_def.batˆÈŠO‘Sƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh‚ðLF‚É•ÏXB
-E*.cnfƒtƒ@ƒCƒ‹‚ð*.confƒtƒ@ƒCƒ‹‚É–¼‘O•ÏXB
-
---------------
-//0444 by Ž€_
-
-EGMƒRƒ}ƒ“ƒh‚â@ƒRƒ}ƒ“ƒh‚ɃRƒ}ƒ“ƒh•Ê‚ÉŽg—pƒŒƒxƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏX‚Æ@ƒRƒ}ƒ“ƒh­‚µC³B(@where‚Æ@dayA@night‚ÌC³‚Æ‘¼‚̃Lƒƒƒ‰‚ÉŽg‚¤ƒRƒ}ƒ“ƒh‚Ìê‡GMƒŒƒxƒ‹‚ªŽ©•ªˆÈã‚Ìꇎg‚¦‚È‚¢‚悤‚ÉC³B)
- atcommand.h C³B
- atcommand.c C³B
- clif.c C³B
- map/makefile C³B
- map.c
- do_init() C³B
- conf/atcommand_athena.cnf ’ljÁB
-Eׂ©‚¢C³B
- pc.c
- pc_setghosttimer()Apc_skill() C³B
- script.c
- buildin_skill() C³B
-Econf_ref.txt C³B
-Eitem_db.txt
- ”Þ—‚Ì‘z‚¢C³B
-
---------------
-//0442 by ŒÓ’±—–
-
-E‘‘¬ƒ|[ƒVƒ‡ƒ“ŽÀ‘•
- ELv‚âE‹Æ”»’è‚Ís‚¢‚Ü‚¹‚ñ
-
- (db/)
- const.txt
- SC_SpeedPot0,SC_SpeedPot1,SC_SpeedPot2’ljÁ
- item_db.txt
- ‘‘¬ƒ|[ƒVƒ‡ƒ“‚̃XƒNƒŠƒvƒg’ljÁ
- (map/)
- skill.c
- skill_status_change_start()C³
- pc.c
- pc_calcstatus()C³
-
-EPvPƒVƒXƒeƒ€‚̉¼ŽÀ‘•
- Epvpƒ}ƒbƒv‚Å‚ÍŽ©“®“I‚ÉAPC‚Ìpvpƒtƒ‰ƒOonA‡ˆÊ’Ê’m‚È‚Ç‚ðs‚¢‚Ü‚·B
- Eƒ}ƒbƒv‚Épvpƒtƒ‰ƒO‚ð‚‚¯‚éƒTƒ“ƒvƒ‹‚ðnpc_pvp.txt‚Æ‚µ‚Ä“Y•t‚µ‚Ä‚¢‚Ü‚·B
- Epvp‚ÌÚ‚µ‚¢ƒ‹[ƒ‹‚ª‚æ‚­‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAŽŸ‚̂悤‚É‚µ‚Ä‚¢‚Ü‚·B
- Eʼn‚ÌŽ‚¿“_‚Í5“_A“|‚·‚Æ1“_A“|‚³‚ê‚é‚Æ-5“_B
- E0“_ˆÈ‰º‚ÌPC‚̓ŠƒUƒŒƒNƒVƒ‡ƒ“‚ªŠ|‚©‚ç‚È‚¢
- EGM‚Ípvpƒ}ƒbƒv‚É‚¢‚Ä‚à‘«Œ³‚ɃT[ƒNƒ‹‚ªoŒ»‚µ‚È‚¢‚悤‚Å‚·B
- iƒNƒ‰ƒCƒAƒ“ƒg‚ÌŽd—lHj
- Epvpƒ}ƒbƒv‚Å@pvpoff/@pvp‚·‚é‚Æ‹xŒe‚µ‚½‚èA‹xŒe‚ð‚â‚ß‚½‚è‚Å‚«‚Ü‚·‚ªA
- Žg—p‚·‚é‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- (conf/)
- npc_pvp.txt
- pvpƒtƒ‰ƒO‚ð“ü‚ê‚éƒTƒ“ƒvƒ‹B
- nosaveƒtƒ‰ƒO‚âŽó‚¯•t‚¯npc‚È‚Ç‚ð’ljÁ‚·‚é‚Æ‚æ‚¢‚ÆŽv‚í‚ê‚éB
- (map/)
- clif.c
- clif_parse_LoadEndAck()C³
- npc.c
- npc_parse_mapflag()C³
- skill.c
- skill_castend_nodamage_id()C³
- pc.c
- pc_damage()ˆø”C³
- atcommand.c
- pc_damage()ˆø”C³‚É”º‚¤C³
- battle.c
-
-E‚»‚Ì‘¼C³
- E@pvpoff/@pvp‚ŇˆÊ‚âƒT[ƒNƒ‹‚Ì•\Ž¦‚ð‚â‚ß‚½
- E@jumpto‚ŃXƒy[ƒX‚Ì“ü‚Á‚½ƒLƒƒƒ‰ƒNƒ^[‚àŽw’è‚Å‚«‚é‚悤‚É
- E@kamibƒRƒ}ƒ“ƒh•œŠˆi•¶Žš“V‚̺j
- E”ñPVP‚Ì‚Æ‚«‚ÉA‘ÎÛ‚ª“G‚̃XƒLƒ‹Žg—pŽžA“G–¡•û”»’è‚ðs‚¤‚悤‚É
-
- skill.c
- skill_castend_id()‚Å“G–¡•û”»’è
- atcommand.c
- ŠeƒRƒ}ƒ“ƒhC³
-
---------------
-//0440 by ’†‚Ìl
-
-E–{‰Æ‚ðÄŒ»‚·‚é•ûŒü‚È‚çˆÓ–¡‚Í‚È‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ª
-@pc.cuƒXƒNƒŠƒvƒg‚É‚æ‚éƒXƒLƒ‹Š“¾v‚ðŽáŠ±•ÏX‚µ‚Ä
- ƒJ[ƒh‚É‚æ‚éƒXƒLƒ‹ˆêŽžK“¾‚ÌÛ‚Å‚à1ƒŒƒxƒ‹ˆÈã‚ðÝ’è‚Å‚«‚é‚悤‚É’v‚µ‚Ü‚µ‚½B
-
-@’Pƒ‚É•„†‚ð•Ï‚¦‚Ä‚²‚Ü‚©‚µ‚½‚¾‚¯‚Å‚·‚Ì‚Å
-@•K—v‚É‚ ‚킹‚ÄC³‚ð‚µ‚Ä‰º‚³‚¢B
-
---------------
-//0439 by hoenny
-Eˆ¢C—…”e–PŒ‚ÌC³B
- db/skill_db.txt
-Eƒ‚ƒ“ƒXƒ^[î•ñ‚ÌC³B
- map/clif.c
-EŒ©Ø‚è‚ÌŽÀ‘•B
- map/pc.c
-
---------------
-//0438 by ‚`‚Ìl
-EŒÃ–Ø‚ÌŽ}‚ªŽg‚¦‚éꊂð‚m‚o‚bƒXƒNƒŠƒvƒg‚©‚秌ä‰Â”\
-@mapflag‚Énobranch‚Æ‚·‚ê‚΂»‚̃}ƒbƒv‚͌Ö؂̎}Žg—p•s‰Â‚É‚È‚è‚Ü‚·B
- map.h
- enum‚ÉMF_NOBRANCH ’ljÁB
- npc.c
- npc_parse_mapflag() C³B
- pc.c
- pc_useitem() C³B
-ƒ\[ƒX‰˜‚­‚µ‚Ä‚µ‚Ü‚Á‚½‚©‚àEEE.
-•×‹­•s‘«‚Å‚·
-
---------------
-//0437 by ”g˜Q
-Eitem_db.txt‚̉p–¼‚ð‘å•C³B(s•t‚«‚Æ‚»‚¤‚Å‚È‚¢•Ší‚̉p–¼‚ª‚¢‚‚̊Ԃɂâ‚ç
-@“¯‚¶‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Å‚»‚ê‚𒼂·‚‚¢‚Å‚É‘¼‚Ì•”•ª‚àC³‚µ‚Ü‚µ‚½B
- ‚Ü‚Á‚½‚­ˆá‚¤–¼‘O‚É‚È‚Á‚Ä‚é‚à‚Ì‚à‚ ‚è‚Ü‚·‚ªA‚±‚Á‚¿‚Ì•û‚ª³‚µ‚¢‚ÆŽv‚¢‚Ü‚·B
-Eitem_purplebox.txt‚ð–{‰ÆŽd—l‚Á‚Û‚­ì¬(‘å‘Ì‚±‚ñ‚ÈŠ´‚¶‚©‚Æ
-EƒAƒ‹ƒxƒ‹ƒ^‚ƃCƒYƒ‹[ƒhNPC‚ðC³
-
---------------
-//0436 by hoenny
-Emorocc •óΤl‚ÌC³
- conf/npc_shop.txt
-Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚ÌŽÀ‘•(AlchemistŽƒ\[ƒX‚ðŽQÆ‚ ‚肪‚Æ‚¤I)
- map/skill.c
-ˆÈ‘O‚É•¶Žš‰»‚¯‚Í’á‚Ì‚¹‚¢!
-ŽŸ‚©‚ç‹C‚ð•t‚¯‚Ü‚·.
-
---------------
-//0434 by Avethes
-
-Eƒ^[ƒgƒ‹ƒAƒCƒ‰ƒ“ƒh‚Ös‚­NPCC³
-Eƒ†ƒm[NPCC³
-i‘O‰ñ‚̃oƒO‚Í‚·‚Ý‚Ü‚¹‚ñ‚Å‚µ‚½j
-
---------------
-//0433 by Ž€_
-
-E»‘¢ƒoƒOC³B
- ‰½ŒÌ‚©‚Í‚í‚©‚ç‚È‚¢‚ªskill.c‚Ìskill_readdb()‚ª•Ï‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³B(Ž©•ª‚ª‚â‚Á‚½C³‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
- skill.c
- skill_readdb() C³B
-
---------------
-//0432 by Ž€_
-
-E0429‚ňꕔ‚̃AƒCƒeƒ€‚̃XƒLƒ‹‚ªo‚È‚¢–â‘èC³B
- clif.c
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
-Eskill.c
- skill_use_id() C³B(‘債‚½C³‚Å‚Í‚È‚¢‚Å‚·B)
-Eitem_db.txt‚Ì•¶Žš‰»‚¯C³BŒ¾Œêݒ肪“ú–{Œê‚Å‚Í‚È‚¢ê‡•Û‘¶‚·‚鎞‚É‚Í‹C‚ð‚‚¯‚Ü‚µ‚傤B
-EUŒ‚‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚Ì”½Œ‚‚ª‘‚·‚¬‚é–â‘èC³BŽn‚ß‚Ä‚ÌUŒ‚‚ªƒ‚ƒ“ƒXƒ^[‚ÌUŒ‚ƒfƒBƒŒƒC‚ÉŠÖŒW‚È‚­100msŒã‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅUŒ‚ƒfƒBƒŒƒC‚ɇ‚킹‚é‚悤‚É•ÏXB(‚½‚¾­‚µ”½Œ‚‚ª’x‚¢‚ÆŽv‚í‚ꂽ‚è‚à‚µ‚Ü‚·‚ª...)
- mob.c
- mob_changestate() C³B
-EŽI‚ÉÚ‘±‚·‚éÅ‘ål”‚ðŒˆ‚ß‚é‚悤‚É•ÏXB
- char.c C³B
- conf_ref.txt C³B
- char_athena.cnf C³B
-
---------------
-//0430 by Avethes
-
-E‚m‚o‚bŠÖŒWB‚Ù‚Æ‚ñ‚ǃeƒXƒgB
-–{‰Æ‰ï˜bî•ñ‚ª‘µ‚¦‚ÎC³B
-
---------------
-//0429 by Ž€_
-
-EƒMƒ‹ƒh‚̃Œƒxƒ‹ƒAƒbƒv‚ðƒLƒƒƒ‰‚̃Œƒxƒ‹ƒAƒbƒv‚̂悤‚É•ÏXB
- int_guild.c
- guild_calcinfo() C³B
- guild_next_exp() ’ljÁB
- exp_guild.txt C³B(ƒŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢‚悤‚É‚µ‚½‚¢ƒŒƒxƒ‹‚Ìexp‚É0‚ð“ü‚ê‚ê‚΂»‚êˆÈã‚ɃŒƒxƒ‹‚ªã‚ª‚ç‚È‚­‚È‚è‚Ü‚·B)
-EƒXƒNƒŠƒvƒgresetstatusAresetskill ’ljÁB
- pc.c
- pc_resetskill() C³B
- script.c
- buildin_resetstatus()Abuildin_resetskill() ’ljÁB
-E0425‚Ì‘±‚«‚Å­‚µC³B
- clif.c
- clif_parse_ ‚ð­‚µC³B
-EƒVƒ‡[ƒgƒJƒbƒg‚ÉŠo‚¦‚Ä‚¢‚éƒXƒLƒ‹ƒŒƒxƒ‹ˆÈã‚̃XƒLƒ‹‚ª“o˜^‚³‚ê‚Ä‚¢‚Ä‚àŠo‚¦‚Ä‚¢‚éƒXƒLƒ‹ƒŒƒxƒ‹‚܂ł̃XƒLƒ‹‚ðŽg‚¤‚悤‚É•ÏXB
- clif.c
- clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
-Eƒƒ‚‚Ìő唂ð10ŒÂ‚É•ÏXB(‚ ‚­‚Ü‚Å‚àŠg’£‚ׂ̈̕¨‚Å‚·B‚Ü‚¾‹@”\‚Í‚µ‚Ü‚¹‚ñB)
- mmo.h
- struct mmo_charstatus‚Ìmemo_point‚ð3‚©‚ç10‚É•ÏXB
- char.c
- mmo_char_tostr() C³B
-Emob,c
- mob_once_spawn()Amob_summonslave() C³B(•Ê‚ɈӖ¡‚ª‚ ‚éC³‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª...)
-E@monster ƒRƒ}ƒ“ƒh‚ÅÀ•W‚ðŽw’肵‚È‚¢Žžƒ‚ƒ“ƒXƒ^[‚ªˆê‚©Š‚ÉW’†‚µ‚Äo‚é‚Ì‚ðƒLƒƒƒ‰‚Ì10*10ƒ}ƒXˆÈ“à‚Ƀ‰ƒ“ƒ_ƒ€‚ÅŒ»‚ê‚é‚悤‚É•ÏXB
- atcomand.c C³B
-
---------------
-//0428 by Avethes
-
-Econf/npc_smilegirl.txt
- ƒXƒ}ƒCƒ‹ƒ}ƒXƒNƒK[ƒ‹ƒXƒNƒŠƒvƒgB
- 0427‚Ì‚¨‚©‚µ‚¢•”•ª‚Æ‚©C³B
- ’ñ‹Ÿ‚³‚ꂽŠe“sŽs‚ÌÀ•W‚É”z’uBiNONAME‚³‚ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤Ij
-
---------------
-//0426 by ŒÓ’±—–
-
-EƒAƒCƒeƒ€‚Ì–¼‘O‚ðdata.grf‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
- itemdb.c‚ÌITEMDB_OVERRIDE_NAME‚ð’è‹`‚µ‚È‚¯‚ê‚Γǂݞ‚Ý‚Ü‚¹‚ñB
- ITEMDB_OVERRIDE_NAME_VERBOSE‚Íitemdb.txt‚̃fƒoƒO—p‚É‚Ç‚¤‚¼B
- •’Ê‚Í•Ï‚¦‚é•K—v‚Í‚È‚¢‚ÆŽv‚¤‚Ì‚Åbattle_config‚É‚Í“ü‚ê‚Ä‚¢‚Ü‚¹‚ñB
-
- itemdb.c
- itemdb_read_itemnametable()’ljÁ
- do_init_itemdb()C³
-
-Eƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý•”‚Ì•sˆÀ’è«‚ÌC³(Œ‹\’v–½“I‚¾‚Á‚½‚Ý‚½‚¢‚Å‚·)
- ‚È‚­‚Ä‚à–â‘è‚È‚¢DBiitem_value_db.txt‚È‚Çj‚̃tƒ@ƒCƒ‹‚ª‚È‚¢ê‡‚É
- ŽI‚ª—Ž‚¿‚½‚è‚·‚錻ۂª”­¶‚µ‚Ä‚¢‚½ê‡‚Í‚±‚ê‚Å’¼‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ.
-
- skill.c
- skill_readdb()‚ÅNULLƒ|ƒCƒ“ƒ^ƒ`ƒFƒbƒN‚ð’ljÁ
- itemdb.c
- item_readdb()‚ð•¡”‚É•ª‚¯‚½B
- ƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý•”‚ð‚P‚‚ɓZ‚ß‚½B
- do_init_itemdb()C³
-
-Eׂ©‚¢ƒoƒOC³
- Eƒ[ƒvƒ|[ƒ^ƒ‹‚ÌŠJ‚­‚Ü‚Å‚Ì•b”’²®
-
- skill.c
- skill_unitsetting()C³
-
-E‚»‚Ì‘¼C³iby –^MŽj
- db/job_db1.txt
- ‚¿‚傱‚Á‚ÆC³
- db/job_db2.txt
- 2-2ŽŸE‚Ì‘«‚è‚È‚¢Jobƒ{[ƒiƒX‚ð’ljÁ(ŽQl:R.O.M 776)
- conf/npc_town_kafra.txt
- ƒI[ƒND‘O‚Æ’Yz‘O‚ɃJƒvƒ‰”z’u(“®ì–¢Šm”F)
- conf/npc_shop3.txt
- ƒWƒ…[ƒm”Ì”„NPC(E‚¢•¨)
- conf/npc_town_yuno.txt
- ƒWƒ…[ƒmNPC(E‚¢•¨‚ð‰ü—ÇB“®ì–¢Šm”F)
-
---------------
-//0425 by Ž€_
-
-E0419‚Å‘‚«–Y‚ꂽ•¨‚Å‚·‚ªƒXƒLƒ‹ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“‚ªSP‰ñ•œƒAƒCƒeƒ€‚É‚àŒø‰Ê‚ª‚ ‚é‚悤‚É•ÏXB
-E¡“x‚̓oƒOC³‚ªƒƒCƒ“‚Å‚·BŽI—Ž‚¿‚ª‚È‚è‚»‚¤‚ÈŠ‚ÌC³‚ƃeƒŒƒ|[ƒg‚ÌŽžŽ€‚ñ‚¾‚܂܈ړ®‚Å‚«‚é–â‘è‚Æ0419‚ŃAƒNƒeƒBƒuƒ‚ƒ“ƒXƒ^[‚ÌæU–â‘èC³AŽ€‚ñ‚Å‚¢‚é‚Ì‚É‘¼‚Ìl‚É‚ÍŽ€‚ñ‚¾‚悤‚ÉŒ©‚¦‚È‚¢–â‘è‚ÌC³‚Å‚·B­‚µƒeƒXƒg‚Í‚µ‚Ü‚µ‚½‚ª–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·B•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
- pc.c
- pc_attack_timer()Apc_damage()Apc_walk() C³B
- map.c
- map_quit() C³B
- mob_db.txt
- ƒrƒbƒOƒtƒbƒg‚Ìmode‚ðC³(ƒAƒNƒeƒBƒu‚É‚È‚Á‚Ä‚¢‚½ˆ×)
- clif.c
- clif_parse_WalkToXY()Aclif_pcoutsight()Aclif_pcinsight()A
- clif_getareachar_pc()Aclif_getareachar_mob()Aclif_getareachar_pet() C³B
- mob.c
- mob_ai_sub_hard_activesearch()Amob_ai_sub_hard_mastersearch()A
- mob_walk() C³B
- pet.c
- pet_walk() C³B
-
---------------
-//0424 by hoenny
-
-EƒNƒŠƒbƒvƒ{[ƒiƒX SP 10’ljÁ
- db/item_db.txt
-Ewarp_test_yuno.txt‚ð npc_warp30.txt‚ÉŠÜ‚ñ‚Å, ‚¿‚å‚Á‚ÆC³
- conf/npc_warp30.txt
-E‘¼‚̃T[ƒo[‚ª—Ž‚¿‚Ä‚à•œ‹Œ‚³‚ê‚é‚悤‚ÉC³
- /startƒNƒŠƒbƒv
-
---------------
-//0420 by g—t
-
-EEP 3.0‚ł̃J[ƒhŒø‰Ê•ÏX‚ɉð‚é”͈͂őΉžB
-@‚Ù‚Ú‘S‚Ä‚Ì•ÏX“_‚ɂ‚¢‚ÄAo—ˆ‚éŒÀ‚èC³‚µ‚Ä‚ ‚è‚Ü‚·B
-@ATKC³‚ª³‚µ‚­“K—p‚³‚ê‚Ä‚¢‚é‚悤‚Ȃ̂ŒljÁ‚µ‚Ä‚ ‚è‚Ü‚·B(ƒAƒ“ƒhƒŒC‚È‚Ç)
-
---------------
-//0419 by Ž€_
-
-E0414‚Å‘‚«–Y‚ꂽ•¨‚Å‚·‚ª MOB‚Ìmode‚Å0x20(32)‚𕜊ˆ‚³‚¹‚Ü‚µ‚½Bƒ{ƒX‚¶‚á‚È‚­‚Ä‚àmode‚É0x20‚ª“ü‚Á‚Ä‚¢‚éꇕ’Ê‚ÌMOB‚Å‚àŽ€‚ñ‚¾‚Ó‚è‚ð”j‚ê‚Ü‚·B
-(¡‚ÌŠ‹@”\‚Í‚»‚ꂾ‚¯‚Å‚·B–{ŽI‚ÍAI‹­‰»‚Ý‚½‚¢‚Å‚·‚ª...) ‚½‚¾ƒS[ƒXƒg‚̓{ƒX‚Å‚à”j‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
-‚»‚ê‚ÆŽæ‚芪‚«‚ÌAI‚ÅŽæ‚芪‚«‚ªƒ^[ƒQƒbƒg‚µ‚½ŽžŽå‚ªƒ^[ƒQƒbƒg‚µ‚Ä‚È‚¢‚Ǝ傪Žæ‚芪‚«‚̃^[ƒQƒbƒg‚ðƒ^[ƒQƒbƒg‚·‚é•”•ª‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B(‚±‚ꂪ–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚ÆŽv‚¢‚Ü‚µ‚½‚Ì‚Å...)
-EŒÃ‚¢Â‚¢” AŒÃ‚¢Ž‡F‚Ì” AŒÃ‚¢ƒJ[ƒh’Ÿ‚Åo‚éƒAƒCƒeƒ€‚ðƒtƒ@ƒCƒ‹‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB
- script.c
- buildin_getitem() C³B
- item_db.txt
- ŒÃ‚¢Â‚¢” AŒÃ‚¢Ž‡F‚Ì” AŒÃ‚¢ƒJ[ƒh’ŸC³B
- item_bluebox.txtAitem_purplebox.txtAitem_cardalbum.txt ’ljÁB(Žg—p—á’ö“x‚Ì•¨‚Å‚·B‚ǂ̃AƒCƒeƒ€‚ªo‚é‚悤‚É‚·‚é‚©‚ÍŽ©•ª‚Åݒ肵‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B‚½‚¾ƒNƒ‰ƒCƒAƒ“ƒg‚ð—Ž‚Æ‚·ƒAƒCƒeƒ€‚Ío‚È‚¢‚悤‚Éݒ肵‚Ä‚­‚¾‚³‚¢B)
- itemdb.h
- struct random_item_data ’ljÁB
- itemdb.c
- itemdb_searchrandomid()Aitemdb_readdb() C³B
-Emob.c
- mob_target()Amob_ai_sub_hard() C³B(–â‘肪‚ ‚è‚»‚¤‚È•”•ª‚¾‚¯C³B)
-Epc.c
- pc_itemheal()Apc_walktoxy_sub() C³B
-Eƒyƒbƒg‚ÌoŒ»‚ðMOB‚Æ“¯‚¶‚悤‚É•ÏXB
- clif.c
- clif_spawnpet() C³B
- pet.c
- pet_change_name() C³B
-E0418‚ð­‚µC³B(if•¶‚ÌðŒ‚ð­‚µC³‚µ‚½‚¾‚¯‚Å‚·B)
-
---------------
-
-//0418 by hoenny
-E /mm(/mapmove) /nb /b /bb /resetskill /resetstate GM –½—ߌêŽg—p‚̧ŒÀ
-clif_parse_MapMove ,clif_parse_ResetChar ,clif_parse_GMmessage C³
- map/clif.c
-
---------------
-//0417 by ‚ê‚ 
-
-E0412‚Åitem_db.txt‚ª‚¨‚©‚µ‚­‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
-
---------------
-//0416 by g—t
-
-EƒWƒ…ƒm[Žü•Ó‚̃[ƒv’è‹`‚Æ“G‚Ì”z’uB
-@ƒ[ƒv’è‹`‚Ínpc_warp30.txt‚Æ‚µA’ljÁ‚·‚éŒ`‚É‚µ‚Ä‚ ‚è‚Ü‚·B
-@“G‚Ì”z’u‚ɂ‚¢‚Ä‚ànpc_monster.txt‚Æ‚Í“‡‚¹‚¸Anpc_monster30.txt‚Æ‚µ‚Ä‚ ‚è‚Ü‚·B
-@–â‘肪–³‚¢‚悤‚Å‚ ‚ê‚Γ‡‚µ‚ĉº‚³‚¢B
-Eã‹L’è‹`ƒtƒ@ƒCƒ‹’ljÁ‚É]‚¢map_athena.cnf‚ð•ÏXB
-E@goƒRƒ}ƒ“ƒh‚ÖƒWƒ…ƒm[’ljÁB
-@—v–]‚ª‚ ‚Á‚½‚悤‚Ȃ̂ŒljÁ‚µ‚Ü‚µ‚½B
-
---------------
-//0415 by ’†‚Ìl
-
-E¡‚Í–S‚«‹ŒROƒGƒ~ƒ…ŽIŠJ”­ƒXƒŒƒbƒh Lv02‚Å‚ÌŽ€_Ž‚Ìà–¾‚É]‚Á‚Ä
-@ƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^‚ðŽáŠ±•ÏX‚³‚¹‚Ä’¸‚«‚Ü‚µ‚½B
- E‰ß‹Ž‚Ìnpc_monster.txt‚©‚ç’Êíƒ}ƒbƒvãiƒ‹ƒeƒBƒG“™œ‚­j‚É‚¢‚éƒTƒ“ƒ^ƒ|ƒŠƒ“AƒAƒ“ƒ\ƒj‚ð’Šo‚µ
- @V‚½‚Éì‚Á‚½unpc_x-masmonster.txtv‚Ɉړ]
- Eã‹L‚ÌC³‚É‚ ‚킹‚Ämap_athena.cnf‚ðC³B
- @map_athena‚ɃRƒƒ“ƒgƒAƒEƒgó‘Ô‚Åunpc: conf/npc_x-masmonster.txtv‚ð’ljÁ‚µ‚Ü‚µ‚½B
- @•K—v‚É‚ ‚킹‚ăRƒƒ“ƒgƒAƒEƒg‚ð‚µ‚Ä‰º‚³‚¢B
-
---------------
-//0414 by Ž€_
-
-Estrcasecmp‚ðstrcmpi‚É•ÏXB
-Edb‚âÝ’èƒtƒ@ƒCƒ‹‚ð“Ç‚ÞŽž// ‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚ÉC³B
-Eƒyƒbƒg‚Æ—£‚ê‚·‚¬‚é‚ƃyƒbƒg‚ª‘‚­“®‚­‚悤‚É•ÏXB(ƒLƒƒƒ‰‚Ì2”{‚Ì‘¬“x‚Å“®‚«‚Ü‚·B)
-Eƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚ªƒAƒCƒeƒ€‚ðƒ^[ƒQƒbƒg‚µ‚½ŽžUŒ‚‚ðŽó‚¯‚Ä‚àUŒ‚‚µ‚Ä‚±‚È‚¢–â‘èC³B
-E“¯‘°ƒ‚ƒ“ƒXƒ^[‚ÌAI‚ð•ÏXB¡‚Ü‚Å‚Ítraget_id‚ðŽg‚¤‚¹‚¢‚Ń‚ƒ“ƒXƒ^[‚ªUŒ‚‚µ‚½‘ŠŽè‚ðUŒ‚‚·‚éŽd‘g‚Ý‚¾‚Á‚½‚ª¡“x‚Íattacked_id‚ðŽg‚¤ˆ×UŒ‚‚µ‚Ä‚«‚½‘ŠŽè‚ðUŒ‚‚·‚é‚悤‚É•ÏXB
-‚½‚¾¡‚ÌŽd—l‚¾‚Æ“¯‘°ƒ‚ƒ“ƒXƒ^[‚ðUŒ‚‚µ‚Ä“¦‚°‚éê‡UŒ‚‚ðŽó‚¯‚½Žž‚»‚Ìê‚É‚È‚©‚Á‚½ƒ‚ƒ“ƒXƒ^[‚͂‚¢‚Ä—ˆ‚È‚­‚È‚Á‚Ä‚¢‚Ü‚·B–{ŽI‚ÌŽd—l‚É‚ ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·‚Ì‚Åî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B(attacked_id‚Í‚¢‚Â‚àƒŠƒZƒbƒg‚³‚ê‚éˆ×‚Å‚·B‘Îô‚ª‚¢‚È‚¢‚킯‚Å‚à‚È‚¢‚Å‚·‚ª–{ŽI‚ÌŽd—l‚ð’m‚ç‚È‚¢‚Ì‚Å...)
-Eƒƒ‚ƒŠ[‚ÌŽg—p—Ê‚ðŒ¸‚ç‚·ˆ×struct mob_data‚Æstruct npc_data‚ð•ÏXB(0412‚Å
-map-server‚̃ƒ‚ƒŠ[‚ÌŽg—p—Ê‚ª164???KBytes‚¾‚Á‚½‚ª0414‚Å‚Í152???KBytes‚É‚È‚è‚Ü‚µ‚½B‚Ù‚ñ‚Ì­‚µŒ¸‚Á‚½‚¾‚¯‚Å‚·‚ª‘‚¦‚é‚æ‚è‚Í‚Ü‚µ‚¾‚ÆŽv‚¢‚Ü‚·‚Ì‚Å...)
-EƒS[ƒXƒgƒ^ƒCƒ€ŽÀ‘•B
- ƒ}ƒbƒvˆÚ“®‚âƒeƒŒƒ|[ƒgA•œŠˆ‚µ‚½Žž‚É“G‚É‘_‚í‚ê‚È‚¢ŽžŠÔ‚ðd—͂ł̓S[ƒXƒgƒ^ƒCƒ€ŒÄ‚ñ‚Å‚¢‚Ü‚·B‚»‚̃S[ƒXƒgƒ^ƒCƒ€‚ÌŽÀ‘•‚Å‚·B
-battle_athena.cnf‚ÅŽžŠÔ‚ðÝ’è‚Å‚«‚Ü‚·BŽžŠÔ‚ð0‚É‚·‚é‚ƃS[ƒXƒgƒ^ƒCƒ€‚Íì“®‚µ‚Ü‚¹‚ñB‚½‚¾‚±‚̃S[ƒXƒgƒ^ƒCƒ€‚ÍUŒ‚s“®AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚ð‚·‚é‚Æ‚È‚­‚È‚è‚Ü‚·B
- char/int_guild.c
- char/int_party.c
- conf/battle_athena.cnf
- db/mob_db.txt
- doc/conf_ref.txt
- login/login.c
- map/atcommand.c
- map/battle.c
- map/battle.h
- map/clif.c
- map/itemdb.c
- map/map.c
- map/map.h
- map/mob.c
- map/npc.c
- map/pc.c
- map/pc.h
- map/pet.c
- map/skill.c ‚ðC³B(db/mob_db.txt‚Í//‚ð“ü‚ꂽ‚¾‚¯‚Å‚·‚ª...)
- C³‚µ‚½Š‚ð‘S‚ÄŠo‚¦‚Ä‚Ü‚¹‚ñ‚̂Ńtƒ@ƒCƒ‹‚¾‚¯’m‚点‚Ü‚·B
-
---------------
-//0412 by ‚¢‚Ç
-
-Eƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^(“ú–{Œê)‚ÌÄ®—
-@ ‹ŒŒfŽ¦”‚Ŏw“E‚Ì‚ ‚Á‚½Ž–€‚ɂ‚¢‚Ä‘å‘͈̂̔͂ÅC³
- snapshot387‚̃o[ƒWƒ‡ƒ“‚ðƒx[ƒX‚ÉC³‚µ‚Ü‚µ‚½B
- conf/npc_monster.txt
-
-EƒAƒCƒeƒ€–¼‚Ì’è‹`‚ð‘å•C³
- (root)
- item.list
- (db/)
- item_db.txt
- item_value_db.txt
-
-Eƒ}ƒbƒvƒf[ƒ^‚Ì’è‹`‚ŃRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚½ƒWƒ…ƒm[ŠÖ˜Aƒ}ƒbƒv‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
- conf/map_athena.cnf
-
---------------
-//0411 by Ž€_
-
-EŽIsnapshot‚Å‚·B‚»‚ê‚Ælogin_portAchar_portAmap_port‚Ìݒ肪‚È‚­‚Ä‚à
-ƒfƒtƒHƒ‹ƒg‚Å6900A6121A5121‚ðŽg‚¤‚悤‚É•ÏXB
-Elogin.cAchar.cAchrif.cAclif.c ­‚µC³B
-Econf_ref.txt C³B
-Elogin_port‚ð6900‚©‚瑼‚Ì•¨‚É•Ï‚¦‚½ê‡‚Íclientinfo.xml‚ð•Ï‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B
-
---------------
-//0410 by Ž€_
-
-GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽÀ‘•B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB@ƒRƒ}ƒ“ƒh‚̓eƒXƒgÏ‚Ý‚Å‚·‚ª...)
-0407‚ÌEXP‚ÉŠÖ‚·‚éC³‚É–â‘肪‚ ‚é‚炵‚¢‚Ì‚ÅC³‚µ‚Ü‚µ‚½B¡“x‚̓eƒXƒgÏ‚Ý‚Å‚·B
-GM‚̃AƒJƒEƒ“ƒgID‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏX‚ÆGM‚ðƒŒƒxƒ‹•Ê‚É•ª‚¯‚é‚悤‚É•ÏXB
-(GM‚̃Œƒxƒ‹‚É‚æ‚é@ƒRƒ}ƒ“ƒh“™‚ɧŒÀ‚ð‚©‚¯‚é‚‚à‚è‚Å‚·‚ª¡§ŒÀ‚ª‚©‚¯‚Ä‚¢‚镨‚Í@kickA@kickall‚Ì‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
-Epc.c
- pc_readdb()Apc_gainexp()Apc_nextbaseexp()Apc_nextjobexp()A
- pc_checkbaselevelup()Apc_checkjoblevelup() C³B
- pc_isGM()Apc_read_gm_account() ’ljÁB
-Epc.h
- pc_isGM() C³B
- pc_read_gm_account() ’ljÁB
-Eexp.txt
- ƒŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢”’l‚ð999999999‚©‚ç0ˆÈ‰º‚É•ÏXB
- ƒŒƒxƒ‹‚ðã‚°‚éˆ×‚É•K—v‚ÈEXP‚ð999999999ˆÈã‚É‚·‚邱‚Æ‚à‰Â”\B
-Eclif.c
- clif_GM_kickack()Aclif_GM_kick()Aclif_parse_GMKick() ’ljÁB
-Eclif.h
- clif_GM_kickack()Aclif_GM_kick() ’ljÁB
-Eatcomand.c
- strncmpi‚ðstrcmpi‚É•ÏXB
- @kickA@kickall ƒRƒ}ƒ“ƒh’ljÁB
- @kick <ƒLƒƒƒ‰–¼>
- Ž©•ªˆÈŠO‚̃Lƒƒƒ‰‚ÌÚ‘±‚ð‹­§I—¹‚³‚¹‚éB(Ž©•ª‚æ‚èGMƒŒƒxƒ‹‚ª
- ’á‚¢ƒLƒƒƒ‰‚É‚µ‚©Žg‚¦‚È‚¢BGM‚Å‚Í‚È‚¢ƒLƒƒƒ‰‚ÌGMƒŒƒxƒ‹‚Í0)
- @kickall
- ŽI‚ÉÚ‘±‚µ‚Ä‚¢‚é‘S‚ẴLƒƒƒ‰‚ÌÚ‘±‚ð‹­§I—¹‚³‚¹‚éB(Ž©•ª‚Æ
- GM‚ðŠÜ‚ß‚Ä) ŽIƒ_ƒEƒ“—p‚̃Rƒ}ƒ“ƒh‚Å‚·BGMƒŒƒxƒ‹‚ª99‚¶‚á‚È‚¢‚Æ
- Žg‚¦‚È‚¢B
-Econf/GM_account.txt ’ljÁB
- GM‚Æ‚µ‚Ä”FŽ¯‚·‚éƒAƒJƒEƒ“ƒgID‚ðÝ’è‚·‚éƒtƒ@ƒCƒ‹‚Å‚·B
-Emmo.h
- DEFAULT_WALK_SPEED‚ð140‚©‚ç150‚É•ÏXB(‚±‚ꂪ–{ŽI‚É‚ ‚Á‚Ä‚é”’l
- ‚Ý‚½‚¢‚Å‚·‚Ì‚Å...)
- struct gm_account ’ljÁB
-Eclient_packet.txt
- ƒpƒPƒbƒg0x00cd ’ljÁB
-Elogin_port‚ðcnf‚œǂނ悤‚É•ÏXB(‚½‚¾6900‚©‚çƒ|[ƒg‚ð•Ï‚¦‚é‚ƃNƒ‰ƒCƒAƒ“ƒg‚ª”FŽ¯‚Å‚«‚È‚¢–Í—l‚È‚Ì‚Å–³‘Ê‚È‚±‚Æ‚¾‚Á‚½‚è‚à‚µ‚Ü‚·‚ª...)
- char.cAlogin.cAchar_athena.cnfAlogin_athena.cnf C³B
-E•’ʂ̃AƒJƒEƒ“ƒg쬂łÍGM‚É‚È‚ê‚È‚¢‚悤‚Élogin.c‚ð•ÏXB
-Elogin/makefileAmap/makefile C³B
-
---------------
-//0408 by ŒÓ’±—–
-
-E405‚ÌV‚µ‚¢—ƒRƒ}ƒ“ƒh‚ðˆÈ‘O‚Ìatcommand.c‚ÉŽæ‚èž‚Ý‚Ü‚µ‚½B
- E@kami‚ðC³
- E@kill,@recall,@charjob,@revive,@charstats,@charoption,@charsave,
- @night,@day,@doom,@doommap,@raise,@raisemap,@charbaselvl,@charjlvl
- ‚ð’ljÁ•ƒƒbƒZ[ƒW‚ð“ú–{Œê‚É•ÏX•­‚µC³
-
- atcommand.c
- ’ljÁ‚ÆC³
-
-Eˆê•”‚̃XƒLƒ‹‚ÌŒø‰ÊŽÀ‘•
- E•sŽ€g‚̃W[ƒNƒtƒŠ[ƒhAƒCƒhƒDƒ“‚Ì—ÑŒçAK‰^‚̃LƒXA
- ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[AƒtƒƒXƒgƒEƒFƒ|ƒ“Aƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[A
- ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
-
- map.h
- struct skill_unit‚Érange‚ð’ljÁB
- skill.c
- FXC³
- skill.h
- enum‚ÌC³‚È‚Ç
---------------
-//0407 by Ž€_
-
-Eƒyƒbƒg‚̃oƒOC³B(‚½‚¾Ž©•ª‚ÅÄŒ»‚Å‚«‚È‚©‚Á‚½‚Ì‚Å–â‘è‚É‚È‚è‚»‚¤‚ÈŠ‚¾‚¯C³‚µ‚Ü‚µ‚½B)
-Eƒyƒbƒg‚̈ړ®‘¬“x‚ðpet_db‚ɒljÁB
- pet.h
- struct pet_db‚Éspeed’ljÁB
- pet.c
- pet_catch_process2()Aread_petdb() C³B
- pet_db.txt
- ˆÚ“®‘¬“x’ljÁB
- (ƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚é‚̂̓Wƒ‹ƒ^ƒX‚ƃAƒŠƒX‚Å‚·B•ßŠl—p‚Ì
- ƒAƒCƒeƒ€‚ª‘¶Ý‚·‚邱‚ƂƃpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚±‚Æ‚©‚çl‚¦‚Ä
- ’ljÁ‚³‚ê‚é—\’è‚Ì•¨‚Æl‚¦‚ç‚ê‚Ü‚·B‚½‚¾‚»‚̕ߊl—p‚̃AƒCƒeƒ€‚ª
- ‚ ‚é‚ƃNƒ‰ƒCƒAƒ“ƒg‚ð—Ž‚¿‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B’ljÁ‚µ‚Ä‚à
- ‘䎌‚̓|ƒŠƒ“‚Ì•¨‚Å‚·‚Ì‚Å... •ßŠl—p‚̃AƒCƒeƒ€ˆÈŠO‚Í“K“–‚É“ü‚ꂽ
- •¨‚Å‚·B)
-Epc.cAclif.c
- pc_equipitem() C³B
- clif_parse_EquipItem() C³B
- pc_equipitem()‚Ì–¢ŠÓ’èƒAƒCƒeƒ€‚̃`ƒFƒbƒN‚ðclif_parse_EquipItem()‚É
- ˆÚ“®‚µ‚Ü‚µ‚½B(ƒyƒbƒg‚Ì‘•”õ‚à‚ ‚è‚Ü‚·‚Ì‚Å...)
-EƒŒƒxƒ‹‚ð99ˆÈã‚É‚ ‚°‚é‚悤‚É•ÏX‚ÆE‹Æ•Ê‚Ƀx[ƒXƒŒƒxƒ‹‚ÌŒÀŠEƒŒƒxƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
- map.h
- MAX_LEVEL’ljÁB
- pc.c
- pc_nextbaseexp(), pc_nextjobexp() C³B
- pc_readdb() C³B
-Eexp.txt C³BE‹ÆƒŒƒxƒ‹‚Æ“¯‚¶‚悤‚Ƀx[ƒXƒŒƒxƒ‹‚àEXPƒe[ƒuƒ‹‚ð3‚Âì‚è‚Ü‚µ‚½BƒŒƒxƒ‹ƒAƒbƒv‚ðŽ~‚ß‚½‚¢ƒŒƒxƒ‹‚Ìexp‚ð999999999‚É‚·‚ê‚΂»‚êˆÈヌƒxƒ‹‚ªã‚ª‚è‚Ü‚¹‚ñB‚‚܂ènoviceA1ŽŸE‹Æ‚Æ2ŽŸE‹Æ‚̃x[ƒXƒŒƒxƒ‹‚ÌŒÀŠE‚ðˆá‚¤‚悤‚ÉÝ’è‚Å‚«‚Ü‚·B‚»‚µ‚ăx[ƒXƒŒƒxƒ‹99ˆÈã‚Éオ‚é‚悤‚É‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B(exp.txt‚ÌC³‚ª•K—v‚Å‚·‚ª–{ŽI‚ƈႤ‚悤‚Éݒ肵‚½‚¢ê‡‚ÉC³‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B)
-E‘®«‚É‚æ‚é‰ñ•œ‚ðbattle_athena.cnf‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB
- attr_fix.txt C³B
- battle.h
- struct Battle_Config‚Éattr_recover ’ljÁB
- battle.c
- battle_config_read() C³B
- battle_athena.cnf C³B
-Econf_ref.txt C³B
-Eclient_packet.txt C³BƒyƒbƒgƒpƒPƒbƒg’ljÁ‚Æ­‚µC³B
-
---------------
-//0402 by ŒÓ’±—–
-
-E400‚̃oƒO‚ðˆê•”C³
- EŠ|‚©‚Á‚Ä‚È‚¢ƒXƒLƒ‹Œø‰Ê‚É‚æ‚éƒXƒe[ƒ^ƒXŒvŽZ‚ªs‚í‚ê‚Ä‚µ‚Ü‚¤ƒoƒOC³
- EŒø‰ÊC³F‚ ‚­‚Ü‚ÅŒø‰Ê‚ÌŒvŽZ‚ÌC³‚ÅAŽg‚¦‚È‚¢ƒXƒLƒ‹‚ÍŽg‚¦‚Ü‚¹‚ñB
- ƒXƒsƒAƒNƒBƒbƒPƒ“Aƒvƒƒ”ƒBƒfƒ“ƒXA푾ŒÛ‚Ì‹¿‚«A
- —[—z‚̃AƒTƒVƒ“ƒNƒƒXAŒû“JA•sŽ€g‚̃W[ƒNƒtƒŠ[ƒhA
- ƒCƒhƒDƒ“‚Ì—ÑŒçAƒT[ƒrƒXƒtƒH[ƒ†[AK‰^‚̃LƒX
- EŒø‰Ê’ljÁF‚ ‚­‚Ü‚ÅŒø‰Ê‚ÌŒvŽZ‚̒ljÁ‚ÅAŽg‚¦‚È‚¢ƒXƒLƒ‹‚ÍŽg‚¦‚Ü‚¹‚ñB
- ƒnƒ~ƒ“ƒOAŽ„‚ð–Y‚ê‚È‚¢‚ÅcAƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö(•ŠíƒŒƒxƒ‹–³Ž‹)A
- ƒGƒ^[ƒiƒ‹ƒJƒIƒXAƒhƒ‰ƒSƒmƒƒW[
- EŒø‰Ê•t‰ÁŒn‚Í‚¿‚å‚Á‚Æ‚Å‚à‰ö‚µ‚¢ƒXƒLƒ‹‚Í‘S‚ÄŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³
- EUŒ‚ŒnƒXƒLƒ‹‚Í‚Ù‚Æ‚ñ‚ÇŒ©‚Ä‚È‚¢‚Ì‚Å‚½‚Ô‚ñƒoƒO‘½‚¢‚Å‚·B
- E‘S‚Ä–¢ƒeƒXƒg‚Å‚·B‰ö‚µ‚·‚¬‚é•”•ª‚ðC³‚µ‚½‚¾‚¯‚Å‚·B
-
- map.h
- MAX_STATUSCHANGE‚ð128‚ÉC³
- pc.c
- pc_calcstatus()C³
- skill.c/skill.h
- enum‚ðC³
- skill_status_change_start()C³
- battle.c
- battle_calc_weapon_attack()‚È‚ÇC³
-
---------------
-//0400 by AppleGirl
-
-Can Someone Help Me.
-2-2 Skills added.
-All The Mastery Skills.
-SpearQuicken,Providence
-New Bard Skill Assassin Cross Of Sunset
-Providence
-Frost Joke
-Apple of Idun
-Service For You
-Meteor Strike (Different Style)
-Assassin Cross Of Sunset (not tested)
-All Masteries Done
-Providence
-Musical Strike
-Throw Arrow
-Frost Weapon << (Problems with elements)?
-Flame Launcher << (Problems with elements)?
-Seismic Weapon << (Problems with elements)?
-Lightning Loader << (Problems with elements)?
-Spirit Recovery
-Potion Pitcher (Tato)
-Axe Mastery (Tato)
-Spear Quicken
-Not Totally Working:
-Combo Finish
-Quadruple strike
-Triple Attack
-(skills in skill.c) (need to be finished.)
-CP_ARMOR
-CP_HELM
-CP_SHIELD
-CP_WEAPON
-STRIP_HELM
-STRIP_WEAPON
-STRIP_SHIELD
-STRIP_ARMOR
-
-* “K“–‚Șa–ó *
-2-2ŽŸEƒXƒLƒ‹‚ð’ljÁ‚µ‚Ü‚µ‚½
-‘S‚Ä‚ÌC—ûƒXƒLƒ‹AƒXƒsƒAƒNƒCƒbƒPƒ“Aƒvƒƒ”ƒBƒfƒ“ƒXA
-—[—z‚̃AƒTƒVƒ“ƒNƒƒXi–¢ƒeƒXƒgjAŠ¦‚¢ƒWƒ‡[ƒNAƒCƒhƒDƒ“‚Ì—ÑŒçA
-ƒT[ƒrƒXƒtƒH[ƒ†[AƒƒeƒIƒXƒgƒ‰ƒCƒNi­‚µˆá‚¤jA
-ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒNA–‚¿AƒtƒƒXƒgƒEƒFƒ|ƒ“(‘®«‚ª–â‘è‚ ‚èH)
-ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[(V)AƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“(V)Aƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[(V)
-‘§Aƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[
-Š®‘S‚É‚Í“­‚©‚È‚¢ƒXƒLƒ‹F
-–Ò—´ŒA—øŠÂ‘Sg¶AŽO’i¶
-(skills in skill.c) (Š®—¹‚³‚ê‚é•K—v‚ª‚ ‚é)
-ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒWAƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒWA
-ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒWAƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒWA
-ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€AƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“
-ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒhAƒXƒgƒŠƒbƒvƒA[ƒ}[
-
-*’ˆÓ !! CAUTION !! by ŒÓ’±—–*
-‚±‚Ì400‚ɂ̓oƒO‚ª‘å—Ê‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·B’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-there are many many BUGS in this update(400) !! Be careful !!
-
---------------
-//0399 by ŒÓ’±—–
-
-EMOBƒXƒLƒ‹Žg—pðŒ‚âs“®‚ðC³
- E–³s“®MOB‚ª‘Ò‹@Žž‚̃XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢–â‘è‚ðC³
- EðŒƒXƒLƒ‹”½‰ž(skillused)‚ª‚ǂ̃XƒLƒ‹‚É‚à”½‰ž‚µ‚Ä‚¢‚½ƒoƒOC³
- E”ñˆÚ“®MOB‚ª’ÇŒ‚‚µ‚Ä‚­‚é–â‘è‚ðC³
-
- mob.c
- mob_ai_sub_hard()C³
- mobskill_event()C³
- mobskill_use()C³
- skill.c
- skill_attack()C³
-
-EMOBƒXƒLƒ‹ˆê•”ŽÀ‘•
- EŽ©Œˆ(ƒGƒtƒFƒNƒg–³‚µ?)AŽ©”šAƒ^ƒoƒR‚ð‹z‚¤A”͈ÍUŒ‚
- HP‹zŽû‚Q‚Â(’Êí/–‚–@ji‰ñ•œƒGƒtƒFƒNƒg–³‚µ?jŽÀ‘•
-
- (db)
- skill_db.txt
- ƒXƒ‚[ƒLƒ“ƒO‚È‚Ç‚ðC³
- (map/)
- skill.c
- skill_castend_damage_id(),skill_castend_nodamage_id()C³
- battle.c
- battle_calc_misc_damage()C³
-
-E–¢ŠÓ’èƒAƒCƒeƒ€‚ª‘•”õ‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
-E–¢ŠÓ’èƒAƒCƒeƒ€‚ɃJ[ƒh‚ª‚³‚¹‚È‚­‚È‚è‚Ü‚µ‚½
-
- pc.c
- pc_equipitem(),pc_insert_card()C³
- clif.c
- clif_use_card()C³
-
-Ebattle_athena.cnf‚ÉMOB‚Ì”z’uŠ„‡‚ð’è‹`‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- E”z’u”‚ª‚P‚ÌMOB‚ɂ‚¢‚Ä‚Í“K—p‚³‚ê‚Ü‚¹‚ñ
- EŒvŽZŒã‚Ì”z’u”‚ª‚P–¢–ž‚ÌꇂP‚ÉC³‚³‚ê‚Ü‚·B
-
- (conf/)
- battle_athena.cnf
- mob_count_rate’ljÁ
- (doc/)
- conf_ref.txt
- C³
- (map/)
- battle.c/battle.h
- struct BattleConfig ‚É mob_count_rate ƒƒ“ƒo’ljÁ
- npc.c
- npc_parse_mob()‚ÌC³
-
-Eƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…‚ª‘ŠŽè‚ª‚P•C‚Å‚à‚Æ‚è‚ ‚¦‚¸“–‚½‚é‚悤‚É‚È‚Á‚½B
-
- skill.c
- skill_castend_damage_id()C³
-
-EŠw¶–X쬃Cƒxƒ“ƒg‚ÌC³
-
- (conf/)
- npc_event_making.txt
- ƒAƒƒGƒxƒ‰(606)‚ðƒAƒƒG(704)‚ÉB
-
-EƒpƒPƒbƒgî•ñC³
-
- (doc/)
- client_packet.txt
- 0199ƒpƒPƒbƒgC³
-
---------------
-//0397 by ‚¢‚Ç
-
-Eƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^(“ú–{Œê)‚Ì®—
- Enpc_monster25.txt‚ðnpc_monster.txt‚ɃŠƒl[ƒ€‚µA“à—e‚ð®—(Œ»Ýmob”:13450)
- E‚»‚ÌŒy—ʔłƂµ‚Änpc_monster_lite.txt‚ðì¬(Œ»Ýmob”:11959)
- Eã‹L‚ÌC³‚É‚ ‚킹‚Ämap_athena.cnf‚ðC³
-
---------------
-//0395 by ŒÓ’±—–
-
-EŽæ‚芪‚«MOB‚Ìs“®C³
- EƒAƒ“ƒNƒ‹‚Ȃǂňړ®‚Å‚«‚È‚¢ê‡Žå‚ɋ߂©‚È‚¢‚悤‚ÉC³
- EƒƒbƒN‚µ‚Ä‚¢‚é‚ÆŽå‚ɋߊñ‚鈗‚ð‚µ‚È‚¢‚悤‚ÉC³
- EŽå‚ªƒeƒŒƒ|[ƒg‚·‚é‚Æ’Ç‚¢‚©‚¯‚é‚悤‚ÉC³(•t‹ß10x10ƒ}ƒX’ö“x)
- EŽå‚Ì‚»‚΂ɂ¢‚é‚Æ‚«‚̓‰ƒ“ƒ_ƒ€•às‚ð‚µ‚È‚¢‚悤‚ÉC³
-
- mob.c
- mob_ai_sub_hard_mastersearch()C³
- mob_can_move()’ljÁ
- mob_ai_sub_hard()C³
-
-EMOB‚Ìs“®C³
- EƒXƒLƒ‹Žg—pƒfƒBƒŒƒCˆ—‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
- E‰r¥‚Ì‚È‚¢ƒXƒLƒ‹‚Ítimer‚ðŽg‚í‚È‚¢‚悤‚ÉC³(Ž€–SŽžˆ—‘Îô)
-
- mob.c
- mobskill_use(),mobskill_use_id()C³
-
-EMOBƒGƒ‚[ƒVƒ‡ƒ“‚ÌŽÀ‘•
- EƒGƒ‚[ƒVƒ‡ƒ“‚ÌŽí—Þ‚ª‚í‚©‚ç‚È‚¢‚à‚Ì‚Í‘S‚Äu!v‚É‚È‚è‚Ü‚·B
- ”²‚¯‚Ä‚¢‚éƒf[ƒ^‚ð–„‚ß‚Ä‚­‚ê‚é‚Æ‚¤‚ꂵ‚¢‚Å‚·B
-
- (db/)
- mob_skill_db.txt
- ‚¢‚­‚‚©‚ÌMOB‚̃Gƒ‚[ƒVƒ‡ƒ“‚Ì€–Ú‚Ì’l1‚ÉŽí—Þ‚ð“ü‚ꂽB
-
- (map/)
- skill.c
- skill_castend_nodamage_id()C³
- clif.c/clif.h
- clif_emotion()’ljÁ
-
-EƒpƒPƒbƒg‰ðÍ.txt‚ðclient_packet.txt‚ɉü–¼•C³
-
- (doc/)
- client_packet.txt
- ƒGƒ‚[ƒVƒ‡ƒ“‚Ìà–¾’ljÁ
-
-E‚Ç‚¤‚â‚çŽæ‚芪‚«MOB‚ÌŽí—ނ͌¢ƒf[ƒ^‚¾‚Á‚½‚Á‚Û‚¢‚Å‚·B
- ‚µ‚©‚àMOB¢Š«‚ł͎艺¢Š«‚ƈႤMOB‚𢊫‚·‚é‚Ý‚½‚¢‚Å‚·‚ËB
- Ú‚µ‚¢l‚Ímob_skill_db.txt‚𒼂µ‚Ä‚­‚ê‚é‚ÆB
-
---------------
-//0393 by ‚¢‚Ç
-
-EcharŽI‚Å‚ÌloginŽI‚̃|[ƒgÝ’è‚ð6900‚ɌŒ肵A•ÏX‚Å‚«‚È‚¢‚悤‚É‚µ‚½
-@(login‘¤‚Ń|[ƒg6900ŒÅ’è‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Åchar‘¤‚à‚»‚ê‚ɇ‚킹‚Ü‚µ‚½B)
- char/char.c
- conf/char_athena.cnf
- doc/conf_ref.txt
-
---------------
-//0392 by ŒÓ’±—–
-
-EMOB‚Ìs“®C³
- E‰½ŒÌ‚©last_thinktick‚ª‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢–â‘èC³
- Eã‚ÉŠÖ˜A‚µ‚ÄPC‚ª‹ß‚­‚É‚¢‚Ä‚àŽè”²‚«ˆ—‚ªs‚í‚ê‚é–â‘èC³
- i‚Ç‚¤‚â‚牊ú‚©‚ç‚̃oƒO‚¾‚Á‚½–Í—lH ‚±‚̃oƒO‚ÆA
- V‚µ‚¢Žè”²‚«ˆ—‚ÌŽd—l‚ªƒ^ƒbƒO‚ð‘g‚ñ‚ÅŽc‘œ‚ðì‚Á‚Ä‚¢‚½–Í—lj
- EŽæ‚芪‚«MOB—p‚ÌAIˆ—’ljÁi‚Ü‚¾‰ö‚µ‚¢‚Å‚·j
- EMOB‚̃XƒLƒ‹ƒfƒBƒŒƒC‚ðƒXƒLƒ‹€–Ú‚²‚Æ‚ÉŽ‚‚悤‚É•ÏX
- EƒXƒLƒ‹ƒfƒBƒŒƒC‚ª‘å‚«‚È€–ڂł̓I[ƒo[ƒtƒ[‚µ‚Ä‚¢‚½–â‘è‚ðC³
-
- map.h
- struct mob_data‚Ì skilldelay‚ð”z—ñ‚É‚µ‚Äunsigned int‚É•ÏX
- mob.h
- struct mob_skill‚Ìcasttime,delay‚ðint‚É•ÏX
- mob.c
- mob_ai_sub_hard_mastersearch()’ljÁ
- mob_changestate(),mob_delete(),mob_catch_delete(),mob_damage(),
- mobskill_use(),mobskill_use_id(),mobskill_use_pos(),
- mobskill_castend_id(),mobskill_castend_pos(),
- mob_ai_sub_hard(),mob_ai_sub_lazy()‚È‚ÇC³
-
-EMOBƒXƒLƒ‹‚̎艺¢Š«‚ƃ‚ƒ“ƒXƒ^[¢Š«ŽÀ‘•
- Emob_skill_db.txt‚Ì‘Ž®•ÏXiÅŒã‚É’l‚ð‚P‚’ljÁAŽæ‚芪‚«MOB‚ÌIDj
- EŽæ‚芪‚«MOB‚ª‚í‚©‚ç‚È‚©‚Á‚½‚à‚̂̓Rƒƒ“ƒg‰»‚µ‚Ä‚¢‚Ü‚·
- ‚í‚©‚él‚Í“ü—Í‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B
- EŒ»Ý‚ÍŽæ‚芪‚«‚͈ê“x“|‚µ‚½‚畦‚«‚È‚¨‚µ‚Ü‚¹‚ñB
- Eƒ{ƒX‚ªƒeƒŒƒ|[ƒg‚µ‚Ä‚àŽæ‚芪‚«‚Í’Ç‚¢‚©‚¯‚Ü‚¹‚ñB
- E–{ŽI‚Å‚Ç‚¤‚È‚Á‚Ä‚é‚Ì‚©’m‚ç‚È‚¢‚Ì‚ÅAŠÔˆá‚Á‚Ä‚éꇂ͋³‚¦‚Ä‚­‚¾‚³‚¢B
-
- (db/)
- mob_skill_db.txt
- Žè‰º¢Š«‚Ȃǂ̃f[ƒ^C³
-
- (map/)
- skill.c
- skill_castend_nodamage_id()C³
-
---------------
-//0391 by Ž€_
-
-Eƒyƒbƒg‚̈ړ®’†‚ɃpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚ƃyƒbƒg‚ª’âŽ~‚·‚é‚悤‚É•ÏXB
- (ƒyƒbƒg‚̈ʒu‚ª‚¸‚ê‚邽‚ßC³‚µ‚Ü‚µ‚½B)
- pet.c
- pet_performance() C³B
-EŽ€‚ñ‚¾ƒ‚ƒ“ƒXƒ^[‚Í‚Ç‚ñ‚Ès“®‚à‚Æ‚ê‚È‚¢‚悤‚É•ÏXB(‚±‚ê‚Å–³“G
- ƒ‚ƒ“ƒXƒ^[‚ª‚¢‚È‚­‚È‚é‚Æ‚¢‚¢‚Å‚·‚ª...)
- mob.c
- mob_changestate(),mob_delete(),mob_catch_delete(),mob_damage(),
- mob_ai_sub_hard(),mob_ai_sub_lazy() C³B
-EPCANPCA°ƒAƒCƒeƒ€‚ªŽg‚¤ID‚͈̔͂𒲮B
- °ƒAƒCƒeƒ€‚Í0‚©‚ç500000‚Ü‚Å‚ÅPC‚Í500000‚©‚ç100000000ANPC
- (ƒ‚ƒ“ƒXƒ^[‚ðŠÜ‚ß‚Ä)‚Í110000000‚©‚ç–ñ21‰­‚Ü‚Å‚É‚È‚è‚Ü‚·B
- (-‚ðŠÜ‚ß‚é‚Æ‚à‚Á‚Ɣ͈͂ªL‚­‚È‚è‚Ü‚·‚ª‚³‚·‚ª‚É‚»‚±‚Ü‚Å‚Í•K—v‚È‚¢‚Æ
- Žv‚¢‚Ü‚·‚Ì‚Å...)
- map.h
- MAX_FLOORITEM ’ljÁ(‚±‚ê‚ð•Ï‚¦‚é‚Æ°ƒAƒCƒeƒ€‚Ìő唂ð•Ï‚¦‚é
- ‚±‚Æ‚ª‚Å‚«‚Ü‚·B¡‚Í100000‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚½‚¾‚±‚ê‚Í•K‚¸
- 500000ˆÈ‰º‚É‚µ‚Ä‚­‚¾‚³‚¢B‚»‚¤‚µ‚È‚¢‚Ƴ‚µ‚­“®‚­‚©‚Ç‚¤‚©
- •ÛØ‚Å‚«‚Ü‚¹‚ñB)
- map.c
- map.h‚ɇ‚킹‚Ä­‚µC³B
- npc.h
- START_NPC_NUM ’ljÁB
- npc.c
- npc.h‚ɇ‚킹‚Ä­‚µC³B
- login.h
- START_ACCOUNT_NUM‚ÆEND_ACCOUNT_NUM ’ljÁB
- login.c
- login.h‚ɇ‚킹‚ÄC³BEND_ACCOUNT_NUMˆÈã‚Éaccount‚ð
- ì‚ê‚È‚¢‚悤‚É•ÏXB
-EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚É•ŠíŒ¤‹†‚ð‚Q‰ñ“K—p‚·‚é‚悤‚É•ÏXB
- (Œ‹‹Ç‚ÍŒ³‚É–ß‚·‚±‚Æ‚É‚È‚è‚Ü‚µ‚½...^^;)
- battle.c
- Damage battle_calc_weapon_attack() C³B
-Emob‚̃XƒLƒ‹Žg—p‚ðbattle_athena.cnf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB
- mob.c
- mobskill_use() C³B
- battle.h
- battle.c
- struct Battle_Config‚Émob_skill_use’ljÁB
- battle_athena.cnf
- mob_skill_use’ljÁB(ݒ肵‚È‚¢‚Æno‚Å‚·B)
-Ebattle_athena.cnf
- mob‚ð“ñd‚Å“Ç‚ß‚È‚¢‚悤‚Énpc: conf/npc_monster.txt‚ðíœB
- (ÅV‚Ínpc_monster25.txt‚È‚Ì‚Å...)
-
---------------
-//390 by ŒÓ’±—–
-
-Eƒo[ƒWƒ‡ƒ“î•ñŠ“¾•”•ª‚ð­‚µ•ÏX
- EMODƒo[ƒWƒ‡ƒ“‚ð’è‹`‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½BÚׂÍversion.h‚ðB
- ‹C‚ªŒü‚¢‚½‚Æ‚«‚©A‘å‚«‚ÈXV‚ª‚ ‚é‚Æ‚«‚È‚Ç‚É•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
- Eƒo[ƒWƒ‡ƒ“checkŽž‚Ìset eofƒƒO‚ªo‚È‚¢‚悤‚ɃpƒPƒbƒg7532’ljÁB
-
- (common/)
- version.h
- MODƒo[ƒWƒ‡ƒ“‚ð’è‹`‚Å‚«‚é‚悤‚ÉB
- (tool/)
- checkversion
- MODƒo[ƒWƒ‡ƒ“‚ð•\Ž¦‚·‚é‚悤‚ÉB
- (login/char/map)
- login.c/char.c/clif.c
- MODƒo[ƒWƒ‡ƒ“‚̈—’ljÁA
- ƒpƒPƒbƒg7532iØ’fjˆ—’ljÁB
-
-E‚»‚Ì‘¼FXC³
- E‚±‚Ü‚²‚Ü‚µ‚½C³‚΂©‚è‚Å‚·‚ªA‚ ‚Ü‚èŠo‚¦‚Ä‚¢‚Ü‚¹‚ñB
- EMOBƒXƒLƒ‹ðŒ‚Åslavelt,attackpcgtˆ—ŽÀ‘•i–¢ƒeƒXƒgjB
- EMOB‚̎艺¢Š«‚Ì‚½‚ß‚Ì‹@\’ljÁi‚Ü‚¾¢Š«‚Å‚«‚Ü‚¹‚ñjB
- E”͈̓XƒLƒ‹Œø‰Ê”͈͂Ɏ€–SPC‚ª‚¢‚é‚ÆŽI‚ª—Ž‚¿‚éƒoƒOC³B
- EMOBŽc‘œ‚ªo‚È‚­c‚È‚Á‚Ä‚½‚ç‚¢‚¢‚ÈB
-
- (map/)
- mob.c/mob.h/map.h/battle.c
- FX’ljÁ
-
- (db/)
- mob_skill_db.txt
- ƒ‹[ƒgŽžˆ—‚ÆA‘®«•ÏXƒXƒLƒ‹‚̃Rƒƒ“ƒg‚ðŠO‚µ‚½B
- i‘®«•ÏX‚Í–{ŽI‚Å“®‚¢‚Ä‚È‚¢‚炵‚¢‚à‚Ì‚àƒRƒƒ“ƒg‚ðŠO‚µ‚Ä‚Ü‚·B
- –â‘肪‚ ‚éꇂÍĂуRƒƒ“ƒg‰»‚µ‚Ä‚­‚¾‚³‚¢j
-
---------------
-//389 by ‚¢‚Ç
-
-E388‚Ì•ÏX
- ƒo[ƒWƒ‡ƒ“î•ñ‚ðcommon/version.h“à‚̒蔂ðŽg—p‚·‚é‚悤‚É•ÏX
-
---------------
-//388 by ŒÓ’±—–
-
-Eƒo[ƒWƒ‡ƒ“î•ñŠ“¾ƒc[ƒ‹“Y•t
- Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
- Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
- Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
-
- ƒo[ƒWƒ‡ƒ“‚ðŠm”F‚·‚é—p“r‚æ‚è‚ÍAƒT[ƒo[‚̶‘¶Šm”F—p‚Æ‚¢‚Á‚½‚©‚ñ‚¶‚Å‚·
- ƒpƒPƒbƒg7530/7531‚ÌÚׂ̓\[ƒX‚ðŒ©‚Ä‚­‚¾‚³‚¢B
-
- (tool/)
- checkversion
- ƒo[ƒWƒ‡ƒ“Šm”Fƒc[ƒ‹PerlƒXƒNƒŠƒvƒg
-
- (login/)
- login.c
- ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
- (char/)
- char.c
- ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
- (map/)
- clif.c
- ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
-
-E384ˆÈ‘O‚Ìathena.txt‚à“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚Ü‚µ‚½
- Econvert‚ª–Ê“|‚ÈlŒü‚¯B
- E³‚µ‚­“Ç‚Ýž‚ß‚é•ÛØ–³‚µBƒoƒbƒNƒAƒbƒv‚ð–Y‚ꂸ‚ÉB
-
- (char/)
- char.c
- 384‚Ì•ûŽ®‚Å“Ç‚Ýž‚ß‚È‚¢ƒf[ƒ^‚Í384ˆÈ‘O‚Ì•ûŽ®‚àŽŽ‚·‚悤‚ÉB
-
-Econf_ref.txt/help.txt/getaccountC³
- help.txt
- petƒRƒ}ƒ“ƒh‚Ìà–¾’ljÁ
- (doc/)
- conf_ref.txt
- petŠÖ˜A‚ÌÝ’è‚Ìà–¾’ljÁ
- (tool/)
- getlogincount
- •\Ž¦‚ÌC³
-
---------------
-//387 by ‚¢‚Ç
-EconfƒtƒHƒ‹ƒ_“à‚ÌNPC’è‹`ƒf[ƒ^‚Ì®—
- ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚µ‚½
- npc_kafraJ.txt
- npc_mind_prtmons.txt
- npc_script2J.txt(npc_event_mobtim.txt‚É“¯‚¶‚à‚Ì‚ª‚ ‚Á‚½‚½‚ß)
- npc_testJ.txt(‚Ù‚Ú“¯‚¶‚±‚Æ‚ª@ƒRƒ}ƒ“ƒh‚Åo—ˆ‚邽‚ß)
- npc_warp25.txt(npc_warp.txt‚É“‡)
-
- ˆÈ‰º‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚µ‚½
- npc_monster3.txt -> nop_monster2E.txt
- npc_monster3J.txt -> npc_monster25.txt
- npc_monster.txt -> npc_monsterE.txt
- npc_monsterJ.txt -> npc_monster.txt
- npc_sampleJ.txt -> npc_sample.txt
- npc_script3j.txt -> npc_script2.txt
- npc_script25J.txt -> npc_town_lutie.txt
- npc_shop1J.txt -> npc_shop_test.txt
- npc_shop2J.txt -> npc_shop_mobtim.txt
- npc_shop3J.txt -> npc_shop2.txt
- npc_shop.txt -> npc_shopE.txt
- npc_shopJ.txt -> npc_shop.txt
- npc_testJ.txt -> npc_test.txt
- npc_warp3.txt -> npc_warp2.txt
- npc_warp4.txt -> npc_warp25.txt
-
-Eƒ}ƒbƒv’è‹`‚̒ljÁ
- ƒWƒ…ƒm[ƒAƒbƒvƒf[ƒg‚ŒljÁ‚³‚ê‚éƒ}ƒbƒv‚ÆAŠØŽI“ÆŽ©(?)‚̃NƒCƒYƒ][ƒ“
- (ƒRƒ‚ƒhƒAƒbƒvƒf[ƒg)‚Æ“V’ÃAƒbƒvƒf[ƒg‚̃}ƒbƒv’è‹`‚ð’ljÁ
- Œ»ÝA“úˆÆ‚É–³‚¢‚à‚Ì‚ÉŠÖ‚µ‚Ă̓Rƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚ÜB
- conf/map_athena.cnf
-
---------------
-//385 by ŒÓ’±—–
-
-EMOB‚Ìs“®C³
- EŽè”²‚«ˆ—‚ňړ®‚µ‚È‚¢ƒ‚[ƒh‚ÌMOB‚à•à‚­–â‘èC³
- EMOB‚ð“|‚µ‚½‚Æ‚«AÄspawnŽž‚ª‚¨‚©‚µ‚È’l‚É‚È‚éꇂª‚ ‚é–â‘èC³
- iMOB‚ª•¦‚©‚È‚­‚È‚é–â‘肪C³‚³‚ꂽ‚Í‚¸j
- EMOB‚̃[ƒv‚ÅꊌŸõ‚É1000‰ñŽ¸”s‚µ‚½‚猳‚ÌꊂÉo‚é‚悤‚ÉC³
- EMOB‚ð‰r¥’†‚É“|‚·‚ÆAƒ^ƒCƒ}[‚ð휂·‚é‚悤‚ÉC³
-
- mob.c
- mob_delete(),mob_catch(),mob_damage(),
- mob_ai_sub_lazy(),mob_ai_sub_hard()‚È‚ÇC³
- mobskill_deltimer()’ljÁ
-
---------------
-//0384 by Ž€_
-
-EƒyƒbƒgŽÀ‘•B
-Žv‚Á‚½‚æ‚è’·‚­‚©‚©‚è‚Ü‚µ‚½BˆêŽü‚à‚©‚©‚Á‚½‚¹‚¢‚ʼn½ˆ‚ðC³‚µ‚½‚©
-Šo‚¦‚Ä‚È‚¢–â‘肪‚ ‚è‚Ü‚·‚ª... ‚»‚ê‚Å”O‚ׂ̈Émap‚Æchar‚̃tƒ@ƒCƒ‹‚Í‘S‚Ä
-ŠÜ‚߂ăAƒbƒv‚µ‚Ü‚·B
-‚»‚ê‚Æmakefile‚Æathena.sh‚ÍŽ©•ª‚ªŽg‚Ä‚¢‚镨‚Å‚·B
-Yare-launcher‚ÍŽg‚Ä‚Ü‚¹‚ñ‚ª‚¢‚‚àŽI‚ÌŽÀsƒtƒ@ƒCƒ‹‚ÅŽÀs‚µ‚Ä‚¢‚Ü‚·‚Ì‚Å...
- char/char.cAchar/char.hAchar/inter.cAchar/makefile C³B
- char/int_pet.cAchar/int_pet.h ’ljÁB
- map/makefile C³B
- map/intif.cAmap/intif.hAmap/map.cAmap/map.hAmap/mob.cAmap/mob.hA
- map/npc.cAmap/npc.hAmap/battle.cAmap/battle.hAatcomand.cAmap/pc.cA
- map/clif.cAmap/clif.hAmap/script.c FXC³B
- map/pet.cAmap/pet.h ‚Í–w‚Ç‚ðŽ©•ª‚Ì•¨‚É‘‚«Š·‚¦‚Ü‚µ‚½B
- common/mmo.h C³B
- db/pet_db.txt C³B
- db/item_db.txt C³B(Œg‘Ñ—‘›z‰»‹@‚Ìbpet ƒXƒNƒŠƒvƒg‚ª”²‚¯‚Ä‚¢‚½‚Ì‚Å
- “ü‚ꂽ‚¾‚¯‚Å‚·‚ª...)
- doc/INTERŽIƒpƒPƒbƒg.txt‚Ì–¼‘O‚ðinter_server_packet.txt‚É•ÏX‚ƃyƒbƒg‚Ì
- •Û‘¶“™‚ÉŽg‚¤ƒpƒPƒbƒg‚ð’ljÁB
-* ¡“x‚̃yƒbƒgŽÀ‘•‚É‚æ‚èƒLƒƒƒ‰ƒtƒ@ƒCƒ‹‚Ì\‘¢‚ª•Ï‚í‚èˆÈ‘O‚Ì•¨‚ƌ݊·‚Å‚«‚È‚¢
- ‚Ì‚Å tool/convert.c ‚ð’ljÁ‚µ‚Ü‚µ‚½B
- ’P“ƂŃRƒ“ƒpƒCƒ‹‚Å‚«‚Ü‚·‚̂ŃRƒ“ƒpƒCƒ‹‚µ‚½‚ ‚ÆŽÀs‚µ‚ăLƒƒƒ‰
- ƒtƒ@ƒCƒ‹‚ð•ÏŠ·‚µ‚Ä‚­‚¾‚³‚¢B‚»‚¤‚µ‚È‚¢‚ƃLƒƒƒ‰‚ª‘S•””ò‚Ñ‚Ü‚·‚Ì‚Å...
-* ƒyƒbƒg‚Ìe–§“x‚ª0‚É‚È‚é‚ƃyƒbƒg‚Í‚»‚Ìê‚Å“®‚¯‚È‚­‚È‚è‚»‚Ìó‘Ô‚Å‘¼‚Ì
- ƒ}ƒbƒv‚Ɉړ®‚·‚é‚©I—¹‚·‚é‚ƃyƒbƒg‚ÍÁ–Å‚µ‚Ü‚·Bˆê‰žƒyƒbƒg‚Ì“¦‘–‚ð
- ŽÀ‘•‚·‚é‚‚à‚è‚Åì‚Á‚½‚Ì‚Å‚·‚ª–{ŽI‚É‚ ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB
-* ˆÚ“®‘¬“x‚ª’x‚¢ƒyƒbƒg‚Ìꇗ£‚ê‰ß‚¬‚é‚Ƃ‚¢‚Ä—ˆ‚ê‚È‚­‚È‚è‚Ü‚·B‚Å‚à
- ‚±‚Ìꇃ}ƒbƒv‚ðˆÚ“®‚µ‚Ä‚à‚¿‚á‚ñ‚Ƃ‚¢‚Ä—ˆ‚Ü‚·B
- Á–Å‚µ‚½‚è‚Í‚µ‚Ü‚¹‚ñB
-* ˆÚ“®‘¬“x‚ª‘¬‚¢ƒyƒbƒg‚̓Lƒƒƒ‰‚æ‚èæ‚Ɉړ®‚µ‚Ü‚·B–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©
- ‚í‚©‚ç‚È‚¢‚̂Ńyƒbƒg‚̈ړ®‚̓‚ƒ“ƒXƒ^[‚̈ړ®‘¬“x‚ňړ®‚·‚é
- ‚悤‚É‚µ‚Ü‚µ‚½B
-Ebattle_athena.cnf
-pet_catch_rate ’ljÁB
- ƒyƒbƒg‚̕ߊl”{—¦‚ðݒ肵‚Ü‚·B(ݒ肵‚È‚¢‚Æ100)
- Šî–{“I‚Ƀyƒbƒg‚̕ߊl‚ÉŽg‚Á‚Ä‚éŒöŽ®‚Í
- (pet_db.txt‚̕ߊl—¦ + (ƒLƒƒƒ‰ƒŒƒxƒ‹ - ƒ‚ƒ“ƒXƒ^[ƒŒƒxƒ‹)*0.3 + luk *0.2)
- * (2 - ƒ‚ƒ“ƒXƒ^[‚ÌŒ»ÝHP/ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åHP)
- ‚É‚È‚è‚Ü‚·BŽ©•ª‚È‚è‚Éì‚Á‚½•¨‚Å‚·‚Ì‚Å–{ŽI‚Æ‚Í‚©‚È‚è‚Ì
- ˆá‚¢‚ª‚ ‚é‚©‚à’m‚ê‚Ü‚¹‚ñB(ƒ‚ƒ“ƒXƒ^[‚ÌHP‚ðŒ¸‚ç‚¹‚ÎŒ¸‚ç‚·’ö•ßŠl—¦‚ª
- オ‚éŽd‘g‚Ý‚Å‚·‚ª...)
-pet_rename ’ljÁB
- ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æno)
- yes‚͉½“x‚Å‚à–¼‘O‚Ì•ÏX‚ª‰Â”\B
- no‚͈ê“x•ÏX‚·‚é‚Æ‚à‚¤•ÏX•s‰Â”\‚É‚È‚é
-pet_hungry_delay_rate ’ljÁB
- ƒyƒbƒg‚Ì• ‚ªŒ¸‚鎞ŠÔ‚Ì”{—¦‚Å‚·B(ݒ肵‚È‚¢‚Æ100)
- ”{—¦‚ª‚‚¢‚Æ• ‚ªŒ¸‚è“ï‚­‚È‚è‚Ü‚·
-mvp_exp_rate •ÏXB
- ‚·‚Å‚Éstruct mob_db‚Ìmexpper‚̓Sƒ~‚É‚È‚Á‚Ä‚¢‚é‚Ì‚Å(MVP EXP‚Í
- MVPƒAƒCƒeƒ€‚ªŽæ‚ê‚È‚©‚Á‚½ê‡“ü‚é‚̂ňӖ¡‚ª‚ ‚è‚Ü‚¹‚ñB)
- MVP EXP‚Ì—Ê‚Ì”{—¦‚É‚È‚é‚悤‚É•ÏXB(mob.c‚ðC³)
-Echar_athena.cnf
-autosave_time ’ljÁB
- Ž©“®•Û‘¶‚·‚鎞ŠÔ‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æ300)
- šdˆÊ‚Í•b‚Å‚·B(ƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚鎞ŠÔ‚ÌŠÔŠu‚Å‚·B)
-Emap_athena.cnf
-autosave_time ’ljÁB
- Ž©“®•Û‘¶‚·‚鎞ŠÔ‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æ60)
- šdˆÊ‚Í•b‚Å‚·B(ƒLƒƒƒ‰ŽI‚Ƀf[ƒ^‚𑗂鎞ŠÔ‚ÌŠÔŠu‚Å‚·B‚±‚ê‚Í
- ƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚鎞ŠÔ‚ÌŠÔŠu‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
-Einter_athena.cnf
-pet_txt ’ljÁB
- ƒyƒbƒg‚̃f[ƒ^‚ð•Û‘¶‚·‚éƒtƒ@ƒCƒ‹‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æpet.txt)
-E@makepet ƒRƒ}ƒ“ƒh’ljÁB
- ƒyƒbƒg‚ÌŽÀ‘•‚É‚æ‚Á‚Ä@item‚Åì‚Á‚½—‘‚ÍŽg‚Á‚Ä‚à–³‘Ê‚É‚È‚è‚Ü‚·‚Ì‚Å
- ‚±‚ê‚ðŽg‚Á‚Ä—‘‚ðì‚Á‚Ä‚­‚¾‚³‚¢B
- @makepet <ƒ‚ƒ“ƒXƒ^[‚ÌID or —‘‚ÌID>
-E@petfriendly ƒRƒ}ƒ“ƒh’ljÁB
- @petfriendly <”Žš>
- ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ìe–§“x‚ð•ÏXB(0~1000)
-E@pethungry ƒRƒ}ƒ“ƒh’ljÁB
- @pethungry <”Žš>
- ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ì–ž• “x‚ð•ÏXB(0~100)
-E@petrename ƒRƒ}ƒ“ƒh’ljÁB
- @petrename
- ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ì–¼‘O‚ð•ÏX‚Å‚«‚é‚悤‚É•ÏXB
-Eint_guild.cAint_party.c “Ç‚Ýž‚Þƒtƒ@ƒCƒ‹‚ɃGƒ‰[‚ª‚ ‚Á‚Ä‚àƒvƒƒOƒ‰ƒ€‚ð
- I—¹‚¹‚¸‚Éi‚ނ悤‚É•ÏXB
-Epc_walk 123 != 1234 “™‚̃Gƒ‰[‚ªo‚È‚¢‚悤‚É
- if((i=calc_next_walk_step(sd))>0) {
- sd->walktimer=add_timer(tick+i/2,pc_walk,id,sd->walkpath.path_pos);
- ‚ð
- if((i=calc_next_walk_step(sd))>0) {
- i = i/2;
- if(i <= 0)
- i = 1;
- sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
- ‚̂悤‚É•ÏX‚µ‚Ü‚µ‚½B
- tick‚ª“¯‚¶”’l‚É‚È‚é‚Ì‚ð–h‚¢‚½‚Ì‚Å‚·‚ª‚±‚ê‚Å‚Ç‚ñ‚ȉe‹¿‚ªo‚é‚©‚Í
- ‚³‚Á‚Ï‚è‚í‚©‚è‚Ü‚¹‚ñB
- pc.cAmob.c‚ðC³B
- ‚Å‚à‚±‚ÌC³‚ð‚µ‚Ä‚à˜A‘±‚ŃNƒŠƒbƒN‚µ‚½‚è‚·‚é‚ƃLƒƒƒ‰‚ª‚µ‚΂炭
- Ž~‚Ü‚é‚悤‚Å‚·B(ƒyƒbƒg‚Ì‚¹‚¢‚ÆŽv‚¢‚Ü‚µ‚½‚ªƒyƒbƒg‚ª‚È‚­‚Ä‚à
- “¯‚¶‚¾‚Á‚½‚Ì‚Å‘¼‚ÌŒ´ˆö‚©‚Æ...)
-* doc/code_ref.txt‚Æhelp.txt‚Í–Ê“|‚­‚³‚¢‚Ì‚ÅC³‚µ‚Ä‚Ü‚¹‚ñB
-Egm_all_skill: yes‚Å2-2‚̃XƒLƒ‹‚à•\Ž¦‚³‚ê‚é‚悤‚É•ÏXB(ŽŽ‚¢‚¹‚Í‚¢‚Ü‚¹‚ñ‚ª...)
- pc.c
- pc_calc_skilltre() C³B
-EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŒvŽZ‚ðC³B
- •ŠíŒ¤‹†‚ð“ñdŒvŽZ‚µ‚Ä‚¢‚½‚Ì‚ÅC³B
- battle.c
- Damage battle_calc_weapon_attack() C³B
-
---------------
-//381 by ŒÓ’±—–
-
-EMOB‚Ìs“®C³
- EPC‚Ì‚¢‚È‚¢ƒ}ƒbƒv‚ÌMOB‚ÍŽžXƒ[ƒv‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- EPC‚Ì‚¢‚éƒ}ƒbƒv‚ÌMOB‚Í•à‚­ˆÈŠO‚ÉAŽžX•¦‚«’¼‚·‚悤‚É‚È‚è‚Ü‚µ‚½
- i‚±‚ê‚Ü‚½ƒpƒtƒH[ƒ}ƒ“ƒX‚ɉe‹¿‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñF­‚µd‚­‚È‚é‚©‚àj
- EŽè”²‚«ˆ—‚ŃuƒƒbƒN‚Ì—LŒø”»’è‚ðs‚¤‚悤‚É‚µ‚Ü‚µ‚½
- iHP–³ŒÀMOB–â‘èC³Hj
- Eƒ‹[ƒgŽžƒXƒLƒ‹Žg—p‹@\ŽÀ‘•
-
- mob.c/mob.h
- mob_ai_sub_lazy(),mob_ai_sub_hard()C³
- MSS_LOOT’ljÁ,mob_readskilldb()C³
-
-EMOBƒXƒLƒ‹‚Ì‘®«•ÏX‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
-
- map.h
- struct mob_data‚É def_eleƒƒ“ƒo’ljÁ
- mob.c
- mob_spawn()‚Ådef_ele‚ðƒZƒbƒg‚·‚é‚悤‚É•ÏX
- battle.c
- battle_get_element()‚Ådef_ele‚ð“ǂނ悤‚É•ÏX
- skill.c
- skill_castend_nodamage_id()C³
-
-EƒNƒ@ƒOƒ}ƒCƒA‚ÌŒø‰Ê”͈͂©‚ço‚é‚ÆŒø‰Ê‚ªØ‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- skill.c
- ƒ†ƒjƒbƒgŒnˆ—C³
-
---------------
-//380 by ‚`‚Ìl
-
-EƒJ[ƒgƒŒƒ”ƒHƒŠƒ…[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŒvŽZŽÀ‘•
- battle.c‚ð•ÏXB
-
-CHRIS‚³‚ñA‚ ‚肪‚Æ‚¤ŒäÀ‚¢‚Ü‚·B
-ƒmƒbƒNƒoƒbƒNŽÀ‘•‚Å‚«‚È‚­‚ÄA¢‚Á‚Ä‚Ü‚µ‚½i„ƒG
-
---------------
-//379 by CHRIS
-
-EƒJ[ƒgƒŒƒ”ƒHƒŠƒ…[ƒVƒ‡ƒ“‚ÌŽÀ‘•
- skill.c‚Æbattle.c‚ð•ÏXB
-
-Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ɃmƒbƒNƒoƒbƒN‚ð’ljÁB
- battle.c‚ð•ÏXB
-
-iƒ\[ƒX‚ð˜M‚Á‚½‚͉̂‚ß‚Ä‚È‚Ì‚ÅA—L‚Á‚Ä‚é‚©‚Ç‚¤‚©•ª‚©‚è‚Ü‚¹‚ñ‚ªAŽ©•ª‚Å‚Ío—ˆ‚Ü‚µ‚½Bj
-iƒvƒƒOƒ‰ƒ€ŠÖŒW‚̑Ђ𔃂Á‚ĕ׋­‚µ‚ĉ‚߂ĘM‚Á‚½‚Ì‚Å‚·EEEBƒKƒ“ƒoƒŠƒ}ƒXIBj
-
---------------
-//377 by ŒÓ’±—–
-
-EMOB‚Ìs“®C³
- E‹ß‚­‚ÉPC‚Ì‚¢‚È‚¢MOB‚ªŽžXƒ[ƒv‚·‚éŽd—l‚ðŽ~‚ß‚Ü‚µ‚½B
- EPC‚Ì‚¢‚È‚¢ƒ}ƒbƒv‚ÌMOB‚Í‘S‚­“®‚©‚È‚­‚È‚è‚Ü‚µ‚½B
- EPC‚Ì‚¢‚éƒ}ƒbƒv‚ÅA‹ß‚­‚ÉPC‚Ì‚¢‚È‚¢MOB‚ÍŽžX•à‚­‚悤‚É‚È‚è‚Ü‚µ‚½B
- E‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ëC³
- iƒpƒtƒH[ƒ}ƒ“ƒX‚ɉe‹¿‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñF­‚µd‚­‚È‚é‚©‚àj
-
- mob.c
- mob_randomwalk()’ljÁ
- mob_ai_sub_lazy(),mob_ai_sub_hard()C³‚È‚Ç
-
-EƒXƒLƒ‹C³
- EMOB‚ªƒeƒŒƒ|[ƒg‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- mob.c
- mob_warp()’ljÁ
- skill.c
- skill_castend_nodamage_id()C³
-
-EƒXƒe[ƒ^ƒXˆÙí‚̈ꕔ‚ðŽÀ‘•/C³
- EPC/MOB‚Æ‚à‚É‘¬“xŒ¸­‚ÌŒø‰Ê‚ªŒ»‚ê‚é‚悤‚ÉiAGI‚Ì•\Ž¦‚Í•Ï‚í‚炸j
- EPC‚̃Gƒ“ƒWƒFƒ‰ƒXAƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXA‘¬“x㸂̌ø‰Ê‚ðC³
- EMOB‚Ì2HQAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒGƒ“ƒWƒFƒ‰ƒXAƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXA
- ‘¬“xã¸/Œ¸­AƒOƒƒŠƒAAƒuƒŒƒbƒVƒ“ƒO‚È‚Ç‚ÌŒø‰ÊŽÀ‘•
- E‡–°A“€Œ‹AƒXƒ^ƒ“‚Ì•K’†Œø‰ÊŽÀ‘•
- E‡–°‚̃NƒŠƒeƒBƒJƒ‹”{Œø‰ÊŽÀ‘•
- EˆÃ•‚Ì–½’†—¦A‰ñ”𗦌¸­Œø‰ÊŽÀ‘•
- EŽô‚¢‚ÌATKŒ¸­Œø‰ÊALUKŒ¸­Œø‰ÊŽÀ‘•
-
- battle.c
- battle_get_*()C³
- battle_calc_weapon_damage()C³
- mob.c
- mob_get_speed(),mob_get_adelay()’ljÁ
- pc.c
- pc_calcstatus()C³
-
-Eitem_value_db.txt‚ŃAƒCƒeƒ€‚̉¿Ši‚ðÝ’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- E‰¿Šiƒf[ƒ^‚ðƒI[ƒo[ƒ‰ƒCƒh‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
- E‚±‚ê‚Åitem_db2.txt‚ð—pˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚¹‚ñB
-
- (db/)
- item_value_db2.txt
- item_db2.txt‚̉¿Šiƒf[ƒ^B
- item_value_db.txt‚ɃŠƒl[ƒ€‚·‚é‚Æ“Ç‚Ýž‚Ý‚Ü‚·B
- (map/)
- itemdb.c
- itemdb_readdb()C³
-
-EŒÃ–Ø‚ÌŽ}‚ðŽg‚¤‚ÆMOB‚Ì–¼‘O‚ª 0 ‚É‚È‚é–â‘è‚ÌC³
-
- (db/)
- item_db.txt
- ŒÃ–Ø‚ÌŽ}‚̃f[ƒ^C³
-
---------------
-//375 by ŒÓ’±—–
-
-EMOBê—pƒXƒLƒ‹‚ÌŒø‰Ê‚ð‚¢‚­‚‚©ŽÀ‘•
- ‘½’iUŒ‚A“łȂǂ̒ljÁŒø‰Ê•t—^UŒ‚A‘®«•t‚«UŒ‚A–‚–@‘ÅŒ‚UŒ‚
- •K’†UŒ‚A–hŒä–³Ž‹UŒ‚Aƒ‰ƒ“ƒ_ƒ€ATKUŒ‚‚È‚ÇB
- ‚½‚¾‚µA**‘S‚­ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ**B
-
- (db/)
- skill_db.txt
- MOB—pƒXƒLƒ‹‚̃f[ƒ^‚ðC³
- mob_skill_db.txt
- ­‚µ’ljÁ
- (map/)
- skill.c
- skill_castend_damage_id()C³
- skill_status_change_start()C³
- skill_additional_effect()C³
- battle.c
- battle_calc_weapon_attack()C³
-
-EƒXƒLƒ‹‚ð­‚µC³
- EƒEƒH[ƒ^[ƒ{[ƒ‹‚Å“G‚ªŽ€‚ñ‚Å‚¢‚Ä‚àŒ‚‚ƒ‚[ƒVƒ‡ƒ“‚ð‚·‚é–â‘èC³
-
- skill.c
- skill_status_change_timer()C³
-
-EMOBƒf[ƒ^‚ª•Ï‚È‚Ì‚Å–^‚v‚̃f[ƒ^ƒx[ƒX‚ð—¬—p‚µ‚Ä‚Ý‚é
- Eƒf[ƒ^‚Ì•À‚ч‚Æ‚©‘S‚­“¯‚¶‚È‚ñ‚Å‚·‚Ë
-
- (db/)
- mob_db.txt
- –^‚v‚Ìmob_db.txt
-
-EŠeŽíconf‚̃Šƒtƒ@ƒŒƒ“ƒX‚ð“Y•t
- ‚ ‚­‚܂ŃŠƒtƒ@ƒŒƒ“ƒX‚È‚Ì‚ÅAHowTo‚È‚ñ‚©‚Í‘‚¢‚Ä‚Ü‚¹‚ñB
-
- (doc/)
- conf_ref.txt
- conf‚̃Šƒtƒ@ƒŒƒ“ƒX{ƒ¿
-
-
---------------
-//373 by ŒÓ’±—–
-
-EMOBƒXƒLƒ‹Žg—p‹@\‰¼ŽÀ‘•
- EƒXƒLƒ‹Žg—pŽž‚̈—‚̓vƒŒƒCƒ„[‚Æ‹¤—p(skill.c)‚Å‚·B
- E•s“s‡‚ª‘½‚¢‚ÆŽv‚¤‚Ì‚Å•ñ‚¨Šè‚¢‚µ‚Ü‚·B
- Emob_skill_db.txt‚ð–„‚ß‚Ä‚­‚ê‚él‚à•åWB
- ‚±‚̃f[ƒ^‚Íuƒ‰ƒOƒiƒƒN‚Ì‚½‚Ü‚²v‚ðŽQl‚É‚µ‚Ä‚¢‚Ü‚·B
-
- (db/)
- mob_skill_db.txt
- MOBƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX(–¢Š®¬)
- ƒeƒXƒg—p‚̃f[ƒ^‚µ‚©“ü‚Á‚Ä‚Ü‚¹‚ñB
- (map/)
- mob.c/mob.h
- mobskill_*’ljÁA‚»‚Ì‘¼‘½”C³
- map.h
- struct mob_data ‚É skill* ’ljÁ
- skill.c/skill.h
- skill_castcancel()‚âƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚ðMOB‚ɑΉž‚³‚¹‚½
- battle.c
- battle_calc_damage()‚È‚ÇC³
-
-EƒMƒ‹ƒh‚̃XƒLƒ‹‚ªG‚ê‚È‚¢–â‘èC³
- E‚¢‚‚̂܂ɂ©pc_skillup‚ªŒÃ‚¢‚à‚Ì‚É•Ï‚í‚Á‚Ä‚¢‚½‚Ì‚ÅC³
-
- pc.c
- pc_skillup(),pc_checkskill()C³
-
---------------
-//368 by ŒÓ’±—–
-
-EMOBŒn‚ÌC³‚È‚Ç
- EMOB‚ªô“G”͈͓à‚ÌPC/ƒAƒCƒeƒ€‚𓙊m—¦‚ŃƒbƒN‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- iƒAƒNƒeƒBƒuAƒ‹[ƒgF‚¢‚Ü‚Ü‚Å‚ÍŠY“–ƒuƒƒbƒN‚̃Šƒ“ƒNƒŠƒXƒg‚̇‚È‚Ç‚É
- ˆË‘¶‚µ‚Ä‚¢‚½j
- EŽË’ö”ÍˆÍ“à‚©‚ÂA“ž’B•s‰Â”\’n‘Ñ‚ÌPC‚ðMOB‚ªƒƒbƒN‚·‚é‚ÆA
- MOB‚ª’âŽ~‚µ‚½‚èA‚»‚Ìê‚Å–\‚ꂾ‚µ‚½‚è‚·‚é–â‘è‚ÌC³
- EMOBƒƒbƒN’†‚ÉIW‚È‚Ç‚Å“ž’B•s‰Â”\‚É‚È‚Á‚½ê‡AƒƒbƒN‚ð‰ðœ‚·‚é‚悤‚ÉB
- EAEGIS•ûŽ®‚Å“G‚̈ړ®‚ðŒvŽZ‚µ‚Ĉړ®•s‰Â”\‚È‚çAAthenaŽ®‚ÅŒvŽZ‚·‚é‚悤‚É
- EƒƒbƒN‚ª‰ðœ‚³‚ê‚é‚Æ‚«‚É”•b‚»‚Ìê‚Å’âŽ~‚·‚é‚悤‚É‚µ‚½
- E•às‚ª’x‚¢MOB‚ª‚Æ‚Ü‚ç‚È‚¢/ŽŸ‚Ì•àsŠJŽn‚ª‘‚·‚¬‚é–â‘è‚ðC³‚µ‚Ü‚µ‚½
- Eƒ‹[ƒgŠÖ˜Aˆ—‚ð­‚µC³
-
- mob.c
- mob_ai_sub_hard*()C³
- mob_can_reach()’ljÁ
-
-EƒXƒLƒ‹Žg—pŽž‚Ƀ^[ƒQƒbƒgƒuƒƒbƒN‚Ì—LŒø«”»’è‚ðs‚¤‚悤‚ÉC³
-Eƒ‹ƒAƒt‚̃_ƒ[ƒW‚ª•ŠíŒvŽZ‚É‚È‚Á‚Ä‚¢‚é‚̃oƒO‚ð–‚–@ŒvŽZ‚ÉC³
-
- skill.c
- skill_castend_id()C³
- skill_status_change_timer_sub()C³
-
-
-----------
-//364 by ‚¢‚Ç
-EˆÈ‰º‚̃pƒPƒbƒg‚Ìà–¾‚ð•ÏX
- doc/ƒpƒPƒbƒg‰ðÍ.txt
- R 006a <error No>.B
- R 0081 <type>.B
-
-E363‚Ńrƒ‹ƒhŽž‚Éwarning‚ªo‚é•s‹ï‡‚ðC³
- map/guild.h
-
---------------
-//363 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‚ÌC³
- EƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢PC‚ð’Ç•ú‚·‚é‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚éƒoƒOC³
- Eƒƒ“ƒo[’ljÁ’¼Œã‚ɒljÁ‚³‚ꂽPC‚ªƒMƒ‹ƒh•\Ž¦‚ɒljÁ‚³‚ê‚È‚¢–â‘èC³
- E“¯‚¶ƒMƒ‹ƒh‚É“¯C•ÊƒLƒƒƒ‰‚ª—v‚éPC‚ª’E‘Þ‚·‚é/’Ç•ú‚³‚ê‚é‚ƕʃLƒƒƒ‰‚ª
- ’E‘Þ‚µ‚Ä‚µ‚Ü‚¤ê‡‚ª‚ ‚éƒoƒOC³
- Eƒƒ“ƒo[‚ª‚¢‚é‚̂ɉðŽU‚µ‚悤‚Æ‚·‚é‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚éƒoƒOC³
-
- (char/)
- int_guild.c
- guild_calcinfo(),mapif_parse_GuildAddMember()C³
- (map/)
- guild.c
- guild_member_leaved(),guild_member_added()
- guild_recv_info(),guild_break()C³
-
---------------
-//362 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‰ðŽUŽÀ‘•
-
- (char/)
- int_guild.c
- ‰ðŽUˆ—‚ð’ljÁ
- (map/)
- guild.c/guild.h
- guild_break(),guild_broken(),guild_broken_sub()‚ȂǒljÁ
- clif.c/clif.h
- clif_guild_broken(),clif_parse_GuildBreak()’ljÁ
- intif.c/intif.h
- intif_parse_GuildBroken()’ljÁ
-
---------------
-//361 by ‚¢‚Ç
-
-E360‚Å‚Ì@heal‚Ì•ÏXŠÔˆá‚¢‚ð’ù³
- map/atcommand.c
-
---------------
-//360 by ‚¢‚Ç
-
-E353‚ÌC³‚ðíœ
-E@heal‚Å•ÏXŒã‚Ì’l‚ªƒ}ƒCƒiƒX‚É‚È‚ç‚È‚¢‚悤‚ÉC³
-
---------------
-//359 by ‚¢‚Ç
-
-Eclass_equip_db.txt‚Ì•¶Žš‰»‚¯C³
-
---------------
-//358 by ŒÓ’±—–
-
-EƒƒOƒCƒ“Žž‚Ìdelete_timer‚̃Gƒ‰[‚ðo‚È‚¢‚悤‚É‚µ‚½
- pc.c
- pc_authok()‚ÌC³
-
-EƒMƒ‹ƒhŠÖŒW‚ÌC³
- Eƒƒ“ƒoŠ©—UŽž‚ÉÅ‘ål”‚ÌŠm”F‚ðs‚¤‚悤‚É
- Eƒf[ƒ^’Ê’mˆ—‚ð‚¢‚­‚‚©C³
-
- (char/)
- int_guild.c
- FXC³
- (map/)
- clif.c/clif.h
- clif_guild_inviting_refused()‚ðclif_guild_inviteack()‚ɉü–¼
- guild.c/intif.c
- FXC³
-
-E@guildlvupƒRƒ}ƒ“ƒhì¬BƒMƒ‹ƒhƒŒƒxƒ‹‚ª’²®‚Å‚«‚Ü‚·B
-
- (char/)
- int_guild.c
- FXC³
- (map/)
- atcommand.c
- @guildlvupˆ—’ljÁ
-
-EMakefike‚Ìclean•”•ª‚ðC³
-
- (char/ map/ login/)
- Makefile
- E휂·‚éŽÀsƒtƒ@ƒCƒ‹‚̃pƒX‚ð ../athena/ ‚©‚ç ../ ‚ÉC³
-
---------------
-//357 by ŒÓ’±—–
-
-Epc.c‚Ì•¶Žš‰»‚¯C³
- •¶Žš‰»‚¯‚µ‚½ƒtƒ@ƒCƒ‹‚ðƒAƒbƒv‚·‚é‚Ì‚àA‚»‚ê‚ð‰ü‘¢‚·‚é‚Ì‚à‹ÖŽ~‚µ‚Ü‚¹‚ñ‚©H
- ’¼‚·‚Ì–Ê“|‚­‚³‚·‚¬‚Ü‚·B
-
- pc.c
- •¶Žš‰»‚¯‚ÌC³
-
-Eƒp[ƒeƒB‚âƒMƒ‹ƒh‚ÉŠ©—U‚³‚ꂽó‘ԂŃ}ƒbƒvˆÚ“®‚⃃OƒAƒEƒg‚·‚é‚ÆA
- Š©—U‚ð‹‘”Û‚·‚é‚悤‚ÉC³
-
- pc.c
- pc_setpos()C³
- map.c
- map_quit()C³
-
-EI-AthenaŽ©“®•œ‹ŒƒVƒXƒeƒ€(B-NSJŽì)‚ðAthena—p‚ɉü‘¢‚µ‚Ä“Y•t‚µ‚Ü‚µ‚½
- ƒvƒƒOƒ‰ƒ€‚Ì«Ž¿ã./toolƒtƒHƒ‹ƒ_‚Å‚Í‚È‚­./‚É‚ ‚è‚Ü‚·B
- athena.sh‚Ì•Ï‚í‚è‚Éstart‚Å‹N“®‚·‚é‚ÆmapŽI‚ª—Ž‚¿‚Ä‚à10•b’ö“x‚Å•œ‹Œ‚µ‚Ü‚·
- ƒvƒƒZƒX‚Íumapv‚Å’²‚ׂĂ܂·‚ª‘¼‚̃vƒƒZƒX‚É”½‰ž‚·‚é‚Æ‚«‚Í
- umap-serverv‚È‚Ç‚É•Ï‚¦‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B
-
- start
- mapŽIŽ©“®•œ‹ŒƒVƒXƒeƒ€‚̃VƒFƒ‹ƒXƒNƒŠƒvƒg
-
-
---------------
-//0356 by Ž€_
-
-Eathena.sh‚ðŽg‚í‚È‚­‚Ä‚àYare-launcher‚ðŽg‚¦‚é‚悤‚É•ÏXB(Ž©•ªŽŽ‚µ‚Ä‚Ü‚µ‚½‚ª
-ˆê‰ž“®‚«‚Ü‚µ‚½B‚Å‚à‘‹‚Ìê‡login-server.exe‚ªlogin-server.ex‚É“o˜^‚³‚ê‚Ä‚µ‚Ü‚¢
-Yare-launcher‚ªlogin-server.exe‘±‚¯‚ÄŽÀs‚·‚é–â‘肪‚ ‚è‚Ü‚·B‚±‚ê‚Íathena‚Ì
-–â‘è‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
- comm/makefileˆÈŠO‚Ìmakefile‘S‚Ä‚ðC³B
- athena.shC³B
- ŽÀsƒtƒ@ƒCƒ‹‚Í.,/athena ƒtƒHƒ‹ƒ_[‚¶‚á‚È‚­./ ƒtƒHƒ‹ƒ_[‚Éì‚ç‚ê‚Ü‚·B
-E V‹Kaccount‚Ì‹–—e‚·‚é‚©‚Ç‚¤‚©‚ðlogin_athena.cnf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB(‚±‚ê‚Í
- YareCVS‚ðŽQl‚µ‚½•¨‚Å‚·B)
- login.c
- int mmo_auth() C³B
- login_athena.cnf
- new_account ’ljÁB
-Echar.cAlogin.cAinter.cAmap.cAbattle.c‚ňꕔ‚Ìstrcmp‚ðstrcmpi‚É•ÏXB
-
---------------
-//355 by ‚䂤
-
-E¶Žè‘•”õ‚àl—¶‚µ‚½“ñ“—¬‚ÉC³
-@iƒ_ƒ[ƒWŒvŽZ‚Ì‚Ý‚ÅŒ©‚½–Ú“™‚Í•ÏX‚È‚µj
-
-map.h
- map_session_data‚ɶŽè—p‚Ì•Ï”‚ð’ljÁ
-
-battle.h
- battle_get_attack_element2()’ljÁ
-
-battle.c
- battle_get_attack_element2()’ljÁ
- battle_calc_weapon_attack()‚É
- @“ñ“—¬‚̈—‚ð’ljÁC³
- @ƒNƒŠƒeƒBƒJƒ‹‚æ‚èƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ðæ‚É”»’è‚·‚é‚悤‚ÉC³
- @‰ß踘B‚̒ljÁƒ_ƒ[ƒW‚ð¸˜Bƒ_ƒ[ƒW‚ÌŽŸ‚Ɉ—‚·‚é‚悤‚ÉC³
- @i‚±‚ê‚ç‚Í“ÆŽ©‚É’²‚ׂ½‚à‚Ì‚ÅŠÔˆá‚Á‚Ä‚¢‚é‰Â”\«‚ ‚èj
-
-pc.c
- pc_calcstatus()‚ɶŽè—p‚Ì•Ï”‚É’l‚ð“ü‚ê‚鈗‚ð’ljÁ
- pc_equipitem()‚Ì“ñ“—¬‘•”õ‚Ìꊂª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
-
---------------
-//353 by ‚¢‚Ç
-
-EYare-launcher‚ðŽg‚¤‚±‚Æ‚ªo—ˆ‚é‚悤‚ÉMakefile‚Æathena.sh‚ð•ÏX
-
---------------
-//352 by ŒÓ’±—–
-
-E‰r¥’†‚ɃNƒ‰ƒCƒAƒ“ƒg‚ðI—¹‚·‚é‚ÆmapŽI‚ª—Ž‚¿‚é–â‘è‚ÌC³
- skill.c
- skill_castend_id(),skill_castend_pos(),skill_castend_map()C³
- map.c
- map_quit()C³
-
-
-Eƒf[ƒ^ƒoƒbƒNƒAƒbƒv—p‚̃c[ƒ‹“Y•t
- Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
- Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
- Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
- ƒf[ƒ^‚ªÁ‚¦‚Ä‚àÓ”C‚ÍŽ‚¿‚Ü‚¹‚ñ
-
- (tool/)
- backup
- ƒf[ƒ^ƒoƒbƒNƒAƒbƒv—pPerlƒXƒNƒŠƒvƒg
-
---------------
-//0351 by Ž€_
-skill.c
- skill_use_id()‚ɉr¥”½‰žƒ‚ƒ“ƒXƒ^[‚̈—‚ð•ÏXB(UŒ‚ó‘ԈȊO‚Ìê‡
- ‰r¥”½‰ž‚ðÅ—Dæ‚É‚µ‚Ü‚·B)
-mob.c
- mob_ai_sub_hard_castsearch() ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ð“ñdˆ—‚µ‚Ä
- ‚¢‚½‚Ì‚ÅíœB
- mob_ai_sub_hard() ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ð“ñdˆ—‚µ‚È‚¢‚悤‚É•ÏXB
-pet.c - 0344‚É–ß‚µ‚Ü‚µ‚½B(C³‚Í­‚µ•ªÍ‚ð‚µ‚Ä‚©‚ç‚É‚µ‚Ü‚·B)
-pet.h - 0344‚É–ß‚µ‚Ü‚µ‚½B
-char.h
- CHAR_CONF_NAME ’ljÁB
-char.c
- do_init() ŽÀs‚·‚鎞ƒtƒ@ƒCƒ‹–¼‚ª“ü—Í‚³‚ê‚Ä‚¢‚È‚¢‚ÆCHAR_CONF_NAME‚ð
- Žg‚¤‚悤‚É•ÏXB
-map.h
- MAP_CONF_NAME ’ljÁB
-map.c
- do_init() ŽÀs‚·‚鎞ƒtƒ@ƒCƒ‹–¼‚ª“ü—Í‚³‚ê‚Ä‚¢‚È‚¢‚ÆMAP_CONF_NAME‚ð
- Žg‚¤‚悤‚É•ÏXB
-‚±‚ê‚Ålogin.exeAchar.exeAmap.exe‚ðathenaƒtƒHƒ‹ƒ_[‚ɃRƒs[‚µ‚½Œã–¼‘O‚ð
-login-server.exeAchar-server.exeAmap-server.exe‚É•ÏX‚·‚é‚ÆYare-launcher‚ðŽg‚¤
-‚±‚Æ‚ª‚Å‚«‚Ü‚·B‚±‚ê‚ðŽg‚¤‚ÆŽI‚ª—Ž‚¿‚é“x‚ÉŽ©“®“I‚ÉÄŽÀs‚µ‚Ä‚­‚ê‚Ü‚·B
-
---------------
-//0345 by Ž€_
-EƒLƒƒƒXƒeƒBƒ“ƒO’T’mŽÀ‘•B
- mob.c
- mob_ai_sub_hard_lootsearch() C³B
- mob_ai_sub_hard() C³B
- mob_ai_sub_hard_castsearch() ’ljÁB
- mob_target(), mob_ai_sub_hard_activesearch() ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ð
- mvpŒoŒ±’l‚É‚æ‚Á‚Ä”FŽ¯‚·‚é‚悤‚É•ÏXB
- mob_ai_sub_hard_linksearch() C³B
- mob_attack() Ž€‚ñ‚¾‚Ó‚èAƒnƒCƒfƒBƒ“ƒO‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏXB
- mob_readdb() C³B
-Epet.h
- MAX_PET_DB‚ð100‚É•ÏXB
-Epet.c
- read_petdb() C³B
-
---------------
-//0344 by@‰ß‹Ž‚Ìli1
-E@ƒyƒbƒg• Œ¸‚èŽÀ‘•‚¨‚æ‚Ñ‚»‚Ì‚Ù‚©FXC³
-E@ƒyƒbƒg‰a‚â‚èŽÀ‘•
-
- pet.c
- pet_calcrate(struct map_session_data *sd);
- ƒyƒbƒg‚ÌŠl“¾Šm—¦ŒvŽZ
- pet_food(struct map_session_data *sd);
- ƒyƒbƒg‰a‚â‚èƒVƒXƒeƒ€
- pet_hungry_change( int tid, unsigned int tick, int id,int data );
- ƒyƒbƒg‚ª• ‚ðŒ¸‚éƒƒWƒbƒN
- pet_status_int(struct map_session_data *sd);
- e–§“xŒvŽZ
- pet_status_hungry(struct map_session_data *sd);
- –ž• “xŒvŽZ
- pet_status_1a3(struct map_session_data *sd);
- ƒpƒPƒbƒg1a3Ý’èŠÖ”
- pet_initstate(struct map_session_data *sd);
- ƒyƒbƒg‚ª‰‚߂Ķ‚܂ꂽ‚Æ‚«‚̉ŠúƒXƒe[ƒ^ƒXÝ’è
- pet.h
- int pet_calcrate(struct map_session_data *sd);
- int pet_food(struct map_session_data *sd);
- int pet_hungry_change( int tid, unsigned int tick, int id,int data );
- int pet_status_int(struct map_session_data *sd);
- int pet_status_hungry(struct map_session_data *sd);
- int pet_status_1a3(struct map_session_data *sd);
- int pet_initstate(struct map_session_data *sd);
- ‚ð’ljÁ
- clif.c
- clif_pet_emotion(int fd,struct map_session_data *sd)
- ‰a‚ð‚ ‚°‚½‚Æ‚«‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðs‚¤
- clif.h
- clif_pet_emotion(int fd,struct map_session_data *sd);
-
---------------
-//0341 by Ž€_
-Eƒ‹[ƒgƒ‚ƒ“ƒXƒ^[ŽÀ‘•B
- map.h
- LOOTITEM_SIZE‚ð20‚ÉC³B
- struct mob_data‚Éint lootitem_count ’ljÁB
- mob.c
- mob_spawn() ­‚µC³B
- mob_ai_sub_hard_lootsearch() ’ljÁB
- mob_ai_sub_hard() C³B
- struct delay_item_drop2 ’ljÁB
- mob_delay_item_drop2() ’ljÁB
- mob_damage() C³B
- battle.h
- struct Battle_Config‚Éint monster_loot_type ’ljÁB
- battle.c
- battle_config_read() C³B
- battle_athena.cnf
- monster_loot_type: 0 ’ljÁB(Šî–{“I‚É0‚É‚È‚Á‚Ä‚¢‚Ü‚·B
- 0‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂĂà
- ‚Ü‚½ƒAƒCƒeƒ€‚ðH‚ׂđO‚̃AƒCƒeƒ€‚ªÁ‚¦‚éŽd—l‚Å‚·B
- 1‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂé‚Æ
- ‚à‚¤ƒAƒCƒeƒ€‚ðH‚ׂȂ­‚È‚è‚Ü‚·B
-
---------------
-//0340 by Ž€_
-EmvpƒoƒOC³B
- mob.c
- mob_damage()‚Åj‚É•Ï‚¦‚½‚Í‚¸‚Ì•¨‚ÉŒ©—Ž‚Æ‚µ‚ ‚è‚Ü‚µ‚½‚Ì‚Å
- C³‚µ‚Ü‚µ‚½B‚±‚ê‚ÅmvpƒAƒCƒeƒ€‚Å•Ï‚È•¨‚ªo‚È‚­‚È‚é‚Í‚¸‚Å‚·B
-Eclass_equip_db.txt
- EUC-JIS‚ðS-JIS‚É•ÏXB(ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª‘¼‚̃tƒ@ƒCƒ‹‚Í
- ‘S•”S-JIS‚¾‚Á‚½‚Ì‚Å...’P‚È‚éƒ~ƒX‚Å‚·‚ª...)
-
-----------
-//339 by ‚¢‚Ç
-
-E338‚ð“K—p‚µ‚½ó‘ԂŃrƒ‹ƒhƒGƒ‰[‚ª”­¶‚·‚é•s‹ï‡‚ðC³
-
-----------
-//338 by ‰ß‹Ž‚Ìli1
-
-E@pet_db.txt‚ɑΉž‚µ‚Ü‚µ‚½B
-E@pet_db‚ð‚‚©‚Á‚½ƒvƒƒOƒ‰ƒ€‚Ì‘‚«•û‚ÉC³‚µ‚Ü‚µ‚½B
-E@ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚鎖‚ªo—ˆ‚Ü‚·
-E@ƒyƒbƒg‚ɃAƒNƒZƒTƒŠ[‚ð‚‚¯‚鎖‚ªo—ˆ‚Ü‚·B
-E@Œ»Ýƒyƒbƒg‰a‚â‚èis’†
-
- (map/)
- clif.c/clif.h
- E petŠÖ˜A‚ÌŠÖ”‚ð‚Ù‚ÚC³‹y‚ђljÁ‚¢‚½‚µ‚Ü‚µ‚½B
- E clif_parse_EquipItem()“à•”‚Ńyƒbƒg—p‘•”õ‚Å‚ ‚é‚©‚Ç‚¤‚©‚Ì”»’è‚ðs‚Á‚Ä‚Ü‚·
- E clif_parse()‚ðC³‚µ‚Ü‚µ‚½B
-
- battle.h/battle.c
- E@battle_config.pet_rate•Ï”‚ð‘‚₵‚Ü‚µ‚½Bmob‚ɑ΂·‚é—‘‚ÌŠl“¾—¦
- @@‚ðÝ’è‚·‚鎖‚ª‰Â”\‚Æ‚È‚è‚Ü‚·
-
- pet.c/pet.h
- E pet_initstate(struct map_session_data *sd);
- @‰Šú‚̃yƒbƒgƒXƒe[ƒ^ƒX‚ðÝ’è‚·‚éŠÖ”‚Å‚·
- E pet_npcid(struct map_session_data *sd,int egg_name_id);
- @ƒyƒbƒg‚ÉŠ„‚è“–‚Ä‚ç‚ꂽnpc_id‚ð•Ô‚µ‚Ü‚·
- E pet_itemid(struct map_session_data *sd,int mob_id);
- @ƒ‚ƒ“ƒXƒ^[ID‚©‚ç—‘‚ÌID‚ðŠ„‚èo‚µ‚Ü‚·
- E pet_equip(struct map_session_data *sd,int equip_id);
- @ƒyƒbƒg‚̃AƒNƒZƒTƒŠ[‘•”õ‚Å‚·
- E pet_unequip(struct map_session_data *sd);
- @ƒyƒbƒg‚̃AƒNƒZƒTƒŠ[‰ðœ‚Å‚·
- E pet_calcrate(struct map_session_data *sd);
- @—‘Šl“¾Šm—¦ŒvŽZ‚ðs‚¢1or0‚ð•Ô‚µ‚Ü‚·B
- E pet_food(struct map_session_data *sd);
- @ƒyƒbƒg‰a‚â‚èlˆÄ‚Å‚·B‚Ü‚¾³í‚É“®ì‚µ‚Ü‚¹‚ñB
- E read_petdb()
- @pet_db.txt‚ð“Ç‚Ýž‚Ýpet_db[]‚É’l‚ð“ü‚ê‚éŠÖ”‚Å‚·
-
- E do_init_pet()
- @mapŽI‰Šú‰»‚Å‚æ‚Ñ‚¾‚µpet_db[]‚ðŽg‚¦‚é‚悤‚É‚·‚éˆ×‚Ì
- ƒyƒbƒgî•ñ‰Šú‰»ŠÖ”‚Å‚·B
-
- map.c/map.h
- E@BL_PET•Ï”‚ð‰Á‚¦‚Ü‚µ‚½
- E@mapŽI‰Šú‰»‚ÌŽž‚Édo_init_pet()‚ðŒÄ‚Ño‚µ‚Ü‚·B
-
- mmo.h
- E@s_pet\‘¢‘Ì‚É•Ï”’ljÁBƒLƒƒƒ‰ƒNƒ^[‚ªƒyƒbƒg‚̃f[ƒ^‚ð•ÛŽ‚·‚éˆ×‚̃VƒXƒeƒ€
- @‚̈סŒã‚à•Ï”‚Í‚»‚̂‚Ǒ‰Á‚·‚é—\’è
-
- npc.c
- ‰ü‘P‚µ‚Ü‚µ‚½B
-
- (conf/)
- battle_athena.cnf‚É—‘‚ÌŠl“¾Šm—¦pet_rate‚ð‰Á‚¦‚Ü‚µ‚½B
-
-----------
-//337 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‚̒ljÁ‚ÆC³
- EƒMƒ‹ƒh‚ÉŒoŒ±’l‚ðã”[‚·‚é‚ÆAã”[‚³‚ê‚éEXP‚ªˆÙí‚È’l‚É‚È‚éƒoƒOC³
- EƒMƒ‹ƒh‚Ì“G‘Ί֌W‚̒ljÁ
-
- guild.c/guild.h
- guild_payexp()‚ÌC³(ã”[EXPˆ—)
- guild_opposition()’ljÁ
- guild_allianceack(),guild_reqalliance(),
- guild_reply_reqalliance()‚ÌC³
- clif.c/clif.h
- clif_guild_oppositionack(),clif_parse_GuildOpposition’ljÁ
-
-EƒfƒBƒŒƒCŽžŠÔ‚ªdex‚̉e‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚ðbattle_athena.cnf‚É‘‚¯‚é‚悤‚É
-
- (conf/)
- battle_athena.conf
- delay_dependon_dex ‚ð’ljÁ
- (map/)
- skill.c
- skill_delay_fix()‚ÌC³
- battle.c/battle.h
- struct Battle_Config‚Édelay_dependon_dex’ljÁ
- battle_config_read()‚ÌC³(“Ç‚Ýž‚݈—‚à•Ï‚¦‚Ä‚Ü‚·)
-
---------------
-//0336 by Ž€_
-EƒXƒLƒ‹ƒCƒ“ƒfƒ…ƒA‚ð­‚µC³B
-Eclif.c
- clif_skill_damage()Aclif_skill_damage2() ƒCƒ“ƒfƒ…ƒA‡‚킹‚ÄC³B
- (‚½‚¾ƒXƒLƒ‹‚â–‚–@‚É‚È‚é‚ƃ‚[ƒVƒ‡ƒ“‚ªo‚È‚¢ƒpƒPƒbƒg‚ð
- Œ©‚‚¯‚È‚©‚Á‚½‚Ì‚ÅŠ®‘S‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
- clif_parse_ActionRequest()Aclif_parse_UseSkillToId()Aclif_parse_UseSkillToPos()
- ƒXƒLƒ‹ƒfƒBƒŒƒC‚ÌŽž‚ɃƒbƒZ[ƒW‚ªo‚é‚悤‚ÉC³B
-EƒoƒbƒNƒXƒeƒbƒvŽÀ‘•AƒIƒŠƒfƒIƒRƒ“Œ¤‹†ŽÀ‘•B
-Eskill.c
- skill_castend_damage_id()‚É‚ ‚Á‚½ƒXƒLƒ‹ƒoƒbƒNƒXƒeƒbƒv‚̈—‚ð
- skill_castend_nodamage_id()‚Ɉړ®‚µ‚Ü‚µ‚½B
- ƒXƒLƒ‹ƒoƒbƒNƒXƒeƒbƒv‚̈—‚Åclif_skill_damage2()‚ðŒÄ‚Ô‚Ì‚ðclif_fixpos()‚ð
- ŒÄ‚Ԃ悤‚É•ÏXB(‚±‚ê‚Ń_ƒ[ƒW‚̃‚[ƒVƒ‡ƒ“‚ªo‚¸‚É
- ˆÚ“®‚Å‚«‚Ü‚·B)
- ƒoƒbƒNƒXƒeƒbƒv‚Æ‹©‚Ԃ悤‚É•ÏXB
- skill_produce_mix() ƒIƒŠƒfƒIƒRƒ“Œ¤‹†“K—pB•ŠíƒŒƒxƒ‹‚ª3ˆÈã‚ÌŽž‚É
- ƒXƒLƒ‹ƒŒƒxƒ‹*1%‚ªƒ{[ƒiƒX‚Æ‚µ‚Ä»‘¢Šm—¦‚É•t‚«‚Ü‚·B
- ƒGƒ‹ƒjƒEƒ€‚ÌŠm—¦”»’è’ljÁB
-Eskill_db.txt - ƒoƒbƒNƒXƒeƒbƒv‚Ìnk‚ð0‚©‚ç1‚É•ÏXB(ƒXƒLƒ‹”Ô†150‚Ì•¨‚Å‚·B)
-Eproduce_db.txt ƒIƒŠƒfƒIƒRƒ“,ƒGƒ‹ƒjƒEƒ€‚ð’ljÁB(‚±‚ê‚Í–{ŽI‚É‚Í‚È‚¢•¨‚Å‚·B
- ‚æ‚Á‚ăNƒ‰ƒCƒAƒ“ƒg‚É‚Í•K—v‚ȃAƒCƒeƒ€‚ª•\Ž¦‚³‚ê‚Ü‚¹‚ñB)
- ƒIƒŠƒfƒIƒRƒ“Œ¤‹†‚ð­‚µŽg‚¦‚镨‚É‚·‚邽‚߂ɒljÁ‚µ‚Ü‚µ‚½B
- ƒIƒŠƒfƒIƒRƒ“‚Ìꇂ̓IƒŠƒfƒIƒRƒ“Œ´Î3‚‚ÆÎ’Y1‚‚ª•K—v‚Å
- ƒGƒ‹ƒjƒEƒ€‚̓Gƒ‹ƒjƒEƒ€Œ´Î3‚‚ÆÎ’Y1‚‚ª•K—v‚Å‚·B
-Epc.c ­‚µC³B
- pc_heal()pc_percentheal() ­‚µ‚¾‚¯C³B
- pc_gainexp() ƒMƒ‹ƒh‚Éexp‚ðã”[‚·‚鎞‚Éexp‚ªƒ}ƒCƒiƒX‚É‚È‚ç‚È‚¢‚悤‚É
- C³B“¯Žž‚É2‚ˆÈã‚̃Œƒxƒ‹‚ªã‚ª‚é‚悤‚É•ÏXB
- ő僌ƒxƒ‹ˆÈã‚ɃŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢‚悤‚ÉC³B
- pc_checkbaselevelup()Apc_checkjoblevelup() ’ljÁBƒŒƒxƒ‹ƒAƒbƒv‚ð
- ƒ`ƒFƒbƒN‚µ‚Ü‚·B
- pc_itemheal() ’ljÁBƒAƒCƒeƒ€‚ðŽg‚¤Žž‚ÉVIT‚ƃXƒLƒ‹‚É‚æ‚Á‚ă{[ƒiƒX‚ª
- •t‚­•¨‚Å‚·BƒXƒLƒ‹ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“ŽÀ‘•B
-Epc.h
- pc_checkbaselevelup(),pc_checkjoblevelup() ’ljÁB
- pc_itemheal() ’ljÁB
-Escript.c - ƒXƒNƒŠƒvƒgfixheal‚𜋎Bitemheal‚ð’ljÁBheal‚ªfixheal‚Ì‹@”\‚ð‚·‚é
- ‚悤‚É•ÏXB
- buildin_fixheal() ‚ðÁ‚µbuildin_heal()‚ðŒ³‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½B(‚‚܂è
- buildin_heal()‚ªbuildin_fixheal()‚É‚È‚è‚Ü‚µ‚½B)
- buildin_itemheal() ’ljÁBƒAƒCƒeƒ€‚É‚æ‚é‰ñ•œ‚Í‚±‚ê‚ðŒÄ‚Ԃ悤‚É‚µ‚Ä
- ‚­‚¾‚³‚¢B
- buildin_heal()‚©‚çƒ{[ƒiƒX‚ÌŒvŽZ‚𜋎B
-Eitem_db.txtA item_db2.txt - heal‚ðitemheal‚É•ÏXB
-Emob.c
- mob_damage() 0335‚Åmvp‚É­‚µŠÔˆá‚¢‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B
-Eskill.h
- MAX_SKILL_PRODUCE_DB‚ð64‚©‚ç100‚É•ÏXB
-
-
-//0335 by Ž€_
-Echar/char2.c‚̈ꕔ‚ÉRETCODE‚ª“K—p‚³‚ê‚Ä‚È‚©‚Á‚½‚Ì‚Å‚»‚ê‚ðC³B
-Echar/char2.c‚Ìparse_char()‚ŃLƒƒƒ‰‚ðÁ‚·Žž‚É–â‘肪‚ ‚è‚»‚¤‚ÈŠ‚ðC³B
-Echar/cha2.c,login/ login2.c‚ðchar/cha.c, login/login.c‚É•ÏXB
-Echar/makefile,login/makefile‚ð•ÏXB
-Emakefile‚Æcommon/mmo.h‚ð•ÏX‚µ‚ÄOS‚ðŽ©“®”FŽ¯‚µ‚ÄRETCODE‚ðŽ©“®‚É
- “K—p‚·‚é‚悤‚É•ÏXB
-Ecommon/grfio.c‚Ìgrfio_init()‚ðC³B(ƒR[ƒh‚ð‚¿‚å‚Á‚Æ‚«‚ê‚¢(H)‚É
- ‚µ‚½‚¾‚¯‚Å‚·‚ª,,,)
-EƒCƒ“ƒfƒ…ƒAŽÀ‘•B‚æ‚Á‚ăAƒ“ƒeƒBƒyƒCƒ“ƒƒ“ƒg‚àŽÀ‘•B
-Emap/clif.c
- clif_parse_LoadEndAck() ŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚̃pƒbƒ`‚ɇ‚킹‚Ä­‚µ•ÏXB
- (ƒ}ƒbƒv‚ª•Ï‚í‚é“x‚É•Ší‚ƃV[ƒ‹ƒh‚ªŒ©‚¦‚È‚­‚Ȃ邽‚ß‚Å‚·B‚Ü‚¾
- “ú–{ƒNƒ‰‚Æ‚ÍŠÖŒW‚ ‚è‚Ü‚¹‚ñ‚ª...)
- clif_skillinfoblock() up‚Í‚¢‚ç‚È‚¢‚ÆŽv‚¤‚Ì‚ÅÁ‚µ‚Ü‚µ‚½BƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ª
- 256A512“™‚ÌŽžƒXƒLƒ‹ƒcƒŠ[‚ª³‚µ‚­•\Ž¦‚³‚ê‚È‚¢‚±‚Æ‚Í
- ‚à‚¤‚ ‚è‚Ü‚¹‚ñB
- clif_guild_skillinfo() “¯‚¶‚悤‚Éup‚ðÁ‚µ‚Ü‚µ‚½B
- clif_birthpet() pc_delitem() ŒÄ‚Ԃ悤‚É•ÏXB
- clif_damage() ƒCƒ“ƒfƒ…ƒA‚ɑΉž‚·‚é‚悤‚É•ÏXB
-Emap/pc.c
- pc_percentheal() ƒ}ƒCƒiƒX‚ð“ü‚ê‚Ä‚à“®‚­‚悤‚É•ÏXB­‚µC³B
- pc_heal() ­‚µC³B
- natual_heal() ­‚µC³B
- do_init_pc() natual_heal‚ÌC³‚ɇ‚킹‚Ä•ÏXB
- pc_calcstatus() ‹|‚ð‘•”õ‚µ‚Ä‚È‚¢‚ƃƒV‚Ì–Ú‚ª“K—p‚³‚ê‚È‚¢‚悤‚É•ÏXB
- ƒgƒ‰ƒXƒgŽÀ‘•B
- pc_damage() ƒCƒ“ƒfƒ…ƒA‚ɑΉž‚·‚é‚悤‚É•ÏXB
-Emap/pc.h
- pc_checkoverhp(), pc_checkoversp()‚ð’ljÁB
-Emap/map.h
- MAX_PC_CLASS‚ð+1‚ÉB
-Emap/atcomand.c
- comand‚ðcommand‚É•ÏXB
- strncmp‚ðstrcmpi‚É•ÏXB‚æ‚Á‚ăRƒ}ƒ“ƒh‚ª‘啶ŽšA¬•¶Žš‚ð‹æ•Ê‚·‚é
- •K—v‚ª‚È‚­‚È‚è‚Ü‚µ‚½B
-Emap/npc.h
- npc_parse_mob()‚ð’ljÁB(ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
-Emap/temdb.c
- itemdb_readdb()‚Åclass_equip_db.txt‚ð“ǂނ悤‚É•ÏXB
-Edb/class_equip_db.txt ‚ð’ljÁB‚±‚±‚Å‘•”õ‚·‚éƒNƒ‰ƒX‚ðŽw’肵‚Ü‚·B‚È‚¢ê‡‚Í
- item_db.txt‚É‚ ‚éjob‚ðŽg‚¢‚Ü‚·BŠÜ‚Ü‚ê‚Ă镨‚ÍŠ®‘S‚È•¨‚Å‚Í‚È‚­
- Žg—p—á’ö‚Ì•¨‚Å‚·B
-Emap/skill.c - skill_status_change_start() ƒCƒ“ƒfƒ…ƒA‚ÌŽžŠÔ‚𳂵‚­•ÏXB
-Emap/battle.h
- battle_config‚Ìexp_rate‚ðbase_exp_rate‚É•ÏXB,job_exp_rate‚ð’ljÁB
- battle_get_mexp()‚ð’ljÁB
-Emap/battle.c
- battle_config‚Ìexp_rate‚ðbase_exp_rate‚É•ÏXB,job_exp_rate‚ð’ljÁB
- battle_get_mexp()‚ð’ljÁB
- battle_calc_magic_attack()‚ð•ÏXBƒ_[ƒ“ƒAƒ“ƒfƒbƒh‚Ń{ƒX‚Ì”FŽ¯‚ðmvp
- exp‚Å‚·‚é‚悤‚É•ÏXB
-Emap/mob.c
- mob_readdb() base_exp_rate,job_exp_rate‚ɑΉžB
- mob_readdb() ƒ{ƒX‚Ì”FŽ¯‚ðmvpŒoŒ±’l‚Å‚·‚é‚悤‚É•ÏXB
- mob_damage() mvp‚ðŽæ‚鎞‚̈—‚ð•ÏXBd‚³‚ª50%‚ð‰z‚¦‚é‚Æ°‚É
- —Ž‚¿‚é‚悤‚É•ÏX‚ÆFXB
-Econf/battle_athena.cnf
- base_exp_rateA,job_exp_rate‚ð’ljÁB
-E0308‚Å–Y‚ꂽ•¨
- ŒÃ‚­Â‚¢” AŒÃ‚¢ƒJ[ƒh’ŸAŒÃ‚¢Ž‡F‚Ì” ‚ÌŽg—p‚Å“¾‚ç‚ꂽƒAƒCƒeƒ€‚ð
- Ž‚Á‚Ä‚È‚­‚È‚Á‚½‚çƒAƒCƒeƒ€‚ð°‚É—Ž‚Æ‚·‚悤‚É•ÏXB
- »‘¢‚Í‚·‚Å‚É0302‚Å“K—pB
-
-----------
-//334 by C}{RIS
-
-E‚ ‚Ղ낾‚Ì332.txt‚ðpet_db.txt‚Æ‚µ‚Ä“¯«B
-
-EŠeŽíƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚̃~ƒX‚ðC³
- Eattr_fix.txt@‘®«C³‚ªƒ}ƒCƒiƒX‚É“­‚¢‚Ä“G‚ª‰ñ•œ‚·‚é–â‘è‚ðC³B
- „Œ³‚̉ñ•œŽd—l‚É–ß‚µ‚½‚¢ê‡attr_fix.txt‚ðƒŠƒl[ƒ€‚µAattr_fix_old.txt‚ðattr_fix.txt‚ɃŠƒl[ƒ€‚µ‚ĉº‚³‚¢B
- Emob_db.txt@ƒ‚ƒ“ƒXƒ^[‚Ì“ú–{Œê–¼‚ð–{ŽI‚Æ“ˆêB
- Ecast_db.txt@‰r¥ŽžŠÔAƒfƒBƒŒƒC‚ð–{ŽI‚Æ“ˆêB
-
-----------
-//333 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‹@”\’ljÁ
- EƒMƒ‹ƒh‚Ì“¯–¿‚Æ“¯–¿‰ðÁ
-
- (char/)
- inter.c/int_guild.c
- ƒpƒPƒbƒg’·/ƒMƒ‹ƒhˆ—’ljÁ
- (map/)
- clif.c/clif.h
- clif_guild_reqalliance,clif_guild_allianceack,
- clif_guild_delalliance,clif_parse_GuildRequestAlliance,
- lif_parse_GuildReplyAlliance,clif_parse_GuildDelAlliance’ljÁ
- iƒMƒ‹ƒh“¯–¿ŠÖŒW‚̃pƒPƒbƒgˆ—j
- intif.c/intif.h
- ƒMƒ‹ƒh“¯–¿ŠÖŒW‚̃pƒPƒbƒgˆ—’ljÁ
- guild.c/guild.h
- ƒMƒ‹ƒh“¯–¿ŠÖŒW‚̈—’ljÁ
- map.h
- struct map_session_data‚Éguild_alliance,guild_alliance_account’ljÁ
-
-EƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‚Ì•ÏX‚ªƒ}ƒbƒvŽI‚ðÄ‹N“®‚µ‚È‚¢‚Æ—LŒø‚É‚È‚ç‚È‚¢ƒoƒOC³
-
- guild.c/guild.h
- guild_emblem_changed‚ÌC³
-
-----------
-//331 by ‰ß‹Ž‚Ìli1
-
-EƒyƒbƒgƒVƒXƒeƒ€C³(Š®¬“x25%)
-
- EŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ð‚»‚ê‚¼‚ê‘Ήž‚·‚é“G‚ɑ΂µ‚ÄŽg—p‚·‚邱‚Æ‚Å
- @³‚µ‚­—‘‚ªŽè‚É“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- EŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ð‘Ήž‚µ‚È‚¢“G‚ÉŽg—p‚µ‚½ê‡‚̓‹[ƒŒƒbƒg‚ª•K‚¸Ž¸”s‚µ‚Ü‚·B
- Eƒyƒbƒg‚ªuŽž‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- Eƒyƒbƒg‚ð‰EƒNƒŠƒbƒN‚·‚é‚ƃƒjƒ…[‚ªo‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- E‘¼FXŠëŒ¯‚È—v‘f‚ðC³‚µ‚Ü‚µ‚½B(ƒAƒCƒeƒ€‚Ì”‚ÌŒ¸­“™‚̃oƒO‚𒼂µ‚Ü‚µ‚½)
-
- (db/)
- item_db.txt
- ŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ɑΉž‚·‚é‚悤petƒRƒ}ƒ“ƒh‚𳂵‚­‘‚«‚Ü‚µ‚½B
-
- (common/)
- mmo.h
- s_pet ƒyƒbƒg\‘¢‘Ì‚Épet_item_id‚ð’ljÁ
-
- (map/)
- clif.c
- clif_birthpet()‚ðC³B³‚µ‚­—‘‚ªŒ¸‚éA³‚µ‚¢—‘‚ÌID‚ðŽæ“¾‚·‚é‚悤C³
- ‚±‚ê‚É‚æ‚Á‚ÄA³‚µ‚­npc_petŠÖ”‚ª“®‚«‚Ü‚·B
-
- clif_spawnnpc()‚ðC³iWBUFPOS(buf,36,nd->bl.x,nd->bl.y)‚ÆA”’l‚ð26‚©‚ç36‚Ö•ÏX‚µ‚Ü‚µ‚½)
- ‚±‚ê‚É‚æ‚Á‚ăyƒbƒg‚ªuŽž‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
-
- npc.c
- npc_pet()‚ðC³B
-
- pet.c/pet.h
- ƒyƒbƒgŠÖ˜A‚Ìׂ©‚ÈŠÖ”‚ð‚±‚¿‚ç‚É‚Ü‚Æ‚ß‚éˆ×A’ljÁ‚µ‚Ü‚µ‚½B
- Œ»Ý‚̓yƒbƒg‚Ì”»’èŠÖŒW‚ð‚Ü‚Æ‚ß‚Ä‚ ‚è‚Ü‚·B
-
- script.c
- “Á‚É‘å‚«‚ÈC³‚Í‚ ‚è‚Ü‚¹‚ñB
-----------
-//330 by ‰ß‹Ž‚Ìli1
-
-EƒyƒbƒgƒVƒXƒeƒ€“±“ü(Š®¬“x‚Q‚O“)
- E“G‚ɑ΂µ‚ĕߊl—pƒAƒCƒeƒ€‚ðŽg—p‚·‚鎖‚ª‰Â”\‚Æ‚È‚è‚Ü‚µ‚½B
- @(‚Ü‚¾n‚µ‚Ä‚¢‚È‚¢ƒŠƒ“ƒS‚Ì‚ÝŽg—p‰Â”\A“G‚ɂ‚©‚Á‚Ä‚àƒ|ƒŠƒ“‚Ì—‘‚ªŽè‚É“ü‚è‚Ü‚·B)
- EŠeŽí—‘‚ɑ΂µ‚ăyƒbƒg‚ð•\Ž¦‚·‚鎖‚ª‚Å‚«‚Ü‚·A‚½‚¾‚µ‚È‚º‚©ˆê“x‰æ–ÊŠO‚É
- @‚Å‚È‚¢‚ƃyƒbƒg‚ª•\Ž¦‚³‚ê‚Ü‚¹‚ñB
- @(‹°‚ç‚­ƒyƒbƒg•\Ž¦‚ÌÛ‚És‚Á‚Ä‚¢‚éNPCƒXƒe[ƒ^ƒX‚ª³‚µ‚­“ü‚Á‚Ä‚¢‚È‚¢)
- E•\Ž¦‚³‚ꂽƒyƒbƒg‚ªƒpƒtƒH[ƒ}ƒ“ƒX‚ðs‚¢‚Ü‚·B
-
- (db/)
- item_db.txt
- Œg‘Ñ—‘›z‰»‹@‚ðŽg—p‰Â”\‚É bpetƒRƒ}ƒ“ƒh(Œg‘Ñ—‘›z‰»‹@Žg—p)
- u‚Ü‚¾n‚µ‚Ä‚È‚¢ƒŠƒ“ƒSv‚ðŽg—p‰Â”\‚É petƒRƒ}ƒ“ƒh(‚ ‚émob‚ɑ΂µ‚ÄŽg—p‰Â”\‚É‚·‚é)
- (common/)
- mmo.h
- s_pet@ƒyƒbƒg\‘¢‘̒ljÁ
- mmo_charstatus@ƒyƒbƒg\‘¢‘Ì錾•Ï”’ljÁ(pet)
- (map/)
- clif.c/clif.h
-
- int clif_catchpet(struct map_session_data *sd,int pet_id);
- void clif_ruletpet(int fd,struct map_session_data *sd);
- int clif_judgepet(struct map_session_data *sd,int target_id);
- int clif_sendegg(struct map_session_data *sd);
- void clif_listpet(int fd,struct map_session_data *sd);
- int clif_birthpet(struct map_session_data *sd,int pet_id);
- void clif_menupet(int fd,struct map_session_data *sd);
-
- ˆÈã‚ÌŠÖ”‚ð’ljÁ‚µƒyƒbƒg‚ÉŠÖ‚·‚鈗‚ðs‚Á‚Ä‚¨‚è‚Ü‚·B
- (ƒ‹[ƒŒƒbƒgA—‘‘I‘ð‘‹AƒpƒtƒH[ƒ}ƒ“ƒXA‚»‚Ì‚Ù‚©FX)
-
- npc.c/npc.h
- int npc_pet(struct map_session_data *sd,int name_id);
- ƒyƒbƒg•\Ž¦‚ׂ̈̊֔‚ð’ljÁ
- (‚±‚ÌŠÖ”“à•”‚Ńyƒbƒg‚Ì•\Ž¦ˆ—‚ðs‚Á‚Ä‚¢‚Ü‚·B“KØ‚ÉC³‚µ‚Ä‚­‚¾‚³‚¢)
-
- script.c
- int buildin_catchpet(struct script_state *st);
- int buildin_birthpet(struct script_state *st);
- ‚ð’ljÁ‚µ‚Ü‚µ‚½BƒXƒNƒŠƒvƒg‚Épet,bpet‚ð’ljÁ‚µ‚Ü‚µ‚½B
-----------
-//329 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‹@”\’ljÁ
- EƒMƒ‹ƒh‚Ö‚ÌEXP‚Ìã”[
- EƒMƒ‹ƒhƒŒƒxƒ‹ƒAƒbƒv
- EƒMƒ‹ƒhƒXƒLƒ‹‚ÌŠ„‚èU‚è
-
- (db/)
- exp_guild.txt
- ƒMƒ‹ƒhƒŒƒxƒ‹‚ÌŒoŒ±’lƒf[ƒ^ƒx[ƒX
- (common/)
- mmo.h
- GBI_*,GMI_*‚Ì’è‹`‚̒ljÁ‚È‚Ç
- (char/)
- int_guild.c
- EXP‚⃌ƒxƒ‹ƒAƒbƒvAƒXƒLƒ‹ƒAƒbƒvˆ—’ljÁ‚È‚Ç
- inter.c
- ƒpƒPƒbƒg’·’ljÁ
- (map/)
- guild.c/guild.h
- ƒMƒ‹ƒhˆ—’ljÁ
- intif.c/intif.h
- ƒMƒ‹ƒhƒpƒPƒbƒgˆ—’ljÁ
- clif.c
- clif_guild_skillinfo()C³
- clif_guild_skillup()’ljÁ
- pc.c
- pc_skillup()‚ŃMƒ‹ƒhƒXƒLƒ‹‚ÌꇂÍguild_skillup()‚ðŒÄ‚Ԃ悤‚É
- pc_gainexp()‚Åã”[EXP‚Ì‚½‚ß‚Éguild_payexp()‚ðŒÄ‚Ԃ悤‚É
-
-EƒMƒ‹ƒh‹@”\C³
- EƒMƒ‹ƒhƒƒ“ƒo[‚ªƒƒOƒCƒ“‚⃃OƒAƒEƒg‚·‚é‚ÆA
- ƒƒOƒCƒ“’†‚̃Mƒ‹ƒhƒƒ“ƒo[‚ɃMƒ‹ƒhŒnƒpƒPƒbƒg‚ª‘—‚ç‚ê‚È‚­‚È‚é–â‘èC³
-
- guild.c
- guild_recv_memberinfoshort()‚ÌC³
-
-----------
-//328 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‹@”\‚̒ljÁ‚È‚Ç
- E’Ç•ú‹@”\‰¼ŽÀ‘•i’Ç•ú‚µ‚½ƒLƒƒƒ‰‚àĉÁ“ü‰Â”\•ˆê•”î•ñ‚ªƒ_ƒ~[j
- EƒXƒLƒ‹‚Ì•\Ž¦i•\Ž¦‚¾‚¯‚Å‚·Bã‚°‚½‚è‚Ío—ˆ‚Ü‚¹‚ñj
-
- (common/)
- mmo.h
- struct guild_explusion‚Ì•ÏX
- (char/)
- int_guild.c
- ’Ç•úˆ—’ljÁ
- ‹óƒMƒ‹ƒhƒ`ƒFƒbƒN‚ȂǒljÁ
- (map/)
- guild.c/guild.h
- ƒMƒ‹ƒhƒXƒLƒ‹ŠÖŒW‚̃AƒNƒZƒT‚ȂǒljÁ
- clif.c
- clif_guild_skillinfo()‚ÌC³
- clif_guild_explusionlist()’ljÁ
-
-Eƒ^[ƒ“ƒAƒ“ƒfƒbƒh‚ªƒ{ƒXŒnƒAƒ“ƒfƒbƒh‚ÅMISS‚É‚È‚éƒoƒOC³
- Eƒ^[ƒ“ƒAƒ“ƒfƒbƒhŽ¸”sŽž‚̃_ƒ[ƒW‚ªŽg‚í‚ê‚Ü‚·
-
- battle.c
- battle_calc_magic_damage()‚ÌC³
-
-----------
-//327 by ‚¢‚Ç
-EŒoŒ±’lƒe[ƒuƒ‹‚É‚P‰ÓŠŠÔˆá‚¢‚ª‚ ‚Á‚½‚Ì‚ÅC³
- db/exp.txt
-
-----------
-//326 by ‚¢‚Ç
-EcharŽI‚ÌVŽI,ƒƒ“ƒeƒiƒ“ƒX’†‚̃tƒ‰ƒOî•ñ‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
-EcharŽI‚ÌŽI–¼‚Ì’·‚³‚ª16ƒoƒCƒg‚É‚È‚Á‚Ä‚¢‚½•”•ª‚ð20ƒoƒCƒg‚ÉC³
-
- (login/)
- login2.c
- parse_login()‚ÌC³
- login.h
- struct mmo_char_server‚ÌC³
- (char/)
- char2.c
- check_connect_login_server(),do_init()‚ÌC³
- (conf/)
- char_athena.cnf
-@ Echar_maintenance‚ð1‚É‚·‚é‚ƃƒOƒCƒ“l”‚ÌŒã‚ë‚É(“_ŒŸ’†)‚ª‚‚­
-@ Echar_new‚ð1‚É‚·‚é‚ÆŽI–¼‚Ì‘O‚É[V]‚ª‚‚­
- (doc/)
- ƒpƒPƒbƒg‰ðÍ.txt
- E¡‰ñ‚Ì•ÏX‚É”º‚¤ˆê•”C³
-
-----------
-//325 by Mind Twist(224&0293)
-E“G(NPC)ƒXƒLƒ‹‚̒ljÁiƒcƒŠ[‚ɒljÁ‚Ì‚Ýj
- db/skill_db.txt
- EƒMƒ‹ƒhƒXƒLƒ‹‘Š•Ï‚í‚炸•s–¾c‚±‚ÌŒ`Ž®‚¶‚á‚È‚¢‚Ì‚©‚ÈH
-
-----------
-//324 by non
-
-Emob‚̃^[ƒQƒbƒgŒãˆÚ“®‚ðC³
-Emob‚̈ړ®‘¬“x‚ðDB‚©‚甽‰f‚³‚¹‚é‚悤‚É
-
- (map/)
- mob.c
- mob_ai_sub_hard()‚ÌC³
-
-EŽÎ‚ß”»’è‚ðC³
- EFW“™‚ł̎΂ߔ͈͂ð–{ŽIŽd—l‚É
-
- (map/)
- map.c
- map_calc_dir()‚ÌC³
-
-----------
-//322 by ŒÓ’±—–
-
-EƒƒOƒCƒ“Žž‚É•K‚¸ƒp[ƒeƒB[‚©‚眖¼‚³‚ê‚éƒoƒOC³
- E0318‚Ìuƒp[ƒeƒB‚𜖼‚³‚ꂽ‚Ì‚É`v‚Å‚ÌC³ƒ~ƒX
-
- (char/)
- int_party.c
- ƒp[ƒeƒB[‹£‡Žž‚̃ƒbƒZ[ƒW‚ɉüs’ljÁ
- (map/)
- party.c
- party_check_member()‚ÌC³
-
-EƒMƒ‹ƒh‰ï˜bŽÀ‘••C³‚È‚Ç
- (char/)
- int_guild.c
- ƒMƒ‹ƒh‹£‡Žž‚̃ƒbƒZ[ƒW‚ɉüs’ljÁ
- (map/)
- guild.c/guild.c
- guild_send_message(),guild_recv_message()‚ȂǒljÁ
- intif.c/intif.h
- intif_parse_GuildMessage()‚ȂǒljÁ
- clif.c/clif.h
- clif_guild_message(),clif_parse_GuildMessage()‚ȂǒljÁ
- clif_guild_basicinfo()‚̃pƒPƒbƒg‚ð0150‚©‚ç01b6‚É•ÏX
-
-EƒoƒbƒNƒXƒeƒbƒv‚ª‚à‚Ì‚·‚²‚­‰ö‚µ‚¢‚¯‚lj¼ŽÀ‘•
- EŽg‚¤‚ƃ_ƒ[ƒW‚ð‚P‹ò‚ç‚Á‚½‚悤‚ÉŒ©‚¦‚Ü‚·B(ŽÀۂ̓_ƒ[ƒW‚O‚Å‚·)
-
- skill.c
- skill_castend_damage_id()C³
-
-------------------
-//321 by@‰ß‹Ž‚Ìli
-E‹|–î‘•”õŒø‰Ê‚Ì‚ÝŽÀ‘•(‘½X‚¨‚©‚µ‚¢“_‚Í‘¶Ý‚·‚邪‘•”õ‚ªo—ˆA–î‚ÌŒø‰Ê‚ªo‚é)
- map/clif.c map/clif.h
- clif_itemlist()’ljÁ
- Ž‚¿•¨‚Ì’†‚Å‹|–î‚ÉŠ„‚è“–‚Ä‚éƒpƒPƒbƒg”Ô†‚ð0x8000‚Æ‚·‚鈗’ljÁ
-
- clif_arrowequip(struct map_session_data *sd,int val); //self
- ‚ð’ljÁB‚±‚Ì’†‚Å‹|–î‘•”õƒpƒPƒbƒgˆ—‚ðs‚Á‚Ä‚Ü‚·
- map/pc.c
- pc_equipitem()@‹|–î‘•”õ’ljÁ
-
- Žc‚³‚ꂽ–â‘è“_F
- E@–Œ¸‚ç‚È‚¢
- E@ƒŠƒƒO‚·‚é‚Ɩ‚P‚É‚È‚é
- E@‘•”õ‚µ‚Ä‚¢‚é–•\Ž¦‚³‚ê‚È‚¢(©‘½•ª‘•”õpos‚ÌÝ’è‚ð‚µ‚Ä‚¢‚È‚¢ˆ×‚©‚Æ)
- E@–î‚ð‘•”õ‰ðœ‚Å‚«‚È‚¢(‘¼‚Ì–î‚ð‘•”õ‚µ‚È‚¨‚¹‚Α•”õ‚µ‚½–î‚ÌŒø‰Ê‚É‚È‚è‚Ü‚·
-
-----------
-//320 by ‚¢‚Ç
-EˆÈ‰º‚̃pƒPƒbƒg‚̃Gƒ‰[ƒR[ƒh‚Ìà–¾‚ð’ljÁ
- doc/ƒpƒPƒbƒg‰ðÍ.txt
- R 006a <error No>.B
- R 0070 <error No>.B
- R 0081 <type>.B
-
-----------
-//319 by mk
-ENPC‚Ƃ̉ï˜b’†‚É‘•”õ•ÏXAƒAƒCƒeƒ€AƒXƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½
- map/clif.c
- ŠeŠ‚Åsd->npc_id‚ðƒ`ƒFƒbƒN‚µ‚Ä‚Ü‚·
-
-Eˆê•”‚Ì”í‚蕨‚łธBŒã‚É‘•”õ‰ÓŠ‚ª‚¨‚©‚µ‚­‚È‚éƒoƒO‚ðC³
- map/script.c
- buildin_successrefitem ‚̃R[ƒh‚ðC³
-
-EƒJ[ƒh‚É‚æ‚é’ljÁŒø‰Ê‚¨‚æ‚шÙí‘Ï«”­“®ˆ—‚ÌC³
- map/skill.c
- ƒCƒ“ƒfƒbƒNƒX‰Šú’l‚ªŠÔˆá‚Á‚Ä‚¢‚é‚ÆŽv‚í‚ê‚é‚Ì‚ÅC³iSC_POISON -> SC_STONEj
-
-Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚̉¼ŽÀ‘•AƒOƒŠƒ€ƒgƒD[ƒX‚ÌŽg—pðŒ’ljÁ
- Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ð‰¼ŽÀ‘•B‚«”ò‚΂µˆ—‚â‚Á‚Ä‚é‚Ì‚Å
- @battle.c ‚Ìblewcount‚ðƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½
- EƒOƒŠƒ€ƒgƒD[ƒX‚ÌŽg—pðŒiƒnƒCƒfƒBƒ“ƒO•ƒJƒ^[ƒ‹‘•”õjƒ`ƒFƒbƒN’ljÁ
- @‚±‚ñ‚ÈŠ´‚¶‚Å‘¼‚̃XƒLƒ‹Žg—pðŒ‚à’ljÁ‚µ‚Ä‚à‚æ‚¢‚Ì‚©‚ÈH
- Eskill_blown ‚Ì‚«”ò‚΂µ•ûŒü‚ðƒ^[ƒQƒbƒg‚Ƃ̈ʒu‚ªd‚È‚Á‚Ä‚¢‚é‚Æ‚«‚Í
- @ƒ‰ƒ“ƒ_ƒ€‚Å‚Í‚È‚­ƒLƒƒƒ‰ƒNƒ^[‚ðŒã‚ë‚Ö‚«”ò‚΂·‚悤‚É•ÏX‚µ‚Ü‚µ‚½
- map/skill.c
- skill_castend_damage_id()•ÏX
- skill_check_condition()•ÏX
- skill_blown()•ÏX
-
-EƒAƒTƒVƒ““ñ“—¬ˆ—‚ÉŠÖ‚·‚éC³?
- E‘•”õˆê——‚Ödrag&dropŽž‚É—¼Žè‚ªÔ‚­ƒ}[ƒLƒ“ƒO‚³‚ê‚é‚悤‚ÉC³
- @ƒAƒTƒVƒ“‚Å‚Í•Ší‘•”õ‰ÓŠ‚ª—¼Žè‚É‚È‚é‚悤item_equippoint‚ð•ÏX
- @‚»‚ê‚É”º‚¢pc.c‚Ìpc_equipitem‚ðC³
- E‹tŽèƒ_ƒ[ƒW‚ð•\Ž¦‚µ‚Ä‚Ý‚Ü‚µ‚½
- @‚Ü‚Æ‚à‚Ƀ_ƒ[ƒWŒvŽZ‚â‚Á‚Ä‚È‚¢‚Ì‚ÅUŒ‚‰ñ”‚ÌŠm”F‚¾‚¯‚Å‚·
- EƒJƒ^[ƒ‹’ÇŒ‚‚ƶŽèUŒ‚‚ÌMISS‚ð–³—‚â‚è•\Ž¦
- (map/)
- itemdb.c (itemdb.hAclif.cApc.c)
- itemdb_equippoint() ‚ð•ÏX i“ñ“—¬‚ðl—¶j
- ˆø”‚ð(int nameid) -> (struct map_session_data *sd,int nameid)‚É
- ˆø”•ÏX‚É”º‚¢éŒ¾(itemdb.h)‚ƌĂÑo‚µ‘¤(clif.c ,pc.c)‚à•ÏX
- pc.c
- pc_equipitem(), pc_checkitem()‘•”õƒ`ƒFƒbƒN‚ðC³
- battle.c
- battle_calc_weapon_attack(),battle_weapon_attack()
- ã‚É‚à‘‚«‚Ü‚µ‚½‚ª¶Žè‚̃_ƒ[ƒWŒvŽZ‚Ís‚Á‚Ä‚Ü‚¹‚ñ
- (ƒJ[ƒhA‘®«“™‚à–¢“K—p)‰EŽè‚Æ“¯‚¶ƒ_ƒ[ƒW“ü‚ê‚Ķ‰EC—û“K—p‚µ‚Ä‚Ü‚·
- ƒJƒ^[ƒ‹’ÇŒ‚‚ƶŽèƒ_ƒ[ƒW‚ðƒ~ƒX‚³‚¹‚é•û–@(ƒpƒPƒbƒg?)‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å
- ŒvŽZŒã‚̃_ƒ[ƒW‚ª-1‚Ìê‡Adamage=0‚ð‘—‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·
- ‚à‚Á‚Æ‚æ‚¢•û–@‚ª‚ ‚é‚Ì‚Å‚µ‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·
-
-EŠ®‘S‰ñ”ð‚ÌŒvŽZ‚ðLuk‚Å‚Í‚È‚­Flee2‚Å”»’f‚·‚é‚悤‚ÉC³
- map/battle.c
- battle_calc_weapon_attack()
-
- (db)
- item_db.txtAitem_db2.txt
- ‘•”õ•i‚̈ꕔƒ{[ƒiƒXŒø‰Ê‚ð’ljÁ
- mob_db.txt
- –^Š‚Å‚¤‚‚³‚ê‚Ä‚¢‚½‚à‚Ì‚ð­‚µC³
- ‚Ü‚¾Mode‚âDrop‚É–â‘è“_‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
-
-----------
-//0318 by ŒÓ’±—–
-
-E‚ ‚éŒö•½•ª”zPT‚Æ‚»‚ÌPT‚É‘®‚³‚È‚¢PC‚ª‹¤“¬‚·‚é‚ÆŽI‚ª–\‘–‚·‚éƒoƒOC³
-
- mob.c
- mob_damage()‚ÌEXP•ª”zˆ—C³
-
-Eƒp[ƒeƒB‚𜖼‚³‚ꂽ‚Ì‚ÉŠ‘®‚µ‚Ä‚¢‚é‚悤‚ÉŒ©‚¦‚éƒoƒOC³
- EŠY“–ƒLƒƒƒ‰‚ªƒƒOƒAƒEƒgó‘Ô‚ÌŽž‚Éœ–¼‚³‚êA‚»‚ÌŒãA“¯C•ÊƒLƒƒƒ‰‚ª
- “¯ƒp[ƒeƒB‚ÉŠ‘®‚µ‚È‚¨‚µA‚³‚ç‚ÉŒ³‚̃Lƒƒƒ‰‚ŃƒOƒCƒ“‚·‚é‚ÆA
- œ–¼”»’è‚ÉŽ¸”s‚µ‚ăp[ƒeƒB‚ÉŠ‘®‚µ‚½‚Ü‚Ü‚Å‚ ‚é‚Æ‚³‚ê‚Ä‚µ‚Ü‚¤–â‘èC³
-
- party.c
- party_check_member()‚ÌC³
-
-
-----------
-//0317 by nabe
-
-Eu`‚³‚ñ‚©‚çŽæˆø‚ð—v¿‚³‚ê‚Ü‚µ‚½Bv‚ªŽ©•ª‚Ì–¼‘O‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
- trade.c/clif.c/clif.h
- clif_traderequest()‚ÅŽæˆø‘ŠŽè‚̃Lƒƒƒ‰–¼‚ð“n‚·‚悤‚É•ÏX
-
-----------
-//0316 by nabe
-
-E—¼Žè•Ší‚ð¸˜B‚·‚é‚Æ•ÐŽè‘•”õ‚É‚È‚éƒoƒO‚ðC³
- script.c
- buildin_successrefitem()‚ÅA—¼Žè•Ší‚Ìꇓ™‚É‘•”õ‰ÓŠƒ`ƒFƒbƒN
-
-----------
-//0315 by ŒÓ’±—–
-
-EPC‚ÌSPAWNƒ^ƒCƒ~ƒ“ƒO‚ð•ÏX
- Eƒ}ƒbƒvˆÚ“®(ƒƒOƒCƒ“)ŽžAƒ[ƒfƒBƒ“ƒOI—¹Œã‚ÉSPAWN‚·‚é‚悤‚ÉB
- Eƒ[ƒh’†‚ÉUŒ‚‚³‚ꂽ‚肵‚È‚­‚È‚è‚Ü‚·B
- EƒMƒ‹ƒh/ƒp[ƒeƒBî•ñ“Ç‚Ýž‚Ý‘O‚É–¼‘O‰ðŒˆƒpƒPƒbƒg‚ª—ˆ‚é–â‘è‚à
- C³‚³‚ê‚é‚Í‚¸‚Å‚·B
-
- pc.c
- pc_setpos()‚Åmap_addblock,clif_spawnpc‚̌ĂÑo‚µ‚ðŽ~‚ß‚½B
- clif.c
- clif_parse_LoadEndAck‚Åmap_addblock,clif_spawnpc‚ðŒÄ‚Ԃ悤‚ÉB
-
-EinterŽIƒpƒPƒbƒgˆ—‚Ìd‘å‚È–â‘è‚ðC³
- Eˆê“x‚ɃpƒPƒbƒg‚ð‘—M‚Å‚«‚È‚©‚Á‚½ê‡A–³ŒÀƒ‹[ƒv‚Ɋׂé–â‘èC³
-
- (char/)
- char2.c
- parse_frommap()C³
- inter.c
- inter_parse_frommap()C³
- (map/)
- chrif.c
- chrif_parse()C³
- intif.c
- intif_parse()C³
-
-EƒMƒ‹ƒh‚Ì‹@”\’ljÁ
- E‘¼l‚̃Gƒ“ƒuƒŒƒ€‚ªŒ©‚¦‚é‚悤‚ÉB
- EƒƒOƒCƒ“’¼Œã‚ÌŽ©•ª‚̃Gƒ“ƒuƒŒƒ€‚ªŒ©‚¦‚é‚悤‚ÉB
- E’E‘Þ‚Å‚«‚é‚悤‚ÉBi’Ç•ú‚Í‚Ü‚¾‚Å‚·j
-
- <ƒpƒPƒbƒgî•ñˆø‚«‘±‚«–ÍW>
- E016c,016d,0163,015c‚È‚Ç‚ÌÚׂÈî•ñ
- EƒMƒ‹ƒhƒXƒLƒ‹‚ÌID‚ª‚í‚©‚élA‹³‚¦‚Ä‚Ù‚µ‚¢‚Å‚·B
- 158,205,331‚ ‚½‚è’²‚ׂ܂µ‚½‚ªƒ_ƒ‚È–Í—lB
-
- (common/)
- mmo.h
- MAX_GUILD‚ð36‚ÉB
- (char/)
- int_guild.c
- ’E‘ނ̃pƒPƒbƒg•ÏX
- inter.c
- ƒpƒPƒbƒg’·C³
- (map/)
- clif.c/clif.h
- clif_set0078,clif_set007b‚ÌC³
- clif_guild_belonginfo‚ÌC³
- clif_guild_skillinfo’ljÁ
- guild.c/guild.h
- ’E‘ނȂǂ̈—’ljÁ
- intif.c/intif.h
- ’E‘ނȂǂ̈—’ljÁ‚È‚Ç
-
-
-----------
-//0314 by ‚¢‚Ç
-
-EcharŽI‚ÆmapŽI‚ÌŽI”ãŒÀ‚ð30‚Ɉø‚«ã‚°
- login/login.h
- char/char.h
-
-Emap_athena1.cnf‚ðmap_athena.cnf‚ɃŠƒl[ƒ€
-@‚»‚ê‚É”º‚¢Aathena.sh‚ð•ÏX
-
-EƒpƒPƒbƒg‰ðÍŽ‘—¿‚ðdoc/‚Ɉړ®
-
-
-----------
-//0313 by ŒÓ’±—–
-
-EƒMƒ‹ƒh‚Ì‹@”\’ljÁ
- EƒMƒ‹ƒhŠ©—U/–ðE“à—e•ÏX/ƒƒ“ƒo[‚Ì–ðE•ÏX‚È‚Ç
- Eguild.txt‚Ì‘Ž®‚ª‚Ü‚½•Ï‚í‚è‚Ü‚µ‚½‚ªA‘O‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚é‚Í‚¸‚Å‚·B
-
- <ƒpƒPƒbƒgî•ñˆø‚«‘±‚«–ÍW>
- E016c,016d,0163,015c‚È‚Ç‚ÌÚׂÈî•ñ
- EŽ©•ªˆÈŠO‚ÌPC‚ÌŠ‘®ƒMƒ‹ƒhID‚ð’Ê’m‚·‚éƒpƒPƒbƒg
-
- (common/)
- mmo.h
- struct guild ‚ð•ÏX
- (char/)
- int_guild.c/inter.c
- ˆ—’ljÁ/ƒpƒPƒbƒg’·’ljÁ
- (map/)
- guild.c/guild.h/intif.c/intif.h
- ˆ—’ljÁ
- clif.c/clif.h
- ƒMƒ‹ƒhŠÖŒW‚̃pƒPƒbƒgˆ—’ljÁ
-
-Ehelp.txt‚ðC³
- help.txt
-
-E0311‚É‚æ‚镶Žš‰»‚¯‚ðC³
- README
- map/pc.c
-
-----------
-//0312 by ‚¢‚Ç
-
-E@hƒRƒ}ƒ“ƒh‚ð@help‚É•ÏX
-E“Ç‚Ýž‚Þƒ}ƒbƒvƒf[ƒ^‚Ì’è‹`•”•ª‚ð•ÏX
-
-----------
-//0311 by tk44
-EAssassin “ñ“—¬‘•”õAASPD–â‘èC³
- - map\pc.c
- pc_equipitem(), pc_calcstatus(), pc_checkitem()
-
-E“ñ“—¬ŠQŒvŽZC³‚Ü‚¾ˆ—’†
-
-----------
-//0310 by ŒÓ’±—–
-
-EƒƒO‚âƒf[ƒ^‚ÉŽg‚¤‰üsƒR[ƒh‚ðmmo.h‚ÅÝ’è‰Â”\‚É
- (common/)
- mmo.h
- RETCODE‚ʼnüsƒR[ƒh‚𕶎š—ñ‚Å’è‹`‚µ‚Ü‚·B
- WindowsŒn‚¾‚ÆCR/LF‚È‚Ì‚Å"\r\n",UNIXŒn‚¾‚Æ"\n"‚Å‚·B
- •Ê‚ɳ‚µ‚­Žw’肵‚È‚­‚Ä‚àAthenaŽ©‘Ì‚Í–â‘è‚È‚­“®ì‚·‚é‚Í‚¸‚Å‚·B
- (login/)
- login2.c
- (char/)
- char2.c/int_storage.c/int_party.c/int_guild.c
- •Û‘¶‚·‚é‰üsƒR[ƒh‚ðRETCODEˆË‘¶‚É•ÏXB
- ‰üsƒR[ƒh‚Ɉˑ¶‚¹‚¸‚É“Ç‚ß‚é‚悤‚ÉC³B
-
-EƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç•s–¾‚ȃpƒPƒbƒg‚ª—ˆ‚½‚çƒ_ƒ“ƒv‚·‚é‚悤‚É
- E#define DUMP_UNKNOWN_PACKET 1 ‚ðƒRƒƒ“ƒg‰»‚·‚ê‚΃_ƒ“ƒv‚µ‚Ü‚¹‚ñB
-
- clif.c
- •s–¾ƒpƒPƒbƒg‚̈—‚Ń_ƒ“ƒvˆ—‚ð’ljÁB
-
-EƒMƒ‹ƒh‹@”\‚̒ljÁ
- EƒGƒ“ƒuƒŒƒ€•ÏX/’m•ÏXŽÀ‘•
- Eguild.txt‚Ì‘Ž®‚ª•Ï‚í‚è‚Ü‚µ‚½‚ªA‘O‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚é‚Í‚¸‚Å‚·
-
- (char/)
- int_guild.c/inter.c
- ƒMƒ‹ƒhƒpƒPƒbƒgˆ—AƒpƒPƒbƒg’·
- (map/)
- guild.c/guild.h
- ‹@”\’ljÁ
- intif.c/intif.h
- ƒMƒ‹ƒhŠÖŒWƒpƒPƒbƒg’ljÁ
- clif.c/clif.h
- ƒMƒ‹ƒhŠÖŒWƒpƒPƒbƒg’ljÁ
-
-----------
-//0309 by C}{RIS
-
-Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ð”͈ÍUŒ‚‰»‚µ‚Ü‚µ‚½B
-Eƒvƒƒ“ƒeƒ‰‚É‘•”õ•i”Ì”„NPC‚ð’ljÁ‚µ‚Ü‚µ‚½B
- map_athena1.cnf‚Ì
- npc_shop1J.txt‚ðƒRƒƒ“ƒgƒAƒEƒg‚·‚ê‚Ζ³Œø‚Éo—ˆ‚Ü‚·B
-EƒAƒCƒeƒ€‚Ì–¼‘O‚ÆID‚ð‘‚¢‚½ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ð“Y•tBiitem.listj
-
-----------
-//0308 by Ž€_
-EŽ©‘R‰ñ•œ‚̃vƒƒOƒ‰ƒ€‚ðC³‚µ‚Ü‚µ‚½B
- ‚±‚ê‚Å‘åä•v‚¾‚Æ‚¢‚¢‚Å‚·‚ª...
- pc.c
- pc_natural_heal()“™‚ðC³B
- pc_percentheal()‚ð­‚µC³B
- pc_checkskill()‚ð­‚µC³BƒXƒLƒ‹‚ª‚È‚¢ê‡0‚ð•Ô‚·‚悤‚É
- •ÏX‚µ‚Ü‚µ‚½B‘¼‚Ì.cƒtƒ@ƒCƒ‹‚àC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚Å
- C³‚µ‚Ü‚µ‚½B
-E4l–Ú‚Æ5l–ڂ̃Lƒƒƒ‰‚ðÁ‚¹‚È‚¢–â‘è‚ðC³B
-EŽn‚ß‚©‚çƒiƒCƒt‚ƃRƒbƒgƒ“ƒVƒƒƒc‚ðŽ‚‚悤‚É•ÏXB
-ELOOK_SHEILD‚ðLOOK_SHIELD‚ÉC³B
-Emmo_charstatus‚Ìsheild‚ðshield‚ÉC³B
-E.logƒtƒ@ƒCƒ‹‚âaccount.txtƒtƒ@ƒCƒ‹‚ðnotepad‚ÅŠJ‚­‚Æ—ñ‚ª‘S•”Œq‚¢‚Å‚¢‚é
- –â‘è‚ðC³B
-E—”‚ðŽžŠÔ‚É‚æ‚Á‚ĉŠú‰»‚·‚é‚悤‚É•ÏXB
- map.c
- do_init()‚ð­‚µC³B
-
-‘¼‚É•ÏX‚µ‚½ƒtƒ@ƒCƒ‹‚à‚ ‚è‚Ü‚·‚ª‘S•”Šo‚¦‚Ä‚Ü‚¹‚ñ‚Ì‚Å...
-
-----------
-//0307 by ŒÓ’±—–
-
-EV‹KPC‚̉ŠúˆÊ’u‚ðchar_athena.cnf‚É‘‚¯‚é‚悤‚É‚µ‚½
- start_point: ƒ}ƒbƒv–¼,x,y ‚̂悤‚ÉŽw’肵‚Ü‚·B
- <—á> start_point: new_1-1.gat,53,111
-
- (char/)
- char2.c
-
-EƒMƒ‹ƒh‚̈ꕔ‹@”\
- EƒMƒ‹ƒh쬂­‚ç‚¢‚µ‚©“®‚«‚Ü‚¹‚ñ
- EŠ©—U/’E‘Þ/‰ðŽU/î•ñ‚Ì•ÏX/ƒGƒ“ƒuƒŒƒ€/’m‚È‚Ç‚Í‚·‚ׂĖ¢ŽÀ‘•‚Å‚·
-
- <ØŽÀ‚È—v–]>
- ƒMƒ‹ƒhŠÖŒW‚̃pƒPƒbƒgî•ñ‚ª‘S‘R‘«‚è‚Ü‚¹‚ñB‚í‚©‚él‚Í‹³‚¦‚Ä‚­‚¾‚³‚¢B
- Œ»Ý‚̂܂܂ł̓Gƒ“ƒuƒŒƒ€‚Æ’m‚­‚ç‚¢‚µ‚©ŽÀ‘•‚Å‚«‚È‚¢‰Â”\«‚ªcB
-
- (common/)
- mmo.h
- ƒMƒ‹ƒhŠÖŒW‚Ì\‘¢‘̂ƒ蔒ljÁ
- (char/)
- inter.c
- ƒpƒPƒbƒg’·î•ñ’ljÁ
- int_guild.c/int_guild.h
- ŽÀۂ̈—’ljÁ
- (map/)
- map.h
- struct map_session_data‚ɃMƒ‹ƒhŠÖŒW‚̃ƒ“ƒo’ljÁ
- guild.c/guild.h
- V‹K’ljÁBƒMƒ‹ƒh‹@”\—p
- pc.c
- pc_authok()‚ŃMƒ‹ƒhŠ‘®ŽžAguild_request_info()‚ðŒÄ‚Ԃ悤‚ÉB
- clif.c/clif.h
- ƒMƒ‹ƒhƒpƒPƒbƒg’ljÁ
- intif.c/intif.h
- ƒMƒ‹ƒhƒpƒPƒbƒg’ljÁ
-
-E0303‚Å‚ÌC³uMAXHP‚È‚Ç‚ªƒT[ƒo[‚ƃNƒ‰ƒCƒAƒ“ƒg‚Å`v‚ðŒ³‚É–ß‚µ‚½
- EVPC‚ðì‚é‚Æ‚«‚ɳ‚µ‚­HP‚È‚Ç‚ðŒvŽZ‚µ‚Ä‚­‚ê‚é‚悤‚É‚È‚Á‚½‚Ì‚Å
- –ß‚µ‚Ä‚à•½‹C‚¾‚낤‚Æ—\‘ªB
- EƒƒOƒCƒ“’¼Œã‚Éd—ÊŒx‚ªo‚Ä‚µ‚Ü‚¤‚½‚ßB
-
- pc.c
- pc_authok()‚ÌC³
-
-E”͈͎w’蕦‚«‚̈—C³
- E‚Å‚«‚邾‚¯Žw’肵‚½”‚Æ“¯‚¶‚¾‚¯•¦‚­‚悤‚É
- (áŠQ•¨‚È‚Ç‚É‚æ‚镦‚«–WŠQ‚̉ñ”ðŽ¸”sŽžA‘O‚̉ñ”ðŒ‹‰Ê‚ðŽg‚¤)
-
- mob.c
- mob_once_spawn_area()‚ÌC³
-
-----------
-//0305 by ‚¢‚Ç
-EV‹KPC‚̈ʒu‚ð‰SŽÒC—ûê‚É•ÏXB
-EmapŽI‚ªcharŽI‚ÉÚ‘±‚Å‚«‚È‚¢•s‹ï‡‚ÌC³B
-
-----------
-//0304 by Ž€_
-EŽ©‘R‰ñ•œ‚Ì—Ê‚ÆŽžŠÔ‚ð•ÏXBŠØ‘ŽI‚É“K—p‚³‚ê‚Ă镨‚Å‚·‚ª“ú–{‚É‚à
- “K—p‚³‚ê‚Ä‚é‚Í‚¸‚Å‚·B(‘½•ª... ‚â‚Á‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚í‚©‚è‚Ü‚¹‚ñBŠ¾)
- HP‚Í–ˆ4•b‚É 1 + vit/6 + max_hp/200 ‚ð‰ñ•œA
- SP‚Í–ˆ8•b‚É 1 + int/6 + max_sp/100 ‚ð‰ñ•œ‚µ‚Ü‚·B
-EƒXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚é‰ñ•œ‚ð
- ƒXƒLƒ‹ƒŒƒxƒ‹*5 + max_hp/50‚É•ÏXB
-EƒXƒLƒ‹SP‰ñ•œ—ÍŒüã‚É‚æ‚é‰ñ•œ‚ð
- ƒXƒLƒ‹ƒŒƒxƒ‹*3 + max_sp/50‚É•ÏXB
-EƒXƒLƒ‹ˆÚ“®ŽžHP‰ñ•œŽÀ‘•B
- ¡‚ÌŠŽ~‚Ü‚Á‚Ä‚é‚Ì‚Æ”ä‚ׂÄ1/4‚Ì—Ê‚ð‰ñ•œ‚µ‚Ü‚·B(ŽžŠÔ‚Í“¯‚¶‚Å‚·B)
-Evit‚Æint‚É‚æ‚Á‚ĉñ•œŽžŠÔ‚ª’Z‚­‚È‚é‚Ì‚Å‚Í‚È‚­‰ñ•œ—Ê‚ª‘‚¦‚Ü‚·B
-EÅ‘åHP‚ÆÅ‘åSP‚ÌŒvŽZŒöŽ®‚ð•ÏXB
- map.h
- int inchealtick‚Ì•Ï‚í‚è‚Éint inchealhptick;‚Æ int inchealsptick;‚ð’ljÁB
- int parame[6] ‚ð’ljÁBÅ‘åSP‚ÌŒvŽZ‚ׂ̈̕¨‚Å‘•”õ‚É‚æ‚Á‚Äオ‚Á‚½
- ƒpƒ‰ƒ[ƒ^‚ðŽ‚Á‚ÂB
- pc.c
- pc_hpheal(),pc_spheal(),pc_natural_heal_sub(),pc_natural_heal()‚ð
- Ž©•ª‚̃R[ƒh‚É‘‚«Š·‚¦‚Ü‚µ‚½‚ªˆê‰ž³í‚É“®‚«‚Ü‚·‚ª
- ‘¼‚̃R[ƒh‚ɉe‹¿‚ª‚È‚¢‚©‚Ç‚¤‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB
- pc_additem()‚ð­‚µ‚¾‚¯C³B
- hp_coefficient‚ðint‚©‚çdouble‚É•ÏXB
- pc_calcstatus()‚Æpc_readdb()‚ðC³B
- job_db1.txt
- E‹Æ‚ÌŒv”‚ð•ÏX‚µ‚Ü‚µ‚½B(ƒNƒ‹ƒZƒCƒ_[“™‚̃f[ƒ^‚Í
- Š®‘S‚È•¨‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
-
-Echar2.c‚ð­‚µ‚¾‚¯•ÏXB
- char2.c
- make_new_char()‚ð­‚µ‚¾‚¯•ÏXB(ì‚Á‚½’¼Œã‚ÉHP‚ÆSP‚ªŠ®‘S‚É
- ‰ñ•œ‚µ‚Ä‚é‚悤‚É•Ï‚¦‚Ü‚µ‚½B)
- parse_char()‚ð­‚µ‚¾‚¯C³BŠØ‘‚̃Nƒ‰ƒCƒAƒ“ƒg‚ÅŒq‚¢‚Ä‚à
- ˆÙ킪‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B(0x187ƒpƒPƒbƒg‚̈—‚ð“ü‚ꂽ‚¾‚¯
- ‚Å‚·‚ª... ‚±‚ê‚ÍYare‚©‚玂Á‚Ä‚«‚½•¨‚Å‚·B)
-Estrcmpi“™‚Ìdefine‚ðatcomand.h‚©‚çmmo.h‚Ɉړ®‚µ‚Ü‚µ‚½B
- atcomand.h, mmo.h C³B
-E‰ñ•œƒAƒCƒeƒ€‚ðŽg—p‚·‚鎞vit‚ƃXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚éƒ{[ƒiƒX‚ª•t‚­
- ‚悤‚É•ÏXBƒ{[ƒiƒX‚Í
- ‰ñ•œ—Ê *(1 + HP‰ñ•œ—ÍŒüãƒXƒLƒ‹ƒŒƒxƒ‹*0.1 + vit/100)
- ‚É‚È‚è‚Ü‚·B
-EƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚ƃCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ð‰¼ŽÀ‘•B(‰ñ•œ‚Í‚µ‚Ü‚·‚ªƒGƒtƒFƒNƒg‚ª
- o‚Ü‚¹‚ñBitem_db‚Ń^ƒCƒv‚ð•Ï‚¦‚Ä‚à‘Ê–Ú‚Å‚µ‚½B)
- script.c
- buildin_fixheal()‚Æbuildin_percentheal()‚ð’ljÁB
- buildin_fixheal()‚Íbuildin_heal()‚ªƒXƒLƒ‹‚Ævit‚É‚æ‚Á‚ĉñ•œ—Ê‚ª•Ï‚í‚é
- Žd—l‚É‚È‚Á‚½‚Ì‚ÅŒ³‚Ìbuildin_heal()‚Ì–¼‘O‚¾‚¯‚ð•Ï‚¦‚½•¨‚Å‚·B
- buildin_percentheal()‚Í“ü—Í‚³‚ꂽ”Žš‚ð%‚Æ‚µ‚ÄHP‚ÆSP‚ðÅ‘åHP‚Æ
- Å‘åSP‚ð %”ä—¦‚ɉñ•œ‚µ‚Ü‚·B
- ƒXƒNƒŠƒvƒgfixheal A percentheal ’ljÁBŽg—p•û–@‚Íheal‚Æ“¯‚¶‚Å‚·B
- fixheal‚Ívit‚ƃXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚éƒ{[ƒiƒX‚ª‚È‚¢•¨‚Å
- percentheal ‚ÍŒã‚Ì”Žš‚ð %‚É”FŽ¯‚µ‚Ü‚·B
- pc.h
- pc.c
- pc_percentheal()‚ð’ljÁB
- item_db.txtAitem_db2.txt
- ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚ƃCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ð•ÏXB
-
-----------
-//0303 by ŒÓ’±—–
-
-E*.grf‚̃pƒX‚ðmap_athena.cnf‚É‚à‘‚¯‚é‚悤‚É‚µ‚½B
- Emap_athena.cnf‚Éudata_grf: ../data/data.grfv‚â
- usdata_grf: ../sakurai/sdata.grfv‚̂悤‚ɃpƒXŽw’è‚Å‚«‚Ü‚·B
- Egrf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·
-
- (common/)
- grfio.c/grfio.h
- grfio_setdatafile(),grfio_setsdatafile()’ljÁB
- data_file,sdata_file‚ðƒtƒ@ƒCƒ‹ƒ[ƒJƒ‹‚ȃOƒ[ƒoƒ‹•Ï”‚É•ÏXB
-
-E@stpoint,@skpoint‚É•‰’lŽw’è‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
-E@zenyƒRƒ}ƒ“ƒh’ljÁiƒ[ƒj[‚Ì’²®j
-E@str,@agi,@vit,@int,@dex,@lukƒRƒ}ƒ“ƒh’ljÁiŠî–{ƒpƒ‰ƒ[ƒ^’²®j
-
- atcommand.c
- @stpoint,@skpointC³
- @zeny,@str,@agi,@vit,@int,@dex,@luk’ljÁ
-
-Eƒƒ}[ƒiƒCƒg‚ðŽg‚¤‚Æ‚Ú‚Á‚½‚­‚ç‚ê‚Ä‚¢‚½–â‘è‚ðC³
-E•Ší»‘¢•”•ª‚̃R[ƒh‚𑽭•ÏX
- EÞ—¿Á”‚ðƒAƒCƒeƒ€‚ª•¡”ƒCƒ“ƒfƒbƒNƒX‚É•ª‚©‚ê‚Ä‚¢‚éꇂɑΉž‚³‚¹‚½
- i‚R–œŒÂŒÀŠE‚ð’´‚¦‚é‚ƕʃCƒ“ƒfƒbƒNƒX‚ðŽg‚¤Žd—l‚¾‚Á‚½‹C‚ª‚·‚é‚Ì‚Åj
- EŽ¸”sŽž‚É‚àŽü‚è‚É’Ê’m‚·‚é‚悤‚É‚µ‚½
-
- skill.c
- skill_check_condition()‚ÌC³
- skill_produce_mix()‚ÌC³
-
-E•Ší»‘¢Šm—¦‚ðconfƒtƒ@ƒCƒ‹‚Å”{—¦Žw’è‚Å‚«‚é‚悤‚ÉC³
-
- (conf/)
- battle_athena.cnf
- weapon_produce_rate’ljÁ
- (map/)
- skill.c
- skill_produce_mix()‚ÌC³
-
-E•ŠíATKƒTƒCƒY•â³ƒe[ƒuƒ‹‚ðŠO•”‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
-E¸˜B¬Œ÷Šm—¦/¸˜Bƒ{[ƒiƒX‚È‚Ç‚ðŠO•”‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
-E‰ß踘Bƒ{[ƒiƒX‚É‚æ‚é’ljÁƒ_ƒ[ƒWŽÀ‘•
-
- (db/)
- size_fix.txt
- ƒTƒCƒY•â³ƒe[ƒuƒ‹
- refine_db.txt
- ¸˜BŠÖŒWƒf[ƒ^
- (map/)
- pc.c
- pc_readdb()‚Å“Ç‚Ýž‚Ý
- battle.c
- battle_calc_weapon_attack()‚ɉß踘Bƒ{[ƒiƒXˆ—’ljÁ
-
-EMAXHP‚È‚Ç‚ªƒT[ƒo[‚ƃNƒ‰ƒCƒAƒ“ƒg‚ňႤ’l‚ÉŒ©‚¦‚éƒoƒOC³
- ƒƒOƒCƒ“’¼Œã‚̃Xƒe[ƒ^ƒXŒvŽZ‚ÌŒ‹‰Ê‚𒼂¿‚É‘—M‚·‚é‚悤‚É‚µ‚½
-
- (map/)
- pc.c
- pc_authok()‚Å‚Ìpc_calcstatus()‚̃tƒ‰ƒO‚ð0‚É‚µ‚½
- ‚±‚ê‚Åpc_calcstatus()‚̃tƒ‰ƒOƒpƒ‰ƒ[ƒ^‚Í–¢Žg—pH
-
-Eitem_db‚Ìu”EŽÒƒX|ƒcv‚ðu”EŽÒƒX[ƒcv‚ÉC³
- (db/)
- item_db.txt/item_db2.txt
- ”EŽÒƒX[ƒc‚Ì–¼Ì•ÏX
-
-EƒƒOƒCƒ“l”‚𒲂ׂéƒc[ƒ‹‚ð“Y•t
- Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
- Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
- Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
-
- (tool/)
- getlogincount
- ƒƒOƒCƒ“l”Š“¾PerlƒXƒNƒŠƒvƒg
-
-----------
-//0302 by Ž€_
-EƒAƒCƒeƒ€»‘¢ Šm—¦”»’èŽÀ‘•B
- “S‚ÌꇬŒ÷—¦‚Í
- (20 + base_level*0.3 + DEX*0.2 + LUK*0.1 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*6)%
- |“S‚Æ‘®«ÎA¯‚Ì‚©‚¯‚ç‚Ìê‡
- (10 + base_level*0.3 + DEX*0.2 + LUK*0.1 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*5)%
- •Ší‚Í
- ((2.5 + base_level*0.15 + DEX*0.1 + LUK*0.05 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*5 +
- ‹à•~ - ‘®«Î‚Ư‚Ì‚©‚¯‚ç) * (1 - (•ŠíƒŒƒxƒ‹ - 1)*0.2) +
- ƒXƒLƒ‹•ŠíŒ¤‹†ƒŒƒxƒ‹*1)%
- ‹à•~: ‚È‚¢ê‡ -5%‚Å‹à•~‚Í 0%AƒIƒŠƒfƒIƒRƒ“‚Ì‹à•~‚Í
- 2.5%A‰©‹à‚Ì‹à•~‚Í 5%AƒGƒ“ƒyƒŠƒEƒ€‚Ì‹à•~‚Í 7.5%
- ‘®«Î‚Ư‚Ì‚©‚¯‚ç: ‘®«Î‚ª‚ ‚éê‡ 5%‚ÅX‚É
- ¯‚Ì‚©‚¯‚ç‚Ì” * 5%‚ð‘«‚µ‚Ü‚·B
- ‚É‚È‚è‚Ü‚·‚ª‚¿‚å‚Á‚ÆŠm—¦‚ª’á‚·‚¬‚é‹C‚à‚µ‚Ü‚·‚Ì‚Å
- base_level*0.3 + DEX*0.2 + LUK*0.1‚ðbase_level*0.5 + DEX*0.4 + LUK*0.3‚É
- base_level*0.15 + DEX*0.1 + LUK*0.05‚ðbase_level*0.4 + DEX*0.3 + LUK*0.2
- ’ö“x‚É•Ï‚¦‚½•û‚ª‚¢‚¢‚©‚à’m‚è‚Ü‚¹‚ñB
- skill.c
- skill_can_produce_mix() ‚Æ skill_produce_mix() ‚ðC³B
- produce_db.txt
- ¯‚Ì‚©‚¯‚ç‚ðƒXƒLƒ‹‘®«Î»‘¢‚ª•K—v‚É•ÏXB
-E*.grf“™‚ðÝ’u‚¹‚¸ƒfƒBƒŒƒNƒgƒŠ‚©‚ç‚Ì“Ç‚Ýž‚ނ悤‚ÉC³B(‚±‚ê‚ÍYare‚©‚ç
- Ž‚¿ž‚ñ‚¾•¨‚Å‚·‚ª...)
- grfio.c
- grfio_init()‚ðC³B
- grf-file.txt
- V‹K’ljÁBgrfƒtƒ@ƒCƒ‹‚ª‚ ‚éƒfƒBƒŒƒNƒgƒŠÝ’è—pB
-E“Ç‚Ýž‚Þƒ}ƒbƒv‚Ìő唂ð512‚ÉC³B
- mmo.h
- MAX_MAP_PER_SERVER‚ð384‚©‚ç512‚ÉC³B
-Epc.c‚Épc_search_inventory()‚ð’ljÁB
- ‹@”\‚Íitem_id‚̃AƒCƒeƒ€‚ðŽ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚ðŠm”F‚µ‚Ä
- Ž‚Á‚Ä‚éꇂ»‚Ìindex‚ð•Ô‚·B
- item_id‚ª0‚Ìꇂ͋󂯂Ă銂Ìindex‚ð•Ô‚·B
- pc_additem()‚Æpc_takeitem()‚¾‚¯‚ð­‚µC³B
-EGMƒRƒ}ƒ“ƒh‚É@stpoint‚Æ@skpoint‚ð’ljÁB
- @stpoint ”Žš - ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðã‚°‚éB
- @skpoint ”Žš - ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðã‚°‚éB
- atcomand.c
- C³B
- atcomand.h
- strcmpi“™‚ðLinux‚Å‚àŽg‚¦‚é‚悤‚ÉC³B
-
-----------
-//0301 by ŒÓ’±—–
-
-EÅ‘åHP‚ª32767‚ð’´‚¦‚é‚ƈÙí‚È’l‚É‚È‚é–â‘è‚ÌC³
-ELv‚ª99‚ð’´‚¦‚é‚Æ‚«‚àƒGƒtƒFƒNƒg‚ðo‚·‚悤‚É‚µ‚½(Ž©•ª‚É‚ÍŒ©‚¦‚È‚¢–Í—l)
-E”z’uMOB‚É‚æ‚éƒCƒxƒ“ƒg‚ŃCƒxƒ“ƒg–¼‚ª‚SƒoƒCƒgˆÈã‚Æ‚¢‚¤§ŒÀ‚ð‚‚¯‚½
-EteleportŽž‚ÉŽæˆø’†’fAƒ`ƒƒƒbƒg‘ÞŽºA‘qŒÉ•Û‘¶ˆ—‚ð‚·‚é‚悤‚É‚µ‚½
-
- pc.c
- pc_calcstatus()‚ÌC³(HPŒvŽZ)
- pc_setpos()‚ÌC³(Žæˆø’†’f‚È‚Ç)
- clif.c
- clif_set0078(),clif_set007b(),clif_spawnpc()‚ÌC³(Lv99ƒGƒtƒFƒNƒg)
- npc.c
- npc_parse_mob()‚ÌC³
-
-E@h‚Åhelp.txt‚ª“Ç‚ß‚È‚¢‚Æ‚«‚É—Ž‚¿‚éƒoƒOC³
-E@lvup/@joblvup‚Å•‰’l‚ð“ü‚ê‚é‚ÆLvƒ_ƒEƒ“‚ª‰Â”\‚É‚È‚Á‚½
-
- atcommand.c
- @h,@lvup,@joblvupˆ—‚ÌC³
-
-EƒeƒŒƒ|[ƒg‚È‚Ç‚ÌÁ–ŃGƒtƒFƒNƒg‚ÌC³
-
- skill.c
- ƒeƒŒƒ|‚ÌÁ–ŃGƒtƒFƒNƒg‚ð•ÏX
-
-Eó‘ÔˆÙí‚ÉŠÖ‚·‚éƒXƒNƒŠƒvƒgŽÀ‘• [sc_start]‚Æ[sc_end]B
-E—ÎPOTA—΃n[ƒu‚È‚ÇŽÀ‘•
-E‘•”õƒ{[ƒiƒXƒf[ƒ^’ljÁ
-
- (db/)
- item_db.txt/item_db2.txt
- ‘•”õƒ{[ƒiƒXƒf[ƒ^‚ð’ljÁ
- —ÎPOTA—΃n[ƒu‚Ȃǂ̃XƒNƒŠƒvƒg’ljÁ
- (map/)
- script.c
- buildin_warp()‚ÅÁ–ŃGƒtƒFƒNƒg‚ð•ÏX
- buildin_sc_start(),buildin_sc_end()’ljÁ
-
-----------
-//0299 by ŒÓ’±—–
-
-ENPCƒCƒxƒ“ƒg‚ŃGƒNƒXƒ|[ƒg‚³‚ꂽƒ‰ƒxƒ‹‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
- NPCƒXƒNƒŠƒvƒg‚ÅOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚·‚é‚ÆAƒGƒNƒXƒ|[ƒg‚µ‚Ü‚·B
- NPCƒCƒxƒ“ƒg‚Å"NPC–¼(orƒCƒxƒ“ƒg–¼)::ƒ‰ƒxƒ‹–¼"‚Æ‚·‚é‚ÆA
- Žw’肵‚½ƒ‰ƒxƒ‹‚©‚çŽÀs‚Å‚«‚Ü‚·B
- ƒ‰ƒxƒ‹–¼‚Í24ƒoƒCƒgˆÈ“à‚É‚µ‚ĉº‚³‚¢B
- ‚ ‚ƃvƒƒOƒ‰ƒ€“I‚Ƀƒ‚ƒŠŒø—¦ˆ«‚¢‚Å‚·BŒã“úC³—\’è
- <—á>
- NPCutestv‚̃XƒNƒŠƒvƒg“à‚Å OnEvent: ‚ƃ‰ƒxƒ‹’è‹`‚µ‚½ê‡A
- NPCƒCƒxƒ“ƒgutest::OnEventv‚ÅŽw’èˆÊ’u‚©‚çŽÀs‚Å‚«‚Ü‚·B
-
- (conf/)
- npc_test_ev.txt
- ƒ‰ƒxƒ‹Žw’è‚̃Tƒ“ƒvƒ‹‚à‚¿‚傱‚Á‚ƒljÁ
- (map/)
- script.c/script.h
- script_get_label_db()‚Ȃǂ̒ljÁB
- parse_script‚Åscriptlabel_db‚Ƀ‰ƒxƒ‹ƒf[ƒ^‚ð’ljÁ‚·‚é
- npc.c/npc.h
- npc_event_export()‚ȂǒljÁ
- npc_parse_script‚щƒxƒ‹ƒf[ƒ^‚ðƒGƒNƒXƒ|[ƒg‚·‚é
- map.h
- struct map_session_data ‚Ìeventqueue‚̃Cƒxƒ“ƒg–¼‚̃TƒCƒY‚ð
- 50ƒoƒCƒg‚É‚µ‚½B
-
-EAGI‚ÆDEX‚É‚æ‚éASPDŒvŽZ‚ÌÅ‘å’l‚ð180‚©‚ç190‚É•ÏX
- pc.c
- pc_calcstatus()‚ÌASPDŒvŽZC³
-
-Eskill_db.txt/cast_db.txt‚Ì“Ç‚Ýž‚Ý‚ðskill.c‚É•ÏX
-
- pc.c
- pc_readdb()‚ÌC³
- skill.c
- skill_readdb()‚̒ljÁ
-
-EƒAƒCƒeƒ€»‘¢‰¼ŽÀ‘•
- Šm—¦”»’肪–¢ŽÀ‘•‚Å‚·B•K‚¸¬Œ÷‚µ‚Ü‚·B
-
- (db/)
- item_db.txt/item_db2.txt
- ƒAƒCƒeƒ€»‘¢‚ɑΉžiŒg‘Ñ—p—nz˜FA‹à’Æ‚È‚Çj
- produce_db.txt
- V‹K’ljÁB»‘¢ƒŠƒXƒgB
- (map/)
- skill.c/skill.h
- struct skill_produce_db’ljÁ
- skill_readdb()‚Åproduce_db.txt‚ð“ǂނ悤‚É
- clif.c/clif.h
- clif_skill_produce_mix_list(),clif_parse_ProduceMix()’ljÁ
- script.c/script.h
- »‘¢—pƒRƒ}ƒ“ƒh[produce]ì¬B
- ˆø”‚Í»‘¢—p”’l‚ÅA1-4‚ª•Ší»‘¢(Lv)A16‚ªzÎ
-
-
-----------
-//0298 by ŒÓ’±—–
-
-ELoginŽI‚̃pƒXƒ[ƒhˆÃ†‰»ƒ^ƒCƒv‚ðŽ©“®”FŽ¯‚Å‚«‚é‚悤‚É•ÏX
- login.h‚ÌPASSWORDENC‚ð3‚É‚·‚é‚ÆŽ©“®”FŽ¯‚µ‚Ü‚·B
- ʼn‚Épasswordencrypt‚Ń`ƒFƒbƒN‚µAŽ¸”s‚·‚ê‚Î
- passwordencrypt2‚Ń`ƒFƒbƒN‚µ‚Ü‚·B
-
- (login/)
- login2.c/login.h
- ˆÃ†‰»ƒpƒXƒ[ƒh‚ÌƇ•”•ª‚ðC³
-
-EƒAƒJƒEƒ“ƒg쬃c[ƒ‹‚ð“Y•t
- Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
- Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
- Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
-
- (tool/)
- addaccount
- ƒAƒJƒEƒ“ƒg쬃c[ƒ‹PerlƒXƒNƒŠƒvƒg
-
-EƒXƒLƒ‹‚̒ljÁC³
- Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚̉ñ”§ŒÀ‚ðƒOƒ‹[ƒv–ˆ‚©‚烆ƒjƒbƒg–ˆ‚ÉC³
- EƒNƒ@ƒOƒ}ƒCƒA‰¼ŽÀ‘• i“G‚̈ړ®‘¬“xAƒLƒƒƒ‰‚Ì•\Ž¦”’l‚͕ω»‚¹‚¸j
- EƒEƒH[ƒ^[ƒ{[ƒ‹‰¼ŽÀ‘•i“®ì‚ª³‚µ‚¢‚Ì‚©•s–¾j
- EƒtƒƒXƒgƒmƒ”ƒ@‰¼ŽÀ‘•iƒGƒtƒFƒNƒg‚ª—Ç‚­‚í‚©‚ç‚È‚¢‚Ì‚Å“K“–j
- Eƒxƒmƒ€ƒ_ƒXƒg‰¼ŽÀ‘•i”͈͂Ƃ©‚ª³‚µ‚¢‚©‚Ç‚¤‚©•sˆÀj
- Eƒvƒƒ{ƒbƒNAƒI[ƒgƒo[ƒT[ƒNA¹‘Ì~•ŸA»‚Ü‚«AΓŠ‚°‚ÌŽÀ‘•
- EƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‚Ì“Å•t—^ŽÀ‘•
-
- *’ˆÓ* “Åó‘Ô‚ÍŒ©‚½–Ú‚¾‚¯‚ÅŒø‰Ê‚Í–¢ŽÀ‘•
-
- (db/)
- skill_db.txt
- »‚Ü‚«/ΓŠ‚°/ƒEƒH[ƒ^[ƒ{[ƒ‹‚È‚ÇC³
- (map/)
- skill.c/skill.h
- FXC³
- mob.c/mob.h
- mob_target()’ljÁBMOB‚̃^ƒQ—p
- battle.c
- battle_get_*()ŒnC³‚È‚Ç
- pc.c
- pc_calcstatus()C³
-
-----------
-//0297 by ŒÓ’±—–
-
-ELoginŽI‚ªƒpƒXƒ[ƒhˆÃ†‰»‚ɑΉž
- ˆÃ†‰»key‚ÍŽI‹N“®Žž‚Ɉê“x‚¾‚¯ì¬‚µ‚Ü‚·B
-
- **’ˆÓ**
- ˆÃ†‰»ƒpƒXƒ[ƒh‚ðŽg‚Á‚Ä‚¢‚éꇂÍAƒAƒJƒEƒ“ƒg‚ð쬂ł«‚Ü‚¹‚ñB
- ƒAƒJƒEƒ“ƒg‚ðì‚éꇂÍclientinfo.xml‚ð•ÒW‚·‚é‚È‚Ç‚µ‚ÄA
- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚µ‚È‚¢ƒNƒ‰ƒCƒAƒ“ƒg‚ðŽg‚¤•K—v‚ª‚ ‚è‚Ü‚·B
-
- (login/)
- login2.c/login.h
- ˆÃ†‰»ƒpƒXƒ[ƒh‚̃pƒPƒbƒgˆ—’ljÁ
- ˆÃ†‰»key‚̶¬ˆ—’ljÁ
- md5calc.c/md5calc.h
- V‹K’ljÁBmd5ŒvŽZ—p
-
-
-EƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ÉDEX‚ª”½‰f‚³‚ê‚È‚¢‚悤‚ÉC³
- skill.c
- skill_delay_fix()‚ÌC³
-
-EŽ€–SŒã‚àˆê•”‚Ìó‘ÔˆÙí‚ÌŒø‰Ê‚ªŽ‘±‚·‚é–â‘è‚ðC³
- pc.c
- pc_damage()‚ÅŽ€–SŽž‚Épc_calcstatus()‚ðŒÄ‚Ԃ悤‚ÉC³
- atcommand.c
- Ž€–SŽžˆ—‚ðˆê–{‰»‚·‚邽‚ß@die‚Å‚Ípc_damage‚ðŒÄ‚Ԃ悤‚ÉC³
-
-
-----------
-//0295 by ŒÓ’±—–
-
-EƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv‚ȂǂɃXƒLƒ‹‚ðŽg‚¤‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚é–â‘è‚ÌC³
-
- battle.c
- battle_get_*()‚È‚Ç‚ÅBL_PC,BL_MOB‚¶‚á‚È‚¢‚Æ‚«‚̈—‚ð’ljÁ
- skill.c/skill.h
- skill_unit_ondamage()’ljÁ
-
-E–ñ21Mz‚ð’´‚¦‚éƒAƒCƒeƒ€‚ðNPC‚ňµ‚¤‚Æ‚«OC,DCŒvŽZ‚Å’l’i‚ª‚¨‚©‚µ‚­‚È‚éƒoƒOC³
- DC‚Å‚Í20MzAOC‚Å‚Í70Mz‚ð’´‚¦‚éƒAƒCƒeƒ€‚ÍdoubleŒ^‚É‚µ‚ÄŒvŽZ‚µ‚Ü‚·
-
- pc.c
- pc_modifysellvalue(),pc_modifysellvalue()‚ÌC³
-
-----------
-//0294 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ŃGƒŠƒAŽw’è‚ÌMOB•¦‚«–½—ß‚ðì¬
- areamonster "ƒ}ƒbƒv–¼",x0,y0,x1,y1,"MOB•\Ž¦–¼",MOB‚Ìclass,”,"ƒCƒxƒ“ƒg–¼"
- À•WŽw’肪(x0,y0)-(x1,y1)‚Ì”CˆÓƒ|ƒCƒ“ƒg‚ɂȂ邾‚¯‚Å‘¼‚Ímonster–½—ß‚Æ“¯‚¶‚Å‚·
-
- script.c
- buildin_areamonster()’ljÁ
- mob.c/mob.h
- mob_once_spawn_area()’ljÁ
-
-EƒAƒCƒXƒEƒH[ƒ‹‚ÌŽI‘¤ˆ—‰¼ŽÀ‘•
- UŒ‚‚Å‚«‚È‚¢‚È‚Ç‚Ì–â‘è‚Í‚ ‚é‚à‚Ì‚ÌAŽI‘¤‚Å‚Í‚Æ‚è‚ ‚¦‚¸“®‚«‚Ü‚·B
- ‚½‚¾AƒNƒ‰ƒCƒAƒ“ƒg‚Éi“ü•s‰Â”\ƒGƒŠƒA‚ð‹³‚¦‚éƒpƒPƒbƒg‚ª‚í‚©‚ç‚È‚¢‚Ì‚ÅA
- ŽI‘¤‚Å‚ÍIW‚̉ñ‚èž‚Ý‚ðs‚¤ê‡‚Å‚àAƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å‚Í‚·‚蔲‚¯‚Ä‚¢‚é
- ‚悤‚ÉŒ©‚¦‚Ü‚·B
-
- skill.c
- ŠY“–ˆ—’ljÁ‚È‚Ç
-
-----------
-//0293
-E2-2ŽŸE‚̃XƒLƒ‹ƒRƒƒ“ƒg‚ÌC³iˆê•”’ljÁj
- (db/)
- skill_db.txt
- skill_tree.txt
-
-
-----------
-//0292 by ŒÓ’±—–
-
-ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘è‚Ì‚Ü‚Æ‚à‚ÈHC³Part2
- E”„”ƒ‚Å‚«‚È‚©‚Á‚½–â‘èC³
-
- map.h
- struct map_session_data ‚Énpc_shopidƒƒ“ƒo’ljÁ
- npc.c
- npc_click()‚È‚ÇC³
-
-EƒXƒNƒŠƒvƒg–½—ߒljÁ
- EŽw’èƒGƒŠƒA‚̃†[ƒU[”‚ÌŠ“¾
- getareausers("ƒ}ƒbƒv–¼",x0,y0,x1,y1)
- Žw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚É‚¢‚éPC‚Ì”‚ðŒvŽZ
- EŽw’èƒGƒŠƒA‚̃†[ƒU[‚̃[ƒv
- areawarp "“]‘—Œ³ƒ}ƒbƒv–¼",x0,y0,x1,y1,"“]‘—æƒ}ƒbƒv–¼",x,y;
- Žw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚É‚¢‚é‘SPC‚ðŽw’èƒ}ƒbƒv‚Ì(x,y)‚É“]‘—B
-
- script.c
- buildin_areawarp(),buildin_getareausers()’ljÁ
-
-EƒXƒLƒ‹C³
- EƒeƒŒƒ|[ƒgŽg—pŽž‚ÉuƒeƒŒƒ|[ƒg!!v‚Æ‹©‚Ԃ悤‚ÉB
- EƒXƒg[ƒ“ƒJ[ƒX‚̬Œ÷—¦‚ª’á‚¢‚Ì‚ðC³
-
- skill.c
- skill_castend_nodamage_id()C³
-
-----------
-//0291 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg–½—ߒljÁ
- ENPC‚Ì—LŒø–³Œø‚ªØ‚è‘Ö‚¦‚ç‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- disablenpc "NPC–¼"‚Å–³Œø‰»Aenablenpc "NPC–¼"‚Å—LŒø‰»B
- NPC–¼‚ªd•¡‚µ‚Ä‚¢‚é‚Æ‚«‚Ì“®ì‚Í•s’è‚Å‚·B
- Žå‚Ƀ[ƒvƒ|ƒCƒ“ƒg‚𖳌ø‰»‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·B
-
- Eƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð•ÏX‚·‚éƒXƒNƒŠƒvƒg–½—ߒljÁ
- addtimercount "ƒCƒxƒ“ƒg–¼",ƒ~ƒŠ•b
- ‚ÅAƒ^ƒCƒ}‚ÌŠúŒÀ‚ð‰„‚Î‚¹‚Ü‚·i•‰’l‚ðŽw’肵‚ÄŒ¸‚ç‚·‚±‚Æ‚ào—ˆ‚Ü‚·j
-
- EƒAƒiƒEƒ“ƒX‚ÌŠg’£
- mapannounce "ƒ}ƒbƒv–¼","ƒAƒiƒEƒ“ƒX•¶Žš—ñ",ƒtƒ‰ƒO
- ‚ÅŽw’èƒ}ƒbƒv‚ɃAƒiƒEƒ“ƒX‚𗬂µ‚Ü‚·Bƒtƒ‰ƒO‚Í0‚ʼn©FA16‚Å‚ł·B
- areaannounce "ƒ}ƒbƒv",x0,y0,x1,y1,"•¶Žš—ñ",ƒtƒ‰ƒO
- ‚ÅŽw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚̃GƒŠƒA‚ɃAƒiƒEƒ“ƒX‚𗬂µ‚Ü‚·B
- ƒtƒ‰ƒO‚Ímapannounce‚Æ“¯‚¶‚ÅA0‚ʼn©FA0x10‚Å‚ł·B
-
- (conf/)
- npc_test_arena.txt
- ƒTƒ“ƒvƒ‹‚ÌC³
- (map/)
- script.c
- buildin_disablenpc(),buildin_enablenpc(),
- buildin_mapannounce(),buildin_areaannounce(),
- buildin_addtimercount()‚̒ljÁ
- npc.c/npc.h
- NPC‚Ì—LŒø–³Œøˆ—’ljÁ
- map.h
- struct npc_data‚Éflagƒƒ“ƒo’ljÁ(1ƒrƒbƒg–Ú‚ª–³Œøƒtƒ‰ƒO)
- clif.c
- clif_getareachar_npc()‚ÌC³
- pc.c/pc.h
- pc_addeventtimercount()’ljÁ
-
-ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘è‚Ì‚Ü‚Æ‚à‚ÈHC³
- SHOP NPC‚ÆŽæˆø’†‚Å‚àƒCƒxƒ“ƒg‚ª‹N‚±‚é‚悤‚É‚È‚è‚Ü‚·B
- ‚±‚ê‚ÍRO‚ÌŽd—lã”ð‚¯‚é‚Ì‚ª“‚¢‚½‚ß‚±‚̂悤‚ÈŒ‹‰Ê‚Å—Ž‚¿’…‚«‚Ü‚µ‚½B
-
- npc.c
- npc_click()“™‚ÌC³
-
-EƒXƒLƒbƒhƒgƒ‰ƒbƒv‚ÅŽc‘œ‚ªŽc‚é–â‘èC³
- skill.c
- skill_blown()‚Åclif_walkok()‚È‚Ç‚ðŒÄ‚Ԃ悤‚ÉB
- skill_unit_onplace()‚Ìclif_fix*pos()‚ðíœB
-
-----------
-//0290 by ŒÓ’±—–
-
-EƒXƒNƒŠƒvƒg‚ÅMAPŽI“à‹¤—L•Ï”‚ªŽg‚¦‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- •Ï”–¼‚ð$‚ÅŠJŽn‚·‚é‚ÆAMAPŽI“à‚Ì‘Sˆõ‚Å‹¤—L‚·‚é•Ï”‚É‚È‚è‚Ü‚·B
-
- Œ¾—t‚Ì–â‘è‚Å‚·‚ªAPC‚Ìglobalreg‚Íu‘åˆæ“Iv‚Æ‚¢‚¤‚æ‚èu‰i‘±«‚Ì‚ ‚év
- •Ï”‚Å‚ ‚Á‚ÄAMAPŽI“à‹¤—L•Ï”‚Ì‚Ù‚¤‚ª‘åˆæ“I‚Á‚ăCƒ[ƒW‚ª‹­‚¢‚ñ‚Å‚·‚ªc
-
- script.c
- mapval_db’è‹`
- buildin_set(),buildin_input()‚ÌC³
- do_init_script()’ljÁ
- map.c
- do_init()‚Ådo_init_script()‚ðŒÄ‚Ԃ悤‚ÉB
-
-EƒCƒxƒ“ƒgƒLƒ…[‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- EƒLƒ…[ƒTƒCƒY‚Í‚Q‚Å‚·B•K—v‚Ȃ瑂₵‚Ü‚·‚ªB
-
- ƒTƒ“ƒvƒ‹‚Ì[ev_doƒeƒXƒg]‚ª‚¿‚á‚ñ‚Æ“®‚­‚悤‚É‚È‚Á‚½‚ÆŽv‚¢‚Ü‚·B
-
- map.h
- struct map_session_data‚Éeventqueueƒƒ“ƒo’ljÁ
- npc.c
- npc_event_timer()’ljÁ
- script.c
- run_script()‚ÅENDˆ—‚ŃLƒ…[‚̈—’ljÁ
-
-EƒXƒNƒŠƒvƒg‚Ń^ƒCƒ}[‚ªŽg—p‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- Žg—p•û–@‚ÍAaddtimer ƒ~ƒŠ•b,"ƒCƒxƒ“ƒg–¼" ‚Ń^ƒCƒ}[’ljÁA
- deltimer "ƒCƒxƒ“ƒg–¼" ‚Ń^ƒCƒ}[íœB
-
- (common/)
- timer.c/timer.h
- get_timer(),addtick_timer()’ljÁ
- (map/)
- map.c/map.h
- struct map_session_data‚Éeventtimerƒƒ“ƒo’ljÁ
- map_quit()‚Åpc_cleareventtimer()‚ðŒÄ‚Ԃ悤‚ÉB
- pc.c
- pc_addeventtimer(),pc_deleventtimer(),pc_eventtimer(),
- pc_cleaereventtimer()’ljÁ
- pc_authok()‚Åeventimer‚̉Šú‰»
- script.c
- buildin_addtimer(),buildin_deltimer()’ljÁ
-
-EƒXƒNƒŠƒvƒg‚̒ljÁ
- Egetusers,getmapusers,killmonster‚̒ljÁ
- getusers(x)‚̓†[ƒU[”Š“¾Ax=0‚ÅPC‚ÌMAP,1=‘SMAP,8=NPC‚ÌMAPB
- getmapusers("ƒ}ƒbƒv–¼")‚ÍŽw’èƒ}ƒbƒv‚̃†[ƒU[”‚ðŠ“¾‚·‚éB
- killmonster "ƒ}ƒbƒv–¼","ƒCƒxƒ“ƒg–¼"‚ÅŠY“–‚̃}ƒbƒv‚É‚¢‚éA
- ŠY“–‚̃Cƒxƒ“ƒg‹ì“®Žw’胂ƒ“ƒXƒ^[‚ð‘S‚ÄíœB
- EannounceƒRƒ}ƒ“ƒhŠg’£
- ƒtƒ‰ƒO‚Ì0x08ƒrƒbƒg‚ª1‚È‚çƒ}ƒbƒv‚âƒGƒŠƒAŒvŽZ‚ÉPC‚Å‚È‚­NPC‚ðŽg‚¤
-
- mob.c/mob.h
- mob_delete()’ljÁ
- script.c
- buildin_getusers(),buildin_getmapusers(),
- buildin_killmonster()’ljÁ
- clif.c/clif.h
- clif_GMmessage()‚̈ø”•ÏX
-
-EƒCƒxƒ“ƒgƒTƒ“ƒvƒ‹’ljÁ
- ŠÈ’P‚ȃAƒŠ[ƒi‚̃Tƒ“ƒvƒ‹‚ð’ljÁB
-
- (conf/)
- npc_test_ev.txt
- ]—ˆ‚̃Tƒ“ƒvƒ‹‚ÌC³
- npc_test_arena.txt
- ŠÈ’P‚ȃAƒŠ[ƒi‚̃Tƒ“ƒvƒ‹
- ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì–³Œø‰»ƒRƒ}ƒ“ƒh‚È‚Ç‚ª•K—v‚ÆŽv‚í‚ê‚éB
-
-ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘èC³
-
- npc.c
- npc_buylist(),npc_selllist()C³
-
-----------
-//0289 by ŒÓ’±—–
-
-EƒCƒxƒ“ƒg‹ì“®Œ^ƒXƒNƒŠƒvƒg‚ÌC³‚È‚Ç
- E‘¼‚ÌNPC‚ɘb‚µŠ|‚¯‚Ä‚¢‚é‚Æ‚«‚̓Cƒxƒ“ƒg‚ª–³Ž‹‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- =>ƒLƒ…[‚É“ü‚ê‚é‚Ȃǂ̈—‚ª‚¢‚é‚ÆŽv‚í‚ê‚éB
-
- ‚±‚ÌŠÖŒW‚ÅAƒTƒ“ƒvƒ‹‚Ì[ev_doƒeƒXƒg]NPC‚ðƒNƒŠƒbƒN‚µ‚Ä‚à
- IDƒGƒ‰[‚ªo‚ĉ½‚à‹N‚«‚Ü‚¹‚ñBƒCƒxƒ“ƒgƒLƒ…[‚ðì‚ê‚Î’¼‚é‚Í‚¸B
-
- npc.c
- npc_event(),npc_click()‚Énpc_idƒ`ƒFƒbƒN‚ð’ljÁ
- script.c
- I—¹Žž‚Énpc_id‚ðƒNƒŠƒA‚·‚é‚悤‚É
-
-EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[announce]‚̒ljÁ
- EGMƒƒbƒZ[ƒW‚É‚æ‚éannounceB
- ‘æ1ˆø”‚Í•¶Žš—ñA‘æ2ˆø”‚̓tƒ‰ƒO‚ÅA
- ƒtƒ‰ƒO‚̉ºˆÊ‚Sƒrƒbƒg‚ª0=‘S‚ÄA1=“¯‚¶ƒ}ƒbƒvA
- 2=‰æ–Ê“àA3=Ž©•ª‚Ì‚ÝA4=“¯‚¶ƒ}ƒbƒvŽI‚É‘—MB
- ƒtƒ‰ƒO‚Ì‚Sƒrƒbƒg–Ú‚ÍFƒtƒ‰ƒO‚ÅA0x10=ÂA0x00=‰©F
-
- script.c
- buildin_announce()‚̒ljÁ
- clif.c
- clif_send()‚ÅSELF‚̈—’ljÁ
- clif_GMmessage()‚̈ø”•ÏX
- intif.c
- intif_GMmessage()‚̈ø”•ÏX
-
-Eƒƒ‚‹ÖŽ~AƒeƒŒƒ|‹ÖŽ~AƒZ[ƒu‹ÖŽ~ƒ}ƒbƒv‚ªŽw’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
- ENPC‚ÅAmapflag‚Æ‚¢‚¤ƒ^ƒCƒv‚ÅA–¼‘O‚ð nomemo A noteleport‚Å
- ƒƒ‚‚ƃeƒŒƒ|‹ÖŽ~Bnosave ‚ÅAˆø”‚ɃZ[ƒu‚·‚éƒ}ƒbƒv–¼‚ÆÀ•W‚ðŽw’èB
-
- Ú‚µ‚­‚Í“¯«‚Ìconf/npc_test_ev.txt‚ðŽQÆB
-
- (conf/)
- npc_test_ev.txt
- C³
- (map/)
- map.h
- struct map_data ‚Éflag,savemap,savex,saveyƒƒ“ƒo’ljÁ
- npc.c
- npc_parse_mapflag()’ljÁ
- do_init_npc()‚ÌC³
- pc.c
- pc_memo()‚Ńƒ‚‹ÖŽ~‚©‚Ç‚¤‚©‚ðŠm”F
- pc_makesavestatus()‚ŃZ[ƒu‹ÖŽ~‚È‚çƒ}ƒbƒv‚ð•ÏX
- pc_randomwarp()‚ŃeƒŒƒ|‹ÖŽ~‚©‚Ç‚¤‚©Šm”F
- skill.c
- ƒeƒŒƒ|‚ƃ|ƒ^‚ŃeƒŒƒ|‹ÖŽ~‚©Šm”F
-
-
-Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚Å—Ž‚¿‚é–â‘èC³c‚¾‚Æ‚¢‚¢‚È
-
- skill.c
- ‚³‚ç‚Ƀ`ƒFƒbƒN‚ð’ljÁ
- skill_blown()‚É—Ž‚¿‚錴ˆö‚Á‚Û‚¢‚à‚Ì”­Œ©‚µ‚½‚Ì‚ÅC³
-
-----------
-//0288 by ŒÓ’±—–
-
-EŽ©“®‘é”­“®Žž‚ÉuƒuƒŠƒbƒcƒr[ƒg!!v‚Æ‹©‚΂Ȃ­‚È‚è‚Ü‚µ‚½
- skill.c
- skill_attack(),skill_additional_effect(),
- skill_castend_damage_id()‚ÌC³
-
-EƒCƒxƒ“ƒg‹ì“®Œ^ƒXƒNƒŠƒvƒg‚ª‹Lq‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-Eƒ‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«‚ɃCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚ð“®‚©‚¹‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- NPC’è‹`‚Ìscript‚Å•\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒgˆµ‚¢‚É‚È‚è‚Ü‚·B
- NPC’è‹`‚Ìmonster‚ɃCƒxƒ“ƒg–¼‚ðÝ’è‚Å‚«‚Ü‚·B
- ƒXƒNƒŠƒvƒg‚ÌmonsterƒRƒ}ƒ“ƒh‚ɃCƒxƒ“ƒg‚ð‹N‚±‚·ˆø”’ljÁB
- Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚ðŒ©‚Ä‚­‚¾‚³‚¢B
- ¡Œãƒ^ƒCƒ}[‚ŃCƒxƒ“ƒg‚ð‹N‚±‚¹‚é‚悤‚É‚µ‚悤‚ÆŽv‚Á‚Ä‚¢‚Ü‚·B
-
- Œ»ó‚Å‚ÍANPCƒEƒBƒ“ƒhƒE‘€ì’†‚ɃCƒxƒ“ƒg‚ª‚¨‚«‚ÄA
- ‚»‚̃Cƒxƒ“ƒg‚̃XƒNƒŠƒvƒg‚ÅNPCƒEƒBƒ“ƒhƒE‚ðo‚·‚Æ–â‘肪‹N‚«‚Ü‚·B
- ‚±‚Ì•Ó‚Í¡Œã‚̉ۑè‚Æ‚¢‚¤‚±‚Æ‚ÅB
-
- (db/)
- item_db.txt/item_db2.txt
- monsterƒRƒ}ƒ“ƒh‚Ì•ÏX‚É‚æ‚éC³iŒÃ–Ø‚ÌŽ}jB
- (conf/)
- npc_test_ev.txt
- ƒTƒ“ƒvƒ‹
- (map/)
- npc.c
- npc_event()’ljÁ
- npc_parse_script()C³
- npc_checknear()C³
- clif.c
- clif_getareachar_npc()C³
- map.h
- struct mob_data‚Énpc_eventƒƒ“ƒo’ljÁ
- mob.c/mob.h
- mob_once_spawn()‚̈ø”•ÏX
- mob_damage()‚ÅŽ€–SŽž‚ɃCƒxƒ“ƒg‚ð‹N‚±‚·‚悤‚É
- atcommand.h
- mob_once_spawn()‚̈ø”•ÏX
- script.c
- buildin_monster()‚ÌC³
-
-----------
-//0287 by ŒÓ’±—–
-
-Eƒ‚ƒ“ƒXƒ^[î•ñƒXƒLƒ‹‚Å‚g‚o‚ª65535‚ð‰z‚¦‚Ä‚¢‚é‚Ƴí‚È’l‚ªŒ©‚ê‚È‚¢ƒoƒOC³
-
- clif.c
- clif_skill_estimation()‚ÌC³
-
-EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚ŃNƒ‰ƒCƒAƒ“ƒg‚ªƒŠƒ\[ƒXƒGƒ‰[‚ðo‚·–â‘肪C³‚³‚ê‚Ü‚µ‚½
-EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚Å¢Š«‚Å‚«‚é“G‚ªŽw’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- (db/)
- mob_branch.txt
- ¢Š«‰Â”\‚È“G‚̃ŠƒXƒg
- (map/)
- mob.c/mob.h
- struct mob_data‚Ésummonflagƒƒ“ƒo’ljÁB¢Š«‰Â”\«B
- mob_once_spawn()‚ÌC³
- mob_readbranch()‚̒ljÁ
- do_init_mob()‚Åmob_readbranch()‚ðŒÄ‚Ԃ悤‚ÉB
-
-EŒÃ‚­Â‚¢” AŒÃ‚¢Ž‡F‚Ì” ‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½B
- ˆê•”‚Ì–¢ŽÀ‘•ƒAƒCƒeƒ€‚ào‚Ü‚·Bitem_db.txt‚É‚ ‚éƒf[ƒ^‚ðŒŸõ‚µ‚Ä‚¢‚Ü‚·B
- ƒXƒNƒŠƒvƒggetitem‚Å•‰‚Ì’l‚ðŽw’è‚·‚é‚ÆA‚»‚Ìâ‘Î’l‚ðƒtƒ‰ƒO‚Æ‚µ‚Ä
- ƒ‰ƒ“ƒ_ƒ€‚ɃAƒCƒeƒ€‚ð‘I‘ð‚µ‚Ü‚·B
-
- (db/)
- item_db.txt/item_db2.txt
- ŠY“–•”•ª‚̃XƒNƒŠƒvƒgC³
- (map/)
- script.c
- buildin_getitem()‚ÌC³
- itemdb.c/itemdb.h
- itemdb_searchrandomid(),itemdb_searchrandomid_sub()’ljÁ
-
-E‰r¥ƒf[ƒ^‚̈ꕔC³
- (db/)
- cast_db.txt
- ‘¬“x㸂ȂǂÌC³
-
-ENPC‚ÌŒü‚«C³‚È‚Ç
- (conf/)
- npc_*.txt
-
-----------
-//0286 by ŒÓ’±—–
-
-Eƒ‚ƒ“ƒXƒ^[î•ñƒXƒLƒ‹‚ŃNƒ‰ƒCƒAƒ“ƒg‚ª—Ž‚¿‚éƒoƒOC³
- clif.c
- clif_skill_estimation()‚ÌC³
-
-E‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ª”½‰ž‚µ‚È‚¢‚±‚Æ‚ª‚ ‚é–â‘è‚ðC³
- skill.c
- skill_use_id(),‰r¥”½‰žŽžAÅ’á’ÇÕ‹——£‚ð13‚ÉÝ’è‚·‚é‚悤‚ÉB
-
-EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[warp]‚ŃZ[ƒuƒ|ƒCƒ“ƒgˆÚ“®‚⃉ƒ“ƒ_ƒ€ˆÚ“®‚ª‰Â”\‚É‚È‚è‚Ü‚µ‚½
-EƒnƒG‚̉HA’±‚̉HƒAƒCƒeƒ€‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- ƒXƒNƒŠƒvƒgwarp‚Ń}ƒbƒv–¼‚É"SavePoint"‚â"Random"‚ªŽw’è‚Å‚«‚Ü‚·B
-
- (db/)
- item_db.txt/item_db2.txt
- ƒnƒG‚̉HA’±‚̉H‚̃XƒNƒŠƒvƒgC³
- script.c
- buildin_warp()‚ÌC³
-
-E@monsterƒRƒ}ƒ“ƒh‚É‚æ‚éMOB‚ª•œŠˆ‚µ‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
-EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[monster]‚ÅMOB‚ð”­¶‚³‚¹‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
-
- ƒXƒNƒŠƒvƒgˆø”‚Í monster ƒ}ƒbƒv–¼,x,y,MOB–¼,MOB‚ÌID,” ‚Å‚·B
- ƒ}ƒbƒv–¼‚ª"this"‚Ìê‡AƒXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚Ì‚¢‚éƒ}ƒbƒvA
- x,y‚ª-1‚È‚çƒvƒŒƒCƒ„[‚ÌÀ•Wi‚Ç‚¿‚ç‚©ˆê•û‚Ì‚Ý‚»‚낦‚邱‚Æ‚à‰Â”\jA
- MOB–¼‚ª"--en--"‚Ìê‡A–{—ˆ‚̉pŒê–¼‚É‚È‚èA"--ja--"‚Ìê‡A
- –{—ˆ‚Ì“ú–{Œê–¼‚É‚È‚è‚Ü‚·BMOB‚ÌID‚ª-1‚Ìê‡A“K“–‚ÈID‚É‚È‚è‚Ü‚·B
-
- (db/)
- item_db.txt/item_db2.txt
- ŒÃ–Ø‚ÌŽ}‚̃XƒNƒŠƒvƒgC³
- (map/)
- mob.c/mob.h
- mob_once_spawn()’ljÁ
- mob_setdelayspwan()‚Å•œŠˆ‹ÖŽ~ˆ—’ljÁB
- npc.c/npc.h
- npc_get_new_npc_id()’ljÁ
- script.c
- buildin_monster()’ljÁ
- atcommand.c
- @monster‚ÌC³
-
-E@itemƒRƒ}ƒ“ƒh‚ÌC³i‘•”õ•i‚È‚Ç‚Ì–â‘èj
-
- atcommand.c
- @item‚ÌC³
-
-----------
-//0284 by ŒÓ’±—–
-
-EáŠQ•¨‚ª‚ ‚é‚Ɖ“‹——£UŒ‚‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
-E‘Î’nƒXƒLƒ‹‚ªáŠQ•¨ã‚ÉŽg—p‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
-
- path.c
- path_search(),can_move()‚ÌC³Acan_place()‚̒ljÁ
- battle.c/battle.h
- battle_check_range()’ljÁAŽË’ö‚ÆáŠQ•¨”»’èB
- battle_weapon_attack()‚Åbattle_check_range()‚ðŒÄ‚ÔB
- skill.c
- skill_use_id()Askill_use_pos()‚Åbattle_check_range()‚ðŒÄ‚ÔB
- mob.c
- mob_ai_sub_hard()‚̈—‚ðC³
-
-E‰r¥”½‰ž/ƒŠƒ“ƒNƒ‚ƒ“ƒXƒ^[‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- skill.c
- skill_use_id()‚ɉr¥”½‰žƒ‚ƒ“ƒX‚̈—’ljÁ
- mob.c
- mob_ai_sub_hard_linksearch()‚̒ljÁ
- mob_ai_sub_hard()‚ɃŠƒ“ƒNˆ—‚ðC³
-
-----------
-//0283 by ‚ê‚ 
-EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ÌC³
- 0282‚Ŷ‚«‚Ä‚é‚o‚b‚ɃŠƒU‚ª‚©‚¯‚ê‚é‚Ì‚ÉA
- Ž€‚ñ‚Å‚é‚o‚b‚ɂ̓ŠƒU‚ª‚©‚©‚ç‚È‚­‚È‚Á‚Ä
- ‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B
-
-----------
-//0282 by ŒÓ’±—–
-
-EƒXƒLƒ‹‚ÌC³‚ƒljÁŽÀ‘•
- EƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚̃GƒtƒFƒNƒg‚Ì–â‘èC³B
- EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ª¶‚«‚Ä‚¢‚éPC‚É‚ÍŠ|‚¯‚ç‚ê‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
- Eƒ^[ƒ“ƒAƒ“ƒfƒbƒh/UŒ‚ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ªBOSS‚É‚ÍŒø‚©‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
- Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚̃qƒbƒg”§ŒÀ‚ðŽÀ‘•
- EƒXƒg[ƒ€ƒKƒXƒg‚ÌŽÀ‘•
- ‚½‚¾‚µA–{ŽI‚ƈႢ“€Œ‹‚ÍŠm—¦‚Ì‚Ý‚ÅAÅ‘åƒqƒbƒg”‚È‚Ç‚ª•Ï‚Å‚·B
-
- skill.c
- skill_castend_nodamage_id()‚ÌC³
- ƒXƒg[ƒ€ƒKƒXƒg‚̈—’ljÁ
-
-EƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚ɈӒn‚É‚È‚Á‚ĈÀ‘S«ƒ`ƒFƒbƒN‚ð’ljÁB
- i—Ž‚¿‚È‚­‚È‚é“ú‚͉“‚¢HHj
-
- map.h
- MAX_SKILLUNITGROUP‚ð32‚É‘‚₵‚½
- skill.c
- skill_status_change_*()‚ÉNULLƒ`ƒFƒbƒN’ljÁ
- battle.c
- battle_calc_damage()‚ɶ‘¶ƒ`ƒFƒbƒN’ljÁ
- map.c
- map_freeblock_unlock()‚ɃƒbƒN”ƒ`ƒFƒbƒN‚ð’ljÁ
-
-E‚»‚Ì‘¼C³
- EPC‚ÌÅ‘åHP‚ª30000‚ɧŒÀ‚³‚ê‚Ü‚µ‚½B
- EPC‚̉ñ•œˆ—‚ªC³‚³‚ê‚Ü‚µ‚½
- E‚«”ò‚΂µˆ—‚ÌC³
- E0281‚Ìitem_db.txt‚Ì•ÏX‚ðitem_db2.txt‚É‚à“K—p
-
- (map/)
- pc.c
- pc_heal(),pc_calcstatus()‚ÌC³
- path.c
- path_blownpos()‚ÌC³
- (db/)
- item_db2.txt
- 0281‚Ì–¼‘OC³‚È‚Ç‚ð“K—p
-
-----------
-//0280 by ŒÓ’±—–
-
-EŠÇ—ŽÒ‚̃VƒXƒeƒ€‚ðì¬
- "conf/login_athena.cnf"‚Ìì¬AŠÇ—ŽÒƒpƒXAGMƒpƒX‚ÌÝ’èB
- ƒAƒJƒEƒ“ƒg‚ðì‚é‚Æ‚«A
- ƒ—á„ ID: hoge_M Pass: foobar@admin
- ‚̂悤‚ÉAƒpƒXƒ[ƒh‚ÌŒã‚ë‚Éu@ŠÇ—ŽÒƒpƒXv‚ª•K—v‚ÉB
- login_athena.cnf‚Ìadmin_pass‚Ì—“‚ðÁ‚¹‚ÎA¡‚܂ł̂悤‚É‚à‚‚©‚¦‚Ü‚·B
- i‚»‚Ìê‡Aadmin_pass‚ÌŒã‚낾‚¯‚Å‚È‚­As‚²‚ÆÁ‚µ‚Ä‚­‚¾‚³‚¢j
-
- (login/)
- login.h
- Ý’èƒtƒ@ƒCƒ‹‚̃fƒtƒHƒ‹ƒg–¼’ljÁ
- login2.c
- ƒAƒJƒEƒ“ƒg쬂̂Ƃ±‚ë‚ðC³
- Ý’èƒtƒ@ƒCƒ‹‚Ì“Ç‚Ýž‚ݒljÁ
-
-E@GMƒRƒ}ƒ“ƒh•œŠˆ
- ‚½‚¾‚µAu@gm GMƒpƒXv‚Æ‚µ‚ÄŽg‚¢‚Ü‚·B
- GMƒpƒX‚Ílogin_athena.cnf‚Ì‚à‚Ì‚Å‚·B
- ŽI‚ÌÄ‹N“®‚Ì•K—v‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA
- ƒNƒ‰ƒCƒAƒ“ƒg‚̓ŠƒƒO‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
-
- ƒ’ˆÓ„
- “¯‚¶ƒAƒJƒEƒ“ƒg‚Ì‘S‚ẴLƒƒƒ‰‚ÍPT‚©‚甲‚¯‚Ä’u‚¢‚Ä‚­‚¾‚³‚¢B
- ‚Ü‚½A‘qŒÉ‚̃AƒCƒeƒ€‚Í‘S•”ˆø‚«o‚µ‚Ä’u‚¢‚Ä‚­‚¾‚³‚¢B
- ‚»‚¤‚µ‚È‚¢‚ƃSƒ~ƒf[ƒ^‚ªŽc‚è‚Ü‚·B
-
- (login/)
- login2.c
- ƒAƒJƒEƒ“ƒgID•ÏXˆ—’ljÁ
- (char/)
- char2.c
- ƒAƒJƒEƒ“ƒgID•ÏXˆ—’ljÁ
- (map/)
- chrif.c/chrif.h
- chrif_changegm(),chrif_changedgm()’ljÁ
-
-E@pvpoffƒRƒ}ƒ“ƒh•œŠˆ
- clif.c/clif.h
- clif_pvpoff()’ljÁ
- atcommand.c
- @pvpoff‚̈—’ljÁ
-
-E‹ó‚Ì‘qŒÉƒf[ƒ^‚Í•Û‘¶‚³‚ê‚È‚¢‚悤‚É•ÏX
- (char/)
- int_storage.c
- inter_storage_save()Astorage_tostr()‚ðC³
-
-E@memoƒRƒ}ƒ“ƒh’ljÁB
- ”CˆÓ‚Ì‹L‰¯ˆæ‚Ƀƒ‚‚ðŽæ‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
-
- atcommand.c
- @memo‚̈—’ljÁ
-
-
-----------
-//0279 by ŒÓ’±—–
-
-EƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚Ì–â‘è‘Îô
- ‚Æ‚è‚ ‚¦‚¸‚Ђ½‚·‚çƒ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚µ‚½B
-
- skill.c
- skill_unit_timer_sub(),skill_unit_move_sub(),
- skill_delunit()‚Ƀ†ƒjƒbƒg‚̶‘¶”»’è‚ð’ljÁB
- skill_unitgrouptickset_search(),skill_unitgrouptickset_delete()
- skill_delunitgroup()‚ÉNULLƒ|ƒCƒ“ƒ^ƒ`ƒFƒbƒN‚ð’ljÁB
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
- ƒeƒŒƒ|[ƒgAƒ[ƒvƒ|[ƒ^ƒ‹‚ÌŽÀ‘•
- ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚ðMOB‚ÉŠ|‚¯‚é‚Æ—Ž‚¿‚éƒoƒOC³
-
- (db/)
- cast_db.txt
- ƒ[ƒvƒ|[ƒ^ƒ‹‚̉r¥ŽžŠÔÝ’è
- (map/)
- map.h
- struct skill_unit_group‚Ìvalstr‚ðƒ|ƒCƒ“ƒ^‚É•ÏX
- clif.c/clif.h
- clif_parse_UseSkillMap(),clif_skill_warppoint()A
- clif_parse_Memo(),clif_skill_memo()’ljÁ
- skill.c/skill.h
- skill_castend_map(),skill_unit_onlimit()‚̒ljÁ
- skill_unit_*Œn‚̈—‚¢‚ë‚¢‚ë’ljÁB
- skill_status_change_start()‚̃LƒŠƒG‚̈—C³
- pc.c/pc.h
- pc_randomwarp(),pc_memo()’ljÁ
-
-----------
-//0278 by nabe
-
-EƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðU‚Á‚½‚Æ‚«‚ɃXƒe[ƒ^ƒX‚ðXV
- pc.c
- pc_skillup()‚Åpc_calc_skilltree()‚Ì‘ã‚í‚è‚Épc_calcstatus()
-EŠŽ—Ê‘‰Á‚ðC³
- pc.c
- pc_calcstatus()‚ÌŠŽ—Ê‘‰Á‚É‚æ‚émax_weight‘•ª‚ðskill*1000‚É
-
-----------
-//0277 by nabe
-
-E•t‘®•iiƒJ[ƒgA‘éAƒyƒRj‚Ì•t‚¯ŠO‚µ‚ð‰ü—Ç
- (conf/)
- npc_event_rental.txt
- ‘éAƒyƒR‚ð•t‚¯‚éƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ð•ÏX
- (map/)
- battle.c
- battle_addmastery(),battle_calc_weapon_attack()‚Å
- ƒyƒRƒyƒR‹R掞‚Ì‘„UŒ‚—͕ⳂðŽÀ‘•
- clif.c
- clif_parse_CartOff‚ðclif_parse_RemoveOption‚É•ÏX
- pc.c/pc.h
- pc_calcstatus()‚ŃJ[ƒgAƒyƒRƒyƒRæ‚è‚É‚æ‚鑬“x•Ï‰»‚ðŒvŽZ
- pc_setoption(),pc_setcart()‰ü—Ç
- pc_setfalcon(),pc_setriding()’ljÁ
- pc.h‚Épc_isfalcon(),pc_isriding()ƒ}ƒNƒ’ljÁ
- script.c
- buildin_setfalcon() ‘é•t‰Á
- buildin_setriding() ƒyƒRƒyƒRæ‚è
-
-----------
-//0276 by nabe
-
-E¸˜BNPCŽÀ‘•
- (conf/)
- npc_town_refine.txt
- ¸˜BNPCƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹V‹K’ljÁ
- (map/)
- pc.c/pc.h
- ¸˜B¬Œ÷—¦‚Ì•\percentrefinery[5][10]‚ð’ljÁ
- script.c‚©‚çŒÄ‚΂ê‚éŠÖ”
- pc_percentrefinery() ¸˜B¬Œ÷—¦
- pc_equipitemindex() ‘•”õ•iƒCƒ“ƒfƒbƒNƒX
- ‚ð’ljÁ
- script.c
- buildin_getequipname() ‘•”õ–¼•¶Žš—ñi¸˜Bƒƒjƒ…[—pj
- buildin_getequipisequiped() ‘•”õƒ`ƒFƒbƒN
- buildin_getequipisenableref() ‘•”õ•i¸˜B‰Â”\ƒ`ƒFƒbƒN
- buildin_getequipisidentify() ‘•”õ•iŠÓ’èƒ`ƒFƒbƒN
- buildin_getequiprefinerycnt() ‘•”õ•i¸˜B“x
- buildin_getequipweaponlv() ‘•”õ•i•ŠíLV
- buildin_getequippercentrefinery() ‘•”õ•i¸˜B¬Œ÷—¦
- buildin_successrefitem() ¸˜B¬Œ÷
- buildin_failedrefitem() ¸˜BŽ¸”s
- ‚ð’ljÁ
-
-EƒXƒNƒŠƒvƒg‚ÉWeight,MaxWeightƒpƒ‰ƒ[ƒ^‚ð’ljÁ
- const.txt
- Weight,MaxWeight‚ð’ljÁ
-
-EƒXƒNƒŠƒvƒg‚ł̃Lƒƒƒ‰–¼•\Ž¦•ûŽ®‚ð•ÏX
- (conf/)
- npc_job_merchant.txt/npc_job_thief.txt/npc_town_kafra.txt
- mes "$charaname"; ‚ð mes strcharinfo(0); ‚É•ÏX
- (map/)
- script.c
- buildin_strcharinfo()‚ð’ljÁ
-
-----------
-//0275 by ŒÓ’±—–
-
-EMVP‚ÌŽÀ‘•
- MVP‚Ì”»’è‚É‚Ídmglog‚ðŽg‚Á‚Ä‚Ü‚·B‚·‚È‚í‚¿—^ƒ_ƒ‚¾‚¯‚ªŒvŽZ‘ÎÛ‚Å‚·B
- ”íƒ_ƒ‚Íl—¶‚³‚ê‚Ä‚Ü‚¹‚ñB
- ŒoŒ±’l‚Í–³ðŒ‚Å“ü‚èAŠm—¦‚Å‚³‚ç‚ɃAƒCƒeƒ€‚ª“ü‚è‚Ü‚·B
- ƒAƒCƒeƒ€‚Í•¡”Žè‚É“ü‚邱‚Æ‚à‚ ‚è‚Ü‚·B
-
- clif.c/clif.h
- clif_mvp_effect(),clif_mvp_item(),clif_mvp_exp()’ljÁ
- mob.c
- mob_damage()‚ÉMVPˆ—’ljÁ
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
- Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒNAƒAƒ[ƒVƒƒƒ[ŽÀ‘•
- E‚«”ò‚΂µŒnƒXƒLƒ‹‚ªˆê•”Žg—p‚³‚ê‚È‚¢ƒoƒOC³
- Eƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO‚̃_ƒ[ƒWŒvŽZŽ®C³
- E•ŠíUŒ‚Œn‘®«•t‚«ƒXƒLƒ‹‚Å‘®«‚ª”½‰f‚³‚ê‚È‚¢–â‘èC³
- Eꊎw’èƒXƒLƒ‹‚ªUŒ‚‚µ‚È‚ª‚ç‰r¥‚Å‚«‚½–â‘è‚ðC³
-
- battle.c
- battle_calc_weapon_attack()‚ÌŠY“–ŒÂŠC³•’ljÁ
- skill.c
- skill_castend_damage_id()‚Ɉ—’ljÁ
- skill_use_pos()‚ÉUŒ‚’âŽ~ˆ—’ljÁ
-
-EƒJ[ƒhƒXƒLƒ‹‚ªƒJ[ƒh‚ðŠO‚µ‚Ä‚àŽg—p‰Â”\‚È–â‘è‚ðC³
- pc.c
- pc_calc_skilltree()‚ðC³
-
-EƒAƒCƒeƒ€ƒhƒƒbƒv—¦AexpŠ“¾”{—¦‚È‚Ç‚Ì’²®‹@”\’ljÁ
- battle_athena.cnf‚Å’²®‚Å‚«‚逖ڂª‘‚¦‚Ü‚µ‚½B
- Ú‚µ‚­‚Í‚»‚¿‚ç‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-
- (conf/)
- battle_athena.cnf
- mvp_hp_rate,item_rate,exp_rate,mvp_item_rate,mvp_exp_rate’ljÁ
- (map/)
- battle.c/battle.h
- ‘‚¦‚½€–Ú‚ð“Ç‚Ýž‚ނ悤‚Ɉ—’ljÁ
- mob.c
- mob_db.txt“Ç‚Ýž‚ÝŽžAƒf[ƒ^‚ð’²®‚·‚鈗’ljÁ
-
-----------
-//0274 by ŒÓ’±—–
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•
- ƒXƒLƒbƒhƒgƒ‰ƒbƒvAƒ‰ƒ“ƒhƒ}ƒCƒ“Aƒuƒ‰ƒXƒgƒ}ƒCƒ“AƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA
- ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒvAƒTƒ“ƒhƒ}ƒ“AƒAƒ“ƒNƒ‹ƒXƒlƒA
-
- ‡–°‚â“€Œ‹‚È‚Ç‚ÌŠm—¦‚Í“K“–‚Å‚·B
- ã©”­“®Žž‚̃GƒtƒFƒNƒg‚ªo‚Ü‚¹‚ñB‚Ä‚¢‚¤‚©o‚µ•û‚ª‚í‚©‚è‚Ü‚¹‚ñB
- ‚í‚©‚él‚Í‹³‚¦‚Ä‚­‚¾‚³‚¢B‚à‚µ‚­‚Í–{ŽI‚Åã©”­“®Žž‚Ì•¡‡‰»Ï‚Ý‚Ì
- ¶ƒpƒPƒbƒgƒf[ƒ^‚Å‚à‚¢‚¢‚Ì‚Å‹³‚¦‚Ä‚­‚¾‚³‚¢B
-
- (db/)
- skill_db.txt
- ‘®«‚ÌC³
- (map/)
- skill.c
- ŠY“–ŒÂŠ
- battle.c/battle.h
- battle_calc_misc_damage()‚ÌŠY“–ŒÂŠ
- battle_stopwalking()’ljÁ
- clif.c/clif.h
- clif_fixpcpos()’ljÁ
- clif_parse_WalkToXY()‚ɃAƒ“ƒNƒ‹‚Å“®‚¯‚È‚­‚·‚鈗’ljÁ
- mob.c
- mob_ai_sub_hard()‚ɃAƒ“ƒNƒ‹‚Å“®‚¯‚È‚­‚·‚鈗’ljÁ
-
-E‘•”õ‚Ȃǂ̃NƒŠƒeƒBƒJƒ‹ƒ{[ƒiƒX‚ª1/10‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
- battle.c
- battle_calc_weapon_attack()‚ɒljÁ•ª‚ðŒvŽZ‚·‚鈗C³
-
-EƒuƒŠƒbƒcƒr[ƒg‚ÌŒvŽZŽ®‚ª‘S‘Rˆá‚¤ƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
- battle.c
- battle_calc_attack()‚ÌBF_MISC‚̈’u‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
-
-ESW‚ƃjƒ…[ƒ}‚ª•ŠíUŒ‚‚È‚ç‚Ç‚ñ‚ȃŒƒ“ƒW‚ÌUŒ‚‚Å‚à–h‚¢‚Å‚¢‚½–â‘è‚ðC³
- battle.c
- battle_calc_damage()‚̃Œƒ“ƒW”»’è‚ðC³
-
-EƒI[ƒo[ƒgƒ‰ƒXƒg‚ƃEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“‚ªPTƒƒ“ƒo‚É‚à‚©‚©‚é‚悤‚ÉC³B
- Œø‰Ê‚ÍŽg—pŽÒ‚ÆPTƒƒ“ƒo‚ňႢ‚Í‚ ‚è‚Ü‚¹‚ñB
-
- skill.c
- skill_castend_nodamage_id()‚ÌC³B
-
-----------
-//0273 by ŒÓ’±—–
-
-EƒLƒƒƒ‰ƒNƒ^[‚ªÁŽ¸‚µ‚½‚茶‰e‚ªo‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½
- E‚«”ò‚΂µƒXƒLƒ‹‚ðŽó‚¯‚é‚Æ”­¶‚µ‚Ä‚¢‚½
- EŽÎ‚߈ȊO‚Ì•às‚Å”­¶‚µ‚Ä‚¢‚½
-
- map.c
- map_foreachinmovearea()‚ÌC³B
- skill.c
- skill_blown()‚É•\Ž¦”͈ÍXVˆ—‚ð’ljÁB
- mob.c
- mob_walk()‚Å•à‚«I‚í‚Á‚½‚Æ‚«‚Ɉʒu‚ðÄ‘—M‚·‚é‚悤‚ÉC³
- pc.c
- pc_walk()‚Å•à‚«I‚í‚Á‚½‚Æ‚«‚Ɉʒu‚ðÄ‘—M‚·‚é‚悤‚ÉC³
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
- ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹Aƒtƒ@ƒCƒ„[ƒsƒ‰[‚ÌŽÀ‘•
- ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ł̃mƒbƒNƒoƒbƒN•ûŒü‚ðC³
-
- (db/)
- skill_db.txt
- ƒtƒ@ƒCƒ„[ƒsƒ‰[AƒuƒŠƒbƒcƒr[ƒg‚̃qƒbƒg”C³
- (map/)
- skill.c
- skill_blown()‚É‘ÎÛ‚ÌŒü‚«‚É‚æ‚éƒmƒbƒNƒoƒbƒNˆ—’ljÁ
- ‚»‚Ì‘¼•K—v‚ÈêŠC³
- mob.c
- mob_walk(),mob_attack()‚ÅŒü‚«‚ð•Û‘¶
- pc.c
- pc_walk(),pc_attck()‚ÅŒü‚«‚ð•Û‘¶
- map.c
- map_calc_dir()’ljÁB‘Š‘ΓI‚È•ûŒü‚ð‹‚ß‚é
-
-
-EƒNƒŠƒeƒBƒJƒ‹‘‰Á‘•”õ‚ªí“¬Žž‚ÉŒvŽZ‚³‚ê‚Ä‚È‚¢ƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
- battle.c
- battle_calc_weapon_attack()‚ɒljÁ•ª‚ðŒvŽZ‚·‚鈗’ljÁ
-
-
-E–hŒäƒ†ƒjƒbƒgiSW/ƒjƒ…[ƒ}j‚ª“G‚ɉe‹¿‚ð‹y‚Ú‚·‚©‚Ç‚¤‚©‚ð
- battle_athena.cnf‚ŧŒä‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- ƒfƒtƒHƒ‹ƒg‚Íu‹y‚Ú‚³‚È‚¢v‚Å‚·B
-
- (conf/)
- battle_athena.cnf
- €–Údefunit_not_enemy‚ð’ljÁ
- (map/)
- battle.c/battle.h
- struct Battle_Config ‚É defnotenemyƒƒ“ƒo’ljÁB
- battle_read_config()‚̈—‚ðC³B
- skill.c
- skill_unitsetting()‚ÅSW/ƒjƒ…[ƒ}‚̈—‚ðC³
-
-EƒtƒFƒ“ƒJ[ƒh‘•”õŽžAŽ€‚ñ‚Å‚à‰r¥‚ª‘±‚­ƒoƒO‚ðC³
- i‰r¥I—¹‘O‚É•œŠˆ‚·‚ê‚Ζ‚–@‚ª”­“®‚·‚é–â‘è‚àC³‚É‚È‚è‚Ü‚·j
-
- pc.c
- pc_damage()‚ÅŽ€–SŽžskill_castcancel()‚ðŒÄ‚Ԃ悤‚ÉC³
-
-E“G–¡•û”»’舗‚ɃoƒO‚ª‚ ‚Á‚½‚Ì‚ðC³
- battle.c
- battle_check_target()‚ÌC³
-
-----------
-//0272 by ŒÓ’±—–
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
- EƒZƒCƒtƒeƒBƒEƒH[ƒ‹Aƒjƒ…[ƒ}‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½B
- Eƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“”­“®’†‚ÉŒø‰Ê”͈͊O‚©‚ç”͈͓à‚É“ü‚Á‚Ä‚«‚½‚Æ‚«A
- “G–¡•û‚Ì‹æ•Ê–³‚­UŒ‚‚ª“–‚½‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½B
- EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ÌŽË’ö‚ªC³‚³‚ê‚Ü‚µ‚½B
- E”͈͖‚–@‚Å“|‚µ‚½“G‚ªHP0‚ÅŽc‚éꇂª‚ ‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½B
-
- (db/)
- skill_db.txt
- ƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ÌŽË’ö‚ð8‚É•ÏX
- (map/)
- skill.c
- skill_unit_onplace(),~ondelete(),~onout()‚È‚Ç‚ÉA
- ƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚̈—’ljÁB
- skill_unit_move()‚Ƀ^[ƒQƒbƒg‚Ì“G–¡•û”»’è‚ð’ljÁB
- skill_unit_timer_onplace(),~ondelete()‚Ƀ†ƒjƒbƒg¶‘¶”»’è‚ð’ljÁ.
- skill_clear_unitgroup()’ljÁBƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ì‘Síœ‚ð‚·‚éB
- battle.c
- battle_calc_damage()‚ɃZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚̈—’ljÁB
- map_foreachinarea()‚È‚ÇC³
- map.c
- map_quit()‚Åskill_clear_unitgroup()‚ðŒÄ‚Ԃ悤‚ÉB
-
-EƒXƒLƒ‹‚Ì‚«”ò‚΂µˆ—‚ðŽÀ‘•
- ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[AƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒXƒsƒAƒXƒ^ƒuA
- ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…Aƒ`ƒƒ[ƒWƒAƒ[‚Ì‚«”ò‚΂µˆ—ŽÀ‘•
-
- path.c/map.h
- path_blownpos()’ljÁ
- battle.c/battle.h
- struct Damage‚Éblewcountƒƒ“ƒo’ljÁ
- battle_calc_*_damage()‚Åblewcount‚ðƒZƒbƒg‚·‚é‚悤‚ÉB
- skill.c/skill.h
- skill_blown()’ljÁB‚«”ò‚΂µˆ—B
- skill_attack()‚Åskill_blown()‚ðŒÄ‚Ԃ悤‚ÉB
- skill_attack()‚Ìflag‚Ì‚«”ò‚΂µƒrƒbƒg‚Í–¢Žg—p‚ÉB
-
-E•às’†‚̃‚ƒ“ƒXƒ^[‚ÉUŒ‚‚µ‚½‚Æ‚«Aƒ‚ƒ“ƒXƒ^[‚ɃfƒBƒŒƒC‚ª“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- iUŒ‚‚̃‚[ƒVƒ‡ƒ“‚Ì’x‰„‚ðl‚¦‚Ä‚È‚¢‚Ì‚Å‚ ‚ñ‚Ü‚èˆÓ–¡‚ª‚È‚¢‚©‚àHj
-
- (map/)
- mob.c/mob.h
- state‚ÉMS_DELAY‚ð’ljÁB
- mob_damage(),mob_timer()‚È‚Ç‚ÌC³
-
-E•às’†‚̃‚ƒ“ƒXƒ^[‚ÉUŒ‚‚µ‚½‚Æ‚«AˆÊ’u‚ª‚¸‚ê‚é–â‘è‚̉ž‹}ˆ’u
- i‚Ü‚¾ˆÊ’u‚Í‚¸‚ê‚é‚悤‚Å‚·j
-
- clif.c/clif.h
- clif_fixmobpos()‚ð’ljÁ
- mob.c
- mob_attack()‚Åclif_fixmobpos()‚ðŒÄ‚Ԃ悤‚ÉB
-
-E‚»‚Ì‘¼C³
- pc.c
- pc_stop_walking()‚Åpath_len‚ð‰Šú‰»‚·‚é‚悤‚ÉB
-
-----------
-//0271 by ‚ê‚ 
-
-EPT‚ÉŠÖ‚µ‚Ä­‚µ‚¾‚¯C³
- Œö•½‚É‚µ‚Ä‚©‚çƒLƒƒƒ‰‚ð‰Á“ü‚³‚¹‚é‚ÆŒö•½‚ª‰ðœ‚³‚ê‚È‚¢ƒoƒO‚ðC³
-
-----------
-//0270 by ŒÓ’±—–
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
- ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“AƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€
-
- (db/)
- skill_db.txt
- ƒ}ƒOƒkƒX‚̃qƒbƒg”A‘®«’²®
- ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚Ì‘®«’²®
- (map/)
- map.h
- struct map_session_data‚ÌC³
- clif.c/clif.h
- clif_skill_setunit(),clif_skill_delunit()A
- clif_getareachar_skillunit(),clif_clearchar_skillunit()’ljÁ
- clif_pcoutsight(),clif_pcinsight(),clif_getareachar()C³
- skill.c/skill.h
- –Y‚ê‚é‚Ù‚Ç‘½”•ÏXBŽå‚ɃXƒLƒ‹ƒ†ƒjƒbƒgŠÖ˜A•”•ªB
- pc.c
- pc_authok()‚Åskillunit,skillunittick‚ð‰Šú‰»‚·‚é‚悤‚ÉB
- pc_walk()‚Åskill_unit_move()‚ðŒÄ‚Ԃ悤‚ÉB
- mob.c
- mob_spwan()‚Åskillunittick‚ð‰Šú‰»‚·‚é‚悤‚ÉB
- mob_walk()‚Åskill_unit_move()‚ðŒÄ‚Ԃ悤‚ÉB
- battle.c/battle.h
- battle_calc_magic_attack()C³
- battle_check_target()C³
- map.c
- map_foreachobject()‚È‚ÇC³
-
-E‚±‚Ü‚©‚¢ƒoƒOC³‚È‚Ç
- Emob‚ª‰ñ•œ‚µ‚È‚¢–â‘èC³
-
- battle.c
- battle_damage()C³
-
-----------
-//0266 by ŒÓ’±—–
-
-E–‚–@ŒvŽZŽ®‚ÌC³
- –‚–@”{—¦‚ðƒ_ƒ[ƒW‚ÉŠ|‚¯‚Ä‚¢‚½‚Ì‚ðMATK‚É‚©‚¯‚é‚悤‚É‚µ‚Ü‚µ‚½B
- c‚±‚Á‚¿‚ª³‚µ‚¢‚Æ‚µ‚Ä‚¢‚¢‚Ì‚©‚ÈHˆá‚¤‚Ȃ狳‚¦‚Ä‚­‚¾‚³‚¢B
-
- battle.c
- battle_calc_magic_attack()‚ÌC³
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•
- ƒTƒCƒgAƒ‹ƒAƒtAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“
-
- ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“‚Í‚R‰ñ‚Ì”»’莞‚ɉr¥‰¹‚ª–‚è‚Ü‚·cB
- clif_skill_damage()‚Ìtype‚ðFX•Ï‚¦‚Ä‚Ý‚Ü‚µ‚½‚ª‚Ç‚¤‚à‚¤‚Ü‚­‚¢‚«‚Ü‚¹‚ñB
- ’¼‚¹‚él‚Í’¼‚µ‚Ä‚­‚ê‚é‚Æ‚¤‚ꂵ‚¢‚Å‚·B
- i‚¤[‚ñA‚Ђå‚Á‚Æ‚µ‚½‚ç–{—ˆ‚̓Oƒ‰ƒtƒBƒbƒN‚Ì‚È‚¢ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ð
- Ý’u‚µ‚ÄA‚»‚̃†ƒjƒbƒg‚ÌID‚Ń_ƒ[ƒW‚ð—^‚¦‚é‚Ì‚©‚àHHj
-
- (db/)
- skill_db.txt
- ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“‚̃qƒbƒg”‚ð‚R‚©‚ç10‚É•ÏXB
- (map/)
- skill.c
- skill_status_change_timer_sub()’ljÁB
- skill_status_change_*()‚Ɉ—’ljÁB
-
-Eblock‚̃ƒ‚ƒŠ‰ð•ú‚̈À‘S«‚ÌŒüã
- map_foreachinarea,party_foreachsamemap‚ʼnñ‚Á‚Ä‚¢‚é‚Æ‚«‚É
- block‚ðƒ`ƒFƒCƒ“‚©‚ç휂·‚é‚ÆA‚¤‚Ü‚­‰ñ‚ç‚È‚¢‰Â”\«‚ª‚ ‚é–â‘èC³B
- ‚³‚ç‚ÉAblock‚ðƒƒ‚ƒŠ‚©‚ç‰ð•ú‚·‚é‚Ɗ댯‚È–â‘è‚àC³B
-
- Eforeach“à‚ÅŠÖ”‚ðŒÄ‚Ô‘O‚Éblock‚ªƒ`ƒFƒCƒ“‚©‚çŠO‚ê‚Ä‚È‚¢‚©ƒ`ƒFƒbƒNB
- Eforeach‚É“ü‚Á‚½‚Æ‚«‚ɃƒbƒN‚µ‚ăƒ‚ƒŠ‚©‚ç‰ð•ú‚³‚ê‚È‚¢‚悤‚É‚·‚éB
- ‚±‚ê‚̓†[ƒU[‚ªfree‚¶‚á‚È‚­map_freeblock‚É‚æ‚Á‚ĉð•ú‚·‚é‚悤‚É
- ƒvƒƒOƒ‰ƒ€‚·‚é•K—v‚ª‚ ‚éBiƒ‹[ƒv‚©‚çŒÄ‚΂ê‚é‰Â”\«‚Ì‚ ‚éŠÖ”‚ðì‚é
- ꇂ̂±‚Æ‚ÅA•’Ê‚Ífree‚Å‚à‚¢‚¿‚¨‚¤“®‚­Bj
- Emap_foreachinmovearea‚ɂ‚¢‚Ă͉ü—Ç‚µ‚Ä‚¢‚È‚¢‚ªA
- ‚±‚̃‹[ƒv‚Åblock‚ð휂·‚邱‚Æ‚Í‚ ‚肦‚È‚¢‹C‚ª‚·‚é‚Ì‚Å‚¢‚¢‚Æ‚·‚éB
-
- ‚±‚ê‚Í¡Œã‚ðŒ©‰z‚µ‚½‰ü—Ç‚Å‚ ‚Á‚ÄAŒ»Ý‚Ì•sˆÀ’肳‚𒼂·‚à‚Ì‚Å‚Í‚È‚¢B
- iŒ»Ý‚Íforeach“à‚Ńƒ‚ƒŠ‚ð‰ð•ú‚µ‚Ä‚¢‚È‚¢c‚Í‚¸‚È‚Ì‚ÅB
- ‚½‚¾AƒXƒLƒ‹ƒ†ƒjƒbƒg‚ȂLjꎞƒIƒuƒWƒFƒNƒg‚𑽗p‚µŽn‚ß‚é‚ÆŒø‰Ê‚ª‚ ‚éj
-
- map.c
- map_freeblock(),map_freeblock_lock(),~_unlock()’ljÁB
- map_delobject()‚Ìfree()‚ðmap_freeblock()‚É’uŠ·B
- map_foreachinarea‚ŃƒbƒN‚ƈÀ‘S«ƒ`ƒFƒbƒNB
- party.c
- party_foreachsamemap()‚ŃƒbƒN‚ƈÀ‘S«ƒ`ƒFƒbƒN
-
-
-EƒXƒLƒ‹ƒ†ƒjƒbƒg‹@\ŽÀ‘•
- Ý’uŒn‚̃XƒLƒ‹‚Ì‚½‚ß‚Ì‹@\ŽÀ‘•BŽÀۂ̃XƒLƒ‹‚ÌŽÀ‘•‚Í‚Ü‚¾‚Å‚·B
-
- skill.c
- ‚È‚ñ‚©‚à‚¤FX’ljÁ‚µ‚Ü‚µ‚½B
- map.c
- do_init()‚Ådo_skill_init()‚ðŒÄ‚Ԃ悤‚ÉB
- map.h
- struct skill_unit,skill_unit_group‚ȂǒljÁB
- map_session_data‚Ì‘‚«Š·‚¦‚È‚ÇB
-
-E‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ë‚ðC³‚µ‚½‚ÆŽv‚¤‚¯‚Ç–Y‚ê‚Ü‚µ‚½B
-
-----------
-//0264 by nabe
-
-E$charaname‚ð’‚éNPC‚Ƙb‚µ‚½ŽžAmapŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚éƒoƒO‚ðC³‚µ‚Ü‚µ‚½B
- script.c
- replacestr()‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðŽè’¼‚µ‚µ‚Ü‚µ‚½B
-
-----------
-//0263 by nabe
-
-E˜I“XŠJÝ’†‚ɃJ[ƒgƒAƒCƒeƒ€‚ðo‚µ“ü‚ê‚Å‚«‚È‚¢‚悤C³
- pc.c
- pc_putitemtocart(),pc_getitemfromcart()‚ÉA˜I“X”»’è‚ð’ljÁ
-
-E˜I“XƒAƒCƒeƒ€w“ü‚̃`ƒFƒbƒN‚ð’ljÁ
- vending.c
- vending_purchasereq()‚Å”X‚ÌðŒ”»’è‚ð’ljÁ
-
-----------
-//0261 by ŒÓ’±—–
-
-EŠg‘勾AƒCƒOƒhƒ‰ƒVƒ‹‚Ì—t‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- ƒXƒNƒŠƒvƒg‚ÉitemskillƒRƒ}ƒ“ƒhì¬BˆêŽž“I‚ɃXƒLƒ‹‚ªŽg—p‚Å‚«‚Ü‚·B
-
- (map/)
- script.c
- buildin_itemskill()‚̒ljÁ‚È‚ÇB
- skill.c
- ƒAƒCƒeƒ€ƒXƒLƒ‹‚È‚çSP‚È‚Ç‚ðŒŸ¸•Á”‚È‚¢‚悤‚ÉC³
- clif.c/clif.h
- clif_item_skill()‚̒ljÁB
- (db/)
- item_db.txt/item_db2.txt
- ƒXƒLƒ‹Žg—pƒAƒCƒeƒ€‚̃XƒNƒŠƒvƒgC³
-
-Eƒp[ƒeƒBƒXƒLƒ‹‚ÌŽÀ‘•
- ƒAƒ“ƒ[ƒ‹ƒXAƒ}ƒOƒjƒtƒBƒJ[ƒgAƒOƒƒŠƒAAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ª
- ‰æ–Ê“à‚̃p[ƒeƒB‘Sˆõ‚ÉŒø‰Ê‚ð‹y‚Ú‚·‚悤‚É‚È‚è‚Ü‚µ‚½B
-
- skill.c
- skill_castend_nodamage_id()‚ÌŠY“–ŒÂŠ‚ÌC³
- party.c
- party_foreachsamemap()‚ÌC³
-
-EƒXƒLƒ‹ŠÖŒW‚ÌC³
- ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚ª‘¦Žž”­“®‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ðC³B
- ƒXƒg[ƒ“ƒJ[ƒX‚ŃGƒtƒFƒNƒg‚ª‘¶Ý‚µ‚È‚¢ƒoƒOC³B
-
- (db/)
- skill_db.txt
- ƒLƒŠƒGƒGƒŒƒCƒ\ƒCƒ“C³
- (map/)
- skill.c/skill.h
- skill_check_condition()’ljÁBƒXƒLƒ‹Žg—pðŒŒŸ¸‚̈ê–{‰»B
- skill_castend_nodamage_id()‚ŃXƒg[ƒ“ƒJ[ƒXC³
-
-EƒXƒNƒŠƒvƒg‚̃R[ƒh‚ð®—
- get_val()‚Åconst.txt‚Ì’è”‚ðŠ“¾‚Å‚«‚é‚悤‚ÉC³B
-
- (map/)
- script.c
- get_val()‚ÌC³iconst.txt‚Ìtype==0‚Ì’l‚ªŠ“¾‰Â”\‚Éj
- bonus(),bonus2()‚È‚Ç‚ÌC³B
- (db/)
- const.txt
- type=1‚Å‚ ‚é•K—v‚ª–³‚¢‚à‚Ì‚ð0‚ÉB
- item_db.txt/item_db.txt
- const.txt‚Ì•ÏX‚É”º‚¤C³B
-
-----------
-//0260 by ŒÓ’±—–
-
-E퓬ŠÖŒW‚Ìݒ肪ƒtƒ@ƒCƒ‹‚É‘‚¯‚é‚É‚È‚è‚Ü‚µ‚½
- mapŽI‚Ì‘æ2ˆø”‚Ƀtƒ@ƒCƒ‹–¼‚ªÝ’肳‚ê‚Ä‚¢‚é‚ÆA‚»‚ê‚ðŽg‚¢A
- ݒ肳‚ê‚Ä‚È‚¢ê‡‚Í "conf/battle_athena.cnf"‚ðŽg‚¢‚Ü‚·B
-
- ‚ ‚ÆAˆê‰ž”͈ÍUŒ‚ƒXƒLƒ‹‚ɂ‚¢‚Äà–¾B
- ŽI‚ªí‚ÉPVP‚Éݒ肳‚ê‚Ä‚¢‚éê‡Aƒp[ƒeƒBƒƒ“ƒo‚¶‚á‚È‚¢PC‚É‚à”͈ÍUŒ‚‚ª
- ‚ ‚½‚è‚Ü‚·BŒ™‚Èꇂ̓p[ƒeƒB‚ð‘g‚Þ‚©Aí‚ÉPVP‚ðoff‚É‚µ‚ĉº‚³‚¢B
- í‚ÉPVP‚ªoff‚Å‚àA@pvp‚Åpvpƒtƒ‰ƒO‚ð“ü‚ꂽl‚ÌŠÔ‚Å‚ÍUŒ‚‚ª“–‚½‚è‚Ü‚·B
- ‚½‚¾‚µAˆê“xpvp‚ðon‚É‚·‚é‚ÆAƒŠƒƒO‚·‚é‚Ü‚Åon‚Ì‚Ü‚Ü‚È‚Ì‚Å’ˆÓB
-
- (conf/)
- battle_athena.cnf
- ’†‚Éà–¾‘‚¢‚Ä‚é‚Ì‚ÅŠeŽ©D‚«‚Ȃ悤‚É‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
-
- (map/)
- battle.c/battle.h
- struct Battle_Config‚Ì’è‹`B
- battle_config_read()‚ȂǒljÁB
- skill.c
- CASTFIX,DELAYFIX‚Ì”pŽ~‚ÆBattle_Config‚É‚æ‚éC³‚̒ljÁB
- atcommand.c
- @pvpƒRƒ}ƒ“ƒh‚Åpvpƒtƒ‰ƒO‚ðƒZƒbƒg‚·‚é‚悤‚ÉB
- iŽIÝ’è‚Ìí‚ÉPVP‚ªoff‚ÌŽžA—¼l‚ªpvp‚ðon‚É‚µ‚Ä‚½‚ç퓬‰Â”\j
- map.c/map.h
- struct map_session_data‚Épvp_flag‚ð’ljÁ
- do_init()‚Åbattle_config_read()‚ð“ǂނ悤‚ÉB
-
-E퓬ŠÖŒW‚̃R[ƒh‚ª­‚µ®—‚³‚ê‚Ü‚µ‚½
- battle.c/battle.h
- battle_weapon_attack()’ljÁB
- battle_calc_weapon_attack()‚̈ø”•ÏX
- battle_calc_attack()‚ð’ljÁ‚µ‚Äbattle_calc_*_attack()‚ðˆê–{‰»B
- skill.c/skill.h
- skill_weapon_attack(),~_magic_~(),~_misc_~()‚Ì”pŽ~A
- skill_attack()‚Ɉê–{‰»B
- pc.c/mob.c
- UŒ‚ˆ—‚ðbattle_weapon_attack()‚Ɉê–{‰»B
-
-EƒAƒCƒeƒ€ŠÓ’èƒXƒLƒ‹‚ðŽÀ‘•
- ¤l‚̃XƒLƒ‹‚Ì•û‚Å‚·B’ŽŠá‹¾‚Í‚Ü‚¾‚Å‚·B
-
- skill.c
- ƒXƒLƒ‹ˆ—’ljÁ
- pc.c/pc.h
- pc_item_identify()’ljÁ
- clif.c/clif.h
- clif_item_identify_list(),clif_item_identified()’ljÁ
- clif_parse_ItemIdentify()’ljÁ
-
-EƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚̃Rƒƒ“ƒgC³
- (db/)
- skill_db.txt
- ¤l‚̃XƒLƒ‹‚̃Rƒƒ“ƒg‚ª‚¸‚ê‚Ä‚¢‚½‚Ì‚ðC³
-
-----------
-//0259 by ‚ê‚ 
-Emob_db.txt‚ÌC³
- ‹T“‡ƒ‚ƒ“ƒXƒ^[‚âBOSS‚̃Xƒe[ƒ^ƒX’²®
- ‹T“‡ƒ‚ƒ“ƒX‚É“K“–‚Ƀhƒƒbƒv‚ð•t‚¯‚Ü‚µ‚½B
- –{ŽI‚ƈقȂ镨‚ð—Ž‚Æ‚·ê‡‚à‚ ‚è‚Ü‚·B
-
-----------
-//0258 by ŒÓ’±—–
-
-Eƒp[ƒeƒB‚ňê“xŒö•½‚É‚µ‚½‚çŠeŽ©Š“¾‚É–ß‚¹‚È‚¢ƒoƒOC³
- (char/)
- int_party.c
- mapif_parse_PartyChangeOption()‚Ì”»’èC³
-
-EƒXƒLƒ‹‚̒ljÁŽÀ‘•iŽå‚ɔ͈ÍUŒ‚Œnj
- ƒiƒp[ƒ€ƒr[ƒgi•ªŽU‘ΉžjAƒtƒ@ƒCƒ„[ƒ{[ƒ‹A
- ƒTƒ“ƒ_[ƒXƒg[ƒ€Aƒwƒuƒ“ƒYƒhƒ‰ƒCƒuA
- ƒuƒŠƒbƒcƒr[ƒgiŽ©“®‘éž‚ÝjAƒXƒ`[ƒ‹ƒNƒƒE
- ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO
-
- (db/)
- skill_db.txt/skill_tree.txt
- ˆê•”C³
- (map/)
- battle.c/battle.h
- battle_check_target()‚ð’ljÁB‘ÎÛ‚É‚È‚é‚©‚ðŒŸ“¢‚·‚éB
- battle_calc_magic_damage()‚̈ø”•ÏXBƒ_ƒ[ƒW•ªŽUˆ—’ljÁB
- battle_calc_misc_damage()’ljÁB
- battle_calc_weapon_damage()C³B
- clif.c/clif.h
- clif_skill_damage(),clif_skill_damage2()‚̈ø”•ÏXB
- clif_skill_poseffect()’ljÁB
- skill.c/skill.h
- skill_weapon_attack(),skill_magic_attack()‚É”÷–­‚Ɉ—‚ð“Z‚ß‚½.
- skill_area_sub()’ljÁB”͈̓XƒLƒ‹—pB
- skill_area_sub_count()’ljÁBskill_area_sub()—pA“GƒJƒEƒ“ƒgB
- skill_castend_damage_id()C³Bˆø”‚ƈ—‚ð’ljÁB
- skill_castend_nodamage_id()C³Bˆø”‚ƈ—‚ð’ljÁB
- skill_misc_attack()’ljÁB
- skill_additional_effect()C³iŽ©“®‘éj
- skill_castend_pos()C³B
- skill_castend_pos2()’ljÁB
-
-E‹|‚ÅUŒ‚‚µ‚½‚Æ‚«ŒvŽZ‚ÉDEX‚Å‚È‚­STR‚ªŽg‚í‚ê‚é–â‘è‚ðC³B
- battle.c
- battle_calc_weapon_damage()C³B
-
-----------
-//0257 by ŒÓ’±—–
-
-Eitem_db.txt‚ÌE‹Æƒtƒ‰ƒO‚ÆAƒJ[ƒh‚Ì‘•”õŒÂŠƒtƒ‰ƒO‚ðC³
- ‘•”õ•i‚ÍI-Athena‚̃f[ƒ^‚ðŽQl‚É‚µ‚Ä‹@ŠB“I‚ɃRƒ“ƒo[ƒg‚³‚¹‚Ü‚µ‚½B
- I-Athena‘¤‚É‚È‚¢‘•”õ•i‚ÍA‚ ‚«‚ç‚©‚É•Ï‚È‚Ì‚ÍC³‚µ‚Ü‚µ‚½‚ªA
- ’m‚ç‚È‚¢‚à‚Ì‚ª‘½‚·‚¬‚ÄA‚Ù‚Æ‚ñ‚Ç•ú’u‚Å‚·B
- ƒJ[ƒh‚ÍA•Ší—pƒJ[ƒh‚Ì‘•”õŒÂŠ‚ª0‚É‚È‚Á‚Ä‚é‚Ì‚ð2(¶Žè)‚ÉC³B
- —¼Žè•Ší‚Ìꇂ͕ʂɔ»’肵‚Ä‚é‚Ì‚Å—¼Žè•Ší‚à–â‘è‚È‚¢‚Í‚¸B
-
- (db/)
- item_db.txt/item_db2.txt
- ŠY“–ŒÂŠC³
-
-EƒJ[ƒh’ljÁŽÀ‘•
- ƒXƒ^ƒ“‚Ȃǂ̒ljÁŒø‰ÊA‚»‚ê‚ç‚Ö‚Ì‘Ï«Œn“AƒI[ƒNƒq[ƒ[ƒJ[ƒhŽÀ‘•
-
- (db/)
- item_db.txt/item_db2.txt
- ƒXƒNƒŠƒvƒg‚ÌC³
- (map/)
- map.h
- struct map_session_data‚Éaddeff‚Ȃǂ̃ƒ“ƒo‚ð’ljÁ
- pc.c
- pc_calcstatus()Apc_bonus2()‚ÌC³
- pc_attack()‚Åskill_additional_effct()‚ðŒÄ‚Ԃ悤‚ÉB
- skill.c/skill.h
- skill_additional_effect()‚ŃJ[ƒh‚É‚æ‚é”»’è’ljÁ
- skill_status_change_start()‚Å‘Ï«‚ð•t‚¯‚½B
- battle.c
- battle_calc_weapon_attack()‚ŃI[ƒNƒq[ƒ[ƒJ[ƒh
- iƒNƒŠƒeƒBƒJƒ‹‘Ï«j‚̈—‚ð’ljÁ
-
-E‰ñ”ð”»’è‚ÌC³
- UŒ‚ŽÒ‚ªPC‚Ìê‡AÅ‘å–½’†—¦‚X‚T“§ŒÀ‚ð‚È‚µ‚É‚µ‚Ü‚µ‚½B
- battle.c
- battle_calc_weapon_attack()‚ðC³
-
-
-EŠ®‘S‰ñ”ð‚ðŽÀ‘•
- ‚Ö‚ñ‚Ä‚±‚Ȉ—‚µ‚Ä‚Ü‚·•ŒvŽZŽ®“K“–‚Å‚·B
-
- battle.c
- battle_calc_weapon_attack()‚Ɉ—’ljÁB
-
-E‘qŒÉ‚ðŠJ‚¢‚½‚܂܃ƒOƒAƒEƒg‚µ‚½‚Æ‚«mapŽI“à‚Å‚ÍŠJ‚«‚Á‚Ï‚È‚µ‚É‚È‚Á‚Ä‚é–â‘è‚ðC³
- storage.c
- storage_storage_quitsave()‚ðC³
-
-E@item,@monster,@produce‚Å–¼‘OŽw’è‚Å‚«‚é‚悤‚É•ÏX
- ‰pŒê–¼A“ú–{Œê–¼‚Ç‚¿‚ç‚Å‚àOKB‰pŒê‚Ìꇂ͑啶Žš¬•¶Žš‹æ•Ê‚µ‚Ü‚¹‚ñB
-
- atcommand.c
- ŠY“–ŒÂŠC³
- itemdb.c/itemdb.h
- itemdb_searchname(),itemdb_searchname_sub()’ljÁ
- mob.c/mob.h
- mobdb_searchname()’ljÁ
-
-E@refine‚Åã‚°‚é”’l‚ðŽw’è‚Å‚«‚é‚悤‚É•ÏX
- atcommand.c
- ŠY“–ŒÂŠC³
-
-E@produce‚É‚æ‚黑¢Žž‚̃GƒtƒFƒNƒg‚𳂵‚¢‚à‚Ì‚ÉC³
- clif.c/clif.h
- clif_produceeffect()’ljÁ
- atcommand.c
- ŠY“–ŒÂŠC³
-
-E˜I“XƒXƒLƒ‹Žg—pŽž‚̈—‚ð­‚µC³
- skill.c
- skill_castend_id()‚Å‚È‚­Askill_castend_nodamage_id()‚Å
- ˜I“XŠJÝ‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
-
-Estricmp‚Ì•Ï‚í‚è‚Éstrcasecmp‚ðŽg‚¤‚悤‚É‚µ‚½
- i_WIN32‚©__EMX__‚ª’è‹`‚³‚ê‚Ä‚¢‚é‚Æstricmp‚ðŽg‚¢‚Ü‚·j
-
- (char/)
- int_party.c
- (map/)
- itemdb.c/mob.c
- ƒ}ƒNƒ’è‹`‚ÌC³‚È‚Ç
-
-EƒXƒLƒ‹‚ð­‚µC³
- ƒOƒŠƒ€ƒgƒD[ƒX‚ªƒnƒCƒfƒBƒ“ƒO‚ÅŽg‚¦‚È‚¢–â‘èC³
- •ŠíŒ¤‹†‚Ì–½’†C³‚ðŽÀ‘•
-
- skill.c
- skill_use_id()‚ÌC³
- pc.c
- pc_calcstatus()‚Å•ŠíŒ¤‹†‚É]‚Á‚Ä–½’†C³
-
-----------
-//0256 by nabe
-
-E˜I“XƒAƒCƒeƒ€w“ü‚̃oƒOC³
- clif.c
- clif_vendinglist()‚Å”„‚è؂ꂽƒAƒCƒeƒ€‚Í•\Ž¦‚µ‚È‚¢‚悤‚É
-
-----------
-//0255 by nabe
-
-E˜I“XƒAƒCƒeƒ€w“ü‚̃oƒOC³
- vending.c
- vending_purchasereq()‚Åzeny,weight•”•ªC³
-
-----------
-//0254 by nabe
-
-E˜I“X‚ðŽÀ‘•
- vending.c/vending.h
- V‹K’ljÁB˜I“XƒƒCƒ“ˆ—
- skill.c
- skill_castend_id()‚ɘI“XŠJ݃XƒLƒ‹ˆ—‚ð’ljÁ
- clif.h/clif.h
- ˜I“XŠÖ˜AƒpƒPƒbƒgˆ—‚ð’ljÁ
- map.h
- struct map_session_data‚ÉA
- int vender_id;
- int vend_num;
- char message[80];
- struct vending vending[12];
- ‚ð’ljÁ
-
-----------
-//0253 by ŒÓ’±—–
-
-Estricmp–¢’è‹`ƒGƒ‰[‚ª‚Å‚éŠÂ‹«—p‚ÌC³
- ƒGƒ‰[‚ªo‚½ê‡Aint_party.c‚Ìʼn‚̃}ƒNƒ’è‹`‚̃Rƒƒ“ƒg‰»‚Ì‚¤‚¿A
- ‚Ç‚¿‚ç‚©‚ðŠO‚µ‚Ä‚â‚è’¼‚µ‚Ä‚Ý‚é‚ÆA‚¤‚Ü‚­‚¢‚­‚©‚àB
- ň«A‰º‚ð—LŒø‚É‚µ‚½‚炤‚Ü‚­‚¢‚­‚Í‚¸Bi‘啶Žš¬•¶Žš‚ð‹æ•Ê‚·‚é‚悤‚É‚È‚è‚Ü‚·j
-
- (char/)
- int_party.c
- ƒRƒƒ“ƒg‰»Ï‚݂̃}ƒNƒ’è‹`’ljÁ
-
-----------
-//0252 by ŒÓ’±—–
-
-EƒJ[ƒh‚̈ꕔŽÀ‘•
- iƒXƒe[ƒ^ƒX•Ï‰»‘S”ÊA•Ší‘®«AƒXƒLƒ‹‚Í‚·‚Å‚ÉŽÀ‘•Ï‚Ýj
- –h‹ï‘®«A‰r¥ŽžŠÔ•Ï‰»A‘®«UŒ‚‘Ï«AŽí‘°‘Ï«AŽí‘°’ljÁƒ_ƒ[ƒWA
- ‘®«’ljÁƒ_ƒ[ƒWAƒTƒCƒY’ljÁƒ_ƒ[ƒWAMAXHPAMAXSP‘Œ¸AŽg—pSP•Ï‰»ŒnA
- ƒtƒFƒ“AƒhƒŒƒCƒNAƒzƒ‹ƒ“A[•£‚Ì‹RŽmA‰©‹àå³AƒIƒVƒŠƒXƒJ[ƒh‚ðŽÀ‘•
-
- (db/)
- const.txt
- bonus—p‚̒蔒ljÁAbonus2‚̒蔂à’ljÁ
- item_db.txt/item_db2.txt
- ƒJ[ƒh‚̃XƒNƒŠƒvƒg’ljÁ
- (map/)
- map.h
- struct map_session_data‚Éhprate‚È‚Ç‘½”ƒƒ“ƒo’ljÁ
- script.c
- bonus2ƒRƒ}ƒ“ƒh’ljÁ
- buildin_bonus2()’ljÁ
- pc.c/pc.h
- pc_bonus2()’ljÁ
- pc_bonus()‚̈—’ljÁ
- pc_calcstatus()‚ÅŠeŽí’ljÁƒƒ“ƒo‚̉Šú‰»‚ðs‚¤‚悤‚É‚µA
- hprate‚âsprate‚É]‚¢max_hp,max_sp‚Ì’²®‚à‚·‚é‚悤‚É•ÏXB
- pc_makesavestatus()‚ŃIƒVƒŠƒXƒJ[ƒhC³
- skill.c
- skill_castfix()‚Åcastrate‚É]‚¢A‰r¥ŽžŠÔ‚ð’²®B
- skill_castend_id()‚Ådsprate‚É]‚¢AŽg—pSP‚ð’²®B
- skill_castend_nodamage_id()‚ŃJ[ƒhC³‚ð’ljÁ
- battle.c
- battle_calc_weapon_attack()‚ŃJ[ƒhC³‚ð’ljÁ
- battle_calc_magic_attack()‚ŃJ[ƒhC³‚ð’ljÁ
- battle_damage()‚ŃtƒFƒ“ƒJ[ƒhC³‚ð’ljÁ
-
-EƒXƒe[ƒ^ƒXŠ„‚èU‚è‚Ì•\Ž¦ã‚Ì–â‘èC³
- STR‚ðã‚°‚Ä‚àATK‚ª•Ï‚í‚ç‚È‚¢–â‘èAINT‚ðã‚°‚Ä‚àMATK‚ª•Ï‚í‚ç‚È‚¢–â‘èC³
-
- map.h
- struct map_session_data‚Ématk1,matk2ƒƒ“ƒo’ljÁ
- pc.c
- pc_calcstatus()‚ÌC³
- clif.c
- clif_initialstatus()‚ÌC³
- battle.c
- battle_calc_magic_attack()‚ÌC³
-
-
-----------
-//0251 by nabe
-
-E0250‚̃oƒOC³‚È‚Ç
- ƒJ[ƒg‚ð•t‚¯‚¸‚ɃƒOƒCƒ“‚Ü‚½‚̓}ƒbƒvˆÚ“®‚µ‚½Œã‚ɃJ[ƒg‚ð•t‚¯‚é‚ÆA
- ƒJ[ƒg‚Ì’†g‚ª2”{‚Ì—Ê‚É•\Ž¦‚³‚ê‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‚Ì‚ðC³B
- ƒJ[ƒg‚̃AƒCƒeƒ€”‚ðXV‚·‚é‚悤‚ÉC³B
- pc.h/pc.c
- pc_iscarton()ƒ}ƒNƒ‚ð’ljÁ
- pc_cart_additem(),pc_cart_delitem()‚É‚»‚ꂼ‚ê
- sd->cart_num++;‚Æsd->cart_num--;ˆ—‚ð’ljÁ
- clif.c
- clif_parse_LoadEndAck()‚ÅA
- ƒJ[ƒg‚ð•t‚¯‚Ä‚¢‚é‚Æ‚«‚̂݃J[ƒgî•ñ‚ð‘—M‚·‚é‚悤‚É‚µ‚½
-
-----------
-//0250 by nabe
-
-EƒJ[ƒgOFFAƒ`ƒFƒ“ƒWƒJ[ƒgŽÀ‘•B
- (map/)
- pc.c/pc.h
- pc_setcart()‚ð’ljÁ
- script.c
- buildin_setcart()‚ð’ljÁ
- ƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒhusetcart;v‚ŃJ[ƒg‚ª‚‚­
- clif.c/clif.h
- clif_parse_CartOff()’ljÁBiƒJ[ƒg‚ð‚Í‚¸‚·j
- clif_parse_ChangeCart()’ljÁBiƒ`ƒFƒ“ƒWƒJ[ƒg‚̃J[ƒg‘I‘ðj
- (conf/)
- npc_town_kafra.txt
- ƒJ[ƒgƒT[ƒrƒX‚ðusetcart;v‚É’uŠ·
-
-
-----------
-//0249 by ŒÓ’±—–
-
-Eƒp[ƒeƒB‚̃f[ƒ^ƒx[ƒX‚Ì–µ‚‚ðo—ˆ‚邾‚¯—}‚¦‚é‚悤‚ÉB
- •¡”ƒp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚éƒf[ƒ^‚ÌŒŸ¸A’ljÁ‚ÉŽ¸”s‚µ‚½‚Æ‚«‚É’E‘Þ‚È‚ÇB
-
- (char/)
- int_party.c
- party_check_conflict(),party_check_conflict_sub(),
- mapif_parse_PartyCheck()’ljÁ
- inter.c
- ƒpƒPƒbƒg’·ƒŠƒXƒg‚É0x3028’ljÁ
- INTERŽIƒpƒPƒbƒg.txt
- ƒpƒPƒbƒg0x3028’ljÁ
- (map/)
- party.c/party.h
- party_check_conflict()’ljÁB
- party_invite()‚Å“¯ƒAƒJƒEƒ“ƒgŠ‘®ƒ`ƒFƒbƒN‚ðs‚¤‚悤‚ÉB
- party_member_added(),party_send_movemap()‚Å
- party_check_conflict()‚ðŒÄ‚Ԃ悤‚ÉB
- intif.c/intif.h
- intif_party_checkconflict()’ljÁ
-
-Eƒp[ƒeƒB‚ÌÀ•WA‚g‚o’Ê’m‚ðŽÀ‘•
- •Ï‰»‚ª‚ ‚ê‚΂P•b‚Ɉê‰ñ‘—MB
-
- map.h
- struct map_session_data‚Éparty_x,~_y,~_hp‚Ì‚Rƒƒ“ƒo’ljÁ
- party.c/party.h
- party_send_xyhp_timer_sub(),party_send_xyhp_timer(),
- party_send_xy_clear(),party_send_hp_check()’ljÁB
- party_recv_movemap()‚Åsd->party_*‚ð‰Šú‰»‚·‚é‚悤‚ÉB
- clif.c/clif.h
- clif_send‚ÌPARTY*ƒtƒ‰ƒO‚ð—LŒø‚ÉB
- iPARTY,PARTY_SAMEMAP,PARTY_AREA,PARTY*_WOS‚Ì‚UŽíj
- clif_party_xy(),clif_party_hp()’ljÁB
- pc.c/pc.h
- pc_authok()‚Åsd->party_*‚ð‰Šú‰»‚·‚é‚悤‚ÉB
- pc_walk()‚Ńp[ƒeƒBƒƒ“ƒo‚ªŽ‹ŠE“à‚É“ü‚Á‚Ä‚«‚½‚Æ‚«‚É
- party_hp‚ð‰Šú‰»‚·‚é‚悤‚ÉB
-
-Eƒp[ƒeƒB‚ÌexpŒö•½•ª”z‚ðŽÀ‘•
- party.c/party.h
- party_share_exp()’ljÁ
- mob.c/mob.h
- mob_damage()‚ÅŒö•½•ª”zˆ—’ljÁ
-
-EƒXƒLƒ‹‚ÌC³‚ƒljÁŽÀ‘•
- ƒoƒbƒVƒ…AƒsƒA[ƒX‚Ì–½’†—¦C³ŽÀ‘•
- ƒsƒA[ƒX‚̃TƒCƒY‚É‚æ‚é‰ñ”•Ï“®ŽÀ‘•iƒvƒŒƒCƒ„[‚Í’†Œ^‚Ɖ¼’èj
- ƒoƒbƒVƒ…Aƒ\ƒjƒbƒNƒuƒƒE‚̃Xƒ^ƒ“Œø‰ÊŽÀ‘•
- ƒXƒg[ƒ“ƒJ[ƒXAƒtƒƒXƒgƒ_ƒCƒoAƒCƒ“ƒxƒiƒ€A
- ƒAƒXƒyƒ‹ƒVƒIAƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“AƒŒƒbƒNƒXƒfƒr[ƒiŽÀ‘•
-
- skill.c
- skill_additional_effect()’ljÁ
- skill_castend_damage_id()ŠY“–ŒÂŠC³
- skill_castend_nodamage_id()ŠY“–ŒÂŠC³
- skill_use_id(),skill_use_pos()‚ŃXƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢‚Æ‚«‚Í
- ‰½‚à‚µ‚È‚¢‚悤‚ÉC³B
- battle.c
- battle_calc_weapon_attack()‚ÌŠY“–ŒÂŠC³
- battle_get_dmotion(),battle_get_attack_element()C³
- clif.c
- clif_mob007b(),clif_mob0078‚Åoption‚È‚Ç‚ð‘—‚é‚悤‚ÉC³
- pc.c
- pc_attack(),pc_walktoxy()‚Ås“®•s‰Â”\‚È‚Æ‚«‚͉½‚à‚µ‚È‚¢‚悤‚ÉB
- mob.c
- mob_stopattack()C³
- mob_ai_sub_hard()‚Ås“®•s”\‚È‚Æ‚«‚͉½‚à‚µ‚È‚¢‚悤‚ÉB
-
-EUŒ‚ŽË’ö‚Ì”»’è’ljÁ
- ‘ŠŽè‚ªˆÚ“®‚µ‚Ä“Í‚©‚È‚¢‚Æ‚«‚ÍAˆÚ“®ƒpƒPƒbƒg‚ð‘—M
-
- clif.c/clif.h
- clif_movetoattack()’ljÁ
- pc.c
- pc_attack()‚ÅŽË’ö”»’èA“Í‚©‚È‚¢‚È‚çclif_movetoattack()‚ðŒÄ‚ÔB
-
-----------
-//0248 by nabe
-
-Eƒp[ƒeƒB쬎ž‚ÉŠù‚Ƀp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚½ê‡‚̈—‚ð’ljÁ
- party.c
- party_create()‚ÉAŠù‚Ƀp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚½ê‡
- clif_party_created(sd,2)‚ð’ljÁ
-
-EƒfƒBƒXƒJƒEƒ“ƒgAƒI[ƒo[ƒ`ƒƒ[ƒW‚ðŒvŽZ
- pc.c
- pc_modifybuyvalue()Apc_modifysellvalue()‚Å’l’i‚ðŒvŽZ
-
-
-----------
-//0247 by ŒÓ’±—–
-
-Eƒp[ƒeƒBŽÀ‘•
- Œö•½•ª”z‚Íݒ肵‚Ä‚àŽÀÛ‚É‚ÍŒö•½•ª”z‚³‚ê‚Ä‚È‚¢B
- ƒp[ƒeƒBƒXƒLƒ‹‚Í‚Ü‚¾Ž©•ª‚É‚µ‚©‚©‚©‚ç‚È‚¢
-
- (char/)
- int_party.c/int_party.h
- ‚Ü‚Æ‚à‚ÉŽÀ‘•
- inter.c
- ƒpƒPƒbƒg’·ƒŠƒXƒg’ljÁ
- INTERŽIƒpƒPƒbƒg.txt
- ƒp[ƒeƒB‚̃pƒPƒbƒg’ljÁ
- (map/)
- party.c/party.h
- V‹K’ljÁ
- map.c/map.h
- struct map_session_data‚Éparty_sendedƒƒ“ƒo’ljÁ
- do_init()‚Ådo_party_init()‚ðŒÄ‚Ô
- map_quit()‚Åparty_send_logout()‚ðŒÄ‚Ô
- intif.c/intif.h
- ƒp[ƒeƒBŠÖ˜A‚Ì•”•ª’ljÁ
- clif.c/clif.h
- ƒp[ƒeƒBŠÖ˜A‚Ì•”•ª’ljÁ
- clif_parse_LoadEndAck()‚Åparty_send_movemap()‚ðŒÄ‚Ño‚·
- pc.c
- pc_authok()‚Åparty_request_info()‚ðŒÄ‚Ԃ悤‚É‚µA
- party_sended‚ð‰Šú‰»‚·‚é‚悤‚ÉB
-
-E‰r¥–WŠQ‚³‚ꂽ‚Æ‚«‰æ–Êã‚ʼnr¥‚ð‚â‚ß‚é‚悤‚ÉC³
- (map/)
- skill.c
- skill_castcancel()‚ʼnr¥’†Ž~ƒpƒP(‡‚Á‚Ä‚é‚Ì‚©‚ÈH)‚ð‘—M
-
-E’´‰“‹——£UŒ‚‚¾‚Æ“G‚ª”½Œ‚‚µ‚Ä‚±‚È‚¢–â‘è‚ðC³
- (map/)
- map.h
- struct mob_data‚Émin_chaseƒƒ“ƒo’ljÁiÅ’á’ÇÕ‹——£j
- mob.c
- mob_attack()‚Åmin_chase‚ð13‚ɉŠú‰»‚·‚é
- mob_walk()‚Åmin_chase‚ª13‚æ‚è‘å‚«‚¢‚È‚ç­‚µ‚¸‚ˆø‚¢‚Ä‚¢‚­
- mob_ai_sub_hard()‚Åmin_chase‚É‚æ‚è’ÇÕ‚ð”»’fA
- UŒ‚‚ðŽó‚¯‚½Žž‚Émin_chase‚ð”މ䋗—£+13‚ÉÝ’è
-
-----------
-//0246 by ŒÓ’±—–
-
-EƒJ[ƒgŽÀ‘•
- map.h
- struct map_session_data‚Écart_weight‚È‚Ç‚S‚ƒƒ“ƒo’ljÁ
- pc.c/pc.h
- pc_cart_additem(),pc_cart_delitem(),
- pc_cart_putitemtocart(),pc_cart_getitemfromcart()’ljÁ
- pc_calcstatus()‚ŃJ[ƒgd—Ê‚âŒÂ”‚È‚Ç‚Ìî•ñ‚ðŒvŽZ
- clif.c/clif.h
- clif_cart_itemlist(),clif_cart_equiplist(),
- clif_cart_additem(),clif_cart_delitem(),
- clif_parse_PutItemToCart(),clif_parse_GetItemFromCart()’ljÁ
- clif_parse_LoadEndAck()‚ŃJ[ƒgî•ñA“à—e‘—M
- clif_updatestatus()‚ÅSP_CARTINFO‚ŃJ[ƒgî•ñ‚ð‘—‚ê‚é‚悤‚É
- clif_parse_MoveFromKafraToCart(),~ToKafraFromCart()’ljÁ
- storage.c/storage.h
- storage_additem(),storage_delitem()’ljÁ
- storage_storageadditemfromcart,~getitemtocart()’ljÁ
- storage_storageadd(),storage_storageget()‚ÅA
- storage_additem(),storage_delitem()‚ðŒÄ‚Ԃ悤‚É•ÏX
-
-EƒXƒLƒ‹‰r¥ƒfƒBƒŒƒC‚È‚ÇŽÀ‘•
- clif.c
- clif_parse_WalkToXY()‚Éskilltimer‚É‚æ‚éˆÚ“®‰Â”Û‚ð’ljÁ
- clif_parse_UseSkillToId(),clif_parse_UseSkillToPos()‚É
- canmove_tick‚É‚æ‚éUŒ‚‰Â”ےljÁ
- skill.c/skill.h
- skill_castcancel()‚ð’ljÁ
- skill_use_id(),skill_use_pos()‚ŃfƒBƒŒƒCŽžŠÔŒvŽZ‚¨‚æ‚ÑA
- canmove_tick‚ÌÝ’è
- battle.c
- battle_damage()‚Åskill_castcancel()‚̌ĂÑo‚µ’ljÁ
-
-E0245‚̃AƒCƒeƒ€ƒf[ƒ^ƒx[ƒXC³‚Ì’Ê퉿Ši”Å—pˆÓ
- (db/)
- item_db.txt
- item_db2.txt‚É‘O‚Ìitem_db.txt‚̉¿Šiî•ñ‚ðƒ}[ƒW‚µ‚½‚¾‚¯‚Å‚·B
-
-----------
-//0245 by ‚ê‚ 
- ‚Ü‚½—á‚É‚æ‚Á‚ÄA‘ŠêC³”Å‚Ì‚Ý‚Å‚·B
-Eitem_db2.txt‚ÌC³
- ‹T“‡V‘•”õ‚ÌŒø‰Ê‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
- ƒEƒBƒU[ƒh‚ªñ‚ð‘•”õ‚Å‚«‚È‚¢‚Ì‚ðC³
- ƒEƒBƒU[ƒh‚ªƒ}ƒWƒVƒƒƒ“ƒnƒbƒgA‚Æ‚ñ‚ª‚è–X‚ð
- ‘•”õ‚Å‚«‚È‚¢‚Ì‚ðC³
-----------
-//0244 by ‚ê‚ 
-Emob_db.txt‚ÌC³
- ‹T“‡ƒ‚ƒ“ƒXƒ^[‚̃f[ƒ^‚ð‚¢‚ê‚Ü‚µ‚½B
- ‚½‚¾AŠÔˆá‚Á‚Ä‚é•”•ª‚ª‚©‚È‚è‚ ‚è‚Ü‚·B
- Speed,Delay‚Í“K“–‚Å‚·B
- ‚Ü‚½A‚í‚©‚ç‚È‚¢‚Ì‚ÍŠØ‘”ł̃f[ƒ^‚È‚Ì‚Å
- Mdef‚Æ‚©ˆÙí‚É‚‚¢‹C‚àB
-----------
-//0242 by ŒÓ’±—–
-
-EŽæˆøŠÖ˜A‚Ì•ÏX‚ÆC³
- Žæˆø‚ÉŽg‚¤•Ï”‚ðmmo_charstatus‚©‚çmap_session_data‚Ɉړ®‚µ‚Ü‚µ‚½
-
- (common/)
- mmo.h
- struct mmo_charstatus‚©‚çŽæˆøŠÖŒW‚̃ƒ“ƒoíœ
- (map/)
- map.h
- struct map_session_data‚ÉŽæˆøŠÖŒW‚̃ƒ“ƒo’ljÁ
- trade.c
- \‘¢‘Ì‚Ì•ÏX‚É‚ ‚킹‚ÄC³
- map.c
- map_quit()‚ÅŽæˆø’†‚È‚çƒLƒƒƒ“ƒZƒ‹‚·‚é‚悤‚É‚µ‚½
-
-EƒJ[ƒh‚Ì‘g‚݇‚킹ŽÀ‘•
- pc.c/pc.h
- pc_insert_card()‚ŃJ[ƒh‚ðŽÀÛ‚É‘}“ü‚·‚é
- clif.c/clif.h
- clif_parse_UseCard(),clif_parse_InsertCard()’ljÁ
- clif_use_card(),clif_insert_card()’ljÁ
-
-Eˆê•”‚̃J[ƒhŒø‰ÊŽÀ‘•
- ƒXƒLƒ‹K“¾ƒJ[ƒhAƒXƒe[ƒ^ƒXƒ{[ƒiƒXƒJ[ƒh‚È‚ÇB
-
- (map/)
- map.h
- struct map_session_data‚É‘•”õƒJ[ƒhŒŸõ—p‚Ì•Ï”’ljÁ
- pc.c/pc.h
- pc_calcstatus()‚ŃJ[ƒh‚̈—’ljÁ
- ‚ ‚éID‚̃J[ƒh‚ª‘•”õÏ‚Ý‚©ŒŸõ‚·‚邽‚ß‚ÌŠÖ”A
- pc_equip_card(),pc_equip_wcard(),pc_equip_dcard()‚ð—pˆÓ
-
-Ed—ʃI[ƒo[/‘é/‹RæƒAƒCƒRƒ“‚Ì•\Ž¦
- (map/)
- pc.c/pc.h
- pc_checkweighticon()’ljÁAd—ʂ̃AƒCƒRƒ“ˆ—
- clif.c
- clif_updatestatus()‚Åd—Ê‘—MŽž‚Épc_checkweighticon()‚ÌŽÀs
- clif_changeoption()‚Å‘é‚Æ‹Ræ‚̃AƒCƒRƒ“ˆ—
-
-E0241‚̃AƒCƒeƒ€ƒf[ƒ^ƒx[ƒXC³‚Ì’Ê퉿Ši”Å—pˆÓ
- (db/)
- item_db.txt
- item_db2.txt‚É‘O‚Ìitem_db.txt‚̉¿Šiî•ñ‚ðƒ}[ƒW‚µ‚½‚¾‚¯‚Å‚·B
-
-
-----------
-//0241 by ‚ê‚ 
-EƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚ÌC³
- V“ª‘•”õ‚̃Oƒ‰ƒtƒBƒbƒN‚ªˆÙ‚È‚é‚Ì‚ðC³
- ‘•”õ‚ÌŒø‰Ê‚ÌŽÀ‘•
- ã’iE’†’i‚ªŠÔˆá‚Á‚Ä‚½‚Ì‚ð­‚µC³
- ‘¬•ñ”Å‚Á‚Ä‚±‚ƂŊԈႦ‘½‚¢‚©‚àB
- ƒeƒXƒg‚à‚ ‚܂肵‚Ä‚Ü‚¹‚ñB
- ‚ ‚ÆA‘Šê’²®”Å‚µ‚©—pˆÓ‚µ‚Ä‚Ü‚¹‚ñB
-
- item_db2.txt
- ‹T“‡‚É‚ ‚킹‚Ä’²®
-
-----------
-//0240 by nabe
-
-EŽæˆø‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
- (common/)
- mmo.h
- struct mmo_charstatus ‚É
- int trade_partner;
- int deal_item_index[10];
- int deal_item_amount[10];
- int deal_zeny;
- short deal_locked;
- ‚ð’ljÁ
- (map/)
- clif.c,clif.h
- clif_traderequest() : 0xe5iŽæ‚èˆø‚«—v¿Žó‚¯j
- clif_tradestart() : 0xe7iŽæ‚èˆø‚«—v‹‰ž“šj
- clif_tradeadditem() : 0xe9i‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁj
- clif_tradeitemok() : 0xeaiƒAƒCƒeƒ€’ljÁ¬Œ÷j
- clif_tradedeal_lock() : 0xeciok‰Ÿ‚µj
- clif_tradecancelled() : 0xeeiŽæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹j
- clif_tradecompleted() : 0xf0iŽæ‚èˆø‚«Š®—¹j
- ‚ð’ljÁB
- trade.c,trade.h
- trade_traderequest() : Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
- trade_tradeack() : Žæˆø—v¿
- trade_tradeadditem() : ƒAƒCƒeƒ€’ljÁ
- trade_tradeok() : ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- trade_tradecancel() : ŽæˆøƒLƒƒƒ“ƒZƒ‹
- trade_tradecommit() : Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- ‚ðŽÀ‘•B‚»‚ꂼ‚êclif.c::clif_parse_Trade*‚©‚çŒÄ‚΂ê‚éB
-
-
-----------
-//0238 by ‚ê‚ 
-
-E‘¬“x•ÏX‚ÉŠÖ‚µ‚Ä­‚µC³
- atcommand.c
- ‘¬“x•ÏX‚Ì•”•ª‚ð­‚µC³
- ‚±‚ê‚ňꉞ“®‚­‚Ý‚½‚¢H
- pc.c
- ‚‚¢‚Å‚É‚Å‚·‚ª
- ‘¬“x㸂ŕàs‘¬“x‚ªã‚ª‚é‚悤‚É‚µ‚½B
- ˆê‰ž“®‚­‚Ý‚½‚¢‚Å‚·‚ª“K“–‚È‚Ì‚Å
- ‚¨‚©‚µ‚È‚Æ‚±‚낪‚ ‚ê‚΂¨Šè‚¢‚µ‚Ü‚·B
-
-----------
-//0236 by nabe
-
-EƒXƒNƒŠƒvƒg‚Åmenu‚Å”ò‚ñ‚¾æ‚Å’¼‚®menu‚ð‘‚­‚ƌ듮삷‚éƒoƒO‚ðC³‚µ‚Ü‚µ‚½B
- script.c
- goto“®ì‚ÌŒã‚ÌRERUNLINE‚ɑΈ‚·‚邽‚ßA
- goto,menu‚Å”ò‚ñ‚¾Œã‚É‚ÍAst.state==GOTO‚Årerun_pos‚ðXVB
-
-
-----------
-//0233 by nabe
-
-EƒAƒCƒeƒ€‚ð‘•”õ‚·‚éÛ‚Ì‘•”õ”»’è‚ð’ljÁ‚µ‚Ü‚µ‚½B
- pc.c
- pc_equipitem()‚É‘•”õ”»’èi«•Ê”»’èA‘•”õLV”»’èAE‹Æ”»’èj’ljÁ
-
-Ed—Ê”»’èƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
- if (checkweight(ƒAƒCƒeƒ€ID,ƒAƒCƒeƒ€”—Ê))
- ‚Å‚»‚̃AƒCƒeƒ€~”—Ê‚ðŽæ“¾‚Å‚«‚é‚©‚Ç‚¤‚©”»’è‚Å‚«‚Ü‚·B
- script.c
- buildin_checkweight()‚ð’ljÁ
-
-EƒXƒNƒŠƒvƒg‹l‚߇‚킹‚ðathena dev-2.1.1—p‚ɈÚA‚µ‚Ü‚µ‚½B
- map_athena1.cnf
- npc_event_*.txt ƒCƒxƒ“ƒgNPC
- npc_job_*.txt “]ENPC
- npc_mob_job.txt “]E—pƒ‚ƒ“ƒXƒ^[
- npc_town_*.txt ’¬NPC
-
-
-----------
-//0232 by ŒÓ’±—–
-
-E‘•”õƒ{[ƒiƒX‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- ƒ{[ƒiƒX‚ÉŽg‚¤ƒXƒNƒŠƒvƒg(bonus,skill)‚ðŽÀ‘•
- ƒXƒNƒŠƒvƒg‚ÍI-Athena‚̃f[ƒ^‚ðŽg‚Á‚ăRƒ“ƒo[ƒg‚µ‚Ü‚µ‚½B
- i‚Ü‚¾ƒJ[ƒh‚ɂ͑Ήž‚µ‚Ä‚¢‚Ü‚¹‚ñj
-
- (common/)
- mmo.h
- struct skill‚Éflagƒƒ“ƒo’ljÁiƒJ[ƒhƒXƒLƒ‹‚©‚Ç‚¤‚©j
- (map/)
- map.h
- struct map_session_data‚Éatk_ele‚Ȃǂ̃ƒ“ƒo’ljÁ
- enum‚ÅSP_ATKELEMENT‚ȂǒljÁ
- pc.c
- pc_bonus()‚ÌŽÀ‘•Apc_skill()’ljÁ
- script.c
- buildin_skill()‚̒ljÁ
- buildin_bonus()‚ÌC³(const.txt‚̒蔂ªŽg‚¦‚é‚悤‚É)
- clif.c
- clif_skillinfoblock()‚ÌC³(ƒJ[ƒhƒXƒLƒ‹‚Íã‚°‚ç‚ê‚È‚¢)
- (db/)
- const.txt
- bonus‚ÉŽg‚¤‚½‚߂̒蔒ljÁ
- item_db.txt
- •W€‚̃f[ƒ^‚É‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚½‚à‚Ì
- item_db2.txt
- 0213‚Å‘Šê’²®‚³‚ꂽƒf[ƒ^‚É‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚½‚à‚Ì
-
-E‰r¥ŠÖŒW‚̃oƒO‚ªC³‚³‚ê‚Ü‚µ‚½
- (map/)
- skill.c
- skill_use_id(),skill_use_pos()‚ðC³
- (db/)
- cast_db.txt
- ­‚µ’ljÁiƒuƒŠƒbƒcƒr[ƒg‚È‚Çj
-
-EUŒ‚‘®«‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-E¯‚Ì‚©‚¯‚ç‚ÌC³‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- map.h
- struct map_session_data‚Éstarƒƒ“ƒo’ljÁ
- pc.c
- pc_calcstatus()‚Å‘®«‰Šú‰»
- battle.c
- battle_get_element(),battle_get_attack_element()C³
- battle_calc_weapon_damage()‚ÌŠY“–ŒÂŠC³
-
-Eñ‘•”õŽž‚ÉMATK+15%‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- battle.c
- battle_calc_magic_damage()‚ÌŠY“–ŒÂŠC³
-
-E»‘¢•Ší‚̃Lƒƒƒ‰ƒNƒ^[–¼‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
-
- Œ´—‚Æ‚µ‚Ä‚ÍAmapŽI“à‚̃Lƒƒƒ‰ƒNƒ^–¼ƒf[ƒ^ƒx[ƒX‚ðŒŸõ‚µ‚ÄA
- ‘¶Ý‚·‚ê‚Α¦•ÔMA‘¶Ý‚µ‚È‚¯‚ê‚ÎcharŽI‚É‰ðŒˆ—v‹‚ðo‚·B
- ‚±‚Ì‚Æ‚«A–¼‘O‚ð—v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚ÌID‚ðƒf[ƒ^ƒx[ƒX‚É“o˜^‚·‚éB
- charŽI‚©‚ç–¼‘Oƒf[ƒ^‚ª‚­‚é‚ÆA‘Ήž‚·‚éƒf[ƒ^ƒx[ƒX‚É–¼‘O‚ðƒZƒbƒg‚µA
- —v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚É–¼‘O‚ð•ÔM‚·‚éB
- –¢‰ðŒˆ‚Ì“¯‚¶ƒLƒƒƒ‰ID‰ðŒˆ‚ð•¡”‚̃Nƒ‰ƒCƒAƒ“ƒg‚ª—v‹‚µ‚Ä‚«‚½ê‡A
- ÅŒã‚É—v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚É‚µ‚©•ÔM‚µ‚È‚¢‚ªA
- •ÔM‚³‚ê‚È‚©‚Á‚½ƒNƒ‰ƒCƒAƒ“ƒg‚Í”•bŒã‚ÉÄ‚Ñ‰ðŒˆ—v‹‚ð‘—‚Á‚Ä‚­‚é
- i‚»‚µ‚Ä‚»‚Ì‚Æ‚«‚ÍmapŽI‚©‚瑦•ÔM‚³‚ê‚éj‚Ì‚Å‘å‚«‚È–â‘è‚Í‚È‚¢B
-
- ƒpƒPƒbƒg0x2b08,0x2b09‚ÅmapŽI‚ÆcharŽI‚ª’ÊM‚µ‚Ä‚Ü‚·B
-
- (char/)
- char.h
- UNKNOWN_CHAR_NAME’è‹`iƒLƒƒƒ‰ƒf[ƒ^‚ª–³‚¢‚Æ‚«‚É•Ô‚³‚ê‚é–¼‘Oj
- char2.c
- parse_frommap()‚ɃpƒPƒbƒg0x2b08‚̈—‚ð’ljÁ
-
- (map/)
- chrif.c/chif.h
- chrif_searchcharid()’ljÁ
- chrif_parse()‚Å0x2b09‚̈—’ljÁ
- map.c
- ƒf[ƒ^ƒx[ƒX charid_db 錾
- struct charid2nick錾Bnick‚Í–¼‘OA
- req_id‚Í0‚Å–¼‘O‰ðŒˆÏ‚ÝA0ˆÈŠO‚Å–¢‰ðŒˆ‚Å‰ðŒˆ‘Ò‚¿‚̃uƒƒbƒNID
- map_addchariddb()’ljÁBƒf[ƒ^ƒx[ƒX‚Ö–¼‘O“o˜^A—v‹‚É•ÔMB
- map_reqchariddb()’ljÁB—v‹‚ª‚ ‚Á‚½‚±‚Æ‚ðƒf[ƒ^ƒx[ƒX‚֒ljÁB
- map_charid2nick()‚Ńf[ƒ^ƒx[ƒX‚ÌŒŸõ
- do_init()‚Å charid_db ‚̉Šú‰»‚ð’ljÁ
- clif.c/clif.h
- clif_parse_SolveCharName(),clif_solved_charname()’ljÁ
-
-
-----------
-//0231 by nabe
-
-EƒXƒNƒŠƒvƒg‚Å mes "$charaname"; “™‚Æ‘‚­‚ƃLƒƒƒ‰‚Ì–¼‘O‚ð‚µ‚á‚ׂé‹@”\‚ð’ljÁB
- script.c
- buildin_mes()“à‚Å
- mes“à•”‚Ì$charaname‚ðƒLƒƒƒ‰‚Ì–¼‘O‚É’uŠ·‚·‚鈗‚ð’ljÁB
- ”“¯—l‚É‚µ‚Ä•Ï”‚Ì’l‚È‚Ç‚ðmes“à•”‚Å•\Ž¦‚·‚é‚悤‚É‚·‚邱‚Æ‚à
- ”‚Å‚«‚Ü‚·‚ªA‚±‚ê‚ɂ‚¢‚Ä‚Í–¢ŽÀ‘•‚Å‚·EEEB
- ”‚Æ‚è‚ ‚¦‚¸
- ” mes Global_Val;
- ”‚̂悤‚É’¼Ú‘‚­‚±‚ƂőΈ‚µ‚Ä‚­‚¾‚³‚¢B
-
-E“G‚ÉUŒ‚‚³‚ꂽ‚Æ‚«‚ÉmapŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚é‚Ì‚ðC³B
- battle.c
- battle_calc_weapon_attack()‚Ì
- ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“‚̃XƒLƒ‹ƒ`ƒFƒbƒN•”•ªA
- pc_checkskill(sd,22)‚ðA
- pc_checkskill(tsd,22)‚ÉB
-
-----------
-//0230 by nabe
-
-E‰ñ”𗦑‰ÁƒXƒLƒ‹‚ðƒXƒe[ƒ^ƒX‚É”½‰fB
- pc.c
- 0228‚Å‚Ìpc_calcstatus()‚̉ñ”𗦑‰Á•ª‚ðŒ³‚É–ß‚µflee‚ð‘‰ÁB
- battle.c
- battle_calc_weapon_attack()‚ÌhitrateŒvŽZ‚ʼnñ”𗦕ÛØ‚ðŒvŽZB
-EƒOƒ[ƒoƒ‹•Ï”‚ðŽÀ‘•B
-@ '@'‚à‚µ‚­‚Í'l'‚ÅŽn‚Ü‚ç‚È‚¢•Ï”–¼‚ÍA‘S‚ăOƒ[ƒoƒ‹•Ï”‚Æ‚Ý‚È‚³‚ê‚Ü‚·B
- mmo.h
- struct mmo_charstatus ‚É
- int global_reg_num;
- struct global_reg global_reg[GLOBAL_REG_NUM];
- ‚ð’ljÁB
- pc.c
- pc_readglobalreg(),pc_setglobalreg()‚ð’ljÁB
- script.c
- get_val(),buildin_input(),buildin_set()‚É
- ƒOƒ[ƒoƒ‹•Ï”‚Ì‚½‚߂̈—‚ð’ljÁB
- char2.c
- mmo_char_tostr(),mmo_char_fromstr()‚É
- ƒOƒ[ƒoƒ‹•Ï”‚Ì‚½‚߂̈—‚ð’ljÁB
-
-----------
-//0229 by ŒÓ’±—–
-
-Eˆê•”ƒXƒLƒ‹‚ÌŽÀ‘•/C³
- ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“Aƒf[ƒ‚ƒ“ƒxƒCƒ“Aƒr[ƒXƒgƒxƒCƒ“ŽÀ‘•
- ƒGƒiƒW[ƒR[ƒgC³i–‚–@‚É‚æ‚éUŒ‚‚ɂ̓XƒLƒ‹‚ª“­‚©‚È‚¢‚悤‚ÉC³j
- •ŠíUŒ‚ŒnƒXƒLƒ‹C³iƒGƒtƒFƒNƒg‚ð’ÊíUŒ‚‚©‚çƒXƒLƒ‹‚É•ÏXj
-
- battle.c
- battle_addmastery()‚ŃxƒCƒ“Œn’ljÁ
- battle_calc_damage()‚ŃGƒiƒW[ƒR[ƒgC³
- skill.c
- skill_castend_damage_id()‚Ì•ŠíUŒ‚ŒnƒXƒLƒ‹‚Ì•”•ª‚ðC³
-
-E“GUŒ‚ŒvŽZ‚ðPC‚Ì‚à‚̂ƈê–{‰»
- ‚±‚ê‚ÅPCvsPCAPCvsMOBAMOBvsPCAMOBvsMOB(!?)‚ð‚P‚‚̊֔‚ÅŒvŽZ‚Å‚«‚Ü‚·
-
- battle.c/battle.h
- battle_calc_weapon_attack()‚ðC³
- battle_calc_weapon_attack_pc(),~mob()‚ðíœ
- mob.c
- mob_attack()‚ÅŒvŽZ‚Ébattle_calc_weapon_attack()‚ðŽg‚¤‚悤‚ÉC³
-
-E‰r¥ŽžŠÔƒf[ƒ^‚ª‚È‚¢ê‡‚̃fƒtƒHƒ‹ƒg‚̉r¥ŽžŠÔ‚ð‚O‚É•ÏX
- ¡‚Ü‚Å‚Í‚P•b‚É‚µ‚Ä‚Ü‚µ‚½‚ªAƒoƒbƒVƒ…‚Æ‚©‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ÅB
- iƒoƒbƒVƒ…‚Æ‚©‚̃f[ƒ^‚ð—pˆÓ‚·‚ê‚΂±‚¤‚µ‚È‚­‚Ä‚à’¼‚é‚ñ‚Å‚·‚ªj
-
- pc.c
- pc_readdb()‚Å1000ms‚ðƒZƒbƒg‚·‚é‚Ì‚ðŽ~‚ß‚½
-
-E‰“‹——£UŒ‚‚µ‚Ä‚±‚È‚¢ƒoƒOA‚»‚Ì‘¼‚ðC³
- mob.c
- mob_attack()‚ÌŽË’ö‚ðC³‚µ–Y‚ê‚Ä‚¢‚½
- mob_ai_sub_hard()‚ÅŽË’ö‹——£ŠO‚ÌŽžA–³ˆÚ“®‚Ì“G‚Í
- ƒ^[ƒQƒbƒg‚ðŠO‚·‚悤‚É‚µ‚½
-
-
-----------
-//0228 by nabe
-
-Eƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ÌSkillID‚ðC³B
- battle.c
- battle_calc_weapon_attack_pc()‚Å
- pc_checkskill(sd,49) -> pc_checkskill(sd,48)‚ÉB
-E‰ñ”𗦌üã‚ð—z‚É•\‚³‚È‚¢
- pc.c
- pc_calcstatus()‚Å‚Ìflee‚̉ñ”𗦌ü㕪‚ð휂µA
- mob.c
- mob_attack()‚ÌhitrateŒvŽZ‚ʼnñ”𗦌üã‚ðŒvŽZB
-E“å³A“峎“A“å³—Y‚ð³í‰»B
- npc_monster3J.txt
- mob_db.txt‚ɇ‚킹‚ÄA‚½‚Ô‚ñ³‚µ‚¢‚ÆŽv‚í‚ê‚éID‚ÉC³B
- “å³ 1006 -> 1051
- “峎“ 1017 -> 1053
- “å³—Y 1021 -> 1054
-EƒfƒoƒbƒOƒƒbƒZ[ƒW‚ÌÁ‚µ–Y‚êiHj‚ðíœB
- pc.c
- printf("pc.c 63 clif_clearchar_area\n");‚ðƒRƒƒ“ƒgƒAƒEƒg
-
-----------
-//0227 by ŒÓ’±—–
-
-Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- HP‰ñ•œŒüãASP‰ñ•œŒüãAƒ}ƒOƒjƒtƒBƒJ[ƒgA
- ƒnƒCƒfƒBƒ“ƒOAƒNƒ[ƒLƒ“ƒOAŽ€‚ñ‚¾‚Ó‚èA‰ž‹}Žè“–
-
- map.h
- struct map_session_data ‚É inchealtick ƒƒ“ƒo’ljÁ
- pc.c
- pc_spheal()‚Ń}ƒOƒjƒtƒBƒJ[ƒgˆ—’ljÁ
- pc_natual_heal_sub()‚ʼnñ•œŒüãƒXƒLƒ‹ˆ—’ljÁ
- pc_authok()‚Åinchealtick‚ð‰Šú‰»‚·‚é‚悤‚É•ÏX
- pc_walk()‚Åincheaktick‚ðÄÝ’è‚·‚é‚悤‚É•ÏX
- pc_walk()‚ŃNƒ[ƒLƒ“ƒO‚ÌI—¹ðŒ‚𒲸‚·‚é‚悤‚É•ÏX
- pc_walktoxy()‚Åó‘Ô‚É‚æ‚Á‚Ĉړ®•s‰Â”\‚É‚µ‚½
- skill.c/skill.h
- skill_status_change_start(),~timer(),~end()‚Ɉ—’ljÁ
- skill_check_cloaking()’ljÁAƒNƒ[ƒLƒ“ƒO‚ÌI—¹ðŒ‚ðŒŸ¸
- battle.c/battle.h
- battle_stopattack()’ljÁ
- battle_calc_weapon_attack()‚ÅUŒ‚‚ðŽ~‚߂鈗’ljÁ
- mob.c
- mob_ai_sub_hard()‚ÅUŒ‚‚ðŽ~‚߂鈗’ljÁ
-
-E’ÊíUŒ‚ˆ—A‘ÎMOBA‘ÎPC‚ð‹¤—p‚ÉB
- pc.c
- pc_attack_mob(),pc_attack_pc()íœ
- pc_attack()‚ÉUŒ‚ˆ—’ljÁ
-
-Eƒ‚ƒ“ƒXƒ^[‚Ìs“®‚̈ꕔŽÀ‘•
- ƒAƒNƒeƒBƒ”A–³”½‰žAˆÚ“®‚µ‚È‚¢A‰“‹——£UŒ‚ˆê•”
-
- mob.c
- mob_ai_sub_hard()‚És“®’ljÁ
- mob_ai_sub_hard_activesearch()’ljÁA‹ß‚­‚ÌPC‚Ö‚Ìô“G
-
-EƒI[ƒo[ƒgƒ‰ƒXƒg‚Ì‘‰Á”{—¦‚ª100”{‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
- battle.c
- battle_calc_weapon_attack()‚ÅAŠY“–ŒÂŠ‚ðC³
-
-
-----------
-//0226 by ŒÓ’±—–
-
-‚â‚Á‚Ï‚èƒeƒXƒg‚Í‚ ‚ñ‚܂肵‚Ä‚¢‚Ü‚¹‚ñ
-
-Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- ‘¬“x‘‰ÁAƒGƒ“ƒWƒFƒ‰ƒXAƒLƒ…ƒA[
- ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXAƒTƒtƒ‰ƒMƒEƒ€AƒŠƒJƒoƒŠ[AƒOƒƒŠƒA
- ‚Ó‚­‚낤‚Ì–ÚAƒƒV‚Ì–ÚAW’†—ÍŒüãA‰ñ”𗦌üãA‰ð“Å
- ŠŽ—Ê‘‰ÁAƒ‰ƒEƒhƒ{ƒCƒXAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒI[ƒo[ƒgƒ‰ƒXƒg
- ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“Aƒ}ƒLƒVƒ}ƒCƒYƒpƒ[A‚Q‚g‚p
-
- (map/)
- map.h
- struct map_session_data‚Éwatk2,def2‚ȂǒljÁ
- pc.c
- pc_calcstatus()‚ɃXƒLƒ‹C³’ljÁ
- atk2‚È‚Ç‚à‘—M‚·‚é‚悤‚É•ÏX
- battle.c/battle.h
- battle_get_def2()‚È‚Ç‘½”’ljÁ
- battle_calc_weapon_damage()‚Å“GŒ¸ŽZ–hŒä‚ÌŠ“¾‚ð
- battle_get_def2()‚É•ÏX
- battle_calc_magic_damage()‚Å“GŒ¸ŽZ–‚–@–hŒä‚ÌŠ“¾‚ð
- battle_get_mdef2()‚É•ÏX
- battle_calc_weapon_damage()‚ŃXƒLƒ‹C³‚ð’ljÁ
- skill.c/skill.h
- skill_use_nodamage_id()‚ÌŠY“–ŒÂŠ’ljÁ
- skill_status_change_start()‚ÌŠY“–ŒÂŠ’ljÁ
- clif.c
- clif_updatestatus()‚Ìatk2‚Ȃǂ̈—’ljÁ
- clif_initialstatus()‚Åatk2‚Ȃǂ̈µ‚¢•ÏXAaspd‚È‚Ç‘—M’ljÁ
-
-E¸˜Bƒ_ƒ[ƒWC³/¸˜B–hŒäC³‚ª“K—p‚³‚ê‚Ü‚µ‚½
- (map/)
- pc.c
- pc_calcstatus()‚Åwatk2‚Ædef‚̒ljÁŒvŽZ’ljÁ
- battle.c
- battle_calc_weapon_damage()‚Åwatk2‚ðƒ_ƒ[ƒW‚ɒljÁ
-
-EinterŽI‚̃pƒPƒbƒg‰ðÍ•”‚Ì’v–½“I‚È–â‘肪C³‚³‚ê‚Ü‚µ‚½
- TCP/IPƒvƒƒOƒ‰ƒ€‚Å‚â‚Á‚Ä‚Í‚¢‚¯‚È‚¢‚±‚Æ‚ð‚»‚Ì‚Ü‚Ü‚â‚Á‚Ä‚Ü‚µ‚½(Š¾
- interŽI‚̃pƒPƒbƒg’·ƒf[ƒ^‚ðinter.c‚ÉŽ‚‚悤‚ÉC³‚³‚ê‚Ü‚µ‚½B
-
- (char/)
- inter.c/inter.h
- ƒpƒPƒbƒg’·ƒf[ƒ^ inter_*_packet_length[] ‚ð’ljÁ
- ƒpƒPƒbƒg’·ƒ`ƒFƒbƒN inter_check_length() ‚ð’ljÁ
- mapif_parse_*()‚ÅRFIFOSKIP‚ð‚È‚µ‚É•ÏX
- int_storage.c/int_storage.h
- mapif_parse_*()‚ÅRFIFOSKIP‚ð‚È‚µ‚É•ÏX
- int_party.c/int_guild.c
- Žd—l•ÏX‚ɑΉž‚³‚¹‚½•ÏX
- INTERŽIƒpƒPƒbƒg.txt
- ƒpƒPƒbƒg’·ƒŠƒXƒg’ljÁ
-
-E‚¿‚å‚Á‚Æ‚µ‚½C³
- (char/)
- inter.h
- inter_cfgName‚ð"conf/inter_athena.cnf"‚ÉC³
- char2.c
- char.exe‘æ‚Qˆø”È—ªŽžAinter_cfgName‚ðŽg‚¤‚悤‚ÉC³
- (db/)
- cast_db.txt
- ƒz[ƒŠ[ƒ‰ƒCƒg‚̉r¥ŽžŠÔ’ljÁiƒfƒBƒŒƒC‚Í“K“–j
- Ú‚µ‚¢l’ljÁ‹‚Þ
-
-----------
-//0225 by ŒÓ’±—–
-
-‚È‚ñ‚©‚©‚È‚è˜M‚è‚Ü‚µ‚½‚ª‘Š•Ï‚í‚炸ƒeƒXƒg‚Í‚ ‚ñ‚܂肵‚Ä‚Ü‚¹‚ñB
-
-EƒXƒLƒ‹Žg—pŽž‚Ì•Ï”‚ð•ÏX
- ‚æ‚­Œ©‚½‚çʼn‚©‚ç—pˆÓ‚³‚ê‚Ä‚Ü‚µ‚½‚ËB
-
- map.h
- struct map_session_data‚Ìcast_*‚ðíœ
- skill.c
- cast_*‚Ì•Ï”‚ðskill*‚É•ÏXB
-
-EƒXƒe[ƒ^ƒXˆÙíƒXƒLƒ‹‚̈—‚ð’ljÁiŒø‰Ê‚Í–¢ŽÀ‘•j
- Œ©‚©‚¯ãAƒXƒe[ƒ^ƒXˆÙí‚ÉŠ|‚©‚Á‚½‚è‚Æ‚©‚¾‚¯B
- Œø‰Ê‚Í‚Ü‚¾‚È‚µB
-
- skill.c/skill.h
- skill_status_change_start(),~end(),~timer(),~clear()’ljÁB
- ‚»‚ꂼ‚êƒXƒe[ƒ^ƒXˆÙí‚ÌŠJŽnAI—¹Aƒ^ƒCƒ}ˆ—A‘SÁ‹ŽB
- map.c/map.h
- map_quit()‚Åskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
- struct map_session_data‚Ésc_data,sc_count’ljÁB
- struct mob_data‚Ésc_data,sc_count,option,opt1,opt2’ljÁB
- pc.c
- pc_authok()‚Åsc_data,sc_count‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½B
- pc_setoption‚Åclif_changeoption()‚̈ø”•ÏXB
- pc_damage()‚ÅŽ€–SŽž‚Éskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
- mob.c
- mob_spawn()‚Åsc_data,sc_count‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½B
- mob_attack()‚Åbattle_calc_damage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
- mob_damage()‚ÅŽ€–SŽž‚Éskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
- battle.c/battle.h
- battle_get_*()‚½‚­‚³‚ñ’ljÁB
- battle_calc_damage()’ljÁBÅI“I‚ȃ_ƒ[ƒWŒvŽZ—pB
- battle_calc_magic_attack(),battle_calc_weapon_attack()‚Å
- battle_calc_damage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
- clif.h/clif.c
- clif_status_change()’ljÁBƒXƒe[ƒ^ƒXˆÙíƒAƒCƒRƒ“•\Ž¦—pB
- clif_changeoption()‚̈ø”•ÏXB
- atcommand.c
- clif_changeoption()‚ðŒÄ‚ñ‚Å‚¢‚é‚Qƒ–Š‚ňø”•ÏXB
- @die‚Åskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
-
-Eƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÌK“¾ðŒ‚ªŠÔˆá‚Á‚Ä‚¢‚é‚Ì‚ðC³B
- db/skill_tree.txt
- ŠY“–ŒÂŠC³BiƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi‚Ì•K—vLv‚ð‚P‚Éj
-
-EƒAƒNƒeƒBƒu‚È“G‚ÍUŒ‚‚·‚é‚Æ‚«ŽžXƒ^[ƒQƒbƒg‚ª•Ï‚í‚é‚悤‚É‚È‚è‚Ü‚µ‚½
- mob.c
- mob_ai_sub_hard()‚ÌUŒ‚‚³‚ꂽ‚©Šm”F‚·‚é•”•ª‚É
- ƒAƒNƒeƒBƒu‚È‚ç25%‚ÌŠm—¦‚Ń^[ƒQƒbƒg‚ª•Ï‚í‚é‚悤‚É•ÏXB
-
-Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
- ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“AƒGƒiƒW[ƒR[ƒgAƒŒƒbƒNƒXƒG[ƒeƒ‹ƒiA
- ƒz[ƒŠ[ƒ‰ƒCƒgAƒŠƒUƒŒƒNƒVƒ‡ƒ“Aƒ^[ƒ“ƒAƒ“ƒfƒbƒhAƒ‚ƒ“ƒXƒ^[î•ñ
-
- skill.c/skill.h
- skill_castend_nodamage_id()‚ɃXƒLƒ‹‚̈—‚ð’ljÁB
- skill_castend_*_id()‚̈ø”‚ð•ÏX
- battle.c
- battle_calc_damage()‚ɃXƒLƒ‹‚̈—‚ð’ljÁB
- battle_damage(),battle_heal()‚̈ø”•ÏX
- battle_calc_weapon_damage(),battle_calc_magic_damage()ˆø”•ÏX
- clif.c/clif.h
- clif_skill_estimation()’ljÁBƒ‚ƒ“ƒXƒ^[î•ñ‘—M—p
- pc.c
- battle_calc_weapon_damage()ŒÄ‚Ño‚µ‚̈ø”•ÏX
-
-Estorage.txt‚ª–³‚¢ê‡interŽI‚ª‹­§I—¹‚·‚éŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½
- (char/)
- int_storage.c
- inter_storage_init()‚Ńtƒ@ƒCƒ‹‚ª“Ç‚ß‚È‚¢‚Æexit‚µ‚Ä‚½‚Ì‚ðC³
-
-
-----------
-//0224
-E2-2ŽŸE‚̃XƒLƒ‹‚ðƒcƒŠ[‚ɒljÁ‚µ‚Ü‚µ‚½iŽÀ‘•‚Í‚Ü‚¾‚Å‚·j
- (db/)
- skill_db.txt
- skill_tree.txt
-
-
-----------
-//0223 by ŒÓ’±—–
-EƒJƒvƒ‰‘qŒÉ‚ðinterŽI‚ɑΉž‚³‚¹‚Ü‚µ‚½
- ‚¢‚Ü‚Ü‚Å‚Ìstorage.txt‚Í‚»‚Ì‚Ü‚ÜŽg‚¦‚Ü‚·B
- interŽI—p‚ÌÝ’èƒtƒ@ƒCƒ‹‚Æ‚µ‚Äconf/inter_athena.cnf‚ðŽg‚¢‚Ü‚·B
- iÝ’èƒtƒ@ƒCƒ‹‚Íchar.exe‚Ì‘æ‚Qˆø”‚Å‘¼‚̃tƒ@ƒCƒ‹‚ðŽw’è‚Å‚«‚Ü‚·j
-
- ƒJƒvƒ‰‘qŒÉ‚ÌinterŽIŽÀ‘•‚ÌŠT—v
-
- interŽI‚Ístorage.txt‚Ì‘Sƒf[ƒ^‚ðŽ‚ÂBmapŽI‚̓AƒJƒEƒ“ƒg‚ª—v‹‚·‚é‚Ü‚Å
- ‚»‚̃AƒJƒEƒ“ƒg‚Ì‘qŒÉƒf[ƒ^‚ðŽ‚½‚È‚¢BƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‘qŒÉ‚ðŠJ‚­—v‹‚ª
- ‚ ‚Á‚½‚Æ‚«AmapŽI‚͑Ήž‚·‚éƒAƒJƒEƒ“ƒg‚Ì‘qŒÉƒf[ƒ^‚ðinterŽI‚É—v‹‚·‚éB
- interŽI‚©‚çƒf[ƒ^‚ª“Í‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚É‘qŒÉƒf[ƒ^‚ð‘—‚éB
- ‘qŒÉ‚Ìo‚µ“ü‚ê‚̓Nƒ‰ƒCƒAƒ“ƒg‚ÆmapŽIŠÔ‚Ì’ÊM‚¾‚¯‚Ås‚í‚ê‚éB
- ƒNƒ‰ƒCƒAƒ“ƒg‚ª‘qŒÉ‚ð•Â‚¶‚é‚©I—¹‚·‚é‚ÆAmapŽI‚ÍŠY“–ƒAƒJƒEƒ“ƒg‚Ì
- ‘qŒÉƒf[ƒ^‚ðinterŽI‚É‘—‚éB‚±‚Ì‚Æ‚«interŽI‚̉ž“š‚ð‘Ò‚½‚¸‚ɃNƒ‰ƒCƒAƒ“ƒg‚É
- ‘qŒÉƒNƒ[ƒY‚ð‘—‚éBinterŽI‚Í‘qŒÉƒf[ƒ^‚ðŽó‚¯Žæ‚é‚ÆA
- ‘Sˆõ•ª‚̃f[ƒ^‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚ÄAmapŽI‚ɬŒ÷ƒXƒe[ƒ^ƒX‚ð•Ô‚·B
- mapŽI‚ͬŒ÷ƒXƒe[ƒ^ƒX‚𖳎‹‚·‚éB(ƒfƒoƒbƒO—p‚ɉæ–Ê‚Éo—Í‚·‚邾‚¯)
- interŽII—¹Žž‚É‚à‘qŒÉƒf[ƒ^‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚éB
-
- mapŽI‚Åaccount2storage‚ÅV‚µ‚¢‘qŒÉƒf[ƒ^‚ðì‚é‚Æ‚«A
- ‚·‚łɕ‚¶‚ç‚ê‚Ä‚¢‚é‘qŒÉƒf[ƒ^‚̃ƒ‚ƒŠ‚ðŽg‚¢‚܂킵‚½‚Ù‚¤‚ªƒƒ‚ƒŠ‚ª
- ß–ñ‚Å‚«‚é‚©‚àHi‚±‚ê‚ÍŽÀ‘•‚µ‚Ä‚¢‚Ü‚¹‚ñj
-
- (common/)
- mmo.h
- struct storage ‚ð map/storage.h ‚©‚çˆÚ“®B
- interŽI‚ÆmapŽI—¼•û‚ÅŽg—p‚·‚邽‚ßB
- (char/)
- char2.c
- do_final()‚ðì¬AI—¹Žž‚Émmo_char_sync()ˆÈŠO‚Éinter_save()‚ð
- ŒÄ‚Ԃ悤‚É‚µ‚½i‚±‚ê‚Åinter_*_save()‚Í‘S•”ŒÄ‚΂ê‚Ü‚·j
- inter_init()‚ðchar.exe‚Ì‘æ‚Qˆø”‚à‚µ‚­‚Í"conf/inter.cnf"‚Å
- ŒÄ‚Ԃ悤‚É‚µ‚½iathena.sh‚ÉinterŽIƒRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹‚ðŽw’è‚Å‚«‚Ü‚·j
- inter.c/inter.h
- inter_storage_init(),inter_storage_save(),
- inter_storage_parse_frommap()‚ðŒÄ‚Ԃ悤‚ÉB
- inter_init()‚ɃRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹–¼‚̈ø”‚ð•t‚¯‚½B
- inter_config_read()’ljÁAƒRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹‚©‚ç
- ‘qŒÉ‚ƃp[ƒeƒB[AƒMƒ‹ƒh‚̃tƒ@ƒCƒ‹–¼‚ð“Ç‚Ýž‚Ý‚Ü‚·B
- int_storage.c/int_storage.h
- V‹K’ljÁB‘qŒÉ•”•ª‚ÌinterŽI‹@”\B
- int_party.h/int_party.c/int_guild.h/int_guild.c/
- ƒtƒ@ƒCƒ‹–¼•Ï”‚Ì錾’ljÁ
- INTERŽIƒpƒPƒbƒg.txt
- ‘qŒÉƒpƒPƒbƒg‚̉ðà’ljÁ
-
- (map/)
- storage.h/storage.c
- storage_fromstr(),storage_tostr()‚ðchar/int_storage.c‚Ɉړ®B
- “¯‚¶‚­do_init,do_final‚ł̃tƒ@ƒCƒ‹ˆ—‚àˆÚ“®B
- do_final()‚͈—‚È‚µAdo_init()‚Í•Ï”‰Šú‰»‚Ì‚Ý‚É•ÏXB
- storage_storageopen()‚Å‚Í’P‚Éintif_request_storage()‚ðŒÄ‚Ô‚¾‚¯‚ÉB
- storage_storageclose()‚Éintif_send_storage()‚ð’ljÁ
- storage_storage_quitsave()’ljÁBƒNƒ‰ƒCƒAƒ“ƒgI—¹Žž‚É
- ƒJƒvƒ‰‘qŒÉ‚ªŠJ‚¢‚Ä‚¢‚ê‚Îintif_send_storage()‚ðŒÄ‚ÔŠÖ”B
- intif.h/intif.c
- intif_parse_LoadStorage(),intif_parse_SaveStorage(),
- intif_send_storage(),intif_request_storage()’ljÁ
- map.c
- map_quit()‚Åstorage_storage_quitsave()‚ðŒÄ‚Ԃ悤‚ÉB
-
- (conf/)
- inter_athena.cnf
- V‹K’ljÁBinterŽI—p‚̃Rƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹
-
-
-----------
-//0221 by ŒÓ’±—–
-
-EƒXƒLƒ‹ƒ^[ƒQƒbƒg‚ÌID‚ª³‚µ‚­Š“¾‚Å‚«‚È‚¢–â‘èC³
- clif.c
- clif_parse_UseSkillToId()‚ÅID‚ðWORD‚Æ‚µ‚Ĉµ‚Á‚Ä‚½‚Ì‚ðLONG‚ÉC³
-
-EƒXƒLƒ‹‰r¥ŽžŠÔ‚Æ‘®«•\A‚¨‚æ‚Ñ–‚–@ŒnƒXƒLƒ‹‚Ì‘®«C³ŽÀ‘•
- ‘®«ƒ_ƒ[ƒWC³‚Í battle_attr_fix() ‚ÅŒvŽZ‚µ‚Ü‚·B
- atk_elem‚Í‘®«‚»‚Ì‚Ü‚ÜAdef_elem‚Íi‘®«lv*20{‘®«j‚Å‚·B
- ‰r¥ŽžŠÔ‚Ískill.c‚ÌCASTFIX‚Ì’l‚ð•Ï‚¦‚邱‚Æ‚Å”{—¦‚ð’²®‚Å‚«‚Ü‚·
-
- pc.c
- pc_readdb()‚Åcast_db.txt‚Æattr_fix.txt‚Ì“Ç‚Ýž‚ݒljÁ
- skill.c/skill.h
- struct skill_db ‚Écast,delay’ljÁA‚»‚ê‚ç‚̃AƒNƒZƒT‚à’ljÁ
- ƒXƒLƒ‹‰r¥ŽžŠÔ‚ð skill_get_cast() ‚ÅŠ“¾‚·‚é‚悤‚É‚µ‚½
- battle.c/battle.h
- attr_fix_table’è‹`
- battle_attr_fix()’ljÁA‘®«C³‚ðŒvŽZ‚·‚é
- ‘®«ŒnƒAƒNƒZƒT(battle_get_element()‚È‚Ç)‚ð’ljÁ
- battle_calc_magic_damage()‚É‘®«C³‚ð’ljÁ
- cast_db.txt
- V‹K’ljÁB‰r¥ŽžŠÔ‚ƃfƒBƒŒƒC‚̃f[ƒ^ƒx[ƒX
- ‘S‘R‘«‚è‚È‚¢‚Ì‚ÅA’N‚©’ljÁŠó–]B
- attr_fix.txt
- V‹K’ljÁB‘®«C³ƒe[ƒuƒ‹
-
-Eƒq[ƒ‹‚ÌŽÀ‘•
- clif.c/clif.h
- clif_skill_nodamage()’ljÁAŽx‰‡Œn‚â‰ñ•œ‚̃GƒtƒFƒNƒg
- skill.c/skill.h
- skill_castend_damage_id()Askill_castend_nodamage_id()’ljÁA
- UŒ‚Œn‚ÆŽx‰‡/‰ñ•œŒn‚ÅŠÖ”‚𕪂¯‚½
- ƒq[ƒ‹ŒvŽZƒ}ƒNƒ skill_calc_heal() ’ljÁ
- battle.c
- battle_calc_magic_damage()‚Ńq[ƒ‹‚̃_ƒ[ƒWŒvŽZ’ljÁ
-
-
-----------
-//0220 by ‚ê‚ 
-
-0216‚ÌC³
-HIT‚ÌŒvŽZ‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ÅC³‚µ‚Ä‚Ý‚Ü‚µ‚½B
-ŠÔˆá‚Á‚Ä‚½‚炲‚ß‚ñ‚È‚³‚¢B
-
-Ebattle.c
- 256s–Ú‚Ì
- hitrate=battle_get_hit(&sd->bl) - battle_get_flee(&sd->bl) + 80;
- ‚ª‚½‚Ô‚ñAŽ©•ª‚Ì‚g‚h‚s‚ÆŽ©•ª‚Ì‚e‚k‚d‚d‚ÅŒvŽZ‚µ‚Ä‚é‹C‚ª‚·‚é‚Ì‚Å
- hitrate=battle_get_hit(&sd->bl) - battle_get_flee(target) + 80;
- ‚ÉC³‚µ‚Ü‚µ‚½B
-
-
-----------
-//0218 by ŒÓ’±—–
-
-ŽÀÛ‚É•ªŽU‚³‚¹‚ăeƒXƒg‚µ‚Ä‚¢‚È‚©‚Á‚½‚èB
-
-EmapŽI•ªŽUˆ——p‚ÉinterŽI‹@”\‚ð‚‚¯‚Ä‚Ý‚éi¡Œã‚Ì‚½‚ß‚ÌŠg’£j
- charŽI‚ÉinterŽI‚ðŠñ¶‚³‚¹‚Ü‚µ‚½B•¡”‚ÌmapŽIŠÔ‚Ì’ÊM‚É—˜—p‚µ‚Ü‚·B
- mapŽI‚𕪎U‚µ‚Ĉ—‚Å‚«‚é‚悤‚É‚·‚邽‚ß‚Ì‹@”\‚Å‚·B
- ¡Œãparty‚âguildŽÀ‘•Žž‚É‚«‚Á‚Æ–ð‚É‚½‚Á‚Ä‚­‚ê‚é‚©‚ÆB
-
- ‘qŒÉ‚ÌŽÀ‘•‚àinterŽI‚Ɉړ®‚·‚ׂ«‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- ‚ǂ̃Lƒƒƒ‰ƒNƒ^[‚ª‚Ç‚ÌmapŽI‚É‚¢‚é‚©ŒŸõ‚·‚é‹@”\‚à‚¢‚é‚©‚àB
-
- Žg‚¤ƒpƒPƒbƒg‚ÌID‚͈ȉº‚̂悤‚É‚È‚è‚Ü‚·
- mapŽI=>interŽI‚̓pƒPƒbƒg0x3000`
- interŽI=>mapŽI‚̓pƒPƒbƒg0x3800`
- ƒpƒPƒbƒg‚ðì‚Á‚½ê‡‚ÍAINTERŽIƒpƒPƒbƒg.txt‚É‘‚¢‚Ä‚­‚¾‚³‚¢
-
- ‚±‚Ì‹@”\‚É‚æ‚郃Šƒbƒg
- mapŽI•ªŽU‚É‚à‘Ήž‚Å‚«‚é
- ‚±‚Ì‹@”\‚É‚æ‚éƒfƒƒŠƒbƒg
- interŽIŒo—R‚Ì‘S‚Ä‚Ì–½—ß‚Ì“®ì‘¬“x‚ª—Ž‚¿‚é
- iˆê‰ñinterŽI‚Ü‚Å“n‚·‚½‚ßj
- ŽI‚ƃNƒ‰ƒCƒAƒ“ƒg‚𓯂¶PC‚ÅŽg‚Á‚Ä‚¢‚é‚Ƃ‚炢‚©‚à
-
- (char/)
- char2.c/char.h
- mapif_sendall()’ljÁi‘SMAPŽI‚ɃpƒPƒbƒg‚ð‘—‚éj
- mapif_send()’ljÁi“Á’èMAPŽI‚É‘—‚éF¶‘¶”»’è•t‚«j
- parse_frommap()‚Åinter_parse_frommap()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
- (interŽI‚ÌmapŽI‰ðÍ•”‚ðcharŽI‚ÉŠñ¶‚³‚¹‚½‚±‚Æ‚É‚È‚é)
- inter.h/inter.c
- V‹K’ljÁBinterŽI‚Ì’†ŠjB
- inter_parse_frommap‚ÅMAPŽI‚©‚ç‚̃pƒPƒbƒg‚ð‰ðÍ‚µ‚Ü‚·B
- int_party.h/int_party.c/int_guild.h/int_guild.c
- V‹K’ljÁB¡Œã‚Ì‚½‚ß‚Ì—\–ñBƒp[ƒeƒB‚âƒMƒ‹ƒh‹@”\—p
- init‚Ńf[ƒ^‚ð“Ç‚ñ‚ÅAsave‚Å•Û‘¶‚·‚ׂ«H
- save‚Í‚Ü‚¾ŒÄ‚΂ê‚È‚¢Bparse‚ŃpƒPƒbƒg‰ðÍB
- common/mmo.h‚ ‚½‚è‚Ńp[ƒeƒB[‚âƒMƒ‹ƒh‚Ì\‘¢‘Ì‚ð
- ’è‹`‚·‚é•K—v‚ª‚ ‚é‚ÆŽv‚í‚ê‚éB
- INTERŽIƒpƒPƒbƒg.txt
- ƒpƒPƒbƒg‚̃ŠƒXƒg
-
- (map/)
- intif.h/intif.c
- interŽI‚Æ’ÊM‚·‚é•”•ªB
- inter_parse()‚ÅinterŽI‚©‚ç‚̃pƒPƒbƒg‚ð‰ðÍ‚µ‚Ü‚·B
- interŽI‚Öƒf[ƒ^‚ð‘—‚é‚Æ‚«‚Íinter_fd‚ðŽg‚¢‚Ü‚·B
- chrif.h/chrif.c
- chrif_parse()‚Åinter_parse()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
- iintif.c‚ÌinterŽI‰ðÍ•”‚ðcharŽI‰ðÍ•”‚ÉŠñ¶‚³‚¹‚½‚±‚Æ‚É‚È‚é)
-
-E@kamiƒRƒ}ƒ“ƒh‚ðinterŽIŒo—R‚É•ÏX
- Œ´—‚Æ‚µ‚Ä‚ÍŽŸ‚̂悤‚ÈŠ´‚¶‚Å‚·
- ƒNƒ‰ƒCƒAƒ“ƒg„mapŽI„interŽI„‘SmapŽI„‘SƒNƒ‰ƒCƒAƒ“ƒg
-
- (char/)
- inter.c
- mapif_GMmessage()’ljÁ
- (map/)
- intif.h/intif.c
- intif_GMmessage()’ljÁ
- intif_parse‚ÅGMƒƒbƒZ[ƒW‚̈—‚ð’ljÁ
- clif.c/clif.h
- clif_GMmessage()‚̈ø”‚ð•ÏX
- atcommand.c
- @kami•”•ª‚Åintif_GMmessage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
-
-EWis‚ðinterŽIŒo—R‚É•ÏX
- Œ´—‚Æ‚µ‚Ä‚ÍŽŸ‚̂悤‚ÈŠ´‚¶‚Å‚·
-
- ‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg„‘—‚èŽåmapŽI„interŽI„‘Sƒ}ƒbƒvŽI„(•ªŠòA)
- [•ªŠòA]
- 1.‘ŠŽè‚Ìl‚¢‚émapŽI„‘ŠŽè‚̃Nƒ‰ƒCƒAƒ“ƒg
- @@@@V@@ @„interŽI„‘—‚èŽåmapŽI„‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg
- 2.‘ŠŽè‚Ì‚¢‚È‚¢mapŽI„interŽIi•ªŠòBj
- [•ªŠòB]
- 1.‘SmapŽI‚ª‰ž“š‚µ‚½interŽI „‘—‚èŽåmapŽI„‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg
- 2.(‘S•”‚͉ž“š‚µ‚Ä‚È‚¢‚Æ‚«‚ÍA‘SmapŽI‚̉ž“š‚ð‘Ò‚Â)
-
- ‚à‚Ì‚·‚²‚¢•¡ŽG‚É‚È‚Á‚Ä‚Ü‚·‚ËB
-
- (char/)
- inter.c
- struct WisList ’è‹`iWisƒf[ƒ^‚̃Šƒ“ƒNƒŠƒXƒgj
- add_wislist(),del_wislist(),search_wislist(),
- check_ttl_wislist()’ljÁ,ƒŠƒ“ƒNƒŠƒXƒg‚ðˆµ‚¤ŠÖ”ŒQ
- mapif_wis_message(),mapif_wis_end()’ljÁ
- (map/)
- intif.h/intif.c
- intif_wis_message(),intif_wis_end()’ljÁ
- intif_parse_WisMessage()’ljÁ,intif_parse()‚©‚çŒÄ‚΂ê‚é‚悤‚É
- clif.c/clif.h
- clif_wis_message(),clif_wis_end()’ljÁ
- clif_parse_Wis()‚ð•ÏX,intif_wis_message()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
-
-EƒXƒLƒ‹Žg—pŽž‚̃qƒbƒg”/Á”ïSPŠ“¾‚̃oƒOC³
- skill.c
- skill_get_sp(),skill_get_num()‚ÅŽQÆ‚·‚é”z—ñƒCƒ“ƒfƒbƒNƒX‚ðlv-1‚É‚µ‚½
-
-
-----------
-//0216 by ŒÓ’±—–
-
-‚¢‚‚à‚Ç‚¨‚èƒeƒXƒg‚Ù‚Æ‚ñ‚Ç‚µ‚Ä‚È‚¢‚Ì‚ÅAƒoƒO‘å—Ê‚©‚àB
-
-E0213‚ÌC³H‚Ì‚æ‚­‚í‚©‚ç‚È‚¢‚Æ‚±‚ëC³
- itemdb.c
- ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚ç‚È‚¢‚Ì‚Åitemdb_equipoint‚̈ø”ƒŠƒXƒg•ÏX
-
-EAthena dev 2.1.1‚Ì“K—p
- dev-2.1.1‚Å“K—p‚³‚ꂽC³‚ð“K—p‚µ‚Ü‚µ‚½
-
- timer.c
- 2.1.1‚Ì‚à‚Ì‚Æ·‚µ‘Ö‚¦
- script.c
- C_NE: ‚ÌC³‚Ì“K—p
- README
- ÅŒã‚Ì•¶Í‚ð2.1.1‚Ì‚à‚Ì‚É·‚µ‘Ö‚¦
-
-EƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ÌC³
- ˆê•”‚ÌÁ”ïSP‚âƒqƒbƒg”‚È‚Ç‚ðC³B
-
- skill_db.txt
- ŠY“–ŒÂŠ‚ÌC³
-
-EƒXƒLƒ‹UŒ‚‚ÌŽÀ‘••ÏX•’ljÁŽÀ‘•
- ƒoƒbƒVƒ…Aƒƒ}[ƒiƒCƒgAƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒOAƒsƒA[ƒX
- ƒXƒsƒAƒu[ƒƒ‰ƒ“AƒXƒsƒAƒXƒ^ƒuAƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…
- ƒ\ƒjƒbƒNƒuƒ[AƒOƒŠƒ€ƒgƒD[ƒX ‚È‚Ç‚ÌŽÀ‘••ÏX
-
- ƒiƒp[ƒ€ƒr[ƒgAƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒNA
- ƒtƒ@ƒCƒ„[ƒ{ƒ‹ƒgAƒR[ƒ‹ƒhƒ{ƒ‹ƒgAƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒgAƒA[ƒXƒXƒpƒCƒNA
- ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[ ‚È‚Ç‚ð’ljÁŽÀ‘•
- i‘S‚ÄA”͈ÍUŒ‚‚âƒXƒe[ƒ^ƒXˆÙí‚È‚Ç‚Í–¢ŽÀ‘•j
-
- pc.c/pc.h
- 0213‚Ì•ÏX‚ð‚È‚©‚Á‚½‚±‚Æ‚É‚µ‚½
- pc_attack_mob()‚ÌC³AŒvŽZ‚Íbattle_calc_weapon_attack()‚É”C‚¹A
- ‚»‚ÌŒvŽZŒ‹‰Ê‚ð“K—p‚·‚邾‚¯‚É•ÏX
- clif.c/clif.h
- clif_skill_fail(),clif_skill_damage(),clif_skill_damage2()’ljÁ
- ‚»‚ꂼ‚êŽg—pŽ¸”sAŽg—pƒGƒtƒFƒNƒgA‚«”ò‚΂µ•t‚«Žg—pƒGƒtƒFƒNƒg
- skill.c/skill.h
- 0213‚Ì•ÏX‚ð‚È‚©‚Á‚½‚±‚Æ‚É‚µ‚½iƒ_ƒ[ƒW”{—¦ŒvŽZ‚ª‚¨‚©‚µ‚¢j
- skill_castend_id()‚ÉSP/ZenyŠm”F‚ÆÁ”ï•”•ª‚ð’ljÁA
- Ží—ޕʂɈ—‚ð’ljÁB
- battle.c/battle.h
- V‹K’ljÁ
- •ŠíUŒ‚ŒvŽZ—p‚Ébattle_calc_weapon_attack(),
- –‚–@UŒ‚ŒvŽZ—p‚Ébattle_calc_magic_attack()‚ð—pˆÓ
- i‘o•û‚Æ‚àAMOB‚ÆPC—¼•ûŒvŽZ‰Â”\‚È‚Í‚¸j
- ƒtƒ@ƒCƒ‹‘‚₵‚·‚¬‚Æ‚¢‚¤ˆÓŒ©‚àc(Š¾)
-
-
-----------
-//0214 by ‚ê‚ 
-Eƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª‚¨‚©‚µ‚©‚Á‚½‚Æ‚±‚ë‚ðC³B
-EƒXƒLƒ‹‚̈ꕔŽÀ‘•
- ƒoƒbƒVƒ…Eƒƒ}[ƒiƒCƒgEƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒOEƒsƒA[ƒX
- ƒXƒsƒAƒu[ƒƒ‰ƒ“EƒXƒsƒAƒXƒ^ƒuEƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…
- ƒ\ƒjƒbƒNƒuƒ[EƒOƒŠƒ€ƒgƒD[ƒX‚È‚Ç‚Å‚·B
-
- “K“–‚È‚Ì‚Å‚Ç‚±‚©A•s‹ï‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- ‚ ‚ÆAƒeƒXƒg‚à‚ ‚܂肵‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚¨‚©‚µ‚¢‚Æ‚±‚낪‚ ‚Á‚½‚çC³‚ð‚¨Šè‚¢‚µ‚Ü‚·B
- ‘¼‚É‚à–â‘肪‚ ‚Á‚½‚çŽè’¼‚µ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
- •ÏX“à—e‚͈ȉº‚Ì’Ê‚è‚Å‚·B
-
- clif.c,clif.h
- clif_skill_damage()‚ð’ljÁ‚µ‚Ü‚µ‚½B
-
- pc.c,pc.h
- pc_attack_mob()‚̈ø”‚ðˆê‚’ljÁB
- ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª‚¨‚©‚µ‚©‚Á‚½‚̂ųí‚É“®ì‚·‚é‚悤‚ÉC³B
-
- skill.c
- ˆê•”ƒXƒLƒ‹‚ÌŽÀ‘•‚ð‚µ‚Ä‚Ý‚Ü‚µ‚½B
-
-
-----------
-//0213 by ‚ê‚ 
-E0208‚Ì—ƒRƒ}ƒ“ƒh‚Å­‚µC³
- atcommand.c
- @item‚Ō”Žw’肪–³‚¢ê‡A“üŽèŒÂ”‚ð‚PŒÂ‚É‚·‚é‚悤‚É‚µ‚½B
- @item‚ÅID‚ÌŽw’肪–³‚¢ê‡AƒAƒCƒeƒ€‚ð“üŽè‚µ‚Ä‚½‚±‚Æ‚É‚È‚Á‚Ä
- ‚¢‚½‚Ì‚ðC³
- itemdb.c
- item_db.txt‚ÅSell‚Ì€–Ú‚ð“X”„‚è‚Ì’l’i‚Æ‚µ‚Ä‚Ý‚½B
- item_db2.txt
- ŽŽ‚µ‚ɃJ[ƒh‚⃌ƒAƒAƒCƒeƒ€‚Ì“X”„‚艿Ši‚ð’l’i‚ð–{ŽI‚Ì‘Šê‚É‚µ
- ‚Ä‚Ý‚½‚à‚ÌBŽg—p‚·‚éꇂÍitem_db.txt‚Æ·‚µ‘Ö‚¦‚Ä‚­‚¾‚³‚¢B
-
-
-----------
-//0208 by nabe
-
-E—ƒRƒ}ƒ“ƒhŽÀ‘•B
- atcommand.h,atcommand.c
- ‚Ù‚ÚI-Athena‚Ì—ƒRƒ}ƒ“ƒh‘Š“–‚Å‚·‚ªA@GM‚ÆPVP‚Í–¢ŽÀ‘•‚Å‚·B
- help.txt‚à“¯«‚µ‚Ä‚¢‚Ü‚·B
- GMiƒAƒJƒEƒ“ƒgID704554`704583jê—p‚É‚·‚é‚É‚ÍA
- atcommand.c‚ÌŠY“–•”•ª‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ‚µ‚ĉº‚³‚¢B
- clif.h,clif.c
- clif_displaymessage()
- clif_GMmessage()
- clif_heal()
- clif_resurrection()
- clif_pvpon()
- clif_pvpset()
- clif_refine()
- ‚ð’ljÁ‚µ‚Ü‚µ‚½B
- clif_parse_GlobalMessage()“à‚Åatcommand()‚ðŒÄ‚ñ‚Å‚¢‚Ü‚·B
-
-E‚¿‚å‚Á‚Æ‚¾‚¯C³B
- script.c
- {buildin_openstorage,"openstorage","s"},
- ‚©‚ç
- {buildin_openstorage,"openstorage",""},
- ‚ÉC³‚µ‚Ü‚µ‚½B
-
-
-----------
-//0206 by ŒÓ’±—–
-EƒXƒLƒ‹ƒcƒŠ[/ƒXƒLƒ‹Žg—p‹@\‚ÌŽÀ‘•
- mmo.h
- MAX_SKILL‚ð‘‚₵‚½
- char2.c
- mmo_char_fromstr()
- mmo_charstatus‚Ìskill‚̃Cƒ“ƒfƒbƒNƒX‚ɃXƒLƒ‹”Ô†‚ðŽg‚¤‚悤‚É‚µ‚½
- =>ƒXƒLƒ‹‚ÌŒŸõ‚‘¬‰»‚Ì‚½‚ßi‚©‚í‚è‚Ƀƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚éj
- pc.h/pc.c
- pc_skillup(),pc_calc_skilltree()’ljÁ
- pc_checkskill()•ÏXiƒCƒ“ƒfƒbƒNƒX‚ðƒXƒLƒ‹”Ô†‚Éj
- pc_readdb()‚Åskill_db.txt‚à“ǂނ悤‚É‚µ‚½
- pc_authok()‚Åcast_timer‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½
- pc_calcstatus()‚Åpc_calc_skilltree()‚Æclif_skillinfoblock()‚ð
- ŒÄ‚Ԃ悤‚É‚µ‚½
- clif.c/clif.h
- clif_skillinfoblock(),clif_skillcasting(),
- clif_skillup()‚ð’ljÁ
- clif_parse_SkillUp(),clif_parse_UseSkillToId(),
- clif_parse_UseSkillToPos()‚ðŽÀ‘•
- skill.h/skill.c
- ƒtƒ@ƒCƒ‹’ljÁ(map/)
- map.h
- struct map_session_data‚Écast_*‚ð’ljÁ
- skill_db.txt
- ƒtƒ@ƒCƒ‹’ljÁ(db/)
- (I-Athena0200‚Ìskill_info2.txt‚ðƒRƒ“ƒo[ƒg‚µ‚½‚à‚Ì)
- (ƒXƒLƒ‹Žg—p•”•ªŠJ”­ŽÒŒü‚¯î•ñ)
- ƒXƒLƒ‹‚ÌŒø‰Ê‚ðŽÀ‘•‚·‚éꊂÍskill.c‚Ì
- skill_castend_id(),skill_castend_pos()‚Å‚·B
- ƒ^[ƒQƒbƒg‚âŽg—pƒXƒLƒ‹‚Í sd->cast_* ‚©‚瓾‚Ü‚·
- ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚Ö‚Í skill_get_* ‚ŃAƒNƒZƒX‚µ‚Ä‚­‚¾‚³‚¢
- ¡ŒãAƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚àƒf[ƒ^ƒx[ƒX‚É“ü‚ê‚é—\’è
-
-----------
-//0205 by nabe
-
-Estorage.c‚̃oƒOƒtƒBƒNƒXB
-E‘qŒÉƒf[ƒ^‚ðAƒ}ƒbƒvŽI‹N“®Žž‚É“Ç‚ÝAƒ}ƒbƒvŽII—¹Žž‚É‘‚­‚悤‚É•ÏXB
- storage.h,storage.c
- storage_init()‚ðdo_init_storage()‚ɉü–¼B
- storage_save()‚ðdo_final_storage()‚ɉü–¼B
- fclose‚ð–Y‚ê‚Ä‚¢‚½‚Ì‚ð’ljÁB
- map.c
- #include "storage.h"‚ð’ljÁB
- do_final()‚Édo_final_storage()‚ð’ljÁB
- do_init()‚Édo_init_storage()‚ð’ljÁB
-
-----------
-
-//0203(unofficial) by ‚È‚Ý
-
-item_db.txt‚Ì‘‚«Š·‚¦‚Ì‚Ý‚Å‚·B
-
-EƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ð’ljÁ/•ÏX
- Ôƒ|[ƒVƒ‡ƒ“@@@@@@@@@HP 30- 44
- gƒ|[ƒVƒ‡ƒ“@@@@@@@@@HP 70- 89
- ‰©F‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@HP 175-234
- ”’‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@@HP 350-429
- ‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@@SP 40- 99
- Ô‚¢ƒn[ƒu@@@@@@@@@@HP 12- 19
- ‰©F‚¢ƒn[ƒu@@@@@@@@@HP 21- 29
- ”’‚¢ƒn[ƒu@@@@@@@@@@HP 80-111
- ‚¢ƒn[ƒu@@@@@@@@@@SP 15- 44
- ƒŠƒ“ƒS@@@@@@@@@@@@HP 12- 15
- ƒoƒiƒi@@@@@@@@@@@@HP 11- 16
- ƒuƒhƒE@@@@@@@@@@@@SP 10- 24
- ‚¢‚à@@@@@@@@@@@@@HP 11- 15
- ‚É‚­@@@@@@@@@@@@@HP 70- 99
- ƒnƒ`‚Ì–¨@@@@@@@@@@@HP 72- 97 / SP 20- 59
- ƒ~ƒ‹ƒN@@@@@@@@@@@@HP 25- 34
- ƒLƒƒƒ“ƒfƒB@@@@@@@@@@HP 31- 74
- ƒXƒeƒBƒbƒNƒLƒƒƒ“ƒfƒB@@@@@HP 46-109
- ƒŠƒ“ƒSƒWƒ…[ƒX@@@@@@¦@HP 28- 32
- ƒoƒiƒiƒWƒ…[ƒX@@@@@@@@HP 27- 33
- ƒuƒhƒEƒWƒ…[ƒX@@@@@@@@SP 15- 39
- ƒjƒ“ƒWƒ“ƒWƒ…[ƒX@@@@@¦@HP 29- 32
- ƒJƒ{ƒ`ƒƒ@@@@@@@@@@@HP 14
- ƒyƒbƒgƒt[ƒh@@@@@@@@@HP 53- 83
- ‚æ‚­Ä‚¢‚½ƒNƒbƒL[@@@@@@HP 80-177
- ‚ЂƂ­‚¿ƒP[ƒL[@@@@@@@HP 251-359
- ‚ЂȂ ‚ç‚ê@@@@@@@@@@HP 175-234
- •H–Ý@@@@@@@@@@@@@HP 350-429
- ƒŒƒbƒhƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@@¦@HP 30- 44
- ƒCƒGƒƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@@¦@HP 175-234
- ƒzƒƒCƒgƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@¦@HP 350-429
-@Œ»Ý‚ÌAthena‚Å‚ÍVIT‚âƒXƒLƒ‹‚É‚æ‚éƒ{[ƒiƒX‚͉Á–¡‚³‚ê‚Ü‚¹‚ñB
-@i“K—p‚·‚éꇂÍscript.c“à‚Ìbuildin_healŠÖ”‚ ‚½‚è‚É‚ÉŽè‚ð‰Á‚¦‚é•K—v‚ ‚èj
-@‚È‚¨A¦•t‚̃AƒCƒeƒ€‚̃f[ƒ^‚Í“K“–‚Å‚·B
-EŒÃ‚¢ƒJ[ƒh’Ÿ‚ðŽÀ‘•(UseScript)
-E‚»‚Ì‘¼C³
-@@‚ЂȂ ‚ç‚ê@@@@@@@@@@d—Ê‚È‚µ¨d—Ê0.1‚ÉC³
-@@•H–Ý@@@@@@@@@@@@@d—Ê‚È‚µ¨d—Ê0.1‚ÉC³
-@@ƒoƒ‹ƒ€ƒ“@@@@@@@@@@@d—Ê0.1S4•ÐŽèŒ•¨d—Ê100S0—¼ŽèŒ•‚ÉC³
-@‚È‚¨ASell‚Ì€–Ú‚Í‚ ‚邾‚¯–³‘Ê‚Á‚Û‚¢‚Ì‚Å‘S•”Á‚µ‚Ü‚µ‚½B
-
-----------
-
-//0202 by nabe
-
-EƒJƒvƒ‰‘qŒÉ‚Ìu“¯ˆêƒAƒJƒEƒ“ƒg‚È‚Ì‚É‹¤—L‚Å‚«‚È‚¢ƒoƒOv‚ð‰ü—Ç‚µ‚Ü‚µ‚½B
- ŠeƒLƒƒƒ‰‚É‘qŒÉƒf[ƒ^‚ðŽ‚½‚¹‚é‚Ì‚Í–³‘Ê‚ª‘½‚¢‹C‚ª‚·‚é‚Ì‚ÅA
- ƒAƒJƒEƒ“ƒgID‚ÅŠÇ—‚·‚é‚悤‚ÉŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½B
- ‚‚¢‚Å‚ÉA‘qŒÉƒf[ƒ^‚Í‘S‚Ästorage.c‚Å‚Ü‚©‚È‚¢A
- charŽI‚ÍŠÖ—^‚µ‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
- ‚±‚ê‚É”º‚¢Achar_athena.cnf,mmo.h,char2.c‚ÍŒ³‚É–ß‚µ‚Ü‚µ‚½B
- ‚Ü‚½A‘qŒÉƒtƒ@ƒCƒ‹–¼‚Ígstorage.txth‚ɌŒ肵‚Ä‚¢‚Ü‚·B
-
- ‰ü•ÏA’ljÁ‚µ‚½‚Ì‚ÍŽŸ‚̃tƒ@ƒCƒ‹‚Å‚·B
- map/storage.h,
- map/storage.c,
- map/clif.h,//ˆø”•ÏX‚¾‚¯
- map/clif.c,//ˆø”•ÏX‚¾‚¯
- conf/char_athena.cnf,//Œ³‚É–ß‚µ‚½‚¾‚¯
- common/mmo.h,//Œ³‚É–ß‚µ‚½‚¾‚¯
- char/char2.c,//Œ³‚É–ß‚µ‚½‚¾‚¯
- map/itemdb.h,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
- map/itemdb.c,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
- map/pc.c,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
-
-----------
-
-//0201 by nabe
-
-EƒJƒvƒ‰‘qŒÉ‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
-
- ƒXƒNƒŠƒvƒg‚©‚çŒÄ‚Ño‚·‚É‚ÍAƒXƒNƒŠƒvƒg“à‚Å
- openstorage;
- ‚Æ‚µ‚Ä‚­‚¾‚³‚¢B
- ƒTƒ“ƒvƒ‹‚Æ‚µ‚Änpc_kafraJ.txt‚ð•t‚¯‚Ä‚ ‚è‚Ü‚·B
- •¹‚¹‚Änpc_script3J.txt‚ÌŠY“–•”•ª‚à‰ü•Ï‚µ‚Ü‚µ‚½B
-
- char_athena.cnf‚Ì
- stor_txt:
- ‚Å‘qŒÉƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ä‚¢‚Ü‚·B
-
- ‰ü•ÏA’ljÁ‚µ‚½‚Ì‚ÍŽŸ‚̃tƒ@ƒCƒ‹‚Å‚·B
- map/Makefile,
- map/storage.c,
- map/storage.h,
- map/clif.c,
- map/clif.h,
- map/script.c,
- char/char2.c,
- common/mmo,h
- Ú‚µ‚­‚ÍAã‹Lƒtƒ@ƒCƒ‹‚̃Rƒƒ“ƒg‚È‚Ç‚ðŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢B
-
-EƒJƒvƒ‰‘qŒÉŽÀ‘•‚É”º‚¢Amap_athena1.cnf‚ð­‚µ‘‚«Š·‚¦‚Ü‚µ‚½B
-
-E‘S‚ẴRƒƒ“ƒg•¶‚ðEUC‚©‚çSJIS‚É•ÏŠ·‚µ‚Ü‚µ‚½B
-
-----------
-
- Athena Dev. v2.1.1 Released: Middle July, 2003
- (c) 2003 Athena Project.
- http://project-yare.de/
-
-1. Athena(ƒAƒeƒi)‚ɂ‚¢‚Ä
-2. ‚±‚̃ŠƒŠ[ƒX‚ɂ‚¢‚Ä
-3. •K—v‚È•¨
-4. Žg‚¢•û
-5. Œ»Ý‚ÌŽd—l
-6. jŽ«
-7. –ÆÓŽ–€
-8. •åW
-9. English
-
-
-1. ƒAƒeƒi‚ɂ‚¢‚Ä
- ƒAƒeƒi‚Æ‚Í2003”N1ŒŽ”¼‚΂ɂł½0052.lzh‚ðƒx[ƒX‚Æ‚µ‚Äì‚ç‚ê‚Ä‚¢‚éƒGƒ~ƒ…ƒŒ[ƒ^‚̈ê‚‚ł·B
- Šî–{“I‚ȃ‰ƒCƒZƒ“ƒX‚̓IƒŠƒWƒiƒ‹‚ªGPL‚̉º‚É”z•z‚³‚ê‚Ä‚¢‚éˆ×A
- ‚±‚ê‚É]‚¢GPL‚̉º”z•z‚ð‹–‰Â‚µ‚Ü‚·B
- /*
- ‰ü—ǔłð”z•z‚·‚éꇂ͕K‚¸‚±‚ÌREADME‚ð‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
- ‰½ˆ‚ð‰ü—Ç‚µ‚½‚Ì‚©•ñ(athena@project-yare.de‚Ü‚Å)‚µ‚ĖႦ‚é‚Æ•‚©‚è‚Ü‚·B
- ƒoƒCƒiƒŠ‚Ì‚Ý‚Ì”z•z‚ÍGPLˆá”½‚Å‚·‚Ì‚Å"•K‚¸"ƒ\[ƒX‚à“Y•t‚µ‚Ä‚­‚¾‚³‚¢B
- */
- “®ì‚ÌŠm”F‚͈ȉº‚Ì’Ê‚è‚Ì‚Ýs‚Á‚Ä‚¢‚Ü‚·B
- // ‚½‚¾‚µŠ®àø‚É“®‚­Ž–‚ð•ÛØ‚·‚é‚à‚Ì‚Å‚ ‚è‚Ü‚¹‚ñ
- ‘ÎÛCPU: Intel PentiumŒn // PentiumIIˆÈã‚ÅŠm”F.
- FreeBSD 4.8R, 4.6.2R
- Linux RedHat 7.3
- cygwin + gcc 3.2 20020927 (prerelease)
- ŠJ”­Œ³URL: http://project-yare.de/
-
-
-2. ‚±‚̃ŠƒŠ[ƒX‚ɂ‚¢‚Ä
- ¡‰ñ‚̃ŠƒŠ[ƒX‚Í‘O‰ñ(V2.1)“¯—lŠJ”­”ł̃ŠƒŠ[ƒX‚Ì‚Ý‚Å‚·B
- 2.1‚É”ä‚׉º‹L‚Ì“_‚ªC³‚³‚ê‚Ä‚¢‚Ü‚·B
- map‚̃fƒtƒHƒ‹ƒgݒ肪ŠØ‘data.grf‚̂ݳí‚É“®ì‚·‚é‚悤‚É‚È‚Á‚Ä‚¢‚½“_
- common/timer.c‚âmap/script.c‚ÌŠô‚‚©‚̃oƒO
-
- v‘¬‚ÉUpdate‚ð‹­‚­„§‚·‚é‚à‚Ì‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªŠeŽ©‚Ì”»’f‚Ås‚Á‚ĉº‚³‚¢B
-
-
-3. •K—v‚È•¨
- data.grf //sdata.grf‚Í•K—v‚ɉž‚¶‚Ä
- account.txt //‘¶Ý‚µ‚È‚¢ê‡athena.sh‚ªŽ©“®¶¬‚µ‚Ü‚·
- conf/*.cnf //Map—p‚ÆChar—p‚Ì“ñŽí—Þ‚ ‚è‚Ü‚·
- conf/npc*.txt //npcÝ’è—pƒtƒ@ƒCƒ‹‚Å‚·B•¡”‚̃tƒ@ƒCƒ‹‚É•ª‚¯‚邱‚Æ‚ª‰Â”\‚Å‚·B
- db/*.txt //ƒAƒCƒeƒ€Ajobî•ñ‚È‚Ç
-
-
-4. Žg‚¢•û
- > tar xvfz athena-d?.?.tar.gz
- > cd athena-d?.?.tar.gz
- > make
- > vi conf/char_athena.cnf //IP(127.0.0.1)‚Ì•”•ª‚ðŠÂ‹«‚ɇ‚킹‚Ä•ÏX‚µ‚Ä‚­‚¾‚³‚¢
- > vi conf/map_athena.cnf //“¯ãA‚Ü‚½mapÝ’è‚È‚Ç‚ÍA‚±‚̃tƒ@ƒCƒ‹‚Ås‚¢‚Ü‚·B
- > ./athena.sh
- ã‹L‚ðs‚¦‚Î"‚½‚Ô‚ñ"‹N“®‚µ‚Ü‚·B
-
- •â‘«:
- conf/npc_sampleJ.txt‚ɂ̓XƒNƒŠƒvƒg‚Ì‘‚«•û‚ɂ‚¢‚ÄFX‚Èà–¾‚ª‹LÚ‚³‚ê‚Ä‚¢‚Ü‚·B
- ‚à‚µA“ÆŽ©‚ÌMapÝ’è‚ðs‚Á‚Ä‚Ý‚½‚¢l‚âAƒXƒNƒŠƒvƒg‚ð˜M‚肽‚¢•û‚ÍŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢B
- ‚½‚¾‚µAŠJ”­’†‚Ì‚½‚߃XƒNƒŠƒvƒg‚ÌŽd—l‚ª•ÏX‚³‚ê‚é‰Â”\«‚ª‚‚¢‚Å‚·B
- command.txt‚É‚ÍŽÀ‘•Ï‚Ý‚Ì“ÁŽêƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Ìà–¾‚ð‹LÚ‚µ‚Ä‚¢‚Ü‚·B
-
-
-5. Œ»Ý‚ÌŽd—l
- –{ŽI‚Æ”ä‚ׂè‚©‚µ‚¢(—Ⴆ‚΃vƒo‚ª•à‚­Aƒ|ƒŠƒ“‚ªƒAƒCƒeƒ€‚ðE‚í‚È‚¢‚È‚Ç)“_‚ÍA
- ‘S‚ÄŒ»ÝŠJ”­’†‚Ɉö‚é‚à‚Ì‚Å‚·B
- Œ»ó‚Æ‚µ‚ăLƒƒƒ‰ƒNƒ^Œn‹y‚у‚ƒ“ƒXƒ^[Œn‚̃oƒO•ñ‚Í–³Ž‹‚³‚ê‚é‰Â”\«‚ª‚‚¢‚Å‚·B
-
- ƒoƒO•ñ‚ɂ‚¢‚Ä•K‚¸”­¶ðŒ‚ð‚¨‘‚«‰º‚³‚¢B
- ‰º‚É‚ ‚é•ñ—pƒeƒ“ƒvƒŒ[ƒg‚ðŽg‚Á‚Ä•ñ‚µ‚Ä’¸‚­‚Æ•‚©‚è‚Ü‚·B
- •ñæ‚̓Gƒ~ƒ…”‚̊J”­ƒXƒŒ‚É‚Å‚àB
- ---- Athena v 2.0 (stable or develop) ----
- ygcc verzgcc -v‚ðŽÀsŽž‚É•\Ž¦‚³‚ê‚é“à—e
- y“®ìƒVƒXƒeƒ€zFreeBSD, Linux(ƒfƒBƒXƒgƒŠƒrƒ…[ƒWƒ‡ƒ“‚à), cygwin‚È‚Ç
- y”­¶“à—ezmap‚ª—Ž‚¿‚Ä‚µ‚Ü‚Á‚½Žž‚Ì•\Ž¦‚³‚ê‚Ä‚¢‚½ƒfƒoƒbƒOî•ñ‚È‚Ç‹ï‘Ì“I‚É‘‚¢‚Ä‚­‚¾‚³‚¢B
- y‘€ì“à—ez‹ï‘Ì“I‚É‚Ç‚ñ‚È‘€ì‚ðs‚Á‚½‚©‚ð‘‚¢‚Ä‚­‚¾‚³‚¢B
- ------------------ END -------------------
- —‘z‚̓eƒ“ƒvƒŒ‚ɉÁ‚¦‚Ämap.core‚È‚Çcoreƒtƒ@ƒCƒ‹‚ðUploader‚ɃAƒbƒv‚µ‚Ä’¸‚­‚±‚Æ‚Å‚·‚ª
- –â‘è‚ÌMap‚¾‚¯‚Ìó‘Ô‚É‚µcore‚Ì“f‚­—e—Ê‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- /*
- Šm”F‚µ‚½ŒÀ‚è‚Å‚Í324ŒÂ‚Ù‚Çmapƒf[ƒ^‚ð“Ç‚Ýž‚Ü‚¹‚é‚ÆA
- 40MB‹ß‚¢coreƒtƒ@ƒCƒ‹‚ð“f‚«o‚µ‚Ü‚· @FreeBSD
- cygwin‚ÌꇂÍstackdump‚Æ‚¢‚¤ƒtƒ@ƒCƒ‹‚É‚È‚é‚»‚¤‚Å‚·B
- ‚µ‚©‚µAcoreƒtƒ@ƒCƒ‹‚È‚Ç‚ðgzipˆ³k‚È‚Ç‚·‚ê‚Α啂ɬ‚³‚­‚È‚è‚Ü‚·B
- ‘å–}30MB‚Ìcoreƒtƒ@ƒCƒ‹‚ª2.9MB‚Ù‚Ç‚É‚È‚é‚悤‚Å‚·B
- ‚Å‚·‚Ì‚ÅA‚à‚µƒAƒbƒvƒ[ƒh‚·‚éꇂÍgzipˆ³k‚È‚ÇŠeŽ©s‚Á‚Ä‚­‚¾‚³‚¢B
- */
-
- ¡‰ñ‚̃ŠƒŠ[ƒX‚¾‚¯‚Å‚È‚­HISTORY‚ð쬂·‚é‚Æ‘å—Ê‚É‹Lq‚ª•K—v‚Ȉ×È—ª‚µ‚Ä‚¢‚Ü‚·B
- // ‘½‚¢“ú‚¾‚Æ–{“–‚ÉŒ‹\‚ ‚è‚Ü‚·‚Ì‚ÅddB
-
-
-6. jŽ«
- ¡‰ñ‚±‚ÌAthenaŠJ”­”Å‚ðo‚·‚É“–‚½‚Á‚ÄŠ´ŽÓ‚µ‚½‚¢•ûX(‡”Ô•s“¯)
- LemmingŽ (Project YARE)
- 0052Ž (Uploader)
- 35Ž (ƒGƒ~ƒ…ŠJ”­ƒXƒŒ)
- Johan LindhŽ(Author of memwatch)
- YARE forum‚ÌNPCî•ñ‚ð쬂µ‚½•ûX
- weissŒ¤‹†‰ïBBS‚Ì—lX‚Èî•ñƒtƒ@ƒCƒ‹‚ð쬂µ‚½•ûX
- ÅŒã‚ÉA.coreƒtƒ@ƒCƒ‹’B
-
-
-7. –ÆÓŽ–€
- Athena Project‚͈êØAthena‚Ì“®ì‚ÉŠÖ‚·‚é•ÛØ“™‚Ís‚¢‚Ü‚¹‚ñB
- ‚‚܂èAAthena‚Í–³•ÛØ‚Å‚·B
- athena@project-yare.de‚É“®ìE‘€ì“™‚ÉŠÖ‚·‚鎿–â‚È‚Ç‚ð‘—‚ç‚ê‚Ä‚àˆêØ‚¨“š‚¦‚Å‚«‚Ü‚¹‚ñB
- –”Athena‚ð—p‚¢‚½‚±‚Æ‚É‚æ‚趂¶‚½”íŠQE–â‘è“™‚ÌÓ”C‚͈êØAthena Project‚Í•‰‚¢‚Ü‚¹‚ñB
-
-
-8. •åW
- athena‚ÌŠJ”­‚ÉŽQ‰Á‚µ‚½‚¢//‹»–¡‚ª‚ ‚é‚Æ‚¢‚¤•û‚²˜A—‰º‚³‚¢B
- ‰äX‚Í‹M•û‚ÌŽQ‰Á‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·B
- // ÅV”Å‚ª—~‚µ‚¢‚¾‚¯‚ʼn½‚狦—Í‚µ‚Ä’¸‚¯‚È‚¢‚Æ‚¢‚¤•û‚Í‚¨’f‚è‚Å‚·;-)
- [•åW—v€: ƒvƒƒOƒ‰ƒ}(2-3l)]
- ”N—î: •s–â
- «•Ê: •s–â
- Œ¾Œê: “ú–{Œê‚ª—‰ð‰Â”\
- “à—e: CŒ¾Œê‚à‚µ‚­‚ÍC++‚É‚æ‚éŠJ”­B(“Á‚Ƀlƒbƒgƒ[ƒN‚âDB‚ÌŒoŒ±‚ª—L‚é•û‘å•åW!)
- [•åW—v€: –|–ó(?l)]
- ”N—î: •s–â
- «•Ê: •s–â
- Œ¾Œê: “ú–{ŒêA‰pŒê‚ª—‰ð‰Â”\
- “à—e: •§—–¼ŒêA“ƈíŒêA¼”ljåŒêAˆÉ‘¾—˜ˆŸŒêA‘×(ƒ^ƒC)ŒêA’©‘NŒêA’†‘Œê‚Ö•¶Œ£AƒTƒCƒg‚È‚Ç‚Ì–|–ó
- ˜A—æ: athena@project-yare.de ŽG–±’S“–‚Ü‚ÅB
-
-
-9. English
- This release is just fixed some bugs in timer.c, script.c and map_athena1.conf.
-
-
-(c) 2003 Athena Project.
+--------------------
+//1162 by pizza
+EƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒXEƒ\ƒEƒ‹ƒuƒŒ[ƒJ[E”­™¤Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ɂ‚¢‚Ä–{ŽI€‹’‚ÉC³
+
+ (db)
+ skill_db.txt
+ ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒXEƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚ÌŽË’ö
+ ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚ª‰r¥–WŠQ‰Â
+ skill_cast_db.txt
+ ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[‚̉r¥ŽžŠÔ
+
+ (src/map)
+ battle.c
+ ”­™¤Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ÌŒvŽZŽ®
+ ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚ªƒjƒ…ƒ}‚Å–³Œø‰»
+
+--------------------
+//1161 by Nameless
+
+EƒoƒCƒIƒvƒ‰ƒ“ƒg‚É‚æ‚颊Òmob‚ÌID‚ƃXƒLƒ‹‚ð–{ŽI€‹’‚ÉC³
+@¦ŒÄ‚Ño‚¹‚锂ɂ‚¢‚Ä‚Í‚Ü‚¾–¢ŽÀ‘•c
+
+ (db)
+ mob_avail.txt
+ ƒNƒ‰ƒCƒAƒ“ƒg‚É‚æ‚Á‚Ä”­¶‚·‚é‰Â”\«‚Ì‚ ‚éƒOƒ‰–â‘è‚Ì
+ Žb’è‘Ήž
+ mob_db.txt
+ ƒoƒCƒIƒvƒ‰ƒ“ƒg—pmob‚̃Xƒe‚ðˆê•”C³
+ mob_skill_db.txt
+ ƒoƒCƒIƒvƒ‰ƒ“ƒg—pmob‚ɃXƒLƒ‹‚ðC³
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: C³
+
+--------------------
+//1160 by Nameless
+
+E1158‚Ìfix
+@ƒtƒFƒAƒŠ[ƒt‚Ì”ñˆÚ“®‰»‚ƌĂÑo‚³‚ꂽMOB‚ÌHP‚ð‰º•ûC³
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: C³
+
+--------------------
+//1158 by ‚à‚Á‚³‚è
+EmobŒã‘ÞŽÀ‘• @Ž©•ª‚ªŒü‚¢‚Ä‚é•û‚Æ‚Í‹t‚Éskilllv‚Ì•ª‚®‚ç‚¢“®‚«‚Ü‚·
+ —£‚ê‚·‚¬‚éŒÄ‚Ñ–ß‚³‚ê‚È‚¢‚Ì‚ÅŽæ‚芪‚«ŒÄ‚Ñ–ß‚µ‚ðC³
+ IW‚̎΂߈ʒu‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³iƒoƒO•ñƒXƒŒƒbƒh part8 >>110)
+
+ (src/map)
+ skill.c ŒÄ‚Ñ–ß‚µC³AŒã‘ޒljÁAIWC³
+ skill.h
+ mob.c
+ map.h
+ (db)
+ skill_db.txt
+--------------------
+//1158 by Nameless
+
+EƒAƒ‹ƒPƒ~‚̃oƒCƒIƒvƒ‰ƒ“ƒg‚ðC³
+@ŠeLV‚É‚ ‚킹‚ÄAƒ}ƒ“ƒhƒ‰ƒSƒ‰Aƒqƒhƒ‰Aƒtƒ[ƒ‰AƒtƒFƒAƒŠ[ƒtAƒWƒIƒOƒ‰ƒtƒ@[
+@‚ðŒÄ‚Ño‚·‚悤‚É‚µ‚½
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: C³
+
+--------------------
+//1157 by eigen
+
+Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹‚ÌŽg—p‚ÅMAPŽI‚ª—Ž‚¿‚é•s‹ï‡‚ðC³
+
+ (src/map)
+ skill.c - skill_unit_onout() C³
+
+--------------------
+//1156 by eigen
+
+E¹‘Ì~•ŸŽg—pŽžAƒ‚ƒ“ƒN‚ªl”ƒJƒEƒ“ƒg‚³‚ê‚Ä‚¢‚È‚©‚Á‚½•s‹ï‡‚ðC³
+ithanks to –{ŽI‘ŠˆáƒXƒŒpart3 >>121Žj
+Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹‚ÌŒø‰Ê‚ªØ‚ê‚È‚©‚Á‚½•s‹ï‡‚ðC³
+
+ (src/map)
+ skill.c - skill_unit_onout(), skill_check_condition_char_sub() C³
+
+--------------------
+//1155 by latte
+EƒfƒBƒ{[ƒVƒ‡ƒ“‚ɉr¥ŽžŠÔ•t—^
+EƒTƒNƒŠƒtƒ@ƒCƒXF”{—¦C³‚ƃ{ƒX‚É—LŒø‚ÉB
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚̃GƒtƒFƒNƒg‚ÌC³
+
+ (db)
+ skill_cast_db.txt
+ skill_db.txt
+ (src/map)
+ battle.c
+
+--------------------
+//1154 by eigen
+
+Eƒo[ƒhƒ_ƒ“ƒT[ƒXƒLƒ‹Žg—p‚ÅMAPŽI‚ª—Ž‚¿‚é–â‘è‚ðC³
+EƒSƒXƒyƒ‹‚ÌŽÀ‘•
+Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÌŽd—l‚ð–{ŽI‚ɇ‚킹‚Ä•ÏX(‰Î‘®«’ljÁƒ_ƒ[ƒW‚Í–¢ŽÀ‘•‚Å‚·)
+
+ (db)
+ skill_cast_db.txt - ƒSƒXƒyƒ‹, ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÉŠÖ‚·‚éC³
+ skill_require_db.txt - ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ÉŠÖ‚·‚éC³
+ skill_unit_db.txt - ƒSƒXƒyƒ‹‚ÉŠÖ‚·‚éC³
+ (src/map)
+ battle.c - battle_calc_pet_weapon_attack(), battle_calc_mob_weapon_attack(),
+ battle_calc_pc_weapon_attack(), battle_calc_magic_attack() C³
+ clif.c - clif_parse_UseSkillToId(), clif_parse_UseSkillToId(),
+ clif_parse_WalkToXY(), clif_parse_ActionRequest(),
+ clif_parse_UseSkillToId(), clif_parse_UseSkillMap() C³
+ map.h - MAX_STATUSCHANGE‚Ì‘‰Á
+ pc.c - pc_natural_heal_sub() C³
+ skill.h - ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN, ƒSƒXƒyƒ‹‚ÉŠÖ‚·‚éó‘ÔˆÙíƒe[ƒuƒ‹’ljÁ
+ skill.c - skill_castend_damage_id(), skill_castend_nodamage_id(),
+ skill_unit_onout(), skill_unit_onplace_timer(),
+ skill_init_unit_layout() C³
+ status.c - status_change_start(), status_change_end() C³
+
+--------------------
+//1153 by ‚Û‚¦
+
+Eƒq[ƒ‹AƒTƒ“ƒN‚ÌC³
+@(ƒCƒrƒ‹ƒhƒ‹ƒCƒhC‘•”õ’†‚ÉPv,GvˆÈŠO‚¾‚ƃ_ƒ[ƒW‚ªo‚È‚¢‚悤‚ÉC³)
+@(ŠY“–PC‚Ƀq[ƒ‹‚ðŽg—p‚µ‚½ê‡SP‚¾‚¯Á”ï)
+E•ú’u‚³‚ê‚Ä‚éversion.h‚ÌXV
+ (src/map)
+ skill.c - skill_castend_id(),skill_unit_onplace_timer() C³
+ (src/common)
+ version.h - mod version 1153
+--------------------
+//1152 by p
+
+EzΔ­Œ©C³
+ (db)
+ item_db.txt - ŒÃ‚¢Šª•¨‚Ì getitem ”Ô†‚ð–ß‚µ
+ (src/map)
+ itemdb.c - zΔ­Œ©Žž¶¬ˆ—‚Ì•ÏX
+ mob.c - zΔ­Œ©ˆ—‚Ì•ÏX
+--------------------
+//1151 by p
+
+Eƒuƒ‰ƒbƒNƒXƒ~ƒXƒXƒLƒ‹zΔ­Œ©‚ÌŽÀ‘•(‰¼)
+ (conf)
+ battle_athena.conf - zΔ­Œ©—¦‚ÌŽw’è
+ (db)
+ item_findingore.txt - z΃hƒƒbƒv—¦‚ÌŽw’è
+ item_db.txt - ŒÃ‚¢Šª•¨‚Ì getitem ”Ô†•ÏX
+ (src/map)
+ itemdb.c - db/item_findingore.txt ‚Ì“Ç‚Ýž‚Ý‚Æ”­Œ©Žž¶¬
+ battle.h - Ý’è•ÛŽ—p‚Ì€–ڒljÁ
+ battle.c - Ý’è“Ç‚Ýž‚݈—’ljÁ
+ mob.c - zΔ­Œ©ˆ—’ljÁ
+
+--------------------
+//1150 by Theia
+
+Eƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ðjROŽd—l‚É•ÏX
+@(Š®‘S‚Å‚Í‚È‚¢‚̂ŕ⊮Šó–])
+EƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŒvŽZŽ®‚ð•ÏX
+@(¡‚Ü‚Å‚ÌŒvŽZŽ®‚¾‚Æ•K’†‚µ‚Ä‚¢‚½)
+ (db)
+ skill_cast.txt
+ skill_require_db.txt
+ (src/map)
+ skill.c - ƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Ì”­“®ðŒ‚ð•ÏX
+ battle.c - ƒxƒmƒ€ƒXƒvƒ‰ƒbƒVƒƒ[,ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚Ì”{—¦‚ð•ÏX
+
+--------------------
+//1149 by eigen
+
+Eˆê•”‚̃_ƒ“ƒT[ƒo[ƒhƒXƒLƒ‹‚̉‰‘tƒXƒLƒ‹ã‚©‚ço‚é‚ÆMAPŽI‚ª—Ž‚¿‚é•s‹ï‡‚ðC³
+
+ (src/map)
+ skill.c - skill_unit_onout() C³
+
+--------------------
+//1148 by eigen
+
+EƒXƒgƒŠƒbƒvƒXƒLƒ‹‚ª‰r¥’†’f‚³‚ê‚È‚¢‚悤•ÏX
+EƒXƒgƒŠƒbƒvƒXƒLƒ‹¬Œ÷—¦‚̃XƒLƒ‹ƒŒƒxƒ‹”äd‚ð5‚É•ÏX
+EƒoƒbƒNƒXƒ^ƒu‚ÌŽË’ö‚ð•Ší‚ÉŠÖŒW‚È‚­1‚É•ÏX
+EƒoƒbƒNƒXƒ^ƒuŽg—pŽžA‹|‚ð‘•”õ‚µ‚Ä‚¢‚é‚È‚çƒ_ƒ[ƒW”¼Œ¸‚É•ÏX
+EƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚ª‰r¥’†’f‚³‚ê‚é‚悤•ÏX
+EƒAƒVƒbƒhƒeƒ‰[Žg—pŒãA‘ŠŽè‚ÌŠZ‚ð”j‰ó‚·‚邱‚ƂɬŒ÷‚µ‚½ê‡ƒVƒ‡ƒbƒNƒGƒ‚‚ðo‚·‚悤•ÏX
+Eƒƒ‹ƒgƒ_ƒEƒ“‚Å”j‰ó‚Å‚«‚é‰ÓŠ‚ð•Ší‚ÆŠZ‚Ì‚Ý‚É•ÏX
+Eƒ_ƒ“ƒT[ƒo[ƒh‚̉‰‘tƒXƒLƒ‹”͈͊O‚Éo‚Ä‚àŒø‰Ê‚ª20•bŽ‘±‚·‚é‚悤•ÏX
+i‚½‚¾‚µŽ„‚ð–Y‚ê‚È‚¢‚łƇ‘tƒXƒLƒ‹‚Íœ‚­j
+E‘qŒÉ‚ÌÅ‘åŽû—e—Ê‚ð300‚É•ÏX
+iˆÈãthanks to –{ŽI‘ŠˆáƒXƒŒPart3 >>115Žj
+Eƒƒ‹ƒgƒ_ƒEƒ“ŠZ”j‰óŠm—¦‚ð0.7`7%‚É•ÏX
+
+ (db)
+ skill_db.txt - cast_cancelArange‚ÌC³
+ skill_unit_db.txt - (1148-fix‚ÌŽæ‚èž‚Ý)
+ (src/common)
+ mmo.h - MAX_STORAGE‚ð300‚É
+ (src/map)
+ battle.c - battle_calc_pc_weapon_attack() C³
+ skill.c - skill_additional_effect(), skill_castend_nodamage_id(),
+ skill_castend_damage_id(), skill_unit_onout() C³
+
+--------------------
+//1147 by eigen
+
+EƒCƒ“ƒfƒ…ƒAŽg—pŒãA10•bŒo‚½‚È‚¢‚ÆÄŽg—p‚Å‚«‚È‚¢‚悤•ÏX
+EƒV[ƒYƒ‚[ƒh‚ł̓Cƒ“ƒfƒ…ƒA‚ðŽg—p‚·‚é‚ÆMDEF‚ªã‚ª‚邾‚¯‚É•ÏX
+EŽc‰eŽg—pŒãA2•bŒo‚½‚È‚¢‚ƈ¢C—…‚ðŽg—p‚Å‚«‚È‚¢‚悤•ÏX
+
+ (src/map)
+ map.h - #define MAX_SKILL_ID, unsigned int skillstatictimer[MAX_SKILL_ID] ’ljÁ
+ clif.c - clif_parse_UseSkillToId(), clif_damage() C³
+ skill.c - skill_castend_nodamage_id(), skill_castend_pos2(), skill_use_id() C³
+ pc.c - pc_setnewpc(), pc_authok() C³
+ status.c - status_get_dmotion() C³
+ battle.c - battle_calc_damage() C³
+
+--------------------
+//1146 by eigen
+
+EƒCƒ“ƒfƒ…ƒAŽg—pŽžLv‚ɉž‚¶‚ÄMDEF‚ªã‚ª‚é‚悤‚É•ÏX
+EƒCƒ“ƒfƒ…ƒAŽg—p’†7‰ñƒ_ƒ[ƒW‚ðŽó‚¯‚é‚Ɖ𜂷‚é‚悤•ÏX
+EΓŠ‚°‚̌Œèƒ_ƒ[ƒW‚ð50‚É•ÏX
+
+ (src/map)
+ battle.c - battle_calc_damage(), battle_calc_misc_attack() C³
+ status.c - status_calc_pc(), status_change_start(), status_change_end() C³
+
+--------------------
+//1145 by End_of_exam
+
+Estart ‚̃`ƒFƒbƒNŠÔŠu‚ª’Z‚·‚¬‚½‚Ì‚ðC³(start)
+Eskill_unit_effect() ‚©‚ç–³ŒÀƒ‹[ƒv‚É“Ë“ü‚µ‚ÄAƒXƒ^ƒbƒNƒI[ƒo[ƒtƒ[‚Å—Ž‚¿‚é
+@‰Â”\«‚ª‚ ‚éƒoƒO‚ðC³(skill.c)
+Eƒyƒbƒg‚Ì“Ç‚Ýž‚Ý‚ÉŽ¸”s‚µ‚½Žž‚É—Ž‚¿‚éƒoƒO‚ðC³(pet.c)
+E‚QdƒƒOƒCƒ“‚ÌØ’fˆ—‚ªˆá‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
+
+E1142‚̃}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÌC³‚ðŒ³‚É–ß‚·(skill.c)
+EƒƒfƒBƒ^ƒeƒBƒI‚ÌSP‰ñ•œ—ÊC³‚ÌŽæ‚èž‚Ý(skill.c thanks to ‚È‚È‚µ‚³‚ñ)
+
+ (/)
+ start - ƒ`ƒFƒbƒNŠÔŠu‚ðC³
+
+ (src/map)
+ map.c - map_quit() C³
+ pet.c - pet_recv_petdata() C³
+ skill.c - skill_unit_onplace_timer() , skill_unit_effect() C³
+ status.c - status_calc_pc() C³
+
+--------------------
+//1144 by ¹
+
+EVC‚ŃRƒ“ƒpƒCƒ‹‚µ‚½‚Æ‚«Œx‚ªo‚é‚Ì‚ðC³B
+EŠÈˆÕƒAƒCƒeƒ€Eƒ‚ƒ“ƒXƒ^[¢ŠÒƒRƒ}ƒ“ƒh@im‚ð’ljÁB
+E@im’ljÁ‚É”º‚¢AEGIS‚ÅŽg‚í‚ê‚Ä‚¢‚é/item,/monster‚ðŽÀ‘•B
+@(AEGIS‚ÌŽd—l‚É‘¥‚è‘•”õ‚Í1ŒÂ’PˆÊE–¢ŠÓ’è‚Å
+@‚Ù‚©‚̃AƒCƒeƒ€‚Í30ŒÂ’PˆÊEŠÓ’èÏ‚Ý‚Åo‚Ü‚·B)
+E@monster‚ð¢ŠÒ•C”“ü—Í‚È‚µ‚Å¢ŠÒ‚Å‚«‚é‚悤‚É‚µ‚½B
+EƒRƒ}ƒ“ƒh“ü—Í‚ÌÛ‚Æ‚ ‚éðŒ‚ð–ž‚½‚·‚Æ
+@ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ª”­¶‚·‚éƒoƒO‚ðC³B
+ (src/map)
+ atcommand.h C³B
+ atcommand.c
+ atcommand_monster() C³B
+ atcommand_itemmonster() ’ljÁB
+ clif.c
+ clif_parse_GMkillall() C³B
+ clif_parse_GMsummon() C³B
+ clif_parse_GMitemmonster() ’ljÁB
+ status.c
+ status_change_start() C³B
+ (db)
+ packet_db.txt C³B
+ (conf)
+ msg_athena.conf C³B
+ atcommand_athena.conf C³B
+
+--------------------
+//1143 by End_of_exam
+
+Emap_quit(), pc_setpos() ‚ðFX®—(map.c pc.c)
+Eƒ‚ƒ“ƒXƒ^[‚ªƒoƒVƒŠƒJ‚ðŽg‚¤‚Æ—Ž‚¿‚éƒoƒO‚ðC³(skill.c)
+Eƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɃƒL‚Ì‹©‚Ñ‚ªŒø‚¢‚Ä‚¢‚½‚Ì‚ðC³(mob.c)
+Eƒ_ƒ“ƒX“r’†‚ɃT[ƒo[“à‚̕ʂ̃}ƒbƒv‚Ɉړ®‚µ‚½ê‡AƒXƒLƒ‹ƒ†ƒjƒbƒg‚ªÁ‚¦‚È‚¢
+@i“]‘—‘O‚̃}ƒbƒv‚ÉŽc‚Á‚Ä‚¢‚éjƒoƒO‚ðC³B(pc.c)
+E1134‚ŃT[ƒo[ŠÔ‚̃[ƒvƒ|[ƒ^ƒ‹‚ðŽg‚Á‚½Žž‚ÉAƒXƒLƒ‹Žg—pŽÒ‚ªæ‚Á‚½‚çƒT[ƒo[‚ª
+@—Ž‚¿‚éƒoƒO‚ðC³(skill.c)
+E1134‚ŃnƒG‚̉H‚ðŽg‚Á‚ăT[ƒo[ŠÔ‚ðˆÚ“®‚µ‚½ê‡AƒAƒCƒeƒ€‚ªŒ¸‚ç‚È‚¢ƒoƒO‚ðC³(pc.c)
+
+ (src/map)
+ map.c - map_quit() C³
+ mob.c - mobskill_castend_id() , mobskill_castend_pos(),
+ mobskill_use_id(), mobskill_use_pos() C³
+ pc.c - pc_useitem(), pc_setpos() C³Apc_remove_map() ’ljÁ
+ pc.h - pc_remove_map() ’ljÁ
+ skill.c - skill_castend_nodamege_id(), skill_unit_onplace() C³
+
+--------------------
+//1142 by ‚Âñ
+Eƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÅŽí‘°‚ɃAƒ“ƒfƒbƒg‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚É“–‚½‚ç‚È‚©‚Á‚½‚Ì‚ðC³
+ (src/map)
+ skill.c - && race!=1‚ð’ljÁ
+
+--------------------
+//1141.1 by BDPQ‹â [ 2005/02/21 ]
+E1141‚Ì“Y•t–Y‚ê‚̒ljÁ‚Å‚·B\‚µ–ó‚ ‚è‚Ü‚¹‚ñ‚Å‚µ‚½B
+EGMƒRƒ}ƒ“ƒh‚ðs‚Á‚½Žž‚̃ƒbƒZ[ƒW‚ð’ljÁ‚µ‚Ü‚µ‚½B
+
+ (conf)
+ msg_athena.conf - 113`117 ’ljÁ (@reload` ‚ðs‚Á‚½Žž‚̃ƒbƒZ[ƒW‚ð’ljÁ)
+
+--------------------
+//1141 by BDPQ‹â [ 2005/02/20 ]
+EGMƒRƒ}ƒ“ƒh‚ð’ljÁ
+ @reloadatcommand - atcommand_athena.conf ‚ðÄ“Çž‚·‚é
+ @reloadbattleconf - battle_athena.conf ‚ðÄ“Çž‚·‚é
+ @reloadgmaccount - gm_account_filename (ƒfƒtƒHƒ‹ƒg GM_account.txt ) ‚ðÄ“Çž‚·‚é
+ @reloadstatusdb - job_db1.txt / job_db2.txt / job_db2-2.txt / refine_db.txt / size_fix.txt ‚ðÄ“Çž‚·‚é
+ @reloadpcdb - exp.txt / skill_tree.txt / attr_fix.txt ‚ðÄ“Çž‚·‚é
+EGMƒRƒ}ƒ“ƒhu@reloadmobdbv‚Ńyƒbƒg‚̃f[ƒ^ƒx[ƒX‚àÄ“Çž‚·‚é‚悤‚É•ÏX
+ * @reload` ‚ɂ̓Nƒ‰ƒCƒAƒ“ƒg‚̃ŠƒƒO‚ª•K—v‚Èꇂà—L‚è‚Ü‚·B
+EGMƒRƒ}ƒ“ƒhu@who+v‚ŃŒƒxƒ‹‚à•\Ž¦‚·‚é‚悤‚É•ÏX
+Eƒq[ƒ‹‚ð‰½ƒŒƒxƒ‹ˆÈã‚Å9999ŒÅ’è‚É‚·‚é‚©‚̃IƒvƒVƒ‡ƒ“(heal_counterstop)’ljÁ
+
+ (conf)
+ atcommand_athena.conf - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb ’ljÁ (ƒfƒtƒHƒ‹ƒg99)
+ battle_athena.conf - heal_counterstop ’ljÁ (ƒfƒtƒHƒ‹ƒg11)
+ help.txt - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb who+ ‚Ìà–¾‚ð’ljÁ
+
+ (doc)
+ conf_ref.txt - 5. conf/battle_athena.conf •ÒW (heal_counterstop ‚Ìà–¾‚ƃTƒ“ƒvƒ‹‚ð’ljÁ)
+ - 6. atcommand_athena.conf •ÒW (à–¾‚ƃTƒ“ƒvƒ‹‚ÉÄ“ÇžŠÖ˜A‚ð’ljÁ)
+
+ (src/map)
+ atcommand.c - AtCommandInfo atcommand_info •ÒW (\‘¢‘Ì’è‹`)
+ - atcommand_whop() •ÒW (ƒvƒŒƒCƒ„[‚̃Œƒxƒ‹‚à•\Ž¦‚·‚é‚悤•ÏX)
+ - atcommand_reloadatcommand() ’ljÁ (atcommand_athena.conf Ä“Çž)
+ - atcommand_reloadbattleconf() ’ljÁ (battle_athena.conf Ä“Çž)
+ - atcommand_reloadgmaccount() ’ljÁ (gm_account_filename Ä“Çž)
+ - atcommand_reloadstatusdb() ’ljÁ (ƒXƒe[ƒ^ƒXŠÖ˜ADB Ä“Çž)
+ - atcommand_reloadpcdb() ’ljÁ (ƒvƒŒƒCƒ„[ŠÖ˜ADB Ä“Çž)
+ - atcommand_reloadmobdb() •ÒW (ƒyƒbƒg‚̃f[ƒ^ƒx[ƒX‚à“Çž‚ނ悤•ÏX)
+ atcommand.h - AtCommandType •ÒW (\‘¢‘Ì’è‹`)
+
+ battle.c - battle_config_read() •ÒW (heal_counterstop ‚̒ljÁ)
+ battle.h - Battle_Config •ÒW (heal_counterstop ‚̒ljÁ)
+
+ skill.c - skill_castend_nodamage_id() •ÒW (9999ƒq[ƒ‹•”‚ð battle_athena.conf ‚ðŽQÆ‚·‚é‚悤•ÏX)
+
+ pet.h - int read_petdb(); ’ljÁ (ƒyƒbƒgŠÖ˜ADB Ä“Çž—p)
+
+ pc.h - int pc_readdb(void); ’ljÁ (ƒvƒŒƒCƒ„[ŠÖ˜ADB Ä“Çž—p)
+
+ status.h - int status_readdb(void); ’ljÁ (ƒXƒe[ƒ^ƒXŠÖ˜ADB Ä“Çž—p)
+
+--------------------
+//1140 by eigen
+Eˆê•”‚̊‹«‚Åathena-start‚Æstart‚ª³í‚É“®ì‚µ‚Ä‚¢‚È‚©‚Á‚½ƒoƒO‚ðC³
+
+ athena-start - ‰üsƒR[ƒh‚ð0A‚É“ˆê
+ start - ‰üsƒR[ƒh‚ð0A‚É“ˆê
+
+--------------------
+//1139 by ‚à‚Á‚³‚è
+ENPCŽæ‚芪‚«ŒÄ‚Ñ–ß‚µƒXƒLƒ‹ŽÀ‘•
+EƒRƒƒ“ƒg‚³‚ê‚Ä‚é9999ƒq[ƒ‹(skilllv>10‚ÌŽž)AL”͈̓ƒeƒI(skilllv>10‚ÌŽž)AL”͈̓nƒ“ƒ}[ƒtƒH[ƒ‹(skilllv>5‚ÌŽž)‚̃Rƒƒ“ƒgŽæ‚èŠO‚µB
+EL”͈Ílov‚Ì•t‚¯‰Á‚¦(skilllv>10‚ÌŽž)
+—á
+1312,Žæ‚芪‚«ŒÄ‚Ñ–ß‚µ—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,354,1,3000,0,0,no,self,always,0,,,,,,10
+1063,9999ƒq[ƒ‹—ƒ‹ƒiƒeƒBƒbƒN,idle,28,11,10,2000,60000,yes,self,always,0,,,,,,@
+
+ (src/map)
+ skill.c npc_recallƒXƒLƒ‹’ljÁ,ã‹L‚̃Rƒƒ“ƒgŽæ‚èŠO‚µ
+ skill.h NPC_RECALL = 354‚ð’ljÁ
+ mob.c ƒXƒLƒ‹’ljÁ‚Ì‚½‚ß‚ÉuŽæ‚芪‚«ƒ‚ƒ“ƒXƒ^[‚̈—v•”•ª‚É•t‚¯‰Á‚¦
+ mob.h int mob_countslave(struct mob_data *md);‚ð’ljÁ
+ map.h struct mob_data‚Érecall_flag‚Ærecallmob_countƒƒ“ƒo[’ljÁ
+ (db)
+ skill_db.txt ƒXƒLƒ‹’ljÁ
+
+--------------------
+//1138 by End_of_exam
+
+E1132‚Ìsocket.c‚É•´‚êž‚ñ‚Å‚¢‚½‚©‚È‚è[‚ȃoƒOi‘—Mƒf[ƒ^‚ªƒ‰ƒ“ƒ_ƒ€‚É
+@‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚éƒoƒOj‚ðC³(socket.c)
+E1134‚Å‘g‚Ýž‚ñ‚¾ƒAƒCƒeƒ€dupe‘Îô‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(pc.c party.c guild.c)
+
+ (src/common/)
+ socket.c - send_from_fifo() C³
+
+ (src/map)
+ pc.c - pc_setpos() C³
+ party.c - FXC³
+ guild.c - FXC³
+
+--------------------
+//1137 by ‚¢‚Ç
+
+EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
+
+--------------------
+//1136 by by eigen
+
+E1135‚ÅÁ‚¦‚Ä‚¢‚½battle_athena.conf‚Ì€–ڂƃfƒtƒHƒ‹ƒg’l‚𕜊ˆ
+Econf_ref.txt‚Énext_exp_limit‚Ìà–¾‚ð’ljÁ
+
+ (conf)
+ battle_athena.conf - Á‚¦‚½€–ڂƃfƒtƒHƒ‹ƒg’l‚𕜊ˆ
+ (doc)
+ conf_ref.txt - next_exp_limit‚Ìà–¾‚ð’ljÁ
+
+--------------------
+//1135 by by Toshi^2
+Eƒpƒbƒ`1125‚ÅC³‚³‚ꂽAŒoŒ±’l‚ÌãŒÀÝ’è‚ð]—ˆ•ûŽ®‚̧ŒÀ–³‚µ‚à‘I‚ׂé‚悤‚É•ÏX
+
+ (db)
+ battle_athena.conf - next_exp_limit‚ð’ljÁB
+ (src/map)
+ battle.c - battle_config_read() C³
+ battle.h - struct Battle_Config{}‚É int next_exp_limit; ‚ð’ljÁB
+ pc.c - pc_gainexp() C³
+
+--------------------
+//1134 by End_of_exam
+
+E1132‚Å#undef close‚ð–Y‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(socket.c)
+E1133‚̃AƒCƒeƒ€dupe‘Îô‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(map.c)
+Eathena-start stop , kill ‚̇”Ô‚ðmap -> char -> login ‚É•ÏX
+@@@@(athena-start thanks to eigen‚³‚ñ)
+
+ (/)
+ athena-start - athena-start stop , kill ‚̇”ÔC³
+
+ (src/common)
+ socket.c - #undef close ’ljÁ
+
+ (src/map)
+ map.c - map_quit() C³
+
+--------------------
+//1133 by End_of_exam
+
+Emapflag nosave ‚ªŽw’肳‚ꂽƒ}ƒbƒv‚ÅŽ€‚ñ‚ŃŠƒXƒ^[ƒg‚·‚鎞‚ÉAƒZ[ƒuƒ|ƒCƒ“ƒg‚ª
+@•Êƒ}ƒbƒvƒT[ƒo[‚É‚ ‚é‚ÆA(nul,0,0)‚É”ò‚΂³‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(pc.c)
+Eƒ}ƒbƒvƒT[ƒo[‚𕪔z‚µ‚Ä‚¢‚鎞‚ÉA×H‚ð‚µ‚½“ÁŽê‚ȃc[ƒ‹‚ðŽg‚¤‚±‚Æ‚É‚æ‚Á‚ÄA
+@ƒAƒCƒeƒ€‚ªdupe‚Å‚«‚½ƒoƒO‚ðC³B(pc.c)
+Ebuildin_menu, buildin_select() ‚ªƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ð‹N‚±‚µ‚Ä‚¢‚½
+@ƒoƒO‚ðC³(script.c)
+
+ (src/map)
+ pc.c - pc_makesavestatus(), pc_setpos(), pc_autosave_sub() C³
+ script.c - buildin_menu(), buildin_select() C³
+
+--------------------
+//1132 by End_of_exam
+E@users ƒRƒ}ƒ“ƒh(ƒT[ƒo[“à‚Ìl”ƒ}ƒbƒv‚ð•\Ž¦)‚ð’ljÁ(atcommand.c / h)
+Eguild_check_alliance() ‚ðŒÄ‚Ño‚·‚Æ‚«‚̃`ƒFƒbƒN‚ð’ljÁ(mob.c battle.c)
+Eƒ}ƒbƒvƒT[ƒo[•ª”zŽž‚ɃMƒ‹ƒh‚̃ƒ“ƒo[‚ª”²‚¯‚½ŽžA‚»‚̃Mƒ‹ƒhƒƒ“ƒo[‚ª
+@ˆêl‚àƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢ƒ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚Ä‚¢‚½‚Ì‚ðC³(guild.c)
+E1130‚ÅŒ©Ø‚è‚̉ñ”ð—¦ã¸‚ªÁ‚¦‚Ä‚¢‚½‚Ì‚ð–ß‚·(status.c)
+Epid ‘Ήž”Å‚Ìstart, athena-start ‚ð“‡(start , athena_start)
+E“c‘ã–C‘ÎôAShinomori‚³‚ñ‚Ì do_sendrecv() ‚‘¬‰»‚ð‘g‚Ýž‚Þ
+@(socket.c socket.conf Makefile)
+Esocket ‚Ì‚‘¬‰»
+@@1. FIFOFLUSH ‚ªŽÀs‚³‚ê‚é•p“x‚ð‰º‚°‚é(socket.c char.c)
+@@2. •s³‚Èfd‚ð0 ‚É•ÏX(socket.c socket.h chrif.c char.c)
+
+ (/)
+ start - pid ƒtƒ@ƒCƒ‹‚ɑΉž‚·‚é‚悤‚ÉC³
+ sthena-start - pid ƒtƒ@ƒCƒ‹‚ɑΉž‚·‚é‚悤‚ÉC³
+ Makefile - "-D_XOPEN_SOURCE -D_BSD_SOURCE" ’ljÁ
+
+ (conf/)
+ help.txt - @users ’ljÁA@mes ‚ÌC³
+ socket.conf - ƒAƒNƒZƒX§ŒÀ‚ÌÝ’èƒtƒ@ƒCƒ‹
+
+ (src/common/)
+ socket.c - ƒAƒNƒZƒX§ŒÀ‚̒ljÁAFX‚‘¬‰»
+ socket.h - FIFO–½—ß‚Ì‚‘¬‰»
+
+ (src/char/)
+ char.c - parse_tologin(), parse_char() XV
+
+ (src/map/)
+ atcommand.c - @users ’ljÁ
+ atcommand.h - @users ’ljÁ
+ battle.c - battle_calc_damage() C³
+ chrif.c - •s³‚Èfd‚ð0 ‚É•ÏX‚µ‚½‚Ì‚É”º‚¤C³
+ guild.c - guild_member_leaved() C³
+ mob.c - mob_gvmobcheck() C³
+ status.c - status_calc_pc() C³
+
+--------------------
+//1131 by eigen
+EƒMƒ‹ƒhŠg’£‚Ìl”‘•ª‚ð+2/Lv‚©‚ç+4/Lv‚É•ÏX
+EƒƒeƒIƒXƒg[ƒ€‚ɃXƒ^ƒ“‚ª‚©‚©‚é‚悤C³
+Eƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ɈÈłª‚©‚©‚é‚悤C³
+Eƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO‚ðŽæ‚Á‚Ä‚¢‚ê‚ÎSTR+1 ATK+4‚ª•t‚­‚悤•ÏX
+Eƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO‚ðŽæ‚Á‚Ä‚¢‚ê‚ÎAREOTEWP‚ª‚ÌŒø‰ÊŽžŠÔ‚ª10%’·‚­‚È‚é‚悤•ÏX
+EAREOT‚̃p[ƒeƒB[ƒƒ“ƒo[Œø‰ÊŽžŠÔŒ¸­‚ð“P”p
+EƒtƒƒXƒgƒ_ƒCƒo[‚Å“€Œ‹‚·‚éÛA“€Œ‹ŽžŠÔ‚ªMDEF‚ɉe‹¿‚³‚ê‚é‚悤•ÏX
+Eskill_db.txtAskill_require_db.txtAskill_cast_db.txt‚ðOWN‚âŠeEWiki‚È‚Ç‚ðŽQl‚ÉC³
+
+ (src/map)
+ skill.c
+ status.c
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ skill_require_db.txt
+
+--------------------
+//1130 by eigen
+EŠŽŒÀŠE—Ê‘‰Á‚Ì+100/Lv‚ð+200/Lv‚ÉC³
+EƒV[ƒt‚ÌãˆÊE‚ɉ—‚¢‚ĉñ”𗦑‰Á‚ÌFlee㸗¦+3/Lv‚ð+4/Lv‚ÉC³
+EƒAƒTƒVƒ“Œn‚ª‰ñ”𗦑‰Á‚ðŽæ“¾‚µ‚Ä‚¢‚éê‡AˆÚ“®‘¬“x‚ª+0.5%/Lv‚É‚È‚é‚悤C³
+EƒvƒŒƒbƒVƒƒ[‚ÌSPUŒ‚‚ðŽÀ‘•
+EƒvƒŠƒU[ƒuAƒtƒ‹ƒXƒgƒŠƒbƒvA•Ší¸˜BAƒXƒŠƒ€ƒsƒbƒ`ƒƒ[Aƒtƒ‹ƒPƒ~ƒJƒ‹ƒ`ƒƒ[ƒW
+‚ðdb‚ɒljÁ
+
+ (src/map)
+ skill.c - skill_additional_effect() C³
+ status.c - status_calc_pc() C³
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ skill_require_db.txt
+ skill_tree.txt
+
+--------------------
+//1129 by En_of_exam
+
+ENPC ƒCƒxƒ“ƒg‚ªd•¡‚µ‚½ê‡‚̃ƒ‚ƒŠ‰ð•úŽè‡‚ªˆá‚Á‚Ä‚¢‚½ƒoƒO‚ðC³
+@@(npc.c thanks to TOSHI^2‚³‚ñ)
+
+ (src/map)
+ npc.c - npc_parse_script() C³
+
+--------------------
+//1128 by ”Y‚ß‚él
+EƒAƒCƒeƒ€‚ðÁ”‚¸‚ÉŽg—p‚·‚é‚©‚̃IƒvƒVƒ‡ƒ“’ljÁ
+EƒJ[ƒhA‘•”õ•iAƒGƒ‹EƒIƒŠ‚̃hƒƒbƒv—¦‚ð•Ê‚ÉÝ’èo—ˆ‚é‚悤‚ɃIƒvƒVƒ‡ƒ“’ljÁ
+Ebattle_athena.conf‚̉ŠúÝ’è‚Å–îE¹…“™‚ð쬎ž‚É–¼‘O‚ð•t‚¯‚È‚¢‚悤‚É•ÏX
+@i–{ŽI‚Å‚Í‚Ü‚¾—ˆ‚Ä‚È‚¢‚ÆŽv‚Á‚½‚̂ʼnŠúÝ’è‚ð•Ï‚¦‚Ü‚µ‚½j
+ (src/map)
+ battle.c
+ mob.c
+ pc.c
+ battle.h
+ (conf)
+ battle_athena.conf
+
+--------------------
+//1127 by End_of_exam
+
+Egetarraysize() ‚ª³‚µ‚¢’l‚ð•Ô‚³‚È‚¢ƒoƒO‚ðC³(script.c)
+@‚±‚̃oƒO‚̉e‹¿‚ÅAdeletearray() –½—ß‚Ì“®ì‚ª³í‚È‚à‚̂ƈقȂÁ‚Ä‚¢‚Ü‚µ‚½B
+
+Ebuildin_deletearray() ‚ÌÅ“K‰»(script.c)
+EƒVƒOƒiƒ‹ˆ—’†‚ÉÄ“xƒVƒOƒiƒ‹‚ªŒÄ‚΂ê‚é‰Â”\«‚ɑΈ‚·‚é(core.c)
+EˆÏ‘õ”Ì”„‚ð’ljÁ‚µ‚Ä‚Ý‚é(npc_test_seller.txt)
+
+ (src/map)
+ script.c - getarraysize() , buildin_deletearray() C³
+
+ (src/common)
+ core.c - sig_proc() C³
+
+ (script/sample)
+ npc_test_seller.txt - ˆÏ‘õ”Ì”„NPC
+
+--------------------
+//1126 by eigen
+Eƒƒ‚ƒ‰ƒCƒY‚ÌŒø‰Ê‰ñ”‚Ɖr¥’Zk”ä—¦‚ð‚»‚ê‚¼‚ê5‰ñA1/2‚ÉC³
+
+ (src/map)
+ skill.c - 1/3‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ð1/2‚ÉC³
+ status.c - 3‰ñ‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ð5‰ñ‚ÉC³
+
+--------------------
+//1125 by lizorett
+Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA‚̃mƒbƒNƒoƒbƒN‚ð3ƒZƒ‹‚É‚µAƒ~ƒXŽž‚ɂ̓mƒbƒNƒoƒbƒN‚µ‚È‚¢
+‚悤•ÏX
+EƒXƒsƒAƒXƒ^ƒu‚ð‘ÎÛ‚©‚玩•ª‚ÉŒü‚©‚Á‚Ä4ƒ}ƒX‚͈̔ÍUŒ‚‚É•ÏX(–{ŽIŽd—l)
+E‘é/“ŠÎ‚ðƒjƒ…ƒ}‚Å–h‚°‚é‚悤•ÏX
+Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ª‘ÎۂɃ~ƒX‚µ‚½ê‡‚ɂ̓mƒbƒNƒoƒbƒN‚µ‚È‚¢‚悤•ÏX
+Eƒ\ƒEƒ‹ƒuƒŒƒCƒJ[‚̃_ƒ[ƒWŒvŽZAƒjƒ…ƒ}‚Ń~ƒX‚É‚È‚é‚悤•ÏX
+EŠl“¾ŒoŒ±’l‚ÌãŒÀ(Œ»ƒŒƒxƒ‹‚Ì•K—vŒoŒ±’l-1)‚ðÝ’è
+EƒoƒWƒŠƒJ“WŠJŽž‚É“WŠJŽÒ‚̓mƒbƒNƒoƒbƒN‚µ‚È‚¢‚悤•ÏX
+EƒƒeƒIƒAƒTƒ‹ƒg‚𑦎ž”­“®AŽg—pŽÒ’†SA‰r¥500msŒÅ’èAƒGƒtƒFƒNƒg—L‚É•ÏX
+EƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“Žž‚Ìmob‚ÌUŒ‚—͒ቺ‚ð10%‚É•ÏX
+EŠ|‚¯‚ç‚ê‚Ä‚¢‚é‚à‚Ì‚æ‚è’჌ƒxƒ‹‚̃uƒŒƒX‚É‚æ‚èŽô‚¢/Ή»‚ª‰ðœ‚Å‚«‚é‚悤•ÏX
+Eƒ\ƒEƒ‹ƒo[ƒ“/ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[/ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒWŽÀ‘•
+EƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ðŽËü‚É‚¢‚é“G‚É‚àƒ_ƒ[ƒW‚ð—^‚¦‚é‚悤•ÏXAƒNƒŠƒeƒBƒJƒ‹
+Šm—¦+20%‚Å–hŒä–³Ž‹ƒ_ƒ[ƒW‚É•ÏX
+E“ŠÎ‚ȂLjꕔ‚̃XƒLƒ‹‚ª‘‚È‚Ç‚É1ƒ_ƒ[ƒW‚É‚È‚ç‚È‚¢–â‘è‚ðC³
+
+ (db)
+ skill_db.txt- BDS/ƒƒeƒIƒAƒTƒ‹ƒg•ÏXAƒXƒLƒ‹’ljÁ
+ skill_cast_db.txt
+ - ƒXƒLƒ‹’ljÁ
+ skill_require_db.txt
+ - ƒXƒLƒ‹’ljÁ
+ (src/map)
+ battle.c - ƒ\ƒEƒ‹ƒuƒŒƒCƒJ[‚̃_ƒ[ƒWŒvŽZ‚ð•ÏX
+ - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚̃NƒŠƒeƒBƒJƒ‹Šm—¦C³
+ - ‘é/“ŠÎ‚ðƒjƒ…ƒ}‚Å–h‚°‚é‚悤•ÏX
+ skill.h - SC_MINDBREAKER’ljÁ
+ skill.c - BDS/BB‚̃mƒbƒNƒoƒbƒN‚ðC³
+ - ƒXƒsƒAƒXƒ^ƒu‚ð”͈ÍUŒ‚‚É•ÏX
+ - ƒƒeƒIƒAƒTƒ‹ƒgC³
+ - ƒ\ƒEƒ‹ƒo[ƒ“/ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[/ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒWŽÀ‘•
+ path.c - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŽËüŒvŽZ‚ð’ljÁ
+ pc.c - Šl“¾ŒoŒ±’l‚ÌãŒÀ(‘O‚̃Œƒxƒ‹‚ÌŒoŒ±’l-1)‚ðÝ’è
+ status.c - ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[‚Ìmatkã¸/mdefŒ¸­‚ÌŽÀ‘•
+ map.h - ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO‚ÌŽËüŒvŽZ—p\‘¢‘Ì‚ð’ljÁ
+
+--------------------
+//1124 by ‚à‚Á‚³‚è
+“G‚ªŽg‚¤”š—ô”g“®ŽÀ‘•
+Œø‰Ê
+atk1,atk2 1000*skilllv‰ÁŽZ
+hit 20*skilllv‰ÁŽZ
+
+ (src/map)
+ skill.c
+ skill.h NPC_EXPLOSIONSPIRITSŠÖŒW‚ð’ljÁ
+ status.c@@@@
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+
+
+
+--------------------
+//1123 by Nameless
+EAthenaƒT[ƒrƒX‰»ƒLƒbƒg‚ð’ljÁ‚µ‚Ü‚µ‚½B(NT/2000/XP/2003/LH)
+@Ú‚µ‚¢•û–@‚Ídoc“à‚Ìinstasv.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢
+
+ (bin/tool)
+ instasv.bat - ƒT[ƒrƒX“o˜^—pƒoƒbƒ`
+ delasv.bat - ƒT[ƒrƒX–•Á—pƒoƒbƒ`
+ (doc/)
+ instasv.txt - à–¾‘(ƒeƒLƒXƒg”Å)
+
+--------------------
+//1122 by End_of_exam
+
+E1120‚Ìstrdb ‚̃L[‚ð•Û‘¶‚µ–Y‚ê‚Ä‚¢‚½ƒoƒOC³idb.cj
+E”O‚Ì‚½‚ß1121A1120‚Ìreadme ‚ðƒ}[ƒW‚µ‚ÄA—¼•û‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ð“Y•t‚·‚é
+
+ (src/char)
+ char.c - 1121‚Ì‚à‚Ì‚ð“Y•t
+
+ (src/common)
+ mmo.h - 1121‚Ì‚à‚Ì‚ð“Y•t
+ db.h - 1120‚Ì‚à‚Ì‚ð“Y•t
+ db.c - strdb ‚̃L[‚ð•Û‘¶‚·‚é‚悤‚É‚·‚é
+
+ (src/map)
+ battle.c - 1121‚Ì‚à‚Ì‚ð“Y•t
+ guild.c - 1121‚Ì‚à‚Ì‚ð“Y•t
+ guild.h - 1121‚Ì‚à‚Ì‚ð“Y•t
+ mob.c - 1121‚Ì‚à‚Ì‚ð“Y•t
+ skill.c - 1121‚Ì‚à‚Ì‚ð“Y•t
+ skill.h - 1121‚Ì‚à‚Ì‚ð“Y•t
+
+--------------------
+//1121 by _
+
+Eƒ[ƒhƒiƒCƒg/ƒpƒ‰ƒfƒBƒ“‚̃ƒOƒCƒ“Žž‚̃Gƒ‰[‘Îô
+EGv‚Å‚Ì“¯–¿‚̈µ‚¢‚ðC³
+@ƒGƒ“ƒyƒŠƒEƒ€UŒ‚•s‰ÂAƒK[ƒfƒBƒAƒ“‚©‚çUŒ‚‚³‚ê‚È‚¢‚悤‚ÉC³
+EV’ljÁƒXƒLƒ‹—p‚̒蔒ljÁC³
+
+ (src/char)
+ char.c
+ C³ mmo_char_send006b()
+ (src/common)
+ mmo.h
+ C³ MAX_SKILL=500
+ ’ljÁ VƒMƒ‹ƒhƒXƒLƒ‹(ƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚Ü‚·)
+ (src/map)
+ battle.c
+ C³ battle_calc_damage()
+ guild.c
+ guild.h
+ ’ljÁ guild_check_alliance()
+ mob.c
+ C³ mob_gvmobcheck()
+ skill.c
+ C³ SkillStatusChangeTable[] (420-490)
+ skill.h
+ C³ MAX_SKILL_DB=500
+ ’ljÁ 475ˆÈ~‚ÌVƒXƒLƒ‹ID
+
+--------------------
+//1120 by End_of_exam
+
+Edb_foreach()‚̌ĂÑo‚µæ‚Ådb_erase()‚ªŒÄ‚Ño‚³‚ê‚Ä‚¢‚邳‚ê‚Ä‚¢‚éê‡A
+@•¡”‰ñ“¯‚¶ƒL[‚ÅŠÖ”‚ðŒÄ‚Ño‚·‰Â”\«‚ª‚ ‚éƒoƒO‚ðC³(db.h db.c)
+
+@cygwinã‚Å‚Qdfree‚ð‚µ‚½ê‡AƒvƒƒOƒ‰ƒ€‚ª–\‘–‚·‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+@charŽI‚Æ‚ÌÚ‘±‚ªØ‚ꂽmap ŽI‚ª–\‘–‚·‚éƒoƒO‚ÍA‚±‚ê‚É‹Nˆö‚µ‚Ä‚¢‚Ü‚·B
+
+ (src/common)
+ db.c - db_erase‚ðˆêŽž“I‚ɃƒbƒN‚·‚é‹@”\’ljÁ
+ db.h - db_erase‚ðˆêŽž“I‚ɃƒbƒN‚·‚é‹@”\’ljÁ
+
+--------------------
+//1119 by ICO
+
+ENPCƒXƒLƒ‹(ƒuƒŒƒCƒNƒEƒFƒ|ƒ“AƒuƒŒƒCƒNƒA[ƒ}[AƒuƒŒƒCƒNƒwƒ‹ƒ€AƒuƒŒƒCƒNƒV[ƒ‹ƒh)‚ÌŽÀ‘•
+Ebattle_athena.conf‚Émonster_damage_delay‚ð’ljÁB
+@no‚ðŽw’è‚·‚é‚ÆFW“™‚̃mƒbƒNƒoƒbƒNƒXƒLƒ‹‚Ì‹““®‚ª‘½­–{ŽI‚ɋ߂­‚©‚àcH
+
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ (conf/)
+ battle_athena.conf
+ monster_damage_delay ’ljÁ
+ (map/)
+ battle.c
+ battle.h
+ mob.c
+ monster_damage_delayŠÖ˜A‚ð’ljÁ
+ skill.c
+ skill.h
+ skill_additional_effect,skill_castend_damage_id C³
+
+--------------------
+//1118 by BDPQ‹â [ 2005/02/10 ]
+¡ƒf[ƒ^ƒx[ƒX‚ª•ÏX‚³‚ê‚Ä‚¢‚Ü‚·B“±“üŽž‚ɂ͌䒈ӂ­‚¾‚³‚¢¡
+EƒXƒLƒ‹‚̌Œè‰r¥ŽžŠÔ‚ð skill_cast_db.txt ‚Ɉړ®B
+ ‰r¥ŽžŠÔ‚ÌŒvŽZ‚ÍA (’Êí‰r¥ + ŒÅ’è‰r¥)*ƒƒ‚ƒ‰ƒCƒY•â³ ‚Æ‚È‚è‚Ü‚·B
+ skill_cast_db‚Ì‘Ž®‚Í
+ [ID],[cast_list(’Êí‰r¥)],[fixed_cast_list(ŒÅ’è‰r¥)],[delay_list(ƒfƒBƒŒƒC)],[upkeep_time(ˆÛŽŽžŠÔ)],[upkeep_time2(ˆÛŽŽžŠÔ2)] ‚Å‚·B
+EƒAƒuƒ‰ƒJƒ^ƒuƒ‰‚ðƒfƒBƒŒƒC‚ÉASPD‚É‚æ‚éƒfƒBƒŒƒC‚ð•t‰Á‚µ‚È‚¢‚悤C³(‘¦”­“®ƒXƒLƒ‹—p)
+EV2ŽŸE‚Ìskill_cast_db‚ÉŠÖ‚·‚逖ڂÌC³
+
+ (src/map)
+ skill.c - skill_use_id() C³ (‰r¥ŽžŠÔŒvŽZ•” E ƒƒ‚ƒ‰ƒCƒY/–‚–@—Í‘• ŒÅ’è‰r¥ŽžŠÔ•”íœ)
+ (ƒAƒuƒ‰ƒJƒ^ƒuƒ‰‚ÌC³)
+ skill_use_pos() C³ (‰r¥ŽžŠÔŒvŽZ•”)
+ skill_readdb() C³ (cast_db “Çž•”)
+ skill.h - skill_db C³ (fixedcast‚̒ljÁ)
+ skill_get_fixedcast() ’ljÁ (db‚©‚çŒÅ’è‰r¥ŽžŠÔ‚̎擾)
+
+ (db)
+ skill_cast_db.txt- fixed_cast_list ’ljÁ (ŒÅ’è‰r¥ŽžŠÔ)
+ –‚–@—Í‘•-700Aƒƒ‚ƒ‰ƒCƒY-5000‚ÉÝ’è
+
+ 361(ƒAƒXƒ€ƒvƒeƒBƒI) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ðC³ )
+ 365(ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[)C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ð’ljÁ )
+ 373(ƒ‰ƒCƒt’u‚«Š·‚¦) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ðC³ )
+ 375(ƒ\ƒEƒ‹ƒo[ƒ“) ’ljÁ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ð’ljÁ ) ( ƒXƒLƒ‹Œø‰Ê‚ÍŽÀ‘•‚µ‚Ä‚¢‚Ü‚¹‚ñ )
+ 381(ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒC‚ðC³ )
+ 383(ƒEƒBƒ“ƒhƒEƒH[ƒN) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC/Œø‰ÊŽžŠÔ‚ðC³ )
+ 384(ƒƒ‹ƒgƒ_ƒEƒ“) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ðC³ )
+ 387(ƒJ[ƒgƒu[ƒXƒg) C³ ( R.O.M 776‚ðŽQl‚ÉŒø‰ÊŽžŠÔ‚ðC³ )
+ 398(ƒwƒbƒhƒNƒ‰ƒbƒVƒ…) C³ ( R.O.M 776‚ðŽQl‚ɃfƒBƒŒƒCŽ‘±ŽžŠÔ‚ðC³ )
+ 406(ƒƒeƒIƒAƒTƒ‹ƒg) C³ ( R.O.M 776‚ðŽQl‚ɉr¥/ƒfƒBƒŒƒC‚ð’ljÁ )
+
+ (doc)
+ db_ref.txt - 1. db/skill_cast_db.txt C³ (fixed_cast_list‚Ì€–Ú‚ð’ljÁ)
+
+--------------------
+//1117 by End_of_exam
+
+Eƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ð“Åó‘Ô‚Ì“G‚ÉŽg—p‚µ‚½‚ªAŽ¸”s‚µ‚½Žži“Gƒ‚ƒ“ƒXƒ^[‚Ì
+@HP‚ª2/3 ˆÈゾ‚Á‚½Žžj‚É[‚ȃƒ‚ƒŠƒŠ[ƒN‚ª‹N‚«‚Ä‚¢‚½ƒoƒO‚ðC³(skill.c)
+E‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ªŽ¸”s‚µ‚½Žž‚É[‚ȃƒ‚ƒŠƒŠ[ƒN‚ª‹N‚«‚Ä‚¢‚½ƒoƒO‚ðC³(skill.c)
+
+@ã‚Q‚‚ÍA‹¤‚Émap_freeblock_unlock() ‚ª”²‚¯‚Ä‚¢‚éˆ×‚É”­¶‚µ‚Ä‚¢‚Ü‚µ‚½B
+@ƒhƒƒbƒvƒAƒCƒeƒ€AƒXƒLƒ‹ƒ†ƒjƒbƒgAŽæ‚芪‚«‚È‚Ç‚ÅŠm•Û‚³‚ꂽƒƒ‚ƒŠ‚ªA
+@ˆÈ~‘S‚­ŠJ•ú‚³‚ê‚È‚­‚È‚é‚Æ‚¢‚¤‚©‚È‚è[‚ȃƒ‚ƒŠƒŠ[ƒN‚̃oƒO‚Å‚·B
+@map_freeblock_lock() ‚ðŒÄ‚Ôƒ‹[ƒ`ƒ“‚ðC³‚·‚éê‡Aƒ‹[ƒ`ƒ“‚𔲂¯‚é‚Æ‚«‚ÉA
+@map_freeblock_unlock() ‚ªŒÄ‚΂ê‚é‚悤‚É‹C‚ð•t‚¯‚Ä‚­‚¾‚³‚¢(return ‚É’ˆÓ!)B
+
+Emap_freeblock_unlock() ‚ð–Y‚ê‚Ä‚à—Ç‚¢‚悤‚ÉA’èŠú“I‚Éblock_free_lock‚ð
+@ƒNƒŠƒA‚·‚é‚悤‚ÉC³(map.c)
+EDebianD‚« ‚³‚ñ‚ÌMPVƒ‚ƒ“ƒXƒ^[‚ÌHPŒvŽZ‚ªƒI[ƒo[ƒtƒ[‚·‚éƒoƒOC³‚ÌŽæ‚èž‚Ý(status.c)
+
+ (src/map)
+ skill.c - skill_castend_nodamage_id() C³
+ map.c - map_freeblock_timer() ’ljÁA do_init() C³
+ status.c - status_get_max_hp() C³
+
+--------------------
+//1116 by End_of_exam
+
+Ecopyarray ‚Å“¯‚¶”z—ñ‚ðŽw’肵‚½ŽžAƒRƒs[æ‚Ì—v‘f”Ô†‚ªƒRƒs[Œ³‚Ì—v‘f”Ô†‚æ‚è
+@‘å‚«‚¢Žž‚Ì“®ì‚ª•s’è‚É‚È‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(script.c npc_test_array.txt)
+EŠÖ”錾‚¹‚¸‚ÉŠÖ”’è‹`‚µ‚½ƒ†[ƒU[’è‹`ŠÖ”‚ðŒÄ‚Ño‚»‚¤‚Æ‚·‚é‚ÆAƒGƒ‰[‚ªo‚é
+@ƒoƒO‚ðC³(script.c)
+EƒXƒNƒŠƒvƒg‚̃I[ƒo[ƒtƒ[”»’èŠî€‚ðŠÉ˜a‚³‚¹‚é(script.c)
+EƒMƒ‹ƒh‚Ì’m‚É\n‚ªŽg‚¦‚éƒoƒO‚ðC³(int_guild.c)
+EƒCƒxƒ“ƒgdb‚̃ƒ‚ƒŠƒŠ[ƒNC³‚ª•sŠ®‘S‚¾‚Á‚½‚Ì‚ðC³(npc.c)
+Edb_foreach‚̃`ƒFƒbƒN•û–@‚ð•ÏX(db.c)
+E‹N“®Žž‚É*.pid (ƒvƒƒZƒXID‚̃tƒ@ƒCƒ‹)‚ð쬂·‚é‚悤‚É‚·‚é(core.c)
+EŒoŒ±’lŠ“¾‚ª‘S‘Ì”­Œ¾‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ðC³(clif.c)
+E‹©‚Ô‚ð‘S‘Ì”­Œ¾‚É•ÏX(clif.c)
+Etester‚³‚ñ쬂ÌVC++ Toolkit2003 —p‚̃oƒbƒ`ƒtƒ@ƒCƒ‹‚𓯔º(vc07_make.bat)
+
+ (/)
+ vc07_make.bat - tester‚³‚ñ쬂̃oƒbƒ`ƒtƒ@ƒCƒ‹‚𓯔º
+
+ (src/common)
+ db.c - db_foreach() C³
+ core.c - main() C³ , pid_create() , pid_delete() ’ljÁ
+
+ (src/char)
+ int_guild.c - mapif_parse_GuildPosition() C³
+
+ (src/map)
+ clif.c - clif_disp_onlyself() , clif_onlymessage() C³
+ npc.c - npc_parse_script() C³
+ script.c - buildin_copyarray() , parse_syntax() C³
+
+ (script/sample)
+ npc_test_array.txt - ƒ`ƒFƒbƒN€–ڂ̒ljÁ
+
+--------------------
+//1115 by ‚¢‚Ç
+
+EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
+
+--------------------
+//1114-fix1 by ‹HŽ}
+
+Ezlib‚ðmap-server“à•”‚ÉŽæ‚èž‚ß‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ
+Emake‚ªMinGW+Msys‚ųí‚É’Ê‚é‚悤C³
+Ewin32_start.bat‚Ƀ`ƒFƒbƒN’ljÁ
+
+ (src/common/zlib)
+ trees.h - anybody's guessã‚Ìzlib_1_2_1_staticlib‚æ‚èŽæ‚èž‚Ý
+ inffixed.h - “¯ã
+ inffast.h - “¯ã
+ crc32.h - “¯ã
+ compress.c - “¯ã
+ deflate.h - “¯ã
+ inftrees.h - “¯ã
+ zutil.c - “¯ã
+ crc32.c - “¯ã
+ inflate.h - “¯ã
+ inffast.c - “¯ã
+ trees.c - “¯ã
+ inflate.c - “¯ã
+ zconf.h - “¯ã
+ deflate.c - “¯ã
+ inftrees.c - “¯ã
+ zutil.h - “¯ã
+ zlib.h - “¯ã
+ adler32.c - “¯ã
+ Makefile - LOCALZLIB‚ªŽw’肳‚ê‚Ä‚¢‚鎞‚̂݃Rƒ“ƒpƒCƒ‹‚µ‚Ü‚·B
+
+ (src/map/)
+ Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
+ - LOCALZLIB‚ªŽw’肳‚ê‚Ä‚¢‚éꇃŠƒ“ƒN‚µ‚Ü‚·B
+ - LOCALZLIB‚ª–³‚¢ê‡‚¾‚¯zlib.a‚ðƒŠƒ“ƒN‚µ‚Ü‚·B
+ (src/char/)
+ Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
+ (src/login/)
+ Makefile - MinGW‚Ìê‡Aˆø”-wsock32‚ð’ljÁ‚µ‚Ü‚·B
+ (src/common/grfio.c) - Zlib‚ð“à•ï‚µ‚½Û‚É_WIN32‚Æ‹£‡‚µ‚È‚¢‚悤•ÏX
+ - zlib_win32.h zconf_win32.h‚ð”pŽ~
+
+ (./)
+ Makefile - #Link Zlib(NOTrecommended)Azlib‚ð“à•ï‚µ‚Ü‚·B
+ win32_start.bat - athena-start‚Ì”¼ƒNƒ[ƒ“‰»B‰Šú‹N“®‚Å‚±‚¯‚È‚­‚È‚é‚Í‚¸‚Å‚·B
+
+--------------------
+//1113 by End_of_exam
+
+Elinux ŠÂ‹«‚Å‘å—Ê‚Ìwarning ‚ªo‚Ä‚¢‚½‚Ì‚ðC³(malloc.h)
+Emap_quit() ‚Åcharid_db ‚̃f[ƒ^‚ð휂µ‚È‚¢‚悤‚É•ÏX(map.c thanks to lemit‚³‚ñ)
+Epc_eventtimer(), npc_event_timer() ‚Ìfree()‚ÅŒx‚ªo‚Ä‚¢‚½‚Ì‚ðC³(pc.c npc.c)
+Emap_eraseipport() ‚ªƒƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
+Eaddtimer –½—ß‚ÉŽw’è‚·‚éƒCƒxƒ“ƒg–¼‚ª‚Q‚R•¶Žš‚ɧŒÀ‚³‚ê‚Ä‚¢‚½‚̂𖳧ŒÀ‚É‚·‚é(pc.c)
+Epc_cleareventtimer() , pc_deleventtimer() ‚ªƒƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³
+@(pc.c thanks to Shinomori‚³‚ñ)
+
+ (src/common/)
+ malloc.h - "#undef strdup" ‚ð’ljÁ
+
+ (src/map/)
+ npc.c - npc_event_timer() C³
+ pc.c - pc_eventtimer() , pc_addeventtimer() , pc_cleareventtimer(),
+ pc_deleventtimer() C³
+ map.c - map_quit() , map_eraseipport() C³
+
+--------------------
+//1112 by lizorett
+EPC‚ªƒ}ƒbƒvˆÚ“®’†‚ÉA‚»‚ÌPC‚ªÝ’u‚µ‚½ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ìskill_unit_onout‚ªŒÄ‚΂ê
+‚È‚¢–â‘è(map-sever‚ª—Ž‚¿‚é‰Â”\«‚ ‚è)‚ðC³
+EƒoƒWƒŠƒJ‚ðŽd—l‚É•¹‚¹‚ÄC³
+E³íI—¹Žž‚Échar-server‚ªƒRƒAƒ_ƒ“ƒv‚·‚é–â‘è‚ðC³
+Emob‚ªƒEƒH[ƒ^ƒ{[ƒ‹Žg—pŽž‚̃qƒbƒg”‚ðC³(skill_db.txt‚ÉŽw’肵‚½”ƒqƒbƒg)
+EƒR[ƒeƒBƒ“ƒO‚³‚ê‚Ä‚¢‚éꇂɂ̓XƒgƒŠƒbƒv‚Å‚«‚È‚¢‚悤•ÏX
+E‘®«ê‚ðŽg—p‚µ‚½ÛA‘O‚Éo‚µ‚Ä‚¢‚½‘®«ê‚ªÁ‚¦‚È‚¢‚±‚Æ‚ª‚ ‚é–â‘è‚ðC³
+
+ (db)
+ skill_db.txt
+ - mob‚̃EƒH[ƒ^ƒ{[ƒ‹‚̃JƒEƒ“ƒg”‚ðDB‚É‚¢‚ꂽ
+ skill_unit_db.txt
+ - ƒoƒWƒŠƒJ‚ðC³
+ (char)
+ char.c - do_final()‚Ìchar_dat‚̃ƒ‚ƒŠŠJ•úˆÊ’u‚ð•ÏX
+ (map)
+ clif.c - ƒoƒWƒŠƒJŽž‚ÉUŒ‚‚È‚Ç‚ª‚Å‚«‚È‚¢‚悤•ÏX
+ map.c - ƒoƒWƒŠƒJˆÊ’u‚ðƒZƒ‹‚̃tƒ‰ƒO‚É“ü‚ê‚é‚悤•ÏX
+ map.h - ƒoƒWƒŠƒJ—p‚̃Zƒ‹ƒtƒ‰ƒO’ljÁ
+ mob.c - ƒoƒWƒŠƒJ‚Éi“ü‚Å‚«‚È‚¢‚悤‚É•ÏX
+ pc.c - ˆÚ“®Žž(”ˆ‚È‚Ç)‚ɃoƒWƒŠƒJ‚ðÁ‚·‚悤C³
+ skill.c - ƒoƒWƒŠƒJC³
+ - ƒEƒH[ƒ^ƒ{[ƒ‹C³
+ - skill_unit_onout‚̌ĂÑo‚µ‚ðC³
+ - ƒR[ƒeƒBƒ“ƒO‚³‚ê‚Ä‚¢‚é‰ÓŠ‚̓XƒgƒŠƒbƒv•s‰Â‚É•ÏX
+
+--------------------
+//1111 by Toshi^2
+EpcŒnmob‚É“]¶•—{Žq‚ðŽw’è‚Å‚«‚é‚悤‚É•ÏXB
+@db/mob_avail.txt‚Éà–¾•¶‚ð’ljÁ‚µ‚½‚Ì‚ÅA‚»‚ê‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (db)
+ mob_avail.txt - ˆø”‚Ìà–¾‚ð’ljÁB
+ (src/map)
+ clif.c - clif_mob0078() clif_mob007b() clif_pet0078() clif_pet007b() C³
+ mob.c - mob_readdb_mobavail() C³
+ mob.h - \‘¢‘Ìmob_db‚Éushort transv‚ð’ljÁAmob_avail‚Ìtransƒtƒ‰ƒO‚ðŠi”[B
+
+--------------------
+//1110 by lizorett
+Eƒ†ƒjƒbƒgŒnƒXƒLƒ‹(ƒjƒ…ƒ}Aƒ_ƒ“ƒX“™)‚Åmap_server.exe‚ª—Ž‚¿‚é–â‘è‚ðC³
+ (ƒgƒŒ[ƒX‚Å‚Ískill_unit_onplace/skill_unit_onout‚Å—Ž‚¿‚é)
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚Ìl”ƒJƒEƒ“ƒg•û–@‚ð•ÏX(–{ŽIŽd—l)
+Eƒ}ƒOƒkƒX‚͈̔͂ðL‚°AŽg—p‚µ‚½ƒ†ƒjƒbƒg‚ªíœ‚³‚ê‚é‚悤‚É‚·‚é(–{ŽIŽd—l)
+Eƒfƒ{[ƒVƒ‡ƒ“‚Ì‹——£‚ª’Z‚­‚È‚é–â‘è‚ðC³(ƒoƒO•ñƒXƒŒƒbƒh part8 >>15)
+Eƒfƒ{[ƒVƒ‡ƒ“‚Ånullpo‚ªo‚é–â‘è‚ðC³
+Emob‚̃Cƒ“ƒeƒBƒ~ƒfƒCƒg‚ª¬Œ÷‚·‚é‚Æmap-server‚ª—Ž‚¿‚é–â‘è‚ðC³(ƒoƒO•ñƒXƒŒƒb
+ƒh part8 >>42)
+EƒEƒH[ƒ^[ƒ{[ƒ‹‚ÌŽd—l‚ð–{ŽI‚ɋ߂¯‚é(…ꂪ­‚È‚¢ê‡‚É‚Íhit”‚ªŒ¸‚éA
+ƒfƒŠƒ…[ƒWã‚ÅŽÀs‚·‚é‚ƃ†ƒjƒbƒg‚ªŒ‡‚¯‚é)
+Eƒtƒ@[ƒ}ƒV[‚Ì»‘¢¬Œ÷Šm—¦‚̃R[ƒh‚ð•ÏX
+
+ (db)
+ skill_unit_db.txt
+ - ƒ†ƒjƒbƒgID/”z’u‚È‚Ç‚ðdb‰»‚µ‚Ä‚¢‚Ü‚·
+ (src/map)
+ map.h - skill_unit_group‚̃ƒ“ƒo•ÏX
+ mob.c - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(skill_unit_out_all/skill_unit_move)
+ ‚ð’ljÁ
+ - ‘«Œ³’u‚«/d•¡’u‚«”»’f‚ð•ÏX
+ pc.c - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
+ - –³“GŽžŠÔ‚ªI‚í‚éۂɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
+ skill.h - skill_db‚ÌŽQÆŠÖ”‚ðdefine‚É•ÏX
+ - ƒXƒLƒ‹”z’u‚ð“ü‚ê‚éskill_unit_layout\‘¢‘Ì‚ð’è‹`
+ - SC_WATERBALLíœ
+ skill.c - unit_id‚ðdb‰»(skill_unit_db.txt)
+ - ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̃ŒƒCƒAƒEƒg‚ð‹N“®Žž‚É’è‹`
+ - ˆÚ“®Žž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg”»’f(“¯ã)‚ð’ljÁ
+ - ‘«Œ³’u‚«/d•¡’u‚«”»’f‚ð•ÏX
+ - ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̈ړ®ˆ—‚ð•ÏX
+ - ƒfƒ{[ƒVƒ‡ƒ“‚ÌC³
+ - mob‚̃Cƒ“ƒeƒBƒ~ƒfƒCƒg‚Å—Ž‚¿‚é–â‘è‚ðC³
+ - ƒEƒH[ƒ^ƒ{[ƒ‹‚ÌŽd—l•ÏX
+ status.c- SC_WATERBALL‚̈—‚ðíœ
+
+--------------------
+//1109 by End_of_exam
+
+1108‚Ɉø‚«‘±‚«ƒƒ‚ƒŠƒŠ[ƒN‚̃oƒOC³‚Å‚·B‚Q‚‹¤‚É[‚ȃoƒO‚È‚Ì‚ÅA
+ÅV”Å‚ÉXV‚µ‚È‚¢•û‚Å‚àC³‚·‚邱‚Æ‚ð‚¨‚·‚·‚ß‚µ‚Ü‚·B
+
+Eƒyƒbƒg‚ª°‚ɃAƒCƒeƒ€‚ð—Ž‚Æ‚·ŽžAƒyƒbƒg‚ð—‘‚É–ß‚·Žž‚Ƀƒ‚ƒŠƒŠ[ƒN‚ª”­¶
+@‚µ‚Ä‚¢‚½ƒoƒO‚ðC³B(pet.c)
+
+EƒLƒƒƒ‰ƒNƒ^[ˆË‘¶ˆêŽž•Ï”‚Ì—˜—p‚µ‚½ƒLƒƒƒ‰‚ªƒƒOƒAƒEƒg‚·‚é‚ƃƒ‚ƒŠƒŠ[ƒN‚ª
+@”­¶‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
+
+ (src/map)
+ map.c - map_quit() C³
+ pet.c - pet_remove_map(), pet_return_egg() pet_lootitem_drop() C³
+
+--------------------
+//1108 by End_of_exam
+
+EˆÈ‘Oì‚Á‚½ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ[‚ð“‡B(malloc.c core.c)
+@—LŒø‚É‚·‚é‚É‚ÍAmalloc.c“à•”‚̃Rƒƒ“ƒg‚ðŠO‚·•K—v‚ª‚ ‚è‚Ü‚·BŠJ”­‚É‹¦—Í‚µ‚Ä
+@’¸‚¯‚é•û‚ÍAƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚ð—LŒø‚É‚µ‚ÄAƒ`ƒFƒbƒNŒ‹‰Ê(map-server.log‚È‚Ç)‚ð
+@ƒAƒbƒvƒ[ƒh‚µ‚Ä‚­‚ê‚é‚Æ•‚©‚è‚Ü‚·B
+
+@@1. guild.c ‚ªƒRƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚Á‚½‚Ì‚ÅC³(guild.c)
+@@2. pet.c ‚ªƒƒ‚ƒŠ‰ð•ú‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ÅAdo_final_pet() ‚ð’ljÁ(pet.c)
+@@3. do_final_socket ‚ð’ljÁ‚µ‚ÄAI—¹Žž‚É‘S‚Ä‚ÌÚ‘±‚ðØ’f‚·‚é(socket.c)
+@@4. deplicate ‚ÌŒ³ƒXƒNƒŠƒvƒg‚ªI—¹Žž‚Éfree‚³‚ê‚È‚¢ƒoƒO‚ðC³(npc.c)
+@@5. do_final_script ‚ÅŠJ•ú‚³‚ê‚È‚¢ƒƒ‚ƒŠ‚ª‚ ‚éƒoƒO‚ðC³(script.c)
+@@6. do_init_*** ‚̌Ă΂ê‚釔Ԃª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³(map.c)
+@@7. ƒCƒxƒ“ƒg–¼‚ªd•¡‚µ‚½‚Æ‚«‚ɃƒbƒZ[ƒW‚ðo‚·‚悤‚É•ÏX(npc.c)
+@@8. map_quit() “à•”‚Åcharid_db ‚ðfree‚µ–Y‚ê‚Ä‚¢‚éƒoƒO‚ðC³(map.c)
+
+@“Á‚É8.‚ÍÅd—v‚ÅAƒLƒƒƒ‰‚ªƒƒOƒAƒEƒg‚·‚é“x‚Ƀƒ‚ƒŠƒŠ[ƒN‚ª”­¶‚·‚é‚Æ‚¢‚¤A
+@ň«‚ÈŒ‹‰Ê‚É‚È‚Á‚Ä‚¢‚Ü‚µ‚½B‹C‚É‚È‚é•û‚ÍC³‚µ‚Ä‚¨‚«‚Ü‚µ‚傤B
+
+Edelete_session ‚ÅNULLƒ`ƒFƒbƒN‚ð‘Ó‚Á‚Ä‚¢‚½ƒoƒO‚ðC³(socket.c)
+Echrif_disconnect_sub ‚Ådelete_session ‚ðŒÄ‚Ԃ悤‚É•ÏX(chrif.c)
+Eƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒgi/* ` */j‚̉ðÍ‚ð–Y‚ê‚Ä‚¢‚½ƒoƒO‚ðC³(npc.c)
+E‹âs‚È‚Ç‚ÌNPC ‚ÅZeny‚ªMAX_ZENY‚É‚È‚ç‚È‚¢ƒoƒO‚ðC³(pc.c)
+E1107‚Ì»‘¢Šm—¦‚ªˆê•”Á‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³(skill.c thanks to lizorett‚³‚ñ)
+EƒZ[ƒW“]EŽŽŒ±‚̃Cƒxƒ“ƒg‚ªÕ“Ë‚ð‹N‚±‚µ‚Ä‚¢‚½‚Ì‚ðC³(npc.c)
+@@npc_parse_script : dup event jobsage_2nd::OnTimer150000
+@@npc_parse_script : dup event jobsage_2nd::OnTimer30000
+@@npc_parse_script : dup event jobsage_success::OnTimer7000
+@@npc_parse_script : dup event jobsage_success::OnTimer3000
+
+ (src/common)
+ core.c - do_init_memmgr() ’ljÁ
+ malloc.c - ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚̒ljÁ
+ malloc.h - ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚̒ljÁ
+ socket.c - delete_session‚̃oƒOAdo_final_socket‚̒ljÁ
+
+ (src/map)
+ chrif.c - chrif_disconnect_sub() ‚ðC³
+ guild.c - guild_recv_info(), guild_castledataloadack() C³
+ map.c - map_quit() ‚̃ƒ‚ƒŠƒŠ[ƒNAdo_final,do_init C³
+ npc.c - npc_parse_script_line() , npc_parse_script() ‘¼C³
+ pc.c - pc_setparam() C³
+ pet.c - do_final_pet() ’ljÁ
+ pet.h - do_final_pet() ’ljÁ
+ script.c - do_init_script(), do_final_script() C³
+ skill.c - skill_produce_mix() C³
+
+--------------------
+//1107 by code
+E@npctalk, @pettalkƒRƒ}ƒ“ƒh’ljÁ
+Eƒ_ƒ[ƒW‚Ì’x‰„‚ðŽÀ‘•
+E@mes‚ð‘S‘Ì”­Œ¾‚ÉC³
+Eƒtƒ@[ƒ}ƒV[‚Ì»‘¢¬Œ÷Šm—¦C³
+E@storage‚Å‘qŒÉ‚ª“ñd‚ÅŠJ‚­‚±‚Æ‚ª‚È‚¢‚悤C³
+Escript‚É globalmes, getmapmobs ŠÖ”‚ð’ljÁ
+
+ (/src/map)
+ atcommand.c
+ atcommand.h
+ battle.c
+ clif.c
+ clif.h
+ npc.c
+ npc.h
+ script.c
+ skill.c
+ storage.c
+
+--------------------
+//1106 by sylpheed
+
+Eitem_rate_details:1‚ª“®‚©‚È‚©‚Á‚½‚Ì‚ðC³
+
+ (src/map/)
+ mob.c
+
+--------------------
+//1105 by End_of_exam
+
+E1101‚̃}ƒbƒv‚ÌÄ•ª”z‚ªãŽè‚­‚¢‚©‚È‚¢ƒoƒO‚ðC³(char.c thanks to Mystle‚³‚ñ)
+
+ (src/char/)
+ char.c - parse_frommap() C³
+
+--------------------
+//1104 by nameless
+EBCC32‚̃Rƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚È‚Ç‚ÌÅ“K‰»
+EBCC32/VC++‚ÅÅ“K‚ÈÅ“K‰»ƒIƒvƒVƒ‡ƒ“‚ðŒ©‚Â‚¯‚邽‚߂̃xƒ“ƒ`
+Ebcc32_clean.bat‚Æbcc32_make.bat‚ð“‡AƒNƒŠ[ƒ“ƒrƒ‹ƒh‚ÌŽ¸”s‚ð‚µ‚È‚¢‚悤‚ÉB
+
+¦P4‚¾‚©‚ç‚Æ‚©Opteron‚¾‚©‚ç“Á’èƒIƒvƒVƒ‡ƒ“‚Å‘‚¢‚Æ‚¢‚¤‚±‚Æ‚Å‚Í‚È‚¢‚悤‚Å‚·B
+¦P4‚Å‚àƒƒbƒg‚É‚æ‚Á‚Ä‚Í-5‚ªÅ“K‚¾‚Á‚½‚è-3 -O2‚ªÅ“K‚¾‚Á‚½‚è‚·‚é‚à‚Ì‚ª‚ ‚é‚悤‚Å‚·
+¦Žv‚¢ž‚݂ŃIƒvƒVƒ‡ƒ“‚ð‚‚¯‚È‚¢‚悤‚É‚·‚邽‚ß‚Éì‚è‚Ü‚µ‚½B
+¦­‚µ‚Å‚àƒŒƒXƒ|ƒ“ƒX‚ðã‚°‚ĉ^—p‚µ‚½‚¢‚Æ‚¢‚¤l‚ÍŠˆ—p‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (/)
+ bcc32_make.bat
+
+ Å“K‰»ƒIƒvƒVƒ‡ƒ“‚̒ljÁ‚ÆŒxƒƒbƒZ[ƒW‚Å[‚Å‚Í‚È‚¢‚à‚Ì‚ð
+ Š®‘S‚É•\Ž¦‚µ‚È‚¢‚悤‚ÉÝ’èAbcc32_clean.bat‚ðmake‚É“‡‚µ‚½
+ ‚Ì‚ÅŠmŽÀ‚ɃNƒŠ[ƒ“ƒrƒ‹ƒh‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ bench.bat
+ bench.c
+
+ Å“K‚ȃRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚ðŒ©‚Â‚¯‚邽‚߂̃xƒ“ƒ`‚Å‚·B
+ bench.bat‚ŃRƒ“ƒpƒCƒ‹•ŽÀs‚ªs‚í‚ê‚Ü‚·B
+ Œ‹‰Ê‚Íbench.txt‚ÉŠi”[‚³‚ê‚Ü‚·‚Ì‚Å”’l‚̈ê”Ô¬‚³‚¢‚à‚Ì‚ð‘I‚ñ
+ ‚Åbcc32_make.bat‚Ì23s–ڂɒljÁEC³‚µ‚Ä‚ ‚°‚Ä‚­‚¾‚³‚¢B
+ ¦‰Šúó‘Ô‚Å‚Íbcc32—p‚É‚È‚Á‚Ä‚¢‚Ü‚·‚Ì‚Å
+--------------------
+//1103 by End_of_exam
+
+Echar_athena.conf ‚Ìdefault_map_type‚ª0 ‚É‚È‚Á‚Ä‚¢‚鎞‚ÉAPVPƒKƒCƒh‚Å
+@ƒZ[ƒu‚µ‚½ŒãAPVPƒGƒŠƒA“à‚ŃƒOƒAƒEƒg‚µ‚½ƒLƒƒƒ‰‚ªƒƒOƒCƒ“‚Å‚«‚È‚­‚È‚é
+@ƒoƒO‚ðC³B(npc_etc_pvp.txt) ‘½‚­‚Ì•ûX‚©‚ç‚Ìî•ñ’ñ‹ŸŠ´ŽÓ‚µ‚Ü‚·B
+@inpc_etc_pvp.txt “à•”‚Ì ".gat" ‚Ì•t‚¯–Y‚ê‚ÆA‚±‚̃~ƒX‚ɑΉž‚µ‚Ä‚¢‚È‚¢
+@@pc.c ‚̃oƒO‚Å‚·B‚±‚̃pƒbƒ`‚ð“–‚Ä‚È‚¢‚Å‚±‚̃oƒO‚ðC³‚µ‚½‚¢ê‡A
+@@“Y•t‚µ‚½C³ƒtƒ@ƒCƒ‹‚ðŽQl‚É‚µ‚È‚ª‚çAnpc_etc_pvp.txt‚É".gat"‚ð
+@@•t‰Á‚µ‚Ä‚­‚¾‚³‚¢Bj
+
+Edo_final“à•”‚Å•s³‚Ȉ—‚ðs‚¤ê‡‚ª‚ ‚é‚Ì‚ðC³(map.c thanks to lizorett‚³‚ñ)
+Eƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚Ì“Ç‚Ýž‚Ý‚ÉŽ¸”s‚µ‚½‚Æ‚«‚Ƀƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½ƒoƒO‚ðC³(map.c)
+
+ (src/map)
+ pc.c - pc_setsavepoint() C³
+ map.c - do_final(), map_cache_read() C³
+
+ (src/char)
+ char.c - search_mapserver() , parse_char() C³
+
+ (script/npc/etc)
+ npc_etc_pvp.txt - ".gat" ‚ð•t‰Á‚·‚é
+
+--------------------
+//1102 by l’Œ‚³‚ñA
+EƒoƒO•ñƒXƒŒ >>35-37‚É‚ ‚Á‚½C³”Å
+@Ú‚µ‚¢‚±‚Ƃ̓XƒŒ‚ðŒ©‚Ä‚­‚¾‚³‚¢
+ (src/map)
+ pc.c
+
+--------------------
+//1101 by End_of_exam
+
+EsocketŠÖ˜A‚ÌC³(socket.c socket.h)
+
+@1. FIFOŠÖ˜A‚ðfd ‚ª•s³(fd<=0)‚ÌŽž‚É‚à³í‚É“®ì‚·‚é‚悤‚É•ÏX
+@2. socket.h ‚Ì“à•”‚ðFX‚Æ®—
+@3. make_connection() ‚ªÚ‘±‚ÉŽ¸”s‚µ‚½Žž‚ɃGƒ‰[‚ð•Ô‚³‚È‚¢ƒoƒO‚ðC³
+@@@‚»‚Ì•ÏX‚ɇ‚킹‚ÄAchrif.c check_connect_char_server() , char.c
+@@@check_connect_login_server() ‚ðC³B‚±‚ê‚ŃT[ƒo[ƒ]ƒ“ƒr‰»‚̃oƒO‚Í
+@@@‰ðŒˆ‚µ‚½‚ÆŽv‚¢‚Ü‚·‚ªAÄ”­‚µ‚½‚ç•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+
+Echar - map ŠÔ‚̃RƒlƒNƒVƒ‡ƒ“‚ðŒ©’¼‚µ(char.c chrif.c map.c map.h)
+
+@1. char - map ŠÔ‚̃RƒlƒNƒVƒ‡ƒ“‚ªØ‚ꂽ‚çAmap ŽI‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰‚ð
+@@‘S‚ÄØ’f‚·‚é‚悤‚É‚·‚éB‚±‚ê‚ÍA“¯Šú‚ðŽæ‚é‚Ì‚ª“‚¢‚Ì‚ÆAcharŽI‚Æ‚Ì
+@@’ÊM‚ª•K—v‚Ȉ—iƒp[ƒeƒBAƒMƒ‹ƒhAƒyƒbƒg‘¼j‚ª‚Å‚«‚È‚­‚Ȃ邽‚ß‚Å‚·B
+@2. •¡”‚Ìmap ŽI‚Å“¯‚¶ƒ}ƒbƒv‚ð’S“–‚·‚邱‚Æ‚ª‚ ‚éƒoƒO‚ðC³
+@3. map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
+@@•¡”‚Ìmap ŽI‚Å“¯‚¶ƒ}ƒbƒv‚ð“Ç‚Ýž‚ß‚ÎA‚Ç‚ê‚©‚P‚‚ª—Ž‚¿‚Ä‚¢‚鎞‚Å‚àA
+@@³í‚Èmap ŽI‚ɃƒOƒCƒ“‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B—Ⴆ‚ÎA“¯‚¶ƒ}ƒbƒv‚ð
+@@mapŽIA‚ÆB‚É“Ç‚Ýž‚Ü‚¹‚Ä‚¨‚¯‚ÎAA‚ª—Ž‚¿‚Ä‚¢‚鎞‚É‚ÍB‚ÉAB‚ª—Ž‚¿‚Ä‚¢‚é
+@@Žž‚É‚ÍA‚É“]‘—‚³‚ê‚Ü‚·B‚½‚¾‚µA—D懈ʂ̎w’è‚Í‚Ü‚¾o—ˆ‚Ä‚È‚¢‚Ì‚ÅA
+@@‚P‚‚Ìmap ŽI‚Él”‚ªW’†‚µ‚·‚¬‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+
+ (src/map)
+ chrif.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
+ map.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
+ map.h - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
+
+ (src/char)
+ char.c - map ŽI‚ÌŠ„‚è“–‚Ä•û–@‚ÌŒ©’¼‚µ
+
+ (src/common)
+ socket.c - FXC³iã‹LŽQÆj
+ socket.h - FXC³iã‹LŽQÆj
+
+--------------------
+//1100 by nyankochan
+E1098‚ÌC³
+ (src/map)
+ pc.c
+
+--------------------
+//1099 by End_of_exam
+
+Emapflag nosave ‚ª•s³‚ÈŽž‚É‹N“®‚ð’†’f‚³‚¹‚é‚悤‚É‚·‚é(npc.c)
+Epc_autosave ‚ªŒÄ‚΂ê‚é‰ñ”‚ªˆÙí‚É‚‚­‚È‚éƒoƒO‚ðC³(pc.c)
+
+pc_autosave() ‚Ì“à•”‚ªA
+
+> interval = autosave_interval/(clif_countusers()+1);
+> if(interval <= 0)
+> interval = 1;
+
+‚Æ‚¢‚¤•—‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ÅA‚Pƒ}ƒbƒvƒT[ƒo[‚É200l‚̃Lƒƒƒ‰‚ªÚ‘±‚µ‚Ä‚é‚ÆA
+autosave_interval(def:15 * 1000) / 200 = 0.075 •b‚²‚Æ‚ÉŠÖ”‚ªŒÄ‚΂ê‚Ü‚·B
+‚³‚·‚ª‚É‚±‚Ìó‘Ô‚¾‚ÆcharŽI‚ªŒµ‚µ‚­‚È‚é‚Ì‚ÅAŠÖ”‚ðŒÄ‚Ño‚·Å¬ŠÔŠu‚ð
+0.2 •b‚É•ÏX‚µ‚Ü‚µ‚½B
+
+ (src/map)
+ pc.c - pc_autosave ‚ªŒÄ‚΂ê‚é‰ñ”‚ªˆÙí‚É‚‚­‚È‚éƒoƒO‚ðC³
+ npc.c - mapflag nosave ‚ª•s³‚ÈŽž‚É‹N“®‚ð’†’f‚³‚¹‚é
+
+--------------------
+//1098 by nyankochan
+E“üŽè‘•”õ•i‚̌”1ŒÅ’è
+ (src/map)
+ pc.c
+
+--------------------
+//1097 by End_of_exam
+
+Žå‚ɃoƒOC³‚Å‚·BƒoƒO•ñ‚µ‚Ä‚­‚ꂽŠF—l‚ÉŠ´ŽÓAŠ´ŽÓB
+
+EZeny‘B‘Îô(pc.c trade.c script.c)
+ 1. ŒðŠ·Apc_setparam ‚ÅMAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
+ 2. ƒXƒNƒŠƒvƒg‚ɃI[ƒo[ƒtƒ[‘Îô‚ð’ljÁ
+
+EƒƒOƒCƒ“¬Œ÷ŽžEƒAƒJƒEƒ“ƒg•Ï”XVŽž‚É–³ðŒ‚Émmo_auth_sync ‚ð
+@ŒÄ‚ñ‚Å‚¢‚½‚Ì‚ðƒ^ƒCƒ}[‚ðŽg—p‚µ‚½’èŠúXV‚É•ÏX(login.c login_athena.conf)
+
+EdbŠÖŒW‚ɃoƒO‚ªö‚ñ‚Å‚¢‚é–Í—l‚È‚Ì‚ÅAƒ`ƒFƒbƒN‹@\‚ð’ljÁ‚·‚é(db.c db.h)
+@ˆê•”ƒAƒJƒEƒ“ƒg‚̂݃ƒOƒCƒ“•s‰ÂA‘qŒÉƒƒXƒgA@who‚Å•\Ž¦‚³‚ê‚éƒLƒƒƒ‰‚ª
+@ˆê•”Á‚¦‚é‚Ȃǂ̃oƒO‚ÌŒ´ˆö‚ªdbŠÖ˜A‚É‚ ‚é–Í—l‚Å‚·B
+@udb_foreach : data lost %d of %d item(s)v‚Æ‚¢‚¤ƒƒbƒZ[ƒW‚ª•\Ž¦
+@‚³‚ꂽꇂ̓oƒO‚ª‚ ‚éidb‚É“ü‚Á‚Ä‚¢‚é‚Í‚¸‚̃f[ƒ^‚ªÁ‚¦‚½j‚Ì‚ÅA
+@•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+
+E‚ ‚é•û–@‚Å’Êí‚æ‚è‹­‚¢ƒLƒƒƒ‰‚ªì‚ê‚Ä‚µ‚Ü‚¤ƒoƒO‚ÌC³(char.c)
+EƒMƒ‹ƒh‚Ì–ðE–¼‚É•s³‚È•¶Žš‚ªŽg‚¦‚éƒoƒO‚ðC³(int_guild.c)
+EƒXƒNƒŠƒvƒg“à‚Å‚O‚Å‚ÌœŽZŽž‚ª‹N‚±‚Á‚½Žž‚ÉINT_MAX‚ð•Ô‚·‚悤‚É‚·‚é(script.c)
+
+ (conf/)
+ login_athena.conf - autosave_time ‚̒ljÁ
+
+ (src/common)
+ db.h - ƒ`ƒFƒbƒN‹@\‚̒ljÁ
+ db.c - ƒ`ƒFƒbƒN‹@\‚̒ljÁ
+
+ (src/login)
+ login.c - mmo_auth_sync ‚Ƀ^ƒCƒ}[‚ð“K—p
+
+ (src/char)
+ char.c - ’Êí‚æ‚è‹­‚¢ƒLƒƒƒ‰‚ªì‚ê‚Ä‚µ‚Ü‚¤ƒoƒO‚ÌC³
+ int_guild.c - ƒMƒ‹ƒh‚Ì–ðE–¼‚É•s³‚È•¶Žš‚ªŽg‚¦‚éƒoƒO‚ðC³
+
+ (src/map)
+ trade.c - MAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
+ pc.c - MAX_ZENY ‚ð’´‚¦‚éꇂª‚ ‚éƒoƒO‚ðC³
+ script.c - ƒI[ƒo[ƒtƒ[‘ÎôA‚O‚Å‚ÌœŽZŽž‚̈—‚ð’ljÁ
+
+--------------------
+//1096 by lizorett
+E•Ç‰z‚µ‚ɃXƒLƒ‹‚ªŒ‚‚Ä‚Ä‚µ‚Ü‚¤ƒoƒO‚ðC³(ƒoƒO•ñƒXƒŒƒbƒh part8 >>28)
+
+ (src/map)
+ path.c - •Ç‰z‚µ‚ɃXƒLƒ‹‚ªŒ‚‚Ä‚Ä‚µ‚Ü‚¤ƒoƒO‚ðC³
+
+--------------------
+//1095 by lizorett
+EƒXƒNƒŠƒvƒg‚̃GƒXƒP[ƒv”»’f‚ð•ÏX
+EƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìgroup_id‚͈̔͂ð•ÏX
+Eskill_unitsetting()‚Å‘S‚ẴXƒLƒ‹‚Åskill_get_time()‚ðŽg—p‚·‚é‚悤•ÏX
+EƒTƒCƒgƒ‰ƒbƒVƒƒ[‚ðƒ†ƒjƒbƒgƒXƒLƒ‹‚©‚ç”͈ÍUŒ‚–‚–@‚É•ÏX(–{ŽIŽd—l)
+
+ (src/map)
+ skill.c - skill_unitgrouptickset_* ‚Å skill_id/group_id‚ªd‚È‚ç‚È‚¢‚悤
+ ‚Égroup_id‚͈̔͂ð§ŒÀ
+ - SkillStatusChangeTable‚ÉSC_SAFETYWALL,SC_PNEUMA’ljÁ
+ - skill_unitsetting()‚Å‘S‚ẴXƒLƒ‹‚Åskill_get_time()‚ðŽg—p‚·‚é
+ ‚悤•ÏX
+ - ƒTƒCƒgƒ‰ƒbƒVƒƒ[‚ð”͈ÍUŒ‚–‚–@‚É•ÏX
+ npc.c - ƒGƒXƒP[ƒv”»’f‚ðparse_simpleexpr()‚Æ“¯—l‚É‚µA‘SŠp”»’f‚ðíœ
+ (db)
+ skill_cast_db.txt
+ - TS/MS/LoV/FN/SG/HD/GX‚Éupkeep_time‚ðÝ’è
+
+--------------------
+//1094 by End_of_exam
+
+EƒTƒuƒ‹[ƒ`ƒ“ŒÄ‚Ño‚µ\•¶‚̒ljÁ(script.c npc.c npc_convertlabel_db())
+E‹tƒAƒZƒ“ƒuƒ‹ˆ—‚̒ljÁ(script.c , DEBUG_DISASM ‚ð—LŒø‚É‚µ‚Ä‚­‚¾‚³‚¢B)
+Eswitch ‚̈ꎞ•Ï”Á‹ŽˆÊ’u‚ð•ÏX(script.c)
+ERERUNLINE‚ÌÕ“®‚ª‰ö‚µ‚©‚Á‚½‚Ì‚ÅC³(script.c / h , map.h)
+Eƒ\[ƒX‚ð“Ç‚Ý‚â‚·‚­‚·‚邽‚ß‚Ébuildin_*‚ðƒtƒ@ƒCƒ‹ÅŒã‚Ɉړ®(script.c)
+EV‚µ‚­‰Á‚í‚Á‚½\•¶‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚ÄuƒnƒmƒC‚Ì“ƒv‚ð’ljÁ(npc_test_hanoi.txt)
+Ebuildin_getitemname C³(script.c , Ž¿–âƒXƒŒƒbƒh Part14 >>129-130)
+
+Ebcc ‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚É—Ž‚¿‚éƒoƒO‚ðC³(map.c map_id2bl “à•”)
+EWindows‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚ÉAgettick()‚̃LƒƒƒbƒVƒ…‚ª–³Œø‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð
+@C³(timer.c , thanks to Shinomori)
+
+ (src/common)
+ timer.c gettick() ‚̃oƒOC³
+
+ (src/map)
+ script.c FX•ÏXiã‹LŽQÆj
+ script.h struct script_state C³
+ npc.c npc_convertlabel_db() ‚Å—Ž‚¿‚é‚Ì‚ðC³
+ map.c map_id2bl() ‚ðC³(—Ž‚¿‚é‚Ì‚Íbcc ‚¾‚¯H)
+ map.h map_session_data C³
+
+ (doc/)
+ script_ref.txt function \•¶‚̒ljÁ
+
+ (script/sample/)
+ npc_test_hanoi.txt ƒnƒmƒC‚Ì“ƒ
+
+--------------------
+//1093 by ‚¢‚Ç
+
+EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
+
+--------------------
+//1092 by lizorett
+E‰“‹——£UŒ‚‚̃pƒXŒŸõƒAƒ‹ƒSƒŠƒYƒ€‚ð–{ŽI‚Æ“¯‚¶‚É‚È‚é‚悤•ÏX
+EƒXƒg[ƒ€ƒKƒXƒgAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ðd‚Ë‚½ê‡A•Ð•û‚©‚炾‚¯ƒ_ƒ[ƒW‚ð
+Žó‚¯‚é‚悤C³(Žd—l‚ª•s–¾‚È‚Ì‚Åæ‚ÉŒ©‚‚¯‚½ƒ†ƒjƒbƒg‚©‚çUŒ‚‚·‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·)
+EƒAƒCƒeƒ€‚ªˆê‚‚µ‚©‚È‚¢ê‡AƒAƒCƒeƒ€‚ðŽg—p‚µ‚Ä‚àƒGƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚È‚¢–â‘è
+‚ðC³
+EƒZ[ƒtƒeƒB[ƒEƒH[ƒ‹Žg—pŽž‚ɃAƒhƒŒƒX•s³‚Æ‚È‚éꇂª‚ ‚é–â‘è‚ðC³
+Emap_getcell/map_setcell‚ÌŽd—l•ÏX
+E1085‚̃rƒbƒgƒ}ƒbƒv‘Ήž‚Ì­Õ‚ÌÁ‹Ž
+E1088‚̃AƒCƒXƒEƒH[ƒ‹‚Ì•ÏX‚ðŠª‚«–ß‚µ(–{ŽI‚ɇ‚킹‚é)
+E‘SŠp”»’f(npc.c)‚ðC³(For English User Forum >>54)
+
+ (’ˆÓ) map_athena.conf‚̃}ƒbƒvƒLƒƒƒbƒVƒ…Žw’è‚ðs‚¤ƒpƒ‰ƒ[ƒ^–¼‚ð•ÏX‚µ‚Ä‚¢‚Ü‚·
+
+ (conf)
+ map_athena.conf - read_map_from_bitmap‚ðread_map_from_cache ‚É•ÏX
+ - map_bitmap_path‚ðmap_cache_file‚É•ÏX
+ (src/map)
+ map.h - ƒZƒ‹ƒ^ƒCƒv–¼Ì•ÏX(CELL_CHKHIGH,CELL_CHKTYPE)A
+ íœ(CELL_SET*)
+ - skill_unit_group_ticksetƒƒ“ƒo–¼•ÏX(group_id -> id)
+ - ƒrƒbƒgƒ}ƒbƒvŠÖ˜A‚Ì‹Lq‚Ì­Õ‚ðíœ
+ map.c - map_getcell() ƒZƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚Ǝ኱‚̃R[ƒh•ÏX
+ - map_setcell()‚ð1084ˆÈ‘O‚ÌŽd—l‚É–ß‚µACELL_SETNPC‚Ì
+ ƒtƒ‰ƒO‚ð’ljÁ
+ - map_cacheŠÖ˜A‚Ìׂ©‚ÈC³
+ npc.c - ‘SŠp”»’f(is_zenkaku)‚ð³Šm‚És‚¤‚悤•ÏX
+ - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
+ pc.c - ƒAƒCƒeƒ€‚ªˆê‚‚µ‚©‚È‚¢ê‡AŽg—pŽž‚̃GƒtƒFƒNƒg‚ª•\Ž¦
+ ‚³‚ê‚È‚¢–â‘è‚ðC³
+ - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
+ skill.c - ƒXƒg[ƒ€ƒKƒXƒgAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚ðd‚Ë‚½ê‡
+ •Ð•û‚©‚炾‚¯ƒ_ƒ[ƒW‚ðŽó‚¯‚é‚悤C³
+ - ƒZ[ƒtƒeƒB[ƒEƒH[ƒ‹Žg—pŽž‚ɃAƒhƒŒƒX•s³‚Æ‚È‚éꇂª
+ ‚ ‚é–â‘è‚ðC³
+ - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
+ skill.h - ŠÖ”’è‹`•ÏX
+ path.c - ‰“‹——£UŒ‚‚̃pƒXŒŸõˆ—‚ð’ljÁ(path_search_long)
+ - map_getcell()‚̃Zƒ‹ƒ^ƒCƒv–¼Ì•ÏX‚É’Ç]
+ battle.c - ‰“‹——£UŒ‚‚̃pƒXŒŸõ‚ðŽg—p‚·‚é‚悤•ÏX
+
+--------------------
+//1091 by End_of_exam
+
+––@’ˆÓ@––
+
+@¡‰ñ‚̃pƒbƒ`‚͉ü‘¢“à—e‚ª•¡ŽG‚È‚Ì‚ÅA“±“ü‚ÍTd‚És‚Á‚Ä‚­‚¾‚³‚¢B
+@status.c / h ‚Ö‚Ì•ª—£‚ÍAŠÖ”–¼‚Ì’u‚«Š·‚¦‚¾‚¯‚É—¯‚ß‚½‚‚à‚è‚Å‚·‚ªA
+@Žv‚í‚ʃoƒO‚ªö‚ñ‚Å‚¢‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+
+EƒXƒpƒQƒeƒB‘Îô‚̈êŠÂ‚Æ‚µ‚ÄAƒXƒe[ƒ^ƒXŒvŽZAó‘ÔˆÙí‚ÉŠÖ‚í‚é•”•ª‚ð
+@status.c / h ‚Æ‚µ‚Ä•ª—£Bbattle.c ‚©‚ç39KB’ö , skill.c ‚©‚ç41KB’ö ,
+@pc.c ‚©‚ç38KB’öˆÚ“®‚Å‚«‚Ü‚µ‚½B­X‹­ˆø‚Å‚·‚ªAƒXƒLƒ‹Žg—p‚âUŒ‚‚È‚Ç‚Ì
+@ˆ—‚Ì—¬‚ê‚ð‚‚©‚Ý‚â‚·‚­‚·‚邽‚ß‚É‚ÍAbattle.c / skill.c ‚Ì’†g‚ð
+@Œ¸‚ç‚·•K—v‚ª‚ ‚é‚Æl‚¦‚½‚½‚ß‚Å‚·B
+
+ battle_get_* => status_get_*
+ skill_status_change_* => status_change_*
+ pc_calcstatus => status_calc_pc
+ pc_calc_sigma => status_calc_sigma
+ pc_getrefinebonus => status_getrefinebonus
+ pc_percentrefinery => status_percentrefinery
+
+Ebattle.c , script.c ‚ÌŠª‚«–ß‚è‚ð–ß‚·
+Enpc.c ‚̉ö‚µ‚¢•ÏX‚ð–ß‚µA‚«‚¿‚ñ‚ÆNUL ‚ð•t‚¯‰Á‚¦‚é‚悤‚É‚·‚é
+Escript.c ‚̃~ƒX‚𒼂·ijump_non_zero => jump_zero@ˆÓ–¡‚ª‹t‚É‚È‚Á‚Ä‚Ü‚µ‚½cj
+Eskill.c ‚Ì•ŠíC— ‚̃Rƒƒ“ƒgƒ~ƒX‚ðC³
+EWIN32‚ŃRƒ“ƒpƒCƒ‹‚µ‚½ŽžAÅ‘åÚ‘±l”‚ª60l’ö‚ɧŒÀ‚³‚ê‚Ä‚¢‚½ƒoƒO‚ðC³
+
+ (/)
+ athena.dsw , athena.dsp , bcc32_make.bat , src/login/login.dsp
+ src/char/char.dsp , src/map/map.dsp
+ ƒRƒ“ƒpƒCƒ‹ðŒ‚Ì•ÏX
+
+ (src/map/)
+ ã‚Ì•ª—£‚ɇ‚킹‚ăRƒ“ƒpƒCƒ‹ƒGƒ‰[‚Ìo‚È‚¢‚悤‚ÉC³
+
+--------------------
+//1090 by Sapientia
+Eƒ`ƒƒƒbƒg‚Ì•Ö—˜‚³‚Ì‚½‚ß‚É‹©‚ԒljÁ (ƒMƒ‹ƒhƒ`ƒƒƒbƒg‚Ƌ敪‚·‚邽‚߂ɃEƒFƒ`ƒMƒV‚Ì‘O‚É [‹©‚Ô‚±‚Æ]‚ª•t‚«)
+Eatcomand_athena.conf ‚Å onlymes ‚ð 0‚Åݒ肵‚ÄŠFŽg‚¤‚悤‚ÉŠˆ«‰»
+ ƒIƒŠƒWƒiƒ‹‚Ȃ̂ŃfƒtƒHƒ‹ƒg‚Å GM‚¾‚¯Žg‚¤‚±‚Æ‚ª‚Å‚«‚é‚悤‚Éݒ肵‚Ü‚µ‚½.
+E@mes [Œ¾‚¤‚±‚Æ] ‚ÅŽg—p
+
+ (src/map)
+ atcommand.c atcommand_charkami ’ljÁ
+ atcommand.h
+ clif.c clif_onlymessage ’ljÁ
+ clif.h
+ (src/conf)
+ atcommand_athena.conf onlymes ’ljÁ
+ help.txt @mes à–¾’ljÁ
+
+
+--------------------
+//1089 by ¹
+EVC.NET2003‚ŃRƒ“ƒpƒCƒ‹‚·‚é‚Æ‘å—Ê‚ÉŒx‚ªo‚é‚Ì‚ðC³
+E‚»‚Ì‘¼ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[“™‚Ìׂ©‚¢ƒoƒOC³
+
+ (src/char)
+ int_guild.c Œx‰ÓŠ‚ðC³
+
+ (src/map)
+ atcommand.c, battle.c, clif.c, itemdb.c, pc.c, pc.h, script.c, skill.c
+ Œx‰ÓŠ‚ðC³
+ npc.c Œx‰ÓŠ‚ƃoƒbƒtƒ@ƒI[ƒo[ƒtƒ[C³
+
+--------------------
+//1088 by Sapientia
+EƒEƒBƒUƒhƒXƒLƒ‹ Icewall ‚±‚̃Lƒƒƒ‰ƒNƒ^[‚⃂ƒ“ƒXƒ^[‘«‚à‚Æ‚ÉÝ’u‚³‚ê‚邱‚Æ‚ð–hŽ~
+Eƒ[ƒhƒiƒCƒgƒXƒLƒ‹ Berserk Žg—p‚ÌŽž HP‚ª 1/3‚É‚È‚ê‚Ήñ•œ‚·‚éƒoƒOC³
+
+ (src/map)
+ pc.c Berserk C³
+ skill.c Icewall C³
+
+--------------------
+//1087 by End_of_exam
+
+Eƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚Ɉ³k‹@”\‚ð’ljÁ(1MB’ö‚Ék‚Ü‚é‚悤‚Å‚·)
+Enpc.c ‚ÌŠª‚«–ß‚è‚ðC³(Ž¿–âƒXƒŒƒbƒh Part14 , 111)
+Emap_athena.conf ‚̃Rƒƒ“ƒgƒAƒEƒg‚ðC³(AthenaŽG’kƒXƒŒƒbƒhPart7 , 146)
+EWindows —p‚Ì‹N“®ƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚Ä‚Ý‚é(eAthena ‚Ì‚ðŒ³‚É‰ü‘¢j
+
+ (/)
+ win32_start.bat Windows —p‚Ì‹N“®ƒtƒ@ƒCƒ‹
+
+ (src/map)
+ map.c ˆ³k‹@”\‚̒ljÁ
+ npc.c Šª‚«–ß‚è‚ðC³
+
+ (src/common)
+ grfio.c decode_zip , encode_zip ‚̃GƒNƒXƒ|[ƒg
+ grfio.h decode_zip , encode_zip ‚̃GƒNƒXƒ|[ƒg
+
+ (conf/)
+ map_athena.conf C³
+
+--------------------
+//1086 by End_of_exam
+
+Žå‚É1085‚̃oƒOC³‚¾‚Á‚½‚è‚à‚µ‚Ü‚·B
+u‚Ä‚ß[A‚P‚©‚ç‘‚«’¼‚µ‚₪‚Á‚Äv‚Æ‚¢‚¤“Ë‚Áž‚Ý‚¾‚¯‚ÍŠ¨•Ù‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚¹B
+
+Eƒf[ƒ^\‘¢‚Ì‘å•ÏX(map.c)
+ ƒ}ƒbƒv‚ð휕’ljÁ‚µ‚Ăೂµ‚­“®‚­‚悤‚É•ÏX
+ ƒ}ƒbƒvƒLƒƒƒbƒVƒ…쬒†‚É‹­§I—¹‚·‚é‚ÆÄ‹N“®Žž‚É•sˆÀ’è‚É‚È‚éƒoƒO‚ðC³
+ ˆ³kƒtƒ‰ƒO‚̒ljÁiŽù—v‚ ‚é‚Ì‚©•s–¾Bcompress‚ð^‚É‚·‚é‚ÆAŒ»Ý‚̃\[ƒX‚Å
+ “Ç‚ß‚È‚­‚È‚è‚Ü‚·Bj
+
+E‚È‚ñ‚©Õ“®‚ª‚ ‚₵‚·‚¬‚é‚Ì‚ÅAƒrƒbƒgƒ}ƒbƒvˆ—‚ð“P”p‚·‚é(map.c map.h)
+ npc_touch_areanpc : some bug@‚ª‚½‚­‚³‚ño‚Ä‚­‚é -> Œ´ˆö•s–¾H
+ ‹°‚ç‚­’Ês‰Â”\”»’肪³‚µ‚­Ý’肳‚ê‚Ä‚¢‚È‚¢‚Á‚Û‚¢‚ñ‚Å‚·‚ª“ä‚Å‚·B
+ ”read_map_from_bitmap ‚ÌÝ’è‚ðÈ‚­‚ƃƒOƒCƒ“Žž‚É—Ž‚¿‚éƒoƒO‚ðC³
+
+EƒLƒƒƒbƒVƒ…“à‚É‘S‚Ẵ}ƒbƒv‚ª‚ ‚ê‚ÎAgrf –³‚µ‚Å‚à“®ì‚·‚é‚悤‚É•ÏXB(grfio.c map.c)
+
+ (src/map)
+ map.c ƒoƒOC³‘¼
+ map.h ƒoƒOC³‘¼
+
+ (src/common)
+ grfio.c ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢Žž‚Éexit ‚ðŒÄ‚΂Ȃ¢‚悤‚ÉC³
+
+--------------------
+//1085 by zalem
+Eƒ}ƒbƒvƒf[ƒ^‚Ì“Ç‚Ýž‚݂̓rƒbƒgƒ}ƒbƒvƒtƒ@ƒCƒ‹‚©‚çs‚È‚¦‚é‚悤‚È‹@”\’ljÁ
+
+ grfƒtƒ@ƒCƒ‹‚©‚çˆê“xƒrƒbƒgƒ}ƒbƒvƒtƒ@ƒCƒ‹‚ð쬂µ‚ĈȌã‚Í‚»‚Ì
+ 쬂³‚ꂽƒrƒbƒgƒ}ƒbƒvƒtƒH[ƒ}ƒbƒg‚̃tƒ@ƒCƒ‹‚©‚çƒ}ƒbƒvî•ñ‚ð“Ç‚Ýž‚Þ
+ ‚Æ‚¢‚¤•û–@‚ð̂邱‚Æ‚É‚æ‚Á‚ÄAmap-server‚ª—§‚¿ã‚ª‚鎞ƒ}ƒbƒvî•ñ‚ð“Ç‚ÝŽæ‚é
+ ‚Ì‚ÉŠ|‚©‚鎞ŠÔ‚ª‚Ù‚Æ‚ñ‚Ç‚È‚­‚È‚éA‚Ü‚½1int‚É32ŒÂ‚̃Zƒ‹î•ñ‚ªŠi”[‚Å‚«‚é‚Ì
+ ‚ÅAmapî•ñ‚ÉŠÖ‚·‚郃‚ƒŠŽg—p—Ê‚à‚RŠ„‚è‹ß‚­‚Ü‚ÅŒ¸‚é‚Ì‚Å(‚»‚Ì‚©‚í‚è‚É
+ ‚ ‚é’ö“xCPU‚Ì•‰’S‚ª‘å‚«‚­‚È‚é)A’ljÁ‚µ‚Ä‚Ý‚½B
+ conf/map_athena.conf‚Ìread_map_from_bitmapƒIƒvƒVƒ‡ƒ“‚Å—˜—p‚·‚é
+ ‚©‚Ç‚¤‚©‚ðŽw’è‚Å‚«A‚»‚̉º‚É‚ ‚émap_bitmap_path‚Ńtƒ@ƒCƒ‹–¼‚ð•ÏX‚·‚é
+ (ƒfƒtƒHƒ‹ƒg‚Ådb/map.info)
+ ‚Ü‚¾ƒeƒXƒg’iŠK‚È‚Ì‚ÅA“±“ü‚Í‚²Td‚É(ˆê‰žLinux‚ÅA‚¢‚ë‚¢‚ë‚Æ
+ ƒeƒXƒg‚µ‚Ä‚Ý‚½‚ª...)
+
+Emap_getcell()‚É4”Ô–Úˆø”‚̒ljÁ‚Æmap_setcell()‚Ì4”Ô–Úˆø”‚Ì•ÏX
+
+ ŠÖ”‚Ì—˜—pˆÓ}‚ª‚í‚©‚è‚â‚·‚¢‚悤‚ÉA‚»‚µ‚Ä‚±‚ê‚©‚ç‚Ì•ÏX‚ð—eˆÕ‚É‚·‚é
+ ‚½‚ß‚ÉAmap_getcell()‚Æmap_setcell()‚Ì‚»‚ꂼ‚ê4”Ԗڂ̈ø”‚ð’ljÁA•ÏX‚µ‚Ä‚Ý‚½A
+ map_getcell()‚Ì4”Ԗڂ̈ø”‚Ímap.h‚Å’è‹`‚³‚ê‚Ä‚éCELL_CHK—ñ‹“Œ^Amap_setcell()
+ ‚Ì4”Ԗڂ̈ø”‚Ímap.h‚Å’è‹`‚³‚ê‚Ä‚éCELL_SET—ñ‹“Œ^‚ð‚Æ‚é‚悤‚É•ÏX.‚Ü‚½Aã‚Ì
+ Feature‚ɑΉž‚·‚邽‚ßAmap_getcell()‚ðƒ|ƒCƒ“ƒ^‚É•ÏX‚µ‚½B
+
+ Žå‚È•ÏX“_F
+
+ src/map/map.h read_gat(),read_gatp()ƒ}ƒNƒ‚Ì•ÏX
+ —ñ‹“Œ^ CELL_CHK,CELL_SET‚ð’ljÁ,map_getcell(),map_setcel()—p
+ map_data\‘¢‘̂Ƀƒ“ƒo[int* gat_fileused[MAX_CELL_TYPE+2]’ljÁ
+ src/map/map.c map_getcell()‚ðŠÖ”Œ^ƒ|ƒCƒ“ƒ^‚É•ÏX,map_getcellp()‚ðread_gatp()
+ ‚Ì‚½‚߂ɒljÁ,ŽÀۂɉº‚ÌŽl‚‚̊֔‚Ì‚Ç‚Á‚¿‚ÉŽw‚·‚©‚Ímap_read_flag‚É‚æ‚é
+ map_getcell_gat(),map_getcell_bitmap() ’ljÁ
+ map_getcellp_gat(),map_getcellp_bitmap() ’ljÁ
+ map_setcell() •ÏX
+ map_createbitmap() ’ljÁ
+ map_readmapfromfile() ’ljÁ
+ map_readallmap() •ÏX
+ map_config_read() •ÏX
+ do_final() •ÏX
+ ˆÈ‰º‚Ì*.cƒtƒ@ƒCƒ‹“à‚Ìmap_getcell(),map_setcell(),read_gat(),read_gatp()‚ðŒÄo‚µ‚½•”•ª‚ð‚·‚×‚Ä•ÏX
+ src/map/atcommand.c
+ src/map/mob.c
+ src/map/npc.c
+ src/map/path.c
+ src/map/pc.c
+ src/map/pet.c
+ src/map/skill.c
+
+ conf/map_athena.conf read_map_from_bitmap,map_bitmap_path ’ljÁ
+
+--------------------
+//1084 by lizorett
+EŒoŒ±’lŠl“¾‚̃oƒOC³(ƒoƒO•ñƒXƒŒƒbƒh part7 >>134)
+ (src/map)
+ mob.c ŒoŒ±’lŒvŽZC³
+
+--------------------
+//1083 by End_of_exam special thanks to lizorett‚³‚ñ
+Eƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚̒ljÁ
+ (common/socket.c common/socket.h login/login.c char/char.c map/clif.c map/chrif.c)
+ ƒ\ƒPƒbƒg‚ð•Â‚¶‚鎞‚̈—‚Ì—¬‚ꂪ•ÏX‚É‚È‚è‚Ü‚·B¡‚܂Ń\ƒPƒbƒg‚ð•Â‚¶‚éꇂÍA
+ ‚Ü‚¸session[fd]->eof ‚ð^‚É‚µ‚½ŒãAƒp[ƒYƒ‹[ƒ`ƒ““à‚Ō㈗iƒƒ‚ƒŠ‰ð•ú‚È‚Çj
+ ‚µ‚Ä‚¢‚Ü‚µ‚½B‚Å‚·‚ªAclose(fd); ‚ª‚Qd‚ÉŽÀs‚³‚ê‚ăT[ƒo[‚ª—Ž‚¿‚é‚È‚Ç‚Ì
+ ƒoƒO‚ª”­¶‚µ‚Ä‚¢‚½‚èAˆ—‚Ì—¬‚ꂪ‚‚©‚Ý‚É‚­‚¢‚Æ‚¢‚Á‚½——R‚©‚çAsocket.c “à•”‚Å
+ ‘S‚Ĉ—‚·‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½Bƒ\ƒPƒbƒg‚ð•Â‚¶‚鎞‚ÌŽå‚È—¬‚ê‚ÍŽŸ‚Ì’Ê‚è‚Å‚·B
+
+ 1. ƒ\[ƒX“à‚©‚çsession[fd]->eof = 1; ‚ð‚·‚é
+ 2. socket.c “à‚©‚çsession[fd]->destruct() ‚ªŒÄ‚΂ê‚é
+ 3. ƒƒ‚ƒŠ‚̉ð•ú•Œãˆ—(socket.c delete_session“à•”)
+
+ close(fd) ‚ÍAsession[fd]->eof = 1; ‚É’u‚«Š·‚¦‚Ü‚µ‚½(#define)B
+ ‚Ü‚½Adelete_session() ‚𖾎¦“I‚ɌĂԕK—v‚Í‚ ‚è‚Ü‚¹‚ñB
+
+Eƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³(map/map.c map/pc.c map/chrif.c)
+ ƒ\ƒPƒbƒgØ’fŽž‚É‘qŒÉƒf[ƒ^‚̃LƒƒƒbƒVƒ…‚ðÁ‚·‚悤‚É•ÏX
+ ‚QdƒƒOƒCƒ“Žž‚Ƀ}ƒbƒvƒT[ƒo[‚ªˆá‚Á‚½ê‡‚É‚àØ’f‚Å‚«‚é‚悤‚ÉC³
+
+EŒÃ‚¢ƒo[ƒWƒ‡ƒ“‚ŃƒOƒCƒ“‚µ‚½Žž‚ÉmapŽI‚ª—Ž‚¿‚éƒoƒO‚ðC³(map/clif.c)
+ clif_parse() “à•”
+
+ if(packet_db[cmd].len==0) {
+ -> if(cmd<MAX_PACKET_DB && packet_db[cmd].len==0) {
+
+Egcc ‚ŃRƒ“ƒpƒCƒ‹‚µ‚½Žž‚Étimer.c ‚Åwarning ‚ªo‚½‚Ì‚ðC³(common/timer.c)
+ timer.c:116: warning: `check_timer_heap' defined but not used
+
+ (src/common/)
+ socket.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+ socket.h ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+ timer.c warning C³
+
+ (src/map/)
+ clif.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+ chrif.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+ map.c ƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³
+ pc.c ƒ}ƒbƒvŽI•ª”zŽž‚̃AƒCƒeƒ€dupe–â‘èC³
+
+ (src/char/)
+ char.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+
+ (src/login/)
+ login.c ƒ\ƒPƒbƒg‚̃fƒXƒgƒ‰ƒNƒ^ˆ—‚ð’ljÁ
+
+--------------------
+//1082 by lizorett (2004/12/18) special thanks to –¼–³‚µ—l@‚‡—‚‚…
+E”’nŽæ‚è‚ðƒ{ƒX‚É–³Œø‚É•ÏX
+E1079‚Ì•ÏX•”•ª‚ÉNULLƒ`ƒFƒbƒN‚ð’ljÁ
+EƒJ[ƒh‚ÌŒø‰Ê‚ªæ‚ç‚È‚¢ƒXƒLƒ‹‚ɃGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“Œø‰Ê‚ªæ‚ç‚È‚¢‚æ
+ ‚¤‚É•ÏX
+EƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ÌŒø‰Ê‚ɶŽè‚ªÚ‚ç‚È‚¢‚悤‚É•ÏX
+EƒTƒNƒŠƒtƒ@ƒCƒX‚ðŽÀ‘•
+EƒXƒg[ƒ€ƒKƒXƒg‚̃mƒbƒNƒoƒbƒN‚ªƒXƒLƒ‹Žw’èˆÊ’u‚ð’†S‚Æ‚·‚é‚悤•ÏX
+EƒXƒLƒ‹‚ÌŽË’ö‹——£‚©‚ç1ƒZƒ‹—£‚ꂽꊂðŽw’肵‚ăXƒLƒ‹‚ðŽg‚¤‚Ɖ½‚à‹N‚±‚ç‚È‚¢–â‘è
+ ‚ðC³
+EŒoŒ±’l‚Ì”z•ª‚ðC³(ƒ_ƒ[ƒW‚ð—^‚¦‚½l‚ª‚¢‚È‚¢ê‡‚âA“Ń_ƒ[ƒW‚ª‚ ‚éꇂɌo
+ Œ±’l‚ª­‚È‚­‚È‚Á‚Ä‚¢‚½)
+E‘•”õ‚µ‚Ä‚¢‚È‚¢‰ÓŠ‚ւ̃XƒgƒŠƒbƒvƒXƒLƒ‹‚ªŽ¸”s‚·‚é‚悤•ÏX
+Eƒpƒbƒ`ƒAƒbƒvƒXƒŒƒbƒh Part 6H‚Ì>>116,>>125,>>126 ‚̃tƒ@ƒCƒ‹‚ð”O‚Ì‚½‚߃}[ƒW
+
+ (db/)
+ skill_db.txt, skill_cast_db.txt, skill_require_db.txt
+ - ƒTƒNƒŠƒtƒ@ƒCƒX‚Ì‹Lq‚ðC³/’ljÁ
+ (src/map/)
+ battle.c - ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚Ì•ÏX
+ - ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌŽÀ‘•
+ - ƒXƒg[ƒ€ƒKƒXƒg‚̃mƒbƒNƒoƒbƒN•ûŒü‚ð•ÏX
+ - ”’nŽæ‚è‚ðƒ{ƒX‚É–³Œø‚É•ÏX
+ skill.h - SC_SACRIFICE‚ð’ljÁ
+ skill.c - ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌŽÀ‘•
+ - skill_castend_damage_id()‚ÌMG_FROSTDIVER/MG_STONECURSE‚É
+ NULLƒ`ƒFƒbƒN‚ð’ljÁ
+ mob.c - ŒoŒ±’l‚Ì”z•ª‚ðC³
+ script.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>125)
+ npc.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>126)
+ (src/common)
+ core.c - ŒÂ•Ê‚Éo‚³‚ê‚Ä‚¢‚½ƒtƒ@ƒCƒ‹‚ðƒ}[ƒW(>>116)
+
+--------------------
+//1081 by End_of_exam
+Euƒ‹[ƒv\•¶‚Ì•û‚àŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢v‚Æ‚¢‚¤—v–]‚ð–á‚Á‚½‚Ì‚ÅA
+@for , while , do - while \•¶‚𓱓üBŒÂl“I‚É—]‚èŽù—v‚Í–³‚¢‚ÆŽv‚¤‚Ì‚Å‚·‚ªcB
+
+Eelse‚ªŠ®‘S‚ɉðÍ‚Å‚«‚Ä‚È‚©‚Á‚½ƒoƒO‚ðC³B
+Eswitch ‚Ìbreak; ‚ªêŠ‚É‚æ‚Á‚Ă̓Rƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚éƒoƒO‚ðC³B
+
+ (src/map/)
+ script.c : \•¶‚ðŠg’£BFX®—B
+
+ (doc/)
+ script_ref.txt : ã‚ÌC³‚ɇ‚킹‚Ä•ÏXB
+
+--------------------
+//1080 by End_of_exam
+
+EƒXƒNƒŠƒvƒg‚ð if - else if - else \•¶ , switch \•¶‚ɑΉž‚³‚¹‚Ü‚µ‚½B
+@‘½dƒlƒXƒg‚ª‰Â”\‚Å‚·‚Ì‚ÅA¡‚Ü‚Å‚æ‚茩‚â‚·‚¢ƒXƒNƒŠƒvƒg‚ª‘‚¯‚é‚ÆŽv‚¢‚Ü‚·B
+@if(aa) { aaa(); } else if(bb) { cc; if(dd) { ee() } else { ff(); } }
+@‚»‚ê‚É”º‚¢A__ ‚©‚çŽn‚Ü‚é•Ï”‚⃉ƒxƒ‹‚ð—p‚¢‚é‚ÆA•s“s‡‚ª¶‚¶‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+
+EƒXƒNƒŠƒvƒg‚ÉV‚µ‚¢ŠÖ”(selectŠÖ”Emenu–½—ß‚ÌŠÖ””Å)‚ð’ljÁ‚µ‚Ü‚µ‚½B
+
+ (src/map/)
+ script.c : \•¶‚ðŠg’£
+ npc.c : npc_perse_script ‚ÌC³( { , } ‚̃lƒXƒg‚ɑΉž )
+
+ (script/)
+ npc/town/npc_town_alberta.txt : ˆêƒJŠ goto ‚ª”²‚¯‚Ä‚½‚Ì‚ÅC³
+ sample/npc_debug_pota.txt : switch , select ‚ðŽg‚Á‚Ä‘‚«’¼‚µ
+ (ƒfƒoƒbƒO‚ÉŽg‚킹‚Ä–á‚¢‚Ü‚µ‚½)
+
+ (doc/)
+ script_ref.txt : ã‚ÌC³‚ɇ‚킹‚Ä•ÏX
+--------------------
+//1079 by Yuuki
+EΉ»’†‚ɃXƒg[ƒ“ƒJ[ƒX‚ðŽg‚¤‚ÆΉ»‰ðœ
+EFD‚ŃXƒLƒ‹’ljÁŒø‰Ê‚ðŽg‚¤‚Æ•X‰»’†ƒ_ƒ[ƒW”»’è‚Åæ‚ÉŠ„‚ê‚Ä‚à‚¤ˆê“x•X‰»”»’肪‚­‚é‚̂ŃXƒLƒ‹’ljÁŒø‰Ê‚‚©‚킸
+EBB‚Ň–°Î‰»•X‰»‚ªŠ„‚ê‚È‚¢ƒoƒO‚ÌC³(“ÆŽ©‚̃_ƒ[ƒW”»’èŽg‚Á‚Ä‚½‚Ì‚ÅÁ‚µ‚ij‹K‚̃_ƒ[ƒW”»’è‚É–ß‚µ‚½)
+EƒfƒBƒŒƒC0‚̃XƒLƒ‹‚Éadelay/2’ljÁ(GŽI‚ÅTSŽg‚Á‚ÄŒŸØ‚µ‚½Œ‹‰ÊÅ‚à‚±‚ꂪ‹ß‚©‚Á‚½’ÊíUŒ‚‚æ‚è‚Í‚â‚©‚Á‚½‚Ì‚Å)
+
+ (src/map)
+ skill.c
+
+--------------------
+//1078 by End_of_exam
+
+EVisual C++ 6.0 / bcc32 ‚ŃRƒ“ƒpƒCƒ‹o—ˆ‚é‚悤‚ÉC³(•Ê“rzlib.dll ‚ª•K—v)
+E1074‚ÍŒ‡”Ô‚É‚µ‚Ü‚·BFX‚Æ‚²–À˜f‚ð‚©‚¯‚½Ž–‚ð‚¨˜l‚Ñ‚µ‚Ü‚·B
+
+––@’ˆÓ@––
+ ¡‰ñ‚̃o[ƒWƒ‡ƒ“‚ÌŠ®‘S‚È“®ìŠm”F‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñil’Œ”ňµ‚¢‚É‚µ‚Ä‚­‚¾‚³‚¢jB
+ –{Ši“I‚ȉ^—p‚É“¥‚ÝØ‚é‘O‚É‚ÍA•K‚¸“®ìŠm”F‚ð‚·‚é‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
+ ꇂɂæ‚Á‚Ä‚ÍAƒRƒ“ƒpƒCƒ‹o—ˆ‚È‚¢A•s³‚È“®ì‚É‚È‚éc“™X‚Ì–â‘肪‹N‚±‚é‚©‚à
+ ‚µ‚ê‚Ü‚¹‚ñ‚ªA‚»‚Ì‚Æ‚«‚ÍA‘›‚ª‚¸AQ‚Ä‚¸‚ÉAƒl\‚Ì~—Õ‚ð‘҂‚悤‚¨Šè‚¢‚µ‚Ü‚·B
+
+–– ‚¨Šè‚¢ ––
+ ‚±‚̃pƒbƒ`‚ðŠ®‘S”Å‚É‚µ‚Ä‚­‚ê‚é•ûAŽg—pŠ´ƒŒƒ|[ƒg‚ð“Še‚µ‚Ä‚­‚ê‚é•û‚ð•åW‚µ‚Ü‚·B
+ ƒpƒbƒ`‚ðŒöŠJ‚·‚é‚‚¢‚Å‚ÉA‘å—Ê‚Ìwarning ‚ðC³‚µ‚Ä‚­‚ꂽ‚çŠð‚µ‚¢‚È`A‚ÆŽv‚Á‚Ä‚Ý‚½‚èB
+
+ (/)
+ bcc32_make.bat , bcc32_clean.bat
+ bcc32 ‚ŃRƒ“ƒpƒCƒ‹ / ƒNƒŠ[ƒ“@‚ðŠÈ’P‚É‚·‚邽‚߂̃oƒbƒ`ƒtƒ@ƒCƒ‹B
+
+ athena.dsp , athena.dsw , src/login/login.dsp , src/char/char.dsp ,
+ src/map/map.dsp
+ Visual C++ —p‚̃vƒƒWƒFƒNƒgƒtƒ@ƒCƒ‹ & ƒ[ƒNƒXƒy[ƒX
+
+ (src/)
+ ƒRƒ“ƒpƒCƒ‹o—ˆ‚é‚悤‚ÉFXC³B
+
+ (src/common/timer.c)
+ “ÆŽ©‚̎蔲‚«ƒAƒ‹ƒSƒŠƒYƒ€i‚Q•ªƒ\[ƒgj‚ðÌ—p‚µ‚½ƒo[ƒWƒ‡ƒ“B
+
+--------------------
+//1077 by sylpheed
+EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
+E‰º‹L“ñ‚‚ðŽæ‚èž‚Ý
+Ž¿–âƒXƒŒƒbƒh Part14-41 Plala‚³‚ñ
+ƒoƒO•ñƒXƒŒƒbƒh part7-68 ...‚³‚ñ
+
+1074‚ÍŽæ‚èž‚ñ‚Å‚¢‚Ü‚¹‚ñB
+
+--------------------
+//1076 by mare
+EŠØ‘Œö’m‚Ì’Ê‚èƒAƒŠƒX‚ƃWƒ‹ƒ^ƒX‚̃GƒT‚Ì•ÏXB
+EGM‚̃Aƒuƒ‰ƒJƒ^ƒuƒ‰ê—pƒXƒLƒ‹‚̃tƒ‰ƒO‚ªÁ‚¦‚Ä‚½‚Ì‚Å•œŠˆB
+Eƒuƒ‰ƒbƒNƒXƒ~ƒXƒMƒ‹ƒhˆõ‚ɃvƒŠ[ƒXƒg‚Ìꇂ̃ZƒŠƒt‚ð’ljÁB
+EƒNƒ‰ƒXƒ`ƒFƒ“ƒW‚Å‘S‚Ä‚ÌŽw’èIDƒ{ƒX‚ªo‚é‚悤‚Éi‚È‚Á‚Ä‚é‚Æ‚¢‚¢‚È‚Ÿj
+ (db)
+ pet_db.txt
+ (conf)
+ battle_athena.conf
+ (script/npc/job)
+ npc_job_10blacksmith.txt
+ (src/map)
+ mob.c
+--------------------
+//1075 by kag
+E‹|Žè—p‚ÌŽwŠÑ‚ÌŒø‰ÊŽÀ‘•‚Ì•zÎ
+EŒø‰Ê‚ª‚Í‚Á‚«‚è‚Æ‚µ‚È‚¢‚Ì‚Åitem_db‚ÌC³‚Í‚¢‚ê‚Ä‚¢‚Ü‚¹‚ñB
+E1075”Ô‚Å‚¢‚¢‚Ì‚©‚È‚Ÿ‚ÆŽv‚Á‚½‚èB
+
+ (db)
+ const.txt
+ bWeponAtk=1073‚ÆbWeponAtkRate=1074‚ð’ljÁ
+
+ (src/map)
+ battle.c
+ int battle_get_baseatk()C³
+ static struct Damage battle_calc_pc_weapon_attack()C³
+ map.h
+ int weapon_atk[16],weapon_atk_rate[16];
+ SP_WEPON_ATK,SP_WEPON_ATK_RATE, // 1073-1074‚ð’ljÁ
+ pc.c
+ memset(sd->weapon_atk,0,sizeof(sd->weapon_atk));
+ memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));‚ð’ljÁ
+
+ pc_bonus2() C³
+ (doc)
+ item_bonus.txt
+ bWeponAtk,bWeponAtkRate,bHPDrainValue,bSPDrainValue@’ljÁB
+
+--------------------
+//1073 by LP@@
+EƒAƒRƒXƒLƒ‹‚̈ꕔ‹y‚уTƒCƒgƒXƒLƒ‹‚ÌC³(“ú–{‚É‚Í¡ŒŽ––‚É—ˆ‚锤H@2004/12/06)
+‘¬“xŒ¸­‚͈ړ®‘¬“xŒ¸­—Ê‚ªAƒVƒOƒiƒ€ƒNƒ‹ƒVƒX‚ͬŒ÷—¦ADEFŒ¸­—Ê‚Ì‘‰Á—Ê‚ª
+‚Í‚Á‚«‚肵‚È‚©‚Á‚½‚̂ŘM‚Á‚Ä‚¢‚Ü‚¹‚ñB
+ (src/map)
+ battle.c
+ ƒf[ƒ‚ƒ“ƒxƒCƒ“AƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“ŒvŽZŽ®‚ðC³B
+ skill.c
+ ƒ‹ƒAƒtAƒTƒCƒg‚Ì—LŒø”͈͂ðC³i—¼•û10x10¨ƒ‹ƒAƒt5x5,ƒTƒCƒg7x7jB
+
+ (db)
+ skill_cast.db
+ ƒAƒNƒAƒxƒlƒfƒBƒNƒ^‚̉r¥‹y‚уfƒBƒŒƒC‚ðC³B
+
+//1072 by kag
+E“]¶ƒXƒLƒ‹‚ð’†S‚ÉC³
+ (src/map)
+ battle.c
+ –‚–@—Í‘•‚ðƒXƒLƒ‹ƒŒƒxƒ‹*5%‚ÉC³B
+ –‚¿‚É–î‚ÌATK‚ªæ‚ç‚È‚­‚È‚é‚悤‚ÉC³B
+ ƒI[ƒ‰ƒuƒŒ[ƒh‚̒ljÁƒ_ƒ[ƒW‚ð100‚ÉC³B
+ ƒo[ƒT[ƒN‚Ì—^ƒ_ƒ‚ð‚Q”{‚É‚È‚é‚悤‚ÉC³B
+ ƒwƒbƒhƒNƒ‰ƒbƒVƒ…‚ÌŒvŽZŽ®‚ðC³B
+ ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚ÌŒvŽZŽ®‚¾‚¯C³B
+ ƒvƒŒƒbƒVƒƒ[‚ÌŒvŽZŽ®‚ðC³B
+ ˜A’Œ•öŒ‚‚ÌŒvŽZŽ®‚ðC³B
+ ƒ\[ƒhƒŠƒWƒFƒNƒg‚Ì”½ŽË—¦‚ðƒXƒLƒ‹ƒŒƒxƒ‹*15%‚ÉC³B
+ ƒAƒ[ƒoƒ‹ƒJƒ“‚ÌŒvŽZŽ®‚ðC³B–î‚Ì‘®«‚ªæ‚é‚悤‚ÉC³B
+ ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚ÌŒvŽZŽ®‚ðC³BŠæ‹­ƒtƒ‰ƒO‚Å‚Pƒ_ƒ‚É‚È‚é‚悤‚ÉC³B
+ ƒuƒŠƒbƒcƒr[ƒg‚ðŠæ‹­ƒtƒ‰ƒO‚Å‚Pƒ_ƒ‚É‚È‚é‚悤‚ÉC³B
+ ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚ð•K’†AƒJ[ƒh‚ðæ‚ç‚È‚¢‚悤‚ÉC³B
+ ƒAƒVƒbƒhƒeƒ‰[‚ð–hŒä–³Ž‹A•K’†A–³‘®«AƒJ[ƒh‚ðæ‚ç‚È‚¢‚悤‚ÉC³B
+ skill.c
+ –‚–@—Í‘•‚É0.7•b‚̌Œè‰r¥’ljÁB
+ LP@@ ‚³‚ñ‚̃AƒXƒ€ƒLƒŠƒGd•¡•s‰Â‚ð’ljÁB
+
+ (db)
+ skill_db.txt
+ ‹¶‹CE‚ð‰r¥–WŠQ‚Å‚«‚é‚悤‚ÉC³B
+ skill_cast_db.txt
+ ƒvƒŒƒbƒVƒƒ[‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
+ –ÒŒÕd”hŽR‚̃fƒBƒŒƒC‚ð’ljÁB
+ ƒ‰ƒCƒt’u‚«Š·‚¦‚̃fƒBƒŒƒC‚ð’ljÁB
+ ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
+ ƒEƒCƒ“ƒhƒEƒH[ƒN‚̃fƒBƒŒƒCAŽ‘±ŽžŠÔ‚ð•ÏXB
+ ƒAƒ[ƒoƒ‹ƒJƒ“‚̉r¥AƒfƒBƒŒƒC‚ð’ljÁB
+ ƒNƒŠƒGƒCƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚̃fƒBƒŒƒC‚ð’ljÁB
+ skill_require_db.txt
+ ƒI[ƒ‰ƒuƒŒ[ƒh‚ÌÁ”ïSP‚ðC³B
+ ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ÌÁ”ïSP‚ðC³B
+ –‚–@—Í‘•‚ÌÁ”ïSP‚ðC³B
+ ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌÁ”ïSP‚ðC³B
+ ƒvƒŒƒbƒVƒƒ[‚ÌÁ”ïSP‚ðC³B
+ ƒTƒNƒŠƒtƒ@ƒCƒX‚ÌÁ”ïSP‚ðC³B
+ –ÒŒÕd”hŽR‚ÌÁ”ïSP‚ðC³B
+ ƒŠƒWƒFƒNƒgƒ\[ƒh‚ÌÁ”ïSP‚ðC³B
+
+//1071 by ICO
+Enpc_job_09wizard.txt,npc_job_16sage.txt‚ðC³
+EŽæ‚芪‚«‚ª¢Š«ŒnƒXƒLƒ‹‚ðŽg—p‚·‚éÛ‚Ì‹““®‚ðC³
+
+ (src/map)
+ mob.c
+ Žæ‚芪‚«‚Ì¢Š«ŒnƒXƒLƒ‹‚ð‹K§‚·‚éƒ^ƒCƒ~ƒ“ƒO‚ð•ÏX
+ skill.c
+ ¢Š«ŒnƒXƒLƒ‹‚Ì”­“®ðŒ‚ðC³
+
+//1070 by sylpheed
+Eƒhƒƒbƒv—¦‚̃Œ[ƒg‚²‚Æ‚Ì’²®‚ð’ljÁ
+ ƒhƒƒbƒvÝ’è1`9 10`99 100`999 1000`10000‚Ō•ʂɔ{—¦‚ÆÅ’á/Å‚’l‚Ìݒ肪‰Â”\‚Å‚·
+E@weather 0 ‚ª“®‚©‚È‚¢‚Ì‚ðC³
+E“]¶“ñŽŸE‚ÌHP/SP25“㸎À‘•
+ƒhƒƒbƒv”{—¦‚ÍeAthena‚̃AƒCƒeƒ€Ží—Þ–ˆ‚ÌÝ’è‚ðˆÚA‚µ‚Ä‚à—Ç‚©‚Á‚½‚Ì‚Å‚·‚ª
+Ží—Þ–ˆ‚¾‚ƃŒ[ƒg‚ÌŠJ‚«‚ª‘å‚«‚¢ê‡‚ª‚ ‚èA‚ ‚Ü‚èˆÓ–¡‚ª‚È‚¢‚½‚ß
+‚±‚̂悤‚ÈŒ`‚ŃŒ[ƒgÚ×Ý’è‚ð’ljÁ‚µ‚Ä‚Ý‚Ü‚µ‚½B
+mob_db‚ð˜M‚é‚æ‚èŠy‚Ƀhƒƒbƒv—¦‚Ì•ÏX‚ª‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·B
+
+weather 0‚ª“®‚©‚È‚¢‚Ì‚Í——R‚ª—Ç‚­‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å
+“®‚­‚悤‚ÉC³‚·‚é‚‚¢‚Å‚ÉA‰Jƒtƒ‰ƒOÁ‹ŽŽž‚É
+“ø‚ªo‚é‚悤‚ɒljÁ‚µ‚Ä‚Ý‚Ü‚µ‚½B
+
+“]¶‚ÌHP/SP‚ÉŠÖ‚µ‚Ä‚ÍA“]¶‚µ‚Ä‚¢‚Ä‚à“ñŽŸE‚É‚È‚Á‚Ä‚È‚¢ê‡
+‘‰Á‚Í‚µ‚È‚¢‚悤‚È‚Ì‚ÅA‚»‚̂悤‚ÉŽÀ‘•‚µ‚Ä‚Ý‚Ü‚µ‚½B
+wedding_modifydisplay: yes ‚ÌŽž‚ɃhƒŒƒX/ƒ^ƒLƒV[ƒh‚ð‘•”õ‰ðœ‚·‚é‚Æ
+‘‰Á•ª‚ªÁ‚¦‚Ä‚µ‚Ü‚¢‚Ü‚·¥¥¥
+‚í‚©‚é•û‚¢‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·orz
+
+ (src/map)
+ atcommand.c
+ @weatherŠÖ˜A‚ÌC³(case 0‚ðŽÀs‚·‚é‚悤‚ÉC³)
+ ‰Jƒtƒ‰ƒO‚ðÁ‚µ‚½ê‡“ø‚ªo‚é‚悤‚É‚µ‚Ä‚Ý‚Ü‚µ‚½(JP‘ ‚ÅŽg‚¦‚é‚©•s–¾)
+ (ƒ}ƒbƒvˆÚ“®‚µ‚È‚¢‚Æ“VŒó‚ªÁ‚¦‚È‚¢‚Ì‚Íragexe‚ÌŽd—l‚©‚ÈH)
+ battle.c
+ battle.h
+ mob.c
+ item_rate_detailsŠÖ˜A‚ð’ljÁ
+ pc.c
+ “]¶“ñŽŸEŽž‚ÌHP/SPÅ‘å’l25%‘‰Á‚ð’ljÁ
+ “]¶‚µ‚Ä‚¢‚Ä‚à“ñŽŸE‚Å‚È‚¢ê‡‚ÍHP/SP‘‰Á‚Í–³‚µ‚̂悤‚Å‚·
+ (conf)
+ help.txt C³
+ msg_athena.conf 112’ljÁ
+
+ (doc)
+ conf_ref.txt C³
+ help.txt C³
+
+//1069 by lizorett (2004/11/26) special thanks to –¼–³‚µ—l@‚‡—‚‚…
+Eƒƒ‹ƒgƒ_ƒEƒ“‚ÌŽÀ‘•
+E–‚–@—Í‘•‚ª‰r¥‚Ì‚ ‚é–‚–@‚Å—LŒø‚É‚È‚ç‚È‚©‚Á‚½–â‘è‚ðC³
+Emap-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³(Ž¿–âƒXƒŒƒbƒh Part13 >>55)
+Emap-server‚É•s³ID‚ŃƒOƒCƒ“‚·‚é‚Æchar-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
+EƒTƒtƒ‰ƒMƒEƒ€‚ª–³‰r¥ƒXƒLƒ‹‚ÅŽæ‚èÁ‚³‚ê‚È‚¢–â‘è‚ðC³
+Ed•¡‚µ‚Ä–Ò“Åó‘Ô‚Æ‚È‚ç‚È‚¢‚悤C³
+Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚̃_ƒ[ƒW‚ðC³
+Eƒo[ƒTƒN’†‚ÉHP/SP‹zŽûA“łȂǂ̃_ƒ[ƒW‚ðŽó‚¯‚é‚悤C³
+EŒŽŒõŒ•‚ÌSP‹zŽû—Ê‚ª‘‰Á‚µ‚Ä‚¢‚­–â‘è‚ðC³(Žb’è)
+E@help‚ɃL[ƒ[ƒhŒŸõ‹@”\‚ð’ljÁ
+
+ (src/map)
+ battle.c - ƒ}ƒWƒbƒNƒpƒ[‚É‚æ‚éMATK‘‰Á‚ÌŽÀ‘•
+ - •ŠíŠZ”j‰ó‚ðpc_break_equip()‚É‘‚«Š·‚¦
+ - HP/SP‹zŽû‚ðC³
+ map.h - ‘•”õ”j‰ó‚Ì’è‹`‚ð’ljÁ
+ pc.c - pc_break_armor()/pc_break_weapon()‚ðAV‹K‚Ì‘•”õ”j‰ó‚Ì
+ ŠÖ”pc_break_equip()‚É“‡
+ - –‚–@—Í‘•‚̃R[ƒh‚ðíœ(battle.c‚Ås‚¤)
+ - HP/SP‹zŽûŠÖŒW‚Ì•Ï”‚̉Šú‰»‚ð’ljÁ
+ pc.h - ŠÖ”’è‹`‚ðC³
+ skill.c - ƒƒ‹ƒgƒ_ƒEƒ“‚É‚æ‚é‘•”õ”j‰ó‚ðŽÀ‘•
+ - –‚–@—Í‘•‚ÉŠÖ‚·‚éC³
+ - d•¡‚µ‚Ä–Ò“Åó‘Ô‚Æ‚È‚ç‚È‚¢‚悤C³
+ clif.c - map-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
+ atcommand.c - @help‚ɃL[ƒ[ƒhŒŸõ‚ð’ljÁ("@help jobchange"‚È‚Ç)
+ (src/char)
+ char.c - char-server‚ªƒ_ƒEƒ“‚·‚é–â‘è‚ÌC³
+ (db)
+ const.txt - bUnbreakableHelm, bUnbreakableShield’ljÁ
+ skill_cast_db.txt
+ - ƒƒ‹ƒgƒ_ƒEƒ“‚Ìó‘ÔˆÙ펞ŠÔ‚ðÝ’è
+
+//1068 by huge
+Eatcommand‚ð‚¢‚­‚‚©’ljÁ‚ÆAeAthena‚©‚ç‚¢‚­‚‚©ˆÚAB(help.txtŽQÆ)
+E”ñGMƒLƒƒƒ‰‚ª@‚ÅŽn‚Ü‚é”­Œ¾‚ð‚µ‚½ŽžA‚»‚Ì‚Ü‚Ü•\Ž¦‚·‚é‚悤‚É‚µ‚½B(GMƒŒƒxƒ‹0‚̃Rƒ}ƒ“ƒh‚ÍŽÀs)
+E“V‹CƒRƒ}ƒ“ƒh‚ɇ‚킹‚ÄAmapflagÝ’è‚Å‚«‚é‚悤‚ÉB
+Escript‚ð‚¢‚­‚‚©’ljÁ‚ÆAeAthena‚©‚çˆê‚ˆÚAB
+E‰ŠúHP”{—¦‚ÆSP”{—¦‚ðbattle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
+E‘SƒLƒƒƒ‰‚ªAGM‚ɂ͈ʒuEHP‚ð’Ê’m‚³‚¹‚é‚悤battle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
+EƒhƒNƒƒhƒƒbƒv‚ɂ‚¢‚ÄAbattle_athena‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½B
+EGM‚̃AƒCƒeƒ€ƒhƒƒbƒv‚âŒðŠ·‚ɂ‚¢‚ÄGMƒŒƒxƒ‹‚ð§ŒÀ‚Å‚«‚é‚悤‚É‚µ‚½B
+EƒfƒBƒeƒNƒeƒBƒ“ƒOƒXƒLƒ‹C³B
+¦ƒfƒtƒHƒ‹ƒg‚Ì“ú–{ƒNƒ‰ƒCƒAƒ“ƒg‚¾‚ÆA‰J‚Å—Ž‚¿‚Ü‚·B
+
+ (conf/)
+ atcommand_athena.conf C³
+ battle_athena.conf C³
+ help.txt C³
+ msg_athena.conf C³
+
+ (doc/)
+ help.txt C³
+ script_ref.txt C³
+ conf_ref.txt C³
+
+ (src/map/)
+ atcommand.c
+ atcommnad.h
+ guild.h party.h‚ð“Ç‚Þ—l‚ÉC³
+ is_atcommand() C³
+ atcommand() C³
+ ¦ˆÚAEV‹KƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Í help.txt ‚ðŠm”F‚µ‚ĉº‚³‚¢B
+ battle.c
+ battle.h
+ hp_rate,sp_rate,hp_meter,bone_drop ’ljÁ
+ clif.c
+ clif.h
+ clif_spawnpc() C³
+ clif_hpmeter() ’ljÁ
+ guild.c
+ guild.h
+ guild_searchname() ’ljÁ
+ guild_searchname_sub() ’ljÁ
+ map.h
+ “VŒó‚ÉŠÖ‚·‚éflag’ljÁ
+ npc.c
+ npc_parse_mapflag() C³
+ party.c
+ party.h
+ party_searchname() ’ljÁ
+ party_searchname_sub() ’ljÁ
+ pc.c
+ pc.h
+ pc_calcstatus() C³
+ pc_damage() C³
+ pc_walk() C³
+ pc_can_drop() ’ljÁ
+ script.c
+ gmcommand ˆÚA’ljÁ
+ dispbottom ’ljÁ
+ getusersname ’ljÁ
+ recovery ’ljÁ
+ petinfo ’ljÁ
+ checkequipedcard ’ljÁ
+ getexp íœ(set‚ðŽg‚¤‚悤‚É‚µ‚ĉº‚³‚¢)
+ skill.c
+ skill.h
+ skill_castend_pos2() C³
+
+ {AthenaŽG’kƒXƒŒƒbƒhPart7 >>54 ‚à‚Á‚³‚肳‚ñ‚Ì•ª
+ ‹Lq˜R‚ꂪ‚ ‚Á‚½‚ç‚·‚¢‚Ü‚¹‚ñB
+--------------------
+//1067 by kai
+EƒƒfƒBƒeƒCƒeƒBƒI‚É‚æ‚éƒq[ƒ‹‰ñ•œ—Ê‘‰Á‚ÌŒø‰Ê‚ðC³
+EƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†‚ÌC³
+EPvPŽž‚É‚¨‚¯‚éƒAƒXƒ€ƒvƒeƒBƒI‚ÌŒø‰Ê‚ðC³
+
+ (src/map)
+ skill.c
+ 2120s@heal += heal*(skill*2)/100; //ƒƒfƒBƒeƒCƒeƒBƒI‚ÌC³
+
+ battle.c
+ 1723s@damage += dmg*(10+(skill * 2))/100; //ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†‚ÌC³
+
+ 2598`2599A3580`3582s@ƒAƒXƒ€ƒvƒeƒBƒI‚ÌC³
+ if(map[target->m].flag.pvp)‚Æ‚µƒ_ƒ[ƒWŒvŽZ‚ð2/3‚ÉC³
+
+--------------------
+//1066 by lizorett (2004/11/17) special thanks to –¼–³‚µ—l@‚‡—‚‚…
+EƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬎À‘•
+EƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“ŽÀ‘•
+Eƒ\ƒEƒ‹ƒuƒŒƒCƒJ[ŽÀ‘•
+Ebattle_weapon_attack‚Å–¢‰Šú‰»‚Ì’l‚ª–ß‚³‚ê‚éƒoƒOC³
+E‘¼Žg—pSP‚Ì•ÏX“™‚Ìׂ©‚¢C³
+
+ (db)
+ const.txt - –Ò“Å(SC_DPoison)‚ð’ljÁ
+ item_db.txt - —΃n[ƒu,—΃|[ƒVƒ‡ƒ“,–œ”\–ò‚É–Ò“Å‚ðŽ¡‚·Œø‰Ê‚ð’ljÁ
+ produce_db.txt - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ÌÞ—¿‚Ì’è‹`‚ð’ljÁ
+ skill_cast_db.txtƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“Aƒ\ƒEƒ‹ƒuƒŒƒCƒJ[
+ ‚Ì’è‹`‚ðC³/’ljÁ
+ skill_db.txt - ƒ\ƒEƒ‹ƒuƒŒƒCƒJ[/ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“/
+ ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂̒è‹`‚ðC³
+ - ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚̃qƒbƒg”C³
+ skill_require_db.txt
+ - ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“‚ª“Å–ò‚Ì•r‚ðŽg—p‚·‚é
+ ‚悤‚ÉC³
+ - ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[/ƒƒeƒIƒAƒTƒ‹ƒg‚ÌŽg—pSP‚ðC³
+ (src/map)
+ battle.h - battle_config.cdp_rate‚ð’ljÁ
+ battle.c - ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[ŽÀ‘•
+ - ƒƒeƒIƒAƒTƒ‹ƒg‚ɃJ[ƒhŒø‰Ê‚ª‚©‚©‚ç‚È‚¢‚悤•ÏX
+ - 4213s‚ÌðŒ‚Å–¢‰Šú‰»‚Ì’l‚ª–ß‚³‚ê‚éƒoƒOC³
+ - battle_config.cdp_rate‚ð’ljÁ
+ skill.h - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂ÌÞ—¿‚ª7‚‚Ȃ̂ÅAƒe[ƒuƒ‹
+ ‚ð’ljÁBÞ—¿‚Ìő唂ðdefine‚Å•ÏX‚Å‚«‚é‚悤C³
+ - SC_DPOISON(182)/SC_EDP(183)‚ð’ljÁ
+ skill.c - –Ò“ÅŒø‰Ê‚ð’ljÁ
+ - ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“쬂ðŽÀ‘•
+--------------------
+//1065 by End_of_exam
+
+EƒT[ƒo[ƒ]ƒ“ƒr‰»‚ÉŽb’è‘Έ
+Ecalc_index(path.c)‚Ì•s“s‡‚ðC³
+
+ (common/)
+ timer.c
+ TIMER_MIN_INTERVEL(ƒ^ƒCƒ}[‚ÌŬƒCƒ“ƒ^[ƒoƒ‹j‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ ‚»‚ê‚É”º‚¢Ado_timer() ‚Ì–ß‚è’l‚ÌÅ’á‚ð 10ms ‚©‚ç 50ms ‚É•ÏX‚µ‚Ü‚µ‚½B
+
+ select‚ª10msˆÈ“à‚ÉI‚í‚ç‚È‚¢ŠÂ‹«‚¾‚ÆAƒ‚ƒ“ƒXƒ^[‚ð‘å—Ê¢ŠÒ‚µ‚½Žž‚È‚Ç‚ÉA
+ ƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‚̃pƒPƒbƒg‚É”½‰ž‚µ‚È‚­‚È‚é–Í—l‚Å‚·B
+ ƒ[ƒJƒ‹ƒeƒXƒgiƒ‚ƒ“ƒXƒ^[‘å—Ê¢ŠÒj‚ð‚µ‚Ä‚Ý‚½‚Æ‚±‚ëA25ms‚É•ÏX‚µ‚½Žž“_‚Å
+ ‰ü‘P‚µ‚Ü‚µ‚½‚ªAŠÂ‹«‚É‚æ‚Á‚Ä‚Í50ms‚Å‚à•s\•ª‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ ‚»‚ÌꇂÍATIMER_MIN_INTERVEL‚ð‘‚₵‚Ä—lŽq‚ðŒ©‚Ä‚­‚¾‚³‚¢B
+
+ “¯—l‚ÌŒ»Û‚Æ‚µ‚ÄA‘½”‚̃Nƒ‰ƒCƒAƒ“ƒg‚ªÚ‘±‚·‚é‚ƃT[ƒo[‚ª”½‰ž‚µ‚È‚­‚È‚é
+ ‚Æ‚¢‚¤‚Ì‚ª‚ ‚è‚Ü‚·‚ªA‚±‚̃pƒbƒ`‚É‚æ‚Á‚Ä‚ ‚é’ö“x‰ü‘P‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+
+ (map/)
+ map.h : MAX_WALKPATH
+ path.c “à‚Ì calc_index‚ª•s“s‡‚ð‹N‚±‚·(48*48-1 = 1000 1111 1111(b)) ‚½‚ßA
+ MAX_WALKPATH‚ð 48 ‚©‚ç 32 ‚É•ÏX‚µ‚Ü‚µ‚½B(32*32-1 = 0011 1111 1111(b))
+
+ #define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
+--------------------
+//1064 by nameless
+EGCC 3.3.0/3.3.1‚ª“à•ï‚·‚é0/0=•Ï”Å‘å’l‚Ì–â‘è‘Îô(int:65535/long:4294967294)
+E–‚–@–hŒäE–hŒäE‘®«–hŒä‚ª³‚µ‚­“K—p‚³‚ê‚È‚¢–â‘è‚ðC³
+Eƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ð’P‘Ì–‚–@‚̃R[ƒh‚ÉC³‚µAŽô‚¢Œø‰Ê‚ðŽÀ‘•
+
+ (src/map)
+ skill.c
+ 442`448s •s“™†[<]‚ð[>]‚ÉC³
+ 512`519s •s“™†[>]‚ð[<]‚ÉC³
+ 529`538s ƒRƒ“ƒpƒCƒ‰ƒoƒO‚Ì’ù³•û–@‚Æ—á/*`*/‚Ì•”•ª‚ð
+ gcc‚̃o[ƒWƒ‡ƒ“‚ɇ‚킹‚Ķ‚©‚µ‚½‚èŽE‚µ‚½‚è
+ ‚µ‚Ä‚­‚¾‚³‚¢B3.3.2‚©‚ç‚Í’¼‚Á‚Ä‚¢‚é‚悤‚Å‚·
+ 1857s ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ð’ljÁ
+ 660`664s ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌŽô‚¢Œø‰Ê‚ð’ljÁ
+ (src/char)
+ char.c
+ C³‚µ‚«‚ê‚Ä‚¢‚È‚©‚Á‚½•”•ª‚ðC³‚µ‚Ü‚µ‚½B
+
+--------------------
+//1063 by ŽµŽ
+EŒŽŒõŒ•‚ÌŒø‰ÊŽÀ‘•
+E¶ŽèƒJ[ƒh‚É‚æ‚éA•ŠíUŒ‚Žž‚ÌHP/SP‹zŽûŒø‰Ê‚ª‰EŽè‚ɉe‹¿‚·‚é—l‚ÉC³(–{ŽIŽd—l)
+ (left_cardfix_to_right‚ªyes‚ÌŽž‚Ì‚ÝBno‚¾‚Æ]—ˆ’Ê‚è)
+
+ (db)
+ const.txt
+ bHPDrainValue=1071‚ÆbSPDrainValue=1072‚ð’ljÁ
+ item_db.txt
+ ŒŽŒõŒ•‚ÌEquipScript‚Ébonus2 bSPDrainValue,100,3‚ð’ljÁ
+
+ (src/map)
+ battle.c
+ battle_weapon_attack() C³
+ map.h
+ short hp_drain_value,sp_drain_value,hp_drain_value_,sp_drain_value_;‚ð’ljÁ
+ SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1071-1072‚ð’ljÁ
+ pc.c
+ pc_bonus2() C³
+
+--------------------
+//1062 by nameless
+EƒpƒPƒbƒg‘—ŽóM‚ł̌둗MC³
+EƒoƒO•ñƒXƒŒƒbƒh part7 ‚©‚ç‚ÌŽæ‚èž‚ÝEC³ >> 56,57,58
+Efix1059‚ÌŽæ‚èž‚Ý
+EƒnƒCƒEƒBƒY‚̃lƒCƒp[ƒ€ƒoƒ‹ƒJƒ“‚ÌŽÀ‘•(eAŽæ‚èž‚Ý)
+ECPUÅ“K‰»ƒR[ƒh‚ÌC³(athlonŒn)E’ljÁ(Œºl” /Linux Zaurus)
+
+ (/)
+ Makefile
+ athlonŒnÅ“K‰»‚ÌC³
+ Œºl” (Kuro-Box 200MHz”Å[PPC 603x])
+ Œºl” (Kuro-Box 266MHz”Å[PPC 604x])
+ Linux Zaurus (SL-C7xx)
+ ‚ÌÅ“K‰»ƒR[ƒh‚ð‹Lq
+
+ (db)
+ skill_cast_db.txt
+ 400,500,1200:1600:2000:2400:2500,0,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
+ (src/map)
+ clif.c
+ clif_parse() C³
+ (src/char)
+ char.c
+ 1367s cmd = RFIFOW(fd,0);’ljÁ
+ (src/map)
+ skill.c
+ switch(skillid)‚Écase HW_NAPALMVULCAN:ˆÈ‰º20s‚قǒljÁ
+--------------------
+//1061 by lizorett (2004/11/9)
+E•s³‚ȃMƒ‹ƒhƒXƒLƒ‹ƒpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚Émap/charƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
+E•s³‚ȃpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚ÉcharƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
+EŒ‹¥‚µ‚½ƒLƒƒƒ‰‚ð휂·‚é‚ÆcharƒT[ƒo‚ª—Ž‚¿‚錻ۂðC³
+E” ‚ðˆê‚‚¾‚¯Ž‚Á‚½ó‘Ô‚Å” ‚©‚ç” ‚ª‚Å‚é‚ÆA” ‚ªÁ‚¦‚邽‚悤‚ÉŒ©‚¦‚é
+ (ƒŠƒƒO‚·‚é‚ÆŒ©‚¦‚é)–â‘è‚ðC³
+EƒXƒiƒbƒ`ƒƒ[‚̃XƒLƒ‹Ž¸”s‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚Å‚«‚éÝ’è‚ð’ljÁ
+Eƒfƒ{[ƒVƒ‡ƒ“‚̃Œƒxƒ‹§ŒÀ(10ƒŒƒxƒ‹·)‚ð•ÏX‚Å‚«‚éÝ’è‚ð’ljÁ
+
+ (src/common)
+ mmo.h
+ ƒMƒ‹ƒhƒXƒLƒ‹‚Ìenum‚ð’ljÁ(src/map/skill.h‚©‚çˆÚ“®)
+ (src/map)
+ skill.h
+ ƒMƒ‹ƒhƒXƒLƒ‹‚Ìenum‚ðíœ(src/common/mmo.h‚Ɉړ®)
+ guild.c
+ guild_checkskill ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+ guild_skillup ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+ skill.c
+ skill_additional_effect display_snatcher_skill_fail‚̈—‚ð’ljÁ
+ skill_castend_nodamage_id devotion_level_difference‚̈—‚ð’ljÁ
+ battle.c
+ display_snatcher_skill_fail,devotion_level_difference‚̉Šú‰»‚ð’ljÁ
+ (src/char)
+ int_guild.c
+ guild_checkskill ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+ mapif_parse_GuildSkillUp ƒXƒLƒ‹‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+ char.c
+ parse_char •s³‚ȃpƒPƒbƒg‚ðŽó‚¯‚½ê‡‚ɂ̓_ƒ“ƒv‚·‚é‚悤C³
+ char_divorce i<MAX_INVENTORY‚ðj<MAX_INVENTORY‚É•ÏX
+ (conf)
+ battle_athena.conf
+ display_snatcher_skill_fail,devotion_level_difference‚ð’ljÁ
+--------------------
+//1060 by mosya
+Eƒ‚ƒ“ƒXƒ^[‚ªƒXƒLƒ‹‰r¥’†‚ÉÀ•WƒYƒŒ‚ð‹N‚±‚·–â‘è‚ðC³
+EMOB‚ÌAI•ÏXB‘O‰q‚ªƒ^ƒQ‚ðŽæ‚Á‚Ä‚¢‚é‚Ì‚ÉAŒã‰q‚ÉUŒ‚‚ð‚µ‚É‚ä‚­‚Ì‚ðC³
+ (src/map)
+ mob.c
+ mob_ai_sub_hard() •ÏX
+ mobskill_castend_id() •ÏX
+ mobskill_castend_pos() •ÏX
+ mobskill_use_id() •ÏX
+ mobskill_use_pos() •ÏX
+--------------------
+//1059 by SPDFMember
+EeAthena‚ðŽQl‚ɃŠƒ[ƒhDBŒn“‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ (conf/)
+ atcommand_athena.conf
+ reloaditemdb
+ reloadmobdb
+ reloadskilldb‚ð’ljÁ
+ help.txt
+ reloaditemdb
+ reloadmobdb
+ reloadskilldb‚Ìà–¾‚ð’ljÁ
+ msg_athena.conf
+ 89
+ 90
+ 91‚ð’ljÁ
+ (src/map)
+ atcommand.c
+ reloaditemdb
+ reloadmobdb
+ reloadskilldb‚ð’ljÁB
+ atcommand.h
+ AtCommand_ReloadItemDB,
+ AtCommand_ReloadMobDB,
+ AtCommand_ReloadSkillDB,‚ð’ljÁ
+ itemdb.c
+ static int itemdb_readdb(void);’ljÁ
+ itemdb.h
+ void itemdb_reload(void);’ljÁ
+ mob.c
+ void mob_reload(void)’ljÁ
+ mob.h
+ void mob_reload(void);’ljÁ
+ skill.c
+ void skill_reload(void)’ljÁ
+ skill.h
+ void skill_reload(void);’ljÁ
+--------------------
+//1058 by lizorett
+EƒMƒ‹ƒh‘qŒÉƒAƒCƒeƒ€‚ªMAX_STORAGEŒÂˆÈã‚ ‚é‚ÆŽæ‚èo‚¹‚È‚¢‚à‚Ì‚ª‚ ‚é–â‘è‚ðC³
+ (src/map)
+ clif.c
+ clif_parse_DropItem item_index/item_amount‚͈̔̓`ƒFƒbƒN‚ðíœ
+ (pc_dropitem ‚Ń`ƒFƒbƒN‚·‚é)
+ clif_parse_MoveToKafra item_amount‚̃`ƒFƒbƒN‚ðíœ
+ (storage_*storageadd‚Ń`ƒFƒbƒN‚³‚ê‚Ä‚¢‚é)
+ clif_parse_MoveFromKafra item_index/item_amount‚̃`ƒFƒbƒN‚ðíœ
+ (storage_*storageget‚Ń`ƒFƒbƒN‚³‚ê‚Ä‚¢‚é)
+ pc.c
+ pc_dropitem n/amount‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+--------------------
+//1057 by BDPQ‹â
+EƒEƒH[ƒ^[ƒ{[ƒ‹‚̃_ƒ[ƒW‚ð–{ŽI’m’l¨ŽÀ‘ª’l‚ÉC³B
+ [ MATK+SkillLv*30 ¨ MATK*(1+SkillLv*0.3) ]
+
+ (src/map)
+ battle.c
+ battle_calc_magic_attack •ÏX [ 3848s–Ú‚ ‚½‚è ]
+
+--------------------
+//1056 by robert
+‡”Ô‚ðŒŸ¸‚·‚é‚Ì‚Í•s–@‚©‚Ç‚¤‚©
+ (src/map)
+ clif.c
+ clif_parse_DropItem
+ clif_parse_MoveToKafra
+ clif_parse_MoveFromKafra
+--------------------
+//1055 by Nameless
+EŠeŽíCPU‚ɑ΂·‚éƒR[ƒhÅ“K‰»ƒIƒvƒVƒ‡ƒ“‚ðÝ’è(‘S27Ží) ¦GCC 3.3.1 €‹’
+EPentium 3‚̃IƒvƒVƒ‡ƒ“‚ªSSE2‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð’ù³
+E‹HŽ}‚³‚ñArobert‚³‚ñ‚ÌPacketî•ñ‚ÌŽæ‚èž‚Ý(‚¨“ñl‚ÉŠ´ŽÓ)
+
+ (/)
+ makefile
+ i486/586/p54c/mmx/P3/P4/Cele
+ k6/k6-2/k6-3/athlonŒn
+ Via C3(Eden)
+ PowerPC/G4Œn
+
+ (src/map/)
+ clif.c
+ clif_parse_MoveToKafra{}
+ ƒR[ƒhŽæ‚èž‚Ý
+
+--------------------
+//1054 by Nameless
+ECygwin‚ŃRƒ“ƒpƒCƒ‹‚µ‚½athena‚ªÚ‘±53`58l•t‹ß‚ÅÚ‘±•s”\‚É‚È‚éƒoƒO‚ð‰ðÁ
+
+ (src/common/)
+ socket.h
+ #ifdef CYGWIN
+ #undef FD_SETSIZE
+ #define FD_SETSIZE 4096
+ #endif
+ ˆÈã‚Ìs‚ðíœ
+ (/)
+ makefile
+ OS_TYPE = -DCYGWIN
+ «
+ OS_TYPE = -DCYGWIN -DFD_SETSIZE=4096
+ ‚ÉC³
+
+ #optimize for Athlon-4(mobile Athlon)
+ #CFLAGS += -march=athlon -mcpu=athlon-4 -mfpmath=sse
+
+ #optimize for Athlon-mp
+ #CFLAGS += -march=athlon -mcpu=athlon-mp -mfpmath=sse
+
+ #optimize for Athlon-xp
+ #CFLAGS += -march=athlon -mcpu=athlon-xp -mfpmath=sse
+
+ #optimize for pentium3
+ #CFLAGS += -march=i686 -mcpu=pentium3 -mfpmath=sse -mmmx -msse2
+
+ ŠeŽíCPU‚ÌÅ“K‰»‚ð’ljÁgcc3.1ˆÈã‚ðŽg‚Á‚Ä‚¢‚éꇂÍ#‚ðŠO‚µ
+ ‚ÄÅ“K‰»‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·B
+
+ ¦makefile‚ŃZƒbƒg‚µ‚Ä‚¨‚©‚È‚¢‚ÆAƒRƒ“ƒpƒCƒ‹‚ÌۂɈꕔ
+ FD_SETSIZE‚ª¬‚³‚­‚È‚Á‚Ä‚µ‚Ü‚¤ƒoƒO(?)‚ª‚ ‚é‚炵‚­AÚ‘±l”‚ª
+ 60lŽã‚ÅÚ‘±•s”\‚ª”­¶‚µ‚Ä‚µ‚Ü‚¢‚Ü‚·B
+
+--------------------
+//1053 by TEILU
+EƒpƒPƒbƒgƒp[ƒT[‚ðƒ^ƒCƒ}[ŒÄo‚µ‚É•ÏX‚Å‚«‚éÝ’è‚̒ljÁ
+E¸˜B‚̉”۔»’è‚Å‚c‚a‚ɂǂ̂悤‚ÈÝ’è‚ð“ü‚ê‚Ä‚àƒAƒNƒZƒTƒŠ‚Í
+ ¸˜B‚Å‚«‚È‚©‚Á‚½•s‹ï‡‚ðC³
+
+ (conf/)
+ map_athena.conf
+ packet_parse_time: 0 ’ljÁ
+ (src/common/)
+ core.c
+ packet_parse_time ’ljÁ
+ main() •ÏX
+ socket.c
+ parsepacket_timer() ’ljÁ
+ socket.h
+ parsepacket_timer() ’ljÁ
+ (src/map/)
+ map.c
+ packet_parse_time ’ljÁ
+ map_config_read() •ÏX
+ script.c
+ buildin_getequipisenableref() •ÏX
+
+--------------------
+//1052 by
+‹êŠ‚‚«‚ÅŒŸõƒRƒ}ƒ“ƒh’ljÁB
+ GMƒRƒ}ƒ“ƒh’ljÁ
+ @who+ ‹êŠ‚‚«ŒŸõ
+
+ (conf/)
+ atcommand_athena.conf
+ who+: 1 ’ljÁ
+ (/src/common/)
+ version.h
+ Ver 1051->1052 •ÏX
+ (/src/map)
+ atcommand.c
+ ATCOMMAND_FUNC(whop); ’ljÁ
+ { AtCommand_WhoP,"@who+",0, atcommand_whop }, ’ljÁ
+ atcommand.h
+ AtCommand_WhoP, ’ljÁ
+--------------------
+//1051 by Plala
+EƒyƒRƒyƒR‹R掞MAX Weight‚ð‘‚₹‚é‚悤‚É‚µ‚Ü‚µ‚½B
+battle_athena.conf‚ÅÝ’è‰Â”\‚Å‚·B
+
+ (conf/)
+ battle_athena.conf
+ riding_weight ’ljÁ
+ (map/)
+ battle.c
+ battle_config.riding_weight ’ljÁ
+ battle.h
+ int riding_weight; ’ljÁ
+ clif.c
+ clif_parse_RemoveOption •ÏX
+ pc.c
+ int pc_calcstatus •ÏX
+ 1415‚Ésd->max_weight +=battle_config.riding_weight; ‚ð’ljÁ
+ (common/)
+ version.h
+ Ver 1050->1051 •ÏX
+--------------------
+//1050 by code
+EŠeŽí“VŒó‘€ìƒRƒ}ƒ“ƒh‚ÌŒ©’¼‚µ
+¦‚¢‚¿‚¢‚¿@misceffect‚ŌĂÑo‚³‚¸‚ÉŠÈ’P‚É“VŒó‘€ì‚ðs‚¦‚é‚悤‚É
+¦ƒNƒ‰ƒCƒAƒ“ƒgˆË‘¶‚Í—Ž‚¿—t‚Å‚Í‚È‚­‰J‚Å‚µ‚½AŠÔˆá‚¢‚Ü‚µ‚½(^-^;
+
+ (src/common/)
+ version.h
+ Ver 1049->1050 •ÏX
+ (/src/map)
+ atcommand.c
+ AtCommand_Rain{} •ÏX
+ AtCommand_Snow{} •ÏX
+ AtCommand_Cherry{} •ÏX
+ AtCommand_Fog{} •ÏX
+ AtCommand_Maple{} •ÏX
+
+--------------------
+//1049 by code
+E–¶A—Ž—t‚Ì2‚‚̓VŒó‘€ìƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
+¦—Ž‚¿—t‚ÉŠÖ‚µ‚Ă̓Nƒ‰ƒCƒAƒ“ƒgˆË‘¶‚È‚Ì‚ÅjRO‚¾‚Æ—Ž‚¿‚é‚©‚àc
+
+ GMƒRƒ}ƒ“ƒh’ljÁ
+ @fog –¶
+ @maple —Ž—t
+
+ (conf/)
+ atcommand_athena.conf
+ fog: 1 ’ljÁ
+ maple: 1 ’ljÁ
+
+ msg_athena.conf
+ 87: –¶‚ª—§‚¿ž‚ß‚Ü‚µ‚½B ’ljÁ
+ 88: —Ž‚¿—t‚ª~‚Á‚Ä‚«‚Ü‚µ‚½B ’ljÁ
+ (/src/common/)
+ version.h
+ Ver 1048->1049 •ÏX
+ (/src/map)
+ atcommand.c
+ ATCOMMAND_FUNC(fog); ’ljÁ
+ ATCOMMAND_FUNC(maple); ’ljÁ
+ { AtCommand_fog,"@fog",0, atcommand_fog }, ’ljÁ
+ { AtCommand_maple,"@maple",0, atcommand_maple }, ’ljÁ
+
+ atcommand.h
+ AtCommand_Fog, ’ljÁ
+ AtCommand_Maple, ’ljÁ
+
+--------------------
+//1048 by code
+E‰JAáAƒTƒNƒ‰á‚Ì3‚‚̓VŒó‘€ìƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
+¦Õ“®“I‚ɒljÁ‚µ‚Ä‚µ‚Ü‚Á‚½‚̂ŃoƒO‚ª‚ ‚é‚©‚à’m‚ê‚Ü‚¹‚ñ(Š¾
+
+ GMƒRƒ}ƒ“ƒh’ljÁ
+ @rain ‰J
+ @snow á
+ @cherry ƒTƒNƒ‰á
+
+ (conf/)
+ atcommand_athena.conf
+ rain: 1 ’ljÁ
+ snow: 1 ’ljÁ
+ cherry: 1 ’ljÁ
+
+ msg_athena.conf
+ 84: ‰J‚ª~‚èo‚µ‚Ü‚µ‚½B ’ljÁ
+ 85: Ⴊ~‚èo‚µ‚Ü‚µ‚½B ’ljÁ
+ 86: ƒTƒNƒ‰á‚ð~‚点‚Ü‚·B ’ljÁ
+ (/src/common/)
+ version.h
+ Ver 1047->1048 •ÏX
+ (/src/map)
+ atcommand.c
+ ATCOMMAND_FUNC(rain); ’ljÁ
+ ATCOMMAND_FUNC(snow); ’ljÁ
+ ATCOMMAND_FUNC(cherry); ’ljÁ
+ { AtCommand_rain,"@rain",0, atcommand_rain }, ’ljÁ
+ { AtCommand_snow,"@snow",0, atcommand_snow }, ’ljÁ
+ { AtCommand_cherry,"@cherry",0, atcommand_cherry }, ’ljÁ
+
+ atcommand.h
+ AtCommand_Rain, ’ljÁ
+ AtCommand_Snow, ’ljÁ
+ AtCommand_Cherry, ’ljÁ
+
+--------------------
+//1047 by SVN
+E»‘¢ƒAƒCƒeƒ€‚Ì»ìŽÒ‚Ì–¼‘O‚ðˆø‚­map©¨char‚̃pƒPƒbƒg‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
+E“ñdƒƒOƒCƒ“‚ð‚µ‚½Žž‚Échar-server‚ª—Ž‚¿‚é‰Â”\«‚ª‚ ‚Á‚½‚Ì‚ðC³
+EƒK[ƒfƒBƒAƒ“‚ðGvŽžŠÔŠO‚ɉ£‚ꂽAIDŽw’è‚̃XƒLƒ‹‚ª“–‚½‚Á‚½Askill_unit‚ȃXƒLƒ‹UŒ‚‚ª“–‚½‚Á‚½‚Ì‚ðC³
+EƒOƒ‰ƒtƒBƒeƒB‚ÌRange‚ð‚Æ‚è‚ ‚¦‚¸3‚É‚µ‚Ä‚Ý‚½
+ (db/)
+ skill_db.txt
+ (char/)
+ char.c
+ parse_frommap()
+ (map/)
+ clif.c
+ clif_parse_ActionRequest() •ÏX
+ clif_parse_UseSkillToId() •ÏX
+ mob.c
+ mob_gvmobcheck() ’ljÁ
+ mob.h
+ mob_gvmobcheck() ’è‹`’ljÁ
+ skill.c
+ skill_attack() •ÏX
+
+--------------------
+//1046 by SVN
+¦db/packet_db.txt‚Í2004-09-06aSakexe—p‚È‚Ì‚ÅAjROƒNƒ‰ƒCƒAƒ“ƒg‚ÅŽg—p‚·‚éÛ‚Íu//jRO‚Í‚±‚±‚Ü‚ÅvˆÈ‰º‚ðƒRƒƒ“ƒgƒAƒEƒg‚·‚邩휂µ‚Ä‚­‚¾‚³‚¢
+
+E•ÏX“_‚ª‘½‚¢‚Ì‚ÅÚׂ̓tƒ@ƒCƒ‹AŠÖ”‚²‚Æ‚É‹Lq‚µ‚Ä‚¢‚Ü‚·
+E1045‚É‚»‚Ì‚Ü‚Üã‘‚«‚µ‚Ä‚à“®ì‚µ‚Ü‚·‚ªAŽg‚í‚ê‚È‚¢ƒtƒ@ƒCƒ‹‚ª‚¢‚­‚‚©Žc‚è‚Ü‚·
+Escript/ˆÈ‰º‚Í–¼‘O‚ª•ÏX‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ª‘å—Ê‚É‚ ‚é‚Ì‚Åscript/‚Ì•ÏX“_‚ðŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢
+EƒXƒNƒŠƒvƒg—p‚ÌŠÖ”‚â–½—ß‚ª‘‚¦‚½‚èŽd—l‚ª•ÏX‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ª‚ ‚è‚Ü‚·
+ Šî–{“I‚ɂ͌݊·«‚ª‚ ‚é‚Í‚¸‚Å‚·‚ªAgetgdskilllv()‚¾‚¯‚Í‘æ“ñˆø”‚𔎚‚Å‚Í‚È‚­ƒXƒLƒ‹–¼(GD_APPROVAL‚È‚Ç)‚É’u‚«Š·‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·
+ getgdskilllv()‚ªŽg‚í‚ê‚Ä‚¢‚é/script/npc/gvg_big5/*.* ‚Í’†‘Œê‚Å•K—v‚È‚¢‚Ì‚Å휂µ‚Ä‚­‚¾‚³‚¢
+ ’ljÁ‚â•ÏX‚ÉŠÖ‚µ‚Ä‚ÍŠT‚Ëscript_ref.txt‚É”½‰f‚µ‚Ä‚ ‚è‚Ü‚·‚ªAÚׂÍscript.c‚Ì•ÏX“_‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢
+E’ljÁ‚³‚ꂽ@ƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Í@help‚Æatcommand.c‚Ì•ÏX“_‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢
+E’ljÁ‚³‚ꂽݒè‚Íconf_ref.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢
+E‹Lq˜R‚ê‚Ì•ÏX“_‚à‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
+
+’ljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuAv
+•ÏX‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuCv
+휂µ‚½ƒtƒ@ƒCƒ‹‚ÍuDv
+ˆÚ“®‚µ‚½ƒtƒ@ƒCƒ‹‚ÍuMv
+ /
+ C athena-start
+ ./conf/import ˆÈ‰º‚ð‹N“®Žž‚ÉŽ©“®ì¬‚·‚é‚悤‚É•ÏX
+ seqƒRƒ}ƒ“ƒh‚ðŽg‚í‚È‚¢‚悤‚É‚µ‚ÄFreeBSD‚Å‚à“®ì‚·‚é‚悤‚É•ÏX
+ start
+ ‚·‚Å‚ÉAthena‚ª‹N“®‚µ‚Ä‚¢‚鎞‚͉½‚à‚µ‚È‚¢‚悤‚É•ÏX
+ exec‚Å ./ ‚ªƒ_ƒu‚Á‚Ä‚¢‚½‚Ì‚Åíœ
+ stop
+ FreeBSD‚Å‚àƒVƒFƒ‹‚É–ß‚é‚悤‚É•ÏX
+ kill
+ “¯ã
+ C Makefile
+ PACKETDEF ‚É PACKETVER=6 ‚ð’ljÁ
+ FreeBSD‚𔻒肵‚Ä make ‚Æ gmake ‚ðØ‚è‘Ö‚¦‚é‚悤‚É•ÏX
+ CFLAGS ‚ð•ª‰ð‚µ‚Ä˜M‚è‚â‚·‚¢‚悤‚É•ÏX
+ C start
+ 1s–ڂ̃VƒFƒ‹Žw’肪³‚µ‚­‚È‚©‚Á‚½‚Ì‚ð•ÏX
+ ‚·‚Å‚ÉAthena‚ª‹N“®‚µ‚Ä‚¢‚鎞‚͉½‚à‚µ‚È‚¢‚悤‚É•ÏX
+ ‹N“®Šm”F‚ÌðŒŽ®‚ð athena-start ‚Æ“¯‚¶•¨‚É•ÏX
+ bin/tool/
+ ƒVƒFƒ‹ƒXƒNƒŠƒvƒg‚̉üsƒR[ƒh‚ð CRLF ‚©‚ç LF ‚Ì‚Ý‚É•ÏX
+ C getlogincount
+ ƒƒOƒCƒ“ƒo[ƒWƒ‡ƒ“‚ð $loginversion ‚Æ‚µ‚Ä•ÏX‚Å‚«‚é‚悤‚É•ÏX
+ C ladmin
+ ƒAƒJƒEƒ“ƒg–¼‚Éu-v‚ðŽg‚¦‚é‚悤‚É•ÏX
+
+ conf/
+ D import/
+ ”z•z•¨‚©‚çíœ(athena-start start ‚ÅŽ©“®ì¬‚³‚ê‚é)
+ C atcommand_athena.conf
+ shuffle maintenance misceffect ’ljÁ
+ C char_athena.conf
+ default_map_type default_map_name ’ljÁ
+ C help.txt
+ à–¾’ljÁ
+ C login_athena.conf
+ login_version login_type ’ljÁ
+ C map_athena.conf
+ npc map FX•ÏX
+ C mapflag.txt
+ ÅV”Å‚ÉXV
+ C msg_athena.conf
+ 81ˆÈ~’ljÁ
+ C water_height.txt
+ ÅV”Å‚ÉXV
+ db/
+ C castle_db.txt
+ ƒMƒ‹ƒh‰ð‘ÌŽž‚É”­¶‚·‚é OnGuildBreak ƒCƒxƒ“ƒg‚Ì‚½‚ß‚É <Event_Name> ’ljÁ
+ C const.txt
+ GvG‚ÌŠJŽnŽžŠÔ“™‚ðÝ’è‚Å‚«‚é‚悤‚ɒljÁ
+ ƒ}ƒbƒvƒtƒ‰ƒO mf_notrade mf_noskill ’ljÁ
+ ƒpƒ‰ƒ[ƒ^ PartnerId Cart ’ljÁ
+ ƒ{[ƒiƒX bBreakWeaponRate bBreakArmorRate bAddStealRate bUnbreakableWeapon bUnbreakableArmor ’ljÁ
+ ƒXƒe[ƒ^ƒX•Ï‰» SC_WEDDING ’ljÁ
+ ƒXƒNƒŠƒvƒg–½—ß getgdskilllv —p‚É GD_APPROVAL ‚ȂǒljÁ
+ C exp.txt
+ “]¶“ñŽŸE‚ªBaseLv12‚É‚È‚é‚Æ‚«‚É•K—v‚ÈŒoŒ±’l‚ð41¨481‚ÉC³
+ C item_db.txt
+ C mob_db.txt
+ C mob_skill_db.txt
+ C skill_cast_db.txt
+ C skill_db.txt
+ C skill_require_db.txt
+ C skill_tree.txt
+ ÅV”Å‚ÉXV
+ A packet_db.txt
+ ƒpƒPƒbƒg’è‹`ƒtƒ@ƒCƒ‹’ljÁ
+ doc/
+ C client_packet.txt
+ V‚µ‚­”»–¾‚µ‚½ƒpƒPƒbƒg‚ð‚¢‚­‚‚©’ljÁ
+ C conf_ref.txt
+ V‚µ‚­’ljÁ‚µ‚½Ý’è‚Ìà–¾‚ð’ljÁ
+ C db_ref.txt
+ skill_cast_db.txt ‚Ì list_hp_rate list_sp_rate ‚Å•‰”‚ðŽw’肵‚½Žž‚Ì‹““®‚ð’ljÁ
+ C help.txt
+ conf/help.txt “¯—l‚É•ÏX
+ C inter_server_packet.txt
+ V‹K‚ŒljÁ‚µ‚½ƒpƒPƒbƒg‚ð’ljÁ‚ÆŽÀ‘Ô‚Æ‚ ‚Á‚Ä‚¢‚È‚©‚Á‚½•”•ª‚ðC³
+ C item.txt
+ ÅV”Å‚ÉXV
+ C item_bonus.txt
+ V‹K‚ŒljÁ‚³‚ꂽƒ{[ƒiƒX‚ð’ljÁ
+ C script_ref.txt
+ V‹K–½—߂̒ljÁ‚ÆŠù‘¶–½—ß‚Ì•ÏX‚È‚Ç
+ C serverlink_packet.txt
+ V‹K‚ŒljÁ‚µ‚½ƒpƒPƒbƒg‚ð’ljÁ‚ÆŠù‘¶‚Å‘‚©‚ê‚Ä‚¢‚È‚©‚Á‚½ƒpƒPƒbƒg‚̒ljÁ
+ script/
+ mob/
+ C npc_monster.txt
+ ÅV”Å‚ÉXV
+ ƒjƒuƒ‹ƒwƒCƒ€‚ÌMob‚Ínpc_parse_mob()‚Ì•ÏXƒTƒ“ƒvƒ‹‚É‚È‚Á‚Ä‚Ü‚·
+ npc/
+ ‚Ù‚Ú‚·‚ׂĂÌNPC‚ðnpc_function.txt‚ðŽg‚Á‚½ƒ†[ƒU[’è‹`ŠÖ”‚Æ•¡»‚È‚Ç‚Å‘‚«Š·‚¦
+ ˆÚ“®‚µ‚½ƒtƒ@ƒCƒ‹‚ÉŠÖ‚µ‚Ă͈ړ®Œã‚̃tƒ@ƒCƒ‹‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚̂ňړ®‘O‚̃tƒ@ƒCƒ‹‚Ì‚Ý휂µ‚Ä‚­‚¾‚³‚¢
+ —á) etc/npc_etc_cTower.txt ‚ÍŠÜ‚Ü‚ê‚Ä‚¢‚é‚Ì‚Å npc_cTower.txt ‚ðíœ
+ M npc_cTower.txt
+ ¨etc/npc_etc_cTower.txt
+ A npc_function.txt
+ M npc_pota.txt
+ ¨../sample/npc_debug_pota.txt
+ M npc_pvp.txt
+ M npc_pvproom.txt
+ 2ƒtƒ@ƒCƒ‹‡‘Ì
+ ¨etc/npc_etc_pvp.txt
+ M npc_resetJ.txt
+ ¨../sample/npc_debug_reset.txt
+ A etc/
+ A npc_etc_gefenia.txt
+ C gvg/
+ ‚·‚ׂÄev_agit_common.txt‚ðŽg‚Á‚½ƒ†[ƒU[’è‹`ŠÖ”‚Å‘‚«Š·‚¦
+ ‚·‚ׂÄ휂µ‚Ä‚©‚炱‚̃pƒbƒ`‚ð“–‚Ä‚Ä‚­‚¾‚³‚¢
+ ƒMƒ‹ƒh‰ðŽUŽž‚ÉÔ‚ð•úŠü‚·‚邽‚ß‚Éev_agit_Ô.txt‚ÉOnGuildBreakƒCƒxƒ“ƒg‚ð’ljÁ
+ D test/
+ A ev_agit_common.txt
+ D ev_agit_event.txt
+ D TEST_prtg_cas01_AbraiJ.txt
+ D TEST_prtg_cas01_mob.txt
+ D gvg_big5/
+ C job/
+ “]EƒXƒNƒŠƒvƒg‚Ì–¼‘O‚ðnpc_job_[JOB”Ô†][ƒWƒ‡ƒu–¼].txt‚É•ÏX
+ ‚·‚ׂÄ휂µ‚Ä‚©‚炱‚̃pƒbƒ`‚ð“–‚Ä‚Ä‚­‚¾‚³‚¢
+ C quest/
+ M npc_event_arrow.txt
+ ¨../../sample/npc_debug_arrow.txt
+ A npc_event_hat2.txt
+ ƒjƒuƒ‹“¯ŽžŽÀ‘•‚ÌV“ª‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ
+ src/
+ calloc() realloc() ‚ð‹É—ÍŠeŒ^‚ɃLƒƒƒXƒg‚·‚é‚悤‚É•ÏX
+ calloc() Œã‚É memset() ‚Å \0 ‚ð–„‚ß‚Ä‚¢‚½‚Ì‚ðíœ
+ calloc() ‚È‚Ì‚É(ƒTƒCƒY*ŒÂ”,1)‚ÅŽw’肵‚Ä‚¢‚½‚Ì‚ð(ŒÂ”,ƒTƒCƒY)‚É•ÏX
+ ƒƒ‚ƒŠŠm•Û‚ðƒGƒ‰[ˆ—‚ð‚Ü‚Æ‚ß‚½ŠÖ”‚É‘‚«Š·‚¦
+ malloc() ¨ aMalloc()
+ calloc() ¨ aCalloc()
+ realloc() ¨ aRealloc()
+ strcpy() ‚ð strncpy() ‚É‹É—Í•ÏX
+
+ char/
+ C char.c
+ ƒXƒy[ƒX‚ŃCƒ“ƒfƒ“ƒg‚³‚ê‚Ä‚¢‚½‚Æ‚±‚ë‚ðƒ^ƒu‚Å“ˆê
+ A isGM()
+ A read_gm_account()
+ GMƒAƒJƒEƒ“ƒg‚ª•K—v‚É‚È‚Á‚½‚̂ŒljÁ
+ C mmo_char_tostr()
+ C mmo_char_fromstr()
+ nullpoƒ`ƒFƒbƒN’ljÁ
+ C count_users()
+ •K—v‚È‚¢{}‚ðíœ
+ C char_delete()
+ nullƒ`ƒFƒbƒN’ljÁ
+ 휃ƒbƒZ[ƒW‚ðƒRƒ“ƒ\[ƒ‹‚É•\Ž¦‚·‚é‚悤‚É‚µ‚½
+ 휎ž‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰‚ðØ’f‚·‚é‚悤map-server‚É’Ê’m(0x2b19ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ C parse_tologin()
+ C 0x2713
+ char-serverƒƒ“ƒeƒiƒ“ƒXݒ莞‚ÍGMˆÈŠO“ü‚ê‚È‚¢‚悤‚É‚µ‚½
+ Ú‘±”§ŒÀ‚ÅÅ‘å’l‚Å‚àGM‚ÍÚ‘±‚Å‚«‚é‚悤‚É‚µ‚½
+ C 0x272a
+ 0x2730‚ð0x272a‚É•ÏX‚µ‚ĔԆ‚ð‹l‚ß‚½
+ ƒAƒJƒEƒ“ƒg휂µ‚½Žž‚ɃLƒƒƒ‰‚ªˆê•”Á‚³‚ê‚È‚¢–â‘è‚ðC³
+ A 0x272c
+ ŽóMŽž‚Élogin-server‚É’Ê’m(0x2b15ƒpƒPƒbƒg)‚µ‚ăƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚È‚é‚悤‚É‚µ‚½
+ A char_erasemap()
+ map-serverØ’fŽž‚É‘¼map-server‚Ƀ}ƒbƒv‚Ì휂ð’Ê’m(0x2b16ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ ‚±‚ê‚É‚æ‚葼map-serverŠÇŠ‚̃}ƒbƒv‚Ɉړ®‚µ‚悤‚Æ‚µ‚ÄA‚»‚Ìmap-server‚ªØ’f‚³‚ê‚Ä‚¢‚½‚çA
+ pc_setpos()‚Å‘¶Ý‚µ‚È‚¢ƒ}ƒbƒv‚Æ‚¢‚¤‚±‚Ƃňړ®‚µ‚悤‚Æ‚µ‚È‚­‚È‚é‚Ì‚ÅA
+ ƒNƒ‰ƒCƒAƒ“ƒg‚ªu‰i‰“‚É‚¨‘Ò‚¿‚­‚¾‚³‚¢ó‘Ôv‚É‚È‚ç‚È‚¢‚悤‚É‚È‚è‚Ü‚·
+ C parse_frommap()
+ map-serverØ’fŽž‚Échar_erasemap()‚ðŽÀs‚·‚é‚悤‚É‚µ‚½
+ map-serverØ’fŽž‚ÉŠÇŠ‚̃}ƒbƒv‚ɃLƒƒƒ‰‚ªŽc‚Á‚Ä‚¢‚½‚çØ’f‚ð‘¼map-server‚É’Ê’m(0x2b17ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ C 0x2afc
+ ”FØŽ¸”sŽž‚É char_dat[].mapip/mapport ‚ð 0 ‚É‚·‚é‚悤‚É‚µ‚½
+ ”FجŒ÷Žž‚É char_dat[].mapip/mapport ‚ðmap-server‚ÌIPƒAƒhƒŒƒX‚ƃ|[ƒg‚É‚·‚é‚悤‚É‚µ‚½
+ ”FجŒ÷Žž‚É‘¼map-server‚ɃLƒƒƒ‰‚ªƒƒOƒCƒ“‚µ‚½‚±‚Æ‚ð’Ê’m(0x2b09ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ C 0x2b02
+ C 0x2b05
+ ƒRƒ“ƒ\[ƒ‹‚Ö‚Ìo—͂ɃpƒPƒbƒg”Ô†‚ð‹Lq‚·‚é‚悤‚É‚µ‚½
+ C 0x2b08
+ ƒpƒPƒbƒgŽd—l‚ð•ÏX‚µ‚Ä account_id mapip mapport ‚à’Ê’m‚·‚é‚悤‚É•ÏX
+ map-server‚ÉÚ‘±‚µ‚Ä‚¢‚È‚¢Žž‚Í‚·‚×‚Ä 0 ‚ª“ü‚è‚Ü‚·
+ A 0x2b13
+ map-server‹N“®“r’†‚ȂǂŃLƒƒƒ‰‚ªƒƒOƒCƒ“‚Å‚«‚È‚¢‚悤‚É‚·‚é server[].active ƒtƒ‰ƒO‚ð‘€ì‚·‚é
+ active = 0 ‚ŃLƒƒƒ‰‚̓ƒOƒCƒ“‚Å‚«‚¸‚ÉØ’f‚³‚ê‚é
+ map-server‚ª‹N“®‚ðŠ®—¹‚µ‚½‚Æ‚«‚É active = 1 ‚É‚·‚éƒpƒPƒbƒg‚ª‘—‚ç‚ê‚Ä‚­‚é
+ A 0x2b14
+ char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚·‚é char_maintenance ƒtƒ‰ƒO‚ð‘€ì‚·‚é
+ login-server‚É‚à’Ê’m(0x272bƒpƒPƒbƒg)‚µ‚ă[ƒ‹ƒh‘I‘ð‰æ–ʂŃƒ“ƒeƒiƒ“ƒX•\Ž¦‚ð‚·‚é
+ ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚Å‚ÍGMˆÈŠO‚̃†[ƒU[‚̓ƒOƒCƒ“‚Å‚«‚Ü‚¹‚ñ
+ A 0x2b18
+ ƒLƒƒƒ‰ƒNƒ^[‚ÌØ’f‚ð‘¼map-server‚É’Ê’m(0x2b17ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ C search_mapserver()
+ ˆø”‚É struct mmo_charstatus *cd ‚ð’ljÁ
+ cd‚ª“n‚³‚ꂽ•’T‚µ‚Ä‚¢‚éƒ}ƒbƒv‚ªÚ‘±‚µ‚Ä‚¢‚émap-server‚É–³‚©‚Á‚½‚Æ‚«‚ÉAʼn‚ÉŒ©‚‚¯‚½map-server‚Ìʼn‚ÉŒ©‚‚¯‚½ƒ}ƒbƒv‚ÉÚ‘±‚·‚é‚悤‚É‚µ‚½
+ ‚±‚ê‚Í char_athena.conf default_map_type: 2 ‚ÌŽž‚Ì‹““®‚Å‚·
+ C parse_char()
+ C 0x65
+ ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚ÌŽž‚ÉGMˆÈŠO‚ðØ’f‚·‚é‚悤‚É‚µ‚½
+ Å‘åÚ‘±”‚ªÝ’肳‚ê‚Ä‚¢‚ÄÅ‘åÚ‘±”‚Ì‚Æ‚«‚àGM‚ÍÚ‘±‚Å‚«‚é‚悤‚É‚µ‚½
+ C 0x66
+ char-server‚ÉÚ‘±‚µ‚Ä‚¢‚émap-server‚Élast_point‚ªŒ©‚‚¯‚ç‚ê‚È‚©‚Á‚½‚Æ‚«‚ÉA
+ default_map_type&1 ‚ÌŽž‚Í default_map_name ‚ÉÚ‘±‚·‚é
+ default_map_type&2 ‚ÌŽž‚Í Å‰‚ÉŒ©‚‚¯‚½map-server‚Ìʼn‚ÉŒ©‚‚¯‚½ƒ}ƒbƒv‚ÉÚ‘±‚·‚é
+ ‚»‚ê‚Å‚àŒ©‚‚©‚ç‚È‚¢Žž‚ÍØ’f‚·‚é‚悤‚É‚µ‚½
+ ƒRƒ“ƒ\[ƒ‹‚Ö‚Ìo—͂ɃpƒPƒbƒg”Ô†‚ð‹Lq‚·‚é‚悤‚É‚µ‚½
+ C 0x2af8
+ ‘¼ƒ}ƒbƒv‚ÉÚ‘±‚µ‚Ä‚¢‚éƒLƒƒƒ‰î•ñ‚ð’Ê’m(0x2b09ƒpƒPƒbƒg)‚·‚é‚悤‚É‚µ‚½
+ C 0x187
+ S 0187ƒpƒPƒbƒg‚ð•ÔM‚·‚é‚悤‚É‚µ‚½
+ C check_connect_login_server()
+ char_port‚ðWFIFOL‚Å‘—‚Á‚Ä‚¢‚½‚Ì‚ðWFIFOW‚ÉC³
+ 80‚Æ82‚ÌŠÔ‚ª‹ó‚¢‚Ä‚¢‚½‚Ì‚ð‹l‚߂ăpƒPƒbƒg’·‚ð86¨84‚É•ÏX
+ C char_config_read()
+ default_map_type default_map_name ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ A gm_account_db_final()
+ Šm•Û‚µ‚½ gm_account_db ‚̃ƒ‚ƒŠ‚ðI—¹Žž‚ÉŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C do_final()
+ inter.c ‚È‚Ç‘¼ƒtƒ@ƒCƒ‹‚ÌI—¹ˆ—(do_final_*)‚ð’ljÁ‚µ‚½
+ exit_dbn() ‚Ådb—p‚̃ƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ Ú‘±‚³‚ê‚Ä‚¢‚émap-server‚̃ZƒbƒVƒ‡ƒ“‚ð휂·‚é‚悤‚É‚µ‚½
+ do_final_timer()‚Åtimer‚ðI—¹‚³‚¹‚é‚悤‚É‚µ‚½
+ C do_init()
+ server[].active = 0 ‚ʼnŠú‰»
+ read_gm_account() ‚ÅGMƒAƒJƒEƒ“ƒgƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ C char.h
+ mmo_map_server ‚É active ƒtƒ‰ƒO‚ð’ljÁ‚µ‚½
+ C int_guild.c
+ C mapif_parse_GuildSkillUp()
+ ƒMƒ‹ƒhƒ|ƒCƒ“ƒg‚ðÁ”‚È‚¢‚ŃMƒ‹ƒhƒXƒLƒ‹‚ðã‚°‚邽‚ß‚É int flag ‚ð’ljÁ
+ C inter_guild_parse_frommap()
+ 0x303C
+ ƒpƒPƒbƒg’è‹`‚ð•ÏX‚µ‚Äflag‚ð’ljÁ‚µ‚½
+ A guild_db_final()
+ A castle_db_final()
+ A do_final_int_guild()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C int_guild.h
+ A do_final_int_guild()
+ ’è‹`‚ð’ljÁ
+ C int_party.c
+ A party_db_final()
+ A do_final_int_party()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C int_party.h
+ A do_final_int_party()
+ ’è‹`‚ð’ljÁ
+ C int_pet.c
+ A pet_db_final()
+ A do_final_int_pet()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C int_pet.h
+ A do_final_int_pet()
+ ’è‹`‚ð’ljÁ
+ C int_storage.c
+ A storage_db_final()
+ A guild_storage_db_final()
+ A do_final_int_storage()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C int_storage.h
+ A do_final_int_storage()
+ ’è‹`‚ð’ljÁ
+ C inter.c
+ ƒpƒPƒbƒg’·’è‹`‚ð•ÏX
+ A mapif_parse_CharPosReq()
+ 0x3090ƒpƒPƒbƒg‚ւ̑Ήž
+ ƒLƒƒƒ‰‚̈ʒu—v‹‚ðmap-server‚É’Ê’m(0x3890ƒpƒPƒbƒg)‚·‚é
+ A mapif_parse_CharPos()
+ 0x3091ƒpƒPƒbƒg‚ւ̑Ήž
+ ƒLƒƒƒ‰‚̈ʒu—v‹‚ð‚µ‚½ƒLƒƒƒ‰‚Ɉʒuî•ñ‚ð’Ê’m(0x3891ƒpƒPƒbƒg)‚·‚é
+ A mapif_parse_CharMoveReq()
+ 0x3092ƒpƒPƒbƒg‚ւ̑Ήž
+ —v‹‚µ‚½ƒLƒƒƒ‰‚Ü‚Å‘Îۂ̃Lƒƒƒ‰‚ð”ò‚΂·—v‹‚ð’Ê’m(0x3892ƒpƒPƒbƒg)‚ð‚·‚é
+ A mapif_parse_DisplayMessage()
+ 0x3093ƒpƒPƒbƒg‚ւ̑Ήž
+ ƒLƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—M(0x3893ƒpƒPƒbƒg)‚·‚é
+ C inter_parse_frommap()
+ Še’ljÁƒpƒPƒbƒg‚ւ̑Ήž‚ð’ljÁ‚µ‚½
+ A wis_db_final()
+ A accreg_db_final()
+ A do_final_inter()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C inter.h
+ A do_final_inter()
+ ’è‹`‚ð’ljÁ
+ C Makefile
+ A nullpo.o nullpo.h ‚ð’ljÁ
+ A malloc.o malloc.h ‚ð’ljÁ
+ common/
+ C db.c
+ A exit_dbn()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚邽‚߂ɒljÁ
+ C db.h
+ A exit_dbn()
+ ’è‹`’ljÁ
+ A malloc.h
+ A malloc.c
+ ƒƒ‚ƒŠŠm•ÛŠÖ”‚Ì‚Ü‚Æ‚ß
+ C mmo.h
+ C mmp_charstatus
+ mapip mapport ’ljÁ
+ C guild_castle
+ castle_event ’ljÁ
+ C Makefile
+ A malloc.o malloc.h malloc.c ‚ð’ljÁ
+ C nullpo.h
+ ŒÃ‚¢gcc‚ŃRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É\‚ðíœ
+ C socket.c
+ C recv_to_fifo()
+ ”Ä—p«‚ð‚‚߂邽‚ß‚É read() ‚ð recv() ‚É•ÏX
+ C send_from_fifo()
+ ”Ä—p«‚ð‚‚߂邽‚ß‚É write() ‚ð send() ‚É•ÏX
+ C timer.c
+ A do_final_timer()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C timer.h
+ A do_final_timer()
+ ’è‹`’ljÁ
+ login/
+ C login.c
+ A login_version login_type
+ clientinfo.xml‚ÅŽw’è‚·‚é login_version login_type ‚ŃƒOƒCƒ“‚ð‹K§‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·
+ C parse_fromchar()
+ A 0x272b
+ server[].maintenance ƒtƒ‰ƒO‚ð•ÏX‚·‚é
+ •ÏX‚µ‚½“à—e‚ðchar-server‚É•ÔM(0x272cƒpƒPƒbƒg)‚·‚é
+ C parse_admin()
+ C 0x7932
+ 0x2730¨0x272a ‚É•ÏX
+ C parse_login()
+ C 0x64 0x01dd
+ login_version login_type ‚ð”»’è‚·‚é‚悤‚É‚µ‚½
+ C 0x2710
+ ƒpƒPƒbƒg’·‚Ì’è‹`‚ª³‚µ‚­‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚½
+ char.c check_connect_login_server ‚Ì•ÏX‚𔽉f
+ C login_config_read()
+ login_version login_type‚Ì“Ç‚Ýž‚Ý‚ð’ljÁ
+ A gm_account_db_final()
+ C do_final()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É•ÏX
+ C Makefile
+ A malloc.o malloc.h ‚ð’ljÁ
+ map/
+ C atcommand.c
+ ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚Åmemwatch‚ð“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚½
+ C atcommand_where()
+ ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚̋ꊂà•\Ž¦‚Å‚«‚é‚悤‚É‚µ‚½
+ C atcommand_jumpto()
+ ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚É‚à”ò‚ׂé‚悤‚É‚µ‚½
+ C atcommand_who()
+ ƒ[ƒ‹ƒh“à‚Ì‚·‚ׂĂɂ¢‚éƒLƒƒƒ‰‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
+ C atcommand_go()
+ ƒjƒuƒ‹ƒwƒ‹ƒ€‚̈ړ®ƒ|ƒCƒ“ƒg‚ð•ÏX
+ C atcommand_recall()
+ ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚àŒÄ‚Ño‚¹‚é‚悤‚É‚µ‚½
+ A atshuffle_sub()
+ A atcommand_shuffle()
+ PC‚ÆMOB‚̃Vƒƒƒbƒtƒ‹‚ðs‚¤ @shuffle ‚ð’ljÁ
+ A atcommand_maintenance()
+ char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚·‚é @maintenance ‚ð’ljÁ
+ A atcommand_misceffect()
+ ŽÀs‚µ‚½ƒLƒƒƒ‰‚©‚ç0x1f3ƒpƒPƒbƒg‚ð”­M‚µ‚ăGƒtƒFƒNƒg‚ð•\Ž¦‚·‚é @misceffect ‚ð’ljÁ
+ A atcommand_summon()
+ ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX‚Æ‹©‚ñ‚ÅŽw’肵‚½Mob‚𢊫‚·‚é @summon ‚ð’ljÁ
+ ¢Š«‚³‚ꂽMob‚Í‘¼‚ÌMob(Pv“™‚Å‚Í“G‘ÎPCŠÜ‚Þ)‚ðUŒ‚‚µ‚Ü‚·
+ ¢Š«‚³‚ꂽMob‚ÉUŒ‚‚³‚ꂽMob‚Í¢Š«Žå‚ðUŒ‚‚µ‚Ü‚·(ƒoƒCƒIƒvƒ‰ƒ“ƒg‚̃tƒ[ƒ‰‚Æ“¯‚¶‹““®)
+ ¢Š«‚³‚ꂽMob‚Í1•ªŒã‚ÉÁ–Å‚µ‚Ü‚·
+ ƒlƒ^‚Ȃ̂ʼnB‚µƒRƒ}ƒ“ƒh‚Æ‚µ‚Ähelp.txt‚É‚Í‹Lq‚µ‚Ä‚Ü‚¹‚ñ
+ C atcommand.h
+ ’ljÁ‚µ‚½@ƒRƒ}ƒ“ƒh‚ð AtCommandType ‚ɒljÁ
+ C msg_table[] ‚ðŠO‚©‚çŽg‚¦‚é‚悤‚É‚·‚邽‚ß‚Éextern‚µ‚½
+ C battle.c
+ ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚Åmemwatch‚ð“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚½
+ A battle_config.castle_defense_rate
+ –{ŽI‚Å–hŒä’l‚ª‚ǂ̂悤‚ɉe‹¿‚·‚é‚©‹ï‘Ì“I‚É‚Í•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAÔ‚Ì–hŒä’l‚𔽉f‚³‚¹‚é—¦‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
+ C battle_get_opt1()
+ C battle_get_opt2()
+ C battle_get_option()
+ NPC‚̃IƒvƒVƒ‡ƒ“‚à•Ô‚·‚悤‚É‚µ‚½
+ A battle_get_opt3()
+ opt3‚ð•Ô‚·‚悤‚ɒljÁ
+ C battle_calc_damage()
+ Ô“à‚ÌMob‚ւ̃_ƒ[ƒW‚Í–hŒä’l‚ÅŒ¸ŽZ(ƒ_ƒ[ƒW*(–hŒä’l/100)*(castle_defense_rate/100))‚³‚ê‚é‚悤‚É‚µ‚½
+ ƒK[ƒfƒBƒAƒ“‚ɂ̓XƒLƒ‹‚ªŒø‚­‚悤‚É‚µ‚½
+ C battle_calc_pet_weapon_attack()
+ C battle_calc_mob_weapon_attack()
+ C battle_calc_pc_weapon_attack()
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚̃_ƒ[ƒWŒvŽZ‚ð‚·‚é‚悤‚É‚µ‚½
+ C battle_weapon_attack()
+ •ŠíUŒ‚‚É‚æ‚鑦Ž€‚ÌŽd—l‚ð•ÏX
+ •ŠíAŠZ”j‰ó‚ÌŠm—¦ŒvŽZ‚ð‚·‚é‚悤‚É•ÏX
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ª‰ðœ‚³‚ê‚é‚悤‚É•ÏX
+ C battle_check_target()
+ src ‚¶‚á‚È‚­‚Ä ss ‚©‚çparty_id guild_id‚ðŽæ“¾‚·‚é‚悤‚ÉC³
+ target=BCT_NOENEMY ‚ȃXƒLƒ‹ Œû“JAƒnƒ~ƒ“ƒO‚È‚Ç‚ªPvPAGvG‚ÌŽž‚É‚à‘¼PC‚ɉe‹¿‚·‚é‚悤‚É‚µ‚½
+ Mob‚ªspecial_ai‚È‚çMob‚ð“G‚Æ‚Ý‚È‚·‚悤‚É‚µ‚½
+ C battle_config_read()
+ castle_defense_rate ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ C battle.h
+ A battle_get_opt3()
+ ’è‹`’ljÁ
+ C Battle_Config
+ castle_defense_rate ’ljÁ
+ C chat.c
+ C chat_createnpcchat()
+ ˆø”‚É int pub ‚ð’ljÁ
+ pub=3 ‚ł̓`ƒƒƒbƒg‚̊Ŕ‚É(0/20)‚̂悤‚È•\Ž¦‚ª‚³‚ê‚È‚­‚È‚è‚Ü‚·
+ A do_final_chat()
+ ‰½‚à‚µ‚Ä‚È‚¢‚¯‚Ç‚Æ‚è‚ ‚¦‚¸’ljÁ
+ C chat.h
+ C chat_createnpcchat()
+ ’è‹`‚ð•ÏX
+ A do_final_chat()
+ ’è‹`‚ð’ljÁ
+ C chrif.c
+ ƒpƒPƒbƒg’·ƒe[ƒuƒ‹‚ðŠg’£
+ C chrif_connect()
+ C chrif_changemapserver()
+ WFIFOL‚Ń|[ƒg‚ð‘—‚Á‚Ä‚¢‚½‚Ì‚ðWFIFOW‚ÉC³
+ A chrif_recverasemap()
+ ‘¼map-server‚ªØ’f‚³‚ꂽ‚±‚Æ‚ªchar-server‚æ‚è’Ê’m‚³‚ꂽŽž‚ÉA‚»‚Ìmap-server‚ªŠÇ—‚µ‚Ä‚¢‚½ƒ}ƒbƒv‚Ìî•ñ‚ð휂·‚é‚悤‚É‚µ‚½
+ A chrif_mapactive()
+ map-server‹N“®€”õ’†‚É0AŠ®—¹Žž‚É1‚ðchar-server‚É’Ê’m(0x2b13)‚µ‚Ä‹N“®“r’†‚Ƀ†[ƒU[‚ªƒƒOƒCƒ“‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ A chrif_maintenance()
+ char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½‚è‰ðœ‚µ‚½‚è‚ð’Ê’m(0x2b14)‚·‚é
+ A chrif_maintenanceack()
+ char-server‚ðƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½Žž‚̉ž“š
+ ƒƒ“ƒeƒiƒ“ƒXó‘Ô‚É‚µ‚½Ž|‚ðƒ}ƒbƒv“à‚É’Ê’m‚·‚é
+ A chrif_chardisconnect()
+ char-server‚ɃLƒƒƒ‰‚ªØ’f‚³‚ꂽ‚±‚Æ‚ð’Ê’m(0x2b18)‚·‚é
+ A chrif_parse_chardisconnectreq()
+ char-server‚©‚ç‚̃Lƒƒƒ‰Ø’f—v‹‚ðŽó‚¯‚ÄA‘ÎÛƒLƒƒƒ‰‚ª‚¢‚éꇂɂÍØ’f‚·‚é
+ C chrif_parse()
+ C 0x2b09
+ map_addchariddb() ‚̈ø”‘‰Á‚ɑΉž
+ A 0x2b15
+ A 0x2b16
+ A 0x2b17
+ A 0x2b19
+ ŠeV‹KƒpƒPƒbƒg‚ɑΉž
+ C check_connect_char_server()
+ Ú‘±Žžchar-server‚Émap-server‚Ì€”õ‚ªo—ˆ‚½‚±‚Æ‚ð’Ê’m‚·‚é‚悤‚É‚µ‚½
+ A do_final_chrif()
+ I—¹Žž‚Échar-server‚Æ‚ÌÚ‘±‚ð휂·‚é‚悤‚É‚µ‚½
+ C chrif.h
+ A chrif_mapactive()
+ A chrif_maintenance()
+ A chrif_chardisconnect()
+ A do_final_chrif()
+ ’è‹`‚ð’ljÁ
+ C clif.c
+ ‚·‚ׂẴpƒPƒbƒg’è‹`‚ð packet_db ‚©‚ç“Ç‚Ýž‚ނ悤‚É•ÏX
+ packet_db.txt‚ð•ÏX‚·‚邱‚Æ‚ÅA“xX•ÏX‚³‚ê‚éŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚̃pƒPƒbƒg’è‹`‚ɑΉž‚µ‚â‚·‚­‚È‚è‚Ü‚·
+ packet_len_table[] ‚Í packet_db[].len ‚É’u‚«Š·‚í‚è‚Ü‚µ‚½
+ <time.h> ‚ðinclude
+ clif_parse_*‚ð擪‚Å錾‚·‚é‚悤‚É‚µ‚½
+ clif_parse_*“à‚ÌRFIFOŒn‚ÅŽg‚í‚ê‚Ä‚¢‚é‘æ2ˆø”‚Í packet_db[cmd].pos[] ‚Å•\‹L‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ ƒpƒPƒbƒg”Ô†‚ÌÅ‘å’l‚ð MAX_PACKET_DB ‚Å’è‹`‚·‚é‚悤‚É‚µ‚½
+ C clif_set0078()
+ C clif_set007b()
+ ƒpƒPƒbƒg‚Ì“à—e‚ª–{ŽI‚ƈá‚Á‚Ä‚¢‚½‚Ì‚Åguild_emblem_id,manner,opt3‚𳂵‚­‘—‚é‚悤‚É•ÏX
+ C clif_class_change()
+ MobˆÈŠO‚ÌNPC‚Å‚àŽg‚¦‚é‚悤‚É‚µ‚½
+ C clif_mob0078()
+ C clif_mob007b()
+ ƒK[ƒfƒBƒAƒ“‚ɃMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
+ C clif_npc0078()
+ ƒ[ƒvƒ|[ƒ^ƒ‹‚ðƒMƒ‹ƒhƒtƒ‰ƒbƒO‚É‚·‚éƒIƒvƒVƒ‡ƒ“‚ð—LŒø‚É‚µ‚½Žž‚Émap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
+ C clif_spawnnpc()
+ NPC‚ª–³Œø‚Å‚àHideó‘Ô‚ÌŽž‚̓pƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏX
+ C clif_quitsave()
+ ƒLƒƒƒ‰I—¹Žž‚Échar-server‚ÉØ’f‚ð’Ê’m‚·‚é‚悤‚É‚µ‚½
+ C clif_scriptmenu()
+ C clif_dispchat()
+ C clif_changechatstatus()
+ len‚É1ƒoƒCƒg’ljÁ
+ C clif_updatestatus()
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð‘—M‚·‚é‚悤‚É‚µ‚½
+ A clif_changestatus()
+ ŽüˆÍ‚ÉÔƒGƒ‚ó‘Ô‚Å‚ ‚邱‚Æ‚ð‘—M
+ A clif_misceffect2()
+ ƒGƒtƒFƒNƒg‚ð”­¶‚³‚¹‚éƒpƒPƒbƒg‚ð‘—M
+ @misceffect, misceffect–½—ß‚ÅŽg—p
+ C clif_changeoption()
+ ó‘ÔˆÙ펞ˆÈŠO‚Íó‘ÔˆÙíƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg‚ð‘—‚ç‚È‚¢‚悤‚É‚µ‚½
+ PC‚ÌŽž‚Í clif_changelook() ‚ð‘—M‚·‚é‚悤‚É‚µ‚½(Œ‹¥ˆßÖ•\Ž¦—pH)
+ C clif_traderequest()
+ ŽæˆøƒpƒPƒbƒg‚Ì 0xe5 ¨ 0x1f4 ‚ɉ¼‘Ήž(–{ŽI‚Å‚ÌŽZoŽ®‚Í•s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ char_id ‚ð‘—M)
+ C clif_tradestart()
+ ŽæˆøƒpƒPƒbƒg‚Ì 0xe7 ¨ 0x1f5 ‚ɉ¼‘Ήž(–{ŽI‚Å‚ÌŽZoŽ®‚Í•s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ char_id ‚ð‘—M)
+ C clif_getareachar_pc()
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª•‰”‚ÌŽž‚É‚ÍÔƒGƒ‚•\Ž¦ƒpƒPƒbƒg‚ð‘—M‚·‚é‚悤‚É‚µ‚½
+ C clif_getareachar_npc()
+ NPC‚ÌHideó‘ԂɑΉž
+ C clif_getareachar_skillunit()
+ C clif_skill_nodamage()
+ Ž©”š‚ÌŽž‚Íheal‚𕉔‚É‚Å‚«‚é‚悤‚É‚µ‚½
+ C clif_skill_setunit()
+ ƒOƒ‰ƒtƒBƒeƒB‚ɑΉž
+ A clif_item_repair_list()
+ •ŠíC—ƒXƒLƒ‹‚ɑΉž‚µ‚悤‚Æ‚µ‚½‚¯‚ǃpƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“ÚÁ’†
+ C clif_produceeffect()
+ map_addchariddb() ‚̈ø”‘‰Á‚ɑΉž
+ C clif_guild_skillinfo()
+ –¢ŽÀ‘•ƒMƒ‹ƒhƒXƒLƒ‹ ƒJƒŠƒXƒ}‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
+ C clif_callpartner()
+ ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ Žg—pŽž‚É‘ŠŽè‚Ì–¼‘O‚ð‹©‚Ô‚æ‚¤‚É‚µ‚½
+ C clif_sitting()
+ ˆø” fd ‚Í•s—v‚È‚Ì‚Åíœ
+ C clif_GM_kick()
+ ƒtƒ‰ƒO‚ð0‚É‚·‚é‚悤‚É‚µ‚½
+ A clif_wisexin()
+ Wis‹‘”Û‹–‰Â‚̉ž“š‚ð‘—M
+ A clif_wisall()
+ Wis‘S‹‘”Û‹–‰Â‚̉ž“š‚ð‘—M
+ A clif_soundeffect()
+ SE‚ð–‚炷ƒpƒPƒbƒg‚ð‘—M
+ soundeffect–½—ß‚ÅŽg—p
+ C clif_parse_LoadEndAck()
+ Œ‹¥Œã‚̃EƒFƒfƒBƒ“ƒOƒhƒŒƒX‚âƒ^ƒLƒV[ƒh‚Ìó‘Ô‚ðƒƒOƒAƒEƒg‚µ‚Ä‚à1ŽžŠÔ‚ÍŒp‘±‚³‚ê‚é‚悤‚É‚µ‚½
+ ÔƒGƒ‚ó‘Ԃ̓ƒOƒAƒEƒg‚µ‚Ä‚àƒƒOƒCƒ“‚µ‚½Žž‚©‚ç‚Ü‚½Œp‘±‚·‚é‚悤‚É‚µ‚½
+ C clif_parse_QuitGame()
+ C clif_parse_Restart()
+ I—¹‚Å‚«‚È‚¢ðŒ‚ð pc_isquitable() ‚É‚Ü‚Æ‚ß‚½
+ C clif_parse_GlobalMessage()
+ C clif_parse_Wis()
+ C clif_parse_PartyMessage()
+ C clif_parse_GuildMessage()
+ ÔƒGƒ‚ó‘Ô‚Å‚Í”­Œ¾‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_ActionRequest()
+ ƒMƒ‹ƒh–¢‰Á“ü‚È‚Ç‚Ìꇂ̓K[ƒfƒBƒAƒ“‚âƒGƒ“ƒyƒŠƒEƒ€‚ð‰£‚ê‚È‚¢‚悤‚É‚µ‚½
+ clif_sitting()‚̈ø”•ÏX‚ɑΉž
+ C clif_parse_UseItem()
+ ÔƒGƒ‚ó‘Ԃł̓AƒCƒeƒ€‚ðŽg‚¦‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_EquipItem()
+ ƒAƒCƒeƒ€‚ª”j‰ó‚³‚ê‚Ä‚¢‚鎞‚Í‘•”õ‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_TradeRequest()
+ C clif_parse_TradeAck()
+ notradeƒ}ƒbƒv‚Å‚ÍŽæˆø—v¿‚ð‘—‚ê‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_UseSkillToId()
+ C clif_parse_UseSkillToPos()
+ C clif_parse_UseSkillMap()
+ noskillƒ}ƒbƒv‚ł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ ƒ`ƒƒƒbƒg’†‚̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ ÔƒGƒ‚’†‚̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ ƒEƒFƒfƒBƒ“ƒOó‘Ԃł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_MoveToKafra()
+ itemdb_isdropable()==0 ‚Í‘qŒÉ‚É“ü‚ê‚ç‚ê‚È‚¢‚悤‚É‚µ‚½
+ C clif_parse_GMReqNoChat()
+ GM‰EƒNƒŠƒbƒN‚ÅÔƒGƒ‚‚ð•t—^E‰ðœ‚Å‚«‚é‚悤‚É‚µ‚½
+ C clif_parse_GMReqNoChatCount()
+ –{ŽI‚Å‚Ì•Ô“šƒpƒPƒbƒg‚ª‚æ‚­•ª‚©‚ç‚È‚¢‚̂ʼn¼‘Ήž
+ –{“–‚̓AƒJƒEƒ“ƒg–¼‚ª•Ô‚é‚Ì‚©‚ÈH
+ C clif_parse_sn_explosionspirits()
+ ƒNƒ‰ƒCƒAƒ“ƒg‚©‚çƒpƒPƒbƒg‚ª—ˆ‚½Žž‚ɃRƒ“ƒ\[ƒ‹‚ɃƒO‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
+ BaseLv99ˆÈã‚ÌŽž‚É0‚ÅœŽZ‚·‚é‰Â”\«‚ª‚ ‚é‚Ì‚ð‰ñ”ð
+ A pstrcmp()
+ clif_parse_wisexin()‚Ìqsort()‚ÅŽg—p
+ A clif_parse_wisexin()
+ Wis‹‘”Û‹–‰Â‚ɑΉž
+ A clif_parse_wisexlist()
+ Wis‹‘”ÛƒŠƒXƒg•\Ž¦‚ɑΉž
+ A clif_parse_wisall()
+ Wis‘S‹‘”Û‹–‰Â‚ɑΉž
+ A clif_parse_GMkillall()
+ GMƒRƒ}ƒ“ƒh/killall(=@kickall)‚ɑΉž
+ A clif_parse_GMsummon()
+ GMƒRƒ}ƒ“ƒh/summon(=@recall)‚ɑΉž
+ A clif_parse_GMshift()
+ GMƒRƒ}ƒ“ƒh/shift(=@jumpto)‚ɑΉž
+ A clif_parse_debug()
+ packet_db.txt‚̃fƒoƒO—p‚ɒljÁ
+ ƒpƒPƒbƒg“à—e‚ðƒ_ƒ“ƒv‚µ‚Ü‚·
+ C clif_parse()
+ clif_parse_func_table ‚ðíœ(packet_db[cmd].func‚É“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½)
+ A packetdb_readdb()
+ packet_db.txt‚ð“Ç‚Ýž‚Ý‚Ü‚·
+ ƒtƒH[ƒ}ƒbƒg‚Í ƒpƒPƒbƒg”Ô†,ƒpƒPƒbƒg’·[,ƒRƒ}ƒ“ƒh,ƒRƒ}ƒ“ƒhˆø”‚̈ʒu(:‹æØ‚è‚Å•¡”Žw’è)]
+ ƒRƒ}ƒ“ƒhˆø”‚̈ʒu‚ÍŠeƒRƒ}ƒ“ƒh‚ɑΉž‚·‚éŠÖ”“à‚Åݒ肳‚ê‚Ä‚¢‚é‚Ì‚Åclif.c‚ð“Ç‚Ü‚È‚¢‚Æ•ª‚©‚ç‚È‚¢“ï‰ð‚ȃtƒH[ƒ}ƒbƒg‚Å‚·
+ •ÏX‚³‚ꂽƒpƒPƒbƒg‚Ípacket_db.txt‚Ì––”ö‚ɒljÁ‚µ‚Ü‚·
+ ŒÃ‚¢ƒNƒ‰ƒCƒAƒ“ƒg‚ð—˜—p‚·‚éꇂɂ͕s—v‚È’è‹`‚ð––”ö‚©‚ç휂·‚ê‚΂悢‚悤‚É‚µ‚Ü‚·
+ A do_final_clif()
+ I—¹Žž‚ɃZƒbƒVƒ‡ƒ“‚ð휂·‚é‚悤‚É‚µ‚½
+ C do_init_clif()
+ packet_db‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ I—¹Žž‚ɃZƒbƒVƒ‡ƒ“‚ð휂ł«‚é‚悤‚É make_listen_port() ‚Ì–ß‚è’l‚ð map_fd ‚É“ü‚ê‚é‚悤‚É‚µ‚½
+ C clif.h
+ A MAX_PACKET_DB
+ A struct packet_db
+ A clif_changestatus()
+ A clif_misceffect2()
+ A clif_callpartner()
+ A clif_sitting()
+ A clif_soundeffect()
+ A clif_item_repair_list()
+ A do_final_clif()
+ ’è‹`‚ð’ljÁ
+ C clif_class_change
+ clif_mob_class_change() ‚©‚ç•ÏX
+ C guild.c
+ C guild_read_castledb()
+ castle_event ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ C guild_skillup()
+ ˆø”‚ð•ÏX
+ flag=1 ‚ŃMƒ‹ƒhƒ|ƒCƒ“ƒg‚ðŽg—p‚µ‚È‚¢‚悤‚É‚µ‚½
+ C guild_broken()
+ ƒMƒ‹ƒh‰ðŽUŽž‚ÉŠ—LÔ‚ð”jŠü‚·‚邽‚ß‚Ì OnGuildBreak ƒCƒxƒ“ƒg‚ð’ljÁ
+ A guild_db_final()
+ A castle_db_final()
+ A guild_expcache_db_final()
+ A guild_infoevent_db_final()
+ A do_final_guild()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C guild.h
+ C guild_skillup()
+ ’è‹`‚ð•ÏX
+ A do_final_guild()
+ ’è‹`‚ð’ljÁ
+ C intif.c
+ atcommand.h ‚ðinclude
+ packet_len_table[] Šg’£
+ C intif_guild_skillup()
+ ˆø” flag ’ljÁ
+ A intif_charposreq()
+ ƒLƒƒƒ‰‚Ìꊗv‹ƒpƒPƒbƒg‚ð‘—M
+ flag=1 @jumpto
+ flag=0 @where
+ A intif_jumpto()
+ ‘¼map-server‚̃Lƒƒƒ‰‚É @jumpto o—ˆ‚é‚悤‚É‚µ‚½
+ A intif_where()
+ ‘¼map-server‚̃Lƒƒƒ‰‚É @where o—ˆ‚é‚悤‚É‚µ‚½
+ A intif_charmovereq()
+ ƒLƒƒƒ‰‚ðŒÄ‚ÑŠñ‚¹‚é
+ flag=1 @recall
+ flag=0 ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢
+ A intif_displaymessage()
+ ‘¼map-server‚̃Lƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—‚ê‚é‚悤‚É‚µ‚½
+ (Wis‚Å‚Í‚È‚­‚Ä‘—‚è‚Á‚Ï‚È‚µB@recall ¬Œ÷Žž—p)
+ C intif_parse_WisMessage()
+ Wis‹‘”Û‚Ì”»’è‚ð‚·‚é‚悤‚É‚µ‚½
+ A intif_parse_CharPosReq()
+ ƒLƒƒƒ‰‚̋ꊂðInter‚Ö•Ô“š
+ A intif_parse_CharPos()
+ ƒLƒƒƒ‰‚̋ꊂªInter‚©‚ç‘—‚ç‚ê‚Ä‚«‚½‚Ì‚Å
+ flag=1 ƒLƒƒƒ‰‚Ìꊂֈړ®(@jumpto)
+ flag=0 ƒLƒƒƒ‰‚Ìꊂð•\Ž¦(@where)
+ A intif_parse_CharMoveReq()
+ ƒLƒƒƒ‰‚ª‚¢‚½‚çŽw’èˆÊ’u‚Ɉړ®‚³‚¹‚é
+ flag=1 @recall ‚È‚Ì‚ÅGMƒŒƒxƒ‹‚ð”äŠrAƒƒbƒZ[ƒW‚ð•\Ž¦
+ A intif_parse_DisplayMessage()
+ Žw’èƒLƒƒƒ‰‚ɃƒbƒZ[ƒW‚ð‘—M
+ C intif_parse()
+ VƒpƒPƒbƒg‚ð’ljÁ
+ C intif.h
+ C intif_guild_skillup()
+ ’è‹`•ÏX
+ A intif_jumpto()
+ A intif_where()
+ A intif_charmovereq()
+ A intif_displaymessage()
+ ’è‹`‚̒ljÁ
+ C itemdb.c
+ A itemdb_isdropable()
+ ƒAƒCƒeƒ€‚ªŽÌ‚Ä‚ç‚ê‚é‚©‚Ç‚¤‚©‚Ì”»’è‚ð‚·‚é
+ A itemdb_read_cardillustnametable()
+ grfƒtƒ@ƒCƒ‹‚©‚ç num2cardillustnametable.txt ‚ð“Ç‚Ýž‚Þ
+ cutincard–½—ß‚ÅŽg—p
+ C do_init_itemdb()
+ itemdb_read_cardillustnametable() ‚ð’ljÁ
+ C itemdb.h
+ C struct item_data
+ char cardillustname[64] ’ljÁ
+ A itemdb_isdropable()
+ ’è‹`‚̒ljÁ
+ C Makefile
+ A malloc.o malloc.h ‚ð’ljÁ
+ C map.c
+ C struct charid2nick
+ @who‚Å‘¼map-server‚̃Lƒƒƒ‰‚à•\Ž¦‚Å‚«‚é‚悤‚É account_id ip port ‚ð’ljÁ
+ C map_freeblock()
+ C map_freeblock_unlock()
+ “ñdfree()‘Îô‚ÅNULL‚ð‘ã“ü‚·‚é‚悤‚É‚µ‚½
+ C map_delblock()
+ Œ©‚â‚·‚¢‚悤‚ÉŒJ‚è•Ô‚µŽg—p‚³‚ê‚é•Ï”‚ð‚Ü‚Æ‚ß‚½
+ C map_addchariddb()
+ charid2nick ‚ÌŠg’£‚É‚ ‚킹‚Ĉø”‚ð‘‚₵‚½
+ A map_delchariddb()
+ charid_db ‚©‚çƒLƒƒƒ‰‚ðíœ(ŽÀÛ‚É‚Íip port‚ð0‚É)‚·‚é
+ C map_quit()
+ Œ‹¥ó‘Ô’†‚̓ƒOƒAƒEƒg‚µ‚Ä‚à1ŽžŠÔ‚Íó‘Ô‚ª‘±‚­‚悤‚ÉPCƒOƒ[ƒoƒ‹•Ï” PC_WEDDING_TIME ‚ÉŠJŽnŽžŠÔ‚ð‹L˜^‚·‚é‚悤‚É‚µ‚½
+ C map_id2bl()
+ Œ©‚â‚·‚¢‚悤‚É‘‚«Š·‚¦
+ A map_eraseipport()
+ ‘¼map-serverŠÇ—‚̃}ƒbƒv‚ð map_db ‚©‚ç휂·‚é
+ A map_who_sub()
+ A map_who()
+ ‘¼map-server‚É‚¢‚éƒLƒƒƒ‰‚à @who ‚Å•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚½
+ •\Ž¦ãƒLƒƒƒ‰‚ªŽc‚邱‚Æ‚ª‚ ‚é‚Ì‚Í’²¸’†
+ A id_db_final()
+ A map_db_final()
+ A nick_db_final()
+ A charid_db_final()
+ C do_final()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É•ÏX
+ C map.h
+ A MAX_WIS_REFUSAL
+ Wis‹‘”ÛƒŠƒXƒg‚Ì•Û‘¶Å‘å’l
+ C struct map_session_data
+ C special_state
+ A unbreakable_weapon
+ •Ší‚ªâ‘΂ɉó‚ê‚È‚¢
+ A unbreakable_armor
+ ŠZ‚ªâ‘΂ɉó‚ê‚È‚¢
+ A opt3
+ ‰æ–ÊŠO‚©‚ç“ü‚Á‚Ä‚«‚½ƒLƒƒƒ‰‚Ìó‘Ô
+ A areanpc_id
+ OnTouchƒCƒxƒ“ƒg‚ðŽÀs‚µ‚½NPC‚ÌID
+ A wis_refusal[][]
+ Wis‹‘”ÛƒŠƒXƒg
+ A wis_all
+ Wis‘S‹‘”Ûƒtƒ‰ƒO
+ A break_weapon_rate
+ •Ší”j‰ó—¦
+ A break_armor_rate
+ ŠZ”j‰ó—¦
+ A add_steal_rate
+ ’ljÁƒXƒeƒB[ƒ‹—¦
+ C struct npc_data
+ A opt1,opt2,opt3,option
+ PC‚Æ“¯‚¶
+ C u.scr
+ A src_id
+ I—¹Žž‚̃ƒ‚ƒŠŠJ•ú—p
+ C struct mob_data
+ A opt3
+ PC‚Æ“¯‚¶
+ A guild_id
+ ƒK[ƒfƒBƒAƒ“‚È‚Ç‚ÅŽg—p
+ D exclusion_*
+ ŠÖ˜AŠÖ”‚ðÁ‚µ‚½‚Ì‚Å휂µ‚½
+ C struct map_data
+ C flag
+ A notrade
+ Žæˆø‹ÖŽ~ƒ}ƒbƒvƒtƒ‰ƒO
+ A noskill
+ ƒXƒLƒ‹Žg—p‹ÖŽ~ƒ}ƒbƒvƒtƒ‰ƒO
+ ’蔂̒ljÁ
+ SP_PARTNER SP_CART
+ SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE
+ SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR
+ D talkie_mes[]
+ ’è‹`íœ
+ C map_addchariddb()
+ ’è‹`•ÏX
+ A map_delchariddb()
+ A map_eraseipport()
+ A map_who()
+ ’è‹`’ljÁ
+ C mob.c
+ D mob_exclusion_add()
+ D mob_exclusion_check()
+ ˆÓ–¡‚ª‚ ‚éŽg—p‚ð‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Æbattle_check_target()‚Å‘ã—p‚Å‚«‚é‚Ì‚Å휂µ‚½
+ C mob_stop_walking()
+ type&4‚Å–Ú“I‚Ìꊂ܂ŋ——£‚ª‚ ‚ê‚Î1•ài‚ñ‚ÅŽ~‚Ü‚é‚悤‚É‚µ‚½
+ C mob_attack()
+ Mob‚ªMob‚ðUŒ‚‚Å‚«‚é‚悤‚É‚µ‚½
+ C mob_target()
+ C mob_ai_sub_hard_slavemob()
+ mob_exclusion_check()‚ðíœ
+ C mob_ai_sub_hard_activesearch()
+ C mob_ai_sub_hard()
+ special_mob_ai‚ÈꇂÍMob‚àõ“G‚·‚é‚悤‚É‚µ‚½
+ ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚ª–Ú•W‚̃AƒCƒeƒ€‚ðŒ©Ž¸‚Á‚½Žž‚Í–Ú“I‚ÌêŠ‚Ü‚Å•à‚©‚È‚¢‚悤‚É‚µ‚½
+ C mob_damage()
+ ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ꂽŽž‚ÉŽ©”š‚µ‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚½
+ ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ê‚ÄŽ©”š‚·‚鎞‚Ɉړ®‚·‚é‚悤‚É‚µ‚½
+ src‚ªMob‚ÌŽž‚Ísrc‚̃^[ƒQƒbƒg‚ðŠO‚·‚悤‚É‚µ‚½
+ C mob_skillid2skillidx()
+ ƒCƒ“ƒfƒbƒNƒX‚ª0‚©‚çŽn‚Ü‚é‚̂ɃGƒ‰[‚à0‚ð•Ô‚·‚µ‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½
+ ƒXƒtƒBƒAƒ}ƒCƒ“‚ª‰£‚ç‚ê‚Ä‚àŽ©”š‚µ‚È‚¢Œ´ˆö‚Í‚±‚ê
+ C mobskill_use()
+ Ž©”šó‘Ԃł̓XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ C mob_spawn()
+ ƒK[ƒfƒBƒAƒ“‚ƃGƒ“ƒyƒŠƒEƒ€‚ªÔ‚Å”­¶‚µ‚½ê‡‚Í guild_id ‚ðÝ’è
+ opt3 ‚ð 0 ‚ʼnŠú‰»
+ C mob_can_reach()
+ GvGˆÈŠO‚ł̓K[ƒfƒBƒAƒ“‚͉½‚à‚µ‚È‚¢‚悤‚É‚µ‚½
+ C mob_catch_delete()
+ Mob‚ªÁ‚¦‚é‚Æ‚«‚̃GƒtƒFƒNƒg‚ð type ‚ÅŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
+ C mob_timer_delete()
+ ƒXƒtƒBƒAƒ}ƒCƒ“‚ƃoƒCƒIƒvƒ‰ƒ“ƒg‚ªÁ‚¦‚é‚Æ‚«‚̓eƒŒƒ|ƒGƒtƒFƒNƒg‚ÅÁ‚¦‚é‚悤‚É‚µ‚½
+ C mob_deleteslave_sub()
+ nullƒ`ƒFƒbƒN‘O‚É‘ã“ü‚µ‚Ä‚¢‚é•”•ª‚ðC³
+ C mob_class_change()
+ clif_class_change() ‚Ì•ÏX‚ɑΉž
+ C mob.h
+ C mob_catch_delete()
+ ’è‹`•ÏX
+ D mob_exclusion_add()
+ D mob_exclusion_check()
+ ’è‹`íœ
+ C npc.c
+ C struct npc_src_list
+ A prev
+ I—¹Žž‚̃ƒ‚ƒŠŠJ•ú—p‚ɒljÁ
+ C npc_checknear()
+ ƒCƒxƒ“ƒgPC‚ÌꇂÉí‚ÉOK‚ð•Ô‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
+ A npc_enable_sub()
+ npc_enable() ‚©‚çŒÄ‚΂ê‚ÄŽüˆÍ‚ÌPC‚ÉOnTouchƒCƒxƒ“ƒg‚ðŽÀs‚·‚é
+ C npc_enable()
+ flag ‚É‚æ‚é‹““®‚ð’ljÁ
+ flag=2 NPC‚ÌHideó‘Ô‚ð‰ðœ‚·‚é
+ flag=4 NPC‚ðHideó‘Ô‚É‚·‚é
+ Hide‚µ‚Ä‚¢‚éNPC‚Í–³Œø‚É‚È‚è‚Ü‚·
+ —LŒø‚É‚µ‚½Žž‚É npc_enable_sub() ‚ðŒÄ‚Ԃ悤‚É‚µ‚½
+ C npc_event()
+ ƒGƒ‰[Žž‚Í1‚ð•Ô‚·‚悤‚É•ÏX
+ OnTouchƒCƒxƒ“ƒg‚©‚çŒÄ‚΂ꂽ‚Æ‚«‚̓Cƒxƒ“ƒg‚ªŒ©‚‚©‚ç‚È‚¢ƒGƒ‰[‚ð•Ô‚³‚È‚¢‚悤‚É‚µ‚½
+ C npc_touch_areanpc()
+ PC‚ªƒGƒŠƒA“à‚ð’Ê‚Á‚½Žž‚ɉ½“x‚àŽÀs‚³‚ê‚é‚Ì‚ðC³
+ NPC‚ÉOnTouchƒCƒxƒ“ƒg‚ª‚ ‚Á‚½ê‡‚É‚ÍŽÀs‚·‚é‚悤‚É‚µ‚½
+ ŒÝŠ·«‚ð•Û‚‚½‚ß‚ÉOnTouchƒCƒxƒ“ƒg‚ª–³‚¢ê‡‚Í¡‚Ü‚Å‚Æ“¯‚¶‚悤‚É“®‚«‚Ü‚·
+ C npc_parse_warp()
+ option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
+ C npc_parse_warp()
+ C npc_parse_shop()
+ ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
+ option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
+ C npc_convertlabel_db()
+ ƒƒ‚ƒŠŠm•ÛŒã‚Énull‚©‚Ç‚¤‚©Šm”F‚µ‚Ä‚¢‚È‚¢‚Ì‚ðC³
+ C npc_parse_script()
+ bad duplicate name!ƒGƒ‰[•\Ž¦‚ª‰üs‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
+ I—¹Žžƒƒ‚ƒŠŠJ•ú—p‚Éduplicate‚Å src_id ‚ð‘}“ü
+ ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
+ option,opt1,opt2,opt3 ‚ð 0 ‚ʼnŠú‰»
+ C npc_parse_mob()
+ memwatch‘Îô‚Ńƒ‚ƒŠ‚ðˆêŠ‡Šm•Û‚µ‚È‚¢‚悤‚É‚µ‚½
+ ƒ‚ƒ“ƒXƒ^[–¼‚É --ja-- --en-- ‚ðŽw’è‚·‚é‚Æmob_db‚Ì–¼‘O‚ðŽg‚¤‚悤‚É‚µ‚½
+ ID‚ðnpc_get_new_npc_id()‚Ŏ擾‚·‚é‚悤‚É‚µ‚½
+ C npc_parse_mapflag()
+ notrade noskill ‚ð“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ A ev_db_final()
+ A npcname_db_final()
+ A do_final_npc()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C do_init_npc()
+ ƒƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C npc.h
+ A do_final_npc()
+ ’è‹`‚̒ljÁ
+ C party.c
+ A party_db_final()
+ A do_final_party()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C party.h
+ A do_final_party()
+ ’è‹`‚̒ljÁ
+ C pc.c
+ A pc_numisGM()
+ account_id‚ÅGM‚©‚Ç‚¤‚©”»’f‚·‚é
+ A pc_isquitable()
+ PC‚ªI—¹‚Å‚«‚éó‘Ô‚É‚ ‚é‚©‚Ç‚¤‚©”»’f‚·‚é
+ 1‚ð•Ô‚·‚Æ‚«‚ÍI—¹‚Å‚«‚È‚¢
+ C pc_counttargeted_sub()
+ Mobó‘Ô‚É‚æ‚Á‚Ä’l‚𳂵‚­•Ô‚³‚È‚¢‚悤‚È‹C‚ª‚·‚é‚Ì‚ÅðŒ‚ð‰¼•ÏX
+ C pc_makesavestatus()
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª³”‚Ìê‡‚Í 0 ‚É‚·‚é
+ C pc_authok()
+ wis_all ‚ð 0 ‚ʼnŠú‰»
+ map_addchariddb() ‚Ì•ÏX‚ɑΉž‚Æí‚ÉŽÀs‚·‚é‚悤‚É‚µ‚½
+ C pc_calcstatus()
+ break_weapon_rate break_armor_rate add_steal_rate ‚ð 0 ‚ʼnŠú‰»
+ Œ‹¥ó‘Ô‚Å‚Í•à‚­‘¬“x‚ª”¼•ª‚É‚È‚é‚悤‚É‚µ‚½
+ C pc_bonus()
+ SP_UNBREAKABLE_WEAPON SP_UNBREAKABLE_ARMOR SP_BREAK_WEAPON_RATE SP_BREAK_ARMOR_RATE SP_ADD_STEAL_RATE
+ ˆ—‚ð’ljÁ
+ C pc_dropitem()
+ ƒAƒCƒeƒ€‚ðŽÌ‚Ä‚ç‚ê‚é‚©‚Ç‚¤‚©”»’è‚·‚é‚悤‚É‚µ‚½
+ C pc_putitemtocart()
+ ƒAƒCƒeƒ€‚ðƒJ[ƒg‚Ɉړ®‚Å‚«‚é‚©”»’è‚·‚é‚悤‚É‚µ‚½
+ C pc_steal_item()
+ ƒXƒeƒB[ƒ‹—¦‚É add_steal_rate ‚ð‰ÁŽZ‚·‚é‚悤‚É‚µ‚½
+ C pc_walk()
+ C pc_movepos()
+ ”͈ÍNPC‚ª‚¢‚È‚¢‚Æ‚«‚É‚Í areanpc_id=0 ‚É‚µ‚½
+ C pc_checkbaselevelup()
+ ƒXƒpƒmƒr‚ªƒŒƒxƒ‹ƒAƒbƒv‚µ‚½Žž‚É‚©‚©‚éƒXƒLƒ‹‚̃Œƒxƒ‹‚ð–{ŽI‚É‚ ‚킹‚½
+ C pc_skillup()
+ guild_skillup() ‚Ì•ÏX‚ɑΉž
+ C pc_damage()
+ ƒXƒpƒmƒr‚ªExp99%‚ÅHP‚ª0‚É‚È‚é‚ÆHP‚ª‰ñ•œ‚µ‚Ä‹à„ó‘Ô‚É‚È‚é‚悤‚É‚µ‚½
+ C pc_readparam()
+ nullƒ`ƒFƒbƒN‘O‚Ésd‚ðŽg‚Á‚Ä‚¢‚½‚Ì‚ðC³
+ A SP_PARTNER
+ Œ‹¥‘ŠŽè‚Ìchar_id
+ A SP_CART
+ ƒJ[ƒg‚ðˆø‚¢‚Ä‚¢‚éꇂÍ0ˆÈオ•Ô‚é
+ C pc_jobchange()
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ª•‰”‚ÌꇂÍÔƒGƒ‚•\Ž¦‚·‚é‚悤‚É‚µ‚½
+ A pc_break_weapon()
+ •Ší”j‰ó‚ð‚·‚é
+ A pc_break_armor()
+ ŠZ”j‰ó‚ð‚·‚é
+ C pc_natural_heal_sp()
+ ƒXƒpƒmƒr‚Í”š—ôó‘Ô‚Å‚àSP‚ªŽ©‘R‰ñ•œ‚·‚é‚悤‚É‚µ‚½
+ A gm_account_db_final()
+ A do_final_pc()
+ I—¹Žž‚Ƀƒ‚ƒŠŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C pc.h
+ A pc_numisGM()
+ A pc_isquitable()
+ A pc_break_weapon()
+ A pc_break_armor()
+ A do_final_pc()
+ ’è‹`’ljÁ
+ C pet.c
+ C pet_data_init()
+ C pet_lootitem_drop()
+ ƒƒ‚ƒŠŠm•Û‚Å‚«‚½‚©‚Ç‚¤‚©Šm”F‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ÅC³
+ C pet_catch_process2()
+ mob_catch_delete() ‚Ì•ÏX‚ɑΉž
+ C script.c
+ ’ljÁ‚µ‚½ŠÖ”‚̃vƒƒgƒ^ƒCƒv‚ð擪‚ɒljÁ
+ buildin_func[]‚ɒljÁ‚µ‚½–½—ß‚âŠÖ”‚ð’ljÁ
+ ‰‰ŽZŽq‚É C_R_SHIFT C_L_SHIFT ‚ð’ljÁ
+ C parse_subexpr()
+ ‰‰ŽZŽq >> << ’ljÁ
+ C get_val()
+ PCŽå‘Ì‚Ì•Ï”‚ÅPC‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚çƒGƒ‰[‚ðo‚·‚悤‚É‚µ‚½
+ PCŽå‘Ì‚Ì•Ï”‚Åsd=NULL‚¾‚Á‚½ê‡‚É‚Ípc_read*‚Ŏ擾‚És‚©‚È‚¢‚悤‚É‚µ‚½
+ A buildin_close2()
+ ƒXƒNƒŠƒvƒg‚ð’†’f‚µ‚ÄCloseƒ{ƒ^ƒ“‚ð•\Ž¦‚µ‚Ü‚·
+ C buildin_areawarp_sub()
+ Random‚¾‚¯‚Å‚È‚­SavePoint‚É‚à”ò‚΂¹‚é‚悤‚É‚µ‚½
+ A buildin_cutincard()
+ ƒJ[ƒh‚̃AƒCƒeƒ€ID‚ðŽw’è‚·‚邱‚ƂŃJ[ƒh‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
+ C buildin_getitem()
+ ˆø”‚ð•ÏX‚µ‚ĊӒ肵‚½ó‘Ô‚Å“n‚·‚©‚Ç‚¤‚©‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
+ account_id‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ɃAƒCƒeƒ€‚ð“n‚¹‚é‚悤‚É‚µ‚½(Œ‹¥—pŠg’£)
+ C buildin_getitem2()
+ account_id‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ɃAƒCƒeƒ€‚ð“n‚¹‚é‚悤‚É‚µ‚½(Œ‹¥—pŠg’£)
+ C buildin_readparam()
+ ƒLƒƒƒ‰–¼‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚̃pƒ‰ƒ[ƒ^‚ð“Ç‚ÝŽæ‚ê‚é‚悤‚É‚µ‚½
+ C buildin_getcharid()
+ ƒLƒƒƒ‰–¼‚ðŽw’è‚·‚邱‚Æ‚ÅA‚»‚ÌPC‚ÌŠÖŒWID‚ðŽæ“¾‚Å‚«‚é‚悤‚É‚µ‚½
+ A buildin_getpartymember()
+ Žw’èID‚̃p[ƒeƒBl”‚̎擾‚ƃp[ƒeƒB[ƒƒ“ƒo[‚ÌID‚ð”z—ñ‚Ŏ擾‚Å‚«‚Ü‚·
+ A buildin_guildskill()
+ ƒMƒ‹ƒhƒXƒLƒ‹‚ðŠo‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·
+ C buildin_getgdskilllv()
+ ƒMƒ‹ƒhƒXƒLƒ‹ID‚ðGD_APPROVAL‚̂悤‚ȃXƒLƒ‹–¼‚ÅŽw’è‚·‚é‚悤‚É‚µ‚½
+ A buildin_hideoffnpc()
+ Hideó‘Ô‚ÌNPC‚ð•\Ž¦‚·‚é
+ A buildin_hideonnpc()
+ NPC‚ðHideó‘Ô‚É‚·‚é
+ C buildin_sc_start()
+ IDŽw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚Å‚«‚é‚悤‚É‚µ‚½
+ A buildin_sc_start2()
+ Šm—¦Žw’è‚ŃLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚Å‚«‚Ü‚·(ƒAƒCƒXA‚¨‚à‚¿“™‚ÅŽg—p)
+ A buildin_getscrate()
+ ó‘ÔˆÙí‘Ï«‚ðŒvŽZ‚µ‚½Šm—¦‚ð•Ô‚·
+ C buildin_changebase()
+ ID‚ÅŽw’肵‚½ƒLƒƒƒ‰‚ÌŒ©‚½–Ú‚ð•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚½
+ C buildin_waitingroom()
+ limit=0‚ÌŽž‚Í(1/10)‚ð•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
+ C buildin_setmapflag()
+ MF_NOTRADE MF_NOSKILL ‚ð’ljÁ
+ C buildin_flagemblem()
+ NPC‚ª“Á’è‚Å‚«‚È‚©‚Á‚½‚Æ‚«‚Émap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
+ A buildin_getinventorylist()
+ ”z—ñ‚ÅŠŽ•i‚ð•Ô‚µ‚Ü‚·
+ A buildin_getskilllist()
+ ”z—ñ‚ÅŠ—LƒXƒLƒ‹‚ð•Ô‚µ‚Ü‚·
+ A buildin_clearitem()
+ ŠŽƒAƒCƒeƒ€‚ð휂µ‚Ü‚·
+ A buildin_getrepairableitemcount()
+ ‰ó‚ê‚Ä‚¢‚éƒAƒCƒeƒ€‚𔂦‚Ü‚·
+ A buildin_repairitem()
+ ‰ó‚ê‚Ä‚¢‚éƒAƒCƒeƒ€‚ð‚·‚×‚ÄC—‚µ‚Ü‚·
+ A buildin_classchange()
+ NPC‚ðƒNƒ‰ƒXƒ`ƒFƒ“ƒW‚µ‚Ü‚·
+ A buildin_misceffect()
+ ƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·
+ A buildin_soundeffect()
+ Žw’肵‚½SE‚ð–‚炵‚Ü‚·
+ C op_2num()
+ C run_script_main()
+ ƒVƒtƒg‰‰ŽZŽq‚ð’ljÁ
+ A mapreg_db_final()
+ A mapregstr_db_final()
+ A scriptlabel_db_final()
+ A userfunc_db_final()
+ C do_final_script()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C skill.c
+ <timer.h> intif.h ‚ðinclude
+ ƒRƒƒ“ƒg‚̃XƒLƒ‹–¼‚ðjROŽd—l‚É‘‚«Š·‚¦
+ C SkillStatusChangeTable[]
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ ƒOƒ‰ƒtƒBƒeƒB Ž©”š Ž©”š2 ‚ð’ljÁ
+ C skill_additional_effect()
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[’ljÁ
+ ƒAƒ“ƒNƒ‹ƒXƒlƒA‚ðíœ
+ C skill_attack()
+ ƒ`ƒƒƒbƒg’†‚ɃXƒLƒ‹‚ª‰e‹¿‚µ‚È‚¢‚悤‚É‚µ‚½(ƒ`ƒƒƒbƒgƒLƒƒƒ“ƒZƒ‹)
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ÍSkillLv=-1‚Åclif_skill_damage()‚·‚é‚悤‚É‚µ‚½
+ Ž©”š‚̓_ƒ[ƒW•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚½
+ C skill_castend_damage_id()
+ ƒAƒVƒbƒhƒeƒ‰[‚Å•Ší”j‰ó‚ð‚·‚é‚悤‚É‚µ‚½
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ª3*3‚͈̔ÍUŒ‚‚ð‚·‚é‚悤‚É‚µ‚½
+ Ž©”š‚̈—‚ð•ÏX‚µ‚½
+ C skill_castend_nodamage_id()
+ sd‚Ædstsd‚ÅPC‚©‚Ç‚¤‚©‚ð”»’è‚·‚é‚悤‚É‚µ‚½
+ ƒXƒpƒmƒr‚̉łªƒq[ƒ‹‚ðŽg‚¤‚Ɖñ•œ—Ê‚ª2”{‚É‚È‚é‚悤‚É‚µ‚½
+ clif_sitting()‚Ì•ÏX‚ɑΉž
+ •ŠíC—‚̓pƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚̂ŃRƒƒ“ƒgƒAƒEƒg
+ ƒXƒgƒŠƒbƒv`AƒPƒ~ƒJƒ‹`‚ðƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÉŽg—p‚µ‚½ê‡Amap-server‚ª—Ž‚¿‚é–â‘è‚ðC³
+ ŒN‚¾‚¯‚ÍŒì‚é‚æA‚ ‚È‚½‚ׂ̈ɋ]µ‚É‚È‚è‚Ü‚·‚ÌŒvŽZ‚ðMAX_HP‚Ü‚½‚ÍMAX_SP‚©‚ç‚·‚é‚悤‚É‚µ‚½
+ ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ ‚ð‘ŠŽè‚Ì–¼‘O‚ð‹©‚ÔA•¡”Ý’u‚Å‚«‚È‚¢“™A–{ŽI•—‚É‚µ‚½
+ ƒAƒ“ƒNƒ‹ƒXƒlƒA‚ÅPC‚ªˆø‚Á‚©‚©‚Á‚Ä‚¢‚鎞‚ɃŠƒ€[ƒuƒgƒ‰ƒbƒv‚µ‚Ä‚àPC‚ª“®‚¯‚é‚悤‚É‚È‚ç‚È‚©‚Á‚½‚Ì‚ðC³
+ ƒAƒ“ƒR[ƒ‹‚ð‹©‚Ô‚æ‚¤‚É‚µ‚½
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ðŽÀ‘•‚µ‚½
+ Ž©”š‚ÅŽ©”šó‘Ô‚ðŠJŽn‚·‚é‚悤‚É‚µ‚½
+ C skill_castend_pos2()
+ ƒoƒCƒIƒvƒ‰ƒ“ƒgAƒXƒtƒBƒAƒ}ƒCƒ“
+ ƒpƒPƒbƒg‡”Ô‚ð•ÏX
+ Žw’肵‚½êŠ‚ÉÝ’u‚·‚é‚悤‚É‚µ‚½
+ Œø‰ÊŽžŠÔ‚ðskill_cast_db.txt‚ÅŽw’è‚·‚é‚悤‚É‚µ‚½
+ mob_exclusion_add()‚ðíœ
+ ƒOƒ‰ƒtƒBƒeƒB‚ðŽÀ‘•A1ŒÂ‚µ‚©’u‚¯‚Ü‚¹‚ñ
+ C skill_castend_map()
+ ƒ[ƒvƒ|[ƒ^ƒ‹‚ÍŽÀÛ‚ÌÝ’uŽž‚Ƀuƒ‹[ƒWƒFƒ€ƒXƒg[ƒ“‚ðÁ”ï‚·‚é‚悤‚É‚µ‚½
+ C skill_unitsetting()
+ ƒOƒ‰ƒtƒBƒeƒB‚̃XƒLƒ‹ƒ†ƒjƒbƒg‚ð1ŒÂ‚ÉC³
+ ƒg[ƒL[ƒ{ƒbƒNƒXAƒOƒ‰ƒtƒBƒeƒB‚Ì•¶Žš—ñ‚Í sd->message ‚ÉŠi”[‚·‚é‚悤‚É‚µ‚½
+ C skill_unit_onplace()
+ ƒ`ƒƒƒbƒgŽž‚̓XƒLƒ‹ƒ†ƒjƒbƒg‚ª“®ì‚µ‚È‚¢‚悤‚É‚µ‚½(ƒ`ƒƒƒbƒgƒLƒƒƒ“ƒZƒ‹)
+ ƒAƒ“ƒNƒ‹ƒXƒlƒA‚É‚©‚©‚鈗‚ðskill_additional_effect()‚©‚çˆÚ“®
+ ƒ[ƒvƒ|[ƒ^ƒ‹‚ÉpŽÒ‚ªæ‚Á‚½‚çÁ‚¦‚é‚悤‚É‚µ‚½
+ ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚É‚æ‚é•Ší”j‰ó‚ð‚·‚é‚悤‚É‚µ‚½
+ ƒAƒ“ƒNƒ‹ƒXƒlƒAAƒXƒpƒCƒ_[ƒEƒFƒbƒu‚Ńƒ‚ƒŠƒAƒNƒZƒXˆá”½‚ª‹N‚«‚é‰Â”\«‚ª‚ ‚Á‚½‚Ì‚ðC³
+ C skill_unit_onout()
+ ƒAƒ“ƒNƒ‹ƒXƒlƒA‚Åu}v‚ª‘«‚è‚È‚©‚Á‚½‚½‚ß‚É‹ß‚­‚ð’Ê‚è‚©‚©‚Á‚½‚¾‚¯‚Å1•bŒãã©‚É–ß‚Á‚Ä‚µ‚Ü‚Á‚½‚Ì‚ðC³
+ C skill_unit_onlimit()
+ ƒ[ƒvƒ|[ƒ^ƒ‹”­“®‘O‚̈—‚ðíœ
+ ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ð‘¼map-server‚É‚¢‚Ä‚àŒÄ‚ׂé‚悤‚É‚µ‚½
+ A skill_check_condition_mob_master_sub()
+ ƒ}ƒbƒv“à‚Å“¯‚¶PC‚©‚ço‚½ƒoƒCƒIƒvƒ‰ƒ“ƒg‚âƒXƒtƒBƒAƒ}ƒCƒ“‚Ì”‚𔂦‚é
+ C skill_check_condition()
+ hp_rate‚Æsp_rate‚É•‰”‚ðŽw’è‚·‚é‚ÆÁ”ïŒvŽZ‚ðMax’l‚©‚ç‚·‚é‚悤‚É‚µ‚½
+ ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢‚ðŒ‹¥‚µ‚Ä‚¢‚È‚¢ó‘Ô‚ÅŽg‚Á‚½‚çŽg—pŽ¸”s‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½
+ ƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒAƒ}ƒCƒ“‚ÌÝ’u”‚ðskill_cast_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
+ ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚Ì”§ŒÀ‚ð skill_use_pos() ‚©‚çˆÚ“®
+ C skill_use_id()
+ ƒoƒWƒŠƒJ‚ðGvG‚Å‚ÍŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Í‘ÎÛ‚ª“Åó‘Ô‚Å‚È‚¯‚ê‚ÎŽg—pŽ¸”s
+ C skill_use_pos()
+ ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚Ì”§ŒÀ‚ð skill_check_condition() ‚Ɉړ®
+ C skill_status_change_end()
+ opt3‚̈—‚ð’ljÁ
+ Œ‹¥ó‘Ô‚ÌI—¹‚ð’ljÁ
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚ð’ljÁ
+ Ž©”š‚ð’ljÁ
+ C skill_status_change_timer()
+ Œ‹¥ó‘Ô‚ÆÔƒGƒ‚ó‘Ԃ̃^ƒCƒ}[ÄÝ’è‚ð’ljÁ
+ Ž©”šó‘Ô‚Å‚Í1•b‚²‚Æ‚É‘¬“x‚ª•Ï‰»‚·‚é‚悤‚É‚µ‚½
+ C skill_status_change_start()
+ opt3‚̈—‚ð’ljÁ
+ ƒOƒ‰ƒtƒBƒeƒB‚͒ljÁ‚Å’u‚¢‚½‚ç‘O‚Ì‚ÍÁ‚¦‚é‚悤‚É‚µ‚½
+ Œ‹¥ó‘Ô‚ÆÔƒGƒ‚ó‘Ô‚ð’ljÁ
+ ƒOƒ‰ƒtƒBƒeƒB‚Íó‘ÔˆÙíŠJŽnŽž‚ɃXƒLƒ‹ƒ†ƒjƒbƒg‚ðÝ’u‚·‚é‚悤‚É‚µ‚½
+ ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[‚Í“Á‚ɉ½‚à’ljÁ‚Í‚È‚µ
+ Ž©”š‚͉r¥ƒpƒPƒbƒg‚ð‚±‚±‚Å‘—‚é‚悤‚É‚µ‚½
+ C skill_status_change_clear()
+ opt3‚̈—‚ð’ljÁ
+ C skill_unit_timer_sub()
+ ƒ[ƒvƒ|[ƒ^ƒ‹”­“®‘O‚ªŽžŠÔØ‚ê‚É‚È‚é‚Æ‚«‚ÉŒ©‚½–Ú‚ð•ÏX‚µ‚Ä–{ŽI‚̂悤‚ÉŒø‰Ê‰¹‚ªo‚é‚悤‚É‚µ‚½
+ ƒuƒ‰ƒXƒgƒ}ƒCƒ“ˆÈŠO‚Ìã©‚ÍŽžŠÔØ‚ê‚Åã©‚É–ß‚é‚悤‚É‚µ‚½
+ C skill.h
+ ó‘ÔˆÙí‚ɃXƒLƒ‹–¼‚ð‚¢‚­‚‚©‚‚¯‚½‚èAV‹K‚Ìó‘ÔˆÙí‚ð‘‚₵‚½
+ C storage.c
+ A storage_db_final()
+ A guild_storage_db_final()
+ C do_final_storage()
+ I—¹Žž‚Ƀƒ‚ƒŠ‚ðŠJ•ú‚·‚é‚悤‚É‚µ‚½
+ C trade.c
+ C trade_tradeadditem()
+ C trade_tradecommit()
+ itemdb_isdropable()‚ÅŒðŠ·‚Å‚«‚È‚¢ƒAƒCƒeƒ€‚ð”»’è‚·‚é‚悤‚É‚µ‚½
+ C vending.c
+ vending_purchasereq()
+ ‹àŠzŒvŽZ‚ðdouble‚Å‚·‚é‚悤‚É‚µ‚Äint‚ÅŒ…‚ ‚ӂꂵ‚È‚¢‚悤‚É‚µ‚½
+
+--------------------
+//1045 by TEILU
+
+EƒXƒeƒB[ƒ‹AƒXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌŽ¸”sƒƒbƒZ[ƒW‚ª
+ ƒŒƒxƒ‹‚ª‚P`‚X‚ÌŽž‚É•Ï‚¾‚Á‚½‚Ì‚ÅC³B
+ (map/)
+ skill.c
+
+E¸˜B‚̉”ۂðî•ñƒTƒCƒg‚ðŒ³‚É‚c‚a‚ÉÝ’èBi“ª‘•”õ‚Írusi‚³‚ñ쬕ª‚ðŽg—pj
+ (db/)
+ item_db.txt
+
+Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚ª§ŒÀ”‚ð’´‚¦‚½‚Æ‚«‚ɃXƒLƒ‹Žg—pŽ¸”s‚ª
+ o‚éƒ^ƒCƒ~ƒ“ƒO‚ð•ÏXB
+ (map/)
+ skill.c
+
+EƒAƒuƒ‰ƒJƒ^ƒuƒ‰ê—pƒXƒLƒ‹‚ðgm_all_skillݒ莞‚É•\Ž¦‚Å‚«‚é‚悤‚É•ÏXB
+ battle_athena.conf‚Ìgm_all_skill_add_abra‚Éyes‚ðÝ’è‚·‚ê‚Î
+ ƒXƒLƒ‹ƒŠƒXƒg‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚·B
+ (conf/)
+ battle_athena.conf
+ (db/)
+ skill_require_db.txt
+ (map/)
+ battle.c
+ battle.h
+ pc.c
+
+--------------------
+//1044 by TEILU
+
+E1042‚Å@itemidentify‚ÌŒ ŒÀ‚ÌÝ’è‚ð–Y‚ê‚Ä‚¢‚½‚̂ŒljÁB
+ (conf/)
+ atcommand_athena.conf
+
+EƒXƒeƒB[ƒ‹AƒXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌŽ¸”sŽž‚É
+ Ž¸”sƒƒbƒZ[ƒW‚ð•\Ž¦‚·‚é‚悤‚É•ÏXB
+ (map/)
+ skill.c
+
+EƒAƒCƒeƒ€‚c‚a‚ɸ˜B‰Â”Ûƒtƒ‰ƒO‚̃Jƒ‰ƒ€‚ð’ljÁ
+ ¸˜B‚̉”ۂð‚c‚a‚ðŽQÆ‚·‚é‚悤‚ÉC³
+ ¦‚Æ‚è‚ ‚¦‚¸’†’iA‰º’iA’†‰º’i‚Ì“ª‘•”õ‚ƃAƒNƒZƒTƒŠˆÈŠO‚Ì
+ ‘•”õ•i‚Í‚·‚ׂĸ˜B‰Â‚ÌÝ’è‚Å‚c‚a‚ðì‚è‚Ü‚µ‚½B
+ ‚c‚a‚ÍC³‚ª•K—v‚É‚È‚è‚Ü‚·B
+ (db/)
+ item_db.txt
+ (map/)
+ itemdb.c
+ itemdb.h
+ script.c
+
+--------------------
+//1043 by dusk
+EdocƒtƒHƒ‹ƒ_EconfƒtƒHƒ‹ƒ_“à‚Ìhelp.txt‚É1042(TEILU‚³‚ñ)‚Ìà–¾’ljÁ
+ @itemidentify‚Ìà–¾‚Í‚V‚Qs–Ú‚Ì@itemreset‚̉º‚ÉB
+
+EValkyrie Realms 5 (‰Eã)‚ÌŠø‚ÌC³
+ Valkyrie Realms 5 (‰Eã)‚ÌŠø‚ðŒ©‚é‚Æ–¢Žæ“¾ó‘ÔƒRƒƒ“ƒg‚΂Á‚©‚èo‚Ä‚¢‚½‚Ì‚ð
+ ‚¿‚á‚ñ‚ÆŠm”F‚Å‚«‚é‚悤‚ÉB
+ ¦ Valkyrie Realms‚ÌŠeÔ‚É–ß‚éŠø‚Ƃ͈Ⴂ‚Ü‚·B
+ prtg_cas05.txt“à‚̃Mƒ‹ƒhƒ_ƒ“ƒWƒ‡ƒ“‚É“ü‚郌ƒo[ˆÈŠO‚Ì
+ getcastledata "prtg_cas05.gat",1,@GIDp5;‚ð
+ set @GIDp5,getcastledata("prtg_cas05.gat",1);‚ÉC³B
+
+--------------------
+//1042 by TEILU
+
+E@healƒRƒ}ƒ“ƒh‚ɉ½‚à“n‚³‚È‚¢‚ÆŠ®‘S‰ñ•œ‚·‚é‚悤‚É•ÏXB
+ (map/)
+ atcommand.c
+
+E@itemitemidentifyƒRƒ}ƒ“ƒh‚̒ljÁ
+ –¢ŠÓ’è‚ÌŠŽƒAƒCƒeƒ€‚ð‘S‚ĊӒ肵‚Ü‚·B
+ (conf/)
+ msg_athena.conf
+ (map/)
+ atcommand.c
+ atcommand.h
+
+--------------------
+//1041 by mare
+ FIX NPC Script Command - buildin_getgdskilllv()
+ Add NPC Sctipt Command - buildin_agitcheck()
+ (script/npc/job/)
+ npc_job_wizard.txt
+ ƒ‰ƒEƒŒƒ‹‚³‚ñ‚̑䎌Aƒmƒr‚ƃvƒŠ‚Ìꇂ̕ª’ljÁ
+-------------------
+//1040 by ŒÓ’±—–
+
+EƒT[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒg•\’ljÁ
+ (doc/)
+ serverlink_packet.txt
+ inter<->map ˆÈŠO‚̃T[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒg•\
+
+EŽd—lƒXƒŒ‚Ì Login_ID2 ŠÖŒW‚Å‚²‚ɂ傲‚É‚å
+EƒT[ƒo[ŠÔÚ‘±‚̃pƒPƒbƒgˆê•”•ÏX
+ (login/)
+ login.c
+ auth_fifo ‚É ip ƒƒ“ƒo’ljÁ
+ ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
+ (char/)
+ char.c
+ auth_fifo ‚É login_id2, ip ƒƒ“ƒo’ljÁ
+ ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
+ (map/)
+ chrif.c
+ chrif_authok()’ljÁ
+ ƒpƒPƒbƒg•ÏX‚É”º‚¤•ÏX‘¼
+
+EŽ©“®Ä‹N“®ƒXƒNƒŠƒvƒg start ‚ɃRƒƒ“ƒg‚ÅŠÈ’P‚Èà–¾’ljÁ
+ start
+ ƒRƒƒ“ƒg’ljÁ
+
+--------------------
+//1039 by Ni+S
+ EƒMƒ‹ƒhŠÖŒW‚̃XƒNƒŠƒvƒg
+ Š—LŽÒ‚Ì‹‚È‚¢ƒAƒWƒg‚©‚çAƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢ƒLƒƒƒ‰‚È‚ç
+ ƒMƒ‹ƒhƒ_ƒ“ƒWƒ‡ƒ“‚É“ü‚ê‚Ä‚µ‚Ü‚¤‚Æ‚¢‚¤•s‹ï‡‚ª‚ ‚è‚Ü‚µ‚½
+
+ ‚±‚ê‚ÍAŠ—LŽÒ‚Ì‹‚È‚¢ƒAƒWƒg‚Ì’l‚ª0‚Å‚ ‚èA
+ getcharid(2)‚ŃMƒ‹ƒhID‚ð•Ô‚·‚Ì‚Å‚·‚ªA
+ ƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢ƒLƒƒƒ‰‚Ígetcharid(2)‚Å0‚ð•Ô‚·ˆ×A
+ ’l‚ªˆê’v‚µ‚Ä‚µ‚Ü‚¢‹N‚±‚Á‚Ä‚¢‚½Œ»Û‚Å‚µ‚½
+ –¢Š‘®ƒLƒƒƒ‰‚ª“ü‚ê‚È‚¢‚悤‚ÉC³‚µ‚Ü‚µ‚½
+
+ Eƒtƒ@[ƒ}ƒV[/ƒ|[ƒVƒ‡ƒ“ì¬DB
+ ƒŒƒbƒhƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
+ ƒCƒGƒ[ƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
+ ƒzƒƒCƒgƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“
+ ‚ÌÞ—¿‚ðA‹ó‚̃|[ƒVƒ‡ƒ“•r‚©‚玎Œ±ŠÇ‚ÉC³
+
+--------------------
+//1038 by Plala
+E“]ENPCŠÖ˜A‚Ìd‘å‚ȃoƒOC³
+ (script/npc/job)
+ npc_job_aco.txt C³
+ npc_job_merchant.txt C³
+ npc_job_thief.txt C³
+
+ Eã‹LNPC‚Å“r’†‚܂ŃNƒGƒXƒg‚ði‚ß‚Ä‘¼‚ÌE‚É“]E‚·‚é‚ÆA
+ Ä‚Ñ“]E‰Â”\‚¾‚Á‚½“_‚ðC³‚µ‚Ü‚µ‚½
+
+
+--------------------
+//1037 by ŒÓ’±—–
+
+** FOR ENGLISH DEVELOPERS **
+DO NOT UPLOAD IF YOU DON'T USE JAPANESE ENCODE (SHIFT-JIS) !
+WHY WE(JAPANESE) REPAIR ERROR CHARACTER AFTER EVERY YOUR UPLOADING ?
+BREAKING IS EASY, REPAIRING IS VERY DIFFICULT !
+
+** ‰pŒêŒ—‚ÌŠJ”­ŽÒ‚Ì•û‚Ö(“ú–{Œê–ó) **
+“ú–{ŒêƒGƒ“ƒR[ƒh(ƒVƒtƒgJIS)‚ðŽg‚¤‹C‚ª–³‚¢‚È‚çƒAƒbƒvƒ[ƒh‚µ‚È‚¢‚Ä‚­‚¾‚³‚¢I
+‚È‚º‰äXi“ú–{lj‚ª‚ ‚È‚½•û‚̃Aƒbƒvƒ[ƒh‚Ì‚½‚Ñ‚É•¶Žš‰»‚¯‚𒼂³‚È‚¯‚ê‚΂Ȃç‚È‚¢‚ñ‚Å‚·‚©H
+‰ó‚·‚Ì‚ÍŠÈ’P‚Å‚·‚ªA’¼‚·‚Ì‚Í‚Æ‚Ä‚à“‚¢‚ñ‚Å‚·I
+
+E•¶Žš‰»‚¯‚𪫂ÅC³
+ (map/)
+ script.c
+
+Eladmin‚ªPOSIX•K{‚ÉBDigest::MD5‚ª–³‚­‚Ä‚àŽÀs‚Å‚«‚é‚悤‚ÉC³
+Eserverstatus.cgi‚ÅANet::Ping‚ª–³‚­‚Ä‚àŽÀs‚Å‚«‚é‚悤‚ÉC³
+ (bin/tool/)
+ ladmin
+ (bin/tool/cgi/)
+ serverstatus.cgi
+
+Escript_ref‚Å”²‚¯‚Ä‚é‚à‚Ì‚Å‚í‚©‚é‚à‚Ì‚ðC³
+ ‰½ŒÌ‚©script_ref‚©‚甲‚¯‚Ä‚é‚à‚Ì(getarg‚È‚Ç)‚̈ꕔ‚ðĂђljÁ
+ ** ƒAƒbƒvƒ[ƒh‚·‚é‚Æ‚«‚ÍÅVƒpƒbƒ`‚©‚ç‚Ì·•ª‚ðƒAƒbƒvƒ[ƒh‚µ‚Ü‚µ‚傤 **
+ (doc/)
+ script_ref.txt
+
+Eaccount_making.txtC³
+ ladminƒXƒNƒŠƒvƒg‚̃pƒX
+ (doc/)
+ accoun_tmaking.txt
+
+--------------------
+//1036 by Michael
+E’ljÁ Script Command:
+ getequipid(EquipPos); EquipPos: 1-10
+ gettimetick(Type); Type: 0 SystemTick, 1 TimeSecondTick(0-86399)
+ gettime(Type); Type: 1 Sec, 2 Min, 3 Hour, 4 Weekday, 5, Monthday, 6 Month, 7 Year
+ gettimestr("TimeFMT", Len); TimeFMT: Time format strinf / Len: String Length
+
+ (map/)
+ script.c
+ buildin_getequipid(); ’ljÁ
+ buildin_gettimetick(); ’ljÁ
+ buildin_gettime(); ’ljÁ
+ buildin_gettimestr(); ’ljÁ
+
+--------------------
+//1035 by Michael
+E’ljÁ GVG Script NPC edit from Aegis NPC(Chinese-big5 version), Please someone translate to Japanese.
+EC³ NPC Script Command - buildin_getgdskilllv()
+ getgdskilllv(Guild_ID, Skill_ID);
+
+ (map/)
+ script.c
+ buildin_getgdskilllv() C³
+
+--------------------
+//1034 by (Pepermint)
+ FIX NPC Script Command - buildin_getgdskilllv()
+ Add NPC Sctipt Command - buildin_agitcheck()
+ (map/)
+ script.c
+ buildin_getgdskilllv() C³
+ buildin_agitcheck() ’ljÁ
+
+--------------------
+//1033 by Michael
+E’ljÁ NPC Script Command - buildin_getgdskilllv()
+ getgdskilllv(Guild_ID, Skill_ID);
+ skill_id = 1:GD_APPROVAL,2:GD_KAFRACONTACT,3:GD_GUARDIANRESEARCH,4:GD_CHARISMA,5:GD_EXTENSION
+
+ (map/)
+ script.c
+ buildin_getgdskilllv() ’ljÁ
+
+--------------------
+//1032 by (“Ê)
+E1031‚ʼn½ŒÌ‚©íœ‚³‚ê‚Ä‚¢‚½buildin_getitemname()‚𕜊ˆ
+EƒoƒOƒXƒŒ‚È‚Ç‚Éo‚½C³‚𔽉f
+E‚»‚Ì‘¼×‚©‚¢C³
+
+ (map/)
+ clif.c
+ clif_disp_onlyself() NULLƒ`ƒFƒbƒN’ljÁ
+ map.c
+ map_nick2sd() nick‚ªNULL‚¾‚Æ‚·‚®NULL‚ð•Ô‚·‚悤‚É•ÏX
+ mob.c
+ mob_setdelayspawn() NULLƒ`ƒFƒbƒN•ÏX
+ mob_delete() C³
+ npc.c
+ npc_parse_warp() C³
+ script.c
+ buildin_getitemname() •œŠˆ
+
+--------------------
+//1031 by huge
+ENPC‚Ìscript‚ÉAmakepet‚ð’ljÁB
+ makepet —‘ID; ‚ÅAƒyƒbƒg‚ð쬂µ‚Ü‚·B
+ENPC‚Ìscript‚ÉAgetexp‚ð’ljÁB
+ getexp Base,Job; ‚ÅA‚»‚ꂼ‚ê‚ÌŒoŒ±’l‚ð‘‚₵‚Ü‚·B
+Eƒyƒbƒg‚Ì—‘‚ðNPC‚Ìdelitem‚ÅÁ‚µ‚½‚èshop‚Å”„‚Á‚½ŽžAƒyƒbƒgƒZ[ƒuƒf[ƒ^‚©‚ç휂·‚é‚悤C³B
+EƒfƒBƒ{[ƒVƒ‡ƒ“¬Œ÷ðŒC³B(–¢Šm”F)
+EŒoŒ±’l•\Ž¦‚ð‰Â”\‚É‚µ‚Ä‚Ý‚Ü‚µ‚½Bconf‚É‚Äݒ肵‚Ä‚­‚¾‚³‚¢B
+
+ (conf/)
+ battle_athena.conf C³
+ (doc/)
+ conf_ref.txt C³
+ script_ref.txt C³
+ (map/)
+ battle.c
+ battle.h
+ disp_experience ’ljÁ
+ clif.c
+ clif.h
+ clif_disp_onlyself() ’ljÁ
+ pc.c
+ pc_gainexp() C³
+ script.c
+ buildin_delitem() C³
+ buildin_makepet() ’ljÁ
+ buildin_getexp() ’ljÁ
+ npc.c
+ #include C³
+ npc_selllist() C³
+ skill.c
+ skill_castend_nodamage_id() C³
+
+
+--------------------
+//1030 by (“Ê)
+Emap_athena.conf‚ÉV¥“‡ƒUƒƒC‚ðƒRƒƒ“ƒgƒAƒEƒg‚µ‚ĒljÁ
+EƒNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ðŽ©“®ƒZ[ƒu‚²‚Æ‚É–Y‚ê‚Ä‚¢‚½‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ƒƒOƒIƒtŽž‚É‚Ì‚Ý–Y‚ê‚é‚悤‚É•ÏX‚µ‚½‚‚à‚è
+Emobskill_castend_pos‚Ì–³ŠQnullpoƒ`ƒFƒbƒN‚ð•ÏX
+EEmotion‚Ìݒ肪‚È‚¢Mob‚ªƒXƒLƒ‹‚ðŽg—p‚·‚é‚Æ‚«‚É/!‚ðo‚µ‚Ä‚¢‚½‚Ì‚ðC³
+EƒoƒOƒXƒŒ‚É“Š‚°‚½trade.c‚ð“Y•tB‚Æ‚è‚ ‚¦‚¸‘ŠŽè‚ªŠŽ‚Å‚«‚éŽí—Þ‚ÌŒÀŠE‚ð’´‚¦‚½ê‡‚Í“n‚³‚¸‚ÉŒ³‚É–ß‚·‚悤‚É•ÏX
+
+ (conf/)
+ map_athena.conf ƒUƒƒC’ljÁ
+ (doc/)
+ client_packet.txt ƒpƒPƒbƒg’·‚ÌXV
+ (map/)
+ map.c
+ map_quit() I—¹Žž‚ɃNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ð–Y‚ê‚é‚悤‚É•ÏX
+ mob.c
+ mobskill_castend_pos() nullpoƒ`ƒFƒbƒN•ÏX
+ mob_readskilldb() C³
+ pc.c
+ pc_makesavestatus() ƒNƒ[ƒ“ƒXƒLƒ‹‚ð–Y‚ê‚é‚Ì‚ðmap_quit‚É”C‚¹‚½
+ trade.c
+ trade_tradecommit() ŠŽ‚Å‚«‚éŽí—ÞˆÈã‚ðŽæˆø‚µ‚½ê‡‚ɃAƒCƒeƒ€‚ªÁ‚¦‚È‚¢‚悤‚É
+
+--------------------
+//1029 by (“Ê)
+E20040619RagexeHC_jp.rgz‚Ì0x204‚Æ0x20bƒpƒPƒbƒg‚ɑΉž
+Echar‚Ælogin‚à’m‚ç‚È‚¢ƒpƒPƒbƒg‚ª—ˆ‚½‚çƒpƒPƒbƒgƒ_ƒ“ƒv‚ðo—Í‚·‚é‚悤‚Éclif.c‚©‚çƒRƒsƒy
+
+ (doc/)
+ client_packet.txt VƒpƒPƒbƒg’ljÁ
+ (char/)
+ char.c
+ parse_char() 0x20b‘Ήž
+ (login/)
+ login.c
+ parse_login() 0x204‘Ήž
+
+--------------------
+//1028 by (“Ê)
+EƒEƒ“ƒoƒ‰ˆÈ~AMob‚ªƒXƒLƒ‹‚ðŽg—p‚·‚é‚Æ‚«‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðo‚·‚悤‚É‚È‚Á‚½‚Ì‚ÅAmob_skill_db‚ðŠg’£
+ ƒTƒ“ƒvƒ‹‚ŃI[ƒNƒEƒH[ƒŠƒA[‚ª‹i‰Œ‚·‚é‚Æu/cv‚ðo‚·‚̂ƃI[ƒNƒŒƒfƒB‚ª‘¬“x‚ðŽg‚¤‚Æu/‚¿‚ãv‚ðo‚µ‚Ü‚·
+EƒAƒCƒeƒ€682,683‚ðŽg—p‚·‚é‚Æ30•bŠÔATK‚âMATK‚ª‘‚¦‚é‚炵‚¢‚Ì‚Å‚»‚ê‚Á‚Û‚­
+Ejob_db2.txt‚É“ä‚Ìs‚ª2s‚ ‚Á‚½‚Ì‚ðíœ
+E”͈͖‚–@‚ȂǂŃXƒLƒ‹ƒ†ƒjƒbƒg‘ŠŽè‚ɃXƒe[ƒ^ƒX•ÏX‚ð‚©‚¯‚悤‚Æ‚µ‚½ê‡‚Énullpo‚ªo‚½‚Ì‚ðC³
+
+ (db/)
+ const.txt SC_INCATK SC_INCMATK’ljÁ
+ item_db.txt ª‚ð682,683‚ɒljÁ
+ job_db2.txt “ä‚Ì2s‚ðíœ
+ mob_skill_db.txt Emotion’ljÁ
+ (map/)
+ mob.c
+ mobskill_use() ƒXƒLƒ‹Žg—pŽž‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðo‚·‚悤‚É•ÏX
+ mob_readskilldb() Emotion‚ð“Ç‚Ýž‚ނ悤‚É•ÏX
+ mob.h •ÏX
+ pc.c
+ pc_calcstatus() •ÏX
+ skill.c
+
+ skill_status_change_end() •ÏX
+ skill_status_change_start() •ÏX‚ÆNULLƒ`ƒFƒbƒNC³
+ skill.h •ÏX
+
+--------------------
+//1027 by Ni+S
+EgetitemnameŠÖ”’ljÁ
+EƒXƒNƒŠƒvƒg‚ÉgetitemnameŠÖ”‚ð’ljÁ
+Eitemid‚æ‚èAjname‚𕶎š—ñ‚Å•Ô‚µ‚Ü‚·
+EÚ‚µ‚­‚Íscript_ref.txt‚ÅB
+
+ script.c
+ getitemname()’ljÁ
+
+--------------------
+//1026 by (“Ê)
+E1023‚Å“ü‚ê‚Ä‚È‚©‚Á‚½clif.h‚𓯫
+EƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒA[ƒ}ƒCƒ“‚Åo‚µ‚½mob‚ð“|‚·‚Æmob_timer_delete()‚Ånullpo‚ªo‚é–â‘è‚ð‰ðŒˆ‚µ‚½‚‚à‚è
+EƒoƒO•ñƒXƒŒƒbƒh part6 >>63 Dest‚³‚ñ‚Ìscript.cC³‚ðŽæ‚èž‚Ý
+
+ (map/)
+ clif.h •ÏX
+ map.h •ÏX
+ mob.c
+ mob_changestate() •ÏX
+ skill.c
+ skill_castend_pos2() •ÏX
+ mob_spawn() •ÏX
+ do_init_mob() add_timer_func_list‚Émob_timer_delete‚ª–³‚©‚Á‚½‚̂ŒljÁ‚µ‚Ä‚Ý‚½
+ script.c
+ script_load_mapreg() •ÏX
+
+------------------------
+//1025 by Sel
+Eƒ[ƒhƒiƒCƒg‚̃Wƒ‡ƒu•â³‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
+EƒI[ƒ‰ƒuƒŒ[ƒhŒø‰ÊŽžŠÔ‚ðC³
+EƒI[ƒ‰ƒuƒŒ[ƒh•Ší§ŒÀ‚ð‘fŽèˆÈŠO‘S‚Ä‚ÉC³
+EƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“•Ší§ŒÀ‚𗼎葄‚Ì‚Ý‚©‚ç•ÐŽè‘„+—¼Žè‘„‚ÖC³
+EƒgƒDƒ‹[ƒTƒCƒgŒø‰ÊŽžŠÔ‚ðC³
+
+ (db/)
+ job_db2-2.txt •ÏX
+ skill_cast_db.txt •ÏX
+ skill_require_db.txt •ÏX
+--------------------
+//1024 by mare
+Eƒtƒ@[ƒ}ƒV[Þ—¿‚Ì•ÏXA»‘¢‰Â”\–ò•i‚̒ljÁ
+ 6/8“ú–{ŽI‚É‚«‚½‚à‚Ì‚Æ“¯‚¶‚É‚µ‚Ü‚µ‚½
+
+ (db/)
+ produce_db.txt •ÏX
+
+--------------------
+//1023 by (“Ê)
+E1022‚ŃGƒ“ƒoƒO‚µ‚½npc_parse_script()‚ð–ß‚µ
+EƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX‚Ìd—ʒljÁƒ_ƒ[ƒWŒvŽZŽ®‚ð‚¿‚å‚Á‚Æ•ÏX
+E–‚–@—Í‘•‚ÌŒvŽZŽ®‚ð‚¿‚å‚Á‚Æ•ÏX
+Eƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚ªÀ‚Á‚ÄŽg‚¤‚Ì‚Å‚Í‚È‚­Žg‚¤‚ÆÀ‚é‚Æ‚¢‚¤î•ñ‚ðŒ©‚©‚¯‚½‚Ì‚Å•ÏX
+Eª‚É”º‚¢skill_require‚ÌsittingðŒ”pŽ~
+Eƒo[ƒT[ƒN‚ðGvG‚ÅŽg—p‚Å‚«‚È‚¢‚悤‚É•ÏX
+
+ (db/)
+ skill_cast_db.txt •ÏX
+ skill_require_db.txt •ÏX
+ (doc/)
+ db_ref.txt C³
+ (map/)
+ battle.c
+ battle_calc_pc_weapon_attack() •ÏX
+ clif.c
+ clif_sitting() ’ljÁ
+ clif_parse_ActionRequest() •ÏX
+ npc.c
+ npc_parse_script() C³
+ pc.h •ÏX
+ pc.c
+ pc_calcstatus() •ÏX
+ pc_natural_heal_hp() •ÏX
+ pc_setstand() ’ljÁ
+ skill.c
+ skill_castend_nodamage_id() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚ðŽg‚¤‚ÆÀ‚é‚悤‚É
+ skill_check_condition() ST_SITTING”pŽ~
+ skill_use_id() ƒo[ƒT[ƒN‚ðGvG‚ÅŽg—p‚Å‚«‚È‚¢‚悤‚É
+ skill_status_change_timer() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX‚Í10•b‚²‚Æ‚ÉSP‚ð12Á”ï
+ skill_status_change_start() ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX•ÏX
+ skill_readdb() sitting”pŽ~
+ skill.h •ÏX
+
+--------------------
+//1022 by (“Ê)
+ENULLƒ`ƒFƒbƒN•ÏX
+Elogin,char,mapI—¹Žž‚ÉŠJ•ú‚³‚ê‚Ä‚¢‚È‚©‚Á‚½ƒƒ‚ƒŠ‚ð”÷–­‚ÉŠJ•ú‚·‚é“w—Í‚ð‚µ‚Ä‚Ý‚½
+EƒXƒpƒmƒr”š—ô”g“®ŽÀ‘•AƒNƒŠƒeƒBƒJƒ‹+50
+EƒXƒpƒmƒrƒ{[ƒiƒX‚ð•ÏXAʼn‚©‚çˆê“x‚àŽ€‚ñ‚Å‚È‚¢JobLv70‚ÉAll+15ABaseLv99‚ÉMHP+2000
+
+ (doc/)
+ client_packet.txt S 01ed’ljÁ
+ (char/)
+ do_final() •ÏX
+ do_init() •ÏX
+ (login/)
+ do_final() ’ljÁ
+ do_init() •ÏX
+ (map/)
+ atcommand.c Dest‚³‚ñ‚Ì•ÏX‚ðŽæ‚èž‚Ý
+ battle.c “¯ã
+ chat.c NULLƒ`ƒFƒbƒN•ÏX
+ chrif.c NULLƒ`ƒFƒbƒN•ÏX
+ clif.c NULLƒ`ƒFƒbƒN•ÏX
+ clif_parse() •ÏX
+ clif_parse_sn_explosionspirits() ’ljÁ
+ clif_parse_sn_doridori() –¼‘O•ÏX
+ guild.c NULLƒ`ƒFƒbƒN•ÏX
+ intif.c NULLƒ`ƒFƒbƒN•ÏX
+ itemdb.c NULLƒ`ƒFƒbƒN•ÏX
+ map.c NULLƒ`ƒFƒbƒN•ÏX
+ do_final() •ÏX
+ mob.c NULLƒ`ƒFƒbƒN•ÏX
+ npc.c NULLƒ`ƒFƒbƒN•ÏX
+ npc_parse_script() bufŠJ•ú–Y‚êH‚ðŠJ•ú
+ party.c NULLƒ`ƒFƒbƒN•ÏX
+ path.c NULLƒ`ƒFƒbƒN•ÏX
+ pc.c NULLƒ`ƒFƒbƒN•ÏX
+ pc_calcstatus() ƒXƒpƒmƒr•ÏX
+ pet.c NULLƒ`ƒFƒbƒN•ÏX
+ storage.c NULLƒ`ƒFƒbƒN•ÏX
+ trade.c NULLƒ`ƒFƒbƒN•ÏX
+ vending.c NULLƒ`ƒFƒbƒN•ÏX
+
+--------------------
+//1021 by Kalen
+Eƒvƒƒ“ƒeƒ‰Š¥¥•iNPC‚ɂă^ƒLƒV[ƒh”Ì”„
+EUmbala‚̃[ƒvŒ©’¼‚µ
+ D2F‚̃[ƒv‚ð–{ŽIŽg—p‚É•ÏXBd•¡ƒ|ƒCƒ“ƒgC³
+EUmbalaNPCC³
+ ƒ‰ƒxƒ‹‚ðŽg—p‚µ‚È‚­‚¢‚¢êŠ‚Í‹É—Ííœ(-)
+ ƒZ[ƒuƒ|ƒCƒ“ƒgC³
+ ƒoƒ“ƒW[ƒWƒƒƒ“ƒv‘ä’ljÁ
+ Š[œ–å’ljÁ
+ •ª‰ðA‡¬ˆ—’ljÁ
+ ƒJƒvƒ‰AˆÄ“à—vˆõ‚ð‚ ‚é‚ׂ«êŠ‚ÖˆÚ“®B
+ ¦ˆê•”Emo‚ɂ‚¢‚ÄAŠà•ðŽ©g‚ª‹t‚ÉŽæ‚èˆá‚¦‚Ä‚¢‚é‚Ý‚½‚¢‚È‚Ì‚Å“ÆŽ©‚Å•Ï‚¦‚Ü‚µ‚½B
+ Œ©‚Ä‚à‚炦‚Εª‚©‚è‚Ü‚·‚ª18‚Æ28‚ð‹t‚É‚·‚é‚ÆNPC‚̉ï˜b“à—e‚ɇ‚¤Emo‚ªo‚½‚Ì‚Å
+ ƒNƒGƒXƒgƒtƒ‰ƒO‚ÌðŒ’ljÁ
+ @‚±‚ê‚É‚æ‚è‚·‚Å‚ÉI‚¦‚Ä‚¢‚éꇂłà“r’†‚É‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B
+EƒXƒpƒmƒr“]ENPC’ljÁ
+ “Ê‚³‚ñ‚̃ƒO‚ðŠî‚É쬂µ‚Ü‚µ‚½B
+EƒAƒ‹ƒPƒ~ƒXƒgƒMƒ‹ƒh‚̃mƒr‚Ìꇂ̑ΉžC³(“Ê‚³‚ñ‚©‚ç‚̃ƒO‚æ‚è)
+EŒ‹¥NPC’ljÁ
+ ‚½‚¾‚µA‚Ü‚¾ƒeƒXƒg’iŠK‚Å‚·B–â‘è“_‚ª‚ ‚邽‚ߌ‹¥•s‰Â”\‚Å‚·B
+ (/script)
+ (/warp)
+ npc_warp_umbala.txt
+ (/npc)
+ (/town)
+ npc_town_umbala.txt
+ npc_town_kafra.txt
+ npc_town_guide.txt
+ npc_town_prontera.txt
+ (/quest)
+ npc_event_marriage.txt(VEƒeƒXƒg)
+ (/job)
+ npc_job_alchemist.txt
+ npc_job_supernovice.txt(V)
+
+--------------------
+//1020 by (“Ê)
+Enullpo‚Ì•ÏX‚ɑΉž‚µ‚Ämap_athena.conf‚ÌÝ’è휕skill.c‘‚«Š·‚¦
+EÀ‚Á‚Ä‚¢‚é‚ÆHPR‚ÆSPR‚ª’Êí‚Ì”¼•ª‚Å”­“®‚µ‚½‚Ì‚ðC³
+EƒXƒpƒmƒr‚ªˆê’èðŒ(ƒNƒ‰ƒCƒAƒ“ƒgˆË‘¶)‚Å/doridori‚·‚é‚ÆSPR‰ñ•œ—Ê‚ª”{‚É‚È‚é‚悤‚É•ÏX
+EŒ‹¥Ž®—p‚̃GƒtƒFƒNƒg‚ðƒXƒNƒŠƒvƒg‚©‚çwedding–½—ß‚Å”­¶‚³‚¹‚邱‚Æ‚ªo—ˆ‚é‚悤‚µ‚½
+E‡‘t‚ðŠJŽn‚µ‚½PC‚͇‘t’†‚ÉI—¹‚Å‚«‚È‚¢‚悤‚É‚µ‚½‚‚à‚è(–¢Šm”F)
+
+ (conf/)
+ map_athena.conf nullpo_checkíœ
+ (doc/)
+ client_packet.txt XV
+ conf_ref.txt nullpo_checkíœ
+ (map/)
+ map.c
+ map_config_read() nullpo_checkíœ
+ map.h “¯ã
+ skill.c NULLƒ`ƒFƒbƒNÄ“x‘“ü‚ê‘Ö‚¦
+ clif.c
+ clif_wedding_effect() ’ljÁ
+ clif_parse_QuitGame() ‡‘tŠJŽnŽÒ‚͇‘t’†‚ÉI—¹‚Å‚«‚È‚¢‚悤‚É•ÏX
+ clif_parse_doridori() ’ljÁ
+ clif_parse() doridori’ljÁ
+ clif.h •ÏX
+ pc.c
+ pc_authok() doridori‰Šú‰»’ljÁ
+ pc_natural_heal_hp() À‚Á‚Ä‚¢‚é‚Æ‚«‚ÌHPRŽžŠÔC³
+ pc_natural_heal_sp() À‚Á‚Ä‚¢‚é‚Æ‚«‚ÌHPRŽžŠÔC³Adoridori’ljÁ
+ script.c
+ buildin_wedding_effect() ’ljÁ
+
+
+--------------------
+//1019 by Dest
+Enullpoƒ‚ƒWƒ…[ƒ‹‚ɃR[ƒfƒBƒ“ƒOƒ~ƒX”­Œ©/C³
+E“¯Avoid‚ÈŠÖ”‚©‚çŒÄ‚΂ꂽŽž‚Ìnullpo_retv_f()‚ð’ljÁ
+E“¯AðŒƒRƒ“ƒpƒCƒ‹‚ɑΉž
+
+ (common/)
+ nullpo.c
+ nullpo_info_core() ƒR[ƒfƒBƒ“ƒOƒ~ƒXC³
+ nullpo.h
+ NULLPO_CHECKƒtƒ‰ƒO‚É‚æ‚éðŒƒRƒ“ƒpƒCƒ‹’ljÁ
+ nullpo_retv_f() ’ljÁ
+
+--------------------
+//1018 by chloe
+EƒEƒ“ƒoƒ‰ƒ‚ƒ“ƒXƒ^[‚ð’ljÁ
+
+ (script/mob/)
+ npc_monster.txt •ÏX
+ ŠeƒEƒ“ƒoƒ‰ƒ}ƒbƒv‚ÉMob”z’u
+ (db/)
+ mob_db.txt •ÏX
+ 1495,STONE_SHOOTER,ƒtƒŒƒCƒ€ƒVƒ…[ƒ^[ C³
+ 1511,AMON_RA,ƒAƒ‚ƒ“ƒ‰[ C³
+
+--------------------
+//1017 by (“Ê)
+EƒoƒO•ñƒXƒŒƒbƒh part6 >>46 Dest‚³‚ñ‚Ìnullpoƒ‚ƒWƒ…[ƒ‹‚ð’ljÁ•void‚ÈŠÖ”‚©‚çŒÄ‚΂ꂽŽž‚Ìnullpo_retv()‚ð’ljÁ(‚Æ‚è‚ ‚¦‚¸skill.c‚ÌNULLƒ`ƒFƒbƒN‚¾‚¯“ü‚ê‘Ö‚¦)
+E“¯>>39 Sel‚³‚ñ‚©‚ç•ñ‚ª‚ ‚Á‚½ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ðC³
+EŽd—l‚ɂ‚¢‚ÄŒê‚臂¤ƒXƒŒƒbƒh >>33 Kalen‚³‚ñ‚Ìî•ñ‚ðclient_packet.txt‚É”½‰f
+E–{ŽI‘ŠˆáƒXƒŒƒbƒh part3 >>24 M —zqcM6jBw‚³‚ñ‚Ìî•ñ‚ðª
+E“¯>>30 ‚Í‚¿‚³‚ñ‚ÌC³‚𔽉f
+
+ (conf/)
+ map_athena.conf nullpo_check’ljÁ
+ (db/)
+ item_db.txt Œ‹¥Žw—Ö‚ð•Ší-ƒAƒNƒZƒTƒŠ‚É•ÏX•ÅV”Å
+ (doc/)
+ client_packet.txt XV
+ conf_ref.txt nullpo_check’ljÁ
+ (common/)
+ Makefile •ÏX
+ nullpo.c ’ljÁ
+ nullpo.h ’ljÁ
+ (map/)
+ Makefile •ÏX
+ map.c
+ map_config_read() nullpo_check’ljÁ
+ map.h “¯ã
+ skill.c NULLƒ`ƒFƒbƒN‘“ü‚ê‘Ö‚¦
+ skill_status_change_start() ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“C³
+ skill_castend_nodamage_id() ƒeƒŒƒ|[ƒgC³
+ clif.c
+ clif_skill_setunit() ƒRƒƒ“ƒgC³
+ pc.c
+ pc_calcstatus() ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“C³
+
+--------------------
+//1016 by ‚ÈB
+EAthenaŽG’kƒXƒŒƒbƒhPart4 42 ‚©‚éŽì‚̃Eƒ“ƒoƒ‰NPC‚ð’ljÁ
+
+ (script/npc/town/)
+ npc_town_umbala.txt’ljÁ
+ ƒCƒxƒ“ƒgƒfƒoƒbƒO—l(230`256s–Ú)‚̓Rƒƒ“ƒgƒAƒEƒg
+ (conf/)
+ map_athena.conf town ‚É npc: script/npc/town/npc_town_umbala.txt ’ljÁ
+
+--------------------
+//1015 by (“Ê)
+EƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ð–{ŽIŽd—l‚ÆAthenaŽd—l‚Å‘I‚ׂé‚悤‚É‚µ‚½
+EƒXƒpƒmƒr‚ÉAll+10‚·‚éðŒ‚ª—Ç‚­•ª‚©‚ç‚È‚©‚Á‚½‚¯‚Çʼn‚©‚ç+10‚¶‚á‚È‚¢‚Ì‚ÍŠm‚©‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸Base99‚ňê“x‚àŽ€‚ñ‚Å‚È‚¯‚ê‚΂Ƃ¢‚¤ðŒ‚É•ÏX
+Eƒ_ƒ“ƒX’†‚É‚«”ò‚΂³‚ê‚Ä‚àƒGƒtƒFƒNƒg‚͈ړ®‚µ‚È‚¢‚»‚¤‚È‚Ì‚Å•ÏX
+E@go 13”÷’²®
+
+
+ (conf/)
+ battle_athena.conf skill_removetrap_type’ljÁ
+ (doc/)
+ client_packet.txt –{ŽI‘ŠˆáƒXƒŒƒbƒh part3 23 M —zqcM6jBw‚³‚ñ‚Ìî•ñ‚ð’ljÁ
+ conf_ref.txt skill_removetrap_type’ljÁ
+ (map/)
+ atcommand.c
+ atcommand_go() ƒEƒ“ƒoƒ‰‚ÌoŒ»ˆÊ’u”÷’²®
+ battle.c
+ battle_config_read() skill_removetrap_type’ljÁ
+ battle.h “¯ã
+ pc.c
+ pc_calcstatus() ƒXƒpƒmƒrAll+10ðŒ•ÏX
+ skill.c
+ skill_blown() ƒ_ƒ“ƒX’†‚Ì‚«”ò‚΂µ‚ðŒ³‚É–ß‚µ‚½
+ skill_castend_nodamage_id() ƒŠƒ€[ƒuƒgƒ‰ƒbƒvŽd—l•ÏX
+
+ --------------------
+//1014 by (Pepermint)
+I fixed again the problem if you put minus sign(-) in front of digits,
+the error comes up when you puchase a item.
+When you put a minus sign(-), the error sign will be changed shrotage of
+amount as original server dose.
+
+I tested with it in ver. 1013, it was working
+
+--------------------
+//1013 by (“Ê)
+EƒT[ƒo[ƒXƒiƒbƒvƒVƒ‡ƒbƒg
+
+--------------------
+//1012 by (“Ê)
+Ehelp.txt‚É‚ ‚é@go‚Ìà–¾‚©‚ç13‚Æ14‚ðíœ
+@‹@”\‚ÍÁ‚¦‚Ä‚È‚¢‚Ì‚ÅŽg‚¦‚邱‚Æ‚ÍŽg‚¦‚Ü‚·‚ªAhelp‚ÉÚ‚¹‚é‚Ì‚ÍjRO‚É—ˆ‚Ä‚©‚ç‚Æ‚¢‚¤‚±‚Æ‚Å
+Ecast_db.txt‚ðskill_cast_db.txt‚ɉü–¼
+E‚‚¢‚Å‚Émake clean‚ÅGNUmakefile‚àÁ‚µ‚Ă݂邱‚Æ‚É‚·‚é
+Eu-0‚³‚ñ‚ÌŒŸØ‚Ȃǂ𑇂µ‚ă_ƒ“ƒXƒ†ƒjƒbƒgŠÖ˜A‚ð•ÏX
+@‰‰‘tEƒ_ƒ“ƒX’†‚̃nƒG‚̓†ƒjƒbƒg•t‚«‚Å”ò‚Ô‚»‚¤‚Å‚·
+@‰‰‘tEƒ_ƒ“ƒX’†‚Ƀ[ƒvƒ|ƒCƒ“ƒg‚Éæ‚Á‚½‚çó‘Ô‚ª‰ðœ‚³‚ê‚é‚悤‚Å‚·
+@‡‘t’†‚ɕЕû‚ªƒnƒG”ò‚Ñ‚µ‚½‚çƒGƒtƒFƒNƒg‚ÍŒ³‚ÌꊂɎc‚èA”ò‚ñ‚¾æ‚ł͇‘tó‘Ô‚ªŒp‘±‚µ‚Ä“®‚¯‚È‚¢•ŽžŠÔ‚²‚Æ‚ÉSPÁ”ï‚·‚é‚悤‚Å‚·
+EPC_DIE_COUNTER‚ªƒXƒNƒŠƒvƒg‚©‚ç•ÏX‚³‚ꂽŽž‚É‚·‚®‚É”½‰f‚³‚ê‚é‚悤‚É•ÏX
+
+ (conf/)
+ help.txt @goà–¾•ÏX
+ (db/)
+ skill_cast_db.txt ‰ü–¼
+ (map/)
+ pc.c
+ pc_setpos() ƒ_ƒ“ƒX’†’f‚̃^ƒCƒ~ƒ“ƒO•ÏX
+ pc_setglobalreg() PC_DIE_COUNTER“Á•Êˆ—’ljÁ
+ skill.c
+ skill_castend_id() NULLƒ`ƒFƒbƒN•ÏX
+ skill_stop_dancing() ƒ}ƒbƒvˆÚ“®‚È‚Ç‚Å‚Ì‹““®‚ð•ÏX
+ skill_readdb() skill_cast_db‚ɉü–¼
+ skill_blown() ”ò‚΂³‚ꂽ‚çƒ_ƒ“ƒXˆÚ“®
+ npc.c
+ npc_touch_areanpc() ƒ[ƒvƒ|ƒCƒ“ƒg‚Éæ‚Á‚½‚çƒ_ƒ“ƒX‰ðœ
+
+--------------------
+//1011 by ƒpƒCƒ“
+Eƒp[ƒeƒB—v¿‚âƒMƒ‹ƒh—v¿‚ðo‚µ‚Ä‚¢‚é‚Æ‚«‚É‘¼‚Ì—v¿‚ð‹‘”Û‚éˆ—‚ð’ljÁ
+@battle_athena.conf‚ÅØ‚è‘Ö‚¦‚ªo—ˆ‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+Emake clean ‚ÅŽ–‚ª‘«‚è‚é‚Ì‚ÅAobjectdel.bat‚ðÁ‹Ž
+
+ (map)
+ clif.c
+ clif_party_invite()•ÏX(nullpo‚Ì•¶Œ¾ˆá‚Á‚Ä‚Ü‚µ‚½)
+ guild.c
+ guild_invite()•ÏX
+ party.c
+ party_invite()•ÏX
+ battle.c
+ battle_config_read()•ÏX
+ battle.h•ÏX
+ trade.c
+ trade_traderequest()•ÏX
+
+--------------------
+//1010 by (“Ê)
+Egcc 2.95‘Îô
+EƒXƒpƒmƒr‚Ì1“xŽ€‚Ê‚Ü‚ÅAll+10‚ðƒXƒNƒŠƒvƒg•Ï”‚ÅŽÀ‘•‚µ‚Ă݂鎎‚Ý
+ PC_DIE_COUNTER Ž€‚Ê‚Æ+1A“]E‚·‚é‚Æ0‚É‚È‚è‚Ü‚·
+ ª‚̓Lƒƒƒ‰ƒNƒ^‰i‘±‚ȃXƒNƒŠƒvƒg•Ï”‚È‚Ì‚ÅNPC‚ÅŽQÆ•ÄÝ’è‚Æ‚©”äŠr“IŠy‚©‚à
+
+ (map/)
+ chrif.c
+ chrif_divorce() gcc2.95‘Îô
+ skill.c
+ skill_attack() gcc2.95‘Îô
+ skill_unit_move_unit_group() gcc2.95‘Îô
+ map.h map_session_data‚Édie_counter‚ð’ljÁ
+ npc.c
+ npc_click() nullpoƒƒbƒZ[ƒW‚ðC³
+ pc.c
+ pc_setrestartvalue() nullpoƒƒbƒZ[ƒW‚ðC³
+ pc_authok() die_counter‰Šú‰»‚̒ljÁ
+ pc_calcstatus() die_counter=0‚̃Xƒpƒmƒr‚ÍAll+10
+ pc_damage() PC_DIE_COUNTERÝ’è
+ pc_jobchange() PC_DIE_COUNTERÝ’è
+ pc_readparam() gcc2.95‘Îô
+ pc_divorce() gcc2.95‘Îô
+ pc_get_partner() gcc2.95‘Îô
+
+--------------------
+//1009 by ‚Ò‚´‚Ü‚ñ
+Eƒ_ƒ“ƒXˆÚ“®Œy—ʉ»ŽÀ‘•
+@battle_athena.conf‚ÅØ‚è‘Ö‚¦‰Â”\‚Å‚·BÚ‚µ‚­‚Íconf_ref‚ð
+@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×AƒfƒtƒHƒ‹ƒg‚Å‚Íoff‚É‚µ‚Ä‚¢‚Ü‚·
+@‚Ü‚½A‚±‚ÌŒy—ʉ»ƒ‚[ƒh‚͉ñü•‰‰×‚ð‘å•‚É팸‚Å‚«‚é(‚‚à‚è)‚Å‚·‚ªA
+@‚»‚Ì•ªƒT[ƒo[‘¤‚̈—‚ªd‚½‚­‚È‚è‚Ü‚·(‚Æ‚¢‚Á‚Ä‚à‚ ‚é’ö“x‚ÌCPU‚ª‚ ‚ê‚ΑS‘R–â‘è‚É‚È‚ç‚È‚¢’ö“x‚Ì•‰‰×‚Å‚·‚ª)
+EŒ‹¥ƒVƒXƒeƒ€^Œ‹¥ƒXƒLƒ‹ŽÀ‘•
+@Œ‹¥Žw—Ö‚Ì“Á•Êˆµ‚¢‚ª–¢ŽÀ‘•‚Å‚·(—Ž‚Æ‚¹‚½‚èŽæˆø‚Éo‚¹‚½‚肵‚Ü‚·)
+@—£¥‚Ì‚Ý–¢ƒeƒXƒg‚Å‚·B
+EŒ‹¥—pƒXƒNƒŠƒvƒg(marriageAdivorce)’ljÁB
+@Emarriage <partner_name>
+@@<partner_name>: Œ‹¥‘ŠŽè‚Ì–¼‘O
+@@–ß‚è’l: ¬Œ÷:1@Ž¸”s:0
+@@Œ‹¥ˆ—‚ðs‚¢‚Ü‚·B‘Îۂ͘b‚µŠ|‚¯‚½ƒvƒŒƒCƒ„[‚Æ<partner_name>‚̃Lƒƒƒ‰ƒNƒ^[‚ÅA‚Ç‚¿‚ç‚©‚ªŠù¥‚Ìꇂ͎¸”s‚µ‚Ü‚·B
+@@1‰ñ‚ÌmarriageƒXƒNƒŠƒvƒg‚ÅV˜Y¨V•w‚ÆV•w¨V˜Y‚ÌŒ‹¥ˆ—‚𓯎ž‚És‚¢‚Ü‚·B
+@@‚Ü‚½A‚±‚̃XƒNƒŠƒvƒg‚ÅŒ‹¥Žw—Ö‚Í—^‚¦‚ç‚ê‚Ü‚¹‚ñB
+@Edevorce
+@@ˆø”–³‚µ
+@@–ß‚è’l: ¬Œ÷:1@Ž¸”s:0
+@@—£¥ˆ—‚ðs‚¢‚Ü‚·B‘Îۂ͘b‚µŠ|‚¯‚½ƒvƒŒƒCƒ„[‚ÅA–¢¥‚Ìꇂ͎¸”s‚µ‚Ü‚·B
+@@marriageƒXƒNƒŠƒvƒg‚Æ“¯—l‚Ɍ݂¢‚Ì—£¥ˆ—‚𓯎ž‚És‚¢‚Ü‚·B
+@@‚Ü‚½A‚±‚̃XƒNƒŠƒvƒg‚ª¬Œ÷‚·‚é‚ÆŽ©“®“I‚É‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ÌŒ‹¥Žw—Ö‚Í”’D‚³‚ê‚Ü‚·B
+
+@‚Ç‚¿‚ç‚̃XƒNƒŠƒvƒg‚̈—‚àA2l‹¤ƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢‚ƬŒ÷‚µ‚Ü‚¹‚ñB
+
+ (map/)
+ pc.c
+ pc_ismarried()Apc_marriage()Apc_divorce()Apc_authok()•ÏX
+ pc_get_partner() ’ljÁ
+ map.c
+ map_quit() •ÏX
+ skill.c
+ skill_use_id()Askill_castend_nodamage_id() •ÏX
+ skill_unitsetting()Askill_unit_onlimit() •ÏX
+ script.c
+ buildin_marriage()Abuildin_devorce() ’ljÁ
+ pc.h •ÏX
+ battle.h •ÏX
+
+--------------------
+//1008 by ‚Ò‚´‚Ü‚ñ
+EGMƒZƒbƒVƒ‡ƒ“‰B‚µŽÀ‘•(–¢ƒeƒXƒg)
+@GMƒAƒJƒEƒ“ƒg‚̃Lƒƒƒ‰ƒNƒ^[‚ð@who“™‚Å•\Ž¦‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚Ü‚·B
+@Ú‚µ‚­‚Íconf_ref.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+EŒ‹¥ƒVƒXƒeƒ€‰¼ŽÀ‘•
+@char-mapŠÔ’ÊM‚Ì‚ÝŽÀ‘•‚Å‚·B‚Ü‚¾Œ‹¥‚·‚邱‚Æ‚Ío—ˆ‚Ü‚¹‚ñB
+@®A‚±‚̃pƒbƒ`‚©‚çathena.txt‚̃o[ƒWƒ‡ƒ“‚ª•Ï‚í‚è‚Ü‚·B
+@ƒf[ƒ^‚̌݊·«‚Í•Û‚Á‚½‚‚à‚è‚Å‚·‚ªA”O‚̈׃oƒbƒNƒAƒbƒv‚ðŽæ‚Á‚Ä‚¨‚­Ž–‚ð‹­‚­„§‚µ‚Ü‚·B
+
+ (map/)
+ clif.c
+ clif_countusers() •ÏX
+ battle.c
+ battle_config_read() •ÏX
+ atcommand.c
+ atcommand_who() •ÏX
+ pc.c
+ pc_ismarried()Apc_marriage()Apc_divorce() ’ljÁ
+ chrif.c
+ chrif_divorce() ’ljÁ
+ chrif_parse() •ÏX
+ (char/)
+ char.c
+ char_divorce() ’ljÁ
+ char_delete()Ammo_char_fromstr()Ammo_char_tostr() •ÏX
+
+--------------------
+//1007 by (“Ê)
+ENULLƒ`ƒFƒbƒN‚ÌŒ©’¼‚µ
+
+ (map/)
+ clif.c
+ clif_send() •ÏX
+ skill.c
+ skill_delunit() •ÏX
+
+--------------------
+//1006 by (ruhu)
+¥@go‚É—Œ—z‚ƃjƒtƒ‹ƒwƒCƒ€’ljÁ
+
+ (conf/)
+ help.txt ƒjƒtƒ‹ƒwƒCƒ€A—Œ—z’ljÁ
+ (map/)
+ atcommand.c
+ atcommand go() ƒjƒtƒ‹ƒwƒCƒ€A—Œ—z’ljÁ
+--------------------
+//1005 by (“Ê)
+ENULLƒ`ƒFƒbƒN‚ÌŒ©’¼‚µ‚ƒljÁA‘å—Ê‚É•ÏX‚µ‚½‚Ì‚Å–â‘肪o‚é‰Â”\«‚ª‘å‚Å‚·
+EƒEƒ“ƒoƒ‰•ªŠ„ƒpƒbƒ`‚ª”z•z‚³‚ꂽ‚Ì‚Å@go 12‚ɃEƒ“ƒoƒ‰‚ð’ljÁ
+Eƒ[ƒhƒiƒCƒg ƒo[ƒT[ƒN‚ð‚¿‚å‚Á‚Æ‚»‚ê‚Á‚Û‚­(ASPD‘‰Á‚È‚Ç‚Í–¢ŽÀ‘•)
+EƒNƒ‰ƒEƒ“¥ƒWƒvƒV[ ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç‚ÌŽg—pðŒ‚ð‡‘t‚Æ“¯‚¶‚É•ÏX(Œø‰Ê“™‚Í–¢ŽÀ‘•)
+EƒuƒŒƒbƒVƒ“ƒO‚ª–{ŽI‚ł̓Xƒe[ƒ^ƒXƒAƒbƒv¨ƒGƒtƒFƒNƒg‚¾‚Á‚½‚Ì‚Å‚»‚̂悤‚É•ÏX
+E–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>145 zzz‚³‚ñ‚Ì•ñ‚𔽉f
+E“¯ƒXƒŒ >>143 plala‚³‚ñ‚Ì•ñ‚𔽉f
+
+ (db/)
+ skill_require_db.txt •ÏX
+ (conf/)
+ help.txt ƒEƒ“ƒoƒ‰’ljÁ
+ map_athena.conf ƒEƒ“ƒoƒ‰ŠÖ˜A‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
+ (map/)
+ atcommand.c NULLƒ`ƒFƒbƒN‹­‰»
+ atcommand() @mapmove‚È‚Ç‚Å—Ž‚¿‚é–â‘è‚ðC³
+ atcommand_go() ƒEƒ“ƒoƒ‰’ljÁ
+ battle.c NULLƒ`ƒFƒbƒN‹­‰»
+ battle_calc_mob_weapon_attack() ƒo[ƒT[ƒNŽžƒ_ƒ[ƒW150%
+ battle_calc_pc_weapon_attack() ƒo[ƒT[ƒNŽžƒ_ƒ[ƒW150%
+ chat.c NULLƒ`ƒFƒbƒN‹­‰»
+ chrif.c NULLƒ`ƒFƒbƒN‹­‰»
+ clif.c NULLƒ`ƒFƒbƒN‹­‰»
+ clif_parse_ActionRequest() ƒ_ƒ“ƒXŽž‚̈—‚ðŽáŠ±•ÏX
+ clif_parse_GlobalMessage() ƒo[ƒT[ƒNŽž‚͉ï˜b‚ªo—ˆ‚È‚¢‚悤‚É•ÏX
+ clif_parse_Wis() ƒo[ƒT[ƒNŽž‚͉ï˜b‚ªo—ˆ‚È‚¢‚悤‚É•ÏX
+ clif_parse_PartyMessage() “¯ã
+ clif_parse_GuildMessage() “¯ã
+ clif_parse_TakeItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ðŽæ‚ê‚È‚¢‚悤‚É•ÏX
+ clif_parse_DropItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ð—Ž‚Æ‚¹‚È‚¢‚悤‚É•ÏX
+ clif_parse_UseItem() ƒo[ƒT[ƒNŽž‚̓AƒCƒeƒ€‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
+ clif_parse_EquipItem() ƒo[ƒT[ƒNŽž‚Í‘•”õ‚Å‚«‚È‚¢‚悤‚É•ÏX
+ clif_parse_UnequipItem() ƒo[ƒT[ƒNŽž‚Í‘•”õ‰ðœ‚Å‚«‚È‚¢‚悤‚É•ÏX
+ clif_parse_UseSkillToId() ƒo[ƒT[ƒNŽž‚̓XƒLƒ‹Žg—p‚ª‚Å‚«‚È‚¢‚悤‚É•ÏX
+ clif_parse_UseSkillToPos() “¯ã
+ clif_parse_UseSkillMap() “¯ã
+ guild.c NULLƒ`ƒFƒbƒN‹­‰»
+ intif.c NULLƒ`ƒFƒbƒN‹­‰»
+ itemdb.c NULLƒ`ƒFƒbƒN‹­‰»
+ map.c NULLƒ`ƒFƒbƒN‹­‰»
+ map_quit() ƒo[ƒT[ƒNŽž‚ɃƒOƒAƒEƒg‚·‚é‚ÆHP 100/SP 0‚É‚È‚é‚悤‚É•ÏX
+ mob.c
+ mob_attack() clif_fixmobpos()‚ð‘—M‚µ‚È‚¢‚悤‚É•ÏX
+ mob_timer() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏX
+ mobskill_castend_id() “¯ãAƒo[ƒT[ƒNŽžƒXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
+ mobskill_castend_pos() ƒo[ƒT[ƒNŽžƒXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
+ mobskill_use_id() “¯ã
+ mobskill_use_pos() “¯ã
+ npc.c NULLƒ`ƒFƒbƒN‹­‰»
+ party.c NULLƒ`ƒFƒbƒN‹­‰»
+ path.c NULLƒ`ƒFƒbƒN‹­‰»
+ pc.c NULLƒ`ƒFƒbƒN‹­‰»
+ pc_calcstatus() ƒo[ƒT[ƒNŽž‚Í‘¬“xUP•MHP3”{AƒƒfƒBƒeƒCƒeƒBƒI‚ÌSP‰ñ•œ‘‰Á‚ðSPR‚Å‚Í‚È‚­’Êí‰ñ•œ‚É‚©‚©‚é‚悤‚É‚µ‚½
+ pc_heal() ƒo[ƒT[ƒNŽž‚͉ñ•œ‚µ‚È‚¢
+ pc_jobchange() “]E’¼Œã1•à“®‚©‚È‚¢‚Æ•ž‚ÌF‚ª”½‰f‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³
+ pc_natural_heal_sub() ƒo[ƒT[ƒN’†‚ÍSP‚ªŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX(HP‚Í—Ç‚­•ª‚©‚ç‚È‚©‚Á‚½‚̂ʼnñ•œ‚·‚é‚悤‚É‚µ‚Ä‚ ‚é)
+ pet.c NULLƒ`ƒFƒbƒN‹­‰»
+ skill.c
+ skill_castend_nodamage_id() ƒuƒŒƒbƒVƒ“ƒO“™‚̃pƒPƒbƒg‡‚ð•ÏXAƒXƒg[ƒ“ƒJ[ƒX‚ð•sŽ€‚É‚Í–³Œø‚É‚µ‚½
+ skill_castend_map() ‚µ‚‚±‚¢‚­‚ç‚¢‚Ƀo[ƒT[ƒNŽž‚ɃXƒLƒ‹‚ðŽg‚¦‚È‚¢‚悤‚É•ÏX
+ skill_check_condition() “¯ã
+ skill_use_pos() “¯ã
+ skill_use_id() “¯ã•ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç’ljÁ
+ skill_status_change_end() ƒo[ƒT[ƒNŽž‚É‚ÍIAƒAƒCƒRƒ“‚ðÁ‹Ž‚·‚é‚悤‚É•ÏX
+ skill_status_change_timer() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏXAŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚т玞SPÁ”ïAƒo[ƒT[ƒNŽžHP100ˆÈã‚È‚ç10•b‚ ‚½‚è1%Œ¸‚ç‚·‚悤‚É•ÏX
+ skill_status_change_start() ƒo[ƒT[ƒNŽž‚É‚ÍIAƒAƒCƒRƒ“‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
+ skill_delunit() NULLƒ`ƒFƒbƒNðŒ‚ð•ÏX
+ skill_check_condition_char_sub() ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç’ljÁ
+ skill_check_condition_use_sub() “¯ã
+ skill_is_danceskill() “¯ã
+ skill_initunitgroup() “¯ã
+ trade.c NULLƒ`ƒFƒbƒN‹­‰»
+ vending.c NULLƒ`ƒFƒbƒN‹­‰»
+
+--------------------
+//1004 by (“Ê)
+ENULLƒ`ƒFƒbƒN‚ŃGƒ“ƒoƒO‚µ‚Ä‚¢‚½‚Æ‚±‚ë‚ð‚¢‚­‚‚©C³‚Æ‘¼‚ÌNULLƒ`ƒFƒbƒN‹­‰»
+Eskill.c‚Å‚ànullpo‚ð•\Ž¦‚·‚é‚悤‚É•ÏX
+
+ (map/)
+ battle.c
+ battle_damage() NULLƒ`ƒFƒbƒN‹­‰»
+ battle_heal() “¯ã
+ clif.c
+ clif_damage() “¯ã
+ map.c
+ map_addflooritem() NULLƒ`ƒFƒbƒN‹­‰»
+ mob.c
+ mob_once_spawn() —]Œv‚ÈNULLƒ`ƒFƒbƒN‚ðíœ
+ mob_once_spawn_area() “¯ã
+ mob_damage() “¯ã
+ mob_counttargeted() “¯ã
+ mobskill_castend_id() “¯ã
+ mob_summonslave() ƒƒbƒZ[ƒWŠÔˆá‚¢‚ðC³
+ pc.c
+ pc_damage() NULLƒ`ƒFƒbƒN‹­‰»
+ skill.c ‚Ù‚Ú‘S•” NULLŠÖ˜AC³
+
+--------------------
+//1003 by (“Ê)
+EjROƒNƒ‰ƒCƒAƒ“ƒg‚Å/accountŽg—pŽž‚ÉŒq‚ª‚ç‚È‚¢Œ´ˆö‚Ì0x200ƒpƒPƒbƒg–â‘è‚ðC³
+E0x1c9ƒpƒPƒbƒg‚ÌŒŠ–„‚ß‚ðˆø‚«‘±‚«Œp‘±’†
+Eˆêl‚Ź‘̂⇑t‚ðŽg—p‚Å‚«‚éÝ’è(player_skill_partner_check)‚ð’ljÁ
+ ˆêl‚Ň‘t‚ðŽÀs‚µ‚½ê‡‚É‚Í’Êí‚̃_ƒ“ƒX‚Æ‹““®‚ª“¯‚¶‚É‚È‚è‚Ü‚·
+Eƒvƒƒ{ƒbƒN‚Í•sŽ€‚ɑ΂µ‚Ä”­“®‚µ‚È‚¢‚悤‚É•ÏX
+EFW‚Ì‚«”ò‚΂µ”»’è‚ð•ÏX
+EƒfƒŠƒ…[ƒW‚É…ê”»’è‚ð’ljÁA¹…‚ðì‚ê‚é‚Ì‚ðŠm”F
+EƒnƒCƒfƒBƒ“ƒO‚Ì—LŒøŽžŠÔ‚ª³‚µ‚­‹@”\‚·‚é‚悤‚ÉC³
+EƒAƒXƒyƒ‹ƒVƒI‚ð•sŽ€‚ÉŽg—p‚µ‚½ê‡A¹‘®«‚Ì40ƒ_ƒ[ƒW‚ð—^‚¦‚é‚悤‚É•ÏX
+EƒAƒXƒyƒ‹ƒVƒI‚ð•sŽ€ˆÈŠO‚ÌMOB‚ÉŽg—p‚µ‚Ä‚àŒø‰Ê‚ª–³‚¢‚悤‚É•ÏX
+E‡‘tAƒ_ƒ“ƒXA‰‰‘t’†‚ÌŒo‰ßŽžŠÔ‚É‚æ‚éSPÁ”ï‚ðŽÀ‘•
+E•ñ‚Ì‚ ‚Á‚½ƒK[ƒfƒBƒAƒ“‚ªƒMƒ‹ƒh–¢‰Á“üPC‚ðƒ^[ƒQƒbƒg‚µ‚½‚çmap‚ª—Ž‚¿‚é–â‘è‚ÌC³(ƒK[ƒfƒBƒAƒ“ŽÀ‘•“–Žž‚©‚炸‚Á‚Æ—Ž‚¿‚Ä‚½H)
+Emob.cAstorage.c‚Ìnullƒ`ƒFƒbƒN‚ð‹­‰»
+ ƒGƒ‰[‚Å—Ž‚¿‚é‚ׂ«‚Æ‚±‚ë‚ð–³—‚â‚è’Ê툗‚É–ß‚µ‚Ä‚¢‚é‚Ì‚Å‘¼‚Å–â‘肪‚Å‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
+ ‚»‚Ìê‡AƒRƒ“ƒ\[ƒ‹‚ÉuŠÖ”–¼ nullpov‚Æ•\Ž¦‚³‚ê‚é‚Ì‚Å•\Ž¦‚³‚ꂽꇂ͕ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·
+ ‚à‚µ‚©‚µ‚½‚ç³í‚Ȉ—‚Å‚à•\Ž¦‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ªA‚»‚ÌÛ‚à•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·
+ –{—ˆƒGƒ‰[AŽÀ‚ͳíA‚Ç‚¿‚ç‚É‚µ‚Ä‚à‚±‚ꂪ•\Ž¦‚³‚ê‚é‚̂̓oƒO‚Å‚·
+
+ (conf/)
+ battle_athena.conf player_skill_partner_check’ljÁ
+ (db/)
+ skill_db.txt ƒAƒXƒyƒ‹ƒVƒI‚Ì‘®«‚ð¹‚É•ÏX
+ (doc/)
+ conf_ref.txt player_skill_partner_checkà–¾’ljÁ
+ (login/)
+ login.c
+ parse_login() 0x200ƒpƒPƒbƒg‘Ήž
+ (map/)
+ mob.c NULLƒ`ƒFƒbƒN‚Å‚Ù‚Ú‘S•”
+ storage.c NULLƒ`ƒFƒbƒN‚Å‚Ù‚Ú‘S•”
+ battle.h •ÏX
+ battle.c
+ battle_calc_magic_attack() ƒAƒXƒyƒ‹ƒVƒI‚ð’ljÁAFW‚ð•ÏX
+ battle_config_read() Ý’è’ljÁ
+ clif.c
+ clif_getareachar_skillunit() ’²¸Œ‹‰Ê‚Ì”½‰f
+ clif_skill_setunit() “¯ã
+ [1001‚Æ1002‚ÌŠÔ‚Ì•ÏX“_]
+ skill.c NULLƒ`ƒFƒbƒN‚ð‘òŽR
+ skill_castend_damage_id() ƒAƒXƒyƒ‹ƒVƒI’ljÁ
+ skill_castend_nodamage_id() ƒAƒXƒyƒ‹ƒVƒIAƒvƒƒ{ƒbƒNˆ—•ÏX
+ skill_castend_id() ƒAƒXƒyƒ‹ƒVƒIˆ—•ÏX
+ skill_check_condition_char_sub() player_skill_partner_check‚ɑΉž
+ skill_check_condition_use_sub() “¯ã
+ skill_use_id() “¯ã
+ skill_check_condition() “¯ã•ƒfƒŠƒ…[ƒW‘Ήž
+ skill_status_change_timer() ƒnƒCƒfƒBƒ“ƒOC³Aƒ_ƒ“ƒX‰‰‘t‡‘t’†‚ÌSPÁ”ïŽÀ‘•
+ skill_initunitgroup() ƒ_ƒ“ƒXSPÁ”ï—p•ÏX
+ skill_status_change_start() “¯ã•ƒvƒƒ{ƒbƒN‚ðƒ{ƒX‚ÉŒø‚©‚È‚¢‚悤‚É(‚Å‚àbattle.c‚ÅŽ~‚ß‚Ä‚é‚©‚ç’Ê킱‚±‚Ü‚Å—ˆ‚È‚¢)
+
+--------------------
+//1002 by ‚Ò‚´‚Ü‚ñ
+Eƒ|[ƒ^ƒ‹ƒoƒOC³
+EƒXƒLƒ‹ŠÖŒW‚ÌNullƒ`ƒFƒbƒN‹­‰»(by(“Ê))
+ (map/)
+ skill.c
+ skill_castend_map() C³
+
+--------------------
+//1001 by (“Ê)
+E0x1c9‚Å‚¢‚­‚‚©ƒpƒPƒbƒg‚ðŒ©”ä‚ׂĕω»‚Ì‚È‚¢‚Æ‚±‚ë‚ðŒÅ’è’l‚Å–„‚ßž‚Ý(¡Œãî•ñ‚ªW‚Ü‚é‚Æ•Ï‚í‚é‰Â”\«‘å)
+Eƒ_ƒ“ƒX’†‚ÍSP‚¾‚¯‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX
+E¹‘Ì‚Å‘Š•û‚ÌSP‚ª10ˆÈ‰º‚¾‚ÆŽg—pŽ¸”s‚É‚µ‚ÄŽg—p‚µ‚½‚çSP‚ð10Œ¸‚炵‚Ä‚Ý‚é(–¢Šm”F)
+E‡‘t‚̃XƒLƒ‹Žg—pƒpƒPƒbƒg‚ðŽáŠ±•ÏX
+
+ (map/)
+ clif.c
+ clif_getareachar_skillunit() 0x1c9‚ÌŒŠ–„‚ߊJŽn
+ clif_skill_setunit() 0x1c9‚ÌŒŠ–„‚ߊJŽn
+ pc.c
+ pc_natural_heal_sub() ƒ_ƒ“ƒX’†‚ÍSP‚̂݉ñ•œ‚µ‚È‚¢‚悤‚É•ÏX
+ skill.c
+ skill_check_condition() •ÏX
+ skill_check_condition_char_sub() ¹‘Ì‚Í‘Š•û‚ÌSPƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏX
+ skill_check_condition_use_sub() ¹‘Ì‚Í‘Š•û‚ÌSP‚ðŒ¸‚ç‚·‚悤‚É•ÏX
+
+--------------------
+//1000 by ‚Ò‚´‚Ü‚ñ
+E0999‚Ì•ÏXŽæ‚è–ß‚µ
+Eƒgƒ‰ƒbƒv‚ÌŠª‚«ž‚ÝŽÀ‘•
+EƒCƒhƒDƒ“‚Ì—ÑŒç‚ÅNPC‚܂ʼnñ•œ‚µ‚½(‚悤‚ÉŒ©‚¦‚é)–â‘èC³(–¢ƒeƒXƒg)
+Eƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̃GƒtƒFƒNƒg•ÏX(‚±‚¿‚ç‚É–¾‹L)
+ (map/)
+ skill.c
+ skill_count_target() ’ljÁ
+ skill_unit_onplace()Askill_trap_splash() •ÏX
+--------------------
+//0999 by eAthena Dev Team (Yor's Fixes)
+(login/)
+ added email for accounts
+(char/)
+ added email for character deletion
+--------------------
+//0998 by (“Ê)
+Ebattle.c‚ňø”‚Ì‘¶Ý‚ðŠm”F‚¹‚¸‚É’l‚ðŒ©‚És‚Á‚Ä‚éŠÖ”‚ð‚¢‚­‚‚©C³
+Eƒ_ƒ“ƒX’†‚ÍÀ‚ê‚È‚¢‚悤‚É‚µ‚½(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>114 DoT‚³‚ñ)
+Eƒ_ƒ“ƒX’†‚ÍHPASP‚ª‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏX(“¯ã)
+Eƒ_ƒ“ƒX’†‚Í’ÊíUŒ‚‚Å‚«‚È‚¢‚悤‚É‚µ‚½(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>116 EEE‚³‚ñ)
+E‡‘t’†•Ð•û‚ª—Ž‚¿‚½ê‡AŽc‚Á‚½‚Ù‚¤‚ʼn‰‘t‚ðŒp‘±‚·‚é‚悤‚É‚µ‚½(“¯ã)
+E‡‘t’†‚̓AƒhƒŠƒuˆÈŠO‚Å‚«‚È‚¢‚悤‚É•ÏX(“¯ã)
+E‡‘t”­“®ðŒ‚Ƀ_ƒ“ƒX’†‚¶‚á‚È‚¢•À‚Á‚Ä‚¢‚È‚¢‚ð’ljÁ(–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>118 ‚ë‚낳‚ñ)
+Eˆ¢C—…Žg—pŒã‚ÉHP‚à‰ñ•œ‚µ‚È‚©‚Á‚½‚Ì‚ðC³
+
+ (map/)
+ battle.c
+ battle_counttargeted() C³
+ battle_getŒn ‚½‚Ô‚ñ‘S•”C³
+ clif.c
+ clif_parse_WalkToXY() ‡‘t‚Ì”»’f•û–@‚Ì•ÏX
+ clif_parse_ActionRequest() ƒ_ƒ“ƒX’†‚͉£‚ç‚È‚¢À‚ç‚È‚¢‚悤‚É•ÏX
+ map.c
+ map_quit() ƒ_ƒ“ƒX’†’f’ljÁ
+ mob.c
+ mob_damage() skill_stop_dancing‚̈ø”‘‰Á‚É‚æ‚é•ÏX
+ pc.c
+ pc_setpos() “¯ã
+ pc_damage() “¯ã
+ pc_equipitem() “¯ã
+ pc_natural_heal_sub() ƒ_ƒ“ƒX’†‚ÍŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ˆ¢C—…Žž‚ÍSP‚̂݉ñ•œ‚µ‚È‚¢‚悤‚É
+ skill.c
+ skill_castend_nodamage_id() skill_stop_dancing‚̈ø”‘‰Á‚É‚æ‚é•ÏX
+ skill_status_change_start() “¯ã
+ skill_check_condition_char_sub() ‘ŠŽè‚ªƒ_ƒ“ƒX’†‚âÀ‚Á‚Ä‚¢‚Ä‚à‡‘t‚Å‚«‚È‚¢‚悤‚É•ÏX
+ skill_check_condition_use_sub() “¯ã
+ skill_use_id() ‡‘t‚Ì”»’f•û–@‚Ì•ÏX•‡‘t’†‚̓AƒhƒŠƒuˆÈŠO‹ÖŽ~‚É
+ skill_status_change_end() ‡‘t‚̃_ƒ“ƒXó‘Ô‰ðœ‚Í‘ŠŽè‚Ìval4‚ð0‚É‚·‚é‚悤‚É‚µ‚½
+ skill_is_danceskill() –ß‚è’l•ÏX
+ skill_stop_dancing() ˆø”‘‰ÁA‡‘t‚ŕЕû‚¾‚¯—Ž‚¿‚½‚Æ‚«‚̈—’ljÁ
+ skill_delunitgroup() ‡‘tŽž‚̃Xƒe[ƒ^ƒX•ÏXˆ—‚ðª‚Ɉڂµ‚½
+ skill_clear_unitgroup() Ž©•ª‚Ìbl->id‚ƃ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìgroup->src_id‚ªˆá‚¤‚Æ‚«‚Í휂µ‚È‚¢‚悤‚É•ÏX
+ skill.h •ÏX
+
+--------------------
+//0997 by (“Ê)
+E“ñl‚Ň‘tAŽOl‚Ź‘Ì‚ðŽÀ‘•
+ ‡‘t ƒo[ƒhEƒ_ƒ“ƒT[‚ª—×Ú‚µ‚½ƒZƒ‹‚É‚¢‚Ä“¯‚¶ƒXƒLƒ‹‚ðŽ‚Á‚Ä‚¢‚鎞‚É”­“®
+ ƒXƒLƒ‹ƒŒƒxƒ‹‚Í—¼ŽÒ‚̃XƒLƒ‹ƒŒƒxƒ‹‚Ì’†ŠÔ
+ –{ŽIŽd—l‚ª•ª‚©‚ç‚È‚¢‚¯‚ǎ΂ߗ×Ú‚àOK
+ ¹‘Ì Žg—pŽÒ‚ÌXŽ²‚Å-1‚Æ+1‚ÌꊂɈêl‚¸‚ƒAƒRƒ‰ƒCƒg‚©ƒvƒŠ[ƒXƒg‚ª‚¢‚鎞‚É”­“®‚·‚é‚ÆŽv‚¤(–¢ƒeƒXƒg)
+ Žg—pŽÒ › ƒAƒRƒvƒŠ œ
+ OK œ›œ
+
+ NG œ
+ ›œ
+Eƒg[ƒL[ƒ{ƒbƒNƒX‚ðŽg‚Á‚ÄÝ’uŽž‚ÉÀ‚Á‚Ä‚¢‚½Žž‚̓XƒLƒ‹Žg—pŽ¸”s‚É‚µ‚Ä‚Ý‚½
+
+ (db/)
+ item_db.txt ‘º³‚ÌŽô‚¢—¦‚ð5%‚É(by e2‚³‚ñ)
+ (map/)
+ skill.c
+ skill_check_condition_char_sub() ’ljÁ
+ skill_check_condition_use_sub() ’ljÁ
+ skill_check_condition() •ÏX
+ skill_use_id() •ÏX
+ skill_initunitgroup() •ÏX
+ skill_delunitgroup() •ÏX
+ clif.c
+ clif_parse_UseSkillToPos() •ÏX
+
+--------------------
+//0996 by (“Ê)
+EƒAƒhƒŠƒu‚Ì5•b§ŒÀ‚ðcast_db.txt‚Ìupkeep_time2‚ŧŒä‚Å‚«‚é‚悤‚É•ÏX
+E‘º³‚ÅŽ©•ª‚ðŽô‚킹‚邽‚ß‚Ébonus2 bAddEff2‚ð’ljÁ
+EŽô‚í‚ê‚Ä‚¢‚ÄI—¹‚Å‚«‚È‚¢Žž‚É‚àu¡‚ÍI—¹‚Å‚«‚Ü‚¹‚ñv‚ª•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚½
+Eƒ_ƒ“ƒXƒGƒtƒFƒNƒg“™ˆÚ“®Žž‚ÉŒø‰Ê‚Ì“K—p”»’f‚ªˆÚ“®‘O‚És‚í‚ê‚Ä‚¢‚½‚Ì‚ðˆÚ“®Œã‚É•ÏX•Žg‚í‚È‚­‚Ä‚¢‚¢•Ï”‚ð”pŽ~
+
+ (db/)
+ cast_db.txt
+ const.txt
+ item_db.txt
+ (doc/)
+ item_bonus.txt
+ (src/)
+ clif.c
+ clif_parse_QuitGame() •ÏX
+ map.h addeff2,arrow_addeff2 ’ljÁ
+ pc.c
+ pc_calcstatus() •ÏX
+ pc_bonus2() •ÏX
+ skill.c
+ skill_additional_effect() •ÏX
+ skill_check_condition() •ÏX
+ skill_unit_move_unit_group() •ÏX
+
+--------------------
+//0995 by (“Ê)
+Ebattle.pet_lootitem‚̃fƒtƒHƒ‹ƒg‚ªyes‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
+Ebattle.pet_lootitem‚Ì“K—p‚ðforeach‘O‚Å‚â‚é‚悤‚ÉC³
+Eƒyƒbƒg‚̉Šú‰»‚Åpd->lootitem‚ª‚ ‚鎞‚µ‚©‰Šú‰»‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
+E—̈悪ˆÚ“®‚µ‚Ä‘ÎÛ‚ª—̈悩‚甲‚¯‚Ä‚àŒø‰Ê‚ª‰ðœ‚³‚ê‚È‚¢–â‘è‚ðC³
+EƒAƒhƒŠƒu‚̓_ƒ“ƒX”­“®‚©‚ç5•bˆÈãŒo‚½‚È‚¢‚ÆŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+
+ (map/)
+ pet.c
+ pet_data_init() C³
+ pet_ai_sub_hard() C³
+ pet_ai_sub_hard_lootsearch() C³
+ skill.c
+ skill_blown() •ÏX
+ skill_unit_onlimit() ƒGƒ‰[ƒƒbƒZ[ƒWC³
+ skill_check_condition() •ÏX
+ skill_initunitgroup() sd_data[SC_DANCING].val3‚Égettick()
+ skill_unit_move_unit_group_sub() ’ljÁ
+ skill_unit_move_unit_group() •ÏX
+ skill.h skill_unit_move_unit_group() ˆø”•ÏX
+ battle.c
+ battle_config_read() pet_lootitem=0‚ÉC³
+ pc.c
+ pc_walk() •ÏX
+
+--------------------
+//0994 by huge
+Ebattle.pet_lootitem‚ª“K‰ž‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
+Eƒyƒbƒg‚ɃpƒtƒH[ƒ}ƒ“ƒX‚ð‚³‚¹‚½ŒãA10•bŠÔ‚­‚ç‚¢‚ÍE‚킹‚È‚¢‚悤‚ÉB
+
+ (map/)
+ map.h pet_data‚Élootitem_timer’ljÁB
+ pet.c
+ pet_ai_sub_hard_lootsearch() C³B
+ pet_lootitem_drop() C³B
+
+--------------------
+//0993 by (“Ê)
+Eˆêl‚Ň‘t‚¾‚¯‚LJ‘tƒXƒLƒ‹’†‚Í“®‚¯‚È‚¢‚悤‚É
+EƒAƒ“ƒR[ƒ‹ŽÀ‘•B’¼‘O‚ÉŽg‚Á‚½ƒ_ƒ“ƒXƒXƒLƒ‹‚𔼕ª‚ÌSP‚ÅŽg‚¦‚Ü‚·
+Eƒ_ƒ“ƒX’†‚Ɉړ®‚·‚é‚ƃGƒtƒFƒNƒg‚àˆÚ“®‚·‚é‚悤‚É‚µ‚½
+E–¢ŽÀ‘•‚̃XƒLƒ‹‚ªŽg‚í‚ê‚é‚ÆUnknown skill‚Æ•\Ž¦‚³‚ê‚邱‚Æ‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
+ESage‚̃LƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚ÅŽÀ‚Í‘O‚̃XƒLƒ‹‚ðŠo‚¦‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ÌC³
+
+ (map/)
+ clif.c
+ clif_parse_WalkToXY() •ÏX
+ map.h ƒAƒ“ƒR[ƒ‹—p•Ï”‚̒ljÁ
+ pc.c
+ pc_walk()
+ skill.c
+ skill_blown
+ skill_castend_nodamage_id
+ skill_unitsetting() •ÏX
+ skill_unit_onplace() ã©‚Å“¯‚¶ˆ—‚ð‚µ‚Ä‚¢‚écase‚ð‚Ü‚Æ‚ß‚½
+ skill_unit_onout() Žg‚í‚ê‚Ä‚È‚¢unit2‚ðíœ
+ skill_check_condition() •ÏX
+ skill_use_id
+ skill_initunitgroup() Žg‚Á‚½ƒ_ƒ“ƒXƒXƒLƒ‹‚ð•Ï”‚É“ü‚ê‚é‚悤‚É‚µ‚½
+ skill_unit_move_unit_group() ’ljÁ
+ skill.h •ÏX
+
+--------------------
+//0992 by nokia
+
+map_quit‚ðC³‚µ‚ăƒ‚ƒŠ‚ðŽß•ú‚·‚鎞‰½“x‚à‚ðŽß•ú‚·‚邽‚߃ƒ‚ƒŠ‚̊ԈႢ‚ª‹N‚±‚é–â‘è‚𵂭
+
+ (map/)
+ map.c
+ map_quit()
+
+--------------------
+//0991 by (“Ê)
+Eƒg[ƒL[ƒ{ƒbƒNƒX‚ðŽ©•ª‚ª“¥‚ñ‚Å‚à”­“®‚µ‚È‚¢–{ŽIŽd—l‚É•ÏX
+EƒXƒLƒ‹‰r¥’†‚ƃfƒBƒŒƒC’†‚̓Nƒ‰ƒCƒAƒ“ƒg‚ðI—¹‚Å‚«‚È‚¢‚悤‚É‚µ‚½‚¯‚ÇA“G‚ÉUŒ‚‚³‚ê‚Ä‚¢‚é‚Æ‚«‚ÍI—¹‚Å‚«‚Ü‚·(‚²‚ß‚ñ‚È‚³‚¢‚ÁII)
+
+ (map/)
+ clif.c
+ clif_parse_QuitGame() •ÏX
+ skill.c
+ skill_unitsetting() •ÏX
+
+--------------------
+//0990 by ‚Ò‚´‚Ü‚ñ
+Eˆê•”‚̃gƒ‰ƒbƒv‚ð”͈ÍUŒ‚‚É•ÏXiŠª‚«ž‚Ý‚Í–¢ŽÀ‘•jB
+Emapflag‚Épvp_nocalcrank‚Æpvp_nightmaredrop’ljÁB
+ E<gatname><tab>mapflag<tab>pvp_nocalcrank<tab>dummy
+ @PvP‚É‚æ‚郉ƒ“ƒLƒ“ƒOŒvŽZ‚ð‚µ‚È‚¢‚悤‚É‚µ‚Ü‚·B
+ E<gatname><tab>mapflag<tab>pvp_nightmaredrop<tab><item>,<type>,<per>
+ @PvP‚É‚ÄŽ€–S‚µ‚½ê‡A<per>‚ÌŠm—¦‚ŃAƒCƒeƒ€‚ðƒhƒƒbƒv‚µ‚Ü‚·B
+ @<item>: ƒhƒƒbƒv‚·‚éƒAƒCƒeƒ€ID‚ðŽw’肵‚Ü‚·Brandom‚Æ‹Lq‚·‚é‚ÆŠŽ•i‚©‚烉ƒ“ƒ_ƒ€‚Ƀhƒƒbƒv‚µ‚Ü‚·B
+ @<type>: ƒhƒƒbƒv‚·‚éƒAƒCƒeƒ€‚̃^ƒCƒv‚ðŽw’肵‚Ü‚·Binventory:ŠŽ•i equip:‘•”õ•i all:‘S•”
+ @<per>: ƒhƒƒbƒv‚·‚éŠm—¦‚Å‚·B–œ•ª—¦‚ÅŽw’肵‚Ü‚·B
+ (map/)
+ skill.c
+ skill_unit_onplace() •ÏX
+ skill_trap_splash() ’ljÁ
+ pc.c
+ pc_damage() •ÏX
+ npc.c
+ npc_parse_mapflag() •ÏX
+ map.h
+ map_data‚Ƀƒ“ƒo’ljÁ
+ (conf/)
+ mapflag.txt
+ ƒiƒCƒgƒƒAƒ‚[ƒh‚ɃhƒƒbƒvÝ’è’ljÁ
+
+--------------------
+//0989 by (“Ê)
+EƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv‚ð–^Š‚ÅŒ©‚½SS‚ðŒ³‚ÉŽÀ‘•‚µ‚Ä‚Ý‚½Bˆá‚Á‚½‚ç‘ŠˆáƒXƒŒ‚Ö
+EƒfƒBƒeƒNƒeƒBƒ“ƒO‚ð–^Š‚ÅŒ©‚½‰ðà•¶‚ðŒ³‚ÉŽÀ‘•‚µ‚Ä‚Ý‚½Bˆá‚Á‚½‚ç‘ŠˆáƒXƒŒ‚Ö
+EƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹Žž‚Ìdelete_timerƒGƒ‰[‚ɒljÁ‚ŃXƒLƒ‹ID‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚½B‚ ‚킹‚Ä•ñ‚·‚é‚ƃGƒ‰[‚ÌŒ´ˆö‚ª•ª‚©‚é‚©‚à
+
+ (map/)
+ skill.c
+ skill_castend_nodamage_id() •ÏX
+ skill_castend_pos2() •ÏX
+ skill_castcancel() •ÏX
+
+--------------------
+//0988 by (“Ê)
+Eƒg[ƒL[ƒ{ƒbƒNƒX‚Íí‚É‘«Œ³‚É’u‚¯‚é‚悤‚É•ÏX‚ÆKalen‚³‚ñ‚É–á‚Á‚½î•ñ“™‚ðŒ³‚ÉƒpƒPƒbƒg‚ð–{ŽI‚É‚ ‚킹‚Ä‚Ý‚½
+EƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv‚ÉŒø‰Ê‚ð’ljÁ‚µ‚½‚‚à‚è(–¢Šm”F)
+Eƒuƒ‰ƒXƒgƒ}ƒCƒ“‚ƃNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv‚ð‰£‚é‚Æ‚«”ò‚Ԃ悤‚É‚µ‚½
+EƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚Åã©(skill_require_db‚ÅŽw’肵‚½ƒAƒCƒeƒ€)‚ð‰ñŽû‚Å‚«‚é‚悤‚É‚µ‚½
+Eª‚ÌŽÀ‘•‚É‚æ‚èã©‚ÌŽžŠÔØ‚ê‚Åã©‚ªo‚éƒIƒŠƒWƒiƒ‹Žd—l‚̓Rƒƒ“ƒgƒAƒEƒg
+Eƒuƒ‰ƒXƒgƒ}ƒCƒ“‚ÌŒø‰ÊŽžŠÔ‚ª’·‚¢‚Ì‚ðC³
+
+ (db/)
+ cast_db.txt
+ (map/)
+ battle.c
+ battle_check_target() •ÏX
+ mob.c
+ mobskill_castend_pos() •ÏX
+ skill.c
+ skill_additional_effect() •ÏX
+ skill_blown() •ÏX
+ skill_castend_nodamage_id() •ÏX
+ skill_castend_pos2() •ÏX
+ skill_unitsetting() •ÏX
+ skill_unit_onplace() •ÏX
+ skill_unit_ondamaged() •ÏX
+ skill_castend_pos() •ÏX
+ skill_unit_timer_sub() •ÏX
+
+--------------------
+//0987 by ŒÓ’±—–
+
+Eƒ†[ƒU[’è‹`ŠÖ”/ƒTƒuƒ‹[ƒeƒBƒ“‚Ɉø”‚ðŽw’è‰Â”\‚É
+ Ú‚µ‚­‚Í script_ref.txt ‚ðŽQÆ
+
+ (map/)
+ scirpt.c
+ buildin_getarg()’ljÁ
+ buildin_callsub(),buildin_callfunc(),run_func()C³
+ (doc/)
+ script_ref.txt
+ ˆø”‚ɂ‚¢‚Ä‚Ìà–¾’ljÁ
+
+Egetguildname,getpartyname,getcastlename,strcharinfoC³
+ C_STR‚Œ蔕¶Žš—ñ(C_CONSTSTR)‚ð•Ô‚µ‚Ä‚¢‚½–â‘èC³
+ strcharinfo‚ŃMƒ‹ƒh–¼‚È‚Ç‚ðŠ“¾‚·‚éÛA–¢Š‘®‚¾‚Á‚½‚Æ‚«‚Ì–â‘è
+
+ (map/)
+ script.c
+ buildin_getguildname(),buildin_getpartyname()
+ buildin_getcastlename(),buildin_strcharinfo()
+
+--------------------
+//0986 by (“Ê)
+Eclient_packet‚Ì‹Lq‚©‚ç„Ž@‚µ‚ăg[ƒL[ƒ{ƒbƒNƒX‚ðŽÀ‘•‚µ‚Ä‚Ý‚½‚‚à‚è
+
+ (db/)
+ skill_db.txt
+ (map/)
+ clif.c
+ clif_talkiebox() ’ljÁ
+ clif_parse_UseSkillToPos() •ÏX
+ clif_parse() •ÏX
+ clif.h •ÏX
+ map.h •ÏX
+ skill.c
+ skill_castend_pos2() •ÏX
+ skill_unitsetting() •ÏX
+ skill_unit_onplace() •ÏX
+
+--------------------
+//0985 by (“Ê)
+EƒT[ƒo[snapshot
+E/script/extension‚ÉŒê‚è•”‚ð’ljÁ‚µ‚½‚è
+E0984‚ÅAthenaŽG’kƒXƒŒƒbƒh part3>>92 Michael‚³‚ñ‚ÌC³‚ðŽæ‚èž‚ñ‚Å‚½
+EƒoƒO•ñƒXƒŒƒbƒh part5 >>45‚É“]Ú‚³‚ê‚Ä‚½ ‚ ‚â‚Ë‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
+EƒoƒO•ñƒXƒŒƒbƒh part5 >>54 rari‚³‚ñ‚Ì‚½‚Ê‚«–XC³‚ðŽæ‚èž‚Ý
+
+ (script/extension/)
+ npc_event_kataribe6.txt ’ljÁ
+ npc_event_kataribe7.txt ’ljÁ
+ (script/npc/)
+ quest/npc_event_hat.txt C³
+ job/npc_job_magician.txt C³
+
+--------------------
+//0984 by (“Ê)
+EƒZ[ƒW‚̃tƒŠ[ƒLƒƒƒXƒg‚Æ‚¢‚¤ƒXƒLƒ‹‚Ì‘¶Ý‚ð’m‚ç‚È‚©‚Á‚½‚Ì‚Å0983‚Ì•ÏX‚ðˆê•”–ß‚µ
+EƒAƒCƒeƒ€XV‚µ‚½‚¯‚Ç‚‚ê”L‚ƃCƒ“ƒfƒBƒAƒ“ƒoƒ“ƒ_ƒi‚ª‘•”õ‚Å‚«‚È‚¢H
+Eƒ}ƒbƒvƒtƒ‰ƒO‚ƃ‚ƒ“ƒXƒ^[”z’u‚ðÅV”Å‚É
+
+ (db/)
+ item_db.txt
+ (conf/)
+ mapflag.txt
+ (script/mob/)
+ npc_monster.txt
+ (map/)
+ clif.c
+ clif_parse_WalkToXY() C³
+
+--------------------
+//0983 by (“Ê)
+E’·‚¢‰r¥’†‚É•à‚«‚Ü‚í‚ꂽ‹C‚ª‚·‚é‚Ì‚ÅC³
+Eƒyƒbƒgƒ‹[ƒŒƒbƒg‰ñ“]’†‚É‘ÎÛ‚ª’@‚«ŽE‚³‚ꂽ‚çmap-server‚ª¢‚é‚Ì‚ðC³
+EƒvƒƒtƒFƒbƒT[ ƒ‰ƒCƒt’u‚«Š·‚¦‚̎蔲‚«ˆ—‚ð‚¿‚å‚Á‚ƃ}ƒV‚É‚µ‚½
+
+ (map/)
+ clif.c
+ clif_parse_WalkToXY() C³
+ pet.c
+ pet_catch_process2() C³
+ skill.c
+ skill_castend_nodamage_id() C³
+
+--------------------
+//0982 by (“Ê)
+E“]¶ƒXƒLƒ‹‚Ì`
+ ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ‘ŠŽè‚ªPC‚Ìꇂ͌•‚¶‚á‚È‚¯‚ê‚Î’µ‚Ë•Ô‚³‚È‚¢—\’è
+ ƒvƒƒtƒFƒbƒT[ ƒƒ‚ƒ‰ƒCƒY 12•b‚̌ŒèƒLƒƒƒXƒgƒ^ƒCƒ€A‚»‚ÌŒãƒXƒLƒ‹Žg—p‚̃LƒƒƒXƒgƒ^ƒCƒ€‚ª3‰ñ‚¾‚¯1/3‚É‚È‚é
+ ƒvƒƒtƒFƒbƒT[ ƒ‰ƒCƒt’u‚«Š·‚¦ HP‚ð10%Œ¸‚炵‚ÄSP‚ð‘‚â‚·BŒ¸‚Á‚½HP‚̃GƒtƒFƒNƒg‚Í–³‚µ‚É‚µ‚Ä‚Ý‚½
+EŒ©Ø‚è‚Ɖñ”𗦑‰Á‚ÌFlee㸂ªƒXƒe[ƒ^ƒX•Ï‰»Žž‚É‚µ‚©”½‰f‚³‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³
+E0981‚ÅŽ©•ªˆÈŠO‚Í•à‚¢‚½‚ç•ž‚ÌF‚ª–ß‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð‚È‚ñ‚Æ‚©‚µ‚½‚‚à‚è
+
+ (db/)
+ skill_require_db.txt
+ (map/)
+ battle.c
+ battle_calc_damage() C³
+ clif.c
+ clif_movechar() C³
+ clif_getareachar_pc() C³
+ pc.c
+ pc_calcstatus() C³
+ skill.c
+ SkillStatusChangeTable •ÏX
+ skill_castend_nodamage_id() •ÏX
+ skill_use_id() •ÏX
+ skill_use_pos() •ÏX
+ skill_status_change_timer() •ÏX
+ skill_status_change_start() •ÏX
+ skill.h •ÏX
+
+--------------------
+//0981 by (“Ê)
+E“]¶ƒXƒLƒ‹‚Ì`
+ ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ˆê’èŠm—¦‚Ń_ƒ[ƒW‚𔼕ª‚É‚µ‚ÄŒ¸‚炵‚½•ª‚ð‘ŠŽè‚É’µ‚Ë•Ô‚·‚悤‚É‚µ‚½c‚ªA’µ‚Ë•Ô‚µ‚½ƒ_ƒ[ƒW‚̃GƒtƒFƒNƒgo‚Ü‚¹‚ñ
+E•ž‚ÌF‚ð•ÏX••Û‘¶‚µ‚Ä‚¢‚éꇂɃŠƒƒO‚·‚é‚ÆŒ³‚ÌF‚É–ß‚Á‚Ä‚é‚悤‚ÉŒ©‚¦‚é–â‘è‚ÌC³
+
+ (db/)
+ skill_db.txt
+ (map/)
+ clif.c
+ clif_parse_LoadEndAck() C³
+ battle.c
+ battle_calc_damage() C³
+ skill.c
+ skill_status_change_timer() C³
+ skill_status_change_start() C³
+
+--------------------
+//0980 by (“Ê)
+E—á‚É‚æ‚Á‚Ä“]¶ƒXƒLƒ‹‚ƃ‚ƒ“ƒNŠÖ˜A
+ ƒXƒiƒCƒp[ ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO ƒNƒŠƒeƒBƒJƒ‹—¦’²®H
+ ƒnƒCƒEƒBƒU[ƒh ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ MSP‘—Ê‚ÆMob‚ð“|‚µ‚½‚Æ‚«‚ÉSP(mobLv*(65+15*SkillLv)/100)‰ñ•œB‚Å‚à–{“–‚͔͈ÍUŒ‚‚Ìꇂ͉ñ•œ‚µ‚È‚¢‚炵‚¢H
+ ƒnƒCƒEƒBƒU[ƒh –‚–@—Í‘• Žg‚Á‚½‚çMATK‚ªSkillLv%‘—ÊBŽŸ‚̃XƒLƒ‹Žg—pŽž‚ÉŒ³‚É–ß‚é
+ ƒ‚ƒ“ƒN ‹C’D ‚¿‚å‚Á‚ÆæŽæ‚肵‚Ä20%‚ÌŠm—¦‚Å“G‚ÌLv*2‚ÌSP‚ð‹zŽûB¬Œ÷‚µ‚½‚Æ‚«‚̓^[ƒQƒbƒg‚ðŽæ“¾‚·‚é‚悤‚É‚µ‚Ä‚Ý‚½
+EƒAƒCƒeƒ€–¼‚ðjROƒEƒ“ƒoƒ‰‚É€‹’‚³‚¹‚Ä‚Ý‚½‚‚à‚è
+
+ (db/)
+ cast_db.txt
+ item_db.txt
+ (map/)
+ battle.c
+ battle_calc_pc_weapon_attack() •ÏX
+ mob.c
+ mob_damage() •ÏX
+ pc.c
+ pc_calcstatus() •ÏX
+ skill.c
+ skill_castend_nodamage_id() •ÏX
+ skill_use_id() •ÏX
+ skill_use_pos() •ÏX
+ skill_status_change_end() •ÏX
+ skill_status_change_timer() •ÏX
+ skill_status_change_start() •ÏX
+
+--------------------
+//0979 by (“Ê)
+E“]¶ƒXƒLƒ‹‚ð‚¿‚å‚Á‚Æ’²®
+ ƒnƒCƒEƒBƒU[ƒh ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[ •ŠíUŒ‚‚ÅBaseATKŒvŽZ‚ðMATK2‚Å‚µ‚Ä‚Ý‚é
+E‘§‚ð–{ŽIŽd—l•—‚ÉHP‚ÆSP‚̉ñ•œƒ^ƒCƒ}[‚𕪂¯‚ÄÀ‚Á‚Ä‚¢‚È‚­‚Ä‚à“®‚©‚È‚¯‚ê‚΃^ƒCƒ}[‚ªi‚ނ悤‚É‚µ‚½
+Eˆ¢C—…Žg—pŒã‚ÉHP‚ÆSP‚ª5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢–{ŽIŽg—p•—‚É‚µ‚½(csat_db.txt‚Ìupkeep_time2‚Å’²®‰Â”\)
+EŒÃ‚¢gcc‚Åskill_unit_timer_sub_onplace()‚ ‚½‚è‚ŃRƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚Á‚½‚Ì‚ðC³
+
+ (db/)
+ cast_db.txt
+ (map/)
+ battle.c
+ battle_calc_pet_weapon_attack() •ÏX
+ battle_calc_mob_weapon_attack() •ÏX
+ battle_calc_pc_weapon_attack() •ÏX
+ map.h
+ pc.c
+ pc_authok() •ÏX
+ pc_walk() •ÏX
+ pc_spirit_heal() íœ
+ pc_spirit_heal_hp() ’ljÁ
+ pc_spirit_heal_sp() ’ljÁ
+ pc_natural_heal_sub() •ÏX
+ skill.c
+ skill_additional_effect() •ÏX
+ skill_castend_damage_id() •ÏX
+ skill_status_change_start() •ÏX
+ skill_unit_timer_sub_onplace() C³
+
+--------------------
+//0978 by (“Ê)
+E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
+ ƒXƒiƒCƒp[ ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg ‚Æ‚è‚ ‚¦‚¸”ò‚Ô‚¾‚¯‚¾‚ÆŽv‚Á‚Ä‚­‚¾‚³‚¢
+ ƒXƒiƒCƒp[ ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO ƒ_ƒ[ƒW‘‰Á‚¾‚¯‚Ç1‘Ì‚¾‚¯
+ ƒNƒ‰ƒEƒ“EƒWƒvƒV[ ƒAƒ[ƒoƒ‹ƒJƒ“ ƒ_ƒ[ƒW‘‰Á‚Æ9‰ñUŒ‚
+ ƒnƒCƒEƒBƒU[ƒh ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[ ƒGƒtƒFƒNƒg‚¾‚¯
+
+EƒAƒCƒeƒ€ŒðŠ·‚Åd—Ê‚ÌŒvŽZ‚ªˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
+ (doc/)
+ client_packet.txt ƒpƒPƒbƒg’·ƒe[ƒuƒ‹XV
+ (map/)
+ battle.c
+ battle_calc_misc_attack() •ÏX
+ battle_calc_pet_weapon_attack() •ÏX
+ battle_calc_mob_weapon_attack() •ÏX
+ battle_calc_pc_weapon_attack() •ÏX
+ clif.c ƒpƒPƒbƒg’·‚Ì’è‹`‚ðXV
+ skill.c
+ skill_castend_damage_id() •ÏX
+ trade.c
+ trade_tradeadditem() C³
+
+--------------------
+//0977 by (“Ê)
+E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
+ ƒAƒTƒVƒ“ƒNƒƒX ƒƒeƒIƒAƒTƒ‹ƒg ƒGƒtƒFƒNƒg‚ªˆá‚¤H
+ ƒ[ƒhƒiƒCƒg ƒvƒŒƒbƒVƒƒ[ •K’†ƒ_ƒ[ƒW‚É‚µ‚Ä‚Ý‚½
+ ƒ[ƒhƒiƒCƒg ƒI[ƒ‰ƒuƒŒ[ƒh‚Ì•K’†damage2‚ª‘¼‚Å‚à“K—p‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³
+ ƒ[ƒhƒiƒCƒg ƒSƒXƒyƒ‹ ƒGƒtƒFƒNƒgoŒ»ˆÊ’u‚Ì’²®
+ ƒnƒCƒvƒŠ[ƒXƒg ƒAƒVƒƒƒ“ƒvƒeƒBƒI Œø‰ÊŽÀ‘•
+ ƒnƒCƒvƒŠ[ƒXƒg ƒƒfƒBƒeƒCƒeƒBƒI Œø‰ÊŽÀ‘•
+ ƒnƒCƒvƒŠ[ƒXƒg ƒoƒWƒŠƒJ SG‚Ý‚½‚¢‚ÉMob‚ªN“ü‚µ‚悤‚Æ‚·‚é‚Æ‚«”ò‚΂³‚ê‚é‚悤‚É‚µ‚½
+ ƒzƒƒCƒgƒXƒ~ƒX ƒJ[ƒgƒu[ƒXƒg Œø‰ÊŽÀ‘•
+ ƒzƒƒCƒgƒXƒ~ƒX ƒƒ‹ƒgƒ_ƒEƒ“ ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
+ ƒzƒƒCƒgƒXƒ~ƒX ƒNƒŠƒGƒCƒgƒRƒCƒ“ –¼‘O“ü‚è‚Ì‹à‰Ý‚Æ‚©ì‚ê‚邾‚¯
+ ƒXƒg[ƒJ[ ƒŠƒWƒFƒNƒgƒ\[ƒh ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
+ ƒNƒ‰ƒEƒ“EƒWƒvƒV[ ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹ ƒGƒtƒFƒNƒg‚Æó‘ÔˆÙ펞ŠÔ‚¾‚¯(ŽÀÛ‚Ìó‘ԕω»‚Í–³‚µ)
+ ƒvƒƒtƒFƒbƒT[ ƒtƒHƒOƒEƒH[ƒ‹ ƒGƒtƒFƒNƒg‚Æ—LŒøŽžŠÔ‚¾‚¯
+ ƒXƒiƒCƒp[ ƒEƒCƒ“ƒhƒEƒH[ƒN ‘¬“x㸂ÆQMAŽ„‚ð–Y‚ê‚È‚¢‚Å‚ª‚©‚©‚é‚Ɖ𜂳‚ê‚é‚悤‚É‚µ‚½
+ ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg QMAŽ„‚ð–Y‚ê‚È‚¢‚łʼn𜂳‚ê‚é‚悤‚É‚µ‚Ä‚Ý‚½
+EƒgƒDƒ‹[ƒTƒCƒg‚Ì’Ô‚èŠÔˆá‚¢‚ðC³
+Estorage.c‚ŃRƒ“ƒpƒCƒ‹Œx‚ªo‚È‚¢‚悤‚É‚µ‚½‚‚à‚è
+
+ (db/)
+ cast_db.txt
+ skill_db.txt
+ skill_require_db.txt
+ produce_db.txt
+ (map/)
+ battle.c
+ battle_get_str() C³
+ battle_get_agi() C³
+ battle_get_vit() C³
+ battle_get_int() C³
+ battle_get_dex() C³
+ battle_get_luk() C³
+ battle_get_flee() C³
+ battle_get_hit() C³
+ battle_get_critical() C³
+ battle_get_baseatk() C³
+ battle_get_atk() C³
+ battle_get_atk2() C³
+ battle_get_def() C³
+ battle_get_def2() C³
+ battle_get_speed() C³
+ battle_calc_damage() C³
+ battle_calc_pet_weapon_attack() •ÏX
+ battle_calc_mob_weapon_attack() •ÏX
+ battle_calc_pc_weapon_attack() •ÏX
+ pc.c
+ pc_calcstatus() C³
+ skill.c
+ skill_get_unit_id() C³
+ skill_additional_effect() C³
+ skill_castend_nodamage_id() C³
+ skill_castend_pos2() C³
+ skill_unit_group() C³
+ skill_unit_onplace() C³
+ skill_unit_onout() C³
+ skill_castend_pos() C³
+ skill_check_condition() C³
+ skill_status_change_end() C³
+ skill_status_change_start() C³
+ skill_can_produce_mix() C³
+ skill_produce_mix() C³
+ skill.h C³
+ storage.c
+ storage_comp_item() C³
+ storage.h C³
+
+--------------------
+//0976 by (“Ê)
+E“]¶ƒXƒLƒ‹‚ðC³‚µ‚½‚èFX
+E€”õ‚¾‚¯‚µ‚ÄŽÀ‘•‚Å‚«‚Ä‚È‚¢ƒXƒLƒ‹‚à‚ ‚è‚Ü‚·
+ ƒ[ƒhƒiƒCƒg ƒI[ƒ‰ƒuƒŒ[ƒh ‘½•ª‚±‚ñ‚ÈŠ´‚¶H
+ ƒ[ƒhƒiƒCƒg ƒpƒŠƒCƒ“ƒO ’µ‚Ë•Ô‚·‚¯‚ÇUŒ‚‚ð1‰ñŽ~‚ß‚é‚Ì‚Í–¢ŽÀ‘•
+ ƒ[ƒhƒiƒCƒg ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ ƒCƒ“ƒfƒ…ƒA`‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å•ú’u
+ ƒ[ƒhƒiƒCƒg ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX ’Êíƒ_ƒ[ƒW‘‰Á‚Æd—ʃ_ƒ[ƒW‘‰Á‚ƈꉞ5‰ñUŒ‚(‚È‚ñ‚©ˆá‚¤‹C‚ª‚·‚é)
+ ƒ[ƒhƒiƒCƒg ƒwƒbƒhƒNƒ‰ƒbƒVƒ… ƒ_ƒ[ƒW‘‰Á‚ƃXƒe[ƒ^ƒX•ÏXH
+ ƒ[ƒhƒiƒCƒg ƒWƒ‡ƒCƒ“ƒgƒr[ƒg ƒ_ƒ[ƒW‘‰Á‚ƃXƒe[ƒ^ƒX•ÏXH
+ ƒAƒTƒVƒ“ƒNƒƒX ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹† ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H
+ ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H
+ ƒXƒiƒCƒp[ ƒEƒBƒ“ƒhƒEƒH[ƒN ‚½‚Ô‚ñ‚±‚ñ‚ÈŠ´‚¶H‚Å‚à‘¬“x㸂Ƃ©‚Æ‹£‡‚µ‚½Žž‚̈—‚Í–¢ŽÀ‘•
+ ƒXƒpƒCƒ_[ƒEƒFƒbƒu ‚Æ‚è‚ ‚¦‚¸ƒAƒ“ƒNƒ‹ƒXƒlƒA‚Æ“¯‚¶‚悤‚ÈŠ´‚¶•‰ñ”𗦔¼Œ¸
+ ƒ`ƒƒƒ“ƒsƒIƒ“ ‹¶‹CŒ÷ “K“–‚É‘‚₵‚Ä‚¢‚½‚Ì‚ð‚¿‚á‚ñ‚Æ‘‚â‚·‚悤‚É‚µ‚½
+EoŒŒó‘Ô‚ÆœÜó‘Ô‚ÌŽæ‚舵‚¢‚ª‚æ‚­‚í‚©‚è‚Ü‚¹‚ñ‚ÁII
+
+ (db/)
+ cast_db.txt
+ skill_db.txt
+ skill_require_db.txt
+ (doc/)
+ db_ref.txt
+ (map/)
+ battle.c
+ battle_get_str() C³
+ battle_get_agi() C³
+ battle_get_vit() C³
+ battle_get_int() C³
+ battle_get_dex() C³
+ battle_get_luk() C³
+ battle_get_flee() C³
+ battle_get_hit() C³
+ battle_get_critical() C³
+ battle_get_baseatk() C³
+ battle_get_atk() C³
+ battle_get_atk2() C³
+ battle_get_def() C³
+ battle_get_def2() C³
+ battle_get_speed() C³
+ battle_calc_damage() C³
+ clif.c
+ clif_parse_WalkToXY() C³
+ mob.c
+ mob_can_move() C³
+ mobskill_castend_pos() C³
+ pc.c
+ pc_calcstatus() C³
+ pc_checkallowskill() C³
+ skill.c
+ skill_get_unit_id() C³
+ skill_additional_effect() C³
+ skill_castend_nodamage_id() C³
+ skill_castend_pos2() C³
+ skill_unit_group() C³
+ skill_unit_onplace() C³
+ skill_unit_onout() C³
+ skill_castend_pos() C³
+ skill_check_condition() C³
+ skill_status_change_end() C³
+ skill_status_change_start() C³
+ skill_readdb() C³
+ skill.h C³
+--------------------
+//0975 by Sin
+E0973‚ÅŽÀ‘•‚³‚ꂽƒXƒNƒŠƒvƒg‚É‚æ‚éBaseLv, JobLv‚Ì•ÏXŽž‚ÉA
+@ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚âƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽæ“¾‚Å‚«‚é‚悤‚ÉC³B
+@¦Ž¿–âƒXƒŒpart5 >>115 ”Y‚ß‚él ‚³‚ñ‚Ìpc.c‚ðŽQl‚É‚³‚¹‚Ä’¸‚«‚Ü‚µ‚½B‘½ŽÓB
+
+ (map/)
+ pc.c
+ pc_setparam()
+ case SP_BASELEVEL: C³
+ case SP_JOBLEVEL: C³
+--------------------
+//0974 by latte
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚ð–{ŽI‚ÉŠî‚«C³
+ ƒAƒ“ƒfƒbƒhˆ«–‚‹­§ˆÃˆÅ•t—^
+ ”½“®ƒ_ƒ[ƒW”¼Œ¸Aƒ‚[ƒVƒ‡ƒ“‚È‚µ
+ MOB(PC)‚ªd‚È‚Á‚½‚Æ‚«‚ÌHIT”
+ %UPŒn•ŠíƒJ[ƒhŒø‰Ê‚È‚µ
+ ‘®«‘Š«“ñdŒvŽZ
+ MOBƒ_ƒ[ƒW•\Ž¦”’
+
+ Œã”¼4€–Ú‚ÍÝ’è‰Â
+
+E퓬Šî–{ŒvŽZ‚ð–{ŽI‚ÉŠî‚«”÷C³iDEXƒTƒCƒY•â³A‹|Å’áƒ_ƒAPCƒTƒCƒY•â³j
+
+EŠ®‘S‰ñ”ð
+ ƒXƒ^ƒ““™‚ÅŠ®‘S‰ñ”ð‚ª”­¶‚µ‚È‚©‚Á‚½‚Ì‚ðC³
+ AGIVITƒyƒiƒ‹ƒeƒB‚ªŠ®‘S‰ñ”ð‚Ì“G‚àƒJƒEƒ“ƒg‚µ‚ÄŒvŽZ‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³@Ý’è‰Â
+ ƒI[ƒgƒJƒEƒ“ƒ^[‚Í–¢C³
+
+E‘qŒÉ‚ð•Â‚¶‚é‚Æ‚«AƒAƒCƒeƒ€ID‚Ń\[ƒg‚·‚é‚悤‚É‚µ‚½
+
+Ekalen‚³‚ñ‚̃vƒ‚PŽ·Ž–NPCƒXƒNƒŠƒvƒg‚ð‰ü‘¢‚µ‚Ä
+ ¤‹Æ–h‰q’lA“ŠŽ‘‹àŠzA•ó” ‚Ì”‚ð–{ŽI‚É€‹’(¤‹Æ’l‚Í1~100)
+ ‘SÔ‚ÉÝ’u
+
+ (/script/npc)
+ aldeg_cas01.txt ... prtg_cas05.txt C³
+ (/script/npc/gvg)
+ aldeg_cas01.txt ... prtg_cas05.txt ’ljÁ
+ tbox.txt ’ljÁ
+
+ (/conf)
+ battle_athena.conf
+ 6€–ڒljÁ
+
+ (/map)
+ mob.c/mob.h
+ mob_attack() C³
+ mob_counttargeted_sub(),mob_counttargeted() C³
+ mobskill_use() C³iª‚̈ø”‚¾‚¯j
+ pc.c/pc.h
+ pc_counttargeted_sub(),pc_counttargeted() C³
+ pc_attack_timer() C³
+ pet.c
+ pet_attack() C³
+
+ map.h
+ pc_data, mob_data, map_data •Ï”‚P‚’ljÁ
+ enum1‚’ljÁ
+ map.c/map.h
+ map_count_oncell() ’ljÁ skill.c‚Å‚æ‚©‚Á‚½‚©‚àEEE
+
+ skill.c
+ GXŠÖ˜AC³(skill_additional_effect(), skill_attack(), skill_castend_damage_id(), skill_unit_onplace())
+
+ battle.c C³
+ battle.h C³
+
+ storage.c/storage.h
+ storage_comp_item() ’ljÁ
+ sortage_sortitem(), sortage_gsortitem() ’ljÁ
+ storage_storageclose(), storage_guild_storageclose() C³
+--------------------
+//0973 by Ž‚Žqo^.^o
+EƒXƒNƒŠƒvƒg‚ÌBASELEVEL,JOBLEVEL–½—ߒljÁ
+ —á: set BASELEVEL,1;
+ —á: set JOBLEVEL,1;
+ (map/)
+ pc.c
+ pc_setparam()
+ case SP_BASELEVEL: €–ڒljÁ
+ case SP_JOBLEVEL: €–ڒljÁ
+
+--------------------
+//0972 by (“Ê)
+E“]¶ƒXƒLƒ‹‚ðƒGƒtƒFƒNƒg‚¾‚¯‚¢‚­‚‚©’ljÁ‚µ‚½‚è
+Eó‘ԕω»‚Í‚»‚Ì‚¤‚¿’N‚©‚ª
+ ƒGƒtƒFƒNƒg(ƒXƒe[ƒ^ƒX•Ï‰»ƒAƒCƒRƒ“ŠÜ‚Þ)‚Ì‚Ý
+ SC_AURABLADE: /* ƒI[ƒ‰ƒuƒŒ[ƒh */
+ SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
+ SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
+ SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ SC_BERSERK: /* ƒo[ƒT[ƒN */
+ SC_ASSUMPTIO: /* */
+ SC_TURESIGHT: /* ƒgƒDƒ‹[ƒTƒCƒg */
+ SC_CARTBOOST: /* ƒJ[ƒgƒu[ƒXƒg */
+ SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH[ƒN */
+
+ (db/)
+ cast_db.txt
+ (map/)
+ skill.h
+ skill.c
+ SkillStatusChangeTable[] €–ڒljÁ
+ skill_castend_nodamage_id() €–ڒljÁ
+ skill_status_change_end() €–ڒljÁ
+ skill_status_change_start() €–ڒljÁ
+
+--------------------
+//0971 by (“Ê)
+Eatcommand.h‚ÉŽc‚Á‚Ä‚¢‚½jobchange2‚Æ‚©‚ÌŽcŠ[‚ðíœ
+E“]¶ƒXƒLƒ‹‚ðƒGƒtƒFƒNƒg‚¾‚¯‚¢‚­‚‚©’ljÁ‚µ‚½‚èƒ`ƒƒƒ“ƒsƒIƒ“‚Í‚»‚ê‚È‚è‚ɒljÁ‚µ‚½‚è
+ ƒGƒtƒFƒNƒg‚Ì‚Ý
+ ƒnƒCƒvƒŠ[ƒXƒg ƒoƒWƒŠƒJ(HP_BASILICA)
+ ƒzƒƒCƒgƒXƒ~ƒX ƒJ[ƒgƒu[ƒXƒg(WS_CARTBOOST)
+ ƒXƒiƒCƒp[ ƒgƒDƒ‹[ƒTƒCƒg(SN_SIGHT)
+ ƒWƒvƒV[ ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç(CG_MOONLIT)
+ ƒpƒ‰ƒfƒBƒ“ ƒSƒXƒyƒ‹(PA_GOSPEL)
+ ’ljÁƒ_ƒ[ƒW“™‚È‚µ
+ ƒ[ƒhƒiƒCƒg ƒwƒbƒhƒNƒ‰ƒbƒVƒ…(LK_HEADCRUSH)
+ ƒ[ƒhƒiƒCƒg ƒWƒ‡ƒCƒ“ƒgƒr[ƒg(LK_JOINTBEAT)
+ ƒ[ƒhƒiƒCƒg ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX(LK_SPIRALPIERCE)
+ ƒpƒ‰ƒfƒBƒ“ ƒvƒŒƒbƒVƒƒ[(PA_PRESSURE)
+ ƒpƒ‰ƒfƒBƒ“ ƒTƒNƒŠƒtƒ@ƒCƒX(PA_SACRIFICE)
+ ‚»‚ê‚È‚è(ƒRƒ“ƒ{‚ÍŒq‚ª‚è‚Ü‚·‚ªƒfƒBƒŒƒC‚Í“K“–Aƒ_ƒ[ƒW’ljÁ‚Í‚ ‚邯‚Ç‚»‚êˆÈŠO‚̒ljÁŒø‰Ê‚Í–³‚µ)
+ ƒ`ƒƒƒ“ƒsƒIƒ“ –ÒŒÕd”hŽR(CH_PALMSTRIKE)
+ ƒ`ƒƒƒ“ƒsƒIƒ“ •šŒÕŒ(CH_TIGERFIST)
+ ƒ`ƒƒƒ“ƒsƒIƒ“ ˜A’Œ•öŒ‚(CH_CHAINCRUSH)
+ ƒ`ƒƒƒ“ƒsƒIƒ“ ‹¶‹CŒ÷(CH_SOULCOLLECT)
+
+ (db/)
+ cast_db.txt
+ skill_db.txt
+ skill_require_db.txt
+ (map/)
+ atcommand.h ƒSƒ~íœ
+ battle.c
+ battle_calc_pet_weapon_attack() •ÏX
+ battle_calc_mob_weapon_attack() •ÏX
+ battle_calc_pc_weapon_attack() •ÏX
+ clif.c
+ clif_parse_UseSkillToId() •ÏX
+ skill.c
+ skill_get_unit_id() €–ڒljÁ
+ skill_attack() ƒ`ƒƒƒ“ƒsƒIƒ“ƒRƒ“ƒ{ˆ—’ljÁ
+ skill_castend_damage_id() •ÏX
+ skill_castend_nodamage_id() •ÏX
+ skill_castend_id() •ÏX
+ skill_unitsetting() •ÏX
+ skill_check_condition() •ÏX
+ skill_use_id() •ÏX
+
+--------------------
+//0970 by (“Ê)
+EƒhƒŒƒCƒN‚̃EƒH[ƒ^[ƒ{[ƒ‹‚ªˆÙí‚É’É‚¢(121”­H‚炤)‚Ì‚ÅLv5ˆÈã‚ÌꇂÍ25”­‚ɧŒÀ
+EƒVƒOƒiƒ€ƒNƒ‹ƒVƒX‚ÌŒvŽZŽ®‚ð14+SkillLv‚©‚ç10+SkillLv*2•ÏX
+Eƒ\[ƒX‚Ì‹C‚ªŒü‚¢‚½‚Æ‚±‚ë‚É—Ž‘‚«
+EDBŠÖŒW‚ð‚Ü‚Æ‚ß‚Ä“¯«
+
+ (map/)
+ battle.c ƒRƒƒ“ƒgQY(BB)¶·¶·
+ skill.c skill_status_change_start()
+ (db/)
+ cast_db.txt
+ item_db.txt
+ mob_skill_db.txt
+ skill_db.txt
+ skill_require_db.txt
+ skill_tree.txt
+
+--------------------
+//0969 by ‚Ò‚´‚Ü‚ñ
+
+E”’nŽæ‚èó‘ԂŕЕû‚ªŽ€–S‚µ‚½ê‡A•Ð•û‚Ì”’nŽæ‚肪‰ðœ‚³‚ê‚È‚¢–â‘èC³
+Ebattle_athena.conf‚É€–ڒljÁ
+@ƒyƒbƒgEƒvƒŒƒCƒ„[Eƒ‚ƒ“ƒXƒ^[‚Ì–³‘®«’ÊíUŒ‚‚ð‘®«–³‚µ‚É‚·‚é‚©”Û‚©‚ðÝ’è‚Å‚«‚Ü‚·
+@Ú‚µ‚­‚Íconf_ref‚ðB
+E—ƒRƒ}ƒ“ƒh@idsearchŽÀ‘•
+@ƒ[ƒh‚µ‚½item_db‚©‚猟õŒê‹å‚Ƀ}ƒbƒ`‚·‚éƒAƒCƒeƒ€‚ÆID‚ð—…—ñ‚·‚éƒRƒ}ƒ“ƒh‚Å‚·
+@—Ⴆ‚Îu@idsearch ƒŒƒCv‚Æ“ü—Í‚µ‚½ê‡AƒuƒŒƒCƒh‚⃌ƒCƒhƒŠƒbƒNƒJ[ƒh“™‚ªˆø‚Á‚©‚©‚è‚Ü‚·
+EƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“ŽÀ‘•
+@‘•”õ”j‰ó‚Í–¢ŽÀ‘•‚Å‚·
+EƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œŽd—l‚ðŠÛ‚²‚Æ•ÏXB
+ (map/)
+ battle.c
+ battle.h
+ ‘®«•â³‚ÌC³‚âƒAƒVƒbƒhƒeƒ‰[Eƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŽZoŽ®’ljÁ“™B
+ battle_config‚É€–ڒljÁ
+ skill.c
+ skill_idun_heal()’ljÁBforeachinarea‚ň—‚·‚é‚悤‚É•ÏX
+ ƒAƒVƒbƒhƒeƒ‰[‚ƃfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“‚̈—’ljÁB
+ atcommand.c
+ atcommand.h
+ @idsearch’ljÁB
+
+--------------------
+//0968 by ŒÓ’±—–
+
+EƒLƒƒƒ‰ƒNƒ^[ID‚ªŽg‚¢‚܂킳‚ê‚È‚¢‚悤‚ÉC³
+EƒLƒƒƒ‰ƒNƒ^[휎žAƒp[ƒeƒB[AƒMƒ‹ƒh‚ð’E‘Þ‚·‚é‚悤‚ÉC³
+EƒAƒJƒEƒ“ƒg휎žAƒLƒƒƒ‰ƒNƒ^[‚Æ‘qŒÉ‚ð휂·‚é‚悤‚ÉC³
+E‘qŒÉ/ƒMƒ‹ƒh‘qŒÉ휎žA‘qŒÉ“à‚̃yƒbƒg‚ð휂·‚é‚悤‚ÉC³
+ E’ˆÓFƒƒOƒCƒ“‚µ‚Ä‚¢‚éƒAƒJƒEƒ“ƒg‚ð휂µ‚½ê‡‚Ì“®ì‚Í•s–¾
+
+ (char/)
+ char.c
+ ƒpƒPƒbƒg2730‚̈—Achar_delete()’ljÁA휈—C³‚È‚Ç
+ int_storage.c/int_party.c/int_guild.c/int_party.h/int_guild.h
+ inter_party_leave(),inter_guild_leave()’ljÁA
+ inter_storage_delete(),inter_guild_storage_delete()C³‚È‚Ç
+ (login/)
+ login.c
+ parse_admin()‚ðƒAƒJƒEƒ“ƒg휎ž‚ɃpƒPƒbƒg2730‚ð‘—‚é‚悤‚ÉC³
+
+Eathena-start stop ‚Å’âŽ~‚³‚¹‚½ê‡Aƒf[ƒ^‚ª•Û‘¶‚³‚ê‚È‚¢–â‘è‚ðC³
+ kill‚Å‘—‚éƒVƒOƒiƒ‹‚ðSIGKILL‚©‚çSIGTERM‚É•ÏXB
+ ‚Ç‚¤‚µ‚Ä‚àSIGKILL‚𑗂肽‚¢ê‡‚Í athena-start kill ‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
+
+ athena-start
+ stopC³Akill’ljÁ
+
+--------------------
+//0967 by Asong
+Eƒ‚ƒ“ƒXƒ^[‚ÌŽc‰e‚ðŽÀ‘•B
+@’Ê탂ƒ“ƒXƒ^[‚̓XƒLƒ‹‚É‚æ‚éƒtƒBƒ‹ƒ^[‚ª‚©‚©‚ç‚È‚¢‚Ì‚ÅŽc‘œ‚ªo‚Ü‚¹‚ñB
+@‚o‚bŒ^ƒ‚ƒ“ƒXƒ^[‚É‚ÍŽc‘œ‚ªo‚Ü‚·B
+Eƒ‚ƒ“ƒXƒ^[ƒXƒLƒ‹Žg—p‘ÎÛ‚ð’ljÁB
+@around5`around8‚̓^[ƒQƒbƒg‚ÌŽü•ÓƒZƒ‹‚ð‘ÎÛ‚É‚µ‚Ü‚·B
+@
+@ (map)
+@ mob.c
+@ mobskill_use() C³
+@ mob_readskill() C³
+@ mob.h C³
+@ skill.c
+@ skill_castend_pos2() C³
+
+--------------------
+//0966 by (“Ê)
+EƒT[ƒo[snapshot
+EƒfƒBƒŒƒNƒgƒŠ\‘¢‚ð•ÏX(common,login,char,map‚Í/srcˆÈ‰º‚Ɉړ])
+@‚»‚ê‚É”º‚¤Makefile“™‚̃pƒX‘‚«Š·‚¦
+Enpc_turtle.txt‚ðnpc_town_alberta.txt‚É“‡
+Eƒ‚ƒ“ƒN‚̃Rƒ“ƒ{‚ÉŠÖ‚·‚éƒfƒBƒŒƒC‚ð•ÏX
+Ebattle_config.enemy_critical‚̃fƒtƒHƒ‹ƒg‚ðno‚É•ÏX
+E“]¶E“™‚𖳌ø‚É‚·‚éenable_upper_class‚̒ljÁ
+E@joblvup,@charjlvl‚ÅJobƒŒƒxƒ‹‚ªÅ‚‚Ì‚Æ‚«‚É•‰”‚ðŽw’肵‚Ä‚àƒŒƒxƒ‹‚ð‰º‚°‚ç‚ê‚È‚©‚Á‚½–â‘è‚ðC³
+
+ (conf)
+ battle_athena.conf C³
+ (doc)
+ conf_ref.txt C³
+ (map)
+ atcommand.c
+ atcommand_joblevelup() C³
+ atcommand_character_joblevel() C³
+ battle.c
+ battle_calc_attack() C³
+ battle_config_read() C³
+ battle.h C³
+ pc.c
+ pc_calc_skilltree() C³
+ pc_calc_base_job() C³
+ pc_jobchange() C³
+ pc_readdb() C³
+ skill.c
+ skill_attack() C³
+--------------------
+//0965 by ‚Ò‚´‚Ü‚ñ
+E@mapexitŽÀsŽž‘SƒZƒbƒVƒ‡ƒ“‚ðkick‚·‚é‚悤‚É•ÏXB
+E”’nŽæ‚莞‚ɕЕû‚ª“|‚ê‚Ä‚àA‚à‚¤•Ð•û‚Ì”’n‚ª‰ðœ‚³‚ê‚È‚¢–â‘èC³B(–¢ƒeƒXƒg)
+EƒXƒeƒB[ƒ‹î•ñŒöŠJ‹@”\ŽÀ‘•B(–¢ƒeƒXƒg)
+@ƒXƒeƒB[ƒ‹‚ɬŒ÷‚·‚é‚ÆA‰½‚ðƒXƒeƒB[ƒ‹‚µ‚½‚Ì‚©
+@‰æ–Ê“à‚ÌPTƒƒ“ƒo[‘Sˆõ‚É’m‚点‚é‹@”\‚Å‚·B
+@battle_athena.conf‚Ìshow_steal_in_same_party‚ÅÝ’è‚Å‚«‚Ü‚·B
+@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×AƒfƒtƒHƒ‹ƒg‚Íno‚É‚µ‚Ä‚¢‚Ü‚·B
+EƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œŒø‰ÊŽÀ‘•B
+
+ (conf/)
+ battle_athena.conf‚É€–ڒljÁB
+ (map/)
+ atcommand.c
+ atcommand_mapexit() C³B
+ pc.c
+ pc_steal_item() C³B
+ pc_show_steal() ’ljÁB
+ skill.c
+ skill_unitsetting()Askill_unit_onplace() C³B
+ battle.c
+ battle_config_read() C³B
+ battle.h C³B
+ (doc/)
+ conf_ref.txt ”²‚¯‚Ä‚½‚Ì‚ðFX’ljÁB
+
+--------------------
+//0964 by (“Ê)
+
+E‚±‚Ì‘O’ljÁ‚µ‚½skill_tree2.txt‚ð”pŽ~‚µ‚½‚Ì‚Å휂µ‚Ä‚­‚¾‚³‚¢
+Eskill_tree.txt‚̃tƒH[ƒ}ƒbƒg‚ð•ÏX•Kalen‚³‚ñ‚È‚Ç‚Ìî•ñ‚ðŒ³‚É“]¶ƒcƒŠ[‚ÌŒ©’¼‚µ
+E‚»‚ê‚É‚Æ‚à‚È‚Á‚Äpc.c‚̃tƒ@ƒCƒ‹“Ç‚Ýo‚µ•”•ª‚È‚Ç‚ð•ÏX
+EAthenaŽG’kƒXƒŒƒbƒh part3 >>14 miya‚³‚ñ‚ÌŽw“E‚ª‚ ‚é‚Ü‚Å‚·‚Á‚©‚è–Y‚ê‚Ä‚¢‚½atcommand_athena.conf‚ÌC³‚𓯫
+
+ (conf/)
+ atcommand_athena.conf C³
+ (db/)
+ skill_tree.txt C³
+ skill_tree2.txt ”pŽ~
+ (map/)
+ map.h PC_CLASS_BASE“™’ljÁ
+ pc.c
+ pc_calc_skilltree() C³
+ pc_allskillup() C³
+ pc_readdb() C³
+
+--------------------
+//0963 by (“Ê)
+
+E@jobchange2, @jobchange3”pŽ~ @jobchange‚Ɉø”’ljÁ @helpŽQÆ
+ —á: @jobchange2 10 ¨ @jobchange 10 1
+E“¯—l‚É@charjob2, @charjob3”pŽ~ @charjob‚Ɉø”’ljÁ @helpŽQÆ
+ —á: @charjob2 10 ‚Ù‚°‚Ù‚° ¨ @charjob 10 1 ‚Ù‚°‚Ù‚°
+E“¯—l‚ɃXƒNƒŠƒvƒg‚Ìjobchange2, jobchange3–½—ß”pŽ~ jobchange‚Ɉø”’ljÁ script_ref.txtŽQÆ
+ —á: jobchange2 10; ¨ jobchange 10,1;
+Eª‚Ç‚ê‚à’ljÁ‚³‚ꂽˆø”‚ÍÈ—ª‰Â”\‚Å‚·B‚È‚Ì‚ÅA“]¶ƒm[ƒrƒX‚ÍŒ»ó‚̃XƒNƒŠƒvƒg‚Å“]¶ˆêŽŸE‚É“]E‚Å‚«‚Ü‚·B
+ —á: Novice High ¨ @jobchange 10 ¨ Whitesmith
+ Novice ¨ @jobchange 10 ¨ Blacksmith
+EƒXƒNƒŠƒvƒg‚©‚ç“]¶‚µ‚Ä‚¢‚é‚©”»’è‚·‚邽‚ß‚ÉUpper‚ð’ljÁ‚µ‚Ü‚µ‚½BUpper 0=’Êí, 1=“]¶, 2=—{Žq
+ Upper=0‚ÌŽž‚ÉBaseLevel=99‚È‚ç“]¶‚³‚¹‚é`‚Æ‚©‚»‚¤‚¢‚¤ƒXƒNƒŠƒvƒg’N‚©‘‚¢‚Ä‚­‚¾‚³‚¢
+ ‚»‚ÌŽž‚ÉŒ³‚ÌE‹Æ‚Í‹L‰¯‚µ‚Ä‚¢‚È‚¢‚̂ʼni‘±•Ï”‚Æ‚©‚ÅŠo‚¦‚³‚¹‚Ä”»’肳‚¹‚È‚¢‚Æ“]¶Œã‰½‚É‚Å‚à“]E‚Å‚«‚¿‚ႤH
+EƒoƒCƒIƒvƒ‰ƒ“ƒg‚ƃXƒtƒBƒAƒ}ƒCƒ“‚ŌĂÑo‚³‚ê‚éMob‚Ì–¼‘O‚ð--ja--‚É‚µ‚Ämob_db.txt‚©‚ç“ǂނ悤‚É‚µ‚½
+
+ (conf/)
+ help.txt C³
+ (db/)
+ const.txt
+ (doc/)
+ help.txt C³
+ script_ref.txt C³
+ (map/)
+ atcommand.c
+ atcommand_jobchange() C³
+ atcommand_jobchange2() íœ
+ atcommand_jobchange3() íœ
+ atcommand_character_job() C³
+ atcommand_character_job2() íœ
+ atcommand_character_job3() íœ
+ map.h C³
+ pc.c
+ pc_readparam() C³
+ pc_jobchange() C³
+ pc.h C³
+ script.c
+ buildin_jobchange() C³
+ buildin_jobchange2() íœ
+ buildin_jobchange3() íœ
+ skill.c
+ skill_castend_pos2() C³
+
+--------------------
+//0962 by (“Ê)
+
+EE‹Æ‚Í0`23‚ň—‚µ‚½‚¢‚Ì‚Å“]¶E—p‚̃XƒLƒ‹ƒcƒŠ[’ljÁAeAthena‚ðŽQl‚ÉŠg’£
+ ‚Á‚Ä‚¢‚¤‚©ŠØ‘–{ƒT[ƒo‚Å‚ÌŽÀ‘•‚ÌŽ‘—¿‚ªŒ©“–‚½‚ç‚È‚¢‚Ì‚Å“K“–
+Esakexe.exe‚ð‰ðÍ‚µ‚Äskill_db.txt•ÏXA‚±‚ê‚àeAthena‚ðŽQl‚ÉŠg’£
+ ‚ǂꂪ–{ƒT[ƒo‚ÅŽÀ‘•‚³‚ê‚Ä‚¢‚éƒXƒLƒ‹‚©•ª‚©‚è‚Ü‚¹‚ñ‚ÁII
+¦ƒXƒLƒ‹ƒcƒŠ[‚ª•\Ž¦‚³‚ꂽ‚©‚ç‚Æ‚¢‚Á‚ÄŽg‚¦‚é‚킯‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ÁII
+
+ (common/)
+ mmo.h ’è”C³
+ (db/)
+ skill_db.txt •ÏX
+ skill_require_db.txt •ÏX
+ skill_tree2.txt ’ljÁ
+ (map/)
+ skill.h ’è”C³
+ pc.c
+ pc_calcstatus() C³
+ pc_allskillup() C³
+ pc_calc_skilltree() C³
+ pc_readdb() C³
+
+--------------------
+//0961 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚ɃTƒuƒ‹[ƒ`ƒ“/ƒ†[ƒU[’è‹`ŠÖ”‹@”\’ljÁ
+ Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚Æscript_ref.txt‚ð“Ç‚ñ‚Å‚­‚¾‚³‚¢B
+ ’n–¡‚É‘å‰ü‘¢‚È‚Ì‚ÅAƒXƒNƒŠƒvƒgŠÖŒW‚ŃoƒO‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+
+ (map/)
+ map.h/map.c
+ struct map_session_data ‚ɃXƒNƒŠƒvƒgî•ñ‘Þ”ð—p‚̃ƒ“ƒo’ljÁ
+ map_quit()C³
+ script.h/script.c
+ FXC³(run_script(),run_func()‚ªŽå)
+ npc.c
+ npc_parse_function()’ljÁ‘¼
+ (conf/sample)
+ npc_test_func.txt
+ ƒ†[ƒU[’è‹`ŠÖ”/ƒTƒuƒ‹[ƒeƒBƒ“‚̃eƒXƒgƒXƒNƒŠƒvƒg
+ (doc/)
+ script_ref.txt
+ ƒTƒuƒ‹[ƒeƒBƒ“‚È‚Ç‚Ìà–¾’ljÁ
+
+--------------------
+//0960 by (“Ê)
+E–{ŽI‘ŠˆáƒXƒŒƒbƒh part2 >>62 KK‚³‚ñ‚̃Aƒ“ƒNƒ‹ƒXƒlƒAC³‚𓯫
+EƒoƒO•ñƒXƒŒƒbƒh part5 >>14-16 rb‚³‚ñ‚̃oƒOC³‚𓯫
+EFor English User Forum >>15 Mugendai‚³‚ñ‚ÌŽw“E‚Å0x1d7‚ðŽg‚¤‚Ì‚ÍVal>255‚ÉC³(0xc3‚ÌVal‚Í1ƒoƒCƒg‚¾‚©‚ç0x1d7‚ðŽg‚¤‚Ì‚©‚Æ”[“¾)
+Epc_calc_base_job()‚ð•ÏX‚µ‚ÄŒ³job‚¾‚¯‚Å‚È‚­ƒmƒr‚©ˆêŽŸE‚©“ñŽŸE(type)A’Êí‚©“]¶‚©—{Žq(upper)‚ð•Ô‚·‚悤‚É‚µ‚½
+
+ (map/)
+ atcommand.c
+ atcommand_joblevelup() C³
+ atcommand_character_joblevel() C³
+ clif.c
+ clif_changelook() C³
+ pc.h C³
+ pc.c
+ pc_setrestartvalue() C³
+ pc_equippoint() C³
+ pc_isequip() C³
+ pc_calc_skilltree() C³
+ pc_calcstatus() C³
+ pc_isUseitem() C³
+ pc_calc_base_job() C³
+ pc_allskillup() C³
+ pc_damage() C³
+ pc_jobchange() C³
+ pc_equipitem() C³
+ script.c
+ buildin_changesex() C³
+ skill.c
+ skill_castend_nodamage_id() C³
+ skill_unit_onplace() C³
+
+--------------------
+//0959 by (“Ê)
+Ehelp.txt‚ªdoc‚¶‚á‚È‚­‚Äconf‚Ì‚ª“Ç‚Ýo‚³‚ê‚Ä‚½Q|P|›
+Egamejoke‚ðŽQl‚É“]¶“ñŽŸE‚̃Xƒe[ƒ^ƒX‰Ád’l‚ðjob_db2-2.txt‚É‹Lq
+EƒXƒNƒŠƒvƒg‚Éjobchange2‚Æjobchange3‚ð’ljÁ‚»‚ꂼ‚ê“]¶E‚Æ—{ŽqE‚Ö“]E‚³‚¹‚é–½—ß‚Å‚·
+
+ (conf/)
+ help.txt C³
+ (db/)
+ job_db2.txt C³
+ job_db2-2.txt ’ljÁ
+ (doc/)
+ help.txt C³
+ script_ref.txt C³
+ (map/)
+ pc.c
+ pc_calcstatus() C³
+ pc_readdb() C³
+ script.c
+ buildin_jobchange() C³
+ buildin_jobchange2() ’ljÁ
+ buildin_jobchange3() ’ljÁ
+
+--------------------
+//0958 by (“Ê)
+E“]¶E•û–Ê‚ÌŽÀ‘•‚ðFX
+Ed—ʧŒÀ‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŒ³‚ÌE‹Æ‚Ì’l‚ð‚»‚Ì‚Ü‚ÜŽg‚Á‚Ä‚¢‚Ü‚·(ƒ‚ƒ“ƒNƒ`ƒƒƒ“ƒsƒIƒ““™)
+E‘•”õ•i‚à“¯ãAHP‚âSP‚̃e[ƒuƒ‹‚à“¯ã‚È‚Ì‚ÅA“]¶‚µ‚Ä‚àHP‚È‚Ç‚ª‘‚¦‚È‚¢ƒKƒbƒJƒŠŽd—l‚Å‚·
+
+ (map/)
+ atcommand.c
+ atcommand_joblevelup() C³
+ atcommand_character_joblevel() C³
+ pc.c
+ pc_setrestartvalue() C³
+ pc_equippoint() C³
+ pc_isequip() C³
+ pc_calcstatus() C³
+ pc_isUseitem() C³
+ pc_calc_base_job() ’ljÁ
+ pc_damage() C³
+ pc_jobchange() C³
+ pc_equipitem() C³
+ pc.h C³
+ script.c
+ buildin_changesex() C³
+ skill.c
+ skill_castend_nodamage_id() C³
+
+--------------------
+//0957 by (“Ê)
+E@charjob2‚Æ@charjob3‚ð’ljÁAŠÖŒW‚Æ‚µ‚Ä‚Í@charjobÌ@jobchangeA@charjob2Ì@jobchange2A(ry
+E@mapexit‚ð’ljÁAmap-server‚ð—Ž‚Æ‚·ƒRƒ}ƒ“ƒh‚Å‚·atcommand_athena.conf‚Å‚Í99Ý’è‚É‚³‚ê‚Ä‚Ü‚·‚Ì‚ÅŽg—p‚É‚Í\•ª’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (map/)
+ atcommand.c
+ atcommand_character_job2() ’ljÁ
+ atcommand_character_job3() ’ljÁ
+ atcommand.h C³
+ (conf/)
+ atcommand_athena.conf C³
+ (doc/)
+ help.txt C³
+
+--------------------
+//0956 by (“Ê)
+E“]¶E‰¼ŽÀ‘•(@jobchange2)AŒ©‚½–Ú‚ÆŒoŒ±’lƒe[ƒuƒ‹‚¾‚¯‚Å‚·
+E—{ŽqE‰¼ŽÀ‘•(@jobchange3)AŒ©‚½–Ú‚¾‚¯‚Å‚·Œ»ó‚Å‚ÍŒoŒ±’l‚Í“]¶“ñŽŸE‚Æ“¯‚¶‚Æ‚¢‚¤ƒ}ƒ]Žd—l
+¦ã‹L2“_‚Í“]¶E‚ªŽÀ‘•‚³‚ê‚Ä‚¢‚éƒNƒ‰ƒCƒAƒ“ƒg‚Å‚È‚¯‚ê‚ÎŽÀs‚·‚é‚ƃGƒ‰[—Ž‚¿‚·‚é‚Ì‚Å’ˆÓII
+@‚»‚̌㒼ڃZ[ƒuƒf[ƒ^‚ð˜M‚ç‚È‚¢‚ƃLƒƒƒ‰ƒZƒŒ‚É‚às‚¯‚È‚­‚È‚è‚Ü‚·II
+EAthenaŽG’kƒXƒŒƒbƒh part2 >>149 ‹HŽ}‚³‚ñ‚Ì•ñ‚ðŒ³‚ÉƒK[ƒfƒBƒAƒ“‚ðC³
+EԈȊO‚ŃK[ƒfƒBƒAƒ“‚Æ‚©ƒGƒ“ƒyƒŠƒEƒ€‚ð‰£‚é‚Æmap-server‚ª—Ž‚¿‚Ä‚¢‚½‚Ì‚àC³(–¢Šm”F)
+EƒXƒpƒmƒr‚ÌJobƒe[ƒuƒ‹‚ÍFor English User Forum >>13 kingbo‚³‚ñ‚̃f[ƒ^‚ðŒ³‚ÉC³
+E“]¶E‚ÌŒoŒ±’lƒe[ƒuƒ‹‚ÍOWN‚ðŽQÆ‚µ‚ÄBase99‚ÌŒoŒ±’l‚Í•s–¾‚¾‚Á‚½‚Ì‚Å“K“–‚ÉÝ’è
+
+ (map/)
+ atcommand.c
+ atcommand_jobchange() C³
+ atcommand_jobchange2() ’ljÁ
+ atcommand_jobchange3() ’ljÁ
+ atcommand.h C³
+ clif.c
+ clif_changelook() C³
+ pc.c
+ pc_nextbaseexp() C³
+ pc_nextjobexp() C³
+ pc_jobchange() C³
+ pc_readdb() C³
+ battle.c
+ battle_calc_damage() C³
+ mob_can_reach() C³
+
+--------------------
+//0955 by huge
+Eƒyƒbƒg‚̃‹[ƒg‹@”\B
+ EŽd—l‚Ímob‚̃‹[ƒg‚É‹ß‚¢Š´‚¶‚Å‚·‚ªAŽË’ö‚ð’Z‚­‚µ‚Ä‚Ü‚·B
+ EE‚Á‚½ƒAƒCƒeƒ€‚ÍAƒpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚Æ°‚É—Ž‚Æ‚µ‚Ü‚·B
+ E—‘‚É–ß‚µ‚½‚èAƒƒOƒIƒt‚µ‚½‚Æ‚«‚ÍPC‚̎茳‚É“ü‚é‚悤‚É‚µ‚Ü‚µ‚½B(d—Ê’´‰ß‚̓hƒƒbƒv)
+ EE‚¦‚éŒÂ”‚̓‹[ƒgmob“¯—l‚Ì10ŒÂ‚Å‚·‚ªA11ŒÂ–Ú‚ÍE‚¢‚És‚«‚Ü‚¹‚ñB
+ Eƒ‹[ƒgŒ ‚Ì–â‘è‚©‚çAƒAƒCƒeƒ€‚Éfirst_id‚ª“ü‚Á‚Ä‚¢‚ÄA‚»‚ꂪŽ”‚¢ŽåˆÈŠO‚¾‚Á‚½‚çA‰½•bŒo‚Æ‚¤‚ÆE‚¢‚Ü‚¹‚ñB(–¢Šm”F)
+ E‚»‚ê‚ÆA‰×•¨Ž‚¿‚É‚³‚ê‚é‚Ɖˆ£‘z‚È‚Ì‚ÅAd—ʧŒÀ‚à‚‚¯‚Ü‚µ‚½B‚±‚ê‚Íconf‚ÅÝ’è‰Â”\‚Å‚·B
+Eatcommand‚ÅA@where‚ª‚¤‚Ü‚­“­‚¢‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³(‚Ü‚½ƒEƒ`‚¾‚¯‚©‚È‚Ÿ¥¥¥j
+E@memo‚Åmemo‚·‚鎞‚ÍAmapflag‚𖳎‹‚·‚é‚悤‚ÉB
+EƒXƒtƒBƒAƒ}ƒCƒ“‚Ì–¼‘O‚¾‚¯C³B
+
+ (conf/)
+ battle_athena.conf
+ pet_lootitem,pet_weight ’ljÁ
+ (doc/)
+ conf_ref.txt C³
+ (map/)
+ atcommand.c
+ atcommand_memo() C³
+ atcommand_where() C³
+ battle.c
+ battle_config_read() C³
+ battle.h C³
+ map.c
+ map_quit() C³
+ map.h
+ pet_data{} C³
+ pc.c
+ pc_memo() C³
+ pet.c
+ pet_performance() C³
+ pet_return_egg() C³
+ pet_data_init() C³
+ pet_ai_sub_hard() C³
+ pet_lootitem_drop() ’ljÁ
+ pet_delay_item_drop2() ’ljÁ
+ pet_ai_sub_hard_lootsearch() ’ljÁ
+ pet.h C³
+ skill.c
+ skill_castend_pos2() C³
+
+--------------------
+//0954 by (“Ê)
+Eobject_del.bat‚ÅŠeserver.exe‚à휂·‚é‚悤‚É‚µ‚½
+EFor English User Forum >>11 kingbo‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
+EƒoƒO•ñƒXƒŒƒbƒh part5 >>10 Sin‚³‚ñ‚ÌC³‚ðŽæ‚èž‚Ý
+E‚‚¢‚Å‚ÉŒ©‚©‚¯‚½atcommand_character_joblevel‚Ì•s‹ï‡‚ðC³
+E@ƒRƒ}ƒ“ƒh‚ŃWƒ‡ƒuƒŒƒxƒ‹‚ðã‚°‚é‚Æ‚«‚ɃXƒpƒmƒr‚ÍJob70‚܂őΉž(–¢Šm”F)
+
+ (/)
+ object_del.bat C³
+ (map/)
+ atcommand.c
+ atcommand_joblevelup() C³
+ atcommand_character_joblevel() C³
+ atcommand_character_baselevel() C³
+
+ code by kingbo 2004/4/29 PM 06:15
+ base on 0953
+ now i sure it works well
+ (map/)
+ mob.c
+ mob_can_reach() fix
+
+--------------------
+//0953 by (“Ê)
+Emob_skill_db.txt‚ÌðŒ’l‚É0ˆÈŠO“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ð’ù³
+Egcc 2.95‚ŃRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É’ù³(by ƒoƒOƒXƒŒpart5 >>2 ˆ©‚³‚ñ)
+Eª‚âLinux‚È‚Ç‚ðl—¶‚µ‚Ästart‚âMakefile‚Ȃǂ̉üs‚ðLF‚É•ÏX
+E0952‚Åo‚½ƒRƒ“ƒpƒCƒ‹Œx‚ðo‚È‚¢‚悤‚ÉC³
+E0952‚ÅXV‚³‚ê‚È‚©‚Á‚½conf_ref.txt‚ðC³
+
+ (/)
+ start ‰üsƒR[ƒh•ÏX
+ athena-start ‰üsƒR[ƒh•ÏX
+ (db/)
+ mob_skill_db.txt C³
+ (doc/)
+ conf_ref.txt C³
+ (login/)
+ Makefile ‰üsƒR[ƒh•ÏX
+ (map/)
+ Makefile ‰üsƒR[ƒh•ÏX
+ atcommand.c
+ atcommand() 錾ˆÊ’uC³
+ atcommand_where() 錾ˆÊ’uC³
+ battle.c
+ battle_calc_pet_weapon_attack() C³
+ battle_calc_mob_weapon_attack() C³
+ battle_calc_pc_weapon_attack() C³
+ battle_calc_magic_attack() C³
+ clif.c
+ clif_skill_fail() 錾ˆÊ’uC³
+ guild.c
+ guild_gvg_eliminate_timer() 錾ˆÊ’uC³
+ mob.c
+ mob_damage() 錾ˆÊ’uC³
+ script.c
+ buildin_deletearray() 錾ˆÊ’uC³
+ buildin_getequipcardcnt() 錾ˆÊ’uC³
+ buildin_successremovecards() 錾ˆÊ’uC³
+
+--------------------
+//0952 by CG
+Econf‚ÅDEF‚ÆMDEF‚ÌŒvŽZ•û–@‚ð‘I‘ð‚Å‚«‚é‚悤‚ÉB
+
+ (conf/)
+ battle_athena.conf •ÏX
+ (map/)
+ battle.c
+ battle_calc_pet_weapon_attack() C³
+ battle_calc_mob_weapon_attack() C³
+ battle_calc_pc_weapon_attack() C³
+ battle_calc_magic_attack() C³
+ battle.h C³
+
+--------------------
+//0951 by (“Ê)
+EƒT[ƒo[snapshot
+EƒoƒO•ñƒXƒŒƒbƒh part4 >>95 KAJIKEN‚³‚ñ‚ÌC³‚𓯫
+E“¯ >>138 ƒoƒO‚©‚ÈH‚³‚ñ‚ÌC³‚𓯫
+EAthenaŽG’kƒXƒŒƒbƒh part2 >>112 –¼–³‚µ‚³‚ñ‚ÌPVPƒiƒCƒgƒƒAƒ‚[ƒh‚̃Aƒ“ƒ_[ƒNƒƒXƒ}ƒbƒvƒ[ƒvƒ|ƒCƒ“ƒg‚𓯫
+E“¯ >>96 ‹HŽ}‚³‚ñ‚Ìnpc_gldcheck.txt‚𓯫
+EƒXƒiƒbƒvƒVƒ‡ƒbƒg‚Ésave/‚ð“ü‚ê‚é‚Ì‚ð‚â‚ß‚Ü‚µ‚½B–³‚¢ê‡‚Íathena-start‚ªì‚Á‚Ä‚­‚ê‚Ü‚·
+Eathena-start‚Ålog/‚ª–³‚¢ê‡‚Éì‚é‚悤‚É•ÏX
+E‚»‚Ì‘¼H
+
+ (/)
+ athena-start •ÏX
+ (db/)
+ mob_db.txt •ÏX
+ (conf/)
+ map_athena.conf •ÏX
+ (conf/extension/)
+ npc_gldcheck.txt ’ljÁ
+ (conf/npc/)
+ npc_event_ice.txt •ÏX
+ npc_job_alchemist.txt •ÏX
+ npc_event_valentine.txt •ÏX
+ npc_town_geffen.txt •ÏX
+ npc_event_whiteday.txt •ÏX
+ npc_event_potion.txt •ÏX
+ npc_town_comodo.txt •ÏX
+ (conf/warp/)
+ npc_warp_pvp.txt ’ljÁ
+
+--------------------
+//0950 by (“Ê)
+Emob_db‚ÌModeƒtƒ‰ƒO‚Ɉȉº‚Ì•¨‚ð’ljÁ
+ 0x40(64) ƒ_ƒ[ƒW‚ð1‚ɌŒè(‘‚âƒNƒŠƒXƒ^ƒ‹‚È‚Ç)
+ 0x80(128) UŒ‚‚ðŽó‚¯‚½‚Æ‚«‚É”½Œ‚‚ð‚·‚é
+Eã‹L‚Ì•ÏX‚Ì‚½‚ßmob_db.txt‚Ù‚Ú‘S•”•ÏXAmob_db2.txt‚ðì‚Á‚Ä‚¢‚él‚Í
+ ‘‚È‚Ç1ƒ_ƒŒÅ’è‚É‚ÍMode‚É64‚ð‘«‚³‚È‚¢‚Æ•’ʂɃ_ƒ[ƒW
+ ‚»‚Ì‘¼Mob‚ÍMode‚É128‚ð‘«‚³‚È‚¢‚Æ”½Œ‚‚µ‚Ä‚±‚È‚­‚È‚é‚Ì‚Å’ˆÓ
+
+ (db/)
+ mob_db.txt C³
+ (map/)
+ battle.c
+ battle_calc_pet_weapon_attack()
+ battle_calc_mob_weapon_attack()
+ battle_calc_pc_weapon_attack()
+ battle_calc_magic_attack()
+ mob.c
+ mob_once_spawn()
+ mob_attack()
+ mob_target()
+ mob_ai_sub_hard()
+
+--------------------
+//0949 by ‚Ò‚´‚Ü‚ñ
+
+EƒXƒe[ƒ^ƒXˆÙí‘Ï«‘S–ÊC³B
+@‘Ï«ŽZoŽ®‘S–ÊC³B
+@ƒXƒe[ƒ^ƒXˆÙí‘Ï«100%‚̃Lƒƒƒ‰ƒNƒ^[‚É‚Íó‘ÔˆÙí‚ðs‚í‚È‚¢‚悤‚ÉC³B
+EƒfƒBƒXƒyƒ‹‚ÌŽd—l•ÏXB
+@‰ðœ‚µ‚½‚çƒVƒXƒeƒ€ã–â‘è‚Ì‚ ‚éƒXƒe[ƒ^ƒX•Ï‰»ˆÈŠO•Ð‚Á’[‚©‚ç‰ðœ‚·‚é‚悤‚ÉC³B
+EƒtƒƒXƒgƒ_ƒCƒo[‚ÌŽd—l•ÏXB
+@“€Œ‹—¦C³(ƒ}ƒWƒXƒŒƒeƒ“ƒvƒŒ€‹’)B
+EƒŠƒJƒoƒŠ[‚ÌŽd—l•ÏXB
+@ƒmƒ“ƒAƒNƒeƒBƒuƒ‚ƒ“ƒXƒ^[‚ÉŽg—p‚·‚é‚ƃ^[ƒQƒbƒg‚ªƒŠƒZƒbƒg‚³‚ê‚é‚悤‚ÉC³B
+EƒNƒ@ƒOƒ}ƒCƒA‚ÌŽd—l‚ªƒAƒŒ‚¾‚Á‚½‚Ì‚ÅC³B
+@‰‰‘t‚â‘®«ê‚Æ“¯—l‚Érange‚ň—‚·‚é‚悤‚ÉC³B
+@DEX/AGI”¼Œ¸‚̉e‹¿‚ª‰r¥ˆÈŠO‚É‚à‹y‚Ô—l‚ÉC³B
+EƒXƒLƒ‹ƒ^[ƒQƒbƒg’†‚ÉŽ€‚ñ‚¾U‚è‚ðŽg—p‚µ‚Ä‚àƒXƒLƒ‹‚ª‰ñ”ð‚Å‚«‚È‚¢–â‘èC³B
+E”’nŽæ‚肪“®ì‚µ‚È‚¢–â‘èC³(cast_db‚ª”²‚¯‚Ä‚Ü‚µ‚½)B
+ (map/)
+ pc.c
+ pc_calcstatus()C³
+ skill.c
+ skill_additional_effect()Askill_attack() C³
+ skill_status_change_start()Askill_unitsetting() C³
+ (db/)
+ cast_db.txt C³B
+
+--------------------
+//0948 by ŒÓ’±—–
+
+Ewarpwaitingpc‚ª³‚µ‚­PC‚ð“]‘—‚Å‚«‚È‚¢–â‘è‚ðC³
+EƒXƒNƒŠƒvƒg‚Ì“Ç‚Ýž‚ÝŽž‚ɃGƒ‰[‚Ü‚½‚ÍŒx‚ªo‚éê‡AŒx‰¹‚ð–‚炷‚悤‚ÉB
+ i—¬‚ꂽƒƒO‚ðŒ©‚È‚¢l‘Îô‚Å‚·j
+
+ (map/)
+ script.c
+ buildin_warpwaitingpc()C³
+ disp_error_message()C³
+
+Eatcommand.cC³
+ Eatcommand_athena.conf‚Ìmapmove‚ð“ǂނ悤‚É
+ E@str‚È‚Ç‚ÌÈ—ªŽž‚Ì•K{ƒŒƒxƒ‹‚ð0‚ÉB
+ E@param‚ÍŽg‚í‚È‚¢‚̂ŃRƒƒ“ƒg‰»
+
+ (map/)
+ atcommand.c
+ ŠY“–ŒÂŠC³
+
+Emob‚ªÅ‘å15•b‚قLjړ®‚µ‚È‚¢ê‡‚ª‚ ‚é–â‘èC³
+ EŽè”²‚«‚Å‚È‚¢mobˆ—‚ÅAˆÚ“®‚µ‚È‚¢ŽžŠÔ‚ª7•bˆÈ㑱‚©‚È‚¢‚悤‚ÉC³
+
+ (map/)
+ mob.c
+ mob_ai_sub_hard()C³
+
+E‰õ‘¬‘Dˆõ‚̈ɓ¤`s‚«‚Ì”»•ÊŽ®C³ (by ID:F8nKKuY)
+ (conf/npc/)
+ npc_town_comodo.txt
+
+--------------------
+//0947 by (“Ê)
+EŽæ‚芪‚«‚ÍŽæ‚芪‚«‚𢊫‚µ‚È‚¢‚悤‚ÉC³
+E˜I“V‚̔̔„‰¿Ši‚ÌãŒÀ‚ðbattle_athena.conf‚ÅÝ’è‚Å‚«‚é‚悤‚ÉC³
+
+ (conf/)
+ battle_athena.conf
+ vending_max_value’ljÁ
+ (doc/)
+ conf_ref.txt C³
+ (map/)
+ skill.c
+ skill_castend_nodamage_id() C³
+ battle.c
+ battle_config_read() C³
+ battle.h C³B
+ vending.c
+ vending_openvending() C³B
+
+--------------------
+//0946 by Kalen
+Eƒvƒ–kWarpŒ©’¼‚µ
+ŽQlF–{ŽI(1F,2F)‚ç‚®‚Ȃ̉½‚©(3F)
+ (conf/warp/)
+ npc_warp.txt
+
+EŒê‚è•”‚Ì2T3T’ljÁ(‚Ç‚¤‚¹Œ©‚È‚¢‚ÆŽv‚¢‚Ü‚·‚ªc)
+ (conf/npc/)
+ npc_event_kataribe.txt
+
+--------------------
+//0945 by ŒÓ’±—–
+
+ENPCƒ^ƒCƒ}[ƒ‰ƒxƒ‹ƒf[ƒ^‚ª³‚µ‚­ƒCƒ“ƒ|[ƒg‚³‚ê‚È‚¢–â‘è‚ðC³
+ENPCƒ^ƒCƒ}[‰Šú’l‚âƒ^ƒCƒ}[ID‚ª³‚µ‚­‰Šú‰»‚³‚ê‚È‚¢–â‘è‚ðC³
+ENPC‚Ìduplicate‚ðs‚¤‚ƃAƒNƒZƒXˆá”½‚ª‹N‚±‚éꇂª‚ ‚é–â‘è‚ðC³
+
+ (map/)
+ npc.c
+ npc_parse_scriptC³
+
+Eƒpƒbƒ`ƒAƒbƒvƒXƒŒ‚S‚Ì87‚Ìpc.c‚Ƃ肱‚Ý
+ (map/)
+ pc.c
+ ƒJ[ƒhd—ʧŒÀ‚ðŒ³‚É–ß‚µ‚½‚à‚Ì
+
+--------------------
+//0944 by huge
+EƒMƒ‹ƒh‚Ìã”[ŒoŒ±’l‚ÌãŒÀ‚ðAconf‚ŧŒÀ‚Å‚«‚é‚悤‚ÉB
+E˜I“X‚̔̔„‰¿Ši‚ð10M‚܂łɧŒÀB
+EƒJ[ƒg‚Ìd—ʧŒÀ‚ªˆêŒ…‰º‚ª‚Á‚Ä‚½‚ñ‚Å‚·‚ªAƒEƒ`‚¾‚¯‚Å‚·‚©HC³‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªB
+
+ (conf/)
+ battle_athena.conf
+ guild_exp_limit’ljÁ
+ (doc/)
+ conf_ref.txt C³
+ (map/)
+ atcommand.c
+ ‘h¶Žž‚ÌSP‰ñ•œ‚ÅAׂ©‚¢C³B
+ battle.c
+ battle_config_read() C³
+ battle.h C³B
+ guild.c
+ guild_change_position() C³B
+ pc.c
+ pc_calcstatus() C³B
+ vending.c
+ vending_openvending() C³B
+
+--------------------
+//0943 by (“Ê)
+Ebattle_athena.conf‚Ådead_branch_active‚ðyes‚É‚·‚é‚ƌÖ؂̎}‚Å¢Š«‚³‚ê‚郂ƒ“ƒXƒ^[‚ªƒAƒNƒeƒBƒu‚É‚È‚é‚悤‚É•ÏX
+E”÷–­‚É•ÏX‚µ‚½client_packet.txt‚𓯫
+
+ (conf/)
+ battle_athena.conf
+ dead_branch_active’ljÁ
+ (doc/)
+ client_packet.txt C³
+ conf_ref.txt C³
+ (map/)
+ battle.c
+ battle_config_read() C³
+ battle.h C³
+ map.h C³
+ mob.c
+ mob_once_spawn() C³
+ mob_attack() C³
+ mob_target() C³
+ mob_ai_sub_hard_lootsearch() C³
+ mob_ai_sub_hard() C³
+
+E‰pŒêƒXƒŒ‚Ìkingbo‚³‚ñ‚Ì•ÏX‚𓯫
+ code by kingbo 2004/4/16 PM 09:47
+
+ support guildcastle guardian
+ maybe still have problems..need to try
+ Good Luck Q^^Q
+ P.S: sorry my poor english ^^a
+
+ (map/)
+ mob.c
+ mob_can_reach() fix
+ battle.c
+ battle_calc_damage() fix
+
+ (conf/gvg/)
+ prtg_cas01_guardian.txt
+
+--------------------
+//0942 by ŒÓ’±—–
+
+EƒAƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‚Å•s³‚ȃƒ‚ƒŠ‚ɃAƒNƒZƒX‚·‚éꇂª‚ ‚éƒoƒO‚ðC³
+ (login/)
+ login.c
+ check_ipmask()C³
+
+EƒXƒNƒŠƒvƒgƒŠƒtƒ@ƒŒƒ“ƒX­‚µ’ljÁ‚ÆC³
+ (doc/)
+ script_ref.txt
+ C³
+
+--------------------
+//0941 by (“Ê)
+
+Ee2‚³‚ñ‚Ì•ñ‚ðŒ³‚É¢Š«‚³‚ꂽŽè‰º‚̃Xƒs[ƒh‚𢊫Žå‚Æ“¯‚¶‚É‚µ‚Ä‚Ý‚é
+
+ (map/)
+ battle.c
+ battle_get_speed() C³
+ mob.c
+ mob_spawn() C³
+ mob_summonslave() C³
+
+--------------------
+//0940 by End_of_exam
+
+Eƒq[ƒ‹‚âƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ðŽg—p‚µ‚Ä‚à‰ñ•œ‚µ‚È‚¢ƒoƒO‚ðC³(0938`)B
+
+@Thanks for Pepermint, reporting the bug that using PotionPitcher with
+@BluePotion was no effective.
+@iƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[{‚o‚ÅŒø‰Ê‚ª‚È‚¢Ž–‚ð•ñ‚µ‚Ä‚­‚ꂽPepermintŽ‚ÉŠ´ŽÓj
+
+ (map/)
+ battle.c
+ battle_heal() C³
+
+--------------------
+//0939 by (“Ê)
+EcutinƒpƒPƒbƒg‚ð0x145(ƒtƒ@ƒCƒ‹–¼16•¶Žš)‚©‚ç0x1b3(64•¶Žš)‚É•ÏX
+E‚‚¢‚Å‚ÉŽG’kƒXƒŒ‚Éã‚°‚½athena-start‚𓯫
+
+ (/)
+ athena-start saveƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚Éì‚é‚悤‚É
+ (map/)
+ clif.c
+ clif_cutin() –{ŽIƒpƒPƒbƒg€‹’‚É•ÏX
+ (doc/)
+ client_packet.txt C³
+
+--------------------
+//0938 by ‚Ò‚´‚Ü‚ñ
+
+Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚Ń|‚ð“Š‚°‚Ä‚àƒGƒtƒFƒNƒg‚¾‚¯‚¾‚Á‚½ƒoƒOC³B
+E˜I“XŠJÝ‚ª“Á’è‚̃AƒCƒeƒ€”z’u‚ÅŽ¸”s‚·‚éƒoƒOC³B
+EƒXƒNƒŠƒvƒgŠÖ”getareadropitemŽÀ‘•B
+@Žw’èƒGƒŠƒA“à‚̃hƒƒbƒvƒAƒCƒeƒ€‚ðƒJƒEƒ“ƒg‚·‚éŠÖ”‚Å‚·
+
+@‘Ž®Fgetareadropitem <mapname>,<x0>,<y0>,<x1>,<y1>,<item>;
+@@mapnameF‘ÎÛƒ}ƒbƒv–¼(—áFprontera.gat)
+@@x0‚Æx1F‘ÎÛXÀ•W”͈Í
+@@y0‚Æy1F‘ÎÛYÀ•W”͈Í
+@@itemFƒJƒEƒ“ƒg‚·‚é‘ÎÛƒAƒCƒeƒ€
+
+@–ß‚è’lFmapname“àÀ•W(x0,y0)-(x1,y1)‚͈͓̔à‚É—Ž‚¿‚Ä‚¢‚éitem‚Ì‘ŒÂ”
+@@@@@Žæ“¾Ž¸”sŽž‚É‚Í-1‚ð•Ô‚µ‚Ü‚·B
+@Eitem‚Ì’l‚ÍID‚Å‚àƒAƒCƒeƒ€–¼("Red_Jemstone"‚Æ‚©)‚Å‚à‚¢‚¢‚Å‚·B
+
+ (map/)
+ battle.c
+ battle_heal() C³B
+ vending.c
+ vending_openvending() C³B
+ script.c
+ ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾C³B
+ struct buildin_func[] C³B
+ buildin_getareadropitem()Abuildin_getareadropitem_sub() ’ljÁB
+
+--------------------
+//0937 by netwarrior
+
+- Fix Japanese remarks problem in 0936
+- Fix minor problem in battle_heal()
+
+--------------------
+//0936 by Pepermint
+
+Retouch about problem of increase in quantity at the CART,
+when enter the an minus quantity in the CLIENT.
+
+Retouch about problem of not recovery,use POTIONPITCHER skill.
+
+ (map/)
+ battle.c
+ battle_heal()
+
+ vending.c
+ vending_purchasereq()
+
+--------------------
+//0935 by ŒÓ’±—–
+
+E“à—e‚Ì“¯‚¶ƒXƒNƒŠƒvƒgNPC‚ð‰½“x‚à‹Lq‚µ‚È‚­‚Ä‚àŒ¾‚¢‚悤‚ÉC³
+ ENPC’è‹`‚Ì"script"‚Æ‘‚­•”•ª‚ð"duplicate(NPC–¼)"‚Æ‚·‚é‚ÆA
+ ŠY“–‚ÌNPC‚ƃXƒNƒŠƒvƒg‚ð‹¤—L‚·‚é‚悤‚ÉBNPC–¼‚Í•\Ž¦–¼‚Å‚Í‚È‚­
+ ƒGƒNƒXƒ|[ƒg‚³‚ê‚é–¼‘O‚ðŽw’肵‚Ü‚·B
+ <—á>
+prontera.gat,165,195,1 duplicate(ƒJƒvƒ‰Eˆõ) ƒJƒvƒ‰Eˆõ2 112
+
+ E‹¤—LŒ³‚ÌNPC‚Í“¯‚¶ƒ}ƒbƒvƒT[ƒo[‚É‘¶Ý‚·‚é•K—v‚ª‚ ‚邽‚ßA
+ “¯‚¶ƒ}ƒbƒv‚Å‚È‚¢ê‡‚Íduplicate‚·‚ׂ«‚Å‚Í‚È‚¢B
+ ‚½‚¾‚µANPC‚̈ʒu‚ð"-"‚É‚·‚邱‚Æ‚ÅAƒ}ƒbƒvã‚É‚Í‘¶Ý‚µ‚È‚¢‚ªA
+ ƒ}ƒbƒvƒT[ƒo[“à‚É‚Í‘¶Ý‚·‚éNPC‚ð쬂ł«‚é‚Ì‚ÅA
+ ‚»‚ÌNPC‚ð‹¤—LŒ³‚É‚·‚é‚Ì‚Å‚ ‚ê‚΂ǂ̃}ƒbƒv‚Ö‚à‹¤—L‚Å‚«‚éB
+ <—á>
+
+- script ƒeƒXƒg::test1 112,{ // ‚±‚ÌNPCƒOƒ‰ƒtƒBƒbƒNID‚ÍŽg—p‚µ‚È‚¢
+// (—ª)
+}
+prontera.gat,165,195,1 duplicate(test1) ƒeƒXƒg2 112
+geffen.gat,99,99,1 duplicate(test1) ƒeƒXƒg3 112
+
+ Eã‚̃}ƒbƒv‚É‘¶Ý‚µ‚È‚¢NPC‚̓Cƒxƒ“ƒg‚É‚à‚·‚邱‚Æ‚ª‚Å‚«‚éB
+ i‚ǂ̃}ƒbƒvƒT[ƒo[‚©‚ç‚Å‚à•K‚¸ŒÄ‚Ño‚¹‚éƒCƒxƒ“ƒg‚É‚È‚éj
+
+ (map/)
+ map.h
+ struct npc_label_list’ljÁ,struct npc_dataC³
+ npc.c
+ npc_parse_script()C³
+ •s—v‚É‚È‚Á‚½ƒ‰ƒxƒ‹ƒf[ƒ^ƒx[ƒXŠÖ˜A‚ÌŠÖ”‚ðíœ
+
+--------------------
+//0934 by ‚Ò‚´‚Ü‚ñ
+
+EMOB‚Ìó‘ÔˆÙí‘Ï«‚ª‚₽‚ç‚‚©‚Á‚½‚Ì‚ðC³B
+E‘¬“xŒ¸­‚ÌŽd—l•ÏX(¬Œ÷—¦ŒvŽZŽ®•ÏXEŽ¸”sŽž‚ɂ̓GƒtƒFƒNƒg–³‚µ)B
+E‰½Žž‚ÌŠÔ‚É‚©ó‘ÔˆÙí‚ÌŒp‚¬‘«‚µ‹ÖŽ~‚ªƒRƒƒ“ƒgƒAƒEƒg‚³‚ê‚Ä‚¢‚½‚Ì‚Å–ß‚µB
+Eƒ|ƒCƒYƒ“ƒŠƒAƒNƒg‚̃AƒCƒRƒ“•\Ž¦‚ª–³‚­‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³(‚Å‚ào‚邾‚¯c)
+E”’nŽæ‚èŽÀ‘•B
+
+ (map/)
+ battle.c
+ battle_weapon_attack() C³B
+ clif.c
+ clif_parse_WalkToXY()Aclif_parse_ActionRequest() C³B
+ clif_parse_TakeItem()Aclif_parse_UseItem() C³B
+ clif_parse_DropItem()Aclif_parse_EquipItem() C³B
+ clif_parse_UnequipItem() C³B
+ mob.c
+ mob_can_move()Amob_attack()Amob_ai_sub_hard() C³B
+ mobskill_use_id()Amobskill_use_pos() C³B
+ mobskill_castend_id()Amobskill_castend_pos() C³B
+ pc.c
+ pc_attack_timer()Apc_setpos() C³B
+ skill.c
+ SkillStatusChangeTable[] C³B
+ skill_additional_effect()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_check_condition() C³B
+ skill_status_change_start()Askill_status_change_end() C³B
+ skill_use_id() C³B
+ skill.h C³B
+ (db/)
+ cast_db.txt C³B
+
+--------------------
+//0933 by ŒÓ’±—–
+
+EƒEƒBƒU[ƒh“]EŠNPC‰¼ŽÀ‘•
+ Eeathena‚̃f[ƒ^‚Ì–|–óA‚¨‚æ‚Ñ–^Š‚Ì̂̃f[ƒ^‚ðŒ³‚Éì‚Á‚½‚Ì‚Å
+ ŠàŽI‚Æ‚Í”÷–­‚ɈقȂÁ‚Ä‚é‚ÆŽv‚¢‚Ü‚·B
+ uŒÃ‚¢Šª•¨v‚Æ‚©Žg‚¦‚Ü‚¹‚ñ‚µB
+ EŒ»s‚Ìjob_2nd.txt‚ƈê‚É“Ç‚Ýž‚Þ‚ÆANPC‚ªd‚È‚é‚Ì‚ÅA
+ job_2nd.txt‚ÌŠY“–ƒXƒNƒŠƒvƒg‚ðƒRƒƒ“ƒg‰»‚µ‚Ä‚­‚¾‚³‚¢B
+ ‚½‚¾‚µA‚»‚Ìꇂ̓Z[ƒW‚É“]E‚³‚¹‚Ä‚à‚炦‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (conf/npc/)
+ npc_job_wizard.txt
+ ’ljÁ
+ (conf/warp/)
+ npc_warp_job.txt
+ ƒEƒBƒU[ƒh“]EŠ‚̃[ƒv‚ðƒRƒƒ“ƒg‰»
+
+EƒoƒOC³
+ Egoto‚âmenu‚щƒxƒ‹‚ªŒ©‚‚©‚ç‚È‚¢‚Æ‚«ƒXƒNƒŠƒvƒg‚ÌŽÀs‚ð’†’f‚·‚é‚悤‚É.
+ E‚P‰ñ‚̃XƒNƒŠƒvƒg‚ÌŽÀs‚É‚¨‚¢‚ÄAŽÀs–½—ß”‚ª–ñ8000‚ð’´‚¦‚é‚©A
+ goto‚âmenu‚ÌŽÀs‰ñ”‚ª–ñ500‰ñ‚ð’´‚¦‚é‚ÆŽÀs‚ð’†’f‚·‚é‚悤‚ÉB
+ EŠÖ”/–½—ߎÀsŽž‚É‚àƒGƒ‰[ƒ`ƒFƒbƒN‚ð“ü‚ꂽ
+ EƒMƒ‹ƒh/ƒp[ƒeƒB/ƒyƒbƒg‚Ì–¼‘O‚É“ú–{Œê‚ªŽg‚¦‚È‚¢–â‘èC³
+
+
+ (char/)
+ int_guild.c/int_party.c
+ –¼‘O–â‘èC³
+ (map/)
+ pet.c
+ –¼‘O–â‘èC³
+ script.c
+ C³
+
+--------------------
+//0932 by End_of_exam
+
+E0930‚ŃMƒ‹ƒh‘qŒÉ‚Ì’†g‚ªÁ‚¦‚éƒoƒO‚ðC³B
+
+ (char/)
+ int_storage.c guild_storage_tostr() C³B
+
+--------------------
+//0931 by (“Ê)
+EƒT[ƒo[snapshot
+EAthenaDBŒv‰æ‚©‚çXV‚Ì‚ ‚Á‚½•¨‚𔽉f
+Eatcommand_athena.conf‚Éstr“™‚ð’ljÁ
+Eƒ[ƒvƒ|[ƒ^ƒ‹‚Ì–{ŽI‘Šˆá“_‚ðC³
+E–¶‚³‚ñ‚Ìaldeg_cas03`05‚𓯫
+Ep‚³‚ñ‚Ìnpc_event_kataribe.txt“¯«
+EKAJIKEN‚³‚ñ‚Ìnpc_warp_louyang.txt“¯«
+
+ (db/)
+ item_db.txt •ÏX
+ (conf/)
+ atcommand_athena.conf •ÏX
+ map_athena.conf •ÏX
+ (conf/gvg/)
+ aldeg_cas03.txt •ÏX
+ aldeg_cas04.txt •ÏX
+ aldeg_cas05.txt •ÏX
+ (conf/mob/)
+ npc_monster.txt •ÏX
+ (conf/npc/)
+ npc_event_kataribe.txt ’ljÁ
+ (conf/warp/)
+ npc_warp_louyang.txt ’ljÁ
+ (map/)
+ pc.c pc_memo() •ÏX
+
+--------------------
+//0930 by ŒÓ’±—–
+
+ Šù‘¶‚Ì char/ ‚É‚ ‚élock.c‚Ælock.h‚Í휂µ‚Ä‚­‚¾‚³‚¢B
+ ‚±‚ê‚ç‚Í common/ ‚Ɉړ®‚³‚ê‚Ü‚·B
+
+EƒXƒNƒŠƒvƒg’ljÁC³
+ Esetarrayi”z—ñ‚ÖƒŠƒXƒg‘ã“üj’ljÁ
+ Ecleararrayi”z—ñ‚ðŽw’è’l‚ŃNƒŠƒAj’ljÁ
+ Ecopyarrayi”z—ñ‚ðƒRƒs[j’ljÁ
+ Egetarraysizei”z—ñ‚Ì—LŒø‚È—v‘f”‚ð‹‚ß‚éj’ljÁ
+ Edeletearrayi”z—ñ‚Ì—v‘f‚ð휂µ‚Â߂éj’ljÁ
+ EwarpwaitingpcFl”‚âƒAƒJƒEƒ“ƒgID‚ðƒ}ƒbƒv•Ï”‚ɃZƒbƒg‚·‚é‚悤‚ÉC³
+
+ (map/)
+ script.c
+ FX
+ (doc/)
+ script_ref.txt
+ –½—ߒljÁ‚È‚Ç
+ (npc/sample/)
+ npc_test_array.txt
+ ”z—ñŒnƒeƒXƒg—pNPCƒXƒNƒŠƒvƒg
+
+EƒoƒOC³‚È‚Ç
+ EƒLƒƒƒ‰ƒNƒ^[–¼/ƒAƒJƒEƒ“ƒg–¼/ƒp[ƒeƒB–¼/ƒMƒ‹ƒh–¼/ƒyƒbƒg–¼‚É
+ ƒRƒ“ƒgƒ[ƒ‹ƒR[ƒh‚ðŽg‚¦‚È‚¢‚悤‚ÉC³B
+ Echar.c‚È‚Ç‚Ì•Û‘¶‚ÌŒø—¦‚ðX‚ɃAƒbƒvB
+ E‘qŒÉƒtƒ@ƒCƒ‹/ƒMƒ‹ƒh‘qŒÉƒtƒ@ƒCƒ‹‚É‹ós‚ªŽc‚ç‚È‚¢‚悤‚ÉC³
+ Elock.*‚ðcommon/‚Ɉړ®Aƒtƒ@ƒCƒ‹‚ª•Û‘¶‚Å‚«‚È‚­‚È‚éƒoƒOC³A
+ ƒAƒJƒEƒ“ƒg‚ƃ}ƒbƒv•Ï”‚Ì•Û‘¶‚É‚àlock_fopen‚ðŽg‚¤‚悤‚ÉB
+
+ (common/)
+ lock.c/lock.h
+ ƒtƒHƒ‹ƒ_ˆÚ“®Alock_fopenC³
+ (login/)
+ login.c
+ mmo_auth_new()C³
+ (char/)
+ char.c
+ mmo_char_tostr(),make_new_char()C³
+ int_storage.c
+ storage_tostr(),guild_storage_tostr(),
+ inter_storage_save_sub(),inter_guild_storage_save_sub()C³
+ int_party.c
+ int_guild.c
+ –¼‘O–â‘èC³
+ (map/)
+ pet.c
+ –¼‘O–â‘èC³
+
+--------------------
+//0929 by ‚Ò‚´‚Ü‚ñ
+
+Eƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[Š®‘SŽÀ‘•B
+Eƒvƒƒ{ƒbƒN‚̃XƒLƒ‹Žd—l•ÏX(‰r¥–WŠQE“€Œ‹AΉ»A‡–°‰ðœ)B
+EƒŠƒJƒoƒŠ[‚̃XƒLƒ‹Žd—l•ÏX(ƒAƒ“ƒfƒbƒh‚ÉŽg—p‚·‚é‚ƈê’èŠm—¦‚ňÈŌø‰Ê)B
+Eó‘ÔˆÙí’†‚Å‚à‘•”õ‚ÌØ‚è‘Ö‚¦‚ªo—ˆ‚é‚悤‚É•ÏXB
+EƒAƒCƒeƒ€Ž©“®Žæ“¾’†‚É@killmonster‚ðŽg—p‚·‚é‚Æ—Ž‚¿‚éƒoƒOC³B
+EŒÓ’±—–‚³‚ñ‚ªã‚°‚Ä‚¢‚½npc.c‚𓯫‚µ‚Ü‚µ‚½B
+Eskill_db‚Å‹C‚É‚È‚Á‚Ä‚½‚Æ‚±‚ð‚¿‚å‚±‚Á‚ÆC³B
+
+ (map/)
+ clif.c
+ clif_parse_EquipItem() C³B
+ skill.c
+ skill_castend_nodamage_id() C³B
+ skill_unitsetting()Askill_unit_onplace() C³B
+ skill_landprotector() ’ljÁB
+ mob.c
+ mob_delay_item_drop()Amob_delay_item_drop2() C³B
+ npc.c C³
+
+ (db/)
+ skill_db.txt C³B
+
+--------------------
+//0928 by End_of_exam
+
+EƒLƒƒƒ‰‚â‘qŒÉ“àƒAƒCƒeƒ€‚ªÁ‚¦‚é–â‘è‚ÉŽb’è‘ΈiƒLƒƒƒ‰ŽI‚̉ü—ÇjB
+
+@1.ƒLƒƒƒ‰ƒf[ƒ^E‘qŒÉƒf[ƒ^‚̃f[ƒ^•ÏŠ·ˆ—‚ð‰ü—ÇB
+@@(char/char.c , char/int_storage.c)
+
+@2.ƒtƒ@ƒCƒ‹‘‚«o‚µ‚ªI‚í‚é‚Ü‚ÅA‹Œƒtƒ@ƒCƒ‹‚ðŽc‚·‚悤‚ÉC³B
+@ichar/lock.c, char/lock.h ‚̒ljÁBƒƒCƒNƒtƒ@ƒCƒ‹‚ÌC³B
+@@char/int_storage.c,int_guild.c,int_party.c,int_pet.c,char.c,inter.c
+@@“à‚É‚ ‚éAƒf[ƒ^‘‚«o‚µˆ—‚ð•ÏXBj
+
+--------------------
+//0927 by ‚Ò‚´‚Ü‚ñ
+
+E•ŠíUŒ‚ˆÈŠO‚ÉŽí‘°•â³‚ª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
+E‰‰‘t’†‚ÉŠyŠíE•ÚˆÈŠO‚Ì•Ší‚ÉŽ‚¿•Ï‚¦‚é‚Ɖ‰‘t‚ªŽ~‚Ü‚é—l‚ÉC³B
+E‰‰‘t‚ÌŒø‰Ê‚ª‰‰‘tŽÒŽ©g‚É‚Í‚©‚©‚ç‚È‚¢‚悤‚ÉC³B
+EƒAƒCƒeƒ€Ž©“®Žæ“¾‹@”\ŽÀ‘•
+@“G‚ð“|‚µ‚½Žž‚ÉAƒAƒCƒeƒ€‚ªƒhƒƒbƒv‚³‚ê‚é‚Ì‚Å‚Í‚È‚­A‚»‚Ì“G‚Ɉê”Ô‘½‚­‚̃_ƒ[ƒW‚ð
+@—^‚¦‚½l(ƒ‹[ƒgŒ 1ˆÊ‚Ìl)‚ɃhƒƒbƒvƒAƒCƒeƒ€‚ªŽ©“®‚Å—^‚¦‚ç‚ê‚é‹@”\‚Å‚·B
+@battle_athena.conf‚Ìitem_auto_get‚ÅÝ’è‚Å‚«‚Ü‚·B
+@ƒIƒŠƒWƒiƒ‹ƒAƒbƒvƒf[ƒg‚̈×Abattle_athena.conf‚ł̃fƒtƒHƒ‹ƒg‚Å‚Íno‚É‚µ‚Ä‚¢‚Ü‚·B
+E‘®«ê(ƒfƒŠƒ…[ƒWEƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹Eƒ{ƒ‹ƒP[ƒmEƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[)‰¼ŽÀ‘•
+@ˆê•”‚Ì‹@”\‚ª–¢ŽÀ‘•‚Å‚·
+@@ƒfƒŠƒ…[ƒWF…ê‚ð—p‚¢‚½ƒEƒH[ƒ^[ƒ{[ƒ‹
+@@ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹Fƒtƒ@ƒCƒA[ƒEƒH[ƒ‹‚ÌŽ‘±ŽžŠÔ•â³
+@@ƒ{ƒ‹ƒP[ƒmFƒAƒCƒXƒEƒH[ƒ‹‹ÖŽ~
+@@ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[FƒIƒuƒWƒFƒNƒgÝ’uŒnƒXƒLƒ‹‹ÖŽ~(‚‚܂èo‚邾‚¯‚ÌLP‚Å‚·)
+
+ (map/)
+ battle.c
+ battle_calc_damage()Abattle_calc_magic_attack() C³B
+ battle_calc_misc_attack()Abattle_config_read() C³B
+ mob.c
+ mob_delay_item_drop()Amob_delay_item_drop2() C³B
+ pc.c
+ pc_calcstatus()Apc_equipitem() C³B
+ skill.c
+ ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾C³B
+ SkillStatusChangeTable[] C³B
+ skill_castend_nodamage_id()Askill_castend_pos2() C³B
+ skill_unitsetting()Askill_unit_onplace() C³B
+ skill_unit_onout()Askill_unit_ondelete() C³B
+ skill_status_change_start()Askill_status_change_end() C³B
+ skill_clear_element_field() ’ljÁB
+ battle.h C³B
+ skill.h C³B
+ (conf/)
+ battle_athena.conf
+ item_auto_get€–Ú‚ð’ljÁB
+ (db/)
+ cast_db.txt C³B
+
+--------------------
+//0926 by ŒÓ’±—–
+
+EƒMƒ‹ƒhé‚̉Šú‰»•û–@•ÏX
+ E‘S‚ẴMƒ‹ƒhéi{è‹’ƒMƒ‹ƒhî•ñj‚ðŠ“¾‚µ‚½‚Æ‚«‚ÉOnAgitInit‚ª
+ ‚æ‚΂ê‚é‚悤‚ÉBGetCastleData‚âRequestGuildInfo‚Ì•K—v‚ª‚È‚­‚È‚è‚Ü‚·B
+ ]‚Á‚ÄAŒ»Ý‚ÌgvgƒXƒNƒŠƒvƒg‚ÌOnInterIfInit‚âOnRecvCastleXXX‚Í
+ •K—v‚È‚­‚È‚è‚Ü‚·Bi‚¨‚»‚ç‚­Œ»s‚̃XƒNƒŠƒvƒg‚à“®ì‚͉”\‚Å‚·j
+ ‰Šú‰»‚ª•K—v‚ÈNPC‚Í•Ï‚í‚è‚ÉOnAgitInit‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
+ ‚È‚¨A•s—v‚É‚È‚Á‚½–½—ß‚È‚Ç‚ð휂·‚é—\’è‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ (char/)
+ inter.c/inter.h/char.c/int_guild.c/int_guild.h
+ ƒ}ƒbƒvƒT[ƒo[Ú‘±Žž‚Ɉ—‚ðs‚¦‚é‚悤‚ÉC³
+ Ú‘±Žž‚ɃMƒ‹ƒhéƒf[ƒ^‚ð‘—M‚·‚é‚悤‚É
+ (map/)
+ intif.c/guild.c/guild.h
+ Ú‘±Žž‚̃Mƒ‹ƒhéƒf[ƒ^ˆêŠ‡ŽóMˆ—•ƒMƒ‹ƒhî•ñ—v‹A
+ OnAgitInit‚̌ĂÑo‚µ‚È‚Ç
+ chrif.c
+ ‹ŒOnAgitInit‚̌ĂÑo‚µíœ
+ (doc/)
+ inter_server_packet.txt
+ ƒMƒ‹ƒhéƒf[ƒ^ˆêŠ‡‘—MƒpƒPƒbƒg0x3842’ljÁ
+
+EƒXƒNƒŠƒvƒg‚ÉNPCŽå‘̃Cƒxƒ“ƒgŽÀs–½—ߒljÁ
+ Edonpcevent(NPCŽå‘̃Cƒxƒ“ƒgŽÀs)’ljÁ
+ ‚±‚¿‚ç‚Ídoevent‚ƈႢƒuƒ[ƒhƒLƒƒƒXƒg‰Â”\‚Å‚·BÚׂÍscript_refB
+ Eisloggedin‚̃Rƒ“ƒpƒCƒ‹Œx‚ª‚Å‚È‚¢‚悤‚ÉC³
+ (map/)
+ script.c
+ buildin_donpcevent()’ljÁ‚È‚Ç
+ (doc/)
+ script_ref.txt
+ doevent,donpcevent,OnAgitInit’ljÁ‚È‚Ç
+
+E‚»‚Ì‘¼C³
+ (map/)
+ clif.c
+ clif_parse_GMReqNoChat()’ljÁ
+
+
+--------------------
+//0925 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚̃oƒOC³
+ Emonster,areamonster‚Ì–â‘èC³
+ ‚±‚ê‚ç‚Íscript_rid2sd‚ðŽg—p‚µ‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
+ sd‚ªNULL‚Ì‚Æ‚«AƒŒƒxƒ‹ƒ`ƒFƒbƒN‚ðs‚í‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
+
+ (map/)
+ script.c/mob.c
+ buildin_monster(),buildin_areamonster(),mob_once_spawn()‘¼
+
+EƒXƒNƒŠƒvƒg‚Ì‹@”\’ljÁ
+ Edetachrid–½—ßiƒvƒŒƒCƒ„[‚̃fƒ^ƒbƒ`j’ljÁ
+ EisloggedinŠÖ”iƒvƒŒƒCƒ„[‚̃ƒOƒCƒ“ƒ`ƒFƒbƒNj’ljÁ
+ Egetitem,getitem2–½—ß,countitem,checkweightŠÖ”‚Å
+ nameid‚ɃAƒCƒeƒ€‚Ì–¼‘O‚ðŽw’è‰Â”\‚ÉB
+ (item_db‚ȂǂɈˑ¶‚·‚邽‚ßAŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAˆê‰ž)
+
+ (map/)
+ script.c
+ FX
+ (doc/)
+ script_ref.txt
+ •ÏX•”•ª‚ƃGƒ‰[à–¾C³
+
+Eathena-start‚Æstart‚ðC³
+ Eathena-start stop‚ŃvƒƒZƒX‚ªI—¹‚·‚é‚܂ő҂‚悤‚É
+ Estart‚ÅÄ‹N“®‚³‚¹‚é‚Æ‚«athena-start restart‚ðŒÄ‚Ԃ悤‚ÉB
+
+--------------------
+//0924 by (“Ê)
+
+EƒoƒO•ñƒXƒŒƒbƒh part4 >>66‚Ìnpc‚ðŽæ‚èž‚Ý
+E“¯ >>51‚Ìguild.c‚𔽉f
+E“¯ >>38‚Ìatcommand_athena.conf‚Ö‚Ì•ÏX‚ðŽæ‚èž‚Ý
+E‚È‚º‚©npcƒtƒHƒ‹ƒ_‚É‚ ‚Á‚Ämap_athena.conf‚È‚¢ƒtƒ@ƒCƒ‹‚ðˆê——‚ɒljÁB‚‚¢‚łɃMƒ‹ƒhƒtƒ‰ƒbƒO‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
+Econf/npc/npc_job_1st.txt npc_script2.txt npc_shop3.txt‚̓XƒiƒbƒvƒVƒ‡ƒbƒg‚©‚ç휂µ‚Ä‚­‚¾‚³‚¢
+
+ (map/)
+ guild.c C³
+ (conf/)
+ map_athena.conf C³
+ atcommand_athena.conf C³
+ (conf/npc/)
+ npc_event_hat.txt C³
+ npc_event_oni.txt C³
+ npc_job_1st.txt íœ
+ npc_script2.txt íœ
+ npc_shop3.txt íœ
+
+--------------------
+//0923 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚̃oƒOC³
+Escript_rid2sd‚ªŽ¸”s‚µ‚Ä‚àƒT[ƒo[‚ðI—¹‚µ‚È‚¢‚悤‚É•ÏX
+ Emonster,areamonster‚È‚Ç‚ªŽÀs‚Å‚«‚È‚¢–â‘èC³
+
+ (map/)
+ script.c/mob.c
+ buildin_monster()‚È‚ÇC³
+
+ (doc/)
+ script_ref.txt
+ ƒ‰ƒxƒ‹‚ƃGƒ‰[‚Ìà–¾C³
+
+--------------------
+//0922 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒgƒGƒ‰[‚Ìs”Ô†‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚É
+
+ (map/)
+ itemdb.c / npc.c
+ itemdb_readdb(),npc_parse_script()C³
+
+EƒLƒƒƒ‰ƒNƒ^[î•ñ‚ɃAƒNƒZƒX‚Å‚«‚È‚¢ó‘ԂŃAƒNƒZƒX‚·‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉC³
+Egoto/menu‚щƒxƒ‹‚ªŽw’肳‚ê‚éꊂɃ‰ƒxƒ‹ˆÈŠO‚ªŽw’肳‚ê‚é‚ÆŒx‚ðo‚·‚悤‚É
+Escript_ref‚ɃGƒ‰[ƒƒbƒZ[ƒW‚Ìà–¾’ljÁ
+EƒCƒxƒ“ƒg‹N“®‚³‚ꂽƒXƒNƒŠƒvƒg‚ŃLƒƒƒ‰ƒNƒ^[‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éŠÖ”’ljÁ
+ EattachridiŽw’肵‚½ID‚Ìî•ñ‚ðŽg—p‚Å‚«‚é‚悤‚É‚·‚éj’ljÁ
+ Egetcharidi3‚ŃAƒJƒEƒ“ƒgID‚ðŠ“¾‚Å‚«‚é‚悤‚ÉjC³
+ (map/)
+ script.c
+ script_rid2sd(),buildin_attachrid()’ljÁ
+ ‘½XC³B
+ (doc/)
+ script_ref.txt
+ ƒGƒ‰[ƒƒbƒZ[ƒW‚Ìà–¾’ljÁA•Ï”/ƒ‰ƒxƒ‹‚Ìà–¾C³
+ ‘¼C³
+
+--------------------
+//0921 by RR
+EƒXƒNƒŠƒvƒgƒoƒOC³(‚²–À˜f‚ð‚¨‚©‚¯‚µ‚Ü‚µ‚½)
+ (conf/npc/)
+ npc_event_tougijou.txt
+
+Esteal—¦C³(Ž©DEX - “GDEX + SLv*3 +10‚Ì•”•ª‚ňê“x”»’è‚ð‚µ‚Ä‚¢‚½‚Ì‚Å)
+E0918‚Å0914ˆÈ‘O‚ÉŠª‚«–ß‚Á‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½•”•ª‚ðŒ³‚É–ß‚µ‚½
+ (map/)
+ pc.c
+ pc_steal_item() C³
+ itemdb.c
+ pet.c
+ skill.c C³
+
+--------------------
+//0920 by Ž‚Žqo^.^o
+E Steal—¦ = Drop—¦ * (Ž©DEX - “GDEX + SLv*3 +10) /100
+ (map/)
+ pc.c
+ int pc_steal_item()C³
+
+--------------------
+//0919 by RR
+Eatcommand‚Ìlvup‚ðŽg‚¤‚Ǝ擾ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‚¨‚©‚µ‚¢–â‘è‚ÌC³
+EƒoƒOC³(ƒoƒO•ñƒXƒŒ‚ÅC³‚Ìo‚½‚à‚Ì‚ÌŽæ‚èž‚Ý@ŒÓ’±—–‚³‚ñAp‚³‚ñA‹¤‚É‚¨”æ‚ê—l‚Å‚·)
+ (map/)
+ atcommand.c
+ atcommand_baselevelup()C³
+ guild.c
+ guild_gvg_eliminate_timer()C³
+ pc.c
+ pc_setreg(),pc_setregstr()C³
+ (login/)
+ login.c
+ parse_login()C³
+--------------------
+//0918 by ¹
+Eitem_dbŽ©‘Ì‚ªƒI[ƒo[ƒ‰ƒCƒh‰Â”\‚É‚È‚Á‚½‚Ì‚ÅAclass_equip_db.txt‚Ì”pŽ~B
+Epet_db.txtAproduce_db.txt‚àƒI[ƒo[ƒ‰ƒCƒh‰Â”\‚ÉC³B
+ (map/)
+ itemdb.c
+ do_init_itemdb() C³B
+ pet.c
+ read_petdb() C³B
+ skill.c
+ skill_readdb() C³B
+
+--------------------
+//0917 by RR
+EƒXƒNƒŠƒvƒgC³
+ “‘¾˜YƒCƒxƒ“ƒg‚Æ“¬‹ZêƒCƒxƒ“ƒg‚ðNPCƒ^ƒCƒ}[‚É•ÏX
+ (conf/npc/)
+ npc_event_momotarou.txt
+ npc_event_tougijou.txt C³
+EƒXƒLƒ‹ƒcƒŠ[C³(ƒoƒO•ñƒXƒŒ25‚æ‚è)
+ (db/)
+ skill_db.txt C³
+
+--------------------
+//0916 by (“Ê)
+Enpc_monster‚Énpc_mob_job‚ð“‡Bnpc_mob_job.txt‚Í휂µ‚Ä‚©‚Ü‚¢‚Ü‚¹‚ñ
+
+ (conf/)
+ map_athena.conf npc_mob_job‚ðíœ
+ (conf/mob/)
+ npc_monster.txt XV
+
+--------------------
+//0915 by ŒÓ’±—–
+
+ENPCƒ^ƒCƒ}[ŠÖŒW‚Ì–½—ߒljÁ•C³‘¼
+ EdelwaitingroomiNPCƒ`ƒƒƒbƒgI—¹jˆø”‚ðŒ©‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³
+ EinitnpctimeriNPCƒ^ƒCƒ}[‰Šú‰»j’ljÁ
+ EstopnpctimeriNPCƒ^ƒCƒ}[’âŽ~j’ljÁ
+ EstartnpctimeriNPCƒ^ƒCƒ}[ŠJŽnj’ljÁ
+ EgetnpctimeriNPCƒ^ƒCƒ}[î•ñŠ“¾j’ljÁ
+ EsetnpctimeriNPCƒ^ƒCƒ}[’lÝ’èj’ljÁ
+
+ Šù‘¶‚Ìaddtimer‚Ȃǂ̓vƒŒƒCƒ„[’PˆÊ‚Ì‚½‚ßANPC’PˆÊ‚̃^ƒCƒ}[‚ðì‚è‚Ü‚µ‚½B
+ ‚±‚¿‚ç‚ÍAaddtimer‚ȂǂƂ͈ႢAOnTimerXXX‚Æ‚¢‚¤•—‚Ƀ‰ƒxƒ‹‚ðŽw’肵‚Ü‚·B
+ Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚Æscrit_ref.txt‚ðŽQÆB
+
+ (map/)
+ map.h
+ struct npc_data C³Astruct npc_timerevent_list’ljÁ
+ npc.c / npc.h
+ npc_timerevent(),npc_timerevent_start(),npc_timerevent_stop(),
+ npc_gettimerevent_tick(),npc_settimerevent_tick()’ljÁ
+ npc_parse_script()C³
+ script.c
+ buildin_*npctimer()’ljÁ‚È‚Ç
+ (conf/sample/)
+ npc_test_npctimer.txt
+ NPCƒ^ƒCƒ}[Žg—pƒTƒ“ƒvƒ‹
+ (doc/)
+ script_ref.txt
+ NPCƒ^ƒCƒ}[ŠÖŒW‚Ì–½—ß/ŠÖ”’ljÁA’蔃‰ƒxƒ‹‚Ìà–¾C³
+
+ESage‚̃A[ƒXƒXƒpƒCƒN‚ÌŠ“¾ðŒC³
+ (db/)
+ skill_tree.txt
+ ƒA[ƒXƒXƒpƒCƒN‚ÌsiƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“‚ðLv1‚Éj
+
+--------------------
+//0914 by p
+E”͈̓XƒLƒ‹Žg—pŽž‚ɉð•úς݃ƒ‚ƒŠ‚ðŽQÆ‚µ‚Ä‚¢‚½–â‘è‚ɑΉž
+Eƒƒ‚ƒŠ‚ð‰Šú‰»‚¹‚¸‚ÉŽg—p‚µ‚Ä‚¢‚½—̈æ‚ðA‰Šú‰»‚µ‚Ä‚©‚çŽg—p‚·‚é‚悤‚É•ÏX
+ (common/)
+ db.c
+ grfio.c
+ socket.c
+ timer.c
+ (char/)
+ char.c
+ int_guild.c
+ int_party.c
+ int_pet.c
+ int_storage.c
+ inter.c
+ (login/)
+ login.c
+ (map/)
+ ‚Ù‚Æ‚ñ‚Ç.c
+
+--------------------
+//0913 by Kalen
+
+EGVGScript‚ÌC³
+@911‘Ήž
+@ƒtƒ‰ƒO‚©‚çƒAƒWƒg‚Ö–ß‚é‹@”\’ljÁ
+@–ß‚é‚Æ‚«‚É•·‚©‚ê‚é‚悤‚ÉC³(TESTscript)
+@Ԏ擾Žž::OnRecvCastleXXX‚ð”­“®‚·‚é‚悤‚ÉC³
+ (conf/gvg/)
+ ‚Ù‚Æ‚ñ‚Ç.txt
+
+--------------------
+//0912 by (“Ê)
+E‚±‚̃tƒ@ƒCƒ‹‚Ì•¶Žš‰»‚¯‚ÆTEST_prtg_cas01_AbraiJ‚Ì•¶Žš‰»‚¯‚ðC³
+EƒoƒO•ñƒXƒŒ‚Ì>>19-20‚ðŽæ‚èž‚Ý
+EÌ‚â‚Á‚¿‚Ü‚Á‚½battle_athena.conf‚̌뎚‚Ì’ù³
+
+ (common)
+ mmo.h
+ #define MAX_STAR 3‚ÉC³
+ (conf)
+ battle_athena.conf
+ (conf/gvg/)
+ TEST_prtg_cas01_AbraiJ.txt
+ (map)
+ atcommand.c
+ get_atcommandinfo_byname() C³
+
+
+--------------------
+//0911 by Michael_Huang
+
+ Mounting Emblem of the Flag-NPC.
+ (Added Script Command: FlagEmblem).
+
+(conf/gvg/)
+ TEST_prtg_cas01_AbraiJ.txt (FlagEmblem Test)
+
+ (map/)
+ map.h struct npc_data{}
+ clif.c clif_npc0078()
+ script.c buildin_flagemblem()
+
+--------------------
+//0910 by RR
+EƒXƒNƒŠƒvƒg‚̊ԈႢ‚ðC³
+(conf/gvg/)
+ ev_agit_payg.txt
+ ev_agit_gefg.txt
+
+E‚ЂÈÕ‚è‚Ɉê“x“ü‚Á‚½‚çƒ}ƒbƒv•Ï”‚ªŽc‚Á‚½‚Ü‚Ü‚É‚È‚é‚Ì‚ÅAƒ}ƒbƒv•Ï”‚ðŽg‚í‚È‚¢‚悤•ÏX
+(ˆêŽž“Iƒ}ƒbƒv•Ï”‚É‚·‚ê‚Ζâ‘è‚È‚¢‚Æ‚àŒ¾‚¦‚Ü‚·‚ªA
+town_guide‚Ætown_kafra‚ÉŽžŠúŒÀ’è‚Ì•¨‚ªí’“‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ª‹C‚É‚È‚Á‚½‚Ì‚ÅA
+‚»‚ê‚ç‚ðevent_hinamatsuri‚ÖˆÚ“®‚µA•’i‚Ì‚ðdisable‚µ‚Ä‚¢‚Ü‚·)
+ (conf/npc/)
+ npc_event_hinamatsuri
+ npc_town_guide
+ npc_town_kafra
+
+EƒXƒLƒ‹ƒŠƒZƒbƒgŽž‚̃XƒLƒ‹Žæ“¾§ŒÀ”»’è‚ðƒXƒLƒ‹ƒ|ƒCƒ“ƒg48ˆÈãÁ”ï‚©‚çA
+ ƒXƒLƒ‹ƒ|ƒCƒ“ƒg58ˆÈãÁ”ï‚©Žc‚èƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ªJOBLEVEL‚æ‚謂³‚­‚È‚Á‚½‚Æ‚«‚É•ÏX
+E@modelŽž‚Ì•žFõF§ŒÀ‚ðŠÉ˜a(’jƒAƒTAƒ[ƒO‚Ì‚Ý‚Ö)
+ (map/)
+ pc.c pc_calc_skilltree()
+ atcommand.c atcommand_model()
+
+
+--------------------
+//0909 by ŒÓ’±—–
+
+ENPCƒ`ƒƒƒbƒgŠÖŒW‚Ì–½—ߒljÁ
+ EwaitingroomiNPCƒ`ƒƒƒbƒgì¬jC³iƒCƒxƒ“ƒg‚ð‹N‚±‚·l”‚ðŽw’è‰Â”\j
+ EdelwaitingroomiNPCƒ`ƒƒƒbƒgI—¹j’ljÁ
+ EenablewaitingroomeventiNPCƒ`ƒƒƒbƒgƒCƒxƒ“ƒg—LŒø‰»j’ljÁ
+ EdisablewaitingroomeventiNPCƒ`ƒƒƒbƒgƒCƒxƒ“ƒg–³Œø‰»j’ljÁ
+ EgetwaitingroomstateiNPCƒ`ƒƒƒbƒgó‘ÔŠ“¾j’ljÁ
+ EwarpwaitingpciNPCƒ`ƒƒƒbƒgƒƒ“ƒo[ƒ[ƒvjC³
+ Ú‚µ‚­‚Íscript_ref.txt‚ðŽQÆ
+
+ (map/)
+ script.c/npc.c/npc.h/chat.c/chat.h/clif.c
+ ‘½XC³
+ (doc/)
+ script_ref.txt
+ C³
+ (conf/sample/)
+ npc_test_chat.txt
+ ’ljÁ–½—߂̃eƒXƒgƒXƒNƒŠƒvƒg
+
+EƒXƒNƒŠƒvƒg‚̊ԈႢ‚ðC³
+ (conf/npc/)
+ npc_event_skillget.txt
+ npc_event_yuno.txt
+ npc_town_lutie.txt
+ npc_turtle.txt
+ “ä–½—ßadditem‚ðgetitem‚É’uŠ·
+ npc_town_guide.txt
+ “ä–½—ßscriptlabel‚ðƒRƒƒ“ƒg‰»
+ npc_event_momotaro.txt
+ npc_job_swordman.txt
+ npc_job_magician.txt
+ ';'•t‚¯–Y‚êC³
+ (conf/gvg/)
+ ev_agit_aldeg.txt
+ @GID4‚ð@GIDa4‚É’uŠ·
+ ev_agit_gefg.txt
+ ev_agit_payg.txt
+ Annouce‚ÉFŽw’è‚Æ';'‚Ì•t‚¯–Y‚ê‚ðK«
+
+
+EAthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚ÝA‚»‚Ì‘¼C³
+ ˆÀ’肵‚Ä‚¢‚éƒf[ƒ^‚©‚Ç‚¤‚©‚í‚©‚è‚Ü‚¹‚ñ‚ªB
+
+ (db/)
+ item_db.txt/mob_db.txt/mob_skill_db.txt
+ AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
+ mob_skill_db.txt.orig
+ ˆÈ‘O‚̃f[ƒ^iƒRƒƒ“ƒg•”•ª‚È‚Ç‚ÌŽQl‚Éj
+ (conf/)
+ water_height.txt/mapflag.txt
+ AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
+ map_athena.conf
+ npc_monster3*.txt‚ðíœ
+ ’ljÁƒ}ƒbƒvƒf[ƒ^ (by ID:UVsq5AE)
+ (conf/mob/)
+ npc_monster.txt
+ AthenaDBŒv‰æ‚̃f[ƒ^‚Ƃ肱‚Ý
+
+--------------------
+//0908 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚̃Gƒ‰[ƒ`ƒFƒbƒNˆ—‚ð‘‚₵‚½
+ E•¶Žš—ñ‚Ì“r’†‚ʼnüs‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
+ EŠÖ”ŒÄ‚Ño‚µ‰‰ŽZŽq'('‚Ì’¼‘O‚ÉŠÖ”–¼ˆÈŠO‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
+ E–½—ß‚ª‚ ‚é‚ׂ«‚Æ‚±‚ë‚ÉŠÖ”–¼ˆÈŠO‚ª‚ ‚é‚ƃGƒ‰[‚ðo‚·‚悤‚ÉB
+ E–½—ß‚¨‚æ‚ÑŠÖ”‚̈ø”‹æØ‚è‚Ì','‚ðÈ—ª‚·‚é‚ÆŒx‚ðo‚·‚悤‚ÉB
+ E–½—ß‚¨‚æ‚ÑŠÖ”‚̈ø”‚Ì”‚ªˆÙ‚È‚é‚ÆŒx‚ðo‚·‚悤‚ÉB
+
+ (map/)
+ script.c
+ FXC³
+
+ENPCƒXƒNƒŠƒvƒgC³
+ (conf/npc/)
+ npc_town_guide.txt
+ ‚Ss–Ú‚Í‚¢‚ç‚È‚¢‚悤‚Ȃ̂ŃGƒ‰[‚ªo‚È‚¢‚悤‚ɃRƒƒ“ƒg‰»
+ npc_event_hat.txt
+ ƒRƒ‚ƒh‚̉¼–ÊEl‚ƃtƒFƒCƒˆƒ“‚Ì”N (by ID:dS8kRnc)
+ (conf/sample/)
+ npc_card_remover.txt
+ @menu‚ðŽg‚Á‚Ä’Z‚­‚µ‚½••¶Í­‚µC³
+
+E‚»‚Ì‘¼
+ (db/)
+ skill_tree.txt
+ Sage‰ž‹}Žè“–
+
+--------------------
+//0907 by p
+Eatcommand() ‚Ì”ì‘剻‚ª‚Ђǂ¢‚̂ŃŠƒtƒ@ƒNƒ^ƒŠƒ“ƒO
+ @ ƒRƒ}ƒ“ƒh‚ð’ljÁ‚·‚éꇂÍAatcommand.h “à‚Œ蔂ðAatcommand.c “à‚Å
+ ŠÖ”’è‹`ƒ}ƒNƒ‚ƃ}ƒbƒsƒ“ƒOƒe[ƒuƒ‹Aˆ——p‚ÌŠÖ”‚ð‹Lq‚µ‚Ä‚­‚¾‚³‚¢B
+Eglobal •Ï”‚Ì atcommand_config ‚ðÁ‹ŽB
+ @ ƒRƒ}ƒ“ƒh–ˆ‚̃Œƒxƒ‹‚Í get_atcommand_level() ‚Ŏ擾‚µ‚Ä‚­‚¾‚³‚¢B
+Eˆê•”‚̃Lƒƒƒ‰–¼‚ðŽæ‚é @ ƒRƒ}ƒ“ƒh‚ÅA”¼ŠpƒXƒy[ƒX‚ðŠÜ‚Þ–¼‘O‚̃Lƒƒƒ‰‚ð
+ ³í‚Ɉ—‚Å‚«‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ðC³B
+ ‚±‚̉e‹¿‚É‚æ‚èA@rura+ ‚È‚ÇAƒLƒƒƒ‰–¼‚ªƒpƒ‰ƒ[ƒ^‚Ì“r’†‚É‚ ‚Á‚½‚à‚Ì‚Í
+ ‘S‚ÄÅŒã‚ɉñ‚³‚ê‚Ä‚¢‚Ü‚·B
+E@ ƒRƒ}ƒ“ƒh‚Ì•¶Žš—ñ‚ð³í‚Ɏ擾‚Å‚«‚È‚©‚Á‚½ê‡‚ÉAƒoƒbƒtƒ@‚Ì“à—e‚ð
+ ƒ`ƒFƒbƒN‚¹‚¸‚Ɉ—‚ðs‚¨‚¤‚Æ‚µ‚Ä‚¢‚½•”•ª‚ðC³‚µ‚Ü‚µ‚½B
+
+ (common/)
+ mmo.h
+ (map/)
+ atcommand.h
+ atcommand.c
+ clif.h
+ clif.c
+
+--------------------
+//0906 by Selena
+EŒÓ’±—–‚³‚ñ‚ÌC³‚É‚ ‚킹‚ÄAƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚PˆÈŠO‚̃XƒNƒŠƒvƒg‚ÌC³B
+E@ƒRƒ}ƒ“ƒh“ü—̓~ƒX‚ÌۂɃGƒ‰[ƒƒbƒZ[ƒW‚ð•\Ž¦B
+ (conf/gvg/)
+ ev_agit_aldeg.txt
+ ev_agit_gefg.txt
+ ev_agit_payg.txt
+ ev_agit_prtg.txt
+ aldeg_cas01`05.txt
+ gefg_cas01`05.txt
+ payg_cas01`05.txt
+ prtg_cas02`05.txt
+ (map/)
+ atcommand.c
+
+--------------------
+//0905 by ŠÇ—l
+
+EƒT[ƒo[snapshot
+E‘OƒXƒŒ‚̃tƒ@ƒCƒ‹Žæ‚è–Y‚ꂽl‚ª‚¢‚é‚©‚à‚µ‚ê‚È‚¢‚Ì‚Å
+
+--------------------
+//0904 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒgˆ—C³
+ Echar/interƒT[ƒo[‚ÉÚ‘±‚µ‚½Žž‚ÉOnCharIfInit/OnInterIfInitƒCƒxƒ“ƒg‚ª
+ ŒÄ‚΂ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ OnAgitInit‚ÍOnInterIfInit‚É•ÏX‚·‚ׂ«‚Å‚·B
+ Egetcastledata–½—ß‚Å‘æ‚Qƒpƒ‰ƒ[ƒ^‚ª0‚Ì‚Æ‚«A‘æ‚Rƒpƒ‰ƒ[ƒ^‚É
+ ƒCƒxƒ“ƒg–¼‚ðÝ’è‚Å‚«‚Ü‚·B‚±‚̃Cƒxƒ“ƒg‚̓Mƒ‹ƒhé‚̃f[ƒ^‚ð
+ InterƒT[ƒo[‚©‚犓¾Š®—¹‚µ‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+ E‹N‚±‚·NPCƒCƒxƒ“ƒg–¼‚ð"::"‚ÅŽn‚ß‚é‚ÆA“¯–¼ƒ‰ƒxƒ‹‚ðŽ‚‘SNPC‚̃Cƒxƒ“ƒg
+ ‚ðŽÀs‚Å‚«‚Ü‚·B
+ ‚½‚Æ‚¦‚ÎAgetcastledata "prtg_cas01.gat",0,"::OnRecvCastleP01";
+ ‚Æ‚·‚é‚Æ‘S‚Ä‚ÌNPC‚Ì OnRecvCastleP01ƒ‰ƒxƒ‹‚ªŽÀs‚³‚ê‚Ü‚·B
+ Erequestguildinfo–½—ߒljÁB“Á’èƒMƒ‹ƒh‚Ìî•ñ‚ðInterƒT[ƒo[‚É
+ —v‹‚Å‚«‚Ü‚·B‘æ‚Pƒpƒ‰ƒ[ƒ^‚̓Mƒ‹ƒhIDA‘æ‚Qƒpƒ‰ƒ[ƒ^‚̓Cƒxƒ“ƒg–¼‚Å
+ ‚±‚̃Cƒxƒ“ƒg‚̓Mƒ‹ƒhî•ñ‚ðInterƒT[ƒo[‚©‚犓¾Š®—¹‚µ‚½‚Æ‚«‚É
+ ŽÀs‚³‚ê‚Ü‚·B
+
+ (map/)
+ guild.c/guild.h/npc.c/npc.h/script.c/intif.c/chrif.c
+ FXC³
+
+EƒMƒ‹ƒhéŠÖ˜ANPCC³
+ iƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚P‚Ì‚ÝC³B‘¼‚Ìé‚̃XƒNƒŠƒvƒg‚ÍŠeŽ©‚ŘM‚Á‚Ä‚­‚¾‚³‚¢B
+ ‚Æ‚¢‚¤‚©A‚Þ‚µ‚ë˜M‚Á‚½‚ç‚ ‚Á‚Õ‚µ‚Ü‚µ‚傤j
+ E‰Šú‰»ˆ—‚ðOnAgitInit‚Å‚È‚­OnInterIfInit‚É•ÏXB
+ Eéƒf[ƒ^Š“¾Š®—¹ˆ—‚Æ‚µ‚ÄOnRecvCastleP01‚ð’ljÁB
+ EŽIÄ‹N“®ŽžAƒMƒ‹ƒhê‘®ƒJƒvƒ‰‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚ÉB
+ EƒMƒ‹ƒhê‘®ƒJƒvƒ‰‚Ì–¼‘O‚ð"ƒJƒvƒ‰Eˆõ::kapra_prtg01"‚É•ÏXB
+ i"::"ˆÈ~‚̓GƒNƒXƒ|[ƒg‚³‚ê‚é–¼‘O‚ÅA"::"ˆÈ‘O‚ª•\Ž¦–¼j
+ "ƒJƒvƒ‰Eˆõ#prt"‚æ‚è–¼‘O‚ð’·‚­‚µ‚Ä‹£‡‚µ‚É‚­‚­‚·‚邽‚ß‚Å‚·B
+ ‚±‚ÌŠÖŒW‚ÅAdisablenpc‚Ȃǂ̃pƒ‰ƒ[ƒ^‚ð"kapra_prtg01"‚ÉC³B
+ (conf/gvg/)
+ prtg_cas01.txt
+ ƒMƒ‹ƒhê‘®ƒJƒvƒ‰C³
+ ev_agit_prtg.txt
+ ‰Šú‰»ˆ—C³iƒoƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚P‚Ì‚Ýj
+ TEST_prtg_cas01_AbraiJ.txt
+ ƒMƒ‹ƒhê‘®ƒJƒvƒ‰ŒÙ—p/é”jŠüC³
+
+ENPC‚ÌC³
+ (conf/npc/)
+ npc_job_swordman.txt
+ npc_event_hat.txt
+ C³
+
+EƒAƒJƒEƒ“ƒg‚ð휂µ‚Ä‚àƒAƒJƒEƒ“ƒgID‚ðÄ—˜—p‚µ‚È‚¢‚悤‚ÉC³
+EƒMƒ‹ƒh/ƒp[ƒeƒB‚ɂ‚¢‚Ä‚àˆê‰ž“¯“™‚̈—’ljÁiƒRƒƒ“ƒg‰»‚³‚ê‚Ä‚¢‚Ü‚·B
+ ƒMƒ‹ƒh‚âƒp[ƒeƒB‚ÍID‚ðÄ—˜—p‚µ‚Ä‚à‚¨‚»‚ç‚­–â‘è‚È‚¢‚½‚ßj
+
+ (login/)
+ login.c
+ “Ç‚Ýž‚Ý/•Û‘¶ˆ—C³
+ (char/)
+ int_guild.c/int_party.c
+ “Ç‚Ýž‚Ý/•Û‘¶ˆ—C³
+
+--------------------
+//0903 by ŒÓ’±—–
+
+El14/l15‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒXl‚ð"„§‚³‚ê‚È‚¢(deprecated)"‹@”\‚Æ‚µ‚Ü‚µ‚½B
+ E‚Ü‚¾Žg—p‚Å‚«‚Ü‚·‚ªA¡Œã‚Ì“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚ÅA‘¬‚â‚©‚É‘ã‘Ö‹@”\‚ð
+ Žg—p‚·‚é‚悤‚ɈÚs‚µ‚Ä‚­‚¾‚³‚¢B
+ EƒvƒŒƒtƒBƒbƒNƒX'l'‚Í‘ã‘Ö‹@”\‚̃vƒŒƒtƒBƒbƒNƒX'@'‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+ El15‚Í‘ã‘Ö‹@”\‚Ì@menu‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+ El14‚Í‘ã‘Ö‹@”\‚Í‚ ‚è‚Ü‚¹‚ñBinput–½—߂̈ø”‚ðÈ—ª‚µ‚È‚¢‚ʼnº‚³‚¢B
+ E‚±‚ê‚ç‚Ì„§‚³‚ê‚È‚¢‹@”\‚ðŽg—p‚·‚é‚ÆŒxƒƒbƒZ[ƒW‚ª‚Å‚Ü‚·B
+
+ (map/)
+ script.c
+ parse_simpleexpr()C³
+ (conf/warp/)
+ npc_warp.txt/npc_warp25.txt/npc_warp30.txt
+ •Ï”–¼l0‚ð@warp0‚ÉC³
+ (conf/npc/)
+ npc_event_hat.txt
+ •Ï”–¼l15‚ð@menu‚ÉC³
+ (doc/)
+ script_ref.txt
+ ”z—ñ•Ï”‚Ìà–¾’ljÁ
+ •Ï”‚̃vƒŒƒtƒBƒbƒNƒX'l'Ainput–½—ß‚Ìl14Amenu–½—ß‚Ìl15‚Ì
+ à–¾‚ðC³
+
+--------------------
+//0902 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚ª”z—ñ•Ï”‚ɑΉžB
+ Earray[number]‚̂悤‚ÉŽg‚¢‚Ü‚·B”’lŒ^A•¶Žš—ñŒ^—¼•ûŽg‚¦‚Ü‚·B
+ EŽg‚¦‚éƒvƒŒƒtƒBƒbƒNƒX‚Í @, $, $@ ‚Å‚·B
+ iˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”AˆêŽž“I/‰i‘±“Iƒ}ƒbƒvƒT[ƒo[•Ï”j
+ Enumber==0‚Í”z—ñ‚¶‚á‚È‚¢•Ï”‚Æ’l‚ð‹¤—L‚µ‚Ü‚·B
+ i@hoge[0]‚Æ@hoge‚Í“¯‚¶•Ï”‚ð•\‚·j
+ E‚Ü‚¾‰¼ŽÀ‘•’iŠK‚Ȃ̂ŃoƒO•ñ‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B
+Eƒ}ƒbƒvƒT[ƒo[•Ï”‚Ì“Çž’†‚ÉCtrl+C‚ð‚·‚é‚ƃf[ƒ^”j‘¹‚̉”\«‚ª‚ ‚é–â‘è‚ðC³.
+Eƒ}ƒbƒvƒtƒ@ƒCƒ‹“Ç‚Ýž‚݉æ–Ê‚ª‚³‚Ñ‚µ‚¢‚Ì‚Å‚¹‚߂ătƒ@ƒCƒ‹–¼‚ð•\Ž¦‚·‚é‚悤‚ÉB
+
+ (conf/sample/)
+ npc_test_array.txt
+ ”z—ñ•Ï”ƒeƒXƒgƒXƒNƒŠƒvƒg
+ (map/)
+ script.c
+ buildin_set(),buildin_input(),get_val(),
+ parse_simpleexpr()C³
+ buildin_getelementofarray()’ljÁ
+ do_final_script()C³‚È‚Ç
+ map.c
+ map_readmap(),map_readallmap()C³
+
+--------------------
+//0901 by ‚Ò‚´‚Ü‚ñ
+
+E˜I“XƒoƒO‚ÌC³
+
+ (map/)
+ pc.c
+ pc_cartitem_amount() ’ljÁB
+ vending.c
+ vending_openvending() C³B
+ clif.c
+ clif_parse_NpcClicked() C³B
+ pc.h C³B
+
+--------------------
+//0900 by ‚Ò‚´‚Ü‚ñ
+
+EƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚̃‰ƒ“ƒ_ƒ€ƒXƒLƒ‹”­“®—¦‚ðabra_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚ÉB
+EƒXƒtƒBƒA[ƒ}ƒCƒ“‚ƃoƒCƒIƒvƒ‰ƒ“ƒg‚Ì”÷C³B
+ENoreturnƒ}ƒbƒv‚Å’±‚ªÁ”‚¯‚³‚ê‚éƒoƒOC³B
+Eˆê•”‚̃Aƒuƒ‰ŒÅ—LƒXƒLƒ‹‚ª³‚µ‚­“®ì‚µ‚È‚©‚Á‚½ƒoƒOC³B
+ (map/)
+ mob.c
+ mob_damage()Amobskill_use() C³B
+ mob_skillid2skillidx() ’ljÁB
+ skill.c
+ skill_readdb()Askill_abra_dataset() C³B
+ skill_castend_nodamage_id()Askill_castend_pos2() C³B
+ script.c
+ buildin_warp() C³B
+
+ skill.h C³B
+ map.h C³B
+ (db/)
+ abra_db.txt ’ljÁB
+ skill_db.txt C³B
+
+--------------------
+//0899 by ŒÓ’±—–
+
+EŽæ‚芪‚«MOB‚̈—C³
+ EŽæ‚芪‚«¢Š«‚ŃRƒA‚ð“f‚­ƒoƒOC³
+ EŽå‚ª•Êƒ}ƒbƒv‚É”ò‚Ô‚ÆAƒeƒŒƒ|[ƒg‚Å’Ç‚¢‚©‚¯‚é‚悤‚ÉC³
+ EŽæ‚芪‚«ˆ—‚ð‚æ‚èŒy‚­•ÏX
+
+ (map/)
+ mob.c
+ mob_ai_sub_hard_mastersearch()‚ðmob_ai_sub_hard_slavemob()
+ ‚É–¼‘O‚ð•Ï‚¦‚Ĉ—C³B
+ mob_summonslave()C³
+
+--------------------
+//0898 by ŒÓ’±—–
+
+Eeathena‚©‚çCardRemoverNPC‚ÌŽæ‚èž‚Ý
+ NPCƒf[ƒ^‚à“ú–{Œê–󂵂Ă܂·‚ªA‚©‚È‚è“K“–‚Å‚·B
+
+ (map/)
+ script.c
+ buildin_getequipcardcnt(),buildin_successremovecards()
+ buildin_failedremovecards()’ljÁ
+ (conf/sample/)
+ npc_card_remover.txt
+ ƒJ[ƒhŽæ‚èŠO‚µNPC‚Ì“ú–{Œê–ó
+ ƒvƒƒ“ƒeƒ‰‚̸˜BŠ‚Ì’†‚̶‰º‚Ì•”‰®‚É‚¢‚Ü‚·
+
+Eƒ|[ƒ^ƒ‹‚ŕʃ}ƒbƒv‚É”ò‚΂µ‚½MOB‚ª‚»‚̃}ƒbƒv‚É•¦‚«’¼‚·ƒoƒOC³
+ (map/)
+ map.h
+ struct mob_data‚Émƒƒ“ƒo’ljÁ
+ mob.c
+ mob_spawn(),mob_once_spawn()C³
+ npc.c
+ npc_parse_mob()C³
+
+
+--------------------
+//0897 by ‚Ò‚´‚Ü‚ñ
+
+Eׂ©‚¢’²®
+EƒXƒgƒŠƒbƒvŒn‚ƃPƒ~ƒJƒ‹ƒvƒƒeƒNƒVƒ‡ƒ“ŒnƒXƒLƒ‹‚Ì‘SŽÀ‘•
+@–{ŽI‚Å‚Ìׂ©‚¢Žd—l‚ª•ª‚Á‚½‚Ì‚ÅŽÀ‘•‚µ‚Ü‚µ‚½B
+@Šm—¦‚ÍŽb’è‚Å‚·B
+
+ (map/)
+ pc.c
+ pc_isequip() C³
+ skill.c
+ skill_status_change_start()Askill_castend_nodamage_id() C³B
+ skill_abra_dataset() C³B
+ battle.c
+ battle_get_def()Abattle_get_atk2() C³B
+ battle_get_vit()Abattle_get_int() C³B
+ (db/)
+ const.txt C³B
+ skill_db.txt C³B
+ cast_db.txt C³B
+
+--------------------
+//0896 by ŒÓ’±—–
+
+E‰i‘±“Iƒ}ƒbƒv•Ï”‹@”\’ljÁ
+Eƒ}ƒbƒv•Ï”‚𕶎š—ñŒ^•Ï”‚Æ‚µ‚Ä‚àŽg—p‚Å‚«‚é‚悤‚É‚µ‚½
+ E¡‚܂ł̃vƒŒƒtƒBƒbƒNƒX $ ‚͉i‘±“I‚É‚È‚è‚Ü‚·B
+ ˆêŽž“Iƒ}ƒbƒv•Ï”‚ðŽg—p‚·‚éꇂ̓vƒŒƒtƒBƒbƒNƒX $@ ‚ðŽw’肵‚Ä‚­‚¾‚³‚¢.
+
+ E‰i‘±“I/ˆêŽž“I‚Æ‚à‚É•¶Žš—ñŒ^‚ɑΉž‚µ‚Ä‚¢‚Ü‚·B
+ •¶Žš—ñŒ^‚̃|ƒXƒgƒtƒBƒbƒNƒX‚Í$‚Å‚·B
+
+ <—á> $@hoge ”’lŒ^ˆêŽžƒ}ƒbƒv•Ï”A$hoge$ •¶Žš—ñŒ^‰i‘±ƒ}ƒbƒv•Ï”
+ E‰i‘±ƒ}ƒbƒv•Ï”‚̓fƒtƒHƒ‹ƒg‚Å‚Í save/mapreg.txt ‚É•Û‘¶‚³‚ê‚Ü‚·B
+ ‚±‚ê‚Ímap_athena.conf‚Ìmapreg_txt‚ÅÝ’è‚Å‚«‚Ü‚·B
+
+Estr_data‚ªÄŠ„‚è“–‚Ä‚³‚ê‚é‚ƃ}ƒbƒv•Ï”‚ª³í‚ÉŽg—p‚Å‚«‚È‚¢ƒoƒOC³
+ Estrdb‚©‚çnumdb‚É‚µ‚ÄA•Ï”–¼‚Ístr_buf‚É“ü‚ê‚é‚悤‚ÉB
+
+Emap_athena.conf‚Ìdelnpc,npc:clear‚ª³‚µ‚­“­‚©‚È‚¢ƒoƒOC³
+
+ (map/)
+ npc.c
+ npc_delsrcfile(),npc_clearsrcfile()C³
+ script.c / script.h
+ ƒ}ƒbƒv•Ï”Œn‚©‚È‚èC³
+ map.c
+ map_read_config()C³‚È‚Ç
+ (conf/)
+ map_athena.conf
+ mapreg_txt’ljÁ
+ (doc/)
+ conf_ref.txt
+ mapreg_txt,help_txt,motd_txt’ljÁ
+ script_ref.txt
+ •¶Žš—ñŒ^•Ï”‚Ìà–¾C³
+
+--------------------
+//0895 by Selena
+
+Emapflag‚Énozenypenalty‚ð’ljÁB
+@GVG‚âŠX’†‚̃eƒ‚È‚Ç‚ÅŽ€–S‚µ‚½Û‚ÉAZenyƒyƒiƒ‹ƒeƒB[”­¶‚ðŠO‚·—pB
+
+ (map/)
+ pc.c
+ pc_setrestartvalue() C³
+ script.c
+ buildin_setmapflag()Abuildin_removemapflag() C³
+ npc.c
+ npc_parse_mapflag() C³
+ map.h
+ map_data() C³
+ (db/)
+ const.txt C³B
+
+--------------------
+//0894 by ‚Ò‚´‚Ü‚ñ
+
+EƒR[ƒ}ˆÈŠO‚̃Aƒuƒ‰ƒJƒ_ƒuƒ‰ŒÅ—LƒXƒLƒ‹‘SŽÀ‘•B
+@ƒI[ƒgƒXƒyƒ‹‚ɂ̓Œƒxƒ‹ƒAƒbƒvˆÈŠO‘½•ª‘S•”悹‚ê‚Ü‚·B(ƒI[ƒgƒXƒyƒ‹ƒŒƒxƒ‹ƒAƒbƒv‚Í–¢ƒeƒXƒg)
+EƒAƒuƒ‰ƒJƒ_ƒuƒ‰‰¼ŽÀ‘•
+@”­“®ƒXƒLƒ‹‚ªƒŒƒxƒ‹ˆË‘¶‚¶‚á‚ ‚è‚Ü‚¹‚ñB
+@‘S‚Ä‚Ì”­“®—¦‚ª—˜_ã‹Ïˆê‚Å‚·B
+@ƒAƒCƒeƒ€ƒXƒLƒ‹‚ðŽg‚Á‚ÄŽÀ‘•‚µ‚Ä‚¢‚é‚̂ňꕔ‚ÌŽg—pðŒ‚𖳎‹‚µ‚Ü‚·iƒWƒFƒ€ã©‹C‹…“™j
+EƒAƒCƒeƒ€ƒXƒLƒ‹‚ªƒLƒƒƒXƒgEƒfƒBƒŒƒC–³‚µ‚¾‚Á‚½‚Ì‚ðC³B
+
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()Askill_use_id()Askill_use_pos() C³B
+ skill_abra_dataset() ’ljÁB
+ (db/)
+ skill_db.txt C³B
+
+--------------------
+//0893 by ŒÓ’±—–
+
+E‘¼ƒ}ƒbƒv‚©‚çƒ|[ƒ^ƒ‹‚Ìã‚Ƀ[ƒv‚µ‚Ä‚«‚½PC‚ªƒ[ƒv‚µ‚È‚¢–â‘è‚ðC³
+Eƒ`ƒƒƒbƒg’†‚ÌPC‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂·‚©‚Ç‚¤‚©Ý’è‰Â”\‚É
+EMOB‚ðƒ[ƒvƒ|[ƒ^ƒ‹‚Å”ò‚΂·‚©‚Ç‚¤‚©Ý’è‰Â”\‚É
+ MOB‚̃[ƒvƒ|[ƒ^ƒ‹‚ð‹–‰Â‚·‚é‚ÆAƒeƒ‚ªŠÈ’P‚É‚Å‚«‚é‚Ì‚Å’ˆÓB
+
+EƒAƒJƒEƒ“ƒg•Ï”•ÏX‚Æ“¯Žž‚Ƀtƒ@ƒCƒ‹‚É‘‚«o‚·‚悤‚ÉC³
+Eƒ}ƒbƒvƒf[ƒ^‚̃[ƒh•”•ª‚̃ƒO•\Ž¦‚Í‚ ‚Ü‚èd—v‚¶‚á‚È‚¢‚ÆŽv‚¤‚Ì‚Å•ÏXB
+
+ (char/)
+ inter.c
+ mapif_parse_AccReg()‚Åinter_accreg_save()‚ðŒÄ‚Ԃ悤‚ÉC³
+ (map/)
+ mob.c/mob.h
+ mob_warp()‚̈ø”•ÏX‚ÆC³
+ battle.c/battle.h
+ mob_warp()ŒÄ‚Ño‚µ‚̈ø”C³
+ battle_configŠÖ˜A
+ map.c
+ map_readallmap(),map_readmap()C³
+ pc.c
+ pc_setpos()C³
+ skill.c
+ mob_warp()ŒÄ‚Ño‚µ‚̈ø”C³
+ skill_unit_onplace()C³
+ (conf/)
+ battle_athena.conf
+ chat_warpportal,mob_warpportal‚̒ljÁ
+ (doc/)
+ conf_ref.txt
+ chat_warpportal,mob_warpportal‚̒ljÁ
+
+--------------------
+//0892 by ŒÓ’±—–
+
+EŠeŽíconfƒtƒ@ƒCƒ‹‚ŕʃtƒ@ƒCƒ‹‚ðƒCƒ“ƒ|[ƒg‚Å‚«‚é‚悤‚É‚µ‚½
+ EŽ©•ª‚̃T[ƒo[—p‚ÌÝ’è‚ð•Êƒtƒ@ƒCƒ‹‚É‹Lq‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·B
+ E‘S‚Äuimport: ƒtƒ@ƒCƒ‹–¼vŒ`Ž®‚Å‹Lq‚µ‚Ü‚·B
+ EŠeŽíconfƒtƒ@ƒCƒ‹ilogin,char,map,inter,atcommand,battlej‚ÌÅŒã‚É
+ conf/import/*_conf ‚ð“ǂނ悤‚ÉŽw’肵‚½‚Ì‚ÅA‚»‚±‚ÉŽ©•ª—p‚ÌÝ’è‚ð
+ ‘‚¢‚Ä‚¨‚¯‚ÎA•ÏX•”•ª‚̂݃I[ƒo[ƒ‰ƒCƒh‚µ‚Ü‚·B
+ msg,script‚Ìconf‚ɂ‚¢‚Ä‚ÍA‚±‚ÌŒÀ‚è‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªAimport–½—ß‚Ì
+ ˆ—‚͒ljÁ‚³‚ê‚Ä‚¢‚é‚Ì‚ÅAŽ©•ª‚Åimport–½—߂𑂯‚Γ®‚«‚Ü‚·B
+ EV‚µ‚¢ƒXƒiƒbƒvƒVƒ‡ƒbƒg‚ªo‚½ê‡‚È‚Ç‚ÉA‚±‚Ìconf/importƒtƒHƒ‹ƒ_‚ð
+ Ì‚ÌAthena‚©‚çƒRƒs[‚·‚邾‚¯‚ÅŽ©•ª—p‚ÌÝ’è‚ð“K—p‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚·.
+
+Emap_athena.conf‚Ìmap‚Ænpc‚ŒljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ð휂ł«‚é‚悤‚É‚µ‚½
+ Eã‚ÉŠÖ˜A‚·‚é•ÏX‚Å‚·B
+ Edelmap,delnpc–½—ß‚ðŽg—p‚·‚ê‚ÎAmap,npc–½—߂ŒljÁ‚µ‚½ƒtƒ@ƒCƒ‹‚ð
+ “Ç‚Ýž‚Ü‚È‚¢‚悤‚ÉŽw’è‚Å‚«‚Ü‚·B‚±‚±‚Ńtƒ@ƒCƒ‹–¼‚Å‚Í‚È‚­A
+ all ‚ÆŽw’è‚·‚é‚Æ‚»‚ê‚Ü‚Å‚ÉŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ð‘S‚Ä“Ç‚Ýž‚Ü‚È‚­‚µ‚Ü‚·.
+ Emap,npc–½—ß‚ÅAƒtƒ@ƒCƒ‹–¼‚Éclear‚ðŽw’è‚·‚é‚ÆA
+ delmap,delnpc‚Ìall‚Æ“¯“™‚Ì“®ì‚ð‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+
+Elogin_athena.conf‚Ìallow‚Ædeny‚ðƒNƒŠƒA‚Å‚«‚é‚悤‚É‚“‚½
+ Eallow‚¨‚æ‚Ñdeny–½—ß‚Åclear‚ðŽw’è‚·‚é‚ƈȑO‚̃zƒXƒgî•ñ‚ð‘S휂µ‚Ü‚·.
+
+ (conf/)
+ ŠeŽíconfƒtƒ@ƒCƒ‹‚ÌÅŒã‚Éimport–½—ߒljÁ
+ (conf/import)
+ *.txt
+ ƒCƒ“ƒ|[ƒg‚³‚ê‚éƒtƒ@ƒCƒ‹B‚±‚ê‚ç‚ÉŽ©•ª—p‚ÌÝ’è‚ð‘‚­‚Æ‚æ‚¢B
+ (login/)
+ login.c
+ login_read_config()C³
+ (char/)
+ char.c/inter.c
+ char_read_config(),inter_read_config()C³
+ (map/)
+ map.c
+ map_read_config(),map_addmap()C³Amap_delmap()’ljÁ
+ npc.c
+ npc_addsrcfile()C³,npc_delsrcfile(),npc_clearsrcfile()’ljÁ
+ battle.c/atcommand.c/script.c
+ battle_read_config(),atcommand_read_config(),
+ msg_read_config(),script_read_config()C³
+ (doc/)
+ conf_ref.txt
+ C³
+
+--------------------
+//0891 by (“Ê)
+
+EuƒXƒLƒ‹Žg—p‚ÌŒã‚ÍA‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢v‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚é‚悤‚É‚µ‚½B
+ E–{ŽI‘ŠˆáƒXƒŒƒbƒh@‘´‚̇U>>5‚³‚ñ‚̃R[ƒh‚ðƒpƒNƒŠ‚Ü‚µ‚½B
+ (doc/)
+ conf_ref.txt C³B
+ (conf/)
+ battle_athena.conf C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_config_read() C³B
+ clif.c
+ clif_skill_fail() C³B
+
+--------------------
+//0890 by Ž€_
+
+EƒMƒ‹ƒh‘qŒÉ‚ðˆê“x‚Ɉêl‚¾‚¯‚ªŽg—p‚·‚é‚悤‚É•ÏXB(–¢ƒeƒXƒg)
+Ebattle_athena.conf‚©‚çplayer_undead_nofreeze íœB
+E@ƒRƒ}ƒ“ƒh@gstorage ’ljÁB
+EƒXƒNƒŠƒvƒgguildstorage‚ðguildopenstorage‚É•ÏXB
+E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
+ (doc/)
+ conf_ref.txt C³B
+ script_ref.txt C³B
+ (conf/)
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+ help.txt C³B
+ (conf/sample/)
+ gstorage_test.txt ’ljÁB
+ (char/)
+ makefile C³B
+ int_storage.h C³B
+ int_storage.c
+ inter_storage_delete()Ainter_guild_storage_delete() ’ljÁB
+ int_guild.c
+ guild_check_empty()Amapif_parse_BreakGuild() C³B
+ (map/)
+ makefile C³B
+ battle.h C³B
+ battle.c
+ battle_config_read() C³B
+ guild.c
+ guild_broken() C³B
+ storage.h C³B
+ storage.c
+ storage_guild_storageopen() C³B
+ storage_delete()Aguild_storage_delete() ’ljÁB
+ script.c
+ buildin_guildstorage() ‚ð buildin_guildopenstorage()‚É•ÏXB
+ intif.c
+ intif_parse_LoadGuildStorage() C³B
+ mob.c
+ mob_summonslave()Amob_damage()Amob_delete() C³B
+ mob_catch_delete()Amob_readdb() C³B
+ skill.c
+ skill_castend_nodamage_id()Askill_status_change_start() C³B
+ clif.c
+ clif_parse_ActionRequest() C³B
+ atcommand.h C³B
+ atcommand.c
+ atcommand() C³B
+
+--------------------
+//0889 by ŒÓ’±—–
+
+E•¶Žš—ñŒ^ˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”‹@”\’ljÁB
+ EƒvƒŒƒtƒBƒbƒNƒX@,ƒ|ƒXƒgƒtƒBƒbƒNƒX$‚ðŽg—p‚µ‚Ü‚·Bi@hoge$‚È‚Çj
+ Einput‚Å•¶Žš—ñ•Ï”‚ðŽw’è‚·‚é‚Æ•¶Žš—ñ“ü—Í‚É‚È‚è‚Ü‚·B
+ EŠÖŒW‰‰ŽZŽqi”äŠr‰‰ŽZŽqj‚Å•¶Žš—ñ‚Ç‚¤‚µ‚ðŽw’è‚·‚é‚Æ•¶Žš—ñ‚Ì”äŠr‚ª
+ ‚Å‚«‚Ü‚·B”’l‚Æ•¶Žš—ñ‚𬂺‚Ä”äŠr‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+ E‚Æ‚è‚ ‚¦‚¸ƒTƒ“ƒvƒ‹•t‚¯‚Ä‚Ü‚·B
+
+ (map/)
+ map.h
+ struct map_session_data‚Énpc_str,regstr,regstr_numƒƒ“ƒo’ljÁ
+ script.c
+ buildin_set(),get_val(),buildin_input(),op_2num()‚È‚ÇC³
+ op_2str(),op_2()’ljÁ
+ clif.c / clif.h
+ 01d5ƒpƒPƒbƒg’·C³
+ clif_parse_NpcStringInput(),clif_scriptinputstr()’ljÁ
+ pc.c / pc.h
+ pc_readregstr(),pc_setregstr()’ljÁ
+ (doc/)
+ script_ref.txt
+ ‰‰ŽZŽq‚Ìà–¾’ljÁA•Ï”‚Ìà–¾C³Ainput,menuC³
+ (conf/sample/)
+ npc_test_str.txt
+ •¶Žš—ñ•Ï”‚ðŽg—p‚µ‚½ƒXƒNƒŠƒvƒg‚Ì—áB
+ •¶Žš—ñ‚Ì‘ã“üAŒ‹‡A”äŠrA“ü—͂Ȃǂ̃eƒXƒg‚ðs‚¤‚à‚ÌB
+
+--------------------
+//0888 by Ž€_
+
+EÝŒv‚©‚çŠÔˆá‚Á‚Ä‚¢‚½ƒMƒ‹ƒh‘qŒÉC³B(‚½‚¾•¡”l‚ÌŽg—p‚É‚æ‚éƒoƒO‚ª‚ ‚é‰Â”\«‚Í‚Ü‚¾‚ ‚è‚Ü‚·B)
+Eׂ©‚¢ƒoƒOC³B
+ (doc/)
+ inter_server_packet.txt C³B
+ conf_ref.txt C³B
+ (conf/)
+ inter_athena.conf C³B
+ help.txt C³B
+ (common/)
+ mmo.h C³B
+ (char/)
+ makefile C³B
+ int_storage.h C³B
+ int_storage.c
+ account2storage()Ainter_storage_init()Astorage_fromstr() C³B
+ inter_storage_save()Amapif_load_storage() C³B
+ mapif_parse_SaveStorage() C³B
+ guild_storage_fromstr()Aguild_storage_tostr() ’ljÁB
+ inter_storage_save_sub()Ainter_guild_storage_save_sub() ’ljÁB
+ inter_guild_storage_save()Amapif_parse_LoadGuildStorage() ’ljÁB
+ mapif_parse_SaveGuildStorage()Amapif_load_guild_storage() ’ljÁB
+ mapif_save_guild_storage_ack()Aguild2storage() ’ljÁB
+ int_party.c
+ inter_party_init() C³B
+ int_guild.h C³B
+ int_guild.c
+ inter_guild_init() C³B
+ inter_guild_search() ’ljÁB
+ int_pet.c
+ inter_pet_init() C³B
+ inter.c
+ inter_init()Ainter_save()Ainter_config_read() C³B
+ (map/)
+ makefile C³B
+ map.h C³B
+ map.c
+ map_quit()Ado_init() C³B
+ pc.c
+ pc_setpos() C³B
+ storage.h C³B
+ storage.c
+ do_init_storage()Ado_final_storage()Aaccount2storage() C³B
+ storage_storageopen()Astorage_storageadd()Astorage_storageget() C³B
+ storage_storageaddfromcart()Astorage_storagegettocart() C³B
+ storage_storageclose()Astorage_storage_quit() C³B
+ storage_storage_save() C³B
+ guild2storage()Astorage_guild_storageopen() ’ljÁB
+ guild_storage_additem() Aguild_storage_delitem() ’ljÁB
+ storage_guild_storageadd()Astorage_guild_storageget() ’ljÁB
+ storage_guild_storageaddfromcart()Astorage_guild_storagegettocart() ’ljÁB
+ storage_guild_storageclose()Astorage_guild_storage_quit() ’ljÁB
+ intif.h C³B
+ intif.c
+ intif_send_storage()Aintif_parse_LoadStorage()Aintif_parse() C³B
+ intif_request_guild_storage()Aintif_send_guild_storage() ’ljÁB
+ intif_parse_SaveGuildStorage()Aintif_parse_LoadGuildStorage() ’ljÁB
+ clif.h C³B
+ clif.c
+ clif_additem()Aclif_parse_MoveToKafra() C³B
+ clif_parse_MoveFromKafra()Aclif_parse_MoveToKafraFromCart() C³B
+ clif_parse_MoveFromKafraToCart()Aclif_parse_CloseKafra() C³B
+ clif_parse_LoadEndAck() C³B
+ clif_guildstorageitemlist()Aclif_guildstorageequiplist() ’ljÁB
+ clif_updateguildstorageamount()Aclif_guildstorageitemadded() ’ljÁB
+ guild.c
+ guild_broken() C³B
+ script.c
+ buildin_openstorage()Abuildin_guildstorage() C³B
+ skill.c
+ skill_castend_nodamage_id() C³B
+ mob.c
+ mob_summonslave()Amob_damage() C³B
+ atcommand.c
+ atkillmonster_sub()Aatcommand() C³B
+
+--------------------
+//0887 by Ž‚Žqo^.^o
+
+E(db/)
+ skill_tree.txt C³
+
+--------------------
+//0886 by ‚Ò‚´‚Ü‚ñ
+
+EƒT[ƒo[snapshot
+Eƒtƒ@ƒCƒ‹’²®
+
+--------------------
+//0885 by huge
+
+EƒMƒ‹ƒh‹¤—L‘qŒÉ‚ÌŽÀ‘•Bguildstorage‚ÅŠJ‚¯‚Ü‚·B
+ Ž©•ª‚ÌŽI‚ÅŽÀŒ±‚Í‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªA‰ß‘a’n‚È‚Ì‚Å‘½l”ƒMƒ‹ƒh‚É‚È‚é‚Æ‚Ç‚¤“®‚­‚©•ª‚©‚è‚Ü‚¹‚ñB
+ (”O‚Ì‚½‚߃oƒbƒNƒAƒbƒv‚Í•K‚¸Žæ‚Á‚Ä‚¨‚¢‚ĉº‚³‚¢)
+Eareawarp‚ÅA‘ÎÛƒ}ƒbƒv–¼‚ð"Random"‚É‚·‚é‚ÆA“¯ƒ}ƒbƒv“à‚щƒ“ƒ_ƒ€‚É”ò‚Ԃ悤‚ÉC³B
+EGMƒRƒ}ƒ“ƒh‚Ŷ‚«•Ô‚µ‚½‚Æ‚«‚ÉSP‚à‘S‰ñ•œ‚·‚é‚悤‚ÉC³B
+EƒfƒBƒ{[ƒVƒ‡ƒ“‚ÌðŒ‚ð‚¿‚å‚Á‚ÆC³B
+
+ (char/)
+ int_storage.c
+ mapif_load_storage() C³B
+ mapif_parse_SaveStorage() C³B
+ inter.c
+ inter_send_packet_length[] C³B
+ inter_recv_packet_length[] C³B
+ (map/)
+ atcommand.c
+ @alive,@raise,@raisemap C³B
+ intif.c
+ packet_len_table[] C³B
+ intif_request_storage() C³B
+ intif_send_storage() C³B
+ intif_parse_LoadStorage() C³B
+
+ map.h
+ map_session_data state‚Éstorage_flag ’ljÁB
+ script.c
+ buildin_areawarp_sub() C³B
+ buildin_openstorage() C³B
+ buildin_guildstorage() ’ljÁB
+ skill.c
+ skill_castend_nodamage_id() C³B
+ storage.c
+ account2storage() C³B
+ storage_storageopen() C³B
+ storage_storage_save() C³B
+
+--------------------
+//0884 by Ž€_
+
+Eׂ©‚¢ƒoƒOC³B
+Ebattle_athena.conf‚Épet_strAzeny_penaltyAresurrection_exp ’ljÁB
+E0878‚Ì‹âsŠÖŒW‚̃R[ƒh‚Í‚à‚¤‚¢‚ç‚È‚¢‚Ì‚Å‘S‚ÄíœB
+Ezeny_penalty‚ðݒ肵‚ÄŽg‚¤ê‡‚ÍŽè”—¿‚Í‚È‚­‚µ‚½•û‚ª‚¢‚¢‚©‚àB
+Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚Åpercentheal‚É‚àPP‚ÆLP‚É‚æ‚é‰ñ•œƒ{[ƒiƒX‚ª•t‚­‚悤‚É•ÏXB(‚½‚¾vit‚âintAHPRAMPR‚É‚æ‚é‰ñ•œƒ{[ƒiƒX‚ª•t‚«‚Ü‚¹‚ñB)
+E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒgB
+ (common/)
+ mmo.h C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ map.c
+ do_init()Ado_final() C³B
+ script.c
+ buildin_openbank() íœB
+ buildin_failedrefitem() C³B
+ storage.h C³B
+ storage.c
+ do_init_bank()Ado_final_bank()Aaccount2bank() íœB
+ storage_bank()Astorage_readbank() íœB
+ skill.c
+ skill_castend_nodamage_id()Askill_attack() C³B
+ battle.h C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_config_read() C³B
+ pc.c
+ pc_setrestartvalue() C³B
+ clif.c
+ clif_skill_nodamage()Aclif_refine() C³B
+ itemdb.c
+ itemdb_isequip3() C³B
+ atcommand.c
+ atcommand() C³B
+
+--------------------
+//0883 by Kalen
+
+EWarpFXC³
+ EƒAƒTƒVƒ“ƒMƒ‹ƒhŽü‚èC³(̂̂܂܂̃Šƒ“ƒN‚¾‚Á‚½‚Ì‚ÅŒ»Ý‚Ìó‘Ô‚ÉC³B)
+ EYuno‚ÌWarp‘S–ÊŒ©’¼‚µ(YumilLoopC³ASageCastleRandomWarp’ljÁA—ˆã‚³‚ñ‚̉ƒljÁ)
+ Eƒ‚ƒ“ƒNƒMƒ‹ƒhŽü‚è’ljÁ
+ENPCFXC³
+ E–XŽqì¬NPC‚ð•Êƒtƒ@ƒCƒ‹‚ÖBˆê•”’ljÁ(ep2.5’ljÁ•ª)
+ @ŽQlData(R.O.M776): ttp://green.sakura.ne.jp/~youc/ro/data/itemmaking.html#04
+ EƒAƒTƒVƒ“ƒMƒ‹ƒhC³
+ E“ñŽŸE“]EŠÖŒWNPCˆê•”’ljÁ(‚±‚ê‚ŃRƒ‚ƒh¬Œ€ê‚Ös‚¯‚Ü‚·)
+ Eƒ}ƒXƒ^[ƒAƒ‹ƒPƒ~ƒXƒg‚̑䎌C³
+ EƒAƒ‹ƒfƒoƒ‰ƒ“‚̈ēà—vˆõ‚ðˆÚ“®&‘䎌C³&ƒCƒ[ƒW’ljÁ
+ EBBS‚É‚ ‚ª‚Á‚Ä‚¢‚½ƒRƒ‚ƒhƒXƒNƒŠƒvƒg’ljÁ(event_hat“™‚Ö•ªŽU)
+ EƒRƒ“ƒƒ“ƒNƒGƒXƒgŠÖŒWNPCˆê•”’ljÁ(—ˆã[yuno]Aƒlƒ‹[prontera])
+ (conf/warp/)
+ npc_warp.txt
+ npc_warp30.txt
+ npc_warp_job.txt
+ (conf/npc/)
+ npc_event_hat.txt(V‹K)
+ npc_job_2nd.txt
+ npc_job_alchemist.txt
+ npc_town_aldebaran.txt
+ npc_town_comodo.txt
+ npc_town_gonryun.txt
+ npc_town_guide.txt
+ npc_town_yuno.txt
+ npc_town_lutie.txt
+
+--------------------
+//0882 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚É0881‘Š“–‚̃AƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\‚̃vƒŒƒtƒBƒbƒNƒX•ÏX
+ E0881‚̃AƒJƒEƒ“ƒg•Ï”‚̓vƒŒƒtƒBƒbƒNƒX##‚É‚È‚è‚Ü‚µ‚½B
+ E0881‚̃AƒJƒEƒ“ƒg•Ï”‚Í‘Sƒ[ƒ‹ƒh‚Å‹¤—L‚³‚ê‚Ü‚·B
+ E•Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG2_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·(16)B
+Eƒ[ƒ‹ƒh“à‚̃AƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\’ljÁ
+ E•Ï”–¼‚̃vƒŒƒtƒBƒbƒNƒX‚Í#‚Å‚·B
+ E•Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·(16)B
+ E0881‚Ì‹âsƒXƒNƒŠƒvƒg‚Í‚±‚¿‚ç‚ðŽg—p‚·‚é‚悤‚É‚È‚è‚Ü‚·B
+ ‚æ‚Á‚ĈȑO‚̃f[ƒ^‚ª‚‚©‚¦‚È‚¢‚Ì‚Å‚ ‚ç‚©‚¶‚߈ø‚«o‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢.
+ E•Ï”ƒf[ƒ^‚Í save/accreg.txt ‚É•Û‘¶‚³‚ê‚Ü‚·B
+ ‚±‚̃tƒ@ƒCƒ‹–¼‚Í inter_athena.conf ‚Å•ÏX‰Â”\‚Å‚·Bconf_ref.txtŽQÆB
+
+ (common/)
+ mmo.h
+ ACCOUNT_REG_NUM‚ð16‚ÉAACCOUNT_REG_NUM2’ljÁ
+ struct mmo_charstatus‚Éaccount_reg2_num,account_reg2ƒƒ“ƒo’ljÁ
+ (login/)
+ login.c
+ account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
+ (char/)
+ char.c
+ account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
+ inter.c
+ ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”‹@”\’ljÁB
+ inter_accreg*()’ljÁAaccreg_db’ljÁ‚È‚ÇB
+ (map/)
+ chrif.c/chrif.h
+ account_reg‚ð‘S‚Äaccount_reg2‚É’u‚«Š·‚¦
+ 0881‚ł̃oƒO‚ðC³
+ intif.c/intif.h
+ ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”‹@”\’ljÁB
+ pc.c/pc.h
+ pc_*accountreg()=>pc_*accountreg2()‚ÉB
+ pc_setaccountreg(),pc_readaccountreg()’ljÁB
+ script.c
+ buildin_set(),buildin_get_val(),buildin_input()C³
+ (doc/)
+ inter_server_packet.txt
+ ƒ[ƒ‹ƒh“àƒAƒJƒEƒ“ƒg•Ï”ŠÖŒW
+ conf_ref.txt
+ accreg_txt’ljÁ
+
+--------------------
+//0881 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚ɃAƒJƒEƒ“ƒg‹¤—L•Ï”‹@”\’ljÁ
+ E•Ï”–¼‚ɃvƒŒƒtƒBƒbƒNƒX#‚ð•t‚¯‚邱‚ƂŃAƒJƒEƒ“ƒg‹¤—L•Ï”‚É‚È‚è‚Ü‚·B
+ EƒAƒJƒEƒ“ƒg•Ï”‚Í•ÏX‚µ‚½Žž“_‚Å‘SƒT[ƒo[‚Ƀ|ƒXƒg‚³‚ê‚é‚Ì‚Å
+ •p”É‚É‘‚«Š·‚¦‚é‚ƃT[ƒo[ŠÔ’ÊM‚ª”ì‘剻‚µ‚Ü‚·B
+ EƒAƒJƒEƒ“ƒg•Ï”‚Í•ÏX‚µ‚½Žž“_i‚»‚µ‚Ä‚»‚ꂪloginŽI‚É“Í‚¢‚½Žž“_j‚Å
+ account.txt‚É‘‚«o‚³‚ê‚Ü‚·B
+ EƒOƒ[ƒoƒ‹•Ï”i‰i‘±•Ï”j‚̌”‚ð96‚ÉŒ¸‚炵AŒ¸‚Á‚½32ŒÂ•ª‚ð
+ ƒAƒJƒEƒ“ƒg•Ï”‚É‚µ‚Ä‚¢‚Ü‚·‚ªAmmo_charstatus‚̃TƒCƒY‚ª
+ 16000byte‚ð’´‚¦‚È‚¢ŒÀ‚è‘‚â‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·Bƒ0879‚Ì•ÏX‚ðŽQÆ
+ •Ï”‚̌”‚Ímmo.h‚ÌACCOUNT_REG_NUM‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·B
+ E0878‚Ì‹âs‚ðƒAƒJƒEƒ“ƒg•Ï”‚ðŽg—p‚·‚é‚悤‚ÉC³
+ bank.txt‚̃f[ƒ^‚ªŽg‚¦‚È‚­‚È‚é‚Ì‚Å‚ ‚ç‚©‚¶‚߈ø‚«o‚µ‚Ä‚¨‚¢‚ĉº‚³‚¢B
+
+ (common/)
+ mmo.h
+ GLOBAL_REG_NUM‚ð96‚ÉAACCOUNT_REG_NUM‚ð’ljÁ
+ struct mmo_charstatus‚Éaccount_reg_num,account_regƒƒ“ƒo’ljÁ
+ (login/)
+ login.c
+ ƒpƒPƒbƒg2728ˆ—’ljÁ
+ (char/)
+ char.c
+ ƒpƒPƒbƒg2729,2b10ˆ—’ljÁ
+ (map/)
+ chrif.c
+ chrif_saveaccountreg(),chrif_accountreg()
+ (ƒpƒPƒbƒg2b10,2b11ˆ—)’ljÁB
+ pc.c/pc.h
+ pc_readaccountreg(),pc_setaccountreg()’ljÁ
+ script.c
+ buildin_set(),buildin_get_val(),buildin_input()C³
+ (conf/sample/)
+ bank_test.txt
+ ƒAƒJƒEƒ“ƒg•Ï”Žg—p”Å‚Ì‹âsƒXƒNƒŠƒvƒg
+
+--------------------
+//0880 by Ž€_
+
+Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚𳂵‚­ŽÀ‘•‚Æ‚¿‚å‚Á‚Æ‹@”\Šg’£B
+Eƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ŃŒƒxƒ‹•Ê‚ÉŽg‚¦‚éƒAƒCƒeƒ€‚ðskill_require_db.txt‚ÉÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B‚½‚¾ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚ÅŽg‚¦‚éƒAƒCƒeƒ€‚ÍitemhealApercenthealAsc_startAsc_endˆÈŠO‚Ì•¨‚ª“ü‚Á‚Ä‚¢‚é‚Ƴ‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
+ƒŒƒxƒ‹5‚Ü‚Å‚Í–{ŽI‚ɇ‚킹‚Ä‚¢‚Ü‚·‚ªÅ‘僌ƒxƒ‹‚ð10‚Ü‚ÅŠg’£‚·‚é‚ƃŒƒxƒ‹6 - ƒ}ƒXƒeƒ‰‚ÌŽÀA7 - ƒ[ƒ„ƒ‹ƒ[ƒŠ[A8 - ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽíA9 - ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀA10 - ƒo[ƒT[ƒNƒ|[ƒVƒ‡ƒ“‚Éݒ肵‚Ä‚¢‚Ü‚·Bskill_db.txt‚ðC³‚·‚ê‚΂±‚ꂪ—LŒø‚É‚È‚è‚Ü‚·B(‚Ç‚±‚ðC³‚·‚é‚©‚à‚í‚©‚ç‚È‚¢l‚Í’ú‚߂邱‚Æ‚Å‚·B) ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[‚É‚æ‚éƒAƒCƒeƒ€Žg—p‚ÍŽg—pðŒ‚𖳎‹‚µ‚Ü‚·B­‚µ‚̓Aƒ‹ƒPƒ~ƒXƒg‚ÉŠó–]‚ª‚Å‚«‚½‚©‚à...(‘½•ª–³—...)
+Ebattle_athane.conf‚Éproduce_item_name_inputAproduce_potion_name_inputAmaking_arrow_name_inputAholywater_name_input ’ljÁB
+Eƒp[ƒeƒBˆõ‚É‚¾‚¯Žg‚¤ƒXƒLƒ‹‚ƃMƒ‹ƒhˆõ‚É‚¾‚¯Žg‚¤ƒXƒLƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (conf/)
+ battle_athane.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ db_ref.txt C³B
+ (db/)
+ skill_db.txt C³B
+ skill_require_db.txt C³B
+ (map/)
+ map.h C³B
+ skill.h C³B
+ skill.c
+ skill_status_change_timer()Askill_attack()Askill_use_id() C³B
+ skill_castend_nodamage_id()Askill_castend_damage_id() C³B
+ skill_castend_id()Askill_castend_pos()Askill_produce_mix() C³B
+ skill_arrow_create()Askill_check_condition() C³B
+ skill_status_change_clear()Askill_readdb() C³B
+ mob.c
+ mobskill_use_id()Amob_changestate() C³B
+ pc.c
+ pc_itemheal()Apc_percentheal()Apc_calcstatus() C³B
+ battle.h C³B
+ battle.c
+ battle_delay_damage()Abattle_damage()Abattle_heal() C³B
+ battle_get_adelay()Abattle_get_amotion() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack()Abattle_config_read() C³B
+ clif.c
+ clif_skill_fail() C³B
+ script.c
+ buildin_sc_start()Abuildin_sc_end() C³B
+ makefile C³B
+
+--------------------
+//0879 by ŒÓ’±—–
+
+E‘—MFIFO‚̃oƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ÌÆŽã«‚ÌC³
+ E2048ƒoƒCƒgˆÈã‚̃pƒPƒbƒg‚ð‘—‚é‚Æ‚«AFIFO‚ª–ž”t‚É‹ß‚¯‚ê‚Î
+ ƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚É‚æ‚é•s³ƒAƒNƒZƒX‚ª‹N‚±‚Á‚Ä‚¢‚½–â‘èC³B
+ EFIFO‚ª–ž”t‚É‹ß‚¢‚Æ‚«WFIFOSET‚³‚ꂽƒpƒPƒbƒg‚ªŽÌ‚Ä‚ç‚ê‚Ä‚¢‚½–â‘èC³B
+ EFIFO‚ªƒI[ƒo[ƒtƒ[‚·‚éê‡AŽ©“®“I‚ÉFIFO‚ðŠg’£‚·‚é‚悤‚É‚µ‚½B
+ i‚½‚¾‚µAˆê“x‚ÉWFIFOSET‚·‚éƒpƒPƒbƒg‚ª16384ƒoƒCƒgˆÈ‰º‚Ɖ¼’肵‚Ä‚¢‚éj
+ Eusocket: ? wdata expanded to ???? bytesv‚ÍFIFO‚ªŠg’£‚³‚ꂽ‚Æ‚«‚É
+ ‚ł郃O‚¾‚ªAƒGƒ‰[‚Å‚Í‚È‚­AƒpƒPƒbƒg‚ͳ‚µ‚­‘—M‚³‚ê‚éB
+ Eusocket: ? wdata lost !!v‚̓pƒPƒbƒg‚ª‘rŽ¸‚µ‚½‚±‚Æ‚ð•\‚·ƒƒO‚ÅA
+ ƒGƒ‰[‚Å‚ ‚邪64KB‚ð’´‚¦‚é’´‹‘å‚ȃpƒPƒbƒg‚ðWFIFOSET‚µ‚È‚¢‚Æo‚È‚¢B
+ E16384ƒoƒCƒg‚ð’´‚¦‚éƒpƒPƒbƒg‚ðWFIFOSET‚·‚é‚ƃGƒ‰[ƒƒbƒZ[ƒW‚È‚µ‚ÉA
+ •s³ƒAƒNƒZƒX‚ª‹N‚±‚é‰Â”\«‚ª‚ ‚é‚Ì‚ÅA’´‚¦‚È‚¢‚悤‚É‚·‚邱‚ÆB
+
+ (common/)
+ socket.c /socket.h
+ WFIFOSET()‚ðƒ}ƒNƒ‚©‚çŠÖ”‚É•ÏX
+ realloc_fifo()’ljÁ
+
+EƒT[ƒo[ŠÔ’ÊMFIFO‚̃oƒbƒtƒ@ƒTƒCƒY‚ð‘å‚«‚­‚µ‚½
+ E‘å—ʂ̃f[ƒ^‚ª’ÊM‚³‚ꂽ‚Æ‚«‚Ƀf[ƒ^ˆ—’x‰„‚ª‹N‚«‚É‚­‚­‚·‚邽‚ßB
+ Eƒƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚½B(‚¬‚肬‚è‚Ìl‚Í65536‚ÉÝ’è‚·‚é‚ÆŒ³’Ê‚è‚É‚È‚é)
+ EƒT[ƒo[ŠÔ’ÊM‚ÌFIFOƒTƒCƒY‚Í mmo.h ‚Å’è‹`‚³‚ê‚Ä‚¢‚éB
+ •ÏX‚·‚éꇂÍ64KB(65536)ˆÈã‚Ì’l‚É‚·‚邱‚ÆB
+ ‘å‚«‚­‚·‚é‚Æ‹‘åƒf[ƒ^ŽóMŽž‚Ì’x‰„‚ªŒ¸‚邪ƒƒ‚ƒŠ‚𑽂­Žg‚¤B
+ E@kickallŽž‚ȂǂɃf[ƒ^‘—M‚ªŒƒ‚µ‚­‚È‚é‚Ì‚Å•ÏX‚µ‚½‚ªA
+ “¯ŽžƒƒOƒCƒ“l”‚ª­‚È‚¢‚Æ‘‚₵‚Ä‚àˆÓ–¡‚Í–³‚¢B
+
+ (common/)
+ mmo.h
+ FIFOSIZE_SERVERLINKƒ}ƒNƒ’ljÁB
+ (login/)
+ login.c
+ 2710ƒpƒPƒbƒg‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
+ (char/)
+ char.c
+ 2af8ƒpƒPƒbƒg‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
+ check_connect_login_server()‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
+ (map/)
+ chrif.c
+ check_connect_char_server()‚Årealloc_fifo()‚ðŒÄ‚Ԃ悤‚É
+
+--------------------
+//0878 by huge
+
+EƒJƒvƒ‰‹âsƒT[ƒrƒXB
+ Ž©•ª‚ÌŽI‚ÅŽÀ‘•‚µ‚Ä‚½‚ñ‚Å‚·‚ªAˆÓŠO‚ÆDŠ´G‚¾‚Á‚½‚Ì‚Åo‚µ‚Ä‚Ý‚Ü‚·B
+ NPCscript‚ÅAopenbank(0);‚Å—a‹àŠz‚ð•Ô‚µ‚ÄA’†‚É”Žš‚ð“ü‚ê‚é‚Æo‚µ“ü‚ꂵ‚Ü‚·B
+ Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚𓯕•‚µ‚½‚Ì‚ÅA‚»‚ê‚ðŽQÆB
+
+ (common/)
+ mmo.h
+ struct bank ’ljÁB
+ (map/)
+ map.c
+ do_final(),do_init() C³B
+ script.c
+ buildin_openbank() ’ljÁB
+ storage.c
+ storage.h
+ ƒOƒ[ƒoƒ‹•Ï”’ljÁB
+ do_init_bank(),do_final_bank(),account2bank() ’ljÁB
+ storage_bank(),storage_readbank() ’ljÁB
+
+--------------------
+//0877 by ŒÓ’±—–
+
+EloginŽI‚̃AƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‚ªƒlƒbƒgƒ}ƒXƒN•\‹L‚ɑΉž
+ 192.168.0.0/24 ‚â 192.168.0.0/255.255.0.0 ‚Æ‚¢‚Á‚½•\‹L‚ɑΉžB
+Ebattle_athena.conf‚ÉGM‚ª–³ðŒ‚Å‘•”õ•i‚ð‘•”õ‚Å‚«‚é•
+ –³ðŒ‚ŃXƒLƒ‹‚ðŽg—p‚Å‚«‚éÝ’è’ljÁ
+ ‚±‚ê‚ç‚̓fƒoƒO—p‚È‚Ì‚Å“®ì‚É•s“s‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+
+ (login/)
+ login.c
+ check_ip()C³,check_ipmask()’ljÁ
+ (map/)
+ battle.c/battle.h
+ battle_config‚Égm_allequip,gm_skilluncond’ljÁ
+ battle_config_read()C³X
+ skill.c
+ skill_check_conditio()C³
+ pc.c
+ pc_isequp()C³
+ (doc/)
+ conf_ref.txt
+ allow•ÏXAgm_all_equipmentAgm_skill_unconditional’ljÁ
+
+--------------------
+//0876 by Ž€_
+
+Eׂ©‚¢ƒoƒOC³B
+E@ƒRƒ}ƒ“ƒh‚ɃeƒXƒg‚ׂ̈ɓü‚ê‚Ä‚¢‚½•¨‚ª“ü‚Á‚Ä‚¢‚½‚Ì‚ÅC³B
+Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚ÌŽË’ö‚ð5‚©‚ç4‚ÉC³(–{ŽIŽË’ö‚Í•s–¾)‚ƃŠƒUƒŒƒNƒVƒ‡ƒ“‚ª–³‘®«‚¾‚Á‚½‚̂𹑮«‚ÉC³B
+ (db/)
+ skill_db.txt C³B
+ (map/)
+ mob.c
+ mob_catch_delete()Amob_stop_walking() C³B
+ storage.c
+ storage_additem() C³B
+ pc.c
+ pc_damage()Apc_stop_walking() C³B
+ clif.c
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+ battle.c
+ battle_calc_magic_attack() C³B
+ skill.c
+ skill_check_condition() C³B
+ atcommand.c C³B
+
+--------------------
+//0875 by ŒÓ’±—–
+
+Eparty_share_level‚ðinter_athena.conf‚Ɉڂµ‚½
+ (ƒp[ƒeƒBŠÖ˜A‚̈—‚ÌŠÇŠ‚ªinterŽI‚Ì‚½‚ß)
+Einter_athena.conf‚Éinter_log_file€–ڒljÁ
+EƒMƒ‹ƒhì¬/‰ðŽU/éè—Ì/é”jŠü‚ªƒƒO‚ÉŽc‚é‚悤‚É
+EƒMƒ‹ƒh‰ðŽUŽž‚Ƀƒ‚ƒŠƒŠ[ƒN‚µ‚Ä‚¢‚½–â‘è‚ðC³
+ (char/)
+ char.c/char.h
+ party_share_levelŠÖ˜A
+ (inter/)
+ inter.c/inter.h
+ party_share_level / inter_log_file ŠÖ˜A
+ ƒƒOo—Í—p‚Éinter_log()’ljÁ
+ int_guild.c
+ ì¬/‰ðŽU/éè—Ì/é”jŠü‚ðƒƒO‚Éo—Í
+ ƒƒ‚ƒŠƒŠ[ƒNC³
+ (doc/)
+ conf_ref.txt
+ C³
+
+EƒT[ƒo[ó‘ÔŠm”F—pCGIƒXƒNƒŠƒvƒg“Y•t‚È‚Ç
+ EŽ©ŒÈÓ”C•Úׂȉðà–³‚µAŽ¿–₳‚ê‚Ä‚àƒXƒ‹[‚·‚é‰Â”\«—L‚è
+ EƒGƒfƒBƒ^‚ÅŠJ‚¢‚½‚ç­‚µà–¾—L‚è
+ ECGIÝ’u‚ÌŠî–{‚³‚¦‚í‚©‚ê‚Ζâ‘è‚È‚¢‚Í‚¸
+
+ (tool/cgi/)
+ serverstatus.cgi
+ ƒT[ƒo[ó‘ÔŠm”F—pCGIƒXƒNƒŠƒvƒg
+ addaccount.cgi
+ à–¾C³
+
+--------------------
+//0874 by Kalen
+EWhiteDayƒCƒxƒ“ƒg’ljÁ
+ conf/npc/npc_event_whiteday.txt(V‹K)
+ ‚½‚¾A‚¨‰ÙŽq”„‚Á‚Ă邾‚¯‚Ý‚½‚¢cGM‚ª‚È‚É‚â‚é‚Ì‚©‚Í’m‚è‚Ü‚¹‚ñ‚ªB
+ sakRO‚Ì‚Ù‚¤‚ł̓zƒƒCƒgƒ`ƒ‡ƒR‚炵‚«‚à‚Ì‚ª’ljÁ‚³‚ꂽ‚Ì‚É
+ jRO‚ŒljÁ‚³‚ꂽ‚Ì‚Í—’d“P‹Žƒpƒbƒ`‚Ì‚Ý(*L„t`;)c
+
+EAlchemistƒMƒ‹ƒh‚Å“û”«A»‘¢‘‚ð•Ï‚¦‚é‚悤‚É
+ conf/npc/npc_job_alchemist.txt(V‹K)
+ “]EƒNƒGƒXƒg‚ª•ª‚©‚ç‚È‚©‚Á‚½‚̂ʼn·‚ß‚Ä‚¢‚Ü‚µ‚½‚ª
+ ”ƒ‚¦‚È‚¢‚Æ•s•Ö‚Æ•·‚¢‚½‚Ì‚ÅA’ljÁ
+
+EõFNPCŽÀ‘•
+ conf/npc/npc_event_dye.txt(XV)
+ ”¯Œ^•ÏX‚ªsakRO‚É—ˆ‚½‚炵‚¢‚Ì‚Å
+ ‚È‚ñ‚Æ‚È[‚­XV
+
+--------------------
+//0873 by Ž€_
+
+E@ƒRƒ}ƒ“ƒhitem2‚Ækillmonster ’ljÁB
+EƒXƒNƒŠƒvƒggetitem2‚Ækillmonsterall ’ljÁB
+E–î쬂Åì‚ç‚ꂽ–î‚໑¢ŽÒ‚Ì–¼‘O‚ª•t‚­‚悤‚ÉC³B
+Ebattle_athena.conf‚Émonster_class_change_full_recover’ljÁB
+E‘•”õƒXƒNƒŠƒvƒg‚ÉbWeaponComaEle‚ÆbWeaponComaRace ’ljÁB
+E­‚µŠÔˆá‚¢‚ª‚ ‚Á‚½ƒ_ƒ[ƒWŒvŽZŽ®C³B
+EbInfiniteEndure‚̈—‚ðƒCƒ“ƒfƒ…ƒA•\Ž¦‚È‚µ‚Å“à•”ˆ—‚·‚é‚悤‚É•ÏXB
+EƒI[ƒgƒXƒyƒ‹‚Åcastend_nodamage_id()‚ðŒÄ‚ÔƒXƒLƒ‹‚àŽg—p‚Å‚«‚é‚悤‚ÉC³B
+E‚»‚Ì‘¼×‚©‚¢C³‚ƃoƒOC³B
+E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒg‚Ȃ̂ŃoƒO‚ª‚ ‚Á‚½‚ç•ñ‚¨Šè‚¢‚µ‚Ü‚·B
+ (conf/)
+ help.txt C³B
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+ char_athena.conf C³B
+ (db/)
+ const.txt C³B
+ item_db.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ script_ref.txt C³B
+ conf_ref.txt C³B
+ (map/)
+ map.h C³B
+ map.c
+ map_quit() C³B
+ skill.h C³B
+ skill.c
+ skill_castend_nodamage_id()Askill_status_change_clear() C³B
+ skill_castend_id()Askill_castend_pos()Askill_arrow_create() C³B
+ skill_status_change_timer() C³B
+ pc.c
+ pc_calcstatus()Apc_bonus2()Apc_equipitem() C³B
+ pc_unequipitem()Apc_damage() C³B
+ battle.h C³B
+ battle.c
+ battle_get_dmotion()Abattle_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_config_read() C³B
+ clif.c
+ clif_parse_LoadEndAck()Aclif_damage()Aclif_skill_damage() C³B
+ clif_skill_damage2() C³B
+ itemdb.h C³B
+ itemdb.c
+ itemdb_isequip3() ’ljÁB
+ mob.h C³B
+ mob.c
+ mob_delay_item_drop()Amob_damage()Amob_changestate() C³B
+ mob_class_change()Amob_delete()Amob_catch_delete() C³B
+ script.c
+ buildin_getitem() C³B
+ buildin_killmonsterall_sub()Abuildin_killmonsterall() ’ljÁB
+ atcommand.h C³B
+ atcommand.c
+ atcommand() C³B
+ atkillmonster_sub() ’ljÁB
+
+--------------------
+//0872 by ElFinLazz
+
+EƒXƒLƒ‹ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[C³
+EƒXƒLƒ‹ƒMƒ€ƒ\ƒoƒ“ƒOƒhƒ“ƒ{ƒ‹ƒIƒbƒl‹ïŒ»
+EƒXƒLƒ‹ƒAƒuƒ‰ƒJƒ_ƒu‚È‚ç‹`ƒR[ƒ}‹ïŒ»
+EƒR[ƒ}‚Ì•ŠíƒIƒvƒVƒ‡ƒ“’ljÁ(Ží‘°, 番—¦)
+EƒIƒvƒVƒ‡ƒ“à–¾’ljÁ
+ (db/)
+ const.txt C³.
+ (doc/)
+ item_bonus.txt C³.
+ (map/)
+ map.h C³.
+ skill.c
+ skill_castend_nodamage_id(), skill_unit_group(), skill_status_change_start() C³.
+ pc.c
+ pc_calcstatus(), pc_bonus2(), pc_gainexp() C³.
+ battle.c
+ battle_weapon_attack() C³.
+
+--------------------
+//0871 by Ž€_
+
+E0869‚̃oƒOC³B
+Echar_athena.conf‚Ælogin_athena.conf‚É€–ڒljÁB(ƒLƒƒƒ‰ŽI‚ƃƒOƒCƒ“ŽI‚̃ƒOƒtƒ@ƒCƒ‹‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½BƒfƒtƒHƒ‹ƒg‚Ålog/ƒtƒHƒ‹ƒ_[‚É“ü‚é‚Ì‚ÅlogƒtƒHƒ‹ƒ_[‚ðì‚é•K—v‚ª‚ ‚è‚Ü‚·B)
+EƒGƒiƒW[ƒR[ƒg‚̈—‚ð­‚µC³Bƒ‚ƒ“ƒXƒ^[‚ªŽg‚Á‚½ê‡‚̓XƒLƒ‹ƒŒƒxƒ‹*6%‚Ì•¨—ƒ_ƒ[ƒW‚ðŒ¸‚ç‚·‚悤‚É•ÏXB
+E•ŠíˆÈŠO‚Ì•¨‚ł໑¢ŽÒ‚Ì–¼‘O‚ð•\Ž¦‚·‚é‚悤‚É•ÏXB(–{ŽI‚ł̓vƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX‚ÆŽèì‚èƒ`ƒ‡ƒRƒŒƒbƒgˆÈŠO‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñ‚ªƒpƒPƒbƒg‚Í‚ ‚邱‚Æ‚¾‚µ“ü‚ê‚Ä‚Ý‚Ü‚µ‚½B)
+E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
+E@ƒRƒ}ƒ“ƒhˆê‚‚ƃXƒNƒŠƒvƒgˆê‚‚ð’ljÁ‚µ‚Ü‚µ‚½‚ªà–¾‚ÍŒã‚̃pƒbƒ`‚Å‘‚«‚Ü‚·B
+ (conf/)
+ char_athena.conf C³B
+ login_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (login/)
+ login.c
+ parse_login()Alogin_config_read()Alogin_log() C³B
+ (char/)
+ char.h C³B
+ char.c
+ char_config_read()Amake_new_char()Aparse_char() C³B
+ int_party.c C³B
+ int_storage.c C³B
+ int_guild.c C³B
+ int_pet.c C³B
+ (map/)
+ map.h C³B
+ skill.c
+ skill_status_change_start()Askill_additional_effect() C³B
+ skill_castend_nodamage_id()Askill_check_condition() C³B
+ skill_status_change_clear()Askill_produce_mix() C³B
+ skill_status_change_timer() C³B
+ pc.c
+ pc_calcstatus()Apc_insert_card()Apc_additem()Apc_cart_additem() C³B
+ storage.c
+ storage_additem() C³B
+ battle.c
+ battle_get_adelay()Abattle_get_amotion()Abattle_calc_damage() C³B
+ clif.c
+ clif_additem()Aclif_equiplist()Aclif_storageequiplist() C³B
+ clif_tradeadditem()Aclif_storageitemadded()Aclif_use_card() C³B
+ clif_cart_additem()Aclif_cart_equiplist()Aclif_vendinglist() C³B
+ clif_openvending()Aclif_arrow_create_list() C³B
+ clif_skill_produce_mix_list()Aclif_parse_SelectArrow() C³B
+ clif_parse_ProduceMix() C³B
+ script.c
+ buildin_produce() C³B
+ buildin_getitem2() ’ljÁB
+ atcommand.c
+ atcommand() C³B
+
+--------------------
+//0870 by shuto
+
+Emapflag‚ÌUéíMAP‚Énomemo’ljÁ
+EƒMƒ‹ƒh•ó” ‚ÅA•ó” oŒ»‚Æ“¯Žž‚ÉMAPŽI‚ª—Ž‚¿‚é–â‘èC³(by ‚Ò‚´‚Ü‚ñ)
+
+--------------------
+//0869 by Ž€_
+
+Ebattle_athena.conf‚Éplayer_land_skill_limitAmonster_land_skill_limitAparty_skill_penaly ’ljÁB
+Echar_athena.conf‚Éparty_share_level ’ljÁB
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (conf/)
+ char_athena.conf C³B
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (char/)
+ char.h C³B
+ char.c
+ char_config_read() C³B
+ int_party.c
+ party_check_exp_share() C³B
+ (map/)
+ map.h C³B
+ skill.c
+ skill_attack()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_status_change_start() C³B
+ skill_castend_pos() C³B
+ pc.c
+ pc_calcstatus() C³B
+ mob.c
+ mobskill_castend_pos() C³B
+ battle.h
+ battle.c
+ battle_get_adelay()Abattle_get_amotion()Abattle_calc_damage() C³B
+ battle_config_read() C³B
+ pet.c
+ pet_data_init() C³B
+
+--------------------
+//0868 by Ž€_
+
+Eƒ}ƒWƒbƒNƒƒbƒhŽÀ‘•‚ƃXƒyƒ‹ƒuƒŒƒCƒJ[C³B
+Eƒ}ƒWƒbƒNƒƒbƒh‚Ìꇖ{ŽI‚ÅŽg‚Á‚Ä‚à‚È‚ñ‚Ì•\Ž¦‚à‚È‚­”­“®‚Ì‘O‚É‚ÍŽg‚Á‚½‚©‚Ç‚¤‚©‚ÌŠm”F‚ª‚Å‚«‚È‚¢‚̂ŃXƒLƒ‹‰r¥ƒpƒPƒbƒg(0x13e)‚ð—˜—p‚µ‚ÄŽg—p‚·‚鎞ƒXƒLƒ‹–¼‚ªo‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·B(–{ŽI‚ƈႤ‚¼‚Æ‚©‚Å•¶‹å‚ª‚±‚È‚¢‚悤‚É)
+EƒXƒyƒ‹ƒuƒŒƒCƒJ[‰r¥ƒLƒƒƒ“ƒZƒ‹‚ÉŠÖŒW‚È‚­skill_db.txt‚Éݒ肳‚ê‚Ä‚éskill_type‚ªmagic‚̃XƒLƒ‹‚Ì‚Ý”j‚邱‚Æ‚ª‚Å‚«‚Ü‚·B(ƒ‰ƒOƒiƒQ[ƒg‚Ìà–¾‚ð“K—p)
+Eskill_db.txt‚Ì‘Ž®‚ª•Ï‚í‚Á‚½‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢BƒmƒbƒNƒoƒbƒN‹——£‚ÌÝ’è‚à‚Å‚«‚Ü‚·‚ª”O‚ׂ̈ɂ¢‚Á‚Ä‚¨‚«‚Ü‚·‚ªAŽI‚ł̃eƒXƒg‚ÅFW‚̃mƒbƒNƒoƒbƒN‹——£‚Í2‚ŃTƒ“ƒN‚à2‚Å‚ ‚邱‚Æ‚ðŠm”F‚µ‚Ä‚¢‚Ü‚·BŠØ‘‚Ì2003”N11ŒŽ19“úƒpƒbƒ`‘O‚ÌŽI‚Å‚Í‚ ‚è‚Ü‚·‚ª2-2‚Í“K—p‚³‚ê‚Ä‚¢‚銂Ȃ̂Ŗ{ŽI‚̈Ⴂ‚Í‚È‚¢‚ÆŽv‚¢‚Ü‚·B
+E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
+E0867‚Å‘‚«–Y‚êBƒ‚ƒ“ƒXƒ^[‚̃q[ƒ‹‚ŃAƒ“ƒfƒbƒhƒ‚ƒ“ƒXƒ^[‚ªUŒ‚‚³‚ê‚ÄŽ©–Å‚·‚é‚̂Ńq[ƒ‹‚⃊ƒU‚Ìê‡mob_skill_db.txt‚Ìval1(’l1)‚É1‚ð“ü‚ê‚é‚ƃAƒ“ƒfƒbƒhƒ‚ƒ“ƒXƒ^[‚àUŒ‚‚ðŽó‚¯‚¸‰ñ•œ‚·‚é‚悤‚É‚È‚è‚Ü‚·B–{ŽI‚ł̓‚ƒ“ƒXƒ^[‚̃q[ƒ‹‚̓Aƒ“ƒfƒbƒh‚ÉŠÖŒW‚È‚­‰ñ•œ‚·‚é‚悤‚Å‚·B‚½‚¾ŒÂl“I‚ɂ̓]ƒ“ƒr‚ªƒq[ƒ‹‚µ‚ÄŽ©–Å‚·‚é•û‚ª³‚µ‚¢‚ÆŽv‚¤‚Ì‚Åmob_skill_db.txt‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ä‚¨‚è‚Ü‚·B
+ (doc/)
+ db_ref.txt C³B
+ (db/)
+ cast_db.txt C³B
+ skill_db.txt C³B
+ (map/)
+ skill.h C³B
+ skill.c
+ skill_status_change_start()Askill_status_change_end() C³B
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ skill_attack()Askill_status_change_timer()Askill_castcancel() C³B
+ skill_unit_onplace()Askill_use_id()Askill_castend_id() C³B
+ skill_readdb() C³B
+ skill_get_blewcount() ’ljÁB
+ mob.c
+ mobskill_use_id()Amob_spawn()Amob_attack() C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_calc_misc_attack()Abattle_weapon_attack() C³B
+ clif.c
+ clif_damage() C³B
+ pet.c
+ pet_attack() C³B
+ pc.c
+ pc_attack_timer()Apc_authok() C³B
+ pc_spirit_heal()Apc_natural_heal_sub() C³B
+
+--------------------
+//0867 by Ž€_
+
+EƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
+Ebattle_athena.conf‚Éplayer_undead_nofreeze’ljÁB
+EV‚µ‚¢ƒAƒCƒeƒ€ƒpƒPƒbƒg‚ɑΉžB(PACKETVER‚ð5ˆÈã‚É‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B)
+Emob_avail.txt‚ŃvƒŒƒCƒ„[‚ÌŽp‚ðŽw’肵‚½ŽžƒyƒRƒyƒR‚â‘é‚ð•t‚¯‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É•ÏXB“ª‰º’iŽŸ‚ɃIƒvƒVƒ‡ƒ“‚ðÝ’è‚Å‚«‚Ü‚·B(‚½‚¾ƒnƒCƒfƒBƒ“ƒO‚ƃNƒ[ƒLƒ“ƒO‚ÍŽw’è‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
+ makefile C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ client_packet.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_config_read() C³B
+ clif.c
+ clif_mob_class_change()Aclif_spawnmob()Aclif_spawnpet() C³B
+ clif_damage()Aclif_skill_damage()Aclif_skill_damage2() C³B
+ clif_itemlist()Aclif_cart_itemlist()Aclif_storageitemlist() C³B
+ clif_mob0078()Aclif_mob007b()Aclif_pet0078()Aclif_pet007b() C³B
+ pc.c
+ pc_attack_timer() C³B
+ skill.c
+ skill_castend_nodamage_id()Askill_additional_effect() C³B
+ skill_status_change_start() C³B
+ mob.h C³B
+ mob.c
+ mobskill_castend_id()Amob_getfriendstatus_sub() C³B
+ mob_readdb_mobavail() C³B
+
+--------------------
+//0866 by ‚Ò‚´‚Ü‚ñ
+
+EMOTD‚̃ƒbƒZ[ƒW‚ð‘S‚Ä•ÒW‚Å‚«‚é‚悤‚É•ÏXB
+EƒNƒ[ƒ“ƒXƒLƒ‹ŽÀ‘•B
+@ƒhƒ‹•ž‚̃q[ƒ‹ƒAƒ^ƒbƒN‚É‚æ‚éƒq[ƒ‹K“¾‚Í–¢ƒeƒXƒg‚Å‚·B
+EƒMƒ‹ƒh•ó” ‰¼ŽÀ‘•B
+@ƒ”ƒ@ƒ‹ƒLƒŠ[‚P‚Ì‚Ý‚Å‚·B
+@¤‹Æ“ŠŽ‘‚É‚æ‚é•ó” ŒÂ”‚ÌŽZoŽ®‚Í“K“–‚Å‚·(‰ŠúŒÂ”4ŒÂ‚Æ‚µ‚©’m‚ç‚È‚¢‚Ì‚Å)B
+@OnclockƒCƒxƒ“ƒg‚Å“®ì‚³‚¹‚Ä‚¢‚Ü‚·B”CˆÓ‚ÌŽž‚É•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
+EAthenaDBŒv‰æ‚Ìmob_db.txt‚Æmapflag.txt‚ð“ü‚ê‚Ä‚¨‚«‚Ü‚µ‚½B
+
+ (map/)
+ pc.c
+ pc_makesavestatus()Apc_calc_skilltree() C³B
+ pc_allskillup()Apc_calc_skillpoint() C³B
+ pc_resetskill()Apc_authok() C³B
+ skill.c
+ skill_attack() C³B
+ map.h C³B
+ (conf/)
+ gvg/TEST_prtg_cas01_AbraiJ.txt C³B
+ motd.txt C³B
+ mapflag.txt C³B
+ (db/)
+ mob_db.txt C³B
+
+--------------------
+//0865 by ‚Ò‚´‚Ü‚ñ
+
+EŽ©•ª‚ªè—Ì‚µ‚Ä‚¢‚éƒAƒWƒg‚̃Gƒ“ƒyƒŠƒEƒ€‚ðUŒ‚‚Å‚«‚½ƒoƒOC³B
+EƒAƒuƒ‰ƒC‚ªè—̃Mƒ‹ƒhƒƒ“ƒo[‘Sˆõ‚ðƒ}ƒXƒ^[‚Æ‚Ý‚È‚µ‚Ä‚¢‚½ƒoƒOC³B
+@‚±‚ÌC³‚É”º‚Á‚ăXƒNƒŠƒvƒgƒŠƒtƒ@ƒŒƒ“ƒX‚ɉü•Ï‚ª‚ ‚è‚Ü‚·B
+ Egetcharid(0)‚ÅAŽ©•ª‚ÌcharID‚ð•Ô‚·‚悤‚ÉB
+ Egetguildmasterid(<n>)’ljÁB
+ @<n>=ƒMƒ‹ƒhID
+ @ŠY“–ƒMƒ‹ƒh‚̃}ƒXƒ^[‚ÌcharID‚ð•Ô‚µ‚Ü‚·B
+
+ (map/)
+ guild.c
+ guild_mapname2gc() ’ljÁB
+ battle.c
+ battle_calc_damage() C³B
+ script.c
+ buildin_getcharid() C³B
+ buildin_getguildmasterid() ’ljÁB
+ ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾‚̈ꕔ‚ðC³A’ljÁB
+ guild.h C³B
+
+--------------------
+//0864 by ŒÓ’±—–
+
+EinterŽI‚Ìwis‚̈—•ÏX
+ EŽ©‘OƒŠƒ“ƒNƒŠƒXƒg‚©‚çdb.h‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚éƒf[ƒ^ƒx[ƒX‚ðŽg—p‚·‚é‚悤‚É
+ EWIS‚ÌID‚ð16ƒrƒbƒg‚©‚ç32ƒrƒbƒg‚É‘‚₵‚½iƒpƒPƒbƒg‚àC³j
+ EƒƒbƒZ[ƒW‚̃TƒCƒYƒ`ƒFƒbƒN‚ð“ü‚ꂽ
+ EƒpƒPƒbƒgƒXƒLƒbƒv‚ª“ñ‰ñs‚í‚ê‚é‰Â”\«‚ª‚ ‚éƒoƒOC³
+
+ (char/)
+ inter.c
+ wisŠÖŒW‘å••ÏX
+ (map/)
+ intif.c
+ wisŠÖŒW‚ÌC³BŽå‚ɃpƒPƒbƒgˆ—B
+ (doc/)
+ inter_server_packet.txt
+ ƒpƒPƒbƒg3002,3801‚ð•ÏX
+
+--------------------
+//0863 by Ž€_
+
+Eׂ©‚¢C³B
+Ebattle_athena.conf‚Éplayer_attack_direction_change’ljÁB
+Emob_skill_db.txt‚ðC³‚·‚鎞’§”­‚ÌC³‚ðŠÔˆá‚Á‚ÄC³B
+Eƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹Ž©”š–â‘èC³B(–¢ƒeƒXƒg)
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ mob_skill_db.txt C³B
+ (map/)
+ mob.c
+ mobskill_use_id()Amobskill_use()Amobskill_castend_id() C³B
+ pc.c
+ pc_skill()Apc_attack_timer() C³B
+ skill.c
+ skill_castend_damage_id() C³B
+ battle.h C³B
+ battle.c
+ battle_weapon_attack()Abattle_config_read() C³B
+
+--------------------
+//0862 by ŒÓ’±—–
+
+EmobƒXƒLƒ‹Žg—pðŒ’ljÁ
+ Efriendhpltmaxrate : –¡•û‚ÌHP‚ªŽw’è“–¢–ž‚Ì‚Æ‚«(ƒeƒXƒgÏ‚Ý)
+ Efriendstatuson : –¡•û‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚é‚Æ‚«
+ Efriendstatusoff : –¡•û‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚È‚¢‚Æ‚«
+ Emystatuson : Ž©•ª‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚é‚Æ‚«
+ Emystatusoff : Ž©•ª‚ªŽw’肵‚½ƒXƒe[ƒ^ƒXˆÙí‚É‚È‚Á‚Ä‚¢‚È‚¢‚Æ‚«
+ ƒXƒe[ƒ^ƒXŒn‚Í–¢ƒeƒXƒg‚Å‚·Bmob_skill_db.txt‚ÉŽw’è•û–@‚ð‘‚¢‚Ä‚¢‚Ü‚·B
+ ‚½‚Æ‚¦‚ÎŽ©•ª‚ª“Å‚©‚Ç‚¤‚©‚Í mystatus,poison ‚ÅA
+ ƒnƒCƒfƒBƒ“ƒO’†‚©‚Ç‚¤‚©‚Í mystatuson,hiding ‚ÅŽw’肵‚Ü‚·B
+EmobƒXƒLƒ‹Žg—pƒ^[ƒQƒbƒg’ljÁ
+ Efriend : –¡•û
+ Earound : Ž©•ª‚ÌŽüˆÍiŒ»Ý‚ÌŽd—l‚Å‚ÍŽüˆÍ81ƒ}ƒXj‚Ì‚Ç‚ê‚©
+ Earound1`around4 : Ž©•ª‚ÌŽüˆÍ‚X,25,49,81ƒ}ƒX‚Ì‚Ç‚ê‚©(”͈͂𖾎¦)
+ friend‚ÍðŒ‚ªfriendŒn(friendhpltmaxrate‚È‚Ç)‚Ì‚Æ‚«‚ÉŽg—p‰Â”\B
+ aroundŒn‚Íꊎw’èƒXƒLƒ‹‚ÅŽg—p‰Â”\B
+
+ (map/)
+ mob.c / mob.h
+ mob_getfriend*()’ljÁAmobskill_use()C³‚È‚Ç
+ (db/)
+ mob_skill_db.txt
+ ʼn‚Ìà–¾‚Ì‚ÝC³Bƒf[ƒ^‚ÍC³‚µ‚Ä‚¢‚Ü‚¹‚ñB
+
+--------------------
+//0861 by ‚¢‚Ç
+
+EƒT[ƒo[snapshot
+
+--------------------
+//0860 by J
+
+EŽ€_‚³‚ñ‚̎艺¢Š«‚ÌC³‚ɇ‚킹‚ÄMOBƒXƒLƒ‹DB‚ðC³
+(/conf)
+ mob_skill_db.txt C³B
+
+--------------------
+//0859 by Ž‚Žqo^.^o
+Alchemist warp C³(AegisŽQl)
+(/conf)
+ (/warp)
+ npc_warp_job.txt C³
+
+--------------------
+//0858 by Ž€_
+
+Eׂ©‚¢C³B
+EMAX_MOBSKILL‚ð24‚©‚ç32‚É•ÏXB(‚½‚¾­‚µ‚Å‚·‚ª‚Ü‚½ƒƒ‚ƒŠ[Žg—p—Ê‚ª‘‚¦‚Ü‚·B)
+Eƒvƒƒ{ƒP[ƒVƒ‡ƒ“‚ÅŽæ‚és“®‚ðmob_skill_db.txt‚Ìval1(’l1)‚ÅÝ’è‚Å‚«‚é‚悤‚ÉC³B
+EŽè‰º¢Š«‚Å•¡”‚ÌŽí—Þ‚ðÝ’èoØ‚é‚悤‚ÉC³B(Å‘å5‚‚܂Å)
+Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚ƃgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“‚à•¡”‚ÌŽí—Þ‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
+ (db/)
+ skill_db.txt C³B
+ mob_skill_db.txt C³B
+ (map/)
+ skill.c
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ map.h C³B
+ mob.h C³B
+ mob.c
+ mob_readskilldb()Amob_summonslave()Amob_class_change() C³B
+
+--------------------
+//0857 by J
+
+EOWN Ragnarok‚É‚Ì‚Á‚Ä‚¢‚½î•ñ‚ðŒ³‚ÉMOBƒXƒLƒ‹‚ðC³B
+Echase(“ËŒ‚)‚ªŽÀ‘•‚³‚ê‚Ä‚¢‚é‚Æ‚Ì‚±‚Æ‚È‚Ì‚Å“ËŒ‚(?)‚ðchase‚É‚©‚¦‚Ä
+ƒRƒƒ“ƒgƒAƒEƒg‚ð‚Í‚¸‚µ‚Ü‚µ‚½B
+EŽ€_‚³‚ñ‚ªŽÀ‘•‚µ‚½MOBƒXƒLƒ‹‚ðŽg—p‚·‚郂ƒ“ƒXƒ^[‚ðŽëêî•ñ‚ÉÚ‚Á‚Ä‚éî•ñ‚ðŒ³‚ÉŽÀ‘•B
+ (/conf)
+ mob_skill_db.txt
+
+--------------------
+//0856 by Ž€_
+
+EƒoƒOC³‚Æׂ©‚¢C³B
+Ebattle_athena.conf‚Émonster_attack_direction_change’ljÁB
+Ebattle_athena.conf‚Ìbasic_skill_check‚ƃJƒvƒ‰‚Ì‘qŒÉ—˜—p‚ð‡‚킹‚Ä‚¢‚Ü‚µ‚½‚ª‚¢‚‚̂܂ɂ©‚È‚­‚È‚Á‚½‚Ì‚ÅŽæ‚è–ß‚µB(basic_skill_check‚ªno‚È‚çŠî–{‹@”\ƒXƒLƒ‹ƒŒƒxƒ‹‚ÉŠÖŒW‚È‚­‘qŒÉ‚ðŽg‚¦‚Ü‚·B)
+EƒsƒA[ƒVƒ“ƒOƒAƒ^ƒbƒN‚ÌŽË’ö‚ð3ƒZƒ‹‚É•ÏX‚µ‚Ä‹ßÚUŒ‚‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚ÉC³B
+EAŽI‚ł̃eƒXƒg‚ŃAƒ“ƒfƒbƒh‚Ì”FŽ¯‚ð‘®«‚É‚æ‚Á‚Ä‚·‚邱‚Æ‚ª‚í‚©‚Á‚½‚Ì‚Åundead_detect_type‚̃fƒtƒHƒ‹ƒg‚ð0‚É•ÏXB
+Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚âƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“‚ÅŒ©‚½–Ú‚ªƒvƒŒƒCƒ„[‚È‚ç0x1b0ƒpƒPƒbƒg‚ð‘—‚ç‚È‚¢‚悤‚É•ÏXB
+Eƒjƒ…[ƒ}ƒoƒO‚ÍC³‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŽžŠÔ‚É‚æ‚éì“®Žd—l‚Í‚Ü‚¾•ªÍ‚ªŠ®‘S‚¶‚á‚È‚¢‚Ì‚Å‘¼‚Ì•s‹ï‡‚ªo‚Ä‚­‚é‚©‚à...
+ (conf/)
+ battle_athena.conf C³B
+ mapflag.txt C³B(•’ʂ̃_ƒ“ƒWƒ‡ƒ“‚ªƒV[ƒYƒ‚[ƒh‚Å‚ ‚é‚Í‚¸‚ª‚È‚¢‚Ì‚Å)
+ (conf/npc/)
+ npc_town_kafra.txt C³B
+ (db/)
+ skill_db.txt C³B
+ (doc/)
+ conf_ref.txt C³B
+ script_ref.txt C³B
+ (map/)
+ pc.c
+ pc_modifybuyvalue()Apc_modifysellvalue() C³B
+ battle.h
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
+ battle_config_read() C³B
+ skill.c
+ skill_unitsetting()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id() C³B
+ mob.c
+ mob_attack() C³B
+ pet.c
+ pet_attack() C³B
+ clif.c
+ mob_class_change() C³B
+
+--------------------
+//0855 by asong
+
+Eƒƒ^ƒ‚ƒ‹ƒtƒH[ƒVƒX‚Å‚o‚b‚Æ‚µ‚Ä•\Ž¦‚·‚é‚l‚n‚a‚ðŽw’肵‚½ê‡‘q—Ž‚¿‚·‚éƒoƒO‚ðuŽb’èvC³B
+E0x1b0ƒpƒP‚Å‚Í–³‚­0x7b‚ðŽg‚¤‚±‚Ƃʼn½‚Æ‚©‚µ‚Ä‚¢‚Ü‚·B
+EŽg‚¢•ª‚¯‚ð‚µ‚½‚¢‚Æ‚±‚ë‚Å‚·‚ª“–•û‚b‚Ì’mŽ¯‚ª–³‚­ðŒ•ªŠò‚ªãŽè‚­‚¢‚«‚Ü‚¹‚ñ‚Å‚µ‚½B
+E‚à‚µ‚©‚µ‚½‚çƒvƒp‚Ì›z‰»i‰H‰»Hj‚ª‚¨‚©‚µ‚­‚È‚Á‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ (/map)
+ clif.c
+ mob_class_change() C³B
+
+--------------------
+//0854 by Kalen
+
+E•s‘«‚µ‚Ä‚¢‚½ˆêŽŸE“]EƒNƒGƒXƒg’ljÁ‹y‚ÑA‚»‚ê‚É”º‚¤WarpAMobC³)
+ (/conf)
+ (/npc)
+ npc_job_archer.txt
+ npc_job_swordman.txt
+ npc_job_thief.txt(‘䎌C³A“_”ˆ—•ÏX)
+ npc_job_magician.txt
+ (/warp)
+ npc_warp25.txt(ˆê•”ˆÚ“®)
+ npc_warp.txt(ˆê•”ˆÚ“®)
+ npc_warp_job.txt(VÝ)
+ (/mob)
+ npc_mob_job.txt
+E—Õ‚èQuest’ljÁ‹y‚ÑA‚»‚ê‚É”º‚¤NPCC³BƒAƒ}ƒcs‚«‘D‚Å—¿‹à‚ðŽæ‚ç‚È‚©‚Á‚½–â‘èC³
+ (/conf)
+ npc_event_hinamatsuri.txt
+ npc_town_amatsu.txt
+ npc_town_guide.txt
+ npc_town_kafra.txt
+ —Õ‚è‚ð—LŒø‚É‚·‚é‚ƃAƒ}ƒcƒJƒvƒ‰‚ðW‚ÉA
+ ƒAƒ‹ƒxƒ‹ƒ^“ìƒJƒvƒ‰‚ð휂ɂ·‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·B
+
+--------------------
+//0853 by Ž€_
+
+EƒoƒOC³‚ÆNPCƒXƒLƒ‹ŠÖŒW‚ÌC³B
+Eƒ_[ƒNƒuƒŒƒX‚ðMISCUŒ‚‚É•ÏXB(‚½‚¾–½’†”»’è—L‚è)
+EƒNƒŠƒeƒBƒJƒ‹ƒXƒ‰ƒbƒVƒ…AƒRƒ“ƒ{ƒAƒ^ƒbƒNAƒKƒCƒfƒbƒhƒAƒ^ƒbƒNAƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒNAƒuƒ‰ƒCƒ“ƒhƒAƒ^ƒbƒNAƒJ[ƒXƒAƒ^ƒbƒNAƒyƒgƒŠƒtƒ@ƒCƒAƒ^ƒbƒNAƒ|ƒCƒYƒ“ƒAƒ^ƒbƒNAƒTƒCƒŒƒ“ƒXƒAƒ^ƒbƒNAƒXƒŠ[ƒvƒAƒ^ƒbƒNAƒXƒ^ƒ“ƒAƒ^ƒbƒNAƒ‰ƒ“ƒ_ƒ€ƒAƒ^ƒbƒNAƒ_[ƒNƒlƒXƒAƒ^ƒbƒNAƒtƒ@ƒCƒAƒAƒ^ƒbƒNAƒOƒ‰ƒEƒ“ƒhƒAƒ^ƒbƒNAƒz[ƒŠ[ƒAƒ^ƒbƒNAƒ|ƒCƒYƒ“ƒAƒ^ƒbƒNAƒeƒŒƒLƒlƒXƒAƒ^ƒbƒNAƒEƒH[ƒ^[ƒAƒ^ƒbƒNAƒEƒBƒ“ƒhƒAƒ^ƒbƒNAƒ}ƒWƒJƒ‹ƒAƒ^ƒbƒNAƒuƒ‰ƒbƒhƒhƒŒƒCƒ“Aƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[‚̓‚ƒ“ƒXƒ^[‚Ì•ŠíŽË’ö‚É•ÏXB‚»‚µ‚Ä‚±‚ê‚ç‚̃XƒLƒ‹‚ðƒ‚ƒ“ƒXƒ^[‚ÌUŒ‚ŽË’ö‚É‚æ‚Á‚ĉ“‹——£UŒ‚‚Æ‹ß‹——£UŒ‚‚É‚È‚é‚悤‚É•ÏXB
+EƒsƒA[ƒVƒ“ƒOƒAƒ^ƒbƒN‚Í•ŠíŽË’ö+2‚É•ÏXB
+EƒGƒiƒW[ƒhƒŒƒCƒ“Aƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“‚Í–‚–@ŽË’ö‚É•ÏXB
+Eƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO‚ÌŽË’ö‚ð4‚É•ÏX‚Æ‚©‚©‚éŠm—¦‚ð50+ƒXƒLƒ‹ƒŒƒxƒ‹*5%‚É•ÏXB(ˆê‰ž‚±‚ê‚à–‚–@‚È‚Ì‚Å­‚µŽË’ö‚ðL‚­‚µ‚Ü‚µ‚½BŠî–{–‚–@ŽË’ö‚Å‚ ‚é8‚É•Ï‚¦‚é‚ׂ«‚È‚Ì‚©‚Ç‚¤‚©‚Í”÷–­...)
+EƒKƒCƒfƒbƒhƒAƒ^ƒbƒN‚̓ZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚𖳌ø‚É‚·‚é•ñ‚ª‚ ‚è‚Ü‚µ‚½‚̂ŃZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚ªŒø‚©‚È‚¢‚悤‚ÉC³B
+EƒfƒBƒtƒFƒ“ƒ_[‚̓GƒtƒFƒNƒg‚¾‚¯o‚é‚悤‚ÉC³B(ƒXƒLƒ‹‚ÌŽd—l“™‚ð‚í‚©‚é•û‚Íî•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
+Eƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“ŽÀ‘•B(ƒƒ^ƒ‚[ƒtƒHƒVƒX‚Æ“¯‚¶•¨‚¾‚»‚¤‚Å‚·B‚½‚¾‚±‚ê‚Í‘S‘RŠÖŒW‚È‚¢•Ê‚̃‚ƒ“ƒXƒ^[‚ɂȂ镨‚炵‚¢‚Å‚·Bƒjƒtƒ‹ƒwƒCƒ€‚ÉŽg‚¤‚â‚‚ª‚¢‚é‚Ý‚½‚¢‚Å‚·B)
+EAthenaŽG’kƒXƒŒƒbƒh ‘´‚Ì“ó‚Ì80‚ðscript_ref.txt‚Æ‚µ‚ĒljÁ‚Æ‚¿‚å‚Á‚ÆC³B
+ (db/)
+ skill_db.txt C³B
+ (doc/)
+ script_ref.txt ’ljÁB
+ (map/)
+ battle.c
+ battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
+ skill.c
+ castend_damage_id()Acastend_nodamage_id()Askill_use_pos() C³B
+ clif.c
+ clif_spawnnpc()Aclif_parse_Restart()Aclif_parse_QuitGame() C³B
+ mob.c
+ mobskill_castend_id()Amobskill_castend_pos() C³B
+ mobskill_use_id()Amobskill_use_pos() C³B
+
+--------------------
+//0852 by ‚Ò‚´‚Ü‚ñ
+
+E‹T“‡4FE‹aD2FEƒAƒ}ƒcD1F‚ðƒeƒŒƒ|•s‰ÂAƒV[ƒYƒ‚[ƒh‚É•ÏXB
+Enosave‚̈ø”‚ÉSavePoint‚ªŽw’è‚Å‚«‚Ä‚È‚©‚Á‚½‚̂ŒljÁB
+EPVP‚Ìmapflag‚ðmapflag.txt‚É“‡B
+ (map/)
+ npc.c
+ npc_parse_mapflag() C³B
+ (conf/)
+ mapflag.txt C³B
+ npc/npc_pvp.txt C³B
+
+--------------------
+//0851 by ŒÓ’±—–
+
+EƒƒOƒCƒ“Žž‚̈Ɖ»key‚ªí‚É“¯‚¶‚Æ‚¢‚¤‘å‚«‚È–â‘肪‚ ‚Á‚½‚Ì‚ÅC³
+EƒƒOƒCƒ“ŠÇ—ŽÒƒƒOƒCƒ“(ladmin‚ÅŽg—p)‚ŃpƒXƒ[ƒh‚̈Ɖ»‚ɑΉž
+ (login/)
+ login.c
+ login_session_dataì¬AˆÃ†‰»key‚ðƒNƒ‰ƒCƒAƒ“ƒg‚²‚Æ‚É쬂ȂÇ
+ (tool/)
+ ladmin
+ ver.1.05‚ÉBƒfƒtƒHƒ‹ƒg‚ŃpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é‚悤‚ÉB
+ ˆÃ†‰»‚Ì‚½‚ß‚ÉDigest::MD5ƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚µ‚Ü‚·B
+ Digest::MD5‚ª–³‚¢ê‡‚̓pƒXƒ[ƒh‚̈Ɖ»‚ðs‚¢‚Ü‚¹‚ñB
+ (doc/)
+ admin_packet.txt
+ ƒƒOƒCƒ“ƒT[ƒo[ŠÇ—ƒƒOƒCƒ“•”•ª•ÏX
+
+--------------------
+//0850 by Ž€_
+
+ENPCƒXƒLƒ‹ŽÀ‘•B(ƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“AƒL[ƒsƒ“ƒOAƒŠƒbƒNAƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[Aƒvƒƒ{ƒP[ƒVƒ‡ƒ“AƒoƒŠƒ„[Aƒ_[ƒNƒuƒŒƒbƒVƒ“ƒOAƒ_[ƒNƒuƒŒƒX)
+EƒXƒLƒ‹Ž©”š‚̧ŒÀ‚Ímob_skill_db.txt‚Å‚â‚ê‚΂¢‚¢‚à‚Ì‚È‚Ì‚ÅŽæ‚è–ß‚µB
+Ebattle_athena.conf‚Épet_hungry_friendly_decrease’ljÁB
+Eƒyƒbƒg‚Ì• ‚ªŠ®‘S‚ÉŒ¸‚é‚ÆŽx‰‡UŒ‚‚𒆎~‚·‚é‚悤‚É•ÏXB
+E‘®«•ÏXƒXƒLƒ‹‚ªì“®‚µ‚È‚©‚Á‚½–â‘èC³B
+Eƒƒ“ƒ^ƒ‹ƒuƒŒƒCƒJ[‚Í10+ƒXƒLƒ‹ƒŒƒxƒ‹*5%‚ÌSP‚ðŒ¸‚ç‚·B(UŒ‚‚Í’Êí•ŠíƒXƒLƒ‹UŒ‚)
+EƒŠƒbƒN‚Í•K’†‚ÅSP-100AƒXƒ^ƒ“Šm—¦ƒXƒLƒ‹ƒŒƒxƒ‹*5%B(ƒ_ƒ[ƒW‚Í–³‚µAbNoWeaponDamage‚Å–³Œø)
+Eƒvƒƒ{ƒP[ƒVƒ‡ƒ“‚̓‚[ƒVƒ‡ƒ“‚ª€”õ‚³‚ê‚Ä‚È‚¢ƒ‚ƒ“ƒXƒ^[‚Í“ü‚ê‚Ä‚à‚È‚ñ‚ÌŒø‰Ê‚à‚È‚µB
+Eƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO‚Í‚©‚©‚é‚ÆHP‚ª1‚É‚È‚éB‘Ï«‚Í–‚–@–hŒä‚Å“K—pB
+Eƒ_[ƒNƒuƒŒƒX‚Í500+(ƒXƒLƒ‹ƒŒƒxƒ‹-1)*1000+rand(0,1000)‚̃_ƒ[ƒWB‰ñ”ð‚Å‚«‚邪–hŒä–³Ž‹‚Å‹ß‹——£•¨—UŒ‚‚¾‚ªƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚Í–³Ž‹‚µ‚Ĉő®«UŒ‚B(–{ŽI‚ÌŒvŽZŽ®‚É‚ ‚Á‚Ä‚¢‚é‰Â”\«‚Í‚È‚¢‚©‚àB‚½‚¾ƒ_ƒ[ƒW—Ê‚Æ–½’†•â³ˆÈŠO‚Í–{ŽI‡‚킹)
+ENPCƒXƒLƒ‹‚̈ێŽžŠÔ‚Í“K“x‚ÉÝ’èB
+Eƒ‚ƒ“ƒXƒ^[‚Ì‘®«UŒ‚‚ƃKƒCƒfƒbƒhƒAƒ^ƒbƒN‚ªƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚𖳎‹‚·‚é‚Æ‚Ì•ñ‚ðŽó‚¯‚½‚Ì‚Å‚·‚ªC³‚·‚é‚©‚Ç‚¤‚©‚Í‚¿‚å‚Á‚Æ”÷–­B(ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN‚àƒZƒCƒtƒeƒBƒEƒH[ƒ‹–³Ž‹‚©‚à)
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ cast_db.txt C³B
+ skill_db.txt C³B
+ (map/)
+ mob.c
+ mob_damage() C³B
+ clif.h C³B
+ clif.c
+ clif_skill_estimation()Aclif_damage()Aclif_skill_damage() C³B
+ clif_skill_damage2()Aclif_pet_performance() C³B
+ pet.c
+ pet_performance()Apet_target_check()Apet_hungry() C³B
+ skill.h C³B
+ skill.c
+ skill_additional_effect()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_status_change_start() C³B
+ battle.h C³B
+ battle.c
+ battle_get_def()Abattle_get_mdef()Abattle_calc_damage() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_config_read() C³B
+
+--------------------
+//0849 by lapis
+
+EŠX’†‚̃eƒXƒgƒMƒ‹ƒhƒtƒ‰ƒO‚Ì•\Ž¦‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³B
+EƒMƒ‹ƒhƒƒ“ƒo[‚ÍŠø‚©‚çƒAƒWƒg‚É”ò‚ׂé‚悤‚ÉC³B
+ (conf/gvg)
+ TEST_prtg_cas01_AbraiJ.txt C³B
+
+--------------------
+//0848 by huge
+
+EƒXƒLƒ‹Ž©”š‚ðAHP‚ª‘S‰ñ•œ‚µ‚Ä‚¢‚鎞‚ÍŽg‚¦‚È‚¢‚悤C³B
+EƒXƒtƒBƒAƒ}ƒCƒ“EƒoƒCƒIƒvƒ‰ƒ“ƒgEEEƒ^[ƒQƒbƒg•ÏX‚Å‚«‚È‚¢...B
+Emob‚Ƀ^[ƒQƒbƒg–³Ž‹ID‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B(Gv—pmob‚ÉŽg‚¦‚éH)
+ (map/)
+ map.h C³B
+ mob_data‚É int exclusion_src,exclusion_party,exclusion_guild ’ljÁB
+ mob.h C³B
+ mob.c
+ mob_exclusion_add() ’ljÁB
+ mob_exclusion_check() ’ljÁB
+ mob_timer_delete() ’ljÁB
+ mob_attack() C³B
+ mob_target() C³B
+ mob_ai_sub_hard_activesearch() C³B
+ mob_ai_sub_hard_mastersearch() C³B
+ mob_ai_sub_hard() C³B
+ skill.c
+ skill_castend_damage_id() C³B
+ skill_castend_pos2() C³B
+
+--------------------
+//0847 by Ž€_
+
+E˜I“XƒoƒOC³B
+ (map/)
+ clif.c
+ clif_vendinglist()Aclif_openvending() C³B
+ vending.c
+ vending_openvending() C³B
+ skill.c
+ skill_castend_nodamage_id() C³B
+
+--------------------
+//0846 by Ž€_
+
+EƒoƒOC³‚Æׂ©‚¢C³B
+Ebattle_athena.conf‚Ìenemy_str‚ªƒyƒbƒg‚É‚à“K—p‚·‚é‚悤‚É•ÏXB
+EbHPDrainRate‚ÆbSPDrainRate‚Åx‚ªƒ}ƒCƒiƒX‚Å‚àì“®‚·‚é‚悤‚É•ÏXB
+EPC‚âNPC‚ÌŽp‚ð‚µ‚½ƒ‚ƒ“ƒXƒ^[‚àŽ€‚Ê‚Æ5•bŒãƒ}ƒbƒv‚©‚çÁ‚¦‚é‚悤‚É•ÏXB
+ (map/)
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_weapon_attack() C³B
+ skill.c
+ skill_attack()Askill_castend_damage_id() C³B
+ pc.c
+ pc_allskillup() C³B
+ clif.h C³B
+ clif.c
+ clif_openvending()Ado_init_clif() C³B
+ clif_clearchar_delay()Aclif_clearchar_delay_sub() ’ljÁB
+ mob.c
+ mob_damage() C³B
+
+--------------------
+//0845 by ‚Û‚Û‚Û
+
+Emob_avail.txt‚ÅPCƒOƒ‰ƒtƒBƒbƒN(0`23)‚ðŽw’肵‚½ƒyƒbƒg‚ªoŒ»‚µ‚½‚Æ‚«ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ª‚Å‚é‚Ì‚ðŽb’èC³B
+Emob_avail.txt‚Ńyƒbƒg‚É‚àPCƒLƒƒƒ‰‚Ì«•ÊE”¯Œ^&FE•ŠíE‚E“ª‘•”õ‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
+EMOB‚ÌATKŒvŽZ‚ÉSTR‚ð“K—p‚·‚é‚©‚Ç‚¤‚©Ý’è‰Â”\‚É‚µ‚½B
+ (map/)
+ clif.c
+ clif_pet0078()Aclif_pet007b()Aclif_spawnpet()C³B
+ battle.hC³B
+ battle.c
+ battle_config_read()Abattle_calc_mob_weapon_attack()C³B
+
+--------------------
+//0844 by ‚Û‚Û‚Û
+
+Emob_avail.txt‚ÅPCƒOƒ‰ƒtƒBƒbƒN(0`23)‚ðŽw’肵‚½MOB‚ªoŒ»‚µ‚½‚Æ‚«ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ª‚Å‚é‚Ì‚ðŽb’èC³B
+Emob_avail.txt‚ÅPCƒLƒƒƒ‰‚Ì«•ÊE”¯Œ^&FE•ŠíE‚E“ª‘•”õ‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
+@ƒOƒ‰ƒtƒBƒbƒN‚·‚è‘Ö‚¦æID‚ª0`23‚ÌŽž‚¾‚¯—LŒø‚ÅAŽw’è•û–@‚Í
+ MOB-ID,ƒOƒ‰ƒtƒBƒbƒN‚·‚è‘Ö‚¦æID,«•Ê(0=female,1=male),”¯Œ^,”¯F,•Ší,‚,ã’i“ª‘•”õ,’†’i“ª‘•”õ,‰º’i“ª‘•”õ
+@‚Æ‚È‚è‚Ü‚·B‘•”õ‚Íitem_db‚ÌView—“ŽQÆ‚Ì‚±‚ÆB
+ (map/)
+ clif.c
+ clif_mob_0078()Aclif_mob007b()Aclif_spawnmob()C³B
+ mob.hC³B
+ mob.c
+ mob_get_sex()Amob_get_hair()Amob_get_hair_color()Aob_get_weapon()A
+ mob_get_shield()Amob_get_head_top()Amob_get_head_mid()Amob_get_head_buttom()’ljÁB
+ mob_readdb()Amob_readdb_mobavail()C³B
+
+--------------------
+//0843 by Ž€_
+
+EƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒhŽÀ‘•B
+EƒAƒCƒeƒ€ƒXƒNƒŠƒvƒg‚ÉbShortWeaponDamageReturn‚Æ
+bLongWeaponDamageReturn ’ljÁB
+E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚⑼‚ÌŠC³B
+ (db/)
+ item_db.txt C³B
+ skill_db.txt C³B
+ cast_db.txt C³B
+ const.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ (map/)
+ map.h C³B
+ battle.c
+ battle_get_def()Abattle_get_def2()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack()Abattle_calc_magic_attack() C³B
+ pc.c
+ pc_calcstatus()Apc_bonus()Apc_bonus2()Apc_equipitem() C³B
+ pc_unequipitem()Apc_checkallowskill() C³B
+ skill.c
+ skill_attack()Askill_unit_onplace()Askill_status_change_start() C³B
+ skill_status_change_end()Askill_status_change_timer() C³B
+ skill_castend_nodamage_id() C³B
+ clif.c
+ clif_additem()Aclif_equiplist()Aclif_storageequiplist() C³B
+ clif_tradeadditem()Aclif_storageitemadded()Aclif_cart_additem() C³B
+ clif_cart_equiplist()Aclif_vendinglist()Aclif_openvending() C³B
+ clif_damage()Aclif_skill_damage()Aclif_parse_LoadEndAck() C³B
+
+--------------------
+//0842 by Ž€_
+
+EƒXƒLƒ‹ŠÖŒW‚ÌC³‚Æׂ©‚¢C³B
+EaegisŽI‚ÅFX‚ÆŒŸØ‚µ‚½•¨‚ð“K—pB
+EƒƒeƒI‚͈̔͂ð7*7ALoV13*13ASG11*11AFN5*5‚ÉC³B
+EƒVƒOƒiƒ€ŽÀ‘•B(‚½‚¾PVP‚ŃvƒŒƒCƒ„[‚É‚©‚©‚é‚©‚Ç‚¤‚©‚ª‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å
+‚©‚©‚é•ûŒü‚ÅŽÀ‘•B)‚±‚ê‚Å1ŽŸE‹Æ‚̃XƒLƒ‹‚̓NƒŠƒA‚©‚à...
+E‘•”õƒXƒNƒŠƒvƒg‚ÉbHPDrainRate‚ÆbSPDrainRate’ljÁB
+E‚»‚Ì‘¼×‚©‚¢C³­‚µB
+ (doc/)
+ item_bonus.txt C³B
+ (db/)
+ cast_db.txt C³B
+ item_db.txt C³B
+ const.txt C³B
+ (map/)
+ map.h C³B
+ skill.c
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ skill_unitsetting()Askill_castend_pos2()Askill_castend_id() C³B
+ skill_status_change_start()Askill_status_change_timer() C³B
+ skill_status_change_end()Askill_unit_onplace() C³B
+ skill_frostjoke_scream()Askill_attack() C³B
+ skill_attack_area() ’ljÁB
+ battle.c
+ battle_calc_magic_attack()Abattle_get_element()Abattle_get_def() C³B
+ battle_get_def2()Abattle_get_mdef()Abattle_damage() C³B
+ battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack() C³B
+ mob.c
+ mobskill_castend_id() C³B
+ pc.c
+ pc_calcstatus()Apc_bonus2()Apc_attack_timer() C³B
+ clif.c
+ clif_spawnmob()Aclif_spawnpet()Aclif_spawnnpc() C³B
+ clif_parse_ActionRequest() C³B
+
+--------------------
+//0841 by Kalen
+
+E…—n‰t‚ªì‚ê‚È‚©‚Á‚½‚̂ŒljÁ
+ conf/npc/npc_job_magician.txt
+
+--------------------
+//0840 by Kalen
+
+E‹SƒCƒxƒ“ƒg’ljÁ
+ conf/npc/npc_event_oni.txt
+
+Emap_athena.confC³(ƒoƒŒƒ“ƒ^ƒCƒ“ƒRƒƒ“ƒgƒAƒEƒgB‹S’ljÁ)
+ conf/map_athena.conf
+
+--------------------
+//0839 by shuto
+
+EƒRƒ“ƒƒ“NPC’ljÁ(ƒJƒ“ ƒ\ƒ“ƒ\ƒ“‚ª”²‚¯‚Ä‚½)
+
+--------------------
+//0838 by Ž€_
+
+EƒXƒLƒ‹ƒTƒCƒgƒ‰ƒbƒVƒƒ[ŽÀ‘•B
+Eƒ‚ƒ“ƒXƒ^[‚̃Nƒ[ƒLƒ“ƒO‚ƃ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ÍŽ‘±ŽžŠÔ‚ðƒŒƒxƒ‹*5•b‚É•ÏXB
+E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
+ (db/)
+ skill_db.txt C³B
+ (map/)
+ skill.c
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ skill_castend_pos2()Askill_unitsetting()Askill_get_unit_id() C³B
+ skill_status_change_start() C³B
+ battle.c
+ battle_calc_magic_attack() C³B
+
+--------------------
+//0837 by Ž€_
+
+EƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
+EƒtƒƒXƒgƒmƒ”ƒ@‚ðƒ†ƒjƒbƒgÝ’uŽ®‚É•ÏXB
+Eƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“‚͈̔͂ð11*11‚ÉC³‚Æ40ƒqƒbƒg‚·‚é‚悤‚É•ÏXB(ƒ‰ƒOƒiƒQ[ƒg‚Ìî•ñB
+13*13à‚à‚ ‚è‚Ü‚·‚ª...)
+Eƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[‚̃mƒbƒNƒoƒbƒN‚ð2~7‚É•ÏXB
+EƒXƒg[ƒ€ƒKƒXƒg‚ÌUŒ‚‰ñ”‚ðƒŒƒxƒ‹ˆË‘¶‚©‚ç10‰ñ‚ɌŒèB
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚̃mƒbƒNƒoƒbƒN‚ð3‚©‚ç2‚É•ÏXB(aegisŽI‚ŃmƒbƒNƒoƒbƒN‚ª‚ ‚邱‚Æ‚ÍŠm”F‚µ‚Ü‚µ‚½‚ª‚Ç‚ê‚®‚ç‚¢‚È‚Ì‚©‚ª•s–¾‚¾‚Á‚½‚Ì‚Å­‚µŒ¸‚炵‚Ä‚Ý‚Ü‚µ‚½B)
+Eƒ‚ƒ“ƒXƒ^[‚̉r¥ŽžŠÔ‚ª‘‚­‚È‚Á‚Ä‚¢‚½–â‘èC³B(dex•â³‚ª“ü‚Á‚Ä‚µ‚Ü‚Á‚½‚¹‚¢‚Å‚·B)
+E‚»‚Ì‘¼ƒI[ƒgƒXƒyƒ‹“–‚½‚è‚Ìׂ©‚¢C³B
+ (db/)
+ skill_db.txt C³B
+ (map/)
+ skill.c
+ skill_castfix()Askill_delayfix()Askill_timerskill() C³B
+ skill_castend_pos2()Askill_unitsetting()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_get_unit_id()Askill_attack() C³B
+ battle.c
+ battle_calc_magic_attack()Abattle_weapon_attack() C³B
+
+--------------------
+//0836 by Žß‘¸
+
+Eƒ‚ƒ“ƒXƒ^[‚ÌŽæ‚芪‚«¢ŠÒ‚ÌŠÔŠu‚𒆃{ƒXˆÈŠOŠ®‘SC³B
+ (db/)
+ mob_skill_db.txt C³B
+
+--------------------
+//0835 by (“Ê)
+
+E”’nŽæ‚è‚Ń|[ƒY‚ð‚Æ‚é‚悤‚É‚µ‚½B
+(ƒ|[ƒY‚¾‚¯‚È‚Ì‚ÅAŽÀÛ‚ÉUŒ‚‚ðŽó‚¯Ž~‚ß‚½‚è‚Í‚Å‚«‚Ü‚¹‚ñ)
+clif_bladestop()‚ðŒÄ‚Ô‚±‚Æ‚Å”’nŽæ‚èó‘Ô‚ÌONAOFF‚̃pƒPƒbƒg‚ª‘—‚ê‚Ü‚·B
+
+ (map/)
+ clif.h C³B
+ clif,c
+ clif_bladestop() ’ljÁ
+ skill.c
+ skill_castend_nodamage_id() C³B
+
+--------------------
+//0834 by Žß‘¸
+
+Eƒ‚ƒ“ƒXƒ^[Žæ‚芪‚«¢ŠÒ‚ÌŠÔŠu‚ª’Z‚·‚¬‚é‚Æ‚ÌŽ–‚ʼnž‹}ˆ’uB(¡‰ñ‚͉©‹à峂̂Ý)
+ (db/)
+ mob_skill_db.txt C³B
+
+--------------------
+//0833 by (“Ê)
+
+Ememo‹ÖŽ~’nˆæ‚Å/memoŽž‚ÌC³B
+E‚‚¢‚Å‚Éitem_db‚ðXVB
+
+ (doc/)
+ client_packet.txt
+ R 0189 XVB
+ (db/)
+ item_db.txt ÅV”Å‚ÖXVB
+ (map/)
+ pc.c
+ pc_memo() C³B
+
+--------------------
+//0832 by Ž€_
+
+EƒR[ƒhÅ“K‰»‚Æׂ©‚¢C³B
+EƒI[ƒgƒXƒyƒ‹‚ð’n–Ê–‚–@‚ɑΉžB
+EƒTƒ“ƒ_[ƒXƒg[ƒ€‚ƃwƒ”ƒ“ƒYƒhƒ‰ƒCƒu‚ðƒ†ƒjƒbƒgÝ’uŽ®‚É•ÏXB
+EƒfƒBƒtƒFƒ“ƒ_[‚ÌUŒ‚‘¬“x’ቺ‚ð–{ŽI‚É‚ ‚킹B
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (doc/)
+ item_bonus.txt C³B
+ (db/)
+ skill_require_db.txt C³B
+ cast_db.txt C³B
+ (map/)
+ map.h C³B
+ path.c
+ calc_index()Apath_search() C³B
+ skill.c
+ skill_unitsetting()Askill_castend_pos2()Askill_get_unit_id() C³B
+ skill_status_change_timer_sub()Askill_castend_nodamage_id() C³B
+ skill_additional_effect()Askill_frostjoke_scream() C³B
+ pc.c
+ pc_calcstatus()Apc_skill()Apc_allskillup() C³B
+ battle.c
+ battle_get_speed()Abattle_get_adelay()Abattle_get_amotion() C³B
+ battle_weapon_attack() C³B
+
+--------------------
+//0831 by Ž€_
+
+E­‚µC³B
+EƒI[ƒgƒXƒyƒ‹C³B‘•”õ‚É‚æ‚镨‚ƃXƒLƒ‹‚É‚æ‚镨‚ð•ÊX‚É“K—pA”­“®Šm—¦C³B
+E‘•”õ‚É‚æ‚éƒI[ƒgƒXƒyƒ‹‚ÍŽw’肵‚½ƒŒƒxƒ‹‚æ‚è2‚‰º‚Ü‚Å”»’è‚ð‚µ‚Ü‚·B‚‚܂背ƒxƒ‹5‚ðÝ’è‚·‚é‚ƃŒƒxƒ‹3‚©‚ç5‚Ü‚Å”­“®‚µ‚Ü‚·B
+Ebattle_athana.conf‚Ìplayer_cloak_check_wallAmonster_cloak_check_wall‚ðplayer_cloak_check_typeAmonster_cloak_check_type‚É•ÏXB
+EƒAƒCƒeƒ€ƒ‹[ƒgŒ ŒÀŽžŠÔ‚ð–{ŽI‚ɇ‚킹‚ÄC³B
+E‚»‚Ì‘¼ƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³B
+ (doc/)
+ conf_ref.txt C³B
+ db_ref.txt C³B
+ item_bonus.txt C³B
+ (conf/)
+ battle_athana.conf C³B
+ (db/)
+ item_db.txt C³B
+ (map/)
+ map.h
+ map.c
+ block_free_maxABL_LIST_MAX C³B
+ skill.h C³B
+ skill.c
+ skill_additional_effect()Askill_attack()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_unit_onplace() C³B
+ skill_status_change_end()Askill_status_change_start() C³B
+ skill_initunitgroup()Askill_unitsetting()Askill_castfix() C³B
+ skill_delayfix()Askill_autospell()Askill_use_id()Askill_use_pos() C³B
+ skill_check_cloaking()Askill_unit_timer_sub()Askill_check_condition() C³B
+ battle.h C³B
+ battle.c
+ battle_damage()Abattle_get_agi()Abattle_get_speed() C³B
+ battle_get_adelay()Abattle_get_amotion()Abattle_get_flee() C³B
+ battle_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_config_read() C³B
+ mob.c
+ mob_attack()Amob_damage()Amobskill_use_id() C³B
+ mobskill_use_pos()Amob_spawn()Amob_class_change() C³B
+ mob_can_move() C³B
+ pc.c
+ pc_attack_timer()Apc_checkweighticon()Apc_calcstatus() C³B
+ pc_damage()Apc_equipitem()Apc_unequipitem() C³B
+ pc_bonus2()Apc_bonus3()Apc_memo()Apc_authok() C³B
+ pc_isUseitem() C³B
+ clif.h C³B
+ clif.c
+ clif_changeoption()Aclif_parse_LoadEndAck()Aclif_autospell() C³B
+ clif_skill_memo() C³B
+ clif_skill_teleportmessage() ’ljÁB
+ script.c
+ buildin_sc_start() C³B
+ atcommnad.c
+ atcommand() C³B
+
+--------------------
+//0830 by huge
+
+EƒI[ƒgƒXƒyƒ‹‚ÅAŽ©•ª‚ÌK“¾‚µ‚Ă郌ƒxƒ‹‚æ‚è‚à‚‚¢ƒŒƒxƒ‹‚Å
+ –‚–@‚ª”­“®‚µ‚Ä‚¢‚½‚Å‚ ‚낤–â‘è‚ðC³B
+EƒI[ƒgƒXƒyƒ‹‚Å‚àA‚¿‚á‚ñ‚ÆSP‚ªŒ¸‚é‚悤‚ÉC³(‚Ç–Y‚ê)
+ (map/)
+ battle.c
+ battle_weapon_attack() C³B
+ skill.c
+ skill_autospell() C³B
+
+--------------------
+//0829 by Kalen
+
+Emob_dbC³
+ Ž©ŽI—p‚Ì‚ÆŠÔˆá‚Á‚ÄUP‚µ‚Ä‚µ‚Ü‚Á‚½‚悤‚Å‚·B
+ –{—ˆ‚Ì‚à‚Ì‚É’¼‚µ‚Ü‚µ‚½B
+
+--------------------
+//0828 by ¹
+
+EƒT[ƒo‚ÌSnapshot
+EMVPƒ{ƒXŒn‚©‚çƒoƒJƒ“ƒXƒ`ƒPƒbƒg‚ª‘å—Ê‚Éo‚Ä‚¢‚½–â‘è‚ðC³B
+ (common/)
+ version.h C³B
+ (db/)
+ mob_db.txt C³B
+
+--------------------
+//0827 by J
+
+EŒÅ’èMOB‚Ì‚Í‚¸‚̃ƒKƒŠƒX‚Æl–Ê“Ž÷‚ª•à‚¢‚Ä‚¢‚½‚Ì‚ðC³B
+E“¬‹Zê‚ÌMOB‚ɃXƒLƒ‹‚ðŽÀ‘•B
+EƒpƒTƒi‚ƃtƒ@ƒ‰ƒI‚ªƒXƒLƒ‹‚ªÝ’肳‚ê‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðŽÀ‘•B
+ (db/)
+ mob_db.txt C³B
+ mob_skill_db.txt C³B
+
+--------------------
+//0826 by ‚Ò‚´‚Ü‚ñ
+
+Eˆê•”‚̉‰‘tƒXƒLƒ‹‚ðŽg‚¤‚ÆŽI‚ª—Ž‚¿‚éƒoƒOC³B
+EƒNƒ[ƒLƒ“ƒO’†‚ɃXƒLƒ‹‚ðŽg—p‚Å‚«A
+@Žg—p‚·‚é‚ƃNƒ[ƒLƒ“ƒO‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
+EKalen‚³‚ñ‚Ìmob_db.txt‚ð‚Ü‚Æ‚ß‚Ü‚µ‚½B
+ (map/)
+ skill.c
+ skill_unit_onplace()Askill_unit_onout() C³B
+ skill_status_change_start()Askill_status_change_timer() C³B
+ skill_use_id()Askill_use_pos() C³B
+ (db/)
+ mob_db.txt C³B
+
+--------------------
+//0825 by Ž€_
+
+Eׂ©‚¢C³B(ׂ©‚¢‚±‚Æ‚Ì‚í‚è‚É‚ÍC³‚µ‚½Š‚ª‘½‚¢‚¯‚Ç...)
+Eƒ[ƒvƒ|[ƒ^ƒ‹‚Ì’†‚ÉŽ~‚Ü‚Á‚½ŽžˆÈŠO‚̓[ƒv‚µ‚È‚¢‚悤‚ÉC³B
+Ebattle_athena.conf‚Éplayer_skill_nofootsetAmonster_skill_nofootset ’ljÁB
+ENPC‚ðƒNƒŠƒbƒN‚µ‚½Œã˜I“X‚ðƒNƒŠƒbƒN‚µ‚ĘI“X‚ð•Â‚¶‚é‚Æ“®‚¯‚È‚­‚È‚éƒoƒOC³B
+‚½‚¾˜I“X‚ð•Â‚¶‚鎞‰½‚̃pƒPƒbƒg‚à“]‘—‚µ‚Ä‚±‚È‚¢‚̂ŘI“X‚ðƒNƒŠƒbƒN‚·‚é‚ÆNPC‚̈—‚©‚甲‚¯‚é‚悤‚É‚µ‚Ü‚µ‚½B(–{ŽI‚Å‚ÍNPC‚̈—‚ª”²‚¯‚È‚¢‚炵‚¢‚Å‚·‚ª‚»‚êˆÈŠO•û–@‚ª‚È‚©‚Á‚½‚Ì‚Á‚ÅB)
+Ekillmonster‚ÌAll‚Å¢Š«‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚¾‚¯Á‚·‚悤‚É•ÏXB
+Eƒ\[ƒXÅ“K‰»‚âƒXƒLƒ‹ŠÖŒW‚Ìׂ©‚¢C³‘½”B
+ (doc/)
+ conf_ref.txt C³B
+ db_ref.txt C³B
+ (conf/)
+ battle_athana.conf C³B
+ atcommnad_athena.conf C³B
+ (db/)
+ item_db.txt C³B
+ skill_db.txt C³B
+ (login/)
+ parse_fromchar() C³B
+ (map/)
+ map.h C³B
+ clif.c
+ clif_closevendingboard()Aclif_parse_VendingListReq() C³B
+ clif_mob0078()Aclif_mob007b()Aclif_pet0078()Aclif_pet007b() C³B
+ skill.h C³B
+ skill.c
+ skill_check_condition()Askill_castend_pos2() C³B
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ skill_castend_id()Askill_status_change_start()Askill_castfix() C³B
+ skill_delayfix()Askill_check_unit_range_sub() C³B
+ skill_check_unit_range()Askill_castend_pos()Askill_stop_dancing() C³B
+ skill_unit_onplace()Askill_readdb()Askill_timerskill()Askill_blown() C³B
+ skill_check_unit_range2_sub()Askill_check_unit_range2() ’ljÁB
+ skill_get_maxcount() ’ljÁB
+ mob.c
+ mobskill_castend_id()Amobskill_castend_pos()Amob_deleteslave() C³B
+ mob_stop_walking()Amob_walk()Amob_damage() C³B
+ pc.c
+ pc_calcstatus()Apc_checkskill()Apc_stop_walking() C³B
+ pc_walk()Apc_damage() C³B
+ npc.c
+ npc_touch_areanpc() C³B
+ pet.c
+ pet_stop_walking() C³B
+ script.c
+ buildin_killmonster()Abuildin_killmonster_sub() C³B
+ battle.h
+ battle.c
+ battle_calc_magic_attack()Abattle_get_flee()Abattle_get_flee2() C³B
+ battle_get_adelay()Abattle_get_amotion()Abattle_get_max_hp() C³B
+ battle_get_hit()Abattle_get_critical()Abattle_get_atk2() C³B
+ battle_damage()Abattle_config_read() C³B
+ atcommand.h C³B
+ atcommand.c C³B
+
+--------------------
+//0824 by ‚Ò‚´‚Ü‚ñ
+
+EƒZƒCƒtƒeƒBƒEƒH[ƒ‹Eƒjƒ…[ƒ}‚Ì‘«Œ³’u‚«‚ª‚Å‚«‚È‚©‚Á‚½–â‘èC³B
+EƒGƒ“ƒyƒŠƒEƒ€‚Ƀq[ƒ‹“™‚ÌŽx‰‡ƒXƒLƒ‹‚ªŒø‚¢‚Ä‚¢‚½–â‘èC³B
+E“¬‹Zê‚Ń‚ƒ“ƒXƒ^[ƒŠƒZƒbƒg‚ª‚Å‚«‚È‚©‚Á‚½–â‘èC³B
+@killmonster‚Í"killmonster <mapname>,<eventname>"‚Æ‹Lq‚µ‚Ä
+@ŠY“–eventname‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð휂µ‚Ü‚·‚ª
+@eventname‚ÉAll‚Æ“ü‚ê‚é‚ÆŠY“–MAP‚Ì‘Sƒ‚ƒ“ƒXƒ^[‚ðÁ‹Ž‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
+
+ (map/)
+ skill.c
+ skill_check_unit_range_sub()Askill_castend_nodamage_id() C³B
+ script.c
+ buildin_killmonster()Abuildin_killmonster_sub() C³B
+ (conf/npc/)
+ npc_event_tougijou.txt C³B
+
+--------------------
+//0823 by Kalen
+
+E“¬‹Zêƒf[ƒ^‘µ‚Á‚½‚Ì‚ÅAŠ®¬
+ conf/npc/npc_event_tougijou.txt
+ ‚½‚¾‚µA‚±‚¿‚ç‚Ń`ƒFƒbƒN‚µ‚½‚Æ‚±‚ëkillmonster‚ª‚¤‚Ü‚­‚¢‚©‚¸A
+ Ž¸”sAŽžŠÔ؂ꂵ‚½ê‡ƒ‚ƒ“ƒXƒ^[ƒŠƒZƒbƒg‚ªo—ˆ‚Ü‚¹‚ñB
+ ƒCƒxƒ“ƒg‚ªÝ’肳‚ê‚Ä‚¢‚郂ƒ“ƒXƒ^[‚͈—‚Å‚«‚È‚¢‚Ì‚©‚ÆŽv‚¢‚Ü‚µ‚½‚ª
+ Agit‚Ì‚Ù‚¤‚̃Gƒ“ƒy‚ÌKillmonster‚Í‚¿‚á‚ñ‚Æ“®‚¢‚Ä‚Ü‚·‚µc
+ Œ´ˆö•ª‚©‚é•û‚¨Šè‚¢‚µ‚Ü‚·<(_ _)>
+
+Egon_test‚Ìmapflag’ljÁ
+ conf/mapflag.txt
+
+Emob_dbXV
+ 1419`1491‚ªŠù‘¶‚ÌMob‚Ì’è‹`‚΂©‚è‚Ȃ̂ŒljÁ‚µ‚Ü‚¹‚ñ‚Å‚µ‚½‚ªA
+ ’²‚ׂ½Š“¬‹Zê‚ÌMob‚̃f[ƒ^‚Å‚ ‚邱‚Æ‚ª•ª‚©‚è‚Ü‚µ‚½(Drop‚ð˜M‚Á‚½‚à‚Ì)
+ –{ŽI‚ł͈łè‚ñ‚²‚ª•ñ‚³‚ê‚Ä‚¢‚Ü‚·B‚ªA‚±‚¿‚ç‚ÍDrop‹ó”’‚ň—‚µ‚Ü‚µ‚½B
+ ƒNƒ‰ƒCƒAƒ“ƒgã‚Å‚Í“¯–¼‚Å‚µ‚½‚ªA‹æ•Ê‚Ì‚½‚ßÚ“ª‚ÉG_‚ð‚‚¯‚Ä‹æ•Ê‚µ‚Ä‚Ü‚·B
+ mob_skill_db‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½«
+
+--------------------
+//0822 by ‚Ò‚´‚Ü‚ñ
+
+E‰‰‘tƒXƒLƒ‹‚ł̕Ⳃðƒ_ƒ“ƒT[‚É‚à“K—pB
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠƒoƒOC³B
+EKalen‚³‚ñ‚ÌMOBƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ð‚Ü‚Æ‚ß‚Æ‚«‚Ü‚µ‚½B
+
+ (map/)
+ skill.c
+ skill_status_change_start()Askill_unit_onplace() C³B
+ battle.c
+ battle_get_critical()Abattle_get_hit() C³B
+ pc.c
+ pc_calcstatus() C³B
+
+--------------------
+//0821 by huge
+
+EƒI[ƒgƒXƒyƒ‹‰¼ŽÀ‘•B
+Etimer‚Å”»’肵‚悤‚©‚Æ‚àŽv‚¢‚Ü‚µ‚½‚ªA‘•”õ‚Ì–³ŒÀƒI[ƒgƒXƒyƒ‹‚ׂ̈Ésc_[].val1‚ÅŒ©‚ă}ƒXB
+Ebonus2 bAutoSpell’ljÁBˆê‰ž‚Ç‚ñ‚ȃXƒLƒ‹‚Å‚àŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ä‚Ü‚·‚ª(”Ô†‚Ískill_treeŽQÆ)
+ skill_castend_damage_id‚̃^ƒCƒvˆÈŠO‚̃XƒLƒ‹‚ðŽw’肵‚È‚¢‚Å‚­‚¾‚³‚¢B
+ ”­“®Šm—¦‚ÍALv1:50%ALv2:35%ALv3:15%A‚»‚êˆÈã‚Í 5%ŒÅ’è‚Å‚·B
+ ‚ ‚ÆAƒXƒLƒ‹ƒŒƒxƒ‹‚àŽw’è‚Å‚«‚Ü‚·‚ªAŒÀŠE‚ð’´‚¦‚½”Žš‚ð“ü‚ê‚é‚Æ’Ä‚¿‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+¡‘‚«•û—áFiƒtƒ@ƒCƒAƒ{ƒ‹ƒgLv3‚ÌŽžjbonus2 bAutoSpell 19,3;
+
+ (db/)
+ const.txt C³B
+ (map/)
+ battle.c
+ battle_weapon_attack() C³B
+ clif.h
+ clif.c
+ packet_len_table C³B
+ clif_autospell() ’ljÁB
+ clif_parse_AutoSpell() ’ljÁB
+ map.h C³B
+ pc.c
+ pc_bonus2() C³B
+ pc_equipitem() C³B
+ pc_unequipitem() C³B
+ skill.h
+ skill.c
+ skill_castend_nodamage_id() C³B
+ skill_autospell() ’ljÁB
+ skill_status_change_end() C³B
+ skill_status_change_start() C³B
+ status_change‚̔Ԇƒe[ƒuƒ‹C³B
+
+--------------------
+//0820 by ‚Ò‚´‚Ü‚ñ
+
+EƒAƒhƒŠƒu‚̃ƒbƒZ[ƒW‚ª“ü‚Á‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³
+Eƒo[ƒh‚̉‰‘tƒXƒLƒ‹‚ÅŠyŠí‚Ì—ûK‚⎩ƒXƒe[ƒ^ƒX‚̕Ⳃª“ü‚Á‚Ä‚È‚©‚Á‚½‚Ì‚ðC³B
+@struct status_change‚Ìval‚ª3‚•K—v‚¾‚Á‚½‚Ì‚Å(val4‚Í—\–ñ‚³‚ê‚Ä‚½‚Á‚Û‚¢‚Ì‚Å)val5‚ð’ljÁ‚µ‚Ü‚µ‚½
+ (map/)
+ map.h C³B
+ skill.c
+ skill_status_change_start()Askill_castend_nodamage_id() C³B
+ skill_castfix()Askill_delayfix() C³B
+ battle.c
+ battle_get_flee()Abattle_get_max_hp() C³B
+ battle_get_adelay()Abattle_get_amotion() C³B
+ battle_calc_misc_attack() C³B
+ pc.c
+ pc_calcstatus() C³B
+
+--------------------
+//0819 by Kalen
+
+EƒRƒ“ƒƒ“(NPCAWarp)C³
+ conf/npc/npc_town_gonryun.txt(ˆÄ“àˆõ•â[)
+ conf/npc/npc_event_tougijou.txt
+ conf/warp/npc_warp_gonryun.txt(h2F‚ÆD2F‚È‚Ç)
+
+EMOBC³
+ conf/mob/npc_monster30.txt(ˆê”½–Ø–È•s‘«’ljÁ)
+ conf/mob/npc_monster35.txt(ƒRƒ“ƒƒ“Mob’ljÁ)
+
+EDBC³
+ db/mob_db.txt(ƒRƒ“ƒƒ“[‘S‚Ä]+ƒEƒ“ƒoƒ‰[’è‹`]’ljÁBAspeed“™“K“–‚Å‚·B‚Ü‚Ÿ–³‚¢‚æ‚è‚Ü‚µ‚Æ‚¢‚¤‚±‚Æ‚Å)
+ db/mob_skill_db.txt(î•ñ‚ðŒ³‚ÉƒRƒ“ƒƒ“‚ÌMob•ª’ljÁ)
+ db/item_db.txt(Athena DB Project 2/19 21:10DL•ª)
+
+--------------------
+//0818 by ‚ ‚ä‚Ý
+
+EƒeƒŒƒ|[ƒgƒXƒLƒ‹Lv1‚ÅA‘I‘ðƒEƒCƒ“ƒhƒE‚ªo‚Ä‚±‚È‚¢ƒoƒO‚ðC³B
+Ed—Ê‚ª90“ˆÈã‚ÌꇂłàAˆê•”‚̃XƒLƒ‹‚ªŽg—p‰Â”\‚¾‚Á‚½ƒoƒO‚ðC³B
+E@allskillƒRƒ}ƒ“ƒh‚ÌC³‚Æ‚©B
+
+ (conf/)
+ msg_athena.conf C³B
+ (map/)
+ atcommand.c
+ atcommand() C³B
+ pc.c
+ pc_allskillup() C³B
+ skill.c
+ skill_castend_nodamage_id() C³B
+ skill_check_condition() C³B
+
+--------------------
+//0817 by huge
+
+EƒfƒBƒ{[ƒVƒ‡ƒ“‚̈—C³
+ EŽ…‚Ìo‚µ•û‚̓pƒP‚ð–á‚Á‚½‚Ì‚Å‚Å‚«‚Ü‚µ‚½‚ªAƒAƒCƒRƒ“‚Ì•û‚Í‚Ü‚¾•ª‚©‚ç‚È‚¢‚Å‚·B
+ E‚ ‚ÆAŽ©•ª‚̊‹«‚Å2lˆÈã‚É“¯Žž‚ÉŠ|‚¯‚ê‚È‚©‚Á‚½‚Ì‚ÅA•¡”l‚É‚©‚¯‚½ê‡
+ ‘½•ª0‚Ì—…—ñ‚ÌŠ‚É2l–ÚA3l–ÚEEE‚ÌID‚ª“ü‚é‚ñ‚¶‚á‚È‚¢‚©‚È‚Ÿ‚Æ‚¢‚¤—\‘ª‚Å‚â‚Á‚Ä‚Ü‚·B
+EƒnƒCƒfƒBƒ“ƒO’†A‹y‚уNƒ[ƒLƒ“ƒO’†‚Ƀ_ƒ[ƒW‚ðŽó‚¯‚é‚Æ‰ð‚¯‚é‚悤C³B
+
+ (map/)
+ battle.c
+ battle_damage() C³B
+ clif.c
+ clif_devotion() C³B
+ pc.c
+ pc_walk() C³B
+ skill.c
+ skill.h
+ skill_castend_nodamage_id() C³B
+ skill_devotion() skill_devotion2() C³B
+ skill_devotion3()skill_devotion_end() C³B
+
+--------------------
+//0816 by ‚Ò‚´‚Ü‚ñ
+Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹3–‡§ŒÀŽÀ‘•B
+Ed‚Ë’u‚«‹ÖŽ~‚ðƒvƒŒƒCƒ„[Eƒ‚ƒ“ƒXƒ^[‚É‚à“K—p‚·‚é‚悤‚ÉC³B
+EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€‚ÌPvPEGvG‚ÅAŒø‰Ê‚ªŽ©•ª‚É‚à‹y‚ÔƒoƒOC³B
+@‚‚¢‚Å‚ÉPTƒƒ“ƒo[‚É‚Í’áŠm—¦‚Å‚©‚©‚é‚Ì‚àŽÀ‘•B
+EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€EƒXƒsƒAƒu[ƒƒ‰ƒ“‚̃fƒBƒŒƒCC³B
+@ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒNE–‚¿‚̉r¥ŽžŠÔC³B
+ (map/)
+ skill.c
+ skill_check_condition()Askill_check_unit_range_sub() C³B
+ skill_check_unit_range()Askill_delunitgroup() C³B
+ skill_castend_pos2()Askill_frostjoke_scream() C³B
+ map.h C³B
+ (db/)
+ cast_db.txt C³B
+
+--------------------
+//0815 by Ž€_
+
+E0814‚̃oƒOC³‚Æׂ©‚¢C³B
+Emapflag monster_noteleportAnoreturn’ljÁ‚Ænoteleport‚ÌŽd—l•ÏXB
+noteleport‚̓vƒŒƒCƒ„[‚̃nƒG‚ƃeƒŒƒ|[ƒgAƒ[ƒvƒXƒLƒ‹‚̧ŒÀ‚ð‚·‚é‚ª’±‚ͧŒÀ‚µ‚È‚¢‚悤‚É•ÏXAmonster_noteleport‚̓‚ƒ“ƒXƒ^[‚̃eƒŒƒ|[ƒg‚ð§ŒÀ‚·‚镨‚Ånoreturn‚Í’±‚ÌŽg—p‚ð§ŒÀ‚·‚镨‚Å‚·B‚½‚¾mapflag.txt‚ÍC³‚µ‚Ä‚¢‚Ü‚¹‚ñB(noreturn‚ðÝ’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B)
+Ebattle_athena.conf‚Ìplayer_auto_counter_type‚Æmonster_auto_counter_type‚ªà–¾’Ê‚è‚É‹@”\‚µ‚È‚©‚Á‚½–â‘èC³B
+Ebattle_athena.conf‚Éplayer_cloak_check_wall ‚Æmonster_cloak_check_wall ’ljÁB
+Eƒ{ƒXƒ‚ƒ“ƒXƒ^[‚Ì”FŽ¯‚ðMVPŒoŒ±‚Æmode‚Ì0x20‚Ås‚È‚Á‚Ä‚¢‚½•¨‚ðmode‚¾‚¯‚É‚·‚é‚悤‚É•ÏXB(–{ŽI‚̃Cƒxƒ“ƒgƒ‚ƒ“ƒXƒ^[‚ÅMVPŒoŒ±‚ð‚­‚ê‚邪ó‘ÔˆÙí‚ÉŠ|‚©‚é‚â‚‚ª‚ ‚Á‚½‚炵‚­C³BHP‚ª1‰­‚à‚ ‚Á‚Ä“Å‚¶‚á‚È‚¢‚Æ“|‚¹‚È‚©‚Á‚½‚炵‚¢‚Ì‚Å...) ‚‚܂èMVPŒoŒ±‚ª‚ ‚Á‚Ä‚àƒ{ƒXˆµ‚¢‚Å‚Í‚È‚¢ƒ‚ƒ“ƒXƒ^[‚ðì‚邱‚Æ‚à‰Â”\‚Å‚·B
+Eó‘ÔˆÙí‚ÉŠ|‚©‚Á‚½ó‘Ô‚ÅÚ‘±Ø’f‚ª‚Å‚«‚È‚¢‚悤‚ÉC³B(‚½‚¾ƒ^ƒCƒ}[ƒ`ƒFƒbƒN‚Å‚Í‚È‚­opt1‚Æopt2‚ðƒ`ƒFƒbƒN‚·‚邾‚¯‚È‚Ì‚ÅŒ©‚½–Ú‚ª•Ï‚í‚éó‘ÔˆÙ킾‚¯‚É“K—p‚³‚ê‚Ü‚·B)
+E¡‚³‚ç‚Å‚·‚ªÌ‚ÌyareCVS(2003”N9ŒŽƒo[ƒWƒ‡ƒ“)‚Å“K—p‚³‚ê‚Ä‚¢‚½ƒ‰ƒO‚ðŒ¸‚ç‚·ˆ×‚̈—‚ð“ü‚ê‚Ä‚Ý‚Ü‚µ‚½B‚Ç‚ñ‚ÈŒø‰Ê‚ª‚ ‚é‚©‚ÍŽ©•ª‚Å‚à‚í‚©‚è‚Ü‚¹‚ñB(‚½‚¾“ü‚ê‚Ä‚Ý‚½‚¾‚¯...)
+EƒV[ƒYƒ‚[ƒh‚ÆPVP‚Å‹ÖŽ~‘•”õ‚ªŠO‚³‚ê‚Ä‚àŒø‰Ê‚ªÁ‚¦‚È‚¢ƒoƒOC³B
+E‚»‚Ì‘¼×‚©‚¢C³B
+E–¢ƒeƒXƒg‚Ì•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·B
+ (common/)
+ socket.c
+ connect_client()Amake_listen_port()Amake_connection() C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_config_read() C³B
+ skill.c
+ skill_unit_onplace()Askill_status_change_timer() C³B
+ skill_castend_nodamage_id()Askill_use_id() C³B
+ skill_check_unit_range_sub()Askill_timerskill() C³B
+ skill_additional_effect()Askill_attack()Askill_status_change_start() C³B
+ skill_check_cloaking() C³B
+ clif.c
+ clif_item_identify_list()Aclif_parse_QuitGame()Aclif_GM_kick() C³B
+ pc.c
+ pc_attack_timer()Apc_isUseitem()Apc_checkitem C³B
+ mob.c
+ mob_warp()Amob_walk()Amob_attack()Amob_target() C³B
+ mob_ai_sub_hard_activesearch()Amob_ai_sub_hard_mastersearch() C³B
+ mob_ai_sub_lazy()Amob_damage() C³B
+ npc.c
+ npc_parse_mapflag() C³B
+ map.h C³B
+
+--------------------
+//0814 by Ž€_
+
+EƒoƒOC³‚Æׂ©‚¢C³B
+Ebattle_athena.conf‚Ìplayer_auto_counter_type‚Æmonster_auto_counter_type‚ÌŽd—l‚ð•ÏXB(–{ŽI‚ł̓XƒLƒ‹”½Œ‚‚Í‚Å‚«‚È‚¢‚Ý‚½‚¢‚È‚Ì‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB)
+E“Å‚ÆΉ»‚É‚æ‚éHPŒ¸­‚ð–{ŽI‚ɇ‚킹‚ÄC³‚ÆŠ®‘SΉ»‚Ì‘O‚Å‚Í“®‚¯‚é‚悤‚É•ÏXB(“Å‚Í1•b‚É3+Å‘åHP‚Ì1.5%(ƒ‚ƒ“ƒXƒ^[‚Í0.5%)AΉ»‚Í5•b‚É1%) –¢ƒeƒXƒg
+EMVPŒoŒ±’l‚Í–{ŽI‚Å‚¢‚‚à“ü‚é‚悤‚É‚È‚Á‚½‚Ì‚ÅC³B
+EƒXƒeƒB[ƒ‹‚ÌŠm—¦‚ð­‚µ‰º‚°B
+Eƒ‚ƒ“ƒXƒ^[‚̃nƒCƒfƒBƒ“ƒOAƒNƒ[ƒLƒ“ƒOAƒ}ƒLƒVƒ}ƒCƒYƒpƒ[‚ª‚·‚®‚ɉ𜂳‚ê‚é–â‘èC³B(ƒ‚ƒ“ƒXƒ^[‚É‚ÍSP‚ª‚È‚¢‚¹‚¢‚Å‚·BŽæ‚芸‚¦‚¸ƒNƒ[ƒLƒ“ƒO‚̓nƒCƒfƒBƒ“ƒO‚ÌŽžŠÔ‚ð“K—p‚µ‚ă}ƒLƒVƒ}ƒCƒYƒpƒ[‚̓EƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“‚ÌŽžŠÔ‚ð“K—p‚µ‚Ü‚·B) –¢ƒeƒXƒg
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ðl”‚©‚ç‰ñ”‚É•ÏXB
+EPVP‚ÅŽ©•ª‚̃gƒ‰ƒbƒv‚ÉUŒ‚‘ÎÛ‚É‚È‚é‚悤‚É•ÏXB
+Evitƒyƒiƒ‹ƒeƒB‚Ì“K—p‚ÅæŽZ–hŒä‚àŒ¸‚é‚悤‚É•ÏXB(–¢ƒeƒXƒg)
+E‚»‚Ì‘¼×‚©‚¢ƒoƒOC³B
+ (conf/)
+ battle_athena.conf
+ (doc/)
+ conf_ref.txt
+ (db/)
+ skill_db.txt
+ (map/)
+ map.h C³B
+ script.c
+ buildin_itemskill() C³B
+ mob.c
+ mob_can_move()Amob_ai_sub_hard()Amob_damage() C³B
+ skill.c
+ skill_unitsetting()Askill_unit_onplace()Askill_castend_nodamage_id() C³B
+ skill_attack()Askill_status_change_start() C³B
+ skill_status_change_timer()Askill_status_change_timer_sub() C³B
+ skill_addtimerskill()Askill_cleartimerskill() C³B
+ skill_check_unit_range_sub() C³B
+ battle.c
+ battle_calc_damage()Abattle_check_target() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack() C³B
+ pc.c
+ pc_steal_item() C³B
+ clif.c
+ clif_parse_WalkToXY()Aclif_closevendingboard() C³B
+
+--------------------
+//0813 by Kalen
+EƒRƒ“ƒƒ“NPC’ljÁ
+ conf/npc/npc_town_gonryun.txt(ƒNƒGƒXƒg‚Í•s–¾
+ conf/npc/npc_town_kafra.txt
+ conf/npc/npc_town_guide.txt
+ (conf/npc/npc_event_tougijou.txt)ƒf[ƒ^•s‘«
+
+E‘SGvGMAP‚ÌMobƒf[ƒ^’ljÁ
+ conf/mob/npc_monster_gvg.txt
+
+ETESTmob‚©‚çƒeƒXƒgƒMƒ‹ƒhƒtƒ‰ƒOˆÚ“®
+ conf/gvg/TEST_prtg_cas01_AbraiJ.txt
+
+--------------------
+//0812 by huge
+
+EƒfƒBƒ{[ƒVƒ‡ƒ“‚̉¼ŽÀ‘•
+ EƒpƒPƒbƒg‚ª‘S‘R•ª‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½‚Ì‚ÅA
+ ‚¢Ž…‚ào‚È‚¢‚µAƒAƒCƒRƒ“‚·‚ç•\Ž¦‚Å‚«‚Ü‚¹‚ñB
+ Eƒ_ƒˆÚ“®‚¾‚¯‚ÅAƒmƒbƒNƒoƒbƒNEƒI[ƒgƒK[ƒh‚Í“K‰ž‚³‚ê‚Ü‚¹‚ñB
+
+ (map/)
+ clif.c
+ clif.h
+ clif_devotion() ’ljÁB
+ skill.c
+ skill_castend_nodamage_id() C³B
+ skill_devotion() skill_devotion2() ’ljÁB
+ skill_devotion3() skill_devotion_end() ’ljÁB
+ skill_status_change_end() C³B
+ skill_status_change_start() C³B
+ skill_brandishspear_first() C³B
+ skill_brandishspear_dir() C³B
+ pc.c
+ pc_authok() C³B
+ pc_walk() C³B
+ pc_damage() C³B
+ battle.c
+ battle_damage() C³B
+ map.h
+ map_session_data{}
+ struct square dev ’ljÁB
+ skill.h ‚Ìbrandish‚ðsquare‚ɉü–¼‚µA
+ (common/) mmo.h ‚Ɉړ®
+
+--------------------
+//0811 by ‚Ò‚´‚Ü‚ñ
+
+EUé’†‚Í’±‚ªŽg‚¦‚é‚悤‚ÉC³
+EŠ¦‚¢ƒWƒ‡[ƒNEƒXƒNƒŠ[ƒ€ŽÀ‘•(PTƒƒ“ƒo[‚É’áŠm—¦‚ʼn]X‚Í–¢ŽÀ‘•‚Å‚·)
+EGVGƒXƒNƒŠƒvƒg‚ðC³(ŽŽsöŒë‚µ‚·‚¬‚Ä‚Ç‚±‚ð‚Ç‚¤‚µ‚½‚©Šo‚¦‚Ä‚Ü‚¹‚ñc)
+@GVGƒXƒNƒŠƒvƒg‚ÉŠÖ‚µ‚Ä‚Å‚·‚ªAŠù’m‚̃oƒO‚ª‚ ‚è‚Ü‚·
+@‚»‚ê‚ÍAè—̃Mƒ‹ƒhƒ}ƒXƒ^[ˆÈŠO‚ÌPC‚ªAè—̃Mƒ‹ƒhƒ}ƒXƒ^[‚æ‚èæ‚ÉNPC‚ɘb‚µŠ|‚¯‚é‚Æ
+@ƒ}ƒbƒvƒT[ƒo‚ª—Ž‚¿‚é‚Æ‚¢‚¤‚à‚Ì‚Å‚·B
+@‚±‚ê‚ÍAgetguildmasterEgetguildname‚ðŽg—p‚µ‚Ä‚¢‚éƒXƒNƒŠƒvƒg‚·‚ׂĂɋN‚±‚蓾‚邱‚Æ‚Å‚ ‚è
+@æ‚Éè—̃Mƒ‹ƒhƒ}ƒXƒ^[ˆÈŠO‚Řb‚µŠ|‚¯‚é‚ÆAguild_search‚ª‰½ŒÌ‚©(ŠY“–ID‚̃Mƒ‹ƒh‚ª‚ ‚é‚É‚àŠÖ‚í‚炸)
+@NULL‚ð•Ô‚·Ž–‚É‹Nˆö‚µ‚Ü‚·B
+@³’¼ƒXƒNƒŠƒvƒgŠÖŒW‚Í‚æ‚­‚í‚©‚Á‚Ä‚¢‚È‚¢‚Ì‚ÅA‚±‚ê‚ÍŽ„‚Ì‹Zp‚Å‚ÍC³‚Ì‚µ‚悤‚ª‚ ‚è‚Ü‚¹‚ñB
+@Žb’è“I‚ȑΈ‚Æ‚µ‚ÄNULL‚ð•Ô‚µ‚ÄMAPŽI‚ª—Ž‚¿‚é‚­‚ç‚¢‚Ȃ當Žš—ñunullv‚ð•Ô‚·‚悤‚É‚µ‚Ü‚µ‚½B
+
+ (map/)
+ skill.c
+ skill_frostjoke_scream() ’ljÁB
+ skill_additional_effect()Askill_timerskill() C³B
+ skill_castend_nodamage_id() C³B
+ pc.c
+ pc_isUseitem() C³B
+ script.c
+ buildin_getpartyname()Abuildin_getguildname() C³B
+ buildin_getguildmaster() C³B
+ (db/)
+ cast_db.txt C³B
+ (conf/gvg/)
+ ev_*.txtˆÈŠO‚Ìtxt‘S‚Ä‚ðC³B
+
+--------------------
+//0810 by ¹
+
+EMVP‚̈—‚ð•ÏXB(Šm—¦‚Å10000‚ª‚ ‚Á‚Ä‚àA‘¼‚̃AƒCƒeƒ€‚ào‚é‚悤‚É‚µ‚Ü‚µ‚½)
+EMVP‚Å‘•”õ‚ð“üŽè‚µ‚½ê‡AŠÓ’èÏ‚Ý‚Å“üŽè‚µ‚Ä‚¢‚½–â‘è‚ðC³B
+EƒXƒLƒ‹‰r¥’†‚ɃCƒO—t‚âŠg‘勾‚ðŽg‚¤‚ƃvƒŒ[ƒ„[‚ÌŽg—p‰Â”\‚È
+@‘SƒXƒLƒ‹‚ÌLV‚ª1‚ɌŒ肳‚ê‚Ä‚µ‚Ü‚¤–â‘è‚ðC³B
+EƒI[ƒNƒA[ƒ`ƒƒ[“™Aƒ‚ƒ“ƒXƒ^[‚É‚æ‚é㩃XƒLƒ‹‚Ì—LŒøŠúŒÀ‚ªØ‚ꂽ‚Æ‚«‚ÉA
+@Ý’u—pƒgƒ‰ƒbƒv‚ªo‚é–â‘è‚ðC³B
+EƒƒOƒCƒ“ƒGƒ‰[(ƒpƒXƒ[ƒh“ü—̓~ƒX‚âBAN“™)‚̃Gƒ‰[ƒƒbƒZ[ƒW‚ª
+@³‚µ‚­ƒNƒ‰ƒCƒAƒ“ƒg‚É’Ê’m‚³‚ê‚È‚¢–â‘è‚ðC³B
+E‚»‚Ì‘¼×‚©‚ÈC³B
+ (common/)
+ version.h C³B
+ (login/)
+ login.c
+ parse_login() C³B
+ parse_fromchar() C³B
+ (char/)
+ int_guild.c
+ mapif_parse_GuildLeave() C³B
+ (map/)
+ itemdb.c
+ itemdb_read_itemnametable() C³B
+ atcommand.c
+ atcommand() C³B
+ skill.c
+ skill_unit_timer_sub() C³B
+ script.c
+ buildin_itemskill() C³B
+ mob.c
+ mob_damage() C³B
+
+--------------------
+//0809 by Kalen
+
+E“ŒŒÎéƒ[ƒvƒ|ƒCƒ“ƒgC³
+EƒAƒ}ƒcŽõŽi‰®C³
+EƒoƒOƒXƒŒ129‚Ì–â‘èC³H
+
+
+--------------------
+//0808 by ‚Ò‚´‚Ü‚ñ
+
+E‘•”õ§ŒÀ‚ªãŽè‚­“®ì‚µ‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
+Eƒ‚ƒ“ƒnƒEƒMƒ‹ƒh‚ÍGvGŠJŽnŽž‚Éì‚ç‚ê‚é‚悤‚É•ÏXB
+EGvGŠJŽnŽž‚ÉŠY“–ƒ}ƒbƒv‚É‚¢‚é‘SPC(è—̃Mƒ‹ƒhˆõˆÈŠO)‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚悤‚ÉC³B
+Eƒ‚ƒ“ƒnƒEƒMƒ‹ƒhƒAƒWƒg‚ŃGƒ“ƒy‚ð‰ó‚·‚ÆAƒ‚ƒ“ƒnƒE‚ªÁ‚¦‚é‚悤‚ÉC³B
+@‚±‚ÌC³‚É”º‚Á‚Ämaprespawnguildid‚̈ø”‚Ìflag‚ÌŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½
+@flag‚̓rƒbƒgƒtƒ‰ƒO‚É‚È‚èA
+@@1ƒrƒbƒg–ÚFè—̃Mƒ‹ƒhˆõ‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚©
+@@2ƒrƒbƒg–ÚFè—̃Mƒ‹ƒhˆõˆÈŠO‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚É–ß‚·‚©
+@@3ƒrƒbƒg–ÚFƒGƒ“ƒyEƒK[ƒfƒBƒAƒ“ˆÈŠO‚ÌMOB‚ðÁ‚·‚©
+@‚¢‚¸‚ê‚àA0=NOA1=YES‚É‚È‚è‚Ü‚·
+
+ (conf/gvg/)
+ ev_agit_aldeg.txt C³B
+ ev_agit_gefg.txt C³B
+ ev_agit_payg.txt C³B
+ ev_agit_prtg.txt C³B
+ TEST_prtg_cas01_AbraiJ.txt C³B
+ TEST_prtg_cas01_mob.txt C³B
+ (map/)
+ pc.c
+ pc_checkitem() C³B
+ script.c
+ buildin_maprespawnguildid_sub() C³B
+ buildin_maprespawnguildid() C³B
+
+--------------------
+//0807 by Ž€_
+
+E0805‚ÅFD_SETSIZE‚ðC³‚·‚銂ðŠÔˆá‚Á‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B56–¼Ž~‚܂肪Ž¡‚é‚ÆŒ¾‚¤•ÛØ‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...
+Eˆê“x‚É“]‘—‚·‚éƒpƒPƒbƒg‚Ì’·‚³‚ð32768bytes‚©‚ç65536bytes‚É•ÏXB
+ (common/)
+ mmo.h C³B
+ socket.h C³B
+ socket.c C³B
+
+--------------------
+//0806 by Kalen
+
+EagitƒtƒHƒ‹ƒ_¨gvgƒtƒHƒ‹ƒ_‚ÖˆÚs
+ ”ˆÓŒ©‚ ‚é‚ÆŽv‚¢‚Ü‚·‚ªAjRO‚Å‚ÍUéí‚ðgvg‚ƌĂԂ±‚Æ‚ªˆê”Ê“I‚È‚Ì‚Å‚±‚¿‚ç‚É“‡‚µ‚Ü‚·B
+ conf/gvg/
+ ###agitƒtƒHƒ‹ƒ_‚ð휂µ‚Ä‚­‚¾‚³‚¢###@(Please delete the "agit" folder.)
+ getmaster‘Ήž
+
+EƒAƒ}ƒc‚ÌŽõŽi‰®ƒoƒOC³‚Æ€–ڒljÁ(thx 114
+ conf/npc/npc_town_amatsu.txt
+
+Emap_flagÄC³
+ conf/map_flag.txt
+ [GVGMAP]Šm‚©‚Éí‚ɃV[ƒYƒ‚[ƒh‚È‚ç–â‘è‚È‚¢‚Å‚·‚ªA휂³‚ê‚Ü‚µ‚½‚Ì‚Å
+ í‚ɃV[ƒYƒ‚[ƒh‚Å‚Í‚ ‚è‚Ü‚¹‚ñB]‚Á‚ĉ𜎞(ŽžŠÔŠO)‚É‚ÍŽ}AƒeƒŒƒ|‚ªŽg‚¦‚Ü‚·
+ ŽžŠÔ‘O‚ÉŽ}ŽT‚«A‚Ü‚¾ŽÀ‘•‚µ‚Ä‚Ü‚¹‚ñ‚ª•ó” ’DŽæ‚à‰Â”\‚É‚È‚é‚Ì‚ÅŽ}AƒeƒŒƒ|‚Íí‚ÉŽg—p•s‰Â‚Å–â‘è‚È‚¢‚ÆŽv‚¢‚Ü‚·B
+
+Œã‘O‰ñ‘‚«–Y‚ê‚Ü‚µ‚½‚ªAmomotaroƒCƒxƒ“ƒg‚Å‚·‚ªA‚¿‚å‚Á‚Æ•sˆÀ’è‚ȉ”\«‚ª‚ ‚è‚Ü‚·B
+Œ´ˆö‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å‚·‚ªAƒ‹[ƒv‚µ‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñBˆê‰žƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚ ‚è‚Ü‚·
+
+--------------------
+//0805 by Ž€_
+
+E•¶Žš‰»‚¯C³B
+EƒV[ƒYƒ‚[ƒh‚ł̃eƒŒƒ|[ƒg‹ÖŽ~‚âŒÃ–Ø‚ÌŽ}Žg—p‹ÖŽ~‚̓\[ƒXƒŒƒxƒ‹‚Å
+ˆ—‚µ‚Ä‚¢‚é‚Ì‚Åmapflag.txt‚©‚çíœB(ˆö‚Ý‚Énopenalty‚àƒ\[ƒXƒŒƒxƒ‹‚Å
+ˆ—‚µ‚Ä‚¢‚Ü‚·B)
+Ebattle_athena.conf‚Ìagit_eliminate_time‚ðgvg_eliminate_time‚É•ÏXB
+E@ƒRƒ}ƒ“ƒh@GMíœB
+EFD_SETSIZE‚©cygwin‚Å64‚Éݒ肳‚ê‚Ä‚¢‚½‚Ì‚¹‚¢‚ÅÅ‘åÚ‘±l”‚ª56–¼‚ð
+‰z‚¦‚é‚ƃ}ƒbƒvŽI‚ª–³ŒÀƒ‹[ƒv‚·‚é–â‘èC³B(‚½‚¾ƒeƒXƒg‚ª‚Å‚«‚È‚©‚Á‚½•¨‚È‚Ì‚Å–{“–‚É‘åä•v‚É‚È‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·B‚ ‚­‚Ü‚Å‚àŽ©•ª‚Ì—\‘ª‚É‚·‚¬‚È‚¢•¨‚Å‚·‚ª...)
+E•¶Žš‰»‚¯‚Ì‚¹‚¢‚Å‚Ç‚±‚ð‚Ç‚¤C³‚µ‚½‚©Šo‚¦‚Ä‚È‚¢‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯B
+ (conf/)
+ atcommand_athena.conf
+ battle_athena.conf
+ mapflag.txt
+ (db/)
+ castle_db.txt
+ (doc/)
+ conf_ref.txt
+ (common/)
+ mmo.h
+ (login/)
+ login.c
+ (char/)
+ inter.c
+ int_guild.c
+ (map/)
+ atcommand.h
+ atcommand.c
+ battle.h
+ battle.c
+ chrif.c
+ guild.h
+ guild.c
+ intif.h
+ intif.c
+ map.h
+ map.c
+ mob.c
+ npc.c
+ npc.h
+ script.c
+ skill.c
+ pc.c
+ makefile
+
+--------------------
+//0804 by Žß‘¸
+
+EƒAƒ‹ƒxƒ‹ƒ^‚Ì‚Ê‚¢‚®‚é‚݃Cƒxƒ“ƒg‚Å‚¤‚³‚¬‚Ì‚Ê‚¢‚®‚é‚Ý‚ð‚ ‚°‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
+
+ (conf/npc/)
+ npc_event_doll.txt C³B
+
+--------------------
+//0803 by ‚Ò‚´‚Ü‚ñ
+
+ GvG‚ŃGƒ“ƒyƒŠƒEƒ€•ö‰óŽžgvg_eliminate_time‚Ì’l‚ÉŠÖ‚í‚炸‘¦À‚É‘Þ‹Ž‚³‚¹‚ç‚ê‚Ä‚¢‚½ƒoƒOC³
+ GvG‚̃ZƒŠƒt‚ðˆê•”C³
+ interŽI‚Åcastle.txt‚ª‚È‚¢‚Æ‹N‚±‚éFX‚ȃGƒ‰[‚ðC³
+ help.txt‚ðC³(@gvgstart¨@agitstart‰]X)
+
+ (conf/)
+ gvg/TEST_prtg_cas01_AbraiJ.txt C³B
+ agit/ev_agit_prtgJ.txt C³B
+ help.txt C³B
+ (map/)
+ int_guild.c
+ inter_guild_init() C³B
+
+--------------------
+//0802 by Michael_Huang
+
+ Added NPC Script - 'GetGuildMaster' Command.
+ (common/)
+ version.h
+ Mod_Version 0802
+ (map/)
+ script.c
+ buildin_getguildmaster_sub() buildin_getguildmaster()
+
+--------------------
+//0801 by Kalen
+EƒAƒ}ƒcC³
+@@ŽÀ‘•‘O‚̃f[ƒ^A”²‚¯‚Ä‚éƒf[ƒ^‚Ȃǂ𒲸‚µC³
+ conf/npc/npc_town_guide.txt
+ conf/npc/npc_town_amatsu.txt
+ conf/npc/npc_event_momotaro.txt
+ conf/npc/npc_event_alchemist.txt
+ conf/mob/npc_monster35.txt
+ conf/warp/npc_warp_amatsu.txt
+Emap_flagC³
+ [GVGMAP]Ž}AƒeƒŒƒ|‚Íí‚ÉŽg—p•s‰Â
+EGVGŠÖŒW
+ 0800‚̃Rƒ}ƒ“ƒh‚ɑΉž
+
+--------------------
+//0800 by Michael_Huang
+
+ Added Agit NPC Script & Command.
+ Fix FreeBSD GCC compatibility.
+ Attachment Agit Demo NPCs.
+
+ (char/)
+ int_guild.c
+ mapif_guild_castle_dataload() mapif_guild_castle_datasave()
+ int mapif_parse_GuildCastleDataLoad() int mapif_parse_GuildCastleDataSave()
+ inter_guild_parse_frommap() inter_guildcastle_tostr() inter_guildcastle_fromstr()
+ inter.c
+ inter_send_packet_length[] inter_recv_packet_length[]
+ (common/)
+ mmo.h
+ GLOBAL_REG_NUM, struct global_reg {}
+ version.h
+ Mod_Version 0799.
+ (conf/)
+ atcommand_athena.conf
+ agitstart: 1,agitend: 1
+ battle_athena.conf
+ agit_eliminate_time: 7000
+ map_athena.conf
+ conf/agit/ev_agit_*.txt
+ (doc/)
+ conf_ref.txt
+ battle_athena.cnf
+ agitdb_ref.txt
+ (login/)
+ login.c
+ parse_login()
+ (map/)
+ atcommand.h
+ agitster, agitend
+
+ atcommand.c
+ @agitstart, @agitend
+ battle.h
+ battle_config.agit_eliminate_time
+ battle.c
+ battle_config_read()
+ chrif.c
+ chrif_changedsex() chrif_connectack()
+ guild.h
+ guild_agit_start() guild_agit_end() guild_agit_break()
+ guild.c
+ guild_read_castledb() do_init_guild()
+ guild_agit_start() guild_agit_end() guild_agit_eliminate_timer() guild_agit_break()
+ intif.h
+ intif_guild_castle_dataload() intif_guild_castle_datasave()
+ intif.c
+ packet_len_table[] intif_guild_castle_dataload() intif_guild_castle_datasave()
+ intif_parse_GuildCastleDataLoad() intif_parse_GuildCastleDataSave() intif_parse()
+ map.h
+ agit_flag
+ map.c
+ agit_flag
+ npc.h
+ npc_event_doall() npc_event_do()
+ npc.c
+ npc_event_do_sub() npc_event_do()
+ script.c
+ buildin_maprespawnguildid() buildin_agitstart() buildin_agitend()
+ buildin_getcastlename() buildin_getcastledata() buildin_setcastledata()
+ skill.c
+ skill_unit_onplace()
+ skill_gangster_count()
+
+--------------------
+//0799 by ‚Ò‚´‚Ü‚ñ
+
+EGvGŽÀ‘•‚ׂ̈Éinter-mapŠÔ‚Ì’ÊMŽd—l•ÏX
+E0798‚̃Rƒ“ƒpƒCƒ‹ƒGƒ‰[C³(byƒoƒO•ñƒXƒŒ82Ž)
+ (login/)
+ login.c
+ parse_login() C³B
+ (map/)
+ intif.c
+ packet_len_table[] C³B
+ intif_parse_GuildCastleInfo() C³B
+ intif_parse_GuildCastleChange()‚ðintif_parse_GuildCastleChangeErr()‚ɉü–¼EC³B
+ intif_parse() C³B
+ guild.c
+ guild_read_castledb() C³B
+
+ (char/)
+ inter.c
+ inter_send_packet_length[] C³B
+ int_guild.c
+ inter_guildcastle_tostr() C³B
+ inter_guildcastle_fromstr() C³B
+ mapif_parse_GuildChangeCastle() C³B
+ mapif_parse_GuildCastleInfo() C³B
+ mapif_guild_castle_info() C³B
+ mapif_guild_change_castle()‚ðmapif_guild_change_castle_err()‚ɉü–¼EC³B
+ (common/)
+ mmo.h C³B
+ version.h C³B
+
+--------------------
+//0798 by ŒÓ’±—–
+
+Elogin-server‚̃ƒOƒCƒ“Ž¸”sƒpƒPƒbƒg‚Ì’·‚³‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
+Elogin-server‚ɃAƒNƒZƒXƒRƒ“ƒgƒ[ƒ‹‹@”\’ljÁ
+ Elogin_athena.cnf‚Éorder,allow,deny‚ð‹Lq‚·‚邱‚Æ‚ÅA
+ IP’PˆÊ(‘O•ûˆê’v)‚ŃAƒNƒZƒX‚ð‹ÖŽ~‚·‚é‹@”\B
+ EŽw’è•û–@‚Í doc/conf_ref.txt ‚ðŽQÆ
+
+ (doc/)
+ conf_ref.txt
+ login_athena.cnf‚Ì•”•ªC³
+ (login/)
+ login.c
+ ƒOƒ[ƒoƒ‹•Ï” access_* ’ljÁ
+ parse_login()C³,check_ip()’ljÁ
+
+EƒAƒJƒEƒ“ƒg쬗pCGIƒXƒNƒŠƒvƒg’ljÁ
+ EŽ©ŒÈÓ”C•Úׂȉðà–³‚µAŽ¿–₳‚ê‚Ä‚àƒXƒ‹[‚·‚é‰Â”\«—L‚è
+ EƒGƒfƒBƒ^‚ÅŠJ‚¢‚½‚ç­‚µà–¾—L‚è
+ ECGIÝ’u‚ÌŠî–{‚³‚¦‚í‚©‚ê‚Ζâ‘è‚È‚¢‚Í‚¸
+ EƒƒbƒZ[ƒW‚͉pŒêA“ú–{Œê—¼‘Ήž
+ iAccept-Language‚ªja‚È‚ç“ú–{Œê‚É•ÏŠ·‚µ‚Ü‚·j
+ EŠÇ—ŽÒƒpƒXƒ[ƒh‚È‚µ‚Å“®‚­‚̂ŃZƒLƒ…ƒŠƒeƒB‚É‚Í’ˆÓ(.htaccess‚È‚Ç„§)
+
+ (tool/cgi/)
+ addaccount.cgi
+ ƒAƒJƒEƒ“ƒg쬗pCGIB
+
+E‚»‚Ì‘¼
+ (tool/)
+ backup
+ castle.txt‚àƒoƒbƒNƒAƒbƒv‚·‚é‚悤‚É
+
+--------------------
+//0797 by Ž€_
+
+E­‚µC³B
+Ebattle_athena.conf‚Ì€–Ú•ÏXB(lootitem_time íœAitem_first_get_timeA
+item_second_get_timeAitem_third_get_timeAmvp_item_first_get_timeA
+mvp_item_second_get_timeAmvp_item_third_get_time ’ljÁB)
+EƒAƒCƒeƒ€ƒ‹[ƒgŒ ŒÀ‚𳂵‚­ŽÀ‘•BʼnUŒ‚‚Å‚Í‚È‚­—^‚¦‚½ƒ_ƒ[ƒW‚Ì
+—Ê‚É‚æ‚Á‚ÄŽû“¾Œ ŒÀ‚ð—^‚¦‚é‚悤‚É•ÏXB(ʼnŽû“¾Œ ŒÀ‚̂݃eƒXƒg)
+ƒp[ƒeƒB‚Ìꇃp[ƒeƒB‚ÌÝ’è‚ɇ‚킹‚é•K—v‚ª‚ ‚è‚Ü‚·‚ª‚Ü‚¾ƒpƒPƒbƒg‚ª
+•s–¾‚ÈŠ‚ª‚ ‚éˆ×“¯‚¶ƒp[ƒeƒB‚È‚çŽû“¾‚Å‚«‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚̃oƒOC³B(‘½•ªC³‚³‚ꂽ‚Í‚¸...)
+E‘•”õƒXƒNƒŠƒvƒgbonus‚ÉbSplashRange‚ÆbSplashAddRange’ljÁB
+bSplashRange‚ÆbSplashAddRange‚Í•Ší‚Ń_ƒ[ƒW‚ð—^‚¦‚½Žž‚Ì‚Ý”­“®A’Êí‚Ì•ŠíUŒ‚ˆµ‚¢‚È‚Ì‚Å”ð‚¯‚ç‚ê‚邪(Flee2‚É‚æ‚銮‘S‰ñ”ð‚Í•s‰Â”\)ƒNƒŠ‚Ío‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ä•Ší‚É‚æ‚éó‘ÔˆÙí‚Í”­¶‚µ‚Ü‚¹‚ñB–{ŽIŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñB
+EƒXƒLƒ‹‚Ìd‚Ë’u‚«ˆ—‚ð–{ŽI‚ɇ‚킹‚ÄC³B
+Emapflag‚Ìgvg‚Í‚¢‚‚à‚È‚Á‚Ä‚¢‚é‚킯‚¶‚á‚È‚¢‚Ì‚ÅíœB
+E‚»‚Ì‘¼×‚©‚¢C³B
+ athena-start C³B
+ (common/)
+ mmo.h C³B
+ (conf/)
+ mapflag.txt C³B
+ battle_athena.conf C³B
+ (db/)
+ const.txt C³B
+ item_db.txt C³B
+ (doc/)
+ conf_ref.txt C³B
+ item_bonus.txt C³B
+ (map/)
+ mob.c
+ mob_spawn()Amob_damage()Amob_class_change()Amob_warp() C³B
+ mob_delay_item_drop()Amob_delay_item_drop2() C³B
+ mobskill_castend_pos() C³B
+ pc.c
+ pc_takeitem()Apc_dropitem()Apc_equipitem() C³B
+ pc_calcstatus()Apc_bonus() C³B
+ skill.c
+ skill_attack()Askill_additional_effect()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_produce_mix() C³B
+ skill_arrow_create()Askill_unit_timer_sub()Askill_castend_pos() C³B
+ map.h C³B
+ map.c
+ map_addflooritem() C³B
+ script.c
+ buildin_getitem() C³B
+ pet.c
+ pet_return_egg()Apet_get_egg()Apet_unequipitem() C³B
+ battle.h C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack()Abattle_config_read() C³B
+
+--------------------
+//0796 by huge
+
+Eׂ©‚¢C³
+ (conf/npc/)
+ npc_event_valentine.txt C³B
+
+ (map/)
+ pc.c
+ pc_takeitem() C³B
+ skill.c
+ skill_unit_timer_sub() C³B
+
+--------------------
+//0795 by Kalen
+
+EŽG’k341‚Ìnpc_warp_niflheim.txt’ljÁ
+ conf/warp/npc_warp_niflheim.txt
+
+Emapflag.txtC³(GVGMAPÝ’è)
+ @nosave‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñ
+
+Emap_athena.conf‚ÌC³
+ @umbala niflheim“™‚̒ljÁ
+ @ƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚ ‚è‚Ü‚·B
+
+EƒoƒŒƒ“ƒ^ƒCƒ“ƒXƒNƒŠƒvƒg’ljÁ
+ conf/npc/npc_event_valentine.txt
+ @ƒ`ƒ‡ƒR’B‚ÌDrop‚͘M‚Á‚Ä‚¢‚Ü‚¹‚ñB‚¨D‚Ý‚Å‚Ç‚¤‚¼
+ @®AŽèì‚èƒ`ƒ‡ƒR‚ðH‚ׂ½‚Æ‚«‚̃GƒtƒFƒNƒg‚Í
+ @ÅVƒNƒ‰ƒCƒAƒ“ƒg‚É‚·‚ê‚ÎŒ©‚¦‚Ü‚·B
+
+EGVGScript’ljÁ
+ conf/gvg/ˆÈ‰º
+ @WeissŽž‘ã‚É쬂µ‚½‚à‚Ì‚ðAthena—p‚ɃRƒ“ƒo[ƒg&‘䎌C³
+ @prtg_cas01ˆÈŠO‚ÍŠø‚Ì‚Ý‚Å‚·B
+ @GVGDATA‚ÍŽIÄ‹N“®‚ÅÁ–Å‚µ‚Ü‚·B
+ @ƒGƒ‰[‚ªo‚é‚悤‚È‚çƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚­‚¾‚³‚¢B
+ @MobDataAŽ·Ž–Script‚àprtg_cas01‚Ì‚Ý‚Å‚·B(TestScript)
+ @‚ ‚­‚܂ŃeƒXƒgƒXƒNƒŠƒvƒg‚Å‚·BGVGŽÀ‘•‚ÌŽQl‚É‚Ç‚¤‚¼
+
+--------------------
+//0794 by DRG
+
+Eskillused‚ÅŽw’肵‚½IW,QM‚È‚Ç‚É‚Ì‚Á‚Ä‚éŠÔMOBƒXƒLƒ‹‚ðŽg—p‚·‚é‚悤‚É•ÏX
+EƒAƒbƒvƒXƒŒ‚R‚Ì7‚Ìathena-start‚ðˆê‰žŠÜ‚ß‚Æ‚«‚Ü‚µ‚½
+
+ athena-start
+ (map/)
+ skill.c
+ skill_unit_onplace() C³B
+
+--------------------
+//0793 by huge
+
+EƒT[ƒo[snapshot
+EƒT[ƒo[‚ªƒNƒ‰ƒbƒVƒ…‚·‚éƒoƒO‚ðC³
+E”­“®‚¹‚¸‚Éã©‚ªÁ‚¦‚½‚çAÝ’u—pƒgƒ‰ƒbƒv‚ª•Ô‚Á‚Ä‚­‚é‚悤‚ÉC³B
+Eƒ‹[ƒgŒ ŒÀ‚ÅA“¯‚¶ƒp[ƒeƒB[‚̃Lƒƒƒ‰‚Í‚·‚®E‚¦‚é‚悤‚ÉC³B
+EƒoƒO•ñƒXƒŒ‚R >>54 ‚̃oƒOC³B
+EƒƒOƒCƒ“Žž‚ɃT[ƒo[‘¤‚ÉID‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
+ (login/)
+ login.c
+ parse_login() C³B
+ (conf/npc/)
+ npc_event_doll.txt C³B
+ (map/)
+ skill.c
+ skill_unit_timer_sub() C³B
+ mob.c
+ mob_spawn_dataset() C³B
+ mob_damage() C³B
+ pc.c
+ pc_additem() C³B
+
+--------------------
+//0791 by ¹
+
+Eƒ}ƒbƒvƒT[ƒo‚ªƒNƒ‰ƒbƒVƒ…‚·‚éƒoƒOC³B
+EƒCƒO—t‚ðŽg‚Á‚Ä‚àƒWƒFƒ€‚ª•K—v‚É‚È‚é–â‘è‚ðC³B
+EPvP‹­§‘—ŠÒŽÀ‘•B
+EPvP‚ŃŠƒUƒŒƒNƒVƒ‡ƒ“‚ªo—ˆ‚È‚©‚Á‚½–â‘è‚ðC³B
+E‚»‚Ì‘¼×‚©‚ÈC³B
+ (map/)
+ guild.c
+ mob.c
+ pc.c
+ skill.c
+
+--------------------
+//0790 by Ž€_
+
+EƒoƒOC³B
+ (conf/)
+ battle_athena.conf ŒëŽšC³B
+ (doc/)
+ conf_ref.txt ŒëŽšC³B
+ (common/)
+ mmo.h C³B
+ (map/)
+ itemdb.h C³B
+ map.h C³B
+ skill.c
+ skill_check_condition()Askill_use_pos()Askill_unit_onplace() C³B
+
+--------------------
+//0789 by huge
+
+EƒhƒƒbƒvƒAƒCƒeƒ€‚Ƀ‹[ƒgŒ ŒÀ‚ðŽÀ‘•B
+Eʼn‚ÉUŒ‚‚µ‚½lˆÈŠO‚ªƒhƒƒbƒvƒAƒCƒeƒ€‚ðE‚¦‚é‚Ü‚Å‚ÌŽžŠÔ‚ðÝ’è‚Å‚«‚é‚悤‚ÉB
+ (/conf)
+ battle_athena.conf €–ڒljÁB
+
+ (/doc)
+ conf_doc.txt à–¾’ljÁB
+
+ (/map)
+ battle.h
+ Battle_Config{} C³B
+ battle.c
+ battle_config_read() C³B
+ itemdb.h
+ item_data {} C³B
+ map.h
+ flooritem_data {} C³B
+ mob_data {} C³B
+ map.c
+ map_addflooritem() C³B
+ mob.c
+ delay_item_drop{} C³B
+ mob_spawn() C³B
+ mob_damage() C³B
+ mob_delay_item_drop() C³B
+ mob_warp() C³B
+ pc.c
+ pc_takeitem() C³B
+
+--------------------
+//0788 by ‚ ‚ä‚Ý
+
+EcardƒXƒLƒ‹‚̈—H‚ðC³B
+E@allskillƒRƒ}ƒ“ƒh‚ÌÄC³B
+
+ (map/)
+ pc.c
+ pc_skill() C³B
+ pc_allskillup() C³B
+
+--------------------
+//0787 by ‚Û‚Û‚Û
+
+Eƒyƒbƒg‚É‚àmob_avail.txt‚ÌÝ’è‚ð“K—p‚·‚é‚悤‚É‚µ‚½B
+EMOBƒXƒLƒ‹‚Ìskillused‚Åval1‚É0‚ð“ü‚ê‚é‚Æ‚ ‚ç‚ä‚éƒXƒLƒ‹‚ɑ΂µ‚Ä”­“®‚·‚é‚悤‚É‚µ‚½B
+Eskillused‚Å”­“®‚µ‚½ƒXƒLƒ‹‚Ì‘ÎÛ‚ðA”­“®‚³‚¹‚½PC‚É‚·‚é‚©‚Ç‚¤‚©Ý’è‚Å‚«‚é‚悤‚É‚µ‚½(‘ÎIWƒnƒ‚È‚ÇH)B
+ (/map)
+ clif.c
+ clif_pet0078()Aclif_pet007b()C³B
+ mob.c
+ mobskill_use()C³B
+ skill.c
+ skill_attack() Askill_castend_damage_id()C³B
+ battle.h
+ battle.c
+ battle_config_read()C³B
+
+--------------------
+//0786 by huge
+
+EBDSC³
+ ‘O‚©‚ç‚«”ò‚΂µ‚Äs‚­‚Æ—Ç‚­‚È‚¢‚©‚à‚µ‚ê‚È‚¢‚Ì‚ÅAŒã‚ë‚©‚爗
+ —LŒø”͈͂ÌC³
+
+ (/map)
+
+ skill.h
+ skill.c
+ skill_castend_damage_id() C³B
+ skill_castend_nodamage_id() C³B
+ skill_brandishspear_first() C³B
+ skill_brandishspear_dir() C³B
+
+--------------------
+//0785 by Ž€_
+
+E–{ŽI‚ɇ‚킹‚ÄC³B(ŠØ‘ˆÆ‚̃pƒbƒ`notice‚ðŽQl‚µ‚ÄC³‚µ‚Ü‚µ‚½B)
+EBB‚ÆBS‚̃LƒƒƒXƒeƒBƒ“ƒOŽžŠÔ‚ð0.7•b‚É‚µ‚ăfƒBƒŒƒC‚Í0‚É•ÏXB
+Eghost‚Ì•Ï‚í‚è‚Ƀ}ƒbƒvˆÚ“®Œã‚Ì–³“GŽžŠÔ‚ðÝ’èB‚±‚ÌŽžŠÔ‚ÌŠÔ‚Í‚Ç‚ñ‚ÈUŒ‚‚àŽó‚¯‚È‚¢‚ªˆÚ“®‚âUŒ‚AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚Å‚±‚ÌŽžŠÔ‚Í‚È‚­‚È‚è‚Ü‚·BƒV[ƒYƒ‚[ƒh‚Å‚Í‚±‚Ì–³“GŽžŠÔ‚ð2”{‚Æ‚µ‚Ä“K—pB
+EƒV[ƒYƒ‚[ƒh‚ÅŽ€‚ñ‚Å‚àŒoŒ±‚ªŒ¸‚ç‚È‚¢‚悤‚ÉC³B(mapflag‚Ìnopenalty‚ðÝ’è‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB)
+EƒXƒLƒbƒh‚ÅŠŠ‚ׂ鋗—£‘‰ÁB
+EŠù‚É’¾–Ù‚É‚©‚©‚Á‚Ä‚é‘ÎۂɃŒƒbƒNƒXƒfƒBƒr[ƒi‚ðŽg‚¤‚Æ’¾–Ù‚ª‰ðœ‚³‚ê‚é‚悤‚É•ÏXB
+EŽô‚¢‚É‚©‚©‚é‚ƈړ®‘¬“x‚àŒ¸‚é‚悤‚ÉC³B
+Ebattle_athena.conf‚É€–Ú•ÏXB
+EƒXƒLƒ‹‚Ìd‚Ë’u‚«‚ð”»’fˆ—‚ð­‚µ•ÏXB
+EHP‚ÌŽ©‘R‰ñ•œŽžŠÔ‚ª4•b‚Å‚Í‚È‚­6•b‚¾‚Æ‚í‚©‚Á‚½‚̂ŃfƒtƒHƒ‹ƒgC³‚Æbattle_athena.confC³B
+E‚»‚Ì‘¼×‚©‚¢C³‚âƒoƒOC³B
+E–w‚ǃeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB
+ (conf/)
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ cast_db.txt C³B
+ (map/)
+ atcommand.c C³B
+ clif.c
+ clif_mob0078()Aclif_mob007b()Aclif_skill_estimation() C³B
+ clif_mob_class_change()Aclif_parse_WalkToXY() C³B
+ clif_parse_ActionRequest()Aclif_parse_LoadEndAck() C³B
+ clif_parse_UseItem()Aclif_parse_UseSkillToId() C³B
+ clif_parse_UseSkillToPos()Aclif_parse_UseSkillMap() C³B
+ mob.h C³B
+ mob.c
+ mob_get_viewclass()Amob_attack()Amob_target() C³B
+ mob_ai_sub_hard_activesearch()Amob_ai_sub_hard() C³B
+ mobskill_castend_id()Amobskill_castend_pos() C³B
+ skill.h C³B
+ skill.c
+ skill_can_produce_mix()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_castend_id() C³B
+ skill_castend_pos()Askill_use_id()Askill_readdb() C³B
+ skill_check_condition()Askill_unit_onplace()Askill_unitsetting() C³B
+ skill_additional_effect()Askill_check_unit_range() C³B
+ skill_check_unit_range_sub()Askill_status_change_end() C³B
+ skill_status_change_start() C³B
+ pc.h
+ pc.c
+ pc_ghost_timer()Apc_setghosttimer()Apc_delghosttimer() íœB
+ pc_gvg_invincible_timer() -> pc_invincible_timer()‚É•ÏXB
+ pc_setgvginvincibletimer() -> pc_setinvincibletimer()‚É•ÏXB
+ pc_delgvginvincibletimer() -> pc_delinvincibletimer()‚É•ÏXB
+ pc_authok()Apc_attack_timer()Apc_calcstatus() C³B
+ pc_setrestartvalue()Apc_damage()Apc_allskillup() C³B
+ do_init_pc() C³B
+ battle.h C³B
+ battle.c
+ battle_config_read()Abattle_weapon_attack()Abattle_check_target() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_get_speed() C³B
+ map.h C³B
+ map.c
+ map_quit() C³B
+
+--------------------
+//0784 by ‚ ‚ä‚Ý
+
+EƒJ[ƒhƒXƒLƒ‹‚ðŠo‚¦‚Ä‚¢‚éó‘Ô‚Å@allskillƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é‚Æmap-server‚ª–\‘–‚·‚é–â‘è‚ðC³B
+
+ (map/)
+ pc.c
+ pc_allskillup() C³B
+
+--------------------
+//0783 by huge
+
+Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA‚ÌC³
+ ”͈͎w’èAŽÎ‚ß‚ÌÛ‚ÌŠiŽq”͈ÍAUŒ‚—ÍŒvŽZ
+ ‘½•ª‡‚Á‚Ä‚é‚ÆŽv‚¤‚ñ‚Å‚·‚¯‚ÇAƒCƒ}ƒCƒ`Ž©M‚ªŽ‚Ä‚È‚¢EEE
+ (ŽQl)‚Ý‚·‚Ƃꑃ -ƒXƒLƒ‹ŠÖ˜A“¤î•ñ
+EƒXƒyƒ‹ƒuƒŒƒCƒJ[‚ð‚¿‚å‚Á‚ÆC³
+Eƒvƒƒ{ƒbƒN‚ðMVPmob‚ÉŒø‚©‚È‚¢‚悤C³
+EƒoƒO•ñƒXƒŒ‚R >>8 ‚Å•ñ‚³‚ꂽ‚à‚Ì‚ÌŽæ‚èž‚Ý
+
+ (/db)
+ create_arrow.txt C³B
+ skill_db.txt C³B
+
+ (/map)
+ battle.c
+ battle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack() C³B
+
+ skill.h
+ skill.c
+ skill_brandishspear_first() ’ljÁB
+ skill_brandishspear_dir() ’ljÁB
+ skill_castend_nodamage_id() C³B
+ skill_castend_damage_id() C³B
+ skill_unit_group() C³B
+
+--------------------
+//0782 by ‚Ò‚´‚Ü‚ñ
+E@allskillƒRƒ}ƒ“ƒh‚ÌŽg—pðŒ‚ªŽQÆ‚³‚ê‚Ä‚¢‚È‚©‚Á‚½ƒoƒOC³
+ (/map)
+ atcommand.c
+ atcommand() C³B
+
+--------------------
+//0781 by Chunglyeng
+Eƒoƒh, ƒ_ƒ“ƒT[‰¹Šy‹ïŒ»
+ (/map)
+ skill.c C³B
+
+--------------------
+//0780 by reia
+EƒyƒRƒyƒR‚Ì—‘‚È‚Ç‚ª›z‰»‚·‚é‚ƃmƒr‚É‚È‚Á‚Ä‚µ‚Ü‚¤–â‘èC³B
+EGMƒRƒ}ƒ“ƒhu@kickallv‚ª‰½Žž‚ÌŠÔ‚É‚©–³Œø‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³B
+
+ (/conf)
+ atcommand_athena.conf C³B
+ (db/)
+ mob_skill_db.txt C³B
+ (map/)
+ atcommand.c
+ atcommand_config_read() C³B
+
+--------------------
+//0779 by ‚ ‚ä‚Ý
+
+E‘SƒXƒLƒ‹Žæ“¾ƒRƒ}ƒ“ƒh‚̒ljÁB
+ EGM‚Å‘SƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚悤‚É‚µ‚Ä‚¢‚éꇂâAƒXƒLƒ‹‚Ì”‚ª‘½‚¢E‹Æ‚͈ꕔ‚̃XƒLƒ‹•\Ž¦‚ª‚¨‚©‚µ‚­‚È‚è‚Ü‚·B‚»‚Ìꇂ̓ŠƒƒO‚µ‚ĉº‚³‚¢B
+ @allskill : Œ»Ý‚ÌE‹Æ‚Ŏ擾‰Â”\‚È‘SƒXƒLƒ‹‚ðŽæ“¾‚·‚éB(ƒNƒGƒXƒgƒXƒLƒ‹ŠÜ‚Þ)
+
+ (conf/)
+ battle_athena.conf C³B
+ help.txt C³B
+ (map/)
+ atcommand.h C³B
+ atcommand.c
+ atcommand() C³B
+ pc.h C³B
+ pc.c
+ pc_allskillup() ’ljÁB
+ (doc/)
+ conf_ref.txt C³B
+ help.txt C³B
+
+--------------------
+//0778 by huge
+
+EƒXƒyƒ‹ƒuƒŒƒCƒJ[‚ÌC³
+ EƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚Ì–³‚¢ƒXƒLƒ‹‚É‚ÍŒø‚©‚È‚¢‚悤‚ÉC³B
+ EŽg—p‚³‚ꂽ‘ŠŽè‚ÌÁ”ïSP‚ÌC³B
+
+ (map/)
+ skill.c
+ skill_castend_nodamage_id() C³B
+
+--------------------
+//0777 by ‚Ò‚´‚Ü‚ñ
+
+EƒMƒ‹ƒhUé퉼ŽÀ‘•
+@EŠî–{“I‚È•”•ª‚¾‚¯‚µ‚©ŽÀ‘•‚µ‚Ä‚È‚¢ãA‚¢‚­‚‚©‚Ì“_‚Å–{ŽI‚Æ‘Šˆá‚ª‚ ‚è‚Ü‚·B
+@EUéíŠJŽn‚ÆI—¹‚Í@ƒRƒ}ƒ“ƒh‚Ås‚¢‚Ü‚·
+ @gvgstart : UéíŠJŽn
+ @gvgend : UéíI—¹
+@Ebattle_athena.conf‚É€–ڒljÁB
+ (char/)
+ int_guild.c
+ inter_guild_init()Ainter_guild_readdb()Ainter_guild_save() C³B
+ inter_castle_save_sub()Amapif_guild_castle_info() ’ljÁB
+ mapif_guild_change_castle()Amapif_parse_GuildCastleInfo() ’ljÁB
+ mapif_parse_GuildChangeCastle() ’ljÁB
+ inter.c
+ inter_config_read() C³B
+ inter_send_packet_length[]Ainter_recv_packet_length[] C³B
+ int_guild.h C³B
+ (map/)
+ atcommand.c
+ atcommand()Aatcommand_config_read() C³B
+ battle.c
+ battle_config_read() C³B
+ guild.c
+ guild_castle_search()Aguild_read_castledb()’ljÁB
+ do_init_guild() C³B
+ guild_gvg_init()Aguild_gvg_final()Aguild_gvg_final_sub() ’ljÁB
+ guild_gvg_eliminate()Aguild_gvg_eliminate_sub() ’ljÁB
+ guild_gvg_eliminate_timer()Aguild_gvg_empelium_pos() ’ljÁB
+ guild_gvg_break_empelium() ’ljÁB
+ intif.c
+ intif_parse()Apacket_len_table[] C³B
+ intif_parse_GuildCastleInfo()Aintif_parse_GuildCastleChange() ’ljÁB
+ intif_guild_castle_info()Aintif_guild_castle_change() ’ljÁB
+ mob.c
+ mob_damage() C³B
+ atcommand.h C³B
+ battle.h C³B
+ guild.h C³B
+ intif.h C³B
+ mob.h C³B
+ (common/)
+ mmo.h C³B
+ (conf/)
+ battle_athena.conf C³B
+ inter_athena.conf C³B
+ msg_athena.conf C³B
+ atcommand_athena.conf C³B
+ (db/)
+ castle_db.txt ’ljÁB
+--------------------
+//0776 by Ž€_
+
+ENPCƒXƒLƒ‹›z‰»ŽÀ‘•B(mob_skill_db.txt‚Ìval1‚ðŽg‚¢‚Ü‚·B)
+Emob_skill_db.txt‚ÌŠm—¦‚ð番—¦‚©‚ç–œ•ª—¦‚É•ÏXB(‚½‚¾mob_skill_db.txt‚ÌC³‚Í‚µ‚Ä‚Ü‚¹‚ñB)
+Eƒ‚ƒ“ƒXƒ^[‚ªƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚·‚é–â‘èC³B(C³‚³‚ꂽ‚©‚Ç‚¤‚©‚ÌŽ©M‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (db/)
+ mob_skill_db.txt C³B
+ skill_db.txt C³B
+ (map/)
+ map.h C³B
+ mob.h C³B
+ mob.c
+ mob_spawn_dataset()Amob_spawn() C³B
+ mob_changestate()Amobskill_use() C³B
+ mob_class_change() ’ljÁB
+ npc.c
+ npc_parse_mob() C³B
+ battle.c
+ battle_check_target() C³B
+ clif.h C³B
+ clif.c
+ clif_mob_class_change() ’ljÁB
+ skill.c
+ skill_castend_nodamage_id() C³B
+
+--------------------
+//0775 by Ž€_
+
+EƒV[ƒYƒ‚[ƒh‚̈—C³B
+EƒV[ƒYƒ‚[ƒh‚Ì–³“GŽžŠÔ‚ÌŠÔ‚Í‚Ç‚ñ‚ÈUŒ‚‚àŽó‚¯‚È‚¢‚悤‚ÉC³B
+EƒV[ƒYƒ‚[ƒh‚Ì–³“GŽžŠÔ‚ªŽžŠÔØ‚ê‚É‚È‚é‘O‚ɂ͉𜂳‚ê‚È‚¢‚悤‚ÉC³B
+Ebattle_athena.conf‚É€–ڒljÁB
+E@hide‚â/hide‚É‚æ‚éGMƒnƒCƒfƒBƒ“ƒO’†‚ÍŽ©•ª‚ÉŽ©“®Žg—p‚³‚ê‚éƒXƒLƒ‹ˆÈŠO‚̃XƒLƒ‹Žg—p‚âUŒ‚‚ðŽó‚¯‚È‚¢‚悤‚ÉC³B
+EƒnƒCƒfƒBƒ“ƒO’†’n‘®«ƒXƒLƒ‹ˆÈŠO‚ÌUŒ‚‚ðŽó‚¯‚È‚¢‚悤‚ÉC³B(ƒgƒ‰ƒbƒv‚âƒNƒ@ƒOƒ}ƒCƒA“™‚̃XƒLƒ‹‚͉e‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©•s–¾‚È‚Ì‚Å¡‚Ü‚Å‚Æ“¯‚¶‚悤‚ɉe‹¿‚ðŽó‚¯‚é‚悤‚Ɉ—B)
+Eƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu‚̈ړ®‘¬“x‚ð–{ŽI‚ɇ‚킹‚Ü‚µ‚½B
+E‚»‚Ì‘¼ƒoƒOC³‚âׂ©‚¢C³B(–w‚Ç–¢ƒeƒXƒg)
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_check_target()Abattle_calc_damage() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_calc_misc_attack() C³B
+ battle_config_read()Abattle_weapon_attack() C³B
+ pc.h C³B
+ pc.c
+ do_init_pc()Apc_authok() C³B
+ pc_attack()Apc_attack_timer() C³B
+ pc_setgvg_ghosttimer()Apc_delgvg_ghosttimer()‚ð
+ pc_setgvginvincibletimer()Apc_delgvginvincibletimer()‚ÉC³B
+ pc_gvg_invincible_timer() ’ljÁB
+ pc_attack_timer()Apc_steal_item()Apc_calcstatus() C³B
+ clif.c
+ clif_parse_ActionRequest()Aclif_parse_UseItem() C³B
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+ clif_parse_UseSkillMap()Aclif_parse_WalkToXY() C³B
+ map.h C³B
+ map.c
+ map_quit() C³B
+ mob.c
+ mob_attack()Amob_target()Amob_ai_sub_hard_activesearch() C³B
+ mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
+ mob_damage()Amobskill_castend_id()Amobskill_castend_pos() C³B
+ skill.c
+ skill_castend_damage_id()Askill_attack() C³B
+ skill_castend_id()Askill_castend_pos()Askill_castend_map() C³B
+
+--------------------
+//0774 by Ž‚Žqo^.^o
+EMonk job bouns C³
+EƒhƒPƒr C³
+(db/)
+ job_db2.txt C³
+ pet_db.txt C³
+
+--------------------
+//0773 by ¹
+
+Eׂ©‚¢ƒoƒOC³
+ (map/)
+ skill.c C³B
+ battle.c C³B
+
+--------------------
+//0772 by ‚Ò‚´‚Ü‚ñ
+
+EƒV[ƒYƒ‚[ƒh‰º‚ňȉº‚Ì“_‚ðC³
+@E˜A‘±‚µ‚ÄUŒ‚‚Å‚«‚È‚­‚È‚Á‚Ä‚¢‚½ƒoƒOC³
+@Eƒ_ƒ[ƒWŒyŒ¸—¦‚ª³‚µ‚­Ý’è‚Å‚«‚È‚©‚Á‚½ƒoƒOC³
+@E–³“GŽžŠÔŽÀ‘•Bbattle_athena.conf‚Ìgvg_ghost_time‚ÅÝ’è‚Å‚«‚Ü‚·
+
+EƒnƒCƒfƒBƒ“ƒO‚Å–‚–@UŒ‚“™‚ð‰ñ”ð‚Å‚«‚È‚©‚Á‚½ƒoƒOC³
+
+ (map/)
+ skill.c
+ skill_attack()Askill_unit_onplace()Askill_check_condition() C³B
+ clif.c
+ clif_parse_ActionRequest()Aclif_parse_UseItem() C³B
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+ clif_parse_UseSkillMap()Aclif_parse_WalkToXY() C³B
+ pc.c
+ do_init_pc()Apc_authok() C³B
+ pc_attack()Apc_attack_timer() C³B
+ pc_setgvg_ghosttimer()Apc_delgvg_ghosttimer() ’ljÁB
+ pc_gvg_ghost_timer() ’ljÁB
+ map.c
+ map_quit() C³
+ battle.c
+ battle_config_read()Abattle_weapon_attack() C³B
+ battle.h C³B
+ pc.h C³B
+
+--------------------
+//0771 by huge
+
+EƒXƒyƒ‹ƒuƒŒƒCƒJ[ŽÀ‘•
+ (map/)
+ skill.c
+ skill_castend_nodamage_id() C³B
+ (db/)
+ skill_db.txt C³B
+
+--------------------
+//0770 by ¹
+
+E” Œn‚̈—•ÏX
+E‚»‚Ì‘¼ƒoƒOC³
+ (map/)
+ battle.c C³B
+ itemdb.c C³B
+ mob.c C³B
+ script.c C³B
+
+--------------------
+//0769 by Ž€_
+
+EƒV[ƒYƒ‚[ƒhC³B
+E–³“GŽžŠÔ‚Ì•û‚Íghost_timerˆÈŠO‚Ì•û–@‚ÅŽÀ‘•‚·‚é‚‚à‚è‚È‚Ì‚Å¡‚Í휂µ‚Ä‚¢‚Ü‚·B
+EƒXƒNƒŠƒvƒgviewpoint‚ª³‚µ‚­“®ì‚µ‚È‚¢–â‘èC³B
+Eproduce_db.txt‚ðC³B(“û”«‚Ískill_require_db.txt‚ň—‚µ‚Ä‚¢‚Ü‚·B‚»‚µ‚ăAƒCƒeƒ€‚Ì”‚ð0‚É‚·‚ê‚ÎÁ–Õ‚Í‚³‚ê‚È‚¢‚¯‚Çì‚鎞•K—v‚ȃAƒCƒeƒ€‚É‚È‚è‚Ü‚·B)
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ produce_db.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_calc_damage()Abattle_calc_weapon_attack() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_calc_misc_attack()Abattle_check_target()Abattle_config_read() C³B
+ skill.c
+ skill_unit_onplace()Askill_castend_damage_id()Askill_castend_id() C³B
+ skill_use_id()Askill_use_pos()Askill_check_condition() C³B
+ skill_can_produce_mix() C³B
+ pc.c
+ pc_attack_timer()Apc_attack()Apc_isUseitem()Apc_delitem() C³B
+ pc_damage() C³B
+ mob.c
+ mob_damage()Amobskill_use_id()Amobskill_use_pos() C³B
+ script.c
+ buildin_viewpoint()Abuildin_emotion() C³B
+ makefile C³B
+
+--------------------
+//0768 by ‚Ò‚´‚Ü‚ñ
+
+EƒV[ƒYƒ‚[ƒh‰º‚ÅAˆÈ‰º‚Ì“_‚ðC³
+@EŽ€–S‚µ‚½‚çƒZ[ƒuƒ|ƒCƒ“ƒg‚É‹­§‘—ŠÒ‚·‚é‚悤‚ÉC³
+@E“Á’è‚̃AƒCƒeƒ€‚ªŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³(ƒAƒ“ƒeƒBƒyƒCƒ“ƒƒ“ƒgEƒnƒG‚̉H)
+@E“Á’è‚̃XƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³(ƒ[ƒvƒ|[ƒ^ƒ‹EƒoƒbƒNƒXƒeƒbƒvEƒCƒ“ƒeƒBƒ~ƒfƒCƒgEƒeƒŒƒ|[ƒgEƒCƒ“ƒfƒ…ƒA)
+@E“¯–¿ƒMƒ‹ƒh‚É‚Í–³ðŒ‚ÅUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³
+@E“G‘΃Mƒ‹ƒh‚É‚Í–³ðŒ‚ÅUŒ‚‚Å‚«‚é‚悤‚ÉC³
+@E–³“GŽžŠÔ’†‚Í—¼ŽÒ‚Æ‚àUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³
+
+ƒ\[ƒXƒŒƒxƒ‹‚ŃeƒŒƒ|AƒnƒG‚ÌŽg—p‚ð‹Ö‚¶‚Ä‚¢‚邽‚ßUéíMAP‚Ìmapflag‚Énoteleport‚Í•K—v‚ ‚è‚Ü‚¹‚ñ
+‚Ü‚½A–³“GŽžŠÔ‚Íghost_timerˆË‘¶‚Å‚·B‚‚܂èbattle_athena.conf“à‚Ìghost_time‚ª–³“GŽžŠÔ‚É‚È‚è‚Ü‚·
+
+ (map/)
+ skill.c
+ skill_castend_damage_id()Askill_castend_id() C³
+ skill_check_condition() C³
+ pc.c
+ pc_damage() C³
+ battle.c
+ battle_weapon_attack() C³
+
+--------------------
+//0767 by huge
+
+Eƒtƒ@[ƒ}ƒV[‚ÅA»‘¢‚Ì‘‚ªŒ¸‚é–â‘è‚ðC³
+E•Ší»‘¢DB‚ÅA‚¢‚­‚‚©”²‚¯‚Ä‚¢‚½‚Ì‚ðC³
+
+ (map/)
+ skill.c C³B
+ (db/)
+ produce_db.txt C³B
+
+--------------------
+//0766 by ‚Ò‚´‚Ü‚ñ
+
+EƒV[ƒYƒ‚[ƒh‰º‚ÅAˆÈ‰º‚Ì“_‚ðC³
+@E³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃGƒ“ƒyƒŠƒEƒ€‚ÉUŒ‚‚ªŒø‚©‚È‚¢‚悤‚ÉC³
+@EƒGƒ“ƒyƒŠƒEƒ€‚ɑ΂·‚éƒXƒLƒ‹UŒ‚‚ªŒø‚©‚È‚¢‚悤‚ÉC³
+@E–‚–@UŒ‚A‰“‹——£UŒ‚A㩂̃_ƒ[ƒW•â³‚ðŽÀ‘•
+@@–‚–@UŒ‚F50%@‰“‹——£UŒ‚F75%@ã©F60%
+@@‚±‚ê‚Íl‚É‚àƒGƒ“ƒyƒŠƒEƒ€‚É‚à“K—p‚³‚ê‚Ü‚·
+ (map/)
+ battle.c
+ #include "guild.h" ’ljÁ
+ battle_calc_damage()Abattle_calc_weapon_attack() C³
+
+--------------------
+//0765 by ‚Ò‚´‚Ü‚ñ
+
+E‘•”õ§ŒÀŽÀ‘•
+E‘•”õ§ŒÀ‚ª‚©‚©‚Á‚½‘•”õ•i‚ÍŠY“–ƒ}ƒbƒv‚Ɉړ®‚µ‚½Û‚ÉŽ©“®“I‚É‘•”õ‚ªŠO‚êA
+@Ä‘•”õ‚à‚Å‚«‚È‚­‚È‚è‚Ü‚·
+E§ŒÀ‚Å‚«‚é‚Ì‚Í‘•”õ•i‚Ì‚Ý‚Å‚·BƒJ[ƒh—ނͧŒÀ‚Å‚«‚Ü‚¹‚ñ
+ (db/)
+ item_noequip.txt ’ljÁ
+ (map/)
+ itemdb.h C³
+ itemdb.c
+ do_init_itemdb()Aitemdb_search() C³
+ itemdb_read_noequip ’ljÁ
+ pc.c
+ pc_checkitem()Apc_isequip() C³
+
+--------------------
+//0764 by Ž€_
+
+E‘S‚Ẵ_ƒ[ƒW‚ª1‚É‚È‚é–hŒä‚ð10000‚©‚ç1000000‚É•ÏXB
+Ebattle_athena.conf‚É€–ڒljÁB
+Eƒ‚ƒ“ƒXƒ^[‚©‚çŒoŒ±’l‚ð–Ⴄˆ—‚ð–{ŽI‚̂悤‚ÉC³B
+EƒXƒLƒ‹ƒXƒ[ƒ|ƒCƒYƒ“ŽÀ‘•B
+EŒðŠ·ƒoƒOC³B
+E‚»‚Ì‘¼×‚©‚¢C³B
+EƒeƒXƒg‚Í–w‚Ç‚µ‚Ä‚Ü‚¹‚ñB
+ (db/)
+ mob_db.txt C³B
+ skill_db.txt C³B
+ (doc/)
+ conf_ref.txt C³B
+ db_ref.txt C³B
+ (conf/)
+ battle_athena.conf C³B
+ (map/)
+ makefile C³B
+ battle.h C³B
+ battle.c
+ battle_get_def()Abattle_get_mdef() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_calc_misc_attack()Abattle_config_read() C³B
+ skill.h C³B
+ skill.c
+ skill_castend_nodamage_id()Askill_castend_damage_id() C³B
+ skill_check_condition()Askill_status_change_timer() C³B
+ skill_status_change_end()Askill_status_change_start() C³B
+ skill_additional_effect()Askill_produce_mix()Askill_unit_timer_sub() C³B
+ skill_check_unit_sub()‚ð skill_check_unit_range_sub()‚É•ÏXB
+ skill_check_unit_range() ’ljÁB
+ skill_castend_pos()Askill_area_sub_count() C³B
+ mob.c
+ mobskill_castend_pos()Amob_damage() C³B
+ clif.c
+ clif_parse_TradeRequest()Aclif_parse_TradeAck() C³B
+ clif_parse_TradeAddItem()Aclif_parse_TradeOk() C³B
+ clif_parse_TradeCansel()Aclif_parse_TradeCommit() C³B
+ map.h C³B
+ map.c
+ do_init() C³B
+ pc.c
+ pc_calc_skilltree()Apc_calcstatus() C³B
+ tarde.c
+ trade_tradeack() C³B
+
+--------------------
+//0763 by ŒÓ’±—–
+
+EƒT[ƒo[snapshot
+ ƒtƒHƒ‹ƒ_‚ð®—‚µ‚½‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ ˆÈ‘O‚̃Z[ƒuƒf[ƒ^(account.txt‚È‚Ç)‚ÍsaveƒtƒHƒ‹ƒ_‚É’u‚¢‚Ä‚­‚¾‚³‚¢
+ cnfƒtƒ@ƒCƒ‹‚ÍŠeŽíƒtƒ@ƒCƒ‹‚̃pƒX‚ª•Ï‚í‚Á‚Ä‚é‚Ì‚ÅA
+ ‚±‚̌¢‚à‚Ì‚ðƒRƒs[‚Å‚Í‚È‚­AV‚µ‚­‘‚«Š·‚¦‚È‚¨‚µ‚Ä‚­‚¾‚³‚¢B
+
+EƒtƒHƒ‹ƒ_®—
+ confƒtƒHƒ‹ƒ_
+ NPCŠÖ˜A‚ðconf/npc/AMOB”z’uŠÖ˜A‚ðconf/mob/AWARPŠÖ˜A‚ðconf/warp/
+ ƒeƒXƒg‚âƒTƒ“ƒvƒ‹‚ðconf/sample/‚Ɉړ®‚µ‚Ü‚µ‚½B
+ dbƒtƒHƒ‹ƒ_
+ sampleƒtƒHƒ‹ƒ_‚Ì‚¤‚¿dbŠÖŒW‚ð db/sample‚Ɉړ®‚µ‚Ü‚µ‚½B
+ help.txt/motd.txt
+ confƒtƒHƒ‹ƒ_‚Ɉړ®‚µ‚Ü‚µ‚½
+ account.txt/athena.txt/guild.txt/party.txt/pet.txt/storage.txt
+ saveƒtƒHƒ‹ƒ_‚Ɉړ®‚µ‚Ü‚µ‚½
+ tool/backup
+ ƒpƒXC³
+
+Emotd.txt/help.txt‚̃pƒX‚ðmap_athena.cnf‚ÅŽw’è‚Å‚«‚é‚悤‚É
+ map.h/map.c/atcommand.c/atcommand.hC³
+
+Eathena-start‚ÉrestartƒIƒvƒVƒ‡ƒ“’ljÁ
+ ./athena-start restart‚ÅAthena‚ðÄ‹N“®‚µ‚Ü‚·
+
+--------------
+//0761 by ‚Û‚Û‚Û
+
+EMOB‚ÌMDEF‚É10000ˆÈãŽw’肵‚Ä‚àƒtƒ@ƒCƒAƒsƒ‰[‚Å•’ʂɃ_ƒ[ƒW‚ð—^‚¦‚Ä‚µ‚Ü‚¤‚Ì‚ðC³B
+ (map/)
+ battle.c
+
+--------------
+//0760 by ll3y
+
+E•¶Žš‰»‚¯C³
+ (map/)
+ script.c
+
+--------------
+//0759 by Ž‚Žqo^.^o
+EƒXƒsƒAƒNƒCƒbƒPƒ“ C³
+EDancer skill tree C³
+(db/)
+ cast_db.txt C³
+ skill_tree.txt C³
+
+--------------
+//0758 by hack
+EPut GM messages into msg_table which is loaded from msg_athena.conf.
+(Easy to translate into other language)
+ (map/)
+ atcommand.h
+ atcommand.c
+ msg_conf_read() Read conf/msg_athena.conf
+ Put messages into msg_table which is loaded from msg_athena.conf.
+ map.c
+ do_init()
+ (conf/)
+ msg_athena.conf Store the message of atcommand, easy to translate into other language.
+
+--------------
+//0757 by Michael
+ (map/)
+ script.c
+ buildin_viewpoint()
+ Fix packet sequence of viewpoint command.
+
+--------------
+//0756 by ll3y
+
+EInterix(Windows Services for Unix 3.5)‚ŃRƒ“ƒpƒCƒ‹‚ª’Ê‚é‚悤‚ÉC³
+ Interop Systems(http://www.interopsystems.com/)‚æ‚ègmake‚Æzlib‚ðŽæ‚Á‚Ä‚­‚é‚©A
+ Ž©‘O‚ÅInterix—p‚ð—pˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
+ (common/)
+ socket.h C³B
+
+--------------
+//0755 by Ž€_
+
+EƒoƒOC³‚Æà–¾’ljÁB(•ñ‚³‚ꂽ‚Ì‚Í‘½•ª‘S‚ÄC³‚³‚ꂽ‚Ì‚©‚Æ...)
+E0751‚ŃXƒLƒ‹‚Ìő僌ƒxƒ‹‚ð100‚Ü‚ÅÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
+Ecast_db.txt‚É“ü‚Á‚Ä‚¢‚éó‘ÔˆÙí‚̈ێŽžŠÔ‚ÍŽ©•ª‚ª“K“x‚É“ü‚ꂽ•¨‚Å‚·B–{ŽI‚ÌŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñ‚Ì‚ÅB
+ (doc/)
+ db_ref.txt C³B
+ (db/)
+ cast_db.txt C³B
+ skill_db.txt C³B
+ (map/)
+ skill.h C³B
+ skill.c
+ skill_check_unit_sub()Askill_castend_id()Askill_use_id() C³B
+ skill_status_change_end()Askill_status_change_start() C³B
+ skill_castend_map() C³B
+ mob.c
+ mobskill_castend_id()Amobskill_castend_pos() C³B
+ pc.c
+ pc_calcstatus() C³B
+ battle.c
+ battle_calc_pc_weapon_attack()
+ battle_calc_mob_weapon_attack()
+ battle_calc_magic_attack()
+
+--------------
+//0754 by Ž‚Žqo^.^o
+(db/)
+ cast_db.txt C³
+
+--------------
+//0753 by ¹
+
+EIW‚Ì”­¶ƒ|ƒCƒ“ƒg‚ðŽw’è‚·‚é‚ƃƒeƒI‚̃GƒtƒFƒNƒg‚ªˆêØo‚È‚­‚È‚é
+@–â‘肪•œŠˆ‚µ‚Ä‚¢‚½‚Ì‚ÅC³B
+Ewarning‚ðo‚È‚¢‚悤‚ɃR[ƒhC³B
+ (map/)
+ skill.c
+ skill_castend_pos2() C³B
+ chrif.h
+
+--------------
+//0752 by ‚Ò‚´‚Ü‚ñ
+
+EchangesexƒXƒNƒŠƒvƒgŽÀ‘•B«•Ê‚𔽓]‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·
+@«•Ê”½“]¬Œ÷Œã‚ÍA‚»‚̃vƒŒƒCƒ„[‚Í‹­§“I‚ÉÚ‘±‚ðØ’f‚³‚ê‚Ü‚·
+@‚Ü‚½Aƒ_ƒ“ƒT[Eƒo[ƒh‚̌݊·«‚Í‚©‚È‚è‰ö‚µ‚¢‚Å‚·
+@ƒ_ƒ“ƒT[Eƒo[ƒh‚ªƒXƒƒbƒg“à‚Ç‚±‚©‚É‹‚éƒAƒJƒEƒ“ƒg‚Å‚Ì”½“]‚ÍAˆÈ‰º‚Ì“_‚É’ˆÓ‚µ‚ĉº‚³‚¢
+@E•K‚¸”½“]‚³‚¹‚é‘O‚É‚»‚̃Lƒƒƒ‰ƒNƒ^[‚ðƒXƒLƒ‹ƒŠƒZƒbƒg‚µ‚Ä‚­‚¾‚³‚¢
+@@‚»‚Ì‚Ü‚Ü”½“]‚³‚¹‚é‚ÆA‹¤’Ê‚·‚éƒXƒLƒ‹(ŠyŠí‚Ì—ûK“™)‚µ‚©Žc‚ç‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·
+@Eƒ_ƒ“ƒT[Eƒo[ƒhê—p•Ší‚ð‘•”õ‚µ‚Ä‚¢‚éꇂÍAŠO‚µ‚Ä‚©‚甽“]‚³‚¹‚Ä‚­‚¾‚³‚¢
+@@‚»‚Ì‚Ü‚Ü”½“]‚³‚¹‚é‚ÆA‚»‚̃Lƒƒƒ‰ƒNƒ^[‚ÌŠJŽnŽž‚É
+@@ƒNƒ‰ƒCƒAƒ“ƒgƒGƒ‰[‚ªo‚Ü‚·io‚邾‚¯‚ÅA—Ž‚¿‚邱‚Æ‚Í‚È‚¢‚Ì‚Å‚·‚ªcj
+Eƒf[ƒ^ƒx[ƒXC³ by Ž‚Žqo^.^o
+ (map/)
+ chrif.c
+ packet_len_table[]Achrif_parse()C³
+ chrif_changesex()Achrif_changedsex()’ljÁ
+ chrif.h C³
+ (char/)
+ char.c
+ parse_frommap()Aparse_tologin()C³
+ (login/)
+ login.c
+ parse_fromchar()C³
+ (db/)
+ cast_db.txt C³
+ skill_require_db.txt C³
+
+--------------
+//0751 by Ž€_
+
+Eskill_db.txt‚Æcast_db.txt‚Ì•ÏX‚Æskill_require_db.txt‚̒ljÁB
+E“Å‚É‚©‚©‚é‚ÆHP‚ªŒ¸‚é‚悤‚É•ÏXBHP‚Í1•b‚ÉÅ‘åHP‚Ì1%Œ¸‚è‚Ü‚·B(–¢ƒeƒXƒg)
+EΉ»‚ðis’†‚Ì•¨‚ÆŠ®‘S‚È•¨‚É•ª‚¯‚ÄHP‚ªŒ¸‚é‚悤‚É•ÏXB(1•b‚ÉÅ‘åHP‚Ì1%)ƒuƒŒƒbƒVƒ“ƒO‚ÅŠ®‘SΉ»‚¾‚¯Ž¡‚¹‚é‚悤‚ÉC³B(–¢ƒeƒXƒg)
+Eƒnƒ“ƒ^[‚̃gƒ‰ƒbƒv‚ɃGƒtƒFƒNƒgŽÀ‘•B‚½‚¾ƒ‰ƒ“ƒhƒ}ƒCƒ“‚ƃVƒ‡ƒbƒNƒEƒF[ƒu‚Í”š”­ƒGƒtƒFƒNƒg‚ªo‚È‚¢‚悤‚Å‚·Bƒ‰ƒ“ƒhƒ}ƒCƒ“‚̓tƒ@ƒCƒAƒsƒ‰[‚Ì”š”­ƒGƒtƒFƒNƒg‚ªo‚é‚悤‚É•Ï‚¦‚Ä‚¢‚Ü‚·B
+EƒI[ƒgƒJƒEƒ“ƒ^[‚Ì•ûŒüƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚É•ÏX‚Æ–{ŽIŽd—l‚ɇ‚킹‚Ü‚µ‚½B
+EƒoƒbƒNƒXƒ^ƒu‚à•ûŒüƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚É•ÏXB
+EƒCƒ“ƒeƒBƒ~ƒfƒCƒg‚̈—•ÏXB
+EƒfƒBƒtƒFƒ“ƒ_[‚̈ړ®‘¬“xŒ¸­‚ð–{ŽI‚ɇ‚킹‚Ü‚µ‚½BASPD‚ÍŸŽè‚È‚ª‚ç
+(30 - (skilllv*5))%‚ªŒ¸‚é‚悤‚É‚µ‚Ü‚µ‚½‚ª–{ŽI‚Å‚¢‚­‚ç’öŒ¸‚é‚Ì‚©‚Ìî•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+Eƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒuLV1‚ňړ®‘¬“x‚ª150‚©‚ç312‚É‚È‚é‚Ì‚ªŠm”F‚³‚ê‚ÄŒvŽZ‚ð•ÏX‚µ‚Ü‚µ‚½‚ªƒŒƒxƒ‹‚É‚æ‚Á‚Ä‚Ç‚ê‚®‚ç‚¢‘‰Á‚·‚é‚©‚Í•s–¾‚Å‚·Bî•ñ‚ð‹‚ß‚Ü‚·B(¡‚ÌŒvŽZŽ®‚Í“K“x‚Éì‚Á‚½•¨‚Å‚·B)
+Eƒ|[ƒVƒ‡ƒ“»‘¢‚ÌŒvŽZŽ®•ÏX‚Æ‚¿‚å‚Á‚ÆC³B
+Eˆê•”’n–ʃXƒLƒ‹‚Ìd‚Ë’u‚«‚ð‹ÖŽ~B
+EbNoMagicDamage‚Å–‚–@‚É‚æ‚éˆÙí‚âƒXƒe[ƒ^ƒXƒAƒbƒvŒø‰Ê‚ªo‚È‚¢‚悤‚ÉC³B(ƒŠƒUƒŒƒNƒVƒ‡ƒ“ˆÈŠO‚Ì–‚–@‚Í–³Œø‚É‚È‚è‚Ü‚·B)
+Ebattle_athena.conf‚É€–ڒljÁB
+E‚»‚Ì‘¼FX‚ÆC³B
+E•ÏX‚³‚ꂽskill_db.txtAcastdb.txt‚ƒljÁ‚³‚ꂽskill_require_db.txt‚Ì\‘¢‚Í¡‚ÌŠŽ©•ª‚µ‚©’m‚ç‚È‚¢‚Ì‚Ådb_ref.txt‚Éà–¾‚ð’ljÁ‚·‚é—\’è‚È‚Ì‚Å‚»‚ê‚Ü‚Å‚Í‚±‚ê‚ç‚Ì•ÏX‚ÍT‚¦‚Ä‚­‚¾‚³‚¢B
+ (char/)
+ int_guild.c C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ skill_db.txt C³B
+ skill_require_db.txt C³B
+ cast_db.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_counttargeted()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack()Abattle_config_read() C³B
+ skill.h C³B
+ skill.c
+ skill_attack()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_status_change_start() C³B
+ skill_check_condition()Askill_castend_pos() C³B
+ skill_use_id()Askill_use_pos() C³B
+ skill_status_change_timer()Askill_status_change_start() C³B
+ skill_check_unit_sub() ’ljÁB
+ pc.h C³B
+ pc.c
+ pc_damage()Apc_counttargeted()Apc_counttargeted_sub() C³B
+ mob.h C³B
+ mob.c
+ mob_countslave()Amob_counttargeted()Amob_counttargeted_sub() C³B
+ mobskill_use()Amob_can_move()Amob_damage() C³B
+ mobskill_use_id()Amobskill_use_pos()Amobskill_castend_id() C³B
+ mobskill_castend_pos() C³B
+ map.c
+ map_quit() C³B
+
+--------------
+//0750 by CHRIS
+
+EƒXƒLƒ‹ŠÖŒW‚ÌDB‚ð’²®
+ (db/)
+ skill_db.txt
+ cast_db.txt
+ skill_require_db.txt
+
+--------------
+//0749 by Ž€_
+
+EFX‚Æ•ÏX‚ÆC³B
+EƒXƒLƒ‹‚ÌŽd—l•ÏX‚âŽÀ‘•Aó‘ÔˆÙí‚ÌŽd—l•ÏX‚âŽÀ‘•B
+EƒXƒLƒ‹‚ÌŽg—pðŒ‚ðdb‚ÉÝ’è‚Å‚«‚é‚悤‚É•ÏXB
+Eskill_db.txt‚Æcast_db.txt‚ÌŽd—l•ÏXB
+Eƒ}ƒbƒvŽI‚Ì–³ŒÀƒ‹[ƒv‰Â”\«‚ª‚ ‚é•”•ª‚ðC³B(‚ ‚­‚Ü‚Å‚à‰Â”\«‚ª
+‚ ‚Á‚½‚¾‚¯‚Ì•¨‚Å‚·B–³ŒÀƒ‹[ƒv‚ÌŒ´ˆö‚Æ‚Í’fŒ¾‚Å‚«‚Ü‚¹‚ñB)
+Eƒgƒ‰ƒbƒv‚Ì”­“®ŽÀ‘•B(‚½‚¾ŽÀÛ‚É“®ì‚Í‚Ü‚¾C³‚µ‚Ä‚¢‚Ü‚¹‚ñB
+Œ©‚½–Ú‚ª•Ï‚í‚Á‚½‚¾‚¯‚Å‚·B)
+Ebattle_athena.conf‚É€–ڒljÁ‚ðíœB
+E0748‚ÌC³íœ‚Æ•¶Žš‰»‚¯C³B
+Eskill_db.txtAcast_db.txtAskill_require_db.txt‚Ì•û‚ª‚Ü‚¾Š®¬‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Å
+‚©‚È‚è‚̗ʂ̃XƒLƒ‹‚ª³‚µ‚­“®ì‚µ‚Ü‚¹‚ñB(db_ref.txt‚ÉÝ’è•û–@‚ð“ü‚ê‚È‚¢‚Æ
+ ‚¯‚È‚¢‚Ì‚Å‚·‚ªŽžŠÔ‚ª‚È‚©‚Á‚½‚Ì‚Å...) ‚»‚µ‚ÄC³‚Í‚µ‚Ü‚µ‚½‚ªƒeƒXƒg‚Í
+–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ (char/)
+ char.c C³B
+ int_party.h C³B
+ int_party.c C³B
+ int_guild.h C³B
+ int_guild.c C³B
+ int_pet.h C³B
+ int_pet.c C³B
+ int_storage.h C³B
+ int_storage.c C³B
+ char‚Ì•û‚͑債‚½C³‚Í‚µ‚Ä‚Ü‚¹‚ñB
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (db/)
+ skill_db.txt C³B
+ cast_db.txt C³B
+ skill_require_db.txt ’ljÁB
+ produce_db.txt C³B
+ (map/)
+ map.h C³B
+ map.c
+ map_check_dir() ’ljÁB
+ map_readmap()Amap_addblock()Amap_delblock() C³B
+ map_foreachinarea()Amap_foreachinmovearea() C³B
+ map_addflooritem() C³B
+ pc.h C³B
+ pc.c
+ pc_spiritball_timer()Apc_addspiritball()Apc_delspiritball() C³B
+ pc_steal_item()Apc_steal_coin()Apc_calcstatus() C³B
+ pc_checkallowskill()Apc_jobchange()Apc_checkweighticon() C³B
+ pc_damage()Apc_equipitem()Apc_walk()Apc_stop_walking() C³B
+ pc_authok()Apc_counttargeted()Apc_counttargeted_sub() C³B
+ pc_damage()Apc_setpos() C³B
+ skill.h C³B
+ skill.c
+ skill_get_range()Askill_get_sp()Askill_get_num() C³B
+ skill_get_cast()Askill_get_delay() C³B
+ skill_get_hp()Askill_get_zeny()Askill_get_time() ’ljÁB
+ skill_get_time2()Askill_get_weapontype() ’ljÁB
+ skill_get_unit_id()Askill_blown()Askill_additional_effect() C³B
+ skill_attack()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id()Askill_castend_id() C³B
+ skill_castend_pos()Askill_unit_onplace() C³B
+ skill_unit_timer_sub_onplace()Askill_unitsetting() C³B
+ skill_use_id()Askill_use_pos()Askill_check_condition() C³B
+ skill_status_change_end()Askill_status_change_timer() C³B
+ skill_status_change_start()Askill_can_produce_mix() C³B
+ skill_produce_mix()Askill_gangsterparadise() C³B
+ skill_gangster_out()Askill_gangster_in() C³B
+ skill_gangster_count() ’ljÁB
+ skill_readdb() C³B
+ battle.h C³B
+ battle.c
+ distance()Abattle_counttargeted()Abattle_get_range() ’ljÁB
+ battle_get_dir() ’ljÁB
+ battle_get_maxhp()Abattle_get_str()Abattle_get_agi() C³B
+ battle_get_vit()Abattle_get_dex()Abattle_get_int() C³B
+ battle_get_luk()Abattle_get_flee()Abattle_get_hit() C³B
+ battle_get_flee2()Abattle_get_critical()Abattle_get_baseatk() C³B
+ battle_get_atk()Abattle_get_atk2()Abattle_get_def() C³B
+ battle_get_def2()Abattle_get_mdef()Abattle_get_speed() C³B
+ battle_get_adelay()Abattle_get_amotion()Abattle_get_party_id() C³B
+ battle_get_guild_id()Abattle_get_size() C³B
+ battle_check_undead() ’ljÁB
+ battle_check_target()Abattle_addmastery() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
+ clif.h C³B
+ clif.c
+ clif_skillinfo()Aclif_skillinfoblock()Aclif_skillup() C³B
+ clif_item_skill()Aclif_changeoption()Aclif_parse_LoadEndAck() C³B
+ clif_01ac() ’ljÁB
+ clif_parse_WalkToXY()Aclif_parse_ActionRequest() C³B
+ clif_parse_TakeItem()Aclif_parse_DropItem() C³B
+ mob.h C³B
+ mob.c
+ mobskill_castend_id()Amobskill_castend_pos() C³B
+ mobskill_use_id()Amobskill_use_pos()Amob_heal() C³B
+ mob_spawn()Amob_damage()Amob_walk() C³B
+ mob_stop_walking()Amob_warp()Amob_counttargeted() C³B
+ mob_counttargeted_sub()Amob_countslave() C³B
+ mob_attack()Amob_target()Amob_ai_sub_hard_activesearch() C³B
+ mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
+ script.c
+ buildin_sc_start() C³B
+ path.c
+ can_move() C³B
+ pet.c
+ pet_data_init()Apet_stop_walking() C³B
+ npc.c
+ npc_parse_warp()Anpc_parse_shop()Anpc_parse_script() C³B
+
+--------------
+//0748 by Michael
+ (map/)
+ pc.c
+ pc_walk();
+ Fix Player cannot move in ICEWALL but have Path.
+ mob.c
+ mob_walk();
+ Fix Monster cannot move in ICEWALL but have Path.
+ path.c
+ can_move();
+ Fix Player&Monster cannot move in ICEWALL.
+
+--------------
+//0747 by ¹
+Eƒyƒbƒg‚ªƒGƒ‚‚ðo‚·‚Æmap-server‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚Á‚½–â‘è‚ðC³B
+ (map/)
+ clif_parse_SendEmotion() C³B
+
+--------------
+//0746 by Michael
+ (map/)
+ script.c
+ Add Script command - checkoption(type);
+ Attach a npc_testchkoption.txt npc script!
+
+--------------
+//0745 by ‚Ò‚´‚Ü‚ñ
+EƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒXŽÀ‘•
+EPvPƒGƒŠƒA‚Ìmapflag‚ðC³(“¯Žm“¢‚¿‚ª–³‚­‚È‚Á‚½‚©‚ÆŽv‚¢‚Ü‚·)
+EƒV[ƒYƒ‚[ƒh‚ŃmƒbƒNƒoƒbƒN‚ª‚ ‚Á‚½ƒoƒO‚ðC³
+EƒCƒ“ƒeƒBƒ~‚Ì’x‰„ŽžŠÔ‚ð­‚µ’²®
+ (map/)
+ skill.c
+ skill_attack()Askill_additional_effect()C³
+ skill_gangsterparadise()Askill_gangster_in()Askill_gangster_out()’ljÁ
+ clif.c
+ clif_parse_ActionRequest()C³
+ mob.c
+ mob_target()Amob_attack()C³
+ mob_ai_sub_hard()Amob_ai_sub_hard_mastersearch()C³
+ mob_ai_sub_hard_activesearch()C³
+ map.h C³
+ skill.h C³
+ (conf/)
+ npc_pvp.txt C³
+
+--------------
+//0744 by ¹
+
+EƒAƒCƒXƒEƒH[ƒ‹AƒƒeƒIƒXƒg[ƒ€‚̃Rƒ“ƒ{‚ŃƒeƒIƒXƒg[ƒ€‚̃GƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚È‚­‚È‚é–â‘è‚ðC³B
+EHP‹zŽûƒXƒLƒ‹‚̃GƒtƒFƒNƒgC³B
+Ebattle_athena.conf‚É€–ڒljÁB
+EƒpƒPŽü‚è‚Ìׂ©‚¢C³B
+ (conf/)
+ battle_athena.conf
+ (doc/)
+ conf_ref.txt
+ (map/)
+ battle.c
+ battle.h
+ clif.c
+ pc.c
+ pet.c
+ skill.c
+
+--------------
+//0743 by J
+
+EŽæ‚芪‚«¢Š«‚È‚Ç‚ð–{ŽI‚ÉŽ—‚¹‚éˆ×‚ÌC³B
+@‚ ‚Æ–{ŽI‘ŠˆáƒXƒŒ‚É‚ ‚Á‚½ƒSƒXƒŠƒ“‚ÌŽæ‚芪‚«‚ðC³B
+@ƒfƒŠ[ƒ^[‚Ì‹ó‚Æ’n‚̃XƒLƒ‹‚ª‹t‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³B
+ (db/)
+ mob_skill_db.txt C³
+
+--------------
+//0742 by ‚Ò‚´‚Ü‚ñ
+
+EƒCƒ“ƒeƒBƒ~ƒfƒCƒg‚ðŽÀ‘•
+@UŒ‚‚ƃ[ƒv‚Ì•ª•Ê‚ª‚¤‚Ü‚­‚¢‚©‚È‚©‚Á‚½‚Ì‚Å
+@SC_INTIMIDATE‚ðŽg‚Á‚Ä’x‰„ˆ—‚ð‚µ‚Ü‚µ‚½
+Eskill_db‚̌뎚“™‚ðC³
+ (map/)
+ skill.c
+ skill_additional_effect()Askill_castend_map()C³
+ skill_castend_nodamage_id()AC³
+ skill_status_change_start()Askill_status_change_end()C³
+ map.h C³
+ skill.h C³
+ (db/)
+ skill_db.txt C³
+
+--------------------
+//0741 by whitedog
+
+snapshot
+
+--------------
+//0740 by ‚Û‚Û‚Û
+EPC‚ªMOB‚Ƀ^ƒQ‚ç‚ꂽ‚Æ‚«3•C–Ú‚©‚ç–hŒä‚Ɖñ”ð‚ªŒ¸‚é‚悤‚É‚µ‚½B
+@1•C‚ɂ‚«‰ñ”ð‚Í10%A–hŒä‚Í5%Œ¸‚è‚Ü‚·B
+ (map/)
+ pc.h
+ pc.c
+ pc_counttargeted()Apc_counttargeted_sub()’ljÁ
+ battle.c
+ battle_get_flee()Abattle_get_def()Abattle_get_def2()C³B
+
+--------------
+//0739 by ¹
+Eƒtƒ@ƒCƒA[ƒEƒH[ƒ‹“™‚ÌÝ’uŒnƒXƒLƒ‹‚ª³‚µ‚­•\Ž¦‚³‚ê‚È‚¢–â‘è‚ðC³B
+Eƒ}ƒŠƒ“ƒXƒtƒBƒA‚ªŽ©”š‚·‚é‚ƃTƒ“ƒ_[ƒXƒg[ƒ€“™‚̃_ƒ[ƒW‚ª•\Ž¦‚³‚ê‚È‚­‚È‚é–â‘è‚ðC³B
+EHP‹zŽûŒnƒXƒLƒ‹‚Å“G‚ª‰ñ•œ‚µ‚Ä‚éƒGƒtƒFƒNƒg‚ªo‚é‚悤C³B
+ (map/)
+ skill.c
+ skill_castend_damage_id() C³B
+ battle.c
+ battle_calc_misc_attack() C³B
+ clif.c
+ clif_getareachar_skillunit() C³B
+ clif_skill_setunit() C³B
+
+--------------
+//0738 by ‚Ò‚´‚Ü‚ñ
+EƒXƒg[ƒ€ƒKƒXƒg‚ðŠ®‘S‚É–{ŽIŽd—l‚ÉC³(3‰ñ‚Åâ‘Γ€Œ‹•“€Œ‹ó‘Ô‚Ì“G‚ÍSG‚ð‚­‚ç‚í‚È‚¢)
+EƒTƒtƒ‰ƒMƒEƒ€‚ªŽ©•ª‚É‚©‚¯‚ç‚ê‚éƒoƒOC³
+ (map/)
+ skill.c
+ skill_additional_effect()Askill_attack()C³
+ skill_castend_nodamage_id()C³
+ map.h C³
+
+--------------
+//0737 by ‚Û‚Û‚Û
+EƒAƒ“ƒNƒ‹‚ª•à‚¢‚Ä‚¢‚é“G‚ÉŒø‚©‚È‚¢&•¡”‚Ì“G‚ÉŒø‚­‚Ì‚ðC³B
+ (map/)
+ skill.c
+ skill_unit_onplace()Askill_unit_onout()C³
+ mob.c
+ mob_stop_walking()C³
+
+--------------
+//0736 by ‚Ò‚´‚Ü‚ñ
+Eó‘ÔˆÙí‘Ï«‚ªŒø‰ÊŽžŠÔ‚É‚à‹y‚Ô—l‚ÉC³B”­“®—¦‚Æ“¯—¦‚ÅŒø‰ÊŽžŠÔ‚ªŠ„‚èˆø‚©‚ê‚Ü‚·
+EƒXƒg[ƒ“ƒJ[ƒX‚ÌŒø‰ÊŽžŠÔ‚ð‰i‹v‚©‚çƒ}ƒWƒXƒŒƒeƒ“ƒvƒŒ€‹’‚É
+EUŒ‚‚ðŽó‚¯‚½Žž‚Ƀyƒbƒg‚ÌŽx‰‡UŒ‚‚ðŽó‚¯‚ç‚ê‚È‚¢‚悤C³(ƒRƒƒ“ƒgƒAƒEƒg‚µ‚½‚¾‚¯)
+@‚±‚ê‚ÍVITŒ^‚Ƀyƒbƒg‚ð•t‚¯‚Ä•ú’u‚·‚邾‚¯‚ÅŽ©“®‚ŃŒƒxƒ‹ã‚°‚ª‚Å‚«‚é‚Ì‚ð
+@–h‚®‚½‚ß‚ÌŽb’è“I‚Ȉ’u‚Å‚·
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()Askill_addisional_effect()C³
+ skill_status_change_start()C³
+ pc.c
+ pc_damage() C³
+
+--------------
+//0735 by ‚Û‚Û‚Û
+
+E“G‚ð“|‚µ‚ăŒƒxƒ‹‚ªã‚ª‚Á‚½‚Æ‚«PTŒö•½”͈͂̃`ƒFƒbƒN‚ð‚·‚é‚悤‚É‚µ‚½B
+EƒI[ƒgƒJƒEƒ“ƒ^[‰¼ŽÀ‘•B
+@Œü‚«‚âŽË’öƒ`ƒFƒbƒN‚Í‚µ‚Ä‚¢‚Ü‚¹‚ñB‚Ü‚½ƒ^ƒCƒ~ƒ“ƒO‚ª‚¨‚©‚µ‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+@MOBƒXƒLƒ‹‚Æ‚µ‚ÄŽg‚¤‚Æ‚«‚̓^[ƒQƒbƒg‚ðself‚É‚µ‚Ä‚­‚¾‚³‚¢B
+ (conf/)
+ battle_athena.conf€–ڒljÁ
+ (doc/)
+ conf_refC³
+ (map/)
+ battle.h
+ battle.c
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack()
+ battle_config_read()C³
+ pc.c
+ pc_checkbaselevelup()Apc_attack_timer()C³
+ skill.c
+ skill_castend_nodamage_id()Askill_status_change_start()C³
+ clif.c
+ clif_parse_WalkToXY()C³
+ mob.c
+ mob_attack()C³
+
+--------------
+//0734 by Ž€_
+
+Eplayer_skillup_limit‚̈—C³‚Æׂ©‚¢C³B
+Eplayer_skillup_limit‚ªyes‚Ìê‡skill_tree.txt‚Åݒ肳‚ê‚Ä‚é‚»‚̉ºˆÊE‹Æ‚Ì
+ƒXƒLƒ‹ƒcƒŠ[‚ðŽg‚¢‚Ü‚·‚Ì‚Å‚»‚ÌE‹Æ‚Å‚Í–³‚­‚È‚é‚Í‚¸‚̃XƒLƒ‹‚ªo‚邱‚Æ‚ª
+‚ ‚è‚Ü‚·‚ª‚±‚ê‚ÍŽd—l‚Å‚ ‚èƒoƒO‚Å‚Í‚ ‚è‚Ü‚¹‚ñBƒoƒO•ñ‚³‚ê‚Ä‚à–³Ž‹‚µ‚Ü‚·B
+ (doc/)
+ conf_ref.txt C³B
+ (char/)
+ char.c
+ mmo_char_sync_timer()Ado_init() C³B
+ inter.c
+ inter_init() C³B
+ inter_save_timer() íœB
+ (map/)
+ pc.c
+ pc_calc_skilltree() C³B
+ pc_resetskill() C³B
+
+--------------
+//0733 by Ž€_
+
+EƒoƒOC³‚Æׂ©‚¢C³B
+EŽ€‚ñ‚¾Œã‚É‚·‚®‚ɃZ[ƒuƒ|ƒCƒ“ƒg‚ɖ߂炸‚É‚µ‚΂炭•ú’u‚µ‚Ä‚é‚ÆA
+•ú’u‚µ‚Ă鎞ŠÔ‚É‚æ‚Á‚ÄŒoŒ±’l‚ªŒ¸­‚·‚éƒoƒOC³B(–¢ƒeƒXƒg)
+Emob_availe.txt‚Åݒ肵‚½ƒ‚ƒ“ƒXƒ^[‚Ƀ‚ƒ“ƒXƒ^[î•ñ‚ðŽg‚¤‚¿ˆÆ—Ž‚¿‚·‚é–â‘èC³B
+Ebattle_athena.conf‚É€–ڒljÁB
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ clif.c
+ clif_skill_estimation()Aclif_parse_Restart() C³B
+ pc.c
+ pc_setrestartvalue()Apc_makesavestatus() C³B
+ pc_read_gm_account()Apc_calc_skilltree() C³B
+ pc_calc_skillpoint() ’ljÁB
+ map.c
+ map_quit() C³B
+ mob.c
+ mob_damage() C³B
+ skill.c
+ skill_unit_timer_sub()Askill_unit_timer() C³B
+ battle.h C³B
+ battle.c
+ battle_config_read() C³B
+
+--------------
+//0732 by Kalen
+
+Enpc_town_kafra.txt‚Ì‘S–ÊŒ©’¼‚µ
+ ƒJƒvƒ‰—˜—pŒ”‚Ì”pŽ~
+ ‘qŒÉ—˜—p—¿‚ð–{ŽI(jRO)‚Æ“¯ˆê‰¿Ši‚É’²®
+ ƒJ[ƒgŽg—p—¿‚ð–{ŽI(jRO)‚Æ“¯ˆê‰¿Ši‚É’²®
+ ƒ|ƒCƒ“ƒgŽQÆ•ÏX
+ ƒWƒ…ƒm[‚̃Z[ƒuƒ|ƒCƒ“ƒgC³
+ ƒAƒ}ƒc‚̃Z[ƒuƒ|ƒCƒ“ƒgC³
+
+--------------
+//0731 by ‚Û‚Û‚Û
+
+E•ž‚ÌF‚ð•Û‘¶‚·‚é‚©battle_athena.conf‚Å‘I‘ð‚Å‚«‚é‚悤‚ÉB
+@•¾ŠQ‚ª‚ ‚é‚Ì‚Å•Û‘¶‚µ‚È‚¢‚悤‚É‚Æ‘‚¢‚Ä‚ ‚Á‚½‚̂ŃfƒtƒHƒ‹ƒg‚Å‚Í•Û‘¶‚µ‚Ü‚¹‚ñB
+EƒXƒNƒŠƒvƒg’ljÁ
+@strcharinfo(1) Ž©•ª‚̃p[ƒeƒB[–¼‚ðŽæ“¾‚µ‚Ü‚·B
+@strcharinfo(2) Ž©•ª‚̃Mƒ‹ƒh–¼‚ðŽæ“¾‚µ‚Ü‚·B
+@getcharid(1) Ž©•ª‚̃p[ƒeƒB[ID‚ðŽæ“¾‚µ‚Ü‚·B
+@getcharid(2) Ž©•ª‚̃Mƒ‹ƒhID‚ðŽæ“¾‚µ‚Ü‚·B
+@getpartyname(ID) ID‚ÅŽw’肵‚½ƒp[ƒeƒB[‚Ì–¼‘O‚ðŽæ“¾‚µ‚Ü‚·B
+@getguildname(ID) ID‚ÅŽw’肵‚½ƒMƒ‹ƒh‚Ì–¼‘O‚ðŽæ“¾‚µ‚Ü‚·B
+ (map/)
+ battle.h
+ battle.c
+ battle_config_read()C³
+ pc.c
+ pc_makesavestatus()C³
+ script.c
+ buildin_strcharinfo()C³
+ buildin_getcharid()Abuildin_getpartyname()Abuildin_getpartyname_sub()
+ buildin_getguildname()Abuildin_getguildname_sub()’ljÁ
+
+--------------
+//0730 by ‚Ò‚´‚Ü‚ñ
+
+EƒXƒg[ƒ€ƒKƒXƒg‚Ì“€Œ‹ŽžŠÔ‚ð–{ŽI‚É‚ ‚킹‚ÄC³(ƒXƒLƒ‹ƒŒƒxƒ‹‚ÉŠÖŒW‚È‚­ˆê’è‚Ì“€Œ‹ŽžŠÔ(10•b)‚É‚È‚è‚Ü‚·)
+EƒXƒ^ƒ“AˆÃˆÅA’¾–ÙA“Å‚Ìó‘ÔˆÙ펞ŠÔ‚ÌuŒp‚¬‘«‚µv‚ª‚Å‚«‚È‚¢‚悤‚ÉC³
+Eó‘ÔˆÙ킪Š|‚©‚è‚É‚­‚·‚¬‚Ä‚½‚Ì‚ÅMOB‚Ìó‘ÔˆÙí‘Ï«‚ðŠÉ˜a(‚Ü‚½’²®‚·‚é‚©‚à)
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()Askill_addisional_effect()C³
+ skill_status_change_start()C³
+
+--------------
+//0729 by DRG
+
+EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚ªƒJ[ƒg‚È‚µ‚ÅŽg‚¦‚½•s‹ï‡‚ÌC³
+EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚ªJOBLV30‚ÅŠo‚¦‚ꂽ‚Ì‚ðC³
+ (conf/)
+ npc_event_skillget.txt
+ ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“€C³
+ (map/)
+ skill.c
+ skill_check_condition()C³
+
+--------------
+//0728 by ‚Û‚Û‚Û
+
+EE‚ª•Ï‚í‚Á‚Ä‚àƒMƒ‹ƒh‚ÌE‹Æ—“‚ªXV‚³‚ê‚È‚¢•s‹ï‡‚ÌC³B
+
+ (char/)
+ inter.c
+ ƒpƒPƒbƒg’·ƒŠƒXƒgC³B
+ int_guild.c
+ mapif_guild_memberinfoshort()Amapif_parse_GuildChangeMemberInfoShort()A
+ inter_guild_parse_frommap()C³
+ (map/)
+ intif.h
+ intif.c
+ intif_guild_memberinfoshort()Aintif_parse_GuildMemberInfoShort()
+ intif_parse()C³
+ guild.h
+ guild_send_memberinfoshort()Aguild_recv_memberinfoshort()C³
+
+
+--------------
+//0727 by ¹
+
+E•ŠíŒ¤‹†ƒXƒLƒ‹‚É‚æ‚Á‚ăzƒ‹ƒOƒŒƒ“‚Ȃǂ̸˜BNPC‚ª
+@³í‚É“®ì‚µ‚È‚¢–â‘è‚ðC³B
+
+ (map/)
+ pc.c
+ pc_percentrefinery() C³B
+
+--------------
+//0726 by ŒÓ’±—–
+
+Emob_skill_db2.txt‚ª‚ ‚ê‚Îmob_skill_db.txt‚ðƒI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚ÉC³
+ ƒIƒŠƒWƒiƒ‹‚ÌMOBŽg—pŽž‚âAŒ»sMOB‚ÌŽg—pƒXƒLƒ‹‚ð•ÏX‚µ‚½‚¢ê‡‚ÉB
+
+Emob_skill_db.txt‚Åmob_id‚ÌŽŸ‚̃_ƒ~[•¶Žš—ñ‚ª"clear"‚¾‚Á‚½ê‡A
+ ‚»‚ÌMOB‚̃XƒLƒ‹‚ð‰Šú‰»‚·‚é‹@”\’ljÁB
+ Emob_skill_db2.txt‚Å‚ ‚éMOB‚̃XƒLƒ‹‚ðŠ®‘S‚É‘‚«Š·‚¦‚é‚Æ‚«‚ÉŽg—p‚µ‚Ä
+ ‚­‚¾‚³‚¢B
+ Eclear‚µ‚È‚©‚Á‚½ê‡‚Ímob_skill_db.txt‚Ì‚à‚̂ɒljÁ‚³‚ê‚Ü‚·B
+
+ mob.c
+ mob_readskilldb()C³
+
+
+EƒAƒCƒeƒ€–¼/MOB–¼‚ª‘SŠp12•¶Žši24ƒoƒCƒgj‚ ‚éƒAƒCƒeƒ€/MOB‚ªA
+ @ƒRƒ}ƒ“ƒh‚ÅŽæ‚èŠñ‚¹/¢Š«‚Å‚«‚È‚¢–â‘èC³B
+ mob.c
+ mobdb_searchname()C³
+ itemdb.c
+ itemdb_searchname_sub()C³
+
+EŒ»ÝŽž‚ŃCƒxƒ“ƒg‚ð‹N‚±‚·uŽžŒvƒCƒxƒ“ƒgv‹@”\‚ð’ljÁ
+ EOnInit‚Æ“¯‚¶‚悤‚É‚»‚ꂼ‚ê‚ÌNPC‚ÅAOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚µ‚Ü‚·B
+ OnMinute?? F–ˆŽžA??•ª‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B(0-59)
+ OnHour?? F–ˆ“úA??Žž‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B(0-23)
+ OnClock???? F–ˆ“úA??Žž??•ª‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
+ OnDate???? F–ˆ”NA??ŒŽ??“ú‚ɃCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
+ EÚ‚µ‚­‚Í npc_test_ev.txt ‚ðŽQÆ
+
+ (conf/)
+ npc_test_ev.txt
+ “à—e’ljÁ
+ (map/)
+ npc.c
+ FXC³
+
+E‚»‚Ì‘¼
+ clif.c
+ ƒRƒ“ƒpƒCƒ‹Œx‚ªo‚È‚¢‚悤‚ÉC³
+
+--------------
+//0725 by Ž€_
+
+EŽI—Ž‚¿ƒoƒOC³B
+Eƒ‚ƒ“ƒXƒ^[‚ɃCƒxƒ“ƒg‚ªÝ’肳‚ê‚Ä‚¢‚ÄŽ©ŽE‚â‚È‚É‚©‚Ń_ƒ[ƒW‚ð—^‚¦‚½
+•¨‚ª‚È‚¢ê‡ŽI—Ž‚¿Šm’è‚È‚Ì‚Å‚»‚̃}ƒbƒv‚É‚ ‚éƒvƒŒƒCƒ„[‚ð—˜—p‚µ‚Ä
+ƒCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚ðŽÀs‚·‚é‚悤‚É•ÏXB
+ (map/)
+ makefile C³B
+ mob.c
+ mob_timer()Amob_damage() C³B
+
+--------------
+//0724 by Ž€_
+
+EƒoƒOC³‚ƈÀ’艻‚ׂ̈ÌC³B
+Eƒyƒbƒg‚ÌUŒ‚‚ŃCƒxƒ“ƒg‚ªˆ—‚³‚ꂸŽI—Ž‚¿‚É‚È‚é–â‘èC³B(–¢ƒeƒXƒg)
+Eƒ‚ƒ“ƒXƒ^[‚Ì‘å—Ê”­¶‚ÅŽI‚ª—Ž‚¿‚é–â‘èC³B(ƒ‚ƒ“ƒXƒ^[‚ð10000•C‚ðŒÄ‚ñ‚Å
+–‚–@‚Å“|‚·‚±‚Æ‚ð5‰ñ’öƒeƒXƒgB‚½‚¾“®‚©‚È‚¢‚â‚‚̂ÝB)
+EŽæ‚芪‚«‚ªƒ{ƒX‚ƈê‚ÉŽ€‚ÊŽžƒAƒCƒeƒ€‚ð—Ž‚Æ‚³‚È‚¢‚悤‚É•ÏXB(–¢ƒeƒXƒg)
+Ebattle_athena.conf‚Ìpc_skillflee‚ðplayer_skillfree‚É•ÏX‚µ‚Ĉ—‚ð•ÏXB
+EƒAƒCƒXƒEƒH[ƒ‹‚Éskill_unit_setting‚ðŽg‚¤ƒXƒLƒ‹‚ÅUŒ‚‚Å‚«‚È‚¢‚悤‚ÉC³B
+E‚»‚Ì‘¼×‚©‚¢C³­‚µBˆÀ’艻‚³‚ꂽ‚©‚Ç‚¤‚©‚Í‚Ü‚¾‚í‚©‚è‚Ü‚¹‚ñ‚ªXP1800+A512MAƒ‚ƒ“ƒXƒ^[”z’u50%‚Å10000•C¢Š«‚µ‚ĈÙí‚È‚©‚Á‚½‚Ì‚Å‘åä•v‚É‚È‚Á‚½‚ÆŽv‚¢‚Ü‚·B‘åä•v‚¶‚á‚È‚­‚Ä‚àÓ”C‚Í‚Æ‚ê‚Ü‚¹‚ñ‚ª...
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ mob.h C³B
+ mob.c
+ mob_timer()Amob_deleteslave_sub()Amob_damage() C³B
+ npc.c
+ npc_event() C³B
+ skill.c
+ skill_area_sub()Askill_unit_onplace()Askill_castend_nodamage_id() C³B
+ clif.c
+ clif_parse_GMKick() C³B
+ battle.h
+ battle.c
+ battle_damage()Abattle_check_target()Abattle_config_read() C³B
+ pc.c
+ pc_calc_skilltree()Apc_checkskill() C³B
+ map.h C³B
+ map.c
+ map_foreachinarea()Amap_foreachinmovearea() C³B
+ map_foreachobject() C³B
+
+--------------
+//0723 by DRG
+
+E0719‚ÌC³
+ (map/)
+ pc.c pc_calc_skilltree()C³
+
+--------------
+//0722 by ƒpƒCƒ“
+
+Egcc 2.29Œn—ñ‚Å‚àƒRƒ“ƒpƒCƒ‹‚ª’Ê‚é‚悤‚ÉC³B
+@‚±‚ê‚͈ȑO‚É‚à’¼‚µ‚½‚Í‚¸‚È‚Ì‚Å‚·‚ªA‚È‚º‚©Œ³‚É–ß‚Á‚Ä‚¢‚Ü‚µ‚½‚Ì‚Å
+@ŠF‚³‚ñ’ˆÓ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+@‚ ‚ÆAgcc3Œn—ñ‚È‚ç’蔂͂ǂ±‚É‘‚¢‚Ä‚à–â‘è‚È‚¢‚Ì‚Å‚·‚ªA
+@gcc2.29Œn—ñ‚Å‚Íu•K‚¸ƒuƒƒbƒN—v‘f‚̈ê”Ôʼnv‚É‘‚©‚È‚¢‚ƃRƒ“ƒpƒCƒ‹‚ª
+@’Ê‚è‚Ü‚¹‚ñ‚Ì‚Å‚±‚¿‚ç‚à‚²’ˆÓŠè‚¢‚Ü‚·B
+
+ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚é—á
+void hoge() {
+ const char booboo = 1;
+ c
+
+ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚ç‚È‚¢—á
+void hoge() {
+ c
+ const char booboo = 1;
+ c
+
+ (map/)
+ skill.h ƒ}ƒNƒ‚ðC³
+ skill.c skill_addisional_effect()C³
+
+--------------
+//0721 by ¹
+
+Eƒ{ƒX‚ɃŒƒbƒNƒXƒfƒr[ƒi‚ªŒø‚¢‚½–â‘è‚ðC³B
+Eƒ{ƒX‚ɃJ[ƒh‚É‚æ‚éó‘ÔˆÙ킪Œø‚©‚È‚©‚Á‚½–â‘è‚ðC³B
+@–{ŽI‚ł̓}ƒŠƒiƒJ[ƒh“™‚ŃI[ƒNƒq[ƒ[‚È‚Ç‚ð‰£‚é‚ÆŽžX“€Œ‹‚µ‚Ü‚·B
+@(Œ‹\”÷–­‚ÈŽÀ‘••û–@‚È‚Ì‚ÅA‰½‚©–â‘肪‚ ‚Á‚½ê‡
+@ ‚»‚Ì•ÓÚ‚µ‚¢•û‚¨‚è‚Ü‚µ‚½‚çC³‚µ‚Ä‚â‚Á‚Ä‚­‚¾‚³‚¢(^^; ))
+
+--------------
+//0720 by ŒÓ’±—–
+
+EPC‚ÉIW‚ðd‚Ë‚é‚ÆMOB‚ªUŒ‚‚µ‚Ä‚±‚È‚¢–â‘è‚ðC³
+ EIW‚Éd‚È‚Á‚Ä‚¢‚Ä‚àA—×ډ”\‚È‚çMOB‚ª‹ßŠñ‚Á‚Ä‚«‚Ü‚·
+ E‚Ç‚ñ‚È’nŒ`‚É‚¢‚Ä‚àA—×Ú‚µ‚Ä‚¢‚é‚È‚çUŒ‚‰Â”\‚É‚È‚è‚Ü‚·
+ E‚½‚¾‚µAMOB‚ª‰“‹——£UŒ‚‰Â”\‚ÅAUŒ‚”͈͓à‚ÉPC‚ª‚¢‚Ä‚àA
+ —×Ú•s‰Â”\‚È‚çUŒ‚‚µ‚Ä‚«‚Ü‚¹‚ñB‚±‚ê‚Ì‰ðŒˆ‚Í‚©‚È‚è–Ê“|‚È‚Ì‚ÅB
+
+ mob.c
+ mob_can_reach()C³
+ battle.c
+ battle_check_range()C³
+
+--------------
+//0719 by DRG
+
+E‰ºˆÊƒXƒLƒ‹‚ª‚È‚¢ê‡‚ÍãˆÊƒXƒLƒ‹‚ª‚Ó‚ê‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
+@battle_athena.conf‚Ìskillflee‚ÅÝ’è‰Â”\‚Å‚·B
+@‰ºˆÊƒXƒLƒ‹‚ª‚È‚¢‚Ü‚ÜãˆÊƒXƒLƒ‹‚ð‚Ó‚Á‚½ó‘Ô‚ÅA‚±‚̃IƒvƒVƒ‡ƒ“‚ðŽg‚¤ê‡‚̓XƒLƒ‹ƒŠƒZƒbƒg‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
+@ˆê”ʃAƒJ‚ɃXƒLƒ‹ƒŠƒZƒbƒg‚ð‰ð•ú‚µ‚½‚¢‚Æ‚«‚ÉŽg‚Á‚Ä‚â‚Á‚ĉº‚³‚¢B
+ (conf/)
+ battle_athena.conf
+ (map/)
+ battle.c
+ battle.h
+ pc.c pc_calc_skilltree(),pc_checkskill()C³
+
+--------------
+//0718 by Ž€_
+
+EFX‚ÆC³B
+E“Å‚É‚æ‚Á‚Ä–hŒä‚ªŒ¸‚é‚悤‚É•ÏXB(HP‚Í‚Ü‚¾Œ¸‚è‚Ü‚¹‚ñB)
+EƒAƒCƒXƒEƒH[ƒ‹‚ÉUŒ‚‚Å‚«‚é‚悤‚É•ÏXB(¡‚Í‘S‚Ä‚ÌUŒ‚‚É“–‚½‚è‚Ü‚·B)
+‚½‚¾ˆÆ‚̃oƒO‚炵‚­ƒAƒCƒXƒEƒH[ƒ‹‚ðƒNƒŠƒbƒN‚·‚é‚ƈƂ©‚ç0x89ƒpƒPƒbƒg‚ª30‰ñˆÈã˜A‘±‚Å‘—‚Á‚Ä‚­‚邱‚Æ‚ª‹N‚±‚è‚Ü‚·‚ªŒ´ˆö‚Í•s–¾‚Å‚·B‘½•ªˆÆ‚̃oƒO‚¾‚ÆŽv‚¢‚Ü‚·‚ª...)
+E퓬‚ÉŠÖ‚í‚éŒvŽZ“™‚ðC³B
+Eƒ[ƒj‚ª‘‚¦‚éƒoƒOC³B(‘½•ª‚±‚ê‚Å‚±‚̃oƒO‚Í‚È‚­‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª‚Ç‚¤‚È‚Ì‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
+E“ñ“—¬‚̶Žè•Ší‚ÌŽí‘°A‘®«ASize‚̃_ƒ[ƒW•â³‚ð‰EŽè•Ší‚É“K—p‚·‚é‚©‚Ç‚¤‚©‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB
+E‚»‚Ì‘¼C³‚Í‚µ‚½‚Í‚¸‚Å‚·‚ªŠo‚¦‚Ä‚Ü‚¹‚ñB(C³‚µ‚Ä‚È‚¢•¨‚à‚ ‚è‚Ü‚·‚ªdiff“–‚Ä‚Ì“r’†‚Å‚Ç‚ê‚ðì‹Æ‚µ‚½‚Ì‚©‚ð–Y‚ꂽ‚Ì‚Å...)
+ (common/)
+ mmo.h C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_get_baseatk()Abattle_get_speed()Abattle_get_adelay() ’ljÁB
+ battle_get_amotion() Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_get_atk()Abattle_get_atk_()Abattle_get_atk2() C³B
+ battle_get_attack_element()Abattle_get_attack_element2() C³B
+ battle_get_str()Abattle_get_agi()Abattle_get_vit()Abattle_get_int() C³B
+ battle_get_dex()Abattle_get_luk()Abattle_get_flee() C³B
+ battle_get_flee2()Abattle_get_hit()Abattle_get_critical() C³B
+ battle_get_def()Abattle_get_def2()Abattle_get_mdef() C³B
+ battle_get_element()Abattle_check_target()Abattle_check_range() C³B
+ battle_weapon_attack()Abattle_config_read() C³B
+ clif.c
+ clif_skill_estimation()Aclif_mob0078()Aclif_mob007b() C³B
+ pc.c
+ pc_attack_timer()Apc_attack()Apc_calcstatus()Apc_payzeny() C³B
+ pc_getzeny() C³B
+ npc.c
+ npc_buylist()Anpc_selllist() C³B
+ pet.c
+ pet_attack()Apet_randomwalk()Apet_ai_sub_hard() C³B
+ mob.h C³B
+ mob.c
+ calc_next_walk_step()Amob_attack()Amobskill_castend_id() C³B
+ mobskill_use_id()Amobskill_use_pos()Amob_ai_sub_hard() C³B
+ mob_damage()Amob_changestate() C³B
+ mob_get_adelay()Amob_get_speed() íœB
+ skill.h C³B
+ skill.c
+ skill_unitsetting()Askill_unit_ondamaged()Askill_unit_timer_sub() C³B
+ skill_unit_timer()Askill_area_sub()Askill_unit_onplace() C³B
+ skill_status_change_start() C³B
+ chat.c C³B
+ makefile C³B
+ chrif.c C³B
+ guild.c C³B
+ itemdb.c C³B
+ map.c C³B
+ party.c C³B
+ script.c C³B
+ path.c C³B
+
+--------------
+//0717 by ¹
+
+E‘å—ʂɃ‚ƒ“ƒXƒ^[‚ð¢ŠÒ‚µ‚Ĉê“x‚É“|‚·‚Æmap-server‚ª—Ž‚¿‚é–â‘è‚ðC³B
+@(ƒJƒz‚ð100‘Ì‚¸‚¢ŠÒ‚µ‚Ä50‰ñƒeƒXƒg‚ð‚µ‚½‚Ì‚Å‹°‚ç‚­‘åä•v‚¾‚ÆŽv‚¢‚Ü‚·B)
+E‚»‚Ì‘¼Œ‹\ׂ©‚¢C³
+ (common/)
+ mmo.h
+ (map/)
+ chat.c
+ chrif.c
+ clif.c
+ guild.c
+ itemdb.c
+ map.c
+ mob.c
+ npc.c
+ party.c
+ path.c
+ pc.c
+ pet.c
+ script.c
+ skill.c
+ skill.h
+
+--------------
+//0716 by ¹
+
+E¸˜B¬Œ÷—¦‚ɑ΂µ‚ÄBS‚Ì•ŠíŒ¤‹†‚ª³‚µ‚­“K—p‚³‚ê‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ðC³B
+ (map/)
+ pc.c
+ pc_percentrefinery() C³B
+
+--------------
+//0715 by Ž€_
+
+Eƒ}ƒbƒvƒT[ƒo[‚©‚ç•\Ž¦‚³‚ê‚镨‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚Ìݒ肪‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½BƒXƒLƒ‹•\Ž¦‚¾‚¯‚Å‚à‚È‚­‚µ‚Ä‚â‚é‚ƃT[ƒo[‚ª‚©‚È‚èŠy‚É‚È‚Á‚½‚è‚à‚µ‚Ü‚·B
+ŠJ”­‚âƒoƒOƒgƒŒ[ƒX‚ÌŽž‚Í•\Ž¦‚·‚邱‚Æ‚ð‚¨Š©‚ß‚µ‚Ü‚·B
+E‚»‚Ì‘¼×‚©‚¢C³B
+EC³‚µ‚½Š‚ð‘S‚Ä‘‚¯‚È‚¢‚̂Ńtƒ@ƒCƒ‹‚¾‚¯B
+ (doc/)
+ conf_ref.txt
+ (conf/)
+ battle_athena.conf
+ (map/)
+ makefile
+ skill.c
+ script.c
+ pet.c
+ pc.c
+ path.c
+ party.c
+ npc.c
+ itemdb.c
+ intif.c
+ guild.c
+ chat.c
+ battle.h
+ battle.c
+ chrif.c
+ atcommand.c
+ clif.c
+ mob.c
+ map.c
+
+--------------
+//0714 by Ž€_
+
+Eׂ©‚¢C³B
+EƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“‚Å‚‚Ìd—ʂƸ˜B‚É‚æ‚Á‚ă_ƒ[ƒW‚ª‘‚¦‚é‚悤‚ÉC³B¸˜Bƒ_ƒ[ƒW‚ð‘«‚·Žž“K—p‚Ń_ƒ[ƒW+d—Ê+‚¸˜B*4(‚±‚Ì4‚Írefine_db.txt‚Ì–h‹ï‚̉ß踘Bƒ{[ƒiƒX‚ðŽg‚Á‚Ä‚é‚Ì‚Å•ÏX‰Â”\‚Å‚·B)‚É‚È‚è‚Ü‚·B
+EƒXƒLƒ‹‚É‚æ‚é‚«”ò‚΂µˆ—‚Å0x88ƒpƒPƒbƒg‚ðŽg‚Á‚Ä‚¢‚Ü‚µ‚½‚ª‚»‚̃pƒPƒbƒg‚Ì—D懈ʂª‚©‚È‚è’á‚¢‚炵‚­Œã‚Å—ˆ‚éƒpƒPƒbƒg‚É‚æ‚Á‚Ä–³Ž‹‚³‚ê‚邱‚Æ‚à‚ ‚é‚悤‚Ȃ̂ŃvƒŒƒCƒ„[‚¾‚¯‚É“K—p‚µ‚ă‚ƒ“ƒXƒ^[‚É‚Í0x78‚ðŽg‚¤‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+‚Å‚àˆÊ’u‚¸‚ê‚ÍŠ®‘S‚É‚È‚­‚È‚ç‚È‚¢‚悤‚Å‚·B(‹°‚ç‚­ˆÆ‚̃oƒO‚¾‚ÆŽv‚¢‚Ü‚·BŽI‚Ì
+À•W‚ðŠm”F‚µ‚Ä‚Ý‚Ü‚µ‚½‚ªŽI‚Ì•û‚Í–â‘肪‚ ‚è‚Ü‚¹‚ñ‚Å‚µ‚½B)
+ƒvƒŒƒCƒ„[‚Ìê‡0x78(PACKETVER‚ª4ˆÈã‚È‚ç0x1d8)‚ªŽg‚¦‚Ü‚¹‚ñB•ªg‚ðì‚Á‚Ä‚µ‚Ü‚¤‚Ì‚Å...
+EƒoƒO•ñƒXƒŒƒbƒh2 ‚Ì47‚ðŽæ‚èž‚Ý‚Ü‚µ‚½B
+E‚»‚Ì‘¼C³‚µ‚½Š­‚µ‚ ‚èB
+ (db/)
+ refine_db.txt C³B
+ item_db.txt C³B
+ (map/)
+ battle.c
+ battle_stopattack()Abattle_stopwalking() C³B
+ battle_get_attack_element2()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack() C³B
+ path.c
+ path_blownpos() C³B
+ pc.h C³B
+ pc.c
+ pc_stop_walking()Apc_damage() C³B
+ pc_getrefinebonus() ’ljÁB
+ mob.c
+ mob_damage() C³B
+ pet.c
+ pet_target_check()Apet_stop_walking()Apet_performance() C³B
+ skill.c
+ skill_attack()Askill_blown()Askill_status_change_start() C³B
+ skill_castend_damage_id() C³B
+ makefile C³B
+
+--------------
+//0713 by ‚Û‚Û‚Û
+
+Emob_avail.txt’ljÁBitem_avail.txt‚Æ“¯—l‚ÌŽw’è‚Ń‚ƒ“ƒXƒ^[‚ÌŒ©‚½–ڂ𑼂ÌID‚Ì‚à‚Ì‚É•ÏX‚µ‚Ü‚·B
+@ƒ‚ƒ“ƒXƒ^[‚ÌIDˆÈŠO‚ðŽw’肵‚½‚è‚·‚é‚ÆPC‚âNPC‚ÌŽp‚ð‚µ‚½MOB‚Ɉê•û“I‚ÉUŒ‚‚³‚ê‚éꇂª‚ ‚é‚Ì‚Å’ˆÓB
+ (db/)
+ mob_avail.txt ’ljÁB
+ (map/)
+ clif.c
+ clif_mob0078()Aclif_mob007b() C³B
+ mob.h C³B
+ mob.c
+ mob_readdb_mobavail()Amob_get_viewclass()’ljÁB
+ do_init_mob()Amob_readdb() C³B
+
+--------------
+//0712 by Ž€_
+
+EƒV[ƒ‹ƒhƒ`ƒƒ[ƒWAƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“ŽÀ‘•B
+EƒI[ƒgƒK[ƒh‚Í‚Æ‚è‚ ‚¦‚¸ƒGƒtƒFƒNƒg‚ªo‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+E0708‚Å‘‚«–Y‚êBƒfƒBƒtƒFƒ“ƒ_[‚ðŽg‚Á‚½ŽžASPD‚ƈړ®‘¬“x‚Í20%’ቺ‚µ‚Ü‚·B
+–{ŽI‚Œቺ‚·‚é‚Ì‚ÍŠm‚©‚̂悤‚Å‚·‚ª‚Ç‚ê‚®‚ç‚¢‰º‚ª‚é‚Ì‚©‚Í‚³‚Á‚Ï‚è‚í‚©‚è‚Ü‚ñ‚Ì‚Å...
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (db/)
+ cast_db.txt C³B
+ skill_db.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_calc_damage()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
+ skill.c
+ skill_additional_effect()Askill_attack()Askill_castend_nodamage_id() C³B
+ skill_check_condition()Askill_status_change_start() C³B
+ skill_castend_damage_id() C³B
+ pc.h C³B
+ pc.c
+ pc_calcstatus()Apc_checkallowskill()Apc_unequipitem() C³B
+
+--------------
+//0711 by npc
+
+Ezλ‘¢ƒGƒtƒFƒNƒg‚ÌC³
+EƒXƒNƒŠƒvƒg–„‚ßž‚Ý•Ï”‚ÉHp,MaxHp,Sp,MaxSp‚ð’ljÁ(“Ç‚Ýž‚Ý‚Ì‚Ý)
+ (map/)
+ skill.c
+ skill_produce_mix()C³B
+ pc.c
+ pc_readparam()C³B
+ (db/)
+ const.txt C³B
+
+--------------
+//0710 by ŒÓ’±—–
+
+E–¼‘O‚É”¼ŠpƒXƒy[ƒX‚ª“ü‚Á‚½ƒp[ƒeƒB[‚ð쬂µ‚½‚Æ‚«A‚¨‚æ‚ÑA
+ ”¼ŠpƒXƒy[ƒX‚ª“ü‚Á‚½–¼‘O‚ÌPC‚ðƒp[ƒeƒBƒƒ“ƒo‚É‚µ‚½‚Æ‚«A
+ party.txt‚ª³‚µ‚­“Ç‚Ýž‚ß‚È‚­‚È‚é–â‘è‚ðC³
+
+ (char/)
+ int_party.c
+ inter_party_fromstr()C³
+
+EMessage of the Day ‹@”\’ljÁ
+ EƒƒOƒCƒ“‚µ‚½ƒ†[ƒU[‚ÉMOTD‚ð•\Ž¦‚³‚¹‚邱‚Æ‚ªo—ˆ‚Ü‚·B
+ Emap-server.exeŽÀsŽž‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠihelp.txt‚Æ“¯‚¶
+ ƒfƒBƒŒƒNƒgƒŠj‚Émotd.txt‚ðì‚é‚Æ•\Ž¦‚µ‚Ü‚·B
+ EMOTD‚ª•\Ž¦‚³‚ê‚éƒ^ƒCƒ~ƒ“ƒO‚ÍA
+ uƒ}ƒbƒvƒT[ƒo[‚ɃƒOƒCƒ“‚µ‚½’¼Œã‚ÌAƒ}ƒbƒvƒ[ƒhŠ®—¹Žžv‚Å‚·B
+ ‚‚܂èAƒƒOƒCƒ“’¼ŒãAƒLƒƒƒ‰ƒZƒŒ’¼Œã‚¨‚æ‚ÑA
+ ƒ}ƒbƒvƒT[ƒo[ŠÔˆÚ“®‚ÌŽž(ƒ}ƒbƒvƒT[ƒo[‚Ì•ªŽU‚ðs‚Á‚Ä‚¢‚éꇂ̂Ý)
+ ‚̃}ƒbƒvƒ[ƒh‚ªI‚í‚Á‚½Žž‚É•\Ž¦‚³‚ê‚Ü‚·B
+ E•\Ž¦•û–@‚Íhelp.txt‚Æ“¯‚¶‚Å•’ʂ̃ƒbƒZ[ƒW‚Æ‚µ‚Ä‘—M‚µ‚Ü‚·B
+ iƒMƒ‹ƒh’mƒƒbƒZ[ƒW‚Í•¶Žš”§ŒÀ‚ª‚ ‚èAGMƒAƒiƒEƒ“ƒX‚Í’·ŽžŠÔ
+ ‰æ–Ê‚Ìã•”‚É•\Ž¦‚³‚ê‚Ä‚µ‚Ü‚¤‚½‚ßj
+ E‰ï˜b‚Æ‹æ•Ê‚ª‚‚­‚悤‚ÉA"< Message of the Day >"A"< End of MOTD >"
+ ‚Ì•¶‚Å㉺‚ðˆÍ‚¢‚Ü‚·B
+
+ (map/)
+ pc.c
+ pc_authok()C³
+
+
+--------------
+//0709 by ‚Û‚Û‚Û
+
+EƒXƒNƒŠƒvƒg‚Éemotion’ljÁ
+@emotion n;‚ÆŽg‚¤‚ÆNPC‚ªƒGƒ‚‚ðo‚µ‚Ü‚·Bn‚Í0`33‚ªŽg—p‰Â”\B
+E¸˜B‚ÆŠXƒKƒCƒh‚ÌNPC‚ð–{ŽI‚̑䎌‚ɇ‚킹‚ÄC³B
+ (conf/)
+ npc_town_refine.txtAnpc_town_guide.txt C³B
+ (map/)
+ script.c
+ buildin_emotion() ’ljÁB
+
+--------------
+//0708 by Ž€_
+
+EƒXƒLƒ‹ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹AƒfƒBƒtƒFƒ“ƒ_[AƒI[ƒgƒK[ƒhŽÀ‘•B
+EƒI[ƒgƒK[ƒh‚ÌꇃK[ƒh‚µ‚Ä‚àƒGƒtƒFƒNƒg‚Ío‚Ü‚¹‚ñBƒ~ƒX‚ɂȂ邾‚¯‚Å‚·B–{ŽI‚Ì•û‚Í•\Ž¦‚³‚ê‚é‚©‚Ç‚¤‚©‚à‚í‚©‚ç‚È‚¢‚µƒpƒPƒbƒgî•ñ‚à‚È‚¢‚Ì‚Å...
+EƒfƒBƒtƒFƒ“ƒ_[‚Í–¢ƒeƒXƒgBbLongAtkDef‚ðŽg‚Á‚Ä‚é‚̂Ńzƒ‹ƒ“ƒJ[ƒh‚̂悤‚ÉbLongAtkDef‚ðã‚°‚镨‚ð‘•”õ‚µ‚ÄŽg‚¤‚Ɖ“‹——£•¨—UŒ‚‚ð‘S‚Ä–³Œø‚É‚Å‚«‚Ü‚·B(‚±‚ê‚à–{ŽI‚ÌŽd—l‚ª‚Ç‚¤‚È‚Ì‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB)
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (db/)
+ cast_db.txt C³B
+ (map/)
+ map.h C³B
+ map.c
+ map_quit() C³B
+ skill.h C³B
+ skill.c
+ skill_castend_nodamage_id()Askill_use_id()Askill_check_condition() C³B
+ skill_castend_id()Askill_castend_nodamage_id()Askill_castcancel() C³B
+ pc.c
+ pc_calcstatus()Apc_setpos()Apc_damage() C³B
+ battle.c
+ battle_calc_damage()Abattle_damage() C³B
+ clif.c
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+ mob.c
+ mob_damage() C³B
+ itemdb.c
+ itemdb_searchrandomid() C³B
+
+--------------
+//0707 by Ž€_
+
+E0705‚̈¢C—…”e–PŒ‚̃oƒOC³B
+ (db/)
+ skill_db.txt
+ (map/)
+ skill.c
+ skill_castend_id()
+ skill_castend_pos()
+ battle.c
+ battle_calc_pc_weapon_attack()
+ clif.c
+ clif_parse_UseSkillToId()
+
+--------------
+//0706 by kalen
+EC³
+ conf/npc_warp_umbala.txt
+
+--------------
+//0705 by Ž€_
+
+EFX‚ÆC³B
+EƒvƒŒƒCƒ„[‚̃NƒŠƒeƒBƒJƒ‹ŒvŽZ‚ɃoƒO‚ª‚ ‚Á‚½‚Ì‚ÅC³B
+E”š—ô”g“®‚̈—C³B
+Eƒ‚ƒ“ƒN‚̃Rƒ“ƒ{‚ðC³B
+Eˆ¢C—…”e–PŒ‚ÌŽg—p‚É‚æ‚Á‚ă}ƒbƒvŽI‚Ì–³ŒÀƒ‹[ƒvƒoƒOC³B(‚±‚ê‚©‚È‚è’v–½“I‚È•¨‚¾‚Á‚½‚悤‚Å‚·B)
+EƒRƒ“ƒ{‚ÅŽg‚¤ˆ¢C—…”e–PŒ‚Í“G‚ðƒNƒŠƒbƒN‚·‚é•K—v‚ª‚È‚¢‚悤‚ÉC³B
+E–Ò—´Œ‚Å“G‚ð‚«”ò‚΂·‹——£‚ð5ƒZƒ‹‚É•ÏXB‚æ‚Á‚ăRƒ“ƒ{‚ÅŽg‚¤ˆ¢C—…”e–PŒ‚Í‹——£ƒ`ƒFƒbƒN‚ð‚µ‚Ü‚¹‚ñB5ƒZƒ‹”ò‚΂³‚ꂽ“G‚͈¢C—…”e–PŒ‚ÌŽË’ö‚©‚ç—£‚ꂽ‚킯‚È‚Ì‚Å‹——£ƒ`ƒFƒbƒN‚È‚µ‚Å”­“®‚µ‚Ü‚·B(–{ŽI‚ÌŽd—l‚È‚ñ‚Ä’m‚è‚Ü‚¹‚ñB)
+Eƒ}ƒbƒv‚Ì–¼‘O‚ð16byte‚©‚ç24bytes‚É•ÏXB(‘債‚½ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ªˆÀ‘S‚ׂ̈̕¨‚Å‚·B)
+EƒEƒFƒfƒBƒ“ƒOƒLƒƒƒ‰‚É‚æ‚éˆÆ—Ž‚¿‚ð–h‚®ˆ×‚ÉC³B
+E‚»‚Ì‘¼­‚µC³B(ƒeƒXƒg‚Í–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñB)
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ skill_db.txt C³B
+ (common/)
+ mmo.h C³B
+ (doc/)
+ conf_ref.txt C³B
+ item_bonus.txt C³B
+ (map/)
+ battle.h C³B
+ battle.c
+ battle_get_flee2()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_config_read() C³B
+ skill.h C³B
+ skill.c
+ skill_status_change_start()Askill_castend_damage_id() C³B
+ skill_check_condition()Askill_use_id()Askill_blown() C³B
+ skill_castend_map()Askill_unit_onlimit()Askill_attack() C³B
+ pc.c
+ pc_attack_timer()Apc_setpos()Apc_setsavepoint() C³B
+ pc_movepos()Apc_calcstatus()Apc_bonus() C³B
+ clif.h C³B
+ clif.c
+ clif_set0078()Aclif_set007b() C³B
+ clif_updatestatus()Aclif_initialstatus()Aclif_parse_UseSkillToId() C³B
+ clif_skillinfo() ’ljÁB
+ map.h C³B
+ map.c
+ map_setipport()Amap_addmap() C³B
+ ‚»‚Ì‘¼”²‚¯‚½Š­‚µ‚ ‚èB
+
+--------------------
+//0704 by kalen
+
+EUmbala Warp’ljÁ
+ conf/npc_warp_umbala.txt
+
+--------------------
+//0703 by ‚¢‚Ç
+
+EƒT[ƒo[snapshot
+
+--------------
+//0702 by ‚Û‚Û‚Û
+
+Eƒtƒ@[ƒ}ƒV[‚̃GƒtƒFƒNƒg‚ð–{—ˆ‚Ì‚à‚Ì‚É•ÏX
+EƒXƒNƒŠƒvƒg‚Å‚Ì–„‚ßž‚Ý•Ï”‚ÉBaseExp,JobExp,NextBaseExp,NextJobExp’ljÁ
+ (map/)
+ skill.c
+ skill_produce_mix() C³B
+ pc.c
+ pc_readparam()Apc_setparam() C³B
+ (db/)
+ const.txt C³B
+
+--------------
+//0701 by ‚Ò‚´‚Ü‚ñ
+
+EƒXƒe[ƒ^ƒXˆÙí”»•ÊŽ®“±“üBŠeƒXƒe[ƒ^ƒXˆÙí‚Ì”­“®—¦‚ªVIT/INT/MDEF‚ɉe‹¿‚·‚é‚悤‚É‚È‚è‚Ü‚·BŽ‘±ŽžŠÔ’Zk‚Í‚Ü‚½¡“x‚Å_|P|›
+E•sŽ€‚É“€Œ‹‚ªŒø‚¢‚½ƒoƒOC³B
+ (map/)
+ skill.c
+ skill_additional_effect()Askill_castend_nodamage_id() C³B
+
+--------------
+//0700 by “ì
+
+E697‚̃oƒOC³B
+@@@@(db/)
+ mob_db.txt
+
+--------------
+//0699 by Ž€_
+
+E‘•”õ‚̃{[ƒiƒXƒNƒŠƒeƒBƒJƒ‹‚ÍŽ©•ª‚̊ԈႢ‚¾‚Á‚½‚Ì‚ÅbCriticalRate‚ðbCritical‚É•ÏXB‚»‚ê‚Æ0695‚Å‘‚«–Y‚ê‚Å‚·‚ªASPD‚ðã‚°‚éƒJ[ƒh‚â‘•”õ‚̈ꕔ‚ðbAspdAddRate‚©‚çbAspdRate‚É•ÏX‚µ‚Ü‚µ‚½B‚Ý‚·‚Ƃꑃ‚̃Vƒ~ƒ…ƒŒ[ƒ^[‚É‚æ‚é‚ƃhƒbƒyƒ‹ƒJ[ƒh‚Í•¡”‚Å‚àˆê‚‚µ‚©“K—p‚³‚ê‚È‚¢‚Ý‚½‚¢‚¾‚Á‚½‚Ì‚ÅB
+ (db/)
+ item_db.txt
+
+--------------
+//0698 by Ž€_
+
+Eˆê•”‚̃Lƒƒƒ‰‚Éd—Ê‚ª‚O‚É‚È‚Á‚ăJƒvƒ‰‚Ȃlj½‚à‚o‚bC‚m‚b‚o‚ª•\Ž¦‚³‚ê‚È‚­‚È‚éƒoƒOC³B(‚»‚ꂾ‚¯)
+ (common/)
+ mmo.h C³B
+ (map/)
+ clif.c
+ clif_updatestatus() C³B
+ pc.c
+ pc_calcstatus() C³B
+
+--------------
+//0697 by “ì
+
+Emob_dbC³
+@ƒhƒƒbƒv‚ð’†S‚ÉC³B
+@@@@(db/)
+ mob_db.txt
+
+--------------
+//0696 by Ž€_
+
+EƒoƒOC³B
+EƒeƒŒƒ|[ƒg‚âƒ[ƒv“™‚ÌŽžƒXƒLƒ‹ƒ†ƒjƒbƒg‚©‚甲‚¯‚鈗‚ª“ü‚Á‚Ä
+‚È‚©‚Á‚½‚Ì‚ÅSAFETYWALL“™‚É‚æ‚Á‚ÄŽI—Ž‚¿‚ª‹N‚±‚Á‚½‚悤‚Å‚·B(Šm‚©•ñ‚à
+‚ ‚Á‚½‚ÆŽv‚¢‚Ü‚·‚ª...) ‚æ‚Á‚ÄC³‚Í‚µ‚Ü‚µ‚½‚ªŠm”F‚Í‚µ‚Ä‚Ü‚¹‚ñB•ñ‚ð
+‚¨Šè‚¢‚µ‚Ü‚·B
+EƒXƒLƒ‹‚É‚æ‚é‚«”ò‚΂µˆ—‚ð‚¿‚å‚Á‚ÆC³‚ƃ‚ƒ“ƒXƒ^[‚̃R[ƒh‚ð­‚µC³B
+‘½•ª•Ï‚É‚È‚Á‚½‚±‚Æ‚Í‚È‚¢‚ÆŽv‚¢‚Ü‚·‚ª•Ï‚¾‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (map/)
+ skill.h C³B
+ skill.c
+ skill_blown()Askill_attack()Askill_unit_move() C³B
+ skill_castend_nodamage_id()Askill_castend_damage_id() C³B
+ skill_unit_out_all()Askill_unit_out_all_sub() ’ljÁB
+ mob.c
+ mob_stop_walking()Amob_spawn()Amob_warp() C³B
+ mob_can_move()Amob_changestate() C³B
+ map.h C³B
+ pc.c
+ pc_setpos() C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack() C³B
+
+--------------
+//0695 by Ž€_
+
+E­‚µC³B
+EƒvƒŒƒCƒ„[‚ÌŠî–{ƒpƒ‰ƒ[ƒ^‚ð2byte‚ÉŠg’£B
+Eitem_db.txt‚ðƒ‰ƒOƒiƒQ[ƒg‚Ìà–¾‚ɇ‚킹‚ÄC³B
+EbAddEff‚ÆbResEff‚ÌŠm—¦‚ð•S•ª—¦‚©‚ç–œ•ª—¦‚É•ÏXB
+EƒXƒNƒŠƒvƒgstatusup‚Æstatusup2’ljÁB
+statusup bStr; ‚̂悤‚ÉŽg‚Á‚Ä‹@”\‚̓Xƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðŒ¸‚ç‚µ‚Ä
+Šî–{ƒpƒ‰ƒ[ƒ^‚ð1ã‚°‚éB
+statusup2 bInt,n; ‚̂悤‚ÉŽg‚Á‚Ä‹@”\‚̓Xƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðŒ¸‚ç‚³‚¸‚É
+Šî–{ƒpƒ‰ƒ[ƒ^‚ðnã‚°‚éB
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ item_db.txt C³B
+ const.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ conf_ref.txt C³B
+ (common/)
+ mmo.h C³B
+ (char/)
+ char.c
+ mmo_char_send006b()Aparse_char() C³B
+ (map/)
+ map.h C³B
+ clif.h C³B
+ clif.c
+ clif_initialstatus()Aclif_updatestatus() C³B
+ pc.h C³B
+ pc.c
+ pc_bonus()Apc_calcstatus()Apc_equippoint()Apc_equipitem() C³B
+ pc_jobchange()Apc_checkbaselevelup()Apc_statusup() C³B
+ pc_statusup2() ’ljÁB
+ battle.h C³B
+ battle.c
+ battle_calc_pet_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pc_weapon_attack()Abattle_config_read() C³B
+ skill.c
+ skill_additional_effect()Askill_status_change_start() C³B
+ script.c
+ buildin_statusup()Abuildin_statusup2() ’ljÁB
+ atcommnad.c C³B
+
+--------------
+//0694 by Ž€_
+
+EƒoƒOC³‚Æׂ©‚¢C³B
+EbCriticalRate‚ª³‚µ‚­“K—p‚³‚ê‚È‚©‚Á‚½–â‘èC³B
+Eƒyƒbƒg‚É‚æ‚éƒXƒe[ƒ^ƒXƒ{[ƒiƒX’ljÁBƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚Í‘•”õ‚Ì
+ƒXƒNƒŠƒvƒg‚É‚æ‚Á‚Äݒ肵‚Ü‚·B‚½‚¾ƒyƒbƒg‚É‚æ‚éƒ{[ƒiƒX‚̓J[ƒh‚É‚æ‚镨‚Æ“¯‚¶ˆµ‚¢‚ð‚µ‚Ü‚·B‚»‚µ‚Ä‘®«‚Ì“K—p‚͈ê”Ô—D懈ʒႢ‚Å‚·B¡‚͉½‚à“ü‚Á‚Ä‚Ü‚¹‚ñ‚ª...
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ const.txt C³B
+ pet_db.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ conf_ref.txt C³B
+ db_ref.txt C³B
+ (map/)
+ map.h C³B
+ map.c
+ map_quit() C³B
+ battle.h C³B
+ battle.c
+ battle_calc_pc_weapon_attack()Abattle_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
+ battle_config_read() C³B
+ pc.c
+ pc_calcstatus()Apc_bonus()Apc_setpos()Apc_authok() C³B
+ pc_damage()Apc_autosave_sub() C³B
+ pet.h C³B
+ pet.c
+ pet_hungry()Apet_birth_process()Apet_recv_petdata()Apet_food() C³B
+ pet_return_egg()Apet_ai_sub_hard()Aread_petdb() C³B
+ clif.c
+ clif_sendegg()Aclif_parse_LoadEndAck() C³B
+ atcommand.c C³B
+ makefile C³B
+
+--------------
+//0693 by ŒÓ’±—–
+
+ESC_*‚Ì—ñ‹“•\‚ðƒŠƒiƒ“ƒoƒŠƒ“ƒO
+ ƒNƒ‰ƒCƒAƒ“ƒg‚É’Ê’m‚·‚é‚Ì‚ð64–¢–ž‚©‚ç128–¢–ž‚É‘‚₵‚½
+ ƒpƒPƒbƒgî•ñ‚ɇ‚¤‚悤‚ɃŠƒiƒ“ƒo[
+ StatusChange‚Ì”z—ñ‚ð128‚©‚ç192‚É‘‚₵‚½‚̂Ńƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚Ü‚·B
+
+ (db/)
+ const.txt
+ SC_* ‚Ì”’l‚ð•ÏX
+ (map/)
+ skill.h
+ SC_* ‚Ì—ñ‹“‚Ì”’l‚ð•ÏX
+ map.h
+ MAX_STATUSCHANGE‚ð128‚©‚ç192‚É‘‚₵‚½
+ skill.c
+ skill_status_change_start(),skill_status_change_end(),
+ skill_status_change_clear()‚Ì’Ê’mˆ—‚ð•ÏX
+
+E‰‰‘t/ƒ_ƒ“ƒX‚̈—‚ð•ÏX
+ ‰‰‘t/ƒ_ƒ“ƒX’†‚©‚Ç‚¤‚©‚ðSC_DANCING‚Å”»’è‚·‚é‚悤‚É•ÏX
+ i”»’舗‚ª‘½­‚‘¬‰»‚³‚ꂽ‚Í‚¸j
+ ƒ[ƒv(ƒ}ƒbƒvˆÚ“®‚┈‚È‚Ç)‚·‚é‚Ɖ‰‘t/ƒ_ƒ“ƒX‚ð’†’f‚·‚é‚悤‚É•ÏX
+
+ skill.h/skill.c
+ skill_check_dancing()íœAskill_stop_dancing()’ljÁ
+ skill_delunitgroup(),skill_initunitgroup()•ÏX
+ skill_status_change_start()•ÏX
+ skill_castend_nodamage_id()•ÏX
+ ‘‚«‘¹‚¶‚ª‚ ‚é‚©‚àEE
+ pc.c
+ pc_calcstatus(),pc_setpos(),pc_damage()•ÏX
+
+E•s‹¦˜a‰¹ƒXƒLƒ‹‚ÌC³
+ (db/)
+ skill_db.txt
+ •s‹¦˜a‰¹ƒXƒLƒ‹‚ÌHIT”C³
+ (map/)
+ skill.c
+ skill_status_change_timer()•ÏX
+ battle.c
+ battle_calc_misc_attack()C³
+
+--------------
+//0692 by ŒÓ’±—–
+
+EƒAƒhƒŠƒuƒXƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢–â‘èC³iskill_db‚Ì“Y•t‚µ–Y‚êj
+ (db/)
+ skill_db.txt
+ ƒAƒhƒŠƒu‚ÌÁ”ïSP‚ð1‚ÉC³
+
+Emob_db2.txt‚ª‚ ‚ê‚Îmob_db.txt‚ɃI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É
+ ƒIƒŠƒWƒiƒ‹mob‚ðì‚Á‚Ä‚él‚ÍŽg‚¤‚Æ•Ö—˜‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+
+ mob.c
+ mob_readdb()
+
+EŽI—Ž‚¿ƒoƒO•ñŽž‚Ì‚½‚߂̃Xƒ^ƒbƒNƒoƒbƒNƒgƒŒ[ƒXƒƒOŠ“¾•û–@‚ðЉî
+ ŽI—Ž‚¿ƒoƒO‚Ì•ñŽž‚ÉA‚±‚Ìî•ñ‚ðƒRƒsƒy‚·‚é‚ÆŠJ”­ŽÒ‚ªŠì‚Ñ‚Ü‚·B
+ Cygwin‚Åcore‚Ì“f‚©‚¹‚é•û–@‚àЉ‚Ä‚Ü‚·B
+
+ (doc/)
+ coredump_report.txt
+
+--------------
+//0691 by ŒÓ’±—–
+
+Eitem_db2.txt‚ª‚ ‚ê‚Îitem_db.txt‚ɃI[ƒo[ƒ‰ƒCƒh‚·‚é‚悤‚É
+ ƒIƒŠƒWƒiƒ‹ƒAƒCƒeƒ€‚ðì‚Á‚Ä‚él‚ÍŽg‚¤‚Æ•Ö—˜‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+
+ itemdb.c
+ itemdb_readdb()C³
+
+E‰‰‘t/ƒ_ƒ“ƒXŒnƒXƒLƒ‹‰¼ŽÀ‘•
+ E‰‰‘t/ƒ_ƒ“ƒX’†‚͈ړ®‚ª’x‚­AƒXƒLƒ‹‚àŽg‚¦‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
+ EƒAƒhƒŠƒuƒXƒLƒ‹‚ʼn‰‘t/ƒ_ƒ“ƒX‚ð’†’f‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ E‰‰‘t/ƒ_ƒ“ƒX‚ÍΉ»‚Ȃǂ̈ÙíAMHP‚Ì1/4ˆÈã‚̃_ƒ[ƒW‚Å’†’f‚µ‚Ü‚·
+ EƒLƒƒƒ‰ƒNƒ^[ƒOƒ‰ƒtƒBƒbƒN‚͉‰‘t/ƒ_ƒ“ƒX‚µ‚Ü‚¹‚ñ
+ E‰‰‘t/ƒ_ƒ“ƒX’†‚ÌSPÁ”ï‚Í–¢ŽÀ‘•‚Å‚·
+ EˆÚ“®‚µ‚Ä‚àŒø‰Ê”͈͂͂‚¢‚Ä‚«‚Ü‚¹‚ñ
+ Ed•¡‚µ‚Ä‚à•s‹¦˜a‰¹‚Ȃǂɕω»‚µ‚Ü‚¹‚ñ
+ EƒGƒtƒFƒNƒg‚ªo‚Ä‚àŒø‰Ê‚Í–¢ŽÀ‘•‚Ì‚à‚Ì‚ª‚ ‚è‚Ü‚·
+ E‚Ù‚Æ‚ñ‚Ç–¢ƒeƒXƒg‚È‚Ì‚Å‘½”‚Ì•s“s‡‚ª‚ ‚é‚ÆŽv‚¢‚Ü‚·
+
+ skill.h
+ SC_* ‚Ì—ñ‹“•\‚ðC³
+ skill.c
+ skill_check_dancing()’ljÁ
+ SkillStatusChangeTable[]C³
+ skill_unit_onout(), skill_status_change_start(),
+ skill_status_change_timer(),skill_unitsetting(),
+ skill_castend_id(),skill_castend_pos(),skill_castend_map(),
+ skill_castend_nodamage_id()C³
+ ‚»‚Ì‘¼‚Í–Y‚ê‚Ü‚µ‚½
+ pc.c
+ pc_calcstatus(),pc_damage()C³
+
+--------------
+//0690 by ”g˜Q
+
+Eׂ©‚¢C³
+ (db/)
+ item_db.txt ‚ƃƒMƒ“ƒMƒ‡ƒ‹ƒh‚Ìbonus‚ðC³B
+ (doc/)
+ item_bonus.txt C³B
+
+--------------
+//0689 by Ž€_
+
+E‘qŒÉƒoƒOC³‚Æׂ©‚¢C³B
+ (map/)
+ pc.c
+ pc_modifybuyvalue()Apc_modifysellvalue() C³B
+ storage.c
+ storage_storageopen() C³B
+ storage_storage_quit()Astorage_storage_save() C³B
+
+--------------
+//0688 by ¹
+
+EƒfƒBƒXƒJƒEƒ“ƒgAƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒgAƒI[ƒo[ƒ`ƒƒ[ƒW‚ª“K—p‚³‚ê‚È‚©‚Á‚½–â‘è‚ðC³B
+ (map/)
+ pc.c
+ pc_modifybuyvalue() C³B
+ pc_modifysellvalue() C³B
+
+--------------
+//0687 by Ž€_
+
+E­‚µC³B
+Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
+Eitem_avail.txt‚̈—‚ð•ÏXBƒAƒCƒeƒ€ID‚ÌŒã‚É0‚ð“ü‚ê‚é‚Æ¡‚Ü‚Å’Ê‚è‚ÉŽg—p•s‰Â”\‚ɂȂ邪0ˆÈŠO‚Ì”’l‚ð“ü‚ê‚é‚ÆŽg—p•s‰Â”\‚Å‚Í‚È‚­‚»‚Ì”’l‚ðƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚ÄŒ©‚½–Ú‚¾‚¯‚ð‚»‚ê‚É•ÏX‚µ‚Ü‚·B‚æ‚Á‚ĈƗŽ‚¿ƒAƒCƒeƒ€‚ð•Ê‚Ì•¨‚É•\Ž¦‚µ‚ĈƗŽ‚¿‚ð–h‚®‚±‚Æ‚ª‚Å‚«‚Ü‚·B(•\Ž¦‚¾‚¯•Ï‚¦‚ÄŽI‚̈—‚Í–{“–‚̃AƒCƒeƒ€ID‚Ì•¨‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·BC³‚Í‘S‚Ä‚µ‚½‚ÆŽv‚¢‚Ü‚·‚ª”²‚¯‚½Š‚ª‚ ‚é‚©‚à’m‚è‚Ü‚¹‚Ì‚ÅŒ©‚½–Ú•ÏX‚µ‚½ƒAƒCƒeƒ€‚ňƗŽ‚¿‚ª‹N‚±‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B) ŽI‚̈—‚Í‚±‚ꂪŒÀŠE‚Å‚·B(­‚È‚­‚Æ‚àŽ©•ª‚É‚Í) ƒAƒCƒeƒ€‚ª“¯‚¶•¨‚ª“ñ‚•\Ž¦‚³‚ê‚ĊԈႢˆÀ‚¢‚Æ‚©‚Ç‚¤‚±‚¤‚Æ‚©‚Ì•¶‹å‚ðŒ¾‚¢‚½‚¢l‚͈Æì‚ê‚æBˆÈãB
+EƒWƒ‹ƒ^ƒX‚ƃAƒŠƒX‚̃Rƒ}ƒ“ƒgƒAƒEƒg‰ðœBitem_avail.txt‚Å—‘‚ðƒ‹ƒr[‚ƃAƒNƒAƒ}ƒŠƒ“‚Å•\Ž¦‚µ‚ĕߊlƒAƒCƒeƒ€‚à‘¼‚Ì•¨‚É•\Ž¦‚·‚é‚悤‚É•ÏX‚µ‚Ä‚¢‚Ü‚·B
+Eƒ_ƒ[ƒWŒvŽZ‚̃oƒOC³B(‘債‚½•¨‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª‹|‚¾‚¯‚¿‚å‚Á‚Æ–â‘肪‚ ‚Á‚½‚悤‚Å‚·B)
+E” “™‚̃AƒCƒeƒ€‚Å“¾‚½‘•”õ•i‚Í–¢ŠÓ’è‚É‚È‚é‚悤‚É•ÏXB
+E‘•”õƒ{[ƒiƒX‚Ì“à•”ˆ—C³‚Æ­‚µ•ÏXB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
+EƒLƒƒƒ‰ŽI‚Ƀe[ƒ^‚𑗂鎞ƒLƒƒƒ‰A‘qŒÉAƒyƒbƒg‚̃e[ƒ^‚𓯎ž‚É‘—‚é‚悤‚É•ÏXB(ƒLƒƒƒ‰ŽI‚ƃ}ƒbƒvŽI‚ÌŠÔ‚Ì“]‘——Ê‚ª‘‚¦‚é‚©‚à’m‚è‚ê‚Ü‚¹‚ñ‚ªƒf[ƒ^‚𓯊ú‰»‚ׂ̈ł·B)
+EFW‚Ì“®ìŠÔŠu‚ð0.25•b‚©‚ç0.1•b‚É•ÏXB(‚±‚ê‚Å ‚蔲‚Í­‚µŒ¸‚é‚Í‚¸‚Å‚·B)
+EƒJ[ƒgƒŒƒ{ƒŠƒ…ƒVƒ‡ƒ“‚Å‚Ç‚ñ‚Èó‘ÔˆÙí‚à‚©‚©‚ç‚È‚¢‚悤‚É•ÏXB
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ const.txt C³B
+ item_avail.txt C³B
+ pet_db.txt C³B
+ (doc/)
+ conf_ref.txt C³B
+ item_bonus.txt C³B
+ (map/)
+ map.h C³B
+ map.c
+ map_quit() C³B
+ battle.h C³B
+ battle.c
+ battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_get_dmotion()Abattle_config_read() C³B
+ pc.c
+ pc_calcstatus()Apc_bonus()Apc_bonus3()Apc_setpos() C³B
+ pc_makesavestatus()Apc_autosave_sub()Apc_modifybuyvalue() C³B
+ pc_modifysellvalue()Apc_stop_walking() C³B
+ skill.c
+ skill_additional_effect()Askill_unitsetting() C³B
+ clif.c
+ clif_buylist()Aclif_selllist()Aclif_set009e()Aclif_set0078() C³B
+ clif_set007b()Aclif_additem()Aclif_itemlist()Aclif_equiplist() C³B
+ clif_storageitemlist()Aclif_storageequiplist()Aclif_changelook() C³B
+ clif_arrow_create_list()Aclif_useitemack()Aclif_tradeadditem() C³B
+ clif_storageitemadded()Aclif_getareachar_item() C³B
+ clif_skill_produce_mix_list()Aclif_cart_additem()Aclif_cart_itemlist() C³B
+ clif_cart_equiplist()Aclif_vendinglist()Aclif_openvending() C³B
+ clif_produceeffect()Aclif_sendegg()Aclif_pet_equip()Aclif_mvp_item() C³B
+ clif_pet0078()Aclif_pet007b() C³B
+ itemdb.h C³B
+ itemdb.c
+ itemdb_searchrandomid()Aitemdb_search()Aitemdb_readdb() C³B
+ itemdb_read_itemavail()Aitemdb_read_itemvaluedb() C³B
+ itemdb_equippoint() íœB
+ storage.h C³B
+ storage.c
+ storage_storage_quitsave() ->storage_storage_quit()‚É•ÏX‚ÆC³B
+ storage_storageclose() C³B
+ atcommand.c C³B
+ pet.c
+ pet_change_name()Apet_equipitem()Apet_unequipitem() C³B
+ pet_birth_process()Apet_return_egg() C³B
+ script.c
+ buildin_getitem() C³B
+ mob.c
+ mob_stop_walking() C³B
+ makefile C³B
+
+--------------
+//0686 by ¹
+
+Eׂ©‚¢C³B
+ (map/)
+ pc.h C³B
+
+--------------
+//0685 by ”g˜Q
+
+E0683A0684‚Å‚Ìbonus‚̒ljÁ‚É‚Æ‚à‚È‚Á‚Äitem_db.txt‚ðC³
+E‘¼FXC³
+ (db/)
+ item_db.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+
+--------------
+//0684 by Ž€_
+
+Eׂ©‚¢C³B
+EŽ€‚ñ‚¾‚Ó‚è‚ÌŽžƒXƒLƒ‹‚ƃAƒCƒeƒ€‚ªŽg‚¦‚È‚¢‚悤‚É•ÏXB
+EbInfiniteEndure’ljÁB‹@”\‚Í–³ŒÀƒCƒ“ƒfƒ…ƒAB
+Eƒ_ƒ[ƒW•\Ž¦‚̈—­‚µ•ÏXB
+ (db/)
+ const.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ (map/)
+ map.h C³B
+ pc.c
+ pc_calcstatus() C³B
+ pc_equipitem()Apc_unequipitem() C³B
+ clif.c
+ clif_parse_UseItem()Aclif_parse_UseSkillToId() C³B
+ clif_parse_UseSkillToPos()Aclif_parse_UseSkillMap() C³B
+ clif_damage()Aclif_skill_damage()Aclif_skill_damage2() C³B
+ clif_parse_LoadEndAck() C³B
+ skill.c
+ skill_status_change_timer() C³B
+
+--------------
+//0683 by Ž€_
+
+EƒoƒOC³‚Æbonus’ljÁB
+E‘qŒÉƒoƒOA‘®«ƒoƒOC³‚Æ‚»‚Ì‘¼‚̃oƒOC³B
+EƒXƒNƒŠƒvƒgbonus3’ljÁB¡‚ÍbAddMonsterDropItem‚¾‚¯‚ª‘Ήž‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+Ebonus bRestartFullRecover;n;“™‚Ån‚Í–³ˆÓ–¡‚¾‚¯‚ÇÁ‚·‚Ì‚Í‚¿‚å‚Á‚Æ‚Ü‚¸‚¢‚Å‚·‚Ì‚Å0‚É‚µ‚Ä“ü‚ꂽ•û‚ª‚¢‚¢‚Å‚·Bbonus‚Í2‚‚̔’l‚ª•K—v‚ȃXƒNƒŠƒvƒg‚È‚Ì‚ÅB
+EbDefRatioAtk‚ð–hŒä–³Ž‹‚É•ÏXB
+E0677‚Å‘‚«–Y‚êB
+E•Ší‚Ì‘®«“K—p—D懈ʂ𻑢>ƒJ[ƒh>•Ší‚É•ÏXB»‘¢‚ªÅ—Dæ‚Å‚·B(‘®«‚ª‚ ‚鎞‚ɘb‚Å‚·B‘®«‚ª‚È‚¢ê‡‘®«‚ ‚镨‚Éã‘‚«‚³‚ꂽ‚è‚Í‚µ‚Ü‚¹‚ñB)
+E‘•”õ‚Å“K—p‚³‚ê‚éŒø‰Ê‚Ì—D懈ʂð‰EŽè>¶Žè>‘Ì>“ªã>“ª’†>“ª‰º>ƒ[ƒu>ŒC>ƒAƒNƒZƒTƒŠ[1>ƒAƒNƒZƒTƒŠ[2>–î‚ÉÝ’èB(–{ŽIŽd—l‚ª‚Ç‚¤‚È‚Ì‚©•ª‚©‚邱‚Æ‚ª‚Å‚«‚»‚¤‚È•¨‚Å‚à‚È‚¢‚̂ŃAƒeƒi‚ÌŽd—l‚ÆŒ¾‚¤‚±‚Æ‚ÅB) ‰EŽè‚ªÅ—Dæ‚Å‚·B
+E•Ší‚ÌŽË’ö‚ð‰EŽè‚ƶŽè‚Ì•Ší‚Ì’†‚Å’·‚¢•¨‚ð“K—p‚·‚é‚悤‚É•ÏXB
+ (db/)
+ const.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ (map/)
+ map.h C³B
+ battle.c
+ battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_calc_pet_weapon_attack()Abattle_calc_magic_attack() C³B
+ battle_damage() C³B
+ pc.c
+ pc_autosave_sub()Apc_calcstatus() C³B
+ pc_bonus()Apc_bonus2() C³B
+ pc_bonus3() ’ljÁB
+ script.c
+ buildin_bonus3() ’ljÁB
+ mob.c
+ mob_once_spawn()Amob_damage() C³B
+ storage.h C³B
+ storage.c
+ storage_storage_save() ’ljÁ
+ atcommand.c C³B
+
+--------------
+//0682 by ¹
+
+EƒXƒs[ƒhƒAƒbƒvƒ|[ƒVƒ‡ƒ“Œn‚̃oƒOC³
+ (map/)
+ pc.c
+ pc_calcstatus() C³B
+
+--------------
+//0681 by Ž€_
+
+E‘•”õƒoƒOC³B
+ (map/)
+ pc.c
+ pc_equipitem() C³B
+
+--------------
+//0680 by ¹
+
+Eׂ©‚¢C³B
+Eu@monstervƒRƒ}ƒ“ƒh‚Ń‚ƒ“ƒXƒ^[ID‚ÌŽw’è‚Éu-1vAu-2v“™‚ðŽw’è‚·‚é‚Æ
+@ƒ‚ƒ“ƒXƒ^[‚ðƒ‰ƒ“ƒ_ƒ€‚Å¢ŠÒ‚Å‚«‚é‹@”\‚ð’ljÁB
+ (map/)
+ mob.c
+ atcommand.c
+
+--------------
+//0679 by ”g˜Q
+
+E0676‚ÅV‚µ‚¢ƒAƒCƒeƒ€Œø‰Ê‚ªŽÀ‘•‚³‚ꂽ‚Ì‚ÅAitem_db.txt‚ðC³(bonus bAddMonsterDropItem,n,x; ‚ÍAŽí‘°”»’肪‚Å‚«‚È‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸•Û—¯‚µ‚Ü‚µ‚½B)
+E‘¼FXC³
+ (db/)
+ item_db.txt
+ job_db1.txt
+ (doc/)
+ item_bonus.txt
+
+--------------
+//0678 by ¹
+
+E¢ŠÒŠÖ˜A‚Ìׂ©‚¢C³B
+ (map/)
+ mob.c
+ mob_once_spawn_area() C³B
+
+--------------
+//0677 by Ž€_
+
+Eׂ©‚¢C³B
+EƒAƒCƒeƒ€”„”ƒ‚É‚æ‚Á‚Ä“¾‚ç‚ê‚éŒoŒ±’l‚ðƒJ[ƒh‚É‚æ‚éƒXƒLƒ‹‚Å‚Í“¾‚ç‚ê‚È‚¢‚悤‚ÉC³B
+E“Å‚ÉŠ|‚©‚é‚ÆŽ©‘R‰ñ•œ‚Å‚«‚È‚¢‚悤‚ÉC³B
+E0676‚Å‘‚«–Y‚êB»‘¢•Ší‚Ìꇻ‘¢‚É‚æ‚Á‚Ä—^‚¦‚½‘®«‚ª•Ší‚Ì‘®«‚æ‚è—D悵‚Ä“K—p‚³‚ê‚é‚悤‚É•ÏXB(»‘¢•Ší‚ª–³‘®«‚Ìꇂ͓K—p‚³‚ê‚Ü‚¹‚ñB)
+ (doc/)
+ item_bonus.txt ŒëŽšC³B
+ (map/)
+ npc.c
+ npc_buylist()Anpc_selllist() C³B
+ pc.c
+ pc_calcstatus()Apc_natural_heal_sub() C³B
+
+--------------
+//0676 by Ž€_
+
+EFX‚ÆC³B
+Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
+E‚Ý‚·‚Ƃꑃ‚ðŽQl‚µ‚ă_ƒ[ƒWŒvŽZ‚ð­‚µC³B
+E‘•”õbonus‚ÉFX‚ƒljÁB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
+EŽ©“®ƒZ[ƒu‚·‚鎞(ƒLƒƒƒ‰ŽI‚Ƀf[ƒ^‚𑗂鎞)‘qŒÉ‚̃f[ƒ^‚à‘—‚é‚悤‚É•ÏXB
+E0667‚ÅŒ¾‚¢–Y‚êBƒJ[ƒg‚ðŠO‚µ‚Ä‚àƒAƒCƒeƒ€‚ªÁ‚¦‚È‚¢‚悤‚É•ÏXB(–{ŽI‚ÅÁ‚¦‚é‚Ì‚ªŽd—l‚¾‚ÆŽv‚Á‚Ä‚¢‚½‚¯‚ÇC³‚³‚ꂽ‚Ý‚½‚¢‚È‚Ì‚ÅB)
+EŽæˆø—v¿‚ðŽó‚¯‚鑤‚ÍŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚µ‚È‚¢‚悤‚ÉC³B(Žó‚¯‚鑤‚ÌŠî–{ƒXƒLƒ‹ƒ`ƒFƒbƒN‚ÍŽ©•ª‚ª“ü‚ꂽ•¨‚Å‚Í‚È‚¢‚Å‚·B‚¢‚‚̊Ԃɂ©“ü‚Á‚Ä‚¢‚½‚Ì‚Å휂µ‚Ü‚µ‚½B)
+E–h‹ï‚̸˜Bƒ{[ƒiƒX‚ð’[”–³Ž‹‚É•ÏXB(‚±‚ꂪ–{ŽI‚ÌŽd—l‚Ý‚½‚¢‚È‚Ì‚Å)
+EƒAƒ“ƒNƒ‹‚̈—­‚µ•ÏXB(‚©‚©‚ç‚È‚¢‚ÆŒ¾‚¤•ñ‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚Å...)
+EƒvƒŒƒCƒ„[‚̃Xƒe[ƒ^ƒXŒvŽZ‚Å–â‘è‚ ‚è‚»‚¤‚ÈŠC³B
+EƒJ[ƒh‚ÌID‚Å‹@”\‚ªŒˆ‚Ü‚Á‚Ä‚¢‚½ƒJ[ƒh‚àƒXƒNƒŠƒvƒg‚É‚æ‚Á‚Ä•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É•ÏXB(Ú‚µ‚¢‚±‚Æ‚Íitem_bonus.txt‚Å)
+EaspdŒvŽZ•û–@­‚µ•ÏXB
+E–î‚ÉbCriticalAbAtkEleAbHitAbAddEleAbAddRaceAbAddSizeAbAddEff‚ð“K—p‚Å‚«‚é‚悤‚É•ÏXB–î‚ðŽg‚¤ƒXƒLƒ‹‚â‹|‚É‚æ‚éUŒ‚‚¾‚¯‚É–î‚ÌbCriticalAbAtkEleAbHitAbAddEleAbAddRaceAbAddSizeAbAddEff‚ª“K—p‚³‚ê‚é‚悤‚ÉC³B
+EƒLƒŠ‚ÌŽÀ‘•‚ɈׂÉC³‚Í‚µ‚Ü‚µ‚½‚ªƒLƒŠ‚ª–hŒä–³Ž‹‚È‚Ì‚©‚Ç‚¤‚©‚ª‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å–hŒä–³Ž‹‚Í‚µ‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+EƒeƒXƒg‚µ‚½•¨‚ÍbAddMonsterDropItem‚ÆbGetZenyNum‚¾‚¯‚Ȃ̂ųí‚É“®ì‚·‚é‚©‚Ç‚¤‚©‚Ì•ñ‚ª—~‚µ‚¢Š‚Å‚·B(‚‚¢‚Å‚Éitem_db‚ÌC³‚à...‚±‚ê‚Å‹zŽûŒn‚ƃI[ƒgƒXƒyƒ‹ŒnˆÈŠO‚Í–w‚ÇŽÀ‘•‚Å‚«‚é‚Í‚¸‚Å‚·B‘½•ª...)
+E‚»‚Ì‘¼‚ÍŠo‚¦‚Ä‚È‚¢‚¯‚ÇC³‚µ‚½Š‚ª­‚µ‚ ‚é‚©‚à...
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ item_bonus.txt C³B
+ (db/)
+ const.txt C³B
+ (char/)
+ inter.c
+ inter_init() C³B
+ int_storage.c
+ mapif_parse_SaveStorage() C³B
+ (map/)
+ trade.c
+ trade_traderequest() C³B
+ pc.h C³B
+ pc.c
+ pc_autosave_sub()Apc_calcstatus() C³B
+ pc_bonus()Apc_bonus2() C³B
+ pc_setrestartvalue()Apc_setequipindex() C³B
+ pc_check_equip_wcard()Apc_check_equip_dcard()Apc_check_equip_card() íœ
+ ‚»‚Ì‘¼C³B
+ skill.h C³B
+ skill.c C³B
+ skill_castend_nodamage_id()Askill_unit_onplace() C³B
+ skill_check_condition()Askill_additional_effect() C³B
+ skill_attack()Askill_status_change_start() C³B
+ map.h C³B
+ battle.h C³B
+ battle.c
+ battle_get_def()Abattle_get_mdef2() C³B
+ battle_weapon_attack()Abattle_damage() C³B
+ battle_calc_magic_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pet_weapon_attack() C³B
+ battle_calc_misc_attack()Abattle_config_read() C³B
+ mob.c
+ mob_damage() C³B
+ pet.c
+ pet_target_check() C³B
+ clif.c
+ clif_set0078()Aclif_set007b()Aclif_changelook() C³B
+ atcommand.c C³B
+
+--------------
+//0675 by ”g˜Q
+
+EŠØŽI‚Å‘º³‚ÌŒø‰Ê‚ª•ÏX‚³‚ꂽ‚Ì‚Å•ñ‚ðŒ³‚Éitem_db.txt‚ðC³
+Ejob_db1.txt‚ðC³
+ (db/)
+ item_db.txt
+ job_db1.txt
+
+--------------
+//0674 by npc
+
+Eƒtƒ@[ƒ}ƒV[‚̉¼ŽÀ‘•B
+ (db/)
+ produce_db.txt
+ (map/)
+ skill.c
+
+--------------
+//0673 by “ì
+
+EW’†—ÍŒüã‚É‘•”õ•i‚̕Ⳃª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
+@@@@@(map/)@@@
+@@@@@ pc.c
+
+--------------
+//0672 by “ì
+
+EW’†—ÍŒüã‚É‘•”õ•i‚̕Ⳃª“ü‚Á‚Ä‚¢‚È‚©‚Á‚½‚Ì‚ðC³B
+@@@@@(map/)@@@
+@@@@@ pc.c
+
+--------------
+//0672 by ¹
+
+Eƒ‚ƒ“ƒXƒ^[Œn‚̃oƒOC³(‚·‚Ý‚Ü‚¹‚ñA‚Ü‚¾Žc‚Á‚Ä‚Ü‚µ‚½(^^; )
+ (map/)
+ mob.c
+
+--------------
+//0671 by ¹
+
+EIDƒ`ƒFƒbƒN”͈͂ÌC³‘¼B
+E@monster‚Å”‚ðŽw’肵‚È‚­‚Ăࢊ҂ł«‚é‚悤‚ÉC³B
+ (map/)
+ atcommand.c
+ battle.c
+ battle.h
+ mob.c
+ pet.c
+ (conf/)
+ battle_athena.conf
+ (doc/)
+ conf_ref.txt
+
+--------------
+//0670 by RR
+
+Eƒ‚ƒ“ƒXƒ^[ƒhƒƒbƒv—¦‚ðC³(–{ŽI€‹’ADB‚Å‚ÌÝ’è+1/10000)B
+E—Ž‰º—¦‚O‚Éݒ肵‚½ƒAƒCƒeƒ€‚ð—Ž‚Æ‚·‚©‚Ç‚¤‚©‚ðbattle_athena.conf‚ÅÝ’è‰Â”\‚ÉB
+ (map/)
+ mob.c
+ mob_damage() C³B
+ battle.c
+ battle.h
+ (conf/)
+ battle_athena.conf
+
+--------------
+//0669 by ¹
+
+Eƒ‚ƒ“ƒXƒ^[ƒhƒƒbƒv‚ÌC³B
+ (map/)
+ mob.c
+ mob_damage() C³B
+
+--------------
+//0668 by ¹
+
+Eƒ‚ƒ“ƒXƒ^[ID‚͈̔̓`ƒFƒbƒN‚ðC³B
+ (map/)
+ mob.c
+ mob_dbAmob_once_spawn()Amob_once_spawn_area()A
+ mob_summonslave()Amob_read_randommonster()Amob_readdb() C³B
+
+--------------
+//0667 by Ž€_
+
+EÅ‘åHPŒvŽZŽ®‚ðƒ~ƒXƒgƒŒ‘ƒ‚ðŽQl‚µ‚ÄC³B(‘½•ª‚±‚ê‚Å–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚ÆŽv‚¢‚Ü‚·B)
+E–h‹ï‚̸˜Bƒ{[ƒiƒX‚ð0.7‚É•ÏXB(¡‚Í’[”‚ðŽlŽÌŒÜ“ü‚µ‚Ä‚¢‚Ü‚·‚ª–{ŽI‚ª’[”–³Ž‹‚È‚çC³‚µ‚Ä‚¨‚«‚Ü‚·B)
+E@refineƒRƒ}ƒ“ƒh‚Å‘•”õêŠID‚É0‚ð“ü‚ê‚é‚Æ‘•”õ‚µ‚Ä‚¢‚é‘S‚Ä‚Ì‘•”õ‚ð¸˜B‚·‚é‚悤‚É•ÏXB
+E‚»‚Ì‘¼×‚©‚¢C³B
+ (db/)
+ item_db.txt
+ 7140A7142‚ðŒ³‚É–ß‚µ‚Ä0666‚Ì•¨‚̓Rƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B
+ job_db1.txt C³B
+ refine_db.txt C³B
+ (map/)
+ mob.c
+ mob_once_spawn() C³B
+ itemdb.c
+ itemdb_read_randomitem() C³B
+ pet.c
+ pet_food() C³B
+ pc.c
+ pc_readdb()Ado_init_pc()Apc_calcstatus()Apc_setoption() C³B
+ pc_calc_sigma() ’ljÁB
+ ‚»‚Ì‘¼C³B
+ map.h C³B
+ battle.c
+ battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
+ atcommand.c C³B
+
+--------------
+//0666 by ¹
+
+Eƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€‚Ìׂ©‚¢C³B
+Ebattle_athena.conf‚Ì€–ڒljÁB
+EŒÃ–Ø‚ÌŽ}‚Å¢ŠÒ‚·‚郂ƒ“ƒXƒ^[‚ÌŠm—¦‚ðÝ’èo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B
+Eƒ‚ƒ“ƒXƒ^[¢ŠÒƒAƒCƒeƒ€‚ð•¡”ì‚鎖‚ªo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B
+E¢ŠÒƒAƒCƒeƒ€‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚Ä
+@¶–½‚ÌŽíŽq‚ðƒ|ƒŠƒ“Œn¢ŠÒA
+@ƒGƒ“ƒuƒŠƒI‚ðMVPƒ{ƒXŒn¢ŠÒ‚É‚µ‚Ä‚Ý‚Ü‚µ‚½B
+@‚ ‚Ü‚è‚¢‚¢ƒTƒ“ƒvƒ‹‚ðŽv‚¢‚‚©‚È‚©‚Á‚½‚Ì‚ÅA
+@‰½‚©‚¢‚¢ˆÄ‚ðŽv‚¢‚‚¢‚½l‚Í‘‚«Š·‚¦‚Ä‚â‚Á‚Ä‚­‚¾‚³‚¢(^^;
+ (conf/)
+ battle_athena.conf
+ (doc/)
+ conf_ref.txt
+ (map/)
+ mob.h
+ mob_db C³B
+ mob.c
+ mob_once_spawn()Amob_makedummymobdb()Amob_readdb() C³B
+ mob_readbranch() -> mob_read_randommonster()‚É•ÏXB
+ battle.h
+ battle_config C³B
+ battle.c
+ battle_config_read() C³B
+ itemdb.c
+ itemdb_read_randomitem() C³B
+ (db/)
+ item_db.txt
+ item_bluebox.txt
+ item_cardalbum.txt
+ item_giftbox.txt
+ item_scroll.txt
+ item_violetbox.txt
+ mob_branch.txt
+ mob_poring.txt ’ljÁB
+ mob_boss.txt ’ljÁB
+
+--------------
+//0665 by J
+
+E‰…—ì•Žm‚ÌŽæ‚芪‚«‚ªƒJƒuƒL”EŽÒ‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðŽð“V‹ç‚ÉC³B
+EƒIƒbƒg[‚ɃtƒFƒCƒNƒGƒ“ƒWƒFƒ‹‚ªo‚·‚Í‚¸‚ÌŽæ‚芪‚«‚ª‚‚¢‚Ä‚½‚Ì‚ðC³B
+ (db/)
+ mob_skill_db.txt
+
+--------------
+//0664 by ¹
+
+E¸˜BŽ¸”sŽž‘¼‚̃vƒŒ[ƒ„[‚É‚àƒGƒtƒFƒNƒg‚ª•\Ž¦‚³‚ê‚é‚悤‚ÉC³B
+ (map/)
+ script.c
+ buildin_failedrefitem() C³B
+
+--------------
+//0663 by lide
+
+Eƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒAC³
+ (map/)
+ battle.c
+ skill.c
+
+--------------
+//0662 by Ž€_
+
+Eׂ©‚¢C³‚ƃoƒOC³B
+Eƒvƒƒ{ƒbƒN‚É‚æ‚Á‚ă‚ƒ“ƒXƒ^[‚ÍæŽZ–hŒä‚ÆŒ¸ŽZ–hŒä‚ªŒ¸‚é‚悤‚ÉC³‚µ‚ăvƒŒƒCƒ„[‚ÍŒ¸ŽZ–hŒä‚¾‚¯Œ¸‚é‚悤‚ÉC³B
+EƒXƒNƒŠƒvƒggetgmlevel’ljÁB‹@”\‚Í‚»‚ÌNPC‚Ƙb‚µ‚Ä‚¢‚éƒvƒŒƒCƒ„[‚ÌGMƒŒƒxƒ‹‚ð•Ô‚µ‚Ü‚·B
+E0659‚Ì‘‚«–Y‚ê‚Å‚·‚ªƒyƒbƒg‚̃pƒtƒHƒ}ƒ“ƒX‚ÌŽí—Þ‚ªe–§“x‚É‚æ‚Á‚Ä‘‚¦‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+ (map/)
+ clif.c
+ pc.c
+ script.c
+
+--------------
+//0661 by Ž€_
+
+Eׂ©‚¢C³B
+EÚ‘±‚µ‚½Žž‚̃yƒbƒg‚̃ƒbƒZ[ƒW‚ðe–§“x‚ª‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚Ì‚Ý‚Éo‚é‚悤‚É•ÏXB
+E0659‚Å‘‚«–Y‚ê‚Å‚·‚ªƒyƒbƒg‚ÌŽx‰‡UŒ‚‚Íe–§“x‚ª‚«‚í‚ß‚Äe‚µ‚¢‚ÌŽž‚Ì‚Ý‚É”­¶‚µ‚Ü‚·B(‚»‚ê‚Æe–§“x‚É‚æ‚Á‚ÄŽx‰‡UŒ‚Šm—¦‚ª­‚µ•Ï‰»‚µ‚Ü‚·B)
+EƒWƒ‹ƒ^ƒX‚ƃAƒŠƒX‚Ì—‘‚ÌID‚ðitem_db.txt‚ɇ‚킹‚Ü‚µ‚½B(Ž©•ª‚ªì‚Á‚½pet_db.txt‚Ì•û‚ªŽ©•ªŸŽè‚Éݒ肵‚Ä‚¢‚½•¨‚Å‚µ‚½‚Ì‚ÅB‚ÄŒ¾‚¤‚©–¢ŽÀ‘•ƒAƒCƒeƒ€‚¾‚©‚ç”Ô†‚ª‚í‚©‚ç‚È‚©‚Á‚½‚¾‚¯‚Å‚·‚ª...)
+Epet_db.txt‚Ìattack_rate‚ª³‚µ‚­“K—p‚³‚ê‚È‚©‚Á‚½ƒoƒOC³B
+ (db/)
+ pet_db.txt
+ (map/)
+ clif.c
+ clif_parse_LoadEndAck() C³B
+ pc.c
+ pc_attack_timer() C³B
+
+--------------------
+//0660 by ‚¢‚Ç
+
+EƒT[ƒo[snapshot
+
+--------------
+//0659 by Ž€_
+
+Eƒyƒbƒg‚ðFX‚ÆC³B(ƒyƒbƒg‚̃R[ƒh‚ð‚Ù‚Æ‚ñ‚Ç•Ï‚¦‚Ü‚µ‚½B)
+EŽè“®“I‚¾‚Á‚½ƒyƒbƒg‚Ì“®‚«‚ðƒ‚ƒ“ƒXƒ^[‚̂悤‚ÉAI‚Æ‚µ‚Ĉ—B
+EÚ‘±‚µ‚½Žž‚̃yƒbƒg‚̃ƒbƒZ[ƒWŽÀ‘•B(–{ŽI‚Í‚Ç‚¤‚È‚Ì‚©‚í‚©‚è‚Ü‚¹‚ñ‚ª
+Athena‚ÍÚ‘±‚·‚é‚Æ100%˜b‚·‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
+Eƒyƒbƒg‚̃XƒyƒVƒƒƒ‹ƒpƒtƒHƒ}ƒ“ƒXŽÀ‘•B(‚½‚¾‘䎌‚ª‚¿‚å‚Á‚Æ•Ï‚Å‚·B‚¢‚­‚ç’T‚µ‚Ä‚àŠY“–‚·‚éƒpƒPƒbƒg‚ªŒ©‚‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅB)
+Eƒyƒbƒg‚̑䎌‚𑼂̃yƒbƒg‚Ì•¨‚É•ÏX‚·‚é‹@”\’ljÁB(Ú‚µ‚¢‚±‚Æ‚Ídb_ref.txt‚Æpet_db.txt‚ÅB)
+Eƒyƒbƒg‚É‚æ‚éŽx‰‡UŒ‚•ÏXBpet_db.txt‚ÅUŒ‚‚·‚鎞‚ÆUŒ‚‚ðŽó‚¯‚½Žž‚ÌŽx‰‡UŒ‚
+Šm—¦‚ð•ÊX‚ÉÝ’è‚Å‚«‚Ü‚·BUŒ‚‚·‚鎞‚Ìê‡UŒ‚‚·‚é“x‚Ƀ`ƒFƒbƒN‚ð‚µ‚Ü‚·‚Ì‚Å
+UŒ‚‘¬“x‚ª‘¬‚¢‚ÆŽx‰‡UŒ‚‚ðŽó‚¯‚â‚·‚­‚È‚è‚Ü‚·BUŒ‚‚ðŽó‚¯‚½Žž‚à“¯‚¶‚Å‚·B(‚±‚¿‚ç‚̓_ƒ[ƒW‚ð‹ò‚炤“x‚É‚È‚è‚Ü‚·‚ªB) Žx‰‡UŒ‚Šm—¦‚̓\ƒq[AƒWƒ‹ƒ^ƒXAƒAƒŠƒX‚¾‚¯Ž©•ªŸŽè‚Éݒ肵‚Ä‚¢‚Ü‚·B(‘¼‚Ì‚Í‘S•”1%‚ÉBƒyƒbƒg‚ÌŽx‰‡UŒ‚‚Í“¯‚¶ƒ‚ƒ“ƒXƒ^[‚É‚Í‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚»‚µ‚ăyƒbƒg‚Ì퓬”\—͂̓‚ƒ“ƒXƒ^[‚Æ“¯‚¶‚Å‚·B)
+E/hideƒRƒ}ƒ“ƒhŽÀ‘•B
+Eƒvƒƒ{ƒbƒN‚É‚æ‚Á‚ÄæŽZ–hŒä‚àŒ¸‚é‚悤‚ÉC³B
+EƒtƒŠ[ƒLƒƒƒXƒg‚̃oƒOC³B
+Eƒm[ƒrƒX‚̃Xƒe[ƒ^ƒXƒ{[ƒiƒXíœB
+Ebattle_athena.conf‚Ì€–ڒljÁ‚ÆíœB
+EC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯B–¢ƒeƒXƒg‚µ‚½•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ (conf/)
+ battle_athena.conf
+ (doc/)
+ conf_ref.txt
+ db_ref.txt ’ljÁB(¡à–¾‚ª“ü‚Á‚Ä‚¢‚é‚Ì‚Ípet_db.txt‚Ì‚Ý‚Å‚·B )
+ client_packet.txt
+ (db/)
+ pet_db.txt
+ job_db2.txt
+ (map)
+ clif.h
+ clif.c
+ map.h
+ map.c
+ pet.h
+ pet.c
+ pc.c
+ mob.h
+ mob.c
+ npc.c
+ atcommand.c
+ skill.c
+ battle.h
+ battle.c
+
+--------------
+//0658 by huge
+
+Eƒyƒbƒg‚ª‚Æ‚Ç‚ß‚ð‚³‚·‚ÆAŽ”‚¢Žå‚ÉŒoŒ±’l‚ª“ü‚é‚悤‚É‚µ‚Ü‚µ‚½B
+EŒÅ’è’lƒ_ƒ[ƒW‚¶‚á–¡‚ª–³‚¢‚Ì‚ÅATK1`ATK2‚ÌŠÔ‚Å—”‚ðŽæ‚é‚悤‚É‚µ‚Ü‚µ‚½B
+E‚ ‚ÆAƒyƒbƒg‚ª‚Æ‚Ç‚ß‚ð‚³‚·‚©‚Ç‚¤‚©‚ÌÝ’è‚ðAbattle_athena.conf‚ɉÁ‚¦‚Ü‚µ‚½B
+
+ (conf/)
+ battle_athena.conf pet_finish’ljÁB
+ (map/)
+ battle.c
+ battle_config_read() C³B
+ battle.h C³B
+ pet.c
+ pet_attack() C³B
+ (doc/)
+ conf_ref.txt à–¾’Ç‹LB
+
+--------------
+//0657 by huge
+
+Eƒyƒbƒg‚É‚æ‚éUŒ‚‚ðŽÀ‘•B
+Eƒyƒbƒg‚ðŽ‚Á‚Ä‚¢‚ÄAƒyƒbƒg‚ª‘•”õ•i‚ð‚‚¯‚Ä‚ÄA‚³‚ç‚Ƀ‰ƒ“ƒ_ƒ€‚É‚æ‚é”»’è‚Å”­“®‚µ‚Ü‚·B
+E‚½‚¾‚Ì—V‚ÑS‚Å‚·‚—
+Ebattle_athena.conf‚Å•p“x‚ðÝ’è‚Å‚«‚Ü‚·BÚׂÍdoc‚ÅB
+
+ (conf/)
+ battle_athena.conf pet_attack’ljÁB
+
+ (map/)
+ battle.c
+ battle_config_read() C³B
+ battle.h C³B
+ pc.c
+ pc_attack_timer() C³B
+ pet.c
+ pet.h
+ pet_attack() ’ljÁB
+ (doc/)
+ conf_ref.txt à–¾’Ç‹LB
+
+ ‚Æ‚è‚ ‚¦‚¸Aƒyƒbƒg‚ª“®‚¢‚Ä‚é‚È‚Ÿ‚Á‚ÄŠ´‚¶‚ÆAƒ_ƒ‰ñ”‚ð‘‚₵‚½’ö“x‚Å‚·B
+
+--------------
+//0656 by Ž€_
+
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³B(‚¨‚¢‚¨‚¢‰½“x–Ú‚¾...)
+EƒOƒ‰ƒ“ƒhƒNƒƒXŒvŽZŽ®ŠÔˆá‚¢‚ÅC³B(€3‚ª‚Ü‚¸‚©‚Á‚½‚Ý‚½‚¢‚Å‚·B)
+‚Å‚à‚Ü‚¾”½ŽËƒ_ƒ[ƒW‚ª‚Ý‚·‚Ƃꑃ‚æ‚è‚¿‚å‚Á‚Æ‚‚¢‚Å‚·B(10‚®‚ç‚¢‚¾‚©‚ç
+ŠÖŒW‚È‚¢‚©‚à)
+Eƒ‚ƒ“ƒN‚Ì‹C‹…‚ð•K’†‚ÉC³B(Ž©•ª‚̊ԈႢ‚̂悤‚Å‚·‚Ì‚Å...)
+ (map/)
+ skill.c C³B
+ battle.c C³B
+
+--------------
+//0655 by Ž€_
+
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³B
+EŽ©•ª‚È‚è‚Éî•ñ‚ðŽûW‚µ‚Ä‚Ý‚½Œ‹‰ÊƒOƒ‰ƒ“ƒhƒNƒƒX”½ŽËƒ_ƒ[ƒW‚Í
+ƒvƒŒƒCƒ„[ƒLƒƒƒ‰‚ª‚»‚̃Lƒƒƒ‰Ž©g‚ɃOƒ‰ƒ“ƒhƒNƒƒX‚ðŽg‚Á‚½Žž‚Ì
+ƒ_ƒ[ƒW‚¾‚»‚¤‚È‚Ì‚ÅC³‚µ‚Ü‚µ‚½B(‚Ý‚·‚Ƃꑃ‚ÌŒvŽZ‚Æ‚Í‚©‚È‚èˆá‚¤‚悤‚È
+‹C‚à‚µ‚Ü‚·‚ª...)
+E–‚–@‚ƃgƒ‰ƒbƒvA‘é‚ÌUŒ‚‚É‚à‘®«‘Ï«‚ÆŽí‘°‘Ï«‚ð“K—p‚·‚é‚悤‚ÉC³B
+(–{ŽI‚ÌŽd—l‚É‚ ‚Á‚Ä‚¢‚é‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·‚ª“K—p‚µ‚½•û‚ª³‚µ‚¢‚ÆŽv‚Á‚½‚Ì‚Å
+C³‚µ‚Ü‚µ‚½B)
+ (map/)
+ skill.c C³B
+ map.h C³B
+ battle.c C³B
+
+--------------
+//0654 by Ž€_
+
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌC³‚Æׂ©‚¢C³B(ŒvŽZŽ®ŠÔˆá‚¢‚ÅC³B)
+E0653‚Å‘‚«–Y‚êB‹CŒ÷‚É‚æ‚é’ljÁƒ_ƒ[ƒW‚Í•K’†‚Å‚Í‚È‚¢‚炵‚¢‚Ì‚Å
+C—û‚̉ÁŽZ‚Æ“¯‚¶Š‚ÉŒvŽZ‚·‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+EƒJ[ƒg‚ɃoƒO‚ª‚ ‚è‚»‚¤‚¾‚Á‚½‚Ì‚Å‚¿‚å‚Á‚ÆC³B
+Eƒ_ƒ[ƒWŒvŽZ‚ð‚Ù‚ñ‚Ì­‚µC³B(ƒ_ƒ[ƒW—Ê‚ª•Ï‚í‚Á‚½‚è‚Í‚µ‚Ü‚¹‚ñB)
+ (map/)
+ battle.c
+ battle_calc_magic_attack() C³B
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ skill.c
+ pc_damage_feedback() -> skill_damage_feedback()‚É•ÏXB
+ skill_unit_timer() C³B
+ pc.c
+ pc_setoption() C³B
+ atcommand.c C³B
+
+--------------
+//0653 by Ž€_
+
+E0652‚ÌC³‚Æׂ©‚¢C³B¡‚Ü‚Å’Ê‚è–¢ƒeƒXƒg‚à‘½‚¢‚Å‚·B
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚̈—C³B(–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ÌŽ©g‚Í‚ ‚è‚Ü‚¹‚ñB)
+ƒ‰ƒOƒi[ƒQ[ƒg‚Ìà–¾‚É‚æ‚é‚ÆŽn‚ß‚ÉŒ»ÝHP‚Ì20%‚ªÁ–Õ‚³‚ê‚Ä‚»‚ÌŒã“G‚É—^‚¦‚½
+ƒ_ƒ[ƒW‚Ì’†‚ňê”Ô‚‚¢•¨‚ª–ß‚Á‚Ä‚­‚é‚悤‚Å‚·B‚»‚µ‚Ä‚»‚Ì–ß‚Á‚Ä‚«‚½
+ƒ_ƒ[ƒW‚͹‚Ì‘®«‚ðŽ‚¿ƒgƒ‰ƒXƒg‚É‚æ‚Á‚Ĺ‚Ì‘Ï«‚ª50%‚É‚È‚Á‚Ä‚¢‚é‚Ì‚Å
+”¼•ª‚ð‹ò‚炤‚±‚Æ‚É‚È‚é‚悤‚Å‚·B(¹‚̑ϫオ‚é‘•”õ‚ð‚µ‚Ä‚¢‚ê‚Ζ߂Á‚Ä‚­‚é
+ƒ_ƒ[ƒW‚͎󂯂Ȃ¢‚悤‚Å‚·B)
+–â‘è‚Ȃ̂̓vƒŒƒCƒ„[‚Ì–hŒä‘®«‚ðŒvŽZ‚·‚é‚©‚Ç‚¤‚©‚Å‚·B¡‚Í–hŒä‘®«ŒvŽZ‚Ì
+Œã‚Ź‚Ì‘®«‚ðŒvŽZ‚µ‚Ä‚¢‚Ü‚·B‚»‚µ‚Ä–ß‚Á‚Ä‚­‚éƒ_ƒ[ƒW‚ÍHPƒo[‚ÍŒ¸‚邯‚Ç
+•\Ž¦‚Í‚³‚ê‚Ü‚¹‚ñB–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©•s–¾‚È‚Ì‚Å...
+‚»‚ê‚ƈꉞƒ‚ƒ“ƒXƒ^[‚àƒOƒ‰ƒ“ƒhƒNƒƒX‚ÌŽg—p‚ª‰Â”\‚Å‚·B‚½‚¾ƒ‚ƒ“ƒXƒ^[‚Ìê‡
+Œ»ÝHP‚Ì20%Á–Õ‚ÌŒã‚̃_ƒ[ƒW‚͎󂯂܂¹‚ñB(ƒ‚ƒ“ƒXƒ^[‚ªŽg‚¤
+ƒOƒ‰ƒ“ƒhƒNƒƒX‚̃eƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB)
+Eƒ_ƒ[ƒW‚É‚æ‚éƒfƒBƒŒƒC’†‚É‚Ü‚½ƒfƒBƒŒƒC‚ª‚©‚©‚ç‚È‚¢‚悤‚ÉC³B(‘債‚½ˆÓ–¡‚Í‚È‚¢‚©‚à...)
+E’l’i‚ªƒ[ƒ‚̃AƒCƒeƒ€‚à”„‚ê‚é‚悤‚É•ÏXB
+E@ƒRƒ}ƒ“ƒhheal‚̈—­‚µC³B
+EˆÚ“®ƒR[ƒh­‚µC³B
+ (map/)
+ clif.c
+ clif_selllist() C³B
+ battle.c
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_magic_attack()Abattle_calc_misc_attack() C³B
+ skill.c
+ skill_additional_effect()Askill_unit_onplace() C³B
+ skill_status_change_start()Askill_unit_onplace() C³B
+ skill_castend_damage_id()Askill_castend_id()Askill_attack() C³B
+ skill_unitsetting()Askill_check_condition() C³B
+ skill_use_id()Askill_use_pos() C³B
+ npc.c
+ npc_parse_script() C³B
+ pc.h C³B
+ pc.c
+ pc_walk()Apc_walktoxy_sub()Apc_stop_walking() C³B
+ map.h C³B
+ mob.h C³B
+ mob.c
+ mob_stop_walking()Amob_changestate()Amob_walk() C³B
+ pet.c
+ pet_changestate() C³B
+ atcommand.c C³B
+ (db/)
+ skill_db.txt ƒOƒ‰ƒ“ƒhƒNƒƒXC³B
+ cast_db.txt ƒOƒ‰ƒ“ƒhƒNƒƒXC³B
+
+--------------
+//0652 by ŒŽ‰r‚Ý
+
+EƒOƒ‰ƒ“ƒhƒNƒƒX‚ð‰¼ŽÀ‘•
+ (db/)
+ skill_db.txt
+ cast_db.txt
+ (map/)
+ battle.c
+ Damage battle_calc_misc_attack
+ Damage battle_calc_magic_attack
+ skill.c
+ skill_additional_effect
+ skill_castend_damage_id
+ skill_castend_pos2
+ skill_unit_group *skill_unitsetting
+ skill_unit_onplace
+ skill_check_condition
+
+--------------
+//0651 by ”g˜Q
+
+Eitem_db.txt‚ðC³
+ (db/)
+ item_db.txt
+ ‘•”õ•i‚̃AƒCƒeƒ€Œø‰Ê‚ðC³
+
+--------------
+//0650 by Ž€_
+
+EŽO’i¶‚Ì”­“®ðŒ‚ð‹|‚Æ“ñ“—¬ˆÈŠO‚É•ÏXB
+E•\Ž¦‚ð‚¹‚¸‚É“à•”‚ň—‚¾‚¯‚·‚éNPC‚ÌCLASS‚ð111‚©‚ç32767‚É•ÏXB
+Eׂ©‚¢C³B
+ (map/)
+ clif.c
+ clif_getareachar_npc()Aclif_spawnnpc()Aclif_pcoutsight() C³B
+ npc.h C³B
+ battle.c
+ battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+
+--------------
+//0649 by ”g˜Q
+
+EDB‚ÆDOCC³
+ (db/)
+ item_db.txt
+ ƒOƒ“ƒOƒj[ƒ‹‚ÍLV4•Ší‚È‚Ì‚ÅAŠØ‘‚̃f[ƒ^‚É‚ ‚킹‚Ä•—‘®«‚Å‚Í‚È‚­‚µ‚Ü‚·B
+ mob_db.txt
+ size_fix.txt
+ ŠyŠí‚Í‘åŒ^‚ɑ΂µ‚Ä75%‚¾‚»‚¤‚Å‚·B
+ (doc/)
+ item_bonus.txt
+
+--------------
+//0648 by Ž€_
+
+EƒVƒ‡ƒbƒv‚Ì’l’i‚É-‚ð“ü‚ê‚é‚ÆŽI‚ª—Ž‚¿‚é–â‘èC³B(itemdb‚̉Šú‰»‚ðnpc‚æ‚è
+æ‚É‚·‚é‚悤‚É•ÏXB) ‚»‚ꂾ‚¯‚Å‚·B
+ (map/)
+ map.c
+ do_init()
+
+--------------
+//0647 by nini
+
+Eitem_dbC³
+EƒXƒiƒbƒ`ƒƒ[Žd—l•ÏXB‹|ˆÈŠO‚Ì‚·‚ׂĂ̕Ší‚Åo‚é‚悤‚É‚È‚Á‚Ä‚Ü‚·B
+ (/map/)
+ battle.c
+ ŽO’i¶‚Ì”­“®ðŒ’ljÁ
+ skill.c
+ ƒXƒiƒbƒ`ƒƒ[‚Ì”­“®ðŒ’ljÁ
+ (/db/)
+ item_db.txt
+ ƒVƒ‹ƒNƒnƒbƒg‚ÉSP㸒ljÁ
+
+--------------
+//0646 by last
+
+Eitem_db.txt‚ÌC³(‘®«ŠÖ˜A)
+ (/db/)
+ item_db.txt
+
+--------------
+//0645 by ‚é‚é‚éi•ree_ronj
+
+Eitem_value_db.txt‚ɃfƒBƒXƒJƒEƒ“ƒg•ƒI[ƒo[ƒ`ƒƒ[ƒW“™‚̃XƒLƒ‹‚É‚æ‚鉿Ši•Ï“®‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒOƒƒ“ƒg‚ð’ljÁB
+@ŽÀÛ‚ÌŒ`Ž®‚̓Tƒ“ƒvƒ‹‚Æ‚µ‚Ä—pˆÓ‚µ‚½item_value_db.sample.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢Biݒ艿Ši‚ÍŠ®‘S‚É“Æ’f‚Æ•ÎŒ©‚Å‚·j
+@“¯—l‚̃Tƒ“ƒvƒ‹‚Æ‚µ‚Ä‚m‚o‚bÝ’uƒXƒNƒŠƒvƒg‚à“Y•t‚µ‚Ä‚¨‚«‚Ü‚·B
+Eitem_value_db.txt‚̃AƒCƒeƒ€‰¿ŠiÝ’è‚ÅA”„’l‚Æ”ƒ’l‚ÌÝ’è‚ð“Æ—§Biitem_db.txt‚Í]—ˆ‚Ç‚¨‚蔃’l‚Í”„’l‚Ì”¼Šz‚Æ‚µ‚ÄŽ©“®ˆ—j
+E‚m‚o‚bƒVƒ‡ƒbƒv‚É‚ÄA‚P‚m‚o‚b‚ňµ‚¦‚éƒAƒCƒeƒ€”‚ðÅ‘å64‚©‚çÅ‘å100‚É•ÏXBiƒNƒ‰Ž©‘Ì‚Í120‚®‚ç‚¢‚܂ʼn”\‚Å‚·‚ªj
+ (/db)
+ item_value_db.txt
+ ƒJƒ‰ƒ€”‚ð®—‚µ‚½‚¾‚¯‚Å‚·B“à—e‚Í‚Ü‚Á‚½‚­•ÏX‚µ‚Ä‚¢‚Ü‚¹‚ñB
+ (/map/)
+ clif.c
+ clif_buylist() clif_selllist() •ÏX
+ itemdb.h
+ item_data \‘¢‘Ì•ÏX
+ itemdb_value_buy() itemdb_value_sell() itemdb_value_notdc() itemdb_value_notoc() ƒ}ƒNƒ’ljÁ
+ itemdb.c
+ itemdb_search() itemdb_readdb() itemdb_read_itemvaluedb() •ÏX
+ itemdb_sellvalue() íœ
+ npc.c
+ npc_buylist() npc_selllist() npc_parse_shop() •ÏX
+ (/sample/)
+ ƒIƒ}ƒP‚Å‚·BŽŸ‰ñSnapShot‚É‚ÍŠÜ‚Ü‚È‚¢‚Å‹X‚µ‚¢‚Å‚·B
+
+ƒRƒƒ“ƒg
+Œ´Œ^‚ÍŽ„‚Ì—Flree_ron‚ªs‚¢AŽ„‚ªX‚Éׂ©‚¢ƒ~ƒX‚𒼂µ‚½‚¾‚¯‚Å‚·‚ªAƒeƒXƒg‚Í‚µ‚Ü‚µ‚½‚Ì‚Å‘åä•v‚Å‚µ‚傤B
+Œ³X‚±‚̈—‚𓱓ü‚·‚é——R‚Æ‚µ‚ÄA“Á’èƒAƒCƒeƒ€‚Ì”„’l‚ª1zŒÅ’è‚É‚Å‚«‚È‚¢‚à‚Ì‚©A‚Æ‚¢‚¤“_‚¾‚Á‚½‚©‚ç‚Å‚·B
+‚»‚µ‚Ä‚â‚Á‚Ä‚¢‚­‚¤‚¿‚ÉA‚m‚o‚bƒVƒ‡ƒbƒv‚ð—˜—p‚µ‚½ƒŒƒAƒAƒCƒeƒ€‚̔̔„‚Æ‚©‚Å–{ŽI˜I“X‚É‹ß‚¢‚±‚Æ‚ªo—ˆ‚é‚Ì‚Å‚Í‚È‚¢‚©A
+‚Æ‚¢‚¤‚±‚Æ‚ª”»‚Á‚Ä‚«‚½‚킯‚Å‚·B
+‚»‚ê‚ňꉞ‚̓f[ƒ^‚ð—pˆÓ‚µ‚Ü‚µ‚½‚ªA‚ ‚­‚Ü‚Å‚àƒTƒ“ƒvƒ‹‚Æ‚µ‚Ä—˜—p‚µ‚Ä‚­‚¾‚³‚¢B‚à‚µ‰Â”\‚È‚ç‚ÎA
+‚³‚ç‚ÉC³‚ð‰Á‚¦‚ăAƒeƒi“ÆŽ©‚Æ‚µ‚Ä–{Ì—p‚Æ‚µ‚½ƒf[ƒ^‚ðƒpƒbƒ`ƒAƒbƒv‚µ‚Ä‚­‚ê‚ê‚΂ƂàŽv‚¢‚Ü‚·‚ª‚—
+
+
+--------------
+//0644 by nini
+
+EDB‚̊ԈႢA643‚ŒljÁ‚³‚ꂽƒXƒNƒŠƒvƒg’ljÁB
+ (/db/)
+ item_db.txt
+ cast_db.txt
+ ƒ`ƒƒ[ƒWƒAƒ[‚̃LƒƒƒXƒg’ljÁB
+ exp_guild.txt
+ 46-50‚Ü‚Å‚Ìexp”²‚¯‚ɒljÁB
+ size_fix.txt
+ ŠyŠíA•ÚAƒiƒbƒNƒ‹‚̃TƒCƒY•â³C³B
+
+--------------
+//0643 by Ž€_
+
+EFX‚ÆC³B
+EbMVPaddAtkRateíœBbAddRace‚ň—‚·‚é‚悤‚É•ÏXB
+EbIgnoreDefEle‚ÆbIgnoreDefRace’ljÁB
+bonus bIgnoreDefEle,n; n‘®«‚Ì“G‚Ì–hŒä–³Ž‹
+bonus bIgnoreDefRace,n; nŽí‘°‚Ì“G‚Ì–hŒä–³Ž‹
+EbMatkRate’ljÁB–‚–@UŒ‚—Í‚ð+n%ã‚°‚Ü‚·B‚æ‚Á‚Äbattle.c‚ÅŒvŽZ‚µ‚Ä‚¢‚½ƒƒbƒh‚É‚æ‚é–‚–@UŒ‚—Í‘•‚ÌŒvŽZ‚Í‚È‚­‚µ‚Ü‚µ‚½BƒXƒe[ƒ^ƒX‰æ–Ê‚Éオ‚Á‚½”’l‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñBƒ_ƒ[ƒWŒvŽZ‚ÌŽž‚É“K—p‚µ‚Ä‚¢‚Ü‚·B
+EbCriticalDef‚É-‚ð“ü‚ê‚é‚ƃNƒŠƒeƒBƒJƒ‹‚ð‹ò‚炤Šm—¦‚ªã‚ª‚é‚悤‚É•ÏXB
+ENPC”Ô†111‚Í“§–¾NPC‚Å‚·‚ª—Ž‚Æ‚µŒŠ“™‚Ì‚±‚Æ‚ðl‚¦‚Ä•\Ž¦‚ðˆêØ‚¹‚¸‚É
+“à•”‚ň—‚¾‚¯‚·‚é‚悤‚É•ÏXB(flag‚ðŽg‚¤‚Ɖ½‚Æ‚©‚È‚è‚»‚¤‚Å‚·‚ª‚»‚Ì
+ˆ—‚ª‘S‘R‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“§–¾NPC‚ɃNƒŠƒbƒN‚â–¼‘O‚Ì•\Ž¦‚à‚Å‚«‚È‚¢‚悤‚É•ÏX‚µ‚Ü‚µ‚½B)
+EƒVƒ‡ƒbƒv‚Ì’l’i‚É-‚ð“ü‚ê‚é‚Æitem_db.txt‚à‚µ‚­‚Íitem_value_db.txt‚Ì•¨‚ðŽg‚¤‚悤‚É•ÏXB
+EƒXƒLƒ‹ƒ‹ƒAƒt‚̃GƒtƒFƒNƒg‚ªƒTƒCƒg‚Æ“¯‚¶‚¾‚Á‚½‚Ì‚ÅC³B‚‚¢‚łɃ‹ƒAƒt‚Ì
+ƒ_ƒ[ƒW‚àC³B
+E‚Ý‚·‚Ƃꑃ‚É‚æ‚é‚ƃ‚ƒ“ƒXƒ^[î•ñ‚Å•\Ž¦‚³‚ê‚é–hŒä‚Æ–‚–@–hŒä‚ÍæŽZ‚Å‚Í‚È‚­Œ¸ŽZ‚Ý‚½‚¢‚È‚Ì‚ÅC³B
+E‘¼—Í–{Šè‚Å‚·‚ªitem_db.txt‚ÌC³‚ð‚¨Šè‚¢‚µ‚Ü‚·B(‘S‚Ẵƒbƒh‚Ébonus bMatkRate,15; ‚ð“ü‚ê‚é•K—v‚ª‚ ‚è‚Ü‚·B‚»‚Ì‘¼‚ÌC³‚à•K—v‚Å‚·B)
+EƒeƒXƒg‚µ‚Ä‚¢‚È‚¢•¨‚à‚©‚È‚è‚ ‚è‚Ü‚·‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
+ (map/)
+ map.h C³B
+ map.c
+ map_quit() C³B
+ pc.h C³B
+ pc.c
+ pc_walk()Apc_stop_walking()Apc_setpos()Apc_authok() C³B
+ pc_calcstatus()Apc_bonus()Apc_natural_heal_sub() C³B
+ npc.h C³B
+ npc.c
+ npc_touch_areanpc()Anpc_parse_shop() C³B
+ clif.c
+ clif_quitsave()Aclif_getareachar_npc()Aclif_spawnnpc() C³B
+ clif_skill_estimation() C³B
+ battle.c
+ battle_calc_magic_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_calc_mob_weapon_attack() C³B
+ mob.c
+ mobskill_use() C³B
+ skill.c
+ skill_status_change_end()Askill_status_change_timer() C³B
+ skill_status_change_start() C³B
+ (db/)
+ const.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+
+--------------
+//0642 by Ž€_
+
+E‘•”õƒoƒOC³B(‚»‚ꂾ‚¯)
+ (map/)
+ pc.c
+ pc_authok()Apc_checkitem() C³B
+
+--------------
+//0641 by Ž€_
+
+EbAspdRate‚ÆbSpeedRate‚̃oƒOC³B(‚»‚ꂾ‚¯)0640‚ÅŒvŽZ‚ð‚¿‚å‚Á‚Æ•Ï‚¦‚ÄŒ©‚Ü‚µ‚½‚ª‚»‚ꂪ‚Ü‚¸‚©‚Á‚½‚Ý‚½‚¢‚Å‚·B¡“x‚àŒvŽZŽ®‚ð•Ï‚¦‚Ü‚µ‚½‚ª‚à‚¤‘åä•v‚¾‚ÆŽv‚¢‚Ü‚·B(‘½•ª)
+ (map/)
+ pc.c
+ pc_calcstatus()Apc_bonus()Apc_delitem()
+
+--------------
+//0640 by Ž€_
+
+EƒoƒOC³‚Æ­‚µC³B
+E‚Ý‚·‚Ƃꑃ‚ðŽQl‚µ‚ă_ƒ[ƒWŒvŽZ‚ð­‚µC³B
+Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚Å)
+EƒLƒƒƒ‰‚ÌHP‚ÆSP‚ð2byte‚©‚ç4byte‚É•ÏXB(ƒeƒXƒg‚Í‚µ‚Ä‚¢‚Ü‚·‚ªƒoƒO‚ªo‚é
+‰Â”\«‚à‚©‚È‚è‚ ‚è‚Ü‚·B‚½‚¾ƒLƒƒƒ‰ƒZƒŒƒNƒg‰æ–Ê‚ÅHP‚âSP‚ª32768‚ð‰z‚¦‚鎞
+•\Ž¦‚Í32768‚ɂȂ邯‚Ç“à•”‚̈—‚ͳí‚É“®‚«‚Ü‚·‚Ì‚Å‚»‚ê‚̓oƒO‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+ƒpƒPƒbƒg‚Ì’·‚³‚Ì‚¹‚¢‚Å‚»‚êˆÈŠOŽè’i‚ª‚È‚©‚Á‚½‚Ì‚Å...)
+EbCriticalDef(ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢Šm—¦+n%)‚̈—•ÏXB100‚É‚·‚ê‚Î
+ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢‚悤‚É‚È‚è‚Ü‚·B)
+EbInnerAtk‚ðbBaseAtk‚É•ÏXB‚Ý‚·‚Ƃꑃ‚ŃJ[ƒh‚ÌUŒ‚‚ÍŠî–{UŒ‚—Í‚Ì•û‚É‘«‚³‚ê‚é‚Æ‚ ‚è‚Ü‚µ‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½B¡“x‚Íオ‚Á‚½UŒ‚—Í‚ª•\Ž¦‚³‚ê‚Ü‚·B
+EbDoubleRate‚̈—•ÏXBŠm—¦‚ð‘«‚³‚¸‚Ɉê”Ô‚‚¢•¨‚¾‚¯“K—p‚µ‚Ü‚·B‚»‚ê‚ƶŽè
+‘•”õ‚Ìꇖ³Ž‹‚·‚é‚悤‚É•ÏX‚µ‚Ü‚½B(¶Žè‚̓_ƒuƒ‹‚ª“K—p‚³‚ê‚Ü‚¹‚ñ‚Ì‚Å)
+EbDoubleAddRate’ljÁB‹@”\‚̓_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦+n%(•Ší–³Ž‹)‚Å‚·B
+¶Žè‘•”õ‚Í–³Ž‹‚³‚ê‚Ü‚·B
+E0635‚ÅUŒ‚—Í•\Ž¦‚ð–{ŽI‚É‚ ‚킹‚Ü‚µ‚½B‚»‚µ‚Ä¡“x‚Í‹|‚¾‚¯‚Å‚Í‚È‚­
+ŠyŠí‚ƃ€ƒ`‚àdex‚É‚æ‚Á‚ÄUŒ‚—Í‚ªã‚ª‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+E‘•”õ‚µ‚½•Ší‚ªÁ‚¦‚éƒoƒOC³‚ׂ̈ɭ‚µC³‚Í‚µ‚Ü‚µ‚½‚ª–{“–‚É
+‘åä•v‚È‚Ì‚©‚Í•s–¾‚Å‚·B•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ const.txt C³B
+ item_db.txt C³B
+ (doc/)
+ item_bonus.txt C³B
+ conf_ref.txt C³B
+ (map/)
+ map.h C³B
+ pc.c
+ pc_calcstatus()Apc_bonus()Apc_equipitem() C³B
+ battle.h C³B
+ battle.c
+ battle_calc_mob_weapon_attack()Abattle_calc_pc_weapon_attack() C³B
+ battle_config_read() C³B
+ clif.c
+ clif_updatestatus()Aclif_parse_LoadEndAck()Aclif_party_hp() C³B
+ (common/)
+ mmo.h C³B
+ (char/)
+ char.c
+ mmo_char_send006b()Aparse_char() C³B
+
+--------------
+//0639 by ŒÓ’±—–
+
+Eladmin‚ÌC³‚È‚Ç
+ Eƒvƒƒ“ƒvƒg‚Ì“ü—Í‚ÉTerm::ReadLine‚ðŽg‚¤‚悤‚É‚µ‚½
+ @i“ü—Í—š—ð‚âƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ì•ÒW‚ª‰Â”\‚Éj
+ EPOSIXŠÖŒW‚̈—‚Ì—áŠOƒGƒ‰[‚ðƒgƒ‰ƒbƒv‚·‚é‚悤‚É‚µ‚Ü‚µ‚½
+ @iPOSIX‚ª‘S‚­Žg‚¦‚È‚¢ŠÂ‹«‚Å‚àÅ’áŒÀA“®‚­‚悤‚É‚È‚Á‚½‚©‚à‚µ‚ê‚È‚¢j
+ Eו”C³
+
+ (tool/)
+ ladmin
+ Ver.1.04‚ÉB
+
+EMODƒo[ƒWƒ‡ƒ“‚ª‚¨‚©‚µ‚¢–â‘è‚ðC³
+ (common/)
+ version.h
+ ATHENA_MOD_VERSION‚ª‚Wi”‚Å‹Lq‚³‚ê‚Ä‚¢‚é–â‘è‚ðC³
+ ”Žš‚Ì“ª‚É0‚ð‚‚¯‚é‚Æ‚Wi”‚É‚È‚é‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢
+
+--------------
+//0638 by ”g˜Q
+
+E0635E0637‚ÅV‚µ‚­ƒAƒCƒeƒ€Œø‰Ê‚ªŽÀ‘•‚³‚ꂽ‚Ì‚ÅA‚»‚ê‚É”º‚Á‚Äitem_db.txt‚ðC³
+Eitem_bonus.txt‚ðC³
+ (db/)
+ item_db.txt C³
+ (doc/)
+ item_bonus.txt C³
+
+--------------
+//0637 by Ž€_
+
+E0635‚̃oƒOC³B
+Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B)
+EŽžŠÔ‚ª’x‚·‚¬‚Ä0635‚Åà–¾‚µ‚Ä‚È‚©‚Á‚½‚Å‚·B(Q•s‘«‚¾‚Á‚½‚Ì‚Å...)
+‚Ü‚¸Žd—l‚ª•Ï‚í‚Á‚½‚Ì‚Í“ñ“—¬‚̃_ƒ[ƒW‚ð•Ší•Ê‚ÉŠ®‘S‚É•ª‚¯‚Äs‚¤‚悤‚É
+•ÏX‚ƃAƒTƒVƒ“‚¶‚á‚È‚­‚ĂඎèC—û‚ðŠo‚¦‚Ä‚¢‚ê‚Γñ“—¬‚ðŽg‚¦‚é‚悤‚É
+•ÏX‚µ‚Ü‚µ‚½B‚»‚ê‚ƃ_ƒ[ƒW‚ÌŒvŽZ‚ð‚¿‚å‚Á‚ÆC³B
+‚»‚µ‚Äbonus‚ɒljÁ‚³‚ꂽ‚Ì‚Í
+bonus bInnerAtk,n; “à•”UŒ‚—Í+n
+ƒJ[ƒh‚̈ø‚«ã‚°ƒ_ƒ[ƒW—p‚Å‚·B•\Ž¦‚Í‚³‚ê‚È‚¢‚¯‚ǃ_ƒ[ƒW‚ÉŒvŽZ‚³‚ê‚Ü‚·B
+bonus bSpeed,n; ˆÚ“®‘¬“x+n
+ˆÚ“®‘¬“x‚ðnã‚°‚Ü‚·B
+bonus bAspd,n; UŒ‚‘¬“x+n
+UŒ‚‘¬“x‚ðnã‚°‚Ü‚·B
+bonus bSpeedRate,n; ˆÚ“®‘¬“x+n%
+ˆÚ“®‘¬“x‚ðn%ã‚°‚Ü‚·B
+bonus bAspdRate,n; UŒ‚‘¬“x+n%
+UŒ‚‘¬“x‚ðn%ã‚°‚Ü‚·B
+bonus bHPrecovRate,n; HPŽ©“®‰ñ•œ—¦+n%
+Ž©“®‰ñ•œ‚·‚éHP‚Ì—Ê‚ðn%ã‚°‚Ü‚·BƒXƒLƒ‹‚É‚æ‚é‰ñ•œ‚ɂ͉e‹¿‚ª‚ ‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚Æ‚ ‚Á‚Ä‚¢‚é‚©‚Í•s–¾‚Å‚·B
+bonus bSPrecovRate,n; SPŽ©“®‰ñ•œ—¦+n%
+Ž©“®‰ñ•œ‚·‚éSP‚Ì—Ê‚ðn%ã‚°‚Ü‚·BƒXƒLƒ‹‚É‚æ‚é‰ñ•œ‚ɂ͉e‹¿‚ª‚ ‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚Æ‚ ‚Á‚Ä‚¢‚é‚©‚Í•s–¾‚Å‚·B
+bonus bCriticalDef,n; ƒNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚í‚È‚¢Šm—¦+n%
+ƒNƒŠƒeƒBƒJƒ‹‚Ì‘Ï«‚ðnã‚°‚Ü‚·B10000ˆÈã‚É‚·‚é‚ƃNƒŠƒeƒBƒJƒ‹‚ð‹ò‚ç‚¢‚Ü‚¹‚ñB
+bonus bMVPaddAtkRate,n; MVPƒ‚ƒ“ƒXƒ^[‚Én%‚̒ljÁƒ_ƒ[ƒW
+ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚Én%‚̒ljÁƒ_ƒ[ƒW‚ð—^‚¦‚Ü‚·B[•£‚Ì‹RŽmƒJ[ƒh—pB
+bonus bNearAtkDef,n; ‹ß‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚ç‚·
+‘S‚Ä‹ß‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚炵‚Ü‚·B(–‚–@‚ƃgƒ‰ƒbƒvA‘é‚𜂭)
+bonus bLongAtkDef,n; ‰“‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚ç‚·
+‘S‚ĉ“‹——£UŒ‚‚̃_ƒ[ƒW‚ðn%‚ÌŒ¸‚炵‚Ü‚·B(–‚–@‚ƃgƒ‰ƒbƒvA‘é‚𜂭)
+bonus bDoubleRate,n; ƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦+n%(•Ší–³Ž‹)
+•Ší‚ÉŠÖŒW‚È‚­”­“®‚·‚éƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦‚ðn%ã‚°‚Ü‚·B
+ƒ_ƒuƒ‹ƒAƒ^ƒbƒNƒXƒLƒ‹‚Æ•Ê‚Ì”»’è‚ðs‚¤ˆ×ƒ_ƒuƒ‹ƒAƒ^ƒbƒNƒXƒLƒ‹‚ª
+‚ ‚Á‚Ä‚àƒXƒLƒ‹‚É‚æ‚éƒ_ƒuƒ‹ƒAƒ^ƒbƒNŠm—¦‚ªã‚ª‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+ƒTƒCƒhƒƒCƒ“ƒ_[ƒJ[ƒh—pB
+ (map/)
+ pc.c
+ pc_bonus()Apc_calcstatus() C³B
+ pc_natural_heal_sub() C³B
+ battle.h
+ struct Battle_Config {} C³B
+ battle.c
+ battle_calc_pc_weapon_attack()Abattle_calc_mob_weapon_attack() C³B
+ battle_config_read() C³B
+ (db/)
+ skill_db.txt
+ ƒXƒeƒB[ƒ‹‚ÌSP‚ð10‚ÉC³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+
+--------------
+//0636 by Sin
+
+EƒfƒoƒbƒO—pƒ|ƒ^Žq‚³‚ñƒXƒNƒŠƒvƒg(npc_pota.txt)‚̃Aƒ}ƒcEƒRƒ“ƒƒ“‚ւ̑ΉžB
+@‚·‚Å‚ÉŽ©—ÍŽÀ‘•‚³‚ê‚Ä‚¢‚ç‚Á‚µ‚á‚é•ûX‚à‘½‚¢‚©‚ÆŽv‚¢‚Ü‚·‚ªcB
+@ƒRƒ“ƒƒ“ƒ_ƒ“ƒWƒ‡ƒ“‚Ì–¼‘O‚ª‚í‚©‚ç‚È‚¢‚½‚ßu›À›ÄD1v‚È‚Ç‚Æ‚³‚¹‚Ä‚¢‚½‚¾‚¢‚Ä‚¢‚Ü‚·B
+ (conf/) npc_pota.txt
+
+--------------
+//0635 by Ž€_
+
+Ebattle_athena.conf‚É€–ڒljÁB(Ú‚µ‚¢‚±‚Æ‚Íconf_ref.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B)
+Ebonus‚ÉbInnerAtk(ƒJ[ƒh“™‚Å•\Ž¦‚Í‚³‚ê‚È‚¢‚¯‚ÇŽÀÛ‚É‚ÍUŒ‚—Í‚É”½‰f‚³‚ê‚镨—p‚Å‚·B)“™‚ð’ljÁB‘¼‚Ì‚Íitem_bonus.txt‚ðŒ©‚Ä‚­‚¾‚³‚¢B(’ljÁ‚Í‚µ‚½‚¯‚Çitem_db.txt‚Í–w‚ñ‚ÇC³‚µ‚Ä‚Ü‚¹‚ñB)
+E‚»‚Ì‘¼ƒoƒOC³‚âŽd—l•ÏX‚à‚â‚è‚Ü‚µ‚½‚ªˆêX‘‚­ŽžŠÔ‚ª‚È‚¢‚Ì‚Å...
+ (map/)
+ makeile C³B
+ pc.c C³B
+ map.h C³B
+ clif.c C³B
+ battle.h C³B
+ battle.c C³B
+ itemdb.c C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ item_bonus.txt C³B
+ (db/)
+ const.txt C³B
+ item_db.txt C³B
+
+--------------
+//0634 by Ž€_
+
+EweddingƒNƒ‰ƒX‚É‚Í“]E‚Å‚«‚È‚¢‚悤‚ÉC³B
+EƒX[ƒp[ƒm[ƒrƒX‚ׂ̈Éexpƒe[ƒuƒ‹‚ðbase 4‚Âjob 4‚‚Ɋg’£B
+exp.txt‚ª•Ï‚í‚èƒX[ƒp[ƒm[ƒrƒX‚¾‚¯‚ÌŒoŒ±’l‚ðÝ’è‚Å‚«‚Ü‚·B(exp.txt‚Ì
+4‚–ڂªƒX[ƒp[ƒm[ƒrƒX‚Ìbase exp‚Å8‚–ڂªjob exp‚Å‚·B¡‚Í2ŽŸE‹Æ‚Ì•¨‚ð
+ƒRƒs[‚µ‚½•¨‚ɉ߂¬‚Ü‚¹‚ñ‚ªB) exp.txt‚ÌÝ’è•û–@‚à’m‚ç‚È‚¢•û‚Í‚¢‚È‚¢‚Æ
+Žv‚¢‚Ü‚·‚Ì‚Åà–¾‚ÍÈ—ª‚µ‚Ü‚·B
+EƒX[ƒp[ƒm[ƒrƒX‚Í“]¶‚̃eƒXƒg‚ׂ̈ɊؑƒTƒNƒ‰ƒC‚¾‚¯ŽÀ‘•‚µ‚Ä‚¢‚镨‚Æ
+Žv‚í‚ê‚Ü‚·‚ª(“]¶‚ªŽÀ‘•‚³‚ê‚ê‚΂Ȃ­‚È‚é‚Æ—\‘ª‚µ‚Ä‚¢‚Ü‚·B)‚»‚ê‚ð
+ŽÀ‘•‚µ‚Ä‚¢‚¢‚Ì‚©‚ÆŽv‚Á‚½‚è‚à‚µ‚Ü‚·‚ª...
+EŒ‹¥ˆßÖ‚ÍŠù‚É0629‚ÅŽÀ‘•‚µ‚Ä‚¢‚é‚Ì‚É‚Ü‚½ƒpƒbƒ`‚Æ‚µ‚Ä
+ƒAƒbƒv‚³‚ê‚é‚Ì‚à‚¿‚å‚Á‚Æ•Ï(H)‚Å‚·‚ËB‚»‚¤‚¢‚¦‚Îà–¾‚µ‚Ä‚È‚©‚Á‚½‚ñ‚Å‚·‚ËB
+E‘•”õê—pƒXƒNƒŠƒvƒg‚Å‚ ‚échangebase‚̒ljÁ‚É‚æ‚Á‚ă^ƒLƒV[ƒh‚Æ
+ƒEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ªŽÀ‘•‚µ‚Ä‚¢‚Ü‚·B‚±‚ê‚ÍE‹Æ‚ð•ÏX‚¹‚¸‚ÉŒ©‚½–Ú‚¾‚¯
+•Ï‚¦‚镨‚Å‚·BweddingƒNƒ‰ƒXˆÈŠO‚Ì“K—p‚à‰Â”\‚Å•Ï‘•ƒZƒbƒg‚Æ‚©‚àì‚ê‚é
+‚킯‚Å‚·‚ª“à•”ˆ—‚Í•ÏX‚¹‚¸‚ÉŒ©‚½–Ú‚¾‚¯•Ï‚¦‚Ä‚¢‚é‚Ì‚Å0631‚Åà–¾‚µ‚½‚悤‚É
+‘•”õ‚Å‚«‚È‚¢•¨‚ð‘•”õ‚µ‚Ä‚¢‚éꇈƗŽ‚¿‚ª‹N‚±‚é‰Â”\«‚ª‚ ‚è‚Ü‚·‚Ì‚Å
+‘¼‚ÌE‹Æ‚ÅŽg‚¤‚Ì‚Í‚¨Š©‚ß‚µ‚Ü‚¹‚ñB‰¼ŽÀ‘•‚È‚Ì‚Í¡‚ÌŽd—l‚̓^ƒLƒV[ƒh‚Æ
+ƒEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚ð‘•”õ‚·‚邾‚¯‚ÅŒ©‚½–Ú‚ª•Ï‚í‚é‚©‚ç‚Å‚·BŠØ‘ƒTƒNƒ‰ƒC‚Ì
+•û‚ł͉½‚©‚ÌðŒ‚ª•K—v‚¾‚ÆŽv‚Á‚Ä‚¢‚é‚Ì‚Å‚»‚ÌðŒ‚ª‚Ü‚¾ŽÀ‘•‚³‚ê‚¢‚È‚¢‚©‚ç
+‰¼ŽÀ‘•‚Å‚·B‚»‚ê‚ÉweddingƒNƒ‰ƒX‚ðE‹Æ‚É‚µ‚Ä‚µ‚Ü‚¤‚ÆŒ‹¥‚·‚é‚ƃXƒLƒ‹“™‚ª
+ƒŠƒZƒbƒg‚³‚ê‚é‚©•Ï‚É‚È‚é‚©‚Ì‚Ç‚¿‚ç‚È‚Ì‚Å•Ï‚¾‚ÆŽv‚Á‚Ä‚È‚©‚Á‚½‚Ì‚Å‚µ‚傤‚©H
+ help.txt C³B
+ (db/)
+ job_db1.txt C³B
+ exp.txt C³B
+ (map/)
+ pc.c
+ pc_jobchange()Apc_readdb() C³B
+ pc_nextbaseexp()Apc_nextjobexp() C³B
+
+--------------
+//0633 by ”g˜Q
+
+E‘•”õ‚ÌÝ’èC³BŒ‹¥ˆßÖ‚ÌE‚ÍAŽÀÛ‚É“]E‚·‚é‚Ì‚Å‚Í‚È‚­ƒyƒRƒiƒCƒg(13)AƒyƒRƒNƒ‹ƒZ(21)‚̂悤‚ɉ摜‚ðŽg‚¤‚¾‚¯‚¾‚ÆŽv‚¤‚Ì‚Å
+@‰½‚à‘•”õ‚Å‚«‚È‚¢Ý’è‚É‚µ‚Ü‚µ‚½BƒXƒpƒmƒr‚̓mƒr‚ª‘•”õ‚Å‚«‚é‚à‚Ì‚¾‚¯Ý’肵‚Ü‚µ‚½B
+EŒÃ–Ø‚ÌŽ}‚ÌoŒ»ƒ‚ƒ“ƒXƒ^[‚ð’ljÁ
+EƒAƒ}ƒc‚̃‚ƒ“ƒX‚Ì•¦‚«‹ï‡‚ð–{ŽI‚É‹ß‚­‚È‚é‚悤‚ÉC³(‚Ü‚¾‚Ü‚¾ˆá‚¢‚Ü‚·‚ªEEE)
+ (conf/)
+ npc_monster.txt ƒ‚ƒ“ƒX–¼C³
+ npc_monster_amatsu.txt C³
+ (db/)
+ item_avail.txt ˆÆ—Ž‚¿ƒAƒCƒeƒ€’ljÁ
+ item_db.txt ‘•”õÝ’è‚ðC³A‘¼‘½”
+ mob_branch.txt C³
+ mob_db.txt ƒ‚ƒ“ƒX–¼C³
+ skill_tree.txt C³
+
+--------------
+//0632 by nini
+
+E@jobchange‚ÅŒ‹¥ˆßւƃX[ƒp[ƒm[ƒrƒX‚É‚È‚ê‚é‚悤‚ÉB(’ˆÓFŠØ‘÷ˆäƒNƒ‰ƒCƒAƒ“ƒg‚Ì‚Ý)
+ESƒmƒr‚̃XƒeAƒXƒLƒ‹‚È‚Ç‚àŽb’è’ljÁB(ƒm[ƒrƒX‚̃Rƒs[‚Å‚·‚ª)
+@‚Æ‚è‚ ‚¦‚¸Œ©‚½–Ú‚¾‚¯‚Æ‚¢‚¤‚±‚Æ‚ÅAŒ‹¥ˆßÖ‚Å‚àUŒ‚‚Å‚«‚Ü‚·‚ª(‚½‚¾‚µƒm[ƒ‚[ƒVƒ‡ƒ“)A–{—ˆ‚Í‚Å‚«‚Ü‚¹‚ñB
+Eã‚É‚ ‚킹‚Äitem_db•ÒWB
+@Œ‹¥ˆßÖ‚Å•Ší‚à‚‚ÆactAsprƒGƒ‰[o‚·‚Ì‚ÅAŒ‹¥ˆßÖ‚Å‚Í•Ší‚ðŽ‚Ä‚È‚¢‚悤‚É‚µ‚½(‚Í‚¸)B
+ (db/)
+ job_db1.txt
+ job_db2.txt
+ item_db.txt
+ Œ‹¥ˆßÖASƒmƒr‚̃f[ƒ^
+ skill_tree.txt
+ Sƒmƒr‚̃XƒLƒ‹
+ (map/)
+ map.h
+ MAX_PC_CLASS‚ɒljÁ
+
+--------------
+//0631 by Ž€_
+
+Eׂ©‚¢C³B
+Eƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‚Ì•\Ž¦‚ðbattle_athena.conf‚ÅÝ’è‚Å‚«‚é
+‚悤‚É•ÏXB
+E•ŠíƒOƒ‰ƒpƒbƒ`‚ɂ‚¢‚Ä‚Å‚·‚ªƒpƒbƒ`‘O‚ÍŽg‚¦‚È‚¢E‹Æ‚ª‘•”õ‚ð‚µ‚Ä‚à•\Ž¦‚Í
+‚³‚ê‚È‚¢‚¾‚¯‚ňƗŽ‚¿‚Ü‚Å‚Í‹N‚±‚ç‚È‚©‚Á‚½‚¯‚Ç•ŠíƒOƒ‰ƒpƒbƒ`‚ÌŒã‚Í‚»‚Ì•Ší‚ð
+‘•”õ‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢E‹Æ(–{ŽI‚Å)‚ª‘•”õ‚µ‚Ä‚µ‚Ü‚Á‚½ê‡ˆÆ—Ž‚¿‚ª‹N‚±‚é
+‚±‚Æ‚ª‚ ‚è‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ (db/)
+ item_db.txt
+ 1161A2338A7170 C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ battle.h
+ struct Battle_Config‚Éwedding_modifydisplay ’ljÁB
+ battle.c
+ battle_config_read() C³B
+ pc.h
+ pc_cart_delitem() C³B
+ pc.c
+ pc_jobchange()Apc_additem()Apc_delitem()Apc_cart_delitem() C³B
+ pc_checkitem()Apc_getitemfromcart() C³B
+ clif.c
+ clif_changelook()Aclif_send()Aclif_parse_GlobalMessage() C³B
+ script.c
+ buildin_changebase() C³B
+ storage.c
+ storage_storageaddfromcart() C³B
+ vending.c
+ vending_purchasereq() C³B
+
+--------------
+//0630 by ˆø‘Þl
+
+EƒMƒ‹ƒh’E‘ÞŽž‚ÉcharƒT[ƒo‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚é‚Ì‚ðC³
+Ewater_height.txt‚ðXV
+E0627‚ÉŠÖ˜A‚µ‚ÄmodifydisplayŠÖ˜A‚ðíœ
+ (char/)
+ int_guild.c
+ mapif_guild_leaved()‚̃oƒbƒtƒ@—e—Ê‚ª‘«‚è‚È‚©‚Á‚½‚Ì‚ÅA
+ unsigned char buf[64]; -> unsigned char buf[128];
+ ‚ÆC³B
+ (conf/)
+ battle_athena.conf
+ equip_modifydisplay‚ðíœ
+ water_height.txt
+ prt_fild04.gat‚Æmoc_fild01.gat‚Ì•ª‚ð’ljÁ
+ (doc/)
+ conf_ref.txt
+ equip_modifydisplay‚Ìà–¾‚ðíœ
+ (map/)
+ battle.h
+ struct Battle_Config ‚©‚çequip_modifydisplay‚ðíœ
+
+--------------
+//0629 by Ž€_
+
+E0627‚̃oƒOˆê•”C³‚ÆV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ɑΉžB(Ž©•ª‚̊ԈႢ‚Å‚µ‚½B
+ƒ‚ƒ“ƒXƒ^[‚âNPC‚àV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ðŽg‚¤‚ÆŽv‚Á‚Ä‚¢‚½‚Ì‚Å‚·‚ª
+V‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚̓vƒŒƒCƒ„[‚݂̂̂悤‚Å‚·B)
+Eƒ^ƒLƒV[ƒh‚ƃEƒFƒfƒBƒ“ƒOƒhƒŒƒX‰¼ŽÀ‘•B(ŠØ‘‚̃TƒNƒ‰ƒCˆÆ‚¶‚á‚È‚¢‚Æ
+ˆÆ—Ž‚¿‚³‚ê‚Ü‚·BŽg—p‚·‚鎞‚Íitem_db.txt‚̃Rƒ}ƒ“ƒgƒAƒEƒg‚³‚ê‚Ä‚¢‚é
+2338‚Æ7170‚ð‰ðœ‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B)
+ESP‰ñ•œƒAƒCƒeƒ€‚àint‚É‚æ‚Á‚ÄŒø‰Ê‚ª‘‚¦‚é‚悤‚É•ÏXB
+E0627‚Å‘‚«–Y‚ê‚Å‚·‚ªƒJ[ƒg‚̃AƒCƒeƒ€ŒvŽZ‚Æitemdb_‚ðŒÄ‚Ô‚Ì‚ðŬ‰»‚·‚é
+ˆ—‚ð“ü‚Á‚Ă邹‚¢‚Åpc_additem()Apc_delitem()Apc_cart_additem()Apc_cart_delitem()ˆÈŠO‚Ì•û–@‚ŃJ[ƒgƒAƒCƒeƒ€‚âƒAƒCƒeƒ€‚É•Ï“®‚ª‚ ‚éê‡
+³í‚É“®ì‚·‚é•ÛØ‚ª‚È‚¢‚Ì‚ÅC³‚Ì‚³‚¢‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ readme0754‚ðreadme0574‚ÉC³B
+ makefile C³B
+ (map/)
+ map.h C³B
+ clif.c C³B
+ pc.c C³B
+ battle.c C³B
+ mob.c C³B
+ script.c C³B
+ (db/)
+ item_db.txt C³B
+ class_equip_db.txt C³B
+ skill_db.txt C³B(ŒëŽš‚ðŽ¡‚µ‚½‚¾‚¯‚Å‚·B)
+ (conf/)
+ npc_event_doll.txt C³B(—¬˜Ql‚³‚ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
+
+--------------
+//0628 by NOCTURNE
+
+Esnapshot
+Esnapshot‚©‚çsnapshot‚Ü‚Å‚ÌReadme•ªŠ„
+E—v–]‚ª‘½‚©‚Á‚½‚Ì‚Åsnapì¬iƒvƒƒOƒ‰ƒ€“I‚È•ÏX“_‚Í–³‚µ
+
+--------------
+//0627 by Ž€_
+
+EƒR[ƒh‚ÌÅ“K‰»‚Æ­‚µC³B(­‚µ‚ÍŒy‚­‚È‚é‚ÆŽv‚¢‚Ü‚·B)
+E @modifydisplayƒRƒ}ƒ“ƒhíœB
+EV‚µ‚¢ˆÚ“®ƒpƒPƒbƒg‚ɑΉž‚¾‚ÆŽv‚Á‚½‚ç0x1d8A0x1d9A0x1daƒpƒPƒbƒg‚̈ꕔ‚ª
+0x78A0x79A0x7b‚Æ•Ï‚í‚Á‚Ä‚é‚Ý‚½‚¢‚Å‚·B‚‚܂衂̂܂܂ł͑Ήž‚Å‚«‚Ü‚¹‚ñB
+X,Y‚ÌÀ•W‚Ì•”•ª‚Ì‘Ž®‚ª•Ï‚í‚Á‚½‚Ì‚©‚Æ—\‘ª‚Í‚µ‚Ä‚¢‚Ü‚·‚ª...
+î•ñ‚ð‹‚Ý‚Ü‚·B(makefile‚ÌDPACKETVER‚ð4‚É‚·‚ê‚Î0x1d8A0x1d9A0x1da‚ð
+Žg‚¢‚Ü‚·‚ªÀ•W‚ª‚¸‚ꂽ‚炵‚­‰½‚à•WŽ¦‚³‚ê‚Ü‚¹‚ñB)
+E100000‚©‚炾‚Á‚½char_id‚ð150000‚©‚ç‚É•ÏXB(ƒyƒbƒg‚Ì—‘‚Ì–â‘è‚Å•Ší‚Ì–¼‘O‚ª‚¿‚å‚Á‚Æ•Ï‚É‚È‚Á‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B)
+Eƒyƒbƒg‚̃R[ƒh­‚µC³B(pet_id‚ðcard[2]‚Æcard[3]‚©‚çcard[1]‚Æcard[2]‚É•ÏX‚µ‚Ü‚µ‚½B‚æ‚Á‚Ä‘O‚Éì‚Á‚½—‘‚ÍŽg‚¦‚Ü‚¹‚ñBˆÆ‚Åcard[3]‚Ì‹@”\‚ª•Ï‚í‚Á‚½‚Ì‚Å
+Žd•û‚È‚­C³‚µ‚Ü‚µ‚½B¡“x‚Íconvertƒc[ƒ‹‚ª‚ ‚è‚Ü‚¹‚ñBì‚鎞ŠÔ‚ª‚È‚©‚Á‚½‚Ì‚Å...)
+EÅ“K‰»‚ׂ̈ÉC³‚µ‚½Š‚ª‘½‚¢‚Å‚·‚ª‘S‚ij퓮삷‚é•ÛØ‚Í‚ ‚è‚Ü‚¹‚ñB
+ŽI—Ž‚¿ƒoƒO‚ª”­¶‚µ‚½‚ç•ñ‚¨Šè‚¢‚µ‚Ü‚·B(batte.c‚Í‚Ü‚¾Å“K‰»‚µ‚Ä‚Ü‚¹‚ñB)
+ƒJ[ƒg‚̃AƒCƒeƒ€ŒvŽZ‚âƒAƒCƒeƒ€‚Ìd—Ê‚ÌŒvŽZ‚ðʼn‚É‚¾‚¯‚·‚é‚悤‚É‚µ‚Ä‚¢‚é‚Ì‚Å•\Ž¦‚É­‚µ–â‘肪‚ ‚é‚©‚à...
+EC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯‘‚¢‚Ä‚¨‚«‚Ü‚·B
+ makefile
+ help.txt
+ (common/)
+ mmo.h
+ (map/)
+ map.h
+ atcommnad.h
+ atcommnad.c
+ pc.h
+ pc.c
+ clif.c
+ script.c
+ trade.c
+ itemdb.h
+ itemdb.c
+ battle.h
+ battle.c
+ pet.c
+ map.c
+ mob.c
+ (char/)
+ char.c
+ (conf/)
+ battle_athena-conf
+ atcommand_athena.conf
+
+--------------
+//0626 by ˆø‘Þl
+
+EƒpƒPƒbƒg’·ƒe[ƒuƒ‹iVˆÚ“®ƒpƒPƒbƒg‚È‚ÇjC³
+ (doc/)
+ client_packet.txt ƒpƒPƒbƒg‰ð̓XƒŒ M‚³‚ñ‚Ìî•ñ‚𔽉f
+ conf_ref.txt 0624‚ɇ‚킹‚ÄC³
+ (map/)
+ clif.c
+ packet_len_table[] client_packet.txt‚ɇ‚킹‚ÄC³
+
+--------------
+//0625 by ˆø‘Þl
+
+E@hide“§–¾‰»‚ðBOSS‚È‚Ç‚ÉŒ©”j‚ç‚ê‚È‚¢‚悤‚ÉC³
+ (map/)
+ pc.h
+ #define pc_iscarton(sd) C³
+ #define pc_isinvisible(sd) ’ljÁ
+ mob.c
+ mob_attack()
+ mob_target()
+ mob_ai_sub_hard_activesearch()
+ mob_ai_sub_hard_mastersearch()
+ mob_ai_sub_hard()
+ “§–¾ipc_isinvisible(sd)!=0j‚ÅŽ€l‚Æ“¯—l‚É”»’肳‚ê‚é‚悤‚ÉC³
+ (conf/)
+ npc_cTower.txt C³ithx to holyzard‚³‚ñj
+
+--------------
+//0624 by ‚é‚é‚é
+
+E•Ší‰æ‘œ•\Ž¦ˆ—‚̈êViVˆÚ“®ƒpƒPƒbƒgŽg—pj
+Eã‚ÆŠÖ˜A‚µ‚ÄA@modifydisplayƒRƒ}ƒ“ƒh‚ðÝ‚¯‚½
+@@@@‹@”\‚Æ‚µ‚Ä‚ÍAŒ»Ý‚̃AƒTƒVƒ“•Ší‚È‚Ç‚Ì‚ª‚¨‚©‚µ‚¢ê‡‚ÉA‚Ü‚½‚Í‹C‚É“ü‚ç‚È‚¢‚Æ‚©‚ÅA
+@@@@ƒLƒƒƒ‰–ˆ‚É‹ŒƒpƒP‚ðŽg—p‚·‚é‚悤‚É‚µ‚Ä‚¢‚éB
+
+ (map/)
+ atcommand.c
+ atcommand() @modifydisplayƒRƒ}ƒ“ƒh‚ð’ljÁ
+ atcommand.h
+ struct Atcommand_Config {
+'7d •ÏX
+ clif.c
+ clif_set0078_and01d8() , clif_set007b_and01da() ŠÖ”–¼•ˆ—‚Ì•ÏX
+ clif_spawnpc() , clif_movechar() , clif_changelook() , clif_getareachar_pc() ,
+ clif_fixpcpos() , clif_parse_LoadEndAck() •ÏX
+ map.h
+ struct map_session_data Eb} •ÏX
+ pc.c
+ pc_setnewpc() , pc_calcstatus() , pc_equiplookall() , pc_changelook() •ÏX
+
+ (conf/)
+ atcommand_athena.conf
+ equip_modifydisplay ’ljÁ
+
+ •ÏX‰ÓŠ‚Í‘S‚ăL[ƒ[ƒhumodifydisplayv‚ŃT[ƒ`‚·‚ê‚΂قڂ킩‚é‚©‚ÆB
+
+ƒRƒƒ“ƒgF‚à‚¤‚±‚ê‚Å–â‘è‚Í–³‚¢‚Í‚¸BŽÀ‚Í‘å‚¢‚Ȃ銨ˆá‚¢‚ð‚µ‚Ä‚½ŒÂŠ‚ª‚ ‚Á‚½‚Ì‚Í“àiƒ}ƒew
+
+--------------
+//0623 by ˆø‘Þl
+
+E@hide‚Å“§–¾‰»iŒ©‚ç‚ê‚È‚¢•MOB‚Ƀ^ƒQ‚ç‚ê‚È‚¢j‚·‚é‚悤‚ÉC³‚È‚Ç
+ (map/)
+ atcommand.c
+ @hide‚ÌoptionÝ’è‚ð0x04‚©‚ç0x40‚É•ÏX
+ mob.c
+ mob_attack()
+ mob_target()
+ mob_ai_sub_hard_activesearch()
+ mob_ai_sub_hard_mastersearch()
+ mob_ai_sub_hard()
+ option”»’è‚ð0x06‚©‚ç0x46‚ÉC³
+ (conf/)
+ npc_event_potion.txt MORISON_MEATC³ithx to holyzard‚³‚ñj
+
+--------------
+//0622 by ˆø‘Þl
+
+Emob‚ªƒXƒLƒ‹Žg—p‚ÉŽ¸”s‚µ‚½ê‡A’ÊíUŒ‚‚·‚é‚悤‚É
+ (map/)
+ mob.c
+ mobskill_use_id() ƒXƒLƒ‹Žg—pŽ¸”s‚Å0A¬Œ÷‚Å1‚ð•Ô‚·‚悤‚ÉC³
+ mobskill_use_pos() ƒXƒLƒ‹Žg—pŽ¸”s‚Å0A¬Œ÷‚Å1‚ð•Ô‚·‚悤‚ÉC³
+ mobskill_use() ã‹L‚𔽉f‚µ‚ÄŽ¸”sŽž‚É‚Í0‚ð•Ô‚·‚悤‚ÉC³
+
+--------------
+//0621 by ŒÓ’±—–
+
+EƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚ðs‚¤‚©‚Ç‚¤‚©conf/battle_athena.cnf‚É‘‚¯‚é‚悤‚É
+EƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚Å•s³‚Æ”»’f‚·‚é‚©‚Ç‚¤‚©‚ðdb/item_avail.txt‚É‘‚¯‚é‚悤‚É
+E@itemcheck‚Å–¾Ž¦“I‚ɃAƒCƒeƒ€ƒ`ƒFƒbƒN‚Å‚«‚é‚悤‚É
+
+ ƒfƒoƒO‚âƒeƒXƒg‚È‚Ç‚ÅFX‚ȃAƒCƒeƒ€ID‚ðŽg—p‚µ‚½‚¢ê‡‚Í
+ ƒAƒCƒeƒ€ƒ`ƒFƒbƒN‚𖳌ø‚É‚µ‚ĉº‚³‚¢B(item_check: off)
+ –³Œø‚É‚µ‚½ê‡‚Å‚à@itemcheckƒRƒ}ƒ“ƒh‚Ń`ƒFƒbƒN‚·‚邱‚Æ‚ªo—ˆ‚Ü‚·B
+ cnfƒtƒ@ƒCƒ‹‚Í—pˆÓ‚µ‚Ä‚È‚¢‚Ì‚Å•K—v‚È‚çŠeŽ©“K“–‚É‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
+
+ (db/)
+ item_avail.txt
+ V‹K’ljÁB•s³ƒAƒCƒeƒ€‚Ì—ñ‹“‚ÉŽg—pB–¢Š®¬B‘¼—Í–{ŠèB
+ item_db.txt‚É’è‹`‚³‚ê‚Ă邪ŽÀÛ‚É‚ÍŽg—p‚Å‚«‚È‚¢ƒAƒCƒeƒ€‚ð‘‚­B
+ (doc/)
+ conf_ref.txt
+ battle_athena.cnf‚Æatcommand_athena.cnf‚Ìà–¾C³
+ (map/)
+ itemdb.c/itemdb.h
+ itemdb_availableƒ}ƒNƒ’ljÁ
+ itemdb_read_itemavail()’ljÁ
+ itemdb_readdb()‚Åavailable=1‚É‚·‚é‚悤‚É
+ itemdb_search()‚Å‘¶Ý‚µ‚È‚¢ID‚Íavailable=0‚Ńf[ƒ^‚ðì‚é‚悤‚É
+ do_init_itemdb()‚Åitemdb_read_itemavail()‚ðŒÄ‚Ԃ悤‚É
+ pc.c/pc.h
+ pc_checkitem()‚ðƒGƒNƒXƒ|[ƒg
+ pc_checkitem()‚Åavailable‚Æbattleconfig‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É
+ atcommand.c/atcommand.h
+ @item‚Åbattleconfig‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É
+ @itemcheckƒRƒ}ƒ“ƒh’ljÁ
+ atcommandconfig‚Éitemcheckƒƒ“ƒo’ljÁ
+ battle.c/battle.h
+ battle_config‚Éitem_checkƒƒ“ƒo’ljÁ
+
+Eladmin‚ÌC³‚È‚Ç
+ ƒAƒJƒEƒ“ƒg’ljÁAƒpƒXƒ[ƒh•ÏX‚ÌۂɃpƒXƒ[ƒh‚ðÈ—ª‚·‚é‚ÆA
+ ƒpƒXƒ[ƒh—p‚̃GƒR[‚µ‚È‚¢ê—pƒvƒƒ“ƒvƒg‚Å“ü—Í‚Å‚«‚Ü‚·i•“ü—ÍŠm”FjB
+ ’ljÁ‚ÌۂɃpƒXƒ[ƒh‚ª•\Ž¦‚³‚ꂽ‚碂éꇂȂǂÉB
+ ƒpƒXƒ[ƒh“ü—Í’†‚ÍCtrl+C‚ªŒø‚©‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ ƒpƒXƒ[ƒh‚Ì•s³•¶Žš‚Ì•\Ž¦‚ªA‰½•¶Žš–Ú‚©‚Å•\Ž¦‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ ‚»‚Ì‘¼”÷–­‚Ƀ`ƒFƒbƒN’ljÁ‚È‚ÇB
+
+ Cygwin‚Å‚µ‚©“®ìŠm”F‚µ‚Ä‚¢‚Ü‚¹‚ñBPOSIXƒ‚ƒWƒ…[ƒ‹‚ðŽg‚Á‚Ä‚¢‚é‚Ì‚ÅA
+ POSIX‚Å‚È‚¢(•ƒGƒ~ƒ…ƒŒ[ƒVƒ‡ƒ“‚à‚Å‚«‚È‚¢)ƒvƒ‰ƒbƒgƒtƒH[ƒ€‚¾‚Æ
+ “®‚©‚È‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ UNIXŒn‚Å‚Ínkf‚ȂǂʼnüsƒR[ƒh‚ð•ÏŠ·‚µ‚È‚¢‚Æ‚¾‚ß‚©‚àH
+
+ (tool/)
+ ladmin
+ Ver.1.03‚ÉB
+
+-------------
+//0620 by ŒŽ‰r‚Ý
+
+Eƒz[ƒŠ[ƒNƒƒXŽÀ‘•
+
+ (db)
+ skill_db.txt C³
+ (map)
+ skill.c
+ skill_additional_effect()C³(ƒRƒƒ“ƒg‚Ì‚Ý)
+ battle.c
+ Damage battle_calc_weapon_attack()C³
+
+-------------
+//0619 by ‚é‚é‚é
+
+Eƒpƒbƒ`0617‚Ì‚Å‚â‚è–Y‚ê‚Æ”÷–­‚ÈC³
+
+ clif.c
+ clif_movechar(),clif_parse_LoadEndAck() C³
+
+--------------
+//0618 by nini
+
+EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚̉r¥AƒfƒBƒŒƒC’ljÁB‰ñ•œ—ÊC³B
+EÁ”ïSPC³
+EƒAƒ[ƒVƒƒƒ[‚͈̔͂ð5*5‚É‚µ‚Ä2ƒZƒ‹‚«”ò‚΂µB
+Eƒ`ƒƒ[ƒWƒAƒ[‚ÌŽg—p•ŠíðŒ–³‚µB
+EƒXƒsƒAƒXƒ^ƒu‚Ì”ò‹——£‚ð6ƒZƒ‹‚ÉB
+ (/db)
+ cast_db.txt C³
+ skill_db.txt C³
+ (/map)
+ battle.c
+ battle_calc_weapon_attack() C³
+ skill.c
+ skill_castend_damage_id() C³
+ skill_check_condition() C³
+ skill_castend_nodamage_id() C³
+
+--------------
+//0617 by ‚é‚é‚é
+
+E•Ší‰æ‘œ•\Ž¦‚Å‘¼ƒLƒƒƒ‰‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðu‚Æ‚è‚ ‚¦‚¸vC³
+EŒC•\Ž¦‚̃pƒPƒbƒg‚ð‘—M’âŽ~iŒ»Žž“_‚ł̓€ƒ_BƒRƒƒ“ƒg‚µ‚½‚¾‚¯‚Å‚·‚ªj
+ clif.c
+ clif_spawnpc(),clif_getareachar_pc(),clif_fixpcpos(),clif_changelook()C³
+ pc.c
+ clif_changelook()‚ª‚ ‚é•”•ª‚ðC³i•Ší[„‚‚Ƈ‚É‚È‚é‚悤‚Ɉ—‚Ì“ü‚ê‘Ö‚¦j
+
+ƒRƒƒ“ƒgB
+Vƒ}ƒbƒvˆÚ“®ƒpƒP(0x1d8`0x1daj‚ðFX‚Æ‚â‚Á‚½‚ªA‚»‚̃pƒP‚P‚‚ŕŠí•\Ž¦‚ªVŽ®‚̂ɑΉž‚µ‚Ä‚é
+‚Æ‚¢‚¤‚킯‚Å‚Í‚È‚¢‚Á‚Û‚¢B‹ŒˆÚ“®ƒpƒP‚¾‚ÆŽ©•ªˆÈŠO‚̃Lƒƒƒ‰‚ªˆÚ“®‚·‚é‚Æ‹ŒŽ®•\Ž¦‚É‚È‚Á‚Ä‚µ‚È‚¤B
+X‚ÉAV•Ší•\Ž¦ƒpƒP‚Í•Ší‚Æ‚‚Ì“¯Žžˆ—‚ªo—ˆ‚Ä‚È‚¢B‚¨‚»‚ç‚­ƒNƒ‰ƒCƒAƒ“ƒg‚Ì–â‘肾‚ÆŽv‚¤B
+‚Æ‚è‚ ‚¦‚¸AƒLƒƒƒ‰‚ª“®‚­‚½‚Ñ‚ÉV•ŠíƒpƒP„‹Œ‚ƒpƒP‚Ì‚Q‚‚̑•”õƒpƒP‚𑗂邱‚Æ‚Å‰ðŒˆ‚³‚¹‚Ä‚¢‚éB
+–{ŽI‚Å‚Í‚Ç‚¤‚È‚Ì‚©‚ÌŽÀÛ‚Ì‚Æ‚±‚ë‚̃f[ƒ^‚ª–³‚¢‚½‚ßA‚±‚êˆÈã‚Ì‚±‚Ƃ̓€ƒŠB
+
+--------------
+//0616 by ŒÓ’±—–
+
+Ewater_height.txt‚ð“Ç‚ñ‚Å‚¢‚È‚¢‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
+ map.c
+ map_waterheight()C³
+
+EPC‚̃}ƒbƒvˆÚ“®Žž‚̃AƒCƒeƒ€ƒ`ƒFƒbƒN‚ŃAƒCƒeƒ€ID‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³
+Eˆê•”‚Ì—ƒRƒ}ƒ“ƒh‚ŃAƒCƒeƒ€ID‚Ì‘¶Ý‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³
+ pc.c
+ pc_checkitem()C³
+ pc_authok()C³ pc_checkitem()’ljÁ
+ clif.c
+ clif_parse_LoadEndAck()C³
+ itemdb.c
+ itemdb_exists()’ljÁiitemdb_search‚Æ“¯‚¶‚¾‚ªAdb‚É‘¶Ý‚µ‚È‚¢
+ ꇂÍV‚µ‚¢ƒf[ƒ^‚ðì‚炸‚ÉNULL‚ð•Ô‚·j
+ itemdb_read_classequipdb()C³ itemdb_search=>itemdb_exists
+ itemdb_read_itemnametable()C³ itemdb_search=>itemdb_exists
+ itemdb_read_itemvaluedb()C³ itemdb_search=>itemdb_exists
+ atcommand.c
+ @itemC³ itemdb_search=>itemdb_exists
+ @produceC³ itemdb_exists‚Ń`ƒFƒbƒN‚·‚é‚悤‚É
+
+--------------
+//0615 by ”g˜Q
+
+EƒAƒCƒeƒ€DATA‘å•C³
+@Žå‚ÈC³‰ÓŠ‚ÍA‰ñ•œƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ÌC³AÁ”ïƒAƒCƒeƒ€‚ðclass_equip_db.txt–³‚µ‚Å‚àŽg—p‚Å‚«‚é—l‚ÉC³A
+@‘•”õ•i‚Ì‘•”õ‰Â”\E‚ð‘S‚ÄC³AƒJ[ƒhŒø‰Ê‚ðC³AetcEEE‚Å‚·B
+
+--------------
+//0614 by Nikita
+
+EƒAƒCƒeƒ€DATA‚ÌC³iŽå‚ɉñ•œ—Êj
+EƒXƒLƒ‹‰ð“Å‚ÌŽË’öC³
+E0612‚Ìׂ©‚¢C³
+ (conf/)
+ npc_town_prontera.txt C³
+ (db/)
+ item_db.txt C³
+ skill_db.txt C³
+
+--------------
+//0613 by ˆø‘Þl
+EcheckweightC³
+ (conf/)
+ npc_event_making.txt checkweight•”•ª‚ðC³
+ npc_event_potion.txt ƒ|[ƒVƒ‡ƒ“AƒWƒ…[ƒXNPC‚ÌcheckweightC³
+
+--------------
+//0612 by nini
+
+EƒAƒCƒeƒ€DATAC³
+ (db/)
+ item_db.txt C³
+ (conf/)
+ npc_town_***.txt C³
+ R.O.M776‚³‚ñ‚ðŽQÆ‚µ‚Ü‚µ‚½B
+
+--------------
+//0611 by Ž€_
+
+EƒAƒCƒeƒ€Žg—pðŒ‚ª‚ ‚í‚È‚¢Žž0xa8ƒpƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏXB(ƒoƒO•ñƒXƒŒƒbƒh 243‚Ìno name‚³‚ñî•ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
+EQM‚ÅW’†—ÍŒüã‚Æ‘¬“xã¸AƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Aƒ‰ƒEƒhƒ{ƒCƒXAƒXƒsƒAƒNƒCƒbƒPƒ“Aƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“‚ð‰ðœ‚·‚é‚悤‚ÉC³B
+E‘¬“x㸂Ƒ¬“xŒ¸­‚Å‹t‚̃XƒLƒ‹‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
+E0609‚Å‘‚«–Y‚êBƒ‚ƒ“ƒXƒ^[‚ªQM‚͈̔͂©‚甲‚¯‚Ä‚àŒø‰Ê‚ªˆÛŽ‚·‚é‚悤‚É
+•ÏX‚ƃuƒŒƒbƒVƒ“ƒO‚ÅŽô‚¢‚ÆΉ»‚ª‰ðœ‚³‚ê‚é‚悤‚ÉC³B
+ clif.c
+ clif_useitemack() C³B
+ skill.c
+ skill_status_change_start() C³B
+ pc.c
+ pc_insert_card() C³B(‚±‚ê‚̓J[ƒhƒoƒO‚Æ‚ÍŠÖŒW‚È‚¢C³‚Å‚·B‚»‚̃oƒO‚ÌC³‚ÍŽ©•ª‚ª05xx“–‚½‚è‚ÅC³‚µ‚Ü‚µ‚½‚Ì‚ÅB)
+
+--------------
+//0610 by ”g˜Q
+
+EƒAƒCƒeƒ€DATAC³
+ (db/)
+ item_db.txt C³
+
+--------------
+//0609 by Ž€_
+
+EFX‚ÆC³B
+Eƒ‚ƒ“ƒXƒ^[‚ªŽ~‚Ü‚é‚悤‚É“®‚­–â‘èC³B
+EŽw’e‚̃fƒBƒŒƒCC³B
+E–î쬂̃R[ƒh•Ð•t‚¯B
+E“G‚ªƒXƒLƒ‹”͈͂©‚瓦‚°‚½ê‡ƒXƒLƒ‹‚ªŽ¸”s‚·‚é‚悤‚É•ÏXB
+Eclass_equip_db.txt‚ÌŽd—l•ÏXB
+ «•Ê‚Æ‘•”õƒŒƒxƒ‹‚àÝ’è‰Â”\‚É•ÏX‚ÆŽg—pƒAƒCƒeƒ€‚ÌŽg—pE‹ÆA«•Ê‚ÆŽg—p
+ ƒŒƒxƒ‹‚Ìݒ肪‚Å‚«‚é‚悤‚É•ÏXB(‚½‚¾ƒf[ƒ^‚ª‘½‚¢‚¹‚¢‚ÅC³‚µ‚½
+ class_equip_db.txt‚̓Tƒ“ƒvƒ‹’ö“x‚Ì•¨‚Å‚·B–„‚ß‚Ä‚­‚¾‚³‚¢B‘¼—Í–{Šè‚Å‚·‚ª...)
+ ‚»‚ê‚ƃAƒCƒeƒ€Žg—pðŒ‚ª‚ ‚í‚È‚¢‚ƃAƒCƒeƒ€‚ªŽg‚í‚È‚¢‚悤‚É‚µ‚Ä‚Í
+ ‚¢‚Ü‚·‚ª01c8ƒpƒPƒbƒg‚Ì<type>‚ð0‚É‚µ‚Ä‚àƒAƒCƒeƒ€‚ðŽg—p‚µ‚½Žž‚Æ“¯‚¶
+ ƒGƒtƒFƒNƒg‚ªo‚Ü‚·B–{ŽI‚̃AƒCƒeƒ€Žg—pƒpƒPƒbƒg‚ª•ª‚©‚ç‚È‚¢‚Ü‚Ü‚¶‚á
+ ‚±‚¤‚·‚邵‚©‚È‚©‚Á‚½‚Ì‚Å‚·‚ª...
+Ebattle_athena.conf‚É€–ڒljÁB
+E‚»‚Ì‘¼ƒXƒLƒ‹­‚µC³‚Æׂ©‚¢C³B
+EC³‚µ‚½Š‚ð‘S‚ÄŠo‚¦‚Ä‚Ü‚¹‚ñ‚̂Ńtƒ@ƒCƒ‹‚¾‚¯B
+ (map/)
+ clif.c C³B
+ mob.c C³B
+ mob.h C³B
+ pc.c C³B
+ map.h C³B
+ skill.c C³B
+ skill.h C³B
+ itemdb.c C³B
+ battle.c C³B
+ battle.h C³B
+ (conf/)
+ battle_athena.conf C³B
+ (db/)
+ cast_db.txt C³B
+ skill_db.txt C³B
+ create_arrow_db.txt C³B
+ class_equip_db.txt C³B
+ item_db.txt C³B
+ (doc/)
+ client_packet.txt C³B
+ conf_ref.txt C³B
+
+--------------
+//0608 by sk
+EƒAƒ}ƒcNPC’ljÁ
+ (conf/)
+ npc_town_amatsu.txt é“àNPC’ljÁ
+ npc_warp_amatsu.txt é“àƒ[ƒvƒ|ƒCƒ“ƒg’ljÁ
+
+--------------
+//0607 by J
+EƒAƒTƒ‹ƒgƒ^[ƒgƒ‹‚̎艺¢Š«‚̃oƒOC³(•ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚· ‚é‚é‚邳‚ñ)
+ (db/)
+ mob_skill_db.txt ƒAƒTƒ‹ƒg‚ÌC³‚‚¢‚łɃeƒŒƒ|‚ðŽg‚¤MOB‚̃XƒLƒ‹ƒfƒBƒŒƒC‚àC³
+
+--------------
+//0606 by ˆø‘Þl
+EƒXƒLƒ‹ƒŒƒxƒ‹Å‘å’lˆÈã‚ɃNƒŠƒbƒN‚µ‚½Žž“_‚Å‘¼ƒXƒLƒ‹‚ªã‚°‚ç‚ê‚È‚­‚È‚éƒoƒO‚ðC³iThanx to 227‚³‚ñj
+ (map/)
+ clif.c
+ clif_skillup()
+ ƒXƒLƒ‹ƒŒƒxƒ‹‚ªÅ‘å’l‚Ì‚Æ‚«AƒpƒPƒbƒg––”ö‚ð0‚É‚·‚é‚悤‚ÉC³
+
+--------------
+//0605 by ‚é‚é‚é
+
+E•Ší‘®«•t—^ƒXƒLƒ‹‚Ì•s“s‡C³
+ •Ší‚ðŽ‚¿‘Ö‚¦‚½‚èŠO‚µ‚½‚肵‚½ê‡‚àA‘®«•t—^‚ð‰ðœ‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
+ ’A‚µA‘fŽè„•Ší‘•”õ‚Ì‚Ýó‘ÔˆÛŽ‚µ‚Ü‚·B
+EƒXƒsƒAƒNƒCƒbƒPƒ“‚̃Xƒe[ƒ^ƒXƒAƒCƒRƒ“‚𳂵‚­•\Ž¦
+E‚Q‚g‚pAƒXƒsƒAƒNƒCƒbƒPƒ“AƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ÅŠY“–ˆÈŠO‚Ì•ŠíŽ‚¿‘Ö‚¦‚Åó‘ÔÁ–Å
+ ƒXƒsƒAƒNƒCƒbƒPƒ“‚Í–¢Šm”F‚Å‚·‚ªA‚Q‚g‚p‚ÍŠmŽÀ‚È‚Ì‚Å‚Q‚g‚p‚Æ•sŒö•½‚ÈŽd—l‚Æ‚Í
+ l‚¦‚É‚­‚¢‚Ì‚Å“¯—l‚ȃpƒ^[ƒ“‚Æ‚µ‚Ü‚µ‚½B–{ŽI‚Æ‘Šˆá‚ª‚ ‚éꇂ͕ñŠè‚¢‚Ü‚·B
+E“G‚Ì‚p‚l‚ÅW’†—ÍŒüã‚Æ‘¬“x㸂ð‰ðœ
+ ‚p‚l‚ʼne‹¿‚·‚éƒXƒLƒ‹‚Í‚±‚ê‚Q‚‚¾‚¯‚©‚ÈH@Ž„‚Ì‹L‰¯‚ÆŒfŽ¦”‚ł̕ñ‚Æ‚Å
+ ”»’f‚µ‚½‚Ì‚Å‚·‚ªA‚à‚µ‘Šˆá‚ª‚ ‚è‚Ü‚µ‚½‚ç•ñŠè‚¢‚Ü‚·B
+
+ (map/)
+ clif.c
+ clif_parse_UnequipItem() C³
+ pc.c
+ pc_checkallowskill() pc_equipitem() C³
+ skill.h
+ skill_encchant_eremental_end() ’ljÁ
+ skill.c
+ skill_status_change_start() skill_status_change_end()
+ skill_status_change_clear() skill_encchant_eremental_end() C³
+ ‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ë­X
+
+--------------
+//0604 by J
+EMOBƒXƒLƒ‹ÄC³
+EMOBDBC³
+ (db/)
+ mob_skill_db.txt
+ ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO‚ƃ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹‚ª1‰ñ‚É2Ží—Þ‚Ü‚Å‚µ‚©
+ MOB‚ðo‚³‚È‚©‚Á‚½‚Ì‚ðC³
+ mob_db.txt
+ ƒ[ƒhƒIƒuƒfƒX‚̃hƒƒbƒv‚ŃGƒ‰[‚ªo‚é‚Ì‚ðC³(–¢Šm”F)
+ ‰…—ì•Žm‚̃hƒƒbƒv‚ÆMVP‚ð’ljÁ(–¢Šm”F)
+--------------
+//0603 by ˆø‘Þl
+EV‹KƒAƒCƒeƒ€Žž‚É‚àŠŽ‰Â”\ŒÂ”ƒ`ƒFƒbƒN‚ð‚·‚é‚悤‚ÉC³
+ (map/)
+ pc.c
+ pc_checkadditem()
+ V‹KƒAƒCƒeƒ€Žž‚ÉMAX_AMOUNT‚ð’´‚¦‚Ä‚¢‚½‚ç
+ ADDITEM_OVERAMOUNT‚ð•Ô‚·‚悤‚ÉC³
+
+--------------
+//0602 by ˆø‘Þl
+EGeffen’b–艮‚Å—Ž‚¿‚é–â‘è‚ðC³
+ (conf/)
+ npc_town_geffen.txt if (!checkweight(,)) ‚©‚ç if (!(checkweight(,))) ‚ÉC³
+
+--------------
+//0601 by J
+EMOBƒXƒLƒ‹‚ÌŠë‚È‚¢Š‚ð‚¢‚­‚ç‚©C³
+EŠoÁ‚Æ‹¶‹C‚ÌŽg‚¦‚éE‚ðC³
+EƒQƒtƒFƒjƒAƒ_ƒ“ƒWƒ‡ƒ“‚Ì”z’u‚ðƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg‚Å“ü‚ꂽ‚Æ‚«‚Ì”z’u‚ÉC³
+ ‚½‚¾‚µƒ{ƒX‚ªDOP2‘Ì‚Å‚Í‚È‚­ƒhƒ‰ƒLƒ…ƒ‰‚É‚µ‚Ä‚¢‚Ü‚·B
+ (conf/)
+ npc_monster.txt ƒ‚ƒ“ƒXƒ^[”z’u”÷•ÏX
+ (db/)
+ mob_skill_db.txt ‰ö‚µ‚¢Ý’è‚È‚Ç‚ÌC³
+ item_db.txt ‘‘¬POT‚ÌC³
+
+--------------
+//0600 by ˆø‘Þl
+Eƒvƒƒ“ƒeƒ‰¸˜BŠ‚̉¡‚̃tƒ@ƒ“‚ɘb‚µŠ|‚¯‚é‚ƌł܂é–â‘è‚ðC³
+EMOBƒXƒLƒ‹Žæ‚èž‚ÝiThanx to J‚³‚ñj
+ (conf/)
+ npc_event_skillget.txt ƒtƒ@ƒ“‚ÌLabel‚ðC³
+ npc_town_prontera.txt ƒtƒ@ƒ“‚ªd•¡‚µ‚Ä‚¢‚½‚Ì‚Åíœ
+ (db/)
+ mob_skill_db.txt ƒWƒ…ƒm[ˆÈ~‚ÌMOBƒXƒLƒ‹’ljÁ
+
+--------------
+//0599 by ‚é‚é‚é
+
+EƒZ[ƒW‚Ì•Ší‘®«•t—^ƒXƒLƒ‹‚Ì•s“s‡C³‚ƃXƒe[ƒ^ƒXƒAƒCƒRƒ“•\Ž¦
+ ƒAƒXƒyƒ‹ƒVƒI‚ƃGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‚Æ‚Å‘½d‚É‚©‚©‚Á‚Ä‚µ‚Ü‚Á‚Ä‚½‚Ì‚ÅA
+ ÅŒã‚É•t—^‚µ‚½‚à‚Ì‚P‚‚ɂȂé‚悤‚É‚µ‚Ü‚µ‚½B
+ ‚»‚̂‚¢‚łɃXƒe[ƒ^ƒXƒAƒCƒRƒ“‚à•\Ž¦‚·‚é‚悤‚É‚à‚µ‚Ü‚µ‚½B
+ i–¢ƒeƒXƒg‚Å‚·‚ªAƒAƒCƒRƒ“o‚È‚©‚Á‚½ƒXƒsƒAƒNƒCƒbƒPƒ“‚à‚Å‚é‚Í‚¸‚Å‚·Bj
+EƒAƒCƒeƒ€DB‚É‚ÄA‘‘¬ƒ|[ƒVƒ‡ƒ“‚ÌŽg—p§ŒÀ‚ð’ljÁ
+ Jazz‚³‚ñ’ñ‹Ÿ‚Å‚·B
+ ‚»‚ê‚ÆŽ„‚ÌŽï–¡‚щƒOƒiƒƒNTƒVƒƒƒc‚ðƒAƒŒƒiƒj‚µ‚Ü‚µ‚½‚ª‚—@‹C‚É“ü‚ç‚È‚¯‚ê‚Î
+ Á‚·‚Ȃ茳’Ê‚è‚ÉC³‚·‚é‚Ȃ肵‚Ä‚µ‚¿‚á‚Á‚Ä‚­‚¾‚³‚¢‚Ü‚¹`B
+
+ (conf/)
+ battle_athena.conf 598‚Å‚Ì“ü‚ê–Y‚ê
+ (map/)
+ skill_encchant_eremental_end() ’ljÁ
+ skill_status_change_end() skill_status_change_start() skill_status_change_clear() C³
+ (db/)
+ iten_db.txt C³
+
+--------------
+//0598 by ‚é‚é‚é
+
+E‘•”õ•Ší‚̉摜•ÏX‚ɑΉž
+ ˆê‰ž‚È‚ª‚çƒNƒ‹ƒZƒCƒ_[‚Ì—¼Žè‘„‚Æ‚©ƒvƒŠ[ƒXƒg‚Ì“ÝŠí‚Æ‚©‚̓eƒXƒg‚µ‚Ü‚µ‚½‚ªA
+ ‘S‚Ä‚ÌE‚ðƒ`ƒFƒbƒN‚Í‚¢‚Ü‚¹‚ñB‚Ü‚½‚±‚ÌŽž“_‚ł̓Nƒ‰ƒCƒAƒ“ƒgŽ©‘Ì‚Ì•\Ž¦ƒf[ƒ^‚É
+ –â‘è‚Ì—L‚é‚Ì‚ª‘½‚¢‚Ì‚à•t‚¯‰Á‚¦‚Ä‚¨‚«‚Ü‚·B
+ ‚ ‚ÆAŒC‚àˆê‰ž‚͑Ήž‚µ‚Ü‚µ‚½B’A‚µ‚±‚ê‚ÍŒ»Žž“_‚Å‚Í–{ŽI‚·‚ç‚à–¢‘Ήž‚È‚Ì‚Å‚·‚ªB
+ •\Ž¦‚ª‰»‚¯‚ÄŒ™‚¾‚Æ‚¢‚¤ê‡‚Í]—ˆ‚Ì‚â‚è•û‚ào—ˆ‚Ü‚·B
+
+ (conf/)
+ battle_athena.conf
+ ƒIƒvƒVƒ‡ƒ“ equip_modifydisplay ‚ð’ljÁ
+ (map/)
+ battle.h
+ Battle_Config C³
+ battle.c
+ battle_config_read() C³
+ clif.c
+ packet_len_table[] clif_changelook() C³
+ map.h
+ enum {} C³
+ pc.c
+ pc_calcstatus() pc_equiplookall() pc_changelook() C³
+ (common/)
+ mmo.h
+ mmo_charstatus {} C³
+
+--------------
+//0597 by ”g˜Q
+
+EƒAƒ}ƒc‚ÉŠÖ‚·‚éC³•”÷C³
+ (conf/)
+ npc_mob_job.txt
+ npc_monster.txt
+ npc_monster30.txt
+ ƒ‚ƒ“ƒX–¼C³
+ npc_monster_amatsu.txt
+ ’ljÁiƒ‚ƒ“ƒX”‚ª‚©‚È‚èŽè”²‚«‚Å‚·EEE
+ npc_town_amatsu.txt
+ ƒVƒ‡ƒbƒvNPC‚ð“‡inpc_shop3.txt‚ðÁ‚µ‚Ä‚àOK‚Å‚·
+ (db/)
+ mob_db.txt
+ ƒAƒ}ƒc‚̃‚ƒ“ƒXƒf[ƒ^‚ðŒ»Ý•ª‚©‚é”͈͂ÅC³•‘‚Æ‚«‚Ì‚±‚Ìdef,mdef‚ðC³
+
+--------------
+//0596 by Ž€_
+
+E0595‚ÌC³‚Æׂ©‚¢C³B
+EƒtƒŠ[ƒLƒƒƒXƒg‚ŃLƒƒƒXƒg‚µ‚Ä‚¢‚éŠÔ‚ÍUŒ‚‰Â”\‚Å‚·‚ªƒLƒƒƒXƒg‚µ‚½Œã‚Ì
+ƒfƒBƒŒƒCƒ^ƒCƒ€‚Å‚ÍUŒ‚‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B–{ŽI‚ÌŽd—l‚ª‚Ç‚¤‚È‚Ì‚©‚Í
+‚í‚©‚è‚Ü‚¹‚ñB
+E“®‚¢‚Ä‚¢‚éPC‚Ƀ‚ƒ“ƒXƒ^[‚ªUŒ‚‚Å‚«‚È‚¢–â‘èC³B(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ‚ª
+‘½•ª‚±‚ê‚Å‘åä•v‚©‚ÆB)
+ (map/)
+ skill.h
+ SC_FREECAST íœB
+ skill.c
+ skill_use_id()Askill_use_pos() C³B
+ skill_castend_id()Askill_castend_pos() C³B
+ ‚»‚Ì‘¼­‚µC³B
+ pc.c
+ calc_next_walk_step()Apc_attack_timer()Apc_calcstatus() C³B
+ clif.c
+ clif_parse_ActionRequest()Aclif_parse() C³B
+ map.h
+ struct map_session_data‚Éprev_speed’ljÁB
+ mob.c
+ mob_ai_sub_hard()Amob_changestate()Amob_attack() C³B
+
+--------------
+//0595 by PRevEv
+EƒtƒŠ[ƒLƒƒƒXƒgC³AŽÀ‘•(ƒLƒƒƒXƒeƒBƒ“ƒO’†UŒ‚‚à‚Å‚«‚Ü‚·B)
+ (/map)
+ pc.c
+ pc_calcstatus() C³B
+ calc_next_walk_step() C³B
+ pc_attack_timer() C³B
+ skill.c
+ skill_castend_id()Askill_castend_pos()Askill_use_id()Askill_use_pos() C³B
+
+--------------
+//0594 by Ž€_
+
+EŠØ‘ˆÆ‚̃p[ƒeƒB–â‘èC³‚Æׂ©‚¢C³B
+E@partyƒRƒ}ƒ“ƒhC³‚Æ@guildƒRƒ}ƒ“ƒh’ljÁB
+Ebattle_athena.conf‚Éguild_emperium_check’ljÁB
+EƒXƒLƒ‹Žg—p‚ªŽ¸”s‚µ‚Ä‚àƒfƒBƒŒƒC‚ª‚©‚©‚é–â‘èC³B
+ help.txt C³B
+ (map/)
+ clif.c
+ clif_parse_CreateParty2() ’ljÁB
+ clif_parse_ItemIdentify() C³B
+ ‚»‚Ì‘¼­‚µC³B
+ atcommand.hAatcommand.c C³B
+ battle.h
+ struct Battle_Config‚Éguild_emperium_check’ljÁB
+ battle.c
+ battle_config_read() C³B
+ guild.c
+ guild_create()Aguild_created() C³B
+ skill.c
+ skill_castend_id()Askill_castend_pos() C³B
+ Makefile C³B
+ (doc/)
+ client_packet.txt
+ ƒpƒPƒbƒg0x01e8 ’ljÁB
+ conf_ref.txt C³B
+ (conf/)
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+
+--------------
+//0593 by Ž€_
+
+EƒƒeƒI‚ƃoƒ~ƒŠƒIƒ“‚̃_ƒ[ƒWC³‚Æׂ©‚¢C³B
+EƒƒeƒI‚Ìè¦Î‚ª—Ž‚¿‚Ä‚­‚é”͈͂ð7*7‚©‚ç5*5‚É•ÏXB(‚±‚ê‚Å’†‰›‚Í‘S‚Ä‚Ìè¦Î‚Ì
+ƒ_ƒ[ƒW‚ðŽó‚¯‚邱‚Æ‚É‚È‚è‚Ü‚·B)
+EŽ©“®‰ñ•œŒvŽZŽ®•ÏXB
+ ƒXƒLƒ‹ƒŒƒxƒ‹*5 + (max_hp/50)‚©‚ç
+ ƒXƒLƒ‹ƒŒƒxƒ‹*5 + (max_hp*ƒXƒLƒ‹ƒŒƒxƒ‹/500)‚É•ÏXB(SP‚Æ‘§‚à“¯‚¶‚悤‚É•ÏXB)
+EGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v‚Åatcommand_athena.conf‚Ìkick‚Ì
+ƒŒƒxƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏXB
+ (db/)
+ skill_db.txt
+ ƒXƒLƒ‹‹CŒ÷‚Ìsp‚ð10‚©‚ç8‚ÉC³B
+ (map/)
+ map.c
+ NO_WATER‚ð100‚©‚ç1000000‚É•ÏXB
+ battle.c
+ battle_calc_magic_attack() C³B
+ skill.c
+ skill_castend_pos2() C³B
+ pc.c
+ pc_natural_heal_hp()Apc_natural_heal_sp()Apc_spirit_heal() C³B
+ clif.c
+ clif_parse_GMKick() C³B
+ (doc/)
+ conf_ref.txt C³B
+
+--------------
+//0592 by ˆø‘Þl
+
+E…ê‚Ì—L‚è–³‚µ‚ðwater_height.txt‚¾‚¯‚ÅŒˆ‚ß‚é‚悤‚É•ÏXBnpc_water.txt‚Í•s—v‚ÉB
+EƒJ[ƒhƒXƒLƒ‹‚ł̓Œƒxƒ‹ã‚°‚Å‚«‚È‚¢‚悤‚É‚È‚Á‚½‚½‚ß•s—v‚É‚È‚Á‚½ˆ—‚ðíœB
+ (conf/)
+ map_athena.conf
+ npc: conf/npc_water.txt Á‹Ž
+ water_height.txt
+ ƒfƒtƒHƒ‹ƒg‚‚³3‚̃}ƒbƒv•ª‚ð’ljÁ•all_water‚ð‚‚³-100‚Æ‚µ‚ăRƒƒ“ƒg‚ŒljÁ
+ (map/)
+ map.c
+ waterlist‚Ímap_readwater()“à‚Ńƒ‚ƒŠŠm•Û
+ gatÝ’èŒã‚Í•s—v‚È‚Ì‚Åmap_readallmap()‚Ńƒ‚ƒŠŠJ•ú‚µ‚Ä‚¢‚Ü‚·
+ map.h
+ struct map_data‚Ìflag‚©‚çwater_flag‚ðÁ‹Ž
+ npc.c
+ npc_parse_mapflag()
+ ƒ}ƒbƒvƒtƒ‰ƒOwater‚Æall_water‚ðÁ‹Ž
+ pc.c
+ pc_skillup()
+ — ‚ŃXƒLƒ‹LvUP‚Å‚«‚È‚­‚È‚Á‚½‚Ì‚Åskill[id].flag‚Ì•ª‚ÍÁ‹Ž
+ skill.c
+ skill_check_condition()
+ map_getcell‚Å…ê”»’è‚·‚é‚悤‚ÉC³
+
+--------------
+//0591 by CHRIS
+
+Eƒ‚ƒ“ƒN‚ªŸ†’e‚ð‚à‚Á‚Ä‚¢‚é‚Æ‚«AŸ†’e*3‚Ì•K’†ƒ_ƒ[ƒW‚ª“ü‚é—l‚É‚È‚è‚Ü‚µ‚½B„Ÿ@battle.cC³
+Eƒ‚ƒ“ƒNƒXƒLƒ‹uŽw’ev‚Æu”­™¤v‚Æu‹CEv‚̉r¥ŽžŠÔ‚ª³‚µ‚­C³‚³‚ê‚Ü‚µ‚½B„Ÿ@cast_db.txtC³
+
+--------------
+//0590 by Ž€_
+
+Egrf-files.txt‚âconfƒtƒ@ƒCƒ‹Aaccount.txtƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ƈʒu‚ð•Ï‚¦‚é‚悤‚É•ÏXB
+Eƒ}ƒbƒvˆÚ“®‚É‚æ‚éŽI—Ž‚¿‚ð–h‚®ˆ×‚ÉC³B(ƒ}ƒbƒv‚ª“ñ“xƒ[ƒh‚³‚ê‚ÄŽI—Ž‚¿‚ª
+‹N‚±‚Á‚½‚Æ‚Ì•ñ‚ðŽó‚¯‚½‚Ì‚ÅB)
+E0586‚ð‚¿‚å‚Á‚ÆC³B‘•”õ‚É‚æ‚éƒXƒLƒ‹‚ÌꇃŒƒxƒ‹ã‚°‚ª‚Å‚«‚È‚¢‚悤‚ÉC³B
+‚½‚¾‘•”õ‚É‚æ‚éƒXƒLƒ‹‚ðƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðŽg‚Á‚Äã‚°‚鎞‚Í‘•”õ‚ðŠO‚·•K—v‚ª
+‚ ‚è‚Ü‚·B
+E@party‚¿‚å‚Á‚ÆC³B(–¼‘O‚É‹ó”’‚ª‚ ‚Á‚Ä‚à‘åä•v‚Ȃ悤‚ÉB)
+E…ê‚Ì‚‚³‚ðwater_height.txt‚Å“Ç‚Ýž‚ނ悤‚É•ÏXB
+Econfƒtƒ@ƒCƒ‹‚ÅÝ’è‚·‚镨‚ðƒtƒ@ƒCƒ‹‚̃pƒX‚É‹ó”’‚ª‚ ‚Á‚Ä‚à‘åä•v‚È
+‚悤‚É•ÏXB
+EGM‰EƒNƒŠƒbƒN–½—ßuŽg—pŽÒ‹­§I—¹v‚Ń‚ƒ“ƒXƒ^[‚ð“|‚¹‚é‚悤‚É•ÏXB
+(Œ´ˆö‚Í•s–¾‚Å‚·‚ª‚±‚ê‚Ń‚ƒ“ƒXƒ^[‚ðŽE‚·‚ÆŽI‚ª‚ß‚¿‚á‚­‚¿‚á‚É’x‚­‚Ȃ邱‚Æ‚ª
+‚ ‚è‚Ü‚·B)
+E‚»‚Ì‘¼­‚µC³B
+EƒeƒXƒg‚Í–w‚ñ‚Ç‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ athena-start C³B
+ (map/)
+ pc.c
+ pc_skill()Apc_resetskill()Apc_setpos()Apc_read_gm_account() C³B
+ pc_set_gm_account_fname() ’ljÁB
+ pc.h
+ pc_set_gm_account_fname() ’ljÁB
+ clif.c
+ clif_skillinfoblock()Aclif_parse_LoadEndAck()Aclif_parse_GMKick() C³B
+ clif_changemap() C³B
+ atcommand.c
+ @partty C³B
+ skill.c
+ skill_castend_nodamage_id() C³B
+ map.c
+ map_config_read()Amap_readwater() C³B
+ script.c
+ script_config_read()Ado_init_script() C³B
+ script.h
+ script_config_read() ’ljÁB
+ (common/)
+ version.h C³B
+ grfio.h
+ grfio.c
+ grfio_init() C³B
+ mmo.h
+ GRF_PATH_FILENAME ’ljÁB
+ (conf/)
+ map_athena.conf C³B
+ npc_water.txt C³B
+ water_height.txt ’ljÁB
+ login_athena.conf C³B
+ (login/)
+ login.c
+ login_config_read()Aread_gm_account() C³B
+ (char/)
+ char.c
+ do_init() C³B
+ char_config_read() ’ljÁB
+ inter.c
+ inter_config_read() C³B
+ (doc/)
+ conf_ref.txt C³B
+
+--------------
+//0589 by ŒÓ’±—–
+
+EGM‚̉EƒNƒŠƒbƒN‚ÅØ’f‚³‚ê‚é–â‘è‚ðC³
+ ‚Æ‚è‚ ‚¦‚¸01dfƒpƒPƒbƒg‚𖳎‹‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B
+ ‚È‚ñ‚Æ‚È‚­‚±‚̃pƒPƒbƒg‚̓`ƒƒƒbƒg‹ÖŽ~‰ñ”‚Æ‚ÍŠÖŒW–³‚¢‚悤‚È‹C‚àcc
+
+ clif.c
+ clif_parse_GMReqNoChatCount()’ljÁ
+
+Estart‚ðathena.sh‚Å‚È‚­athena-start‚ðŽg‚¤‚悤‚É•ÏX
+ start
+ athena.sh => athena-start start‚É’u‚«Š·‚¦‚µ‚½‚¾‚¯
+
+--------------
+//0588 by Kalen
+
+EAmatsuNPC’ljÁ
+
+--------------
+//0587 by ŒÓ’±—–
+
+EloginƒT[ƒo[‚ÌŠÇ—ƒpƒPƒbƒg‚ÌŽd—l‚ð•ÏXi0579‚̃ƒOƒCƒ“‹‘”Ûî•ñ‚ɑΉžj
+ (login/)
+ login.c
+ ƒAƒJƒEƒ“ƒgƒoƒ“ó‘Ô•ÏXƒpƒPƒbƒg’ljÁ(7936,7937)
+ ƒAƒJƒEƒ“ƒgƒŠƒXƒgŠ“¾ƒpƒPƒbƒgC³(7921)
+ (doc/)
+ admin_packet.txt
+
+Eladmin‚Ì‹@”\’ljÁ
+ Eƒoƒ“ó‘Ô‚ð•ÏX‚·‚éƒRƒ}ƒ“ƒh’ljÁ
+ EƒŠƒXƒg•\Ž¦‚ÆŒŸõ‚Ńoƒ“ó‘Ô‚à•\Ž¦‚³‚ê‚é‚悤‚É‚È‚Á‚½
+ E"?"‚Å‚àƒwƒ‹ƒv‚ªo‚é‚悤‚ÉC³
+ EƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Éstateaccount‚ª’ljÁ‚³‚ê‚Ü‚µ‚½B
+ Žg‚¤l‚Íladmin‚Ì--makesymlink‚ð‚à‚¤ˆê“xŽÀs‚µ‚Ä‚­‚¾‚³‚¢
+
+ (tool/)
+ ladmin
+ ‹@”\’ljÁ
+
+--------------
+//0586 by ˆø‘Þl
+EƒJ[ƒhƒXƒLƒ‹‚ðC³
+ (/map)
+ pc.c
+ pc_calc_skilltree()
+ pc_skill()
+ Šo‚¦‚ç‚ê‚È‚¢ƒXƒLƒ‹‚È‚çskill[id].flag=1‚Æ‚·‚é
+ ‚Ü‚½‚Ískill[id].flag‚É–{—ˆ‚Ìlv‚ð+2‚µ‚Ä‹L‰¯
+ pc_skillup()
+ skill[id].flag‚à‘‚â‚·
+ clif.c
+ clif_skillinfoblock()
+ skill[id].flag==1‚È‚çŠo‚¦‚ç‚ê‚È‚¢ƒXƒLƒ‹
+ (/char)
+ char.c
+ mmo_char_tostr()
+ skill[id].flag‚©‚ç–{—ˆ‚Ìlv’l‚ð•Û‘¶‚·‚é
+
+--------------
+//0585 by kalen
+EscriptC³
+ npc_town_guid.txt ŠOŒ©•ÏX
+
+--------------
+//0584 by ˆø‘Þl
+EƒJ[ƒhƒXƒLƒ‹‚ðC³
+ (/map)
+ pc.c
+ pc_calc_skilltree() cardƒXƒLƒ‹‚ð–Y‚ꂳ‚¹‚鈗‚ð’ljÁ
+ pc_skill() ®—
+
+--------------
+//0583 by kalen
+EscriptC³
+ npc_event_doll.txt ”²‚¯‚Ä‚¢‚½•”•ª‚̉ï˜b’ljÁ
+ npc_town_guid.txt ’¬‚̈ēà—vˆõ‚̉摜‚ð•\Ž¦‚Å‚«‚é‚悤‚ÉC³
+ Šî–{“I‚ÉÅVjRO‚Å–â‘è‚È‚µ‚Å‚·B
+
+--------------
+//0582 by PRevEv
+E580‚̃oƒOC³B
+ (/map)
+ skill.c
+ skill_use_pos() C³B
+--------------
+//0581 by ˆø‘Þl
+E…ê‚‚³Ý’èŠÖ˜A‚ð­‚µC³
+ (/map)
+ map.c
+ map_waterheight()
+ map_readwater()
+ map_readmap()
+ waterlist[512] -> *waterlist‚É‚µ‚ÄAmalloc‚Ńƒ‚ƒŠŠm•Û‚·‚é‚悤‚ÉC³B
+ map_readallmap()
+ free(waterlist);’ljÁ
+
+EƒoƒO•ñƒXƒŒƒbƒh‚ÌC³ƒpƒbƒ`‚ðŽæ‚èž‚Ý
+ (conf/)
+ npc_town_refine.txt ƒZƒ~ƒRƒƒ“”²‚¯C³
+ (db/)
+ item_db.txt 1161,ƒoƒ‹ƒ€ƒ“C³
+
+--------------
+//0580 by PRevEv
+EƒtƒŠ[ƒLƒƒƒXƒg‰¼ŽÀ‘•(ƒLƒƒƒXƒeƒBƒ“ƒO’†UŒ‚‚Í•s‰Â”\)
+ (/map)
+ clif.c
+ clif_parse_WalkToXY() C³B
+ pc.c
+ pc_calcstatus() C³B
+ skill.c
+ skill_castend_id()Askill_castend_pos()Askill_use_id()Askill_use_pos() C³B
+--------------
+//0579 by A‚Ìl
+EƒƒOƒCƒ“‚ð’e‚­ˆ—‚ð‰¼ŽÀ‘•
+ conf/login.c
+ auth_dat\‘¢‘Ì‚Éstate‚ð’ljÁ
+ mmo_authŠÖ”C³
+ mmo_auth_newŠÖ”C³
+ mmo_auth_syncŠÖ”C³
+ mmo_auth_initŠÖ”C³
+
+ ‚±‚Ì’l‚ð•ÏX‚·‚éƒc[ƒ‹A‰ü‘PôB‘¼—Í–{Šè‚Å‚·i„ƒG
+--------------
+//0578 by ˆø‘Þl
+EƒoƒO•ñƒXƒŒƒbƒh‚ÌC³ƒpƒbƒ`‚ðŽæ‚èž‚Ý‚È‚Çithanx to ‚é‚é‚邳‚ñ,Athefans‚³‚ñ,sage‚³‚ñ,zupport‚³‚ñj
+ help.txt @go‚Ìà–¾‚¿‚å‚Á‚ÆC³
+ (conf/)
+ npc_mob_job.txt ‘æ4—ñ–Ú‚ðTab‹æØ‚è‚ÉC³
+ npc_water.txt …ê‚‚³C³
+ (db/)
+ item_db.txt 640,...,{ pet 1155; },{},,‚ÉC³
+ mob_db.txt 1162,RAFFLESIA,ƒ‰ƒtƒŒƒVƒA...C³
+
+--------------
+//0577 by ‚é‚é‚é
+E@ƒRƒ}ƒ“ƒh‚ð’ljÁ•C³
+ atcommand.c
+ atcommand() @itemresetƒRƒ}ƒ“ƒh’ljÁ @goƒRƒ}ƒ“ƒhC³iƒAƒ}ƒcEƒRƒ“ƒƒ“‚ð’ljÁj
+ atcommand_config_read() ã‚ɇ‚킹‚ÄitemresetŽg—pƒŒƒxƒ‹Žw’è‚ð’ljÁ
+
+ doc/conf_ref.txt
+ conf/atcommand_athena.conf itemresetŽg—pƒŒƒxƒ‹Žw’è‚ð’ljÁ
+ help.txt @itemreset‚Ìà–¾’ljÁ‚Æ@go‚Ìà–¾C³
+
+-------------
+//0576 by V&S
+EƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh‚ƃo[ƒXƒŠ[ƒJ[ƒh‚ÌŒø‰Ê‚ª‹t‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
+ { bonus bDefEle,7; }¨ƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh(”O)
+ { bonus bDefEle,8; }¨ƒo[ƒXƒŠ[ƒJ[ƒh(ˆÅ)
+ ª‚¾‚Á‚½‚Ì‚ð«‚ÉC³
+ { bonus bDefEle,7; }¨ƒo[ƒXƒŠ[ƒJ[ƒh(ˆÅ)
+ { bonus bDefEle,8; }¨ƒS[ƒXƒgƒŠƒ“ƒOƒJ[ƒh(”O)
+
+ |“S‚Ìd—Ê‚ðC³
+
+--------------
+//0575 by ˆø‘Þl
+E…êƒtƒ@ƒCƒ‹‚ª"conf/npc_water.txt"ŒÅ’肾‚Á‚½‚Ì‚ðC³
+iconf/map_athena.conf‚Ìnpc:‚É‘‚©‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð‚Ý‚Ä…ê‚‚³Ý’è‚·‚é‚悤‚Éj
+ map.c
+ struct waterlist[512]; V‹K’ljÁBƒ}ƒbƒvƒtƒ@ƒCƒ‹–¼‚Æ…ê‚‚³‚ð‹L‰¯B
+ map_waterheight() V‹K’ljÁB…ê‚Ì‚‚³‚ð•Ô‚·B
+ map_readwater() …êƒtƒ@ƒCƒ‹‚ð‚Ý‚Äwaterlist‚ðÝ’è‚·‚é‚悤‚ÉC³B
+ map_readmap() map_waterheight()‚ðŒÄ‚Ԃ悤‚ÉC³B
+ map_config_read() "npc"‚Åmap_readwater(w2);’ljÁB
+
+--------------
+//0574 by ‚¢‚Ç
+
+EƒT[ƒo[Snapshot
+Econf/shop_*.txt‚Ì“à—e‚ðconf/npc_town_*.txt‚É“‡
+
+--------------
+//0573 by Jazz
+
+Emap‚Ì penalty, nomemo, noteleport, nobranch‚Ì option‚ðÝ’èB
+Emap ƒT[ƒo[‚ª cpu‚𖳌Àè—L‚·‚邱‚Æ‚ðŒŸ¸‚·‚邽‚ß‚Ì script “Y•t. cygwinŠÂ‹«‚Å쬂ƎÀŒ±‚ð‚µ‚Ü‚µ‚½.
+ (/conf)
+ mapflag.txt ’ljÁB
+ (/tool)
+ mapcheck.sh ’ljÁB
+
+--------------
+//0572 by ˆø‘Þl
+E"conf/npc_water.txt"‚Ì‘æ4—ñ‚Å…ê‚‚³Ý’è
+@i‚¿‚á‚ñ‚Æ‚µ‚½…ê”»’肪ŽÀ‘•‚³‚ê‚é‚܂ł̂‚Ȃ¬‚Æ‚µ‚ÄEEEj
+ (/conf)
+ npc_water.txt ƒTƒ“ƒvƒ‹C³B
+ E‘æ4—ñ‚Å…ê‚Ì‚‚³‚ðݒ肵‚Ü‚·B
+ E‚‚³‚ð‘‚©‚È‚©‚Á‚½ê‡‚̃fƒtƒHƒ‹ƒg’l‚Í3‚É‚È‚è‚Ü‚·B
+ (/map)
+ map.c
+ E…ê‚‚³Ý’èŠÖ” map_readwater() ’ljÁB
+
+--------------
+//0571 by code
+“V’ÃtƒB[ƒ‹ƒh‚ÌMOB‚Ì”z’u‚ƃ[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è‚ÌC³
+“V’Ãpƒbƒ`‚É›À›Ä‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚Ì‚ðŠm”F‚µ‚½‚Ì‚Å›À›Ä‚̃[ƒv‚Æmob‚ð”z’u
+
+conf/npc_monster35.txt
+ mob‚Ì”z’u
+
+conf/npc_warp_amatsu.txt
+@@ “V’Ãwarp point‚ÌÝ’u
+
+conf/npc_warp_gonryun.txt
+ ›À›Äwarp point‚ÌÝ’u
+
+conf/npc_town_amatsu.txt
+@@ Žb’è“I‚Ƀvƒƒ“ƒeƒ‰•¬…‘O©¨“V’Ã`^ƒvƒƒ“ƒeƒ‰•¬…‘O©¨›À›Ä‚ÌÚ‘±NPC
+
+--------------
+//0570 by code
+“V’ÃtƒB[ƒ‹ƒh‚ÌMOB‚Ì”z’u‚ƃ[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è‚Å‚·B
+conf/npc_monster35.txt
+ mob‚Ì”z’u
+
+conf/npc_warp_amatsu.txt
+@@ warp point‚ÌÝ’u
+
+conf/npc_town_amatsu.txt
+@@ Žb’è“I‚Ƀvƒƒ“ƒeƒ‰•¬…‘O©¨“V’Ã`‚ÌÚ‘±NPC
+
+--------------
+//0569 by Ž€_
+
+E0561‚Ì@jobcange ‚Å‚ÌŠƒo[ƒh•‰ƒ_ƒ“ƒT[‚É‚æ‚éˆÆ—Ž‚¿–hŽ~‚ðpc_jobchange()‚Å‚·‚é‚悤‚É•ÏXB
+E@ƒRƒ}ƒ“ƒh@party’ljÁBƒp[ƒeƒB‚ðì‚é–½—ß‚Å‚·BŠØ‘ˆÆ‚ðŽg‚¤‚ƃp[ƒeƒB‚ðì‚鎞Ž~‚Ü‚é‚Ì‚Å—ÕŽž“I‚É‚±‚ê‚ðŽg‚Á‚ăp[ƒeƒB‚ðì‚Á‚Ä‚­‚¾‚³‚¢B
+E…‚Ì”»’fˆ—C³B
+Eƒ}ƒbƒvƒtƒ‰ƒO‚Éwater‚Æall_water’ljÁBÚ‚µ‚­‚Ínpc_water.txt‚ðŽQl‚µ‚Ä‚­‚¾‚³‚¢B
+iz_dun0x‚¾‚¯“ü—Í‚µ‚Ä‚¢‚Ü‚·‚Ì‚Å‘¼‚Ì‚Í–„‚ß‚Ä‚­‚¾‚³‚¢Bƒ}ƒbƒvƒtƒ‰ƒOwater‚©all_water‚ª“ü‚Á‚Ä‚È‚¢‚ƃZƒ‹‚Ìtype‚ª3‚Å‚à…‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚¹‚ñB‚»‚µ‚Ä…‚¾‚炯‚Ìiz_dun02‚©‚ç04‚Ü‚Å‚Í‘S‚Ä…‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚Éall_water‚ð“ü‚ê‚Ä‚¢‚Ü‚·B(‚±‚êˆÈŠO‚Í•û–@‚ª‚È‚©‚Á‚½‚Ì‚Å...)
+Ebattle_athena.conf‚É€–ڒljÁBˆê•”‚ÍWeiss‚ðŽQl‚µ‚Äì‚Á‚½•¨‚Å‚·B
+EƒeƒXƒg‚µ‚Ä‚È‚¢•¨‚à­‚µ‚ ‚è‚Ü‚·B
+ (/conf)
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+ map_athena.conf C³B
+ npc_water.txt ’ljÁB
+ (/doc)
+ conf_ref.txt C³B
+ (/map)
+ atcommand.hAatcommand.c C³B
+ battle.h C³B
+ battle.c
+ battle_config_read() C³B
+ pc.c
+ pc_jobchange()Apc_stop_walking() C³B
+ npc.c
+ npc_parse_warp()Ado_init_npc()Anpc_parse_mapflag() C³B
+ mob.c
+ mob_ai_sub_hard() C³B
+ pet.c
+ pet_food() C³B
+ skill.c
+ skill_check_condition() C³B
+ map.h
+ struct map_data C³B
+
+--------------
+//0568 by ˆø‘Þl
+
+EƒAƒNƒAƒxƒlƒfƒBƒNƒ^…ê”»’è‚È‚Ç
+EƒEƒH[ƒ^[ƒ{[ƒ‹…ê”»’èiread_gat(m,x,y)==3‚Å…ê‚Æ”»’èj
+ skill.c
+ skill_castend_nodamage_id()
+ case AL_HOLYWATER: ƒAƒNƒAƒxƒlƒfƒBƒNƒ^i¹…Žæ“¾j
+ skill_check_condition()
+ case AL_HOLYWATER: ƒAƒNƒAƒxƒlƒfƒBƒNƒ^i…ê”»’èj
+ case WZ_WATERBALL: ƒEƒH[ƒ^[ƒ{[ƒ‹i…ê”»’èj
+
+--------------
+//0567 by ‚é‚é‚é
+
+EƒAƒRƒ‰ƒCƒg‚̃AƒNƒAƒxƒlƒfƒBƒNƒ^‚ð‰¼ŽÀ‘•i…êŒÀ’èŽg—p‚Ì‚Ý–¢ŽÀ‘•j
+EƒvƒŠ[ƒXƒg‚̃AƒXƒyƒ‹ƒVƒIAƒZ[ƒW‚̃tƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[‚ŃXƒLƒ‹Žg—pŽž‚ɃAƒCƒeƒ€Á”ï
+Eƒ~ƒXƒgƒŒƒXƒJ[ƒh‘•”õŽž‚ɃZ[ƒW‚Ì‘®«Œ´Î•ƒnƒ“ƒ^[‚Ìã©‚ªÁ”‚ê‚È‚¢ƒoƒO‚ðC³
+
+ (/map)
+ skill.c
+ skill_check_condition() C³
+
+--------------
+//0566 by ƒpƒCƒ“
+
+E0563‚̃XƒLƒ‹‰ðœðŒ‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ÅC³B•Ší‚ð‚Í‚¸‚·&•Ší‚ð•Ï‚¦‚½ê‡‚Í
+@–³ðŒ‚ʼn𜂷‚é‚悤‚É‚µ‚½B
+
+# pc_checkallowskill ‚ɂ‚¢‚Ä(‘O‰ñà–¾‘‚­‚Ì‚ð–Y‚ê‚Ä‚¢‚½‚Ì‚Åc)
+@ˆê‰ž¡Œã‚ÌŠÜ‚Ý‚Æ‚µ‚Äreturn‚ð•Ô‚·‚悤‚É‚µ‚Ä‚¢‚Ü‚·‚ªAŒ»Ý‚Í(–ß‚èæ‚Å‚Í)Žg‚Á‚Ä‚¢‚Ü‚¹‚ñB
+@¡Œ»Ý‚Í‹RŽmEƒNƒ‹ƒZƒCƒ_[‚­‚ç‚¢‚µ‚©ƒXƒLƒ‹Žg—pŽž‚Ì•Ší§ŒÀ‚ª‚ ‚è‚Ü‚¹‚ñ‚ªA¡Œão‚Ä‚±‚È‚¢
+@‚Æ‚àŒÀ‚ç‚È‚¢‚Ì‚ÅA‚à‚µ(2ŽŸãˆÊ‚©3ŽŸH)o‚Ä‚«‚½‚炱‚±‚Ń`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (/map)
+ pc.c
+ pc_checkallowskill() C³
+
+--------------
+//0565 by ˆø‘Þl
+
+Eƒ}ƒbƒvˆÚ“®Žž‚É–î‘•”õ‚ªŠO‚ê‚È‚¢‚悤‚ÉC³
+EƒƒOƒCƒ“Žž‚É–î‘•”õ‚ª•\Ž¦‚³‚ê‚é‚悤‚ÉC³
+ (/common)
+ mmo.h
+ i–î‘•”õ‚Í0x8000‚È‚Ì‚Åjshort‚¾‚Æint‚ւ̃LƒƒƒXƒgŽž‚È‚Ç‚É
+ •‰’l‚Æ‚È‚Á‚Ä‚µ‚Ü‚¤‚½‚ßunsigned short‚ÉC³
+ struct item
+ short equip; -> unsigned short equip;
+ (/map)
+ clif.c
+ clif_itemlist() ƒAƒCƒeƒ€ƒŠƒXƒg‚Ì–î‚̂‚¢‚Å‚É–î‘•”õ‚àƒ`ƒFƒbƒN
+ clif_arrowequip() ƒVƒ“ƒvƒ‹‰»
+ pc.c
+ pc_equipitem() C³
+
+--------------
+//0564 by g—t
+
+E@model‚Ì•žõ‚ß•s‰Â”\”»’èC³B
+E@model‚ÅA‘I‚ׂéƒnƒY‚Ì”¯Œ`‚É•ÏXo—ˆ‚È‚©‚Á‚½•”•ª‚ðC³B
+@ã‹L•ÏX“_‚ɇ‚킹‚Ähelp.txt‚ÌC³B
+
+--------------
+//0563 by ƒpƒCƒ“
+
+EMOB‚̈ÈŃXƒLƒ‹‚ðH‚ç‚Á‚½Œã‚ɉñ•œ‚µ‚È‚¢‚Ì‚ðC³Bc‚È‚ñ‚¾‚¯‚ÇA“K³‚È’l‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å
+@“Å‚â’¾–Ù‚Æ“¯‚¶ŽžŠÔ‚É‚µ‚Ä‚ ‚è‚Ü‚·
+@¡ŒãA‚Ü‚½Žè‚ð‰Á‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+E2HQ‚ƃXƒsƒAƒNƒCƒbƒPƒ“‚ðŽg—p’†‚É•Ší‚ð•Ï‚¦‚½ê‡‚͉𜂷‚é‚悤‚É•ÏXB
+
+ (/map)
+ skill.c
+ skill_castend_damage_id() C³B
+ skill_status_change_timer() C³B
+ pc.c
+ pc_checkallowskill() VÝB
+ pc_equipitem() C³B
+ pc.h
+ pc_checkallowskill() VÝB
+
+--------------
+//0562 by huge
+
+E–î‚ð‹|‘•”õŽžˆÈŠO‚Å‚à‘•”õ‚Å‚«‚é‚悤‚É–ß‚µ‚Ü‚µ‚½B
+E–î‚Ì‘®«‚ð“K—p‚·‚é‚Ì‚ð‹|‘•”õŽž‚Ì‚Ý‚ÉC³B
+
+ pc.c
+ pc_equipitem() C³B
+ pc_calcstatus() C³B
+
+--------------
+//0561 by ˆø‘Þl
+
+ELinux‚Å‚àƒRƒ“ƒpƒCƒ‹‚Å‚«‚é‚悤‚É
+ (/map)
+ skill.c
+ skill_castend_damage_id() •Ï”dx,dy‚Ì錾ˆÊ’u•ÏX
+ Makefile
+ LIBS ‚É -lm ’ljÁ
+
+E@jobcange ‚Å‚ÌŠƒo[ƒh•‰ƒ_ƒ“ƒT[‚É‚æ‚éˆÆ—Ž‚¿–hŽ~B by (no name)‚³‚ñ
+ atcommand.c
+ @jobchange,@charjob‚É«•Êƒ`ƒFƒbƒN’ljÁ
+
+// ƒiƒiƒX‚³‚ñC³
+Eclif.c“à‚Åatcommand.h‚ð‚Q“xinclude‚µ‚Ä‚¢‚½‚̂ňê‚ÂíœB
+Eƒp[ƒeƒB[‰ï˜bAƒMƒ‹ƒh‰ï˜b‚Å‚à@ƒRƒ}ƒ“ƒh‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³B
+ (/map)
+ clif.c
+ clif_parse_PartyMessage()Aclif_parse_GuildMessage C³B
+
+--------------
+//0560 by ƒpƒCƒ“
+
+E0559 ‚Ì athena-start ‚ð Unix Like OS ‚Å‚à“®‚­‚悤‚ɃŠƒtƒ@ƒCƒ“B
+
+--------------
+//0559 by rowla
+
+Eathena.sh‚ð‘S–Ê“I‚É‘‚«’¼‚µAathena-start‚ÉBathena-start start‚ÅŠJŽnAathena-start stop‚ŃT[ƒo[’âŽ~Bcygwin‚ŃeƒXƒgA*BSD|Linux‚Å‚Í–¢ƒeƒXƒg(ŠÂ‹«‚ª‚È‚¢‚½‚ß)B
+
+--------------
+//0558 by Ž€_
+
+EƒuƒŠƒbƒcƒr[ƒg‚ðŽ©“®‚¾‚¯‹|‚ð‘•”õ‚µ‚Ä‚¢‚È‚¢‚Æ”­“®‚Å‚«‚È‚¢‚悤‚É•ÏXB(Žè“®‚Í•Ší‚ÉŠÖŒW‚È‚­Žg‚¦‚Ü‚·B) –¢ƒeƒXƒgB
+Eƒgƒ‰ƒbƒv‚Ìd‚³C³B(‰½ŒÌ‚©‚Í’m‚ç‚È‚¢‚¯‚Ç100‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ð10‚ÉC³Bˆö‚Ý‚É‘q‚Ì•\Ž¦‚Í100‚ª10‚Å10‚ª1‚Å‚·B)
+E‹|‚ÅŽg‚¤ƒXƒLƒ‹‚ÌꇖŒ¸‚ç‚È‚¢‚Ì‚ªŽd—l‚¾‚Á‚½‚ÆŠo‚¦‚Ä‚¢‚é‚Ì‚Å–î‚ðƒ`ƒFƒbƒN‚µ‚È‚¢‚悤‚ÉC³B
+Eƒ‚ƒ“ƒNƒXƒLƒ‹ŽO’i¶‚Ì•\Ž¦‚ðƒpƒbƒVƒu‚É•ÏXB
+Eƒ}ƒbƒvƒtƒ‰ƒO‚ðƒZƒbƒg‚·‚鎞dummy‚ª‚È‚­‚Ä‚àƒZƒbƒg‚Å‚«‚é‚悤‚ÉC³B
+(mapflag nomomo dummy‚©‚çmapflag nomemo‚Å‚à‘åä•v‚Ȃ悤‚É•ÏXB)
+–¢ƒeƒXƒgB
+ (/db)
+ item_db.txt C³B
+ skill_db.txt C³B
+ (/map)
+ skill.c
+ skill_check_condition()Askill_additional_effect() C³B
+ skill_status_change_start() C³B
+ npc.c
+ do_init_npc() C³B
+
+--------------
+//0557 by huge
+
+E–î‚ðA‹|‘•”õŽž‚Ì‚Ý‘•”õ‚Å‚«‚é‚悤‚ÉC³B
+E‹|‚ð‘•”õ‚©‚çŠO‚µ‚½‚çA–î‚àŠO‚ê‚é‚悤‚ÉC³B
+E–î‚ðÁ”ï‚·‚éƒXƒLƒ‹‚ð‚¢‚­‚‚©C³B
+E‘é‚ðA‹|‚ð‘•”õ‚µ‚Ä‚¢‚é‚Æ‚«‚Ì‚Ý”­“®‚·‚é‚悤‚ÉC³B(–¢ƒeƒXƒg)
+
+ pc.c
+ pc_equipitem() C³B
+ pc_unequipitem() C³B
+ skill.c
+ skill_additional_effect() C³B
+ skill_check_condition() C³B
+
+--------------
+//0555 by Ž€_
+
+Eׂ©‚¢C³‚ƃvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒXAŒÃ‚¢Šª•¨‚̃oƒOC³B
+E@ƒRƒ}ƒ“ƒh@refineA@produce­‚µC³B
+EƒT[ƒo[‚ÌIP‚ÉDNS–¼‚ðŽg‚¦‚é‚悤‚É•ÏXB(¡‚³‚ç‚Å‚·‚ªYare‚©‚ç
+Ž‚Á‚Ä‚«‚½•¨‚Å‚·B)
+EƒXƒeƒB[ƒ‹ŒvŽZŽ®•ÏX‚ÆMVPƒAƒCƒeƒ€ˆ—•ÏXB
+E“XNPC‚ð—˜—p‚É‚æ‚éƒWƒ‡ƒuŒoŒ±’lŠl“¾ŒvŽZŽ®•ÏXB
+ Šl“¾ƒWƒ‡ƒuŒoŒ±’l = ln(‹à*ƒXƒLƒ‹ƒŒƒxƒ‹) * shop_exp / 100
+E‚Ù‚Æ‚ñ‚ǃeƒXƒg‚µ‚Ä‚È‚¢‚̂ŃoƒO‚̉”\«‚ª‚ ‚è‚Ü‚·B
+ help.txt C³B
+ (/conf)
+ atcommand_athena.conf C³B
+ battle_athena.conf C³B
+ (/db)
+ item_db.txt C³B
+ (/doc)
+ conf_ref.txt C³B
+ (/char)
+ char.c
+ do_init()Acheck_connect_login_server() C³‚Æ­‚µC³B
+ (/map)
+ mob.c
+ mob_damage() C³B
+ pc.c
+ pc_getitemfromcart()Apc_steal_item() C³B
+ pet.c
+ pet_return_egg()Apet_get_egg()Apet_unequipitem() C³B
+ script.c
+ buildin_getitem() C³B
+ skill.c
+ skill_produce_mix() C³B
+ storage.c
+ storage_storageget() C³B
+ atcommand.c C³B
+ map.c
+ map_config_read() C³‚Æ­‚µC³B
+ chrif.c
+ check_connect_char_server()Ado_init_chrif()Achrif_setip() C³‚Æ­‚µC³B
+ npc.c
+ npc_buylist()Anpc_selllist() C³B
+
+--------------
+//0554 by NOCTURNE
+EƒT[ƒo[SnapShot
+Etoo/addaccount‚Ìíœ
+Ehelp.txt‚ÌXV
+
+--------------
+//0553 by ŒÓ’±—–
+
+Eladmin‚̃oƒOC³‚Æ‹@”\’ljÁ
+ EƒL[ƒ[ƒh‚É‚æ‚éƒAƒJƒEƒ“ƒgŒŸõ‹@”\’ljÁ
+ EƒVƒFƒ‹ƒRƒ}ƒ“ƒh‚Æ‚µ‚ÄŽg—p‚Å‚«‚é‚悤‚Ƀvƒƒ“ƒvƒg‚ðŽg‚í‚È‚¢ƒ‚[ƒh’ljÁ
+ E’ljÁ‹@”\‚ɂ‚¢‚Ä‚Íladmin‚ðŒ©‚Ä‚­‚¾‚³‚¢
+ E ladmin‚Ì--makesymlink‚É‚æ‚èAƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚Æ‚µ‚Äaddaccount‚ð
+ 쬂·‚邽‚ßAˆÈ‘O‚Ìaddaccount‚Í휂·‚é•K—v‚ª‚ ‚è‚Ü‚·B
+ ‚±‚ê‚ç‚̃Vƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN(Cygwin‚ł̓Vƒ‡[ƒgƒJƒbƒg)‚ÆA
+ ŒÃ‚¢addaccount‚ÍŽIsnapshot‚É‚ÍŠÜ‚Ü‚È‚¢‚ʼnº‚³‚¢B
+
+ (tool/)
+ ladmin
+ ‹@”\’ljÁ‚ÆC³
+
+E—«ƒAƒJƒEƒ“ƒg‚µ‚©ì¬‚Å‚«‚È‚¢ƒoƒOC³
+EladminAcheckversionŽg—pŽžloginƒT[ƒo[‚ª–\‘–‚·‚éƒoƒOC³
+EGMƒAƒJƒEƒ“ƒgŽü•Ó‚ÌID‚ð”ð‚¯‚é‚½‚ß‚ÉSTART_ACCOUNT_NUM‚ð•ÏX
+ (Šù‚ÉGMƒAƒJƒEƒ“ƒg‚Í”ð‚¯‚éŽd—l‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA¬—–hŽ~‚Ì‚½‚ß)
+
+ (login/)
+ login.h
+ START_ACCOUNT_NUM‚ð500000‚©‚ç2000000‚É•ÏX
+ login.c
+ 7532(Ø’f)ƒpƒPƒbƒg‚̈—C³
+ mmo_auth_new()C³
+
+Ebackup‚ªƒoƒbƒNƒAƒbƒv‚·‚éƒtƒ@ƒCƒ‹‚Épet.txt‚ð’ljÁ
+ (tool/)
+ backup
+ ƒtƒ@ƒCƒ‹’ljÁC³
+
+--------------
+//0552 by Ž€_
+
+EˆÀ’è«‚ðã‚°‚éˆ×‚ÌC³‚Å‚·‚ª–{“–‚ɈÀ’è«ã‚ª‚Á‚½‚©
+‚Ç‚¤‚©‚Í•s–¾‚Å‚·B
+EPVP‚É‚æ‚èƒNƒ‰ƒCƒAƒ“ƒg‚ª—Ž‚¿‚é–â‘èC³B
+ atcommand.c
+ @pvpoffA@pvponA@gvgonA@gvgoff C³B
+ script.c
+ buildin_pvpon()Abuildin_pvpoff()Abuildin_gvgon()Abuildin_gvgoff() C³B
+ clif.c
+ clif_pvpset() C³B
+ skill.c
+ skill_attack()Askill_unit_onplace()Askill_unit_onout() C³B
+ skill_unit_ondelete() C³B
+
+--------------
+//0551 by Kalen
+EDBC³
+ db/create_arrow_db.txt Š®¬
+ SourceID‡‚Ƀ\[ƒg‚µ‚Ü‚µ‚½B
+
+--------------
+//0550 by huge
+
+E–î쬃XƒLƒ‹ŽÀ‘•
+
+ clif.c
+ clif.h
+ clif_arrow_create_list() ’ljÁ
+ clif_arrow_created() ’ljÁ
+ clif_parse() C³
+
+ pc.c
+ pc_search_inventory() C³
+
+ skill.c
+ skill.h
+ skill_arrow_db() ’ljÁ
+ skill_readdb() C³
+ skill_castend_damage_id() C³
+
+ db/create_arrow_db.txt ’ljÁ
+ db/skill_db.txt C³
+
+ ‚Ü‚¾db‚Í–¢Š®¬‚Å‚·B
+
+--------------
+//0549 by Kalen
+
+Emap_athena.conf
+ ƒIƒŠƒWƒiƒ‹ƒXƒNƒŠƒvƒgA‹GߌÀ’èƒXƒNƒŠƒvƒg‚ð®“Ú
+ shop3.txt’ljÁ
+
+EŠeŽíNPC’ljÁ•C³
+ npc_event_yuno.txt [’ljÁ]ƒWƒ…ƒm[ƒCƒxƒ“ƒg(ÂÎ5ŒÂGET)
+ npc_cTower.txt [’ljÁ]’nã’n‰º‚ÌŒ®NPC
+ npc_town_yuno.txt [C³]‘䎌C³
+
+ npc_event_carnival.txt [’ljÁ]‹ŒŽIƒJ[ƒjƒoƒ‹ƒCƒxƒ“ƒgŽž‚ÌNPC
+
+--------------
+//0548 by huge
+
+E–î‚ð‘•”õ‚µ‚½Žž‚Ì•\Ž¦ƒoƒO–â‘è‚ðC³B
+ clif.c
+ clif_arrowequip() C³B
+ pc.c
+ pc_equipitem() C³B
+
+‚ ‚Æ‚ÍAƒ}ƒbƒv‚ðˆÚ“®‚·‚邽‚Ñ‚É‘•”õ‚ªŠO‚ê‚¿‚Ⴄ“_‚Å‚·‚ËEEEB
+
+--------------
+//0547 by Ž€_
+
+EˆÀ’è«‚ðã‚°‚éˆ×‚ÌC³‚Æׂ©‚¢C³B
+EƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”»’è‚ð‚µ‚Ä‚¢‚éŠÔƒƒ‚ƒŠ[‚ð‰ðœ‚Å‚«‚È‚¢‚悤‚É•ÏXB
+ map.c
+ map_foreachinarea()Amap_foreachinmovearea() C³B
+ map_foreachobject() C³B
+ block_free_max‚ð32000‚©‚ç50000‚É•ÏXB
+ pc.c
+ pc_calcstatus() C³B
+ skill.c
+ do_init_skill()Askill_unit_timer()Askill_status_change_clear() C³B
+ skill.cAbattle.cAbattle.h
+ struct battle_config‚Ìsanctury_type‚ðsanctuary_type‚É•ÏXB
+ (‰pŒêƒXƒyƒ‹ŠÔˆá‚¢‚ÅC³B)
+ battle_athena.conf
+ sanctury_type‚ðsanctuary_type‚É•ÏXB
+ conf_ref.txt
+ sanctury_type‚ðsanctuary_type‚É•ÏXB
+
+--------------
+//0546 by Ž‚Žqo^.^o
+
+conf/npc_shop2.txt
+DƒoˆêƒhAƒ_ƒ“ƒTˆê—p‚Ì•ŠíBƒRƒ‚ƒh‚Ì•Ší‰®‚Ŕ̔„‚µ‚Ä‚¢‚éB
+Dƒ‚ƒ“ƒN—p‚Ì•ŠíBƒJƒsƒgˆêƒŠƒiC“¹‰@‚Ŕ̔„‚µ‚Ä‚¢‚éB
+
+--------------
+//0545 by Ž€_
+
+EƒuƒŠƒbƒc‚̃_ƒ[ƒW‚ðŽ©“®‚Å•ªŽUAŽè“®‚Å•’Ê‚É‚È‚é‚悤‚É•ÏXB
+EƒI[ƒgƒuƒŠƒbƒcƒoƒOC³B(‚±‚ê‚Å‘åä•v‚¾‚Æ‚¢‚¢‚¯‚Ç...)
+ map.c
+ block_free_max‚ð16000‚©‚ç32000‚ÉC³B
+ block_list_max‚ð4096‚©‚ç5120‚ÉC³B
+ battle.c
+ battle_weapon_attack() C³B
+ skill.c
+ skill_attack()Askill_castend_damage_id() C³B
+
+--------------
+//0544 by Diex
+E–Ò—´Œ‚©‚爢C—…”e™€Œ‚ւ̃Rƒ“ƒ{ŽÀ‘•B
+Eˆ¢C—…”e™€Œ”­“®ŒãA“G‚Ì”wŒã‚Ɉړ®‚·‚é‚悤AC³B
+EŽO’i¶‚̃_ƒ[ƒWC³B
+ (/map)
+ skill.c
+ skill_castend_damage_id() C³B
+ skill_check_condition() C³B
+ skill_use_id() C³B
+ pc.c
+ pc_attack_timer() C³B
+ pc_authok() C³B
+ battle.c
+ battle_calc_weapon_attack() C³B
+ battle.h
+ struct Battle_Config C³B
+ map.h
+ struct map_session_data C³B
+ (/conf)
+ battle_athena.conf C³B
+
+‚Í‚Á‚«‚è‚¢‚Á‚ăRƒ“ƒ{Œq‚°‚Â炢‚Å‚·B‚»‚Ì‚½‚߈¢C—…‚ւ̃Rƒ“ƒ{‚Í‚©‚È‚èŠÃ‚¢”»’è‚É
+‚µ‚Ä‚Ü‚·iˆêŽž“I‚É‚Å‚·‚ªjBŒq‚°‚Â炯‚ê‚Îbattle_athena.conf‚Ì‚Ù‚¤‚Ńfƒ…ƒŒƒCŽž
+ŠÔ‚ð‘å‚«‚­‚µ‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B
+ “®‰æŒ©‚Ä‚Ä‹C‚¢‚½‚Ì‚Å‚·‚ªAˆ¢C—…”e™€Œ‚Í–Ò—´Œ‚ª”­“®‚µ‚½ŒãA‘¦Žž”­“®‚̃XƒL
+ƒ‹‚É•Ï‚í‚Á‚Ä‚é‚悤‚È‚Ì‚Å‚·B‘¼—Í–{Šè‚Å‚·‚ªAˆ¢C—…‚܂ł̃Rƒ“ƒ{‚̃pƒP‚ð‹L˜^‚µ‚½
+•¨‚ð‚Ç‚È‚½‚©ƒAƒbƒv‚µ‚Ä‚à‚炦‚È‚¢‚Å‚µ‚傤‚©HÚׂª‚í‚©‚莟‘æAC³‚µ‚Ü‚·B
+
+--------------
+//0543 by Ž€_
+
+EƒuƒŠƒbƒc‚̃_ƒ[ƒW‚𕪎U‚³‚ê‚é‚悤‚É•ÏXB
+E•’ʂ̃AƒJƒEƒ“ƒgì‚è‚Å‚ÍGMƒAƒJƒEƒ“ƒg‚ðì‚ê‚È‚¢‚悤‚É•ÏXB
+(‘O‚ÉŽ©•ª‚ª“ü‚ꂽ•¨‚ª‚È‚­‚È‚Á‚½‚Ì‚Å–ß‚µ‚½‚¾‚¯‚Å‚·‚ª...)
+EŽæ‚芪‚«‚ªŽå‚ƈê‚ÉŽ€‚ʂ悤‚É•ÏXB(‚½‚¾‚¿‚å‚Á‚Æd‚­‚È‚é
+‰Â”\«‚ª‚ ‚è‚Ü‚·B) –¢ƒeƒXƒgB
+EMVPŒoŒ±’l‚ª•\Ž¦‚¾‚¯‚³‚ê‚ÄŽÀÛ‚É‚Í“ü‚Á‚Ä‚È‚¢–â‘èC³B
+ (/login)
+ login.c
+ mmo_auth_new() C³B
+ (/map)
+ skill.c
+ skill_castend_damage_id() C³B
+ battle.c
+ battle_calc_misc_attack() C³B
+ mob.c
+ mob_damage() C³B
+ mob_deleteslave()Amob_deleteslave_sub() ’ljÁB
+
+--------------
+//0542 by Ž€_
+
+EƒI[ƒgƒuƒŠƒbƒcƒoƒOC³B(¡“x‚±‚»‘åä•v‚Ì‚Í‚¸...)
+EŽ©•ª‚ÉŽg‚Á‚½ƒq[ƒ‹‚Å‚ÍŒoŒ±‚ª“ü‚ç‚È‚¢‚悤‚É•ÏXB
+E“XNPC‚ð—˜—p‚É‚æ‚éƒWƒ‡ƒuŒoŒ±’lŠl“¾ŒvŽZŽ®•ÏXB
+ Šl“¾ƒWƒ‡ƒuŒoŒ±’l = ln(‹à) * shop_exp / 100
+‚É‚È‚è‚Ü‚·B
+log‚ðŽg‚¤‚±‚Æ‚Å‹à‚ª‘½‚­‚Ä‚à“ü‚éŒoŒ±’l‚ª‘½‚­“ü‚ç‚È‚¢‚悤‚É•ÏX‚µ‚Ü‚µ‚½B
+ (/map)
+ battle.c
+ battle_damage() C³B
+ skill.c
+ skill_attack()Askill_castend_damage_id() C³B
+ skill_castend_nodamage_id C³B
+ npc.c
+ npc_buylist()Anpc_selllist() C³B
+ map.c
+ map_foreachinarea()Amap_foreachinmovearea()Amap_foreachobject()
+ C³B(‘債‚½C³‚Å‚Í‚È‚¢‚Å‚·B)
+ (/conf)
+ battle_athena.conf C³B
+ (/doc)
+ conf_ref.txt C³B
+
+--------------
+//0541 by huge
+
+E–î‚ð‚Ü‚Æ‚ß‚ÄŽ‚Ä‚é‚悤‚ÉC³B
+E‹|‚ÅUŒ‚‚µ‚½‚Æ‚«‚ÉA‘•”õ‚µ‚Ä‚¢‚é–î‚ðÁ”ï‚·‚é‚悤‚ÉC³B
+
+ itemdb.c
+ itemdb_search() C³
+ itemdb_isequip() C³
+
+ battle.c
+ battle_weapon_attack() C³
+ battle_calc_weapon_attack() C³
+
+ clif.c
+ clif.h
+ clif_arrow_fail() ’ljÁ
+ clif_parse_EquipItem() C³
+
+--------------
+//0540 by Ž€_
+
+EƒoƒOC³‚Æ–â‘è‚ ‚è‚»‚¤‚ÈŠC³B(‚±‚ê‚ÅWZ_FIREPILLAR‚ƃuƒŠƒbƒc‚É
+‚æ‚éŽIƒ_ƒEƒ“‚Í‚È‚­‚È‚é‚Í‚¸...)
+ map.c
+ map_foreachinarea()Amap_foreachinmovearea() C³B
+ skill.c
+ skill_unitsetting()Askill_delunitgroup() C³B
+ pc.c
+ pc_damage() C³B
+ battle.c
+ battle_damage() C³B
+ npc.c
+ npc_parse_mob() C³B
+ mob.c
+ mob_spawn_dataset() C³B
+
+--------------
+//0539 by Ž€_
+
+Eclif_pvpset()‚ðƒ}ƒbƒv‚©‚çAREA‚©ƒ}ƒbƒv‚©‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB(pvp‚ÌŽž‚̈—‚Í0535ˆÈ‘O‚Ì•¨‚É–ß‚»‚Ü‚µ‚½BŽ©•ª‚¾‚¯‚É“]‘—‚µ‚Ä‚à‚¢‚¢‚悤‚È‹C‚à‚µ‚Ü‚·‚ª...)
+ clif.hAclif.c
+ clif_pvpset() C³B
+ clif_parse_LoadEndAck() C³B
+ script.c
+ buildin_pvpoff() C³B
+ buildin_pvpon() C³B
+ atcommand.c C³B
+EUŒ‚“r’†‚ŃAƒCƒeƒ€‚ðE‚¤‚ÆUŒ‚‚ªŽ~‚Ü‚é‚悤‚ÉC³B
+ pc.c
+ pc_takeitem() C³B
+E0535à–¾‚ª”š—ô”g“®‚É‚È‚Á‚Ä‚¢‚邪‚»‚ê‚Í‹à„‚ÉŠÔˆá‚¢‚Å‚·B
+E0537‚Åà–¾‚ð–Y‚ê‚Ü‚µ‚½‚ªƒ‚ƒ“ƒXƒ^[‚Ìdef‚Æmdef‚ð10000ˆÈã‚ÉÝ’è‚·‚ê‚ΑS‚Ä‚ÌUŒ‚‚É1ƒ_ƒ[ƒW‚ɂȂ郂ƒ“ƒXƒ^[‚É‚È‚è‚Ü‚·B‚»‚µ‚ă‚ƒ“ƒXƒ^[î•ñ‚Ådef‚Æ
+mdef‚ª10000ˆÈã‚Ìê‡def 100Amdef 99‚É•\Ž¦‚·‚é‚悤‚É•ÏXB–{ŽIŽd—l‚É
+‚·‚é‚É‚Ímob_db.txt‚ðC³‚µ‚Ä‚­‚¾‚³‚¢B
+
+--------------
+//0538 by huge
+
+EƒOƒŠƒ€ƒgƒD[ƒX‚ð”͈ÍUŒ‚‚ÉC³
+EƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒNŽÀ‘• (—LŒø”͈͂Á‚ÄA‚±‚ê‚Å‚ ‚Á‚Ä‚é‚Ì‚©‚ÈH)
+EƒoƒbƒNƒXƒ^ƒu‚̉¼ŽÀ‘•
+ –{ŽI‚Å‚â‚Á‚Ä‚él‚©‚ç˜b‚ð•·‚¢‚ÄAꊎw’肶‚á‚È‚­‚Ä
+ ƒ^ƒQŽæ‚Á‚Ä‚à—Ç‚³‚»‚¤‚¾‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½Bi‚â‚è‚â‚·‚©‚Á‚½‚Ì‚Å (^^;
+ ‚Ü‚¾Amob‚ÌŒã‚ë‚É‹‚é‚©‚Ç‚¤‚©‚Ì”»’è‚Í“ü‚Á‚Ä‚Ü‚¹‚ñB
+
+Ebattle.c
+ battle_calc_weapon_attack() C³
+
+Eskill.c
+ skill_additional_effect() C³
+ skill_castend_damage_id() C³
+ skill_check_condition() C³
+ skill_use_id() C³
+ skill_castend_nodamage_id() C³
+
+Eskilldb.txt
+ ƒoƒbƒNƒXƒ^ƒu‚ÌŽí—Þ‚ð[êŠ]‚©‚ç[“G]‚Ö•ÏX
+
+--------------
+//0537 by Ž€_
+
+EƒXƒeƒB[ƒ‹ƒoƒOC³‚Æbattle_athena.conf‚Ì€–ڒljÁAŽd—l•ÏX‚Æׂ©‚¢C³‚Å‚·B
+(ƒXƒeƒB[ƒ‹‚ÍŒvŽZŽ®‚É–â‘肪‚ ‚Á‚½‚Ì‚ÅC³‚µ‚ÄŠm—¦‚ðX‚É—Ž‚Æ‚µ‚Ü‚µ‚½B)
+ battle.h
+ finger_offencive_type‚ðfinger_offensive_type‚ÉC³B(‰pŒêƒXƒyƒ‹ŠÔˆá‚¢‚ÅC³‚µ‚Ü‚µ‚½B)
+ struct battle_config‚Érestart_hp_rateArestart_sp_rate ’ljÁB
+ battle.c
+ battle_calc_weapon_attack()Abattle_calc_magic_attack() C³B
+ skill.c
+ skill_attack() C³B
+ clif_skill_nodamage()‚ɃXƒLƒ‹ƒŒƒxƒ‹‚ð‘—‚é‚悤‚É•ÏXB(M‚³‚ñ‚ÌŽw“E‚É‚æ‚èC³B)
+ clif.c
+ clif_skill_estimation() C³B
+ conf_ref.txt
+ finger_offencive_type‚ðfinger_offensive_type‚ÉC³‚Æ­‚µ’ljÁB
+ mob.c
+ mob_ai_sub_hard()Amob_target()Amob_damage() C³B
+ pc.c
+ pc_steal_item() C³B
+ atcommnad.cAatcommnd.h
+ @ƒRƒ}ƒ“ƒh@gvgon , @gvgoff ’ljÁB
+ battle_athena.conf
+ finger_offencive_type‚ðfinger_offensive_type‚ÉC³‚Æ­‚µ’ljÁB
+
+--------------
+//0536 by hogefuga3 (Athena staff)
+
+EVGRFƒtƒ@ƒCƒ‹ƒtƒH[ƒ}ƒbƒg‘Ήž
+@- Athena staff —l‚Ì쬂³‚ꂽƒpƒbƒ`‚ð“K—p‚µ‚Ü‚µ‚½B
+ XV—š—ð‚Ì•”•ª‚̓pƒbƒ`ƒ~ƒX‚É‚È‚Á‚½‚Ì‚ÅŽè“®‚Å‘g‚Ýž‚ÝB
+
+i•ÏXj
+ common/
+ grfio.c
+
+--------------
+//0535 by Ž€_
+
+E0533‚Ì–â‘肪‚ ‚è‚»‚¤‚È•”•ª‘S‚ÄC³BC³‚µ‚½Š‚ð‘S•”ƒ`ƒFƒbƒN‚µ‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯...
+EƒXƒNƒŠƒvƒgsetmapflagnosave ’ljÁB
+ setmapflagnosave ƒ}ƒbƒv–¼AƒZ[ƒu‚·‚éƒ}ƒbƒv–¼AÀ•W(XAY)
+ nosaveƒtƒ‰ƒO‚ðon‚É‚µ‚Ü‚·B
+Ebattle_athena.conf‚ɒljÁ‚ƈꕔŽd—l•ÏXB(Ú‚µ‚­‚Íconf_ref.txt‚ðŽQl‚µ‚Ä‚­‚¾‚³‚¢B)
+Eƒ‚ƒ“ƒXƒ^[‚Ìdef‚Æmdef‚ª10000ˆÈã‚ÌꇑS‚Ä‚ÌUŒ‚(ƒNƒŠƒeƒBƒJƒ‹ŠÜ‚ß‚Ä)‚ª1ƒ_ƒ[ƒW‚É‚È‚é‚悤‚É•ÏXB(ƒgƒ‰ƒbƒv‚âƒuƒŠƒbƒc‚Ìꇗ¼•û‚ª10000ˆÈã‚Ìꇂ̂Ý1‚É‚È‚è‚Ü‚·B) ‘‚ƃLƒmƒR‚É‚Pƒ_ƒ[ƒWŒÅ’è‚Í휂µ‚Ü‚µ‚½B(Œ³X–{ŽI‚Å‚à1ŒÅ’è‚Å‚Í‚È‚¢‚Å‚·B¸—û“™‚É‚æ‚éˆø‚«ã‚°ƒ_ƒ[ƒW‚Í‚»‚Ì‚Ü‚Üo‚Ü‚·‚Ì‚Å... ŒÅ’肵‚½‚¢‚Ì‚È‚çdef‚Æmdef‚ð10000‚É‚µ‚Ä‚­‚¾‚³‚¢BŽÀ‚Í‚±‚ê‚̓NƒŠƒXƒ^ƒ‹‚ɈׂÉì‚낤‚Æ‚µ‚½•¨‚Å‚·‚ª...)
+E”š—ô”g“®‚ÌŽžƒAƒCƒeƒ€‚É‚æ‚éƒXƒLƒ‹‚ÍŽg—p‚Å‚«‚é‚悤‚ÉC³B
+E‚»‚Ì‘¼­‚µC³B(C³‚Ì•¨‚Ì’†‚ɃeƒXƒg‚µ‚Ä‚È‚¢•¨‚à‚ ‚è‚Ü‚·B)
+ (/doc)
+ conf_ref.txt C³B
+ (/conf)
+ battle_athena.conf C³B
+ (/map)
+ battle.h C³B
+ battle.c C³B
+ mob.h C³B
+ mob.c C³B
+ skill.c C³B
+ npc.c C³B
+ pc.c C³B
+ script.c C³B
+ clif.c C³B
+ chrif.c C³B
+
+--------------
+//0534 by Diex
+
+EƒRƒ“ƒ{ƒVƒXƒeƒ€‰¼ŽÀ‘•
+ map/
+ battle.c
+ battle_weapon_attack() C³B
+ clif.c
+ clif.h
+ clif_combo_delay()@ŠÖ”’ljÁB
+ map.h
+ map_session_data@•Ï”’ljÁB
+ pc.c
+ pc_authok()@•Ï”’ljÁB
+ pc_attack_timer()@C³B
+ skill.c
+ skill_castend_damage_id()@C³B
+ skill_check_condition@C³B
+ skill_use_id@C³B
+ db/
+ skill_db.txt@C³B
+
+’j–Ò—´Œ‚©‚爢C—…”e–PŒ‚É‚Í‚Ü‚¾‚‚Ȃ°‚Ü‚¹‚ñB
+ ˆ¢C—…”e–PŒ‚ð•ú‚Á‚½ŒãAPC‚ÍMOB‚Ì”wŒã(?)‚Ɉړ®‚µ‚Ä‚é‚Á‚Û‚¢‚Ì‚Å‚·‚ªA
+@@‚»‚±‚ç‚Ö‚ñ‚Ìî•ñ‚ª‘«‚è‚Ü‚¹‚ñBî•ñ’ñ‹Ÿ‚¨Šè‚¢‚µ‚Ü‚·B
+
+--------------
+//0533 by ‚é‚é‚é
+
+E‘‚ƃLƒmƒR‚É‚Pƒ_ƒ[ƒWŒÅ’è
+battle.c ‚Ì battle_weapon_attack() ‚Æ battle_calc_attack() ‚ðC³
+battle.c ‚Ì battle_get_mobid() ‚ð’ljÁ
+mob.c ‚Ì mob_makedummymobdb() ‚Æ mob_readdb() ‚ðC³
+
+EƒXƒLƒ‹ƒƒO‚Ƀ‚ƒu‚̌ŗL”Ô†•‚o‚b‚Ì‚h‚c”Ô†‚ð•\Ž¦
+ibattle.c ‚Ì battle_get_mobid() ‚ð’ljÁ‚µ‚½‚Ì‚Å‚»‚̂‚¢‚Å‚Éj
+mob.c skill.c ‚Ì•ÏX‰ÓŠ‘½”iŠ¾
+i"MOB %d" ‚à‚µ‚­‚Í "PC %d" ‚ÅŒŸõ‚·‚ê‚ΕÏX‰ÓŠ‚ª‚í‚©‚é‚©‚Æj
+
+Eƒnƒ“ƒ^[‚Ìã©‚ðŽg‚Á‚½ƒXƒLƒ‹‚Åã©‚ðÁ”ï‚·‚é‚悤‚É‚µ‚½
+batttle.c ‚Ì skill_check_condition() ‚ðC³
+iƒWƒFƒ€Á”‚Ì—¬—p‚Á‚Û‚¢‚±‚Æ‚ð‚â‚Á‚Ä‚é‚ñ‚¾‚¯‚Lj—’†g‚Í—‰ð‚µ‚Ä‚È‚¢‚—j
+
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ•ƒ}ƒOƒkƒX‚̃_ƒ[ƒW”»’è‚ð•sŽ€‘®«•ˆ«–‚Ží‘°‚ÉÄ“xC³
+0532‚ÅÄ‚ÑŒ³‚É–ß‚Á‚Ä‚µ‚Ü‚Á‚½‚Ì‚ð‚È‚¨‚µ‚Ü‚µ‚½B
+‚½‚¾‚µA‰ñ”•l””»’è‚É‚ÍŽè‚ð‰Á‚¦‚Ä‚¢‚Ü‚¹‚ñi‚Á‚Ä‚©Ž©•ª‚É‚Í‚Ü‚¾ƒ€ƒŠj
+
+ˆÈãB
+Ø‚Á‚½“\‚Á‚½‚ÌŒ©—lŒ©^Ž—‚Å‚â‚Á‚½‚Ì‚ÅŒ¾Œê“I‚ɉʂ½‚µ‚Ä‚±‚ê‚Å‚æ‚¢‚Ì‚©BBB
+‚à‚µˆ—•û–@‚É–â‘è—L‚肾‚Á‚½‚çC³‚È‚è‚ð‚µ‚Ä‚¢‚½‚¾‚¯‚é‚ÆŠð‚µ‚¢‚Å‚·B
+
+--------------
+//0532 by Ž€_
+
+EC³‚µ‚½Š‚ð‘S‘Rƒ`ƒFƒbƒN‚µ‚Ä‚È‚©‚Á‚½‚Ì‚ÅC³‚µ‚½ƒtƒ@ƒCƒ‹‚¾‚¯...Š¾
+Emapflag‚Énopenalty’ljÁBŽg—p•û–@‚Í
+ mapflag nopenalty dummy
+‚Å‚·B‹@”\‚Í‚»‚̃}ƒbƒv‚ÅŽ€‚ñ‚¾ŽžŒoŒ±‚ªŒ¸‚ç‚È‚¢‚悤‚É‚µ‚Ü‚·B
+Emapflag‚Épvp_nopartyApvp_noguildAgvgAgvg_noparty’ljÁB
+pvp_noparty‚ÍPVPƒ‚[ƒh‚Å“¯‚¶ƒp[ƒeƒB‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢Apvp_noguild‚ÍPVPƒ‚[ƒh‚Å“¯‚¶ƒMƒ‹ƒh‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢Agvg‚̓V[ƒYƒ‚[ƒh‚ÉAgvg_noparty‚̓V[ƒYƒ‚[ƒh‚Å“¯‚¶ƒp[ƒeƒB‚ÉUŒ‚‚ª“–‚½‚ç‚È‚¢•¨‚Å‚·B
+E‰Â“®‚µ‚Ä‚È‚¢ƒ^ƒCƒ}[‚Í‘S‚Ä-1‚É‚È‚é‚悤‚É•ÏXB
+E‚«”ò‚΂µˆ—C³B
+Eƒ}ƒbƒvƒ[ƒh’¼Œã‹CŒ÷‚ªŒ©‚¦‚È‚¢–â‘èC³B
+EŽc‰e‚̈—C³B
+Eƒ}ƒbƒv‚ðƒ[ƒh‚·‚é‚ÆŽ€‚ñ‚¾‚ӂ肪‰ðœ‚³‚ê‚é‚悤‚É•ÏXB
+EPVP‚ð­‚µ•ÏXB
+EŒÃ–Ø‚ÌŽ}‚Åo‚郂ƒ“ƒXƒ^[‚ðŽ©•ª‚̃Œƒxƒ‹‚æ‚è‚‚¢•¨‚Ío‚È‚¢‚悤‚É•ÏXB
+E‰Á‘¬ƒ|[ƒVƒ‡ƒ“‚Ìsc_start SC_SpeedPot0,1,0;‚ðsc_start SC_SpeedPot0,1800,0;‚̂悤‚É•ÏXBSC_SpeedPotH‚ÌŒã‚Ì”’l‚ÍŽ‘±ŽžŠÔ‚Å‚·B(’PˆÊ‚Í•b)
+E@ƒRƒ}ƒ“ƒh@pvp‚ð@pvpon‚É•ÏX‚Æ@pvpon‚Æ@pvpoffA@gat‚Ì‹@”\•ÏXB
+Ebattle_athena.conf‚ÌpvpíœB
+Ebattle_athena.conf‚Édeath_penalty_type’ljÁB
+Eƒyƒiƒ‹ƒeƒB‚Ì“K—p‚ðŽ€‚ñ‚¾Žž‚©‚玀‚ñ‚¾ŒãƒŠƒXƒ^[ƒg‚µ‚½Žž‚É•ÏXB(ƒŠƒU‚Å•œŠˆ‚·‚é‚ÆŒoŒ±‚ªŒ¸‚è‚Ü‚¹‚ñB–{ŽI‚ÌŽd—l‚ª‚©‚È‚è‹C‚É‚¢‚ç‚È‚©‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½B)
+EƒXƒNƒŠƒvƒgsetmapflagAremovemapflagApvponApvpoffAgvgonAgvgoff’ljÁB
+ setmapflag ƒ}ƒbƒv–¼Aƒ}ƒbƒvƒtƒ‰ƒOƒ^ƒCƒv
+ Žw’肵‚½ƒ}ƒbƒvƒtƒ‰ƒO‚ðon‚µ‚Ü‚·B(‚½‚¾pvpAgvg‚ÍpvponAgvgon‚Å‚Å‚«‚é‚Ì‚ÅŽw’肵‚Ä‚à“®ì‚µ‚Ü‚¹‚ñB‚ ‚Ænosave‚Ìꇈ—‚ª‚¿‚å‚Á‚Æ•¡ŽG‚É‚È‚é‚̂őΉž‚µ‚Ä‚Ü‚¹‚ñB)
+ removemapflag ƒ}ƒbƒv–¼Aƒ}ƒbƒvƒtƒ‰ƒOƒ^ƒCƒv
+ Žw’肵‚½ƒ}ƒbƒvƒtƒ‰ƒO‚ðoff‚µ‚Ü‚·B(‚½‚¾pvpAgvg‚ÍpvpoffAgvgoff‚Å‚Å‚«‚é‚Ì‚ÅŽw’肵‚Ä‚à“®ì‚µ‚Ü‚¹‚ñB‚±‚¿‚ç‚Ínosave‚à‰Â”\‚Å‚·B)
+ pvpon ƒ}ƒbƒv–¼
+ Žw’肵‚½ƒ}ƒbƒv‚ðPVPƒ‚[ƒh‚É‚µ‚Ü‚·B
+ pvpoff ƒ}ƒbƒv–¼
+ Žw’肵‚½ƒ}ƒbƒv‚ÌPVPƒ‚[ƒh‚ð‰ðœ‚µ‚Ü‚·B
+ gvgon ƒ}ƒbƒv–¼
+ Žw’肵‚½ƒ}ƒbƒv‚ðƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
+ gvgoff ƒ}ƒbƒv–¼
+ Žw’肵‚½ƒ}ƒbƒv‚̃V[ƒYƒ‚[ƒh‚ð‰ðœ‚µ‚Ü‚·B
+‚½‚¾‘S‚ẴXƒNƒŠƒvƒg‚Ì“®ì‚ÍŠm”F‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+EƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚̈—‚ð0529‚É–ß‚µ‚Ü‚µ‚½B
+Ž©•ª‚Ì’²¸‚ł̓Tƒ“ƒNƒ`ƒ…ƒAƒŠ‚Íl”‚̧ŒÀ‚ª‚ ‚è‚Ü‚·B(ƒŒƒxƒ‹1‚Å4–¼‚Å
+1ƒŒƒxƒ‹‚Ɉêl‚¸‚‘‚¦‚Ü‚·B)
+E‚»‚̌㭂µC³B(‚µ‚½‚Í‚¸...)
+ (db/)
+ const.txt C³B
+ item_db.txt C³B
+ (conf/)
+ battle_athena.conf C³B
+ (doc/)
+ conf_ref.txt C³B
+ (map/)
+ clif.hAclif.c C³B
+ mob.c C³B
+ pc.hApc.c C³B
+ skill.c C³B
+ pet.c C³B
+ npc.c C³B
+ map.hAmap.c C³B
+ battle.hAbattle.c C³B
+ atcommand.hAatcommand.c C³B
+ script.c C³B
+ makefile C³B
+
+--------------
+//0531 by Ž‚Žqo^.^o
+
+conf/npc_turtle.txt
+Dƒ^[ƒgƒ‹ƒAƒCƒ‰ƒ“ƒh‚És‚­ŽžAƒTˆêƒoˆê‚ð—Ž‚Á‚Ä–â‘èC³
+Dnpc_turtle.txt‚Ì508s–Ú
+set Zeny - 10000,0; --> set Zeny,Zeny-10000; C³
+
+--------------
+//0530 by RR
+EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚ÅUŒ‚‘ÎÛ‚ðƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚©‚ç•sŽ€‘®«/ˆ«–‚Ží‘°‚É•ÏX
+EƒXƒLƒ‹uƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€v‚ÅUŒ‚‘ÎÛ‚ðƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚©‚ç•sŽ€‘®«/ˆ«–‚Ží‘°‚É•ÏX
+EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚̉ñ•œ‰ñ”‚ðl”‚©‚çƒJƒEƒ“ƒg‚É•ÏX
+ skill.c
+ skill_unit_onplace()C³
+ skill_unit_onout()C³
+
+‘½•ª‚±‚ÌŽd—l‚Ň‚Á‚Ä‚é‚Í‚¸‚Å‚·cB
+
+--------------
+//0529 by ŒÓ’±—–
+
+EMOB‚ªƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg—p‚·‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éꇂª‚ ‚Á‚½–â‘è‚ðC³
+EƒXƒLƒ‹uƒTƒ“ƒNƒ`ƒ…ƒAƒŠv‚ÅUŒ‚‘ÎÛ‚ð•sŽ€‘®«‚©‚çƒAƒ“ƒfƒbƒg/ˆ«–‚Ží‘°‚É•ÏX
+
+ skill.c
+ skill_unit_onplace()C³
+ skill_castend_nodamage_id()C³
+
+EƒƒOƒCƒ“ƒT[ƒo[‚̃AƒJƒEƒ“ƒgƒf[ƒ^ƒx[ƒX•ÛŽçƒc[ƒ‹‚ð“Y•t
+ Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
+ Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
+ Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
+
+ “Á‚É——R‚ª–³‚¢ŒÀ‚èƒAƒJƒEƒ“ƒgì¬‚à‚±‚¿‚ç‚̃c[ƒ‹‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
+ addaccount‚̓pƒPƒbƒg‚Ì“s‡ãƒpƒXƒ[ƒh•¶Žš”‚̧ŒÀ‚ª‚«‚‚¢‚Ì‚ÅB
+
+ ƒAƒJƒEƒ“ƒg‚ð휂µ‚Ä‚àƒLƒƒƒ‰ƒNƒ^[ƒf[ƒ^A‘qŒÉƒf[ƒ^A
+ ‚»‚Ì‘¼‚̃AƒJƒEƒ“ƒgˆÈŠO‚̃f[ƒ^‚ÍÁ‚¦‚Ü‚¹‚ñB‘ŠŽè‚ªƒƒOƒCƒ“’†‚¾‚Á‚½ê‡
+ ‹­§Ø’f‚Í‚³‚ê‚Ü‚¹‚ñ‚ªAŽŸ‰ñ‚©‚ç‚̓ƒOƒCƒ“‚Å‚«‚È‚¢‚Í‚¸‚Å‚·B
+ i‚‚܂è‚ÍA’P‚Élogin-serverã‚̃AƒJƒEƒ“ƒg‚ðÁ‚µ‚Ä‚¢‚邾‚¯‚Å‚·j
+
+ (login/)
+ login.c
+ parse_admin()’ljÁAparse_login()C³
+ (doc/)
+ admin_packet.txt
+ V‹K’ljÁBŠÇ—ƒpƒPƒbƒgî•ñ
+ (tool/)
+ ladmin
+ login-server administration tool‚ÌPerlƒXƒNƒŠƒvƒg
+
+
+--------------
+//0528 by RR
+EƒXƒLƒ‹uƒq[ƒ‹v‚ðŽg—p‚µ‚½Û‚ɉñ•œ—Ê‚É”ä—Ⴕ‚½•ª‚¾‚¯ƒWƒ‡ƒuŒoŒ±’l‚ªŠl“¾‚Å‚«‚é‚悤‚É•ÏX
+E¤lŒnE‹Æ‚ª“XNPC‚ð—˜—p‚µ‚½Û‚ɃWƒ‡ƒuŒoŒ±’l‚ªŠl“¾‚Å‚«‚é‚悤‚É•ÏX
+E—¼•û‚Æ‚àbattle_athena.conf‚Å’²®‰Â”\‚É‚µ‚Ü‚µ‚½B‰ŠúÝ’è‚Í0”{i”ñ“K—pj
+Emap_athena.conf‚É‚Ä‚©‚Ú‚¿‚áƒNƒGƒXƒg‚Ì‚à‚Ì‚ª“ü‚Á‚Ä‚È‚©‚Á‚½‚̂ŃRƒƒ“ƒgƒAƒEƒg‚µ‚È‚ª‚ç’ljÁB
+
+ map_athena.conf
+
+ battle.c battle_config_read()
+ battle.h Battle_Config
+ battle_athena.conf
+ ˆÈãAbattle_athena.conf—˜—p‚½‚ß‚É•ÏX
+
+ pc.c pc_heal()
+ –ß‚è’l‚ðhp+sp‚ÉB–ß‚è’l‚ð—˜—p‚µ‚Ä‚é•”•ª‚ª‚È‚³‚»‚¤‚¾‚Á‚½‚Ì‚ÅŽg‚킹‚Ä–á‚¢‚Ü‚µ‚½BƒoƒO‚ª‹N‚«‚½‚ç‚·‚Ý‚Ü‚¹‚ñB
+
+ skill.c skill_casted_nodamage_id()‚̃q[ƒ‹•”‚ɂăWƒ‡ƒuŒoŒ±’lŠl“¾‚·‚é‚悤•ÏX
+
+ npc.c npc_buylist()
+ npc_selllist() •ÏX
+ ‚±‚ê‚ç‚Æ‚ÌŒ“‚ˇ‚¢‚Åskill.h‚ðincludeB
+
+
+¤l‚Ì“X—˜—pƒWƒ‡ƒuŒoŒ±’lŠl“¾‚Å‚·‚ªAŒvŽZŽ®‚Í‚Ü‚¾l‚¦’†‚Ȃ̂ʼn¼‚ÅB
+ŒvŽZŽ®‚̓AƒCƒeƒ€w“ü‚ª@‘ã‹à * ƒXƒLƒ‹ƒŒƒxƒ‹iƒfƒBƒXƒJƒEƒ“ƒgj/ ((1{300/ƒAƒCƒeƒ€ŒÂ”) * 4000)
+ƒAƒCƒeƒ€”„‹p‚ª@‘ã‹à * ƒXƒLƒ‹ƒŒƒxƒ‹iƒI[ƒo[ƒ`ƒƒ[ƒWj / ((1{500/ƒAƒCƒeƒ€ŒÂ”) * 4000)‚Å‚·B
+í‚É–î‚ð‚½‚­‚³‚ñˆê‚Éw“ü‚·‚邱‚Æ‚ÅŒoŒ±’l‚𑽗ʂɉ҂®‚±‚Æ‚ª‰Â”\‚Å‚·‚ËcB
+‚Ç‚È‚½‚©‚¢‚¢Ž®‚ðŽv‚¢‚‚¢‚½‚ç•ÏX‚¨Šè‚¢‚µ‚Ü‚·B
+
+‚Æ‚±‚ë‚Å“]ENPC‚ªˆê•”‚©‚Ô‚Á‚Ä‚é‚ñ‚Å‚·‚ªC³‚µ‚È‚¢‚Å‚¢‚¢‚ñ‚Å‚µ‚傤‚©H
+
+--------------
+//0527 by Ž€_
+
+E0526‚̃oƒOC³B(ƒeƒXƒg‚ׂ̈ɕς¦‚Ä‚¢‚½•¨‚ð“ü‚ꂽ‚܂܃Aƒbƒv‚µ‚Ä‚µ‚Ü‚Á‚½‚Ì‚ªŒ´ˆö‚Å‚µ‚½B)
+ skill.c C³B
+ pc.c C³B
+ mob.c C³B
+ clif.c C³B
+
+--------------
+//0526 by Ž€_
+
+E0525‚̃ŠƒUƒŒƒNƒVƒ‡ƒ“‚ðŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉŽg‚¦‚È‚¢ƒoƒOC³B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñ‚ªŽ¡‚Á‚½‚Í‚¸‚Å‚·B‘½•ª...)
+ skill.c C³B
+ clif.c C³B
+
+--------------
+//0525 by Ž€_
+
+Edmotion‚̊Ԃ̓Lƒƒƒ‰‚ª“®‚©‚È‚¢‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB)
+EƒƒeƒI‚̃_ƒ[ƒW•\Ž¦ƒ^ƒCƒ~ƒ“ƒOC³B(­‚µ’x‚¢‹C‚à‚µ‚Ü‚·‚ª...)
+EƒoƒbƒNƒXƒ‰ƒCƒfƒBƒ“ƒO‚ÌŽž‚Ƀ‚[ƒVƒ‡ƒ“‚ªo‚é‚悤‚É•ÏXB(ƒXƒLƒ‹Žg—pŒã
+0.2•bŒã‚ɃXƒLƒ‹Žg—pƒpƒPƒbƒg‚ð‘—‚é‚悤‚É•ÏX‚µ‚Ü‚µ‚½Bƒ‰ƒO“™‚É‚æ‚Á‚Ä•Ï‚È“®ì‚ð‚·‚é‰Â”\«‚à‚ ‚è‚Ü‚·B)
+E0524‚ÌC³B
+EƒnƒCƒfƒBƒ“ƒO‚µ‚Ä‚¢‚鎞Ž©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É•ÏXB
+E0519‚ÅŠÔˆá‚Á‚½conf‚ÌC³‚Æׂ©‚¢ŠC³B
+ map.h
+ struct map_session_data‚Ìcanmove_tick‚ðcanact_tick‚É•ÏXB
+ skillcanmove_tick‚ðcanmove_tick‚É•ÏXB
+ skill.c C³B
+ pc.c C³B
+ pc.h C³B
+ clif.c C³B
+ battle.c C³B
+ battle.h C³B
+ mob.c C³B
+ mob.h C³B
+ char_athena.conf C³B
+ map_athena.conf C³B
+
+--------------
+//0524 by huge
+
+Eƒ[ƒO ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒuŽÀ‘•
+ clif.c
+ clif_parse_WalkToXY()
+ pc.c
+ pc_calcstatus()
+
+ ‚Ç‚Ì‚­‚ç‚¢‘¬“xŒ¸­‚·‚é‚Ì‚©•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAŽb’è“I‚É
+ speed += speed * (20-ƒXƒLƒ‹ƒŒƒxƒ‹)/40
+ ‚ÆA‚µ‚Ü‚µ‚½B–{ŽIŽd—l‚ª•ª‚©‚é•û‹‚Ü‚µ‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·B
+
+--------------
+//0523 by NOCTURNE
+
+Enpc_event_rental.txt‚ɃNƒ‹ƒZƒCƒ_[—p‚̃yƒRƒyƒRŠÇ—•º‚ð’ljÁ
+--------------
+//0522 by ”g˜Q
+
+Emob_db.txt‚ðƒWƒ…ƒm[Œã‚̃f[ƒ^‚ÉC³
+
+--------------
+//0521 by ŒÓ’±—–
+
+EmapƒT[ƒo[‚ÉŒq‚ª‚ç‚È‚¢–â‘è‚ðC³
+ clif.c
+ clif_parse()‚ÌC³
+
+--------------
+//0520 by ŒÓ’±—–
+
+EcharƒT[ƒo[ƒƒO‚Ìuset map X.Y HOGE.gatv‚ª•\Ž¦‚³‚ê‚È‚­‚È‚è‚Ü‚µ‚½
+ •Ï‚í‚è‚ÉAuset map M from XX.YY.ZZ.WW:PP (CC maps)v
+ ‚Æ‚¢‚¤‚Ó‚¤‚ɉ½ŒÂ‚̃}ƒbƒv‚ðƒZƒbƒg‚µ‚½‚©‚¾‚¯‚ð•\Ž¦‚·‚é‚悤‚É‚È‚è‚Ü‚·B
+
+ char/char.c
+ parse_frommapC³
+
+E•¡”mapƒT[ƒo[‚ɉ¼‘Ήž
+ ENPC‚̃}ƒbƒvƒT[ƒo[•Ï”‚ÍŽIŠÔ‚Å‚Í‹¤—L‚³‚ê‚Ü‚¹‚ñB‹¤—L‚·‚ׂ«•Ï”‚ð
+ Ž‚ÂNPC‚ª‚¢‚éƒ}ƒbƒv“¯Žm‚Í“¯‚¶mapƒT[ƒo[‚Å“®‚©‚·‚ׂ«‚Å‚·B
+ ‚¨‚»‚ç‚­PC‚̃Oƒ[ƒoƒ‹•Ï”‚Í‹¤—L‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·(–¢ƒeƒXƒg)
+ EŽb’è“I‚É“®‚­‚悤‚É‚µ‚½‚¾‚¯‚È‚Ì‚ÅA•s“s‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ “Á‚ÉAƒp[ƒeƒB/ƒMƒ‹ƒh/‘qŒÉ/ƒyƒbƒg/Wis‚È‚Ç‚ÌinterƒT[ƒo[‚ðŽg‚¤‹@”\‚ª
+ ³‚µ‚­ì“®‚·‚é‚©‘S‚­ƒ`ƒFƒbƒN‚µ‚Ä‚¢‚Ü‚¹‚ñB
+ Eurecv map on XX.YY.ZZ.WW:PP (CC maps)v‚Æ‚¢‚¤ƒƒO‚ª•\Ž¦‚³‚ê‚Ü‚·B
+ ‚±‚ê‚Í‘¼‚ÌmapƒT[ƒo[‚ª’S“–‚·‚éƒ}ƒbƒv‚̃ŠƒXƒg‚ªA‚±‚ÌmapƒT[ƒo[‚É
+ ³í‚ÉŽóM‚³‚ꂽ‚Æ‚¢‚¤ˆÓ–¡‚Å‚·B
+
+ (char/)
+ char.c/char.h
+ parse_frommap()C³
+ mapif_sendallwos()’ljÁ
+ (map/)
+ map.c/map.h
+ map_setipport()‚ðC³
+ struct map_session_data‚Ìstateƒƒ“ƒo‚Éwaitingdisconnect’ljÁ
+ chrif.c/chrif.h
+ FX’ljÁ
+ clif.c
+ waitingdisconnect‚ª‚P‚È‚çƒpƒPƒbƒg‚𖳎‹‚·‚é‚悤‚É‚µ‚½
+ pc.c
+ pc_setpos()C³iƒ}ƒbƒvƒT[ƒo[•ÏXˆ—‚È‚Çj
+ pc_setnewpc()C³
+
+--------------
+//0519 by Ž€_
+
+EƒT[ƒo[snapshot‚ÆFXC³B
+EŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉUŒ‚‚ª“–‚½‚éƒoƒOC³B(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©•ñ‚¨Šè‚¢‚µ‚Ü‚·B)
+E0517‚̃AƒCƒXƒEƒH[ƒ‹‚̈—‚ð­‚µ•ÏXB
+EƒƒeƒI‚ðƒ‚ƒ“ƒXƒ^[‚àŽg‚¦‚é‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñB•ñ‚¨Šè‚¢‚µ‚Ü‚·B) ‚Å‚à‚¿‚å‚Á‚ƃƒ‚ƒŠ[‚ÌŽg—p—Ê‚ª‘‚¦‚Ü‚µ‚½B(–ñ10M’öオ‚é‚悤‚Å‚·B)
+Eƒ{ƒX‚ÌŽæ‚芪‚«‚ªƒ{ƒX‚ƈê‚És“®‚·‚é‚悤‚É•ÏXB(ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚Ç‚ñ‚È“®‚«‚ð‚·‚é‚©‚ÍŠm”F‚µ‚Ä‚Ü‚¹‚ñBUŒ‚‚àŽó‚¯‚Ä‚È‚¢‚̂Ƀ{ƒX‚ׂ̗©‚矎è‚É—£‚ê‚é‚©‚Ç‚¤‚©‚ÌŠm”F‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
+E‚»‚Ì‘¼×‚©‚¢•¨C³B
+ client-packet.txt C³B
+ map.h
+ AREA_SIZE‚ð15‚©‚ç20‚É•ÏXB
+ struct map_session_dataAstruct mob_dataAstruct skill_timerskill C³B
+ map.c
+ map_quit() C³B
+ clif.h
+ clif_changemapcell() C³B
+ clif.c
+ clif_getareachar_skillunit()Aclif_clearchar_skillunit()Aclif_changemapcell() C³B
+ skill.c
+ skill_unitsetting()Askill_unit_onlimit()Askill_castend_pos2() C³B
+ skill_castend_nodamage_id()Askill_check_condition()Askill_attack() C³B
+ skill_timerskill()Askill_addtimerskill()Askill_cleartimerskill() C³B
+ ‚»‚Ì‘¼­‚µC³B
+ skill.h
+ skill_addtimerskill()Askill_cleartimerskill() C³B
+ pc.c
+ pc_movepos()Apc_walk()Apc_authok() C³B
+ mob.c
+ mob_spawn_dataset()Amob_spawn() C³B
+ mob_changestate()Amob_damage() C³B
+ mob_ai_sub_hard_mastersearch()Amob_ai_sub_hard() C³B
+ ‚»‚Ì‘¼­‚µC³B
+ battle.c
+ battle_calc_weapon_attack()Abattle_weapon_attack() C³B
+ ‚»‚Ì‘¼­‚µC³B
+
+--------------
+//0518 by Kalen
+EEvent_pumpkinŠÖ˜A‚̃tƒ‰ƒO•s‹ï‡C³
+
+--------------
+//0517 by Ž€_
+
+EƒAƒCƒXƒEƒH[ƒ‹‚Å ‚蔲‚é–â‘èC³‚Æ­‚µC³B(M‚³‚ñƒpƒPƒbƒg‚Ì’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B)
+ clif.h
+ clif_changemapcell() ’ljÁB
+ clif.c
+ clif_changemapcell() ’ljÁB
+ skill.h
+ SC_STEELBODY‚ð84‚©‚ç87‚É•ÏXB
+ skill.c
+ skill_unitsetting()Askill_unit_onlimit() C³B
+ skill_status_change_end()Askill_status_change_start() C³B
+ client_packet.txt C³B
+
+--------------
+//0516 by Ž€_
+
+Eƒ‚ƒ“ƒXƒ^[‚̃ƒeƒI‚É‚æ‚éŽIƒ_ƒEƒ“‚ð—ÕŽž‚É–h‚¢‚Å’u‚«‚Ü‚µ‚½B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB) ƒ‚ƒ“ƒXƒ^[‚̃XƒLƒ‹‚ɂ‚¢‚Ä‚¿‚å‚Á‚Æ•ªÍ•s‘«‚Å‚·‚Ì‚Å•ªÍ‚µ‚½Œã‚ÉC³‚µ‚Ä’u‚«‚Ü‚·B
+EƒXƒLƒ‹Žw’e‚ÌŽd—l‚ðbattle_athena.conf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB(0515‚Ì•¨‚ª‚¿‚å‚Á‚Æ‚à‚Á‚½‚¢‚È‚©‚Á‚½‚Ì‚Å...)
+ skill.c
+ skill_castend_pos2() C³B
+ battlc.hAbattle.c
+ battle_config‚Éfinger_offencive_type ’ljÁB
+ battle_calc_weapon_attack() C³B
+ battle_athena.conf C³B
+ conf_ref.txt C³B
+
+--------------
+//0515 by Ž€_
+
+EƒXƒLƒ‹ƒƒeƒI‚ÆŽw’eC³‚ƃpƒPƒbƒgC³A0512‚Ì—Ž‚Æ‚µ•¨C³‚Æ­‚µ‚¾‚¯‚ÌŽd—l•ÏX‚Å‚·B
+EŽw’e‚Ìê‡à–¾‚ðŒ©‚Ä‚±‚ñ‚ÈŠ´‚¶‚©‚È‚ÆŽv‚Á‚Äì‚Á‚½•¨‚Å‚·BˆÈ‘O‚Ì•¨‚ª–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚Ȃ猳‚É–ß‚µ‚Ü‚·B
+EƒƒeƒI‚Ì1”­‚͈̔͂Í5*5ƒZƒ‹(range = 2)‚Å‚·B
+EƒAƒCƒeƒ€Žg—pƒpƒPƒbƒg‚ðV‚µ‚¢•¨‚É•ÏX‚µ‚½‚ªƒGƒtƒFƒNƒg‚ªo‚È‚¢•¨‚Ío‚È‚¢‚悤‚Å‚·B(FXƒGƒtƒFƒNƒg‚ª“ü‚Á‚Ä‚¢‚é‚Ý‚½‚¢‚¾‚©‚çŒã‚ÍŽg‚Á‚ÄŠm”F‚Å‚·‚¯‚Ç‚ËB)
+E0512‚Åhitrate‚ª10000ˆÈã‚Å•K’†‚Å‚Í‚È‚­100000ˆÈã‚Å•K’†‚Å‚·‚̂ŃR[ƒh‚ÌC³‚Ì‚³‚¢‚É‚Í‹C‚ð‚Á‚‚¯‚Ä‚­‚¾‚³‚¢B
+Ebattle_athena‚Éݒ肳‚ê‚Ä‚¢‚é•Ší‚Ì»‘¢—¦‚ƃyƒbƒg‚̕ߊlŠm—¦‚ÌŒvŽZ•û–@‚ð­‚µ•Ï‚¦‚Ü‚µ‚½B(‹C‚É‚·‚é•K—v‚à‚È‚¢•¨‚Å‚·‚¯‚Ç‚ËB)
+ skill.h
+ skill_addtimerskill()Askill_cleartimerskill ’ljÁB
+ skill.c
+ skill_attack() fixAskill_use_id()Askill_use_pos() C³B
+ skill_castend_damage_id()Askill_castend_nodamage_id() C³B
+ skill_timerskill()Askill_addtimerskill()Askill_cleartimerskill ’ljÁB
+ skill_castcancel()Askill_castend_pos2()Askill_unitsetting() C³B
+ skill_produce_mix()Ado_init_skill() C³B
+ mob.c
+ mob_damage() C³B
+ battle.c
+ battle_calc_weapon_attack() C³B
+ map.h
+ struct skill_timerskill ’ljÁB
+ struct map_session_data C³B
+ map.c
+ map_quit() C³B
+ pc.c
+ pc_authok() C³B
+ pc_damage() C³B
+ clif.c
+ clif_parse_WalkToXY() C³B
+ clif_useitemack() C³B(Ž‘—¿’ñ‹Ÿ: Kalen‚³‚ñ)
+ pet.c
+ pet_catch_process2() C³B
+ skill_db.txt
+ ‹CŒ÷‚ÌSP‚ð10‚É•ÏXB(ƒlƒbƒg‚ÌŒŸõ‚Å‚Í10‚¾‚Á‚½‚Ì‚Å•ÏX‚µ‚Ü‚µ‚½BŠØ‘‘ ‚Å‚Í15‚Æ•\Ž¦‚³‚ê‚Ü‚·‚ª...)
+ client_packet.txt
+ 01c8‚Ì•ÏX‚Å‚·BKalen‚³‚ñî•ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B
+
+--------------
+//0514 by Kalen
+
+EscriptC³+’ljÁ
+
+ conf/npc_event_pumpkin.txt (V‹K)ƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg
+ conf/npc_town_guide.txt (C³)Juno‚Ìu+vƒAƒCƒRƒ“ƒJƒ‰[C³
+ conf/npc_town_lutie.txt (ˆê•”’ljÁ)ƒJƒ{ƒ`ƒƒƒCƒxƒ“ƒg‚ɉe‹¿‚·‚éNPC‚̉ï˜b’ljÁ
+
+--------------
+//0513 by RR
+
+E“]EŽž‚É‘•”õ‚ª‘S‚ÄŠO‚ê‚é‚悤‚É‚µ‚Ü‚µ‚½BŠÖ”ˆÊ’u‚Ì•ÏX‚µ‚Ä‚È‚¢‚Ì‚ÅA‚Ђå‚Á‚Æ‚µ‚½‚炨‚©‚µ‚­‚È‚Á‚Ä‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB‚¤‚¿‚̊‹«(win2k cygwin)‚Å‚Í•½‹C‚Å‚µ‚½‚Ì‚Å‚»‚Ì‚Ü‚Ü‚É‚µ‚Ä‚ ‚è‚Ü‚·BB
+Eƒm[ƒrƒXŽž‚ÌŽ€–S‚Å‚ÍAÅ‘åHP‚Ì‚Q•ª‚Ì‚P‚Å•œŠˆ‚Å‚«‚é‚悤C³B(ƒXƒLƒ‹‚É‚æ‚é•œŠˆ‚Í–¢Šm”F)
+EƒfƒXƒyƒiƒ‹ƒeƒB‚É‚æ‚éŒoŒ±’lŒ¸­‚ð’ljÁBbattle_athena.conf‚É‚ÄAŒ¸­—¦‚ð•ÏX‚Å‚«‚é‚悤‚ÉÝ’èBŒ¸‚éŒoŒ±’l‚ͬ”“_ˆÈ‰ºØ‚èŽÌ‚Ä‚È‚Ì‚ÅA•K—vŒoŒ±’l‚ª’á‚¢‚¤‚¿‚É‚Í‚¿‚傤‚Ç‚»‚Ì“•ªˆø‚©‚ê‚é‚Æ‚¢‚¤•—‚É‚Í‚È‚è‚Ü‚¹‚ñB
+ battle.h
+ Battle_Config‚Édeath_penalty_base‚Ædeath_penalty_job‚ð’ljÁB
+ battle.c
+ battle_config_read‚Ådeath_penalty_base‚Ædeath_penalty_job‚ð“ǂނ悤‚ÉC³B
+ pc.c
+ pc_makesavestatus() C³B
+ pc_damege() C³B
+ pc_jobchange() C³B
+ battle_athena.conf
+ death_penalty_base,death_penalty_job’ljÁB
+
+--------------
+//0512 by Ž€_
+
+E–â‘è‚É‚È‚è‚»‚¤‚È•”•ª‚ÌC³‚ÆV‚µ‚¢ƒpƒPƒbƒg‚̑Ήž‚ªƒƒCƒ“‚Å‚·BŒãƒoƒO‚à­‚µŽ¡‚µ‚Ü‚µ‚½B(“®‚¯‚È‚¢ó‘ÔˆÙí‚É‚È‚Á‚Ä‚à“®‚­–â‘è‚ÌC³“™‚Å‚·B)
+ athena.sh C³B(‚¢‚‚àŽI‚ðŒÂ•Ê‚ÉŽÀs‚µ‚Ä‚¢‚½‚Ì‚Å‹C‚ª‚‚«‚Ü‚¹‚ñ‚Å‚µ‚½B)
+ makefile
+ DPACKETVER‚ð2‚©‚ç3 ‚ÉC³BƒWƒ…[ƒmˆÈŒã‚Ì‘ ‚ðŽg‚¤‚Ì‚È‚ç3‚É‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B(‚»‚̈ȑO‚È‚ç2‚©1)
+ clif.c
+ DPACKETVER=3‚ɑΉž(¡‚ÌŠ0x114‚ð0x1de‚É•ÏŠ·‚Æ0x11f‚ð01c9‚É•ÏŠ·‚·‚é‚̂ݑΉž)
+ clif_skill_damage3() íœB
+ clif_skillcastcancel() ’ljÁB
+ clif_skill_damage()Aclif_getareachar_skillunit()Aclif_skill_setunit() C³B
+ clif_fixmobpos()Aclif_fixpetpos()Aclif_fixpcpos() C³B
+ ‘¼‚É­‚µC³B
+ clif.h
+ clif_skill_damage3() íœB
+ clif_skillcastcancel() ’ljÁB
+ battle.c
+ battle_calc_weapon_attack() C³B
+ hitrate‚ð10000ˆÈã‚É‚·‚ê‚ΕK’†‚É‚È‚é‚悤‚É•ÏXB(¡‚ÌŽd—l‚ł̓‚ƒ“ƒXƒ^[‚Ì•K’†UŒ‚ˆÈŠO‚Í•K’†‚É‚È‚è‚Ü‚¹‚ñB)
+ ‘¼‚É­‚µC³B
+ client_packet.txt
+ V‚µ‚¢ƒpƒPƒbƒgî•ñ’ljÁB
+ pc.c
+ pc_spiritball_timer()Apc_delspiritball() C³B
+ pc_damage()Apc_skill() C³B
+ skill.h
+ SC_EXPLOSIONSPIRITS‚ð89‚©‚ç86‚É•ÏXB(86 = 0x56)
+ SC_DELUGE‚ð86‚©‚ç89‚É•ÏXB
+ skill.c
+ skill_castcancel()Askill_use_id()Askill_use_pos() C³B
+ skill_check_condition() C³B
+ skill_castend_damage_id()Askill_castend_nodamage_id C³B
+ skill_status_change_end()Askill_status_change_start() C³B
+ skill_db.txt
+ ‹CŒ÷‚ÌÁ”ïSP‚ðC³B(‘O‚Ì15‚ª–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚Ý‚½‚¢‚Å‚·‚Ì‚Å...)
+ mob.c
+ mobskill_use_id()Amobskill_use_pos() C³B
+ map.c
+ map_quit() C³B
+ atcommand.h
+ atcommand.c
+ @ƒRƒ}ƒ“ƒh@spiritball’ljÁB(‹@”\‚ÍŽg‚¦‚΂킩‚è‚Ü‚·B‚½‚¾1000ˆÈã‚Í“ü‚ê‚È‚¢•û‚ª‚¢‚¢‚Å‚·B‘ ‚ªƒpƒ“ƒN‚µ‚Ü‚·‚Ì‚Å...)
+ atcommand_athena.conf
+ C³B
+ conf_ref.txt
+ C³B
+E0x196ƒpƒPƒbƒg‚ÉV‚µ‚¢•¨‚ª’ljÁ‚³‚ê‚Ä‚¢‚é‚Ì‚Åó‘ԕω»‚É’¼Ú‚ÉŠÖŒW‚È‚¢SC_xxxx‚̔Ԇ‚ð’²®‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B(¡‚ÍSC_EXPLOSIONSPIRITS‚É‚¾‚¯‘Ήž‚µ‚Ü‚µ‚½B) ‚»‚ê‚Æskill_status_change_end()Askill_status_change_start()‚Åclif_status_change()‚ðŒÄ‚Ôtype‚͈̔͂ª64(0x40)–¢–ž‚É‚È‚Á‚Ä‚¢‚邪‚»‚ê‚à’ljÁ‚³‚ê‚Ä‚¢‚镨‚ɇ‚킹‚ÄC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚·‚ª’ljÁ‚³‚ê‚Ä‚¢‚镨‚ª‘S‚Ä‚í‚©‚Á‚½‚킯‚Å‚à‚È‚¢‚Ì‚ÅSC_EXPLOSIONSPIRITS‚É‚¾‚¯‘Ήž‚µ‚Ü‚µ‚½B¡“x‚©‚ç‚Í”š—ô”g“®‚̉𜂪³Šm‚ÉŒ©‚¦‚Ü‚·B‹à„‚̓f[ƒ^‚ðŒ©‚Â‚¯‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B
+¦V‚µ‚¢ƒpƒPƒbƒg‚ɑΉž‚·‚éì‹Æ‚ð‚µ‚Ä‚¢‚Ü‚·‚ªî•ñ‚ª•s‘«‚Å‚·B
+ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚âƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚̃GƒtƒFƒNƒg‚ªo‚é‚悤‚É‚·‚éˆ×‚É01c8‚ðŽg‚Á‚Ä‚Ý‚Ü‚µ‚½‚ª‘Ê–Ú‚Å‚µ‚½Bclient_packet.txt‚̃f[ƒ^‚ł͉½‚à‹N‚±‚ç‚È‚¢‚̂ʼn½•û‚ª–{ŽI‚ŃCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚âƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ðŽg‚Á‚½Žž‚̃pƒPƒbƒg‚ð’ñ‹Ÿ‚µ‚Ä‚­‚ê‚Ü‚¹‚ñ‚©HS 00a7‚ÌŒã00a8‚ª—ˆ‚é‚Ì‚©‚»‚ê‚Æ‚à01c8‚ª—ˆ‚é‚Ì‚©‚ÌŠm”F‚Æ00a8‚ÌŒã‚É01c8‚ª—ˆ‚é‚Ì‚©‚ÌŠm”F‚ª‚Å‚«‚ê‚Ή½‚Æ‚©‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª...
+‚»‚ê‚Æ01c9‚ÌŒã‚É—ˆ‚é?.81b‚ª‚í‚©‚ê‚΃AƒCƒXƒEƒH[ƒ‹‚ð ‚蔲‚é–â‘è‚à‰ðŒˆ‚Å‚«‚é‚ÆŽv‚¢‚Ü‚·‚ª...
+î•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+
+--------------
+//0511 by Diex
+
+EŽw’e‚ÌUŒ‚‰ñ”C³B
+Eˆ¢C—…”e–PŒA”­™¤‚ªC—û‚𖳎‹‚µA–³‘®«‚É‚È‚é‚悤‚ÉC³B
+E‹à„Žg—pŽžAMDEF‚ª³‚µ‚­•\Ž¦‚³‚ê‚Ä‚È‚©‚Á‚½ƒoƒO‚ðC³B
+E‹CŒ÷‚ÌÁ”ïSP‚ðC³B
+ pc.c
+ pc_calcstatus() C³B
+ battle.c
+ battle_calc_weapon_attack() C³B
+ skill.c
+ skill_check_condition() C³B
+
+ skill_db.txt C³B
+
+--------------
+//0510 by Diex
+
+EŽO’i¶‚Ì•\Ž¦ƒoƒOC³
+EŽw’e‚ª‹C’e‚ª–³‚­‚Ä‚àŒ‚‚Ä‚éƒoƒO‚ðC³
+ map.h
+ struct map_session_data‚Éspiritball_old•Ï”’ljÁB
+ skill.c
+ skill_check_condition() C³B
+ clif.c
+ clif_skill_damage3() C³B
+ battle.c
+ battle_weapon_attack()Abattle_calc_weapon_attack C³B
+
+--------------
+//0509 by
+
+Enpc_warp.txt
+ ƒvƒé¨ƒvƒƒtƒB[ƒ‹ƒh‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðA
+ ƒvƒé¨ƒ”ƒ@ƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚ÉC³B
+ ƒvƒƒtƒB[ƒ‹ƒh¨ƒvƒé‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðƒvƒƒtƒB[ƒ‹ƒh¨ƒ”ƒ@ƒ‹ƒLƒŠ[ƒŒƒ‹ƒ€‚ÉC³
+
+--------------
+//0508 by Ž€_
+
+EƒoƒOC³‚Æ‘§A‹CŒ÷A‹C’D‚ÌC³‚ªƒƒCƒ“‚Å‚·B(¡“x‚©‚ç‚Í‘¼‚Ìl‚É‚à‹C‚ª‚¿‚á‚ñ‚ÆŒ©‚¦‚Ü‚·B)
+EŽ€‚ñ‚¾ƒLƒƒƒ‰‚ÉŒoŒ±’l‚ª“ü‚é–â‘èC³B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB‚Ç‚¤‚È‚Ì‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B)
+ pc.h
+ pc_addspiritball()Apc_delspiritball() ’ljÁB
+ pc_is50overweight() C³B
+ pc.c
+ pc_gainexp() C³B
+ pc_insert_card()Apc_item_identify() C³B(‘債‚½C³‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª...)
+ pc_authok() C³B
+ pc_addspiritball()Apc_delspiritball() ’ljÁB
+ pc_spiritball_timer() ’ljÁB
+ do_init_pc()Apc_calcstatus()C³B
+ pc_spirit_heal() ’ljÁB
+ pc_natural_heal()‚ÉŠÖ‚í‚镨‚ÌC³B
+ map.h
+ struct map_session_data C³B
+ map.c
+ map_quit() C³B
+ map_addflooritem() C³B
+ clif.h
+ clif_spiritball_int()‚ðclif_spiritball()‚É•ÏXB
+ clif_spiritball_ext() íœB
+ clif.c
+ clif_spiritball_int() ‚ðclif_spiritball()‚É•Ï‚¦‚ÄC³B
+ clif_spiritball_ext() íœB
+ clif_set01e1() ’ljÁB
+ clif_getareachar_pc() C³B
+ skill.h
+ SC_CALLSPIRITS íœB
+ skill.c
+ SC_CALLSPIRITS íœB
+ skill_castend_nodamage_id()Askill_check_condition() C³B
+ skill_status_change_start() C³B
+E°‚É—Ž‚¿‚½ƒAƒCƒeƒ€‚ªÁ‚¦‚é‚Ü‚Å‚ÌŽžŠÔ‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB
+ battle.hAbattle.c
+ battle_config_read() C³B
+ conf_ref.txt C³B
+ battle_athena.conf C³B
+
+--------------
+//0507 by Diex
+0505‚ÌC³
+EŽO’i¶‚̃GƒtƒFƒNƒgŽÀ‘•
+
+--------------
+//0506 by hoenny
+‘S‘Ì“I‚É­‚µŽ®C³
+ƒZƒCƒW‚̃XƒLƒ‹‚ªƒAƒCƒeƒ€‚ðÁ–Õ‚·‚é‚悤‚ÉC³
+(ƒXƒLƒ‹‚ÌDB‚É zeny, spiritball, item, equip‚ð“ü‚ꂽ‚¢‚ªŽžŠÔ‚ª‚È‚­‚Ä—ÕŽž“I‚É ...)
+
+--------------
+//0505 by Diex
+
+Eˆ¢C—…”e–PŒ‚̃_ƒ[ƒWC³
+E–Ò—´Œ‚̃_ƒ[ƒWC³
+EŽw’eŽÀ‘•
+E”­™¤ŽÀ‘•
+E‹à„‚ªŒ¸ŽZDEF‚ÆŒ¸ŽZMDEF‚ª90‚ɌŒ肳‚ê‚Ä‚¢‚½‚Ì‚ðæŽZDEF‚ÆæŽZMDEF‚ª90‚É‚È‚é‚悤‚ÉC³
+EŽO’i¶ŽÀ‘•i‚½‚¾‚µƒRƒ“ƒ{‚Í–¢ŽÀ‘•j
+ map/clif.c
+ map/clif.h
+ clif_skill_damage3()’ljÁ
+ map/pc.c
+ map/skill.c
+ map/battle.c
+ C³E‹y‚ђljÁ
+iŒvŽZŽ®‚Í+ Acolyte Maniax +‚ðŽQl‚É‚µ‚Ü‚µ‚½Bj
+
+--------------
+//0504 by Ž€_
+
+Eatcommand.c C³B(‚½‚Á‚½2•¶Žš‚ð’ljÁ‚µ‚½‚¾‚¯‚Å‚·B)
+atcommnad_gm_only‚ªno‚¶‚á‚È‚­‚Ä‚àŽg—pƒŒƒxƒ‹Ý’è‚ð0‚É‚µ‚½ƒRƒ}ƒ“ƒh‚ÍGM‚¶‚á‚È‚¢ƒLƒƒƒ‰‚Å‚àŽg‚¦‚Ü‚·BƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB
+
+--------------
+//0503 by nabe
+
+E¸˜BC³‚ÆLinux—p‚É‚¿‚å‚Á‚Æ•ÏX‚È‚Ç
+ conf/map_athena.conf
+ npc_event_doll.txt,
+ npc_turtle.txt,
+ //npc_pota.txt€–ڒljÁ
+ conf/npc_pota.txt’ljÁisocie‚³‚ñì‚̃_ƒ“ƒWƒ‡ƒ“ƒ|ƒ^Žq‚³‚ñj
+ conf/npc_shop.txt
+ ƒCƒYƒ‹[ƒh•Ší¤l‚̉¿ŠiC³
+ conf/script_athena.conf
+ 0499‚Å‚Ì•¶Žš‰»‚¯HC³
+ login/login.c
+ #include <time.h>’ljÁ
+ map/script.c
+ buildin_getequipname()
+ ¸˜Bƒƒjƒ…[‚Ìmalloc‚ðC³
+ buildin_getequipisenableref()
+ ¸˜B‰Â”\ðŒC³iAthefans‚³‚ñ‚ÌðŒ•¶‚É‚µ‚Ä‚Ý‚Ü‚µ‚½j
+ map/skill.c
+ skill_check_condition()•Ï”錾ˆÊ’u‚Ì•ÏX‚Ì‚Ý
+
+--------------
+//0502 by Ž€_
+
+EƒJƒvƒ‰‚Ì‘qŒÉ‚àbattle_athena.conf‚Ìbasic_skill_check‚É‚æ‚Á‚ÄŠî–{ƒXƒLƒ‹‚ª‘«‚è‚È‚­‚Ä‚àŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚ÉC³‚µ‚Ü‚µ‚½B(ƒvƒƒ“ƒeƒ‰’†‰›‚̃Jƒvƒ‰‚Ì‚ÝŠm”FB)
+EƒNƒFƒXƒgƒXƒLƒ‹‚̎擾‚Í0492‚Ì‚¹‚¢‚Å‚·B0481‚Éskill‚ÌŌオ,2‚¶‚á‚È‚­,0‚¾‚Æ‘‚¢‚½‚Ì‚Å‚·‚ª‰½ŒÌ‚©0492‚Å,2‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Å,0‚ÉC³‚µ‚Ü‚µ‚½B
+EƒXƒNƒŠƒvƒggetbaseskillcheck‚ðbaseskillcheck‚É•ÏX‚ÆŽ©•ª‚ÅC³‚µ‚Ü‚µ‚½‚ª–½—ß‚ÌŒã‚É‚È‚ñ‚Ì”’l‚à“ü‚ç‚È‚¢ê‡‚̓XƒNƒŠƒvƒg‚ª³‚µ‚­ì“®‚µ‚È‚©‚Á‚½‚Ì‚ÅŽg—p‚·‚éꇂÍbaseskillcheck(0)‚É‚µ‚ÄŽg‚í‚È‚¢‚Ƴ‚µ‚¢Œ‹‰Ê‚𓾂邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB
+(Ú‚µ‚­‚Ínpc_town_kafra.txtŽQÆB)
+ npc_event_skillget.txt C³B
+ npc_town_kafra.txt C³B
+ script.c C³B
+EGM_account.txt‚ÉŽ©•ª‚ªƒeƒXƒg‚ׂ̈Ɏg‚Á‚Ä‚¢‚½500000‚ª“ü‚Á‚Ä‚¢‚½‚Ì‚Å휂µ‚Ü‚µ‚½B(GM_account.txtì‚Á‚½——R‚ÍŽ©•ªŸŽè‚ɃAƒJƒEƒ“ƒg‚ðGM‚É‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚·‚éˆ×‚Å‚·B‚‚܂èGM‚Æ‚µ‚Ä•\Ž¦‚³‚ê‚È‚­‚Ä‚àGM‚Æ‚µ‚ÄF‚ñ‚ÈŒ ŒÀ‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B‚³‚·‚ª‚ÉGMê—p‚̉EƒNƒŠƒbƒNƒRƒ}ƒ“ƒh‚ÍŽg‚¦‚Ü‚¹‚ñ‚ª... ‚Å‚à‚±‚ê‚ðŠˆ—p‚µ‚Ä‚¢‚é•û‚Í‚¢‚È‚¢‚Ý‚½‚¢‚È‚ñ‚Å‚·‚Ë...)
+
+--------------
+//0501 by hoenny
+
+E500‚Ì–â‘è“_C³
+-HP‰ñ•œ—ÍŒüã,SP‰ñ•œ—ÍŒüã
+ map/pc.c
+ pc_natural_heal_hp()C³
+ pc_natural_heal_sp()C³
+
+500SP‰ñ•œ—ÍŒüã
+--------------
+//0500 by hoenny
+
+EC“¹‘m‚Ì‘§ŽÀ‘•
+-Šî–{“I‚ÉÀ‚Á‚½Žž 10•b‚²‚Ƃɉñ•œ‚µ‚Ü‚·.
+-ŠŽ—Ê‚ª 50%‚ðƒI[ƒo[‚µ‚½ê‡ 20•b‚²‚Ƃɉñ•œ‚µ‚Ü‚·.
+EC“¹‘m‚Ì‹C’DŽÀ‘•
+-‘¼‚ÌC“¹‘m‚ÌŸ†‹…‚à‹zŽû‚ª‰Â”\‚Å‚·.
+EC“¹‘m‚Ì‹à„ŽÀ‘•
+-‹à„ó‘Ô‚Å‚Í‚·‚ׂẴAƒNƒeƒBƒuƒXƒLƒ‹‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚È‚¢‚Å‚·.
+ db/skill_db.txt
+ ‹C’DC³
+ ‹à„C³
+ map/pc.h
+ pc_is50overweight()’ljÁ
+ pc_is90overweight()’ljÁ
+ map/pc.c
+ pc_calcstatus()C³
+ pc_spheal()C³
+ pc_hpheal()C³
+ pc_natural_heal_hp()C³
+ pc_natural_heal_sp()C³
+ pc_natural_heal_sub()C³
+ map/skill.c
+ skill_check_condition()C³
+ skill_castend_nodamage_id()C³
+ skill_status_change_start()C³
+
+--------------
+//0499 by Ž€_
+
+EƒT[ƒo[snapshot‚ƃoƒOC³B
+EƒXƒeƒB[ƒ‹ƒRƒCƒ“‚̃[ƒj—Ê‚ðƒ‚ƒ“ƒXƒ^[ƒŒƒxƒ‹*10 + rand(100)‚É•ÏXB
+EƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚ª‚È‚¢ƒXƒLƒ‹‚̓^ƒCƒ}[‚ðŽg‚í‚È‚¢‚悤‚É•ÏXB
+EƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ð–h‚®ˆ×‚ÉC³B(¡“x‚±‚»Ž¡‚Á‚½‚Í‚¸...) ‚»‚µ‚ÄŠg‘勾‚à“¯‚¶‚悤‚È‚±‚Æ‚ª‚Å‚«‚é‚Ì‚ÅC³B(‚±‚ê‚ÍŽIƒ_ƒEƒ“‚Ü‚Å‚Í‹N‚±‚³‚È‚¢‚悤‚Å‚·‚ª...)
+EƒLƒƒƒ‰‚Ƀ}ƒbƒv‚̃[ƒh‚ªI‚í‚é‚܂Ńyƒbƒg‚̃f[ƒ^‚ª—ˆ‚È‚¢‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚é–â‘èC³B(–Å‘½‚È‚±‚Æ‚ª‚È‚¢ŒÀ‚è‹N‚±‚ç‚È‚¢‚Å‚·‚¯‚Ç‚ËB)
+EƒI[ƒgƒo[ƒT[ƒNAd‚³‚̃AƒCƒRƒ“‚ƃ`ƒFƒbƒN‚ª³‚µ‚­“K—p‚³‚ê‚é‚悤‚ÉC³B
+E‘‘¬ƒ|[ƒVƒ‡ƒ“‚Ì“K—p‡”Ô•ÏXB¡‚܂ł̓Xƒs[ƒhƒAƒbƒvƒ|[ƒVƒ‡ƒ“‚ªÅ—Dæ‚ÅŽŸ‚ªƒnƒCƒXƒs[ƒhƒ|[ƒVƒ‡ƒ“AŌオƒo[ƒT[ƒNƒ|[ƒVƒ‡ƒ“‚¾‚Á‚½‚Ì‚Å‚·‚ª‡”Ô‚ð‹t‚É•ÏX‚µ‚Ü‚µ‚½B
+EƒAƒCƒeƒ€‚ÅŽg‚¤ƒXƒLƒ‹‚̓LƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚ƃfƒBƒŒƒC‚ª0‚É‚È‚é‚悤‚É•ÏXB
+EƒAƒCƒeƒ€‚ÅŽg‚¤ƒXƒLƒ‹‚̃Œƒxƒ‹‚ªitem_db‚Éݒ肵‚Ä‚¢‚郌ƒxƒ‹‚æ‚è‚‚­‚È‚éƒoƒOC³B
+ pc.h
+ pc_move()‚ðpc_movepos()‚É•ÏXB
+ pc.c
+ pc_steal_coin()Apc_insert_card()Apc_item_identify()Apc_authok()A
+ pc_calcstatus()Apc_checkweighticon()Apc_damage() C³B
+ skill.c
+ skill_castend_pos2()Askill_check_condition()Askill_use_id()A
+ skill_use_pos() C³B
+ pet.c
+ pet_recv_petdata()Apet_change_name() C³B
+ map.h
+ struct map_session_data‚Éskillitemlv ’ljÁB
+ script.c
+ buildin_itemskill() C³B
+ clif.c
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos()A
+ clif_parse_LoadEndAck() C³B
+ mob.c
+ mobskill_use_id()Amobskill_use_pos() C³B
+
+--------------
+//0498 by hoenny
+
+DŸ†‹…‚ª‚·‚Á‚©‚茩‚¦‚é‚悤‚ÉC³(Á–ÕƒXƒLƒ‹Žg—p‚ÌŽžÁ–Õ‚·‚é‚悤‚ÉC³)
+DƒXƒLƒ‹Žc‰e‚ðŽg—p‚ÌŽžŸ†‹…‚ðÁ–Õ‚·‚é‚悤‚ÉC³
+ doc/client_packet.txt
+ 0x1d0’ljÁ
+ map/map.h
+ sd‚Ìstructure‚É spiritball’ljÁ
+ map/clif.h
+ clif_spiritball_del() -> clif_spiritball_int()C³
+ clif_spiritball_cre() -> clif_spiritball_ext()C³
+ map/clif.c
+ packet_len_table[]C³
+ clif_spiritball_del() -> clif_spiritball_int()C³
+ clif_spiritball_cre() -> clif_spiritball_ext()C³
+ map/pc.h
+ pc_item_steal() -> pc_steal_item()C³
+ pc_coin_steal() -> pc_steal_coin()C³
+ map/pc.c
+ pc_item_steal() -> pc_steal_item()C³
+ pc_coin_steal() -> pc_steal_coin()C³
+ pc_calcstatus()C³
+ map/skill.c
+ skill_check_conditon()C³
+
+--------------
+//0497 by Ž€_
+
+E0491‚̃XƒLƒ‹Žc‰e‚̃oƒOC³‚ƃXƒeƒB[ƒ‹‚ƃXƒeƒB[ƒ‹ƒRƒCƒ“AƒXƒiƒbƒ`ƒƒ[‚ÌC³Amob_target‚̃oƒOC³B
+EŒðŠ·AÀ‚èAƒp[ƒeƒBŒ‹¬“™‚ÌŽž‚ÉŠî–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚ÉC³B(battle_athena.conf‚Ń`ƒFƒbƒN‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B)
+‚½‚¾ƒJƒvƒ‰‚Ì‘qŒÉ‚̓XƒNƒŠƒvƒg‚ŧŒÀ‚ð‚©‚¯‚邵‚©‚ ‚è‚Ü‚¹‚ñB
+EƒXƒNƒŠƒvƒggetbasicskillcheck’ljÁB
+ Žg—p•û–@„ getbasicskillcheck
+ –ß‚è’l‚Íbattle_athena.conf‚Ìbasic_skill_check‚Å‚·B0‚Ìꇂ͊î–{ƒXƒLƒ‹‚̃`ƒFƒbƒN‚È‚µ‚Å1‚Ìꇂ͊î–{ƒXƒLƒ‹‚ðƒ`ƒFƒbƒN‚·‚é‚Ì‚ðˆÓ–¡‚µ‚Ü‚·B
+ skill.c
+ skill_castend_pos2() C³B
+ skill_additional_effect() C³B
+ pc.c
+ pc_move() ’ljÁB
+ pc_item_steal()Apc_coin_steal() C³B
+ pc.h
+ pc_move() ’ljÁB
+ map.h
+ struct mob_data C³B
+ mob.c
+ mob_spawn() C³B
+ mob_target() C³B
+ clif.c
+ clif_pcinsight()Aclif_pcoutsight() C³B
+ clif_parse_ActionRequest()Aclif_parse_Emotion()A
+ clif_parse_TradeRequest()Aclif_parse_CreateParty()A
+ clif_parse_ReplyPartyInvite() C³B
+ battle_athena.conf C³B
+ conf_ref.txt C³B
+ skill_db.txt
+ ƒXƒeƒB[ƒ‹‚ÌŽË’ö‚ð3‚©‚ç1‚ÉC³B
+ battle.hAbattle.c
+ battle_config‚Ébasic_skill_check ’ljÁB
+ battle_config_read() C³B
+ trade.c
+ trade_traderequest() C³B
+ script.c
+ buildin_getbasicskillcheck() ’ljÁB
+ map/makefile C³B
+¦ƒXƒeƒB[ƒ‹‚ƃXƒeƒB[ƒ‹ƒRƒCƒ“‚ÌŒvŽZŽ®‚Í“K“–‚Éì‚Á‚½•¨‚Å‚·B–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©‘S‘R‚í‚©‚ç‚È‚¢‚Ì‚Å...
+
+ ƒXƒeƒB[ƒ‹—¦ = (ƒ‚ƒ“ƒXƒ^[‚̃AƒCƒeƒ€drop—¦ * (ƒLƒƒƒ‰ƒŒƒxƒ‹*0.5 + dex*0.4 +ƒXƒLƒ‹ƒŒƒxƒ‹*5))%
+ ƒXƒeƒB[ƒ‹ƒRƒCƒ“—¦ = (ƒXƒLƒ‹ƒŒƒxƒ‹ + (ƒLƒƒƒ‰ƒŒƒxƒ‹ - ƒ‚ƒ“ƒXƒ^[‚̃Œƒxƒ‹)*0.3 + dex*0.2 + luk*0.2)%
+ ƒXƒiƒbƒ`ƒƒ[”­“®—¦ = (5.5 + ƒXƒLƒ‹ƒŒƒxƒ‹*1.5 +ƒXƒeƒB[ƒ‹‚̃XƒLƒ‹ƒŒƒxƒ‹)%
+
+–{ŽI‚ÌŒvŽZŽ®‚ª‚í‚©‚é•û‚Íî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ƒXƒeƒB[ƒ‹ƒRƒCƒ“‚̃[ƒj‚̗ʂ̓‚ƒ“ƒXƒ^[‚̃Œƒxƒ‹*100‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚±‚ê‚ɂ‚¢‚Ä‚àî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+¦Žc‰e‚Ìꇎg‚Á‚½Œã•’Ê‚É•à‚­‘O‚ɂ̓yƒbƒg‚Ì‘•”õ‚ªŒ©‚¦‚È‚¢ƒoƒO‚ª‚ ‚è‚Ü‚·‚ªŒ´ˆö‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å•ú’u‚·‚邱‚Æ‚É‚µ‚Ü‚µ‚½B
+¦Šî–{ƒXƒLƒ‹‚ª‘«‚è‚È‚¢Žžo‚郃bƒZ[ƒW‚Í–w‚LJ‚킹‚Ä‚¢‚Ü‚·‚ªƒp[ƒeƒB‚É“ü‚鎞‚ÉŠî–{ƒŒƒxƒ‹‚ª‘«‚è‚È‚¢Žž‚ɇ‚¤•¨‚ª‚È‚©‚Á‚½‚̂Ńp[ƒeƒB‚ðì‚ê‚È‚¢(Šî–{ƒXƒLƒ‹ƒŒƒxƒ‹7‚Ì•¨)‚Æ•\Ž¦‚µ‚ÄŠ©—U‚µ‚½•û‚É‚Í‹‘₳‚ꂽ‚Æ•\Ž¦‚³‚ê‚Ü‚·B
+
+--------------
+//0496 by hoenny
+
+DWZ‚̃ƒeƒIƒXƒg[ƒ€ŽÀ‘•
+DƒXƒeƒB[ƒ‹ƒRƒCƒ“C³
+ db/skill_db.txt
+ ƒƒeƒIƒXƒg[ƒ€C³
+ map/pc.c
+ pc_coin_steal()C³
+ map/skill.c
+ skill_castend_pos2()C³
+
+--------------
+//495 by nini
+
+EAR‚ª•ÐŽè•€A—¼Žè•€‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨•ÐŽè•€A—¼Žè•€A“ÝŠí
+ map/skill.c
+ skill_check_condition()@C³
+
+‘O‰ñC³‚Ì‚Æ‚«“ÝŠí“ü‚ê–Y‚ê‚Ä‚½‚悤‚Å‚·B
+
+--------------
+//0494 by Ž‚Žqo^.^o
+
+conf/mpc_warp.txt
+Dƒnƒ“ƒ^ˆê“]E’no‚Ä‚¢‚È‚¢C³
+
+--------------
+//0493 by ”g˜Q
+
+EscriptC³
+ npc_town_comodo.txt ƒRƒ‚ƒhˆÄ“à—vˆõ•”•ª‚ðíœ(npc_town_guide.txt‚Æd•¡‚µ‚Ä‚¢‚½‚Ì‚Å)
+ npc_town_guide.txt ƒWƒ…ƒm[ˆÄ“à—vˆõ‚ð’ljÁ(viewpoint‚ÌF‚ªc)
+ npc_town_kafra.txt ƒWƒ…ƒm[ƒJƒvƒ‰•”•ª‚ðnpc_town_yuno.txt‚©‚çˆÚ“®
+ npc_town_refine.txt ƒWƒ…ƒm[¸˜BŠ•”•ª‚ðnpc_town_yuno.txt‚©‚çˆÚ“®
+ npc_town_yuno.txt ˆÄ“à—vˆõ‚ƃJƒvƒ‰‚Ƹ˜BŠ•”•ª‚ðíœ
+ npc_turtle.txt ‰ï˜b‚ð”÷C³
+
+--------------
+//0492 by Kalen
+
+EscriptC³+’ljÁ
+
+ conf/npc_event_doll.txt (V‹K)
+ conf/npc_turtle.txt (V‹K)‹T“‡ŠÖ˜ANPC+‹T“‡ƒNƒGƒXƒg(qŠC“úŽ)’ljÁ
+
+ conf/npc_event_skillget.txt (C³)‰ž‹}ˆ’u‚Ì•s‹ï‡+‚Ö‚ñ‚Ètabíœetc..
+ conf/npc_town_alberta.txt (C³)Turtle•ª—£A‚¿‚Ñ‚ÁŽqíœ(Event_doll‚ÖˆÚ“®)
+ conf/npc_town_guide.txt (C³)‘䎌‚ª‚©‚È‚è•ÏX‚³‚ê‚Ä‚¢‚½‚Ì‚ÅAC³
+
+
+--------------
+//0491 by Ž€_
+
+EƒXƒLƒ‹Žc‰e(ŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Í‹|gœ[‰e)ŽÀ‘•B(‚½‚¾‹C’e‚̃`ƒFƒbƒN‚Í‚µ‚Ä‚Ü‚¹‚ñB)
+ pc.h
+ pc.c
+ pc_can_reach() ’ljÁB
+ skill.c
+ skill_check_condition()Askill_castend_pos2() C³B
+ skill_db.txt
+ Žc‰eC³B
+Escript.c
+ set_posword() C³B
+¦ˆêl‚ŃeƒXƒg‚ÍÏ‚ñ‚Å‚¢‚Ü‚·‚ª‘¼‚Ìl‚ɳ‚µ‚­Œ©‚¦‚é‚©‚Ç‚¤‚©‚Í–¢Šm”F‚Å‚·B
+•Ï‚È‚Ì‚©‚Ç‚¤‚©•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+
+--------------
+//0490 by nabe
+
+EꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚Ń}ƒbƒvŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚Á‚½‚Ì‚ðC³B
+ clif.c
+ clif_skill_poseffect()‚Ì
+ unsigned char buf[16];‚ðAunsigned char buf[32];‚ÉC³B
+
+--------------
+//0489 by Ž€_
+
+E0483‚̃oƒOC³Bbattle_athena.conf‚Ìquest_skill_learn‚ª³‚µ‚­“K—p‚³‚ê‚é‚悤‚É•ÏX‚Æ–â‘肪‚ ‚Á‚½•”•ª‚ÌC³B(ƒeƒXƒgÏ‚Ý)
+ pc.c
+ pc_calc_skilltree()Apc_skill() C³B
+ atcommand.c
+ @lostskill ­‚µC³B
+EƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ð–h‚®‚½‚ß‚É­‚µC³B(‚½‚¾ƒJ[ƒh‚ÌŽg—p‚É‚æ‚éƒ}ƒbƒvŽIƒ_ƒEƒ“‚ðÄŒ»‚Å‚«‚È‚©‚Á‚½‚Ì‚Å–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾...Š¾)
+ pc.c
+ pc_insert_card() C³B
+Epc.h
+ pc_ishiding() C³B
+
+--------------
+//0488 by hoenny
+
+ERG‚̃XƒeƒB[ƒ‹ƒRƒCƒ“ŽÀ‘•
+EƒXƒeƒB[ƒ‹C³
+(“ñƒXƒLƒ‹ŠFˆê“xƒXƒ`[ƒ‹‚µ‚½ê‡‚Ü‚½ƒXƒ`[ƒ‹‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢.‚»‚µ‚ăXƒLƒ‹¬Œ÷‚ÌŽžƒ‚ƒ“ƒXƒ^[‚ÍUŒ‚‚·‚é‚悤‚ÉC³‚µ‚½.ƒGƒtƒFƒNƒg‚ͬŒ÷‚ÌŽž‚¾‚¯o‚é‚悤‚ÉC³‚µ‚½.)
+ db/skill_db.txt
+ ƒXƒeƒB[ƒ‹ƒRƒCƒ“C³
+ map/pc.h
+ pc_coin_steal()’ljÁ
+ map/pc.c
+ pc_coin_steal()’ljÁ
+ pc_item_steal()C³
+ map/skill.c
+ skill_castend_nodamage_id()C³
+
+--------------
+//0487 by hoenny
+
+E485‚Ì–â‘è“_‚¿‚å‚Á‚ÆC³
+ map/pc.c
+ pc_item_steal()C³
+ map/skill.c
+ skill_castend_nodamage_id()C³
+
+--------------
+//0486 by Ž‚Žqo^.^o
+
+db/class_equip_db.txtC³
+—ô‚¯‚½‘å’n‚Ì‘A”R‚¦‚鑾—z‚Ì‘AŠ£‚¢‚Ä‚é•—‚Ì‘AàÒŽ¦˜^AƒvƒŠ[ƒXƒg‚Í‘•”õ‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢–â‘èC³
+
+--------------
+//0485 by hoenny
+
+E RG‚̃Xƒiƒbƒ`ƒƒ[ŽÀ‘•
+E ƒXƒeƒB[ƒ‹C³
+E ˜I“XŠJÝ‚ÌŽž skill_check_condition‚Åó‘Ô‚ðƒ`ƒFƒN‚·‚é‚悤‚ÉC³
+ map/pc.h
+ pc_ishiding()’ljÁ
+ pc_item_steal()’ljÁ
+ map/pc.c
+ pc_item_steal()’ljÁ
+ map/skill.c
+ skill_castend_nodamage_id()C³
+ skill_additional_effect()C³
+ skill_check_condition()C³
+
+--------------
+//0484 by ŒÓ’±—–
+
+EŠo‚¦‚Ä‚È‚¢ƒNƒGƒXƒgƒXƒLƒ‹‚ɃXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðU‚ê‚é–â‘èC³
+ pc.c
+ pc_calc_skilltree()‚ŃNƒGƒXƒgƒXƒLƒ‹‚̃`ƒFƒbƒN’ljÁ
+ skill.c
+ skill_readdb()‚Åinf2‚ð“ǂނ悤‚ÉC³
+
+EƒyƒRƒyƒR‹RæAƒtƒ@ƒ‹ƒRƒ“‚̃AƒCƒRƒ“‚ªƒƒOƒCƒ“’¼Œã‚É‚Í•\Ž¦‚³‚ê‚È‚¢–â‘èC³
+ clif.c
+ clif_parse_LoadEndAck()C³
+
+--------------
+//0483 by Ž€_
+
+E0482‚Ì“K—pB
+ npc_event_skillget.txt C³B
+ script.c C³B
+ skill.c C³B
+ pc.c C³B
+
+--------------
+//0482 by ŒÓ’±—–
+
+EƒNƒGƒXƒgƒXƒLƒ‹‚̃XƒNƒŠƒvƒg­‚µC³
+EƒXƒNƒŠƒvƒggetskilllv‚ðŒÄ‚Ԃƃ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³
+ (conf/)
+ npc_event_skillget.txt
+ o—ˆ‚邾‚¯•Ï”‚ðŽg‚í‚È‚¢‚悤‚ÉC³i–¢ƒeƒXƒgj
+ (map/)
+ script.c
+ buildin_getskilllv()C³
+
+EƒXƒeƒB[ƒ‹‚ÅŽ¸”sŽž‚̃GƒtƒFƒNƒg•ÏX
+E“¯‚¶MOB‚É‚Í‚P‰ñ‚µ‚©ƒXƒeƒB[ƒ‹‚Å‚«‚È‚¢‚悤‚ÉC³
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()C³
+ map.h
+ struct mob_data‚Ésteal_countƒƒ“ƒo’ljÁ
+ mob.c
+ mob_spawn()C³Asteal_count‚ð0‚ɉŠú‰»‚·‚é‚悤‚É
+
+EƒCƒhƒDƒ“‚Ì—ÑŒç‚ÅHP‚ª32767‚ð’´‚¦‚é‚ƃT[ƒo[‚ª—Ž‚¿‚éƒoƒOC³i–¢ƒeƒXƒgj
+ (map/)
+ pc.c
+ pc_calcstatus()C³
+
+--------------
+//0481 by Ž€_
+
+E‚±‚ê‚Ì“K—p‚É‚Í‹C‚ð‚‚¯‚Ä‚­‚¾‚³‚¢B0478‚̌Ӓ±—–‚³‚ñ‚Ì•¨‚ð Athena.txt‚̃f[ƒ^Œ`Ž®•ÏX‚¹‚¸‚ɃNƒFƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚é‚悤‚Éì‚Á‚½•¨‚Å‚·BŽ©•ª‚ªì‚Á‚Ä‚éÅ’†‚ɌӒ±—–‚³‚ñ‚ª“¯‚¶•¨‚ðƒAƒbƒv‚µ‚Ä‚­‚ꂽ‚Ì‚Å‚·‚ªƒf[ƒ^‚Í•Ï‚¦‚È‚¢•û‚ª‚¢‚¢‚ÆŽv‚Á‚ÄŽ©•ª‚Ì•¨‚àƒAƒbƒv‚µ‚Ü‚µ‚½B’ˆÓ‚·‚邱‚Æ‚Í0478‚Ìathena.txt‚ÍŽg‚¦‚È‚¢‚ÆŒ¾‚¤‚±‚Æ‚Å‚·B0478‘O‚Ì•¨‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
+Eskill_db.txt‚Éinf2‚ð’ljÁ‚µ‚Ä‚±‚ê‚ðŽg‚Á‚ăNƒFƒXƒgƒXƒLƒ‹‚©‚Ç‚¤‚©‚ð”»’f‚·‚éŽd‘g‚Ý‚Å‚·B
+ skill.h C³B
+ skill.c
+ skill_readdb()C³‚Æ­‚µC³B
+ skill_get_inf2() ’ljÁB
+ skill_db.txt C³B
+ skill_tree.txt C³B(0478‘O‚Ì•¨)
+ clif.c
+ clif_skillinfoblock() C³B
+ char.c C³B(0478‘O‚Ì•¨)
+Ebattle_athena.conf‚Équest_skill_learn’ljÁB
+ battle.h C³B
+ battle.c
+ battle_config_read() C³B
+ battle_athena.conf C³B
+E/resetskill‚ðbattle_athena.conf‚Équest_skill_learn‚ÌÝ’è‚ɇ‚킹‚Äquest_skill_learn‚ªyes‚Ìꇂ̓XƒLƒ‹ƒ|ƒCƒ“ƒg‚ɉÁŽZ‚µ‚Äquest_skill_learn‚ªno‚Ȃ烊ƒZƒbƒg‚Í‚³‚ê‚邪ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ɉÁŽZ‚³‚ê‚Ü‚¹‚ñB
+ pc.c
+ pc_skill()Apc_resetskill() C³‚Æ­‚µC³B
+ pc.h C³B
+ atcommand.c C³B
+ atcommnad_athena.conf C³B
+EƒXƒNƒŠƒvƒg‚ÌskillƒRƒ}ƒ“ƒh‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚é‚Ì‚Í“¯‚¶‚Å‚·‚ªÅŒã‚̃tƒ‰ƒO‚ª2‚©‚ç0‚É•Ï‚í‚Á‚Ä‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ npc_test_skill.txt C³B
+ npc_event_skillget.txt C³B
+ conf_ref.txt C³B
+ client_packet.txt C³B
+
+--------------
+//0480 by Kalen
+
+EEventskill’ljÁ
+ conf/npc_event_skillget.txt
+
+Emap_athena.conf•ÏX
+ warp.txt‚Ì“Ç‚Ýž‚Ý—Dæ“x‚ð•ÏX
+ prt_castle“™A‹ŒEP‚̃[ƒv‚ƈقȂéꊂɕÏX‚³‚ꂽê‡
+ æ‚É“Ç‚Ýž‚ñ‚¾•û‚ª—D悳‚ê‚é‚Ì‚ÅAEP‚Ì‚‚¢‡‚Ì‚ª‚æ‚낵‚¢‚©‚Æ
+ conf/map_athena.conf
+
+--------------
+//0478 by ŒÓ’±—–
+
+***
+ Athena.txt‚̃f[ƒ^Œ`Ž®•ÏX!! (Ž©“®“I‚É•ÏŠ·‚³‚ê‚Ü‚·)
+ ƒoƒbƒNƒAƒbƒv‚ð–Y‚ꂸ‚É!
+ Data format of athena.txt is changed!! (convert automatically)
+ DONT FORGET BACKUP!!
+***
+
+EƒNƒGƒXƒgƒXƒLƒ‹ŽÀ‘•
+EƒXƒNƒŠƒvƒg‚ŃXƒLƒ‹ƒŒƒxƒ‹‚ðƒ`ƒFƒbƒN‚Å‚«‚é‚悤‚É
+ EƒXƒNƒŠƒvƒg‚ÌskillƒRƒ}ƒ“ƒh‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚ç‚ê‚Ü‚·B
+ Žg—p•û–@„ skill ƒXƒLƒ‹ID,ƒXƒLƒ‹LV[,ƒtƒ‰ƒO]
+ ƒtƒ‰ƒO‚ÍÈ—ª‰Â”\‚ÅAÈ—ª‚·‚é‚Æ‚P‚ðŽw’肵‚½‚±‚Æ‚É‚È‚è‚Ü‚·B
+ ‚P‚Å‘•”õ•i‚É‚æ‚éˆêŽž“I‚ÈK“¾A‚Q‚ŃNƒGƒXƒg‚É‚æ‚éP‹v“I‚ÈK“¾‚Å‚·B
+ P‹v“I‚ÈK“¾‚Ìê‡Askill_tree.txt‚Ɉˑ¶‚µ‚Ü‚·
+ EgetskilllvƒRƒ}ƒ“ƒh’ljÁ
+ Žg—p•û–@„ getskilllv(ƒXƒLƒ‹ID) –ß‚è’l‚̓Œƒxƒ‹‚Å‚·B0‚Å–¢K“¾B
+
+ (conf/)
+ npc_test_skill.txt
+ ƒTƒ“ƒvƒ‹
+ (db/)
+ skill_tree.txt
+ ƒNƒGƒXƒgƒXƒLƒ‹‚Æ‚µ‚Ä•K—vƒXƒLƒ‹ID‚É-1‚ðÝ’èB
+ (char/)
+ char.c
+ ƒtƒ‰ƒO‚àathena.txt‚É•Û‘¶‚·‚é‚悤‚ÉB
+ ˆÈ‘O‚ÌŒ`Ž®‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚Ü‚·B
+ (map/)
+ pc.c/pc.h
+ pc_skill(),pc_calc_skilltree()‚È‚ÇC³
+ script.c
+ buildin_skill(),buildin_getskillid()‚È‚ÇC³
+
+E@questskill,@lostskill’ljÁ
+ E@questskill ƒXƒLƒ‹ID ‚ŃNƒGƒXƒgƒXƒLƒ‹‚ðŠo‚¦‚Ü‚·B(ƒNƒGƒXƒgƒXƒLƒ‹‚Ì‚Ý)
+ E@lostskill ƒXƒLƒ‹ID ‚ŃXƒLƒ‹‚ð–Y‚ê‚Ü‚·B(ƒNƒGƒXƒgƒXƒLƒ‹ˆÈŠO‚àOK)
+
+ atcommand.c/atcommand.h
+ struct Atcommand_Config‚Élostskill,questskillƒƒ“ƒo’ljÁ
+ @questskill,@lostskillˆ—’ljÁ
+
+--------------
+//0477 by nabe
+
+Eˆê•”•Ï”‚Ì錾ˆÊ’u‚Ì•ÏX‚Ì‚ÝiLinux“™‚ŃRƒ“ƒpƒCƒ‹‚µ‚â‚·‚¢‚悤‚ÉjB
+ atcommand.c,battle.c,clif.c,mob.c,npc.c,skill.c
+
+--------------
+//0476 by nabe
+
+Econf/ ‚¿‚å‚Á‚Æ®—
+ conf/map_athena.confC³B
+ tortoise.txt‚ðnpc_town_alberta.txt’†‚Ɉړ®B
+ npc_script2.txt‚̃Rƒ‚ƒhƒKƒCƒh‚ðnpc_town_comodo.txt’†‚Ɉړ®B
+
+Enpc‚ªƒLƒƒƒ‰–¼‚ð’‚é‚Æ‚«‚̃oƒOC³
+ map/script.c
+ buildin_strcharinfo()‚ŃLƒƒƒ‰–¼—p‚̃ƒ‚ƒŠ‚ð
+ static‚ÉŠm•Û‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‚Ì‚ðAmalloc‚ÉC³B
+
+--------------
+//0475 by hoenny
+
+“D–_‚̃XƒeƒB[ƒ‹ŽÀ‘•B
+ƒMƒ‹ƒh¶¬‚ÌŽžƒGƒ“ƒyƒŠƒEƒ€Á–Õ‚·‚é‚悤‚ÉC³B
+ map/guild.c
+ guild_create()C³B
+ guild_created()C³B
+ map/skill.c
+ skill_castend_nodamage_id()C³B
+
+--------------
+//0474 by Ž€_
+
+E0471‚̸—û‚ÌŽž•\Ž¦‚³‚ê‚镶Žš‚ÌÝ’è‚ðmap_athena.conf‚©‚çscript_athena.conf‚É•ÏXB
+ script.c
+ do_init_script() C³‚Æ­‚µC³B
+ script.h C³B
+ script_athena.conf ’ljÁB
+ map_athena.conf C³B
+ map.c
+ map_config_read() C³B
+EŒÃ‚¢Šª•¨AƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒXŽÀ‘•‚Æ­‚µŽd—l•ÏXB
+ƒ‰ƒ“ƒ_ƒ€‚ŃAƒCƒeƒ€‚𓾂镨‚ɃfƒtƒHƒ‹ƒg‚Åo‚éƒAƒCƒeƒ€‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏXB¡‚ÌŽd—l‚Å‚Í1000‰ñ‚܂ŃAƒCƒeƒ€‚ª‘I‘ð‚³‚ê‚È‚©‚Á‚½‚çƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ªo‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·BƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ª0‚Ìꇂ̓AƒCƒeƒ€‚𓾂ç‚ê‚Ü‚¹‚ñB
+Ý’è‚·‚éŠm—¦‚ð*1000‚©‚ç*10000‚É•ÏXB‚½‚¾item_~.txt‚ÌC³‚Í‚â‚Á‚Ä‚¢‚Ü‚¹‚ñB’N‚©‚â‚Á‚Ä‚­‚¾‚³‚¢B(‘¼—Í–{Šè)
+ itemdb.c
+ temdb_read_randomitem() C³B
+ itemdb_searchrandomid() C³B
+ item_purplebox.txt ‚©‚ç item_violetbox.txt ‚ÉC³B
+ item_giftbox.txtAitem_scroll.txt ’ljÁB(move‚³‚ñ‚ ‚肪‚Æ‚¤B)
+ item_db.txt
+ ŒÃ‚¢Šª•¨AƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX C³B
+Etrade.c
+ trade_tradecommit() C³Bpc_delitem()‚ðŽg‚¤‚悤‚É•ÏXB
+¦ƒeƒXƒg‚Í‚â‚Á‚Ä‚¢‚Ü‚¹‚ñ‚Ì‚Å–â‘肪‚ ‚Á‚½‚ç•ñ‚µ‚Ä‚­‚¾‚³‚¢B
+
+--------------
+//0473 by Kuro
+
+Eclass_equip_db‚ðˆê•”C³
+ db/class_equip_db.txt
+
+--------------
+//0471 by hoenny
+
+»˜B‚ÌŽžo‚镶‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½.(map_athena.conf‚Å’²ß‰Â”\)
+‹CŒ÷‚Ì”Žš‚ªŽsœD‚ÌŽžŽÀÛ…˜H•\Ž¦}—ÎC³
+ conf/map_athena.conf
+ refine_posword:’ljÁB
+ map/map.c
+ map_config_read()C³B
+ map/script.h
+ do_set_posword()’ljÁB
+ map/script.c
+ do_set_posword()’ljÁB
+ buildin_getequipname()C³B
+ map/skill.c
+ skill_status_change_start()C³B
+
+--------------
+//0470 by Ž€_
+
+E»‘¢‚ÌŽž‘®«Î‚ª“ñ“xŒ¸‚é–â‘èC³B(ŽÀ‚Í“ñ“xŒ¸‚é‚悤‚ÉŒ©‚¦‚邾‚¯‚Ń}ƒbƒv‚ðˆÚ“®‚·‚é‚Ƴ‚µ‚­•\Ž¦‚³‚ê‚Ü‚·‚ª...)
+ pc.hApc.c
+ pc_delitem() C³B
+ npc.cAscript.cAstorage.cApet.c
+ pc_delitem()‚ð‘S‚ÄC³B
+ skill.c
+ skill_produce_mix() C³B
+
+--------------
+//469 by ”g˜Q
+
+Enpc_mob_job.txtAnpc_monster.txtAnpc_monster30.txtAmob_db.txt‚̃‚ƒ“ƒX–¼‚ðC³
+Eitem_db.txt‚̉ñ•œƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ðƒWƒ…ƒm[Œã‚Ì‚à‚Ì‚ÉC³
+
+--------------
+//468 by Kuro
+
+E–‚Œ•»ìƒNƒGƒXƒg’ljÁ
+ conf/npc_event_ma_sword.txt
+
+--------------
+//467 by nini
+
+EBB‚ª—¼ŽèŒ•‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨‚·‚ׂĂ̕Ší‚Å
+EAR‚ª—¼Žè•€‚Å‚µ‚©”­“®‚µ‚È‚©‚Á‚½‚Æ‚±‚ëC³¨•ÐŽè•€A—¼Žè•€A“ÝŠí
+EƒXƒsƒAƒNƒCƒbƒPƒ“”­“®‚ð‘„‚¾‚¯‚É
+EƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢‚à‚̂ɃOƒ‰ƒ“ƒhƒNƒƒXAƒ[ƒO‚̃XƒgƒŠƒbƒvƒVƒŠ[ƒY’ljÁ
+EƒuƒŠƒbƒcƒr[ƒg‚ªƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹‚³‚ê‚È‚­‚È‚Á‚Ä‚½“_C³
+ map/skill.c
+ skill_use_id()@C³
+ skill_check_condition()@C³
+E2-2EƒXƒLƒ‹‚̃LƒƒƒXƒgEƒfƒBƒŒƒC’ljÁ
+ db/cast_db.txt
+
+
+--------------
+//466 by hoenny
+
+Eˆ¢C—…”e–PŒC³(ŒöŽ®C³‹y‚Ñ spÁ–Õ‚ª‚·‚®Œ©‚¦‚é‚悤‚É)
+E’~‹C‚ÌŽž‹C’e‚ªŒ©‚¦‚é‚悤‚ÉC³(Mr.NO NAME—l‚̃pƒPî•ñ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·.‹C’e‚ªÁ‚¦‚éƒpƒPî•ñ‚ª•s‘«‚Å‚·.)
+EƒpƒŠ‚̉H‚âƒeƒŒƒ|[ƒg1‚ð˜A‘±Žg—p‚ÌŽž,ŽIƒI[ƒo[‚ª”­¶‚µ‚È‚¢‚悤‚ɉ¼‰‚ß‚ÅC³
+ doc/client_packet.txt
+ 0x1e1ƒpƒPî•ñ’ljÁ
+ map/battle.c
+ battle_calc_weapon_attack()C³
+ map/clif.h
+ clif_spiritball_cre()’ljÁ
+ clif_spiritball_del()’ljÁ
+ map/clif.c
+ packet_len_table[]C³
+ clif_spiritball_cre()’ljÁ
+ clif_spiritball_del()’ljÁ
+ clif_changemap()C³
+ map/skill.c
+ skill_castend_nodamage_id()C³
+ skill_check_condition()C³
+
+--------------
+//0465 by Ž€_
+
+EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ƃnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚̃oƒOC³B(ƒuƒŠƒbƒcƒr[ƒg‚Í•ñ‚Í‚È‚©‚Á‚½‚Ì‚Å‚·‚ª•ªÍ‚µ‚½‚ç–â‘肪‚ ‚Á‚½‚Ì‚ÅC³B)
+ skill.c
+ skill_use_id() C³B
+ skill_castend_nodamage_id() C³B
+E0455‚ÌNPC‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B
+ npc_event_ice.txt C³B
+ npc_event_potion.txt C³B
+ npc_town_geffen.txt C³Bi454‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½Bj
+E0451‚̃¿ƒ}ƒbƒv‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B•K—v‚È•û‚̓Rƒ}ƒ“ƒgƒAƒEƒg‚ð‚È‚­‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B
+ map_athena.conf C³B
+EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Í0442‚Ì–â‘è‚ŃnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚Í0445‚Ì–â‘è‚Å‚µ‚½B‚»‚ê‚Æ0445‚ÌC³‚ŃXƒLƒ‹”Ô†‚ðenum‚Å錾‚µ‚½•¶Žš‚É•Ï‚¦‚Ä‚¢‚Ü‚·‚ª‚»‚ê‚É—Ž‚Æ‚µ‚ª‚ ‚é‚悤‚Å‚·B(ƒnƒCƒfƒBƒ“ƒOAƒuƒŠƒbƒcƒr[ƒg‚Í‚»‚Ì‚¹‚¢‚Å‚µ‚½B)‘O‚̔Ԇƒ\[ƒX‚Æ”ä‚ׂĖâ‘肪‚ ‚é•”•ª‚ÍC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B‚¿‚å‚Á‚Æ–Ê“|‚Å‚·‚ª...
+
+--------------
+//464 by ”g˜Q
+
+Eƒ‚ƒ“ƒNƒXƒLƒ‹‚Ì•”•ª‚ɂ‚¢‚ÄC³(–¢ŽÀ‘•ƒXƒŒ‚É‘‚©‚ê‚Ä‚¢‚½‚à‚Ì‚ð’ljÁ‚µ‚½‚¾‚¯‚Å‚·B
+ skill.c
+ skill_use_id()C³
+ cast_db.txt
+ ƒ‚ƒ“ƒNƒXƒLƒ‹’ljÁ
+
+--------------
+//463 by ŒÓ’±—–
+
+E462‚̃oƒOC³
+ ENPC‚ÌSHOP‚Ì•s“s‡C³
+ EREADME‚̊ԈႢC³iwarpwaitingpc‚ªwarpwaitingroom‚É‚È‚Á‚Ä‚¢‚½j
+
+ map.h
+ struct npc_data‚Ìchat_id‚̈ʒu‚ðC³
+
+--------------
+//462 by ŒÓ’±—–
+
+ENPCƒ`ƒƒƒbƒgì¬
+ Ewaitingroom–½—ß‚ÅNPCƒ`ƒƒƒbƒg‚ð쬂µ‚Ü‚·B
+ ˆø”‚Í waitingroom "ƒ`ƒƒƒbƒg–¼",§ŒÀl”,ƒCƒxƒ“ƒg–¼ ‚Å‚·B
+ ƒCƒxƒ“ƒg–¼‚Íl”‚ªÅ‘å‚É‚È‚Á‚½‚Æ‚«‚É‹N‚±‚·ƒCƒxƒ“ƒg–¼‚ÅAÈ—ª‰Â”\B
+ Ewarpwaitingpc–½—ß‚ÅAƒ`ƒƒƒbƒg“à‚É‚¢‚éPC‘Sˆõ‚ðƒ[ƒv‚Å‚«‚Ü‚·B
+ ˆø”‚Íwarp‚Æ“¯‚¶‚ÅAwarpwaitingpc "ƒ}ƒbƒv–¼",x,y ‚Å‚·B
+
+ map.h
+ struct npc_data‚Æchat_data‚ðC³
+ script.c
+ buildin_waitingroom(),buildin_warpwaitingpc()’ljÁ
+ chat.c/chat.h
+ FXC³
+ clif.c
+ clif_getareachar_npc()Aclif_joinchatok()‚È‚ÇC³
+
+ENPC‚ÌOnInitƒCƒxƒ“ƒg‚ðƒT[ƒo[‹N“®Žž‚ɌĂԂ悤‚ÉB
+EƒGƒNƒXƒ|[ƒg‚·‚é‚Æ‚«‚ÌNPC–¼‚Æ•\Ž¦ã‚ÌNPC–¼‚ð•ÊX‚ÉÝ’è‰Â”\‚ÉB
+ E“¯‚¶NPC–¼‚̃Cƒxƒ“ƒg‚Íd•¡‚Å‚«‚È‚¢‚½‚ßAƒGƒNƒXƒ|[ƒg—pNPC–¼‚ðŽg‚¢A
+ “¯‚¶NPC–¼‚Å‚à•Ê‚ÌNPC‚Æ‚µ‚ÄŽ¯•Ê‚Å‚«‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
+ (‚à‚¿‚ë‚ñAƒCƒxƒ“ƒgˆ—‚ðs‚í‚È‚¢ê‡‚Í‚»‚Ì•K—v‚Í‚ ‚è‚Ü‚¹‚ñB)
+ Enpc_*.txt‚Ìscript–½—ß‚ÅNPC‚Ì–¼‘O‚ðÝ’è‚·‚é‚Æ‚«A
+ u•\Ž¦–¼::ƒGƒNƒXƒ|[ƒg–¼v‚Æ‚·‚é‚ÆA•\Ž¦‚·‚é–¼‘O‚ÆAƒCƒxƒ“ƒg—p‚É
+ ƒGƒNƒXƒ|[ƒg‚·‚é–¼‘O‚ð•ÊX‚ÉŽw’è‚Å‚«‚Ü‚·B
+ •\Ž¦–¼‚ª‘S‚­“¯‚¶•ÊX‚ÌNPC‚ŃCƒxƒ“ƒg‚ð“®ì‚³‚¹‚é‚Æ‚«‚ÉŽg—p‚µ‚Ü‚·B
+ E‚â‚₱‚µ‚¢‚Ì‚ÅPVP‚ÌnpcƒXƒNƒŠƒvƒg‚ðŒ©‚ÄƒCƒ[ƒW‚ð’Í‚ñ‚Å‚­‚¾‚³‚¢B
+
+ npc.c/npc.h
+ npc_parse_*()‚ÌC³
+ npc_event_do_oninit(),npc_event_do_oninit_sub()‚ȂǒljÁ
+ map.c/map.h
+ do_init()‚Ånpc_event_do_oninit()‚ðŒÄ‚Ԃ悤‚É
+ struct npc_dataC³
+
+EƒXƒNƒŠƒvƒggetmapusersAgetareausers‚Ì’v–½“I‚ȃoƒOC³
+ EŠY“–ƒ}ƒbƒv‚ª‘¶Ý‚µ‚È‚¢ê‡Aƒ}ƒbƒvƒT[ƒo[‚ª—Ž‚¿‚é‚Ì‚ðC³B
+ Eƒ}ƒbƒv‚ª‘¶Ý‚µ‚È‚¢‚ÆA-1‚ð•Ô‚·‚悤‚É‚µ‚½B
+
+ script.c
+ buildin_getmapusers(),buildin_getareausers()C³
+
+Epvp‚̃XƒNƒŠƒvƒgC³
+ Eƒ`ƒƒƒbƒgƒ‹[ƒ€‚ðì‚é‚悤‚É‚µ‚½
+
+ (conf/)
+ npc_pvproom.txt
+ ‘S‚Ä‚ÌNPC‚̃GƒNƒXƒ|[ƒg–¼(pvp??r)Ý’è
+ OnInit:‚Åwaitingroom‚ðŽÀs‚·‚é‚悤‚É
+
+--------------
+//461 by Kuro
+EƒAƒRƒ‰ƒCƒg“]EƒNƒGƒXƒgˆê•”C³
+ conf/npc_job_aco.txt
+
+--------------
+//460 by sagitarius
+Eitem_db‚̊ԈႢC³
+ 4032,Ambernite_Card,ƒAƒ“ƒo[ƒiƒCƒgƒJ[ƒh,6,20,,10,,2,,,,,32,,,,{},{},,C³
+
+--------------
+//459 by hoenny
+EƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Žg—p‚ÌŽž•€ƒ`ƒFƒbƒN(Ž©•ª‚¾‚¯)
+EOld_Blue_Box‚ÌŠm—¦‚ª‚‚¢‚Æ‚¢‚¤•ñ‚É‚æ‚Á‚ÄC³
+EScript.c‚Í0455ˆÈ‘O‚±‚ƂňøŠ·(NPC‚ð‚±‚±‚ɇ‚킹‚ÄC³‚µ‚Ä‚­‚¾‚³‚¢)
+Eˆ¢C—…”e–PŒC³(ŒöŽ®‚ðC³‚µ‚½‚ñ‚Å‚·‚ª, ³Šm‚©‚Í‚æ‚­•ª‚©‚ç‚È‚¢‚Å‚·‚Ë.)
+EC“¹‘m‚Ì’~‹C,”šŠú‚̉¼ŽÀ‘•.(ˆ¢C—…”e–PŒŽg—p‚ÌŽž’~‹C,”šŠúó‘Ô‚ðƒ`ƒFƒbƒN‚µ‚Ü‚·. )
+EƒyƒRƒyƒR‚Éæ‚Á‚½Œã‚ÉAADPD‚ªŠÔˆá‚Á‚½‚±‚ÆC³(ƒoƒO‚𒼂µ‚Ä‚ ‚°‚½‚ª, ’¼‚·‘O‚±‚Æ‚É•Ï‚í‚邹‚¢‚Å‚Ü‚½C³)
+‚»‚ÌŠO‚É‚àC³‚ð‚µ‚½‚悤‚È‚Ì‚ÉŠo‚¦‚È‚¢‚Å‚·‚Ë.‚»‚µ‚ÄŒë‚Á‚½•”•ª‚ª‚ ‚ê‚ÎŽw“E‚µ‚Ä‚­‚¾‚³‚¢.
+ conf/npc_event_ice.txt
+ checkweightC³
+ conf/npc_town_geffen.txt
+ checkweightC³
+ db/item_purplebox.txt
+ Old_Blue_BoxC³
+ map/battle.c
+ battle_calc_weapon_attack()C³
+ map/pc.c
+ pc_spheal()C³
+ pc_calcstatus()C³
+ map/script.c
+ buildin_checkweight()C³
+ map/skill.h
+ SC_ EXPLOSIONSPIRITS’ljÁ
+ map/skill.c
+ SkillStatusChangeTable[]C³
+ skill_castend_nodamage_id()C³
+ skill_check_condition()C³
+
+--------------
+//458 by Kuro
+EƒAƒRƒ‰ƒCƒg“]EƒNƒGƒXƒg’ljÁ
+ conf/npc_job_aco.txt
+ ‰ï˜b•¶‚ª•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“K“–‚É‚µ‚Ä‚ ‚è‚Ü‚·B‚Ü‚½ANPC‚ÌŠOŒ©‚Ì•Ï‚¦•û‚ª•ª‚©‚ç‚È‚©‚Á‚½‚Ì‚Å“K“–‚É‚µ‚Ä‚ ‚è‚Ü‚·B
+ •ª‚©‚é•û‚ÍC³‚µ‚Ä‚¨‚¢‚ĉº‚³‚¢B
+
+--------------
+//0457 by Kalen
+
+EPVPŠÖ˜A‚ÌNPC’ljÁ
+ conf/npc_pvp.txt
+ conf/npc_pvproom.txt
+
+--------------
+//0456 by Ž€_
+
+Eƒ‚ƒ“ƒXƒ^[‚ÌʼnUŒ‚ŽžŠÔ‚ª’·‚·‚¬‚é–â‘èC³B
+ƒ‚ƒ“ƒXƒ^[‚ÌʼnUŒ‚ŽžŠÔ‚ð¡‚Ü‚Å‚Ímob_db‚ÌaDelay‚ðŽg‚Á‚Ä‚¢‚Ü‚µ‚½‚ª‚±‚ê‚ðaMotion‚É•ÏX‚µ‚Ü‚µ‚½B¡‚Ü‚Å‚Ímob_db‚ÌaMotion‚̓Sƒ~‚Å‚µ‚½‚ª¡“x‚©‚ç‚̓Sƒ~‚Å‚Í‚ ‚è‚Ü‚¹‚ñBaMotion‚³‚¦³‚µ‚¯‚ê‚΃‚ƒ“ƒXƒ^[‚ÌUŒ‚‚̃‚[ƒVƒ‡ƒ“‚Ì‘O‚Ƀ_ƒ[ƒW‚ªo‚Ä‚­‚é–â‘è‚à‚È‚­‚È‚é‚Í‚¸‚Å‚·B
+ mob.c
+ mob_changestate() C³B
+EƒAƒCƒeƒ€‚ð“üŽè‚Å‚«‚È‚¢Žž‚»‚Ì——R‚É“–‚½‚郃bƒZ[ƒW‚ªo‚é‚悤‚É•ÏXB
+ pc.c
+ pc_additem() C³B
+Ejob_db1.txt‚Ì‚Å–â‘è‚É‚È‚Á‚½.‚ð,‚ÉC³B
+
+--------------
+//455 by Mr.NO NAME
+ENPC‚Ƃ̃AƒCƒeƒ€ŒðŠ·‚┃‚¢•¨ŠÖŒW‚ÌScript‚ªo—ˆã‚ª‚Á‚½“–‰‚Ì
+@NPCƒf[ƒ^(npc_event_making.txtAnpc_town_geffen.txt“™)‚Éæ‚ÁŽæ‚èAˆÈ‰º‚ðC³B
+ conf/npc_event_ice.txt
+ npc_event_potion.txt
+ npc_town_geffen.txti454ˆÈ‘O‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½Bj
+ map/script.c
+ buildin_checkweight()‚ðC³B
+
+--------------
+//454 by Kuro
+EƒQƒbƒtƒFƒ“’b–艮‚Å”ƒ‚¢•¨‚ªo—ˆ‚é‚悤‚ÉC³
+ conf/npc_town_geffen.txt
+
+--------------
+//0451 by code
+E ¡X‚Å‚·‚ªƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚ɑΉž(ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Ìdata.grf‚ðadata.grf‚Æ‚µ‚Ägrf-files.txt‚Ìadata‚Ì‚Æ‚±‚ë‚É‘‚¢‚Ä‚­‚¾‚³‚¢)
+ common/grfio.c
+ grfio_setadatafile()’ljÁ
+ /grfio.h
+ grfio_setadatafile()’ljÁ
+ conf/map_athena.conf
+ ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚̃}ƒbƒv‚ð“Ç‚Ýž‚ނ悤‚É•ÏX
+ /npc_warp_a.txt
+ ƒ¿ƒ}ƒbƒv‚̃[ƒvƒ|ƒCƒ“ƒg‚ÌÝ’è(‚¿‚å‚Á‚Æ‚¸‚ê‚Ä‚é‚©‚à)
+ /grf-files.txt
+ ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Ìdata.grf‚ðadata.grf‚Æ‚µ‚Ä“Ç‚Ýž‚ނ悤‚ÉÝ’è
+ adata: ‚É‹Lq
+¦ƒ¿ƒNƒ‰ƒCƒAƒ“ƒg‚Í
+@ttp://www.castledragmire.com/ragnarok/
+@‚ ‚½‚è‚©‚ç“üŽè‚µ‚Ä‚­‚¾‚³‚¢B
+
+--------------
+//0450 by hoenny
+E ‹R•ºC—ûŽÀ‘•
+E ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒgŽÀ‘•
+E ƒfƒBƒXƒJƒEƒ“ƒgEƒI[ƒo[ƒ`ƒƒ[ƒWC³(”‚ª‚‚¢ê‡ŒvŽZ–@‚ªŠÔˆá‚Á‚½‚±‚Ƃ𒼂µ‚Ü‚µ‚½.)
+E “SŒC³(‘fŽè‚ÈŽž‚à“K—p‚³‚ê‚é‚悤‚É)
+E •€C—ûC³(•ÐŽè•€‚ÈŽž‚à“K—p‚³‚ê‚é‚悤‚É)
+E ƒ{ƒ“ƒSƒ“‚ªUŒ‚‚·‚é‚悤‚ÉC³
+ map/pc.c
+ pc_calcstatus()C³
+ pc_modifybuyvalue()C³
+ pc_modifysellvalue()C³
+ map/battle.c
+ battle_addmastery()C³
+ db/mob_db.txt
+ ƒ{ƒ“ƒSƒ“C³
+
+--------------
+//0449 by Ž€_
+
+E•Ï‚É‚È‚Á‚½ŠC³B
+ const.txt
+ bAtk‚ÆbDef ’ljÁB
+ battle.c
+ battle_calc_weapon_attack()‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0445‚Ì•¨)
+ map.h
+ map_session_data‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0445‚Ì•¨)
+ pc.c
+ pc_calcstatus() C³B
+ pc_bonus() C³B
+ item_db.txt‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B(0446‚Ì•¨)
+
+--------------
+//0448 by hoenny
+E‘‘¬C³(pc_walk()‚©‚ç pc_calcstatus()‚Ɉړ®)
+Eő劎—ÊC³
+ map/pc.c
+ pc_calcstatus()C³B
+
+--------------
+//0447 by ‚䂤
+E“ñ“—¬E–î‚Ì‘®«‚𳂵‚­“K‰ž
+EATK‚Ìオ‚éƒJ[ƒh‚ÌŒø‰Ê‚ð•ŠíƒTƒCƒYC³‚È‚µ‚Ì’êã‚°‚É•ÏX
+EATKEDEF‚Ìオ‚éƒJ[ƒh‚ÌŒø‰Ê‚Ì“K‰ž‚ÌŽd•û‚ð•ÏX
+
+map.h
+ map_session_data‚Écatk(ƒJ[ƒhATK)‚ð’ljÁ
+
+pc.c
+ pc_calcstatus()
+ ƒAƒTƒVƒ“‚Ì“ñ“—¬‚ÌUŒ‚‘¬“x‚ðC³‚µ‚½
+ ƒXƒNƒŠƒvƒg‚É‚æ‚é‘®«‚ð¶‰E³‚µ‚­“K‰ž‚·‚é‚悤‚É‚µ‚½
+ –î‚Ì‘®«‚𳂵‚­“K‰ž‚·‚é‚悤‚É‚µ‚½i‹|‚Ì‘®«—Dæj
+ ‚½‚¾‚µA–‚·‚ׂĂÌUŒ‚‚É“K‰ž‚³‚ê‚Ü‚·
+ ƒJ[ƒhATK‚̈—‚ð’ljÁ‚µ‚½
+
+battle.c
+ battle_calc_weapon_attack()
+ ƒJ[ƒgATK‚ð’êã‚°ƒ_ƒ[ƒW‚Æ‚µ‚ÄŒvŽZ‚·‚é‚悤‚É‚µ‚½
+
+item_db.txt
+ ƒJ[ƒh‚Ì bonus bAtkAbDef ‚ðíœ
+ ‚©‚í‚è‚ÉA‘•”õ‚Æ“¯—l‚ÉATK‚ÆDEF‚ðÝ’è
+ i•ÏX‘O‚ðitem_db2.txt‚Æ‚µ‚Ä‚¢‚é‚Ì‚ÅA•s‹ï‡‚ª‚ ‚ê‚Ζ߂µ‚Ä‚­‚¾‚³‚¢j
+
+
+--------------
+//0446 by hoenny
+Eƒ~ƒXƒgƒŒƒXƒJ[ƒhŽÀ‘•B
+EƒXƒLƒ‹Žg—p‚ÌŽžƒWƒFƒ€ƒXƒg[ƒ“Á”ïB
+EƒXƒLƒ‹Žg—p‚ÌŽž‘•”õƒ`ƒFƒbƒNB(ƒnƒ“ƒ}[ƒtƒH[ƒ‹‚¾‚¯C³‚µ‚悤‚Æ‚µ‚½‚ª...)
+Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚͈̔͂𠔼Œa5ƒZƒ‹(‘S25ƒZƒ‹)ƒC³
+ map/skill.c
+ skill_check_condition()C³B
+ skill_castend_pos2()C³B
+
+Eƒ~ƒXƒgƒŒƒXƒJ[ƒhC³B
+ db/item_db.txt
+
+--------------
+//0445 by Aya
+
+EŠî–{ASPD‚ÆŒvŽZˆ—‚ðC³B
+ db/job_db1.txt
+ map/pc.c
+ESPŒW”‚ÆŒvŽZˆ—‚ðC³B
+ db/job_db1.txt
+ map/pc.c
+EƒXƒLƒ‹–¼‚ðenum‚Å錾‚µA‚»‚ê‚ðŽg‚¤‚悤‚É•ÏXB
+ map/skill.h
+ map/battle.c
+ map/pc.c
+ map/skill.c
+EƒŠƒJƒoƒŠ[‚̃XƒLƒ‹ID‚ªƒXƒ[ƒ|ƒCƒYƒ“‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³B
+ map/skill.c
+EW’†—ÍŒüã‚ɃJ[ƒhŒø‰Ê‚ª“K—p‚³‚ê‚Ä‚¢‚½–â‘è‚ÌC³B
+ map/pc.c
+EƒŠƒ€[ƒuƒgƒ‰ƒbƒvAƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒvAƒ|ƒCƒYƒ“ƒŠƒAƒNƒg‚̃^[ƒQƒbƒg‚ðC³B
+ db/skill_db.txt
+EGMƒAƒJƒEƒ“ƒg‚ðjRO‚Ìclientinfo.xml‚©‚ç’ljÁB
+ conf/GM_account.txt
+EwarningC³B
+ map/party.c
+EƒLƒƒƒ‰ƒZƒŒ”FØŽž‚Élogin_id2‚̓`ƒFƒbƒN‚µ‚È‚¢‚悤‚É•ÏXB
+ login/login.c
+Eobject_def.batˆÈŠO‘Sƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh‚ðLF‚É•ÏXB
+E*.cnfƒtƒ@ƒCƒ‹‚ð*.confƒtƒ@ƒCƒ‹‚É–¼‘O•ÏXB
+
+--------------
+//0444 by Ž€_
+
+EGMƒRƒ}ƒ“ƒh‚â@ƒRƒ}ƒ“ƒh‚ɃRƒ}ƒ“ƒh•Ê‚ÉŽg—pƒŒƒxƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏX‚Æ@ƒRƒ}ƒ“ƒh­‚µC³B(@where‚Æ@dayA@night‚ÌC³‚Æ‘¼‚̃Lƒƒƒ‰‚ÉŽg‚¤ƒRƒ}ƒ“ƒh‚Ìê‡GMƒŒƒxƒ‹‚ªŽ©•ªˆÈã‚Ìꇎg‚¦‚È‚¢‚悤‚ÉC³B)
+ atcommand.h C³B
+ atcommand.c C³B
+ clif.c C³B
+ map/makefile C³B
+ map.c
+ do_init() C³B
+ conf/atcommand_athena.cnf ’ljÁB
+Eׂ©‚¢C³B
+ pc.c
+ pc_setghosttimer()Apc_skill() C³B
+ script.c
+ buildin_skill() C³B
+Econf_ref.txt C³B
+Eitem_db.txt
+ ”Þ—‚Ì‘z‚¢C³B
+
+--------------
+//0442 by ŒÓ’±—–
+
+E‘‘¬ƒ|[ƒVƒ‡ƒ“ŽÀ‘•
+ ELv‚âE‹Æ”»’è‚Ís‚¢‚Ü‚¹‚ñ
+
+ (db/)
+ const.txt
+ SC_SpeedPot0,SC_SpeedPot1,SC_SpeedPot2’ljÁ
+ item_db.txt
+ ‘‘¬ƒ|[ƒVƒ‡ƒ“‚̃XƒNƒŠƒvƒg’ljÁ
+ (map/)
+ skill.c
+ skill_status_change_start()C³
+ pc.c
+ pc_calcstatus()C³
+
+EPvPƒVƒXƒeƒ€‚̉¼ŽÀ‘•
+ Epvpƒ}ƒbƒv‚Å‚ÍŽ©“®“I‚ÉAPC‚Ìpvpƒtƒ‰ƒOonA‡ˆÊ’Ê’m‚È‚Ç‚ðs‚¢‚Ü‚·B
+ Eƒ}ƒbƒv‚Épvpƒtƒ‰ƒO‚ð‚‚¯‚éƒTƒ“ƒvƒ‹‚ðnpc_pvp.txt‚Æ‚µ‚Ä“Y•t‚µ‚Ä‚¢‚Ü‚·B
+ Epvp‚ÌÚ‚µ‚¢ƒ‹[ƒ‹‚ª‚æ‚­‚í‚©‚ç‚È‚©‚Á‚½‚Ì‚ÅAŽŸ‚̂悤‚É‚µ‚Ä‚¢‚Ü‚·B
+ Eʼn‚ÌŽ‚¿“_‚Í5“_A“|‚·‚Æ1“_A“|‚³‚ê‚é‚Æ-5“_B
+ E0“_ˆÈ‰º‚ÌPC‚̓ŠƒUƒŒƒNƒVƒ‡ƒ“‚ªŠ|‚©‚ç‚È‚¢
+ EGM‚Ípvpƒ}ƒbƒv‚É‚¢‚Ä‚à‘«Œ³‚ɃT[ƒNƒ‹‚ªoŒ»‚µ‚È‚¢‚悤‚Å‚·B
+ iƒNƒ‰ƒCƒAƒ“ƒg‚ÌŽd—lHj
+ Epvpƒ}ƒbƒv‚Å@pvpoff/@pvp‚·‚é‚Æ‹xŒe‚µ‚½‚èA‹xŒe‚ð‚â‚ß‚½‚è‚Å‚«‚Ü‚·‚ªA
+ Žg—p‚·‚é‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ (conf/)
+ npc_pvp.txt
+ pvpƒtƒ‰ƒO‚ð“ü‚ê‚éƒTƒ“ƒvƒ‹B
+ nosaveƒtƒ‰ƒO‚âŽó‚¯•t‚¯npc‚È‚Ç‚ð’ljÁ‚·‚é‚Æ‚æ‚¢‚ÆŽv‚í‚ê‚éB
+ (map/)
+ clif.c
+ clif_parse_LoadEndAck()C³
+ npc.c
+ npc_parse_mapflag()C³
+ skill.c
+ skill_castend_nodamage_id()C³
+ pc.c
+ pc_damage()ˆø”C³
+ atcommand.c
+ pc_damage()ˆø”C³‚É”º‚¤C³
+ battle.c
+
+E‚»‚Ì‘¼C³
+ E@pvpoff/@pvp‚ŇˆÊ‚âƒT[ƒNƒ‹‚Ì•\Ž¦‚ð‚â‚ß‚½
+ E@jumpto‚ŃXƒy[ƒX‚Ì“ü‚Á‚½ƒLƒƒƒ‰ƒNƒ^[‚àŽw’è‚Å‚«‚é‚悤‚É
+ E@kamibƒRƒ}ƒ“ƒh•œŠˆi•¶Žš“V‚̺j
+ E”ñPVP‚Ì‚Æ‚«‚ÉA‘ÎÛ‚ª“G‚̃XƒLƒ‹Žg—pŽžA“G–¡•û”»’è‚ðs‚¤‚悤‚É
+
+ skill.c
+ skill_castend_id()‚Å“G–¡•û”»’è
+ atcommand.c
+ ŠeƒRƒ}ƒ“ƒhC³
+
+--------------
+//0440 by ’†‚Ìl
+
+E–{‰Æ‚ðÄŒ»‚·‚é•ûŒü‚È‚çˆÓ–¡‚Í‚È‚¢‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ª
+@pc.cuƒXƒNƒŠƒvƒg‚É‚æ‚éƒXƒLƒ‹Š“¾v‚ðŽáŠ±•ÏX‚µ‚Ä
+ ƒJ[ƒh‚É‚æ‚éƒXƒLƒ‹ˆêŽžK“¾‚ÌÛ‚Å‚à1ƒŒƒxƒ‹ˆÈã‚ðÝ’è‚Å‚«‚é‚悤‚É’v‚µ‚Ü‚µ‚½B
+
+@’Pƒ‚É•„†‚ð•Ï‚¦‚Ä‚²‚Ü‚©‚µ‚½‚¾‚¯‚Å‚·‚Ì‚Å
+@•K—v‚É‚ ‚킹‚ÄC³‚ð‚µ‚Ä‰º‚³‚¢B
+
+--------------
+//0439 by hoenny
+Eˆ¢C—…”e–PŒ‚ÌC³B
+ db/skill_db.txt
+Eƒ‚ƒ“ƒXƒ^[î•ñ‚ÌC³B
+ map/clif.c
+EŒ©Ø‚è‚ÌŽÀ‘•B
+ map/pc.c
+
+--------------
+//0438 by ‚`‚Ìl
+EŒÃ–Ø‚ÌŽ}‚ªŽg‚¦‚éꊂð‚m‚o‚bƒXƒNƒŠƒvƒg‚©‚秌ä‰Â”\
+@mapflag‚Énobranch‚Æ‚·‚ê‚΂»‚̃}ƒbƒv‚͌Ö؂̎}Žg—p•s‰Â‚É‚È‚è‚Ü‚·B
+ map.h
+ enum‚ÉMF_NOBRANCH ’ljÁB
+ npc.c
+ npc_parse_mapflag() C³B
+ pc.c
+ pc_useitem() C³B
+ƒ\[ƒX‰˜‚­‚µ‚Ä‚µ‚Ü‚Á‚½‚©‚àEEE.
+•×‹­•s‘«‚Å‚·
+
+--------------
+//0437 by ”g˜Q
+Eitem_db.txt‚̉p–¼‚ð‘å•C³B(s•t‚«‚Æ‚»‚¤‚Å‚È‚¢•Ší‚̉p–¼‚ª‚¢‚‚̊Ԃɂâ‚ç
+@“¯‚¶‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Å‚»‚ê‚𒼂·‚‚¢‚Å‚É‘¼‚Ì•”•ª‚àC³‚µ‚Ü‚µ‚½B
+ ‚Ü‚Á‚½‚­ˆá‚¤–¼‘O‚É‚È‚Á‚Ä‚é‚à‚Ì‚à‚ ‚è‚Ü‚·‚ªA‚±‚Á‚¿‚Ì•û‚ª³‚µ‚¢‚ÆŽv‚¢‚Ü‚·B
+Eitem_purplebox.txt‚ð–{‰ÆŽd—l‚Á‚Û‚­ì¬(‘å‘Ì‚±‚ñ‚ÈŠ´‚¶‚©‚Æ
+EƒAƒ‹ƒxƒ‹ƒ^‚ƃCƒYƒ‹[ƒhNPC‚ðC³
+
+--------------
+//0436 by hoenny
+Emorocc •óΤl‚ÌC³
+ conf/npc_shop.txt
+Eƒnƒ“ƒ}[ƒtƒH[ƒ‹‚ÌŽÀ‘•(AlchemistŽƒ\[ƒX‚ðŽQÆ‚ ‚肪‚Æ‚¤I)
+ map/skill.c
+ˆÈ‘O‚É•¶Žš‰»‚¯‚Í’á‚Ì‚¹‚¢!
+ŽŸ‚©‚ç‹C‚ð•t‚¯‚Ü‚·.
+
+--------------
+//0434 by Avethes
+
+Eƒ^[ƒgƒ‹ƒAƒCƒ‰ƒ“ƒh‚Ös‚­NPCC³
+Eƒ†ƒm[NPCC³
+i‘O‰ñ‚̃oƒO‚Í‚·‚Ý‚Ü‚¹‚ñ‚Å‚µ‚½j
+
+--------------
+//0433 by Ž€_
+
+E»‘¢ƒoƒOC³B
+ ‰½ŒÌ‚©‚Í‚í‚©‚ç‚È‚¢‚ªskill.c‚Ìskill_readdb()‚ª•Ï‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅC³B(Ž©•ª‚ª‚â‚Á‚½C³‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
+ skill.c
+ skill_readdb() C³B
+
+--------------
+//0432 by Ž€_
+
+E0429‚ňꕔ‚̃AƒCƒeƒ€‚̃XƒLƒ‹‚ªo‚È‚¢–â‘èC³B
+ clif.c
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+Eskill.c
+ skill_use_id() C³B(‘債‚½C³‚Å‚Í‚È‚¢‚Å‚·B)
+Eitem_db.txt‚Ì•¶Žš‰»‚¯C³BŒ¾Œêݒ肪“ú–{Œê‚Å‚Í‚È‚¢ê‡•Û‘¶‚·‚鎞‚É‚Í‹C‚ð‚‚¯‚Ü‚µ‚傤B
+EUŒ‚‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚Ì”½Œ‚‚ª‘‚·‚¬‚é–â‘èC³BŽn‚ß‚Ä‚ÌUŒ‚‚ªƒ‚ƒ“ƒXƒ^[‚ÌUŒ‚ƒfƒBƒŒƒC‚ÉŠÖŒW‚È‚­100msŒã‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ÅUŒ‚ƒfƒBƒŒƒC‚ɇ‚킹‚é‚悤‚É•ÏXB(‚½‚¾­‚µ”½Œ‚‚ª’x‚¢‚ÆŽv‚í‚ꂽ‚è‚à‚µ‚Ü‚·‚ª...)
+ mob.c
+ mob_changestate() C³B
+EŽI‚ÉÚ‘±‚·‚éÅ‘ål”‚ðŒˆ‚ß‚é‚悤‚É•ÏXB
+ char.c C³B
+ conf_ref.txt C³B
+ char_athena.cnf C³B
+
+--------------
+//0430 by Avethes
+
+E‚m‚o‚bŠÖŒWB‚Ù‚Æ‚ñ‚ǃeƒXƒgB
+–{‰Æ‰ï˜bî•ñ‚ª‘µ‚¦‚ÎC³B
+
+--------------
+//0429 by Ž€_
+
+EƒMƒ‹ƒh‚̃Œƒxƒ‹ƒAƒbƒv‚ðƒLƒƒƒ‰‚̃Œƒxƒ‹ƒAƒbƒv‚̂悤‚É•ÏXB
+ int_guild.c
+ guild_calcinfo() C³B
+ guild_next_exp() ’ljÁB
+ exp_guild.txt C³B(ƒŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢‚悤‚É‚µ‚½‚¢ƒŒƒxƒ‹‚Ìexp‚É0‚ð“ü‚ê‚ê‚΂»‚êˆÈã‚ɃŒƒxƒ‹‚ªã‚ª‚ç‚È‚­‚È‚è‚Ü‚·B)
+EƒXƒNƒŠƒvƒgresetstatusAresetskill ’ljÁB
+ pc.c
+ pc_resetskill() C³B
+ script.c
+ buildin_resetstatus()Abuildin_resetskill() ’ljÁB
+E0425‚Ì‘±‚«‚Å­‚µC³B
+ clif.c
+ clif_parse_ ‚ð­‚µC³B
+EƒVƒ‡[ƒgƒJƒbƒg‚ÉŠo‚¦‚Ä‚¢‚éƒXƒLƒ‹ƒŒƒxƒ‹ˆÈã‚̃XƒLƒ‹‚ª“o˜^‚³‚ê‚Ä‚¢‚Ä‚àŠo‚¦‚Ä‚¢‚éƒXƒLƒ‹ƒŒƒxƒ‹‚܂ł̃XƒLƒ‹‚ðŽg‚¤‚悤‚É•ÏXB
+ clif.c
+ clif_parse_UseSkillToId()Aclif_parse_UseSkillToPos() C³B
+Eƒƒ‚‚Ìő唂ð10ŒÂ‚É•ÏXB(‚ ‚­‚Ü‚Å‚àŠg’£‚ׂ̈̕¨‚Å‚·B‚Ü‚¾‹@”\‚Í‚µ‚Ü‚¹‚ñB)
+ mmo.h
+ struct mmo_charstatus‚Ìmemo_point‚ð3‚©‚ç10‚É•ÏXB
+ char.c
+ mmo_char_tostr() C³B
+Emob,c
+ mob_once_spawn()Amob_summonslave() C³B(•Ê‚ɈӖ¡‚ª‚ ‚éC³‚¶‚á‚ ‚è‚Ü‚¹‚ñ‚ª...)
+E@monster ƒRƒ}ƒ“ƒh‚ÅÀ•W‚ðŽw’肵‚È‚¢Žžƒ‚ƒ“ƒXƒ^[‚ªˆê‚©Š‚ÉW’†‚µ‚Äo‚é‚Ì‚ðƒLƒƒƒ‰‚Ì10*10ƒ}ƒXˆÈ“à‚Ƀ‰ƒ“ƒ_ƒ€‚ÅŒ»‚ê‚é‚悤‚É•ÏXB
+ atcomand.c C³B
+
+--------------
+//0428 by Avethes
+
+Econf/npc_smilegirl.txt
+ ƒXƒ}ƒCƒ‹ƒ}ƒXƒNƒK[ƒ‹ƒXƒNƒŠƒvƒgB
+ 0427‚Ì‚¨‚©‚µ‚¢•”•ª‚Æ‚©C³B
+ ’ñ‹Ÿ‚³‚ꂽŠe“sŽs‚ÌÀ•W‚É”z’uBiNONAME‚³‚ñ’ñ‹Ÿ‚ ‚肪‚Æ‚¤Ij
+
+--------------
+//0426 by ŒÓ’±—–
+
+EƒAƒCƒeƒ€‚Ì–¼‘O‚ðdata.grf‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
+ itemdb.c‚ÌITEMDB_OVERRIDE_NAME‚ð’è‹`‚µ‚È‚¯‚ê‚Γǂݞ‚Ý‚Ü‚¹‚ñB
+ ITEMDB_OVERRIDE_NAME_VERBOSE‚Íitemdb.txt‚̃fƒoƒO—p‚É‚Ç‚¤‚¼B
+ •’Ê‚Í•Ï‚¦‚é•K—v‚Í‚È‚¢‚ÆŽv‚¤‚Ì‚Åbattle_config‚É‚Í“ü‚ê‚Ä‚¢‚Ü‚¹‚ñB
+
+ itemdb.c
+ itemdb_read_itemnametable()’ljÁ
+ do_init_itemdb()C³
+
+Eƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý•”‚Ì•sˆÀ’è«‚ÌC³(Œ‹\’v–½“I‚¾‚Á‚½‚Ý‚½‚¢‚Å‚·)
+ ‚È‚­‚Ä‚à–â‘è‚È‚¢DBiitem_value_db.txt‚È‚Çj‚̃tƒ@ƒCƒ‹‚ª‚È‚¢ê‡‚É
+ ŽI‚ª—Ž‚¿‚½‚è‚·‚錻ۂª”­¶‚µ‚Ä‚¢‚½ê‡‚Í‚±‚ê‚Å’¼‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ.
+
+ skill.c
+ skill_readdb()‚ÅNULLƒ|ƒCƒ“ƒ^ƒ`ƒFƒbƒN‚ð’ljÁ
+ itemdb.c
+ item_readdb()‚ð•¡”‚É•ª‚¯‚½B
+ ƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý•”‚ð‚P‚‚ɓZ‚ß‚½B
+ do_init_itemdb()C³
+
+Eׂ©‚¢ƒoƒOC³
+ Eƒ[ƒvƒ|[ƒ^ƒ‹‚ÌŠJ‚­‚Ü‚Å‚Ì•b”’²®
+
+ skill.c
+ skill_unitsetting()C³
+
+E‚»‚Ì‘¼C³iby –^MŽj
+ db/job_db1.txt
+ ‚¿‚傱‚Á‚ÆC³
+ db/job_db2.txt
+ 2-2ŽŸE‚Ì‘«‚è‚È‚¢Jobƒ{[ƒiƒX‚ð’ljÁ(ŽQl:R.O.M 776)
+ conf/npc_town_kafra.txt
+ ƒI[ƒND‘O‚Æ’Yz‘O‚ɃJƒvƒ‰”z’u(“®ì–¢Šm”F)
+ conf/npc_shop3.txt
+ ƒWƒ…[ƒm”Ì”„NPC(E‚¢•¨)
+ conf/npc_town_yuno.txt
+ ƒWƒ…[ƒmNPC(E‚¢•¨‚ð‰ü—ÇB“®ì–¢Šm”F)
+
+--------------
+//0425 by Ž€_
+
+E0419‚Å‘‚«–Y‚ꂽ•¨‚Å‚·‚ªƒXƒLƒ‹ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“‚ªSP‰ñ•œƒAƒCƒeƒ€‚É‚àŒø‰Ê‚ª‚ ‚é‚悤‚É•ÏXB
+E¡“x‚̓oƒOC³‚ªƒƒCƒ“‚Å‚·BŽI—Ž‚¿‚ª‚È‚è‚»‚¤‚ÈŠ‚ÌC³‚ƃeƒŒƒ|[ƒg‚ÌŽžŽ€‚ñ‚¾‚܂܈ړ®‚Å‚«‚é–â‘è‚Æ0419‚ŃAƒNƒeƒBƒuƒ‚ƒ“ƒXƒ^[‚ÌæU–â‘èC³AŽ€‚ñ‚Å‚¢‚é‚Ì‚É‘¼‚Ìl‚É‚ÍŽ€‚ñ‚¾‚悤‚ÉŒ©‚¦‚È‚¢–â‘è‚ÌC³‚Å‚·B­‚µƒeƒXƒg‚Í‚µ‚Ü‚µ‚½‚ª–{“–‚ÉŽ¡‚Á‚½‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·B•ñ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ pc.c
+ pc_attack_timer()Apc_damage()Apc_walk() C³B
+ map.c
+ map_quit() C³B
+ mob_db.txt
+ ƒrƒbƒOƒtƒbƒg‚Ìmode‚ðC³(ƒAƒNƒeƒBƒu‚É‚È‚Á‚Ä‚¢‚½ˆ×)
+ clif.c
+ clif_parse_WalkToXY()Aclif_pcoutsight()Aclif_pcinsight()A
+ clif_getareachar_pc()Aclif_getareachar_mob()Aclif_getareachar_pet() C³B
+ mob.c
+ mob_ai_sub_hard_activesearch()Amob_ai_sub_hard_mastersearch()A
+ mob_walk() C³B
+ pet.c
+ pet_walk() C³B
+
+--------------
+//0424 by hoenny
+
+EƒNƒŠƒbƒvƒ{[ƒiƒX SP 10’ljÁ
+ db/item_db.txt
+Ewarp_test_yuno.txt‚ð npc_warp30.txt‚ÉŠÜ‚ñ‚Å, ‚¿‚å‚Á‚ÆC³
+ conf/npc_warp30.txt
+E‘¼‚̃T[ƒo[‚ª—Ž‚¿‚Ä‚à•œ‹Œ‚³‚ê‚é‚悤‚ÉC³
+ /startƒNƒŠƒbƒv
+
+--------------
+//0420 by g—t
+
+EEP 3.0‚ł̃J[ƒhŒø‰Ê•ÏX‚ɉð‚é”͈͂őΉžB
+@‚Ù‚Ú‘S‚Ä‚Ì•ÏX“_‚ɂ‚¢‚ÄAo—ˆ‚éŒÀ‚èC³‚µ‚Ä‚ ‚è‚Ü‚·B
+@ATKC³‚ª³‚µ‚­“K—p‚³‚ê‚Ä‚¢‚é‚悤‚Ȃ̂ŒljÁ‚µ‚Ä‚ ‚è‚Ü‚·B(ƒAƒ“ƒhƒŒC‚È‚Ç)
+
+--------------
+//0419 by Ž€_
+
+E0414‚Å‘‚«–Y‚ꂽ•¨‚Å‚·‚ª MOB‚Ìmode‚Å0x20(32)‚𕜊ˆ‚³‚¹‚Ü‚µ‚½Bƒ{ƒX‚¶‚á‚È‚­‚Ä‚àmode‚É0x20‚ª“ü‚Á‚Ä‚¢‚éꇕ’Ê‚ÌMOB‚Å‚àŽ€‚ñ‚¾‚Ó‚è‚ð”j‚ê‚Ü‚·B
+(¡‚ÌŠ‹@”\‚Í‚»‚ꂾ‚¯‚Å‚·B–{ŽI‚ÍAI‹­‰»‚Ý‚½‚¢‚Å‚·‚ª...) ‚½‚¾ƒS[ƒXƒg‚̓{ƒX‚Å‚à”j‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+‚»‚ê‚ÆŽæ‚芪‚«‚ÌAI‚ÅŽæ‚芪‚«‚ªƒ^[ƒQƒbƒg‚µ‚½ŽžŽå‚ªƒ^[ƒQƒbƒg‚µ‚Ä‚È‚¢‚Ǝ傪Žæ‚芪‚«‚̃^[ƒQƒbƒg‚ðƒ^[ƒQƒbƒg‚·‚é•”•ª‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½B(‚±‚ꂪ–{ŽI‚É‚ ‚Á‚Ä‚¢‚é‚ÆŽv‚¢‚Ü‚µ‚½‚Ì‚Å...)
+EŒÃ‚¢Â‚¢” AŒÃ‚¢Ž‡F‚Ì” AŒÃ‚¢ƒJ[ƒh’Ÿ‚Åo‚éƒAƒCƒeƒ€‚ðƒtƒ@ƒCƒ‹‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB
+ script.c
+ buildin_getitem() C³B
+ item_db.txt
+ ŒÃ‚¢Â‚¢” AŒÃ‚¢Ž‡F‚Ì” AŒÃ‚¢ƒJ[ƒh’ŸC³B
+ item_bluebox.txtAitem_purplebox.txtAitem_cardalbum.txt ’ljÁB(Žg—p—á’ö“x‚Ì•¨‚Å‚·B‚ǂ̃AƒCƒeƒ€‚ªo‚é‚悤‚É‚·‚é‚©‚ÍŽ©•ª‚Åݒ肵‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B‚½‚¾ƒNƒ‰ƒCƒAƒ“ƒg‚ð—Ž‚Æ‚·ƒAƒCƒeƒ€‚Ío‚È‚¢‚悤‚Éݒ肵‚Ä‚­‚¾‚³‚¢B)
+ itemdb.h
+ struct random_item_data ’ljÁB
+ itemdb.c
+ itemdb_searchrandomid()Aitemdb_readdb() C³B
+Emob.c
+ mob_target()Amob_ai_sub_hard() C³B(–â‘肪‚ ‚è‚»‚¤‚È•”•ª‚¾‚¯C³B)
+Epc.c
+ pc_itemheal()Apc_walktoxy_sub() C³B
+Eƒyƒbƒg‚ÌoŒ»‚ðMOB‚Æ“¯‚¶‚悤‚É•ÏXB
+ clif.c
+ clif_spawnpet() C³B
+ pet.c
+ pet_change_name() C³B
+E0418‚ð­‚µC³B(if•¶‚ÌðŒ‚ð­‚µC³‚µ‚½‚¾‚¯‚Å‚·B)
+
+--------------
+
+//0418 by hoenny
+E /mm(/mapmove) /nb /b /bb /resetskill /resetstate GM –½—ߌêŽg—p‚̧ŒÀ
+clif_parse_MapMove ,clif_parse_ResetChar ,clif_parse_GMmessage C³
+ map/clif.c
+
+--------------
+//0417 by ‚ê‚ 
+
+E0412‚Åitem_db.txt‚ª‚¨‚©‚µ‚­‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
+
+--------------
+//0416 by g—t
+
+EƒWƒ…ƒm[Žü•Ó‚̃[ƒv’è‹`‚Æ“G‚Ì”z’uB
+@ƒ[ƒv’è‹`‚Ínpc_warp30.txt‚Æ‚µA’ljÁ‚·‚éŒ`‚É‚µ‚Ä‚ ‚è‚Ü‚·B
+@“G‚Ì”z’u‚ɂ‚¢‚Ä‚ànpc_monster.txt‚Æ‚Í“‡‚¹‚¸Anpc_monster30.txt‚Æ‚µ‚Ä‚ ‚è‚Ü‚·B
+@–â‘肪–³‚¢‚悤‚Å‚ ‚ê‚Γ‡‚µ‚ĉº‚³‚¢B
+Eã‹L’è‹`ƒtƒ@ƒCƒ‹’ljÁ‚É]‚¢map_athena.cnf‚ð•ÏXB
+E@goƒRƒ}ƒ“ƒh‚ÖƒWƒ…ƒm[’ljÁB
+@—v–]‚ª‚ ‚Á‚½‚悤‚Ȃ̂ŒljÁ‚µ‚Ü‚µ‚½B
+
+--------------
+//0415 by ’†‚Ìl
+
+E¡‚Í–S‚«‹ŒROƒGƒ~ƒ…ŽIŠJ”­ƒXƒŒƒbƒh Lv02‚Å‚ÌŽ€_Ž‚Ìà–¾‚É]‚Á‚Ä
+@ƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^‚ðŽáŠ±•ÏX‚³‚¹‚Ä’¸‚«‚Ü‚µ‚½B
+ E‰ß‹Ž‚Ìnpc_monster.txt‚©‚ç’Êíƒ}ƒbƒvãiƒ‹ƒeƒBƒG“™œ‚­j‚É‚¢‚éƒTƒ“ƒ^ƒ|ƒŠƒ“AƒAƒ“ƒ\ƒj‚ð’Šo‚µ
+ @V‚½‚Éì‚Á‚½unpc_x-masmonster.txtv‚Ɉړ]
+ Eã‹L‚ÌC³‚É‚ ‚킹‚Ämap_athena.cnf‚ðC³B
+ @map_athena‚ɃRƒƒ“ƒgƒAƒEƒgó‘Ô‚Åunpc: conf/npc_x-masmonster.txtv‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ @•K—v‚É‚ ‚킹‚ăRƒƒ“ƒgƒAƒEƒg‚ð‚µ‚Ä‰º‚³‚¢B
+
+--------------
+//0414 by Ž€_
+
+Estrcasecmp‚ðstrcmpi‚É•ÏXB
+Edb‚âÝ’èƒtƒ@ƒCƒ‹‚ð“Ç‚ÞŽž// ‚ðƒRƒ}ƒ“ƒgƒAƒEƒg‚Æ‚µ‚Ä”FŽ¯‚·‚é‚悤‚ÉC³B
+Eƒyƒbƒg‚Æ—£‚ê‚·‚¬‚é‚ƃyƒbƒg‚ª‘‚­“®‚­‚悤‚É•ÏXB(ƒLƒƒƒ‰‚Ì2”{‚Ì‘¬“x‚Å“®‚«‚Ü‚·B)
+Eƒ‹[ƒgƒ‚ƒ“ƒXƒ^[‚ªƒAƒCƒeƒ€‚ðƒ^[ƒQƒbƒg‚µ‚½ŽžUŒ‚‚ðŽó‚¯‚Ä‚àUŒ‚‚µ‚Ä‚±‚È‚¢–â‘èC³B
+E“¯‘°ƒ‚ƒ“ƒXƒ^[‚ÌAI‚ð•ÏXB¡‚Ü‚Å‚Ítraget_id‚ðŽg‚¤‚¹‚¢‚Ń‚ƒ“ƒXƒ^[‚ªUŒ‚‚µ‚½‘ŠŽè‚ðUŒ‚‚·‚éŽd‘g‚Ý‚¾‚Á‚½‚ª¡“x‚Íattacked_id‚ðŽg‚¤ˆ×UŒ‚‚µ‚Ä‚«‚½‘ŠŽè‚ðUŒ‚‚·‚é‚悤‚É•ÏXB
+‚½‚¾¡‚ÌŽd—l‚¾‚Æ“¯‘°ƒ‚ƒ“ƒXƒ^[‚ðUŒ‚‚µ‚Ä“¦‚°‚éê‡UŒ‚‚ðŽó‚¯‚½Žž‚»‚Ìê‚É‚È‚©‚Á‚½ƒ‚ƒ“ƒXƒ^[‚͂‚¢‚Ä—ˆ‚È‚­‚È‚Á‚Ä‚¢‚Ü‚·B–{ŽI‚ÌŽd—l‚É‚ ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚Í•s–¾‚Å‚·‚Ì‚Åî•ñ’ñ‹Ÿ‚ð‚¨Šè‚¢‚µ‚Ü‚·B(attacked_id‚Í‚¢‚Â‚àƒŠƒZƒbƒg‚³‚ê‚éˆ×‚Å‚·B‘Îô‚ª‚¢‚È‚¢‚킯‚Å‚à‚È‚¢‚Å‚·‚ª–{ŽI‚ÌŽd—l‚ð’m‚ç‚È‚¢‚Ì‚Å...)
+Eƒƒ‚ƒŠ[‚ÌŽg—p—Ê‚ðŒ¸‚ç‚·ˆ×struct mob_data‚Æstruct npc_data‚ð•ÏXB(0412‚Å
+map-server‚̃ƒ‚ƒŠ[‚ÌŽg—p—Ê‚ª164???KBytes‚¾‚Á‚½‚ª0414‚Å‚Í152???KBytes‚É‚È‚è‚Ü‚µ‚½B‚Ù‚ñ‚Ì­‚µŒ¸‚Á‚½‚¾‚¯‚Å‚·‚ª‘‚¦‚é‚æ‚è‚Í‚Ü‚µ‚¾‚ÆŽv‚¢‚Ü‚·‚Ì‚Å...)
+EƒS[ƒXƒgƒ^ƒCƒ€ŽÀ‘•B
+ ƒ}ƒbƒvˆÚ“®‚âƒeƒŒƒ|[ƒgA•œŠˆ‚µ‚½Žž‚É“G‚É‘_‚í‚ê‚È‚¢ŽžŠÔ‚ðd—͂ł̓S[ƒXƒgƒ^ƒCƒ€ŒÄ‚ñ‚Å‚¢‚Ü‚·B‚»‚̃S[ƒXƒgƒ^ƒCƒ€‚ÌŽÀ‘•‚Å‚·B
+battle_athena.cnf‚ÅŽžŠÔ‚ðÝ’è‚Å‚«‚Ü‚·BŽžŠÔ‚ð0‚É‚·‚é‚ƃS[ƒXƒgƒ^ƒCƒ€‚Íì“®‚µ‚Ü‚¹‚ñB‚½‚¾‚±‚̃S[ƒXƒgƒ^ƒCƒ€‚ÍUŒ‚s“®AƒXƒLƒ‹Žg—pAƒAƒCƒeƒ€Žg—p‚ð‚·‚é‚Æ‚È‚­‚È‚è‚Ü‚·B
+ char/int_guild.c
+ char/int_party.c
+ conf/battle_athena.cnf
+ db/mob_db.txt
+ doc/conf_ref.txt
+ login/login.c
+ map/atcommand.c
+ map/battle.c
+ map/battle.h
+ map/clif.c
+ map/itemdb.c
+ map/map.c
+ map/map.h
+ map/mob.c
+ map/npc.c
+ map/pc.c
+ map/pc.h
+ map/pet.c
+ map/skill.c ‚ðC³B(db/mob_db.txt‚Í//‚ð“ü‚ꂽ‚¾‚¯‚Å‚·‚ª...)
+ C³‚µ‚½Š‚ð‘S‚ÄŠo‚¦‚Ä‚Ü‚¹‚ñ‚̂Ńtƒ@ƒCƒ‹‚¾‚¯’m‚点‚Ü‚·B
+
+--------------
+//0412 by ‚¢‚Ç
+
+Eƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^(“ú–{Œê)‚ÌÄ®—
+@ ‹ŒŒfŽ¦”‚Ŏw“E‚Ì‚ ‚Á‚½Ž–€‚ɂ‚¢‚Ä‘å‘͈̂̔͂ÅC³
+ snapshot387‚̃o[ƒWƒ‡ƒ“‚ðƒx[ƒX‚ÉC³‚µ‚Ü‚µ‚½B
+ conf/npc_monster.txt
+
+EƒAƒCƒeƒ€–¼‚Ì’è‹`‚ð‘å•C³
+ (root)
+ item.list
+ (db/)
+ item_db.txt
+ item_value_db.txt
+
+Eƒ}ƒbƒvƒf[ƒ^‚Ì’è‹`‚ŃRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚½ƒWƒ…ƒm[ŠÖ˜Aƒ}ƒbƒv‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ
+ conf/map_athena.cnf
+
+--------------
+//0411 by Ž€_
+
+EŽIsnapshot‚Å‚·B‚»‚ê‚Ælogin_portAchar_portAmap_port‚Ìݒ肪‚È‚­‚Ä‚à
+ƒfƒtƒHƒ‹ƒg‚Å6900A6121A5121‚ðŽg‚¤‚悤‚É•ÏXB
+Elogin.cAchar.cAchrif.cAclif.c ­‚µC³B
+Econf_ref.txt C³B
+Elogin_port‚ð6900‚©‚瑼‚Ì•¨‚É•Ï‚¦‚½ê‡‚Íclientinfo.xml‚ð•Ï‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B
+
+--------------
+//0410 by Ž€_
+
+GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽÀ‘•B(ƒeƒXƒg‚Í‚µ‚Ä‚Ü‚¹‚ñB@ƒRƒ}ƒ“ƒh‚̓eƒXƒgÏ‚Ý‚Å‚·‚ª...)
+0407‚ÌEXP‚ÉŠÖ‚·‚éC³‚É–â‘肪‚ ‚é‚炵‚¢‚Ì‚ÅC³‚µ‚Ü‚µ‚½B¡“x‚̓eƒXƒgÏ‚Ý‚Å‚·B
+GM‚̃AƒJƒEƒ“ƒgID‚ðÝ’è‚Å‚«‚é‚悤‚É•ÏX‚ÆGM‚ðƒŒƒxƒ‹•Ê‚É•ª‚¯‚é‚悤‚É•ÏXB
+(GM‚̃Œƒxƒ‹‚É‚æ‚é@ƒRƒ}ƒ“ƒh“™‚ɧŒÀ‚ð‚©‚¯‚é‚‚à‚è‚Å‚·‚ª¡§ŒÀ‚ª‚©‚¯‚Ä‚¢‚镨‚Í@kickA@kickall‚Ì‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·B)
+Epc.c
+ pc_readdb()Apc_gainexp()Apc_nextbaseexp()Apc_nextjobexp()A
+ pc_checkbaselevelup()Apc_checkjoblevelup() C³B
+ pc_isGM()Apc_read_gm_account() ’ljÁB
+Epc.h
+ pc_isGM() C³B
+ pc_read_gm_account() ’ljÁB
+Eexp.txt
+ ƒŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢”’l‚ð999999999‚©‚ç0ˆÈ‰º‚É•ÏXB
+ ƒŒƒxƒ‹‚ðã‚°‚éˆ×‚É•K—v‚ÈEXP‚ð999999999ˆÈã‚É‚·‚邱‚Æ‚à‰Â”\B
+Eclif.c
+ clif_GM_kickack()Aclif_GM_kick()Aclif_parse_GMKick() ’ljÁB
+Eclif.h
+ clif_GM_kickack()Aclif_GM_kick() ’ljÁB
+Eatcomand.c
+ strncmpi‚ðstrcmpi‚É•ÏXB
+ @kickA@kickall ƒRƒ}ƒ“ƒh’ljÁB
+ @kick <ƒLƒƒƒ‰–¼>
+ Ž©•ªˆÈŠO‚̃Lƒƒƒ‰‚ÌÚ‘±‚ð‹­§I—¹‚³‚¹‚éB(Ž©•ª‚æ‚èGMƒŒƒxƒ‹‚ª
+ ’á‚¢ƒLƒƒƒ‰‚É‚µ‚©Žg‚¦‚È‚¢BGM‚Å‚Í‚È‚¢ƒLƒƒƒ‰‚ÌGMƒŒƒxƒ‹‚Í0)
+ @kickall
+ ŽI‚ÉÚ‘±‚µ‚Ä‚¢‚é‘S‚ẴLƒƒƒ‰‚ÌÚ‘±‚ð‹­§I—¹‚³‚¹‚éB(Ž©•ª‚Æ
+ GM‚ðŠÜ‚ß‚Ä) ŽIƒ_ƒEƒ“—p‚̃Rƒ}ƒ“ƒh‚Å‚·BGMƒŒƒxƒ‹‚ª99‚¶‚á‚È‚¢‚Æ
+ Žg‚¦‚È‚¢B
+Econf/GM_account.txt ’ljÁB
+ GM‚Æ‚µ‚Ä”FŽ¯‚·‚éƒAƒJƒEƒ“ƒgID‚ðÝ’è‚·‚éƒtƒ@ƒCƒ‹‚Å‚·B
+Emmo.h
+ DEFAULT_WALK_SPEED‚ð140‚©‚ç150‚É•ÏXB(‚±‚ꂪ–{ŽI‚É‚ ‚Á‚Ä‚é”’l
+ ‚Ý‚½‚¢‚Å‚·‚Ì‚Å...)
+ struct gm_account ’ljÁB
+Eclient_packet.txt
+ ƒpƒPƒbƒg0x00cd ’ljÁB
+Elogin_port‚ðcnf‚œǂނ悤‚É•ÏXB(‚½‚¾6900‚©‚çƒ|[ƒg‚ð•Ï‚¦‚é‚ƃNƒ‰ƒCƒAƒ“ƒg‚ª”FŽ¯‚Å‚«‚È‚¢–Í—l‚È‚Ì‚Å–³‘Ê‚È‚±‚Æ‚¾‚Á‚½‚è‚à‚µ‚Ü‚·‚ª...)
+ char.cAlogin.cAchar_athena.cnfAlogin_athena.cnf C³B
+E•’ʂ̃AƒJƒEƒ“ƒg쬂łÍGM‚É‚È‚ê‚È‚¢‚悤‚Élogin.c‚ð•ÏXB
+Elogin/makefileAmap/makefile C³B
+
+--------------
+//0408 by ŒÓ’±—–
+
+E405‚ÌV‚µ‚¢—ƒRƒ}ƒ“ƒh‚ðˆÈ‘O‚Ìatcommand.c‚ÉŽæ‚èž‚Ý‚Ü‚µ‚½B
+ E@kami‚ðC³
+ E@kill,@recall,@charjob,@revive,@charstats,@charoption,@charsave,
+ @night,@day,@doom,@doommap,@raise,@raisemap,@charbaselvl,@charjlvl
+ ‚ð’ljÁ•ƒƒbƒZ[ƒW‚ð“ú–{Œê‚É•ÏX•­‚µC³
+
+ atcommand.c
+ ’ljÁ‚ÆC³
+
+Eˆê•”‚̃XƒLƒ‹‚ÌŒø‰ÊŽÀ‘•
+ E•sŽ€g‚̃W[ƒNƒtƒŠ[ƒhAƒCƒhƒDƒ“‚Ì—ÑŒçAK‰^‚̃LƒXA
+ ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[AƒtƒƒXƒgƒEƒFƒ|ƒ“Aƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[A
+ ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
+
+ map.h
+ struct skill_unit‚Érange‚ð’ljÁB
+ skill.c
+ FXC³
+ skill.h
+ enum‚ÌC³‚È‚Ç
+--------------
+//0407 by Ž€_
+
+Eƒyƒbƒg‚̃oƒOC³B(‚½‚¾Ž©•ª‚ÅÄŒ»‚Å‚«‚È‚©‚Á‚½‚Ì‚Å–â‘è‚É‚È‚è‚»‚¤‚ÈŠ‚¾‚¯C³‚µ‚Ü‚µ‚½B)
+Eƒyƒbƒg‚̈ړ®‘¬“x‚ðpet_db‚ɒljÁB
+ pet.h
+ struct pet_db‚Éspeed’ljÁB
+ pet.c
+ pet_catch_process2()Aread_petdb() C³B
+ pet_db.txt
+ ˆÚ“®‘¬“x’ljÁB
+ (ƒRƒ}ƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚é‚̂̓Wƒ‹ƒ^ƒX‚ƃAƒŠƒX‚Å‚·B•ßŠl—p‚Ì
+ ƒAƒCƒeƒ€‚ª‘¶Ý‚·‚邱‚ƂƃpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚±‚Æ‚©‚çl‚¦‚Ä
+ ’ljÁ‚³‚ê‚é—\’è‚Ì•¨‚Æl‚¦‚ç‚ê‚Ü‚·B‚½‚¾‚»‚̕ߊl—p‚̃AƒCƒeƒ€‚ª
+ ‚ ‚é‚ƃNƒ‰ƒCƒAƒ“ƒg‚ð—Ž‚¿‚Ü‚·‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B’ljÁ‚µ‚Ä‚à
+ ‘䎌‚̓|ƒŠƒ“‚Ì•¨‚Å‚·‚Ì‚Å... •ßŠl—p‚̃AƒCƒeƒ€ˆÈŠO‚Í“K“–‚É“ü‚ꂽ
+ •¨‚Å‚·B)
+Epc.cAclif.c
+ pc_equipitem() C³B
+ clif_parse_EquipItem() C³B
+ pc_equipitem()‚Ì–¢ŠÓ’èƒAƒCƒeƒ€‚̃`ƒFƒbƒN‚ðclif_parse_EquipItem()‚É
+ ˆÚ“®‚µ‚Ü‚µ‚½B(ƒyƒbƒg‚Ì‘•”õ‚à‚ ‚è‚Ü‚·‚Ì‚Å...)
+EƒŒƒxƒ‹‚ð99ˆÈã‚É‚ ‚°‚é‚悤‚É•ÏX‚ÆE‹Æ•Ê‚Ƀx[ƒXƒŒƒxƒ‹‚ÌŒÀŠEƒŒƒxƒ‹‚ðÝ’è‚Å‚«‚é‚悤‚ÉC³B
+ map.h
+ MAX_LEVEL’ljÁB
+ pc.c
+ pc_nextbaseexp(), pc_nextjobexp() C³B
+ pc_readdb() C³B
+Eexp.txt C³BE‹ÆƒŒƒxƒ‹‚Æ“¯‚¶‚悤‚Ƀx[ƒXƒŒƒxƒ‹‚àEXPƒe[ƒuƒ‹‚ð3‚Âì‚è‚Ü‚µ‚½BƒŒƒxƒ‹ƒAƒbƒv‚ðŽ~‚ß‚½‚¢ƒŒƒxƒ‹‚Ìexp‚ð999999999‚É‚·‚ê‚΂»‚êˆÈヌƒxƒ‹‚ªã‚ª‚è‚Ü‚¹‚ñB‚‚܂ènoviceA1ŽŸE‹Æ‚Æ2ŽŸE‹Æ‚̃x[ƒXƒŒƒxƒ‹‚ÌŒÀŠE‚ðˆá‚¤‚悤‚ÉÝ’è‚Å‚«‚Ü‚·B‚»‚µ‚ăx[ƒXƒŒƒxƒ‹99ˆÈã‚Éオ‚é‚悤‚É‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B(exp.txt‚ÌC³‚ª•K—v‚Å‚·‚ª–{ŽI‚ƈႤ‚悤‚Éݒ肵‚½‚¢ê‡‚ÉC³‚µ‚ÄŽg‚Á‚Ä‚­‚¾‚³‚¢B)
+E‘®«‚É‚æ‚é‰ñ•œ‚ðbattle_athena.cnf‚ÅÝ’è‚Å‚«‚é‚悤‚É•ÏXB
+ attr_fix.txt C³B
+ battle.h
+ struct Battle_Config‚Éattr_recover ’ljÁB
+ battle.c
+ battle_config_read() C³B
+ battle_athena.cnf C³B
+Econf_ref.txt C³B
+Eclient_packet.txt C³BƒyƒbƒgƒpƒPƒbƒg’ljÁ‚Æ­‚µC³B
+
+--------------
+//0402 by ŒÓ’±—–
+
+E400‚̃oƒO‚ðˆê•”C³
+ EŠ|‚©‚Á‚Ä‚È‚¢ƒXƒLƒ‹Œø‰Ê‚É‚æ‚éƒXƒe[ƒ^ƒXŒvŽZ‚ªs‚í‚ê‚Ä‚µ‚Ü‚¤ƒoƒOC³
+ EŒø‰ÊC³F‚ ‚­‚Ü‚ÅŒø‰Ê‚ÌŒvŽZ‚ÌC³‚ÅAŽg‚¦‚È‚¢ƒXƒLƒ‹‚ÍŽg‚¦‚Ü‚¹‚ñB
+ ƒXƒsƒAƒNƒBƒbƒPƒ“Aƒvƒƒ”ƒBƒfƒ“ƒXA푾ŒÛ‚Ì‹¿‚«A
+ —[—z‚̃AƒTƒVƒ“ƒNƒƒXAŒû“JA•sŽ€g‚̃W[ƒNƒtƒŠ[ƒhA
+ ƒCƒhƒDƒ“‚Ì—ÑŒçAƒT[ƒrƒXƒtƒH[ƒ†[AK‰^‚̃LƒX
+ EŒø‰Ê’ljÁF‚ ‚­‚Ü‚ÅŒø‰Ê‚ÌŒvŽZ‚̒ljÁ‚ÅAŽg‚¦‚È‚¢ƒXƒLƒ‹‚ÍŽg‚¦‚Ü‚¹‚ñB
+ ƒnƒ~ƒ“ƒOAŽ„‚ð–Y‚ê‚È‚¢‚ÅcAƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö(•ŠíƒŒƒxƒ‹–³Ž‹)A
+ ƒGƒ^[ƒiƒ‹ƒJƒIƒXAƒhƒ‰ƒSƒmƒƒW[
+ EŒø‰Ê•t‰ÁŒn‚Í‚¿‚å‚Á‚Æ‚Å‚à‰ö‚µ‚¢ƒXƒLƒ‹‚Í‘S‚ÄŽg—p‚Å‚«‚È‚¢‚悤‚ÉC³
+ EUŒ‚ŒnƒXƒLƒ‹‚Í‚Ù‚Æ‚ñ‚ÇŒ©‚Ä‚È‚¢‚Ì‚Å‚½‚Ô‚ñƒoƒO‘½‚¢‚Å‚·B
+ E‘S‚Ä–¢ƒeƒXƒg‚Å‚·B‰ö‚µ‚·‚¬‚é•”•ª‚ðC³‚µ‚½‚¾‚¯‚Å‚·B
+
+ map.h
+ MAX_STATUSCHANGE‚ð128‚ÉC³
+ pc.c
+ pc_calcstatus()C³
+ skill.c/skill.h
+ enum‚ðC³
+ skill_status_change_start()C³
+ battle.c
+ battle_calc_weapon_attack()‚È‚ÇC³
+
+--------------
+//0400 by AppleGirl
+
+Can Someone Help Me.
+2-2 Skills added.
+All The Mastery Skills.
+SpearQuicken,Providence
+New Bard Skill Assassin Cross Of Sunset
+Providence
+Frost Joke
+Apple of Idun
+Service For You
+Meteor Strike (Different Style)
+Assassin Cross Of Sunset (not tested)
+All Masteries Done
+Providence
+Musical Strike
+Throw Arrow
+Frost Weapon << (Problems with elements)?
+Flame Launcher << (Problems with elements)?
+Seismic Weapon << (Problems with elements)?
+Lightning Loader << (Problems with elements)?
+Spirit Recovery
+Potion Pitcher (Tato)
+Axe Mastery (Tato)
+Spear Quicken
+Not Totally Working:
+Combo Finish
+Quadruple strike
+Triple Attack
+(skills in skill.c) (need to be finished.)
+CP_ARMOR
+CP_HELM
+CP_SHIELD
+CP_WEAPON
+STRIP_HELM
+STRIP_WEAPON
+STRIP_SHIELD
+STRIP_ARMOR
+
+* “K“–‚Șa–ó *
+2-2ŽŸEƒXƒLƒ‹‚ð’ljÁ‚µ‚Ü‚µ‚½
+‘S‚Ä‚ÌC—ûƒXƒLƒ‹AƒXƒsƒAƒNƒCƒbƒPƒ“Aƒvƒƒ”ƒBƒfƒ“ƒXA
+—[—z‚̃AƒTƒVƒ“ƒNƒƒXi–¢ƒeƒXƒgjAŠ¦‚¢ƒWƒ‡[ƒNAƒCƒhƒDƒ“‚Ì—ÑŒçA
+ƒT[ƒrƒXƒtƒH[ƒ†[AƒƒeƒIƒXƒgƒ‰ƒCƒNi­‚µˆá‚¤jA
+ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒNA–‚¿AƒtƒƒXƒgƒEƒFƒ|ƒ“(‘®«‚ª–â‘è‚ ‚èH)
+ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[(V)AƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“(V)Aƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[(V)
+‘§Aƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[
+Š®‘S‚É‚Í“­‚©‚È‚¢ƒXƒLƒ‹F
+–Ò—´ŒA—øŠÂ‘Sg¶AŽO’i¶
+(skills in skill.c) (Š®—¹‚³‚ê‚é•K—v‚ª‚ ‚é)
+ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒWAƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒWA
+ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒWAƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒWA
+ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€AƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“
+ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒhAƒXƒgƒŠƒbƒvƒA[ƒ}[
+
+*’ˆÓ !! CAUTION !! by ŒÓ’±—–*
+‚±‚Ì400‚ɂ̓oƒO‚ª‘å—Ê‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚·B’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+there are many many BUGS in this update(400) !! Be careful !!
+
+--------------
+//0399 by ŒÓ’±—–
+
+EMOBƒXƒLƒ‹Žg—pðŒ‚âs“®‚ðC³
+ E–³s“®MOB‚ª‘Ò‹@Žž‚̃XƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢–â‘è‚ðC³
+ EðŒƒXƒLƒ‹”½‰ž(skillused)‚ª‚ǂ̃XƒLƒ‹‚É‚à”½‰ž‚µ‚Ä‚¢‚½ƒoƒOC³
+ E”ñˆÚ“®MOB‚ª’ÇŒ‚‚µ‚Ä‚­‚é–â‘è‚ðC³
+
+ mob.c
+ mob_ai_sub_hard()C³
+ mobskill_event()C³
+ mobskill_use()C³
+ skill.c
+ skill_attack()C³
+
+EMOBƒXƒLƒ‹ˆê•”ŽÀ‘•
+ EŽ©Œˆ(ƒGƒtƒFƒNƒg–³‚µ?)AŽ©”šAƒ^ƒoƒR‚ð‹z‚¤A”͈ÍUŒ‚
+ HP‹zŽû‚Q‚Â(’Êí/–‚–@ji‰ñ•œƒGƒtƒFƒNƒg–³‚µ?jŽÀ‘•
+
+ (db)
+ skill_db.txt
+ ƒXƒ‚[ƒLƒ“ƒO‚È‚Ç‚ðC³
+ (map/)
+ skill.c
+ skill_castend_damage_id(),skill_castend_nodamage_id()C³
+ battle.c
+ battle_calc_misc_damage()C³
+
+E–¢ŠÓ’èƒAƒCƒeƒ€‚ª‘•”õ‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
+E–¢ŠÓ’èƒAƒCƒeƒ€‚ɃJ[ƒh‚ª‚³‚¹‚È‚­‚È‚è‚Ü‚µ‚½
+
+ pc.c
+ pc_equipitem(),pc_insert_card()C³
+ clif.c
+ clif_use_card()C³
+
+Ebattle_athena.cnf‚ÉMOB‚Ì”z’uŠ„‡‚ð’è‹`‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ E”z’u”‚ª‚P‚ÌMOB‚ɂ‚¢‚Ä‚Í“K—p‚³‚ê‚Ü‚¹‚ñ
+ EŒvŽZŒã‚Ì”z’u”‚ª‚P–¢–ž‚ÌꇂP‚ÉC³‚³‚ê‚Ü‚·B
+
+ (conf/)
+ battle_athena.cnf
+ mob_count_rate’ljÁ
+ (doc/)
+ conf_ref.txt
+ C³
+ (map/)
+ battle.c/battle.h
+ struct BattleConfig ‚É mob_count_rate ƒƒ“ƒo’ljÁ
+ npc.c
+ npc_parse_mob()‚ÌC³
+
+Eƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…‚ª‘ŠŽè‚ª‚P•C‚Å‚à‚Æ‚è‚ ‚¦‚¸“–‚½‚é‚悤‚É‚È‚Á‚½B
+
+ skill.c
+ skill_castend_damage_id()C³
+
+EŠw¶–X쬃Cƒxƒ“ƒg‚ÌC³
+
+ (conf/)
+ npc_event_making.txt
+ ƒAƒƒGƒxƒ‰(606)‚ðƒAƒƒG(704)‚ÉB
+
+EƒpƒPƒbƒgî•ñC³
+
+ (doc/)
+ client_packet.txt
+ 0199ƒpƒPƒbƒgC³
+
+--------------
+//0397 by ‚¢‚Ç
+
+Eƒ‚ƒ“ƒXƒ^[’è‹`ƒf[ƒ^(“ú–{Œê)‚Ì®—
+ Enpc_monster25.txt‚ðnpc_monster.txt‚ɃŠƒl[ƒ€‚µA“à—e‚ð®—(Œ»Ýmob”:13450)
+ E‚»‚ÌŒy—ʔłƂµ‚Änpc_monster_lite.txt‚ðì¬(Œ»Ýmob”:11959)
+ Eã‹L‚ÌC³‚É‚ ‚킹‚Ämap_athena.cnf‚ðC³
+
+--------------
+//0395 by ŒÓ’±—–
+
+EŽæ‚芪‚«MOB‚Ìs“®C³
+ EƒAƒ“ƒNƒ‹‚Ȃǂňړ®‚Å‚«‚È‚¢ê‡Žå‚ɋ߂©‚È‚¢‚悤‚ÉC³
+ EƒƒbƒN‚µ‚Ä‚¢‚é‚ÆŽå‚ɋߊñ‚鈗‚ð‚µ‚È‚¢‚悤‚ÉC³
+ EŽå‚ªƒeƒŒƒ|[ƒg‚·‚é‚Æ’Ç‚¢‚©‚¯‚é‚悤‚ÉC³(•t‹ß10x10ƒ}ƒX’ö“x)
+ EŽå‚Ì‚»‚΂ɂ¢‚é‚Æ‚«‚̓‰ƒ“ƒ_ƒ€•às‚ð‚µ‚È‚¢‚悤‚ÉC³
+
+ mob.c
+ mob_ai_sub_hard_mastersearch()C³
+ mob_can_move()’ljÁ
+ mob_ai_sub_hard()C³
+
+EMOB‚Ìs“®C³
+ EƒXƒLƒ‹Žg—pƒfƒBƒŒƒCˆ—‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
+ E‰r¥‚Ì‚È‚¢ƒXƒLƒ‹‚Ítimer‚ðŽg‚í‚È‚¢‚悤‚ÉC³(Ž€–SŽžˆ—‘Îô)
+
+ mob.c
+ mobskill_use(),mobskill_use_id()C³
+
+EMOBƒGƒ‚[ƒVƒ‡ƒ“‚ÌŽÀ‘•
+ EƒGƒ‚[ƒVƒ‡ƒ“‚ÌŽí—Þ‚ª‚í‚©‚ç‚È‚¢‚à‚Ì‚Í‘S‚Äu!v‚É‚È‚è‚Ü‚·B
+ ”²‚¯‚Ä‚¢‚éƒf[ƒ^‚ð–„‚ß‚Ä‚­‚ê‚é‚Æ‚¤‚ꂵ‚¢‚Å‚·B
+
+ (db/)
+ mob_skill_db.txt
+ ‚¢‚­‚‚©‚ÌMOB‚̃Gƒ‚[ƒVƒ‡ƒ“‚Ì€–Ú‚Ì’l1‚ÉŽí—Þ‚ð“ü‚ꂽB
+
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()C³
+ clif.c/clif.h
+ clif_emotion()’ljÁ
+
+EƒpƒPƒbƒg‰ðÍ.txt‚ðclient_packet.txt‚ɉü–¼•C³
+
+ (doc/)
+ client_packet.txt
+ ƒGƒ‚[ƒVƒ‡ƒ“‚Ìà–¾’ljÁ
+
+E‚Ç‚¤‚â‚çŽæ‚芪‚«MOB‚ÌŽí—ނ͌¢ƒf[ƒ^‚¾‚Á‚½‚Á‚Û‚¢‚Å‚·B
+ ‚µ‚©‚àMOB¢Š«‚ł͎艺¢Š«‚ƈႤMOB‚𢊫‚·‚é‚Ý‚½‚¢‚Å‚·‚ËB
+ Ú‚µ‚¢l‚Ímob_skill_db.txt‚𒼂µ‚Ä‚­‚ê‚é‚ÆB
+
+--------------
+//0393 by ‚¢‚Ç
+
+EcharŽI‚Å‚ÌloginŽI‚̃|[ƒgÝ’è‚ð6900‚ɌŒ肵A•ÏX‚Å‚«‚È‚¢‚悤‚É‚µ‚½
+@(login‘¤‚Ń|[ƒg6900ŒÅ’è‚É‚È‚Á‚Ä‚¢‚½‚Ì‚Åchar‘¤‚à‚»‚ê‚ɇ‚킹‚Ü‚µ‚½B)
+ char/char.c
+ conf/char_athena.cnf
+ doc/conf_ref.txt
+
+--------------
+//0392 by ŒÓ’±—–
+
+EMOB‚Ìs“®C³
+ E‰½ŒÌ‚©last_thinktick‚ª‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢–â‘èC³
+ Eã‚ÉŠÖ˜A‚µ‚ÄPC‚ª‹ß‚­‚É‚¢‚Ä‚àŽè”²‚«ˆ—‚ªs‚í‚ê‚é–â‘èC³
+ i‚Ç‚¤‚â‚牊ú‚©‚ç‚̃oƒO‚¾‚Á‚½–Í—lH ‚±‚̃oƒO‚ÆA
+ V‚µ‚¢Žè”²‚«ˆ—‚ÌŽd—l‚ªƒ^ƒbƒO‚ð‘g‚ñ‚ÅŽc‘œ‚ðì‚Á‚Ä‚¢‚½–Í—lj
+ EŽæ‚芪‚«MOB—p‚ÌAIˆ—’ljÁi‚Ü‚¾‰ö‚µ‚¢‚Å‚·j
+ EMOB‚̃XƒLƒ‹ƒfƒBƒŒƒC‚ðƒXƒLƒ‹€–Ú‚²‚Æ‚ÉŽ‚‚悤‚É•ÏX
+ EƒXƒLƒ‹ƒfƒBƒŒƒC‚ª‘å‚«‚È€–ڂł̓I[ƒo[ƒtƒ[‚µ‚Ä‚¢‚½–â‘è‚ðC³
+
+ map.h
+ struct mob_data‚Ì skilldelay‚ð”z—ñ‚É‚µ‚Äunsigned int‚É•ÏX
+ mob.h
+ struct mob_skill‚Ìcasttime,delay‚ðint‚É•ÏX
+ mob.c
+ mob_ai_sub_hard_mastersearch()’ljÁ
+ mob_changestate(),mob_delete(),mob_catch_delete(),mob_damage(),
+ mobskill_use(),mobskill_use_id(),mobskill_use_pos(),
+ mobskill_castend_id(),mobskill_castend_pos(),
+ mob_ai_sub_hard(),mob_ai_sub_lazy()‚È‚ÇC³
+
+EMOBƒXƒLƒ‹‚̎艺¢Š«‚ƃ‚ƒ“ƒXƒ^[¢Š«ŽÀ‘•
+ Emob_skill_db.txt‚Ì‘Ž®•ÏXiÅŒã‚É’l‚ð‚P‚’ljÁAŽæ‚芪‚«MOB‚ÌIDj
+ EŽæ‚芪‚«MOB‚ª‚í‚©‚ç‚È‚©‚Á‚½‚à‚̂̓Rƒƒ“ƒg‰»‚µ‚Ä‚¢‚Ü‚·
+ ‚í‚©‚él‚Í“ü—Í‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B
+ EŒ»Ý‚ÍŽæ‚芪‚«‚͈ê“x“|‚µ‚½‚畦‚«‚È‚¨‚µ‚Ü‚¹‚ñB
+ Eƒ{ƒX‚ªƒeƒŒƒ|[ƒg‚µ‚Ä‚àŽæ‚芪‚«‚Í’Ç‚¢‚©‚¯‚Ü‚¹‚ñB
+ E–{ŽI‚Å‚Ç‚¤‚È‚Á‚Ä‚é‚Ì‚©’m‚ç‚È‚¢‚Ì‚ÅAŠÔˆá‚Á‚Ä‚éꇂ͋³‚¦‚Ä‚­‚¾‚³‚¢B
+
+ (db/)
+ mob_skill_db.txt
+ Žè‰º¢Š«‚Ȃǂ̃f[ƒ^C³
+
+ (map/)
+ skill.c
+ skill_castend_nodamage_id()C³
+
+--------------
+//0391 by Ž€_
+
+Eƒyƒbƒg‚̈ړ®’†‚ɃpƒtƒH[ƒ}ƒ“ƒX‚ð‚·‚é‚ƃyƒbƒg‚ª’âŽ~‚·‚é‚悤‚É•ÏXB
+ (ƒyƒbƒg‚̈ʒu‚ª‚¸‚ê‚邽‚ßC³‚µ‚Ü‚µ‚½B)
+ pet.c
+ pet_performance() C³B
+EŽ€‚ñ‚¾ƒ‚ƒ“ƒXƒ^[‚Í‚Ç‚ñ‚Ès“®‚à‚Æ‚ê‚È‚¢‚悤‚É•ÏXB(‚±‚ê‚Å–³“G
+ ƒ‚ƒ“ƒXƒ^[‚ª‚¢‚È‚­‚È‚é‚Æ‚¢‚¢‚Å‚·‚ª...)
+ mob.c
+ mob_changestate(),mob_delete(),mob_catch_delete(),mob_damage(),
+ mob_ai_sub_hard(),mob_ai_sub_lazy() C³B
+EPCANPCA°ƒAƒCƒeƒ€‚ªŽg‚¤ID‚͈̔͂𒲮B
+ °ƒAƒCƒeƒ€‚Í0‚©‚ç500000‚Ü‚Å‚ÅPC‚Í500000‚©‚ç100000000ANPC
+ (ƒ‚ƒ“ƒXƒ^[‚ðŠÜ‚ß‚Ä)‚Í110000000‚©‚ç–ñ21‰­‚Ü‚Å‚É‚È‚è‚Ü‚·B
+ (-‚ðŠÜ‚ß‚é‚Æ‚à‚Á‚Ɣ͈͂ªL‚­‚È‚è‚Ü‚·‚ª‚³‚·‚ª‚É‚»‚±‚Ü‚Å‚Í•K—v‚È‚¢‚Æ
+ Žv‚¢‚Ü‚·‚Ì‚Å...)
+ map.h
+ MAX_FLOORITEM ’ljÁ(‚±‚ê‚ð•Ï‚¦‚é‚Æ°ƒAƒCƒeƒ€‚Ìő唂ð•Ï‚¦‚é
+ ‚±‚Æ‚ª‚Å‚«‚Ü‚·B¡‚Í100000‚É‚È‚Á‚Ä‚¢‚Ü‚·B‚½‚¾‚±‚ê‚Í•K‚¸
+ 500000ˆÈ‰º‚É‚µ‚Ä‚­‚¾‚³‚¢B‚»‚¤‚µ‚È‚¢‚Ƴ‚µ‚­“®‚­‚©‚Ç‚¤‚©
+ •ÛØ‚Å‚«‚Ü‚¹‚ñB)
+ map.c
+ map.h‚ɇ‚킹‚Ä­‚µC³B
+ npc.h
+ START_NPC_NUM ’ljÁB
+ npc.c
+ npc.h‚ɇ‚킹‚Ä­‚µC³B
+ login.h
+ START_ACCOUNT_NUM‚ÆEND_ACCOUNT_NUM ’ljÁB
+ login.c
+ login.h‚ɇ‚킹‚ÄC³BEND_ACCOUNT_NUMˆÈã‚Éaccount‚ð
+ ì‚ê‚È‚¢‚悤‚É•ÏXB
+EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚É•ŠíŒ¤‹†‚ð‚Q‰ñ“K—p‚·‚é‚悤‚É•ÏXB
+ (Œ‹‹Ç‚ÍŒ³‚É–ß‚·‚±‚Æ‚É‚È‚è‚Ü‚µ‚½...^^;)
+ battle.c
+ Damage battle_calc_weapon_attack() C³B
+Emob‚̃XƒLƒ‹Žg—p‚ðbattle_athena.cnf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB
+ mob.c
+ mobskill_use() C³B
+ battle.h
+ battle.c
+ struct Battle_Config‚Émob_skill_use’ljÁB
+ battle_athena.cnf
+ mob_skill_use’ljÁB(ݒ肵‚È‚¢‚Æno‚Å‚·B)
+Ebattle_athena.cnf
+ mob‚ð“ñd‚Å“Ç‚ß‚È‚¢‚悤‚Énpc: conf/npc_monster.txt‚ðíœB
+ (ÅV‚Ínpc_monster25.txt‚È‚Ì‚Å...)
+
+--------------
+//390 by ŒÓ’±—–
+
+Eƒo[ƒWƒ‡ƒ“î•ñŠ“¾•”•ª‚ð­‚µ•ÏX
+ EMODƒo[ƒWƒ‡ƒ“‚ð’è‹`‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½BÚׂÍversion.h‚ðB
+ ‹C‚ªŒü‚¢‚½‚Æ‚«‚©A‘å‚«‚ÈXV‚ª‚ ‚é‚Æ‚«‚È‚Ç‚É•ÏX‚µ‚Ä‚­‚¾‚³‚¢B
+ Eƒo[ƒWƒ‡ƒ“checkŽž‚Ìset eofƒƒO‚ªo‚È‚¢‚悤‚ɃpƒPƒbƒg7532’ljÁB
+
+ (common/)
+ version.h
+ MODƒo[ƒWƒ‡ƒ“‚ð’è‹`‚Å‚«‚é‚悤‚ÉB
+ (tool/)
+ checkversion
+ MODƒo[ƒWƒ‡ƒ“‚ð•\Ž¦‚·‚é‚悤‚ÉB
+ (login/char/map)
+ login.c/char.c/clif.c
+ MODƒo[ƒWƒ‡ƒ“‚̈—’ljÁA
+ ƒpƒPƒbƒg7532iØ’fjˆ—’ljÁB
+
+E‚»‚Ì‘¼FXC³
+ E‚±‚Ü‚²‚Ü‚µ‚½C³‚΂©‚è‚Å‚·‚ªA‚ ‚Ü‚èŠo‚¦‚Ä‚¢‚Ü‚¹‚ñB
+ EMOBƒXƒLƒ‹ðŒ‚Åslavelt,attackpcgtˆ—ŽÀ‘•i–¢ƒeƒXƒgjB
+ EMOB‚̎艺¢Š«‚Ì‚½‚ß‚Ì‹@\’ljÁi‚Ü‚¾¢Š«‚Å‚«‚Ü‚¹‚ñjB
+ E”͈̓XƒLƒ‹Œø‰Ê”͈͂Ɏ€–SPC‚ª‚¢‚é‚ÆŽI‚ª—Ž‚¿‚éƒoƒOC³B
+ EMOBŽc‘œ‚ªo‚È‚­c‚È‚Á‚Ä‚½‚ç‚¢‚¢‚ÈB
+
+ (map/)
+ mob.c/mob.h/map.h/battle.c
+ FX’ljÁ
+
+ (db/)
+ mob_skill_db.txt
+ ƒ‹[ƒgŽžˆ—‚ÆA‘®«•ÏXƒXƒLƒ‹‚̃Rƒƒ“ƒg‚ðŠO‚µ‚½B
+ i‘®«•ÏX‚Í–{ŽI‚Å“®‚¢‚Ä‚È‚¢‚炵‚¢‚à‚Ì‚àƒRƒƒ“ƒg‚ðŠO‚µ‚Ä‚Ü‚·B
+ –â‘肪‚ ‚éꇂÍĂуRƒƒ“ƒg‰»‚µ‚Ä‚­‚¾‚³‚¢j
+
+--------------
+//389 by ‚¢‚Ç
+
+E388‚Ì•ÏX
+ ƒo[ƒWƒ‡ƒ“î•ñ‚ðcommon/version.h“à‚̒蔂ðŽg—p‚·‚é‚悤‚É•ÏX
+
+--------------
+//388 by ŒÓ’±—–
+
+Eƒo[ƒWƒ‡ƒ“î•ñŠ“¾ƒc[ƒ‹“Y•t
+ Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
+ Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
+ Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
+
+ ƒo[ƒWƒ‡ƒ“‚ðŠm”F‚·‚é—p“r‚æ‚è‚ÍAƒT[ƒo[‚̶‘¶Šm”F—p‚Æ‚¢‚Á‚½‚©‚ñ‚¶‚Å‚·
+ ƒpƒPƒbƒg7530/7531‚ÌÚׂ̓\[ƒX‚ðŒ©‚Ä‚­‚¾‚³‚¢B
+
+ (tool/)
+ checkversion
+ ƒo[ƒWƒ‡ƒ“Šm”Fƒc[ƒ‹PerlƒXƒNƒŠƒvƒg
+
+ (login/)
+ login.c
+ ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
+ (char/)
+ char.c
+ ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
+ (map/)
+ clif.c
+ ƒpƒPƒbƒg7530/7531‚̈—’ljÁ
+
+E384ˆÈ‘O‚Ìathena.txt‚à“Ç‚Ýž‚ß‚é‚悤‚É‚µ‚Ü‚µ‚½
+ Econvert‚ª–Ê“|‚ÈlŒü‚¯B
+ E³‚µ‚­“Ç‚Ýž‚ß‚é•ÛØ–³‚µBƒoƒbƒNƒAƒbƒv‚ð–Y‚ꂸ‚ÉB
+
+ (char/)
+ char.c
+ 384‚Ì•ûŽ®‚Å“Ç‚Ýž‚ß‚È‚¢ƒf[ƒ^‚Í384ˆÈ‘O‚Ì•ûŽ®‚àŽŽ‚·‚悤‚ÉB
+
+Econf_ref.txt/help.txt/getaccountC³
+ help.txt
+ petƒRƒ}ƒ“ƒh‚Ìà–¾’ljÁ
+ (doc/)
+ conf_ref.txt
+ petŠÖ˜A‚ÌÝ’è‚Ìà–¾’ljÁ
+ (tool/)
+ getlogincount
+ •\Ž¦‚ÌC³
+
+--------------
+//387 by ‚¢‚Ç
+EconfƒtƒHƒ‹ƒ_“à‚ÌNPC’è‹`ƒf[ƒ^‚Ì®—
+ ˆÈ‰º‚̃tƒ@ƒCƒ‹‚ð휂µ‚Ü‚µ‚½
+ npc_kafraJ.txt
+ npc_mind_prtmons.txt
+ npc_script2J.txt(npc_event_mobtim.txt‚É“¯‚¶‚à‚Ì‚ª‚ ‚Á‚½‚½‚ß)
+ npc_testJ.txt(‚Ù‚Ú“¯‚¶‚±‚Æ‚ª@ƒRƒ}ƒ“ƒh‚Åo—ˆ‚邽‚ß)
+ npc_warp25.txt(npc_warp.txt‚É“‡)
+
+ ˆÈ‰º‚̃tƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚µ‚½
+ npc_monster3.txt -> nop_monster2E.txt
+ npc_monster3J.txt -> npc_monster25.txt
+ npc_monster.txt -> npc_monsterE.txt
+ npc_monsterJ.txt -> npc_monster.txt
+ npc_sampleJ.txt -> npc_sample.txt
+ npc_script3j.txt -> npc_script2.txt
+ npc_script25J.txt -> npc_town_lutie.txt
+ npc_shop1J.txt -> npc_shop_test.txt
+ npc_shop2J.txt -> npc_shop_mobtim.txt
+ npc_shop3J.txt -> npc_shop2.txt
+ npc_shop.txt -> npc_shopE.txt
+ npc_shopJ.txt -> npc_shop.txt
+ npc_testJ.txt -> npc_test.txt
+ npc_warp3.txt -> npc_warp2.txt
+ npc_warp4.txt -> npc_warp25.txt
+
+Eƒ}ƒbƒv’è‹`‚̒ljÁ
+ ƒWƒ…ƒm[ƒAƒbƒvƒf[ƒg‚ŒljÁ‚³‚ê‚éƒ}ƒbƒv‚ÆAŠØŽI“ÆŽ©(?)‚̃NƒCƒYƒ][ƒ“
+ (ƒRƒ‚ƒhƒAƒbƒvƒf[ƒg)‚Æ“V’ÃAƒbƒvƒf[ƒg‚̃}ƒbƒv’è‹`‚ð’ljÁ
+ Œ»ÝA“úˆÆ‚É–³‚¢‚à‚Ì‚ÉŠÖ‚µ‚Ă̓Rƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚¢‚ÜB
+ conf/map_athena.cnf
+
+--------------
+//385 by ŒÓ’±—–
+
+EMOB‚Ìs“®C³
+ EŽè”²‚«ˆ—‚ňړ®‚µ‚È‚¢ƒ‚[ƒh‚ÌMOB‚à•à‚­–â‘èC³
+ EMOB‚ð“|‚µ‚½‚Æ‚«AÄspawnŽž‚ª‚¨‚©‚µ‚È’l‚É‚È‚éꇂª‚ ‚é–â‘èC³
+ iMOB‚ª•¦‚©‚È‚­‚È‚é–â‘肪C³‚³‚ꂽ‚Í‚¸j
+ EMOB‚̃[ƒv‚ÅꊌŸõ‚É1000‰ñŽ¸”s‚µ‚½‚猳‚ÌꊂÉo‚é‚悤‚ÉC³
+ EMOB‚ð‰r¥’†‚É“|‚·‚ÆAƒ^ƒCƒ}[‚ð휂·‚é‚悤‚ÉC³
+
+ mob.c
+ mob_delete(),mob_catch(),mob_damage(),
+ mob_ai_sub_lazy(),mob_ai_sub_hard()‚È‚ÇC³
+ mobskill_deltimer()’ljÁ
+
+--------------
+//0384 by Ž€_
+
+EƒyƒbƒgŽÀ‘•B
+Žv‚Á‚½‚æ‚è’·‚­‚©‚©‚è‚Ü‚µ‚½BˆêŽü‚à‚©‚©‚Á‚½‚¹‚¢‚ʼn½ˆ‚ðC³‚µ‚½‚©
+Šo‚¦‚Ä‚È‚¢–â‘肪‚ ‚è‚Ü‚·‚ª... ‚»‚ê‚Å”O‚ׂ̈Émap‚Æchar‚̃tƒ@ƒCƒ‹‚Í‘S‚Ä
+ŠÜ‚߂ăAƒbƒv‚µ‚Ü‚·B
+‚»‚ê‚Æmakefile‚Æathena.sh‚ÍŽ©•ª‚ªŽg‚Ä‚¢‚镨‚Å‚·B
+Yare-launcher‚ÍŽg‚Ä‚Ü‚¹‚ñ‚ª‚¢‚‚àŽI‚ÌŽÀsƒtƒ@ƒCƒ‹‚ÅŽÀs‚µ‚Ä‚¢‚Ü‚·‚Ì‚Å...
+ char/char.cAchar/char.hAchar/inter.cAchar/makefile C³B
+ char/int_pet.cAchar/int_pet.h ’ljÁB
+ map/makefile C³B
+ map/intif.cAmap/intif.hAmap/map.cAmap/map.hAmap/mob.cAmap/mob.hA
+ map/npc.cAmap/npc.hAmap/battle.cAmap/battle.hAatcomand.cAmap/pc.cA
+ map/clif.cAmap/clif.hAmap/script.c FXC³B
+ map/pet.cAmap/pet.h ‚Í–w‚Ç‚ðŽ©•ª‚Ì•¨‚É‘‚«Š·‚¦‚Ü‚µ‚½B
+ common/mmo.h C³B
+ db/pet_db.txt C³B
+ db/item_db.txt C³B(Œg‘Ñ—‘›z‰»‹@‚Ìbpet ƒXƒNƒŠƒvƒg‚ª”²‚¯‚Ä‚¢‚½‚Ì‚Å
+ “ü‚ꂽ‚¾‚¯‚Å‚·‚ª...)
+ doc/INTERŽIƒpƒPƒbƒg.txt‚Ì–¼‘O‚ðinter_server_packet.txt‚É•ÏX‚ƃyƒbƒg‚Ì
+ •Û‘¶“™‚ÉŽg‚¤ƒpƒPƒbƒg‚ð’ljÁB
+* ¡“x‚̃yƒbƒgŽÀ‘•‚É‚æ‚èƒLƒƒƒ‰ƒtƒ@ƒCƒ‹‚Ì\‘¢‚ª•Ï‚í‚èˆÈ‘O‚Ì•¨‚ƌ݊·‚Å‚«‚È‚¢
+ ‚Ì‚Å tool/convert.c ‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ ’P“ƂŃRƒ“ƒpƒCƒ‹‚Å‚«‚Ü‚·‚̂ŃRƒ“ƒpƒCƒ‹‚µ‚½‚ ‚ÆŽÀs‚µ‚ăLƒƒƒ‰
+ ƒtƒ@ƒCƒ‹‚ð•ÏŠ·‚µ‚Ä‚­‚¾‚³‚¢B‚»‚¤‚µ‚È‚¢‚ƃLƒƒƒ‰‚ª‘S•””ò‚Ñ‚Ü‚·‚Ì‚Å...
+* ƒyƒbƒg‚Ìe–§“x‚ª0‚É‚È‚é‚ƃyƒbƒg‚Í‚»‚Ìê‚Å“®‚¯‚È‚­‚È‚è‚»‚Ìó‘Ô‚Å‘¼‚Ì
+ ƒ}ƒbƒv‚Ɉړ®‚·‚é‚©I—¹‚·‚é‚ƃyƒbƒg‚ÍÁ–Å‚µ‚Ü‚·Bˆê‰žƒyƒbƒg‚Ì“¦‘–‚ð
+ ŽÀ‘•‚·‚é‚‚à‚è‚Åì‚Á‚½‚Ì‚Å‚·‚ª–{ŽI‚É‚ ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB
+* ˆÚ“®‘¬“x‚ª’x‚¢ƒyƒbƒg‚Ìꇗ£‚ê‰ß‚¬‚é‚Ƃ‚¢‚Ä—ˆ‚ê‚È‚­‚È‚è‚Ü‚·B‚Å‚à
+ ‚±‚Ìꇃ}ƒbƒv‚ðˆÚ“®‚µ‚Ä‚à‚¿‚á‚ñ‚Ƃ‚¢‚Ä—ˆ‚Ü‚·B
+ Á–Å‚µ‚½‚è‚Í‚µ‚Ü‚¹‚ñB
+* ˆÚ“®‘¬“x‚ª‘¬‚¢ƒyƒbƒg‚̓Lƒƒƒ‰‚æ‚èæ‚Ɉړ®‚µ‚Ü‚·B–{ŽI‚Ì•û‚ª‚Ç‚¤‚È‚Ì‚©
+ ‚í‚©‚ç‚È‚¢‚̂Ńyƒbƒg‚̈ړ®‚̓‚ƒ“ƒXƒ^[‚̈ړ®‘¬“x‚ňړ®‚·‚é
+ ‚悤‚É‚µ‚Ü‚µ‚½B
+Ebattle_athena.cnf
+pet_catch_rate ’ljÁB
+ ƒyƒbƒg‚̕ߊl”{—¦‚ðݒ肵‚Ü‚·B(ݒ肵‚È‚¢‚Æ100)
+ Šî–{“I‚Ƀyƒbƒg‚̕ߊl‚ÉŽg‚Á‚Ä‚éŒöŽ®‚Í
+ (pet_db.txt‚̕ߊl—¦ + (ƒLƒƒƒ‰ƒŒƒxƒ‹ - ƒ‚ƒ“ƒXƒ^[ƒŒƒxƒ‹)*0.3 + luk *0.2)
+ * (2 - ƒ‚ƒ“ƒXƒ^[‚ÌŒ»ÝHP/ƒ‚ƒ“ƒXƒ^[‚ÌÅ‘åHP)
+ ‚É‚È‚è‚Ü‚·BŽ©•ª‚È‚è‚Éì‚Á‚½•¨‚Å‚·‚Ì‚Å–{ŽI‚Æ‚Í‚©‚È‚è‚Ì
+ ˆá‚¢‚ª‚ ‚é‚©‚à’m‚ê‚Ü‚¹‚ñB(ƒ‚ƒ“ƒXƒ^[‚ÌHP‚ðŒ¸‚ç‚¹‚ÎŒ¸‚ç‚·’ö•ßŠl—¦‚ª
+ オ‚éŽd‘g‚Ý‚Å‚·‚ª...)
+pet_rename ’ljÁB
+ ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚é‚©‚Ç‚¤‚©‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æno)
+ yes‚͉½“x‚Å‚à–¼‘O‚Ì•ÏX‚ª‰Â”\B
+ no‚͈ê“x•ÏX‚·‚é‚Æ‚à‚¤•ÏX•s‰Â”\‚É‚È‚é
+pet_hungry_delay_rate ’ljÁB
+ ƒyƒbƒg‚Ì• ‚ªŒ¸‚鎞ŠÔ‚Ì”{—¦‚Å‚·B(ݒ肵‚È‚¢‚Æ100)
+ ”{—¦‚ª‚‚¢‚Æ• ‚ªŒ¸‚è“ï‚­‚È‚è‚Ü‚·
+mvp_exp_rate •ÏXB
+ ‚·‚Å‚Éstruct mob_db‚Ìmexpper‚̓Sƒ~‚É‚È‚Á‚Ä‚¢‚é‚Ì‚Å(MVP EXP‚Í
+ MVPƒAƒCƒeƒ€‚ªŽæ‚ê‚È‚©‚Á‚½ê‡“ü‚é‚̂ňӖ¡‚ª‚ ‚è‚Ü‚¹‚ñB)
+ MVP EXP‚Ì—Ê‚Ì”{—¦‚É‚È‚é‚悤‚É•ÏXB(mob.c‚ðC³)
+Echar_athena.cnf
+autosave_time ’ljÁB
+ Ž©“®•Û‘¶‚·‚鎞ŠÔ‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æ300)
+ šdˆÊ‚Í•b‚Å‚·B(ƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚鎞ŠÔ‚ÌŠÔŠu‚Å‚·B)
+Emap_athena.cnf
+autosave_time ’ljÁB
+ Ž©“®•Û‘¶‚·‚鎞ŠÔ‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æ60)
+ šdˆÊ‚Í•b‚Å‚·B(ƒLƒƒƒ‰ŽI‚Ƀf[ƒ^‚𑗂鎞ŠÔ‚ÌŠÔŠu‚Å‚·B‚±‚ê‚Í
+ ƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚鎞ŠÔ‚ÌŠÔŠu‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
+Einter_athena.cnf
+pet_txt ’ljÁB
+ ƒyƒbƒg‚̃f[ƒ^‚ð•Û‘¶‚·‚éƒtƒ@ƒCƒ‹‚ðŒˆ‚ß‚Ü‚·B(ݒ肵‚È‚¢‚Æpet.txt)
+E@makepet ƒRƒ}ƒ“ƒh’ljÁB
+ ƒyƒbƒg‚ÌŽÀ‘•‚É‚æ‚Á‚Ä@item‚Åì‚Á‚½—‘‚ÍŽg‚Á‚Ä‚à–³‘Ê‚É‚È‚è‚Ü‚·‚Ì‚Å
+ ‚±‚ê‚ðŽg‚Á‚Ä—‘‚ðì‚Á‚Ä‚­‚¾‚³‚¢B
+ @makepet <ƒ‚ƒ“ƒXƒ^[‚ÌID or —‘‚ÌID>
+E@petfriendly ƒRƒ}ƒ“ƒh’ljÁB
+ @petfriendly <”Žš>
+ ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ìe–§“x‚ð•ÏXB(0~1000)
+E@pethungry ƒRƒ}ƒ“ƒh’ljÁB
+ @pethungry <”Žš>
+ ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ì–ž• “x‚ð•ÏXB(0~100)
+E@petrename ƒRƒ}ƒ“ƒh’ljÁB
+ @petrename
+ ƒyƒbƒg‚ð˜A‚ê‚Ä‚¢‚鎞‚Ƀyƒbƒg‚Ì–¼‘O‚ð•ÏX‚Å‚«‚é‚悤‚É•ÏXB
+Eint_guild.cAint_party.c “Ç‚Ýž‚Þƒtƒ@ƒCƒ‹‚ɃGƒ‰[‚ª‚ ‚Á‚Ä‚àƒvƒƒOƒ‰ƒ€‚ð
+ I—¹‚¹‚¸‚Éi‚ނ悤‚É•ÏXB
+Epc_walk 123 != 1234 “™‚̃Gƒ‰[‚ªo‚È‚¢‚悤‚É
+ if((i=calc_next_walk_step(sd))>0) {
+ sd->walktimer=add_timer(tick+i/2,pc_walk,id,sd->walkpath.path_pos);
+ ‚ð
+ if((i=calc_next_walk_step(sd))>0) {
+ i = i/2;
+ if(i <= 0)
+ i = 1;
+ sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
+ ‚̂悤‚É•ÏX‚µ‚Ü‚µ‚½B
+ tick‚ª“¯‚¶”’l‚É‚È‚é‚Ì‚ð–h‚¢‚½‚Ì‚Å‚·‚ª‚±‚ê‚Å‚Ç‚ñ‚ȉe‹¿‚ªo‚é‚©‚Í
+ ‚³‚Á‚Ï‚è‚í‚©‚è‚Ü‚¹‚ñB
+ pc.cAmob.c‚ðC³B
+ ‚Å‚à‚±‚ÌC³‚ð‚µ‚Ä‚à˜A‘±‚ŃNƒŠƒbƒN‚µ‚½‚è‚·‚é‚ƃLƒƒƒ‰‚ª‚µ‚΂炭
+ Ž~‚Ü‚é‚悤‚Å‚·B(ƒyƒbƒg‚Ì‚¹‚¢‚ÆŽv‚¢‚Ü‚µ‚½‚ªƒyƒbƒg‚ª‚È‚­‚Ä‚à
+ “¯‚¶‚¾‚Á‚½‚Ì‚Å‘¼‚ÌŒ´ˆö‚©‚Æ...)
+* doc/code_ref.txt‚Æhelp.txt‚Í–Ê“|‚­‚³‚¢‚Ì‚ÅC³‚µ‚Ä‚Ü‚¹‚ñB
+Egm_all_skill: yes‚Å2-2‚̃XƒLƒ‹‚à•\Ž¦‚³‚ê‚é‚悤‚É•ÏXB(ŽŽ‚¢‚¹‚Í‚¢‚Ü‚¹‚ñ‚ª...)
+ pc.c
+ pc_calc_skilltre() C³B
+EƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŒvŽZ‚ðC³B
+ •ŠíŒ¤‹†‚ð“ñdŒvŽZ‚µ‚Ä‚¢‚½‚Ì‚ÅC³B
+ battle.c
+ Damage battle_calc_weapon_attack() C³B
+
+--------------
+//381 by ŒÓ’±—–
+
+EMOB‚Ìs“®C³
+ EPC‚Ì‚¢‚È‚¢ƒ}ƒbƒv‚ÌMOB‚ÍŽžXƒ[ƒv‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ EPC‚Ì‚¢‚éƒ}ƒbƒv‚ÌMOB‚Í•à‚­ˆÈŠO‚ÉAŽžX•¦‚«’¼‚·‚悤‚É‚È‚è‚Ü‚µ‚½
+ i‚±‚ê‚Ü‚½ƒpƒtƒH[ƒ}ƒ“ƒX‚ɉe‹¿‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñF­‚µd‚­‚È‚é‚©‚àj
+ EŽè”²‚«ˆ—‚ŃuƒƒbƒN‚Ì—LŒø”»’è‚ðs‚¤‚悤‚É‚µ‚Ü‚µ‚½
+ iHP–³ŒÀMOB–â‘èC³Hj
+ Eƒ‹[ƒgŽžƒXƒLƒ‹Žg—p‹@\ŽÀ‘•
+
+ mob.c/mob.h
+ mob_ai_sub_lazy(),mob_ai_sub_hard()C³
+ MSS_LOOT’ljÁ,mob_readskilldb()C³
+
+EMOBƒXƒLƒ‹‚Ì‘®«•ÏX‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
+
+ map.h
+ struct mob_data‚É def_eleƒƒ“ƒo’ljÁ
+ mob.c
+ mob_spawn()‚Ådef_ele‚ðƒZƒbƒg‚·‚é‚悤‚É•ÏX
+ battle.c
+ battle_get_element()‚Ådef_ele‚ð“ǂނ悤‚É•ÏX
+ skill.c
+ skill_castend_nodamage_id()C³
+
+EƒNƒ@ƒOƒ}ƒCƒA‚ÌŒø‰Ê”͈͂©‚ço‚é‚ÆŒø‰Ê‚ªØ‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ skill.c
+ ƒ†ƒjƒbƒgŒnˆ—C³
+
+--------------
+//380 by ‚`‚Ìl
+
+EƒJ[ƒgƒŒƒ”ƒHƒŠƒ…[ƒVƒ‡ƒ“‚̃_ƒ[ƒWŒvŽZŽÀ‘•
+ battle.c‚ð•ÏXB
+
+CHRIS‚³‚ñA‚ ‚肪‚Æ‚¤ŒäÀ‚¢‚Ü‚·B
+ƒmƒbƒNƒoƒbƒNŽÀ‘•‚Å‚«‚È‚­‚ÄA¢‚Á‚Ä‚Ü‚µ‚½i„ƒG
+
+--------------
+//379 by CHRIS
+
+EƒJ[ƒgƒŒƒ”ƒHƒŠƒ…[ƒVƒ‡ƒ“‚ÌŽÀ‘•
+ skill.c‚Æbattle.c‚ð•ÏXB
+
+Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚ɃmƒbƒNƒoƒbƒN‚ð’ljÁB
+ battle.c‚ð•ÏXB
+
+iƒ\[ƒX‚ð˜M‚Á‚½‚͉̂‚ß‚Ä‚È‚Ì‚ÅA—L‚Á‚Ä‚é‚©‚Ç‚¤‚©•ª‚©‚è‚Ü‚¹‚ñ‚ªAŽ©•ª‚Å‚Ío—ˆ‚Ü‚µ‚½Bj
+iƒvƒƒOƒ‰ƒ€ŠÖŒW‚̑Ђ𔃂Á‚ĕ׋­‚µ‚ĉ‚߂ĘM‚Á‚½‚Ì‚Å‚·EEEBƒKƒ“ƒoƒŠƒ}ƒXIBj
+
+--------------
+//377 by ŒÓ’±—–
+
+EMOB‚Ìs“®C³
+ E‹ß‚­‚ÉPC‚Ì‚¢‚È‚¢MOB‚ªŽžXƒ[ƒv‚·‚éŽd—l‚ðŽ~‚ß‚Ü‚µ‚½B
+ EPC‚Ì‚¢‚È‚¢ƒ}ƒbƒv‚ÌMOB‚Í‘S‚­“®‚©‚È‚­‚È‚è‚Ü‚µ‚½B
+ EPC‚Ì‚¢‚éƒ}ƒbƒv‚ÅA‹ß‚­‚ÉPC‚Ì‚¢‚È‚¢MOB‚ÍŽžX•à‚­‚悤‚É‚È‚è‚Ü‚µ‚½B
+ E‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ëC³
+ iƒpƒtƒH[ƒ}ƒ“ƒX‚ɉe‹¿‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñF­‚µd‚­‚È‚é‚©‚àj
+
+ mob.c
+ mob_randomwalk()’ljÁ
+ mob_ai_sub_lazy(),mob_ai_sub_hard()C³‚È‚Ç
+
+EƒXƒLƒ‹C³
+ EMOB‚ªƒeƒŒƒ|[ƒg‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ mob.c
+ mob_warp()’ljÁ
+ skill.c
+ skill_castend_nodamage_id()C³
+
+EƒXƒe[ƒ^ƒXˆÙí‚̈ꕔ‚ðŽÀ‘•/C³
+ EPC/MOB‚Æ‚à‚É‘¬“xŒ¸­‚ÌŒø‰Ê‚ªŒ»‚ê‚é‚悤‚ÉiAGI‚Ì•\Ž¦‚Í•Ï‚í‚炸j
+ EPC‚̃Gƒ“ƒWƒFƒ‰ƒXAƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXA‘¬“x㸂̌ø‰Ê‚ðC³
+ EMOB‚Ì2HQAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒGƒ“ƒWƒFƒ‰ƒXAƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXA
+ ‘¬“xã¸/Œ¸­AƒOƒƒŠƒAAƒuƒŒƒbƒVƒ“ƒO‚È‚Ç‚ÌŒø‰ÊŽÀ‘•
+ E‡–°A“€Œ‹AƒXƒ^ƒ“‚Ì•K’†Œø‰ÊŽÀ‘•
+ E‡–°‚̃NƒŠƒeƒBƒJƒ‹”{Œø‰ÊŽÀ‘•
+ EˆÃ•‚Ì–½’†—¦A‰ñ”𗦌¸­Œø‰ÊŽÀ‘•
+ EŽô‚¢‚ÌATKŒ¸­Œø‰ÊALUKŒ¸­Œø‰ÊŽÀ‘•
+
+ battle.c
+ battle_get_*()C³
+ battle_calc_weapon_damage()C³
+ mob.c
+ mob_get_speed(),mob_get_adelay()’ljÁ
+ pc.c
+ pc_calcstatus()C³
+
+Eitem_value_db.txt‚ŃAƒCƒeƒ€‚̉¿Ši‚ðÝ’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ E‰¿Šiƒf[ƒ^‚ðƒI[ƒo[ƒ‰ƒCƒh‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B
+ E‚±‚ê‚Åitem_db2.txt‚ð—pˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚¹‚ñB
+
+ (db/)
+ item_value_db2.txt
+ item_db2.txt‚̉¿Šiƒf[ƒ^B
+ item_value_db.txt‚ɃŠƒl[ƒ€‚·‚é‚Æ“Ç‚Ýž‚Ý‚Ü‚·B
+ (map/)
+ itemdb.c
+ itemdb_readdb()C³
+
+EŒÃ–Ø‚ÌŽ}‚ðŽg‚¤‚ÆMOB‚Ì–¼‘O‚ª 0 ‚É‚È‚é–â‘è‚ÌC³
+
+ (db/)
+ item_db.txt
+ ŒÃ–Ø‚ÌŽ}‚̃f[ƒ^C³
+
+--------------
+//375 by ŒÓ’±—–
+
+EMOBê—pƒXƒLƒ‹‚ÌŒø‰Ê‚ð‚¢‚­‚‚©ŽÀ‘•
+ ‘½’iUŒ‚A“łȂǂ̒ljÁŒø‰Ê•t—^UŒ‚A‘®«•t‚«UŒ‚A–‚–@‘ÅŒ‚UŒ‚
+ •K’†UŒ‚A–hŒä–³Ž‹UŒ‚Aƒ‰ƒ“ƒ_ƒ€ATKUŒ‚‚È‚ÇB
+ ‚½‚¾‚µA**‘S‚­ƒeƒXƒg‚µ‚Ä‚Ü‚¹‚ñ**B
+
+ (db/)
+ skill_db.txt
+ MOB—pƒXƒLƒ‹‚̃f[ƒ^‚ðC³
+ mob_skill_db.txt
+ ­‚µ’ljÁ
+ (map/)
+ skill.c
+ skill_castend_damage_id()C³
+ skill_status_change_start()C³
+ skill_additional_effect()C³
+ battle.c
+ battle_calc_weapon_attack()C³
+
+EƒXƒLƒ‹‚ð­‚µC³
+ EƒEƒH[ƒ^[ƒ{[ƒ‹‚Å“G‚ªŽ€‚ñ‚Å‚¢‚Ä‚àŒ‚‚ƒ‚[ƒVƒ‡ƒ“‚ð‚·‚é–â‘èC³
+
+ skill.c
+ skill_status_change_timer()C³
+
+EMOBƒf[ƒ^‚ª•Ï‚È‚Ì‚Å–^‚v‚̃f[ƒ^ƒx[ƒX‚ð—¬—p‚µ‚Ä‚Ý‚é
+ Eƒf[ƒ^‚Ì•À‚ч‚Æ‚©‘S‚­“¯‚¶‚È‚ñ‚Å‚·‚Ë
+
+ (db/)
+ mob_db.txt
+ –^‚v‚Ìmob_db.txt
+
+EŠeŽíconf‚̃Šƒtƒ@ƒŒƒ“ƒX‚ð“Y•t
+ ‚ ‚­‚܂ŃŠƒtƒ@ƒŒƒ“ƒX‚È‚Ì‚ÅAHowTo‚È‚ñ‚©‚Í‘‚¢‚Ä‚Ü‚¹‚ñB
+
+ (doc/)
+ conf_ref.txt
+ conf‚̃Šƒtƒ@ƒŒƒ“ƒX{ƒ¿
+
+
+--------------
+//373 by ŒÓ’±—–
+
+EMOBƒXƒLƒ‹Žg—p‹@\‰¼ŽÀ‘•
+ EƒXƒLƒ‹Žg—pŽž‚̈—‚̓vƒŒƒCƒ„[‚Æ‹¤—p(skill.c)‚Å‚·B
+ E•s“s‡‚ª‘½‚¢‚ÆŽv‚¤‚Ì‚Å•ñ‚¨Šè‚¢‚µ‚Ü‚·B
+ Emob_skill_db.txt‚ð–„‚ß‚Ä‚­‚ê‚él‚à•åWB
+ ‚±‚̃f[ƒ^‚Íuƒ‰ƒOƒiƒƒN‚Ì‚½‚Ü‚²v‚ðŽQl‚É‚µ‚Ä‚¢‚Ü‚·B
+
+ (db/)
+ mob_skill_db.txt
+ MOBƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX(–¢Š®¬)
+ ƒeƒXƒg—p‚̃f[ƒ^‚µ‚©“ü‚Á‚Ä‚Ü‚¹‚ñB
+ (map/)
+ mob.c/mob.h
+ mobskill_*’ljÁA‚»‚Ì‘¼‘½”C³
+ map.h
+ struct mob_data ‚É skill* ’ljÁ
+ skill.c/skill.h
+ skill_castcancel()‚âƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚ðMOB‚ɑΉž‚³‚¹‚½
+ battle.c
+ battle_calc_damage()‚È‚ÇC³
+
+EƒMƒ‹ƒh‚̃XƒLƒ‹‚ªG‚ê‚È‚¢–â‘èC³
+ E‚¢‚‚̂܂ɂ©pc_skillup‚ªŒÃ‚¢‚à‚Ì‚É•Ï‚í‚Á‚Ä‚¢‚½‚Ì‚ÅC³
+
+ pc.c
+ pc_skillup(),pc_checkskill()C³
+
+--------------
+//368 by ŒÓ’±—–
+
+EMOBŒn‚ÌC³‚È‚Ç
+ EMOB‚ªô“G”͈͓à‚ÌPC/ƒAƒCƒeƒ€‚𓙊m—¦‚ŃƒbƒN‚·‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ iƒAƒNƒeƒBƒuAƒ‹[ƒgF‚¢‚Ü‚Ü‚Å‚ÍŠY“–ƒuƒƒbƒN‚̃Šƒ“ƒNƒŠƒXƒg‚̇‚È‚Ç‚É
+ ˆË‘¶‚µ‚Ä‚¢‚½j
+ EŽË’ö”ÍˆÍ“à‚©‚ÂA“ž’B•s‰Â”\’n‘Ñ‚ÌPC‚ðMOB‚ªƒƒbƒN‚·‚é‚ÆA
+ MOB‚ª’âŽ~‚µ‚½‚èA‚»‚Ìê‚Å–\‚ꂾ‚µ‚½‚è‚·‚é–â‘è‚ÌC³
+ EMOBƒƒbƒN’†‚ÉIW‚È‚Ç‚Å“ž’B•s‰Â”\‚É‚È‚Á‚½ê‡AƒƒbƒN‚ð‰ðœ‚·‚é‚悤‚ÉB
+ EAEGIS•ûŽ®‚Å“G‚̈ړ®‚ðŒvŽZ‚µ‚Ĉړ®•s‰Â”\‚È‚çAAthenaŽ®‚ÅŒvŽZ‚·‚é‚悤‚É
+ EƒƒbƒN‚ª‰ðœ‚³‚ê‚é‚Æ‚«‚É”•b‚»‚Ìê‚Å’âŽ~‚·‚é‚悤‚É‚µ‚½
+ E•às‚ª’x‚¢MOB‚ª‚Æ‚Ü‚ç‚È‚¢/ŽŸ‚Ì•àsŠJŽn‚ª‘‚·‚¬‚é–â‘è‚ðC³‚µ‚Ü‚µ‚½
+ Eƒ‹[ƒgŠÖ˜Aˆ—‚ð­‚µC³
+
+ mob.c
+ mob_ai_sub_hard*()C³
+ mob_can_reach()’ljÁ
+
+EƒXƒLƒ‹Žg—pŽž‚Ƀ^[ƒQƒbƒgƒuƒƒbƒN‚Ì—LŒø«”»’è‚ðs‚¤‚悤‚ÉC³
+Eƒ‹ƒAƒt‚̃_ƒ[ƒW‚ª•ŠíŒvŽZ‚É‚È‚Á‚Ä‚¢‚é‚̃oƒO‚ð–‚–@ŒvŽZ‚ÉC³
+
+ skill.c
+ skill_castend_id()C³
+ skill_status_change_timer_sub()C³
+
+
+----------
+//364 by ‚¢‚Ç
+EˆÈ‰º‚̃pƒPƒbƒg‚Ìà–¾‚ð•ÏX
+ doc/ƒpƒPƒbƒg‰ðÍ.txt
+ R 006a <error No>.B
+ R 0081 <type>.B
+
+E363‚Ńrƒ‹ƒhŽž‚Éwarning‚ªo‚é•s‹ï‡‚ðC³
+ map/guild.h
+
+--------------
+//363 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‚ÌC³
+ EƒƒOƒCƒ“‚µ‚Ä‚¢‚È‚¢PC‚ð’Ç•ú‚·‚é‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚éƒoƒOC³
+ Eƒƒ“ƒo[’ljÁ’¼Œã‚ɒljÁ‚³‚ꂽPC‚ªƒMƒ‹ƒh•\Ž¦‚ɒljÁ‚³‚ê‚È‚¢–â‘èC³
+ E“¯‚¶ƒMƒ‹ƒh‚É“¯C•ÊƒLƒƒƒ‰‚ª—v‚éPC‚ª’E‘Þ‚·‚é/’Ç•ú‚³‚ê‚é‚ƕʃLƒƒƒ‰‚ª
+ ’E‘Þ‚µ‚Ä‚µ‚Ü‚¤ê‡‚ª‚ ‚éƒoƒOC³
+ Eƒƒ“ƒo[‚ª‚¢‚é‚̂ɉðŽU‚µ‚悤‚Æ‚·‚é‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚éƒoƒOC³
+
+ (char/)
+ int_guild.c
+ guild_calcinfo(),mapif_parse_GuildAddMember()C³
+ (map/)
+ guild.c
+ guild_member_leaved(),guild_member_added()
+ guild_recv_info(),guild_break()C³
+
+--------------
+//362 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‰ðŽUŽÀ‘•
+
+ (char/)
+ int_guild.c
+ ‰ðŽUˆ—‚ð’ljÁ
+ (map/)
+ guild.c/guild.h
+ guild_break(),guild_broken(),guild_broken_sub()‚ȂǒljÁ
+ clif.c/clif.h
+ clif_guild_broken(),clif_parse_GuildBreak()’ljÁ
+ intif.c/intif.h
+ intif_parse_GuildBroken()’ljÁ
+
+--------------
+//361 by ‚¢‚Ç
+
+E360‚Å‚Ì@heal‚Ì•ÏXŠÔˆá‚¢‚ð’ù³
+ map/atcommand.c
+
+--------------
+//360 by ‚¢‚Ç
+
+E353‚ÌC³‚ðíœ
+E@heal‚Å•ÏXŒã‚Ì’l‚ªƒ}ƒCƒiƒX‚É‚È‚ç‚È‚¢‚悤‚ÉC³
+
+--------------
+//359 by ‚¢‚Ç
+
+Eclass_equip_db.txt‚Ì•¶Žš‰»‚¯C³
+
+--------------
+//358 by ŒÓ’±—–
+
+EƒƒOƒCƒ“Žž‚Ìdelete_timer‚̃Gƒ‰[‚ðo‚È‚¢‚悤‚É‚µ‚½
+ pc.c
+ pc_authok()‚ÌC³
+
+EƒMƒ‹ƒhŠÖŒW‚ÌC³
+ Eƒƒ“ƒoŠ©—UŽž‚ÉÅ‘ål”‚ÌŠm”F‚ðs‚¤‚悤‚É
+ Eƒf[ƒ^’Ê’mˆ—‚ð‚¢‚­‚‚©C³
+
+ (char/)
+ int_guild.c
+ FXC³
+ (map/)
+ clif.c/clif.h
+ clif_guild_inviting_refused()‚ðclif_guild_inviteack()‚ɉü–¼
+ guild.c/intif.c
+ FXC³
+
+E@guildlvupƒRƒ}ƒ“ƒhì¬BƒMƒ‹ƒhƒŒƒxƒ‹‚ª’²®‚Å‚«‚Ü‚·B
+
+ (char/)
+ int_guild.c
+ FXC³
+ (map/)
+ atcommand.c
+ @guildlvupˆ—’ljÁ
+
+EMakefike‚Ìclean•”•ª‚ðC³
+
+ (char/ map/ login/)
+ Makefile
+ E휂·‚éŽÀsƒtƒ@ƒCƒ‹‚̃pƒX‚ð ../athena/ ‚©‚ç ../ ‚ÉC³
+
+--------------
+//357 by ŒÓ’±—–
+
+Epc.c‚Ì•¶Žš‰»‚¯C³
+ •¶Žš‰»‚¯‚µ‚½ƒtƒ@ƒCƒ‹‚ðƒAƒbƒv‚·‚é‚Ì‚àA‚»‚ê‚ð‰ü‘¢‚·‚é‚Ì‚à‹ÖŽ~‚µ‚Ü‚¹‚ñ‚©H
+ ’¼‚·‚Ì–Ê“|‚­‚³‚·‚¬‚Ü‚·B
+
+ pc.c
+ •¶Žš‰»‚¯‚ÌC³
+
+Eƒp[ƒeƒB‚âƒMƒ‹ƒh‚ÉŠ©—U‚³‚ꂽó‘ԂŃ}ƒbƒvˆÚ“®‚⃃OƒAƒEƒg‚·‚é‚ÆA
+ Š©—U‚ð‹‘”Û‚·‚é‚悤‚ÉC³
+
+ pc.c
+ pc_setpos()C³
+ map.c
+ map_quit()C³
+
+EI-AthenaŽ©“®•œ‹ŒƒVƒXƒeƒ€(B-NSJŽì)‚ðAthena—p‚ɉü‘¢‚µ‚Ä“Y•t‚µ‚Ü‚µ‚½
+ ƒvƒƒOƒ‰ƒ€‚Ì«Ž¿ã./toolƒtƒHƒ‹ƒ_‚Å‚Í‚È‚­./‚É‚ ‚è‚Ü‚·B
+ athena.sh‚Ì•Ï‚í‚è‚Éstart‚Å‹N“®‚·‚é‚ÆmapŽI‚ª—Ž‚¿‚Ä‚à10•b’ö“x‚Å•œ‹Œ‚µ‚Ü‚·
+ ƒvƒƒZƒX‚Íumapv‚Å’²‚ׂĂ܂·‚ª‘¼‚̃vƒƒZƒX‚É”½‰ž‚·‚é‚Æ‚«‚Í
+ umap-serverv‚È‚Ç‚É•Ï‚¦‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B
+
+ start
+ mapŽIŽ©“®•œ‹ŒƒVƒXƒeƒ€‚̃VƒFƒ‹ƒXƒNƒŠƒvƒg
+
+
+--------------
+//0356 by Ž€_
+
+Eathena.sh‚ðŽg‚í‚È‚­‚Ä‚àYare-launcher‚ðŽg‚¦‚é‚悤‚É•ÏXB(Ž©•ªŽŽ‚µ‚Ä‚Ü‚µ‚½‚ª
+ˆê‰ž“®‚«‚Ü‚µ‚½B‚Å‚à‘‹‚Ìê‡login-server.exe‚ªlogin-server.ex‚É“o˜^‚³‚ê‚Ä‚µ‚Ü‚¢
+Yare-launcher‚ªlogin-server.exe‘±‚¯‚ÄŽÀs‚·‚é–â‘肪‚ ‚è‚Ü‚·B‚±‚ê‚Íathena‚Ì
+–â‘è‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
+ comm/makefileˆÈŠO‚Ìmakefile‘S‚Ä‚ðC³B
+ athena.shC³B
+ ŽÀsƒtƒ@ƒCƒ‹‚Í.,/athena ƒtƒHƒ‹ƒ_[‚¶‚á‚È‚­./ ƒtƒHƒ‹ƒ_[‚Éì‚ç‚ê‚Ü‚·B
+E V‹Kaccount‚Ì‹–—e‚·‚é‚©‚Ç‚¤‚©‚ðlogin_athena.cnf‚ÅŒˆ‚ß‚é‚悤‚É•ÏXB(‚±‚ê‚Í
+ YareCVS‚ðŽQl‚µ‚½•¨‚Å‚·B)
+ login.c
+ int mmo_auth() C³B
+ login_athena.cnf
+ new_account ’ljÁB
+Echar.cAlogin.cAinter.cAmap.cAbattle.c‚ňꕔ‚Ìstrcmp‚ðstrcmpi‚É•ÏXB
+
+--------------
+//355 by ‚䂤
+
+E¶Žè‘•”õ‚àl—¶‚µ‚½“ñ“—¬‚ÉC³
+@iƒ_ƒ[ƒWŒvŽZ‚Ì‚Ý‚ÅŒ©‚½–Ú“™‚Í•ÏX‚È‚µj
+
+map.h
+ map_session_data‚ɶŽè—p‚Ì•Ï”‚ð’ljÁ
+
+battle.h
+ battle_get_attack_element2()’ljÁ
+
+battle.c
+ battle_get_attack_element2()’ljÁ
+ battle_calc_weapon_attack()‚É
+ @“ñ“—¬‚̈—‚ð’ljÁC³
+ @ƒNƒŠƒeƒBƒJƒ‹‚æ‚èƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ðæ‚É”»’è‚·‚é‚悤‚ÉC³
+ @‰ß踘B‚̒ljÁƒ_ƒ[ƒW‚ð¸˜Bƒ_ƒ[ƒW‚ÌŽŸ‚Ɉ—‚·‚é‚悤‚ÉC³
+ @i‚±‚ê‚ç‚Í“ÆŽ©‚É’²‚ׂ½‚à‚Ì‚ÅŠÔˆá‚Á‚Ä‚¢‚é‰Â”\«‚ ‚èj
+
+pc.c
+ pc_calcstatus()‚ɶŽè—p‚Ì•Ï”‚É’l‚ð“ü‚ê‚鈗‚ð’ljÁ
+ pc_equipitem()‚Ì“ñ“—¬‘•”õ‚Ìꊂª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³
+
+--------------
+//353 by ‚¢‚Ç
+
+EYare-launcher‚ðŽg‚¤‚±‚Æ‚ªo—ˆ‚é‚悤‚ÉMakefile‚Æathena.sh‚ð•ÏX
+
+--------------
+//352 by ŒÓ’±—–
+
+E‰r¥’†‚ɃNƒ‰ƒCƒAƒ“ƒg‚ðI—¹‚·‚é‚ÆmapŽI‚ª—Ž‚¿‚é–â‘è‚ÌC³
+ skill.c
+ skill_castend_id(),skill_castend_pos(),skill_castend_map()C³
+ map.c
+ map_quit()C³
+
+
+Eƒf[ƒ^ƒoƒbƒNƒAƒbƒv—p‚̃c[ƒ‹“Y•t
+ Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
+ Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
+ Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
+ ƒf[ƒ^‚ªÁ‚¦‚Ä‚àÓ”C‚ÍŽ‚¿‚Ü‚¹‚ñ
+
+ (tool/)
+ backup
+ ƒf[ƒ^ƒoƒbƒNƒAƒbƒv—pPerlƒXƒNƒŠƒvƒg
+
+--------------
+//0351 by Ž€_
+skill.c
+ skill_use_id()‚ɉr¥”½‰žƒ‚ƒ“ƒXƒ^[‚̈—‚ð•ÏXB(UŒ‚ó‘ԈȊO‚Ìê‡
+ ‰r¥”½‰ž‚ðÅ—Dæ‚É‚µ‚Ü‚·B)
+mob.c
+ mob_ai_sub_hard_castsearch() ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ð“ñdˆ—‚µ‚Ä
+ ‚¢‚½‚Ì‚ÅíœB
+ mob_ai_sub_hard() ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ð“ñdˆ—‚µ‚È‚¢‚悤‚É•ÏXB
+pet.c - 0344‚É–ß‚µ‚Ü‚µ‚½B(C³‚Í­‚µ•ªÍ‚ð‚µ‚Ä‚©‚ç‚É‚µ‚Ü‚·B)
+pet.h - 0344‚É–ß‚µ‚Ü‚µ‚½B
+char.h
+ CHAR_CONF_NAME ’ljÁB
+char.c
+ do_init() ŽÀs‚·‚鎞ƒtƒ@ƒCƒ‹–¼‚ª“ü—Í‚³‚ê‚Ä‚¢‚È‚¢‚ÆCHAR_CONF_NAME‚ð
+ Žg‚¤‚悤‚É•ÏXB
+map.h
+ MAP_CONF_NAME ’ljÁB
+map.c
+ do_init() ŽÀs‚·‚鎞ƒtƒ@ƒCƒ‹–¼‚ª“ü—Í‚³‚ê‚Ä‚¢‚È‚¢‚ÆMAP_CONF_NAME‚ð
+ Žg‚¤‚悤‚É•ÏXB
+‚±‚ê‚Ålogin.exeAchar.exeAmap.exe‚ðathenaƒtƒHƒ‹ƒ_[‚ɃRƒs[‚µ‚½Œã–¼‘O‚ð
+login-server.exeAchar-server.exeAmap-server.exe‚É•ÏX‚·‚é‚ÆYare-launcher‚ðŽg‚¤
+‚±‚Æ‚ª‚Å‚«‚Ü‚·B‚±‚ê‚ðŽg‚¤‚ÆŽI‚ª—Ž‚¿‚é“x‚ÉŽ©“®“I‚ÉÄŽÀs‚µ‚Ä‚­‚ê‚Ü‚·B
+
+--------------
+//0345 by Ž€_
+EƒLƒƒƒXƒeƒBƒ“ƒO’T’mŽÀ‘•B
+ mob.c
+ mob_ai_sub_hard_lootsearch() C³B
+ mob_ai_sub_hard() C³B
+ mob_ai_sub_hard_castsearch() ’ljÁB
+ mob_target(), mob_ai_sub_hard_activesearch() ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ð
+ mvpŒoŒ±’l‚É‚æ‚Á‚Ä”FŽ¯‚·‚é‚悤‚É•ÏXB
+ mob_ai_sub_hard_linksearch() C³B
+ mob_attack() Ž€‚ñ‚¾‚Ó‚èAƒnƒCƒfƒBƒ“ƒO‚ðƒ`ƒFƒbƒN‚·‚é‚悤‚É•ÏXB
+ mob_readdb() C³B
+Epet.h
+ MAX_PET_DB‚ð100‚É•ÏXB
+Epet.c
+ read_petdb() C³B
+
+--------------
+//0344 by@‰ß‹Ž‚Ìli1
+E@ƒyƒbƒg• Œ¸‚èŽÀ‘•‚¨‚æ‚Ñ‚»‚Ì‚Ù‚©FXC³
+E@ƒyƒbƒg‰a‚â‚èŽÀ‘•
+
+ pet.c
+ pet_calcrate(struct map_session_data *sd);
+ ƒyƒbƒg‚ÌŠl“¾Šm—¦ŒvŽZ
+ pet_food(struct map_session_data *sd);
+ ƒyƒbƒg‰a‚â‚èƒVƒXƒeƒ€
+ pet_hungry_change( int tid, unsigned int tick, int id,int data );
+ ƒyƒbƒg‚ª• ‚ðŒ¸‚éƒƒWƒbƒN
+ pet_status_int(struct map_session_data *sd);
+ e–§“xŒvŽZ
+ pet_status_hungry(struct map_session_data *sd);
+ –ž• “xŒvŽZ
+ pet_status_1a3(struct map_session_data *sd);
+ ƒpƒPƒbƒg1a3Ý’èŠÖ”
+ pet_initstate(struct map_session_data *sd);
+ ƒyƒbƒg‚ª‰‚߂Ķ‚܂ꂽ‚Æ‚«‚̉ŠúƒXƒe[ƒ^ƒXÝ’è
+ pet.h
+ int pet_calcrate(struct map_session_data *sd);
+ int pet_food(struct map_session_data *sd);
+ int pet_hungry_change( int tid, unsigned int tick, int id,int data );
+ int pet_status_int(struct map_session_data *sd);
+ int pet_status_hungry(struct map_session_data *sd);
+ int pet_status_1a3(struct map_session_data *sd);
+ int pet_initstate(struct map_session_data *sd);
+ ‚ð’ljÁ
+ clif.c
+ clif_pet_emotion(int fd,struct map_session_data *sd)
+ ‰a‚ð‚ ‚°‚½‚Æ‚«‚ɃGƒ‚[ƒVƒ‡ƒ“‚ðs‚¤
+ clif.h
+ clif_pet_emotion(int fd,struct map_session_data *sd);
+
+--------------
+//0341 by Ž€_
+Eƒ‹[ƒgƒ‚ƒ“ƒXƒ^[ŽÀ‘•B
+ map.h
+ LOOTITEM_SIZE‚ð20‚ÉC³B
+ struct mob_data‚Éint lootitem_count ’ljÁB
+ mob.c
+ mob_spawn() ­‚µC³B
+ mob_ai_sub_hard_lootsearch() ’ljÁB
+ mob_ai_sub_hard() C³B
+ struct delay_item_drop2 ’ljÁB
+ mob_delay_item_drop2() ’ljÁB
+ mob_damage() C³B
+ battle.h
+ struct Battle_Config‚Éint monster_loot_type ’ljÁB
+ battle.c
+ battle_config_read() C³B
+ battle_athena.cnf
+ monster_loot_type: 0 ’ljÁB(Šî–{“I‚É0‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+ 0‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂĂà
+ ‚Ü‚½ƒAƒCƒeƒ€‚ðH‚ׂđO‚̃AƒCƒeƒ€‚ªÁ‚¦‚éŽd—l‚Å‚·B
+ 1‚ÌꇂÍLOOTITEM_SIZE‚܂ŃAƒCƒeƒ€‚ðH‚ׂé‚Æ
+ ‚à‚¤ƒAƒCƒeƒ€‚ðH‚ׂȂ­‚È‚è‚Ü‚·B
+
+--------------
+//0340 by Ž€_
+EmvpƒoƒOC³B
+ mob.c
+ mob_damage()‚Åj‚É•Ï‚¦‚½‚Í‚¸‚Ì•¨‚ÉŒ©—Ž‚Æ‚µ‚ ‚è‚Ü‚µ‚½‚Ì‚Å
+ C³‚µ‚Ü‚µ‚½B‚±‚ê‚ÅmvpƒAƒCƒeƒ€‚Å•Ï‚È•¨‚ªo‚È‚­‚È‚é‚Í‚¸‚Å‚·B
+Eclass_equip_db.txt
+ EUC-JIS‚ðS-JIS‚É•ÏXB(ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª‘¼‚̃tƒ@ƒCƒ‹‚Í
+ ‘S•”S-JIS‚¾‚Á‚½‚Ì‚Å...’P‚È‚éƒ~ƒX‚Å‚·‚ª...)
+
+----------
+//339 by ‚¢‚Ç
+
+E338‚ð“K—p‚µ‚½ó‘ԂŃrƒ‹ƒhƒGƒ‰[‚ª”­¶‚·‚é•s‹ï‡‚ðC³
+
+----------
+//338 by ‰ß‹Ž‚Ìli1
+
+E@pet_db.txt‚ɑΉž‚µ‚Ü‚µ‚½B
+E@pet_db‚ð‚‚©‚Á‚½ƒvƒƒOƒ‰ƒ€‚Ì‘‚«•û‚ÉC³‚µ‚Ü‚µ‚½B
+E@ƒyƒbƒg‚Ì–¼‘O‚ð•ÏX‚·‚鎖‚ªo—ˆ‚Ü‚·
+E@ƒyƒbƒg‚ɃAƒNƒZƒTƒŠ[‚ð‚‚¯‚鎖‚ªo—ˆ‚Ü‚·B
+E@Œ»Ýƒyƒbƒg‰a‚â‚èis’†
+
+ (map/)
+ clif.c/clif.h
+ E petŠÖ˜A‚ÌŠÖ”‚ð‚Ù‚ÚC³‹y‚ђljÁ‚¢‚½‚µ‚Ü‚µ‚½B
+ E clif_parse_EquipItem()“à•”‚Ńyƒbƒg—p‘•”õ‚Å‚ ‚é‚©‚Ç‚¤‚©‚Ì”»’è‚ðs‚Á‚Ä‚Ü‚·
+ E clif_parse()‚ðC³‚µ‚Ü‚µ‚½B
+
+ battle.h/battle.c
+ E@battle_config.pet_rate•Ï”‚ð‘‚₵‚Ü‚µ‚½Bmob‚ɑ΂·‚é—‘‚ÌŠl“¾—¦
+ @@‚ðÝ’è‚·‚鎖‚ª‰Â”\‚Æ‚È‚è‚Ü‚·
+
+ pet.c/pet.h
+ E pet_initstate(struct map_session_data *sd);
+ @‰Šú‚̃yƒbƒgƒXƒe[ƒ^ƒX‚ðÝ’è‚·‚éŠÖ”‚Å‚·
+ E pet_npcid(struct map_session_data *sd,int egg_name_id);
+ @ƒyƒbƒg‚ÉŠ„‚è“–‚Ä‚ç‚ꂽnpc_id‚ð•Ô‚µ‚Ü‚·
+ E pet_itemid(struct map_session_data *sd,int mob_id);
+ @ƒ‚ƒ“ƒXƒ^[ID‚©‚ç—‘‚ÌID‚ðŠ„‚èo‚µ‚Ü‚·
+ E pet_equip(struct map_session_data *sd,int equip_id);
+ @ƒyƒbƒg‚̃AƒNƒZƒTƒŠ[‘•”õ‚Å‚·
+ E pet_unequip(struct map_session_data *sd);
+ @ƒyƒbƒg‚̃AƒNƒZƒTƒŠ[‰ðœ‚Å‚·
+ E pet_calcrate(struct map_session_data *sd);
+ @—‘Šl“¾Šm—¦ŒvŽZ‚ðs‚¢1or0‚ð•Ô‚µ‚Ü‚·B
+ E pet_food(struct map_session_data *sd);
+ @ƒyƒbƒg‰a‚â‚èlˆÄ‚Å‚·B‚Ü‚¾³í‚É“®ì‚µ‚Ü‚¹‚ñB
+ E read_petdb()
+ @pet_db.txt‚ð“Ç‚Ýž‚Ýpet_db[]‚É’l‚ð“ü‚ê‚éŠÖ”‚Å‚·
+
+ E do_init_pet()
+ @mapŽI‰Šú‰»‚Å‚æ‚Ñ‚¾‚µpet_db[]‚ðŽg‚¦‚é‚悤‚É‚·‚éˆ×‚Ì
+ ƒyƒbƒgî•ñ‰Šú‰»ŠÖ”‚Å‚·B
+
+ map.c/map.h
+ E@BL_PET•Ï”‚ð‰Á‚¦‚Ü‚µ‚½
+ E@mapŽI‰Šú‰»‚ÌŽž‚Édo_init_pet()‚ðŒÄ‚Ño‚µ‚Ü‚·B
+
+ mmo.h
+ E@s_pet\‘¢‘Ì‚É•Ï”’ljÁBƒLƒƒƒ‰ƒNƒ^[‚ªƒyƒbƒg‚̃f[ƒ^‚ð•ÛŽ‚·‚éˆ×‚̃VƒXƒeƒ€
+ @‚̈סŒã‚à•Ï”‚Í‚»‚̂‚Ǒ‰Á‚·‚é—\’è
+
+ npc.c
+ ‰ü‘P‚µ‚Ü‚µ‚½B
+
+ (conf/)
+ battle_athena.cnf‚É—‘‚ÌŠl“¾Šm—¦pet_rate‚ð‰Á‚¦‚Ü‚µ‚½B
+
+----------
+//337 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‚̒ljÁ‚ÆC³
+ EƒMƒ‹ƒh‚ÉŒoŒ±’l‚ðã”[‚·‚é‚ÆAã”[‚³‚ê‚éEXP‚ªˆÙí‚È’l‚É‚È‚éƒoƒOC³
+ EƒMƒ‹ƒh‚Ì“G‘Ί֌W‚̒ljÁ
+
+ guild.c/guild.h
+ guild_payexp()‚ÌC³(ã”[EXPˆ—)
+ guild_opposition()’ljÁ
+ guild_allianceack(),guild_reqalliance(),
+ guild_reply_reqalliance()‚ÌC³
+ clif.c/clif.h
+ clif_guild_oppositionack(),clif_parse_GuildOpposition’ljÁ
+
+EƒfƒBƒŒƒCŽžŠÔ‚ªdex‚̉e‹¿‚ðŽó‚¯‚é‚©‚Ç‚¤‚©‚ðbattle_athena.cnf‚É‘‚¯‚é‚悤‚É
+
+ (conf/)
+ battle_athena.conf
+ delay_dependon_dex ‚ð’ljÁ
+ (map/)
+ skill.c
+ skill_delay_fix()‚ÌC³
+ battle.c/battle.h
+ struct Battle_Config‚Édelay_dependon_dex’ljÁ
+ battle_config_read()‚ÌC³(“Ç‚Ýž‚݈—‚à•Ï‚¦‚Ä‚Ü‚·)
+
+--------------
+//0336 by Ž€_
+EƒXƒLƒ‹ƒCƒ“ƒfƒ…ƒA‚ð­‚µC³B
+Eclif.c
+ clif_skill_damage()Aclif_skill_damage2() ƒCƒ“ƒfƒ…ƒA‡‚킹‚ÄC³B
+ (‚½‚¾ƒXƒLƒ‹‚â–‚–@‚É‚È‚é‚ƃ‚[ƒVƒ‡ƒ“‚ªo‚È‚¢ƒpƒPƒbƒg‚ð
+ Œ©‚‚¯‚È‚©‚Á‚½‚Ì‚ÅŠ®‘S‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
+ clif_parse_ActionRequest()Aclif_parse_UseSkillToId()Aclif_parse_UseSkillToPos()
+ ƒXƒLƒ‹ƒfƒBƒŒƒC‚ÌŽž‚ɃƒbƒZ[ƒW‚ªo‚é‚悤‚ÉC³B
+EƒoƒbƒNƒXƒeƒbƒvŽÀ‘•AƒIƒŠƒfƒIƒRƒ“Œ¤‹†ŽÀ‘•B
+Eskill.c
+ skill_castend_damage_id()‚É‚ ‚Á‚½ƒXƒLƒ‹ƒoƒbƒNƒXƒeƒbƒv‚̈—‚ð
+ skill_castend_nodamage_id()‚Ɉړ®‚µ‚Ü‚µ‚½B
+ ƒXƒLƒ‹ƒoƒbƒNƒXƒeƒbƒv‚̈—‚Åclif_skill_damage2()‚ðŒÄ‚Ô‚Ì‚ðclif_fixpos()‚ð
+ ŒÄ‚Ԃ悤‚É•ÏXB(‚±‚ê‚Ń_ƒ[ƒW‚̃‚[ƒVƒ‡ƒ“‚ªo‚¸‚É
+ ˆÚ“®‚Å‚«‚Ü‚·B)
+ ƒoƒbƒNƒXƒeƒbƒv‚Æ‹©‚Ԃ悤‚É•ÏXB
+ skill_produce_mix() ƒIƒŠƒfƒIƒRƒ“Œ¤‹†“K—pB•ŠíƒŒƒxƒ‹‚ª3ˆÈã‚ÌŽž‚É
+ ƒXƒLƒ‹ƒŒƒxƒ‹*1%‚ªƒ{[ƒiƒX‚Æ‚µ‚Ä»‘¢Šm—¦‚É•t‚«‚Ü‚·B
+ ƒGƒ‹ƒjƒEƒ€‚ÌŠm—¦”»’è’ljÁB
+Eskill_db.txt - ƒoƒbƒNƒXƒeƒbƒv‚Ìnk‚ð0‚©‚ç1‚É•ÏXB(ƒXƒLƒ‹”Ô†150‚Ì•¨‚Å‚·B)
+Eproduce_db.txt ƒIƒŠƒfƒIƒRƒ“,ƒGƒ‹ƒjƒEƒ€‚ð’ljÁB(‚±‚ê‚Í–{ŽI‚É‚Í‚È‚¢•¨‚Å‚·B
+ ‚æ‚Á‚ăNƒ‰ƒCƒAƒ“ƒg‚É‚Í•K—v‚ȃAƒCƒeƒ€‚ª•\Ž¦‚³‚ê‚Ü‚¹‚ñB)
+ ƒIƒŠƒfƒIƒRƒ“Œ¤‹†‚ð­‚µŽg‚¦‚镨‚É‚·‚邽‚߂ɒljÁ‚µ‚Ü‚µ‚½B
+ ƒIƒŠƒfƒIƒRƒ“‚Ìꇂ̓IƒŠƒfƒIƒRƒ“Œ´Î3‚‚ÆÎ’Y1‚‚ª•K—v‚Å
+ ƒGƒ‹ƒjƒEƒ€‚̓Gƒ‹ƒjƒEƒ€Œ´Î3‚‚ÆÎ’Y1‚‚ª•K—v‚Å‚·B
+Epc.c ­‚µC³B
+ pc_heal()pc_percentheal() ­‚µ‚¾‚¯C³B
+ pc_gainexp() ƒMƒ‹ƒh‚Éexp‚ðã”[‚·‚鎞‚Éexp‚ªƒ}ƒCƒiƒX‚É‚È‚ç‚È‚¢‚悤‚É
+ C³B“¯Žž‚É2‚ˆÈã‚̃Œƒxƒ‹‚ªã‚ª‚é‚悤‚É•ÏXB
+ ő僌ƒxƒ‹ˆÈã‚ɃŒƒxƒ‹‚ªã‚ª‚ç‚È‚¢‚悤‚ÉC³B
+ pc_checkbaselevelup()Apc_checkjoblevelup() ’ljÁBƒŒƒxƒ‹ƒAƒbƒv‚ð
+ ƒ`ƒFƒbƒN‚µ‚Ü‚·B
+ pc_itemheal() ’ljÁBƒAƒCƒeƒ€‚ðŽg‚¤Žž‚ÉVIT‚ƃXƒLƒ‹‚É‚æ‚Á‚ă{[ƒiƒX‚ª
+ •t‚­•¨‚Å‚·BƒXƒLƒ‹ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“ŽÀ‘•B
+Epc.h
+ pc_checkbaselevelup(),pc_checkjoblevelup() ’ljÁB
+ pc_itemheal() ’ljÁB
+Escript.c - ƒXƒNƒŠƒvƒgfixheal‚𜋎Bitemheal‚ð’ljÁBheal‚ªfixheal‚Ì‹@”\‚ð‚·‚é
+ ‚悤‚É•ÏXB
+ buildin_fixheal() ‚ðÁ‚µbuildin_heal()‚ðŒ³‚Ì•¨‚É–ß‚µ‚Ü‚µ‚½B(‚‚܂è
+ buildin_heal()‚ªbuildin_fixheal()‚É‚È‚è‚Ü‚µ‚½B)
+ buildin_itemheal() ’ljÁBƒAƒCƒeƒ€‚É‚æ‚é‰ñ•œ‚Í‚±‚ê‚ðŒÄ‚Ԃ悤‚É‚µ‚Ä
+ ‚­‚¾‚³‚¢B
+ buildin_heal()‚©‚çƒ{[ƒiƒX‚ÌŒvŽZ‚𜋎B
+Eitem_db.txtA item_db2.txt - heal‚ðitemheal‚É•ÏXB
+Emob.c
+ mob_damage() 0335‚Åmvp‚É­‚µŠÔˆá‚¢‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚ÅC³‚µ‚Ü‚µ‚½B
+Eskill.h
+ MAX_SKILL_PRODUCE_DB‚ð64‚©‚ç100‚É•ÏXB
+
+
+//0335 by Ž€_
+Echar/char2.c‚̈ꕔ‚ÉRETCODE‚ª“K—p‚³‚ê‚Ä‚È‚©‚Á‚½‚Ì‚Å‚»‚ê‚ðC³B
+Echar/char2.c‚Ìparse_char()‚ŃLƒƒƒ‰‚ðÁ‚·Žž‚É–â‘肪‚ ‚è‚»‚¤‚ÈŠ‚ðC³B
+Echar/cha2.c,login/ login2.c‚ðchar/cha.c, login/login.c‚É•ÏXB
+Echar/makefile,login/makefile‚ð•ÏXB
+Emakefile‚Æcommon/mmo.h‚ð•ÏX‚µ‚ÄOS‚ðŽ©“®”FŽ¯‚µ‚ÄRETCODE‚ðŽ©“®‚É
+ “K—p‚·‚é‚悤‚É•ÏXB
+Ecommon/grfio.c‚Ìgrfio_init()‚ðC³B(ƒR[ƒh‚ð‚¿‚å‚Á‚Æ‚«‚ê‚¢(H)‚É
+ ‚µ‚½‚¾‚¯‚Å‚·‚ª,,,)
+EƒCƒ“ƒfƒ…ƒAŽÀ‘•B‚æ‚Á‚ăAƒ“ƒeƒBƒyƒCƒ“ƒƒ“ƒg‚àŽÀ‘•B
+Emap/clif.c
+ clif_parse_LoadEndAck() ŠØ‘ƒNƒ‰ƒCƒAƒ“ƒg‚̃pƒbƒ`‚ɇ‚킹‚Ä­‚µ•ÏXB
+ (ƒ}ƒbƒv‚ª•Ï‚í‚é“x‚É•Ší‚ƃV[ƒ‹ƒh‚ªŒ©‚¦‚È‚­‚Ȃ邽‚ß‚Å‚·B‚Ü‚¾
+ “ú–{ƒNƒ‰‚Æ‚ÍŠÖŒW‚ ‚è‚Ü‚¹‚ñ‚ª...)
+ clif_skillinfoblock() up‚Í‚¢‚ç‚È‚¢‚ÆŽv‚¤‚Ì‚ÅÁ‚µ‚Ü‚µ‚½BƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ª
+ 256A512“™‚ÌŽžƒXƒLƒ‹ƒcƒŠ[‚ª³‚µ‚­•\Ž¦‚³‚ê‚È‚¢‚±‚Æ‚Í
+ ‚à‚¤‚ ‚è‚Ü‚¹‚ñB
+ clif_guild_skillinfo() “¯‚¶‚悤‚Éup‚ðÁ‚µ‚Ü‚µ‚½B
+ clif_birthpet() pc_delitem() ŒÄ‚Ԃ悤‚É•ÏXB
+ clif_damage() ƒCƒ“ƒfƒ…ƒA‚ɑΉž‚·‚é‚悤‚É•ÏXB
+Emap/pc.c
+ pc_percentheal() ƒ}ƒCƒiƒX‚ð“ü‚ê‚Ä‚à“®‚­‚悤‚É•ÏXB­‚µC³B
+ pc_heal() ­‚µC³B
+ natual_heal() ­‚µC³B
+ do_init_pc() natual_heal‚ÌC³‚ɇ‚킹‚Ä•ÏXB
+ pc_calcstatus() ‹|‚ð‘•”õ‚µ‚Ä‚È‚¢‚ƃƒV‚Ì–Ú‚ª“K—p‚³‚ê‚È‚¢‚悤‚É•ÏXB
+ ƒgƒ‰ƒXƒgŽÀ‘•B
+ pc_damage() ƒCƒ“ƒfƒ…ƒA‚ɑΉž‚·‚é‚悤‚É•ÏXB
+Emap/pc.h
+ pc_checkoverhp(), pc_checkoversp()‚ð’ljÁB
+Emap/map.h
+ MAX_PC_CLASS‚ð+1‚ÉB
+Emap/atcomand.c
+ comand‚ðcommand‚É•ÏXB
+ strncmp‚ðstrcmpi‚É•ÏXB‚æ‚Á‚ăRƒ}ƒ“ƒh‚ª‘啶ŽšA¬•¶Žš‚ð‹æ•Ê‚·‚é
+ •K—v‚ª‚È‚­‚È‚è‚Ü‚µ‚½B
+Emap/npc.h
+ npc_parse_mob()‚ð’ljÁB(ˆÓ–¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª...)
+Emap/temdb.c
+ itemdb_readdb()‚Åclass_equip_db.txt‚ð“ǂނ悤‚É•ÏXB
+Edb/class_equip_db.txt ‚ð’ljÁB‚±‚±‚Å‘•”õ‚·‚éƒNƒ‰ƒX‚ðŽw’肵‚Ü‚·B‚È‚¢ê‡‚Í
+ item_db.txt‚É‚ ‚éjob‚ðŽg‚¢‚Ü‚·BŠÜ‚Ü‚ê‚Ă镨‚ÍŠ®‘S‚È•¨‚Å‚Í‚È‚­
+ Žg—p—á’ö‚Ì•¨‚Å‚·B
+Emap/skill.c - skill_status_change_start() ƒCƒ“ƒfƒ…ƒA‚ÌŽžŠÔ‚𳂵‚­•ÏXB
+Emap/battle.h
+ battle_config‚Ìexp_rate‚ðbase_exp_rate‚É•ÏXB,job_exp_rate‚ð’ljÁB
+ battle_get_mexp()‚ð’ljÁB
+Emap/battle.c
+ battle_config‚Ìexp_rate‚ðbase_exp_rate‚É•ÏXB,job_exp_rate‚ð’ljÁB
+ battle_get_mexp()‚ð’ljÁB
+ battle_calc_magic_attack()‚ð•ÏXBƒ_[ƒ“ƒAƒ“ƒfƒbƒh‚Ń{ƒX‚Ì”FŽ¯‚ðmvp
+ exp‚Å‚·‚é‚悤‚É•ÏXB
+Emap/mob.c
+ mob_readdb() base_exp_rate,job_exp_rate‚ɑΉžB
+ mob_readdb() ƒ{ƒX‚Ì”FŽ¯‚ðmvpŒoŒ±’l‚Å‚·‚é‚悤‚É•ÏXB
+ mob_damage() mvp‚ðŽæ‚鎞‚̈—‚ð•ÏXBd‚³‚ª50%‚ð‰z‚¦‚é‚Æ°‚É
+ —Ž‚¿‚é‚悤‚É•ÏX‚ÆFXB
+Econf/battle_athena.cnf
+ base_exp_rateA,job_exp_rate‚ð’ljÁB
+E0308‚Å–Y‚ꂽ•¨
+ ŒÃ‚­Â‚¢” AŒÃ‚¢ƒJ[ƒh’ŸAŒÃ‚¢Ž‡F‚Ì” ‚ÌŽg—p‚Å“¾‚ç‚ꂽƒAƒCƒeƒ€‚ð
+ Ž‚Á‚Ä‚È‚­‚È‚Á‚½‚çƒAƒCƒeƒ€‚ð°‚É—Ž‚Æ‚·‚悤‚É•ÏXB
+ »‘¢‚Í‚·‚Å‚É0302‚Å“K—pB
+
+----------
+//334 by C}{RIS
+
+E‚ ‚Ղ낾‚Ì332.txt‚ðpet_db.txt‚Æ‚µ‚Ä“¯«B
+
+EŠeŽíƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚̃~ƒX‚ðC³
+ Eattr_fix.txt@‘®«C³‚ªƒ}ƒCƒiƒX‚É“­‚¢‚Ä“G‚ª‰ñ•œ‚·‚é–â‘è‚ðC³B
+ „Œ³‚̉ñ•œŽd—l‚É–ß‚µ‚½‚¢ê‡attr_fix.txt‚ðƒŠƒl[ƒ€‚µAattr_fix_old.txt‚ðattr_fix.txt‚ɃŠƒl[ƒ€‚µ‚ĉº‚³‚¢B
+ Emob_db.txt@ƒ‚ƒ“ƒXƒ^[‚Ì“ú–{Œê–¼‚ð–{ŽI‚Æ“ˆêB
+ Ecast_db.txt@‰r¥ŽžŠÔAƒfƒBƒŒƒC‚ð–{ŽI‚Æ“ˆêB
+
+----------
+//333 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‹@”\’ljÁ
+ EƒMƒ‹ƒh‚Ì“¯–¿‚Æ“¯–¿‰ðÁ
+
+ (char/)
+ inter.c/int_guild.c
+ ƒpƒPƒbƒg’·/ƒMƒ‹ƒhˆ—’ljÁ
+ (map/)
+ clif.c/clif.h
+ clif_guild_reqalliance,clif_guild_allianceack,
+ clif_guild_delalliance,clif_parse_GuildRequestAlliance,
+ lif_parse_GuildReplyAlliance,clif_parse_GuildDelAlliance’ljÁ
+ iƒMƒ‹ƒh“¯–¿ŠÖŒW‚̃pƒPƒbƒgˆ—j
+ intif.c/intif.h
+ ƒMƒ‹ƒh“¯–¿ŠÖŒW‚̃pƒPƒbƒgˆ—’ljÁ
+ guild.c/guild.h
+ ƒMƒ‹ƒh“¯–¿ŠÖŒW‚̈—’ljÁ
+ map.h
+ struct map_session_data‚Éguild_alliance,guild_alliance_account’ljÁ
+
+EƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‚Ì•ÏX‚ªƒ}ƒbƒvŽI‚ðÄ‹N“®‚µ‚È‚¢‚Æ—LŒø‚É‚È‚ç‚È‚¢ƒoƒOC³
+
+ guild.c/guild.h
+ guild_emblem_changed‚ÌC³
+
+----------
+//331 by ‰ß‹Ž‚Ìli1
+
+EƒyƒbƒgƒVƒXƒeƒ€C³(Š®¬“x25%)
+
+ EŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ð‚»‚ê‚¼‚ê‘Ήž‚·‚é“G‚ɑ΂µ‚ÄŽg—p‚·‚邱‚Æ‚Å
+ @³‚µ‚­—‘‚ªŽè‚É“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ EŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ð‘Ήž‚µ‚È‚¢“G‚ÉŽg—p‚µ‚½ê‡‚̓‹[ƒŒƒbƒg‚ª•K‚¸Ž¸”s‚µ‚Ü‚·B
+ Eƒyƒbƒg‚ªuŽž‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ Eƒyƒbƒg‚ð‰EƒNƒŠƒbƒN‚·‚é‚ƃƒjƒ…[‚ªo‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ E‘¼FXŠëŒ¯‚È—v‘f‚ðC³‚µ‚Ü‚µ‚½B(ƒAƒCƒeƒ€‚Ì”‚ÌŒ¸­“™‚̃oƒO‚𒼂µ‚Ü‚µ‚½)
+
+ (db/)
+ item_db.txt
+ ŠeŽí•ßŠl—pƒAƒCƒeƒ€‚ɑΉž‚·‚é‚悤petƒRƒ}ƒ“ƒh‚𳂵‚­‘‚«‚Ü‚µ‚½B
+
+ (common/)
+ mmo.h
+ s_pet ƒyƒbƒg\‘¢‘Ì‚Épet_item_id‚ð’ljÁ
+
+ (map/)
+ clif.c
+ clif_birthpet()‚ðC³B³‚µ‚­—‘‚ªŒ¸‚éA³‚µ‚¢—‘‚ÌID‚ðŽæ“¾‚·‚é‚悤C³
+ ‚±‚ê‚É‚æ‚Á‚ÄA³‚µ‚­npc_petŠÖ”‚ª“®‚«‚Ü‚·B
+
+ clif_spawnnpc()‚ðC³iWBUFPOS(buf,36,nd->bl.x,nd->bl.y)‚ÆA”’l‚ð26‚©‚ç36‚Ö•ÏX‚µ‚Ü‚µ‚½)
+ ‚±‚ê‚É‚æ‚Á‚ăyƒbƒg‚ªuŽž‚É•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+
+ npc.c
+ npc_pet()‚ðC³B
+
+ pet.c/pet.h
+ ƒyƒbƒgŠÖ˜A‚Ìׂ©‚ÈŠÖ”‚ð‚±‚¿‚ç‚É‚Ü‚Æ‚ß‚éˆ×A’ljÁ‚µ‚Ü‚µ‚½B
+ Œ»Ý‚̓yƒbƒg‚Ì”»’èŠÖŒW‚ð‚Ü‚Æ‚ß‚Ä‚ ‚è‚Ü‚·B
+
+ script.c
+ “Á‚É‘å‚«‚ÈC³‚Í‚ ‚è‚Ü‚¹‚ñB
+----------
+//330 by ‰ß‹Ž‚Ìli1
+
+EƒyƒbƒgƒVƒXƒeƒ€“±“ü(Š®¬“x‚Q‚O“)
+ E“G‚ɑ΂µ‚ĕߊl—pƒAƒCƒeƒ€‚ðŽg—p‚·‚鎖‚ª‰Â”\‚Æ‚È‚è‚Ü‚µ‚½B
+ @(‚Ü‚¾n‚µ‚Ä‚¢‚È‚¢ƒŠƒ“ƒS‚Ì‚ÝŽg—p‰Â”\A“G‚ɂ‚©‚Á‚Ä‚àƒ|ƒŠƒ“‚Ì—‘‚ªŽè‚É“ü‚è‚Ü‚·B)
+ EŠeŽí—‘‚ɑ΂µ‚ăyƒbƒg‚ð•\Ž¦‚·‚鎖‚ª‚Å‚«‚Ü‚·A‚½‚¾‚µ‚È‚º‚©ˆê“x‰æ–ÊŠO‚É
+ @‚Å‚È‚¢‚ƃyƒbƒg‚ª•\Ž¦‚³‚ê‚Ü‚¹‚ñB
+ @(‹°‚ç‚­ƒyƒbƒg•\Ž¦‚ÌÛ‚És‚Á‚Ä‚¢‚éNPCƒXƒe[ƒ^ƒX‚ª³‚µ‚­“ü‚Á‚Ä‚¢‚È‚¢)
+ E•\Ž¦‚³‚ꂽƒyƒbƒg‚ªƒpƒtƒH[ƒ}ƒ“ƒX‚ðs‚¢‚Ü‚·B
+
+ (db/)
+ item_db.txt
+ Œg‘Ñ—‘›z‰»‹@‚ðŽg—p‰Â”\‚É bpetƒRƒ}ƒ“ƒh(Œg‘Ñ—‘›z‰»‹@Žg—p)
+ u‚Ü‚¾n‚µ‚Ä‚È‚¢ƒŠƒ“ƒSv‚ðŽg—p‰Â”\‚É petƒRƒ}ƒ“ƒh(‚ ‚émob‚ɑ΂µ‚ÄŽg—p‰Â”\‚É‚·‚é)
+ (common/)
+ mmo.h
+ s_pet@ƒyƒbƒg\‘¢‘̒ljÁ
+ mmo_charstatus@ƒyƒbƒg\‘¢‘Ì錾•Ï”’ljÁ(pet)
+ (map/)
+ clif.c/clif.h
+
+ int clif_catchpet(struct map_session_data *sd,int pet_id);
+ void clif_ruletpet(int fd,struct map_session_data *sd);
+ int clif_judgepet(struct map_session_data *sd,int target_id);
+ int clif_sendegg(struct map_session_data *sd);
+ void clif_listpet(int fd,struct map_session_data *sd);
+ int clif_birthpet(struct map_session_data *sd,int pet_id);
+ void clif_menupet(int fd,struct map_session_data *sd);
+
+ ˆÈã‚ÌŠÖ”‚ð’ljÁ‚µƒyƒbƒg‚ÉŠÖ‚·‚鈗‚ðs‚Á‚Ä‚¨‚è‚Ü‚·B
+ (ƒ‹[ƒŒƒbƒgA—‘‘I‘ð‘‹AƒpƒtƒH[ƒ}ƒ“ƒXA‚»‚Ì‚Ù‚©FX)
+
+ npc.c/npc.h
+ int npc_pet(struct map_session_data *sd,int name_id);
+ ƒyƒbƒg•\Ž¦‚ׂ̈̊֔‚ð’ljÁ
+ (‚±‚ÌŠÖ”“à•”‚Ńyƒbƒg‚Ì•\Ž¦ˆ—‚ðs‚Á‚Ä‚¢‚Ü‚·B“KØ‚ÉC³‚µ‚Ä‚­‚¾‚³‚¢)
+
+ script.c
+ int buildin_catchpet(struct script_state *st);
+ int buildin_birthpet(struct script_state *st);
+ ‚ð’ljÁ‚µ‚Ü‚µ‚½BƒXƒNƒŠƒvƒg‚Épet,bpet‚ð’ljÁ‚µ‚Ü‚µ‚½B
+----------
+//329 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‹@”\’ljÁ
+ EƒMƒ‹ƒh‚Ö‚ÌEXP‚Ìã”[
+ EƒMƒ‹ƒhƒŒƒxƒ‹ƒAƒbƒv
+ EƒMƒ‹ƒhƒXƒLƒ‹‚ÌŠ„‚èU‚è
+
+ (db/)
+ exp_guild.txt
+ ƒMƒ‹ƒhƒŒƒxƒ‹‚ÌŒoŒ±’lƒf[ƒ^ƒx[ƒX
+ (common/)
+ mmo.h
+ GBI_*,GMI_*‚Ì’è‹`‚̒ljÁ‚È‚Ç
+ (char/)
+ int_guild.c
+ EXP‚⃌ƒxƒ‹ƒAƒbƒvAƒXƒLƒ‹ƒAƒbƒvˆ—’ljÁ‚È‚Ç
+ inter.c
+ ƒpƒPƒbƒg’·’ljÁ
+ (map/)
+ guild.c/guild.h
+ ƒMƒ‹ƒhˆ—’ljÁ
+ intif.c/intif.h
+ ƒMƒ‹ƒhƒpƒPƒbƒgˆ—’ljÁ
+ clif.c
+ clif_guild_skillinfo()C³
+ clif_guild_skillup()’ljÁ
+ pc.c
+ pc_skillup()‚ŃMƒ‹ƒhƒXƒLƒ‹‚ÌꇂÍguild_skillup()‚ðŒÄ‚Ԃ悤‚É
+ pc_gainexp()‚Åã”[EXP‚Ì‚½‚ß‚Éguild_payexp()‚ðŒÄ‚Ԃ悤‚É
+
+EƒMƒ‹ƒh‹@”\C³
+ EƒMƒ‹ƒhƒƒ“ƒo[‚ªƒƒOƒCƒ“‚⃃OƒAƒEƒg‚·‚é‚ÆA
+ ƒƒOƒCƒ“’†‚̃Mƒ‹ƒhƒƒ“ƒo[‚ɃMƒ‹ƒhŒnƒpƒPƒbƒg‚ª‘—‚ç‚ê‚È‚­‚È‚é–â‘èC³
+
+ guild.c
+ guild_recv_memberinfoshort()‚ÌC³
+
+----------
+//328 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‹@”\‚̒ljÁ‚È‚Ç
+ E’Ç•ú‹@”\‰¼ŽÀ‘•i’Ç•ú‚µ‚½ƒLƒƒƒ‰‚àĉÁ“ü‰Â”\•ˆê•”î•ñ‚ªƒ_ƒ~[j
+ EƒXƒLƒ‹‚Ì•\Ž¦i•\Ž¦‚¾‚¯‚Å‚·Bã‚°‚½‚è‚Ío—ˆ‚Ü‚¹‚ñj
+
+ (common/)
+ mmo.h
+ struct guild_explusion‚Ì•ÏX
+ (char/)
+ int_guild.c
+ ’Ç•úˆ—’ljÁ
+ ‹óƒMƒ‹ƒhƒ`ƒFƒbƒN‚ȂǒljÁ
+ (map/)
+ guild.c/guild.h
+ ƒMƒ‹ƒhƒXƒLƒ‹ŠÖŒW‚̃AƒNƒZƒT‚ȂǒljÁ
+ clif.c
+ clif_guild_skillinfo()‚ÌC³
+ clif_guild_explusionlist()’ljÁ
+
+Eƒ^[ƒ“ƒAƒ“ƒfƒbƒh‚ªƒ{ƒXŒnƒAƒ“ƒfƒbƒh‚ÅMISS‚É‚È‚éƒoƒOC³
+ Eƒ^[ƒ“ƒAƒ“ƒfƒbƒhŽ¸”sŽž‚̃_ƒ[ƒW‚ªŽg‚í‚ê‚Ü‚·
+
+ battle.c
+ battle_calc_magic_damage()‚ÌC³
+
+----------
+//327 by ‚¢‚Ç
+EŒoŒ±’lƒe[ƒuƒ‹‚É‚P‰ÓŠŠÔˆá‚¢‚ª‚ ‚Á‚½‚Ì‚ÅC³
+ db/exp.txt
+
+----------
+//326 by ‚¢‚Ç
+EcharŽI‚ÌVŽI,ƒƒ“ƒeƒiƒ“ƒX’†‚̃tƒ‰ƒOî•ñ‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚½
+EcharŽI‚ÌŽI–¼‚Ì’·‚³‚ª16ƒoƒCƒg‚É‚È‚Á‚Ä‚¢‚½•”•ª‚ð20ƒoƒCƒg‚ÉC³
+
+ (login/)
+ login2.c
+ parse_login()‚ÌC³
+ login.h
+ struct mmo_char_server‚ÌC³
+ (char/)
+ char2.c
+ check_connect_login_server(),do_init()‚ÌC³
+ (conf/)
+ char_athena.cnf
+@ Echar_maintenance‚ð1‚É‚·‚é‚ƃƒOƒCƒ“l”‚ÌŒã‚ë‚É(“_ŒŸ’†)‚ª‚‚­
+@ Echar_new‚ð1‚É‚·‚é‚ÆŽI–¼‚Ì‘O‚É[V]‚ª‚‚­
+ (doc/)
+ ƒpƒPƒbƒg‰ðÍ.txt
+ E¡‰ñ‚Ì•ÏX‚É”º‚¤ˆê•”C³
+
+----------
+//325 by Mind Twist(224&0293)
+E“G(NPC)ƒXƒLƒ‹‚̒ljÁiƒcƒŠ[‚ɒljÁ‚Ì‚Ýj
+ db/skill_db.txt
+ EƒMƒ‹ƒhƒXƒLƒ‹‘Š•Ï‚í‚炸•s–¾c‚±‚ÌŒ`Ž®‚¶‚á‚È‚¢‚Ì‚©‚ÈH
+
+----------
+//324 by non
+
+Emob‚̃^[ƒQƒbƒgŒãˆÚ“®‚ðC³
+Emob‚̈ړ®‘¬“x‚ðDB‚©‚甽‰f‚³‚¹‚é‚悤‚É
+
+ (map/)
+ mob.c
+ mob_ai_sub_hard()‚ÌC³
+
+EŽÎ‚ß”»’è‚ðC³
+ EFW“™‚ł̎΂ߔ͈͂ð–{ŽIŽd—l‚É
+
+ (map/)
+ map.c
+ map_calc_dir()‚ÌC³
+
+----------
+//322 by ŒÓ’±—–
+
+EƒƒOƒCƒ“Žž‚É•K‚¸ƒp[ƒeƒB[‚©‚眖¼‚³‚ê‚éƒoƒOC³
+ E0318‚Ìuƒp[ƒeƒB‚𜖼‚³‚ꂽ‚Ì‚É`v‚Å‚ÌC³ƒ~ƒX
+
+ (char/)
+ int_party.c
+ ƒp[ƒeƒB[‹£‡Žž‚̃ƒbƒZ[ƒW‚ɉüs’ljÁ
+ (map/)
+ party.c
+ party_check_member()‚ÌC³
+
+EƒMƒ‹ƒh‰ï˜bŽÀ‘••C³‚È‚Ç
+ (char/)
+ int_guild.c
+ ƒMƒ‹ƒh‹£‡Žž‚̃ƒbƒZ[ƒW‚ɉüs’ljÁ
+ (map/)
+ guild.c/guild.c
+ guild_send_message(),guild_recv_message()‚ȂǒljÁ
+ intif.c/intif.h
+ intif_parse_GuildMessage()‚ȂǒljÁ
+ clif.c/clif.h
+ clif_guild_message(),clif_parse_GuildMessage()‚ȂǒljÁ
+ clif_guild_basicinfo()‚̃pƒPƒbƒg‚ð0150‚©‚ç01b6‚É•ÏX
+
+EƒoƒbƒNƒXƒeƒbƒv‚ª‚à‚Ì‚·‚²‚­‰ö‚µ‚¢‚¯‚lj¼ŽÀ‘•
+ EŽg‚¤‚ƃ_ƒ[ƒW‚ð‚P‹ò‚ç‚Á‚½‚悤‚ÉŒ©‚¦‚Ü‚·B(ŽÀۂ̓_ƒ[ƒW‚O‚Å‚·)
+
+ skill.c
+ skill_castend_damage_id()C³
+
+------------------
+//321 by@‰ß‹Ž‚Ìli
+E‹|–î‘•”õŒø‰Ê‚Ì‚ÝŽÀ‘•(‘½X‚¨‚©‚µ‚¢“_‚Í‘¶Ý‚·‚邪‘•”õ‚ªo—ˆA–î‚ÌŒø‰Ê‚ªo‚é)
+ map/clif.c map/clif.h
+ clif_itemlist()’ljÁ
+ Ž‚¿•¨‚Ì’†‚Å‹|–î‚ÉŠ„‚è“–‚Ä‚éƒpƒPƒbƒg”Ô†‚ð0x8000‚Æ‚·‚鈗’ljÁ
+
+ clif_arrowequip(struct map_session_data *sd,int val); //self
+ ‚ð’ljÁB‚±‚Ì’†‚Å‹|–î‘•”õƒpƒPƒbƒgˆ—‚ðs‚Á‚Ä‚Ü‚·
+ map/pc.c
+ pc_equipitem()@‹|–î‘•”õ’ljÁ
+
+ Žc‚³‚ꂽ–â‘è“_F
+ E@–Œ¸‚ç‚È‚¢
+ E@ƒŠƒƒO‚·‚é‚Ɩ‚P‚É‚È‚é
+ E@‘•”õ‚µ‚Ä‚¢‚é–•\Ž¦‚³‚ê‚È‚¢(©‘½•ª‘•”õpos‚ÌÝ’è‚ð‚µ‚Ä‚¢‚È‚¢ˆ×‚©‚Æ)
+ E@–î‚ð‘•”õ‰ðœ‚Å‚«‚È‚¢(‘¼‚Ì–î‚ð‘•”õ‚µ‚È‚¨‚¹‚Α•”õ‚µ‚½–î‚ÌŒø‰Ê‚É‚È‚è‚Ü‚·
+
+----------
+//320 by ‚¢‚Ç
+EˆÈ‰º‚̃pƒPƒbƒg‚̃Gƒ‰[ƒR[ƒh‚Ìà–¾‚ð’ljÁ
+ doc/ƒpƒPƒbƒg‰ðÍ.txt
+ R 006a <error No>.B
+ R 0070 <error No>.B
+ R 0081 <type>.B
+
+----------
+//319 by mk
+ENPC‚Ƃ̉ï˜b’†‚É‘•”õ•ÏXAƒAƒCƒeƒ€AƒXƒLƒ‹‚ðŽg—p‚Å‚«‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½
+ map/clif.c
+ ŠeŠ‚Åsd->npc_id‚ðƒ`ƒFƒbƒN‚µ‚Ä‚Ü‚·
+
+Eˆê•”‚Ì”í‚蕨‚łธBŒã‚É‘•”õ‰ÓŠ‚ª‚¨‚©‚µ‚­‚È‚éƒoƒO‚ðC³
+ map/script.c
+ buildin_successrefitem ‚̃R[ƒh‚ðC³
+
+EƒJ[ƒh‚É‚æ‚é’ljÁŒø‰Ê‚¨‚æ‚шÙí‘Ï«”­“®ˆ—‚ÌC³
+ map/skill.c
+ ƒCƒ“ƒfƒbƒNƒX‰Šú’l‚ªŠÔˆá‚Á‚Ä‚¢‚é‚ÆŽv‚í‚ê‚é‚Ì‚ÅC³iSC_POISON -> SC_STONEj
+
+Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚̉¼ŽÀ‘•AƒOƒŠƒ€ƒgƒD[ƒX‚ÌŽg—pðŒ’ljÁ
+ Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ð‰¼ŽÀ‘•B‚«”ò‚΂µˆ—‚â‚Á‚Ä‚é‚Ì‚Å
+ @battle.c ‚Ìblewcount‚ðƒRƒƒ“ƒgƒAƒEƒg‚µ‚Ü‚µ‚½
+ EƒOƒŠƒ€ƒgƒD[ƒX‚ÌŽg—pðŒiƒnƒCƒfƒBƒ“ƒO•ƒJƒ^[ƒ‹‘•”õjƒ`ƒFƒbƒN’ljÁ
+ @‚±‚ñ‚ÈŠ´‚¶‚Å‘¼‚̃XƒLƒ‹Žg—pðŒ‚à’ljÁ‚µ‚Ä‚à‚æ‚¢‚Ì‚©‚ÈH
+ Eskill_blown ‚Ì‚«”ò‚΂µ•ûŒü‚ðƒ^[ƒQƒbƒg‚Ƃ̈ʒu‚ªd‚È‚Á‚Ä‚¢‚é‚Æ‚«‚Í
+ @ƒ‰ƒ“ƒ_ƒ€‚Å‚Í‚È‚­ƒLƒƒƒ‰ƒNƒ^[‚ðŒã‚ë‚Ö‚«”ò‚΂·‚悤‚É•ÏX‚µ‚Ü‚µ‚½
+ map/skill.c
+ skill_castend_damage_id()•ÏX
+ skill_check_condition()•ÏX
+ skill_blown()•ÏX
+
+EƒAƒTƒVƒ““ñ“—¬ˆ—‚ÉŠÖ‚·‚éC³?
+ E‘•”õˆê——‚Ödrag&dropŽž‚É—¼Žè‚ªÔ‚­ƒ}[ƒLƒ“ƒO‚³‚ê‚é‚悤‚ÉC³
+ @ƒAƒTƒVƒ“‚Å‚Í•Ší‘•”õ‰ÓŠ‚ª—¼Žè‚É‚È‚é‚悤item_equippoint‚ð•ÏX
+ @‚»‚ê‚É”º‚¢pc.c‚Ìpc_equipitem‚ðC³
+ E‹tŽèƒ_ƒ[ƒW‚ð•\Ž¦‚µ‚Ä‚Ý‚Ü‚µ‚½
+ @‚Ü‚Æ‚à‚Ƀ_ƒ[ƒWŒvŽZ‚â‚Á‚Ä‚È‚¢‚Ì‚ÅUŒ‚‰ñ”‚ÌŠm”F‚¾‚¯‚Å‚·
+ EƒJƒ^[ƒ‹’ÇŒ‚‚ƶŽèUŒ‚‚ÌMISS‚ð–³—‚â‚è•\Ž¦
+ (map/)
+ itemdb.c (itemdb.hAclif.cApc.c)
+ itemdb_equippoint() ‚ð•ÏX i“ñ“—¬‚ðl—¶j
+ ˆø”‚ð(int nameid) -> (struct map_session_data *sd,int nameid)‚É
+ ˆø”•ÏX‚É”º‚¢éŒ¾(itemdb.h)‚ƌĂÑo‚µ‘¤(clif.c ,pc.c)‚à•ÏX
+ pc.c
+ pc_equipitem(), pc_checkitem()‘•”õƒ`ƒFƒbƒN‚ðC³
+ battle.c
+ battle_calc_weapon_attack(),battle_weapon_attack()
+ ã‚É‚à‘‚«‚Ü‚µ‚½‚ª¶Žè‚̃_ƒ[ƒWŒvŽZ‚Ís‚Á‚Ä‚Ü‚¹‚ñ
+ (ƒJ[ƒhA‘®«“™‚à–¢“K—p)‰EŽè‚Æ“¯‚¶ƒ_ƒ[ƒW“ü‚ê‚Ķ‰EC—û“K—p‚µ‚Ä‚Ü‚·
+ ƒJƒ^[ƒ‹’ÇŒ‚‚ƶŽèƒ_ƒ[ƒW‚ðƒ~ƒX‚³‚¹‚é•û–@(ƒpƒPƒbƒg?)‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å
+ ŒvŽZŒã‚̃_ƒ[ƒW‚ª-1‚Ìê‡Adamage=0‚ð‘—‚é‚悤‚É‚µ‚Ä‚¢‚Ü‚·
+ ‚à‚Á‚Æ‚æ‚¢•û–@‚ª‚ ‚é‚Ì‚Å‚µ‚½‚çC³‚¨Šè‚¢‚µ‚Ü‚·
+
+EŠ®‘S‰ñ”ð‚ÌŒvŽZ‚ðLuk‚Å‚Í‚È‚­Flee2‚Å”»’f‚·‚é‚悤‚ÉC³
+ map/battle.c
+ battle_calc_weapon_attack()
+
+ (db)
+ item_db.txtAitem_db2.txt
+ ‘•”õ•i‚̈ꕔƒ{[ƒiƒXŒø‰Ê‚ð’ljÁ
+ mob_db.txt
+ –^Š‚Å‚¤‚‚³‚ê‚Ä‚¢‚½‚à‚Ì‚ð­‚µC³
+ ‚Ü‚¾Mode‚âDrop‚É–â‘è“_‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ
+
+----------
+//0318 by ŒÓ’±—–
+
+E‚ ‚éŒö•½•ª”zPT‚Æ‚»‚ÌPT‚É‘®‚³‚È‚¢PC‚ª‹¤“¬‚·‚é‚ÆŽI‚ª–\‘–‚·‚éƒoƒOC³
+
+ mob.c
+ mob_damage()‚ÌEXP•ª”zˆ—C³
+
+Eƒp[ƒeƒB‚𜖼‚³‚ꂽ‚Ì‚ÉŠ‘®‚µ‚Ä‚¢‚é‚悤‚ÉŒ©‚¦‚éƒoƒOC³
+ EŠY“–ƒLƒƒƒ‰‚ªƒƒOƒAƒEƒgó‘Ô‚ÌŽž‚Éœ–¼‚³‚êA‚»‚ÌŒãA“¯C•ÊƒLƒƒƒ‰‚ª
+ “¯ƒp[ƒeƒB‚ÉŠ‘®‚µ‚È‚¨‚µA‚³‚ç‚ÉŒ³‚̃Lƒƒƒ‰‚ŃƒOƒCƒ“‚·‚é‚ÆA
+ œ–¼”»’è‚ÉŽ¸”s‚µ‚ăp[ƒeƒB‚ÉŠ‘®‚µ‚½‚Ü‚Ü‚Å‚ ‚é‚Æ‚³‚ê‚Ä‚µ‚Ü‚¤–â‘èC³
+
+ party.c
+ party_check_member()‚ÌC³
+
+
+----------
+//0317 by nabe
+
+Eu`‚³‚ñ‚©‚çŽæˆø‚ð—v¿‚³‚ê‚Ü‚µ‚½Bv‚ªŽ©•ª‚Ì–¼‘O‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³
+ trade.c/clif.c/clif.h
+ clif_traderequest()‚ÅŽæˆø‘ŠŽè‚̃Lƒƒƒ‰–¼‚ð“n‚·‚悤‚É•ÏX
+
+----------
+//0316 by nabe
+
+E—¼Žè•Ší‚ð¸˜B‚·‚é‚Æ•ÐŽè‘•”õ‚É‚È‚éƒoƒO‚ðC³
+ script.c
+ buildin_successrefitem()‚ÅA—¼Žè•Ší‚Ìꇓ™‚É‘•”õ‰ÓŠƒ`ƒFƒbƒN
+
+----------
+//0315 by ŒÓ’±—–
+
+EPC‚ÌSPAWNƒ^ƒCƒ~ƒ“ƒO‚ð•ÏX
+ Eƒ}ƒbƒvˆÚ“®(ƒƒOƒCƒ“)ŽžAƒ[ƒfƒBƒ“ƒOI—¹Œã‚ÉSPAWN‚·‚é‚悤‚ÉB
+ Eƒ[ƒh’†‚ÉUŒ‚‚³‚ꂽ‚肵‚È‚­‚È‚è‚Ü‚·B
+ EƒMƒ‹ƒh/ƒp[ƒeƒBî•ñ“Ç‚Ýž‚Ý‘O‚É–¼‘O‰ðŒˆƒpƒPƒbƒg‚ª—ˆ‚é–â‘è‚à
+ C³‚³‚ê‚é‚Í‚¸‚Å‚·B
+
+ pc.c
+ pc_setpos()‚Åmap_addblock,clif_spawnpc‚̌ĂÑo‚µ‚ðŽ~‚ß‚½B
+ clif.c
+ clif_parse_LoadEndAck‚Åmap_addblock,clif_spawnpc‚ðŒÄ‚Ԃ悤‚ÉB
+
+EinterŽIƒpƒPƒbƒgˆ—‚Ìd‘å‚È–â‘è‚ðC³
+ Eˆê“x‚ɃpƒPƒbƒg‚ð‘—M‚Å‚«‚È‚©‚Á‚½ê‡A–³ŒÀƒ‹[ƒv‚Ɋׂé–â‘èC³
+
+ (char/)
+ char2.c
+ parse_frommap()C³
+ inter.c
+ inter_parse_frommap()C³
+ (map/)
+ chrif.c
+ chrif_parse()C³
+ intif.c
+ intif_parse()C³
+
+EƒMƒ‹ƒh‚Ì‹@”\’ljÁ
+ E‘¼l‚̃Gƒ“ƒuƒŒƒ€‚ªŒ©‚¦‚é‚悤‚ÉB
+ EƒƒOƒCƒ“’¼Œã‚ÌŽ©•ª‚̃Gƒ“ƒuƒŒƒ€‚ªŒ©‚¦‚é‚悤‚ÉB
+ E’E‘Þ‚Å‚«‚é‚悤‚ÉBi’Ç•ú‚Í‚Ü‚¾‚Å‚·j
+
+ <ƒpƒPƒbƒgî•ñˆø‚«‘±‚«–ÍW>
+ E016c,016d,0163,015c‚È‚Ç‚ÌÚׂÈî•ñ
+ EƒMƒ‹ƒhƒXƒLƒ‹‚ÌID‚ª‚í‚©‚élA‹³‚¦‚Ä‚Ù‚µ‚¢‚Å‚·B
+ 158,205,331‚ ‚½‚è’²‚ׂ܂µ‚½‚ªƒ_ƒ‚È–Í—lB
+
+ (common/)
+ mmo.h
+ MAX_GUILD‚ð36‚ÉB
+ (char/)
+ int_guild.c
+ ’E‘ނ̃pƒPƒbƒg•ÏX
+ inter.c
+ ƒpƒPƒbƒg’·C³
+ (map/)
+ clif.c/clif.h
+ clif_set0078,clif_set007b‚ÌC³
+ clif_guild_belonginfo‚ÌC³
+ clif_guild_skillinfo’ljÁ
+ guild.c/guild.h
+ ’E‘ނȂǂ̈—’ljÁ
+ intif.c/intif.h
+ ’E‘ނȂǂ̈—’ljÁ‚È‚Ç
+
+
+----------
+//0314 by ‚¢‚Ç
+
+EcharŽI‚ÆmapŽI‚ÌŽI”ãŒÀ‚ð30‚Ɉø‚«ã‚°
+ login/login.h
+ char/char.h
+
+Emap_athena1.cnf‚ðmap_athena.cnf‚ɃŠƒl[ƒ€
+@‚»‚ê‚É”º‚¢Aathena.sh‚ð•ÏX
+
+EƒpƒPƒbƒg‰ðÍŽ‘—¿‚ðdoc/‚Ɉړ®
+
+
+----------
+//0313 by ŒÓ’±—–
+
+EƒMƒ‹ƒh‚Ì‹@”\’ljÁ
+ EƒMƒ‹ƒhŠ©—U/–ðE“à—e•ÏX/ƒƒ“ƒo[‚Ì–ðE•ÏX‚È‚Ç
+ Eguild.txt‚Ì‘Ž®‚ª‚Ü‚½•Ï‚í‚è‚Ü‚µ‚½‚ªA‘O‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚é‚Í‚¸‚Å‚·B
+
+ <ƒpƒPƒbƒgî•ñˆø‚«‘±‚«–ÍW>
+ E016c,016d,0163,015c‚È‚Ç‚ÌÚׂÈî•ñ
+ EŽ©•ªˆÈŠO‚ÌPC‚ÌŠ‘®ƒMƒ‹ƒhID‚ð’Ê’m‚·‚éƒpƒPƒbƒg
+
+ (common/)
+ mmo.h
+ struct guild ‚ð•ÏX
+ (char/)
+ int_guild.c/inter.c
+ ˆ—’ljÁ/ƒpƒPƒbƒg’·’ljÁ
+ (map/)
+ guild.c/guild.h/intif.c/intif.h
+ ˆ—’ljÁ
+ clif.c/clif.h
+ ƒMƒ‹ƒhŠÖŒW‚̃pƒPƒbƒgˆ—’ljÁ
+
+Ehelp.txt‚ðC³
+ help.txt
+
+E0311‚É‚æ‚镶Žš‰»‚¯‚ðC³
+ README
+ map/pc.c
+
+----------
+//0312 by ‚¢‚Ç
+
+E@hƒRƒ}ƒ“ƒh‚ð@help‚É•ÏX
+E“Ç‚Ýž‚Þƒ}ƒbƒvƒf[ƒ^‚Ì’è‹`•”•ª‚ð•ÏX
+
+----------
+//0311 by tk44
+EAssassin “ñ“—¬‘•”õAASPD–â‘èC³
+ - map\pc.c
+ pc_equipitem(), pc_calcstatus(), pc_checkitem()
+
+E“ñ“—¬ŠQŒvŽZC³‚Ü‚¾ˆ—’†
+
+----------
+//0310 by ŒÓ’±—–
+
+EƒƒO‚âƒf[ƒ^‚ÉŽg‚¤‰üsƒR[ƒh‚ðmmo.h‚ÅÝ’è‰Â”\‚É
+ (common/)
+ mmo.h
+ RETCODE‚ʼnüsƒR[ƒh‚𕶎š—ñ‚Å’è‹`‚µ‚Ü‚·B
+ WindowsŒn‚¾‚ÆCR/LF‚È‚Ì‚Å"\r\n",UNIXŒn‚¾‚Æ"\n"‚Å‚·B
+ •Ê‚ɳ‚µ‚­Žw’肵‚È‚­‚Ä‚àAthenaŽ©‘Ì‚Í–â‘è‚È‚­“®ì‚·‚é‚Í‚¸‚Å‚·B
+ (login/)
+ login2.c
+ (char/)
+ char2.c/int_storage.c/int_party.c/int_guild.c
+ •Û‘¶‚·‚é‰üsƒR[ƒh‚ðRETCODEˆË‘¶‚É•ÏXB
+ ‰üsƒR[ƒh‚Ɉˑ¶‚¹‚¸‚É“Ç‚ß‚é‚悤‚ÉC³B
+
+EƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç•s–¾‚ȃpƒPƒbƒg‚ª—ˆ‚½‚çƒ_ƒ“ƒv‚·‚é‚悤‚É
+ E#define DUMP_UNKNOWN_PACKET 1 ‚ðƒRƒƒ“ƒg‰»‚·‚ê‚΃_ƒ“ƒv‚µ‚Ü‚¹‚ñB
+
+ clif.c
+ •s–¾ƒpƒPƒbƒg‚̈—‚Ń_ƒ“ƒvˆ—‚ð’ljÁB
+
+EƒMƒ‹ƒh‹@”\‚̒ljÁ
+ EƒGƒ“ƒuƒŒƒ€•ÏX/’m•ÏXŽÀ‘•
+ Eguild.txt‚Ì‘Ž®‚ª•Ï‚í‚è‚Ü‚µ‚½‚ªA‘O‚̃f[ƒ^‚à“Ç‚Ýž‚ß‚é‚Í‚¸‚Å‚·
+
+ (char/)
+ int_guild.c/inter.c
+ ƒMƒ‹ƒhƒpƒPƒbƒgˆ—AƒpƒPƒbƒg’·
+ (map/)
+ guild.c/guild.h
+ ‹@”\’ljÁ
+ intif.c/intif.h
+ ƒMƒ‹ƒhŠÖŒWƒpƒPƒbƒg’ljÁ
+ clif.c/clif.h
+ ƒMƒ‹ƒhŠÖŒWƒpƒPƒbƒg’ljÁ
+
+----------
+//0309 by C}{RIS
+
+Eƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…‚ð”͈ÍUŒ‚‰»‚µ‚Ü‚µ‚½B
+Eƒvƒƒ“ƒeƒ‰‚É‘•”õ•i”Ì”„NPC‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ map_athena1.cnf‚Ì
+ npc_shop1J.txt‚ðƒRƒƒ“ƒgƒAƒEƒg‚·‚ê‚Ζ³Œø‚Éo—ˆ‚Ü‚·B
+EƒAƒCƒeƒ€‚Ì–¼‘O‚ÆID‚ð‘‚¢‚½ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ð“Y•tBiitem.listj
+
+----------
+//0308 by Ž€_
+EŽ©‘R‰ñ•œ‚̃vƒƒOƒ‰ƒ€‚ðC³‚µ‚Ü‚µ‚½B
+ ‚±‚ê‚Å‘åä•v‚¾‚Æ‚¢‚¢‚Å‚·‚ª...
+ pc.c
+ pc_natural_heal()“™‚ðC³B
+ pc_percentheal()‚ð­‚µC³B
+ pc_checkskill()‚ð­‚µC³BƒXƒLƒ‹‚ª‚È‚¢ê‡0‚ð•Ô‚·‚悤‚É
+ •ÏX‚µ‚Ü‚µ‚½B‘¼‚Ì.cƒtƒ@ƒCƒ‹‚àC³‚·‚é•K—v‚ª‚ ‚è‚Ü‚µ‚½‚Ì‚Å
+ C³‚µ‚Ü‚µ‚½B
+E4l–Ú‚Æ5l–ڂ̃Lƒƒƒ‰‚ðÁ‚¹‚È‚¢–â‘è‚ðC³B
+EŽn‚ß‚©‚çƒiƒCƒt‚ƃRƒbƒgƒ“ƒVƒƒƒc‚ðŽ‚‚悤‚É•ÏXB
+ELOOK_SHEILD‚ðLOOK_SHIELD‚ÉC³B
+Emmo_charstatus‚Ìsheild‚ðshield‚ÉC³B
+E.logƒtƒ@ƒCƒ‹‚âaccount.txtƒtƒ@ƒCƒ‹‚ðnotepad‚ÅŠJ‚­‚Æ—ñ‚ª‘S•”Œq‚¢‚Å‚¢‚é
+ –â‘è‚ðC³B
+E—”‚ðŽžŠÔ‚É‚æ‚Á‚ĉŠú‰»‚·‚é‚悤‚É•ÏXB
+ map.c
+ do_init()‚ð­‚µC³B
+
+‘¼‚É•ÏX‚µ‚½ƒtƒ@ƒCƒ‹‚à‚ ‚è‚Ü‚·‚ª‘S•”Šo‚¦‚Ä‚Ü‚¹‚ñ‚Ì‚Å...
+
+----------
+//0307 by ŒÓ’±—–
+
+EV‹KPC‚̉ŠúˆÊ’u‚ðchar_athena.cnf‚É‘‚¯‚é‚悤‚É‚µ‚½
+ start_point: ƒ}ƒbƒv–¼,x,y ‚̂悤‚ÉŽw’肵‚Ü‚·B
+ <—á> start_point: new_1-1.gat,53,111
+
+ (char/)
+ char2.c
+
+EƒMƒ‹ƒh‚̈ꕔ‹@”\
+ EƒMƒ‹ƒh쬂­‚ç‚¢‚µ‚©“®‚«‚Ü‚¹‚ñ
+ EŠ©—U/’E‘Þ/‰ðŽU/î•ñ‚Ì•ÏX/ƒGƒ“ƒuƒŒƒ€/’m‚È‚Ç‚Í‚·‚ׂĖ¢ŽÀ‘•‚Å‚·
+
+ <ØŽÀ‚È—v–]>
+ ƒMƒ‹ƒhŠÖŒW‚̃pƒPƒbƒgî•ñ‚ª‘S‘R‘«‚è‚Ü‚¹‚ñB‚í‚©‚él‚Í‹³‚¦‚Ä‚­‚¾‚³‚¢B
+ Œ»Ý‚̂܂܂ł̓Gƒ“ƒuƒŒƒ€‚Æ’m‚­‚ç‚¢‚µ‚©ŽÀ‘•‚Å‚«‚È‚¢‰Â”\«‚ªcB
+
+ (common/)
+ mmo.h
+ ƒMƒ‹ƒhŠÖŒW‚Ì\‘¢‘̂ƒ蔒ljÁ
+ (char/)
+ inter.c
+ ƒpƒPƒbƒg’·î•ñ’ljÁ
+ int_guild.c/int_guild.h
+ ŽÀۂ̈—’ljÁ
+ (map/)
+ map.h
+ struct map_session_data‚ɃMƒ‹ƒhŠÖŒW‚̃ƒ“ƒo’ljÁ
+ guild.c/guild.h
+ V‹K’ljÁBƒMƒ‹ƒh‹@”\—p
+ pc.c
+ pc_authok()‚ŃMƒ‹ƒhŠ‘®ŽžAguild_request_info()‚ðŒÄ‚Ԃ悤‚ÉB
+ clif.c/clif.h
+ ƒMƒ‹ƒhƒpƒPƒbƒg’ljÁ
+ intif.c/intif.h
+ ƒMƒ‹ƒhƒpƒPƒbƒg’ljÁ
+
+E0303‚Å‚ÌC³uMAXHP‚È‚Ç‚ªƒT[ƒo[‚ƃNƒ‰ƒCƒAƒ“ƒg‚Å`v‚ðŒ³‚É–ß‚µ‚½
+ EVPC‚ðì‚é‚Æ‚«‚ɳ‚µ‚­HP‚È‚Ç‚ðŒvŽZ‚µ‚Ä‚­‚ê‚é‚悤‚É‚È‚Á‚½‚Ì‚Å
+ –ß‚µ‚Ä‚à•½‹C‚¾‚낤‚Æ—\‘ªB
+ EƒƒOƒCƒ“’¼Œã‚Éd—ÊŒx‚ªo‚Ä‚µ‚Ü‚¤‚½‚ßB
+
+ pc.c
+ pc_authok()‚ÌC³
+
+E”͈͎w’蕦‚«‚̈—C³
+ E‚Å‚«‚邾‚¯Žw’肵‚½”‚Æ“¯‚¶‚¾‚¯•¦‚­‚悤‚É
+ (áŠQ•¨‚È‚Ç‚É‚æ‚镦‚«–WŠQ‚̉ñ”ðŽ¸”sŽžA‘O‚̉ñ”ðŒ‹‰Ê‚ðŽg‚¤)
+
+ mob.c
+ mob_once_spawn_area()‚ÌC³
+
+----------
+//0305 by ‚¢‚Ç
+EV‹KPC‚̈ʒu‚ð‰SŽÒC—ûê‚É•ÏXB
+EmapŽI‚ªcharŽI‚ÉÚ‘±‚Å‚«‚È‚¢•s‹ï‡‚ÌC³B
+
+----------
+//0304 by Ž€_
+EŽ©‘R‰ñ•œ‚Ì—Ê‚ÆŽžŠÔ‚ð•ÏXBŠØ‘ŽI‚É“K—p‚³‚ê‚Ă镨‚Å‚·‚ª“ú–{‚É‚à
+ “K—p‚³‚ê‚Ä‚é‚Í‚¸‚Å‚·B(‘½•ª... ‚â‚Á‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚í‚©‚è‚Ü‚¹‚ñBŠ¾)
+ HP‚Í–ˆ4•b‚É 1 + vit/6 + max_hp/200 ‚ð‰ñ•œA
+ SP‚Í–ˆ8•b‚É 1 + int/6 + max_sp/100 ‚ð‰ñ•œ‚µ‚Ü‚·B
+EƒXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚é‰ñ•œ‚ð
+ ƒXƒLƒ‹ƒŒƒxƒ‹*5 + max_hp/50‚É•ÏXB
+EƒXƒLƒ‹SP‰ñ•œ—ÍŒüã‚É‚æ‚é‰ñ•œ‚ð
+ ƒXƒLƒ‹ƒŒƒxƒ‹*3 + max_sp/50‚É•ÏXB
+EƒXƒLƒ‹ˆÚ“®ŽžHP‰ñ•œŽÀ‘•B
+ ¡‚ÌŠŽ~‚Ü‚Á‚Ä‚é‚Ì‚Æ”ä‚ׂÄ1/4‚Ì—Ê‚ð‰ñ•œ‚µ‚Ü‚·B(ŽžŠÔ‚Í“¯‚¶‚Å‚·B)
+Evit‚Æint‚É‚æ‚Á‚ĉñ•œŽžŠÔ‚ª’Z‚­‚È‚é‚Ì‚Å‚Í‚È‚­‰ñ•œ—Ê‚ª‘‚¦‚Ü‚·B
+EÅ‘åHP‚ÆÅ‘åSP‚ÌŒvŽZŒöŽ®‚ð•ÏXB
+ map.h
+ int inchealtick‚Ì•Ï‚í‚è‚Éint inchealhptick;‚Æ int inchealsptick;‚ð’ljÁB
+ int parame[6] ‚ð’ljÁBÅ‘åSP‚ÌŒvŽZ‚ׂ̈̕¨‚Å‘•”õ‚É‚æ‚Á‚Äオ‚Á‚½
+ ƒpƒ‰ƒ[ƒ^‚ðŽ‚Á‚ÂB
+ pc.c
+ pc_hpheal(),pc_spheal(),pc_natural_heal_sub(),pc_natural_heal()‚ð
+ Ž©•ª‚̃R[ƒh‚É‘‚«Š·‚¦‚Ü‚µ‚½‚ªˆê‰ž³í‚É“®‚«‚Ü‚·‚ª
+ ‘¼‚̃R[ƒh‚ɉe‹¿‚ª‚È‚¢‚©‚Ç‚¤‚©‚Í‚í‚©‚è‚Ü‚¹‚ñB
+ pc_additem()‚ð­‚µ‚¾‚¯C³B
+ hp_coefficient‚ðint‚©‚çdouble‚É•ÏXB
+ pc_calcstatus()‚Æpc_readdb()‚ðC³B
+ job_db1.txt
+ E‹Æ‚ÌŒv”‚ð•ÏX‚µ‚Ü‚µ‚½B(ƒNƒ‹ƒZƒCƒ_[“™‚̃f[ƒ^‚Í
+ Š®‘S‚È•¨‚¶‚á‚ ‚è‚Ü‚¹‚ñB)
+
+Echar2.c‚ð­‚µ‚¾‚¯•ÏXB
+ char2.c
+ make_new_char()‚ð­‚µ‚¾‚¯•ÏXB(ì‚Á‚½’¼Œã‚ÉHP‚ÆSP‚ªŠ®‘S‚É
+ ‰ñ•œ‚µ‚Ä‚é‚悤‚É•Ï‚¦‚Ü‚µ‚½B)
+ parse_char()‚ð­‚µ‚¾‚¯C³BŠØ‘‚̃Nƒ‰ƒCƒAƒ“ƒg‚ÅŒq‚¢‚Ä‚à
+ ˆÙ킪‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B(0x187ƒpƒPƒbƒg‚̈—‚ð“ü‚ꂽ‚¾‚¯
+ ‚Å‚·‚ª... ‚±‚ê‚ÍYare‚©‚玂Á‚Ä‚«‚½•¨‚Å‚·B)
+Estrcmpi“™‚Ìdefine‚ðatcomand.h‚©‚çmmo.h‚Ɉړ®‚µ‚Ü‚µ‚½B
+ atcomand.h, mmo.h C³B
+E‰ñ•œƒAƒCƒeƒ€‚ðŽg—p‚·‚鎞vit‚ƃXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚éƒ{[ƒiƒX‚ª•t‚­
+ ‚悤‚É•ÏXBƒ{[ƒiƒX‚Í
+ ‰ñ•œ—Ê *(1 + HP‰ñ•œ—ÍŒüãƒXƒLƒ‹ƒŒƒxƒ‹*0.1 + vit/100)
+ ‚É‚È‚è‚Ü‚·B
+EƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚ƃCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ð‰¼ŽÀ‘•B(‰ñ•œ‚Í‚µ‚Ü‚·‚ªƒGƒtƒFƒNƒg‚ª
+ o‚Ü‚¹‚ñBitem_db‚Ń^ƒCƒv‚ð•Ï‚¦‚Ä‚à‘Ê–Ú‚Å‚µ‚½B)
+ script.c
+ buildin_fixheal()‚Æbuildin_percentheal()‚ð’ljÁB
+ buildin_fixheal()‚Íbuildin_heal()‚ªƒXƒLƒ‹‚Ævit‚É‚æ‚Á‚ĉñ•œ—Ê‚ª•Ï‚í‚é
+ Žd—l‚É‚È‚Á‚½‚Ì‚ÅŒ³‚Ìbuildin_heal()‚Ì–¼‘O‚¾‚¯‚ð•Ï‚¦‚½•¨‚Å‚·B
+ buildin_percentheal()‚Í“ü—Í‚³‚ꂽ”Žš‚ð%‚Æ‚µ‚ÄHP‚ÆSP‚ðÅ‘åHP‚Æ
+ Å‘åSP‚ð %”ä—¦‚ɉñ•œ‚µ‚Ü‚·B
+ ƒXƒNƒŠƒvƒgfixheal A percentheal ’ljÁBŽg—p•û–@‚Íheal‚Æ“¯‚¶‚Å‚·B
+ fixheal‚Ívit‚ƃXƒLƒ‹HP‰ñ•œ—ÍŒüã‚É‚æ‚éƒ{[ƒiƒX‚ª‚È‚¢•¨‚Å
+ percentheal ‚ÍŒã‚Ì”Žš‚ð %‚É”FŽ¯‚µ‚Ü‚·B
+ pc.h
+ pc.c
+ pc_percentheal()‚ð’ljÁB
+ item_db.txtAitem_db2.txt
+ ƒCƒOƒhƒ‰ƒVƒ‹‚ÌŽÀ‚ƃCƒOƒhƒ‰ƒVƒ‹‚ÌŽí‚ð•ÏXB
+
+----------
+//0303 by ŒÓ’±—–
+
+E*.grf‚̃pƒX‚ðmap_athena.cnf‚É‚à‘‚¯‚é‚悤‚É‚µ‚½B
+ Emap_athena.cnf‚Éudata_grf: ../data/data.grfv‚â
+ usdata_grf: ../sakurai/sdata.grfv‚̂悤‚ɃpƒXŽw’è‚Å‚«‚Ü‚·B
+ Egrf-files.txt‚ª‚ ‚éꇂ»‚¿‚ç‚Ìݒ肪—D悳‚ê‚Ü‚·
+
+ (common/)
+ grfio.c/grfio.h
+ grfio_setdatafile(),grfio_setsdatafile()’ljÁB
+ data_file,sdata_file‚ðƒtƒ@ƒCƒ‹ƒ[ƒJƒ‹‚ȃOƒ[ƒoƒ‹•Ï”‚É•ÏXB
+
+E@stpoint,@skpoint‚É•‰’lŽw’è‚͈̔̓`ƒFƒbƒN‚ð’ljÁ
+E@zenyƒRƒ}ƒ“ƒh’ljÁiƒ[ƒj[‚Ì’²®j
+E@str,@agi,@vit,@int,@dex,@lukƒRƒ}ƒ“ƒh’ljÁiŠî–{ƒpƒ‰ƒ[ƒ^’²®j
+
+ atcommand.c
+ @stpoint,@skpointC³
+ @zeny,@str,@agi,@vit,@int,@dex,@luk’ljÁ
+
+Eƒƒ}[ƒiƒCƒg‚ðŽg‚¤‚Æ‚Ú‚Á‚½‚­‚ç‚ê‚Ä‚¢‚½–â‘è‚ðC³
+E•Ší»‘¢•”•ª‚̃R[ƒh‚𑽭•ÏX
+ EÞ—¿Á”‚ðƒAƒCƒeƒ€‚ª•¡”ƒCƒ“ƒfƒbƒNƒX‚É•ª‚©‚ê‚Ä‚¢‚éꇂɑΉž‚³‚¹‚½
+ i‚R–œŒÂŒÀŠE‚ð’´‚¦‚é‚ƕʃCƒ“ƒfƒbƒNƒX‚ðŽg‚¤Žd—l‚¾‚Á‚½‹C‚ª‚·‚é‚Ì‚Åj
+ EŽ¸”sŽž‚É‚àŽü‚è‚É’Ê’m‚·‚é‚悤‚É‚µ‚½
+
+ skill.c
+ skill_check_condition()‚ÌC³
+ skill_produce_mix()‚ÌC³
+
+E•Ší»‘¢Šm—¦‚ðconfƒtƒ@ƒCƒ‹‚Å”{—¦Žw’è‚Å‚«‚é‚悤‚ÉC³
+
+ (conf/)
+ battle_athena.cnf
+ weapon_produce_rate’ljÁ
+ (map/)
+ skill.c
+ skill_produce_mix()‚ÌC³
+
+E•ŠíATKƒTƒCƒY•â³ƒe[ƒuƒ‹‚ðŠO•”‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
+E¸˜B¬Œ÷Šm—¦/¸˜Bƒ{[ƒiƒX‚È‚Ç‚ðŠO•”‚©‚ç“Ç‚Ýž‚ނ悤‚É‚µ‚½
+E‰ß踘Bƒ{[ƒiƒX‚É‚æ‚é’ljÁƒ_ƒ[ƒWŽÀ‘•
+
+ (db/)
+ size_fix.txt
+ ƒTƒCƒY•â³ƒe[ƒuƒ‹
+ refine_db.txt
+ ¸˜BŠÖŒWƒf[ƒ^
+ (map/)
+ pc.c
+ pc_readdb()‚Å“Ç‚Ýž‚Ý
+ battle.c
+ battle_calc_weapon_attack()‚ɉß踘Bƒ{[ƒiƒXˆ—’ljÁ
+
+EMAXHP‚È‚Ç‚ªƒT[ƒo[‚ƃNƒ‰ƒCƒAƒ“ƒg‚ňႤ’l‚ÉŒ©‚¦‚éƒoƒOC³
+ ƒƒOƒCƒ“’¼Œã‚̃Xƒe[ƒ^ƒXŒvŽZ‚ÌŒ‹‰Ê‚𒼂¿‚É‘—M‚·‚é‚悤‚É‚µ‚½
+
+ (map/)
+ pc.c
+ pc_authok()‚Å‚Ìpc_calcstatus()‚̃tƒ‰ƒO‚ð0‚É‚µ‚½
+ ‚±‚ê‚Åpc_calcstatus()‚̃tƒ‰ƒOƒpƒ‰ƒ[ƒ^‚Í–¢Žg—pH
+
+Eitem_db‚Ìu”EŽÒƒX|ƒcv‚ðu”EŽÒƒX[ƒcv‚ÉC³
+ (db/)
+ item_db.txt/item_db2.txt
+ ”EŽÒƒX[ƒc‚Ì–¼Ì•ÏX
+
+EƒƒOƒCƒ“l”‚𒲂ׂéƒc[ƒ‹‚ð“Y•t
+ Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
+ Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
+ Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
+
+ (tool/)
+ getlogincount
+ ƒƒOƒCƒ“l”Š“¾PerlƒXƒNƒŠƒvƒg
+
+----------
+//0302 by Ž€_
+EƒAƒCƒeƒ€»‘¢ Šm—¦”»’èŽÀ‘•B
+ “S‚ÌꇬŒ÷—¦‚Í
+ (20 + base_level*0.3 + DEX*0.2 + LUK*0.1 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*6)%
+ |“S‚Æ‘®«ÎA¯‚Ì‚©‚¯‚ç‚Ìê‡
+ (10 + base_level*0.3 + DEX*0.2 + LUK*0.1 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*5)%
+ •Ší‚Í
+ ((2.5 + base_level*0.15 + DEX*0.1 + LUK*0.05 + —v‹ƒXƒLƒ‹ƒŒƒxƒ‹*5 +
+ ‹à•~ - ‘®«Î‚Ư‚Ì‚©‚¯‚ç) * (1 - (•ŠíƒŒƒxƒ‹ - 1)*0.2) +
+ ƒXƒLƒ‹•ŠíŒ¤‹†ƒŒƒxƒ‹*1)%
+ ‹à•~: ‚È‚¢ê‡ -5%‚Å‹à•~‚Í 0%AƒIƒŠƒfƒIƒRƒ“‚Ì‹à•~‚Í
+ 2.5%A‰©‹à‚Ì‹à•~‚Í 5%AƒGƒ“ƒyƒŠƒEƒ€‚Ì‹à•~‚Í 7.5%
+ ‘®«Î‚Ư‚Ì‚©‚¯‚ç: ‘®«Î‚ª‚ ‚éê‡ 5%‚ÅX‚É
+ ¯‚Ì‚©‚¯‚ç‚Ì” * 5%‚ð‘«‚µ‚Ü‚·B
+ ‚É‚È‚è‚Ü‚·‚ª‚¿‚å‚Á‚ÆŠm—¦‚ª’á‚·‚¬‚é‹C‚à‚µ‚Ü‚·‚Ì‚Å
+ base_level*0.3 + DEX*0.2 + LUK*0.1‚ðbase_level*0.5 + DEX*0.4 + LUK*0.3‚É
+ base_level*0.15 + DEX*0.1 + LUK*0.05‚ðbase_level*0.4 + DEX*0.3 + LUK*0.2
+ ’ö“x‚É•Ï‚¦‚½•û‚ª‚¢‚¢‚©‚à’m‚è‚Ü‚¹‚ñB
+ skill.c
+ skill_can_produce_mix() ‚Æ skill_produce_mix() ‚ðC³B
+ produce_db.txt
+ ¯‚Ì‚©‚¯‚ç‚ðƒXƒLƒ‹‘®«Î»‘¢‚ª•K—v‚É•ÏXB
+E*.grf“™‚ðÝ’u‚¹‚¸ƒfƒBƒŒƒNƒgƒŠ‚©‚ç‚Ì“Ç‚Ýž‚ނ悤‚ÉC³B(‚±‚ê‚ÍYare‚©‚ç
+ Ž‚¿ž‚ñ‚¾•¨‚Å‚·‚ª...)
+ grfio.c
+ grfio_init()‚ðC³B
+ grf-file.txt
+ V‹K’ljÁBgrfƒtƒ@ƒCƒ‹‚ª‚ ‚éƒfƒBƒŒƒNƒgƒŠÝ’è—pB
+E“Ç‚Ýž‚Þƒ}ƒbƒv‚Ìő唂ð512‚ÉC³B
+ mmo.h
+ MAX_MAP_PER_SERVER‚ð384‚©‚ç512‚ÉC³B
+Epc.c‚Épc_search_inventory()‚ð’ljÁB
+ ‹@”\‚Íitem_id‚̃AƒCƒeƒ€‚ðŽ‚Á‚Ä‚é‚©‚Ç‚¤‚©‚ðŠm”F‚µ‚Ä
+ Ž‚Á‚Ä‚éꇂ»‚Ìindex‚ð•Ô‚·B
+ item_id‚ª0‚Ìꇂ͋󂯂Ă銂Ìindex‚ð•Ô‚·B
+ pc_additem()‚Æpc_takeitem()‚¾‚¯‚ð­‚µC³B
+EGMƒRƒ}ƒ“ƒh‚É@stpoint‚Æ@skpoint‚ð’ljÁB
+ @stpoint ”Žš - ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðã‚°‚éB
+ @skpoint ”Žš - ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðã‚°‚éB
+ atcomand.c
+ C³B
+ atcomand.h
+ strcmpi“™‚ðLinux‚Å‚àŽg‚¦‚é‚悤‚ÉC³B
+
+----------
+//0301 by ŒÓ’±—–
+
+EÅ‘åHP‚ª32767‚ð’´‚¦‚é‚ƈÙí‚È’l‚É‚È‚é–â‘è‚ÌC³
+ELv‚ª99‚ð’´‚¦‚é‚Æ‚«‚àƒGƒtƒFƒNƒg‚ðo‚·‚悤‚É‚µ‚½(Ž©•ª‚É‚ÍŒ©‚¦‚È‚¢–Í—l)
+E”z’uMOB‚É‚æ‚éƒCƒxƒ“ƒg‚ŃCƒxƒ“ƒg–¼‚ª‚SƒoƒCƒgˆÈã‚Æ‚¢‚¤§ŒÀ‚ð‚‚¯‚½
+EteleportŽž‚ÉŽæˆø’†’fAƒ`ƒƒƒbƒg‘ÞŽºA‘qŒÉ•Û‘¶ˆ—‚ð‚·‚é‚悤‚É‚µ‚½
+
+ pc.c
+ pc_calcstatus()‚ÌC³(HPŒvŽZ)
+ pc_setpos()‚ÌC³(Žæˆø’†’f‚È‚Ç)
+ clif.c
+ clif_set0078(),clif_set007b(),clif_spawnpc()‚ÌC³(Lv99ƒGƒtƒFƒNƒg)
+ npc.c
+ npc_parse_mob()‚ÌC³
+
+E@h‚Åhelp.txt‚ª“Ç‚ß‚È‚¢‚Æ‚«‚É—Ž‚¿‚éƒoƒOC³
+E@lvup/@joblvup‚Å•‰’l‚ð“ü‚ê‚é‚ÆLvƒ_ƒEƒ“‚ª‰Â”\‚É‚È‚Á‚½
+
+ atcommand.c
+ @h,@lvup,@joblvupˆ—‚ÌC³
+
+EƒeƒŒƒ|[ƒg‚È‚Ç‚ÌÁ–ŃGƒtƒFƒNƒg‚ÌC³
+
+ skill.c
+ ƒeƒŒƒ|‚ÌÁ–ŃGƒtƒFƒNƒg‚ð•ÏX
+
+Eó‘ÔˆÙí‚ÉŠÖ‚·‚éƒXƒNƒŠƒvƒgŽÀ‘• [sc_start]‚Æ[sc_end]B
+E—ÎPOTA—΃n[ƒu‚È‚ÇŽÀ‘•
+E‘•”õƒ{[ƒiƒXƒf[ƒ^’ljÁ
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ‘•”õƒ{[ƒiƒXƒf[ƒ^‚ð’ljÁ
+ —ÎPOTA—΃n[ƒu‚Ȃǂ̃XƒNƒŠƒvƒg’ljÁ
+ (map/)
+ script.c
+ buildin_warp()‚ÅÁ–ŃGƒtƒFƒNƒg‚ð•ÏX
+ buildin_sc_start(),buildin_sc_end()’ljÁ
+
+----------
+//0299 by ŒÓ’±—–
+
+ENPCƒCƒxƒ“ƒg‚ŃGƒNƒXƒ|[ƒg‚³‚ꂽƒ‰ƒxƒ‹‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚½
+ NPCƒXƒNƒŠƒvƒg‚ÅOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚·‚é‚ÆAƒGƒNƒXƒ|[ƒg‚µ‚Ü‚·B
+ NPCƒCƒxƒ“ƒg‚Å"NPC–¼(orƒCƒxƒ“ƒg–¼)::ƒ‰ƒxƒ‹–¼"‚Æ‚·‚é‚ÆA
+ Žw’肵‚½ƒ‰ƒxƒ‹‚©‚çŽÀs‚Å‚«‚Ü‚·B
+ ƒ‰ƒxƒ‹–¼‚Í24ƒoƒCƒgˆÈ“à‚É‚µ‚ĉº‚³‚¢B
+ ‚ ‚ƃvƒƒOƒ‰ƒ€“I‚Ƀƒ‚ƒŠŒø—¦ˆ«‚¢‚Å‚·BŒã“úC³—\’è
+ <—á>
+ NPCutestv‚̃XƒNƒŠƒvƒg“à‚Å OnEvent: ‚ƃ‰ƒxƒ‹’è‹`‚µ‚½ê‡A
+ NPCƒCƒxƒ“ƒgutest::OnEventv‚ÅŽw’èˆÊ’u‚©‚çŽÀs‚Å‚«‚Ü‚·B
+
+ (conf/)
+ npc_test_ev.txt
+ ƒ‰ƒxƒ‹Žw’è‚̃Tƒ“ƒvƒ‹‚à‚¿‚傱‚Á‚ƒljÁ
+ (map/)
+ script.c/script.h
+ script_get_label_db()‚Ȃǂ̒ljÁB
+ parse_script‚Åscriptlabel_db‚Ƀ‰ƒxƒ‹ƒf[ƒ^‚ð’ljÁ‚·‚é
+ npc.c/npc.h
+ npc_event_export()‚ȂǒljÁ
+ npc_parse_script‚щƒxƒ‹ƒf[ƒ^‚ðƒGƒNƒXƒ|[ƒg‚·‚é
+ map.h
+ struct map_session_data ‚Ìeventqueue‚̃Cƒxƒ“ƒg–¼‚̃TƒCƒY‚ð
+ 50ƒoƒCƒg‚É‚µ‚½B
+
+EAGI‚ÆDEX‚É‚æ‚éASPDŒvŽZ‚ÌÅ‘å’l‚ð180‚©‚ç190‚É•ÏX
+ pc.c
+ pc_calcstatus()‚ÌASPDŒvŽZC³
+
+Eskill_db.txt/cast_db.txt‚Ì“Ç‚Ýž‚Ý‚ðskill.c‚É•ÏX
+
+ pc.c
+ pc_readdb()‚ÌC³
+ skill.c
+ skill_readdb()‚̒ljÁ
+
+EƒAƒCƒeƒ€»‘¢‰¼ŽÀ‘•
+ Šm—¦”»’肪–¢ŽÀ‘•‚Å‚·B•K‚¸¬Œ÷‚µ‚Ü‚·B
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ƒAƒCƒeƒ€»‘¢‚ɑΉžiŒg‘Ñ—p—nz˜FA‹à’Æ‚È‚Çj
+ produce_db.txt
+ V‹K’ljÁB»‘¢ƒŠƒXƒgB
+ (map/)
+ skill.c/skill.h
+ struct skill_produce_db’ljÁ
+ skill_readdb()‚Åproduce_db.txt‚ð“ǂނ悤‚É
+ clif.c/clif.h
+ clif_skill_produce_mix_list(),clif_parse_ProduceMix()’ljÁ
+ script.c/script.h
+ »‘¢—pƒRƒ}ƒ“ƒh[produce]ì¬B
+ ˆø”‚Í»‘¢—p”’l‚ÅA1-4‚ª•Ší»‘¢(Lv)A16‚ªzÎ
+
+
+----------
+//0298 by ŒÓ’±—–
+
+ELoginŽI‚̃pƒXƒ[ƒhˆÃ†‰»ƒ^ƒCƒv‚ðŽ©“®”FŽ¯‚Å‚«‚é‚悤‚É•ÏX
+ login.h‚ÌPASSWORDENC‚ð3‚É‚·‚é‚ÆŽ©“®”FŽ¯‚µ‚Ü‚·B
+ ʼn‚Épasswordencrypt‚Ń`ƒFƒbƒN‚µAŽ¸”s‚·‚ê‚Î
+ passwordencrypt2‚Ń`ƒFƒbƒN‚µ‚Ü‚·B
+
+ (login/)
+ login2.c/login.h
+ ˆÃ†‰»ƒpƒXƒ[ƒh‚ÌƇ•”•ª‚ðC³
+
+EƒAƒJƒEƒ“ƒg쬃c[ƒ‹‚ð“Y•t
+ Perl»‚È‚Ì‚ÅŽÀs‚É‚ÍPerl‚ª•K—v‚Å‚·B
+ Žg—p•û–@‚Ȃǂ̓GƒfƒBƒ^‚ÅŠJ‚¢‚ÄŒ©‚Ä‚­‚¾‚³‚¢B
+ Žg‚¢•û‚ª—Ç‚­‚í‚©‚ç‚È‚¢l‚ÍŽè‚ðo‚³‚È‚¢‚Ù‚¤‚ª‚¢‚¢‚Å‚·B
+
+ (tool/)
+ addaccount
+ ƒAƒJƒEƒ“ƒg쬃c[ƒ‹PerlƒXƒNƒŠƒvƒg
+
+EƒXƒLƒ‹‚̒ljÁC³
+ Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚̉ñ”§ŒÀ‚ðƒOƒ‹[ƒv–ˆ‚©‚烆ƒjƒbƒg–ˆ‚ÉC³
+ EƒNƒ@ƒOƒ}ƒCƒA‰¼ŽÀ‘• i“G‚̈ړ®‘¬“xAƒLƒƒƒ‰‚Ì•\Ž¦”’l‚͕ω»‚¹‚¸j
+ EƒEƒH[ƒ^[ƒ{[ƒ‹‰¼ŽÀ‘•i“®ì‚ª³‚µ‚¢‚Ì‚©•s–¾j
+ EƒtƒƒXƒgƒmƒ”ƒ@‰¼ŽÀ‘•iƒGƒtƒFƒNƒg‚ª—Ç‚­‚í‚©‚ç‚È‚¢‚Ì‚Å“K“–j
+ Eƒxƒmƒ€ƒ_ƒXƒg‰¼ŽÀ‘•i”͈͂Ƃ©‚ª³‚µ‚¢‚©‚Ç‚¤‚©•sˆÀj
+ Eƒvƒƒ{ƒbƒNAƒI[ƒgƒo[ƒT[ƒNA¹‘Ì~•ŸA»‚Ü‚«AΓŠ‚°‚ÌŽÀ‘•
+ EƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‚Ì“Å•t—^ŽÀ‘•
+
+ *’ˆÓ* “Åó‘Ô‚ÍŒ©‚½–Ú‚¾‚¯‚ÅŒø‰Ê‚Í–¢ŽÀ‘•
+
+ (db/)
+ skill_db.txt
+ »‚Ü‚«/ΓŠ‚°/ƒEƒH[ƒ^[ƒ{[ƒ‹‚È‚ÇC³
+ (map/)
+ skill.c/skill.h
+ FXC³
+ mob.c/mob.h
+ mob_target()’ljÁBMOB‚̃^ƒQ—p
+ battle.c
+ battle_get_*()ŒnC³‚È‚Ç
+ pc.c
+ pc_calcstatus()C³
+
+----------
+//0297 by ŒÓ’±—–
+
+ELoginŽI‚ªƒpƒXƒ[ƒhˆÃ†‰»‚ɑΉž
+ ˆÃ†‰»key‚ÍŽI‹N“®Žž‚Ɉê“x‚¾‚¯ì¬‚µ‚Ü‚·B
+
+ **’ˆÓ**
+ ˆÃ†‰»ƒpƒXƒ[ƒh‚ðŽg‚Á‚Ä‚¢‚éꇂÍAƒAƒJƒEƒ“ƒg‚ð쬂ł«‚Ü‚¹‚ñB
+ ƒAƒJƒEƒ“ƒg‚ðì‚éꇂÍclientinfo.xml‚ð•ÒW‚·‚é‚È‚Ç‚µ‚ÄA
+ ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚µ‚È‚¢ƒNƒ‰ƒCƒAƒ“ƒg‚ðŽg‚¤•K—v‚ª‚ ‚è‚Ü‚·B
+
+ (login/)
+ login2.c/login.h
+ ˆÃ†‰»ƒpƒXƒ[ƒh‚̃pƒPƒbƒgˆ—’ljÁ
+ ˆÃ†‰»key‚̶¬ˆ—’ljÁ
+ md5calc.c/md5calc.h
+ V‹K’ljÁBmd5ŒvŽZ—p
+
+
+EƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ÉDEX‚ª”½‰f‚³‚ê‚È‚¢‚悤‚ÉC³
+ skill.c
+ skill_delay_fix()‚ÌC³
+
+EŽ€–SŒã‚àˆê•”‚Ìó‘ÔˆÙí‚ÌŒø‰Ê‚ªŽ‘±‚·‚é–â‘è‚ðC³
+ pc.c
+ pc_damage()‚ÅŽ€–SŽž‚Épc_calcstatus()‚ðŒÄ‚Ԃ悤‚ÉC³
+ atcommand.c
+ Ž€–SŽžˆ—‚ðˆê–{‰»‚·‚邽‚ß@die‚Å‚Ípc_damage‚ðŒÄ‚Ԃ悤‚ÉC³
+
+
+----------
+//0295 by ŒÓ’±—–
+
+EƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv‚ȂǂɃXƒLƒ‹‚ðŽg‚¤‚ƃ}ƒbƒvŽI‚ª—Ž‚¿‚é–â‘è‚ÌC³
+
+ battle.c
+ battle_get_*()‚È‚Ç‚ÅBL_PC,BL_MOB‚¶‚á‚È‚¢‚Æ‚«‚̈—‚ð’ljÁ
+ skill.c/skill.h
+ skill_unit_ondamage()’ljÁ
+
+E–ñ21Mz‚ð’´‚¦‚éƒAƒCƒeƒ€‚ðNPC‚ňµ‚¤‚Æ‚«OC,DCŒvŽZ‚Å’l’i‚ª‚¨‚©‚µ‚­‚È‚éƒoƒOC³
+ DC‚Å‚Í20MzAOC‚Å‚Í70Mz‚ð’´‚¦‚éƒAƒCƒeƒ€‚ÍdoubleŒ^‚É‚µ‚ÄŒvŽZ‚µ‚Ü‚·
+
+ pc.c
+ pc_modifysellvalue(),pc_modifysellvalue()‚ÌC³
+
+----------
+//0294 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ŃGƒŠƒAŽw’è‚ÌMOB•¦‚«–½—ß‚ðì¬
+ areamonster "ƒ}ƒbƒv–¼",x0,y0,x1,y1,"MOB•\Ž¦–¼",MOB‚Ìclass,”,"ƒCƒxƒ“ƒg–¼"
+ À•WŽw’肪(x0,y0)-(x1,y1)‚Ì”CˆÓƒ|ƒCƒ“ƒg‚ɂȂ邾‚¯‚Å‘¼‚Ímonster–½—ß‚Æ“¯‚¶‚Å‚·
+
+ script.c
+ buildin_areamonster()’ljÁ
+ mob.c/mob.h
+ mob_once_spawn_area()’ljÁ
+
+EƒAƒCƒXƒEƒH[ƒ‹‚ÌŽI‘¤ˆ—‰¼ŽÀ‘•
+ UŒ‚‚Å‚«‚È‚¢‚È‚Ç‚Ì–â‘è‚Í‚ ‚é‚à‚Ì‚ÌAŽI‘¤‚Å‚Í‚Æ‚è‚ ‚¦‚¸“®‚«‚Ü‚·B
+ ‚½‚¾AƒNƒ‰ƒCƒAƒ“ƒg‚Éi“ü•s‰Â”\ƒGƒŠƒA‚ð‹³‚¦‚éƒpƒPƒbƒg‚ª‚í‚©‚ç‚È‚¢‚Ì‚ÅA
+ ŽI‘¤‚Å‚ÍIW‚̉ñ‚èž‚Ý‚ðs‚¤ê‡‚Å‚àAƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å‚Í‚·‚蔲‚¯‚Ä‚¢‚é
+ ‚悤‚ÉŒ©‚¦‚Ü‚·B
+
+ skill.c
+ ŠY“–ˆ—’ljÁ‚È‚Ç
+
+----------
+//0293
+E2-2ŽŸE‚̃XƒLƒ‹ƒRƒƒ“ƒg‚ÌC³iˆê•”’ljÁj
+ (db/)
+ skill_db.txt
+ skill_tree.txt
+
+
+----------
+//0292 by ŒÓ’±—–
+
+ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘è‚Ì‚Ü‚Æ‚à‚ÈHC³Part2
+ E”„”ƒ‚Å‚«‚È‚©‚Á‚½–â‘èC³
+
+ map.h
+ struct map_session_data ‚Énpc_shopidƒƒ“ƒo’ljÁ
+ npc.c
+ npc_click()‚È‚ÇC³
+
+EƒXƒNƒŠƒvƒg–½—ߒljÁ
+ EŽw’èƒGƒŠƒA‚̃†[ƒU[”‚ÌŠ“¾
+ getareausers("ƒ}ƒbƒv–¼",x0,y0,x1,y1)
+ Žw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚É‚¢‚éPC‚Ì”‚ðŒvŽZ
+ EŽw’èƒGƒŠƒA‚̃†[ƒU[‚̃[ƒv
+ areawarp "“]‘—Œ³ƒ}ƒbƒv–¼",x0,y0,x1,y1,"“]‘—æƒ}ƒbƒv–¼",x,y;
+ Žw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚É‚¢‚é‘SPC‚ðŽw’èƒ}ƒbƒv‚Ì(x,y)‚É“]‘—B
+
+ script.c
+ buildin_areawarp(),buildin_getareausers()’ljÁ
+
+EƒXƒLƒ‹C³
+ EƒeƒŒƒ|[ƒgŽg—pŽž‚ÉuƒeƒŒƒ|[ƒg!!v‚Æ‹©‚Ԃ悤‚ÉB
+ EƒXƒg[ƒ“ƒJ[ƒX‚̬Œ÷—¦‚ª’á‚¢‚Ì‚ðC³
+
+ skill.c
+ skill_castend_nodamage_id()C³
+
+----------
+//0291 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg–½—ߒljÁ
+ ENPC‚Ì—LŒø–³Œø‚ªØ‚è‘Ö‚¦‚ç‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ disablenpc "NPC–¼"‚Å–³Œø‰»Aenablenpc "NPC–¼"‚Å—LŒø‰»B
+ NPC–¼‚ªd•¡‚µ‚Ä‚¢‚é‚Æ‚«‚Ì“®ì‚Í•s’è‚Å‚·B
+ Žå‚Ƀ[ƒvƒ|ƒCƒ“ƒg‚𖳌ø‰»‚·‚é‚Æ‚«‚ÉŽg‚¢‚Ü‚·B
+
+ Eƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð•ÏX‚·‚éƒXƒNƒŠƒvƒg–½—ߒljÁ
+ addtimercount "ƒCƒxƒ“ƒg–¼",ƒ~ƒŠ•b
+ ‚ÅAƒ^ƒCƒ}‚ÌŠúŒÀ‚ð‰„‚Î‚¹‚Ü‚·i•‰’l‚ðŽw’肵‚ÄŒ¸‚ç‚·‚±‚Æ‚ào—ˆ‚Ü‚·j
+
+ EƒAƒiƒEƒ“ƒX‚ÌŠg’£
+ mapannounce "ƒ}ƒbƒv–¼","ƒAƒiƒEƒ“ƒX•¶Žš—ñ",ƒtƒ‰ƒO
+ ‚ÅŽw’èƒ}ƒbƒv‚ɃAƒiƒEƒ“ƒX‚𗬂µ‚Ü‚·Bƒtƒ‰ƒO‚Í0‚ʼn©FA16‚Å‚ł·B
+ areaannounce "ƒ}ƒbƒv",x0,y0,x1,y1,"•¶Žš—ñ",ƒtƒ‰ƒO
+ ‚ÅŽw’èƒ}ƒbƒv‚Ì(x0,y0)-(x1,y1)‚̃GƒŠƒA‚ɃAƒiƒEƒ“ƒX‚𗬂µ‚Ü‚·B
+ ƒtƒ‰ƒO‚Ímapannounce‚Æ“¯‚¶‚ÅA0‚ʼn©FA0x10‚Å‚ł·B
+
+ (conf/)
+ npc_test_arena.txt
+ ƒTƒ“ƒvƒ‹‚ÌC³
+ (map/)
+ script.c
+ buildin_disablenpc(),buildin_enablenpc(),
+ buildin_mapannounce(),buildin_areaannounce(),
+ buildin_addtimercount()‚̒ljÁ
+ npc.c/npc.h
+ NPC‚Ì—LŒø–³Œøˆ—’ljÁ
+ map.h
+ struct npc_data‚Éflagƒƒ“ƒo’ljÁ(1ƒrƒbƒg–Ú‚ª–³Œøƒtƒ‰ƒO)
+ clif.c
+ clif_getareachar_npc()‚ÌC³
+ pc.c/pc.h
+ pc_addeventtimercount()’ljÁ
+
+ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘è‚Ì‚Ü‚Æ‚à‚ÈHC³
+ SHOP NPC‚ÆŽæˆø’†‚Å‚àƒCƒxƒ“ƒg‚ª‹N‚±‚é‚悤‚É‚È‚è‚Ü‚·B
+ ‚±‚ê‚ÍRO‚ÌŽd—lã”ð‚¯‚é‚Ì‚ª“‚¢‚½‚ß‚±‚̂悤‚ÈŒ‹‰Ê‚Å—Ž‚¿’…‚«‚Ü‚µ‚½B
+
+ npc.c
+ npc_click()“™‚ÌC³
+
+EƒXƒLƒbƒhƒgƒ‰ƒbƒv‚ÅŽc‘œ‚ªŽc‚é–â‘èC³
+ skill.c
+ skill_blown()‚Åclif_walkok()‚È‚Ç‚ðŒÄ‚Ԃ悤‚ÉB
+ skill_unit_onplace()‚Ìclif_fix*pos()‚ðíœB
+
+----------
+//0290 by ŒÓ’±—–
+
+EƒXƒNƒŠƒvƒg‚ÅMAPŽI“à‹¤—L•Ï”‚ªŽg‚¦‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ •Ï”–¼‚ð$‚ÅŠJŽn‚·‚é‚ÆAMAPŽI“à‚Ì‘Sˆõ‚Å‹¤—L‚·‚é•Ï”‚É‚È‚è‚Ü‚·B
+
+ Œ¾—t‚Ì–â‘è‚Å‚·‚ªAPC‚Ìglobalreg‚Íu‘åˆæ“Iv‚Æ‚¢‚¤‚æ‚èu‰i‘±«‚Ì‚ ‚év
+ •Ï”‚Å‚ ‚Á‚ÄAMAPŽI“à‹¤—L•Ï”‚Ì‚Ù‚¤‚ª‘åˆæ“I‚Á‚ăCƒ[ƒW‚ª‹­‚¢‚ñ‚Å‚·‚ªc
+
+ script.c
+ mapval_db’è‹`
+ buildin_set(),buildin_input()‚ÌC³
+ do_init_script()’ljÁ
+ map.c
+ do_init()‚Ådo_init_script()‚ðŒÄ‚Ԃ悤‚ÉB
+
+EƒCƒxƒ“ƒgƒLƒ…[‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ EƒLƒ…[ƒTƒCƒY‚Í‚Q‚Å‚·B•K—v‚Ȃ瑂₵‚Ü‚·‚ªB
+
+ ƒTƒ“ƒvƒ‹‚Ì[ev_doƒeƒXƒg]‚ª‚¿‚á‚ñ‚Æ“®‚­‚悤‚É‚È‚Á‚½‚ÆŽv‚¢‚Ü‚·B
+
+ map.h
+ struct map_session_data‚Éeventqueueƒƒ“ƒo’ljÁ
+ npc.c
+ npc_event_timer()’ljÁ
+ script.c
+ run_script()‚ÅENDˆ—‚ŃLƒ…[‚̈—’ljÁ
+
+EƒXƒNƒŠƒvƒg‚Ń^ƒCƒ}[‚ªŽg—p‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ Žg—p•û–@‚ÍAaddtimer ƒ~ƒŠ•b,"ƒCƒxƒ“ƒg–¼" ‚Ń^ƒCƒ}[’ljÁA
+ deltimer "ƒCƒxƒ“ƒg–¼" ‚Ń^ƒCƒ}[íœB
+
+ (common/)
+ timer.c/timer.h
+ get_timer(),addtick_timer()’ljÁ
+ (map/)
+ map.c/map.h
+ struct map_session_data‚Éeventtimerƒƒ“ƒo’ljÁ
+ map_quit()‚Åpc_cleareventtimer()‚ðŒÄ‚Ԃ悤‚ÉB
+ pc.c
+ pc_addeventtimer(),pc_deleventtimer(),pc_eventtimer(),
+ pc_cleaereventtimer()’ljÁ
+ pc_authok()‚Åeventimer‚̉Šú‰»
+ script.c
+ buildin_addtimer(),buildin_deltimer()’ljÁ
+
+EƒXƒNƒŠƒvƒg‚̒ljÁ
+ Egetusers,getmapusers,killmonster‚̒ljÁ
+ getusers(x)‚̓†[ƒU[”Š“¾Ax=0‚ÅPC‚ÌMAP,1=‘SMAP,8=NPC‚ÌMAPB
+ getmapusers("ƒ}ƒbƒv–¼")‚ÍŽw’èƒ}ƒbƒv‚̃†[ƒU[”‚ðŠ“¾‚·‚éB
+ killmonster "ƒ}ƒbƒv–¼","ƒCƒxƒ“ƒg–¼"‚ÅŠY“–‚̃}ƒbƒv‚É‚¢‚éA
+ ŠY“–‚̃Cƒxƒ“ƒg‹ì“®Žw’胂ƒ“ƒXƒ^[‚ð‘S‚ÄíœB
+ EannounceƒRƒ}ƒ“ƒhŠg’£
+ ƒtƒ‰ƒO‚Ì0x08ƒrƒbƒg‚ª1‚È‚çƒ}ƒbƒv‚âƒGƒŠƒAŒvŽZ‚ÉPC‚Å‚È‚­NPC‚ðŽg‚¤
+
+ mob.c/mob.h
+ mob_delete()’ljÁ
+ script.c
+ buildin_getusers(),buildin_getmapusers(),
+ buildin_killmonster()’ljÁ
+ clif.c/clif.h
+ clif_GMmessage()‚̈ø”•ÏX
+
+EƒCƒxƒ“ƒgƒTƒ“ƒvƒ‹’ljÁ
+ ŠÈ’P‚ȃAƒŠ[ƒi‚̃Tƒ“ƒvƒ‹‚ð’ljÁB
+
+ (conf/)
+ npc_test_ev.txt
+ ]—ˆ‚̃Tƒ“ƒvƒ‹‚ÌC³
+ npc_test_arena.txt
+ ŠÈ’P‚ȃAƒŠ[ƒi‚̃Tƒ“ƒvƒ‹
+ ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì–³Œø‰»ƒRƒ}ƒ“ƒh‚È‚Ç‚ª•K—v‚ÆŽv‚í‚ê‚éB
+
+ESHOP NPC‚ɘb‚µŠ|‚¯‚é‚ÆNPC‚ª”½‰ž‚µ‚È‚­‚È‚é–â‘èC³
+
+ npc.c
+ npc_buylist(),npc_selllist()C³
+
+----------
+//0289 by ŒÓ’±—–
+
+EƒCƒxƒ“ƒg‹ì“®Œ^ƒXƒNƒŠƒvƒg‚ÌC³‚È‚Ç
+ E‘¼‚ÌNPC‚ɘb‚µŠ|‚¯‚Ä‚¢‚é‚Æ‚«‚̓Cƒxƒ“ƒg‚ª–³Ž‹‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ =>ƒLƒ…[‚É“ü‚ê‚é‚Ȃǂ̈—‚ª‚¢‚é‚ÆŽv‚í‚ê‚éB
+
+ ‚±‚ÌŠÖŒW‚ÅAƒTƒ“ƒvƒ‹‚Ì[ev_doƒeƒXƒg]NPC‚ðƒNƒŠƒbƒN‚µ‚Ä‚à
+ IDƒGƒ‰[‚ªo‚ĉ½‚à‹N‚«‚Ü‚¹‚ñBƒCƒxƒ“ƒgƒLƒ…[‚ðì‚ê‚Î’¼‚é‚Í‚¸B
+
+ npc.c
+ npc_event(),npc_click()‚Énpc_idƒ`ƒFƒbƒN‚ð’ljÁ
+ script.c
+ I—¹Žž‚Énpc_id‚ðƒNƒŠƒA‚·‚é‚悤‚É
+
+EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[announce]‚̒ljÁ
+ EGMƒƒbƒZ[ƒW‚É‚æ‚éannounceB
+ ‘æ1ˆø”‚Í•¶Žš—ñA‘æ2ˆø”‚̓tƒ‰ƒO‚ÅA
+ ƒtƒ‰ƒO‚̉ºˆÊ‚Sƒrƒbƒg‚ª0=‘S‚ÄA1=“¯‚¶ƒ}ƒbƒvA
+ 2=‰æ–Ê“àA3=Ž©•ª‚Ì‚ÝA4=“¯‚¶ƒ}ƒbƒvŽI‚É‘—MB
+ ƒtƒ‰ƒO‚Ì‚Sƒrƒbƒg–Ú‚ÍFƒtƒ‰ƒO‚ÅA0x10=ÂA0x00=‰©F
+
+ script.c
+ buildin_announce()‚̒ljÁ
+ clif.c
+ clif_send()‚ÅSELF‚̈—’ljÁ
+ clif_GMmessage()‚̈ø”•ÏX
+ intif.c
+ intif_GMmessage()‚̈ø”•ÏX
+
+Eƒƒ‚‹ÖŽ~AƒeƒŒƒ|‹ÖŽ~AƒZ[ƒu‹ÖŽ~ƒ}ƒbƒv‚ªŽw’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+ ENPC‚ÅAmapflag‚Æ‚¢‚¤ƒ^ƒCƒv‚ÅA–¼‘O‚ð nomemo A noteleport‚Å
+ ƒƒ‚‚ƃeƒŒƒ|‹ÖŽ~Bnosave ‚ÅAˆø”‚ɃZ[ƒu‚·‚éƒ}ƒbƒv–¼‚ÆÀ•W‚ðŽw’èB
+
+ Ú‚µ‚­‚Í“¯«‚Ìconf/npc_test_ev.txt‚ðŽQÆB
+
+ (conf/)
+ npc_test_ev.txt
+ C³
+ (map/)
+ map.h
+ struct map_data ‚Éflag,savemap,savex,saveyƒƒ“ƒo’ljÁ
+ npc.c
+ npc_parse_mapflag()’ljÁ
+ do_init_npc()‚ÌC³
+ pc.c
+ pc_memo()‚Ńƒ‚‹ÖŽ~‚©‚Ç‚¤‚©‚ðŠm”F
+ pc_makesavestatus()‚ŃZ[ƒu‹ÖŽ~‚È‚çƒ}ƒbƒv‚ð•ÏX
+ pc_randomwarp()‚ŃeƒŒƒ|‹ÖŽ~‚©‚Ç‚¤‚©Šm”F
+ skill.c
+ ƒeƒŒƒ|‚ƃ|ƒ^‚ŃeƒŒƒ|‹ÖŽ~‚©Šm”F
+
+
+Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚Å—Ž‚¿‚é–â‘èC³c‚¾‚Æ‚¢‚¢‚È
+
+ skill.c
+ ‚³‚ç‚Ƀ`ƒFƒbƒN‚ð’ljÁ
+ skill_blown()‚É—Ž‚¿‚錴ˆö‚Á‚Û‚¢‚à‚Ì”­Œ©‚µ‚½‚Ì‚ÅC³
+
+----------
+//0288 by ŒÓ’±—–
+
+EŽ©“®‘é”­“®Žž‚ÉuƒuƒŠƒbƒcƒr[ƒg!!v‚Æ‹©‚΂Ȃ­‚È‚è‚Ü‚µ‚½
+ skill.c
+ skill_attack(),skill_additional_effect(),
+ skill_castend_damage_id()‚ÌC³
+
+EƒCƒxƒ“ƒg‹ì“®Œ^ƒXƒNƒŠƒvƒg‚ª‹Lq‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+Eƒ‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«‚ɃCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚ð“®‚©‚¹‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ NPC’è‹`‚Ìscript‚Å•\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒgˆµ‚¢‚É‚È‚è‚Ü‚·B
+ NPC’è‹`‚Ìmonster‚ɃCƒxƒ“ƒg–¼‚ðÝ’è‚Å‚«‚Ü‚·B
+ ƒXƒNƒŠƒvƒg‚ÌmonsterƒRƒ}ƒ“ƒh‚ɃCƒxƒ“ƒg‚ð‹N‚±‚·ˆø”’ljÁB
+ Ú‚µ‚­‚̓Tƒ“ƒvƒ‹‚ðŒ©‚Ä‚­‚¾‚³‚¢B
+ ¡Œãƒ^ƒCƒ}[‚ŃCƒxƒ“ƒg‚ð‹N‚±‚¹‚é‚悤‚É‚µ‚悤‚ÆŽv‚Á‚Ä‚¢‚Ü‚·B
+
+ Œ»ó‚Å‚ÍANPCƒEƒBƒ“ƒhƒE‘€ì’†‚ɃCƒxƒ“ƒg‚ª‚¨‚«‚ÄA
+ ‚»‚̃Cƒxƒ“ƒg‚̃XƒNƒŠƒvƒg‚ÅNPCƒEƒBƒ“ƒhƒE‚ðo‚·‚Æ–â‘肪‹N‚«‚Ü‚·B
+ ‚±‚Ì•Ó‚Í¡Œã‚̉ۑè‚Æ‚¢‚¤‚±‚Æ‚ÅB
+
+ (db/)
+ item_db.txt/item_db2.txt
+ monsterƒRƒ}ƒ“ƒh‚Ì•ÏX‚É‚æ‚éC³iŒÃ–Ø‚ÌŽ}jB
+ (conf/)
+ npc_test_ev.txt
+ ƒTƒ“ƒvƒ‹
+ (map/)
+ npc.c
+ npc_event()’ljÁ
+ npc_parse_script()C³
+ npc_checknear()C³
+ clif.c
+ clif_getareachar_npc()C³
+ map.h
+ struct mob_data‚Énpc_eventƒƒ“ƒo’ljÁ
+ mob.c/mob.h
+ mob_once_spawn()‚̈ø”•ÏX
+ mob_damage()‚ÅŽ€–SŽž‚ɃCƒxƒ“ƒg‚ð‹N‚±‚·‚悤‚É
+ atcommand.h
+ mob_once_spawn()‚̈ø”•ÏX
+ script.c
+ buildin_monster()‚ÌC³
+
+----------
+//0287 by ŒÓ’±—–
+
+Eƒ‚ƒ“ƒXƒ^[î•ñƒXƒLƒ‹‚Å‚g‚o‚ª65535‚ð‰z‚¦‚Ä‚¢‚é‚Ƴí‚È’l‚ªŒ©‚ê‚È‚¢ƒoƒOC³
+
+ clif.c
+ clif_skill_estimation()‚ÌC³
+
+EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚ŃNƒ‰ƒCƒAƒ“ƒg‚ªƒŠƒ\[ƒXƒGƒ‰[‚ðo‚·–â‘肪C³‚³‚ê‚Ü‚µ‚½
+EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚Å¢Š«‚Å‚«‚é“G‚ªŽw’è‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ (db/)
+ mob_branch.txt
+ ¢Š«‰Â”\‚È“G‚̃ŠƒXƒg
+ (map/)
+ mob.c/mob.h
+ struct mob_data‚Ésummonflagƒƒ“ƒo’ljÁB¢Š«‰Â”\«B
+ mob_once_spawn()‚ÌC³
+ mob_readbranch()‚̒ljÁ
+ do_init_mob()‚Åmob_readbranch()‚ðŒÄ‚Ԃ悤‚ÉB
+
+EŒÃ‚­Â‚¢” AŒÃ‚¢Ž‡F‚Ì” ‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½B
+ ˆê•”‚Ì–¢ŽÀ‘•ƒAƒCƒeƒ€‚ào‚Ü‚·Bitem_db.txt‚É‚ ‚éƒf[ƒ^‚ðŒŸõ‚µ‚Ä‚¢‚Ü‚·B
+ ƒXƒNƒŠƒvƒggetitem‚Å•‰‚Ì’l‚ðŽw’è‚·‚é‚ÆA‚»‚Ìâ‘Î’l‚ðƒtƒ‰ƒO‚Æ‚µ‚Ä
+ ƒ‰ƒ“ƒ_ƒ€‚ɃAƒCƒeƒ€‚ð‘I‘ð‚µ‚Ü‚·B
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ŠY“–•”•ª‚̃XƒNƒŠƒvƒgC³
+ (map/)
+ script.c
+ buildin_getitem()‚ÌC³
+ itemdb.c/itemdb.h
+ itemdb_searchrandomid(),itemdb_searchrandomid_sub()’ljÁ
+
+E‰r¥ƒf[ƒ^‚̈ꕔC³
+ (db/)
+ cast_db.txt
+ ‘¬“x㸂ȂǂÌC³
+
+ENPC‚ÌŒü‚«C³‚È‚Ç
+ (conf/)
+ npc_*.txt
+
+----------
+//0286 by ŒÓ’±—–
+
+Eƒ‚ƒ“ƒXƒ^[î•ñƒXƒLƒ‹‚ŃNƒ‰ƒCƒAƒ“ƒg‚ª—Ž‚¿‚éƒoƒOC³
+ clif.c
+ clif_skill_estimation()‚ÌC³
+
+E‰r¥”½‰žƒ‚ƒ“ƒXƒ^[‚ª”½‰ž‚µ‚È‚¢‚±‚Æ‚ª‚ ‚é–â‘è‚ðC³
+ skill.c
+ skill_use_id(),‰r¥”½‰žŽžAÅ’á’ÇÕ‹——£‚ð13‚ÉÝ’è‚·‚é‚悤‚ÉB
+
+EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[warp]‚ŃZ[ƒuƒ|ƒCƒ“ƒgˆÚ“®‚⃉ƒ“ƒ_ƒ€ˆÚ“®‚ª‰Â”\‚É‚È‚è‚Ü‚µ‚½
+EƒnƒG‚̉HA’±‚̉HƒAƒCƒeƒ€‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ ƒXƒNƒŠƒvƒgwarp‚Ń}ƒbƒv–¼‚É"SavePoint"‚â"Random"‚ªŽw’è‚Å‚«‚Ü‚·B
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ƒnƒG‚̉HA’±‚̉H‚̃XƒNƒŠƒvƒgC³
+ script.c
+ buildin_warp()‚ÌC³
+
+E@monsterƒRƒ}ƒ“ƒh‚É‚æ‚éMOB‚ª•œŠˆ‚µ‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
+EƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh[monster]‚ÅMOB‚ð”­¶‚³‚¹‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+EŒÃ–Ø‚ÌŽ}ƒAƒCƒeƒ€‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+
+ ƒXƒNƒŠƒvƒgˆø”‚Í monster ƒ}ƒbƒv–¼,x,y,MOB–¼,MOB‚ÌID,” ‚Å‚·B
+ ƒ}ƒbƒv–¼‚ª"this"‚Ìê‡AƒXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚Ì‚¢‚éƒ}ƒbƒvA
+ x,y‚ª-1‚È‚çƒvƒŒƒCƒ„[‚ÌÀ•Wi‚Ç‚¿‚ç‚©ˆê•û‚Ì‚Ý‚»‚낦‚邱‚Æ‚à‰Â”\jA
+ MOB–¼‚ª"--en--"‚Ìê‡A–{—ˆ‚̉pŒê–¼‚É‚È‚èA"--ja--"‚Ìê‡A
+ –{—ˆ‚Ì“ú–{Œê–¼‚É‚È‚è‚Ü‚·BMOB‚ÌID‚ª-1‚Ìê‡A“K“–‚ÈID‚É‚È‚è‚Ü‚·B
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ŒÃ–Ø‚ÌŽ}‚̃XƒNƒŠƒvƒgC³
+ (map/)
+ mob.c/mob.h
+ mob_once_spawn()’ljÁ
+ mob_setdelayspwan()‚Å•œŠˆ‹ÖŽ~ˆ—’ljÁB
+ npc.c/npc.h
+ npc_get_new_npc_id()’ljÁ
+ script.c
+ buildin_monster()’ljÁ
+ atcommand.c
+ @monster‚ÌC³
+
+E@itemƒRƒ}ƒ“ƒh‚ÌC³i‘•”õ•i‚È‚Ç‚Ì–â‘èj
+
+ atcommand.c
+ @item‚ÌC³
+
+----------
+//0284 by ŒÓ’±—–
+
+EáŠQ•¨‚ª‚ ‚é‚Ɖ“‹——£UŒ‚‚ª‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
+E‘Î’nƒXƒLƒ‹‚ªáŠQ•¨ã‚ÉŽg—p‚Å‚«‚È‚­‚È‚è‚Ü‚µ‚½
+
+ path.c
+ path_search(),can_move()‚ÌC³Acan_place()‚̒ljÁ
+ battle.c/battle.h
+ battle_check_range()’ljÁAŽË’ö‚ÆáŠQ•¨”»’èB
+ battle_weapon_attack()‚Åbattle_check_range()‚ðŒÄ‚ÔB
+ skill.c
+ skill_use_id()Askill_use_pos()‚Åbattle_check_range()‚ðŒÄ‚ÔB
+ mob.c
+ mob_ai_sub_hard()‚̈—‚ðC³
+
+E‰r¥”½‰ž/ƒŠƒ“ƒNƒ‚ƒ“ƒXƒ^[‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ skill.c
+ skill_use_id()‚ɉr¥”½‰žƒ‚ƒ“ƒX‚̈—’ljÁ
+ mob.c
+ mob_ai_sub_hard_linksearch()‚̒ljÁ
+ mob_ai_sub_hard()‚ɃŠƒ“ƒNˆ—‚ðC³
+
+----------
+//0283 by ‚ê‚ 
+EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ÌC³
+ 0282‚Ŷ‚«‚Ä‚é‚o‚b‚ɃŠƒU‚ª‚©‚¯‚ê‚é‚Ì‚ÉA
+ Ž€‚ñ‚Å‚é‚o‚b‚ɂ̓ŠƒU‚ª‚©‚©‚ç‚È‚­‚È‚Á‚Ä
+ ‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B
+
+----------
+//0282 by ŒÓ’±—–
+
+EƒXƒLƒ‹‚ÌC³‚ƒljÁŽÀ‘•
+ EƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚̃GƒtƒFƒNƒg‚Ì–â‘èC³B
+ EƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ª¶‚«‚Ä‚¢‚éPC‚É‚ÍŠ|‚¯‚ç‚ê‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
+ Eƒ^[ƒ“ƒAƒ“ƒfƒbƒh/UŒ‚ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ªBOSS‚É‚ÍŒø‚©‚È‚¢‚悤‚É‚È‚è‚Ü‚µ‚½
+ Eƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹‚̃qƒbƒg”§ŒÀ‚ðŽÀ‘•
+ EƒXƒg[ƒ€ƒKƒXƒg‚ÌŽÀ‘•
+ ‚½‚¾‚µA–{ŽI‚ƈႢ“€Œ‹‚ÍŠm—¦‚Ì‚Ý‚ÅAÅ‘åƒqƒbƒg”‚È‚Ç‚ª•Ï‚Å‚·B
+
+ skill.c
+ skill_castend_nodamage_id()‚ÌC³
+ ƒXƒg[ƒ€ƒKƒXƒg‚̈—’ljÁ
+
+EƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚ɈӒn‚É‚È‚Á‚ĈÀ‘S«ƒ`ƒFƒbƒN‚ð’ljÁB
+ i—Ž‚¿‚È‚­‚È‚é“ú‚͉“‚¢HHj
+
+ map.h
+ MAX_SKILLUNITGROUP‚ð32‚É‘‚₵‚½
+ skill.c
+ skill_status_change_*()‚ÉNULLƒ`ƒFƒbƒN’ljÁ
+ battle.c
+ battle_calc_damage()‚ɶ‘¶ƒ`ƒFƒbƒN’ljÁ
+ map.c
+ map_freeblock_unlock()‚ɃƒbƒN”ƒ`ƒFƒbƒN‚ð’ljÁ
+
+E‚»‚Ì‘¼C³
+ EPC‚ÌÅ‘åHP‚ª30000‚ɧŒÀ‚³‚ê‚Ü‚µ‚½B
+ EPC‚̉ñ•œˆ—‚ªC³‚³‚ê‚Ü‚µ‚½
+ E‚«”ò‚΂µˆ—‚ÌC³
+ E0281‚Ìitem_db.txt‚Ì•ÏX‚ðitem_db2.txt‚É‚à“K—p
+
+ (map/)
+ pc.c
+ pc_heal(),pc_calcstatus()‚ÌC³
+ path.c
+ path_blownpos()‚ÌC³
+ (db/)
+ item_db2.txt
+ 0281‚Ì–¼‘OC³‚È‚Ç‚ð“K—p
+
+----------
+//0280 by ŒÓ’±—–
+
+EŠÇ—ŽÒ‚̃VƒXƒeƒ€‚ðì¬
+ "conf/login_athena.cnf"‚Ìì¬AŠÇ—ŽÒƒpƒXAGMƒpƒX‚ÌÝ’èB
+ ƒAƒJƒEƒ“ƒg‚ðì‚é‚Æ‚«A
+ ƒ—á„ ID: hoge_M Pass: foobar@admin
+ ‚̂悤‚ÉAƒpƒXƒ[ƒh‚ÌŒã‚ë‚Éu@ŠÇ—ŽÒƒpƒXv‚ª•K—v‚ÉB
+ login_athena.cnf‚Ìadmin_pass‚Ì—“‚ðÁ‚¹‚ÎA¡‚܂ł̂悤‚É‚à‚‚©‚¦‚Ü‚·B
+ i‚»‚Ìê‡Aadmin_pass‚ÌŒã‚낾‚¯‚Å‚È‚­As‚²‚ÆÁ‚µ‚Ä‚­‚¾‚³‚¢j
+
+ (login/)
+ login.h
+ Ý’èƒtƒ@ƒCƒ‹‚̃fƒtƒHƒ‹ƒg–¼’ljÁ
+ login2.c
+ ƒAƒJƒEƒ“ƒg쬂̂Ƃ±‚ë‚ðC³
+ Ý’èƒtƒ@ƒCƒ‹‚Ì“Ç‚Ýž‚ݒljÁ
+
+E@GMƒRƒ}ƒ“ƒh•œŠˆ
+ ‚½‚¾‚µAu@gm GMƒpƒXv‚Æ‚µ‚ÄŽg‚¢‚Ü‚·B
+ GMƒpƒX‚Ílogin_athena.cnf‚Ì‚à‚Ì‚Å‚·B
+ ŽI‚ÌÄ‹N“®‚Ì•K—v‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA
+ ƒNƒ‰ƒCƒAƒ“ƒg‚̓ŠƒƒO‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
+
+ ƒ’ˆÓ„
+ “¯‚¶ƒAƒJƒEƒ“ƒg‚Ì‘S‚ẴLƒƒƒ‰‚ÍPT‚©‚甲‚¯‚Ä’u‚¢‚Ä‚­‚¾‚³‚¢B
+ ‚Ü‚½A‘qŒÉ‚̃AƒCƒeƒ€‚Í‘S•”ˆø‚«o‚µ‚Ä’u‚¢‚Ä‚­‚¾‚³‚¢B
+ ‚»‚¤‚µ‚È‚¢‚ƃSƒ~ƒf[ƒ^‚ªŽc‚è‚Ü‚·B
+
+ (login/)
+ login2.c
+ ƒAƒJƒEƒ“ƒgID•ÏXˆ—’ljÁ
+ (char/)
+ char2.c
+ ƒAƒJƒEƒ“ƒgID•ÏXˆ—’ljÁ
+ (map/)
+ chrif.c/chrif.h
+ chrif_changegm(),chrif_changedgm()’ljÁ
+
+E@pvpoffƒRƒ}ƒ“ƒh•œŠˆ
+ clif.c/clif.h
+ clif_pvpoff()’ljÁ
+ atcommand.c
+ @pvpoff‚̈—’ljÁ
+
+E‹ó‚Ì‘qŒÉƒf[ƒ^‚Í•Û‘¶‚³‚ê‚È‚¢‚悤‚É•ÏX
+ (char/)
+ int_storage.c
+ inter_storage_save()Astorage_tostr()‚ðC³
+
+E@memoƒRƒ}ƒ“ƒh’ljÁB
+ ”CˆÓ‚Ì‹L‰¯ˆæ‚Ƀƒ‚‚ðŽæ‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½B
+
+ atcommand.c
+ @memo‚̈—’ljÁ
+
+
+----------
+//0279 by ŒÓ’±—–
+
+EƒXƒLƒ‹ƒ†ƒjƒbƒgˆ—‚Ì–â‘è‘Îô
+ ‚Æ‚è‚ ‚¦‚¸‚Ђ½‚·‚çƒ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚µ‚½B
+
+ skill.c
+ skill_unit_timer_sub(),skill_unit_move_sub(),
+ skill_delunit()‚Ƀ†ƒjƒbƒg‚̶‘¶”»’è‚ð’ljÁB
+ skill_unitgrouptickset_search(),skill_unitgrouptickset_delete()
+ skill_delunitgroup()‚ÉNULLƒ|ƒCƒ“ƒ^ƒ`ƒFƒbƒN‚ð’ljÁB
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
+ ƒeƒŒƒ|[ƒgAƒ[ƒvƒ|[ƒ^ƒ‹‚ÌŽÀ‘•
+ ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚ðMOB‚ÉŠ|‚¯‚é‚Æ—Ž‚¿‚éƒoƒOC³
+
+ (db/)
+ cast_db.txt
+ ƒ[ƒvƒ|[ƒ^ƒ‹‚̉r¥ŽžŠÔÝ’è
+ (map/)
+ map.h
+ struct skill_unit_group‚Ìvalstr‚ðƒ|ƒCƒ“ƒ^‚É•ÏX
+ clif.c/clif.h
+ clif_parse_UseSkillMap(),clif_skill_warppoint()A
+ clif_parse_Memo(),clif_skill_memo()’ljÁ
+ skill.c/skill.h
+ skill_castend_map(),skill_unit_onlimit()‚̒ljÁ
+ skill_unit_*Œn‚̈—‚¢‚ë‚¢‚ë’ljÁB
+ skill_status_change_start()‚̃LƒŠƒG‚̈—C³
+ pc.c/pc.h
+ pc_randomwarp(),pc_memo()’ljÁ
+
+----------
+//0278 by nabe
+
+EƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðU‚Á‚½‚Æ‚«‚ɃXƒe[ƒ^ƒX‚ðXV
+ pc.c
+ pc_skillup()‚Åpc_calc_skilltree()‚Ì‘ã‚í‚è‚Épc_calcstatus()
+EŠŽ—Ê‘‰Á‚ðC³
+ pc.c
+ pc_calcstatus()‚ÌŠŽ—Ê‘‰Á‚É‚æ‚émax_weight‘•ª‚ðskill*1000‚É
+
+----------
+//0277 by nabe
+
+E•t‘®•iiƒJ[ƒgA‘éAƒyƒRj‚Ì•t‚¯ŠO‚µ‚ð‰ü—Ç
+ (conf/)
+ npc_event_rental.txt
+ ‘éAƒyƒR‚ð•t‚¯‚éƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ð•ÏX
+ (map/)
+ battle.c
+ battle_addmastery(),battle_calc_weapon_attack()‚Å
+ ƒyƒRƒyƒR‹R掞‚Ì‘„UŒ‚—͕ⳂðŽÀ‘•
+ clif.c
+ clif_parse_CartOff‚ðclif_parse_RemoveOption‚É•ÏX
+ pc.c/pc.h
+ pc_calcstatus()‚ŃJ[ƒgAƒyƒRƒyƒRæ‚è‚É‚æ‚鑬“x•Ï‰»‚ðŒvŽZ
+ pc_setoption(),pc_setcart()‰ü—Ç
+ pc_setfalcon(),pc_setriding()’ljÁ
+ pc.h‚Épc_isfalcon(),pc_isriding()ƒ}ƒNƒ’ljÁ
+ script.c
+ buildin_setfalcon() ‘é•t‰Á
+ buildin_setriding() ƒyƒRƒyƒRæ‚è
+
+----------
+//0276 by nabe
+
+E¸˜BNPCŽÀ‘•
+ (conf/)
+ npc_town_refine.txt
+ ¸˜BNPCƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹V‹K’ljÁ
+ (map/)
+ pc.c/pc.h
+ ¸˜B¬Œ÷—¦‚Ì•\percentrefinery[5][10]‚ð’ljÁ
+ script.c‚©‚çŒÄ‚΂ê‚éŠÖ”
+ pc_percentrefinery() ¸˜B¬Œ÷—¦
+ pc_equipitemindex() ‘•”õ•iƒCƒ“ƒfƒbƒNƒX
+ ‚ð’ljÁ
+ script.c
+ buildin_getequipname() ‘•”õ–¼•¶Žš—ñi¸˜Bƒƒjƒ…[—pj
+ buildin_getequipisequiped() ‘•”õƒ`ƒFƒbƒN
+ buildin_getequipisenableref() ‘•”õ•i¸˜B‰Â”\ƒ`ƒFƒbƒN
+ buildin_getequipisidentify() ‘•”õ•iŠÓ’èƒ`ƒFƒbƒN
+ buildin_getequiprefinerycnt() ‘•”õ•i¸˜B“x
+ buildin_getequipweaponlv() ‘•”õ•i•ŠíLV
+ buildin_getequippercentrefinery() ‘•”õ•i¸˜B¬Œ÷—¦
+ buildin_successrefitem() ¸˜B¬Œ÷
+ buildin_failedrefitem() ¸˜BŽ¸”s
+ ‚ð’ljÁ
+
+EƒXƒNƒŠƒvƒg‚ÉWeight,MaxWeightƒpƒ‰ƒ[ƒ^‚ð’ljÁ
+ const.txt
+ Weight,MaxWeight‚ð’ljÁ
+
+EƒXƒNƒŠƒvƒg‚ł̃Lƒƒƒ‰–¼•\Ž¦•ûŽ®‚ð•ÏX
+ (conf/)
+ npc_job_merchant.txt/npc_job_thief.txt/npc_town_kafra.txt
+ mes "$charaname"; ‚ð mes strcharinfo(0); ‚É•ÏX
+ (map/)
+ script.c
+ buildin_strcharinfo()‚ð’ljÁ
+
+----------
+//0275 by ŒÓ’±—–
+
+EMVP‚ÌŽÀ‘•
+ MVP‚Ì”»’è‚É‚Ídmglog‚ðŽg‚Á‚Ä‚Ü‚·B‚·‚È‚í‚¿—^ƒ_ƒ‚¾‚¯‚ªŒvŽZ‘ÎÛ‚Å‚·B
+ ”íƒ_ƒ‚Íl—¶‚³‚ê‚Ä‚Ü‚¹‚ñB
+ ŒoŒ±’l‚Í–³ðŒ‚Å“ü‚èAŠm—¦‚Å‚³‚ç‚ɃAƒCƒeƒ€‚ª“ü‚è‚Ü‚·B
+ ƒAƒCƒeƒ€‚Í•¡”Žè‚É“ü‚邱‚Æ‚à‚ ‚è‚Ü‚·B
+
+ clif.c/clif.h
+ clif_mvp_effect(),clif_mvp_item(),clif_mvp_exp()’ljÁ
+ mob.c
+ mob_damage()‚ÉMVPˆ—’ljÁ
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
+ Eƒ}ƒOƒiƒ€ƒuƒŒƒCƒNAƒAƒ[ƒVƒƒƒ[ŽÀ‘•
+ E‚«”ò‚΂µŒnƒXƒLƒ‹‚ªˆê•”Žg—p‚³‚ê‚È‚¢ƒoƒOC³
+ Eƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO‚̃_ƒ[ƒWŒvŽZŽ®C³
+ E•ŠíUŒ‚Œn‘®«•t‚«ƒXƒLƒ‹‚Å‘®«‚ª”½‰f‚³‚ê‚È‚¢–â‘èC³
+ Eꊎw’èƒXƒLƒ‹‚ªUŒ‚‚µ‚È‚ª‚ç‰r¥‚Å‚«‚½–â‘è‚ðC³
+
+ battle.c
+ battle_calc_weapon_attack()‚ÌŠY“–ŒÂŠC³•’ljÁ
+ skill.c
+ skill_castend_damage_id()‚Ɉ—’ljÁ
+ skill_use_pos()‚ÉUŒ‚’âŽ~ˆ—’ljÁ
+
+EƒJ[ƒhƒXƒLƒ‹‚ªƒJ[ƒh‚ðŠO‚µ‚Ä‚àŽg—p‰Â”\‚È–â‘è‚ðC³
+ pc.c
+ pc_calc_skilltree()‚ðC³
+
+EƒAƒCƒeƒ€ƒhƒƒbƒv—¦AexpŠ“¾”{—¦‚È‚Ç‚Ì’²®‹@”\’ljÁ
+ battle_athena.cnf‚Å’²®‚Å‚«‚逖ڂª‘‚¦‚Ü‚µ‚½B
+ Ú‚µ‚­‚Í‚»‚¿‚ç‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ (conf/)
+ battle_athena.cnf
+ mvp_hp_rate,item_rate,exp_rate,mvp_item_rate,mvp_exp_rate’ljÁ
+ (map/)
+ battle.c/battle.h
+ ‘‚¦‚½€–Ú‚ð“Ç‚Ýž‚ނ悤‚Ɉ—’ljÁ
+ mob.c
+ mob_db.txt“Ç‚Ýž‚ÝŽžAƒf[ƒ^‚ð’²®‚·‚鈗’ljÁ
+
+----------
+//0274 by ŒÓ’±—–
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•
+ ƒXƒLƒbƒhƒgƒ‰ƒbƒvAƒ‰ƒ“ƒhƒ}ƒCƒ“Aƒuƒ‰ƒXƒgƒ}ƒCƒ“AƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA
+ ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒvAƒTƒ“ƒhƒ}ƒ“AƒAƒ“ƒNƒ‹ƒXƒlƒA
+
+ ‡–°‚â“€Œ‹‚È‚Ç‚ÌŠm—¦‚Í“K“–‚Å‚·B
+ ã©”­“®Žž‚̃GƒtƒFƒNƒg‚ªo‚Ü‚¹‚ñB‚Ä‚¢‚¤‚©o‚µ•û‚ª‚í‚©‚è‚Ü‚¹‚ñB
+ ‚í‚©‚él‚Í‹³‚¦‚Ä‚­‚¾‚³‚¢B‚à‚µ‚­‚Í–{ŽI‚Åã©”­“®Žž‚Ì•¡‡‰»Ï‚Ý‚Ì
+ ¶ƒpƒPƒbƒgƒf[ƒ^‚Å‚à‚¢‚¢‚Ì‚Å‹³‚¦‚Ä‚­‚¾‚³‚¢B
+
+ (db/)
+ skill_db.txt
+ ‘®«‚ÌC³
+ (map/)
+ skill.c
+ ŠY“–ŒÂŠ
+ battle.c/battle.h
+ battle_calc_misc_damage()‚ÌŠY“–ŒÂŠ
+ battle_stopwalking()’ljÁ
+ clif.c/clif.h
+ clif_fixpcpos()’ljÁ
+ clif_parse_WalkToXY()‚ɃAƒ“ƒNƒ‹‚Å“®‚¯‚È‚­‚·‚鈗’ljÁ
+ mob.c
+ mob_ai_sub_hard()‚ɃAƒ“ƒNƒ‹‚Å“®‚¯‚È‚­‚·‚鈗’ljÁ
+
+E‘•”õ‚Ȃǂ̃NƒŠƒeƒBƒJƒ‹ƒ{[ƒiƒX‚ª1/10‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
+ battle.c
+ battle_calc_weapon_attack()‚ɒljÁ•ª‚ðŒvŽZ‚·‚鈗C³
+
+EƒuƒŠƒbƒcƒr[ƒg‚ÌŒvŽZŽ®‚ª‘S‘Rˆá‚¤ƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
+ battle.c
+ battle_calc_attack()‚ÌBF_MISC‚̈’u‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³
+
+ESW‚ƃjƒ…[ƒ}‚ª•ŠíUŒ‚‚È‚ç‚Ç‚ñ‚ȃŒƒ“ƒW‚ÌUŒ‚‚Å‚à–h‚¢‚Å‚¢‚½–â‘è‚ðC³
+ battle.c
+ battle_calc_damage()‚̃Œƒ“ƒW”»’è‚ðC³
+
+EƒI[ƒo[ƒgƒ‰ƒXƒg‚ƃEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“‚ªPTƒƒ“ƒo‚É‚à‚©‚©‚é‚悤‚ÉC³B
+ Œø‰Ê‚ÍŽg—pŽÒ‚ÆPTƒƒ“ƒo‚ňႢ‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ skill.c
+ skill_castend_nodamage_id()‚ÌC³B
+
+----------
+//0273 by ŒÓ’±—–
+
+EƒLƒƒƒ‰ƒNƒ^[‚ªÁŽ¸‚µ‚½‚茶‰e‚ªo‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½
+ E‚«”ò‚΂µƒXƒLƒ‹‚ðŽó‚¯‚é‚Æ”­¶‚µ‚Ä‚¢‚½
+ EŽÎ‚߈ȊO‚Ì•às‚Å”­¶‚µ‚Ä‚¢‚½
+
+ map.c
+ map_foreachinmovearea()‚ÌC³B
+ skill.c
+ skill_blown()‚É•\Ž¦”͈ÍXVˆ—‚ð’ljÁB
+ mob.c
+ mob_walk()‚Å•à‚«I‚í‚Á‚½‚Æ‚«‚Ɉʒu‚ðÄ‘—M‚·‚é‚悤‚ÉC³
+ pc.c
+ pc_walk()‚Å•à‚«I‚í‚Á‚½‚Æ‚«‚Ɉʒu‚ðÄ‘—M‚·‚é‚悤‚ÉC³
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
+ ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹Aƒtƒ@ƒCƒ„[ƒsƒ‰[‚ÌŽÀ‘•
+ ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ł̃mƒbƒNƒoƒbƒN•ûŒü‚ðC³
+
+ (db/)
+ skill_db.txt
+ ƒtƒ@ƒCƒ„[ƒsƒ‰[AƒuƒŠƒbƒcƒr[ƒg‚̃qƒbƒg”C³
+ (map/)
+ skill.c
+ skill_blown()‚É‘ÎÛ‚ÌŒü‚«‚É‚æ‚éƒmƒbƒNƒoƒbƒNˆ—’ljÁ
+ ‚»‚Ì‘¼•K—v‚ÈêŠC³
+ mob.c
+ mob_walk(),mob_attack()‚ÅŒü‚«‚ð•Û‘¶
+ pc.c
+ pc_walk(),pc_attck()‚ÅŒü‚«‚ð•Û‘¶
+ map.c
+ map_calc_dir()’ljÁB‘Š‘ΓI‚È•ûŒü‚ð‹‚ß‚é
+
+
+EƒNƒŠƒeƒBƒJƒ‹‘‰Á‘•”õ‚ªí“¬Žž‚ÉŒvŽZ‚³‚ê‚Ä‚È‚¢ƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
+ battle.c
+ battle_calc_weapon_attack()‚ɒljÁ•ª‚ðŒvŽZ‚·‚鈗’ljÁ
+
+
+E–hŒäƒ†ƒjƒbƒgiSW/ƒjƒ…[ƒ}j‚ª“G‚ɉe‹¿‚ð‹y‚Ú‚·‚©‚Ç‚¤‚©‚ð
+ battle_athena.cnf‚ŧŒä‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ ƒfƒtƒHƒ‹ƒg‚Íu‹y‚Ú‚³‚È‚¢v‚Å‚·B
+
+ (conf/)
+ battle_athena.cnf
+ €–Údefunit_not_enemy‚ð’ljÁ
+ (map/)
+ battle.c/battle.h
+ struct Battle_Config ‚É defnotenemyƒƒ“ƒo’ljÁB
+ battle_read_config()‚̈—‚ðC³B
+ skill.c
+ skill_unitsetting()‚ÅSW/ƒjƒ…[ƒ}‚̈—‚ðC³
+
+EƒtƒFƒ“ƒJ[ƒh‘•”õŽžAŽ€‚ñ‚Å‚à‰r¥‚ª‘±‚­ƒoƒO‚ðC³
+ i‰r¥I—¹‘O‚É•œŠˆ‚·‚ê‚Ζ‚–@‚ª”­“®‚·‚é–â‘è‚àC³‚É‚È‚è‚Ü‚·j
+
+ pc.c
+ pc_damage()‚ÅŽ€–SŽžskill_castcancel()‚ðŒÄ‚Ԃ悤‚ÉC³
+
+E“G–¡•û”»’舗‚ɃoƒO‚ª‚ ‚Á‚½‚Ì‚ðC³
+ battle.c
+ battle_check_target()‚ÌC³
+
+----------
+//0272 by ŒÓ’±—–
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
+ EƒZƒCƒtƒeƒBƒEƒH[ƒ‹Aƒjƒ…[ƒ}‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½B
+ Eƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“”­“®’†‚ÉŒø‰Ê”͈͊O‚©‚ç”͈͓à‚É“ü‚Á‚Ä‚«‚½‚Æ‚«A
+ “G–¡•û‚Ì‹æ•Ê–³‚­UŒ‚‚ª“–‚½‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½B
+ EƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ÌŽË’ö‚ªC³‚³‚ê‚Ü‚µ‚½B
+ E”͈͖‚–@‚Å“|‚µ‚½“G‚ªHP0‚ÅŽc‚éꇂª‚ ‚é–â‘肪C³‚³‚ê‚Ü‚µ‚½B
+
+ (db/)
+ skill_db.txt
+ ƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃTƒ“ƒNƒ`ƒ…ƒAƒŠ‚ÌŽË’ö‚ð8‚É•ÏX
+ (map/)
+ skill.c
+ skill_unit_onplace(),~ondelete(),~onout()‚È‚Ç‚ÉA
+ ƒZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚̈—’ljÁB
+ skill_unit_move()‚Ƀ^[ƒQƒbƒg‚Ì“G–¡•û”»’è‚ð’ljÁB
+ skill_unit_timer_onplace(),~ondelete()‚Ƀ†ƒjƒbƒg¶‘¶”»’è‚ð’ljÁ.
+ skill_clear_unitgroup()’ljÁBƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ì‘Síœ‚ð‚·‚éB
+ battle.c
+ battle_calc_damage()‚ɃZƒCƒtƒeƒBƒEƒH[ƒ‹‚ƃjƒ…[ƒ}‚̈—’ljÁB
+ map_foreachinarea()‚È‚ÇC³
+ map.c
+ map_quit()‚Åskill_clear_unitgroup()‚ðŒÄ‚Ԃ悤‚ÉB
+
+EƒXƒLƒ‹‚Ì‚«”ò‚΂µˆ—‚ðŽÀ‘•
+ ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[AƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒXƒsƒAƒXƒ^ƒuA
+ ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…Aƒ`ƒƒ[ƒWƒAƒ[‚Ì‚«”ò‚΂µˆ—ŽÀ‘•
+
+ path.c/map.h
+ path_blownpos()’ljÁ
+ battle.c/battle.h
+ struct Damage‚Éblewcountƒƒ“ƒo’ljÁ
+ battle_calc_*_damage()‚Åblewcount‚ðƒZƒbƒg‚·‚é‚悤‚ÉB
+ skill.c/skill.h
+ skill_blown()’ljÁB‚«”ò‚΂µˆ—B
+ skill_attack()‚Åskill_blown()‚ðŒÄ‚Ԃ悤‚ÉB
+ skill_attack()‚Ìflag‚Ì‚«”ò‚΂µƒrƒbƒg‚Í–¢Žg—p‚ÉB
+
+E•às’†‚̃‚ƒ“ƒXƒ^[‚ÉUŒ‚‚µ‚½‚Æ‚«Aƒ‚ƒ“ƒXƒ^[‚ɃfƒBƒŒƒC‚ª“ü‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ iUŒ‚‚̃‚[ƒVƒ‡ƒ“‚Ì’x‰„‚ðl‚¦‚Ä‚È‚¢‚Ì‚Å‚ ‚ñ‚Ü‚èˆÓ–¡‚ª‚È‚¢‚©‚àHj
+
+ (map/)
+ mob.c/mob.h
+ state‚ÉMS_DELAY‚ð’ljÁB
+ mob_damage(),mob_timer()‚È‚Ç‚ÌC³
+
+E•às’†‚̃‚ƒ“ƒXƒ^[‚ÉUŒ‚‚µ‚½‚Æ‚«AˆÊ’u‚ª‚¸‚ê‚é–â‘è‚̉ž‹}ˆ’u
+ i‚Ü‚¾ˆÊ’u‚Í‚¸‚ê‚é‚悤‚Å‚·j
+
+ clif.c/clif.h
+ clif_fixmobpos()‚ð’ljÁ
+ mob.c
+ mob_attack()‚Åclif_fixmobpos()‚ðŒÄ‚Ԃ悤‚ÉB
+
+E‚»‚Ì‘¼C³
+ pc.c
+ pc_stop_walking()‚Åpath_len‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+
+----------
+//0271 by ‚ê‚ 
+
+EPT‚ÉŠÖ‚µ‚Ä­‚µ‚¾‚¯C³
+ Œö•½‚É‚µ‚Ä‚©‚çƒLƒƒƒ‰‚ð‰Á“ü‚³‚¹‚é‚ÆŒö•½‚ª‰ðœ‚³‚ê‚È‚¢ƒoƒO‚ðC³
+
+----------
+//0270 by ŒÓ’±—–
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•‚ÆC³
+ ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“AƒTƒ“ƒNƒ`ƒ…ƒAƒŠAƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€
+
+ (db/)
+ skill_db.txt
+ ƒ}ƒOƒkƒX‚̃qƒbƒg”A‘®«’²®
+ ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ‚Ì‘®«’²®
+ (map/)
+ map.h
+ struct map_session_data‚ÌC³
+ clif.c/clif.h
+ clif_skill_setunit(),clif_skill_delunit()A
+ clif_getareachar_skillunit(),clif_clearchar_skillunit()’ljÁ
+ clif_pcoutsight(),clif_pcinsight(),clif_getareachar()C³
+ skill.c/skill.h
+ –Y‚ê‚é‚Ù‚Ç‘½”•ÏXBŽå‚ɃXƒLƒ‹ƒ†ƒjƒbƒgŠÖ˜A•”•ªB
+ pc.c
+ pc_authok()‚Åskillunit,skillunittick‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+ pc_walk()‚Åskill_unit_move()‚ðŒÄ‚Ԃ悤‚ÉB
+ mob.c
+ mob_spwan()‚Åskillunittick‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+ mob_walk()‚Åskill_unit_move()‚ðŒÄ‚Ԃ悤‚ÉB
+ battle.c/battle.h
+ battle_calc_magic_attack()C³
+ battle_check_target()C³
+ map.c
+ map_foreachobject()‚È‚ÇC³
+
+E‚±‚Ü‚©‚¢ƒoƒOC³‚È‚Ç
+ Emob‚ª‰ñ•œ‚µ‚È‚¢–â‘èC³
+
+ battle.c
+ battle_damage()C³
+
+----------
+//0266 by ŒÓ’±—–
+
+E–‚–@ŒvŽZŽ®‚ÌC³
+ –‚–@”{—¦‚ðƒ_ƒ[ƒW‚ÉŠ|‚¯‚Ä‚¢‚½‚Ì‚ðMATK‚É‚©‚¯‚é‚悤‚É‚µ‚Ü‚µ‚½B
+ c‚±‚Á‚¿‚ª³‚µ‚¢‚Æ‚µ‚Ä‚¢‚¢‚Ì‚©‚ÈHˆá‚¤‚Ȃ狳‚¦‚Ä‚­‚¾‚³‚¢B
+
+ battle.c
+ battle_calc_magic_attack()‚ÌC³
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•
+ ƒTƒCƒgAƒ‹ƒAƒtAƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“
+
+ ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“‚Í‚R‰ñ‚Ì”»’莞‚ɉr¥‰¹‚ª–‚è‚Ü‚·cB
+ clif_skill_damage()‚Ìtype‚ðFX•Ï‚¦‚Ä‚Ý‚Ü‚µ‚½‚ª‚Ç‚¤‚à‚¤‚Ü‚­‚¢‚«‚Ü‚¹‚ñB
+ ’¼‚¹‚él‚Í’¼‚µ‚Ä‚­‚ê‚é‚Æ‚¤‚ꂵ‚¢‚Å‚·B
+ i‚¤[‚ñA‚Ђå‚Á‚Æ‚µ‚½‚ç–{—ˆ‚̓Oƒ‰ƒtƒBƒbƒN‚Ì‚È‚¢ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ð
+ Ý’u‚µ‚ÄA‚»‚̃†ƒjƒbƒg‚ÌID‚Ń_ƒ[ƒW‚ð—^‚¦‚é‚Ì‚©‚àHHj
+
+ (db/)
+ skill_db.txt
+ ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“‚̃qƒbƒg”‚ð‚R‚©‚ç10‚É•ÏXB
+ (map/)
+ skill.c
+ skill_status_change_timer_sub()’ljÁB
+ skill_status_change_*()‚Ɉ—’ljÁB
+
+Eblock‚̃ƒ‚ƒŠ‰ð•ú‚̈À‘S«‚ÌŒüã
+ map_foreachinarea,party_foreachsamemap‚ʼnñ‚Á‚Ä‚¢‚é‚Æ‚«‚É
+ block‚ðƒ`ƒFƒCƒ“‚©‚ç휂·‚é‚ÆA‚¤‚Ü‚­‰ñ‚ç‚È‚¢‰Â”\«‚ª‚ ‚é–â‘èC³B
+ ‚³‚ç‚ÉAblock‚ðƒƒ‚ƒŠ‚©‚ç‰ð•ú‚·‚é‚Ɗ댯‚È–â‘è‚àC³B
+
+ Eforeach“à‚ÅŠÖ”‚ðŒÄ‚Ô‘O‚Éblock‚ªƒ`ƒFƒCƒ“‚©‚çŠO‚ê‚Ä‚È‚¢‚©ƒ`ƒFƒbƒNB
+ Eforeach‚É“ü‚Á‚½‚Æ‚«‚ɃƒbƒN‚µ‚ăƒ‚ƒŠ‚©‚ç‰ð•ú‚³‚ê‚È‚¢‚悤‚É‚·‚éB
+ ‚±‚ê‚̓†[ƒU[‚ªfree‚¶‚á‚È‚­map_freeblock‚É‚æ‚Á‚ĉð•ú‚·‚é‚悤‚É
+ ƒvƒƒOƒ‰ƒ€‚·‚é•K—v‚ª‚ ‚éBiƒ‹[ƒv‚©‚çŒÄ‚΂ê‚é‰Â”\«‚Ì‚ ‚éŠÖ”‚ðì‚é
+ ꇂ̂±‚Æ‚ÅA•’Ê‚Ífree‚Å‚à‚¢‚¿‚¨‚¤“®‚­Bj
+ Emap_foreachinmovearea‚ɂ‚¢‚Ă͉ü—Ç‚µ‚Ä‚¢‚È‚¢‚ªA
+ ‚±‚̃‹[ƒv‚Åblock‚ð휂·‚邱‚Æ‚Í‚ ‚肦‚È‚¢‹C‚ª‚·‚é‚Ì‚Å‚¢‚¢‚Æ‚·‚éB
+
+ ‚±‚ê‚Í¡Œã‚ðŒ©‰z‚µ‚½‰ü—Ç‚Å‚ ‚Á‚ÄAŒ»Ý‚Ì•sˆÀ’肳‚𒼂·‚à‚Ì‚Å‚Í‚È‚¢B
+ iŒ»Ý‚Íforeach“à‚Ńƒ‚ƒŠ‚ð‰ð•ú‚µ‚Ä‚¢‚È‚¢c‚Í‚¸‚È‚Ì‚ÅB
+ ‚½‚¾AƒXƒLƒ‹ƒ†ƒjƒbƒg‚ȂLjꎞƒIƒuƒWƒFƒNƒg‚𑽗p‚µŽn‚ß‚é‚ÆŒø‰Ê‚ª‚ ‚éj
+
+ map.c
+ map_freeblock(),map_freeblock_lock(),~_unlock()’ljÁB
+ map_delobject()‚Ìfree()‚ðmap_freeblock()‚É’uŠ·B
+ map_foreachinarea‚ŃƒbƒN‚ƈÀ‘S«ƒ`ƒFƒbƒNB
+ party.c
+ party_foreachsamemap()‚ŃƒbƒN‚ƈÀ‘S«ƒ`ƒFƒbƒN
+
+
+EƒXƒLƒ‹ƒ†ƒjƒbƒg‹@\ŽÀ‘•
+ Ý’uŒn‚̃XƒLƒ‹‚Ì‚½‚ß‚Ì‹@\ŽÀ‘•BŽÀۂ̃XƒLƒ‹‚ÌŽÀ‘•‚Í‚Ü‚¾‚Å‚·B
+
+ skill.c
+ ‚È‚ñ‚©‚à‚¤FX’ljÁ‚µ‚Ü‚µ‚½B
+ map.c
+ do_init()‚Ådo_skill_init()‚ðŒÄ‚Ԃ悤‚ÉB
+ map.h
+ struct skill_unit,skill_unit_group‚ȂǒljÁB
+ map_session_data‚Ì‘‚«Š·‚¦‚È‚ÇB
+
+E‚»‚Ì‘¼×‚©‚¢‚Æ‚±‚ë‚ðC³‚µ‚½‚ÆŽv‚¤‚¯‚Ç–Y‚ê‚Ü‚µ‚½B
+
+----------
+//0264 by nabe
+
+E$charaname‚ð’‚éNPC‚Ƙb‚µ‚½ŽžAmapŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚éƒoƒO‚ðC³‚µ‚Ü‚µ‚½B
+ script.c
+ replacestr()‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðŽè’¼‚µ‚µ‚Ü‚µ‚½B
+
+----------
+//0263 by nabe
+
+E˜I“XŠJÝ’†‚ɃJ[ƒgƒAƒCƒeƒ€‚ðo‚µ“ü‚ê‚Å‚«‚È‚¢‚悤C³
+ pc.c
+ pc_putitemtocart(),pc_getitemfromcart()‚ÉA˜I“X”»’è‚ð’ljÁ
+
+E˜I“XƒAƒCƒeƒ€w“ü‚̃`ƒFƒbƒN‚ð’ljÁ
+ vending.c
+ vending_purchasereq()‚Å”X‚ÌðŒ”»’è‚ð’ljÁ
+
+----------
+//0261 by ŒÓ’±—–
+
+EŠg‘勾AƒCƒOƒhƒ‰ƒVƒ‹‚Ì—t‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ ƒXƒNƒŠƒvƒg‚ÉitemskillƒRƒ}ƒ“ƒhì¬BˆêŽž“I‚ɃXƒLƒ‹‚ªŽg—p‚Å‚«‚Ü‚·B
+
+ (map/)
+ script.c
+ buildin_itemskill()‚̒ljÁ‚È‚ÇB
+ skill.c
+ ƒAƒCƒeƒ€ƒXƒLƒ‹‚È‚çSP‚È‚Ç‚ðŒŸ¸•Á”‚È‚¢‚悤‚ÉC³
+ clif.c/clif.h
+ clif_item_skill()‚̒ljÁB
+ (db/)
+ item_db.txt/item_db2.txt
+ ƒXƒLƒ‹Žg—pƒAƒCƒeƒ€‚̃XƒNƒŠƒvƒgC³
+
+Eƒp[ƒeƒBƒXƒLƒ‹‚ÌŽÀ‘•
+ ƒAƒ“ƒ[ƒ‹ƒXAƒ}ƒOƒjƒtƒBƒJ[ƒgAƒOƒƒŠƒAAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ª
+ ‰æ–Ê“à‚̃p[ƒeƒB‘Sˆõ‚ÉŒø‰Ê‚ð‹y‚Ú‚·‚悤‚É‚È‚è‚Ü‚µ‚½B
+
+ skill.c
+ skill_castend_nodamage_id()‚ÌŠY“–ŒÂŠ‚ÌC³
+ party.c
+ party_foreachsamemap()‚ÌC³
+
+EƒXƒLƒ‹ŠÖŒW‚ÌC³
+ ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“‚ª‘¦Žž”­“®‚É‚È‚Á‚Ä‚¢‚é‚Ì‚ðC³B
+ ƒXƒg[ƒ“ƒJ[ƒX‚ŃGƒtƒFƒNƒg‚ª‘¶Ý‚µ‚È‚¢ƒoƒOC³B
+
+ (db/)
+ skill_db.txt
+ ƒLƒŠƒGƒGƒŒƒCƒ\ƒCƒ“C³
+ (map/)
+ skill.c/skill.h
+ skill_check_condition()’ljÁBƒXƒLƒ‹Žg—pðŒŒŸ¸‚̈ê–{‰»B
+ skill_castend_nodamage_id()‚ŃXƒg[ƒ“ƒJ[ƒXC³
+
+EƒXƒNƒŠƒvƒg‚̃R[ƒh‚ð®—
+ get_val()‚Åconst.txt‚Ì’è”‚ðŠ“¾‚Å‚«‚é‚悤‚ÉC³B
+
+ (map/)
+ script.c
+ get_val()‚ÌC³iconst.txt‚Ìtype==0‚Ì’l‚ªŠ“¾‰Â”\‚Éj
+ bonus(),bonus2()‚È‚Ç‚ÌC³B
+ (db/)
+ const.txt
+ type=1‚Å‚ ‚é•K—v‚ª–³‚¢‚à‚Ì‚ð0‚ÉB
+ item_db.txt/item_db.txt
+ const.txt‚Ì•ÏX‚É”º‚¤C³B
+
+----------
+//0260 by ŒÓ’±—–
+
+E퓬ŠÖŒW‚Ìݒ肪ƒtƒ@ƒCƒ‹‚É‘‚¯‚é‚É‚È‚è‚Ü‚µ‚½
+ mapŽI‚Ì‘æ2ˆø”‚Ƀtƒ@ƒCƒ‹–¼‚ªÝ’肳‚ê‚Ä‚¢‚é‚ÆA‚»‚ê‚ðŽg‚¢A
+ ݒ肳‚ê‚Ä‚È‚¢ê‡‚Í "conf/battle_athena.cnf"‚ðŽg‚¢‚Ü‚·B
+
+ ‚ ‚ÆAˆê‰ž”͈ÍUŒ‚ƒXƒLƒ‹‚ɂ‚¢‚Äà–¾B
+ ŽI‚ªí‚ÉPVP‚Éݒ肳‚ê‚Ä‚¢‚éê‡Aƒp[ƒeƒBƒƒ“ƒo‚¶‚á‚È‚¢PC‚É‚à”͈ÍUŒ‚‚ª
+ ‚ ‚½‚è‚Ü‚·BŒ™‚Èꇂ̓p[ƒeƒB‚ð‘g‚Þ‚©Aí‚ÉPVP‚ðoff‚É‚µ‚ĉº‚³‚¢B
+ í‚ÉPVP‚ªoff‚Å‚àA@pvp‚Åpvpƒtƒ‰ƒO‚ð“ü‚ꂽl‚ÌŠÔ‚Å‚ÍUŒ‚‚ª“–‚½‚è‚Ü‚·B
+ ‚½‚¾‚µAˆê“xpvp‚ðon‚É‚·‚é‚ÆAƒŠƒƒO‚·‚é‚Ü‚Åon‚Ì‚Ü‚Ü‚È‚Ì‚Å’ˆÓB
+
+ (conf/)
+ battle_athena.cnf
+ ’†‚Éà–¾‘‚¢‚Ä‚é‚Ì‚ÅŠeŽ©D‚«‚Ȃ悤‚É‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
+
+ (map/)
+ battle.c/battle.h
+ struct Battle_Config‚Ì’è‹`B
+ battle_config_read()‚ȂǒljÁB
+ skill.c
+ CASTFIX,DELAYFIX‚Ì”pŽ~‚ÆBattle_Config‚É‚æ‚éC³‚̒ljÁB
+ atcommand.c
+ @pvpƒRƒ}ƒ“ƒh‚Åpvpƒtƒ‰ƒO‚ðƒZƒbƒg‚·‚é‚悤‚ÉB
+ iŽIÝ’è‚Ìí‚ÉPVP‚ªoff‚ÌŽžA—¼l‚ªpvp‚ðon‚É‚µ‚Ä‚½‚ç퓬‰Â”\j
+ map.c/map.h
+ struct map_session_data‚Épvp_flag‚ð’ljÁ
+ do_init()‚Åbattle_config_read()‚ð“ǂނ悤‚ÉB
+
+E퓬ŠÖŒW‚̃R[ƒh‚ª­‚µ®—‚³‚ê‚Ü‚µ‚½
+ battle.c/battle.h
+ battle_weapon_attack()’ljÁB
+ battle_calc_weapon_attack()‚̈ø”•ÏX
+ battle_calc_attack()‚ð’ljÁ‚µ‚Äbattle_calc_*_attack()‚ðˆê–{‰»B
+ skill.c/skill.h
+ skill_weapon_attack(),~_magic_~(),~_misc_~()‚Ì”pŽ~A
+ skill_attack()‚Ɉê–{‰»B
+ pc.c/mob.c
+ UŒ‚ˆ—‚ðbattle_weapon_attack()‚Ɉê–{‰»B
+
+EƒAƒCƒeƒ€ŠÓ’èƒXƒLƒ‹‚ðŽÀ‘•
+ ¤l‚̃XƒLƒ‹‚Ì•û‚Å‚·B’ŽŠá‹¾‚Í‚Ü‚¾‚Å‚·B
+
+ skill.c
+ ƒXƒLƒ‹ˆ—’ljÁ
+ pc.c/pc.h
+ pc_item_identify()’ljÁ
+ clif.c/clif.h
+ clif_item_identify_list(),clif_item_identified()’ljÁ
+ clif_parse_ItemIdentify()’ljÁ
+
+EƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚̃Rƒƒ“ƒgC³
+ (db/)
+ skill_db.txt
+ ¤l‚̃XƒLƒ‹‚̃Rƒƒ“ƒg‚ª‚¸‚ê‚Ä‚¢‚½‚Ì‚ðC³
+
+----------
+//0259 by ‚ê‚ 
+Emob_db.txt‚ÌC³
+ ‹T“‡ƒ‚ƒ“ƒXƒ^[‚âBOSS‚̃Xƒe[ƒ^ƒX’²®
+ ‹T“‡ƒ‚ƒ“ƒX‚É“K“–‚Ƀhƒƒbƒv‚ð•t‚¯‚Ü‚µ‚½B
+ –{ŽI‚ƈقȂ镨‚ð—Ž‚Æ‚·ê‡‚à‚ ‚è‚Ü‚·B
+
+----------
+//0258 by ŒÓ’±—–
+
+Eƒp[ƒeƒB‚ňê“xŒö•½‚É‚µ‚½‚çŠeŽ©Š“¾‚É–ß‚¹‚È‚¢ƒoƒOC³
+ (char/)
+ int_party.c
+ mapif_parse_PartyChangeOption()‚Ì”»’èC³
+
+EƒXƒLƒ‹‚̒ljÁŽÀ‘•iŽå‚ɔ͈ÍUŒ‚Œnj
+ ƒiƒp[ƒ€ƒr[ƒgi•ªŽU‘ΉžjAƒtƒ@ƒCƒ„[ƒ{[ƒ‹A
+ ƒTƒ“ƒ_[ƒXƒg[ƒ€Aƒwƒuƒ“ƒYƒhƒ‰ƒCƒuA
+ ƒuƒŠƒbƒcƒr[ƒgiŽ©“®‘éž‚ÝjAƒXƒ`[ƒ‹ƒNƒƒE
+ ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO
+
+ (db/)
+ skill_db.txt/skill_tree.txt
+ ˆê•”C³
+ (map/)
+ battle.c/battle.h
+ battle_check_target()‚ð’ljÁB‘ÎÛ‚É‚È‚é‚©‚ðŒŸ“¢‚·‚éB
+ battle_calc_magic_damage()‚̈ø”•ÏXBƒ_ƒ[ƒW•ªŽUˆ—’ljÁB
+ battle_calc_misc_damage()’ljÁB
+ battle_calc_weapon_damage()C³B
+ clif.c/clif.h
+ clif_skill_damage(),clif_skill_damage2()‚̈ø”•ÏXB
+ clif_skill_poseffect()’ljÁB
+ skill.c/skill.h
+ skill_weapon_attack(),skill_magic_attack()‚É”÷–­‚Ɉ—‚ð“Z‚ß‚½.
+ skill_area_sub()’ljÁB”͈̓XƒLƒ‹—pB
+ skill_area_sub_count()’ljÁBskill_area_sub()—pA“GƒJƒEƒ“ƒgB
+ skill_castend_damage_id()C³Bˆø”‚ƈ—‚ð’ljÁB
+ skill_castend_nodamage_id()C³Bˆø”‚ƈ—‚ð’ljÁB
+ skill_misc_attack()’ljÁB
+ skill_additional_effect()C³iŽ©“®‘éj
+ skill_castend_pos()C³B
+ skill_castend_pos2()’ljÁB
+
+E‹|‚ÅUŒ‚‚µ‚½‚Æ‚«ŒvŽZ‚ÉDEX‚Å‚È‚­STR‚ªŽg‚í‚ê‚é–â‘è‚ðC³B
+ battle.c
+ battle_calc_weapon_damage()C³B
+
+----------
+//0257 by ŒÓ’±—–
+
+Eitem_db.txt‚ÌE‹Æƒtƒ‰ƒO‚ÆAƒJ[ƒh‚Ì‘•”õŒÂŠƒtƒ‰ƒO‚ðC³
+ ‘•”õ•i‚ÍI-Athena‚̃f[ƒ^‚ðŽQl‚É‚µ‚Ä‹@ŠB“I‚ɃRƒ“ƒo[ƒg‚³‚¹‚Ü‚µ‚½B
+ I-Athena‘¤‚É‚È‚¢‘•”õ•i‚ÍA‚ ‚«‚ç‚©‚É•Ï‚È‚Ì‚ÍC³‚µ‚Ü‚µ‚½‚ªA
+ ’m‚ç‚È‚¢‚à‚Ì‚ª‘½‚·‚¬‚ÄA‚Ù‚Æ‚ñ‚Ç•ú’u‚Å‚·B
+ ƒJ[ƒh‚ÍA•Ší—pƒJ[ƒh‚Ì‘•”õŒÂŠ‚ª0‚É‚È‚Á‚Ä‚é‚Ì‚ð2(¶Žè)‚ÉC³B
+ —¼Žè•Ší‚Ìꇂ͕ʂɔ»’肵‚Ä‚é‚Ì‚Å—¼Žè•Ší‚à–â‘è‚È‚¢‚Í‚¸B
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ŠY“–ŒÂŠC³
+
+EƒJ[ƒh’ljÁŽÀ‘•
+ ƒXƒ^ƒ“‚Ȃǂ̒ljÁŒø‰ÊA‚»‚ê‚ç‚Ö‚Ì‘Ï«Œn“AƒI[ƒNƒq[ƒ[ƒJ[ƒhŽÀ‘•
+
+ (db/)
+ item_db.txt/item_db2.txt
+ ƒXƒNƒŠƒvƒg‚ÌC³
+ (map/)
+ map.h
+ struct map_session_data‚Éaddeff‚Ȃǂ̃ƒ“ƒo‚ð’ljÁ
+ pc.c
+ pc_calcstatus()Apc_bonus2()‚ÌC³
+ pc_attack()‚Åskill_additional_effct()‚ðŒÄ‚Ԃ悤‚ÉB
+ skill.c/skill.h
+ skill_additional_effect()‚ŃJ[ƒh‚É‚æ‚é”»’è’ljÁ
+ skill_status_change_start()‚Å‘Ï«‚ð•t‚¯‚½B
+ battle.c
+ battle_calc_weapon_attack()‚ŃI[ƒNƒq[ƒ[ƒJ[ƒh
+ iƒNƒŠƒeƒBƒJƒ‹‘Ï«j‚̈—‚ð’ljÁ
+
+E‰ñ”ð”»’è‚ÌC³
+ UŒ‚ŽÒ‚ªPC‚Ìê‡AÅ‘å–½’†—¦‚X‚T“§ŒÀ‚ð‚È‚µ‚É‚µ‚Ü‚µ‚½B
+ battle.c
+ battle_calc_weapon_attack()‚ðC³
+
+
+EŠ®‘S‰ñ”ð‚ðŽÀ‘•
+ ‚Ö‚ñ‚Ä‚±‚Ȉ—‚µ‚Ä‚Ü‚·•ŒvŽZŽ®“K“–‚Å‚·B
+
+ battle.c
+ battle_calc_weapon_attack()‚Ɉ—’ljÁB
+
+E‘qŒÉ‚ðŠJ‚¢‚½‚܂܃ƒOƒAƒEƒg‚µ‚½‚Æ‚«mapŽI“à‚Å‚ÍŠJ‚«‚Á‚Ï‚È‚µ‚É‚È‚Á‚Ä‚é–â‘è‚ðC³
+ storage.c
+ storage_storage_quitsave()‚ðC³
+
+E@item,@monster,@produce‚Å–¼‘OŽw’è‚Å‚«‚é‚悤‚É•ÏX
+ ‰pŒê–¼A“ú–{Œê–¼‚Ç‚¿‚ç‚Å‚àOKB‰pŒê‚Ìꇂ͑啶Žš¬•¶Žš‹æ•Ê‚µ‚Ü‚¹‚ñB
+
+ atcommand.c
+ ŠY“–ŒÂŠC³
+ itemdb.c/itemdb.h
+ itemdb_searchname(),itemdb_searchname_sub()’ljÁ
+ mob.c/mob.h
+ mobdb_searchname()’ljÁ
+
+E@refine‚Åã‚°‚é”’l‚ðŽw’è‚Å‚«‚é‚悤‚É•ÏX
+ atcommand.c
+ ŠY“–ŒÂŠC³
+
+E@produce‚É‚æ‚黑¢Žž‚̃GƒtƒFƒNƒg‚𳂵‚¢‚à‚Ì‚ÉC³
+ clif.c/clif.h
+ clif_produceeffect()’ljÁ
+ atcommand.c
+ ŠY“–ŒÂŠC³
+
+E˜I“XƒXƒLƒ‹Žg—pŽž‚̈—‚ð­‚µC³
+ skill.c
+ skill_castend_id()‚Å‚È‚­Askill_castend_nodamage_id()‚Å
+ ˜I“XŠJÝ‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
+
+Estricmp‚Ì•Ï‚í‚è‚Éstrcasecmp‚ðŽg‚¤‚悤‚É‚µ‚½
+ i_WIN32‚©__EMX__‚ª’è‹`‚³‚ê‚Ä‚¢‚é‚Æstricmp‚ðŽg‚¢‚Ü‚·j
+
+ (char/)
+ int_party.c
+ (map/)
+ itemdb.c/mob.c
+ ƒ}ƒNƒ’è‹`‚ÌC³‚È‚Ç
+
+EƒXƒLƒ‹‚ð­‚µC³
+ ƒOƒŠƒ€ƒgƒD[ƒX‚ªƒnƒCƒfƒBƒ“ƒO‚ÅŽg‚¦‚È‚¢–â‘èC³
+ •ŠíŒ¤‹†‚Ì–½’†C³‚ðŽÀ‘•
+
+ skill.c
+ skill_use_id()‚ÌC³
+ pc.c
+ pc_calcstatus()‚Å•ŠíŒ¤‹†‚É]‚Á‚Ä–½’†C³
+
+----------
+//0256 by nabe
+
+E˜I“XƒAƒCƒeƒ€w“ü‚̃oƒOC³
+ clif.c
+ clif_vendinglist()‚Å”„‚è؂ꂽƒAƒCƒeƒ€‚Í•\Ž¦‚µ‚È‚¢‚悤‚É
+
+----------
+//0255 by nabe
+
+E˜I“XƒAƒCƒeƒ€w“ü‚̃oƒOC³
+ vending.c
+ vending_purchasereq()‚Åzeny,weight•”•ªC³
+
+----------
+//0254 by nabe
+
+E˜I“X‚ðŽÀ‘•
+ vending.c/vending.h
+ V‹K’ljÁB˜I“XƒƒCƒ“ˆ—
+ skill.c
+ skill_castend_id()‚ɘI“XŠJ݃XƒLƒ‹ˆ—‚ð’ljÁ
+ clif.h/clif.h
+ ˜I“XŠÖ˜AƒpƒPƒbƒgˆ—‚ð’ljÁ
+ map.h
+ struct map_session_data‚ÉA
+ int vender_id;
+ int vend_num;
+ char message[80];
+ struct vending vending[12];
+ ‚ð’ljÁ
+
+----------
+//0253 by ŒÓ’±—–
+
+Estricmp–¢’è‹`ƒGƒ‰[‚ª‚Å‚éŠÂ‹«—p‚ÌC³
+ ƒGƒ‰[‚ªo‚½ê‡Aint_party.c‚Ìʼn‚̃}ƒNƒ’è‹`‚̃Rƒƒ“ƒg‰»‚Ì‚¤‚¿A
+ ‚Ç‚¿‚ç‚©‚ðŠO‚µ‚Ä‚â‚è’¼‚µ‚Ä‚Ý‚é‚ÆA‚¤‚Ü‚­‚¢‚­‚©‚àB
+ ň«A‰º‚ð—LŒø‚É‚µ‚½‚炤‚Ü‚­‚¢‚­‚Í‚¸Bi‘啶Žš¬•¶Žš‚ð‹æ•Ê‚·‚é‚悤‚É‚È‚è‚Ü‚·j
+
+ (char/)
+ int_party.c
+ ƒRƒƒ“ƒg‰»Ï‚݂̃}ƒNƒ’è‹`’ljÁ
+
+----------
+//0252 by ŒÓ’±—–
+
+EƒJ[ƒh‚̈ꕔŽÀ‘•
+ iƒXƒe[ƒ^ƒX•Ï‰»‘S”ÊA•Ší‘®«AƒXƒLƒ‹‚Í‚·‚Å‚ÉŽÀ‘•Ï‚Ýj
+ –h‹ï‘®«A‰r¥ŽžŠÔ•Ï‰»A‘®«UŒ‚‘Ï«AŽí‘°‘Ï«AŽí‘°’ljÁƒ_ƒ[ƒWA
+ ‘®«’ljÁƒ_ƒ[ƒWAƒTƒCƒY’ljÁƒ_ƒ[ƒWAMAXHPAMAXSP‘Œ¸AŽg—pSP•Ï‰»ŒnA
+ ƒtƒFƒ“AƒhƒŒƒCƒNAƒzƒ‹ƒ“A[•£‚Ì‹RŽmA‰©‹àå³AƒIƒVƒŠƒXƒJ[ƒh‚ðŽÀ‘•
+
+ (db/)
+ const.txt
+ bonus—p‚̒蔒ljÁAbonus2‚̒蔂à’ljÁ
+ item_db.txt/item_db2.txt
+ ƒJ[ƒh‚̃XƒNƒŠƒvƒg’ljÁ
+ (map/)
+ map.h
+ struct map_session_data‚Éhprate‚È‚Ç‘½”ƒƒ“ƒo’ljÁ
+ script.c
+ bonus2ƒRƒ}ƒ“ƒh’ljÁ
+ buildin_bonus2()’ljÁ
+ pc.c/pc.h
+ pc_bonus2()’ljÁ
+ pc_bonus()‚̈—’ljÁ
+ pc_calcstatus()‚ÅŠeŽí’ljÁƒƒ“ƒo‚̉Šú‰»‚ðs‚¤‚悤‚É‚µA
+ hprate‚âsprate‚É]‚¢max_hp,max_sp‚Ì’²®‚à‚·‚é‚悤‚É•ÏXB
+ pc_makesavestatus()‚ŃIƒVƒŠƒXƒJ[ƒhC³
+ skill.c
+ skill_castfix()‚Åcastrate‚É]‚¢A‰r¥ŽžŠÔ‚ð’²®B
+ skill_castend_id()‚Ådsprate‚É]‚¢AŽg—pSP‚ð’²®B
+ skill_castend_nodamage_id()‚ŃJ[ƒhC³‚ð’ljÁ
+ battle.c
+ battle_calc_weapon_attack()‚ŃJ[ƒhC³‚ð’ljÁ
+ battle_calc_magic_attack()‚ŃJ[ƒhC³‚ð’ljÁ
+ battle_damage()‚ŃtƒFƒ“ƒJ[ƒhC³‚ð’ljÁ
+
+EƒXƒe[ƒ^ƒXŠ„‚èU‚è‚Ì•\Ž¦ã‚Ì–â‘èC³
+ STR‚ðã‚°‚Ä‚àATK‚ª•Ï‚í‚ç‚È‚¢–â‘èAINT‚ðã‚°‚Ä‚àMATK‚ª•Ï‚í‚ç‚È‚¢–â‘èC³
+
+ map.h
+ struct map_session_data‚Ématk1,matk2ƒƒ“ƒo’ljÁ
+ pc.c
+ pc_calcstatus()‚ÌC³
+ clif.c
+ clif_initialstatus()‚ÌC³
+ battle.c
+ battle_calc_magic_attack()‚ÌC³
+
+
+----------
+//0251 by nabe
+
+E0250‚̃oƒOC³‚È‚Ç
+ ƒJ[ƒg‚ð•t‚¯‚¸‚ɃƒOƒCƒ“‚Ü‚½‚̓}ƒbƒvˆÚ“®‚µ‚½Œã‚ɃJ[ƒg‚ð•t‚¯‚é‚ÆA
+ ƒJ[ƒg‚Ì’†g‚ª2”{‚Ì—Ê‚É•\Ž¦‚³‚ê‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‚Ì‚ðC³B
+ ƒJ[ƒg‚̃AƒCƒeƒ€”‚ðXV‚·‚é‚悤‚ÉC³B
+ pc.h/pc.c
+ pc_iscarton()ƒ}ƒNƒ‚ð’ljÁ
+ pc_cart_additem(),pc_cart_delitem()‚É‚»‚ꂼ‚ê
+ sd->cart_num++;‚Æsd->cart_num--;ˆ—‚ð’ljÁ
+ clif.c
+ clif_parse_LoadEndAck()‚ÅA
+ ƒJ[ƒg‚ð•t‚¯‚Ä‚¢‚é‚Æ‚«‚̂݃J[ƒgî•ñ‚ð‘—M‚·‚é‚悤‚É‚µ‚½
+
+----------
+//0250 by nabe
+
+EƒJ[ƒgOFFAƒ`ƒFƒ“ƒWƒJ[ƒgŽÀ‘•B
+ (map/)
+ pc.c/pc.h
+ pc_setcart()‚ð’ljÁ
+ script.c
+ buildin_setcart()‚ð’ljÁ
+ ƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒhusetcart;v‚ŃJ[ƒg‚ª‚‚­
+ clif.c/clif.h
+ clif_parse_CartOff()’ljÁBiƒJ[ƒg‚ð‚Í‚¸‚·j
+ clif_parse_ChangeCart()’ljÁBiƒ`ƒFƒ“ƒWƒJ[ƒg‚̃J[ƒg‘I‘ðj
+ (conf/)
+ npc_town_kafra.txt
+ ƒJ[ƒgƒT[ƒrƒX‚ðusetcart;v‚É’uŠ·
+
+
+----------
+//0249 by ŒÓ’±—–
+
+Eƒp[ƒeƒB‚̃f[ƒ^ƒx[ƒX‚Ì–µ‚‚ðo—ˆ‚邾‚¯—}‚¦‚é‚悤‚ÉB
+ •¡”ƒp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚éƒf[ƒ^‚ÌŒŸ¸A’ljÁ‚ÉŽ¸”s‚µ‚½‚Æ‚«‚É’E‘Þ‚È‚ÇB
+
+ (char/)
+ int_party.c
+ party_check_conflict(),party_check_conflict_sub(),
+ mapif_parse_PartyCheck()’ljÁ
+ inter.c
+ ƒpƒPƒbƒg’·ƒŠƒXƒg‚É0x3028’ljÁ
+ INTERŽIƒpƒPƒbƒg.txt
+ ƒpƒPƒbƒg0x3028’ljÁ
+ (map/)
+ party.c/party.h
+ party_check_conflict()’ljÁB
+ party_invite()‚Å“¯ƒAƒJƒEƒ“ƒgŠ‘®ƒ`ƒFƒbƒN‚ðs‚¤‚悤‚ÉB
+ party_member_added(),party_send_movemap()‚Å
+ party_check_conflict()‚ðŒÄ‚Ԃ悤‚ÉB
+ intif.c/intif.h
+ intif_party_checkconflict()’ljÁ
+
+Eƒp[ƒeƒB‚ÌÀ•WA‚g‚o’Ê’m‚ðŽÀ‘•
+ •Ï‰»‚ª‚ ‚ê‚΂P•b‚Ɉê‰ñ‘—MB
+
+ map.h
+ struct map_session_data‚Éparty_x,~_y,~_hp‚Ì‚Rƒƒ“ƒo’ljÁ
+ party.c/party.h
+ party_send_xyhp_timer_sub(),party_send_xyhp_timer(),
+ party_send_xy_clear(),party_send_hp_check()’ljÁB
+ party_recv_movemap()‚Åsd->party_*‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+ clif.c/clif.h
+ clif_send‚ÌPARTY*ƒtƒ‰ƒO‚ð—LŒø‚ÉB
+ iPARTY,PARTY_SAMEMAP,PARTY_AREA,PARTY*_WOS‚Ì‚UŽíj
+ clif_party_xy(),clif_party_hp()’ljÁB
+ pc.c/pc.h
+ pc_authok()‚Åsd->party_*‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+ pc_walk()‚Ńp[ƒeƒBƒƒ“ƒo‚ªŽ‹ŠE“à‚É“ü‚Á‚Ä‚«‚½‚Æ‚«‚É
+ party_hp‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+
+Eƒp[ƒeƒB‚ÌexpŒö•½•ª”z‚ðŽÀ‘•
+ party.c/party.h
+ party_share_exp()’ljÁ
+ mob.c/mob.h
+ mob_damage()‚ÅŒö•½•ª”zˆ—’ljÁ
+
+EƒXƒLƒ‹‚ÌC³‚ƒljÁŽÀ‘•
+ ƒoƒbƒVƒ…AƒsƒA[ƒX‚Ì–½’†—¦C³ŽÀ‘•
+ ƒsƒA[ƒX‚̃TƒCƒY‚É‚æ‚é‰ñ”•Ï“®ŽÀ‘•iƒvƒŒƒCƒ„[‚Í’†Œ^‚Ɖ¼’èj
+ ƒoƒbƒVƒ…Aƒ\ƒjƒbƒNƒuƒƒE‚̃Xƒ^ƒ“Œø‰ÊŽÀ‘•
+ ƒXƒg[ƒ“ƒJ[ƒXAƒtƒƒXƒgƒ_ƒCƒoAƒCƒ“ƒxƒiƒ€A
+ ƒAƒXƒyƒ‹ƒVƒIAƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“AƒŒƒbƒNƒXƒfƒr[ƒiŽÀ‘•
+
+ skill.c
+ skill_additional_effect()’ljÁ
+ skill_castend_damage_id()ŠY“–ŒÂŠC³
+ skill_castend_nodamage_id()ŠY“–ŒÂŠC³
+ skill_use_id(),skill_use_pos()‚ŃXƒLƒ‹‚ªŽg—p‚Å‚«‚È‚¢‚Æ‚«‚Í
+ ‰½‚à‚µ‚È‚¢‚悤‚ÉC³B
+ battle.c
+ battle_calc_weapon_attack()‚ÌŠY“–ŒÂŠC³
+ battle_get_dmotion(),battle_get_attack_element()C³
+ clif.c
+ clif_mob007b(),clif_mob0078‚Åoption‚È‚Ç‚ð‘—‚é‚悤‚ÉC³
+ pc.c
+ pc_attack(),pc_walktoxy()‚Ås“®•s‰Â”\‚È‚Æ‚«‚͉½‚à‚µ‚È‚¢‚悤‚ÉB
+ mob.c
+ mob_stopattack()C³
+ mob_ai_sub_hard()‚Ås“®•s”\‚È‚Æ‚«‚͉½‚à‚µ‚È‚¢‚悤‚ÉB
+
+EUŒ‚ŽË’ö‚Ì”»’è’ljÁ
+ ‘ŠŽè‚ªˆÚ“®‚µ‚Ä“Í‚©‚È‚¢‚Æ‚«‚ÍAˆÚ“®ƒpƒPƒbƒg‚ð‘—M
+
+ clif.c/clif.h
+ clif_movetoattack()’ljÁ
+ pc.c
+ pc_attack()‚ÅŽË’ö”»’èA“Í‚©‚È‚¢‚È‚çclif_movetoattack()‚ðŒÄ‚ÔB
+
+----------
+//0248 by nabe
+
+Eƒp[ƒeƒB쬎ž‚ÉŠù‚Ƀp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚½ê‡‚̈—‚ð’ljÁ
+ party.c
+ party_create()‚ÉAŠù‚Ƀp[ƒeƒB‚ÉŠ‘®‚µ‚Ä‚¢‚½ê‡
+ clif_party_created(sd,2)‚ð’ljÁ
+
+EƒfƒBƒXƒJƒEƒ“ƒgAƒI[ƒo[ƒ`ƒƒ[ƒW‚ðŒvŽZ
+ pc.c
+ pc_modifybuyvalue()Apc_modifysellvalue()‚Å’l’i‚ðŒvŽZ
+
+
+----------
+//0247 by ŒÓ’±—–
+
+Eƒp[ƒeƒBŽÀ‘•
+ Œö•½•ª”z‚Íݒ肵‚Ä‚àŽÀÛ‚É‚ÍŒö•½•ª”z‚³‚ê‚Ä‚È‚¢B
+ ƒp[ƒeƒBƒXƒLƒ‹‚Í‚Ü‚¾Ž©•ª‚É‚µ‚©‚©‚©‚ç‚È‚¢
+
+ (char/)
+ int_party.c/int_party.h
+ ‚Ü‚Æ‚à‚ÉŽÀ‘•
+ inter.c
+ ƒpƒPƒbƒg’·ƒŠƒXƒg’ljÁ
+ INTERŽIƒpƒPƒbƒg.txt
+ ƒp[ƒeƒB‚̃pƒPƒbƒg’ljÁ
+ (map/)
+ party.c/party.h
+ V‹K’ljÁ
+ map.c/map.h
+ struct map_session_data‚Éparty_sendedƒƒ“ƒo’ljÁ
+ do_init()‚Ådo_party_init()‚ðŒÄ‚Ô
+ map_quit()‚Åparty_send_logout()‚ðŒÄ‚Ô
+ intif.c/intif.h
+ ƒp[ƒeƒBŠÖ˜A‚Ì•”•ª’ljÁ
+ clif.c/clif.h
+ ƒp[ƒeƒBŠÖ˜A‚Ì•”•ª’ljÁ
+ clif_parse_LoadEndAck()‚Åparty_send_movemap()‚ðŒÄ‚Ño‚·
+ pc.c
+ pc_authok()‚Åparty_request_info()‚ðŒÄ‚Ԃ悤‚É‚µA
+ party_sended‚ð‰Šú‰»‚·‚é‚悤‚ÉB
+
+E‰r¥–WŠQ‚³‚ꂽ‚Æ‚«‰æ–Êã‚ʼnr¥‚ð‚â‚ß‚é‚悤‚ÉC³
+ (map/)
+ skill.c
+ skill_castcancel()‚ʼnr¥’†Ž~ƒpƒP(‡‚Á‚Ä‚é‚Ì‚©‚ÈH)‚ð‘—M
+
+E’´‰“‹——£UŒ‚‚¾‚Æ“G‚ª”½Œ‚‚µ‚Ä‚±‚È‚¢–â‘è‚ðC³
+ (map/)
+ map.h
+ struct mob_data‚Émin_chaseƒƒ“ƒo’ljÁiÅ’á’ÇÕ‹——£j
+ mob.c
+ mob_attack()‚Åmin_chase‚ð13‚ɉŠú‰»‚·‚é
+ mob_walk()‚Åmin_chase‚ª13‚æ‚è‘å‚«‚¢‚È‚ç­‚µ‚¸‚ˆø‚¢‚Ä‚¢‚­
+ mob_ai_sub_hard()‚Åmin_chase‚É‚æ‚è’ÇÕ‚ð”»’fA
+ UŒ‚‚ðŽó‚¯‚½Žž‚Émin_chase‚ð”މ䋗—£+13‚ÉÝ’è
+
+----------
+//0246 by ŒÓ’±—–
+
+EƒJ[ƒgŽÀ‘•
+ map.h
+ struct map_session_data‚Écart_weight‚È‚Ç‚S‚ƒƒ“ƒo’ljÁ
+ pc.c/pc.h
+ pc_cart_additem(),pc_cart_delitem(),
+ pc_cart_putitemtocart(),pc_cart_getitemfromcart()’ljÁ
+ pc_calcstatus()‚ŃJ[ƒgd—Ê‚âŒÂ”‚È‚Ç‚Ìî•ñ‚ðŒvŽZ
+ clif.c/clif.h
+ clif_cart_itemlist(),clif_cart_equiplist(),
+ clif_cart_additem(),clif_cart_delitem(),
+ clif_parse_PutItemToCart(),clif_parse_GetItemFromCart()’ljÁ
+ clif_parse_LoadEndAck()‚ŃJ[ƒgî•ñA“à—e‘—M
+ clif_updatestatus()‚ÅSP_CARTINFO‚ŃJ[ƒgî•ñ‚ð‘—‚ê‚é‚悤‚É
+ clif_parse_MoveFromKafraToCart(),~ToKafraFromCart()’ljÁ
+ storage.c/storage.h
+ storage_additem(),storage_delitem()’ljÁ
+ storage_storageadditemfromcart,~getitemtocart()’ljÁ
+ storage_storageadd(),storage_storageget()‚ÅA
+ storage_additem(),storage_delitem()‚ðŒÄ‚Ԃ悤‚É•ÏX
+
+EƒXƒLƒ‹‰r¥ƒfƒBƒŒƒC‚È‚ÇŽÀ‘•
+ clif.c
+ clif_parse_WalkToXY()‚Éskilltimer‚É‚æ‚éˆÚ“®‰Â”Û‚ð’ljÁ
+ clif_parse_UseSkillToId(),clif_parse_UseSkillToPos()‚É
+ canmove_tick‚É‚æ‚éUŒ‚‰Â”ےljÁ
+ skill.c/skill.h
+ skill_castcancel()‚ð’ljÁ
+ skill_use_id(),skill_use_pos()‚ŃfƒBƒŒƒCŽžŠÔŒvŽZ‚¨‚æ‚ÑA
+ canmove_tick‚ÌÝ’è
+ battle.c
+ battle_damage()‚Åskill_castcancel()‚̌ĂÑo‚µ’ljÁ
+
+E0245‚̃AƒCƒeƒ€ƒf[ƒ^ƒx[ƒXC³‚Ì’Ê퉿Ši”Å—pˆÓ
+ (db/)
+ item_db.txt
+ item_db2.txt‚É‘O‚Ìitem_db.txt‚̉¿Šiî•ñ‚ðƒ}[ƒW‚µ‚½‚¾‚¯‚Å‚·B
+
+----------
+//0245 by ‚ê‚ 
+ ‚Ü‚½—á‚É‚æ‚Á‚ÄA‘ŠêC³”Å‚Ì‚Ý‚Å‚·B
+Eitem_db2.txt‚ÌC³
+ ‹T“‡V‘•”õ‚ÌŒø‰Ê‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
+ ƒEƒBƒU[ƒh‚ªñ‚ð‘•”õ‚Å‚«‚È‚¢‚Ì‚ðC³
+ ƒEƒBƒU[ƒh‚ªƒ}ƒWƒVƒƒƒ“ƒnƒbƒgA‚Æ‚ñ‚ª‚è–X‚ð
+ ‘•”õ‚Å‚«‚È‚¢‚Ì‚ðC³
+----------
+//0244 by ‚ê‚ 
+Emob_db.txt‚ÌC³
+ ‹T“‡ƒ‚ƒ“ƒXƒ^[‚̃f[ƒ^‚ð‚¢‚ê‚Ü‚µ‚½B
+ ‚½‚¾AŠÔˆá‚Á‚Ä‚é•”•ª‚ª‚©‚È‚è‚ ‚è‚Ü‚·B
+ Speed,Delay‚Í“K“–‚Å‚·B
+ ‚Ü‚½A‚í‚©‚ç‚È‚¢‚Ì‚ÍŠØ‘”ł̃f[ƒ^‚È‚Ì‚Å
+ Mdef‚Æ‚©ˆÙí‚É‚‚¢‹C‚àB
+----------
+//0242 by ŒÓ’±—–
+
+EŽæˆøŠÖ˜A‚Ì•ÏX‚ÆC³
+ Žæˆø‚ÉŽg‚¤•Ï”‚ðmmo_charstatus‚©‚çmap_session_data‚Ɉړ®‚µ‚Ü‚µ‚½
+
+ (common/)
+ mmo.h
+ struct mmo_charstatus‚©‚çŽæˆøŠÖŒW‚̃ƒ“ƒoíœ
+ (map/)
+ map.h
+ struct map_session_data‚ÉŽæˆøŠÖŒW‚̃ƒ“ƒo’ljÁ
+ trade.c
+ \‘¢‘Ì‚Ì•ÏX‚É‚ ‚킹‚ÄC³
+ map.c
+ map_quit()‚ÅŽæˆø’†‚È‚çƒLƒƒƒ“ƒZƒ‹‚·‚é‚悤‚É‚µ‚½
+
+EƒJ[ƒh‚Ì‘g‚݇‚킹ŽÀ‘•
+ pc.c/pc.h
+ pc_insert_card()‚ŃJ[ƒh‚ðŽÀÛ‚É‘}“ü‚·‚é
+ clif.c/clif.h
+ clif_parse_UseCard(),clif_parse_InsertCard()’ljÁ
+ clif_use_card(),clif_insert_card()’ljÁ
+
+Eˆê•”‚̃J[ƒhŒø‰ÊŽÀ‘•
+ ƒXƒLƒ‹K“¾ƒJ[ƒhAƒXƒe[ƒ^ƒXƒ{[ƒiƒXƒJ[ƒh‚È‚ÇB
+
+ (map/)
+ map.h
+ struct map_session_data‚É‘•”õƒJ[ƒhŒŸõ—p‚Ì•Ï”’ljÁ
+ pc.c/pc.h
+ pc_calcstatus()‚ŃJ[ƒh‚̈—’ljÁ
+ ‚ ‚éID‚̃J[ƒh‚ª‘•”õÏ‚Ý‚©ŒŸõ‚·‚邽‚ß‚ÌŠÖ”A
+ pc_equip_card(),pc_equip_wcard(),pc_equip_dcard()‚ð—pˆÓ
+
+Ed—ʃI[ƒo[/‘é/‹RæƒAƒCƒRƒ“‚Ì•\Ž¦
+ (map/)
+ pc.c/pc.h
+ pc_checkweighticon()’ljÁAd—ʂ̃AƒCƒRƒ“ˆ—
+ clif.c
+ clif_updatestatus()‚Åd—Ê‘—MŽž‚Épc_checkweighticon()‚ÌŽÀs
+ clif_changeoption()‚Å‘é‚Æ‹Ræ‚̃AƒCƒRƒ“ˆ—
+
+E0241‚̃AƒCƒeƒ€ƒf[ƒ^ƒx[ƒXC³‚Ì’Ê퉿Ši”Å—pˆÓ
+ (db/)
+ item_db.txt
+ item_db2.txt‚É‘O‚Ìitem_db.txt‚̉¿Šiî•ñ‚ðƒ}[ƒW‚µ‚½‚¾‚¯‚Å‚·B
+
+
+----------
+//0241 by ‚ê‚ 
+EƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚ÌC³
+ V“ª‘•”õ‚̃Oƒ‰ƒtƒBƒbƒN‚ªˆÙ‚È‚é‚Ì‚ðC³
+ ‘•”õ‚ÌŒø‰Ê‚ÌŽÀ‘•
+ ã’iE’†’i‚ªŠÔˆá‚Á‚Ä‚½‚Ì‚ð­‚µC³
+ ‘¬•ñ”Å‚Á‚Ä‚±‚ƂŊԈႦ‘½‚¢‚©‚àB
+ ƒeƒXƒg‚à‚ ‚܂肵‚Ä‚Ü‚¹‚ñB
+ ‚ ‚ÆA‘Šê’²®”Å‚µ‚©—pˆÓ‚µ‚Ä‚Ü‚¹‚ñB
+
+ item_db2.txt
+ ‹T“‡‚É‚ ‚킹‚Ä’²®
+
+----------
+//0240 by nabe
+
+EŽæˆø‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
+ (common/)
+ mmo.h
+ struct mmo_charstatus ‚É
+ int trade_partner;
+ int deal_item_index[10];
+ int deal_item_amount[10];
+ int deal_zeny;
+ short deal_locked;
+ ‚ð’ljÁ
+ (map/)
+ clif.c,clif.h
+ clif_traderequest() : 0xe5iŽæ‚èˆø‚«—v¿Žó‚¯j
+ clif_tradestart() : 0xe7iŽæ‚èˆø‚«—v‹‰ž“šj
+ clif_tradeadditem() : 0xe9i‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁj
+ clif_tradeitemok() : 0xeaiƒAƒCƒeƒ€’ljÁ¬Œ÷j
+ clif_tradedeal_lock() : 0xeciok‰Ÿ‚µj
+ clif_tradecancelled() : 0xeeiŽæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹j
+ clif_tradecompleted() : 0xf0iŽæ‚èˆø‚«Š®—¹j
+ ‚ð’ljÁB
+ trade.c,trade.h
+ trade_traderequest() : Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
+ trade_tradeack() : Žæˆø—v¿
+ trade_tradeadditem() : ƒAƒCƒeƒ€’ljÁ
+ trade_tradeok() : ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
+ trade_tradecancel() : ŽæˆøƒLƒƒƒ“ƒZƒ‹
+ trade_tradecommit() : Žæˆø‹–‘ø(trade‰Ÿ‚µ)
+ ‚ðŽÀ‘•B‚»‚ꂼ‚êclif.c::clif_parse_Trade*‚©‚çŒÄ‚΂ê‚éB
+
+
+----------
+//0238 by ‚ê‚ 
+
+E‘¬“x•ÏX‚ÉŠÖ‚µ‚Ä­‚µC³
+ atcommand.c
+ ‘¬“x•ÏX‚Ì•”•ª‚ð­‚µC³
+ ‚±‚ê‚ňꉞ“®‚­‚Ý‚½‚¢H
+ pc.c
+ ‚‚¢‚Å‚É‚Å‚·‚ª
+ ‘¬“x㸂ŕàs‘¬“x‚ªã‚ª‚é‚悤‚É‚µ‚½B
+ ˆê‰ž“®‚­‚Ý‚½‚¢‚Å‚·‚ª“K“–‚È‚Ì‚Å
+ ‚¨‚©‚µ‚È‚Æ‚±‚낪‚ ‚ê‚΂¨Šè‚¢‚µ‚Ü‚·B
+
+----------
+//0236 by nabe
+
+EƒXƒNƒŠƒvƒg‚Åmenu‚Å”ò‚ñ‚¾æ‚Å’¼‚®menu‚ð‘‚­‚ƌ듮삷‚éƒoƒO‚ðC³‚µ‚Ü‚µ‚½B
+ script.c
+ goto“®ì‚ÌŒã‚ÌRERUNLINE‚ɑΈ‚·‚邽‚ßA
+ goto,menu‚Å”ò‚ñ‚¾Œã‚É‚ÍAst.state==GOTO‚Årerun_pos‚ðXVB
+
+
+----------
+//0233 by nabe
+
+EƒAƒCƒeƒ€‚ð‘•”õ‚·‚éÛ‚Ì‘•”õ”»’è‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ pc.c
+ pc_equipitem()‚É‘•”õ”»’èi«•Ê”»’èA‘•”õLV”»’èAE‹Æ”»’èj’ljÁ
+
+Ed—Ê”»’èƒXƒNƒŠƒvƒgƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ if (checkweight(ƒAƒCƒeƒ€ID,ƒAƒCƒeƒ€”—Ê))
+ ‚Å‚»‚̃AƒCƒeƒ€~”—Ê‚ðŽæ“¾‚Å‚«‚é‚©‚Ç‚¤‚©”»’è‚Å‚«‚Ü‚·B
+ script.c
+ buildin_checkweight()‚ð’ljÁ
+
+EƒXƒNƒŠƒvƒg‹l‚߇‚킹‚ðathena dev-2.1.1—p‚ɈÚA‚µ‚Ü‚µ‚½B
+ map_athena1.cnf
+ npc_event_*.txt ƒCƒxƒ“ƒgNPC
+ npc_job_*.txt “]ENPC
+ npc_mob_job.txt “]E—pƒ‚ƒ“ƒXƒ^[
+ npc_town_*.txt ’¬NPC
+
+
+----------
+//0232 by ŒÓ’±—–
+
+E‘•”õƒ{[ƒiƒX‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ ƒ{[ƒiƒX‚ÉŽg‚¤ƒXƒNƒŠƒvƒg(bonus,skill)‚ðŽÀ‘•
+ ƒXƒNƒŠƒvƒg‚ÍI-Athena‚̃f[ƒ^‚ðŽg‚Á‚ăRƒ“ƒo[ƒg‚µ‚Ü‚µ‚½B
+ i‚Ü‚¾ƒJ[ƒh‚ɂ͑Ήž‚µ‚Ä‚¢‚Ü‚¹‚ñj
+
+ (common/)
+ mmo.h
+ struct skill‚Éflagƒƒ“ƒo’ljÁiƒJ[ƒhƒXƒLƒ‹‚©‚Ç‚¤‚©j
+ (map/)
+ map.h
+ struct map_session_data‚Éatk_ele‚Ȃǂ̃ƒ“ƒo’ljÁ
+ enum‚ÅSP_ATKELEMENT‚ȂǒljÁ
+ pc.c
+ pc_bonus()‚ÌŽÀ‘•Apc_skill()’ljÁ
+ script.c
+ buildin_skill()‚̒ljÁ
+ buildin_bonus()‚ÌC³(const.txt‚̒蔂ªŽg‚¦‚é‚悤‚É)
+ clif.c
+ clif_skillinfoblock()‚ÌC³(ƒJ[ƒhƒXƒLƒ‹‚Íã‚°‚ç‚ê‚È‚¢)
+ (db/)
+ const.txt
+ bonus‚ÉŽg‚¤‚½‚߂̒蔒ljÁ
+ item_db.txt
+ •W€‚̃f[ƒ^‚É‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚½‚à‚Ì
+ item_db2.txt
+ 0213‚Å‘Šê’²®‚³‚ꂽƒf[ƒ^‚É‘•”õƒXƒNƒŠƒvƒg‚ð’ljÁ‚µ‚½‚à‚Ì
+
+E‰r¥ŠÖŒW‚̃oƒO‚ªC³‚³‚ê‚Ü‚µ‚½
+ (map/)
+ skill.c
+ skill_use_id(),skill_use_pos()‚ðC³
+ (db/)
+ cast_db.txt
+ ­‚µ’ljÁiƒuƒŠƒbƒcƒr[ƒg‚È‚Çj
+
+EUŒ‚‘®«‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+E¯‚Ì‚©‚¯‚ç‚ÌC³‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ map.h
+ struct map_session_data‚Éstarƒƒ“ƒo’ljÁ
+ pc.c
+ pc_calcstatus()‚Å‘®«‰Šú‰»
+ battle.c
+ battle_get_element(),battle_get_attack_element()C³
+ battle_calc_weapon_damage()‚ÌŠY“–ŒÂŠC³
+
+Eñ‘•”õŽž‚ÉMATK+15%‚ª“K—p‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ battle.c
+ battle_calc_magic_damage()‚ÌŠY“–ŒÂŠC³
+
+E»‘¢•Ší‚̃Lƒƒƒ‰ƒNƒ^[–¼‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+
+ Œ´—‚Æ‚µ‚Ä‚ÍAmapŽI“à‚̃Lƒƒƒ‰ƒNƒ^–¼ƒf[ƒ^ƒx[ƒX‚ðŒŸõ‚µ‚ÄA
+ ‘¶Ý‚·‚ê‚Α¦•ÔMA‘¶Ý‚µ‚È‚¯‚ê‚ÎcharŽI‚É‰ðŒˆ—v‹‚ðo‚·B
+ ‚±‚Ì‚Æ‚«A–¼‘O‚ð—v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚ÌID‚ðƒf[ƒ^ƒx[ƒX‚É“o˜^‚·‚éB
+ charŽI‚©‚ç–¼‘Oƒf[ƒ^‚ª‚­‚é‚ÆA‘Ήž‚·‚éƒf[ƒ^ƒx[ƒX‚É–¼‘O‚ðƒZƒbƒg‚µA
+ —v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚É–¼‘O‚ð•ÔM‚·‚éB
+ –¢‰ðŒˆ‚Ì“¯‚¶ƒLƒƒƒ‰ID‰ðŒˆ‚ð•¡”‚̃Nƒ‰ƒCƒAƒ“ƒg‚ª—v‹‚µ‚Ä‚«‚½ê‡A
+ ÅŒã‚É—v‹‚µ‚Ä‚«‚½ƒNƒ‰ƒCƒAƒ“ƒg‚É‚µ‚©•ÔM‚µ‚È‚¢‚ªA
+ •ÔM‚³‚ê‚È‚©‚Á‚½ƒNƒ‰ƒCƒAƒ“ƒg‚Í”•bŒã‚ÉÄ‚Ñ‰ðŒˆ—v‹‚ð‘—‚Á‚Ä‚­‚é
+ i‚»‚µ‚Ä‚»‚Ì‚Æ‚«‚ÍmapŽI‚©‚瑦•ÔM‚³‚ê‚éj‚Ì‚Å‘å‚«‚È–â‘è‚Í‚È‚¢B
+
+ ƒpƒPƒbƒg0x2b08,0x2b09‚ÅmapŽI‚ÆcharŽI‚ª’ÊM‚µ‚Ä‚Ü‚·B
+
+ (char/)
+ char.h
+ UNKNOWN_CHAR_NAME’è‹`iƒLƒƒƒ‰ƒf[ƒ^‚ª–³‚¢‚Æ‚«‚É•Ô‚³‚ê‚é–¼‘Oj
+ char2.c
+ parse_frommap()‚ɃpƒPƒbƒg0x2b08‚̈—‚ð’ljÁ
+
+ (map/)
+ chrif.c/chif.h
+ chrif_searchcharid()’ljÁ
+ chrif_parse()‚Å0x2b09‚̈—’ljÁ
+ map.c
+ ƒf[ƒ^ƒx[ƒX charid_db 錾
+ struct charid2nick錾Bnick‚Í–¼‘OA
+ req_id‚Í0‚Å–¼‘O‰ðŒˆÏ‚ÝA0ˆÈŠO‚Å–¢‰ðŒˆ‚Å‰ðŒˆ‘Ò‚¿‚̃uƒƒbƒNID
+ map_addchariddb()’ljÁBƒf[ƒ^ƒx[ƒX‚Ö–¼‘O“o˜^A—v‹‚É•ÔMB
+ map_reqchariddb()’ljÁB—v‹‚ª‚ ‚Á‚½‚±‚Æ‚ðƒf[ƒ^ƒx[ƒX‚֒ljÁB
+ map_charid2nick()‚Ńf[ƒ^ƒx[ƒX‚ÌŒŸõ
+ do_init()‚Å charid_db ‚̉Šú‰»‚ð’ljÁ
+ clif.c/clif.h
+ clif_parse_SolveCharName(),clif_solved_charname()’ljÁ
+
+
+----------
+//0231 by nabe
+
+EƒXƒNƒŠƒvƒg‚Å mes "$charaname"; “™‚Æ‘‚­‚ƃLƒƒƒ‰‚Ì–¼‘O‚ð‚µ‚á‚ׂé‹@”\‚ð’ljÁB
+ script.c
+ buildin_mes()“à‚Å
+ mes“à•”‚Ì$charaname‚ðƒLƒƒƒ‰‚Ì–¼‘O‚É’uŠ·‚·‚鈗‚ð’ljÁB
+ ”“¯—l‚É‚µ‚Ä•Ï”‚Ì’l‚È‚Ç‚ðmes“à•”‚Å•\Ž¦‚·‚é‚悤‚É‚·‚邱‚Æ‚à
+ ”‚Å‚«‚Ü‚·‚ªA‚±‚ê‚ɂ‚¢‚Ä‚Í–¢ŽÀ‘•‚Å‚·EEEB
+ ”‚Æ‚è‚ ‚¦‚¸
+ ” mes Global_Val;
+ ”‚̂悤‚É’¼Ú‘‚­‚±‚ƂőΈ‚µ‚Ä‚­‚¾‚³‚¢B
+
+E“G‚ÉUŒ‚‚³‚ꂽ‚Æ‚«‚ÉmapŽI‚ª—Ž‚¿‚邱‚Æ‚ª‚ ‚é‚Ì‚ðC³B
+ battle.c
+ battle_calc_weapon_attack()‚Ì
+ ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“‚̃XƒLƒ‹ƒ`ƒFƒbƒN•”•ªA
+ pc_checkskill(sd,22)‚ðA
+ pc_checkskill(tsd,22)‚ÉB
+
+----------
+//0230 by nabe
+
+E‰ñ”𗦑‰ÁƒXƒLƒ‹‚ðƒXƒe[ƒ^ƒX‚É”½‰fB
+ pc.c
+ 0228‚Å‚Ìpc_calcstatus()‚̉ñ”𗦑‰Á•ª‚ðŒ³‚É–ß‚µflee‚ð‘‰ÁB
+ battle.c
+ battle_calc_weapon_attack()‚ÌhitrateŒvŽZ‚ʼnñ”𗦕ÛØ‚ðŒvŽZB
+EƒOƒ[ƒoƒ‹•Ï”‚ðŽÀ‘•B
+@ '@'‚à‚µ‚­‚Í'l'‚ÅŽn‚Ü‚ç‚È‚¢•Ï”–¼‚ÍA‘S‚ăOƒ[ƒoƒ‹•Ï”‚Æ‚Ý‚È‚³‚ê‚Ü‚·B
+ mmo.h
+ struct mmo_charstatus ‚É
+ int global_reg_num;
+ struct global_reg global_reg[GLOBAL_REG_NUM];
+ ‚ð’ljÁB
+ pc.c
+ pc_readglobalreg(),pc_setglobalreg()‚ð’ljÁB
+ script.c
+ get_val(),buildin_input(),buildin_set()‚É
+ ƒOƒ[ƒoƒ‹•Ï”‚Ì‚½‚߂̈—‚ð’ljÁB
+ char2.c
+ mmo_char_tostr(),mmo_char_fromstr()‚É
+ ƒOƒ[ƒoƒ‹•Ï”‚Ì‚½‚߂̈—‚ð’ljÁB
+
+----------
+//0229 by ŒÓ’±—–
+
+Eˆê•”ƒXƒLƒ‹‚ÌŽÀ‘•/C³
+ ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“Aƒf[ƒ‚ƒ“ƒxƒCƒ“Aƒr[ƒXƒgƒxƒCƒ“ŽÀ‘•
+ ƒGƒiƒW[ƒR[ƒgC³i–‚–@‚É‚æ‚éUŒ‚‚ɂ̓XƒLƒ‹‚ª“­‚©‚È‚¢‚悤‚ÉC³j
+ •ŠíUŒ‚ŒnƒXƒLƒ‹C³iƒGƒtƒFƒNƒg‚ð’ÊíUŒ‚‚©‚çƒXƒLƒ‹‚É•ÏXj
+
+ battle.c
+ battle_addmastery()‚ŃxƒCƒ“Œn’ljÁ
+ battle_calc_damage()‚ŃGƒiƒW[ƒR[ƒgC³
+ skill.c
+ skill_castend_damage_id()‚Ì•ŠíUŒ‚ŒnƒXƒLƒ‹‚Ì•”•ª‚ðC³
+
+E“GUŒ‚ŒvŽZ‚ðPC‚Ì‚à‚̂ƈê–{‰»
+ ‚±‚ê‚ÅPCvsPCAPCvsMOBAMOBvsPCAMOBvsMOB(!?)‚ð‚P‚‚̊֔‚ÅŒvŽZ‚Å‚«‚Ü‚·
+
+ battle.c/battle.h
+ battle_calc_weapon_attack()‚ðC³
+ battle_calc_weapon_attack_pc(),~mob()‚ðíœ
+ mob.c
+ mob_attack()‚ÅŒvŽZ‚Ébattle_calc_weapon_attack()‚ðŽg‚¤‚悤‚ÉC³
+
+E‰r¥ŽžŠÔƒf[ƒ^‚ª‚È‚¢ê‡‚̃fƒtƒHƒ‹ƒg‚̉r¥ŽžŠÔ‚ð‚O‚É•ÏX
+ ¡‚Ü‚Å‚Í‚P•b‚É‚µ‚Ä‚Ü‚µ‚½‚ªAƒoƒbƒVƒ…‚Æ‚©‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ÅB
+ iƒoƒbƒVƒ…‚Æ‚©‚̃f[ƒ^‚ð—pˆÓ‚·‚ê‚΂±‚¤‚µ‚È‚­‚Ä‚à’¼‚é‚ñ‚Å‚·‚ªj
+
+ pc.c
+ pc_readdb()‚Å1000ms‚ðƒZƒbƒg‚·‚é‚Ì‚ðŽ~‚ß‚½
+
+E‰“‹——£UŒ‚‚µ‚Ä‚±‚È‚¢ƒoƒOA‚»‚Ì‘¼‚ðC³
+ mob.c
+ mob_attack()‚ÌŽË’ö‚ðC³‚µ–Y‚ê‚Ä‚¢‚½
+ mob_ai_sub_hard()‚ÅŽË’ö‹——£ŠO‚ÌŽžA–³ˆÚ“®‚Ì“G‚Í
+ ƒ^[ƒQƒbƒg‚ðŠO‚·‚悤‚É‚µ‚½
+
+
+----------
+//0228 by nabe
+
+Eƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ÌSkillID‚ðC³B
+ battle.c
+ battle_calc_weapon_attack_pc()‚Å
+ pc_checkskill(sd,49) -> pc_checkskill(sd,48)‚ÉB
+E‰ñ”𗦌üã‚ð—z‚É•\‚³‚È‚¢
+ pc.c
+ pc_calcstatus()‚Å‚Ìflee‚̉ñ”𗦌ü㕪‚ð휂µA
+ mob.c
+ mob_attack()‚ÌhitrateŒvŽZ‚ʼnñ”𗦌üã‚ðŒvŽZB
+E“å³A“峎“A“å³—Y‚ð³í‰»B
+ npc_monster3J.txt
+ mob_db.txt‚ɇ‚킹‚ÄA‚½‚Ô‚ñ³‚µ‚¢‚ÆŽv‚í‚ê‚éID‚ÉC³B
+ “å³ 1006 -> 1051
+ “峎“ 1017 -> 1053
+ “å³—Y 1021 -> 1054
+EƒfƒoƒbƒOƒƒbƒZ[ƒW‚ÌÁ‚µ–Y‚êiHj‚ðíœB
+ pc.c
+ printf("pc.c 63 clif_clearchar_area\n");‚ðƒRƒƒ“ƒgƒAƒEƒg
+
+----------
+//0227 by ŒÓ’±—–
+
+Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ HP‰ñ•œŒüãASP‰ñ•œŒüãAƒ}ƒOƒjƒtƒBƒJ[ƒgA
+ ƒnƒCƒfƒBƒ“ƒOAƒNƒ[ƒLƒ“ƒOAŽ€‚ñ‚¾‚Ó‚èA‰ž‹}Žè“–
+
+ map.h
+ struct map_session_data ‚É inchealtick ƒƒ“ƒo’ljÁ
+ pc.c
+ pc_spheal()‚Ń}ƒOƒjƒtƒBƒJ[ƒgˆ—’ljÁ
+ pc_natual_heal_sub()‚ʼnñ•œŒüãƒXƒLƒ‹ˆ—’ljÁ
+ pc_authok()‚Åinchealtick‚ð‰Šú‰»‚·‚é‚悤‚É•ÏX
+ pc_walk()‚Åincheaktick‚ðÄÝ’è‚·‚é‚悤‚É•ÏX
+ pc_walk()‚ŃNƒ[ƒLƒ“ƒO‚ÌI—¹ðŒ‚𒲸‚·‚é‚悤‚É•ÏX
+ pc_walktoxy()‚Åó‘Ô‚É‚æ‚Á‚Ĉړ®•s‰Â”\‚É‚µ‚½
+ skill.c/skill.h
+ skill_status_change_start(),~timer(),~end()‚Ɉ—’ljÁ
+ skill_check_cloaking()’ljÁAƒNƒ[ƒLƒ“ƒO‚ÌI—¹ðŒ‚ðŒŸ¸
+ battle.c/battle.h
+ battle_stopattack()’ljÁ
+ battle_calc_weapon_attack()‚ÅUŒ‚‚ðŽ~‚߂鈗’ljÁ
+ mob.c
+ mob_ai_sub_hard()‚ÅUŒ‚‚ðŽ~‚߂鈗’ljÁ
+
+E’ÊíUŒ‚ˆ—A‘ÎMOBA‘ÎPC‚ð‹¤—p‚ÉB
+ pc.c
+ pc_attack_mob(),pc_attack_pc()íœ
+ pc_attack()‚ÉUŒ‚ˆ—’ljÁ
+
+Eƒ‚ƒ“ƒXƒ^[‚Ìs“®‚̈ꕔŽÀ‘•
+ ƒAƒNƒeƒBƒ”A–³”½‰žAˆÚ“®‚µ‚È‚¢A‰“‹——£UŒ‚ˆê•”
+
+ mob.c
+ mob_ai_sub_hard()‚És“®’ljÁ
+ mob_ai_sub_hard_activesearch()’ljÁA‹ß‚­‚ÌPC‚Ö‚Ìô“G
+
+EƒI[ƒo[ƒgƒ‰ƒXƒg‚Ì‘‰Á”{—¦‚ª100”{‚É‚È‚Á‚Ä‚¢‚éƒoƒO‚ªC³‚³‚ê‚Ü‚µ‚½
+ battle.c
+ battle_calc_weapon_attack()‚ÅAŠY“–ŒÂŠ‚ðC³
+
+
+----------
+//0226 by ŒÓ’±—–
+
+‚â‚Á‚Ï‚èƒeƒXƒg‚Í‚ ‚ñ‚܂肵‚Ä‚¢‚Ü‚¹‚ñ
+
+Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ ‘¬“x‘‰ÁAƒGƒ“ƒWƒFƒ‰ƒXAƒLƒ…ƒA[
+ ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒXAƒTƒtƒ‰ƒMƒEƒ€AƒŠƒJƒoƒŠ[AƒOƒƒŠƒA
+ ‚Ó‚­‚낤‚Ì–ÚAƒƒV‚Ì–ÚAW’†—ÍŒüãA‰ñ”𗦌üãA‰ð“Å
+ ŠŽ—Ê‘‰ÁAƒ‰ƒEƒhƒ{ƒCƒXAƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…AƒI[ƒo[ƒgƒ‰ƒXƒg
+ ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“Aƒ}ƒLƒVƒ}ƒCƒYƒpƒ[A‚Q‚g‚p
+
+ (map/)
+ map.h
+ struct map_session_data‚Éwatk2,def2‚ȂǒljÁ
+ pc.c
+ pc_calcstatus()‚ɃXƒLƒ‹C³’ljÁ
+ atk2‚È‚Ç‚à‘—M‚·‚é‚悤‚É•ÏX
+ battle.c/battle.h
+ battle_get_def2()‚È‚Ç‘½”’ljÁ
+ battle_calc_weapon_damage()‚Å“GŒ¸ŽZ–hŒä‚ÌŠ“¾‚ð
+ battle_get_def2()‚É•ÏX
+ battle_calc_magic_damage()‚Å“GŒ¸ŽZ–‚–@–hŒä‚ÌŠ“¾‚ð
+ battle_get_mdef2()‚É•ÏX
+ battle_calc_weapon_damage()‚ŃXƒLƒ‹C³‚ð’ljÁ
+ skill.c/skill.h
+ skill_use_nodamage_id()‚ÌŠY“–ŒÂŠ’ljÁ
+ skill_status_change_start()‚ÌŠY“–ŒÂŠ’ljÁ
+ clif.c
+ clif_updatestatus()‚Ìatk2‚Ȃǂ̈—’ljÁ
+ clif_initialstatus()‚Åatk2‚Ȃǂ̈µ‚¢•ÏXAaspd‚È‚Ç‘—M’ljÁ
+
+E¸˜Bƒ_ƒ[ƒWC³/¸˜B–hŒäC³‚ª“K—p‚³‚ê‚Ü‚µ‚½
+ (map/)
+ pc.c
+ pc_calcstatus()‚Åwatk2‚Ædef‚̒ljÁŒvŽZ’ljÁ
+ battle.c
+ battle_calc_weapon_damage()‚Åwatk2‚ðƒ_ƒ[ƒW‚ɒljÁ
+
+EinterŽI‚̃pƒPƒbƒg‰ðÍ•”‚Ì’v–½“I‚È–â‘肪C³‚³‚ê‚Ü‚µ‚½
+ TCP/IPƒvƒƒOƒ‰ƒ€‚Å‚â‚Á‚Ä‚Í‚¢‚¯‚È‚¢‚±‚Æ‚ð‚»‚Ì‚Ü‚Ü‚â‚Á‚Ä‚Ü‚µ‚½(Š¾
+ interŽI‚̃pƒPƒbƒg’·ƒf[ƒ^‚ðinter.c‚ÉŽ‚‚悤‚ÉC³‚³‚ê‚Ü‚µ‚½B
+
+ (char/)
+ inter.c/inter.h
+ ƒpƒPƒbƒg’·ƒf[ƒ^ inter_*_packet_length[] ‚ð’ljÁ
+ ƒpƒPƒbƒg’·ƒ`ƒFƒbƒN inter_check_length() ‚ð’ljÁ
+ mapif_parse_*()‚ÅRFIFOSKIP‚ð‚È‚µ‚É•ÏX
+ int_storage.c/int_storage.h
+ mapif_parse_*()‚ÅRFIFOSKIP‚ð‚È‚µ‚É•ÏX
+ int_party.c/int_guild.c
+ Žd—l•ÏX‚ɑΉž‚³‚¹‚½•ÏX
+ INTERŽIƒpƒPƒbƒg.txt
+ ƒpƒPƒbƒg’·ƒŠƒXƒg’ljÁ
+
+E‚¿‚å‚Á‚Æ‚µ‚½C³
+ (char/)
+ inter.h
+ inter_cfgName‚ð"conf/inter_athena.cnf"‚ÉC³
+ char2.c
+ char.exe‘æ‚Qˆø”È—ªŽžAinter_cfgName‚ðŽg‚¤‚悤‚ÉC³
+ (db/)
+ cast_db.txt
+ ƒz[ƒŠ[ƒ‰ƒCƒg‚̉r¥ŽžŠÔ’ljÁiƒfƒBƒŒƒC‚Í“K“–j
+ Ú‚µ‚¢l’ljÁ‹‚Þ
+
+----------
+//0225 by ŒÓ’±—–
+
+‚È‚ñ‚©‚©‚È‚è˜M‚è‚Ü‚µ‚½‚ª‘Š•Ï‚í‚炸ƒeƒXƒg‚Í‚ ‚ñ‚܂肵‚Ä‚Ü‚¹‚ñB
+
+EƒXƒLƒ‹Žg—pŽž‚Ì•Ï”‚ð•ÏX
+ ‚æ‚­Œ©‚½‚çʼn‚©‚ç—pˆÓ‚³‚ê‚Ä‚Ü‚µ‚½‚ËB
+
+ map.h
+ struct map_session_data‚Ìcast_*‚ðíœ
+ skill.c
+ cast_*‚Ì•Ï”‚ðskill*‚É•ÏXB
+
+EƒXƒe[ƒ^ƒXˆÙíƒXƒLƒ‹‚̈—‚ð’ljÁiŒø‰Ê‚Í–¢ŽÀ‘•j
+ Œ©‚©‚¯ãAƒXƒe[ƒ^ƒXˆÙí‚ÉŠ|‚©‚Á‚½‚è‚Æ‚©‚¾‚¯B
+ Œø‰Ê‚Í‚Ü‚¾‚È‚µB
+
+ skill.c/skill.h
+ skill_status_change_start(),~end(),~timer(),~clear()’ljÁB
+ ‚»‚ꂼ‚êƒXƒe[ƒ^ƒXˆÙí‚ÌŠJŽnAI—¹Aƒ^ƒCƒ}ˆ—A‘SÁ‹ŽB
+ map.c/map.h
+ map_quit()‚Åskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
+ struct map_session_data‚Ésc_data,sc_count’ljÁB
+ struct mob_data‚Ésc_data,sc_count,option,opt1,opt2’ljÁB
+ pc.c
+ pc_authok()‚Åsc_data,sc_count‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½B
+ pc_setoption‚Åclif_changeoption()‚̈ø”•ÏXB
+ pc_damage()‚ÅŽ€–SŽž‚Éskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
+ mob.c
+ mob_spawn()‚Åsc_data,sc_count‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½B
+ mob_attack()‚Åbattle_calc_damage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
+ mob_damage()‚ÅŽ€–SŽž‚Éskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
+ battle.c/battle.h
+ battle_get_*()‚½‚­‚³‚ñ’ljÁB
+ battle_calc_damage()’ljÁBÅI“I‚ȃ_ƒ[ƒWŒvŽZ—pB
+ battle_calc_magic_attack(),battle_calc_weapon_attack()‚Å
+ battle_calc_damage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½B
+ clif.h/clif.c
+ clif_status_change()’ljÁBƒXƒe[ƒ^ƒXˆÙíƒAƒCƒRƒ“•\Ž¦—pB
+ clif_changeoption()‚̈ø”•ÏXB
+ atcommand.c
+ clif_changeoption()‚ðŒÄ‚ñ‚Å‚¢‚é‚Qƒ–Š‚ňø”•ÏXB
+ @die‚Åskill_status_change_clear()‚ðŒÄ‚Ԃ悤‚ÉB
+
+Eƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€‚ÌK“¾ðŒ‚ªŠÔˆá‚Á‚Ä‚¢‚é‚Ì‚ðC³B
+ db/skill_tree.txt
+ ŠY“–ŒÂŠC³BiƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi‚Ì•K—vLv‚ð‚P‚Éj
+
+EƒAƒNƒeƒBƒu‚È“G‚ÍUŒ‚‚·‚é‚Æ‚«ŽžXƒ^[ƒQƒbƒg‚ª•Ï‚í‚é‚悤‚É‚È‚è‚Ü‚µ‚½
+ mob.c
+ mob_ai_sub_hard()‚ÌUŒ‚‚³‚ꂽ‚©Šm”F‚·‚é•”•ª‚É
+ ƒAƒNƒeƒBƒu‚È‚ç25%‚ÌŠm—¦‚Ń^[ƒQƒbƒg‚ª•Ï‚í‚é‚悤‚É•ÏXB
+
+Eˆê•”‚̃XƒLƒ‹Œø‰Ê‚ªŽÀ‘•‚³‚ê‚Ü‚µ‚½
+ ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“AƒGƒiƒW[ƒR[ƒgAƒŒƒbƒNƒXƒG[ƒeƒ‹ƒiA
+ ƒz[ƒŠ[ƒ‰ƒCƒgAƒŠƒUƒŒƒNƒVƒ‡ƒ“Aƒ^[ƒ“ƒAƒ“ƒfƒbƒhAƒ‚ƒ“ƒXƒ^[î•ñ
+
+ skill.c/skill.h
+ skill_castend_nodamage_id()‚ɃXƒLƒ‹‚̈—‚ð’ljÁB
+ skill_castend_*_id()‚̈ø”‚ð•ÏX
+ battle.c
+ battle_calc_damage()‚ɃXƒLƒ‹‚̈—‚ð’ljÁB
+ battle_damage(),battle_heal()‚̈ø”•ÏX
+ battle_calc_weapon_damage(),battle_calc_magic_damage()ˆø”•ÏX
+ clif.c/clif.h
+ clif_skill_estimation()’ljÁBƒ‚ƒ“ƒXƒ^[î•ñ‘—M—p
+ pc.c
+ battle_calc_weapon_damage()ŒÄ‚Ño‚µ‚̈ø”•ÏX
+
+Estorage.txt‚ª–³‚¢ê‡interŽI‚ª‹­§I—¹‚·‚éŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½
+ (char/)
+ int_storage.c
+ inter_storage_init()‚Ńtƒ@ƒCƒ‹‚ª“Ç‚ß‚È‚¢‚Æexit‚µ‚Ä‚½‚Ì‚ðC³
+
+
+----------
+//0224
+E2-2ŽŸE‚̃XƒLƒ‹‚ðƒcƒŠ[‚ɒljÁ‚µ‚Ü‚µ‚½iŽÀ‘•‚Í‚Ü‚¾‚Å‚·j
+ (db/)
+ skill_db.txt
+ skill_tree.txt
+
+
+----------
+//0223 by ŒÓ’±—–
+EƒJƒvƒ‰‘qŒÉ‚ðinterŽI‚ɑΉž‚³‚¹‚Ü‚µ‚½
+ ‚¢‚Ü‚Ü‚Å‚Ìstorage.txt‚Í‚»‚Ì‚Ü‚ÜŽg‚¦‚Ü‚·B
+ interŽI—p‚ÌÝ’èƒtƒ@ƒCƒ‹‚Æ‚µ‚Äconf/inter_athena.cnf‚ðŽg‚¢‚Ü‚·B
+ iÝ’èƒtƒ@ƒCƒ‹‚Íchar.exe‚Ì‘æ‚Qˆø”‚Å‘¼‚̃tƒ@ƒCƒ‹‚ðŽw’è‚Å‚«‚Ü‚·j
+
+ ƒJƒvƒ‰‘qŒÉ‚ÌinterŽIŽÀ‘•‚ÌŠT—v
+
+ interŽI‚Ístorage.txt‚Ì‘Sƒf[ƒ^‚ðŽ‚ÂBmapŽI‚̓AƒJƒEƒ“ƒg‚ª—v‹‚·‚é‚Ü‚Å
+ ‚»‚̃AƒJƒEƒ“ƒg‚Ì‘qŒÉƒf[ƒ^‚ðŽ‚½‚È‚¢BƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‘qŒÉ‚ðŠJ‚­—v‹‚ª
+ ‚ ‚Á‚½‚Æ‚«AmapŽI‚͑Ήž‚·‚éƒAƒJƒEƒ“ƒg‚Ì‘qŒÉƒf[ƒ^‚ðinterŽI‚É—v‹‚·‚éB
+ interŽI‚©‚çƒf[ƒ^‚ª“Í‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚É‘qŒÉƒf[ƒ^‚ð‘—‚éB
+ ‘qŒÉ‚Ìo‚µ“ü‚ê‚̓Nƒ‰ƒCƒAƒ“ƒg‚ÆmapŽIŠÔ‚Ì’ÊM‚¾‚¯‚Ås‚í‚ê‚éB
+ ƒNƒ‰ƒCƒAƒ“ƒg‚ª‘qŒÉ‚ð•Â‚¶‚é‚©I—¹‚·‚é‚ÆAmapŽI‚ÍŠY“–ƒAƒJƒEƒ“ƒg‚Ì
+ ‘qŒÉƒf[ƒ^‚ðinterŽI‚É‘—‚éB‚±‚Ì‚Æ‚«interŽI‚̉ž“š‚ð‘Ò‚½‚¸‚ɃNƒ‰ƒCƒAƒ“ƒg‚É
+ ‘qŒÉƒNƒ[ƒY‚ð‘—‚éBinterŽI‚Í‘qŒÉƒf[ƒ^‚ðŽó‚¯Žæ‚é‚ÆA
+ ‘Sˆõ•ª‚̃f[ƒ^‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚ÄAmapŽI‚ɬŒ÷ƒXƒe[ƒ^ƒX‚ð•Ô‚·B
+ mapŽI‚ͬŒ÷ƒXƒe[ƒ^ƒX‚𖳎‹‚·‚éB(ƒfƒoƒbƒO—p‚ɉæ–Ê‚Éo—Í‚·‚邾‚¯)
+ interŽII—¹Žž‚É‚à‘qŒÉƒf[ƒ^‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚éB
+
+ mapŽI‚Åaccount2storage‚ÅV‚µ‚¢‘qŒÉƒf[ƒ^‚ðì‚é‚Æ‚«A
+ ‚·‚łɕ‚¶‚ç‚ê‚Ä‚¢‚é‘qŒÉƒf[ƒ^‚̃ƒ‚ƒŠ‚ðŽg‚¢‚܂킵‚½‚Ù‚¤‚ªƒƒ‚ƒŠ‚ª
+ ß–ñ‚Å‚«‚é‚©‚àHi‚±‚ê‚ÍŽÀ‘•‚µ‚Ä‚¢‚Ü‚¹‚ñj
+
+ (common/)
+ mmo.h
+ struct storage ‚ð map/storage.h ‚©‚çˆÚ“®B
+ interŽI‚ÆmapŽI—¼•û‚ÅŽg—p‚·‚邽‚ßB
+ (char/)
+ char2.c
+ do_final()‚ðì¬AI—¹Žž‚Émmo_char_sync()ˆÈŠO‚Éinter_save()‚ð
+ ŒÄ‚Ԃ悤‚É‚µ‚½i‚±‚ê‚Åinter_*_save()‚Í‘S•”ŒÄ‚΂ê‚Ü‚·j
+ inter_init()‚ðchar.exe‚Ì‘æ‚Qˆø”‚à‚µ‚­‚Í"conf/inter.cnf"‚Å
+ ŒÄ‚Ԃ悤‚É‚µ‚½iathena.sh‚ÉinterŽIƒRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹‚ðŽw’è‚Å‚«‚Ü‚·j
+ inter.c/inter.h
+ inter_storage_init(),inter_storage_save(),
+ inter_storage_parse_frommap()‚ðŒÄ‚Ԃ悤‚ÉB
+ inter_init()‚ɃRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹–¼‚̈ø”‚ð•t‚¯‚½B
+ inter_config_read()’ljÁAƒRƒ“ƒtƒBƒOƒtƒ@ƒCƒ‹‚©‚ç
+ ‘qŒÉ‚ƃp[ƒeƒB[AƒMƒ‹ƒh‚̃tƒ@ƒCƒ‹–¼‚ð“Ç‚Ýž‚Ý‚Ü‚·B
+ int_storage.c/int_storage.h
+ V‹K’ljÁB‘qŒÉ•”•ª‚ÌinterŽI‹@”\B
+ int_party.h/int_party.c/int_guild.h/int_guild.c/
+ ƒtƒ@ƒCƒ‹–¼•Ï”‚Ì錾’ljÁ
+ INTERŽIƒpƒPƒbƒg.txt
+ ‘qŒÉƒpƒPƒbƒg‚̉ðà’ljÁ
+
+ (map/)
+ storage.h/storage.c
+ storage_fromstr(),storage_tostr()‚ðchar/int_storage.c‚Ɉړ®B
+ “¯‚¶‚­do_init,do_final‚ł̃tƒ@ƒCƒ‹ˆ—‚àˆÚ“®B
+ do_final()‚͈—‚È‚µAdo_init()‚Í•Ï”‰Šú‰»‚Ì‚Ý‚É•ÏXB
+ storage_storageopen()‚Å‚Í’P‚Éintif_request_storage()‚ðŒÄ‚Ô‚¾‚¯‚ÉB
+ storage_storageclose()‚Éintif_send_storage()‚ð’ljÁ
+ storage_storage_quitsave()’ljÁBƒNƒ‰ƒCƒAƒ“ƒgI—¹Žž‚É
+ ƒJƒvƒ‰‘qŒÉ‚ªŠJ‚¢‚Ä‚¢‚ê‚Îintif_send_storage()‚ðŒÄ‚ÔŠÖ”B
+ intif.h/intif.c
+ intif_parse_LoadStorage(),intif_parse_SaveStorage(),
+ intif_send_storage(),intif_request_storage()’ljÁ
+ map.c
+ map_quit()‚Åstorage_storage_quitsave()‚ðŒÄ‚Ԃ悤‚ÉB
+
+ (conf/)
+ inter_athena.cnf
+ V‹K’ljÁBinterŽI—p‚̃Rƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹
+
+
+----------
+//0221 by ŒÓ’±—–
+
+EƒXƒLƒ‹ƒ^[ƒQƒbƒg‚ÌID‚ª³‚µ‚­Š“¾‚Å‚«‚È‚¢–â‘èC³
+ clif.c
+ clif_parse_UseSkillToId()‚ÅID‚ðWORD‚Æ‚µ‚Ĉµ‚Á‚Ä‚½‚Ì‚ðLONG‚ÉC³
+
+EƒXƒLƒ‹‰r¥ŽžŠÔ‚Æ‘®«•\A‚¨‚æ‚Ñ–‚–@ŒnƒXƒLƒ‹‚Ì‘®«C³ŽÀ‘•
+ ‘®«ƒ_ƒ[ƒWC³‚Í battle_attr_fix() ‚ÅŒvŽZ‚µ‚Ü‚·B
+ atk_elem‚Í‘®«‚»‚Ì‚Ü‚ÜAdef_elem‚Íi‘®«lv*20{‘®«j‚Å‚·B
+ ‰r¥ŽžŠÔ‚Ískill.c‚ÌCASTFIX‚Ì’l‚ð•Ï‚¦‚邱‚Æ‚Å”{—¦‚ð’²®‚Å‚«‚Ü‚·
+
+ pc.c
+ pc_readdb()‚Åcast_db.txt‚Æattr_fix.txt‚Ì“Ç‚Ýž‚ݒljÁ
+ skill.c/skill.h
+ struct skill_db ‚Écast,delay’ljÁA‚»‚ê‚ç‚̃AƒNƒZƒT‚à’ljÁ
+ ƒXƒLƒ‹‰r¥ŽžŠÔ‚ð skill_get_cast() ‚ÅŠ“¾‚·‚é‚悤‚É‚µ‚½
+ battle.c/battle.h
+ attr_fix_table’è‹`
+ battle_attr_fix()’ljÁA‘®«C³‚ðŒvŽZ‚·‚é
+ ‘®«ŒnƒAƒNƒZƒT(battle_get_element()‚È‚Ç)‚ð’ljÁ
+ battle_calc_magic_damage()‚É‘®«C³‚ð’ljÁ
+ cast_db.txt
+ V‹K’ljÁB‰r¥ŽžŠÔ‚ƃfƒBƒŒƒC‚̃f[ƒ^ƒx[ƒX
+ ‘S‘R‘«‚è‚È‚¢‚Ì‚ÅA’N‚©’ljÁŠó–]B
+ attr_fix.txt
+ V‹K’ljÁB‘®«C³ƒe[ƒuƒ‹
+
+Eƒq[ƒ‹‚ÌŽÀ‘•
+ clif.c/clif.h
+ clif_skill_nodamage()’ljÁAŽx‰‡Œn‚â‰ñ•œ‚̃GƒtƒFƒNƒg
+ skill.c/skill.h
+ skill_castend_damage_id()Askill_castend_nodamage_id()’ljÁA
+ UŒ‚Œn‚ÆŽx‰‡/‰ñ•œŒn‚ÅŠÖ”‚𕪂¯‚½
+ ƒq[ƒ‹ŒvŽZƒ}ƒNƒ skill_calc_heal() ’ljÁ
+ battle.c
+ battle_calc_magic_damage()‚Ńq[ƒ‹‚̃_ƒ[ƒWŒvŽZ’ljÁ
+
+
+----------
+//0220 by ‚ê‚ 
+
+0216‚ÌC³
+HIT‚ÌŒvŽZ‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ÅC³‚µ‚Ä‚Ý‚Ü‚µ‚½B
+ŠÔˆá‚Á‚Ä‚½‚炲‚ß‚ñ‚È‚³‚¢B
+
+Ebattle.c
+ 256s–Ú‚Ì
+ hitrate=battle_get_hit(&sd->bl) - battle_get_flee(&sd->bl) + 80;
+ ‚ª‚½‚Ô‚ñAŽ©•ª‚Ì‚g‚h‚s‚ÆŽ©•ª‚Ì‚e‚k‚d‚d‚ÅŒvŽZ‚µ‚Ä‚é‹C‚ª‚·‚é‚Ì‚Å
+ hitrate=battle_get_hit(&sd->bl) - battle_get_flee(target) + 80;
+ ‚ÉC³‚µ‚Ü‚µ‚½B
+
+
+----------
+//0218 by ŒÓ’±—–
+
+ŽÀÛ‚É•ªŽU‚³‚¹‚ăeƒXƒg‚µ‚Ä‚¢‚È‚©‚Á‚½‚èB
+
+EmapŽI•ªŽUˆ——p‚ÉinterŽI‹@”\‚ð‚‚¯‚Ä‚Ý‚éi¡Œã‚Ì‚½‚ß‚ÌŠg’£j
+ charŽI‚ÉinterŽI‚ðŠñ¶‚³‚¹‚Ü‚µ‚½B•¡”‚ÌmapŽIŠÔ‚Ì’ÊM‚É—˜—p‚µ‚Ü‚·B
+ mapŽI‚𕪎U‚µ‚Ĉ—‚Å‚«‚é‚悤‚É‚·‚邽‚ß‚Ì‹@”\‚Å‚·B
+ ¡Œãparty‚âguildŽÀ‘•Žž‚É‚«‚Á‚Æ–ð‚É‚½‚Á‚Ä‚­‚ê‚é‚©‚ÆB
+
+ ‘qŒÉ‚ÌŽÀ‘•‚àinterŽI‚Ɉړ®‚·‚ׂ«‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ ‚ǂ̃Lƒƒƒ‰ƒNƒ^[‚ª‚Ç‚ÌmapŽI‚É‚¢‚é‚©ŒŸõ‚·‚é‹@”\‚à‚¢‚é‚©‚àB
+
+ Žg‚¤ƒpƒPƒbƒg‚ÌID‚͈ȉº‚̂悤‚É‚È‚è‚Ü‚·
+ mapŽI=>interŽI‚̓pƒPƒbƒg0x3000`
+ interŽI=>mapŽI‚̓pƒPƒbƒg0x3800`
+ ƒpƒPƒbƒg‚ðì‚Á‚½ê‡‚ÍAINTERŽIƒpƒPƒbƒg.txt‚É‘‚¢‚Ä‚­‚¾‚³‚¢
+
+ ‚±‚Ì‹@”\‚É‚æ‚郃Šƒbƒg
+ mapŽI•ªŽU‚É‚à‘Ήž‚Å‚«‚é
+ ‚±‚Ì‹@”\‚É‚æ‚éƒfƒƒŠƒbƒg
+ interŽIŒo—R‚Ì‘S‚Ä‚Ì–½—ß‚Ì“®ì‘¬“x‚ª—Ž‚¿‚é
+ iˆê‰ñinterŽI‚Ü‚Å“n‚·‚½‚ßj
+ ŽI‚ƃNƒ‰ƒCƒAƒ“ƒg‚𓯂¶PC‚ÅŽg‚Á‚Ä‚¢‚é‚Ƃ‚炢‚©‚à
+
+ (char/)
+ char2.c/char.h
+ mapif_sendall()’ljÁi‘SMAPŽI‚ɃpƒPƒbƒg‚ð‘—‚éj
+ mapif_send()’ljÁi“Á’èMAPŽI‚É‘—‚éF¶‘¶”»’è•t‚«j
+ parse_frommap()‚Åinter_parse_frommap()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
+ (interŽI‚ÌmapŽI‰ðÍ•”‚ðcharŽI‚ÉŠñ¶‚³‚¹‚½‚±‚Æ‚É‚È‚é)
+ inter.h/inter.c
+ V‹K’ljÁBinterŽI‚Ì’†ŠjB
+ inter_parse_frommap‚ÅMAPŽI‚©‚ç‚̃pƒPƒbƒg‚ð‰ðÍ‚µ‚Ü‚·B
+ int_party.h/int_party.c/int_guild.h/int_guild.c
+ V‹K’ljÁB¡Œã‚Ì‚½‚ß‚Ì—\–ñBƒp[ƒeƒB‚âƒMƒ‹ƒh‹@”\—p
+ init‚Ńf[ƒ^‚ð“Ç‚ñ‚ÅAsave‚Å•Û‘¶‚·‚ׂ«H
+ save‚Í‚Ü‚¾ŒÄ‚΂ê‚È‚¢Bparse‚ŃpƒPƒbƒg‰ðÍB
+ common/mmo.h‚ ‚½‚è‚Ńp[ƒeƒB[‚âƒMƒ‹ƒh‚Ì\‘¢‘Ì‚ð
+ ’è‹`‚·‚é•K—v‚ª‚ ‚é‚ÆŽv‚í‚ê‚éB
+ INTERŽIƒpƒPƒbƒg.txt
+ ƒpƒPƒbƒg‚̃ŠƒXƒg
+
+ (map/)
+ intif.h/intif.c
+ interŽI‚Æ’ÊM‚·‚é•”•ªB
+ inter_parse()‚ÅinterŽI‚©‚ç‚̃pƒPƒbƒg‚ð‰ðÍ‚µ‚Ü‚·B
+ interŽI‚Öƒf[ƒ^‚ð‘—‚é‚Æ‚«‚Íinter_fd‚ðŽg‚¢‚Ü‚·B
+ chrif.h/chrif.c
+ chrif_parse()‚Åinter_parse()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
+ iintif.c‚ÌinterŽI‰ðÍ•”‚ðcharŽI‰ðÍ•”‚ÉŠñ¶‚³‚¹‚½‚±‚Æ‚É‚È‚é)
+
+E@kamiƒRƒ}ƒ“ƒh‚ðinterŽIŒo—R‚É•ÏX
+ Œ´—‚Æ‚µ‚Ä‚ÍŽŸ‚̂悤‚ÈŠ´‚¶‚Å‚·
+ ƒNƒ‰ƒCƒAƒ“ƒg„mapŽI„interŽI„‘SmapŽI„‘SƒNƒ‰ƒCƒAƒ“ƒg
+
+ (char/)
+ inter.c
+ mapif_GMmessage()’ljÁ
+ (map/)
+ intif.h/intif.c
+ intif_GMmessage()’ljÁ
+ intif_parse‚ÅGMƒƒbƒZ[ƒW‚̈—‚ð’ljÁ
+ clif.c/clif.h
+ clif_GMmessage()‚̈ø”‚ð•ÏX
+ atcommand.c
+ @kami•”•ª‚Åintif_GMmessage()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
+
+EWis‚ðinterŽIŒo—R‚É•ÏX
+ Œ´—‚Æ‚µ‚Ä‚ÍŽŸ‚̂悤‚ÈŠ´‚¶‚Å‚·
+
+ ‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg„‘—‚èŽåmapŽI„interŽI„‘Sƒ}ƒbƒvŽI„(•ªŠòA)
+ [•ªŠòA]
+ 1.‘ŠŽè‚Ìl‚¢‚émapŽI„‘ŠŽè‚̃Nƒ‰ƒCƒAƒ“ƒg
+ @@@@V@@ @„interŽI„‘—‚èŽåmapŽI„‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg
+ 2.‘ŠŽè‚Ì‚¢‚È‚¢mapŽI„interŽIi•ªŠòBj
+ [•ªŠòB]
+ 1.‘SmapŽI‚ª‰ž“š‚µ‚½interŽI „‘—‚èŽåmapŽI„‘—‚èŽåƒNƒ‰ƒCƒAƒ“ƒg
+ 2.(‘S•”‚͉ž“š‚µ‚Ä‚È‚¢‚Æ‚«‚ÍA‘SmapŽI‚̉ž“š‚ð‘Ò‚Â)
+
+ ‚à‚Ì‚·‚²‚¢•¡ŽG‚É‚È‚Á‚Ä‚Ü‚·‚ËB
+
+ (char/)
+ inter.c
+ struct WisList ’è‹`iWisƒf[ƒ^‚̃Šƒ“ƒNƒŠƒXƒgj
+ add_wislist(),del_wislist(),search_wislist(),
+ check_ttl_wislist()’ljÁ,ƒŠƒ“ƒNƒŠƒXƒg‚ðˆµ‚¤ŠÖ”ŒQ
+ mapif_wis_message(),mapif_wis_end()’ljÁ
+ (map/)
+ intif.h/intif.c
+ intif_wis_message(),intif_wis_end()’ljÁ
+ intif_parse_WisMessage()’ljÁ,intif_parse()‚©‚çŒÄ‚΂ê‚é‚悤‚É
+ clif.c/clif.h
+ clif_wis_message(),clif_wis_end()’ljÁ
+ clif_parse_Wis()‚ð•ÏX,intif_wis_message()‚ðŒÄ‚Ԃ悤‚É‚µ‚½
+
+EƒXƒLƒ‹Žg—pŽž‚̃qƒbƒg”/Á”ïSPŠ“¾‚̃oƒOC³
+ skill.c
+ skill_get_sp(),skill_get_num()‚ÅŽQÆ‚·‚é”z—ñƒCƒ“ƒfƒbƒNƒX‚ðlv-1‚É‚µ‚½
+
+
+----------
+//0216 by ŒÓ’±—–
+
+‚¢‚‚à‚Ç‚¨‚èƒeƒXƒg‚Ù‚Æ‚ñ‚Ç‚µ‚Ä‚È‚¢‚Ì‚ÅAƒoƒO‘å—Ê‚©‚àB
+
+E0213‚ÌC³H‚Ì‚æ‚­‚í‚©‚ç‚È‚¢‚Æ‚±‚ëC³
+ itemdb.c
+ ƒRƒ“ƒpƒCƒ‹‚ª’Ê‚ç‚È‚¢‚Ì‚Åitemdb_equipoint‚̈ø”ƒŠƒXƒg•ÏX
+
+EAthena dev 2.1.1‚Ì“K—p
+ dev-2.1.1‚Å“K—p‚³‚ꂽC³‚ð“K—p‚µ‚Ü‚µ‚½
+
+ timer.c
+ 2.1.1‚Ì‚à‚Ì‚Æ·‚µ‘Ö‚¦
+ script.c
+ C_NE: ‚ÌC³‚Ì“K—p
+ README
+ ÅŒã‚Ì•¶Í‚ð2.1.1‚Ì‚à‚Ì‚É·‚µ‘Ö‚¦
+
+EƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ÌC³
+ ˆê•”‚ÌÁ”ïSP‚âƒqƒbƒg”‚È‚Ç‚ðC³B
+
+ skill_db.txt
+ ŠY“–ŒÂŠ‚ÌC³
+
+EƒXƒLƒ‹UŒ‚‚ÌŽÀ‘••ÏX•’ljÁŽÀ‘•
+ ƒoƒbƒVƒ…Aƒƒ}[ƒiƒCƒgAƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒOAƒsƒA[ƒX
+ ƒXƒsƒAƒu[ƒƒ‰ƒ“AƒXƒsƒAƒXƒ^ƒuAƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…
+ ƒ\ƒjƒbƒNƒuƒ[AƒOƒŠƒ€ƒgƒD[ƒX ‚È‚Ç‚ÌŽÀ‘••ÏX
+
+ ƒiƒp[ƒ€ƒr[ƒgAƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒNA
+ ƒtƒ@ƒCƒ„[ƒ{ƒ‹ƒgAƒR[ƒ‹ƒhƒ{ƒ‹ƒgAƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒgAƒA[ƒXƒXƒpƒCƒNA
+ ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[ ‚È‚Ç‚ð’ljÁŽÀ‘•
+ i‘S‚ÄA”͈ÍUŒ‚‚âƒXƒe[ƒ^ƒXˆÙí‚È‚Ç‚Í–¢ŽÀ‘•j
+
+ pc.c/pc.h
+ 0213‚Ì•ÏX‚ð‚È‚©‚Á‚½‚±‚Æ‚É‚µ‚½
+ pc_attack_mob()‚ÌC³AŒvŽZ‚Íbattle_calc_weapon_attack()‚É”C‚¹A
+ ‚»‚ÌŒvŽZŒ‹‰Ê‚ð“K—p‚·‚邾‚¯‚É•ÏX
+ clif.c/clif.h
+ clif_skill_fail(),clif_skill_damage(),clif_skill_damage2()’ljÁ
+ ‚»‚ꂼ‚êŽg—pŽ¸”sAŽg—pƒGƒtƒFƒNƒgA‚«”ò‚΂µ•t‚«Žg—pƒGƒtƒFƒNƒg
+ skill.c/skill.h
+ 0213‚Ì•ÏX‚ð‚È‚©‚Á‚½‚±‚Æ‚É‚µ‚½iƒ_ƒ[ƒW”{—¦ŒvŽZ‚ª‚¨‚©‚µ‚¢j
+ skill_castend_id()‚ÉSP/ZenyŠm”F‚ÆÁ”ï•”•ª‚ð’ljÁA
+ Ží—ޕʂɈ—‚ð’ljÁB
+ battle.c/battle.h
+ V‹K’ljÁ
+ •ŠíUŒ‚ŒvŽZ—p‚Ébattle_calc_weapon_attack(),
+ –‚–@UŒ‚ŒvŽZ—p‚Ébattle_calc_magic_attack()‚ð—pˆÓ
+ i‘o•û‚Æ‚àAMOB‚ÆPC—¼•ûŒvŽZ‰Â”\‚È‚Í‚¸j
+ ƒtƒ@ƒCƒ‹‘‚₵‚·‚¬‚Æ‚¢‚¤ˆÓŒ©‚àc(Š¾)
+
+
+----------
+//0214 by ‚ê‚ 
+Eƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª‚¨‚©‚µ‚©‚Á‚½‚Æ‚±‚ë‚ðC³B
+EƒXƒLƒ‹‚̈ꕔŽÀ‘•
+ ƒoƒbƒVƒ…Eƒƒ}[ƒiƒCƒgEƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒOEƒsƒA[ƒX
+ ƒXƒsƒAƒu[ƒƒ‰ƒ“EƒXƒsƒAƒXƒ^ƒuEƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…
+ ƒ\ƒjƒbƒNƒuƒ[EƒOƒŠƒ€ƒgƒD[ƒX‚È‚Ç‚Å‚·B
+
+ “K“–‚È‚Ì‚Å‚Ç‚±‚©A•s‹ï‡‚ª‚ ‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ ‚ ‚ÆAƒeƒXƒg‚à‚ ‚܂肵‚Ä‚Ü‚¹‚ñ‚Ì‚Å‚¨‚©‚µ‚¢‚Æ‚±‚낪‚ ‚Á‚½‚çC³‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ ‘¼‚É‚à–â‘肪‚ ‚Á‚½‚çŽè’¼‚µ‚ð‚¨Šè‚¢‚µ‚Ü‚·B
+ •ÏX“à—e‚͈ȉº‚Ì’Ê‚è‚Å‚·B
+
+ clif.c,clif.h
+ clif_skill_damage()‚ð’ljÁ‚µ‚Ü‚µ‚½B
+
+ pc.c,pc.h
+ pc_attack_mob()‚̈ø”‚ðˆê‚’ljÁB
+ ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª‚¨‚©‚µ‚©‚Á‚½‚̂ųí‚É“®ì‚·‚é‚悤‚ÉC³B
+
+ skill.c
+ ˆê•”ƒXƒLƒ‹‚ÌŽÀ‘•‚ð‚µ‚Ä‚Ý‚Ü‚µ‚½B
+
+
+----------
+//0213 by ‚ê‚ 
+E0208‚Ì—ƒRƒ}ƒ“ƒh‚Å­‚µC³
+ atcommand.c
+ @item‚Ō”Žw’肪–³‚¢ê‡A“üŽèŒÂ”‚ð‚PŒÂ‚É‚·‚é‚悤‚É‚µ‚½B
+ @item‚ÅID‚ÌŽw’肪–³‚¢ê‡AƒAƒCƒeƒ€‚ð“üŽè‚µ‚Ä‚½‚±‚Æ‚É‚È‚Á‚Ä
+ ‚¢‚½‚Ì‚ðC³
+ itemdb.c
+ item_db.txt‚ÅSell‚Ì€–Ú‚ð“X”„‚è‚Ì’l’i‚Æ‚µ‚Ä‚Ý‚½B
+ item_db2.txt
+ ŽŽ‚µ‚ɃJ[ƒh‚⃌ƒAƒAƒCƒeƒ€‚Ì“X”„‚艿Ši‚ð’l’i‚ð–{ŽI‚Ì‘Šê‚É‚µ
+ ‚Ä‚Ý‚½‚à‚ÌBŽg—p‚·‚éꇂÍitem_db.txt‚Æ·‚µ‘Ö‚¦‚Ä‚­‚¾‚³‚¢B
+
+
+----------
+//0208 by nabe
+
+E—ƒRƒ}ƒ“ƒhŽÀ‘•B
+ atcommand.h,atcommand.c
+ ‚Ù‚ÚI-Athena‚Ì—ƒRƒ}ƒ“ƒh‘Š“–‚Å‚·‚ªA@GM‚ÆPVP‚Í–¢ŽÀ‘•‚Å‚·B
+ help.txt‚à“¯«‚µ‚Ä‚¢‚Ü‚·B
+ GMiƒAƒJƒEƒ“ƒgID704554`704583jê—p‚É‚·‚é‚É‚ÍA
+ atcommand.c‚ÌŠY“–•”•ª‚̃Rƒƒ“ƒgƒAƒEƒg‚ð‰ðœ‚µ‚ĉº‚³‚¢B
+ clif.h,clif.c
+ clif_displaymessage()
+ clif_GMmessage()
+ clif_heal()
+ clif_resurrection()
+ clif_pvpon()
+ clif_pvpset()
+ clif_refine()
+ ‚ð’ljÁ‚µ‚Ü‚µ‚½B
+ clif_parse_GlobalMessage()“à‚Åatcommand()‚ðŒÄ‚ñ‚Å‚¢‚Ü‚·B
+
+E‚¿‚å‚Á‚Æ‚¾‚¯C³B
+ script.c
+ {buildin_openstorage,"openstorage","s"},
+ ‚©‚ç
+ {buildin_openstorage,"openstorage",""},
+ ‚ÉC³‚µ‚Ü‚µ‚½B
+
+
+----------
+//0206 by ŒÓ’±—–
+EƒXƒLƒ‹ƒcƒŠ[/ƒXƒLƒ‹Žg—p‹@\‚ÌŽÀ‘•
+ mmo.h
+ MAX_SKILL‚ð‘‚₵‚½
+ char2.c
+ mmo_char_fromstr()
+ mmo_charstatus‚Ìskill‚̃Cƒ“ƒfƒbƒNƒX‚ɃXƒLƒ‹”Ô†‚ðŽg‚¤‚悤‚É‚µ‚½
+ =>ƒXƒLƒ‹‚ÌŒŸõ‚‘¬‰»‚Ì‚½‚ßi‚©‚í‚è‚Ƀƒ‚ƒŠŽg—p—Ê‚ª‘‚¦‚éj
+ pc.h/pc.c
+ pc_skillup(),pc_calc_skilltree()’ljÁ
+ pc_checkskill()•ÏXiƒCƒ“ƒfƒbƒNƒX‚ðƒXƒLƒ‹”Ô†‚Éj
+ pc_readdb()‚Åskill_db.txt‚à“ǂނ悤‚É‚µ‚½
+ pc_authok()‚Åcast_timer‚ð‰Šú‰»‚·‚é‚悤‚É‚µ‚½
+ pc_calcstatus()‚Åpc_calc_skilltree()‚Æclif_skillinfoblock()‚ð
+ ŒÄ‚Ԃ悤‚É‚µ‚½
+ clif.c/clif.h
+ clif_skillinfoblock(),clif_skillcasting(),
+ clif_skillup()‚ð’ljÁ
+ clif_parse_SkillUp(),clif_parse_UseSkillToId(),
+ clif_parse_UseSkillToPos()‚ðŽÀ‘•
+ skill.h/skill.c
+ ƒtƒ@ƒCƒ‹’ljÁ(map/)
+ map.h
+ struct map_session_data‚Écast_*‚ð’ljÁ
+ skill_db.txt
+ ƒtƒ@ƒCƒ‹’ljÁ(db/)
+ (I-Athena0200‚Ìskill_info2.txt‚ðƒRƒ“ƒo[ƒg‚µ‚½‚à‚Ì)
+ (ƒXƒLƒ‹Žg—p•”•ªŠJ”­ŽÒŒü‚¯î•ñ)
+ ƒXƒLƒ‹‚ÌŒø‰Ê‚ðŽÀ‘•‚·‚éꊂÍskill.c‚Ì
+ skill_castend_id(),skill_castend_pos()‚Å‚·B
+ ƒ^[ƒQƒbƒg‚âŽg—pƒXƒLƒ‹‚Í sd->cast_* ‚©‚瓾‚Ü‚·
+ ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚Ö‚Í skill_get_* ‚ŃAƒNƒZƒX‚µ‚Ä‚­‚¾‚³‚¢
+ ¡ŒãAƒLƒƒƒXƒeƒBƒ“ƒOƒ^ƒCƒ€‚àƒf[ƒ^ƒx[ƒX‚É“ü‚ê‚é—\’è
+
+----------
+//0205 by nabe
+
+Estorage.c‚̃oƒOƒtƒBƒNƒXB
+E‘qŒÉƒf[ƒ^‚ðAƒ}ƒbƒvŽI‹N“®Žž‚É“Ç‚ÝAƒ}ƒbƒvŽII—¹Žž‚É‘‚­‚悤‚É•ÏXB
+ storage.h,storage.c
+ storage_init()‚ðdo_init_storage()‚ɉü–¼B
+ storage_save()‚ðdo_final_storage()‚ɉü–¼B
+ fclose‚ð–Y‚ê‚Ä‚¢‚½‚Ì‚ð’ljÁB
+ map.c
+ #include "storage.h"‚ð’ljÁB
+ do_final()‚Édo_final_storage()‚ð’ljÁB
+ do_init()‚Édo_init_storage()‚ð’ljÁB
+
+----------
+
+//0203(unofficial) by ‚È‚Ý
+
+item_db.txt‚Ì‘‚«Š·‚¦‚Ì‚Ý‚Å‚·B
+
+EƒAƒCƒeƒ€‚̉ñ•œ—Ê‚ð’ljÁ/•ÏX
+ Ôƒ|[ƒVƒ‡ƒ“@@@@@@@@@HP 30- 44
+ gƒ|[ƒVƒ‡ƒ“@@@@@@@@@HP 70- 89
+ ‰©F‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@HP 175-234
+ ”’‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@@HP 350-429
+ ‚¢ƒ|[ƒVƒ‡ƒ“@@@@@@@@SP 40- 99
+ Ô‚¢ƒn[ƒu@@@@@@@@@@HP 12- 19
+ ‰©F‚¢ƒn[ƒu@@@@@@@@@HP 21- 29
+ ”’‚¢ƒn[ƒu@@@@@@@@@@HP 80-111
+ ‚¢ƒn[ƒu@@@@@@@@@@SP 15- 44
+ ƒŠƒ“ƒS@@@@@@@@@@@@HP 12- 15
+ ƒoƒiƒi@@@@@@@@@@@@HP 11- 16
+ ƒuƒhƒE@@@@@@@@@@@@SP 10- 24
+ ‚¢‚à@@@@@@@@@@@@@HP 11- 15
+ ‚É‚­@@@@@@@@@@@@@HP 70- 99
+ ƒnƒ`‚Ì–¨@@@@@@@@@@@HP 72- 97 / SP 20- 59
+ ƒ~ƒ‹ƒN@@@@@@@@@@@@HP 25- 34
+ ƒLƒƒƒ“ƒfƒB@@@@@@@@@@HP 31- 74
+ ƒXƒeƒBƒbƒNƒLƒƒƒ“ƒfƒB@@@@@HP 46-109
+ ƒŠƒ“ƒSƒWƒ…[ƒX@@@@@@¦@HP 28- 32
+ ƒoƒiƒiƒWƒ…[ƒX@@@@@@@@HP 27- 33
+ ƒuƒhƒEƒWƒ…[ƒX@@@@@@@@SP 15- 39
+ ƒjƒ“ƒWƒ“ƒWƒ…[ƒX@@@@@¦@HP 29- 32
+ ƒJƒ{ƒ`ƒƒ@@@@@@@@@@@HP 14
+ ƒyƒbƒgƒt[ƒh@@@@@@@@@HP 53- 83
+ ‚æ‚­Ä‚¢‚½ƒNƒbƒL[@@@@@@HP 80-177
+ ‚ЂƂ­‚¿ƒP[ƒL[@@@@@@@HP 251-359
+ ‚ЂȂ ‚ç‚ê@@@@@@@@@@HP 175-234
+ •H–Ý@@@@@@@@@@@@@HP 350-429
+ ƒŒƒbƒhƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@@¦@HP 30- 44
+ ƒCƒGƒƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@@¦@HP 175-234
+ ƒzƒƒCƒgƒXƒŠƒ€ƒ|[ƒVƒ‡ƒ“@¦@HP 350-429
+@Œ»Ý‚ÌAthena‚Å‚ÍVIT‚âƒXƒLƒ‹‚É‚æ‚éƒ{[ƒiƒX‚͉Á–¡‚³‚ê‚Ü‚¹‚ñB
+@i“K—p‚·‚éꇂÍscript.c“à‚Ìbuildin_healŠÖ”‚ ‚½‚è‚É‚ÉŽè‚ð‰Á‚¦‚é•K—v‚ ‚èj
+@‚È‚¨A¦•t‚̃AƒCƒeƒ€‚̃f[ƒ^‚Í“K“–‚Å‚·B
+EŒÃ‚¢ƒJ[ƒh’Ÿ‚ðŽÀ‘•(UseScript)
+E‚»‚Ì‘¼C³
+@@‚ЂȂ ‚ç‚ê@@@@@@@@@@d—Ê‚È‚µ¨d—Ê0.1‚ÉC³
+@@•H–Ý@@@@@@@@@@@@@d—Ê‚È‚µ¨d—Ê0.1‚ÉC³
+@@ƒoƒ‹ƒ€ƒ“@@@@@@@@@@@d—Ê0.1S4•ÐŽèŒ•¨d—Ê100S0—¼ŽèŒ•‚ÉC³
+@‚È‚¨ASell‚Ì€–Ú‚Í‚ ‚邾‚¯–³‘Ê‚Á‚Û‚¢‚Ì‚Å‘S•”Á‚µ‚Ü‚µ‚½B
+
+----------
+
+//0202 by nabe
+
+EƒJƒvƒ‰‘qŒÉ‚Ìu“¯ˆêƒAƒJƒEƒ“ƒg‚È‚Ì‚É‹¤—L‚Å‚«‚È‚¢ƒoƒOv‚ð‰ü—Ç‚µ‚Ü‚µ‚½B
+ ŠeƒLƒƒƒ‰‚É‘qŒÉƒf[ƒ^‚ðŽ‚½‚¹‚é‚Ì‚Í–³‘Ê‚ª‘½‚¢‹C‚ª‚·‚é‚Ì‚ÅA
+ ƒAƒJƒEƒ“ƒgID‚ÅŠÇ—‚·‚é‚悤‚ÉŽd—l‚ð•ÏX‚µ‚Ü‚µ‚½B
+ ‚‚¢‚Å‚ÉA‘qŒÉƒf[ƒ^‚Í‘S‚Ästorage.c‚Å‚Ü‚©‚È‚¢A
+ charŽI‚ÍŠÖ—^‚µ‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B
+ ‚±‚ê‚É”º‚¢Achar_athena.cnf,mmo.h,char2.c‚ÍŒ³‚É–ß‚µ‚Ü‚µ‚½B
+ ‚Ü‚½A‘qŒÉƒtƒ@ƒCƒ‹–¼‚Ígstorage.txth‚ɌŒ肵‚Ä‚¢‚Ü‚·B
+
+ ‰ü•ÏA’ljÁ‚µ‚½‚Ì‚ÍŽŸ‚̃tƒ@ƒCƒ‹‚Å‚·B
+ map/storage.h,
+ map/storage.c,
+ map/clif.h,//ˆø”•ÏX‚¾‚¯
+ map/clif.c,//ˆø”•ÏX‚¾‚¯
+ conf/char_athena.cnf,//Œ³‚É–ß‚µ‚½‚¾‚¯
+ common/mmo.h,//Œ³‚É–ß‚µ‚½‚¾‚¯
+ char/char2.c,//Œ³‚É–ß‚µ‚½‚¾‚¯
+ map/itemdb.h,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
+ map/itemdb.c,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
+ map/pc.c,//itemdb_equippoint()ˆø”錾•ÏX‚¾‚¯
+
+----------
+
+//0201 by nabe
+
+EƒJƒvƒ‰‘qŒÉ‚ðŽÀ‘•‚µ‚Ü‚µ‚½B
+
+ ƒXƒNƒŠƒvƒg‚©‚çŒÄ‚Ño‚·‚É‚ÍAƒXƒNƒŠƒvƒg“à‚Å
+ openstorage;
+ ‚Æ‚µ‚Ä‚­‚¾‚³‚¢B
+ ƒTƒ“ƒvƒ‹‚Æ‚µ‚Änpc_kafraJ.txt‚ð•t‚¯‚Ä‚ ‚è‚Ü‚·B
+ •¹‚¹‚Änpc_script3J.txt‚ÌŠY“–•”•ª‚à‰ü•Ï‚µ‚Ü‚µ‚½B
+
+ char_athena.cnf‚Ì
+ stor_txt:
+ ‚Å‘qŒÉƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ä‚¢‚Ü‚·B
+
+ ‰ü•ÏA’ljÁ‚µ‚½‚Ì‚ÍŽŸ‚̃tƒ@ƒCƒ‹‚Å‚·B
+ map/Makefile,
+ map/storage.c,
+ map/storage.h,
+ map/clif.c,
+ map/clif.h,
+ map/script.c,
+ char/char2.c,
+ common/mmo,h
+ Ú‚µ‚­‚ÍAã‹Lƒtƒ@ƒCƒ‹‚̃Rƒƒ“ƒg‚È‚Ç‚ðŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢B
+
+EƒJƒvƒ‰‘qŒÉŽÀ‘•‚É”º‚¢Amap_athena1.cnf‚ð­‚µ‘‚«Š·‚¦‚Ü‚µ‚½B
+
+E‘S‚ẴRƒƒ“ƒg•¶‚ðEUC‚©‚çSJIS‚É•ÏŠ·‚µ‚Ü‚µ‚½B
+
+----------
+
+ Athena Dev. v2.1.1 Released: Middle July, 2003
+ (c) 2003 Athena Project.
+ http://project-yare.de/
+
+1. Athena(ƒAƒeƒi)‚ɂ‚¢‚Ä
+2. ‚±‚̃ŠƒŠ[ƒX‚ɂ‚¢‚Ä
+3. •K—v‚È•¨
+4. Žg‚¢•û
+5. Œ»Ý‚ÌŽd—l
+6. jŽ«
+7. –ÆÓŽ–€
+8. •åW
+9. English
+
+
+1. ƒAƒeƒi‚ɂ‚¢‚Ä
+ ƒAƒeƒi‚Æ‚Í2003”N1ŒŽ”¼‚΂ɂł½0052.lzh‚ðƒx[ƒX‚Æ‚µ‚Äì‚ç‚ê‚Ä‚¢‚éƒGƒ~ƒ…ƒŒ[ƒ^‚̈ê‚‚ł·B
+ Šî–{“I‚ȃ‰ƒCƒZƒ“ƒX‚̓IƒŠƒWƒiƒ‹‚ªGPL‚̉º‚É”z•z‚³‚ê‚Ä‚¢‚éˆ×A
+ ‚±‚ê‚É]‚¢GPL‚̉º”z•z‚ð‹–‰Â‚µ‚Ü‚·B
+ /*
+ ‰ü—ǔłð”z•z‚·‚éꇂ͕K‚¸‚±‚ÌREADME‚ð‘‚«Š·‚¦‚Ä‚­‚¾‚³‚¢B
+ ‰½ˆ‚ð‰ü—Ç‚µ‚½‚Ì‚©•ñ(athena@project-yare.de‚Ü‚Å)‚µ‚ĖႦ‚é‚Æ•‚©‚è‚Ü‚·B
+ ƒoƒCƒiƒŠ‚Ì‚Ý‚Ì”z•z‚ÍGPLˆá”½‚Å‚·‚Ì‚Å"•K‚¸"ƒ\[ƒX‚à“Y•t‚µ‚Ä‚­‚¾‚³‚¢B
+ */
+ “®ì‚ÌŠm”F‚͈ȉº‚Ì’Ê‚è‚Ì‚Ýs‚Á‚Ä‚¢‚Ü‚·B
+ // ‚½‚¾‚µŠ®àø‚É“®‚­Ž–‚ð•ÛØ‚·‚é‚à‚Ì‚Å‚ ‚è‚Ü‚¹‚ñ
+ ‘ÎÛCPU: Intel PentiumŒn // PentiumIIˆÈã‚ÅŠm”F.
+ FreeBSD 4.8R, 4.6.2R
+ Linux RedHat 7.3
+ cygwin + gcc 3.2 20020927 (prerelease)
+ ŠJ”­Œ³URL: http://project-yare.de/
+
+
+2. ‚±‚̃ŠƒŠ[ƒX‚ɂ‚¢‚Ä
+ ¡‰ñ‚̃ŠƒŠ[ƒX‚Í‘O‰ñ(V2.1)“¯—lŠJ”­”ł̃ŠƒŠ[ƒX‚Ì‚Ý‚Å‚·B
+ 2.1‚É”ä‚׉º‹L‚Ì“_‚ªC³‚³‚ê‚Ä‚¢‚Ü‚·B
+ map‚̃fƒtƒHƒ‹ƒgݒ肪ŠØ‘data.grf‚̂ݳí‚É“®ì‚·‚é‚悤‚É‚È‚Á‚Ä‚¢‚½“_
+ common/timer.c‚âmap/script.c‚ÌŠô‚‚©‚̃oƒO
+
+ v‘¬‚ÉUpdate‚ð‹­‚­„§‚·‚é‚à‚Ì‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªŠeŽ©‚Ì”»’f‚Ås‚Á‚ĉº‚³‚¢B
+
+
+3. •K—v‚È•¨
+ data.grf //sdata.grf‚Í•K—v‚ɉž‚¶‚Ä
+ account.txt //‘¶Ý‚µ‚È‚¢ê‡athena.sh‚ªŽ©“®¶¬‚µ‚Ü‚·
+ conf/*.cnf //Map—p‚ÆChar—p‚Ì“ñŽí—Þ‚ ‚è‚Ü‚·
+ conf/npc*.txt //npcÝ’è—pƒtƒ@ƒCƒ‹‚Å‚·B•¡”‚̃tƒ@ƒCƒ‹‚É•ª‚¯‚邱‚Æ‚ª‰Â”\‚Å‚·B
+ db/*.txt //ƒAƒCƒeƒ€Ajobî•ñ‚È‚Ç
+
+
+4. Žg‚¢•û
+ > tar xvfz athena-d?.?.tar.gz
+ > cd athena-d?.?.tar.gz
+ > make
+ > vi conf/char_athena.cnf //IP(127.0.0.1)‚Ì•”•ª‚ðŠÂ‹«‚ɇ‚킹‚Ä•ÏX‚µ‚Ä‚­‚¾‚³‚¢
+ > vi conf/map_athena.cnf //“¯ãA‚Ü‚½mapÝ’è‚È‚Ç‚ÍA‚±‚̃tƒ@ƒCƒ‹‚Ås‚¢‚Ü‚·B
+ > ./athena.sh
+ ã‹L‚ðs‚¦‚Î"‚½‚Ô‚ñ"‹N“®‚µ‚Ü‚·B
+
+ •â‘«:
+ conf/npc_sampleJ.txt‚ɂ̓XƒNƒŠƒvƒg‚Ì‘‚«•û‚ɂ‚¢‚ÄFX‚Èà–¾‚ª‹LÚ‚³‚ê‚Ä‚¢‚Ü‚·B
+ ‚à‚µA“ÆŽ©‚ÌMapÝ’è‚ðs‚Á‚Ä‚Ý‚½‚¢l‚âAƒXƒNƒŠƒvƒg‚ð˜M‚肽‚¢•û‚ÍŽQl‚É‚µ‚Ä‚­‚¾‚³‚¢B
+ ‚½‚¾‚µAŠJ”­’†‚Ì‚½‚߃XƒNƒŠƒvƒg‚ÌŽd—l‚ª•ÏX‚³‚ê‚é‰Â”\«‚ª‚‚¢‚Å‚·B
+ command.txt‚É‚ÍŽÀ‘•Ï‚Ý‚Ì“ÁŽêƒRƒ}ƒ“ƒh‚ɂ‚¢‚Ä‚Ìà–¾‚ð‹LÚ‚µ‚Ä‚¢‚Ü‚·B
+
+
+5. Œ»Ý‚ÌŽd—l
+ –{ŽI‚Æ”ä‚ׂè‚©‚µ‚¢(—Ⴆ‚΃vƒo‚ª•à‚­Aƒ|ƒŠƒ“‚ªƒAƒCƒeƒ€‚ðE‚í‚È‚¢‚È‚Ç)“_‚ÍA
+ ‘S‚ÄŒ»ÝŠJ”­’†‚Ɉö‚é‚à‚Ì‚Å‚·B
+ Œ»ó‚Æ‚µ‚ăLƒƒƒ‰ƒNƒ^Œn‹y‚у‚ƒ“ƒXƒ^[Œn‚̃oƒO•ñ‚Í–³Ž‹‚³‚ê‚é‰Â”\«‚ª‚‚¢‚Å‚·B
+
+ ƒoƒO•ñ‚ɂ‚¢‚Ä•K‚¸”­¶ðŒ‚ð‚¨‘‚«‰º‚³‚¢B
+ ‰º‚É‚ ‚é•ñ—pƒeƒ“ƒvƒŒ[ƒg‚ðŽg‚Á‚Ä•ñ‚µ‚Ä’¸‚­‚Æ•‚©‚è‚Ü‚·B
+ •ñæ‚̓Gƒ~ƒ…”‚̊J”­ƒXƒŒ‚É‚Å‚àB
+ ---- Athena v 2.0 (stable or develop) ----
+ ygcc verzgcc -v‚ðŽÀsŽž‚É•\Ž¦‚³‚ê‚é“à—e
+ y“®ìƒVƒXƒeƒ€zFreeBSD, Linux(ƒfƒBƒXƒgƒŠƒrƒ…[ƒWƒ‡ƒ“‚à), cygwin‚È‚Ç
+ y”­¶“à—ezmap‚ª—Ž‚¿‚Ä‚µ‚Ü‚Á‚½Žž‚Ì•\Ž¦‚³‚ê‚Ä‚¢‚½ƒfƒoƒbƒOî•ñ‚È‚Ç‹ï‘Ì“I‚É‘‚¢‚Ä‚­‚¾‚³‚¢B
+ y‘€ì“à—ez‹ï‘Ì“I‚É‚Ç‚ñ‚È‘€ì‚ðs‚Á‚½‚©‚ð‘‚¢‚Ä‚­‚¾‚³‚¢B
+ ------------------ END -------------------
+ —‘z‚̓eƒ“ƒvƒŒ‚ɉÁ‚¦‚Ämap.core‚È‚Çcoreƒtƒ@ƒCƒ‹‚ðUploader‚ɃAƒbƒv‚µ‚Ä’¸‚­‚±‚Æ‚Å‚·‚ª
+ –â‘è‚ÌMap‚¾‚¯‚Ìó‘Ô‚É‚µcore‚Ì“f‚­—e—Ê‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ /*
+ Šm”F‚µ‚½ŒÀ‚è‚Å‚Í324ŒÂ‚Ù‚Çmapƒf[ƒ^‚ð“Ç‚Ýž‚Ü‚¹‚é‚ÆA
+ 40MB‹ß‚¢coreƒtƒ@ƒCƒ‹‚ð“f‚«o‚µ‚Ü‚· @FreeBSD
+ cygwin‚ÌꇂÍstackdump‚Æ‚¢‚¤ƒtƒ@ƒCƒ‹‚É‚È‚é‚»‚¤‚Å‚·B
+ ‚µ‚©‚µAcoreƒtƒ@ƒCƒ‹‚È‚Ç‚ðgzipˆ³k‚È‚Ç‚·‚ê‚Α啂ɬ‚³‚­‚È‚è‚Ü‚·B
+ ‘å–}30MB‚Ìcoreƒtƒ@ƒCƒ‹‚ª2.9MB‚Ù‚Ç‚É‚È‚é‚悤‚Å‚·B
+ ‚Å‚·‚Ì‚ÅA‚à‚µƒAƒbƒvƒ[ƒh‚·‚éꇂÍgzipˆ³k‚È‚ÇŠeŽ©s‚Á‚Ä‚­‚¾‚³‚¢B
+ */
+
+ ¡‰ñ‚̃ŠƒŠ[ƒX‚¾‚¯‚Å‚È‚­HISTORY‚ð쬂·‚é‚Æ‘å—Ê‚É‹Lq‚ª•K—v‚Ȉ×È—ª‚µ‚Ä‚¢‚Ü‚·B
+ // ‘½‚¢“ú‚¾‚Æ–{“–‚ÉŒ‹\‚ ‚è‚Ü‚·‚Ì‚ÅddB
+
+
+6. jŽ«
+ ¡‰ñ‚±‚ÌAthenaŠJ”­”Å‚ðo‚·‚É“–‚½‚Á‚ÄŠ´ŽÓ‚µ‚½‚¢•ûX(‡”Ô•s“¯)
+ LemmingŽ (Project YARE)
+ 0052Ž (Uploader)
+ 35Ž (ƒGƒ~ƒ…ŠJ”­ƒXƒŒ)
+ Johan LindhŽ(Author of memwatch)
+ YARE forum‚ÌNPCî•ñ‚ð쬂µ‚½•ûX
+ weissŒ¤‹†‰ïBBS‚Ì—lX‚Èî•ñƒtƒ@ƒCƒ‹‚ð쬂µ‚½•ûX
+ ÅŒã‚ÉA.coreƒtƒ@ƒCƒ‹’B
+
+
+7. –ÆÓŽ–€
+ Athena Project‚͈êØAthena‚Ì“®ì‚ÉŠÖ‚·‚é•ÛØ“™‚Ís‚¢‚Ü‚¹‚ñB
+ ‚‚܂èAAthena‚Í–³•ÛØ‚Å‚·B
+ athena@project-yare.de‚É“®ìE‘€ì“™‚ÉŠÖ‚·‚鎿–â‚È‚Ç‚ð‘—‚ç‚ê‚Ä‚àˆêØ‚¨“š‚¦‚Å‚«‚Ü‚¹‚ñB
+ –”Athena‚ð—p‚¢‚½‚±‚Æ‚É‚æ‚趂¶‚½”íŠQE–â‘è“™‚ÌÓ”C‚͈êØAthena Project‚Í•‰‚¢‚Ü‚¹‚ñB
+
+
+8. •åW
+ athena‚ÌŠJ”­‚ÉŽQ‰Á‚µ‚½‚¢//‹»–¡‚ª‚ ‚é‚Æ‚¢‚¤•û‚²˜A—‰º‚³‚¢B
+ ‰äX‚Í‹M•û‚ÌŽQ‰Á‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·B
+ // ÅV”Å‚ª—~‚µ‚¢‚¾‚¯‚ʼn½‚狦—Í‚µ‚Ä’¸‚¯‚È‚¢‚Æ‚¢‚¤•û‚Í‚¨’f‚è‚Å‚·;-)
+ [•åW—v€: ƒvƒƒOƒ‰ƒ}(2-3l)]
+ ”N—î: •s–â
+ «•Ê: •s–â
+ Œ¾Œê: “ú–{Œê‚ª—‰ð‰Â”\
+ “à—e: CŒ¾Œê‚à‚µ‚­‚ÍC++‚É‚æ‚éŠJ”­B(“Á‚Ƀlƒbƒgƒ[ƒN‚âDB‚ÌŒoŒ±‚ª—L‚é•û‘å•åW!)
+ [•åW—v€: –|–ó(?l)]
+ ”N—î: •s–â
+ «•Ê: •s–â
+ Œ¾Œê: “ú–{ŒêA‰pŒê‚ª—‰ð‰Â”\
+ “à—e: •§—–¼ŒêA“ƈíŒêA¼”ljåŒêAˆÉ‘¾—˜ˆŸŒêA‘×(ƒ^ƒC)ŒêA’©‘NŒêA’†‘Œê‚Ö•¶Œ£AƒTƒCƒg‚È‚Ç‚Ì–|–ó
+ ˜A—æ: athena@project-yare.de ŽG–±’S“–‚Ü‚ÅB
+
+
+9. English
+ This release is just fixed some bugs in timer.c, script.c and map_athena1.conf.
+
+
+(c) 2003 Athena Project.
diff --git a/doc/notes/SVN-SUPPORT.txt b/doc/notes/SVN-SUPPORT.txt
index b38f5ee0f..7e14cb461 100644
--- a/doc/notes/SVN-SUPPORT.txt
+++ b/doc/notes/SVN-SUPPORT.txt
@@ -1,15 +1,15 @@
-
-If you are reading this, you are one of the lucky fools to be actually
-using the active development tree of the eAthena team. This is the
-only version that most of the eA dev team will activly support.
-
-svn can be retrieved via:
-
- http://subversion.tigris.org/files/documents/15/20015/svn-1.1.3-setup.exe
-
-once downloaded and placed in your path, you can just do:
-
-C> svn co http://svn2.stormbirds.org:8080/svn/ea/branches/stable
-
-this will check out a copy of our active stable development tree which
-you can then build. Build? figure it out...
+
+If you are reading this, you are one of the lucky fools to be actually
+using the active development tree of the eAthena team. This is the
+only version that most of the eA dev team will activly support.
+
+svn can be retrieved via:
+
+ http://subversion.tigris.org/files/documents/15/20015/svn-1.1.3-setup.exe
+
+once downloaded and placed in your path, you can just do:
+
+C> svn co http://svn2.stormbirds.org:8080/svn/ea/branches/stable
+
+this will check out a copy of our active stable development tree which
+you can then build. Build? figure it out...
diff --git a/doc/notes/help-old.txt b/doc/notes/help-old.txt
index 3af1cc055..ca5802043 100644
--- a/doc/notes/help-old.txt
+++ b/doc/notes/help-old.txt
@@ -1,450 +1,450 @@
- ______ __ __
- /\ _ \/\ \__/\ \
- __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
- /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
- \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-
---------------------------------------------------------------
-GM COMMANDS
----------------------------------------------------------------------------------
-Note:
- To use these commands, type them inside the message window where you usually
- type to chat.
-
-Rewritten by: Kevin
-Updated by: massdriller
-
----------------------------------------------------------------------------------
-<> = type of parameter that the command need to have
-[] = optionnal parameter
----------------------------------------------------------------------------------
-
-@h/@help = display commands help inside the game.
-
-=================================================================================
-ANNOUNCEMENT COMMANDS
-=================================================================================
-
-/b, @broadcast <message> = Send a message to everybody, with GM name.
- (yellow text)
-/nb, @kami <message> = Send a message to everybody, with no GM name.
- (yellow text)
-/bb, @kamib <message> = Send a message to everybody, with no GM name.
- (blue text)
-/lb, @localbroadcast <message> = Send a message to everybody, with GM name.
- (yellow text) (current map only)
-/nlb <message> = Send a message to everybody, with no GM name.
- (yellow text) (current map only)
-
-@me <message> = Creates a yellow "action" header on top of
- all the characters around your character.
-
-=================================================================================
-INFORMATION COMMANDS
-=================================================================================
-
------Character Information-----
-
-@who [match_text] = Lists which characters are currently online in your
- server and their location. [match_text] is a parameter
- to search only characters that have this text in their
- name.
-@who2 [match_text] = Lists which characters are currently online in your
- server and their job. [match_text] is a parameter to
- search only characters that have this text in their
- name.
-@who3 [match_text] = Lists which characters are currently online in your
- server and their party/guild. [match_text] is a
- parameter to search only characters that have this text
- in their name.
-@whomap [map] = Displays a listing of which characters are online and
- where they are in a specifical map. If [map] isn't
- specified, you display characters on your map.
-@whomap2 [map] = Displays a listing of which characters are online and
- their job in a specifical map. If [map] isn't specified,
- you display characters on your map.
-@whomap3 [map] = Displays a listing of which characters are online and
- their party/guild in a specifical map. If [map] isn't
- specified, you display characters on your actual map.
-@whogm [match_text] = Like @who+@who2+who3, but only for GM.
-@where [char name] = Tells you the location of a character. If [char name]
- isn't specified, you display your own location.
-@charcartlist <char name> = Displays all items of a player's cart.
-@mapinfo [<0-3> [map]] = Give information about a map (general info +:
- 0: no more, 1: players, 2: NPC, 3: shops/chat).
-
-@time/@date/@server_date/@serverdate/@server_time/@servertime = Display the date/
- time of the server
-
------guild/party information-----
-
-@guildspy <guild_name/id> = You will receive all messages of the specified guild
- channel
-@partyspy <party_name/id> = You will receive all messages of the specified party
- channel
-
------Database Information-----
-
-@mobinfo/@monsterinfo/@mi <monstername> = Gives information about the monster
-@iteminfo/@ii <itemname> = Gives information about the item
-@rates = Displays the Rates of the server
-@version = Gives the number of the SVN Version
-
-
-
-=================================================================================
-YOURSELF ONLY COMMANDS
-=================================================================================
-
------move commands-----
-
-/hide/@hide = GM Hide. Perfect hide that's totally
- invisible. Type @hide again become
- visible.
-@save = Sets save point as current location
-@load/@return = Warps you to your save point (like
- butterfly wing)
-/mm <mapname> <> <p>
-/mapmove <map_name> <x> <y>
-@warp/@rura/@mapmove <mapname> <x> <y> = Warps you to the selected position
- Example: @warp morocc 150 160 -> Warps
- you to Morroc (X:150, Y:160)
-@jump [x [y]] = Teleports you randomly in the map (like
- fly wing)
-/shift/@jumpto/@warpto/@goto <charname> = Warps you to selected character
- Example: @jumpto TestChar -> You are
- warped to TestChar's current
- location
-@go <number/city_name> = Warps you to a set city:
- -3=(Memo point 2) 4=Alberta 11=Gon Ryun
- -2=(Memo point 1) 5=Izlude 12=Umbala
- -1=(Memo point 0) 6=Al de Baran 13=Niflheim
- 0=Prontera 7=Lutie 14=Lou Yang
- 1=Morroc 8=Comodo 15=Start point
- 2=Geffen 9=Yuno 16=Prison
- 3=Payon 10=Amatsu
-@follow = Teleports and follows the player
- persistantly
-
------Health Commands-----
-
-@die = Kill yourself :) (suicide)
-@alive = Revives yourself from death
-@heal [<HP> <SP>] = Heals the desired amount of HP and SP. No value specified
- will do a full heal.
-
--------Job/Skill/Stat Commands-----
-
-@job/@jobchange <job> = Changes your job to the job assigned to the ID:
- 0 Novice 7 Knight 14 Crusader 22 Formal
- 1 Swordman 8 Priest 15 Monk 23 Super Novice
- 2 Mage 9 Wizard 16 Sage
- 3 Archer 10 Blacksmith 17 Rogue
- 4 Acolyte 11 Hunter 18 Alchem
- 5 Merchant 12 Assassin 19 Bard
- 6 Thief 13 Knight2 20 Dancer
- 21 Crusader2
- 24 Novice High 31 Lord Knight 38 Paladin
- 25 Swordman High 32 High Priest 39 Monk
- 26 Mage High 33 High Wizard 40 Professor
- 27 Archer High 34 Whitesmith 41 Stalker
- 28 Acolyte High 35 Sniper 42 Creator
- 29 Merchant High 36 Assassin Cross 43 Clown
- 30 Thief High 37 Peko Knight 44 Gypsy
- 45 Paladin2
-@lvup/@blevel/@baselvlup <number of levels> = Raises your base level the
- desired number of levels. The max
- is 99/255 (User Defined).
-@joblvup/@jlevel/@joblvlup <number of levels> = Raises your job level the desired
- number of levels. The max is 50
- For Basic Classes. For Super
- Novice and Advanced Classes it is
- 70.
-@allskill/@allskills/@skillall/@skillsall = Give you all skills.
-@stpoint <number of points> = Gives you the desired number of stat
- points.
-@skpoint <number of points> = Gives you the desired number of skill
- points.
-@str,@agi,@vit,@int,@dex,@luk <amount> = Adds desired amount to any stat. For
- example "@str 10" raises your str by 10.
-@statall/@statsall/@allstats/@allstat [value] = Adds value in all stats (maximum
- if no value).
-@questskill <id> = Gives you the specified quest skill
-@lostskill <id> = Takes away the specified quest skill
- from you
- Novice Archer Swordsman
- 142 = Emergency Care 147 = Arrow Creation 144 = Moving HP Recovery
- 143 = Act dead 148 = Charge Arrows 145 = Attack Weak Point
- Thief 146 = Auto Berserk
- 149 = Throw Sand Merchant
- 150 = Back Sliding 153 = Cart Revolution
- 151 = Take Stone 154 = Change Cart
- 152 = Stone Throw 155 = Crazy Uproar/Loud Voice
- Acolyte Magician
- 156 = Holy Light 157 = Energy Coat
-
------Other Commands-----
-
-@option <param1> <param2> <param3> = Changes options of your character
- Example: @option 0 0 16 - would give falcon
- <param1> <param2> <param3> <param3>
- 01 Petrified 01 Poison 01 Sight 128 Level 2 Cart
- 02 Frozen 02 Cursed 02 Hide 256 Level 3 Cart
- 03 Stunned 04 Silenced 04 Cloak 512 Level 4 Cart
- 04 Sleeping 08 ??? 08 Level 1 Cart 1024 Level 5 Cart
- 06 darkness 16 darkness 16 Falcon 2048 Orc Head
- 32 Peco Peco riding 4096 Wedding Sprites
- 64 GM Perfect Hide 8192 Ruwach
-@mountpeco = Give/remove you a peco. (Class is required, but not skill)
-@disguise <monster_name/monster_ID/NPC_ID> = Change your appearence to a mob or npc.
- If using NPC ID 104 Will become an effect.
- Speed of player will determine effect, be very careful with this ID
- it can create client crashes with improper ids and can easily lag players
- off of the server.
-@undisguise = Restore your normal appearance.
-@model <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4>
- = Changes your characters appearance
- (Hair type/colour and/or Clothes colour)
- Hair ID (0-17) Hair Colour (0-8) Clothes Colour (0-4)
- 0 Default 0 Default
- 1 Blonde 1 Red
- 2 Purple 2 Green
- 3 Brown 3 White
- 4 Green 4 Brown
- 5 Blue
- 6 White
- 7 Black
- 8 Red
-@dye/@ccolor <clothes color: 0-4> = Changes your characters appearence
- (only clothes color).
-@hairstyle/@hstyle <hair ID: 0-17> = Changes your characters appearence
- (only hair style).
-@haircolor/@hcolor <hair color: 0-8> = Changes your characters appearence
- (only hair color).
-@speed <1-1000> = Changes you walking speed (1 being the
- fastest & 1000 the slowest. Default 150.
-@effect <effect_id> [flag] = Give an efect to your character.
-@zeny <amount> = Gives you desired amount of Zeny.
-@memo [memo_position] = set/change a memo location.
- (no position: display memo points).
-@spiritball <number: 1-1000> = Gives you monk "spirit spheres" like
- from the skill "Call Spirits" (If the
- number you use is > 1000, your server
- may become instable or crash)
-@me <action> = Displays Charname action. ie. "**Bob dances**"
- if character name is bob and command is
- @me dances.
-
-=================================================================================
-REMOTE CHAR COMMANDS
-=================================================================================
-
-@kill <char name> = Kills specified character name
- Example: @kill TestChar -> The character named
- TestChar is dead
-@jail <char_name> = Sends specified character in jails
-/recall/@recall <char name> = Warps target character to you.
-@recallall = Warps every character online to you.
-@unjail/@discharge <char_name> = Discharges specified character
- or prisoner
-@charwarp/@rura+ <mapname> <x> <y> <char name> = Warps character to location of
- choice: Example:
- @charwarp morocc 150 160 testet
-@revive <char name> = Revives target character.
-@charstats <char name> = Displays the character's stats.
-@charignorelist <char name> = Displays ignore list of the player
-@inall <char name> = Allows all wispers for the player
-@exall <char name> = Blocks all wispers for the player
-@charoption <param1> <param2> <param3> <char name> = Does the same as the @option
- command only to target
- character.
-@charmountpeco <charname> = Give/remove to a player a peco (Class is
- required, but not skill).
-@charpetrename <charname> = Re-enable pet rename to a player.
-@charsave <map> <x> <y> <char name> = Changes the target player's respawn point.
-@charbaselvl <#> <char name> = Change a character's base level.
-@charjlvl <#> <char name> = Change a character's job level.
-@charstpoint <amount> <char name> = Give/take a player's stat points
-@charskpoint <amount> <char name> = Give/take a player's skill points
-@charskreset <charname> = Reset skills of a character.
-@charstreset <charname> = Reset stats of a character.
-@charquestskill <#> <charname> = Gives to a player the specified quest skill.
-@charlostskill <#> <charname> = Takes away the specified quest skill from
- the player.
-@chardelitem <item_name_or_ID> <quantity> <player> = Remove items from a character
-@charmodel <hair type> <hair color> <clothes color> <char name> = Changes a
- player's model
-@chardisguise <monster_name/ID> <char name> = Changes disguise of a player
-@charundisguise <char name> = Cancels disguise of a player
-@charblock/@block <name> = Blocks definitively a account
-@charunblock/@unblock <name> = Unblocks a account
-@charban/@ban/@banish/@charbanish <time> <name> = Ban temporarily a account
- Time usage: adjustement
- (+/- value) and element
- (y/a, m, d/j, h, mn, s)
- Example:
- @ban +1m-2mn1s-6y testplayer
-@charunban/@unban/@unbanish/@uncharbanish <name> = Unban a account
-@kick <charname> = Kicks specified character off the server
-@kickall = Kick all characters off the server
-@mapexit = Kick all players and shut down map-server.
-@doom = Kills all NON GM chars on the server.
-@doommap = Kills all non GM characters on the map.
-@raise = Resurrects all characters on the server.
-@raisemap = Resurrects all characters on the map.
-
-@killable = Other players can kill you
-@charkillable <character name> = Enable other players to be killable
-
-
-=================================================================================
-MOB COMMANDS
-=================================================================================
-
-/monster <monster_name> = Spawns 1 of the desired monster.
-@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
- = Spawns the desired monster with any desired name,
- quantity and x and y location (if specified).
-@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
- = Spawns the desired monster with any desired name.
-@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
- = There 2 last forms can use spaces for desired names.
-@killmonster [map] = kill all monsters of the map (they drop items)
-@killmonster2 = kill all monsters of your map (without drops)
-
-=================================================================================
-ITEM COMMANDS
-=================================================================================
-
-@storage = Opens storage
-@gstorage = Opens guild storage
-@item <item name or ID> [quantity] = Gives you the desired item.
-@item2 <item name or ID> <quantity> <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4>
- = Gives you the desired item.
-@itemreset = Remove all your items.
-@itemcheck = Check your items with authorised items.
-@idsearch <part_of_item_name> = search all items that name have
- part_of_item_name
-@refine <equip position> <+/- amount> = Upgrades equipment at the position
- specified (Stackable)
- 0 - All
- 1 - Lower Head
- 2 - Right Hand
- 4 - Robe/Garment
- 8 - Left Accessory
- 16 - Body/Armor
- 32 - Left Hand
- 64 - Foot Gear
- 128 - Right Accessory
- 256 - Top Head
- 512 - Mid Head
- Example: @refine 34 10 - Refines a 2 handed weapon to +10
- @refine 16 4 - Refines the body/armor to +4
-@produce <equip name or equip ID> <element> <# of very's>
- Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
- It has separately with fragment 3 of the attribute + stars, you can apply.
- # of very's: 0=None 1=Very Strong 2=Very Very Strong 3=Very Very Very Strong
- Example: @produce 1163 3 3 - Produces a Very Very Very Strong (Your Nick)'s
- Fire Claymore
-@repairall = Repair all items of your inventory
-@cleanmap = Clears map of all fallen items
-
-=================================================================================
-ADMINISTRATION COMMANDS
-=================================================================================
-
-@reloaditemdb = Reload item database (admin command)
-@reloadmobdb = Reload monster database (admin command)
-@reloadskilldb = Reload skills definition database (admin command)
-@reloadscript = Reload all scripts (admin command)
-@reloadgmdb = Reload GM levels (admin command)
-@reloadatcommand = Reload GM command levels (admin command)
-@reloadbattleconf = Reload Battle Config(admin command)
-@reloadstatusdb = Reload status database(admin command)
-@reloadpcdb = Reload pc database(admin command)
-
-@loadnpc <path/to/npc> - Load a NPC (admin command)
-@unloadnpc <NPC_name> - Disable a NPC (admin command)
-@shownpc <NPC_name> - Show a hidden NPC (admin command)
-@hidenpc <NPC_name> - Hide a NPC (admin command)
-
-@disguiseall <monster_name/monster_ID/NPC_ID> = Change everybody on the map's appearence to a mob or npc.
- If using NPC ID 104 Will become an effect.
- Speed of player will determine effect, be very careful with this ID
- it can create client crashes with improper ids and can easily lag players
- off of the server.
-@undisguiseall = Removes all Disguises
-@happyhappyjoyjoy = Random emotions from all players on the map
-@autoloot = All items will go into inventory upon killing a monster
-
-
-@gat = For debugging (you inspect around gat)
-@packet = For debugging (packet variety)
-
-@GM <password> = it becomes GM!
-@email <actual@email> <new@email> = to change your e-mail (characters protection)
-
-@refreshonline = Rechecks to make sure online column is correct (SQL Only)
-
-=================================================================================
-OTHER COMMANDS
-=================================================================================
-
------Environmental Commands-----
-
-@night = Uses @option 00 16 00 on all characters. All characters are in darkness
-@day = Uses @option 00 00 00 on all characters.
-
-@rain = Gives Rain effect on activated map
-@snow = Gives Snow effect on activated map
-@sakura = Gives Flower petal effect on activated map
-@clouds = Gives Clouds effect on activated map
-@fog = Gives Foggy effect on activated map
-@fireworks = Gives Fireworks effect on activated map
-@leaves = Gives attumn effect on activated map
-@clearweather = Clears all "weather" effects on the map (Works only when players leave the map and rejoin again)
-
------Mail System Commands(SQL)-----
-
-@checkmail = Checks # of messages in your mailbox.
-@listmail = Lists all the messages in your mailbox.
-@listnewmail = Lists all new messages in your mailbox.
-@readmail <#> = Reads a message in your mailbox.
-@deletemail <#> = Deletes a message in your mailbox.
-
-@sendmail <name> <message> = Sends a message to another player. Use quotes if
- the player has spaces in their name.
-
-@sendprioritymail <name> <message> = Send priority mail to a player.
-
-Use * for name to send to all players.
-
------Pet Commands-----
-
-@hatch = Create a pet from your inventory eggs list.
-@makeegg <ID> = Gives pet egg for monster ID in pet DB
-@petfriendly <#> = Set pet friendly amount (0-1000) 0 = Min, 1000 = Max
-@pethungry <#> = Set pet hungry amount (0-100) 0 = Min, 100 = Max
-@petrename = Re-enable pet rename
-
------Group Commands-----
-
-@party <party_name> = Create a party
-@guild <guild_name> = Create a guild.
-@guildlvup/@guildlvlup <# of levels> = Raise Guild by desired number of levels
-@guildrecall <guild_name/id> = Warps all online character of a guild to you.
-@partyrecall <party_name/id> = Warps all online character of a party to you.
-
------Mute Commands (muting_players must be enabled)-----
-
-@mute/@red <time> <char_name> = Mutes char_name for time period of time.
-@mutearea/@stfu [time] = Mutes area for time, sets defualt to 15.
-
------System Commands usually used with scripts-------
-
-@marry <Char 1> <char 2> = Makes 2 target characters married
-@divorce <Char 1> <Char 2> = Divorces 2 characters
-@adopt <Char> = Adopts a player
-
+ ______ __ __
+ /\ _ \/\ \__/\ \
+ __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+ /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+ \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+
+--------------------------------------------------------------
+GM COMMANDS
+---------------------------------------------------------------------------------
+Note:
+ To use these commands, type them inside the message window where you usually
+ type to chat.
+
+Rewritten by: Kevin
+Updated by: massdriller
+
+---------------------------------------------------------------------------------
+<> = type of parameter that the command need to have
+[] = optionnal parameter
+---------------------------------------------------------------------------------
+
+@h/@help = display commands help inside the game.
+
+=================================================================================
+ANNOUNCEMENT COMMANDS
+=================================================================================
+
+/b, @broadcast <message> = Send a message to everybody, with GM name.
+ (yellow text)
+/nb, @kami <message> = Send a message to everybody, with no GM name.
+ (yellow text)
+/bb, @kamib <message> = Send a message to everybody, with no GM name.
+ (blue text)
+/lb, @localbroadcast <message> = Send a message to everybody, with GM name.
+ (yellow text) (current map only)
+/nlb <message> = Send a message to everybody, with no GM name.
+ (yellow text) (current map only)
+
+@me <message> = Creates a yellow "action" header on top of
+ all the characters around your character.
+
+=================================================================================
+INFORMATION COMMANDS
+=================================================================================
+
+-----Character Information-----
+
+@who [match_text] = Lists which characters are currently online in your
+ server and their location. [match_text] is a parameter
+ to search only characters that have this text in their
+ name.
+@who2 [match_text] = Lists which characters are currently online in your
+ server and their job. [match_text] is a parameter to
+ search only characters that have this text in their
+ name.
+@who3 [match_text] = Lists which characters are currently online in your
+ server and their party/guild. [match_text] is a
+ parameter to search only characters that have this text
+ in their name.
+@whomap [map] = Displays a listing of which characters are online and
+ where they are in a specifical map. If [map] isn't
+ specified, you display characters on your map.
+@whomap2 [map] = Displays a listing of which characters are online and
+ their job in a specifical map. If [map] isn't specified,
+ you display characters on your map.
+@whomap3 [map] = Displays a listing of which characters are online and
+ their party/guild in a specifical map. If [map] isn't
+ specified, you display characters on your actual map.
+@whogm [match_text] = Like @who+@who2+who3, but only for GM.
+@where [char name] = Tells you the location of a character. If [char name]
+ isn't specified, you display your own location.
+@charcartlist <char name> = Displays all items of a player's cart.
+@mapinfo [<0-3> [map]] = Give information about a map (general info +:
+ 0: no more, 1: players, 2: NPC, 3: shops/chat).
+
+@time/@date/@server_date/@serverdate/@server_time/@servertime = Display the date/
+ time of the server
+
+-----guild/party information-----
+
+@guildspy <guild_name/id> = You will receive all messages of the specified guild
+ channel
+@partyspy <party_name/id> = You will receive all messages of the specified party
+ channel
+
+-----Database Information-----
+
+@mobinfo/@monsterinfo/@mi <monstername> = Gives information about the monster
+@iteminfo/@ii <itemname> = Gives information about the item
+@rates = Displays the Rates of the server
+@version = Gives the number of the SVN Version
+
+
+
+=================================================================================
+YOURSELF ONLY COMMANDS
+=================================================================================
+
+-----move commands-----
+
+/hide/@hide = GM Hide. Perfect hide that's totally
+ invisible. Type @hide again become
+ visible.
+@save = Sets save point as current location
+@load/@return = Warps you to your save point (like
+ butterfly wing)
+/mm <mapname> <> <p>
+/mapmove <map_name> <x> <y>
+@warp/@rura/@mapmove <mapname> <x> <y> = Warps you to the selected position
+ Example: @warp morocc 150 160 -> Warps
+ you to Morroc (X:150, Y:160)
+@jump [x [y]] = Teleports you randomly in the map (like
+ fly wing)
+/shift/@jumpto/@warpto/@goto <charname> = Warps you to selected character
+ Example: @jumpto TestChar -> You are
+ warped to TestChar's current
+ location
+@go <number/city_name> = Warps you to a set city:
+ -3=(Memo point 2) 4=Alberta 11=Gon Ryun
+ -2=(Memo point 1) 5=Izlude 12=Umbala
+ -1=(Memo point 0) 6=Al de Baran 13=Niflheim
+ 0=Prontera 7=Lutie 14=Lou Yang
+ 1=Morroc 8=Comodo 15=Start point
+ 2=Geffen 9=Yuno 16=Prison
+ 3=Payon 10=Amatsu
+@follow = Teleports and follows the player
+ persistantly
+
+-----Health Commands-----
+
+@die = Kill yourself :) (suicide)
+@alive = Revives yourself from death
+@heal [<HP> <SP>] = Heals the desired amount of HP and SP. No value specified
+ will do a full heal.
+
+-------Job/Skill/Stat Commands-----
+
+@job/@jobchange <job> = Changes your job to the job assigned to the ID:
+ 0 Novice 7 Knight 14 Crusader 22 Formal
+ 1 Swordman 8 Priest 15 Monk 23 Super Novice
+ 2 Mage 9 Wizard 16 Sage
+ 3 Archer 10 Blacksmith 17 Rogue
+ 4 Acolyte 11 Hunter 18 Alchem
+ 5 Merchant 12 Assassin 19 Bard
+ 6 Thief 13 Knight2 20 Dancer
+ 21 Crusader2
+ 24 Novice High 31 Lord Knight 38 Paladin
+ 25 Swordman High 32 High Priest 39 Monk
+ 26 Mage High 33 High Wizard 40 Professor
+ 27 Archer High 34 Whitesmith 41 Stalker
+ 28 Acolyte High 35 Sniper 42 Creator
+ 29 Merchant High 36 Assassin Cross 43 Clown
+ 30 Thief High 37 Peko Knight 44 Gypsy
+ 45 Paladin2
+@lvup/@blevel/@baselvlup <number of levels> = Raises your base level the
+ desired number of levels. The max
+ is 99/255 (User Defined).
+@joblvup/@jlevel/@joblvlup <number of levels> = Raises your job level the desired
+ number of levels. The max is 50
+ For Basic Classes. For Super
+ Novice and Advanced Classes it is
+ 70.
+@allskill/@allskills/@skillall/@skillsall = Give you all skills.
+@stpoint <number of points> = Gives you the desired number of stat
+ points.
+@skpoint <number of points> = Gives you the desired number of skill
+ points.
+@str,@agi,@vit,@int,@dex,@luk <amount> = Adds desired amount to any stat. For
+ example "@str 10" raises your str by 10.
+@statall/@statsall/@allstats/@allstat [value] = Adds value in all stats (maximum
+ if no value).
+@questskill <id> = Gives you the specified quest skill
+@lostskill <id> = Takes away the specified quest skill
+ from you
+ Novice Archer Swordsman
+ 142 = Emergency Care 147 = Arrow Creation 144 = Moving HP Recovery
+ 143 = Act dead 148 = Charge Arrows 145 = Attack Weak Point
+ Thief 146 = Auto Berserk
+ 149 = Throw Sand Merchant
+ 150 = Back Sliding 153 = Cart Revolution
+ 151 = Take Stone 154 = Change Cart
+ 152 = Stone Throw 155 = Crazy Uproar/Loud Voice
+ Acolyte Magician
+ 156 = Holy Light 157 = Energy Coat
+
+-----Other Commands-----
+
+@option <param1> <param2> <param3> = Changes options of your character
+ Example: @option 0 0 16 - would give falcon
+ <param1> <param2> <param3> <param3>
+ 01 Petrified 01 Poison 01 Sight 128 Level 2 Cart
+ 02 Frozen 02 Cursed 02 Hide 256 Level 3 Cart
+ 03 Stunned 04 Silenced 04 Cloak 512 Level 4 Cart
+ 04 Sleeping 08 ??? 08 Level 1 Cart 1024 Level 5 Cart
+ 06 darkness 16 darkness 16 Falcon 2048 Orc Head
+ 32 Peco Peco riding 4096 Wedding Sprites
+ 64 GM Perfect Hide 8192 Ruwach
+@mountpeco = Give/remove you a peco. (Class is required, but not skill)
+@disguise <monster_name/monster_ID/NPC_ID> = Change your appearence to a mob or npc.
+ If using NPC ID 104 Will become an effect.
+ Speed of player will determine effect, be very careful with this ID
+ it can create client crashes with improper ids and can easily lag players
+ off of the server.
+@undisguise = Restore your normal appearance.
+@model <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4>
+ = Changes your characters appearance
+ (Hair type/colour and/or Clothes colour)
+ Hair ID (0-17) Hair Colour (0-8) Clothes Colour (0-4)
+ 0 Default 0 Default
+ 1 Blonde 1 Red
+ 2 Purple 2 Green
+ 3 Brown 3 White
+ 4 Green 4 Brown
+ 5 Blue
+ 6 White
+ 7 Black
+ 8 Red
+@dye/@ccolor <clothes color: 0-4> = Changes your characters appearence
+ (only clothes color).
+@hairstyle/@hstyle <hair ID: 0-17> = Changes your characters appearence
+ (only hair style).
+@haircolor/@hcolor <hair color: 0-8> = Changes your characters appearence
+ (only hair color).
+@speed <1-1000> = Changes you walking speed (1 being the
+ fastest & 1000 the slowest. Default 150.
+@effect <effect_id> [flag] = Give an efect to your character.
+@zeny <amount> = Gives you desired amount of Zeny.
+@memo [memo_position] = set/change a memo location.
+ (no position: display memo points).
+@spiritball <number: 1-1000> = Gives you monk "spirit spheres" like
+ from the skill "Call Spirits" (If the
+ number you use is > 1000, your server
+ may become instable or crash)
+@me <action> = Displays Charname action. ie. "**Bob dances**"
+ if character name is bob and command is
+ @me dances.
+
+=================================================================================
+REMOTE CHAR COMMANDS
+=================================================================================
+
+@kill <char name> = Kills specified character name
+ Example: @kill TestChar -> The character named
+ TestChar is dead
+@jail <char_name> = Sends specified character in jails
+/recall/@recall <char name> = Warps target character to you.
+@recallall = Warps every character online to you.
+@unjail/@discharge <char_name> = Discharges specified character
+ or prisoner
+@charwarp/@rura+ <mapname> <x> <y> <char name> = Warps character to location of
+ choice: Example:
+ @charwarp morocc 150 160 testet
+@revive <char name> = Revives target character.
+@charstats <char name> = Displays the character's stats.
+@charignorelist <char name> = Displays ignore list of the player
+@inall <char name> = Allows all wispers for the player
+@exall <char name> = Blocks all wispers for the player
+@charoption <param1> <param2> <param3> <char name> = Does the same as the @option
+ command only to target
+ character.
+@charmountpeco <charname> = Give/remove to a player a peco (Class is
+ required, but not skill).
+@charpetrename <charname> = Re-enable pet rename to a player.
+@charsave <map> <x> <y> <char name> = Changes the target player's respawn point.
+@charbaselvl <#> <char name> = Change a character's base level.
+@charjlvl <#> <char name> = Change a character's job level.
+@charstpoint <amount> <char name> = Give/take a player's stat points
+@charskpoint <amount> <char name> = Give/take a player's skill points
+@charskreset <charname> = Reset skills of a character.
+@charstreset <charname> = Reset stats of a character.
+@charquestskill <#> <charname> = Gives to a player the specified quest skill.
+@charlostskill <#> <charname> = Takes away the specified quest skill from
+ the player.
+@chardelitem <item_name_or_ID> <quantity> <player> = Remove items from a character
+@charmodel <hair type> <hair color> <clothes color> <char name> = Changes a
+ player's model
+@chardisguise <monster_name/ID> <char name> = Changes disguise of a player
+@charundisguise <char name> = Cancels disguise of a player
+@charblock/@block <name> = Blocks definitively a account
+@charunblock/@unblock <name> = Unblocks a account
+@charban/@ban/@banish/@charbanish <time> <name> = Ban temporarily a account
+ Time usage: adjustement
+ (+/- value) and element
+ (y/a, m, d/j, h, mn, s)
+ Example:
+ @ban +1m-2mn1s-6y testplayer
+@charunban/@unban/@unbanish/@uncharbanish <name> = Unban a account
+@kick <charname> = Kicks specified character off the server
+@kickall = Kick all characters off the server
+@mapexit = Kick all players and shut down map-server.
+@doom = Kills all NON GM chars on the server.
+@doommap = Kills all non GM characters on the map.
+@raise = Resurrects all characters on the server.
+@raisemap = Resurrects all characters on the map.
+
+@killable = Other players can kill you
+@charkillable <character name> = Enable other players to be killable
+
+
+=================================================================================
+MOB COMMANDS
+=================================================================================
+
+/monster <monster_name> = Spawns 1 of the desired monster.
+@spawn/@monster/@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
+ = Spawns the desired monster with any desired name,
+ quantity and x and y location (if specified).
+@monster2 <desired_monster_name> <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
+ = Spawns the desired monster with any desired name.
+@spawn/@monster/@summon/@monster2 <monster_name_or_monster_ID> "desired monster name" [<number to spawn> [<x coord> [<y coord>]]]
+ = There 2 last forms can use spaces for desired names.
+@killmonster [map] = kill all monsters of the map (they drop items)
+@killmonster2 = kill all monsters of your map (without drops)
+
+=================================================================================
+ITEM COMMANDS
+=================================================================================
+
+@storage = Opens storage
+@gstorage = Opens guild storage
+@item <item name or ID> [quantity] = Gives you the desired item.
+@item2 <item name or ID> <quantity> <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4>
+ = Gives you the desired item.
+@itemreset = Remove all your items.
+@itemcheck = Check your items with authorised items.
+@idsearch <part_of_item_name> = search all items that name have
+ part_of_item_name
+@refine <equip position> <+/- amount> = Upgrades equipment at the position
+ specified (Stackable)
+ 0 - All
+ 1 - Lower Head
+ 2 - Right Hand
+ 4 - Robe/Garment
+ 8 - Left Accessory
+ 16 - Body/Armor
+ 32 - Left Hand
+ 64 - Foot Gear
+ 128 - Right Accessory
+ 256 - Top Head
+ 512 - Mid Head
+ Example: @refine 34 10 - Refines a 2 handed weapon to +10
+ @refine 16 4 - Refines the body/armor to +4
+@produce <equip name or equip ID> <element> <# of very's>
+ Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
+ It has separately with fragment 3 of the attribute + stars, you can apply.
+ # of very's: 0=None 1=Very Strong 2=Very Very Strong 3=Very Very Very Strong
+ Example: @produce 1163 3 3 - Produces a Very Very Very Strong (Your Nick)'s
+ Fire Claymore
+@repairall = Repair all items of your inventory
+@cleanmap = Clears map of all fallen items
+
+=================================================================================
+ADMINISTRATION COMMANDS
+=================================================================================
+
+@reloaditemdb = Reload item database (admin command)
+@reloadmobdb = Reload monster database (admin command)
+@reloadskilldb = Reload skills definition database (admin command)
+@reloadscript = Reload all scripts (admin command)
+@reloadgmdb = Reload GM levels (admin command)
+@reloadatcommand = Reload GM command levels (admin command)
+@reloadbattleconf = Reload Battle Config(admin command)
+@reloadstatusdb = Reload status database(admin command)
+@reloadpcdb = Reload pc database(admin command)
+
+@loadnpc <path/to/npc> - Load a NPC (admin command)
+@unloadnpc <NPC_name> - Disable a NPC (admin command)
+@shownpc <NPC_name> - Show a hidden NPC (admin command)
+@hidenpc <NPC_name> - Hide a NPC (admin command)
+
+@disguiseall <monster_name/monster_ID/NPC_ID> = Change everybody on the map's appearence to a mob or npc.
+ If using NPC ID 104 Will become an effect.
+ Speed of player will determine effect, be very careful with this ID
+ it can create client crashes with improper ids and can easily lag players
+ off of the server.
+@undisguiseall = Removes all Disguises
+@happyhappyjoyjoy = Random emotions from all players on the map
+@autoloot = All items will go into inventory upon killing a monster
+
+
+@gat = For debugging (you inspect around gat)
+@packet = For debugging (packet variety)
+
+@GM <password> = it becomes GM!
+@email <actual@email> <new@email> = to change your e-mail (characters protection)
+
+@refreshonline = Rechecks to make sure online column is correct (SQL Only)
+
+=================================================================================
+OTHER COMMANDS
+=================================================================================
+
+-----Environmental Commands-----
+
+@night = Uses @option 00 16 00 on all characters. All characters are in darkness
+@day = Uses @option 00 00 00 on all characters.
+
+@rain = Gives Rain effect on activated map
+@snow = Gives Snow effect on activated map
+@sakura = Gives Flower petal effect on activated map
+@clouds = Gives Clouds effect on activated map
+@fog = Gives Foggy effect on activated map
+@fireworks = Gives Fireworks effect on activated map
+@leaves = Gives attumn effect on activated map
+@clearweather = Clears all "weather" effects on the map (Works only when players leave the map and rejoin again)
+
+-----Mail System Commands(SQL)-----
+
+@checkmail = Checks # of messages in your mailbox.
+@listmail = Lists all the messages in your mailbox.
+@listnewmail = Lists all new messages in your mailbox.
+@readmail <#> = Reads a message in your mailbox.
+@deletemail <#> = Deletes a message in your mailbox.
+
+@sendmail <name> <message> = Sends a message to another player. Use quotes if
+ the player has spaces in their name.
+
+@sendprioritymail <name> <message> = Send priority mail to a player.
+
+Use * for name to send to all players.
+
+-----Pet Commands-----
+
+@hatch = Create a pet from your inventory eggs list.
+@makeegg <ID> = Gives pet egg for monster ID in pet DB
+@petfriendly <#> = Set pet friendly amount (0-1000) 0 = Min, 1000 = Max
+@pethungry <#> = Set pet hungry amount (0-100) 0 = Min, 100 = Max
+@petrename = Re-enable pet rename
+
+-----Group Commands-----
+
+@party <party_name> = Create a party
+@guild <guild_name> = Create a guild.
+@guildlvup/@guildlvlup <# of levels> = Raise Guild by desired number of levels
+@guildrecall <guild_name/id> = Warps all online character of a guild to you.
+@partyrecall <party_name/id> = Warps all online character of a party to you.
+
+-----Mute Commands (muting_players must be enabled)-----
+
+@mute/@red <time> <char_name> = Mutes char_name for time period of time.
+@mutearea/@stfu [time] = Mutes area for time, sets defualt to 15.
+
+-----System Commands usually used with scripts-------
+
+@marry <Char 1> <char 2> = Makes 2 target characters married
+@divorce <Char 1> <Char 2> = Divorces 2 characters
+@adopt <Char> = Adopts a player
+
diff --git a/doc/packet_table_en.txt b/doc/packet_table_en.txt
index 63f74dc51..db291032f 100644
--- a/doc/packet_table_en.txt
+++ b/doc/packet_table_en.txt
@@ -1,1336 +1,1336 @@
-here is a translation for "packet_table.txt".
-i leave original japanese sentenses and write translation below that.
-
-
-Ú‚µ‚­‚Í’m‚è‚Ü‚¹‚ñ‚ªAGM‚̓AƒJƒEƒ“ƒgID704554•t‹ß‚ðŽw’è‚·‚é‚Æ
-ƒNƒ‰ƒCƒAƒ“ƒg‚ªGM‚¾‚Æ”FŽ¯‚µ‚Ä•\Ž¦‚·‚é‚Ý‚½‚¢‚Å‚·B
-”Žš‚ª”¼’[‚È‚Ì‚Í‹C‚É‚µ‚È‚¢‚ÅEEE
-
-i don't know for sure, but if you set account id around 704554,
-the ro client recognizes you as GM ( i don't know about other client like
-iro or something. this is talking about jro.)
-
-
-ƒpƒPƒbƒg’·ƒŠƒXƒgB-1‚̓pƒPƒbƒgŽí•Ê‚Ì’¼Œã‚É’·‚³‚ª‚ ‚éƒpƒPƒbƒg
-
-list of packet length. "-1" means a packet that have its packet length
-just after the packet number.
-
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2,
- 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6,
-
- 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0,
- 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
- 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
- 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
-
- 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 3, 2, 27,
- 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
- 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
- 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
-
-
- 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
- 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
- 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
- 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
-
- 22, 14, 6, 10, 23, 19, 6, 39, 6, 7, 6, 27, -1, 2, 6, 6,
- 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
- -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182,
- 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
-
- 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
- 90, 86, 24, 6, 30,102, 8, 4, 8, 4, 14, 10
-
-S ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚Ä‘—M
-S means a packet that will be sent from client.
-
-R ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚ÄŽóM
-R means a packet that will be received by client.
-
-B ƒoƒCƒg
-B means a byte.
-
-w ƒ[ƒh=2B
-w means word( 2 bytes)
-
-l ƒƒ“ƒOƒ[ƒh=4B
-l means long word(4bytes)
-
-* 0ŒÂˆÈã‚­‚è‚©‚¦‚µ
-* means repeat
-
-
-S 0064 <version>.l <account name>.24B <password>.24B <version2>.B
- ƒAƒJƒEƒ“ƒgID&ƒpƒXƒ[ƒh‘—M
- send account id & password
-S 0065 <account ID>.l <login ID1>.l <login ID2>.l ?.2B <sex>.B
- ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±—v‹
- request connection to character select server
-S 0066 <charactor number>.B
- ƒLƒƒƒ‰ƒNƒ^‘I‘ð—v‹
- request to select character
-S 0067 <charactor name>.24B <param etc>.11B
- ƒLƒƒƒ‰ƒNƒ^쬗v‹
- request to create new character
-S 0068 <charactor ID>.l <mail address>.40B
- ƒLƒƒƒ‰ƒNƒ^휗v‹
- request to delete character
-R 0069 <len>.w <login ID1>.l <account ID>.l <login ID2>.l ?.32B <sex>.B {<IP>.l <port>.w <server name>.20B <login users>.l ?.2B}.32B*
- login¬Œ÷&ŽIî•ñ
- information about a success of login to login server
-R 006a <error No>.B
- loginŽ¸”s
- fail to login to login server
-R 006b <len>.w <charactor select data>.106B*
- ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±¬Œ÷&ƒLƒƒƒ‰ƒNƒ^ƒf[ƒ^
- information about a success of connection to character select server & character server
- <charactor select data> = <charactor ID>.l <base exp>.l <zeny>.l <job exp>.l <job level>.l ?.8B <option>.l <karma>.l <manner>.l ?.2B <HP>.w <MaxHP>.w <SP>.w <MaxSP>.w <speed>.w <class>.w <hair>.w <weapon>.2w <base level>.w <skill point>.w <head_bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <name>.24B <STR>.B <AGI>.B <VIT>.B <INT>.B <DEX>.B <LUK>.B <charactor number>.B ?.B
-R 006c <error No>.B
- ƒLƒƒƒ‰ƒNƒ^‘I‘ðŽ¸”s
- fail to select character
-R 006d <charactor select data>.106B
- ƒLƒƒƒ‰ƒNƒ^쬬Œ÷
- success to create new character
-R 006e <error No>.B
- ƒLƒƒƒ‰ƒNƒ^쬎¸”s
- fail to create new character
-R 006f
- ƒLƒƒƒ‰ƒNƒ^휬Œ÷
- success to delete character
-R 0070 <error No>.B
- ƒLƒƒƒ‰ƒNƒ^휎¸”s
- fail to delete character
-R 0071 <charactor ID>.l <map name>.16B <ip>.l <port>.w
- ƒLƒƒƒ‰ƒNƒ^‘I‘ð¬Œ÷&ƒ}ƒbƒv–¼&ƒQ[ƒ€ŽIIP/port
- success to select character & map name and ip/port number for game server
-S 0072 <account ID>.l <charactor ID>.l <login ID1>.l <login ID2>.l <sex>.b
- ƒQ[ƒ€ŽIÚ‘±—v‹
- request connection to game server
-R 0073 <server tick>.l <coordidate>.3B ?.2B
- ƒQ[ƒ€ŽIÚ‘±¬Œ÷&ƒT[ƒo‘¤1msŽžŒv&oŒ»ˆÊ’u
- success to connect to game server & server time & spawn point
-R 0078 <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B
- ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?
- a packet for map load or moving, infermation about a direction for character?
-R 0079 <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_dir>.3B ?.B ?.B
- ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?
- information about characters in a range of a skill like teleport, no infor about direction for character?
-R 007b <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <server tick>.l <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B
- •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ
- character information about walking in a range of the character can see
-R 007c <ID>.l <speed>.w ?.6w <class>.w ?.7w <X_Y>.3B ?.2B
- NPC—p•\Ž¦”͈͓àƒLƒƒƒ‰î•ñ
- character information for npc in a range the character can see
-S 007d
- mapƒ[ƒhI‚è
- end of load
-S 007e <client tick>.l
- ƒNƒ‰ƒCƒAƒ“ƒg‘¤1msƒ^ƒCƒ}‘—M
- send 1ms timer at client
-R 007f <server tick>.l
- ƒT[ƒo‘¤1msƒ^ƒCƒ}‘—M
- send 1ms timer at server
-R 0080 <ID>.l <type>.B
- type=00 ƒLƒƒƒ‰Á–Å (‰æ–ÊŠOˆÚ“®BŽ€‘ÌÁ–Å“™?)
- character disappear( walk out of screen. died and disappear?)
- type=01 ƒLƒƒƒ‰Ž€–S
- character died
- type=02 ƒLƒƒƒ‰Á–Å (ƒeƒŒƒ|,”ˆ,’±,logout“™?)
- character disappear( teleport, fly's wing, butterfly's wing, logout?)
-R 0081 <type>.B
- type=03 speed hack
- speed hack
- type=08 2dƒƒOƒCƒ“
- duplicated login
-S 0085 <X_Y>.3B
- ˆÚ“®—v‹
- request to walk
-R 0087 <server tick>.l <X_Y_X_Y>.5B ?.B
- ˆÚ“®‰ž“š
- response to the request to walk
-R 0088 <ID>.l <X>.w <Y>.w
- ˆÚ“®“r’†’âŽ~
- stop walking
-S 0089 <target ID>.l <type>.B
- type=00 target‚ð1‰ñ‰£‚é
- hit target once
- type=02 À‚é
- sit down
- type=03 —§‚¿ã‚é
- stand up
- type=07 target‚ð‰£‚è‘±‚¯‚é
- continue to hit target
-R 008a <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <type>.B <param3>.w
- type=00 param1=0 miss
- param1=0 miss
- type=00 param1:ƒ_ƒ[ƒW(‚̇Œv?) param2:•ªŠ„” param3:ƒAƒTƒVƒ“2“—¬‹tŽèƒ_ƒ[ƒW
- param1:damage(of total?) param2:number of division param3:damage of assasin's left hand
- NPC‚©‚ç‚ÌUŒ‚‚Ìê‡Aparam2,param3‚̓Sƒ~ƒf[ƒ^
- if the attack was by npc, param2 and param3 are not used
- speed‚ÍPC‚Ìê‡“à•”ASPD‚ƈê’v
- speed match the aspd if it's player character
- type=01 item‚ðE‚¤ ID*2ˆÈŠOƒSƒ~
- pick up item, unused data except ID*2
- type=02 À‚é src IDˆÈŠOƒSƒ~
- sit down, unused data except src ID
- type=03 —§‚ src IDˆÈŠOƒSƒ~
- stand up, unused data except src ID
- type=08 •¡”UŒ‚
- multiple attack
- type=0a ƒNƒŠƒeƒBƒJƒ‹
- critical attack
- type=0b Š®‘S‰ñ”ð
- perfect evade
-R 008c <len>.w <str>.?B
- ’Êí”­Œ¾‘—MBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
- send normal speech. it become a speech for chat during a chat
- 擪‚Ì"<nick> : "‚Ì•”•ª‚̓Nƒ‰ƒCƒAƒ“ƒg‘¤‚Å•t‚¯‚鎖
- client adds "<nick> : " part.
-R 008d <len>.w <ID>.l <str>.?B
- ID‚³‚ñ‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
- receive a speech by ID. it become speech for chat during a chat
-R 008e <len>.w <str>.?B
- Ž©•ª‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
- receive my character's speech. it become speech for chat during a chat
-S 0090 <ID>.l <type?>.B
- NPC‚ɘb‚µ‚©‚¯‚éBtype‚Í01‚µ‚©Œ©‚½Ž––³‚µ
- talk to npc. i havent seen type setted to 01.
-R 0091 <map name>.16B <X>.w <Y>.w
- ŽI“àƒ}ƒbƒvŠÔˆÚ“®AƒeƒŒƒ|,”ˆ“™—p
- map change in the same server, for instance, teleport, fly's wing...
-R 0092 <map name>.16B <X>.w <Y>.w <IP>.l <port>.w
- ŽIŠÔˆÚ“®
- map change to the other server
-R 0093
- 8ŒŽ’†‚É1‰ñ‚¾‚¯ŠÏ‘ªB“ä
- this packet observed in august once. i dont know what it is.
-S 0094 <ID>.l
- ID‚̃Lƒƒƒ‰–¼“™—v‹B0095‚©0195‚Ì•Ô“š‚ª‚ ‚é‚Í‚¸
- request a character name for ID. 0095 or 0195 response is expected.
-R 0095 <ID>.l <nick>.24B
- NPC,ƒMƒ‹ƒh–¢Š‘®PC‚Ì0094‚Ö‚Ì•Ô“š
- response for 0094 request from npc or player character without guild.
- 0193 <charID>.l ‚Å–â‚¢‡‚킹‚Ä
- request by <charID>.l
- 0194 <charID>.l <name>.24B ‚̉ž“š‚Å“¾‚Ä‚Ü‚·B
- get response by <charID>.l <name>.24B
-
-S 0096 <len>.w <nick>.24B <message>.?B
- wis‘—M
- send wisper
-R 0097 <len>.w <nick>.24B <message>.?B
- wisŽóM
- receive wisper
-R 0098 <type>.B
- type=00 wis‘—M¬Œ÷
- success to send wisper
- type=01 wis‘ŠŽè‚ªlogin‚µ‚Ä‚È‚¢?
- target character is not loged in?
- type=02 wis‘ŠŽè‚©‚çignore‚³‚ê‚Ä‚é?
- ignored by target
-R 009a <len>.w <message>.?B
- GM‚©‚ç‚Ì“V‚̺
- GM announce
-S 009b <head dir>.w <dir>.B
- ‘Ì&“ª‚Ì•ûŒü•ÏX—v‹BƒNƒ‰ƒCƒAƒ“ƒg‚ւ̉ž“š‚Í–³‚¢–Í—l
- request a change of head and body direction. no response to client.
- dir‚Í00`07‚Å‘Ì‚ÌŒü‚«B00‚Å–k‚©‚甽ŽžŒv‰ñ‚è‚É45‹’PˆÊ‚Å07‚Ü‚Å
- dir can be 00-07 and it's for body direction. 00 means north and go counter-clockwise upto 07 by 45 degrees.
- head dir‚Í00,01,02‚Å“ª‚ÌŒü‚«B00‚Å‘Ì‚Æ“¯‚¶A01‚ª‰EA02‚ª¶
- head dir can be 00,01,02. 00 means the same direction of body, 01 means right, 02 menas left.
-R 009c <ID>.l <head dir>.w <dir>.B
- ID‚Ì‘Ì&“ª‚Ì•ûŒü•ÏX
- change body and head direction for ID.
-R 009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
- ˆÚ“®“™‚Å°ƒAƒCƒeƒ€‚ª‰æ–Ê“à‚É“ü‚Á‚Ä‚«‚½Žž
- when the item on the floor will appear on the screen by walking etc.
-R 009e <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
- item dropB‰½ŒÌ‚©009d‚ƃ}ƒX–Ú“àˆÊ’u&ŒÂ”‚ª“ü‚ê•Ï‚Á‚Ä‚¢‚é
- item drop. coordinate and amount is different from 009d.
-S 009f <ID>.l
- ID‚Ì°ƒAƒCƒeƒ€‚ðE‚¤
- pick up item on the floor.
-R 00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B
- fail=02 Žæ“¾Ž¸”s?
- fail to pick up?
- fail=06 ƒ‹[ƒgŒ –³‚µBŽæ“¾Ž¸”s
- no right to pick up. fail to pick up.
-R 00a1 <ID>.l
- ID‚Ì°ƒAƒCƒeƒ€Á‹Ž
- disappear the floor item
-S 00a2 <index>.w <amount>.w
- Š—LƒAƒCƒeƒ€‚ð—Ž‚·
- drop inventory item.
-R 00a3 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
- list of consumptive item and collecter item that you have
-R 00a4 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- Š—L‘•”õƒŠƒXƒg
- list of equipments that you have
-R 00a5 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
- list of consumptive item and collecter item that you leave with capra.
-R 00a6 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
- list of equipments that you leave with capra.
-S 00a7 <index>.w <ID>.l
- ŠŽƒAƒCƒeƒ€index‚ðŽg—p‚·‚éBID‚ÍŽ©•ª‚Ì‚Ý?
- use index item. ID can be only myself?
-R 00a8 <index>.w <amount>.w <type>.B
- ƒAƒCƒeƒ€Žg—p‰ž“šBtype=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
- response to use item. type=00 means failed. amount is unused.
- type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
- type=01 means success to use item, amount is a number of rest of the item.
-S 00a9 <index>.w <equip type>.w
- ƒAƒCƒeƒ€‘•”õ
- equip item.
-R 00aa <index>.w <equip point>.w <type>.B
- ƒAƒCƒeƒ€‘•”õ‰ž“šBtype=00‚Ìꇑ•”õŽ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
- response to equip item. type=00 means fail. equip point is unused.
-S 00ab <index>.w
- ‘•”õ‰ðœ
- take off equipment.
-R 00ac <index>.w <equip point>.w <type>.B
- ‘•”õ‰ðœ‰ž“šBtype=00‚Ìꇎ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
- response to take off equipment. type=00 means fail? equip point is unused.
-R 00af <index>.w <amount>.w
- ƒAƒCƒeƒ€”Œ¸­BamountŒÂ‚¾‚¯Œ¸‚ç‚·
- decrease number of item by amount.
-R 00b0 <type>.w <val>.l
- FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
- update values of various status.
- 0000:speed 0003:ˆ«s’l 0004:ƒ}ƒi[ƒ|ƒCƒ“ƒg 0005:HP 0006:MaxHP
- 0000:speed 0003:carma 0004:manner point 0005:HP 0006: MaxHP
- 0007:SP 0008:MaxSP 0009:ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg 000b:ƒx[ƒXƒŒƒxƒ‹
- 0007:SP 0008:MaxSP 0009:status point 000b: base level
- 000c:ƒXƒLƒ‹ƒ|ƒCƒ“ƒg 0018:d—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
- 000c:skil point 0018:weight(this number must be 10 times greater than it's been diplayed.)
- 0019:Å‘åd—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
- 0019:max weight(this number must be 10 times greater than it's been diplayed.)
- 0029:ATK‘O 002a:ATKŒã 002b:MATK‘O 002c:MATKŒã
- 0029:attack in front 002a:attack in back 002b:matk in front 002c:matk in back
- 002d:DEF‘O 002e:DEFŒã 002f:MDEF‘O 0030:MDEFŒã
- 002d:deffence in front 002e:deffence in back 002f:mdef in front 0030:mdef in back
- 0031:HIT 0032:FLEE‘O 0033:FLEEŒã 0034:ƒNƒŠƒeƒBƒJƒ‹
- 0031:hit 0032:flee in front 0033:flee in back 0034: critical
- 0035:ASPD(2ms’PˆÊ‚ÌŽžŠÔ?) 0037:ƒWƒ‡ƒuƒŒƒxƒ‹
- 0035:aspd(time by 2ms?) 0037:job level
- 0082:“ä ATKŒã‚Æ“¯‚¶”Žš?
- 0082:unknown. is it the same number as atk in back?
-R 00b1 <type>.w <val>.l
- FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
- update valies of various status. below is the list of corresponding type and value.
- 0001:ƒx[ƒX‘¤ŒoŒ±’l 0002:ƒWƒ‡ƒu‘¤ŒoŒ±’l 0014:zeny
- 0001:base experience 0002:job experience 0014:zeny
- 0016:ƒx[ƒX‘¤•K—vŒoŒ±’l 0017:ƒWƒ‡ƒu‘¤•K—vŒoŒ±’l
- 0016:base experience that needed to level up 0017:job experience that needed to level up
- ƒÀ1‚Å‚Í00b0‚Íval‚ªshortA00b1‚Íval‚ªlong‚Æ‚¢‚¤Žg‚¢•ª‚¯‚ª‚ ‚Á‚½‚ñ‚¾‚¯‚Ç
- ¡‚Æ‚È‚Á‚Ä‚Í·‚ª–³‚­‚È‚Á‚ÄA–Ó’°‚Ý‚½‚¢‚È‚à‚Ì?
- in beta1, value of 00b0 was short and value of 00b1 was long,
- but not there are no difference.
-S 00b2 <type>.B
- type=00 Ž€–SŽžƒŠƒXƒ^[ƒg
- restart game when character died
- type=01 ƒLƒƒƒ‰ƒZƒŒ—v‹
- request character select
-R 00b3 <type>.B
- type=01 ƒLƒƒƒ‰ƒZƒŒ‰ž“š
- response to character select
-R 00b4 <len>.w <ID>.l <str>.?B
- ID‚ÌNPC‚©‚ç‚̃ƒbƒZ[ƒW
- message from npc id
-R 00b5 <ID>.l
- ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"NEXT"ƒAƒCƒRƒ“‚ðo‚·
- display the "NEXT" icon to npc message window
-R 00b6 <ID>.l
- ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"CLOSE"ƒAƒCƒRƒ“‚ðo‚·
- display the "CLOSE" icon to npc message window
-R 00b7 <len>.w <ID>.l <str>.?B
- ID‚ÌNPC‚̉ï˜b‚Å‘I‘ð€–Ú•\Ž¦BŠe€–Ú‚Í':'‚Å‹æØ‚ç‚ê‚é
- display select options in npc message window. each options devided by ":".
-S 00b8 <ID>.l <select>.B
- ID‚ÌNPC‚̉ï˜b‚Ì‘I‘ðBŠe€–ڂɇ‚É1`‚ªU‚ç‚ê‚éBff‚ŃLƒƒƒ“ƒZƒ‹?
- select options in ncp message window. number starts from 1 for each options. cancel for ff?
-S 00b9 <ID>.l
- ID‚ÌNPC‚Ƃ̉ï˜bBNEXTƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½
- "NEXT" button clicked in ncp message window.
-S 00bb <type>.w <amount>.B
- ƒXƒe[ƒ^ƒXup—v‹Btype‚Í000d‚©‚ç0012‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
- request update status. type can be 000d for STR, 000e for AGI, 000f for VIT, 0010 for INT, 0011 for DEX, 0012 for LUK.
-R 00bc <type>.w <fail>.B <val>.B
- ƒXƒe[ƒ^ƒXup‰ž“šBfail=01‚Ȃ笌÷Btype‚Í00bb‚Æ“¯‚¶Bval‚Íã‚Á‚½Œã‚Ì”Žš
- respnse to update status. it's successeeded if fail=01. type is the same value as packet number 00bb. val is a value of increase.
- Ž¸”s—á‚ÍŒ©‚½Ž––³‚¢‚Ì‚Å“äBƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‘«‚è‚È‚¢ó‘Ô‚Å
- 00bb‚ð”­s‚Å‚«‚éƒNƒ‰ƒCƒAƒ“ƒg‚ª—L‚ê‚ÎAfail=00‚É‚È‚é‚Ì‚Å‚Í‚È‚¢‚©‚Æ—\‘z
- it's unknown when it's failed because i havent ever seen. i think it will be fail=00 when it's failed.
-R 00bd <status point>.w <STR>.B <STRupP>.B <AGI>.B <AGIupP>.B <VIT>.B <VITupP>.B <INT>.B <INTupP>.B <DEX>.B <DEXupP>.B <LUK>.B <LUKupP>.B <ATK>.w <ATKbonus>.w <MATKmax>.w <MATKmin>.w <DEF>.w <DEFbonus>.w <MDEF>.w <MDEFbonus>.w <HIT>.w <FLEE>.w <FLEEbonus>.w <critical>.w ?.w
- ‚܂Ƃ߂ăXƒe[ƒ^ƒXî•ñ‚ð‘—‚éƒpƒPƒbƒg
- packet of information for various status.
-R 00be <type>.w <val>.B
- •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgXVƒpƒPƒbƒgBtype‚Í0020`0025‚ª‡‚ÉSTR`LUK‚ɑΉž
- packet to update required status point. type can be 0020-0025 for STR-LUK.( see packet number 00bb for detals.)
-S 00bf <type>.B
- ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚·Btype‚Í00-0c(,0d)‚ªALT+1`ALT+9,ALT+0,ƒ`ƒ‡ƒL,ƒO[,ƒp[(,ŠØ‘Šø)‚ɑΉž
- display emotion. type can be 00-0c(,0d) for ALT+1-ALT+9,ALT+0,CTRL+-,CTRL++,CTRL+\(,korean flag).
-R 00c0 <ID>.l <type>.B
- ID‚Ìl‚ªƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚½Btype‚Í00bf‚Æ“¯‚¶
- emotion by ID. type is the same as 00bf.
-S 00c1
- loginl”–â‚¢‡‚킹
- request to ask loged in people.
-R 00c2 <val>.l
- loginl”‰ž“š
- response to asking loged in people.
-R 00c3 <ID>.l <type>.B <val>.B
- Œ©‚½–Ú•ÏXBtype‚Í00‚Å–{‘Ì(“]EŽž“™)A02‚ª•ŠíA03‚ª“ª(‰º)A04‚ª“ª(ã)A05‚ª“ª(’†)A08‚ª‚
- change looks. type=00 means body(by jobs), 02 is weapon, 03 is head(lower), 04 is head(upper), 05 is head(middle), 08 is shield.
-R 00c4 <ID>.l
- ˜b‚©‚¯‚½NPC‚ª¤l‚¾‚Á‚½‚Ì‚Åbuy/sell‘I‘ð‘‹o
- display "BUY" or "SELL" window by npc ID
-R 00c5 <ID>.l <type>.B
- buy/sell‘I‘ðBtype=00‚È‚çbuyBtype=01‚È‚çsell
- select "BUY" or "SELL". type=00 is buy, type=01 is sell.
-R 00c6 <len>.w {<value>.l <DCvalue>.l <type>.B <item ID>.w}.11B*
- NPC‚Ì‚¨“Xbuy‘I‘ðŽžBDCvalue‚ͤlDCŒã‚Ì’l’i
- list of marchandizes when clicked "BUY". DCvalue is a value of Discount Skill applied.
-R 00c7 <len>.w {<index>.w <value>.l <OCvalue>.l}.10B*
- NPC‚Ì‚¨“Xsey‘I‘ðŽžBOCvalue‚ͤlOCŒã‚Ì’l’i
- list of items when clicked "SELL". OCvalue is a value of Over Charge Skill applied.
-S 00c8 <len>.w {<amount>.w <item ID>.w}.4B*
- NPC‚Ì‚¨“X‚©‚甃‚¤
- buy item from npc shop.
-S 00c9 <>.w {<index>.w <amount>.w}.4B*
- NPC‚Ì‚¨“X‚É”„‚é
- sell item to npc shop.
-R 00ca <type>.B
- NPC‚©‚çw“üI—¹Btype=00¬Œ÷
- response for buying item. type=00 meanse successetion.
-R 00cb <type>.B
- NPC‚Ö”„‹pI—¹Btype=00¬Œ÷
- response for selling item. type=00 means success.
-S 00cf <nick>.24B <type>.B
- type=00 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/ex nick)
- deny speech from nick(/ex nick).
- type=01 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/in nick)
- allow speech from nick(/in nick)
-S 00d0 <type>len.B
- type=00 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/exall)
- deny all speech(/exall)
- type=01 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/inall)
- allow all speech(/inall)
-R 00d1 <type>.B <fail>.B
- fail=00 ”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
- success to deny speech
- fail=01 ”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
- fail to deny speech
-R 00d2 <type>.B <fail>.B
- fail=00 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
- seccess to allow speech
- fail=01 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
- fail to alloe speech
-S 00d5 <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
- ƒ`ƒƒƒbƒg—§‚ÄB‚±‚±‚©‚çƒ`ƒƒƒbƒgŠÖŒW‚ª‘±‚­‚¯‚Ç’²‚ׂªŠÃ‚¢‚̂ŕ⊮‚æ‚ë
- create chat room.(from now on, im not sure for packets about chat.)
-R 00d6 <fail>.B
- ƒ`ƒƒƒbƒg—§‚ĉž“š
- response to create chat room.
-R 00d7 <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
- ‰æ–Ê“àƒ`ƒƒƒbƒgî•ñ
- information for chat room in the screen.
-R 00d8 <chat ID>.l
- ƒ`ƒƒƒbƒgÁ‹Ž
- delete chat room.
-S 00d9 <chat ID>.l <passwd>.8B
- ƒ`ƒƒƒbƒgŽQ‰Á—v¿
- request to join the chat.
-R 00da <fail>.B
- ƒ`ƒƒƒbƒgŽQ‰ÁŽ¸”s
- fail to join the chat.
-R 00db <len>.w <chat ID>.l {<index>.l <nick>.24B}.28B*
- ƒ`ƒƒƒbƒgŽQ‰ÁŽÒƒŠƒXƒg
- list of people in the chat room.
-R 00dc <users>.w <nick>.24B
- ƒ`ƒƒƒbƒg‚Ö‚ÌŽQ‰ÁŽÒ’ljÁ(?)
- add person to the chat room.
-R 00dd <index>.w <nick>.24B <fail>.B
- ƒ`ƒƒƒbƒg‚©‚çŽQ‰ÁŽÒ”²‚¯
- leave the chat room.
-S 00de <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
- ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX
- change chat room status.
-R 00df <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
- ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX¬Œ÷
- success to change chat room status.
-S 00e0 ?.l <nick>.24B
- ƒ`ƒƒƒbƒgƒ‹[ƒ€Š—LŽÒ•ÏX—v‹?
- request to change owner of the chat room?
-R 00e1 <index>.l <nick>.24B
- ƒ`ƒƒƒbƒgŽQ‰ÁŽÒ”Ô†•t‚¯’¼‚µ?
- re-number people in the chat room?
-S 00e2 <nick>.24B
- ƒ`ƒƒƒbƒgkick
- kick nick from chat room.
-S 00e3
- ƒ`ƒƒƒbƒg”²‚¯
- leave chat room.
-S 00e4 <ID>.l
- Žæ‚èˆø‚«—v‹
- request trade.
-R 00e5 <nick>.24B
- Žæ‚èˆø‚«—v¿Žó‚¯
- recieve a request to trade.
-S 00e6 <type>.B
- type=03 Žæ‚èˆø‚«—v¿ok
- trade ok.
- type=04 Žæ‚èˆø‚«—v¿ƒLƒƒƒ“ƒZƒ‹
- trade canceled.
-R 00e7 <fail>.B
- Žæ‚èˆø‚«—v‹‰ž“š
- response to requesting trade.
- fail=00 ‹——£‚ª‰“‰ß‚¬
- too far.
- fail=03 —v¿Žó‚¯‚Ä‚­‚ꂽ
- allowed the trade.
- fail=04 ƒLƒƒƒ“ƒZƒ‹‚³‚ꂽ?
- trade canceled?
-S 00e8 <index>.w <amount>.l
- ƒAƒCƒeƒ€’ljÁBindex=0‚Åzeny’ljÁB³‹KƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Ízeny‚Í00eb‚Ì’¼‘O‚Ì‚Ý
- add item. index=0 means adding zeny. for official client, zeny can be added only in packet number 00eb.
-R 00e9 <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
- added item from other character.
-R 00ea <index>.w <fail>.B
- fail=00 ƒAƒCƒeƒ€’ljÁ¬Œ÷
- success to add item.
- fail=01 ’ljÁŽ¸”sB‘ŠŽè‘¤d—ʃI[ƒo
- fail to add item. the player was over weighted.
-S 00eb
- ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- completed adding item.(cliecked OK)
-R 00ec <fail>.B
- fail=00 Ž©•ª‚©‚ç‚ÌokŽó—Ì
- recieved "OK" from myself
- fail=01 ‘ŠŽè‚©‚ç‚ÌokŽó—Ì
- recieved "OK" from the other.
-S 00ed
- Žæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹
- trade canceled.
-R 00ee
- Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
- message of "trade canceled"
-S 00ef
- Žæ‚èˆø‚«‹–‘ø(trade‰Ÿ‚µ)
- trade OKed. (cliecked Trade)
-R 00f0
- Žæ‚èˆø‚«Š®—¹
- trade completed.
-R 00f2 <num>.w <limit>.w
- ƒJƒvƒ‰‚³‚ñ‹–—eƒAƒCƒeƒ€ŒÂ”&Œ»ó
- number of item that capra can stock and number of item that capra stocks now.
-S 00f3 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚ɃAƒCƒeƒ€•ú‚èž‚Ý
- put item to capra's warehouse.
-R 00f4 <index>.w <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€’ljÁ
- add item to capra's warehouse.
-S 00f5 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ
- take out item from capra's warehouse.
-R 00f6 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€íœ
- delete item in the capra's warehouse.
-S 00f7
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶
- request to close capra's warehouse.
-R 00f8
- ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶‰ž“š
- response to close capra's warehouse.
-S 00f9 <party name>.24B
- ƒp[ƒeƒBì¬
- create party.
-R 00fa <fail>.B
- fail=00 쬬Œ÷
- success to create party.
-R 00fb <len>.w <party name>.24B {<ID>.l <nick>.24B <map name>.16B <leader>.B <offline>.B}.46B*
- ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‚Ä‘—‚è
- packet for various information about party.
-S 00fc <ID>.l
- ƒp[ƒeƒBŠ©—U‚·‚é
- invate player to the party.
-R 00fd <nick>.24B <fail>.B
- fail=00 ‘ŠŽè‚ÍŠù‚Ƀp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚½
- the player is already in other party.
- fail=01 ‘ŠŽè‚É‹‘”Û‚³‚ꂽ
- invitaion was denied.
- fail=02 Š©—U¬Œ÷
- success to invite,
-R 00fe <ID>.l <party name>.24B
- ƒp[ƒeƒB‚É—U‚í‚ꂽ
- invited to party.
-S 00ff <ID>.l <fail>.l
- ƒp[ƒeƒB‚É—U‚í‚ꂽŽž‚Ì•Ô“šBfail=1 ok•Ô“š?
- response when player was invited to party. fail=1 means OK?
-R 0100
- ? ƒp[ƒeƒBŠÖ˜A?
- unknown. related to party?
-S 0101 <exp>.w <item?>.w
- ƒp[ƒeƒBÝ’è•ÏX
- change party setting.
-R 0102 <exp>.w <item?>.w
- ƒp[ƒeƒBݒ茻ó? exp=2‚Ìꇂ͌ö•½”z•ªÝ’莸”s?
- party setting status. when exp=2, fail to set "equality for experience"?
-R 0104 <ID>.l ?.l <X>.w <Y>.w <offline>.B <party name>.24B <nick>.24B <map name>.16B
- ƒp[ƒeƒB1l•ªî•ñXV
- information about a one player in th party.
-R 0105 <ID>.l <nick>.24B <fail>.B
- nick‚³‚ñ‚ªƒp[ƒeƒB‚©‚ç—£’E
- nick leaves the party.
-R 0106 <ID>,l <HP>.w <MaxHP>.w
- ƒp[ƒeƒBƒƒ“ƒoHPXV
- update HP of party members.
-R 0107 <ID>.l <X>.w <Y>.w
- ƒp[ƒeƒBƒƒ“ƒoˆÊ’uXV
- update coordinates of party members.
-S 0108 <len>.w <message>.?B
- ƒp[ƒeƒB“à”­Œ¾
- send speech for party memebers.
-R 0109 <len>.w <ID>.l <message>.?B
- ƒp[ƒeƒB“à”­Œ¾ŽóM
- receive speech for party memebers.
-R 010a <type ID>.w
- MVPƒAƒCƒeƒ€Žæ“¾
- get MVP item.
-R 010b <exp>.l
- MVPŒoŒ±’lŽæ“¾
- get MVP experience.
-R 010c <ID>.l
- MVPƒLƒƒƒ‰•\Ž¦
- display MVP character.
-R 010e <skill ID>.w <lv>.w <sp>.w <range>.w <up>.B
- ƒXƒLƒ‹î•ñXVBsp‚Í–¢Žg—p?
- update skill sinformation. sp is unused?
-R 010f <len>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
- ƒXƒLƒ‹î•ñ‚̉òBskill name‚͈ꕔ—¬‚ê‚Ä—ˆ‚È‚¢•¨‚ª‚ ‚é„AL_PNEUMA,PR_SLOWPOISON“™
- bunch of information about skill. some of skill name is not send (AL_PNEUMA, PR_SLOWPOISON etc).
- target type‚Í0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•û
- target type is 0 for novice skill, 1 for enemy, 2 for place, 4 for immediate invoke, 16 for party member
- lv=0 up=0‚Ìꇂ̓ŠƒXƒg‚Éo‚µ‚Ä‚È‚¢?
- it will not be on list when lv=0 up=0?
-R 0110 <skill ID>.w <basic type>.w ?.w <fail>.B <type>.B
- fail=00‚ÌŽž‚ɃXƒLƒ‹—˜—pŽ¸”s?
- fail to use skill when fail=00?
- type 00:basic type‚Ì•û 01:SP•s‘« 02:HP•s‘« 03:memo–³‚µ 04:delay’†
- type 00:basic type 01:lack of SP, 02:lack of HP, 03:no memo, 04:in delay
- 05:‚¨‹à–³‚µ(‚ß‚Ü[) 06:•Ší‚ª‚æ‚낵‚­‚È‚¢ 07:ÔƒWƒFƒ€–³‚µ 08:ƒWƒFƒ€–³‚µ 09:“ä
- 05:lack of money, 06:weapon does not satisfy, 07:no red jewel, 08:no blue jewel, 09:unkown
- basic type 00:Žæ‚èˆø‚« 01:emotion 02:À‚è 03:ƒ`ƒƒƒbƒg 04:ƒp[ƒeƒB
- basic type 00:trade 01:emotion 02:sit down, 03:chat, 04:party
- 05:shout? 06:PK 07:ƒ}ƒi[ƒ|ƒCƒ“ƒg
- 05:shout? 06:PK, 07:manner point
-R 0111 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
- 010f‚Ì1‚•ªBƒÀ2‚¾‚Æ–¢Žg—p?
- just one skill information. not used in beta2?
-S 0112 <skill ID>.w
- ƒXƒLƒ‹lvup—v‹
- request to skill level up.
-S 0113 <level>.w <skill ID>.w <ID>.l
- ID‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
- use skill to the target.
-R 0114 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <param3>.w <type>.B
- UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@
- skill effect for attack.
- type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
- rtpe=04 observed when firewall was used. is that the almost same as type=06?
- type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
- type=06 skill for just one hit? param1 is total damage, param2 is level, param3 will always stay 1.
- type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=08 skill for multiple hits? param1 is totak damage, param2 is level, param3 will be a number of hit.
-R 0115 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <X>.w <Y>.w <param1>.w <param2>.w <param3>.w <type>.B
- ’e‚«”ò‚΂µ—L‚èUŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg
- blow up type skill effect.
- type=05 ƒ_ƒ[ƒW&’e‚«”ò‚΂µBparam1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=05 damage and blow up. param1 is total damage, param2 is level, param3 will be a number of hit.
- type=06 ”šS’n? ­‚È‚­‚Æ‚àparam1‚̓Sƒ~‚Ì–Í—l
- type=06 a point of explorsion? param1 is unused at least.
-S 0116 <level>.w <skill ID>.w <X>.w <Y>.w
- (X,Y)‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
- use skill at (X,Y).
-R 0117 <skill ID>.w <src ID>.l <val>.w <X>.w <Y>.w <server tick>.l
- ꊑŠŽè‚̃XƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦Bval‚̓Œƒxƒ‹‚©Aˆê•”ŒÅ‚³?(•X•Ç)
- display skill effect at (X,Y). is val level? or how hard it is (like ice wall)?
-S 0118
- UŒ‚ƒLƒƒƒ“ƒZƒ‹
- cancel to attack
-R 0119 <ID>.l <param1>.w <param2>.w <param3>.w ?.B
- Œ©‚½–Ú•ÏX
- change looks.
- param1=02 ƒtƒƒXƒgƒ_ƒCƒo‚Å“€‚è’Ђ¯?
- param1=02 flozen diva?
- param2=01 “Å?
- param2=01 poison?
- param2=20 ANGELUSó‘Ô?
- param2=20 ANGELUS?
- param3=01 ƒTƒCƒg‚©ƒ‹ƒƒbƒ`?
- param3-01 site or ruwatch? (i dont know skill names in english :()
- param3=0b ƒnƒCƒfƒBƒ“ƒOó‘Ô?
- param3=0b hiding?
- param3=0b ƒNƒ[ƒLƒ“ƒOó‘Ô?
- param3-0b cloking?
- param3=0d ƒJ[ƒg•t‚«
- param3=0d with cart
- param3=0e ‘é•t‚«
- param3-0e with hawk
- param3=0f ƒyƒRƒyƒRæ‚è
- param3=0f with pekopeko
-
-R 011a <skill ID>.w <val>.w <dst ID>.l <src ID>.l <fail>.B
- ”ñƒ_ƒ[ƒWŒnƒXƒLƒ‹•\Ž¦Bƒq[ƒ‹‚Ìê‡val‚͉ñ•œ—Ê
- display no-damage skill effect. val is an amount of HP cured when it's heal.
- fail=00‚Ìꇎ¸”s‚Û‚¢‚ªAƒXƒ`[ƒ‹ˆÈŠO‚Å‚ÍŒ©‚½Ž––³‚µ
- fail=00 must mean fail, but i havent seend it except steal.
-S 011b <skill ID>.w <map name>.16B
- 011c‚ւ̉ž“šBŽg‚í‚È‚¢ê‡"cancel"‚ð‘—‚é
- response to packet number 011c. send "cancel" for no-use.
-R 011c <skill ID>.w <map1>.16B <map2>.16B <map3>.16B <map4>.16B
- ƒeƒŒƒ|/ƒ|ƒ^‚ÌꊑI‘ðB
- select place for teleport or portal warp.
- ƒeƒŒƒ|‚Ìê‡ARandom/ƒZ[ƒuêŠAƒ|ƒ^‚Ìê‡AƒZ[ƒuêŠ/memo1/memo2/memo3‚Æ‚È‚é
- ƒ}ƒbƒv–¼‚Ì‚Ý‘—‚ç‚ê‚é
- in case of teleport, Ramdom/save point will be sent,
- in case of portal warp, save point/memo1/memo2/memo3 will be sent.
- only map name wil be sent.
-S 011d
- Œ»Ý‹‚éŠ‚ðƒƒ‚—v‹
- request to take a memo at this point.
-R 011e <fail>.B
- fail=00 ƒƒ‚¬Œ÷
- success to take memo.
- fail=01 ƒƒ‚Ž¸”s
- fail to take memo.
-R 011f <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B
- ƒXƒLƒ‹Œø”\’nì¬
- create ground effect for skills like firewall.
- type 7e:SW 7f:‰Î•Ç 80:ƒ|ƒ^”­“®’† 81:ƒ|ƒ^”­“®‘O 83:ƒTƒ“ƒN 85:ƒtƒjƒ…[ƒ}
- type 7e:SW, 7f:firewall, 80:portal warp(invoking), 81:portal warp(before invoking), 83:sank, 85:funewma( i really don know skill names :()
- 86:ƒo[ƒ~ƒŠƒIƒ“ 8c:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®Žž 8d:•X•Ç 8e:‚­‚ ‚®‚Ü‚¢‚â[ 91:‚ ‚ñ‚­‚é‚·‚Ë‚ 
- 86: bermillion, 8c:talky box(invoked), 8d:frost diva, 8e:kuagumire, 91:uncle snear
- 93:‚ç‚ñ‚Ç‚Ü‚¢‚ñ 97:?? 99:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®‘O
- 93:land mine, 97:??, 99:talky box(befor invoked)
- ‘¼î•ñ‹‚Þ
-R 0120 <ID>.l
- ƒXƒLƒ‹Œø”\’nÁ‹Ž
- delete ground effect.
-R 0121 <num>.w <num limit>.w <weight>.l <weight limit>l
- ƒJ[ƒg‚ÌŽí—Þ&d‚³‚ÌŒ»Ý’l&ãŒÀ
- kind of cart, weight and max weight.
-R 0122 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
- ƒJ[ƒg“àƒAƒCƒeƒ€B‘•”õ•i
- equipments in cart.
-R 0123 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
- ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
- cunsumptive and collector items in cart.
-R 0124 <index>.w <amount>.l <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
- ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
- add item to cart.
-R 0125 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
- delete item in cart.
-S 0126 <index>.w <amount>.l
- ƒJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚é
- put item to cart.
-S 0127 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðŽæ‚èo‚·
- take out item from cart.
-S 0128 <index>.w <amount>.l
- ƒJƒvƒ‰‚³‚ñ‚©‚çƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
- move item from capra's warehouse to cart.
-S 0129 <index>.w <amount>.l
- ƒJ[ƒg‚©‚çƒJƒvƒ‰‚³‚ñ‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
- move item from cart to capra's warehouse.
-R 012c <fail>.B
- fail=00 d—ʧŒÀ‚ð‰z‚¦‚ăJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½?
- fail=00 over the weight and could not add item to cart.
-R 012d <num>.w
- ˜I“XŠJÝBƒAƒCƒeƒ€ƒŠƒXƒg—v‹Bnum‚Í’u‚¯‚éÅ‘å”
- create shop (marchant skill). request item list. num is a number of kind of item that can be sell.
-S 012e
- ˜I“X•Â½
- close shop.
-S 012f <len>.w <message>.80B {<index>.w <amount>.w <value>.l}.8B*
- ˜I“XŠJÝA˜I“X–¼&ƒAƒCƒeƒ€,’l’iƒŠƒXƒg
- create shop, shop name, item, price list.
-S 0130 <ID>.l
- ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
- request item list for shop( not npc shop).
-R 0131 <ID>.l <message>.80B
- ˜I“XŠÅ”•\Ž¦
- display shop name tag.
-R 0132 <ID>.l
- ˜I“XŠÅ”ÂÁ‹Ž
- delete shop name tag.
-R 0133 <len>.w <ID>.l {<value>.l <amount>.w <index>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B
- ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
- item list for shop(not npc shop).
-S 0134 <len>.w <ID>.l {<amount>.w <index>.w}.4B*
- ˜I“XƒAƒCƒeƒ€w“ü
- buy item from shop (not npc).
-R 0135 <index>.w <amount>.w <fail>.B
- ˜I“XƒAƒCƒeƒ€w“üŽ¸”sBfail‚ÍŒ´ˆö
- fail to buy item from non npc shop. fail tells you reasons.
-R 0136 <len>.w <ID>.l {<value>.l <index>.w <amount>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B*
- ˜I“XŠJݬŒ÷
- success to create non-npc-shop.
-R 0137 <index>.w <amount>.w
- ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
- report of selling item.
-R 0139 <ID>.l <X>.w <Y>.w <X2>.w <Y2>.w <range>.w
- ID‚Ì“G‚Í(X,Y)‚É‹‚ÄŽ©•ª‚Í(X2,Y2)‚É‹‚é‚Ì‚ÅUŒ‚‚ª“Í‚«‚Ü‚¹‚ñ‚Å‚µ‚½
- the enemy at(X,Y) was too far to attack from my coordinate (X2,Y2).
- UŒ‚‰Â”\‹——£‚Írange‚È‚Ì‚ÅA‹ßŠñ‚Á‚ĉº‚³‚¢?
- possible range to attack enemy is "range", so be closer?
-R 013a <val>.w
- UŒ‚ŽË’ö
- attack range.
-R 013b <type>.w
- ŠeŽíƒƒbƒZ[ƒW•\Ž¦B3=–‘•”õ‚Å‚«‚Ü‚µ‚½
- various message. 3="arrow has been equiped"
-R 013c <ID>.w
- ‘•”õ‚³‚ꂽ–î‚ÌItemIDB0‚ÅA–¢‘•”õó‘ÔB
- item id of equiped arrow. 0 means no arrow is equiped.
-R 013d <type>.w <val>.w
- HP‰ñ•œƒXƒLƒ‹/SP‰ñ•œƒXƒLƒ‹‚É‚æ‚é‰ñ•œ
- recovery of HP/SP by HP/SP recovery skill.
- type=5‚È‚çHP type=7‚È‚çSP
- type=5 is HP, type=7 is SP.
-R 013c <index>.w
-@@ ‘•”õ‚µ‚Ä‚¢‚é–î
- id of equiped arrow.
-
-R 013e <src ID>.l <dst ID>.l <X>.w <Y>.w <lv?>.w ?.w <wait>.l
- ƒXƒLƒ‹‰r¥’†BPC/NPC‚ª‘ŠŽè‚ÌꇂÍ(X,Y)‚Í0Bꊂªƒ^[ƒQƒbƒg‚ÌꇂÍdst ID‚Í0‚É‚È‚é
- skill has been casting. (X,Y) will be 0 when target is player character or NPC. dst ID will be 0 when target is place.
-
- 0x013e ‚Ì offset+16(dword) ‚̓XƒLƒ‹‘®«‚Å‚·(’²¸Ï)B
- offset+16(dword) in packet number 0x013e is skill attribute.
-
- 00:–³ 01:… 02:’n 03:‰Î 04:•— 05:“Å 06:¹ 07:ˆÃ 08:”O 09:Ž€
- 00:none, 01:water, 02:ground, 03:fire, 04:wind, 05:poinson, 06:holly, 07:dark, 08:spirit(i don know how to translate.), 09:death
- «—ˆ“I‚ÉA‰r¥’†‚̃GƒtƒFƒNƒg‚ª‘®«‚Å•Ï‚í‚é‚Ì‚©‚ÆB
- casting effect might differ by skill attribute in the future.
-
- wait‚Íms’PˆÊ‚©‚È?
- wait in mili second?
-R 0141 <type>.l <base>.l <bonus>.l
- ƒXƒe[ƒ^ƒXî•ñBtype‚Í0d‚©‚ç12‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
- information for status. type is 0d-12 for STR,AGI,VIT,INT,DEX,LUK.
- base+bonus‚Æ•\Ž¦‚³‚ê‚é
- base+bonus will be displayed.
-R 0144 <ID>.l <type>.l <X>.l <Y>.l <point ID>.B <color>.3B ?.B
- ˆÄ“àˆõ—pAƒ}ƒbƒvãƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg
- for guid npc, packet for display icon on map.
- type=1 ƒAƒCƒRƒ“‚ð•\Ž¦
- display icon.
- type=2 ƒAƒCƒRƒ“‚ðÁ‹Ž
- delete icon.
-R 0145 <file name>.16B <type>.B
- (¡‚ÌŠ)ƒJƒvƒ‰‚³‚ñcutin•\Ž¦
- display capra picture(at this time).
- type=02 •\Ž¦
- display.
- type=ff Á‹Ž
- delete.
-S 0146 <ID>.l
- ID‚ÌNPC‚Ƃ̉ï˜bBCLOSEƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½Back–³‚µ‚ÉNPCƒƒbƒZ[ƒWƒEƒBƒ“ƒh‚𓯎ž‚ɕ‚¶‚é
- talk to npc with ID. Clicked CLOSE button.
-R 0147 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
- ƒAƒCƒeƒ€—˜—p‚ÌŒ‹‰ÊˆêŽž“I‚É“¾‚ç‚ꂽƒXƒLƒ‹î•ñ
- effect for skill by using item.
-S 0148 <ID>.l
- ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Ì‘ŠŽèŒˆ‚ß? @ ƒÀ1
- decide target of a skill rezarection? in beta1.
-S 0149 <ID>.l <type>.B
- ID‚Ƀ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚éBtype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
- give manner point to ID. type=00 is plus, type=01 is minus.
-R 014a <fail>.l
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚½Œ‹‰ÊBfail=0 ¬Œ÷ fail=1 Ž¸”s
- result of giving manner point. fail=0 is success, fail=1 is fail.
-R 014b <type>.B <nick>.24B
- ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð–á‚Á‚½Btype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
- get manner point. type=00 is plus, type-01 is minus.
-R 014C <len>.w (<type>.l <guildID>.l <guild name>.24B).*
- “¯–¿¥“G‘΃Mƒ‹ƒh•\Ž¦
- display alliance and opposition guild.
- type=0 “¯–¿
- alliance.
- type=1 “G‘Î
- opposition.
-S 014D
-@@ ƒMƒ‹ƒhî•ñ•\Ž¦ŠJŽnH
- start of guild information?
-R 014E <type?>.l
-@@ type=0x57 ˆê”ʃMƒ‹ƒh’cˆõ
- normal guild member.
-@@ type=0xD7 ƒMƒ‹ƒhƒ}ƒXƒ^[
- guild master.
-S 014F <page>.l
-@@ ƒMƒ‹ƒh•\Ž¦ƒ^ƒu‘—M
- send packet for guild "DISPLAY" tab.
-R 0150 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l ?.l <next_exp>.l ?.16B <guild name>.24B <guild master>.24B ?.16B
-@@ ƒMƒ‹ƒhî•ñ
- guild info.
-S 0151 <guild ID>.l
- ƒGƒ“ƒuƒŒƒ€—v‹
- request for guild emblem.
-R 0152 <len>.w <guild ID>.l <emblem ID?>.l <emblem data>.?B
- ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW‘—•t
- return emblem image.
-R 0154 <len>.w {<accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l ?.50B <nick>.24B}*
- ƒMƒ‹ƒhƒƒ“ƒoƒŠƒXƒg?
- guild member list?
-S 0159 <guildID>.l <accID>.l <charID>.l <mess>.40B
-@@ ƒMƒ‹ƒh’E‘Þ‘—M
- send packet for leaving guild.
-R 015A <nic>.24B <mess>.40B
-@@ ƒMƒ‹ƒh’E‘Þ(‘Sˆõ)ŽóM
- receive packet for leaving guild(all members).
-S 015B <guildID>.l <accID>.l <charID>.l <mess>.40B
-@@ ƒMƒ‹ƒh’Ç•ú‘—M
- send packet for kicking member out of the guild.
-R 015C <nick>.24B <mess>.40B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B
-@@ ƒMƒ‹ƒh’Ç•úi‘SˆõjŽóM
- receive packet for kicking member out of the guild.(all member)
-R 0163 <len>.w <nick>.24B <accountID>.24B <kicking reason>.40B
-
-S 0165 <myaccID>.l <guild name>.24B
-@@ ƒMƒ‹ƒhì¬
- create guild
-R 0166 <len>.w ?.28B*
- –ðE–¼ƒŠƒXƒg?
- list for roll of members?
-R 0167 <type>.b
- ƒMƒ‹ƒh쬇”Û
- response to vreating guild.
- type = 0 ƒMƒ‹ƒh쬬Œ÷
- success.
- type = 2 “¯–¼‚̃Mƒ‹ƒh‚ª‚ ‚é
- there is a guild with the same name.
-S 0168 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
-@@ ƒMƒ‹ƒhŠ©—U
- invite to the guild.
-R 0169 <type>.B
-@@ ƒMƒ‹ƒhŠ©—U‹‘”Û‚³‚ꂽ
- invitation denied.
-R 016A <guild ID>.l <guild name>.24B
-@@ ƒMƒ‹ƒhŠ©—U‚³‚ꂽ
- invited to the guild.
-S 016B <guild ID>.l <type>.l
-@@ ƒMƒ‹ƒhŠ©—U•ÔM
- response to invitaion for joining to guild.
-@@ type=0 ‹‘”Û‚·‚é
- deny.
-@@ type=1 ‹–‘ø‚·‚é
- OK.
-R 016c <guild ID>.l ?.13B <guild name>.24B
- loginŽžƒMƒ‹ƒhî•ñ
- guild information when loged in.
-R 016d <ID>.l <charactor ID>.l <online>.l
- ƒMƒ‹ƒhƒƒ“ƒo‚ªlogin‚µ‚½”²‚¯‚½“™
- information about guild member loged in or loged out etc.
-R 016f <message>.180B
- ƒMƒ‹ƒh‚¨‘è–Ú?
- guild message?
-S 016E <guildID>.l <mess1>.60B <mess2>.120B
-@@ ƒMƒ‹ƒh’mÝ’è
- set guild announcement.
-R 016F <mess1>.60B <mess2>.120B
-@@ ƒMƒ‹ƒh’m
- guild announcement.
-S 0170 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
-@@ “¯–¿—v¿Š©—U
- invite the guild to be alliance.
-R 0171 <SorceAccID>.l <guild name>.24B
-@@ “¯–¿—v¿Š©—U‚³‚ꂽ
- invited to be a alliance.
-S 0172 <SorceAccID>.l <type>.l
-@@ “¯–¿—v¿•ÔM
- response for invitiation to be alliance.
-@@ type=0 ‹‘”Û‚·‚é
- deny.
-@@ type=1 ‹–‘ø‚·‚é
- OK.
-R 0173 <type>.B
- type = 0 ‚·‚Å‚É“¯–¿ŠÖŒW
- the guild is already alliance.
-@@ type = 1 “¯–¿‹‘”Û‚³‚ꂽ
- denied to be alliance.
-@@ type = 2 “¯–¿¬Œ÷
- success to invite to be alliance.
-R 0177 <len>.w <index>.w*
- ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg
- list of items that need to be judge( i mean unkown items.)
-S 0178 <index>.w
- ƒAƒCƒeƒ€ŠÓ’è
- judge item.
-R 0179 <index>.w <fail>.B
- ƒAƒCƒeƒ€ŠÓ’茋‰ÊBfail=00‚ŬŒ÷Bfail=01‚Á‚Ä‚ ‚é‚Ì‚©?
- response to judging item. fail=00 is success. is there fail=01?
-S 017A <index>.w
-@@ ƒJ[ƒh‚vƒNƒŠƒbƒN
- card is double clicked.
-R 017B <len>.w {<index>.w}*
-@@ ƒJ[ƒh‘}“ü‚Å‚«‚éƒAƒCƒeƒ€Index”Ô†
- item index number for items that can be inserted card.
-S 017C <SrcIndex>.w <DescIndex>.w
-@@ Src ‚ðDesc‚É“Ë‚Áž‚Þ
- insert Src to Desc.
-R 017D <DescIndex>.w <SrcIndex>.w <fail>.b
-@@ Src ‚ðDesc‚É“Ë‚Áž‚Ý<fail> 0=¬Œ÷ 1=Ž¸”sH
- response to insert Src to Desc. fail=0 is success, fail=01 is fail?
-S 017e <len>.w <message>.?B
- ƒMƒ‹ƒh“àƒƒbƒZ[ƒW”­Œ¾
- send speach for guild members.
-R 017f <len>.w <message>.?B
- ƒMƒ‹ƒh“àƒƒbƒZ[ƒWŽóM
- receive guild message.
-R 0182 <accID>.l <charactorID>.l <hair type>.w <hair color>.w <sex?>.w <job>.w <lvl?>.w <experience?>.l <online>.l <Position>.l ?.50B <nick>.24B
-
-R 0187 <account ID>.l
- aliveM†?
- alive signal?
-R 0188 <fail?>.w <index>.w <val>.w
- •Ší¸˜BBŒ‹‰Ê+val•Ší‚É
- weapon refiling. result+val to weapon
-R 0189 ?.w
- “äBƒeƒŒƒ|Ž¸”s?
- unknown. fail to teleport?
-S 018a ?.w
- ƒQ[ƒ€I—¹
- game quited.
-R 018b <fail>.w
- ƒQ[ƒ€I—¹/ƒLƒƒƒ‰ƒZƒŒ‰ž“šBfail=0¬Œ÷Bfail=1Ž¸”s?
- game quited/character select sever response. fail=0 is success, fail=1 is fail?
-R 018C <MonsID>.w <class>.w <size>.w <HP>.w <?>.w <deffence>.w <kind of monster>.w <magic deffence>.w <attribute>.w <anti-attribute?>.9b
- wiz‚Ì“G‚̃Zƒ“ƒXŒ‹‰Ê
- response to sense skill by wizard.
- 0 ¬Œ^
- small
- 1 ’†Œ^
- middle
- 2 ‘åŒ^
- big
-R 0191 <ID>.l <message>.80B
- ƒg[ƒL[ƒ{ƒbƒNƒX‚̃ƒbƒZ[ƒW
- message of talky box.
-S 0193 <ID>.l
- ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«?
- name search for guild member?
-R 0194 <ID>.l <nick>.24B
- ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«‰ž“š?
- response to name search for guild member?
-R 0195 <ID>.l <nick>.24B <party name>.24B <guild name>.24B <class name>.24B
- ƒMƒ‹ƒhŠ‘®PC‚ÌꇂÌ0094•Ô“š
- response to packet number 0094 that if the player joined guild.
-R 0196 <type>.w <ID>.l
- ‘‹­ŒnƒXƒLƒ‹Žg—pŽž‚̃ƒbƒZ[ƒWFXBID‚Ítarget‚ÆŽv‚í‚ê‚邪Ž©•ª‘ŠŽè‚Ì‚Ý‚µ‚©—ˆ‚È‚¢?
- various message of skill that effect status. ID must be target, but only m ID and other's ID are sent?
- type=00 2HQ•t—^uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
- 2HQ casted. "attack speed insreased."
- type=01 2HQ‰ðœuUŒ‚‘¬“x‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- 2HQ ended. "attack speed decreased."
- type=02 IMPOSITIO•t—^u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
- IMPOSITIO casted. "power of the weapon increased."
- type=03 IMPOSITIO‰ðœu•Ší‚ÌUŒ‚—Í‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- IMPOSITIO ened. "power of the weapon decreased."
- type=04 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
- "casting delay become short"
- type=05 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- "casting delay return to defailt"
- type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- "attribute of poison is given to the weapon"
- type=07 ASPERSIO•t—^u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- ASPERSIO casted. "attribute of holly is given to the weapon"
- type=08 ASPERSIO‰ðœu•Ší‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- ASPERSIO ended. "attribute of weapon return to default"
- type=09 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
- "armor got holly attribute"
- type=0a u–h‹ï‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
- "armor's attribute return to default"
- type=0b KYRIE•t—^uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½Bv
- KYRIE casted. "barrier"
- type=0c KYRIE‰ðœuƒoƒŠƒAó‘Ô‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- KYRIE ended. "barrier end"
- type=0d uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- "became weapon ferfection mode"
- type=0e uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- "end weapon perfection mode"
- type=0f uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- "became over trust mode"
- type=10 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- "end over trust mode"
- type=11 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
- "became maximize power mode"
- type=12 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
- "end maximize power mode"
-S 0197 <type>.w
- type=0 /resetstate
- type=1 /resetskill
- Œø”\‚Í–³‚µ?
- no effect?
-R 019b <ID>.l <type>.l
- ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
- display other's level up effect or weapon refiling?
- type=0 base lvup?
- type=1 job lvup?
- type=3 •Ší¸˜B
- weapon refiling
-R 0199 <type>.w
-@@ type=1 pvpƒ‚[ƒhŠJŽn?
- start pvp mode?
-R 019a <ID>.l <rank>.l <num>.l
-@@ pvp‡ˆÊ rank/num
- pvp rank rank/num
-R 019b <ID>.l <type>.l
- ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
- type=0 base lvup?
- type=1 job lvup?
- type=2 •Ší¸˜BŽ¸”s
- type=3 •Ší¸˜B¬Œ÷
-
-R 019d <?>.4B
- GMƒRƒ}ƒ“ƒh/hide
-
-S 00CC <ID>.l
-@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽg—p
- use special right click menu for GM "(name) force to quit"
-
-S 0149 <ID>.l <type>.B <time>.w
-@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð‰º‚°‚éi‰ð‚¯‚éjvŽg—p ¨ type=00
- use special right click menu for GM "decrease prohibited time to create chat room". type=00
-@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ðã‚°‚éiŠ|‚¯‚éjvŽg—p ¨ type=01
- use special right click menu for GM "increase prohibited time to create chat room". type=01
- @time‚Í•ª’PˆÊ‚Å‚·iŠm‚©
- unit is minute (maybe
-
-R 019e
- •ßŠlƒ‚ƒ“ƒXƒ^[Œˆ‚ß
-S 019f <ID>.l
- •ßŠlƒ‚ƒ“ƒXƒ^[Žw’è
-R 01a0 <fail>.B
- •ßŠl”»’è
- fail=01‚ŬŒ÷A00‚ÅŽ¸”s
-S 01a1 <param>.1B
- <param>
- 0x00Fƒyƒbƒgó‘Ô•\Ž¦
- 0x01F‰a‚ð—^‚¦‚é
- 0x02FƒpƒtƒH[ƒ}ƒ“ƒX
- 0x03F—‘‚É–ß‚·
- 0x04FƒAƒNƒZƒTƒŠ‰ðœ
-R 01a2 <pet name>.24B <name flag>.B <lv>.w <hungry>.w <friendly>.w <accessory>.w
- ƒyƒbƒg‚Ìó‘Ô
- name flag:00=–¼‘O–¢Ý’è 01=–¼‘OÝ’èÏ‚Ý(•ÏX•s‰Â)
- lv=ƒyƒbƒg‚̃Œƒxƒ‹Ahungry=–ž• “x(0~100)Afriendly=e–§“x(‰Šú’l250?)Aaccessory=ƒAƒNƒZƒTƒŠ‚ÌItemID
-R 01a3 <fail>.B <itemID>.w
- <fail>
- 0x00F‰a‚â‚莸”s
- 0x01F‰a‚â‚謌÷
-R 01a4 <type>.B <ID>.l <val>.l
- ƒyƒbƒgŠÖ˜A’Ê’m
- type=00,val=00 ƒyƒbƒg›z‰»Žž‚É‘—‚ç‚ê‚Ä‚­‚éBƒyƒbƒg”FŽ¯—pH
- type=01 e–§“x•Ï‰»
- type=02 –ž• “x•Ï‰»
- type=03 ƒAƒNƒZƒTƒŠ•Ï‰»(0‚Å–¢‘•”õ)
- type=04 ƒpƒtƒH[ƒ}ƒ“ƒX Šm”F‚³‚ꂽval=1~3
- (4‚̓XƒyƒVƒƒƒ‹ƒpƒtƒH[ƒ}ƒ“ƒXH)
- type=05 HŠm”F‚³‚ꂽval=0x14
-S 01a5 <pet name>.24B
- ƒyƒbƒg‚Ì–¼‘OŒˆ‚ß
-R 01a6 <len>.w <index>.w*
- ƒyƒbƒg‚Ì—‘ƒŠƒXƒg
-S 01a7 <index>.w
- ƒyƒbƒg‚Ì—‘ƒŠƒXƒg‚ª‘I‘ð‚³‚ê‚½
-S 01a9 <emotion>.l
- ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“‘—M
-R 01aa <ID>.l <emotion>.l
- ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“ŽóM
- <emotion>
- 33ˆÈ‰º‚Ì‚Æ‚«FƒGƒ‚[ƒVƒ‡ƒ“
- 34ˆÈã‚Ì‚Æ‚«F”­Œ¾ƒe[ƒuƒ‹H
-R 01ac <object id>.l
- ƒAƒ“ƒNƒ‹‚Ì”­“®(‚Ý’u)Žž‚Ì‚Ý–ˆ‰ñoŒ»(‹@”\‚Í“ä)
-R 01ad <len>.l <item>.w
- –îì‚è‚Ì쬉”\ITEM•\ŽóM
-S 01ae <itemID>.w
- –îì‚è‚ÅŽg‚¤Þ—¿‘—M
-S 01af <type>.w
- ƒ`ƒFƒ“ƒWƒJ[ƒgiƒJ[ƒg‘I‘ðj
- type=1 ƒm[ƒ}ƒ‹ƒJ[ƒg
-R 01b0 <monster id>.l <?>.b <new monster code>.l
- –û‚̃Nƒ‰ƒXƒ`ƒFƒ“ƒW
- <new monster code>‚̓`ƒFƒ“ƒWŒã‚̃R[ƒh(1001`)‚ðdword‚Å
-S 01b2 <len>.w <message>.80B <flag>.B {<index>.w <amount>.w <value>.l}.8B*
- ˜I“XŠJÝ
- flag F 0=ƒLƒƒƒ“ƒZƒ‹ , 1=ƒI[ƒvƒ“
-R 01b3 <filename>.64B <type>.B
- R 0145‚ÌãˆÊŒÝŠ·
-R 01B6 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l <now_exp>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«ŒüF-V>.l <«ŒüR-W>.l <members>.l <guild name>.24B <guild master>.24B <agit?>.20B
- ƒMƒ‹ƒhî•ñ
-R 01b9 <ID>.I
- ”íƒ_ƒ“™‚É‚æ‚éID‚̉r¥’†’f
-
-R 01c0
- Some request for some status. Signature of sakexes later than 628. Used to send friends list.
- Probably can be used to tell the player that his sakexe is not the latest version.
-
-R 01c4 <index>.w <amount>.l <itemID>.w <item data>.12B
- ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€
-R 01c8 <index>.w <item ID>.w <ID>.l <amount left>.w <type>.B
- ƒAƒCƒeƒ€Žg—p‰ž“šB(00a8‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
- type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
-R 01c9 <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B ?.81b
- ƒXƒLƒ‹Œø”\’nì¬(011f‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type 0x7e:SWA0x7f:‰Î•ÇA0x80 ƒ|ƒ^ŠJ‚«’†A0x81 ƒ|ƒ^ŠJ‚«’¼‘O
- 0x82 ¹‘ÌA0x83 ƒTƒ“ƒNA0x84 ƒ}ƒOƒkƒXA0x85 ƒjƒ…[ƒ}
- 0x86 0x86 ‘å–‚–@(SG/MS/LoV/GX)A0x87 ƒtƒ@ƒCƒ„[ƒsƒ‰‘Ò‹@
- 0x88 ƒtƒ@ƒCƒ„[ƒsƒ‰”š”­A0x87`0x8B •\Ž¦–³‚µA
- 0x8c ƒg[ƒL[ƒ{ƒbƒNƒX(”­“®’†)A0x8D ƒAƒCƒXƒEƒH[ƒ‹
- 0x8E ƒNƒƒOƒ}ƒCƒAA0x8f ƒuƒ‰ƒXƒgƒ}ƒCƒ“A0x90 ƒXƒLƒbƒh
- 0x91 ƒAƒ“ƒNƒ‹A0x92 ƒxƒmƒ€ƒ_ƒXƒgA0x93 ƒ‰ƒ“ƒhƒ}ƒCƒ“
- 0x94 ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒvA0x95 ƒTƒ“ƒhƒ}ƒ“
- 0x96 ƒtƒ‰ƒbƒVƒƒ[A0x97 ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv
- 0x98 ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA0x99 ƒg[ƒL[ƒ{ƒbƒNƒX
- 0x9A ƒ{ƒ‹ƒP[ƒmA0x9B ƒfƒŠƒ…[ƒWA0x9C ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- 0x9D ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[A0x9E Zenyƒ}[ƒNA0x9F Zeny‘Ü
- 0xA0 ‰ñ‚é—΂̗ÖA0xA1 ƒsƒ“ƒN‚̉¹•„ (“ñ˜A•„—L‚è
- 0xA2 ^‚ñ’†‚É“_‚Ì‚ ‚éŒõ‚Ì‹ÊA0xA3 ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒO
- 0xA4 [•£‚Ì’†‚ÉA0xA5 ‰ñ‚é‚¢—ÖA0xA6 •s‹¦˜a‰¹
- 0xA7 Œû“JA0xA8 —[—z‚̃AƒTƒVƒ“ƒNƒƒXA0xA9 ƒuƒ‰ƒM‚ÌŽ
- 0xAA ƒCƒhƒDƒ“‚Ì—ÑŒçA0xAB Ž©•ªŸŽè‚ȃ_ƒ“ƒXA0xAC ƒnƒ~ƒ“ƒO
- 0xAD Ž„‚ð–Y‚ê‚È‚¢‚ÅcA0xAE ƒT[ƒrƒXƒtƒH[ƒ†[
- 0xAF ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒOA0xB0 •\Ž¦–³‚µ
- 0xB0 ƒOƒ‰ƒtƒBƒeƒB,
- 0xB1 ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“A0xB2`0xBF •\Ž¦–³‚µ
- 0xB2 ƒsƒ“ƒN‚̃[ƒvƒ|[ƒ^ƒ‹•—
- 0xB3 ¬‚³‚È\Žš‰Ë‚ª‚Ó‚æ‚Ó‚æ
- 0xB4 ƒoƒWƒŠƒJA0xB5 ƒGƒtƒFƒNƒg‚È‚µH
- 0xB6 •‚¢~‚ª—§‘Ì“I‚É•‚‚©‚Ñオ‚é
- 0xB7 ƒNƒ‚‚Ì‘ƒA0xB8` ƒGƒtƒFƒNƒg‚È‚µH
-
- ‘¼î•ñ‹‚Þ
- ?.81b‚Í“äB
-R 01cd (<sid>.l)x7
- ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆŽóM
- <sid>x7 ‚É‚Í NB,CB,FB,LB,SS,FBL,FD ‚̇‚ŃXƒLƒ‹ƒR[ƒh‚ªdword‚Å“ü‚é
- ‚Ü‚¾‘I‘ð‚Å‚«‚È‚¢ƒXƒLƒ‹‚Ì•”•ª‚Í <sid> = 0x00000000 ‚ª“ü‚é
-S 01ce <sid>.l
- ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆ‘—M
-R 01cf <crusader id>.l <target id>.l <?>.18b
- Œ£gó‘Ôƒ^[ƒQƒbƒgON/OFFBŒ£g‚ªØ‚ê‚é‚Æ <target id> ‚ª 0x00000000 ‚É‚È‚é
-
-R 01d0 <ID>.l <num>.w
- <num> : ‹CŒ÷‚Ì”(”ñLv)
-R 01d1 <monk id>.l <target monster id>.l <bool>.l
- ”’‰HŽæ‚èó‘ÔON/OFFB<bool> ‚Í”’nŽæ‚謗§Žž‚É 0x00000001 ‰ðœŽž‚É 0x00000000 ‚ª—ˆ‚é
-R 01d2 <id>.l <delay>.l
- ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC(msec)
- ŽO’iE˜A‘Å‚ÍŠî–{ƒfƒBƒŒƒC1000(+300)A–Ò—´‚ÍŠî–{ƒfƒBƒŒƒC700(+300)
-R 01d4 <ID>.l
- •¶Žš—ñ“ü—Í‘‹•\Ž¦(ID‚ÍNPC‚ÌID‚ª“ü‚é)
-S 01d5 <len>.w <ID>.l <input>.?B 00
- •¶Žš—ñ“ü—Í“à—e‘—M(ID‚ÍNPC‚ÌID‚ª“ü‚é)
-R 01d7 <ID>.l <equip point>.b <item id1>.w <item id2>.w
- ‘•”õƒOƒ‰ƒtƒBƒbƒN <equip point> ‚Í 02Žè‚Æ09‘«‚Ì‚ÝŠm”FBid2‚ͶŽè
-R 01d8 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w <head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B ?.B
- ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?(0078‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-R 01d9 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w.<head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B ?.B
- ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?(0079‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-R 01da <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.<item id1>.w <item id2>.w <head option bottom>.w <server tick>.l <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B ?.B
- •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ(007b‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
-S 01db
- ˆÃ†‰»key—v‹
-R 01dc <len>.w <key>.?B
- ˆÃ†‰»key‘—•t
-S 01dd <version>.l <account name>.24B <md5 binary>.16B <version2>.1B
- id&ˆÃ†‰»Ï‚Ýpass‘—M
- ‡‚ɃNƒ‰ƒCƒAƒ“ƒg‚ª01db‚ð‘—‚éA
- ŽI‚ª01dc‚Åkey‚ð•Ô‚·A
- ƒNƒ‰ƒCƒAƒ“ƒg‚ª"<key><password>"‚ɂ‚¢‚Ämd5ŒvŽZ‚µ
- <md5 binary>‚ÌŠ‚ð–„‚ß‚Ä01dd‚ð‘—‚éB
- <passwordencrypt2>‚ÌŽž‚Í
- "<key><password>"‚ɑ΂µ‚Ämd5ŒvŽZ‚Æ‚µ‚Ä‚¢‚銂ð
- "<password><key>"‚Æ•ÏX‚·‚é
-R 01de <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.l <param2>.w <param3>.w <type>.B
- UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@(0114‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
- type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
- type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
- type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
- type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
- type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
- type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
-S 01df <ID>.|
- GM‰EƒNƒŠƒbƒN‚É‚æ‚éID‚̃`ƒƒƒbƒg‹ÖŽ~‰ñ”ŽQÆH
-R 01e1 <ID>.l <num>.w
- <num> : ‹CŒ÷‚Ì”(”ñLv) ˆê“x•\Ž¦‚µ‚½‚çŒã‚Ç‚ñ‚Ènum‚ª—ˆ‚Ä‚à–³Ž‹‚³‚ê‚éB
-R 01e6 <partner name>.24B
- Œ‹¥ƒXƒLƒ‹‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž‚Ì‹©‚Ѻ
-S 01e7
- ƒXƒpƒmƒr‚Å/doridori‚µ‚½‚ç”ò‚ñ‚Å‚­‚éBSPR‰ñ•œ—Ê2”{ƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
-S 01e8 <party name>.24B <item1>B <item2>B
- <item1>ƒAƒCƒeƒ€ŽûW•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒBŒö—L
- <item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒB‚É‹Ï“™•ª”z
- (00f9‚ÌãˆÊƒo[ƒVƒ‡ƒ“)
-R 01ea <ID>.l
- Œ‹¥ƒGƒtƒFƒNƒg(‰¹ŠyAŽ†á)
- ID‚ÍV•w‚Ì‚à‚Ì‚ª“ü‚éH
-S 01ed
- ƒXƒpƒmƒr‚ª”š—ô”g“®‚É‚È‚éƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
-R 01ee <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
- –î‚ÌꇂÍ?.2B‚ª0x8000‚É‚È‚é
- 00a3‚©‚ç•ÏX
-R 01ef <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
- 0123‚©‚ç•ÏX
-R 01f0 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
- ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
- 00a5‚©‚ç•ÏX
-R 01f4 <name>.24B <trade id?>.L <LV>.w
- æ•û‚©‚çŽæˆø—v¿
- 00e5‚©‚ç•ÏX
-R 01f5 <result>.B <trade id?>.L <LV>.w
- ‚±‚¿‚ç‚©‚ç‚ÌŽæˆø—v¿‚ɑ΂·‚锽‰ž
- 00e7‚©‚ç•ÏX
-S 0200 <login name>.24B
- ragexe‚É/accountƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚Ä‹N“®‚·‚é‚ƃƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒg
-
-R 0201 ?.1B<Flag?>.1B (?.8B <Character Name>.24B)x20
- Flag seems to need to be 1 to function.
- 8 unknown bytes and 24 bytes for name need to be repeated for each friend.
-
-S 0202 <Character name>.24B
- Character name to add to friend list (for server-side friend list enabled clients)
-
-R 0203 <Account ID>.3B <Unknown>.3B
- Account ID = zero terminated 3-word hex representation of account ID. Little endian.
- Unknown = observed dependency on online/offline status
-
-S 0204 <?>.16B
- ƒƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB16ƒoƒCƒg‚͌ŒèH
-S 020B <?>.17B
- ƒLƒƒƒ‰ƒNƒ^ƒT[ƒoÚ‘±—v‹0065‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB1+0204‚Ì16ƒoƒCƒg‚Å17ƒoƒCƒgH
-
-
-ƒpƒPƒbƒg’·‚̒ljÁB019e`01aa‚ª‘‚¦‚Ä‚é‚Ì‚ÅA0190`‚ð؂蔲‚«
-added packet lenth. 019e-01aa is a new, so here is a packet length table from 0190.
-
-@ 90, 86, 24,@6, 30,102,@8,@4,@ 8,@4, 14, 10, -1,@6,@2,@6,
-@@3,@3, 35,@5, 11, 26, -1,@4,@ 4,@6, 10
+here is a translation for "packet_table.txt".
+i leave original japanese sentenses and write translation below that.
+
+
+Ú‚µ‚­‚Í’m‚è‚Ü‚¹‚ñ‚ªAGM‚̓AƒJƒEƒ“ƒgID704554•t‹ß‚ðŽw’è‚·‚é‚Æ
+ƒNƒ‰ƒCƒAƒ“ƒg‚ªGM‚¾‚Æ”FŽ¯‚µ‚Ä•\Ž¦‚·‚é‚Ý‚½‚¢‚Å‚·B
+”Žš‚ª”¼’[‚È‚Ì‚Í‹C‚É‚µ‚È‚¢‚ÅEEE
+
+i don't know for sure, but if you set account id around 704554,
+the ro client recognizes you as GM ( i don't know about other client like
+iro or something. this is talking about jro.)
+
+
+ƒpƒPƒbƒg’·ƒŠƒXƒgB-1‚̓pƒPƒbƒgŽí•Ê‚Ì’¼Œã‚É’·‚³‚ª‚ ‚éƒpƒPƒbƒg
+
+list of packet length. "-1" means a packet that have its packet length
+just after the packet number.
+
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2,
+ 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6,
+
+ 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0,
+ 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
+ 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
+ 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
+
+ 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 3, 2, 27,
+ 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
+ 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
+ 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
+
+
+ 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
+ 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
+ 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
+ 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
+
+ 22, 14, 6, 10, 23, 19, 6, 39, 6, 7, 6, 27, -1, 2, 6, 6,
+ 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
+ -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182,
+ 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
+
+ 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
+ 90, 86, 24, 6, 30,102, 8, 4, 8, 4, 14, 10
+
+S ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚Ä‘—M
+S means a packet that will be sent from client.
+
+R ƒNƒ‰ƒCƒAƒ“ƒg‚©‚猩‚ÄŽóM
+R means a packet that will be received by client.
+
+B ƒoƒCƒg
+B means a byte.
+
+w ƒ[ƒh=2B
+w means word( 2 bytes)
+
+l ƒƒ“ƒOƒ[ƒh=4B
+l means long word(4bytes)
+
+* 0ŒÂˆÈã‚­‚è‚©‚¦‚µ
+* means repeat
+
+
+S 0064 <version>.l <account name>.24B <password>.24B <version2>.B
+ ƒAƒJƒEƒ“ƒgID&ƒpƒXƒ[ƒh‘—M
+ send account id & password
+S 0065 <account ID>.l <login ID1>.l <login ID2>.l ?.2B <sex>.B
+ ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±—v‹
+ request connection to character select server
+S 0066 <charactor number>.B
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ð—v‹
+ request to select character
+S 0067 <charactor name>.24B <param etc>.11B
+ ƒLƒƒƒ‰ƒNƒ^쬗v‹
+ request to create new character
+S 0068 <charactor ID>.l <mail address>.40B
+ ƒLƒƒƒ‰ƒNƒ^휗v‹
+ request to delete character
+R 0069 <len>.w <login ID1>.l <account ID>.l <login ID2>.l ?.32B <sex>.B {<IP>.l <port>.w <server name>.20B <login users>.l ?.2B}.32B*
+ login¬Œ÷&ŽIî•ñ
+ information about a success of login to login server
+R 006a <error No>.B
+ loginŽ¸”s
+ fail to login to login server
+R 006b <len>.w <charactor select data>.106B*
+ ƒLƒƒƒ‰ƒZƒŒŽIÚ‘±¬Œ÷&ƒLƒƒƒ‰ƒNƒ^ƒf[ƒ^
+ information about a success of connection to character select server & character server
+ <charactor select data> = <charactor ID>.l <base exp>.l <zeny>.l <job exp>.l <job level>.l ?.8B <option>.l <karma>.l <manner>.l ?.2B <HP>.w <MaxHP>.w <SP>.w <MaxSP>.w <speed>.w <class>.w <hair>.w <weapon>.2w <base level>.w <skill point>.w <head_bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <name>.24B <STR>.B <AGI>.B <VIT>.B <INT>.B <DEX>.B <LUK>.B <charactor number>.B ?.B
+R 006c <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ðŽ¸”s
+ fail to select character
+R 006d <charactor select data>.106B
+ ƒLƒƒƒ‰ƒNƒ^쬬Œ÷
+ success to create new character
+R 006e <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^쬎¸”s
+ fail to create new character
+R 006f
+ ƒLƒƒƒ‰ƒNƒ^휬Œ÷
+ success to delete character
+R 0070 <error No>.B
+ ƒLƒƒƒ‰ƒNƒ^휎¸”s
+ fail to delete character
+R 0071 <charactor ID>.l <map name>.16B <ip>.l <port>.w
+ ƒLƒƒƒ‰ƒNƒ^‘I‘ð¬Œ÷&ƒ}ƒbƒv–¼&ƒQ[ƒ€ŽIIP/port
+ success to select character & map name and ip/port number for game server
+S 0072 <account ID>.l <charactor ID>.l <login ID1>.l <login ID2>.l <sex>.b
+ ƒQ[ƒ€ŽIÚ‘±—v‹
+ request connection to game server
+R 0073 <server tick>.l <coordidate>.3B ?.2B
+ ƒQ[ƒ€ŽIÚ‘±¬Œ÷&ƒT[ƒo‘¤1msŽžŒv&oŒ»ˆÊ’u
+ success to connect to game server & server time & spawn point
+R 0078 <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B
+ ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?
+ a packet for map load or moving, infermation about a direction for character?
+R 0079 <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_dir>.3B ?.B ?.B
+ ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?
+ information about characters in a range of a skill like teleport, no infor about direction for character?
+R 007b <ID>.l <speed>.w ?.w ?.w <option>.w <class>.w <hair>.w <weapon>.w <head option bottom>.w <server tick>.l <sheild>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.w ?.w ?.w <manner>.w <karma>.w ?.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B
+ •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ
+ character information about walking in a range of the character can see
+R 007c <ID>.l <speed>.w ?.6w <class>.w ?.7w <X_Y>.3B ?.2B
+ NPC—p•\Ž¦”͈͓àƒLƒƒƒ‰î•ñ
+ character information for npc in a range the character can see
+S 007d
+ mapƒ[ƒhI‚è
+ end of load
+S 007e <client tick>.l
+ ƒNƒ‰ƒCƒAƒ“ƒg‘¤1msƒ^ƒCƒ}‘—M
+ send 1ms timer at client
+R 007f <server tick>.l
+ ƒT[ƒo‘¤1msƒ^ƒCƒ}‘—M
+ send 1ms timer at server
+R 0080 <ID>.l <type>.B
+ type=00 ƒLƒƒƒ‰Á–Å (‰æ–ÊŠOˆÚ“®BŽ€‘ÌÁ–Å“™?)
+ character disappear( walk out of screen. died and disappear?)
+ type=01 ƒLƒƒƒ‰Ž€–S
+ character died
+ type=02 ƒLƒƒƒ‰Á–Å (ƒeƒŒƒ|,”ˆ,’±,logout“™?)
+ character disappear( teleport, fly's wing, butterfly's wing, logout?)
+R 0081 <type>.B
+ type=03 speed hack
+ speed hack
+ type=08 2dƒƒOƒCƒ“
+ duplicated login
+S 0085 <X_Y>.3B
+ ˆÚ“®—v‹
+ request to walk
+R 0087 <server tick>.l <X_Y_X_Y>.5B ?.B
+ ˆÚ“®‰ž“š
+ response to the request to walk
+R 0088 <ID>.l <X>.w <Y>.w
+ ˆÚ“®“r’†’âŽ~
+ stop walking
+S 0089 <target ID>.l <type>.B
+ type=00 target‚ð1‰ñ‰£‚é
+ hit target once
+ type=02 À‚é
+ sit down
+ type=03 —§‚¿ã‚é
+ stand up
+ type=07 target‚ð‰£‚è‘±‚¯‚é
+ continue to hit target
+R 008a <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <type>.B <param3>.w
+ type=00 param1=0 miss
+ param1=0 miss
+ type=00 param1:ƒ_ƒ[ƒW(‚̇Œv?) param2:•ªŠ„” param3:ƒAƒTƒVƒ“2“—¬‹tŽèƒ_ƒ[ƒW
+ param1:damage(of total?) param2:number of division param3:damage of assasin's left hand
+ NPC‚©‚ç‚ÌUŒ‚‚Ìê‡Aparam2,param3‚̓Sƒ~ƒf[ƒ^
+ if the attack was by npc, param2 and param3 are not used
+ speed‚ÍPC‚Ìê‡“à•”ASPD‚ƈê’v
+ speed match the aspd if it's player character
+ type=01 item‚ðE‚¤ ID*2ˆÈŠOƒSƒ~
+ pick up item, unused data except ID*2
+ type=02 À‚é src IDˆÈŠOƒSƒ~
+ sit down, unused data except src ID
+ type=03 —§‚ src IDˆÈŠOƒSƒ~
+ stand up, unused data except src ID
+ type=08 •¡”UŒ‚
+ multiple attack
+ type=0a ƒNƒŠƒeƒBƒJƒ‹
+ critical attack
+ type=0b Š®‘S‰ñ”ð
+ perfect evade
+R 008c <len>.w <str>.?B
+ ’Êí”­Œ¾‘—MBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+ send normal speech. it become a speech for chat during a chat
+ 擪‚Ì"<nick> : "‚Ì•”•ª‚̓Nƒ‰ƒCƒAƒ“ƒg‘¤‚Å•t‚¯‚鎖
+ client adds "<nick> : " part.
+R 008d <len>.w <ID>.l <str>.?B
+ ID‚³‚ñ‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+ receive a speech by ID. it become speech for chat during a chat
+R 008e <len>.w <str>.?B
+ Ž©•ª‚Ì”­Œ¾ŽóMBƒ`ƒƒƒbƒg’†‚̓`ƒƒƒbƒg“à”­Œ¾—p‚É‚È‚é
+ receive my character's speech. it become speech for chat during a chat
+S 0090 <ID>.l <type?>.B
+ NPC‚ɘb‚µ‚©‚¯‚éBtype‚Í01‚µ‚©Œ©‚½Ž––³‚µ
+ talk to npc. i havent seen type setted to 01.
+R 0091 <map name>.16B <X>.w <Y>.w
+ ŽI“àƒ}ƒbƒvŠÔˆÚ“®AƒeƒŒƒ|,”ˆ“™—p
+ map change in the same server, for instance, teleport, fly's wing...
+R 0092 <map name>.16B <X>.w <Y>.w <IP>.l <port>.w
+ ŽIŠÔˆÚ“®
+ map change to the other server
+R 0093
+ 8ŒŽ’†‚É1‰ñ‚¾‚¯ŠÏ‘ªB“ä
+ this packet observed in august once. i dont know what it is.
+S 0094 <ID>.l
+ ID‚̃Lƒƒƒ‰–¼“™—v‹B0095‚©0195‚Ì•Ô“š‚ª‚ ‚é‚Í‚¸
+ request a character name for ID. 0095 or 0195 response is expected.
+R 0095 <ID>.l <nick>.24B
+ NPC,ƒMƒ‹ƒh–¢Š‘®PC‚Ì0094‚Ö‚Ì•Ô“š
+ response for 0094 request from npc or player character without guild.
+ 0193 <charID>.l ‚Å–â‚¢‡‚킹‚Ä
+ request by <charID>.l
+ 0194 <charID>.l <name>.24B ‚̉ž“š‚Å“¾‚Ä‚Ü‚·B
+ get response by <charID>.l <name>.24B
+
+S 0096 <len>.w <nick>.24B <message>.?B
+ wis‘—M
+ send wisper
+R 0097 <len>.w <nick>.24B <message>.?B
+ wisŽóM
+ receive wisper
+R 0098 <type>.B
+ type=00 wis‘—M¬Œ÷
+ success to send wisper
+ type=01 wis‘ŠŽè‚ªlogin‚µ‚Ä‚È‚¢?
+ target character is not loged in?
+ type=02 wis‘ŠŽè‚©‚çignore‚³‚ê‚Ä‚é?
+ ignored by target
+R 009a <len>.w <message>.?B
+ GM‚©‚ç‚Ì“V‚̺
+ GM announce
+S 009b <head dir>.w <dir>.B
+ ‘Ì&“ª‚Ì•ûŒü•ÏX—v‹BƒNƒ‰ƒCƒAƒ“ƒg‚ւ̉ž“š‚Í–³‚¢–Í—l
+ request a change of head and body direction. no response to client.
+ dir‚Í00`07‚Å‘Ì‚ÌŒü‚«B00‚Å–k‚©‚甽ŽžŒv‰ñ‚è‚É45‹’PˆÊ‚Å07‚Ü‚Å
+ dir can be 00-07 and it's for body direction. 00 means north and go counter-clockwise upto 07 by 45 degrees.
+ head dir‚Í00,01,02‚Å“ª‚ÌŒü‚«B00‚Å‘Ì‚Æ“¯‚¶A01‚ª‰EA02‚ª¶
+ head dir can be 00,01,02. 00 means the same direction of body, 01 means right, 02 menas left.
+R 009c <ID>.l <head dir>.w <dir>.B
+ ID‚Ì‘Ì&“ª‚Ì•ûŒü•ÏX
+ change body and head direction for ID.
+R 009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
+ ˆÚ“®“™‚Å°ƒAƒCƒeƒ€‚ª‰æ–Ê“à‚É“ü‚Á‚Ä‚«‚½Žž
+ when the item on the floor will appear on the screen by walking etc.
+R 009e <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
+ item dropB‰½ŒÌ‚©009d‚ƃ}ƒX–Ú“àˆÊ’u&ŒÂ”‚ª“ü‚ê•Ï‚Á‚Ä‚¢‚é
+ item drop. coordinate and amount is different from 009d.
+S 009f <ID>.l
+ ID‚Ì°ƒAƒCƒeƒ€‚ðE‚¤
+ pick up item on the floor.
+R 00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B
+ fail=02 Žæ“¾Ž¸”s?
+ fail to pick up?
+ fail=06 ƒ‹[ƒgŒ –³‚µBŽæ“¾Ž¸”s
+ no right to pick up. fail to pick up.
+R 00a1 <ID>.l
+ ID‚Ì°ƒAƒCƒeƒ€Á‹Ž
+ disappear the floor item
+S 00a2 <index>.w <amount>.w
+ Š—LƒAƒCƒeƒ€‚ð—Ž‚·
+ drop inventory item.
+R 00a3 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ list of consumptive item and collecter item that you have
+R 00a4 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ Š—L‘•”õƒŠƒXƒg
+ list of equipments that you have
+R 00a5 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ list of consumptive item and collecter item that you leave with capra.
+R 00a6 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
+ list of equipments that you leave with capra.
+S 00a7 <index>.w <ID>.l
+ ŠŽƒAƒCƒeƒ€index‚ðŽg—p‚·‚éBID‚ÍŽ©•ª‚Ì‚Ý?
+ use index item. ID can be only myself?
+R 00a8 <index>.w <amount>.w <type>.B
+ ƒAƒCƒeƒ€Žg—p‰ž“šBtype=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
+ response to use item. type=00 means failed. amount is unused.
+ type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
+ type=01 means success to use item, amount is a number of rest of the item.
+S 00a9 <index>.w <equip type>.w
+ ƒAƒCƒeƒ€‘•”õ
+ equip item.
+R 00aa <index>.w <equip point>.w <type>.B
+ ƒAƒCƒeƒ€‘•”õ‰ž“šBtype=00‚Ìꇑ•”õŽ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
+ response to equip item. type=00 means fail. equip point is unused.
+S 00ab <index>.w
+ ‘•”õ‰ðœ
+ take off equipment.
+R 00ac <index>.w <equip point>.w <type>.B
+ ‘•”õ‰ðœ‰ž“šBtype=00‚Ìꇎ¸”s? equip point‚àƒSƒ~‚Ì–Í—l
+ response to take off equipment. type=00 means fail? equip point is unused.
+R 00af <index>.w <amount>.w
+ ƒAƒCƒeƒ€”Œ¸­BamountŒÂ‚¾‚¯Œ¸‚ç‚·
+ decrease number of item by amount.
+R 00b0 <type>.w <val>.l
+ FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
+ update values of various status.
+ 0000:speed 0003:ˆ«s’l 0004:ƒ}ƒi[ƒ|ƒCƒ“ƒg 0005:HP 0006:MaxHP
+ 0000:speed 0003:carma 0004:manner point 0005:HP 0006: MaxHP
+ 0007:SP 0008:MaxSP 0009:ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg 000b:ƒx[ƒXƒŒƒxƒ‹
+ 0007:SP 0008:MaxSP 0009:status point 000b: base level
+ 000c:ƒXƒLƒ‹ƒ|ƒCƒ“ƒg 0018:d—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
+ 000c:skil point 0018:weight(this number must be 10 times greater than it's been diplayed.)
+ 0019:Å‘åd—Ê(•\Ž¦‚³‚ê‚Ă锎š‚Ì10”{)
+ 0019:max weight(this number must be 10 times greater than it's been diplayed.)
+ 0029:ATK‘O 002a:ATKŒã 002b:MATK‘O 002c:MATKŒã
+ 0029:attack in front 002a:attack in back 002b:matk in front 002c:matk in back
+ 002d:DEF‘O 002e:DEFŒã 002f:MDEF‘O 0030:MDEFŒã
+ 002d:deffence in front 002e:deffence in back 002f:mdef in front 0030:mdef in back
+ 0031:HIT 0032:FLEE‘O 0033:FLEEŒã 0034:ƒNƒŠƒeƒBƒJƒ‹
+ 0031:hit 0032:flee in front 0033:flee in back 0034: critical
+ 0035:ASPD(2ms’PˆÊ‚ÌŽžŠÔ?) 0037:ƒWƒ‡ƒuƒŒƒxƒ‹
+ 0035:aspd(time by 2ms?) 0037:job level
+ 0082:“ä ATKŒã‚Æ“¯‚¶”Žš?
+ 0082:unknown. is it the same number as atk in back?
+R 00b1 <type>.w <val>.l
+ FX‚È”\—Í’l‚ÌXVBˆÈ‰ºtype:‘Ήž‚·‚é”’l‚ð—ñ‹“
+ update valies of various status. below is the list of corresponding type and value.
+ 0001:ƒx[ƒX‘¤ŒoŒ±’l 0002:ƒWƒ‡ƒu‘¤ŒoŒ±’l 0014:zeny
+ 0001:base experience 0002:job experience 0014:zeny
+ 0016:ƒx[ƒX‘¤•K—vŒoŒ±’l 0017:ƒWƒ‡ƒu‘¤•K—vŒoŒ±’l
+ 0016:base experience that needed to level up 0017:job experience that needed to level up
+ ƒÀ1‚Å‚Í00b0‚Íval‚ªshortA00b1‚Íval‚ªlong‚Æ‚¢‚¤Žg‚¢•ª‚¯‚ª‚ ‚Á‚½‚ñ‚¾‚¯‚Ç
+ ¡‚Æ‚È‚Á‚Ä‚Í·‚ª–³‚­‚È‚Á‚ÄA–Ó’°‚Ý‚½‚¢‚È‚à‚Ì?
+ in beta1, value of 00b0 was short and value of 00b1 was long,
+ but not there are no difference.
+S 00b2 <type>.B
+ type=00 Ž€–SŽžƒŠƒXƒ^[ƒg
+ restart game when character died
+ type=01 ƒLƒƒƒ‰ƒZƒŒ—v‹
+ request character select
+R 00b3 <type>.B
+ type=01 ƒLƒƒƒ‰ƒZƒŒ‰ž“š
+ response to character select
+R 00b4 <len>.w <ID>.l <str>.?B
+ ID‚ÌNPC‚©‚ç‚̃ƒbƒZ[ƒW
+ message from npc id
+R 00b5 <ID>.l
+ ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"NEXT"ƒAƒCƒRƒ“‚ðo‚·
+ display the "NEXT" icon to npc message window
+R 00b6 <ID>.l
+ ID‚ÌNPC‚Ƃ̃ƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚É"CLOSE"ƒAƒCƒRƒ“‚ðo‚·
+ display the "CLOSE" icon to npc message window
+R 00b7 <len>.w <ID>.l <str>.?B
+ ID‚ÌNPC‚̉ï˜b‚Å‘I‘ð€–Ú•\Ž¦BŠe€–Ú‚Í':'‚Å‹æØ‚ç‚ê‚é
+ display select options in npc message window. each options devided by ":".
+S 00b8 <ID>.l <select>.B
+ ID‚ÌNPC‚̉ï˜b‚Ì‘I‘ðBŠe€–ڂɇ‚É1`‚ªU‚ç‚ê‚éBff‚ŃLƒƒƒ“ƒZƒ‹?
+ select options in ncp message window. number starts from 1 for each options. cancel for ff?
+S 00b9 <ID>.l
+ ID‚ÌNPC‚Ƃ̉ï˜bBNEXTƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½
+ "NEXT" button clicked in ncp message window.
+S 00bb <type>.w <amount>.B
+ ƒXƒe[ƒ^ƒXup—v‹Btype‚Í000d‚©‚ç0012‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
+ request update status. type can be 000d for STR, 000e for AGI, 000f for VIT, 0010 for INT, 0011 for DEX, 0012 for LUK.
+R 00bc <type>.w <fail>.B <val>.B
+ ƒXƒe[ƒ^ƒXup‰ž“šBfail=01‚Ȃ笌÷Btype‚Í00bb‚Æ“¯‚¶Bval‚Íã‚Á‚½Œã‚Ì”Žš
+ respnse to update status. it's successeeded if fail=01. type is the same value as packet number 00bb. val is a value of increase.
+ Ž¸”s—á‚ÍŒ©‚½Ž––³‚¢‚Ì‚Å“äBƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ª‘«‚è‚È‚¢ó‘Ô‚Å
+ 00bb‚ð”­s‚Å‚«‚éƒNƒ‰ƒCƒAƒ“ƒg‚ª—L‚ê‚ÎAfail=00‚É‚È‚é‚Ì‚Å‚Í‚È‚¢‚©‚Æ—\‘z
+ it's unknown when it's failed because i havent ever seen. i think it will be fail=00 when it's failed.
+R 00bd <status point>.w <STR>.B <STRupP>.B <AGI>.B <AGIupP>.B <VIT>.B <VITupP>.B <INT>.B <INTupP>.B <DEX>.B <DEXupP>.B <LUK>.B <LUKupP>.B <ATK>.w <ATKbonus>.w <MATKmax>.w <MATKmin>.w <DEF>.w <DEFbonus>.w <MDEF>.w <MDEFbonus>.w <HIT>.w <FLEE>.w <FLEEbonus>.w <critical>.w ?.w
+ ‚܂Ƃ߂ăXƒe[ƒ^ƒXî•ñ‚ð‘—‚éƒpƒPƒbƒg
+ packet of information for various status.
+R 00be <type>.w <val>.B
+ •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgXVƒpƒPƒbƒgBtype‚Í0020`0025‚ª‡‚ÉSTR`LUK‚ɑΉž
+ packet to update required status point. type can be 0020-0025 for STR-LUK.( see packet number 00bb for detals.)
+S 00bf <type>.B
+ ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚·Btype‚Í00-0c(,0d)‚ªALT+1`ALT+9,ALT+0,ƒ`ƒ‡ƒL,ƒO[,ƒp[(,ŠØ‘Šø)‚ɑΉž
+ display emotion. type can be 00-0c(,0d) for ALT+1-ALT+9,ALT+0,CTRL+-,CTRL++,CTRL+\(,korean flag).
+R 00c0 <ID>.l <type>.B
+ ID‚Ìl‚ªƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚½Btype‚Í00bf‚Æ“¯‚¶
+ emotion by ID. type is the same as 00bf.
+S 00c1
+ loginl”–â‚¢‡‚킹
+ request to ask loged in people.
+R 00c2 <val>.l
+ loginl”‰ž“š
+ response to asking loged in people.
+R 00c3 <ID>.l <type>.B <val>.B
+ Œ©‚½–Ú•ÏXBtype‚Í00‚Å–{‘Ì(“]EŽž“™)A02‚ª•ŠíA03‚ª“ª(‰º)A04‚ª“ª(ã)A05‚ª“ª(’†)A08‚ª‚
+ change looks. type=00 means body(by jobs), 02 is weapon, 03 is head(lower), 04 is head(upper), 05 is head(middle), 08 is shield.
+R 00c4 <ID>.l
+ ˜b‚©‚¯‚½NPC‚ª¤l‚¾‚Á‚½‚Ì‚Åbuy/sell‘I‘ð‘‹o
+ display "BUY" or "SELL" window by npc ID
+R 00c5 <ID>.l <type>.B
+ buy/sell‘I‘ðBtype=00‚È‚çbuyBtype=01‚È‚çsell
+ select "BUY" or "SELL". type=00 is buy, type=01 is sell.
+R 00c6 <len>.w {<value>.l <DCvalue>.l <type>.B <item ID>.w}.11B*
+ NPC‚Ì‚¨“Xbuy‘I‘ðŽžBDCvalue‚ͤlDCŒã‚Ì’l’i
+ list of marchandizes when clicked "BUY". DCvalue is a value of Discount Skill applied.
+R 00c7 <len>.w {<index>.w <value>.l <OCvalue>.l}.10B*
+ NPC‚Ì‚¨“Xsey‘I‘ðŽžBOCvalue‚ͤlOCŒã‚Ì’l’i
+ list of items when clicked "SELL". OCvalue is a value of Over Charge Skill applied.
+S 00c8 <len>.w {<amount>.w <item ID>.w}.4B*
+ NPC‚Ì‚¨“X‚©‚甃‚¤
+ buy item from npc shop.
+S 00c9 <>.w {<index>.w <amount>.w}.4B*
+ NPC‚Ì‚¨“X‚É”„‚é
+ sell item to npc shop.
+R 00ca <type>.B
+ NPC‚©‚çw“üI—¹Btype=00¬Œ÷
+ response for buying item. type=00 meanse successetion.
+R 00cb <type>.B
+ NPC‚Ö”„‹pI—¹Btype=00¬Œ÷
+ response for selling item. type=00 means success.
+S 00cf <nick>.24B <type>.B
+ type=00 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/ex nick)
+ deny speech from nick(/ex nick).
+ type=01 nick‚©‚ç‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/in nick)
+ allow speech from nick(/in nick)
+S 00d0 <type>len.B
+ type=00 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹‘”Û (/exall)
+ deny all speech(/exall)
+ type=01 ‘S‚Ä‚Ì”­Œ¾Žó‚¯•t‚¯‹–‰Â (/inall)
+ allow all speech(/inall)
+R 00d1 <type>.B <fail>.B
+ fail=00 ”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
+ success to deny speech
+ fail=01 ”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
+ fail to deny speech
+R 00d2 <type>.B <fail>.B
+ fail=00 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”Û¬Œ÷
+ seccess to allow speech
+ fail=01 ‘S”­Œ¾Žó‚¯•t‚¯‹‘”ÛŽ¸”s
+ fail to alloe speech
+S 00d5 <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
+ ƒ`ƒƒƒbƒg—§‚ÄB‚±‚±‚©‚çƒ`ƒƒƒbƒgŠÖŒW‚ª‘±‚­‚¯‚Ç’²‚ׂªŠÃ‚¢‚̂ŕ⊮‚æ‚ë
+ create chat room.(from now on, im not sure for packets about chat.)
+R 00d6 <fail>.B
+ ƒ`ƒƒƒbƒg—§‚ĉž“š
+ response to create chat room.
+R 00d7 <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
+ ‰æ–Ê“àƒ`ƒƒƒbƒgî•ñ
+ information for chat room in the screen.
+R 00d8 <chat ID>.l
+ ƒ`ƒƒƒbƒgÁ‹Ž
+ delete chat room.
+S 00d9 <chat ID>.l <passwd>.8B
+ ƒ`ƒƒƒbƒgŽQ‰Á—v¿
+ request to join the chat.
+R 00da <fail>.B
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽ¸”s
+ fail to join the chat.
+R 00db <len>.w <chat ID>.l {<index>.l <nick>.24B}.28B*
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽÒƒŠƒXƒg
+ list of people in the chat room.
+R 00dc <users>.w <nick>.24B
+ ƒ`ƒƒƒbƒg‚Ö‚ÌŽQ‰ÁŽÒ’ljÁ(?)
+ add person to the chat room.
+R 00dd <index>.w <nick>.24B <fail>.B
+ ƒ`ƒƒƒbƒg‚©‚çŽQ‰ÁŽÒ”²‚¯
+ leave the chat room.
+S 00de <len>.w <limit>.w <pub>.B <passwd>.8B <title>.?B
+ ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX
+ change chat room status.
+R 00df <len>.w <owner ID>.l <chat ID>.l <limit>.w <users>.w <pub>.B <title>.?B
+ ƒ`ƒƒƒbƒgƒXƒe[ƒ^ƒX•ÏX¬Œ÷
+ success to change chat room status.
+S 00e0 ?.l <nick>.24B
+ ƒ`ƒƒƒbƒgƒ‹[ƒ€Š—LŽÒ•ÏX—v‹?
+ request to change owner of the chat room?
+R 00e1 <index>.l <nick>.24B
+ ƒ`ƒƒƒbƒgŽQ‰ÁŽÒ”Ô†•t‚¯’¼‚µ?
+ re-number people in the chat room?
+S 00e2 <nick>.24B
+ ƒ`ƒƒƒbƒgkick
+ kick nick from chat room.
+S 00e3
+ ƒ`ƒƒƒbƒg”²‚¯
+ leave chat room.
+S 00e4 <ID>.l
+ Žæ‚èˆø‚«—v‹
+ request trade.
+R 00e5 <nick>.24B
+ Žæ‚èˆø‚«—v¿Žó‚¯
+ recieve a request to trade.
+S 00e6 <type>.B
+ type=03 Žæ‚èˆø‚«—v¿ok
+ trade ok.
+ type=04 Žæ‚èˆø‚«—v¿ƒLƒƒƒ“ƒZƒ‹
+ trade canceled.
+R 00e7 <fail>.B
+ Žæ‚èˆø‚«—v‹‰ž“š
+ response to requesting trade.
+ fail=00 ‹——£‚ª‰“‰ß‚¬
+ too far.
+ fail=03 —v¿Žó‚¯‚Ä‚­‚ꂽ
+ allowed the trade.
+ fail=04 ƒLƒƒƒ“ƒZƒ‹‚³‚ꂽ?
+ trade canceled?
+S 00e8 <index>.w <amount>.l
+ ƒAƒCƒeƒ€’ljÁBindex=0‚Åzeny’ljÁB³‹KƒNƒ‰ƒCƒAƒ“ƒg‚Å‚Ízeny‚Í00eb‚Ì’¼‘O‚Ì‚Ý
+ add item. index=0 means adding zeny. for official client, zeny can be added only in packet number 00eb.
+R 00e9 <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
+ added item from other character.
+R 00ea <index>.w <fail>.B
+ fail=00 ƒAƒCƒeƒ€’ljÁ¬Œ÷
+ success to add item.
+ fail=01 ’ljÁŽ¸”sB‘ŠŽè‘¤d—ʃI[ƒo
+ fail to add item. the player was over weighted.
+S 00eb
+ ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
+ completed adding item.(cliecked OK)
+R 00ec <fail>.B
+ fail=00 Ž©•ª‚©‚ç‚ÌokŽó—Ì
+ recieved "OK" from myself
+ fail=01 ‘ŠŽè‚©‚ç‚ÌokŽó—Ì
+ recieved "OK" from the other.
+S 00ed
+ Žæ‚èˆø‚«ƒLƒƒƒ“ƒZƒ‹
+ trade canceled.
+R 00ee
+ Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
+ message of "trade canceled"
+S 00ef
+ Žæ‚èˆø‚«‹–‘ø(trade‰Ÿ‚µ)
+ trade OKed. (cliecked Trade)
+R 00f0
+ Žæ‚èˆø‚«Š®—¹
+ trade completed.
+R 00f2 <num>.w <limit>.w
+ ƒJƒvƒ‰‚³‚ñ‹–—eƒAƒCƒeƒ€ŒÂ”&Œ»ó
+ number of item that capra can stock and number of item that capra stocks now.
+S 00f3 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚ɃAƒCƒeƒ€•ú‚èž‚Ý
+ put item to capra's warehouse.
+R 00f4 <index>.w <amount>.l <type ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€’ljÁ
+ add item to capra's warehouse.
+S 00f5 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚©‚çƒAƒCƒeƒ€Žæ‚èo‚µ
+ take out item from capra's warehouse.
+R 00f6 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ‚̃AƒCƒeƒ€íœ
+ delete item in the capra's warehouse.
+S 00f7
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶
+ request to close capra's warehouse.
+R 00f8
+ ƒJƒvƒ‰‚³‚ñ‘qŒÉ•Â‚¶‰ž“š
+ response to close capra's warehouse.
+S 00f9 <party name>.24B
+ ƒp[ƒeƒBì¬
+ create party.
+R 00fa <fail>.B
+ fail=00 쬬Œ÷
+ success to create party.
+R 00fb <len>.w <party name>.24B {<ID>.l <nick>.24B <map name>.16B <leader>.B <offline>.B}.46B*
+ ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‚Ä‘—‚è
+ packet for various information about party.
+S 00fc <ID>.l
+ ƒp[ƒeƒBŠ©—U‚·‚é
+ invate player to the party.
+R 00fd <nick>.24B <fail>.B
+ fail=00 ‘ŠŽè‚ÍŠù‚Ƀp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚½
+ the player is already in other party.
+ fail=01 ‘ŠŽè‚É‹‘”Û‚³‚ꂽ
+ invitaion was denied.
+ fail=02 Š©—U¬Œ÷
+ success to invite,
+R 00fe <ID>.l <party name>.24B
+ ƒp[ƒeƒB‚É—U‚í‚ꂽ
+ invited to party.
+S 00ff <ID>.l <fail>.l
+ ƒp[ƒeƒB‚É—U‚í‚ꂽŽž‚Ì•Ô“šBfail=1 ok•Ô“š?
+ response when player was invited to party. fail=1 means OK?
+R 0100
+ ? ƒp[ƒeƒBŠÖ˜A?
+ unknown. related to party?
+S 0101 <exp>.w <item?>.w
+ ƒp[ƒeƒBÝ’è•ÏX
+ change party setting.
+R 0102 <exp>.w <item?>.w
+ ƒp[ƒeƒBݒ茻ó? exp=2‚Ìꇂ͌ö•½”z•ªÝ’莸”s?
+ party setting status. when exp=2, fail to set "equality for experience"?
+R 0104 <ID>.l ?.l <X>.w <Y>.w <offline>.B <party name>.24B <nick>.24B <map name>.16B
+ ƒp[ƒeƒB1l•ªî•ñXV
+ information about a one player in th party.
+R 0105 <ID>.l <nick>.24B <fail>.B
+ nick‚³‚ñ‚ªƒp[ƒeƒB‚©‚ç—£’E
+ nick leaves the party.
+R 0106 <ID>,l <HP>.w <MaxHP>.w
+ ƒp[ƒeƒBƒƒ“ƒoHPXV
+ update HP of party members.
+R 0107 <ID>.l <X>.w <Y>.w
+ ƒp[ƒeƒBƒƒ“ƒoˆÊ’uXV
+ update coordinates of party members.
+S 0108 <len>.w <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾
+ send speech for party memebers.
+R 0109 <len>.w <ID>.l <message>.?B
+ ƒp[ƒeƒB“à”­Œ¾ŽóM
+ receive speech for party memebers.
+R 010a <type ID>.w
+ MVPƒAƒCƒeƒ€Žæ“¾
+ get MVP item.
+R 010b <exp>.l
+ MVPŒoŒ±’lŽæ“¾
+ get MVP experience.
+R 010c <ID>.l
+ MVPƒLƒƒƒ‰•\Ž¦
+ display MVP character.
+R 010e <skill ID>.w <lv>.w <sp>.w <range>.w <up>.B
+ ƒXƒLƒ‹î•ñXVBsp‚Í–¢Žg—p?
+ update skill sinformation. sp is unused?
+R 010f <len>.w {<skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B}.37B*
+ ƒXƒLƒ‹î•ñ‚̉òBskill name‚͈ꕔ—¬‚ê‚Ä—ˆ‚È‚¢•¨‚ª‚ ‚é„AL_PNEUMA,PR_SLOWPOISON“™
+ bunch of information about skill. some of skill name is not send (AL_PNEUMA, PR_SLOWPOISON etc).
+ target type‚Í0-ƒpƒbƒVƒuA1-“GA2-êŠA4-‘¦Žž”­“®A16-–¡•û
+ target type is 0 for novice skill, 1 for enemy, 2 for place, 4 for immediate invoke, 16 for party member
+ lv=0 up=0‚Ìꇂ̓ŠƒXƒg‚Éo‚µ‚Ä‚È‚¢?
+ it will not be on list when lv=0 up=0?
+R 0110 <skill ID>.w <basic type>.w ?.w <fail>.B <type>.B
+ fail=00‚ÌŽž‚ɃXƒLƒ‹—˜—pŽ¸”s?
+ fail to use skill when fail=00?
+ type 00:basic type‚Ì•û 01:SP•s‘« 02:HP•s‘« 03:memo–³‚µ 04:delay’†
+ type 00:basic type 01:lack of SP, 02:lack of HP, 03:no memo, 04:in delay
+ 05:‚¨‹à–³‚µ(‚ß‚Ü[) 06:•Ší‚ª‚æ‚낵‚­‚È‚¢ 07:ÔƒWƒFƒ€–³‚µ 08:ƒWƒFƒ€–³‚µ 09:“ä
+ 05:lack of money, 06:weapon does not satisfy, 07:no red jewel, 08:no blue jewel, 09:unkown
+ basic type 00:Žæ‚èˆø‚« 01:emotion 02:À‚è 03:ƒ`ƒƒƒbƒg 04:ƒp[ƒeƒB
+ basic type 00:trade 01:emotion 02:sit down, 03:chat, 04:party
+ 05:shout? 06:PK 07:ƒ}ƒi[ƒ|ƒCƒ“ƒg
+ 05:shout? 06:PK, 07:manner point
+R 0111 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
+ 010f‚Ì1‚•ªBƒÀ2‚¾‚Æ–¢Žg—p?
+ just one skill information. not used in beta2?
+S 0112 <skill ID>.w
+ ƒXƒLƒ‹lvup—v‹
+ request to skill level up.
+S 0113 <level>.w <skill ID>.w <ID>.l
+ ID‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
+ use skill to the target.
+R 0114 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <param3>.w <type>.B
+ UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@
+ skill effect for attack.
+ type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
+ rtpe=04 observed when firewall was used. is that the almost same as type=06?
+ type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
+ type=06 skill for just one hit? param1 is total damage, param2 is level, param3 will always stay 1.
+ type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=08 skill for multiple hits? param1 is totak damage, param2 is level, param3 will be a number of hit.
+R 0115 <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <X>.w <Y>.w <param1>.w <param2>.w <param3>.w <type>.B
+ ’e‚«”ò‚΂µ—L‚èUŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg
+ blow up type skill effect.
+ type=05 ƒ_ƒ[ƒW&’e‚«”ò‚΂µBparam1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=05 damage and blow up. param1 is total damage, param2 is level, param3 will be a number of hit.
+ type=06 ”šS’n? ­‚È‚­‚Æ‚àparam1‚̓Sƒ~‚Ì–Í—l
+ type=06 a point of explorsion? param1 is unused at least.
+S 0116 <level>.w <skill ID>.w <X>.w <Y>.w
+ (X,Y)‚ðƒ^[ƒQƒbƒg‚Éskill‚ðŽg‚¤
+ use skill at (X,Y).
+R 0117 <skill ID>.w <src ID>.l <val>.w <X>.w <Y>.w <server tick>.l
+ ꊑŠŽè‚̃XƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦Bval‚̓Œƒxƒ‹‚©Aˆê•”ŒÅ‚³?(•X•Ç)
+ display skill effect at (X,Y). is val level? or how hard it is (like ice wall)?
+S 0118
+ UŒ‚ƒLƒƒƒ“ƒZƒ‹
+ cancel to attack
+R 0119 <ID>.l <param1>.w <param2>.w <param3>.w ?.B
+ Œ©‚½–Ú•ÏX
+ change looks.
+ param1=02 ƒtƒƒXƒgƒ_ƒCƒo‚Å“€‚è’Ђ¯?
+ param1=02 flozen diva?
+ param2=01 “Å?
+ param2=01 poison?
+ param2=20 ANGELUSó‘Ô?
+ param2=20 ANGELUS?
+ param3=01 ƒTƒCƒg‚©ƒ‹ƒƒbƒ`?
+ param3-01 site or ruwatch? (i dont know skill names in english :()
+ param3=0b ƒnƒCƒfƒBƒ“ƒOó‘Ô?
+ param3=0b hiding?
+ param3=0b ƒNƒ[ƒLƒ“ƒOó‘Ô?
+ param3-0b cloking?
+ param3=0d ƒJ[ƒg•t‚«
+ param3=0d with cart
+ param3=0e ‘é•t‚«
+ param3-0e with hawk
+ param3=0f ƒyƒRƒyƒRæ‚è
+ param3=0f with pekopeko
+
+R 011a <skill ID>.w <val>.w <dst ID>.l <src ID>.l <fail>.B
+ ”ñƒ_ƒ[ƒWŒnƒXƒLƒ‹•\Ž¦Bƒq[ƒ‹‚Ìê‡val‚͉ñ•œ—Ê
+ display no-damage skill effect. val is an amount of HP cured when it's heal.
+ fail=00‚Ìꇎ¸”s‚Û‚¢‚ªAƒXƒ`[ƒ‹ˆÈŠO‚Å‚ÍŒ©‚½Ž––³‚µ
+ fail=00 must mean fail, but i havent seend it except steal.
+S 011b <skill ID>.w <map name>.16B
+ 011c‚ւ̉ž“šBŽg‚í‚È‚¢ê‡"cancel"‚ð‘—‚é
+ response to packet number 011c. send "cancel" for no-use.
+R 011c <skill ID>.w <map1>.16B <map2>.16B <map3>.16B <map4>.16B
+ ƒeƒŒƒ|/ƒ|ƒ^‚ÌꊑI‘ðB
+ select place for teleport or portal warp.
+ ƒeƒŒƒ|‚Ìê‡ARandom/ƒZ[ƒuêŠAƒ|ƒ^‚Ìê‡AƒZ[ƒuêŠ/memo1/memo2/memo3‚Æ‚È‚é
+ ƒ}ƒbƒv–¼‚Ì‚Ý‘—‚ç‚ê‚é
+ in case of teleport, Ramdom/save point will be sent,
+ in case of portal warp, save point/memo1/memo2/memo3 will be sent.
+ only map name wil be sent.
+S 011d
+ Œ»Ý‹‚éŠ‚ðƒƒ‚—v‹
+ request to take a memo at this point.
+R 011e <fail>.B
+ fail=00 ƒƒ‚¬Œ÷
+ success to take memo.
+ fail=01 ƒƒ‚Ž¸”s
+ fail to take memo.
+R 011f <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B
+ ƒXƒLƒ‹Œø”\’nì¬
+ create ground effect for skills like firewall.
+ type 7e:SW 7f:‰Î•Ç 80:ƒ|ƒ^”­“®’† 81:ƒ|ƒ^”­“®‘O 83:ƒTƒ“ƒN 85:ƒtƒjƒ…[ƒ}
+ type 7e:SW, 7f:firewall, 80:portal warp(invoking), 81:portal warp(before invoking), 83:sank, 85:funewma( i really don know skill names :()
+ 86:ƒo[ƒ~ƒŠƒIƒ“ 8c:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®Žž 8d:•X•Ç 8e:‚­‚ ‚®‚Ü‚¢‚â[ 91:‚ ‚ñ‚­‚é‚·‚Ë‚ 
+ 86: bermillion, 8c:talky box(invoked), 8d:frost diva, 8e:kuagumire, 91:uncle snear
+ 93:‚ç‚ñ‚Ç‚Ü‚¢‚ñ 97:?? 99:ƒg[ƒL[ƒ{ƒbƒNƒX”­“®‘O
+ 93:land mine, 97:??, 99:talky box(befor invoked)
+ ‘¼î•ñ‹‚Þ
+R 0120 <ID>.l
+ ƒXƒLƒ‹Œø”\’nÁ‹Ž
+ delete ground effect.
+R 0121 <num>.w <num limit>.w <weight>.l <weight limit>l
+ ƒJ[ƒg‚ÌŽí—Þ&d‚³‚ÌŒ»Ý’l&ãŒÀ
+ kind of cart, weight and max weight.
+R 0122 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <equip type>.w <equip point>.w <attribute?>.B <refine>.B <card>.4w}.20B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€B‘•”õ•i
+ equipments in cart.
+R 0123 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B}.10B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
+ cunsumptive and collector items in cart.
+R 0124 <index>.w <amount>.l <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w
+ ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
+ add item to cart.
+R 0125 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
+ delete item in cart.
+S 0126 <index>.w <amount>.l
+ ƒJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚é
+ put item to cart.
+S 0127 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðŽæ‚èo‚·
+ take out item from cart.
+S 0128 <index>.w <amount>.l
+ ƒJƒvƒ‰‚³‚ñ‚©‚çƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
+ move item from capra's warehouse to cart.
+S 0129 <index>.w <amount>.l
+ ƒJ[ƒg‚©‚çƒJƒvƒ‰‚³‚ñ‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
+ move item from cart to capra's warehouse.
+R 012c <fail>.B
+ fail=00 d—ʧŒÀ‚ð‰z‚¦‚ăJ[ƒg‚ɃAƒCƒeƒ€‚ð“ü‚ê‚ç‚ê‚Ü‚¹‚ñ‚Å‚µ‚½?
+ fail=00 over the weight and could not add item to cart.
+R 012d <num>.w
+ ˜I“XŠJÝBƒAƒCƒeƒ€ƒŠƒXƒg—v‹Bnum‚Í’u‚¯‚éÅ‘å”
+ create shop (marchant skill). request item list. num is a number of kind of item that can be sell.
+S 012e
+ ˜I“X•Â½
+ close shop.
+S 012f <len>.w <message>.80B {<index>.w <amount>.w <value>.l}.8B*
+ ˜I“XŠJÝA˜I“X–¼&ƒAƒCƒeƒ€,’l’iƒŠƒXƒg
+ create shop, shop name, item, price list.
+S 0130 <ID>.l
+ ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
+ request item list for shop( not npc shop).
+R 0131 <ID>.l <message>.80B
+ ˜I“XŠÅ”•\Ž¦
+ display shop name tag.
+R 0132 <ID>.l
+ ˜I“XŠÅ”ÂÁ‹Ž
+ delete shop name tag.
+R 0133 <len>.w <ID>.l {<value>.l <amount>.w <index>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B
+ ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
+ item list for shop(not npc shop).
+S 0134 <len>.w <ID>.l {<amount>.w <index>.w}.4B*
+ ˜I“XƒAƒCƒeƒ€w“ü
+ buy item from shop (not npc).
+R 0135 <index>.w <amount>.w <fail>.B
+ ˜I“XƒAƒCƒeƒ€w“üŽ¸”sBfail‚ÍŒ´ˆö
+ fail to buy item from non npc shop. fail tells you reasons.
+R 0136 <len>.w <ID>.l {<value>.l <index>.w <amount>.w <type>.B <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w}.22B*
+ ˜I“XŠJݬŒ÷
+ success to create non-npc-shop.
+R 0137 <index>.w <amount>.w
+ ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
+ report of selling item.
+R 0139 <ID>.l <X>.w <Y>.w <X2>.w <Y2>.w <range>.w
+ ID‚Ì“G‚Í(X,Y)‚É‹‚ÄŽ©•ª‚Í(X2,Y2)‚É‹‚é‚Ì‚ÅUŒ‚‚ª“Í‚«‚Ü‚¹‚ñ‚Å‚µ‚½
+ the enemy at(X,Y) was too far to attack from my coordinate (X2,Y2).
+ UŒ‚‰Â”\‹——£‚Írange‚È‚Ì‚ÅA‹ßŠñ‚Á‚ĉº‚³‚¢?
+ possible range to attack enemy is "range", so be closer?
+R 013a <val>.w
+ UŒ‚ŽË’ö
+ attack range.
+R 013b <type>.w
+ ŠeŽíƒƒbƒZ[ƒW•\Ž¦B3=–‘•”õ‚Å‚«‚Ü‚µ‚½
+ various message. 3="arrow has been equiped"
+R 013c <ID>.w
+ ‘•”õ‚³‚ꂽ–î‚ÌItemIDB0‚ÅA–¢‘•”õó‘ÔB
+ item id of equiped arrow. 0 means no arrow is equiped.
+R 013d <type>.w <val>.w
+ HP‰ñ•œƒXƒLƒ‹/SP‰ñ•œƒXƒLƒ‹‚É‚æ‚é‰ñ•œ
+ recovery of HP/SP by HP/SP recovery skill.
+ type=5‚È‚çHP type=7‚È‚çSP
+ type=5 is HP, type=7 is SP.
+R 013c <index>.w
+@@ ‘•”õ‚µ‚Ä‚¢‚é–î
+ id of equiped arrow.
+
+R 013e <src ID>.l <dst ID>.l <X>.w <Y>.w <lv?>.w ?.w <wait>.l
+ ƒXƒLƒ‹‰r¥’†BPC/NPC‚ª‘ŠŽè‚ÌꇂÍ(X,Y)‚Í0Bꊂªƒ^[ƒQƒbƒg‚ÌꇂÍdst ID‚Í0‚É‚È‚é
+ skill has been casting. (X,Y) will be 0 when target is player character or NPC. dst ID will be 0 when target is place.
+
+ 0x013e ‚Ì offset+16(dword) ‚̓XƒLƒ‹‘®«‚Å‚·(’²¸Ï)B
+ offset+16(dword) in packet number 0x013e is skill attribute.
+
+ 00:–³ 01:… 02:’n 03:‰Î 04:•— 05:“Å 06:¹ 07:ˆÃ 08:”O 09:Ž€
+ 00:none, 01:water, 02:ground, 03:fire, 04:wind, 05:poinson, 06:holly, 07:dark, 08:spirit(i don know how to translate.), 09:death
+ «—ˆ“I‚ÉA‰r¥’†‚̃GƒtƒFƒNƒg‚ª‘®«‚Å•Ï‚í‚é‚Ì‚©‚ÆB
+ casting effect might differ by skill attribute in the future.
+
+ wait‚Íms’PˆÊ‚©‚È?
+ wait in mili second?
+R 0141 <type>.l <base>.l <bonus>.l
+ ƒXƒe[ƒ^ƒXî•ñBtype‚Í0d‚©‚ç12‚ª‡‚ÉSTR,AGI,VIT,INT,DEX,LUK‚ɑΉž
+ information for status. type is 0d-12 for STR,AGI,VIT,INT,DEX,LUK.
+ base+bonus‚Æ•\Ž¦‚³‚ê‚é
+ base+bonus will be displayed.
+R 0144 <ID>.l <type>.l <X>.l <Y>.l <point ID>.B <color>.3B ?.B
+ ˆÄ“àˆõ—pAƒ}ƒbƒvãƒAƒCƒRƒ“•\Ž¦ƒpƒPƒbƒg
+ for guid npc, packet for display icon on map.
+ type=1 ƒAƒCƒRƒ“‚ð•\Ž¦
+ display icon.
+ type=2 ƒAƒCƒRƒ“‚ðÁ‹Ž
+ delete icon.
+R 0145 <file name>.16B <type>.B
+ (¡‚ÌŠ)ƒJƒvƒ‰‚³‚ñcutin•\Ž¦
+ display capra picture(at this time).
+ type=02 •\Ž¦
+ display.
+ type=ff Á‹Ž
+ delete.
+S 0146 <ID>.l
+ ID‚ÌNPC‚Ƃ̉ï˜bBCLOSEƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½Back–³‚µ‚ÉNPCƒƒbƒZ[ƒWƒEƒBƒ“ƒh‚𓯎ž‚ɕ‚¶‚é
+ talk to npc with ID. Clicked CLOSE button.
+R 0147 <skill ID>.w <target type>.w ?.w <lv>.w <sp>.w <range>.w <skill name>.24B <up>.B
+ ƒAƒCƒeƒ€—˜—p‚ÌŒ‹‰ÊˆêŽž“I‚É“¾‚ç‚ꂽƒXƒLƒ‹î•ñ
+ effect for skill by using item.
+S 0148 <ID>.l
+ ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚Ì‘ŠŽèŒˆ‚ß? @ ƒÀ1
+ decide target of a skill rezarection? in beta1.
+S 0149 <ID>.l <type>.B
+ ID‚Ƀ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚éBtype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
+ give manner point to ID. type=00 is plus, type=01 is minus.
+R 014a <fail>.l
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð—^‚¦‚½Œ‹‰ÊBfail=0 ¬Œ÷ fail=1 Ž¸”s
+ result of giving manner point. fail=0 is success, fail=1 is fail.
+R 014b <type>.B <nick>.24B
+ ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ð–á‚Á‚½Btype=00 ƒvƒ‰ƒX type=01 ƒ}ƒCƒiƒX
+ get manner point. type=00 is plus, type-01 is minus.
+R 014C <len>.w (<type>.l <guildID>.l <guild name>.24B).*
+ “¯–¿¥“G‘΃Mƒ‹ƒh•\Ž¦
+ display alliance and opposition guild.
+ type=0 “¯–¿
+ alliance.
+ type=1 “G‘Î
+ opposition.
+S 014D
+@@ ƒMƒ‹ƒhî•ñ•\Ž¦ŠJŽnH
+ start of guild information?
+R 014E <type?>.l
+@@ type=0x57 ˆê”ʃMƒ‹ƒh’cˆõ
+ normal guild member.
+@@ type=0xD7 ƒMƒ‹ƒhƒ}ƒXƒ^[
+ guild master.
+S 014F <page>.l
+@@ ƒMƒ‹ƒh•\Ž¦ƒ^ƒu‘—M
+ send packet for guild "DISPLAY" tab.
+R 0150 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l ?.l <next_exp>.l ?.16B <guild name>.24B <guild master>.24B ?.16B
+@@ ƒMƒ‹ƒhî•ñ
+ guild info.
+S 0151 <guild ID>.l
+ ƒGƒ“ƒuƒŒƒ€—v‹
+ request for guild emblem.
+R 0152 <len>.w <guild ID>.l <emblem ID?>.l <emblem data>.?B
+ ƒGƒ“ƒuƒŒƒ€ƒCƒ[ƒW‘—•t
+ return emblem image.
+R 0154 <len>.w {<accID>.l <charactorID>.l <”¯Œ^>.w <”¯‚ÌF>.w <«•ÊH>.w <job>.w <lvl?>.w <ã”[ŒoŒ±’l>.l <online>.l <Position>.l ?.50B <nick>.24B}*
+ ƒMƒ‹ƒhƒƒ“ƒoƒŠƒXƒg?
+ guild member list?
+S 0159 <guildID>.l <accID>.l <charID>.l <mess>.40B
+@@ ƒMƒ‹ƒh’E‘Þ‘—M
+ send packet for leaving guild.
+R 015A <nic>.24B <mess>.40B
+@@ ƒMƒ‹ƒh’E‘Þ(‘Sˆõ)ŽóM
+ receive packet for leaving guild(all members).
+S 015B <guildID>.l <accID>.l <charID>.l <mess>.40B
+@@ ƒMƒ‹ƒh’Ç•ú‘—M
+ send packet for kicking member out of the guild.
+R 015C <nick>.24B <mess>.40B <ƒAƒJƒEƒ“ƒg‚h‚c>.24B
+@@ ƒMƒ‹ƒh’Ç•úi‘SˆõjŽóM
+ receive packet for kicking member out of the guild.(all member)
+R 0163 <len>.w <nick>.24B <accountID>.24B <kicking reason>.40B
+
+S 0165 <myaccID>.l <guild name>.24B
+@@ ƒMƒ‹ƒhì¬
+ create guild
+R 0166 <len>.w ?.28B*
+ –ðE–¼ƒŠƒXƒg?
+ list for roll of members?
+R 0167 <type>.b
+ ƒMƒ‹ƒh쬇”Û
+ response to vreating guild.
+ type = 0 ƒMƒ‹ƒh쬬Œ÷
+ success.
+ type = 2 “¯–¼‚̃Mƒ‹ƒh‚ª‚ ‚é
+ there is a guild with the same name.
+S 0168 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
+@@ ƒMƒ‹ƒhŠ©—U
+ invite to the guild.
+R 0169 <type>.B
+@@ ƒMƒ‹ƒhŠ©—U‹‘”Û‚³‚ꂽ
+ invitation denied.
+R 016A <guild ID>.l <guild name>.24B
+@@ ƒMƒ‹ƒhŠ©—U‚³‚ꂽ
+ invited to the guild.
+S 016B <guild ID>.l <type>.l
+@@ ƒMƒ‹ƒhŠ©—U•ÔM
+ response to invitaion for joining to guild.
+@@ type=0 ‹‘”Û‚·‚é
+ deny.
+@@ type=1 ‹–‘ø‚·‚é
+ OK.
+R 016c <guild ID>.l ?.13B <guild name>.24B
+ loginŽžƒMƒ‹ƒhî•ñ
+ guild information when loged in.
+R 016d <ID>.l <charactor ID>.l <online>.l
+ ƒMƒ‹ƒhƒƒ“ƒo‚ªlogin‚µ‚½”²‚¯‚½“™
+ information about guild member loged in or loged out etc.
+R 016f <message>.180B
+ ƒMƒ‹ƒh‚¨‘è–Ú?
+ guild message?
+S 016E <guildID>.l <mess1>.60B <mess2>.120B
+@@ ƒMƒ‹ƒh’mÝ’è
+ set guild announcement.
+R 016F <mess1>.60B <mess2>.120B
+@@ ƒMƒ‹ƒh’m
+ guild announcement.
+S 0170 <TargetAccID>.l <sourceAccID>.l <myCharactorID>.l
+@@ “¯–¿—v¿Š©—U
+ invite the guild to be alliance.
+R 0171 <SorceAccID>.l <guild name>.24B
+@@ “¯–¿—v¿Š©—U‚³‚ꂽ
+ invited to be a alliance.
+S 0172 <SorceAccID>.l <type>.l
+@@ “¯–¿—v¿•ÔM
+ response for invitiation to be alliance.
+@@ type=0 ‹‘”Û‚·‚é
+ deny.
+@@ type=1 ‹–‘ø‚·‚é
+ OK.
+R 0173 <type>.B
+ type = 0 ‚·‚Å‚É“¯–¿ŠÖŒW
+ the guild is already alliance.
+@@ type = 1 “¯–¿‹‘”Û‚³‚ꂽ
+ denied to be alliance.
+@@ type = 2 “¯–¿¬Œ÷
+ success to invite to be alliance.
+R 0177 <len>.w <index>.w*
+ ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg
+ list of items that need to be judge( i mean unkown items.)
+S 0178 <index>.w
+ ƒAƒCƒeƒ€ŠÓ’è
+ judge item.
+R 0179 <index>.w <fail>.B
+ ƒAƒCƒeƒ€ŠÓ’茋‰ÊBfail=00‚ŬŒ÷Bfail=01‚Á‚Ä‚ ‚é‚Ì‚©?
+ response to judging item. fail=00 is success. is there fail=01?
+S 017A <index>.w
+@@ ƒJ[ƒh‚vƒNƒŠƒbƒN
+ card is double clicked.
+R 017B <len>.w {<index>.w}*
+@@ ƒJ[ƒh‘}“ü‚Å‚«‚éƒAƒCƒeƒ€Index”Ô†
+ item index number for items that can be inserted card.
+S 017C <SrcIndex>.w <DescIndex>.w
+@@ Src ‚ðDesc‚É“Ë‚Áž‚Þ
+ insert Src to Desc.
+R 017D <DescIndex>.w <SrcIndex>.w <fail>.b
+@@ Src ‚ðDesc‚É“Ë‚Áž‚Ý<fail> 0=¬Œ÷ 1=Ž¸”sH
+ response to insert Src to Desc. fail=0 is success, fail=01 is fail?
+S 017e <len>.w <message>.?B
+ ƒMƒ‹ƒh“àƒƒbƒZ[ƒW”­Œ¾
+ send speach for guild members.
+R 017f <len>.w <message>.?B
+ ƒMƒ‹ƒh“àƒƒbƒZ[ƒWŽóM
+ receive guild message.
+R 0182 <accID>.l <charactorID>.l <hair type>.w <hair color>.w <sex?>.w <job>.w <lvl?>.w <experience?>.l <online>.l <Position>.l ?.50B <nick>.24B
+
+R 0187 <account ID>.l
+ aliveM†?
+ alive signal?
+R 0188 <fail?>.w <index>.w <val>.w
+ •Ší¸˜BBŒ‹‰Ê+val•Ší‚É
+ weapon refiling. result+val to weapon
+R 0189 ?.w
+ “äBƒeƒŒƒ|Ž¸”s?
+ unknown. fail to teleport?
+S 018a ?.w
+ ƒQ[ƒ€I—¹
+ game quited.
+R 018b <fail>.w
+ ƒQ[ƒ€I—¹/ƒLƒƒƒ‰ƒZƒŒ‰ž“šBfail=0¬Œ÷Bfail=1Ž¸”s?
+ game quited/character select sever response. fail=0 is success, fail=1 is fail?
+R 018C <MonsID>.w <class>.w <size>.w <HP>.w <?>.w <deffence>.w <kind of monster>.w <magic deffence>.w <attribute>.w <anti-attribute?>.9b
+ wiz‚Ì“G‚̃Zƒ“ƒXŒ‹‰Ê
+ response to sense skill by wizard.
+ 0 ¬Œ^
+ small
+ 1 ’†Œ^
+ middle
+ 2 ‘åŒ^
+ big
+R 0191 <ID>.l <message>.80B
+ ƒg[ƒL[ƒ{ƒbƒNƒX‚̃ƒbƒZ[ƒW
+ message of talky box.
+S 0193 <ID>.l
+ ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«?
+ name search for guild member?
+R 0194 <ID>.l <nick>.24B
+ ƒMƒ‹ƒhƒƒ“ƒo–¼‘Oˆø‚«‰ž“š?
+ response to name search for guild member?
+R 0195 <ID>.l <nick>.24B <party name>.24B <guild name>.24B <class name>.24B
+ ƒMƒ‹ƒhŠ‘®PC‚ÌꇂÌ0094•Ô“š
+ response to packet number 0094 that if the player joined guild.
+R 0196 <type>.w <ID>.l
+ ‘‹­ŒnƒXƒLƒ‹Žg—pŽž‚̃ƒbƒZ[ƒWFXBID‚Ítarget‚ÆŽv‚í‚ê‚邪Ž©•ª‘ŠŽè‚Ì‚Ý‚µ‚©—ˆ‚È‚¢?
+ various message of skill that effect status. ID must be target, but only m ID and other's ID are sent?
+ type=00 2HQ•t—^uUŒ‚‘¬“x‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
+ 2HQ casted. "attack speed insreased."
+ type=01 2HQ‰ðœuUŒ‚‘¬“x‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ 2HQ ended. "attack speed decreased."
+ type=02 IMPOSITIO•t—^u•Ší‚ÌUŒ‚—Í‚ª‘‰Á‚µ‚Ü‚µ‚½Bv
+ IMPOSITIO casted. "power of the weapon increased."
+ type=03 IMPOSITIO‰ðœu•Ší‚ÌUŒ‚—Í‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ IMPOSITIO ened. "power of the weapon decreased."
+ type=04 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ¸­‚µ‚Ü‚µ‚½Bv
+ "casting delay become short"
+ type=05 uƒXƒLƒ‹Žg—pƒfƒBƒŒƒC‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ "casting delay return to defailt"
+ type=06 u•Ší‚É“Å‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ "attribute of poison is given to the weapon"
+ type=07 ASPERSIO•t—^u•Ší‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ ASPERSIO casted. "attribute of holly is given to the weapon"
+ type=08 ASPERSIO‰ðœu•Ší‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ ASPERSIO ended. "attribute of weapon return to default"
+ type=09 u–h‹ï‚ɹ‘®«‚ª•t—^‚³‚ê‚Ü‚µ‚½Bv
+ "armor got holly attribute"
+ type=0a u–h‹ï‚Ì‘®«‚ªŒ³‚É–ß‚è‚Ü‚µ‚½Bv
+ "armor's attribute return to default"
+ type=0b KYRIE•t—^uƒoƒŠƒAó‘Ô‚É‚È‚è‚Ü‚µ‚½Bv
+ KYRIE casted. "barrier"
+ type=0c KYRIE‰ðœuƒoƒŠƒAó‘Ô‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ KYRIE ended. "barrier end"
+ type=0d uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ "became weapon ferfection mode"
+ type=0e uƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ "end weapon perfection mode"
+ type=0f uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ "became over trust mode"
+ type=10 uƒI[ƒo[ƒgƒ‰ƒXƒgƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ "end over trust mode"
+ type=11 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚É‚È‚è‚Ü‚µ‚½Bv
+ "became maximize power mode"
+ type=12 uƒ}ƒLƒVƒ}ƒCƒYƒpƒ[ƒ‚[ƒh‚ª‰ðœ‚³‚ê‚Ü‚µ‚½Bv
+ "end maximize power mode"
+S 0197 <type>.w
+ type=0 /resetstate
+ type=1 /resetskill
+ Œø”\‚Í–³‚µ?
+ no effect?
+R 019b <ID>.l <type>.l
+ ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
+ display other's level up effect or weapon refiling?
+ type=0 base lvup?
+ type=1 job lvup?
+ type=3 •Ší¸˜B
+ weapon refiling
+R 0199 <type>.w
+@@ type=1 pvpƒ‚[ƒhŠJŽn?
+ start pvp mode?
+R 019a <ID>.l <rank>.l <num>.l
+@@ pvp‡ˆÊ rank/num
+ pvp rank rank/num
+R 019b <ID>.l <type>.l
+ ‘¼l‚Ìlvup‚â•Ší¸˜B“™‚Ì•\Ž¦?
+ type=0 base lvup?
+ type=1 job lvup?
+ type=2 •Ší¸˜BŽ¸”s
+ type=3 •Ší¸˜B¬Œ÷
+
+R 019d <?>.4B
+ GMƒRƒ}ƒ“ƒh/hide
+
+S 00CC <ID>.l
+@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uinamejŽg—pŽÒ‹­§I—¹vŽg—p
+ use special right click menu for GM "(name) force to quit"
+
+S 0149 <ID>.l <type>.B <time>.w
+@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ð‰º‚°‚éi‰ð‚¯‚éjvŽg—p ¨ type=00
+ use special right click menu for GM "decrease prohibited time to create chat room". type=00
+@ GM—p‰EƒNƒŠƒbƒNƒƒjƒ…[uƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ‚ðã‚°‚éiŠ|‚¯‚éjvŽg—p ¨ type=01
+ use special right click menu for GM "increase prohibited time to create chat room". type=01
+ @time‚Í•ª’PˆÊ‚Å‚·iŠm‚©
+ unit is minute (maybe
+
+R 019e
+ •ßŠlƒ‚ƒ“ƒXƒ^[Œˆ‚ß
+S 019f <ID>.l
+ •ßŠlƒ‚ƒ“ƒXƒ^[Žw’è
+R 01a0 <fail>.B
+ •ßŠl”»’è
+ fail=01‚ŬŒ÷A00‚ÅŽ¸”s
+S 01a1 <param>.1B
+ <param>
+ 0x00Fƒyƒbƒgó‘Ô•\Ž¦
+ 0x01F‰a‚ð—^‚¦‚é
+ 0x02FƒpƒtƒH[ƒ}ƒ“ƒX
+ 0x03F—‘‚É–ß‚·
+ 0x04FƒAƒNƒZƒTƒŠ‰ðœ
+R 01a2 <pet name>.24B <name flag>.B <lv>.w <hungry>.w <friendly>.w <accessory>.w
+ ƒyƒbƒg‚Ìó‘Ô
+ name flag:00=–¼‘O–¢Ý’è 01=–¼‘OÝ’èÏ‚Ý(•ÏX•s‰Â)
+ lv=ƒyƒbƒg‚̃Œƒxƒ‹Ahungry=–ž• “x(0~100)Afriendly=e–§“x(‰Šú’l250?)Aaccessory=ƒAƒNƒZƒTƒŠ‚ÌItemID
+R 01a3 <fail>.B <itemID>.w
+ <fail>
+ 0x00F‰a‚â‚莸”s
+ 0x01F‰a‚â‚謌÷
+R 01a4 <type>.B <ID>.l <val>.l
+ ƒyƒbƒgŠÖ˜A’Ê’m
+ type=00,val=00 ƒyƒbƒg›z‰»Žž‚É‘—‚ç‚ê‚Ä‚­‚éBƒyƒbƒg”FŽ¯—pH
+ type=01 e–§“x•Ï‰»
+ type=02 –ž• “x•Ï‰»
+ type=03 ƒAƒNƒZƒTƒŠ•Ï‰»(0‚Å–¢‘•”õ)
+ type=04 ƒpƒtƒH[ƒ}ƒ“ƒX Šm”F‚³‚ꂽval=1~3
+ (4‚̓XƒyƒVƒƒƒ‹ƒpƒtƒH[ƒ}ƒ“ƒXH)
+ type=05 HŠm”F‚³‚ꂽval=0x14
+S 01a5 <pet name>.24B
+ ƒyƒbƒg‚Ì–¼‘OŒˆ‚ß
+R 01a6 <len>.w <index>.w*
+ ƒyƒbƒg‚Ì—‘ƒŠƒXƒg
+S 01a7 <index>.w
+ ƒyƒbƒg‚Ì—‘ƒŠƒXƒg‚ª‘I‘ð‚³‚ê‚½
+S 01a9 <emotion>.l
+ ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“‘—M
+R 01aa <ID>.l <emotion>.l
+ ƒyƒbƒgƒGƒ‚[ƒVƒ‡ƒ“ŽóM
+ <emotion>
+ 33ˆÈ‰º‚Ì‚Æ‚«FƒGƒ‚[ƒVƒ‡ƒ“
+ 34ˆÈã‚Ì‚Æ‚«F”­Œ¾ƒe[ƒuƒ‹H
+R 01ac <object id>.l
+ ƒAƒ“ƒNƒ‹‚Ì”­“®(‚Ý’u)Žž‚Ì‚Ý–ˆ‰ñoŒ»(‹@”\‚Í“ä)
+R 01ad <len>.l <item>.w
+ –îì‚è‚Ì쬉”\ITEM•\ŽóM
+S 01ae <itemID>.w
+ –îì‚è‚ÅŽg‚¤Þ—¿‘—M
+S 01af <type>.w
+ ƒ`ƒFƒ“ƒWƒJ[ƒgiƒJ[ƒg‘I‘ðj
+ type=1 ƒm[ƒ}ƒ‹ƒJ[ƒg
+R 01b0 <monster id>.l <?>.b <new monster code>.l
+ –û‚̃Nƒ‰ƒXƒ`ƒFƒ“ƒW
+ <new monster code>‚̓`ƒFƒ“ƒWŒã‚̃R[ƒh(1001`)‚ðdword‚Å
+S 01b2 <len>.w <message>.80B <flag>.B {<index>.w <amount>.w <value>.l}.8B*
+ ˜I“XŠJÝ
+ flag F 0=ƒLƒƒƒ“ƒZƒ‹ , 1=ƒI[ƒvƒ“
+R 01b3 <filename>.64B <type>.B
+ R 0145‚ÌãˆÊŒÝŠ·
+R 01B6 <guildID>.l <guildLv>.l <connum>.l <’èˆõ>.l <Avl.lvl>.l <now_exp>.l <next_exp>.l <ã”[ƒ|ƒCƒ“ƒg>.l <«ŒüF-V>.l <«ŒüR-W>.l <members>.l <guild name>.24B <guild master>.24B <agit?>.20B
+ ƒMƒ‹ƒhî•ñ
+R 01b9 <ID>.I
+ ”íƒ_ƒ“™‚É‚æ‚éID‚̉r¥’†’f
+
+R 01c0
+ Some request for some status. Signature of sakexes later than 628. Used to send friends list.
+ Probably can be used to tell the player that his sakexe is not the latest version.
+
+R 01c4 <index>.w <amount>.l <itemID>.w <item data>.12B
+ ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€
+R 01c8 <index>.w <item ID>.w <ID>.l <amount left>.w <type>.B
+ ƒAƒCƒeƒ€Žg—p‰ž“šB(00a8‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type=00‚Ìꇎg—pŽ¸”s? amount‚àƒSƒ~‚Ì–Í—l
+ type=01‚ÌꇬŒ÷‚ÅAamount‚ÍŽg—pŒã‚ÌŽc‚èŒÂ”
+R 01c9 <dst ID>.l <src ID>.l <X>.w <Y>.w <type>.B <fail>.B ?.81b
+ ƒXƒLƒ‹Œø”\’nì¬(011f‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type 0x7e:SWA0x7f:‰Î•ÇA0x80 ƒ|ƒ^ŠJ‚«’†A0x81 ƒ|ƒ^ŠJ‚«’¼‘O
+ 0x82 ¹‘ÌA0x83 ƒTƒ“ƒNA0x84 ƒ}ƒOƒkƒXA0x85 ƒjƒ…[ƒ}
+ 0x86 0x86 ‘å–‚–@(SG/MS/LoV/GX)A0x87 ƒtƒ@ƒCƒ„[ƒsƒ‰‘Ò‹@
+ 0x88 ƒtƒ@ƒCƒ„[ƒsƒ‰”š”­A0x87`0x8B •\Ž¦–³‚µA
+ 0x8c ƒg[ƒL[ƒ{ƒbƒNƒX(”­“®’†)A0x8D ƒAƒCƒXƒEƒH[ƒ‹
+ 0x8E ƒNƒƒOƒ}ƒCƒAA0x8f ƒuƒ‰ƒXƒgƒ}ƒCƒ“A0x90 ƒXƒLƒbƒh
+ 0x91 ƒAƒ“ƒNƒ‹A0x92 ƒxƒmƒ€ƒ_ƒXƒgA0x93 ƒ‰ƒ“ƒhƒ}ƒCƒ“
+ 0x94 ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒvA0x95 ƒTƒ“ƒhƒ}ƒ“
+ 0x96 ƒtƒ‰ƒbƒVƒƒ[A0x97 ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv
+ 0x98 ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒvA0x99 ƒg[ƒL[ƒ{ƒbƒNƒX
+ 0x9A ƒ{ƒ‹ƒP[ƒmA0x9B ƒfƒŠƒ…[ƒWA0x9C ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
+ 0x9D ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[A0x9E Zenyƒ}[ƒNA0x9F Zeny‘Ü
+ 0xA0 ‰ñ‚é—΂̗ÖA0xA1 ƒsƒ“ƒN‚̉¹•„ (“ñ˜A•„—L‚è
+ 0xA2 ^‚ñ’†‚É“_‚Ì‚ ‚éŒõ‚Ì‹ÊA0xA3 ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒO
+ 0xA4 [•£‚Ì’†‚ÉA0xA5 ‰ñ‚é‚¢—ÖA0xA6 •s‹¦˜a‰¹
+ 0xA7 Œû“JA0xA8 —[—z‚̃AƒTƒVƒ“ƒNƒƒXA0xA9 ƒuƒ‰ƒM‚ÌŽ
+ 0xAA ƒCƒhƒDƒ“‚Ì—ÑŒçA0xAB Ž©•ªŸŽè‚ȃ_ƒ“ƒXA0xAC ƒnƒ~ƒ“ƒO
+ 0xAD Ž„‚ð–Y‚ê‚È‚¢‚ÅcA0xAE ƒT[ƒrƒXƒtƒH[ƒ†[
+ 0xAF ƒsƒ“ƒN‚̃XƒvƒŠƒ“ƒOA0xB0 •\Ž¦–³‚µ
+ 0xB0 ƒOƒ‰ƒtƒBƒeƒB,
+ 0xB1 ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“A0xB2`0xBF •\Ž¦–³‚µ
+ 0xB2 ƒsƒ“ƒN‚̃[ƒvƒ|[ƒ^ƒ‹•—
+ 0xB3 ¬‚³‚È\Žš‰Ë‚ª‚Ó‚æ‚Ó‚æ
+ 0xB4 ƒoƒWƒŠƒJA0xB5 ƒGƒtƒFƒNƒg‚È‚µH
+ 0xB6 •‚¢~‚ª—§‘Ì“I‚É•‚‚©‚Ñオ‚é
+ 0xB7 ƒNƒ‚‚Ì‘ƒA0xB8` ƒGƒtƒFƒNƒg‚È‚µH
+
+ ‘¼î•ñ‹‚Þ
+ ?.81b‚Í“äB
+R 01cd (<sid>.l)x7
+ ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆŽóM
+ <sid>x7 ‚É‚Í NB,CB,FB,LB,SS,FBL,FD ‚̇‚ŃXƒLƒ‹ƒR[ƒh‚ªdword‚Å“ü‚é
+ ‚Ü‚¾‘I‘ð‚Å‚«‚È‚¢ƒXƒLƒ‹‚Ì•”•ª‚Í <sid> = 0x00000000 ‚ª“ü‚é
+S 01ce <sid>.l
+ ƒI[ƒgƒXƒyƒ‹‘I‘ðŽˆ‘—M
+R 01cf <crusader id>.l <target id>.l <?>.18b
+ Œ£gó‘Ôƒ^[ƒQƒbƒgON/OFFBŒ£g‚ªØ‚ê‚é‚Æ <target id> ‚ª 0x00000000 ‚É‚È‚é
+
+R 01d0 <ID>.l <num>.w
+ <num> : ‹CŒ÷‚Ì”(”ñLv)
+R 01d1 <monk id>.l <target monster id>.l <bool>.l
+ ”’‰HŽæ‚èó‘ÔON/OFFB<bool> ‚Í”’nŽæ‚謗§Žž‚É 0x00000001 ‰ðœŽž‚É 0x00000000 ‚ª—ˆ‚é
+R 01d2 <id>.l <delay>.l
+ ƒ‚ƒ“ƒN‚̃Rƒ“ƒ{ƒfƒBƒŒƒC(msec)
+ ŽO’iE˜A‘Å‚ÍŠî–{ƒfƒBƒŒƒC1000(+300)A–Ò—´‚ÍŠî–{ƒfƒBƒŒƒC700(+300)
+R 01d4 <ID>.l
+ •¶Žš—ñ“ü—Í‘‹•\Ž¦(ID‚ÍNPC‚ÌID‚ª“ü‚é)
+S 01d5 <len>.w <ID>.l <input>.?B 00
+ •¶Žš—ñ“ü—Í“à—e‘—M(ID‚ÍNPC‚ÌID‚ª“ü‚é)
+R 01d7 <ID>.l <equip point>.b <item id1>.w <item id2>.w
+ ‘•”õƒOƒ‰ƒtƒBƒbƒN <equip point> ‚Í 02Žè‚Æ09‘«‚Ì‚ÝŠm”FBid2‚ͶŽè
+R 01d8 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w <head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <sit>.B <Lv>.B ?.B
+ ƒ}ƒbƒvƒ[ƒhŽž&ˆÚ“®Žž—pAŒü‚«•t‚«—pƒLƒƒƒ‰î•ñ?(0078‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+R 01d9 <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.w <item id1>.w <item id2>.w.<head option bottom>.w <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_dir>.3B ?.B ?.B <Lv>.B ?.B
+ ƒeƒŒƒ|“™‚Ì•\Ž¦”ÍˆÍ“à•¦‚«ƒLƒƒƒ‰—pAŒü‚«•t‚«–³‚µƒLƒƒƒ‰î•ñ?(0079‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+R 01da <ID>.l <speed>.w <opt1>.w <opt2>.w <option>.w <class>.w <hair>.<item id1>.w <item id2>.w <head option bottom>.w <server tick>.l <head option top>.w <head option mid>.w <hair color>.w ?.w <head dir>.w <guild>.l <emblem>.l <manner>.w <karma>.B <sex>.B <X_Y_X_Y>.5B ?.B ?.B ?.B <Lv>.B ?.B
+ •\Ž¦”͈͓àƒLƒƒƒ‰ˆÚ“®î•ñ(007b‚ÌãˆÊƒo[ƒWƒ‡ƒ“)
+S 01db
+ ˆÃ†‰»key—v‹
+R 01dc <len>.w <key>.?B
+ ˆÃ†‰»key‘—•t
+S 01dd <version>.l <account name>.24B <md5 binary>.16B <version2>.1B
+ id&ˆÃ†‰»Ï‚Ýpass‘—M
+ ‡‚ɃNƒ‰ƒCƒAƒ“ƒg‚ª01db‚ð‘—‚éA
+ ŽI‚ª01dc‚Åkey‚ð•Ô‚·A
+ ƒNƒ‰ƒCƒAƒ“ƒg‚ª"<key><password>"‚ɂ‚¢‚Ämd5ŒvŽZ‚µ
+ <md5 binary>‚ÌŠ‚ð–„‚ß‚Ä01dd‚ð‘—‚éB
+ <passwordencrypt2>‚ÌŽž‚Í
+ "<key><password>"‚ɑ΂µ‚Ämd5ŒvŽZ‚Æ‚µ‚Ä‚¢‚銂ð
+ "<password><key>"‚Æ•ÏX‚·‚é
+R 01de <skill ID>.w <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.l <param2>.w <param3>.w <type>.B
+ UŒ‚ŒnƒXƒLƒ‹ƒGƒtƒFƒNƒg@(0114‚ÌãˆÊƒo[ƒVƒ‡ƒ“H)
+ type=04 ‰Î•Ç‚ÅŠÏ‘ª type=06‚Æ‚Ù‚Ú“¯‚¶?
+ type=05 NB/FBl‚Ì•ªŽU‚µ‚½ƒ_ƒ[ƒW—pH
+ type=06 ’P”­‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í1ŒÅ’è‚Æ—\‘z
+ type=07 ƒ_ƒ[ƒW•\Ž¦–³‚µH
+ type=08 ˜A‘Å‚à‚Ì? param1‚̓_ƒ[ƒW‡ŒvAparam2‚ÍlevelAparam3‚Í•ªŠ„”‚Æ—\‘z
+ type=09 ƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚È‚µ‚Ƀ_ƒ[ƒW‚¾‚¯•\Ž¦‚³‚ê‚镨(ƒCƒ“ƒfƒ…ƒA)‚ÆŽv‚Á‚½‚Ì‚¾‚ªƒ_ƒ[ƒWƒ‚[ƒVƒ‡ƒ“‚ªo‚镨B(‹@”\‚Í“ä)
+S 01df <ID>.|
+ GM‰EƒNƒŠƒbƒN‚É‚æ‚éID‚̃`ƒƒƒbƒg‹ÖŽ~‰ñ”ŽQÆH
+R 01e1 <ID>.l <num>.w
+ <num> : ‹CŒ÷‚Ì”(”ñLv) ˆê“x•\Ž¦‚µ‚½‚çŒã‚Ç‚ñ‚Ènum‚ª—ˆ‚Ä‚à–³Ž‹‚³‚ê‚éB
+R 01e6 <partner name>.24B
+ Œ‹¥ƒXƒLƒ‹‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž‚Ì‹©‚Ѻ
+S 01e7
+ ƒXƒpƒmƒr‚Å/doridori‚µ‚½‚ç”ò‚ñ‚Å‚­‚éBSPR‰ñ•œ—Ê2”{ƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
+S 01e8 <party name>.24B <item1>B <item2>B
+ <item1>ƒAƒCƒeƒ€ŽûW•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒBŒö—L
+ <item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp[ƒeƒB‚É‹Ï“™•ª”z
+ (00f9‚ÌãˆÊƒo[ƒVƒ‡ƒ“)
+R 01ea <ID>.l
+ Œ‹¥ƒGƒtƒFƒNƒg(‰¹ŠyAŽ†á)
+ ID‚ÍV•w‚Ì‚à‚Ì‚ª“ü‚éH
+S 01ed
+ ƒXƒpƒmƒr‚ª”š—ô”g“®‚É‚È‚éƒtƒ‰ƒO‚𗧂ĂéƒpƒPƒbƒg
+R 01ee <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ Š—LÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ –î‚ÌꇂÍ?.2B‚ª0x8000‚É‚È‚é
+ 00a3‚©‚ç•ÏX
+R 01ef <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ ƒJ[ƒg“àƒAƒCƒeƒ€BÁ–Õ•i/ŽûW•i
+ 0123‚©‚ç•ÏX
+R 01f0 <len>.w {<index>.w <item ID>.w <type>.B <identify flag>.B <amount>.w ?.2B <card>.4w}.18B*
+ ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ 00a5‚©‚ç•ÏX
+R 01f4 <name>.24B <trade id?>.L <LV>.w
+ æ•û‚©‚çŽæˆø—v¿
+ 00e5‚©‚ç•ÏX
+R 01f5 <result>.B <trade id?>.L <LV>.w
+ ‚±‚¿‚ç‚©‚ç‚ÌŽæˆø—v¿‚ɑ΂·‚锽‰ž
+ 00e7‚©‚ç•ÏX
+S 0200 <login name>.24B
+ ragexe‚É/accountƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚Ä‹N“®‚·‚é‚ƃƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒg
+
+R 0201 ?.1B<Flag?>.1B (?.8B <Character Name>.24B)x20
+ Flag seems to need to be 1 to function.
+ 8 unknown bytes and 24 bytes for name need to be repeated for each friend.
+
+S 0202 <Character name>.24B
+ Character name to add to friend list (for server-side friend list enabled clients)
+
+R 0203 <Account ID>.3B <Unknown>.3B
+ Account ID = zero terminated 3-word hex representation of account ID. Little endian.
+ Unknown = observed dependency on online/offline status
+
+S 0204 <?>.16B
+ ƒƒOƒCƒ“—v‹‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB16ƒoƒCƒg‚͌ŒèH
+S 020B <?>.17B
+ ƒLƒƒƒ‰ƒNƒ^ƒT[ƒoÚ‘±—v‹0065‚É•t‰Á‚³‚ê‚éƒpƒPƒbƒgB1+0204‚Ì16ƒoƒCƒg‚Å17ƒoƒCƒgH
+
+
+ƒpƒPƒbƒg’·‚̒ljÁB019e`01aa‚ª‘‚¦‚Ä‚é‚Ì‚ÅA0190`‚ð؂蔲‚«
+added packet lenth. 019e-01aa is a new, so here is a packet length table from 0190.
+
+@ 90, 86, 24,@6, 30,102,@8,@4,@ 8,@4, 14, 10, -1,@6,@2,@6,
+@@3,@3, 35,@5, 11, 26, -1,@4,@ 4,@6, 10
diff --git a/doc/pccommand_list.txt b/doc/pccommand_list.txt
index d147cff54..25c16fed6 100644
--- a/doc/pccommand_list.txt
+++ b/doc/pccommand_list.txt
@@ -1,169 +1,169 @@
----> PC Command List
-------> Here's a list of scripts that can be triggered by PC actions and what they do.
-------> Configuration is found at conf/script_athena.conf
-------> There are two methods to define the script to be use (event_script_type)
-------> 0 - By NPC. There has to be an NPC named in the same manner as the event
-------> 1 - By Label. Every label from every NPC with the event name will be
- executed (note that in this case the event HAS to start with the
- word 'On', eg: 'OnPCBaseLvUpEvent:')
-
-+ PCCommand: OnPCLoginEvent
-+ Code by: (davidsiaw)
-+ How it works:
-When a player logs in, the NPC will run as if he just clicked it. Which means
-if the script is like this:
-
-+ Sample:
-prontera.gat,0,0,0 script OnPCLoginEvent -1,{
- mes "lmao";
- close;
- }
-
-+ Explaination:
-every player who logs in will recieve a message 'lmao' in their face as soon
-as they can see the map.
-
-+ Note:
- 1) The name of the NPC has to match the one specified in scripts_athena.conf
- 2) I made it invisible because you don't need to see it. Its an abstract NPC
- 3) If you don't want it, simply delete it
- 4) If you have more than one only the first found will be execute (when using
- event_script_type 0)
- 5) You can put this script in ANY file.
- 6) I put an end; there because that just makes it do nothing.
- 7) Modify this script to your liking and give your players a surprise
- 8) Remember: IT RUNS LIKE A NORMAL NPC. BUT THE ONLY WAY TO 'CLICK' IT IS BY
- LOGGING ON
- 9) There are 2 ways to use this - check the examples below!
-
------------------------------------------------------------------------------
-
-+ PCCommand: OnPcBaseLvUpEvent
-+ Code by: lordalfa
-+ How it works:
-When a player Base level increases, the NPC will run as if he just clicked it. Which means
-if the script is like this:
-
-+ Sample:
-- Script OnPCBaseLvUpEvent -1,{
- mes "zomfg....";
- close;
-}
-
-+ Explanation:
-whenever a player level ups his/her base level, the words zomfg will pop up
-in his face.
-
-+ Note:
- 1) This script runs every moment the player gains a level. It is adviced if
- you want to repeatedly use this script, to use a sort of filter.
- 2) If a player gains multiple levels from a single kill, the script will be
- only called once at the end.
-
------------------------------------------------------------------------------
-
-+ PCCommand: OnPcJobLvUpEvent
-+ Code by: lordalfa
-+ How it works:
-It's exactly the same as OnPcBaseLvUpEvent, except it triggers when leveling job.
-
------------------------------------------------------------------------------
-
-+ PCCommand: OnOnNPCKillEvent
-+ Code by: lordalfa
-+ How it works:
-When a player kills a monster, the NPC will run as if he just clicked it. Which means
-if the script is like this:
-
-+ Sample:
-- script OnNPCKillEvent -1,{
- mes "Holy shit";
- close;
-}
-
-+ Explaination:
-whenever a player kills a monster on the map, the words "Holy Shit" will appear
-on the guy's face.
-
-+ Note:
- 1) This script runs everytime a player kills a monster It is adviced if
- you want to repeatedly use this script, to use a sort of filter.
- 2) The var "KilledRid" is set on the killer, this can be used in
- strmobinfo to find out info about the Monster that was killed
------------------------------------------------------------------------------
-
-+ PCCommand: OnPCKillEvent
-+ Code by: zbuffer aka Lance
-+ How it works:
-It is exactly the same as OnNPCKillEvent, except it triggers when a player kills another player.
-
------------------------------------------------------------------------------
-
-+ PCCommand: OnPCLoadMapEvent
-+ Code by: zbuffer aka Lance
-+ How it works:
-When a player logs in on the map, the NPC will run as if he just clicked it. Which means
-if the script is like this:
-
-+ Sample:
-prontera.gat,159,192,2 script OnPCLoadMapEvent 101,{
- mes "Holy shit";
- close;
-}
-
-----or--->
-
-OnPCLoadMapEvent:
- announce " " strcharinfo(0) + " has changed map!", 16;
- end;
-
- + Note:
- 1) Both types will execute regardless of map.
- 2) The event will only trigger on maps where you enable the 'loadevent' mapflag.
-
------------------------------------------------------------------------------
-
-+ PCCommand: OnPCDieEvent
-+ Code by: Unknown
-+ How it works:
-When a player dies, the event will be run as if a npc were clicked. The RID of the person killed
-will be attached. Simple. It can to be used as a floating npc or as a npc placed on a map.
-Notice that this event is server-wide if used as a floating npc, so if you try running it for
-more than one map, and want to make a single npc, you'll have to use some sort of filter, which
-can be getmapxy, something like this:
-
-- script PCDieEvent -1,{
-if (getmapxy(@mapname$,@mapx,@mapy,0) == -1) goto L_Finish;
-if (@mapname$ == "valkyrie.gat") || (@mapname$ == "amatsu.gat") {
-killmonster "valkyrie.gat","All";
-announce "Deep Voice: You have failed.... you have another opportunity though...",bc_self,0x660033;
-if (killtest != 0) enablenpc "Outern Voices";
-if (killedonce == 1) end;
-set killedonce,1;
-} else
-end;
-
-L_Finish:
- end;
-}
-
-----or---->
-
-OnPCDieEvent:
-if (getmapxy(@mapname$,@mapx,@mapy,0) == -1) goto L_Finish;
-if (@mapname$ == "valkyrie.gat") || (@mapname$ == "amatsu.gat") {
-killmonster "valkyrie.gat","All";
-announce "Deep Voice: You have failed.... you have another opportunity though...",bc_self,0x660033;
-if (killtest != 0) enablenpc "Outern Voices";
-if (killedonce == 1) end;
-set killedonce,1;
-} else
-end;
-
-L_Finish:
- end;
-
-We're using getmapxy to obtain the mapname, then adjust our commands and actions depending on the
-map. We could also use the command to find if the player died inside a wished area.
-
------------------------------------------------------------------------------
+---> PC Command List
+------> Here's a list of scripts that can be triggered by PC actions and what they do.
+------> Configuration is found at conf/script_athena.conf
+------> There are two methods to define the script to be use (event_script_type)
+------> 0 - By NPC. There has to be an NPC named in the same manner as the event
+------> 1 - By Label. Every label from every NPC with the event name will be
+ executed (note that in this case the event HAS to start with the
+ word 'On', eg: 'OnPCBaseLvUpEvent:')
+
++ PCCommand: OnPCLoginEvent
++ Code by: (davidsiaw)
++ How it works:
+When a player logs in, the NPC will run as if he just clicked it. Which means
+if the script is like this:
+
++ Sample:
+prontera.gat,0,0,0 script OnPCLoginEvent -1,{
+ mes "lmao";
+ close;
+ }
+
++ Explaination:
+every player who logs in will recieve a message 'lmao' in their face as soon
+as they can see the map.
+
++ Note:
+ 1) The name of the NPC has to match the one specified in scripts_athena.conf
+ 2) I made it invisible because you don't need to see it. Its an abstract NPC
+ 3) If you don't want it, simply delete it
+ 4) If you have more than one only the first found will be execute (when using
+ event_script_type 0)
+ 5) You can put this script in ANY file.
+ 6) I put an end; there because that just makes it do nothing.
+ 7) Modify this script to your liking and give your players a surprise
+ 8) Remember: IT RUNS LIKE A NORMAL NPC. BUT THE ONLY WAY TO 'CLICK' IT IS BY
+ LOGGING ON
+ 9) There are 2 ways to use this - check the examples below!
+
+-----------------------------------------------------------------------------
+
++ PCCommand: OnPcBaseLvUpEvent
++ Code by: lordalfa
++ How it works:
+When a player Base level increases, the NPC will run as if he just clicked it. Which means
+if the script is like this:
+
++ Sample:
+- Script OnPCBaseLvUpEvent -1,{
+ mes "zomfg....";
+ close;
+}
+
++ Explanation:
+whenever a player level ups his/her base level, the words zomfg will pop up
+in his face.
+
++ Note:
+ 1) This script runs every moment the player gains a level. It is adviced if
+ you want to repeatedly use this script, to use a sort of filter.
+ 2) If a player gains multiple levels from a single kill, the script will be
+ only called once at the end.
+
+-----------------------------------------------------------------------------
+
++ PCCommand: OnPcJobLvUpEvent
++ Code by: lordalfa
++ How it works:
+It's exactly the same as OnPcBaseLvUpEvent, except it triggers when leveling job.
+
+-----------------------------------------------------------------------------
+
++ PCCommand: OnOnNPCKillEvent
++ Code by: lordalfa
++ How it works:
+When a player kills a monster, the NPC will run as if he just clicked it. Which means
+if the script is like this:
+
++ Sample:
+- script OnNPCKillEvent -1,{
+ mes "Holy shit";
+ close;
+}
+
++ Explaination:
+whenever a player kills a monster on the map, the words "Holy Shit" will appear
+on the guy's face.
+
++ Note:
+ 1) This script runs everytime a player kills a monster It is adviced if
+ you want to repeatedly use this script, to use a sort of filter.
+ 2) The var "KilledRid" is set on the killer, this can be used in
+ strmobinfo to find out info about the Monster that was killed
+-----------------------------------------------------------------------------
+
++ PCCommand: OnPCKillEvent
++ Code by: zbuffer aka Lance
++ How it works:
+It is exactly the same as OnNPCKillEvent, except it triggers when a player kills another player.
+
+-----------------------------------------------------------------------------
+
++ PCCommand: OnPCLoadMapEvent
++ Code by: zbuffer aka Lance
++ How it works:
+When a player logs in on the map, the NPC will run as if he just clicked it. Which means
+if the script is like this:
+
++ Sample:
+prontera.gat,159,192,2 script OnPCLoadMapEvent 101,{
+ mes "Holy shit";
+ close;
+}
+
+----or--->
+
+OnPCLoadMapEvent:
+ announce " " strcharinfo(0) + " has changed map!", 16;
+ end;
+
+ + Note:
+ 1) Both types will execute regardless of map.
+ 2) The event will only trigger on maps where you enable the 'loadevent' mapflag.
+
+-----------------------------------------------------------------------------
+
++ PCCommand: OnPCDieEvent
++ Code by: Unknown
++ How it works:
+When a player dies, the event will be run as if a npc were clicked. The RID of the person killed
+will be attached. Simple. It can to be used as a floating npc or as a npc placed on a map.
+Notice that this event is server-wide if used as a floating npc, so if you try running it for
+more than one map, and want to make a single npc, you'll have to use some sort of filter, which
+can be getmapxy, something like this:
+
+- script PCDieEvent -1,{
+if (getmapxy(@mapname$,@mapx,@mapy,0) == -1) goto L_Finish;
+if (@mapname$ == "valkyrie.gat") || (@mapname$ == "amatsu.gat") {
+killmonster "valkyrie.gat","All";
+announce "Deep Voice: You have failed.... you have another opportunity though...",bc_self,0x660033;
+if (killtest != 0) enablenpc "Outern Voices";
+if (killedonce == 1) end;
+set killedonce,1;
+} else
+end;
+
+L_Finish:
+ end;
+}
+
+----or---->
+
+OnPCDieEvent:
+if (getmapxy(@mapname$,@mapx,@mapy,0) == -1) goto L_Finish;
+if (@mapname$ == "valkyrie.gat") || (@mapname$ == "amatsu.gat") {
+killmonster "valkyrie.gat","All";
+announce "Deep Voice: You have failed.... you have another opportunity though...",bc_self,0x660033;
+if (killtest != 0) enablenpc "Outern Voices";
+if (killedonce == 1) end;
+set killedonce,1;
+} else
+end;
+
+L_Finish:
+ end;
+
+We're using getmapxy to obtain the mapname, then adjust our commands and actions depending on the
+map. We could also use the command to find if the player died inside a wished area.
+
+-----------------------------------------------------------------------------
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index b44ca8082..bb3438ef1 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -1,5277 +1,5277 @@
-//===== Athena Script =====================================
-//= eAthena Script Commands
-//===== By ================================================
-//= Fredzilla
-//===== Helped By =========================================
-//= Terminal Vertex & Z3R0 - Helped define getmapxy
-//= HappyDenn - Gave everything to do with getpartymember
-//= a great help
-//= Maeki Rika - A section on general concepts and lots of
-//= other updates and additions.
-//===== Version ===========================================
-//= 2.8a
-//=========================================================
-//= 1.0 - First release, filled will as much info as I could
-//= remember or figure out, most likely there are errors,
-//= and things I have missed out
-//= 1.1 - Added better discription for "getmapxy"
-//= 1.2b- Added a description for getpartymember
-//= (+few spelling mistakes corrected)
-//= 2.0 - +79kb extra stuff and numerous corrections by
-//= Maeki Rika.
-//= 2.1 - Small but important corrections, more proofreading.
-//= Some important discoveries in item functions, the
-//= secret of making VVS weapons with 'getitem2' and
-//= other news. (Rika again) +10kb :)
-//= 2.2 - added getItemInfo description [Lupus]
-//= 2.3 - added plenty of info for recent (and not so) script commands I added
-// [Skotlex]
-//= 2.4 - Explained the upper parameter of jobchange. [Skotlex]
-//= 2.5 - Added pow, sqrt and distance. [Lance]
-//= 2.6 - Added setd and getd. [Lance]
-//= 2.7 - petstat command. [Lance]
-//= 2.7a - delitem2, countitems2 commands [Lupus]
-//= 2.7b - clone command [Skotlex]
-//= 2.7c - disguise / undisguise, query_sql commands [Lupus]
-
-//= 2.8 - Deleted a copy of the nude command. Added axtoi command (needing a clearer
-//= explanation of atoi.Gave a better explanation of OnLabels and modified
-//= monster explanation due that L_Label isn't working with monster.
-//===== Compatible With ===================================
-//= LOL, can be used by anyone hopefully
-//===== Description =======================================
-//= A reference manual for the eAthena scripting language
-//=========================================================
-
-This document is a reference manual for all the scripting commands and functions
-available in current eAthena SVN. It is not a simple tutorial. When people tell
-you to "Read The F***ing Manual", they mean this.
-
-The information was mostly acquired through looking up how things actually work
-in the source code of the server, which was written by many people over time,
-and lots of them don't speak English and never left any notes - or are otherwise
-not available for comments. As such, anything written in here might not be
-correct, it is only correct to the best of our knowledge, which is limited.
-
-This document is poorly structured and rather messy in general. In fact, further
-cleaning up and reordering this document is probably pointless, due to upcoming
-switch to Lua scripting language, which will rid us of most of the problems
-mentioned herein and make a new manual necessary. But while we have this one, we
-should make the most of it, and it might be helpful in making sure the new Lua
-engine can actually do everything useful that the old engine could.
-
-This is not a place to teach you basic programming. This document will not teach
-you basic programming by itself. It's more of a reference for those who have at
-least a vague idea of what they want to do and want to know what tools they have
-available to do it. We've tried to keep it as simple as feasible, but if you
-don't understand it, getting a clear book on programming in general will help
-better than yelling around the forum for help.
-
-A little learning never caused anyone's head to explode.
-
-Structure
----------
-
-The commands and functions are listed in no particular order:
-
-*Name of the command and how to call it.
-
-Descriptive text
-
- Small example if possible. Will usually be incomplete, it's there just to
- give you an idea of how it works in practice.
-
-To find a specific command, use Ctrl+F, (or whatever keys call up a search
-function in whatever you're reading this with) put an * followed by the command
-name, and it should find the command description for you.
-
-If you find anything omitted, please respond. :)
-
-Syntax
-------
-
-Throughout this document, wherever a command wants an argument, it is given in
-<angle brackets>. This doesn't mean you should type the angle brackets. :) If an
-argument of a command is optional, it is given in {curly brackets}. You've
-doubtlessly seen this convention somewhere, if you didn't, get used to it,
-that's how big boys do it. If a command can optionally take an unspecified
-number of arguments, you'll see a list like this:
-
-command <argument>{,<argument>...<argument>}
-
-This still means they will want to be separated by commas.
-
-Where a command wants a string, it will be given in "quotes", if it's a number,
-it will be given without them. Normally, you can put an expression, like a bunch
-of functions or operators returning a value, in (round brackets) instead of most
-numbers. Round brackets will not always be required, but they're often a good
-idea.
-
-Wherever you refer to a map name, it's always 'mapname.gat' or 'mapname.afm' if
-you are using AFM maps, (if you don't know what they are, you aren't using them)
-and not just 'mapname'. While some commands do know that if you didn't give
-'.gat', it should add it, it's pretty tricky to tell which ones they are.
-
-Script loading structure
-------------------------
-
-Scripts are loaded by the map server as referenced in the 'conf/map_athena.conf'
-configuration file, but in the default configuration, it doesn't load any script
-files itself. Instead, it loads the file 'npc/scripts_main.conf' which itself
-contains references to other files. The actual scripts are loaded from txt
-files, which are linked up like this:
-
-npc: <path to a filename>
-
-Any line like this, invoked, ultimately, by 'map_athena.conf' will load up the
-script contained in this file, which will make the script available. No file
-will get loaded twice, to prevent possible errors.
-
-Another configuration file option of relevance is:
-
-delnpc: <path to a filename>
-
-This will unload a specifiled script filename from memory, which, while
-seemingly useless, may sometimes be required.
-
-Whenever '//' is encountered in a line upon reading, everything beyond this on
-that line is considered to be a comment and is ignored. This works wherever you
-place it.
-
-Upon loading all the files, the server will execute all the top-level commands
-in them. No variables exist yet at this point, no commands can be called other
-than those given in this section. These commands set up the basic server script
-structure - create NPC objects, spawn monster objects, set map flags, etc. No
-code is actually executed at this point except them. The top-level commands the
-scripting are pretty confusing, since they aren't structured like you would
-expect commands, command name first, but rather, normally start with a map name.
-
-What's more confusing about the top-level commands is that most of them use a
-tab symbol to divide their arguments.
-
-To prevent problems and confusion, the tab symbols are written as '%TAB%'
-throughout this document, even though this makes the text a bit less readable.
-Using an invisible symbol to denote arguments is one of the bad things about
-this language, but we're stuck with it for now. :)
-
-Here is a list of valid top-level commands:
-
-** Set a map flag:
-
-<map name>%TAB%mapflag%TAB%<flag>
-
-This will, upon loading, set a specified map flag on a map you like. These are
-normally in files inside 'conf/mapflag' and are loaded first, so by the time the
-server's up, all the maps have the flags they should have. Map flags determine
-the behavior of the map regarding various common problems, for a better
-explanation, see 'setmapflag'.
-
-** Create a permanent monster spawn:
-
-<map name>,<x>,<y>,<xs>,<ys>%TAB%monster%TAB%<monster name>%TAB%<mob id>,<amount>,<delay1>,<delay2>,<event>
-
-Map name is the name of the map the monsters will spawn on. x,y are the
-coordinates where the mob should spawn. If xs and ys are non-zero, they
-specify the diameters of a spawn-rectangle area who's center is x,y.
-Putting zeros instead of these coordinates will spawn the monsters randomly.
-Note this is only the initial spawn zone, as mobs random-walk, they are free
-to move away from their specified spawn region.
-
-Monster name is the name the monsters will have on screen, and has no relation
-whatsoever to their names anywhere else. It's the mob id that counts, which
-identifies monster record in 'mob_db.txt' database of monsters. If the mob name
-is given as "--ja--", the 'japanese name' field from the monster database is
-used, (which, in eAthena, actually contains an english name) if it's "--en--",
-it's the 'english name' from the monster database (which contains an uppercase
-name used to summon the monster with a GM command).
-
-If you add 20000 to the monster ID, the monster will be spawned in a 'big
-version', (monster size class will increase) and if you add 10000, the 'tiny
-version' of the monster will be created. However, this method is deprecated
-and not recommended, as the values to add can change at a later time (20000
-and 10000 actually stand for 2*MAX_MOB_DB and MAX_MOB_DB respectively, which
-is defined on mob.h, and can change in the future as more mobs are created).
-The recommended way to change a mob's size is to use the event-field (see
-below).
-
-Amount is the amount of monsters that will be spawned when this command is
-executed, it is affected by spawn rates in 'battle_athena.conf'.
-
-Delay1 and delay2 are the monster respawn delays - the first one counts the time
-since a monster defined in this spawn was last respawned and the second one
-counts the time since the monster of this spawn was last killed. Whichever turns
-out to be higher will be used. If the resulting number is smaller than a random
-value between 5 and 10 seconds, this value will be used instead. (Which is
-normally the case if both delay values are zero.) The times are given in
-1/1000ths of a second.
-
-You can specify a custom level to use for the mob different from the one of
-the database by adjoining the level after the name with a comma. eg:
-"Poring,50" for a name will spawn a monster with name Poring and level 50.
-
-Event is a script event to be executed when the mob is killed. The event must
-be in the form "NPCName::OnEventName" to execute, and the event name label
-should start with "On". As with all events, if the NPC is an on-touch npc, the
-player who triggers the script must be within 'trigger' range for the event to
-work.
-
-The Event field can be used alternatively to specify other mob properties. Use
-2 to specify that the mob should be small, 4 for big monsters, and 8 for
-special ai mobs (which by default attack other monsters instead of players).
-You can add these, so using 10 will spawn small monsters that attack other
-mobs (if you specify both 2 and 4, the small version takes priority).
-
-** Define a warp point
-
-<from map name>,<fromX>,<fromY>,<facing>%TAB%warp%TAB%<warp name>%TAB%<spanx>,<spany>,<to map name>,<toX>,<toY>
-
-This will define a warp NPC that will warp a player between maps, and while most
-arguments of that are obvious, some deserve special mention.
-
-SpanX and SpanY will make the warp sensitive to a character who didn't step
-directly on it, but walked into a zone which is centered on the warp from
-coordinates and is SpanX in each direction across the X axis and SpanY in each
-direction across the Y axis.
-
-Warp NPC objects also have a name, because you can use it to refer to them later
-with 'enablenpc'/'disablenpc'
-
-Facing of a warp object is irrelevant, it is not used in the code and all
-current scripts have a zero in there.
-
-** Define an NPC object.
-
-<map name>,<x>,<y>,<facing>%TAB%script%TAB%<NPC Name>%TAB%<sprite id>,{<code>}
-<map name>,<x>,<y>,<facing>%TAB%script%TAB%<NPC Name>%TAB%<sprite id>,<triggerX>,<triggerY>,{<code>}
-
-This will place an NPC object on a specified map at the specified location, and
-is a top-level command you will use the most in your custom scripting. The NPCs
-are triggered by clicking on them, and/or by walking in their trigger area, if
-defined, see that below.
-
-Facing is a direction the NPC sprite will face in. Not all NPC sprites have
-different images depending on the direction you look from, so for some facing
-will be meaningless. Facings are counted counterclockwise in increments of 45
-degrees, where 0 means facing towards the top of the map. (So to turn the sprite
-towards the bottom of the map, you use facing 4, and to make it look southeast
-it's facing 5.)
-
-Sprite id is the sprite number used to display this particular NPC. For a full
-list of sprite id numbers see http://kalen.s79.xrea.com/npc/npce.shtml You may
-also use a monster's ID number instead to display a monster sprite for this NPC.
-It is possible to use a job sprite as well, but you must first define it as a
-monster sprite in 'mob_avail.txt', a full description on how to do this is for
-another manual. A '-1' sprite id will make the NPC invisible (and unclickable).
-A '111' sprite id will make an NPC which does not have a sprite, but is still
-clickable, which is useful if you want to make a clickable object of the 3D
-terrain.
-
-TriggerX and triggerY, if given, will define an area, centered on NPC and
-spanning triggerX cells in every direction across X and triggerY in every
-direction across Y. Walking into that area will trigger the NPC. If no
-'OnTouch:' special label is present in the NPC code, the execution will start
-from the beginning of the script, otherwise, it will start from the 'OnTouch:'
-label.
-
-NPC name is kinda special, because it's not only the name of NPC you will see on
-screen. It's formatted this way:
-
-<Screen name>{#<Extra name identifier>}{::<Label name>}
-
-The extra identifier is there that you can make an npc with an invisible name
-(just omit the screen name, but keep the identifier name) and so that you can
-refer to several NPCs which have the same name on screen, which is useful to
-make an NPC that relocates depending on special conditions, for example - you
-define several NPC objects and hide all except one.
-('Hunter#hunter1','Hunter#hunter2'...) The extra name identifiers will let your
-code tell them apart.
-
-Label name is used to duplicate NPC objects (more on that below).
-
-The complete NPC name (Screen name + extra identifier) may not exceed 24
-characters. The label name is counted separately but also limited to 24
-characters.
-
-The code part is the script code that will execute whenever the NPC is
-triggered. It may contain commands and function calls, descriptions of which
-compose most of this document. It has to be in curly brackets, unlike elsewhere
-where we use curly brackets, these do NOT signify an optional parameter.
-
-** Define an NPC duplicate.
-
-<map name>,<x>,<y>,<facing>%TAB%duplicate(<NPC label>)%TAB%<sprite id>
-<map name>,<x>,<y>,<facing>%TAB%duplicate(<NPC label>)%TAB%<sprite id>,<triggerX>,<triggerY>
-
-This will duplicate an NPC referred to by the label. The duplicate runs the same
-code as the NPC it refers to, but may have different location, facing and sprite
-ID. Whether it may actually have it's own size of trigger area is unclear at the
-moment - if you need that, try it and tell us of the results.
-
-** Define a 'floating' NPC object.
-
--%TAB%script%TAB%-1,{<code>}
-
-This will define an NPC object not triggerable by normal means. This would
-normally mean it's pointless since it can't do anything, but there are
-exceptions, mostly related to running scripts at specified time, which is what
-these floating NPC objects are for. More on that below.
-
-** Define a shop NPC.
-
-<map name>,<x>,<y>,<facing>%TAB%shop%TAB%<NPC Name>%TAB%<sprite id>,<itemid>:<price>{,<itemid>:<price>...}
-
-This will define a shop NPC, which, when triggered (which can only be done by
-clicking) will cause a shop window to come up. No code whatsoever runs in shop
-NPCs and you can't change the prices otherwise than by editing the script
-itself. (No variables even exist at this point of scripting, so don't even
-bother trying to use them.)
-
-The item id is the number of item in the 'item_db.txt' database. If Price is set
-to -1, the 'buy price' given in the item database will be used. Otherwise, the
-price you gave will be used for this item, which is how you create differing
-prices for items in different shops.
-
-** Define a function object
-
-function%TAB%<function name>%TAB%{<code>}
-
-This will define a function object, callable with the 'callfunc' command (see
-below). This object will load on every map server separately, so you can get at
-it from anywhere. It's not possible to call the code in this object by
-anything other than the 'callfunc' script command.
-
-The code part is the script code that will execute whenever the function is
-called with 'callfunc'. It has to be in curly brackets, unlike elsewhere where
-we use curly brackets, these do NOT signify an optional parameter.
-
-** Alter a map cell
-
-<map name>%TAB%setcell%TAB%<type>,<x1>,<y1>,<x2>,<y2>
-
-This is sneaky, and isn't used in any official scripts, but it will let you
-define an area (x1/y1-x2/y2 square) of a map as having cell type 'type', where
-type is a number, which, among other things, defines whether the area is
-walkable or not, whether it has Basilica working in it or not, and some other
-things. This is a solution just itching for a problem and there's a number of
-interesting things you could use it for. Further investigation on what types are
-valid and mean what exactly is pending.
-
-Once an object is defined which has a 'code' field to it's definition, it
-contains script commands which can actually be triggered and executed.
-
-What a RID is and why do you need to know
------------------------------------------
-
-Most scripting commands and functions will want to request data about a
-character, store variables referenced to that character, send stuff to the
-client connected to that specific character. Whenever a script is invoked by a
-character, it is passed a so-called RID - this is the character ID number of a
-character that caused the code to execute by clicking on it, walking into it's
-OnTouch zone, or otherwise.
-
-If you are only writing common NPCs, you don't need to bother with it. However,
-if you use functions, if you use timers, if you use clock-based script
-activation, you need to be aware of all cases when a script execution can be
-triggered without a RID attached. This will make a lot of commands and functions
-unusable, since they want data from a specific character, want to send stuff to
-a specific client, want to store variables specific to that character, and they
-would not know what character to work on if there's no RID.
-
-Unless you use 'attachrid' to explicitly attach a character to the script first.
-
-Whenever we say 'invoking character', we mean 'the character who's RID is
-attached to the running script. The script function "playerattached" can be
-used to check which is the currently attached player to the script (it will
-return 0 if the there is no player attached or the attached player no longer
-is logged on to the map-server).
-
-Item and pet scripts
---------------------
-
-Each item in the item database has two special fields - EquipScript and
-UseScript. The first is script code run every time a character equips the item,
-with the RID of the equipping character. Every time they unequip an item, all
-temporary bonuses given by the script commands are cleared, and all the scripts
-are executed once again to rebuild them. This also happens in several other
-situations (like upon login) but the full list is currently unknown.
-
-UseScript is a piece of script code run whenever the item is used by a character
-by doubleclicking on it.
-
-Not all script commands work properly in the item scripts. Where commands and
-functions are known to be meant specifically for use in item scripts, they are
-described as such.
-
-Every pet in the pet database has a PetScript field, which determines pet
-behavior. It is invoked wherever a pet of the specified type is spawned.
-(hatched from an egg, or loaded from the char server when a character who had
-that pet following them connects) This may occur in some other situations as
-well. Don't expect anything other than commands definitely marked as usable in
-pet scripts to work in there reliably.
-
-Numbers
--------
-
-Beside the common decimal numbers, which are nothing special whatsoever (though
-do not expect to use fractions, since ALL numbers are integer in this language),
-the script engine also handles hexadecimal numbers, which are otherwise
-identical. Writing a number like '0x<hex digits>' will make it recognised as a
-hexadecimal value. Notice that 0x10 is equal to 16. Also notice that if you try
-to 'mes 0x10' it will print '16'.
-
-This is not used much, but it pays to know about it.
-
-Variables and scope
--------------------
-
-The meat of every programming language is variables - places where you store
-data.
-
-Variables are divided into global (not attached to any specific RID, and
-independent of whoever triggered the object) and local (attached to a specific
-character object or a specific account object). They are further divided into
-permanent (they come back when the server resets) and temporary (they only
-persist until the server dies). This is what's called variable scope. :)
-
-Unlike in more advanced languages, all temporary variables are essentially
-'global', but not in the sense described above - if one NPC sets a temporary
-variable, even if it is character based, if that character triggers another NPC
-object, the variable will still be there, so you should be careful and set the
-variables you mean to be temporary to something sensible before using them. It
-also pays to keep variable names descriptive and reasonably long.
-
-Variable scope is defined by a prefix before the variable name:
-
-" " - Thats right, nothing before a variable, this a permanent variable
- attached to the character object.
-"@" - A temporary version of a character-based variable.
- SVN versions before 2094 revision and RC5 version will also treat 'l' as
- a temporary variable prefix, so bevare of having variable names starting
- with 'l', they will also be considered temporary, even if you didn't mean
- them to be!
-"$" - A global permanent variable.
- They are stored in "save\mapreg.txt" file and are the only kind of
- variables stored in a text file in the SQL version.
-"$@" - A global temporary variable.
- This is important for scripts which are called with no RID attached, that
- is, not triggered by a specific character object.
-"#" - A permanent account-based variable.
- They are stored with all the account data in "save\accreg.txt" in TXT
- versions and in the SQL versions in the 'global_reg_value' table using
- type 2.
-"##" - A permanent account-based variable stored by the login server.
- They are stored in "save\account.txt" and in the SQL versions in the
- 'global_reg_value' table, using type 1. The only difference you will
- note from normal # variables is when you have multiple char-servers
- connected to the same login server. The # variables are unique to each
- char-server, while the ## variables are shared by all these
- char-servers.
-
-Some variables are special, that is, they are already defined for you by the
-scripting engine. You can see the full list somewhere in 'db/const.txt', which
-is a file you should read, since it also allows you to replace lots of numbered
-arguments for many commands with easier to read text. The special variables most
-commonly used are all permanent character-based variables:
-
-StatusPoint - Amount of status points remaining.
-BaseLevel - Current base level
-SkillPoint - Amount of skill points remaining
-Class - Current job
-Upper - 1 if the character is an advanced job class.
-Zeny - Current amount of zeny
-Sex - Character's gender, 0 if female, 1 if male.
-Weight - The weight the character currently carries.
-MaxWeight - The maximum weight the character can carry.
-JobLevel - Character's job level
-BaseExp - The amount of base experience points the character has.
- Notice that it's zero (or close) if the character just got a level.
-JobExp - Same for job levels
-NextBaseExp - Amount of experience points needed to reach the next base level.
-NextJobExp - Same for job levels.
-Hp - Current amount of hit points.
-MaxHp - Maximum amount of hit points.
-Sp - Current spell points.
-MaxSp - Maximum amount of spell points.
-BaseJob - This is sneaky, apparently meant for baby class support.
- This will supposedly equal Job_Acolyte regardless of whether the
- character is an acolyte or a baby acolyte, for example.
-Karma - The character's karma. Karma system is not fully functional, but
- this doesn't mean this doesn't work at all. Not tested.
-Manner - The character's manner rating. Becomes negative if the player
- utters words forbidden through the use of 'manner.txt' client-side
- file.
-
-While these behave as variables, do not always expect to just set them - it is
-not certain whether this will work for all of them. Whenever there is a command
-or a function to set something, it's usually preferable to use that instead. The
-notable exception is Zeny, which you can and often will address directly -
-setting it will make the character own this number of zeny.
-
-All of the above variables store numbers. They can store positive and negative
-numbers, but only whole numbers (so don't expect to do any fractional math). You
-can also store a string in a variable, but this means naming it specially to
-denote it contains text rather than a number:
-
-@variable$ is a temporary string variable.
-$@variable$ is a global temporary string variable.
-
-Etc, etc.
-
-If a variable was never set, it is considered to equal zero (for number
-variables) or an empty string ("", nothing between the quotes) for string
-variables. Once you set it to that, the variable is as good as forgotten
-forever, and no trace remains of it even if it was stored with character or
-account data.
-
-Arrays
-------
-
-Arrays (in eAthena at least) are essentially a set of variables going under the
-same name. You can tell between the specific variables of an array with an
-'array index', a number of a variable in that array:
-
-<variable name>[<array index>]
-
-Variables stored in this way, inside an array, are also called 'array elements'.
-Arrays are specifically useful for storing a set of similar data (like several
-item IDs for example) and then looping through it. You can address any array
-variable as if it was a normal variable:
-
- set @arrayofnumbers[0],1;
-
-You can also do sneaky things like using a variable (or an expression, or even a
-value from an another array) to get at an array value:
-
- set @x,100;
- set @arrayofnumbers[@x],10;
-
-This will make @arrayofnumbers[100] equal to 10.
-
-Notice that index numbering always starts with 0. Arrays cannot hold more than
-128 variables. (So the last one can't have a number higher than 127)
-
-And array indices probably can't be negative. Nobody tested what happens when
-you try to get a negatively numbered variable from an array, but it's not going
-to be pretty. :)
-
-Arrays can naturaly store strings:
-
-@menulines$[0] is the 0th element of the @menulines$ array of strings. Notice
-the '$', normally denoting a string variable, before the square brackets that
-denotes an array index.
-
-Operators
----------
-
-Operators are things you can do to variables and numbers. They are either the
-common mathematical operations or conditional operators
-
-+ - will add two numbers. If you try to add two strings, the result will be a
- string glued together at the +. You can add a number to a string, and the
- result will be a string. No other math operators work with strings.
-- - will subtract two numbers.
-* - will multiply two numbers.
-/ - will divide two numbers. Note that this is an integer division, i.e.
- 7/2 is not equal 3.5, it's equal 3.
-% - will give you the remainder of the division. 7%2 is equal to 1.
-
-There are also conditional operators. This has to do with the conditional
-command 'if' and they are meant to return either 1 if the condition is satisfied
-and 0 if it isn't. (That's what they call 'boolean' variables. 0 means 'False'.
-Anything except the zero is 'True' Odd as it is, -1 and -5 and anything below
-zero will also be True.)
-
-You can compare numbers to each other and you compare strings to each other, but
-you can not compare numbers to strings.
-
- == - Is true if both sides are equal. For strings, it means they are the same.
- >= - True if the first value is equal to, or greater than, the second value.
- <= - True if the first value is equal to, or less than, the second value
- > - True if the first value greater than the second value
- < - True if the first value is less than the second value
- != - True if the first value IS NOT equal to the second one
-
-Examples:
-
- 1=1 is True.
- 1<2 is True while 1>2 is False.
- @x>2 is True if @x is equal to 3. But it isn't true if @x is 2.
-
-Only '==' and '!=' have been tested for comparing strings. Since there's no way
-to code a seriously complex data structure in this language, trying to sort
-strings by alphabet would be pointless anyway.
-
-Comparisons can be stacked in the same condition:
-
- && - Is True if and only if BOTH sides are true.
- ('1==1 && 2=2' is true. '2=1 && 1=1' is false.)
- || - Is True if either side of this expression is True.
-
- 1=1 && 2=2 is True.
- 1=1 && 2=1 is False.
- 1=1 || 2=1 is True.
-
-Logical operators work only on numbers:
-
- << - Left shift.
- >> - Right shift.
- & - And.
- | - Or.
- ^ - Xor.
-
-If you don't know what these five mean, don't bother, you don't need them.
-
-Labels
-------
-
-Within executable script code, some lines can be labels:
-
-<label name>:
-
-Labels are points of reference in your script, which can be used to route
-execution with 'goto', 'menu' and 'jump_zero' commands, invoked with 'doevent'
-and 'donpcevent' commands and are otherwise essential. A label's name may not be
-longer than 22 characters. (23rd is the ':'.) There is some confusion in the
-source about whether it's 22, 23 or 24 all over the place, so keeping labels
-under 22 characters could be wise. In addition to labels you name yourself,
-there are also some special labels which the script engine will start execution
-from if a special event happens:
-
-OnClock<hour><minute>:
-OnHour<hour>:
-On<weekday><hour><minute>:
-OnDay<month><day>:
-
-This will execute when the server clock hits the specified date or time. Hours
-and minutes are given in military time. ('0105' will mean 01:05 AM). Weekdays
-are Sun,Mon,Tue,Wed,Thu,Fri,Sat. Months are 01 to 12, days are 01 to 31.
-Remember the zero. :)
-
-OnInit:
-OnInterIfInit:
-OnInterIfInitOnce:
-
-OnInit will execute every time the scripts loading is complete, including when
-they are reloaded with @reloadscript command. OnInterIfInit will execute when
-the map server connects to a char server, OnInterIfInitOnce will only execute
-once and will not execute if the map server reconnects to the char server later.
-
-OnAgitStart:
-OnAgitEnd:
-OnAgitInit:
-
-OnAgitStart will run whenever the server shifts into WoE mode, whether it is
-done with @agitstart GM command or with 'AgitStart' script command. OnAgitEnd
-will do likewise for the end of WoE. OnAgitInit will run when castle data is
-loaded from the char-server by the map server.
-
-No RID will be attached while any of the abovementioned labels are triggered, so
-no character or account-based variables will be accessible, until you attach a
-RID with 'attachrid' (see below).
-
-OnTouch:
-
-This label will be executed if a trigger area is defined for the NPC object it's
-in. If it isn't present, the execution will start from the beginning of the NPC
-code. The RID of the triggering character object will be attached.
-
-OnPCDieEvent:
-OnPCKillEvent:
-OnPCLogoutEvent:
-OnPCLoginEvent:
-
-These four special labels will be invoked if you have set 'event_script_type'
-value in your 'script_athena.conf' to 1, and you can change their names by
-altering the configuration options in 'script_athena.conf'. It's pretty obvious
-when those will get triggered. For more information, see
-'npc/sample/PCLoginEvent.txt'
-
-Only the special labels which are not associated with any script command are
-listed here. There are other kinds of labels which may be triggered in a similar
-manner, but they are described with their associated commands.
-
-On<label name>:
-
-These special labels are used with Mob scripts mostly, and script commands
-that requires you to point/link a command to a mob or another npc, giving a label
-name to start from. The label name can be any of your liking, but must be
-
-Example:
-
-monster "prontera.gat",123,42,"Poringz0rd",2341,23,"Master::OnThisMobDeath";
-
-amatsu.gat,13,152,4 script Master 767,{
-
-mes "Hi there";
-close;
-
-OnThisMobDeath:
- announce "Hey, "+strcharinfo(0)+" just killed a Poringz0rd!",bc_blue|bc_all;
- end;
-}
-
-Each time you kill one, that announce will appear in blue to everyone.
-
-Scripting commands and functions
---------------------------------
-
-The commands and functions are listed here in no particular order. There's a
-difference between commands and functions - commands leave no 'return value'
-which might be used in a conditional statement, as a command argument, or stored
-in a variable. Calling commands as if they were functions will sometimes work,
-but is not advised, as this can lead to some hard to track errors. Calling
-functions as if they were commands will mess up the stack, so 'return' command
-will not return correctly after this happens in a particular script.
-
-All commands must end with a ';'. Actually, you may expect to have multiple
-commands on one line if you properly terminate them with a ';', but it's better
-if you don't, since it is not certain just whether the scripting engine will
-behave nicely if you do.
-
--------------------------
-
-*playerattached;
-
-Returns the ID of the player currently attached to the script. It will return
-0 if noone is attached, or if the attached player no longer exists on the map
-server. It is wise to check for the attached player in script functions that
-deal with timers as there's no guarantee the player will still be logged on
-when the timer triggers. Note that the ID of a player is actually their
-account ID.
-
--------------------------
-
-*mes "<string>";
-
-This command will displays a box on the screen for the invoking character, if no
-such box is displayed already, and will print the string specified into that
-box. There is normally no 'close' or 'next' button on this box, unless you
-create one with 'close' or 'next', and while it's open the player can't do much
-else, so it's important to create a button later. If the string is empty, it
-will show up as an empty line.
-
- mes "Text that will appear in the box";
-
-Inside the string you may put color codes, which will alter the color of the
-text printed after them. The color codes are all '^<R><G><B>' and contain three
-hexadecimal numbers representing colors as if they were HTML colors - ^FF0000 is
-bright red, ^00FF00 is bright green, ^0000FF is bright blue, ^000000 is black.
-^FF00FF is a pure magenta, but it's also a color that is considered transparent
-whenever the client is drawing windows on screen, so printing text in that color
-will have kind of a weird effect. Once you've set a text's color to something,
-you have to set it back to black unless you want all the rest of the text be in
-that color:
-
- mes "This is ^FF0000 red ^000000 and this is ^00FF00 green, ^000000 so.";
-
-Notice that the text coloring is handled purely by the client. If you use non-
-english characters, the color codes might get screwed if they stick to letters
-with no intervening space. Separating them with spaces from the letters on
-either side solves the problem.
-
----------------------------------------
-
-*goto <label>;
-
-This command will make the script jump to a label, usually used in conjunction
-with other command, such as "if", but often used on it's own.
-
- goto Label;
- mes "This will not be seen";
- Label:
- mes "This will be seen";
-
----------------------------------------
-
-*callfunc "<function>"{,<argument>,...<argument>};
-*callfunc("<function>"{,<argument>,...<argument>})
-
-This command lets you call up a function NPC. A function NPC can be called from
-any script on any map server. Using the 'return' command it will come back to
-the place that called it.
-
- place.gat,50,50,6%TAB%script%TAB%Woman%TAB%115,{
- mes "[Woman]"
- mes "Lets see if you win";
- callfunc "funcNPC";
- mes "Well done you have won";
- close;
- }
- function%TAB%script%TAB%funcNPC%TAB%{
- set @win, rand(2);
- if(@win==0) return;
- mes "Sorry you lost";
- end;
- }
-
-You can pass arguments to your function - values telling it what exactly to do -
-which will be available there with getarg() (see 'getarg')
-Notice that returning is not mandatory, you can end execution right there.
-
-If you want to return a real value from inside your function NPC, it is better
-to write it in the function form, which will also work and will make the script
-generally cleaner:
-
- place.gat,50,50,6%TAB%script%TAB%Man%TAB%115,{
- mes "[Man]"
- mes "Gimme a number!";
- next;
- input @number;
- if (callfunc("OddFunc",@number)) mes "It's Odd!";
- close;
- }
- function%TAB%script%TAB%OddFunc%TAB%{
- if (getarg(0)%2==0) goto ItsEven;
- return (1);
- ItsEven:
- return (0);
- }
-
----------------------------------------
-
-*callsub <label name>{,<argument>,...<argument>};
-
-This command will go to a specified label within the current script (do NOT use
-quotes around it) coming in as if it were a 'callfunc' call, and pass it
-arguments given, if any, which can be recovered there with 'getarg'. When done
-there, you should use the 'return' command to go back to the point from where
-this label was called. This is used when there is a specific thing the script
-will do over and over, this lets you use the same bit of code as many times as
-you like, to save space and time, without creating extra NPC objects which are
-needed with 'callfunc'. A label is not callable in this manner from another
-script.
-
- mes "[Woman]"
- mes "Lets see if you win";
- callsub Check;
- mes "Well done you have won";
- Check:
- set @win, rand(2);
- if(@win==0) return;
- mes "Sorry you lost";
-
----------------------------------------
-
-*return {(<value>)};
-
-When you use callsub or callfunc, this command allows you to go back to the
-calling script. You can optionally return with a value telling the calling
-program what exactly happened. To get at this value, you will have to use the
-'set' command:
-
- set <variable>,callfunc "<your function>"
-
-Note the round brackets. Turns out you have to enclose just about anything in
-brackets if it isn't a straight number for the return command to work with it:
-
- return (@x+@y);
-
-Also note that
-
- if (<condition>) return (<whatever>);
-
-does NOT always work, even though it would make scripts a lot cleaner, and it
-might be wiser to avoid using it like that.
-
-For an example see 'callfunc' and 'callsub'
-
----------------------------------------
-
-*getarg(<number>)
-
-This function is used when you use the 'callsub' or 'callfunc' commands. In the
-call you can specify variables that will make that call different from another
-one. This function willwill return an argument the function or subroutine was
-called with, and is the normal way to get them.
-This is another thing that can let you use the same but of code more than once.
-
-Argument numbering starts with 0, i.e. the first argument you gave is number 0.
-If no such argument was given, a zero is returned.
-
- place.gat,50,50,6%TAB%script%TAB%Woman1%TAB%115,{
- mes "[Woman]";
- mes "Lets see if you win";
- callfunc "funcNPC",2;
- mes "Well done you have won";
-
- ...
-
- place.gat,52,50,6%TAB%script%TAB%Woman2%TAB%115,{
- mes "[Woman]";
- mes "Lets see if you win";
- callfunc "funcNPC",5;
- mes "Well done you have won";
-
- ...
-
- function%TAB%script%TAB%funcNPC%TAB%{
- set @win, rand(getarg(0));
- if(@win==0) return;
- mes "Sorry you lost";
-
-"woman1" NPC object calls the funcNPC. The argument it gives in this call is
-stated as 2, so when the random number is generated by the 'rand' function, it
-can only be 0 or 1. Whereas "woman2" gives 5 as the argument number 0 when
-calling the function, so the random number could be 0, 1, 2, 3 or 4, this makes
-"woman2" less likely to say the player won.
-
-You can pass multiple arguments in a function call:
-
- callfunc "funcNPC",5,4,3;
-
-getarg(0) would be 5, getarg(1) would be 4 and getarg(2) would be 3.
-
-'getarg()' can also be used to carry information back from using the "callfunc"
-script command, if the 'return' command is set to return a value:
-
- place.gat,50,50,6%TAB%script%TAB%Woman%TAB%115,{
- mes "[Woman]";
- mes "Lets see if you win";
- callfunc "funcNPC";
- mes "Well it seems you have "+getarg(0);
- }
- function%TAB%script%TAB%funcNPC%TAB%{
- set @win, rand(2);
- if(@win==0) return(won);
- return(lost);
- }
-
-It is, however, better to use 'set' to get this value instead (see 'callfunc')
-because otherwise you can't call functions from within other functions. (Return
-values mess up the stack.)
-
----------------------------------------
-
-*next;
-
-This command will create a 'next' button in the message window for the invoking
-character. If no window is currently on screen, it will be created. Used to
-segment NPC talking, this command is used A LOT. See 'mes'.
-
- mes "[Woman]";
- mes "This would appear on the page";
- next;
- // This is needed cause it is a new page and the top will now be blank
- mes "[Woman]";
- mes "This would appear on the 2nd page";
-
----------------------------------------
-
-*close;
-
-This command will create a 'close' button in the message window for the invoking
-character. If no window is currently on screen, it will be created. This is one
-of the ways to end a speech from an NPC. Once the button is clicked, the NPC
-script execution will end, and the message box will disappear.
-
- mes "[Woman]";
- mes "I am finished talking to you, click the close button";
- close;
- mes "This command will not run at all, cause the script has ended.";
-
----------------------------------------
-
-*close2;
-
-This command will create a 'close' button in the message window for the invoking
-character. If no window is currently on screen, it will be created. See 'close'.
-There is one important difference, though - even though the message box will
-have closed, the script execution will not stop, and commands after 'close2'
-will still run, meaning an 'end' has to be used to stop the script, unless you
-make it stop in some other manner.
-
- mes "[Woman]";
- mes "I will warp you now";
- close2;
- warp "place.gat",50,50;
- end;
-
-Don't expect things to run smoothly if you don't make your scripts 'end'.
-
----------------------------------------
-
-*menu "<menu option>",<label>{,"<menu option>",<label>...};
-
-This command will create a selectable menu for the invoking character. Only one
-menu can be on screen at the same time.
-
-Depending on what the player picks from the menu, the script execution will
-continue from the corresponding label. (it's string-label pairs, not label-
-string)
-
-It also sets a special temporary character variable @menu, which contains the
-number of option the player picked. (Numbering of options starts at 1.)
-
- menu "I want to Start",L_Start,"I want to end",L_End;
- L_Start:
- //If they click "I want to Start" they will end up here
- L_End:
- //If they click "I want to end" they will end up here
-
-If a label is '-', the script execution will continue right after the menu
-command if that option is selected, this can be used to save you time, and
-optimize big scripts.
-
- menu "I want to Start",-,"I want to end",L_End;
- //If they click "I want to Start" they will end up here
- L_End:
- //If they click "I want to end" they will end up here
-
-Both these examples will perform the same task.
-
-If you give an empty string as a menu item, the item will not display. This
-can effectively be used to script dynamic menus by using empty string for
-entries that should be unavailable at that time.
-
-You can do it by using arrays, but watch carefully - this trick isn't high
-wizardry, but minor magic at least. You can't expect to easily duplicate it
-until you understand how it works.
-
-Create a temporary array of strings to contain your menu items, and populate it
-with the strings that should go into the menu at this execution, making sure not
-to leave any gaps. Normally, you do it with a loop and an extra counter, like
-this:
-
- setarray @possiblemenuitems$[0],<list of potential menu items>;
- set @i,0; // That's our loop counter.
- set @j,0; // That's the menu lines counter.
-
- makemenuloop:
-
- // We record the number of option into the list of options actually
- // available. That 'condition' is whatever condition that determines whether
- // a menu item number @i actually goes into the menu or not.
-
- if (<condition>) set @menulist$[@j],@possiblemenuitems$[@i];
-
- // We just copied the string, we do need it's number for later though, so we
- // file it away as well.
-
- if (<condition>) set @menureference[@j],@i;
-
- // Since we've just added a menu item into the list, we increment the menu
- // lines counter.
-
- if (<condition>) set @j,@j+1;
-
- // We go on to the next possible menu item.
-
- set @i,@i+1;
-
- // And continue looping through the list of possible menu items until it
- // ends.
-
- if (@i<=getarraysize(@possiblemenuitems)) goto makemenuloop;
-
-
-This will create you an array @menulist$ which contains the text of all items
-that should actually go into the menu based on your condition, and an array
-@menureference, which contains their numbers in the list of possible menu items.
-(Remember, arrays start with 0.) There's less of them than the possible menu
-items you've defined, but the menu command can handle the empty lines - only if
-they are last in the list, and if it's made this way, they are. Now comes a
-dirty trick:
-
- // X is whatever the most menu items you expect to handle.
- menu @menulist$[0],-,@menulist$[1],-,....@menulist$[<X>],-;
-
-This calls up a menu of all your items. Since you didn't copy some of the
-possible menu items into the list, it's end is empty and so no menu items will
-show up past the end. But this menu call doesn't jump anywhere, it just
-continues execution right after the menu command. (And it's a good thing it
-doesn't, cause you can only explicitly define labels to jump to, and how do you
-know which ones to define if you don't know beforehand which options will end up
-where in your menu?)
-But how do you figure out which option the user picked? Enter the @menu.
-
-@menu contains the number of option that the user selected from the list,
-starting with 1 for the first option. You know now which option the user picked
-and which number in your real list of possible menu items it translated to:
-
- mes "You selected "+@possiblemenuitems$[@menureference[@menu-1]]+"!";
-
-@menu is the number of option the user picked.
-@menu-1 is the array index for the list of actually used menu items that we
-made.
-@menureference[@menu-1] is the number of the item in the array of possible menu
-items that we've saved just for this purpose.
-
-And @possiblemenuitems$[@menureference[@menu-1]] is the string that we used to
-display the menu line the user picked. (Yes, it's a handful, but it works.)
-
-You can set up a bunch of 'if (@menureference[@menu-1]==X) goto Y' statements to
-route your execution based on the line selected and still generate a different
-menu every time, which is handy when you want to, for example, make users select
-items in any specific order before proceeding, or make a randomly shuffled menu.
-
-Kafra code bundled with the standard distribution uses a similar array-based
-menu technique for teleport lists, but it's much simpler and doesn't use @menu,
-probably since that wasn't documented anywhere.
-
-See also 'select', which is probably better in this particular case. Instead of
-menu, you could use 'select' like this:
-
- set @dummy,select(@menulist$[0],@menulist$[1],....@menulist$[<X>]);
-
-For the purposes of the technique described above these two statements are
-perfectly equivalent.
-
----------------------------------------
-
-*rand(<number>{,<number>});
-
-This function returns a number, randomly positioned between 0 and the number you
-specify (if you only specify one) and the two numbers you specify if you give it
-two.
-
-rand(10) would result in 0,1,2,3,4,5,6,7,8 or 9
-
-rand(2,10) would result in 2,3,4,5,6,7,8,9 or 10
-
----------------------------------------
-
-*warp "<map name>",<x>,<y>;
-
-This command will take the invoking character to the specifed map, and if
-wanted, specified coordinates too, but these can be random.
-
- warp "place.gat",50,55;
-
-This would take them to X 50 Y 55 on the map called "place". If your X and Y
-coordinates land on an unwalkable map square, it will send the warped character
-to a random place. Same will happen if they are both zero:
-
- warp "place.gat",0,0;
-
-Notice that while warping people to coordinates 0,0 will normally get them into
-a random place, it's not certain to always be so. Darned if I know where this is
-actually coded, it might be that this happens because square 0,0 is unwalkable
-on all official maps. If you're using custom maps, beware.
-
-There are also three special 'map names' you can use.
-
-"Random" will warp the player randomly on the current map.
-"Save" and "SavePoint" will warp the player back to their savepoint.
-
----------------------------------------
-
-*areawarp "<from map name>",<x1>,<y1>,<x2>,<y2>,"<to map name>",<x3>,<y3>;
-
-This command is similar to 'warp', however, it will not refer to the invoking
-character, but instead, all characters within a specified area, defined by the
-x1/y1-x2/y2 square, will be warped. Nobody outside the area will be affected,
-including the activating character, if they are outside the area.
-
- areawarp "place.gat",10,10,120,120,"place2.gat",150,150;
-
-Everyone that is in the area between X 10 Y 10 and X 120 Y 120, in a square
-shape, on the map called "place", will be affected, and warped to "place2" X 150
-Y 150
-
- areawarp "place.gat",10,10,120,120,"place2.gat",0,0;
-
-By using ,0,0; as the destination coordinates it will take all the characters in
-the affected area to a random set of co-ordinates on "place2".
-
-Like 'warp', areawarp will also explicitly warp characters randomly into the
-current map if you give the 'to map name' as "Random".
-
-See also 'warp'.
-
----------------------------------------
-
-*heal <hp>,<sp>;
-
-This command will heal a set amount of HP and/or SP on the invoking character.
-
- heal 30000,0; // This will heal 30,000 HP
- heal 0,30000; // This will heal 30,000 SP
- heal 300,300; // This will heal 300 HP and 300 SP
-
-This command just alters the hit points and spell points of the invoking
-character and produces no other output whatsoever.
-
----------------------------------------
-
-*itemheal <hp>,<sp>;
-
-This command works on the invoking character like 'heal', however, it is not
-normally used in NPC scripts and will not work as expected there, but is used
-all over in item scripts.
-
-Unlike 'heal', which just alters hp/sp and doesn't do anything else at all, this
-command also shows healing animations for potions and other stuff, checks
-whether the potion was made by a famous alchemist and alters the amount healed,
-etc, etc. Since which kind of effect is shown depends on what item was used,
-using it in an NPC script will not have a desired effect.
-
-There is also a nice example on using this with the 'rand' function, to give you
-a random ammount of healing.
-
- // This will heal anything thing from 100 to 150 HP and no SP
- itemheal rand(100,150),0;
-
----------------------------------------
-
-*percentheal <hp>,<sp>;
-
-This command will heal the invoking character. It heals the character, but not
-by a set value - it adds percent of their maximum HP/SP.
-
- percentheal 100,0; // This will heal 100% HP
- percentheal 0,100; // This will heal 100% SP
- percentheal 50,50; // This will heal 50% HP and 50% SP
-
-So the amount that this will heal will depend on the total ammount of HP or SP
-you have maximum. Like 'heal', this will not call up any animations or effects.
-
----------------------------------------
-
-*jobchange <job number>{,<upper flag>};
-
-This command will change the job class of the invoking character.
-
- jobchange 1; // This would change your player into a Swordman
- jobchange 4002; // This would change your player into a Swordman High
-
-This command does work with numbers, but you can also use job names. The full
-list of job names and the numbers they correspond to can be found in
-'db/const.txt'.
-
- // This would change your player into a Swordman
- jobchange Job_Swordman;
- // This would change your player into a Swordman High
- jobchange Job_Swordman_High;
-
-'upper flag' can alternatively be used to specify the type of job one changes
-to. For example, jobchange Job_Swordman,1; will change the character to a high
-swordsman. The upper values are:
--1 (or when omitted): preserves the current job type.
-0: Normal/standard classes
-1: High/Advanced classes
-2: Baby classes
-
-This command will also set a permanent character-based variable
-'jobchange_level' which will contain the job level at the time right before
-changing jobs, which can be checked for later in scripts.
-
----------------------------------------
-
-*jobname <job number>
-
-This command retrieves the name of the given job using the msg_athena entries 550->650.
-
- mes "[Kid]";
- mes "I never thought I'd met a "+jobname(Class)+" here of all places.";
- close;
-
----------------------------------------
-
-*eaclass {<job number>}
-
-This commands returns the "eA job-number" corresponding to the given class (if none is given, it returns uses
-the invoking player's class as argument). The eA job-number is also a class number system, but it's one that
-comes with constants which make it easy to convert among classes. The command will return -1 if you pass it a
-job number which doesn't has a eA Job value equivalent.
-
- set @eac, eaclass();
- if ((@eac&EAJ_BASEMASK) == EAJ_SWORDMAN)
- mes "You must be a swordman, knight, crusader, paladin, high swordman, lord knight, baby swordman,";
- mes "baby knight or baby crusader.";
- if (@eac&EAJL_UPPER)
- mes "You are a rebirth job.";
- if ((@eac&EAJ_UPPERMASK) == EAJ_SWORDMAN)
- mes "You must be a Swordman, Baby Swordman or High Swordman.";
-
-For more information on the eA Job System, see the docs/ea_job_system.txt file.
-
----------------------------------------
-*roclass <job number> {,<gender>}
-
-Does the opposite of eaclass. That is, given a eA Job class, it returns which is the corresponding RO class number.
-A gender is required because both Bard and Dancers share the same eA Job value (EAJ_BARDDANCER), if it isn't given, the
-gender of the executing player is taken (if there's no player running the script, male will be used by default).
-The command returns -1 when there isn't a valid class to represent the required job (for example, if you try to get the
-baby version of a Taekwon class).
-
- set @eac, eaclass();
- //Check if class is already rebirth
- if (@eac&EAJL_UPPER) {
- mes "You look strong.";
- close;
- }
- set @eac, roclass(@eac|EAJL_UPPER);
- //Check if class has a rebirth version
- if (@eac != -1) {
- mes "Bet you can't wait to become a "+jobname(@eac)+"!";
- close;
- }
-
----------------------------------------
-
-*input <variable>;
-
-This command will make an input box pop up on the client connected to the
-invoking character, to allow entering of a number or a string. This has many
-uses, one example would be a guessing game, also making use of the 'rand'
-function:
-
- mes "[Woman]";
- mes "Try and guess the number I am thinking of.";
- mes "The number will be between 1 and 10.";
- next;
- set @number, rand(1,10);
- input @guess;
- if(@guess==@number) goto L_Correct;
- mes "[Woman]";
- mes "Sorry, that wasn't the number I was thinking of.";
- close;
- L_Correct:
- mes "[Woman]";
- mes "Well done that was the number I was thinking of";
- close;
-
-If you give the input command a string variable to put the input in, it will
-allow the player to enter text. Otherwise, only numbers will be allowed.
-
- mes "[Woman]";
- mes "Please say HELLO";
- next;
- input @var$;
- if(@var$=="HELLO") goto L_Correct;
- mes "[Woman]";
- mes "Sorry you got it wrong";
- close;
- L_Correct:
- mes "[Woman]";
- mes "Well done you typed it correctly";
- close;
-
-Notice that in current SVN, you may not input a negative number with this
-command. This was done to prevent exploits in badly written scripts, which would
-let people, for example, put negative amounts of zeny into a bank script and
-recieve free zeny as a result. Unfortunately it limits the uses of the 'input'
-command quite a bit.
-
----------------------------------------
-
-*setlook <look type>,<look value>;
-
-This command will alter the look data for the invoking character. It is used
-mainly for changing the palette used on hair and clothes, you specify which look
-type you want to change, then the palette you want to use. Make sure you specify
-a palette number that exists/is usable by the client you use.
-
- // This will change your hair(6), so that it uses palette 8, what ever your
- // palette 8 is your hair will use that colour
-
- setlook 6,8;
-
- // This will change your clothes(7), so they are using palette 1, whatever
- // your palette 1 is, your clothes will then use that set of colours.
-
- setlook 7,1;
-
-Here are the possible look types:
-
- 0 - Base sprite
- 1 - Hairstyle
- 2 - Weapon
- 3 - Head bottom
- 4 - Head top
- 5 - Head mid
- 6 - Hair color
- 7 - Clothes color
- 8 - Shield
- 9 - Shoes
-
-Whatever 'shoes' means is anybody's guess, ask Gravity - the client does nothing
-with this value. It still wants it from the server though, so it is kept, but
-normally doesn't do a thing.
-
-Only the look data for hairstyle, hair color and clothes color are saved to the
-char server's database and will persist. The rest freely change as the character
-puts on and removes equipment, changes maps, logs in and out and otherwise you
-should not expect to set them. In fact, messing with them is generally
-hazardous, do it at your own risk, it is not tested what will this actually do -
-it won't cause database corruption and probably won't cause a server crash, but
-it's easy to crash the client with just about anything unusual.
-
-However, it might be an easy way to quickly check for empty view IDs for
-sprites, which is essential for making custom headgear.
-
-Since a lot of people have different palettes for hair and clothes, it's
-impossible to tell you what all the colour numbers are. If you want a serious
-example, there is a Stylist script inside the default eAthena installation that
-you can look at, this may help you create a Stylist of your own:
-'custom\dye.txt'
-
----------------------------------------
-
-*set <variable>,<expression>;
-
-This command will set a variable to the value that the expression results in.
-This is the only way to set a variable directly.
-
-This is the most basic script command and is uses a lot whenever you try to do
-anything more advanced than just printing text into a messagebox.
-
- set @x,100;
-
-will make @x equal 100.
-
- set @x,1+5/8+9;
-
-will compute 1+5/8+9 (which is, surprisingly, 10 - remember, all numbers are
-integer in this language) and make @x equal it.
-
----------------------------------------
-
-*setarray <array name>[<first value>],<value>{,<value>...<value>};
-
-This command will allow you to quickly fill up an array in one go. Check the
-Kafra scripts in the distribution to see this used a lot.
-
- setarray @array[0], 100, 200, 300, 400, 500, 600;
-
-First value is the index of the first element of the array to alter. For
-example:
-
- setarray @array[0],200,200,200;
- setarray @array[1],300,150;
-
-will produce:
-
- @array[0]=200
- @array[1]=300
- @array[2]=150
-
----------------------------------------
-
-*cleararray <array name>[<first value to alter>],<value>,<number of values to set>;
-
-This command will change many array values at the same time to the same value.
-
- setarray @array[0], 100, 200, 300, 400, 500, 600;
- // This will make all 6 values 0
- cleararray @array[0],0,6;
- // This will make array element 0 change to 245
- cleararray @array[0],245,1;
- // This will make elements 1 and 2 change to 345
- cleararray @array[1],345,2;
-
-See 'setarray'.
-
----------------------------------------
-
-*copyarray <to array>[<first value>],<from array>[<first value>],<amount to copy>;
-
-This command lets you quickly shuffle a lot of data between arrays, which is in
-some cases invaluable.
-
- setarray @array[0], 100, 200, 300, 400, 500, 600;
- // So we have made @array[]
- copyarray @array2[0],@array[2],2;
-
- // Now, @array2[0] will be equal to @array[2] (300) and
- // @array2[1] will be equal to @array[3].
-
-So using the examples above:
- @array[0] = 100
- @array[1] = 200
- @array[2] = 300
- @array[3] = 400
- @array[4] = 500
- @array[5] = 600
-
- @array2[0] = 300
- @array2[1] = 400
- @array2[2] = 500
- @array2[3] = 0
-
-Notice that @array[5] wont be coppied to the second array, and it will return a
-0.
-
----------------------------------------
-
-*getarraysize(<array name>);
-
-This function returns the number of values that are contained inside the
-specified array. Notice that zeros and empty strings at the end of this array
-are not counted towards this number.
-
-For example:
-
- setarray @array[0], 100, 200, 300, 400, 500, 600;
- set @arraysize,getarraysize(@array);
-
-This will make @arraysize == 6. But if you try this:
-
- setarray @array[0], 100, 200, 300, 400, 500, 600, 0;
- set @arraysize,getarraysize(@array);
-
-@arraysize will still equal 6, even though you've set 7 values.
-
----------------------------------------
-
-*deletearray <array name>[<first value>],<how much to delete>
-
-This command will delete a specified number of array elements totally from an
-array, shifting all the elements beyond this towards the beginning.
-
- // This will delete array element 0, and move all the other array elements
- // up one place.
- deletearray @array[0],1
-
-// This would delete array elements numbered 1, 2 and 3, leave element 0 in its
-// place, and move the other elements ups, so there are no gaps.
-
- deletearray @array[1],3
-
-IMPORTANT: deletarray is horribly broken since the earliest days of jAthena. It
-tends to merrily remove much more variables than it's told to remove, which
-makes it pretty much useless for anything other than removing an array from
-memory entirely. This would be very handy, if it always worked.
-
----------------------------------------
-
-*getelementofarray(<array name>,<index>);
-
-This function will return an array's element when given an index.
-
- // This will find the 2nd array value
- getelementofarray(@array,1)
-
-Pretty pointless now when we have
-
- @array[1]
-
-which has the same effect.
-
----------------------------------------
-
-*if (<condition>) <statement>;
-
-This is the basic conditional statement command, and just about the only one
-available in this scripting language.
-
-The condition can be any expression. All expressions resulting in a non-zero
-value will be considered True, including negative values. All expressions
-resulting in a zero are false.
-
-If the expression results in True, the statement will be executed. If it isn't
-true, nothing happens and we move on to the next line of the script.
-
- if (1) mes "This will always print.";
- if (0) mes "And this will never print.";
- if (5) mes "This will also always print.";
- if (-1) mes "Funny as it is, this will also print just fine.";
-
-For more information on conditional operators see the operators section above.
-Anything that is returned by a function can be used in a condition check without
-bothering to store it in a specific variable:
-
- if (strcharinfo(0)=="Daniel Jackson") mes "It is true, you are Daniel!";
-
-More examples of using the 'if' command in the real world:
-
-Example 1:
-
- set @var1,1;
- input @var2;
- if(@var1==@var2) goto L_Same;
- mes "Sorry that is wrong";
- close;
- L_Same:
- close;
-
-Example 2:
-
- set @var1,1;
- input @var2;
- if(@var1!=@var2) mes "Sorry that is wrong";
- close;
-
-(Notice examples 1 and 2 have the same effect.)
-
-Example 3:
-
- set @var1,@var1+1;
- mes "[Forgetfull Man]";
- if (@var==1) mes "This is the first time you have talked to me";
- if (@var==2) mes "This is the second time you have talked to me";
- if (@var==3) mes "This is the third time you have talked to me";
- if (@var==4) mes "This is the forth time you have talked to me, but I think I am getting amnesia, I have forgoten about you";
- if (@var==4) set @var,0;
- close;
-
-Example 4:
-
- mes "[Quest Person]";
- if(countitem(512)>=1) goto L_GiveApple;
- // The number 512 was found from item_db, it is the item number for the Apple.
- mes "Can you please bring me an apple?";
- close;
- L_GiveApple:
- mes "Oh an apple, I didnt want it, I just wanted to see one";
- close;
-
-Example 5:
-
- mes "[Person Checker]";
- if($name$!=null) goto L_Check;
- mes "Please tell me someones name";
- next;
- input $name$;
- set $name2$,strcharinfo(0);
- mes "[Person Checker]";
- mes "Thank you";
- L_Check:
- if($name$==strcharinfo(0) ) goto L_SameName;
- mes "[Person Checker]";
- mes "You are not the person that " +$name2$+ " mentioned";
- L_End:
- set $name$,null;
- set $name2$,null;
- close;
- L_SameName:
- mes "[Person Checker]";
- mes "You are the person that " +$name2$+ " just mentioned";
- mes "nice to meet you";
- goto L_End;
-
-See 'strcharinfo' for explanation of what this function does.
-
-Example 6: Using complex conditions.
-
- mes "[Multi Checker]";
- if( (@queststarted==1) && (countitem(512)>=5) ) goto L_MultiCheck;
- // Only if the quest has been started AND You have 5 apples will it goto "L_MultiCheck"
- mes "Please get me 5 apples";
- set @queststarted,1;
- close;
- L_MultiCheck:
- mes "[Multi Checker]";
- mes "Well done you have started the quest of got me 5 apples";
- mes "Thank you";
- set @queststarted,0;
- delitem 512,5;
- close;
-
----------------------------------------
-
-*getitem <item id>,<amount>{,<character ID>};
-*getitem "<item name>",<amount>{,<character ID>};
-
-This command will give a specific amount of specified items to the invoking
-character. If an optional character ID is specified, and that character is
-currently online, items will be created in their inventory instead. If they are
-not online, nothing will happen.
-
-In the first and most commonly used version of this command, tems are referred
-to by their database ID number found inside 'db/item_db.txt'.
-
- getitem 502,10 // The person will recieve 10 apples
- getitem 617,1 // The person will recieve 1 Old Violet Box
-
-Giving an item ID of -1 will give a specified number of random items from the
-list of those that fall out of Old Blue Box. Unlike in all other cases, these
-will be unidentified, if they turn out to be equipment. This is exactly what's
-written in the Old Blue Box's item script.
-
-Other negative IDs also correspond to other random item generating item tables:
-
-Giving an item ID of -2 will produce the effects of Old Violet Box.
-Giving an item ID of -3 will produce the effects of Old Card Album.
-Giving an item ID of -4 will produce the effects of Gift Box.
-Giving an item ID of -5 will produce the effects of Worn Out Scroll, which, in
-current SVN, drops only Jellopies anyway.
-
-Calling this command with a negative item ID to create a random item will create
-an entry in the log file for those if such logging is enabled.
-
-You may also create an item by it's name in the 'english name' field in the item
-database:
-
- getitem "RED_POTION",10;
-
-Which will do what you'd expect. If it can't find that name in the database,
-apples will be created anyway. It is often a VERY GOOD IDEA to use it like this.
-
-This used in pretty much all NPC scripts that have to do with items and quite a
-few item scripts. For more examples check just about any official script.
-
----------------------------------------
-
-*getitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
-*getitem2 "<Item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
-
-This command will give an amount of specified items to the invoking character.
-If an optional character ID is specified, and that character is currently
-online, items will be created in their inventory instead. If they are not
-online, nothing will happen. It works essentially the same as 'getitem' (it even
-works for negative ID numbers the same way, which is kinda silly) but is a lot
-more flexible, since it allows you to give the player an item altered with it's
-specific properties.
-
-Those parameters that are different from 'getitem' are:
-
-identify - Whether you want the item to be identified or not, 0 unidentified,
- 1 identified.
-refine - For how many plusses will it be refined.
- It will not let you refine an item higher than +10, if you
- specify more it'll still be 10.
-attribute - Whether the item is broken (1) or not (0) and NOT an elemental
- attribute.
-card1,2,3,4 - If you want a card compound to it, place the card ID number into
- the specific card slot. Card ID numbers also found in
- 'db/item_db.txt'
-
-Card1-card4 values are also used to store name information for named items, as
-well as the elemental property of weapons and armor. You can create a named item
-in this manner, however, if you just need a named piece of standard equipment,
-it is much easier to the 'getnameditem' function instead.
-
-You will need to keep these values if you want to destroy and then perfectly
-recreate a named item, for this see 'getinventorylist'.
-
-If you still want to try creating a named item with this command because
-'getnameditem' won't do it for you cause it's too limited, you can do it like
-this. Careful, minor magic ahead.
-
- // First, let's get an ID of a character who's name will be on the item.
- // Only an existing character's name may be there.
- // Let's assume our character is 'Adam' and find his ID.
-
- set @charid,getcharid(0,"Adam");
-
- // Now we split the character ID number into two portions with a binary
- // shift operation. If you don't understand what this does, just copy it.
-
- set @card3, @charid & 65535;
- set @card4, @charid >> 16;
-
- // If you're inscribing non-equipment, @card1 must be 254.
- // Arrows are also not equipment. :)
- set @card1,254;
-
- // For named equipment, card2 means the Star Crumbs and elemental
- // crystals used to make this equipment. For everything else, it's 0.
-
- set @card2,0;
-
- // Now, let's give the character who invoked the script some
- // Adam's Apples:
-
- getitem2 512,1,1,0,0,@card1,@card2,@card3,@card4;
-
-This wasn't tested with all possible items, so I can't give any promises,
-experiment first before relying on it.
-
-To create equipment, continue this example it like this:
-
- // We've already have card3 and card4 loaded with correct
- // values so we'll just set up card1 and card2 with data
- // for an Ice Stiletto.
-
- // If you're inscribing equipment, @card1 must be 255.
- set @card1,255;
-
- // That's the number of star crumbs in a weapon.
- set @sc,2;
-
- // That's the number of elemental property of the weapon.
- set @ele,1;
-
- // And that's the wacky formula that makes them into
- // a single number.
- set @card2,@ele+((@sc*5)<<8);
-
- // That will make us an Adam's +2 VVS Ice Stiletto:
-
- getitem2 1216,1,1,2,0,@card1,@card2,@card3,@card4;
-
-Experiment with the number of star crumbs - I'm not certain just how much will
-work most and what it depends on. The valid element numbers are:
-
- 1 - Ice, 2 - Earth 3 - Fire 4 - Wind.
-
-You can, apparently, even create duplicates of the same pet egg with this
-command, creating a pet which is the same, but simultaneously exists in two
-eggs, and may hatch from either, although, I'm not sure what kind of a mess will
-this really cause.
-
----------------------------------------
-*groupranditem <group id>;
-
-Returns the item_id of a random item picked from the group specified. The
-different groups and their group number are specified in db/item_group_db.txt
-
-When used in conjunction with other functions, you can get a random item. For
-example, for a random pet lure:
-
-getitem groupranditem(15),1;
-
----------------------------------------
-
-*makeitem <item id>,<amount>,<X>,<Y>,"<map name>";
-*makeitem "<item name>",<amount>,<X>,<Y>,"<map name>";
-
-This command will create an item lying around on a specified map in the
-specified location.
-
- itemid - Found in 'db/item_db.txt'
- amount - Amount you want produced
- X - The X coordinate
- Y - The Y coordinate
- map name - The map name.
-
-This item will still disappear just like any other dropped item. Like 'getitem',
-it also accepts an 'english name' field from the database and creates apples if
-the name isn't found.
-
----------------------------------------
-
-*delitem <item id>,<amount>;
-*delitem "<item name>",<amount>;
-
-This command will take a specified amount of items from the invoking character.
-As all the item commands, this one uses the ID of the item found inside
-'db/item_db.txt'. The items are destroyed - there is no way an NPC can simply
-own items and have an inventory of them, other as by destroying and recreating
-them when needed.
-
- delitem 502,10 // The person will lose 10 apples
- delitem 617,1 // The person will lose 1 Old Violet Box
-
-It is always a good idea to to check if the player actually has the item before
-you take it from them, Otherwise, you could try to delete items which the
-players don't actually have, which won't fail and won't give an error message,
-but might open up ways to exploit your script.
-
-Like 'getitem' this command will also accept an 'english name' field from the
-database. If the name is not found, nothing will be deleted.
-
----------------------------------------
-
-*delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
-*delitem2 "<Item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
-
-This command will take a specified amount of items from the invoking character.
-Check 'getitem2' to understand its expanded parameters.
-
----------------------------------------
-
-*enable_items;
-*disable_items;
-
-These commands enable item usage while an npc is running. When enable_items is
-run, items can be used during scripts until disable_items is called.
-To avoid possible exploits, when enable_items is invoked, it will only enable
-item usage while running that script in particular. Note that if a different
-script also calls enable_items, it will override the last call (so you may
-want to call this command at the start of your script without assuming the
-effect is still in effect).
-
----------------------------------------
-
-*viewpoint <action>,<x>,<y>,<point number>,<color>;
-
-This command will mark places on the mini map in the client connected to the
-invoking character. It uses the normal X and Y coordinates from the main map.
-The colors of the marks are defined using a hexidecimal number, same as the ones
-used to color text in 'mes' output, but are written as hexadecimal numbers in C.
-(They look like 0x<six numbers>.)
-
-Action is what you want to do with a point, 1 will set it, while 2 will clear
-it. Point number is the number of the point - you can have several. If more than
-one point is drawn at the same coordinates, they will cycle, which can be used
-to create flashing marks.
-
- // This command will show a mark at coordinates X 30 Y 40, is mark number 1,
- // and will be red.
-
- viewpoint 1,30,40,1,0xFF0000;
-
-This will create three points:
-
- viewpoint 1,30,40,1,0xFF0000;
- viewpoint 1,35,45,2,0xFF0000;
- viewpoint 1,40,50,3,0xFF0000;
-
-And this is how you remove them:
-
- viewpoint 2,30,40,1,0xFF0000;
- viewpoint 2,35,45,2,0xFF0000;
- viewpoint 2,40,50,3,0xFF0000;
-
-The client determines what it does with the points entirely, the server keeps no
-memory of where the points are set whatsoever.
-
----------------------------------------
-
-*countitem(<item id>)
-*countitem("<item name>")
-
-This function will return the number of items for the specified item ID that the
-invoking character has in the inventory.
-
- mes "[Item Checker]";
- mes "Hmmm, it seems you have "+countitem(502)+" apples";
- close;
-
-Like 'getitem', this function will also accept an 'english name' from the
-database as an argument.
-
-If you want to state the number at the end of a sentence, you can do it by
-adding up strings:
-
- mes "[Item Checker]";
- mes "Hmmm, the total number of apples you are holding is "+countitem("APPLE");
- close;
-
----------------------------------------
-
-*countitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>)
-*countitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>)
-
-Expanded version of 'countitem' function, used for created/carded/forged items.
-
-This function will return the number of items for the specified item ID and
-other parameters that the invoking character has in the inventory.
-Check 'getitem2' to understand the arguments of the function.
-
----------------------------------------
-
-*checkweight(<item id>,<amount>)
-*checkweight("<item name>",<amount>)
-
-This function will compute and return 1 if the total weight of a specified
-number of specific items does not exceed the invoking character's carrying
-capacity, and 0 otherwise. It is important to see if a player can carry the
-items you expect to give them, failing to do that may open your script up to
-abuse or create some very unfair errors.
-
-Like 'getitem', this function will also accept an 'english name' from the
-database as an argument.
-
- checkweight(502,10) // 10 apples
-
- if (checkweight(502,10) == 0 ) goto L_OverWeight;
- getitem 502,10;
- close;
- L_OverWeight:
- mes "Sorry you cannot hold this ammount of apples";
- close;
-
-Or to put this another way:
-
- if (checkweight("APPLE",10)) goto L_Getapples;
- mes "Sorry you cannot hold this ammount of apples";
- close;
- L_Getapples:
- getitem 502,10;
- close;
-
-Both these examples have the same effect.
-
----------------------------------------
-
-*readparam(<parameter number>)
-
-This function will return the basic stats of an invoking character, referred to
-by the parameter number. Instead of a number, you can use a parameter name if it
-is defined in "db/const.txt".
-
-For reference, in there these things are defined:
-
-StatusPoint, BaseLevel, SkillPoint, Class, Upper, Zeny, Sex, Weight, MaxWeight,
-JobLevel, BaseExp, JobExp, NextBaseExp, NextJobExp, Hp, MaxHp, Sp, MaxSp,
-BaseJob, Karma, Manner, bVit, bDex, bAgi, bStr, bInt, bLuk
-
-All of these also behave as variables, but don't expect to be able to just 'set'
-all of them - some will not work for various internal reasons.
-
- // This would return how many status points you haven't spent yet
- readparam(9)
-
-Using this particular information as a function call is not required. Just
-putting
-
- StatusPoint
-
-will give you the same result, and some of these parameters work just like
-variables (i.e. you can 'set Zeny,100' to make the character have 100 zeny,
-destroying whatever zeny they had before, or 'set Zeny,Zeny+100' to give them
-100 zeny)
-
-You can also use this command to get stat values:
-
- readparam(bVit)
- if(readparam(bVit)<=77) goto L_End;
- mes "Only people with over 77 Vit are reading this";
-L_End:
- close;
-
----------------------------------------
-
-*getcharid(<type>{,"<character name>"})
-
-This function will return a unique ID number of the invoking character, or, if a
-character name is specified, of that character.
-
-Type is the kind of associated ID number required:
-
- 0 - Character ID number.
- 1 - Party ID number.
- 2 - Guild ID number.
- 3 - Account ID number.
-
-For most purposes other than printing it, a number is better to have than a name
-(people do horrifying things to their character names).
-
-If the character is not in a party or not in a guild, the function will return 0
-if guild or party number is requested. If a name is specified and the character
-is not found, 0 is returned.
-
-If getcharid(0) returns a zero, the script got called not by a character and
-doesn't have an attached RID. Note that this will cause the map server to
-print "player not attached!" error messages, so it is preferred to use
-"playerattached" to check for the character attached to the script.
-
-if (getcharid(2)) mes "Only members of a guild are allowed beyond this point!";
-
----------------------------------------
-
-*getpartyname(<party id>)
-
-This function will return the name of a party that has the specified ID number.
-If there is no such party ID, "null" will be returned.
-
-Lets say the ID of a party was saved as a global variable:
-
- // This would return the name of the party from the ID stored in a variable
- mes "You're in the '"+getpartyname($@var)"' party, I know!";
-
----------------------------------------
-
-*getpartymember <party id>,[<type>];
-
-Thank you to HappyDenn for all this information.
-
-This command will finds all members of a specified party and returns their names
-(or character id or account id depending on the value of "type") into an array
-of temporary global variables. There's actually quite a few commands like this
-which will fill a special variable with data upon execution and not do anything
-else.
-
-Upon executing this,
-
-$@partymembername$[] is a global temporary stringarray which contains all the
- names of these party members
- (only set when type is 0 or not specified)
-
-$@partymembercid[] is a global temporary number array which contains the
- character id of these party members.
- (only set when type is 1)
-
-$@partymemberaid[] is a global temporary number array which contains the
- account id of these party members.
- (only set when type is 2)
-
-$@partymembercount is the number of party members that were found.
-
-The party members will (apparently) be found regardless of whether they are
-online or offline. Note that the names come in no particular order.
-
-Be sure to use $@partymembercount to go through this array, and not
-'getarraysize', because it is not cleared between runs of 'getpartymember'. If
-someone with 7 party members invokes this script, the array would have 7
-elements. But if another person calls up the NPC, and he has a party of 5, the
-server will not clear the array for you, overwriting the values instead. So in
-addition to returning the 5 member names, the 6th and 7th elements from the last
-call remain, and you will get 5+2 members, of which the last 2 don't belong to
-the new guy's party. $@partymembercount will always contain the correct number,
-(5) unlike 'getarraysize()' which will return 7 in this case.
-
-Example:
-
- // get the character's party ID
- getpartymember(getcharid(1));
-
- // immediately copy $@partymembercount value to a new variable, since
- // you don't know when 'getpartymember' will get called again for someone
- // else's party, overwriting your global array.
- set @partymembercount,$@partymembercount;
-
- // copy $@partymembername array to a new array
- copyarray @partymembername$[0],$@partymembername$[0],@partymembercount;
-
- //list the party members in NPC dialog
- set @count,0;
- L_DisplayMember:
- if(@count == @partymembercount) goto L_DisplayMemberEnd;
- mes (@count + 1) + ". ^0000FF" + @partymembername$[@count] + "^000000";
- set @count,@count+1;
- goto L_DisplayMember;
- L_DisplayMemberEnd:
- close;
-
----------------------------------------
-
-*getpartyleader <party id>,[<type>];
-
-This function returns some information about the given party-id's leader. When type is ommitted,
-the default information retrieved is Character name of the party leader. Possible types are:
-
- 1: Leader account id
- 2: Leader character id
- 3: Leader's class
- 4: Leader's current map index
- 5: Leader's current level as stored on the party structure (may not be
- current level if leader leveled up recently).
-
-If retrieval fails (leader not found or party does not exists), "null" is returned instead of character name,
-and -1 is returned for the other types.
-
----------------------------------------
-*getguildname(<guild id>)
-
-This function returns a guild's name given an ID number. If there is no such
-guild, "null" will be returned;
-
- // Would print what ever guild 10007 is, in my case this would return "AlcoROhics"
- mes "The guild "+GetGuildName(10007)+" are all nice people.";
-
- // This will do the same as above:
- set @var,10007;
- mes "We have some friends in "+GetGuildName(@var)+", you know.";
-
-This is used all over the WoE controlling scripts. You could also use it for a
-guild-based event.
-
----------------------------------------
-
-*getguildmaster(<guild id>)
-
-This function return the name of the master of the guild which has the specified
-ID number. If there is no such guild, "null" will be returned.
-
-// Would return the guild master of guild 10007, whatever that might be.
-// In this example it would return "MissDjax" cause she owns "AlcoROhics" (10007)
- mes getguildmaster(10007)+" runs "+getguildname(10007);
-
-Can be used to check if the character is the guildmaster of the specified guild.
-
-Maybe you want to make a room only guildmasters can enter:
-
- set @GID,getcharid(2);
- if(@GID==0) goto L_NoGuild;
- if(strcharinfo(0)==getguildmaster(@GID)) goto L_GuildMaster;
- mes "Sorry you dont own the guild you are in";
- close;
- L_NoGuild:
- mes "Sorry you are not in a guild";
- close;
- L_GuildMaster:
- mes "Welcome guild master of "+GetGuildName(@GID);
- close;
-
-
----------------------------------------
-*guildchangegm(<guild id>,<new master's name>)
-
-This function will change the Guild Master of a guild. The ID is the guild's
-id, and the new guildmaster's name must be passed.
-
-Returns 1 on success, 0 otherwise.
-
----------------------------------------
-*getguildmasterid(<guild id>)
-
-This function will return the character ID number of the guildmaster of the
-guild specified by the ID. 0 if the character is not a guildmaster of any guild.
-
----------------------------------------
-
-*strcharinfo(<type>)
-
-This function will return either the name, party name or guild name for the
-invoking character. Whatever it returns is determined by type.
-
- 0 - Character's name.
- 1 - The name of the party they're in if any.
- 2 - The name of the guild they're in if any.
-
-If a character is not a member of any party or guild, an empty string will be
-returned when requesting that information.
-
----------------------------------------
-
-*getequipid(<equipment slot>)
-
-This function returns the item ID of the item equipped in the equipment slot
-specified on the invoking character. If nothing is equpped there, it returns -1.
-Valid equipment slots are:
-
-1 - Upper head gear
-2 - Armor (Where you keep your Jackets and Robes)
-3 - What is in your Left hand.
-4 - What is in your Right hand.
-5 - The garment slot (Mufflers, Hoods, Manteaus)
-6 - What foot gear the player has on.
-7 - Accessory 1.
-8 - Accessory 2.
-9 - Middle Headgear (masks and glasses)
-10 - Lower Headgear (beards, some masks)
-
-Notice that a few items occupy several equipment slots, and if the character is
-wearing such an item, 'getequipid' will return it's ID number for either slot.
-
-Can be used to check if you have something equiped, or if you haven't got
-something equiped:
-
- if(getequipid(1)==2234) goto L_WearingTiara;
- mes "Come back when you have a Tiara on";
- close;
- L_WearingTiara:
- mes "What a lovely Tiara you have on";
- close;
-
-You can also use it to make sure people dont pass a point before removing an
-item totally from them. Let's say you dont want people to wear Legion Plate
-armor, but also dont want them to equip if after the check, you would do this:
-
- if ((getequipid(2) == 2341) || (getequipid(2) == 2342) goto L_EquipedLegionPlate;
- // the || is used as an or argument, there is 2341 and 2342 cause there are
- // two different legion plate armors, one with a slot one without.
- if ((countitem(2341) > 0) || (countitem(2432) > 0) goto L_InventoryLegionPlate;
- mes "I will lets you pass";
- close2;
- warp "place.gat",50,50;
- end;
- L_EquipedLegionPlate:
- mes "You are wearing some Legion Plate Armor, please drop that in your stash before continuing";
- close;
- L_InventoryLegionPlate:
- mes "You have some Legion Plate Armor in your inventory, please drop that in your stash before continuing";
- close;
-
----------------------------------------
-
-*getequipname(<equpment slot>)
-
-This function will return the name of the item equipped in the specified
-equipment slot on the invoking character. Almost identical to 'getequipid', good
-for an NPC to state what your are wearing, or maybe saving as a string variable.
-See 'getequipid' for a full list of valid equipment slots.
-
- if (getequipname(1)==0) goto L_No_HeadGear;
- mes "So you are wearing a "+getequipname(1)+" on your head";
- close;
- L_No_HeadGear:
- mes "You are not wearing any head gear";
- close;
-
----------------------------------------
-
-*getbrokenid(<number>)
-
-This function will search the invoking character's inventory for any broken
-items, and will return their item ID numbers. Since the character may have
-several broken items, 0 given as an argument will return the first one found, 1
-will return the second one, etc. Will return 0 if no such item is found.
-
- // Let's see if they have anything broken:
- if (getbrokenid(0)==0) goto Skip;
- // They do, so let's print the name of the first broken item:
- mes "Oh, I see you have a broken "+getitemname(getbrokenid(0))+" here!";
- Skip:
- mes "You don't have anything broken, quit bothering me.";
-
----------------------------------------
-
-*repair <broken item number>;
-
-This command repairs a broken peice of equipment, using the same list of broken
-items as available through 'getbrokenid'.
-
-The official scripts seem to use the repair command as a function instead:
-'repair(<number>)' but it returns nothing on the stack. Probably only Valaris,
-who made it, can answer why is it so.
-
----------------------------------------
-
-*getequipisequiped(<equipment slot>)
-
-This functions will return 1 if there is an equipment placed on the specified
-equipment slot and 0 otherwise. For a list of equipment slots
-see 'getequipid'. Function originally used by the refining NPCs:
-
- if (getequipisequiped(1)) goto L_equipped;
- mes "[Refiner]";
- mes "Do you want me to refine your dumb head?";
- close;
- L_equipped:
- mes "[Refiner]";
- mes "That's a fine hat you are wearing there...";
- close;
-
-
----------------------------------------
-
-*getequipisenableref(<equipment slot>)
-
-Will return 1 if the item equipped on the invoking character in the specified
-equipment slot is refinable, and 0 if it isn't. For a list of equipment slots
-see 'getequipid'.
-
- if (getequipisenableref(1)) goto L_Refine;
- mes "[Refiner]";
- mes "I can't refine this hat!...";
- close;
- L_Refine:
- mes "[Refiner]";
- mes "Ok I can refine this";
- close;
-
----------------------------------------
-
-*getequipisidentify(<equipment slot>)
-
-This function will return 1 if an item in the specified equipment slot is
-identified and 0 if it isn't. Since you can't even equip unidentified equipment,
-there's a question of whether it can actually end up there, and it will normally
-return 1 all the time if there is an item in this equipment slot.
-Which is kinda pointless.
-For a list of equipment slots see 'getequipid'.
-
----------------------------------------
-
-*getequiprefinerycnt(<equipment slot>)
-
-Returns the current number of plusses for the item in the specified equipment
-slot. For a list of equipment slots see 'getequipid'.
-
-Can be used to check if you have reached a maximum refine value, default for
-this is +10:
-
- if(getequiprefinerycnt(1) < 10) goto L_Refine_HeadGear;
- mes "Sorry, it's not possible to refine hats better than +10";
- close;
- L_Refine_HeadGear:
- mes "I will now upgrade your "+getequipname(1);
-
----------------------------------------
-
-*getequipweaponlv(<equipment slot>)
-
-This function returns the weapon level for the weapon equipped in the specified
-equipment slot on the invoking character. For a list of equipment slots see
-'getequipid'.
-
-Only 3 (Left hand) and 4 (Right hand) normally make sense, since only weapons
-have a weapon level. You can, however, probably, use this field for other
-equippable custom items as a flag or something.
-If no item is equipped in this slot, or if it doesn't have a weapon level
-according to the database, 0 will be returned.
-
- if(getequipweaponlv(4)==0) mes "Seems you dont have a weapon on";
- if(getequipweaponlv(4)==1) mes "You are holding a lvl 1 weapon";
- if(getequipweaponlv(4)==2) mes "You are holding a lvl 2 weapon";
- if(getequipweaponlv(4)==3) mes "You are holding a lvl 3 weapon";
- if(getequipweaponlv(4)==4) mes "You are holding a lvl 4 weapon";
- if(getequipweaponlv(4)==5) mes "You are holding a lvl 5 weapon, hm, must be a custom design";
-
-Or for the left hand, cause it can hold a weapon or a shield:
-
- if(getequipid(3)==0) goto L_NothingEquiped;
- if(getequipweaponlv(3)==0) mes "You are holding a shield, so it doesnt have a level";
- if(getequipweaponlv(3)==1) mes "You are holding a lvl 1 weapon";
- if(getequipweaponlv(3)==2) mes "You are holding a lvl 2 weapon";
- if(getequipweaponlv(3)==3) mes "You are holding a lvl 3 weapon";
- if(getequipweaponlv(3)==4) mes "You are holding a lvl 4 weapon";
- if(getequipweaponlv(3)==5) mes "You are holding a lvl 5 weapon, hm, must be a custom design";
- close;
- L_NothingEquiped:
- mes "Seems you have nothing equiped";
- close;
-
----------------------------------------
-
-*getequippercentrefinery(<equipment slot>)
-
-This function calculates and returns the percent value chance to successfully
-refine the item found in the specified equipment slot of the invoking character
-by +1. The actual formula is beyond the scope of this document, however, it is
-calculated as if the character was a blacksmith trying to refine this particular
-weapon, and depends on lots and lots of stuff. For a list of equipment slots see
-'getequipid'.
-
-These values can be displayed for the player to see, or used to calculate the
-random change of a refine succeeding or failing and then going through with it
-(which is what the official NPC refinery scripts use it for)
-
-// This will find a random number from 0 - 99 and if that is equal to or more
-// than the value recoverd by this command it will go to L_Fail
- if (getequippercentrefinery(3)<=rand(100)) goto L_Fail;
-
----------------------------------------
-
-*successrefitem <equipment slot>;
-
-This command will refine an item in the specified equipment slot of the invoking
-character by +1. For a list of equipment slots see 'getequipid'. This command
-will not only add the +1, but also display a 'refine success' effect on the
-character and put appropriate messages into their chat window. It will also give
-the character fame points if a weapon reached +10 this way, even though these
-will only take effect for blacksmith who will later forge a weapon.
-
-The official scripts seem to use the 'successrefitem' command as a function
-instead: 'successrefitem(<number>)' but it returns nothing on the stack.
-This is since jAthena, so probably nobody knows for sure why is it so.
-
----------------------------------------
-
-*failedrefitem <equipment slot>;
-
-This command will fail to refine an item in the specified equipment slot of the
-invoking character. The item will be destroyed. This will also display a 'refine
-failure' effect on the character and put appropriate messages into their chat
-window.
-
-The official scripts seem to use the 'failedrefitem' command as a function
-instead: 'failedrefitem(<number>)' but it returns nothing on the stack. This is
-since jAthena, so probably nobody knows for sure why is it so.
-
-
----------------------------------------
-
-*cutin "<filename with no extension>",<position>;
-
-This command will display a picture stored in the GRF file in the client for the
-player.
-
-The files are taken from '\data\texture\A_A£AII’„AI«§\illust' directory in the
-GRF file. The filename must be given with no extension, '.bmp' is added by the
-client itself and you can't have any other picture format displayed as a cutin.
-The biggest one that comes with the client is 400x503 pixels, and the smallest
-is 303x493 pixels, it is not known how big a picture has to be before the client
-goes insane. Bright magenta (color FF00FF) is considered to be transparent in
-these pictures. You can easily add and alter them, but how to do this is outside
-of the scope of this document.
-
-The position determines just where on screen the picture will appear:
- 0 - bottom left corner
- 1 - bottom middle
- 2 - bottom right corner
- 3 - middle of screen in a movable window with an empty title bar.
- 4 - middle of screen without the window header, but still movable.
- 255 - will remove the cutin previously displayed.
-
-Giving an empty string for the filename and 255 for the position will remove all
-cutin pictures. Any other position value will not cause a script error but will
-cause the player's client to curl up and die. Only one cutin may be on screen at
-any given time, any new cutins will replace it.
-
- // This will display the picture of the 7th kafra,
- // the one in orange and the mini-skirt :P
- cutin "kafra_7",2;
-
- // This will remove the displayed picture.
- cutin "Kafra_7",255;
-
- // This will remove all pictures displayed.
- cutin "",255;
-
-The client comes with those cutin pictures preinstalled which you can use:
-
-mets_alpha - This is a old fat man, holding a pipe, also with a pocket watch
- and cane
-pay_soldier - Wanna take a wild guess, thats right, the Soldiers that appear in
- Payon :D
-prt_soldier - Obvious
-ein_soldier - This guy looks cool, you've got to see him ;) This picture is for
- the new Einbroch guards
-moc_soldier - Obvious
-gef_soldier - Obvious
-katsua01 - It is not certain who this girl is (There is no sprite coming with
-katsua02 - the client that seems to match very well) but she is believed to
-katsua03 - be an NPC in official Comodo. The three pictures give different
- facial expressions.
-kafra_01 - Obvious
-kafra_02 - Obvious
-kafra_03 - Obvious
-kafra_04 - Obvious
-kafra_05 - Obvious
-kafra_06 - Obvious
-kafra_07 - Do I need to mention this one again ;)
-
----------------------------------------
-
-*cutincard <item id>;
-
-This command will display a card picture as a cutin on the client connected to
-the invoking character, with position number 4 (middle of screen, movable, but
-no title bar). See 'cutin'. To remove this cutin, use the regular 'cutin'
-command. Unlike the 'cutin' command, it will not take a filename, but will
-instead take an item ID. It will then refer to the text file listing card images
-which is normally found within your server's copy of the GRF file to find the
-real (korean) filename.
-
-If your server doesn't have that text file in that GRF or can't read it, it
-probably won't work.
-
----------------------------------------
-
-*statusup <stat>;
-
-This command will bump a specified stat of the invoking character up by one
-permanently. Stats are to be given as number, but you can use these constants to
-replace them:
-
-bStr - Strength
-bVit - Vitality
-bInt - Intelligence
-bAgi - Agility
-bDex - Dexterity
-bLuk - Luck
-
----------------------------------------
-
-*statusup2 <stat>,<amount>;
-
-This command will bump a specified stat of the invoking character up by the
-specified amount permanently. The amount can be negative. See 'statusup'.
-
- // This will decrease a character's Vit forever.
- statusup bVit,-1;
-
----------------------------------------
-
-*bonus <bonus type>,<amount>;
-*bonus2 <bonus type>,<amount>;
-*bonus3 <bonus type>,<amount>;
-*bonus4 <bonus type>,<amount>;
-
-These commands are meant to be used in item scripts. They will probably work
-outside item scripts, but the bonus will not persist for long. They, as
-expected, refer only to an invoking character.
-
-You can find the full list of possible bonuses and which command to use for each
-kind in 'doc/item_bonus.txt'.
-
----------------------------------------
-
-*skill <skill id>,<level>{,<flag>};
-*addtoskill <skill id>,<level>{,<flag>}
-
-These commands will give the invoking character a specified skill. This is also
-used for item scripts.
-
-Level is obvious. Skill id is the ID number of the skill in question as per
-'db/skill_db.txt'. It is not known for certain whether this can be used to give
-a character a monster's skill, but you're welcome to try with the numbers given
-in 'db/mob_skill_db.txt'.
-
-Flag is 0 if the skill is given permanently (will get written with the character
-data) or 1 if it is temporary (will be lost eventually, this is meant for card
-item scripts usage.). The flag parameter is optional, and defaults to 1 in
-'skill' and to 2 in 'addtoskill'.
-
-Flag 2 means that the level parameter is to be interpreted as a stackable
-additional bonus to the skill level. If the character did not have that skill
-previously, they will now at 0+the level given.
-
-// This will permanently give the character Stone Throw (TF_THROWSTONE,152), at
-// level 1.
- skill 152,1,0;
-
----------------------------------------
-
-*guildskill <skill id>,<level>{,<flag>}
-
-This command will bump up the specified guild skill by the specified number of
-levels. This refers to the invoking character and will only work if the invoking
-character is a member of a guild AND it's guildmaster, otherwise no failure
-message will be given and no error will occur, but nothing will happen - same
-about the guild skill trying to exceed the possible maximum. The full list of
-guild skills is available in 'db/skill_db.txt', these are all the GD_ skills at
-the end.
-
-The flag parameter is currently not functional and it's a mystery of what it
-would actually do. (Though probably, like for character skills, it would allow
-temporary bumping.) Using this command will bump the guild skill up permanently.
-
-// This would give your character's guild one level of Approval (GD_APPROVAL ID
-// 10000). Notice that if you try to add two levels of Approval, or add
-// Approval when the guild already has it, it will only have one level of
-// Approval afterwards.
- guildskill 10000,1,0;
-
-You might want to make a quest for getting a certain guild skill, make it hard
-enough that all the guild needs to help or something. Doing this for the Glory
-of the Guild skill, which allows your guild to use an emblem, is a good idea for
-a fun quest. (Wasting a level point on that is really annoying :D)
-
----------------------------------------
-
-*getskilllv(<skill id>)
-
-This function returns the level of the specified skill that the invoking
-character has. If they don't have the skill, 0 will be returned. The full list
-of character skills is available in 'db/skill_db.txt'.
-
-There are two main uses for this function, it can check whether the character
-has a skill or not, and it can tell you if the level is high enough.
-
-Example 1:
-
- f (getskilllv(152)) goto L_HasSkillThrowStone;
- mes "You dont have Throw Stone";
- close;
- L_HasSkillThrowStone:
- mes "You have got the skill Throw Stone";
- close;
-
-Example 2:
-
- if (getskilllv(28) >= 5) goto L_HasSkillHeallvl5orMore;
- if (getskilllv(28) == 10) goto L_HasSkillHealMaxed;
- mes "You heal skill is below lvl 5";
- close;
- L_HasSkillHeallvl6orMore:
- mes "Your heal lvl is 5 or more";
- close;
- L_HasSkillHealMaxed:
- mes "Your heal lvl has been maxed";
- close;
-
----------------------------------------
-
-*getgdskilllv(<guild id>,<skill id>)
-
-This function retirns the guild skills for the guild with a specified ID exactly
-as 'getskilllv' does.
-
----------------------------------------
-
-*basicskillcheck()
-
-This function will return the state of the configuration option
-'basic_skill_check' in 'battle_athena.conf'. It returns 1 if the option is
-enabled and 0 if it isn't. If the 'basic_skill_check' option is enabled, which
-it is by default, characters must have a certain number of basic skill levels to
-sit, request a trade, use emoticons, etc. Making your script behave differently
-depending on whether the characters must actually have the skill to do all these
-things might in some cases be required.
-
----------------------------------------
-
-*getgmlevel()
-
-This function will return the GM level of the account to which the invoking
-character belongs. If this is somehow executed from a console command, 99 will
-be returned, and 0 will be returned if the account has no GM level.
-
-This allows you to make NPC's only accessable for certain GM levels, or behave
-specially when talked to by GMs.
-
- if (getgmlevel()) mes "What is your command, your godhood?";
- if (getgmlevel()) goto Wherever;
-
----------------------------------------
-
-*end;
-*break;
-
-This command will stop the execution for this particular script. The two
-versions are prefectly equivalent. It is the normal way to end a script which
-does not use 'mes'.
-
- if (BaseLevel<=10) goto L_Lvl10;
- if (BaseLevel<=20) goto L_Lvl20;
- if (BaseLevel<=30) goto L_Lvl30;
- if (BaseLevel<=40) goto L_Lvl40;
- if (BaseLevel<=50) goto L_Lvl50;
- if (BaseLevel<=60) goto L_Lvl60;
- if (BaseLevel<=70) goto L_Lvl70;
- L_Lvl10:
- npctalk "Look at that you are still a n00b";
- end;
- L_Lvl20:
- npctalk "Look at that you are getting better, but still a n00b";
- end;
- L_Lvl30:
- npctalk "Look at that you are getting there, you are almost 2nd profession now right???";
- end;
- L_Lvl40:
- npctalk "Look at that you are almost 2nd profession";
- end;
-
-Without the use if 'end' it would travel through the labels until the end of the
-script. If you were lvl 10 or less, you would see all the speech lines, the use
-of 'end' stops this, and ends the script.
-
-Note: Break won't work anymore, it has been commented out in src/map/script.c:
-
-// {buildin_end,"break",""}, this might confuse advanced scripting support [Eoe]
-
----------------------------------------
-
-*checkoption(<option number>)
-*checkoption1(<option number>)
-*checkoption2(<option number>)
-*setoption <option number>{,type};
-
-The 'setoption' series of functions check for a so-called option that is set on
-the invoking character. 'Options' are used to store status conditions and a lot
-of other non-permanent character data of the yes-no kind. For most common cases,
-it is better to use 'checkcart','checkfalcon','checkpeco' and other similar
-functions, but there are some options which you cannot get at this way. They
-return 1 if the option is set and 0 if the option is not set.
-
-Option numbers valid for the first (option) version of this command are:
-
-0x1 - Sight in effect.
-0x2 - Hide in effect.
-0x4 - Cloaking in effect.
-0x8 - Cart number 1 present.
-0x10 - Falcon present.
-0x20 - Peco Peco present.
-0x40 - GM Perfect Hide in effect.
-0x80 - Cart number 2 present.
-0x100 - Cart number 3 present.
-0x200 - Cart number 4 present.
-0x400 - Cart number 5 present.
-0x800 - Orc head present.
-0x1000 - The character is wearing a wedding sprite.
-0x2000 - Ruwach is in effect.
-0x4000 - Chasewalk in effect.
-
-Option numbers valid for the second version (opt1) of this command are:
-
-1 - Petrified.
-2 - Frozen.
-3 - Stunned.
-4 - Sleeping.
-6 - Petrifying (the state where you can still walk)
-
-Option numbers valid for the third version (opt2) of this command are:
-
-1 - Poisoned.
-2 - Cursed.
-4 - Silenced.
-8 - Signum Crucis (plays a howl-like sound effect, but otherwise no visible effects are displayed)
-16 - Blinded.
-
-Option numbers (except for opt1) are bitmasks - you can add them up to check
- for several states, but the functions will return true if at least one of them
- is in effect.
-
-'setoption' will set options on the invoking character. There are no second and
-third versions of this command, so you can only change the values in the first
-list (cloak, cart, ruwach, etc). if flag is 1 (default when omitted),
-the option will be added to what the character currently has; if 0, the option is removed.
-
-This is definitely not a complete list of available option flag numbers. Ask a
-core developer (or read the source: src/map/status.h) for the full list.
-
----------------------------------------
-
-*setcart;
-*checkcart()
-
-This command will give the invoking character a cart. The cart given will be
-cart number 1 and will work regardless of whether the character is a merchant
-class or not.
-
-The accompanying function will return 1 if the invoking character has a cart
-(any kind of cart) and 0 if they don't.
-
- if (checkcart()) mes "But you already have a cart!";
-
----------------------------------------
-
-*setfalcon;
-*checkfalcon()
-
-This command will give the invoking character a falcon. The falcon will be there
-regardless of whether the character is a hunter or not. It will (probably) not
-have any useful effects for non-hunters though.
-
-The accompanying function will return 1 if the invoking character has a falcon
-and 0 if they don't.
-
- if (checkfalcon()) mes "But you already have a falcon!";
-
----------------------------------------
-
-*setriding;
-*checkriding()
-
-This command will give the invoking character a PecoPeco (if they are a Knight
-series class) or a GrandPeco (if they are a Crusader seriesclass). Unlike
-'setfalcon' and 'setcart' this will not work at all if they aren't of a class
-which can ride. This will work if the character doesn't have the riding skill,
-however.
-
-The accompanying function will return 1 if the invoking character is riding a
-bird and 0 if they don't.
-
- if (checkriding()) mes "PLEASE leave your bird outside! No riding birds on the floor here!";
-
----------------------------------------
-
-*savepoint "<map name>",<x>,<y>;
-*save "<map name>",<x>,<y>;
-
-This command saves a point that the invoking character will return to upon
-'return to save point' if dead or in some other cases. The two versions are
-equivalent. Map name, X coordinate and Y coordinate should be perfectly obvious.
-This ignores any and all map flags, and can make a character respawn where no
-teleportation is otherwise possible.
-
- savepoint "place.gat",350,75;
-
----------------------------------------
-
-*gettimetick(<tick type>)
-
-This function will return the system time in UNIX epoch time (if tick type is 2)
-or the time since the start of the current day in seconds if tick type is 1.
-Passing 0 will make it return the server's tick, which is a measurement in
-milliseconds used by the server's timer system. The server's tick is an
-unsigned int which loops every ~50 days.
-
-Just in case you don't know, UNIX epoch time is the number of seconds elapsed
-since 1st of January 1970, and is useful to see, for example, for how long the
-character has been online with OnPCLoginEvent and OnPCLogoutEvent, which could allow
-you to make an 'online time counted for conviction only' jail script.
-
----------------------------------------
-
-*gettime(<type>)
-
-This function will return specified information about the current system time.
-
-1 - Seconds (of a minute)
-2 - Minutes (of an hour)
-3 - Hour (of a day)
-4 - Week day (0 for Sunday, 6 is Saturday)
-5 - Day of the month.
-6 - Number of the month.
-7 - Year.
-8 - Day of the year.
-
-It will only return numbers.
-
- if (gettime(4)==6) mes "It's a Saturday. I don't work on Saturdays.";
-
----------------------------------------
-
-*gettimestr(<format string>,<max length>)
-
-This function will return a string containing time data as specified by the
-format string.
-
-This uses the C function 'strfmtime', which obeys special format characters. For
-a full description see, for example, the description of 'strfmtime' at
-http://www.delorie.com/gnu/docs/glibc/libc_437.html
-All the format characters given in there should properly work.
-Max length is the maximum length of a time string to generate.
-
-The example given in eAthena sample scripts works like this:
-
- mes gettimestr("%Y-%m/%d %H:%M:%S",21);
-
-This will print a full date and time like 'YYYY-MM/DD HH:MM:SS'.
-
----------------------------------------
-
-*openstorage;
-
-This will open a character's Kafra storage window on the client connected to the
-invoking character. It does not check wherever it is run from, so you can allow
-any feasible NPC to open a kafra storage. (It's not certain whether this works
-in item scripts, but if it does, it could be interesting.)
-
-The storage window might not open if a message box or a trade deal is present on
-screen already, so you should at least make sure the message box is closed
-before you open storage.
-
- mes "I will now open your stash for you";
- close2;
- openstorage;
- end;
-
----------------------------------------
-
-*guildopenstorage()
-
-This function works the same as 'openstorage' but will open a guild storage
-window instead for the guild storage of the guild the invoking character belongs
-to. This is a function because it returns a value - 0 if the guild storage was
-opened successfully and 1 if it wasn't. (Notice, it's a ZERO upon success.)
-Since guild storage is only accessible to one character at one time, it may fail
-if another character is accessing the guild storage at the same time.
-
-This will also fail and return 2 if the character does not belong to any guild.
-
----------------------------------------
-
-*itemskill <skill id>,<skill level>,"<skill name to show>";
-
-This is a command meant for item scripts to replicate single-use skills. It will
-not work properly in NPC scripts a lot of the time because casting a skill is
-not allowed when there is a message window or menu on screen. If there isn't one
-cause you've made sure to run this when they already closed it, it should work
-just fine and even show a targeting pointer if this is a targeting skill.
-
-// When you use Anodyne, you will cast Endure(8) level 1,
-// and "Endure" will appear above your head as you use it.
-605,Anodyne,Anodyne,11,2000,0,100,,,,,10477567,2,,,,,{ itemskill 8,1,"Endure"; },{}
-
-
----------------------------------------
-
-*produce <item level>;
-
-This command will open a crafting window on the client connected to the invoking
-character. The 'item level' is a number which determines what kind of a crafting
-window will pop-up. You can see the full list of such item levels in
-'db/produce_db.txt' which determines what can actually be produced.
-The window will not be empty only if the invoking character can actually produce
-the items of that type and has the appropriate raw materials in their inventory.
-
-Valid item levels are:
-
- 1 - Level 1 Weapons
- 2 - Level 2 Weapons
- 3 - Level 3 Weapons
- 16 - Blacksmith's Stones and Metals
- 32 - Alchemist's Potions
- 64 - Whitesmith's Coins
- 123 - Whitesmith's Nuggets
- 256 - Assassin Cross's Deadly Poison
-
----------------------------------------
-
-*monster "<map name>",<x>,<y>,"<name to show>",<mob id>,<amount>{,"<event label>"};
-*areamonster "<map name>",<x1>,<y1>,<x2>,<y2>,"<monster name>",<amount>{,"<event label>"};
-
-This command will spawn a monster on the specified coordinates on the specified
-map. If the script is invoked by a character, a special map name, "this", will
-be recognised to mean the name of the map the invoking character is located at.
-This command works fine in the item scripts.
-
-The same command arguments mean the same things as described above in the
-beginning of this document when talking about permanent monster spawns. Monsters
-spawned in this manner will not respawn upon being killed.
-
-Unlike the permanent monster spawns, if the mob id is -1, a random monster will
-be picked from the entire database according to the rules configured in the
-server for dead branches. This will work for all other kinds of non-permanent
-monster spawns.
-
-The only very special thing about this command is an event label, which is an
-optional parameter. This label is written like '<NPC object name>::<label name>'
-and upon the monster being killed, it will execute the script inside of the
-specified NPC object starting from the label given. The RID of the player
-attached at this execution will be the RID of the killing character.
-
- monster "place.gat",60,100,"Poring",1002,1,"NPCNAME::OnLabel";
-
-If you do not specify any event label, a label in the NPC object that ran this
-command, called 'OnMyMobDead:' will execute anyway, if present.
-
-The coordinates of 0,0 will spawn the monster on a random place on the map.
-
-The 'areamonster' command works much like the 'monster' command and is not
-significantly different, but spawns the monsters within a square defined by
-x1/y1-x2/y2.
-
-Simple monster killing script:
-
- <Normal NPC object definition. Let's assume you called him NPCNAME.>
- mes "[Summon Man]";
- mes "Want to start the kill?";
- next;
- menu "Yes",L_Yes,"No",-;
- mes "[Summon Man]";
- mes "Come back later";
- close;
- L_Yes:
- monster "prontera.gat",0,0,"Quest Poring",1002,10,"NPCNAME::OnPoringKilled";
- // By using 0,0 it will spawn them in a random place.
- mes "[Summon Man]";
- mes "Now go and kill all the Poring I summoned";
- // He summoned ten.
- close;
- L_PoringKilled:
- set $PoringKilled,$PoringKilled+1;
- if ($PoringKilled==10) goto L_AllDead;
- end;
- L_AllDead:
- announce "Summon Man: Well done all the poring are dead",3;
- set $PoringKilled,0;
- end;
-
-For more good examples see just about any official 2-1 or 2-2 job quest script.
-
----------------------------------------
-
-*killmonster "<map name>","<event label>";
-
-This command will kill all monsters that were spawned with 'monster' or
-'addmonster' and have a specified event label attached to them. Commonly used to
-get rid of remaining quest monsters once the quest is complete.
-
-If the label is given as "All", all monsters which have their respawn times set
-to -1 (like all the monsters summoned with 'monster' or 'areamonster' script
-command, and all monsters summoned with GM commands, but no other ones - that
-is, all non-permanent monsters) on the specified map will be killed regardless
-of the event label value.
-
----------------------------------------
-
-*killmonsterall "<map name>";
-
-This command will kill all monsters on a specified map name, regardless of how
-they were spawned or what they are.
-
----------------------------------------
-*clone "<map name>",<x>,<y>,"<event>",<char id>{,<master_id>{,<mode>{,<flag>,<duration>}}}
-
-This command creates a monster which is a copy of another player. The first
-four arguments serve the same purpose as in the monster script command, The
-<char id> is the character id of the player to clone (player must be online).
-If <master id> is given, the clone will be a 'slave/minion' of it. Master_id
-must be a character id of another online player.
-
-The mode can be specified to determine the behaviour of the clone, it's
-values are the same as the ones used for the mode field in the mob_db. The
-default mode is aggressive, assists, can move, can attack.
-
-Flag can be either zero or one currently. If zero, the clone is a normal
-monster that'll target players, if one, it is considered a summoned monster,
-and as such, it'll target other monsters. Defaults to zero.
-
-The duration specifies how long the clone will live before it is auto-removed.
-Specified in seconds, defaults to no limit (zero).
-
-Returned value is the monster ID of the spawned clone. If command fails,
-returned value is zero.
-
----------------------------------------
-
-*doevent "<NPC object name>::<event label>";
-
-This command will start a new execution thread in a specified NPC object at the
-specified label. The execution of the script running this command will not stop.
-No parameters may be passed with a doevent call.
-
-The script of the NPC object invoked in this manner will run as if it's been
-invoked by the RID that was active in the script that issued a 'doevent'.
-
- place.gat,100,100,1%TAB%script%TAB%NPC%TAB%53,{
- mes "This is what you will see when you click me";
- close;
- Label:
- mes "This is what you will see if the doevent is activated";
- close;
- }
-
- ....
-
- doevent "NPC::Label";
-
----------------------------------------
-
-*donpcevent "<event label>";
-
-This command is kinda confusing cause it performs in two completely different
-ways.
-
-If the event label is phrased like "::<label name>", all NPC objects that have a
-specified label in them will be invoked as if by a 'doevent', but no RID
-whatsoever will be attached while they execute.
-
-Otherwise, if the label is given as "<NPC name>::<label name>", a label within
-the NPC object that runs this command will be called, but as if it was running
-inside another, specified NPC object. No RID will be attached to it in this case
-either.
-
-This can be used for making another NPC react to an action that you have done
-with the NPC that has this command in it, i.e. show an emotion, or say
-something.
-
- place.gat,100,100,1%TAB%script%TAB%NPC%TAB%53,{
- mes "Hey NPC2 copy what I do";
- close2;
- set @emo, rand(1,30);
- donpcevent "NPC2::Emo";
- Emo:
- emotion @emo;
- end;
- }
-
- place.gat,102,100,1%TAB%script%TAB%NPC2%TAB%53,{
- mes "Hey NPC copy what I do";
- close2;
- set @emo, rand(1,30);
- donpcevent "NPC::Emo";
- Emo:
- emotion @emo;
- end;
- }
-
-This will make both NPC perform the same random emotion from 1 to 30, and the
-emotion will appear above each of their heads.
-
----------------------------------------
-
-*addtimer <ticks>,"<NPC object name>::<label>";
-*deltimer "<NPC object name>::<event label>";
-*addtimercount <ticks>,"<NPC object name>::<event label>";
-
-These commands will create, destroy, and delay a countdown timer - 'addtimer' to
-create, 'deltimer' to destroy and 'addtimercount' to delay it by the specified
-number of ticks. For all three cases, the event label given is the identifier of
-that timer.
-
-When this timer runs out, a new execution thread will start in the specified NPC
-object at the specified label. If no such label is found in the NPC object, it
-will run as if clicked. In either case, no RID will be attached during
-execution.
-
-The ticks are given in 1/1000ths of a second.
-
----------------------------------------
-
-*stoptimer;
-*inittimer;
-*enablearena;
-*disablearena;
-*cmdothernpc "<npc name?>","<command?>";
-
-This set of commands is marked as added by someone going under the nickname
-'RoVeRT', as mentioned the source code comments, and has to do with timers and
-scheduling working entirely unlike any other timing commands. It is not certain
-that they actually even work properly anymore, and most of these read no
-arguments, though the 'inittimer'/'stoptimer' pair of commands has to do
-something with an 'OnTimer' label and will probably invoke it and 'cmdothernpc'
-will execute starting with the label 'OnCommand'. Whatever they actually do, the
-other commands can most likely do it better. The two arena commands definitely
-do not do anything useful at all.
-
-None of these commands are used in any scripts bundled with eAthena. Most
-probably they are deprecated and left in by mistake.
-
-Unless RoVeRT can be found and asked to clarify what these were made for, that
-is.
-
----------------------------------------
-
-*initnpctimer{ "<NPC object name>"};
-*stopnpctimer{ "<NPC object name>"};
-*startnpctimer{ "<NPC object name>"};
-*setnpctimer <tick>{,"<NPC object name>"};
-*getnpctimer(<type of information>{,"<NPC object name>"});
-*attachnpctimer {"<character name>"};
-*detachnpctimer {"<NPC object name>"};
-
-This set of commands and functions will create and manage an NPC-object based
-timer. The NPC object may be declared by name, or the name in all cases may be
-omitted, in that case this timer will be based in the object the current script
-is running in.
-
-Why is it actually part of an NPCs structure we aren't sure, but it is, and
-while 'addtimer'/'deltimer' commands will let you have many different timers
-referencing different labels in the same NPC, one each and each with their own
-countdown, 'initnpctimer' can only have one per NPC object. But it can trigger
-many labels and it can let you know how many were triggered already and how many
-still remain.
-
-This timer is counting up from 0 in ticks of 1/1000ths of a second each. Upon
-creating this timer, the execution will not stop, but will happily continue
-onward. The timer will then invoke new execution threads at labels
-"OnTimer<time>:" in the NPC object it is attached to.
-
-To create the timer, use the 'initnpctimer', which will start it running.
-'stopnpctimer' will pause the timer, without clearing the current tick, while
-'startnpctimer' will let the paused timer continue.
-
-It is not quite clear whether the new invocations will always have a RID.
-Apparently, the RID that was in effect when the timer was initialised will still
-be attached to these executions in some cases, but it's not quite clear -
-experiment with RID-dependent commands, like 'mes', and tell us what happens and
-who gets the message, if anyone.
-
-Even if they don't have a RID by default, 'attachnpctimer' will allow you to
-explicitly attach a character's RID to the timer, which will make them the
-target for all character-referencing commands and functions, not to mention
-variables. 'detachnpctimer' will make the RID zero, making all character-
-referencing functions fail with an error.
-
-'setnpctimer' will explicitly set the timer to a given tick. To make it useful,
-you will need the 'getnpctimer' function, which the type of information argument
-means:
-
- 0 - Will return the current tick count of the timer.
- 1 - Will return 1 if there are remaining "OnTimer<ticks>:" labels in the
- specified NPC waiting for execution.
- 2 - Will return the number of times the timer has triggered an "OnTimer<tick>:"
- label in the specified NPC.
-
-Example 1:
-
- <NPC Header> {
- initnpctimer;
- npctalk "I cant talk right now, give me 10 seconds";
- end;
- OnTimer5000:
- npctalk "Ok 5 seconds more";
- end;
- OnTimer6000:
- npctalk "4";
- end;
- OnTimer7000:
- npctalk "3";
- end;
- OnTimer8000:
- npctalk "2";
- end;
- OnTimer9000:
- npctalk "1";
- end;
- OnTimer10000:
- stopnpctimer;
- mes "[Man]";
- mes "Ok we can talk now";
- }
-
-Example 2:
-
- OnTimer15000:
- set $quote,rand(5);
- if($quote == 0) goto Lquote0;
- if($quote == 1) goto Lquote1;
- if($quote == 2) goto Lquote2;
- if($quote == 3) goto Lquote3;
- if($quote == 4) goto Lquote4;
- Lquote0:
- npctalk "If 0 is randomly picked you will see this";
- setnpctimer 0;
- end;
- Lquote1:
- npctalk "If 1 is randomly picked you will see this";
- setnpctimer 0;
- end;
- Lquote2:
- npctalk "If 2 is randomly picked you will see this";
- setnpctimer 0;
- end;
- Lquote3:
- npctalk "If 3 is randomly picked you will see this";
- setnpctimer 0;
- end;
- Lquote4:
- npctalk "If 4 is randomly picked you will see this";
- setnpctimer 0;
- end;
-
- // This OnInit label will run when the script is loaded, so that the timer
- // is initialised immediately as the server starts. It is dropped back to 0
- // every time the NPC says something, so it will cycle continiously.
- OnInit:
- initnpctimer;
- end;
-
-Example 3:
-
- mes "[Man]";
- mes "I have been waiting "+(getnpctimer(0)/1000)+" seconds for you";
- // we divide the timer returned by 1000 cause it will be displayed in
- // milliseconds otherwise
- close;
-
-Example 4:
-
- mes "[Man]";
- mes "Ok I will let you have 30 sec more";
- close2;
- setnpctimer (getnpctimer(0)-30000);
- // Notice the 'close2'. If there were a 'next' there the timer would be
- // changed only after the player pressed the 'next' button.
- end;
-
----------------------------------------
-
-*announce "<text>",<flag>{,<color>}
-
-This command will broadcast a message to all or most players, similar to
-@kami/@kamib GM commands.
-
-The region the broadcast is heard in and the color the message will come up as
-will be determined by the flags:
-
- announce "This will be shown to everyone at all in yellow.",0;
-
-The flag values are coded as constants in db/const.txt to make them easier to use:
-- bc_all: Broadcast message is sent server-wide
-- bc_map: Message is sent to everyone in the same map
-- bc_area: Message is sent to players in the vecinity of the source.
-- bc_self: Message is sent only to current player.
-
-- bc_npc: Broadcast source is the npc, not the player attached to the script
- (useful when a player is not attached or the message should be sent to those
- nearby the npc)
-
-- bc_yellow: The default is to send broadcasts in yellow color.
-- bc_blue: Alternate broadcast is displayed in blue color.
-
-The optional parameter, color, allows usage of broadcasts in any custom color.
-The color parameter is a single number which can be in hexadecimal notation.
-For example:
- announce "This will be shown to everyone at all in yellow.",bc_all,0xFFFF00;
-Will display a global announce in yellow. The color format is in RGB (0xRRGGBB).
-
-Using this for private messages to players is probably not that good an idea,
-but it can be used instead in NPCs to "preview" an announce.
-
- // This will be a private message to the player using the NPC that made the
- // annonucement
- announce "This is my message just for you",bc_blue|bc_self;
-
- // This will be shown on everyones screen that is in sight of the NPC.
- announce "This is my message just for you people here",bc_area;
-
----------------------------------------
-
-*mapannounce "<map name>","<text>",<flag>[,<color>];
-
-This command will work like 'announce' but will only broadcast to characters
-currently residing on the specified map. The flag and optional color
-parameters are the same as in 'announce', even though the only ones that make
-sense are the color related ones.
-
----------------------------------------
-
-*areaannounce "<map name>",<x1>,<y1>,<x2>,<y2>,"<text>",<flag>[,<color>];
-
-This command works like 'announce' but will only broadcast to characters
-residing in the specified x1/y1-x2/y2 square on the map given. The flags and
-color parameter given are the same as in 'announce', but only the color
-related ones have effect.
-
- areaannounce "prt_church.gat",0,0,350,350,"God's in his heaven, all right with the world",0;
-
----------------------------------------
-
-*getusers(<type>)
-
-This function will return a number of users on a map or the whole server. What
-it returns is specified by Type.
-
-Type is a bitmask, add up to get the effects you want:
-
- 8 - This will count all characters on the same map as the current NPC.
- (By default, it will count people on the same map as the character)
- 7 - Return the amount of players for the entire server.
- (By default, only the players on the map will be counted.)
-
-So 'getusers(0)' will return the number of characters on the same map as the
-invoking character, while 'getusers(7)' will give the count for entire server.
-
----------------------------------------
-
-*getmapusers("<map name>")
-
-This function will return the number of users currently located on the specified
-map.
-
-Currently being used in the PVP scripts to check if a PVP room is full of not,
-if the number returned it equal to the maximum allowed it will not let you
-enter.
-
----------------------------------------
-
-*getareausers("<map name>",<x1>,<y1>,<x2>,<y2>)
-
-This function will return the count of connected characters which are located
-within the specified area - an x1/y1-x2/y2 square on the specified map.
-
-This is useful for maps that are split into many buildings, such as all the
-"*_in.gat" maps, due to all the shops and houses.
-
----------------------------------------
-
-*getareadropitem("<map name>",<x1>,<y1>,<x2>,<y2>,<item>)
-
-This function will count all the items with the specified ID number lying on the
-ground on the specified map within the x1/y1-x2/y2 square on it and return that
-number.
-
-This is the only function around where a parameter may be either a string or a
-number! If it's a number, it means that only the items with that item ID number
-will be counted. If it is a string, it is assumed to mean the 'english name'
-field from the item database. If you give it an empty string, or something that
-isn't found from the item database, it will count items number '512' (apples).
-
----------------------------------------
-
-*disablenpc "<NPC object name>";
-*enablenpc "<NPC object name>";
-
-These two commands will disable and enable, respectively, an NPC object
-specified by name. The disabled NPC will disappear from sight and will no longer
-be triggerable in the normal way. It is not clear whether it will still be
-accessible through 'donpcevent' and other triggering commands, but it probably
-will be. You can disable even warp NPCs if you know their object names, which is
-an easy way to make a map only accessible through walking half the time. Then
-you 'enablenpc' them back.
-
-You can also use these commands to create the illusion of an NPC switching
-between several locations, which is often better than actually moving the NPC -
-create one NPC object with a visible and a hidden part to their name, make a few
-copies, and then disable all except one.
-
----------------------------------------
-
-*hideonnpc "<NPC object name>";
-*hideoffnpc "<NPC object name>";
-
-These commands will make the NPC object specified display as hidden/visible,
-even though not actually disabled per se. Hidden as in thief Hide skill, but
-unfortunately, not detectable by Ruwach or Sight.
-
-As they are now, these commands are pointless, it is suggested to use
-'disablenpc'/'enablenpc', because these two commands actually unload the NPC
-sprite location and other accompanying data from memory when it is not used.
-However, you can use these for some quest ideas (such as cloaking npcs talking
-while hidden then revealing.... you can wonder around =P
-
----------------------------------------
-
-*sc_start <effect type>,<ticks>,<extra argument>{,<target ID number>};
-*sc_start2 <effect type>,<ticks>,<extra argument>,<percent chance>{,<target ID number>};
-*sc_start4 <effect type>,<ticks>,<value 1>,<value 2>,<value 3>,<value 4>{,<target ID number>};
-*sc_end <effect type>{,<target ID number>};
-
-These command bestow a status effect on the invoking character. This command is
-used a lot in the item scripts.
-
- // This would poison them for 10 min
- sc_start SC_Poison,600000,0;
-
-Effect type is a number of effect, 'db/const.txt' lists the common (mostly
-negative) status effect types as constants, starting with 'SC_'. You can also
-use this to give someone an effect of a player-cast spell:
-
- // This will bless someone as if with Bless 10:
- sc_start 10,240000,10;
-
-Extra argument's meaning differs depending on the effect type, for most effects
-caused by a player skill the extra argument means the level of the skill that
-would have been used to create that effect, for others it might have no meaning
-whatsoever. You can actually bless someone with a 0 bless spell level this way,
-which is fun, but weird.
-
-The target ID number, if given, will cause the status effect to appear on a
-specified character, instead of the one attached to the running script. This has
-not been properly tested.
-
-'sc_start2' is perfectly equivalent, but unlike 'sc_start', a status change
-effect will only occur with a specified percentage chance. 10000 given as the
-chance is equivalent to a 100% chance, 0 is a zero.
-
-'sc_start4' is just like sc_start, however it takes four parameters for the
-status change instead of one. What these values are depends on the status
-change in question. For example, elemental armor defense takes the following
-four values:
-- val1 is the first element, val2 is the resistance to the element val1.
-- val3 is the second element, val4 is the resistance to said element.
-eg: sc_start4 SC_DefEle,60000,Ele_Fire,20,Ele_Water,-15;
-
-'sc_end' will remove a specified status effect.
-
-You can see the full list of status effects caused by skills in
-'src/map/status.h' - they are currently not fully documented, but most of that
-should be rather obvious.
-
----------------------------------------
-
-*getscrate(<effect type>,<base rate>{,<target ID number>})
-
-This function will return the chance of a status effect affecting the invoking
-character, in percent, modified by the their current defense against said
-status. The 'base rate' is the base chance of the status effect being inflicted,
-in percent.
-
- if (rand(100) > getscrate(Eff_Blind, 50)) goto BlindHimNow;
-
-You can see the full list of available effect types you can possibly inflict in
-'db/const.txt' under 'Eff_'.
-
-It is pretty certain that addressing the target by an ID number will not
-currently work due to a bug.
-
----------------------------------------
-
-*callshop "<shop name>",<flag>;
-
-This command forces an npc shop to be invoked as if the player clicked on it.
-With normal shops it will not work unless the player is within clicking range,
-but the real use of this script command is together with "invisible shops",
-which are specified in the same way an invisible npc would be specified.
-For example, a generic invisible tool shop could be:
-
-- shop INVISIBLE_SHOP -,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1
-
-Which players cannot click on, but can be invoked using:
-
-callshop "INVISIBLE_SHOP", 0;
-
-The flag values are: 1 invokes the buying window, 2 invokes the selling
-window, any other value invokes the buy/sell dialogue.
-
-The function returns 1 on success, and the script is not automatically
-closed, so be careful to not do any item trading on the same script to prevent
-possible exploits (if possible, use close or close2 before invoking the shop
-itself).
-
----------------------------------------
-
-*debugmes "<message>";
-
-This command will send the message to the server console (map-server window). It
-will not be displayed anywhere else.
-
- debugmes strcharinfo(0)+" has just done this that and the other";
- // You would see in the map-server window "NAME has just done this that and
- // the other"
-
----------------------------------------
-
-*pet <pet id>;
-
-This command is used in all the item scripts for taming items. Running this
-command will make the pet catching cursor appear on the client connected to the
-invoking character, usable on the monsters with the specified pet ID number. It
-will still work outside an item script.
-
-A full list of pet IDs can be found inside 'db/pet_db.txt'
-
----------------------------------------
-
-*bpet;
-
-This command opens up a pet hatching window on the client connected to the
-invoking character. It is used in item script for the pet incubators and will
-let the player hatch an owned egg. If the character has no eggs, it will just
-open up an empty incubator window.
-This is still usable outside item scripts.
-
----------------------------------------
-
-*resetlvl <action type>;
-
-This is a character reset command, meant mostly for rebirth script supporting
-Advanced jobs, which will reset the invoking character's stats and level
-depending on the action type given. Valid action types are:
-
- 1 - Base level 1, Job level 1, 0 skill points, 0 base xp, 0 job xp, wipes the
- status effects, sets all stats to 1. If the new job is 'Novice High', give
- 100 status points, give First Aid and Play Dead skills.
- 2 - Base level 1, Job level 1, 0 skill points, 0 XP/JXP. Skills and attribute
- values are not altered.
- 3 - Base level 1, base xp 0. Nothing else is changed.
- 4 - Job level 1, job xp 0. Nothing else is changed.
-
-In all cases it will also unequip everything the character has on.
-
-Even though it doesn't return a value, it is used as a function in the official
-rebirth scripts. Ask AppleGirl why.
-
----------------------------------------
-
-*resetstatus;
-
-This is a character reset command, which will reset the stats on the invoking
-character and give back all the stat points used to raise them previously.
-Nothing will happen to any other numbers about the character.
-
-Used in reset NPC's (duh!)
-
----------------------------------------
-
-*resetskill;
-
-This command takes off all the skill points on the invoking character, so they
-only have Basic Skill blanked out (lvl 0) left, and returns the points for them
-to spend again. Nothing else will change but the skills. Quest skills will also
-reset if 'quest_skill_reset' option is set to Yes in 'battle_athena.conf'. If
-the 'quest_skill_learn' option is set in there, the points in the quest skills
-will also count towards the total.
-
-Used in reset NPC's (duh!)
-
----------------------------------------
-
-*changebase <job ID number>;
-
-This will change the appearance of the invoking character to that of a specified
-job class. Nothing but appearance will change. This command is used in item
-scripts for "Wedding Dress" and "Tuxedo" so the character like job 22, which is
-the job number of the wedding sprites.
-
-It would be entered in the equip bonus section of an item
-
-2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,119529470,7,0,16,,0,1,0,{ bonus bMdef,15; changebase 22; }
-
-This command only works when inside item scripts.
-
----------------------------------------
-
-*changesex;
-
-This command will change the gender for the attached character's account. If it
-was male, it will become female, if it was female, it will become male. The
-change will be written to the character server, but there is no way to send this
-information to the client, so the player will continue to see their character as
-the gender it previously was. What the other players will see before the
-relogin is not clear.
-
-If the character currently connected when this command was invoked was a
-Dancer/Gypsy or Bard/Clown, they will become a Swordman upon 'changesex'.
-Whatever happens to their skills is not clear. Whatever happens if another
-character on the same account was a gender-specific class is not clear either,
-but it's likely that the client will have serious issues with that, since no
-other characters on the same account will get altered.
-
-There's good reasons to be very careful when using this command.
-
----------------------------------------
-
-*waitingroom "<chatroom name>",<limit>{,<event label>,<trigger>};
-
-This command will create a chat room, owned by the NPC object running this
-script and displayed above the NPC sprite.
-The maximum length of a chatroom name is 60 letters.
-
-The limit is the maximum number of people allowed to enter the chat room. If the
-optional event and trigger parameters are given, the event label
-("<NPC object name>::<label name>") will be invoked as if with a 'doevent' upon
-the number of people in the chat room reaching the given triggering amount.
-
-It's funny, but for compatibility with jAthena, you can swap the event label and
-the trigger parameters, and it will still work.
-
-// The NPC will just show a box above its head that says "Hello World", clicking
-// it will do nothing, since the limit is zero.
- waitingroom "Hello World",0;
-
-// The NPC will have a box above its head, it will say "Disco - Waiting Room"
-// and will have 8 waiting slots. Clicking this will enter the chat room, where
-// the player will be able to wait until 8 people accumulate. Once this happens,
-// it will cause the NPC "Bouncer" run the label "OnStart"
-
- waitingroom "Disco - Waiting Room",8,"Bouncer::OnStart",8;
-
-Creating a waiting room does not stop the execution of the script and it will
-continue to the next line.
-
-For more examples see the 2-1 and 2-2 job quest scripts which make extensive use
-of waiting rooms.
-
----------------------------------------
-
-*delwaitingroom {"<NPC object name"};
-
-This command will delete a waiting room. If no parameter is given, it will
-delete a waiting room attached to the NPC object running this command, if it is,
-it will delete a waiting room owned by another NPC object. This is the only way
-to get rid of a waiting room, nothing else will cause it to disappear.
-
-It's not clear what happens to a waiting room if the NPC is disabled with
-'disablenpc', by the way.
-
----------------------------------------
-
-*enablewaitingroomevent {"<NPC object name>"};
-*disablewaitingroomevent {"<NPC object name>"};
-
-This will enable and disable triggering the waiting room event (see
-'waitingroom') respectively. Optionally giving an NPC object name will do that
-for a specified NPC object. The chat room will not disappear when triggering is
-disabled and enabled in this manner and players will not be kicked out of it.
-Enabling a chat room event will also cause it to immediately check whether the
-number of users in it exceeded the trigger amount and trigger the event
-accordingly.
-
-Normally, whenever a waiting room was created to make sure that only one
-character is, for example, trying to pass a job quest trial, and no other
-characters are present in the room to mess up the script.
-
----------------------------------------
-
-*getwaitingroomstate(<information type>{,"<NPC object name>"})
-
-This function will return information about the wating room state for the
-attached waiting room or for a waiting room attached to the specified NPC if
-any.
-
-The valid information types are:
-
- 0 - Number of users currently chatting.
- 1 - Maximum number of users allowed.
- 2 - Will return 1 if the waiting room has a trigger set.
- 0 otherwise.
- 3 - Will return 1 if the waiting room is currently disabled.
- 0 otherwise.
- 4 - The Title of the waiting room (string)
- 5 - Password of the waiting room, if any. Pointless, since there is no way to
- set a password on a waiting room right now.
- 16 - Event name of the waiting room (string)
- 32 - Whether or not the waiting room is full.
- 33 - Whether the amount of users in the waiting room is higher than the trigger
- number.
-
----------------------------------------
-
-*warpwaitingpc "<map name>",<x>,<y>{,<number of people>};
-
-This command will warp the amount of characters equal to the trigger number of
-the waiting room chat attached to the NPC object running this command to the
-specified map and coordinates, kicking them out of the chat. Those waiting the
-longest will get warped first. It can also do a random warp on the same map
-("Random" instead of map name) and warp to the save point ("SavePoint").
-
-The list of characters to warp is taken from the list of the chat room members.
-Those not in the chat room will not be considered even if they are talking to
-the NPC in question. If the number of people is given, exactly this much people
-will be warped.
-
-This command can also keep track of who just got warped. It does this by setting
-special variables:
-
-$@warpwaitingpc[] is an array containing the character id numbers of the
- characters who were just warped.
-$@warpwaitingpcnum contains the number of the character it just warped.
-
-See also 'getpartymember' for advice on what to do with those variables.
-
-The obvious way of using this effectively would be to set up a waiting room for
-two characters to be warped onto a random PVP map for a one-on-one duel, for
-example.
-
----------------------------------------
-
-*waitingroomkickall {"<NPC object name>"};
-
-This command would kick everybody out of a specified waiting room chat. IF it
-was properly linked into the script interpreter which it isn't, even though the
-code for it is in place. Expect this to become available in upcoming SVN
-releases.
-
----------------------------------------
-
-*attachrid(<character ID>)
-*detachrid
-
-A 'RID' is an ID of a character who caused the NPC script to run, as has been
-explained above in the introduction section. Quite a bit of commands want a RID
-to work, since they wouldn't know where to send information otherwise. And in
-quite a few cases the script gets invoked with a RID of zero (like through
-OnTime special labels). If an NPC script needs this, it can attach a specified
-character's id to itself. by calling the 'attachrid' function.
-
-'attachrid' returns 1 if the character was found online and 0 if it wasn't.
-
-This could also be used, while running in a script invoked by a character
-through talking to an NPC, to mess with other characters.
-Detaching the RID will make the RID of the script zero.
-
----------------------------------------
-
-*isloggedin(<character id>)
-
-This function returns 1 if the specified character is logged in and 0 if they
-aren't.
-
----------------------------------------
-
-*setmapflagnosave "<map name>","<alternate map name>",<x>,<y>;
-
-This command sets the 'nosave' flag for the specified map and also gives an
-alternate respawn-upon-relogin point.
-
-It does not make a map impossible to make a savepoint on as you would normally
-think, 'savepoint' will still work. It will, however, make the specified map
-kick the reconnecting players off to the alternate map given to the coordinates
-specified.
-
----------------------------------------
-
-*setmapflag "<map name>",<flag>;
-
-This command marks a specified map with a map flag given. Map flags alter the
-behavior of the map, you can see the list of the available ones in
-'db/const.txt' under 'mf_'.
-
-The map flags alter the behavior of the map regarding teleporting (mf_nomemo,
-mf_noteleport, mf_nowarp, mf_nogo) storing location when disconnected
-(mf_nosave), dead branch usage (mf_nobranch), penalties upon death
-(mf_nopenalty, mf_nozenypenalty), PVP behavior (mf_pvp, mf_pvp_noparty,
-mf_pvp_noguild, mf_nopvp), WoE behavior (mf_gvg,mf_gvg_noparty), ability to use
-skills or open up trade deals (mf_notrade, mf_novending, mf_noskill, mf_noicewall),
-current weather effects (mf_snow, mf_fog, mf_sakura, mf_leaves, mf_rain, mf_clouds,
-mf_fireworks) and whether day/night will be in effect on this map (mf_indoors).
-
----------------------------------------
-
-*removemapflag "<map name>",<flag>;
-
-This command removes a mapflag from a specified map. See 'setmapflag'.
-
----------------------------------------
-
-*pvpon "<map name>";
-*pvpoff "<map name>";
-
-These commands will turn PVP mode for the specified maps on and off. Beside
-setting the flags referred to in 'setmapflag', 'pvpon' will also create a PVP
-timer and ranking as will @pvpon GM command do.
-
----------------------------------------
-
-*gvgon "<map name>";
-*gvgoff "<map name>";
-
-These commands will turn GVG mode for the specified maps on and off, setting up
-appropriate map flags. In GVG mode, maps behave as if during the time of WoE,
-even though WoE itself may or may not actually be in effect.
-
----------------------------------------
-
-*emotion <emotion number>{, target};
-
-This command makes an object display an emoticon sprite above their own as
-if they were doing that emotion. For a full list of emotion numbers,
-see 'db/const.txt' under 'e_'. The inobvious ones are 'e_what' (a question mark)
-and 'e_gasp' (the exclamation mark).
-
-The optional target parameter specifies who will get the emotion on top of
-their head. If 0 (the default if omitted), the NPC in current use will show
-the emotion, if 1, the player that is running the script will display it.
-
----------------------------------------
-
-*maprespawnguildid "<map name>",<guild id>,<flag>;
-
-This command goes through the specified map and for each player and monster
-found there does stuff.
-
-Flag is a bitmask (add up numbers to get effects you want)
- 1 - warp all guild members to their savepoints.
- 2 - warp all non-guild members to their savepoints.
- 4 - remove all monsters which are not guardian or emperium.
-
-Flag 7 will, therefore, mean 'wipe all mobs but guardians and the emperium and
-kick all characters out', which is what the official scripts do upon castle
-surrender. Upon start of WoE, the scripts do 2 (warp all intruiders out).
-
-Characters not belonging to any guild will warp out regardless of the flag setting.
-
-For examples, check the WoE scripts in the distribution.
-
----------------------------------------
-
-*agitstart;
-*agitend;
-
-These two commands will start and end War of Emperium.
-
-This is a bit more complex than it sounds, since the commands themselves won't
-actually do anything interesting, except causing all 'OnAgitStart:' and
-'OnAgitEnd:' events to run everywhere, respectively, and setting a so-called
-'agit_flag' which also doesn't do much interesting itself. They are used as
-simple triggers to run a lot of complex scripts all across the server, and they,
-in turn, are triggered by clock with an 'OnClock<time>:' time-triggering label.
-
----------------------------------------
-
-*agitcheck(0)
-*agitcheck 1;
-
-These function and command will let you check whether the server is currently in
-the War of Emperium mode. (that is, if 'agit_flag' is set. Even if it is set,
-doesn't mean that there's even one map in GVG mode somewhere) Calling
-'agitcheck' as a function (the argument must be zero) will return 1 if WoE is on
-and 0 if it isn't. Running 'agitcheck' as a command will instead set a local
-variable @agit_flag to 1 if the server is in WoE mode and 0 if it isn't.
-
----------------------------------------
-
-*flagemblem <guild id>;
-
-This command only works when run by the NPC objects which have sprite id 722,
-which is a 3D guild flag sprite. If it isn't, the data will change, but nothing
-will be seen by anyone. If it is invoked in that manner, the emblem of the
-specified guild will appear on the flag, though, if any players are watching it
-at this moment, they will not see the emblem change until they move out of sight
-of the flag and return.
-
-This is commonly used in official guildwar scripts with a function call which
-returns a guild id:
-
-// This will change the emblem on the flag to that of the guild that owns
-// "guildcastle"
-
- flagemblem GetCastleData("guildcastle.gat",1);
-
----------------------------------------
-
-*getcastlename("<map name>")
-
-This function returns the name of the castle when given the map name for that
-castle. The data is read from 'db/castle_db.txt'.
-
----------------------------------------
-
-*getcastledata("<map name>",<type of data>)
-*setcastledata "<map name>",<type of data>,<value>;
-
-This function returns the castle ownership information for the castle referred
-to by it's map name. Castle information stored in 'save\castle.txt' for the TXT
-version of the server and in 'guild_castle' table for the SQL version.
-
-Valid types of data are:
-
- 0 - Will make the map server request the castle data from the char server, and
- always return 0. This, apparently, will also cause indirectly the execution
- of an 'OnAgitInit:' event mentioned at the beginning of this document.
- 1 - Guild ID
- 2 - Castle Economy score.
- 3 - Castle Defence score.
- 4 - Number of times the economy was invested in today.
- 5 - Number of times the defence was invested in today.
- 9 - Will return 1 if a Kafra was hired for this castle, 0 otherwise.
-10 - Is 1 if the 1st guardian is present (Soldier Guardian)
-11 - Is 1 if the 2nd guardian is present (Soldier Guardian)
-12 - Is 1 if the 3rd guardian is present (Soldier Guardian)
-13 - Is 1 if the 4th guardian is present (Archer Guardian)
-14 - Is 1 if the 5th guardian is present (Archer Guardian)
-15 - Is 1 if the 6th guardian is present (Knight Guardian)
-16 - Is 1 if the 7th guardian is present (Knight Guardian)
-17 - Is 1 if the 8th guardian is present (Knight Guardian)
-
-18-25 types of data will return current hit point values for guardians 1-8
-respectively.
-
-The 'setcastledata' command will behave identically, but instead of returning
-values for the specified types of accessible data, it will alter them and cause
-them to be sent to the char server for storage. Data type of 0 won't do
-anything, obviously.
-
----------------------------------------
-
-*requestguildinfo <guild id>,"<event label>";
-
-This command requests the guild data from the char server and merrily continues
-with the execution. Whenever the guild information becomes available (which
-happens instantly if the guild information is already in memory, or later, if it
-isn't and the map server has to wait for the char server to reply) it will run
-the specified event as in a 'doevent' call.
-
----------------------------------------
-
-*getequipcardcnt(<equipment slot>)
-
-This function will return the number of cards that have been compounded onto a
-specific equipped item for the invoking character. See 'getequipid' for a list
-of possible equipment slots.
-
----------------------------------------
-
-*successremovecards <equipment slot>;
-
-This command will remove all cards from the item found in the specified
-equipment slot of the invoking character, create new card items and give them to
-the character. If any cards were removed in this manner, it will also show a
-success effect.
-
----------------------------------------
-
-*failedremovecards <equipment slot>,<type>;
-
-This command will remove all cards from the item found in the specified
-equipment slot of the invoking character. 'type' determines what happens to the
-item and the cards:
-
- 0 - will destroy both the item and the cards.
- 1 - will keep the item, but destroy the cards.
- 2 - will keep the cards, but destroy the item.
-
-Whatever the type is, it will also show a failure effect on screen.
-
----------------------------------------
-
-*marriage("<spouse name>");
-
-This function will marry two characters, the invoking character and the one
-referred to by name given, together, setting them up as each other's marriage
-partner. No second function call has to be issued (in current SVN at least) to
-make sure the marriage works both ways. The function returns 1 upon success, or
-0 if the marriage could not be completed, either because the other character
-wasn't found or because one of the two characters is already married.
-
-This will do nothing else for the marriage except setting up the spouse ID for
-both of these characters. No rings will be given and no effects will be shown.
-
----------------------------------------
-
-*wedding;
-
-This command will call up wedding effects - the music and confetti - centered on
-the invoking character.
-
----------------------------------------
-
-*divorce()
-
-This function will un-marry the invoking character from whoever they were
-married to. Both will no longer be each other's marriage partner, (at least in
-current SVN, which prevents the cases of multi-spouse problems). It will return
-1 upon success or 0 if the character was not married at all.
-
-This function will also destroy both wedding rings and send a message to both
-players, telling them they are now divorced.
-
----------------------------------------
-
-*ispartneron()
-
-This function returns 1 if the invoking character's marriage partner is
-currently online and 0 if they are not or if the character has no partner.
-
----------------------------------------
-
-*getpartnerid()
-
-This function returns the character ID of the invoking character's marriage
-partner, if any. If the invoking character is not married, it will return 0,
-which is a quick way to see if they are married:
-
- if (getpartnerid()) mes "I'm not going to be your girlfriend!";
- if (getpartnerid()) mes "You're married already!";
-
----------------------------------------
-
-*warppartner("<map name>",<x>,<y>);
-
-This function will find the invoking character's marriage partner, if any, and
-warp them to the map and coordinates given. Go kidnap that spouse. :) It will
-return 1 upon success and 0 if the partner is not online, the character is not
-married, or if there's no invoking character (no RID). 0,0 will, as usual,
-normally translate to random coordinates.
-
----------------------------------------
-
-*adopt "<parent name>","<parent name>","<novice name>";
-*adopt("<parent name>","<parent name>","<novice name>");
-
-This command will set up a novice as a baby of a married couple. All three are
-referred to by character name. The correct variables are set on all three
-characters in the same call. The command will unequip anything the novice has
-equipped and make them a Job_Baby class, as well as send them a 'your job has
-been changed' message.
-
-Beware of calling this from inside a 'callfunc' function, cause upon successful
-adoption, this command returns a zero, as if it were a function. This is likely
-to screw up execution of a 'return' command. You may try to call it as a
-function instead, but it doesn't return anything upon an error, which may also
-cause script execution to throw up errors.
-
-Nothing will happen (and nothing will be returned either) if either future
-parent is below base level 70 and/or if any of the three characters is not found
-online.
-
----------------------------------------
-
-*getchildid()
-*getmotherid()
-*getfatherid()
-
-These functions return the characters (shild/mother/father) ID
-
- if (getmotherid()) mes "Oh... I know your mother's ID:"+getmotherid();
-
----------------------------------------
-
-*getitemname(<item id>)
-
-Given the database ID number of an item, this function will return the text
-stored in the 'japanese name' field (which, in eAthena, stores an english name
-the players would normally see on screen.)
-
----------------------------------------
-
-*makepet <pet id>;
-
-This command will create a pet egg and put it in the invoking character's
-inventory. The kind of pet is specified by pet ID numbers listed in
-'db/pet_db.txt'. The egg is created exactly as if the character just successfuly
-caught a pet in the normal way.
-
- // This will make you a poring:
- makepet 1002;
-
-Notice that you absolutely have to create pet eggs with this command. If you try
-to give a pet egg with 'getitem', pet data will not be created by the char
-server and the egg will disappear when anyone tries to hatch it.
-
----------------------------------------
-
-*getexp <base xp>,<job xp>;
-
-This command will give the invoking character a specified number of base and job
-experience points. Can be used as a quest reward. Negative amounts of experience
-were not tested but should work.
-
- getexp 10000,5000;
-
-You can also use the "set" command with the constants defined in 'db/const.txt':
-
- // These 2 combined has the same effect as the above command
- set BaseExp,BaseExp+10000;
- set JobExp,JobExp+5000;
-
-You can also reduce the ammount of experience points:
-
- set BaseExp,BaseExp-10000;
-
----------------------------------------
-
-*getinventorylist;
-
-This command sets a bunch of arrays with a complete list of whatever the
-invoking character has in their inventory, including all the data needed to
-recreate these items perfectly if they are destroyed. Here's what you get:
-
-@inventorylist_id[] - array of item ids.
-@inventorylist_amount[] - their corresponding item amounts.
-@inventorylist_equip[] - whether the item is equipped or not.
-@inventorylist_refine[] - for how much it is refined.
-@inventorylist_identify[] - whether it's refined.
-@inventorylist_attribute[] - whether it is broken.
-@inventorylist_card1[] - These four arrays contain card data for the items.
-@inventorylist_card2[] These data slots are also used to store names
-@inventorylist_card3[] inscribed on the items, so you can explicitly check
-@inventorylist_card4[] if the character owns an item made by a specific
- craftsman.
-@inventorylist_count - the number of items in these lists.
-
-This could be handy to save/restore a character's inventory, since no other
-command returns such a complete set of data, and could also be the only way to
-correctly handle an NPC trader for carded and named items who could resell them
-- since NPC objects cannot own items, so they have to store item data in
-variables and recreate the items.
-
-Notice that the variables this command generates are all local and numeric.
-
----------------------------------------
-
-*getskilllist;
-
-This command sets a bunch of arrays with a complete list of skills the
-invoking character has. Here's what you get:
-
-@skilllist_id[] - skill ids.
-@skilllist_lv[] - skill levels.
-@skilllist_flag[] - see 'skill' for the meaning of skill flags.
-@skilllist_count - number of skills in the above arrays.
-
-While 'getskillv' is probably more useful for most situations, this is the
-easiest way to store all the skills and make the character something else for a
-while. Advanced job for a day? :) This could also be useful to see how many
-skills a character has.
-
----------------------------------------
-
-*clearitem;
-
-This command will destroy all items the invoking character has in their
-inventory. (that includes equipped items) It will not affect anything else, like
-storage or cart.
-
----------------------------------------
-
-*classchange <view id>,<type>;
-
-This command is very ancient, it's origins are clouded in mystery.
-It will send a 'display id change' packet to everyone in the immediate area of
-the NPC object, which will supposedly make the NPC look like a different sprite,
-an NPC sprite ID, or a monster ID. This effect is not stored anywhere and will
-not persist (Which is odd, cause it would be relatively easy to make it do so)
-and most importantly, will not work at all since this command was broken with
-the introduction of advanced classes. The code is written with the assumption
-that the lowest sprite IDs are the job sprites and the anything beyond them is
-monster and NPC sprites, but since the advanced classes rolled in, they got the
-ID numbers on the other end of the number pool where monster sprites float.
-
-As a result it is currently impossible to call this command with a valid view
-id. It will do nothing whatsoever if the view ID is below 4047. Getting it to
-run will actually just crash the client.
-
-It could be a real gem if it can be gotten to actually do what it's supposed to
-do, but this will only happen in a later SVN revision.
-
----------------------------------------
-
-*misceffect <effect number>;
-
-This command, if run from an NPC object that has a sprite, will call up a
-specified effect number, centered on the NPC sprite. If the running code does
-not have an object ID (a 'floating' npc) or is not running from an NPC object at
-all (an item script) the effect will be centered on the character who's RID got
-attached to the script, if any. For usable item scripts, this command will
-create an effect centered on the player using the item.
-
-A full list of known effects is found in 'doc/effect_list.txt'. The list of
-those that actually work may differ greatly between client versions.
-
----------------------------------------
-
-*soundeffect "<effect filename>",<number>
-*soundeffectall "<effect filename>",<number>
-
-These two commands will play a sound effect to either the invoking character
-only 'soundeffect' or everyone around ('soundeffectall'). If the running code
-does not have an object ID (a 'floating' npc) or is not running from an NPC
-object at all (an item script) the sound will be centered on the character who's
-RID got attached to the script, if any. If it does, it will be centered on that
-object. (an NPC sprite)
-
-Effect filename is the filename of the wav in GRF. It must have an extension.
-
-It's not quite certain what the number actually does, it is sent to the client
-directly, probably it determines which directory of the GRF the effect is played
-from - the sound effect type. It's certain that giving 0 for the number will
-play sound files from 'data/wav', but where the other numbers will read from is
-unclear.
-
-You can add your own effects this way, naturally.
-
----------------------------------------
-
-*mapwarp "<from map>","<to map>",<x>,<y>;
-
-This command will collect all characters located on the From map and warp them
-wholesale to the same point on the To map, or randomly distribute them there if
-the coordinates are zero. "Random" is understood as a special To map name and
-will mean randomly shuffling everyone on the same map.
-
----------------------------------------
-
-*mobcount("<map name>","<event label>")
-
-This function will count all the monsters on the specified map that have a given
-event label and return the number or 0 if it can't find any. Naturally, only
-monsters spawned with 'monster' and 'areamonster' script commands can be like
-this.
-
-However, apparently, if you pass this function an empty string for the event
-label, it should return the total count of normal permanently respawning
-monsters instead. With the current dynamic mobs system, where mobs are not kept
-in memory for maps with no actual people playing on them, this will return a 0
-for any such map.
-
----------------------------------------
-
-*strmobinfo(<type>,<monster id>);
-
-This function will return information about a monster record in the database, as
-per 'db/mob_db.txt'. Type is the kind of information returned. Valid types are:
-
- 1 - 'english name' field in the database, a string.
- 2 - 'japanese name' field in the database, a string.
- All other returned values are numbers:
- 3 - Level.
- 4 - Maximum HP.
- 5 - Maximum SP.
- 6 - Experience reward.
- 7 - Job experience reward.
-
----------------------------------------
-
-*guardian "<map name>",<x>,<y>,"<name to show>",<mob id>,<amount>{,"<event label>"};
-
-This command is roughly equivalent to 'monster', but is meant to be used with
-castle guardian monsters and will only work with them. It will set the guardian
-characteristics up according to the castle's investment values and otherwise
-set the things up that only castle guardians need.
-
----------------------------------------
-
-*guardianinfo(<guardian number>)
-
-This function will return the current hit point value for the specified guardian
-number, if such guardian is currently installed. This function will only work if
-the invoking character is on a castle map, and will refer only to the guardians
-of that castle, regardless of anything else, i.e. whether the character is a
-member of the guild owning the castle, etc, etc.
-If no guardian is installed in this slot, the function will return -1.
-
----------------------------------------
-
-* The Pet AI commands
-
-These commands will only work if the invoking character has a pet, and are meant
-to be executed from pet scripts. They will modify the pet AI decision-making for
-the current pet of the invoking character, and will NOT have any independent
-effect by themselves, which is why only one of them each may be in effect at any
-time for a specific pet. A pet may have 'petloot', 'petskillbonus',
-'petskillattack' OR 'petpetskillattack2' and 'petskillsupport' OR 'petheal' at
-the same time. 'petheal' is deprecated and is no longer used in the default pet
-scripts.
-
-*petskillbonus <bonus type>,<value>,<duration>,<delay>;
-
-This command will make the pet give a bonus to the owner's stat (bonus type -
-bInt,bVit,bDex,bAgi,bLuk,bStr,bSpeedRate - for a full list, see the values
-starting with 'b' in 'db/const.txt')
-
-*petrecovery <status type>,<delay>;
-
-This command will make the pet cure a specified status condition. The curing
-actions will occur once every Delay seconds. For a full list of status
-conditions that can be cured, see the list of 'SC_' status condition constants
-in 'db/const.txt'
-
-*petloot <max items>;
-
-This command will turn on pet looting, with a maximum number of items to loot
-specified. Pet will store items and return them when the maximum is reached or
-when pet performance is activated.
-
-*petskillsupport <skill id>,<skill level>,<delay>,<percent hp>,<percent sp>;
-*petheal <level>,<delay>,<percent hp>,<percent sp>;
-
-This will make the pet use a specified support skill on the owner whenever the
-HP and SP are below the given percent values, with a specified delay time
-between activations. The skill numbers are as per 'db/skill_db.txt'.
-'petheal' works the same as 'petskillsupport' but has the skill ID hardcoded to
-28 (Heal). This command is deprecated.
-It's not quite certain who's stats will be used for the skills cast, the
-character's or the pets. Probably, Skotlex can answer that question.
-
-*petskillattack <skill id>,<skill level>,<rate>,<bonusrate>;
-*petskillattack2 <skill id>,<damage>,<number of attacks>,<rate>,<bonusrate>;
-
-These two commands will make the pet cast an attack skill on the enemy the pet's
-owner is currently fighting. Skill IDs and levels are as per 'petskillsupport'.
-'petskillattack2' will make the pet cast the skill with a fixed amount of damage
-inflicted and the specified number of attacks.
-
-All commands with delays and durations will only make the behavior active for
-the specified duration of seconds, with a delay of the specified number of
-seconds between activations. Rates are a chance of the effect occuring and are
-given in percent. 'bonusrate' is added to the normal rate if the pet intimacy is
-at the maximum possible.
-
-The behavior modified with the abovementioned commands will only be exibited if
-the pet is loyal and appropriate configuration options are set in
-'battle_athena.conf'.
-
-Pet scripts in the database normally run whenever a pet of that type hatches
-from the egg. Other commands usable in item scripts (see 'bonus') will also
-happily run from pet scripts. Apparently, the pet-specific commands will also
-work in NPC scripts and modify the behavior of the current pet up until the pet
-is hatched again. (Which will also occur when the character is logged in again
-with the pet still out of the egg.) It is not certain for how long the effect of
-such command running from an NPC script will eventually persist, but apparently,
-it is possible to usefully employ them in usable item scripts to create pet
-buffing items.
-
-Nobody tried this before, so you're essentially on your own here.
-
---------------------------------------
-
-*skilleffect <skill id>,<number>;
-
-This command will display the visual and sound effects of a specified skill (see
-'db/skill_db.txt' for a full list of skills) on the invoking character's sprite.
-Nothing but the special effects and animation will happen. If the skill's normal
-effect displays a floating number, the number given will float up.
-
- // This will heal the character with 2000 hp, buff with
- // Bless 10 and Increase AGI 5, and display appropriate
- // effects.
- mes "Blessed be!";
- skilleffect 28,2000;
- heal 2000,0;
- skilleffect 34,0;
- // That's bless 10.
- sc_start 10,240000,10;
- skilleffect 29,0;
- // That's agi 5
- sc_start 12,140000,5;
-
----------------------------------------
-
-*npcskilleffect <skill id>,<number>,<x>,<y>;
-
-This command behaves identically to 'skilleffect', however, the effect will not
-be centered on the invoking character's sprite, nor on the NPC sprite, if any,
-but will be centered at map coordinates given on the same map as the invoking
-character.
-
----------------------------------------
-
-*specialeffect <effect number>;
-
-This command will display special effect with the given number, centered on the
-specified NPCs coordinates, if any. For a full list of special effect numbers
-known see 'doc/effect_list.txt'. Some effect numbers are known not to work in
-some client releases. (Notably, rain is absent from any client executables
-released after April 2005.)
-
----------------------------------------
-
-*specialeffect2 <effect number>;
-
-This command behaves identically to the 'specialeffect', but the effect will be
-centered on the invoking character's sprite.
-
----------------------------------------
-
-*nude;
-
-This command will unequip anything equipped on the invoking character.
-
-It is not required to do this when changing jobs since 'jobchange' will unequip
-everything not equippable by the new job class anyway.
-
----------------------------------------
-
-*atcommand "<command line>";
-
-This command will run the given command line exactly as if it was typed in from
-the keyboard by the player connected to the invoking character, and that
-character belonged to an account which had GM level 99.
-
- // This will ask the invoker for a character name and then use the '@nuke'
- // GM command on them, killing them mercilessly.
- input @player$;
- gmcommand "@nuke "+@player$
-
-This command has a lot of good uses, I am sure you can have some fun with this
-one.
-
----------------------------------------
-
-*message "<character name>","<message>";
-
-That command will send a message to the chat window of the character specified
-by name. The text will also appear above the head of that character. It will not
-be seen by anyone else.
-
----------------------------------------
-
-*npctalk "<message>";
-
-This command will display a message to the surrounding area as if the NPC object
-running it was a player talking - that is, above their head and in the chat
-window. The display name of the NPC will get appended in front of the message to
-complete the effect.
-
- // This will make everyone in the area see the NPC greet the character
- // who just invoked it.
- npctalk "Hello "+strcharinfo(0)+" how are you";
-
----------------------------------------
-
-*hasitems(0)
-
-This function will return 1 if the invoking character has anything at all in
-their inventory and 0 if they do not. Even though the argument is not used for
-anything, it is required.
-
----------------------------------------
-
-*getlook(<type>)
-
-This function will return the number for the currentcharacter look value
-specified by type. See 'setlook' for valid look types.
-
-This can be used to make a certain script behave differently for characters
-dressed in black. :)
-
----------------------------------------
-
-*getsavepoint(<information type>)
-
-This function will return information about the invoking character's save point.
-You can use it to let a character swap between several recorded savepoints.
-Available information types are:
-
- 0 - Map name (a string)
- 1 - X coordinate
- 2 - Y coordinate
-
----------------------------------------
-
-*npcspeed <speed value>;
-*npcwalkto <x>,<y>;
-*npcstop;
-
-These commands will make the NPC object in question move around the map. As they
-currently are, they are a bit buggy and are not useful for much more than making
-an NPC move randomly around the map. (see 'npc/custom/devnpc.txt' for an example
-of such usage)
-
-'npcspeed' will set the NPCs walking speed to a specified value. As in the
-@speed GM command, 200 is the slowest possible speed while 0 is the fastest
-possible (instant motion). 100 is the default character walking speed.
-'npcwalkto' will start the NPC sprite moving towards the specified coordinates
-on the same map as it is currently on.
-'npcstop' will stop the motion.
-
-While in transit, the NPC will be clickable, but invoking it will cause it to
-stop motion, which will make it's coordinates different from what the client
-computed based on the speed and motion coordinates. The effect is rather
-unnerving.
-
-Only a few NPC sprites have walking animations, and those that do, do not get
-the animation invoked when moving the NPC, due to the problem in the npc walking
-code, which looks a bit silly. You might have better success by defining a job-
-sprite based sprite id in 'db/mob-avail.txt' with this.
-
----------------------------------------
-
-*getmapxy("<variable for map name>",<variable for x>,<variable for y>,<type>{,"<search string>"})
-
-This function will locate a character object, NPC object or pet's coordinates
-and place their coordinates into the variables specified when calling it. It
-will return 0 if the search was successful, and -1 if the parameters given were
-not variables or the search was not successful.
-
-Type is the type of object to search for:
-
- 0 - Character object
- 1 - NPC object
- 2 - Pet object
- 3 - Monster object.
-
-While 3 is meant to look for a monster object, no searching will be done if you
-specify type 3, and the function will always return -1.
-
-The search string is optional. If it is not specified, the location of the
-invoking character will always be returned for types 0 and 2, the location of
-the NPC running this function for type 1.
-If a search string is specified, for types 0 and 1, the character or NPC with
-the specified name will be located. If type is 3, the search will locate the
-current pet of the character who's name is given in the search string, it will
-NOT locate a pet by name.
-
-What a mess. Example, a working and tested one now:
-
- prontera.gat,164,301,3%TAB%script%TAB%Meh%TAB%730,{
- mes "My name is Meh. I'm here so that Nyah can find me.";
- close;
- }
-
- prontera.gat,164,299,3%TAB%script%TAB%Nyah%TAB%730,{
- mes "My name is Nyah.";
- mes "I will now search for Meh all across the world!";
- if (getmapxy(@mapname$,@mapx,@mapy,1,"Meh")!=0) goto Notfound;
- mes "And I found him on map "+@mapname$+" at X:"+@mapx+" Y:"+@mapy+" !";
- close;
- Notfound:
- mes "I can't seem to find Meh anywhere!";
- close;
- }
-
-Notice that NPC objects disabled with 'disablenpc' will still be located.
-
----------------------------------------
-
-*guildgetexp <amount>;
-
-This will give the specified amount of guild experience points to the guild the
-invoking character belongs to. It will silently fail if they do not belong to
-any guild.
-
----------------------------------------
-
-*skilluseid <skill>,<level>;
-*doskill <skill>,<level>;
-*skillusepos <skill>,<level>,<x>,<y>;
-
-These commands will cause the invoking character to use a specified skill at the
-specified level, as if they had that skill, with their current level and stats.
-If the skill involves targeting a character, no targeting pointer will come up -
-the invoking character will automatically be the skill target.
-
-'doskill' is an alias for 'skilluseid'.
-
-'skillusepos' will specify a target map square for the skill to be used. If that
-skill is an area effect skill, it will be centered at the square specified. It
-will not work if the skill is supposed to be targeted on character or monster.
-
----------------------------------------
-
-*logmes "<message>";
-
-This command will write the message given to the map server npc log file, as
-specified in 'conf/log_athena.conf'. In the TXT version of the server, the log
-file is 'log/npclog.log' by default. In the SQL version, if SQL logging is
-enabled, the message will go to the 'npclog' table, otherwise, it will go to the
-same log file.
-
-If logs are not enabled, nothing will happen.
-
----------------------------------------
-
-*summon "<monster name>",<mob id>{,"<event label>"};
-
-This command will summon a monster. (see also 'monster') Unlike monsters spawned
-with other commands, this one will set up the monster to fight to protect the
-invoking character. Monster name and mob id obey the same rules as the one given
-at the beginning of this document for permanent monster spawns with the
-exceptions mentioned when describing 'monster' command.
-
-The effect for the skill 'Call Homonuculus' will be displayed centered on the
-invoking character.
-
-If an event label is given, upon the monster being killed, the event label will
-run as if by 'donpcevent'.
-
- // Will summon a dead branch-style monster to fight for the character.
- summon "--ja--",-1;
-
----------------------------------------
-
-*isnight()
-*isday()
-
-These functions will return 1 or 0 depending on whether the server is in night
-mode or day mode. 'isnight' returns 1 if it's night and 0 if it isn't, 'isday'
-the other way around. They can be used interchangeably, pick the one you like
-more:
-
- // These two are equivalent:
- if (isday()) mes "I only prowl in the night.";
- if (isnight()!=1) mes "I only prowl in the night.";
-
----------------------------------------
-
-*isequipped(<id>{,<id>{,<id>{,<id>}}})
-
-This function will return 1 if the invoking character has all of the item
-IDs given equipped (if card IDs are passed, then it checks if the cards are
-inserted into slots in the equipment they are currently wearing). Theorically
-there is no limit to the number of items that may be tested for at the same time.
-If even one of the items given is not equipped, 0 will be returned.
-
- // (Poring,Santa Poring,Poporing,Marin)
- if (isequipped(4001,4005,4033,4196)) mes "Wow! You're wearing a full complement of possible poring cards!";
- // (Poring)
- if (isequipped(4001)) mes "A poring card is useful, don't you think?";
-
-The function was meant for item scripts to support the cards released by Gravity
-in February 2005, but it will work just fine in normal NPC scripts.
-
----------------------------------------
-
-*isequippedcnt(<card id>{,<card id>{,<card id>{,<card id>}}})
-
-This function is similar to 'isequipped', but instead of 1 or 0, it will return
-the number of cards in the list given that were found on the invoking character.
-
- if (isequippedcnt(4001,4005,4033,4196)=4) mes "Finally got all four poring cards?";
-
----------------------------------------
-
-*cardscnt()
-
-This function will return the number of cards inserted into the weapon currently
-equipped on the invoking character.
-While this function was meant for item scripts, it will work outside them:
-
- if (cardscnt()==4) mes "So you've stuck four cards into that weapon, think you're cool now?";
-
----------------------------------------
-
-*getrefine()
-
-This function will return the number of plusses the weapon currently equipped on
-the invoking character has been refined for.
-While this function was meant for item scripts, it will work outside them:
-
- if (getrefine()==10) mes "Wow. That's a murder weapon.";
-
----------------------------------------
-
-*day;
-*night;
-
-These two commands will switch the entire server between day and night mode.
-Depending on the configuration, it may cause differing client effects. If your
-server is set to cycle between day and night, it will eventually return to that
-cycle.
-
-This example will set the night time to start at 03 AM and end at 08 AM, and the
-nighttime will persist if the server restarts during the night, if the automated
-day/night switching is turned off in the configuration files. Figure it out on
-your own:
-
--%TAB%script%TAB%DayNight%TAB%-1,{
-
- end;
-
-OnClock0300:
-
-OnClock0800:
-
-OnInit:
-
- set $@minutesfrommidnight, gettime(3)*60+gettime(2);
-
- set $@night_start, 180; // 03:00
- set $@night_end, 480; // 08:00
-
- if ($@minutesfrommidnight>=$@night_start && $@minutesfrommidnight<$@night_end) goto StartNight;
-
- goto StartDay;
- StartNight:
- night;
- end;
- StartDay:
- day;
- end; }
-
----------------------------------------
-
-*getusersname;
-
-This command will give the invoking character a list of names of the connected
-characters (including themselves) into an NPC script message window (see 'mes')
-paging it by 10 names as if with the 'next' command.
-
-You need to put a 'close' after that yourself.
-
----------------------------------------
-
-*dispbottom "<message>";
-
-This command will send the given message into the invoking character's chat
-window.
-
----------------------------------------
-
-*recovery;
-
-This command will revive and restore full HP and SP to all characters currently
-connected to the server.
-
----------------------------------------
-
-*getpetinfo(<type>)
-
-This function will return pet information for the pet the invoking character
-currently has active. Valid types are:
-
- 0 - Unique pet ID number as stored by the char server and distinguishing it
- from all other pets the characters actually have. This value is currently
- useless, at most you can use it to tell pets apart reliably.
- 1 - Pet ID number as per 'db/pet_db.txt' - will tell you what kind of a pet it
- is.
- 2 - Pet name. Will return "null" if there's no pet.
- 3 - Pet friendly level (intimacy score). 1000 is full loyalty.
- 4 - Pet hungry level. 100 is completely full.
-
----------------------------------------
-
-*checkequipedcard(<card id>)
-
-This function will return 1 if the card specified by it's item ID number is
-inserted into any equipment they have in their inventory, currently equipped or
-not.
-
----------------------------------------
-
-*globalmes "message";
-
-This command will send a message to the chat window of all currently connected
-characters.
-
----------------------------------------
-
-*jump_zero (<condition>),<label>;
-
-This command works kinda like an 'if'+'goto' combination in one go. (See 'if').
-If the condition is false (equal to zero) this command will immediately jump to
-the specified label like in 'goto'.
-
-While 'if' is more generally useful, for some cases this could be an
-optimisation.
-
----------------------------------------
-
-*select("<option>"{,"<option>"..."<option>"})
-
-This function is a handy replacement for 'menu' for some specific cases where
-you don't want a complex label structure - like, for example, asking simple yes-
-no questions. It will return the number of menu option picked, starting with 1.
-Like 'menu', it will also set the variable @menu to contain the option the user
-picked.
-
- if (select("Yes","No")==1) mes "You said yes, I know.";
-
-And like 'menu', this command has a problem with empty strings - if some of the
-option strings given to it are empty, you won't be able to tell which one the
-user really picked. The number it returns will only make sense if all the empty
-strings are last in the list of options.
-
----------------------------------------
-
-*getmapmobs("<map name>")
-
-This function will return the total count of monsters currently located on the
-specified map. If the map name is given as "this", the map the invoking
-character is on will be used. If the map is not found, or the invoker is not a
-character while the map is "this", it will return -1.
-
----------------------------------------
-
-*unequip <equipment slot>;
-
-This command will unequip whatever is currently equipped in the invoking
-character's specified equipment slot. For a full list of possible equipment
-slots see 'getequipid'.
-
-If an item occupies several equipment slots, it will get unequipped from all of
-them. (Which is a good thing.)
-
----------------------------------------
-
-*defpattern <set number>,"<regular expression pattern>","<event label>";
-*activatepset <set number>;
-*deactivatepset <set number>;
-*deletepset <set number>;
-
-This set of commands is only available if the server is compiled with regular
-expressions library enabled. Default compilation and most binary distributions
-aren't, which is probably bad, since these, while complex to use, are quite
-fascinating.
-
-They will make the NPC object listen for text spoken publicly by players and
-match it against regular expression patterns, then trigger labels associated
-with these regular expression patterns.
-
-Patterns are organised into sets, which are referred to by a set number. You can
-have multiple sets patterns, and multiple patterns may be active at once.
-Numbers for pattern sets start at 1.
-
-'defpattern' will associate a given regular expression pattern with an event
-label. This event will be triggered whenever something a player says is matched
-by this regular expression pattern, if the pattern is currently active.
-
-'activatepset' will make the pattern set specified active. An active pattern
-will enable triggering labels defined with 'defpattern', which will not happen
-by default.
-'deactivatepset' will deactivate a specified pattern set. Giving -1 as a pattern
-set number in this case will deactivate all pattern sets defined.
-
-'deletepset' will delete a pattern set from memory, so you can create a new
-pattern set in it's place.
-
-Using regular expressions is high wizardry. But with this high wizardry comes
-unparallelled power of text manipulation. For an explanation of what a regular
-expression pattern is, see a few web pages:
-
-http://www.regular-expressions.info/
-http://www.weitz.de/regex-coach/
-
-For an example of this in use, see 'npc\custom\eliza.txt'.
-
-With this you could, for example, automagically punish players for asking for
-zeny in public places, or alternatively, automagically give them zeny instead if
-they want it so much.
-
----------------------------------------
-
-*getstrlen("<string>")
-
-This function will return the length of the string given as an argument. It is
-useful to check if anything input by the player exceeds name length limits and
-other length limits and asking them to try to input something else.
-
----------------------------------------
-
-*charisalpha("<string>",<position>)
-
-This function will return 1 if the character number Position in the given string
-is a letter, 0 if it isn't a letter but a digit or a space.
-
----------------------------------------
-
-*getnameditem(<item id>,"<name to inscribe>");
-*getnameditem("<item name>","<name to inscribe>");
-
-This function is equivalent to using 'getitem', however, it will not just give
-the character an item object, but will also inscribe it with a specified
-character's name. You may not inscribe items with arbitrary strings, only with
-names of characters that actually exist. While this isn't said anywhere
-specifically, apparently, named items may not have cards in them, slots or no -
-these data slots are taken by the character ID who's name is inscribed. Only one
-remains free and it's not quite clear if a card may be there.
-
-Items that may not be equipped may NOT be inscribed with a name with this
-function. Which is why this is a function which will return a value - 1 if an
-item was successfully created and 0 if it wasn't for whatever reason. Like
-'getitem' this function will also take an 'english name' from the itemdb
-database as an item name and will return 0 if nothing is found.
-
----------------------------------------
-
-*getitemslots(<item ID>)
-
-This function will look up the item with the specified ID number in the database
-and return the number of slots this kind of items has - 0 if they are not
-slotted. It will also be 0 for all non-equippable items, naturally, unless
-someone messed up the item database. It will return -1 if there is no such item.
-
----------------------------------------
-
-*getiteminfo(<item ID>,<type>)
-
-This function will look up the item with the specified ID number in the database
-and return the info set by TYPE argument.
-It will return -1 if there is no such item.
-
-Valid types are:
- 0 - Buy Price; 1 - Sell Price; 2 - Item Type;
- 3 - maxchance (Max drop chance of this item e.g. 1 = 0.01% , etc..
- if = 0, then monsters don't drop it at all (rare or a quest item)
- if = 10000, then this item is sold in NPC shops only
- 4 - sex; 5 - equip; 6 - weight; 7 - atk; 8 - def; 9 - range;
- 10 - slot; 11 - look; 12 - elv; 13 - wlv;
-
-Check sample in nps\sample\getiteminfo.txt
-
----------------------------------------
-
-*getmonsterinfo(<item ID>,<type>)
-
-This function will look up the monster with the specified ID number in the database
-and return the info set by TYPE argument.
-It will return -1 if there is no such item. Due to specific of MOB DB routines,
-it's better to check monster name. It'd return "Dummy" for a non-existing monster.
-
-Valid types are listed in const.txt:
- 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 JOB_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
-
-Check sample in nps\sample\getmonsterinfo.txt
-
----------------------------------------
-
-*pow(<number>,<power>)
-
-Returns the result of the calculation.
-
-Example:
-set @i, pow(2,3); // @i will be 8
-
----------------------------------------
-
-*sqrt(<number>)
-
-Returns square-root of number.
-
-Examlpe:
-set @i, sqrt(25); // @i will be 5
-
----------------------------------------
-
-*distance(<x0>,<y0>,<x1>,<y1>)
-
-Returns distance between 2 points.
-
-Example:
-set @i, distance(100,200,101,202);
-
----------------------------------------
-*query_sql "your MySQL query", <array name>, [<array name>]
-Returns up to 127 values into array and return the number of row
-
-Example:
-set @nb, query_sql("select name,fame from `char` ORDER BY fame DESC LIMIT 5", @name$, @fame);
-mes "Hall Of Fame: TOP5";
-mes "1."+@name$[0]+"("+@fame[0]+")"; // Will return a person with the biggest fame value.
-mes "2."+@name$[1]+"("+@fame[1]+")";
-mes "3."+@name$[2]+"("+@fame[2]+")";
-mes "4."+@name$[3]+"("+@fame[3]+")";
-mes "5."+@name$[4]+"("+@fame[4]+")";
-
-Note: In the TXT version it doesn't fill the array and always return -1.
-Note: Use Text$[] array to recieve all data as text.
-
----------------------------------------
-
-*setd "variable name", <value>
-
-Works almost identical as set, just that the variable name is identified as a string,
-thus can be constructed dynamically.
-
-Example:
-set $var$, "Poring";
-
-setd "$var$", "Poporing";
-mes $var$; // Will return Poporing
-
-setd "$" + $var$ + "123$", "Poporing is cool";
-mes $Poporing123$; // Will return Poporing is cool.
-
----------------------------------------
-
-*getd("variable name")
-
-Retrieves variable, name can be constructed dynamically. Refer to setd for usage.
-
-Example:
-set @i, getd("$pikachu");
-
----------------------------------------
-
-*petstat(<flag>)
-
-Returns current pet status, all are integers except name.
-Returns 0 or "" if the player doesn't have pets.
-
-Flags usable >>
-PET_CLASS
-PET_NAME
-PET_LEVEL
-PET_HUNGRY
-PET_INTIMATE
-
-Example:
-set @i, petstat(PET_CLASS);
-
-
----------------------------------------
-
-*setitemscript(<ItemID>,<"{ new item script }">)
-
-Set a new script bonus to the Item. Very useful for game events.
-
-Example:
-
-setitemscript 2637,"{ bonus bDamageWhenUnequip,40; if(isequipped(2236)==0)end; if(getskilllv(26)){skill 40,1;}else{skill 26,1+isequipped(2636);} }";
-
----------------------------------------
-
-*disguise <Monster ID>;
-*undisguise;
-
-This command disgueses current player with a monster sprite.
-The disguise is disappearing on re-login or on 'undisguise' command.
-
-Note: It doesn't work with "Pets with equipment on"
-Note: If u're a Sniper, u'd get an old Falcon over your head
-Note: You can kill yourself with some skills
-Note: Monsters of your type could heal you
-
-Example:
-disquise 1002; //Yay! You're a Poring!!!
-next;
-undisquise; //Yay!!!! You're a human again!!
-
----------------------------------------
-
-*axtoi(<hexadecimal_value>);
-
-This command will convert an hexadecimal value into integers (numbers).
-The inputted value must not have neither # or 0x in it, just 6 numbers and/or letters.
-The variable registering this value, if so, must be a string (letter) variable, due that
-it contains letters in some cases.
-
-This is mostly used for the new announce command, which uses hexadecimal values for announce
-colors, using the Ragnarok coloring system.
-
-Example:
-
-amatsu.gat,171,166,4 script Testing npc 767,{
-
-mes "Input hex color";
-input @trying$;
-next;
-set @try2$,axtoi(@trying$);
-announce "zOMG TEH PWNZ0RDZ",bc_all,@try2$;
-close;
-}
-
-If you want a list of hexadecimal colors, check these two links:
-
-http://webmonkey.wired.com/webmonkey/reference/color_codes/
-
-http://www.december.com/html/spec/color.html
-
----------------------------------------
-
-*rid2name(rid)
-
-Converts rid to name. Note: The player/monster/NPC must be online/enabled.
-Good for PCKillEvent where you can convert 'killedrid' to the name of the player.
-
-Note: rid2name may not produce correct character names since rid = account id.
- It will return the current online character of the account only.
-
----------------------------------------
-
-*function <function name>;
-*<function name>;
-*function <function name> {
-<code>
-}
-
-(Skotlex stop being so selfish and give us all the commands T~T! J/k lol :P)
-
-This works like callfunc, but doesn't support arguments like callfunc. It's used for cleaner
-and fast script that doesn't require arguments for it to work. Also they must be inside a script.
-They're not separated scripts and they work more like labels.
-
-Note it looks like the normal declaration
-
-Usage:
-
-You first Declare the function with function <function name>;.
-
-Put the rest of your code. You can use then <function name>; to call the function. If it returns a value is unsure,
-test it if you want and give us some comments ;3
-
-And at least, but inside the script itself, put the function <function name> {<code>}.
-
-Example:
-
-prontera.gat,154,189,4 script Item seller 767,{
-
-function SF_Selling;
-
-mes "I'll open this now if you have more than 50z and you are level 50 or bigger";
-next;
-
-if (Zeny > 50) && (BaseLevel > 50) {
- mes "Welcome";
- next;
- SF_Selling;
- close;
-} else
-
-set @needed,50-BaseLevel;
-mes "You either are Level "+BaseLevel+", thus you need "+@needed+" more levels";
-mes "to be able to use this npc; or you don't have enough zeny, so get some please";
-close;
-
-function SF_Selling {
-
- mes "Would you like to buy a phracon for 50z?";
- switch(select("Yes","No, thanks")) {
-
- case 1:
- mes "Ok, how many?";
- input @quantity;
- set @check,Zeny/50;
- if (@quantity > @check) {
- mes "Sorry but you can only have "+@check+" Phracons with "+Zeny;
- close;
- } else
- next;
- mes "here you have";
- set Zeny,Zeny-@quantity*50;
- getitem 1010,@quantity;
- close;
- case 2:
- mes "Good bye then";
- close;
- }
- }
- return;
-}
-
-
----------------------------------------
-
-*getequipcardid (<equipment slot>,<card slot>);
-
-Returns value from equipped item slot in the indicated slot:
-
-getequipcardid(num,slot)
-
-where:
- num = eqip position slot
- slot = 0,1,2,3 (Card Slot N)
-
-This func returns CARD ID, 255,254,-255 (for card 0, if the item is produced) it's useful
-when you want to check item cards or if it's signed. Useful for such quests as
-"Sign this refined item with players name" etc;
- Hat[0] +4 -> Player's Hat[0] +4
-
-By Lupus
-
---------------------------------------
-
-*warpparty "mapname.gat",x,y,<party_id>;
-
-Warps a party to specified map and coordinate given the party ID, which you can get with
-getcharid(1). You can also request another party id given a member's name with getcharid(1,<player_name>).
-
-Example:
-mes "[Party Warper]";
-mes "Here you go!";
-close2;
-set @id,getcharid(1);
-warpparty "prontera.gat",150,100,@id;
-close;
-
----------------------------------------
-
-*warpchar "mapname.gat",x,y,<char_id>;
-
-Warps another player to specified map and coordinate given the char id, which you can get with
-getcharid(0,<player_name>). Obviously this is useless if you want to warp the same player that
-is executing this script, unless it's some kind of "chosen" script.
-
-Example:
-
-warpchar "prontera.gat",150,100,20000001;
-
----------------------------------------
-
-*warpguild "mapname.gat",x,y,<guild_id>;
-
-Warps a guild to specified map and coordinate given the guild id, which you can get with
-getcharid(2). You can also request another guild id given the member's name with getcharid(2,<player_name>).
-
-Example:
-
-warpguild "prontera.gat",x,y,Guild_ID;
-
----------------------------------------
-
-Whew.
-What's about all of them.
+//===== Athena Script =====================================
+//= eAthena Script Commands
+//===== By ================================================
+//= Fredzilla
+//===== Helped By =========================================
+//= Terminal Vertex & Z3R0 - Helped define getmapxy
+//= HappyDenn - Gave everything to do with getpartymember
+//= a great help
+//= Maeki Rika - A section on general concepts and lots of
+//= other updates and additions.
+//===== Version ===========================================
+//= 2.8a
+//=========================================================
+//= 1.0 - First release, filled will as much info as I could
+//= remember or figure out, most likely there are errors,
+//= and things I have missed out
+//= 1.1 - Added better discription for "getmapxy"
+//= 1.2b- Added a description for getpartymember
+//= (+few spelling mistakes corrected)
+//= 2.0 - +79kb extra stuff and numerous corrections by
+//= Maeki Rika.
+//= 2.1 - Small but important corrections, more proofreading.
+//= Some important discoveries in item functions, the
+//= secret of making VVS weapons with 'getitem2' and
+//= other news. (Rika again) +10kb :)
+//= 2.2 - added getItemInfo description [Lupus]
+//= 2.3 - added plenty of info for recent (and not so) script commands I added
+// [Skotlex]
+//= 2.4 - Explained the upper parameter of jobchange. [Skotlex]
+//= 2.5 - Added pow, sqrt and distance. [Lance]
+//= 2.6 - Added setd and getd. [Lance]
+//= 2.7 - petstat command. [Lance]
+//= 2.7a - delitem2, countitems2 commands [Lupus]
+//= 2.7b - clone command [Skotlex]
+//= 2.7c - disguise / undisguise, query_sql commands [Lupus]
+
+//= 2.8 - Deleted a copy of the nude command. Added axtoi command (needing a clearer
+//= explanation of atoi.Gave a better explanation of OnLabels and modified
+//= monster explanation due that L_Label isn't working with monster.
+//===== Compatible With ===================================
+//= LOL, can be used by anyone hopefully
+//===== Description =======================================
+//= A reference manual for the eAthena scripting language
+//=========================================================
+
+This document is a reference manual for all the scripting commands and functions
+available in current eAthena SVN. It is not a simple tutorial. When people tell
+you to "Read The F***ing Manual", they mean this.
+
+The information was mostly acquired through looking up how things actually work
+in the source code of the server, which was written by many people over time,
+and lots of them don't speak English and never left any notes - or are otherwise
+not available for comments. As such, anything written in here might not be
+correct, it is only correct to the best of our knowledge, which is limited.
+
+This document is poorly structured and rather messy in general. In fact, further
+cleaning up and reordering this document is probably pointless, due to upcoming
+switch to Lua scripting language, which will rid us of most of the problems
+mentioned herein and make a new manual necessary. But while we have this one, we
+should make the most of it, and it might be helpful in making sure the new Lua
+engine can actually do everything useful that the old engine could.
+
+This is not a place to teach you basic programming. This document will not teach
+you basic programming by itself. It's more of a reference for those who have at
+least a vague idea of what they want to do and want to know what tools they have
+available to do it. We've tried to keep it as simple as feasible, but if you
+don't understand it, getting a clear book on programming in general will help
+better than yelling around the forum for help.
+
+A little learning never caused anyone's head to explode.
+
+Structure
+---------
+
+The commands and functions are listed in no particular order:
+
+*Name of the command and how to call it.
+
+Descriptive text
+
+ Small example if possible. Will usually be incomplete, it's there just to
+ give you an idea of how it works in practice.
+
+To find a specific command, use Ctrl+F, (or whatever keys call up a search
+function in whatever you're reading this with) put an * followed by the command
+name, and it should find the command description for you.
+
+If you find anything omitted, please respond. :)
+
+Syntax
+------
+
+Throughout this document, wherever a command wants an argument, it is given in
+<angle brackets>. This doesn't mean you should type the angle brackets. :) If an
+argument of a command is optional, it is given in {curly brackets}. You've
+doubtlessly seen this convention somewhere, if you didn't, get used to it,
+that's how big boys do it. If a command can optionally take an unspecified
+number of arguments, you'll see a list like this:
+
+command <argument>{,<argument>...<argument>}
+
+This still means they will want to be separated by commas.
+
+Where a command wants a string, it will be given in "quotes", if it's a number,
+it will be given without them. Normally, you can put an expression, like a bunch
+of functions or operators returning a value, in (round brackets) instead of most
+numbers. Round brackets will not always be required, but they're often a good
+idea.
+
+Wherever you refer to a map name, it's always 'mapname.gat' or 'mapname.afm' if
+you are using AFM maps, (if you don't know what they are, you aren't using them)
+and not just 'mapname'. While some commands do know that if you didn't give
+'.gat', it should add it, it's pretty tricky to tell which ones they are.
+
+Script loading structure
+------------------------
+
+Scripts are loaded by the map server as referenced in the 'conf/map_athena.conf'
+configuration file, but in the default configuration, it doesn't load any script
+files itself. Instead, it loads the file 'npc/scripts_main.conf' which itself
+contains references to other files. The actual scripts are loaded from txt
+files, which are linked up like this:
+
+npc: <path to a filename>
+
+Any line like this, invoked, ultimately, by 'map_athena.conf' will load up the
+script contained in this file, which will make the script available. No file
+will get loaded twice, to prevent possible errors.
+
+Another configuration file option of relevance is:
+
+delnpc: <path to a filename>
+
+This will unload a specifiled script filename from memory, which, while
+seemingly useless, may sometimes be required.
+
+Whenever '//' is encountered in a line upon reading, everything beyond this on
+that line is considered to be a comment and is ignored. This works wherever you
+place it.
+
+Upon loading all the files, the server will execute all the top-level commands
+in them. No variables exist yet at this point, no commands can be called other
+than those given in this section. These commands set up the basic server script
+structure - create NPC objects, spawn monster objects, set map flags, etc. No
+code is actually executed at this point except them. The top-level commands the
+scripting are pretty confusing, since they aren't structured like you would
+expect commands, command name first, but rather, normally start with a map name.
+
+What's more confusing about the top-level commands is that most of them use a
+tab symbol to divide their arguments.
+
+To prevent problems and confusion, the tab symbols are written as '%TAB%'
+throughout this document, even though this makes the text a bit less readable.
+Using an invisible symbol to denote arguments is one of the bad things about
+this language, but we're stuck with it for now. :)
+
+Here is a list of valid top-level commands:
+
+** Set a map flag:
+
+<map name>%TAB%mapflag%TAB%<flag>
+
+This will, upon loading, set a specified map flag on a map you like. These are
+normally in files inside 'conf/mapflag' and are loaded first, so by the time the
+server's up, all the maps have the flags they should have. Map flags determine
+the behavior of the map regarding various common problems, for a better
+explanation, see 'setmapflag'.
+
+** Create a permanent monster spawn:
+
+<map name>,<x>,<y>,<xs>,<ys>%TAB%monster%TAB%<monster name>%TAB%<mob id>,<amount>,<delay1>,<delay2>,<event>
+
+Map name is the name of the map the monsters will spawn on. x,y are the
+coordinates where the mob should spawn. If xs and ys are non-zero, they
+specify the diameters of a spawn-rectangle area who's center is x,y.
+Putting zeros instead of these coordinates will spawn the monsters randomly.
+Note this is only the initial spawn zone, as mobs random-walk, they are free
+to move away from their specified spawn region.
+
+Monster name is the name the monsters will have on screen, and has no relation
+whatsoever to their names anywhere else. It's the mob id that counts, which
+identifies monster record in 'mob_db.txt' database of monsters. If the mob name
+is given as "--ja--", the 'japanese name' field from the monster database is
+used, (which, in eAthena, actually contains an english name) if it's "--en--",
+it's the 'english name' from the monster database (which contains an uppercase
+name used to summon the monster with a GM command).
+
+If you add 20000 to the monster ID, the monster will be spawned in a 'big
+version', (monster size class will increase) and if you add 10000, the 'tiny
+version' of the monster will be created. However, this method is deprecated
+and not recommended, as the values to add can change at a later time (20000
+and 10000 actually stand for 2*MAX_MOB_DB and MAX_MOB_DB respectively, which
+is defined on mob.h, and can change in the future as more mobs are created).
+The recommended way to change a mob's size is to use the event-field (see
+below).
+
+Amount is the amount of monsters that will be spawned when this command is
+executed, it is affected by spawn rates in 'battle_athena.conf'.
+
+Delay1 and delay2 are the monster respawn delays - the first one counts the time
+since a monster defined in this spawn was last respawned and the second one
+counts the time since the monster of this spawn was last killed. Whichever turns
+out to be higher will be used. If the resulting number is smaller than a random
+value between 5 and 10 seconds, this value will be used instead. (Which is
+normally the case if both delay values are zero.) The times are given in
+1/1000ths of a second.
+
+You can specify a custom level to use for the mob different from the one of
+the database by adjoining the level after the name with a comma. eg:
+"Poring,50" for a name will spawn a monster with name Poring and level 50.
+
+Event is a script event to be executed when the mob is killed. The event must
+be in the form "NPCName::OnEventName" to execute, and the event name label
+should start with "On". As with all events, if the NPC is an on-touch npc, the
+player who triggers the script must be within 'trigger' range for the event to
+work.
+
+The Event field can be used alternatively to specify other mob properties. Use
+2 to specify that the mob should be small, 4 for big monsters, and 8 for
+special ai mobs (which by default attack other monsters instead of players).
+You can add these, so using 10 will spawn small monsters that attack other
+mobs (if you specify both 2 and 4, the small version takes priority).
+
+** Define a warp point
+
+<from map name>,<fromX>,<fromY>,<facing>%TAB%warp%TAB%<warp name>%TAB%<spanx>,<spany>,<to map name>,<toX>,<toY>
+
+This will define a warp NPC that will warp a player between maps, and while most
+arguments of that are obvious, some deserve special mention.
+
+SpanX and SpanY will make the warp sensitive to a character who didn't step
+directly on it, but walked into a zone which is centered on the warp from
+coordinates and is SpanX in each direction across the X axis and SpanY in each
+direction across the Y axis.
+
+Warp NPC objects also have a name, because you can use it to refer to them later
+with 'enablenpc'/'disablenpc'
+
+Facing of a warp object is irrelevant, it is not used in the code and all
+current scripts have a zero in there.
+
+** Define an NPC object.
+
+<map name>,<x>,<y>,<facing>%TAB%script%TAB%<NPC Name>%TAB%<sprite id>,{<code>}
+<map name>,<x>,<y>,<facing>%TAB%script%TAB%<NPC Name>%TAB%<sprite id>,<triggerX>,<triggerY>,{<code>}
+
+This will place an NPC object on a specified map at the specified location, and
+is a top-level command you will use the most in your custom scripting. The NPCs
+are triggered by clicking on them, and/or by walking in their trigger area, if
+defined, see that below.
+
+Facing is a direction the NPC sprite will face in. Not all NPC sprites have
+different images depending on the direction you look from, so for some facing
+will be meaningless. Facings are counted counterclockwise in increments of 45
+degrees, where 0 means facing towards the top of the map. (So to turn the sprite
+towards the bottom of the map, you use facing 4, and to make it look southeast
+it's facing 5.)
+
+Sprite id is the sprite number used to display this particular NPC. For a full
+list of sprite id numbers see http://kalen.s79.xrea.com/npc/npce.shtml You may
+also use a monster's ID number instead to display a monster sprite for this NPC.
+It is possible to use a job sprite as well, but you must first define it as a
+monster sprite in 'mob_avail.txt', a full description on how to do this is for
+another manual. A '-1' sprite id will make the NPC invisible (and unclickable).
+A '111' sprite id will make an NPC which does not have a sprite, but is still
+clickable, which is useful if you want to make a clickable object of the 3D
+terrain.
+
+TriggerX and triggerY, if given, will define an area, centered on NPC and
+spanning triggerX cells in every direction across X and triggerY in every
+direction across Y. Walking into that area will trigger the NPC. If no
+'OnTouch:' special label is present in the NPC code, the execution will start
+from the beginning of the script, otherwise, it will start from the 'OnTouch:'
+label.
+
+NPC name is kinda special, because it's not only the name of NPC you will see on
+screen. It's formatted this way:
+
+<Screen name>{#<Extra name identifier>}{::<Label name>}
+
+The extra identifier is there that you can make an npc with an invisible name
+(just omit the screen name, but keep the identifier name) and so that you can
+refer to several NPCs which have the same name on screen, which is useful to
+make an NPC that relocates depending on special conditions, for example - you
+define several NPC objects and hide all except one.
+('Hunter#hunter1','Hunter#hunter2'...) The extra name identifiers will let your
+code tell them apart.
+
+Label name is used to duplicate NPC objects (more on that below).
+
+The complete NPC name (Screen name + extra identifier) may not exceed 24
+characters. The label name is counted separately but also limited to 24
+characters.
+
+The code part is the script code that will execute whenever the NPC is
+triggered. It may contain commands and function calls, descriptions of which
+compose most of this document. It has to be in curly brackets, unlike elsewhere
+where we use curly brackets, these do NOT signify an optional parameter.
+
+** Define an NPC duplicate.
+
+<map name>,<x>,<y>,<facing>%TAB%duplicate(<NPC label>)%TAB%<sprite id>
+<map name>,<x>,<y>,<facing>%TAB%duplicate(<NPC label>)%TAB%<sprite id>,<triggerX>,<triggerY>
+
+This will duplicate an NPC referred to by the label. The duplicate runs the same
+code as the NPC it refers to, but may have different location, facing and sprite
+ID. Whether it may actually have it's own size of trigger area is unclear at the
+moment - if you need that, try it and tell us of the results.
+
+** Define a 'floating' NPC object.
+
+-%TAB%script%TAB%-1,{<code>}
+
+This will define an NPC object not triggerable by normal means. This would
+normally mean it's pointless since it can't do anything, but there are
+exceptions, mostly related to running scripts at specified time, which is what
+these floating NPC objects are for. More on that below.
+
+** Define a shop NPC.
+
+<map name>,<x>,<y>,<facing>%TAB%shop%TAB%<NPC Name>%TAB%<sprite id>,<itemid>:<price>{,<itemid>:<price>...}
+
+This will define a shop NPC, which, when triggered (which can only be done by
+clicking) will cause a shop window to come up. No code whatsoever runs in shop
+NPCs and you can't change the prices otherwise than by editing the script
+itself. (No variables even exist at this point of scripting, so don't even
+bother trying to use them.)
+
+The item id is the number of item in the 'item_db.txt' database. If Price is set
+to -1, the 'buy price' given in the item database will be used. Otherwise, the
+price you gave will be used for this item, which is how you create differing
+prices for items in different shops.
+
+** Define a function object
+
+function%TAB%<function name>%TAB%{<code>}
+
+This will define a function object, callable with the 'callfunc' command (see
+below). This object will load on every map server separately, so you can get at
+it from anywhere. It's not possible to call the code in this object by
+anything other than the 'callfunc' script command.
+
+The code part is the script code that will execute whenever the function is
+called with 'callfunc'. It has to be in curly brackets, unlike elsewhere where
+we use curly brackets, these do NOT signify an optional parameter.
+
+** Alter a map cell
+
+<map name>%TAB%setcell%TAB%<type>,<x1>,<y1>,<x2>,<y2>
+
+This is sneaky, and isn't used in any official scripts, but it will let you
+define an area (x1/y1-x2/y2 square) of a map as having cell type 'type', where
+type is a number, which, among other things, defines whether the area is
+walkable or not, whether it has Basilica working in it or not, and some other
+things. This is a solution just itching for a problem and there's a number of
+interesting things you could use it for. Further investigation on what types are
+valid and mean what exactly is pending.
+
+Once an object is defined which has a 'code' field to it's definition, it
+contains script commands which can actually be triggered and executed.
+
+What a RID is and why do you need to know
+-----------------------------------------
+
+Most scripting commands and functions will want to request data about a
+character, store variables referenced to that character, send stuff to the
+client connected to that specific character. Whenever a script is invoked by a
+character, it is passed a so-called RID - this is the character ID number of a
+character that caused the code to execute by clicking on it, walking into it's
+OnTouch zone, or otherwise.
+
+If you are only writing common NPCs, you don't need to bother with it. However,
+if you use functions, if you use timers, if you use clock-based script
+activation, you need to be aware of all cases when a script execution can be
+triggered without a RID attached. This will make a lot of commands and functions
+unusable, since they want data from a specific character, want to send stuff to
+a specific client, want to store variables specific to that character, and they
+would not know what character to work on if there's no RID.
+
+Unless you use 'attachrid' to explicitly attach a character to the script first.
+
+Whenever we say 'invoking character', we mean 'the character who's RID is
+attached to the running script. The script function "playerattached" can be
+used to check which is the currently attached player to the script (it will
+return 0 if the there is no player attached or the attached player no longer
+is logged on to the map-server).
+
+Item and pet scripts
+--------------------
+
+Each item in the item database has two special fields - EquipScript and
+UseScript. The first is script code run every time a character equips the item,
+with the RID of the equipping character. Every time they unequip an item, all
+temporary bonuses given by the script commands are cleared, and all the scripts
+are executed once again to rebuild them. This also happens in several other
+situations (like upon login) but the full list is currently unknown.
+
+UseScript is a piece of script code run whenever the item is used by a character
+by doubleclicking on it.
+
+Not all script commands work properly in the item scripts. Where commands and
+functions are known to be meant specifically for use in item scripts, they are
+described as such.
+
+Every pet in the pet database has a PetScript field, which determines pet
+behavior. It is invoked wherever a pet of the specified type is spawned.
+(hatched from an egg, or loaded from the char server when a character who had
+that pet following them connects) This may occur in some other situations as
+well. Don't expect anything other than commands definitely marked as usable in
+pet scripts to work in there reliably.
+
+Numbers
+-------
+
+Beside the common decimal numbers, which are nothing special whatsoever (though
+do not expect to use fractions, since ALL numbers are integer in this language),
+the script engine also handles hexadecimal numbers, which are otherwise
+identical. Writing a number like '0x<hex digits>' will make it recognised as a
+hexadecimal value. Notice that 0x10 is equal to 16. Also notice that if you try
+to 'mes 0x10' it will print '16'.
+
+This is not used much, but it pays to know about it.
+
+Variables and scope
+-------------------
+
+The meat of every programming language is variables - places where you store
+data.
+
+Variables are divided into global (not attached to any specific RID, and
+independent of whoever triggered the object) and local (attached to a specific
+character object or a specific account object). They are further divided into
+permanent (they come back when the server resets) and temporary (they only
+persist until the server dies). This is what's called variable scope. :)
+
+Unlike in more advanced languages, all temporary variables are essentially
+'global', but not in the sense described above - if one NPC sets a temporary
+variable, even if it is character based, if that character triggers another NPC
+object, the variable will still be there, so you should be careful and set the
+variables you mean to be temporary to something sensible before using them. It
+also pays to keep variable names descriptive and reasonably long.
+
+Variable scope is defined by a prefix before the variable name:
+
+" " - Thats right, nothing before a variable, this a permanent variable
+ attached to the character object.
+"@" - A temporary version of a character-based variable.
+ SVN versions before 2094 revision and RC5 version will also treat 'l' as
+ a temporary variable prefix, so bevare of having variable names starting
+ with 'l', they will also be considered temporary, even if you didn't mean
+ them to be!
+"$" - A global permanent variable.
+ They are stored in "save\mapreg.txt" file and are the only kind of
+ variables stored in a text file in the SQL version.
+"$@" - A global temporary variable.
+ This is important for scripts which are called with no RID attached, that
+ is, not triggered by a specific character object.
+"#" - A permanent account-based variable.
+ They are stored with all the account data in "save\accreg.txt" in TXT
+ versions and in the SQL versions in the 'global_reg_value' table using
+ type 2.
+"##" - A permanent account-based variable stored by the login server.
+ They are stored in "save\account.txt" and in the SQL versions in the
+ 'global_reg_value' table, using type 1. The only difference you will
+ note from normal # variables is when you have multiple char-servers
+ connected to the same login server. The # variables are unique to each
+ char-server, while the ## variables are shared by all these
+ char-servers.
+
+Some variables are special, that is, they are already defined for you by the
+scripting engine. You can see the full list somewhere in 'db/const.txt', which
+is a file you should read, since it also allows you to replace lots of numbered
+arguments for many commands with easier to read text. The special variables most
+commonly used are all permanent character-based variables:
+
+StatusPoint - Amount of status points remaining.
+BaseLevel - Current base level
+SkillPoint - Amount of skill points remaining
+Class - Current job
+Upper - 1 if the character is an advanced job class.
+Zeny - Current amount of zeny
+Sex - Character's gender, 0 if female, 1 if male.
+Weight - The weight the character currently carries.
+MaxWeight - The maximum weight the character can carry.
+JobLevel - Character's job level
+BaseExp - The amount of base experience points the character has.
+ Notice that it's zero (or close) if the character just got a level.
+JobExp - Same for job levels
+NextBaseExp - Amount of experience points needed to reach the next base level.
+NextJobExp - Same for job levels.
+Hp - Current amount of hit points.
+MaxHp - Maximum amount of hit points.
+Sp - Current spell points.
+MaxSp - Maximum amount of spell points.
+BaseJob - This is sneaky, apparently meant for baby class support.
+ This will supposedly equal Job_Acolyte regardless of whether the
+ character is an acolyte or a baby acolyte, for example.
+Karma - The character's karma. Karma system is not fully functional, but
+ this doesn't mean this doesn't work at all. Not tested.
+Manner - The character's manner rating. Becomes negative if the player
+ utters words forbidden through the use of 'manner.txt' client-side
+ file.
+
+While these behave as variables, do not always expect to just set them - it is
+not certain whether this will work for all of them. Whenever there is a command
+or a function to set something, it's usually preferable to use that instead. The
+notable exception is Zeny, which you can and often will address directly -
+setting it will make the character own this number of zeny.
+
+All of the above variables store numbers. They can store positive and negative
+numbers, but only whole numbers (so don't expect to do any fractional math). You
+can also store a string in a variable, but this means naming it specially to
+denote it contains text rather than a number:
+
+@variable$ is a temporary string variable.
+$@variable$ is a global temporary string variable.
+
+Etc, etc.
+
+If a variable was never set, it is considered to equal zero (for number
+variables) or an empty string ("", nothing between the quotes) for string
+variables. Once you set it to that, the variable is as good as forgotten
+forever, and no trace remains of it even if it was stored with character or
+account data.
+
+Arrays
+------
+
+Arrays (in eAthena at least) are essentially a set of variables going under the
+same name. You can tell between the specific variables of an array with an
+'array index', a number of a variable in that array:
+
+<variable name>[<array index>]
+
+Variables stored in this way, inside an array, are also called 'array elements'.
+Arrays are specifically useful for storing a set of similar data (like several
+item IDs for example) and then looping through it. You can address any array
+variable as if it was a normal variable:
+
+ set @arrayofnumbers[0],1;
+
+You can also do sneaky things like using a variable (or an expression, or even a
+value from an another array) to get at an array value:
+
+ set @x,100;
+ set @arrayofnumbers[@x],10;
+
+This will make @arrayofnumbers[100] equal to 10.
+
+Notice that index numbering always starts with 0. Arrays cannot hold more than
+128 variables. (So the last one can't have a number higher than 127)
+
+And array indices probably can't be negative. Nobody tested what happens when
+you try to get a negatively numbered variable from an array, but it's not going
+to be pretty. :)
+
+Arrays can naturaly store strings:
+
+@menulines$[0] is the 0th element of the @menulines$ array of strings. Notice
+the '$', normally denoting a string variable, before the square brackets that
+denotes an array index.
+
+Operators
+---------
+
+Operators are things you can do to variables and numbers. They are either the
+common mathematical operations or conditional operators
+
++ - will add two numbers. If you try to add two strings, the result will be a
+ string glued together at the +. You can add a number to a string, and the
+ result will be a string. No other math operators work with strings.
+- - will subtract two numbers.
+* - will multiply two numbers.
+/ - will divide two numbers. Note that this is an integer division, i.e.
+ 7/2 is not equal 3.5, it's equal 3.
+% - will give you the remainder of the division. 7%2 is equal to 1.
+
+There are also conditional operators. This has to do with the conditional
+command 'if' and they are meant to return either 1 if the condition is satisfied
+and 0 if it isn't. (That's what they call 'boolean' variables. 0 means 'False'.
+Anything except the zero is 'True' Odd as it is, -1 and -5 and anything below
+zero will also be True.)
+
+You can compare numbers to each other and you compare strings to each other, but
+you can not compare numbers to strings.
+
+ == - Is true if both sides are equal. For strings, it means they are the same.
+ >= - True if the first value is equal to, or greater than, the second value.
+ <= - True if the first value is equal to, or less than, the second value
+ > - True if the first value greater than the second value
+ < - True if the first value is less than the second value
+ != - True if the first value IS NOT equal to the second one
+
+Examples:
+
+ 1=1 is True.
+ 1<2 is True while 1>2 is False.
+ @x>2 is True if @x is equal to 3. But it isn't true if @x is 2.
+
+Only '==' and '!=' have been tested for comparing strings. Since there's no way
+to code a seriously complex data structure in this language, trying to sort
+strings by alphabet would be pointless anyway.
+
+Comparisons can be stacked in the same condition:
+
+ && - Is True if and only if BOTH sides are true.
+ ('1==1 && 2=2' is true. '2=1 && 1=1' is false.)
+ || - Is True if either side of this expression is True.
+
+ 1=1 && 2=2 is True.
+ 1=1 && 2=1 is False.
+ 1=1 || 2=1 is True.
+
+Logical operators work only on numbers:
+
+ << - Left shift.
+ >> - Right shift.
+ & - And.
+ | - Or.
+ ^ - Xor.
+
+If you don't know what these five mean, don't bother, you don't need them.
+
+Labels
+------
+
+Within executable script code, some lines can be labels:
+
+<label name>:
+
+Labels are points of reference in your script, which can be used to route
+execution with 'goto', 'menu' and 'jump_zero' commands, invoked with 'doevent'
+and 'donpcevent' commands and are otherwise essential. A label's name may not be
+longer than 22 characters. (23rd is the ':'.) There is some confusion in the
+source about whether it's 22, 23 or 24 all over the place, so keeping labels
+under 22 characters could be wise. In addition to labels you name yourself,
+there are also some special labels which the script engine will start execution
+from if a special event happens:
+
+OnClock<hour><minute>:
+OnHour<hour>:
+On<weekday><hour><minute>:
+OnDay<month><day>:
+
+This will execute when the server clock hits the specified date or time. Hours
+and minutes are given in military time. ('0105' will mean 01:05 AM). Weekdays
+are Sun,Mon,Tue,Wed,Thu,Fri,Sat. Months are 01 to 12, days are 01 to 31.
+Remember the zero. :)
+
+OnInit:
+OnInterIfInit:
+OnInterIfInitOnce:
+
+OnInit will execute every time the scripts loading is complete, including when
+they are reloaded with @reloadscript command. OnInterIfInit will execute when
+the map server connects to a char server, OnInterIfInitOnce will only execute
+once and will not execute if the map server reconnects to the char server later.
+
+OnAgitStart:
+OnAgitEnd:
+OnAgitInit:
+
+OnAgitStart will run whenever the server shifts into WoE mode, whether it is
+done with @agitstart GM command or with 'AgitStart' script command. OnAgitEnd
+will do likewise for the end of WoE. OnAgitInit will run when castle data is
+loaded from the char-server by the map server.
+
+No RID will be attached while any of the abovementioned labels are triggered, so
+no character or account-based variables will be accessible, until you attach a
+RID with 'attachrid' (see below).
+
+OnTouch:
+
+This label will be executed if a trigger area is defined for the NPC object it's
+in. If it isn't present, the execution will start from the beginning of the NPC
+code. The RID of the triggering character object will be attached.
+
+OnPCDieEvent:
+OnPCKillEvent:
+OnPCLogoutEvent:
+OnPCLoginEvent:
+
+These four special labels will be invoked if you have set 'event_script_type'
+value in your 'script_athena.conf' to 1, and you can change their names by
+altering the configuration options in 'script_athena.conf'. It's pretty obvious
+when those will get triggered. For more information, see
+'npc/sample/PCLoginEvent.txt'
+
+Only the special labels which are not associated with any script command are
+listed here. There are other kinds of labels which may be triggered in a similar
+manner, but they are described with their associated commands.
+
+On<label name>:
+
+These special labels are used with Mob scripts mostly, and script commands
+that requires you to point/link a command to a mob or another npc, giving a label
+name to start from. The label name can be any of your liking, but must be
+
+Example:
+
+monster "prontera.gat",123,42,"Poringz0rd",2341,23,"Master::OnThisMobDeath";
+
+amatsu.gat,13,152,4 script Master 767,{
+
+mes "Hi there";
+close;
+
+OnThisMobDeath:
+ announce "Hey, "+strcharinfo(0)+" just killed a Poringz0rd!",bc_blue|bc_all;
+ end;
+}
+
+Each time you kill one, that announce will appear in blue to everyone.
+
+Scripting commands and functions
+--------------------------------
+
+The commands and functions are listed here in no particular order. There's a
+difference between commands and functions - commands leave no 'return value'
+which might be used in a conditional statement, as a command argument, or stored
+in a variable. Calling commands as if they were functions will sometimes work,
+but is not advised, as this can lead to some hard to track errors. Calling
+functions as if they were commands will mess up the stack, so 'return' command
+will not return correctly after this happens in a particular script.
+
+All commands must end with a ';'. Actually, you may expect to have multiple
+commands on one line if you properly terminate them with a ';', but it's better
+if you don't, since it is not certain just whether the scripting engine will
+behave nicely if you do.
+
+-------------------------
+
+*playerattached;
+
+Returns the ID of the player currently attached to the script. It will return
+0 if noone is attached, or if the attached player no longer exists on the map
+server. It is wise to check for the attached player in script functions that
+deal with timers as there's no guarantee the player will still be logged on
+when the timer triggers. Note that the ID of a player is actually their
+account ID.
+
+-------------------------
+
+*mes "<string>";
+
+This command will displays a box on the screen for the invoking character, if no
+such box is displayed already, and will print the string specified into that
+box. There is normally no 'close' or 'next' button on this box, unless you
+create one with 'close' or 'next', and while it's open the player can't do much
+else, so it's important to create a button later. If the string is empty, it
+will show up as an empty line.
+
+ mes "Text that will appear in the box";
+
+Inside the string you may put color codes, which will alter the color of the
+text printed after them. The color codes are all '^<R><G><B>' and contain three
+hexadecimal numbers representing colors as if they were HTML colors - ^FF0000 is
+bright red, ^00FF00 is bright green, ^0000FF is bright blue, ^000000 is black.
+^FF00FF is a pure magenta, but it's also a color that is considered transparent
+whenever the client is drawing windows on screen, so printing text in that color
+will have kind of a weird effect. Once you've set a text's color to something,
+you have to set it back to black unless you want all the rest of the text be in
+that color:
+
+ mes "This is ^FF0000 red ^000000 and this is ^00FF00 green, ^000000 so.";
+
+Notice that the text coloring is handled purely by the client. If you use non-
+english characters, the color codes might get screwed if they stick to letters
+with no intervening space. Separating them with spaces from the letters on
+either side solves the problem.
+
+---------------------------------------
+
+*goto <label>;
+
+This command will make the script jump to a label, usually used in conjunction
+with other command, such as "if", but often used on it's own.
+
+ goto Label;
+ mes "This will not be seen";
+ Label:
+ mes "This will be seen";
+
+---------------------------------------
+
+*callfunc "<function>"{,<argument>,...<argument>};
+*callfunc("<function>"{,<argument>,...<argument>})
+
+This command lets you call up a function NPC. A function NPC can be called from
+any script on any map server. Using the 'return' command it will come back to
+the place that called it.
+
+ place.gat,50,50,6%TAB%script%TAB%Woman%TAB%115,{
+ mes "[Woman]"
+ mes "Lets see if you win";
+ callfunc "funcNPC";
+ mes "Well done you have won";
+ close;
+ }
+ function%TAB%script%TAB%funcNPC%TAB%{
+ set @win, rand(2);
+ if(@win==0) return;
+ mes "Sorry you lost";
+ end;
+ }
+
+You can pass arguments to your function - values telling it what exactly to do -
+which will be available there with getarg() (see 'getarg')
+Notice that returning is not mandatory, you can end execution right there.
+
+If you want to return a real value from inside your function NPC, it is better
+to write it in the function form, which will also work and will make the script
+generally cleaner:
+
+ place.gat,50,50,6%TAB%script%TAB%Man%TAB%115,{
+ mes "[Man]"
+ mes "Gimme a number!";
+ next;
+ input @number;
+ if (callfunc("OddFunc",@number)) mes "It's Odd!";
+ close;
+ }
+ function%TAB%script%TAB%OddFunc%TAB%{
+ if (getarg(0)%2==0) goto ItsEven;
+ return (1);
+ ItsEven:
+ return (0);
+ }
+
+---------------------------------------
+
+*callsub <label name>{,<argument>,...<argument>};
+
+This command will go to a specified label within the current script (do NOT use
+quotes around it) coming in as if it were a 'callfunc' call, and pass it
+arguments given, if any, which can be recovered there with 'getarg'. When done
+there, you should use the 'return' command to go back to the point from where
+this label was called. This is used when there is a specific thing the script
+will do over and over, this lets you use the same bit of code as many times as
+you like, to save space and time, without creating extra NPC objects which are
+needed with 'callfunc'. A label is not callable in this manner from another
+script.
+
+ mes "[Woman]"
+ mes "Lets see if you win";
+ callsub Check;
+ mes "Well done you have won";
+ Check:
+ set @win, rand(2);
+ if(@win==0) return;
+ mes "Sorry you lost";
+
+---------------------------------------
+
+*return {(<value>)};
+
+When you use callsub or callfunc, this command allows you to go back to the
+calling script. You can optionally return with a value telling the calling
+program what exactly happened. To get at this value, you will have to use the
+'set' command:
+
+ set <variable>,callfunc "<your function>"
+
+Note the round brackets. Turns out you have to enclose just about anything in
+brackets if it isn't a straight number for the return command to work with it:
+
+ return (@x+@y);
+
+Also note that
+
+ if (<condition>) return (<whatever>);
+
+does NOT always work, even though it would make scripts a lot cleaner, and it
+might be wiser to avoid using it like that.
+
+For an example see 'callfunc' and 'callsub'
+
+---------------------------------------
+
+*getarg(<number>)
+
+This function is used when you use the 'callsub' or 'callfunc' commands. In the
+call you can specify variables that will make that call different from another
+one. This function willwill return an argument the function or subroutine was
+called with, and is the normal way to get them.
+This is another thing that can let you use the same but of code more than once.
+
+Argument numbering starts with 0, i.e. the first argument you gave is number 0.
+If no such argument was given, a zero is returned.
+
+ place.gat,50,50,6%TAB%script%TAB%Woman1%TAB%115,{
+ mes "[Woman]";
+ mes "Lets see if you win";
+ callfunc "funcNPC",2;
+ mes "Well done you have won";
+
+ ...
+
+ place.gat,52,50,6%TAB%script%TAB%Woman2%TAB%115,{
+ mes "[Woman]";
+ mes "Lets see if you win";
+ callfunc "funcNPC",5;
+ mes "Well done you have won";
+
+ ...
+
+ function%TAB%script%TAB%funcNPC%TAB%{
+ set @win, rand(getarg(0));
+ if(@win==0) return;
+ mes "Sorry you lost";
+
+"woman1" NPC object calls the funcNPC. The argument it gives in this call is
+stated as 2, so when the random number is generated by the 'rand' function, it
+can only be 0 or 1. Whereas "woman2" gives 5 as the argument number 0 when
+calling the function, so the random number could be 0, 1, 2, 3 or 4, this makes
+"woman2" less likely to say the player won.
+
+You can pass multiple arguments in a function call:
+
+ callfunc "funcNPC",5,4,3;
+
+getarg(0) would be 5, getarg(1) would be 4 and getarg(2) would be 3.
+
+'getarg()' can also be used to carry information back from using the "callfunc"
+script command, if the 'return' command is set to return a value:
+
+ place.gat,50,50,6%TAB%script%TAB%Woman%TAB%115,{
+ mes "[Woman]";
+ mes "Lets see if you win";
+ callfunc "funcNPC";
+ mes "Well it seems you have "+getarg(0);
+ }
+ function%TAB%script%TAB%funcNPC%TAB%{
+ set @win, rand(2);
+ if(@win==0) return(won);
+ return(lost);
+ }
+
+It is, however, better to use 'set' to get this value instead (see 'callfunc')
+because otherwise you can't call functions from within other functions. (Return
+values mess up the stack.)
+
+---------------------------------------
+
+*next;
+
+This command will create a 'next' button in the message window for the invoking
+character. If no window is currently on screen, it will be created. Used to
+segment NPC talking, this command is used A LOT. See 'mes'.
+
+ mes "[Woman]";
+ mes "This would appear on the page";
+ next;
+ // This is needed cause it is a new page and the top will now be blank
+ mes "[Woman]";
+ mes "This would appear on the 2nd page";
+
+---------------------------------------
+
+*close;
+
+This command will create a 'close' button in the message window for the invoking
+character. If no window is currently on screen, it will be created. This is one
+of the ways to end a speech from an NPC. Once the button is clicked, the NPC
+script execution will end, and the message box will disappear.
+
+ mes "[Woman]";
+ mes "I am finished talking to you, click the close button";
+ close;
+ mes "This command will not run at all, cause the script has ended.";
+
+---------------------------------------
+
+*close2;
+
+This command will create a 'close' button in the message window for the invoking
+character. If no window is currently on screen, it will be created. See 'close'.
+There is one important difference, though - even though the message box will
+have closed, the script execution will not stop, and commands after 'close2'
+will still run, meaning an 'end' has to be used to stop the script, unless you
+make it stop in some other manner.
+
+ mes "[Woman]";
+ mes "I will warp you now";
+ close2;
+ warp "place.gat",50,50;
+ end;
+
+Don't expect things to run smoothly if you don't make your scripts 'end'.
+
+---------------------------------------
+
+*menu "<menu option>",<label>{,"<menu option>",<label>...};
+
+This command will create a selectable menu for the invoking character. Only one
+menu can be on screen at the same time.
+
+Depending on what the player picks from the menu, the script execution will
+continue from the corresponding label. (it's string-label pairs, not label-
+string)
+
+It also sets a special temporary character variable @menu, which contains the
+number of option the player picked. (Numbering of options starts at 1.)
+
+ menu "I want to Start",L_Start,"I want to end",L_End;
+ L_Start:
+ //If they click "I want to Start" they will end up here
+ L_End:
+ //If they click "I want to end" they will end up here
+
+If a label is '-', the script execution will continue right after the menu
+command if that option is selected, this can be used to save you time, and
+optimize big scripts.
+
+ menu "I want to Start",-,"I want to end",L_End;
+ //If they click "I want to Start" they will end up here
+ L_End:
+ //If they click "I want to end" they will end up here
+
+Both these examples will perform the same task.
+
+If you give an empty string as a menu item, the item will not display. This
+can effectively be used to script dynamic menus by using empty string for
+entries that should be unavailable at that time.
+
+You can do it by using arrays, but watch carefully - this trick isn't high
+wizardry, but minor magic at least. You can't expect to easily duplicate it
+until you understand how it works.
+
+Create a temporary array of strings to contain your menu items, and populate it
+with the strings that should go into the menu at this execution, making sure not
+to leave any gaps. Normally, you do it with a loop and an extra counter, like
+this:
+
+ setarray @possiblemenuitems$[0],<list of potential menu items>;
+ set @i,0; // That's our loop counter.
+ set @j,0; // That's the menu lines counter.
+
+ makemenuloop:
+
+ // We record the number of option into the list of options actually
+ // available. That 'condition' is whatever condition that determines whether
+ // a menu item number @i actually goes into the menu or not.
+
+ if (<condition>) set @menulist$[@j],@possiblemenuitems$[@i];
+
+ // We just copied the string, we do need it's number for later though, so we
+ // file it away as well.
+
+ if (<condition>) set @menureference[@j],@i;
+
+ // Since we've just added a menu item into the list, we increment the menu
+ // lines counter.
+
+ if (<condition>) set @j,@j+1;
+
+ // We go on to the next possible menu item.
+
+ set @i,@i+1;
+
+ // And continue looping through the list of possible menu items until it
+ // ends.
+
+ if (@i<=getarraysize(@possiblemenuitems)) goto makemenuloop;
+
+
+This will create you an array @menulist$ which contains the text of all items
+that should actually go into the menu based on your condition, and an array
+@menureference, which contains their numbers in the list of possible menu items.
+(Remember, arrays start with 0.) There's less of them than the possible menu
+items you've defined, but the menu command can handle the empty lines - only if
+they are last in the list, and if it's made this way, they are. Now comes a
+dirty trick:
+
+ // X is whatever the most menu items you expect to handle.
+ menu @menulist$[0],-,@menulist$[1],-,....@menulist$[<X>],-;
+
+This calls up a menu of all your items. Since you didn't copy some of the
+possible menu items into the list, it's end is empty and so no menu items will
+show up past the end. But this menu call doesn't jump anywhere, it just
+continues execution right after the menu command. (And it's a good thing it
+doesn't, cause you can only explicitly define labels to jump to, and how do you
+know which ones to define if you don't know beforehand which options will end up
+where in your menu?)
+But how do you figure out which option the user picked? Enter the @menu.
+
+@menu contains the number of option that the user selected from the list,
+starting with 1 for the first option. You know now which option the user picked
+and which number in your real list of possible menu items it translated to:
+
+ mes "You selected "+@possiblemenuitems$[@menureference[@menu-1]]+"!";
+
+@menu is the number of option the user picked.
+@menu-1 is the array index for the list of actually used menu items that we
+made.
+@menureference[@menu-1] is the number of the item in the array of possible menu
+items that we've saved just for this purpose.
+
+And @possiblemenuitems$[@menureference[@menu-1]] is the string that we used to
+display the menu line the user picked. (Yes, it's a handful, but it works.)
+
+You can set up a bunch of 'if (@menureference[@menu-1]==X) goto Y' statements to
+route your execution based on the line selected and still generate a different
+menu every time, which is handy when you want to, for example, make users select
+items in any specific order before proceeding, or make a randomly shuffled menu.
+
+Kafra code bundled with the standard distribution uses a similar array-based
+menu technique for teleport lists, but it's much simpler and doesn't use @menu,
+probably since that wasn't documented anywhere.
+
+See also 'select', which is probably better in this particular case. Instead of
+menu, you could use 'select' like this:
+
+ set @dummy,select(@menulist$[0],@menulist$[1],....@menulist$[<X>]);
+
+For the purposes of the technique described above these two statements are
+perfectly equivalent.
+
+---------------------------------------
+
+*rand(<number>{,<number>});
+
+This function returns a number, randomly positioned between 0 and the number you
+specify (if you only specify one) and the two numbers you specify if you give it
+two.
+
+rand(10) would result in 0,1,2,3,4,5,6,7,8 or 9
+
+rand(2,10) would result in 2,3,4,5,6,7,8,9 or 10
+
+---------------------------------------
+
+*warp "<map name>",<x>,<y>;
+
+This command will take the invoking character to the specifed map, and if
+wanted, specified coordinates too, but these can be random.
+
+ warp "place.gat",50,55;
+
+This would take them to X 50 Y 55 on the map called "place". If your X and Y
+coordinates land on an unwalkable map square, it will send the warped character
+to a random place. Same will happen if they are both zero:
+
+ warp "place.gat",0,0;
+
+Notice that while warping people to coordinates 0,0 will normally get them into
+a random place, it's not certain to always be so. Darned if I know where this is
+actually coded, it might be that this happens because square 0,0 is unwalkable
+on all official maps. If you're using custom maps, beware.
+
+There are also three special 'map names' you can use.
+
+"Random" will warp the player randomly on the current map.
+"Save" and "SavePoint" will warp the player back to their savepoint.
+
+---------------------------------------
+
+*areawarp "<from map name>",<x1>,<y1>,<x2>,<y2>,"<to map name>",<x3>,<y3>;
+
+This command is similar to 'warp', however, it will not refer to the invoking
+character, but instead, all characters within a specified area, defined by the
+x1/y1-x2/y2 square, will be warped. Nobody outside the area will be affected,
+including the activating character, if they are outside the area.
+
+ areawarp "place.gat",10,10,120,120,"place2.gat",150,150;
+
+Everyone that is in the area between X 10 Y 10 and X 120 Y 120, in a square
+shape, on the map called "place", will be affected, and warped to "place2" X 150
+Y 150
+
+ areawarp "place.gat",10,10,120,120,"place2.gat",0,0;
+
+By using ,0,0; as the destination coordinates it will take all the characters in
+the affected area to a random set of co-ordinates on "place2".
+
+Like 'warp', areawarp will also explicitly warp characters randomly into the
+current map if you give the 'to map name' as "Random".
+
+See also 'warp'.
+
+---------------------------------------
+
+*heal <hp>,<sp>;
+
+This command will heal a set amount of HP and/or SP on the invoking character.
+
+ heal 30000,0; // This will heal 30,000 HP
+ heal 0,30000; // This will heal 30,000 SP
+ heal 300,300; // This will heal 300 HP and 300 SP
+
+This command just alters the hit points and spell points of the invoking
+character and produces no other output whatsoever.
+
+---------------------------------------
+
+*itemheal <hp>,<sp>;
+
+This command works on the invoking character like 'heal', however, it is not
+normally used in NPC scripts and will not work as expected there, but is used
+all over in item scripts.
+
+Unlike 'heal', which just alters hp/sp and doesn't do anything else at all, this
+command also shows healing animations for potions and other stuff, checks
+whether the potion was made by a famous alchemist and alters the amount healed,
+etc, etc. Since which kind of effect is shown depends on what item was used,
+using it in an NPC script will not have a desired effect.
+
+There is also a nice example on using this with the 'rand' function, to give you
+a random ammount of healing.
+
+ // This will heal anything thing from 100 to 150 HP and no SP
+ itemheal rand(100,150),0;
+
+---------------------------------------
+
+*percentheal <hp>,<sp>;
+
+This command will heal the invoking character. It heals the character, but not
+by a set value - it adds percent of their maximum HP/SP.
+
+ percentheal 100,0; // This will heal 100% HP
+ percentheal 0,100; // This will heal 100% SP
+ percentheal 50,50; // This will heal 50% HP and 50% SP
+
+So the amount that this will heal will depend on the total ammount of HP or SP
+you have maximum. Like 'heal', this will not call up any animations or effects.
+
+---------------------------------------
+
+*jobchange <job number>{,<upper flag>};
+
+This command will change the job class of the invoking character.
+
+ jobchange 1; // This would change your player into a Swordman
+ jobchange 4002; // This would change your player into a Swordman High
+
+This command does work with numbers, but you can also use job names. The full
+list of job names and the numbers they correspond to can be found in
+'db/const.txt'.
+
+ // This would change your player into a Swordman
+ jobchange Job_Swordman;
+ // This would change your player into a Swordman High
+ jobchange Job_Swordman_High;
+
+'upper flag' can alternatively be used to specify the type of job one changes
+to. For example, jobchange Job_Swordman,1; will change the character to a high
+swordsman. The upper values are:
+-1 (or when omitted): preserves the current job type.
+0: Normal/standard classes
+1: High/Advanced classes
+2: Baby classes
+
+This command will also set a permanent character-based variable
+'jobchange_level' which will contain the job level at the time right before
+changing jobs, which can be checked for later in scripts.
+
+---------------------------------------
+
+*jobname <job number>
+
+This command retrieves the name of the given job using the msg_athena entries 550->650.
+
+ mes "[Kid]";
+ mes "I never thought I'd met a "+jobname(Class)+" here of all places.";
+ close;
+
+---------------------------------------
+
+*eaclass {<job number>}
+
+This commands returns the "eA job-number" corresponding to the given class (if none is given, it returns uses
+the invoking player's class as argument). The eA job-number is also a class number system, but it's one that
+comes with constants which make it easy to convert among classes. The command will return -1 if you pass it a
+job number which doesn't has a eA Job value equivalent.
+
+ set @eac, eaclass();
+ if ((@eac&EAJ_BASEMASK) == EAJ_SWORDMAN)
+ mes "You must be a swordman, knight, crusader, paladin, high swordman, lord knight, baby swordman,";
+ mes "baby knight or baby crusader.";
+ if (@eac&EAJL_UPPER)
+ mes "You are a rebirth job.";
+ if ((@eac&EAJ_UPPERMASK) == EAJ_SWORDMAN)
+ mes "You must be a Swordman, Baby Swordman or High Swordman.";
+
+For more information on the eA Job System, see the docs/ea_job_system.txt file.
+
+---------------------------------------
+*roclass <job number> {,<gender>}
+
+Does the opposite of eaclass. That is, given a eA Job class, it returns which is the corresponding RO class number.
+A gender is required because both Bard and Dancers share the same eA Job value (EAJ_BARDDANCER), if it isn't given, the
+gender of the executing player is taken (if there's no player running the script, male will be used by default).
+The command returns -1 when there isn't a valid class to represent the required job (for example, if you try to get the
+baby version of a Taekwon class).
+
+ set @eac, eaclass();
+ //Check if class is already rebirth
+ if (@eac&EAJL_UPPER) {
+ mes "You look strong.";
+ close;
+ }
+ set @eac, roclass(@eac|EAJL_UPPER);
+ //Check if class has a rebirth version
+ if (@eac != -1) {
+ mes "Bet you can't wait to become a "+jobname(@eac)+"!";
+ close;
+ }
+
+---------------------------------------
+
+*input <variable>;
+
+This command will make an input box pop up on the client connected to the
+invoking character, to allow entering of a number or a string. This has many
+uses, one example would be a guessing game, also making use of the 'rand'
+function:
+
+ mes "[Woman]";
+ mes "Try and guess the number I am thinking of.";
+ mes "The number will be between 1 and 10.";
+ next;
+ set @number, rand(1,10);
+ input @guess;
+ if(@guess==@number) goto L_Correct;
+ mes "[Woman]";
+ mes "Sorry, that wasn't the number I was thinking of.";
+ close;
+ L_Correct:
+ mes "[Woman]";
+ mes "Well done that was the number I was thinking of";
+ close;
+
+If you give the input command a string variable to put the input in, it will
+allow the player to enter text. Otherwise, only numbers will be allowed.
+
+ mes "[Woman]";
+ mes "Please say HELLO";
+ next;
+ input @var$;
+ if(@var$=="HELLO") goto L_Correct;
+ mes "[Woman]";
+ mes "Sorry you got it wrong";
+ close;
+ L_Correct:
+ mes "[Woman]";
+ mes "Well done you typed it correctly";
+ close;
+
+Notice that in current SVN, you may not input a negative number with this
+command. This was done to prevent exploits in badly written scripts, which would
+let people, for example, put negative amounts of zeny into a bank script and
+recieve free zeny as a result. Unfortunately it limits the uses of the 'input'
+command quite a bit.
+
+---------------------------------------
+
+*setlook <look type>,<look value>;
+
+This command will alter the look data for the invoking character. It is used
+mainly for changing the palette used on hair and clothes, you specify which look
+type you want to change, then the palette you want to use. Make sure you specify
+a palette number that exists/is usable by the client you use.
+
+ // This will change your hair(6), so that it uses palette 8, what ever your
+ // palette 8 is your hair will use that colour
+
+ setlook 6,8;
+
+ // This will change your clothes(7), so they are using palette 1, whatever
+ // your palette 1 is, your clothes will then use that set of colours.
+
+ setlook 7,1;
+
+Here are the possible look types:
+
+ 0 - Base sprite
+ 1 - Hairstyle
+ 2 - Weapon
+ 3 - Head bottom
+ 4 - Head top
+ 5 - Head mid
+ 6 - Hair color
+ 7 - Clothes color
+ 8 - Shield
+ 9 - Shoes
+
+Whatever 'shoes' means is anybody's guess, ask Gravity - the client does nothing
+with this value. It still wants it from the server though, so it is kept, but
+normally doesn't do a thing.
+
+Only the look data for hairstyle, hair color and clothes color are saved to the
+char server's database and will persist. The rest freely change as the character
+puts on and removes equipment, changes maps, logs in and out and otherwise you
+should not expect to set them. In fact, messing with them is generally
+hazardous, do it at your own risk, it is not tested what will this actually do -
+it won't cause database corruption and probably won't cause a server crash, but
+it's easy to crash the client with just about anything unusual.
+
+However, it might be an easy way to quickly check for empty view IDs for
+sprites, which is essential for making custom headgear.
+
+Since a lot of people have different palettes for hair and clothes, it's
+impossible to tell you what all the colour numbers are. If you want a serious
+example, there is a Stylist script inside the default eAthena installation that
+you can look at, this may help you create a Stylist of your own:
+'custom\dye.txt'
+
+---------------------------------------
+
+*set <variable>,<expression>;
+
+This command will set a variable to the value that the expression results in.
+This is the only way to set a variable directly.
+
+This is the most basic script command and is uses a lot whenever you try to do
+anything more advanced than just printing text into a messagebox.
+
+ set @x,100;
+
+will make @x equal 100.
+
+ set @x,1+5/8+9;
+
+will compute 1+5/8+9 (which is, surprisingly, 10 - remember, all numbers are
+integer in this language) and make @x equal it.
+
+---------------------------------------
+
+*setarray <array name>[<first value>],<value>{,<value>...<value>};
+
+This command will allow you to quickly fill up an array in one go. Check the
+Kafra scripts in the distribution to see this used a lot.
+
+ setarray @array[0], 100, 200, 300, 400, 500, 600;
+
+First value is the index of the first element of the array to alter. For
+example:
+
+ setarray @array[0],200,200,200;
+ setarray @array[1],300,150;
+
+will produce:
+
+ @array[0]=200
+ @array[1]=300
+ @array[2]=150
+
+---------------------------------------
+
+*cleararray <array name>[<first value to alter>],<value>,<number of values to set>;
+
+This command will change many array values at the same time to the same value.
+
+ setarray @array[0], 100, 200, 300, 400, 500, 600;
+ // This will make all 6 values 0
+ cleararray @array[0],0,6;
+ // This will make array element 0 change to 245
+ cleararray @array[0],245,1;
+ // This will make elements 1 and 2 change to 345
+ cleararray @array[1],345,2;
+
+See 'setarray'.
+
+---------------------------------------
+
+*copyarray <to array>[<first value>],<from array>[<first value>],<amount to copy>;
+
+This command lets you quickly shuffle a lot of data between arrays, which is in
+some cases invaluable.
+
+ setarray @array[0], 100, 200, 300, 400, 500, 600;
+ // So we have made @array[]
+ copyarray @array2[0],@array[2],2;
+
+ // Now, @array2[0] will be equal to @array[2] (300) and
+ // @array2[1] will be equal to @array[3].
+
+So using the examples above:
+ @array[0] = 100
+ @array[1] = 200
+ @array[2] = 300
+ @array[3] = 400
+ @array[4] = 500
+ @array[5] = 600
+
+ @array2[0] = 300
+ @array2[1] = 400
+ @array2[2] = 500
+ @array2[3] = 0
+
+Notice that @array[5] wont be coppied to the second array, and it will return a
+0.
+
+---------------------------------------
+
+*getarraysize(<array name>);
+
+This function returns the number of values that are contained inside the
+specified array. Notice that zeros and empty strings at the end of this array
+are not counted towards this number.
+
+For example:
+
+ setarray @array[0], 100, 200, 300, 400, 500, 600;
+ set @arraysize,getarraysize(@array);
+
+This will make @arraysize == 6. But if you try this:
+
+ setarray @array[0], 100, 200, 300, 400, 500, 600, 0;
+ set @arraysize,getarraysize(@array);
+
+@arraysize will still equal 6, even though you've set 7 values.
+
+---------------------------------------
+
+*deletearray <array name>[<first value>],<how much to delete>
+
+This command will delete a specified number of array elements totally from an
+array, shifting all the elements beyond this towards the beginning.
+
+ // This will delete array element 0, and move all the other array elements
+ // up one place.
+ deletearray @array[0],1
+
+// This would delete array elements numbered 1, 2 and 3, leave element 0 in its
+// place, and move the other elements ups, so there are no gaps.
+
+ deletearray @array[1],3
+
+IMPORTANT: deletarray is horribly broken since the earliest days of jAthena. It
+tends to merrily remove much more variables than it's told to remove, which
+makes it pretty much useless for anything other than removing an array from
+memory entirely. This would be very handy, if it always worked.
+
+---------------------------------------
+
+*getelementofarray(<array name>,<index>);
+
+This function will return an array's element when given an index.
+
+ // This will find the 2nd array value
+ getelementofarray(@array,1)
+
+Pretty pointless now when we have
+
+ @array[1]
+
+which has the same effect.
+
+---------------------------------------
+
+*if (<condition>) <statement>;
+
+This is the basic conditional statement command, and just about the only one
+available in this scripting language.
+
+The condition can be any expression. All expressions resulting in a non-zero
+value will be considered True, including negative values. All expressions
+resulting in a zero are false.
+
+If the expression results in True, the statement will be executed. If it isn't
+true, nothing happens and we move on to the next line of the script.
+
+ if (1) mes "This will always print.";
+ if (0) mes "And this will never print.";
+ if (5) mes "This will also always print.";
+ if (-1) mes "Funny as it is, this will also print just fine.";
+
+For more information on conditional operators see the operators section above.
+Anything that is returned by a function can be used in a condition check without
+bothering to store it in a specific variable:
+
+ if (strcharinfo(0)=="Daniel Jackson") mes "It is true, you are Daniel!";
+
+More examples of using the 'if' command in the real world:
+
+Example 1:
+
+ set @var1,1;
+ input @var2;
+ if(@var1==@var2) goto L_Same;
+ mes "Sorry that is wrong";
+ close;
+ L_Same:
+ close;
+
+Example 2:
+
+ set @var1,1;
+ input @var2;
+ if(@var1!=@var2) mes "Sorry that is wrong";
+ close;
+
+(Notice examples 1 and 2 have the same effect.)
+
+Example 3:
+
+ set @var1,@var1+1;
+ mes "[Forgetfull Man]";
+ if (@var==1) mes "This is the first time you have talked to me";
+ if (@var==2) mes "This is the second time you have talked to me";
+ if (@var==3) mes "This is the third time you have talked to me";
+ if (@var==4) mes "This is the forth time you have talked to me, but I think I am getting amnesia, I have forgoten about you";
+ if (@var==4) set @var,0;
+ close;
+
+Example 4:
+
+ mes "[Quest Person]";
+ if(countitem(512)>=1) goto L_GiveApple;
+ // The number 512 was found from item_db, it is the item number for the Apple.
+ mes "Can you please bring me an apple?";
+ close;
+ L_GiveApple:
+ mes "Oh an apple, I didnt want it, I just wanted to see one";
+ close;
+
+Example 5:
+
+ mes "[Person Checker]";
+ if($name$!=null) goto L_Check;
+ mes "Please tell me someones name";
+ next;
+ input $name$;
+ set $name2$,strcharinfo(0);
+ mes "[Person Checker]";
+ mes "Thank you";
+ L_Check:
+ if($name$==strcharinfo(0) ) goto L_SameName;
+ mes "[Person Checker]";
+ mes "You are not the person that " +$name2$+ " mentioned";
+ L_End:
+ set $name$,null;
+ set $name2$,null;
+ close;
+ L_SameName:
+ mes "[Person Checker]";
+ mes "You are the person that " +$name2$+ " just mentioned";
+ mes "nice to meet you";
+ goto L_End;
+
+See 'strcharinfo' for explanation of what this function does.
+
+Example 6: Using complex conditions.
+
+ mes "[Multi Checker]";
+ if( (@queststarted==1) && (countitem(512)>=5) ) goto L_MultiCheck;
+ // Only if the quest has been started AND You have 5 apples will it goto "L_MultiCheck"
+ mes "Please get me 5 apples";
+ set @queststarted,1;
+ close;
+ L_MultiCheck:
+ mes "[Multi Checker]";
+ mes "Well done you have started the quest of got me 5 apples";
+ mes "Thank you";
+ set @queststarted,0;
+ delitem 512,5;
+ close;
+
+---------------------------------------
+
+*getitem <item id>,<amount>{,<character ID>};
+*getitem "<item name>",<amount>{,<character ID>};
+
+This command will give a specific amount of specified items to the invoking
+character. If an optional character ID is specified, and that character is
+currently online, items will be created in their inventory instead. If they are
+not online, nothing will happen.
+
+In the first and most commonly used version of this command, tems are referred
+to by their database ID number found inside 'db/item_db.txt'.
+
+ getitem 502,10 // The person will recieve 10 apples
+ getitem 617,1 // The person will recieve 1 Old Violet Box
+
+Giving an item ID of -1 will give a specified number of random items from the
+list of those that fall out of Old Blue Box. Unlike in all other cases, these
+will be unidentified, if they turn out to be equipment. This is exactly what's
+written in the Old Blue Box's item script.
+
+Other negative IDs also correspond to other random item generating item tables:
+
+Giving an item ID of -2 will produce the effects of Old Violet Box.
+Giving an item ID of -3 will produce the effects of Old Card Album.
+Giving an item ID of -4 will produce the effects of Gift Box.
+Giving an item ID of -5 will produce the effects of Worn Out Scroll, which, in
+current SVN, drops only Jellopies anyway.
+
+Calling this command with a negative item ID to create a random item will create
+an entry in the log file for those if such logging is enabled.
+
+You may also create an item by it's name in the 'english name' field in the item
+database:
+
+ getitem "RED_POTION",10;
+
+Which will do what you'd expect. If it can't find that name in the database,
+apples will be created anyway. It is often a VERY GOOD IDEA to use it like this.
+
+This used in pretty much all NPC scripts that have to do with items and quite a
+few item scripts. For more examples check just about any official script.
+
+---------------------------------------
+
+*getitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
+*getitem2 "<Item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
+
+This command will give an amount of specified items to the invoking character.
+If an optional character ID is specified, and that character is currently
+online, items will be created in their inventory instead. If they are not
+online, nothing will happen. It works essentially the same as 'getitem' (it even
+works for negative ID numbers the same way, which is kinda silly) but is a lot
+more flexible, since it allows you to give the player an item altered with it's
+specific properties.
+
+Those parameters that are different from 'getitem' are:
+
+identify - Whether you want the item to be identified or not, 0 unidentified,
+ 1 identified.
+refine - For how many plusses will it be refined.
+ It will not let you refine an item higher than +10, if you
+ specify more it'll still be 10.
+attribute - Whether the item is broken (1) or not (0) and NOT an elemental
+ attribute.
+card1,2,3,4 - If you want a card compound to it, place the card ID number into
+ the specific card slot. Card ID numbers also found in
+ 'db/item_db.txt'
+
+Card1-card4 values are also used to store name information for named items, as
+well as the elemental property of weapons and armor. You can create a named item
+in this manner, however, if you just need a named piece of standard equipment,
+it is much easier to the 'getnameditem' function instead.
+
+You will need to keep these values if you want to destroy and then perfectly
+recreate a named item, for this see 'getinventorylist'.
+
+If you still want to try creating a named item with this command because
+'getnameditem' won't do it for you cause it's too limited, you can do it like
+this. Careful, minor magic ahead.
+
+ // First, let's get an ID of a character who's name will be on the item.
+ // Only an existing character's name may be there.
+ // Let's assume our character is 'Adam' and find his ID.
+
+ set @charid,getcharid(0,"Adam");
+
+ // Now we split the character ID number into two portions with a binary
+ // shift operation. If you don't understand what this does, just copy it.
+
+ set @card3, @charid & 65535;
+ set @card4, @charid >> 16;
+
+ // If you're inscribing non-equipment, @card1 must be 254.
+ // Arrows are also not equipment. :)
+ set @card1,254;
+
+ // For named equipment, card2 means the Star Crumbs and elemental
+ // crystals used to make this equipment. For everything else, it's 0.
+
+ set @card2,0;
+
+ // Now, let's give the character who invoked the script some
+ // Adam's Apples:
+
+ getitem2 512,1,1,0,0,@card1,@card2,@card3,@card4;
+
+This wasn't tested with all possible items, so I can't give any promises,
+experiment first before relying on it.
+
+To create equipment, continue this example it like this:
+
+ // We've already have card3 and card4 loaded with correct
+ // values so we'll just set up card1 and card2 with data
+ // for an Ice Stiletto.
+
+ // If you're inscribing equipment, @card1 must be 255.
+ set @card1,255;
+
+ // That's the number of star crumbs in a weapon.
+ set @sc,2;
+
+ // That's the number of elemental property of the weapon.
+ set @ele,1;
+
+ // And that's the wacky formula that makes them into
+ // a single number.
+ set @card2,@ele+((@sc*5)<<8);
+
+ // That will make us an Adam's +2 VVS Ice Stiletto:
+
+ getitem2 1216,1,1,2,0,@card1,@card2,@card3,@card4;
+
+Experiment with the number of star crumbs - I'm not certain just how much will
+work most and what it depends on. The valid element numbers are:
+
+ 1 - Ice, 2 - Earth 3 - Fire 4 - Wind.
+
+You can, apparently, even create duplicates of the same pet egg with this
+command, creating a pet which is the same, but simultaneously exists in two
+eggs, and may hatch from either, although, I'm not sure what kind of a mess will
+this really cause.
+
+---------------------------------------
+*groupranditem <group id>;
+
+Returns the item_id of a random item picked from the group specified. The
+different groups and their group number are specified in db/item_group_db.txt
+
+When used in conjunction with other functions, you can get a random item. For
+example, for a random pet lure:
+
+getitem groupranditem(15),1;
+
+---------------------------------------
+
+*makeitem <item id>,<amount>,<X>,<Y>,"<map name>";
+*makeitem "<item name>",<amount>,<X>,<Y>,"<map name>";
+
+This command will create an item lying around on a specified map in the
+specified location.
+
+ itemid - Found in 'db/item_db.txt'
+ amount - Amount you want produced
+ X - The X coordinate
+ Y - The Y coordinate
+ map name - The map name.
+
+This item will still disappear just like any other dropped item. Like 'getitem',
+it also accepts an 'english name' field from the database and creates apples if
+the name isn't found.
+
+---------------------------------------
+
+*delitem <item id>,<amount>;
+*delitem "<item name>",<amount>;
+
+This command will take a specified amount of items from the invoking character.
+As all the item commands, this one uses the ID of the item found inside
+'db/item_db.txt'. The items are destroyed - there is no way an NPC can simply
+own items and have an inventory of them, other as by destroying and recreating
+them when needed.
+
+ delitem 502,10 // The person will lose 10 apples
+ delitem 617,1 // The person will lose 1 Old Violet Box
+
+It is always a good idea to to check if the player actually has the item before
+you take it from them, Otherwise, you could try to delete items which the
+players don't actually have, which won't fail and won't give an error message,
+but might open up ways to exploit your script.
+
+Like 'getitem' this command will also accept an 'english name' field from the
+database. If the name is not found, nothing will be deleted.
+
+---------------------------------------
+
+*delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
+*delitem2 "<Item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<character ID>};
+
+This command will take a specified amount of items from the invoking character.
+Check 'getitem2' to understand its expanded parameters.
+
+---------------------------------------
+
+*enable_items;
+*disable_items;
+
+These commands enable item usage while an npc is running. When enable_items is
+run, items can be used during scripts until disable_items is called.
+To avoid possible exploits, when enable_items is invoked, it will only enable
+item usage while running that script in particular. Note that if a different
+script also calls enable_items, it will override the last call (so you may
+want to call this command at the start of your script without assuming the
+effect is still in effect).
+
+---------------------------------------
+
+*viewpoint <action>,<x>,<y>,<point number>,<color>;
+
+This command will mark places on the mini map in the client connected to the
+invoking character. It uses the normal X and Y coordinates from the main map.
+The colors of the marks are defined using a hexidecimal number, same as the ones
+used to color text in 'mes' output, but are written as hexadecimal numbers in C.
+(They look like 0x<six numbers>.)
+
+Action is what you want to do with a point, 1 will set it, while 2 will clear
+it. Point number is the number of the point - you can have several. If more than
+one point is drawn at the same coordinates, they will cycle, which can be used
+to create flashing marks.
+
+ // This command will show a mark at coordinates X 30 Y 40, is mark number 1,
+ // and will be red.
+
+ viewpoint 1,30,40,1,0xFF0000;
+
+This will create three points:
+
+ viewpoint 1,30,40,1,0xFF0000;
+ viewpoint 1,35,45,2,0xFF0000;
+ viewpoint 1,40,50,3,0xFF0000;
+
+And this is how you remove them:
+
+ viewpoint 2,30,40,1,0xFF0000;
+ viewpoint 2,35,45,2,0xFF0000;
+ viewpoint 2,40,50,3,0xFF0000;
+
+The client determines what it does with the points entirely, the server keeps no
+memory of where the points are set whatsoever.
+
+---------------------------------------
+
+*countitem(<item id>)
+*countitem("<item name>")
+
+This function will return the number of items for the specified item ID that the
+invoking character has in the inventory.
+
+ mes "[Item Checker]";
+ mes "Hmmm, it seems you have "+countitem(502)+" apples";
+ close;
+
+Like 'getitem', this function will also accept an 'english name' from the
+database as an argument.
+
+If you want to state the number at the end of a sentence, you can do it by
+adding up strings:
+
+ mes "[Item Checker]";
+ mes "Hmmm, the total number of apples you are holding is "+countitem("APPLE");
+ close;
+
+---------------------------------------
+
+*countitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>)
+*countitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>)
+
+Expanded version of 'countitem' function, used for created/carded/forged items.
+
+This function will return the number of items for the specified item ID and
+other parameters that the invoking character has in the inventory.
+Check 'getitem2' to understand the arguments of the function.
+
+---------------------------------------
+
+*checkweight(<item id>,<amount>)
+*checkweight("<item name>",<amount>)
+
+This function will compute and return 1 if the total weight of a specified
+number of specific items does not exceed the invoking character's carrying
+capacity, and 0 otherwise. It is important to see if a player can carry the
+items you expect to give them, failing to do that may open your script up to
+abuse or create some very unfair errors.
+
+Like 'getitem', this function will also accept an 'english name' from the
+database as an argument.
+
+ checkweight(502,10) // 10 apples
+
+ if (checkweight(502,10) == 0 ) goto L_OverWeight;
+ getitem 502,10;
+ close;
+ L_OverWeight:
+ mes "Sorry you cannot hold this ammount of apples";
+ close;
+
+Or to put this another way:
+
+ if (checkweight("APPLE",10)) goto L_Getapples;
+ mes "Sorry you cannot hold this ammount of apples";
+ close;
+ L_Getapples:
+ getitem 502,10;
+ close;
+
+Both these examples have the same effect.
+
+---------------------------------------
+
+*readparam(<parameter number>)
+
+This function will return the basic stats of an invoking character, referred to
+by the parameter number. Instead of a number, you can use a parameter name if it
+is defined in "db/const.txt".
+
+For reference, in there these things are defined:
+
+StatusPoint, BaseLevel, SkillPoint, Class, Upper, Zeny, Sex, Weight, MaxWeight,
+JobLevel, BaseExp, JobExp, NextBaseExp, NextJobExp, Hp, MaxHp, Sp, MaxSp,
+BaseJob, Karma, Manner, bVit, bDex, bAgi, bStr, bInt, bLuk
+
+All of these also behave as variables, but don't expect to be able to just 'set'
+all of them - some will not work for various internal reasons.
+
+ // This would return how many status points you haven't spent yet
+ readparam(9)
+
+Using this particular information as a function call is not required. Just
+putting
+
+ StatusPoint
+
+will give you the same result, and some of these parameters work just like
+variables (i.e. you can 'set Zeny,100' to make the character have 100 zeny,
+destroying whatever zeny they had before, or 'set Zeny,Zeny+100' to give them
+100 zeny)
+
+You can also use this command to get stat values:
+
+ readparam(bVit)
+ if(readparam(bVit)<=77) goto L_End;
+ mes "Only people with over 77 Vit are reading this";
+L_End:
+ close;
+
+---------------------------------------
+
+*getcharid(<type>{,"<character name>"})
+
+This function will return a unique ID number of the invoking character, or, if a
+character name is specified, of that character.
+
+Type is the kind of associated ID number required:
+
+ 0 - Character ID number.
+ 1 - Party ID number.
+ 2 - Guild ID number.
+ 3 - Account ID number.
+
+For most purposes other than printing it, a number is better to have than a name
+(people do horrifying things to their character names).
+
+If the character is not in a party or not in a guild, the function will return 0
+if guild or party number is requested. If a name is specified and the character
+is not found, 0 is returned.
+
+If getcharid(0) returns a zero, the script got called not by a character and
+doesn't have an attached RID. Note that this will cause the map server to
+print "player not attached!" error messages, so it is preferred to use
+"playerattached" to check for the character attached to the script.
+
+if (getcharid(2)) mes "Only members of a guild are allowed beyond this point!";
+
+---------------------------------------
+
+*getpartyname(<party id>)
+
+This function will return the name of a party that has the specified ID number.
+If there is no such party ID, "null" will be returned.
+
+Lets say the ID of a party was saved as a global variable:
+
+ // This would return the name of the party from the ID stored in a variable
+ mes "You're in the '"+getpartyname($@var)"' party, I know!";
+
+---------------------------------------
+
+*getpartymember <party id>,[<type>];
+
+Thank you to HappyDenn for all this information.
+
+This command will finds all members of a specified party and returns their names
+(or character id or account id depending on the value of "type") into an array
+of temporary global variables. There's actually quite a few commands like this
+which will fill a special variable with data upon execution and not do anything
+else.
+
+Upon executing this,
+
+$@partymembername$[] is a global temporary stringarray which contains all the
+ names of these party members
+ (only set when type is 0 or not specified)
+
+$@partymembercid[] is a global temporary number array which contains the
+ character id of these party members.
+ (only set when type is 1)
+
+$@partymemberaid[] is a global temporary number array which contains the
+ account id of these party members.
+ (only set when type is 2)
+
+$@partymembercount is the number of party members that were found.
+
+The party members will (apparently) be found regardless of whether they are
+online or offline. Note that the names come in no particular order.
+
+Be sure to use $@partymembercount to go through this array, and not
+'getarraysize', because it is not cleared between runs of 'getpartymember'. If
+someone with 7 party members invokes this script, the array would have 7
+elements. But if another person calls up the NPC, and he has a party of 5, the
+server will not clear the array for you, overwriting the values instead. So in
+addition to returning the 5 member names, the 6th and 7th elements from the last
+call remain, and you will get 5+2 members, of which the last 2 don't belong to
+the new guy's party. $@partymembercount will always contain the correct number,
+(5) unlike 'getarraysize()' which will return 7 in this case.
+
+Example:
+
+ // get the character's party ID
+ getpartymember(getcharid(1));
+
+ // immediately copy $@partymembercount value to a new variable, since
+ // you don't know when 'getpartymember' will get called again for someone
+ // else's party, overwriting your global array.
+ set @partymembercount,$@partymembercount;
+
+ // copy $@partymembername array to a new array
+ copyarray @partymembername$[0],$@partymembername$[0],@partymembercount;
+
+ //list the party members in NPC dialog
+ set @count,0;
+ L_DisplayMember:
+ if(@count == @partymembercount) goto L_DisplayMemberEnd;
+ mes (@count + 1) + ". ^0000FF" + @partymembername$[@count] + "^000000";
+ set @count,@count+1;
+ goto L_DisplayMember;
+ L_DisplayMemberEnd:
+ close;
+
+---------------------------------------
+
+*getpartyleader <party id>,[<type>];
+
+This function returns some information about the given party-id's leader. When type is ommitted,
+the default information retrieved is Character name of the party leader. Possible types are:
+
+ 1: Leader account id
+ 2: Leader character id
+ 3: Leader's class
+ 4: Leader's current map index
+ 5: Leader's current level as stored on the party structure (may not be
+ current level if leader leveled up recently).
+
+If retrieval fails (leader not found or party does not exists), "null" is returned instead of character name,
+and -1 is returned for the other types.
+
+---------------------------------------
+*getguildname(<guild id>)
+
+This function returns a guild's name given an ID number. If there is no such
+guild, "null" will be returned;
+
+ // Would print what ever guild 10007 is, in my case this would return "AlcoROhics"
+ mes "The guild "+GetGuildName(10007)+" are all nice people.";
+
+ // This will do the same as above:
+ set @var,10007;
+ mes "We have some friends in "+GetGuildName(@var)+", you know.";
+
+This is used all over the WoE controlling scripts. You could also use it for a
+guild-based event.
+
+---------------------------------------
+
+*getguildmaster(<guild id>)
+
+This function return the name of the master of the guild which has the specified
+ID number. If there is no such guild, "null" will be returned.
+
+// Would return the guild master of guild 10007, whatever that might be.
+// In this example it would return "MissDjax" cause she owns "AlcoROhics" (10007)
+ mes getguildmaster(10007)+" runs "+getguildname(10007);
+
+Can be used to check if the character is the guildmaster of the specified guild.
+
+Maybe you want to make a room only guildmasters can enter:
+
+ set @GID,getcharid(2);
+ if(@GID==0) goto L_NoGuild;
+ if(strcharinfo(0)==getguildmaster(@GID)) goto L_GuildMaster;
+ mes "Sorry you dont own the guild you are in";
+ close;
+ L_NoGuild:
+ mes "Sorry you are not in a guild";
+ close;
+ L_GuildMaster:
+ mes "Welcome guild master of "+GetGuildName(@GID);
+ close;
+
+
+---------------------------------------
+*guildchangegm(<guild id>,<new master's name>)
+
+This function will change the Guild Master of a guild. The ID is the guild's
+id, and the new guildmaster's name must be passed.
+
+Returns 1 on success, 0 otherwise.
+
+---------------------------------------
+*getguildmasterid(<guild id>)
+
+This function will return the character ID number of the guildmaster of the
+guild specified by the ID. 0 if the character is not a guildmaster of any guild.
+
+---------------------------------------
+
+*strcharinfo(<type>)
+
+This function will return either the name, party name or guild name for the
+invoking character. Whatever it returns is determined by type.
+
+ 0 - Character's name.
+ 1 - The name of the party they're in if any.
+ 2 - The name of the guild they're in if any.
+
+If a character is not a member of any party or guild, an empty string will be
+returned when requesting that information.
+
+---------------------------------------
+
+*getequipid(<equipment slot>)
+
+This function returns the item ID of the item equipped in the equipment slot
+specified on the invoking character. If nothing is equpped there, it returns -1.
+Valid equipment slots are:
+
+1 - Upper head gear
+2 - Armor (Where you keep your Jackets and Robes)
+3 - What is in your Left hand.
+4 - What is in your Right hand.
+5 - The garment slot (Mufflers, Hoods, Manteaus)
+6 - What foot gear the player has on.
+7 - Accessory 1.
+8 - Accessory 2.
+9 - Middle Headgear (masks and glasses)
+10 - Lower Headgear (beards, some masks)
+
+Notice that a few items occupy several equipment slots, and if the character is
+wearing such an item, 'getequipid' will return it's ID number for either slot.
+
+Can be used to check if you have something equiped, or if you haven't got
+something equiped:
+
+ if(getequipid(1)==2234) goto L_WearingTiara;
+ mes "Come back when you have a Tiara on";
+ close;
+ L_WearingTiara:
+ mes "What a lovely Tiara you have on";
+ close;
+
+You can also use it to make sure people dont pass a point before removing an
+item totally from them. Let's say you dont want people to wear Legion Plate
+armor, but also dont want them to equip if after the check, you would do this:
+
+ if ((getequipid(2) == 2341) || (getequipid(2) == 2342) goto L_EquipedLegionPlate;
+ // the || is used as an or argument, there is 2341 and 2342 cause there are
+ // two different legion plate armors, one with a slot one without.
+ if ((countitem(2341) > 0) || (countitem(2432) > 0) goto L_InventoryLegionPlate;
+ mes "I will lets you pass";
+ close2;
+ warp "place.gat",50,50;
+ end;
+ L_EquipedLegionPlate:
+ mes "You are wearing some Legion Plate Armor, please drop that in your stash before continuing";
+ close;
+ L_InventoryLegionPlate:
+ mes "You have some Legion Plate Armor in your inventory, please drop that in your stash before continuing";
+ close;
+
+---------------------------------------
+
+*getequipname(<equpment slot>)
+
+This function will return the name of the item equipped in the specified
+equipment slot on the invoking character. Almost identical to 'getequipid', good
+for an NPC to state what your are wearing, or maybe saving as a string variable.
+See 'getequipid' for a full list of valid equipment slots.
+
+ if (getequipname(1)==0) goto L_No_HeadGear;
+ mes "So you are wearing a "+getequipname(1)+" on your head";
+ close;
+ L_No_HeadGear:
+ mes "You are not wearing any head gear";
+ close;
+
+---------------------------------------
+
+*getbrokenid(<number>)
+
+This function will search the invoking character's inventory for any broken
+items, and will return their item ID numbers. Since the character may have
+several broken items, 0 given as an argument will return the first one found, 1
+will return the second one, etc. Will return 0 if no such item is found.
+
+ // Let's see if they have anything broken:
+ if (getbrokenid(0)==0) goto Skip;
+ // They do, so let's print the name of the first broken item:
+ mes "Oh, I see you have a broken "+getitemname(getbrokenid(0))+" here!";
+ Skip:
+ mes "You don't have anything broken, quit bothering me.";
+
+---------------------------------------
+
+*repair <broken item number>;
+
+This command repairs a broken peice of equipment, using the same list of broken
+items as available through 'getbrokenid'.
+
+The official scripts seem to use the repair command as a function instead:
+'repair(<number>)' but it returns nothing on the stack. Probably only Valaris,
+who made it, can answer why is it so.
+
+---------------------------------------
+
+*getequipisequiped(<equipment slot>)
+
+This functions will return 1 if there is an equipment placed on the specified
+equipment slot and 0 otherwise. For a list of equipment slots
+see 'getequipid'. Function originally used by the refining NPCs:
+
+ if (getequipisequiped(1)) goto L_equipped;
+ mes "[Refiner]";
+ mes "Do you want me to refine your dumb head?";
+ close;
+ L_equipped:
+ mes "[Refiner]";
+ mes "That's a fine hat you are wearing there...";
+ close;
+
+
+---------------------------------------
+
+*getequipisenableref(<equipment slot>)
+
+Will return 1 if the item equipped on the invoking character in the specified
+equipment slot is refinable, and 0 if it isn't. For a list of equipment slots
+see 'getequipid'.
+
+ if (getequipisenableref(1)) goto L_Refine;
+ mes "[Refiner]";
+ mes "I can't refine this hat!...";
+ close;
+ L_Refine:
+ mes "[Refiner]";
+ mes "Ok I can refine this";
+ close;
+
+---------------------------------------
+
+*getequipisidentify(<equipment slot>)
+
+This function will return 1 if an item in the specified equipment slot is
+identified and 0 if it isn't. Since you can't even equip unidentified equipment,
+there's a question of whether it can actually end up there, and it will normally
+return 1 all the time if there is an item in this equipment slot.
+Which is kinda pointless.
+For a list of equipment slots see 'getequipid'.
+
+---------------------------------------
+
+*getequiprefinerycnt(<equipment slot>)
+
+Returns the current number of plusses for the item in the specified equipment
+slot. For a list of equipment slots see 'getequipid'.
+
+Can be used to check if you have reached a maximum refine value, default for
+this is +10:
+
+ if(getequiprefinerycnt(1) < 10) goto L_Refine_HeadGear;
+ mes "Sorry, it's not possible to refine hats better than +10";
+ close;
+ L_Refine_HeadGear:
+ mes "I will now upgrade your "+getequipname(1);
+
+---------------------------------------
+
+*getequipweaponlv(<equipment slot>)
+
+This function returns the weapon level for the weapon equipped in the specified
+equipment slot on the invoking character. For a list of equipment slots see
+'getequipid'.
+
+Only 3 (Left hand) and 4 (Right hand) normally make sense, since only weapons
+have a weapon level. You can, however, probably, use this field for other
+equippable custom items as a flag or something.
+If no item is equipped in this slot, or if it doesn't have a weapon level
+according to the database, 0 will be returned.
+
+ if(getequipweaponlv(4)==0) mes "Seems you dont have a weapon on";
+ if(getequipweaponlv(4)==1) mes "You are holding a lvl 1 weapon";
+ if(getequipweaponlv(4)==2) mes "You are holding a lvl 2 weapon";
+ if(getequipweaponlv(4)==3) mes "You are holding a lvl 3 weapon";
+ if(getequipweaponlv(4)==4) mes "You are holding a lvl 4 weapon";
+ if(getequipweaponlv(4)==5) mes "You are holding a lvl 5 weapon, hm, must be a custom design";
+
+Or for the left hand, cause it can hold a weapon or a shield:
+
+ if(getequipid(3)==0) goto L_NothingEquiped;
+ if(getequipweaponlv(3)==0) mes "You are holding a shield, so it doesnt have a level";
+ if(getequipweaponlv(3)==1) mes "You are holding a lvl 1 weapon";
+ if(getequipweaponlv(3)==2) mes "You are holding a lvl 2 weapon";
+ if(getequipweaponlv(3)==3) mes "You are holding a lvl 3 weapon";
+ if(getequipweaponlv(3)==4) mes "You are holding a lvl 4 weapon";
+ if(getequipweaponlv(3)==5) mes "You are holding a lvl 5 weapon, hm, must be a custom design";
+ close;
+ L_NothingEquiped:
+ mes "Seems you have nothing equiped";
+ close;
+
+---------------------------------------
+
+*getequippercentrefinery(<equipment slot>)
+
+This function calculates and returns the percent value chance to successfully
+refine the item found in the specified equipment slot of the invoking character
+by +1. The actual formula is beyond the scope of this document, however, it is
+calculated as if the character was a blacksmith trying to refine this particular
+weapon, and depends on lots and lots of stuff. For a list of equipment slots see
+'getequipid'.
+
+These values can be displayed for the player to see, or used to calculate the
+random change of a refine succeeding or failing and then going through with it
+(which is what the official NPC refinery scripts use it for)
+
+// This will find a random number from 0 - 99 and if that is equal to or more
+// than the value recoverd by this command it will go to L_Fail
+ if (getequippercentrefinery(3)<=rand(100)) goto L_Fail;
+
+---------------------------------------
+
+*successrefitem <equipment slot>;
+
+This command will refine an item in the specified equipment slot of the invoking
+character by +1. For a list of equipment slots see 'getequipid'. This command
+will not only add the +1, but also display a 'refine success' effect on the
+character and put appropriate messages into their chat window. It will also give
+the character fame points if a weapon reached +10 this way, even though these
+will only take effect for blacksmith who will later forge a weapon.
+
+The official scripts seem to use the 'successrefitem' command as a function
+instead: 'successrefitem(<number>)' but it returns nothing on the stack.
+This is since jAthena, so probably nobody knows for sure why is it so.
+
+---------------------------------------
+
+*failedrefitem <equipment slot>;
+
+This command will fail to refine an item in the specified equipment slot of the
+invoking character. The item will be destroyed. This will also display a 'refine
+failure' effect on the character and put appropriate messages into their chat
+window.
+
+The official scripts seem to use the 'failedrefitem' command as a function
+instead: 'failedrefitem(<number>)' but it returns nothing on the stack. This is
+since jAthena, so probably nobody knows for sure why is it so.
+
+
+---------------------------------------
+
+*cutin "<filename with no extension>",<position>;
+
+This command will display a picture stored in the GRF file in the client for the
+player.
+
+The files are taken from '\data\texture\A_A£AII’„AI«§\illust' directory in the
+GRF file. The filename must be given with no extension, '.bmp' is added by the
+client itself and you can't have any other picture format displayed as a cutin.
+The biggest one that comes with the client is 400x503 pixels, and the smallest
+is 303x493 pixels, it is not known how big a picture has to be before the client
+goes insane. Bright magenta (color FF00FF) is considered to be transparent in
+these pictures. You can easily add and alter them, but how to do this is outside
+of the scope of this document.
+
+The position determines just where on screen the picture will appear:
+ 0 - bottom left corner
+ 1 - bottom middle
+ 2 - bottom right corner
+ 3 - middle of screen in a movable window with an empty title bar.
+ 4 - middle of screen without the window header, but still movable.
+ 255 - will remove the cutin previously displayed.
+
+Giving an empty string for the filename and 255 for the position will remove all
+cutin pictures. Any other position value will not cause a script error but will
+cause the player's client to curl up and die. Only one cutin may be on screen at
+any given time, any new cutins will replace it.
+
+ // This will display the picture of the 7th kafra,
+ // the one in orange and the mini-skirt :P
+ cutin "kafra_7",2;
+
+ // This will remove the displayed picture.
+ cutin "Kafra_7",255;
+
+ // This will remove all pictures displayed.
+ cutin "",255;
+
+The client comes with those cutin pictures preinstalled which you can use:
+
+mets_alpha - This is a old fat man, holding a pipe, also with a pocket watch
+ and cane
+pay_soldier - Wanna take a wild guess, thats right, the Soldiers that appear in
+ Payon :D
+prt_soldier - Obvious
+ein_soldier - This guy looks cool, you've got to see him ;) This picture is for
+ the new Einbroch guards
+moc_soldier - Obvious
+gef_soldier - Obvious
+katsua01 - It is not certain who this girl is (There is no sprite coming with
+katsua02 - the client that seems to match very well) but she is believed to
+katsua03 - be an NPC in official Comodo. The three pictures give different
+ facial expressions.
+kafra_01 - Obvious
+kafra_02 - Obvious
+kafra_03 - Obvious
+kafra_04 - Obvious
+kafra_05 - Obvious
+kafra_06 - Obvious
+kafra_07 - Do I need to mention this one again ;)
+
+---------------------------------------
+
+*cutincard <item id>;
+
+This command will display a card picture as a cutin on the client connected to
+the invoking character, with position number 4 (middle of screen, movable, but
+no title bar). See 'cutin'. To remove this cutin, use the regular 'cutin'
+command. Unlike the 'cutin' command, it will not take a filename, but will
+instead take an item ID. It will then refer to the text file listing card images
+which is normally found within your server's copy of the GRF file to find the
+real (korean) filename.
+
+If your server doesn't have that text file in that GRF or can't read it, it
+probably won't work.
+
+---------------------------------------
+
+*statusup <stat>;
+
+This command will bump a specified stat of the invoking character up by one
+permanently. Stats are to be given as number, but you can use these constants to
+replace them:
+
+bStr - Strength
+bVit - Vitality
+bInt - Intelligence
+bAgi - Agility
+bDex - Dexterity
+bLuk - Luck
+
+---------------------------------------
+
+*statusup2 <stat>,<amount>;
+
+This command will bump a specified stat of the invoking character up by the
+specified amount permanently. The amount can be negative. See 'statusup'.
+
+ // This will decrease a character's Vit forever.
+ statusup bVit,-1;
+
+---------------------------------------
+
+*bonus <bonus type>,<amount>;
+*bonus2 <bonus type>,<amount>;
+*bonus3 <bonus type>,<amount>;
+*bonus4 <bonus type>,<amount>;
+
+These commands are meant to be used in item scripts. They will probably work
+outside item scripts, but the bonus will not persist for long. They, as
+expected, refer only to an invoking character.
+
+You can find the full list of possible bonuses and which command to use for each
+kind in 'doc/item_bonus.txt'.
+
+---------------------------------------
+
+*skill <skill id>,<level>{,<flag>};
+*addtoskill <skill id>,<level>{,<flag>}
+
+These commands will give the invoking character a specified skill. This is also
+used for item scripts.
+
+Level is obvious. Skill id is the ID number of the skill in question as per
+'db/skill_db.txt'. It is not known for certain whether this can be used to give
+a character a monster's skill, but you're welcome to try with the numbers given
+in 'db/mob_skill_db.txt'.
+
+Flag is 0 if the skill is given permanently (will get written with the character
+data) or 1 if it is temporary (will be lost eventually, this is meant for card
+item scripts usage.). The flag parameter is optional, and defaults to 1 in
+'skill' and to 2 in 'addtoskill'.
+
+Flag 2 means that the level parameter is to be interpreted as a stackable
+additional bonus to the skill level. If the character did not have that skill
+previously, they will now at 0+the level given.
+
+// This will permanently give the character Stone Throw (TF_THROWSTONE,152), at
+// level 1.
+ skill 152,1,0;
+
+---------------------------------------
+
+*guildskill <skill id>,<level>{,<flag>}
+
+This command will bump up the specified guild skill by the specified number of
+levels. This refers to the invoking character and will only work if the invoking
+character is a member of a guild AND it's guildmaster, otherwise no failure
+message will be given and no error will occur, but nothing will happen - same
+about the guild skill trying to exceed the possible maximum. The full list of
+guild skills is available in 'db/skill_db.txt', these are all the GD_ skills at
+the end.
+
+The flag parameter is currently not functional and it's a mystery of what it
+would actually do. (Though probably, like for character skills, it would allow
+temporary bumping.) Using this command will bump the guild skill up permanently.
+
+// This would give your character's guild one level of Approval (GD_APPROVAL ID
+// 10000). Notice that if you try to add two levels of Approval, or add
+// Approval when the guild already has it, it will only have one level of
+// Approval afterwards.
+ guildskill 10000,1,0;
+
+You might want to make a quest for getting a certain guild skill, make it hard
+enough that all the guild needs to help or something. Doing this for the Glory
+of the Guild skill, which allows your guild to use an emblem, is a good idea for
+a fun quest. (Wasting a level point on that is really annoying :D)
+
+---------------------------------------
+
+*getskilllv(<skill id>)
+
+This function returns the level of the specified skill that the invoking
+character has. If they don't have the skill, 0 will be returned. The full list
+of character skills is available in 'db/skill_db.txt'.
+
+There are two main uses for this function, it can check whether the character
+has a skill or not, and it can tell you if the level is high enough.
+
+Example 1:
+
+ f (getskilllv(152)) goto L_HasSkillThrowStone;
+ mes "You dont have Throw Stone";
+ close;
+ L_HasSkillThrowStone:
+ mes "You have got the skill Throw Stone";
+ close;
+
+Example 2:
+
+ if (getskilllv(28) >= 5) goto L_HasSkillHeallvl5orMore;
+ if (getskilllv(28) == 10) goto L_HasSkillHealMaxed;
+ mes "You heal skill is below lvl 5";
+ close;
+ L_HasSkillHeallvl6orMore:
+ mes "Your heal lvl is 5 or more";
+ close;
+ L_HasSkillHealMaxed:
+ mes "Your heal lvl has been maxed";
+ close;
+
+---------------------------------------
+
+*getgdskilllv(<guild id>,<skill id>)
+
+This function retirns the guild skills for the guild with a specified ID exactly
+as 'getskilllv' does.
+
+---------------------------------------
+
+*basicskillcheck()
+
+This function will return the state of the configuration option
+'basic_skill_check' in 'battle_athena.conf'. It returns 1 if the option is
+enabled and 0 if it isn't. If the 'basic_skill_check' option is enabled, which
+it is by default, characters must have a certain number of basic skill levels to
+sit, request a trade, use emoticons, etc. Making your script behave differently
+depending on whether the characters must actually have the skill to do all these
+things might in some cases be required.
+
+---------------------------------------
+
+*getgmlevel()
+
+This function will return the GM level of the account to which the invoking
+character belongs. If this is somehow executed from a console command, 99 will
+be returned, and 0 will be returned if the account has no GM level.
+
+This allows you to make NPC's only accessable for certain GM levels, or behave
+specially when talked to by GMs.
+
+ if (getgmlevel()) mes "What is your command, your godhood?";
+ if (getgmlevel()) goto Wherever;
+
+---------------------------------------
+
+*end;
+*break;
+
+This command will stop the execution for this particular script. The two
+versions are prefectly equivalent. It is the normal way to end a script which
+does not use 'mes'.
+
+ if (BaseLevel<=10) goto L_Lvl10;
+ if (BaseLevel<=20) goto L_Lvl20;
+ if (BaseLevel<=30) goto L_Lvl30;
+ if (BaseLevel<=40) goto L_Lvl40;
+ if (BaseLevel<=50) goto L_Lvl50;
+ if (BaseLevel<=60) goto L_Lvl60;
+ if (BaseLevel<=70) goto L_Lvl70;
+ L_Lvl10:
+ npctalk "Look at that you are still a n00b";
+ end;
+ L_Lvl20:
+ npctalk "Look at that you are getting better, but still a n00b";
+ end;
+ L_Lvl30:
+ npctalk "Look at that you are getting there, you are almost 2nd profession now right???";
+ end;
+ L_Lvl40:
+ npctalk "Look at that you are almost 2nd profession";
+ end;
+
+Without the use if 'end' it would travel through the labels until the end of the
+script. If you were lvl 10 or less, you would see all the speech lines, the use
+of 'end' stops this, and ends the script.
+
+Note: Break won't work anymore, it has been commented out in src/map/script.c:
+
+// {buildin_end,"break",""}, this might confuse advanced scripting support [Eoe]
+
+---------------------------------------
+
+*checkoption(<option number>)
+*checkoption1(<option number>)
+*checkoption2(<option number>)
+*setoption <option number>{,type};
+
+The 'setoption' series of functions check for a so-called option that is set on
+the invoking character. 'Options' are used to store status conditions and a lot
+of other non-permanent character data of the yes-no kind. For most common cases,
+it is better to use 'checkcart','checkfalcon','checkpeco' and other similar
+functions, but there are some options which you cannot get at this way. They
+return 1 if the option is set and 0 if the option is not set.
+
+Option numbers valid for the first (option) version of this command are:
+
+0x1 - Sight in effect.
+0x2 - Hide in effect.
+0x4 - Cloaking in effect.
+0x8 - Cart number 1 present.
+0x10 - Falcon present.
+0x20 - Peco Peco present.
+0x40 - GM Perfect Hide in effect.
+0x80 - Cart number 2 present.
+0x100 - Cart number 3 present.
+0x200 - Cart number 4 present.
+0x400 - Cart number 5 present.
+0x800 - Orc head present.
+0x1000 - The character is wearing a wedding sprite.
+0x2000 - Ruwach is in effect.
+0x4000 - Chasewalk in effect.
+
+Option numbers valid for the second version (opt1) of this command are:
+
+1 - Petrified.
+2 - Frozen.
+3 - Stunned.
+4 - Sleeping.
+6 - Petrifying (the state where you can still walk)
+
+Option numbers valid for the third version (opt2) of this command are:
+
+1 - Poisoned.
+2 - Cursed.
+4 - Silenced.
+8 - Signum Crucis (plays a howl-like sound effect, but otherwise no visible effects are displayed)
+16 - Blinded.
+
+Option numbers (except for opt1) are bitmasks - you can add them up to check
+ for several states, but the functions will return true if at least one of them
+ is in effect.
+
+'setoption' will set options on the invoking character. There are no second and
+third versions of this command, so you can only change the values in the first
+list (cloak, cart, ruwach, etc). if flag is 1 (default when omitted),
+the option will be added to what the character currently has; if 0, the option is removed.
+
+This is definitely not a complete list of available option flag numbers. Ask a
+core developer (or read the source: src/map/status.h) for the full list.
+
+---------------------------------------
+
+*setcart;
+*checkcart()
+
+This command will give the invoking character a cart. The cart given will be
+cart number 1 and will work regardless of whether the character is a merchant
+class or not.
+
+The accompanying function will return 1 if the invoking character has a cart
+(any kind of cart) and 0 if they don't.
+
+ if (checkcart()) mes "But you already have a cart!";
+
+---------------------------------------
+
+*setfalcon;
+*checkfalcon()
+
+This command will give the invoking character a falcon. The falcon will be there
+regardless of whether the character is a hunter or not. It will (probably) not
+have any useful effects for non-hunters though.
+
+The accompanying function will return 1 if the invoking character has a falcon
+and 0 if they don't.
+
+ if (checkfalcon()) mes "But you already have a falcon!";
+
+---------------------------------------
+
+*setriding;
+*checkriding()
+
+This command will give the invoking character a PecoPeco (if they are a Knight
+series class) or a GrandPeco (if they are a Crusader seriesclass). Unlike
+'setfalcon' and 'setcart' this will not work at all if they aren't of a class
+which can ride. This will work if the character doesn't have the riding skill,
+however.
+
+The accompanying function will return 1 if the invoking character is riding a
+bird and 0 if they don't.
+
+ if (checkriding()) mes "PLEASE leave your bird outside! No riding birds on the floor here!";
+
+---------------------------------------
+
+*savepoint "<map name>",<x>,<y>;
+*save "<map name>",<x>,<y>;
+
+This command saves a point that the invoking character will return to upon
+'return to save point' if dead or in some other cases. The two versions are
+equivalent. Map name, X coordinate and Y coordinate should be perfectly obvious.
+This ignores any and all map flags, and can make a character respawn where no
+teleportation is otherwise possible.
+
+ savepoint "place.gat",350,75;
+
+---------------------------------------
+
+*gettimetick(<tick type>)
+
+This function will return the system time in UNIX epoch time (if tick type is 2)
+or the time since the start of the current day in seconds if tick type is 1.
+Passing 0 will make it return the server's tick, which is a measurement in
+milliseconds used by the server's timer system. The server's tick is an
+unsigned int which loops every ~50 days.
+
+Just in case you don't know, UNIX epoch time is the number of seconds elapsed
+since 1st of January 1970, and is useful to see, for example, for how long the
+character has been online with OnPCLoginEvent and OnPCLogoutEvent, which could allow
+you to make an 'online time counted for conviction only' jail script.
+
+---------------------------------------
+
+*gettime(<type>)
+
+This function will return specified information about the current system time.
+
+1 - Seconds (of a minute)
+2 - Minutes (of an hour)
+3 - Hour (of a day)
+4 - Week day (0 for Sunday, 6 is Saturday)
+5 - Day of the month.
+6 - Number of the month.
+7 - Year.
+8 - Day of the year.
+
+It will only return numbers.
+
+ if (gettime(4)==6) mes "It's a Saturday. I don't work on Saturdays.";
+
+---------------------------------------
+
+*gettimestr(<format string>,<max length>)
+
+This function will return a string containing time data as specified by the
+format string.
+
+This uses the C function 'strfmtime', which obeys special format characters. For
+a full description see, for example, the description of 'strfmtime' at
+http://www.delorie.com/gnu/docs/glibc/libc_437.html
+All the format characters given in there should properly work.
+Max length is the maximum length of a time string to generate.
+
+The example given in eAthena sample scripts works like this:
+
+ mes gettimestr("%Y-%m/%d %H:%M:%S",21);
+
+This will print a full date and time like 'YYYY-MM/DD HH:MM:SS'.
+
+---------------------------------------
+
+*openstorage;
+
+This will open a character's Kafra storage window on the client connected to the
+invoking character. It does not check wherever it is run from, so you can allow
+any feasible NPC to open a kafra storage. (It's not certain whether this works
+in item scripts, but if it does, it could be interesting.)
+
+The storage window might not open if a message box or a trade deal is present on
+screen already, so you should at least make sure the message box is closed
+before you open storage.
+
+ mes "I will now open your stash for you";
+ close2;
+ openstorage;
+ end;
+
+---------------------------------------
+
+*guildopenstorage()
+
+This function works the same as 'openstorage' but will open a guild storage
+window instead for the guild storage of the guild the invoking character belongs
+to. This is a function because it returns a value - 0 if the guild storage was
+opened successfully and 1 if it wasn't. (Notice, it's a ZERO upon success.)
+Since guild storage is only accessible to one character at one time, it may fail
+if another character is accessing the guild storage at the same time.
+
+This will also fail and return 2 if the character does not belong to any guild.
+
+---------------------------------------
+
+*itemskill <skill id>,<skill level>,"<skill name to show>";
+
+This is a command meant for item scripts to replicate single-use skills. It will
+not work properly in NPC scripts a lot of the time because casting a skill is
+not allowed when there is a message window or menu on screen. If there isn't one
+cause you've made sure to run this when they already closed it, it should work
+just fine and even show a targeting pointer if this is a targeting skill.
+
+// When you use Anodyne, you will cast Endure(8) level 1,
+// and "Endure" will appear above your head as you use it.
+605,Anodyne,Anodyne,11,2000,0,100,,,,,10477567,2,,,,,{ itemskill 8,1,"Endure"; },{}
+
+
+---------------------------------------
+
+*produce <item level>;
+
+This command will open a crafting window on the client connected to the invoking
+character. The 'item level' is a number which determines what kind of a crafting
+window will pop-up. You can see the full list of such item levels in
+'db/produce_db.txt' which determines what can actually be produced.
+The window will not be empty only if the invoking character can actually produce
+the items of that type and has the appropriate raw materials in their inventory.
+
+Valid item levels are:
+
+ 1 - Level 1 Weapons
+ 2 - Level 2 Weapons
+ 3 - Level 3 Weapons
+ 16 - Blacksmith's Stones and Metals
+ 32 - Alchemist's Potions
+ 64 - Whitesmith's Coins
+ 123 - Whitesmith's Nuggets
+ 256 - Assassin Cross's Deadly Poison
+
+---------------------------------------
+
+*monster "<map name>",<x>,<y>,"<name to show>",<mob id>,<amount>{,"<event label>"};
+*areamonster "<map name>",<x1>,<y1>,<x2>,<y2>,"<monster name>",<amount>{,"<event label>"};
+
+This command will spawn a monster on the specified coordinates on the specified
+map. If the script is invoked by a character, a special map name, "this", will
+be recognised to mean the name of the map the invoking character is located at.
+This command works fine in the item scripts.
+
+The same command arguments mean the same things as described above in the
+beginning of this document when talking about permanent monster spawns. Monsters
+spawned in this manner will not respawn upon being killed.
+
+Unlike the permanent monster spawns, if the mob id is -1, a random monster will
+be picked from the entire database according to the rules configured in the
+server for dead branches. This will work for all other kinds of non-permanent
+monster spawns.
+
+The only very special thing about this command is an event label, which is an
+optional parameter. This label is written like '<NPC object name>::<label name>'
+and upon the monster being killed, it will execute the script inside of the
+specified NPC object starting from the label given. The RID of the player
+attached at this execution will be the RID of the killing character.
+
+ monster "place.gat",60,100,"Poring",1002,1,"NPCNAME::OnLabel";
+
+If you do not specify any event label, a label in the NPC object that ran this
+command, called 'OnMyMobDead:' will execute anyway, if present.
+
+The coordinates of 0,0 will spawn the monster on a random place on the map.
+
+The 'areamonster' command works much like the 'monster' command and is not
+significantly different, but spawns the monsters within a square defined by
+x1/y1-x2/y2.
+
+Simple monster killing script:
+
+ <Normal NPC object definition. Let's assume you called him NPCNAME.>
+ mes "[Summon Man]";
+ mes "Want to start the kill?";
+ next;
+ menu "Yes",L_Yes,"No",-;
+ mes "[Summon Man]";
+ mes "Come back later";
+ close;
+ L_Yes:
+ monster "prontera.gat",0,0,"Quest Poring",1002,10,"NPCNAME::OnPoringKilled";
+ // By using 0,0 it will spawn them in a random place.
+ mes "[Summon Man]";
+ mes "Now go and kill all the Poring I summoned";
+ // He summoned ten.
+ close;
+ L_PoringKilled:
+ set $PoringKilled,$PoringKilled+1;
+ if ($PoringKilled==10) goto L_AllDead;
+ end;
+ L_AllDead:
+ announce "Summon Man: Well done all the poring are dead",3;
+ set $PoringKilled,0;
+ end;
+
+For more good examples see just about any official 2-1 or 2-2 job quest script.
+
+---------------------------------------
+
+*killmonster "<map name>","<event label>";
+
+This command will kill all monsters that were spawned with 'monster' or
+'addmonster' and have a specified event label attached to them. Commonly used to
+get rid of remaining quest monsters once the quest is complete.
+
+If the label is given as "All", all monsters which have their respawn times set
+to -1 (like all the monsters summoned with 'monster' or 'areamonster' script
+command, and all monsters summoned with GM commands, but no other ones - that
+is, all non-permanent monsters) on the specified map will be killed regardless
+of the event label value.
+
+---------------------------------------
+
+*killmonsterall "<map name>";
+
+This command will kill all monsters on a specified map name, regardless of how
+they were spawned or what they are.
+
+---------------------------------------
+*clone "<map name>",<x>,<y>,"<event>",<char id>{,<master_id>{,<mode>{,<flag>,<duration>}}}
+
+This command creates a monster which is a copy of another player. The first
+four arguments serve the same purpose as in the monster script command, The
+<char id> is the character id of the player to clone (player must be online).
+If <master id> is given, the clone will be a 'slave/minion' of it. Master_id
+must be a character id of another online player.
+
+The mode can be specified to determine the behaviour of the clone, it's
+values are the same as the ones used for the mode field in the mob_db. The
+default mode is aggressive, assists, can move, can attack.
+
+Flag can be either zero or one currently. If zero, the clone is a normal
+monster that'll target players, if one, it is considered a summoned monster,
+and as such, it'll target other monsters. Defaults to zero.
+
+The duration specifies how long the clone will live before it is auto-removed.
+Specified in seconds, defaults to no limit (zero).
+
+Returned value is the monster ID of the spawned clone. If command fails,
+returned value is zero.
+
+---------------------------------------
+
+*doevent "<NPC object name>::<event label>";
+
+This command will start a new execution thread in a specified NPC object at the
+specified label. The execution of the script running this command will not stop.
+No parameters may be passed with a doevent call.
+
+The script of the NPC object invoked in this manner will run as if it's been
+invoked by the RID that was active in the script that issued a 'doevent'.
+
+ place.gat,100,100,1%TAB%script%TAB%NPC%TAB%53,{
+ mes "This is what you will see when you click me";
+ close;
+ Label:
+ mes "This is what you will see if the doevent is activated";
+ close;
+ }
+
+ ....
+
+ doevent "NPC::Label";
+
+---------------------------------------
+
+*donpcevent "<event label>";
+
+This command is kinda confusing cause it performs in two completely different
+ways.
+
+If the event label is phrased like "::<label name>", all NPC objects that have a
+specified label in them will be invoked as if by a 'doevent', but no RID
+whatsoever will be attached while they execute.
+
+Otherwise, if the label is given as "<NPC name>::<label name>", a label within
+the NPC object that runs this command will be called, but as if it was running
+inside another, specified NPC object. No RID will be attached to it in this case
+either.
+
+This can be used for making another NPC react to an action that you have done
+with the NPC that has this command in it, i.e. show an emotion, or say
+something.
+
+ place.gat,100,100,1%TAB%script%TAB%NPC%TAB%53,{
+ mes "Hey NPC2 copy what I do";
+ close2;
+ set @emo, rand(1,30);
+ donpcevent "NPC2::Emo";
+ Emo:
+ emotion @emo;
+ end;
+ }
+
+ place.gat,102,100,1%TAB%script%TAB%NPC2%TAB%53,{
+ mes "Hey NPC copy what I do";
+ close2;
+ set @emo, rand(1,30);
+ donpcevent "NPC::Emo";
+ Emo:
+ emotion @emo;
+ end;
+ }
+
+This will make both NPC perform the same random emotion from 1 to 30, and the
+emotion will appear above each of their heads.
+
+---------------------------------------
+
+*addtimer <ticks>,"<NPC object name>::<label>";
+*deltimer "<NPC object name>::<event label>";
+*addtimercount <ticks>,"<NPC object name>::<event label>";
+
+These commands will create, destroy, and delay a countdown timer - 'addtimer' to
+create, 'deltimer' to destroy and 'addtimercount' to delay it by the specified
+number of ticks. For all three cases, the event label given is the identifier of
+that timer.
+
+When this timer runs out, a new execution thread will start in the specified NPC
+object at the specified label. If no such label is found in the NPC object, it
+will run as if clicked. In either case, no RID will be attached during
+execution.
+
+The ticks are given in 1/1000ths of a second.
+
+---------------------------------------
+
+*stoptimer;
+*inittimer;
+*enablearena;
+*disablearena;
+*cmdothernpc "<npc name?>","<command?>";
+
+This set of commands is marked as added by someone going under the nickname
+'RoVeRT', as mentioned the source code comments, and has to do with timers and
+scheduling working entirely unlike any other timing commands. It is not certain
+that they actually even work properly anymore, and most of these read no
+arguments, though the 'inittimer'/'stoptimer' pair of commands has to do
+something with an 'OnTimer' label and will probably invoke it and 'cmdothernpc'
+will execute starting with the label 'OnCommand'. Whatever they actually do, the
+other commands can most likely do it better. The two arena commands definitely
+do not do anything useful at all.
+
+None of these commands are used in any scripts bundled with eAthena. Most
+probably they are deprecated and left in by mistake.
+
+Unless RoVeRT can be found and asked to clarify what these were made for, that
+is.
+
+---------------------------------------
+
+*initnpctimer{ "<NPC object name>"};
+*stopnpctimer{ "<NPC object name>"};
+*startnpctimer{ "<NPC object name>"};
+*setnpctimer <tick>{,"<NPC object name>"};
+*getnpctimer(<type of information>{,"<NPC object name>"});
+*attachnpctimer {"<character name>"};
+*detachnpctimer {"<NPC object name>"};
+
+This set of commands and functions will create and manage an NPC-object based
+timer. The NPC object may be declared by name, or the name in all cases may be
+omitted, in that case this timer will be based in the object the current script
+is running in.
+
+Why is it actually part of an NPCs structure we aren't sure, but it is, and
+while 'addtimer'/'deltimer' commands will let you have many different timers
+referencing different labels in the same NPC, one each and each with their own
+countdown, 'initnpctimer' can only have one per NPC object. But it can trigger
+many labels and it can let you know how many were triggered already and how many
+still remain.
+
+This timer is counting up from 0 in ticks of 1/1000ths of a second each. Upon
+creating this timer, the execution will not stop, but will happily continue
+onward. The timer will then invoke new execution threads at labels
+"OnTimer<time>:" in the NPC object it is attached to.
+
+To create the timer, use the 'initnpctimer', which will start it running.
+'stopnpctimer' will pause the timer, without clearing the current tick, while
+'startnpctimer' will let the paused timer continue.
+
+It is not quite clear whether the new invocations will always have a RID.
+Apparently, the RID that was in effect when the timer was initialised will still
+be attached to these executions in some cases, but it's not quite clear -
+experiment with RID-dependent commands, like 'mes', and tell us what happens and
+who gets the message, if anyone.
+
+Even if they don't have a RID by default, 'attachnpctimer' will allow you to
+explicitly attach a character's RID to the timer, which will make them the
+target for all character-referencing commands and functions, not to mention
+variables. 'detachnpctimer' will make the RID zero, making all character-
+referencing functions fail with an error.
+
+'setnpctimer' will explicitly set the timer to a given tick. To make it useful,
+you will need the 'getnpctimer' function, which the type of information argument
+means:
+
+ 0 - Will return the current tick count of the timer.
+ 1 - Will return 1 if there are remaining "OnTimer<ticks>:" labels in the
+ specified NPC waiting for execution.
+ 2 - Will return the number of times the timer has triggered an "OnTimer<tick>:"
+ label in the specified NPC.
+
+Example 1:
+
+ <NPC Header> {
+ initnpctimer;
+ npctalk "I cant talk right now, give me 10 seconds";
+ end;
+ OnTimer5000:
+ npctalk "Ok 5 seconds more";
+ end;
+ OnTimer6000:
+ npctalk "4";
+ end;
+ OnTimer7000:
+ npctalk "3";
+ end;
+ OnTimer8000:
+ npctalk "2";
+ end;
+ OnTimer9000:
+ npctalk "1";
+ end;
+ OnTimer10000:
+ stopnpctimer;
+ mes "[Man]";
+ mes "Ok we can talk now";
+ }
+
+Example 2:
+
+ OnTimer15000:
+ set $quote,rand(5);
+ if($quote == 0) goto Lquote0;
+ if($quote == 1) goto Lquote1;
+ if($quote == 2) goto Lquote2;
+ if($quote == 3) goto Lquote3;
+ if($quote == 4) goto Lquote4;
+ Lquote0:
+ npctalk "If 0 is randomly picked you will see this";
+ setnpctimer 0;
+ end;
+ Lquote1:
+ npctalk "If 1 is randomly picked you will see this";
+ setnpctimer 0;
+ end;
+ Lquote2:
+ npctalk "If 2 is randomly picked you will see this";
+ setnpctimer 0;
+ end;
+ Lquote3:
+ npctalk "If 3 is randomly picked you will see this";
+ setnpctimer 0;
+ end;
+ Lquote4:
+ npctalk "If 4 is randomly picked you will see this";
+ setnpctimer 0;
+ end;
+
+ // This OnInit label will run when the script is loaded, so that the timer
+ // is initialised immediately as the server starts. It is dropped back to 0
+ // every time the NPC says something, so it will cycle continiously.
+ OnInit:
+ initnpctimer;
+ end;
+
+Example 3:
+
+ mes "[Man]";
+ mes "I have been waiting "+(getnpctimer(0)/1000)+" seconds for you";
+ // we divide the timer returned by 1000 cause it will be displayed in
+ // milliseconds otherwise
+ close;
+
+Example 4:
+
+ mes "[Man]";
+ mes "Ok I will let you have 30 sec more";
+ close2;
+ setnpctimer (getnpctimer(0)-30000);
+ // Notice the 'close2'. If there were a 'next' there the timer would be
+ // changed only after the player pressed the 'next' button.
+ end;
+
+---------------------------------------
+
+*announce "<text>",<flag>{,<color>}
+
+This command will broadcast a message to all or most players, similar to
+@kami/@kamib GM commands.
+
+The region the broadcast is heard in and the color the message will come up as
+will be determined by the flags:
+
+ announce "This will be shown to everyone at all in yellow.",0;
+
+The flag values are coded as constants in db/const.txt to make them easier to use:
+- bc_all: Broadcast message is sent server-wide
+- bc_map: Message is sent to everyone in the same map
+- bc_area: Message is sent to players in the vecinity of the source.
+- bc_self: Message is sent only to current player.
+
+- bc_npc: Broadcast source is the npc, not the player attached to the script
+ (useful when a player is not attached or the message should be sent to those
+ nearby the npc)
+
+- bc_yellow: The default is to send broadcasts in yellow color.
+- bc_blue: Alternate broadcast is displayed in blue color.
+
+The optional parameter, color, allows usage of broadcasts in any custom color.
+The color parameter is a single number which can be in hexadecimal notation.
+For example:
+ announce "This will be shown to everyone at all in yellow.",bc_all,0xFFFF00;
+Will display a global announce in yellow. The color format is in RGB (0xRRGGBB).
+
+Using this for private messages to players is probably not that good an idea,
+but it can be used instead in NPCs to "preview" an announce.
+
+ // This will be a private message to the player using the NPC that made the
+ // annonucement
+ announce "This is my message just for you",bc_blue|bc_self;
+
+ // This will be shown on everyones screen that is in sight of the NPC.
+ announce "This is my message just for you people here",bc_area;
+
+---------------------------------------
+
+*mapannounce "<map name>","<text>",<flag>[,<color>];
+
+This command will work like 'announce' but will only broadcast to characters
+currently residing on the specified map. The flag and optional color
+parameters are the same as in 'announce', even though the only ones that make
+sense are the color related ones.
+
+---------------------------------------
+
+*areaannounce "<map name>",<x1>,<y1>,<x2>,<y2>,"<text>",<flag>[,<color>];
+
+This command works like 'announce' but will only broadcast to characters
+residing in the specified x1/y1-x2/y2 square on the map given. The flags and
+color parameter given are the same as in 'announce', but only the color
+related ones have effect.
+
+ areaannounce "prt_church.gat",0,0,350,350,"God's in his heaven, all right with the world",0;
+
+---------------------------------------
+
+*getusers(<type>)
+
+This function will return a number of users on a map or the whole server. What
+it returns is specified by Type.
+
+Type is a bitmask, add up to get the effects you want:
+
+ 8 - This will count all characters on the same map as the current NPC.
+ (By default, it will count people on the same map as the character)
+ 7 - Return the amount of players for the entire server.
+ (By default, only the players on the map will be counted.)
+
+So 'getusers(0)' will return the number of characters on the same map as the
+invoking character, while 'getusers(7)' will give the count for entire server.
+
+---------------------------------------
+
+*getmapusers("<map name>")
+
+This function will return the number of users currently located on the specified
+map.
+
+Currently being used in the PVP scripts to check if a PVP room is full of not,
+if the number returned it equal to the maximum allowed it will not let you
+enter.
+
+---------------------------------------
+
+*getareausers("<map name>",<x1>,<y1>,<x2>,<y2>)
+
+This function will return the count of connected characters which are located
+within the specified area - an x1/y1-x2/y2 square on the specified map.
+
+This is useful for maps that are split into many buildings, such as all the
+"*_in.gat" maps, due to all the shops and houses.
+
+---------------------------------------
+
+*getareadropitem("<map name>",<x1>,<y1>,<x2>,<y2>,<item>)
+
+This function will count all the items with the specified ID number lying on the
+ground on the specified map within the x1/y1-x2/y2 square on it and return that
+number.
+
+This is the only function around where a parameter may be either a string or a
+number! If it's a number, it means that only the items with that item ID number
+will be counted. If it is a string, it is assumed to mean the 'english name'
+field from the item database. If you give it an empty string, or something that
+isn't found from the item database, it will count items number '512' (apples).
+
+---------------------------------------
+
+*disablenpc "<NPC object name>";
+*enablenpc "<NPC object name>";
+
+These two commands will disable and enable, respectively, an NPC object
+specified by name. The disabled NPC will disappear from sight and will no longer
+be triggerable in the normal way. It is not clear whether it will still be
+accessible through 'donpcevent' and other triggering commands, but it probably
+will be. You can disable even warp NPCs if you know their object names, which is
+an easy way to make a map only accessible through walking half the time. Then
+you 'enablenpc' them back.
+
+You can also use these commands to create the illusion of an NPC switching
+between several locations, which is often better than actually moving the NPC -
+create one NPC object with a visible and a hidden part to their name, make a few
+copies, and then disable all except one.
+
+---------------------------------------
+
+*hideonnpc "<NPC object name>";
+*hideoffnpc "<NPC object name>";
+
+These commands will make the NPC object specified display as hidden/visible,
+even though not actually disabled per se. Hidden as in thief Hide skill, but
+unfortunately, not detectable by Ruwach or Sight.
+
+As they are now, these commands are pointless, it is suggested to use
+'disablenpc'/'enablenpc', because these two commands actually unload the NPC
+sprite location and other accompanying data from memory when it is not used.
+However, you can use these for some quest ideas (such as cloaking npcs talking
+while hidden then revealing.... you can wonder around =P
+
+---------------------------------------
+
+*sc_start <effect type>,<ticks>,<extra argument>{,<target ID number>};
+*sc_start2 <effect type>,<ticks>,<extra argument>,<percent chance>{,<target ID number>};
+*sc_start4 <effect type>,<ticks>,<value 1>,<value 2>,<value 3>,<value 4>{,<target ID number>};
+*sc_end <effect type>{,<target ID number>};
+
+These command bestow a status effect on the invoking character. This command is
+used a lot in the item scripts.
+
+ // This would poison them for 10 min
+ sc_start SC_Poison,600000,0;
+
+Effect type is a number of effect, 'db/const.txt' lists the common (mostly
+negative) status effect types as constants, starting with 'SC_'. You can also
+use this to give someone an effect of a player-cast spell:
+
+ // This will bless someone as if with Bless 10:
+ sc_start 10,240000,10;
+
+Extra argument's meaning differs depending on the effect type, for most effects
+caused by a player skill the extra argument means the level of the skill that
+would have been used to create that effect, for others it might have no meaning
+whatsoever. You can actually bless someone with a 0 bless spell level this way,
+which is fun, but weird.
+
+The target ID number, if given, will cause the status effect to appear on a
+specified character, instead of the one attached to the running script. This has
+not been properly tested.
+
+'sc_start2' is perfectly equivalent, but unlike 'sc_start', a status change
+effect will only occur with a specified percentage chance. 10000 given as the
+chance is equivalent to a 100% chance, 0 is a zero.
+
+'sc_start4' is just like sc_start, however it takes four parameters for the
+status change instead of one. What these values are depends on the status
+change in question. For example, elemental armor defense takes the following
+four values:
+- val1 is the first element, val2 is the resistance to the element val1.
+- val3 is the second element, val4 is the resistance to said element.
+eg: sc_start4 SC_DefEle,60000,Ele_Fire,20,Ele_Water,-15;
+
+'sc_end' will remove a specified status effect.
+
+You can see the full list of status effects caused by skills in
+'src/map/status.h' - they are currently not fully documented, but most of that
+should be rather obvious.
+
+---------------------------------------
+
+*getscrate(<effect type>,<base rate>{,<target ID number>})
+
+This function will return the chance of a status effect affecting the invoking
+character, in percent, modified by the their current defense against said
+status. The 'base rate' is the base chance of the status effect being inflicted,
+in percent.
+
+ if (rand(100) > getscrate(Eff_Blind, 50)) goto BlindHimNow;
+
+You can see the full list of available effect types you can possibly inflict in
+'db/const.txt' under 'Eff_'.
+
+It is pretty certain that addressing the target by an ID number will not
+currently work due to a bug.
+
+---------------------------------------
+
+*callshop "<shop name>",<flag>;
+
+This command forces an npc shop to be invoked as if the player clicked on it.
+With normal shops it will not work unless the player is within clicking range,
+but the real use of this script command is together with "invisible shops",
+which are specified in the same way an invisible npc would be specified.
+For example, a generic invisible tool shop could be:
+
+- shop INVISIBLE_SHOP -,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1
+
+Which players cannot click on, but can be invoked using:
+
+callshop "INVISIBLE_SHOP", 0;
+
+The flag values are: 1 invokes the buying window, 2 invokes the selling
+window, any other value invokes the buy/sell dialogue.
+
+The function returns 1 on success, and the script is not automatically
+closed, so be careful to not do any item trading on the same script to prevent
+possible exploits (if possible, use close or close2 before invoking the shop
+itself).
+
+---------------------------------------
+
+*debugmes "<message>";
+
+This command will send the message to the server console (map-server window). It
+will not be displayed anywhere else.
+
+ debugmes strcharinfo(0)+" has just done this that and the other";
+ // You would see in the map-server window "NAME has just done this that and
+ // the other"
+
+---------------------------------------
+
+*pet <pet id>;
+
+This command is used in all the item scripts for taming items. Running this
+command will make the pet catching cursor appear on the client connected to the
+invoking character, usable on the monsters with the specified pet ID number. It
+will still work outside an item script.
+
+A full list of pet IDs can be found inside 'db/pet_db.txt'
+
+---------------------------------------
+
+*bpet;
+
+This command opens up a pet hatching window on the client connected to the
+invoking character. It is used in item script for the pet incubators and will
+let the player hatch an owned egg. If the character has no eggs, it will just
+open up an empty incubator window.
+This is still usable outside item scripts.
+
+---------------------------------------
+
+*resetlvl <action type>;
+
+This is a character reset command, meant mostly for rebirth script supporting
+Advanced jobs, which will reset the invoking character's stats and level
+depending on the action type given. Valid action types are:
+
+ 1 - Base level 1, Job level 1, 0 skill points, 0 base xp, 0 job xp, wipes the
+ status effects, sets all stats to 1. If the new job is 'Novice High', give
+ 100 status points, give First Aid and Play Dead skills.
+ 2 - Base level 1, Job level 1, 0 skill points, 0 XP/JXP. Skills and attribute
+ values are not altered.
+ 3 - Base level 1, base xp 0. Nothing else is changed.
+ 4 - Job level 1, job xp 0. Nothing else is changed.
+
+In all cases it will also unequip everything the character has on.
+
+Even though it doesn't return a value, it is used as a function in the official
+rebirth scripts. Ask AppleGirl why.
+
+---------------------------------------
+
+*resetstatus;
+
+This is a character reset command, which will reset the stats on the invoking
+character and give back all the stat points used to raise them previously.
+Nothing will happen to any other numbers about the character.
+
+Used in reset NPC's (duh!)
+
+---------------------------------------
+
+*resetskill;
+
+This command takes off all the skill points on the invoking character, so they
+only have Basic Skill blanked out (lvl 0) left, and returns the points for them
+to spend again. Nothing else will change but the skills. Quest skills will also
+reset if 'quest_skill_reset' option is set to Yes in 'battle_athena.conf'. If
+the 'quest_skill_learn' option is set in there, the points in the quest skills
+will also count towards the total.
+
+Used in reset NPC's (duh!)
+
+---------------------------------------
+
+*changebase <job ID number>;
+
+This will change the appearance of the invoking character to that of a specified
+job class. Nothing but appearance will change. This command is used in item
+scripts for "Wedding Dress" and "Tuxedo" so the character like job 22, which is
+the job number of the wedding sprites.
+
+It would be entered in the equip bonus section of an item
+
+2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,119529470,7,0,16,,0,1,0,{ bonus bMdef,15; changebase 22; }
+
+This command only works when inside item scripts.
+
+---------------------------------------
+
+*changesex;
+
+This command will change the gender for the attached character's account. If it
+was male, it will become female, if it was female, it will become male. The
+change will be written to the character server, but there is no way to send this
+information to the client, so the player will continue to see their character as
+the gender it previously was. What the other players will see before the
+relogin is not clear.
+
+If the character currently connected when this command was invoked was a
+Dancer/Gypsy or Bard/Clown, they will become a Swordman upon 'changesex'.
+Whatever happens to their skills is not clear. Whatever happens if another
+character on the same account was a gender-specific class is not clear either,
+but it's likely that the client will have serious issues with that, since no
+other characters on the same account will get altered.
+
+There's good reasons to be very careful when using this command.
+
+---------------------------------------
+
+*waitingroom "<chatroom name>",<limit>{,<event label>,<trigger>};
+
+This command will create a chat room, owned by the NPC object running this
+script and displayed above the NPC sprite.
+The maximum length of a chatroom name is 60 letters.
+
+The limit is the maximum number of people allowed to enter the chat room. If the
+optional event and trigger parameters are given, the event label
+("<NPC object name>::<label name>") will be invoked as if with a 'doevent' upon
+the number of people in the chat room reaching the given triggering amount.
+
+It's funny, but for compatibility with jAthena, you can swap the event label and
+the trigger parameters, and it will still work.
+
+// The NPC will just show a box above its head that says "Hello World", clicking
+// it will do nothing, since the limit is zero.
+ waitingroom "Hello World",0;
+
+// The NPC will have a box above its head, it will say "Disco - Waiting Room"
+// and will have 8 waiting slots. Clicking this will enter the chat room, where
+// the player will be able to wait until 8 people accumulate. Once this happens,
+// it will cause the NPC "Bouncer" run the label "OnStart"
+
+ waitingroom "Disco - Waiting Room",8,"Bouncer::OnStart",8;
+
+Creating a waiting room does not stop the execution of the script and it will
+continue to the next line.
+
+For more examples see the 2-1 and 2-2 job quest scripts which make extensive use
+of waiting rooms.
+
+---------------------------------------
+
+*delwaitingroom {"<NPC object name"};
+
+This command will delete a waiting room. If no parameter is given, it will
+delete a waiting room attached to the NPC object running this command, if it is,
+it will delete a waiting room owned by another NPC object. This is the only way
+to get rid of a waiting room, nothing else will cause it to disappear.
+
+It's not clear what happens to a waiting room if the NPC is disabled with
+'disablenpc', by the way.
+
+---------------------------------------
+
+*enablewaitingroomevent {"<NPC object name>"};
+*disablewaitingroomevent {"<NPC object name>"};
+
+This will enable and disable triggering the waiting room event (see
+'waitingroom') respectively. Optionally giving an NPC object name will do that
+for a specified NPC object. The chat room will not disappear when triggering is
+disabled and enabled in this manner and players will not be kicked out of it.
+Enabling a chat room event will also cause it to immediately check whether the
+number of users in it exceeded the trigger amount and trigger the event
+accordingly.
+
+Normally, whenever a waiting room was created to make sure that only one
+character is, for example, trying to pass a job quest trial, and no other
+characters are present in the room to mess up the script.
+
+---------------------------------------
+
+*getwaitingroomstate(<information type>{,"<NPC object name>"})
+
+This function will return information about the wating room state for the
+attached waiting room or for a waiting room attached to the specified NPC if
+any.
+
+The valid information types are:
+
+ 0 - Number of users currently chatting.
+ 1 - Maximum number of users allowed.
+ 2 - Will return 1 if the waiting room has a trigger set.
+ 0 otherwise.
+ 3 - Will return 1 if the waiting room is currently disabled.
+ 0 otherwise.
+ 4 - The Title of the waiting room (string)
+ 5 - Password of the waiting room, if any. Pointless, since there is no way to
+ set a password on a waiting room right now.
+ 16 - Event name of the waiting room (string)
+ 32 - Whether or not the waiting room is full.
+ 33 - Whether the amount of users in the waiting room is higher than the trigger
+ number.
+
+---------------------------------------
+
+*warpwaitingpc "<map name>",<x>,<y>{,<number of people>};
+
+This command will warp the amount of characters equal to the trigger number of
+the waiting room chat attached to the NPC object running this command to the
+specified map and coordinates, kicking them out of the chat. Those waiting the
+longest will get warped first. It can also do a random warp on the same map
+("Random" instead of map name) and warp to the save point ("SavePoint").
+
+The list of characters to warp is taken from the list of the chat room members.
+Those not in the chat room will not be considered even if they are talking to
+the NPC in question. If the number of people is given, exactly this much people
+will be warped.
+
+This command can also keep track of who just got warped. It does this by setting
+special variables:
+
+$@warpwaitingpc[] is an array containing the character id numbers of the
+ characters who were just warped.
+$@warpwaitingpcnum contains the number of the character it just warped.
+
+See also 'getpartymember' for advice on what to do with those variables.
+
+The obvious way of using this effectively would be to set up a waiting room for
+two characters to be warped onto a random PVP map for a one-on-one duel, for
+example.
+
+---------------------------------------
+
+*waitingroomkickall {"<NPC object name>"};
+
+This command would kick everybody out of a specified waiting room chat. IF it
+was properly linked into the script interpreter which it isn't, even though the
+code for it is in place. Expect this to become available in upcoming SVN
+releases.
+
+---------------------------------------
+
+*attachrid(<character ID>)
+*detachrid
+
+A 'RID' is an ID of a character who caused the NPC script to run, as has been
+explained above in the introduction section. Quite a bit of commands want a RID
+to work, since they wouldn't know where to send information otherwise. And in
+quite a few cases the script gets invoked with a RID of zero (like through
+OnTime special labels). If an NPC script needs this, it can attach a specified
+character's id to itself. by calling the 'attachrid' function.
+
+'attachrid' returns 1 if the character was found online and 0 if it wasn't.
+
+This could also be used, while running in a script invoked by a character
+through talking to an NPC, to mess with other characters.
+Detaching the RID will make the RID of the script zero.
+
+---------------------------------------
+
+*isloggedin(<character id>)
+
+This function returns 1 if the specified character is logged in and 0 if they
+aren't.
+
+---------------------------------------
+
+*setmapflagnosave "<map name>","<alternate map name>",<x>,<y>;
+
+This command sets the 'nosave' flag for the specified map and also gives an
+alternate respawn-upon-relogin point.
+
+It does not make a map impossible to make a savepoint on as you would normally
+think, 'savepoint' will still work. It will, however, make the specified map
+kick the reconnecting players off to the alternate map given to the coordinates
+specified.
+
+---------------------------------------
+
+*setmapflag "<map name>",<flag>;
+
+This command marks a specified map with a map flag given. Map flags alter the
+behavior of the map, you can see the list of the available ones in
+'db/const.txt' under 'mf_'.
+
+The map flags alter the behavior of the map regarding teleporting (mf_nomemo,
+mf_noteleport, mf_nowarp, mf_nogo) storing location when disconnected
+(mf_nosave), dead branch usage (mf_nobranch), penalties upon death
+(mf_nopenalty, mf_nozenypenalty), PVP behavior (mf_pvp, mf_pvp_noparty,
+mf_pvp_noguild, mf_nopvp), WoE behavior (mf_gvg,mf_gvg_noparty), ability to use
+skills or open up trade deals (mf_notrade, mf_novending, mf_noskill, mf_noicewall),
+current weather effects (mf_snow, mf_fog, mf_sakura, mf_leaves, mf_rain, mf_clouds,
+mf_fireworks) and whether day/night will be in effect on this map (mf_indoors).
+
+---------------------------------------
+
+*removemapflag "<map name>",<flag>;
+
+This command removes a mapflag from a specified map. See 'setmapflag'.
+
+---------------------------------------
+
+*pvpon "<map name>";
+*pvpoff "<map name>";
+
+These commands will turn PVP mode for the specified maps on and off. Beside
+setting the flags referred to in 'setmapflag', 'pvpon' will also create a PVP
+timer and ranking as will @pvpon GM command do.
+
+---------------------------------------
+
+*gvgon "<map name>";
+*gvgoff "<map name>";
+
+These commands will turn GVG mode for the specified maps on and off, setting up
+appropriate map flags. In GVG mode, maps behave as if during the time of WoE,
+even though WoE itself may or may not actually be in effect.
+
+---------------------------------------
+
+*emotion <emotion number>{, target};
+
+This command makes an object display an emoticon sprite above their own as
+if they were doing that emotion. For a full list of emotion numbers,
+see 'db/const.txt' under 'e_'. The inobvious ones are 'e_what' (a question mark)
+and 'e_gasp' (the exclamation mark).
+
+The optional target parameter specifies who will get the emotion on top of
+their head. If 0 (the default if omitted), the NPC in current use will show
+the emotion, if 1, the player that is running the script will display it.
+
+---------------------------------------
+
+*maprespawnguildid "<map name>",<guild id>,<flag>;
+
+This command goes through the specified map and for each player and monster
+found there does stuff.
+
+Flag is a bitmask (add up numbers to get effects you want)
+ 1 - warp all guild members to their savepoints.
+ 2 - warp all non-guild members to their savepoints.
+ 4 - remove all monsters which are not guardian or emperium.
+
+Flag 7 will, therefore, mean 'wipe all mobs but guardians and the emperium and
+kick all characters out', which is what the official scripts do upon castle
+surrender. Upon start of WoE, the scripts do 2 (warp all intruiders out).
+
+Characters not belonging to any guild will warp out regardless of the flag setting.
+
+For examples, check the WoE scripts in the distribution.
+
+---------------------------------------
+
+*agitstart;
+*agitend;
+
+These two commands will start and end War of Emperium.
+
+This is a bit more complex than it sounds, since the commands themselves won't
+actually do anything interesting, except causing all 'OnAgitStart:' and
+'OnAgitEnd:' events to run everywhere, respectively, and setting a so-called
+'agit_flag' which also doesn't do much interesting itself. They are used as
+simple triggers to run a lot of complex scripts all across the server, and they,
+in turn, are triggered by clock with an 'OnClock<time>:' time-triggering label.
+
+---------------------------------------
+
+*agitcheck(0)
+*agitcheck 1;
+
+These function and command will let you check whether the server is currently in
+the War of Emperium mode. (that is, if 'agit_flag' is set. Even if it is set,
+doesn't mean that there's even one map in GVG mode somewhere) Calling
+'agitcheck' as a function (the argument must be zero) will return 1 if WoE is on
+and 0 if it isn't. Running 'agitcheck' as a command will instead set a local
+variable @agit_flag to 1 if the server is in WoE mode and 0 if it isn't.
+
+---------------------------------------
+
+*flagemblem <guild id>;
+
+This command only works when run by the NPC objects which have sprite id 722,
+which is a 3D guild flag sprite. If it isn't, the data will change, but nothing
+will be seen by anyone. If it is invoked in that manner, the emblem of the
+specified guild will appear on the flag, though, if any players are watching it
+at this moment, they will not see the emblem change until they move out of sight
+of the flag and return.
+
+This is commonly used in official guildwar scripts with a function call which
+returns a guild id:
+
+// This will change the emblem on the flag to that of the guild that owns
+// "guildcastle"
+
+ flagemblem GetCastleData("guildcastle.gat",1);
+
+---------------------------------------
+
+*getcastlename("<map name>")
+
+This function returns the name of the castle when given the map name for that
+castle. The data is read from 'db/castle_db.txt'.
+
+---------------------------------------
+
+*getcastledata("<map name>",<type of data>)
+*setcastledata "<map name>",<type of data>,<value>;
+
+This function returns the castle ownership information for the castle referred
+to by it's map name. Castle information stored in 'save\castle.txt' for the TXT
+version of the server and in 'guild_castle' table for the SQL version.
+
+Valid types of data are:
+
+ 0 - Will make the map server request the castle data from the char server, and
+ always return 0. This, apparently, will also cause indirectly the execution
+ of an 'OnAgitInit:' event mentioned at the beginning of this document.
+ 1 - Guild ID
+ 2 - Castle Economy score.
+ 3 - Castle Defence score.
+ 4 - Number of times the economy was invested in today.
+ 5 - Number of times the defence was invested in today.
+ 9 - Will return 1 if a Kafra was hired for this castle, 0 otherwise.
+10 - Is 1 if the 1st guardian is present (Soldier Guardian)
+11 - Is 1 if the 2nd guardian is present (Soldier Guardian)
+12 - Is 1 if the 3rd guardian is present (Soldier Guardian)
+13 - Is 1 if the 4th guardian is present (Archer Guardian)
+14 - Is 1 if the 5th guardian is present (Archer Guardian)
+15 - Is 1 if the 6th guardian is present (Knight Guardian)
+16 - Is 1 if the 7th guardian is present (Knight Guardian)
+17 - Is 1 if the 8th guardian is present (Knight Guardian)
+
+18-25 types of data will return current hit point values for guardians 1-8
+respectively.
+
+The 'setcastledata' command will behave identically, but instead of returning
+values for the specified types of accessible data, it will alter them and cause
+them to be sent to the char server for storage. Data type of 0 won't do
+anything, obviously.
+
+---------------------------------------
+
+*requestguildinfo <guild id>,"<event label>";
+
+This command requests the guild data from the char server and merrily continues
+with the execution. Whenever the guild information becomes available (which
+happens instantly if the guild information is already in memory, or later, if it
+isn't and the map server has to wait for the char server to reply) it will run
+the specified event as in a 'doevent' call.
+
+---------------------------------------
+
+*getequipcardcnt(<equipment slot>)
+
+This function will return the number of cards that have been compounded onto a
+specific equipped item for the invoking character. See 'getequipid' for a list
+of possible equipment slots.
+
+---------------------------------------
+
+*successremovecards <equipment slot>;
+
+This command will remove all cards from the item found in the specified
+equipment slot of the invoking character, create new card items and give them to
+the character. If any cards were removed in this manner, it will also show a
+success effect.
+
+---------------------------------------
+
+*failedremovecards <equipment slot>,<type>;
+
+This command will remove all cards from the item found in the specified
+equipment slot of the invoking character. 'type' determines what happens to the
+item and the cards:
+
+ 0 - will destroy both the item and the cards.
+ 1 - will keep the item, but destroy the cards.
+ 2 - will keep the cards, but destroy the item.
+
+Whatever the type is, it will also show a failure effect on screen.
+
+---------------------------------------
+
+*marriage("<spouse name>");
+
+This function will marry two characters, the invoking character and the one
+referred to by name given, together, setting them up as each other's marriage
+partner. No second function call has to be issued (in current SVN at least) to
+make sure the marriage works both ways. The function returns 1 upon success, or
+0 if the marriage could not be completed, either because the other character
+wasn't found or because one of the two characters is already married.
+
+This will do nothing else for the marriage except setting up the spouse ID for
+both of these characters. No rings will be given and no effects will be shown.
+
+---------------------------------------
+
+*wedding;
+
+This command will call up wedding effects - the music and confetti - centered on
+the invoking character.
+
+---------------------------------------
+
+*divorce()
+
+This function will un-marry the invoking character from whoever they were
+married to. Both will no longer be each other's marriage partner, (at least in
+current SVN, which prevents the cases of multi-spouse problems). It will return
+1 upon success or 0 if the character was not married at all.
+
+This function will also destroy both wedding rings and send a message to both
+players, telling them they are now divorced.
+
+---------------------------------------
+
+*ispartneron()
+
+This function returns 1 if the invoking character's marriage partner is
+currently online and 0 if they are not or if the character has no partner.
+
+---------------------------------------
+
+*getpartnerid()
+
+This function returns the character ID of the invoking character's marriage
+partner, if any. If the invoking character is not married, it will return 0,
+which is a quick way to see if they are married:
+
+ if (getpartnerid()) mes "I'm not going to be your girlfriend!";
+ if (getpartnerid()) mes "You're married already!";
+
+---------------------------------------
+
+*warppartner("<map name>",<x>,<y>);
+
+This function will find the invoking character's marriage partner, if any, and
+warp them to the map and coordinates given. Go kidnap that spouse. :) It will
+return 1 upon success and 0 if the partner is not online, the character is not
+married, or if there's no invoking character (no RID). 0,0 will, as usual,
+normally translate to random coordinates.
+
+---------------------------------------
+
+*adopt "<parent name>","<parent name>","<novice name>";
+*adopt("<parent name>","<parent name>","<novice name>");
+
+This command will set up a novice as a baby of a married couple. All three are
+referred to by character name. The correct variables are set on all three
+characters in the same call. The command will unequip anything the novice has
+equipped and make them a Job_Baby class, as well as send them a 'your job has
+been changed' message.
+
+Beware of calling this from inside a 'callfunc' function, cause upon successful
+adoption, this command returns a zero, as if it were a function. This is likely
+to screw up execution of a 'return' command. You may try to call it as a
+function instead, but it doesn't return anything upon an error, which may also
+cause script execution to throw up errors.
+
+Nothing will happen (and nothing will be returned either) if either future
+parent is below base level 70 and/or if any of the three characters is not found
+online.
+
+---------------------------------------
+
+*getchildid()
+*getmotherid()
+*getfatherid()
+
+These functions return the characters (shild/mother/father) ID
+
+ if (getmotherid()) mes "Oh... I know your mother's ID:"+getmotherid();
+
+---------------------------------------
+
+*getitemname(<item id>)
+
+Given the database ID number of an item, this function will return the text
+stored in the 'japanese name' field (which, in eAthena, stores an english name
+the players would normally see on screen.)
+
+---------------------------------------
+
+*makepet <pet id>;
+
+This command will create a pet egg and put it in the invoking character's
+inventory. The kind of pet is specified by pet ID numbers listed in
+'db/pet_db.txt'. The egg is created exactly as if the character just successfuly
+caught a pet in the normal way.
+
+ // This will make you a poring:
+ makepet 1002;
+
+Notice that you absolutely have to create pet eggs with this command. If you try
+to give a pet egg with 'getitem', pet data will not be created by the char
+server and the egg will disappear when anyone tries to hatch it.
+
+---------------------------------------
+
+*getexp <base xp>,<job xp>;
+
+This command will give the invoking character a specified number of base and job
+experience points. Can be used as a quest reward. Negative amounts of experience
+were not tested but should work.
+
+ getexp 10000,5000;
+
+You can also use the "set" command with the constants defined in 'db/const.txt':
+
+ // These 2 combined has the same effect as the above command
+ set BaseExp,BaseExp+10000;
+ set JobExp,JobExp+5000;
+
+You can also reduce the ammount of experience points:
+
+ set BaseExp,BaseExp-10000;
+
+---------------------------------------
+
+*getinventorylist;
+
+This command sets a bunch of arrays with a complete list of whatever the
+invoking character has in their inventory, including all the data needed to
+recreate these items perfectly if they are destroyed. Here's what you get:
+
+@inventorylist_id[] - array of item ids.
+@inventorylist_amount[] - their corresponding item amounts.
+@inventorylist_equip[] - whether the item is equipped or not.
+@inventorylist_refine[] - for how much it is refined.
+@inventorylist_identify[] - whether it's refined.
+@inventorylist_attribute[] - whether it is broken.
+@inventorylist_card1[] - These four arrays contain card data for the items.
+@inventorylist_card2[] These data slots are also used to store names
+@inventorylist_card3[] inscribed on the items, so you can explicitly check
+@inventorylist_card4[] if the character owns an item made by a specific
+ craftsman.
+@inventorylist_count - the number of items in these lists.
+
+This could be handy to save/restore a character's inventory, since no other
+command returns such a complete set of data, and could also be the only way to
+correctly handle an NPC trader for carded and named items who could resell them
+- since NPC objects cannot own items, so they have to store item data in
+variables and recreate the items.
+
+Notice that the variables this command generates are all local and numeric.
+
+---------------------------------------
+
+*getskilllist;
+
+This command sets a bunch of arrays with a complete list of skills the
+invoking character has. Here's what you get:
+
+@skilllist_id[] - skill ids.
+@skilllist_lv[] - skill levels.
+@skilllist_flag[] - see 'skill' for the meaning of skill flags.
+@skilllist_count - number of skills in the above arrays.
+
+While 'getskillv' is probably more useful for most situations, this is the
+easiest way to store all the skills and make the character something else for a
+while. Advanced job for a day? :) This could also be useful to see how many
+skills a character has.
+
+---------------------------------------
+
+*clearitem;
+
+This command will destroy all items the invoking character has in their
+inventory. (that includes equipped items) It will not affect anything else, like
+storage or cart.
+
+---------------------------------------
+
+*classchange <view id>,<type>;
+
+This command is very ancient, it's origins are clouded in mystery.
+It will send a 'display id change' packet to everyone in the immediate area of
+the NPC object, which will supposedly make the NPC look like a different sprite,
+an NPC sprite ID, or a monster ID. This effect is not stored anywhere and will
+not persist (Which is odd, cause it would be relatively easy to make it do so)
+and most importantly, will not work at all since this command was broken with
+the introduction of advanced classes. The code is written with the assumption
+that the lowest sprite IDs are the job sprites and the anything beyond them is
+monster and NPC sprites, but since the advanced classes rolled in, they got the
+ID numbers on the other end of the number pool where monster sprites float.
+
+As a result it is currently impossible to call this command with a valid view
+id. It will do nothing whatsoever if the view ID is below 4047. Getting it to
+run will actually just crash the client.
+
+It could be a real gem if it can be gotten to actually do what it's supposed to
+do, but this will only happen in a later SVN revision.
+
+---------------------------------------
+
+*misceffect <effect number>;
+
+This command, if run from an NPC object that has a sprite, will call up a
+specified effect number, centered on the NPC sprite. If the running code does
+not have an object ID (a 'floating' npc) or is not running from an NPC object at
+all (an item script) the effect will be centered on the character who's RID got
+attached to the script, if any. For usable item scripts, this command will
+create an effect centered on the player using the item.
+
+A full list of known effects is found in 'doc/effect_list.txt'. The list of
+those that actually work may differ greatly between client versions.
+
+---------------------------------------
+
+*soundeffect "<effect filename>",<number>
+*soundeffectall "<effect filename>",<number>
+
+These two commands will play a sound effect to either the invoking character
+only 'soundeffect' or everyone around ('soundeffectall'). If the running code
+does not have an object ID (a 'floating' npc) or is not running from an NPC
+object at all (an item script) the sound will be centered on the character who's
+RID got attached to the script, if any. If it does, it will be centered on that
+object. (an NPC sprite)
+
+Effect filename is the filename of the wav in GRF. It must have an extension.
+
+It's not quite certain what the number actually does, it is sent to the client
+directly, probably it determines which directory of the GRF the effect is played
+from - the sound effect type. It's certain that giving 0 for the number will
+play sound files from 'data/wav', but where the other numbers will read from is
+unclear.
+
+You can add your own effects this way, naturally.
+
+---------------------------------------
+
+*mapwarp "<from map>","<to map>",<x>,<y>;
+
+This command will collect all characters located on the From map and warp them
+wholesale to the same point on the To map, or randomly distribute them there if
+the coordinates are zero. "Random" is understood as a special To map name and
+will mean randomly shuffling everyone on the same map.
+
+---------------------------------------
+
+*mobcount("<map name>","<event label>")
+
+This function will count all the monsters on the specified map that have a given
+event label and return the number or 0 if it can't find any. Naturally, only
+monsters spawned with 'monster' and 'areamonster' script commands can be like
+this.
+
+However, apparently, if you pass this function an empty string for the event
+label, it should return the total count of normal permanently respawning
+monsters instead. With the current dynamic mobs system, where mobs are not kept
+in memory for maps with no actual people playing on them, this will return a 0
+for any such map.
+
+---------------------------------------
+
+*strmobinfo(<type>,<monster id>);
+
+This function will return information about a monster record in the database, as
+per 'db/mob_db.txt'. Type is the kind of information returned. Valid types are:
+
+ 1 - 'english name' field in the database, a string.
+ 2 - 'japanese name' field in the database, a string.
+ All other returned values are numbers:
+ 3 - Level.
+ 4 - Maximum HP.
+ 5 - Maximum SP.
+ 6 - Experience reward.
+ 7 - Job experience reward.
+
+---------------------------------------
+
+*guardian "<map name>",<x>,<y>,"<name to show>",<mob id>,<amount>{,"<event label>"};
+
+This command is roughly equivalent to 'monster', but is meant to be used with
+castle guardian monsters and will only work with them. It will set the guardian
+characteristics up according to the castle's investment values and otherwise
+set the things up that only castle guardians need.
+
+---------------------------------------
+
+*guardianinfo(<guardian number>)
+
+This function will return the current hit point value for the specified guardian
+number, if such guardian is currently installed. This function will only work if
+the invoking character is on a castle map, and will refer only to the guardians
+of that castle, regardless of anything else, i.e. whether the character is a
+member of the guild owning the castle, etc, etc.
+If no guardian is installed in this slot, the function will return -1.
+
+---------------------------------------
+
+* The Pet AI commands
+
+These commands will only work if the invoking character has a pet, and are meant
+to be executed from pet scripts. They will modify the pet AI decision-making for
+the current pet of the invoking character, and will NOT have any independent
+effect by themselves, which is why only one of them each may be in effect at any
+time for a specific pet. A pet may have 'petloot', 'petskillbonus',
+'petskillattack' OR 'petpetskillattack2' and 'petskillsupport' OR 'petheal' at
+the same time. 'petheal' is deprecated and is no longer used in the default pet
+scripts.
+
+*petskillbonus <bonus type>,<value>,<duration>,<delay>;
+
+This command will make the pet give a bonus to the owner's stat (bonus type -
+bInt,bVit,bDex,bAgi,bLuk,bStr,bSpeedRate - for a full list, see the values
+starting with 'b' in 'db/const.txt')
+
+*petrecovery <status type>,<delay>;
+
+This command will make the pet cure a specified status condition. The curing
+actions will occur once every Delay seconds. For a full list of status
+conditions that can be cured, see the list of 'SC_' status condition constants
+in 'db/const.txt'
+
+*petloot <max items>;
+
+This command will turn on pet looting, with a maximum number of items to loot
+specified. Pet will store items and return them when the maximum is reached or
+when pet performance is activated.
+
+*petskillsupport <skill id>,<skill level>,<delay>,<percent hp>,<percent sp>;
+*petheal <level>,<delay>,<percent hp>,<percent sp>;
+
+This will make the pet use a specified support skill on the owner whenever the
+HP and SP are below the given percent values, with a specified delay time
+between activations. The skill numbers are as per 'db/skill_db.txt'.
+'petheal' works the same as 'petskillsupport' but has the skill ID hardcoded to
+28 (Heal). This command is deprecated.
+It's not quite certain who's stats will be used for the skills cast, the
+character's or the pets. Probably, Skotlex can answer that question.
+
+*petskillattack <skill id>,<skill level>,<rate>,<bonusrate>;
+*petskillattack2 <skill id>,<damage>,<number of attacks>,<rate>,<bonusrate>;
+
+These two commands will make the pet cast an attack skill on the enemy the pet's
+owner is currently fighting. Skill IDs and levels are as per 'petskillsupport'.
+'petskillattack2' will make the pet cast the skill with a fixed amount of damage
+inflicted and the specified number of attacks.
+
+All commands with delays and durations will only make the behavior active for
+the specified duration of seconds, with a delay of the specified number of
+seconds between activations. Rates are a chance of the effect occuring and are
+given in percent. 'bonusrate' is added to the normal rate if the pet intimacy is
+at the maximum possible.
+
+The behavior modified with the abovementioned commands will only be exibited if
+the pet is loyal and appropriate configuration options are set in
+'battle_athena.conf'.
+
+Pet scripts in the database normally run whenever a pet of that type hatches
+from the egg. Other commands usable in item scripts (see 'bonus') will also
+happily run from pet scripts. Apparently, the pet-specific commands will also
+work in NPC scripts and modify the behavior of the current pet up until the pet
+is hatched again. (Which will also occur when the character is logged in again
+with the pet still out of the egg.) It is not certain for how long the effect of
+such command running from an NPC script will eventually persist, but apparently,
+it is possible to usefully employ them in usable item scripts to create pet
+buffing items.
+
+Nobody tried this before, so you're essentially on your own here.
+
+--------------------------------------
+
+*skilleffect <skill id>,<number>;
+
+This command will display the visual and sound effects of a specified skill (see
+'db/skill_db.txt' for a full list of skills) on the invoking character's sprite.
+Nothing but the special effects and animation will happen. If the skill's normal
+effect displays a floating number, the number given will float up.
+
+ // This will heal the character with 2000 hp, buff with
+ // Bless 10 and Increase AGI 5, and display appropriate
+ // effects.
+ mes "Blessed be!";
+ skilleffect 28,2000;
+ heal 2000,0;
+ skilleffect 34,0;
+ // That's bless 10.
+ sc_start 10,240000,10;
+ skilleffect 29,0;
+ // That's agi 5
+ sc_start 12,140000,5;
+
+---------------------------------------
+
+*npcskilleffect <skill id>,<number>,<x>,<y>;
+
+This command behaves identically to 'skilleffect', however, the effect will not
+be centered on the invoking character's sprite, nor on the NPC sprite, if any,
+but will be centered at map coordinates given on the same map as the invoking
+character.
+
+---------------------------------------
+
+*specialeffect <effect number>;
+
+This command will display special effect with the given number, centered on the
+specified NPCs coordinates, if any. For a full list of special effect numbers
+known see 'doc/effect_list.txt'. Some effect numbers are known not to work in
+some client releases. (Notably, rain is absent from any client executables
+released after April 2005.)
+
+---------------------------------------
+
+*specialeffect2 <effect number>;
+
+This command behaves identically to the 'specialeffect', but the effect will be
+centered on the invoking character's sprite.
+
+---------------------------------------
+
+*nude;
+
+This command will unequip anything equipped on the invoking character.
+
+It is not required to do this when changing jobs since 'jobchange' will unequip
+everything not equippable by the new job class anyway.
+
+---------------------------------------
+
+*atcommand "<command line>";
+
+This command will run the given command line exactly as if it was typed in from
+the keyboard by the player connected to the invoking character, and that
+character belonged to an account which had GM level 99.
+
+ // This will ask the invoker for a character name and then use the '@nuke'
+ // GM command on them, killing them mercilessly.
+ input @player$;
+ gmcommand "@nuke "+@player$
+
+This command has a lot of good uses, I am sure you can have some fun with this
+one.
+
+---------------------------------------
+
+*message "<character name>","<message>";
+
+That command will send a message to the chat window of the character specified
+by name. The text will also appear above the head of that character. It will not
+be seen by anyone else.
+
+---------------------------------------
+
+*npctalk "<message>";
+
+This command will display a message to the surrounding area as if the NPC object
+running it was a player talking - that is, above their head and in the chat
+window. The display name of the NPC will get appended in front of the message to
+complete the effect.
+
+ // This will make everyone in the area see the NPC greet the character
+ // who just invoked it.
+ npctalk "Hello "+strcharinfo(0)+" how are you";
+
+---------------------------------------
+
+*hasitems(0)
+
+This function will return 1 if the invoking character has anything at all in
+their inventory and 0 if they do not. Even though the argument is not used for
+anything, it is required.
+
+---------------------------------------
+
+*getlook(<type>)
+
+This function will return the number for the currentcharacter look value
+specified by type. See 'setlook' for valid look types.
+
+This can be used to make a certain script behave differently for characters
+dressed in black. :)
+
+---------------------------------------
+
+*getsavepoint(<information type>)
+
+This function will return information about the invoking character's save point.
+You can use it to let a character swap between several recorded savepoints.
+Available information types are:
+
+ 0 - Map name (a string)
+ 1 - X coordinate
+ 2 - Y coordinate
+
+---------------------------------------
+
+*npcspeed <speed value>;
+*npcwalkto <x>,<y>;
+*npcstop;
+
+These commands will make the NPC object in question move around the map. As they
+currently are, they are a bit buggy and are not useful for much more than making
+an NPC move randomly around the map. (see 'npc/custom/devnpc.txt' for an example
+of such usage)
+
+'npcspeed' will set the NPCs walking speed to a specified value. As in the
+@speed GM command, 200 is the slowest possible speed while 0 is the fastest
+possible (instant motion). 100 is the default character walking speed.
+'npcwalkto' will start the NPC sprite moving towards the specified coordinates
+on the same map as it is currently on.
+'npcstop' will stop the motion.
+
+While in transit, the NPC will be clickable, but invoking it will cause it to
+stop motion, which will make it's coordinates different from what the client
+computed based on the speed and motion coordinates. The effect is rather
+unnerving.
+
+Only a few NPC sprites have walking animations, and those that do, do not get
+the animation invoked when moving the NPC, due to the problem in the npc walking
+code, which looks a bit silly. You might have better success by defining a job-
+sprite based sprite id in 'db/mob-avail.txt' with this.
+
+---------------------------------------
+
+*getmapxy("<variable for map name>",<variable for x>,<variable for y>,<type>{,"<search string>"})
+
+This function will locate a character object, NPC object or pet's coordinates
+and place their coordinates into the variables specified when calling it. It
+will return 0 if the search was successful, and -1 if the parameters given were
+not variables or the search was not successful.
+
+Type is the type of object to search for:
+
+ 0 - Character object
+ 1 - NPC object
+ 2 - Pet object
+ 3 - Monster object.
+
+While 3 is meant to look for a monster object, no searching will be done if you
+specify type 3, and the function will always return -1.
+
+The search string is optional. If it is not specified, the location of the
+invoking character will always be returned for types 0 and 2, the location of
+the NPC running this function for type 1.
+If a search string is specified, for types 0 and 1, the character or NPC with
+the specified name will be located. If type is 3, the search will locate the
+current pet of the character who's name is given in the search string, it will
+NOT locate a pet by name.
+
+What a mess. Example, a working and tested one now:
+
+ prontera.gat,164,301,3%TAB%script%TAB%Meh%TAB%730,{
+ mes "My name is Meh. I'm here so that Nyah can find me.";
+ close;
+ }
+
+ prontera.gat,164,299,3%TAB%script%TAB%Nyah%TAB%730,{
+ mes "My name is Nyah.";
+ mes "I will now search for Meh all across the world!";
+ if (getmapxy(@mapname$,@mapx,@mapy,1,"Meh")!=0) goto Notfound;
+ mes "And I found him on map "+@mapname$+" at X:"+@mapx+" Y:"+@mapy+" !";
+ close;
+ Notfound:
+ mes "I can't seem to find Meh anywhere!";
+ close;
+ }
+
+Notice that NPC objects disabled with 'disablenpc' will still be located.
+
+---------------------------------------
+
+*guildgetexp <amount>;
+
+This will give the specified amount of guild experience points to the guild the
+invoking character belongs to. It will silently fail if they do not belong to
+any guild.
+
+---------------------------------------
+
+*skilluseid <skill>,<level>;
+*doskill <skill>,<level>;
+*skillusepos <skill>,<level>,<x>,<y>;
+
+These commands will cause the invoking character to use a specified skill at the
+specified level, as if they had that skill, with their current level and stats.
+If the skill involves targeting a character, no targeting pointer will come up -
+the invoking character will automatically be the skill target.
+
+'doskill' is an alias for 'skilluseid'.
+
+'skillusepos' will specify a target map square for the skill to be used. If that
+skill is an area effect skill, it will be centered at the square specified. It
+will not work if the skill is supposed to be targeted on character or monster.
+
+---------------------------------------
+
+*logmes "<message>";
+
+This command will write the message given to the map server npc log file, as
+specified in 'conf/log_athena.conf'. In the TXT version of the server, the log
+file is 'log/npclog.log' by default. In the SQL version, if SQL logging is
+enabled, the message will go to the 'npclog' table, otherwise, it will go to the
+same log file.
+
+If logs are not enabled, nothing will happen.
+
+---------------------------------------
+
+*summon "<monster name>",<mob id>{,"<event label>"};
+
+This command will summon a monster. (see also 'monster') Unlike monsters spawned
+with other commands, this one will set up the monster to fight to protect the
+invoking character. Monster name and mob id obey the same rules as the one given
+at the beginning of this document for permanent monster spawns with the
+exceptions mentioned when describing 'monster' command.
+
+The effect for the skill 'Call Homonuculus' will be displayed centered on the
+invoking character.
+
+If an event label is given, upon the monster being killed, the event label will
+run as if by 'donpcevent'.
+
+ // Will summon a dead branch-style monster to fight for the character.
+ summon "--ja--",-1;
+
+---------------------------------------
+
+*isnight()
+*isday()
+
+These functions will return 1 or 0 depending on whether the server is in night
+mode or day mode. 'isnight' returns 1 if it's night and 0 if it isn't, 'isday'
+the other way around. They can be used interchangeably, pick the one you like
+more:
+
+ // These two are equivalent:
+ if (isday()) mes "I only prowl in the night.";
+ if (isnight()!=1) mes "I only prowl in the night.";
+
+---------------------------------------
+
+*isequipped(<id>{,<id>{,<id>{,<id>}}})
+
+This function will return 1 if the invoking character has all of the item
+IDs given equipped (if card IDs are passed, then it checks if the cards are
+inserted into slots in the equipment they are currently wearing). Theorically
+there is no limit to the number of items that may be tested for at the same time.
+If even one of the items given is not equipped, 0 will be returned.
+
+ // (Poring,Santa Poring,Poporing,Marin)
+ if (isequipped(4001,4005,4033,4196)) mes "Wow! You're wearing a full complement of possible poring cards!";
+ // (Poring)
+ if (isequipped(4001)) mes "A poring card is useful, don't you think?";
+
+The function was meant for item scripts to support the cards released by Gravity
+in February 2005, but it will work just fine in normal NPC scripts.
+
+---------------------------------------
+
+*isequippedcnt(<card id>{,<card id>{,<card id>{,<card id>}}})
+
+This function is similar to 'isequipped', but instead of 1 or 0, it will return
+the number of cards in the list given that were found on the invoking character.
+
+ if (isequippedcnt(4001,4005,4033,4196)=4) mes "Finally got all four poring cards?";
+
+---------------------------------------
+
+*cardscnt()
+
+This function will return the number of cards inserted into the weapon currently
+equipped on the invoking character.
+While this function was meant for item scripts, it will work outside them:
+
+ if (cardscnt()==4) mes "So you've stuck four cards into that weapon, think you're cool now?";
+
+---------------------------------------
+
+*getrefine()
+
+This function will return the number of plusses the weapon currently equipped on
+the invoking character has been refined for.
+While this function was meant for item scripts, it will work outside them:
+
+ if (getrefine()==10) mes "Wow. That's a murder weapon.";
+
+---------------------------------------
+
+*day;
+*night;
+
+These two commands will switch the entire server between day and night mode.
+Depending on the configuration, it may cause differing client effects. If your
+server is set to cycle between day and night, it will eventually return to that
+cycle.
+
+This example will set the night time to start at 03 AM and end at 08 AM, and the
+nighttime will persist if the server restarts during the night, if the automated
+day/night switching is turned off in the configuration files. Figure it out on
+your own:
+
+-%TAB%script%TAB%DayNight%TAB%-1,{
+
+ end;
+
+OnClock0300:
+
+OnClock0800:
+
+OnInit:
+
+ set $@minutesfrommidnight, gettime(3)*60+gettime(2);
+
+ set $@night_start, 180; // 03:00
+ set $@night_end, 480; // 08:00
+
+ if ($@minutesfrommidnight>=$@night_start && $@minutesfrommidnight<$@night_end) goto StartNight;
+
+ goto StartDay;
+ StartNight:
+ night;
+ end;
+ StartDay:
+ day;
+ end; }
+
+---------------------------------------
+
+*getusersname;
+
+This command will give the invoking character a list of names of the connected
+characters (including themselves) into an NPC script message window (see 'mes')
+paging it by 10 names as if with the 'next' command.
+
+You need to put a 'close' after that yourself.
+
+---------------------------------------
+
+*dispbottom "<message>";
+
+This command will send the given message into the invoking character's chat
+window.
+
+---------------------------------------
+
+*recovery;
+
+This command will revive and restore full HP and SP to all characters currently
+connected to the server.
+
+---------------------------------------
+
+*getpetinfo(<type>)
+
+This function will return pet information for the pet the invoking character
+currently has active. Valid types are:
+
+ 0 - Unique pet ID number as stored by the char server and distinguishing it
+ from all other pets the characters actually have. This value is currently
+ useless, at most you can use it to tell pets apart reliably.
+ 1 - Pet ID number as per 'db/pet_db.txt' - will tell you what kind of a pet it
+ is.
+ 2 - Pet name. Will return "null" if there's no pet.
+ 3 - Pet friendly level (intimacy score). 1000 is full loyalty.
+ 4 - Pet hungry level. 100 is completely full.
+
+---------------------------------------
+
+*checkequipedcard(<card id>)
+
+This function will return 1 if the card specified by it's item ID number is
+inserted into any equipment they have in their inventory, currently equipped or
+not.
+
+---------------------------------------
+
+*globalmes "message";
+
+This command will send a message to the chat window of all currently connected
+characters.
+
+---------------------------------------
+
+*jump_zero (<condition>),<label>;
+
+This command works kinda like an 'if'+'goto' combination in one go. (See 'if').
+If the condition is false (equal to zero) this command will immediately jump to
+the specified label like in 'goto'.
+
+While 'if' is more generally useful, for some cases this could be an
+optimisation.
+
+---------------------------------------
+
+*select("<option>"{,"<option>"..."<option>"})
+
+This function is a handy replacement for 'menu' for some specific cases where
+you don't want a complex label structure - like, for example, asking simple yes-
+no questions. It will return the number of menu option picked, starting with 1.
+Like 'menu', it will also set the variable @menu to contain the option the user
+picked.
+
+ if (select("Yes","No")==1) mes "You said yes, I know.";
+
+And like 'menu', this command has a problem with empty strings - if some of the
+option strings given to it are empty, you won't be able to tell which one the
+user really picked. The number it returns will only make sense if all the empty
+strings are last in the list of options.
+
+---------------------------------------
+
+*getmapmobs("<map name>")
+
+This function will return the total count of monsters currently located on the
+specified map. If the map name is given as "this", the map the invoking
+character is on will be used. If the map is not found, or the invoker is not a
+character while the map is "this", it will return -1.
+
+---------------------------------------
+
+*unequip <equipment slot>;
+
+This command will unequip whatever is currently equipped in the invoking
+character's specified equipment slot. For a full list of possible equipment
+slots see 'getequipid'.
+
+If an item occupies several equipment slots, it will get unequipped from all of
+them. (Which is a good thing.)
+
+---------------------------------------
+
+*defpattern <set number>,"<regular expression pattern>","<event label>";
+*activatepset <set number>;
+*deactivatepset <set number>;
+*deletepset <set number>;
+
+This set of commands is only available if the server is compiled with regular
+expressions library enabled. Default compilation and most binary distributions
+aren't, which is probably bad, since these, while complex to use, are quite
+fascinating.
+
+They will make the NPC object listen for text spoken publicly by players and
+match it against regular expression patterns, then trigger labels associated
+with these regular expression patterns.
+
+Patterns are organised into sets, which are referred to by a set number. You can
+have multiple sets patterns, and multiple patterns may be active at once.
+Numbers for pattern sets start at 1.
+
+'defpattern' will associate a given regular expression pattern with an event
+label. This event will be triggered whenever something a player says is matched
+by this regular expression pattern, if the pattern is currently active.
+
+'activatepset' will make the pattern set specified active. An active pattern
+will enable triggering labels defined with 'defpattern', which will not happen
+by default.
+'deactivatepset' will deactivate a specified pattern set. Giving -1 as a pattern
+set number in this case will deactivate all pattern sets defined.
+
+'deletepset' will delete a pattern set from memory, so you can create a new
+pattern set in it's place.
+
+Using regular expressions is high wizardry. But with this high wizardry comes
+unparallelled power of text manipulation. For an explanation of what a regular
+expression pattern is, see a few web pages:
+
+http://www.regular-expressions.info/
+http://www.weitz.de/regex-coach/
+
+For an example of this in use, see 'npc\custom\eliza.txt'.
+
+With this you could, for example, automagically punish players for asking for
+zeny in public places, or alternatively, automagically give them zeny instead if
+they want it so much.
+
+---------------------------------------
+
+*getstrlen("<string>")
+
+This function will return the length of the string given as an argument. It is
+useful to check if anything input by the player exceeds name length limits and
+other length limits and asking them to try to input something else.
+
+---------------------------------------
+
+*charisalpha("<string>",<position>)
+
+This function will return 1 if the character number Position in the given string
+is a letter, 0 if it isn't a letter but a digit or a space.
+
+---------------------------------------
+
+*getnameditem(<item id>,"<name to inscribe>");
+*getnameditem("<item name>","<name to inscribe>");
+
+This function is equivalent to using 'getitem', however, it will not just give
+the character an item object, but will also inscribe it with a specified
+character's name. You may not inscribe items with arbitrary strings, only with
+names of characters that actually exist. While this isn't said anywhere
+specifically, apparently, named items may not have cards in them, slots or no -
+these data slots are taken by the character ID who's name is inscribed. Only one
+remains free and it's not quite clear if a card may be there.
+
+Items that may not be equipped may NOT be inscribed with a name with this
+function. Which is why this is a function which will return a value - 1 if an
+item was successfully created and 0 if it wasn't for whatever reason. Like
+'getitem' this function will also take an 'english name' from the itemdb
+database as an item name and will return 0 if nothing is found.
+
+---------------------------------------
+
+*getitemslots(<item ID>)
+
+This function will look up the item with the specified ID number in the database
+and return the number of slots this kind of items has - 0 if they are not
+slotted. It will also be 0 for all non-equippable items, naturally, unless
+someone messed up the item database. It will return -1 if there is no such item.
+
+---------------------------------------
+
+*getiteminfo(<item ID>,<type>)
+
+This function will look up the item with the specified ID number in the database
+and return the info set by TYPE argument.
+It will return -1 if there is no such item.
+
+Valid types are:
+ 0 - Buy Price; 1 - Sell Price; 2 - Item Type;
+ 3 - maxchance (Max drop chance of this item e.g. 1 = 0.01% , etc..
+ if = 0, then monsters don't drop it at all (rare or a quest item)
+ if = 10000, then this item is sold in NPC shops only
+ 4 - sex; 5 - equip; 6 - weight; 7 - atk; 8 - def; 9 - range;
+ 10 - slot; 11 - look; 12 - elv; 13 - wlv;
+
+Check sample in nps\sample\getiteminfo.txt
+
+---------------------------------------
+
+*getmonsterinfo(<item ID>,<type>)
+
+This function will look up the monster with the specified ID number in the database
+and return the info set by TYPE argument.
+It will return -1 if there is no such item. Due to specific of MOB DB routines,
+it's better to check monster name. It'd return "Dummy" for a non-existing monster.
+
+Valid types are listed in const.txt:
+ 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 JOB_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
+
+Check sample in nps\sample\getmonsterinfo.txt
+
+---------------------------------------
+
+*pow(<number>,<power>)
+
+Returns the result of the calculation.
+
+Example:
+set @i, pow(2,3); // @i will be 8
+
+---------------------------------------
+
+*sqrt(<number>)
+
+Returns square-root of number.
+
+Examlpe:
+set @i, sqrt(25); // @i will be 5
+
+---------------------------------------
+
+*distance(<x0>,<y0>,<x1>,<y1>)
+
+Returns distance between 2 points.
+
+Example:
+set @i, distance(100,200,101,202);
+
+---------------------------------------
+*query_sql "your MySQL query", <array name>, [<array name>]
+Returns up to 127 values into array and return the number of row
+
+Example:
+set @nb, query_sql("select name,fame from `char` ORDER BY fame DESC LIMIT 5", @name$, @fame);
+mes "Hall Of Fame: TOP5";
+mes "1."+@name$[0]+"("+@fame[0]+")"; // Will return a person with the biggest fame value.
+mes "2."+@name$[1]+"("+@fame[1]+")";
+mes "3."+@name$[2]+"("+@fame[2]+")";
+mes "4."+@name$[3]+"("+@fame[3]+")";
+mes "5."+@name$[4]+"("+@fame[4]+")";
+
+Note: In the TXT version it doesn't fill the array and always return -1.
+Note: Use Text$[] array to recieve all data as text.
+
+---------------------------------------
+
+*setd "variable name", <value>
+
+Works almost identical as set, just that the variable name is identified as a string,
+thus can be constructed dynamically.
+
+Example:
+set $var$, "Poring";
+
+setd "$var$", "Poporing";
+mes $var$; // Will return Poporing
+
+setd "$" + $var$ + "123$", "Poporing is cool";
+mes $Poporing123$; // Will return Poporing is cool.
+
+---------------------------------------
+
+*getd("variable name")
+
+Retrieves variable, name can be constructed dynamically. Refer to setd for usage.
+
+Example:
+set @i, getd("$pikachu");
+
+---------------------------------------
+
+*petstat(<flag>)
+
+Returns current pet status, all are integers except name.
+Returns 0 or "" if the player doesn't have pets.
+
+Flags usable >>
+PET_CLASS
+PET_NAME
+PET_LEVEL
+PET_HUNGRY
+PET_INTIMATE
+
+Example:
+set @i, petstat(PET_CLASS);
+
+
+---------------------------------------
+
+*setitemscript(<ItemID>,<"{ new item script }">)
+
+Set a new script bonus to the Item. Very useful for game events.
+
+Example:
+
+setitemscript 2637,"{ bonus bDamageWhenUnequip,40; if(isequipped(2236)==0)end; if(getskilllv(26)){skill 40,1;}else{skill 26,1+isequipped(2636);} }";
+
+---------------------------------------
+
+*disguise <Monster ID>;
+*undisguise;
+
+This command disgueses current player with a monster sprite.
+The disguise is disappearing on re-login or on 'undisguise' command.
+
+Note: It doesn't work with "Pets with equipment on"
+Note: If u're a Sniper, u'd get an old Falcon over your head
+Note: You can kill yourself with some skills
+Note: Monsters of your type could heal you
+
+Example:
+disquise 1002; //Yay! You're a Poring!!!
+next;
+undisquise; //Yay!!!! You're a human again!!
+
+---------------------------------------
+
+*axtoi(<hexadecimal_value>);
+
+This command will convert an hexadecimal value into integers (numbers).
+The inputted value must not have neither # or 0x in it, just 6 numbers and/or letters.
+The variable registering this value, if so, must be a string (letter) variable, due that
+it contains letters in some cases.
+
+This is mostly used for the new announce command, which uses hexadecimal values for announce
+colors, using the Ragnarok coloring system.
+
+Example:
+
+amatsu.gat,171,166,4 script Testing npc 767,{
+
+mes "Input hex color";
+input @trying$;
+next;
+set @try2$,axtoi(@trying$);
+announce "zOMG TEH PWNZ0RDZ",bc_all,@try2$;
+close;
+}
+
+If you want a list of hexadecimal colors, check these two links:
+
+http://webmonkey.wired.com/webmonkey/reference/color_codes/
+
+http://www.december.com/html/spec/color.html
+
+---------------------------------------
+
+*rid2name(rid)
+
+Converts rid to name. Note: The player/monster/NPC must be online/enabled.
+Good for PCKillEvent where you can convert 'killedrid' to the name of the player.
+
+Note: rid2name may not produce correct character names since rid = account id.
+ It will return the current online character of the account only.
+
+---------------------------------------
+
+*function <function name>;
+*<function name>;
+*function <function name> {
+<code>
+}
+
+(Skotlex stop being so selfish and give us all the commands T~T! J/k lol :P)
+
+This works like callfunc, but doesn't support arguments like callfunc. It's used for cleaner
+and fast script that doesn't require arguments for it to work. Also they must be inside a script.
+They're not separated scripts and they work more like labels.
+
+Note it looks like the normal declaration
+
+Usage:
+
+You first Declare the function with function <function name>;.
+
+Put the rest of your code. You can use then <function name>; to call the function. If it returns a value is unsure,
+test it if you want and give us some comments ;3
+
+And at least, but inside the script itself, put the function <function name> {<code>}.
+
+Example:
+
+prontera.gat,154,189,4 script Item seller 767,{
+
+function SF_Selling;
+
+mes "I'll open this now if you have more than 50z and you are level 50 or bigger";
+next;
+
+if (Zeny > 50) && (BaseLevel > 50) {
+ mes "Welcome";
+ next;
+ SF_Selling;
+ close;
+} else
+
+set @needed,50-BaseLevel;
+mes "You either are Level "+BaseLevel+", thus you need "+@needed+" more levels";
+mes "to be able to use this npc; or you don't have enough zeny, so get some please";
+close;
+
+function SF_Selling {
+
+ mes "Would you like to buy a phracon for 50z?";
+ switch(select("Yes","No, thanks")) {
+
+ case 1:
+ mes "Ok, how many?";
+ input @quantity;
+ set @check,Zeny/50;
+ if (@quantity > @check) {
+ mes "Sorry but you can only have "+@check+" Phracons with "+Zeny;
+ close;
+ } else
+ next;
+ mes "here you have";
+ set Zeny,Zeny-@quantity*50;
+ getitem 1010,@quantity;
+ close;
+ case 2:
+ mes "Good bye then";
+ close;
+ }
+ }
+ return;
+}
+
+
+---------------------------------------
+
+*getequipcardid (<equipment slot>,<card slot>);
+
+Returns value from equipped item slot in the indicated slot:
+
+getequipcardid(num,slot)
+
+where:
+ num = eqip position slot
+ slot = 0,1,2,3 (Card Slot N)
+
+This func returns CARD ID, 255,254,-255 (for card 0, if the item is produced) it's useful
+when you want to check item cards or if it's signed. Useful for such quests as
+"Sign this refined item with players name" etc;
+ Hat[0] +4 -> Player's Hat[0] +4
+
+By Lupus
+
+--------------------------------------
+
+*warpparty "mapname.gat",x,y,<party_id>;
+
+Warps a party to specified map and coordinate given the party ID, which you can get with
+getcharid(1). You can also request another party id given a member's name with getcharid(1,<player_name>).
+
+Example:
+mes "[Party Warper]";
+mes "Here you go!";
+close2;
+set @id,getcharid(1);
+warpparty "prontera.gat",150,100,@id;
+close;
+
+---------------------------------------
+
+*warpchar "mapname.gat",x,y,<char_id>;
+
+Warps another player to specified map and coordinate given the char id, which you can get with
+getcharid(0,<player_name>). Obviously this is useless if you want to warp the same player that
+is executing this script, unless it's some kind of "chosen" script.
+
+Example:
+
+warpchar "prontera.gat",150,100,20000001;
+
+---------------------------------------
+
+*warpguild "mapname.gat",x,y,<guild_id>;
+
+Warps a guild to specified map and coordinate given the guild id, which you can get with
+getcharid(2). You can also request another guild id given the member's name with getcharid(2,<player_name>).
+
+Example:
+
+warpguild "prontera.gat",x,y,Guild_ID;
+
+---------------------------------------
+
+Whew.
+What's about all of them.
diff --git a/doc/script_ref.txt b/doc/script_ref.txt
index 63fea4ec6..06df8f425 100644
--- a/doc/script_ref.txt
+++ b/doc/script_ref.txt
@@ -1,1424 +1,1424 @@
-AthenaNPCScript
-
-- Table of contents
- 0. Introduction
- 1. Definition of NPC
- 2. Explanation of Script, and Fundamental Rule
- 3. Imperative Sentence, Function, and Constant Label
- 4. Error Message
- 5. Postscript
-
-0. Introduction
- The function and form which are contained in this text refer to npc_sample.txt contained in the newest snapshot, and are described.
- The convenience of the editor which shows this text is considered, <tab> is written and <n> etc. is written. [ a tab character ] [ arbitrary values ].
- Although it is a coordinate system, please make a lower figure reference.
- The increase in ?Y
- ( 0,200)--(200,200)
- | |
- | |
- | |
- | |
- | |
- ( 0, 0)--(200, 0)-> the increase in X
-
-1. Definition of NPC
- if it is below an athena directory -- anywhere -- being good (if it being able to do below athena/npc) -- please create txt for the time being
- The NPC describes first what is shown (a way of speaking called NPC depending on the case is unsuitable).
-
- * Warp point : perform movement between MAP.
- <gatname>,<x>,<y><tab>warp<tab><displayname><tab><dx>,<dy>,<destination_gatname>,<destination_x>,<destination_y>
-
- gatname The MAP file name on which a warp point is put is specified. Please do not forget gat.
- x The horizontal coordinates on which a warp point is put are specified.
- y The vertical coordinates on which a warp point is put are specified.
- displayname It is a warp point discernment child. You may overlap. It uses by debugging.
- dx It is the horizontal effect range of a warp point.
- dy It is the vertical effect range of a warp point. Probably I do not write a circle but think that it is a region.
- Example of dx and dy (- is x and y) :
- 0,0 1,0 2,2
- *@*– *–*–*–*–*– *–*–*–*–*–*–*–
- *–*œ*– *–*–*œ*–*– *–*–*–*–*–*–*–
- *@*– *–*–*–*–*– *–*–*–*–*–*–*–
- *@ *–*–*–*œ*–*–*–
- *@ *–*–*–*–*–*–*–
- *@ *–*–*–*–*–*–*–
- *@ *–*–*–*–*–*–*–
- *@
- * I hear that and it will leap if the cell of - is stepped on.
- *@
- destination_gatname It is a warp place. . Even if there is gat and there is not, don't care about it.
- destination_x They are warp place horizontal coordinates.
- destination_y They are warp place vertical coordinates.
-
- Notes :
- A warp point displays only that plurality is described to be at the end when located on this position.
- When the coordinates of a warp place are move prohibition cells, it leaps to somewhere in the MAP.
-
- * Monster : manage the spawning(aka apperance in japanese.) of a monster.
- <gatname>,<x>,<y>,<xs>,<ys><tab>monster<tab><displayname><tab><npcid>,<number>,<spawn_delay1>,<spawn_delay2>[,<event>]
-
- gatname The appearing MAP file name is specified.
- x The appearing horizontal coordinates are specified. Random at 0.
- y The appearing vertical coordinates are specified. Random at 0.
- xs The appearing horizontal range is specified.
- ys The appearing vertical range is specified.
- Example of xs and ys (- is x and y) :
- 0,0 2,1
- *@*œ *–*–*–*–*–
- *@ *–*–*œ*–*–
- *@ *–*–*–*–*–
- *@
- * And a monster appears from the cell of -.
-
- displayname It is the display name of the appearing monster.
- npcid Please refer to mob_db.txt. id of the monster made to appear is specified.
- number It is the number of the maximum appearances in the MAP and the appearance range.
- spawn_delay1 After appearing, if specified the amount of time in milliseconds before it re-appears.
- spawn_delay2 After dying, if specified the amount of time in milliseconds before it re-appears.
- event The specified event is generated. An abbreviation is possible.
-
- Notes:
- spawn_delay1 and spawn_delay2 judge and give priority to whether it re-appears having been based the latest [ direction ] on which as a result.
-
- * Store : sell an item.
- <gatname>,<x>,<y>,<direction><tab>shop<tab><displayname><tab><npcid>,<item_id>:<price>,<item_id>:<price>,<item_id>:<price>
-
- gatname The MAP file name to arrange is specified.
- x The horizontal coordinates to arrange are specified.
- y The vertical coordinates to arrange are specified.
- direction Direction is specified.
- Details of direction :
- 7 0 1
- 6 2
- 5 4 3
-
- displayname The display name of the store to arrange is specified.
- npcid The display sprite ID of the store to arrange is specified.
- item_id The item ID put on the store to arrange is specified. Please refer to item_db.
- price The price of the item specified by item_id is set up.
- each <item_id>:<price> is divided by a comma (,), and more than one can be specified.
- example:
- item_id:price,item_id2,price2
-
- * Script : create NPC.
- <gatname>,<x>,<y>,<direction><tab>script<tab><displayname><tab><npcid>,<xs>,<ys>,{ <script> ... }
-
- gatname The MAP file name to arrange is specified.
- x The horizontal coordinates to arrange are specified.
- y The vertical coordinates to arrange are specified.
- direction Direction is specified.
- displayname The display name of NPC to arrange is specified. It becomes an event name when npcid is -1.
- When making said display name another operation event, it can be described as a display name::discernment child.
- npcid The display sprite ID of NPC to arrange is specified. If -1 is specified, it will become an event in map.
- xs The horizontal range which performs a script automatically is specified.
- ys The vertical range which performs a script automatically is specified. It is the same as a warp.
-
- Explanation about the inside of {} (inside parenthesis).
- Collecting by the party cannot recommend you. If it can do
- gatname etc,
- {
- //comment
- script;
- label:
- script;
- }
- Let's write by the said touch. Comment out is //and comment area is /* and */.
- The ? which does not leave; (semicolon) in the script ending.
-
- u<gatname>,<x>,<y>,<direction><tab>v‚Ì•”•ª‚ðAu-<tab>v‚Æ‚·‚邱‚Æ‚ÅA
- ƒ}ƒbƒvƒT[ƒo[“à‚É‚Í‘¶Ý‚µ‚Ä‚¢‚Ä‚àAŽÀۂ̃}ƒbƒv‚É‚Í”z’u‚³‚ê‚È‚¢NPC‚ð쬂ł«‚Ü‚·B
- ‚±‚ê‚ÍŒãq‚̃fƒ…ƒvƒŠƒP[ƒgƒXƒNƒŠƒvƒg‚ŃRƒs[Œ³‚Æ‚µ‚ÄŽg—p‚µ‚Ü‚·B
-
- –ƒfƒ…ƒvƒŠƒP[ƒgƒXƒNƒŠƒvƒgFŠù‘¶‚ÌNPCi‚̃XƒNƒŠƒvƒgj‚ðƒRƒs[‚µ‚Ü‚·B
- <gatname>,<x>,<y>,<direction><tab>duplicate(<source>)<tab><displayname><tab><npcid>,<xs><ys>
-
- sourceˆÈŠO‚̃pƒ‰ƒ[ƒ^‚Í’Êí‚̃XƒNƒŠƒvƒg‚Æ“¯‚¶‚Å‚·B
- source‚ɂ̓Rƒs[Œ³‚Æ‚È‚éNPC‚ÌŽ¯•Ê–¼‚ð“ü—Í‚µ‚Ü‚·B
-
- ƒRƒs[Œ³‚ÌNPC‚ªƒ}ƒbƒvã‚É”z’u‚³‚ê‚Ä‚¢‚éê‡A“¯‚¶ƒ}ƒbƒv‚Å‚ ‚é•K—v‚ª‚ ‚è‚Ü‚·B
- ƒ}ƒbƒvã‚É”z’u‚³‚ê‚Ä‚¢‚È‚¢ê‡‚ÍA‚ǂ̃}ƒbƒv‚Ö‚àƒRƒs[‰Â”\‚Å‚·B
-
- –ƒ†[ƒU[’è‹`ŠÖ”ƒXƒNƒŠƒvƒgFƒXƒNƒŠƒvƒg‚©‚çŒÄ‚Ño‚³‚ê‚郆[ƒU[’è‹`ŠÖ”‚ð쬂µ‚Ü‚·B
- function<tab>script<tab><name><tab>{ <script> ... }
-
- callfunc–½—߂ŌĂÑo‚·‚±‚Æ‚Ìo—ˆ‚éŠÖ”‚ð쬂µ‚Ü‚·B
- ŠÖ”‚ÌÅŒã‚É‚Í•K‚¸return–½—ß‚ð“ü‚ê‚Ä‚­‚¾‚³‚¢B
-
- –ƒ}ƒbƒvƒtƒ‰ƒOFMAP‚̃‹[ƒ‹‚ðŠÇ—‚µ‚Ü‚·B
- <gatname><tab>mapflag<tab><const>
-
- gatname ƒ‹[ƒ‹‚ðÝ’è‚·‚éMAPƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ü‚·B
- const ƒ‹[ƒ‹‚Ì“à—e‚ðŽw’肵‚Ü‚·B
-
- const‚̈ꗗB
- nosave<tab><gatname>,<x>,<y>
- ƒŠƒƒOƒCƒ“‚µ‚½Û<gatname>‚ÌÀ•W<x>,<y>‚Ɉړ®‚µ‚Ü‚·B
- nomemo<tab>dummy
- ƒƒ‚‚ðŽæ‚邱‚Æ‚ð‹ÖŽ~‚µ‚Ü‚·B
- notereport<tab>dummy
- SavePoint‚Ü‚½‚ÍRandom‚ðŽw’肵‚½warp•¶Aƒ[ƒvƒ|[ƒ^ƒ‹AƒeƒŒƒ|[ƒg‚ð‹ÖŽ~‚µ‚Ü‚·B
- nobranch<tab>dummy
- ŒÃ–Ø‚ÌŽ}‚ÌŽg—p‚ð‹ÖŽ~‚µ‚Ü‚·B
- pvp<tab>dummy
- PVP‰Â”\MAP‚É‚È‚è‚Ü‚·B
- nopenalty<tab>dummy
- ƒfƒXƒyƒiƒ‹ƒeƒB–³‚µ‚É‚È‚è‚Ü‚·B
- pvp_noparty<tab>dummy
- PVP‚É‚¨‚¢‚ÄA“¯ƒp[ƒeƒB[UŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
- pvp_noguild<tab>dummy
- PVP‚É‚¨‚¢‚ÄA“¯ƒMƒ‹ƒhUŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
- gvg<tab>dummy
- ƒV[ƒYƒ‚[ƒh‚É‚È‚è‚Ü‚·B
- gvg_noparty<tab>dummy
- ƒV[ƒYƒ‚[ƒh‚É‚¨‚¢‚ÄA“¯ƒp[ƒeƒB[UŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
-
-‚QDƒXƒNƒŠƒvƒg‚Ìà–¾‚ÆŠî–{“I‚È‹K‘¥
- –”Žš
- •„†•t‚Ì®”‚Æ‚P‚Ui”•\‹L®”‚ðŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
- •„‡•t®”‚Í”¼Šp”Žš‚Å123456“™‚Æ‹Lq‚µ‚Ü‚·B
- ‚P‚Ui”•\‹L®”‚Í0x12“™0x‚ð•t‚¯‚Ä‹Lq‚µ‚Ü‚·B
-
- –•¶Žš—ñ
- "iƒ_ƒuƒ‹ƒNƒH[ƒe[ƒVƒ‡ƒ“j‚ň͂ñ‚¾•¶Žš‚Í•¶Žš—ñ‚Æ‚µ‚Ä•]‰¿‚³‚ê‚Ü‚·B
- "iƒ_ƒuƒ‹ƒNƒH[ƒe[ƒVƒ‡ƒ“j‹L†‚ðˆµ‚¢‚½‚¢ê‡‚Í\"‚Æ‹Lq‚µ‚Ü‚·B
- \‹L†‚ðˆµ‚¢‚½‚¢ê‡‚Í\\‚Æ‹Lq‚µ‚Ü‚·B
- ‚È‚¨•\Ž¦ŠÖŒW‚Ì•¨‚ÉŠÖ‚µ‚Ä‚Í^000000“™‚ÌF•ÏX‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
- •Ï” + "•¶Žš—ñ"‚Æ‚¢‚Á‚½•¶Žš—ñŒ‹‡‚à‚Å‚«‚Ü‚·B
-
- –’P€‰‰ŽZŽq
- ˆÈ‰º‚Ì”’lê—p‚Ì’P€‰‰ŽZŽq‚ª—pˆÓ‚³‚ê‚Ä‚¢‚Ü‚·B
- - •„†‹t“]i‚Q‚Ì•â”j
- ~ ƒrƒbƒg˜_—”Û’èi‚P‚Ì•â”j
- ! ˜_—”Û’è
-
- –‚Q€‰‰ŽZŽq
- ˆÈ‰º‚Q€‰‰ŽZŽq‚Í”’l‚Æ•¶Žš—ñ‚Å“®ì‚ªˆÙ‚È‚è‚Ü‚·B
- + ‰ÁŽZ/Œ‹‡
- ”’l‚Ç‚¤‚µ‚Ìꇂ͉ÁŽZ‚µ‚Ü‚·B
- ‚»‚êˆÈŠO‚Ìꇂ͕¶Žš—ñ‚Æ‚Ý‚È‚µ‚ÄŒ‹‡‚µ‚Ü‚·B
-
- ˆÈ‰º‚Ì‚Q€‰‰ŽZŽq‚Í”’lê—p‚Å‚·B
- - Œ¸ŽZ
- * æŽZ
- / œŽZ
- % è—]
- & ƒrƒbƒg˜_—Ï
- | ƒrƒbƒg˜_—˜a
- ^ ƒrƒbƒg”r‘¼“I˜_—˜a
- && ˜_—Ï
- || ˜_—˜a
-
- ˆÈ‰º‚Ì‚Q€‰‰ŽZŽq‚Í”’l‚Ç‚¤‚µA‚Ü‚½‚Í•¶Žš—ñ‚Ç‚¤‚µ‚Ì”äŠr‚ðs‚¢‚Ü‚·B
- ‚±‚ê‚ç‚ÌŠÖŒW‰‰ŽZŽq‚ÍŠÖŒW‚ª¬‚è—§‚‚Æ1A¬‚è—§‚½‚È‚¢‚Æ0‚ð•Ô‚µ‚Ü‚·B
- == “™‚µ‚¢
- != “™‚µ‚­‚È‚¢
- > ‚æ‚è‘å‚«‚¢
- >= ‚æ‚è‘å‚«‚¢‚©“™‚µ‚¢iˆÈãj
- < ‚æ‚謂³‚¢i–¢–žj
- <= ‚æ‚謂³‚¢‚©“™‚µ‚¢iˆÈ‰ºj
-
- –•Ï”
- ”¼Šp‰p”Žš‚ðŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
- •Ï”‚̃XƒR[ƒv‚ƃ‰ƒCƒtƒ^ƒCƒ€‚̓vƒŒƒtƒBƒbƒNƒX‚É‚æ‚èŽw’肵‚Ü‚·B
- ¬•¶Žš‚̃Gƒ‹‚̓vƒŒƒtƒBƒbƒNƒX‚Æ‚µ‚Ĉµ‚í‚ê‚é‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- (¬•¶Žš‚̃Gƒ‹‚Í¡Œã‚Ì“®ì‚ð•ÛႳ‚ê‚È‚¢‚Ì‚ÅŽg—p‚µ‚È‚¢‚ʼnº‚³‚¢)
-
- ƒvƒŒƒtƒBƒbƒNƒX ƒXƒR[ƒv ƒ‰ƒCƒtƒ^ƒCƒ€
- (‚È‚µ) ƒLƒƒƒ‰ƒNƒ^[ ‰i‘±“I
- @ ƒLƒƒƒ‰ƒNƒ^[ ˆêŽž“I
- l “¯ã “¯ãi„§‚³‚ê‚È‚¢j
- $ ƒ}ƒbƒvƒT[ƒo[ ‰i‘±“I
- $@ ƒ}ƒbƒvƒT[ƒo[ ˆêŽž“I
- # ƒAƒJƒEƒ“ƒg ‰i‘±“I
- ## ƒAƒJƒEƒ“ƒg(‘Sƒ[ƒ‹ƒh) ‰i‘±“I
-
- ‚‚܂èA•’ʂ̈ꎞ“I‚È•Ï”‚Í@, •Û‘¶‚·‚é•K—v‚Ì‚ ‚é•Ï”‚Í
- ƒvƒŒƒtƒBƒbƒNƒX‚È‚µA‘S‚ẴLƒƒƒ‰ƒNƒ^[‚Å‹¤—L‚·‚ׂ«•Ï”‚Í $A
- “¯ˆêƒAƒJƒEƒ“ƒg‚Å‹¤—L‚·‚ׂ«•Ï”‚Í # ‚â ## ‚ðŽg—p‚·‚邱‚Æ‚É‚È‚è‚Ü‚·B
-
- ‚Ü‚½A•Ï”‚ÌŒ^‚̓|ƒXƒgƒtƒBƒbƒNƒX‚É‚æ‚èŽw’肵‚Ü‚·B
- ‚½‚¾‚µA•¶Žš—ñŒ^‚̓Lƒƒƒ‰ƒNƒ^[ˆêŽž•Ï”A‚¨‚æ‚ÑA
- ‰i‘±“I/ˆêŽž“Iƒ}ƒbƒvƒT[ƒo[•Ï”‚Å‚Ì‚ÝŽg—p‚Å‚«‚Ü‚·B
- iƒvƒŒƒtƒBƒbƒNƒX @A$A$@ j
-
- ƒ|ƒXƒgƒtƒBƒbƒNƒX Œ^
- (‚È‚µ) ®”
- $ •¶Žš—ñ
-
- <—á> @hoge$ •¶Žš—ñŒ^ˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”
- hoge ”’lŒ^‰i‘±“IƒLƒƒƒ‰ƒNƒ^[•Ï”
- $hoge ”’lŒ^‰i‘±“I‘SƒLƒƒƒ‰ƒNƒ^[‹¤—L•Ï”
-
- ˆêŽž“I‚Å‚È‚¢•Ï”‚Í‘½—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
- •Û‘¶‚·‚é•K—v‚Ì‚È‚¢‚à‚̂͋ɗ͈ꎞ•Ï”‚ÅÏ‚Ü‚¹‚é‚ׂ«‚Å‚·B
- •Û‘¶‚·‚é•K—v‚ª‚ ‚é‚Ì‚©‚È‚¢‚Ì‚©‚Í‚æ‚­l—¶‚µ‚Ä‚­‚¾‚³‚¢B
- “Á‚ɉi‘±“I‚ȃLƒƒƒ‰ƒNƒ^[/ƒAƒJƒEƒ“ƒg•Ï”‚ÍA”‚ɧŒÀ‚ª‚ ‚è‚Ü‚·B
- Žg—p‚ªI‚í‚Á‚Ä“ñ“x‚ÆŽg—p‚·‚邱‚Æ‚ª‚È‚¢‚Æ‚í‚©‚Á‚Ä‚¢‚é•Ï”‚Í
- ’l‚ð0‚ÉÝ’è‚·‚邱‚Æ‚Å휂·‚邱‚Æ‚ªo—ˆ‚Ü‚·B
-
- –”z—ñ•Ï”
- •Ï”–¼‚ÌŒã‚ÉŠ‡ŒÊ [ ] ‚ÅŠ‡‚Á‚½Ž®‚ðŽw’è‚·‚邱‚Æ‚Å”z—ñ•Ï”‚É‚È‚è‚Ü‚·B
- •Ï”–¼‚Æ"["‚ÌŠÔ‚É‹ó”’•¶Žš‚ð“ü‚ê‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
-
- <—á> hoge[10] fuga[ @temp ]
-
- ”z—ñ‚Ì—v‘f”Ô†‚Í0`127‚ªŽw’è‚Å‚«‚Ü‚·‚ªA”Ô†0‚Í“¯–¼‚Ì•Ï”‚Æ
- ’l‚ð‹¤—L‚µ‚Ü‚·B‚½‚Æ‚¦‚ÎAhoge[0] ‚Æ hoge ‚Í“¯‚¶•Ï”‚Å‚·B
-
- ”z—ñ•Ï”‚͈ꎞ“IƒLƒƒƒ‰ƒNƒ^[•Ï”AˆêŽž“I/‰i‘±“Iƒ}ƒbƒvƒT[ƒo[•Ï”‚ÅŽg—p‚Å‚«‚Ü‚·B
- •Ï”‚ÌŒ^‚Í”’lA•¶Žš—ñ—¼•û‚Æ‚à—˜—p‚Å‚«‚Ü‚·B
-
- –ƒ‰ƒxƒ‹
- ”¼Šp‰p”‚¨‚æ‚уAƒ“ƒ_[ƒo[‚ªŽg—p‚Å‚«‚Ü‚·B
- •Ï”‚â–½—ß‚È‚Ç‚Æ‹æ•Ê‚·‚邽‚ß L_ ‚ð擪‚ɂ‚¯‚邱‚Æ‚ª„§‚³‚ê‚Ü‚·B
- L_hoge: ‚Æ‚¢‚Á‚½•—‚ÉŽg—p‚µ‚Ü‚·B
- if•¶‚âmenu•¶‚̃Wƒƒƒ“ƒvæ‚ÉŽw’肳‚ê‚Ü‚·B
-
- –’è”
- athena‚Ídb/const.txt‚É€‹’‚µ‚½’蔂ð’ñ‹Ÿ‚µ‚Ü‚·B
- ƒXƒNƒŠƒvƒg“à‚Å‚Ì‚ÝŽg—p‰Â”\‚Å‚·B
-
- ––„‚ßž‚Ý•Ï”
- ˜b‚©‚¯‚½ƒvƒŒƒCƒ„[‚̃Xƒe[ƒ^ƒX‚È‚Ç‚ðŽQÆ‚Å‚«‚Ü‚·B
- db/const.txt‚É‹Lq‚³‚ê‚Ä‚¢‚Ü‚·B
- ƒXƒNƒŠƒvƒg“à‚Å‚Ì‚ÝŽg—p‰Â”\‚Å‚·B
- ‚È‚¨Aˆê•”‚𜂢‚Ä’l‚Ì‘ã“ü‚Í‚Å‚«‚Ü‚¹‚ñB
-
- –Ž®
- –½—ß•¶‚̈ø”‚ª”’l‚¾‚Á‚½ê‡A‚»‚±‚Å—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
- ƒXƒy[ƒX‚Í—v‚ç‚È‚¢‚悤‚Å‚·‚ª‚ ‚Á‚½•û‚ªŒ©ˆÕ‚¢‚Å‚·B
- ”äŠr‰‰ŽZŽq‹y‚ј_—‰‰ŽZŽq‚Í’l‚ª^‚Å‚ ‚Á‚½‚Æ‚«”’l‚Ì1A‹U‚Å‚ ‚Á‚½‚Æ‚«0‚ð•Ô‚µ‚Ü‚·B
-
- –ƒCƒxƒ“ƒg
- Œ`‚ðŽ‚½‚È‚¢ƒXƒNƒŠƒvƒg‚Å‚·B
- ƒ^ƒCƒ€ƒAƒ^ƒbƒN‚È‚Ç‚Ì쬂Ɏg‚¢‚Ü‚·B
- ƒCƒxƒ“ƒg–¼‚ð‹Lq‚·‚é•”•ª‚Å‚ÍAƒCƒxƒ“ƒg–¼::ƒ‰ƒxƒ‹–¼‚Æ‚·‚邱‚Æ‚Å‚»‚̃Cƒxƒ“ƒg‚ÌŽw’肵‚½ƒ‰ƒxƒ‹‚©‚ç
- ƒXƒNƒŠƒvƒg‚ðŠJŽn‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
-
- ––½—ß\•¶
- ˆø”‚Í”¼ŠpƒXƒy[ƒX‚ð‹ó‚¯‚Ä‹Lq‚µ‚Ä‚­‚¾‚³‚¢B
-
-‚RD–½—ß•¶‹y‚ÑŠÖ”‹y‚ђ蔃‰ƒxƒ‹
- ––½—ß•¶
- mes–½—ß
- mes <string>;
-
- string •¶Žš—ñ
-
- <string>‚É‹Lq‚³‚ꂽ•¶Žš—ñ‚ðƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Éo—Í‚µ‚Ü‚·B
-
- next–½—ß
- next;
-
- ƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Énextƒ{ƒ^ƒ“‚ð•\Ž¦‚µA‘Ò‹@‚µ‚Ü‚·B
-
- close–½—ß
- close;
-
- ƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Écloseƒ{ƒ^ƒ“‚ð•\Ž¦‚µAƒXƒNƒŠƒvƒg‚ðI—¹‚µ‚Ü‚·B
-
- menu–½—ß
- menu <string1>,<label1>[,<stringN>,<labelN>...];
-
- stringN •¶Žš—ñ
- labelN ƒ‰ƒxƒ‹
-
- ƒƒjƒ…[‚ð•\Ž¦‚µ‚Ü‚·B<stringN>‚É‹Lq‚³‚ꂽ•¶Žš—ñ‚ð‘I‘ð‚·‚é‚Æ<labelN>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
- ‚Ü‚½A‘I‚΂ꂽƒ‰ƒxƒ‹‚̔Ԇ‚Í•Ï”@menu‚É‘ã“ü‚³‚ê‚Ü‚·B
- (l15‚É‚à‘ã“ü‚³‚ê‚Ü‚·‚ªA‚±‚¿‚ç‚Í¡Œã“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚Ål15‚ÍŽg—p‚µ‚È‚¢‚ʼnº‚³‚¢j
-
- goto–½—ß
- goto <label>;
-
- label ƒ‰ƒxƒ‹
-
- <label>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
-
- cutin–½—ß
- cutin <filename>,<position>;
-
- filename •¶Žš—ñ
- position ”’l
-
- ƒJƒvƒ‰Eˆõ‚Ȃǂ̃JƒbƒgƒCƒ“‚ð•\Ž¦‚µ‚Ü‚·B<filename>‚Í•\Ž¦‚µ‚½‚¢ƒtƒ@ƒCƒ‹–¼A<position>‚Í•\Ž¦ˆÊ’u‚ðŽw’肵‚Ü‚·B
- positionF0,¶‰ºA1,’†‰›‰ºA2,‰E‰ºA255,ƒJƒbƒgƒCƒ“Á‹Ž
-
- jobchange–½—ß
- jobchange <job>[, <upper>];
-
- job ”’l
- upper ”’l
-
- E‹Æ‚ð•ÏX‚µ‚Ü‚·B<job>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
- <upper>‚Í0=’Êí,1=“]¶,2=—{Žq,-1 or –³‚µ=Œ»Ý‚Ì<upper>‚É‚È‚è‚Ü‚·B
- jobLv‚ÍŽ©“®‚Å‚P‚É‚È‚è‚Ü‚·B
- ƒo[ƒh‚ƃ_ƒ“ƒT[‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-
- input–½—ß
- input [<variable>];
-
- variable •Ï”AÈ—ª‰Â
-
- “ü—̓EƒBƒ“ƒhƒE‚ðŠJ‚«A“ü—̓f[ƒ^‚ð<variable>‚É‘ã“ü‚µ‚Ü‚·B
- •Ï”‚ÌŒ^‚ª•¶Žš—ñŒ^‚Ì‚Æ‚«‚Í•¶Žš—ñ“ü—̓EƒBƒ“ƒhƒEA®”Œ^‚Ì‚Æ‚«‚Í”’l“ü—̓EƒBƒ“ƒhƒE‚É‚È‚è‚Ü‚·B
- <variable>‚ðÈ—ª‚µ‚½ê‡‚É‚Í”’l“ü—̓EƒBƒ“ƒhƒE‚ðo‚µAƒf[ƒ^‚Í•Ï”l14 (¬•¶Žš‚̃Gƒ‹+14)‚É‘ã“ü‚³‚ê‚Ü‚·B
- il14‚Í¡Œã‚Ì“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚ÅAˆø”‚ÍÈ—ª‚µ‚È‚¢‚ʼnº‚³‚¢j
-
- warp–½—ß
- warp <gatname>,<x>,<y>;
-
- gatname •¶Žš—ñ
- x,y ”’l
-
- <gatname>‚ÉŽw’肳‚ꂽMAP‚ÌÀ•W<x>,<y>‚Ƀ[ƒv‚µ‚Ü‚·B
- <gatname>‚ðSavePoint‚É‚µ‚½ê‡AƒZ[ƒuƒ|ƒCƒ“ƒg‚Ɉړ®‚µ‚Ü‚·B
- Random‚É‚µ‚½ê‡A‚»‚ÌMAP“à‚Ì‚Ç‚±‚©‚Ɉړ®‚µ‚Ü‚·B‘¦‚¿<x><y>‚Í–³Ž‹B
-
- setlook–½—ß
- setlook <n1>,<n2>;
-
- n1,n2 ”’l
-
- ŠOŒ©‚ð•ÏX‚µ‚Ü‚·B<n1>‚Í•”•i‚ðA<n2>‚ÍŽí—Þ‚ðŽw’肵‚Ü‚·B
- n1F1,”¯Œ^A2,•ŠíA3,“ªã’iA4,“ª’†’iA5,“ª‰º’iA6,”¯FA7,•žFA8,‚
- ‘•”õ•i‚Í•ÏX‚³‚ê‚Ü‚¹‚ñBƒAƒTƒVƒ“’j‚ƃ[ƒO’j‚ÉŠÖ‚µ‚Ä‚Í•ž‚ÌF‚ª‚ ‚è‚Ü‚¹‚ñB
-
-
- set–½—ß
- set <variable>,<n>;
-
- variable •Ï”
- n ”’l/•¶Žš—ñ
-
- <variable>‚É<n>‚ð‘ã“ü‚µ‚Ü‚·B
- •¶Žš—ñŒ^‚ðŽg—p‚·‚é‚Æ‚«‚Í•Ï”–¼‚Ƀ|ƒXƒgƒtƒBƒbƒNƒX‚ð–Y‚ê‚È‚¢‚ʼnº‚³‚¢B
-
- setarray–½—ß
- setarray <variable>[,<n0>[,<n1>c]];
-
- variable •Ï”
- nx ”’l/•¶Žš—ñ
-
- ”z—ñ<variable>‚É’l<n0>,<n1>,c‚̃ŠƒXƒg‚ð‘ã“ü‚µ‚Ü‚·B
- <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç‘ã“ü‚Å‚«‚Ü‚·B
- <—á> setarray @hoge[2],16,24,32; @hoge‚Ì—v‘f2‚©‚ç4‚Ü‚Å‚ð16,24,32‚É‚·‚éB
-
- cleararray–½—ß
- cleararray <variable>,<n>,<count>;
-
- variable •Ï”
- n ”’l/•¶Žš—ñ
- count ”’l
-
- ”z—ñ<variable>‚É’l<n>‚ð<count>ŒÂ•ª‘ã“ü‚µ‚Ü‚·B
- <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç‘ã“ü‚Å‚«‚Ü‚·B
- <—á> cleararray @hoge[3],0,6; @hoge‚Ì—v‘f3‚©‚ç8‚Ü‚Å‚ð0‚ɃZƒbƒg‚·‚é
-
- copyarray–½—ß
- copyarray <var1>,<var2>,<n>;
-
- <var1>,<var2> •Ï”
- n ŒÂ”
-
- ”z—ñ<var1>‚É”z—ñ<var2>‚Ì—v‘f<n>ŒÂ‚ðƒRƒs[‚µ‚Ü‚·B
- <var1>,<var2>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚çƒRƒs[‚Å‚«‚Ü‚·B
-
- deletearray–½—ß
-
- deletearray <variable>,<n>;
-
- variable •Ï”
- n ”’l
-
- ”z—ñ<variable>‚©‚ç<n>ŒÂ‚Ì—v‘f‚ð휂µAŒã‚ë‚Ì—v‘f‚ð‘O‚É‹l‚ß‚é
- <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç휂ł«‚Ü‚·B
-
- if–½—ß
- if (<cond>) goto <label>;
-
- cond ”’l
- label ƒ‰ƒxƒ‹
-
- <cond>‚ª0ˆÈŠO‚Ìê‡A<label>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
-
- getitem–½—ß
- getitem <itemid>,<num>;
-
- itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
- num ”’l
-
- <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ª“üŽè‚µ‚Ü‚·B
- <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
- ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- getitem2–½—ß
- getitem <itemid>,<num>,<identify>,<refine>,<attribute>,<card1>,
- <card2>,<card3>,<card4>
-
- itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
- num,identify,refine,attribute,card1,card2,card3,card4 ”’l
-
- <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ª“üŽè‚µ‚Ü‚·B
- <identify> ŠÓ’èó‘Ô(0‚Å–¢ŠÓ’èA1‚ÅŠÓ’è)
- <refine> ¸˜B’l
- <attribute> ƒAƒCƒeƒ€‚Ìó‘Ô
- <card1> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚È‚ç255‚Å‘•”õˆÈŠO‚̃AƒCƒeƒ€‚ŃLƒƒƒ‰‚Ì–¼‘O‚ð“ü‚ꂽ‚¢Žž‚Í254
- <card2> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚È‚ç‘®«‚Ư‚Ì‚©‚¯‚ç‚Ì”‚ðÝ’èB¯‚Ì‚©‚¯‚ç‚Ì”(”͈Í:0~3)*5*256 + ‘®«(–³:0A‰Î:3A…:1A•—:4A“y:2)
- <card3> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚âƒLƒƒƒ‰‚Ì–¼‘O‚ª“ü‚éƒAƒCƒeƒ€‚̓Lƒƒƒ‰ID‚̉º‚Ì2ƒoƒCƒg
- <card4> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚âƒLƒƒƒ‰‚Ì–¼‘O‚ª“ü‚éƒAƒCƒeƒ€‚̓Lƒƒƒ‰ID‚Ìã‚Ì2ƒoƒCƒg
-
- <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
- ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- delitem–½—ß
- delitem <itemid>,<num>;
-
- itemid_num ”’l
-
- <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ªŽ¸‚¢‚Ü‚·B
-
- getexp–½—ß
- getexp <base_exp>,<job_exp>;
-
- base_exp ”’l
- job_exp ”’l
-
- <base_exp>‚ÉŽw’肳‚ꂽ”‚¾‚¯Base‚ÉŒoŒ±’l‚ª“ü‚è‚Ü‚·B
- <job_exp>‚ÉŽw’肳‚ꂽ”‚¾‚¯Job‚ÉŒoŒ±’l‚ª“ü‚è‚Ü‚·B
- ƒ}ƒCƒiƒX‚Ì”Žš‚Í“K‰ž‚³‚ê‚Ü‚¹‚ñB
-
- makepet–½—ß
- makepet <petid>;
-
- petid ”’l
-
- <petid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒyƒbƒg‚Ì—‘‚ð쬂µ‚Ü‚·B
-
- viewpoint–½—ß
- viewpoint <type>,<x>,<y>,<id>,<color>;
-
- type,x,y,id ”’l
- color •s–¾
-
- Ž‘—¿•s‘«‚È‚Ì‚ÅÚ‚µ‚¢à–¾‚Í‚Å‚«‚Ü‚¹‚ñ‚ªAƒ~ƒjMAP‚É“_–Å‚·‚é“_‚ð•\Ž¦A휂µ‚Ü‚·B
- type:1,•\Ž¦A2,íœ
-
- heal–½—ß
- heal <hp>,<sp>;
-
- hp,sp ”’l
-
- <hp>•ªHP‚ðA<sp>•ªSP‚ð‰ñ•œ‚µ‚Ü‚·B
-
- itemheal–½—ß
- itemheal <hp>,<sp>;
-
- hp,sp ”’l
-
- <hp>•ªHP‚ðA<sp>•ªSP‚ð‰ñ•œ‚µ‚Ü‚·Bheal‚Ƃ͈Ⴂ‰ñ•œ‚·‚éHP‚ÆSP‚Ì—Ê‚ÉVIT(SP‚Ìê‡INT)‚ƃXƒLƒ‹‚É‚æ‚é•â³‚ª•t‚«‚Ü‚·B
-
- end–½—ß
- end;
-
- ƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·B
-
- setoption–½—ß
- setoption <string>;
-
- string •¶Žš—ñ
-
- ˆø—pF
- PC‚Ɉȉº‚ÅŽ¦‚·•t‘®•i(?)‚ð•t‚¯‚Ü‚·B
- 0x0000 - •t‘®•iíœ
- 0x0001 - ?
- 0x0002 - ƒnƒCƒh(‰e•t‚«)
- 0x0004 - ??
- 0x0008 - ƒJ[ƒg
- 0x0010 - ‘é
- 0x0020 - ƒyƒRƒyƒR(ƒiƒCƒg,ƒNƒ‹ƒZƒCƒ_[‚ÌŽž‚Ì‚Ý—LŒø)
- 0x0040 - ƒnƒCƒh(‰e–³‚µ)
- 0x0080 - ƒJ[ƒg2
- 0x0100 - ƒJ[ƒg3
- 0x0200 - ƒJ[ƒg4
- 0x0400 - ƒJ[ƒg5
- 0x0800 - “ª‚ªƒI[ƒN(Sage‚̃XƒLƒ‹AƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…‚ª‚©‚©‚Á‚½ó‘Ô‚É‚È‚é)
-
- ˆê’[‚·‚ׂÄÁ‚³‚ê‚Ä‚©‚ç•t‚¯’¼‚·‚Ì‚ÅA•¡”Žw’肵‚½‚¢ê‡‚ɂ͇Œv‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
-
- savepoint–½—ß
- savepoint <gatname>,<x>,<y>;
-
- gatname •¶Žš—ñ
- x,y ”’l
-
- <gatname>‚ÌÀ•W<x>,<y>‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚Éݒ肵‚Ü‚·B
-
- openstorage–½—ß
- openstorage;
-
- ‘qŒÉ‚ðŠJ‚«‚Ü‚·B
-
- setcart–½—ß
- setcart;
-
- ƒJ[ƒg‚ð•t‚¯‚Ü‚·B
-
- successrefitem–½—ß
- successrefitem <n>;
-
- n ”’l
-
- ¸˜B¬Œ÷ƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- failedrefitem–½—ß
- failedrefitem <n>;
-
- n ”’l
-
- ¸˜BŽ¸”sƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- setfalcon–½—ß
- setfalcon;
-
- ‘é‚ð•t‚¯‚Ü‚·B
-
- setriding–½—ß
- setriding;
-
- ƒyƒRƒyƒR‚Éæ‚è‚Ü‚·B
-
- monster–½—ß
- monster <gatname>,<x>,<y>,<mobname>,<mobid>,<num>[,<event>];
-
- gatname,mobname •¶Žš—ñ
- x,y,mobid,num ”’l
- event •¶Žš—ñAÈ—ª‰Â
-
- <gatname>‚ÌÀ•W<x>,<y>‚É<mobname>‚ðŽ‚Â<mobid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð<num>‘ÌoŒ»‚³‚¹‚Ü‚·B
- <gatname>‚ªthis‚ÌꇃXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚ª‚¢‚éMAPA
- <x><y>‚ª-1‚Ìê‡AƒXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚ÌÀ•WA
- <mobname>‚ª--en--‚ÌꇉpŒê–¼A--ja--‚Ìꇓú–{Œê–¼A<mobid>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€B
- ‚»‚̃‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«<event>‚ðŠJŽn‚µ‚Ü‚·B
-
- announce–½—ß
- announce <string>,<flag>;
-
- string •¶Žš—ñ
- flag ”’l
-
- <string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
- <flag>‚͈ȉº‚ÉŽ¦‚·’Ê‚è‚Å‚·B
- ƒGƒŠƒAƒtƒ‰ƒO
- 0x00 ‚·‚ׂĂ̂l‚`‚o‚É‘—M
- 0x01 “¯‚¶‚l‚`‚o
- 0x02 ‰æ–Ê“à
- 0x03 Ž©•ª‚Ì‚Ý
- 0x04 “¯‚¶‚l‚`‚oŽI
- Fƒtƒ‰ƒO
- 0x00 ‰©F
- 0x10 ÂF
- “ÁŽêƒtƒ‰ƒO
- 0x00 “Á‚É–³‚µ
- 0x08 ƒCƒxƒ“ƒg—p
-
- ƒGƒŠƒAƒtƒ‰ƒO‚ÆFƒtƒ‰ƒO‚Æ“ÁŽêƒtƒ‰ƒO‚̇Œv‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
-
- killmonster–½—ß
- killmonster <gatname>[,<event>];
-
- gatname •¶Žš—ñ
- event •¶Žš—ñAÈ—ª‰Â
-
- <gatname>‚É‘¶Ý‚·‚郂ƒ“ƒXƒ^[‚ð‚·‚×‚ÄŽE‚µ‚Ü‚·B
- <event>‚É‚æ‚Á‚ČĂÑo‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚Ì‚ÝŽE‚·‚±‚Æ‚à‰Â”\‚Å‚·B<event>‚ðAll‚É‚·‚é‚Æ‚»‚̃}ƒbƒv‚É‚ ‚éˆêŽž“I‚É¢Š«‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚ð‘S‚ÄŽE‚µ‚Ü‚·B
-
- killmonsterall–½—ß
- killmonsterall <gatname>
-
- gatname •¶Žš—ñ
-
- <gatname>‚É‘¶Ý‚·‚郂ƒ“ƒXƒ^[‚ð‚·‚×‚ÄŽE‚µ‚Ü‚·Bkillmonster‚Ƃ͈á‚Á‚Ä‚»‚̃}ƒbƒv‚ÉŽn‚ß‚©‚ç”z’u‚³‚ê‚Ä‚¢‚½ƒ‚ƒ“ƒXƒ^[‚Ü‚Å‘S‚ÄŽE‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·B
-
-
- addtimer–½—ß
- addtimer <ms>,<event>;
-
- ms ”’l
- event •¶Žš—ñ
-
- Œ»Ý‚̃vƒŒƒCƒ„[‚ÉA<ms>ƒ~ƒŠ•bŒo‰ß‚µ‚½Œã<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ð쬂µ‚Ü‚·B
- ‚±‚̃^ƒCƒ}[‚É‚æ‚Á‚ÄŽÀs‚³‚ê‚éƒCƒxƒ“ƒg‚ÍA‚±‚̃vƒŒƒCƒ„[‚Ìî•ñ‚ɃAƒNƒZƒX‚Å‚«‚Ü‚·B
- ƒvƒŒƒCƒ„[‚ªƒƒOƒAƒEƒg‚·‚é‚ƃ^ƒCƒ}[‚Í–³Œø‚ɂȂ邽‚ß’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
- ƒAƒŠ[ƒiƒ}ƒbƒv‚È‚Ç‚ÅŽg—p‚·‚éꇂ͂±‚ê‚Å‚Í‚È‚­NPCƒ^ƒCƒ}[‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
-
- deltimer–½—ß
- deltimer <event>;
-
- event •¶Žš—ñ
-
- Œ»Ý‚̃vƒŒƒCƒ„[‚Ì<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ðÁ‹Ž‚µ‚Ü‚·B
-
- addtimercount–½—ß
- addtimercount <event>,<ms>;
-
- event •¶Žš—ñ
- ms ”’l
-
- Œ»Ý‚̃vƒŒƒCƒ„[‚Ì<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ÌŠJŽn‚Ü‚Å‚ÌŽžŠÔ‚ð<ms>ƒ~ƒŠ•b’ljÁ‚µ‚Ü‚·B
-
- initnpctimer–½—ß
- initnpctimer [<name>];
-
- <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚Ì’l‚ð‚O‚É‚µAƒJƒEƒ“ƒg‚ðŠJŽn‚µ‚Ü‚·B
- name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
-
- ‚±‚ÌNPCƒ^ƒCƒ}[‚̓~ƒŠ•b’PˆÊ‚ÅOnTimerXXXX‚Æ‚¢‚¤ƒ‰ƒxƒ‹ƒCƒxƒ“ƒg‚ðŽÀs‚µ‚Ü‚·B
- <—á> OnTimer1000: <= 1•bŒã, OnTimer30000: <= 30•bŒã
-
- stopnpctimer–½—ß
- stopnpctimer [<name>];
-
- <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð’âŽ~‚µ‚Ü‚·B
- name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
-
- startnpctimer–½—ß
- stopnpctimer [<name>];
-
- <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ðÄŠJ‚µ‚Ü‚·B
- name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- ‚±‚¿‚ç‚Íinitnpctimer‚ƈႢAƒJƒEƒ“ƒg‚ð0‚ɃŠƒZƒbƒg‚µ‚Ü‚¹‚ñB
- stopnpctimer‚ƃZƒbƒg‚ÅŽg—p‚µ‚Ü‚·B
-
- setnpctimer–½—ß
- setnpctimer <tick>[,<name>]
-
- <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð•ÏX‚µ‚Ü‚·B
- name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- getnpctimer‚ð—˜—p‚·‚ê‚ÎAƒJƒEƒ“ƒg‚𑌸‚Å‚«‚Ü‚·B
-
- disablenpc–½—ß
- disablenpc <npcname>;
-
- npcname •¶Žš—ñ
-
- <npcname>‚𖳌ø‚É‚µ‚Ü‚·B
-
- enablenpc–½—ß
- enablenpc <npcname>;
-
- npcname •¶Žš—ñ
-
- <npcname>‚ð—LŒø‚É‚µ‚Ü‚·B
-
- mapannounce–½—ß
- mapannounce <gatname>,<string>,<flag>;
-
- gatname,string •¶Žš—ñ
- flag ”’l
-
- <gatname>‘S‘Ì‚É<string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
- flag:0,‰©F•¶ŽšA16,•¶Žš
-
- areaannounce–½—ß
- areannounce <gatname>,<x0>,<y0>,<x1>,<y1>,<string>,<flag>;
-
- gatname,string •¶Žš—ñ
- x0,y0,x1,y1,flag ”’l
-
- <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚ɑ΂µ<string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
- flag:0,‰©F•¶ŽšA16,•¶Žš
-
- areawarp–½—ß
- areawarp <gatname>,<x0>,<y0>,<x1>,<y1>,<gatname2>,<x>,<y>;
-
- gatname,gatname2 •¶Žš—ñ
- x0,y0,x1,y1,x,y ”’l
-
- <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É‚¢‚éPC‚ð<gatname2>‚ÌÀ•W<x>,<y>‚Ɉړ®‚³‚¹‚Ü‚·B
-
- areamonster–½—ß
- areamonster <gatname>,<x0>,<y0>,<x1>,<y1>,<mobname>,<mobid>,<num>[,<event>];
-
- gatname,mobname •¶Žš—ñ
- x0,y0,x1,y1,mobid,num ”’l
- event •¶Žš—ñAÈ—ª‰Â
-
- <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É<mobname>‚ðŽ‚Â<mobid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð<num>‘ÌoŒ»‚³‚¹‚Ü‚·B
- <gatname>‚ªthis‚ÌꇃXƒNƒŠƒvƒgŽÀsMAPA<x><y>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€À•WA
- <mobname>‚ª--en--‚ÌꇉpŒê–¼A--ja--‚Ìꇓú–{Œê–¼A<mobid>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€B
- ‚»‚̃‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«<event>‚ðŠJŽn‚µ‚Ü‚·B
-
- percentheal–½—ß
- percentheal <hp>,<sp>;
-
- hp,sp ”’l
-
- HP‚ÆSP‚ð<hp>%A<sp>%•ª‰ñ•œ‚µ‚Ü‚·B
-
- resetstatus–½—ß
- resetstatus;
-
- ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðƒŠƒZƒbƒg‚µ‚Ü‚·B
-
- resetskill–½—ß
- resetskill;
-
- ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðƒŠƒZƒbƒg‚µ‚Ü‚·B
-
- statusup–½—ß
- statusup <st>;
-
- st ”’l
-
- <st>‚ÅŽw’肳‚ꂽŠî–{ƒXƒe[ƒ^ƒX’l‚ðAƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðÁ”‚Ä1ã‚°‚éB
- <st>‚Í bStr, bVit, bInt, bAgi, bDex, bLuk ‚ÅŽw’è‚·‚éB
-
- statusup2–½—ß
- statusup2 <st>,<n>;
-
- st,n ”’l
-
- <st>‚ÅŽw’肳‚ꂽŠî–{ƒXƒe[ƒ^ƒX’l‚ðAƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðÁ”‚¸‚É<n>ã‚°‚éB
- <st>‚Í bStr, bVit, bInt, bAgi, bDex, bLuk ‚ÅŽw’è‚·‚éB
-
- skill–½—ß
- skill <skillid>,<skilllv>,<flag>;
-
- skillid,skilllv,flag ”’l
-
- <skillid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ÂLV<skilllv>ƒXƒLƒ‹‚ðK“¾‚µ‚Ü‚·B
- flag:0,P‹v“I‚ȃXƒLƒ‹Žæ“¾(ƒXƒLƒ‹ƒcƒŠ[‚É‚È‚¢•¨‚Í–³Œø)A1,ˆêŽž“I(”͈͕͂s–¾)‚Ȏ擾A
- <skilllv>‚ð0‚É‚·‚é‚Æ‚±‚Å‚»‚̃XƒLƒ‹‚ð–Y‚ꂳ‚¹‚邱‚Æ‚à‰Â”\‚Å‚·B
-
- waitingroom–½—ß
- waitingroom <title>,<limit>[,<event>[,<trigger>]];
-
- title •¶Žš—ñ
- limit ”’l
- event •¶Žš—ñAÈ—ª‰Â
- trigger ”’lAÈ—ª‰Â
-
- <title>‚ðƒ^ƒCƒgƒ‹‚Æ‚µ‚ă`ƒƒƒbƒgƒ‹[ƒ€‚ð•\Ž¦‚³‚¹‚Ü‚·B
- <trigger>‚ð–ž‚½‚µ‚½‚Æ‚«A<event>‚ð“®ì‚³‚¹‚邱‚Æ‚ª‰Â”\‚Å‚·B
- <trigger>‚ðÈ—ª‚·‚é‚Æ<limit>‚Ì”’l‚ªŽg—p‚³‚ê‚Ü‚·B
-
- delwaitingroom–½—ß
- delewaitingroom [<name>]
-
- name •¶Žš—ñAÈ—ª‰Â
-
- Žw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚ð•Â‚¶‚Ü‚·B
- <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
-
- disablewaitingroomevent–½—ß
- disablewaitingroomevent [<name>]
-
- name •¶Žš—ñAÈ—ª‰Â
-
- <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚𖳌ø‚É‚µ‚Ü‚·B
- <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
-
- enablewaitingroomevent–½—ß
- enablewaitingroomevent [<name>]
-
- name •¶Žš—ñAÈ—ª‰Â
-
- <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ð—LŒø‚É‚µ‚Ü‚·B
- <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- ‚Ü‚½AŠù‚ɃCƒxƒ“ƒg‚ª‹N‚±‚él”‚É’B‚µ‚Ä‚¢‚éê‡A
- ‘¦À‚ɃCƒxƒ“ƒg‚ðŽÀs‚µ‚Ü‚·B
-
- warpwaitingnpc–½—ß
- warpwaitingnpc <gatname>,<x>,<y>[,<num>];
-
- gatname •¶Žš—ñ
- x,y,num ”’l
-
- –½—ß‚ðŽÀs‚µ‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚É“ü‚Á‚Ä‚¢‚éPC‚Ì‚¤‚¿A
- <num>‚ÅŽw’肵‚½l”‚ðA<gatname>‚ÌÀ•W<x>,<y>‚Ɉړ®‚³‚¹‚Ü‚·B
- <num>‚ðÈ—ª‚·‚é‚Æ waitingroom‚Ì<trigger>‚ÅŽw’肵‚½l”‚ðŽg—p‚µ‚Ü‚·B
-
- ƒ[ƒv‚³‚¹‚½l”‚ð $@warpwaitingpcnum ‚ÉAƒ[ƒv‚³‚¹‚½l‚̃AƒJƒEƒ“ƒgID‚ð
- ”z—ñ $@warpwaitingpc ‚ɃZƒbƒg‚µ‚Ü‚·(擪‚©‚çl”•ª)B
-
-
- emotion–½—ß
- emotion <n>;
-
- n ”’l
-
- <n>ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚Ü‚·B
-
- setmapflag–½—ß
- setmapflag <gatname>,<flag>;
-
- gatname •¶Žš—ñ
- flag ”’l
-
- <gatname>‚Ìmapflag‚ð’ljÁ‚µ‚Ü‚·B
- <flag>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-
- removemapflag–½—ß
- removemapflag <gatname>,<flag>;
-
- gatname •¶Žš—ñ
- flag ”’l
-
- <gatname>‚Ìmapflag‚ðÁ‹Ž‚µ‚Ü‚·B
- <flag>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-
- pvpon–½—ß
- pvpon <gatname>;
-
- gatname •¶Žš—ñ
-
- <gatname>‚ðPVP‰Â”\MAP‚É‚µ‚Ü‚·B
-
- pvpoff–½—ß
- pvpoff <gatname>;
-
- gatname •¶Žš—ñ
-
- <gatname>‚ðPVP•s‰ÂMAP‚É‚µ‚Ü‚·B
-
- gvgon–½—ß
- gvgon <gatname>;
-
- gatname •¶Žš—ñ
-
- <gatname>‚ðƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
-
- gvgoff–½—ß
- gvgoff <gatname>;
-
- gatname •¶Žš—ñ
-
- <gatname>‚ð”ñƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
-
- setmapflagnosave–½—ß
- setmapflagnosave <gatname>,<savegatname>,<x>,<y>;
-
- gatname,nosavegat •¶Žš—ñ
- x,y ”’l
-
- <gatname>‚Ìmapflag‚ÉnosaveAˆø”‚Æ‚µ‚Ä<savegatname>,<x>,<y>‚ðݒ肵‚Ü‚·B
-
- detachrid–½—ß
- detachrid;
-
- NPC‚ɃAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚éID‚ðƒNƒŠƒA‚µ‚Ü‚·B
- ˆÈŒãAƒLƒƒƒ‰ƒNƒ^[î•ñ‚ð•K—v‚Æ‚·‚é–½—ß‚ªŽÀs‚Å‚«‚È‚­‚È‚è‚Ü‚·B
-
- doevent–½—ß
- doevent <name>;
-
- name •¶Žš—ñ
-
- ƒvƒŒƒCƒ„[Žå‘̂̃Cƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B<name>‚ɂ̓Cƒxƒ“ƒg–¼‚ðŽw’肵‚Ü‚·B
- ƒvƒŒƒCƒ„[‚ª‘¼‚ÌNPC‚Ɖï˜b’†‚È‚Ç‚ÅŽÀs‚Å‚«‚È‚¢ê‡AƒLƒ…[‚É“ü‚èAŽÀs‰Â”\‚É‚È‚é‚Ü‚Å‘Ò‚Á‚ÄŽÀs‚³‚ê‚Ü‚·B
- ƒLƒ…[‚̃TƒCƒY‚͂ƂĂଂ³‚¢‚Ì‚ÅA˜A‘±‚Å‹N‚±‚é‚ƃCƒxƒ“ƒg‚ª–³Ž‹‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- ƒ‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚àŽw’è‚Å‚«‚Ü‚·‚ªANPC–¼‚ðÈ—ª‚Å‚«‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-
- donpcevent–½—ß
- donpcevent <name>;
-
- name •¶Žš—ñ
-
- ƒvƒŒƒCƒ„[‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚È‚¢(NPCŽå‘Ì‚Ì)ƒCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
- <name>‚ɂ̓Cƒxƒ“ƒg–¼‚ðŽw’肵‚Ü‚·BƒCƒxƒ“ƒg‚Í‘¦À‚ÉŽÀs‚³‚ê‚Ü‚·B
- ƒ‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚àŽw’è‚Å‚«ANPC–¼‚ðÈ—ª‚·‚邱‚Æ‚ÅAƒCƒxƒ“ƒg‚ðƒuƒ[ƒhƒLƒƒƒXƒg‚Å‚«‚Ü‚·B
- i•¡”‚ÌNPC‚Ì“¯‚¶–¼‘O‚̃‰ƒxƒ‹‚ðŽÀs‚Å‚«‚éB —á„"::OnEvent"j
-
- callsub–½—ß
- callsub <label>
-
- label ƒ‰ƒxƒ‹
-
- “¯ˆêƒXƒNƒŠƒvƒg“à‚̃‰ƒxƒ‹<label>‚ðƒTƒuƒ‹[ƒeƒBƒ“‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·B
- ƒTƒuƒ‹[ƒeƒBƒ“‚©‚ç•œ‹A‚·‚é‚Æ‚«‚Íreturn–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
- ‚±‚Ì–½—ß‚Íreturn–½—ß‚ÌŽÀs󋵂ɂæ‚Á‚Ä‚ÍŠÖ”‚Æ‚µ‚ÄŽg—p‚·‚邱‚Æ‚ào—ˆ‚Ü‚·B
-
- callfunc–½—ß
- callfunc <func>
-
- func •¶Žš—ñ
-
- <func>‚Å’è‹`‚³‚ꂽƒ†[ƒU[’è‹`ŠÖ”‚ðŽÀs‚µ‚Ü‚·B
- ƒ†[ƒU[’è‹`ŠÖ”‚©‚ç•œ‹A‚·‚é‚Æ‚«‚Íreturn–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
- ‚±‚Ì–½—ß‚Íreturn–½—ß‚ÌŽÀs󋵂ɂæ‚Á‚Ä‚ÍŠÖ”‚Æ‚µ‚ÄŽg—p‚·‚邱‚Æ‚ào—ˆ‚Ü‚·B
-
- return–½—ß
- return <retval>
-
- retval ”’l‚Ü‚½‚Í•¶Žš—ñAÈ—ª‰Â
-
- ’¼‚¿‚ɃTƒuƒ‹[ƒeƒBƒ“‚à‚µ‚­‚̓†[ƒU[’è‹`ŠÖ”‚𔲂¯AŒÄ‚Ño‚µŒ³‚É–ß‚è‚Ü‚·B
- <retval>‚Í–ß‚è’l‚ÅAcallsub‚Ü‚½‚Ícallfunc‚ªŠÖ”‚Æ‚µ‚ČĂÑo‚³‚ê‚Ä‚¢‚é‚Æ‚«A‚±‚Ì–ß‚è’l‚ªŽg—p‚³‚ê‚Ü‚·B
- callsub‚Ü‚½‚Ífunc‚ª–½—ß‚Æ‚µ‚ČĂ΂ê‚Ä‚¢‚é‚Æ‚«‚ÍA<retval>‚ÍÈ—ª‚µ‚Ä‚­‚¾‚³‚¢B
-
- –ŠÖ”
- randŠÖ”
- rand(<n1>[,<n2>])
-
- n1 ”’l
- n2 ”’lAÈ—ª‰Â
-
- <n1>‚Ì‚ÝŽw’肳‚ê‚Ä‚¢‚½ê‡A0‚©‚ç<n1>-1‚Ü‚Å‚Ì”’l‚ðƒ‰ƒ“ƒ_ƒ€‚É‘I‚ñ‚Å•Ô‚µ‚Ü‚·B
- <n2>‚ðŽw’肵‚½ê‡A<n1>‚©‚ç<n2>‚Ü‚Å‚Ì”ƒ`‚ðƒ‰ƒ“ƒ_ƒ€‚É‘I‚ñ‚Å•Ô‚µ‚Ü‚·B
-
- getitemnameŠÖ”
- getitemname(<itemid>)
-
- itemid ”’l
-
- <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚Ìjname‚𕶎š—ñ‚Å•Ô‚µ‚Ü‚·B
- ‚È‚¨AƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ðŽQÆ‚µ‚Ü‚·
-
- countitemŠÖ”
- countitem(<itemid>)
-
- itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
-
- <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚ÌŠŽ”‚ð•Ô‚µ‚Ü‚·B
- <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
- ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- checkweightŠÖ”
- checkweight(<itemid>,<num>)
-
- itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
- num ”’l
-
- <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂŽ‚‚±‚Æ‚ª‚Å‚«‚é‚Ì‚È‚ç‚Î1‚ðA
- ‚Å‚«‚È‚¯‚ê‚Î0‚ð•Ô‚µ‚Ü‚·B
- <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
- ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- strcharinfoŠÖ”
- strcharinfo(<n>)
-
- n ”’l
-
- ƒLƒƒƒ‰î•ñ‚ð•Ô‚µ‚Ü‚·B
- n:0,ƒLƒƒƒ‰–¼A1,ƒp[ƒeƒB[–¼A2,ƒMƒ‹ƒh–¼
-
- getequipnameŠÖ”
- strcharinfo(<n>)
-
- n ”’l
-
- ‘•”õ•i–¼‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequipisequipedŠÖ”
- getequipisequiped(<n>)
-
- n ”’l
-
- ‘•”õ‚µ‚Ä‚¢‚½‚ç1A‚µ‚Ä‚¢‚È‚©‚Á‚½‚ç0‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequipisenablerefŠÖ”
- getequipisenableref(<n>)
-
- n ”’l
-
- ¸˜B‚Å‚«‚éꇂÍ1A‚Å‚«‚È‚¢ê‡‚Í0‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequipisidentifyŠÖ”
- getequipisidentify(<n>)
-
- n ”’l
-
- ŠÓ’èÏ‚Ý‚Ìê‡1A–¢ŠÓ’è‚Ìê‡0‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequiprefinerycntŠÖ”
- getequiprefinerycnt(<n>)
-
- n ”’l
-
- ¸˜B‚Ì“x‡‚¢‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequipweaponlvŠÖ”
- getequipweaponlv(<n>)
-
- n ”’l
-
- •ŠíLV‚ð•Ô‚µ‚Ü‚·B–h‹ï‚ÌꇂɂÍ0A‚ ‚Æ‚Í•ŠíLV‚ɑΉž‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getequippercentrefineryŠÖ”
- getequippercentrefinery(<n>)
-
- n ”’l
-
- ¸˜B¬Œ÷—¦‚ð•Ô‚µ‚Ü‚·B
- n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
-
- getusersŠÖ”
- getusers(<n>)
-
- n ”’l
-
- l”‚ð•Ô‚µ‚Ü‚·B
- n:0,PC‚Ì‚¢‚éMAP‚Ì‘l”A1,‘SMAP‚Ì‘l”i‘¦‚¿ƒƒOƒCƒ“l”jA8,NPC‚Ì‘¶Ý‚·‚éMAP‚Ì‘l”
-
- getmapusersŠÖ”
- getmapusers(<gatname>)
-
- gatname •¶Žš—ñ
-
- <gatname>‚É‘¶Ý‚·‚é‘l”‚ð•Ô‚µ‚Ü‚·B
-
- getareausersŠÖ”
- getareausers(<gatname>,<x0>,<y0>,<x1>,<y1>)
-
- gatname •¶Žš—ñ
- x0,y0,x1,y1 ”’l
-
- <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É‚¢‚él”‚ð•Ô‚µ‚Ü‚·B
-
- getskilllvŠÖ”
- getskilllv(<skillid>)
-
- skillid ”’l
-
- <skillid>‚ÅŽw’肵‚½ID‚ðŽ‚ƒXƒLƒ‹‚ÌLV‚ð•Ô‚µ‚Ü‚·BK“¾‚µ‚Ä‚¢‚È‚¢ê‡‚Í0‚ð•Ô‚µ‚Ü‚·B
-
- getcharidŠÖ”
- getcharid(<n>)
-
- n ”’l
-
- ƒLƒƒƒ‰î•ñ‚ðID‚Å•Ô‚µ‚Ü‚·B
- n=0 ƒLƒƒƒ‰ID
- n=1 ƒp[ƒeƒB[
- n=2 ƒMƒ‹ƒh
- n=3 ƒAƒJƒEƒ“ƒgID
-
- getpartynameŠÖ”
- getpartyname(<n>)
-
- n ”’l
-
- <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒp[ƒeƒB[–¼‚ð•Ô‚µ‚Ü‚·B
-
- getguildnameŠÖ”
- getguildname(<n>)
-
- n ”’l
-
- <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh–¼‚ð•Ô‚µ‚Ü‚·B
-
- getguildmasterŠÖ”
- getguildname(<n>)
-
- n ”’l
-
- <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh‚̃}ƒXƒ^[‚Ì–¼‘O‚ð•Ô‚µ‚Ü‚·B
-
- getguildmasteridŠÖ”
- getguildmasterid(<n>)
-
- n ”’l
-
- <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh‚̃}ƒXƒ^[‚̃Lƒƒƒ‰ƒNƒ^[ID‚ð•Ô‚µ‚Ü‚·B
-
- basicskillcheckŠÖ”
- basicskillcheck(0);
-
- battle_athena.conf‚Ìbasic_skill_check‚ÌÝ’è’l‚ð•Ô‚µ‚Ü‚·B0‚͈Ӗ¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª‰½‚à“ü‚ê‚È‚©‚Á‚½ê‡ƒGƒ‰[‚É‚È‚è‚Ü‚·B
- basic_skill_check‚ƃJƒvƒ‰‚Ì‘qŒÉ—˜—p‚ð‡‚킹‚éˆ×‚Éì‚Á‚½•¨‚Å‚»‚êˆÈŠO‚Ì‹@”\‚Í‚ ‚è‚Ü‚¹‚ñB–ß‚Á‚½”’l‚ª0‚È‚çbasic_skill_check‚ªnoA1‚È‚çyes‚Å‚·B
-
- getgmlevelŠÖ”
- getgmlevel(0);
-
- ƒvƒŒƒCƒ„[‚ÌGMƒŒƒxƒ‹‚ð•Ô‚µ‚Ü‚·B
-
- guildopenstorageŠÖ”
- guildopenstorage(0);
-
- ƒMƒ‹ƒh‘qŒÉ‚ðŠJ‚«‚Ü‚·B
- •Ô‚½”’l‚ª2‚È‚çƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢ƒLƒƒƒ‰‚ÆŒ¾‚¤ˆÓ–¡‚Å
- 1‚Ȃ瑼‚̃Mƒ‹ƒhƒƒ“ƒo[‚ª‘qŒÉ‚ðŽg—p’†‚̈Ӗ¡‚Å‚·B
- 0‚Ȃ笌÷“I‚ɃMƒ‹ƒh‘qŒÉ‚ªŠJ‚¢‚½‚Æ‚Ì‚±‚Æ‚Å‚·B
-
- getwaitingroomstateŠÖ”
- getwaitingroomstate(<num>,[<name>])
-
- num ”’l
- name •¶Žš—ñAÈ—ª‰Â
-
- <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚Ìó‘Ô‚ð•Ô‚µ‚Ü‚·B
- <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- <num>‚Å“¾‚½‚¢î•ñ‚ðŽw’肵‚Ü‚·B
-
- num=0 Œ»Ýƒ`ƒƒƒbƒgƒ‹[ƒ€‚É“ü‚Á‚Ä‚¢‚él”i”’lj
- num=1 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÌŒÀŠEl”i”’lj
- num=2 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ð‹N‚±‚·l”i”’lj
- num=3 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ª—LŒø‚©‚Ç‚¤‚©i”’lj
- num=4 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃^ƒCƒgƒ‹i•¶Žš—ñj
- num=5 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃pƒXƒ[ƒhi•¶Žš—ñj
- num=16 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg–¼i•¶Žš—ñj
- num=32 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ª–žˆõ‚©‚Ç‚¤‚©i”’lj
- num=33 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ŃCƒxƒ“ƒg‚ª‹N‚±‚él”‚©‚Ç‚¤‚©i”’lj
-
- getnpctimerŠÖ”
- getnpctimer(<num>[,<name>])
-
- num ”’l
-
- <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚Ìî•ñ‚𓾂܂·B
- name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- <num>‚Å“¾‚½‚¢î•ñ‚ðŽw’肵‚Ü‚·B
-
- num=0 Œ»Ý‚ÌNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg’l
- num=1 Œ»ÝNPCƒ^ƒCƒ}[‚ª“®ì‚µ‚Ä‚¢‚é‚©‚Ç‚¤‚©
- num=2 Žw’èNPC‚̃^ƒCƒ}[ƒCƒxƒ“ƒgƒ‰ƒxƒ‹‚Ì‘”
-
- attachridŠÖ”
- attachrid(<num>)
-
- num ”’l
-
- <num>‚ÅŽw’肳‚ꂽID‚̃Lƒƒƒ‰ƒNƒ^[‚ðŽÀs‚µ‚½ƒXƒNƒŠƒvƒg‚ɃAƒ^ƒbƒ`‚µ‚Ü‚·B
- ˆÈŒãAƒLƒƒƒ‰ƒNƒ^[‚ÉŠÖ‚·‚é–½—ß‚âŠÖ”/•Ï”‚È‚Ç‚Í‘S‚ÄV‚µ‚¢ƒLƒƒƒ‰ƒNƒ^[‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
- ‚±‚ê‚̓XƒNƒŠƒvƒg‚ªI—¹/’†’f‚·‚é(close,end,menu,next,input‚È‚Ç‚ÌŽÀs)‚Ü‚Å—LŒø‚Å‚·B
- Žå‚ɃCƒxƒ“ƒg‚Å‹N“®‚³‚ꂽƒXƒNƒŠƒvƒg“à‚Ń}ƒbƒv•Ï”‚ðŽg‚Á‚ĕʃLƒƒƒ‰ƒNƒ^[‚ð
- ƒAƒ^ƒbƒ`‚·‚é‚Ì‚ÉŽg—p‚µ‚Ü‚·Bgetcharid(3)‚ÅŠ“¾‚µ‚½ƒAƒJƒEƒ“ƒgID‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
- ‚È‚¨Aƒfƒ^ƒbƒ`‚É‚Ídetachrid–½—ß‚ðŽg‚¢‚Ü‚·B
-
- ’ˆÓ‚·‚ׂ«“_‚Æ‚µ‚Ä‚ÍA‚±‚Ì–½—ß‚ÅPC‚ðƒAƒ^ƒbƒ`‚µ‚½ê‡Ames,menu,next‚È‚Ç‚Ì
- ƒEƒBƒ“ƒhƒE(‚âƒ{ƒ^ƒ“)‚ªo‚é–½—ß‚ðŽÀs‚µ‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB
- ‘ŠŽè‚ª‘¼‚ÌNPC‚Ɖï˜b’†‚Ìê‡A‚±‚ê‚ç‚Ì–½—߂ͳ‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
- î•ñŠ“¾–½—ß‚È‚Ç‚¾‚¯‚ÅÏ‚Ü‚¹‚é‚ׂ«‚Å‚·B
-
- ‚±‚ÌŠÖ”‚̓Aƒ^ƒbƒ`‚ɬŒ÷‚µ‚½‚©‚Ç‚¤‚©‚ð•Ô‚µ‚Ü‚·B
- ‹U(0)‚ª•Ô‚Á‚Ä—ˆ‚½ê‡‚ÍAŠY“–ƒLƒƒƒ‰ƒNƒ^[‚ª‘¶Ý‚µ‚Ä‚¢‚Ü‚¹‚ñB
-
- isloggedinŠÖ”
- isloggedin(<num>)
-
- num ”’l
-
- <num>‚ÅŽw’肳‚ꂽID‚̃Lƒƒƒ‰ƒNƒ^[‚ª‚±‚̃}ƒbƒvƒT[ƒo[‚É
- ƒƒOƒCƒ“‚µ‚Ä‚¢‚é‚©‚Ç‚¤‚©’²‚ׂ܂·B
-
- getarraysizeŠÖ”
- getarraysize(<variable>)
-
- variable •Ï”
-
- ”z—ñ<variable>‚Ì—LŒø‚ȃTƒCƒY‚𒲂ׂ܂·B
- ‚±‚±‚ł̃TƒCƒY‚Í—v‘f‚ª0i•¶Žš—ñ•Ï”‚Å‚Í"")‚Å‚È‚¢A
- Å‘å‚Ì—v‘f”Ô†+1 ‚É‚È‚è‚Ü‚·B
- ”z—ñ–¼‚Å‚Í‚È‚­—v‘f”Ô†•t‚«‚ÅŽw’è‚·‚é‚ÆA
- ­‚È‚­‚Æ‚à‚»‚Ì—v‘f‚Ü‚Å‚Í‘S‚Ä—LŒø‚Å‚ ‚é‚Ɖ¼’肵‚Ü‚·B
- <—á> ”z—ñ@hoge‚ª 1,2,3,4,5 ‚¾‚Æ‚·‚é‚ÆA
- getarraysize(@hoge)=5, getarraysize(@hoge[10])=10;
-
- callsubŠÖ”
- callsub <label>
-
- callsub–½—ß‚ðŠÖ”‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·BÚ‚µ‚­‚Ícallsub–½—ß‚ðŒ©‚Ä‚­‚¾‚³‚¢B
-
- callfuncŠÖ”
- callfunc <func>
-
- callfunc–½—ß‚ðŠÖ”‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·BÚ‚µ‚­‚Ícallfunc–½—ß‚ðŒ©‚Ä‚­‚¾‚³‚¢B
-
- –’蔃‰ƒxƒ‹
- -ƒ‰ƒxƒ‹
- if•¶‚âmenu•¶‚ÅŽg—p‚µ‚Ü‚·BŽŸ‚Ìs‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
-
- OnInitƒ‰ƒxƒ‹
- MAP‚ªƒ[ƒh‚³‚ꂽ‚Æ‚«ƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
-
- OnInterIfInitƒ‰ƒxƒ‹
- MAPƒT[ƒo[‚ªInterƒT[ƒo[‚ÉÚ‘±‚µ‚½‚Æ‚«‚ÉŽÀs‚µ‚Ü‚·B
-
- OnCharIfInitƒ‰ƒxƒ‹
- MAPƒT[ƒo[‚ªCharƒT[ƒo[‚ÉÚ‘±‚µ‚½‚Æ‚«‚ÉŽÀs‚µ‚Ü‚·B
-
- OnMinuteXXƒ‰ƒxƒ‹
- –ˆŽžXX•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
-
- OnClockXXXXƒ‰ƒxƒ‹
- –ˆ“úXXŽžXX•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚SŒ…‚Å‚·B
-
- OnHourXXƒ‰ƒxƒ‹
- –ˆ“úXXŽž00•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
-
- OnDayXXƒ‰ƒxƒ‹
- –ˆŒŽXX“ú00Žž00•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
-
- OnTimerXƒ‰ƒxƒ‹
- NPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ªX‚É‚È‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
- ‚±‚ÌX‚̓~ƒŠ•b’PˆÊ‚Å‚·BŒ…”‚ÍŠÖŒW‚ ‚è‚Ü‚¹‚ñB
-
- OnAgitInitƒ‰ƒxƒ‹
- ƒMƒ‹ƒhéƒf[ƒ^‚Æè‹’ƒMƒ‹ƒhî•ñ‚ªƒ}ƒbƒvƒT[ƒo[“à‚É
- Š“¾‚³‚ꂽ‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
- ƒMƒ‹ƒhéŠÖŒW‚ÌNPC‚̉Šú‰»‚ÉŽg—p‚µ‚Ü‚·B
-
- OnAgitStartƒ‰ƒxƒ‹
- ƒMƒ‹ƒhUé킪Žn‚Ü‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
-
- OnAgitEndƒ‰ƒxƒ‹
- ƒMƒ‹ƒhUé킪I‚í‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
-
- OnAgitBreakƒ‰ƒxƒ‹
- ƒGƒ“ƒyƒŠƒEƒ€‚ð”j‰ó‚µ‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
- ‚±‚̃‰ƒxƒ‹‚Í”j‰ó‚µ‚½ƒvƒŒƒCƒ„[‚ðŽå‘Ì‚É‚µ‚ÄŽÀs‚³‚ê‚Ü‚·B
-
- OnAgitEliminateƒ‰ƒxƒ‹
- ƒGƒ“ƒyƒŠƒEƒ€”j‰óŒãAƒMƒ‹ƒh‚ÌŠ—LŽÒ‚ª‘‚«Š·‚í‚é‚Æ‚«‚É
- ŒÄ‚΂ê‚Ü‚·B
-
- –’ˆÓŽ–€
- •¶Žš—ñ‚Æà–¾‚³‚ê‚Ä‚¢‚éˆø”‚Í""‚ň͂Á‚Ä‚­‚¾‚³‚¢B
-
-4. Error Message
-
- * Make an error at the time of compile (it is a thing at the time of map server starting).
- A place is displayed for the line number of an error.
-
- unexpected expr end
- It is the end of an unexpected formula.
- ', ', and';' are in the beginning of a formula.
-
- unmatch ')'
- ')' does not match.
- Correspondence of parenthesis'('')' is amusing.
-
- unexpected newline @ string
- It is the new-line which is not expected in a character sequence.
- There is a new-line in the middle of a character sequence (surrounded by '"').
- Probably it is a failure of '"' to close.
-
- unexpected eof @ string
- It is the file terminus which is not expected in a character sequence.
- The file finished in the middle of the character sequence.
- Probably it is a failure of '"' to close.
-
- unexpected character
- unexpected char
- It is an unexpected character.
- It is thought that the variable etc. is not following a naming rule.
-
- l14 and l15 is DEPRECATED. use @menu instead of l15.
- l14 and l15 are not recommended. Please use @menu instead of l15.
-
- prefix 'l' is DEPRECATED. use prefix '@' instead.
- Prefix'l' is not recommended. Please use '@' instead.
-
- unmatch ']'
- ']' does not carry out an interval.
- Correspondence of parenthesis']' is missing.
-
- expect function
- ŠÖ”‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
- ŠÖ”ŒÄ‚Ño‚µ‰‰ŽZŽq'('‚Ì‘O‚ÉŠÖ”ˆÈŠO‚̃Vƒ“ƒ{ƒ‹‚ª‚ ‚è‚Ü‚·B
- ‚¨‚»‚ç‚­ŠÖ”–¼‚ðŠÔˆá‚¦‚Ä‚¢‚Ü‚·B
-
- expect ',' or ')' at func params
- ŠÖ”‚̈ø”‚É‚¨‚¢‚Ä','‚©')'‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
- ‚¨‚»‚ç‚­ˆø”‹æØ‚è‚Ì','‚©')'‚ð–Y‚ê‚Ä‚¢‚Ü‚·B
-
- func request '(' ')'
- ŠÖ”ŒÄ‚Ño‚µ‚ÌŠ‡ŒÊ‘Ήž–â‘è
- ‚¨‚»‚ç‚­ˆø”‚Ì”‚ª128‚ð’´‚¦‚Ü‚µ‚½B
-
- illeagal number of parameters
- ƒpƒ‰ƒ[ƒ^‚Ì”‚ª•s³‚Å‚·
- ŠÖ”/–½—߃pƒ‰ƒ[ƒ^‚̌”‚ªˆÙ‚È‚è‚Ü‚·B
- ˆø”‚̌”‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B
- ƒGƒ‰[ˆÊ’u‚Í‘S‚Ă̈ø”‚ÌŒã‚É‚È‚è‚Ü‚·B
-
- expect command
- –½—ß‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
- –½—߈ȊO‚̃Vƒ“ƒ{ƒ‹‚ª“Ë‘RoŒ»‚µ‚Ä‚¢‚Ü‚·B
- ‚¨‚»‚ç‚­–½—ß–¼‚ðŠÔˆá‚¦‚Ä‚¢‚Ü‚·B
-
- expect ',' or ';' at cmd params
- –½—߂̈ø”‚É‚¨‚¢‚Ä','‚©';'‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
- ‚¨‚»‚ç‚­ˆø”‹æØ‚è‚Ì','‚©';'‚ð–Y‚ê‚Ä‚¢‚Ü‚·B
-
- need ';'
- ';'‚ª•K—v‚Å‚·
- ‚¨‚»‚ç‚­ˆø”‚Ì”‚ª128‚ð’´‚¦‚Ü‚µ‚½B
-
- ŽÀsŽž‚̃Gƒ‰[
- fatal error ! player not attached!
- ’v–½“IƒGƒ‰[IƒvƒŒƒCƒ„[‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚Ü‚¹‚ñI
-
- ƒLƒƒƒ‰ƒNƒ^[‚ð“Á’è‚Å‚«‚È‚¢ƒCƒxƒ“ƒg‚ÅŽÀs‚³‚ê‚Ä‚¢‚é
- ƒXƒNƒŠƒvƒg‚Ì’†‚ŃLƒƒƒ‰ƒNƒ^[î•ñ‚ª•K—v‚È–½—ß‚âŠÖ”A
- •Ï”‚ÖƒAƒNƒZƒX‚µ‚Ü‚µ‚½BattachridŠÖ”‚ðŽg‚¤‚©A
- ƒLƒƒƒ‰ƒNƒ^[î•ñ‚ª•s—v‚È–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
- ‚à‚µ‚­‚ÍAattachridŠÖ”‚Åݒ肳‚ꂽî•ñ‚ª•s³‚Å‚·B
- ‚È‚¨A‚±‚̃Gƒ‰[‚ª‹N‚±‚é‚Æ’¼Œã‚ɃRƒA‚ð“f‚­‚ÆŽv‚í‚ê‚Ü‚·B
-
- NPCŽå‘̃Cƒxƒ“ƒg‚Åannounce‚µ‚½‚Æ‚«‚Ƀtƒ‰ƒO0x08‚ðŽw’肵‚Ä‚¢‚È‚¢
- ê‡‚à‚±‚̃Gƒ‰[‚ª‚Å‚Ü‚·B
-
-
- illeagal scope string variable.
- •¶Žš—ñ•Ï”‚̃XƒR[ƒv‚ª•s³‚Å‚·B
- –¢‘Ήž‚̃vƒŒƒtƒBƒbƒNƒX‚Å•¶Žš—ñ•Ï”‚ªŽg—p‚³‚ê‚Ü‚µ‚½B
- ƒvƒŒƒtƒBƒbƒNƒX‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B
-
- illeagal scope
- ƒXƒR[ƒv‚ª•s³‚Å‚·B”z—ñ•Ï”–¢‘Ήž‚̃vƒŒƒtƒBƒbƒNƒX‚ð
- Ž‚•ϔ‚É”z—ñ•Ï”Œn‚Ì–½—ß‚ðŽÀs‚µ‚½ê‡‚È‚ÇB
-
- not label !
- goto/menu–½—߂щƒxƒ‹‚ªŽw’肳‚ê‚é‚ׂ«‚Æ‚±‚ë‚É
- ƒ‰ƒxƒ‹ˆÈŠO‚̃Vƒ“ƒ{ƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚·B
- ‚à‚µ‚­‚ÍAƒ‰ƒxƒ‹–¼‚Æ•Ï”–¼‚ªƒoƒbƒeƒBƒ“ƒO‚µ‚Ä‚¢‚Ü‚·B
-
- buildin_set: not name
- set–½—ß‚Å‘æˆêˆø”‚ª•Ï”–¼‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- getelementofarray (operator[]): param2 illeagal number
- ”z—ñ•Ï”‚Å[]“à‚Ì’l‚ª•s³‚Å‚·
- []“à‚Ì’l‚ª0–¢–ž‚©128ˆÈã‚É‚È‚è‚Ü‚µ‚½
-
- getelementofarray (operator[]): param1 not name
- ”z—ñ•Ï”‚Å[]‚Ì‘O‚̃Vƒ“ƒ{ƒ‹‚ª•Ï”–¼‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
-
- op_2: int&str, str&int not allow.
- ŠÖŒW‰‰ŽZŽqi”äŠr‰‰ŽZŽqj‚ÅA”’l‚Æ•¶Žš—ñA‚à‚µ‚­‚Í
- •¶Žš—ñ‚Æ”’l‚ªŽw’肳‚ê‚Ü‚µ‚½B
-
- infinity loop !
- ƒXƒNƒŠƒvƒg‚ÌŽÀs–½—ß”‚©Agoto/menu–½—ߎÀs‰ñ”‚ª
- ‘½‚·‚¬‚é‚Ì‚ÅA–³ŒÀƒ‹[ƒv‚Æ”»’f‚µ‚Ü‚µ‚½B
- ƒXƒNƒŠƒvƒg‚ÌŽÀs‚Í‹­§“I‚É’†’f‚³‚ê‚Ü‚µ‚½B
-
- not function and command !
- ŠÖ”ŽÀs/–½—ߎÀs•”•ª‚ÅAŠÖ”‚Å‚à–½—ß‚Å‚à‚È‚¢
- ƒVƒ“ƒ{ƒ‹‚ª‚ ‚è‚Ü‚µ‚½B
- if•¶‚Ì‚È‚©‚Å‚ ‚é‰Â”\«‚ª‚‚¢‚Å‚·B
-
- return without callfunc or callsub !
- callfunc‚âcallsub‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Éreturn–½—ß‚ðŽÀs‚µ‚Ü‚µ‚½B
-
- stack.sp(?) != default(?)
- ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ªŠî€ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ƈقȂÁ‚Ä‚¢‚Ü‚·B
- –½—ß‚ðŽÀs‚µ‚½Œ‹‰ÊAƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ª‹¶‚¢‚Ü‚µ‚½B
- ŠÖ”‚ð–½—ß‚Æ‚µ‚ÄŽÀs‚µ‚½‰Â”\«‚ª‚ ‚è‚Ü‚·B
-
-
-5. Postscript
- NPC contained in snapshot was made reference in creating this text.
- I appreciate people which created NPC.
-
-It corrects based on text by asong (2004/3/1).
-
-
+AthenaNPCScript
+
+- Table of contents
+ 0. Introduction
+ 1. Definition of NPC
+ 2. Explanation of Script, and Fundamental Rule
+ 3. Imperative Sentence, Function, and Constant Label
+ 4. Error Message
+ 5. Postscript
+
+0. Introduction
+ The function and form which are contained in this text refer to npc_sample.txt contained in the newest snapshot, and are described.
+ The convenience of the editor which shows this text is considered, <tab> is written and <n> etc. is written. [ a tab character ] [ arbitrary values ].
+ Although it is a coordinate system, please make a lower figure reference.
+ The increase in ?Y
+ ( 0,200)--(200,200)
+ | |
+ | |
+ | |
+ | |
+ | |
+ ( 0, 0)--(200, 0)-> the increase in X
+
+1. Definition of NPC
+ if it is below an athena directory -- anywhere -- being good (if it being able to do below athena/npc) -- please create txt for the time being
+ The NPC describes first what is shown (a way of speaking called NPC depending on the case is unsuitable).
+
+ * Warp point : perform movement between MAP.
+ <gatname>,<x>,<y><tab>warp<tab><displayname><tab><dx>,<dy>,<destination_gatname>,<destination_x>,<destination_y>
+
+ gatname The MAP file name on which a warp point is put is specified. Please do not forget gat.
+ x The horizontal coordinates on which a warp point is put are specified.
+ y The vertical coordinates on which a warp point is put are specified.
+ displayname It is a warp point discernment child. You may overlap. It uses by debugging.
+ dx It is the horizontal effect range of a warp point.
+ dy It is the vertical effect range of a warp point. Probably I do not write a circle but think that it is a region.
+ Example of dx and dy (- is x and y) :
+ 0,0 1,0 2,2
+ *@*– *–*–*–*–*– *–*–*–*–*–*–*–
+ *–*œ*– *–*–*œ*–*– *–*–*–*–*–*–*–
+ *@*– *–*–*–*–*– *–*–*–*–*–*–*–
+ *@ *–*–*–*œ*–*–*–
+ *@ *–*–*–*–*–*–*–
+ *@ *–*–*–*–*–*–*–
+ *@ *–*–*–*–*–*–*–
+ *@
+ * I hear that and it will leap if the cell of - is stepped on.
+ *@
+ destination_gatname It is a warp place. . Even if there is gat and there is not, don't care about it.
+ destination_x They are warp place horizontal coordinates.
+ destination_y They are warp place vertical coordinates.
+
+ Notes :
+ A warp point displays only that plurality is described to be at the end when located on this position.
+ When the coordinates of a warp place are move prohibition cells, it leaps to somewhere in the MAP.
+
+ * Monster : manage the spawning(aka apperance in japanese.) of a monster.
+ <gatname>,<x>,<y>,<xs>,<ys><tab>monster<tab><displayname><tab><npcid>,<number>,<spawn_delay1>,<spawn_delay2>[,<event>]
+
+ gatname The appearing MAP file name is specified.
+ x The appearing horizontal coordinates are specified. Random at 0.
+ y The appearing vertical coordinates are specified. Random at 0.
+ xs The appearing horizontal range is specified.
+ ys The appearing vertical range is specified.
+ Example of xs and ys (- is x and y) :
+ 0,0 2,1
+ *@*œ *–*–*–*–*–
+ *@ *–*–*œ*–*–
+ *@ *–*–*–*–*–
+ *@
+ * And a monster appears from the cell of -.
+
+ displayname It is the display name of the appearing monster.
+ npcid Please refer to mob_db.txt. id of the monster made to appear is specified.
+ number It is the number of the maximum appearances in the MAP and the appearance range.
+ spawn_delay1 After appearing, if specified the amount of time in milliseconds before it re-appears.
+ spawn_delay2 After dying, if specified the amount of time in milliseconds before it re-appears.
+ event The specified event is generated. An abbreviation is possible.
+
+ Notes:
+ spawn_delay1 and spawn_delay2 judge and give priority to whether it re-appears having been based the latest [ direction ] on which as a result.
+
+ * Store : sell an item.
+ <gatname>,<x>,<y>,<direction><tab>shop<tab><displayname><tab><npcid>,<item_id>:<price>,<item_id>:<price>,<item_id>:<price>
+
+ gatname The MAP file name to arrange is specified.
+ x The horizontal coordinates to arrange are specified.
+ y The vertical coordinates to arrange are specified.
+ direction Direction is specified.
+ Details of direction :
+ 7 0 1
+ 6 2
+ 5 4 3
+
+ displayname The display name of the store to arrange is specified.
+ npcid The display sprite ID of the store to arrange is specified.
+ item_id The item ID put on the store to arrange is specified. Please refer to item_db.
+ price The price of the item specified by item_id is set up.
+ each <item_id>:<price> is divided by a comma (,), and more than one can be specified.
+ example:
+ item_id:price,item_id2,price2
+
+ * Script : create NPC.
+ <gatname>,<x>,<y>,<direction><tab>script<tab><displayname><tab><npcid>,<xs>,<ys>,{ <script> ... }
+
+ gatname The MAP file name to arrange is specified.
+ x The horizontal coordinates to arrange are specified.
+ y The vertical coordinates to arrange are specified.
+ direction Direction is specified.
+ displayname The display name of NPC to arrange is specified. It becomes an event name when npcid is -1.
+ When making said display name another operation event, it can be described as a display name::discernment child.
+ npcid The display sprite ID of NPC to arrange is specified. If -1 is specified, it will become an event in map.
+ xs The horizontal range which performs a script automatically is specified.
+ ys The vertical range which performs a script automatically is specified. It is the same as a warp.
+
+ Explanation about the inside of {} (inside parenthesis).
+ Collecting by the party cannot recommend you. If it can do
+ gatname etc,
+ {
+ //comment
+ script;
+ label:
+ script;
+ }
+ Let's write by the said touch. Comment out is //and comment area is /* and */.
+ The ? which does not leave; (semicolon) in the script ending.
+
+ u<gatname>,<x>,<y>,<direction><tab>v‚Ì•”•ª‚ðAu-<tab>v‚Æ‚·‚邱‚Æ‚ÅA
+ ƒ}ƒbƒvƒT[ƒo[“à‚É‚Í‘¶Ý‚µ‚Ä‚¢‚Ä‚àAŽÀۂ̃}ƒbƒv‚É‚Í”z’u‚³‚ê‚È‚¢NPC‚ð쬂ł«‚Ü‚·B
+ ‚±‚ê‚ÍŒãq‚̃fƒ…ƒvƒŠƒP[ƒgƒXƒNƒŠƒvƒg‚ŃRƒs[Œ³‚Æ‚µ‚ÄŽg—p‚µ‚Ü‚·B
+
+ –ƒfƒ…ƒvƒŠƒP[ƒgƒXƒNƒŠƒvƒgFŠù‘¶‚ÌNPCi‚̃XƒNƒŠƒvƒgj‚ðƒRƒs[‚µ‚Ü‚·B
+ <gatname>,<x>,<y>,<direction><tab>duplicate(<source>)<tab><displayname><tab><npcid>,<xs><ys>
+
+ sourceˆÈŠO‚̃pƒ‰ƒ[ƒ^‚Í’Êí‚̃XƒNƒŠƒvƒg‚Æ“¯‚¶‚Å‚·B
+ source‚ɂ̓Rƒs[Œ³‚Æ‚È‚éNPC‚ÌŽ¯•Ê–¼‚ð“ü—Í‚µ‚Ü‚·B
+
+ ƒRƒs[Œ³‚ÌNPC‚ªƒ}ƒbƒvã‚É”z’u‚³‚ê‚Ä‚¢‚éê‡A“¯‚¶ƒ}ƒbƒv‚Å‚ ‚é•K—v‚ª‚ ‚è‚Ü‚·B
+ ƒ}ƒbƒvã‚É”z’u‚³‚ê‚Ä‚¢‚È‚¢ê‡‚ÍA‚ǂ̃}ƒbƒv‚Ö‚àƒRƒs[‰Â”\‚Å‚·B
+
+ –ƒ†[ƒU[’è‹`ŠÖ”ƒXƒNƒŠƒvƒgFƒXƒNƒŠƒvƒg‚©‚çŒÄ‚Ño‚³‚ê‚郆[ƒU[’è‹`ŠÖ”‚ð쬂µ‚Ü‚·B
+ function<tab>script<tab><name><tab>{ <script> ... }
+
+ callfunc–½—߂ŌĂÑo‚·‚±‚Æ‚Ìo—ˆ‚éŠÖ”‚ð쬂µ‚Ü‚·B
+ ŠÖ”‚ÌÅŒã‚É‚Í•K‚¸return–½—ß‚ð“ü‚ê‚Ä‚­‚¾‚³‚¢B
+
+ –ƒ}ƒbƒvƒtƒ‰ƒOFMAP‚̃‹[ƒ‹‚ðŠÇ—‚µ‚Ü‚·B
+ <gatname><tab>mapflag<tab><const>
+
+ gatname ƒ‹[ƒ‹‚ðÝ’è‚·‚éMAPƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ü‚·B
+ const ƒ‹[ƒ‹‚Ì“à—e‚ðŽw’肵‚Ü‚·B
+
+ const‚̈ꗗB
+ nosave<tab><gatname>,<x>,<y>
+ ƒŠƒƒOƒCƒ“‚µ‚½Û<gatname>‚ÌÀ•W<x>,<y>‚Ɉړ®‚µ‚Ü‚·B
+ nomemo<tab>dummy
+ ƒƒ‚‚ðŽæ‚邱‚Æ‚ð‹ÖŽ~‚µ‚Ü‚·B
+ notereport<tab>dummy
+ SavePoint‚Ü‚½‚ÍRandom‚ðŽw’肵‚½warp•¶Aƒ[ƒvƒ|[ƒ^ƒ‹AƒeƒŒƒ|[ƒg‚ð‹ÖŽ~‚µ‚Ü‚·B
+ nobranch<tab>dummy
+ ŒÃ–Ø‚ÌŽ}‚ÌŽg—p‚ð‹ÖŽ~‚µ‚Ü‚·B
+ pvp<tab>dummy
+ PVP‰Â”\MAP‚É‚È‚è‚Ü‚·B
+ nopenalty<tab>dummy
+ ƒfƒXƒyƒiƒ‹ƒeƒB–³‚µ‚É‚È‚è‚Ü‚·B
+ pvp_noparty<tab>dummy
+ PVP‚É‚¨‚¢‚ÄA“¯ƒp[ƒeƒB[UŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
+ pvp_noguild<tab>dummy
+ PVP‚É‚¨‚¢‚ÄA“¯ƒMƒ‹ƒhUŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
+ gvg<tab>dummy
+ ƒV[ƒYƒ‚[ƒh‚É‚È‚è‚Ü‚·B
+ gvg_noparty<tab>dummy
+ ƒV[ƒYƒ‚[ƒh‚É‚¨‚¢‚ÄA“¯ƒp[ƒeƒB[UŒ‚•s‰Â‚É‚È‚è‚Ü‚·B
+
+‚QDƒXƒNƒŠƒvƒg‚Ìà–¾‚ÆŠî–{“I‚È‹K‘¥
+ –”Žš
+ •„†•t‚Ì®”‚Æ‚P‚Ui”•\‹L®”‚ðŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+ •„‡•t®”‚Í”¼Šp”Žš‚Å123456“™‚Æ‹Lq‚µ‚Ü‚·B
+ ‚P‚Ui”•\‹L®”‚Í0x12“™0x‚ð•t‚¯‚Ä‹Lq‚µ‚Ü‚·B
+
+ –•¶Žš—ñ
+ "iƒ_ƒuƒ‹ƒNƒH[ƒe[ƒVƒ‡ƒ“j‚ň͂ñ‚¾•¶Žš‚Í•¶Žš—ñ‚Æ‚µ‚Ä•]‰¿‚³‚ê‚Ü‚·B
+ "iƒ_ƒuƒ‹ƒNƒH[ƒe[ƒVƒ‡ƒ“j‹L†‚ðˆµ‚¢‚½‚¢ê‡‚Í\"‚Æ‹Lq‚µ‚Ü‚·B
+ \‹L†‚ðˆµ‚¢‚½‚¢ê‡‚Í\\‚Æ‹Lq‚µ‚Ü‚·B
+ ‚È‚¨•\Ž¦ŠÖŒW‚Ì•¨‚ÉŠÖ‚µ‚Ä‚Í^000000“™‚ÌF•ÏX‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+ •Ï” + "•¶Žš—ñ"‚Æ‚¢‚Á‚½•¶Žš—ñŒ‹‡‚à‚Å‚«‚Ü‚·B
+
+ –’P€‰‰ŽZŽq
+ ˆÈ‰º‚Ì”’lê—p‚Ì’P€‰‰ŽZŽq‚ª—pˆÓ‚³‚ê‚Ä‚¢‚Ü‚·B
+ - •„†‹t“]i‚Q‚Ì•â”j
+ ~ ƒrƒbƒg˜_—”Û’èi‚P‚Ì•â”j
+ ! ˜_—”Û’è
+
+ –‚Q€‰‰ŽZŽq
+ ˆÈ‰º‚Q€‰‰ŽZŽq‚Í”’l‚Æ•¶Žš—ñ‚Å“®ì‚ªˆÙ‚È‚è‚Ü‚·B
+ + ‰ÁŽZ/Œ‹‡
+ ”’l‚Ç‚¤‚µ‚Ìꇂ͉ÁŽZ‚µ‚Ü‚·B
+ ‚»‚êˆÈŠO‚Ìꇂ͕¶Žš—ñ‚Æ‚Ý‚È‚µ‚ÄŒ‹‡‚µ‚Ü‚·B
+
+ ˆÈ‰º‚Ì‚Q€‰‰ŽZŽq‚Í”’lê—p‚Å‚·B
+ - Œ¸ŽZ
+ * æŽZ
+ / œŽZ
+ % è—]
+ & ƒrƒbƒg˜_—Ï
+ | ƒrƒbƒg˜_—˜a
+ ^ ƒrƒbƒg”r‘¼“I˜_—˜a
+ && ˜_—Ï
+ || ˜_—˜a
+
+ ˆÈ‰º‚Ì‚Q€‰‰ŽZŽq‚Í”’l‚Ç‚¤‚µA‚Ü‚½‚Í•¶Žš—ñ‚Ç‚¤‚µ‚Ì”äŠr‚ðs‚¢‚Ü‚·B
+ ‚±‚ê‚ç‚ÌŠÖŒW‰‰ŽZŽq‚ÍŠÖŒW‚ª¬‚è—§‚‚Æ1A¬‚è—§‚½‚È‚¢‚Æ0‚ð•Ô‚µ‚Ü‚·B
+ == “™‚µ‚¢
+ != “™‚µ‚­‚È‚¢
+ > ‚æ‚è‘å‚«‚¢
+ >= ‚æ‚è‘å‚«‚¢‚©“™‚µ‚¢iˆÈãj
+ < ‚æ‚謂³‚¢i–¢–žj
+ <= ‚æ‚謂³‚¢‚©“™‚µ‚¢iˆÈ‰ºj
+
+ –•Ï”
+ ”¼Šp‰p”Žš‚ðŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+ •Ï”‚̃XƒR[ƒv‚ƃ‰ƒCƒtƒ^ƒCƒ€‚̓vƒŒƒtƒBƒbƒNƒX‚É‚æ‚èŽw’肵‚Ü‚·B
+ ¬•¶Žš‚̃Gƒ‹‚̓vƒŒƒtƒBƒbƒNƒX‚Æ‚µ‚Ĉµ‚í‚ê‚é‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ (¬•¶Žš‚̃Gƒ‹‚Í¡Œã‚Ì“®ì‚ð•ÛႳ‚ê‚È‚¢‚Ì‚ÅŽg—p‚µ‚È‚¢‚ʼnº‚³‚¢)
+
+ ƒvƒŒƒtƒBƒbƒNƒX ƒXƒR[ƒv ƒ‰ƒCƒtƒ^ƒCƒ€
+ (‚È‚µ) ƒLƒƒƒ‰ƒNƒ^[ ‰i‘±“I
+ @ ƒLƒƒƒ‰ƒNƒ^[ ˆêŽž“I
+ l “¯ã “¯ãi„§‚³‚ê‚È‚¢j
+ $ ƒ}ƒbƒvƒT[ƒo[ ‰i‘±“I
+ $@ ƒ}ƒbƒvƒT[ƒo[ ˆêŽž“I
+ # ƒAƒJƒEƒ“ƒg ‰i‘±“I
+ ## ƒAƒJƒEƒ“ƒg(‘Sƒ[ƒ‹ƒh) ‰i‘±“I
+
+ ‚‚܂èA•’ʂ̈ꎞ“I‚È•Ï”‚Í@, •Û‘¶‚·‚é•K—v‚Ì‚ ‚é•Ï”‚Í
+ ƒvƒŒƒtƒBƒbƒNƒX‚È‚µA‘S‚ẴLƒƒƒ‰ƒNƒ^[‚Å‹¤—L‚·‚ׂ«•Ï”‚Í $A
+ “¯ˆêƒAƒJƒEƒ“ƒg‚Å‹¤—L‚·‚ׂ«•Ï”‚Í # ‚â ## ‚ðŽg—p‚·‚邱‚Æ‚É‚È‚è‚Ü‚·B
+
+ ‚Ü‚½A•Ï”‚ÌŒ^‚̓|ƒXƒgƒtƒBƒbƒNƒX‚É‚æ‚èŽw’肵‚Ü‚·B
+ ‚½‚¾‚µA•¶Žš—ñŒ^‚̓Lƒƒƒ‰ƒNƒ^[ˆêŽž•Ï”A‚¨‚æ‚ÑA
+ ‰i‘±“I/ˆêŽž“Iƒ}ƒbƒvƒT[ƒo[•Ï”‚Å‚Ì‚ÝŽg—p‚Å‚«‚Ü‚·B
+ iƒvƒŒƒtƒBƒbƒNƒX @A$A$@ j
+
+ ƒ|ƒXƒgƒtƒBƒbƒNƒX Œ^
+ (‚È‚µ) ®”
+ $ •¶Žš—ñ
+
+ <—á> @hoge$ •¶Žš—ñŒ^ˆêŽž“IƒLƒƒƒ‰ƒNƒ^[•Ï”
+ hoge ”’lŒ^‰i‘±“IƒLƒƒƒ‰ƒNƒ^[•Ï”
+ $hoge ”’lŒ^‰i‘±“I‘SƒLƒƒƒ‰ƒNƒ^[‹¤—L•Ï”
+
+ ˆêŽž“I‚Å‚È‚¢•Ï”‚Í‘½—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+ •Û‘¶‚·‚é•K—v‚Ì‚È‚¢‚à‚̂͋ɗ͈ꎞ•Ï”‚ÅÏ‚Ü‚¹‚é‚ׂ«‚Å‚·B
+ •Û‘¶‚·‚é•K—v‚ª‚ ‚é‚Ì‚©‚È‚¢‚Ì‚©‚Í‚æ‚­l—¶‚µ‚Ä‚­‚¾‚³‚¢B
+ “Á‚ɉi‘±“I‚ȃLƒƒƒ‰ƒNƒ^[/ƒAƒJƒEƒ“ƒg•Ï”‚ÍA”‚ɧŒÀ‚ª‚ ‚è‚Ü‚·B
+ Žg—p‚ªI‚í‚Á‚Ä“ñ“x‚ÆŽg—p‚·‚邱‚Æ‚ª‚È‚¢‚Æ‚í‚©‚Á‚Ä‚¢‚é•Ï”‚Í
+ ’l‚ð0‚ÉÝ’è‚·‚邱‚Æ‚Å휂·‚邱‚Æ‚ªo—ˆ‚Ü‚·B
+
+ –”z—ñ•Ï”
+ •Ï”–¼‚ÌŒã‚ÉŠ‡ŒÊ [ ] ‚ÅŠ‡‚Á‚½Ž®‚ðŽw’è‚·‚邱‚Æ‚Å”z—ñ•Ï”‚É‚È‚è‚Ü‚·B
+ •Ï”–¼‚Æ"["‚ÌŠÔ‚É‹ó”’•¶Žš‚ð“ü‚ê‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB
+
+ <—á> hoge[10] fuga[ @temp ]
+
+ ”z—ñ‚Ì—v‘f”Ô†‚Í0`127‚ªŽw’è‚Å‚«‚Ü‚·‚ªA”Ô†0‚Í“¯–¼‚Ì•Ï”‚Æ
+ ’l‚ð‹¤—L‚µ‚Ü‚·B‚½‚Æ‚¦‚ÎAhoge[0] ‚Æ hoge ‚Í“¯‚¶•Ï”‚Å‚·B
+
+ ”z—ñ•Ï”‚͈ꎞ“IƒLƒƒƒ‰ƒNƒ^[•Ï”AˆêŽž“I/‰i‘±“Iƒ}ƒbƒvƒT[ƒo[•Ï”‚ÅŽg—p‚Å‚«‚Ü‚·B
+ •Ï”‚ÌŒ^‚Í”’lA•¶Žš—ñ—¼•û‚Æ‚à—˜—p‚Å‚«‚Ü‚·B
+
+ –ƒ‰ƒxƒ‹
+ ”¼Šp‰p”‚¨‚æ‚уAƒ“ƒ_[ƒo[‚ªŽg—p‚Å‚«‚Ü‚·B
+ •Ï”‚â–½—ß‚È‚Ç‚Æ‹æ•Ê‚·‚邽‚ß L_ ‚ð擪‚ɂ‚¯‚邱‚Æ‚ª„§‚³‚ê‚Ü‚·B
+ L_hoge: ‚Æ‚¢‚Á‚½•—‚ÉŽg—p‚µ‚Ü‚·B
+ if•¶‚âmenu•¶‚̃Wƒƒƒ“ƒvæ‚ÉŽw’肳‚ê‚Ü‚·B
+
+ –’è”
+ athena‚Ídb/const.txt‚É€‹’‚µ‚½’蔂ð’ñ‹Ÿ‚µ‚Ü‚·B
+ ƒXƒNƒŠƒvƒg“à‚Å‚Ì‚ÝŽg—p‰Â”\‚Å‚·B
+
+ ––„‚ßž‚Ý•Ï”
+ ˜b‚©‚¯‚½ƒvƒŒƒCƒ„[‚̃Xƒe[ƒ^ƒX‚È‚Ç‚ðŽQÆ‚Å‚«‚Ü‚·B
+ db/const.txt‚É‹Lq‚³‚ê‚Ä‚¢‚Ü‚·B
+ ƒXƒNƒŠƒvƒg“à‚Å‚Ì‚ÝŽg—p‰Â”\‚Å‚·B
+ ‚È‚¨Aˆê•”‚𜂢‚Ä’l‚Ì‘ã“ü‚Í‚Å‚«‚Ü‚¹‚ñB
+
+ –Ž®
+ –½—ß•¶‚̈ø”‚ª”’l‚¾‚Á‚½ê‡A‚»‚±‚Å—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+ ƒXƒy[ƒX‚Í—v‚ç‚È‚¢‚悤‚Å‚·‚ª‚ ‚Á‚½•û‚ªŒ©ˆÕ‚¢‚Å‚·B
+ ”äŠr‰‰ŽZŽq‹y‚ј_—‰‰ŽZŽq‚Í’l‚ª^‚Å‚ ‚Á‚½‚Æ‚«”’l‚Ì1A‹U‚Å‚ ‚Á‚½‚Æ‚«0‚ð•Ô‚µ‚Ü‚·B
+
+ –ƒCƒxƒ“ƒg
+ Œ`‚ðŽ‚½‚È‚¢ƒXƒNƒŠƒvƒg‚Å‚·B
+ ƒ^ƒCƒ€ƒAƒ^ƒbƒN‚È‚Ç‚Ì쬂Ɏg‚¢‚Ü‚·B
+ ƒCƒxƒ“ƒg–¼‚ð‹Lq‚·‚é•”•ª‚Å‚ÍAƒCƒxƒ“ƒg–¼::ƒ‰ƒxƒ‹–¼‚Æ‚·‚邱‚Æ‚Å‚»‚̃Cƒxƒ“ƒg‚ÌŽw’肵‚½ƒ‰ƒxƒ‹‚©‚ç
+ ƒXƒNƒŠƒvƒg‚ðŠJŽn‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+
+ ––½—ß\•¶
+ ˆø”‚Í”¼ŠpƒXƒy[ƒX‚ð‹ó‚¯‚Ä‹Lq‚µ‚Ä‚­‚¾‚³‚¢B
+
+‚RD–½—ß•¶‹y‚ÑŠÖ”‹y‚ђ蔃‰ƒxƒ‹
+ ––½—ß•¶
+ mes–½—ß
+ mes <string>;
+
+ string •¶Žš—ñ
+
+ <string>‚É‹Lq‚³‚ꂽ•¶Žš—ñ‚ðƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Éo—Í‚µ‚Ü‚·B
+
+ next–½—ß
+ next;
+
+ ƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Énextƒ{ƒ^ƒ“‚ð•\Ž¦‚µA‘Ò‹@‚µ‚Ü‚·B
+
+ close–½—ß
+ close;
+
+ ƒƒbƒZ[ƒWƒEƒBƒ“ƒhƒE‚Écloseƒ{ƒ^ƒ“‚ð•\Ž¦‚µAƒXƒNƒŠƒvƒg‚ðI—¹‚µ‚Ü‚·B
+
+ menu–½—ß
+ menu <string1>,<label1>[,<stringN>,<labelN>...];
+
+ stringN •¶Žš—ñ
+ labelN ƒ‰ƒxƒ‹
+
+ ƒƒjƒ…[‚ð•\Ž¦‚µ‚Ü‚·B<stringN>‚É‹Lq‚³‚ꂽ•¶Žš—ñ‚ð‘I‘ð‚·‚é‚Æ<labelN>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
+ ‚Ü‚½A‘I‚΂ꂽƒ‰ƒxƒ‹‚̔Ԇ‚Í•Ï”@menu‚É‘ã“ü‚³‚ê‚Ü‚·B
+ (l15‚É‚à‘ã“ü‚³‚ê‚Ü‚·‚ªA‚±‚¿‚ç‚Í¡Œã“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚Ål15‚ÍŽg—p‚µ‚È‚¢‚ʼnº‚³‚¢j
+
+ goto–½—ß
+ goto <label>;
+
+ label ƒ‰ƒxƒ‹
+
+ <label>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
+
+ cutin–½—ß
+ cutin <filename>,<position>;
+
+ filename •¶Žš—ñ
+ position ”’l
+
+ ƒJƒvƒ‰Eˆõ‚Ȃǂ̃JƒbƒgƒCƒ“‚ð•\Ž¦‚µ‚Ü‚·B<filename>‚Í•\Ž¦‚µ‚½‚¢ƒtƒ@ƒCƒ‹–¼A<position>‚Í•\Ž¦ˆÊ’u‚ðŽw’肵‚Ü‚·B
+ positionF0,¶‰ºA1,’†‰›‰ºA2,‰E‰ºA255,ƒJƒbƒgƒCƒ“Á‹Ž
+
+ jobchange–½—ß
+ jobchange <job>[, <upper>];
+
+ job ”’l
+ upper ”’l
+
+ E‹Æ‚ð•ÏX‚µ‚Ü‚·B<job>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+ <upper>‚Í0=’Êí,1=“]¶,2=—{Žq,-1 or –³‚µ=Œ»Ý‚Ì<upper>‚É‚È‚è‚Ü‚·B
+ jobLv‚ÍŽ©“®‚Å‚P‚É‚È‚è‚Ü‚·B
+ ƒo[ƒh‚ƃ_ƒ“ƒT[‚É‚Í’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ input–½—ß
+ input [<variable>];
+
+ variable •Ï”AÈ—ª‰Â
+
+ “ü—̓EƒBƒ“ƒhƒE‚ðŠJ‚«A“ü—̓f[ƒ^‚ð<variable>‚É‘ã“ü‚µ‚Ü‚·B
+ •Ï”‚ÌŒ^‚ª•¶Žš—ñŒ^‚Ì‚Æ‚«‚Í•¶Žš—ñ“ü—̓EƒBƒ“ƒhƒEA®”Œ^‚Ì‚Æ‚«‚Í”’l“ü—̓EƒBƒ“ƒhƒE‚É‚È‚è‚Ü‚·B
+ <variable>‚ðÈ—ª‚µ‚½ê‡‚É‚Í”’l“ü—̓EƒBƒ“ƒhƒE‚ðo‚µAƒf[ƒ^‚Í•Ï”l14 (¬•¶Žš‚̃Gƒ‹+14)‚É‘ã“ü‚³‚ê‚Ü‚·B
+ il14‚Í¡Œã‚Ì“®ì‚ª•ÛႳ‚ê‚È‚¢‚Ì‚ÅAˆø”‚ÍÈ—ª‚µ‚È‚¢‚ʼnº‚³‚¢j
+
+ warp–½—ß
+ warp <gatname>,<x>,<y>;
+
+ gatname •¶Žš—ñ
+ x,y ”’l
+
+ <gatname>‚ÉŽw’肳‚ꂽMAP‚ÌÀ•W<x>,<y>‚Ƀ[ƒv‚µ‚Ü‚·B
+ <gatname>‚ðSavePoint‚É‚µ‚½ê‡AƒZ[ƒuƒ|ƒCƒ“ƒg‚Ɉړ®‚µ‚Ü‚·B
+ Random‚É‚µ‚½ê‡A‚»‚ÌMAP“à‚Ì‚Ç‚±‚©‚Ɉړ®‚µ‚Ü‚·B‘¦‚¿<x><y>‚Í–³Ž‹B
+
+ setlook–½—ß
+ setlook <n1>,<n2>;
+
+ n1,n2 ”’l
+
+ ŠOŒ©‚ð•ÏX‚µ‚Ü‚·B<n1>‚Í•”•i‚ðA<n2>‚ÍŽí—Þ‚ðŽw’肵‚Ü‚·B
+ n1F1,”¯Œ^A2,•ŠíA3,“ªã’iA4,“ª’†’iA5,“ª‰º’iA6,”¯FA7,•žFA8,‚
+ ‘•”õ•i‚Í•ÏX‚³‚ê‚Ü‚¹‚ñBƒAƒTƒVƒ“’j‚ƃ[ƒO’j‚ÉŠÖ‚µ‚Ä‚Í•ž‚ÌF‚ª‚ ‚è‚Ü‚¹‚ñB
+
+
+ set–½—ß
+ set <variable>,<n>;
+
+ variable •Ï”
+ n ”’l/•¶Žš—ñ
+
+ <variable>‚É<n>‚ð‘ã“ü‚µ‚Ü‚·B
+ •¶Žš—ñŒ^‚ðŽg—p‚·‚é‚Æ‚«‚Í•Ï”–¼‚Ƀ|ƒXƒgƒtƒBƒbƒNƒX‚ð–Y‚ê‚È‚¢‚ʼnº‚³‚¢B
+
+ setarray–½—ß
+ setarray <variable>[,<n0>[,<n1>c]];
+
+ variable •Ï”
+ nx ”’l/•¶Žš—ñ
+
+ ”z—ñ<variable>‚É’l<n0>,<n1>,c‚̃ŠƒXƒg‚ð‘ã“ü‚µ‚Ü‚·B
+ <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç‘ã“ü‚Å‚«‚Ü‚·B
+ <—á> setarray @hoge[2],16,24,32; @hoge‚Ì—v‘f2‚©‚ç4‚Ü‚Å‚ð16,24,32‚É‚·‚éB
+
+ cleararray–½—ß
+ cleararray <variable>,<n>,<count>;
+
+ variable •Ï”
+ n ”’l/•¶Žš—ñ
+ count ”’l
+
+ ”z—ñ<variable>‚É’l<n>‚ð<count>ŒÂ•ª‘ã“ü‚µ‚Ü‚·B
+ <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç‘ã“ü‚Å‚«‚Ü‚·B
+ <—á> cleararray @hoge[3],0,6; @hoge‚Ì—v‘f3‚©‚ç8‚Ü‚Å‚ð0‚ɃZƒbƒg‚·‚é
+
+ copyarray–½—ß
+ copyarray <var1>,<var2>,<n>;
+
+ <var1>,<var2> •Ï”
+ n ŒÂ”
+
+ ”z—ñ<var1>‚É”z—ñ<var2>‚Ì—v‘f<n>ŒÂ‚ðƒRƒs[‚µ‚Ü‚·B
+ <var1>,<var2>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚çƒRƒs[‚Å‚«‚Ü‚·B
+
+ deletearray–½—ß
+
+ deletearray <variable>,<n>;
+
+ variable •Ï”
+ n ”’l
+
+ ”z—ñ<variable>‚©‚ç<n>ŒÂ‚Ì—v‘f‚ð휂µAŒã‚ë‚Ì—v‘f‚ð‘O‚É‹l‚ß‚é
+ <variable>‚Í”z—ñ–¼‚ðŽw’è‚·‚é‚Æʼn‚©‚çA—v‘f”Ô†‚àŽw’è‚·‚ê‚Γr’†‚©‚ç휂ł«‚Ü‚·B
+
+ if–½—ß
+ if (<cond>) goto <label>;
+
+ cond ”’l
+ label ƒ‰ƒxƒ‹
+
+ <cond>‚ª0ˆÈŠO‚Ìê‡A<label>‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
+
+ getitem–½—ß
+ getitem <itemid>,<num>;
+
+ itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
+ num ”’l
+
+ <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ª“üŽè‚µ‚Ü‚·B
+ <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
+ ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ getitem2–½—ß
+ getitem <itemid>,<num>,<identify>,<refine>,<attribute>,<card1>,
+ <card2>,<card3>,<card4>
+
+ itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
+ num,identify,refine,attribute,card1,card2,card3,card4 ”’l
+
+ <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ª“üŽè‚µ‚Ü‚·B
+ <identify> ŠÓ’èó‘Ô(0‚Å–¢ŠÓ’èA1‚ÅŠÓ’è)
+ <refine> ¸˜B’l
+ <attribute> ƒAƒCƒeƒ€‚Ìó‘Ô
+ <card1> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚È‚ç255‚Å‘•”õˆÈŠO‚̃AƒCƒeƒ€‚ŃLƒƒƒ‰‚Ì–¼‘O‚ð“ü‚ꂽ‚¢Žž‚Í254
+ <card2> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚È‚ç‘®«‚Ư‚Ì‚©‚¯‚ç‚Ì”‚ðÝ’èB¯‚Ì‚©‚¯‚ç‚Ì”(”͈Í:0~3)*5*256 + ‘®«(–³:0A‰Î:3A…:1A•—:4A“y:2)
+ <card3> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚âƒLƒƒƒ‰‚Ì–¼‘O‚ª“ü‚éƒAƒCƒeƒ€‚̓Lƒƒƒ‰ID‚̉º‚Ì2ƒoƒCƒg
+ <card4> ·‚³‚Ä‚¢‚éƒJ[ƒhA»‘¢•Ší‚âƒLƒƒƒ‰‚Ì–¼‘O‚ª“ü‚éƒAƒCƒeƒ€‚̓Lƒƒƒ‰ID‚Ìã‚Ì2ƒoƒCƒg
+
+ <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
+ ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ delitem–½—ß
+ delitem <itemid>,<num>;
+
+ itemid_num ”’l
+
+ <itemid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂ•ªŽ¸‚¢‚Ü‚·B
+
+ getexp–½—ß
+ getexp <base_exp>,<job_exp>;
+
+ base_exp ”’l
+ job_exp ”’l
+
+ <base_exp>‚ÉŽw’肳‚ꂽ”‚¾‚¯Base‚ÉŒoŒ±’l‚ª“ü‚è‚Ü‚·B
+ <job_exp>‚ÉŽw’肳‚ꂽ”‚¾‚¯Job‚ÉŒoŒ±’l‚ª“ü‚è‚Ü‚·B
+ ƒ}ƒCƒiƒX‚Ì”Žš‚Í“K‰ž‚³‚ê‚Ü‚¹‚ñB
+
+ makepet–½—ß
+ makepet <petid>;
+
+ petid ”’l
+
+ <petid>‚ÉŽw’肳‚ꂽƒAƒCƒeƒ€ID‚ðŽ‚ƒyƒbƒg‚Ì—‘‚ð쬂µ‚Ü‚·B
+
+ viewpoint–½—ß
+ viewpoint <type>,<x>,<y>,<id>,<color>;
+
+ type,x,y,id ”’l
+ color •s–¾
+
+ Ž‘—¿•s‘«‚È‚Ì‚ÅÚ‚µ‚¢à–¾‚Í‚Å‚«‚Ü‚¹‚ñ‚ªAƒ~ƒjMAP‚É“_–Å‚·‚é“_‚ð•\Ž¦A휂µ‚Ü‚·B
+ type:1,•\Ž¦A2,íœ
+
+ heal–½—ß
+ heal <hp>,<sp>;
+
+ hp,sp ”’l
+
+ <hp>•ªHP‚ðA<sp>•ªSP‚ð‰ñ•œ‚µ‚Ü‚·B
+
+ itemheal–½—ß
+ itemheal <hp>,<sp>;
+
+ hp,sp ”’l
+
+ <hp>•ªHP‚ðA<sp>•ªSP‚ð‰ñ•œ‚µ‚Ü‚·Bheal‚Ƃ͈Ⴂ‰ñ•œ‚·‚éHP‚ÆSP‚Ì—Ê‚ÉVIT(SP‚Ìê‡INT)‚ƃXƒLƒ‹‚É‚æ‚é•â³‚ª•t‚«‚Ü‚·B
+
+ end–½—ß
+ end;
+
+ ƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·B
+
+ setoption–½—ß
+ setoption <string>;
+
+ string •¶Žš—ñ
+
+ ˆø—pF
+ PC‚Ɉȉº‚ÅŽ¦‚·•t‘®•i(?)‚ð•t‚¯‚Ü‚·B
+ 0x0000 - •t‘®•iíœ
+ 0x0001 - ?
+ 0x0002 - ƒnƒCƒh(‰e•t‚«)
+ 0x0004 - ??
+ 0x0008 - ƒJ[ƒg
+ 0x0010 - ‘é
+ 0x0020 - ƒyƒRƒyƒR(ƒiƒCƒg,ƒNƒ‹ƒZƒCƒ_[‚ÌŽž‚Ì‚Ý—LŒø)
+ 0x0040 - ƒnƒCƒh(‰e–³‚µ)
+ 0x0080 - ƒJ[ƒg2
+ 0x0100 - ƒJ[ƒg3
+ 0x0200 - ƒJ[ƒg4
+ 0x0400 - ƒJ[ƒg5
+ 0x0800 - “ª‚ªƒI[ƒN(Sage‚̃XƒLƒ‹AƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…‚ª‚©‚©‚Á‚½ó‘Ô‚É‚È‚é)
+
+ ˆê’[‚·‚ׂÄÁ‚³‚ê‚Ä‚©‚ç•t‚¯’¼‚·‚Ì‚ÅA•¡”Žw’肵‚½‚¢ê‡‚ɂ͇Œv‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
+
+ savepoint–½—ß
+ savepoint <gatname>,<x>,<y>;
+
+ gatname •¶Žš—ñ
+ x,y ”’l
+
+ <gatname>‚ÌÀ•W<x>,<y>‚ðƒZ[ƒuƒ|ƒCƒ“ƒg‚Éݒ肵‚Ü‚·B
+
+ openstorage–½—ß
+ openstorage;
+
+ ‘qŒÉ‚ðŠJ‚«‚Ü‚·B
+
+ setcart–½—ß
+ setcart;
+
+ ƒJ[ƒg‚ð•t‚¯‚Ü‚·B
+
+ successrefitem–½—ß
+ successrefitem <n>;
+
+ n ”’l
+
+ ¸˜B¬Œ÷ƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ failedrefitem–½—ß
+ failedrefitem <n>;
+
+ n ”’l
+
+ ¸˜BŽ¸”sƒGƒtƒFƒNƒg‚ð•\Ž¦‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ setfalcon–½—ß
+ setfalcon;
+
+ ‘é‚ð•t‚¯‚Ü‚·B
+
+ setriding–½—ß
+ setriding;
+
+ ƒyƒRƒyƒR‚Éæ‚è‚Ü‚·B
+
+ monster–½—ß
+ monster <gatname>,<x>,<y>,<mobname>,<mobid>,<num>[,<event>];
+
+ gatname,mobname •¶Žš—ñ
+ x,y,mobid,num ”’l
+ event •¶Žš—ñAÈ—ª‰Â
+
+ <gatname>‚ÌÀ•W<x>,<y>‚É<mobname>‚ðŽ‚Â<mobid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð<num>‘ÌoŒ»‚³‚¹‚Ü‚·B
+ <gatname>‚ªthis‚ÌꇃXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚ª‚¢‚éMAPA
+ <x><y>‚ª-1‚Ìê‡AƒXƒNƒŠƒvƒg‚ðŽÀs‚µ‚½ƒvƒŒƒCƒ„[‚ÌÀ•WA
+ <mobname>‚ª--en--‚ÌꇉpŒê–¼A--ja--‚Ìꇓú–{Œê–¼A<mobid>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€B
+ ‚»‚̃‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«<event>‚ðŠJŽn‚µ‚Ü‚·B
+
+ announce–½—ß
+ announce <string>,<flag>;
+
+ string •¶Žš—ñ
+ flag ”’l
+
+ <string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
+ <flag>‚͈ȉº‚ÉŽ¦‚·’Ê‚è‚Å‚·B
+ ƒGƒŠƒAƒtƒ‰ƒO
+ 0x00 ‚·‚ׂĂ̂l‚`‚o‚É‘—M
+ 0x01 “¯‚¶‚l‚`‚o
+ 0x02 ‰æ–Ê“à
+ 0x03 Ž©•ª‚Ì‚Ý
+ 0x04 “¯‚¶‚l‚`‚oŽI
+ Fƒtƒ‰ƒO
+ 0x00 ‰©F
+ 0x10 ÂF
+ “ÁŽêƒtƒ‰ƒO
+ 0x00 “Á‚É–³‚µ
+ 0x08 ƒCƒxƒ“ƒg—p
+
+ ƒGƒŠƒAƒtƒ‰ƒO‚ÆFƒtƒ‰ƒO‚Æ“ÁŽêƒtƒ‰ƒO‚̇Œv‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
+
+ killmonster–½—ß
+ killmonster <gatname>[,<event>];
+
+ gatname •¶Žš—ñ
+ event •¶Žš—ñAÈ—ª‰Â
+
+ <gatname>‚É‘¶Ý‚·‚郂ƒ“ƒXƒ^[‚ð‚·‚×‚ÄŽE‚µ‚Ü‚·B
+ <event>‚É‚æ‚Á‚ČĂÑo‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚Ì‚ÝŽE‚·‚±‚Æ‚à‰Â”\‚Å‚·B<event>‚ðAll‚É‚·‚é‚Æ‚»‚̃}ƒbƒv‚É‚ ‚éˆêŽž“I‚É¢Š«‚³‚ꂽƒ‚ƒ“ƒXƒ^[‚ð‘S‚ÄŽE‚µ‚Ü‚·B
+
+ killmonsterall–½—ß
+ killmonsterall <gatname>
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚É‘¶Ý‚·‚郂ƒ“ƒXƒ^[‚ð‚·‚×‚ÄŽE‚µ‚Ü‚·Bkillmonster‚Ƃ͈á‚Á‚Ä‚»‚̃}ƒbƒv‚ÉŽn‚ß‚©‚ç”z’u‚³‚ê‚Ä‚¢‚½ƒ‚ƒ“ƒXƒ^[‚Ü‚Å‘S‚ÄŽE‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·B
+
+
+ addtimer–½—ß
+ addtimer <ms>,<event>;
+
+ ms ”’l
+ event •¶Žš—ñ
+
+ Œ»Ý‚̃vƒŒƒCƒ„[‚ÉA<ms>ƒ~ƒŠ•bŒo‰ß‚µ‚½Œã<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ð쬂µ‚Ü‚·B
+ ‚±‚̃^ƒCƒ}[‚É‚æ‚Á‚ÄŽÀs‚³‚ê‚éƒCƒxƒ“ƒg‚ÍA‚±‚̃vƒŒƒCƒ„[‚Ìî•ñ‚ɃAƒNƒZƒX‚Å‚«‚Ü‚·B
+ ƒvƒŒƒCƒ„[‚ªƒƒOƒAƒEƒg‚·‚é‚ƃ^ƒCƒ}[‚Í–³Œø‚ɂȂ邽‚ß’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+ ƒAƒŠ[ƒiƒ}ƒbƒv‚È‚Ç‚ÅŽg—p‚·‚éꇂ͂±‚ê‚Å‚Í‚È‚­NPCƒ^ƒCƒ}[‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+
+ deltimer–½—ß
+ deltimer <event>;
+
+ event •¶Žš—ñ
+
+ Œ»Ý‚̃vƒŒƒCƒ„[‚Ì<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ðÁ‹Ž‚µ‚Ü‚·B
+
+ addtimercount–½—ß
+ addtimercount <event>,<ms>;
+
+ event •¶Žš—ñ
+ ms ”’l
+
+ Œ»Ý‚̃vƒŒƒCƒ„[‚Ì<event>‚ðŠJŽn‚·‚éƒ^ƒCƒ}[‚ÌŠJŽn‚Ü‚Å‚ÌŽžŠÔ‚ð<ms>ƒ~ƒŠ•b’ljÁ‚µ‚Ü‚·B
+
+ initnpctimer–½—ß
+ initnpctimer [<name>];
+
+ <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚Ì’l‚ð‚O‚É‚µAƒJƒEƒ“ƒg‚ðŠJŽn‚µ‚Ü‚·B
+ name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+
+ ‚±‚ÌNPCƒ^ƒCƒ}[‚̓~ƒŠ•b’PˆÊ‚ÅOnTimerXXXX‚Æ‚¢‚¤ƒ‰ƒxƒ‹ƒCƒxƒ“ƒg‚ðŽÀs‚µ‚Ü‚·B
+ <—á> OnTimer1000: <= 1•bŒã, OnTimer30000: <= 30•bŒã
+
+ stopnpctimer–½—ß
+ stopnpctimer [<name>];
+
+ <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð’âŽ~‚µ‚Ü‚·B
+ name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+
+ startnpctimer–½—ß
+ stopnpctimer [<name>];
+
+ <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ðÄŠJ‚µ‚Ü‚·B
+ name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ ‚±‚¿‚ç‚Íinitnpctimer‚ƈႢAƒJƒEƒ“ƒg‚ð0‚ɃŠƒZƒbƒg‚µ‚Ü‚¹‚ñB
+ stopnpctimer‚ƃZƒbƒg‚ÅŽg—p‚µ‚Ü‚·B
+
+ setnpctimer–½—ß
+ setnpctimer <tick>[,<name>]
+
+ <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ð•ÏX‚µ‚Ü‚·B
+ name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ getnpctimer‚ð—˜—p‚·‚ê‚ÎAƒJƒEƒ“ƒg‚𑌸‚Å‚«‚Ü‚·B
+
+ disablenpc–½—ß
+ disablenpc <npcname>;
+
+ npcname •¶Žš—ñ
+
+ <npcname>‚𖳌ø‚É‚µ‚Ü‚·B
+
+ enablenpc–½—ß
+ enablenpc <npcname>;
+
+ npcname •¶Žš—ñ
+
+ <npcname>‚ð—LŒø‚É‚µ‚Ü‚·B
+
+ mapannounce–½—ß
+ mapannounce <gatname>,<string>,<flag>;
+
+ gatname,string •¶Žš—ñ
+ flag ”’l
+
+ <gatname>‘S‘Ì‚É<string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
+ flag:0,‰©F•¶ŽšA16,•¶Žš
+
+ areaannounce–½—ß
+ areannounce <gatname>,<x0>,<y0>,<x1>,<y1>,<string>,<flag>;
+
+ gatname,string •¶Žš—ñ
+ x0,y0,x1,y1,flag ”’l
+
+ <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚ɑ΂µ<string>‚ð‚f‚lƒAƒiƒEƒ“ƒX‚Å•\Ž¦‚µ‚Ü‚·B
+ flag:0,‰©F•¶ŽšA16,•¶Žš
+
+ areawarp–½—ß
+ areawarp <gatname>,<x0>,<y0>,<x1>,<y1>,<gatname2>,<x>,<y>;
+
+ gatname,gatname2 •¶Žš—ñ
+ x0,y0,x1,y1,x,y ”’l
+
+ <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É‚¢‚éPC‚ð<gatname2>‚ÌÀ•W<x>,<y>‚Ɉړ®‚³‚¹‚Ü‚·B
+
+ areamonster–½—ß
+ areamonster <gatname>,<x0>,<y0>,<x1>,<y1>,<mobname>,<mobid>,<num>[,<event>];
+
+ gatname,mobname •¶Žš—ñ
+ x0,y0,x1,y1,mobid,num ”’l
+ event •¶Žš—ñAÈ—ª‰Â
+
+ <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É<mobname>‚ðŽ‚Â<mobid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒ‚ƒ“ƒXƒ^[‚ð<num>‘ÌoŒ»‚³‚¹‚Ü‚·B
+ <gatname>‚ªthis‚ÌꇃXƒNƒŠƒvƒgŽÀsMAPA<x><y>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€À•WA
+ <mobname>‚ª--en--‚ÌꇉpŒê–¼A--ja--‚Ìꇓú–{Œê–¼A<mobid>‚ª-1‚Ìꇃ‰ƒ“ƒ_ƒ€B
+ ‚»‚̃‚ƒ“ƒXƒ^[‚ð“|‚µ‚½‚Æ‚«<event>‚ðŠJŽn‚µ‚Ü‚·B
+
+ percentheal–½—ß
+ percentheal <hp>,<sp>;
+
+ hp,sp ”’l
+
+ HP‚ÆSP‚ð<hp>%A<sp>%•ª‰ñ•œ‚µ‚Ü‚·B
+
+ resetstatus–½—ß
+ resetstatus;
+
+ ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðƒŠƒZƒbƒg‚µ‚Ü‚·B
+
+ resetskill–½—ß
+ resetskill;
+
+ ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ðƒŠƒZƒbƒg‚µ‚Ü‚·B
+
+ statusup–½—ß
+ statusup <st>;
+
+ st ”’l
+
+ <st>‚ÅŽw’肳‚ꂽŠî–{ƒXƒe[ƒ^ƒX’l‚ðAƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðÁ”‚Ä1ã‚°‚éB
+ <st>‚Í bStr, bVit, bInt, bAgi, bDex, bLuk ‚ÅŽw’è‚·‚éB
+
+ statusup2–½—ß
+ statusup2 <st>,<n>;
+
+ st,n ”’l
+
+ <st>‚ÅŽw’肳‚ꂽŠî–{ƒXƒe[ƒ^ƒX’l‚ðAƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ðÁ”‚¸‚É<n>ã‚°‚éB
+ <st>‚Í bStr, bVit, bInt, bAgi, bDex, bLuk ‚ÅŽw’è‚·‚éB
+
+ skill–½—ß
+ skill <skillid>,<skilllv>,<flag>;
+
+ skillid,skilllv,flag ”’l
+
+ <skillid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ÂLV<skilllv>ƒXƒLƒ‹‚ðK“¾‚µ‚Ü‚·B
+ flag:0,P‹v“I‚ȃXƒLƒ‹Žæ“¾(ƒXƒLƒ‹ƒcƒŠ[‚É‚È‚¢•¨‚Í–³Œø)A1,ˆêŽž“I(”͈͕͂s–¾)‚Ȏ擾A
+ <skilllv>‚ð0‚É‚·‚é‚Æ‚±‚Å‚»‚̃XƒLƒ‹‚ð–Y‚ꂳ‚¹‚邱‚Æ‚à‰Â”\‚Å‚·B
+
+ waitingroom–½—ß
+ waitingroom <title>,<limit>[,<event>[,<trigger>]];
+
+ title •¶Žš—ñ
+ limit ”’l
+ event •¶Žš—ñAÈ—ª‰Â
+ trigger ”’lAÈ—ª‰Â
+
+ <title>‚ðƒ^ƒCƒgƒ‹‚Æ‚µ‚ă`ƒƒƒbƒgƒ‹[ƒ€‚ð•\Ž¦‚³‚¹‚Ü‚·B
+ <trigger>‚ð–ž‚½‚µ‚½‚Æ‚«A<event>‚ð“®ì‚³‚¹‚邱‚Æ‚ª‰Â”\‚Å‚·B
+ <trigger>‚ðÈ—ª‚·‚é‚Æ<limit>‚Ì”’l‚ªŽg—p‚³‚ê‚Ü‚·B
+
+ delwaitingroom–½—ß
+ delewaitingroom [<name>]
+
+ name •¶Žš—ñAÈ—ª‰Â
+
+ Žw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚ð•Â‚¶‚Ü‚·B
+ <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+
+ disablewaitingroomevent–½—ß
+ disablewaitingroomevent [<name>]
+
+ name •¶Žš—ñAÈ—ª‰Â
+
+ <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚𖳌ø‚É‚µ‚Ü‚·B
+ <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+
+ enablewaitingroomevent–½—ß
+ enablewaitingroomevent [<name>]
+
+ name •¶Žš—ñAÈ—ª‰Â
+
+ <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ð—LŒø‚É‚µ‚Ü‚·B
+ <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ ‚Ü‚½AŠù‚ɃCƒxƒ“ƒg‚ª‹N‚±‚él”‚É’B‚µ‚Ä‚¢‚éê‡A
+ ‘¦À‚ɃCƒxƒ“ƒg‚ðŽÀs‚µ‚Ü‚·B
+
+ warpwaitingnpc–½—ß
+ warpwaitingnpc <gatname>,<x>,<y>[,<num>];
+
+ gatname •¶Žš—ñ
+ x,y,num ”’l
+
+ –½—ß‚ðŽÀs‚µ‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚É“ü‚Á‚Ä‚¢‚éPC‚Ì‚¤‚¿A
+ <num>‚ÅŽw’肵‚½l”‚ðA<gatname>‚ÌÀ•W<x>,<y>‚Ɉړ®‚³‚¹‚Ü‚·B
+ <num>‚ðÈ—ª‚·‚é‚Æ waitingroom‚Ì<trigger>‚ÅŽw’肵‚½l”‚ðŽg—p‚µ‚Ü‚·B
+
+ ƒ[ƒv‚³‚¹‚½l”‚ð $@warpwaitingpcnum ‚ÉAƒ[ƒv‚³‚¹‚½l‚̃AƒJƒEƒ“ƒgID‚ð
+ ”z—ñ $@warpwaitingpc ‚ɃZƒbƒg‚µ‚Ü‚·(擪‚©‚çl”•ª)B
+
+
+ emotion–½—ß
+ emotion <n>;
+
+ n ”’l
+
+ <n>ƒGƒ‚[ƒVƒ‡ƒ“‚ðo‚µ‚Ü‚·B
+
+ setmapflag–½—ß
+ setmapflag <gatname>,<flag>;
+
+ gatname •¶Žš—ñ
+ flag ”’l
+
+ <gatname>‚Ìmapflag‚ð’ljÁ‚µ‚Ü‚·B
+ <flag>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ removemapflag–½—ß
+ removemapflag <gatname>,<flag>;
+
+ gatname •¶Žš—ñ
+ flag ”’l
+
+ <gatname>‚Ìmapflag‚ðÁ‹Ž‚µ‚Ü‚·B
+ <flag>‚Ídb/const.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ pvpon–½—ß
+ pvpon <gatname>;
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚ðPVP‰Â”\MAP‚É‚µ‚Ü‚·B
+
+ pvpoff–½—ß
+ pvpoff <gatname>;
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚ðPVP•s‰ÂMAP‚É‚µ‚Ü‚·B
+
+ gvgon–½—ß
+ gvgon <gatname>;
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚ðƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
+
+ gvgoff–½—ß
+ gvgoff <gatname>;
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚ð”ñƒV[ƒYƒ‚[ƒh‚É‚µ‚Ü‚·B
+
+ setmapflagnosave–½—ß
+ setmapflagnosave <gatname>,<savegatname>,<x>,<y>;
+
+ gatname,nosavegat •¶Žš—ñ
+ x,y ”’l
+
+ <gatname>‚Ìmapflag‚ÉnosaveAˆø”‚Æ‚µ‚Ä<savegatname>,<x>,<y>‚ðݒ肵‚Ü‚·B
+
+ detachrid–½—ß
+ detachrid;
+
+ NPC‚ɃAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚éID‚ðƒNƒŠƒA‚µ‚Ü‚·B
+ ˆÈŒãAƒLƒƒƒ‰ƒNƒ^[î•ñ‚ð•K—v‚Æ‚·‚é–½—ß‚ªŽÀs‚Å‚«‚È‚­‚È‚è‚Ü‚·B
+
+ doevent–½—ß
+ doevent <name>;
+
+ name •¶Žš—ñ
+
+ ƒvƒŒƒCƒ„[Žå‘̂̃Cƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B<name>‚ɂ̓Cƒxƒ“ƒg–¼‚ðŽw’肵‚Ü‚·B
+ ƒvƒŒƒCƒ„[‚ª‘¼‚ÌNPC‚Ɖï˜b’†‚È‚Ç‚ÅŽÀs‚Å‚«‚È‚¢ê‡AƒLƒ…[‚É“ü‚èAŽÀs‰Â”\‚É‚È‚é‚Ü‚Å‘Ò‚Á‚ÄŽÀs‚³‚ê‚Ü‚·B
+ ƒLƒ…[‚̃TƒCƒY‚͂ƂĂଂ³‚¢‚Ì‚ÅA˜A‘±‚Å‹N‚±‚é‚ƃCƒxƒ“ƒg‚ª–³Ž‹‚³‚ê‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ ƒ‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚àŽw’è‚Å‚«‚Ü‚·‚ªANPC–¼‚ðÈ—ª‚Å‚«‚È‚¢‚Ì‚Å’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+
+ donpcevent–½—ß
+ donpcevent <name>;
+
+ name •¶Žš—ñ
+
+ ƒvƒŒƒCƒ„[‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚È‚¢(NPCŽå‘Ì‚Ì)ƒCƒxƒ“ƒg‚ð‹N‚±‚µ‚Ü‚·B
+ <name>‚ɂ̓Cƒxƒ“ƒg–¼‚ðŽw’肵‚Ü‚·BƒCƒxƒ“ƒg‚Í‘¦À‚ÉŽÀs‚³‚ê‚Ü‚·B
+ ƒ‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚àŽw’è‚Å‚«ANPC–¼‚ðÈ—ª‚·‚邱‚Æ‚ÅAƒCƒxƒ“ƒg‚ðƒuƒ[ƒhƒLƒƒƒXƒg‚Å‚«‚Ü‚·B
+ i•¡”‚ÌNPC‚Ì“¯‚¶–¼‘O‚̃‰ƒxƒ‹‚ðŽÀs‚Å‚«‚éB —á„"::OnEvent"j
+
+ callsub–½—ß
+ callsub <label>
+
+ label ƒ‰ƒxƒ‹
+
+ “¯ˆêƒXƒNƒŠƒvƒg“à‚̃‰ƒxƒ‹<label>‚ðƒTƒuƒ‹[ƒeƒBƒ“‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·B
+ ƒTƒuƒ‹[ƒeƒBƒ“‚©‚ç•œ‹A‚·‚é‚Æ‚«‚Íreturn–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+ ‚±‚Ì–½—ß‚Íreturn–½—ß‚ÌŽÀs󋵂ɂæ‚Á‚Ä‚ÍŠÖ”‚Æ‚µ‚ÄŽg—p‚·‚邱‚Æ‚ào—ˆ‚Ü‚·B
+
+ callfunc–½—ß
+ callfunc <func>
+
+ func •¶Žš—ñ
+
+ <func>‚Å’è‹`‚³‚ꂽƒ†[ƒU[’è‹`ŠÖ”‚ðŽÀs‚µ‚Ü‚·B
+ ƒ†[ƒU[’è‹`ŠÖ”‚©‚ç•œ‹A‚·‚é‚Æ‚«‚Íreturn–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+ ‚±‚Ì–½—ß‚Íreturn–½—ß‚ÌŽÀs󋵂ɂæ‚Á‚Ä‚ÍŠÖ”‚Æ‚µ‚ÄŽg—p‚·‚邱‚Æ‚ào—ˆ‚Ü‚·B
+
+ return–½—ß
+ return <retval>
+
+ retval ”’l‚Ü‚½‚Í•¶Žš—ñAÈ—ª‰Â
+
+ ’¼‚¿‚ɃTƒuƒ‹[ƒeƒBƒ“‚à‚µ‚­‚̓†[ƒU[’è‹`ŠÖ”‚𔲂¯AŒÄ‚Ño‚µŒ³‚É–ß‚è‚Ü‚·B
+ <retval>‚Í–ß‚è’l‚ÅAcallsub‚Ü‚½‚Ícallfunc‚ªŠÖ”‚Æ‚µ‚ČĂÑo‚³‚ê‚Ä‚¢‚é‚Æ‚«A‚±‚Ì–ß‚è’l‚ªŽg—p‚³‚ê‚Ü‚·B
+ callsub‚Ü‚½‚Ífunc‚ª–½—ß‚Æ‚µ‚ČĂ΂ê‚Ä‚¢‚é‚Æ‚«‚ÍA<retval>‚ÍÈ—ª‚µ‚Ä‚­‚¾‚³‚¢B
+
+ –ŠÖ”
+ randŠÖ”
+ rand(<n1>[,<n2>])
+
+ n1 ”’l
+ n2 ”’lAÈ—ª‰Â
+
+ <n1>‚Ì‚ÝŽw’肳‚ê‚Ä‚¢‚½ê‡A0‚©‚ç<n1>-1‚Ü‚Å‚Ì”’l‚ðƒ‰ƒ“ƒ_ƒ€‚É‘I‚ñ‚Å•Ô‚µ‚Ü‚·B
+ <n2>‚ðŽw’肵‚½ê‡A<n1>‚©‚ç<n2>‚Ü‚Å‚Ì”ƒ`‚ðƒ‰ƒ“ƒ_ƒ€‚É‘I‚ñ‚Å•Ô‚µ‚Ü‚·B
+
+ getitemnameŠÖ”
+ getitemname(<itemid>)
+
+ itemid ”’l
+
+ <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚Ìjname‚𕶎š—ñ‚Å•Ô‚µ‚Ü‚·B
+ ‚È‚¨AƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ðŽQÆ‚µ‚Ü‚·
+
+ countitemŠÖ”
+ countitem(<itemid>)
+
+ itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
+
+ <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚ÌŠŽ”‚ð•Ô‚µ‚Ü‚·B
+ <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
+ ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ checkweightŠÖ”
+ checkweight(<itemid>,<num>)
+
+ itemid ”’l‚Ü‚½‚Í•¶Žš—ñ
+ num ”’l
+
+ <itemid>‚ÉŽw’肳‚ꂽID‚ðŽ‚ƒAƒCƒeƒ€‚ð<num>ŒÂŽ‚‚±‚Æ‚ª‚Å‚«‚é‚Ì‚È‚ç‚Î1‚ðA
+ ‚Å‚«‚È‚¯‚ê‚Î0‚ð•Ô‚µ‚Ü‚·B
+ <itemid>‚ª•¶Žš—ñ‚Ìê‡A‚»‚Ì–¼‘O(name,jname)‚ðŽ‚ƒAƒCƒeƒ€‚ÌID‚ðŽg—p‚µ‚Ü‚·B
+ ‚½‚¾‚µAƒAƒCƒeƒ€–¼‚Íitem_db.txt‚ȂǂɈˑ¶‚·‚邽‚ßAƒeƒXƒg–Ú“IˆÈŠO‚Å‚ÍŽg—p‚·‚ׂ«‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ strcharinfoŠÖ”
+ strcharinfo(<n>)
+
+ n ”’l
+
+ ƒLƒƒƒ‰î•ñ‚ð•Ô‚µ‚Ü‚·B
+ n:0,ƒLƒƒƒ‰–¼A1,ƒp[ƒeƒB[–¼A2,ƒMƒ‹ƒh–¼
+
+ getequipnameŠÖ”
+ strcharinfo(<n>)
+
+ n ”’l
+
+ ‘•”õ•i–¼‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequipisequipedŠÖ”
+ getequipisequiped(<n>)
+
+ n ”’l
+
+ ‘•”õ‚µ‚Ä‚¢‚½‚ç1A‚µ‚Ä‚¢‚È‚©‚Á‚½‚ç0‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequipisenablerefŠÖ”
+ getequipisenableref(<n>)
+
+ n ”’l
+
+ ¸˜B‚Å‚«‚éꇂÍ1A‚Å‚«‚È‚¢ê‡‚Í0‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequipisidentifyŠÖ”
+ getequipisidentify(<n>)
+
+ n ”’l
+
+ ŠÓ’èÏ‚Ý‚Ìê‡1A–¢ŠÓ’è‚Ìê‡0‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequiprefinerycntŠÖ”
+ getequiprefinerycnt(<n>)
+
+ n ”’l
+
+ ¸˜B‚Ì“x‡‚¢‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequipweaponlvŠÖ”
+ getequipweaponlv(<n>)
+
+ n ”’l
+
+ •ŠíLV‚ð•Ô‚µ‚Ü‚·B–h‹ï‚ÌꇂɂÍ0A‚ ‚Æ‚Í•ŠíLV‚ɑΉž‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getequippercentrefineryŠÖ”
+ getequippercentrefinery(<n>)
+
+ n ”’l
+
+ ¸˜B¬Œ÷—¦‚ð•Ô‚µ‚Ü‚·B
+ n:1,“ª‘•”õA2,ŠZA3,¶ŽèA4,‰EŽèA5,‚©‚¯‚é‚à‚ÌA6,ŒCA7,ƒAƒNƒZ‚PA8,ƒAƒNƒZ‚QA9,“ª’†’iA10,“ª‰º’i
+
+ getusersŠÖ”
+ getusers(<n>)
+
+ n ”’l
+
+ l”‚ð•Ô‚µ‚Ü‚·B
+ n:0,PC‚Ì‚¢‚éMAP‚Ì‘l”A1,‘SMAP‚Ì‘l”i‘¦‚¿ƒƒOƒCƒ“l”jA8,NPC‚Ì‘¶Ý‚·‚éMAP‚Ì‘l”
+
+ getmapusersŠÖ”
+ getmapusers(<gatname>)
+
+ gatname •¶Žš—ñ
+
+ <gatname>‚É‘¶Ý‚·‚é‘l”‚ð•Ô‚µ‚Ü‚·B
+
+ getareausersŠÖ”
+ getareausers(<gatname>,<x0>,<y0>,<x1>,<y1>)
+
+ gatname •¶Žš—ñ
+ x0,y0,x1,y1 ”’l
+
+ <gatname>‚Ì<x0>,<y0>‚©‚ç<x1>,<y1>‚͈͓̔à‚É‚¢‚él”‚ð•Ô‚µ‚Ü‚·B
+
+ getskilllvŠÖ”
+ getskilllv(<skillid>)
+
+ skillid ”’l
+
+ <skillid>‚ÅŽw’肵‚½ID‚ðŽ‚ƒXƒLƒ‹‚ÌLV‚ð•Ô‚µ‚Ü‚·BK“¾‚µ‚Ä‚¢‚È‚¢ê‡‚Í0‚ð•Ô‚µ‚Ü‚·B
+
+ getcharidŠÖ”
+ getcharid(<n>)
+
+ n ”’l
+
+ ƒLƒƒƒ‰î•ñ‚ðID‚Å•Ô‚µ‚Ü‚·B
+ n=0 ƒLƒƒƒ‰ID
+ n=1 ƒp[ƒeƒB[
+ n=2 ƒMƒ‹ƒh
+ n=3 ƒAƒJƒEƒ“ƒgID
+
+ getpartynameŠÖ”
+ getpartyname(<n>)
+
+ n ”’l
+
+ <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒp[ƒeƒB[–¼‚ð•Ô‚µ‚Ü‚·B
+
+ getguildnameŠÖ”
+ getguildname(<n>)
+
+ n ”’l
+
+ <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh–¼‚ð•Ô‚µ‚Ü‚·B
+
+ getguildmasterŠÖ”
+ getguildname(<n>)
+
+ n ”’l
+
+ <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh‚̃}ƒXƒ^[‚Ì–¼‘O‚ð•Ô‚µ‚Ü‚·B
+
+ getguildmasteridŠÖ”
+ getguildmasterid(<n>)
+
+ n ”’l
+
+ <n>‚ÅŽw’肵‚½ID‚ðŽ‚ƒMƒ‹ƒh‚̃}ƒXƒ^[‚̃Lƒƒƒ‰ƒNƒ^[ID‚ð•Ô‚µ‚Ü‚·B
+
+ basicskillcheckŠÖ”
+ basicskillcheck(0);
+
+ battle_athena.conf‚Ìbasic_skill_check‚ÌÝ’è’l‚ð•Ô‚µ‚Ü‚·B0‚͈Ӗ¡‚Í‚ ‚è‚Ü‚¹‚ñ‚ª‰½‚à“ü‚ê‚È‚©‚Á‚½ê‡ƒGƒ‰[‚É‚È‚è‚Ü‚·B
+ basic_skill_check‚ƃJƒvƒ‰‚Ì‘qŒÉ—˜—p‚ð‡‚킹‚éˆ×‚Éì‚Á‚½•¨‚Å‚»‚êˆÈŠO‚Ì‹@”\‚Í‚ ‚è‚Ü‚¹‚ñB–ß‚Á‚½”’l‚ª0‚È‚çbasic_skill_check‚ªnoA1‚È‚çyes‚Å‚·B
+
+ getgmlevelŠÖ”
+ getgmlevel(0);
+
+ ƒvƒŒƒCƒ„[‚ÌGMƒŒƒxƒ‹‚ð•Ô‚µ‚Ü‚·B
+
+ guildopenstorageŠÖ”
+ guildopenstorage(0);
+
+ ƒMƒ‹ƒh‘qŒÉ‚ðŠJ‚«‚Ü‚·B
+ •Ô‚½”’l‚ª2‚È‚çƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢ƒLƒƒƒ‰‚ÆŒ¾‚¤ˆÓ–¡‚Å
+ 1‚Ȃ瑼‚̃Mƒ‹ƒhƒƒ“ƒo[‚ª‘qŒÉ‚ðŽg—p’†‚̈Ӗ¡‚Å‚·B
+ 0‚Ȃ笌÷“I‚ɃMƒ‹ƒh‘qŒÉ‚ªŠJ‚¢‚½‚Æ‚Ì‚±‚Æ‚Å‚·B
+
+ getwaitingroomstateŠÖ”
+ getwaitingroomstate(<num>,[<name>])
+
+ num ”’l
+ name •¶Žš—ñAÈ—ª‰Â
+
+ <name>‚ÅŽw’肵‚½NPC‚̃`ƒƒƒbƒgƒ‹[ƒ€‚Ìó‘Ô‚ð•Ô‚µ‚Ü‚·B
+ <name>‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ <num>‚Å“¾‚½‚¢î•ñ‚ðŽw’肵‚Ü‚·B
+
+ num=0 Œ»Ýƒ`ƒƒƒbƒgƒ‹[ƒ€‚É“ü‚Á‚Ä‚¢‚él”i”’lj
+ num=1 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÌŒÀŠEl”i”’lj
+ num=2 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ð‹N‚±‚·l”i”’lj
+ num=3 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg‚ª—LŒø‚©‚Ç‚¤‚©i”’lj
+ num=4 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃^ƒCƒgƒ‹i•¶Žš—ñj
+ num=5 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃pƒXƒ[ƒhi•¶Žš—ñj
+ num=16 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚̃Cƒxƒ“ƒg–¼i•¶Žš—ñj
+ num=32 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ª–žˆõ‚©‚Ç‚¤‚©i”’lj
+ num=33 ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ŃCƒxƒ“ƒg‚ª‹N‚±‚él”‚©‚Ç‚¤‚©i”’lj
+
+ getnpctimerŠÖ”
+ getnpctimer(<num>[,<name>])
+
+ num ”’l
+
+ <name>‚ÅŽw’肳‚ꂽNPC‚ªŽ‚ÂNPCƒ^ƒCƒ}[‚Ìî•ñ‚𓾂܂·B
+ name‚ðÈ—ª‚·‚é‚ÆA–½—ß‚ðŽÀs‚µ‚½NPC‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ <num>‚Å“¾‚½‚¢î•ñ‚ðŽw’肵‚Ü‚·B
+
+ num=0 Œ»Ý‚ÌNPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg’l
+ num=1 Œ»ÝNPCƒ^ƒCƒ}[‚ª“®ì‚µ‚Ä‚¢‚é‚©‚Ç‚¤‚©
+ num=2 Žw’èNPC‚̃^ƒCƒ}[ƒCƒxƒ“ƒgƒ‰ƒxƒ‹‚Ì‘”
+
+ attachridŠÖ”
+ attachrid(<num>)
+
+ num ”’l
+
+ <num>‚ÅŽw’肳‚ꂽID‚̃Lƒƒƒ‰ƒNƒ^[‚ðŽÀs‚µ‚½ƒXƒNƒŠƒvƒg‚ɃAƒ^ƒbƒ`‚µ‚Ü‚·B
+ ˆÈŒãAƒLƒƒƒ‰ƒNƒ^[‚ÉŠÖ‚·‚é–½—ß‚âŠÖ”/•Ï”‚È‚Ç‚Í‘S‚ÄV‚µ‚¢ƒLƒƒƒ‰ƒNƒ^[‚ª‘ÎÛ‚É‚È‚è‚Ü‚·B
+ ‚±‚ê‚̓XƒNƒŠƒvƒg‚ªI—¹/’†’f‚·‚é(close,end,menu,next,input‚È‚Ç‚ÌŽÀs)‚Ü‚Å—LŒø‚Å‚·B
+ Žå‚ɃCƒxƒ“ƒg‚Å‹N“®‚³‚ꂽƒXƒNƒŠƒvƒg“à‚Ń}ƒbƒv•Ï”‚ðŽg‚Á‚ĕʃLƒƒƒ‰ƒNƒ^[‚ð
+ ƒAƒ^ƒbƒ`‚·‚é‚Ì‚ÉŽg—p‚µ‚Ü‚·Bgetcharid(3)‚ÅŠ“¾‚µ‚½ƒAƒJƒEƒ“ƒgID‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢B
+ ‚È‚¨Aƒfƒ^ƒbƒ`‚É‚Ídetachrid–½—ß‚ðŽg‚¢‚Ü‚·B
+
+ ’ˆÓ‚·‚ׂ«“_‚Æ‚µ‚Ä‚ÍA‚±‚Ì–½—ß‚ÅPC‚ðƒAƒ^ƒbƒ`‚µ‚½ê‡Ames,menu,next‚È‚Ç‚Ì
+ ƒEƒBƒ“ƒhƒE(‚âƒ{ƒ^ƒ“)‚ªo‚é–½—ß‚ðŽÀs‚µ‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñB
+ ‘ŠŽè‚ª‘¼‚ÌNPC‚Ɖï˜b’†‚Ìê‡A‚±‚ê‚ç‚Ì–½—߂ͳ‚µ‚­“®ì‚µ‚Ü‚¹‚ñB
+ î•ñŠ“¾–½—ß‚È‚Ç‚¾‚¯‚ÅÏ‚Ü‚¹‚é‚ׂ«‚Å‚·B
+
+ ‚±‚ÌŠÖ”‚̓Aƒ^ƒbƒ`‚ɬŒ÷‚µ‚½‚©‚Ç‚¤‚©‚ð•Ô‚µ‚Ü‚·B
+ ‹U(0)‚ª•Ô‚Á‚Ä—ˆ‚½ê‡‚ÍAŠY“–ƒLƒƒƒ‰ƒNƒ^[‚ª‘¶Ý‚µ‚Ä‚¢‚Ü‚¹‚ñB
+
+ isloggedinŠÖ”
+ isloggedin(<num>)
+
+ num ”’l
+
+ <num>‚ÅŽw’肳‚ꂽID‚̃Lƒƒƒ‰ƒNƒ^[‚ª‚±‚̃}ƒbƒvƒT[ƒo[‚É
+ ƒƒOƒCƒ“‚µ‚Ä‚¢‚é‚©‚Ç‚¤‚©’²‚ׂ܂·B
+
+ getarraysizeŠÖ”
+ getarraysize(<variable>)
+
+ variable •Ï”
+
+ ”z—ñ<variable>‚Ì—LŒø‚ȃTƒCƒY‚𒲂ׂ܂·B
+ ‚±‚±‚ł̃TƒCƒY‚Í—v‘f‚ª0i•¶Žš—ñ•Ï”‚Å‚Í"")‚Å‚È‚¢A
+ Å‘å‚Ì—v‘f”Ô†+1 ‚É‚È‚è‚Ü‚·B
+ ”z—ñ–¼‚Å‚Í‚È‚­—v‘f”Ô†•t‚«‚ÅŽw’è‚·‚é‚ÆA
+ ­‚È‚­‚Æ‚à‚»‚Ì—v‘f‚Ü‚Å‚Í‘S‚Ä—LŒø‚Å‚ ‚é‚Ɖ¼’肵‚Ü‚·B
+ <—á> ”z—ñ@hoge‚ª 1,2,3,4,5 ‚¾‚Æ‚·‚é‚ÆA
+ getarraysize(@hoge)=5, getarraysize(@hoge[10])=10;
+
+ callsubŠÖ”
+ callsub <label>
+
+ callsub–½—ß‚ðŠÖ”‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·BÚ‚µ‚­‚Ícallsub–½—ß‚ðŒ©‚Ä‚­‚¾‚³‚¢B
+
+ callfuncŠÖ”
+ callfunc <func>
+
+ callfunc–½—ß‚ðŠÖ”‚Æ‚µ‚ÄŽÀs‚µ‚Ü‚·BÚ‚µ‚­‚Ícallfunc–½—ß‚ðŒ©‚Ä‚­‚¾‚³‚¢B
+
+ –’蔃‰ƒxƒ‹
+ -ƒ‰ƒxƒ‹
+ if•¶‚âmenu•¶‚ÅŽg—p‚µ‚Ü‚·BŽŸ‚Ìs‚©‚çƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
+
+ OnInitƒ‰ƒxƒ‹
+ MAP‚ªƒ[ƒh‚³‚ꂽ‚Æ‚«ƒXƒNƒŠƒvƒg‚ðŠJŽn‚µ‚Ü‚·B
+
+ OnInterIfInitƒ‰ƒxƒ‹
+ MAPƒT[ƒo[‚ªInterƒT[ƒo[‚ÉÚ‘±‚µ‚½‚Æ‚«‚ÉŽÀs‚µ‚Ü‚·B
+
+ OnCharIfInitƒ‰ƒxƒ‹
+ MAPƒT[ƒo[‚ªCharƒT[ƒo[‚ÉÚ‘±‚µ‚½‚Æ‚«‚ÉŽÀs‚µ‚Ü‚·B
+
+ OnMinuteXXƒ‰ƒxƒ‹
+ –ˆŽžXX•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
+
+ OnClockXXXXƒ‰ƒxƒ‹
+ –ˆ“úXXŽžXX•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚SŒ…‚Å‚·B
+
+ OnHourXXƒ‰ƒxƒ‹
+ –ˆ“úXXŽž00•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
+
+ OnDayXXƒ‰ƒxƒ‹
+ –ˆŒŽXX“ú00Žž00•ª‚ÉŽÀs‚µ‚Ü‚·B”’l‚Í\i”‚QŒ…‚Å‚·B
+
+ OnTimerXƒ‰ƒxƒ‹
+ NPCƒ^ƒCƒ}[‚̃JƒEƒ“ƒg‚ªX‚É‚È‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+ ‚±‚ÌX‚̓~ƒŠ•b’PˆÊ‚Å‚·BŒ…”‚ÍŠÖŒW‚ ‚è‚Ü‚¹‚ñB
+
+ OnAgitInitƒ‰ƒxƒ‹
+ ƒMƒ‹ƒhéƒf[ƒ^‚Æè‹’ƒMƒ‹ƒhî•ñ‚ªƒ}ƒbƒvƒT[ƒo[“à‚É
+ Š“¾‚³‚ꂽ‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+ ƒMƒ‹ƒhéŠÖŒW‚ÌNPC‚̉Šú‰»‚ÉŽg—p‚µ‚Ü‚·B
+
+ OnAgitStartƒ‰ƒxƒ‹
+ ƒMƒ‹ƒhUé킪Žn‚Ü‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+
+ OnAgitEndƒ‰ƒxƒ‹
+ ƒMƒ‹ƒhUé킪I‚í‚Á‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+
+ OnAgitBreakƒ‰ƒxƒ‹
+ ƒGƒ“ƒyƒŠƒEƒ€‚ð”j‰ó‚µ‚½‚Æ‚«‚ÉŽÀs‚³‚ê‚Ü‚·B
+ ‚±‚̃‰ƒxƒ‹‚Í”j‰ó‚µ‚½ƒvƒŒƒCƒ„[‚ðŽå‘Ì‚É‚µ‚ÄŽÀs‚³‚ê‚Ü‚·B
+
+ OnAgitEliminateƒ‰ƒxƒ‹
+ ƒGƒ“ƒyƒŠƒEƒ€”j‰óŒãAƒMƒ‹ƒh‚ÌŠ—LŽÒ‚ª‘‚«Š·‚í‚é‚Æ‚«‚É
+ ŒÄ‚΂ê‚Ü‚·B
+
+ –’ˆÓŽ–€
+ •¶Žš—ñ‚Æà–¾‚³‚ê‚Ä‚¢‚éˆø”‚Í""‚ň͂Á‚Ä‚­‚¾‚³‚¢B
+
+4. Error Message
+
+ * Make an error at the time of compile (it is a thing at the time of map server starting).
+ A place is displayed for the line number of an error.
+
+ unexpected expr end
+ It is the end of an unexpected formula.
+ ', ', and';' are in the beginning of a formula.
+
+ unmatch ')'
+ ')' does not match.
+ Correspondence of parenthesis'('')' is amusing.
+
+ unexpected newline @ string
+ It is the new-line which is not expected in a character sequence.
+ There is a new-line in the middle of a character sequence (surrounded by '"').
+ Probably it is a failure of '"' to close.
+
+ unexpected eof @ string
+ It is the file terminus which is not expected in a character sequence.
+ The file finished in the middle of the character sequence.
+ Probably it is a failure of '"' to close.
+
+ unexpected character
+ unexpected char
+ It is an unexpected character.
+ It is thought that the variable etc. is not following a naming rule.
+
+ l14 and l15 is DEPRECATED. use @menu instead of l15.
+ l14 and l15 are not recommended. Please use @menu instead of l15.
+
+ prefix 'l' is DEPRECATED. use prefix '@' instead.
+ Prefix'l' is not recommended. Please use '@' instead.
+
+ unmatch ']'
+ ']' does not carry out an interval.
+ Correspondence of parenthesis']' is missing.
+
+ expect function
+ ŠÖ”‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
+ ŠÖ”ŒÄ‚Ño‚µ‰‰ŽZŽq'('‚Ì‘O‚ÉŠÖ”ˆÈŠO‚̃Vƒ“ƒ{ƒ‹‚ª‚ ‚è‚Ü‚·B
+ ‚¨‚»‚ç‚­ŠÖ”–¼‚ðŠÔˆá‚¦‚Ä‚¢‚Ü‚·B
+
+ expect ',' or ')' at func params
+ ŠÖ”‚̈ø”‚É‚¨‚¢‚Ä','‚©')'‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
+ ‚¨‚»‚ç‚­ˆø”‹æØ‚è‚Ì','‚©')'‚ð–Y‚ê‚Ä‚¢‚Ü‚·B
+
+ func request '(' ')'
+ ŠÖ”ŒÄ‚Ño‚µ‚ÌŠ‡ŒÊ‘Ήž–â‘è
+ ‚¨‚»‚ç‚­ˆø”‚Ì”‚ª128‚ð’´‚¦‚Ü‚µ‚½B
+
+ illeagal number of parameters
+ ƒpƒ‰ƒ[ƒ^‚Ì”‚ª•s³‚Å‚·
+ ŠÖ”/–½—߃pƒ‰ƒ[ƒ^‚̌”‚ªˆÙ‚È‚è‚Ü‚·B
+ ˆø”‚̌”‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B
+ ƒGƒ‰[ˆÊ’u‚Í‘S‚Ă̈ø”‚ÌŒã‚É‚È‚è‚Ü‚·B
+
+ expect command
+ –½—ß‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
+ –½—߈ȊO‚̃Vƒ“ƒ{ƒ‹‚ª“Ë‘RoŒ»‚µ‚Ä‚¢‚Ü‚·B
+ ‚¨‚»‚ç‚­–½—ß–¼‚ðŠÔˆá‚¦‚Ä‚¢‚Ü‚·B
+
+ expect ',' or ';' at cmd params
+ –½—߂̈ø”‚É‚¨‚¢‚Ä','‚©';'‚ðŠú‘Ò‚µ‚Ä‚¢‚Ü‚µ‚½
+ ‚¨‚»‚ç‚­ˆø”‹æØ‚è‚Ì','‚©';'‚ð–Y‚ê‚Ä‚¢‚Ü‚·B
+
+ need ';'
+ ';'‚ª•K—v‚Å‚·
+ ‚¨‚»‚ç‚­ˆø”‚Ì”‚ª128‚ð’´‚¦‚Ü‚µ‚½B
+
+ ŽÀsŽž‚̃Gƒ‰[
+ fatal error ! player not attached!
+ ’v–½“IƒGƒ‰[IƒvƒŒƒCƒ„[‚ªƒAƒ^ƒbƒ`‚³‚ê‚Ä‚¢‚Ü‚¹‚ñI
+
+ ƒLƒƒƒ‰ƒNƒ^[‚ð“Á’è‚Å‚«‚È‚¢ƒCƒxƒ“ƒg‚ÅŽÀs‚³‚ê‚Ä‚¢‚é
+ ƒXƒNƒŠƒvƒg‚Ì’†‚ŃLƒƒƒ‰ƒNƒ^[î•ñ‚ª•K—v‚È–½—ß‚âŠÖ”A
+ •Ï”‚ÖƒAƒNƒZƒX‚µ‚Ü‚µ‚½BattachridŠÖ”‚ðŽg‚¤‚©A
+ ƒLƒƒƒ‰ƒNƒ^[î•ñ‚ª•s—v‚È–½—ß‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
+ ‚à‚µ‚­‚ÍAattachridŠÖ”‚Åݒ肳‚ꂽî•ñ‚ª•s³‚Å‚·B
+ ‚È‚¨A‚±‚̃Gƒ‰[‚ª‹N‚±‚é‚Æ’¼Œã‚ɃRƒA‚ð“f‚­‚ÆŽv‚í‚ê‚Ü‚·B
+
+ NPCŽå‘̃Cƒxƒ“ƒg‚Åannounce‚µ‚½‚Æ‚«‚Ƀtƒ‰ƒO0x08‚ðŽw’肵‚Ä‚¢‚È‚¢
+ ê‡‚à‚±‚̃Gƒ‰[‚ª‚Å‚Ü‚·B
+
+
+ illeagal scope string variable.
+ •¶Žš—ñ•Ï”‚̃XƒR[ƒv‚ª•s³‚Å‚·B
+ –¢‘Ήž‚̃vƒŒƒtƒBƒbƒNƒX‚Å•¶Žš—ñ•Ï”‚ªŽg—p‚³‚ê‚Ü‚µ‚½B
+ ƒvƒŒƒtƒBƒbƒNƒX‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B
+
+ illeagal scope
+ ƒXƒR[ƒv‚ª•s³‚Å‚·B”z—ñ•Ï”–¢‘Ήž‚̃vƒŒƒtƒBƒbƒNƒX‚ð
+ Ž‚•ϔ‚É”z—ñ•Ï”Œn‚Ì–½—ß‚ðŽÀs‚µ‚½ê‡‚È‚ÇB
+
+ not label !
+ goto/menu–½—߂щƒxƒ‹‚ªŽw’肳‚ê‚é‚ׂ«‚Æ‚±‚ë‚É
+ ƒ‰ƒxƒ‹ˆÈŠO‚̃Vƒ“ƒ{ƒ‹‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚·B
+ ‚à‚µ‚­‚ÍAƒ‰ƒxƒ‹–¼‚Æ•Ï”–¼‚ªƒoƒbƒeƒBƒ“ƒO‚µ‚Ä‚¢‚Ü‚·B
+
+ buildin_set: not name
+ set–½—ß‚Å‘æˆêˆø”‚ª•Ï”–¼‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ getelementofarray (operator[]): param2 illeagal number
+ ”z—ñ•Ï”‚Å[]“à‚Ì’l‚ª•s³‚Å‚·
+ []“à‚Ì’l‚ª0–¢–ž‚©128ˆÈã‚É‚È‚è‚Ü‚µ‚½
+
+ getelementofarray (operator[]): param1 not name
+ ”z—ñ•Ï”‚Å[]‚Ì‘O‚̃Vƒ“ƒ{ƒ‹‚ª•Ï”–¼‚Å‚Í‚ ‚è‚Ü‚¹‚ñB
+
+ op_2: int&str, str&int not allow.
+ ŠÖŒW‰‰ŽZŽqi”äŠr‰‰ŽZŽqj‚ÅA”’l‚Æ•¶Žš—ñA‚à‚µ‚­‚Í
+ •¶Žš—ñ‚Æ”’l‚ªŽw’肳‚ê‚Ü‚µ‚½B
+
+ infinity loop !
+ ƒXƒNƒŠƒvƒg‚ÌŽÀs–½—ß”‚©Agoto/menu–½—ߎÀs‰ñ”‚ª
+ ‘½‚·‚¬‚é‚Ì‚ÅA–³ŒÀƒ‹[ƒv‚Æ”»’f‚µ‚Ü‚µ‚½B
+ ƒXƒNƒŠƒvƒg‚ÌŽÀs‚Í‹­§“I‚É’†’f‚³‚ê‚Ü‚µ‚½B
+
+ not function and command !
+ ŠÖ”ŽÀs/–½—ߎÀs•”•ª‚ÅAŠÖ”‚Å‚à–½—ß‚Å‚à‚È‚¢
+ ƒVƒ“ƒ{ƒ‹‚ª‚ ‚è‚Ü‚µ‚½B
+ if•¶‚Ì‚È‚©‚Å‚ ‚é‰Â”\«‚ª‚‚¢‚Å‚·B
+
+ return without callfunc or callsub !
+ callfunc‚âcallsub‚³‚ê‚Ä‚¢‚È‚¢‚Ì‚Éreturn–½—ß‚ðŽÀs‚µ‚Ü‚µ‚½B
+
+ stack.sp(?) != default(?)
+ ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ªŠî€ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ƈقȂÁ‚Ä‚¢‚Ü‚·B
+ –½—ß‚ðŽÀs‚µ‚½Œ‹‰ÊAƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ª‹¶‚¢‚Ü‚µ‚½B
+ ŠÖ”‚ð–½—ß‚Æ‚µ‚ÄŽÀs‚µ‚½‰Â”\«‚ª‚ ‚è‚Ü‚·B
+
+
+5. Postscript
+ NPC contained in snapshot was made reference in creating this text.
+ I appreciate people which created NPC.
+
+It corrects based on text by asong (2004/3/1).
+
+
diff --git a/doc/whisper_sys.txt b/doc/whisper_sys.txt
index 553ac1399..2c786ebd5 100644
--- a/doc/whisper_sys.txt
+++ b/doc/whisper_sys.txt
@@ -1,29 +1,29 @@
-Adapted from: http://eathena.deltaanime.net/board/index.php?showtopic=42659
-Copied by: Massdriller
-Post made by: lordalfa
-
-As requested by MassDriller, I made this piece of code to allow you to whisper your NPCS and let them execute some commands for you.
-
-An example of what you can do with it, before you eventually go on reading.
-
-Let's say you prepared a special NPC called NPCCommander.
-You whisper to NPCCommander in Game with formatted instructions like these:
-
-//============================================================
-
-[To NPC:Commander] Report#Killstealing#Lordalfa
-
-//============================================================
-
-Now what happens is that this code allows you to trigger a Label called "OnWhisperGlobal" into that NPC and execute some code, passing it The values you just input.
-
-Values will be passed into Temp string Variables called @whispervar0$, @whispervar1$ and so on..
-In the example above:
-
-@whispervar0$ would contain the word "Report"
-@whispervar1$ would contain the word "KillStealing"
-@whispervar2$ would contain the word "Lordalfa"
-
-so you might prepare the NPC Label to process these Variables and give Executing Character a Feedback ( via dispbottom "message" for example )
-
-Now , it's allowed to use up to 10 commands in a Row, separed by "#" character, they will be splitted and passed to the NPC Label in their respective variables, for you to process them.
+Adapted from: http://eathena.deltaanime.net/board/index.php?showtopic=42659
+Copied by: Massdriller
+Post made by: lordalfa
+
+As requested by MassDriller, I made this piece of code to allow you to whisper your NPCS and let them execute some commands for you.
+
+An example of what you can do with it, before you eventually go on reading.
+
+Let's say you prepared a special NPC called NPCCommander.
+You whisper to NPCCommander in Game with formatted instructions like these:
+
+//============================================================
+
+[To NPC:Commander] Report#Killstealing#Lordalfa
+
+//============================================================
+
+Now what happens is that this code allows you to trigger a Label called "OnWhisperGlobal" into that NPC and execute some code, passing it The values you just input.
+
+Values will be passed into Temp string Variables called @whispervar0$, @whispervar1$ and so on..
+In the example above:
+
+@whispervar0$ would contain the word "Report"
+@whispervar1$ would contain the word "KillStealing"
+@whispervar2$ would contain the word "Lordalfa"
+
+so you might prepare the NPC Label to process these Variables and give Executing Character a Feedback ( via dispbottom "message" for example )
+
+Now , it's allowed to use up to 10 commands in a Row, separed by "#" character, they will be splitted and passed to the NPC Label in their respective variables, for you to process them.
diff --git a/doc/woe_time_explanation.txt b/doc/woe_time_explanation.txt
index 7701107a1..019d88059 100644
--- a/doc/woe_time_explanation.txt
+++ b/doc/woe_time_explanation.txt
@@ -1,111 +1,111 @@
-//| ~~~~~ How to set WoE times, by erKURITA: ~~~~~
-//|
-//| Basically, there are 2 commands that affects the WoE times,
-//| OnClock<time>: and gettime(<type).
-//|
-//| OnClock<time> runs when the said time where <time> is has been reached.
-//| The format of time is hhmm, being h = hour, m = minute.
-//| OnClock2350: would run at 23:50 on Computer's time.
-//|
-//| gettime(<type) is a function which is used to make a check
-//| for a desired amount of information regarding time. The types are:
-//| 1 - Seconds (of a minute)
-//| 2 - Minutes (of an hour)
-//| 3 - Hour (of a day). Hour goes from 0 to 23.
-//| 4 - Week day (0 for Sunday, 6 is Saturday)
-//| 5 - Day of the month.
-//| 6 - Number of the month.
-//| 7 - Year.
-//| 8 - Day of the year.
-//|
-//| Days (explained later) :
-//| Monday = 1
-//| Tuesday = 2
-//| Wednesday = 3
-//| Thursday = 4
-//| Friday = 5
-//| Saturday = 6
-//| Sunday = 7
-//|
-//| This way, we can check for a desired minute, hour, day, month, etc.
-//|
-//| Now the structure:
-//|
-//| OnClock2100: //start time for Tues(2), Thurs(4)
-//| OnClock2300: //end time for Tues(2), Thurs(4)
-//| OnClock1600: //start time for Sat(6)
-//| OnClock1800: //end time for Sat(6)
-//|
-//| These 4 labels will run one after the other. It's acomodated so,
-//| The Tuesday at 21:00 and 23:00 they will run, and go to the next
-//| part of the script:
-//|
-//| if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
-//| if((gettime(4)==4) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
-//| if((gettime(4)==6) && (gettime(3)>=16 && gettime(3)<18)) goto L_Start;
-//|
-//| This part will check for the times. Since both Starting and Ending times
-//| run through the same chain of commands, there are necesary checks to ensure
-//| it's the right time. Let's take the following example:
-//|
-//| if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23))
-//|
-//| The first gettime is checking for a type 4, the day of the week, and it's
-//| comparing it to the one desired, which is 2, that's Tuesday. If the comparation
-//| is true and both sides are equal, it will return 1. 1 means true, 0 means false
-//| in comparations and conditions.
-//|
-//| The second gettime is checking for a type 3, which is the hour, and it's
-//| comparing it to 21, and if the first part is greater or equal (>=) than the second,
-//| the comparation will return 1.
-//|
-//| The third and last gettime is checking again for the hour, but the time has to be less
-//| than the said time, in this case, 23.
-//|
-//| Now, look at the parentheses. Parentheses are very important when making comparations
-//| and conditions. Check the order of these. I'll place dummy characters for this example:
-//|
-//| if ((X && (Y && Z)) goto L_Start;
-//|
-//| It's saying, if Y and Z are true, the condition meets. Now let's replace that comparation
-//| with another dummy character. We're doing (Y && Z) = G:
-//|
-//| if (X && G) goto L_Start;
-//|
-//| It's saying, if X and G are true, the condition meets, thus it has to go to L_Start.
-//|
-//| Now, the last part of the script, regarding the end of WoE time:
-//|
-//| if((gettime(4)==2) && (gettime(3)==23)) goto L_End;
-//| if((gettime(4)==4) && (gettime(3)==23)) goto L_End;
-//| if((gettime(4)==6) && (gettime(3)==18)) goto L_End;
-//| end;
-//|
-//| This is the same as before, but it's checking for the day in the first gettime, and
-//| the hour on the second. If both conditions are true, the WoE will end. We're checking
-//| here for the end time, not the start.
-//|
-//| Another important thing is OnAgitInit: . This special label will be run as soon as the
-//| castle data is loaded from the char data. So it will check for the above start and end time
-//| to see if it's in WoE time, hence why the hours has to be checked.
-//|
-//| Now a example of how to set the WoE so it starts on Monday, at 4 pm and ends up at 10 pm:
-//|
-//| OnClock1600: //| 16:00 = 4 pm
-//| OnClock2200: //| 22:00 = 10 pm
-//|
-//| OnAgitInit: //| there has to be ONLY ONE of these labels, so put the OnClock above this
-//| //| and the checks below.
-//|
-//| if ((gettime(4)==1) && (gettime(3)>=16 && gettime(3)<22)) goto L_Start;
-//|
-//| if ((gettime(4)==1) && (gettime(3)==22) goto L_End;
-//| end;//| VERY IMPORTANT TO PLACE AND END AFTER THE LAST END CHECK. You don't want to
-//| //| start the WoE w/o being on the right times/day
-//|
-//| I hope this has been clear enough. Remember to put the checks in a logical way, e.g:
-//| Monday checks first, then Thursday, etc.
-//| Any questions Pm me (erKURITA) or go to irc channel on irc.deltaanime.net in #athena
-//| channel. Do not PM on IRC w/o asking please.
-//|
+//| ~~~~~ How to set WoE times, by erKURITA: ~~~~~
+//|
+//| Basically, there are 2 commands that affects the WoE times,
+//| OnClock<time>: and gettime(<type).
+//|
+//| OnClock<time> runs when the said time where <time> is has been reached.
+//| The format of time is hhmm, being h = hour, m = minute.
+//| OnClock2350: would run at 23:50 on Computer's time.
+//|
+//| gettime(<type) is a function which is used to make a check
+//| for a desired amount of information regarding time. The types are:
+//| 1 - Seconds (of a minute)
+//| 2 - Minutes (of an hour)
+//| 3 - Hour (of a day). Hour goes from 0 to 23.
+//| 4 - Week day (0 for Sunday, 6 is Saturday)
+//| 5 - Day of the month.
+//| 6 - Number of the month.
+//| 7 - Year.
+//| 8 - Day of the year.
+//|
+//| Days (explained later) :
+//| Monday = 1
+//| Tuesday = 2
+//| Wednesday = 3
+//| Thursday = 4
+//| Friday = 5
+//| Saturday = 6
+//| Sunday = 7
+//|
+//| This way, we can check for a desired minute, hour, day, month, etc.
+//|
+//| Now the structure:
+//|
+//| OnClock2100: //start time for Tues(2), Thurs(4)
+//| OnClock2300: //end time for Tues(2), Thurs(4)
+//| OnClock1600: //start time for Sat(6)
+//| OnClock1800: //end time for Sat(6)
+//|
+//| These 4 labels will run one after the other. It's acomodated so,
+//| The Tuesday at 21:00 and 23:00 they will run, and go to the next
+//| part of the script:
+//|
+//| if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
+//| if((gettime(4)==4) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
+//| if((gettime(4)==6) && (gettime(3)>=16 && gettime(3)<18)) goto L_Start;
+//|
+//| This part will check for the times. Since both Starting and Ending times
+//| run through the same chain of commands, there are necesary checks to ensure
+//| it's the right time. Let's take the following example:
+//|
+//| if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23))
+//|
+//| The first gettime is checking for a type 4, the day of the week, and it's
+//| comparing it to the one desired, which is 2, that's Tuesday. If the comparation
+//| is true and both sides are equal, it will return 1. 1 means true, 0 means false
+//| in comparations and conditions.
+//|
+//| The second gettime is checking for a type 3, which is the hour, and it's
+//| comparing it to 21, and if the first part is greater or equal (>=) than the second,
+//| the comparation will return 1.
+//|
+//| The third and last gettime is checking again for the hour, but the time has to be less
+//| than the said time, in this case, 23.
+//|
+//| Now, look at the parentheses. Parentheses are very important when making comparations
+//| and conditions. Check the order of these. I'll place dummy characters for this example:
+//|
+//| if ((X && (Y && Z)) goto L_Start;
+//|
+//| It's saying, if Y and Z are true, the condition meets. Now let's replace that comparation
+//| with another dummy character. We're doing (Y && Z) = G:
+//|
+//| if (X && G) goto L_Start;
+//|
+//| It's saying, if X and G are true, the condition meets, thus it has to go to L_Start.
+//|
+//| Now, the last part of the script, regarding the end of WoE time:
+//|
+//| if((gettime(4)==2) && (gettime(3)==23)) goto L_End;
+//| if((gettime(4)==4) && (gettime(3)==23)) goto L_End;
+//| if((gettime(4)==6) && (gettime(3)==18)) goto L_End;
+//| end;
+//|
+//| This is the same as before, but it's checking for the day in the first gettime, and
+//| the hour on the second. If both conditions are true, the WoE will end. We're checking
+//| here for the end time, not the start.
+//|
+//| Another important thing is OnAgitInit: . This special label will be run as soon as the
+//| castle data is loaded from the char data. So it will check for the above start and end time
+//| to see if it's in WoE time, hence why the hours has to be checked.
+//|
+//| Now a example of how to set the WoE so it starts on Monday, at 4 pm and ends up at 10 pm:
+//|
+//| OnClock1600: //| 16:00 = 4 pm
+//| OnClock2200: //| 22:00 = 10 pm
+//|
+//| OnAgitInit: //| there has to be ONLY ONE of these labels, so put the OnClock above this
+//| //| and the checks below.
+//|
+//| if ((gettime(4)==1) && (gettime(3)>=16 && gettime(3)<22)) goto L_Start;
+//|
+//| if ((gettime(4)==1) && (gettime(3)==22) goto L_End;
+//| end;//| VERY IMPORTANT TO PLACE AND END AFTER THE LAST END CHECK. You don't want to
+//| //| start the WoE w/o being on the right times/day
+//|
+//| I hope this has been clear enough. Remember to put the checks in a logical way, e.g:
+//| Monday checks first, then Thursday, etc.
+//| Any questions Pm me (erKURITA) or go to irc channel on irc.deltaanime.net in #athena
+//| channel. Do not PM on IRC w/o asking please.
+//|
//| ~ erKURITA \ No newline at end of file
diff --git a/notice.txt b/notice.txt
index f08eec226..1b49fd1a9 100644
--- a/notice.txt
+++ b/notice.txt
@@ -1,12 +1,12 @@
-//Notice\\
-
-This branch, "Trunk", might not be stable due to bugs and whatsoever.
-It is highly recommended, if you have any doubts on using this svn version,
-it is best if you use an eAthena Official Version or use the Stable branch.
-
-on another note, if you found a bug, it is best if you report it on the eAthena
-forums as http://eathena.ws/ . If you have made yourself a fix for
-that piece of faulty/buggy code, why not post it up and we'll add it to the svn.
-who knows, you might be an aspiring dev.
-
+//Notice\\
+
+This branch, "Trunk", might not be stable due to bugs and whatsoever.
+It is highly recommended, if you have any doubts on using this svn version,
+it is best if you use an eAthena Official Version or use the Stable branch.
+
+on another note, if you found a bug, it is best if you report it on the eAthena
+forums as http://eathena.ws/ . If you have made yourself a fix for
+that piece of faulty/buggy code, why not post it up and we'll add it to the svn.
+who knows, you might be an aspiring dev.
+
eA Dev Team \ No newline at end of file
diff --git a/npc/Changelog.txt b/npc/Changelog.txt
index 96cac5c71..8962421b9 100644
--- a/npc/Changelog.txt
+++ b/npc/Changelog.txt
@@ -1,2269 +1,2269 @@
-Person Working On
-======
-Lupus
- * Looking for exploits, optimization, bugs hunt
- * Adding new cards, checking/adding mobs/items
- * EXP quests for Blacksmith, Merchant, Alchemist
-Mass Zero
- * Fixing grammatical errors.
- * Fixing small bugs.
- * Adding small stuff.
- * Redoing lots of the custom scripts.
-Massdriller
- * Correcting & Bugfixing scripts
-erKURITA
- * Warps maintainment
-Evera
- * Everything.
- * Dungeon Teleport System NPCs.
- * iRO information gathering.
- * Kafra maintainment.
- * Taking requests.
-Musashiden
- *Scripting iRO latest towns (warps, NPCs, ect.)
- *iRO information gathering.
-Playtester
- * Monsters spawn, warps maintainment
-KarLaeda
- * Fixing bugs
- * Adding new NPC
-
-
-== Changelog ==
-
-Date Added
-======
-12/01
- * Fixed event's label for many quest-spawned monsters [KarLaeda]
- * Small fix to The Sign Quest [KarLaeda]
- * Removed outdated Thief Bug ID [Playtester]
- - 1017 and 1021 don't exist anymore
-11/30
- * Updated Shinokas Quest to leave no grabage vars [Lupus]
- - Added a log when players get their jobs
- * Added first version of Rachel Sanctuary spawns [Playtester]
- - commented for now
-11/28
- * Enabled Ice Dungeon spawns so they can be tested [Playtester]
-11/26
- * Added a check to prevent spawning of more than one Thanatos in the Thanatos Quest.
- Thanks to Kodachi for reporting on IRC [erKURITA]
- * Enabled Rachel Field spawns so they can be tested [Playtester]
-11/24
- * Cleaned up global permanent variables in Airship Quest [KarLaeda]
-11/23
- * Fixed Mage Tutorial Quest [KarLaeda]
- - Fixed typos in Ninja Quest
-11/21
- * Less G_mobs spawning in Odin Temple [Playtester]
-11/20
- * Updated Skill Resetter Event, thanks to $ephiroth [KarLaeda]
- * Fixed Sage guest [KarLaeda]
- * Fixed exploit in Shinokas Quest [KarLaeda]
-11/17
- * Added official kRo&idRO Skill Reset Event, thanks to $ephiroth [Lupus]
- - Fixed possible double levelup bugs [Lupus]
-11/16
- * Fixed wrong label name in adoption NPC [KarLaeda]
- * Added official Ninja Job quest! Thanks to Legionaire for translation [Lupus]
- Don't forget to update your other\Global_Functions.txt
- - Removed name duplicates
-11/14
- * Replaced current Rachel Sanctuary warps with jAthena's version [Playtester]
- - some warps still seem to be wrong or missing
-11/13
- * Fix for guild manager recognizing [KarLaeda]
-11/12
- * According to recent info you can re-install Guardians during WoE [Lupus]
-11/11
- * Fixed warp on timeout in swordman.txt [KarLaeda]
-11/09
- * Added Bingo - Hugel warps, thanks to erKURITA [Lupus]
- - Added Hugel INN
- - Added missing temp Airship mobs
- - Pet shop in Lighthalzen
- - Minor typos fix of Hunter Job quest, thanks to $ephiroth
- * Fixed Swaltzwalt Quest Part 1 bugs [dunkle]
-11/08
- * Added quest\WIP (work in progress folder) with scripts by Dunkle and CallNIX [Lupus]
- * Small fix in Hunter Job Quest [KarLaeda]
-11/07
- * Another one set of fixes for the scripts syntax. [KarLaeda]
- * Added Quiz (Revolution) Part 1. Converted by CAHTXHuK [Lupus]
- He's another candidate to the script devs. Work in progress. Help us to find bugs
-11/06
- * Fixed item select in Novice Exchanger [KarLaeda]
-11/05
- * Fixed extra EOL in jro spawn [KarLaeda]
- * Fixed reward of gunslinger job quest [Playtester]
-11/04
- * Many small fixes - tabs, parenthesis [KarLaeda]
- * Fixed Weight check in 1st class quests [Lupus]
- - Added missing tabs to airship
-11/03
- * Small Kiel Quest update [Playtester]
- * Updated Hunter Job Quest: 7 official item sets of Demon Hunter [Lupus]
- thanks to Dr.Evil
-11/02
- * Removed extra NEXT; from custom\airplane.txt, thanks to $ephiroth
- * Amatsu Field: Fixed Hydra -> G_Hydra (to fix drops exploit) [Lupus]
- U can put there a normal Hydra to open free Hydra Cards + Macros exploit
- * Fixed typos and item names in DTS warper, 2006 Headgear Quest [Lupus]
-11/01
- * Added entrance to Kiel Dungeon F2 [Playtester]
- * Training grounds: Now Kafra Tickets are given at correct NPC/Actions [Lupus]
- Only at Kafra Employee 118,108 & Hanson 100,29
-10/31
- * Official X.4 spawn mob types [Playtester]
- - numbers are official on 90% of the maps
-10/30
- * Updated the npc/other/marriage.txt wedding script with the most current
- version. [Skotlex]
- * Added Official First Class Quests-Tutorials (Jukka's conversion) [Lupus]
-10/29
- * Added official jRO 10.3 spawns as custom option [Playtester]
-10/26
- * Replaced previous TK Job Quest with this one [Tsuyuki]
- - Updated Lighthalzen City & Rachel City NPC
- - Replaced Louyang Guide with new, 100% correct iRO dialogues
-10/25
- * Got rid of colned maps. Replaced them by their originals [Lupus]
- new_1-?.gnd -> new_zone0?.gnd
- sword_1-1.gnd -> job_sword1.gnd
- - Fixed item id in socket_enchant.txt, thx to norbert
-10/24
- * Spawn updates for Einbroch Fields [Playtester]
- * Updated Novie Training Grounds: typos, bugs, removed extra maps, duplicates [Lupus]
- - Removed some unused job-quest map aliases to free some RAM. Thanks to theultramage for pointing it out.
- !!!WARNING!!! Wipe your memo db. Map indexes have been shifted.
- * Added official Gonryun Power Arena [KarLaeda]
- * Removed 2nd entrance warp to Novice Geffen Castle [Lupus]
- - minor fixes in Novice Exchanger
-10/23
- * Fixed small typo in the Priest job quest [Playtester]
-10/22
- * Small spawn updates for Gefenia and Einbech Dungeon [Playtester]
-10/21
- * Further spawn updates for Yuno Field [Playtester]
- - Magma Dungeon
- - Amatsu Field
- - Amatsu Dungeon
- - Gonryun Field
- - Gonryun Dungeon
- - Umbala Field
- - Umbala Dungeon
- - Yggdrasil
- - Niflheim
- - Louyang Field
- - Louyang Dungeon
- - Ayothaya Field
- - Ayothaya Dungeon
-10/20
- * Official kRO 10.1 spawns for Morroc Field [Playtester]
- - Prontera Field
- - Cities (reorganized citycleaners)
- * Added official Free Ticket for the Cart Service to the Novice Training Grounds [Lupus]
- - Fixed endless Novice Potion + Adv Suite exploit
- - Removed 2 oudated Novice Grounds scrips (they confused many people)
- * Official kRO 10.1 spawns for Mjolnir Field [Playtester]
- - Comodo Field
- - Geffen Field (+ 10.4 Orc Village change)
- - Payon Field
- * Added official Gonryun Broken Sword Quest [KarLaeda]
- * Fixed The Sign Exploits [Lupus]
- - Optimized Novice Exchanged (loot->Red Potions), moved the file to NPC\Merchants
- - Fixed The Sign bugs, thanks to Tantarian
- + added get rid of sobbing pieces to let people reborn
- If u finished the Sign Quest and have some undeleted sobbing pieces, then visit this man
- mjo_dun02.gat 88,295 Flaming Spirit Man - he'll wipe them 8)
- - Fixed wrong label names in mjolnir_seal.txt, thanks to Tantarian
- - Added Feast Day Of Ramadan Idul Fitri Event (official idRO) by $ephiroth
-10/19
- * Official kRO 10.1 spawns for Byalan [Playtester]
- - Payon Cave
- - Toy Factory
- - Lutie Field
- - Anthell
- - Orc Dungeon
- - Coal Mine
- - Prontera Culverts
-10/18
- * Llyr fixed The_Sign_Quest [Lupus]
- * Official kRO 10.1 spawns for Glastheim [Playtester]
- - Turtle Island
- - Clock Tower
- - Sphinx
- - Prontera Maze
- - Sunkenship
- - Beach Dungeon
- - Pyramid
- - Geffen Tower
- * Official kRO 10.1 spawns for the guild dungeons [Playtester]
-10/14
- * Some more official spawns [Playtester]
- * Fully official Juperos and Bio Lab spawns [Playtester]
- * Updated some field spawns to official [Playtester]
- * Fully official Abyss Lake spawns [Playtester]
- * Fully official Thanatos Tower spawns [Playtester]
- * Fixed typo in Lighthalzen Bank [Playtester]
- * Assassin Job quest: Fixed skipping of Nameless NPC [Lupus]
-10/11
- * Removed Free Pass from Kafra [Lupus]
- - Now Kafra can use these tickets (Novice Grounds has to be updated!)
- 7059,Free Ticket for Kafra Storage | 7060,Free Ticket for Kafra Transportation
- 7061,Free Ticket for the Cart Service
- - Added "-Guide" option to Kafra. WIP (some official servers show u a nearest Guide on your mini-map)
-10/10
- * Fixed Seals quest [Lupus]
- * Updated Kafra Pavianne [Lupus]
- * Added new custom Halloween Event by Stryker. I made it safe to use 8) [Lupus]
-10/06
- * Fixed Shuriken Rekka requiring Cracked Diamond rather than Steel [Playtester]
- * Added official treasure spawn to Novice Castles [Lupus]
- - Added official Novice WoE restriction: Only the 1st class players (+Novice, SN) < 60 Base Level can enter.
- - You can't invest Eco/Def, hire Guardians at Novice Castles
- * Many minor fixes, thanks to theultramage [Lupus]
- - Fixed "mymob" Niflheim bug, fixed Sworman Job Quest timer issue, fixed overlapping NPCs.
-10/05
- * Fixed typo [Vicious]
- * Umbala: Added official chance of failure to Create Essence (u may get a Garlet instead) [Lupus]
- - Added official random amount to Dismantle Stone
-10/04
- * Updated missing dialogues/NPC to Lighthalzen Bank, Prison,Auction area [Lupus]
- thanks to Au{R}oN
-10/03
- * Fixed Assassin Job Quest: Timer bug / NPC bypass exploit [Lupus]
-10/01
- * Removed some duplicate Rachel warps [Playtester]
-09/28
- * $ephiroth converted custom event: Grand Circlet Quest + Excalibur [Lupus]
- * Added official Kiel Dungeon entrance [Playtester]
- - commented the custom warps
-09/27
- * Fixed item lists in Shuriken Blacksmith. Thanks to $ephiroth [Lupus]
-09/26
- * Added Jukka's conversion first_class\tu_acolyte.txt. Not tested, not enabled yet [Lupus]
- * Shuriken Blacksmith - added missing next; [Lupus]
- - Finished translation of custom\may_hats, thanks to Playtester ^_-
-09/25
- * Fixed the Shuriken Blacksmith. Incomplete Label (M_DAIS -> M_DAIS4) and extra
- parenthesis on line 128 ( a ) in the end of the condition) [erKURITA]
- * Thanks to Au{R}oN, added prison and bank Lighthalzen NPC [Lupus]
- - Thanks to Au{R}oN, added Shuriken Blacksmith. Fixed bugs.
-09/22
- * Fixed missing npc interaction at Einb Pollution Quest [Lupus]
-09/21
- * Feed 15 more permanent character variables. [Lupus]
- - Fixed old Cube Room sticks-bug
- - Now Bio-Lab passage uses MISC_QUEST | 512 instead of 'hzdun'
- Don't forget to update your lhazeh warps script ^_-'
- - Fixed 2 bugs in Dungeon Teleport Service. Should use ( ) !!!
-09/20
- * Fixed some bugs in Cube Room. Some parts could be skipped [Lupus]
- * Final optimization of Niflheim quests [Lupus]
- - Book of Devil Quest uses bit-wise var MISC_QUEST | 256. Removed extra vars
- - Piano Quest uses 1 bit-wise temp var instead of 5 variables.
- - Clear Niflheim garbage vars in Global_Functions.txt
- - Added few missing NEXT; into job quests, thanks to $ephiroth
- - Changed permanent variables in 1st Job Quest skills to @temp ones
- - Cube Room: 5 key vars -> 1 var cubekey
-09/19
- * Fixed rpsroulette.txt, giving 10 blue potions as prize instead of the 20 it said. Also fixed
- a missing variable in sphinx_mask.txt. Noticed by JTE and fixed by Warian [erKURITA]
- * Preparations for optimization of Louyang/Nifelhem scripts [Lupus]
-09/16
- * fixed apple dice game in Airship, fixed missing } in Einbech quests [Lupus]
-09/15
- * Ein.Town Pollution fix [Lupus]
-09/14
- * Fixed Payon city. Bugs, missing text, etc [Lupus]
- * Massive Einbroch & Einbech bugfix. WIP [Lupus]
- * Fixed typos in Gunslinger & Thief Job Quest & various NPCs [Lupus]
- thanks to cbmaster & $ephiroth
- - Fixed Guild Defence / Economy underflow, thanks to kyoki
- - Zoc's fix to keep number of unopened boxes on reboot
- - Now each castle spawns 1st/2nd Treasure Box type as 50%/50% w/o random
- - Fixed Momotaro Quest, thanks to .~Abism0~.
-09/11
- * Moved custom Umbalian quests to custom folder [Lupus]
- * Added back Guild Storage. Confirmed kRO feature. [Lupus]
-09/10
- * Official Byalan F5 spawns [Playtester]
- - also updated eamobs accordingly
-09/08
- * Adjusted Rachel spawns [Playtester]
- * Fixed Einbroch Headgear shop [Playtester]
-09/06
- * Added a missing feature to the donation NPC in Lighthalzen [MasterOfMuppets]
-09/05
- * More proper Valyrie dialogues [Lupus]
- * eAAC Update to the banker. [erKURITA]
-09/04
- * Added missing next's in npc/custom/airplane.txt and npc/custom/quests/valhallen.txt [Evera]
- - (Thanks $ephiroth)
- * Fixed Bio Ethic quest typo (misspelled key phrase), thx2 mr.rkit [Lupus]
- - Merged updated city warps from TRUNK
-09/03
- * Added another next; in bongunsword.txt [Evera]
- * Added missing NPC name in text and next;'s in npc/quests/bongunsword.txt,
- - npc/cities/amatsu.txt, and npc/merchants/socket_enchant.txt. (Thanks $ephiroth) [Evera]
- * Added some Juperos maps to nosave.txt due to an upcoming update. [MasterOfMuppets]
-09/02
- * Updated Kiel spawns [Playtester]
- - first floor is close-to-official, but no idea about second floor
- * Fixed some Thanatos Tower warps [Playtester]
- - I hope Ishizu fixes up the quest soon
-09/01
- * Added missing next;'s in Payon City NPCs (Thanks $ephiroth) [Evera]
- * Tried to remove all duplicates (in default NPCs) [Toms]
- * Removed useless 'npc\other\old' directory, who would need that anyway... [DracoRPG]
- * Commented out the path to Divorce NPC as Lupus forgot to add it for good [DracoRPG]
- * Fixed critical syntax errors in the new Valkyrie script, (è_é) @ Lupus [DracoRPG]
- * Improved Bioethics quest & nearby Rekenber Guards [DracoRPG]
- - Used isequipped() instead of getequipid() to simplify code (esp. with accessories)
- - Rewritten the custom text about Hom. Res. and removed its actual learning
- - iRO-ized answers to the test (text was taken from a pRO guide so pRO names >.>)
- * Rogue Job quest: now baby thieves can pass 4th test [Lupus]
- - In the same quest, fixed test4 quest NPC, thanks to Dj-Yhn
- - Added divorcing Deviruchi, converted by LightFighter
-08/31
- * Removed a warp from Izlude to make sure people won't get stuck until [MasterOfMuppets]
- the arena has been finished.
- * Reverted two duplicate next, please check before commit it [Playtester]
-08/30
- * Added missing NEXT; to some custom quests. Thanks to $ephiroth [Lupus]
- * A small fix to the 2006 headgears quest, thanks to Belle for telling me about the problem. [MasterOfMuppets]
- * Added temporary Ice Dungeon spawn file (commented for now) [Playtester]
-08/29
- * Fixed a bug in the sign quest that prevented people from advancing in it. [MasterOfMuppets]
- * Changed some broadcast colors in the god item quest. [MasterOfMuppets]
- * Some preparations for the upcoming Izlude Arena [MasterOfMuppets]
- * eAAC Update to the Coin Banker. [erKURITA]
-08/27
- * Fixed a syntax error on npc/guild/nguild/nguild_warper.txt line 37 [Toms]
- * After big discussion at the board, by default we decided to disable CUSTOM
- Guild Storage option in Guild Kafras. You can uncomment it in functions_kafras.txt [Lupus]
- - Also made Novice Castles Event close to the original: 1st classes over 60 Base Level
- can't take part. Novice Castles also manufacture not more than
- 1 Treasure Chest despite of the Economic invest.
- - Fixed custom Bandit's Beard quest. Thanks to Vhan Morthis for pointing it out.
-08/26
- * Added official effects to the Socket Enchant NPC [Playtester]
-08/25
- * Reverted the mapflag changes to Lighthalzen. [MasterOfMuppets]
- * Little correction on Assassin Job Quest [Toms]
-08/24
- * Various fixes on Headgear 2006 quests [Playtester]
- * Updated Treasure Chests Numver formula to the Aegis one: Economic/5+4 [Lupus]
- - Updated Bio Ethics Quest to let Creators+Baby Alchemists learn the skill as well
- - Moved it to Alchemist Skill Quests
- - Added NO LOOT, NO EXP mapflags to Lighthalzen (Gangsters exploit fix)
-08/22
- * Fixed bug letting anyone get homunculus skills from Bio Ethics [Evera]
- * Updated Gunslinger Quest, removed "Thin Trunk" (7186) according to RockmanEXE [Toms]
-08/21
- * Fixing MoM's typos (Citrin -> Citrine) over Lv4 weapon quest. [erKURITA]
- * Implemented the God item quest. [MasterOfMuppets]
- - Thanks to SinSloth for scripting most of it.
- - Beware of potential bugs.
- - A grammar check-up would be appreciated.
-08/20
- * Implemented the Einbroch polution script. [MasterOfMuppets]
- * Implemented the official 2005 headgear quests. [MasterOfMuppets]
-08/19
- * Uncommented Homunculus shop for Homunculus in Trunk [Evera]
-08/15
- * Fixed Kellasus giving extra skills in Bio Ethics Quest [Evera]
- * Added Ammo Dealer Tony [Playtester]
- * Fixed some parts of the Gunslinger gun quests [Playtester]
- * Added Ammo Casing Seller Kenny [Playtester]
- * Added Holy Arrow Quivers to Inventor Jaax [Playtester]
- * Added all the Gunslinger gun quests [Playtester]
- - sphere creation and ammo casing are still missing, working on it
- - removed erKURITA's version, he's okay with it
-08/14
- * Various changes in other/dts_warper.txt [Evera]
- - Uses new global var $dtsday to count voting sessions [Evera]
- - Bug fix for a bug involving both warpers being activated at the same time [Evera]
- - Need bug testers for these fixes before stable merge [Evera]
- * Updated header in other/Global_Functions.txt [Evera]
- * Fixed the int&str bug of test tube in bio labs quest [Evera]
- * Fixed 2006 headgears npc giving you Lion Mask rather than Lion Masquerade [Playtester]
- * Moved the Gunslinger quest NPCs to gunslinger_quests.txt [Playtester]
- - put erKURITA's version of the Garrison quest into another file since I already
- added a complete version, use it if you like it more
- - also gave the NPCs their official names
- * Changed DTS warper to use MISC_QUEST|128 instead of dtseligible,2. [Evera]
- - May be some bugs, it's 1am @_@, look through it before trunk merge. [Evera]
- * Added Garbage clearing for dtseligible,2 -> MISC_QUEST|128, and added that func call to DTS warper. [Evera]
- * Added (finally) the official Inn Maid of Rachel. Save and warp points
- are official aswell, thanks to RockmanEXE [erKURITA]
- * Added (finally) the Garrison quest npc. Item requirements are the official ones,
- but the quest... well you know. Thanks to RockmanEXE [erKURITA]
-08/13
- * Finished Bio Ethics Quest, need bug testers before finalizing and moving to stable [Evera]
- * Added Bio Ethics Quest variable to bit shift MISC_QUEST|64, and added to quest_variables.txt [Evera]
- * Fixed Bio Ethics Quest, had a few bugs >_< [Evera]
- * The Sign Quest: moved #aldesignwarp to fix enless warp [Lupus]
-08/12
- * Fixed id of Dryad Card in the Headgears 2006 quest thanks to tonyfud [Playtester]
- * Added Violin[3] to the Comodo Weapon seller [Playtester]
- * Optimized a warp near Gunslinger weapon shop [Playtester]
- * Extended the Garrison quest to slot the Garrison [Playtester]
-08/10
- * Switch airplanelocation variables to temp variables to avoid unusefull mapreg(sql/txt) writes [Toms]
- * Added file for gunslinger quests [Playtester]
- - Garrison quest is done and tested
- * Fixed header on DTS warper [Evera]
- * Added bit to Bio Ethics quest to warp out player if attempts quest, since quest is unfinished [Evera]
- * Some Einbroch respawn time fixes [Playtester]
-08/09
- * A small sign quest fix according to a recent patch. [MasterOfMuppets]
-08/06
- * Added official spawn locations for all Yuno Fields [Playtester]
- - note: only works with Skotlex's spawn area fix
-08/05
- * Fixed NPC event parameter deprecated of Adoption. [Lupus]
- Thx 2 tuproc 4 pointing it out
- * Fixed the Socket Enchanter thinking some items are Class C [Playtester]
-08/04
- * Added some official spawn locations from Aegis [Playtester]
- * Re-enabled Socket Enchanter, it's official thus enabled by default [Playtester]
- - If you think it ruins your server's economy COMMENT IT FOR YOUR OWN SERVER, thanks.
- - If you want it disabled please discuss in the Development forum about it first!
-08/03
- * Once again disabled the socket enchant NPC.
- - unless your server's rates are 1/1/1, it will COMPLETELY ruin your server's economy. [Musashiden]
- * Updated the Kafra Express files to the July 28 release as requested on
- the forums. [Skotlex]
- * Fixed the DTS warper zeny bug [Evera]
-08/02
- * Re-enabled the Culvert Save [Evera]
- * Removed save points outside towns (from inside) from Kafras [Evera]
- - Kafras will no longer display "Save Outside City," and will just save you inside
- * Added official success rates of the Socket Enchant NPC [Playtester]
- * Fixed Sharon's abuse at Hunter Job Quest 8) Thanks to mike04 for pointing it out [Lupus]
-07/31
- * Updated the Geffenia spawns. [MasterOfMuppets]
- * Some small changes to the sign quest [MasterOfMuppets]
- * Cleared 2006 Headgear quests a bit [Lupus]
- - Made Gunslinger Job Quest use 1 variable instead of 2 [Lupus]
-07/30
- * Added 2006 Headgear quests... note that they will need to be updated with official dialog
- and NPC ID. [Reddozen]
- * Optimized Gunslinger Job Quest, rediced vars number, updated Global_Functions.txt [Lupus]
-07/29
- * Some more sign quest warps and a small change to the comodo gambling NPC. [MasterOfMuppets]
- * Fixed a mixed up mob id in Thanatos spawns [Playtester]
- * Added temporary Beholder and Gremlin spawns [Playtester]
- - their drops are needed but Airship quest isn't finished yet
- - should be commented once Airship quest is finished
- - also added two airship warps
-07/27
- * Fixed the Morroc ingredient seller to not appear [Playtester]
- * Fixed some spawns and a warp in Sunken Ship [Playtester]
-07/26
- * Fixed the Factory Quest [Playtester]
- - two NPCs in one line won't work! >_>
-07/25
- * Added first part of Bio Ethics Quest [Evera]
- - Far from complete :<
- * Some small fixes to the sign quest [MasterOfMuppets]
- * Updated Thanatos Tower spawns [Playtester]
- - they are official up to Floor 6 now
-07/24
- * Tiny typo fix in a Rekenber Guard dialog [DracoRPG]
- * Added temporary Rachel spawn file, commented for now [Playtester]
-07/23
- * Removed the regular Thanatos spawn, since the quest is now implemented. [MasterOfMuppets]
- * Implemented the Niflheim town invasion. [MasterOfMuppets]
- * Jawaii warp now costs 10,000z [Playtester]
- * Implemented the sign quest, please test it if you have some free time :P [MasterOfMuppets]
- - We need to know if there's any bugs left to implement it in stable
- * Changed the names of some NPCs [MasterOfMuppets]
-07/22
- * Removed two warps in Aldebaran in preparation for the sign quest. [MasterOfMuppets]
-07/21
- * Fixed a typo in guides_einbr.txt [Playtester]
- * Added the Cube Room Maze thanks to Tharis and Tantarian [Playtester]
-07/20
- * Split quest from cities/izlude.txt to quests/quests_izlude.txt [Evera]
- * Split quest from cities/alberta.txt to quests/quests_alberta.txt [Evera]
- * Split quests from cities/amatsu.txt to quests/quests_amatsu.txt [Evera]
- * Split quests from cities/ayothaya.txt to quests/quests_ayothaya.txt [Evera]
- * Split Doomed Sword quests from cities/comodo.txt to quests/quests_comodo.txt [Evera]
- * Split Einbech quests from cities/einbech.txt to quests/quests_ein.txt [Evera]
- * Renamed quests/quests_einbroch.txt to quests/quests_ein.txt [Evera]
- * Split more Einbroch quests in cities/einbroch.txt to quests/quests_einbroch.txt [Evera]
-07/19
- * Completed the sign quest warps [MasterOfMuppets]
-07/18
- * Fixed a warp in moc_pryd06 [Playtester]
-07/17
- * Enchanting a Tiara now costs 2M [Playtester]
- * Added slotted Running Shirt to Comobo Gambling [Playtester]
-07/16
- * Small spawn update in Kiel Dungeon [Playtester]
-07/15
- * Removed global eligibility option from DTS warper [Evera]
- - Added old global eligibility variable for DTS warper to garbage [Evera]
- - Fixed incorrect information in DTS warper header [Evera]
- * Fixed Detale's spawn location [Playtester]
- * Fixed Blue Fish quest only removing 1 Stinky Scale [Playtester]
- * Fixed some typos in cities/izlude.txt thanks to Zarnox [Playtester]
-07/14
- * Fixed a quest NPC giving you a Huge Leaf rather than Smokie Leaf [Playtester]
- * Improved the Fox Mask quest [Playtester]
- * Small Kafra coordinate fixes [Playtester]
-07/13
- * Fixed an invalid savepoint in Lighthalzen Inn. [Adam]
- * Added Sephiroth's version of the Rachel Sanctuary Warps [Playtester]
- - remove the comments in the warp file if you want to use them
- * Fixed some typos thanks to Zarnox [Playtester]
- * Disabled socket enchant npc. [Musashiden]
-07/09
- * Added some missing Rachel Warps [Playtester]
- * Added a fix to npc/other/books.txt [Playtester]
-07/07
- * Fixed a few bugs in 2004_headgears.txt [Evera]
- * Fixed a small bug in the swordsman job quest [MasterOfMuppets]
- - thanks to tenshi7angel for notifying me about it.
- * Small fix in the Blacksmith Quest [Playtester]
-07/05
- * Fixed Dancer Job Quest (3rd part) thx2Alis [Lupus]
- * Went trough all scripts and turned all job numbers -> constants [Lupus]
-07/05
- * fixed missing labels socket_enchant.txt [Lupus]
- * Standardized NPCs quest/quests_city headers, now says 'Quest NPCs related to'
- - Also fixed typos in those NPC city headers [Evera]
- * Removed that Dbbug announce line from the 2004 headgears quest npc.
- [Skotlex]
- * Fixed Book of Yamir stucking [Lupus]
- * Fixed bugs / typos in 2004_headgears.txt, thanks to Qwadrat [Lupus]
- * Updated Socket Enchant NPC [Playtester]
- - fixed various bugs
- - adjusted success rates
- - now has official coordinates and sprite
-07/04
- * Added the Socket Enchant NPC written by Sousuke_PL [Playtester]
- - I already tested and fixed some stuff but requires some more testing
- * Implemented the official 2004 Headgear quests, thanks to Dj-Yhn [MasterOfMuppets]
- for the conversion from Aegis format.
-07/03
- * Fixed bug in DTS warper that votes weren't counted on Sunday [Evera]
- - Changed requirement for vote eligibility in DTS warper to 60
- (Was previously completion of President's Quest, but since it wasn't
- done, I used a random chance) [Evera]
- * eAAC update to donation girl. [erKURITA]
- * Split cities/einbroch.txt to cities/einbroch.txt and quests/quests_einbroch.txt [Evera]
- - Fixed some small typos [Evera]
- * Fixed many many bugs in Crusader Job Quest [Lupus]
- Changed all numbers to job_constants
-07/02
- * Split quests from cities/louyang.txt to quests/quests_louyang.txt [Evera]
- * Added some fixed positions and fixed mob id in Einbroch spawns [Playtester]
- * Moved Earth Petits away from the Coal Mine Entrance Map in eamobs [Playtester]
-07/01
- * Fixed a warp in the Ice Dungeon [Playtester]
-06/30
- * Implemented the eye of hellion quest. [MasterOfMuppets]
- * Added official Thanatos Tower quest thanks to Ishizu-chan [Playtester]
- * Completely updated Lighthalzen Field spawns to X.4 [Playtester]
- * Completely updated Einbroch Field spawns to X.4 [Playtester]
- * Completely updated Yuno Field spawns to X.4 [Playtester]
- * Updated Orc Village spawns to X.4 [Playtester]
- * Fixed a Rachel Field warp [Playtester]
- * Fixed some warps thanks to akihito [Playtester]
- * Updated Byalan F5 spawns to X.4 [Playtester]
- * Added custom/floating_rates.txt [Lupus]
- Random change of Drop/Exp rates from 1x to 1.5x every 6 hours
- NOTE! Take a look at an incredible script function 'setbattleflag'
-06/29
- * Fixed many typos on cities/alberta.txt and airports/airships.txt, with information from Crono/Hollengrhen [Evera]
- - Fixed many typos on cities/aldebaran.txt [Evera]
- * Stricted up penal servitude conditions [Lupus]
- - Restricted Novices Castles entrance of TK/Highs to 80 BaseLevel
-06/28
- * Updated yuno_fild03 spawns [Playtester]
-06/27
- * Added Rachel NPCs:
- ~ Added Official warps of Rachel. About 50% of them. Will get the rest soon. [erKURITA]
- ~ Added the Tool/Armor/Weapon dealer, aswell as a Vegetable Gardener. [erKURITA]
- ~ Added the guards + guide locations. Also added the Zondaman location. [erKURITA]
- ~ Added Rachel Inn npc. [erKURITA]
- \- Special thanks to RockmanEXE for all the info above.
- * eAAC update to the vending machine, disguiser and quest warper. [erKURITA]
-06/26
- * Added BIT-WISE perm variables info quest_variables.txt [Lupus]
-06/25
- * Moved Umbala quests from cities/ to quests/, namely Skeletal Gate, Umbala Event, and Create/Dismantle Stone
- - Moved Piano and Book of Devil quest from cities/niflheim.txt to quests/quests_niflheim.txt
- - Moved Culvert from cities/prontera.txt to quests/quests_prontera.txt [Evera]
- * Fixed possible exploit in umbala elemental stone quest [Playtester]
- * Added a shop NPC to Prontera, it's required for the Hellion Quest. [MasterOfMuppets]
-06/24
- * Fixed some typos and coordinates [Musashiden]
-06/23
- * Merged JFunc 2-1, 2-2 functions, fixed bugs with missing dialogues [Lupus]
- and changed job numbers to constants
- * Updated Valhalla [Lupus]
- - Also fixed some typos. Thx2 Mitternacht
-06/22
- * Fixed treasure chests round number exploit [Lupus]
- Now u get an extra chest one exact 4 Eco.pts adding
-06/21
- * Yuno/Lhz/Thanatos spawn updates thanks to Tharis [Playtester]
- * Fixed some spawns in Odin Temple [Playtester]
- * Updated Hugel to official X.4 spawns thanks to Tharis [Playtester]
- * Updated Einbroch to official X.4 spawns thanks to Tharis [Playtester]
-06/19
- * Changed Doctor Quest item names to updated item_db names (cities/louyang.txt) [Evera]
- * Fixed Quest requirements in cities/louyang.txt [Playtester]
- * Fixed umbala.txt's Elemental Stones Quest bug. Thanks to Vhan Morthis.
- [Skotlex]
- * Removed Jfunc1-1.txt, merged parts of scripts back. Changed job numbers to constants [Lupus]
- - Jfunc2-1.txt & Jfunc2-2.txt todo
-06/17
- * Fixed a Rachel warp thanks to Dr.Evil [Playtester]
- * Fixed some typos in quests_lighthalzen.txt thanks to Karore [Playtester]
-06/16
- * Implemented the Lover's quest. [MasterOfMuppets]
- * Yet another missing Juno warp. [musashiden]
- * Corrected a duplicate juno warp + a juno guide sprite. [Musashiden]
- * Updated sample script mob_controller.cpp to the latest standards. [Lance]
- * Commited Silent's Fix to the duplicate NPCs [Playtester]
- - needs testing
- - can't be fully fixed because of length limitation of names
-06/15
- * Juno's NPCs are now updated (unless i missed one) according to iRO! yay! [Musashiden]
- * Juno Update Process. 75% complete. [Musashiden]
- * Fixed the gambling npc giving Orc Helm [1] instead of the non-slotted version. [MasterOfMuppets]
- * Dr.Evil fixed some parts of his Umbala script [Playtester]
- * Updated the color codes on the Juno Guides mini map illustrations. [Musashiden]
- * Juno Update Process. 50% complete. [Musashiden]
- * Fixed an exploit in the Comodo gambling script. [Lupus]
-06/14
- * Separated the Metto quest from the juno town npcs file. [musashiden]
- * Juno Update Process. 30% complete. [Musashiden]
- * Some more sign quest warps [MasterOfMuppets]
- * Fixed Job Level requirement for Auto-Berserk [Playtester]
- * Fixed some experience gained bugs in two scripts. [MasterOfMuppets]
- - Also fixed a major problem in the level 4 weapon quest, thanks to Qwadrat.
- * Fixed an exploit in the comodo gambling script, thanks to reddozen [MasterOfMuppets]
-06/13
- * Fixed exploit in Louyang NPC [Playtester]
- * More Abyss/Thanatos spawn updates according to info from Tharis [Playtester]
- * Added Dr.Evil's fixes to the Umbala NPCs [Playtester]
- - probably needs some testing
- * Fixed the Job Level requirement for Arrow Crafting [Playtester]
-06/12
- * Implemented the comodo gambling NPCs. Thanks to reddozen and Zefris. [MasterOfMuppets]
- * Looks like somebody needs sleep. (Typos in Yuno.txt) [Lance]
- * Juno Update Process. 10% complete. [Musashiden]
- * Implemented a missing NPC in Amatsu and fixed up the old [MasterOfMuppets]
- version of the Momotaro event, it is now a permanent quest.
- * Started the Juno Update process. 5% complete. [Musashiden]
- * Added custom quest for 5 mobile RO bonus items [Lupus]
- Bird Nest,Lion Mask,Skeleton Manteau,Fashion Hip Sack,Sales Banner
- * Changed Biolab quest so that case for the first letter of each input doesn't matter. [Evera]
- * Fixed some typos in the new spawns [Playtester]
- * Implemented Amatsu guides and changed/removed some Amatsu warps [MasterOfMuppets]
-06/11
- * Updated spawns by Tharis, thanks to Saycyber21 [Vicious]
- * Implemented the Poison King quest, beware of potential bugs. [MasterOfMuppets]
- * eAAC update:
- - Added Vending Machine, made by Celestria. [erKURITA]
- - Updated and fixed Coin Banker, by me :P. [erKURITA]
- * Updated all job quests, Valhallana, to completely save/restore ALL Quest Skills [Lupus]
- IMPORTANT! Don't forget to update all files, includin new Global_Functions.txt
-06/09
- * Added some missing iRO - Lighthalzen NPCs [Musashiden]
- * Fixed a problem with Kafra's getarg(1),6 of showing the default menu [Evera]
- * Fixed Lighthalzen and Yuno Kafra respawn locations [Playtester]
- * Implemented two airship mini games scripted by Dj-Yhn [MasterOfMuppets]
- * A small fix to Shinokas quest [MasterOfMuppets]
- * Reverted back fully working counteragent_mixture.txt. Don't touch 8) PM me [Lupus]
-06/07
- * Fixed Yuno Kafra warp, sorry guys, I made a typo [Evera]
- * Readded the 'al_morgen' variable to counteragent_mixture.txt, it's needed [MasterOfMuppets]
- for the alchemist quest. Thanks to Belle for the fix.
- * Added Save/Load Quest Skills (1st/2nd Class quest skills!) global functions. To test and
- insert into Valhalla NPC. They use ONE variable for all skills [Lupus]
-
-06/06
- * Fixed missing function problems for Kafra, also now using cleararray instead of assigning blank variables to every other array [Evera]
- * Implemented the Shinokas quest, thanks to Dj-Yhn for scripting it. [MasterOfMuppets]
- * Added Rachel interior warps thanks to Celestria [Playtester]
-06/05
- * Implemented some more Louyang npcs, thanks to Prometheus for them. [MasterOfMuppets]
- * Implemented an inn NPC in Einbroch [MasterOfMuppets]
- * Fixed some typos in Lighthalzen [Playtester]
-06/03
- * Implemented some more airship NPCs, more are to come. [MasterOfMuppets]
- - Also put in a few warps from the sign quest which is to come.
- * Updated Kafras [Evera]
- * Small adjustment to Thanatos Tower spawns [Playtester]
- * Fixed some typos and warps in Einbech [Playtester]
- * Fixed a small typo in cities/aldebaran.txt thanks to LightFighter [Playtester]
-06/02
- * Removed Bio Lab from eamobs [Playtester]
- - since the official entrance is in it's no longer needed
-05/31
- * Now only one Chung E spawns in Louyang [Playtester]
- * Added Rachel and Ice Dungeon warps [Playtester]
- * Now re-using one variable MISC_QUEST for such quests: [Lupus]
- Morgenstein, Nifl Witch, Edgar's Offer, Prontera Culvert,
- Juice Maker, Tempestra,
- - replaced BUNYBND with @BUNYBND
- - added a special global function "F_ClearGarbage" function [Lupus]
- that converts old quest variables into MISC_QUEST bits;
- clears outdated, wasted variables. Temporary added its calls into Warpra & Kafra
- IMPORTANT! Update all your quests and Global_Functions.txt
- If you continue using not updated Quests scripts, it could cause
- some exploits or the passed quests reset
-05/30
- * Fixed Jawaii Classic Suite NPC warping directly ontop of a warp [Evera]
- * Fixed the Umbala Skeleton Gate thanks to LightFighter and Naf- [Playtester]
- * Implemented the Lighthalzen guides, added some missing warps [MasterOfMuppets]
- and a tool dealer.
- * Re-made some quest to use 1 variable instead of 2 or 3... [Lupus]
- - Juice Maker, Morgenstein+Alchemist Job Quest, Tempestra
- Make a habbit to clean your global_reg_value table from event vars & old garbage
-05/29
- * Changed DTS warper vote count to use 1 variable. [Evera]
-05/27
- * Implemented a small quest in Einbroch and fixed the name of the [MasterOfMuppets]
- spawning mobsters in Lighthalzen
- * Implemented the second entrance to biolabs and added some crap NPCs [MasterOfMuppets]
- - The sewer pipe does no longer REQUIRE a lab passport, but it requires completion of the cube quest
- - The second entrance to biolabs does not REQUIRE completion of the cube quest, but it does require
- a lab passport.
- * Updated DTS Warper; Now uses 3 global vars, 2 are vote #, 1 is etc in binary values. [Evera]
- * Implemented the friendship quest. *finally* [MasterOfMuppets]
-05/26
- * Modified Kiel spawn file [Playtester]
- - only one Aliza each floor
- - Kiel D-01 spawns every 2 hours on floor 2
- * Uncommented Odin and Kiel spawn files, they are mostly safe to use [Playtester]
- - you still can't access Kiel's place, though
-05/25
- * Fixed Abyss Lake spawns [Playtester]
- * Fixed Thanatos Tower spawns [Playtester]
- * Added a custom Market Place to clear Prontera streets from annoying shops. [Lupus]
- 'novending' mapflag sample: Try it and adjust the script as you want.
- * Optimized a bit scripted warps, got rid of 'anthell' perm var [Lupus]
-05/24
- * Removed Blue Potions from Yuno Shops [Playtester]
- * Fixed the Thanatos Floor 12 warp [Playtester]
- - coordinates are just guessed
- - whoever does the quest should fix the warps there anyways
- * Commented the custom Geffenia Fountain by default [Playtester]
- * Added the Novice Exchange Quest provided by Dr.Evil [Playtester]
- - exchange novice loot for Red Potions
-05/23
- * Fixed a bug in the new Job Master [Playtester]
- - he rebirthed you even if you haven't reached level 99...
- * Changed the questions of the Wizard Quiz to official ones [Playtester]
-05/22
- * Global_Functions fix. Jobmaster fix. [Lance]
-05/19
- * eAAC Update + Fix [erKURITA]
- * Translated sample/gstorage_test.txt
- * Commented a warp that stands in the middle of nowhere [Playtester]
-05/17
- * Now the Inns are like on official servers [Playtester]
-05/15
- * Fixed DTS warper, optimized Kafra and changed pay cave and orc village kafra [Evera]
- * Fixed Amon Ra's spawning location [Playtester]
- * Corrected 10 Geminis spawning in Lhz1 rather than 2. [Skotlex]
-05/14
- * Fixed the quiz in the Wizard Job quest a bit [Playtester]
-05/13
- * Fixed the new shops [Playtester]
- * Added missing shops at Beacon Island [Playtester]
-05/12
- * Added DTS (Dungeon Teleport System) Warper NPC [Evera]
-05/10
- * Fixed some typos and grammatical errors on the Job Dancer quest...
- [Skotlex]
- * Fixed Inn dialogues [Playtester]
-05/09
- * Inn now costs 5k at every level [Playtester]
-05/07
- * Fixed some grammar errors in Thief Job, Kunai, and others [KillerBox]
- * Fixed Sea Otter Quest thanks to nolider [Playtester]
-05/06
- * Fixed the warp in the Turbo Track Room [Playtester]
-05/04
- * Hopefully fixed the custom Prontera Cemetery Event [Playtester]
- * Fixed a missing " in the gunslinger jobquest script [Playtester]
- - some others fixes as well thanks to sodaboy581 and css25
- - some typo fixed as well
-05/02
- * Added kunai_maker.txt to make elemental kunais. [erKURITA]
- * Added new npcs @ que_ng.gat ninja map portion. [erKURITA]
- * Added new shops @ que_ng.gat ninja map portion. [erKURITA]
- * Commented wrong shops @ amatsu.txt. [erKURITA]
- * Added que_ng.gat ninja map portion's warp. [erKURITA]
- * Modified and corrected the gunslinger quest. [erKURITA]
-05/01
- * Fixed an NPC in Morroc who still said the Dragon Fly is North [Playtester]
-04/30
- * Made Geffen Tower 1 in eamobs a bit more crowded [Playtester]
- * Added the correct spawns for Ancient Geffenia(gef_dun03) [Playtester]
- * Added some tabs to the Pickpocket Quest so it's more readable [Playtester]
- * Added first version Gywall's Pickpocket Quest [Playtester]
- * Updated several job quests so they work again thanks to sodaboy581 [Playtester]
- * Fixed mjolnir_12 -> prt_maze01 warp [Playtester]
-04/27
- * Fixed an Aldebaran Castle 4 warp again [Playtester]
-04/26
- * Commented out temp Gunslinger shops. [Lupus]
- * Fixed Food Seller in Alberta thanks to Sousuke [Playtester]
- * functions_kafra.txt was pretty buggy, including a zeny exploit (free warps). Thanks to OZ over IRC
- for pointing out. It needs more optimization too. [erKURITA]
- * eAAC Update: quest_warper.txt [erKURITA]
-04/25
- * Re-made the Izlude NPCs with new dialogues among other things. Thanks to Muad_Dib [Kargha]
- * Added two Alberta NPCs thanks to Sousuke [Playtester]
- * Cube Room Quest: fixed "free stick" bug, thx 2 Neouni [Lupus]
-04/23
- * Rearranged Ingredient Sellers. Removed doubled seller from Morocc [Lupus]
- * Added an ingredient seller to Morroc, thanks to Muad_Dib [MasterOfMuppets]
- * Fixed the names of the Lighthalzen and Einbroch refiners, thanks to Muad_Dib [Kargha]
-04/22
- * Fixed some typos in the mage quest thanks to decayed.cell [Playtester]
-04/21
- * Fixed Chung E / Green Maiden spawn in Louyang [Playtester]
-04/20
- * Added missing Kafra in Prontera [Playtester]
- * Hopefully also fixed the custom job master [Playtester]
- * Fixed it again, better use constants [Playtester]
- * Fixed Rebirth script not working for some Knights and Crusaders [Playtester]
- - needs some testing!
- * Fixed Taekwon quest obviously never working [Playtester]
- * Updated Job Quests of Taekwon, SG, SL (all thanks to Celestria) [Lupus]
- They have oficial sprites, actions. But some dialogs are made up. ^_-
- - Don't forget to update your Global_Functions.txt !
-04/19
- * Whoops, eAAC members made a mistake with scripts and I didn't notice => Quest Warper.txt [erKURITA]
- * Added quest_warper.txt and banker.txt to npc\customs\eAAC_Scripts. [erKURITA]
-04/18
- * Fixed custom Jobmaster not rebirthing Crusaders on a Pecopeco [Playtester]
-04/16
- * Updated lhz_fild03 according to info from kRO thanks to RockmanEXE [Playtester]
- * Whoops, forgot to remove clone_arena from the scripts_eaac.conf. [erKURITA]
- * Enabled import: line on scripts_main.conf for scritps_eaac.conf. The scripts
- are disabled there anyway.... [erKURITA]
- * Commited musashiden's kiel dungeon warps [erKURITA]
- * Commited musashiden's Lighthalzen fixes [MasterOfMuppets]
- * Fixed aldeg_cas04 random warp [Playtester]
- * Fixed merchants/grandpa_pharmacist.txt thanks to KarLaeda [Playtester]
- * Removed Cube room warps from the quest script [Lupus]
-04/15
- * Fixed Mobster's OnDead event [Playtester]
- * Implemented Musashiden's Lighthalzen npcs - Part 2 [Shadow]
- * Renamed Mastersmith Howard to Whitesmith Howard in the spawn files [Playtester]
- * Implemented Musashiden's Lighthalzen npcs [MasterOfMuppets]
- * Fixed Einbroch & Archer Village Guide bugs, thanks to NeatElves 4 pointing the bug [Lupus]
- * Modified the Cloth Dyer so that he refuses to dye your clothes [Playtester]
- * Added weight checks to merchants/refine.txt thanks to Neouni [Playtester]
- * Fixed names of Lighthalzen mobs in spawn files [Playtester]
- * Changed Juperos spawns according to info provided by Tharis [Playtester]
-04/14
- * Added quest_warper.txt to eAAC_Scripts. Deleted the sql and txt versions
- of the disguiser and added a merge of both. Deleted clone_arena.txt.
- Updated global_functionsKE.txt of Skotlex. [erKURITA]
- * Added some more Kiel warps thanks to Celestria [Playtester]
- * Cleaned up eamobs [Playtester]
- - deleted all files that have no difference to mobs
- - scripts_eamonsters.conf now links to mobs for those cases
- * Added a temporary script to enter Gefenia for some Zeny [Playtester]
- - will be replaced once we have finished The Sign Quest
-04/13
- * Finally added the missing Xmas spawns in Geffen Field [Playtester]
- * Added a few missing warps in Lighthalzen, thanks to Kargha. [MasterOfMuppets]
- * Some more crap NPCs implemented in Lighthalzen, thanks to Kargha [MasterOfMuppets]
- for scripting them.
- * Implemented some crap NPCs in Lighthalzen [MasterOfMuppets]
- * Fixed SOME bugs in Hugel.txt, hu_guide.txt. thanks to joshuaali [Lupus]
- Guys, do always check the scripts before committing V_V'
-04/12
- * Added up the locations but temporal names of Poring track npcs. Will be worked
- on over time. [erKURITA]
- * Fitted the many lines into 1 or 2, and corrected some typos on most of
- the npc\guides. Visual update to the guards, for short. [erKURITA]
- * Fixed a typo in quests/juperos.txt [Playtester]
- * Fixed Bio Lab spawns to official jRO [Playtester]
- - Also included custom spawns for Bio Labs
- (Floor 1 can't be accessed directly so it should be harder)
- * Added some Kiel building warps thanks to Celestria [Playtester]
- * Implemented the Juperos quest partially. [MasterOfMuppets]
- - Also fixed the spawns there and in biolabs a bit.
- * Fixed a few warps warping you back (they've been there for long =X). [erKURITA]
- * Corrected some errors in cities/hugel.txt and guides/guides_hu.txt
- [Foruken]
-04/11
- * Updated mapflags (missing hugel, job quest map, etc)
- * Changed item description in Sage Skills Quest (Blank Script -> Empty
- Script) thanks to MeL [Foruken]
- * Updated a couple shops of Hugel, plus added the firecracker shop on Hugel. [erKURITA]
- * Added Gunslinger quest npc and shops on que_ng.gat. Same map for Ninja's
- job quest. [erKURITA]
- * Added warps for que_ng.gat. [erKURITA]
- * Also added temporal locations for the npcs inside. [erKURITA]
- * Fixed an back warp on hu_in01,15,70 (walk to the warp, then warps you back) [erKURITA]
- * Moved and finished Hugel's guard (who happens to be a granny) [erKURITa]
- ~ All info given by RockmanEXE :P
-04/10
- * Updated refiner, thx2 Coltaro [Lupus]
-04/08
- * Fixed lighthalzen mobster a bit? [Vicious]
- * Fixed job changer? [Vicious]
-04/04
- * Re-fixed looping warps of Lutie village, thanks to Dr.Evil [Lupus]
- * Added missing Warpra Agent to Hugel. Thanks to Justin84
- * Fixed typo in Falcon Renter. Thanks to Larry
-04/03
- * Fixed Treasure Chest bug (They used to disappear on each reboot) [Lupus]
- - Updated Novices Castles Warper restrictions: TK,High Classes over 89 lvl;
- Added more buffs restrictions
-04/02
- * Added missing kafra in Lighthalzen, thanks to Muad_Dib [Vicious]
- * Fixed baby job change, thanks to Larry [Vicious]
- * Moved the spawn update to eamobs (of course the custom spawns where not changed... much :P) [Poki#3]
- * Fixed sage script? [Vicious]
- * Fixed more of wrong female thief bug spawn [Vicious]
- * Umbala Bungee Jump - Warps you to Niff with 1HP no watter what [Lance]
-03/30
- * Fixed refiner full price display, thanks to S4Sly [Vicious]
- * Training ground giving 5 kafra storage/teleport pass [Vicious]
- * Revised all the spawns based on Emperium.org. [Poki#3]
- - Only omobs got changed. eamobs is like it was.
- - I unified the formatting used for the map names. Please use that in future field expansions.
-03/27
- * Fixed the infinite warp looping between Lutie and Lutie field 01 [Skotlex]
-03/23
- * Updated Rebirth NPC/functions to use constant. Might have broken it, so do report [Vicious]
-03/21
- * Improved payment healer. [Lance]
-03/20
- * Added temp Job quests of Ninja and Gunslinger, thx2 Gywall [Lupus]
- * Fixed endless warping loops, thanks to Manipulator [Lupus]
- * Fixed possible Castle Economy investment overflow with Emsolute Develop learnt [Lupus]
- * Removed Berserk Potions from all shops, but Comodo [Lupus]
-03/19
- * Fixed Female Thief Bug in novice land. [Vicious]
-03/17
- * Added attachnpctimer to the Juperos elevator script. [Skotlex]
-03/13
- * Updated the jobmaster custom script to properly use Job_* constants
- rather than hardcoded numbers. Thanks to Pxxx for doing the update.
- [Skotlex]
-03/12
- * Amatsu Field. Replaced Hydras with official G_HYDRA (w/o drops) [Lupus]
-03/11
- * Updates of eAAC scripts [MasterOfMuppets]
- * Added another weapon dealer to Einbroch, thanks to Muad_Dib [MasterOfMuppets]
- * Updated, fixed Custom Thanatos Statues Quest, thx2Justin84 for help [Lupus]
-03/10
- * Fixed Turtle Island quest, got rid of 2 useless variables [Lupus]
- * Added 3 Weapon shops, thanks to Muad_Dib. Still need SPRITES ID [Lupus]
- ^^^^^ could we just add spr ID's into CONST.txt?
-03/07
- * Fixed some reference to old locations of the Blacksmith NPC's, Thanks to Neouni. [Poki#3]
-03/06
- * Fixed Thanatos warps: tha_t06,tha_t06a,tha_t06b,tha_t05a thanks to Justin84 [Lupus]
- - Added Temp Thanatos Keys solution (more close to official than that Thanatos Statues Quest)
-03/05
- * Used "Laboratory Passport" everywhere in the cube room quest, else how can ppl guess the name? xD [DracoRPG]
-03/02
- * Added Skotlex's updated marriage script [Vicious]
- * Added eACC scripts, thanks to davidchak [Vicious]
-02/27
- * Fixed a flag direction in front of Yesnelph, thanks to Playtester [DracoRPG]
- * Fixed wrong Female Thief Bug spawns in Culvert, thanks to happylight [DracoRPG]
- * Fixed a typo in Assassin job change test, thanks to Spiritual_Kid [DracoRPG]
-02/26
- * Splitted 2nd job skills quests into several files and fixed grammar [DracoRPG]
- * Rewrote the repairmen function and removed the Steel cost [DracoRPG]
-02/23
- * Fixed item name in Cube Room Quest. [Poki#3]
- * Changed Light Dun Spawn numbers a bit (Gemini is a Mini-boss) [Poki#3]
- * Changed "Virus" to "Anopheles" [Poki#3]
-02/21
- * Fixed wrong indication of Repairsman, thanks to NeoSaro [Lupus]
-02/17
- * Added Kafra Storage Password (some official severs use it as an additional protection) [Lupus]
- - Read functions_kafras.txt comments if you want to disable this feature
-02/16
- * Fixed Jawai bug and a typo, thanks to theultramage [Lupus]
-02/14
- * Added a new Fruit Merchant in Hugel. [Poki#3]
- * New, updated st.Valentine Event with a nice quest and EXP bonuses ^_- [Lupus]
-02/13
- * Updated the eA custom spawn sets from Playtester: Juperos lv1, Glast heim
- Sewers/Underground and Geffen dungeon lv3. [Skotlex]
-02/09
- * Fixed another issue of Cube Room Quest [Lupus]
- - Fixed event_6_new_hats.txt wrong ID, thanks to phabyo
-02/07
- * Added missing semicolons in the valentine's day event and disabled the Dog's year event. [Zephiris]
- * Added a custom quest for Jewel Case for 99 Base Level Players of 2nd Class [Lupus]
- * Fixed the spawns that where using the no exp/drop version of Male Thief Bug (Thanks to irmin) [Poki#3]
-02/05
- * Lighthalzen cube quest: Fixed password bug, fixed endless item exploit, some typos [Lupus]
- * Added yuno_in02 into noteleport/nomemo, etc map flags. It spoils the quest [Lupus]
- There's 1 missing mapflag: 'noreturn' (you may use butterfly wings to escape)
-02/03
- * Implemented the cube room quest [MasterOfMuppets]
- * Temp measure to stop exploit in novice ground. [Vicious]
-01/31
- * Fixed another bug in the monk quest. [Zephiris]
-01/29
- * Updated the Juperos dungeon spawns according to ROmap. [MasterOfMuppets]
-01/28
- * Fixed Warp to Abbys Lake. [Poki#3]
- * Removed dup warps around Einbroch. [Poki#3]
- * Fixed ein_fild04 -> ein_fild05 warp. THanks to Playtester [Poki#3]
- * Re-wrote the Dye NCP (original, not the custom one) [Poki#3]
- - I hope there aren't any bugs in it. The Jobs are sorted based on the file names
- that the client reads.
- * Fixed the Warper [Poki#3]
- * Fixed Hugel warps (htere weren't any TABs) [Lupus]
- * Added Event: Eastern New Year 2006 The Year Of The Fire Dog (28-29 January 2006) [Lupus]
-01/27
- * Added birkiczd's Odin temple warps. Move the Saylor from hugel.txt there. [Poki#3]
- * Rewrote Comodo Guides to use functions. Thanks to Daegaladh for pointing it out [Poki#3]
- * Fixed Einbroch a bit... I think the Factory Quest should be moved from [Poki#3]
- Einbroch.txt to quests_einbroch.txt...
- * Added monster spawns for Kiel dungeon, they're commented out for now though. [MasterOfMuppets]
- * Added a new global function "F_ItemName" to print expanded item name [Lupus]
- such as '+9 VVS Wind Knife'
- - You can use "F_RandMes" to pick a random number form list:
- set @RandomItemIDfromList, callfunc("F_RandMes",4,1129,1222,1163,1357);
-01/26
- * Uploaded Er_Maqui's fixes to Hugel Warps. [Poki#3]
- * Updated the airship to take the route Hugel->Einbroch->Lighthalzen->Yuno [MasterOfMuppets]
- I also fixed the colors in the broadcasts a bit.
- * Fixed Bio Lab Spawns a bit and made them more moby. [Poki#3]
- * 1.2 fixed hugel10 warp [Lupus]
- * A small fix to the louyang shouting quest [MasterOfMuppets]
- * Some Hugel warps fixes by Dr.Evil [Poki#3]
- * Fixed cord of the Sailor in Hugel, thanks to Er_Maqui for pointing it out. [Poki#3]
- * Applyed Blackthunder's fixes to rpsroulette.txt [Poki#3]
- * Rewrote the Warpa. Still have to do the Level select thingy. [Poki#3]
- * Fixed Juno > Yuno in Airship. [Poki#3]
- * Fixed Shwaltzvalt > Schwarzwald in Kafras. [Poki#3]
- * Changed sprite of the Einbech Kafra. [Poki#3]
- * Disabled the "Entrance" to lhz_dun01. This should be only an Exit. This warp doesn't exist on kRO. [Poki#3]
- * Added Lighthalzen Refiners (Custom names again ^^;) Official location and sprite. [Poki#3]
- * Fixed some shops based on kRO shots. Lighthalzen NPC's, Prontera Food Seller, Payon shops. [Poki#3]
- * Added some Hugel NPC's. Cords and Sprites are 100% Correct, but the names are not. [Poki#3]
- Plus no one knows what the NPCs are talking right now :/
- * Added Hugel Shops. [Poki#3]
- * Removed the Custom Warper to Odin. Hugel has a more official one. [Poki#3]
-01/24
- * Fixed Yuno Field 10. Mob amount sugested by Playtester, made by Poki#3 [Komurka]
- - Moved some NPCs to Einbroch and Hugel - more info can be found here http://eathena.ws/board/index.php?showtopic=67631,
- made by Poki#3
-01/23
- * Minor Valkirie fixes, thanks to Xeronage [Lupus]
- - Updated Novices Guild Castles Warper NPC
-01/21
- * Added missing close to Einbroch script [Komurka]
- * More of episode X.4 replacement, done by Poki#3 [Komurka]
- * Added a missing warp from Jawaii Tawern to Jawaii thanks to Misao [Komurka]
-
-01/20
- * Dr Evil's Yuno -> Yuno Field 05 warps update [Lupus]
- * Fixed minor typo in alde guide. [Kayla]
-01/18
- * Episode X.4 replacement, done by Poki#3 [Vicious]
- * Part 1 of Hugel monster replacement, done by Poki#3 [Vicious]
- * Added a temp warper to Odin's Temple by birkiczd [Lupus]
- - fixed Payon <- Payon Field 08 warp coords
-01/16
- * Corrected warp 'lhz013a' in Lighthalzen. Added a missing check and fixed a LOT of Engrish in the Monk Job Quest. [Zephiris]
- * Corrected the warp to board the airship in Einbroch, and the warp inside the northwest building in Lighthalzen. [Zephiris]
- * Updated Ayothaya Quest close to the official. Thanks to birkiczd
- - Also optimized it again, remove unused global variable [Lupus]
-01/12
- * Small fix in SL and SG quest [Komurka]
-01/11
- * Fixed typos of Crusader JQ, added TK/SG/SL to custom/jobmaster thanks to Haplo [Lupus]
- * Updated Valhalla a bit. Soon adding more elegant way of saving Quest Skills (including the new quest skills) [Lupus]
-01/09
- * Fixed scripts that were reported in the forum. [Vicious]
-01/08
- * Changed the name of Chung E to Green Maiden in the spawn files [MasterOfMuppets]
- * Changed some Zherlthsh to Zealotus as it is in iRO [MasterOfMuppets]
- * Added exp bonus to the factory quest in Einbroch, thanks to a [MasterOfMuppets]
- Korean fansite
-01/07
- * Updated warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
- * Disabled X-Mas Ring quest [Vicious]
-01/05
- * Disabled X-Mas event [Vicious]
- * Corrected the coordinates for the NPC "Neris" in yuno_in03 [Zephiris]
- * Multiple tiny fixes that were going ignored on the forums... [Skotlex]
-01/02
- * Removed a duplicate warp in warp/cities/payon.txt [MasterOfMuppets]
-12/31
- * Added wand of hypnotist to the Lighthalzen weapon shop [MasterOfMuppets]
-12/30
- * Fixed missing //, found by map_index. [Vicious]
- * Added a missing label (M_0) that was causing people to freeze when viewing the city list from "Miss Yoon" [Zephiris]
-12/28
- * Karachun Event: Readded Mdef +1 and Luk +1 to Santa's Hat [Lupus]
- * Fixed juicer exploit due to typo (ipnut) o.O [Lance]
-12/27
- * Added Soul Linker / Star Gladiator temp job quests. Accordingly updated Taekwon Job NPC [Lupus]
-12/26
- * Removed duplicate job_hunter.gat mapflags, by Harbin [LuzZza]
- * Changed remaining Dokkaebi Items into Dokebi, by Harbin, reported by Haplo [LuzZza]
- * Changed Dokkaebi to Dokebi, by Harbin [Vicious]
- * Updated Culvert Recruiter to allow novices to go to Culvert
- & Al De turbo track warps by Harbin [Vicious]
- * Added missing cutin's in Priest Quest [Komurka]
-12/23
- * Small fix (Falcon Taming -> Falcon Mastery) [Komurka]
- * Desert Wolf Babe -> Baby Desert Wolf (iRO), thx to Poki#3 [Komurka]
-12/22
- * Added a Bartender NPC in morroc, thanks to Persian69 [Vicious]
-
- * Fixed X-Hairpin ingredients, thx2 Komurka [Lupus]
-12/21
- * Fixed Hugel warps, thanks to... ppl.. ^^; [Vicious]
- * Fixed Ayothaya warps, thanks to Sir_Loon [Lupus]
-12/19
- * Added Sara-chan's corrections to Hugel warps. [Valaris]
- * Added Garden City Hugel city and field maps and warps (thanks to Sara-chan ^_^) [Valaris]
- * Added a custom event/quest 'Karachun' (for magic Christmas rings) [Lupus]
-12/17
- * Fixed more Monsters Museum typos, thx 2Haplo. Also fixed some monsters names [Lupus]
-12/16
- * Updated Chef Hat quest items Feather 300->330. Thanks to Ishizu-chan [Lupus]
- * Reversed custom Wizard Hat quest due to Treasure Box drop changes [Lupus]
- * Updated exploitable custom quest for Berzebub Card [Lupus]
-12/15
- * Added kobold leader to geffen feild 12 in eamobs and omobs. [Kayla]
-12/14
- * Updated wedding costs to offical values (600k for groom, 500k for bride). Deleted
- npc/other/wedding.txt (very old). Enabled marriage.txt by default. [Kayla]
-12/13
- * Fixed a Lighthalzen warp warping you to a non-walkable tile [MasterOfMuppets]
-12/12
- * Added 4 functions to spiff up your dialogues: F_Hi, F_Bye, F_RandMes, F_SexMes [Lupus]
- - Moved jobName to Global_Functions.txt
- * Fixed Monk quest [Lupus]
- * Fixed Bard Quest, added check for exploits, added a new flower 'Izidor' [Lupus]
- thanx to VicHoX for pointing out the bug. Now RTFM ^_-
-12/11
- * Fixed some typos, thanks to Haplo [Lupus]
- * Also fixed 'Lutie quest reset' bug [Lupus]
- * Fixed Bard & Lutie quests passable during the X-Mas Event. thanks Zephiris for pointing it out [Lupus]
- * Revised again all the quests, found and fixed 2 bugs, also optimized conditions [Lupus]
-12/10
- * Added the Lighthalzen Kafras, thanks to Vicious_Pucca for information. [MasterOfMuppets]
- * Added the Homunculus shop in Aldebaran, it's commented for now until [MasterOfMuppets]
- we get homunculuses working.
- * Fixed, optimized 2nd Class Skills Quests, [Lupus]
- - removed Elemental Potion Guide from Alchemist NPC, due to new Reddozen's quest
-12/09
- * Cleaned up custom folder, lots of duplicate NPCs. [Kayla]
-12/08
- * Updated 2nd class quest skills NPCs, made by Reddozen and battousai90. [Vicious]
- * Organized Jobs folder a bit for Expended Classes. [Vicious]
- * Fixed dialouge in blood_bandana quest. Thanks Razor87 for the report. [Kayla]
-12/07
- * Added the New Novice Training grounds, beware of potentional bugs and [MasterOfMuppets]
- faulty dialogues. I kept the old script as OLDnovice.txt just incase. Thanks to Dr.Evil
- for doing most of the work.
- * A small fix to the Louyang script. [MasterOfMuppets]
-12/05
- * Fixed a typo in Aldebarran Guard "Hace a name". eAOS Bug Report [Kayla]
- * Fixed another small screw-up in the color codes of the Glastheim Bulletin Board,
- eaos Bug Report[Kayla]
- * Fixed a typo in NPC:Raust, eAOS bug report. [Kayla]
- * Fixed a typo in NPC:Gushenmu, eAOS bug report. [Kayla]
- * Added a nice custom Perchik's quest ** SIGN YOUR ITEMS ** [Lupus]
- Now your players can sign their rare headgears or weapons with their own name
-12/04
- * Fixed Sage Job Quest bug, thanks to Lorky [Lupus]
-12/02
- * Removed two duplicates of each gonryun dungeon level in nomemo.txt [MasterOfMuppets]
- * Fixed a small screw-up in the color codes of the Glastheim Bulletin Board, [MasterOfMuppets]
- thanks to Playtester.
- * Added some Christmas Orcs to event/xmas.txt, thanks to Playtester [MasterOfMuppets]
- - Christmas Goblins were added to yuno_fild09 as well.
- - Enabled the christmas event by default as it has started in kRO sakray
-12/01
- * The bio lab dungeon bosses will now only spawn one at a time, [MasterOfMuppets]
- they are randomly selected.
- * Removed some duplicate warps in Einbech [MasterOfMuppets]
- * Fixed tab on pvp_noguild, thanks to NeoSaro [Vicious]
- * Added the noteleport and nomemo mapflags to the lzh_in-maps [MasterOfMuppets]
- * Implemented k3dt's guild flag exploit fix [Vicious]
-11/30
- * Updated Hugel field spawns, thanks to battousai [MasterOfMuppets]
- * Made all (Desert Wolf Puppy / Desert Wolf Puppy) -> Desert Wolf Babe [Lupus]
- the same thing is for Savage Babe. Also fixed eggs names
- * Fixed typo in nopenalty. Umatsu? XD [Vicious]
- * Fixed a minor screw-up in airships.txt [MasterOfMuppets]
- * A small fix to the Divorce NPC in other/wedding.txt, it should [MasterOfMuppets]
- now allow people who didn't marry with the other/wedding.txt to divorce as well
- * Commented the warp from gef_dun02 to gef_dun03, gef_dun03 [MasterOfMuppets]
- is an event map >.<
- * Commented "Traveler" out as it is not needed/official [Vicious]
-11/29
- * Fixed a Payon dungeon warp that was warping to a non-existant tile [MasterOfMuppets]
- * Updated the color codes of louyang.txt a little
- and fixed the shouting quest to broadcast green text. [MasterOfMuppets]
- * Fixed quest_lutie, thanks to Manipulator [Vicious]
- * Updated cooking NPC, thanks to battousai90 [Vicious]
-11/28
- * Updated the spawnpoint in Niflheim with Bungy jump [Vicious]
- * More fixes... some things can be fixed by the core. Has to make something [Lupus]
- * Massive anti-exploit fix of quests. 2B Continued [Lupus]
- * Updated Umbala. Fixed Umb.Lang.Quest items names. [Lupus]
- Now you can go to Niflheim trough Jumping Bungy Area.
-11/27
- * Added some more npcs to Einbroch and removed some warps [MasterOfMuppets]
-11/26
- * Added eamobs containing fix for exploitable spawns. Switch is in scripts_main.
- The eaMobs is suggested for smaller servers but mobs is official. [Kayla]
- * Re-Enabled city cleaners (why was this turned off?) [Kayla]
- * Updated mobs to prevent exploitable spawning (AMs, Seals). Thanks Redflame. [Kayla]
- * Updated detective hat to ask for the correct items [Kayla]
- * Fixed 2 bugs in New Hats_6. It deleted 100 Amultets instead of 10 and only 1 Steel instead of 25 [Lupus]
- thanks 2Yun for Amulets bug.. so I found the similiar one with steel 8) We have to recheck all scripts 8)))
- * Fixed some mapname typos in mob spawn scripts (mostly Prontera and Geffen fields) [Lupus]
- * Spiffed up 6_new_hats custom quest NPCs coords [Lupus]
- * Added new cities into warper & warper2 [Lupus]
- * Removed some buggy custom quests. Those items has appeared in recent official quests [Lupus]
- e.g. Excalibur, some hats, etc
-11/25
- * Added a temp shop in Yuno to sell blank scrolls, thanks to reddozen [MasterOfMuppets]
- * Added the Einbech Kafra [MasterOfMuppets]
- * Added Thanatos entrance warp. Thanks to Justin84 [Lupus]
-11/23
- * Fixed santa goblin spawn locations in event/xmas.txt [Kayla]
- * Temp fix for Kafra functions. New eA script engine has new CLOSE2 command [Lupus]
- so some old scripts were... 'stuckable' 8)
- * Updated Thanatos & Turbo Trach warps, thanks to Justin84 [Lupus]
-11/22
- * Kafra fixed: Now Baby Merchant can pass Merch Job Quest w/o probs [Lupus]
-11/20
- * Fixed a major problem in event/xmas.txt [MasterOfMuppets]
- * Readded Lord of Death to Niflheim [MasterOfMuppets]
- * Fixed a typo in cities/ayothaya.txt, nothing big [MasterOfMuppets]
- * Changed the Einbroch area spawns a bit using iRO info from emperium.org [MasterOfMuppets]
-11/18
- * Added the last of the bulletin boards [MasterOfMuppets]
- * Alberta, fixed bugs [Lupus]
- * Typos and minor fixes of Assassin JQ and Clothes_dyer. thanks to momotaro_master & WhiteLight for info [Lupus]
- * Added missing dialogues into Cooking Quest. Fixed a bug when you stuck if u haven't bought [Lupus]
- cooking sets before getting the quest, some optimizations, etc. Now fully workign 8)
-11/17
- * Fixed custom MVP arena warper. R4000! [Kayla]
- * Added more Food Sellers (for Cooking Quest). Some of them have temp sprites and coords [Lupus]
-11/16
- * Fixed the payon guide to give the right description at label L_Dungeon [MasterOfMuppets]
- thanks to muad_dib
- * A minor fix to a screwup in the lvl 4 weapon quest, thanks to vicious_pucca [MasterOfMuppets]
- * Fixed the lvl 4 S grade weapon quest only giving 8 kinds of weapons instead [MasterOfMuppets]
- of 16, thanks to Gepard for pointing it out.
- * Minor fix of SN Kafra rent service. It firstly checks for Push Cart skill and
- then gets money [Lupus]
- * Fixed more bugs (wrong ID, wrong labels, missing text) in Cooking quest. [Lupus]
- Now you can pass loaned books to other people but have to return them to
- the Chef, before loaning another one. Added Leather Pouch into item_trade.txt
- it's a quest item, you can't sell/pass it to the others. It should be done
- with similiar quest items, too.
-11/15
- * Updated Cooking Quest, according to Reddozen's changes [Lupus]
- * Added missing cities into noBranch / noIcewall mapflags files [Lupus]
- * Prontera Maze mob spawn typo fixed, thanks to noobs [Lupus]
- * Cooking quest: Fixed wrong label [Lupus]
-11/14
- * Added 1 Kafra to Payon, fixed Save menu & coords. Thanks to Justin84 [Lupus]
- * Fixed Mixture Quest [Lupus]
- * Fixed the Universal Renter not correctly checking for Riding chars. Now
- also rents Carts to S. Novices [Skotlex]
- * Fixed some cooking quest bugs [Lupus]
- * Updated Lighthalzen Dungeon warps. thanks to Justin84 [Lupus]
-11/10
- * Updated swordsman_skills.txt to allow any swordsman subclass to be able to get the [MasterOfMuppets]
- skills as well, thanks to vicious_pucca.
- * Fixed npc sprites for the cooking quest npcs, thanks to Silent for the sprite IDs [MasterOfMuppets]
- * Added Cooking Quest. Thanks to Reddozen [Lupus]
- * Added reddozen's fix of Alchemist.txt (Materials / Manuals) [Lupus]
- * Fixed Juperos Elevator, coords of Twin Tower NPC, Mr.Smile. Thanks to Justin84 [Lupus]
- * Added more quests for 2nd Class Quest Skills [Lupus]
-11/09
- * Added an incomplete sign quest for backup/storing purposes, use it at your own risk! [MasterOfMuppets]
- * Remove a few message boards from msgboard.txt to not conflict with some [MasterOfMuppets]
- sign quest npcs.
- * Added two warps in prontera for preparing the sign quest [MasterOfMuppets]
- * Added temp skill quests for all complete 2nd Class Quest Skills [Lupus]
-11/08
- * A lot of typos fixed in the lvl 4 weapon quest, thanks to Silent. [MasterOfMuppets]
-11/07
- * Added the lvl 4 weapon quest, thanks a lot to Vicious_pucca for converting it from [MasterOfMuppets]
- aegis format to eA format. a lot of thanks to reddozen as well for fixing bugs.
- - Also two quest related NPCs was added to Geffen and Morroc
- * Fixed a misleading typo in quest/monstertamers.txt, thanks to vicious_pucca [MasterOfMuppets]
- for pointing it out.
- * Updated the spawns of Santa Porings and Antonios in event/xmas.txt [MasterOfMuppets]
-11/06
- * Big update to town guards. Changed according to how it is on iRO [MasterOfMuppets]
- thanks to Muad_Dib. The following towns had their guards updated:
- - Alberta
- - Aldebaran
- - Comodo
- - Izlude
- - Payon
- - Prontera
- * Added Yuno and Lighthalzen Airports. Thanks to Justin84 [Lupus]
-11/05
- * Fixed a small bug in the jawaii warper, thanks to reddozen and Silent [MasterOfMuppets]
- * Fixed a small typo in Alberta's weapon shop, thanks to reddozen for the fix [MasterOfMuppets]
- * Added warps to the Izlude Airship, thanks to Justin84 [Lupus]
- * Fixed both warper&warper2 Izlede location was ovelapped with BB, thanks to Justin84
- - fixed wrong header of moc_fild19 BB, thanks to Justin84
-11/04
- * Updated Geffenia's monster spawns [MasterOfMuppets]
- * Fixed flags in geffen town (whoops I worked too fast :-x) [Kayla]
- * Removed Surrender Abbility in guild manager (was 100% custom) [Kayla]
-11/02
- * Removed flags around fountain in the top of Prontera guild map [Kayla]
- * Added a missing warp in Jawaii, thanks to Zoc [MasterOfMuppets]
-10/31
- * Finished the Einbech town script, thanks to muad_dib [MasterOfMuppets]
- * Added the official Jawaii script, information from iRO [MasterOfMuppets]
- - Beware of potentional bugs
- - Added the divorcer as well
- * Updated Jawaii's warps [MasterOfMuppets]
- * Added Venom Knives into da shops [Lupus]
-10/30
- * Added Wild roses to spawn in a few more towns [MasterOfMuppets]
- * Added monsters spawns to Jawaii [MasterOfMuppets]
-10/29
- * A small fix to the obb quest, thanks to marquis007 [MasterOfMuppets]
- * Fixed the flag guild script. Now one can only flag in using the flags outside the castle. [Kayla]
-10/28
- * Fixed Sage Job Quest [Lupus]
- - Its questions should be revised, especially about other NPC names
- * Added new Prontera Kafra's coords into mini-map location info [Lupus]
- * Updated North Prontera Kafra, thanks to Vicious_Pucca [Lupus]
- * Fixed Prontera Kafras not teleporting to Alberta [Lupus]
- * Added a missing Guide to Einbrochm thx2 Justin84
- * Updated all guides, fixed common guide names for correct duplicate() [Lupus]
-10/26
- * Added some more Einbech npcs, thanks to Muad_Dib of Prometheus [MasterOfMuppets]
- * Added noteleport to Gefenia maps [MasterOfMuppets]
- * Added more Juperos Warps and Scripts by Justin84 [Lupus]
- * Re-enabled main Lighthalzen Entrance warp [Lupus]
-10/25
- * Updated Lutie Quests. Sloppy copy and paste job. Vending Machine man now knows his own items. [Kayla]
- * Updated Indian Hairband Quest. It asked for hairband, should have been Indian Filet (5010) [Kayla]
-10/24
- *Added real spawns for Thanatos and Abyss. [Nexon]
-10/23
- * Updated WoE (Guilds War) scripts to work correctly with /breakguild [Lupus]
- They should abandon occupied castles of the broken guild
-10/22
- * Added Abyss warps and a few NPC's. [Nexon]
- * Added lighthalzen security guard/ security event quest. [Nexon]
-10/19
- * Thanks to Justin84:
- - Updated Thanatos Tower warps, added NOTELEPORT to some thanatos tower levels
- - Fixed custom WoE Setter (break; -> end;)
- * Updated some Airport warps as provided by Justin84 [Skotlex]
- * Updated and fixed Sage Job Quest [Lupus]
- * Fine-tuned the warp in Thanatos lv11 (tha_t11.gat,92,32 ->
- tha_t11.gat,93,36) as pointed out by erKURITA. [Skotlex]
-10/17
- * Increased mob count in Lighthalzen Lv3 as requested by Vicious. [Skotlex]
- * Added the noteleport mapflag to Amatsu Dungeon lvl 1, thanks to frugal [MasterOfMuppets]
- *Fixed a lot of scripts that may have been exploitable, fixed typos, and optimized a bunch of other scripts. Thanks to Silent. [Nexon]
-10/16
- * Fixed Einbroch Airport, Lighhalzen Dungeon warp. Thanks to Justin84 [Lupus]
- * Fixed Thanatos Tower Statues quest bug, thanx 2 Dr.Evil for info [Lupus]
- * Enabled lighthalzen guards quest, updated lighthalzen warps, thx2Justin84 [Lupus]
-10/15
- * Added in lighthalzen guards quest. Not implemented until the entire quest has been finished. [Nexon]
-10/14
- * Increased mob count in lhz dun 03 as pointed out by Viccious Pucca. [Skotlex]
- * Changed some item names to the iRO ones in a quest dialog, thanks to Komurka. [MasterOfMuppets]
-10/13
- * Updated Thanatos Tower warps, added custom Thanatos Tower Statues quest by Bibilol & Moryagorn [Lupus]
- * Moved a few misplaced npcs from Einbech to Einbroch [MasterOfMuppets]
- * Added Bacsojin and Chung E to Louyang dungeon, thanks to Tron and Dr. Evil [MasterOfMuppets]
-10/12
- * Added Muad-dib's Einbroch Airport, converted by Dr.Evil [Lupus]
- * Added secret Lighthalzen dungeon entrance point. Provided by Justin84 [Lupus]
- - It's commented out yet. Could someone investigate it?
-10/11
- * Fixed Zealotus Mask NPC (->Piece of Black Quartz) thanx to vicious_pucca for info [Lupus]
- * Added some Einbech NPCs [reddozen]
- * Added some Einbroch NPCs [MasterOfMuppets]
- - fixed alchemist.txt (Bowl issue)
- * Added 2 Kafras to Einbroch (thanx to MasterOfMuppets 4info), fixed NPC coords of Guide [Lupus]
- * Fixed Lighthalzen Dungeon Entrance conditions check, thanx to Daegaladh [Lupus]
-10/10
- * Updated Geffenia spawns, thanks to Master of Muppets [Skotlex]
- * Yet again fixed some missing tabs in Enbech, Enbech/Einbroch Guides [Luups]
- * Fixed missing tabs in Enbech Town. [Mass Zero]
- * Added Einbech Guides, thanks to Muad_Dib and MasterOfMuppets. [Mass Zero]
- * Added Einbroch Guides, thanks to Reddozen and MasterOfMuppets. [Mass Zero]
- * Added Einbech warps, thanks to Muad_Dib. [Mass Zero]
- * Added Einbech Town, thanks to Muad_Dib and MasterOfMuppets. [Mass Zero]
- * Changed 'ends' into 'breaks' in the Wandering Poet NPC, thanks to IVBela. [Mass Zero]
-10/08
- * Fixed Ayothaya town script, thanks to Poki#3 [Lupus]
- * Total warps update of Hidden Temple (Forest Labyrinth), thanks to jA and Dr.Evil for info [Lupus]
- * Updated Payon and Morroc (Jellopy->Scell) shops, thanks to Muad-Dib and andz [Lupus]
- * Added Lighthalzen,Einbroch,Einbech shops. Updated Prontera,Morroc,Payon shops [Lupus]
- - Thanks to Muad-dib, Nexon, andz, MasterOfMuppets
- * Due to added Magic Scrolls drops... finally removed the temp shop [Lupus]
-10/07
- * Added more shops. Thanks to Vicious_Pucca. [Nexon]
- * Added more Einbroch shop NPC's. Thanks to MasterOfMuppets and Vicious_Pucca. [Nexon]
- * Fixed Niffelheim warps. Thanks to MasterOfMuppets. [Nexon]
- * Added Lighthalzen shops. Thanks to Maud_Dib. [Nexon]
- * Returned back Mr.Smile quest (it's still up in kRO) [Lupus]
- * Updated official Bard Job Quest: Flowers Part now is quite easy to pass trough [Lupus]
- (thanks to Vicious Pucca for info)
- * Thanks to MasterOfMuppats for some Kafra changes: [Lupus]
- - Updated teleport destinations of Aldebaran,Comodo, Izlude and Morroc Kafras
- * More Bulletin Boards [MasterOfMuppets]
- * Added Einbech and Einbroch Item NPC's. [Nexon]
- * Updated all scripts to work with the script engine update (changed break
- to end, changed some If to if) [Skotlex]
- * Added official (iRO) Old Blue Box quest to Comodo. Thanks to Celestia (it's another girl, not Celest) for help. [Lupus]
-10/06
- * Thanks to Justin84: [Lupus]
- - Fixed ingridients typo in Acolyte Skill Quest
- - Fixed Arena MVP (custom script), Lighthalzen warps coords
-10/04
- * Fixed explot in bunnyband quest on giving and taking items away being seperated. [Nexon]
- * Fixed a missing close; in the bulletin boards. [Nexon]
-10/03
- * Fixed 2 wrong Achemist test answers, thanx to zlider for info [Lupus]
- * Updated some of the Lighthalzen mobs as pointed out by Master of Muppets.
- [Skotlex]
- * Added 5092 Coif into Prontera Church Shop. Thanx 2 andz [Lupus]
- * Fixed Thanatos and Abyss Dungeon Spawns. Thanks to Azazel. [Nexon]
- * Fixed 700+ spelling mistakes. I have alot of time on my hands for some reason... [Nexon]
-10/02
- * Added Gotanblue#2 to Turtle Island (to be able to return back) [Lupus]
- - Optimized Alberta, fixed typos
- * Aldebaran, fixed missing label. Optimized [Lupus]
- * Fixed some Headgears coords, sprites, names, ingridients. [Lupus]
- Thanks to Vicious_Pucca for info
-10/01
- * Fixed spwan mobs names Kobold N -> Kobold, Goblin - >Goblin [Lupus]
- * Added missing close; in blacksmith JQm thanx2palasx [Lupus]
- * Updated Crusader job quest a bit, thanks to vicious_pucca for reminding us this quest
- is only a temp one... [DracoRPG]
-09/29
- * Added missing Niflheim warps to the INN and house needed to complete the
- Piano Key Quest. [Skotlex]
- * Added temp warps of Thanatos Tower by Moryagorn [Lupus]
-09/28
- * Fixed Super Novice quest. Now BABY can be a SUPER BABY. Finally 8) [Lupus]
- * Updated some warps (Payon / Guilds) thanks to Yor
- * Fixed Blacksmith Job Quest items typos, thanks to Yor
-09/26
- * Added official Ayothaya Town script by MasterOfMuppets [Lupus]
- - Fixed Ayothaya warp scripts
- - Updated BBS
-09/23
- * Al De Baran: Finally added the Kafras Special Reserve 2 Lotto with official prizes [Lupus]
- (80% official, 4-5 entries are made up) also changed typo Orange Potions -> Red Potions
-09/21
- * Commented out Mr.Smile Quest (now Tengu drops that mask) [Lupus]
- * Fixed Bunny Band NPC location, removed NPC dupes [Lupus]
-09/20
- * Removed Choco from Ayo_fild1, Fixed Petits IDs at Hugel field [Lupus]
- thanks to MasterOfMuppets, Vicious_Puca, akusarujin
-09/19
- * Minor fix of Louyang by MasterOfMuppets [Lupus]
- * Added official Ayothaya shops by MasterOfMuppets
- * Added 1 Choco to Ayothaya field, thx to vicious_pucca
- * Official Ayothaya sailor warper by MasterOfMuppets
- * New number of Treasure Boxes per castle: 20 -> 25 at 100 Economic pts [Lupus]
- So you get your first chest only when your Economic Pts >= 4
-09/18
- * Fixed Guilds Kafras charging player for their Kafra Storage usage [Lupus]
-09/17
- * Changed Yuno guide soldiers to use Schwartzhald Republic ones [DracoRPG]
- * Removed useless 1.3MB 'old' folder in guild scripts [DracoRPG]
- * Fixed Amatsu Kafra Storage Issue, thanks to zlider for pointing out [Lupus]
- * Updated teleport service prices in the Prontera & Alberta. Thanks to MasterOfMuppets for info [Lupus]
- - Also Merchant Job Quest Kafra's warp price has been updated.
-09/16
- * Updated some monsters stats (Lighthalzen, Einbroch) thanx to MasterOfMuppets [Lupus]
- - Also updated bulletin_boards.txt
- * Added temp mobs spawn of Thanatos Tower/Abyss Lake dungeons thanx to Azazel
- - Based on limited info. All the new mobs come with poring stats ^_-
-09/15
- * Added new maps, temp warps for Abyss Lake Dungeon (thanks to Muad-Dib) [Lupus]
- - I recommend closing that dungeon and new monsters yet,
- they have temp stats and could cause some exploits in the future
-09/14
- * Updated Yuno fields mobs spawn, thanks to MasterOfMuppets [Lupus]
- - Updated Lighthalzen and Einbroch fields, too
- * Made some parts of Bards Quest more official ^_-. WIP: Adding Bard's NPC pics (like Kafras) [Lupus]
-09/13
- * Added correct Ayothaya, Louyang & amatsu Kafras. Thanks to Muad-Dib for info [Lupus]
- * Fixed 'Gaurdian' typo, Added real coords and sprite to amatsu Kafra [Lupus]
- * Added new scripts. Thanks Muad-Dib for his scripts, Dr.Evil for their conversion : [Lupus]
- - White Day, Temp Geffenia Event, Valentines day, Zondaman Warper
- - Quivers Maker NPC
-09/12
- * Minor fix of Bard quest, added GM Reset menu to Adoption. Fixed Guides [Lupus]
- * Added Juperos warps (thanks to Muad-Dib, Dr.Evil) [Lupus]
- * Lutie town bugfix (fixed some items exploit, found due to Bard Quest optimization 8) [Lupus]
- * Added an official Bards Job Quest. [Lupus]
- - Basical conversion from Muad-Dib's Prometeus format by Dr.Evil
- - Implementation of 4 official Bards weapon prizes by Dr.Evil
- - Final optimization and bug fix by Lupus
- NOTE: Don't forget to update your old Lutie.txt and Global_Functions.txt
- * Added temp Amatsu Kafra (wrong sprite, wrong coords yet) [Lupus]
-09/11
- * Added temp Ayothaya Kafra (wrong sprite, wrong coords yet) [Lupus]
- - Made all dungeons Kafras not saving your coords again (re-checked sources)
- * Added official Bulletin Boards script by MasterOfMuppets
- * Resticted entrance of 3F Lighthalzen dungeonby Azazel [Lupus]
- * Added Belts to Prontera/Aldebaran shops, thanks to reddozen [Lupus]
- * Optimized Louyang city NPCs. Made Louyang quests vars unique [Lupus]
-09/10
- * Fixed some Kafras not allowing you to save your Position [Lupus]
- * Updated missing Louyang warps. [Lupus]
- - Replaced custom Louyang with official one. Thanks to MasterOfMuppets
- - Added Louyang official Kafra (only Storage, Save) [Lupus]
- * Added official Hair Styler [Lupus]
- - Thanks to Muad Dib for the script. Thanks to Dr.Evil for a nice conversion.
- TODO: optimize Louyang and Hair Styler scripts 8)) [Lupus]
- * Removed Ice-Cream dealer from Morocc (according to patch) [Lupus]
-09/07
- * Fixed Super Novice job quest. Now a Baby can become a Super Baby. [Lupus]
-09/06
- * Removed massdriller's "illuminaRO" part from the Merchant jobquest script. What was that good for? [Mass Zero]
-09/04
- * Optimized Prontera city script. Now Novices > 20 BaseJob Level can go in the Culvert [Lupus]
- * Fixed minor coords issues of 19/20 warps of Monks Job Quest, Lutie Tool Shop, warps in PVP area, 1 Izlude warp. Thanks to Yor
- * Minor fix of Bear Hat Quest: changed ingredients (Zipper>Bear Skin) [Lupus]
- * Minor fix of Acolyte Job Quest message. Thanx to andz for pointing it out [Lupus]
- * Optimized ADOPTION.TXT again. Tested it with 3 clients. Fully working! [Lupus]
- * Moved Fashion Quest into the proper folder: custom/quests . Also optimized the script [Lupus]
- * Wizards Job Quest: Replcaced 2 Hodes with 2 Horongs (according to the official stuff) [Lupus]
- * Removed duplicate Lighthalzen dungeons/fields warps, thanks to our super moderator, T3H
- Manipulator! [DracoRPG]
- * Updated mob spawns with Dr. Evil ones, they should all be correct and up-to-date,
- including Lighthalzen and Juperos dungeons. If something goes wrong, then let's revert,
- but I think there won't be any problem (Frugal advised me to use them, and Frugal is a
- good spawn expert IMHO :p) [DracoRPG]
-08/31
- * Some fixes to the refine npc. [Skotlex]
- * Fixed Lighthalzen field <-> Lightalzen city warps, thanks to Poki#3 [DracoRPG]
- * Moved Tao Gunka to Comodo West Cave (made Megalithes as his slaves),
- Placed Lady Tany in the 2F of Ayothaya Dungeon [Lupus]
-08/29
- * Added Dead Branch (and Bloody Branch) quest by GM-Yevon [Lupus]
- * Fixed Adoption.txt [Lupus]
-08/28
- * Added a Taekwon NPC (to get Taekwon Job). It's temp tough [Lupus]
-08/27
- * Splitted anti-taekwon protection from double-adopt protection in adoption.txt, should
- allow to see more easily what is the problem [DracoRPG]
- * Updated Is_Taekwon_Class with Job_Star_Gladiator2 [DracoRPG]
-08/26
- * Reupdated the refine npc to not use recursive functions. [Skotlex]
- * Fixed Wool Hat quest items. Thanx to the__android [Lupus]
-08/25
- * Updated Louyang spawns according to ep 8.5 by MasterOfMuppets [Lupus]
- * Updated Lighthalzen Field 03 spawns by MasterOfMuppets [Lupus]
- * Fixed THQ Shop menu prices, thx to NeatElves [Lupus]
- * Added Hugel Mob Spawns by MasterOfMuppets [Lupus]
-08/24
- * Updated refine.txt from Freya [Lupus]
-08/23
- * Added new Hugel Field Warps by Sara [Lupus]
- * Updated mobs spawn of magmadun.txt by MasterOfMuppets
- Also updated KAHO's stats according to new kRO site info
-08/21
- * Orc Hero Helm fixed items exploit [Lupus]
-08/19
- * Fully updated Glastheim to real ep8.5 aegis spawns [MasterOfMuppets]
- * Updated refine npc to stop it from making the server crash (features = 1,
- refining past safe level) [Skotlex]
- * Updated Glastheim spawns
- * Added new items, fixed items, added new official drops [Lupus]
- * Added a temp shop of official sellable items 8) [Lupus]
-08/18
- * Added anti-Taekwon Class protection into Valhalla, into Adoption NPC [Lupus]
- * Added Zealotus Mask Quest with official items (now tested) [Lupus]
- * Fixed hat_seller.txt items. thx 2dshome [Lupus]
-08/15
- * Updated Ayathoya spawns as per the info given by Ishizu. [Skotlex]
- * Fixed one more Novice Skill exploit, otpimized variables usege a bit. [Lupus]
- thanks to Mellowz, for pointing it out
-08/09
- * Fixed position of Lothar (from IRC), and MrSmile Girl pos at Prontera, txh to dshome [Lupus]
- * Added some Acky's custom scrips (Lottery, MVM, Stock Market, Shifty Assassin, Morroc Raceway, Russian Roulette)
- * Added custom quest on a Bandit Beard (by Mega Man Expert) [Lupus]
- * Fixed logging bugs in THQ shop [Lupus]
-08/02
- * Added anti-novice protection to Ayothay OBB quest [Lupus]
- * Changed order of adding up Economy thanks to kyoki [Fredzilla]
-07/30
- * Few NPC fixes reported on in "SVN Script Fixes" [Fredzilla]
-07/25
- * Totally Updated Louyang shops. Added Driller monster spawn into UmbalaDun2. thanks to MasterOfMuppets [Lupus]
-07/23
- * Fixed value overflow (RSX MVP respawn delay) thanks to Valaris
-07/16
- * Fixed a map name typo in the Prontera fields mobs spawn file. (thanx 2Gwendalin) [Lupus]
- * Added NOLOOT, NOEXP mapflags files (thanks to Lorky,OSKOM) [Lupus]
- * Updated Louyang monsters spawn (thanks to MasterOfMuppets) [Lupus]
-07/12
- * Fixed the th**f typo everywhere. [Skotlex]
- (too many changes to bother bumping the script versions)
-07/11
- * Changed guild castle flags names according to iRO naming [DracoRPG]
- * Fixed small item check error in refine.txt thanks to -Vitamin- [massdriller]
- * Removed some warps dupes in WARPS. Rearranded Einbroch and Airplane&Airport warps [Lupus]
-07/10
- * Added Custom Auctioneer script by request of Lupus [Fredzilla]
- (Also added my WoE Setter because of all the people who cant set WoE themself)
-07/09
- * Added Novice Castles Usher NPC. [Lupus]
- Now you have access to 4 N Guild castles. They don't have
- dungeons. And 2nd Classes can't seize these Castles.
- These new castles need a new strategy. It would bring some
- fun and live to your game.
- NOTE: If your Guild Master is 2nd class, then he could
- rule the Castles and gather Treasure Boxes after WoE
- * Fixed typo on JFunc2-1.txt script [Skotlex]
- * Now adoption.txt NPC can teach parents/babies their missing family skills [Lupus]
- * Added Novice Guilds warps. Fixed some mapflags. NG WOE NPC is coming soon. [Lupus]
-07/08
- * Fixed new_hats_0625.txt, thanx to vicious_pucca [Lupus]
-07/07
- * Hunter Job Quest: Infinite Arrows exploit fix [Lupus]
- * Fixed a small burried treasure map error thanks to kyoki. [massdriller]
-07/04
- * Added Lorky's NEW HEADGEARS quests (according to the patch 2005/6/14) [Lupus]
- Please, feel free to fix, imporve, etc. (all the URLs are in the script)
-07/03
- * Added few missing mobs to Jawaii, updated Peco/Falcon Renter [Lupus]
- * Added new hairstyles to the stylist NPC. [Mass Zero]
- * Fixed Job Quests exploits (Advanced Classes were able to pass their 2nd job quests again) [Lupus]
- High Novices were able to pass Super Novice Job Quest as well. They weren't able to GET those
- professions, tough. But there were some items exploits.
- Now Advanced classes get reborn guides from all main Job Quest NPCs (1st, 2nd Classes)
-07/02
- * Replaced gmcommand with atcommand in NEWnovice NPC set.
- * Removed the Flower Band selling in Amatsu, shouldn't be sold in shops. [Mass Zero]
-06/30
- * Fixed 2 garbled Amatsu NPC names (thx 2MasterOfMuppets), slight optimization [Lupus]
- * Added Bluto's unofficial Airship NPC [massdriller]
- * Added Incomplete New Novice training grounds [massdriller]
-06/29
- * Fixed massive EXP/Loot exploits of all Job Quests (especially in the Rogue JQ) [Lupus]
- * Inserted a missing ".gat" in alberta city NPC header
- * Moved banks scripts into /banks/ [massdriller]
- * Corrected small typo in config for marraige script [massdriller]
- * Added Jawaii npcs thanks to DNett123 [massdriller]
- * Updated Sara-Chan's Lighthalzen Warps [massdriller]
- * Added Warning to config files [massdriller]
- * Reinstated in warper npc. It was missing o.O [massdriller]
-06/28
- * Fixed bug in Refine script that allows to bypass item & zeny restrictions thanks to sir_loon [massdriller]
- * Updated Lunatik's Jobchanger [massdriller]
- * Moved healers into /healers folder [massdriller]
- * Added Skotlex's marraige script [massdriller]
-06/24
- * Changed Guild Castle Manager to make Emsolute/Permanent Development affect only economy
- investment [DracoRPG]
-06/22
- * Added baby support to Dancer quest [Fredzilla]
-06/21
- * Fixed a wrong required item in Sea Otter Hat quest, thanks to frugal [DracoRPG]
-06/18
- * Updated Lightharzen warps to Sara-chan's v1.2 [Lupus]
-06/16
- * Added Sara-chan's Lightharzen warps [celest]
-06/13
- * Fixed Heart of Ymir location/sprite, thanks to Poki#3 [DracoRPG]
-06/10
- * Fixed small error in Dye_maker, was trying to del an non-existant item, instead on mixture
- Thank you Terminal Vertex
-06/05
- * Fixed another error [Lunatikbunnie]
-06/03
- * Fixed an error in the jobmaster script [DracoRPG]
-06/02
- * Corrected error in Jfunc under priests [massdriller]
-06/01
- * Added Field update - Einbroch and Lhztargen thanks to sara [massdriller]
- * Added New optimised jobchanger [Lunatikbunnie]
-05/31
- * Added my own dev npc too [massdriller]
- * Fixed incorrect checkers for Jfunc2-1 [massdriller]
- * Fixed a typo in Jfunc1-1 [massdriller]
- * Added my own devnpc =P [Kevin]
- * Optimised darkchild's MVP arena [massdriller]
-05/30
- * Scripts reorganizing [DracoRPG]
- * Changed swordsman -> swordman in the files names [DracoRPG]
- * Optimised Job Quests by placing checkers into JFunc1-1 [massdriller]
- - Acolyte, Archer, Mage, Merchant, Thief, Swordsman
- * Optimised Job Quests by placing checkers into JFunc2-1 [massdriller]
- - Assassin, Blacksmith, Hunter, Knight, Priest, Wizard
- * Optimised Job Quests by placing checkers into JFunc2-2 [massdriller]
- - Monk, Sage, Rogue
- - The rest can't be optimised as it is too integrated.
-05/29
- * Fixed a typo in an NPC [Codemaster]
- * Fixed many grammatical errors (mostly in Merchant job quest) thanks to the__android [DracoRPG]
-05/28
- * Reorganized scripts (npc/) folder. [Ancyker]
-05/25
- * Changed Ayothaya to Ayotaya. (In the scripts, iRO calls it Ayotaya.) [Mass Zero]
- * Removed lots of unneccesary spaces from the Ayotaya poetry script. [Mass Zero]
- * Fixed various gramatical errors in the Uneasy Cemetary, Valkyrie cite, Lou Yang
- city, Ayotaya city Buny Band quest and Bard jobchanger scripts. [Mass Zero]
- * Added Rebirth/Advanced class support to the Universal Renter. [Mass Zero]
-05/23
- * Fixed various gramatical errors in the Dumpling Festival, Twin Towers,
- Valentine's Day and X-mas scripts. [Mass Zero]
- * Removed useless quotation marks (") in the Acolyte jobquest. [Mass Zero]
-05/22
- * Fixed a typo in guild castles' manager, thanks to the__android [DracoRPG]
-05/17
- * Fixed Crusader Quest.(Thanks to Komurka) [massdriller]
-05/16
- * Small fix in the Dancer Job NPC and added checks for skill using,
- Improved Concentration and Arrow Shower [Fredzilla]
- * Cleanup in NPCs that are enabled by default : removed most of custom ones
- (including dev NPCs, WoE warper, Ayothaya poetry...) [DracoRPG]
- * Added an Orc Hero Helm quest, custom but as accurate as possible [DracoRPG]
-05/15
- * Added Dancer Job quest NPC [Fredzilla]
- * Fixed some Ayothaya warps, thanks to Fress_Boy [DracoRPG]
-05/14
- * Fixed some more typos in city scripts [massdriller]
-05/09
- * Added new Sara-chan's maps / warps for Einbroch and Lhztargen [Lupus]
- * Fixed some typos [massdriller] (Thanks to neko for point those out)
- * Fixed Ayothaya warps.[massdriller] [Thanks to akusarujin]
-05/07
- * Modified and added more npc location for healers [massdriller]
- * Added city cleaners as these were reported systems that exist
- in IRO & KRO [massdriller]
-05/05/05
- * Balanced THQ Shop prices, fixed one missed label [Lupus]
-05/04
- * Removed Horse Crest from the temp shop [Lupus]
- * Borrowed Easter Event fix from Freya [Lupus]
- * Fixed some script typos, thanks to zBuffer and Er Pirata
-04/29
- * Alarm Mask Quest corrected txt 2 Shadow
- * Added Penal Servitude script. Some quest for prisoners [Lupus]
- This script works with kafra_bank.txt script
- * Fixed a typo in the warpra, thanks to ShAPoNe
-04/27
- * Added Einbroch and Ayothaya, cites and dungeons, to the Warpra [Fredzilla]
- * Added the Engagement Quest into Ayothaya [Fredzilla]
- * In accordance with this quest I have also added some needed warps
-04/26
- * Some fixes of THG Quest [Lupus]
- * Corrected view for Whitesmith NPC, thanks to Disiesel
-04/25
- * Fixed typos in novice and thief job quests, thanks to zlider
-04/23
- * Fixed 2 scripts which used old job_baby constant [Lupus]
- * Removed old duplicate job change in Alchemist job quest, thanks to NeoSaro [DracoRPG]
- * Added Hatii Baby spawn [Lupus]
-04/21
- * Fixed THQ penalty again, added anti-cheat stuff [Lupus]
- * changed item_avail.txt to support THQ [Lupus]
- * Added Baby Class Support to Vallhallana. [Lupus]
- * Added a missing check. Now Baby Classes can get 1st job [Lupus]
- * Fixed few things in THQ Quest NPCs [Lupus]
-04/20
- * Converted Treasure Hunters Guild (40 New Quests + Guild Shop) [Fredzilla]
- * Added time penalty to THQ. To prevent exploits. [Lupus]
- * Fixed Super Novice Job Quest (thanks to guy from eA forums .... <-- his name will be here)
- * Removed one warp from Swordsman Assiciation (due to overlapping Job Quest Warp) [Lupus]
- * Adding more NPC's to Louyang [celest]
- * Updated Louyang city script, thanks to Dino9021
- * Fixed Crusader Job quest (again). And several typos [Lupus]
- * Fixed a typo in the custom jobchanger, thanks to manutdcom
-04/19
- * Added custom jobchanger fix by Zoc
- * Added custom Adoption script by Fredzilla [Lupus]
- * Removed annoying Kafra Storage issue [Lupus]
- * Fixed some Job Quests bugs (wrong constants, wrong variable names, etc) [Lupus]
- * Redo tons of NPC - added Baby Class support to all renters, job questsm etc [Lupus]
- * Added skillpoint check to Rogue job quest, thanks to Dino9021
-04/17
- * Changed the assassin job quest npc to do an area announce instead of global,
- thanks to NeoSaro
- * Fixed a typo in Aldebaran script, thanks to NeoSaro
-04/16
- * Added more correct Einbroch/Einbech monster spawn [Lupus]
- * Fixed 1 warp map name - ein005a thx 2Exyle [Lupus]
-04/14
- * Fixed typos in Louyang's mob spawns, thanks to Gwendalin
- * Added nomemo mapflag to valkyrie, thanks to Dino9021
- * Fixed typos in Alchemist JQ, Fixed bugs and typos in Assassin JQ [Lupus]
-04/09
- * Added Einbroch monsters spawn, fixed one mapflag for Einnech mines [Lupus]
- * valkyrie.txt Fixed: now alternative classes can use their 1-1 job NPC to become Advanced 1st Class [Lupus]
-04/08
- * Fixed some Rogue Job Quest bugs [Lupus]
-04/06
- * removed previous "fix". Please, never submit "fixes" w/o checking. [Lupus]
- that guy didn't know about a special SN Kafra from supernovice.txt file.
- * fixed payon's gemstones exchanger [Lupus]
- * Set PCLoginEvent.txt to disabled by default [celest]
-04/04
- * Changed "set @TEMP,rand(0);" to set "@TEMP,0;" in the Payon Fortune Teller script [DracoRPG]
- We'll have to get all the fortunes, but they are more than 200...
- * Finished Payon's Gemstone Exchanger, thanks to Dino9021 [DracoRPG]
- * Added Deviling in the "Poring Island" map pay_fild04, 2 hours respawn [Lupus]
-04/03
- * Finished Valkyrie. Now it correctly works. Valhallana reborns players to High Novices. [Lupus]
- (added missed kRO condition: to reborn, player shouldn't have money nor items(equipment) )
- Then Valhallana warps just reborn players to the home city of their main job.
- On Job Level 10 of High Novice they can get 1st Advanced Job from correct 1-1 job quests NPC.
- They'll get there all learnt skill quests.
- On reaching 45 Job Level they may visit Valkyrie and get 2-2-1 / 2-1-1 class (3rd Job)
- from a correct NPC.
- * Fixed SKILL POINTS exploit in Assassin Job Quest [Lupus]
-03/31
- * Payon : new NPCs scripted as far as I could and old ones updated (all from iRO) [DracoRPG]
- * Corrected a G_GRYPHON spawn in umbala field to GRYPHON, thanks to CrasherZero
-03/29
- * Corrected Amatsu warp points, thanks to Dino9021
-03/28
- * Corrected Yuno warp points, thanks to Dino9021
- * Added Yuno warps to the Aldebaran kafra NPC, thanks to Dino9021
-
-03/27
- * Fixed Ant Hell warps, thanks to Dino9021
- * Corrected positions for Thief and Archer quest skills NPCs, thanks to Dino9021
-
-03/24
- * Added support for Emsolute Develop in the guild manager script [celest]
- * Fixed the custom jobchanger allowing Super Novices to change to high novice,
- thanks to CavaCava
-03/23
- * WOE 1.3 Now you can't install Guardians during WOE [Lupus]
- * Set only Storage/Cancel to Kafra in Niflheim. [Lupus]
-03/22
- * Moved position for Marx Hansen to payon_in03, thanks to Dino9021 [celest]
-03/18
- * Reduced label name length in heal_payment.txt [celest]
- * Added Sara-chan's Einbroch/Einbech city warps [celest]
-
-03/17
- * Fixed more typos in /cities/payon.txt, thanks to TheUltimateEnd [celest]
-
-03/16
- * Fixed some typos in /cites/payon.txt, thanks to Hibiki [celest]
-
-03/15
- * Fixed some typos in shops.txt, thanks to Dino9021 [celest]
- * Fixed some bugs in the 32 new hats script, the custom jobchanger and platinum
- skills script, thanks to midas [celest]
-
-03/11
- * Reverted the Moving HP skill quest change, thanks to DracoRPG [celest]
-
-03/07
- * Fixed a typo in high mage job changing, thanks to hongmei [celest]
-
-03/03
- * Fixed Moving HP skill quest
-
-02/28
- * warps/louyang.txt: Added 2 escapes from 2 mountains 018,019 [Lupus]
- Some players used to stuck there after warps
-
-02/27
- * Fixed some bugs in Monk Job Quest. Now it's fully passable. [Lupus]
- Going to brush it up a bit later. First have to re-check Crusader+Assassin+Rogue quests ^_-
-02/26
- * Now players can reach Guilds Dungeons only trough their own captured castles. [Lupus]
- Before they coulkd enter the dungeons vie unoccupied castles. Thanks 2Ishizu-chan for fix
-02/16
- * Fixed 1 payon castle guardian spawn coords
- * Fixed Wootan and Beetle King names in the spawn files [Lupus]
- * Fixed a typo in quests/all_quest.txt, thanks to hongmei [celest]
- * Fixed treasure chests spawn in the castles. (had to simplify some code and unroll some loops) [Lupus]
-
-02/13
- * Added midas's fixes for bugs in the novice training ground and the custom
- jobchanger script [celest]
-
-10/02
- * Fixed Wizard job quest (made only one agressive mob in the last room) [Lupus]
-
-01/10
- * Fixed some typos and exploits in the Blacksmith and Hunter job quest,
- thanks to Riotblade and nonox
-01/09/05
- * Modified guild war scripts to fix a bug for duplicate guild storages. [Codemaster & Ajarn]
-8/1
- * Added the new Yuno field warps by Sara-chan [celest]
-
-2/1
- * Added missing Spore Doll to the Kaho Horns NPC (God... this was reported
- months ago)
- * The 'Lothar' NPC was asking for the wrong items, corrected thanks to Death's Mage
-01/01/05
- * Fixed some respawn delays of MVP/Miniboss monsters. Redo Umbala/Niflheim fields, added missing mobs, corrected
- monsters quantity. In Niflheim fixed wrong Lord of Death monster ID. [Lupus]
-12/30
- * Fixed typo in priest.txt. [Mass Zero]
- * Fixed some missing stuff, made monk.txt loading [Lupus]
-12/29
- * Added Dino9021's monk job quest script - still need checking before adding to
- scripts list [celest]
- * Added gvg mapflags to the guild dungeons, and removed 4 items from
- item_avail.txt, thanks Poki [celest]
- * Translated npc/sample/npc_extend_shop.txt [MC Cameri]
- * Translated npc/sample/bank_test.txt [MC Cameri]
- * Fixed respawn delay of Toad and Golden Thief Bug (it was the actual_delay/2). Mob placement files should be revised again [Lupus]
-
-12/27
- * kafra_bank.txt added an extra exploit protection [Lupus]
- * kafra_bank.txt was missing an npc label [celest]
- * Reverted gldfunc_dunsw.txt back. Some people report RC5 bugs, which have been fixed some months ago.
- Next time always CHECK and READ the code, before implementing some stupid "fixes" from the forums 8) Peace [Lupus]
- PS I'm reverting more guild files soon, to make them show the flags.
-
-12/24
- * Fixed Whitesmith.txt, was on top of another npc [Ajarn]
-
-12/23
- * Added logs into kafra_bank.txt (it keeps logs of all bank operations! Very handy to find abusers/cheaters) [Lupus]
-
-12/22
- * Added Arrow Quivers to the scrolls_arrows.txt and removed some rare arrows from the shop [Lupus]
- * Corrected a typo in other/pvp.txt [Ajarn]
-
-12/21
- * Corrected position of start { in a crap load of scripts. [Ajarn]
- - jA decided that it had to be on the definition line
- - So, if it wasn't, the next script wouldn't load
- * Corrected script errors in devnpc.txt [celest]
-
-12/20
- * Addded npcs_athena.conf, OA style [MC Cameri]
- * made samesex marriages give out the correct rings [MouseJstr]
- * Changed $progress -> $@progress in wedding.txt (shadowlady put in comments but didn't add to code) [Aria]
- * xmas.txt: Added Xmas Jakk, fixed 2 possible items exploits, fixed reward Box ID [Lupus]
-12/18
- * My NPC is back in action [Aria]
- * Added 2 temp kRO shops which sell Arrows, Magic Scrolls. Prices,coords, sprites are unsure, but exploitless [Lupus]
-
-12/12
- * Added Town Inn's counting in my npc/other/mc_cameri/warper.txt [MC Cameri]
-
-12/11
- * Fixed memory consumption in npc/other/mc_cameri/warper.txt [MC Cameri]
-
-12/10
- * Added npc/other/mc_cameri/warper.txt, a warp npc just like warper2.txt that shows how many people are on each map. [MC Cameri]
- * Newgearquests (14 files of 16) fixed possible exploits, added a missing close;
- According to kro, changed ingredients of Indead Hairband quest [Lupus]
-12/08
- * Changed ingredients of Ears of Demon Quest: Deviruchi Hat -> Evil Wing [Lupus]
- * Added translated shop names for the Extended Shop, I'unno who made it. o.O; [Mass Zero]
- * Changed Lord of Death spawn intervals to 90 minutes based on jRO [celest]
- * Added nomemo flags for Niflheim and some maps [celest]
- * Corrected Niflheim shops and Morroc jewel merchant - should sell Ruby
- instead of Pearl [celest]
-
-12/07
- * Added npc/other/mc_cameri/heal.txt, a heal npc that is as simple as one click healing [MC Cameri]
- * Fixed Al De Baran to Mjolnir warp in Al De Baran [MC Cameri]
- * Fixed all Newgear quests: arjen.txt,back_ribbon.txt,bear_hat.txt,burning_blood_bandana.txt,cat_hairband.txt
- fox_mask.txt,hat_seller.txt,indian_headband.txt,mask_of_alarm.txt,mushroom_hairband.txt,neris.txt
- old_blacksmith.txt,posture_fix_hat.txt,sea_otter_hat.txt,traveler.txt,tulip_hairpin.txt [Lupus]
- * Fixed missing labels, missing delitem, wrong zeny amount, wrong items id, spelling [Lupus]
- * Added Fox Mask quest. [Mass Zero]
-
-12/06 * Added seperate quests for the new headgears, missing Fox Mask and Orc Hero Helm. (I'll so 'em ASAP.) [Mass Zero]
-
-11/30 * Added Lutie shops
- * Corrected some typos, thanks to leinsirk10
-
-11/28 * Added missing Niflheim monsters [shadow]
-
-11/27 * Added some Lou Yang NPC's [Mass Zero]
- * Get Freya fixes of crusader.txt (announce->areaannounce), Mr.Smile(removed vulgar words) [Lupus]
-
-11/23 * - Fixed repairman prices (5k)(someone need to check if it requires a steel) [shadow]
-
-11/22 * - Now wedding merchant sells tuxedos for 43k, implemented a easier way to change prices of weddings.
- - Fixed wrong label calling on jobchange.txt.
- - Fixed a timer on momotaro.txt and translated tougijou.txt. Thanks to Shinomori .[shadow]
-11/20
- * Reduced walking speed for davidsiaw's Dev NPC. [MC Cameri]
- * Fixed some typos in MC Cameri's Dev NPC, walking speed, etc. [MC Cameri]
- * Fixed spawns on umbala fields, Fixed spawn point of Amon Ra in morroc pyramids B2 [shadow]
-11/21
- * niflheim.txt: some typos in some variables fixed (thx 2 Dr.Evil) [Lupus]
-
-11/19
- * cmd_fild02.gat: fixed respawn delay of one Seal [Lupus]
- * ev_agit_event.txt: Implemented Shadowlady's idea of allowing different woe start/stop times
- for different days of the week.[kobra_k88]
-11/18
- * Fixed typo in payon.txt [celest]
- * - Fixed infinite zeny exploit in novice_skills.txt(other quest skills npcs need revision!!!)
- - Fixed typos on izlude.txt, wrong label in umbala.txt [shadow]
- * Added custom WOE warper (now you can get to Novice Castles from Prontera) [Lupus]
- * Prontera.txt (Sewers) anti-novice exploit fix. should be added to any quests/banks where u once get free items/zeny [Lupus]
-11/17
- * Added poetry npc to ayothaya [MouseJstr]
- * Fixed valkyrie.txt (wrong condition check, temp var->perm vars) but it still has no exit for common players [Lupus]
- * - Fixed guardians hp not updating when investment in defense is made.
- - Moved treasure spawn times to ev_agit_event.txt.
- - Changes to headers and comments in various scripts.[kobra_k88]
-11/16
- * - grandpa_pharmacist.txt: Added subfunction for potion making as well as zeny/input
- exploit safeguards. Used Lupus's "loopless" technique.
- - juice_maker.txt: Added subfunction for juice making. Also changed amount of
- fruit needed to 1.
- - milk_trader.txt: Used Lupus's "loopless" technique. Added input exploit safegaurd.
- - clothes_dyer.txt: Disabled dye for male Assassins.
- - xmas.txt: Corrected some typos. [kobra_k88]
- * - Removed Empty Bottle from amatsu shops to prevent exploits.
- - Fixed Npc Position on Lutie( warper.txt and warper2.txt). [shadow]
-
-11/15
- * - Fixed xmas.txt X-mas event, now you get a gift box when you first talk to Santa.
- - Same script again...Fixed the spawns, its 1 antonio per map, and it was using only santa poring IDs. [shadow]
-
-11/14
- - Fixed niflheim kafra. [shadow]
- - Added the total new set of Advance Jobchangers after kRO description and screenshots. [Nana]
-
-11/13
- * - Translated and Fixed momotaro.txt event [shadow]
- * - Deleted folder other/old which was empty [MC Cameri]
- * - Fixed MC Cameri's Bank NPC for the new payon [MC Cameri]
- * - Fixed warps to Amatsu Dungeon (now u can get there via a special quest only) thanks to shadowlady [Lupus]
- - Fixed logical bug in Sleipnir Alchem. sub-quest [Lupus]
-11/11
- * - Fixed Jobchanger.txt and supernovice.txt [shadowlady]
-11/10
- * - Fixed a bug on counteragent_mixture and quest_yuno(need to revise alchemist quest) [shadow]
-
-11/08
- * - Temporary corrected an expliot in refine.txt. Need to check sources to fully fix bug [Shinigami]
- * - Fixed 2 bugs on jobchanger.txt , not being able to change to Creator and Clown,
- - Fixed a bug on mage.txt, not deleting the quest items.
- - Fixes on bongunsword.txt and fashion.txt , wrong spaces and quest items.
- - Added new Ayothana Mob listing, correct IDs, but need correct amount and respawn time. [shadow]
-11/07
- * - Fixed platinum_skill.txt, now advanced classes get quest skills.
- - Fixed a bug on novice.txt . [shadow]
- * - lutie.txt: Edited text, updated/corrected triggers for the Jack Frost quest.
- - comodo.txt, morocc.txt, doomed_swords.txt: Implemented all of the triggers for
- the Doomed Swords quest based on mRO's version. Now the quest is much longer.
- - pvp.txt: Added PvP Narrator function. Using args for Fight Square Helpers.
- - Corrected some typos in item_db. Items 1143 and 1719 need to be re-checked.[kobra_k88]
-11/05
- * Fixed and redo optional Umbalian quests:
- - Wise Man Fabius' Umbalian Language Quest (you can learn Umbalian language in
- alternative way)
- - On speaking with Umbalian Chief about meaning of masks you activate Turban Thief Quest
- (For Sphinx Mask)
- * Fixed several bugs in Niflheim Piano Keys Quest (wrong variable name, missing CLOSE buttons)
- Zeny/Item Exploit in Niflhein Sairin NPC quest (should add similiar checks in every
- easy quests with expensive prizes to avoid exploits) [Lupus]
-11/05
- * Added easter and xmas event npcs. Added custom blackjack npc.[kobra_k88]
-11/02
- * Added unofficial nguild castles. Updated stats for Stone Shooter, Wooden Golem, Hyegun,
- Civil Servant, Dancing Dragon, Baby Garm, and Increase Soil mobs in mob db. Drops are still
- missing for some of them.[kobra_k88]
-11/01
- * Set Comodo Kafra to warp to Umbala (11/2/04 patch) [Aria]
-10/31
- * Fixed Dev NPCs giving off errors... [Aria]
- * Fixed prob. with duplicating mobs in wizard.txt. Corrected some item names in sage.txt.
- Corrected mode values for hornet, wolf, baby desert wolf, and peco peco in mob db.[kobra_k88]
-10/30
- * Commented out unfinished Dev NPCs and added npc line to map_athena.conf [Aria]
-10/29
- * Added missing Lmenu label to novice.txt.[kobra_k88]
-10/27
- * Re-organized mob scripts.[kobra_k88]
- * Updated mob placements with info from emperium.org.[Lupus]
- * Fixed Aldebaran (gatekeeper conditions bugs and wrong Key ID). Fixed some typos in other cities [Lupus]
- * assassin.txt, rogue.txt: added clothes dye reset before job change since thiefs with custom dyes
- were getting errors upon job change. Updated towns.txt and nopenatly.txt mapflags.[kobra_k88]
-10/26
- * Added more quotes -_- [Aria]
- * Fixed Mouse's devnpc only saying his quotes once per server reset [Aria]
- * Fixed Umbalian Quest, fixed Amatsu, fixed Niflheim NPCs, Warper2 NPC, fixed 1 warp [Lupus]
-
-10/25
- * updated Mousejstr in devnpc [ MouseJstr]
-10/23
- * Finished Aria and MC Cameri "Dev edition" NPCs. [Aria]
- * gldfunc_ev_agit.txt: added F_AgitEnd func.
- prtg_guardians.txt: fixed typos where I used OnInit instead of OnAgitInit.
- Minor cosmetic changes to various guild script files. [kobra_k88]
-
-10/21
- * Replaced some checkcart and checkoption(x) with checkcart(0) in the guild folder [Aria]
- * Waiting for various devs to tell me their coords, map, biography, quotes,
- moving coords, etc. In the meantime, I replaced them with (x,y),(lols),
- (sprite),(somewhere), and if they didn't give me any info, I didn't
- add them yet =P. [Aria]
- * Added Davidsiaw, Shinigami, Lord, Codemaster, MouseJstr, MC Cameri, and Darkchild
- to "Dev edition" NPCs [Aria]
- * Revised "Dev edition" NPC layout a bit, should go smoother now. Should be final
- layout unless something goes wrong =O. [Aria]
- * Changed "Dev edition" NPC layout so that they move by themselves by timers. [Aria]
- * Changed "Dev edition" NPCs to walk during quotes, and added biography. [Aria]
- * Fixed quest/all_quest.txt not showing the correct description of the binoculars. [Aria]
- * Fixed quest/all_quest.txt not going to stop pass and not displaying requirements. [Aria]
- * Fixed clothes_dyer.txt: Disabled Assassing/Rogues Dye. Also fixed wrong labels [Lupus]
- * Fixed hair_dyer.txt: fixed missing menu label [Lupus]
- * new_hats.txt 1.4 fixed amount of Fish Tail (300 -> 30), Zeny bugs in Ear of Angel,
- Ear of Demon,Big Golden Bell, Mistress Crown,
- Crown of The Ancient Queen, Indian Headband, Orc Hero Helm [Lupus]
- * Fixed name of a flower in Prontera quest (Dreamy->Illusion) according to our DB [Lupus]
- * Fixed item names in the temp Crusader Job Quest according to our DB [Lupus]
-
-10/20
- * Finished basic layout, finished Aria starting to create Shinigami [Aria]
- * Started to create "Dev edition" npcs [Aria]
- * Fixed Castle aldg504-1 warp [Lupus]
- * Fixed Payon's Skirt of virgin quest [Lupus]
- * Fixed Doomed swords quest [Lupus]
- * Optimized mapflags (removed useless nobranc flag, where gvg flag is set)
-
-10/16
- * Fixed my stupid mistake with the guild switches.
- Moved shops from umbala.txt to shops.txt. Commented out the other ones.
- Updated mapflags and re-organized them again. Files in "mapflag\type" folder are the
- same as ones in "mapflag" folder, just organized differently. ONLY use 1 set.[kobra_k88]
- * Corrected Morroc warp npc overlaying Kafra npc. [Aria]
- * Corrected kafra typo. [Shinigami]
- * Corrected zeny amount subtracted for iron hammer in refine.txt[kobra_k88]
-10/15
- * Added kafra_bank NPC - a new bank with daily interst of 0.1#%. [Lupus]
-10/14
- * Kafras: Fixed some minor typos. Corrected savepoints for geffen, orc dun, comodo kafras.
- Added another argument to F_KafEnd. Added correct payon warp point.[kobra_k88]
- * Forgot some qutoes in class check function calls in Blacksmith, Assassin, Wizard, Hunter
- quests, added them.[kobra_k88]
- * Added optimized version of WoE scripts. Moved old version to "old" folder.
-10/07
- * Fixed Doctor Band items [Lupus]
-10/06
- * Removed a left over if statement that caused the Blacksmith script to hang durring
- job change.[kobra_k88]
-10/04
- * Implemented class check functions in all skills quests except novice. [kobra_k88]
- * Implemented class check functions in hunter, blacksmith, wizard, and
- assassin quests. Fixed some bugs in assassin quest. Also implemented
- new Ontouch label function and close2 command in assassin.txt.(see file for details). [kobra_k88]
- * Removed single job check functions from Global_Functions.txt and completed
- the rest of the multiple job check funtions. Also added advanced and high
- job classes to the checks.[kobra_k88]
- * Fixed some typos in inn.txt. Switched from @variables to arguments. [kobra_k88]
-
-10/03
- * Minor changes in Counteragent/Mixture Morgenstein Quest, a fix of Uneasy Cemetary [Lupus]
-
-10/02
- * Added Crusader Quest [Lupus]
-
-09/26
- * Cleared Up Npc Folder For Release [Darkchild]
-
-09/24
- * Added Sage Job Quest [Darkchild]
- * Updated a few Payon files [Darkchild]
- - Removed Double Warp
- - Placed BunnyBand Quest Npc Better
- - Updated Pvp People's Locations
- - Updated Warper/Warper2 Loc and Warp
- - Same for Wapra 2
- - Removed Msg Boards In Payon
- - Updated Heal and Heal Payment Loc
- - Commented Out a Falcon Renter which shouldnt be there
- - Updated Guide's Viewpoints
- - Bugs Were All Reported On The Forums
- * Update Heal and Heal Payment Npcs To All Be Healrings [Darkchild]
-
-09/23
- * Added a loopless option "Gimme as many as possible" into Juice Maker quest [Lupus]
-
-09/19
- * Added missing warp mjol17 [Lupus]
-
-09/17
- * Added Correct Niflheim Dialogs
-
-09/16
- * Added nude; to palace guard in payon, will disarm player [Darkchild]
-
-09/14
- * Added New Dye Npc, Has 'browse' option [Darkchild]
- * Fixed skillpoints check in Hunter Job Quest [Lupus]
-
-09/13
- * Added better save point inside city for payon [Darkchild]
- * Fixed lil bug in Drunk npc in payon [Darkchild]
-
-09/12
- * Deleted Old Non-Quest Alchemist Job Change [Darkchild]
- * Added Alchemist Job Quest [Darkchild]
- * Added Alchemist Shop [Darkchild]
- * Changed Bain Bro's To Work With Alchemist Quest [Darkchild]
- * Changed CounterAgent and Mixture Quest To Work With Alchemist Quest [Darkchild]
- * Added Inn Npcs [Darkchild]
-
-09/10
- * Added cities/payon.txt. All Npcs at correct location, only 5 npcs arent translated. [Darkchild]
- * Submitted Alchemyst Job Quest and Sage Job Quest (to help DC in his work). These quests are ports. [Lupus]
-
-09/07
- * Better New Payon, All Except cities, will do 2morrow :P [Darkchild]
- * Added Rogue job quest. [kobra_k88]
- * Added missing cutin commands to town guides. [kobra_k88]
- * Removed the delitem 2312(padded armor) in swordman_skills.txt as the
- armor is not supposed to be removed. The npc is only supposed to check
- for it and not delete it. This is how it is on official servers. [kobra_k88]
- * Removed duplicate waprs from izlude.txt, comodo.txt, morroc.txt, and jobquest.txt.
- Added complete rogue warps. Removed traingnd.txt file as those warps are
- already in jobquest.txt. Added correct tabs to first 2 warps in louyang.txt. [kobra_k88]
- * Fixed various typos in kafra files. Now using arrays for the teleport service.
- Also added guild options. [kobra_k88]
-
-09/06
- * Forgot the dun/field warps for payon, added now! [Darkchild]
- * Fixed: add a forgotten "delitem 2312,1;" in quest/skills/swordmand_skils.txt [Yor]
-
-09/05
- * Fixed 2 Bugs In Super Novice Script [Darkchild]
- * Added Super Novice Official Quest [Darkchild]
-
- - Started Changelog: Same As Normal Changelog, but now for scripts, here we can put every lil thing we change :)
+Person Working On
+======
+Lupus
+ * Looking for exploits, optimization, bugs hunt
+ * Adding new cards, checking/adding mobs/items
+ * EXP quests for Blacksmith, Merchant, Alchemist
+Mass Zero
+ * Fixing grammatical errors.
+ * Fixing small bugs.
+ * Adding small stuff.
+ * Redoing lots of the custom scripts.
+Massdriller
+ * Correcting & Bugfixing scripts
+erKURITA
+ * Warps maintainment
+Evera
+ * Everything.
+ * Dungeon Teleport System NPCs.
+ * iRO information gathering.
+ * Kafra maintainment.
+ * Taking requests.
+Musashiden
+ *Scripting iRO latest towns (warps, NPCs, ect.)
+ *iRO information gathering.
+Playtester
+ * Monsters spawn, warps maintainment
+KarLaeda
+ * Fixing bugs
+ * Adding new NPC
+
+
+== Changelog ==
+
+Date Added
+======
+12/01
+ * Fixed event's label for many quest-spawned monsters [KarLaeda]
+ * Small fix to The Sign Quest [KarLaeda]
+ * Removed outdated Thief Bug ID [Playtester]
+ - 1017 and 1021 don't exist anymore
+11/30
+ * Updated Shinokas Quest to leave no grabage vars [Lupus]
+ - Added a log when players get their jobs
+ * Added first version of Rachel Sanctuary spawns [Playtester]
+ - commented for now
+11/28
+ * Enabled Ice Dungeon spawns so they can be tested [Playtester]
+11/26
+ * Added a check to prevent spawning of more than one Thanatos in the Thanatos Quest.
+ Thanks to Kodachi for reporting on IRC [erKURITA]
+ * Enabled Rachel Field spawns so they can be tested [Playtester]
+11/24
+ * Cleaned up global permanent variables in Airship Quest [KarLaeda]
+11/23
+ * Fixed Mage Tutorial Quest [KarLaeda]
+ - Fixed typos in Ninja Quest
+11/21
+ * Less G_mobs spawning in Odin Temple [Playtester]
+11/20
+ * Updated Skill Resetter Event, thanks to $ephiroth [KarLaeda]
+ * Fixed Sage guest [KarLaeda]
+ * Fixed exploit in Shinokas Quest [KarLaeda]
+11/17
+ * Added official kRo&idRO Skill Reset Event, thanks to $ephiroth [Lupus]
+ - Fixed possible double levelup bugs [Lupus]
+11/16
+ * Fixed wrong label name in adoption NPC [KarLaeda]
+ * Added official Ninja Job quest! Thanks to Legionaire for translation [Lupus]
+ Don't forget to update your other\Global_Functions.txt
+ - Removed name duplicates
+11/14
+ * Replaced current Rachel Sanctuary warps with jAthena's version [Playtester]
+ - some warps still seem to be wrong or missing
+11/13
+ * Fix for guild manager recognizing [KarLaeda]
+11/12
+ * According to recent info you can re-install Guardians during WoE [Lupus]
+11/11
+ * Fixed warp on timeout in swordman.txt [KarLaeda]
+11/09
+ * Added Bingo - Hugel warps, thanks to erKURITA [Lupus]
+ - Added Hugel INN
+ - Added missing temp Airship mobs
+ - Pet shop in Lighthalzen
+ - Minor typos fix of Hunter Job quest, thanks to $ephiroth
+ * Fixed Swaltzwalt Quest Part 1 bugs [dunkle]
+11/08
+ * Added quest\WIP (work in progress folder) with scripts by Dunkle and CallNIX [Lupus]
+ * Small fix in Hunter Job Quest [KarLaeda]
+11/07
+ * Another one set of fixes for the scripts syntax. [KarLaeda]
+ * Added Quiz (Revolution) Part 1. Converted by CAHTXHuK [Lupus]
+ He's another candidate to the script devs. Work in progress. Help us to find bugs
+11/06
+ * Fixed item select in Novice Exchanger [KarLaeda]
+11/05
+ * Fixed extra EOL in jro spawn [KarLaeda]
+ * Fixed reward of gunslinger job quest [Playtester]
+11/04
+ * Many small fixes - tabs, parenthesis [KarLaeda]
+ * Fixed Weight check in 1st class quests [Lupus]
+ - Added missing tabs to airship
+11/03
+ * Small Kiel Quest update [Playtester]
+ * Updated Hunter Job Quest: 7 official item sets of Demon Hunter [Lupus]
+ thanks to Dr.Evil
+11/02
+ * Removed extra NEXT; from custom\airplane.txt, thanks to $ephiroth
+ * Amatsu Field: Fixed Hydra -> G_Hydra (to fix drops exploit) [Lupus]
+ U can put there a normal Hydra to open free Hydra Cards + Macros exploit
+ * Fixed typos and item names in DTS warper, 2006 Headgear Quest [Lupus]
+11/01
+ * Added entrance to Kiel Dungeon F2 [Playtester]
+ * Training grounds: Now Kafra Tickets are given at correct NPC/Actions [Lupus]
+ Only at Kafra Employee 118,108 & Hanson 100,29
+10/31
+ * Official X.4 spawn mob types [Playtester]
+ - numbers are official on 90% of the maps
+10/30
+ * Updated the npc/other/marriage.txt wedding script with the most current
+ version. [Skotlex]
+ * Added Official First Class Quests-Tutorials (Jukka's conversion) [Lupus]
+10/29
+ * Added official jRO 10.3 spawns as custom option [Playtester]
+10/26
+ * Replaced previous TK Job Quest with this one [Tsuyuki]
+ - Updated Lighthalzen City & Rachel City NPC
+ - Replaced Louyang Guide with new, 100% correct iRO dialogues
+10/25
+ * Got rid of colned maps. Replaced them by their originals [Lupus]
+ new_1-?.gnd -> new_zone0?.gnd
+ sword_1-1.gnd -> job_sword1.gnd
+ - Fixed item id in socket_enchant.txt, thx to norbert
+10/24
+ * Spawn updates for Einbroch Fields [Playtester]
+ * Updated Novie Training Grounds: typos, bugs, removed extra maps, duplicates [Lupus]
+ - Removed some unused job-quest map aliases to free some RAM. Thanks to theultramage for pointing it out.
+ !!!WARNING!!! Wipe your memo db. Map indexes have been shifted.
+ * Added official Gonryun Power Arena [KarLaeda]
+ * Removed 2nd entrance warp to Novice Geffen Castle [Lupus]
+ - minor fixes in Novice Exchanger
+10/23
+ * Fixed small typo in the Priest job quest [Playtester]
+10/22
+ * Small spawn updates for Gefenia and Einbech Dungeon [Playtester]
+10/21
+ * Further spawn updates for Yuno Field [Playtester]
+ - Magma Dungeon
+ - Amatsu Field
+ - Amatsu Dungeon
+ - Gonryun Field
+ - Gonryun Dungeon
+ - Umbala Field
+ - Umbala Dungeon
+ - Yggdrasil
+ - Niflheim
+ - Louyang Field
+ - Louyang Dungeon
+ - Ayothaya Field
+ - Ayothaya Dungeon
+10/20
+ * Official kRO 10.1 spawns for Morroc Field [Playtester]
+ - Prontera Field
+ - Cities (reorganized citycleaners)
+ * Added official Free Ticket for the Cart Service to the Novice Training Grounds [Lupus]
+ - Fixed endless Novice Potion + Adv Suite exploit
+ - Removed 2 oudated Novice Grounds scrips (they confused many people)
+ * Official kRO 10.1 spawns for Mjolnir Field [Playtester]
+ - Comodo Field
+ - Geffen Field (+ 10.4 Orc Village change)
+ - Payon Field
+ * Added official Gonryun Broken Sword Quest [KarLaeda]
+ * Fixed The Sign Exploits [Lupus]
+ - Optimized Novice Exchanged (loot->Red Potions), moved the file to NPC\Merchants
+ - Fixed The Sign bugs, thanks to Tantarian
+ + added get rid of sobbing pieces to let people reborn
+ If u finished the Sign Quest and have some undeleted sobbing pieces, then visit this man
+ mjo_dun02.gat 88,295 Flaming Spirit Man - he'll wipe them 8)
+ - Fixed wrong label names in mjolnir_seal.txt, thanks to Tantarian
+ - Added Feast Day Of Ramadan Idul Fitri Event (official idRO) by $ephiroth
+10/19
+ * Official kRO 10.1 spawns for Byalan [Playtester]
+ - Payon Cave
+ - Toy Factory
+ - Lutie Field
+ - Anthell
+ - Orc Dungeon
+ - Coal Mine
+ - Prontera Culverts
+10/18
+ * Llyr fixed The_Sign_Quest [Lupus]
+ * Official kRO 10.1 spawns for Glastheim [Playtester]
+ - Turtle Island
+ - Clock Tower
+ - Sphinx
+ - Prontera Maze
+ - Sunkenship
+ - Beach Dungeon
+ - Pyramid
+ - Geffen Tower
+ * Official kRO 10.1 spawns for the guild dungeons [Playtester]
+10/14
+ * Some more official spawns [Playtester]
+ * Fully official Juperos and Bio Lab spawns [Playtester]
+ * Updated some field spawns to official [Playtester]
+ * Fully official Abyss Lake spawns [Playtester]
+ * Fully official Thanatos Tower spawns [Playtester]
+ * Fixed typo in Lighthalzen Bank [Playtester]
+ * Assassin Job quest: Fixed skipping of Nameless NPC [Lupus]
+10/11
+ * Removed Free Pass from Kafra [Lupus]
+ - Now Kafra can use these tickets (Novice Grounds has to be updated!)
+ 7059,Free Ticket for Kafra Storage | 7060,Free Ticket for Kafra Transportation
+ 7061,Free Ticket for the Cart Service
+ - Added "-Guide" option to Kafra. WIP (some official servers show u a nearest Guide on your mini-map)
+10/10
+ * Fixed Seals quest [Lupus]
+ * Updated Kafra Pavianne [Lupus]
+ * Added new custom Halloween Event by Stryker. I made it safe to use 8) [Lupus]
+10/06
+ * Fixed Shuriken Rekka requiring Cracked Diamond rather than Steel [Playtester]
+ * Added official treasure spawn to Novice Castles [Lupus]
+ - Added official Novice WoE restriction: Only the 1st class players (+Novice, SN) < 60 Base Level can enter.
+ - You can't invest Eco/Def, hire Guardians at Novice Castles
+ * Many minor fixes, thanks to theultramage [Lupus]
+ - Fixed "mymob" Niflheim bug, fixed Sworman Job Quest timer issue, fixed overlapping NPCs.
+10/05
+ * Fixed typo [Vicious]
+ * Umbala: Added official chance of failure to Create Essence (u may get a Garlet instead) [Lupus]
+ - Added official random amount to Dismantle Stone
+10/04
+ * Updated missing dialogues/NPC to Lighthalzen Bank, Prison,Auction area [Lupus]
+ thanks to Au{R}oN
+10/03
+ * Fixed Assassin Job Quest: Timer bug / NPC bypass exploit [Lupus]
+10/01
+ * Removed some duplicate Rachel warps [Playtester]
+09/28
+ * $ephiroth converted custom event: Grand Circlet Quest + Excalibur [Lupus]
+ * Added official Kiel Dungeon entrance [Playtester]
+ - commented the custom warps
+09/27
+ * Fixed item lists in Shuriken Blacksmith. Thanks to $ephiroth [Lupus]
+09/26
+ * Added Jukka's conversion first_class\tu_acolyte.txt. Not tested, not enabled yet [Lupus]
+ * Shuriken Blacksmith - added missing next; [Lupus]
+ - Finished translation of custom\may_hats, thanks to Playtester ^_-
+09/25
+ * Fixed the Shuriken Blacksmith. Incomplete Label (M_DAIS -> M_DAIS4) and extra
+ parenthesis on line 128 ( a ) in the end of the condition) [erKURITA]
+ * Thanks to Au{R}oN, added prison and bank Lighthalzen NPC [Lupus]
+ - Thanks to Au{R}oN, added Shuriken Blacksmith. Fixed bugs.
+09/22
+ * Fixed missing npc interaction at Einb Pollution Quest [Lupus]
+09/21
+ * Feed 15 more permanent character variables. [Lupus]
+ - Fixed old Cube Room sticks-bug
+ - Now Bio-Lab passage uses MISC_QUEST | 512 instead of 'hzdun'
+ Don't forget to update your lhazeh warps script ^_-'
+ - Fixed 2 bugs in Dungeon Teleport Service. Should use ( ) !!!
+09/20
+ * Fixed some bugs in Cube Room. Some parts could be skipped [Lupus]
+ * Final optimization of Niflheim quests [Lupus]
+ - Book of Devil Quest uses bit-wise var MISC_QUEST | 256. Removed extra vars
+ - Piano Quest uses 1 bit-wise temp var instead of 5 variables.
+ - Clear Niflheim garbage vars in Global_Functions.txt
+ - Added few missing NEXT; into job quests, thanks to $ephiroth
+ - Changed permanent variables in 1st Job Quest skills to @temp ones
+ - Cube Room: 5 key vars -> 1 var cubekey
+09/19
+ * Fixed rpsroulette.txt, giving 10 blue potions as prize instead of the 20 it said. Also fixed
+ a missing variable in sphinx_mask.txt. Noticed by JTE and fixed by Warian [erKURITA]
+ * Preparations for optimization of Louyang/Nifelhem scripts [Lupus]
+09/16
+ * fixed apple dice game in Airship, fixed missing } in Einbech quests [Lupus]
+09/15
+ * Ein.Town Pollution fix [Lupus]
+09/14
+ * Fixed Payon city. Bugs, missing text, etc [Lupus]
+ * Massive Einbroch & Einbech bugfix. WIP [Lupus]
+ * Fixed typos in Gunslinger & Thief Job Quest & various NPCs [Lupus]
+ thanks to cbmaster & $ephiroth
+ - Fixed Guild Defence / Economy underflow, thanks to kyoki
+ - Zoc's fix to keep number of unopened boxes on reboot
+ - Now each castle spawns 1st/2nd Treasure Box type as 50%/50% w/o random
+ - Fixed Momotaro Quest, thanks to .~Abism0~.
+09/11
+ * Moved custom Umbalian quests to custom folder [Lupus]
+ * Added back Guild Storage. Confirmed kRO feature. [Lupus]
+09/10
+ * Official Byalan F5 spawns [Playtester]
+ - also updated eamobs accordingly
+09/08
+ * Adjusted Rachel spawns [Playtester]
+ * Fixed Einbroch Headgear shop [Playtester]
+09/06
+ * Added a missing feature to the donation NPC in Lighthalzen [MasterOfMuppets]
+09/05
+ * More proper Valyrie dialogues [Lupus]
+ * eAAC Update to the banker. [erKURITA]
+09/04
+ * Added missing next's in npc/custom/airplane.txt and npc/custom/quests/valhallen.txt [Evera]
+ - (Thanks $ephiroth)
+ * Fixed Bio Ethic quest typo (misspelled key phrase), thx2 mr.rkit [Lupus]
+ - Merged updated city warps from TRUNK
+09/03
+ * Added another next; in bongunsword.txt [Evera]
+ * Added missing NPC name in text and next;'s in npc/quests/bongunsword.txt,
+ - npc/cities/amatsu.txt, and npc/merchants/socket_enchant.txt. (Thanks $ephiroth) [Evera]
+ * Added some Juperos maps to nosave.txt due to an upcoming update. [MasterOfMuppets]
+09/02
+ * Updated Kiel spawns [Playtester]
+ - first floor is close-to-official, but no idea about second floor
+ * Fixed some Thanatos Tower warps [Playtester]
+ - I hope Ishizu fixes up the quest soon
+09/01
+ * Added missing next;'s in Payon City NPCs (Thanks $ephiroth) [Evera]
+ * Tried to remove all duplicates (in default NPCs) [Toms]
+ * Removed useless 'npc\other\old' directory, who would need that anyway... [DracoRPG]
+ * Commented out the path to Divorce NPC as Lupus forgot to add it for good [DracoRPG]
+ * Fixed critical syntax errors in the new Valkyrie script, (è_é) @ Lupus [DracoRPG]
+ * Improved Bioethics quest & nearby Rekenber Guards [DracoRPG]
+ - Used isequipped() instead of getequipid() to simplify code (esp. with accessories)
+ - Rewritten the custom text about Hom. Res. and removed its actual learning
+ - iRO-ized answers to the test (text was taken from a pRO guide so pRO names >.>)
+ * Rogue Job quest: now baby thieves can pass 4th test [Lupus]
+ - In the same quest, fixed test4 quest NPC, thanks to Dj-Yhn
+ - Added divorcing Deviruchi, converted by LightFighter
+08/31
+ * Removed a warp from Izlude to make sure people won't get stuck until [MasterOfMuppets]
+ the arena has been finished.
+ * Reverted two duplicate next, please check before commit it [Playtester]
+08/30
+ * Added missing NEXT; to some custom quests. Thanks to $ephiroth [Lupus]
+ * A small fix to the 2006 headgears quest, thanks to Belle for telling me about the problem. [MasterOfMuppets]
+ * Added temporary Ice Dungeon spawn file (commented for now) [Playtester]
+08/29
+ * Fixed a bug in the sign quest that prevented people from advancing in it. [MasterOfMuppets]
+ * Changed some broadcast colors in the god item quest. [MasterOfMuppets]
+ * Some preparations for the upcoming Izlude Arena [MasterOfMuppets]
+ * eAAC Update to the Coin Banker. [erKURITA]
+08/27
+ * Fixed a syntax error on npc/guild/nguild/nguild_warper.txt line 37 [Toms]
+ * After big discussion at the board, by default we decided to disable CUSTOM
+ Guild Storage option in Guild Kafras. You can uncomment it in functions_kafras.txt [Lupus]
+ - Also made Novice Castles Event close to the original: 1st classes over 60 Base Level
+ can't take part. Novice Castles also manufacture not more than
+ 1 Treasure Chest despite of the Economic invest.
+ - Fixed custom Bandit's Beard quest. Thanks to Vhan Morthis for pointing it out.
+08/26
+ * Added official effects to the Socket Enchant NPC [Playtester]
+08/25
+ * Reverted the mapflag changes to Lighthalzen. [MasterOfMuppets]
+ * Little correction on Assassin Job Quest [Toms]
+08/24
+ * Various fixes on Headgear 2006 quests [Playtester]
+ * Updated Treasure Chests Numver formula to the Aegis one: Economic/5+4 [Lupus]
+ - Updated Bio Ethics Quest to let Creators+Baby Alchemists learn the skill as well
+ - Moved it to Alchemist Skill Quests
+ - Added NO LOOT, NO EXP mapflags to Lighthalzen (Gangsters exploit fix)
+08/22
+ * Fixed bug letting anyone get homunculus skills from Bio Ethics [Evera]
+ * Updated Gunslinger Quest, removed "Thin Trunk" (7186) according to RockmanEXE [Toms]
+08/21
+ * Fixing MoM's typos (Citrin -> Citrine) over Lv4 weapon quest. [erKURITA]
+ * Implemented the God item quest. [MasterOfMuppets]
+ - Thanks to SinSloth for scripting most of it.
+ - Beware of potential bugs.
+ - A grammar check-up would be appreciated.
+08/20
+ * Implemented the Einbroch polution script. [MasterOfMuppets]
+ * Implemented the official 2005 headgear quests. [MasterOfMuppets]
+08/19
+ * Uncommented Homunculus shop for Homunculus in Trunk [Evera]
+08/15
+ * Fixed Kellasus giving extra skills in Bio Ethics Quest [Evera]
+ * Added Ammo Dealer Tony [Playtester]
+ * Fixed some parts of the Gunslinger gun quests [Playtester]
+ * Added Ammo Casing Seller Kenny [Playtester]
+ * Added Holy Arrow Quivers to Inventor Jaax [Playtester]
+ * Added all the Gunslinger gun quests [Playtester]
+ - sphere creation and ammo casing are still missing, working on it
+ - removed erKURITA's version, he's okay with it
+08/14
+ * Various changes in other/dts_warper.txt [Evera]
+ - Uses new global var $dtsday to count voting sessions [Evera]
+ - Bug fix for a bug involving both warpers being activated at the same time [Evera]
+ - Need bug testers for these fixes before stable merge [Evera]
+ * Updated header in other/Global_Functions.txt [Evera]
+ * Fixed the int&str bug of test tube in bio labs quest [Evera]
+ * Fixed 2006 headgears npc giving you Lion Mask rather than Lion Masquerade [Playtester]
+ * Moved the Gunslinger quest NPCs to gunslinger_quests.txt [Playtester]
+ - put erKURITA's version of the Garrison quest into another file since I already
+ added a complete version, use it if you like it more
+ - also gave the NPCs their official names
+ * Changed DTS warper to use MISC_QUEST|128 instead of dtseligible,2. [Evera]
+ - May be some bugs, it's 1am @_@, look through it before trunk merge. [Evera]
+ * Added Garbage clearing for dtseligible,2 -> MISC_QUEST|128, and added that func call to DTS warper. [Evera]
+ * Added (finally) the official Inn Maid of Rachel. Save and warp points
+ are official aswell, thanks to RockmanEXE [erKURITA]
+ * Added (finally) the Garrison quest npc. Item requirements are the official ones,
+ but the quest... well you know. Thanks to RockmanEXE [erKURITA]
+08/13
+ * Finished Bio Ethics Quest, need bug testers before finalizing and moving to stable [Evera]
+ * Added Bio Ethics Quest variable to bit shift MISC_QUEST|64, and added to quest_variables.txt [Evera]
+ * Fixed Bio Ethics Quest, had a few bugs >_< [Evera]
+ * The Sign Quest: moved #aldesignwarp to fix enless warp [Lupus]
+08/12
+ * Fixed id of Dryad Card in the Headgears 2006 quest thanks to tonyfud [Playtester]
+ * Added Violin[3] to the Comodo Weapon seller [Playtester]
+ * Optimized a warp near Gunslinger weapon shop [Playtester]
+ * Extended the Garrison quest to slot the Garrison [Playtester]
+08/10
+ * Switch airplanelocation variables to temp variables to avoid unusefull mapreg(sql/txt) writes [Toms]
+ * Added file for gunslinger quests [Playtester]
+ - Garrison quest is done and tested
+ * Fixed header on DTS warper [Evera]
+ * Added bit to Bio Ethics quest to warp out player if attempts quest, since quest is unfinished [Evera]
+ * Some Einbroch respawn time fixes [Playtester]
+08/09
+ * A small sign quest fix according to a recent patch. [MasterOfMuppets]
+08/06
+ * Added official spawn locations for all Yuno Fields [Playtester]
+ - note: only works with Skotlex's spawn area fix
+08/05
+ * Fixed NPC event parameter deprecated of Adoption. [Lupus]
+ Thx 2 tuproc 4 pointing it out
+ * Fixed the Socket Enchanter thinking some items are Class C [Playtester]
+08/04
+ * Added some official spawn locations from Aegis [Playtester]
+ * Re-enabled Socket Enchanter, it's official thus enabled by default [Playtester]
+ - If you think it ruins your server's economy COMMENT IT FOR YOUR OWN SERVER, thanks.
+ - If you want it disabled please discuss in the Development forum about it first!
+08/03
+ * Once again disabled the socket enchant NPC.
+ - unless your server's rates are 1/1/1, it will COMPLETELY ruin your server's economy. [Musashiden]
+ * Updated the Kafra Express files to the July 28 release as requested on
+ the forums. [Skotlex]
+ * Fixed the DTS warper zeny bug [Evera]
+08/02
+ * Re-enabled the Culvert Save [Evera]
+ * Removed save points outside towns (from inside) from Kafras [Evera]
+ - Kafras will no longer display "Save Outside City," and will just save you inside
+ * Added official success rates of the Socket Enchant NPC [Playtester]
+ * Fixed Sharon's abuse at Hunter Job Quest 8) Thanks to mike04 for pointing it out [Lupus]
+07/31
+ * Updated the Geffenia spawns. [MasterOfMuppets]
+ * Some small changes to the sign quest [MasterOfMuppets]
+ * Cleared 2006 Headgear quests a bit [Lupus]
+ - Made Gunslinger Job Quest use 1 variable instead of 2 [Lupus]
+07/30
+ * Added 2006 Headgear quests... note that they will need to be updated with official dialog
+ and NPC ID. [Reddozen]
+ * Optimized Gunslinger Job Quest, rediced vars number, updated Global_Functions.txt [Lupus]
+07/29
+ * Some more sign quest warps and a small change to the comodo gambling NPC. [MasterOfMuppets]
+ * Fixed a mixed up mob id in Thanatos spawns [Playtester]
+ * Added temporary Beholder and Gremlin spawns [Playtester]
+ - their drops are needed but Airship quest isn't finished yet
+ - should be commented once Airship quest is finished
+ - also added two airship warps
+07/27
+ * Fixed the Morroc ingredient seller to not appear [Playtester]
+ * Fixed some spawns and a warp in Sunken Ship [Playtester]
+07/26
+ * Fixed the Factory Quest [Playtester]
+ - two NPCs in one line won't work! >_>
+07/25
+ * Added first part of Bio Ethics Quest [Evera]
+ - Far from complete :<
+ * Some small fixes to the sign quest [MasterOfMuppets]
+ * Updated Thanatos Tower spawns [Playtester]
+ - they are official up to Floor 6 now
+07/24
+ * Tiny typo fix in a Rekenber Guard dialog [DracoRPG]
+ * Added temporary Rachel spawn file, commented for now [Playtester]
+07/23
+ * Removed the regular Thanatos spawn, since the quest is now implemented. [MasterOfMuppets]
+ * Implemented the Niflheim town invasion. [MasterOfMuppets]
+ * Jawaii warp now costs 10,000z [Playtester]
+ * Implemented the sign quest, please test it if you have some free time :P [MasterOfMuppets]
+ - We need to know if there's any bugs left to implement it in stable
+ * Changed the names of some NPCs [MasterOfMuppets]
+07/22
+ * Removed two warps in Aldebaran in preparation for the sign quest. [MasterOfMuppets]
+07/21
+ * Fixed a typo in guides_einbr.txt [Playtester]
+ * Added the Cube Room Maze thanks to Tharis and Tantarian [Playtester]
+07/20
+ * Split quest from cities/izlude.txt to quests/quests_izlude.txt [Evera]
+ * Split quest from cities/alberta.txt to quests/quests_alberta.txt [Evera]
+ * Split quests from cities/amatsu.txt to quests/quests_amatsu.txt [Evera]
+ * Split quests from cities/ayothaya.txt to quests/quests_ayothaya.txt [Evera]
+ * Split Doomed Sword quests from cities/comodo.txt to quests/quests_comodo.txt [Evera]
+ * Split Einbech quests from cities/einbech.txt to quests/quests_ein.txt [Evera]
+ * Renamed quests/quests_einbroch.txt to quests/quests_ein.txt [Evera]
+ * Split more Einbroch quests in cities/einbroch.txt to quests/quests_einbroch.txt [Evera]
+07/19
+ * Completed the sign quest warps [MasterOfMuppets]
+07/18
+ * Fixed a warp in moc_pryd06 [Playtester]
+07/17
+ * Enchanting a Tiara now costs 2M [Playtester]
+ * Added slotted Running Shirt to Comobo Gambling [Playtester]
+07/16
+ * Small spawn update in Kiel Dungeon [Playtester]
+07/15
+ * Removed global eligibility option from DTS warper [Evera]
+ - Added old global eligibility variable for DTS warper to garbage [Evera]
+ - Fixed incorrect information in DTS warper header [Evera]
+ * Fixed Detale's spawn location [Playtester]
+ * Fixed Blue Fish quest only removing 1 Stinky Scale [Playtester]
+ * Fixed some typos in cities/izlude.txt thanks to Zarnox [Playtester]
+07/14
+ * Fixed a quest NPC giving you a Huge Leaf rather than Smokie Leaf [Playtester]
+ * Improved the Fox Mask quest [Playtester]
+ * Small Kafra coordinate fixes [Playtester]
+07/13
+ * Fixed an invalid savepoint in Lighthalzen Inn. [Adam]
+ * Added Sephiroth's version of the Rachel Sanctuary Warps [Playtester]
+ - remove the comments in the warp file if you want to use them
+ * Fixed some typos thanks to Zarnox [Playtester]
+ * Disabled socket enchant npc. [Musashiden]
+07/09
+ * Added some missing Rachel Warps [Playtester]
+ * Added a fix to npc/other/books.txt [Playtester]
+07/07
+ * Fixed a few bugs in 2004_headgears.txt [Evera]
+ * Fixed a small bug in the swordsman job quest [MasterOfMuppets]
+ - thanks to tenshi7angel for notifying me about it.
+ * Small fix in the Blacksmith Quest [Playtester]
+07/05
+ * Fixed Dancer Job Quest (3rd part) thx2Alis [Lupus]
+ * Went trough all scripts and turned all job numbers -> constants [Lupus]
+07/05
+ * fixed missing labels socket_enchant.txt [Lupus]
+ * Standardized NPCs quest/quests_city headers, now says 'Quest NPCs related to'
+ - Also fixed typos in those NPC city headers [Evera]
+ * Removed that Dbbug announce line from the 2004 headgears quest npc.
+ [Skotlex]
+ * Fixed Book of Yamir stucking [Lupus]
+ * Fixed bugs / typos in 2004_headgears.txt, thanks to Qwadrat [Lupus]
+ * Updated Socket Enchant NPC [Playtester]
+ - fixed various bugs
+ - adjusted success rates
+ - now has official coordinates and sprite
+07/04
+ * Added the Socket Enchant NPC written by Sousuke_PL [Playtester]
+ - I already tested and fixed some stuff but requires some more testing
+ * Implemented the official 2004 Headgear quests, thanks to Dj-Yhn [MasterOfMuppets]
+ for the conversion from Aegis format.
+07/03
+ * Fixed bug in DTS warper that votes weren't counted on Sunday [Evera]
+ - Changed requirement for vote eligibility in DTS warper to 60
+ (Was previously completion of President's Quest, but since it wasn't
+ done, I used a random chance) [Evera]
+ * eAAC update to donation girl. [erKURITA]
+ * Split cities/einbroch.txt to cities/einbroch.txt and quests/quests_einbroch.txt [Evera]
+ - Fixed some small typos [Evera]
+ * Fixed many many bugs in Crusader Job Quest [Lupus]
+ Changed all numbers to job_constants
+07/02
+ * Split quests from cities/louyang.txt to quests/quests_louyang.txt [Evera]
+ * Added some fixed positions and fixed mob id in Einbroch spawns [Playtester]
+ * Moved Earth Petits away from the Coal Mine Entrance Map in eamobs [Playtester]
+07/01
+ * Fixed a warp in the Ice Dungeon [Playtester]
+06/30
+ * Implemented the eye of hellion quest. [MasterOfMuppets]
+ * Added official Thanatos Tower quest thanks to Ishizu-chan [Playtester]
+ * Completely updated Lighthalzen Field spawns to X.4 [Playtester]
+ * Completely updated Einbroch Field spawns to X.4 [Playtester]
+ * Completely updated Yuno Field spawns to X.4 [Playtester]
+ * Updated Orc Village spawns to X.4 [Playtester]
+ * Fixed a Rachel Field warp [Playtester]
+ * Fixed some warps thanks to akihito [Playtester]
+ * Updated Byalan F5 spawns to X.4 [Playtester]
+ * Added custom/floating_rates.txt [Lupus]
+ Random change of Drop/Exp rates from 1x to 1.5x every 6 hours
+ NOTE! Take a look at an incredible script function 'setbattleflag'
+06/29
+ * Fixed many typos on cities/alberta.txt and airports/airships.txt, with information from Crono/Hollengrhen [Evera]
+ - Fixed many typos on cities/aldebaran.txt [Evera]
+ * Stricted up penal servitude conditions [Lupus]
+ - Restricted Novices Castles entrance of TK/Highs to 80 BaseLevel
+06/28
+ * Updated yuno_fild03 spawns [Playtester]
+06/27
+ * Added Rachel NPCs:
+ ~ Added Official warps of Rachel. About 50% of them. Will get the rest soon. [erKURITA]
+ ~ Added the Tool/Armor/Weapon dealer, aswell as a Vegetable Gardener. [erKURITA]
+ ~ Added the guards + guide locations. Also added the Zondaman location. [erKURITA]
+ ~ Added Rachel Inn npc. [erKURITA]
+ \- Special thanks to RockmanEXE for all the info above.
+ * eAAC update to the vending machine, disguiser and quest warper. [erKURITA]
+06/26
+ * Added BIT-WISE perm variables info quest_variables.txt [Lupus]
+06/25
+ * Moved Umbala quests from cities/ to quests/, namely Skeletal Gate, Umbala Event, and Create/Dismantle Stone
+ - Moved Piano and Book of Devil quest from cities/niflheim.txt to quests/quests_niflheim.txt
+ - Moved Culvert from cities/prontera.txt to quests/quests_prontera.txt [Evera]
+ * Fixed possible exploit in umbala elemental stone quest [Playtester]
+ * Added a shop NPC to Prontera, it's required for the Hellion Quest. [MasterOfMuppets]
+06/24
+ * Fixed some typos and coordinates [Musashiden]
+06/23
+ * Merged JFunc 2-1, 2-2 functions, fixed bugs with missing dialogues [Lupus]
+ and changed job numbers to constants
+ * Updated Valhalla [Lupus]
+ - Also fixed some typos. Thx2 Mitternacht
+06/22
+ * Fixed treasure chests round number exploit [Lupus]
+ Now u get an extra chest one exact 4 Eco.pts adding
+06/21
+ * Yuno/Lhz/Thanatos spawn updates thanks to Tharis [Playtester]
+ * Fixed some spawns in Odin Temple [Playtester]
+ * Updated Hugel to official X.4 spawns thanks to Tharis [Playtester]
+ * Updated Einbroch to official X.4 spawns thanks to Tharis [Playtester]
+06/19
+ * Changed Doctor Quest item names to updated item_db names (cities/louyang.txt) [Evera]
+ * Fixed Quest requirements in cities/louyang.txt [Playtester]
+ * Fixed umbala.txt's Elemental Stones Quest bug. Thanks to Vhan Morthis.
+ [Skotlex]
+ * Removed Jfunc1-1.txt, merged parts of scripts back. Changed job numbers to constants [Lupus]
+ - Jfunc2-1.txt & Jfunc2-2.txt todo
+06/17
+ * Fixed a Rachel warp thanks to Dr.Evil [Playtester]
+ * Fixed some typos in quests_lighthalzen.txt thanks to Karore [Playtester]
+06/16
+ * Implemented the Lover's quest. [MasterOfMuppets]
+ * Yet another missing Juno warp. [musashiden]
+ * Corrected a duplicate juno warp + a juno guide sprite. [Musashiden]
+ * Updated sample script mob_controller.cpp to the latest standards. [Lance]
+ * Commited Silent's Fix to the duplicate NPCs [Playtester]
+ - needs testing
+ - can't be fully fixed because of length limitation of names
+06/15
+ * Juno's NPCs are now updated (unless i missed one) according to iRO! yay! [Musashiden]
+ * Juno Update Process. 75% complete. [Musashiden]
+ * Fixed the gambling npc giving Orc Helm [1] instead of the non-slotted version. [MasterOfMuppets]
+ * Dr.Evil fixed some parts of his Umbala script [Playtester]
+ * Updated the color codes on the Juno Guides mini map illustrations. [Musashiden]
+ * Juno Update Process. 50% complete. [Musashiden]
+ * Fixed an exploit in the Comodo gambling script. [Lupus]
+06/14
+ * Separated the Metto quest from the juno town npcs file. [musashiden]
+ * Juno Update Process. 30% complete. [Musashiden]
+ * Some more sign quest warps [MasterOfMuppets]
+ * Fixed Job Level requirement for Auto-Berserk [Playtester]
+ * Fixed some experience gained bugs in two scripts. [MasterOfMuppets]
+ - Also fixed a major problem in the level 4 weapon quest, thanks to Qwadrat.
+ * Fixed an exploit in the comodo gambling script, thanks to reddozen [MasterOfMuppets]
+06/13
+ * Fixed exploit in Louyang NPC [Playtester]
+ * More Abyss/Thanatos spawn updates according to info from Tharis [Playtester]
+ * Added Dr.Evil's fixes to the Umbala NPCs [Playtester]
+ - probably needs some testing
+ * Fixed the Job Level requirement for Arrow Crafting [Playtester]
+06/12
+ * Implemented the comodo gambling NPCs. Thanks to reddozen and Zefris. [MasterOfMuppets]
+ * Looks like somebody needs sleep. (Typos in Yuno.txt) [Lance]
+ * Juno Update Process. 10% complete. [Musashiden]
+ * Implemented a missing NPC in Amatsu and fixed up the old [MasterOfMuppets]
+ version of the Momotaro event, it is now a permanent quest.
+ * Started the Juno Update process. 5% complete. [Musashiden]
+ * Added custom quest for 5 mobile RO bonus items [Lupus]
+ Bird Nest,Lion Mask,Skeleton Manteau,Fashion Hip Sack,Sales Banner
+ * Changed Biolab quest so that case for the first letter of each input doesn't matter. [Evera]
+ * Fixed some typos in the new spawns [Playtester]
+ * Implemented Amatsu guides and changed/removed some Amatsu warps [MasterOfMuppets]
+06/11
+ * Updated spawns by Tharis, thanks to Saycyber21 [Vicious]
+ * Implemented the Poison King quest, beware of potential bugs. [MasterOfMuppets]
+ * eAAC update:
+ - Added Vending Machine, made by Celestria. [erKURITA]
+ - Updated and fixed Coin Banker, by me :P. [erKURITA]
+ * Updated all job quests, Valhallana, to completely save/restore ALL Quest Skills [Lupus]
+ IMPORTANT! Don't forget to update all files, includin new Global_Functions.txt
+06/09
+ * Added some missing iRO - Lighthalzen NPCs [Musashiden]
+ * Fixed a problem with Kafra's getarg(1),6 of showing the default menu [Evera]
+ * Fixed Lighthalzen and Yuno Kafra respawn locations [Playtester]
+ * Implemented two airship mini games scripted by Dj-Yhn [MasterOfMuppets]
+ * A small fix to Shinokas quest [MasterOfMuppets]
+ * Reverted back fully working counteragent_mixture.txt. Don't touch 8) PM me [Lupus]
+06/07
+ * Fixed Yuno Kafra warp, sorry guys, I made a typo [Evera]
+ * Readded the 'al_morgen' variable to counteragent_mixture.txt, it's needed [MasterOfMuppets]
+ for the alchemist quest. Thanks to Belle for the fix.
+ * Added Save/Load Quest Skills (1st/2nd Class quest skills!) global functions. To test and
+ insert into Valhalla NPC. They use ONE variable for all skills [Lupus]
+
+06/06
+ * Fixed missing function problems for Kafra, also now using cleararray instead of assigning blank variables to every other array [Evera]
+ * Implemented the Shinokas quest, thanks to Dj-Yhn for scripting it. [MasterOfMuppets]
+ * Added Rachel interior warps thanks to Celestria [Playtester]
+06/05
+ * Implemented some more Louyang npcs, thanks to Prometheus for them. [MasterOfMuppets]
+ * Implemented an inn NPC in Einbroch [MasterOfMuppets]
+ * Fixed some typos in Lighthalzen [Playtester]
+06/03
+ * Implemented some more airship NPCs, more are to come. [MasterOfMuppets]
+ - Also put in a few warps from the sign quest which is to come.
+ * Updated Kafras [Evera]
+ * Small adjustment to Thanatos Tower spawns [Playtester]
+ * Fixed some typos and warps in Einbech [Playtester]
+ * Fixed a small typo in cities/aldebaran.txt thanks to LightFighter [Playtester]
+06/02
+ * Removed Bio Lab from eamobs [Playtester]
+ - since the official entrance is in it's no longer needed
+05/31
+ * Now only one Chung E spawns in Louyang [Playtester]
+ * Added Rachel and Ice Dungeon warps [Playtester]
+ * Now re-using one variable MISC_QUEST for such quests: [Lupus]
+ Morgenstein, Nifl Witch, Edgar's Offer, Prontera Culvert,
+ Juice Maker, Tempestra,
+ - replaced BUNYBND with @BUNYBND
+ - added a special global function "F_ClearGarbage" function [Lupus]
+ that converts old quest variables into MISC_QUEST bits;
+ clears outdated, wasted variables. Temporary added its calls into Warpra & Kafra
+ IMPORTANT! Update all your quests and Global_Functions.txt
+ If you continue using not updated Quests scripts, it could cause
+ some exploits or the passed quests reset
+05/30
+ * Fixed Jawaii Classic Suite NPC warping directly ontop of a warp [Evera]
+ * Fixed the Umbala Skeleton Gate thanks to LightFighter and Naf- [Playtester]
+ * Implemented the Lighthalzen guides, added some missing warps [MasterOfMuppets]
+ and a tool dealer.
+ * Re-made some quest to use 1 variable instead of 2 or 3... [Lupus]
+ - Juice Maker, Morgenstein+Alchemist Job Quest, Tempestra
+ Make a habbit to clean your global_reg_value table from event vars & old garbage
+05/29
+ * Changed DTS warper vote count to use 1 variable. [Evera]
+05/27
+ * Implemented a small quest in Einbroch and fixed the name of the [MasterOfMuppets]
+ spawning mobsters in Lighthalzen
+ * Implemented the second entrance to biolabs and added some crap NPCs [MasterOfMuppets]
+ - The sewer pipe does no longer REQUIRE a lab passport, but it requires completion of the cube quest
+ - The second entrance to biolabs does not REQUIRE completion of the cube quest, but it does require
+ a lab passport.
+ * Updated DTS Warper; Now uses 3 global vars, 2 are vote #, 1 is etc in binary values. [Evera]
+ * Implemented the friendship quest. *finally* [MasterOfMuppets]
+05/26
+ * Modified Kiel spawn file [Playtester]
+ - only one Aliza each floor
+ - Kiel D-01 spawns every 2 hours on floor 2
+ * Uncommented Odin and Kiel spawn files, they are mostly safe to use [Playtester]
+ - you still can't access Kiel's place, though
+05/25
+ * Fixed Abyss Lake spawns [Playtester]
+ * Fixed Thanatos Tower spawns [Playtester]
+ * Added a custom Market Place to clear Prontera streets from annoying shops. [Lupus]
+ 'novending' mapflag sample: Try it and adjust the script as you want.
+ * Optimized a bit scripted warps, got rid of 'anthell' perm var [Lupus]
+05/24
+ * Removed Blue Potions from Yuno Shops [Playtester]
+ * Fixed the Thanatos Floor 12 warp [Playtester]
+ - coordinates are just guessed
+ - whoever does the quest should fix the warps there anyways
+ * Commented the custom Geffenia Fountain by default [Playtester]
+ * Added the Novice Exchange Quest provided by Dr.Evil [Playtester]
+ - exchange novice loot for Red Potions
+05/23
+ * Fixed a bug in the new Job Master [Playtester]
+ - he rebirthed you even if you haven't reached level 99...
+ * Changed the questions of the Wizard Quiz to official ones [Playtester]
+05/22
+ * Global_Functions fix. Jobmaster fix. [Lance]
+05/19
+ * eAAC Update + Fix [erKURITA]
+ * Translated sample/gstorage_test.txt
+ * Commented a warp that stands in the middle of nowhere [Playtester]
+05/17
+ * Now the Inns are like on official servers [Playtester]
+05/15
+ * Fixed DTS warper, optimized Kafra and changed pay cave and orc village kafra [Evera]
+ * Fixed Amon Ra's spawning location [Playtester]
+ * Corrected 10 Geminis spawning in Lhz1 rather than 2. [Skotlex]
+05/14
+ * Fixed the quiz in the Wizard Job quest a bit [Playtester]
+05/13
+ * Fixed the new shops [Playtester]
+ * Added missing shops at Beacon Island [Playtester]
+05/12
+ * Added DTS (Dungeon Teleport System) Warper NPC [Evera]
+05/10
+ * Fixed some typos and grammatical errors on the Job Dancer quest...
+ [Skotlex]
+ * Fixed Inn dialogues [Playtester]
+05/09
+ * Inn now costs 5k at every level [Playtester]
+05/07
+ * Fixed some grammar errors in Thief Job, Kunai, and others [KillerBox]
+ * Fixed Sea Otter Quest thanks to nolider [Playtester]
+05/06
+ * Fixed the warp in the Turbo Track Room [Playtester]
+05/04
+ * Hopefully fixed the custom Prontera Cemetery Event [Playtester]
+ * Fixed a missing " in the gunslinger jobquest script [Playtester]
+ - some others fixes as well thanks to sodaboy581 and css25
+ - some typo fixed as well
+05/02
+ * Added kunai_maker.txt to make elemental kunais. [erKURITA]
+ * Added new npcs @ que_ng.gat ninja map portion. [erKURITA]
+ * Added new shops @ que_ng.gat ninja map portion. [erKURITA]
+ * Commented wrong shops @ amatsu.txt. [erKURITA]
+ * Added que_ng.gat ninja map portion's warp. [erKURITA]
+ * Modified and corrected the gunslinger quest. [erKURITA]
+05/01
+ * Fixed an NPC in Morroc who still said the Dragon Fly is North [Playtester]
+04/30
+ * Made Geffen Tower 1 in eamobs a bit more crowded [Playtester]
+ * Added the correct spawns for Ancient Geffenia(gef_dun03) [Playtester]
+ * Added some tabs to the Pickpocket Quest so it's more readable [Playtester]
+ * Added first version Gywall's Pickpocket Quest [Playtester]
+ * Updated several job quests so they work again thanks to sodaboy581 [Playtester]
+ * Fixed mjolnir_12 -> prt_maze01 warp [Playtester]
+04/27
+ * Fixed an Aldebaran Castle 4 warp again [Playtester]
+04/26
+ * Commented out temp Gunslinger shops. [Lupus]
+ * Fixed Food Seller in Alberta thanks to Sousuke [Playtester]
+ * functions_kafra.txt was pretty buggy, including a zeny exploit (free warps). Thanks to OZ over IRC
+ for pointing out. It needs more optimization too. [erKURITA]
+ * eAAC Update: quest_warper.txt [erKURITA]
+04/25
+ * Re-made the Izlude NPCs with new dialogues among other things. Thanks to Muad_Dib [Kargha]
+ * Added two Alberta NPCs thanks to Sousuke [Playtester]
+ * Cube Room Quest: fixed "free stick" bug, thx 2 Neouni [Lupus]
+04/23
+ * Rearranged Ingredient Sellers. Removed doubled seller from Morocc [Lupus]
+ * Added an ingredient seller to Morroc, thanks to Muad_Dib [MasterOfMuppets]
+ * Fixed the names of the Lighthalzen and Einbroch refiners, thanks to Muad_Dib [Kargha]
+04/22
+ * Fixed some typos in the mage quest thanks to decayed.cell [Playtester]
+04/21
+ * Fixed Chung E / Green Maiden spawn in Louyang [Playtester]
+04/20
+ * Added missing Kafra in Prontera [Playtester]
+ * Hopefully also fixed the custom job master [Playtester]
+ * Fixed it again, better use constants [Playtester]
+ * Fixed Rebirth script not working for some Knights and Crusaders [Playtester]
+ - needs some testing!
+ * Fixed Taekwon quest obviously never working [Playtester]
+ * Updated Job Quests of Taekwon, SG, SL (all thanks to Celestria) [Lupus]
+ They have oficial sprites, actions. But some dialogs are made up. ^_-
+ - Don't forget to update your Global_Functions.txt !
+04/19
+ * Whoops, eAAC members made a mistake with scripts and I didn't notice => Quest Warper.txt [erKURITA]
+ * Added quest_warper.txt and banker.txt to npc\customs\eAAC_Scripts. [erKURITA]
+04/18
+ * Fixed custom Jobmaster not rebirthing Crusaders on a Pecopeco [Playtester]
+04/16
+ * Updated lhz_fild03 according to info from kRO thanks to RockmanEXE [Playtester]
+ * Whoops, forgot to remove clone_arena from the scripts_eaac.conf. [erKURITA]
+ * Enabled import: line on scripts_main.conf for scritps_eaac.conf. The scripts
+ are disabled there anyway.... [erKURITA]
+ * Commited musashiden's kiel dungeon warps [erKURITA]
+ * Commited musashiden's Lighthalzen fixes [MasterOfMuppets]
+ * Fixed aldeg_cas04 random warp [Playtester]
+ * Fixed merchants/grandpa_pharmacist.txt thanks to KarLaeda [Playtester]
+ * Removed Cube room warps from the quest script [Lupus]
+04/15
+ * Fixed Mobster's OnDead event [Playtester]
+ * Implemented Musashiden's Lighthalzen npcs - Part 2 [Shadow]
+ * Renamed Mastersmith Howard to Whitesmith Howard in the spawn files [Playtester]
+ * Implemented Musashiden's Lighthalzen npcs [MasterOfMuppets]
+ * Fixed Einbroch & Archer Village Guide bugs, thanks to NeatElves 4 pointing the bug [Lupus]
+ * Modified the Cloth Dyer so that he refuses to dye your clothes [Playtester]
+ * Added weight checks to merchants/refine.txt thanks to Neouni [Playtester]
+ * Fixed names of Lighthalzen mobs in spawn files [Playtester]
+ * Changed Juperos spawns according to info provided by Tharis [Playtester]
+04/14
+ * Added quest_warper.txt to eAAC_Scripts. Deleted the sql and txt versions
+ of the disguiser and added a merge of both. Deleted clone_arena.txt.
+ Updated global_functionsKE.txt of Skotlex. [erKURITA]
+ * Added some more Kiel warps thanks to Celestria [Playtester]
+ * Cleaned up eamobs [Playtester]
+ - deleted all files that have no difference to mobs
+ - scripts_eamonsters.conf now links to mobs for those cases
+ * Added a temporary script to enter Gefenia for some Zeny [Playtester]
+ - will be replaced once we have finished The Sign Quest
+04/13
+ * Finally added the missing Xmas spawns in Geffen Field [Playtester]
+ * Added a few missing warps in Lighthalzen, thanks to Kargha. [MasterOfMuppets]
+ * Some more crap NPCs implemented in Lighthalzen, thanks to Kargha [MasterOfMuppets]
+ for scripting them.
+ * Implemented some crap NPCs in Lighthalzen [MasterOfMuppets]
+ * Fixed SOME bugs in Hugel.txt, hu_guide.txt. thanks to joshuaali [Lupus]
+ Guys, do always check the scripts before committing V_V'
+04/12
+ * Added up the locations but temporal names of Poring track npcs. Will be worked
+ on over time. [erKURITA]
+ * Fitted the many lines into 1 or 2, and corrected some typos on most of
+ the npc\guides. Visual update to the guards, for short. [erKURITA]
+ * Fixed a typo in quests/juperos.txt [Playtester]
+ * Fixed Bio Lab spawns to official jRO [Playtester]
+ - Also included custom spawns for Bio Labs
+ (Floor 1 can't be accessed directly so it should be harder)
+ * Added some Kiel building warps thanks to Celestria [Playtester]
+ * Implemented the Juperos quest partially. [MasterOfMuppets]
+ - Also fixed the spawns there and in biolabs a bit.
+ * Fixed a few warps warping you back (they've been there for long =X). [erKURITA]
+ * Corrected some errors in cities/hugel.txt and guides/guides_hu.txt
+ [Foruken]
+04/11
+ * Updated mapflags (missing hugel, job quest map, etc)
+ * Changed item description in Sage Skills Quest (Blank Script -> Empty
+ Script) thanks to MeL [Foruken]
+ * Updated a couple shops of Hugel, plus added the firecracker shop on Hugel. [erKURITA]
+ * Added Gunslinger quest npc and shops on que_ng.gat. Same map for Ninja's
+ job quest. [erKURITA]
+ * Added warps for que_ng.gat. [erKURITA]
+ * Also added temporal locations for the npcs inside. [erKURITA]
+ * Fixed an back warp on hu_in01,15,70 (walk to the warp, then warps you back) [erKURITA]
+ * Moved and finished Hugel's guard (who happens to be a granny) [erKURITa]
+ ~ All info given by RockmanEXE :P
+04/10
+ * Updated refiner, thx2 Coltaro [Lupus]
+04/08
+ * Fixed lighthalzen mobster a bit? [Vicious]
+ * Fixed job changer? [Vicious]
+04/04
+ * Re-fixed looping warps of Lutie village, thanks to Dr.Evil [Lupus]
+ * Added missing Warpra Agent to Hugel. Thanks to Justin84
+ * Fixed typo in Falcon Renter. Thanks to Larry
+04/03
+ * Fixed Treasure Chest bug (They used to disappear on each reboot) [Lupus]
+ - Updated Novices Castles Warper restrictions: TK,High Classes over 89 lvl;
+ Added more buffs restrictions
+04/02
+ * Added missing kafra in Lighthalzen, thanks to Muad_Dib [Vicious]
+ * Fixed baby job change, thanks to Larry [Vicious]
+ * Moved the spawn update to eamobs (of course the custom spawns where not changed... much :P) [Poki#3]
+ * Fixed sage script? [Vicious]
+ * Fixed more of wrong female thief bug spawn [Vicious]
+ * Umbala Bungee Jump - Warps you to Niff with 1HP no watter what [Lance]
+03/30
+ * Fixed refiner full price display, thanks to S4Sly [Vicious]
+ * Training ground giving 5 kafra storage/teleport pass [Vicious]
+ * Revised all the spawns based on Emperium.org. [Poki#3]
+ - Only omobs got changed. eamobs is like it was.
+ - I unified the formatting used for the map names. Please use that in future field expansions.
+03/27
+ * Fixed the infinite warp looping between Lutie and Lutie field 01 [Skotlex]
+03/23
+ * Updated Rebirth NPC/functions to use constant. Might have broken it, so do report [Vicious]
+03/21
+ * Improved payment healer. [Lance]
+03/20
+ * Added temp Job quests of Ninja and Gunslinger, thx2 Gywall [Lupus]
+ * Fixed endless warping loops, thanks to Manipulator [Lupus]
+ * Fixed possible Castle Economy investment overflow with Emsolute Develop learnt [Lupus]
+ * Removed Berserk Potions from all shops, but Comodo [Lupus]
+03/19
+ * Fixed Female Thief Bug in novice land. [Vicious]
+03/17
+ * Added attachnpctimer to the Juperos elevator script. [Skotlex]
+03/13
+ * Updated the jobmaster custom script to properly use Job_* constants
+ rather than hardcoded numbers. Thanks to Pxxx for doing the update.
+ [Skotlex]
+03/12
+ * Amatsu Field. Replaced Hydras with official G_HYDRA (w/o drops) [Lupus]
+03/11
+ * Updates of eAAC scripts [MasterOfMuppets]
+ * Added another weapon dealer to Einbroch, thanks to Muad_Dib [MasterOfMuppets]
+ * Updated, fixed Custom Thanatos Statues Quest, thx2Justin84 for help [Lupus]
+03/10
+ * Fixed Turtle Island quest, got rid of 2 useless variables [Lupus]
+ * Added 3 Weapon shops, thanks to Muad_Dib. Still need SPRITES ID [Lupus]
+ ^^^^^ could we just add spr ID's into CONST.txt?
+03/07
+ * Fixed some reference to old locations of the Blacksmith NPC's, Thanks to Neouni. [Poki#3]
+03/06
+ * Fixed Thanatos warps: tha_t06,tha_t06a,tha_t06b,tha_t05a thanks to Justin84 [Lupus]
+ - Added Temp Thanatos Keys solution (more close to official than that Thanatos Statues Quest)
+03/05
+ * Used "Laboratory Passport" everywhere in the cube room quest, else how can ppl guess the name? xD [DracoRPG]
+03/02
+ * Added Skotlex's updated marriage script [Vicious]
+ * Added eACC scripts, thanks to davidchak [Vicious]
+02/27
+ * Fixed a flag direction in front of Yesnelph, thanks to Playtester [DracoRPG]
+ * Fixed wrong Female Thief Bug spawns in Culvert, thanks to happylight [DracoRPG]
+ * Fixed a typo in Assassin job change test, thanks to Spiritual_Kid [DracoRPG]
+02/26
+ * Splitted 2nd job skills quests into several files and fixed grammar [DracoRPG]
+ * Rewrote the repairmen function and removed the Steel cost [DracoRPG]
+02/23
+ * Fixed item name in Cube Room Quest. [Poki#3]
+ * Changed Light Dun Spawn numbers a bit (Gemini is a Mini-boss) [Poki#3]
+ * Changed "Virus" to "Anopheles" [Poki#3]
+02/21
+ * Fixed wrong indication of Repairsman, thanks to NeoSaro [Lupus]
+02/17
+ * Added Kafra Storage Password (some official severs use it as an additional protection) [Lupus]
+ - Read functions_kafras.txt comments if you want to disable this feature
+02/16
+ * Fixed Jawai bug and a typo, thanks to theultramage [Lupus]
+02/14
+ * Added a new Fruit Merchant in Hugel. [Poki#3]
+ * New, updated st.Valentine Event with a nice quest and EXP bonuses ^_- [Lupus]
+02/13
+ * Updated the eA custom spawn sets from Playtester: Juperos lv1, Glast heim
+ Sewers/Underground and Geffen dungeon lv3. [Skotlex]
+02/09
+ * Fixed another issue of Cube Room Quest [Lupus]
+ - Fixed event_6_new_hats.txt wrong ID, thanks to phabyo
+02/07
+ * Added missing semicolons in the valentine's day event and disabled the Dog's year event. [Zephiris]
+ * Added a custom quest for Jewel Case for 99 Base Level Players of 2nd Class [Lupus]
+ * Fixed the spawns that where using the no exp/drop version of Male Thief Bug (Thanks to irmin) [Poki#3]
+02/05
+ * Lighthalzen cube quest: Fixed password bug, fixed endless item exploit, some typos [Lupus]
+ * Added yuno_in02 into noteleport/nomemo, etc map flags. It spoils the quest [Lupus]
+ There's 1 missing mapflag: 'noreturn' (you may use butterfly wings to escape)
+02/03
+ * Implemented the cube room quest [MasterOfMuppets]
+ * Temp measure to stop exploit in novice ground. [Vicious]
+01/31
+ * Fixed another bug in the monk quest. [Zephiris]
+01/29
+ * Updated the Juperos dungeon spawns according to ROmap. [MasterOfMuppets]
+01/28
+ * Fixed Warp to Abbys Lake. [Poki#3]
+ * Removed dup warps around Einbroch. [Poki#3]
+ * Fixed ein_fild04 -> ein_fild05 warp. THanks to Playtester [Poki#3]
+ * Re-wrote the Dye NCP (original, not the custom one) [Poki#3]
+ - I hope there aren't any bugs in it. The Jobs are sorted based on the file names
+ that the client reads.
+ * Fixed the Warper [Poki#3]
+ * Fixed Hugel warps (htere weren't any TABs) [Lupus]
+ * Added Event: Eastern New Year 2006 The Year Of The Fire Dog (28-29 January 2006) [Lupus]
+01/27
+ * Added birkiczd's Odin temple warps. Move the Saylor from hugel.txt there. [Poki#3]
+ * Rewrote Comodo Guides to use functions. Thanks to Daegaladh for pointing it out [Poki#3]
+ * Fixed Einbroch a bit... I think the Factory Quest should be moved from [Poki#3]
+ Einbroch.txt to quests_einbroch.txt...
+ * Added monster spawns for Kiel dungeon, they're commented out for now though. [MasterOfMuppets]
+ * Added a new global function "F_ItemName" to print expanded item name [Lupus]
+ such as '+9 VVS Wind Knife'
+ - You can use "F_RandMes" to pick a random number form list:
+ set @RandomItemIDfromList, callfunc("F_RandMes",4,1129,1222,1163,1357);
+01/26
+ * Uploaded Er_Maqui's fixes to Hugel Warps. [Poki#3]
+ * Updated the airship to take the route Hugel->Einbroch->Lighthalzen->Yuno [MasterOfMuppets]
+ I also fixed the colors in the broadcasts a bit.
+ * Fixed Bio Lab Spawns a bit and made them more moby. [Poki#3]
+ * 1.2 fixed hugel10 warp [Lupus]
+ * A small fix to the louyang shouting quest [MasterOfMuppets]
+ * Some Hugel warps fixes by Dr.Evil [Poki#3]
+ * Fixed cord of the Sailor in Hugel, thanks to Er_Maqui for pointing it out. [Poki#3]
+ * Applyed Blackthunder's fixes to rpsroulette.txt [Poki#3]
+ * Rewrote the Warpa. Still have to do the Level select thingy. [Poki#3]
+ * Fixed Juno > Yuno in Airship. [Poki#3]
+ * Fixed Shwaltzvalt > Schwarzwald in Kafras. [Poki#3]
+ * Changed sprite of the Einbech Kafra. [Poki#3]
+ * Disabled the "Entrance" to lhz_dun01. This should be only an Exit. This warp doesn't exist on kRO. [Poki#3]
+ * Added Lighthalzen Refiners (Custom names again ^^;) Official location and sprite. [Poki#3]
+ * Fixed some shops based on kRO shots. Lighthalzen NPC's, Prontera Food Seller, Payon shops. [Poki#3]
+ * Added some Hugel NPC's. Cords and Sprites are 100% Correct, but the names are not. [Poki#3]
+ Plus no one knows what the NPCs are talking right now :/
+ * Added Hugel Shops. [Poki#3]
+ * Removed the Custom Warper to Odin. Hugel has a more official one. [Poki#3]
+01/24
+ * Fixed Yuno Field 10. Mob amount sugested by Playtester, made by Poki#3 [Komurka]
+ - Moved some NPCs to Einbroch and Hugel - more info can be found here http://eathena.ws/board/index.php?showtopic=67631,
+ made by Poki#3
+01/23
+ * Minor Valkirie fixes, thanks to Xeronage [Lupus]
+ - Updated Novices Guild Castles Warper NPC
+01/21
+ * Added missing close to Einbroch script [Komurka]
+ * More of episode X.4 replacement, done by Poki#3 [Komurka]
+ * Added a missing warp from Jawaii Tawern to Jawaii thanks to Misao [Komurka]
+
+01/20
+ * Dr Evil's Yuno -> Yuno Field 05 warps update [Lupus]
+ * Fixed minor typo in alde guide. [Kayla]
+01/18
+ * Episode X.4 replacement, done by Poki#3 [Vicious]
+ * Part 1 of Hugel monster replacement, done by Poki#3 [Vicious]
+ * Added a temp warper to Odin's Temple by birkiczd [Lupus]
+ - fixed Payon <- Payon Field 08 warp coords
+01/16
+ * Corrected warp 'lhz013a' in Lighthalzen. Added a missing check and fixed a LOT of Engrish in the Monk Job Quest. [Zephiris]
+ * Corrected the warp to board the airship in Einbroch, and the warp inside the northwest building in Lighthalzen. [Zephiris]
+ * Updated Ayothaya Quest close to the official. Thanks to birkiczd
+ - Also optimized it again, remove unused global variable [Lupus]
+01/12
+ * Small fix in SL and SG quest [Komurka]
+01/11
+ * Fixed typos of Crusader JQ, added TK/SG/SL to custom/jobmaster thanks to Haplo [Lupus]
+ * Updated Valhalla a bit. Soon adding more elegant way of saving Quest Skills (including the new quest skills) [Lupus]
+01/09
+ * Fixed scripts that were reported in the forum. [Vicious]
+01/08
+ * Changed the name of Chung E to Green Maiden in the spawn files [MasterOfMuppets]
+ * Changed some Zherlthsh to Zealotus as it is in iRO [MasterOfMuppets]
+ * Added exp bonus to the factory quest in Einbroch, thanks to a [MasterOfMuppets]
+ Korean fansite
+01/07
+ * Updated warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+ * Disabled X-Mas Ring quest [Vicious]
+01/05
+ * Disabled X-Mas event [Vicious]
+ * Corrected the coordinates for the NPC "Neris" in yuno_in03 [Zephiris]
+ * Multiple tiny fixes that were going ignored on the forums... [Skotlex]
+01/02
+ * Removed a duplicate warp in warp/cities/payon.txt [MasterOfMuppets]
+12/31
+ * Added wand of hypnotist to the Lighthalzen weapon shop [MasterOfMuppets]
+12/30
+ * Fixed missing //, found by map_index. [Vicious]
+ * Added a missing label (M_0) that was causing people to freeze when viewing the city list from "Miss Yoon" [Zephiris]
+12/28
+ * Karachun Event: Readded Mdef +1 and Luk +1 to Santa's Hat [Lupus]
+ * Fixed juicer exploit due to typo (ipnut) o.O [Lance]
+12/27
+ * Added Soul Linker / Star Gladiator temp job quests. Accordingly updated Taekwon Job NPC [Lupus]
+12/26
+ * Removed duplicate job_hunter.gat mapflags, by Harbin [LuzZza]
+ * Changed remaining Dokkaebi Items into Dokebi, by Harbin, reported by Haplo [LuzZza]
+ * Changed Dokkaebi to Dokebi, by Harbin [Vicious]
+ * Updated Culvert Recruiter to allow novices to go to Culvert
+ & Al De turbo track warps by Harbin [Vicious]
+ * Added missing cutin's in Priest Quest [Komurka]
+12/23
+ * Small fix (Falcon Taming -> Falcon Mastery) [Komurka]
+ * Desert Wolf Babe -> Baby Desert Wolf (iRO), thx to Poki#3 [Komurka]
+12/22
+ * Added a Bartender NPC in morroc, thanks to Persian69 [Vicious]
+
+ * Fixed X-Hairpin ingredients, thx2 Komurka [Lupus]
+12/21
+ * Fixed Hugel warps, thanks to... ppl.. ^^; [Vicious]
+ * Fixed Ayothaya warps, thanks to Sir_Loon [Lupus]
+12/19
+ * Added Sara-chan's corrections to Hugel warps. [Valaris]
+ * Added Garden City Hugel city and field maps and warps (thanks to Sara-chan ^_^) [Valaris]
+ * Added a custom event/quest 'Karachun' (for magic Christmas rings) [Lupus]
+12/17
+ * Fixed more Monsters Museum typos, thx 2Haplo. Also fixed some monsters names [Lupus]
+12/16
+ * Updated Chef Hat quest items Feather 300->330. Thanks to Ishizu-chan [Lupus]
+ * Reversed custom Wizard Hat quest due to Treasure Box drop changes [Lupus]
+ * Updated exploitable custom quest for Berzebub Card [Lupus]
+12/15
+ * Added kobold leader to geffen feild 12 in eamobs and omobs. [Kayla]
+12/14
+ * Updated wedding costs to offical values (600k for groom, 500k for bride). Deleted
+ npc/other/wedding.txt (very old). Enabled marriage.txt by default. [Kayla]
+12/13
+ * Fixed a Lighthalzen warp warping you to a non-walkable tile [MasterOfMuppets]
+12/12
+ * Added 4 functions to spiff up your dialogues: F_Hi, F_Bye, F_RandMes, F_SexMes [Lupus]
+ - Moved jobName to Global_Functions.txt
+ * Fixed Monk quest [Lupus]
+ * Fixed Bard Quest, added check for exploits, added a new flower 'Izidor' [Lupus]
+ thanx to VicHoX for pointing out the bug. Now RTFM ^_-
+12/11
+ * Fixed some typos, thanks to Haplo [Lupus]
+ * Also fixed 'Lutie quest reset' bug [Lupus]
+ * Fixed Bard & Lutie quests passable during the X-Mas Event. thanks Zephiris for pointing it out [Lupus]
+ * Revised again all the quests, found and fixed 2 bugs, also optimized conditions [Lupus]
+12/10
+ * Added the Lighthalzen Kafras, thanks to Vicious_Pucca for information. [MasterOfMuppets]
+ * Added the Homunculus shop in Aldebaran, it's commented for now until [MasterOfMuppets]
+ we get homunculuses working.
+ * Fixed, optimized 2nd Class Skills Quests, [Lupus]
+ - removed Elemental Potion Guide from Alchemist NPC, due to new Reddozen's quest
+12/09
+ * Cleaned up custom folder, lots of duplicate NPCs. [Kayla]
+12/08
+ * Updated 2nd class quest skills NPCs, made by Reddozen and battousai90. [Vicious]
+ * Organized Jobs folder a bit for Expended Classes. [Vicious]
+ * Fixed dialouge in blood_bandana quest. Thanks Razor87 for the report. [Kayla]
+12/07
+ * Added the New Novice Training grounds, beware of potentional bugs and [MasterOfMuppets]
+ faulty dialogues. I kept the old script as OLDnovice.txt just incase. Thanks to Dr.Evil
+ for doing most of the work.
+ * A small fix to the Louyang script. [MasterOfMuppets]
+12/05
+ * Fixed a typo in Aldebarran Guard "Hace a name". eAOS Bug Report [Kayla]
+ * Fixed another small screw-up in the color codes of the Glastheim Bulletin Board,
+ eaos Bug Report[Kayla]
+ * Fixed a typo in NPC:Raust, eAOS bug report. [Kayla]
+ * Fixed a typo in NPC:Gushenmu, eAOS bug report. [Kayla]
+ * Added a nice custom Perchik's quest ** SIGN YOUR ITEMS ** [Lupus]
+ Now your players can sign their rare headgears or weapons with their own name
+12/04
+ * Fixed Sage Job Quest bug, thanks to Lorky [Lupus]
+12/02
+ * Removed two duplicates of each gonryun dungeon level in nomemo.txt [MasterOfMuppets]
+ * Fixed a small screw-up in the color codes of the Glastheim Bulletin Board, [MasterOfMuppets]
+ thanks to Playtester.
+ * Added some Christmas Orcs to event/xmas.txt, thanks to Playtester [MasterOfMuppets]
+ - Christmas Goblins were added to yuno_fild09 as well.
+ - Enabled the christmas event by default as it has started in kRO sakray
+12/01
+ * The bio lab dungeon bosses will now only spawn one at a time, [MasterOfMuppets]
+ they are randomly selected.
+ * Removed some duplicate warps in Einbech [MasterOfMuppets]
+ * Fixed tab on pvp_noguild, thanks to NeoSaro [Vicious]
+ * Added the noteleport and nomemo mapflags to the lzh_in-maps [MasterOfMuppets]
+ * Implemented k3dt's guild flag exploit fix [Vicious]
+11/30
+ * Updated Hugel field spawns, thanks to battousai [MasterOfMuppets]
+ * Made all (Desert Wolf Puppy / Desert Wolf Puppy) -> Desert Wolf Babe [Lupus]
+ the same thing is for Savage Babe. Also fixed eggs names
+ * Fixed typo in nopenalty. Umatsu? XD [Vicious]
+ * Fixed a minor screw-up in airships.txt [MasterOfMuppets]
+ * A small fix to the Divorce NPC in other/wedding.txt, it should [MasterOfMuppets]
+ now allow people who didn't marry with the other/wedding.txt to divorce as well
+ * Commented the warp from gef_dun02 to gef_dun03, gef_dun03 [MasterOfMuppets]
+ is an event map >.<
+ * Commented "Traveler" out as it is not needed/official [Vicious]
+11/29
+ * Fixed a Payon dungeon warp that was warping to a non-existant tile [MasterOfMuppets]
+ * Updated the color codes of louyang.txt a little
+ and fixed the shouting quest to broadcast green text. [MasterOfMuppets]
+ * Fixed quest_lutie, thanks to Manipulator [Vicious]
+ * Updated cooking NPC, thanks to battousai90 [Vicious]
+11/28
+ * Updated the spawnpoint in Niflheim with Bungy jump [Vicious]
+ * More fixes... some things can be fixed by the core. Has to make something [Lupus]
+ * Massive anti-exploit fix of quests. 2B Continued [Lupus]
+ * Updated Umbala. Fixed Umb.Lang.Quest items names. [Lupus]
+ Now you can go to Niflheim trough Jumping Bungy Area.
+11/27
+ * Added some more npcs to Einbroch and removed some warps [MasterOfMuppets]
+11/26
+ * Added eamobs containing fix for exploitable spawns. Switch is in scripts_main.
+ The eaMobs is suggested for smaller servers but mobs is official. [Kayla]
+ * Re-Enabled city cleaners (why was this turned off?) [Kayla]
+ * Updated mobs to prevent exploitable spawning (AMs, Seals). Thanks Redflame. [Kayla]
+ * Updated detective hat to ask for the correct items [Kayla]
+ * Fixed 2 bugs in New Hats_6. It deleted 100 Amultets instead of 10 and only 1 Steel instead of 25 [Lupus]
+ thanks 2Yun for Amulets bug.. so I found the similiar one with steel 8) We have to recheck all scripts 8)))
+ * Fixed some mapname typos in mob spawn scripts (mostly Prontera and Geffen fields) [Lupus]
+ * Spiffed up 6_new_hats custom quest NPCs coords [Lupus]
+ * Added new cities into warper & warper2 [Lupus]
+ * Removed some buggy custom quests. Those items has appeared in recent official quests [Lupus]
+ e.g. Excalibur, some hats, etc
+11/25
+ * Added a temp shop in Yuno to sell blank scrolls, thanks to reddozen [MasterOfMuppets]
+ * Added the Einbech Kafra [MasterOfMuppets]
+ * Added Thanatos entrance warp. Thanks to Justin84 [Lupus]
+11/23
+ * Fixed santa goblin spawn locations in event/xmas.txt [Kayla]
+ * Temp fix for Kafra functions. New eA script engine has new CLOSE2 command [Lupus]
+ so some old scripts were... 'stuckable' 8)
+ * Updated Thanatos & Turbo Trach warps, thanks to Justin84 [Lupus]
+11/22
+ * Kafra fixed: Now Baby Merchant can pass Merch Job Quest w/o probs [Lupus]
+11/20
+ * Fixed a major problem in event/xmas.txt [MasterOfMuppets]
+ * Readded Lord of Death to Niflheim [MasterOfMuppets]
+ * Fixed a typo in cities/ayothaya.txt, nothing big [MasterOfMuppets]
+ * Changed the Einbroch area spawns a bit using iRO info from emperium.org [MasterOfMuppets]
+11/18
+ * Added the last of the bulletin boards [MasterOfMuppets]
+ * Alberta, fixed bugs [Lupus]
+ * Typos and minor fixes of Assassin JQ and Clothes_dyer. thanks to momotaro_master & WhiteLight for info [Lupus]
+ * Added missing dialogues into Cooking Quest. Fixed a bug when you stuck if u haven't bought [Lupus]
+ cooking sets before getting the quest, some optimizations, etc. Now fully workign 8)
+11/17
+ * Fixed custom MVP arena warper. R4000! [Kayla]
+ * Added more Food Sellers (for Cooking Quest). Some of them have temp sprites and coords [Lupus]
+11/16
+ * Fixed the payon guide to give the right description at label L_Dungeon [MasterOfMuppets]
+ thanks to muad_dib
+ * A minor fix to a screwup in the lvl 4 weapon quest, thanks to vicious_pucca [MasterOfMuppets]
+ * Fixed the lvl 4 S grade weapon quest only giving 8 kinds of weapons instead [MasterOfMuppets]
+ of 16, thanks to Gepard for pointing it out.
+ * Minor fix of SN Kafra rent service. It firstly checks for Push Cart skill and
+ then gets money [Lupus]
+ * Fixed more bugs (wrong ID, wrong labels, missing text) in Cooking quest. [Lupus]
+ Now you can pass loaned books to other people but have to return them to
+ the Chef, before loaning another one. Added Leather Pouch into item_trade.txt
+ it's a quest item, you can't sell/pass it to the others. It should be done
+ with similiar quest items, too.
+11/15
+ * Updated Cooking Quest, according to Reddozen's changes [Lupus]
+ * Added missing cities into noBranch / noIcewall mapflags files [Lupus]
+ * Prontera Maze mob spawn typo fixed, thanks to noobs [Lupus]
+ * Cooking quest: Fixed wrong label [Lupus]
+11/14
+ * Added 1 Kafra to Payon, fixed Save menu & coords. Thanks to Justin84 [Lupus]
+ * Fixed Mixture Quest [Lupus]
+ * Fixed the Universal Renter not correctly checking for Riding chars. Now
+ also rents Carts to S. Novices [Skotlex]
+ * Fixed some cooking quest bugs [Lupus]
+ * Updated Lighthalzen Dungeon warps. thanks to Justin84 [Lupus]
+11/10
+ * Updated swordsman_skills.txt to allow any swordsman subclass to be able to get the [MasterOfMuppets]
+ skills as well, thanks to vicious_pucca.
+ * Fixed npc sprites for the cooking quest npcs, thanks to Silent for the sprite IDs [MasterOfMuppets]
+ * Added Cooking Quest. Thanks to Reddozen [Lupus]
+ * Added reddozen's fix of Alchemist.txt (Materials / Manuals) [Lupus]
+ * Fixed Juperos Elevator, coords of Twin Tower NPC, Mr.Smile. Thanks to Justin84 [Lupus]
+ * Added more quests for 2nd Class Quest Skills [Lupus]
+11/09
+ * Added an incomplete sign quest for backup/storing purposes, use it at your own risk! [MasterOfMuppets]
+ * Remove a few message boards from msgboard.txt to not conflict with some [MasterOfMuppets]
+ sign quest npcs.
+ * Added two warps in prontera for preparing the sign quest [MasterOfMuppets]
+ * Added temp skill quests for all complete 2nd Class Quest Skills [Lupus]
+11/08
+ * A lot of typos fixed in the lvl 4 weapon quest, thanks to Silent. [MasterOfMuppets]
+11/07
+ * Added the lvl 4 weapon quest, thanks a lot to Vicious_pucca for converting it from [MasterOfMuppets]
+ aegis format to eA format. a lot of thanks to reddozen as well for fixing bugs.
+ - Also two quest related NPCs was added to Geffen and Morroc
+ * Fixed a misleading typo in quest/monstertamers.txt, thanks to vicious_pucca [MasterOfMuppets]
+ for pointing it out.
+ * Updated the spawns of Santa Porings and Antonios in event/xmas.txt [MasterOfMuppets]
+11/06
+ * Big update to town guards. Changed according to how it is on iRO [MasterOfMuppets]
+ thanks to Muad_Dib. The following towns had their guards updated:
+ - Alberta
+ - Aldebaran
+ - Comodo
+ - Izlude
+ - Payon
+ - Prontera
+ * Added Yuno and Lighthalzen Airports. Thanks to Justin84 [Lupus]
+11/05
+ * Fixed a small bug in the jawaii warper, thanks to reddozen and Silent [MasterOfMuppets]
+ * Fixed a small typo in Alberta's weapon shop, thanks to reddozen for the fix [MasterOfMuppets]
+ * Added warps to the Izlude Airship, thanks to Justin84 [Lupus]
+ * Fixed both warper&warper2 Izlede location was ovelapped with BB, thanks to Justin84
+ - fixed wrong header of moc_fild19 BB, thanks to Justin84
+11/04
+ * Updated Geffenia's monster spawns [MasterOfMuppets]
+ * Fixed flags in geffen town (whoops I worked too fast :-x) [Kayla]
+ * Removed Surrender Abbility in guild manager (was 100% custom) [Kayla]
+11/02
+ * Removed flags around fountain in the top of Prontera guild map [Kayla]
+ * Added a missing warp in Jawaii, thanks to Zoc [MasterOfMuppets]
+10/31
+ * Finished the Einbech town script, thanks to muad_dib [MasterOfMuppets]
+ * Added the official Jawaii script, information from iRO [MasterOfMuppets]
+ - Beware of potentional bugs
+ - Added the divorcer as well
+ * Updated Jawaii's warps [MasterOfMuppets]
+ * Added Venom Knives into da shops [Lupus]
+10/30
+ * Added Wild roses to spawn in a few more towns [MasterOfMuppets]
+ * Added monsters spawns to Jawaii [MasterOfMuppets]
+10/29
+ * A small fix to the obb quest, thanks to marquis007 [MasterOfMuppets]
+ * Fixed the flag guild script. Now one can only flag in using the flags outside the castle. [Kayla]
+10/28
+ * Fixed Sage Job Quest [Lupus]
+ - Its questions should be revised, especially about other NPC names
+ * Added new Prontera Kafra's coords into mini-map location info [Lupus]
+ * Updated North Prontera Kafra, thanks to Vicious_Pucca [Lupus]
+ * Fixed Prontera Kafras not teleporting to Alberta [Lupus]
+ * Added a missing Guide to Einbrochm thx2 Justin84
+ * Updated all guides, fixed common guide names for correct duplicate() [Lupus]
+10/26
+ * Added some more Einbech npcs, thanks to Muad_Dib of Prometheus [MasterOfMuppets]
+ * Added noteleport to Gefenia maps [MasterOfMuppets]
+ * Added more Juperos Warps and Scripts by Justin84 [Lupus]
+ * Re-enabled main Lighthalzen Entrance warp [Lupus]
+10/25
+ * Updated Lutie Quests. Sloppy copy and paste job. Vending Machine man now knows his own items. [Kayla]
+ * Updated Indian Hairband Quest. It asked for hairband, should have been Indian Filet (5010) [Kayla]
+10/24
+ *Added real spawns for Thanatos and Abyss. [Nexon]
+10/23
+ * Updated WoE (Guilds War) scripts to work correctly with /breakguild [Lupus]
+ They should abandon occupied castles of the broken guild
+10/22
+ * Added Abyss warps and a few NPC's. [Nexon]
+ * Added lighthalzen security guard/ security event quest. [Nexon]
+10/19
+ * Thanks to Justin84:
+ - Updated Thanatos Tower warps, added NOTELEPORT to some thanatos tower levels
+ - Fixed custom WoE Setter (break; -> end;)
+ * Updated some Airport warps as provided by Justin84 [Skotlex]
+ * Updated and fixed Sage Job Quest [Lupus]
+ * Fine-tuned the warp in Thanatos lv11 (tha_t11.gat,92,32 ->
+ tha_t11.gat,93,36) as pointed out by erKURITA. [Skotlex]
+10/17
+ * Increased mob count in Lighthalzen Lv3 as requested by Vicious. [Skotlex]
+ * Added the noteleport mapflag to Amatsu Dungeon lvl 1, thanks to frugal [MasterOfMuppets]
+ *Fixed a lot of scripts that may have been exploitable, fixed typos, and optimized a bunch of other scripts. Thanks to Silent. [Nexon]
+10/16
+ * Fixed Einbroch Airport, Lighhalzen Dungeon warp. Thanks to Justin84 [Lupus]
+ * Fixed Thanatos Tower Statues quest bug, thanx 2 Dr.Evil for info [Lupus]
+ * Enabled lighthalzen guards quest, updated lighthalzen warps, thx2Justin84 [Lupus]
+10/15
+ * Added in lighthalzen guards quest. Not implemented until the entire quest has been finished. [Nexon]
+10/14
+ * Increased mob count in lhz dun 03 as pointed out by Viccious Pucca. [Skotlex]
+ * Changed some item names to the iRO ones in a quest dialog, thanks to Komurka. [MasterOfMuppets]
+10/13
+ * Updated Thanatos Tower warps, added custom Thanatos Tower Statues quest by Bibilol & Moryagorn [Lupus]
+ * Moved a few misplaced npcs from Einbech to Einbroch [MasterOfMuppets]
+ * Added Bacsojin and Chung E to Louyang dungeon, thanks to Tron and Dr. Evil [MasterOfMuppets]
+10/12
+ * Added Muad-dib's Einbroch Airport, converted by Dr.Evil [Lupus]
+ * Added secret Lighthalzen dungeon entrance point. Provided by Justin84 [Lupus]
+ - It's commented out yet. Could someone investigate it?
+10/11
+ * Fixed Zealotus Mask NPC (->Piece of Black Quartz) thanx to vicious_pucca for info [Lupus]
+ * Added some Einbech NPCs [reddozen]
+ * Added some Einbroch NPCs [MasterOfMuppets]
+ - fixed alchemist.txt (Bowl issue)
+ * Added 2 Kafras to Einbroch (thanx to MasterOfMuppets 4info), fixed NPC coords of Guide [Lupus]
+ * Fixed Lighthalzen Dungeon Entrance conditions check, thanx to Daegaladh [Lupus]
+10/10
+ * Updated Geffenia spawns, thanks to Master of Muppets [Skotlex]
+ * Yet again fixed some missing tabs in Enbech, Enbech/Einbroch Guides [Luups]
+ * Fixed missing tabs in Enbech Town. [Mass Zero]
+ * Added Einbech Guides, thanks to Muad_Dib and MasterOfMuppets. [Mass Zero]
+ * Added Einbroch Guides, thanks to Reddozen and MasterOfMuppets. [Mass Zero]
+ * Added Einbech warps, thanks to Muad_Dib. [Mass Zero]
+ * Added Einbech Town, thanks to Muad_Dib and MasterOfMuppets. [Mass Zero]
+ * Changed 'ends' into 'breaks' in the Wandering Poet NPC, thanks to IVBela. [Mass Zero]
+10/08
+ * Fixed Ayothaya town script, thanks to Poki#3 [Lupus]
+ * Total warps update of Hidden Temple (Forest Labyrinth), thanks to jA and Dr.Evil for info [Lupus]
+ * Updated Payon and Morroc (Jellopy->Scell) shops, thanks to Muad-Dib and andz [Lupus]
+ * Added Lighthalzen,Einbroch,Einbech shops. Updated Prontera,Morroc,Payon shops [Lupus]
+ - Thanks to Muad-dib, Nexon, andz, MasterOfMuppets
+ * Due to added Magic Scrolls drops... finally removed the temp shop [Lupus]
+10/07
+ * Added more shops. Thanks to Vicious_Pucca. [Nexon]
+ * Added more Einbroch shop NPC's. Thanks to MasterOfMuppets and Vicious_Pucca. [Nexon]
+ * Fixed Niffelheim warps. Thanks to MasterOfMuppets. [Nexon]
+ * Added Lighthalzen shops. Thanks to Maud_Dib. [Nexon]
+ * Returned back Mr.Smile quest (it's still up in kRO) [Lupus]
+ * Updated official Bard Job Quest: Flowers Part now is quite easy to pass trough [Lupus]
+ (thanks to Vicious Pucca for info)
+ * Thanks to MasterOfMuppats for some Kafra changes: [Lupus]
+ - Updated teleport destinations of Aldebaran,Comodo, Izlude and Morroc Kafras
+ * More Bulletin Boards [MasterOfMuppets]
+ * Added Einbech and Einbroch Item NPC's. [Nexon]
+ * Updated all scripts to work with the script engine update (changed break
+ to end, changed some If to if) [Skotlex]
+ * Added official (iRO) Old Blue Box quest to Comodo. Thanks to Celestia (it's another girl, not Celest) for help. [Lupus]
+10/06
+ * Thanks to Justin84: [Lupus]
+ - Fixed ingridients typo in Acolyte Skill Quest
+ - Fixed Arena MVP (custom script), Lighthalzen warps coords
+10/04
+ * Fixed explot in bunnyband quest on giving and taking items away being seperated. [Nexon]
+ * Fixed a missing close; in the bulletin boards. [Nexon]
+10/03
+ * Fixed 2 wrong Achemist test answers, thanx to zlider for info [Lupus]
+ * Updated some of the Lighthalzen mobs as pointed out by Master of Muppets.
+ [Skotlex]
+ * Added 5092 Coif into Prontera Church Shop. Thanx 2 andz [Lupus]
+ * Fixed Thanatos and Abyss Dungeon Spawns. Thanks to Azazel. [Nexon]
+ * Fixed 700+ spelling mistakes. I have alot of time on my hands for some reason... [Nexon]
+10/02
+ * Added Gotanblue#2 to Turtle Island (to be able to return back) [Lupus]
+ - Optimized Alberta, fixed typos
+ * Aldebaran, fixed missing label. Optimized [Lupus]
+ * Fixed some Headgears coords, sprites, names, ingridients. [Lupus]
+ Thanks to Vicious_Pucca for info
+10/01
+ * Fixed spwan mobs names Kobold N -> Kobold, Goblin - >Goblin [Lupus]
+ * Added missing close; in blacksmith JQm thanx2palasx [Lupus]
+ * Updated Crusader job quest a bit, thanks to vicious_pucca for reminding us this quest
+ is only a temp one... [DracoRPG]
+09/29
+ * Added missing Niflheim warps to the INN and house needed to complete the
+ Piano Key Quest. [Skotlex]
+ * Added temp warps of Thanatos Tower by Moryagorn [Lupus]
+09/28
+ * Fixed Super Novice quest. Now BABY can be a SUPER BABY. Finally 8) [Lupus]
+ * Updated some warps (Payon / Guilds) thanks to Yor
+ * Fixed Blacksmith Job Quest items typos, thanks to Yor
+09/26
+ * Added official Ayothaya Town script by MasterOfMuppets [Lupus]
+ - Fixed Ayothaya warp scripts
+ - Updated BBS
+09/23
+ * Al De Baran: Finally added the Kafras Special Reserve 2 Lotto with official prizes [Lupus]
+ (80% official, 4-5 entries are made up) also changed typo Orange Potions -> Red Potions
+09/21
+ * Commented out Mr.Smile Quest (now Tengu drops that mask) [Lupus]
+ * Fixed Bunny Band NPC location, removed NPC dupes [Lupus]
+09/20
+ * Removed Choco from Ayo_fild1, Fixed Petits IDs at Hugel field [Lupus]
+ thanks to MasterOfMuppets, Vicious_Puca, akusarujin
+09/19
+ * Minor fix of Louyang by MasterOfMuppets [Lupus]
+ * Added official Ayothaya shops by MasterOfMuppets
+ * Added 1 Choco to Ayothaya field, thx to vicious_pucca
+ * Official Ayothaya sailor warper by MasterOfMuppets
+ * New number of Treasure Boxes per castle: 20 -> 25 at 100 Economic pts [Lupus]
+ So you get your first chest only when your Economic Pts >= 4
+09/18
+ * Fixed Guilds Kafras charging player for their Kafra Storage usage [Lupus]
+09/17
+ * Changed Yuno guide soldiers to use Schwartzhald Republic ones [DracoRPG]
+ * Removed useless 1.3MB 'old' folder in guild scripts [DracoRPG]
+ * Fixed Amatsu Kafra Storage Issue, thanks to zlider for pointing out [Lupus]
+ * Updated teleport service prices in the Prontera & Alberta. Thanks to MasterOfMuppets for info [Lupus]
+ - Also Merchant Job Quest Kafra's warp price has been updated.
+09/16
+ * Updated some monsters stats (Lighthalzen, Einbroch) thanx to MasterOfMuppets [Lupus]
+ - Also updated bulletin_boards.txt
+ * Added temp mobs spawn of Thanatos Tower/Abyss Lake dungeons thanx to Azazel
+ - Based on limited info. All the new mobs come with poring stats ^_-
+09/15
+ * Added new maps, temp warps for Abyss Lake Dungeon (thanks to Muad-Dib) [Lupus]
+ - I recommend closing that dungeon and new monsters yet,
+ they have temp stats and could cause some exploits in the future
+09/14
+ * Updated Yuno fields mobs spawn, thanks to MasterOfMuppets [Lupus]
+ - Updated Lighthalzen and Einbroch fields, too
+ * Made some parts of Bards Quest more official ^_-. WIP: Adding Bard's NPC pics (like Kafras) [Lupus]
+09/13
+ * Added correct Ayothaya, Louyang & amatsu Kafras. Thanks to Muad-Dib for info [Lupus]
+ * Fixed 'Gaurdian' typo, Added real coords and sprite to amatsu Kafra [Lupus]
+ * Added new scripts. Thanks Muad-Dib for his scripts, Dr.Evil for their conversion : [Lupus]
+ - White Day, Temp Geffenia Event, Valentines day, Zondaman Warper
+ - Quivers Maker NPC
+09/12
+ * Minor fix of Bard quest, added GM Reset menu to Adoption. Fixed Guides [Lupus]
+ * Added Juperos warps (thanks to Muad-Dib, Dr.Evil) [Lupus]
+ * Lutie town bugfix (fixed some items exploit, found due to Bard Quest optimization 8) [Lupus]
+ * Added an official Bards Job Quest. [Lupus]
+ - Basical conversion from Muad-Dib's Prometeus format by Dr.Evil
+ - Implementation of 4 official Bards weapon prizes by Dr.Evil
+ - Final optimization and bug fix by Lupus
+ NOTE: Don't forget to update your old Lutie.txt and Global_Functions.txt
+ * Added temp Amatsu Kafra (wrong sprite, wrong coords yet) [Lupus]
+09/11
+ * Added temp Ayothaya Kafra (wrong sprite, wrong coords yet) [Lupus]
+ - Made all dungeons Kafras not saving your coords again (re-checked sources)
+ * Added official Bulletin Boards script by MasterOfMuppets
+ * Resticted entrance of 3F Lighthalzen dungeonby Azazel [Lupus]
+ * Added Belts to Prontera/Aldebaran shops, thanks to reddozen [Lupus]
+ * Optimized Louyang city NPCs. Made Louyang quests vars unique [Lupus]
+09/10
+ * Fixed some Kafras not allowing you to save your Position [Lupus]
+ * Updated missing Louyang warps. [Lupus]
+ - Replaced custom Louyang with official one. Thanks to MasterOfMuppets
+ - Added Louyang official Kafra (only Storage, Save) [Lupus]
+ * Added official Hair Styler [Lupus]
+ - Thanks to Muad Dib for the script. Thanks to Dr.Evil for a nice conversion.
+ TODO: optimize Louyang and Hair Styler scripts 8)) [Lupus]
+ * Removed Ice-Cream dealer from Morocc (according to patch) [Lupus]
+09/07
+ * Fixed Super Novice job quest. Now a Baby can become a Super Baby. [Lupus]
+09/06
+ * Removed massdriller's "illuminaRO" part from the Merchant jobquest script. What was that good for? [Mass Zero]
+09/04
+ * Optimized Prontera city script. Now Novices > 20 BaseJob Level can go in the Culvert [Lupus]
+ * Fixed minor coords issues of 19/20 warps of Monks Job Quest, Lutie Tool Shop, warps in PVP area, 1 Izlude warp. Thanks to Yor
+ * Minor fix of Bear Hat Quest: changed ingredients (Zipper>Bear Skin) [Lupus]
+ * Minor fix of Acolyte Job Quest message. Thanx to andz for pointing it out [Lupus]
+ * Optimized ADOPTION.TXT again. Tested it with 3 clients. Fully working! [Lupus]
+ * Moved Fashion Quest into the proper folder: custom/quests . Also optimized the script [Lupus]
+ * Wizards Job Quest: Replcaced 2 Hodes with 2 Horongs (according to the official stuff) [Lupus]
+ * Removed duplicate Lighthalzen dungeons/fields warps, thanks to our super moderator, T3H
+ Manipulator! [DracoRPG]
+ * Updated mob spawns with Dr. Evil ones, they should all be correct and up-to-date,
+ including Lighthalzen and Juperos dungeons. If something goes wrong, then let's revert,
+ but I think there won't be any problem (Frugal advised me to use them, and Frugal is a
+ good spawn expert IMHO :p) [DracoRPG]
+08/31
+ * Some fixes to the refine npc. [Skotlex]
+ * Fixed Lighthalzen field <-> Lightalzen city warps, thanks to Poki#3 [DracoRPG]
+ * Moved Tao Gunka to Comodo West Cave (made Megalithes as his slaves),
+ Placed Lady Tany in the 2F of Ayothaya Dungeon [Lupus]
+08/29
+ * Added Dead Branch (and Bloody Branch) quest by GM-Yevon [Lupus]
+ * Fixed Adoption.txt [Lupus]
+08/28
+ * Added a Taekwon NPC (to get Taekwon Job). It's temp tough [Lupus]
+08/27
+ * Splitted anti-taekwon protection from double-adopt protection in adoption.txt, should
+ allow to see more easily what is the problem [DracoRPG]
+ * Updated Is_Taekwon_Class with Job_Star_Gladiator2 [DracoRPG]
+08/26
+ * Reupdated the refine npc to not use recursive functions. [Skotlex]
+ * Fixed Wool Hat quest items. Thanx to the__android [Lupus]
+08/25
+ * Updated Louyang spawns according to ep 8.5 by MasterOfMuppets [Lupus]
+ * Updated Lighthalzen Field 03 spawns by MasterOfMuppets [Lupus]
+ * Fixed THQ Shop menu prices, thx to NeatElves [Lupus]
+ * Added Hugel Mob Spawns by MasterOfMuppets [Lupus]
+08/24
+ * Updated refine.txt from Freya [Lupus]
+08/23
+ * Added new Hugel Field Warps by Sara [Lupus]
+ * Updated mobs spawn of magmadun.txt by MasterOfMuppets
+ Also updated KAHO's stats according to new kRO site info
+08/21
+ * Orc Hero Helm fixed items exploit [Lupus]
+08/19
+ * Fully updated Glastheim to real ep8.5 aegis spawns [MasterOfMuppets]
+ * Updated refine npc to stop it from making the server crash (features = 1,
+ refining past safe level) [Skotlex]
+ * Updated Glastheim spawns
+ * Added new items, fixed items, added new official drops [Lupus]
+ * Added a temp shop of official sellable items 8) [Lupus]
+08/18
+ * Added anti-Taekwon Class protection into Valhalla, into Adoption NPC [Lupus]
+ * Added Zealotus Mask Quest with official items (now tested) [Lupus]
+ * Fixed hat_seller.txt items. thx 2dshome [Lupus]
+08/15
+ * Updated Ayathoya spawns as per the info given by Ishizu. [Skotlex]
+ * Fixed one more Novice Skill exploit, otpimized variables usege a bit. [Lupus]
+ thanks to Mellowz, for pointing it out
+08/09
+ * Fixed position of Lothar (from IRC), and MrSmile Girl pos at Prontera, txh to dshome [Lupus]
+ * Added some Acky's custom scrips (Lottery, MVM, Stock Market, Shifty Assassin, Morroc Raceway, Russian Roulette)
+ * Added custom quest on a Bandit Beard (by Mega Man Expert) [Lupus]
+ * Fixed logging bugs in THQ shop [Lupus]
+08/02
+ * Added anti-novice protection to Ayothay OBB quest [Lupus]
+ * Changed order of adding up Economy thanks to kyoki [Fredzilla]
+07/30
+ * Few NPC fixes reported on in "SVN Script Fixes" [Fredzilla]
+07/25
+ * Totally Updated Louyang shops. Added Driller monster spawn into UmbalaDun2. thanks to MasterOfMuppets [Lupus]
+07/23
+ * Fixed value overflow (RSX MVP respawn delay) thanks to Valaris
+07/16
+ * Fixed a map name typo in the Prontera fields mobs spawn file. (thanx 2Gwendalin) [Lupus]
+ * Added NOLOOT, NOEXP mapflags files (thanks to Lorky,OSKOM) [Lupus]
+ * Updated Louyang monsters spawn (thanks to MasterOfMuppets) [Lupus]
+07/12
+ * Fixed the th**f typo everywhere. [Skotlex]
+ (too many changes to bother bumping the script versions)
+07/11
+ * Changed guild castle flags names according to iRO naming [DracoRPG]
+ * Fixed small item check error in refine.txt thanks to -Vitamin- [massdriller]
+ * Removed some warps dupes in WARPS. Rearranded Einbroch and Airplane&Airport warps [Lupus]
+07/10
+ * Added Custom Auctioneer script by request of Lupus [Fredzilla]
+ (Also added my WoE Setter because of all the people who cant set WoE themself)
+07/09
+ * Added Novice Castles Usher NPC. [Lupus]
+ Now you have access to 4 N Guild castles. They don't have
+ dungeons. And 2nd Classes can't seize these Castles.
+ These new castles need a new strategy. It would bring some
+ fun and live to your game.
+ NOTE: If your Guild Master is 2nd class, then he could
+ rule the Castles and gather Treasure Boxes after WoE
+ * Fixed typo on JFunc2-1.txt script [Skotlex]
+ * Now adoption.txt NPC can teach parents/babies their missing family skills [Lupus]
+ * Added Novice Guilds warps. Fixed some mapflags. NG WOE NPC is coming soon. [Lupus]
+07/08
+ * Fixed new_hats_0625.txt, thanx to vicious_pucca [Lupus]
+07/07
+ * Hunter Job Quest: Infinite Arrows exploit fix [Lupus]
+ * Fixed a small burried treasure map error thanks to kyoki. [massdriller]
+07/04
+ * Added Lorky's NEW HEADGEARS quests (according to the patch 2005/6/14) [Lupus]
+ Please, feel free to fix, imporve, etc. (all the URLs are in the script)
+07/03
+ * Added few missing mobs to Jawaii, updated Peco/Falcon Renter [Lupus]
+ * Added new hairstyles to the stylist NPC. [Mass Zero]
+ * Fixed Job Quests exploits (Advanced Classes were able to pass their 2nd job quests again) [Lupus]
+ High Novices were able to pass Super Novice Job Quest as well. They weren't able to GET those
+ professions, tough. But there were some items exploits.
+ Now Advanced classes get reborn guides from all main Job Quest NPCs (1st, 2nd Classes)
+07/02
+ * Replaced gmcommand with atcommand in NEWnovice NPC set.
+ * Removed the Flower Band selling in Amatsu, shouldn't be sold in shops. [Mass Zero]
+06/30
+ * Fixed 2 garbled Amatsu NPC names (thx 2MasterOfMuppets), slight optimization [Lupus]
+ * Added Bluto's unofficial Airship NPC [massdriller]
+ * Added Incomplete New Novice training grounds [massdriller]
+06/29
+ * Fixed massive EXP/Loot exploits of all Job Quests (especially in the Rogue JQ) [Lupus]
+ * Inserted a missing ".gat" in alberta city NPC header
+ * Moved banks scripts into /banks/ [massdriller]
+ * Corrected small typo in config for marraige script [massdriller]
+ * Added Jawaii npcs thanks to DNett123 [massdriller]
+ * Updated Sara-Chan's Lighthalzen Warps [massdriller]
+ * Added Warning to config files [massdriller]
+ * Reinstated in warper npc. It was missing o.O [massdriller]
+06/28
+ * Fixed bug in Refine script that allows to bypass item & zeny restrictions thanks to sir_loon [massdriller]
+ * Updated Lunatik's Jobchanger [massdriller]
+ * Moved healers into /healers folder [massdriller]
+ * Added Skotlex's marraige script [massdriller]
+06/24
+ * Changed Guild Castle Manager to make Emsolute/Permanent Development affect only economy
+ investment [DracoRPG]
+06/22
+ * Added baby support to Dancer quest [Fredzilla]
+06/21
+ * Fixed a wrong required item in Sea Otter Hat quest, thanks to frugal [DracoRPG]
+06/18
+ * Updated Lightharzen warps to Sara-chan's v1.2 [Lupus]
+06/16
+ * Added Sara-chan's Lightharzen warps [celest]
+06/13
+ * Fixed Heart of Ymir location/sprite, thanks to Poki#3 [DracoRPG]
+06/10
+ * Fixed small error in Dye_maker, was trying to del an non-existant item, instead on mixture
+ Thank you Terminal Vertex
+06/05
+ * Fixed another error [Lunatikbunnie]
+06/03
+ * Fixed an error in the jobmaster script [DracoRPG]
+06/02
+ * Corrected error in Jfunc under priests [massdriller]
+06/01
+ * Added Field update - Einbroch and Lhztargen thanks to sara [massdriller]
+ * Added New optimised jobchanger [Lunatikbunnie]
+05/31
+ * Added my own dev npc too [massdriller]
+ * Fixed incorrect checkers for Jfunc2-1 [massdriller]
+ * Fixed a typo in Jfunc1-1 [massdriller]
+ * Added my own devnpc =P [Kevin]
+ * Optimised darkchild's MVP arena [massdriller]
+05/30
+ * Scripts reorganizing [DracoRPG]
+ * Changed swordsman -> swordman in the files names [DracoRPG]
+ * Optimised Job Quests by placing checkers into JFunc1-1 [massdriller]
+ - Acolyte, Archer, Mage, Merchant, Thief, Swordsman
+ * Optimised Job Quests by placing checkers into JFunc2-1 [massdriller]
+ - Assassin, Blacksmith, Hunter, Knight, Priest, Wizard
+ * Optimised Job Quests by placing checkers into JFunc2-2 [massdriller]
+ - Monk, Sage, Rogue
+ - The rest can't be optimised as it is too integrated.
+05/29
+ * Fixed a typo in an NPC [Codemaster]
+ * Fixed many grammatical errors (mostly in Merchant job quest) thanks to the__android [DracoRPG]
+05/28
+ * Reorganized scripts (npc/) folder. [Ancyker]
+05/25
+ * Changed Ayothaya to Ayotaya. (In the scripts, iRO calls it Ayotaya.) [Mass Zero]
+ * Removed lots of unneccesary spaces from the Ayotaya poetry script. [Mass Zero]
+ * Fixed various gramatical errors in the Uneasy Cemetary, Valkyrie cite, Lou Yang
+ city, Ayotaya city Buny Band quest and Bard jobchanger scripts. [Mass Zero]
+ * Added Rebirth/Advanced class support to the Universal Renter. [Mass Zero]
+05/23
+ * Fixed various gramatical errors in the Dumpling Festival, Twin Towers,
+ Valentine's Day and X-mas scripts. [Mass Zero]
+ * Removed useless quotation marks (") in the Acolyte jobquest. [Mass Zero]
+05/22
+ * Fixed a typo in guild castles' manager, thanks to the__android [DracoRPG]
+05/17
+ * Fixed Crusader Quest.(Thanks to Komurka) [massdriller]
+05/16
+ * Small fix in the Dancer Job NPC and added checks for skill using,
+ Improved Concentration and Arrow Shower [Fredzilla]
+ * Cleanup in NPCs that are enabled by default : removed most of custom ones
+ (including dev NPCs, WoE warper, Ayothaya poetry...) [DracoRPG]
+ * Added an Orc Hero Helm quest, custom but as accurate as possible [DracoRPG]
+05/15
+ * Added Dancer Job quest NPC [Fredzilla]
+ * Fixed some Ayothaya warps, thanks to Fress_Boy [DracoRPG]
+05/14
+ * Fixed some more typos in city scripts [massdriller]
+05/09
+ * Added new Sara-chan's maps / warps for Einbroch and Lhztargen [Lupus]
+ * Fixed some typos [massdriller] (Thanks to neko for point those out)
+ * Fixed Ayothaya warps.[massdriller] [Thanks to akusarujin]
+05/07
+ * Modified and added more npc location for healers [massdriller]
+ * Added city cleaners as these were reported systems that exist
+ in IRO & KRO [massdriller]
+05/05/05
+ * Balanced THQ Shop prices, fixed one missed label [Lupus]
+05/04
+ * Removed Horse Crest from the temp shop [Lupus]
+ * Borrowed Easter Event fix from Freya [Lupus]
+ * Fixed some script typos, thanks to zBuffer and Er Pirata
+04/29
+ * Alarm Mask Quest corrected txt 2 Shadow
+ * Added Penal Servitude script. Some quest for prisoners [Lupus]
+ This script works with kafra_bank.txt script
+ * Fixed a typo in the warpra, thanks to ShAPoNe
+04/27
+ * Added Einbroch and Ayothaya, cites and dungeons, to the Warpra [Fredzilla]
+ * Added the Engagement Quest into Ayothaya [Fredzilla]
+ * In accordance with this quest I have also added some needed warps
+04/26
+ * Some fixes of THG Quest [Lupus]
+ * Corrected view for Whitesmith NPC, thanks to Disiesel
+04/25
+ * Fixed typos in novice and thief job quests, thanks to zlider
+04/23
+ * Fixed 2 scripts which used old job_baby constant [Lupus]
+ * Removed old duplicate job change in Alchemist job quest, thanks to NeoSaro [DracoRPG]
+ * Added Hatii Baby spawn [Lupus]
+04/21
+ * Fixed THQ penalty again, added anti-cheat stuff [Lupus]
+ * changed item_avail.txt to support THQ [Lupus]
+ * Added Baby Class Support to Vallhallana. [Lupus]
+ * Added a missing check. Now Baby Classes can get 1st job [Lupus]
+ * Fixed few things in THQ Quest NPCs [Lupus]
+04/20
+ * Converted Treasure Hunters Guild (40 New Quests + Guild Shop) [Fredzilla]
+ * Added time penalty to THQ. To prevent exploits. [Lupus]
+ * Fixed Super Novice Job Quest (thanks to guy from eA forums .... <-- his name will be here)
+ * Removed one warp from Swordsman Assiciation (due to overlapping Job Quest Warp) [Lupus]
+ * Adding more NPC's to Louyang [celest]
+ * Updated Louyang city script, thanks to Dino9021
+ * Fixed Crusader Job quest (again). And several typos [Lupus]
+ * Fixed a typo in the custom jobchanger, thanks to manutdcom
+04/19
+ * Added custom jobchanger fix by Zoc
+ * Added custom Adoption script by Fredzilla [Lupus]
+ * Removed annoying Kafra Storage issue [Lupus]
+ * Fixed some Job Quests bugs (wrong constants, wrong variable names, etc) [Lupus]
+ * Redo tons of NPC - added Baby Class support to all renters, job questsm etc [Lupus]
+ * Added skillpoint check to Rogue job quest, thanks to Dino9021
+04/17
+ * Changed the assassin job quest npc to do an area announce instead of global,
+ thanks to NeoSaro
+ * Fixed a typo in Aldebaran script, thanks to NeoSaro
+04/16
+ * Added more correct Einbroch/Einbech monster spawn [Lupus]
+ * Fixed 1 warp map name - ein005a thx 2Exyle [Lupus]
+04/14
+ * Fixed typos in Louyang's mob spawns, thanks to Gwendalin
+ * Added nomemo mapflag to valkyrie, thanks to Dino9021
+ * Fixed typos in Alchemist JQ, Fixed bugs and typos in Assassin JQ [Lupus]
+04/09
+ * Added Einbroch monsters spawn, fixed one mapflag for Einnech mines [Lupus]
+ * valkyrie.txt Fixed: now alternative classes can use their 1-1 job NPC to become Advanced 1st Class [Lupus]
+04/08
+ * Fixed some Rogue Job Quest bugs [Lupus]
+04/06
+ * removed previous "fix". Please, never submit "fixes" w/o checking. [Lupus]
+ that guy didn't know about a special SN Kafra from supernovice.txt file.
+ * fixed payon's gemstones exchanger [Lupus]
+ * Set PCLoginEvent.txt to disabled by default [celest]
+04/04
+ * Changed "set @TEMP,rand(0);" to set "@TEMP,0;" in the Payon Fortune Teller script [DracoRPG]
+ We'll have to get all the fortunes, but they are more than 200...
+ * Finished Payon's Gemstone Exchanger, thanks to Dino9021 [DracoRPG]
+ * Added Deviling in the "Poring Island" map pay_fild04, 2 hours respawn [Lupus]
+04/03
+ * Finished Valkyrie. Now it correctly works. Valhallana reborns players to High Novices. [Lupus]
+ (added missed kRO condition: to reborn, player shouldn't have money nor items(equipment) )
+ Then Valhallana warps just reborn players to the home city of their main job.
+ On Job Level 10 of High Novice they can get 1st Advanced Job from correct 1-1 job quests NPC.
+ They'll get there all learnt skill quests.
+ On reaching 45 Job Level they may visit Valkyrie and get 2-2-1 / 2-1-1 class (3rd Job)
+ from a correct NPC.
+ * Fixed SKILL POINTS exploit in Assassin Job Quest [Lupus]
+03/31
+ * Payon : new NPCs scripted as far as I could and old ones updated (all from iRO) [DracoRPG]
+ * Corrected a G_GRYPHON spawn in umbala field to GRYPHON, thanks to CrasherZero
+03/29
+ * Corrected Amatsu warp points, thanks to Dino9021
+03/28
+ * Corrected Yuno warp points, thanks to Dino9021
+ * Added Yuno warps to the Aldebaran kafra NPC, thanks to Dino9021
+
+03/27
+ * Fixed Ant Hell warps, thanks to Dino9021
+ * Corrected positions for Thief and Archer quest skills NPCs, thanks to Dino9021
+
+03/24
+ * Added support for Emsolute Develop in the guild manager script [celest]
+ * Fixed the custom jobchanger allowing Super Novices to change to high novice,
+ thanks to CavaCava
+03/23
+ * WOE 1.3 Now you can't install Guardians during WOE [Lupus]
+ * Set only Storage/Cancel to Kafra in Niflheim. [Lupus]
+03/22
+ * Moved position for Marx Hansen to payon_in03, thanks to Dino9021 [celest]
+03/18
+ * Reduced label name length in heal_payment.txt [celest]
+ * Added Sara-chan's Einbroch/Einbech city warps [celest]
+
+03/17
+ * Fixed more typos in /cities/payon.txt, thanks to TheUltimateEnd [celest]
+
+03/16
+ * Fixed some typos in /cites/payon.txt, thanks to Hibiki [celest]
+
+03/15
+ * Fixed some typos in shops.txt, thanks to Dino9021 [celest]
+ * Fixed some bugs in the 32 new hats script, the custom jobchanger and platinum
+ skills script, thanks to midas [celest]
+
+03/11
+ * Reverted the Moving HP skill quest change, thanks to DracoRPG [celest]
+
+03/07
+ * Fixed a typo in high mage job changing, thanks to hongmei [celest]
+
+03/03
+ * Fixed Moving HP skill quest
+
+02/28
+ * warps/louyang.txt: Added 2 escapes from 2 mountains 018,019 [Lupus]
+ Some players used to stuck there after warps
+
+02/27
+ * Fixed some bugs in Monk Job Quest. Now it's fully passable. [Lupus]
+ Going to brush it up a bit later. First have to re-check Crusader+Assassin+Rogue quests ^_-
+02/26
+ * Now players can reach Guilds Dungeons only trough their own captured castles. [Lupus]
+ Before they coulkd enter the dungeons vie unoccupied castles. Thanks 2Ishizu-chan for fix
+02/16
+ * Fixed 1 payon castle guardian spawn coords
+ * Fixed Wootan and Beetle King names in the spawn files [Lupus]
+ * Fixed a typo in quests/all_quest.txt, thanks to hongmei [celest]
+ * Fixed treasure chests spawn in the castles. (had to simplify some code and unroll some loops) [Lupus]
+
+02/13
+ * Added midas's fixes for bugs in the novice training ground and the custom
+ jobchanger script [celest]
+
+10/02
+ * Fixed Wizard job quest (made only one agressive mob in the last room) [Lupus]
+
+01/10
+ * Fixed some typos and exploits in the Blacksmith and Hunter job quest,
+ thanks to Riotblade and nonox
+01/09/05
+ * Modified guild war scripts to fix a bug for duplicate guild storages. [Codemaster & Ajarn]
+8/1
+ * Added the new Yuno field warps by Sara-chan [celest]
+
+2/1
+ * Added missing Spore Doll to the Kaho Horns NPC (God... this was reported
+ months ago)
+ * The 'Lothar' NPC was asking for the wrong items, corrected thanks to Death's Mage
+01/01/05
+ * Fixed some respawn delays of MVP/Miniboss monsters. Redo Umbala/Niflheim fields, added missing mobs, corrected
+ monsters quantity. In Niflheim fixed wrong Lord of Death monster ID. [Lupus]
+12/30
+ * Fixed typo in priest.txt. [Mass Zero]
+ * Fixed some missing stuff, made monk.txt loading [Lupus]
+12/29
+ * Added Dino9021's monk job quest script - still need checking before adding to
+ scripts list [celest]
+ * Added gvg mapflags to the guild dungeons, and removed 4 items from
+ item_avail.txt, thanks Poki [celest]
+ * Translated npc/sample/npc_extend_shop.txt [MC Cameri]
+ * Translated npc/sample/bank_test.txt [MC Cameri]
+ * Fixed respawn delay of Toad and Golden Thief Bug (it was the actual_delay/2). Mob placement files should be revised again [Lupus]
+
+12/27
+ * kafra_bank.txt added an extra exploit protection [Lupus]
+ * kafra_bank.txt was missing an npc label [celest]
+ * Reverted gldfunc_dunsw.txt back. Some people report RC5 bugs, which have been fixed some months ago.
+ Next time always CHECK and READ the code, before implementing some stupid "fixes" from the forums 8) Peace [Lupus]
+ PS I'm reverting more guild files soon, to make them show the flags.
+
+12/24
+ * Fixed Whitesmith.txt, was on top of another npc [Ajarn]
+
+12/23
+ * Added logs into kafra_bank.txt (it keeps logs of all bank operations! Very handy to find abusers/cheaters) [Lupus]
+
+12/22
+ * Added Arrow Quivers to the scrolls_arrows.txt and removed some rare arrows from the shop [Lupus]
+ * Corrected a typo in other/pvp.txt [Ajarn]
+
+12/21
+ * Corrected position of start { in a crap load of scripts. [Ajarn]
+ - jA decided that it had to be on the definition line
+ - So, if it wasn't, the next script wouldn't load
+ * Corrected script errors in devnpc.txt [celest]
+
+12/20
+ * Addded npcs_athena.conf, OA style [MC Cameri]
+ * made samesex marriages give out the correct rings [MouseJstr]
+ * Changed $progress -> $@progress in wedding.txt (shadowlady put in comments but didn't add to code) [Aria]
+ * xmas.txt: Added Xmas Jakk, fixed 2 possible items exploits, fixed reward Box ID [Lupus]
+12/18
+ * My NPC is back in action [Aria]
+ * Added 2 temp kRO shops which sell Arrows, Magic Scrolls. Prices,coords, sprites are unsure, but exploitless [Lupus]
+
+12/12
+ * Added Town Inn's counting in my npc/other/mc_cameri/warper.txt [MC Cameri]
+
+12/11
+ * Fixed memory consumption in npc/other/mc_cameri/warper.txt [MC Cameri]
+
+12/10
+ * Added npc/other/mc_cameri/warper.txt, a warp npc just like warper2.txt that shows how many people are on each map. [MC Cameri]
+ * Newgearquests (14 files of 16) fixed possible exploits, added a missing close;
+ According to kro, changed ingredients of Indead Hairband quest [Lupus]
+12/08
+ * Changed ingredients of Ears of Demon Quest: Deviruchi Hat -> Evil Wing [Lupus]
+ * Added translated shop names for the Extended Shop, I'unno who made it. o.O; [Mass Zero]
+ * Changed Lord of Death spawn intervals to 90 minutes based on jRO [celest]
+ * Added nomemo flags for Niflheim and some maps [celest]
+ * Corrected Niflheim shops and Morroc jewel merchant - should sell Ruby
+ instead of Pearl [celest]
+
+12/07
+ * Added npc/other/mc_cameri/heal.txt, a heal npc that is as simple as one click healing [MC Cameri]
+ * Fixed Al De Baran to Mjolnir warp in Al De Baran [MC Cameri]
+ * Fixed all Newgear quests: arjen.txt,back_ribbon.txt,bear_hat.txt,burning_blood_bandana.txt,cat_hairband.txt
+ fox_mask.txt,hat_seller.txt,indian_headband.txt,mask_of_alarm.txt,mushroom_hairband.txt,neris.txt
+ old_blacksmith.txt,posture_fix_hat.txt,sea_otter_hat.txt,traveler.txt,tulip_hairpin.txt [Lupus]
+ * Fixed missing labels, missing delitem, wrong zeny amount, wrong items id, spelling [Lupus]
+ * Added Fox Mask quest. [Mass Zero]
+
+12/06 * Added seperate quests for the new headgears, missing Fox Mask and Orc Hero Helm. (I'll so 'em ASAP.) [Mass Zero]
+
+11/30 * Added Lutie shops
+ * Corrected some typos, thanks to leinsirk10
+
+11/28 * Added missing Niflheim monsters [shadow]
+
+11/27 * Added some Lou Yang NPC's [Mass Zero]
+ * Get Freya fixes of crusader.txt (announce->areaannounce), Mr.Smile(removed vulgar words) [Lupus]
+
+11/23 * - Fixed repairman prices (5k)(someone need to check if it requires a steel) [shadow]
+
+11/22 * - Now wedding merchant sells tuxedos for 43k, implemented a easier way to change prices of weddings.
+ - Fixed wrong label calling on jobchange.txt.
+ - Fixed a timer on momotaro.txt and translated tougijou.txt. Thanks to Shinomori .[shadow]
+11/20
+ * Reduced walking speed for davidsiaw's Dev NPC. [MC Cameri]
+ * Fixed some typos in MC Cameri's Dev NPC, walking speed, etc. [MC Cameri]
+ * Fixed spawns on umbala fields, Fixed spawn point of Amon Ra in morroc pyramids B2 [shadow]
+11/21
+ * niflheim.txt: some typos in some variables fixed (thx 2 Dr.Evil) [Lupus]
+
+11/19
+ * cmd_fild02.gat: fixed respawn delay of one Seal [Lupus]
+ * ev_agit_event.txt: Implemented Shadowlady's idea of allowing different woe start/stop times
+ for different days of the week.[kobra_k88]
+11/18
+ * Fixed typo in payon.txt [celest]
+ * - Fixed infinite zeny exploit in novice_skills.txt(other quest skills npcs need revision!!!)
+ - Fixed typos on izlude.txt, wrong label in umbala.txt [shadow]
+ * Added custom WOE warper (now you can get to Novice Castles from Prontera) [Lupus]
+ * Prontera.txt (Sewers) anti-novice exploit fix. should be added to any quests/banks where u once get free items/zeny [Lupus]
+11/17
+ * Added poetry npc to ayothaya [MouseJstr]
+ * Fixed valkyrie.txt (wrong condition check, temp var->perm vars) but it still has no exit for common players [Lupus]
+ * - Fixed guardians hp not updating when investment in defense is made.
+ - Moved treasure spawn times to ev_agit_event.txt.
+ - Changes to headers and comments in various scripts.[kobra_k88]
+11/16
+ * - grandpa_pharmacist.txt: Added subfunction for potion making as well as zeny/input
+ exploit safeguards. Used Lupus's "loopless" technique.
+ - juice_maker.txt: Added subfunction for juice making. Also changed amount of
+ fruit needed to 1.
+ - milk_trader.txt: Used Lupus's "loopless" technique. Added input exploit safegaurd.
+ - clothes_dyer.txt: Disabled dye for male Assassins.
+ - xmas.txt: Corrected some typos. [kobra_k88]
+ * - Removed Empty Bottle from amatsu shops to prevent exploits.
+ - Fixed Npc Position on Lutie( warper.txt and warper2.txt). [shadow]
+
+11/15
+ * - Fixed xmas.txt X-mas event, now you get a gift box when you first talk to Santa.
+ - Same script again...Fixed the spawns, its 1 antonio per map, and it was using only santa poring IDs. [shadow]
+
+11/14
+ - Fixed niflheim kafra. [shadow]
+ - Added the total new set of Advance Jobchangers after kRO description and screenshots. [Nana]
+
+11/13
+ * - Translated and Fixed momotaro.txt event [shadow]
+ * - Deleted folder other/old which was empty [MC Cameri]
+ * - Fixed MC Cameri's Bank NPC for the new payon [MC Cameri]
+ * - Fixed warps to Amatsu Dungeon (now u can get there via a special quest only) thanks to shadowlady [Lupus]
+ - Fixed logical bug in Sleipnir Alchem. sub-quest [Lupus]
+11/11
+ * - Fixed Jobchanger.txt and supernovice.txt [shadowlady]
+11/10
+ * - Fixed a bug on counteragent_mixture and quest_yuno(need to revise alchemist quest) [shadow]
+
+11/08
+ * - Temporary corrected an expliot in refine.txt. Need to check sources to fully fix bug [Shinigami]
+ * - Fixed 2 bugs on jobchanger.txt , not being able to change to Creator and Clown,
+ - Fixed a bug on mage.txt, not deleting the quest items.
+ - Fixes on bongunsword.txt and fashion.txt , wrong spaces and quest items.
+ - Added new Ayothana Mob listing, correct IDs, but need correct amount and respawn time. [shadow]
+11/07
+ * - Fixed platinum_skill.txt, now advanced classes get quest skills.
+ - Fixed a bug on novice.txt . [shadow]
+ * - lutie.txt: Edited text, updated/corrected triggers for the Jack Frost quest.
+ - comodo.txt, morocc.txt, doomed_swords.txt: Implemented all of the triggers for
+ the Doomed Swords quest based on mRO's version. Now the quest is much longer.
+ - pvp.txt: Added PvP Narrator function. Using args for Fight Square Helpers.
+ - Corrected some typos in item_db. Items 1143 and 1719 need to be re-checked.[kobra_k88]
+11/05
+ * Fixed and redo optional Umbalian quests:
+ - Wise Man Fabius' Umbalian Language Quest (you can learn Umbalian language in
+ alternative way)
+ - On speaking with Umbalian Chief about meaning of masks you activate Turban Thief Quest
+ (For Sphinx Mask)
+ * Fixed several bugs in Niflheim Piano Keys Quest (wrong variable name, missing CLOSE buttons)
+ Zeny/Item Exploit in Niflhein Sairin NPC quest (should add similiar checks in every
+ easy quests with expensive prizes to avoid exploits) [Lupus]
+11/05
+ * Added easter and xmas event npcs. Added custom blackjack npc.[kobra_k88]
+11/02
+ * Added unofficial nguild castles. Updated stats for Stone Shooter, Wooden Golem, Hyegun,
+ Civil Servant, Dancing Dragon, Baby Garm, and Increase Soil mobs in mob db. Drops are still
+ missing for some of them.[kobra_k88]
+11/01
+ * Set Comodo Kafra to warp to Umbala (11/2/04 patch) [Aria]
+10/31
+ * Fixed Dev NPCs giving off errors... [Aria]
+ * Fixed prob. with duplicating mobs in wizard.txt. Corrected some item names in sage.txt.
+ Corrected mode values for hornet, wolf, baby desert wolf, and peco peco in mob db.[kobra_k88]
+10/30
+ * Commented out unfinished Dev NPCs and added npc line to map_athena.conf [Aria]
+10/29
+ * Added missing Lmenu label to novice.txt.[kobra_k88]
+10/27
+ * Re-organized mob scripts.[kobra_k88]
+ * Updated mob placements with info from emperium.org.[Lupus]
+ * Fixed Aldebaran (gatekeeper conditions bugs and wrong Key ID). Fixed some typos in other cities [Lupus]
+ * assassin.txt, rogue.txt: added clothes dye reset before job change since thiefs with custom dyes
+ were getting errors upon job change. Updated towns.txt and nopenatly.txt mapflags.[kobra_k88]
+10/26
+ * Added more quotes -_- [Aria]
+ * Fixed Mouse's devnpc only saying his quotes once per server reset [Aria]
+ * Fixed Umbalian Quest, fixed Amatsu, fixed Niflheim NPCs, Warper2 NPC, fixed 1 warp [Lupus]
+
+10/25
+ * updated Mousejstr in devnpc [ MouseJstr]
+10/23
+ * Finished Aria and MC Cameri "Dev edition" NPCs. [Aria]
+ * gldfunc_ev_agit.txt: added F_AgitEnd func.
+ prtg_guardians.txt: fixed typos where I used OnInit instead of OnAgitInit.
+ Minor cosmetic changes to various guild script files. [kobra_k88]
+
+10/21
+ * Replaced some checkcart and checkoption(x) with checkcart(0) in the guild folder [Aria]
+ * Waiting for various devs to tell me their coords, map, biography, quotes,
+ moving coords, etc. In the meantime, I replaced them with (x,y),(lols),
+ (sprite),(somewhere), and if they didn't give me any info, I didn't
+ add them yet =P. [Aria]
+ * Added Davidsiaw, Shinigami, Lord, Codemaster, MouseJstr, MC Cameri, and Darkchild
+ to "Dev edition" NPCs [Aria]
+ * Revised "Dev edition" NPC layout a bit, should go smoother now. Should be final
+ layout unless something goes wrong =O. [Aria]
+ * Changed "Dev edition" NPC layout so that they move by themselves by timers. [Aria]
+ * Changed "Dev edition" NPCs to walk during quotes, and added biography. [Aria]
+ * Fixed quest/all_quest.txt not showing the correct description of the binoculars. [Aria]
+ * Fixed quest/all_quest.txt not going to stop pass and not displaying requirements. [Aria]
+ * Fixed clothes_dyer.txt: Disabled Assassing/Rogues Dye. Also fixed wrong labels [Lupus]
+ * Fixed hair_dyer.txt: fixed missing menu label [Lupus]
+ * new_hats.txt 1.4 fixed amount of Fish Tail (300 -> 30), Zeny bugs in Ear of Angel,
+ Ear of Demon,Big Golden Bell, Mistress Crown,
+ Crown of The Ancient Queen, Indian Headband, Orc Hero Helm [Lupus]
+ * Fixed name of a flower in Prontera quest (Dreamy->Illusion) according to our DB [Lupus]
+ * Fixed item names in the temp Crusader Job Quest according to our DB [Lupus]
+
+10/20
+ * Finished basic layout, finished Aria starting to create Shinigami [Aria]
+ * Started to create "Dev edition" npcs [Aria]
+ * Fixed Castle aldg504-1 warp [Lupus]
+ * Fixed Payon's Skirt of virgin quest [Lupus]
+ * Fixed Doomed swords quest [Lupus]
+ * Optimized mapflags (removed useless nobranc flag, where gvg flag is set)
+
+10/16
+ * Fixed my stupid mistake with the guild switches.
+ Moved shops from umbala.txt to shops.txt. Commented out the other ones.
+ Updated mapflags and re-organized them again. Files in "mapflag\type" folder are the
+ same as ones in "mapflag" folder, just organized differently. ONLY use 1 set.[kobra_k88]
+ * Corrected Morroc warp npc overlaying Kafra npc. [Aria]
+ * Corrected kafra typo. [Shinigami]
+ * Corrected zeny amount subtracted for iron hammer in refine.txt[kobra_k88]
+10/15
+ * Added kafra_bank NPC - a new bank with daily interst of 0.1#%. [Lupus]
+10/14
+ * Kafras: Fixed some minor typos. Corrected savepoints for geffen, orc dun, comodo kafras.
+ Added another argument to F_KafEnd. Added correct payon warp point.[kobra_k88]
+ * Forgot some qutoes in class check function calls in Blacksmith, Assassin, Wizard, Hunter
+ quests, added them.[kobra_k88]
+ * Added optimized version of WoE scripts. Moved old version to "old" folder.
+10/07
+ * Fixed Doctor Band items [Lupus]
+10/06
+ * Removed a left over if statement that caused the Blacksmith script to hang durring
+ job change.[kobra_k88]
+10/04
+ * Implemented class check functions in all skills quests except novice. [kobra_k88]
+ * Implemented class check functions in hunter, blacksmith, wizard, and
+ assassin quests. Fixed some bugs in assassin quest. Also implemented
+ new Ontouch label function and close2 command in assassin.txt.(see file for details). [kobra_k88]
+ * Removed single job check functions from Global_Functions.txt and completed
+ the rest of the multiple job check funtions. Also added advanced and high
+ job classes to the checks.[kobra_k88]
+ * Fixed some typos in inn.txt. Switched from @variables to arguments. [kobra_k88]
+
+10/03
+ * Minor changes in Counteragent/Mixture Morgenstein Quest, a fix of Uneasy Cemetary [Lupus]
+
+10/02
+ * Added Crusader Quest [Lupus]
+
+09/26
+ * Cleared Up Npc Folder For Release [Darkchild]
+
+09/24
+ * Added Sage Job Quest [Darkchild]
+ * Updated a few Payon files [Darkchild]
+ - Removed Double Warp
+ - Placed BunnyBand Quest Npc Better
+ - Updated Pvp People's Locations
+ - Updated Warper/Warper2 Loc and Warp
+ - Same for Wapra 2
+ - Removed Msg Boards In Payon
+ - Updated Heal and Heal Payment Loc
+ - Commented Out a Falcon Renter which shouldnt be there
+ - Updated Guide's Viewpoints
+ - Bugs Were All Reported On The Forums
+ * Update Heal and Heal Payment Npcs To All Be Healrings [Darkchild]
+
+09/23
+ * Added a loopless option "Gimme as many as possible" into Juice Maker quest [Lupus]
+
+09/19
+ * Added missing warp mjol17 [Lupus]
+
+09/17
+ * Added Correct Niflheim Dialogs
+
+09/16
+ * Added nude; to palace guard in payon, will disarm player [Darkchild]
+
+09/14
+ * Added New Dye Npc, Has 'browse' option [Darkchild]
+ * Fixed skillpoints check in Hunter Job Quest [Lupus]
+
+09/13
+ * Added better save point inside city for payon [Darkchild]
+ * Fixed lil bug in Drunk npc in payon [Darkchild]
+
+09/12
+ * Deleted Old Non-Quest Alchemist Job Change [Darkchild]
+ * Added Alchemist Job Quest [Darkchild]
+ * Added Alchemist Shop [Darkchild]
+ * Changed Bain Bro's To Work With Alchemist Quest [Darkchild]
+ * Changed CounterAgent and Mixture Quest To Work With Alchemist Quest [Darkchild]
+ * Added Inn Npcs [Darkchild]
+
+09/10
+ * Added cities/payon.txt. All Npcs at correct location, only 5 npcs arent translated. [Darkchild]
+ * Submitted Alchemyst Job Quest and Sage Job Quest (to help DC in his work). These quests are ports. [Lupus]
+
+09/07
+ * Better New Payon, All Except cities, will do 2morrow :P [Darkchild]
+ * Added Rogue job quest. [kobra_k88]
+ * Added missing cutin commands to town guides. [kobra_k88]
+ * Removed the delitem 2312(padded armor) in swordman_skills.txt as the
+ armor is not supposed to be removed. The npc is only supposed to check
+ for it and not delete it. This is how it is on official servers. [kobra_k88]
+ * Removed duplicate waprs from izlude.txt, comodo.txt, morroc.txt, and jobquest.txt.
+ Added complete rogue warps. Removed traingnd.txt file as those warps are
+ already in jobquest.txt. Added correct tabs to first 2 warps in louyang.txt. [kobra_k88]
+ * Fixed various typos in kafra files. Now using arrays for the teleport service.
+ Also added guild options. [kobra_k88]
+
+09/06
+ * Forgot the dun/field warps for payon, added now! [Darkchild]
+ * Fixed: add a forgotten "delitem 2312,1;" in quest/skills/swordmand_skils.txt [Yor]
+
+09/05
+ * Fixed 2 Bugs In Super Novice Script [Darkchild]
+ * Added Super Novice Official Quest [Darkchild]
+
+ - Started Changelog: Same As Normal Changelog, but now for scripts, here we can put every lil thing we change :)
diff --git a/npc/airports/airships.txt b/npc/airports/airships.txt
index 7325d3725..85113118b 100644
--- a/npc/airports/airships.txt
+++ b/npc/airports/airships.txt
@@ -1,1129 +1,1129 @@
-//===== eAthena Script =======================================
-//= The Airship System Script
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 0.5c
-//===== Compatible With: =====================================
-//= eAthena SVN 3422+(Requires jA Script System)
-//===== Description: =========================================
-//= The Airship System used in the official servers, however this
-//= one is still about 25% custom and is missing some npcs.
-//===== Additional Comments: =================================
-//= 0.1 Added first version, it might be a little buggy [MasterOfMuppets]
-//= 0.1a Fixed the Airport Staff#Iz which was [MasterOfMuppets]
-//= warping you to the same location as Airport Staff#Ein
-//= 0.2 Implemented some more airship NPCs, more are to come.
-//= 0.3 Implemented some more NPCs [MasterOfMuppets]
-//= 0.4 Implemented two mini games scripted by Dj-Yhn [MasterOfMuppets]
-//= 0.5 Removed Duplicates [Silent]
-//= 0.5aFixed a typo [Evera] 0.5b Fixed appledice bugs [Lupus]
-//============================================================
-
-//============================================================
-//= The Airship System (Yuno -> Hugel -> Einbroch -> Lighthalzen -> repeat)
-//============================================================
-
-airplane.gat,243,74,4 script #AirshipWarp-1 45,2,2{
-OnTouch:
- if($@airplanelocation == 1)warp "einbroch.gat",90,275;
- if($@airplanelocation == 2)warp "yuno.gat",85,265;
- if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
- if($@airplanelocation == 4)warp "hugel.gat",182,150;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane.gat,243,29,4 script #AirshipWarp-2 45,2,2{
-OnTouch:
- if($@airplanelocation == 1)warp "einbroch.gat",90,275;
- if($@airplanelocation == 2)warp "yuno.gat",85,265;
- if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
- if($@airplanelocation == 4)warp "hugel.gat",182,150;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane.gat,1,1,0 script EinYuno_Airship -1,{
-OnInit:
-while(1)
-{
- initnpctimer;
- setnpctimer 0;
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Hugel.",1,0xBA55D3;
- end;
-OnTimer15000:
- mapannounce "airplane.gat","We are heading to Hugel.",1,0xBA55D3;
- end;
-OnTimer30000:
- mapannounce "airplane.gat","We will arrive in Hugel shortly.",1,0xBA55D3;
- end;
-OnTimer45000:
- set $@airplanelocation,4;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Hugel. Have a safe trip.",1,0xBA55D3;
- end;
-OnTimer55000:
- mapannounce "airplane.gat","Currently, we are in Hugel. The Airship will leave shortly.",1,0xBA55D3;
- end;
-OnTimer65000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Einbroch.",1,0x00FF00;
- end;
-OnTimer80000:
- mapannounce "airplane.gat","We are heading to Einbroch.",1,0x00FF00;
- end;
-OnTimer95000:
- mapannounce "airplane.gat","We will arrive in Einbroch shortly.",1,0x00FF00;
- end;
-OnTimer110000:
- set $@airplanelocation,1;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Einbroch. Have a safe trip.",1,0x00FF00;
- end;
-OnTimer120000:
- mapannounce "airplane.gat","Currently, we are in Einbroch. The Airship will take off shortly.",1,0x00FF00;
- end;
-OnTimer130000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Lighthalzen.",1,0xFF8600;
- end;
-OnTimer145000:
- mapannounce "airplane.gat","We are heading to Lighthalzen.",1,0xFF8600;
- end;
-OnTimer160000:
- mapannounce "airplane.gat","We will arrive in Lighthalzen shortly.",1,0xFF8600;
- end;
-OnTimer175000:
- set $@airplanelocation,3;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Lighthalzen. Have a safe trip.",1,0xFF8600;
- end;
-OnTimer185000:
- mapannounce "airplane.gat","Currently, we are in Lighthalzen. The Airship will leave shortly.",1,0xFF8600;
- end;
-OnTimer195000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is now taking off. Our next destination is Yuno.",1,0x70DBDB;
- end;
-OnTimer210000:
- mapannounce "airplane.gat","We are heading to Yuno.",1,0x70DBDB;
- end;
-OnTimer225000:
- mapannounce "airplane.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
- end;
-OnTimer240000:
- set $@airplanelocation,2;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
- end;
-OnTimer250000:
- mapannounce "airplane.gat","Currently, we are in Yuno. The Airship will leave shortly.",1,0x70DBDB;
- end;
-OnTimer260000:
- stoptimer;
-}
-}
-
-//C4644E
-
-//============================================================
-//= Some normal NPCS (airplane.gat)
-//============================================================
-
-airplane.gat,240,64,5 script Exit#01::Exit2 857,{
-
-end;
-
-}
-
-airplane.gat,247,64,5 duplicate(Exit2) Exit#02 857
-
-airplane.gat,240,39,1 duplicate(Exit2) Exit#03 857
-
-airplane.gat,247,39,1 duplicate(Exit2) Exit#04 857
-
-airplane.gat,100,69,2 script Airship Crew#01::Airship Crew 852,{
-
- mes "[Airship Crew]";
- mes "If we've landed at";
- mes "your destination and";
- mes "you'd like to leave the";
- mes "Airship, please use the";
- mes "stairs up ahead. Thank";
- mes "you for you patronage.";
- close;
-
-}
-
-airplane.gat,250,59,3 script Airship Staff::AirshipInfo 67,{
-
- mes "[Airship Staff]";
- mes "Welcome";
- mes "to the Airship.";
- mes "How may I help you?";
- next;
- menu "Using the Airship",s_Use,"Captain's Cabin",s_Capt,"Facilities",s_Faci,"Cancel",-;
-
- mes "[Airship Staff]";
- mes "Well, I hope you like";
- mes "your flight aboard";
- mes "our Airships. Thank";
- mes "you and have a good day.";
- close;
-
-s_Use:
- mes "[Airship Staff]";
- mes "When you see a broadcast";
- mes "announcing that we have";
- mes "arrived at your destination,";
- mes "please use one of the exits";
- mes "located at the north and";
- mes "south ends of the Airship";
- next;
- mes "[Airship Staff]";
- mes "If you happen to miss";
- mes "your stop, don't worry.";
- mes "The airship is constantly";
- mes "on route and you'll get";
- mes "another chance to arrive";
- mes "to your intended destination.";
- close;
-
-s_Capt:
- mes "[Airship Staff]";
- mes "The Captain's Cabin";
- mes "is located at the front";
- mes "of the Airship. There, you";
- mes "can meet the captain and";
- mes "the pilot of the Airship.";
- close;
-
-s_Faci:
- mes "[Airship Staff]";
- mes "The Airship provides";
- mes "various Mini Games for";
- mes "the entertainment of all";
- mes "our passengers. We invite";
- mes "you to try your luck and skills";
- mes "in the Airship's Mini Games~";
- close;
-
-}
-
-airplane.gat,50,66,4 script Meltz::AirshipApples 86,{
-
- mes "[Meltz]";
- mes "Welcome to Meltz's";
- mes "Shop where you can";
- mes "purchase Apples or grind";
- mes "them to make Apple Juice.";
- next;
- menu "Buy Apples",s_Buy,"Make Apple Juice",s_Juice,"Cancel.",-;
-
-s_Cancel:
- mes "[Meltz]";
- mes "Thanks for stopping";
- mes "by my shop. Farewell!";
- mes "Come back anytime when";
- mes "you feel like having an";
- mes "Apple to snack on~";
- close;
-
-s_Buy:
- mes "[Meltz]";
- mes "Please enter the amount";
- mes "of Apples that you wish to";
- mes "buy. Each Apple is 15 zeny";
- mes "and you can buy a maximum";
- mes "of 500 at a time. Please enter";
- mes "\"0\" to cancel your order.";
- next;
- input @tempapple;
- if(!@tempapple)goto s_Cancel;
- if(@tempapple > 0 && @tempapple < 501)goto s_AppleBuy;
- if(@tempapple < 0)close;
- mes "[Meltz]";
- mes "The maximum amount of apples";
- mes "you can buy at the same time";
- mes "is 500. " + @tempapple + " is clearly";
- mes "over 500.";
- close;
-
-s_AppleBuy:
- mes "[Meltz]";
- mes "A total of ^FF0000" + @tempapple + "^000000 Apples.";
- mes "will cost you ^FF0000" + @tempapple * 15 + "^000000 zeny.";
- mes "Would you like to continue?";
- next;
- menu "Yes",-,"No",s_Cancel;
-
- if(zeny < (@tempapple * 15))goto s_NEnoughZeny;
- mes "[Meltz]";
- mes "Thanks for stopping by";
- mes "my shop. I hope you enjoy";
- mes "the flavor of these Apples~!";
- getitem 512,@tempapple;
- set zeny,zeny - (@tempapple * 15);
- close;
-
-s_NEnoughZeny:
- mes "[Meltz]";
- mes "I'm sorry buy you don't";
- mes "seem to have enough zeny.";
- mes "Come back anytime when";
- mes "you feel like having an";
- mes "Apple to snack on~";
- close;
-
-s_Juice:
- mes "[Meltz]";
- mes "Okay, I'll need";
- mes "^FF00003 Apples and 1 Empty Bottle^000000";
- mes "to make 1 Apple Juice for you.";
- mes "Would you like to proceed?";
- next;
- menu "Yes",-,"No",s_Cancel;
-
- if(countitem(512) < 3 || !countitem(713))goto s_Material;
- mes "[Meltz]";
- mes "Thank you,";
- mes "please wait";
- mes "just a moment.";
- next;
- mes "*Grind grind*";
- mes "*Grind grind*";
- mes "*Clang...!*";
- next;
- mes "[Meltz]";
- mes "There you go~";
- mes "I hope you enjoy!";
- mes "Please feel free to";
- mes "stop by for your Apple";
- mes "and Apple Juice needs";
- mes "at anytime, adventurer~";
- delitem 512,3;
- delitem 713,1;
- getitem 531,1;
- close;
-
-s_Material:
- mes "[Meltz]";
- mes "I'm sorry, but you don't";
- mes "have enough materials to";
- mes "create a bottle of Apple Juice.";
- mes "Remember, I need 3 Apples";
- mes "and 1 Empty Bottle to do it.";
- close;
-
-}
-
-
-airplane.gat,33,69,4 script Kaci 73,{
- callfunc "applegamble","Kaci";
- end;
-
- OnLose:
- emotion e_wah;
- end;
-
- OnWin:
- emotion e_no1;
- end;
-}
-
-airplane.gat,80,71,4 script Zerta 834,{
- mes "[Zerta]";
- mes "Oh, hello adventurer.";
- mes "I am currently on a";
- mes "sacred journey, offering";
- mes "prayer for the sake of the";
- mes "Rune-Midgard continent.";
- close;
-}
-
-airplane.gat,65,63,4 script Maelin 714,{
- mes "[Maelin]";
- mes "Um, this Airship is";
- mes "to Lutie, isn't it? I've";
- mes "been waiting so long,";
- mes "but I haven't heard any";
- mes "broadcast about Lutie.";
- close;
-}
-
-airplane.gat,32,61,4 script Nils::TypingContest 49,{
- callfunc "F_ClearGarbage"; //Clear outdated, unused variables
-loopback:
- mes "[Nils]";
- mes "Welcome to the";
- mes "^FF0000RO Typing Challenge^000000.";
- mes "Would you like to play";
- mes "a quick typing game?";
- next;
- menu "Play ^FF0000RO Typing Challenge^000000",s_Play,"Information",s_Info,"View Top Records",s_Record,"Cancel",-;
-
- mes "[Nils]";
- mes "Feel free to take on the";
- mes "Ro Typing Challenge";
- mes "anytime. I'll be here~";
- close;
-
-s_Play:
- mes "[Nils]";
- mes "Okay, we have";
- mes "a new challenger!";
- mes "Enter the following";
- mes "text as quickly as you";
- mes "can without making any";
- mes "mistakes! Let's start~!";
- next;
- //below arrays are for simplified entering of new lines ;P
- //first lines array
- setarray $@textstringsa$[0],"^00FFFFthkelfkskeldmsiejdlsle^0000FFhfndkelsheidl",
- "^993366hfjdkeldjsieldjs^663366hfjdjeiskdlefvbd",
- "^00FFFFCoboman no chikara-yumei na",
- "^993366belief love luck grimace sweat rush",
- "^00FFFFcallipygian salacious lascivious",
- "^663366uNflAPPaBLe LoVaBLe SeCreTs AnD",
- "^00CCFFburrdingdingdilidingdingphoohudaamb",
- "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi",
- "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn",
- "^00CCFFI'm the King of all Weirdos! Now",
- "^00CCFFBy the power of^000000",
- "^00CCFF...silence. quiet benevolence...";
- //second lines array
- setarray $@textstringsb$[0],"skemd",
- "",
- "chikara-dalookii na chikara da ze!",
- "folktale rodimus optimus bumblebee",
- "licentious prurient concupiscent",
- "BoWLiNg aGaINST tHe KarMA of YoUtH",
- "andoora^0000FFbambarambambamburanbamding",
- "kabamturubamdingding",
- "RiGhT BuRn OrIGInAL GaNgSteR SmACk",
- "you know of my true power. Obey~!",
- "p-po-poi-po-poi-poin-poing",
- "soul mate... wonder. enigma...";
- //for the few 3-liners... =X
- setarray $@textstringsc$[0],"",
- "",
- "COBO ON!",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "GOD-POING. I NEVER LOSE!",
- "cloud.";
- //comparisation strings
- setarray $@compstring$[0],"thkelfkskeldmsiejdlslehfndkelsheidlskemd",
- "hfjdkeldjsieldjshfjdjeiskdlefvbd",
- "Coboman no chikara-yumei na chikara-dalookii na chikara da ze! COBO ON",
- "belief love luck grimace sweat rush folktale rodimus optimus bumblebee",
- "callipygian salacious lascivious licentious prurient concupiscent",
- "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA of YoUtH",
- "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding",
- "barapaphurarlandreamduranbatuhiwooikabamturubamdingding",
- "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk",
- "I'm the King of all Weirdos! Now you know of my true power. Obey~!",
- "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!",
- "...silence. quiet benevolence... soul mate... wonder. enigma... cloud";
- //lengths
- setarray $@lengths[0],20,32,73,73,65,66,67,55,67,66,67,69;
- // initnpctimer;
- mes "[Nils]";
- set @index,rand(1,getarraysize($@textstringsa$))-1;
- set @string1a$,$@textstringsa$[@index];
- set @string1b$,$@textstringsb$[@index];
- set @string1c$,$@textstringsc$[@index];
- set @typingstring1$,$@compstring$[@index];
- set @typingkeys,$@lengths[@index];
- set @index2,rand(1,getarraysize($@textstringsa$))-1;
- while (@index2 == @index) {
- set @index2,rand(1,getarraysize($@textstringsa$))-1;
- }
- set @string2a$,$@textstringsa$[@index2];
- set @string2b$,$@textstringsb$[@index2];
- set @string2c$,$@textstringsc$[@index2];
- set @typingstring2$,$@compstring$[@index2];
- set @typingkeys,@typingkeys+$@lengths[@index2];
- set @start,gettime(3)*60*60+gettime(2)*60+gettime(1);
- mes @string1a$;
- if(@string1b$ != "")mes @string1b$;
- if(@string1c$ != "")mes @string1c$;
- input @comparisonvar$[1];
- next;
- mes "^000000[Nils]";
- mes @string2a$;
- if(@string2b$ != "")mes @string2b$;
- if(@string2c$ != "")mes @string2c$;
- input @comparisonvar$[2];
- if(@comparisonvar$[1] == @typingstring1$ && @comparisonvar$[2] == @typingstring2$)set @typingcorrect,1;
- next;
- if(!@typingcorrect)goto s_Fail;
- set @time,(gettime(3)*60*60+gettime(2)*60+gettime(1))-@start; //seconds taken
- set @mypoints,(@typingkeys * 100) / @time;
- mes "[Nils]";
- mes "Your typing time";
- mes "was ^FF0000" + @time + " seconds^000000";
- mes "and your score is";
- mes "^0000FF" + @mypoints + "^000000 points";
- next;
- if(@mypoints <= $TypingRecord)goto loopback;
- mes "[Nils]";
- mes "Congratulations!";
- mes "It's a new record.";
- mes "I'll put you on the high-";
- mes "score list immediately.";
- set $TypingRecord,@mypoints;
- set $TypingRecord$,strcharinfo(0);
- close;
-
-s_Fail:
- mes "^000000[Nils]";
- mes "I'm sorry you didn't type";
- mes "all characters correctly.";
- mes "But remember, practice makes";
- mes "perfect!";
- close;
-
-s_Info:
- mes "[Nils]";
- mes "The RO Typing Challenge";
- mes "is a game where you enter";
- mes "the given text as quickly as you";
- mes "can. The name of the top player";
- mes "is recorded for posterity. If you";
- mes "want fame, here's your chance!";
- next;
- mes "[Nils]";
- mes "I'd just like to let";
- mes "you know that you type";
- mes "all the text that you see";
- mes "in the single input line that";
- mes "you're given. So don't press";
- mes "the enter key, just click 'OK'.";
- close;
-
-s_Record:
- mes "[Nils]";
- mes "^0000FF" + $TypingRecord$ + "^000000";
- mes "is the current";
- mes "record holder with";
- mes "a record of ^0000FF" + $TypingRecord + "^000000";
- mes "points. Try to beat";
- mes "that record next time~";
- close;
-
-}
-
-//============================================================
-//= The Airship System (Yuno -> Izlude -> Repeat)
-//============================================================
-
-airplane_01.gat,243,74,4 script #AirshipWarp-3 45,2,2{
-OnTouch:
- if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
- if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane_01.gat,243,29,4 script #AirshipWarp-4 45,2,2{
-OnTouch:
- if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
- if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane_01.gat,1,1,0 script YunoIzl_Airship -1,{
-OnInit:
-while(1)
-{
- initnpctimer;
- setnpctimer 0;
- set $@airplanelocation2,0;
- donpcevent "#AirshipWarp-3::OnHide";
- donpcevent "#AirshipWarp-4::OnHide";
- disablenpc "#AirshipWarp-3";
- disablenpc "#AirshipWarp-4";
- mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Izlude.",1,0x00FF00;
- end;
-OnTimer15000:
- mapannounce "airplane_01.gat","We are heading to Izlude.",1,0x00FF00;
- end;
-OnTimer30000:
- mapannounce "airplane_01.gat","We will arrive in Izlude shortly.",1,0x00FF00;
- end;
-OnTimer45000:
- set $@airplanelocation2,1;
- enablenpc "#AirshipWarp-3";
- enablenpc "#AirshipWarp-4";
- donpcevent "#AirshipWarp-3::OnUnhide";
- donpcevent "#AirshipWarp-4::OnUnhide";
- mapannounce "airplane_01.gat","Welcome to Izlude. Have a safe trip.",1,0x00FF00;
- end;
-OnTimer55000:
- mapannounce "airplane_01.gat","Currently, we are in Izlude. The Airship will leave shortly.",1,0x00FF00;
- end;
-OnTimer65000:
- set $@airplanelocation2,0;
- donpcevent "#AirshipWarp-3::OnHide";
- donpcevent "#AirshipWarp-4::OnHide";
- disablenpc "#AirshipWarp-3";
- disablenpc "#AirshipWarp-4";
- mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Yuno.",1,0x70DBDB;
- end;
-OnTimer80000:
- mapannounce "airplane_01.gat","We are heading to Yuno.",1,0x70DBDB;
- end;
-OnTimer95000:
- mapannounce "airplane_01.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
- end;
-OnTimer110000:
- set $@airplanelocation2,2;
- enablenpc "#AirshipWarp-3";
- enablenpc "#AirshipWarp-4";
- donpcevent "#AirshipWarp-3::OnUnhide";
- donpcevent "#AirshipWarp-4::OnUnhide";
- mapannounce "airplane_01.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
- end;
-OnTimer120000:
- mapannounce "airplane_01.gat","Currently, we are in Yuno. The Airship will take off shortly.",1,0x70DBDB;
- end;
-OnTimer130000:
- stoptimer;
-}
-}
-
-//============================================================
-//= Some normal NPCS (airplane_01.gat)
-//============================================================
-
-airplane_01.gat,240,64,5 duplicate(Exit2) Exit#05 857
-
-airplane_01.gat,247,64,5 duplicate(Exit2) Exit#06 857
-
-airplane_01.gat,240,39,1 duplicate(Exit2) Exit#07 857
-
-airplane_01.gat,247,39,1 duplicate(Exit2) Exit#08 857
-
-airplane_01.gat,100,69,2 duplicate(Airship Crew) Airship Crew#02 852
-
-airplane_01.gat,250,59,3 duplicate(AirshipInfo) Airship Staff#info 67
-
-airplane_01.gat,50,66,4 duplicate(AirshipApples) Meltz 86
-
-airplane_01.gat,32,61,4 duplicate(TypingContest) Nils 49
-
-airplane_01.gat,83,61,2 script Girl#10 72,{
-
- mes "[Dianne]";
- mes "It's so weird!";
- mes "I went to visit the";
- mes "Airship Captain and";
- mes "all I saw was this";
- mes "weird reindeer. Oh!";
- mes "Do you think that...";
- close;
-
-}
-
-airplane_01.gat,69,63,2 script Old Man#06 55,{
-
- mes "[Mendel]";
- mes "As I expected, the";
- mes "in-flight meals are";
- mes "three star quality at best.";
- mes "^111111*Harrrumph*^000000 I really should";
- mes "have brought my chef so that";
- mes "I could enjoy a real meal.";
- close;
-
-}
-
-airplane_01.gat,33,68,4 script Clarice 74,{
- callfunc "applegamble","Clarice";
- end;
-}
-
-//============================================================
-//= The Izlude Airship Staff
-//============================================================
-
-izlude.gat,201,54,3 script Airship Staff#izl 91,{
-
- mes "[Airship Staff]";
- mes "Welcome to the Izlude Airship.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airship Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto L_GotTicket;
- if(Zeny < 1200) goto L_NoZeny;
- set Zeny, Zeny - 1200;
- warp "airplane_01.gat",224,64;
- close;
-
- L_GotTicket:
- delitem 7311,1;
- warp "airplane_01.gat",224,64;
- close;
-
- L_NoZeny:
- mes "[Airship Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-//============================================================
-//= The Hugel Airship Staff
-//============================================================
-
-hugel.gat,182,150,3 script Airship Staff#hu 91,{
-
- mes "[Airship Staff]";
- mes "Welcome to the Schwartzwald Republic's Airship.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airship Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto L_GotTicket;
- if(Zeny < 1200) goto L_NoZeny;
- set Zeny, Zeny - 1200;
- warp "airplane.gat",224,64;
- close;
-
- L_GotTicket:
- delitem 7311,1;
- warp "airplane.gat",224,64;
- close;
-
- L_NoZeny:
- mes "[Airship Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-//============================================================
-//= Yuno Airport NPCs
-//============================================================
-
-y_airport.gat,144,63,4 script Airport Staff#Ein 91,{
-
- mes "[Airship Staff]";
- mes "Good day!";
- mes "Would you like to go";
- mes "to ^FF0000Einbroch^000000,^FF0000Hugel^000000 or";
- mes "^FF0000Lighthalzen^000000?";
- next;
- menu "Yes.",s_Warp,"No.",-;
-
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-
-s_Warp:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close2;
- warp "yuno.gat",57,240;
- end;
-
-}
-
-y_airport.gat,141,63,4 script Airport Staff#Izl 91,{
-
- mes "[Airship Staff]";
- mes "Good day!";
- mes "Would you like to go";
- mes "to ^FF0000Izlude^000000?";
- next;
- menu "Yes.",s_Warp,"No.",-;
-
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-
-s_Warp:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close2;
- warp "yuno.gat",50,240;
- end;
-
-}
-
-//============================================================
-//= Apple Gambling Function
-//============================================================
-
-function script applegamble {
- mes "["+getarg(0)+"]";
- mes "Hi, I'm "+getarg(0)+"~";
- mes "How would you like";
- mes "to wager some Apples";
- mes "in a friendly game of Dice?";
- next;
- switch(select("Play Dice Game:Learn Dice Game Rules:Cancel")){
- case 3:
- mes "["+getarg(0)+"]";
- mes "I'm up for a game of";
- mes "dice whenever you feel";
- mes "like it. Just talk to me if";
- mes "you ever get hit with the";
- mes "sudden urge to gamle, kay?";
- close;
- case 2:
- mes "["+getarg(0)+"]";
- mes "The rules for the Dice game";
- mes "are pretty simple. First, you";
- mes "place a bet by wagering Apples.";
- mes "You can bet a maximum of 50";
- mes "Apples at a time. To keep things";
- mes "legal, I can only accept Apples.";
- next;
- mes "["+getarg(0)+"]";
- mes "But hey, if all that zeny";
- mes "is burning a hole in your";
- mes "pocket, head over to Fruitz";
- mes "and you can buy as many";
- mes "Apples as you want, playah~";
- next;
- mes "["+getarg(0)+"]";
- mes "Now, we begin with me";
- mes "rolling wto 6-sided dice.";
- mes "When it's your turn, you'll";
- mes "roll two 6-sided dice. After";
- mes "that, both of us will have the";
- mes "option of rolling a third die.";
- next;
- mes "["+getarg(0)+"]";
- mes "Now here's the important";
- mes "thing. If your total is higher";
- mes "than 12, you'll bust, meaning";
- mes "that you lose. Otherwise, the";
- mes "person with the higher total";
- mes "is the winner. Got it?";
- next;
- mes "["+getarg(0)+"]";
- mes "Now, you'll be the first";
- mes "to decide whether or not";
- mes "you'll roll the third die. Then,";
- mes "depending on your result, I'll";
- mes "roll my third die... Or maybe not.";
- next;
- mes "["+getarg(0)+"]";
- mes "When you win, you'll";
- mes "receive twice as many";
- mes "Apples as you wagered.";
- mes "But if we happen to tie, you";
- mes "get the Apples that you bet";
- mes "returned to you. Fair, right?";
- close;
- case 1:
- break;
- }
- mes "["+getarg(0)+"]";
- mes "Ooh, so you'll play with";
- mes "me? Great! How many";
- mes "Apples would you like to bet?";
- mes "Remember, you can wager";
- mes "up to 50 Apples. If you'd like";
- mes "to cancel, please enter '0'.";
- next;
-L_Input:
- input @amount;
- if(@amount == 0) {
- mes "["+getarg(0)+"]";
- mes "Changed your mind?";
- mes "I understand. Well then,";
- mes "I hope we can play sometime.";
- close;
- }
- if(@amount > 50) set @amount,50;
- mes "["+getarg(0)+"]";
- mes "So you'll be";
- mes "betting ^FF0000"+@amount+"^000000 Apples.";
- mes "Is that right?";
- next;
- if(select("Yes:No")==2){
- mes "["+getarg(0)+"]";
- mes "Mm, made a mistake?";
- mes "Alright, please enter the";
- mes "number of Apples you";
- mes "wish to place in this bet";
- next;
- goto L_Input;
- }
- if(countitem(512)<@amount){
- //more apples then in inventory
- //-Improvised-
- mes "["+getarg(0)+"]";
- mes "Ooh...";
- mes "You don't have that";
- mes "much Apples with you,";
- mes "now do you?";
- close;
- }
- delitem 512,@amount;
- mes "["+getarg(0)+"]";
- mes "Good!";
- mes "Now we can start";
- mes "this game! I'll roll first~";
- next;
- mes "^0000FF*Rolling and rumbling*";
- set @table1,rand(1,6);
- set @table2,rand(1,6);
- set @tablesub,@table1+@table2;
- next;
- mes "I rolled a "+@table1+" and a "+@table2+",";
- mes "giving me a total of "+@tablesub+".";
- mes "Now it's your turn,";
- mes strcharinfo(0)+".";
- next;
- menu "Roll Dice.",-;
-
- mes "^0000FF*Rolling and rumbling*";
- set @player1,rand(1,6);
- set @player2,rand(1,6);
- set @playersub,@player1+@player2;
- next;
- mes "["+getarg(0)+"]";
- mes strcharinfo(0)+",";
- mes "you rolled a "+@player1+" and a "+@player2+",";
- mes "giving you a total of ^FF0000"+@playersub+"^000000.";
- next;
- mes "["+getarg(0)+"]";
- if(@playersub == @tablesub) {
- mes "Well, well, well.";
- mes "Both of us have a total";
- mes "of "+@playersub+". Well, the ball's in";
- mes "your court. Are you going";
- mes "to roll your third die,";
- mes strcharinfo(0)+"?";
- } else if(@playersub > @tablesub) {
- mes "Since my total is only ^0000FF"+@tablesub+"^000000,";
- mes "you have the advantage for";
- mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
- mes "you wanna roll one more die?";
- mes "Remember, you'll bust if all three";
- mes "of your dice total more than 12.";
- } else if(@tablesub > @playersub) {
- mes "Since my total is ^0000FF"+@tablesub+"^000000,";
- mes "I have the advantage for";
- mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
- mes "you wanna roll one more die?";
- mes "Remember, you'll bust if all three";
- mes "of your dice total more than 12.";
- }
- next;
- if(select("Roll another dice.:Don't Roll.")==2){
- mes "["+getarg(0)+"]";
- mes "Not gonna roll, huh?";
- if(@tablesub == @playersub) {
- mes "You better hope I roll";
- mes "too high and bust, or";
- mes "I'll beat you for sure!";
- mes "Okay, here goes nothing...";
- next;
- goto L_Table3;
- } else if(@tablesub < @playersub) {
- next;
- mes "["+getarg(0)+"]";
- mes "Alright, I see that you";
- mes "don't want to risk rolling";
- mes "higher than 12 and busting.";
- mes "I'll go ahead and roll then.";
- next;
- goto L_Table3;
- } else if(@tablesub > @playersub) {
- //you have a lower sub total then table, and do not roll 3th -Improvised-
- mes "["+getarg(0)+"]";
- mes "Not gonna roll, huh?";
- mes "Well, then I'm not";
- mes "gonna roll either.";
- next;
- mes "["+getarg(0)+"]";
- mes "That means that I";
- mes "have a total of ^0000FF"+@tablesub+"^000000";
- mes "wich beats your ^FF0000"+@playersub+"^000000.";
- mes "I'm sorry, but you lose";
- mes "this game, "+strcharinfo(0)+". Better";
- mes "luck next time.";
- }
- close;
- }
- mes "^0000FF*Rolling and rumbling*";
- set @player3,rand(1,6);
- set @playersub,@playersub+@player3;
- if(@playersub > 12) {
- //player bust --Improvised--
- next;
- mes "["+getarg(0)+"]";
- mes "Oh my... You rolled a ^FF000"+@player3+"^000000,";
- mes "making your total ^FF0000"+@playersub+"^000000.";
- mes "That's more then 12, meaning you bust.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+".";
- close;
- }
- next;
- mes "["+getarg(0)+"]";
- mes "Oh hey! You rolled";
- if(@playersub >= @tablesub) {
- mes "a ^FF0000"+@player3+"^000000, giving you a total";
- mes "of ^FF0000"+@playersub+"^000000. Now, if I don't";
- mes "roll, I'll lose for sure!";
- mes "I'm gonna go for it...";
- next;
- goto L_Table3;
- } else if(@playersub < @tablesub) {
- //player's sub together with 3th die is still too low
- //--Improvised--
- mes "a ^FF0000"+@player3+"^000000, giving";
- mes "you a total of ^FF0000"+@playersub+"^000000.";
- mes "Wich still isn't enough";
- mes "to beat my ^0000FF"+@tablesub+"^000000.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+". Them's";
- mes "the breaks, I suppose...";
- close;
- }
-L_Table3:
- mes "^0000FF*Rolling and rumbling*";
- set @table3,rand(1,6);
- set @tablesub,@tablesub+@table3;
- next;
- if(@tablesub > 12) {
- mes "["+getarg(0)+"]";
- mes "Eh? I rolled a ^0000FF"+@table3+"^000000, making";
- mes "my total ^0000FF"+@tablesub+"^000000. I hate to say";
- mes "it, but I gambled and lost.";
- mes "Take your winnings before";
- mes "I cry, "+strcharinfo(0)+"~!";
- close2;
- getitem 512,@amount*2;
- end;
- }
- mes "["+getarg(0)+"]";
- if(@tablesub < @playersub) {
- mes "I rolled a "+@table3+", which";
- mes "gives me a total of ^0000FF"+@tablesub+"^000000.";
- mes "But... It's still not enough";
- mes "to beat your ^FF0000"+@playersub+"^000000. It looks";
- mes "like I can't compete with";
- mes "you, "+strcharinfo(0)+"...";
- close2;
- getitem 512,@amount*2;
- end;
- } else if(@tablesub > @playersub) {
- mes "I rolled a ^0000FF"+@table3+"^000000, giving";
- mes "me a total of ^0000FF"+@tablesub+"^000000 which";
- mes "beats your total of ^FF0000"+@playersub+"^000000.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+". Them's";
- mes "the breaks, I suppose...";
- close;
- } else if(@tablesub == @playersub) {
- //Result = tie, --Improvised--
- mes "I rolled a ^0000FF"+@table3+"^000000, giving";
- mes "me a total of ^0000FF"+@tablesub+"^000000, which";
- mes "is the same as your total.";
- mes "Well, this game didn't have a";
- mes "winner or loser, "+strcharinfo(0)+".";
- close2;
- getitem 512,@amount;
- end;
- }
-}
+//===== eAthena Script =======================================
+//= The Airship System Script
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 0.5c
+//===== Compatible With: =====================================
+//= eAthena SVN 3422+(Requires jA Script System)
+//===== Description: =========================================
+//= The Airship System used in the official servers, however this
+//= one is still about 25% custom and is missing some npcs.
+//===== Additional Comments: =================================
+//= 0.1 Added first version, it might be a little buggy [MasterOfMuppets]
+//= 0.1a Fixed the Airport Staff#Iz which was [MasterOfMuppets]
+//= warping you to the same location as Airport Staff#Ein
+//= 0.2 Implemented some more airship NPCs, more are to come.
+//= 0.3 Implemented some more NPCs [MasterOfMuppets]
+//= 0.4 Implemented two mini games scripted by Dj-Yhn [MasterOfMuppets]
+//= 0.5 Removed Duplicates [Silent]
+//= 0.5aFixed a typo [Evera] 0.5b Fixed appledice bugs [Lupus]
+//============================================================
+
+//============================================================
+//= The Airship System (Yuno -> Hugel -> Einbroch -> Lighthalzen -> repeat)
+//============================================================
+
+airplane.gat,243,74,4 script #AirshipWarp-1 45,2,2{
+OnTouch:
+ if($@airplanelocation == 1)warp "einbroch.gat",90,275;
+ if($@airplanelocation == 2)warp "yuno.gat",85,265;
+ if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
+ if($@airplanelocation == 4)warp "hugel.gat",182,150;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane.gat,243,29,4 script #AirshipWarp-2 45,2,2{
+OnTouch:
+ if($@airplanelocation == 1)warp "einbroch.gat",90,275;
+ if($@airplanelocation == 2)warp "yuno.gat",85,265;
+ if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
+ if($@airplanelocation == 4)warp "hugel.gat",182,150;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane.gat,1,1,0 script EinYuno_Airship -1,{
+OnInit:
+while(1)
+{
+ initnpctimer;
+ setnpctimer 0;
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Hugel.",1,0xBA55D3;
+ end;
+OnTimer15000:
+ mapannounce "airplane.gat","We are heading to Hugel.",1,0xBA55D3;
+ end;
+OnTimer30000:
+ mapannounce "airplane.gat","We will arrive in Hugel shortly.",1,0xBA55D3;
+ end;
+OnTimer45000:
+ set $@airplanelocation,4;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Hugel. Have a safe trip.",1,0xBA55D3;
+ end;
+OnTimer55000:
+ mapannounce "airplane.gat","Currently, we are in Hugel. The Airship will leave shortly.",1,0xBA55D3;
+ end;
+OnTimer65000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Einbroch.",1,0x00FF00;
+ end;
+OnTimer80000:
+ mapannounce "airplane.gat","We are heading to Einbroch.",1,0x00FF00;
+ end;
+OnTimer95000:
+ mapannounce "airplane.gat","We will arrive in Einbroch shortly.",1,0x00FF00;
+ end;
+OnTimer110000:
+ set $@airplanelocation,1;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Einbroch. Have a safe trip.",1,0x00FF00;
+ end;
+OnTimer120000:
+ mapannounce "airplane.gat","Currently, we are in Einbroch. The Airship will take off shortly.",1,0x00FF00;
+ end;
+OnTimer130000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Lighthalzen.",1,0xFF8600;
+ end;
+OnTimer145000:
+ mapannounce "airplane.gat","We are heading to Lighthalzen.",1,0xFF8600;
+ end;
+OnTimer160000:
+ mapannounce "airplane.gat","We will arrive in Lighthalzen shortly.",1,0xFF8600;
+ end;
+OnTimer175000:
+ set $@airplanelocation,3;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Lighthalzen. Have a safe trip.",1,0xFF8600;
+ end;
+OnTimer185000:
+ mapannounce "airplane.gat","Currently, we are in Lighthalzen. The Airship will leave shortly.",1,0xFF8600;
+ end;
+OnTimer195000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is now taking off. Our next destination is Yuno.",1,0x70DBDB;
+ end;
+OnTimer210000:
+ mapannounce "airplane.gat","We are heading to Yuno.",1,0x70DBDB;
+ end;
+OnTimer225000:
+ mapannounce "airplane.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
+ end;
+OnTimer240000:
+ set $@airplanelocation,2;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
+ end;
+OnTimer250000:
+ mapannounce "airplane.gat","Currently, we are in Yuno. The Airship will leave shortly.",1,0x70DBDB;
+ end;
+OnTimer260000:
+ stoptimer;
+}
+}
+
+//C4644E
+
+//============================================================
+//= Some normal NPCS (airplane.gat)
+//============================================================
+
+airplane.gat,240,64,5 script Exit#01::Exit2 857,{
+
+end;
+
+}
+
+airplane.gat,247,64,5 duplicate(Exit2) Exit#02 857
+
+airplane.gat,240,39,1 duplicate(Exit2) Exit#03 857
+
+airplane.gat,247,39,1 duplicate(Exit2) Exit#04 857
+
+airplane.gat,100,69,2 script Airship Crew#01::Airship Crew 852,{
+
+ mes "[Airship Crew]";
+ mes "If we've landed at";
+ mes "your destination and";
+ mes "you'd like to leave the";
+ mes "Airship, please use the";
+ mes "stairs up ahead. Thank";
+ mes "you for you patronage.";
+ close;
+
+}
+
+airplane.gat,250,59,3 script Airship Staff::AirshipInfo 67,{
+
+ mes "[Airship Staff]";
+ mes "Welcome";
+ mes "to the Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Using the Airship",s_Use,"Captain's Cabin",s_Capt,"Facilities",s_Faci,"Cancel",-;
+
+ mes "[Airship Staff]";
+ mes "Well, I hope you like";
+ mes "your flight aboard";
+ mes "our Airships. Thank";
+ mes "you and have a good day.";
+ close;
+
+s_Use:
+ mes "[Airship Staff]";
+ mes "When you see a broadcast";
+ mes "announcing that we have";
+ mes "arrived at your destination,";
+ mes "please use one of the exits";
+ mes "located at the north and";
+ mes "south ends of the Airship";
+ next;
+ mes "[Airship Staff]";
+ mes "If you happen to miss";
+ mes "your stop, don't worry.";
+ mes "The airship is constantly";
+ mes "on route and you'll get";
+ mes "another chance to arrive";
+ mes "to your intended destination.";
+ close;
+
+s_Capt:
+ mes "[Airship Staff]";
+ mes "The Captain's Cabin";
+ mes "is located at the front";
+ mes "of the Airship. There, you";
+ mes "can meet the captain and";
+ mes "the pilot of the Airship.";
+ close;
+
+s_Faci:
+ mes "[Airship Staff]";
+ mes "The Airship provides";
+ mes "various Mini Games for";
+ mes "the entertainment of all";
+ mes "our passengers. We invite";
+ mes "you to try your luck and skills";
+ mes "in the Airship's Mini Games~";
+ close;
+
+}
+
+airplane.gat,50,66,4 script Meltz::AirshipApples 86,{
+
+ mes "[Meltz]";
+ mes "Welcome to Meltz's";
+ mes "Shop where you can";
+ mes "purchase Apples or grind";
+ mes "them to make Apple Juice.";
+ next;
+ menu "Buy Apples",s_Buy,"Make Apple Juice",s_Juice,"Cancel.",-;
+
+s_Cancel:
+ mes "[Meltz]";
+ mes "Thanks for stopping";
+ mes "by my shop. Farewell!";
+ mes "Come back anytime when";
+ mes "you feel like having an";
+ mes "Apple to snack on~";
+ close;
+
+s_Buy:
+ mes "[Meltz]";
+ mes "Please enter the amount";
+ mes "of Apples that you wish to";
+ mes "buy. Each Apple is 15 zeny";
+ mes "and you can buy a maximum";
+ mes "of 500 at a time. Please enter";
+ mes "\"0\" to cancel your order.";
+ next;
+ input @tempapple;
+ if(!@tempapple)goto s_Cancel;
+ if(@tempapple > 0 && @tempapple < 501)goto s_AppleBuy;
+ if(@tempapple < 0)close;
+ mes "[Meltz]";
+ mes "The maximum amount of apples";
+ mes "you can buy at the same time";
+ mes "is 500. " + @tempapple + " is clearly";
+ mes "over 500.";
+ close;
+
+s_AppleBuy:
+ mes "[Meltz]";
+ mes "A total of ^FF0000" + @tempapple + "^000000 Apples.";
+ mes "will cost you ^FF0000" + @tempapple * 15 + "^000000 zeny.";
+ mes "Would you like to continue?";
+ next;
+ menu "Yes",-,"No",s_Cancel;
+
+ if(zeny < (@tempapple * 15))goto s_NEnoughZeny;
+ mes "[Meltz]";
+ mes "Thanks for stopping by";
+ mes "my shop. I hope you enjoy";
+ mes "the flavor of these Apples~!";
+ getitem 512,@tempapple;
+ set zeny,zeny - (@tempapple * 15);
+ close;
+
+s_NEnoughZeny:
+ mes "[Meltz]";
+ mes "I'm sorry buy you don't";
+ mes "seem to have enough zeny.";
+ mes "Come back anytime when";
+ mes "you feel like having an";
+ mes "Apple to snack on~";
+ close;
+
+s_Juice:
+ mes "[Meltz]";
+ mes "Okay, I'll need";
+ mes "^FF00003 Apples and 1 Empty Bottle^000000";
+ mes "to make 1 Apple Juice for you.";
+ mes "Would you like to proceed?";
+ next;
+ menu "Yes",-,"No",s_Cancel;
+
+ if(countitem(512) < 3 || !countitem(713))goto s_Material;
+ mes "[Meltz]";
+ mes "Thank you,";
+ mes "please wait";
+ mes "just a moment.";
+ next;
+ mes "*Grind grind*";
+ mes "*Grind grind*";
+ mes "*Clang...!*";
+ next;
+ mes "[Meltz]";
+ mes "There you go~";
+ mes "I hope you enjoy!";
+ mes "Please feel free to";
+ mes "stop by for your Apple";
+ mes "and Apple Juice needs";
+ mes "at anytime, adventurer~";
+ delitem 512,3;
+ delitem 713,1;
+ getitem 531,1;
+ close;
+
+s_Material:
+ mes "[Meltz]";
+ mes "I'm sorry, but you don't";
+ mes "have enough materials to";
+ mes "create a bottle of Apple Juice.";
+ mes "Remember, I need 3 Apples";
+ mes "and 1 Empty Bottle to do it.";
+ close;
+
+}
+
+
+airplane.gat,33,69,4 script Kaci 73,{
+ callfunc "applegamble","Kaci";
+ end;
+
+ OnLose:
+ emotion e_wah;
+ end;
+
+ OnWin:
+ emotion e_no1;
+ end;
+}
+
+airplane.gat,80,71,4 script Zerta 834,{
+ mes "[Zerta]";
+ mes "Oh, hello adventurer.";
+ mes "I am currently on a";
+ mes "sacred journey, offering";
+ mes "prayer for the sake of the";
+ mes "Rune-Midgard continent.";
+ close;
+}
+
+airplane.gat,65,63,4 script Maelin 714,{
+ mes "[Maelin]";
+ mes "Um, this Airship is";
+ mes "to Lutie, isn't it? I've";
+ mes "been waiting so long,";
+ mes "but I haven't heard any";
+ mes "broadcast about Lutie.";
+ close;
+}
+
+airplane.gat,32,61,4 script Nils::TypingContest 49,{
+ callfunc "F_ClearGarbage"; //Clear outdated, unused variables
+loopback:
+ mes "[Nils]";
+ mes "Welcome to the";
+ mes "^FF0000RO Typing Challenge^000000.";
+ mes "Would you like to play";
+ mes "a quick typing game?";
+ next;
+ menu "Play ^FF0000RO Typing Challenge^000000",s_Play,"Information",s_Info,"View Top Records",s_Record,"Cancel",-;
+
+ mes "[Nils]";
+ mes "Feel free to take on the";
+ mes "Ro Typing Challenge";
+ mes "anytime. I'll be here~";
+ close;
+
+s_Play:
+ mes "[Nils]";
+ mes "Okay, we have";
+ mes "a new challenger!";
+ mes "Enter the following";
+ mes "text as quickly as you";
+ mes "can without making any";
+ mes "mistakes! Let's start~!";
+ next;
+ //below arrays are for simplified entering of new lines ;P
+ //first lines array
+ setarray $@textstringsa$[0],"^00FFFFthkelfkskeldmsiejdlsle^0000FFhfndkelsheidl",
+ "^993366hfjdkeldjsieldjs^663366hfjdjeiskdlefvbd",
+ "^00FFFFCoboman no chikara-yumei na",
+ "^993366belief love luck grimace sweat rush",
+ "^00FFFFcallipygian salacious lascivious",
+ "^663366uNflAPPaBLe LoVaBLe SeCreTs AnD",
+ "^00CCFFburrdingdingdilidingdingphoohudaamb",
+ "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi",
+ "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn",
+ "^00CCFFI'm the King of all Weirdos! Now",
+ "^00CCFFBy the power of^000000",
+ "^00CCFF...silence. quiet benevolence...";
+ //second lines array
+ setarray $@textstringsb$[0],"skemd",
+ "",
+ "chikara-dalookii na chikara da ze!",
+ "folktale rodimus optimus bumblebee",
+ "licentious prurient concupiscent",
+ "BoWLiNg aGaINST tHe KarMA of YoUtH",
+ "andoora^0000FFbambarambambamburanbamding",
+ "kabamturubamdingding",
+ "RiGhT BuRn OrIGInAL GaNgSteR SmACk",
+ "you know of my true power. Obey~!",
+ "p-po-poi-po-poi-poin-poing",
+ "soul mate... wonder. enigma...";
+ //for the few 3-liners... =X
+ setarray $@textstringsc$[0],"",
+ "",
+ "COBO ON!",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "GOD-POING. I NEVER LOSE!",
+ "cloud.";
+ //comparisation strings
+ setarray $@compstring$[0],"thkelfkskeldmsiejdlslehfndkelsheidlskemd",
+ "hfjdkeldjsieldjshfjdjeiskdlefvbd",
+ "Coboman no chikara-yumei na chikara-dalookii na chikara da ze! COBO ON",
+ "belief love luck grimace sweat rush folktale rodimus optimus bumblebee",
+ "callipygian salacious lascivious licentious prurient concupiscent",
+ "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA of YoUtH",
+ "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding",
+ "barapaphurarlandreamduranbatuhiwooikabamturubamdingding",
+ "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk",
+ "I'm the King of all Weirdos! Now you know of my true power. Obey~!",
+ "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!",
+ "...silence. quiet benevolence... soul mate... wonder. enigma... cloud";
+ //lengths
+ setarray $@lengths[0],20,32,73,73,65,66,67,55,67,66,67,69;
+ // initnpctimer;
+ mes "[Nils]";
+ set @index,rand(1,getarraysize($@textstringsa$))-1;
+ set @string1a$,$@textstringsa$[@index];
+ set @string1b$,$@textstringsb$[@index];
+ set @string1c$,$@textstringsc$[@index];
+ set @typingstring1$,$@compstring$[@index];
+ set @typingkeys,$@lengths[@index];
+ set @index2,rand(1,getarraysize($@textstringsa$))-1;
+ while (@index2 == @index) {
+ set @index2,rand(1,getarraysize($@textstringsa$))-1;
+ }
+ set @string2a$,$@textstringsa$[@index2];
+ set @string2b$,$@textstringsb$[@index2];
+ set @string2c$,$@textstringsc$[@index2];
+ set @typingstring2$,$@compstring$[@index2];
+ set @typingkeys,@typingkeys+$@lengths[@index2];
+ set @start,gettime(3)*60*60+gettime(2)*60+gettime(1);
+ mes @string1a$;
+ if(@string1b$ != "")mes @string1b$;
+ if(@string1c$ != "")mes @string1c$;
+ input @comparisonvar$[1];
+ next;
+ mes "^000000[Nils]";
+ mes @string2a$;
+ if(@string2b$ != "")mes @string2b$;
+ if(@string2c$ != "")mes @string2c$;
+ input @comparisonvar$[2];
+ if(@comparisonvar$[1] == @typingstring1$ && @comparisonvar$[2] == @typingstring2$)set @typingcorrect,1;
+ next;
+ if(!@typingcorrect)goto s_Fail;
+ set @time,(gettime(3)*60*60+gettime(2)*60+gettime(1))-@start; //seconds taken
+ set @mypoints,(@typingkeys * 100) / @time;
+ mes "[Nils]";
+ mes "Your typing time";
+ mes "was ^FF0000" + @time + " seconds^000000";
+ mes "and your score is";
+ mes "^0000FF" + @mypoints + "^000000 points";
+ next;
+ if(@mypoints <= $TypingRecord)goto loopback;
+ mes "[Nils]";
+ mes "Congratulations!";
+ mes "It's a new record.";
+ mes "I'll put you on the high-";
+ mes "score list immediately.";
+ set $TypingRecord,@mypoints;
+ set $TypingRecord$,strcharinfo(0);
+ close;
+
+s_Fail:
+ mes "^000000[Nils]";
+ mes "I'm sorry you didn't type";
+ mes "all characters correctly.";
+ mes "But remember, practice makes";
+ mes "perfect!";
+ close;
+
+s_Info:
+ mes "[Nils]";
+ mes "The RO Typing Challenge";
+ mes "is a game where you enter";
+ mes "the given text as quickly as you";
+ mes "can. The name of the top player";
+ mes "is recorded for posterity. If you";
+ mes "want fame, here's your chance!";
+ next;
+ mes "[Nils]";
+ mes "I'd just like to let";
+ mes "you know that you type";
+ mes "all the text that you see";
+ mes "in the single input line that";
+ mes "you're given. So don't press";
+ mes "the enter key, just click 'OK'.";
+ close;
+
+s_Record:
+ mes "[Nils]";
+ mes "^0000FF" + $TypingRecord$ + "^000000";
+ mes "is the current";
+ mes "record holder with";
+ mes "a record of ^0000FF" + $TypingRecord + "^000000";
+ mes "points. Try to beat";
+ mes "that record next time~";
+ close;
+
+}
+
+//============================================================
+//= The Airship System (Yuno -> Izlude -> Repeat)
+//============================================================
+
+airplane_01.gat,243,74,4 script #AirshipWarp-3 45,2,2{
+OnTouch:
+ if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
+ if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane_01.gat,243,29,4 script #AirshipWarp-4 45,2,2{
+OnTouch:
+ if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
+ if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane_01.gat,1,1,0 script YunoIzl_Airship -1,{
+OnInit:
+while(1)
+{
+ initnpctimer;
+ setnpctimer 0;
+ set $@airplanelocation2,0;
+ donpcevent "#AirshipWarp-3::OnHide";
+ donpcevent "#AirshipWarp-4::OnHide";
+ disablenpc "#AirshipWarp-3";
+ disablenpc "#AirshipWarp-4";
+ mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Izlude.",1,0x00FF00;
+ end;
+OnTimer15000:
+ mapannounce "airplane_01.gat","We are heading to Izlude.",1,0x00FF00;
+ end;
+OnTimer30000:
+ mapannounce "airplane_01.gat","We will arrive in Izlude shortly.",1,0x00FF00;
+ end;
+OnTimer45000:
+ set $@airplanelocation2,1;
+ enablenpc "#AirshipWarp-3";
+ enablenpc "#AirshipWarp-4";
+ donpcevent "#AirshipWarp-3::OnUnhide";
+ donpcevent "#AirshipWarp-4::OnUnhide";
+ mapannounce "airplane_01.gat","Welcome to Izlude. Have a safe trip.",1,0x00FF00;
+ end;
+OnTimer55000:
+ mapannounce "airplane_01.gat","Currently, we are in Izlude. The Airship will leave shortly.",1,0x00FF00;
+ end;
+OnTimer65000:
+ set $@airplanelocation2,0;
+ donpcevent "#AirshipWarp-3::OnHide";
+ donpcevent "#AirshipWarp-4::OnHide";
+ disablenpc "#AirshipWarp-3";
+ disablenpc "#AirshipWarp-4";
+ mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Yuno.",1,0x70DBDB;
+ end;
+OnTimer80000:
+ mapannounce "airplane_01.gat","We are heading to Yuno.",1,0x70DBDB;
+ end;
+OnTimer95000:
+ mapannounce "airplane_01.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
+ end;
+OnTimer110000:
+ set $@airplanelocation2,2;
+ enablenpc "#AirshipWarp-3";
+ enablenpc "#AirshipWarp-4";
+ donpcevent "#AirshipWarp-3::OnUnhide";
+ donpcevent "#AirshipWarp-4::OnUnhide";
+ mapannounce "airplane_01.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
+ end;
+OnTimer120000:
+ mapannounce "airplane_01.gat","Currently, we are in Yuno. The Airship will take off shortly.",1,0x70DBDB;
+ end;
+OnTimer130000:
+ stoptimer;
+}
+}
+
+//============================================================
+//= Some normal NPCS (airplane_01.gat)
+//============================================================
+
+airplane_01.gat,240,64,5 duplicate(Exit2) Exit#05 857
+
+airplane_01.gat,247,64,5 duplicate(Exit2) Exit#06 857
+
+airplane_01.gat,240,39,1 duplicate(Exit2) Exit#07 857
+
+airplane_01.gat,247,39,1 duplicate(Exit2) Exit#08 857
+
+airplane_01.gat,100,69,2 duplicate(Airship Crew) Airship Crew#02 852
+
+airplane_01.gat,250,59,3 duplicate(AirshipInfo) Airship Staff#info 67
+
+airplane_01.gat,50,66,4 duplicate(AirshipApples) Meltz 86
+
+airplane_01.gat,32,61,4 duplicate(TypingContest) Nils 49
+
+airplane_01.gat,83,61,2 script Girl#10 72,{
+
+ mes "[Dianne]";
+ mes "It's so weird!";
+ mes "I went to visit the";
+ mes "Airship Captain and";
+ mes "all I saw was this";
+ mes "weird reindeer. Oh!";
+ mes "Do you think that...";
+ close;
+
+}
+
+airplane_01.gat,69,63,2 script Old Man#06 55,{
+
+ mes "[Mendel]";
+ mes "As I expected, the";
+ mes "in-flight meals are";
+ mes "three star quality at best.";
+ mes "^111111*Harrrumph*^000000 I really should";
+ mes "have brought my chef so that";
+ mes "I could enjoy a real meal.";
+ close;
+
+}
+
+airplane_01.gat,33,68,4 script Clarice 74,{
+ callfunc "applegamble","Clarice";
+ end;
+}
+
+//============================================================
+//= The Izlude Airship Staff
+//============================================================
+
+izlude.gat,201,54,3 script Airship Staff#izl 91,{
+
+ mes "[Airship Staff]";
+ mes "Welcome to the Izlude Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airship Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto L_GotTicket;
+ if(Zeny < 1200) goto L_NoZeny;
+ set Zeny, Zeny - 1200;
+ warp "airplane_01.gat",224,64;
+ close;
+
+ L_GotTicket:
+ delitem 7311,1;
+ warp "airplane_01.gat",224,64;
+ close;
+
+ L_NoZeny:
+ mes "[Airship Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+//============================================================
+//= The Hugel Airship Staff
+//============================================================
+
+hugel.gat,182,150,3 script Airship Staff#hu 91,{
+
+ mes "[Airship Staff]";
+ mes "Welcome to the Schwartzwald Republic's Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airship Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto L_GotTicket;
+ if(Zeny < 1200) goto L_NoZeny;
+ set Zeny, Zeny - 1200;
+ warp "airplane.gat",224,64;
+ close;
+
+ L_GotTicket:
+ delitem 7311,1;
+ warp "airplane.gat",224,64;
+ close;
+
+ L_NoZeny:
+ mes "[Airship Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+//============================================================
+//= Yuno Airport NPCs
+//============================================================
+
+y_airport.gat,144,63,4 script Airport Staff#Ein 91,{
+
+ mes "[Airship Staff]";
+ mes "Good day!";
+ mes "Would you like to go";
+ mes "to ^FF0000Einbroch^000000,^FF0000Hugel^000000 or";
+ mes "^FF0000Lighthalzen^000000?";
+ next;
+ menu "Yes.",s_Warp,"No.",-;
+
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+
+s_Warp:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close2;
+ warp "yuno.gat",57,240;
+ end;
+
+}
+
+y_airport.gat,141,63,4 script Airport Staff#Izl 91,{
+
+ mes "[Airship Staff]";
+ mes "Good day!";
+ mes "Would you like to go";
+ mes "to ^FF0000Izlude^000000?";
+ next;
+ menu "Yes.",s_Warp,"No.",-;
+
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+
+s_Warp:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close2;
+ warp "yuno.gat",50,240;
+ end;
+
+}
+
+//============================================================
+//= Apple Gambling Function
+//============================================================
+
+function script applegamble {
+ mes "["+getarg(0)+"]";
+ mes "Hi, I'm "+getarg(0)+"~";
+ mes "How would you like";
+ mes "to wager some Apples";
+ mes "in a friendly game of Dice?";
+ next;
+ switch(select("Play Dice Game:Learn Dice Game Rules:Cancel")){
+ case 3:
+ mes "["+getarg(0)+"]";
+ mes "I'm up for a game of";
+ mes "dice whenever you feel";
+ mes "like it. Just talk to me if";
+ mes "you ever get hit with the";
+ mes "sudden urge to gamle, kay?";
+ close;
+ case 2:
+ mes "["+getarg(0)+"]";
+ mes "The rules for the Dice game";
+ mes "are pretty simple. First, you";
+ mes "place a bet by wagering Apples.";
+ mes "You can bet a maximum of 50";
+ mes "Apples at a time. To keep things";
+ mes "legal, I can only accept Apples.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "But hey, if all that zeny";
+ mes "is burning a hole in your";
+ mes "pocket, head over to Fruitz";
+ mes "and you can buy as many";
+ mes "Apples as you want, playah~";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now, we begin with me";
+ mes "rolling wto 6-sided dice.";
+ mes "When it's your turn, you'll";
+ mes "roll two 6-sided dice. After";
+ mes "that, both of us will have the";
+ mes "option of rolling a third die.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now here's the important";
+ mes "thing. If your total is higher";
+ mes "than 12, you'll bust, meaning";
+ mes "that you lose. Otherwise, the";
+ mes "person with the higher total";
+ mes "is the winner. Got it?";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now, you'll be the first";
+ mes "to decide whether or not";
+ mes "you'll roll the third die. Then,";
+ mes "depending on your result, I'll";
+ mes "roll my third die... Or maybe not.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "When you win, you'll";
+ mes "receive twice as many";
+ mes "Apples as you wagered.";
+ mes "But if we happen to tie, you";
+ mes "get the Apples that you bet";
+ mes "returned to you. Fair, right?";
+ close;
+ case 1:
+ break;
+ }
+ mes "["+getarg(0)+"]";
+ mes "Ooh, so you'll play with";
+ mes "me? Great! How many";
+ mes "Apples would you like to bet?";
+ mes "Remember, you can wager";
+ mes "up to 50 Apples. If you'd like";
+ mes "to cancel, please enter '0'.";
+ next;
+L_Input:
+ input @amount;
+ if(@amount == 0) {
+ mes "["+getarg(0)+"]";
+ mes "Changed your mind?";
+ mes "I understand. Well then,";
+ mes "I hope we can play sometime.";
+ close;
+ }
+ if(@amount > 50) set @amount,50;
+ mes "["+getarg(0)+"]";
+ mes "So you'll be";
+ mes "betting ^FF0000"+@amount+"^000000 Apples.";
+ mes "Is that right?";
+ next;
+ if(select("Yes:No")==2){
+ mes "["+getarg(0)+"]";
+ mes "Mm, made a mistake?";
+ mes "Alright, please enter the";
+ mes "number of Apples you";
+ mes "wish to place in this bet";
+ next;
+ goto L_Input;
+ }
+ if(countitem(512)<@amount){
+ //more apples then in inventory
+ //-Improvised-
+ mes "["+getarg(0)+"]";
+ mes "Ooh...";
+ mes "You don't have that";
+ mes "much Apples with you,";
+ mes "now do you?";
+ close;
+ }
+ delitem 512,@amount;
+ mes "["+getarg(0)+"]";
+ mes "Good!";
+ mes "Now we can start";
+ mes "this game! I'll roll first~";
+ next;
+ mes "^0000FF*Rolling and rumbling*";
+ set @table1,rand(1,6);
+ set @table2,rand(1,6);
+ set @tablesub,@table1+@table2;
+ next;
+ mes "I rolled a "+@table1+" and a "+@table2+",";
+ mes "giving me a total of "+@tablesub+".";
+ mes "Now it's your turn,";
+ mes strcharinfo(0)+".";
+ next;
+ menu "Roll Dice.",-;
+
+ mes "^0000FF*Rolling and rumbling*";
+ set @player1,rand(1,6);
+ set @player2,rand(1,6);
+ set @playersub,@player1+@player2;
+ next;
+ mes "["+getarg(0)+"]";
+ mes strcharinfo(0)+",";
+ mes "you rolled a "+@player1+" and a "+@player2+",";
+ mes "giving you a total of ^FF0000"+@playersub+"^000000.";
+ next;
+ mes "["+getarg(0)+"]";
+ if(@playersub == @tablesub) {
+ mes "Well, well, well.";
+ mes "Both of us have a total";
+ mes "of "+@playersub+". Well, the ball's in";
+ mes "your court. Are you going";
+ mes "to roll your third die,";
+ mes strcharinfo(0)+"?";
+ } else if(@playersub > @tablesub) {
+ mes "Since my total is only ^0000FF"+@tablesub+"^000000,";
+ mes "you have the advantage for";
+ mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
+ mes "you wanna roll one more die?";
+ mes "Remember, you'll bust if all three";
+ mes "of your dice total more than 12.";
+ } else if(@tablesub > @playersub) {
+ mes "Since my total is ^0000FF"+@tablesub+"^000000,";
+ mes "I have the advantage for";
+ mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
+ mes "you wanna roll one more die?";
+ mes "Remember, you'll bust if all three";
+ mes "of your dice total more than 12.";
+ }
+ next;
+ if(select("Roll another dice.:Don't Roll.")==2){
+ mes "["+getarg(0)+"]";
+ mes "Not gonna roll, huh?";
+ if(@tablesub == @playersub) {
+ mes "You better hope I roll";
+ mes "too high and bust, or";
+ mes "I'll beat you for sure!";
+ mes "Okay, here goes nothing...";
+ next;
+ goto L_Table3;
+ } else if(@tablesub < @playersub) {
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Alright, I see that you";
+ mes "don't want to risk rolling";
+ mes "higher than 12 and busting.";
+ mes "I'll go ahead and roll then.";
+ next;
+ goto L_Table3;
+ } else if(@tablesub > @playersub) {
+ //you have a lower sub total then table, and do not roll 3th -Improvised-
+ mes "["+getarg(0)+"]";
+ mes "Not gonna roll, huh?";
+ mes "Well, then I'm not";
+ mes "gonna roll either.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "That means that I";
+ mes "have a total of ^0000FF"+@tablesub+"^000000";
+ mes "wich beats your ^FF0000"+@playersub+"^000000.";
+ mes "I'm sorry, but you lose";
+ mes "this game, "+strcharinfo(0)+". Better";
+ mes "luck next time.";
+ }
+ close;
+ }
+ mes "^0000FF*Rolling and rumbling*";
+ set @player3,rand(1,6);
+ set @playersub,@playersub+@player3;
+ if(@playersub > 12) {
+ //player bust --Improvised--
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Oh my... You rolled a ^FF000"+@player3+"^000000,";
+ mes "making your total ^FF0000"+@playersub+"^000000.";
+ mes "That's more then 12, meaning you bust.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+".";
+ close;
+ }
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Oh hey! You rolled";
+ if(@playersub >= @tablesub) {
+ mes "a ^FF0000"+@player3+"^000000, giving you a total";
+ mes "of ^FF0000"+@playersub+"^000000. Now, if I don't";
+ mes "roll, I'll lose for sure!";
+ mes "I'm gonna go for it...";
+ next;
+ goto L_Table3;
+ } else if(@playersub < @tablesub) {
+ //player's sub together with 3th die is still too low
+ //--Improvised--
+ mes "a ^FF0000"+@player3+"^000000, giving";
+ mes "you a total of ^FF0000"+@playersub+"^000000.";
+ mes "Wich still isn't enough";
+ mes "to beat my ^0000FF"+@tablesub+"^000000.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+". Them's";
+ mes "the breaks, I suppose...";
+ close;
+ }
+L_Table3:
+ mes "^0000FF*Rolling and rumbling*";
+ set @table3,rand(1,6);
+ set @tablesub,@tablesub+@table3;
+ next;
+ if(@tablesub > 12) {
+ mes "["+getarg(0)+"]";
+ mes "Eh? I rolled a ^0000FF"+@table3+"^000000, making";
+ mes "my total ^0000FF"+@tablesub+"^000000. I hate to say";
+ mes "it, but I gambled and lost.";
+ mes "Take your winnings before";
+ mes "I cry, "+strcharinfo(0)+"~!";
+ close2;
+ getitem 512,@amount*2;
+ end;
+ }
+ mes "["+getarg(0)+"]";
+ if(@tablesub < @playersub) {
+ mes "I rolled a "+@table3+", which";
+ mes "gives me a total of ^0000FF"+@tablesub+"^000000.";
+ mes "But... It's still not enough";
+ mes "to beat your ^FF0000"+@playersub+"^000000. It looks";
+ mes "like I can't compete with";
+ mes "you, "+strcharinfo(0)+"...";
+ close2;
+ getitem 512,@amount*2;
+ end;
+ } else if(@tablesub > @playersub) {
+ mes "I rolled a ^0000FF"+@table3+"^000000, giving";
+ mes "me a total of ^0000FF"+@tablesub+"^000000 which";
+ mes "beats your total of ^FF0000"+@playersub+"^000000.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+". Them's";
+ mes "the breaks, I suppose...";
+ close;
+ } else if(@tablesub == @playersub) {
+ //Result = tie, --Improvised--
+ mes "I rolled a ^0000FF"+@table3+"^000000, giving";
+ mes "me a total of ^0000FF"+@tablesub+"^000000, which";
+ mes "is the same as your total.";
+ mes "Well, this game didn't have a";
+ mes "winner or loser, "+strcharinfo(0)+".";
+ close2;
+ getitem 512,@amount;
+ end;
+ }
+}
diff --git a/npc/airports/einbroch.txt b/npc/airports/einbroch.txt
index a42de5e71..8b9ba4b78 100644
--- a/npc/airports/einbroch.txt
+++ b/npc/airports/einbroch.txt
@@ -1,111 +1,111 @@
-//===== eAthena Script =======================================
-//= Einbroch Airport Staff
-//===== By: ==================================================
-//= L0ne_W0lf, Muad_Dib
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena Revision 3000+
-//===== Description: =========================================
-//= Einbroch Airport Staff
-//===== Additional Comments: =================================
-//= Converted by Dr.Evil, 1.0b more typos and credits [Lupus]
-//= 1.1 Fixed wrong check, added extra condition [Justin84]
-//= 1.2 Removed Duplicates [Silent]
-//= 1.3 Fixed syntax errors for duplicate [KarLaeda]
-//============================================================
-
-
-airport.gat,126,43,4 script Airport Staff#01::AirportE 90,{
- mes "[Airport Staff]";
- mes "Welcome to the Airport.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto L_GotTicket;
- if(Zeny < 1200) goto L_NoZeny;
- set Zeny, Zeny - 1200;
- warp "airport.gat",148,51;
- close;
-
- L_GotTicket:
- delitem 7311,1;
- warp "airport.gat",148,51;
- close;
-
- L_NoZeny:
- mes "[Airport Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-airport.gat,143,43,4 duplicate(AirportE) Airport Staff#02 90
-airport.gat,156,43,4 duplicate(AirportE) Airport Staff#03 90
-
-airport.gat,126,51,4 script Airport Staff#04::AirportE2 90,{
- mes "[Airport Staff]";
- mes "Welcome~";
- mes "Please head this";
- mes "way to board the Airship.";
- next;
- menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "If you leave the";
- mes "main terminal, you'll";
- mes "have to pay the admission";
- mes "fee again in order to board";
- mes "the Airship. Are you sure";
- mes "that you want to exit?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- warp "airport.gat",142,40;
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Alright, thank you";
- mes "for your patronage";
- mes "and I hope you have";
- mes "a pleasant flight~";
- close;
-}
-
-airport.gat,143,51,4 duplicate(AirportE2) Airport Staff#05 90
-airport.gat,156,51,4 duplicate(AirportE2) Airport Staff#06 90
-
-einbroch.gat,94,267,4 script Airship Staff 91,{
- mes "[Airship Staff]";
- mes "Welcome to the";
- mes "Einbroch Airport.";
- mes "Please use this door to";
- mes "board the Airship wich stops";
- mes "over Lighthalzen and Juno in";
- mes "the Schwaltzvalt Republic";
- next;
- mes "[Airship Staff]";
- mes "Otherwise, if Einbroch is";
- mes "your intended destination,";
- mes "please head down the stairs";
- mes "and ask the Arrival Staff to lead";
- mes "you to the main terminal. Thank";
- mes "you, and enjoy your travels.";
- close;
-}
+//===== eAthena Script =======================================
+//= Einbroch Airport Staff
+//===== By: ==================================================
+//= L0ne_W0lf, Muad_Dib
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena Revision 3000+
+//===== Description: =========================================
+//= Einbroch Airport Staff
+//===== Additional Comments: =================================
+//= Converted by Dr.Evil, 1.0b more typos and credits [Lupus]
+//= 1.1 Fixed wrong check, added extra condition [Justin84]
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Fixed syntax errors for duplicate [KarLaeda]
+//============================================================
+
+
+airport.gat,126,43,4 script Airport Staff#01::AirportE 90,{
+ mes "[Airport Staff]";
+ mes "Welcome to the Airport.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto L_GotTicket;
+ if(Zeny < 1200) goto L_NoZeny;
+ set Zeny, Zeny - 1200;
+ warp "airport.gat",148,51;
+ close;
+
+ L_GotTicket:
+ delitem 7311,1;
+ warp "airport.gat",148,51;
+ close;
+
+ L_NoZeny:
+ mes "[Airport Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+airport.gat,143,43,4 duplicate(AirportE) Airport Staff#02 90
+airport.gat,156,43,4 duplicate(AirportE) Airport Staff#03 90
+
+airport.gat,126,51,4 script Airport Staff#04::AirportE2 90,{
+ mes "[Airport Staff]";
+ mes "Welcome~";
+ mes "Please head this";
+ mes "way to board the Airship.";
+ next;
+ menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "If you leave the";
+ mes "main terminal, you'll";
+ mes "have to pay the admission";
+ mes "fee again in order to board";
+ mes "the Airship. Are you sure";
+ mes "that you want to exit?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ warp "airport.gat",142,40;
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Alright, thank you";
+ mes "for your patronage";
+ mes "and I hope you have";
+ mes "a pleasant flight~";
+ close;
+}
+
+airport.gat,143,51,4 duplicate(AirportE2) Airport Staff#05 90
+airport.gat,156,51,4 duplicate(AirportE2) Airport Staff#06 90
+
+einbroch.gat,94,267,4 script Airship Staff 91,{
+ mes "[Airship Staff]";
+ mes "Welcome to the";
+ mes "Einbroch Airport.";
+ mes "Please use this door to";
+ mes "board the Airship wich stops";
+ mes "over Lighthalzen and Juno in";
+ mes "the Schwaltzvalt Republic";
+ next;
+ mes "[Airship Staff]";
+ mes "Otherwise, if Einbroch is";
+ mes "your intended destination,";
+ mes "please head down the stairs";
+ mes "and ask the Arrival Staff to lead";
+ mes "you to the main terminal. Thank";
+ mes "you, and enjoy your travels.";
+ close;
+}
diff --git a/npc/airports/lighthalzen.txt b/npc/airports/lighthalzen.txt
index b2ec84b70..8154b2d44 100644
--- a/npc/airports/lighthalzen.txt
+++ b/npc/airports/lighthalzen.txt
@@ -1,91 +1,91 @@
-//===== eAthena Script =======================================
-//= Lighthalzen Airport Staff
-//===== By: ==================================================
-//= L0ne_W0lf, Muad_Dib
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena Revision 3000+
-//===== Description: =========================================
-//= Lighthalzen Airport Staff
-//===== Additional Comments: =================================
-//= 1.0 Cloned from einbroch.txt [Justin84]
-//= 1.1 Removed Duplicates [Silent]
-//= 1.2 Fixed syntax errors for duplicate [KarLaeda]
-//============================================================
-
-
-lhz_airport.gat,126,43,4 script Airport Staff#1::AirportL 90,{
- mes "[Airport Staff]";
- mes "Welcome to the Airport.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto GotTicket;
- if(zeny < 1200) goto L_NoZeny;
- set Zeny,zeny-1200;
- warp "lhz_airport.gat",148,51;
- close;
-
- GotTicket:
- delitem 7311,1;
- warp "lhz_airport.gat",148,51;
- close;
-
- L_NoZeny:
- mes "[Airport Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-lhz_airport.gat,143,43,4 duplicate(AirportL) Airport Staff#2 90
-lhz_airport.gat,156,43,4 duplicate(AirportL) Airport Staff#3 90
-
-lhz_airport.gat,126,51,4 script Airport Staff#4::AirportL2 90,{
- mes "[Airport Staff]";
- mes "Welcome~";
- mes "Please head this";
- mes "way to board the Airship.";
- next;
- menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "If you leave the";
- mes "main terminal, you'll";
- mes "have to pay the admission";
- mes "fee again in order to board";
- mes "the Airship. Are you sure";
- mes "that you want to exit?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- warp "lhz_airport.gat",142,40;
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Alright, thank you";
- mes "for your patronage";
- mes "and I hope you have";
- mes "a pleasant flight~";
- close;
-}
-
-lhz_airport.gat,143,51,4 duplicate(AirportL2) Airport Staff#5 90
-lhz_airport.gat,156,51,4 duplicate(AirportL2) Airport Staff#6 90
+//===== eAthena Script =======================================
+//= Lighthalzen Airport Staff
+//===== By: ==================================================
+//= L0ne_W0lf, Muad_Dib
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena Revision 3000+
+//===== Description: =========================================
+//= Lighthalzen Airport Staff
+//===== Additional Comments: =================================
+//= 1.0 Cloned from einbroch.txt [Justin84]
+//= 1.1 Removed Duplicates [Silent]
+//= 1.2 Fixed syntax errors for duplicate [KarLaeda]
+//============================================================
+
+
+lhz_airport.gat,126,43,4 script Airport Staff#1::AirportL 90,{
+ mes "[Airport Staff]";
+ mes "Welcome to the Airport.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto GotTicket;
+ if(zeny < 1200) goto L_NoZeny;
+ set Zeny,zeny-1200;
+ warp "lhz_airport.gat",148,51;
+ close;
+
+ GotTicket:
+ delitem 7311,1;
+ warp "lhz_airport.gat",148,51;
+ close;
+
+ L_NoZeny:
+ mes "[Airport Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+lhz_airport.gat,143,43,4 duplicate(AirportL) Airport Staff#2 90
+lhz_airport.gat,156,43,4 duplicate(AirportL) Airport Staff#3 90
+
+lhz_airport.gat,126,51,4 script Airport Staff#4::AirportL2 90,{
+ mes "[Airport Staff]";
+ mes "Welcome~";
+ mes "Please head this";
+ mes "way to board the Airship.";
+ next;
+ menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "If you leave the";
+ mes "main terminal, you'll";
+ mes "have to pay the admission";
+ mes "fee again in order to board";
+ mes "the Airship. Are you sure";
+ mes "that you want to exit?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ warp "lhz_airport.gat",142,40;
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Alright, thank you";
+ mes "for your patronage";
+ mes "and I hope you have";
+ mes "a pleasant flight~";
+ close;
+}
+
+lhz_airport.gat,143,51,4 duplicate(AirportL2) Airport Staff#5 90
+lhz_airport.gat,156,51,4 duplicate(AirportL2) Airport Staff#6 90
diff --git a/npc/airports/yuno.txt b/npc/airports/yuno.txt
index 900c97a82..8ff5f56a9 100644
--- a/npc/airports/yuno.txt
+++ b/npc/airports/yuno.txt
@@ -1,91 +1,91 @@
-//===== eAthena Script =======================================
-//= Yuno Airport Staff
-//===== By: ==================================================
-//= L0ne_W0lf, Muad_Dib
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena Revision 3000+
-//===== Description: =========================================
-//= Yuno Airport Staff
-//===== Additional Comments: =================================
-//= 1.0 Cloned from Einbroch [Justin84]
-//= 1.1 Removed Duplicates [Silent]
-//= 1.2 Fixed syntax errors for duplicate [KarLaeda]
-//============================================================
-
-
-y_airport.gat,126,43,4 script Airport Staff#001::AirportY 90,{
- mes "[Airport Staff]";
- mes "Welcome to the Airport.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto GotTicket;
- if(zeny < 1200) goto L_NoZeny;
- set Zeny,zeny-1200;
- warp "y_airport.gat",148,51;
- close;
-
- GotTicket:
- delitem 7311,1;
- warp "y_airport.gat",148,51;
- close;
-
- L_NoZeny:
- mes "[Airport Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-y_airport.gat,143,43,4 duplicate(AirportY) Airport Staff#002 90
-y_airport.gat,156,43,4 duplicate(AirportY) Airport Staff#003 90
-
-y_airport.gat,126,51,4 script Airport Staff#004::AirportY2 90,{
- mes "[Airport Staff]";
- mes "Welcome~";
- mes "Please head this";
- mes "way to board the Airship.";
- next;
- menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
-
- mes "[Airport Staff]";
- mes "If you leave the";
- mes "main terminal, you'll";
- mes "have to pay the admission";
- mes "fee again in order to board";
- mes "the Airship. Are you sure";
- mes "that you want to exit?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- warp "y_airport.gat",142,40;
- close;
-
- L_Cancel:
- mes "[Airport Staff]";
- mes "Alright, thank you";
- mes "for your patronage";
- mes "and I hope you have";
- mes "a pleasant flight~";
- close;
-}
-
-y_airport.gat,143,51,4 duplicate(AirportY2) Airport Staff#005 90
-y_airport.gat,156,51,4 duplicate(AirportY2) Airport Staff#006 90
+//===== eAthena Script =======================================
+//= Yuno Airport Staff
+//===== By: ==================================================
+//= L0ne_W0lf, Muad_Dib
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena Revision 3000+
+//===== Description: =========================================
+//= Yuno Airport Staff
+//===== Additional Comments: =================================
+//= 1.0 Cloned from Einbroch [Justin84]
+//= 1.1 Removed Duplicates [Silent]
+//= 1.2 Fixed syntax errors for duplicate [KarLaeda]
+//============================================================
+
+
+y_airport.gat,126,43,4 script Airport Staff#001::AirportY 90,{
+ mes "[Airport Staff]";
+ mes "Welcome to the Airport.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto GotTicket;
+ if(zeny < 1200) goto L_NoZeny;
+ set Zeny,zeny-1200;
+ warp "y_airport.gat",148,51;
+ close;
+
+ GotTicket:
+ delitem 7311,1;
+ warp "y_airport.gat",148,51;
+ close;
+
+ L_NoZeny:
+ mes "[Airport Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+y_airport.gat,143,43,4 duplicate(AirportY) Airport Staff#002 90
+y_airport.gat,156,43,4 duplicate(AirportY) Airport Staff#003 90
+
+y_airport.gat,126,51,4 script Airport Staff#004::AirportY2 90,{
+ mes "[Airport Staff]";
+ mes "Welcome~";
+ mes "Please head this";
+ mes "way to board the Airship.";
+ next;
+ menu "Exit to Main Terminal",-,"Cancel",L_Cancel;
+
+ mes "[Airport Staff]";
+ mes "If you leave the";
+ mes "main terminal, you'll";
+ mes "have to pay the admission";
+ mes "fee again in order to board";
+ mes "the Airship. Are you sure";
+ mes "that you want to exit?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ warp "y_airport.gat",142,40;
+ close;
+
+ L_Cancel:
+ mes "[Airport Staff]";
+ mes "Alright, thank you";
+ mes "for your patronage";
+ mes "and I hope you have";
+ mes "a pleasant flight~";
+ close;
+}
+
+y_airport.gat,143,51,4 duplicate(AirportY2) Airport Staff#005 90
+y_airport.gat,156,51,4 duplicate(AirportY2) Airport Staff#006 90
diff --git a/npc/cities/alberta.txt b/npc/cities/alberta.txt
index 29dcc0a12..7f297bf61 100644
--- a/npc/cities/alberta.txt
+++ b/npc/cities/alberta.txt
@@ -1,356 +1,356 @@
-//===== eAthena Script =======================================
-//= Alberta Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Negative input bug fixed [Lupus]
-//= 1.2 Fixed typos in script [massdriller]
-//= 1.3 Ran through spellcheck system [massdriller]
-//= 1.4 Someone forget a .gat in an NPC header [Fredzilla]
-//= 1.5 Fixed typo in script. [massdriller]
-//= 1.6 Fixed some typos, optimized, added Gotanblue#2 to be able to return back to Alberta [Lupus]
-//= 1.7 Fixed Phelix bugs [Lupus]
-//= 1.8 Got rid of 2 useless variables, fixed Turtle Island Quest exploit [Lupus]
-//= 1.9 Added two NPCs shown at RO Magazine [Playtester]
-//= 2.0 Removed Duplicates [Silent]
-//= 2.1 Fixed many typos, using information from Crono/Hollengrhen [Evera]
-//============================================================
-
-//NewsPaper(?)
-alberta.gat,148,53,1 script Newspaper Girl 831,{end;}
-//???
-alberta.gat,148,60,3 script Man#03 833,{end;}
-
-// Young Man -----------------------------------------------------------
-alberta_in.gat,20,183,6 script Young Man 49,{
- mes "[Merchant]";
- mes "People say that ^0000ffGungnir^000000 is the legendary spear that never misses its target. If that's true, then it's simply amazing.";
- close;
-}
-
-// Merchant -------------------------------------------------
-alberta.gat,97,51,7 script Merchant#01 84,{
- mes "[Merchant]";
- mes "When you travel to many places like I do, you often hear a lot of rumors. There is one rumor I heard that is really interesting.";
- next;
- mes "[Merchant]";
- mes "Apparently there are cards which seal the power of certain monsters within them.";
- mes "If someone is able to obtain one of those cards, he/she will obtain the power of the monster...";
- next;
- mes "[Merchant]";
- mes "Bah! I don't believe it though.";
- close;
-}
-
-// Merchant ---------------------------------------------------------
-alberta.gat,53,39,8 script Merchant#02 74,{
- mes "[Merchant]";
- mes "Oh, you look like a stranger. Welcome to Alberta.";
- emotion e_gasp;
- next;
- mes "[Merchant]";
- mes "I was just brainstorming on some ideas I have for my business.";
- next;
- mes "[Merchant]";
- mes "You see, I heard that there is a store in Geffen that sells unique armor that is resistant to magic attacks.";
- mes "If I could somehow get them in bulk for a low price and sell them to the people in other towns......";
- next;
- mes "[Merchant]";
- mes "Cha-Ching! (you see dollar signs in her eyes)";
- emotion e_cash;
- close;
-}
-
-// Merchant -------------------------------------------------
-alberta.gat,58,80,8 script Merchant#03 99,{
- mes "[Merchant]";
- if(rand(2)) goto R_1;
- mes "We merchants can open a roadside stand and do business. With the ^0000ffDiscount skill^000000 we can buy goods from stores for low prices.";
- next;
- mes "[Merchant]";
- mes "We can also rent carts which allow us to load up with goods and make our business portable.";
- mes "This way, business is more convenient and safe.";
- close;
- R_1:
- mes "We merchants can negotiate with store NPCs to get more money for items we sell to them by using the skill ^ff0000Overcharge^000000.";
- next;
- mes "[Merchant]";
- mes "The most we can overcharge NPCs is by 24%, but it takes some hard work and training to get the skill!!";
- close;
-}
-
-// Phina -------------------------------------------------------
-alberta.gat,62,156,2 script Phina 102,{
- set @TEMP,rand(3);
- mes "[Phina]";
- if(@TEMP == 1) goto R_1;
- if(@TEMP == 0) goto R_0;
- mes "This one time, I was walking in the forest and I saw a long, slender piece of green grass sticking out on the ground.";
- next;
- mes "[Phina]";
- mes "It was so cute that I wanted to touch it. And when I did, you know what happened? The grass actually slapped my hand.";
- next;
- mes "[Phina]";
- mes "I was startled and so I backed off a bit. I then realized that it was not grass but a very small creature.";
- emotion e_gasp;
- next;
- mes "[Phina]";
- mes "Even calm monsters can be very dangerous when they feel threatened. So don't startle them by mistake.";
- close;
- R_1:
- mes "You know those dumb-looking bears that live in the forest connecting Alberta and Payon?";
- mes "You know... the ones that play around with the flies that make that buzzing noise.";
- next;
- mes "[Phina]";
- mes "Well, one time I threw a twig at one just for fun. All of the sudden, IT RUSHED TOWARDS ME!";
- next;
- mes "[Phina]";
- mes "I was SOOOO scared!! I quickly jumped to the side to avoid it. Then BAM!!! It hit a huge tree and crushed it into pieces.";
- emotion e_wah;
- next;
- mes "[Phina]";
- mes "I sure learned my lesson that day. NEVER taunt any creature, 'cause if they get angry, you'll be in a world of hurt.";
- close;
- R_0:
- mes "Did you know? Wolves are much more cooperative than they might seem. If one of them is attacked, then others will come to help him.";
- next;
- mes "[Phina]";
- mes "So be careful if you ever decide to fight one.";
- close;
-}
-
-// Grandma -----------------------------------------------------
-alberta.gat,93,174,2 script Grandma 103,{
- mes "[Grandma]";
- mes "Some time ago a derelict ship drifted into the Alberta harbor. Some of the town's young people went into the ship to find survivors.";
- next;
- mes "[Grandma]";
- mes "But after a few moments they all ran out terrified. They said that they saw CORPSES walking around the ship!.";
- next;
- mes "[Grandma]";
- mes "The ship was also over run by never before seen sea monsters, which made it impossible for the townspeople to get around.";
- next;
- mes "[Grandma]";
- mes "We've never been able to do anything about that ominous-looking ship so we just left it there, hoping that it would sink or drift away.";
- next;
- mes "[Grandma]";
- mes "Then, out of nowhere, the Cool Event Corp. people came by and paid the city a huge amount zeny to buy the ship.";
- next;
- mes "[Grandma]";
- mes "They then created an event called the ^0000ddSunken Ship^000000.";
- next;
- mes "[Grandma]";
- mes "They invited young warriors from all over to enter the ghost ship and test their skills fighting the monsters in it.";
- next;
- mes "[Grandma]";
- mes "Now the ghost ship, that was once a problem for Alberta, has become quite a popular attraction.";
- next;
- mes "[Grandma]";
- mes "I have to say, though, I don't think it's worth risking your life for......";
- close;
-}
-
-// Drunken old man ----------------------------------------------------------------
-alberta.gat,131,139,4 script Drunken old man 709,{
- mes "[Drunken old man]";
- mes "(~hiccup~)... Huh?... Wh-what are you staring at? Get lost!!";
- next;
- menu "Stay",-,"Leave him alone",M_1;
-
- mes "[Drunken old man]";
- mes "Hahahaha (~hiccup~)... So you got some nerve...";
- next;
- mes "[Drunken old man]";
- mes "Heh... I may look worthless now, but back in the day I was a handsome sailor on board the `Going Mary'.";
- next;
- menu "Is that a ship?",-,"Really? No kidding!",sM_1;
-
- mes "[Drunken old man]";
- mes "What? Ya never heard of it? Stupid! Everybody knows the notorious pirate ship `Going Mary'! (~hiccup~)";
- emotion e_what;
- next;
- sM_1:
- mes "[Drunken old man]";
- mes "Ah~ the good old days... only... if only we hadn't run into that STORM... (~hiccup~)";
- next;
- mes "[Drunken old man]";
- mes "AH~ Captain. I miss our captain more than anything.... no foe could ever survive captain's sword.";
- mes "CAPTAIN~~~!!! (~HICCUP~) He'd swing his sword like THIS!... then... THEN...!!!";
- next;
- mes "[Drunken old man]";
- mes "The enemy and anything around him was surrounded by flames! Now that I think of it, the sword must've had some sort of mysterious power.";
- next;
- mes "[Drunken old man]";
- mes "(~sigh!~) (~sob, sob~)... God I miss everyone... Now I'm depressed. Just go away and leave me be.....";
- emotion e_sob;
- close;
- M_1:
- mes "[Drunken old man]";
- mes "That's right! Go AWAY~";
- emotion e_pif;
- close;
-}
-
-// Soda Man ----------------------------------------------------
-alberta.gat,90,71,3 script Soda Man 89,{
- mes "[Soda Man]";
- mes "Ummm.... delicious....";
- emotion e_ok;
- next;
- mes "[Soda Man]";
- mes "Wait! Don't bother me right now. Hmm? What am I doing you ask? Well isn't it obvious what I'm doing?";
- mes "Look at this! I've mixed sugar and soda together in this container. Watch what happens when I heat it up.";
- next;
- mes "[Soda Man]";
- mes "The two ingredients will melt soon and intermix. When the color of the mixture turns brown, we have to stop heating it.";
- mes "At that point it will have a marshmallow consistency.";
- next;
- mes "[Soda Man]";
- mes "You see what I am talking about now? Do you think it's valuable?........ What?..... No?.....";
- mes "Hmm... then what about the story of the old man who almost conquered ^5555FFTurtle Island^000000?";
- next;
- mes "[Soda Man]";
- mes "Go to the inn and you'll find an old drunkard there. When you speak to him at first, it may seem like he's talking nonsense.";
- mes "But be patient and if you listen to his words carefully you may be able to pick up some useful information.";
- next;
- mes "[Soda Man]";
- mes "Oh, and there is a letter on the table inside of that old man's room. It's a scary story about Turtle Island.";
- close;
-}
-
-
-//<=================================================== Marina (Docks/Port) ===================================================>\\
-// Sailor Fisk ----------------------------------------------------------------
-alberta.gat,189,151,5 script Sailor Fisk 100,{
- mes "[Sailor Fisk]";
- mes "Ahoy matey, where'd ya wanna go?";
- next;
- menu "Izlude Marina -> 500 Zeny.",-,"Quit",M_End;
-
- if(Zeny < 500) goto L_NoZeny;
- set Zeny, Zeny - 500;
- warp "izlude.gat",176,182;
- close;
-
- L_NoZeny:
- mes "[Sailor Fisk]";
- mes "I'm sorry, but I told you I would need 500 Zeny, and it looks like you don't have it.";
- close;
- M_End:
- close;
-}
-
-// Phelix ------------------------------------------------------------------
-alberta.gat,190,173,4 script Phelix 85,{
-
- mes "[Phelix]";
- mes "What the hell are you doing here?";
- next;
- mes "[Phelix]";
- mes "There is nothing you can get for free on this ship. If you want to get rewarded, do some work!!";
- next;
- mes "[Phelix]";
- mes "Hmm, however I'd be willing to trade you some items for your jellopies.";
- mes " - For ^0000ff10 Jellopies^000000 I'd be willing to give you ^ff00001 potion^000000.";
- mes " - For ^0000ff3 Jellopies^000000 I'll give you ^ff00001 sweet potato^000000.";
- next;
- mes "[Phelix]";
- mes "How does that sound?";
- next;
- menu "Sounds good",-,"Nah",M_End;
-
- M_Yes:
- mes "[Phelix]";
- mes "What do you want to exchange your Jellopies for?";
- next;
- menu "Red Potion please.",-,"Sweet Potato please.",M_1,"Cancel",M_End;
-
- set @item, 501;
- goto L_Get;
-
- M_1:
- set @item, 516;
-
- L_Get:
- mes "[Phelix]";
- mes "Please enter an amount. Enter 0 to cancel.";
- next;
- set @input,0;
- input @input;
- if(@input < 1 || @input > 1000) goto M_Yes;
- if(checkweight(@item,@input)==0) goto L_OverW;
-
- if(@item == 501) set @amount, @input*10;
- if(@item == 516) set @amount, @input*3;
- if(countitem(909) < @amount) goto L_NotEnough;
-
- getitem @item,@input;
- delitem 909, @amount;
- close;
-
- L_NotEnough:
- mes "[Phelix]";
- mes "I'm sorry but you do not have enough Jellopies.";
- next;
- goto M_Yes;
-
- L_OverW:
- mes "[Phelix]";
- mes "I'm sorry but you can't carry so many things.";
- next;
- goto M_Yes;
-
- M_End:
- close;
-}
-
-
-//<=================================================== Sunken Ship ======================================================>\\
-// Paul ----------------------------------------------------------------
-alberta.gat,195,151,3 script Paul 86,{
- mes "[Paul]";
- mes "Good day. Would you like be part of the Sunken Ship event, provided by Cool Event Corp.?";
- next;
- mes "[Paul]";
- mes "Oh! I better warn you, this event is only suitable for HIGH LEVEL warriors.";
- emotion e_gasp;
- next;
- mes "[Paul]";
- mes "So what do you say? It only cost 200 zeny to participate and you'll get a ton of experience, guaranteed.";
- next;
- menu "Enter",-,"Quit",M_End;
-
- if(Zeny < 200) goto L_NoZeny;
- set Zeny, Zeny - 200;
- warp "alb2trea.gat",62,69;
- close;
- M_End:
- mes "[Paul]";
- mes "Come back anytime.";
- close;
-
- L_NoZeny:
- mes "[Paul]";
- mes "I'm sorry, but I told you I would need 200 Zeny, and it looks like you don't have it.";
- mes "Please come back later when you have enough.";
- close;
-}
-
-// Sailor --------------------------------------------------
-alb2trea.gat,39,50,5 script Sailor 100,{
- mes "[Sailor]";
- mes "Do you wanna return?";
- next;
- menu "Return to Alberta",-,"Quit",MEnd;
-
- warp "alberta.gat",192,169;
-MEnd:
- close;
+//===== eAthena Script =======================================
+//= Alberta Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Negative input bug fixed [Lupus]
+//= 1.2 Fixed typos in script [massdriller]
+//= 1.3 Ran through spellcheck system [massdriller]
+//= 1.4 Someone forget a .gat in an NPC header [Fredzilla]
+//= 1.5 Fixed typo in script. [massdriller]
+//= 1.6 Fixed some typos, optimized, added Gotanblue#2 to be able to return back to Alberta [Lupus]
+//= 1.7 Fixed Phelix bugs [Lupus]
+//= 1.8 Got rid of 2 useless variables, fixed Turtle Island Quest exploit [Lupus]
+//= 1.9 Added two NPCs shown at RO Magazine [Playtester]
+//= 2.0 Removed Duplicates [Silent]
+//= 2.1 Fixed many typos, using information from Crono/Hollengrhen [Evera]
+//============================================================
+
+//NewsPaper(?)
+alberta.gat,148,53,1 script Newspaper Girl 831,{end;}
+//???
+alberta.gat,148,60,3 script Man#03 833,{end;}
+
+// Young Man -----------------------------------------------------------
+alberta_in.gat,20,183,6 script Young Man 49,{
+ mes "[Merchant]";
+ mes "People say that ^0000ffGungnir^000000 is the legendary spear that never misses its target. If that's true, then it's simply amazing.";
+ close;
+}
+
+// Merchant -------------------------------------------------
+alberta.gat,97,51,7 script Merchant#01 84,{
+ mes "[Merchant]";
+ mes "When you travel to many places like I do, you often hear a lot of rumors. There is one rumor I heard that is really interesting.";
+ next;
+ mes "[Merchant]";
+ mes "Apparently there are cards which seal the power of certain monsters within them.";
+ mes "If someone is able to obtain one of those cards, he/she will obtain the power of the monster...";
+ next;
+ mes "[Merchant]";
+ mes "Bah! I don't believe it though.";
+ close;
+}
+
+// Merchant ---------------------------------------------------------
+alberta.gat,53,39,8 script Merchant#02 74,{
+ mes "[Merchant]";
+ mes "Oh, you look like a stranger. Welcome to Alberta.";
+ emotion e_gasp;
+ next;
+ mes "[Merchant]";
+ mes "I was just brainstorming on some ideas I have for my business.";
+ next;
+ mes "[Merchant]";
+ mes "You see, I heard that there is a store in Geffen that sells unique armor that is resistant to magic attacks.";
+ mes "If I could somehow get them in bulk for a low price and sell them to the people in other towns......";
+ next;
+ mes "[Merchant]";
+ mes "Cha-Ching! (you see dollar signs in her eyes)";
+ emotion e_cash;
+ close;
+}
+
+// Merchant -------------------------------------------------
+alberta.gat,58,80,8 script Merchant#03 99,{
+ mes "[Merchant]";
+ if(rand(2)) goto R_1;
+ mes "We merchants can open a roadside stand and do business. With the ^0000ffDiscount skill^000000 we can buy goods from stores for low prices.";
+ next;
+ mes "[Merchant]";
+ mes "We can also rent carts which allow us to load up with goods and make our business portable.";
+ mes "This way, business is more convenient and safe.";
+ close;
+ R_1:
+ mes "We merchants can negotiate with store NPCs to get more money for items we sell to them by using the skill ^ff0000Overcharge^000000.";
+ next;
+ mes "[Merchant]";
+ mes "The most we can overcharge NPCs is by 24%, but it takes some hard work and training to get the skill!!";
+ close;
+}
+
+// Phina -------------------------------------------------------
+alberta.gat,62,156,2 script Phina 102,{
+ set @TEMP,rand(3);
+ mes "[Phina]";
+ if(@TEMP == 1) goto R_1;
+ if(@TEMP == 0) goto R_0;
+ mes "This one time, I was walking in the forest and I saw a long, slender piece of green grass sticking out on the ground.";
+ next;
+ mes "[Phina]";
+ mes "It was so cute that I wanted to touch it. And when I did, you know what happened? The grass actually slapped my hand.";
+ next;
+ mes "[Phina]";
+ mes "I was startled and so I backed off a bit. I then realized that it was not grass but a very small creature.";
+ emotion e_gasp;
+ next;
+ mes "[Phina]";
+ mes "Even calm monsters can be very dangerous when they feel threatened. So don't startle them by mistake.";
+ close;
+ R_1:
+ mes "You know those dumb-looking bears that live in the forest connecting Alberta and Payon?";
+ mes "You know... the ones that play around with the flies that make that buzzing noise.";
+ next;
+ mes "[Phina]";
+ mes "Well, one time I threw a twig at one just for fun. All of the sudden, IT RUSHED TOWARDS ME!";
+ next;
+ mes "[Phina]";
+ mes "I was SOOOO scared!! I quickly jumped to the side to avoid it. Then BAM!!! It hit a huge tree and crushed it into pieces.";
+ emotion e_wah;
+ next;
+ mes "[Phina]";
+ mes "I sure learned my lesson that day. NEVER taunt any creature, 'cause if they get angry, you'll be in a world of hurt.";
+ close;
+ R_0:
+ mes "Did you know? Wolves are much more cooperative than they might seem. If one of them is attacked, then others will come to help him.";
+ next;
+ mes "[Phina]";
+ mes "So be careful if you ever decide to fight one.";
+ close;
+}
+
+// Grandma -----------------------------------------------------
+alberta.gat,93,174,2 script Grandma 103,{
+ mes "[Grandma]";
+ mes "Some time ago a derelict ship drifted into the Alberta harbor. Some of the town's young people went into the ship to find survivors.";
+ next;
+ mes "[Grandma]";
+ mes "But after a few moments they all ran out terrified. They said that they saw CORPSES walking around the ship!.";
+ next;
+ mes "[Grandma]";
+ mes "The ship was also over run by never before seen sea monsters, which made it impossible for the townspeople to get around.";
+ next;
+ mes "[Grandma]";
+ mes "We've never been able to do anything about that ominous-looking ship so we just left it there, hoping that it would sink or drift away.";
+ next;
+ mes "[Grandma]";
+ mes "Then, out of nowhere, the Cool Event Corp. people came by and paid the city a huge amount zeny to buy the ship.";
+ next;
+ mes "[Grandma]";
+ mes "They then created an event called the ^0000ddSunken Ship^000000.";
+ next;
+ mes "[Grandma]";
+ mes "They invited young warriors from all over to enter the ghost ship and test their skills fighting the monsters in it.";
+ next;
+ mes "[Grandma]";
+ mes "Now the ghost ship, that was once a problem for Alberta, has become quite a popular attraction.";
+ next;
+ mes "[Grandma]";
+ mes "I have to say, though, I don't think it's worth risking your life for......";
+ close;
+}
+
+// Drunken old man ----------------------------------------------------------------
+alberta.gat,131,139,4 script Drunken old man 709,{
+ mes "[Drunken old man]";
+ mes "(~hiccup~)... Huh?... Wh-what are you staring at? Get lost!!";
+ next;
+ menu "Stay",-,"Leave him alone",M_1;
+
+ mes "[Drunken old man]";
+ mes "Hahahaha (~hiccup~)... So you got some nerve...";
+ next;
+ mes "[Drunken old man]";
+ mes "Heh... I may look worthless now, but back in the day I was a handsome sailor on board the `Going Mary'.";
+ next;
+ menu "Is that a ship?",-,"Really? No kidding!",sM_1;
+
+ mes "[Drunken old man]";
+ mes "What? Ya never heard of it? Stupid! Everybody knows the notorious pirate ship `Going Mary'! (~hiccup~)";
+ emotion e_what;
+ next;
+ sM_1:
+ mes "[Drunken old man]";
+ mes "Ah~ the good old days... only... if only we hadn't run into that STORM... (~hiccup~)";
+ next;
+ mes "[Drunken old man]";
+ mes "AH~ Captain. I miss our captain more than anything.... no foe could ever survive captain's sword.";
+ mes "CAPTAIN~~~!!! (~HICCUP~) He'd swing his sword like THIS!... then... THEN...!!!";
+ next;
+ mes "[Drunken old man]";
+ mes "The enemy and anything around him was surrounded by flames! Now that I think of it, the sword must've had some sort of mysterious power.";
+ next;
+ mes "[Drunken old man]";
+ mes "(~sigh!~) (~sob, sob~)... God I miss everyone... Now I'm depressed. Just go away and leave me be.....";
+ emotion e_sob;
+ close;
+ M_1:
+ mes "[Drunken old man]";
+ mes "That's right! Go AWAY~";
+ emotion e_pif;
+ close;
+}
+
+// Soda Man ----------------------------------------------------
+alberta.gat,90,71,3 script Soda Man 89,{
+ mes "[Soda Man]";
+ mes "Ummm.... delicious....";
+ emotion e_ok;
+ next;
+ mes "[Soda Man]";
+ mes "Wait! Don't bother me right now. Hmm? What am I doing you ask? Well isn't it obvious what I'm doing?";
+ mes "Look at this! I've mixed sugar and soda together in this container. Watch what happens when I heat it up.";
+ next;
+ mes "[Soda Man]";
+ mes "The two ingredients will melt soon and intermix. When the color of the mixture turns brown, we have to stop heating it.";
+ mes "At that point it will have a marshmallow consistency.";
+ next;
+ mes "[Soda Man]";
+ mes "You see what I am talking about now? Do you think it's valuable?........ What?..... No?.....";
+ mes "Hmm... then what about the story of the old man who almost conquered ^5555FFTurtle Island^000000?";
+ next;
+ mes "[Soda Man]";
+ mes "Go to the inn and you'll find an old drunkard there. When you speak to him at first, it may seem like he's talking nonsense.";
+ mes "But be patient and if you listen to his words carefully you may be able to pick up some useful information.";
+ next;
+ mes "[Soda Man]";
+ mes "Oh, and there is a letter on the table inside of that old man's room. It's a scary story about Turtle Island.";
+ close;
+}
+
+
+//<=================================================== Marina (Docks/Port) ===================================================>\\
+// Sailor Fisk ----------------------------------------------------------------
+alberta.gat,189,151,5 script Sailor Fisk 100,{
+ mes "[Sailor Fisk]";
+ mes "Ahoy matey, where'd ya wanna go?";
+ next;
+ menu "Izlude Marina -> 500 Zeny.",-,"Quit",M_End;
+
+ if(Zeny < 500) goto L_NoZeny;
+ set Zeny, Zeny - 500;
+ warp "izlude.gat",176,182;
+ close;
+
+ L_NoZeny:
+ mes "[Sailor Fisk]";
+ mes "I'm sorry, but I told you I would need 500 Zeny, and it looks like you don't have it.";
+ close;
+ M_End:
+ close;
+}
+
+// Phelix ------------------------------------------------------------------
+alberta.gat,190,173,4 script Phelix 85,{
+
+ mes "[Phelix]";
+ mes "What the hell are you doing here?";
+ next;
+ mes "[Phelix]";
+ mes "There is nothing you can get for free on this ship. If you want to get rewarded, do some work!!";
+ next;
+ mes "[Phelix]";
+ mes "Hmm, however I'd be willing to trade you some items for your jellopies.";
+ mes " - For ^0000ff10 Jellopies^000000 I'd be willing to give you ^ff00001 potion^000000.";
+ mes " - For ^0000ff3 Jellopies^000000 I'll give you ^ff00001 sweet potato^000000.";
+ next;
+ mes "[Phelix]";
+ mes "How does that sound?";
+ next;
+ menu "Sounds good",-,"Nah",M_End;
+
+ M_Yes:
+ mes "[Phelix]";
+ mes "What do you want to exchange your Jellopies for?";
+ next;
+ menu "Red Potion please.",-,"Sweet Potato please.",M_1,"Cancel",M_End;
+
+ set @item, 501;
+ goto L_Get;
+
+ M_1:
+ set @item, 516;
+
+ L_Get:
+ mes "[Phelix]";
+ mes "Please enter an amount. Enter 0 to cancel.";
+ next;
+ set @input,0;
+ input @input;
+ if(@input < 1 || @input > 1000) goto M_Yes;
+ if(checkweight(@item,@input)==0) goto L_OverW;
+
+ if(@item == 501) set @amount, @input*10;
+ if(@item == 516) set @amount, @input*3;
+ if(countitem(909) < @amount) goto L_NotEnough;
+
+ getitem @item,@input;
+ delitem 909, @amount;
+ close;
+
+ L_NotEnough:
+ mes "[Phelix]";
+ mes "I'm sorry but you do not have enough Jellopies.";
+ next;
+ goto M_Yes;
+
+ L_OverW:
+ mes "[Phelix]";
+ mes "I'm sorry but you can't carry so many things.";
+ next;
+ goto M_Yes;
+
+ M_End:
+ close;
+}
+
+
+//<=================================================== Sunken Ship ======================================================>\\
+// Paul ----------------------------------------------------------------
+alberta.gat,195,151,3 script Paul 86,{
+ mes "[Paul]";
+ mes "Good day. Would you like be part of the Sunken Ship event, provided by Cool Event Corp.?";
+ next;
+ mes "[Paul]";
+ mes "Oh! I better warn you, this event is only suitable for HIGH LEVEL warriors.";
+ emotion e_gasp;
+ next;
+ mes "[Paul]";
+ mes "So what do you say? It only cost 200 zeny to participate and you'll get a ton of experience, guaranteed.";
+ next;
+ menu "Enter",-,"Quit",M_End;
+
+ if(Zeny < 200) goto L_NoZeny;
+ set Zeny, Zeny - 200;
+ warp "alb2trea.gat",62,69;
+ close;
+ M_End:
+ mes "[Paul]";
+ mes "Come back anytime.";
+ close;
+
+ L_NoZeny:
+ mes "[Paul]";
+ mes "I'm sorry, but I told you I would need 200 Zeny, and it looks like you don't have it.";
+ mes "Please come back later when you have enough.";
+ close;
+}
+
+// Sailor --------------------------------------------------
+alb2trea.gat,39,50,5 script Sailor 100,{
+ mes "[Sailor]";
+ mes "Do you wanna return?";
+ next;
+ menu "Return to Alberta",-,"Quit",MEnd;
+
+ warp "alberta.gat",192,169;
+MEnd:
+ close;
} \ No newline at end of file
diff --git a/npc/cities/aldebaran.txt b/npc/cities/aldebaran.txt
index e790a94a6..3e2b53425 100644
--- a/npc/cities/aldebaran.txt
+++ b/npc/cities/aldebaran.txt
@@ -1,1558 +1,1558 @@
-//===== eAthena Script =======================================
-//= Al De Baran Town
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.9a
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.1 Added RS125 NPC. Added another Kafra Reserve points agent.
-//= The 2nd reserve points agent is not complete yet.
-//= 1.2 Lottery input number fix [Lupus], 1.2a - label typo fixed
-//= 1.3 Gatekeeper's bug fixed (wrong check and wrong item ID
-//= for underground), fixed some typos [Lupus]
-//= 1.4 Fixed Typos & Spellcheck [massdriller]
-//= 1.5 Finally added the Special Reserve 2 Lotto 8))
-//= with official prizes (80% official, 4-5 entries are made up)
-//= also changed typo Orange Potions -> Red Potions [Lupus]
-//= 1.6 Fixed bug (missing label), optimized all menus [Lupus]
-//= 1.7 Fixed exploits [Lupus] 1.8 Removed Duplicates [Silent]
-//= 1.9 Fixed a bunch of typos with information from Crono/Hollengrhen [Evera]
-//= 1.9a Now Pavianne doesn't sell Kafra Passes. She refunds them [Lupus]
-//============================================================
-
-
-// Panama --------------------------------------------------------------
-aldebaran.gat,46,129,4 script Panama 97,{
- mes "[Panama]";
- mes "Al De Baran has been widely known throughout Rune-Midgard Kingdom as the City of canals.";
- next;
- menu "About the canals",-,"End conversation",M_End;
-
- mes "[Panama]";
- mes "A canal is an artificial river used for travel, shipping, or irrigation. Generally they are used for transportation.";
- next;
- mes "[Panama]";
- mes "Most canals are constructed through reclamation work in which waterways are left over after a area of water as been filled in with dirt.";
- close;
- M_End:
- mes "[Panama]";
- mes "This is a mountain town so the water is supposed to be pure ...";
- next;
- mes "[Panama]";
- mes "Help yourself to some...";
- close;
-}
-
-// Miller ------------------------------------------------------------------------
-aldebaran.gat,49,93,4 script Miller 83,{
- mes "[Miller]";
- mes "Did you know that LEVEL 4 weapons exist?";
- next;
- mes "[Miller]";
- mes "Hmmm... of course they are rarely seen, but I hear that Boss monsters drop them occasionally.";
- close;
-}
-
-// Senorita Sylvia -----------------------------------------------------------
-aldebaran.gat,60,70,4 script Senorita Sylvia 69,{
- mes "[Senorita Sylvia]";
- mes "I came all the way out here from Prontera because I heard that the Kafra Main Office is somewhere in the city of Al De Baran";
- next;
- mes "[Senorita Sylvia]";
- mes "B-B-But... *sob*... It's been 5 hours since I started looking for it.....";
- emotion e_sob;
- next;
- mes "[Senorita Sylvia]";
- mes "Where the hell is it~~~?!";
- emotion e_an;
- next;
- mes "[Senorita Sylvia]";
- mes "I may look smart, but I am TERRIBLE with directions.....";
- next;
- mes "[Senorita Sylvia]";
- mes "Ah~ by the way, would you like to know a bit of very useful information?";
- next;
- menu "Please continue.",-,"Not really.",M_End;
-
- mes "[Senorita Sylvia]";
- mes "If you pick up equipment that was dropped by a monster, you will not be able to equip it right away.";
- next;
- mes "[Senorita Sylvia]";
- mes "Before you can use it you have to identify the equipment with a ^0000FFMagnifier^000000.";
- mes "Once you've done so you'll be able to equip it without problems.";
- close;
- M_End:
- mes "[Senorita Sylvia]";
- mes "Whatever.....";
- emotion e_pif;
- close;
-}
-
-// Quatro ----------------------------------------------------------------
-aldebaran.gat,64,104,4 script Quatro 55,{
- mes "[Quatro]";
- mes "It has been rumored that famous blacksmith came to this town from Geffen...";
-M_Menu:
- next;
- menu "Famous Blacksmith?",-,"About weapon upgrading",M_1,"End conversation",M_End;
-
- mes "[Quatro]";
- mes "People say his wife is ill. She constantly needs medicinal herbs that grow near town.";
- mes "Also, he has a devoted son who helps him out with his work.";
- next;
- mes "[Quatro]";
- mes "I hope his son will be a good blacksmith in the future.";
- goto M_Menu;
-
- M_1:
- mes "[Quatro]";
- mes "If you upgrade a weapon its attack strength will increase.";
- next;
- mes "[Quatro]";
- mes "For a ^0000fflevel 1^000000 weapon attack STR will go up by ^ff00002^000000 for every upgrade level.";
- mes "For a ^0000fflevel 2^000000 weapon attack STR will go up by ^ff00003^000000.";
- mes "For a ^0000fflevel 3 and level 4^000000 weapon attack STR will go up by ^ff00005^000000!";
- goto M_Menu;
-
- M_End:
- close;
-}
-
-// Isenberg ---------------------------------------------------------------------
-aldebaran.gat,67,154,4 script Isenberg 98,{
- mes "[Isenberg]";
- mes "Mount Mjolnir and the Payon Forest are both notorious for high amounts of rainfall.";
-M_Menu:
- next;
- menu "Mt. Mjolnir",-,"Payon Forest",M_1,"End conversation",M_End;
-
- mes "[Isenberg]";
- mes "Mt. Mjolnir !";
- next;
- mes "[Isenberg]";
- mes "It's the mountain range which you must pass through to get here from either Prontera or Geffen.";
- next;
- mes "[Isenberg]";
- mes "It is a difficult path however due to the steep and rugged terrain.";
- mes "Not to mention the strong and hostile monsters which roam the mountain side.";
- next;
- mes "[Isenberg]";
- mes "You did a good job to get here.";
- emotion e_no1;
- goto M_Menu;
- M_1:
- mes "[Isenberg]";
- mes "You must travel through the Payon Forest if you wish to visit Alberta or Payon.";
- next;
- mes "[Isenberg]";
- mes "The Payon Forest is large and its pathways are very intricate. It is easy to get lost and confused in it.";
- next;
- mes "[Isenberg]";
- mes "Unless you have good concentration and a strong will, you will find yourself giving up trying to pass through it.";
- next;
- mes "[Isenberg]";
- mes "The forest was named after Payon, the village of independence, instead of Alberta, the harbor town.";
- next;
- mes "[Isenberg]";
- mes "Payon was built deep within the rugged forest with the intention of providing protection from outside influence.";
- next;
- mes "[Isenberg]";
- mes "I guess that's why people called that forest the Payon Forest rather than the Alberta Forest.";
- goto M_Menu;
- M_End:
- mes "[Isenberg]";
- mes "Although Mnt. Mjolnir hinders travelers, it also creates a mysterious and unique atmosphere in our town.";
- close;
-}
-
-// Joanne ------------------------------------------------------------------------------
-aldebaran.gat,81,61,4 script Joanne 101,{
- mes "[Joanne]";
- mes "I like to go gathering sea shells. It is really fun";
- next;
- menu "Shell Gathering",-,"End Conversation",M_End;
-
- mes "[Joanne]";
- mes "When you see bubbles popping up from the sand or a muddy puddle, try digging in that area.";
- mes "Usually shell fish conceal themselves under the ground.";
- next;
- mes "[Joanne]";
- mes "By the way, there is a dangerous shell fish called Ambernite.";
- mes "It can usually be found on the beaches near Comodo.";
- next;
- mes "[Joanne]";
- mes "What a scary shell fish ..";
- close;
- M_End:
- mes "[Joanne]";
- mes "I'm going to taste Cave Shell Fish one of these days!!";
- mes "I know it is a little bit dangerous... but it's worth the risk, right?";
- close;
-}
-
-// Bebe -------------------------------------------------------------------
-aldebaran.gat,86,228,4 script Bebe 703,{
- mes "[Bebe]";
- mes "A while back I went out for a walk towards Mt.Mjolnir, carrying a 'Savage Babe' with me.";
-M_Menu:
- next;
- menu "Savage Babe??",-,"Mt.Mjolnir??",M_1,"End Conversation",M_End;
-
- mes "[Bebe]";
- mes "A Savage Babe is a kind of baby wild boar that has a pink color. It's very cute and pretty.";
- next;
- mes "[Bebe]";
- mes "Anyways, I was walking up this narrow path when... out of nowhere, this GIANT, UGLY, PLANT attacked me and my Savage Babe!";
- emotion e_gasp;
- next;
- mes "[Bebe]";
- mes "I was so frightened that I ran as far away from it as I could. When I stopped running I noticed that it hadn't followed me.";
- next;
- mes "[Bebe]";
- mes "So I threw rocks at it out of anger. It didn't do much good though. I don't think it even felt anything.";
- next;
- mes "[Bebe]";
- mes "I then noticed something else. The plant had a human looking face!! EEEWWW!!!";
- emotion e_swt2;
- next;
- mes "[Bebe]";
- mes "If you every see one, don't even think about going near it. It may just bite you to death!";
- goto M_Menu;
-
- M_1:
- mes "[Bebe]";
- mes "Even though people are fascinated by the scenic beauty of Mt.Mjolnir, this mountain is filled with weird monsters.";
- next;
- mes "[Bebe]";
- mes "Monsters like Man Eating Flowers, giant Moths, Bigfoot, giant Centipedes, and so much more. So be careful if you ever go up there.";
- next;
- mes "[Bebe]";
- mes "Most of the monsters won't attack you if you don't attack them first though.";
- goto M_Menu;
-
- M_End:
- mes "[Bebe]";
- mes "Ah?! Where is my Savage Babe..? Savage Babe, where are you!";
- emotion e_hmm;
- close;
-}
-
-// Epthiel -----------------------------------------------------------------
-aldebaran.gat,90,170,4 script Epthiel 47,{
- mes "[Epthiel]";
- mes "Some weapons and armor have slots in them. This allows you to insert monster cards into them.";
-M_Menu:
- next;
- menu "About the number of slots..",-,"Relation between Cards and Slots",M_1,"End Conversation",M_End;
-
- mes "[Epthiel]";
- mes "Items dropped by monsters often times have more slots than ordinary weapons or armor sold at an NPC shop.";
- next;
- mes "[Epthiel]";
- mes "The greater number of slots a piece of equipment has the greater its value is.";
- goto M_Menu;
- M_1:
- mes "[Epthiel]";
- mes "When a card is inserted into a slot on a piece of equipment, the owner will gain certain skills or stat bonuses from that card.";
- next;
- mes "[Epthiel]";
- mes "If the weapon or armor with the card is unequipped, then the effect of the card will wear off.";
- next;
- mes "[Epthiel]";
- mes "A very important thing to know about inserting a card into a slot, is that once inserted the card cannot be removed.";
- next;
- mes "[Epthiel]";
- mes "So make sure you're absolutely sure about putting a card into a slot. You don't want to waste one.";
- goto M_Menu;
- M_End:
- mes "[Epthiel]";
- mes "Do you have a card?";
- close;
-}
-
-// Daniel --------------------------------------------------------------------------
-aldebaran.gat,93,80,4 script Daniel 48,{
- mes "[Daniel]";
- mes "With waterways everywhere, the city of Al De Baran is a wonderful place to live.";
- next;
- mes "[Daniel]";
- mes "B-U-T!.....";
- emotion e_gasp;
- next;
- mes "[Daniel]";
- mes "Last night on the way to see my girl friend, I fell into one of those waterways and sprang my ankle.";
- mes "I couldn't enjoy my date with my girl friend which sucked big time!";
- emotion e_ag;
- next;
- menu "Gosh, that's too bad.",-,".....",M_1;
-
- mes "[Daniel]";
- mes "*~Sigh~* Yeah it really is. You see my girl friend is the Armor Merchant's youngest daughter.";
- mes "She told me once that the armor that's dropped by monsters is often times much better than the kind sold in shops.";
- next;
- mes "[Daniel]";
- mes "She said something about the armor having 'more slots'.... whatever that means.";
- close;
- M_1:
- mes "[Daniel]";
- mes "Huh? *~Sob sob~* You think I'm a stupid idiot, right? ";
- emotion e_sob;
- close;
-}
-
-// Munster -----------------------------------------------------------------
-aldebaran.gat,113,70,2 script Munster 48,{
- mes "[Munster]";
- mes "My family used to live in Geffen, the homeland of blacksmiths. We moved to Al De Baran last winter.";
- next;
- mes "[Munster]";
- mes "Back in Geffen my father was a famous blacksmith. Sometimes I helped my father with his work";
- mes "I learned a lot about the success rate of upgrading weapons of different levels.";
- next;
- mes "[Munster]";
- mes "A ^0000fflevel 1^000000 weapon could be safely upgraded ^ff00007^000000 times,";
- mes "A ^0000fflevel 2^000000 weapon ^ff00006^000000 times,";
- mes "and ^0000fflevel 3 and 4^000000 weapons ^ff00005^000000 times each.";
- next;
- mes "[Munster]";
- mes "With level 4 weapons however, there is still a risk of failure during the first upgrade.";
- next;
- mes "[Munster]";
- mes "As far as ^0000ffarmor^000000 goes, they can generally be upgraded about ^ff00005^000000 times.";
- next;
- mes "[Munster]";
- mes "Maybe it's because we just moved here, but for some reason people don't seem to know that my fathers workshop is now located in Al De Baran,";
- next;
- mes "[Munster]";
- mes "Any who, I hope people will come to re-acquaint themselves with my father's superior craftsmanship.";
- close;
-}
-
-// Phracon Guy --------------------------------------------------------------
-aldebaran.gat,117,181,4 script Phracon Guy 48,{
- mes "[Phracon Guy]";
- mes "Lv 1 weapons require a metal called 'Phracon' to be upgraded.";
- next;
- menu "About Phracon",-,"Advice about Phracon",M_1,"End Conversation",M_End;
-
- mes "[Phracon Guy]";
- mes "It's a very common metal found throughout Rune-Midgard and is used almost exclusively for weapon upgrading.";
- next;
- mes "[Phracon Guy]";
- mes "Although it's not as strong as other metals, it remains popular among most people because of its abundance.";
- next;
- mes "[Phracon Guy]";
- mes "You can obtain Phracon from monsters or you can purchase it from Forging Workshops located in towns.";
- next;
- mes "[Phracon Guy]";
- mes "If you don't need Phracon for upgrading purposes then you can sell it for 100 zeny a piece to NPC's!";
- close;
- M_1:
- mes "[Phracon Guy]";
- mes "I hear that a lot of monsters carry Phracon. Why don't you go hunt them?";
- mes "You should be able to find a lot of Phracon without much trouble.";
- next;
- mes "[Phracon Guy]";
- mes "A couple of days ago, I went hunting with the Pub Master and got a Phracon dropped from Bebe Savage.";
- close;
- M_End:
- mes "[Phracon Guy]";
- mes "Good luck on finding some Phracon -";
- close;
-}
-
-// Alchemy Guy Chemirre -----------------------------------------------------------
-aldebaran.gat,121,231,4 script Alchemy Guy Chemirre 740,{
- mes "[Alchemy Guy Chemirre]";
- mes "The Alchemist is one of the 2nd Job Classes and involves the creation of rare and valuable items from abundant materials.";
-M_Menu:
- next;
- menu "About Alchemy of Payon",-,"The concept behind Alchemy",M_1,". . . . .",M_2,"End Conversation",M_End;
-
- mes "[Alchemy Guy Chemirre]";
- mes "Payon Alchemy dates as far back as the Alchemy of Al De Baran and originates from Taoism.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "Just like the Alchemists of Al De Baran, the Alchemists of Payon were able to create gold out of various materials.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "However due Payon's environment and a lack of adequate reasources, Payon alchemy never excelled the way it did in Al De Baran.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "Therefore the Alchemist Guild in Al De Baran became the only Alchemy Research Organization in Rune-Midgard.";
- goto M_Menu;
-
- M_1:
- mes "[Alchemy Guy Chemirre]";
- mes "Alchemy involves chemical research, and the practice of creating useful items out of materials that are usually non valuable.";
- goto M_Menu;
- M_2:
- mes "[Alchemy Guy Chemirre]";
- mes "Let me tell you something that might be interesting to you. It's about monster cards and slots..";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "If you already posses a monster card then you've probably already heard this but.....";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "Each card has a specific type of equipment it can be placed on.";
- mes "For instance, let's say you have a poring card.....";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "If you check the card's description, you will find that the Poring card increases its wearer's LUK by 1, and that it can be only inserted on 'Armor'.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "Something to take note of is the fact that armor purchased at an NPC shop may not have slots on them.";
- mes "Armor dropped by monsters however, will usually have a high number of slots on them. They aren't dropped too often though.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "In order to use a card you must first unequip the piece of equipment you want to insert the card into.";
- mes "Next find your card in your inventory window and double click it.";
- next;
- mes "[Alchemy Guy Chemirre]";
- mes "A window will pop up showing you what equipment the card can be inserted in. Choose the one you want, and you're done.";
- close;
- M_End:
- mes "[Alchemy Guy Chemirre]";
- mes "Long live the Al De Baran Alchemy Guild!!";
- close;
-
-}
-
-// Anastasia --------------------------------------------------------------
-aldebaran.gat,146,124,4 script Anastasia 101,{
- mes "[Anastasia]";
- mes "Somewhere in Rune-Midgard exists the^3355FF' Assassin Guild '^000000.";
- next;
- mes "[Anastasia]";
- mes "It's a place that trains people in the art of assassinating someone without leaving behind the slightest trace.";
- next;
- mes "[Nastasia]";
- mes "But... is that.... legal.....??";
- emotion e_what;
- next;
- mes "[Nastasia]";
- mes "And do they collect tuition....??";
- next;
- menu "Continue conversation.",-,"End Conversation.",M_End;
-
- mes "[Nastasia]";
- mes "Most flying monsters are very fast and have a high amount of agility.";
- mes "Therefore, it's very difficult to hit them successfully.";
- next;
- mes "[Nastasia]";
- mes "In order to fight against those kinds of monsters, you'll need a good amount of DEX.";
- close;
- M_End:
- mes "[Nastasia]";
- mes "Like the old saying goes, 'nothing in life is free'.";
- close;
-}
-
-// Stromme ---------------------------------------------------------
-aldebaran.gat,159,242,4 script Stromme 119,{
- mes "[Stromme]";
- mes "When you spend some time in Mt. Mjolnir, you'll start to notice something.";
- next;
- mes "[Stromme]";
- mes "The insects in Mt. Mjolnir are classified into different groups by their habits!";
- next;
- menu "About insects",-,"End conversation",M_End;
-
- mes "[Stromme]";
- mes "Honey Bees, Butterflies and Moths help transfer pollen between flowers by flying over and around them.";
- next;
- mes "[Stromme]";
- mes "However that doesn't mean that you can take them lightly.";
- mes "They have evolved into creatures that can defend themselves when attacked.";
- next;
- mes "[Stromme]";
- mes "There are some insects which are aggressive, such as Praying Mantises, Spiders, and Centipedes etc.";
- mes "These monsters are strong so you should be careful about approaching them.";
- next;
- mes "[Stromme]";
- mes "Also watch out for a monster that looks like a leech!! One blow from it can prove to be fatal.";
- next;
- mes "[Stromme]";
- mes "Luckily that leech thing has poor eye sight and won't notice you if you are far enough away from it.";
- close;
- M_End:
- mes "[Stromme]";
- mes "Don't even dare attack a ladybug haphazardly! Be respectful of mighty nature in Mt. Mjolnir.";
- close;
-}
-
-// Joo Jahk ------------------------------------------------------
-aldebaran.gat,180,46,4 script Joo Jahk 88,{
- mes "[Joo Jahk]";
- mes "I am a tourist from Payon, the city within the forest. I noticed that it's very cool here... probably due to the waterways.";
- next;
- mes "[Joo Jahk]";
- mes "But.... Do you think I could drink the water in these waterways?";
- emotion e_hmm;
- next;
- mes "[Joo Jahk]";
- mes "Actually I already did, but I am still concerned.....";
- emotion e_swt;
- next;
- menu "Continue.",-,"End conversation.",M_End;
-
- mes "[Joo Jahk]";
- mes "I've been traveling around Rune-Midgard.";
- next;
- mes "[Joo Jahk]";
- mes "On the way here, I heard about ^3355FFSpiritual Property Monsters^000000 from a really high level Magician";
- mes "Apparently physical attacks and non-elemental magic attacks can't damage them.";
- next;
- mes "[Joo Jahk]";
- mes "I hope this advice can come in handy for you.";
- close;
- M_End:
- mes "[Joo Jahk]";
- mes "The water here taste really fresh. It's probably well preserved. I don't think I'll have anything to worry about.";
- close;
-}
-
-// Gavin -------------------------------------------------------------------
-aldebaran.gat,212,122,4 script Gavin 97,{
- mes "Welcome! We, the towns people of Al De Baran, ALL welcome you . . . . .";
- next;
- mes "[Gavin]";
- mes "Hmm... did I over-exaggerate? 'Towns people'...";
- mes "Well... it is just myself, but hey! Still, I welcome you!";
- next;
- menu "Continue conversation.",-,"End conversation.",M_End;
-
- mes "[Gavin]";
- mes "Ah~ now I remember! I saw a very interesting monster just a few days ago.";
- mes "I saw a Poring with the wings of an angel, somewhere in the Mjolnir Mountains surrounding Al De Baran.";
- next;
- mes "[Gavin]";
- mes "I swear it!";
- emotion e_gasp;
- next;
- mes "[Gavin]";
- mes "It was jumping around with the other ordinary Porings. Angeling... is that what it was...?";
- close;
- M_End:
- mes "[Gavin]";
- mes "I welcome you to Al De Baran, a wonderful city of Canals surrounded by the Mjolnir Mountains.";
- close;
-}
-
-
-// Giddy Fellow ------------------------------------------------------------------
-aldeba_in.gat,152,47,4 script Giddy Fellow 97,{
- mes "[Giddy Fellow]";
- mes "E..E..E..Emergenc----y!!! I CAN'T find my pet chicken anywhere!!";
- emotion e_omg;
- next;
- menu "What's its name?",-,". . . . .",M_1;
-
- mes "[Giddy Fellow]";
- mes "It's 'The Great Picky ' ... SOB SOB SOB... gosh... what am I gonna do?!~ Please find my cutey for meee~~~";
- emotion e_sob;
- next;
- menu "Dude! It's such a common name...",-,". . . . .",M_1;
-
- mes "[Giddy Fellow]";
- mes "Wha-What are you talking about!! My 'The Great Picky' is the one and only cutest chicken in this whole wide WORLD for Christ's sake~!";
- emotion e_what;
- close;
- M_1:
- mes "[Giddy Fellow]";
- mes "Don't you laugh at me~! I don't have any siblings so my cute chicken is like a younger brother to me! SOB SOB SOB SOB";
- emotion e_sob;
- close;
-}
-
-// Master ----------------------------------------------------------
-aldeba_in.gat,156,179,4 script Master#02 61,{
- mes "[Master]";
- if(sex==0) mes "Oh hello. Don't mind me, I'm just a perverted old man.... la di da.......";
- if(sex==0) close;
- mes "Did you know that the Kafra Main Office is located here, in Aldebaran?";
- next;
- mes "[Master]";
- mes "The young Kafra Ladies visit me from time to time. They are really delightful and fun to be around.";
- next;
- mes "[Master]";
- mes "Alright! Time for a survey... this is to determine which Kafra you like best.";
- next;
- mes "[Master]";
- mes "Choose the Kafra Lady that you think is HOT!!!";
- next;
- menu "Oh~it turns me on!!!!",-,"No way..I am not a pervert.",M_1;
-
- mes "[Master]";
- mes "Alright, here you go, your Favorite Ladies!!! Take a careful look!";
- next;
- mes "[Master]";
- mes " - Kafra Number (1) ^3355FF'Pavianne'^000000 !!";
- mes "The Original Kafra, the classic blue haired beauty!...";
- mes " - Kafra Number (2) ^9A01BA'Blossom'^000000 !!";
- mes "Her graceful ponytail takes men's breaths away! She's a favorite among young boys!!";
- mes " - Kafra Number (3) ^0000FF'Jasmine'^000000 !!";
- mes "Long, straight, silky hair is what gives her her charm. She is the Silk from the East ~! From Payon,....";
- next;
- mes "[Master]";
- mes " - Kafra Number (4) ^FF8040'Roxie'^000000 !!";
- mes "She has a cute tomboy look with short hair....";
- mes " - Kafra Number (5) ^7A0DF2'Leilah'^000000 !!";
- mes "She is intelligent and sophisticated. A pair of refined glasses fits her well....";
- mes " - Kafra Number (6) ^EEC111'Curly Sue'^000000 !!";
- mes "Pretty and cute. Although she looks young and immature, she's a very hard worker....";
- next;
- mes "[Master]";
- mes "So who do you think?";
- next;
- menu "(1) Pavianne",-,"(2) Blossom",M_01,"(3) Jasmine",M_02,"(4) Roxie",M_03,"(5) Leilah",M_04,"(6) Curly Sue.",M_05;
-
- mes "[Master]";
- mes "Oh~ So you're reserved in nature, and therefore you are into a more traditional type of girl...";
- next;
- mes "[Master]";
- mes "Well, I have to tell you.....";
- next;
- mes "[Master]";
- mes "The world is all about change so face the facts and learn to accept new things!";
- close;
- M_01:
- mes "[Master]";
- mes "Wake up~! Do you really think you'd have a shot with a girl like that?? Be realistic! She's out of your league....";
- emotion e_gasp;
- close;
- M_02:
- mes "[Master]";
- mes "Gentle, sexy, sweet, and beautiful.... a girl like Jasmine would have you wrapped around her finger in no time....";
- close;
- M_03:
- mes "[Master]";
- mes "You're over-zealous! If you were to get with a girl who's as exuberant as her...";
- next;
- mes "[Master]";
- mes "You'd cause a LOT of trouble for the neighbors, if ya know what I mean.... Hahahaha!!";
- emotion e_heh;
- close;
- M_04:
- mes "[Master]";
- mes "Into the cold, analytical type huh?... If you like being bossed around, then I guess Leilah's the girl for you....";
- close;
- M_05:
- mes "[Master]";
- mes "Wha-what!";
- emotion e_gasp;
- next;
- mes "[Master]";
- mes "A thirst for young girls~~! It's a c-c-crime!!!!";
- emotion e_swt2;
- close;
- M_1:
- mes "[Master]";
- mes "Ah~~~!! I stayed up all night last night trying to make this wonderful survey~!!";
- mes "And you just dissed me~ like thaaat~ I hate you.";
- close;
-}
-
-// RS125 ------------------------------------------------------------------------
-aldeba_in.gat,234,241,4 script RS125 48,{
- mes "[RS125]";
- mes "Even if my first name is not human, and my manner of speech is not very eloquent, please don't be afraid of me.";
- mes "I'm actually a warm hearted person.";
- next;
- mes "[RS125]";
- mes "There is an artificial heart that beats loudly in my body.";
- mes "Although people hate me because of it, I will still continue to function for the love of my home, Al De Baran.";
- next;
- menu "Oh you poor boy! Tell me more...",-, "The best of luck to ya!!",M_End;
-
-
- mes "[RS125]";
- mes ".... It was 3 years ago..... My big bro 996, was a highly regarded sprinter in Al De Baran.";
- mes "People referred to him as 'Al De Baran's Peco Peco'. He was the fastest runner in the world......";
- next;
- mes "[RS125]";
- mes "Every 4 years a special track meet called the 'Al De Baran Turbo Tracks', takes place here.";
- mes "Many admirers from around the world came to see my brother. They gathered around him every chance they got.";
- next;
- mes "[RS125]";
- mes "I was his manager at the time and even I became stressed out by the crowds of people.";
- mes "I can only imagine how he felt about being so famous.";
- next;
- mes "[RS125]";
- mes "Sadly there is no such thing as eternal fame and glory in this world. There was a girl from Payon who came take part in the event.";
- mes "That year she was able to finally defeat my poor brother.";
- next;
- mes "[RS125]";
- mes "After that humiliating defeat, he decided to train even harder and pushed himself to his limits.";
- mes "But he pushed to hard and began to have serious heart problems. To this day he cannot move around without someone else's help.";
- next;
- mes "[RS125]";
- mes "Now I am the future of Al De Baran athletics! I am a ray of hope for my brother!";
- mes "Remember me, for I shall beat her, 'Havana', the breeze of Payon!";
- close;
- M_End:
- mes "[RS125]";
- mes "I've dreamed of making an around-the-world trip. It would be wonderful to truly experience the sea of Alberta!!";
- mes "After the track championship next year, my brother and I are going to travel the whole world together.";
- close;
-}
-
-// Nice Looking Guy ----------------------------------------------------------
-aldeba_in.gat,219,61,4 script Nice Looking Guy 109,{
- mes "[Nice Looking Guy]";
- mes "Forget about the doofus living next door.";
- next;
- mes "[Nice Looking Guy]";
- mes "To tell you the truth, 2 years ago, he fell down from a tree in the Drill Field and since then his mind has been out of control.";
- mes "I heard he was trying to pick some fruits from that tree.";
- next;
- mes "[Nice Looking Guy]";
- mes "Anyway, he's constantly bugging me and I think I'm gonna be crazy because of him... Oh my goodness!";
- close;
-}
-
-// Evil Looking Guy --------------------------------------------------------------
-aldeba_in.gat,223,121,2 script Evil looking Guy 63,{
- mes "[Evil Looking Guy]";
- mes "Hey dude! Don't you think it's rude for a stranger to enter someone else's house?";
- emotion e_what;
- next;
- mes "[Evil Looking Guy]";
- mes "Now I'm upset! What reason do you have to come in here and bother me??";
- emotion e_pif;
- next;
- mes "[Evil Looking Guy]";
- mes "Ah alright, alright. No more fooling around... you're here because I'm an NPC and you think I'm supposed to help you right?";
- next;
- menu "You got it.",-, "Nah... just messing around....",M_1;
-
- mes "[Evil Looking Guy]";
- mes "You! I'm not sure if you know this, but in this world there exists something called a Mercenary System.";
- next;
- mes "[Evil Looking Guy]";
- mes "What is this you ask? It's simple. You hire a Mercenary to fight battles for you. The more a Mercenary cost the better a fighter he/she is.";
- next;
- mes "[Evil Looking Guy]";
- mes "So how do you go about getting one?? It's easy, listen closely.....";
- next;
- mes "[Evil Looking Guy]";
- mes "First, check his/her nose. Yes, I said NOSE! A high quality Mercenary has a moist nose which is a sign of good health.";
- mes "If it's possible, try touching the Mercenary's' nose. If it's dry, then there is no doubt that that Mercenary has caught a cold.";
- next;
- mes "[Evil Looking Guy]";
- mes "A good Mercenary should have slender ankles. Umm... in addition, he/she should have a snowy and skinny neck!";
- mes "And if the Mercenary's' hair is long and curly, that's icing on the cake!!";
- next;
- mes "[Evil Looking Guy]";
- mes "Finally, a Mercenary is obligated to provide 100% customer assistance and support!!!";
- next;
- mes "[Evil Looking Guy]";
- mes "Oh and don't forget to change a Mercenary's wet tissues as well!!";
- close;
- M_1:
- mes "[Evil Looking Guy]";
- mes "Whattt!!! Get the heck out of my house!! If you're a cop, show me a search warrant.";
- mes "If you're a member of my family then pull down your pants so I can look at our family mark!";
- emotion e_gasp;
- close;
-}
-
-
-//<=================================================== Kafra Corp. Headquarters ==========================================================>\\
-// Kafra Jasmine -------------------------
-aldeba_in.gat,24,245,4 script Kafra Jasmine 115,{
- cutin "kafra_03",2;
- mes "[Kafra Jasmine]";
- mes "Hi~ I am Kafra type Jasmine. Thank you for coming all the way to the Kafra Main Office here in Al De Baran!";
- next;
- mes "[Kafra Jasmine]";
- mes "Our Kafra Service is always working with our customers!";
- mes "Our Kafra Service has a history and legacy that is 5 thousand, 8 hundred years old...";
- mes "Blah-blah-blah.....";
- next;
- menu "FIVE THOUSAND YEARS?!",-, "Ahh~ Shut Up!",M_1, "You got a boyfriend?",M_2;
-
- mes "[Kafra Jasmine]";
- mes "HEY! Just SHUT-UP and LISTEN! It took me a whole week to memorize this!";
- mes "I've got a poor memory unlike the other Kafra agents!";
- emotion e_an;
- next;
- mes "[Kafra Jasmine]";
- mes "..... Eh!... heh... heh... um...";
- emotion e_swt2;
- next;
- mes "[Kafra Jasmine]";
- mes "I'm verrrryyy sorry about that... I didn't mean to startle you... you see....";
- next;
- mes "[Kafra Jasmine]";
- mes "That... that... that was just an act.... YEAH! An act I put on for the customers. Heh.. heh....";
- emotion e_swt;
- cutin "",255;
- close;
- M_1:
- mes "[Kafra Jasmine]";
- mes ". . . . .";
- emotion e_an;
- next;
- mes "[Kafra Jasmine]";
- mes "Just so you know, I was a member of Kafra Garrison before I joined the Kafra Service Team.";
- mes "My specialty was 'Bash'!! Now I'm trying to be more feminine and live a quieter life";
- next;
- mes "[Kafra Jasmine]";
- mes "So please, DON'T TEMPT ME...!!";
- emotion e_pif;
- cutin "",255;
- close;
- M_2:
- mes "[Kafra Jasmine]";
- mes "I'm flattered but, Kafra Services has a ridiculous rule that no employee can have a boyfriend....";
- next;
- mes "[Kafra Jasmine]";
- mes "Just kidding~~ Tehehe";
- emotion e_heh;
- cutin "",255;
- close;
-}
-
-// Special Reserve ----------------------------------------------
-aldeba_in.gat,79,161,6 script Kafra#04 115,{
- cutin "kafra_03",2;
- mes "[Kafra]";
- mes "Welcome, ^6666FF" + strcharinfo(0) + "^000000. This is where you can trade in your special reserve points for useful items and cool prizes.";
- next;
- mes "[Kafra]";
- mes "Each Kafra will allow you to trade in reserve points of varying amounts. I can trade in reserve points starting from ^2222FF100 pts up to 3000 pts^000000.";
- next;
- mes "[Kafra]";
- mes "The amount of special reserve points that you have is: ^FF0000"+RESRVPTS+"^000000 pts. Please make a choice based on your point total.";
-M_Menu:
- next;
- menu "100- Sweet Potato 7 ea",M_1a, "200- Sweet Potato 15 ea",M_1b, "300- Sweet Potato 25 ea",M_1c, "400- Sweet Potato 35 ea",M_1d,
- "500- Sweet Potato 50 ea",M_1e, "600- Sweet Potato 60 ea",M_1f, "700- Sweet Potato 75 ea",M_1g, "800- Sweet Potato 85 ea",M_1h,
- "900- Sweet Potato 100 ea",M_1i, "1000- 1st Lottery Chance!",M_1j, "Next items",M_2, "Cancel",M_End;
-
- M_1a:
- if(RESRVPTS < 100) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 7;
- set RESRVPTS, RESRVPTS - 100;
- close;
- M_1b:
- if(RESRVPTS < 200) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 15;
- set RESRVPTS, RESRVPTS - 200;
- close;
- M_1c:
- if(RESRVPTS < 300) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 25;
- set RESRVPTS, RESRVPTS - 300;
- close;
- M_1d:
- if(RESRVPTS < 400) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 35;
- set RESRVPTS, RESRVPTS - 400;
- close;
- M_1e:
- if(RESRVPTS < 500) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 50;
- set RESRVPTS, RESRVPTS - 500;
- close;
- M_1f:
- if(RESRVPTS < 600) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 60;
- set RESRVPTS, RESRVPTS - 600;
- close;
- M_1g:
- if(RESRVPTS < 700) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 75;
- set RESRVPTS, RESRVPTS - 700;
- close;
- M_1h:
- if(RESRVPTS < 800) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 85;
- set RESRVPTS, RESRVPTS - 800;
- close;
- M_1i:
- if(RESRVPTS < 900) goto sL_LowPts1;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 516, 100;
- set RESRVPTS, RESRVPTS - 900;
- close;
- M_1j:
- if(RESRVPTS < 1000) goto sL_LowPts1;
- set RESRVPTS, RESRVPTS - 1000;
- mes "[Kafra]";
- mes "^0000FF1st Lottery Opportunity!!^000000";
- set @Lotto, 1;
- next;
- callfunc "F_Lottery";
- goto M_End;
-
- sL_LowPts1:
- mes "[Kafra]";
- mes "I'm sorry but you do not have enough reserve points for that selection.";
- goto M_Menu;
-
- M_2:
- menu "1100- Red Potion 7 ea",M_2a, "1300- Red Potion 15 ea",M_2b, "1500- Red Potion 25 ea",M_2c,
- "1700- Red Potion 35 ea",M_2d, "1900- Red Potion 50 ea",M_2e, "2100- Red Potion 60 ea",M_2f,
- "2300- Red Potion 75 ea",M_2g, "2500- Red Potion 85 ea",M_2h, "2800- Red Potion 100 ea",M_2i,
- "3000- 2nd Lotery Chance!",M_2j, "Previous List",M_Menu, "Cancel",M_End;
-
- M_2a:
- if(RESRVPTS < 1100) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 7;
- set RESRVPTS, RESRVPTS - 1100;
- close;
- M_2b:
- if(RESRVPTS < 1300) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 15;
- set RESRVPTS, RESRVPTS - 1300;
- close;
- M_2c:
- if(RESRVPTS < 1500) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 25;
- set RESRVPTS, RESRVPTS - 1500;
- close;
- M_2d:
- if(RESRVPTS < 1700) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 35;
- set RESRVPTS, RESRVPTS - 1700;
- close;
- M_2e:
- if(RESRVPTS < 1900) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 50;
- set RESRVPTS, RESRVPTS - 1900;
- close;
- M_2f:
- if(RESRVPTS < 2100) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 60;
- set RESRVPTS, RESRVPTS - 2100;
- close;
- M_2g:
- if(RESRVPTS < 2300) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 75;
- set RESRVPTS, RESRVPTS - 2300;
- close;
- M_2h:
- if(RESRVPTS < 2500) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 85;
- set RESRVPTS, RESRVPTS - 2500;
- close;
- M_2i:
- if(RESRVPTS < 2800) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 501, 100;
- set RESRVPTS, RESRVPTS - 2800;
- close;
- M_2j:
- if(RESRVPTS < 3000) goto sL_LowPts2;
- set RESRVPTS, RESRVPTS - 3000;
- mes "[Kafra]";
- mes "^0000FF2nd Lottery Opportunity!!^000000";
- set @Lotto, 2;
- next;
- callfunc "F_Lottery";
- goto M_End;
-
- sL_LowPts2:
- mes "[Kafra]";
- mes "I'm sorry but you do not have enough reserve points for that selection.";
- next;
- goto M_2;
-
- M_End:
- mes "[Kafra]";
- mes "Please come back anytime when you have more reserve points.";
- cutin "",255;
- close;
-}
-
-// Special Reserve 2 ----------------------------------------------
-aldeba_in.gat,88,161,3 script Kafra#05 115,{
- cutin "kafra_03",2;
- mes "[Kafra]";
- mes "Welcome ^5577FF"+strcharinfo(0)+"^000000. We are currently having a special event for our customers.";
- mes "You can get free gifts by using your ^FF5533special reserve points^000000 in the ^3355FFSpecial Kafra Gift Event^000000!!";
- next;
- mes "[Kafra]";
- mes "Would you like to use your points?";
- next;
- menu "Yes I would.",-, "Maybe next time.",M_End;
-
- mes "[Kafra]";
- mes "You have the following amount of special reserve points: ^5544FF"+RESRVPTS+"^000000.";
- mes "Make a choice and test your luck!";
- next;
- menu "5000pts = 1st Lottery Chance!",sM_1st, "7000pts = 2nd Lottery Chance!",sM_2nd, "10000pts = 3rd Lottery Chance!",sM_3rd, "Cancel",M_End;
-
- sM_1st:
- if(RESRVPTS < 5000) goto sL_NotEnuf;
- set RESRVPTS, RESRVPTS - 5000;
- set @Lotto, 3;
- callfunc "F_Lottery";
- goto M_End;
- sM_2nd:
- if(RESRVPTS < 7000) goto sL_NotEnuf;
- set RESRVPTS, RESRVPTS - 7000;
- set @Lotto, 4;
- callfunc "F_Lottery";
- goto M_End;
- sM_3rd:
- if(RESRVPTS < 10000) goto sL_NotEnuf;
- set RESRVPTS, RESRVPTS - 10000;
- set @Lotto, 5;
- callfunc "F_Lottery";
- goto M_End;
-
- sL_NotEnuf:
- mes "[Kafra]";
- mes "I'm sorry dear but you do not have enough points for this selection.";
- cutin "",255;
- close;
- M_End:
- mes "[Kafra]";
- mes "No problem. Collect more and more special reserve points by using the Kafra Services found throughout Rune Midgard.";
- mes "Thank you for using Kafra Corp. services.";
- cutin "",255;
- close;
-}
-
-// Function F_Lottery ------------------------------------------------------------------------------------------
-function script F_Lottery {
- mes "[Kafra]";
- mes "You have the unique opportunity to win a prize sent down from the heavens themselves!!";
- next;
- mes "[Kafra]";
- mes "Don't miss this one and only chance! Now dear, are you ready?";
- next;
- mes "[Kafra]";
- mes "How many times do you want the Lottery Machine to spin? You can choose up to 5 times.";
- next;
- input @input;
- if(@input < 1 || @input > 5) set @input, rand(1,5); //Lupus's fix
- callsub sF_Spin;
- mes "[Kafra]";
- mes "Ok~ Let me check the results~ guess what it is?";
- next;
- mes "[Kafra]";
- mes "^FF0000Lets see.... This is...!!^000000";
- next;
- if(@temp < 1) goto sL_Prize1;
- if(@temp < 2) goto sL_Prize2;
- if(@temp < 3) goto sL_Prize3;
- if(@temp <= 4) goto sL_Prize4;
- goto sL_Prize5;
-
- sL_Prize1:
- mes "[Kafra]";
- mes "WOW!!!!..... You win!!! 1st Prize~! Congratulations~~ You got the 1st prize~~";
- if(@Lotto == 1) getitem 2328,1;//Items: Wooden_Mail,
- if(@Lotto == 2) getitem 2307,1;//Items: Mantle,
- if(@Lotto == 3) getitem 657,10;//Items: Berserk_Potion,
- if(@Lotto == 4) {
- getitem 607,2;//Items: Yggdrasilberry,
- getitem 608,1;//Items: Yggdrasil_Seed,
- }
- if(@Lotto == 5) getitem 607,3;//Items: Yggdrasilberry,
- return;
- sL_Prize2:
- mes "[Kafra]";
- mes "Oh! WOW! You've won the 2nd prize! Congratulations!!";
- if(@Lotto == 1) getitem 2403,1;//Items: Shoes,
- if(@Lotto == 2) getitem 2226,1;//Items: Cap,
- if(@Lotto == 3) getitem 2201,1;//Items: Sunglasses,
- if(@Lotto == 4) getitem 526,3;//Items: Royal_Jelly,
- if(@Lotto == 5) {
- getitem 608,1;//Items: Yggdrasil_Seed,
- getitem 526,10;//Items: Royal_Jelly,
- }
- return;
- sL_Prize3:
- mes "[Kafra]";
- mes "Congratulations! You've won the 3rd prize.";
- if(@Lotto == 1) getitem 602,4;//Items: Butterfly_Wing,
- if(@Lotto == 2) getitem 505,3;//Items: Blue_Potion,
- if(@Lotto == 3) getitem 2203,1;//Items: Glasses,
- if(@Lotto == 4) getitem 504,15;//Items: White_Potion,
- if(@Lotto == 5) getitem 504,30;//Items: White_Potion,
- return;
- sL_Prize4:
- mes "[Kafra]";
- mes "You've won the 4th prize.";
- if(@Lotto == 1) getitem 516,100;//Items: Sweet_Potato,
- if(@Lotto == 2) getitem 501,150;//Items: Red_Potion,
- if(@Lotto == 3) getitem 502,150;//Items: Orange_Potion,
- if(@Lotto == 4) getitem 505,5;//Items: Blue_Potion,
- if(@Lotto == 5) getitem 505,10;//Items: Blue_Potion,
- return;
- sL_Prize5:
- mes "[Kafra]";
- mes "You've won the 5th prize.";
- if(@Lotto == 1) getitem 516,50;//Items: Sweet_Potato,
- if(@Lotto == 2) getitem 501,100;//Items: Red_Potion,
- if(@Lotto == 3) getitem 501,200;//Items: Red_Potion,
- if(@Lotto == 4) getitem 501,250;//Items: Red_Potion,
- if(@Lotto == 5) getitem 501,300;//Items: Red_Potion,
- return;
-
-sF_Spin:
- mes "[Lottery Machine]";
- mes "Number of spins remaining: "+@input;
- next;
- mes "[Lottery Machine]";
- mes "(rumble~rumble~rumble~)...";
- next;
- set @temp, rand(10);
- set @input, @input -1;
- if(@input <= 0) return;
- goto sF_Spin;
-}
-
-
-// Kafra Pavianne -----------------------------
-aldeba_in.gat,81,166,4 script Kafra Pavianee 117,{
- cutin "kafra_01",2;
- mes "[Kafra Pavianne]";
- mes "Welcome! I'm Pavianne,";
- mes "one of the senior Kafra Employees.";
- mes "The Kafra Corporation Service is";
- mes "always trying to satisfy 100 % of";
- mes "our customers' expectations.";
- next;
- mes "[Kafra Pavianne]";
- mes "Due to a change in customer support";
- mes "policy, we no longer accept Kafra";
- mes "Passes. However, we are offering";
- mes "refunds for our customers who still";
- mes "possess these passes.";
- next;
- menu "Sell Kafra Pass",-,"Alright, bye~",M_BYE;
-
- set usedKafPass,0; //clear unused global variable
- mes "[Kafra Pavianne]";
- if(!countitem(1084)){
- mes "I'm sorry,";
- mes "but you don't";
- mes "have any Kafra Passes.";
- emotion e_sry;
- close2;
- cutin "",255;
- end;
- }
- mes "Let me see ... You have " + countitem(1084) + " Kafra Passes.";
- mes "So, you will get " + (countitem(1084)*2000) + " zeny.";
- next;
- mes "[Kafra Pavianne]";
- mes "Do you want to sell these?";
- next;
- if(select("Sell.:Nevermind.")==1){
- mes "[Kafra Pavianne]";
- set @t,countitem(1084);
- if(!@t){
- mes "Well, you DON'T have any >.<";
- mes "I understand what you want to do but, I can't help you.";
- emotion e_sry;
- close2;
- cutin "",255;
- end;
- }
- delitem 1084,@t;
- set Zeny,Zeny+@t*2000;
- emotion e_thx;
- mes "We already refunded all THE Kafra Passes that you had..";
- mes "Thank you for using our service !";
- mes "I am kafra Pavianne.";
-
- }
- close2;
- cutin "",255;
- end;
- M_BYE:
- mes "[Kafra Pavianne]";
- mes "Thank you,";
- mes "have a good day.";
- emotion e_thx;
- close2;
- cutin "",255;
- end;
-}
-
-// Kafra Blossom -----------------------------------
-aldeba_in.gat,83,244,4 script Kafra Blossom 116,{
- cutin "kafra_02",2;
- mes "[Kafra Blossom]";
- mes "..... Pavianne is soooo old school! She's too stubborn is what it is...";
- emotion e_pif;
- next;
- mes "[Kafra Blossom]";
- mes "We should be trying to make our customers' experience more unique, with new and creative ideas...";
- next;
- mes "[Kafra Blossom]";
- mes "Anyways... WEELLLLCOOMMME!!!~~ I am Kafra type ^3333ffBlossom^000000.";
- mes "Please don't forget to continue using our Kafra Services, and ask for me, ^3333ffBlossom^000000!";
- next;
- menu "I'm an admirer of you~!",-,"Ehhaha",M_1;
-
- mes "[Kafra Blossom]";
- mes "Really! Thank you sooo much!! Here is... my... autograph...";
- emotion e_thx;
- next;
- mes "[Kafra Blossom]";
- mes "Don't bother to look in your Item Inventory for it. It won't be there... tehehe... for my autograph will remain within your heart.";
- emotion e_ok;
- cutin "",255;
- close;
- M_1:
- mes "[Kafra Blossom]";
- mes "Huh? . . . . . That's all? Phew~ such a dull customer...";
- emotion e_what;
- cutin "",255;
- close;
-}
-
-// Kafra Curly Sue ---------------------------------
-aldeba_in.gat,91,244,4 script Kafra Curly Sue 112,{
- cutin "kafra_06",2;
- mes "[Kafra Curly Sue]";
- mes "Hello, hello! I'm the youngest of all Kafra personnel, the Kafra cutey....";
- next;
- mes "[Kafra Curly Sue]";
- mes "I am Kafra Type 'Curly Sue'!!";
- next;
- mes "[Kafra Curly Sue]";
- mes "I'm rather new so haven't been on the job all that long, but I am always doing my best!!";
- next;
- menu "Uh... where is your mommy?",-,"End conversation",M_End;
-
- mes "[Kafra Curly Sue]";
- mes ".... Sob~sob~... WHAT?? I'm NOT some KID!!";
- emotion e_sob;
- next;
- cutin "",255;
- close;
- M_End:
- mes "[Kafra Curly Sue]";
- mes "Here at Kafra Corp., we're all doing our B-E-S-T to provide our customers with the B-E-S-T service.";
- mes "We really appreciate your doing business with us.";
- next;
- cutin "",255;
- close;
-}
-
-// Kafra Roxie --------------------------------------
-aldeba_in.gat,148,244,4 script Kafra Roxie 114,{
- cutin "kafra_04",2;
- mes "[Kafra Roxie]";
- mes "Welcome! I'm Kafra type 'Roxie'. Let me let you in on a special secret about the Kafras!";
- next;
- mes "[Kafra Roxie]";
- mes "You know... Our Kafra Service wasn't originally called Kafra.... Well what do you think it was?~";
- next;
- mes "[Kafra Roxie]";
- mes "TaDa~ Surprisingly it was.... Ka....";
- next;
- mes "[Kafra Roxie]";
- mes "(Ring Ring Ring) Oh... my phone... Sorry please wait...";
- next;
- mes "[Kafra Roxie]";
- mes "Hi, Kafra Type Roxie here.... Huh! Director, sir!... Yes!... Yes!... I understand! ..... Sure!... Ah... Huh?!";
- next;
- mes "[Kafra Roxie]";
- mes "No-no sir!.... Yes I understand!!";
- next;
- mes "[Kafra Roxie]";
- mes "(*Click*) ..... Heh heh....";
- next;
- mes "[Kafra Roxie]";
- mes "Uh... please ignore what I was talking about earlier. Hahaha.....heh...";
- emotion e_swt;
- cutin "",255;
- close;
-}
-
-
-//<====================================================== Clock Tower ==============================================================>\\
-// Clock Keeper ---------------------------------------------------------------
-aldebaran.gat,143,136,4 script Clock Keeper 89,{
- mes "[Clock Keeper]";
- mes "Let me introduce myself, I am 'Monster A' of the Al De Baran Clock Tower, and the Committee of 'Heaven on Earth'.";
- next;
- mes "[Clock Keeper]";
- mes "It looks like you have an interest in this tower?";
- next;
- menu "About the Clock Tower.",-,"About the Committee of 'Heaven on Earth'.",M_1,"Quit.",M_End;
-
- mes "[Clock Keeper]";
- mes "Each floor of this tower is connected through a device called a 'Warp'.";
- mes "Most of these warps are standard warps but some of them are 'Random Warps'.";
- next;
- mes "[Clock Keeper]";
- mes "You should be careful with 'Random Warps' because they will transport you to a random location.";
- next;
- mes "[Clock Keeper]";
- mes "I know you wouldn't want to get separated from you friends while you're battling monsters.";
- next;
- mes "[Clock Keeper]";
- mes "Random warps are shown as green dots on the Mini-Map so keep your eyes on the Mini-Map to avoid them.";
- next;
- mes "[Clock Keeper]";
- mes "Have a good time with the clocks. Hehehehe.";
- close;
- M_1:
- mes "[Clock Keeper]";
- mes "Have you ever heard of the Committee of 'Heaven on Earth'?!";
- next;
- menu "Yup, I have",-,"What are they?",sM_1;
-
- mes "[Clock Keeper]";
- mes "Muhahahaha! Good, good! I'm so glad that our reputation has spread throughout Rune-Midgard.";
- mes "What a great day to meet an adventurer like you! I would like to present this to you.....";
- next;
- mes "[Clock Keeper]";
- mes "Hmmm... Where did I leave it...";
- next;
- mes "[Clock Keeper]";
- mes "Oops... it seems that I left the present in the control room on the 4th floor of the tower.";
- mes "I promise I will give it to you next time. See you later.";
- close;
- sM_1:
- mes "[Clock Keeper]";
- mes "What? I can't believe that there are still people who do not know about us!";
- next;
- mes "[Clock Keeper]";
- mes "Our goal is to build a Heaven on Earth. Specifically here in AL De Baran. For starters, we built this clock tower.";
- next;
- mes "[Clock Keeper]";
- mes "We even created the idea for Glast Helm a while back.";
- mes "Look around and you will see many of our great achievements.";
- close;
- M_End:
- close;
-}
-
-// Gatekeeper Riku -------------------------------------------------------------------
-c_tower3.gat,10,249,4 script Gatekeeper#01 84,{
- mes "[Gatekeeper Riku]";
- mes "Welcome to ";
- mes "Kinase - Blue Gallino";
- mes "the one of Local Speciality in Aldebaran.";
- mes "However,from the 4th Floor of this Clock Tower,";
- mes "You may not enter.";
- mes "Please go back to where you're from.";
- next;
- menu "About Clock Tower",-,"About the 4th Floor",M_1,"Move to the 4th Floor",M_2,"End mesue",M_End;
-
- mes "[Gatekeeper Riku]";
- mes "Homeland of Alchemy, Aldebaran!";
- mes "Long Time ago, there were";
- mes "3 Legendary Alchemists...They are";
- mes "Bruke Seimer,";
- mes "Philip Warisez,";
- mes "And..";
- next;
- mes "[Gatekeeper Riku]";
- mes "Romero Specialre!";
- mes "This venerable architecture is their masterpiece.";
- mes "I assume you would feel something unusual";
- mes "While on the way to this floor,";
- mes "Every feature of This Clock tower ";
- next;
- mes "[Gatekeeper Riku]";
- mes "Consists of Mysterious Ancient Magics.";
- mes "If you just wander around here without any intention";
- next;
- mes "[Gatekeeper Riku]";
- mes "By any means,";
- mes "You will meet with a mishap";
- mes "by Gatekeeper Creatures.";
- mes "Please be careful ..";
- close;
- M_1:
- mes "[Gatekeeper Riku]";
- mes "Ancient Alchemists";
- mes "Sealed the Gate of 4th Floor using an Alchemistic Device ";
- mes "To keep something";
- mes "From Evil Creatures and Human Enemies.";
- mes "To go through this door";
- next;
- mes "[Gatekeeper Riku]";
- mes "It needs a Key.";
- mes "That Key has rumored to be possessed by Gatekeeper Creatures";
- mes "Prowling around here.";
- next;
- mes "[Gatekeeper Riku]";
- mes "The Key is the Intensiveness of Ancient Alchemy,";
- mes "By hearsay When used once,";
- mes "It will be released from being spelled";
- mes "And be disappeared.";
- next;
- mes "[Gatekeeper Riku]";
- mes "If that key comes into your possession, please show it to me.";
- mes "The one who possesses the Key of Clock Tower";
- mes "Will have access to go through this Gate with his own will!";
- next;
- mes "[Gatekeeper Riku]";
- mes "I will give you a chance.";
- mes ". . . . .";
- close;
- M_2:
- mes "[Gatekeeper Riku]";
- if(countitem(7026) < 1) goto L_Check_Key;
- delitem 7026,1;
- mes "Hmm! I already felt that you are not an Ordinary person,";
- mes "Now it seems to be successful in Speculation.";
- mes "Please, You may enter.";
- mes "May God bless you ..";
- next;
- warp "c_tower4.gat",185,44;
- close;
-
- L_Check_Key:
- mes ". . . . . .";
- mes "Unfortunately you don't have a privilege";
- mes "To enter this Gate ..";
- mes "You won't be able to go through";
- mes "As long as Ancient Alchemists";
- mes " Don't approve you.";
- close;
- M_End:
- mes "[Gatekeeper Riku]";
- mes "This Clock Tower";
- mes "Is the place where the 3 Ancient Legendary Alchemists";
- mes "Have left their Spirits and Skills.";
- mes "Please Do not Scribble or Damage on the Interior.";
- close;
-}
-
-//<======================================== Al De Baran Dungeon ==========================================>\\
-alde_dun03.gat,264,16,4 script Gatekeeper#02 101,{
- mes "[Gatekeeper Boy]";
- mes "Welcome to";
- mes "Kinase - Blue Gallino";
- mes "The one of Local Speciality in Aldebaran.";
- mes "You can't go through from B4th Floor,";
- mes "Please go back.";
- next;
- menu "About Clock Tower",-,"About B4th Floor",M_1,"Move to the B4th Floor",M_2,"End mesue",M_End;
-
- mes "[Gatekeeper Boy]";
- mes "Homeland of Alchemy, Aldebaran!";
- mes "Long Time ago, there were";
- mes "3 Legendary Alchemists... They are";
- mes "Bruke Seimer";
- mes "Philip Warisez";
- mes "And ..";
- next;
- mes "[Gatekeeper Boy]";
- mes "Romero Specialre!";
- mes "This venerable architecture is";
- mes "their masterpiece.";
- mes "I assume you would feel something unusual";
- mes "While on the way to this floor,";
- mes "Every feature of This Clock tower";
- next;
- mes "[Gatekeeper Boy]";
- mes "Consists of Mysterious Ancient Magics.";
- mes "If you just wander around here,";
- mes " without any intention";
- next;
- mes "[Gatekeeper Boy]";
- mes "By any means,";
- mes "You will meet with a mishap";
- mes "by Gatekeeper Creatures.";
- mes "Please be careful ..";
- close;
- M_1:
- mes "[Gatekeeper Boy]";
- mes "Ancient Alchemists";
- mes "Sealed the Gate of 4th Floor using an Alchemistic Device ";
- mes "To keep something";
- mes "From Evil Creatures and Human Enemies.";
- mes "To go through this door";
- next;
- mes "[Gatekeeper Boy]";
- mes "It needs a Key.";
- mes "That Key has rumored to be possessed by Gatekeeper Creatures";
- mes "Prowling around here.";
- next;
- mes "[Gatekeeper Boy]";
- mes "The Key is the Intensiveness of Ancient Alchemy,";
- mes "By hearsay When used once,";
- mes "It will be released from being spelled";
- mes "And be disappeared.";
- next;
- mes "[Gatekeeper Boy]";
- mes "If that key comes into your possession, please show it to me.";
- mes "The one who possesses the Key of Underground";
- mes "Will have access to go through this Gate with his own will!";
- next;
- mes "[Gatekeeper Boy]";
- mes "I will give you a chance.";
- mes ". . . . .";
- close;
- M_2:
- mes "[Gatekeeper Boy]";
- if(countitem(7027) < 1) goto L_Check_Key;
- delitem 7027,1;
- mes "Hmm! I already felt that you are not an Ordinary person,";
- mes "Now it seems to be successful in Speculation.";
- mes "Please,You may enter.";
- mes "May God bless you ..";
- next;
- warp "alde_dun04.gat",79,267;
- close;
-
- L_Check_Key:
- mes ". . . . . .";
- mes "Unfortunately you don't have a privilege";
- mes "To enter this Gate ..";
- mes "You won't be able to go through";
- mes "As long as Ancient Alchemists";
- mes " Don't grant you.";
- close;
- M_End:
- mes "[Gatekeeper Boy]";
- mes "This Clock Tower";
- mes "Is the place where the 3 Ancient Legendary Alchemists";
- mes "Has left their Spirits and Skills.";
- mes "Please Do not Scribble or Damage on the Interior.";
- close;
-}
+//===== eAthena Script =======================================
+//= Al De Baran Town
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.9a
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.1 Added RS125 NPC. Added another Kafra Reserve points agent.
+//= The 2nd reserve points agent is not complete yet.
+//= 1.2 Lottery input number fix [Lupus], 1.2a - label typo fixed
+//= 1.3 Gatekeeper's bug fixed (wrong check and wrong item ID
+//= for underground), fixed some typos [Lupus]
+//= 1.4 Fixed Typos & Spellcheck [massdriller]
+//= 1.5 Finally added the Special Reserve 2 Lotto 8))
+//= with official prizes (80% official, 4-5 entries are made up)
+//= also changed typo Orange Potions -> Red Potions [Lupus]
+//= 1.6 Fixed bug (missing label), optimized all menus [Lupus]
+//= 1.7 Fixed exploits [Lupus] 1.8 Removed Duplicates [Silent]
+//= 1.9 Fixed a bunch of typos with information from Crono/Hollengrhen [Evera]
+//= 1.9a Now Pavianne doesn't sell Kafra Passes. She refunds them [Lupus]
+//============================================================
+
+
+// Panama --------------------------------------------------------------
+aldebaran.gat,46,129,4 script Panama 97,{
+ mes "[Panama]";
+ mes "Al De Baran has been widely known throughout Rune-Midgard Kingdom as the City of canals.";
+ next;
+ menu "About the canals",-,"End conversation",M_End;
+
+ mes "[Panama]";
+ mes "A canal is an artificial river used for travel, shipping, or irrigation. Generally they are used for transportation.";
+ next;
+ mes "[Panama]";
+ mes "Most canals are constructed through reclamation work in which waterways are left over after a area of water as been filled in with dirt.";
+ close;
+ M_End:
+ mes "[Panama]";
+ mes "This is a mountain town so the water is supposed to be pure ...";
+ next;
+ mes "[Panama]";
+ mes "Help yourself to some...";
+ close;
+}
+
+// Miller ------------------------------------------------------------------------
+aldebaran.gat,49,93,4 script Miller 83,{
+ mes "[Miller]";
+ mes "Did you know that LEVEL 4 weapons exist?";
+ next;
+ mes "[Miller]";
+ mes "Hmmm... of course they are rarely seen, but I hear that Boss monsters drop them occasionally.";
+ close;
+}
+
+// Senorita Sylvia -----------------------------------------------------------
+aldebaran.gat,60,70,4 script Senorita Sylvia 69,{
+ mes "[Senorita Sylvia]";
+ mes "I came all the way out here from Prontera because I heard that the Kafra Main Office is somewhere in the city of Al De Baran";
+ next;
+ mes "[Senorita Sylvia]";
+ mes "B-B-But... *sob*... It's been 5 hours since I started looking for it.....";
+ emotion e_sob;
+ next;
+ mes "[Senorita Sylvia]";
+ mes "Where the hell is it~~~?!";
+ emotion e_an;
+ next;
+ mes "[Senorita Sylvia]";
+ mes "I may look smart, but I am TERRIBLE with directions.....";
+ next;
+ mes "[Senorita Sylvia]";
+ mes "Ah~ by the way, would you like to know a bit of very useful information?";
+ next;
+ menu "Please continue.",-,"Not really.",M_End;
+
+ mes "[Senorita Sylvia]";
+ mes "If you pick up equipment that was dropped by a monster, you will not be able to equip it right away.";
+ next;
+ mes "[Senorita Sylvia]";
+ mes "Before you can use it you have to identify the equipment with a ^0000FFMagnifier^000000.";
+ mes "Once you've done so you'll be able to equip it without problems.";
+ close;
+ M_End:
+ mes "[Senorita Sylvia]";
+ mes "Whatever.....";
+ emotion e_pif;
+ close;
+}
+
+// Quatro ----------------------------------------------------------------
+aldebaran.gat,64,104,4 script Quatro 55,{
+ mes "[Quatro]";
+ mes "It has been rumored that famous blacksmith came to this town from Geffen...";
+M_Menu:
+ next;
+ menu "Famous Blacksmith?",-,"About weapon upgrading",M_1,"End conversation",M_End;
+
+ mes "[Quatro]";
+ mes "People say his wife is ill. She constantly needs medicinal herbs that grow near town.";
+ mes "Also, he has a devoted son who helps him out with his work.";
+ next;
+ mes "[Quatro]";
+ mes "I hope his son will be a good blacksmith in the future.";
+ goto M_Menu;
+
+ M_1:
+ mes "[Quatro]";
+ mes "If you upgrade a weapon its attack strength will increase.";
+ next;
+ mes "[Quatro]";
+ mes "For a ^0000fflevel 1^000000 weapon attack STR will go up by ^ff00002^000000 for every upgrade level.";
+ mes "For a ^0000fflevel 2^000000 weapon attack STR will go up by ^ff00003^000000.";
+ mes "For a ^0000fflevel 3 and level 4^000000 weapon attack STR will go up by ^ff00005^000000!";
+ goto M_Menu;
+
+ M_End:
+ close;
+}
+
+// Isenberg ---------------------------------------------------------------------
+aldebaran.gat,67,154,4 script Isenberg 98,{
+ mes "[Isenberg]";
+ mes "Mount Mjolnir and the Payon Forest are both notorious for high amounts of rainfall.";
+M_Menu:
+ next;
+ menu "Mt. Mjolnir",-,"Payon Forest",M_1,"End conversation",M_End;
+
+ mes "[Isenberg]";
+ mes "Mt. Mjolnir !";
+ next;
+ mes "[Isenberg]";
+ mes "It's the mountain range which you must pass through to get here from either Prontera or Geffen.";
+ next;
+ mes "[Isenberg]";
+ mes "It is a difficult path however due to the steep and rugged terrain.";
+ mes "Not to mention the strong and hostile monsters which roam the mountain side.";
+ next;
+ mes "[Isenberg]";
+ mes "You did a good job to get here.";
+ emotion e_no1;
+ goto M_Menu;
+ M_1:
+ mes "[Isenberg]";
+ mes "You must travel through the Payon Forest if you wish to visit Alberta or Payon.";
+ next;
+ mes "[Isenberg]";
+ mes "The Payon Forest is large and its pathways are very intricate. It is easy to get lost and confused in it.";
+ next;
+ mes "[Isenberg]";
+ mes "Unless you have good concentration and a strong will, you will find yourself giving up trying to pass through it.";
+ next;
+ mes "[Isenberg]";
+ mes "The forest was named after Payon, the village of independence, instead of Alberta, the harbor town.";
+ next;
+ mes "[Isenberg]";
+ mes "Payon was built deep within the rugged forest with the intention of providing protection from outside influence.";
+ next;
+ mes "[Isenberg]";
+ mes "I guess that's why people called that forest the Payon Forest rather than the Alberta Forest.";
+ goto M_Menu;
+ M_End:
+ mes "[Isenberg]";
+ mes "Although Mnt. Mjolnir hinders travelers, it also creates a mysterious and unique atmosphere in our town.";
+ close;
+}
+
+// Joanne ------------------------------------------------------------------------------
+aldebaran.gat,81,61,4 script Joanne 101,{
+ mes "[Joanne]";
+ mes "I like to go gathering sea shells. It is really fun";
+ next;
+ menu "Shell Gathering",-,"End Conversation",M_End;
+
+ mes "[Joanne]";
+ mes "When you see bubbles popping up from the sand or a muddy puddle, try digging in that area.";
+ mes "Usually shell fish conceal themselves under the ground.";
+ next;
+ mes "[Joanne]";
+ mes "By the way, there is a dangerous shell fish called Ambernite.";
+ mes "It can usually be found on the beaches near Comodo.";
+ next;
+ mes "[Joanne]";
+ mes "What a scary shell fish ..";
+ close;
+ M_End:
+ mes "[Joanne]";
+ mes "I'm going to taste Cave Shell Fish one of these days!!";
+ mes "I know it is a little bit dangerous... but it's worth the risk, right?";
+ close;
+}
+
+// Bebe -------------------------------------------------------------------
+aldebaran.gat,86,228,4 script Bebe 703,{
+ mes "[Bebe]";
+ mes "A while back I went out for a walk towards Mt.Mjolnir, carrying a 'Savage Babe' with me.";
+M_Menu:
+ next;
+ menu "Savage Babe??",-,"Mt.Mjolnir??",M_1,"End Conversation",M_End;
+
+ mes "[Bebe]";
+ mes "A Savage Babe is a kind of baby wild boar that has a pink color. It's very cute and pretty.";
+ next;
+ mes "[Bebe]";
+ mes "Anyways, I was walking up this narrow path when... out of nowhere, this GIANT, UGLY, PLANT attacked me and my Savage Babe!";
+ emotion e_gasp;
+ next;
+ mes "[Bebe]";
+ mes "I was so frightened that I ran as far away from it as I could. When I stopped running I noticed that it hadn't followed me.";
+ next;
+ mes "[Bebe]";
+ mes "So I threw rocks at it out of anger. It didn't do much good though. I don't think it even felt anything.";
+ next;
+ mes "[Bebe]";
+ mes "I then noticed something else. The plant had a human looking face!! EEEWWW!!!";
+ emotion e_swt2;
+ next;
+ mes "[Bebe]";
+ mes "If you every see one, don't even think about going near it. It may just bite you to death!";
+ goto M_Menu;
+
+ M_1:
+ mes "[Bebe]";
+ mes "Even though people are fascinated by the scenic beauty of Mt.Mjolnir, this mountain is filled with weird monsters.";
+ next;
+ mes "[Bebe]";
+ mes "Monsters like Man Eating Flowers, giant Moths, Bigfoot, giant Centipedes, and so much more. So be careful if you ever go up there.";
+ next;
+ mes "[Bebe]";
+ mes "Most of the monsters won't attack you if you don't attack them first though.";
+ goto M_Menu;
+
+ M_End:
+ mes "[Bebe]";
+ mes "Ah?! Where is my Savage Babe..? Savage Babe, where are you!";
+ emotion e_hmm;
+ close;
+}
+
+// Epthiel -----------------------------------------------------------------
+aldebaran.gat,90,170,4 script Epthiel 47,{
+ mes "[Epthiel]";
+ mes "Some weapons and armor have slots in them. This allows you to insert monster cards into them.";
+M_Menu:
+ next;
+ menu "About the number of slots..",-,"Relation between Cards and Slots",M_1,"End Conversation",M_End;
+
+ mes "[Epthiel]";
+ mes "Items dropped by monsters often times have more slots than ordinary weapons or armor sold at an NPC shop.";
+ next;
+ mes "[Epthiel]";
+ mes "The greater number of slots a piece of equipment has the greater its value is.";
+ goto M_Menu;
+ M_1:
+ mes "[Epthiel]";
+ mes "When a card is inserted into a slot on a piece of equipment, the owner will gain certain skills or stat bonuses from that card.";
+ next;
+ mes "[Epthiel]";
+ mes "If the weapon or armor with the card is unequipped, then the effect of the card will wear off.";
+ next;
+ mes "[Epthiel]";
+ mes "A very important thing to know about inserting a card into a slot, is that once inserted the card cannot be removed.";
+ next;
+ mes "[Epthiel]";
+ mes "So make sure you're absolutely sure about putting a card into a slot. You don't want to waste one.";
+ goto M_Menu;
+ M_End:
+ mes "[Epthiel]";
+ mes "Do you have a card?";
+ close;
+}
+
+// Daniel --------------------------------------------------------------------------
+aldebaran.gat,93,80,4 script Daniel 48,{
+ mes "[Daniel]";
+ mes "With waterways everywhere, the city of Al De Baran is a wonderful place to live.";
+ next;
+ mes "[Daniel]";
+ mes "B-U-T!.....";
+ emotion e_gasp;
+ next;
+ mes "[Daniel]";
+ mes "Last night on the way to see my girl friend, I fell into one of those waterways and sprang my ankle.";
+ mes "I couldn't enjoy my date with my girl friend which sucked big time!";
+ emotion e_ag;
+ next;
+ menu "Gosh, that's too bad.",-,".....",M_1;
+
+ mes "[Daniel]";
+ mes "*~Sigh~* Yeah it really is. You see my girl friend is the Armor Merchant's youngest daughter.";
+ mes "She told me once that the armor that's dropped by monsters is often times much better than the kind sold in shops.";
+ next;
+ mes "[Daniel]";
+ mes "She said something about the armor having 'more slots'.... whatever that means.";
+ close;
+ M_1:
+ mes "[Daniel]";
+ mes "Huh? *~Sob sob~* You think I'm a stupid idiot, right? ";
+ emotion e_sob;
+ close;
+}
+
+// Munster -----------------------------------------------------------------
+aldebaran.gat,113,70,2 script Munster 48,{
+ mes "[Munster]";
+ mes "My family used to live in Geffen, the homeland of blacksmiths. We moved to Al De Baran last winter.";
+ next;
+ mes "[Munster]";
+ mes "Back in Geffen my father was a famous blacksmith. Sometimes I helped my father with his work";
+ mes "I learned a lot about the success rate of upgrading weapons of different levels.";
+ next;
+ mes "[Munster]";
+ mes "A ^0000fflevel 1^000000 weapon could be safely upgraded ^ff00007^000000 times,";
+ mes "A ^0000fflevel 2^000000 weapon ^ff00006^000000 times,";
+ mes "and ^0000fflevel 3 and 4^000000 weapons ^ff00005^000000 times each.";
+ next;
+ mes "[Munster]";
+ mes "With level 4 weapons however, there is still a risk of failure during the first upgrade.";
+ next;
+ mes "[Munster]";
+ mes "As far as ^0000ffarmor^000000 goes, they can generally be upgraded about ^ff00005^000000 times.";
+ next;
+ mes "[Munster]";
+ mes "Maybe it's because we just moved here, but for some reason people don't seem to know that my fathers workshop is now located in Al De Baran,";
+ next;
+ mes "[Munster]";
+ mes "Any who, I hope people will come to re-acquaint themselves with my father's superior craftsmanship.";
+ close;
+}
+
+// Phracon Guy --------------------------------------------------------------
+aldebaran.gat,117,181,4 script Phracon Guy 48,{
+ mes "[Phracon Guy]";
+ mes "Lv 1 weapons require a metal called 'Phracon' to be upgraded.";
+ next;
+ menu "About Phracon",-,"Advice about Phracon",M_1,"End Conversation",M_End;
+
+ mes "[Phracon Guy]";
+ mes "It's a very common metal found throughout Rune-Midgard and is used almost exclusively for weapon upgrading.";
+ next;
+ mes "[Phracon Guy]";
+ mes "Although it's not as strong as other metals, it remains popular among most people because of its abundance.";
+ next;
+ mes "[Phracon Guy]";
+ mes "You can obtain Phracon from monsters or you can purchase it from Forging Workshops located in towns.";
+ next;
+ mes "[Phracon Guy]";
+ mes "If you don't need Phracon for upgrading purposes then you can sell it for 100 zeny a piece to NPC's!";
+ close;
+ M_1:
+ mes "[Phracon Guy]";
+ mes "I hear that a lot of monsters carry Phracon. Why don't you go hunt them?";
+ mes "You should be able to find a lot of Phracon without much trouble.";
+ next;
+ mes "[Phracon Guy]";
+ mes "A couple of days ago, I went hunting with the Pub Master and got a Phracon dropped from Bebe Savage.";
+ close;
+ M_End:
+ mes "[Phracon Guy]";
+ mes "Good luck on finding some Phracon -";
+ close;
+}
+
+// Alchemy Guy Chemirre -----------------------------------------------------------
+aldebaran.gat,121,231,4 script Alchemy Guy Chemirre 740,{
+ mes "[Alchemy Guy Chemirre]";
+ mes "The Alchemist is one of the 2nd Job Classes and involves the creation of rare and valuable items from abundant materials.";
+M_Menu:
+ next;
+ menu "About Alchemy of Payon",-,"The concept behind Alchemy",M_1,". . . . .",M_2,"End Conversation",M_End;
+
+ mes "[Alchemy Guy Chemirre]";
+ mes "Payon Alchemy dates as far back as the Alchemy of Al De Baran and originates from Taoism.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "Just like the Alchemists of Al De Baran, the Alchemists of Payon were able to create gold out of various materials.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "However due Payon's environment and a lack of adequate reasources, Payon alchemy never excelled the way it did in Al De Baran.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "Therefore the Alchemist Guild in Al De Baran became the only Alchemy Research Organization in Rune-Midgard.";
+ goto M_Menu;
+
+ M_1:
+ mes "[Alchemy Guy Chemirre]";
+ mes "Alchemy involves chemical research, and the practice of creating useful items out of materials that are usually non valuable.";
+ goto M_Menu;
+ M_2:
+ mes "[Alchemy Guy Chemirre]";
+ mes "Let me tell you something that might be interesting to you. It's about monster cards and slots..";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "If you already posses a monster card then you've probably already heard this but.....";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "Each card has a specific type of equipment it can be placed on.";
+ mes "For instance, let's say you have a poring card.....";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "If you check the card's description, you will find that the Poring card increases its wearer's LUK by 1, and that it can be only inserted on 'Armor'.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "Something to take note of is the fact that armor purchased at an NPC shop may not have slots on them.";
+ mes "Armor dropped by monsters however, will usually have a high number of slots on them. They aren't dropped too often though.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "In order to use a card you must first unequip the piece of equipment you want to insert the card into.";
+ mes "Next find your card in your inventory window and double click it.";
+ next;
+ mes "[Alchemy Guy Chemirre]";
+ mes "A window will pop up showing you what equipment the card can be inserted in. Choose the one you want, and you're done.";
+ close;
+ M_End:
+ mes "[Alchemy Guy Chemirre]";
+ mes "Long live the Al De Baran Alchemy Guild!!";
+ close;
+
+}
+
+// Anastasia --------------------------------------------------------------
+aldebaran.gat,146,124,4 script Anastasia 101,{
+ mes "[Anastasia]";
+ mes "Somewhere in Rune-Midgard exists the^3355FF' Assassin Guild '^000000.";
+ next;
+ mes "[Anastasia]";
+ mes "It's a place that trains people in the art of assassinating someone without leaving behind the slightest trace.";
+ next;
+ mes "[Nastasia]";
+ mes "But... is that.... legal.....??";
+ emotion e_what;
+ next;
+ mes "[Nastasia]";
+ mes "And do they collect tuition....??";
+ next;
+ menu "Continue conversation.",-,"End Conversation.",M_End;
+
+ mes "[Nastasia]";
+ mes "Most flying monsters are very fast and have a high amount of agility.";
+ mes "Therefore, it's very difficult to hit them successfully.";
+ next;
+ mes "[Nastasia]";
+ mes "In order to fight against those kinds of monsters, you'll need a good amount of DEX.";
+ close;
+ M_End:
+ mes "[Nastasia]";
+ mes "Like the old saying goes, 'nothing in life is free'.";
+ close;
+}
+
+// Stromme ---------------------------------------------------------
+aldebaran.gat,159,242,4 script Stromme 119,{
+ mes "[Stromme]";
+ mes "When you spend some time in Mt. Mjolnir, you'll start to notice something.";
+ next;
+ mes "[Stromme]";
+ mes "The insects in Mt. Mjolnir are classified into different groups by their habits!";
+ next;
+ menu "About insects",-,"End conversation",M_End;
+
+ mes "[Stromme]";
+ mes "Honey Bees, Butterflies and Moths help transfer pollen between flowers by flying over and around them.";
+ next;
+ mes "[Stromme]";
+ mes "However that doesn't mean that you can take them lightly.";
+ mes "They have evolved into creatures that can defend themselves when attacked.";
+ next;
+ mes "[Stromme]";
+ mes "There are some insects which are aggressive, such as Praying Mantises, Spiders, and Centipedes etc.";
+ mes "These monsters are strong so you should be careful about approaching them.";
+ next;
+ mes "[Stromme]";
+ mes "Also watch out for a monster that looks like a leech!! One blow from it can prove to be fatal.";
+ next;
+ mes "[Stromme]";
+ mes "Luckily that leech thing has poor eye sight and won't notice you if you are far enough away from it.";
+ close;
+ M_End:
+ mes "[Stromme]";
+ mes "Don't even dare attack a ladybug haphazardly! Be respectful of mighty nature in Mt. Mjolnir.";
+ close;
+}
+
+// Joo Jahk ------------------------------------------------------
+aldebaran.gat,180,46,4 script Joo Jahk 88,{
+ mes "[Joo Jahk]";
+ mes "I am a tourist from Payon, the city within the forest. I noticed that it's very cool here... probably due to the waterways.";
+ next;
+ mes "[Joo Jahk]";
+ mes "But.... Do you think I could drink the water in these waterways?";
+ emotion e_hmm;
+ next;
+ mes "[Joo Jahk]";
+ mes "Actually I already did, but I am still concerned.....";
+ emotion e_swt;
+ next;
+ menu "Continue.",-,"End conversation.",M_End;
+
+ mes "[Joo Jahk]";
+ mes "I've been traveling around Rune-Midgard.";
+ next;
+ mes "[Joo Jahk]";
+ mes "On the way here, I heard about ^3355FFSpiritual Property Monsters^000000 from a really high level Magician";
+ mes "Apparently physical attacks and non-elemental magic attacks can't damage them.";
+ next;
+ mes "[Joo Jahk]";
+ mes "I hope this advice can come in handy for you.";
+ close;
+ M_End:
+ mes "[Joo Jahk]";
+ mes "The water here taste really fresh. It's probably well preserved. I don't think I'll have anything to worry about.";
+ close;
+}
+
+// Gavin -------------------------------------------------------------------
+aldebaran.gat,212,122,4 script Gavin 97,{
+ mes "Welcome! We, the towns people of Al De Baran, ALL welcome you . . . . .";
+ next;
+ mes "[Gavin]";
+ mes "Hmm... did I over-exaggerate? 'Towns people'...";
+ mes "Well... it is just myself, but hey! Still, I welcome you!";
+ next;
+ menu "Continue conversation.",-,"End conversation.",M_End;
+
+ mes "[Gavin]";
+ mes "Ah~ now I remember! I saw a very interesting monster just a few days ago.";
+ mes "I saw a Poring with the wings of an angel, somewhere in the Mjolnir Mountains surrounding Al De Baran.";
+ next;
+ mes "[Gavin]";
+ mes "I swear it!";
+ emotion e_gasp;
+ next;
+ mes "[Gavin]";
+ mes "It was jumping around with the other ordinary Porings. Angeling... is that what it was...?";
+ close;
+ M_End:
+ mes "[Gavin]";
+ mes "I welcome you to Al De Baran, a wonderful city of Canals surrounded by the Mjolnir Mountains.";
+ close;
+}
+
+
+// Giddy Fellow ------------------------------------------------------------------
+aldeba_in.gat,152,47,4 script Giddy Fellow 97,{
+ mes "[Giddy Fellow]";
+ mes "E..E..E..Emergenc----y!!! I CAN'T find my pet chicken anywhere!!";
+ emotion e_omg;
+ next;
+ menu "What's its name?",-,". . . . .",M_1;
+
+ mes "[Giddy Fellow]";
+ mes "It's 'The Great Picky ' ... SOB SOB SOB... gosh... what am I gonna do?!~ Please find my cutey for meee~~~";
+ emotion e_sob;
+ next;
+ menu "Dude! It's such a common name...",-,". . . . .",M_1;
+
+ mes "[Giddy Fellow]";
+ mes "Wha-What are you talking about!! My 'The Great Picky' is the one and only cutest chicken in this whole wide WORLD for Christ's sake~!";
+ emotion e_what;
+ close;
+ M_1:
+ mes "[Giddy Fellow]";
+ mes "Don't you laugh at me~! I don't have any siblings so my cute chicken is like a younger brother to me! SOB SOB SOB SOB";
+ emotion e_sob;
+ close;
+}
+
+// Master ----------------------------------------------------------
+aldeba_in.gat,156,179,4 script Master#02 61,{
+ mes "[Master]";
+ if(sex==0) mes "Oh hello. Don't mind me, I'm just a perverted old man.... la di da.......";
+ if(sex==0) close;
+ mes "Did you know that the Kafra Main Office is located here, in Aldebaran?";
+ next;
+ mes "[Master]";
+ mes "The young Kafra Ladies visit me from time to time. They are really delightful and fun to be around.";
+ next;
+ mes "[Master]";
+ mes "Alright! Time for a survey... this is to determine which Kafra you like best.";
+ next;
+ mes "[Master]";
+ mes "Choose the Kafra Lady that you think is HOT!!!";
+ next;
+ menu "Oh~it turns me on!!!!",-,"No way..I am not a pervert.",M_1;
+
+ mes "[Master]";
+ mes "Alright, here you go, your Favorite Ladies!!! Take a careful look!";
+ next;
+ mes "[Master]";
+ mes " - Kafra Number (1) ^3355FF'Pavianne'^000000 !!";
+ mes "The Original Kafra, the classic blue haired beauty!...";
+ mes " - Kafra Number (2) ^9A01BA'Blossom'^000000 !!";
+ mes "Her graceful ponytail takes men's breaths away! She's a favorite among young boys!!";
+ mes " - Kafra Number (3) ^0000FF'Jasmine'^000000 !!";
+ mes "Long, straight, silky hair is what gives her her charm. She is the Silk from the East ~! From Payon,....";
+ next;
+ mes "[Master]";
+ mes " - Kafra Number (4) ^FF8040'Roxie'^000000 !!";
+ mes "She has a cute tomboy look with short hair....";
+ mes " - Kafra Number (5) ^7A0DF2'Leilah'^000000 !!";
+ mes "She is intelligent and sophisticated. A pair of refined glasses fits her well....";
+ mes " - Kafra Number (6) ^EEC111'Curly Sue'^000000 !!";
+ mes "Pretty and cute. Although she looks young and immature, she's a very hard worker....";
+ next;
+ mes "[Master]";
+ mes "So who do you think?";
+ next;
+ menu "(1) Pavianne",-,"(2) Blossom",M_01,"(3) Jasmine",M_02,"(4) Roxie",M_03,"(5) Leilah",M_04,"(6) Curly Sue.",M_05;
+
+ mes "[Master]";
+ mes "Oh~ So you're reserved in nature, and therefore you are into a more traditional type of girl...";
+ next;
+ mes "[Master]";
+ mes "Well, I have to tell you.....";
+ next;
+ mes "[Master]";
+ mes "The world is all about change so face the facts and learn to accept new things!";
+ close;
+ M_01:
+ mes "[Master]";
+ mes "Wake up~! Do you really think you'd have a shot with a girl like that?? Be realistic! She's out of your league....";
+ emotion e_gasp;
+ close;
+ M_02:
+ mes "[Master]";
+ mes "Gentle, sexy, sweet, and beautiful.... a girl like Jasmine would have you wrapped around her finger in no time....";
+ close;
+ M_03:
+ mes "[Master]";
+ mes "You're over-zealous! If you were to get with a girl who's as exuberant as her...";
+ next;
+ mes "[Master]";
+ mes "You'd cause a LOT of trouble for the neighbors, if ya know what I mean.... Hahahaha!!";
+ emotion e_heh;
+ close;
+ M_04:
+ mes "[Master]";
+ mes "Into the cold, analytical type huh?... If you like being bossed around, then I guess Leilah's the girl for you....";
+ close;
+ M_05:
+ mes "[Master]";
+ mes "Wha-what!";
+ emotion e_gasp;
+ next;
+ mes "[Master]";
+ mes "A thirst for young girls~~! It's a c-c-crime!!!!";
+ emotion e_swt2;
+ close;
+ M_1:
+ mes "[Master]";
+ mes "Ah~~~!! I stayed up all night last night trying to make this wonderful survey~!!";
+ mes "And you just dissed me~ like thaaat~ I hate you.";
+ close;
+}
+
+// RS125 ------------------------------------------------------------------------
+aldeba_in.gat,234,241,4 script RS125 48,{
+ mes "[RS125]";
+ mes "Even if my first name is not human, and my manner of speech is not very eloquent, please don't be afraid of me.";
+ mes "I'm actually a warm hearted person.";
+ next;
+ mes "[RS125]";
+ mes "There is an artificial heart that beats loudly in my body.";
+ mes "Although people hate me because of it, I will still continue to function for the love of my home, Al De Baran.";
+ next;
+ menu "Oh you poor boy! Tell me more...",-, "The best of luck to ya!!",M_End;
+
+
+ mes "[RS125]";
+ mes ".... It was 3 years ago..... My big bro 996, was a highly regarded sprinter in Al De Baran.";
+ mes "People referred to him as 'Al De Baran's Peco Peco'. He was the fastest runner in the world......";
+ next;
+ mes "[RS125]";
+ mes "Every 4 years a special track meet called the 'Al De Baran Turbo Tracks', takes place here.";
+ mes "Many admirers from around the world came to see my brother. They gathered around him every chance they got.";
+ next;
+ mes "[RS125]";
+ mes "I was his manager at the time and even I became stressed out by the crowds of people.";
+ mes "I can only imagine how he felt about being so famous.";
+ next;
+ mes "[RS125]";
+ mes "Sadly there is no such thing as eternal fame and glory in this world. There was a girl from Payon who came take part in the event.";
+ mes "That year she was able to finally defeat my poor brother.";
+ next;
+ mes "[RS125]";
+ mes "After that humiliating defeat, he decided to train even harder and pushed himself to his limits.";
+ mes "But he pushed to hard and began to have serious heart problems. To this day he cannot move around without someone else's help.";
+ next;
+ mes "[RS125]";
+ mes "Now I am the future of Al De Baran athletics! I am a ray of hope for my brother!";
+ mes "Remember me, for I shall beat her, 'Havana', the breeze of Payon!";
+ close;
+ M_End:
+ mes "[RS125]";
+ mes "I've dreamed of making an around-the-world trip. It would be wonderful to truly experience the sea of Alberta!!";
+ mes "After the track championship next year, my brother and I are going to travel the whole world together.";
+ close;
+}
+
+// Nice Looking Guy ----------------------------------------------------------
+aldeba_in.gat,219,61,4 script Nice Looking Guy 109,{
+ mes "[Nice Looking Guy]";
+ mes "Forget about the doofus living next door.";
+ next;
+ mes "[Nice Looking Guy]";
+ mes "To tell you the truth, 2 years ago, he fell down from a tree in the Drill Field and since then his mind has been out of control.";
+ mes "I heard he was trying to pick some fruits from that tree.";
+ next;
+ mes "[Nice Looking Guy]";
+ mes "Anyway, he's constantly bugging me and I think I'm gonna be crazy because of him... Oh my goodness!";
+ close;
+}
+
+// Evil Looking Guy --------------------------------------------------------------
+aldeba_in.gat,223,121,2 script Evil looking Guy 63,{
+ mes "[Evil Looking Guy]";
+ mes "Hey dude! Don't you think it's rude for a stranger to enter someone else's house?";
+ emotion e_what;
+ next;
+ mes "[Evil Looking Guy]";
+ mes "Now I'm upset! What reason do you have to come in here and bother me??";
+ emotion e_pif;
+ next;
+ mes "[Evil Looking Guy]";
+ mes "Ah alright, alright. No more fooling around... you're here because I'm an NPC and you think I'm supposed to help you right?";
+ next;
+ menu "You got it.",-, "Nah... just messing around....",M_1;
+
+ mes "[Evil Looking Guy]";
+ mes "You! I'm not sure if you know this, but in this world there exists something called a Mercenary System.";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "What is this you ask? It's simple. You hire a Mercenary to fight battles for you. The more a Mercenary cost the better a fighter he/she is.";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "So how do you go about getting one?? It's easy, listen closely.....";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "First, check his/her nose. Yes, I said NOSE! A high quality Mercenary has a moist nose which is a sign of good health.";
+ mes "If it's possible, try touching the Mercenary's' nose. If it's dry, then there is no doubt that that Mercenary has caught a cold.";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "A good Mercenary should have slender ankles. Umm... in addition, he/she should have a snowy and skinny neck!";
+ mes "And if the Mercenary's' hair is long and curly, that's icing on the cake!!";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "Finally, a Mercenary is obligated to provide 100% customer assistance and support!!!";
+ next;
+ mes "[Evil Looking Guy]";
+ mes "Oh and don't forget to change a Mercenary's wet tissues as well!!";
+ close;
+ M_1:
+ mes "[Evil Looking Guy]";
+ mes "Whattt!!! Get the heck out of my house!! If you're a cop, show me a search warrant.";
+ mes "If you're a member of my family then pull down your pants so I can look at our family mark!";
+ emotion e_gasp;
+ close;
+}
+
+
+//<=================================================== Kafra Corp. Headquarters ==========================================================>\\
+// Kafra Jasmine -------------------------
+aldeba_in.gat,24,245,4 script Kafra Jasmine 115,{
+ cutin "kafra_03",2;
+ mes "[Kafra Jasmine]";
+ mes "Hi~ I am Kafra type Jasmine. Thank you for coming all the way to the Kafra Main Office here in Al De Baran!";
+ next;
+ mes "[Kafra Jasmine]";
+ mes "Our Kafra Service is always working with our customers!";
+ mes "Our Kafra Service has a history and legacy that is 5 thousand, 8 hundred years old...";
+ mes "Blah-blah-blah.....";
+ next;
+ menu "FIVE THOUSAND YEARS?!",-, "Ahh~ Shut Up!",M_1, "You got a boyfriend?",M_2;
+
+ mes "[Kafra Jasmine]";
+ mes "HEY! Just SHUT-UP and LISTEN! It took me a whole week to memorize this!";
+ mes "I've got a poor memory unlike the other Kafra agents!";
+ emotion e_an;
+ next;
+ mes "[Kafra Jasmine]";
+ mes "..... Eh!... heh... heh... um...";
+ emotion e_swt2;
+ next;
+ mes "[Kafra Jasmine]";
+ mes "I'm verrrryyy sorry about that... I didn't mean to startle you... you see....";
+ next;
+ mes "[Kafra Jasmine]";
+ mes "That... that... that was just an act.... YEAH! An act I put on for the customers. Heh.. heh....";
+ emotion e_swt;
+ cutin "",255;
+ close;
+ M_1:
+ mes "[Kafra Jasmine]";
+ mes ". . . . .";
+ emotion e_an;
+ next;
+ mes "[Kafra Jasmine]";
+ mes "Just so you know, I was a member of Kafra Garrison before I joined the Kafra Service Team.";
+ mes "My specialty was 'Bash'!! Now I'm trying to be more feminine and live a quieter life";
+ next;
+ mes "[Kafra Jasmine]";
+ mes "So please, DON'T TEMPT ME...!!";
+ emotion e_pif;
+ cutin "",255;
+ close;
+ M_2:
+ mes "[Kafra Jasmine]";
+ mes "I'm flattered but, Kafra Services has a ridiculous rule that no employee can have a boyfriend....";
+ next;
+ mes "[Kafra Jasmine]";
+ mes "Just kidding~~ Tehehe";
+ emotion e_heh;
+ cutin "",255;
+ close;
+}
+
+// Special Reserve ----------------------------------------------
+aldeba_in.gat,79,161,6 script Kafra#04 115,{
+ cutin "kafra_03",2;
+ mes "[Kafra]";
+ mes "Welcome, ^6666FF" + strcharinfo(0) + "^000000. This is where you can trade in your special reserve points for useful items and cool prizes.";
+ next;
+ mes "[Kafra]";
+ mes "Each Kafra will allow you to trade in reserve points of varying amounts. I can trade in reserve points starting from ^2222FF100 pts up to 3000 pts^000000.";
+ next;
+ mes "[Kafra]";
+ mes "The amount of special reserve points that you have is: ^FF0000"+RESRVPTS+"^000000 pts. Please make a choice based on your point total.";
+M_Menu:
+ next;
+ menu "100- Sweet Potato 7 ea",M_1a, "200- Sweet Potato 15 ea",M_1b, "300- Sweet Potato 25 ea",M_1c, "400- Sweet Potato 35 ea",M_1d,
+ "500- Sweet Potato 50 ea",M_1e, "600- Sweet Potato 60 ea",M_1f, "700- Sweet Potato 75 ea",M_1g, "800- Sweet Potato 85 ea",M_1h,
+ "900- Sweet Potato 100 ea",M_1i, "1000- 1st Lottery Chance!",M_1j, "Next items",M_2, "Cancel",M_End;
+
+ M_1a:
+ if(RESRVPTS < 100) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 7;
+ set RESRVPTS, RESRVPTS - 100;
+ close;
+ M_1b:
+ if(RESRVPTS < 200) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 15;
+ set RESRVPTS, RESRVPTS - 200;
+ close;
+ M_1c:
+ if(RESRVPTS < 300) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 25;
+ set RESRVPTS, RESRVPTS - 300;
+ close;
+ M_1d:
+ if(RESRVPTS < 400) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 35;
+ set RESRVPTS, RESRVPTS - 400;
+ close;
+ M_1e:
+ if(RESRVPTS < 500) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 50;
+ set RESRVPTS, RESRVPTS - 500;
+ close;
+ M_1f:
+ if(RESRVPTS < 600) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 60;
+ set RESRVPTS, RESRVPTS - 600;
+ close;
+ M_1g:
+ if(RESRVPTS < 700) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 75;
+ set RESRVPTS, RESRVPTS - 700;
+ close;
+ M_1h:
+ if(RESRVPTS < 800) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 85;
+ set RESRVPTS, RESRVPTS - 800;
+ close;
+ M_1i:
+ if(RESRVPTS < 900) goto sL_LowPts1;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 516, 100;
+ set RESRVPTS, RESRVPTS - 900;
+ close;
+ M_1j:
+ if(RESRVPTS < 1000) goto sL_LowPts1;
+ set RESRVPTS, RESRVPTS - 1000;
+ mes "[Kafra]";
+ mes "^0000FF1st Lottery Opportunity!!^000000";
+ set @Lotto, 1;
+ next;
+ callfunc "F_Lottery";
+ goto M_End;
+
+ sL_LowPts1:
+ mes "[Kafra]";
+ mes "I'm sorry but you do not have enough reserve points for that selection.";
+ goto M_Menu;
+
+ M_2:
+ menu "1100- Red Potion 7 ea",M_2a, "1300- Red Potion 15 ea",M_2b, "1500- Red Potion 25 ea",M_2c,
+ "1700- Red Potion 35 ea",M_2d, "1900- Red Potion 50 ea",M_2e, "2100- Red Potion 60 ea",M_2f,
+ "2300- Red Potion 75 ea",M_2g, "2500- Red Potion 85 ea",M_2h, "2800- Red Potion 100 ea",M_2i,
+ "3000- 2nd Lotery Chance!",M_2j, "Previous List",M_Menu, "Cancel",M_End;
+
+ M_2a:
+ if(RESRVPTS < 1100) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 7;
+ set RESRVPTS, RESRVPTS - 1100;
+ close;
+ M_2b:
+ if(RESRVPTS < 1300) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 15;
+ set RESRVPTS, RESRVPTS - 1300;
+ close;
+ M_2c:
+ if(RESRVPTS < 1500) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 25;
+ set RESRVPTS, RESRVPTS - 1500;
+ close;
+ M_2d:
+ if(RESRVPTS < 1700) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 35;
+ set RESRVPTS, RESRVPTS - 1700;
+ close;
+ M_2e:
+ if(RESRVPTS < 1900) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 50;
+ set RESRVPTS, RESRVPTS - 1900;
+ close;
+ M_2f:
+ if(RESRVPTS < 2100) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 60;
+ set RESRVPTS, RESRVPTS - 2100;
+ close;
+ M_2g:
+ if(RESRVPTS < 2300) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 75;
+ set RESRVPTS, RESRVPTS - 2300;
+ close;
+ M_2h:
+ if(RESRVPTS < 2500) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 85;
+ set RESRVPTS, RESRVPTS - 2500;
+ close;
+ M_2i:
+ if(RESRVPTS < 2800) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 501, 100;
+ set RESRVPTS, RESRVPTS - 2800;
+ close;
+ M_2j:
+ if(RESRVPTS < 3000) goto sL_LowPts2;
+ set RESRVPTS, RESRVPTS - 3000;
+ mes "[Kafra]";
+ mes "^0000FF2nd Lottery Opportunity!!^000000";
+ set @Lotto, 2;
+ next;
+ callfunc "F_Lottery";
+ goto M_End;
+
+ sL_LowPts2:
+ mes "[Kafra]";
+ mes "I'm sorry but you do not have enough reserve points for that selection.";
+ next;
+ goto M_2;
+
+ M_End:
+ mes "[Kafra]";
+ mes "Please come back anytime when you have more reserve points.";
+ cutin "",255;
+ close;
+}
+
+// Special Reserve 2 ----------------------------------------------
+aldeba_in.gat,88,161,3 script Kafra#05 115,{
+ cutin "kafra_03",2;
+ mes "[Kafra]";
+ mes "Welcome ^5577FF"+strcharinfo(0)+"^000000. We are currently having a special event for our customers.";
+ mes "You can get free gifts by using your ^FF5533special reserve points^000000 in the ^3355FFSpecial Kafra Gift Event^000000!!";
+ next;
+ mes "[Kafra]";
+ mes "Would you like to use your points?";
+ next;
+ menu "Yes I would.",-, "Maybe next time.",M_End;
+
+ mes "[Kafra]";
+ mes "You have the following amount of special reserve points: ^5544FF"+RESRVPTS+"^000000.";
+ mes "Make a choice and test your luck!";
+ next;
+ menu "5000pts = 1st Lottery Chance!",sM_1st, "7000pts = 2nd Lottery Chance!",sM_2nd, "10000pts = 3rd Lottery Chance!",sM_3rd, "Cancel",M_End;
+
+ sM_1st:
+ if(RESRVPTS < 5000) goto sL_NotEnuf;
+ set RESRVPTS, RESRVPTS - 5000;
+ set @Lotto, 3;
+ callfunc "F_Lottery";
+ goto M_End;
+ sM_2nd:
+ if(RESRVPTS < 7000) goto sL_NotEnuf;
+ set RESRVPTS, RESRVPTS - 7000;
+ set @Lotto, 4;
+ callfunc "F_Lottery";
+ goto M_End;
+ sM_3rd:
+ if(RESRVPTS < 10000) goto sL_NotEnuf;
+ set RESRVPTS, RESRVPTS - 10000;
+ set @Lotto, 5;
+ callfunc "F_Lottery";
+ goto M_End;
+
+ sL_NotEnuf:
+ mes "[Kafra]";
+ mes "I'm sorry dear but you do not have enough points for this selection.";
+ cutin "",255;
+ close;
+ M_End:
+ mes "[Kafra]";
+ mes "No problem. Collect more and more special reserve points by using the Kafra Services found throughout Rune Midgard.";
+ mes "Thank you for using Kafra Corp. services.";
+ cutin "",255;
+ close;
+}
+
+// Function F_Lottery ------------------------------------------------------------------------------------------
+function script F_Lottery {
+ mes "[Kafra]";
+ mes "You have the unique opportunity to win a prize sent down from the heavens themselves!!";
+ next;
+ mes "[Kafra]";
+ mes "Don't miss this one and only chance! Now dear, are you ready?";
+ next;
+ mes "[Kafra]";
+ mes "How many times do you want the Lottery Machine to spin? You can choose up to 5 times.";
+ next;
+ input @input;
+ if(@input < 1 || @input > 5) set @input, rand(1,5); //Lupus's fix
+ callsub sF_Spin;
+ mes "[Kafra]";
+ mes "Ok~ Let me check the results~ guess what it is?";
+ next;
+ mes "[Kafra]";
+ mes "^FF0000Lets see.... This is...!!^000000";
+ next;
+ if(@temp < 1) goto sL_Prize1;
+ if(@temp < 2) goto sL_Prize2;
+ if(@temp < 3) goto sL_Prize3;
+ if(@temp <= 4) goto sL_Prize4;
+ goto sL_Prize5;
+
+ sL_Prize1:
+ mes "[Kafra]";
+ mes "WOW!!!!..... You win!!! 1st Prize~! Congratulations~~ You got the 1st prize~~";
+ if(@Lotto == 1) getitem 2328,1;//Items: Wooden_Mail,
+ if(@Lotto == 2) getitem 2307,1;//Items: Mantle,
+ if(@Lotto == 3) getitem 657,10;//Items: Berserk_Potion,
+ if(@Lotto == 4) {
+ getitem 607,2;//Items: Yggdrasilberry,
+ getitem 608,1;//Items: Yggdrasil_Seed,
+ }
+ if(@Lotto == 5) getitem 607,3;//Items: Yggdrasilberry,
+ return;
+ sL_Prize2:
+ mes "[Kafra]";
+ mes "Oh! WOW! You've won the 2nd prize! Congratulations!!";
+ if(@Lotto == 1) getitem 2403,1;//Items: Shoes,
+ if(@Lotto == 2) getitem 2226,1;//Items: Cap,
+ if(@Lotto == 3) getitem 2201,1;//Items: Sunglasses,
+ if(@Lotto == 4) getitem 526,3;//Items: Royal_Jelly,
+ if(@Lotto == 5) {
+ getitem 608,1;//Items: Yggdrasil_Seed,
+ getitem 526,10;//Items: Royal_Jelly,
+ }
+ return;
+ sL_Prize3:
+ mes "[Kafra]";
+ mes "Congratulations! You've won the 3rd prize.";
+ if(@Lotto == 1) getitem 602,4;//Items: Butterfly_Wing,
+ if(@Lotto == 2) getitem 505,3;//Items: Blue_Potion,
+ if(@Lotto == 3) getitem 2203,1;//Items: Glasses,
+ if(@Lotto == 4) getitem 504,15;//Items: White_Potion,
+ if(@Lotto == 5) getitem 504,30;//Items: White_Potion,
+ return;
+ sL_Prize4:
+ mes "[Kafra]";
+ mes "You've won the 4th prize.";
+ if(@Lotto == 1) getitem 516,100;//Items: Sweet_Potato,
+ if(@Lotto == 2) getitem 501,150;//Items: Red_Potion,
+ if(@Lotto == 3) getitem 502,150;//Items: Orange_Potion,
+ if(@Lotto == 4) getitem 505,5;//Items: Blue_Potion,
+ if(@Lotto == 5) getitem 505,10;//Items: Blue_Potion,
+ return;
+ sL_Prize5:
+ mes "[Kafra]";
+ mes "You've won the 5th prize.";
+ if(@Lotto == 1) getitem 516,50;//Items: Sweet_Potato,
+ if(@Lotto == 2) getitem 501,100;//Items: Red_Potion,
+ if(@Lotto == 3) getitem 501,200;//Items: Red_Potion,
+ if(@Lotto == 4) getitem 501,250;//Items: Red_Potion,
+ if(@Lotto == 5) getitem 501,300;//Items: Red_Potion,
+ return;
+
+sF_Spin:
+ mes "[Lottery Machine]";
+ mes "Number of spins remaining: "+@input;
+ next;
+ mes "[Lottery Machine]";
+ mes "(rumble~rumble~rumble~)...";
+ next;
+ set @temp, rand(10);
+ set @input, @input -1;
+ if(@input <= 0) return;
+ goto sF_Spin;
+}
+
+
+// Kafra Pavianne -----------------------------
+aldeba_in.gat,81,166,4 script Kafra Pavianee 117,{
+ cutin "kafra_01",2;
+ mes "[Kafra Pavianne]";
+ mes "Welcome! I'm Pavianne,";
+ mes "one of the senior Kafra Employees.";
+ mes "The Kafra Corporation Service is";
+ mes "always trying to satisfy 100 % of";
+ mes "our customers' expectations.";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Due to a change in customer support";
+ mes "policy, we no longer accept Kafra";
+ mes "Passes. However, we are offering";
+ mes "refunds for our customers who still";
+ mes "possess these passes.";
+ next;
+ menu "Sell Kafra Pass",-,"Alright, bye~",M_BYE;
+
+ set usedKafPass,0; //clear unused global variable
+ mes "[Kafra Pavianne]";
+ if(!countitem(1084)){
+ mes "I'm sorry,";
+ mes "but you don't";
+ mes "have any Kafra Passes.";
+ emotion e_sry;
+ close2;
+ cutin "",255;
+ end;
+ }
+ mes "Let me see ... You have " + countitem(1084) + " Kafra Passes.";
+ mes "So, you will get " + (countitem(1084)*2000) + " zeny.";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Do you want to sell these?";
+ next;
+ if(select("Sell.:Nevermind.")==1){
+ mes "[Kafra Pavianne]";
+ set @t,countitem(1084);
+ if(!@t){
+ mes "Well, you DON'T have any >.<";
+ mes "I understand what you want to do but, I can't help you.";
+ emotion e_sry;
+ close2;
+ cutin "",255;
+ end;
+ }
+ delitem 1084,@t;
+ set Zeny,Zeny+@t*2000;
+ emotion e_thx;
+ mes "We already refunded all THE Kafra Passes that you had..";
+ mes "Thank you for using our service !";
+ mes "I am kafra Pavianne.";
+
+ }
+ close2;
+ cutin "",255;
+ end;
+ M_BYE:
+ mes "[Kafra Pavianne]";
+ mes "Thank you,";
+ mes "have a good day.";
+ emotion e_thx;
+ close2;
+ cutin "",255;
+ end;
+}
+
+// Kafra Blossom -----------------------------------
+aldeba_in.gat,83,244,4 script Kafra Blossom 116,{
+ cutin "kafra_02",2;
+ mes "[Kafra Blossom]";
+ mes "..... Pavianne is soooo old school! She's too stubborn is what it is...";
+ emotion e_pif;
+ next;
+ mes "[Kafra Blossom]";
+ mes "We should be trying to make our customers' experience more unique, with new and creative ideas...";
+ next;
+ mes "[Kafra Blossom]";
+ mes "Anyways... WEELLLLCOOMMME!!!~~ I am Kafra type ^3333ffBlossom^000000.";
+ mes "Please don't forget to continue using our Kafra Services, and ask for me, ^3333ffBlossom^000000!";
+ next;
+ menu "I'm an admirer of you~!",-,"Ehhaha",M_1;
+
+ mes "[Kafra Blossom]";
+ mes "Really! Thank you sooo much!! Here is... my... autograph...";
+ emotion e_thx;
+ next;
+ mes "[Kafra Blossom]";
+ mes "Don't bother to look in your Item Inventory for it. It won't be there... tehehe... for my autograph will remain within your heart.";
+ emotion e_ok;
+ cutin "",255;
+ close;
+ M_1:
+ mes "[Kafra Blossom]";
+ mes "Huh? . . . . . That's all? Phew~ such a dull customer...";
+ emotion e_what;
+ cutin "",255;
+ close;
+}
+
+// Kafra Curly Sue ---------------------------------
+aldeba_in.gat,91,244,4 script Kafra Curly Sue 112,{
+ cutin "kafra_06",2;
+ mes "[Kafra Curly Sue]";
+ mes "Hello, hello! I'm the youngest of all Kafra personnel, the Kafra cutey....";
+ next;
+ mes "[Kafra Curly Sue]";
+ mes "I am Kafra Type 'Curly Sue'!!";
+ next;
+ mes "[Kafra Curly Sue]";
+ mes "I'm rather new so haven't been on the job all that long, but I am always doing my best!!";
+ next;
+ menu "Uh... where is your mommy?",-,"End conversation",M_End;
+
+ mes "[Kafra Curly Sue]";
+ mes ".... Sob~sob~... WHAT?? I'm NOT some KID!!";
+ emotion e_sob;
+ next;
+ cutin "",255;
+ close;
+ M_End:
+ mes "[Kafra Curly Sue]";
+ mes "Here at Kafra Corp., we're all doing our B-E-S-T to provide our customers with the B-E-S-T service.";
+ mes "We really appreciate your doing business with us.";
+ next;
+ cutin "",255;
+ close;
+}
+
+// Kafra Roxie --------------------------------------
+aldeba_in.gat,148,244,4 script Kafra Roxie 114,{
+ cutin "kafra_04",2;
+ mes "[Kafra Roxie]";
+ mes "Welcome! I'm Kafra type 'Roxie'. Let me let you in on a special secret about the Kafras!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "You know... Our Kafra Service wasn't originally called Kafra.... Well what do you think it was?~";
+ next;
+ mes "[Kafra Roxie]";
+ mes "TaDa~ Surprisingly it was.... Ka....";
+ next;
+ mes "[Kafra Roxie]";
+ mes "(Ring Ring Ring) Oh... my phone... Sorry please wait...";
+ next;
+ mes "[Kafra Roxie]";
+ mes "Hi, Kafra Type Roxie here.... Huh! Director, sir!... Yes!... Yes!... I understand! ..... Sure!... Ah... Huh?!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "No-no sir!.... Yes I understand!!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "(*Click*) ..... Heh heh....";
+ next;
+ mes "[Kafra Roxie]";
+ mes "Uh... please ignore what I was talking about earlier. Hahaha.....heh...";
+ emotion e_swt;
+ cutin "",255;
+ close;
+}
+
+
+//<====================================================== Clock Tower ==============================================================>\\
+// Clock Keeper ---------------------------------------------------------------
+aldebaran.gat,143,136,4 script Clock Keeper 89,{
+ mes "[Clock Keeper]";
+ mes "Let me introduce myself, I am 'Monster A' of the Al De Baran Clock Tower, and the Committee of 'Heaven on Earth'.";
+ next;
+ mes "[Clock Keeper]";
+ mes "It looks like you have an interest in this tower?";
+ next;
+ menu "About the Clock Tower.",-,"About the Committee of 'Heaven on Earth'.",M_1,"Quit.",M_End;
+
+ mes "[Clock Keeper]";
+ mes "Each floor of this tower is connected through a device called a 'Warp'.";
+ mes "Most of these warps are standard warps but some of them are 'Random Warps'.";
+ next;
+ mes "[Clock Keeper]";
+ mes "You should be careful with 'Random Warps' because they will transport you to a random location.";
+ next;
+ mes "[Clock Keeper]";
+ mes "I know you wouldn't want to get separated from you friends while you're battling monsters.";
+ next;
+ mes "[Clock Keeper]";
+ mes "Random warps are shown as green dots on the Mini-Map so keep your eyes on the Mini-Map to avoid them.";
+ next;
+ mes "[Clock Keeper]";
+ mes "Have a good time with the clocks. Hehehehe.";
+ close;
+ M_1:
+ mes "[Clock Keeper]";
+ mes "Have you ever heard of the Committee of 'Heaven on Earth'?!";
+ next;
+ menu "Yup, I have",-,"What are they?",sM_1;
+
+ mes "[Clock Keeper]";
+ mes "Muhahahaha! Good, good! I'm so glad that our reputation has spread throughout Rune-Midgard.";
+ mes "What a great day to meet an adventurer like you! I would like to present this to you.....";
+ next;
+ mes "[Clock Keeper]";
+ mes "Hmmm... Where did I leave it...";
+ next;
+ mes "[Clock Keeper]";
+ mes "Oops... it seems that I left the present in the control room on the 4th floor of the tower.";
+ mes "I promise I will give it to you next time. See you later.";
+ close;
+ sM_1:
+ mes "[Clock Keeper]";
+ mes "What? I can't believe that there are still people who do not know about us!";
+ next;
+ mes "[Clock Keeper]";
+ mes "Our goal is to build a Heaven on Earth. Specifically here in AL De Baran. For starters, we built this clock tower.";
+ next;
+ mes "[Clock Keeper]";
+ mes "We even created the idea for Glast Helm a while back.";
+ mes "Look around and you will see many of our great achievements.";
+ close;
+ M_End:
+ close;
+}
+
+// Gatekeeper Riku -------------------------------------------------------------------
+c_tower3.gat,10,249,4 script Gatekeeper#01 84,{
+ mes "[Gatekeeper Riku]";
+ mes "Welcome to ";
+ mes "Kinase - Blue Gallino";
+ mes "the one of Local Speciality in Aldebaran.";
+ mes "However,from the 4th Floor of this Clock Tower,";
+ mes "You may not enter.";
+ mes "Please go back to where you're from.";
+ next;
+ menu "About Clock Tower",-,"About the 4th Floor",M_1,"Move to the 4th Floor",M_2,"End mesue",M_End;
+
+ mes "[Gatekeeper Riku]";
+ mes "Homeland of Alchemy, Aldebaran!";
+ mes "Long Time ago, there were";
+ mes "3 Legendary Alchemists...They are";
+ mes "Bruke Seimer,";
+ mes "Philip Warisez,";
+ mes "And..";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "Romero Specialre!";
+ mes "This venerable architecture is their masterpiece.";
+ mes "I assume you would feel something unusual";
+ mes "While on the way to this floor,";
+ mes "Every feature of This Clock tower ";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "Consists of Mysterious Ancient Magics.";
+ mes "If you just wander around here without any intention";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "By any means,";
+ mes "You will meet with a mishap";
+ mes "by Gatekeeper Creatures.";
+ mes "Please be careful ..";
+ close;
+ M_1:
+ mes "[Gatekeeper Riku]";
+ mes "Ancient Alchemists";
+ mes "Sealed the Gate of 4th Floor using an Alchemistic Device ";
+ mes "To keep something";
+ mes "From Evil Creatures and Human Enemies.";
+ mes "To go through this door";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "It needs a Key.";
+ mes "That Key has rumored to be possessed by Gatekeeper Creatures";
+ mes "Prowling around here.";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "The Key is the Intensiveness of Ancient Alchemy,";
+ mes "By hearsay When used once,";
+ mes "It will be released from being spelled";
+ mes "And be disappeared.";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "If that key comes into your possession, please show it to me.";
+ mes "The one who possesses the Key of Clock Tower";
+ mes "Will have access to go through this Gate with his own will!";
+ next;
+ mes "[Gatekeeper Riku]";
+ mes "I will give you a chance.";
+ mes ". . . . .";
+ close;
+ M_2:
+ mes "[Gatekeeper Riku]";
+ if(countitem(7026) < 1) goto L_Check_Key;
+ delitem 7026,1;
+ mes "Hmm! I already felt that you are not an Ordinary person,";
+ mes "Now it seems to be successful in Speculation.";
+ mes "Please, You may enter.";
+ mes "May God bless you ..";
+ next;
+ warp "c_tower4.gat",185,44;
+ close;
+
+ L_Check_Key:
+ mes ". . . . . .";
+ mes "Unfortunately you don't have a privilege";
+ mes "To enter this Gate ..";
+ mes "You won't be able to go through";
+ mes "As long as Ancient Alchemists";
+ mes " Don't approve you.";
+ close;
+ M_End:
+ mes "[Gatekeeper Riku]";
+ mes "This Clock Tower";
+ mes "Is the place where the 3 Ancient Legendary Alchemists";
+ mes "Have left their Spirits and Skills.";
+ mes "Please Do not Scribble or Damage on the Interior.";
+ close;
+}
+
+//<======================================== Al De Baran Dungeon ==========================================>\\
+alde_dun03.gat,264,16,4 script Gatekeeper#02 101,{
+ mes "[Gatekeeper Boy]";
+ mes "Welcome to";
+ mes "Kinase - Blue Gallino";
+ mes "The one of Local Speciality in Aldebaran.";
+ mes "You can't go through from B4th Floor,";
+ mes "Please go back.";
+ next;
+ menu "About Clock Tower",-,"About B4th Floor",M_1,"Move to the B4th Floor",M_2,"End mesue",M_End;
+
+ mes "[Gatekeeper Boy]";
+ mes "Homeland of Alchemy, Aldebaran!";
+ mes "Long Time ago, there were";
+ mes "3 Legendary Alchemists... They are";
+ mes "Bruke Seimer";
+ mes "Philip Warisez";
+ mes "And ..";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "Romero Specialre!";
+ mes "This venerable architecture is";
+ mes "their masterpiece.";
+ mes "I assume you would feel something unusual";
+ mes "While on the way to this floor,";
+ mes "Every feature of This Clock tower";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "Consists of Mysterious Ancient Magics.";
+ mes "If you just wander around here,";
+ mes " without any intention";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "By any means,";
+ mes "You will meet with a mishap";
+ mes "by Gatekeeper Creatures.";
+ mes "Please be careful ..";
+ close;
+ M_1:
+ mes "[Gatekeeper Boy]";
+ mes "Ancient Alchemists";
+ mes "Sealed the Gate of 4th Floor using an Alchemistic Device ";
+ mes "To keep something";
+ mes "From Evil Creatures and Human Enemies.";
+ mes "To go through this door";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "It needs a Key.";
+ mes "That Key has rumored to be possessed by Gatekeeper Creatures";
+ mes "Prowling around here.";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "The Key is the Intensiveness of Ancient Alchemy,";
+ mes "By hearsay When used once,";
+ mes "It will be released from being spelled";
+ mes "And be disappeared.";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "If that key comes into your possession, please show it to me.";
+ mes "The one who possesses the Key of Underground";
+ mes "Will have access to go through this Gate with his own will!";
+ next;
+ mes "[Gatekeeper Boy]";
+ mes "I will give you a chance.";
+ mes ". . . . .";
+ close;
+ M_2:
+ mes "[Gatekeeper Boy]";
+ if(countitem(7027) < 1) goto L_Check_Key;
+ delitem 7027,1;
+ mes "Hmm! I already felt that you are not an Ordinary person,";
+ mes "Now it seems to be successful in Speculation.";
+ mes "Please,You may enter.";
+ mes "May God bless you ..";
+ next;
+ warp "alde_dun04.gat",79,267;
+ close;
+
+ L_Check_Key:
+ mes ". . . . . .";
+ mes "Unfortunately you don't have a privilege";
+ mes "To enter this Gate ..";
+ mes "You won't be able to go through";
+ mes "As long as Ancient Alchemists";
+ mes " Don't grant you.";
+ close;
+ M_End:
+ mes "[Gatekeeper Boy]";
+ mes "This Clock Tower";
+ mes "Is the place where the 3 Ancient Legendary Alchemists";
+ mes "Has left their Spirits and Skills.";
+ mes "Please Do not Scribble or Damage on the Interior.";
+ close;
+}
diff --git a/npc/cities/amatsu.txt b/npc/cities/amatsu.txt
index a4542edc3..fd30868f6 100644
--- a/npc/cities/amatsu.txt
+++ b/npc/cities/amatsu.txt
@@ -1,939 +1,939 @@
-//===== eAthena Script =======================================
-//= Amatsu Script
-//===== By: ==================================================
-//= Some people & eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Version; Niflheim Required
-//===== Description: =========================================
-//= Amatsu Town NPCs : Revision 2 (Fox quest fix)
-//= Translated by Makenshi and dj
-//= Revisions and edits by Valaris and Darkchild
-//= 1.01 event_sushi -> ama_sushi fixed
-//= and other fixes, thanks to Shinomori
-//= 1.02 Fixed & Spell Checked [massdriller]
-//= 1.03 Fixed 2 NPC names, slight optimization [Lupus]
-//= 1.04 Fixed a few typo's [Nexon]
-//= 1.05 Changed all breaks to ends. [Skotlex]
-//= 1.06 The Captain now uses iRO dialog [MasterOfMuppets]
-//= 1.07 Implemented a missing NPC [MasterOfMuppets]
-//= 1.08 Removed Duplicates [Silent]
-//= 1.1 Split quests into quests/quests_amatsu.txt [Evera]
-//= 1.2 Fixed missing name [Evera]
-//=====================================================================
-alberta.gat,245,93,4 script Sea Captain#01 709,{
- mes "[Walter Moers]";
- mes "Hey, there.";
- mes "Have you ever heard that there";
- mes "are totally different countries";
- mes "than the Rune-Midgard Kingdom?";
- next;
- menu "About Amatsu...",L1,"Go to Amatsu",L2,"Cancel",-;
- mes "[Walter Moers]";
- mes "If you are tired of your daily";
- mes "life, take a trip to a distant";
- mes "country across the ocean.";
- mes "Someplace like, oh I don't know,";
- mes "Amatsu~";
- close;
- L1:
- mes "[Walter Moers]";
- mes "I heard that a drifting ship";
- mes "accidently discovered it...";
- mes "The ship was totally destroyed";
- mes "by a raging storm in heavy fog.";
- next;
- mes "[Walter Moers]";
- mes "Anyway, the ship was wrecked";
- mes "on the beach. It was there";
- mes "he arrived at a town called";
- mes "Amatsu.";
- next;
- mes "[Walter Moers]";
- mes "The towners took pity on him";
- mes "and took care of this wounds.";
- mes "He lived there until he finished";
- mes "making a map.";
- next;
- mes "[Walter Moers]";
- mes "He passed away when he returned";
- mes "to Rune-Midgard. Fortunately,";
- mes "the map was given to our king,";
- mes "Tristan III";
- next;
- mes "[Walter Moers]";
- mes "King Tristan III announced";
- mes "that he would reward any";
- mes "person brave enough to venture to";
- mes "Amatsu, and spread copies of this";
- mes "map.";
- next;
- mes "[Walter Moers]";
- mes "Many Brave and adventurous";
- mes "sea captains took the";
- mes "challenge. Great fortune could";
- mes "be made in trade with Amatsu, as";
- mes "well as the rewards from King";
- mes "Tristan III";
- next;
- mes "[Walter Moers]";
- mes "However, they all failed!";
- mes "To overcome various currents";
- mes "and bad weather, lots of";
- mes "experience is required. But they";
- mes "were all blinded by their greed...";
- next;
- mes "[Walter Moers]";
- mes "Finally, a great man discovered";
- mes "the perfect sealane to Amatsu...";
- mes "Right! That is me. Sir Walter";
- mes "Moers. I started the trade with";
- mes "Amatsu! Hahaha! Well, that's all";
- mes "about Amatsu.";
- next;
- mes "[Walter Moers]";
- mes "I made good money from trades";
- mes "for years, and now I'm interested";
- mes "in tourism. If you want to go to";
- mes "Amatsu, let me know~!";
- close;
- L2:
- mes "[Walter Moers]";
- mes "Oh yeah? It's a long way to";
- mes "Amatsu. That's why we are";
- mes "charging a fare. You don't think";
- mes "that crossing oceans and currents";
- mes "is easy, do you?";
- next;
- mes "[Walter Moers]";
- mes "10,000 zeny for a round-trip! I've";
- mes "got a stately room in a sturdy and";
- mes "safe trade ship for you. It is a";
- mes "reasonable fare when you consider";
- mes "that this isn't a one way trip.";
- next;
- mes "[Walter Moers]";
- mes "Shall we go now? You didn't forget";
- mes "the fare, right? Let's go.";
- next;
- menu "Yes",Lgo,"No",-;
- mes "[Walter Moers]";
- mes "If you are an adventurer,";
- mes "this is a great chance";
- mes "to experience a different";
- mes "culture...Well, it is up to you.";
- close;
- Lgo:
- if (Zeny < 10000) goto Lzeny;
- set Zeny, Zeny-10000;
- mes "[Walter Moers]";
- mes "Alright, I will start the engine!";
- close2;
- warp "amatsu",197,83;
- end;
- Lzeny:
- mes "[Walter Moers]";
- mes "Did you forget what I said?";
- mes "10,000 zeny. If you can't come up with enough zeny,";
- mes "hunt around the Sunken Ship,";
- mes "and hope for some luck hunting treasure...";
- mes "and get enough zeny";
- close;
-}
-//=====================================================================
-amatsu.gat,194,79,4 script Sea Captain#02 709,{
- mes "[Walter Moers]";
- mes "You came... Did you enjoy";
- mes "your trip to Amatsu...?";
- mes "Alright, I will take you";
- mes "back to Alberta.";
- next;
- menu "Back to Alberta",L1,"Cancel",-;
- mes "[Walter Moers]";
- mes "Well, take your time.";
- mes "The ship to Alberta is";
- mes "always ready to depart...";
- close;
- L1:
- mes "[Walter Moers]";
- mes "Let's go then. You must have";
- mes "so many things to talk about,";
- mes "right? All aboard now.";
- close2;
- warp "alberta",243,91;
- end;
-}
-//=====================================================================
-// Amatsu Citizen
-//=====================================================================
-amatsu.gat,179,107,4 script John 86,{
- mes "[John]";
- mes "Hey.";
- mes "You seem like me,";
- mes "not a native of Amatsu";
- next;
- mes "[John]";
- mes "I have been here";
- mes "doing business for almost 5 years";
- next;
- mes "Even during the first time ";
- mes "the kingdom of Rune-Midgard";
- mes "traded with Amatsu.";
- mes "I thought of the 'Lucky Bum'!";
- next;
- mes "[John]";
- mes "I want to start something";
- mes "unique that the others won't do.";
- next;
- mes "[John]";
- mes "So I decided";
- mes "to come to Amatsu";
- mes "and learn how to make the food here,";
- mes "then return home";
- mes "so everyone can enjoy the exotic food.";
- next;
- mes "[John]";
- mes "But in the end";
- mes "I became attached to this place.";
- mes "Even after 5 years";
- mes "I am still here";
- next;
- mes "[John]";
- mes "Anyhow, from then on I just stayed here.";
- mes "Just chat and gossip with the villagers,";
- mes "and relax";
- next;
- mes "[John]";
- mes "Some time ago a famous sushi chef";
- mes "lived across the street, and ever since";
- mes "I have only seen flies around my place.";
- next;
- mes "[John]";
- mes "In this life, my happiness in life";
- mes "has been found here already.";
- mes "Now it seems like it is about to end as well.";
- close;
-}
-//=====================================================================
-amatsu.gat,185,116,4 script Drunken Man 765,{
- mes "[Ralph]";
- mes "Cough. I'm old and useless.";
- mes "Only brute strength. Cough.";
- mes "This time I really cough won't go back home. Cough.";
- next;
- menu "Please stop drinking and go home.",L1,"Let's get wasted!",L2;
-L2:
- mes "[Ralph]";
- mes "Hahaha! A good young man.";
- mes "Cough, but but, cough";
- mes "I can't give you my drink, cough.";
- next;
- mes "[Ralph]";
- mes "If you want to buy me a drink, I'll think about it.";
- mes "Haha! Cough.";
- close;
-L1:
- mes "[Ralph]";
- mes "What?!";
- mes "You want me to be like my wife, to be beaten by iron fists?";
- mes "Cough. You won't know it until you see it";
- mes "When she was young,";
- mes "she wrestled and caught tigers.";
- next;
- mes "[Ralph]";
- mes "I was in Co..Comudo whatever town it was.";
- mes "I just lost a little, and he";
- mes "beat me up like that. Cough.";
- next;
- mes "[Ralph]";
- mes "Lacking life.";
- mes "What the hell are zeny??";
- mes "Cough.. Cough..";
- mes "...........................";
- mes "........Cough..............";
- close;
-}
-//=====================================================================
-amatsu.gat,217,179,0 script Old Women 760,{
- mes "[Hashey]";
- mes "My husband is so into gambling, it worries me to death.";
- mes "Went to that town that's really far away, lost a lot of zeny again.";
- mes "Come back..";
- next;
- mes "[Hahsey]";
- mes "Because I was angry, I got irrational again.";
- mes "Don't know if he's drinking at home again.";
- mes "What a miser.. sobs.";
- close;
-}
-//=====================================================================
-amatsu.gat,205,163,4 script Mimi 759,{
- mes "[Mimi]";
- mes "Phew..";
- mes "Did you see the Ms. Amatsu besides the dock?";
- mes "Very pretty, no?";
- next;
- mes "[Mimi]";
- mes "When I grow up I also want to enter the competition.";
- next;
- mes "[Mimi]";
- mes "Although I look like this, I am still the most beautiful woman in town..";
- mes "Women always need to watch their appearance, whoohoohoohooo.";
- close;
-}
-//=====================================================================
-amatsu.gat,230,160,4 script Lady 757,{
- mes "[Yorukoc]";
- mes "Although I come to the well for water everyday,";
- mes "if it's misty or rainy,";
- mes "I will not come out here.";
- next;
- mes "[Yoruko]";
- mes "Seems like deep within the well,";
- mes "someone is trying to";
- mes "climb up on the wall of the well.";
- mes "It gives me goosebumps.";
- close;
-}
-//=====================================================================
-amatsu.gat,119,164,4 script Guard Soldier#03 767,{
- mes "[Guard Soldier]";
- mes "Are you from Rune-Midgard?";
- mes "Welcome to the town of Amatsu.";
- mes "After entering the city,";
- mes "please pay a visit to the Master of Amatsu";
- mes "before leaving!";
- next;
- mes "[Guard Soldier]";
- mes "He is a really great guy.";
- mes "He did a lot of investments for the town";
- mes "from all over the other continents.";
- mes "He handles all sorts of things.";
- close;
-}
-//=====================================================================
-amatsu.gat,112,164,4 script Guard Soldier#04 767,{
- mes "[Guard Soldier]";
- mes "This is the best castle in Amatsu,";
- mes "called the East Lake Castle.";
- mes "Normally people are not permitted";
- mes "to come in and out.";
- next;
- mes "[Guard Soldier]";
- mes "From your clothes, it looks like you are from another continent.";
- mes "In the past, the Master specifically";
- mes "permitted the travelers to come in and out.";
- mes "Now you may go in.";
- close;
-}
-
-//=====================================================================
-ama_in02.gat,207,40,6 script Guard Soldier#05 767,{
- mes "[Guard Soldier]";
- mes "Welcome,";
- mes "The Master specifically allowed";
- mes "the guests from the continent to enter and leave.";
- next;
- mes "[Guard Soldier]";
- mes "When you are have visited everywhere, please rest here";
- mes "before leaving.";
- close;
-}
-//=====================================================================
-ama_in02.gat,207,49,6 script Guard Soldier#06 767,{
- mes "[Guard Soldier]";
- mes "The master is really a great guy.";
- mes "Who would have thought that anyone could";
- mes "turn this small town into what it is today?";
- next;
- mes "[Guard Soldier]";
- mes "He even accepted worthless trash like me.";
- mes "I am really grateful.";
- mes "But I don't know what has happened recently.";
- mes "His expressions";
- mes "look different from before.";
- close;
-}
-//=====================================================================
-ama_in02.gat,187,57,2 script Soldier#01 767,{
- mes "[Ichiro]";
- mes "Welcome, our master";
- mes "has already prepared a place";
- mes "for the guests to retire in.";
- next;
- mes "[Ichiro]";
- mes "If you have any needs,";
- mes "please contact us, and ";
- mes "just thank our master later.";
- mes "All of these preparations";
- mes "were ordered by the Master.";
- close;
-}
-//=====================================================================
-ama_in02.gat,37,157,4 script Soldier#03 767,{
- mes "[Sbarro]";
- mes "This is our soldier's";
- mes "training ground.";
- mes "Feel free to take a look around...";
- next;
- mes "[Sbarro]";
- mes "But recently there's a strange atmosphere.";
- mes "The solders aren't as lively as before.";
- mes "How to describe it? Also seem depressed.";
- mes "And some soldiers have gone missing...";
- mes "Maybe they moved to other continents.";
- next;
- mes "[Sbarro]";
- mes "And I also frequently see strange people.";
- mes "I've heard that the customers upstairs are";
- mes "from far away, but because of their";
- mes "auspicious behaviors. I already command the soldiers";
- mes "to monitor their movements...";
- next;
- mes "[Sbarro]";
- mes "Of course, the master must have his own thoughts";
- mes "and base his decisions on those.";
- mes "Haha, it seems like I'm speaking too much.";
- mes "See you later...";
- close;
-}
-//=====================================================================
-ama_in02.gat,32,51,6 script Shiro 767,{
- mes "[Shiro]";
- mes "Cough cough, cough cough, what... leave me alone";
- mes "Go visit another place...";
- mes "Cough cough, cough cough... ouch, my throat";
- next;
- mes "[Shiro]";
- mes "That fraud doctor's medicine";
- mes "did not work at all!";
- mes "Shouldn't trust those people from the continent...";
- mes "Cough cough, cough cough...";
- next;
- mes "[Shiro]";
- mes "What the hell?!? My body is getting weaker and weaker...";
- mes "No energy at all... Is";
- mes "a flu really this bad?";
- mes "Cough cough... cough cough...";
- close;
-}
-//=====================================================================
-ama_in02.gat,40,167,3 script Soldier#04 767,{
- mes "[Kuro]";
- mes "Shh... customer, please be quiet.";
- mes "I will tell you a story";
- next;
- mes "[Kuro]";
- mes "In Amatsu there is this rumor.";
- mes "The truth is the current master";
- mes "is not the real master of the town... shh, quiet!";
- mes "Don't panic, please continue to listen.";
- next;
- mes "[Kuro]";
- mes "Behind this benign Master,";
- mes "there is a real master,";
- mes "scheming all kinds of plots,";
- mes "using the current master as a puppet,";
- mes "hidden in some corner";
- mes "controlling everything that happens in the town.";
- next;
- mes "[KurO]";
- mes "Doubt me?,";
- mes "It's real! I saw it,";
- mes "the other master's face";
- mes "watching the town across";
- mes "the river with an evil smile!!";
- mes "But what I have said today";
- mes "is a secret, ok?";
- close;
-}
-//=====================================================================
-ama_in02.gat,32,167,5 script Kukuro 767,{
- mes "[Kukuro]";
- mes "That guy is always rambling";
- mes "some gibberish, saying that our master";
- mes "might be a farce.";
- mes "Not funny at all";
- next;
- mes "[Kukuro]";
- mes "Although, it is true";
- mes "that some strange";
- mes "events happened recently,";
- mes "right now the interior of";
- mes "the castle is still off limits...";
- next;
- mes "[Kukuro]";
- mes "Occasionally you can also hear";
- mes "a really scary sound. I don't know";
- mes "what's wrong with his mother,";
- mes "and many doctors have already visited.";
- mes "Doesn't seem to be much hope...";
- close;
-}
-//=====================================================================
-ama_in02.gat,42,34,2 script Soldier#05 767,{
- mes "[Hakiro]";
- mes "Rest for a while before leaving,";
- mes "master has already prepared";
- mes "a few empty room for the visitors.";
- next;
- mes "[Hakiro]";
- mes "If there are any questions,";
- mes "come to me at any time.";
- mes "And, please do not disturb";
- mes "the other visitors...";
- next;
- mes "[Hakiro]";
- mes "Then, good day to you";
- close;
-}
-
-//=====================================================================
-ama_in02.gat,203,156,4 script Soldier#06 767,{
- mes "[Hakiro]";
- mes "Master is in there.";
- mes "If you want to go greet him,";
- mes "silently walk in and talk to him";
- next;
- mes "[Hakiro]";
- mes "Master is not in a good mood right now.";
- mes "Don't do or say anything insulting.";
- mes "Normally, he will happily see visitors.";
- mes "Don't know what happened today.....";
- close;
-}
-
-//=====================================================================
-ama_in02.gat,195,156,4 script Soldier#07 767,{
- mes "[Kuro]";
- mes "Damn, maybe the master";
- mes "is having a hard time right now.";
- mes "Usually he's a very nice guy...";
- next;
- mes "[Kuro]";
- mes "There are strange rumors going around,";
- mes "but I still trust my master,";
- mes "because he was the one who";
- mes "transformed our town. So I became";
- mes "a soldier to serve him";
- close;
-}
-
-ama_in01.gat,169,173,0 script Miko 769,{
- mes "[Tokari]";
- mes "I'm not a real shrine maiden.";
- mes "my friend, Takikuwi told me to try on";
- mes "this cloth... and he brought me";
- mes "to this shrine";
- next;
- mes "[Tokari]";
- mes "Although he asks for weird shit sometimes";
- mes "he is still a funny friend!";
- mes "Sometimes I don't know what he's thinking";
- mes "but He is still a good friend";
- next;
- mes "[Tokari]";
- mes "If you have any questions";
- mes "go ask Takihuwi first";
- mes "even stuff that now one knows";
- mes "no matter how weird or strange";
- mes "He knows... He always does!";
- close;
-}
-
-amatsu.gat,269,221,1 script Proposing Girl 758,{
- mes "[Hutari Sioko]";
- mes "Nice to meet you";
- mes "my name is Hutari Sioko,";
- mes "my hobby is listening to music,";
- mes "and I usually listen to classical music";
- next;
- mes "[Hutari Sioko]";
- mes "There is a legend";
- mes "about the large hill in our town";
- mes "do you know anything about it?";
- next;
- mes "[Hutari Sioko]";
- mes "According to the legend, if you propose";
- mes "to your lover under that tree";
- mes "the couple will live happily ever forever";
- next;
- mes "[Hutari Sioko]";
- mes "But the proposal cannot be done on any time";
- mes "it has to be on the Saturday Night.";
- mes "or else it won't hold true";
- next;
- mes "[Hutari Sioko]";
- mes "Furthermore, the proposal has to be answered";
- mes "prior to Sunday night after";
- next;
- emotion e_lv;
- mes "[Hutari Sioko]";
- mes "If you have a secret admirer...";
- mes "why not meet under that tree";
- mes "and propose?";
- mes "I bet something good will happen";
- close;
-}
-
-amatsu.gat,287,266,3 script Jyaburo 766,{
- mes "[Jyaburo]";
- mes "This is a special place";
- mes "for my wife and me";
- next;
- mes "[Jyaburo]";
- mes "..When I was here proposing";
- mes "to her here under the tree..";
- mes "I didn't know that she";
- mes "liked me as well";
- next;
- mes "[Jyaburo]";
- mes "After that, we talked a lot here under this tree,";
- mes "this is the ideal location";
- mes "because of its tranquility and harmony,";
- mes "an everlasting moment of happiness";
- next;
- mes "[Jyaburo]";
- mes "Even now, when I close my eye, I can clearly remember";
- mes "the sweet memories of the past";
- mes "as if it happened yesterday...";
- next;
- mes "[Jyaburo]";
- mes "Even though she passed away some times ago";
- mes " I always come here alone now,";
- mes "Every time I come here it is as if my wife is just besides me,";
- mes "And my depressed and broken heart is gone";
- next;
- mes "[Jyaburo]";
- mes "After hearing my rambling,";
- mes "Can you think of anyone?";
- mes "If you can, stop the hesitation and the delay,";
- mes "And love her with all your heart";
- next;
- mes "[Jyakuro]";
- mes "What does it mean to be human?";
- mes "Smile, and live your life to the fullest";
- mes "Even though life might be sure,";
- mes "Forget the worries and pains";
- mes "Always try to live a happy life";
- close;
-}
-
-amatsu.gat,274,178,0 script Vet 735,{
- mes "[Sakura Seiichi]";
- mes "Oww... I'm not a suspicious guy,";
- mes "please don't be surprised, I am just";
- mes "A regular vet,";
- mes "making a living but";
- mes "curing sick animals";
- next;
- mes "[Sakura Seiichi]";
- mes "But... Did you know?";
- mes "about the sakura tree on the hill";
- mes "and its story... Maybe this is the";
- mes "first time you've heard?!";
- next;
- mes "[Sakura Seiichi]";
- mes "The reason that tree can maintain";
- mes "its everlasting youth and beauty";
- mes "lies within its secret...";
- mes "that is... Because below the tree";
- mes "dead people are buried...";
- next;
- menu "Can buried people feel the pain?",-,"Speaking of bullshit...",L2;
-
- mes "[Sakura Seiichi]";
- mes "... Maybe...";
- mes "Anyway, do you believe me or not";
- mes "want to make a bet...?";
- next;
- emotion e_dots;
- mes "[Sakura Seiichi]";
- mes "What if I...";
- mes "............";
- mes "............";
- next;
- mes "^6633FFHer laugh gradually fades^000000";
- mes "^6633FFAway in the wind,^000000";
- mes "^6633FFUntil nothing can be heard any more,^000000";
- mes "^6633FFCannot even remember what^000000";
- mes "^6633FFHe was about to say...^000000";
- close;
-L2:
- mes "[Sakura Seiichi]";
- mes "So entranced, I suppose you are all right...";
- mes "be careful, one day that kind of things";
- mes "Will happen to you as well..";
- next;
- emotion e_dots;
- mes "[Sakura Seiichi]";
- mes "Hahaha... Hahahaha.....";
- mes "...............";
- mes "...........";
- next;
- mes "^6633FFHer laugh gradually fades^000000";
- mes "^6633FFAway in the wind,^000000";
- mes "^6633FFUntil nothing can be heard any more,^000000";
- mes "^6633FFI don't understand why she told^000000";
- mes "^6633FFMe that...^000000";
- close;
-}
-
-amatsu.gat,283,203,1 script PokePoke 738,{
- emotion e_swt2;
- mes "[Pokepoke]";
- mes "The tree on this hill";
- mes "has existed for a long time, a deep-rooted";
- mes "and ever-blooming Sakura Tree King";
- next;
- emotion e_swt2;
- mes "[Pokepoke]";
- mes "And I am very thankful of this tree,";
- mes "whenever I feel any sorrow or sadness";
- mes "I always go sit under that tree";
- next;
- emotion e_swt2;
- mes "[Pokepoke]";
- mes "That way no matter what happened";
- mes "I can forget it all....";
- mes "this tree will sooth us";
- mes "and make us forget sad things";
- mes "a magic tree";
- next;
- emotion e_swt2;
- mes "[Pokepoke]";
- mes "If you feel any sadness or sorrow";
- mes "you can try to sit under this tree";
- mes "a really magical and thankful tree...";
- close;
-}
-
-amatsu.gat,261,197,4 script Legendary Sakura Tree 111,{
- mes "^0000FFJust as she said";
- mes "this tree is famous because";
- mes "many couples confessed their love here";
- mes "Sometimes you can still see a few people";
- mes "Drawing a heart with the lover's";
- mes "Name within it.^000000";
- next;
- mes "^0000FFThey are not only here for lover's confessions,";
- mes "sometimes they will meet here too";
- mes "talk about some important matters,";
- mes "in such a beautiful place";
- mes "no matter what they are discussing";
- mes "they always reach an agreement^000000";
- close;
-}
-
-ama_in02.gat,61,27,6 script Alchemist#amatsu 749,{
-
- mes "[Laspuchin Gregory]";
- mes "KeekeekeeKeheheh.";
- mes "This is amazing!";
- mes "The results are extraordinary!!";
- next;
- mes "[Laspuchin Gregory]";
- mes "Using my skills in this distant";
- mes "land was unexpected...";
- mes "Keheheh... The lord of this";
- mes "palace was quite accomodating.";
- next;
- mes "[Laspuchin Gregory]";
- mes "Ooops, I better be careful...";
- mes "If the guild finds out my";
- mes "location, stupid Myster will";
- mes "get mad at me. Kehehehkeh...";
- next;
- mes "[Laspuchin Gregory]";
- mes "What? Wanna say something?";
- mes "If you are here for tourism,";
- mes "enjoy your day off, then go back to";
- mes "your hometown. Keekeekee...";
- mes "Or else, I will let you taste my";
- mes "bottle...!";
- next;
- menu "Please, excuse me",-,"Do you need help?",s_Help;
-
- mes "[Laspuchin Gregory]";
- mes "Keheheh... Did you hear";
- mes "what I said? It would be";
- mes "better to forget...";
- mes "Keekeekeekeekee...";
- close;
-
-s_Help:
- mes "[Laspuchin Gregory]";
- mes "Help, eh?...";
- mes "Now that I think about it..";
- mes "I need some items right now...";
- mes "Keeheeheekeehee...";
- next;
- mes "[Laspuchin Gregory]";
- mes "Sir Laspuchin needs some";
- mes "enchant stones for an experiment.";
- mes "I will use it efficiently...";
- mes "Do you have them now?";
- next;
- menu "Nope",-,"I got some",s_Got;
-
- mes "[Laspuchin Gregory]";
- mes "Then, find 8 stones of one kind.";
- mes "If you bring 8 of one kind of";
- mes "enchant stones, I will change it";
- mes "to a better one...";
- next;
- mes "[Laspuchin Gregory]";
- mes "Then, find 8 stones of one kind.";
- mes "not the round gemstones but";
- mes "the enchant stones. If you bring";
- mes "the wrong stones, I will throw";
- mes "a flame bottle at you!";
- next;
- mes "[Laspuchin Gregory]";
- mes "Bring me stones, slave~!!";
- mes "And keep your promise!";
- mes "Kehehehkehkeh...";
- close;
-
-s_Got:
- mes "[Laspuchin Gregory]";
- mes "Uh-uh, what did you bring?";
- next;
- switch( select( "Mystic Frozen", "Great Nature", "Flame Heart", "Rough Wind" ) )
- {
-
- case 1:
- set @stoneID,995;
- set @stoneStr$,"Mystic Frozen";
- break;
-
- case 2:
- set @stoneID,997;
- set @stoneStr$,"Great Nature";
- break;
-
- case 3:
- set @stoneID,994;
- set @stoneStr$,"Flame Heart";
- break;
-
- case 4:
- set @stoneID,996;
- set @stoneStr$,"Rough Wind";
- break;
-
- }
- if(countitem(@stoneID) < 8)goto s_NEnough;
- mes "[Laspuchin Gregory]";
- mes "Kehekeh. I see you brought";
- mes "enough stones! What kind of";
- mes "stone do you want me to change";
- mes "them into? Kehehehe.";
- next;
- if(@stoneID == 995)menu "Great Nature",s_Great,"Flame Heart",s_Flame,"Rough Wind",s_Rough;
- if(@stoneID == 996)menu "Great Nature",s_Great,"Flame Heart",s_Flame,"Mystic Frozen",s_Frozen;
- if(@stoneID == 997)menu "Mystic Frozen",s_Frozen,"Flame Heart",s_Flame,"Rough Wind",s_Rough;
- if(@stoneID == 994)menu "Great Nature",s_Great,"Mystic Frozen",s_Frozen,"Rough Wind",s_Rough;
-
-s_Great:
- mes "[Laspuchin Gregory]";
- mes "Then I will now change";
- mes "your " + @stoneStr$ + "s into";
- mes "a Great Nature... Kehehe~";
- mes "Any objections?";
- next;
- menu "No",-,"Yes",s_No;
- delitem @stoneID,8;
- getitem 997,1;
- mes "[Laspuchin Gregory]";
- mes "Kehehe... It was a success!";
- mes "Come back anytime if you";
- mes "want me to change your";
- mes "enchanted stones into";
- mes "another kind.. Keheh~";
- close;
-
-s_Flame:
- mes "[Laspuchin Gregory]";
- mes "Then I will now change";
- mes "your " + @stoneStr$ + "s into";
- mes "a Flame Heart... Kehehe~";
- mes "Any objections?";
- next;
- menu "No",-,"Yes",s_No;
- delitem @stoneID,8;
- getitem 994,1;
- mes "[Laspuchin Gregory]";
- mes "Kehehe... It was a success!";
- mes "Come back anytime if you";
- mes "want me to change your";
- mes "enchanted stones into";
- mes "another kind.. Keheh~";
- close;
-
-s_Rough:
- mes "[Laspuchin Gregory]";
- mes "Then I will now change";
- mes "your " + @stoneStr$ + "s into";
- mes "a Rough Wind... Kehehe~";
- mes "Any objections?";
- next;
- menu "No",-,"Yes",s_No;
- delitem @stoneID,8;
- getitem 996,1;
- mes "[Laspuchin Gregory]";
- mes "Kehehe... It was a success!";
- mes "Come back anytime if you";
- mes "want me to change your";
- mes "enchanted stones into";
- mes "another kind.. Keheh~";
- close;
-
-s_Frozen:
- mes "[Laspuchin Gregory]";
- mes "Then I will now change";
- mes "your " + @stoneStr$ + "s into";
- mes "a Mystic Frozen... Kehehe~";
- mes "Any objections?";
- next;
- menu "No",-,"Yes",s_No;
- delitem @stoneID,8;
- getitem 995,1;
- mes "[Laspuchin Gregory]";
- mes "Kehehe... It was a success!";
- mes "Come back anytime if you";
- mes "want me to change your";
- mes "enchanted stones into";
- mes "another kind.. Keheh~";
- close;
-
-s_No:
- mes "[Laspuchin Gregory]";
- mes "Keheh~ You make me want";
- mes "to throw flame bottles";
- mes "at you. Kehehehehe...";
- mes "KEHEHEHEHEHEHE!";
- close;
-
-s_NEnough:
- mes "[Laspuchin Gregory]";
- mes "Keheheh~ Check your pockets";
- mes "before you tell me";
- mes "how foolish you are.....";
- next;
- mes "[Laspuchin Gregory]";
- mes "Bring me stones! You said you";
- mes "were going to help me!";
- mes "Keep your promises!";
- mes "Kehehehkehkeh...";
- close;
-
-}
-
-//| Ninja map portion dummy npcs, commented by default.
-//que_ng.gat,27,18,3 script Seaman 709,{end;}
-//que_ng.gat,28,45,3 script Man 86,{end;}
-//que_ng.gat,28,50,3 script Seaman2 709,{end;}
-//que_ng.gat,22,62,3 script Seaman2 709,{end;}
+//===== eAthena Script =======================================
+//= Amatsu Script
+//===== By: ==================================================
+//= Some people & eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Version; Niflheim Required
+//===== Description: =========================================
+//= Amatsu Town NPCs : Revision 2 (Fox quest fix)
+//= Translated by Makenshi and dj
+//= Revisions and edits by Valaris and Darkchild
+//= 1.01 event_sushi -> ama_sushi fixed
+//= and other fixes, thanks to Shinomori
+//= 1.02 Fixed & Spell Checked [massdriller]
+//= 1.03 Fixed 2 NPC names, slight optimization [Lupus]
+//= 1.04 Fixed a few typo's [Nexon]
+//= 1.05 Changed all breaks to ends. [Skotlex]
+//= 1.06 The Captain now uses iRO dialog [MasterOfMuppets]
+//= 1.07 Implemented a missing NPC [MasterOfMuppets]
+//= 1.08 Removed Duplicates [Silent]
+//= 1.1 Split quests into quests/quests_amatsu.txt [Evera]
+//= 1.2 Fixed missing name [Evera]
+//=====================================================================
+alberta.gat,245,93,4 script Sea Captain#01 709,{
+ mes "[Walter Moers]";
+ mes "Hey, there.";
+ mes "Have you ever heard that there";
+ mes "are totally different countries";
+ mes "than the Rune-Midgard Kingdom?";
+ next;
+ menu "About Amatsu...",L1,"Go to Amatsu",L2,"Cancel",-;
+ mes "[Walter Moers]";
+ mes "If you are tired of your daily";
+ mes "life, take a trip to a distant";
+ mes "country across the ocean.";
+ mes "Someplace like, oh I don't know,";
+ mes "Amatsu~";
+ close;
+ L1:
+ mes "[Walter Moers]";
+ mes "I heard that a drifting ship";
+ mes "accidently discovered it...";
+ mes "The ship was totally destroyed";
+ mes "by a raging storm in heavy fog.";
+ next;
+ mes "[Walter Moers]";
+ mes "Anyway, the ship was wrecked";
+ mes "on the beach. It was there";
+ mes "he arrived at a town called";
+ mes "Amatsu.";
+ next;
+ mes "[Walter Moers]";
+ mes "The towners took pity on him";
+ mes "and took care of this wounds.";
+ mes "He lived there until he finished";
+ mes "making a map.";
+ next;
+ mes "[Walter Moers]";
+ mes "He passed away when he returned";
+ mes "to Rune-Midgard. Fortunately,";
+ mes "the map was given to our king,";
+ mes "Tristan III";
+ next;
+ mes "[Walter Moers]";
+ mes "King Tristan III announced";
+ mes "that he would reward any";
+ mes "person brave enough to venture to";
+ mes "Amatsu, and spread copies of this";
+ mes "map.";
+ next;
+ mes "[Walter Moers]";
+ mes "Many Brave and adventurous";
+ mes "sea captains took the";
+ mes "challenge. Great fortune could";
+ mes "be made in trade with Amatsu, as";
+ mes "well as the rewards from King";
+ mes "Tristan III";
+ next;
+ mes "[Walter Moers]";
+ mes "However, they all failed!";
+ mes "To overcome various currents";
+ mes "and bad weather, lots of";
+ mes "experience is required. But they";
+ mes "were all blinded by their greed...";
+ next;
+ mes "[Walter Moers]";
+ mes "Finally, a great man discovered";
+ mes "the perfect sealane to Amatsu...";
+ mes "Right! That is me. Sir Walter";
+ mes "Moers. I started the trade with";
+ mes "Amatsu! Hahaha! Well, that's all";
+ mes "about Amatsu.";
+ next;
+ mes "[Walter Moers]";
+ mes "I made good money from trades";
+ mes "for years, and now I'm interested";
+ mes "in tourism. If you want to go to";
+ mes "Amatsu, let me know~!";
+ close;
+ L2:
+ mes "[Walter Moers]";
+ mes "Oh yeah? It's a long way to";
+ mes "Amatsu. That's why we are";
+ mes "charging a fare. You don't think";
+ mes "that crossing oceans and currents";
+ mes "is easy, do you?";
+ next;
+ mes "[Walter Moers]";
+ mes "10,000 zeny for a round-trip! I've";
+ mes "got a stately room in a sturdy and";
+ mes "safe trade ship for you. It is a";
+ mes "reasonable fare when you consider";
+ mes "that this isn't a one way trip.";
+ next;
+ mes "[Walter Moers]";
+ mes "Shall we go now? You didn't forget";
+ mes "the fare, right? Let's go.";
+ next;
+ menu "Yes",Lgo,"No",-;
+ mes "[Walter Moers]";
+ mes "If you are an adventurer,";
+ mes "this is a great chance";
+ mes "to experience a different";
+ mes "culture...Well, it is up to you.";
+ close;
+ Lgo:
+ if (Zeny < 10000) goto Lzeny;
+ set Zeny, Zeny-10000;
+ mes "[Walter Moers]";
+ mes "Alright, I will start the engine!";
+ close2;
+ warp "amatsu",197,83;
+ end;
+ Lzeny:
+ mes "[Walter Moers]";
+ mes "Did you forget what I said?";
+ mes "10,000 zeny. If you can't come up with enough zeny,";
+ mes "hunt around the Sunken Ship,";
+ mes "and hope for some luck hunting treasure...";
+ mes "and get enough zeny";
+ close;
+}
+//=====================================================================
+amatsu.gat,194,79,4 script Sea Captain#02 709,{
+ mes "[Walter Moers]";
+ mes "You came... Did you enjoy";
+ mes "your trip to Amatsu...?";
+ mes "Alright, I will take you";
+ mes "back to Alberta.";
+ next;
+ menu "Back to Alberta",L1,"Cancel",-;
+ mes "[Walter Moers]";
+ mes "Well, take your time.";
+ mes "The ship to Alberta is";
+ mes "always ready to depart...";
+ close;
+ L1:
+ mes "[Walter Moers]";
+ mes "Let's go then. You must have";
+ mes "so many things to talk about,";
+ mes "right? All aboard now.";
+ close2;
+ warp "alberta",243,91;
+ end;
+}
+//=====================================================================
+// Amatsu Citizen
+//=====================================================================
+amatsu.gat,179,107,4 script John 86,{
+ mes "[John]";
+ mes "Hey.";
+ mes "You seem like me,";
+ mes "not a native of Amatsu";
+ next;
+ mes "[John]";
+ mes "I have been here";
+ mes "doing business for almost 5 years";
+ next;
+ mes "Even during the first time ";
+ mes "the kingdom of Rune-Midgard";
+ mes "traded with Amatsu.";
+ mes "I thought of the 'Lucky Bum'!";
+ next;
+ mes "[John]";
+ mes "I want to start something";
+ mes "unique that the others won't do.";
+ next;
+ mes "[John]";
+ mes "So I decided";
+ mes "to come to Amatsu";
+ mes "and learn how to make the food here,";
+ mes "then return home";
+ mes "so everyone can enjoy the exotic food.";
+ next;
+ mes "[John]";
+ mes "But in the end";
+ mes "I became attached to this place.";
+ mes "Even after 5 years";
+ mes "I am still here";
+ next;
+ mes "[John]";
+ mes "Anyhow, from then on I just stayed here.";
+ mes "Just chat and gossip with the villagers,";
+ mes "and relax";
+ next;
+ mes "[John]";
+ mes "Some time ago a famous sushi chef";
+ mes "lived across the street, and ever since";
+ mes "I have only seen flies around my place.";
+ next;
+ mes "[John]";
+ mes "In this life, my happiness in life";
+ mes "has been found here already.";
+ mes "Now it seems like it is about to end as well.";
+ close;
+}
+//=====================================================================
+amatsu.gat,185,116,4 script Drunken Man 765,{
+ mes "[Ralph]";
+ mes "Cough. I'm old and useless.";
+ mes "Only brute strength. Cough.";
+ mes "This time I really cough won't go back home. Cough.";
+ next;
+ menu "Please stop drinking and go home.",L1,"Let's get wasted!",L2;
+L2:
+ mes "[Ralph]";
+ mes "Hahaha! A good young man.";
+ mes "Cough, but but, cough";
+ mes "I can't give you my drink, cough.";
+ next;
+ mes "[Ralph]";
+ mes "If you want to buy me a drink, I'll think about it.";
+ mes "Haha! Cough.";
+ close;
+L1:
+ mes "[Ralph]";
+ mes "What?!";
+ mes "You want me to be like my wife, to be beaten by iron fists?";
+ mes "Cough. You won't know it until you see it";
+ mes "When she was young,";
+ mes "she wrestled and caught tigers.";
+ next;
+ mes "[Ralph]";
+ mes "I was in Co..Comudo whatever town it was.";
+ mes "I just lost a little, and he";
+ mes "beat me up like that. Cough.";
+ next;
+ mes "[Ralph]";
+ mes "Lacking life.";
+ mes "What the hell are zeny??";
+ mes "Cough.. Cough..";
+ mes "...........................";
+ mes "........Cough..............";
+ close;
+}
+//=====================================================================
+amatsu.gat,217,179,0 script Old Women 760,{
+ mes "[Hashey]";
+ mes "My husband is so into gambling, it worries me to death.";
+ mes "Went to that town that's really far away, lost a lot of zeny again.";
+ mes "Come back..";
+ next;
+ mes "[Hahsey]";
+ mes "Because I was angry, I got irrational again.";
+ mes "Don't know if he's drinking at home again.";
+ mes "What a miser.. sobs.";
+ close;
+}
+//=====================================================================
+amatsu.gat,205,163,4 script Mimi 759,{
+ mes "[Mimi]";
+ mes "Phew..";
+ mes "Did you see the Ms. Amatsu besides the dock?";
+ mes "Very pretty, no?";
+ next;
+ mes "[Mimi]";
+ mes "When I grow up I also want to enter the competition.";
+ next;
+ mes "[Mimi]";
+ mes "Although I look like this, I am still the most beautiful woman in town..";
+ mes "Women always need to watch their appearance, whoohoohoohooo.";
+ close;
+}
+//=====================================================================
+amatsu.gat,230,160,4 script Lady 757,{
+ mes "[Yorukoc]";
+ mes "Although I come to the well for water everyday,";
+ mes "if it's misty or rainy,";
+ mes "I will not come out here.";
+ next;
+ mes "[Yoruko]";
+ mes "Seems like deep within the well,";
+ mes "someone is trying to";
+ mes "climb up on the wall of the well.";
+ mes "It gives me goosebumps.";
+ close;
+}
+//=====================================================================
+amatsu.gat,119,164,4 script Guard Soldier#03 767,{
+ mes "[Guard Soldier]";
+ mes "Are you from Rune-Midgard?";
+ mes "Welcome to the town of Amatsu.";
+ mes "After entering the city,";
+ mes "please pay a visit to the Master of Amatsu";
+ mes "before leaving!";
+ next;
+ mes "[Guard Soldier]";
+ mes "He is a really great guy.";
+ mes "He did a lot of investments for the town";
+ mes "from all over the other continents.";
+ mes "He handles all sorts of things.";
+ close;
+}
+//=====================================================================
+amatsu.gat,112,164,4 script Guard Soldier#04 767,{
+ mes "[Guard Soldier]";
+ mes "This is the best castle in Amatsu,";
+ mes "called the East Lake Castle.";
+ mes "Normally people are not permitted";
+ mes "to come in and out.";
+ next;
+ mes "[Guard Soldier]";
+ mes "From your clothes, it looks like you are from another continent.";
+ mes "In the past, the Master specifically";
+ mes "permitted the travelers to come in and out.";
+ mes "Now you may go in.";
+ close;
+}
+
+//=====================================================================
+ama_in02.gat,207,40,6 script Guard Soldier#05 767,{
+ mes "[Guard Soldier]";
+ mes "Welcome,";
+ mes "The Master specifically allowed";
+ mes "the guests from the continent to enter and leave.";
+ next;
+ mes "[Guard Soldier]";
+ mes "When you are have visited everywhere, please rest here";
+ mes "before leaving.";
+ close;
+}
+//=====================================================================
+ama_in02.gat,207,49,6 script Guard Soldier#06 767,{
+ mes "[Guard Soldier]";
+ mes "The master is really a great guy.";
+ mes "Who would have thought that anyone could";
+ mes "turn this small town into what it is today?";
+ next;
+ mes "[Guard Soldier]";
+ mes "He even accepted worthless trash like me.";
+ mes "I am really grateful.";
+ mes "But I don't know what has happened recently.";
+ mes "His expressions";
+ mes "look different from before.";
+ close;
+}
+//=====================================================================
+ama_in02.gat,187,57,2 script Soldier#01 767,{
+ mes "[Ichiro]";
+ mes "Welcome, our master";
+ mes "has already prepared a place";
+ mes "for the guests to retire in.";
+ next;
+ mes "[Ichiro]";
+ mes "If you have any needs,";
+ mes "please contact us, and ";
+ mes "just thank our master later.";
+ mes "All of these preparations";
+ mes "were ordered by the Master.";
+ close;
+}
+//=====================================================================
+ama_in02.gat,37,157,4 script Soldier#03 767,{
+ mes "[Sbarro]";
+ mes "This is our soldier's";
+ mes "training ground.";
+ mes "Feel free to take a look around...";
+ next;
+ mes "[Sbarro]";
+ mes "But recently there's a strange atmosphere.";
+ mes "The solders aren't as lively as before.";
+ mes "How to describe it? Also seem depressed.";
+ mes "And some soldiers have gone missing...";
+ mes "Maybe they moved to other continents.";
+ next;
+ mes "[Sbarro]";
+ mes "And I also frequently see strange people.";
+ mes "I've heard that the customers upstairs are";
+ mes "from far away, but because of their";
+ mes "auspicious behaviors. I already command the soldiers";
+ mes "to monitor their movements...";
+ next;
+ mes "[Sbarro]";
+ mes "Of course, the master must have his own thoughts";
+ mes "and base his decisions on those.";
+ mes "Haha, it seems like I'm speaking too much.";
+ mes "See you later...";
+ close;
+}
+//=====================================================================
+ama_in02.gat,32,51,6 script Shiro 767,{
+ mes "[Shiro]";
+ mes "Cough cough, cough cough, what... leave me alone";
+ mes "Go visit another place...";
+ mes "Cough cough, cough cough... ouch, my throat";
+ next;
+ mes "[Shiro]";
+ mes "That fraud doctor's medicine";
+ mes "did not work at all!";
+ mes "Shouldn't trust those people from the continent...";
+ mes "Cough cough, cough cough...";
+ next;
+ mes "[Shiro]";
+ mes "What the hell?!? My body is getting weaker and weaker...";
+ mes "No energy at all... Is";
+ mes "a flu really this bad?";
+ mes "Cough cough... cough cough...";
+ close;
+}
+//=====================================================================
+ama_in02.gat,40,167,3 script Soldier#04 767,{
+ mes "[Kuro]";
+ mes "Shh... customer, please be quiet.";
+ mes "I will tell you a story";
+ next;
+ mes "[Kuro]";
+ mes "In Amatsu there is this rumor.";
+ mes "The truth is the current master";
+ mes "is not the real master of the town... shh, quiet!";
+ mes "Don't panic, please continue to listen.";
+ next;
+ mes "[Kuro]";
+ mes "Behind this benign Master,";
+ mes "there is a real master,";
+ mes "scheming all kinds of plots,";
+ mes "using the current master as a puppet,";
+ mes "hidden in some corner";
+ mes "controlling everything that happens in the town.";
+ next;
+ mes "[KurO]";
+ mes "Doubt me?,";
+ mes "It's real! I saw it,";
+ mes "the other master's face";
+ mes "watching the town across";
+ mes "the river with an evil smile!!";
+ mes "But what I have said today";
+ mes "is a secret, ok?";
+ close;
+}
+//=====================================================================
+ama_in02.gat,32,167,5 script Kukuro 767,{
+ mes "[Kukuro]";
+ mes "That guy is always rambling";
+ mes "some gibberish, saying that our master";
+ mes "might be a farce.";
+ mes "Not funny at all";
+ next;
+ mes "[Kukuro]";
+ mes "Although, it is true";
+ mes "that some strange";
+ mes "events happened recently,";
+ mes "right now the interior of";
+ mes "the castle is still off limits...";
+ next;
+ mes "[Kukuro]";
+ mes "Occasionally you can also hear";
+ mes "a really scary sound. I don't know";
+ mes "what's wrong with his mother,";
+ mes "and many doctors have already visited.";
+ mes "Doesn't seem to be much hope...";
+ close;
+}
+//=====================================================================
+ama_in02.gat,42,34,2 script Soldier#05 767,{
+ mes "[Hakiro]";
+ mes "Rest for a while before leaving,";
+ mes "master has already prepared";
+ mes "a few empty room for the visitors.";
+ next;
+ mes "[Hakiro]";
+ mes "If there are any questions,";
+ mes "come to me at any time.";
+ mes "And, please do not disturb";
+ mes "the other visitors...";
+ next;
+ mes "[Hakiro]";
+ mes "Then, good day to you";
+ close;
+}
+
+//=====================================================================
+ama_in02.gat,203,156,4 script Soldier#06 767,{
+ mes "[Hakiro]";
+ mes "Master is in there.";
+ mes "If you want to go greet him,";
+ mes "silently walk in and talk to him";
+ next;
+ mes "[Hakiro]";
+ mes "Master is not in a good mood right now.";
+ mes "Don't do or say anything insulting.";
+ mes "Normally, he will happily see visitors.";
+ mes "Don't know what happened today.....";
+ close;
+}
+
+//=====================================================================
+ama_in02.gat,195,156,4 script Soldier#07 767,{
+ mes "[Kuro]";
+ mes "Damn, maybe the master";
+ mes "is having a hard time right now.";
+ mes "Usually he's a very nice guy...";
+ next;
+ mes "[Kuro]";
+ mes "There are strange rumors going around,";
+ mes "but I still trust my master,";
+ mes "because he was the one who";
+ mes "transformed our town. So I became";
+ mes "a soldier to serve him";
+ close;
+}
+
+ama_in01.gat,169,173,0 script Miko 769,{
+ mes "[Tokari]";
+ mes "I'm not a real shrine maiden.";
+ mes "my friend, Takikuwi told me to try on";
+ mes "this cloth... and he brought me";
+ mes "to this shrine";
+ next;
+ mes "[Tokari]";
+ mes "Although he asks for weird shit sometimes";
+ mes "he is still a funny friend!";
+ mes "Sometimes I don't know what he's thinking";
+ mes "but He is still a good friend";
+ next;
+ mes "[Tokari]";
+ mes "If you have any questions";
+ mes "go ask Takihuwi first";
+ mes "even stuff that now one knows";
+ mes "no matter how weird or strange";
+ mes "He knows... He always does!";
+ close;
+}
+
+amatsu.gat,269,221,1 script Proposing Girl 758,{
+ mes "[Hutari Sioko]";
+ mes "Nice to meet you";
+ mes "my name is Hutari Sioko,";
+ mes "my hobby is listening to music,";
+ mes "and I usually listen to classical music";
+ next;
+ mes "[Hutari Sioko]";
+ mes "There is a legend";
+ mes "about the large hill in our town";
+ mes "do you know anything about it?";
+ next;
+ mes "[Hutari Sioko]";
+ mes "According to the legend, if you propose";
+ mes "to your lover under that tree";
+ mes "the couple will live happily ever forever";
+ next;
+ mes "[Hutari Sioko]";
+ mes "But the proposal cannot be done on any time";
+ mes "it has to be on the Saturday Night.";
+ mes "or else it won't hold true";
+ next;
+ mes "[Hutari Sioko]";
+ mes "Furthermore, the proposal has to be answered";
+ mes "prior to Sunday night after";
+ next;
+ emotion e_lv;
+ mes "[Hutari Sioko]";
+ mes "If you have a secret admirer...";
+ mes "why not meet under that tree";
+ mes "and propose?";
+ mes "I bet something good will happen";
+ close;
+}
+
+amatsu.gat,287,266,3 script Jyaburo 766,{
+ mes "[Jyaburo]";
+ mes "This is a special place";
+ mes "for my wife and me";
+ next;
+ mes "[Jyaburo]";
+ mes "..When I was here proposing";
+ mes "to her here under the tree..";
+ mes "I didn't know that she";
+ mes "liked me as well";
+ next;
+ mes "[Jyaburo]";
+ mes "After that, we talked a lot here under this tree,";
+ mes "this is the ideal location";
+ mes "because of its tranquility and harmony,";
+ mes "an everlasting moment of happiness";
+ next;
+ mes "[Jyaburo]";
+ mes "Even now, when I close my eye, I can clearly remember";
+ mes "the sweet memories of the past";
+ mes "as if it happened yesterday...";
+ next;
+ mes "[Jyaburo]";
+ mes "Even though she passed away some times ago";
+ mes " I always come here alone now,";
+ mes "Every time I come here it is as if my wife is just besides me,";
+ mes "And my depressed and broken heart is gone";
+ next;
+ mes "[Jyaburo]";
+ mes "After hearing my rambling,";
+ mes "Can you think of anyone?";
+ mes "If you can, stop the hesitation and the delay,";
+ mes "And love her with all your heart";
+ next;
+ mes "[Jyakuro]";
+ mes "What does it mean to be human?";
+ mes "Smile, and live your life to the fullest";
+ mes "Even though life might be sure,";
+ mes "Forget the worries and pains";
+ mes "Always try to live a happy life";
+ close;
+}
+
+amatsu.gat,274,178,0 script Vet 735,{
+ mes "[Sakura Seiichi]";
+ mes "Oww... I'm not a suspicious guy,";
+ mes "please don't be surprised, I am just";
+ mes "A regular vet,";
+ mes "making a living but";
+ mes "curing sick animals";
+ next;
+ mes "[Sakura Seiichi]";
+ mes "But... Did you know?";
+ mes "about the sakura tree on the hill";
+ mes "and its story... Maybe this is the";
+ mes "first time you've heard?!";
+ next;
+ mes "[Sakura Seiichi]";
+ mes "The reason that tree can maintain";
+ mes "its everlasting youth and beauty";
+ mes "lies within its secret...";
+ mes "that is... Because below the tree";
+ mes "dead people are buried...";
+ next;
+ menu "Can buried people feel the pain?",-,"Speaking of bullshit...",L2;
+
+ mes "[Sakura Seiichi]";
+ mes "... Maybe...";
+ mes "Anyway, do you believe me or not";
+ mes "want to make a bet...?";
+ next;
+ emotion e_dots;
+ mes "[Sakura Seiichi]";
+ mes "What if I...";
+ mes "............";
+ mes "............";
+ next;
+ mes "^6633FFHer laugh gradually fades^000000";
+ mes "^6633FFAway in the wind,^000000";
+ mes "^6633FFUntil nothing can be heard any more,^000000";
+ mes "^6633FFCannot even remember what^000000";
+ mes "^6633FFHe was about to say...^000000";
+ close;
+L2:
+ mes "[Sakura Seiichi]";
+ mes "So entranced, I suppose you are all right...";
+ mes "be careful, one day that kind of things";
+ mes "Will happen to you as well..";
+ next;
+ emotion e_dots;
+ mes "[Sakura Seiichi]";
+ mes "Hahaha... Hahahaha.....";
+ mes "...............";
+ mes "...........";
+ next;
+ mes "^6633FFHer laugh gradually fades^000000";
+ mes "^6633FFAway in the wind,^000000";
+ mes "^6633FFUntil nothing can be heard any more,^000000";
+ mes "^6633FFI don't understand why she told^000000";
+ mes "^6633FFMe that...^000000";
+ close;
+}
+
+amatsu.gat,283,203,1 script PokePoke 738,{
+ emotion e_swt2;
+ mes "[Pokepoke]";
+ mes "The tree on this hill";
+ mes "has existed for a long time, a deep-rooted";
+ mes "and ever-blooming Sakura Tree King";
+ next;
+ emotion e_swt2;
+ mes "[Pokepoke]";
+ mes "And I am very thankful of this tree,";
+ mes "whenever I feel any sorrow or sadness";
+ mes "I always go sit under that tree";
+ next;
+ emotion e_swt2;
+ mes "[Pokepoke]";
+ mes "That way no matter what happened";
+ mes "I can forget it all....";
+ mes "this tree will sooth us";
+ mes "and make us forget sad things";
+ mes "a magic tree";
+ next;
+ emotion e_swt2;
+ mes "[Pokepoke]";
+ mes "If you feel any sadness or sorrow";
+ mes "you can try to sit under this tree";
+ mes "a really magical and thankful tree...";
+ close;
+}
+
+amatsu.gat,261,197,4 script Legendary Sakura Tree 111,{
+ mes "^0000FFJust as she said";
+ mes "this tree is famous because";
+ mes "many couples confessed their love here";
+ mes "Sometimes you can still see a few people";
+ mes "Drawing a heart with the lover's";
+ mes "Name within it.^000000";
+ next;
+ mes "^0000FFThey are not only here for lover's confessions,";
+ mes "sometimes they will meet here too";
+ mes "talk about some important matters,";
+ mes "in such a beautiful place";
+ mes "no matter what they are discussing";
+ mes "they always reach an agreement^000000";
+ close;
+}
+
+ama_in02.gat,61,27,6 script Alchemist#amatsu 749,{
+
+ mes "[Laspuchin Gregory]";
+ mes "KeekeekeeKeheheh.";
+ mes "This is amazing!";
+ mes "The results are extraordinary!!";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Using my skills in this distant";
+ mes "land was unexpected...";
+ mes "Keheheh... The lord of this";
+ mes "palace was quite accomodating.";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Ooops, I better be careful...";
+ mes "If the guild finds out my";
+ mes "location, stupid Myster will";
+ mes "get mad at me. Kehehehkeh...";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "What? Wanna say something?";
+ mes "If you are here for tourism,";
+ mes "enjoy your day off, then go back to";
+ mes "your hometown. Keekeekee...";
+ mes "Or else, I will let you taste my";
+ mes "bottle...!";
+ next;
+ menu "Please, excuse me",-,"Do you need help?",s_Help;
+
+ mes "[Laspuchin Gregory]";
+ mes "Keheheh... Did you hear";
+ mes "what I said? It would be";
+ mes "better to forget...";
+ mes "Keekeekeekeekee...";
+ close;
+
+s_Help:
+ mes "[Laspuchin Gregory]";
+ mes "Help, eh?...";
+ mes "Now that I think about it..";
+ mes "I need some items right now...";
+ mes "Keeheeheekeehee...";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Sir Laspuchin needs some";
+ mes "enchant stones for an experiment.";
+ mes "I will use it efficiently...";
+ mes "Do you have them now?";
+ next;
+ menu "Nope",-,"I got some",s_Got;
+
+ mes "[Laspuchin Gregory]";
+ mes "Then, find 8 stones of one kind.";
+ mes "If you bring 8 of one kind of";
+ mes "enchant stones, I will change it";
+ mes "to a better one...";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Then, find 8 stones of one kind.";
+ mes "not the round gemstones but";
+ mes "the enchant stones. If you bring";
+ mes "the wrong stones, I will throw";
+ mes "a flame bottle at you!";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Bring me stones, slave~!!";
+ mes "And keep your promise!";
+ mes "Kehehehkehkeh...";
+ close;
+
+s_Got:
+ mes "[Laspuchin Gregory]";
+ mes "Uh-uh, what did you bring?";
+ next;
+ switch( select( "Mystic Frozen", "Great Nature", "Flame Heart", "Rough Wind" ) )
+ {
+
+ case 1:
+ set @stoneID,995;
+ set @stoneStr$,"Mystic Frozen";
+ break;
+
+ case 2:
+ set @stoneID,997;
+ set @stoneStr$,"Great Nature";
+ break;
+
+ case 3:
+ set @stoneID,994;
+ set @stoneStr$,"Flame Heart";
+ break;
+
+ case 4:
+ set @stoneID,996;
+ set @stoneStr$,"Rough Wind";
+ break;
+
+ }
+ if(countitem(@stoneID) < 8)goto s_NEnough;
+ mes "[Laspuchin Gregory]";
+ mes "Kehekeh. I see you brought";
+ mes "enough stones! What kind of";
+ mes "stone do you want me to change";
+ mes "them into? Kehehehe.";
+ next;
+ if(@stoneID == 995)menu "Great Nature",s_Great,"Flame Heart",s_Flame,"Rough Wind",s_Rough;
+ if(@stoneID == 996)menu "Great Nature",s_Great,"Flame Heart",s_Flame,"Mystic Frozen",s_Frozen;
+ if(@stoneID == 997)menu "Mystic Frozen",s_Frozen,"Flame Heart",s_Flame,"Rough Wind",s_Rough;
+ if(@stoneID == 994)menu "Great Nature",s_Great,"Mystic Frozen",s_Frozen,"Rough Wind",s_Rough;
+
+s_Great:
+ mes "[Laspuchin Gregory]";
+ mes "Then I will now change";
+ mes "your " + @stoneStr$ + "s into";
+ mes "a Great Nature... Kehehe~";
+ mes "Any objections?";
+ next;
+ menu "No",-,"Yes",s_No;
+ delitem @stoneID,8;
+ getitem 997,1;
+ mes "[Laspuchin Gregory]";
+ mes "Kehehe... It was a success!";
+ mes "Come back anytime if you";
+ mes "want me to change your";
+ mes "enchanted stones into";
+ mes "another kind.. Keheh~";
+ close;
+
+s_Flame:
+ mes "[Laspuchin Gregory]";
+ mes "Then I will now change";
+ mes "your " + @stoneStr$ + "s into";
+ mes "a Flame Heart... Kehehe~";
+ mes "Any objections?";
+ next;
+ menu "No",-,"Yes",s_No;
+ delitem @stoneID,8;
+ getitem 994,1;
+ mes "[Laspuchin Gregory]";
+ mes "Kehehe... It was a success!";
+ mes "Come back anytime if you";
+ mes "want me to change your";
+ mes "enchanted stones into";
+ mes "another kind.. Keheh~";
+ close;
+
+s_Rough:
+ mes "[Laspuchin Gregory]";
+ mes "Then I will now change";
+ mes "your " + @stoneStr$ + "s into";
+ mes "a Rough Wind... Kehehe~";
+ mes "Any objections?";
+ next;
+ menu "No",-,"Yes",s_No;
+ delitem @stoneID,8;
+ getitem 996,1;
+ mes "[Laspuchin Gregory]";
+ mes "Kehehe... It was a success!";
+ mes "Come back anytime if you";
+ mes "want me to change your";
+ mes "enchanted stones into";
+ mes "another kind.. Keheh~";
+ close;
+
+s_Frozen:
+ mes "[Laspuchin Gregory]";
+ mes "Then I will now change";
+ mes "your " + @stoneStr$ + "s into";
+ mes "a Mystic Frozen... Kehehe~";
+ mes "Any objections?";
+ next;
+ menu "No",-,"Yes",s_No;
+ delitem @stoneID,8;
+ getitem 995,1;
+ mes "[Laspuchin Gregory]";
+ mes "Kehehe... It was a success!";
+ mes "Come back anytime if you";
+ mes "want me to change your";
+ mes "enchanted stones into";
+ mes "another kind.. Keheh~";
+ close;
+
+s_No:
+ mes "[Laspuchin Gregory]";
+ mes "Keheh~ You make me want";
+ mes "to throw flame bottles";
+ mes "at you. Kehehehehe...";
+ mes "KEHEHEHEHEHEHE!";
+ close;
+
+s_NEnough:
+ mes "[Laspuchin Gregory]";
+ mes "Keheheh~ Check your pockets";
+ mes "before you tell me";
+ mes "how foolish you are.....";
+ next;
+ mes "[Laspuchin Gregory]";
+ mes "Bring me stones! You said you";
+ mes "were going to help me!";
+ mes "Keep your promises!";
+ mes "Kehehehkehkeh...";
+ close;
+
+}
+
+//| Ninja map portion dummy npcs, commented by default.
+//que_ng.gat,27,18,3 script Seaman 709,{end;}
+//que_ng.gat,28,45,3 script Man 86,{end;}
+//que_ng.gat,28,50,3 script Seaman2 709,{end;}
+//que_ng.gat,22,62,3 script Seaman2 709,{end;}
//que_ng.gat,30,65,3 script Ninja Sensei 730,{end;} \ No newline at end of file
diff --git a/npc/cities/ayothaya.txt b/npc/cities/ayothaya.txt
index ffa58557b..b5e52ba2f 100644
--- a/npc/cities/ayothaya.txt
+++ b/npc/cities/ayothaya.txt
@@ -1,287 +1,287 @@
-//===== eAthena Script =======================================
-//= Ayotaya Town
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any eAthena +
-//===== Description: =========================================
-//= Ayothaya Town Scripts
-//===== Additional Comments: =================================
-//= 0.1 Added a Sailor NPC to get back to Alberta [ZoDIaC]
-//= 0.2 fixed coords, dialogues
-//= 0.3 Fixed Warp name, ayotaya.gat doesnt exist, even though iRO
-//= decided to call it Ayotaya, it really is Ayothaya, like
-//= that Yuno/Juno thing
-//= 0.4 Added the official warp npc for Ayothaya. [MasterOfMuppets]
-//= 1.0 Added most of the official npcs. The following quests were added: [MasterOfMuppets]
-//= Tom Yum Goong quest, Holy Threads quest and Holier threads quest.
-//= 1.0a some checks, optimization [Lupus]
-//= 1.1 Missing delitem fixed by Poki#3 [Lupus]
-//= 1.1a Fixed a typo and clarified a comment at the bottom of the script [MasterOfMuppets]
-//= 1.2 Fixed exploits [Lupus]
-//= 1.3 Removed Duplicates [Silent]
-//= 1.4 Moved quests to quests/quests_ayothaya.txt [Evera]
-//============================================================
-
-ayothaya.gat,152,68,1 script Aibakthing#01 843,{
- mes "[Aibakthing]";
- mes "Hoo! Hah! Hmm! Hah!";
- mes "So, how did you like Ayothaya? Did you get a chance to try Tom Yum Goong? When you're ready, I shall take you back home.";
- next;
- menu "Go back to Alberta.",-,"Cancel.",s_Cancel;
-
- mes "[Aibakthing]";
- mes "You will be welcome to come back whenever you please. I hope that we weill see each other again sometime soon. Thank you~";
- close2;
- warp "alberta.gat",235,45;
- end;
-s_Cancel:
- mes "[Aibakthing]";
- mes "Ah yes. I unsderstand that it is difficult to take leave of such a beautiful place. Do not worry and take your time.";
- close;
-}
-
-alberta.gat,247,42,3 script Aibakthing#02 843,{
- mes "[Aibakthing]";
- mes "Hoo! Hah! Hoo! Hah!";
- mes "Let me take you away to a distant spiritual place, a land of exotic mystery, my hometown Ayothaya.";
- next;
- menu "About Ayothaya",-,"Go to Ayothaya",s_Go,"Cancel.",s_Cancel;
-
- mes "[Aibakthing]";
- mes "We Ayothayans are a pious people who value peace and sincerity. We endeavor to lead simple, yet noble, lives in harmony with nature.";
- next;
- mes "[Aibakthing]";
- mes "Our traditional cuisine is world famous. It's no surprise when we serve dishes like Tom Yum Goong, made of Shrimp, Lemonade and Chillis, which has a tantalizing aroma and flavor beyond imagining.";
- next;
- mes "[Aibakthing]";
- mes "For those who crave adventure, there is an age old story about the Sa-mhing Tiger, an evil creature that haunts our temple ruins.";
- next;
- mes "[Aibakthing]";
- mes "Hoo! Hahh! Hoo! Hahh!";
- mes "No man alive can resist the call of this beautiful land. Rune-Midgardians are always welcome!";
- close;
-s_Cancel:
- mes "[Aibakthing]";
- mes "Have you ever dreamed of a beautiful place filled with spiritual serenity? You must have been dreaming of Ayothaya, my friend.";
- close;
-s_Go:
- mes "[Aibakthing]";
- mes "Ah, you must pay 10,000 Zeny";
- mes "if you wish to visit Ayothaya.";
- mes "If you're read, we can leave right now~";
- next;
- menu "I'm ready, let's go!",-,"No.",s_Cancel;
-
- if(Zeny < 10000) goto s_NoZeny;
- mes "[Aibakthing]";
- mes "Hoo! Hah! Hoo! Hah!";
- mes "Let us be off! Back to my beautiful Ayothaya!";
- close2;
- set Zeny, Zeny - 10000;
- warp "ayothaya.gat",150,65;
- end;
-s_NoZeny:
- mes "[Aibakthing]";
- mes "I am sorry, but you do not have the 10,000 Zeny to travel to Ayothaya. Such a price is nothing compared to the experience that await you!";
- close;
-}
-
-ayothaya.gat,143,102,5 script Old Man#01 842,{
- mes "[Villager]";
- mes "Ummm.";
- mes "Hmmmmm...";
- mes "Ummmmm...?";
- next;
- mes "[Villager]";
- mes "You must be an outsider.";
- mes "Yes. Yes, indeed.";
- next;
- mes "[Villager]";
- mes "Did you just ask where am I going? Why, to the Fishing Spot just ahead. That's what we old men do: fish.";
- next;
- mes "[Villager]";
- mes "Hmmm...";
- mes "Would you like to hear something interesting? I've heard that someone found a ring inside a fish he caught in the Fishing Spot.";
- next;
- mes "[Villager]";
- mes "Supposedly there are lots of stories about people finding valuable inside of the fish they've been catching there.";
- next;
- mes "[Villager]";
- mes "If you're lucky enough, you might even become a millionaire.";
- mes "Heh heh heh~";
- next;
- mes "[Villager]";
- mes "...!?";
- mes "Ah, I came into the fish market!";
- mes "^6A6A6A*Sigh*^000000 It seems I went the wrong way. The Fishing Spot is on the opposite side of this village.";
- next;
- mes "[Villager]";
- mes "Since I'm here, it wouldn't be a bad idea to look around. All of the seafood in this market in this market is fresh and tasty. You'll regret if you don't try some of this seafood at least once.";
- close;
-}
-
-ayo_fild02.gat,25,155,7 script Aik 843,{
- mes "[Aik]";
- mes "So, How was your expedition? I hope that the evil spirits will not follow you outside the ruins, and haunt your dreams.";
- next;
- mes "[Aik]";
- mes "When you go back,";
- mes "remember to ward off";
- mes "the evil from your mind.";
- mes "Otherwise you will encounter";
- mes "trouble later...";
- next;
- mes "[Aik]";
- mes "So, would you";
- mes "like to go back?";
- next;
- menu "Yes.",s_Yes,"No, I need to look around more...",-;
-
- mes "[Aik]";
- mes "I see.";
- mes "Take care.";
- close;
-s_Yes:
- mes "[Aik]";
- mes "Alright then...";
- mes "Here we go...";
- next;
- mes "^3C2EE6He suddenly grabbed you and hurled you up into the air!";
- close2;
- warp "ayo_fild01.gat",115,200;
- end;
-}
-
-ayothaya.gat,193,171,3 script Old Man#02 842,{
- mes "[Tham]";
- mes "Ah~";
- mes "I've got this craving for Ms. Mali the Spicy's food, especially her 'Tom Yum Goong.'";
- next;
- mes "[Tham]";
- mes "I think it's the most delicious dish in the entire world!";
- close;
-}
-
-ayothaya.gat,171,152,5 script Girl 838,{
- mes "[Lalitha]";
- mes "When you go East from this village, you will arrive at the ruins of an old shrine. It is now a nest full of fearsome monsters.";
- next;
- mes "[Lalitha]";
- mes "If you plan to venture through these ruins, you better prepare as much as you can!";
- next;
- mes "[Lalitha]";
- mes "Ah...";
- mes "I wonder where my Black Knight is~";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Don't you mean...";
- mes "Knight in shining armor riding a white horse?";
- next;
- mes "[Lalitha]";
- mes "Hmm...?";
- mes "Oh, well...";
- mes "I'll take them both!";
- mes "Hee hee~!";
- close;
-}
-
-ayothaya.gat,197,188,5 script Young Man#01 841,{
- mes "[Kwan]";
- mes "Phew, isn't it";
- mes "soooo hot today?";
- next;
- mes "[Kwan]";
- mes "You must be";
- mes "from Rune-Midgard, huh?";
- mes "I've seen a lot of tourists";
- mes "coming from there recently.";
- next;
- mes "[Kwan]";
- mes "You'de better be really careful if";
- mes "you travel outside of the village.";
- mes "Whatever you do, don't go into the ruins of and old shrine in the forest.";
- next;
- mes "[Kwan]";
- mes "That place is far too dangerous to visit. Still, I head that if you had some kind of amulet, you could go there with a little less worry...";
- next;
- mes "[Kwan]";
- mes "Well, anyway, it's still a really good idea to stay away from that place. I hope you enjoy visiting Ayothaya, and that keep safe~";
- close;
-}
-
-ayothaya.gat,241,264,5 script Young Man#02 843,{
-
- mes "[Eik]";
- mes "Hey...";
- mes "You look pretty strong";
- mes "You wanna challenge";
- mes "me to a match?";
- next;
- menu "Sure!",s_Sure,"Nah~",-;
-
- mes "[Eik]";
- mes "Real power is developed after having thousands of matches with other people. So, don't be afraid of fighting, okay?";
- close;
-
-s_Sure:
- mes "[Eik]";
- mes "Ow ow ow!";
- mes "I was just";
- mes "kidding, man!";
- next;
- mes "[Eik]";
- mes "I'm not so rude as to pick fights";
- mes "with strangers for no reason!";
- close;
-}
-
-ayothaya.gat,213,142,5 script Young Man#03 843,{
- mes "[Detzi]";
- mes "In Ayothaya, we have our own traditional martial arts. We, the young men of the village, practice our traditional martial arts in order to become strong.";
- next;
- mes "[Detzi]";
- mes "Why don't you learn our martial arts? I guarantee that it will help you greatly in you travels.";
- close;
-}
-
-//This might not get fixed, feel free to submit a fix in the forum to apply though.
-ayothaya.gat,253,99,3 script Fisherman 843,{
- mes "[Dannai]";
- mes "This place is known to be teeming with fish. The fish here tend to eat anything they find, so it's easy to catch them.";
- next;
- mes "[Dannai]";
- mes "We are providing a fishing rod rental service. Every time you fish, you'll need ^4466771 Monster's Food^000000 to use as bait, and pay a rod rental fee of ^44667750 Zeny^000000.";
- next;
- mes "[Dannai]";
- mes "Would you";
- mes "like to try?";
- next;
- menu "Yes.",s_Yes,"No, thanks.",-;
-
- mes "[Dannai]";
- mes "No problem,";
- mes "come back anytime you want. Fishing relaxes the mind and makes you feel at peace...";
-s_Yes:
- mes "Sorry this script isn't finished.";
- close;
-}
-
-ayo_dun01.gat,25,271,4 script #ayokillscript 139,1,1,{
- percentheal -100,0;
- end;
-}
-
-ayo_dun01.gat,25,274,4 duplicate(#ayokillscript) #ayodupe4 139,1,1
-ayo_dun01.gat,28,274,4 duplicate(#ayokillscript) #ayodupe5 139,1,1
-ayo_dun01.gat,28,271,4 duplicate(#ayokillscript) #ayodupe6 139,1,1
-ayo_dun01.gat,25,28,4 duplicate(#ayokillscript) #ayodupe7 139,1,1
-ayo_dun01.gat,25,25,4 duplicate(#ayokillscript) #ayodupe8 139,1,1
-ayo_dun01.gat,28,25,4 duplicate(#ayokillscript) #ayodupe9 139,1,1
-ayo_dun01.gat,28,28,4 duplicate(#ayokillscript) #ayodupe10 139,1,1
-ayo_dun01.gat,271,274,4 duplicate(#ayokillscript) #ayodupe11 139,1,1
-ayo_dun01.gat,271,271,4 duplicate(#ayokillscript) #ayodupe12 139,1,1
-ayo_dun01.gat,274,271,4 duplicate(#ayokillscript) #ayodupe13 139,1,1
-ayo_dun01.gat,274,274,4 duplicate(#ayokillscript) #ayodupe14 139,1,1
+//===== eAthena Script =======================================
+//= Ayotaya Town
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any eAthena +
+//===== Description: =========================================
+//= Ayothaya Town Scripts
+//===== Additional Comments: =================================
+//= 0.1 Added a Sailor NPC to get back to Alberta [ZoDIaC]
+//= 0.2 fixed coords, dialogues
+//= 0.3 Fixed Warp name, ayotaya.gat doesnt exist, even though iRO
+//= decided to call it Ayotaya, it really is Ayothaya, like
+//= that Yuno/Juno thing
+//= 0.4 Added the official warp npc for Ayothaya. [MasterOfMuppets]
+//= 1.0 Added most of the official npcs. The following quests were added: [MasterOfMuppets]
+//= Tom Yum Goong quest, Holy Threads quest and Holier threads quest.
+//= 1.0a some checks, optimization [Lupus]
+//= 1.1 Missing delitem fixed by Poki#3 [Lupus]
+//= 1.1a Fixed a typo and clarified a comment at the bottom of the script [MasterOfMuppets]
+//= 1.2 Fixed exploits [Lupus]
+//= 1.3 Removed Duplicates [Silent]
+//= 1.4 Moved quests to quests/quests_ayothaya.txt [Evera]
+//============================================================
+
+ayothaya.gat,152,68,1 script Aibakthing#01 843,{
+ mes "[Aibakthing]";
+ mes "Hoo! Hah! Hmm! Hah!";
+ mes "So, how did you like Ayothaya? Did you get a chance to try Tom Yum Goong? When you're ready, I shall take you back home.";
+ next;
+ menu "Go back to Alberta.",-,"Cancel.",s_Cancel;
+
+ mes "[Aibakthing]";
+ mes "You will be welcome to come back whenever you please. I hope that we weill see each other again sometime soon. Thank you~";
+ close2;
+ warp "alberta.gat",235,45;
+ end;
+s_Cancel:
+ mes "[Aibakthing]";
+ mes "Ah yes. I unsderstand that it is difficult to take leave of such a beautiful place. Do not worry and take your time.";
+ close;
+}
+
+alberta.gat,247,42,3 script Aibakthing#02 843,{
+ mes "[Aibakthing]";
+ mes "Hoo! Hah! Hoo! Hah!";
+ mes "Let me take you away to a distant spiritual place, a land of exotic mystery, my hometown Ayothaya.";
+ next;
+ menu "About Ayothaya",-,"Go to Ayothaya",s_Go,"Cancel.",s_Cancel;
+
+ mes "[Aibakthing]";
+ mes "We Ayothayans are a pious people who value peace and sincerity. We endeavor to lead simple, yet noble, lives in harmony with nature.";
+ next;
+ mes "[Aibakthing]";
+ mes "Our traditional cuisine is world famous. It's no surprise when we serve dishes like Tom Yum Goong, made of Shrimp, Lemonade and Chillis, which has a tantalizing aroma and flavor beyond imagining.";
+ next;
+ mes "[Aibakthing]";
+ mes "For those who crave adventure, there is an age old story about the Sa-mhing Tiger, an evil creature that haunts our temple ruins.";
+ next;
+ mes "[Aibakthing]";
+ mes "Hoo! Hahh! Hoo! Hahh!";
+ mes "No man alive can resist the call of this beautiful land. Rune-Midgardians are always welcome!";
+ close;
+s_Cancel:
+ mes "[Aibakthing]";
+ mes "Have you ever dreamed of a beautiful place filled with spiritual serenity? You must have been dreaming of Ayothaya, my friend.";
+ close;
+s_Go:
+ mes "[Aibakthing]";
+ mes "Ah, you must pay 10,000 Zeny";
+ mes "if you wish to visit Ayothaya.";
+ mes "If you're read, we can leave right now~";
+ next;
+ menu "I'm ready, let's go!",-,"No.",s_Cancel;
+
+ if(Zeny < 10000) goto s_NoZeny;
+ mes "[Aibakthing]";
+ mes "Hoo! Hah! Hoo! Hah!";
+ mes "Let us be off! Back to my beautiful Ayothaya!";
+ close2;
+ set Zeny, Zeny - 10000;
+ warp "ayothaya.gat",150,65;
+ end;
+s_NoZeny:
+ mes "[Aibakthing]";
+ mes "I am sorry, but you do not have the 10,000 Zeny to travel to Ayothaya. Such a price is nothing compared to the experience that await you!";
+ close;
+}
+
+ayothaya.gat,143,102,5 script Old Man#01 842,{
+ mes "[Villager]";
+ mes "Ummm.";
+ mes "Hmmmmm...";
+ mes "Ummmmm...?";
+ next;
+ mes "[Villager]";
+ mes "You must be an outsider.";
+ mes "Yes. Yes, indeed.";
+ next;
+ mes "[Villager]";
+ mes "Did you just ask where am I going? Why, to the Fishing Spot just ahead. That's what we old men do: fish.";
+ next;
+ mes "[Villager]";
+ mes "Hmmm...";
+ mes "Would you like to hear something interesting? I've heard that someone found a ring inside a fish he caught in the Fishing Spot.";
+ next;
+ mes "[Villager]";
+ mes "Supposedly there are lots of stories about people finding valuable inside of the fish they've been catching there.";
+ next;
+ mes "[Villager]";
+ mes "If you're lucky enough, you might even become a millionaire.";
+ mes "Heh heh heh~";
+ next;
+ mes "[Villager]";
+ mes "...!?";
+ mes "Ah, I came into the fish market!";
+ mes "^6A6A6A*Sigh*^000000 It seems I went the wrong way. The Fishing Spot is on the opposite side of this village.";
+ next;
+ mes "[Villager]";
+ mes "Since I'm here, it wouldn't be a bad idea to look around. All of the seafood in this market in this market is fresh and tasty. You'll regret if you don't try some of this seafood at least once.";
+ close;
+}
+
+ayo_fild02.gat,25,155,7 script Aik 843,{
+ mes "[Aik]";
+ mes "So, How was your expedition? I hope that the evil spirits will not follow you outside the ruins, and haunt your dreams.";
+ next;
+ mes "[Aik]";
+ mes "When you go back,";
+ mes "remember to ward off";
+ mes "the evil from your mind.";
+ mes "Otherwise you will encounter";
+ mes "trouble later...";
+ next;
+ mes "[Aik]";
+ mes "So, would you";
+ mes "like to go back?";
+ next;
+ menu "Yes.",s_Yes,"No, I need to look around more...",-;
+
+ mes "[Aik]";
+ mes "I see.";
+ mes "Take care.";
+ close;
+s_Yes:
+ mes "[Aik]";
+ mes "Alright then...";
+ mes "Here we go...";
+ next;
+ mes "^3C2EE6He suddenly grabbed you and hurled you up into the air!";
+ close2;
+ warp "ayo_fild01.gat",115,200;
+ end;
+}
+
+ayothaya.gat,193,171,3 script Old Man#02 842,{
+ mes "[Tham]";
+ mes "Ah~";
+ mes "I've got this craving for Ms. Mali the Spicy's food, especially her 'Tom Yum Goong.'";
+ next;
+ mes "[Tham]";
+ mes "I think it's the most delicious dish in the entire world!";
+ close;
+}
+
+ayothaya.gat,171,152,5 script Girl 838,{
+ mes "[Lalitha]";
+ mes "When you go East from this village, you will arrive at the ruins of an old shrine. It is now a nest full of fearsome monsters.";
+ next;
+ mes "[Lalitha]";
+ mes "If you plan to venture through these ruins, you better prepare as much as you can!";
+ next;
+ mes "[Lalitha]";
+ mes "Ah...";
+ mes "I wonder where my Black Knight is~";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Don't you mean...";
+ mes "Knight in shining armor riding a white horse?";
+ next;
+ mes "[Lalitha]";
+ mes "Hmm...?";
+ mes "Oh, well...";
+ mes "I'll take them both!";
+ mes "Hee hee~!";
+ close;
+}
+
+ayothaya.gat,197,188,5 script Young Man#01 841,{
+ mes "[Kwan]";
+ mes "Phew, isn't it";
+ mes "soooo hot today?";
+ next;
+ mes "[Kwan]";
+ mes "You must be";
+ mes "from Rune-Midgard, huh?";
+ mes "I've seen a lot of tourists";
+ mes "coming from there recently.";
+ next;
+ mes "[Kwan]";
+ mes "You'de better be really careful if";
+ mes "you travel outside of the village.";
+ mes "Whatever you do, don't go into the ruins of and old shrine in the forest.";
+ next;
+ mes "[Kwan]";
+ mes "That place is far too dangerous to visit. Still, I head that if you had some kind of amulet, you could go there with a little less worry...";
+ next;
+ mes "[Kwan]";
+ mes "Well, anyway, it's still a really good idea to stay away from that place. I hope you enjoy visiting Ayothaya, and that keep safe~";
+ close;
+}
+
+ayothaya.gat,241,264,5 script Young Man#02 843,{
+
+ mes "[Eik]";
+ mes "Hey...";
+ mes "You look pretty strong";
+ mes "You wanna challenge";
+ mes "me to a match?";
+ next;
+ menu "Sure!",s_Sure,"Nah~",-;
+
+ mes "[Eik]";
+ mes "Real power is developed after having thousands of matches with other people. So, don't be afraid of fighting, okay?";
+ close;
+
+s_Sure:
+ mes "[Eik]";
+ mes "Ow ow ow!";
+ mes "I was just";
+ mes "kidding, man!";
+ next;
+ mes "[Eik]";
+ mes "I'm not so rude as to pick fights";
+ mes "with strangers for no reason!";
+ close;
+}
+
+ayothaya.gat,213,142,5 script Young Man#03 843,{
+ mes "[Detzi]";
+ mes "In Ayothaya, we have our own traditional martial arts. We, the young men of the village, practice our traditional martial arts in order to become strong.";
+ next;
+ mes "[Detzi]";
+ mes "Why don't you learn our martial arts? I guarantee that it will help you greatly in you travels.";
+ close;
+}
+
+//This might not get fixed, feel free to submit a fix in the forum to apply though.
+ayothaya.gat,253,99,3 script Fisherman 843,{
+ mes "[Dannai]";
+ mes "This place is known to be teeming with fish. The fish here tend to eat anything they find, so it's easy to catch them.";
+ next;
+ mes "[Dannai]";
+ mes "We are providing a fishing rod rental service. Every time you fish, you'll need ^4466771 Monster's Food^000000 to use as bait, and pay a rod rental fee of ^44667750 Zeny^000000.";
+ next;
+ mes "[Dannai]";
+ mes "Would you";
+ mes "like to try?";
+ next;
+ menu "Yes.",s_Yes,"No, thanks.",-;
+
+ mes "[Dannai]";
+ mes "No problem,";
+ mes "come back anytime you want. Fishing relaxes the mind and makes you feel at peace...";
+s_Yes:
+ mes "Sorry this script isn't finished.";
+ close;
+}
+
+ayo_dun01.gat,25,271,4 script #ayokillscript 139,1,1,{
+ percentheal -100,0;
+ end;
+}
+
+ayo_dun01.gat,25,274,4 duplicate(#ayokillscript) #ayodupe4 139,1,1
+ayo_dun01.gat,28,274,4 duplicate(#ayokillscript) #ayodupe5 139,1,1
+ayo_dun01.gat,28,271,4 duplicate(#ayokillscript) #ayodupe6 139,1,1
+ayo_dun01.gat,25,28,4 duplicate(#ayokillscript) #ayodupe7 139,1,1
+ayo_dun01.gat,25,25,4 duplicate(#ayokillscript) #ayodupe8 139,1,1
+ayo_dun01.gat,28,25,4 duplicate(#ayokillscript) #ayodupe9 139,1,1
+ayo_dun01.gat,28,28,4 duplicate(#ayokillscript) #ayodupe10 139,1,1
+ayo_dun01.gat,271,274,4 duplicate(#ayokillscript) #ayodupe11 139,1,1
+ayo_dun01.gat,271,271,4 duplicate(#ayokillscript) #ayodupe12 139,1,1
+ayo_dun01.gat,274,271,4 duplicate(#ayokillscript) #ayodupe13 139,1,1
+ayo_dun01.gat,274,274,4 duplicate(#ayokillscript) #ayodupe14 139,1,1
diff --git a/npc/cities/comodo.txt b/npc/cities/comodo.txt
index 2dabfd036..4545da7b2 100644
--- a/npc/cities/comodo.txt
+++ b/npc/cities/comodo.txt
@@ -1,426 +1,426 @@
-//===== eAthena Script =======================================
-//= Comodo Town
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Not complete.
-//= 1.1 Rolled back from the wrong Kashy's fix
-//= Implemented the 'Cheese'/Stone of Awakening quest. Re-organized stuff. [kobra_k88]
-//= 1.2b Added Baby Class support [Lupus]
-//= 1.3 Spell Checked and Fixed [massdriller]
-//= 1.4 Fixed typo’s [Nexon]
-//= 1.5 Removed Duplicates [Silent]
-//= 1.6 Split doomed sword quest to quests/quests_comodo.txt [Evera]
-//============================================================
-
-
-
-//============================================================================//
-// BBQ Camp Grounds
-//============================================================================//
-
-//====================================================
-comodo.gat,216,310,4 script BBQ Papa 85,{
-OnStart:
- mes "[BBQ Son]";
- mes "Daddy! Daddy!... Is it true that an ^FF4444Evil Witch^000000 once lived in our village?? Does she still live here???";
- next;
- mes "[BBQ Mama]";
- mes "Son, where did you hear about that?";
- next;
- mes "[BBQ Papa]";
- mes "Ha ha... are you scared of the Evil Witch? It's just an old story......";
- next;
- mes "[BBQ Son]";
- mes "No daddy! If the Witch really lived on our island, her home must be around here still.... She had to have a place to sleep in... Right??";
- next;
- mes "[BBQ Mama]";
- mes "Ho ho ho... now if all of this were true don't you think the ^5555FFChief^000000 would know about it?";
- mes "Anyway, we better start eating before the meat gets overcooked.";
- next;
- mes "[BBQ Son]";
- mes "Okay.... (~crunch~chew~) Yum Yum!!. I'm... I'm...... (~chomp~chomp~).... going to find out the truth!! (~crunch~chomp~) Mmmmm......";
- close;
-}
-
-//=======================================================
-comodo.gat,215,307,4 script BBQ Mama 66,{
- doevent "BBQ Papa::OnStart";
- end;
-}
-
-//=======================================================
-comodo.gat,213,310,4 script BBQ Son 706,{
- doevent "BBQ Papa::OnStart";
- end;
-}
-
-//=======================================================
-comodo.gat,221,310,4 script Rinta 89,{
- mes "[Rinta]";
- mes "I was 'accidentally' eavesdropping on those people having the BBQ over there.";
- mes "It seems that they are long time friends of Comodo's ^5555FFChief^000000.";
- next;
- mes "[Rinta]";
- mes "If this is true, then this means that they can have as much meat and seasoning as they want......";
- emotion e_ic;
- close;
-}
-
-//=======================================================
-comodo.gat,218,309,4 script Razy 69,{
- mes "[Razy]";
- mes "I really dislike people who constantly reminisce about the past. Like that group of people over there. They're really starting to bug me.";
- next;
- mes "[Razy]";
- mes "However, the lady in that group looks really beautiful.... her skin is so light and her complexion is wonderful.";
- mes "If only she didn't have that scar on her face.... she would be perfect...........";
- close;
-}
-
-
-
-//============================================================================//
-// Casino
-//============================================================================//
-
-//=============================================================
-cmd_in02.gat,172,105,4 script G . J 86,{
- mes "[G . J]";
- mes "The more I think about it, the more I realize that it is easier and quicker to get rich by working a steady job and saving my money";
- mes "than it is to gamble it away on false hopes of hitting the jackpot. ";
- next;
- mes "[G . J]";
- mes "It just seems like a smarter choice. I can still earn a good living even after paying my bills and taxes.";
- mes "I feel that it is much more respectable to earn your living through hard work than it is to try to make a living on easy money.";
- next;
- mes "[G . J]";
- mes "Wouldn't you agree? Think about it in this way: You and your friend have been gambling and your friend hits the jackpot.";
- mes "You would want your friend to buy you dinner or even lend you some of the prize money right?";
- next;
- mes "[G . J]";
- mes "After all it's not like your friend EARNED the money.... he/she just got lucky that’s all.";
- mes "Your friend shouldn't mind sharing money that really isn't his/hers.";
- next;
- mes "[G . J]";
- mes "On the other hand, if that same friend had a steady job and worked hard for every penny he/she earned......";
- mes "would you be comfortable asking your friend for some of that hard earned money?";
- next;
- mes "[G . J]";
- mes "You wouldn't dare would you! That money was well earned and represents your friends hard work.";
- mes "You have respect for you friend because of that, and value his/her money more than some prize money.";
- close;
-}
-
-//=============================================================
-cmd_in02.gat,178,92,4 script Shalone 101,{
- mes "[Shalone]";
- mes "Ok, ok............ A-4!! Looks like you've lost again sir.... Hoo hoo, if you'd like a little advice, you shouldn't play when your luck's this bad.";
- next;
- mes "[Shalone]";
- mes "( This costumer just can't seem to win! I feel so sorry for him... ~sigh~)";
- close;
-}
-
-//=============================================================
-cmd_in02.gat,178,86,4 script Stonae 98,{
- mes "[Stonae]";
- mes "WHAT!! Dang it!! AGAIN!! Arghhhhhhh!!!............";
- emotion e_omg;
- next;
- mes "[Stonae]";
- mes "Sheesh! I can't quit after losing this badly! I won't quit until I win!";
- emotion e_ag;
- next;
- mes "[Stonae]";
- mes "Let's go!!";
- emotion e_go;
- close;
-}
-
-//=============================================================
-cmd_in02.gat,174,126,4 script Loyar 83,{
- set @TEMP,0;
- mes "[Loyar]";
- mes "The Comodo Casino has a very pleasing decor... It's quite clean and simple!";
- mes "The atmosphere is perfect and makes you really want to play more!";
- emotion e_ok;
- next;
- mes "[Loyar]";
- mes "Atmosphere is everything when it comes to gaming.";
- next;
- mes "[Loyar]";
- mes "No matter how much fun a game is, no one would be willing to play for a long time if the environment was dirty.";
- mes "A shabby interior and bad odors can wreck a good casino!";
- next;
- mes "[Loyar]";
- mes "The Comodo Casino is the best... NOTHING can beat it! The interior design might even change the mood of a sensitive player.";
- mes "Isn't it great?!";
- close;
-}
-
-//=============================================================
-cmd_in02.gat,73,81,4 script Martine 48,{
- set @temp, 2;
- mes "[Martine]";
- mes "Gambling? Oh no, it's NOT gambling! Don't say that the Comodo 'CASINO' houses gambling.....";
- emotion e_gasp;
- next;
- mes "[Martine]";
- mes "We provide some of the greatest 'GAMES' in the world. It's much more of a sophisticated form of 'GAMING' than it is 'GAMBLING'.....";
- mes "You know what I mean?? (~wink~)";
- next;
- mes "[Martine]";
- mes "What?......... Don't look at me like that!...";
- emotion e_gasp;
- next;
- mes "[Martine]";
- mes "..... Ok, FINE! I see how it is. I don't care what you think. I've lost all my zeny playing in this casino and I have NO regrets whatsoever!";
- emotion e_ag;
- next;
- mes "[Martine]";
- mes "Today's competition is over! I'll have to go to the ^5555FFComodo Dungeon^000000 and kill some monsters to earn back the zeny I lost.";
- mes "But no worries here cause after I've made some zeny, I'll be right back were I left off!!";
- next;
- mes "[Martine]";
- mes "WOO HOO!! I'm going to have a blast!! HAHAHA!";
- emotion e_gg;
- close;
-}
-
-//=============================================================
-cmd_in02.gat,64,43,4 script Roberto#01 709,{
- mes "[Roberto]";
- mes "Muhahaha... What a stupid man! Now that's easy money! (~counts his money~)";
- emotion e_gg;
- next;
- mes "[Roberto]";
- mes "Hey you! What are you looking at!? Get out of here!! What... you've never seen someone count money before??";
- emotion e_what;
- close;
-}
-
-//=============================================================
-cmd_in02.gat,89,72,4 script Deniroz 89,{
- mes "[Deniroz]";
- mes "If the bead falls in this time, I'll hit the JACKPOT!! All I have to do is put this small bead into that little hole.";
- emotion e_gasp;
- next;
- mes "[Deniroz]";
- mes "Most people give up after a few tries, but not me..... *whispers*(the can of beer in my hand is actually a powerful magnet)...";
- next;
- mes "[Deniroz]";
- mes "Keee hee hee hee!! I'm going to get rich with my secret plan!!";
- emotion e_gg;
- close;
-}
-
-//=============================================================
-cmd_in02.gat,57,62,4 script Casino Manager Moo 109,{
- mes "[Casino Manager Moo]";
- mes "I am the manager of Comodo Casino. My name is ^3355FF'Moo'^000000.";
- next;
- mes "[Casino Manager Moo]";
- mes "Here at the Comodo Casino, we strive to serve our customers and accommodate their needs as best we can.";
- mes "Please let us know if you need anything.";
- next;
- mes "[Casino Manager Moo]";
- mes "This area is for the VIP guest at our Casino. Our VIP program facilitates a more sophisticated level of gaming.";
- mes "If you're interested in a more easy going gaming environment, I recommend choosing a more general gaming area.";
- next;
- mes "[Casino Manager Moo]";
- mes "We are continually expanding and trying to develop a more enjoyable environment for our guests here so check back with us often.";
- close;
-}
-
-//====================================================
-cmd_in02.gat,48,55,4 script Scoursege 51,{
- mes "[Scoursege]";
- mes "Darn it, where is that guy who borrowed my zeny? He better not be hiding from me, he told me he would double my money!";
- emotion e_swt2;
- next;
- mes "[Scoursege]";
- mes "He was positive that he could double my money and make a little for himself! Where is he!...";
- next;
- mes "[Scoursege]";
- mes "Have I been scammed!?? On no! What should I do?? My zeny..... (~sob~sob~)";
- emotion e_sob;
- close;
-}
-
-
-
-//============================================================================//
-// Comodo Pharos Lighthouse (Beacon Island)
-//============================================================================//
-
-//==================================================
-cmd_fild07.gat,192,58,4 script Light House Guard#01 100,{
- mes "[Rahasu]";
- mes "Good morning, I am Rahasu, your guide to the";
- mes "^3355FF`lighthouses'^000000";
- mes "Do you wish to learn more about these lighthouses?";
- next;
- menu "Learn more about these Lighthouses..",M0,"Cancel",MEnd;
-
- M0:
- mes "[Rahasu]";
- mes "As you probably have noticed, there are two huge lighthouses located in this area.";
- mes "Both of these lighthouses were used to signal nearby fortresses of incoming invasions many years ago.";
- next;
- mes "[Rahasu]";
- mes "Too bad tourists can not enter these lighthouses yet, because they are still under heavy restrictions.";
- mes "There are many, many beautiful paintings inside.";
- close;
- MEnd:
- mes "[Rahasu]";
- mes "That's too bad, hope you could find some time to learn more about these ancient structures.";
- close;
-}
-
-//=========================================================
-cmd_fild07.gat,52,280,4 script Light House Guard#02 100,{
- mes "[Hallosu]";
- mes "That's correct, this is one of the two lighthouses in this area.";
- mes "However, I can not let anyone go in yet because the lighthouse's interior is still under reconstruction.";
- next;
- mes "[Hallosu]";
- mes "We hope to have a grand opening soon, thank you for your time!";
- mes "^3355FF(The guard is very nervous)^000000";
- close;
-}
-
-//=========================================================
-cmd_fild07.gat,299,83,4 script Sailor#01 100,{
- mes "[Zain]";
- mes "Hello my friend, where do you wish to go?";
- next;
- menu "Alberta = 600 Zeny",M0,"Izlude = 800 Zeny",M1,"Cancel",MEnd;
-
- M0:
- if(Zeny < 600) goto NoZeny;
- set Zeny, Zeny - 600;
- warp "alberta.gat",192,169;
- close;
- M1:
- if(Zeny < 800) goto NoZeny;
- set Zeny, Zeny - 800;
- warp "izlude.gat",176,182;
- close;
-
- NoZeny:
- mes "[Zain]";
- mes "Umm, you do not have enough zeny.";
- close;
- MEnd:
- mes "[Zain]";
- mes "Thank you, come again";
- close;
-}
-
-//=========================================================
-cmd_fild07.gat,94,134,4 script Sailor#02 100,{
- mes "[Sarumane]";
- mes "Hello my friend, where do you wish to go?";
- next;
- menu "Alberta = 600 Zeny",M0,"Izlude = 800 Zeny",M1,"Cancel",MEnd;
-
- M0:
- if(Zeny < 600) goto NoZeny;
- set Zeny, Zeny - 600;
- warp "alberta.gat",192,169;
- close;
- M1:
- if(Zeny < 800) goto NoZeny;
- set Zeny, Zeny - 800;
- warp "izlude.gat",176,182;
- close;
-
- NoZeny:
- mes "[Sarumane]";
- mes "Umm, you do not have enough zeny.";
- close;
- MEnd:
- mes "[Sarumane]";
- mes "Thank you, come again.";
- close;
-}
-
-
-//============================================================================//
-// Kokomo Beach
-//============================================================================//
-
-//=============================================================
-cmd_fild04.gat,188,74,4 script Zyosegirl 93,{
- mes "[Zyosegirl]";
- mes "Hello, I am Zyosegirl, I gather seashells in the sea all day and sell them to make a living.";
- next;
- mes "[Zyosegirl]";
- mes "Even though it seems to be a simple lifestyle, I absolutely love it here.";
- close;
-}
-
-//=========================================================
-cmd_fild04.gat,248,86,4 script Ziyaol 709,{
- mes "[Ziyaol]";
- mes "I don't care what you think of me, I am a fisherman, and it is a very tough profession.";
- next;
- mes "[Ziyaol]";
- mes "I am just taking a short break right now, then I will resume fishing again in a few minutes...";
- close;
-}
-
-//=========================================================
-cmd_fild04.gat,267,137,4 script Kid 703,{
- mes "[Daeguro]";
- mes "The sand here are so gentle and the smell of the ocean is great.";
- mes "I hope one day I could get on one of those boats and head to Alberta.";
- close;
-}
-
-
-//============================================================================//
-// Others
-//============================================================================//
-
-//============================================================
-moc_fild12.gat,35,303,4 script Saint Darmain Gatekeeper 59,{
- mes "[Serutero]";
- mes "Good day, my name is Sertutero and I am the Gatekeeper for the road to Saint Darmain.";
- mes "Do wish to proceed to Saint Darmain?";
- next;
- menu "Proceed to Saint Darmain",M0,"Learn more about Saint Darmain",M1,"Cancel",MEnd;
-
- M0:
- mes "[Serutero]";
- mes "Good luck out there, things could get rough, so be extra careful.";
- mes ". . . . .";
- warp "cmd_fild08.gat",331,319;
- close;
- M1:
- mes "[Serutero]";
- mes "Long time ago, due to many waves of invasion by monsters in Saint Darmain, many defensive structures were constructed to keep the peace.";
- mes "And slowly, Saint Darmain became a natural fortress.";
- mes "During an invasion, the southern edge of Saint Darmain's lighthouse also sends warning signals to surrounding cities.";
- next;
- mes "[Serutero]";
- mes "Because of the vastness of all the defensive structures, Saint Darmain is also commonly known as";
- mes "^3355FF` Fortress Saint Darmain '^000000.";
- next;
- mes "[Serutero]";
- mes "If you are looking for the lighthouse, proceed in the direction of south-west.";
- close;
- MEnd:
- mes "[Serutero]";
- mes "If you ever become exhausted on your journey, you should stop by the nearby island of";
- mes "^3355FF`Comodo'^000000 City.";
- mes "The tropical weather over there is a brand new experience for most people.";
- close;
-}
+//===== eAthena Script =======================================
+//= Comodo Town
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Not complete.
+//= 1.1 Rolled back from the wrong Kashy's fix
+//= Implemented the 'Cheese'/Stone of Awakening quest. Re-organized stuff. [kobra_k88]
+//= 1.2b Added Baby Class support [Lupus]
+//= 1.3 Spell Checked and Fixed [massdriller]
+//= 1.4 Fixed typo’s [Nexon]
+//= 1.5 Removed Duplicates [Silent]
+//= 1.6 Split doomed sword quest to quests/quests_comodo.txt [Evera]
+//============================================================
+
+
+
+//============================================================================//
+// BBQ Camp Grounds
+//============================================================================//
+
+//====================================================
+comodo.gat,216,310,4 script BBQ Papa 85,{
+OnStart:
+ mes "[BBQ Son]";
+ mes "Daddy! Daddy!... Is it true that an ^FF4444Evil Witch^000000 once lived in our village?? Does she still live here???";
+ next;
+ mes "[BBQ Mama]";
+ mes "Son, where did you hear about that?";
+ next;
+ mes "[BBQ Papa]";
+ mes "Ha ha... are you scared of the Evil Witch? It's just an old story......";
+ next;
+ mes "[BBQ Son]";
+ mes "No daddy! If the Witch really lived on our island, her home must be around here still.... She had to have a place to sleep in... Right??";
+ next;
+ mes "[BBQ Mama]";
+ mes "Ho ho ho... now if all of this were true don't you think the ^5555FFChief^000000 would know about it?";
+ mes "Anyway, we better start eating before the meat gets overcooked.";
+ next;
+ mes "[BBQ Son]";
+ mes "Okay.... (~crunch~chew~) Yum Yum!!. I'm... I'm...... (~chomp~chomp~).... going to find out the truth!! (~crunch~chomp~) Mmmmm......";
+ close;
+}
+
+//=======================================================
+comodo.gat,215,307,4 script BBQ Mama 66,{
+ doevent "BBQ Papa::OnStart";
+ end;
+}
+
+//=======================================================
+comodo.gat,213,310,4 script BBQ Son 706,{
+ doevent "BBQ Papa::OnStart";
+ end;
+}
+
+//=======================================================
+comodo.gat,221,310,4 script Rinta 89,{
+ mes "[Rinta]";
+ mes "I was 'accidentally' eavesdropping on those people having the BBQ over there.";
+ mes "It seems that they are long time friends of Comodo's ^5555FFChief^000000.";
+ next;
+ mes "[Rinta]";
+ mes "If this is true, then this means that they can have as much meat and seasoning as they want......";
+ emotion e_ic;
+ close;
+}
+
+//=======================================================
+comodo.gat,218,309,4 script Razy 69,{
+ mes "[Razy]";
+ mes "I really dislike people who constantly reminisce about the past. Like that group of people over there. They're really starting to bug me.";
+ next;
+ mes "[Razy]";
+ mes "However, the lady in that group looks really beautiful.... her skin is so light and her complexion is wonderful.";
+ mes "If only she didn't have that scar on her face.... she would be perfect...........";
+ close;
+}
+
+
+
+//============================================================================//
+// Casino
+//============================================================================//
+
+//=============================================================
+cmd_in02.gat,172,105,4 script G . J 86,{
+ mes "[G . J]";
+ mes "The more I think about it, the more I realize that it is easier and quicker to get rich by working a steady job and saving my money";
+ mes "than it is to gamble it away on false hopes of hitting the jackpot. ";
+ next;
+ mes "[G . J]";
+ mes "It just seems like a smarter choice. I can still earn a good living even after paying my bills and taxes.";
+ mes "I feel that it is much more respectable to earn your living through hard work than it is to try to make a living on easy money.";
+ next;
+ mes "[G . J]";
+ mes "Wouldn't you agree? Think about it in this way: You and your friend have been gambling and your friend hits the jackpot.";
+ mes "You would want your friend to buy you dinner or even lend you some of the prize money right?";
+ next;
+ mes "[G . J]";
+ mes "After all it's not like your friend EARNED the money.... he/she just got lucky that’s all.";
+ mes "Your friend shouldn't mind sharing money that really isn't his/hers.";
+ next;
+ mes "[G . J]";
+ mes "On the other hand, if that same friend had a steady job and worked hard for every penny he/she earned......";
+ mes "would you be comfortable asking your friend for some of that hard earned money?";
+ next;
+ mes "[G . J]";
+ mes "You wouldn't dare would you! That money was well earned and represents your friends hard work.";
+ mes "You have respect for you friend because of that, and value his/her money more than some prize money.";
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,178,92,4 script Shalone 101,{
+ mes "[Shalone]";
+ mes "Ok, ok............ A-4!! Looks like you've lost again sir.... Hoo hoo, if you'd like a little advice, you shouldn't play when your luck's this bad.";
+ next;
+ mes "[Shalone]";
+ mes "( This costumer just can't seem to win! I feel so sorry for him... ~sigh~)";
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,178,86,4 script Stonae 98,{
+ mes "[Stonae]";
+ mes "WHAT!! Dang it!! AGAIN!! Arghhhhhhh!!!............";
+ emotion e_omg;
+ next;
+ mes "[Stonae]";
+ mes "Sheesh! I can't quit after losing this badly! I won't quit until I win!";
+ emotion e_ag;
+ next;
+ mes "[Stonae]";
+ mes "Let's go!!";
+ emotion e_go;
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,174,126,4 script Loyar 83,{
+ set @TEMP,0;
+ mes "[Loyar]";
+ mes "The Comodo Casino has a very pleasing decor... It's quite clean and simple!";
+ mes "The atmosphere is perfect and makes you really want to play more!";
+ emotion e_ok;
+ next;
+ mes "[Loyar]";
+ mes "Atmosphere is everything when it comes to gaming.";
+ next;
+ mes "[Loyar]";
+ mes "No matter how much fun a game is, no one would be willing to play for a long time if the environment was dirty.";
+ mes "A shabby interior and bad odors can wreck a good casino!";
+ next;
+ mes "[Loyar]";
+ mes "The Comodo Casino is the best... NOTHING can beat it! The interior design might even change the mood of a sensitive player.";
+ mes "Isn't it great?!";
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,73,81,4 script Martine 48,{
+ set @temp, 2;
+ mes "[Martine]";
+ mes "Gambling? Oh no, it's NOT gambling! Don't say that the Comodo 'CASINO' houses gambling.....";
+ emotion e_gasp;
+ next;
+ mes "[Martine]";
+ mes "We provide some of the greatest 'GAMES' in the world. It's much more of a sophisticated form of 'GAMING' than it is 'GAMBLING'.....";
+ mes "You know what I mean?? (~wink~)";
+ next;
+ mes "[Martine]";
+ mes "What?......... Don't look at me like that!...";
+ emotion e_gasp;
+ next;
+ mes "[Martine]";
+ mes "..... Ok, FINE! I see how it is. I don't care what you think. I've lost all my zeny playing in this casino and I have NO regrets whatsoever!";
+ emotion e_ag;
+ next;
+ mes "[Martine]";
+ mes "Today's competition is over! I'll have to go to the ^5555FFComodo Dungeon^000000 and kill some monsters to earn back the zeny I lost.";
+ mes "But no worries here cause after I've made some zeny, I'll be right back were I left off!!";
+ next;
+ mes "[Martine]";
+ mes "WOO HOO!! I'm going to have a blast!! HAHAHA!";
+ emotion e_gg;
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,64,43,4 script Roberto#01 709,{
+ mes "[Roberto]";
+ mes "Muhahaha... What a stupid man! Now that's easy money! (~counts his money~)";
+ emotion e_gg;
+ next;
+ mes "[Roberto]";
+ mes "Hey you! What are you looking at!? Get out of here!! What... you've never seen someone count money before??";
+ emotion e_what;
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,89,72,4 script Deniroz 89,{
+ mes "[Deniroz]";
+ mes "If the bead falls in this time, I'll hit the JACKPOT!! All I have to do is put this small bead into that little hole.";
+ emotion e_gasp;
+ next;
+ mes "[Deniroz]";
+ mes "Most people give up after a few tries, but not me..... *whispers*(the can of beer in my hand is actually a powerful magnet)...";
+ next;
+ mes "[Deniroz]";
+ mes "Keee hee hee hee!! I'm going to get rich with my secret plan!!";
+ emotion e_gg;
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,57,62,4 script Casino Manager Moo 109,{
+ mes "[Casino Manager Moo]";
+ mes "I am the manager of Comodo Casino. My name is ^3355FF'Moo'^000000.";
+ next;
+ mes "[Casino Manager Moo]";
+ mes "Here at the Comodo Casino, we strive to serve our customers and accommodate their needs as best we can.";
+ mes "Please let us know if you need anything.";
+ next;
+ mes "[Casino Manager Moo]";
+ mes "This area is for the VIP guest at our Casino. Our VIP program facilitates a more sophisticated level of gaming.";
+ mes "If you're interested in a more easy going gaming environment, I recommend choosing a more general gaming area.";
+ next;
+ mes "[Casino Manager Moo]";
+ mes "We are continually expanding and trying to develop a more enjoyable environment for our guests here so check back with us often.";
+ close;
+}
+
+//====================================================
+cmd_in02.gat,48,55,4 script Scoursege 51,{
+ mes "[Scoursege]";
+ mes "Darn it, where is that guy who borrowed my zeny? He better not be hiding from me, he told me he would double my money!";
+ emotion e_swt2;
+ next;
+ mes "[Scoursege]";
+ mes "He was positive that he could double my money and make a little for himself! Where is he!...";
+ next;
+ mes "[Scoursege]";
+ mes "Have I been scammed!?? On no! What should I do?? My zeny..... (~sob~sob~)";
+ emotion e_sob;
+ close;
+}
+
+
+
+//============================================================================//
+// Comodo Pharos Lighthouse (Beacon Island)
+//============================================================================//
+
+//==================================================
+cmd_fild07.gat,192,58,4 script Light House Guard#01 100,{
+ mes "[Rahasu]";
+ mes "Good morning, I am Rahasu, your guide to the";
+ mes "^3355FF`lighthouses'^000000";
+ mes "Do you wish to learn more about these lighthouses?";
+ next;
+ menu "Learn more about these Lighthouses..",M0,"Cancel",MEnd;
+
+ M0:
+ mes "[Rahasu]";
+ mes "As you probably have noticed, there are two huge lighthouses located in this area.";
+ mes "Both of these lighthouses were used to signal nearby fortresses of incoming invasions many years ago.";
+ next;
+ mes "[Rahasu]";
+ mes "Too bad tourists can not enter these lighthouses yet, because they are still under heavy restrictions.";
+ mes "There are many, many beautiful paintings inside.";
+ close;
+ MEnd:
+ mes "[Rahasu]";
+ mes "That's too bad, hope you could find some time to learn more about these ancient structures.";
+ close;
+}
+
+//=========================================================
+cmd_fild07.gat,52,280,4 script Light House Guard#02 100,{
+ mes "[Hallosu]";
+ mes "That's correct, this is one of the two lighthouses in this area.";
+ mes "However, I can not let anyone go in yet because the lighthouse's interior is still under reconstruction.";
+ next;
+ mes "[Hallosu]";
+ mes "We hope to have a grand opening soon, thank you for your time!";
+ mes "^3355FF(The guard is very nervous)^000000";
+ close;
+}
+
+//=========================================================
+cmd_fild07.gat,299,83,4 script Sailor#01 100,{
+ mes "[Zain]";
+ mes "Hello my friend, where do you wish to go?";
+ next;
+ menu "Alberta = 600 Zeny",M0,"Izlude = 800 Zeny",M1,"Cancel",MEnd;
+
+ M0:
+ if(Zeny < 600) goto NoZeny;
+ set Zeny, Zeny - 600;
+ warp "alberta.gat",192,169;
+ close;
+ M1:
+ if(Zeny < 800) goto NoZeny;
+ set Zeny, Zeny - 800;
+ warp "izlude.gat",176,182;
+ close;
+
+ NoZeny:
+ mes "[Zain]";
+ mes "Umm, you do not have enough zeny.";
+ close;
+ MEnd:
+ mes "[Zain]";
+ mes "Thank you, come again";
+ close;
+}
+
+//=========================================================
+cmd_fild07.gat,94,134,4 script Sailor#02 100,{
+ mes "[Sarumane]";
+ mes "Hello my friend, where do you wish to go?";
+ next;
+ menu "Alberta = 600 Zeny",M0,"Izlude = 800 Zeny",M1,"Cancel",MEnd;
+
+ M0:
+ if(Zeny < 600) goto NoZeny;
+ set Zeny, Zeny - 600;
+ warp "alberta.gat",192,169;
+ close;
+ M1:
+ if(Zeny < 800) goto NoZeny;
+ set Zeny, Zeny - 800;
+ warp "izlude.gat",176,182;
+ close;
+
+ NoZeny:
+ mes "[Sarumane]";
+ mes "Umm, you do not have enough zeny.";
+ close;
+ MEnd:
+ mes "[Sarumane]";
+ mes "Thank you, come again.";
+ close;
+}
+
+
+//============================================================================//
+// Kokomo Beach
+//============================================================================//
+
+//=============================================================
+cmd_fild04.gat,188,74,4 script Zyosegirl 93,{
+ mes "[Zyosegirl]";
+ mes "Hello, I am Zyosegirl, I gather seashells in the sea all day and sell them to make a living.";
+ next;
+ mes "[Zyosegirl]";
+ mes "Even though it seems to be a simple lifestyle, I absolutely love it here.";
+ close;
+}
+
+//=========================================================
+cmd_fild04.gat,248,86,4 script Ziyaol 709,{
+ mes "[Ziyaol]";
+ mes "I don't care what you think of me, I am a fisherman, and it is a very tough profession.";
+ next;
+ mes "[Ziyaol]";
+ mes "I am just taking a short break right now, then I will resume fishing again in a few minutes...";
+ close;
+}
+
+//=========================================================
+cmd_fild04.gat,267,137,4 script Kid 703,{
+ mes "[Daeguro]";
+ mes "The sand here are so gentle and the smell of the ocean is great.";
+ mes "I hope one day I could get on one of those boats and head to Alberta.";
+ close;
+}
+
+
+//============================================================================//
+// Others
+//============================================================================//
+
+//============================================================
+moc_fild12.gat,35,303,4 script Saint Darmain Gatekeeper 59,{
+ mes "[Serutero]";
+ mes "Good day, my name is Sertutero and I am the Gatekeeper for the road to Saint Darmain.";
+ mes "Do wish to proceed to Saint Darmain?";
+ next;
+ menu "Proceed to Saint Darmain",M0,"Learn more about Saint Darmain",M1,"Cancel",MEnd;
+
+ M0:
+ mes "[Serutero]";
+ mes "Good luck out there, things could get rough, so be extra careful.";
+ mes ". . . . .";
+ warp "cmd_fild08.gat",331,319;
+ close;
+ M1:
+ mes "[Serutero]";
+ mes "Long time ago, due to many waves of invasion by monsters in Saint Darmain, many defensive structures were constructed to keep the peace.";
+ mes "And slowly, Saint Darmain became a natural fortress.";
+ mes "During an invasion, the southern edge of Saint Darmain's lighthouse also sends warning signals to surrounding cities.";
+ next;
+ mes "[Serutero]";
+ mes "Because of the vastness of all the defensive structures, Saint Darmain is also commonly known as";
+ mes "^3355FF` Fortress Saint Darmain '^000000.";
+ next;
+ mes "[Serutero]";
+ mes "If you are looking for the lighthouse, proceed in the direction of south-west.";
+ close;
+ MEnd:
+ mes "[Serutero]";
+ mes "If you ever become exhausted on your journey, you should stop by the nearby island of";
+ mes "^3355FF`Comodo'^000000 City.";
+ mes "The tropical weather over there is a brand new experience for most people.";
+ close;
+}
diff --git a/npc/cities/einbech.txt b/npc/cities/einbech.txt
index 694fda740..e83ddbe22 100644
--- a/npc/cities/einbech.txt
+++ b/npc/cities/einbech.txt
@@ -1,1143 +1,1143 @@
-//===== eAthena Script =======================================
-//= Einbech Town
-//===== By: ==================================================
-//= Muad_dib
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena Revision 3000+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 0.1 Started writing Einbech npc's. [Muad_Dib]
-//= 0.1a Conversion to eA format [MasterOfMuppets]
-//= 0.1b Added missing tabs. [Mass Zero] 0.1c more missing tabs [Lupus]
-//= 0.2 Added reddozen's NPCs, fixedmissing '";' [Lupus]
-//= 0.2a Removed a few npcs never intended to be there [MasterOfMuppets]
-//= 0.3 Added some more npcs, thanks to Muad_Dib [MasterOfMuppets]
-//= 1.0 Added the last of the town npcs, [MasterOfMuppets]
-//= all credits to muad_dib for scripting them.
-//= 1.1 Made some changes according to the Shinokas quest, [MasterOfMuppets]
-//= thanks to Dj-Yhn for scripting them.
-//= 1.2 Removed Duplicates [Silent]
-//= 1.3 Implemented the Lover's quest. [MasterOfMuppets]
-//= 1.4 Moved quests to quests/quests_ein.txt [Evera]
-//============================================================
-
-
-einbech.gat,180,136,5 script Notice Board 858,{
- mes "[Tool Shop Entrance]";
- close;
-}
-
-einbech.gat,46,107,6 script Shena 846,{
- mes "[Shena]";
- mes "I think it's weird!";
- mes "How do you youngsters";
- mes "not learn all of this?";
- next;
- mes "[Luda]";
- mes "Well, I'm sure the";
- mes "generation gap has";
- mes "something to do with it,";
- mes "but I'm surprised that elder";
- mes "people would know so much~";
- next;
- menu "What are you guys talking about?",L_WHAT,"Pass on by",-;
-
- mes "[Shena]";
- mes "Luda...";
- mes "You don't live";
- mes "to be as old as";
- mes "I am and not learn";
- mes "a little something";
- mes "about this world of ours~";
- close;
-L_WHAT:
- mes "[Shena]";
- mes "Oh? Well, well";
- mes "Aren't you the most";
- mes "adorable little girl?";
- mes "Hello, dearie~";
- next;
- menu "Excuse me, but I'm actually a guy.",-;
-
- mes "[Shena]";
- mes "Oh, oh are you now?";
- mes "Perhaps my eyes are";
- mes "getting bad in my old";
- mes "age. Getting harder to";
- mes "tell the difference nowadays...";
- next;
- mes "[Shena]";
- mes "Anyway, me and Luda";
- mes "were just having a little";
- mes "chat about all the monsters";
- mes "near Einbroch. Appearantly,";
- mes "you youngsters don't know as";
- mes "much about them as you should.";
- next;
- mes "[Shena]";
- mes "If adventuring is your";
- mes "business, you should";
- mes "know what you're up against.";
- mes "Did you have any questions";
- mes "about the monsters arround";
- mes "here, young lady?";
- next;
- menu "I told you, I'm a dude...!",-;
- mes "[Shena]";
- mes "Hmm. 'Dude.' I think";
- mes "I've heard that before.";
- mes "Ho ho~ You'll have to";
- mes "forgive this old biddy";
- mes "I don't quite have a grasp";
- mes "on all the words you kids use.";
- next;
- mes "[Shena]";
- mes "So dearie,";
- mes "wich monster";
- mes "would you like";
- mes "to hear about?";
-L_MENU:
- next;
- menu "Metaling",L_METALING,"Mineral",L_MINERAL,"Pitman",L_PITMAN,"Waste Stove",L_WASTE,"Quit",-;
-
- mes "[Shena]";
- mes "Alright then.";
- mes "Have a good";
- mes "day, young lady.";
- next;
- mes "[Luda]";
- mes "I'm sorry about my";
- mes "mother! She can be";
- mes "overly friendly, I suppose.";
- mes "But if you're bored, please";
- mes "feel free to visit. Be safe";
- mes "on your travels, adventurer~";
- close;
-L_METALING:
- mes "[Shena]";
- mes "Well, the Metalings";
- mes "were created during";
- mes "the time when the gods";
- mes "ruled over this world.";
- next;
- mes "[Shena]";
- mes "I'm not sure if you knew";
- mes "this or not, but according";
- mes "to the myth, Porings and Drops";
- mes "were created from Odin's";
- mes "saliva. You migh not want";
- mes "to know about Poporing...";
- next;
- mes "[Shena]";
- mes "metalings, on the";
- mes "other hand were made";
- mes "from the blood of living";
- mes "machines that I belive";
- mes "were called 'Gigantes.'";
- next;
- mes "[Shena]";
- mes "Metaling is still like";
- mes "those other hopping";
- mes "blobbs of gelatine in that";
- mes "they'll swallow whatever";
- mes "might be lying on the ground.";
- next;
- mes "[Shena]";
- mes "If you defeat a Metaling,";
- mes "it could drop Large Jellopy,";
- mes "Iron Ore or even Iron. That";
- mes "might be good to know, right?";
- next;
- mes "[Shena]";
- mes "Is there";
- mes "anything else";
- mes "you'd like to";
- mes "ask, dearie?";
- goto L_MENU;
-L_MINERAL:
- mes "[Shena]";
- mes "Did you know that";
- mes "stalactites and cave";
- mes "crystals grow for thousands";
- mes "and thousand of years?";
- next;
- mes "[Shena]";
- mes "Now, if something's been";
- mes "growing for thousands of";
- mes "years, it would make sense";
- mes "if it actually was alive. Now,";
- mes "Mineral monsters are actually";
- mes "living stalactites";
- next;
- mes "[Shena]";
- mes "It's rumored that they";
- mes "are grown in a dark cave";
- mes "in wich something inside";
- mes "has some sort of malicious";
- mes "influence over them.";
- next;
- mes "[Shena]";
- mes "Minerals can defend themselves,";
- mes "but they might drop Crystal Fragment,";
- mes "Topaz or Emveretarcon if you defeat";
- mes "one. There's also a chance";
- mes "that they may drop a rare jewel,";
- mes "but I'm not quite sure.";
- next;
- mes "[Shena]";
- mes "Are there any";
- mes "other mosnters";
- mes "arround here that";
- mes "you'd want to learn";
- mes "more about?";
- goto L_MENU;
-L_PITMAN:
- mes "[Shena]";
- mes "Pitmen are the ghosts";
- mes "of dead miners that haunt";
- mes "old and rusted mine cars.";
- mes "For some reason, they can't";
- mes "leave this world so they just";
- mes "wander arround the mines.";
- next;
- mes "[Shena]";
- mes "If you can defeat";
- mes "them, they'll drop";
- mes "Old Pick, Lantern, Iron,";
- mes "Steel, Coal, Flashlight";
- mes "and Rusty Iron Plate.";
- next;
- mes "[Shena]";
- mes "Did you want";
- mes "to asl me about";
- mes "any other of the";
- mes "local monsters?";
- goto L_MENU;
-L_WASTE:
- mes "[Shena]";
- mes "It's just an evil,";
- mes "man-eating stove.";
- next;
- menu "...That's it?",L_THAT,"H-horrifying!",-;
-
- mes "[Shena]";
- mes "Yes. God's creation,";
- mes "that creature is cruel";
- mes "and merciless, perhaps";
- mes "a symbol of pure evil";
- mes "if I ever saw one.";
- next;
- mes "[Shena]";
- mes "Unlike newe appliances,";
- mes "Waste Stoves were hand made by";
- mes "master craftsmen that, I guess,";
- mes "developed their own souls. They";
- mes "used to be benovalant machines,";
- mes "contend to provide loving warmth.";
- next;
- mes "[Shena]";
- mes "For years they would serve";
- mes "their owners with loyalty. But";
- mes "as technology advanced and";
- mes "they became obsolete, they were";
- mes "discarded like pieces of trash.";
- mes "This twisted their harts to ^FF0000evil^000000.";
- next;
- mes "[Shena]";
- mes "Waste Stoves will usually";
- mes "drop Battered Pot, Burnt Tree,";
- mes "Iron, Iron Ore and Rusty Iron Plate.";
- mes "But once in a while they might drop";
- mes "interesting items like Rusty Iron";
- mes "or even Dead Branch.";
- next;
- mes "[Shena]";
- mes "So, is there";
- mes "anything else";
- mes "you'd like me to";
- mes "share with you?";
- goto L_MENU;
-L_THAT:
- mes "[Shena]";
- mes "Now, you know the importance";
- mes "of recycling and preserving our";
- mes "natural resources, right? Now,";
- mes "it would do my heart good if you";
- mes "were to recycle the scrap iron";
- mes "from those Waste Stove monsters.";
- next;
- mes "[Shena]";
- mes "Waste Stoves will usually";
- mes "drop Battered Pot, Burnt Tree,";
- mes "Iron, Iron Ore and Rusty Iron Plate.";
- mes "But once in a while they might drop";
- mes "interesting items like Rusty Iron";
- mes "or even Dead Branch.";
- next;
- mes "[Shena]";
- mes "So, is there";
- mes "anything else";
- mes "you'd like me to";
- mes "share with you?";
- goto L_MENU;
-}
-
-einbech.gat,48,107,4 duplicate(Shena) Luda 850
-
-einbech.gat,93,139,6 script Raust 847,{
- mes "[Raust]";
- mes "I don't get it!";
- mes "Einbroch gets bigger";
- mes "and fancier and our";
- mes "town gets dirtier and";
- mes "nastier. What the hell?!";
- next;
- mes "[Raust]";
- mes "Not only do the people";
- mes "look more ragged, we're";
- mes "more tired and older looking";
- mes "as well! It's dirty, it's crowded,";
- mes "everything in this city is a total";
- mes "mess! What, you want a list?!";
- next;
- mes "[Raust]";
- mes "The food, literally, is";
- mes "garbage! The jobs here have";
- mes "to be a violation of human rights.";
- mes "There's barely any women here and";
- mes "the ones we do have all stink";
- mes "anyway! Are you convinced yet?!";
- next;
- mes "[Raust]";
- mes "Why is everything";
- mes "that's good over";
- mes "in Einbroch?! I hate this!";
- mes "*Grumble*";
- close;
-}
-
-einbech.gat,97,167,6 script Cavitar 847,{
- mes "[Cavitar]";
- mes "Recently, we had some";
- mes "tunnel cave-ins that resulted";
- mes "in miner casualties. We're having";
- mes "a harder time working in the";
- mes "mines now that we're even";
- mes "lower on manpower.";
- next;
- mes "[Cavitar]";
- mes "What's really suspicious";
- mes "is that it seems something";
- mes "has been making the tunnels";
- mes "collapse on purpose. Some of";
- mes "us believe it's because we've";
- mes "angered the master of the cave.";
- next;
- mes "[Cavitar]";
- mes "The tunnel accident";
- mes "is still fresh in my mind.";
- mes "It still seems that there are";
- mes "more ^FF0000Cave Master^000000 sightings";
- mes "when the tunnels started";
- mes "to inexplicably collapse.";
- next;
- mes "[Cavitar]";
- mes "I was off duty whent";
- mes "the accident happened.";
- mes "Still, I hear the only survivor";
- mes "went crazy and disappeared";
- mes "spmewhere. The poor bastard...";
- close;
-}
-
-einbech.gat,105,218,6 script Gushenmu 848,{
- mes "[Gushenmu]";
- mes "I've lived here a long time";
- mes "and, believe it or not, things";
- mes "weren't as though in the past";
- mes "as they are right now.";
- next;
- mes "[Gushenmu]";
- mes "For lots of different reasons,";
- mes "the work is more dangerous";
- mes "and we're running real low on";
- mes "manpower. And the factories in";
- mes "Einbroch make so much smog,";
- mes "we can't even see sunlight here.";
- next;
- mes "[Gushenmu]";
- mes "The sad reality of mining";
- mes "life right now is that we";
- mes "wake up, go to work, and at";
- mes "the end of the day some of us";
- mes "are injured while a few others";
- mes "never come to work the next day.";
- next;
- mes "[Gushenmu]";
- mes "And as Einbech and Einbroch";
- mes "have grown, I hear more and";
- mes "more rumors that unfammiliar";
- mes "monsters are beginning to";
- mes "swarm outside of town.";
- mes "This is really Einbech's worst time...";
- close;
-}
-
-einbech.gat,39,215,6 script Train Station Staff 852,{
- mes "[Staff]";
- mes "Welcome to";
- mes "the Train Station.";
- mes "The fare to take the";
- mes "train to Einbroch is";
- mes "200 zeny. Would";
- mes "you like to ride?";
- next;
- menu "Yes.",L_YES,"No.",-;
-
- mes "[Staff]";
- mes "Please enjoy";
- mes "your stay here";
- mes "in Einbech.";
- close;
-L_YES:
- if(Zeny < 200)goto L_ZENY;
- mes "[Staff]";
- mes "Thank you and";
- mes "we hope you enjoy";
- mes "the ride. All aboard!";
- next;
- set Zeny,Zeny - 200;
- warp "einbroch.gat",226,276;
- end;
-L_ZENY:
- mes "[Staff]";
- mes "I'm sorry,";
- mes "but you don't";
- mes "have enough zeny";
- mes "to pay the train fare.";
- close;
-}
-
-einbech.gat,157,215,4 script Train Station Manager 852,{
- mes "[Train Station Manager]";
- mes "This train station";
- mes "is strictly for trains";
- mes "running from Einbech";
- mes "to Einbroch. Please speak";
- mes "to the staff in the 11 o' clock";
- mes "direction if you'd like to board.";
- close;
-}
-
-einbech.gat,129,234,6 script Hander 848,{
- mes "[Hander]";
- mes "Those Einbroch bastards!";
- mes "Living off the resources we";
- mes "dig up while we keep working";
- mes "for them like suckers! Damn!";
- next;
- mes "[Hander]";
- mes "Everyday, we risk our";
- mes "freakin' lives just so we";
- mes "can make a living! Why don't";
- mes "the elders do something about";
- mes "this, like raise our ore prices?";
- next;
- mes "[Hander]";
- mes "The work schedule's";
- mes "unreasonable, Cavitar's";
- mes "wife was attacked by a mine";
- mes "creature, the hospital's too";
- mes "far away and we don't have";
- mes "any food to eat! Why...?!";
- close;
-}
-
-einbech.gat,128,238,6 script Mogan 848,{
- mes "[Mogan]";
- mes "Recently, there were a few";
- mes "cave-ins where many miners";
- mes "were injured. It was discussed";
- mes "in the Town Council and in my";
- mes "opinion, I think the miners dug";
- mes "too deep and disturbed... ^FF0000it^000000.";
- next;
- mes "[Mogan]";
- mes "Yes, they awoke Ungoliant,";
- mes "the master of the caves that";
- mes "has existed since ancient time.";
- mes "I don't know how many more will";
- mes "be victimised by Ungolian in the";
- mes "future. There's no telling...";
- next;
- mes "[Mogan]";
- mes "Adventurer, be careful";
- mes "if you travel inside the";
- mes "mines, lest your footsteps";
- mes "distrub Ungoliant's slumber.";
- close;
-}
-
-einbech.gat,130,253,2 script Ekuri 848,{
- mes "[Ekuri]";
- mes "Yo-heave-ho!";
- mes "Yo-heave-ho~!";
- next;
- mes "[Ekuri]";
- mes "What am I doing here?";
- mes "heck, I'm scared to death";
- mes "of entering the mine! But";
- mes "I can make a living here at";
- mes "the entrance by gathering";
- mes "scrap metal! Smart, huh?";
- next;
- mes "[Ekuri]";
- mes "Sometimes, I get lucky";
- mes "and score an entire ore!";
- mes "Sure, I'm a coward, but";
- mes "at least I'm alive. Well,";
- mes "for the time being.";
- next;
- mes "[Ekuri]";
- mes "Now you know what";
- mes "I'm doing here. So why";
- mes "don't you leave me to";
- mes "my work? Heave-ho!";
- mes "Ores, come to me!";
- close;
-}
-
-einbech.gat,148,242,5 script Jung 855,{
- mes "[Jung]";
- mes "I'm one of the few";
- mes "people who's lived";
- mes "in both Einbech and";
- mes "Einbroch for a long time,";
- mes "So I guess I'm one of the";
- mes "best guides of this area.";
- next;
- mes "[Jung]";
- mes "Say, if you're thinking of";
- mes "entering the Mine Dungeon,";
- mes "I can tell you all I know about";
- mes "the monsters in that place so";
- mes "that you'll be better prepared.";
- next;
- menu "Sure, why not?",L_TELL,"No, thanks.",-;
- mes "[Jung]";
- mes "I understand if you're";
- mes "kind of in a hurry. Still,";
- mes "if you're pretty new around";
- mes "here, you should learn as";
- mes "much as you can before";
- mes "entering any dungeons.";
- next;
- mes "[Jung]";
- mes "Alright then,";
- mes "be safe on your";
- mes "adventures, alright?";
- close;
-L_TELL:
- mes "[Jung]";
- mes "Let's see. Ah, the monsters that";
- mes "are unique to the Mine Dungeon";
- mes "are Noxious, Venomous, Porcellio";
- mes "and Obsidian. Wich one do you";
- mes "want to know more about?";
- next;
- menu "Noxious and Venomous",-,"Porcellio",L_PORCELLIO,"Obsidian",L_OBSIDIAN;
- mes "[Jung]";
- mes "You know, no one seems";
- mes "to know where Noxious and";
- mes "Venomous have come form.";
- mes "It's like they appeared out of";
- mes "nowhere when Einbroch";
- mes "started to industrialise.";
- next;
- mes "[Jung]";
- mes "Now that I think about it,";
- mes "I don't think they're naturally";
- mes "created monsters. They have";
- mes "this fixed look of despair and";
- mes "suffering and tend to act like they";
- mes "want their enemies to kill them.";
- next;
- mes "[Jung]";
- mes "Still, you'd better be careful!";
- mes "Careful! Nocious and Venomous";
- mes "are stealthy monsters that can";
- mes "glide quietly through the air";
- mes "and attack you before";
- mes "you even notice...";
- next;
- mes "[Jung]";
- mes "You should know that";
- mes "Noxious is Ghost property";
- mes "and Venomous is Poison.";
- mes "Both are medium sized,";
- mes "formless monsters.";
- next;
- mes "[Jung]";
- mes "Both of them drop Apple,";
- mes "Dust Pollutant, Toxic Gas,";
- mes "Poisonous Powder, Bacillus,";
- mes "Mold Powder and Anodyne.";
- next;
- mes "[Jung]";
- mes "That's all for now.";
- mes "Feel free to ask me";
- mes "if you have any questions";
- mes "about monsters in the Mine";
- mes "Dungeon. Be safe, adventurer.";
- close;
-L_PORCELLIO:
- mes "[Jung]";
- mes "Porcellio is an insect that";
- mes "lives in caves and drinks water";
- mes "dripped from stalactites. It's";
- mes "different from Ungoliant since";
- mes "it likes to be near different";
- mes "kinds of minerals and ores.";
- next;
- mes "[Jung]";
- mes "Porcellio drops Jubilee,";
- mes "Insect Leg, Single Cell,";
- mes "Moss of Morning Dew, Neon";
- mes "Liquid and a few other things";
- mes "I can't quite remember.";
- next;
- mes "[Jung]";
- mes "Lastly, Porcellio is an";
- mes "Earth property monster.";
- mes "That's all I know about it.";
- mes "But if you want to know more";
- mes "about some monster in the";
- mes "Mine Dungeon, feel free to ask.";
- close;
-L_OBSIDIAN:
- mes "[Jung]";
- mes "Do you know about the";
- mes "belief that underground";
- mes "minerlas that contain huge";
- mes "amounts of energy actually";
- mes "have souls? Obsidian is";
- mes "one of these living rocks.";
- next;
- mes "[Jung]";
- mes "Supposedly, just a piece of an";
- mes "Obsidian in a Jung Processor has";
- mes "enough energy to light up the night";
- mes "sky. Unfortunately, it's impossible";
- mes "to capture one alive and hunting";
- mes "them isn't so easy.";
- next;
- mes "[Jung]";
- mes "Obsidian is a small,";
- mes "shapeless monster that";
- mes "drops Clear Jewel, Piece of";
- mes "Black Crystal, Coal, Elunium,";
- mes "Iron and Steel.";
- next;
- mes "[Jung]";
- mes "That's all for Obsidian.";
- mes "If you have any questions";
- mes "about other monsters living";
- mes "in the Mine Dungeon, feel";
- mes "free to ask me.";
- close;
-}
-
-einbech.gat,148,246,5 script Franz 851,{
- mes "[Franz]";
- mes "So bored...";
- mes "Starving for...";
- mes "Conversation.";
- mes "S-somebody...";
- next;
- mes "[Franz]";
- mes "Hey, a traveller!";
- mes "Are you planning to explore";
- mes "the Mine Dungeon or the fields";
- mes "around here? Let's chat for a bit";
- mes "and maybe you'll learn something.";
- next;
- menu "Okay, fine.",L_OKAY,"No, thanks.",-;
- mes "[Franz]";
- mes "Oh, okay.";
- mes "You're busy and have";
- mes "things to do, I understand.";
- mes "You probably have to head";
- mes "off somewhere right away.";
- mes "Right. Got it.";
- next;
- mes "[Franz]";
- mes "I...";
- mes "I've got stuff";
- mes "I should be working";
- mes "on. Yes. So very busy.";
- close;
-L_OKAY:
- mes "[Franz]";
- mes "Ooh, have you heard";
- mes "about the creature in the";
- mes "Mine Dungeon or what's";
- mes "happened in town recently?";
- mes "Which would you like to";
- mes "know more about?";
- next;
- menu "Creature of Mine Dungeon",L_CREATURE,"Town Incident",-;
- mes "[Franz]";
- mes "In Einbroch, there was";
- mes "a short lived teddy bear";
- mes "fad. However, a series of";
- mes "mysterious accidents and";
- mes "murders where entire families";
- mes "were killed also occured.";
- next;
- mes "[Franz]";
- mes "It turns out that every family";
- mes "that had been murdered had";
- mes "bought one of these teddy bears.";
- mes "There were even rumors that these";
- mes "teddy bears were comming to life.";
- next;
- mes "[Franz]";
- mes "After an investigation, the";
- mes "authorities learned that all the";
- mes "merchants who sold these bears";
- mes "had purchased them from the";
- mes "same wholesaler, an outsider";
- mes "noone knew anything about.";
- next;
- mes "[Franz]";
- mes "Since the teddy bears were";
- mes "clearly not made to be mere,";
- mes "harmless toys, troops were";
- mes "sent to secure all the teddy";
- mes "bears and dispose of them";
- mes "outside of town.";
- next;
- mes "[Franz]";
- mes "But as soon as the teddy";
- mes "bears were set outside of";
- mes "town, they sprang to life and";
- mes "started rioting! This is clear";
- mes "proof that these bears are";
- mes "controlled by some evil force.";
- next;
- mes "[Franz]";
- mes "Now those aggressive teddy";
- mes "bears are scattered all over";
- mes "the place and the government";
- mes "has classified them as monsters.";
- mes "Kill with extreme prejudice!";
- next;
- mes "[Franz]";
- mes "According to adventurers";
- mes "who have caught these bears,";
- mes "they're small, neutral monsters";
- mes "which drop Honey, Screw, Well-baked";
- mes "Cookie and Oridecon Hammer.";
- next;
- mes "[Franz]";
- mes "That's all I know";
- mes "about it. Watch out";
- mes "for those bears if you";
- mes "go exploring, okay? They";
- mes "may be cute, but they're";
- mes "known to be extremely vicious!";
- close;
-L_CREATURE:
- mes "[Franz]";
- mes "The creature I'm talking about is";
- mes "Ungoliant, which also called the";
- mes "Master of the Caves around here.";
- mes "It's said to live deep in the caves";
- mes "where it giards peculiar ores and";
- mes "minerals with strange powers.";
- next;
- mes "[Franz]";
- mes "At first I thought it was";
- mes "just an old fairy tale, but it";
- mes "actually started appearing";
- mes "again about ten years ago";
- mes "when the tunnel cave-ins";
- mes "started to happen.";
- next;
- mes "[Franz]";
- mes "As sightings of Ungoliant";
- mes "increased, more and more";
- mes "tunnel cave-ins occured.";
- mes "I guess the miners have";
- mes "inadvertently intruded";
- mes "into it's territory.";
- next;
- mes "[Franz]";
- mes "According to legend,";
- mes "ancient giants snuck into";
- mes "a mine to steal coal from";
- mes "humans. But they made too";
- mes "much noise while they were";
- mes "digging and awoke Ungoliant.";
- next;
- mes "[Franz]";
- mes "When the miners went to work";
- mes "the next morning, they found the";
- mes "bloodied bodies of those giants.";
- mes "After that, people have feared";
- mes "the threat that Ungoliant poses";
- mes "to anyone entering the mines.";
- next;
- mes "[Franz]";
- mes "Now, an adventurer that";
- mes "managed to kill an Ungoliant";
- mes "has told me that it drops Ant's";
- mes "Jaw, Colorful Shell, Very Hard";
- mes "Shell, Long Leg, Neon Liquid";
- mes "and Zircon.";
- close;
-}
-
-einbech.gat,151,168,4 script Tollaf 854,{
- mes "[Tollaf]";
- mes "Ah...!";
- mes "This is killing me!";
- mes "I don't have the money";
- mes "to move, but I don't wanna";
- mes "live in this town anymore!";
- next;
- mes "[Tollaf]";
- mes "People everywhere else";
- mes "live so much better than we";
- mes "do, especially those snobs in";
- mes "Einbroch! Einbech must be the";
- mes "worst town of Schwartzwald Republic.";
- mes "No, it's the worst in the world!";
- close;
-}
-
-einbech.gat,149,154,4 script Mjunia 850,{
- mes "[Mjunia]";
- mes "It's hard being a woman";
- mes "in this town, By being born";
- mes "here, it's like fate just decided";
- mes "to be especially cruel to me.";
- next;
- mes "[Mjunia]";
- mes "My skin and hands are";
- mes "rough from all the work";
- mes "I have to do. But worst of";
- mes "all... I... I... I've developed";
- mes "bigger muscles than most";
- mes "guys! Waaaaaah~!";
- next;
- mes "[Mjunia]";
- mes "I wish I could find";
- mes "a nice guy from Einbroch";
- mes "and get married so I can";
- mes "get away from this town.";
- mes "But it doesn't look like";
- mes "that wil happen...";
- next;
- mes "[Mjunia]";
- mes "And I'd never marry";
- mes "anyone from Einbech!";
- mes "I'd rather die cold and";
- mes "alone than cold and married";
- mes "to some Einbech hooligan.";
- next;
- mes "[Mjunia]";
- mes "Look at these";
- mes "muscles. What do";
- mes "you think? Am I pretty?";
- mes "*Sniff* I gave up trying";
- mes "to be feminine years ago.";
- mes "I have to work so hard...";
- close;
-}
-
-einbech.gat,176,125,4 script Ellhenje 850,{
- mes "[Ellhenje]";
- mes "Things might be";
- mes "bad in this town";
- mes "with the pollution";
- mes "and the bullying";
- mes "from Einbroch...";
- next;
- mes "[Ellhenje]";
- mes "But somehow, people";
- mes "are able to get by. That's";
- mes "because there's a guy";
- mes "that everyone here likes...";
- next;
- mes "[Ellhenje]";
- mes "I'm talking about Clitzer!";
- mes "He's almost too honest and";
- mes "almost too diligent. But most";
- mes "of all, he's the nicest guy~";
- next;
- mes "[Ellhenje]";
- mes "Clitzer was born in one of";
- mes "Einbech's poorest families,";
- mes "but he's usually happy and always";
- mes "thinks about others. I guess that's";
- mes "why people like to think of him";
- mes "as representing all of Einbech.";
- next;
- mes "[Ellhenje]";
- mes "Recently, something's";
- mes "been bothering him. I'm";
- mes "not sure, but I think only";
- mes "woman troubles could make";
- mes "a guy feel so glum. I hope he";
- mes "feels better soon...";
- close;
-}
-
-einbech.gat,172,113,4 script Nemuk 855,{
- mes "[Nemuk]";
- mes "You seem to be an";
- mes "outsider, so let me";
- mes "ask you something.";
- mes "What do you think";
- mes "of Einbech?";
- next;
- menu "It's fine.",L_FINE,"It looks tough to live here.",-;
- mes "[Nemuk]";
- mes "I thought so.";
- mes "Well, I appologize if";
- mes "I put you on the spot.";
- next;
- mes "[Nemuk]";
- mes "Everyone here has been";
- mes "having a tough time just";
- mes "living day to day for as long";
- mes "as I can remember. It's like";
- mes "things never seem to get any";
- mes "better, no matter what we do.";
- next;
- mes "[Nemuk]";
- mes "I really want to leave,";
- mes "but it's just an empty";
- mes "wish. My body is trapped";
- mes "here while my heart longs";
- mes "for a much better life. *Sigh*";
- mes "Is it hopeless? What can I do?";
- close;
-L_FINE:
- mes "[Nemuk]";
- mes "Huh...?";
- mes "I'm not sure what";
- mes "you've seen, but I'm";
- mes "surprised to hear you";
- mes "say something like that.";
- next;
- mes "[Nemuk]";
- mes "It's been ten years since";
- mes "I've started to think about";
- mes "moving out. However, I'm still";
- mes "debating it. Now, if I were rich,";
- mes "I'd leave in no time, but it's hard";
- mes "getting the money to move out.";
- next;
- mes "[Nemuk]";
- mes "*Sigh...*";
- mes "Maybe if I had been";
- mes "and adventurer when I was";
- mes "younger, I wouldn't have";
- mes "these problems today...";
- close;
-}
-
-ein_in01.gat,281,85,2 script Drunken Man#01 849,{
- mes "[Drunken Man]";
- mes "...*Hiccup*...";
- mes "*Hiccup*...";
- mes "*Yawn*.....";
- mes ".................";
- mes "..*Hiccup*.....";
- mes "*Hiccup*..";
- close;
-}
-
-ein_in01.gat,277,95,8 script Ryan Danger 855,{
- mes "[R.D. kim]";
- mes "Oooh...";
- next;
- mes "[R.D. kim]";
- mes "Oooh...";
- mes "Momma.";
- next;
- mes "[R.D. kim]";
- mes "Oooh...";
- mes "Momma.";
- mes "You are so...";
- next;
- mes "[R.D. kim]";
- mes "Oooh...";
- mes "Momma.";
- mes "You are so...";
- mes "^FF0000Hot^000000!";
- next;
- mes "[R.D. kim]";
- mes "Why don't you take off";
- mes "those heavy, uncomfortable";
- mes "clothes? I'll buy you whatever";
- mes "you want, it's on me! C'mon~";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "N-no...!";
- mes "I-I-I-I...";
- mes "(this is the";
- mes "shadiest guy";
- mes "I've ever seen!)";
- next;
- mes "[R.D. kim]";
- mes "Hm? No...?";
- mes "Absolutely no?";
- mes "Are you sure?";
- mes "Alright, alright.";
- mes "I'm sorry, I apologize.";
- mes "I was totally out of line.";
- next;
- mes "[R.D. kim]";
- mes "...";
- mes "Or am I?";
- mes "Bwahahahaha!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "(Th-this guy";
- mes "must be drunk, out";
- mes "of his freakin' mind)";
- close;
-}
-
-ein_in01.gat,279,92,2 script Tavern Lady 854,{
- mes "[Tavern Lady]";
- mes "most Einbech men are";
- mes "crude and primitive male";
- mes "chauvinists! They disgust me!";
- next;
- mes "[Tavern Lady]";
- mes "I mean, there's nothing";
- mes "good about them! They're";
- mes "wild, violent, simple minded";
- mes "and ignorant. They settle all";
- mes "their arguments with brawn";
- mes "and they're so... close minded!";
- next;
- mes "[Tavern Lady]";
- mes "How can they not know";
- mes "that women want gentle,";
- mes "sensitive men with whom";
- mes "they can share their feelings";
- mes "and drink chamille tea over";
- mes "freshly knit doillies?";
- close;
-}
-
-einbech.gat,197,139,4 script Young Man#05 855,{
- mes "[Heinz]";
- mes "Wow...";
- mes "And adventurer from";
- mes "Rune-Midgard, eh?";
- mes "What brings you here?";
- next;
- mes "[Heinz]";
- mes "Einbech doesn't offer much";
- mes "in terms of sight-seeing, but";
- mes "have you come to see the mine?";
- mes "Right now, it's swarming with";
- mes "monsters and we can't dig any";
- mes "ores because it's so dangerous.";
- next;
- mes "[Heinz]";
- mes "Now, if some adventurers were";
- mes "generous enough to hunt down";
- mes "those evil creatures, we'd be able";
- mes "to mine again and they could earn";
- mes "some extra zeny. It's like killing";
- mes "two birds with one stone. Hahaha!";
- next;
- mes "[Heinz]";
- mes "Oh wait... I'm sorry.";
- mes "I don't know what's wrong";
- mes "with me, asking complete";
- mes "strangers to do favors for";
- mes "me. It's completely rude!";
- mes "I mean, who would do that?";
- next;
- mes "[Heinz]";
- mes "But... I'm beyond caring";
- mes "about my pride. For the sake";
- mes "of all that is good and holy, I'm";
- mes "begging you, please kill thise foul";
- mes "and evil creatures. Please!!";
- close;
-}
-
-
-ein_in01.gat,192,90,2 script Supineque 849,{
- mes "[Supineque]";
- mes "Ugh...";
- mes "I'm starving!";
- next;
- mes "[Supineque]";
- mes "I haven't had food for so";
- mes "long that my stomach is";
- mes "beginning to digest itself!";
- mes "This is horrible...";
- next;
- mes "[Supineque]";
- mes "I mean, I have";
- mes "food that I can";
- mes "eat today. But if";
- mes "I finish it, what am";
- mes "I gonna eat tomorrow?";
- close;
-}
-
-ein_in01.gat,208,86,3 script Decii 855,{
- mes "[Decii]";
- mes "This is so";
- mes "frustating!";
- mes "I'm surrounded";
- mes "by all these ^FF0000people^000000!";
- next;
- mes "[Decii]";
- mes "There's absolutely";
- mes "no privacy in a town";
- mes "this crowded! I guess";
- mes "I should try to move";
- mes "out as soon as I can.";
- close;
-}
-
-einbech.gat,216,118,4 script Catzllanpu 854,{
- mes "[Catzllanpu]";
- mes "*Sigh...* ";
- mes "Simple pleasures.";
- mes "They're what makes";
- mes "life worth living,";
- mes "you know?";
- next;
- mes "[Catzllanpu]";
- mes "It's enough for me just to";
- mes "live a normal and happy life,";
- mes "but everyone around me wants";
- mes "to work harder and harder. If";
- mes "you never take a rest, you're";
- mes "killing yourself pretty slowly.";
- next;
- mes "[Catzllanpu]";
- mes "I guess you can tell that";
- mes "I don't have the worries";
- mes "other people have about";
- mes "money. It's great, but it's";
- mes "not worth sacrificing the";
- mes "quality of your life, right?";
- close;
-}
+//===== eAthena Script =======================================
+//= Einbech Town
+//===== By: ==================================================
+//= Muad_dib
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena Revision 3000+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 0.1 Started writing Einbech npc's. [Muad_Dib]
+//= 0.1a Conversion to eA format [MasterOfMuppets]
+//= 0.1b Added missing tabs. [Mass Zero] 0.1c more missing tabs [Lupus]
+//= 0.2 Added reddozen's NPCs, fixedmissing '";' [Lupus]
+//= 0.2a Removed a few npcs never intended to be there [MasterOfMuppets]
+//= 0.3 Added some more npcs, thanks to Muad_Dib [MasterOfMuppets]
+//= 1.0 Added the last of the town npcs, [MasterOfMuppets]
+//= all credits to muad_dib for scripting them.
+//= 1.1 Made some changes according to the Shinokas quest, [MasterOfMuppets]
+//= thanks to Dj-Yhn for scripting them.
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Implemented the Lover's quest. [MasterOfMuppets]
+//= 1.4 Moved quests to quests/quests_ein.txt [Evera]
+//============================================================
+
+
+einbech.gat,180,136,5 script Notice Board 858,{
+ mes "[Tool Shop Entrance]";
+ close;
+}
+
+einbech.gat,46,107,6 script Shena 846,{
+ mes "[Shena]";
+ mes "I think it's weird!";
+ mes "How do you youngsters";
+ mes "not learn all of this?";
+ next;
+ mes "[Luda]";
+ mes "Well, I'm sure the";
+ mes "generation gap has";
+ mes "something to do with it,";
+ mes "but I'm surprised that elder";
+ mes "people would know so much~";
+ next;
+ menu "What are you guys talking about?",L_WHAT,"Pass on by",-;
+
+ mes "[Shena]";
+ mes "Luda...";
+ mes "You don't live";
+ mes "to be as old as";
+ mes "I am and not learn";
+ mes "a little something";
+ mes "about this world of ours~";
+ close;
+L_WHAT:
+ mes "[Shena]";
+ mes "Oh? Well, well";
+ mes "Aren't you the most";
+ mes "adorable little girl?";
+ mes "Hello, dearie~";
+ next;
+ menu "Excuse me, but I'm actually a guy.",-;
+
+ mes "[Shena]";
+ mes "Oh, oh are you now?";
+ mes "Perhaps my eyes are";
+ mes "getting bad in my old";
+ mes "age. Getting harder to";
+ mes "tell the difference nowadays...";
+ next;
+ mes "[Shena]";
+ mes "Anyway, me and Luda";
+ mes "were just having a little";
+ mes "chat about all the monsters";
+ mes "near Einbroch. Appearantly,";
+ mes "you youngsters don't know as";
+ mes "much about them as you should.";
+ next;
+ mes "[Shena]";
+ mes "If adventuring is your";
+ mes "business, you should";
+ mes "know what you're up against.";
+ mes "Did you have any questions";
+ mes "about the monsters arround";
+ mes "here, young lady?";
+ next;
+ menu "I told you, I'm a dude...!",-;
+ mes "[Shena]";
+ mes "Hmm. 'Dude.' I think";
+ mes "I've heard that before.";
+ mes "Ho ho~ You'll have to";
+ mes "forgive this old biddy";
+ mes "I don't quite have a grasp";
+ mes "on all the words you kids use.";
+ next;
+ mes "[Shena]";
+ mes "So dearie,";
+ mes "wich monster";
+ mes "would you like";
+ mes "to hear about?";
+L_MENU:
+ next;
+ menu "Metaling",L_METALING,"Mineral",L_MINERAL,"Pitman",L_PITMAN,"Waste Stove",L_WASTE,"Quit",-;
+
+ mes "[Shena]";
+ mes "Alright then.";
+ mes "Have a good";
+ mes "day, young lady.";
+ next;
+ mes "[Luda]";
+ mes "I'm sorry about my";
+ mes "mother! She can be";
+ mes "overly friendly, I suppose.";
+ mes "But if you're bored, please";
+ mes "feel free to visit. Be safe";
+ mes "on your travels, adventurer~";
+ close;
+L_METALING:
+ mes "[Shena]";
+ mes "Well, the Metalings";
+ mes "were created during";
+ mes "the time when the gods";
+ mes "ruled over this world.";
+ next;
+ mes "[Shena]";
+ mes "I'm not sure if you knew";
+ mes "this or not, but according";
+ mes "to the myth, Porings and Drops";
+ mes "were created from Odin's";
+ mes "saliva. You migh not want";
+ mes "to know about Poporing...";
+ next;
+ mes "[Shena]";
+ mes "metalings, on the";
+ mes "other hand were made";
+ mes "from the blood of living";
+ mes "machines that I belive";
+ mes "were called 'Gigantes.'";
+ next;
+ mes "[Shena]";
+ mes "Metaling is still like";
+ mes "those other hopping";
+ mes "blobbs of gelatine in that";
+ mes "they'll swallow whatever";
+ mes "might be lying on the ground.";
+ next;
+ mes "[Shena]";
+ mes "If you defeat a Metaling,";
+ mes "it could drop Large Jellopy,";
+ mes "Iron Ore or even Iron. That";
+ mes "might be good to know, right?";
+ next;
+ mes "[Shena]";
+ mes "Is there";
+ mes "anything else";
+ mes "you'd like to";
+ mes "ask, dearie?";
+ goto L_MENU;
+L_MINERAL:
+ mes "[Shena]";
+ mes "Did you know that";
+ mes "stalactites and cave";
+ mes "crystals grow for thousands";
+ mes "and thousand of years?";
+ next;
+ mes "[Shena]";
+ mes "Now, if something's been";
+ mes "growing for thousands of";
+ mes "years, it would make sense";
+ mes "if it actually was alive. Now,";
+ mes "Mineral monsters are actually";
+ mes "living stalactites";
+ next;
+ mes "[Shena]";
+ mes "It's rumored that they";
+ mes "are grown in a dark cave";
+ mes "in wich something inside";
+ mes "has some sort of malicious";
+ mes "influence over them.";
+ next;
+ mes "[Shena]";
+ mes "Minerals can defend themselves,";
+ mes "but they might drop Crystal Fragment,";
+ mes "Topaz or Emveretarcon if you defeat";
+ mes "one. There's also a chance";
+ mes "that they may drop a rare jewel,";
+ mes "but I'm not quite sure.";
+ next;
+ mes "[Shena]";
+ mes "Are there any";
+ mes "other mosnters";
+ mes "arround here that";
+ mes "you'd want to learn";
+ mes "more about?";
+ goto L_MENU;
+L_PITMAN:
+ mes "[Shena]";
+ mes "Pitmen are the ghosts";
+ mes "of dead miners that haunt";
+ mes "old and rusted mine cars.";
+ mes "For some reason, they can't";
+ mes "leave this world so they just";
+ mes "wander arround the mines.";
+ next;
+ mes "[Shena]";
+ mes "If you can defeat";
+ mes "them, they'll drop";
+ mes "Old Pick, Lantern, Iron,";
+ mes "Steel, Coal, Flashlight";
+ mes "and Rusty Iron Plate.";
+ next;
+ mes "[Shena]";
+ mes "Did you want";
+ mes "to asl me about";
+ mes "any other of the";
+ mes "local monsters?";
+ goto L_MENU;
+L_WASTE:
+ mes "[Shena]";
+ mes "It's just an evil,";
+ mes "man-eating stove.";
+ next;
+ menu "...That's it?",L_THAT,"H-horrifying!",-;
+
+ mes "[Shena]";
+ mes "Yes. God's creation,";
+ mes "that creature is cruel";
+ mes "and merciless, perhaps";
+ mes "a symbol of pure evil";
+ mes "if I ever saw one.";
+ next;
+ mes "[Shena]";
+ mes "Unlike newe appliances,";
+ mes "Waste Stoves were hand made by";
+ mes "master craftsmen that, I guess,";
+ mes "developed their own souls. They";
+ mes "used to be benovalant machines,";
+ mes "contend to provide loving warmth.";
+ next;
+ mes "[Shena]";
+ mes "For years they would serve";
+ mes "their owners with loyalty. But";
+ mes "as technology advanced and";
+ mes "they became obsolete, they were";
+ mes "discarded like pieces of trash.";
+ mes "This twisted their harts to ^FF0000evil^000000.";
+ next;
+ mes "[Shena]";
+ mes "Waste Stoves will usually";
+ mes "drop Battered Pot, Burnt Tree,";
+ mes "Iron, Iron Ore and Rusty Iron Plate.";
+ mes "But once in a while they might drop";
+ mes "interesting items like Rusty Iron";
+ mes "or even Dead Branch.";
+ next;
+ mes "[Shena]";
+ mes "So, is there";
+ mes "anything else";
+ mes "you'd like me to";
+ mes "share with you?";
+ goto L_MENU;
+L_THAT:
+ mes "[Shena]";
+ mes "Now, you know the importance";
+ mes "of recycling and preserving our";
+ mes "natural resources, right? Now,";
+ mes "it would do my heart good if you";
+ mes "were to recycle the scrap iron";
+ mes "from those Waste Stove monsters.";
+ next;
+ mes "[Shena]";
+ mes "Waste Stoves will usually";
+ mes "drop Battered Pot, Burnt Tree,";
+ mes "Iron, Iron Ore and Rusty Iron Plate.";
+ mes "But once in a while they might drop";
+ mes "interesting items like Rusty Iron";
+ mes "or even Dead Branch.";
+ next;
+ mes "[Shena]";
+ mes "So, is there";
+ mes "anything else";
+ mes "you'd like me to";
+ mes "share with you?";
+ goto L_MENU;
+}
+
+einbech.gat,48,107,4 duplicate(Shena) Luda 850
+
+einbech.gat,93,139,6 script Raust 847,{
+ mes "[Raust]";
+ mes "I don't get it!";
+ mes "Einbroch gets bigger";
+ mes "and fancier and our";
+ mes "town gets dirtier and";
+ mes "nastier. What the hell?!";
+ next;
+ mes "[Raust]";
+ mes "Not only do the people";
+ mes "look more ragged, we're";
+ mes "more tired and older looking";
+ mes "as well! It's dirty, it's crowded,";
+ mes "everything in this city is a total";
+ mes "mess! What, you want a list?!";
+ next;
+ mes "[Raust]";
+ mes "The food, literally, is";
+ mes "garbage! The jobs here have";
+ mes "to be a violation of human rights.";
+ mes "There's barely any women here and";
+ mes "the ones we do have all stink";
+ mes "anyway! Are you convinced yet?!";
+ next;
+ mes "[Raust]";
+ mes "Why is everything";
+ mes "that's good over";
+ mes "in Einbroch?! I hate this!";
+ mes "*Grumble*";
+ close;
+}
+
+einbech.gat,97,167,6 script Cavitar 847,{
+ mes "[Cavitar]";
+ mes "Recently, we had some";
+ mes "tunnel cave-ins that resulted";
+ mes "in miner casualties. We're having";
+ mes "a harder time working in the";
+ mes "mines now that we're even";
+ mes "lower on manpower.";
+ next;
+ mes "[Cavitar]";
+ mes "What's really suspicious";
+ mes "is that it seems something";
+ mes "has been making the tunnels";
+ mes "collapse on purpose. Some of";
+ mes "us believe it's because we've";
+ mes "angered the master of the cave.";
+ next;
+ mes "[Cavitar]";
+ mes "The tunnel accident";
+ mes "is still fresh in my mind.";
+ mes "It still seems that there are";
+ mes "more ^FF0000Cave Master^000000 sightings";
+ mes "when the tunnels started";
+ mes "to inexplicably collapse.";
+ next;
+ mes "[Cavitar]";
+ mes "I was off duty whent";
+ mes "the accident happened.";
+ mes "Still, I hear the only survivor";
+ mes "went crazy and disappeared";
+ mes "spmewhere. The poor bastard...";
+ close;
+}
+
+einbech.gat,105,218,6 script Gushenmu 848,{
+ mes "[Gushenmu]";
+ mes "I've lived here a long time";
+ mes "and, believe it or not, things";
+ mes "weren't as though in the past";
+ mes "as they are right now.";
+ next;
+ mes "[Gushenmu]";
+ mes "For lots of different reasons,";
+ mes "the work is more dangerous";
+ mes "and we're running real low on";
+ mes "manpower. And the factories in";
+ mes "Einbroch make so much smog,";
+ mes "we can't even see sunlight here.";
+ next;
+ mes "[Gushenmu]";
+ mes "The sad reality of mining";
+ mes "life right now is that we";
+ mes "wake up, go to work, and at";
+ mes "the end of the day some of us";
+ mes "are injured while a few others";
+ mes "never come to work the next day.";
+ next;
+ mes "[Gushenmu]";
+ mes "And as Einbech and Einbroch";
+ mes "have grown, I hear more and";
+ mes "more rumors that unfammiliar";
+ mes "monsters are beginning to";
+ mes "swarm outside of town.";
+ mes "This is really Einbech's worst time...";
+ close;
+}
+
+einbech.gat,39,215,6 script Train Station Staff 852,{
+ mes "[Staff]";
+ mes "Welcome to";
+ mes "the Train Station.";
+ mes "The fare to take the";
+ mes "train to Einbroch is";
+ mes "200 zeny. Would";
+ mes "you like to ride?";
+ next;
+ menu "Yes.",L_YES,"No.",-;
+
+ mes "[Staff]";
+ mes "Please enjoy";
+ mes "your stay here";
+ mes "in Einbech.";
+ close;
+L_YES:
+ if(Zeny < 200)goto L_ZENY;
+ mes "[Staff]";
+ mes "Thank you and";
+ mes "we hope you enjoy";
+ mes "the ride. All aboard!";
+ next;
+ set Zeny,Zeny - 200;
+ warp "einbroch.gat",226,276;
+ end;
+L_ZENY:
+ mes "[Staff]";
+ mes "I'm sorry,";
+ mes "but you don't";
+ mes "have enough zeny";
+ mes "to pay the train fare.";
+ close;
+}
+
+einbech.gat,157,215,4 script Train Station Manager 852,{
+ mes "[Train Station Manager]";
+ mes "This train station";
+ mes "is strictly for trains";
+ mes "running from Einbech";
+ mes "to Einbroch. Please speak";
+ mes "to the staff in the 11 o' clock";
+ mes "direction if you'd like to board.";
+ close;
+}
+
+einbech.gat,129,234,6 script Hander 848,{
+ mes "[Hander]";
+ mes "Those Einbroch bastards!";
+ mes "Living off the resources we";
+ mes "dig up while we keep working";
+ mes "for them like suckers! Damn!";
+ next;
+ mes "[Hander]";
+ mes "Everyday, we risk our";
+ mes "freakin' lives just so we";
+ mes "can make a living! Why don't";
+ mes "the elders do something about";
+ mes "this, like raise our ore prices?";
+ next;
+ mes "[Hander]";
+ mes "The work schedule's";
+ mes "unreasonable, Cavitar's";
+ mes "wife was attacked by a mine";
+ mes "creature, the hospital's too";
+ mes "far away and we don't have";
+ mes "any food to eat! Why...?!";
+ close;
+}
+
+einbech.gat,128,238,6 script Mogan 848,{
+ mes "[Mogan]";
+ mes "Recently, there were a few";
+ mes "cave-ins where many miners";
+ mes "were injured. It was discussed";
+ mes "in the Town Council and in my";
+ mes "opinion, I think the miners dug";
+ mes "too deep and disturbed... ^FF0000it^000000.";
+ next;
+ mes "[Mogan]";
+ mes "Yes, they awoke Ungoliant,";
+ mes "the master of the caves that";
+ mes "has existed since ancient time.";
+ mes "I don't know how many more will";
+ mes "be victimised by Ungolian in the";
+ mes "future. There's no telling...";
+ next;
+ mes "[Mogan]";
+ mes "Adventurer, be careful";
+ mes "if you travel inside the";
+ mes "mines, lest your footsteps";
+ mes "distrub Ungoliant's slumber.";
+ close;
+}
+
+einbech.gat,130,253,2 script Ekuri 848,{
+ mes "[Ekuri]";
+ mes "Yo-heave-ho!";
+ mes "Yo-heave-ho~!";
+ next;
+ mes "[Ekuri]";
+ mes "What am I doing here?";
+ mes "heck, I'm scared to death";
+ mes "of entering the mine! But";
+ mes "I can make a living here at";
+ mes "the entrance by gathering";
+ mes "scrap metal! Smart, huh?";
+ next;
+ mes "[Ekuri]";
+ mes "Sometimes, I get lucky";
+ mes "and score an entire ore!";
+ mes "Sure, I'm a coward, but";
+ mes "at least I'm alive. Well,";
+ mes "for the time being.";
+ next;
+ mes "[Ekuri]";
+ mes "Now you know what";
+ mes "I'm doing here. So why";
+ mes "don't you leave me to";
+ mes "my work? Heave-ho!";
+ mes "Ores, come to me!";
+ close;
+}
+
+einbech.gat,148,242,5 script Jung 855,{
+ mes "[Jung]";
+ mes "I'm one of the few";
+ mes "people who's lived";
+ mes "in both Einbech and";
+ mes "Einbroch for a long time,";
+ mes "So I guess I'm one of the";
+ mes "best guides of this area.";
+ next;
+ mes "[Jung]";
+ mes "Say, if you're thinking of";
+ mes "entering the Mine Dungeon,";
+ mes "I can tell you all I know about";
+ mes "the monsters in that place so";
+ mes "that you'll be better prepared.";
+ next;
+ menu "Sure, why not?",L_TELL,"No, thanks.",-;
+ mes "[Jung]";
+ mes "I understand if you're";
+ mes "kind of in a hurry. Still,";
+ mes "if you're pretty new around";
+ mes "here, you should learn as";
+ mes "much as you can before";
+ mes "entering any dungeons.";
+ next;
+ mes "[Jung]";
+ mes "Alright then,";
+ mes "be safe on your";
+ mes "adventures, alright?";
+ close;
+L_TELL:
+ mes "[Jung]";
+ mes "Let's see. Ah, the monsters that";
+ mes "are unique to the Mine Dungeon";
+ mes "are Noxious, Venomous, Porcellio";
+ mes "and Obsidian. Wich one do you";
+ mes "want to know more about?";
+ next;
+ menu "Noxious and Venomous",-,"Porcellio",L_PORCELLIO,"Obsidian",L_OBSIDIAN;
+ mes "[Jung]";
+ mes "You know, no one seems";
+ mes "to know where Noxious and";
+ mes "Venomous have come form.";
+ mes "It's like they appeared out of";
+ mes "nowhere when Einbroch";
+ mes "started to industrialise.";
+ next;
+ mes "[Jung]";
+ mes "Now that I think about it,";
+ mes "I don't think they're naturally";
+ mes "created monsters. They have";
+ mes "this fixed look of despair and";
+ mes "suffering and tend to act like they";
+ mes "want their enemies to kill them.";
+ next;
+ mes "[Jung]";
+ mes "Still, you'd better be careful!";
+ mes "Careful! Nocious and Venomous";
+ mes "are stealthy monsters that can";
+ mes "glide quietly through the air";
+ mes "and attack you before";
+ mes "you even notice...";
+ next;
+ mes "[Jung]";
+ mes "You should know that";
+ mes "Noxious is Ghost property";
+ mes "and Venomous is Poison.";
+ mes "Both are medium sized,";
+ mes "formless monsters.";
+ next;
+ mes "[Jung]";
+ mes "Both of them drop Apple,";
+ mes "Dust Pollutant, Toxic Gas,";
+ mes "Poisonous Powder, Bacillus,";
+ mes "Mold Powder and Anodyne.";
+ next;
+ mes "[Jung]";
+ mes "That's all for now.";
+ mes "Feel free to ask me";
+ mes "if you have any questions";
+ mes "about monsters in the Mine";
+ mes "Dungeon. Be safe, adventurer.";
+ close;
+L_PORCELLIO:
+ mes "[Jung]";
+ mes "Porcellio is an insect that";
+ mes "lives in caves and drinks water";
+ mes "dripped from stalactites. It's";
+ mes "different from Ungoliant since";
+ mes "it likes to be near different";
+ mes "kinds of minerals and ores.";
+ next;
+ mes "[Jung]";
+ mes "Porcellio drops Jubilee,";
+ mes "Insect Leg, Single Cell,";
+ mes "Moss of Morning Dew, Neon";
+ mes "Liquid and a few other things";
+ mes "I can't quite remember.";
+ next;
+ mes "[Jung]";
+ mes "Lastly, Porcellio is an";
+ mes "Earth property monster.";
+ mes "That's all I know about it.";
+ mes "But if you want to know more";
+ mes "about some monster in the";
+ mes "Mine Dungeon, feel free to ask.";
+ close;
+L_OBSIDIAN:
+ mes "[Jung]";
+ mes "Do you know about the";
+ mes "belief that underground";
+ mes "minerlas that contain huge";
+ mes "amounts of energy actually";
+ mes "have souls? Obsidian is";
+ mes "one of these living rocks.";
+ next;
+ mes "[Jung]";
+ mes "Supposedly, just a piece of an";
+ mes "Obsidian in a Jung Processor has";
+ mes "enough energy to light up the night";
+ mes "sky. Unfortunately, it's impossible";
+ mes "to capture one alive and hunting";
+ mes "them isn't so easy.";
+ next;
+ mes "[Jung]";
+ mes "Obsidian is a small,";
+ mes "shapeless monster that";
+ mes "drops Clear Jewel, Piece of";
+ mes "Black Crystal, Coal, Elunium,";
+ mes "Iron and Steel.";
+ next;
+ mes "[Jung]";
+ mes "That's all for Obsidian.";
+ mes "If you have any questions";
+ mes "about other monsters living";
+ mes "in the Mine Dungeon, feel";
+ mes "free to ask me.";
+ close;
+}
+
+einbech.gat,148,246,5 script Franz 851,{
+ mes "[Franz]";
+ mes "So bored...";
+ mes "Starving for...";
+ mes "Conversation.";
+ mes "S-somebody...";
+ next;
+ mes "[Franz]";
+ mes "Hey, a traveller!";
+ mes "Are you planning to explore";
+ mes "the Mine Dungeon or the fields";
+ mes "around here? Let's chat for a bit";
+ mes "and maybe you'll learn something.";
+ next;
+ menu "Okay, fine.",L_OKAY,"No, thanks.",-;
+ mes "[Franz]";
+ mes "Oh, okay.";
+ mes "You're busy and have";
+ mes "things to do, I understand.";
+ mes "You probably have to head";
+ mes "off somewhere right away.";
+ mes "Right. Got it.";
+ next;
+ mes "[Franz]";
+ mes "I...";
+ mes "I've got stuff";
+ mes "I should be working";
+ mes "on. Yes. So very busy.";
+ close;
+L_OKAY:
+ mes "[Franz]";
+ mes "Ooh, have you heard";
+ mes "about the creature in the";
+ mes "Mine Dungeon or what's";
+ mes "happened in town recently?";
+ mes "Which would you like to";
+ mes "know more about?";
+ next;
+ menu "Creature of Mine Dungeon",L_CREATURE,"Town Incident",-;
+ mes "[Franz]";
+ mes "In Einbroch, there was";
+ mes "a short lived teddy bear";
+ mes "fad. However, a series of";
+ mes "mysterious accidents and";
+ mes "murders where entire families";
+ mes "were killed also occured.";
+ next;
+ mes "[Franz]";
+ mes "It turns out that every family";
+ mes "that had been murdered had";
+ mes "bought one of these teddy bears.";
+ mes "There were even rumors that these";
+ mes "teddy bears were comming to life.";
+ next;
+ mes "[Franz]";
+ mes "After an investigation, the";
+ mes "authorities learned that all the";
+ mes "merchants who sold these bears";
+ mes "had purchased them from the";
+ mes "same wholesaler, an outsider";
+ mes "noone knew anything about.";
+ next;
+ mes "[Franz]";
+ mes "Since the teddy bears were";
+ mes "clearly not made to be mere,";
+ mes "harmless toys, troops were";
+ mes "sent to secure all the teddy";
+ mes "bears and dispose of them";
+ mes "outside of town.";
+ next;
+ mes "[Franz]";
+ mes "But as soon as the teddy";
+ mes "bears were set outside of";
+ mes "town, they sprang to life and";
+ mes "started rioting! This is clear";
+ mes "proof that these bears are";
+ mes "controlled by some evil force.";
+ next;
+ mes "[Franz]";
+ mes "Now those aggressive teddy";
+ mes "bears are scattered all over";
+ mes "the place and the government";
+ mes "has classified them as monsters.";
+ mes "Kill with extreme prejudice!";
+ next;
+ mes "[Franz]";
+ mes "According to adventurers";
+ mes "who have caught these bears,";
+ mes "they're small, neutral monsters";
+ mes "which drop Honey, Screw, Well-baked";
+ mes "Cookie and Oridecon Hammer.";
+ next;
+ mes "[Franz]";
+ mes "That's all I know";
+ mes "about it. Watch out";
+ mes "for those bears if you";
+ mes "go exploring, okay? They";
+ mes "may be cute, but they're";
+ mes "known to be extremely vicious!";
+ close;
+L_CREATURE:
+ mes "[Franz]";
+ mes "The creature I'm talking about is";
+ mes "Ungoliant, which also called the";
+ mes "Master of the Caves around here.";
+ mes "It's said to live deep in the caves";
+ mes "where it giards peculiar ores and";
+ mes "minerals with strange powers.";
+ next;
+ mes "[Franz]";
+ mes "At first I thought it was";
+ mes "just an old fairy tale, but it";
+ mes "actually started appearing";
+ mes "again about ten years ago";
+ mes "when the tunnel cave-ins";
+ mes "started to happen.";
+ next;
+ mes "[Franz]";
+ mes "As sightings of Ungoliant";
+ mes "increased, more and more";
+ mes "tunnel cave-ins occured.";
+ mes "I guess the miners have";
+ mes "inadvertently intruded";
+ mes "into it's territory.";
+ next;
+ mes "[Franz]";
+ mes "According to legend,";
+ mes "ancient giants snuck into";
+ mes "a mine to steal coal from";
+ mes "humans. But they made too";
+ mes "much noise while they were";
+ mes "digging and awoke Ungoliant.";
+ next;
+ mes "[Franz]";
+ mes "When the miners went to work";
+ mes "the next morning, they found the";
+ mes "bloodied bodies of those giants.";
+ mes "After that, people have feared";
+ mes "the threat that Ungoliant poses";
+ mes "to anyone entering the mines.";
+ next;
+ mes "[Franz]";
+ mes "Now, an adventurer that";
+ mes "managed to kill an Ungoliant";
+ mes "has told me that it drops Ant's";
+ mes "Jaw, Colorful Shell, Very Hard";
+ mes "Shell, Long Leg, Neon Liquid";
+ mes "and Zircon.";
+ close;
+}
+
+einbech.gat,151,168,4 script Tollaf 854,{
+ mes "[Tollaf]";
+ mes "Ah...!";
+ mes "This is killing me!";
+ mes "I don't have the money";
+ mes "to move, but I don't wanna";
+ mes "live in this town anymore!";
+ next;
+ mes "[Tollaf]";
+ mes "People everywhere else";
+ mes "live so much better than we";
+ mes "do, especially those snobs in";
+ mes "Einbroch! Einbech must be the";
+ mes "worst town of Schwartzwald Republic.";
+ mes "No, it's the worst in the world!";
+ close;
+}
+
+einbech.gat,149,154,4 script Mjunia 850,{
+ mes "[Mjunia]";
+ mes "It's hard being a woman";
+ mes "in this town, By being born";
+ mes "here, it's like fate just decided";
+ mes "to be especially cruel to me.";
+ next;
+ mes "[Mjunia]";
+ mes "My skin and hands are";
+ mes "rough from all the work";
+ mes "I have to do. But worst of";
+ mes "all... I... I... I've developed";
+ mes "bigger muscles than most";
+ mes "guys! Waaaaaah~!";
+ next;
+ mes "[Mjunia]";
+ mes "I wish I could find";
+ mes "a nice guy from Einbroch";
+ mes "and get married so I can";
+ mes "get away from this town.";
+ mes "But it doesn't look like";
+ mes "that wil happen...";
+ next;
+ mes "[Mjunia]";
+ mes "And I'd never marry";
+ mes "anyone from Einbech!";
+ mes "I'd rather die cold and";
+ mes "alone than cold and married";
+ mes "to some Einbech hooligan.";
+ next;
+ mes "[Mjunia]";
+ mes "Look at these";
+ mes "muscles. What do";
+ mes "you think? Am I pretty?";
+ mes "*Sniff* I gave up trying";
+ mes "to be feminine years ago.";
+ mes "I have to work so hard...";
+ close;
+}
+
+einbech.gat,176,125,4 script Ellhenje 850,{
+ mes "[Ellhenje]";
+ mes "Things might be";
+ mes "bad in this town";
+ mes "with the pollution";
+ mes "and the bullying";
+ mes "from Einbroch...";
+ next;
+ mes "[Ellhenje]";
+ mes "But somehow, people";
+ mes "are able to get by. That's";
+ mes "because there's a guy";
+ mes "that everyone here likes...";
+ next;
+ mes "[Ellhenje]";
+ mes "I'm talking about Clitzer!";
+ mes "He's almost too honest and";
+ mes "almost too diligent. But most";
+ mes "of all, he's the nicest guy~";
+ next;
+ mes "[Ellhenje]";
+ mes "Clitzer was born in one of";
+ mes "Einbech's poorest families,";
+ mes "but he's usually happy and always";
+ mes "thinks about others. I guess that's";
+ mes "why people like to think of him";
+ mes "as representing all of Einbech.";
+ next;
+ mes "[Ellhenje]";
+ mes "Recently, something's";
+ mes "been bothering him. I'm";
+ mes "not sure, but I think only";
+ mes "woman troubles could make";
+ mes "a guy feel so glum. I hope he";
+ mes "feels better soon...";
+ close;
+}
+
+einbech.gat,172,113,4 script Nemuk 855,{
+ mes "[Nemuk]";
+ mes "You seem to be an";
+ mes "outsider, so let me";
+ mes "ask you something.";
+ mes "What do you think";
+ mes "of Einbech?";
+ next;
+ menu "It's fine.",L_FINE,"It looks tough to live here.",-;
+ mes "[Nemuk]";
+ mes "I thought so.";
+ mes "Well, I appologize if";
+ mes "I put you on the spot.";
+ next;
+ mes "[Nemuk]";
+ mes "Everyone here has been";
+ mes "having a tough time just";
+ mes "living day to day for as long";
+ mes "as I can remember. It's like";
+ mes "things never seem to get any";
+ mes "better, no matter what we do.";
+ next;
+ mes "[Nemuk]";
+ mes "I really want to leave,";
+ mes "but it's just an empty";
+ mes "wish. My body is trapped";
+ mes "here while my heart longs";
+ mes "for a much better life. *Sigh*";
+ mes "Is it hopeless? What can I do?";
+ close;
+L_FINE:
+ mes "[Nemuk]";
+ mes "Huh...?";
+ mes "I'm not sure what";
+ mes "you've seen, but I'm";
+ mes "surprised to hear you";
+ mes "say something like that.";
+ next;
+ mes "[Nemuk]";
+ mes "It's been ten years since";
+ mes "I've started to think about";
+ mes "moving out. However, I'm still";
+ mes "debating it. Now, if I were rich,";
+ mes "I'd leave in no time, but it's hard";
+ mes "getting the money to move out.";
+ next;
+ mes "[Nemuk]";
+ mes "*Sigh...*";
+ mes "Maybe if I had been";
+ mes "and adventurer when I was";
+ mes "younger, I wouldn't have";
+ mes "these problems today...";
+ close;
+}
+
+ein_in01.gat,281,85,2 script Drunken Man#01 849,{
+ mes "[Drunken Man]";
+ mes "...*Hiccup*...";
+ mes "*Hiccup*...";
+ mes "*Yawn*.....";
+ mes ".................";
+ mes "..*Hiccup*.....";
+ mes "*Hiccup*..";
+ close;
+}
+
+ein_in01.gat,277,95,8 script Ryan Danger 855,{
+ mes "[R.D. kim]";
+ mes "Oooh...";
+ next;
+ mes "[R.D. kim]";
+ mes "Oooh...";
+ mes "Momma.";
+ next;
+ mes "[R.D. kim]";
+ mes "Oooh...";
+ mes "Momma.";
+ mes "You are so...";
+ next;
+ mes "[R.D. kim]";
+ mes "Oooh...";
+ mes "Momma.";
+ mes "You are so...";
+ mes "^FF0000Hot^000000!";
+ next;
+ mes "[R.D. kim]";
+ mes "Why don't you take off";
+ mes "those heavy, uncomfortable";
+ mes "clothes? I'll buy you whatever";
+ mes "you want, it's on me! C'mon~";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "N-no...!";
+ mes "I-I-I-I...";
+ mes "(this is the";
+ mes "shadiest guy";
+ mes "I've ever seen!)";
+ next;
+ mes "[R.D. kim]";
+ mes "Hm? No...?";
+ mes "Absolutely no?";
+ mes "Are you sure?";
+ mes "Alright, alright.";
+ mes "I'm sorry, I apologize.";
+ mes "I was totally out of line.";
+ next;
+ mes "[R.D. kim]";
+ mes "...";
+ mes "Or am I?";
+ mes "Bwahahahaha!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "(Th-this guy";
+ mes "must be drunk, out";
+ mes "of his freakin' mind)";
+ close;
+}
+
+ein_in01.gat,279,92,2 script Tavern Lady 854,{
+ mes "[Tavern Lady]";
+ mes "most Einbech men are";
+ mes "crude and primitive male";
+ mes "chauvinists! They disgust me!";
+ next;
+ mes "[Tavern Lady]";
+ mes "I mean, there's nothing";
+ mes "good about them! They're";
+ mes "wild, violent, simple minded";
+ mes "and ignorant. They settle all";
+ mes "their arguments with brawn";
+ mes "and they're so... close minded!";
+ next;
+ mes "[Tavern Lady]";
+ mes "How can they not know";
+ mes "that women want gentle,";
+ mes "sensitive men with whom";
+ mes "they can share their feelings";
+ mes "and drink chamille tea over";
+ mes "freshly knit doillies?";
+ close;
+}
+
+einbech.gat,197,139,4 script Young Man#05 855,{
+ mes "[Heinz]";
+ mes "Wow...";
+ mes "And adventurer from";
+ mes "Rune-Midgard, eh?";
+ mes "What brings you here?";
+ next;
+ mes "[Heinz]";
+ mes "Einbech doesn't offer much";
+ mes "in terms of sight-seeing, but";
+ mes "have you come to see the mine?";
+ mes "Right now, it's swarming with";
+ mes "monsters and we can't dig any";
+ mes "ores because it's so dangerous.";
+ next;
+ mes "[Heinz]";
+ mes "Now, if some adventurers were";
+ mes "generous enough to hunt down";
+ mes "those evil creatures, we'd be able";
+ mes "to mine again and they could earn";
+ mes "some extra zeny. It's like killing";
+ mes "two birds with one stone. Hahaha!";
+ next;
+ mes "[Heinz]";
+ mes "Oh wait... I'm sorry.";
+ mes "I don't know what's wrong";
+ mes "with me, asking complete";
+ mes "strangers to do favors for";
+ mes "me. It's completely rude!";
+ mes "I mean, who would do that?";
+ next;
+ mes "[Heinz]";
+ mes "But... I'm beyond caring";
+ mes "about my pride. For the sake";
+ mes "of all that is good and holy, I'm";
+ mes "begging you, please kill thise foul";
+ mes "and evil creatures. Please!!";
+ close;
+}
+
+
+ein_in01.gat,192,90,2 script Supineque 849,{
+ mes "[Supineque]";
+ mes "Ugh...";
+ mes "I'm starving!";
+ next;
+ mes "[Supineque]";
+ mes "I haven't had food for so";
+ mes "long that my stomach is";
+ mes "beginning to digest itself!";
+ mes "This is horrible...";
+ next;
+ mes "[Supineque]";
+ mes "I mean, I have";
+ mes "food that I can";
+ mes "eat today. But if";
+ mes "I finish it, what am";
+ mes "I gonna eat tomorrow?";
+ close;
+}
+
+ein_in01.gat,208,86,3 script Decii 855,{
+ mes "[Decii]";
+ mes "This is so";
+ mes "frustating!";
+ mes "I'm surrounded";
+ mes "by all these ^FF0000people^000000!";
+ next;
+ mes "[Decii]";
+ mes "There's absolutely";
+ mes "no privacy in a town";
+ mes "this crowded! I guess";
+ mes "I should try to move";
+ mes "out as soon as I can.";
+ close;
+}
+
+einbech.gat,216,118,4 script Catzllanpu 854,{
+ mes "[Catzllanpu]";
+ mes "*Sigh...* ";
+ mes "Simple pleasures.";
+ mes "They're what makes";
+ mes "life worth living,";
+ mes "you know?";
+ next;
+ mes "[Catzllanpu]";
+ mes "It's enough for me just to";
+ mes "live a normal and happy life,";
+ mes "but everyone around me wants";
+ mes "to work harder and harder. If";
+ mes "you never take a rest, you're";
+ mes "killing yourself pretty slowly.";
+ next;
+ mes "[Catzllanpu]";
+ mes "I guess you can tell that";
+ mes "I don't have the worries";
+ mes "other people have about";
+ mes "money. It's great, but it's";
+ mes "not worth sacrificing the";
+ mes "quality of your life, right?";
+ close;
+}
diff --git a/npc/cities/einbroch.txt b/npc/cities/einbroch.txt
index ffd0e0f95..06d543eda 100644
--- a/npc/cities/einbroch.txt
+++ b/npc/cities/einbroch.txt
@@ -1,968 +1,968 @@
-//===== eAthena Script =======================================
-//= Einbroch Town
-//===== By: ==================================================
-//= Nexon
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena Revision 3000+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 0.2 Added some NPCs [MasterOfMuppets]
-//= 0.3 Added a few npcs by reddozen [MasterOfMuppets]
-//= 0.4 Added a crappy quest, have fun guys... [MasterOfMuppets]
-//= 0.4a Added exp bonus for the factory quest, borrowed from a Korean fansite.
-//= 0.4b Added missing close [Komurka]
-//= 0.5 Added Temporal Locations of Gunslinger Job Change map.
-//= Info provided by RockmanEXE [erKURITA]
-//= 0.6 Implemented a crap quest [MasterOfMuppets]
-//= 0.7 Implemented an inn NPC [MasterOfMuppets]
-//= 0.8 Implemented the Shinokas quest, thanks to [MasterOfMuppets]
-//= Dj-Yhn for scripting it.
-//= 0.9 Removed Duplicates [Silent]
-//= 1.0 Implemented the Lover's quest. [MasterOfMuppets]
-//= 1.1 Split quests into quests/cities_einbroch.txt [Evera]
-//= 1.2 Split more quests into above file [Evera]
-//= 1.3 Added (finally) the Garrison quest npc [erKURITA]
-//= 1.4 Implemented the polution script. [MasterOfMuppets]
-//============================================================
-
-
-//== some boards, signs ======================
-einbroch.gat,220,208,5 script Notice Board#01 858,{
- mes "[Weapon Shop Entrance]";
- close;
-}
-
-einbroch.gat,183,174,5 script Bulletin Board#01 858,{
- mes "East - Weapon Shop, Hotel";
- mes "South - Factory";
- mes "Southwest - Airship Repair Shop,";
- mes "Laboratory";
- mes "Northwest - Airport";
- close;
-}
-
-einbroch.gat,244,255,5 script Bulletin Board#02 858,{
- mes " ";
- mes " Train Station";
- close;
-}
-
-einbroch.gat,68,206,5 script Bulletin Board#03 858,{
- mes " ";
- mes " Airship Airport";
- close;
-}
-
-einbroch.gat,162,256,5 script Bulletin Board#04 858,{
- mes "East - Train Station";
- mes "Southeast - Hotel";
- mes "South - Weapon Shop, Factory";
- mes "Southwest - Airport, Airship Repair";
- mes "Shop, Laboratory";
- close;
-}
-
-einbroch.gat,235,141,5 script Bulletin Board#05 858,{
- mes "Southwest- Airship Repair Shop,";
- mes "Laboratory";
- mes "Northwest- Airport";
- mes "Northwest- Weapon Shop, Hotel, Train";
- mes "Station";
- close;
-}
-
-//===== Town NPC ===========================================
-function script Ein_Tower {
- mes "["+ @Tower_Name$ +"]";
- mes "Good day~";
- mes "I'm " + @Tower_Name$ +", your";
- mes "guide to exploring";
- mes "the Einbroch Tower.";
- next;
- mes "["+ @Tower_Name$ +"]";
- mes "Einbroch Tower offers";
- mes "the best view of our city";
- mes "and it's a great place to";
- mes "meet with friends or take";
- mes "a date. The Einbroch Tower";
- mes "admission fee is 10 zeny.";
- next;
- mes "["+ @Tower_Name$ +"]";
- mes "Right now, we're offering";
- mes "a special promotion called";
- mes "the Apple Combo Set for only";
- mes "20 zeny. This set includes";
- mes "Einbroch Tower admission";
- mes "and an Apple to snack on.";
- next;
- menu "Tower Admission Only",s_Tower,"Apple Combo Set",s_Apple,"Cancel",-;
-
- mes "["+ @Tower_Name$ +"]";
- mes "I see.";
- mes "Feel free to";
- mes "come back any";
- mes "time. Thank you.";
- close2;
- return;
-
-s_Tower:
- if(Zeny < 10)goto s_NEnough;
- set Zeny,Zeny - 10;
-s_Tower2:
- mes "["+ @Tower_Name$ +"]";
- mes "Thank you for";
- mes "using our services.";
- mes "Let me guide you to";
- mes "the tower right away.";
- close2;
- warp "einbroch.gat",174,204;
- return;
-
-s_Apple:
- if(Zeny < 20)goto s_NEnough;
- set Zeny,Zeny - 20;
- mes "["+ @Tower_Name$ +"]";
- mes "Before I guide you to";
- mes "the tower, let me check";
- mes "your status to insure";
- mes "your safety before I give";
- mes "you the Apple Combo Set.";
- next;
- getitem 512,1;
- goto s_Tower2;
-
-s_NEnough:
- mes "["+ @Tower_Name$ +"]";
- mes "I'm sorry but you don't";
- mes "have enough zeny for the";
- mes "requested service.";
- close2;
- return;
-}
-
-einbroch.gat,176,172,5 script Khemko 855,{
- set @Tower_Name$,"Khemko";
- callfunc "Ein_Tower";
- end;
-
-OnHide:
- specialeffect 16;
- disablenpc "Khemko";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,218,198,5 script Mark 855,{
- set @Tower_Name$,"Mark";
- callfunc "Ein_Tower";
- end;
-
-OnHide:
- specialeffect 16;
- disablenpc "Mark";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,174,228,5 script Oberu 855,{
- set @Tower_Name$,"Oberu";
- callfunc "Ein_Tower";
- end;
-
-OnHide:
- specialeffect 16;
- disablenpc "Oberu";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,175,196,5 script Morei 854,{
- mes "[Morei]";
- mes "Greetings,";
- mes "I am Morei,";
- mes "Assistant Guide";
- mes "of Einbroch Tower.";
- next;
- mes "[Morei]";
- mes "If you wish to return";
- mes "to the ground floor,";
- mes "please let me know.";
- mes "Would you like to go";
- mes "back to ground level?";
- next;
- menu "Yes.",s_Goback,"No.",-;
-
- mes "[Morei]";
- mes "I see.";
- mes "I hope you";
- mes "enjoy your time";
- mes "in Einbroch Tower.";
- close;
-s_Goback:
- mes "[Morei]";
- mes "I see.";
- mes "Let me lead you";
- mes "to the ground floor.";
- mes "Thank you for using";
- mes "our services.";
- close2;
- switch(rand(3)){
- case 0:
- warp "einbroch.gat",218,196;
- end;
- case 1:
- warp "einbroch.gat",178,172;
- end;
- case 2:
- warp "einbroch.gat",172,228;
- end;
- }
-
-OnHide:
- specialeffect 16;
- disablenpc "Morei";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,208,208,3 script Kesunboss 850,{
- mes "[Kesunboss]";
- mes "Lady Calla is the";
- mes "epitome of elegance,";
- mes "a veritable goddess";
- mes "of Einbroch";
- next;
- mes "[Kesunboss]";
- mes "Her gentle voice,";
- mes "that angelic smile, her";
- mes "kindness and warmth";
- mes "towards other people";
- mes "and above all...";
- next;
- mes "[Kesunboss]";
- mes "Calla's family";
- mes "is wealthy beyond";
- mes "imagination! She's";
- mes "perfect! I don't know who";
- mes "she'll marry, but he'd be";
- mes "a lucky gentleman, I'm sure.";
- next;
- mes "[Kesunboss]";
- mes "Lady Calla lives in a magnificent";
- mes "mansion that makes other houses";
- mes "look like schacks in comparison.";
- mes "Head north and then west from";
- mes "here if you wish to marvel in its";
- mes "beauty and elegance.";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Kesunboss";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,232,255,5 script Khowropher 847,{
- mes "[Khowropher]";
- mes "^6A6A6A*Cough cough*^000000";
- mes "Jiminy! The air here";
- mes "is so thick and grimy!";
- mes "And it's worse for us old";
- mes "people with breathing";
- mes "problems! ^111111*Haaack*^000000";
- next;
- mes "[Khowropher]";
- mes "I don't care if they keep";
- mes "building more and more";
- mes "factories and homes in this";
- mes "town. Still, I'd like to spend";
- mes "the rest of my life somewhere";
- mes "quiet and with clean air...";
- next;
- mes "[Khowropher]";
- mes "Then again, Einbroch is my";
- mes "hometown and I can't just up";
- mes "and leave. I suppose it's my";
- mes "fate to suffer from this fould air";
- mes "until the day I die.^6A6A6A*Sigh...*";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Khowropher";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-
-}
-
-einbroch.gat,259,327,5 script Leslie 846,{
- mes "[Leslie]";
- mes "^6A6A6A*Cough cough*^000000";
- mes "Laaaand sakes!";
- next;
- mes "[Leslie]";
- mes "An old woman like me";
- mes "can't breathe this air! How";
- mes "do people even live in all this";
- mes "smog? Sure, the air in Einbech";
- mes "isn't pristine, but the air here in";
- mes "Einbroch is much worse! ^111111*Cough~!*^000000";
- next;
- mes "[Leslie]";
- mes "I hate coming here";
- mes "sometimes! The air is";
- mes "totally polluted and this";
- mes "city is full of stuck up";
- mes "pricks! But they sell stuff";
- mes "here I can't buy back home...";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Leslie";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,232,272,3 script Train Station Staff#01::EinbrochTrain 852,{
- mes "[Staff]";
- mes "Welcome to";
- mes "the Train Station.";
- mes "Trains to Einbech";
- mes "are always running";
- mes "so if you miss one,";
- mes "it's no problem.";
- next;
- mes "[Staff]";
- mes "The fare to board the";
- mes "train that runs the Einbroch";
- mes "to Einbech line is 200 zeny.";
- mes "Would you like to buy a ticket?";
- next;
- menu "Yes.",s_Yes,"No.",-,"About the Enviroment...",s_Enviroment;
-
- mes "[Staff]";
- mes "Very well, then.";
- mes "Please enjoy your";
- mes "stay in Einbroch.";
- close;
-s_Yes:
- mes "[Staff]";
- if(Zeny < 200){
- mes "I'm sorry but you";
- mes "do not have enough";
- mes "money to pay the fee.";
- close;
- }
- set Zeny,Zeny - 200;
- mes "Thank you";
- mes "very much.";
- mes "Have a safe trip.";
- mes "^111111*Ahem*^000000 All aboard!";
- close2;
- warp "einbech.gat",43,215;
- end;
-s_Enviroment:
- mes "[Staff]";
- mes "Einbroch is infamous for";
- mes "its air pollution, no doubt";
- mes "caused by the industrial";
- mes "facilities located here.";
- mes "it's really horrible...";
- next;
- mes "[Staff]";
- mes "Sometimes the air pollution";
- mes "gets so bad that it becomes";
- mes "hard to breathe. If you hear";
- mes "the Einbroch Smog Alert, you";
- mes "should find shelter immediately!";
- close;
-
-OnHide:
- specialeffect 16;
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,252,301,3 duplicate(EinbrochTrain) Train Station Staff#02 852
-
-einbroch.gat,228,121,5 script Little Toby 855,{
- mes "[Little Toby]";
- mes "Excuse me...";
- mes "But I'm lost!";
- mes "I can't find my";
- mes "mom or dad!";
- next;
- mes "[Little Toby]";
- mes "A-am I at the airport?!";
- mes "My parents are suposed";
- mes "to come get me, but I still";
- mes "haven't found them! We just";
- mes "moved here, so i dont know";
- mes "where anything is!";
- next;
- mes "[Little Toby]";
- mes "W-wait!";
- mes "Where are you";
- mes "going?! Dont leave";
- mes "me, I'm all alone...!";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Little Toby";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,229,149,3 script Sleik 854,{
- mes "[Sleik]";
- mes "Surprisingly, we have";
- mes "a Train Station that everyone";
- mes "has been calling a victory for";
- mes "science. I mean, shouldn't we";
- mes "be more amazed by the airship";
- next;
- mes "[Sleik]";
- mes "Now, if you want to know";
- mes "where the train actually goes";
- mes "I wouldn't be able to tell you.";
- mes "After all, I never rode it. But";
- mes "still, I guess having our own";
- mes "Train Station is a good thing";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Sleik";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-einbroch.gat,236,191,3 script Tan 855,{
- mes "[Tan]";
- mes "All the factories";
- mes "here in Einbroch are";
- mes "causing a serious air";
- mes "pollution problem.";
- next;
- mes "[Tan]";
- mes "I'm an Airship engineer and";
- mes "everyday, all day long, I deal";
- mes "with oil stains and all sorts";
- mes "of pollutants. i'm supprised";
- mes "I havn't gotten sick yet...";
- next;
- mes "[Tan]";
- mes "Still, I try to be careful";
- mes "when I can. Whenever I go";
- mes "out into the city's red fog,";
- mes "I always wear my Flu Mask.";
- mes "If you'll be here a while,";
- mes "you should carry one with you.";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Tan";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-ein_in01.gat,31,217,3 script Cendadt 851,{
-
- mes "[Cendadt]";
- mes "This factory has a lot";
- mes "of things that need fixing,";
- mes "pronto! I'm amazed that";
- mes "the place is still operating!";
- next;
- mes "[Cendadt]";
- mes "Lucky for us, I head that";
- mes "some altruistic adventurers";
- mes "have been donating materials";
- mes "to help keep this factory from";
- mes "falling apart... Or worse.";
- mes "But that's just a rumor.";
- next;
- mes "[Cendadt]";
- mes "^6A6A6A*Sigh*^000000";
- mes "Even if it is true,";
- mes "there's nothing no one";
- mes "here can do. Nobody has";
- mes "the courage to challenge";
- mes "the system, you know?";
- next;
- mes "[Cendadt]";
- mes "I...";
- mes "I better get";
- mes "back to work";
- mes "before I get";
- mes "in trouble...";
- close;
-
-}
-
-ein_in01.gat,36,204,3 script Rombell 851,{
-
- mes "[Rombell]";
- mes "It's great that the";
- mes "factory is making good";
- mes "business and drawing";
- mes "in a lot of profit, but I still";
- mes "have one major convern.";
- next;
- mes "[Rombell]";
- mes "The ammount of pollution";
- mes "that this place is causing";
- mes "is horrific! We've got these";
- mes "machines blowing out toxic";
- mes "gas all day long! The air";
- mes "can't be safe for very long...";
- next;
- mes "[Rombell]";
- mes "I mean, the air we're";
- mes "breathing right now is";
- mes "pretty foul and things";
- mes "are only going to get";
- mes "worse. How can we";
- mes "solve this problem?";
- close;
-
-}
-
-ein_in01.gat,49,202,3 script Dorf 851,{
-
- mes "[Dorf]";
- mes "machines are sooo";
- mes "convenient. Just look";
- mes "at this contraption easily";
- mes "do tasks that'd be tough";
- mes "for me to finish alone";
- next;
- mes "[Dorf]";
- mes "Now this is what";
- mes "I call technology!";
- mes "Sure, it takes effort and";
- mes "money to make one of";
- mes "these, but what do I care?";
- next;
- mes "[Dorf]";
- mes "I've got no problems,";
- mes "so long as this freaking";
- mes "thing keeps working the";
- mes "way I want it to!";
- close;
-
-}
-
-ein_in01.gat,48,220,3 script Lowe 851,{
-
- mes "[Lowe]";
- mes "...";
- next;
- mes "[Lowe]";
- mes "...";
- mes "......";
- next;
- mes "[Lowe]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Lowe]";
- mes "Hey. Why are you";
- mes "looking at me like";
- mes "that? There's no idle";
- mes "chatting allowed at work.";
- mes "If Canphotii catches";
- mes "you, you'll be punished";
- next;
- mes "[Lowe]";
- mes "Oh wait...";
- mes "You don't work here.";
- mes "I appologize, that kind";
- mes "of reaction's an old";
- mes "habit for me, adventurer.";
- close;
-
-}
-
-ein_in01.gat,43,253,4 script Canphotii 852,{
-
- mes "[Canphotii]";
- mes "Hustle, hustle!";
- mes "Pick up the pace!";
- mes "Anyone working too";
- mes "slowly will be punished!";
- next;
- mes "[Canphotii]";
- mes "Can't you understand";
- mes "that?! Now go to your";
- mes "station and get back to";
- mes "work! Wait, are you even";
- mes "an employee? If not, then";
- mes "stop wandering around!";
- next;
- mes "[Canphotii]";
- mes "You're not supposed";
- mes "to be able to get in here!";
- mes "I can't believe they let you";
- mes "in! This requires extreme";
- mes "disciplinary action!";
- close;
-
-}
-
-ein_in01.gat,68,209,4 script Khashurantze 852,{
-
- mes "[Khashurantze]";
- mes "I'm sorry, but you need";
- mes "special authority in order";
- mes "to enter this place. I'll have";
- mes "to ask you to leave right now.";
- if(EinFactory > 0){
- next;
- mes "[Khashurantze]";
- mes "Oh? Mr. Zelmeto asked you to help out?";
- mes "In that case excuse me.";
- close;
- }
- close2;
- warp "einbroch.gat",179,63;
- end;
-
-}
-
-ein_in01.gat,113,211,3 script Treinz 851,{
-
- mes "[Treinz]";
- mes "If you just pay me money,";
- mes "I'll be your slave! There's";
- mes "nothing I won't do! Anything";
- mes "is fair game. Hell, I'll get buck";
- mes "naked if you pay me enough.";
- next;
- mes "[Treinz]";
- mes "If you pay me what I'm";
- mes "worth, I'll work hard at";
- mes "any task you set me to.";
- mes "Sure, mining's rough, but";
- mes "as long as the zeny's coming";
- mes "in, I'm happy. Heh heh heh~";
- close;
-}
-
-ein_in01.gat,84,218,3 script Tsuen 851,{
-
- mes "[Tsuen]";
- mes "There was a time";
- mes "when I dreamed of";
- mes "being an adventurer,";
- mes "just like you. But that";
- mes "was a long time ago...";
- next;
- mes "[Tsuen]";
- mes "Now, I'm nothing but";
- mes "a factory manager. Still,";
- mes "even if my job's not that";
- mes "great, I'm pretty satisifed.";
- mes "I'm sure people enjoy the";
- mes "products I oversee and all...";
- next;
- mes "[Tsuen]";
- mes "Maybe my life was meant";
- mes "to be this way, even if it's";
- mes "not how I planned it. But the";
- mes "time will come when I up and";
- mes "leave and travel the world";
- mes "once I get my chance!";
- next;
- mes "[Tsuen]";
- mes "I hope the day will";
- mes "come when I can meet";
- mes "you out in that big wide";
- mes "world and greet you as";
- mes "a fellow adventurer.";
- close;
-}
-
-ein_in01.gat,85,261,3 script Zherin 851,{
-
- mes "[Zherin]";
- mes "I'm in charge of this";
- mes "blast furnace which";
- mes "contains all of this";
- mes "boiling magma.";
- next;
- mes "[Zherin]";
- mes "Even though it doesn't";
- mes "require actual labor, this";
- mes "job is pretty tiring. I've got";
- mes "to pay careful attention all";
- mes "the time. It's pretty stressful.";
- next;
- mes "[Zherin]";
- mes "Still, I'm proud of my job";
- mes "since I have the responsibility";
- mes "of ensuring employee safety.";
- mes "Anyway, don't get too close";
- mes "to the furnace. It won't do if";
- mes "you get burned on accident!";
- close;
-}
-
-ein_in01.gat,64,271,3 script Vonstein 851,{
-
- mes "[Vonstein]";
- mes "Staring at this";
- mes "bubbling hot liquid";
- mes "metal gives me a good";
- mes "feeling inside. It's like";
- mes "that stuff can melt anything!";
- next;
- mes "[Vonstein]";
- mes "Imagine covering an";
- mes "entire street of people";
- mes "with that stuff! Bwahah--";
- mes "Oh, I'm sorry if I'm talking";
- mes "crazy talk! I'm just kidding~";
- close;
-}
-
-ein_in01.gat,33,275,9 script Pevtatin 848,{
-
- mes "[Pevtatin]";
- mes "Good god!";
- mes "I'm so stressed!";
- mes "It's been nonstop";
- mes "since I moved here!";
- next;
- mes "[Pevtatin]";
- mes "The work is tough and";
- mes "already the boss hates";
- mes "me! I didn't move here";
- mes "for this! Still, the pay is";
- mes "decent so I guess I should";
- mes "endure just a little longer.";
- next;
- mes "[Pevtatin]";
- mes "Here goes...!";
- mes "Yo-heave-ho!";
- mes "Yo-heave-ho~!";
- close;
-}
-
-ein_in01.gat,87,237,3 script Dinje 850,{
-
- mes "[Dinje]";
- mes "Do you know why a woman";
- mes "like me has to work in this";
- mes "factory? I'll tell you why...";
- next;
- mes "[Dinje]";
- mes "My lazy husband, Gesin,";
- mes "is just lying there on the";
- mes "ground! So I have to work";
- mes "in order to support us!";
- next;
- mes "[Dinje]";
- mes "We can't rest for even";
- mes "a second if we want to save";
- mes "enough money to become";
- mes "wealthy and powerful some";
- mes "day. Don't you understand?";
- next;
- mes "[Dinje]";
- mes "Well, my husband obviously";
- mes "doesn't! How can he not know";
- mes "how the real world works?!";
- mes "Hey, kick his ass for me if";
- mes "he doesn't wake up soon!";
- close;
-}
-
-ein_in01.gat,103,238,9 script Gesin 849,{
-
- mes "[Gesin]";
- mes "Arrgh!";
- mes "This is killing me!";
- mes "Why should I be rich?!";
- mes "What's wrong with living";
- mes "within our means?";
- next;
- mes "[Gesin]";
- mes "I've got no problem";
- mes "with my current way";
- mes "of life, but the old ball";
- mes "and chain disagrees.";
- mes "Why is she so obsessed";
- mes "with riches and power?";
- next;
- mes "[Gesin]";
- mes "Well, in any case, I'd";
- mes "like to help her, but I can't";
- mes "get up! I'm exhausted and";
- mes "my body is just overtaxed.";
- mes "I have no strength at all.";
- next;
- mes "[Gesin]";
- mes "This is horrible~";
- mes "I should be resting";
- mes "instead of worrying";
- mes "about making money...";
- close;
-}
-
-einbroch.gat,188,72,3 script Keneshiotz 855,{
-
- mes "[Keneshiotz]";
- mes "This city is full of sky";
- mes "high smokestacks and";
- mes "the droning hum of machines.";
- next;
- mes "[Keneshiotz]";
- mes "Sure, the air is polluted,";
- mes "but I think it's a fair price";
- mes "to pay for wealth and a";
- mes "modern life of comfort.";
- mes "Screw the environment!";
- next;
- mes "[Keneshiotz]";
- mes "I'd much rather live like";
- mes "this than end up like those";
- mes "backwards vagrants in that";
- mes "filthy Einbech. Don't they";
- mes "know that money makes";
- mes "the world go 'round?";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Keneshiotz";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-ein_in01.gat,206,224,2 script Hotel Employee 855,{
-
- mes "[Hotel Employee]";
- mes "Good day, welcome to the";
- mes "Einbroch Hotel. The staff is";
- mes "always striving to accomodate";
- mes "our guests with the highest";
- mes "standards in cleanliness,";
- mes "service and convenience~";
- next;
- menu "Save",s_Save,"Take Rest- 5,000 zeny",s_Rest,"Cancel",-;
-
- mes "[Hotel Employee]";
- mes "Thank you and";
- mes "please come again~";
- close;
-
-s_Save:
- savepoint "ein_in01.gat",199,224;
- mes "[Hotel Employee]";
- mes "Your Respawn Point";
- mes "has been saved here";
- mes "in the Einbroch Hotel.";
- mes "Thank you, and please";
- mes "come again.";
- next;
- mes "[Hotel Employee]";
- mes "Have a good day.";
- close;
-
-s_Rest:
- mes "[Hotel Employee]";
- if(Zeny < 5000){
- mes "I'm sorry but";
- mes "you don't seem";
- mes "to have enough zeny.";
- close;
- }
- mes "Thank you.";
- mes "Please enjoy";
- mes "your rest~";
- close2;
- set zeny,zeny - 5000;
- warp "ein_in01.gat",272,167;
- percentheal 100,100;
- end;
-
-}
-
-ein_in01.gat,21,147,4 script Megass 853,3,3,{
- end;
-
-OnTouch:
- mes "[Megass]";
- mes "How dare you...";
- mes "A vagabond like";
- mes "you setting foot";
- mes "into my home!?";
- mes "Unthinkable!";
- next;
- mes "[Megass]";
- mes "Leave immediately";
- mes "before I report you";
- mes "to the authorities";
- mes "for trespassing!";
- close2;
- warp "einbroch.gat",112,245;
- end;
-}
-
+//===== eAthena Script =======================================
+//= Einbroch Town
+//===== By: ==================================================
+//= Nexon
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena Revision 3000+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 0.2 Added some NPCs [MasterOfMuppets]
+//= 0.3 Added a few npcs by reddozen [MasterOfMuppets]
+//= 0.4 Added a crappy quest, have fun guys... [MasterOfMuppets]
+//= 0.4a Added exp bonus for the factory quest, borrowed from a Korean fansite.
+//= 0.4b Added missing close [Komurka]
+//= 0.5 Added Temporal Locations of Gunslinger Job Change map.
+//= Info provided by RockmanEXE [erKURITA]
+//= 0.6 Implemented a crap quest [MasterOfMuppets]
+//= 0.7 Implemented an inn NPC [MasterOfMuppets]
+//= 0.8 Implemented the Shinokas quest, thanks to [MasterOfMuppets]
+//= Dj-Yhn for scripting it.
+//= 0.9 Removed Duplicates [Silent]
+//= 1.0 Implemented the Lover's quest. [MasterOfMuppets]
+//= 1.1 Split quests into quests/cities_einbroch.txt [Evera]
+//= 1.2 Split more quests into above file [Evera]
+//= 1.3 Added (finally) the Garrison quest npc [erKURITA]
+//= 1.4 Implemented the polution script. [MasterOfMuppets]
+//============================================================
+
+
+//== some boards, signs ======================
+einbroch.gat,220,208,5 script Notice Board#01 858,{
+ mes "[Weapon Shop Entrance]";
+ close;
+}
+
+einbroch.gat,183,174,5 script Bulletin Board#01 858,{
+ mes "East - Weapon Shop, Hotel";
+ mes "South - Factory";
+ mes "Southwest - Airship Repair Shop,";
+ mes "Laboratory";
+ mes "Northwest - Airport";
+ close;
+}
+
+einbroch.gat,244,255,5 script Bulletin Board#02 858,{
+ mes " ";
+ mes " Train Station";
+ close;
+}
+
+einbroch.gat,68,206,5 script Bulletin Board#03 858,{
+ mes " ";
+ mes " Airship Airport";
+ close;
+}
+
+einbroch.gat,162,256,5 script Bulletin Board#04 858,{
+ mes "East - Train Station";
+ mes "Southeast - Hotel";
+ mes "South - Weapon Shop, Factory";
+ mes "Southwest - Airport, Airship Repair";
+ mes "Shop, Laboratory";
+ close;
+}
+
+einbroch.gat,235,141,5 script Bulletin Board#05 858,{
+ mes "Southwest- Airship Repair Shop,";
+ mes "Laboratory";
+ mes "Northwest- Airport";
+ mes "Northwest- Weapon Shop, Hotel, Train";
+ mes "Station";
+ close;
+}
+
+//===== Town NPC ===========================================
+function script Ein_Tower {
+ mes "["+ @Tower_Name$ +"]";
+ mes "Good day~";
+ mes "I'm " + @Tower_Name$ +", your";
+ mes "guide to exploring";
+ mes "the Einbroch Tower.";
+ next;
+ mes "["+ @Tower_Name$ +"]";
+ mes "Einbroch Tower offers";
+ mes "the best view of our city";
+ mes "and it's a great place to";
+ mes "meet with friends or take";
+ mes "a date. The Einbroch Tower";
+ mes "admission fee is 10 zeny.";
+ next;
+ mes "["+ @Tower_Name$ +"]";
+ mes "Right now, we're offering";
+ mes "a special promotion called";
+ mes "the Apple Combo Set for only";
+ mes "20 zeny. This set includes";
+ mes "Einbroch Tower admission";
+ mes "and an Apple to snack on.";
+ next;
+ menu "Tower Admission Only",s_Tower,"Apple Combo Set",s_Apple,"Cancel",-;
+
+ mes "["+ @Tower_Name$ +"]";
+ mes "I see.";
+ mes "Feel free to";
+ mes "come back any";
+ mes "time. Thank you.";
+ close2;
+ return;
+
+s_Tower:
+ if(Zeny < 10)goto s_NEnough;
+ set Zeny,Zeny - 10;
+s_Tower2:
+ mes "["+ @Tower_Name$ +"]";
+ mes "Thank you for";
+ mes "using our services.";
+ mes "Let me guide you to";
+ mes "the tower right away.";
+ close2;
+ warp "einbroch.gat",174,204;
+ return;
+
+s_Apple:
+ if(Zeny < 20)goto s_NEnough;
+ set Zeny,Zeny - 20;
+ mes "["+ @Tower_Name$ +"]";
+ mes "Before I guide you to";
+ mes "the tower, let me check";
+ mes "your status to insure";
+ mes "your safety before I give";
+ mes "you the Apple Combo Set.";
+ next;
+ getitem 512,1;
+ goto s_Tower2;
+
+s_NEnough:
+ mes "["+ @Tower_Name$ +"]";
+ mes "I'm sorry but you don't";
+ mes "have enough zeny for the";
+ mes "requested service.";
+ close2;
+ return;
+}
+
+einbroch.gat,176,172,5 script Khemko 855,{
+ set @Tower_Name$,"Khemko";
+ callfunc "Ein_Tower";
+ end;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Khemko";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,218,198,5 script Mark 855,{
+ set @Tower_Name$,"Mark";
+ callfunc "Ein_Tower";
+ end;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Mark";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,174,228,5 script Oberu 855,{
+ set @Tower_Name$,"Oberu";
+ callfunc "Ein_Tower";
+ end;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Oberu";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,175,196,5 script Morei 854,{
+ mes "[Morei]";
+ mes "Greetings,";
+ mes "I am Morei,";
+ mes "Assistant Guide";
+ mes "of Einbroch Tower.";
+ next;
+ mes "[Morei]";
+ mes "If you wish to return";
+ mes "to the ground floor,";
+ mes "please let me know.";
+ mes "Would you like to go";
+ mes "back to ground level?";
+ next;
+ menu "Yes.",s_Goback,"No.",-;
+
+ mes "[Morei]";
+ mes "I see.";
+ mes "I hope you";
+ mes "enjoy your time";
+ mes "in Einbroch Tower.";
+ close;
+s_Goback:
+ mes "[Morei]";
+ mes "I see.";
+ mes "Let me lead you";
+ mes "to the ground floor.";
+ mes "Thank you for using";
+ mes "our services.";
+ close2;
+ switch(rand(3)){
+ case 0:
+ warp "einbroch.gat",218,196;
+ end;
+ case 1:
+ warp "einbroch.gat",178,172;
+ end;
+ case 2:
+ warp "einbroch.gat",172,228;
+ end;
+ }
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Morei";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,208,208,3 script Kesunboss 850,{
+ mes "[Kesunboss]";
+ mes "Lady Calla is the";
+ mes "epitome of elegance,";
+ mes "a veritable goddess";
+ mes "of Einbroch";
+ next;
+ mes "[Kesunboss]";
+ mes "Her gentle voice,";
+ mes "that angelic smile, her";
+ mes "kindness and warmth";
+ mes "towards other people";
+ mes "and above all...";
+ next;
+ mes "[Kesunboss]";
+ mes "Calla's family";
+ mes "is wealthy beyond";
+ mes "imagination! She's";
+ mes "perfect! I don't know who";
+ mes "she'll marry, but he'd be";
+ mes "a lucky gentleman, I'm sure.";
+ next;
+ mes "[Kesunboss]";
+ mes "Lady Calla lives in a magnificent";
+ mes "mansion that makes other houses";
+ mes "look like schacks in comparison.";
+ mes "Head north and then west from";
+ mes "here if you wish to marvel in its";
+ mes "beauty and elegance.";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Kesunboss";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,232,255,5 script Khowropher 847,{
+ mes "[Khowropher]";
+ mes "^6A6A6A*Cough cough*^000000";
+ mes "Jiminy! The air here";
+ mes "is so thick and grimy!";
+ mes "And it's worse for us old";
+ mes "people with breathing";
+ mes "problems! ^111111*Haaack*^000000";
+ next;
+ mes "[Khowropher]";
+ mes "I don't care if they keep";
+ mes "building more and more";
+ mes "factories and homes in this";
+ mes "town. Still, I'd like to spend";
+ mes "the rest of my life somewhere";
+ mes "quiet and with clean air...";
+ next;
+ mes "[Khowropher]";
+ mes "Then again, Einbroch is my";
+ mes "hometown and I can't just up";
+ mes "and leave. I suppose it's my";
+ mes "fate to suffer from this fould air";
+ mes "until the day I die.^6A6A6A*Sigh...*";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Khowropher";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+
+}
+
+einbroch.gat,259,327,5 script Leslie 846,{
+ mes "[Leslie]";
+ mes "^6A6A6A*Cough cough*^000000";
+ mes "Laaaand sakes!";
+ next;
+ mes "[Leslie]";
+ mes "An old woman like me";
+ mes "can't breathe this air! How";
+ mes "do people even live in all this";
+ mes "smog? Sure, the air in Einbech";
+ mes "isn't pristine, but the air here in";
+ mes "Einbroch is much worse! ^111111*Cough~!*^000000";
+ next;
+ mes "[Leslie]";
+ mes "I hate coming here";
+ mes "sometimes! The air is";
+ mes "totally polluted and this";
+ mes "city is full of stuck up";
+ mes "pricks! But they sell stuff";
+ mes "here I can't buy back home...";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Leslie";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,232,272,3 script Train Station Staff#01::EinbrochTrain 852,{
+ mes "[Staff]";
+ mes "Welcome to";
+ mes "the Train Station.";
+ mes "Trains to Einbech";
+ mes "are always running";
+ mes "so if you miss one,";
+ mes "it's no problem.";
+ next;
+ mes "[Staff]";
+ mes "The fare to board the";
+ mes "train that runs the Einbroch";
+ mes "to Einbech line is 200 zeny.";
+ mes "Would you like to buy a ticket?";
+ next;
+ menu "Yes.",s_Yes,"No.",-,"About the Enviroment...",s_Enviroment;
+
+ mes "[Staff]";
+ mes "Very well, then.";
+ mes "Please enjoy your";
+ mes "stay in Einbroch.";
+ close;
+s_Yes:
+ mes "[Staff]";
+ if(Zeny < 200){
+ mes "I'm sorry but you";
+ mes "do not have enough";
+ mes "money to pay the fee.";
+ close;
+ }
+ set Zeny,Zeny - 200;
+ mes "Thank you";
+ mes "very much.";
+ mes "Have a safe trip.";
+ mes "^111111*Ahem*^000000 All aboard!";
+ close2;
+ warp "einbech.gat",43,215;
+ end;
+s_Enviroment:
+ mes "[Staff]";
+ mes "Einbroch is infamous for";
+ mes "its air pollution, no doubt";
+ mes "caused by the industrial";
+ mes "facilities located here.";
+ mes "it's really horrible...";
+ next;
+ mes "[Staff]";
+ mes "Sometimes the air pollution";
+ mes "gets so bad that it becomes";
+ mes "hard to breathe. If you hear";
+ mes "the Einbroch Smog Alert, you";
+ mes "should find shelter immediately!";
+ close;
+
+OnHide:
+ specialeffect 16;
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,252,301,3 duplicate(EinbrochTrain) Train Station Staff#02 852
+
+einbroch.gat,228,121,5 script Little Toby 855,{
+ mes "[Little Toby]";
+ mes "Excuse me...";
+ mes "But I'm lost!";
+ mes "I can't find my";
+ mes "mom or dad!";
+ next;
+ mes "[Little Toby]";
+ mes "A-am I at the airport?!";
+ mes "My parents are suposed";
+ mes "to come get me, but I still";
+ mes "haven't found them! We just";
+ mes "moved here, so i dont know";
+ mes "where anything is!";
+ next;
+ mes "[Little Toby]";
+ mes "W-wait!";
+ mes "Where are you";
+ mes "going?! Dont leave";
+ mes "me, I'm all alone...!";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Little Toby";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,229,149,3 script Sleik 854,{
+ mes "[Sleik]";
+ mes "Surprisingly, we have";
+ mes "a Train Station that everyone";
+ mes "has been calling a victory for";
+ mes "science. I mean, shouldn't we";
+ mes "be more amazed by the airship";
+ next;
+ mes "[Sleik]";
+ mes "Now, if you want to know";
+ mes "where the train actually goes";
+ mes "I wouldn't be able to tell you.";
+ mes "After all, I never rode it. But";
+ mes "still, I guess having our own";
+ mes "Train Station is a good thing";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Sleik";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+einbroch.gat,236,191,3 script Tan 855,{
+ mes "[Tan]";
+ mes "All the factories";
+ mes "here in Einbroch are";
+ mes "causing a serious air";
+ mes "pollution problem.";
+ next;
+ mes "[Tan]";
+ mes "I'm an Airship engineer and";
+ mes "everyday, all day long, I deal";
+ mes "with oil stains and all sorts";
+ mes "of pollutants. i'm supprised";
+ mes "I havn't gotten sick yet...";
+ next;
+ mes "[Tan]";
+ mes "Still, I try to be careful";
+ mes "when I can. Whenever I go";
+ mes "out into the city's red fog,";
+ mes "I always wear my Flu Mask.";
+ mes "If you'll be here a while,";
+ mes "you should carry one with you.";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Tan";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+ein_in01.gat,31,217,3 script Cendadt 851,{
+
+ mes "[Cendadt]";
+ mes "This factory has a lot";
+ mes "of things that need fixing,";
+ mes "pronto! I'm amazed that";
+ mes "the place is still operating!";
+ next;
+ mes "[Cendadt]";
+ mes "Lucky for us, I head that";
+ mes "some altruistic adventurers";
+ mes "have been donating materials";
+ mes "to help keep this factory from";
+ mes "falling apart... Or worse.";
+ mes "But that's just a rumor.";
+ next;
+ mes "[Cendadt]";
+ mes "^6A6A6A*Sigh*^000000";
+ mes "Even if it is true,";
+ mes "there's nothing no one";
+ mes "here can do. Nobody has";
+ mes "the courage to challenge";
+ mes "the system, you know?";
+ next;
+ mes "[Cendadt]";
+ mes "I...";
+ mes "I better get";
+ mes "back to work";
+ mes "before I get";
+ mes "in trouble...";
+ close;
+
+}
+
+ein_in01.gat,36,204,3 script Rombell 851,{
+
+ mes "[Rombell]";
+ mes "It's great that the";
+ mes "factory is making good";
+ mes "business and drawing";
+ mes "in a lot of profit, but I still";
+ mes "have one major convern.";
+ next;
+ mes "[Rombell]";
+ mes "The ammount of pollution";
+ mes "that this place is causing";
+ mes "is horrific! We've got these";
+ mes "machines blowing out toxic";
+ mes "gas all day long! The air";
+ mes "can't be safe for very long...";
+ next;
+ mes "[Rombell]";
+ mes "I mean, the air we're";
+ mes "breathing right now is";
+ mes "pretty foul and things";
+ mes "are only going to get";
+ mes "worse. How can we";
+ mes "solve this problem?";
+ close;
+
+}
+
+ein_in01.gat,49,202,3 script Dorf 851,{
+
+ mes "[Dorf]";
+ mes "machines are sooo";
+ mes "convenient. Just look";
+ mes "at this contraption easily";
+ mes "do tasks that'd be tough";
+ mes "for me to finish alone";
+ next;
+ mes "[Dorf]";
+ mes "Now this is what";
+ mes "I call technology!";
+ mes "Sure, it takes effort and";
+ mes "money to make one of";
+ mes "these, but what do I care?";
+ next;
+ mes "[Dorf]";
+ mes "I've got no problems,";
+ mes "so long as this freaking";
+ mes "thing keeps working the";
+ mes "way I want it to!";
+ close;
+
+}
+
+ein_in01.gat,48,220,3 script Lowe 851,{
+
+ mes "[Lowe]";
+ mes "...";
+ next;
+ mes "[Lowe]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Lowe]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Lowe]";
+ mes "Hey. Why are you";
+ mes "looking at me like";
+ mes "that? There's no idle";
+ mes "chatting allowed at work.";
+ mes "If Canphotii catches";
+ mes "you, you'll be punished";
+ next;
+ mes "[Lowe]";
+ mes "Oh wait...";
+ mes "You don't work here.";
+ mes "I appologize, that kind";
+ mes "of reaction's an old";
+ mes "habit for me, adventurer.";
+ close;
+
+}
+
+ein_in01.gat,43,253,4 script Canphotii 852,{
+
+ mes "[Canphotii]";
+ mes "Hustle, hustle!";
+ mes "Pick up the pace!";
+ mes "Anyone working too";
+ mes "slowly will be punished!";
+ next;
+ mes "[Canphotii]";
+ mes "Can't you understand";
+ mes "that?! Now go to your";
+ mes "station and get back to";
+ mes "work! Wait, are you even";
+ mes "an employee? If not, then";
+ mes "stop wandering around!";
+ next;
+ mes "[Canphotii]";
+ mes "You're not supposed";
+ mes "to be able to get in here!";
+ mes "I can't believe they let you";
+ mes "in! This requires extreme";
+ mes "disciplinary action!";
+ close;
+
+}
+
+ein_in01.gat,68,209,4 script Khashurantze 852,{
+
+ mes "[Khashurantze]";
+ mes "I'm sorry, but you need";
+ mes "special authority in order";
+ mes "to enter this place. I'll have";
+ mes "to ask you to leave right now.";
+ if(EinFactory > 0){
+ next;
+ mes "[Khashurantze]";
+ mes "Oh? Mr. Zelmeto asked you to help out?";
+ mes "In that case excuse me.";
+ close;
+ }
+ close2;
+ warp "einbroch.gat",179,63;
+ end;
+
+}
+
+ein_in01.gat,113,211,3 script Treinz 851,{
+
+ mes "[Treinz]";
+ mes "If you just pay me money,";
+ mes "I'll be your slave! There's";
+ mes "nothing I won't do! Anything";
+ mes "is fair game. Hell, I'll get buck";
+ mes "naked if you pay me enough.";
+ next;
+ mes "[Treinz]";
+ mes "If you pay me what I'm";
+ mes "worth, I'll work hard at";
+ mes "any task you set me to.";
+ mes "Sure, mining's rough, but";
+ mes "as long as the zeny's coming";
+ mes "in, I'm happy. Heh heh heh~";
+ close;
+}
+
+ein_in01.gat,84,218,3 script Tsuen 851,{
+
+ mes "[Tsuen]";
+ mes "There was a time";
+ mes "when I dreamed of";
+ mes "being an adventurer,";
+ mes "just like you. But that";
+ mes "was a long time ago...";
+ next;
+ mes "[Tsuen]";
+ mes "Now, I'm nothing but";
+ mes "a factory manager. Still,";
+ mes "even if my job's not that";
+ mes "great, I'm pretty satisifed.";
+ mes "I'm sure people enjoy the";
+ mes "products I oversee and all...";
+ next;
+ mes "[Tsuen]";
+ mes "Maybe my life was meant";
+ mes "to be this way, even if it's";
+ mes "not how I planned it. But the";
+ mes "time will come when I up and";
+ mes "leave and travel the world";
+ mes "once I get my chance!";
+ next;
+ mes "[Tsuen]";
+ mes "I hope the day will";
+ mes "come when I can meet";
+ mes "you out in that big wide";
+ mes "world and greet you as";
+ mes "a fellow adventurer.";
+ close;
+}
+
+ein_in01.gat,85,261,3 script Zherin 851,{
+
+ mes "[Zherin]";
+ mes "I'm in charge of this";
+ mes "blast furnace which";
+ mes "contains all of this";
+ mes "boiling magma.";
+ next;
+ mes "[Zherin]";
+ mes "Even though it doesn't";
+ mes "require actual labor, this";
+ mes "job is pretty tiring. I've got";
+ mes "to pay careful attention all";
+ mes "the time. It's pretty stressful.";
+ next;
+ mes "[Zherin]";
+ mes "Still, I'm proud of my job";
+ mes "since I have the responsibility";
+ mes "of ensuring employee safety.";
+ mes "Anyway, don't get too close";
+ mes "to the furnace. It won't do if";
+ mes "you get burned on accident!";
+ close;
+}
+
+ein_in01.gat,64,271,3 script Vonstein 851,{
+
+ mes "[Vonstein]";
+ mes "Staring at this";
+ mes "bubbling hot liquid";
+ mes "metal gives me a good";
+ mes "feeling inside. It's like";
+ mes "that stuff can melt anything!";
+ next;
+ mes "[Vonstein]";
+ mes "Imagine covering an";
+ mes "entire street of people";
+ mes "with that stuff! Bwahah--";
+ mes "Oh, I'm sorry if I'm talking";
+ mes "crazy talk! I'm just kidding~";
+ close;
+}
+
+ein_in01.gat,33,275,9 script Pevtatin 848,{
+
+ mes "[Pevtatin]";
+ mes "Good god!";
+ mes "I'm so stressed!";
+ mes "It's been nonstop";
+ mes "since I moved here!";
+ next;
+ mes "[Pevtatin]";
+ mes "The work is tough and";
+ mes "already the boss hates";
+ mes "me! I didn't move here";
+ mes "for this! Still, the pay is";
+ mes "decent so I guess I should";
+ mes "endure just a little longer.";
+ next;
+ mes "[Pevtatin]";
+ mes "Here goes...!";
+ mes "Yo-heave-ho!";
+ mes "Yo-heave-ho~!";
+ close;
+}
+
+ein_in01.gat,87,237,3 script Dinje 850,{
+
+ mes "[Dinje]";
+ mes "Do you know why a woman";
+ mes "like me has to work in this";
+ mes "factory? I'll tell you why...";
+ next;
+ mes "[Dinje]";
+ mes "My lazy husband, Gesin,";
+ mes "is just lying there on the";
+ mes "ground! So I have to work";
+ mes "in order to support us!";
+ next;
+ mes "[Dinje]";
+ mes "We can't rest for even";
+ mes "a second if we want to save";
+ mes "enough money to become";
+ mes "wealthy and powerful some";
+ mes "day. Don't you understand?";
+ next;
+ mes "[Dinje]";
+ mes "Well, my husband obviously";
+ mes "doesn't! How can he not know";
+ mes "how the real world works?!";
+ mes "Hey, kick his ass for me if";
+ mes "he doesn't wake up soon!";
+ close;
+}
+
+ein_in01.gat,103,238,9 script Gesin 849,{
+
+ mes "[Gesin]";
+ mes "Arrgh!";
+ mes "This is killing me!";
+ mes "Why should I be rich?!";
+ mes "What's wrong with living";
+ mes "within our means?";
+ next;
+ mes "[Gesin]";
+ mes "I've got no problem";
+ mes "with my current way";
+ mes "of life, but the old ball";
+ mes "and chain disagrees.";
+ mes "Why is she so obsessed";
+ mes "with riches and power?";
+ next;
+ mes "[Gesin]";
+ mes "Well, in any case, I'd";
+ mes "like to help her, but I can't";
+ mes "get up! I'm exhausted and";
+ mes "my body is just overtaxed.";
+ mes "I have no strength at all.";
+ next;
+ mes "[Gesin]";
+ mes "This is horrible~";
+ mes "I should be resting";
+ mes "instead of worrying";
+ mes "about making money...";
+ close;
+}
+
+einbroch.gat,188,72,3 script Keneshiotz 855,{
+
+ mes "[Keneshiotz]";
+ mes "This city is full of sky";
+ mes "high smokestacks and";
+ mes "the droning hum of machines.";
+ next;
+ mes "[Keneshiotz]";
+ mes "Sure, the air is polluted,";
+ mes "but I think it's a fair price";
+ mes "to pay for wealth and a";
+ mes "modern life of comfort.";
+ mes "Screw the environment!";
+ next;
+ mes "[Keneshiotz]";
+ mes "I'd much rather live like";
+ mes "this than end up like those";
+ mes "backwards vagrants in that";
+ mes "filthy Einbech. Don't they";
+ mes "know that money makes";
+ mes "the world go 'round?";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Keneshiotz";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+ein_in01.gat,206,224,2 script Hotel Employee 855,{
+
+ mes "[Hotel Employee]";
+ mes "Good day, welcome to the";
+ mes "Einbroch Hotel. The staff is";
+ mes "always striving to accomodate";
+ mes "our guests with the highest";
+ mes "standards in cleanliness,";
+ mes "service and convenience~";
+ next;
+ menu "Save",s_Save,"Take Rest- 5,000 zeny",s_Rest,"Cancel",-;
+
+ mes "[Hotel Employee]";
+ mes "Thank you and";
+ mes "please come again~";
+ close;
+
+s_Save:
+ savepoint "ein_in01.gat",199,224;
+ mes "[Hotel Employee]";
+ mes "Your Respawn Point";
+ mes "has been saved here";
+ mes "in the Einbroch Hotel.";
+ mes "Thank you, and please";
+ mes "come again.";
+ next;
+ mes "[Hotel Employee]";
+ mes "Have a good day.";
+ close;
+
+s_Rest:
+ mes "[Hotel Employee]";
+ if(Zeny < 5000){
+ mes "I'm sorry but";
+ mes "you don't seem";
+ mes "to have enough zeny.";
+ close;
+ }
+ mes "Thank you.";
+ mes "Please enjoy";
+ mes "your rest~";
+ close2;
+ set zeny,zeny - 5000;
+ warp "ein_in01.gat",272,167;
+ percentheal 100,100;
+ end;
+
+}
+
+ein_in01.gat,21,147,4 script Megass 853,3,3,{
+ end;
+
+OnTouch:
+ mes "[Megass]";
+ mes "How dare you...";
+ mes "A vagabond like";
+ mes "you setting foot";
+ mes "into my home!?";
+ mes "Unthinkable!";
+ next;
+ mes "[Megass]";
+ mes "Leave immediately";
+ mes "before I report you";
+ mes "to the authorities";
+ mes "for trespassing!";
+ close2;
+ warp "einbroch.gat",112,245;
+ end;
+}
+
diff --git a/npc/cities/geffen.txt b/npc/cities/geffen.txt
index a304910e4..c229d7d3d 100644
--- a/npc/cities/geffen.txt
+++ b/npc/cities/geffen.txt
@@ -1,681 +1,681 @@
-//===== eAthena Script =======================================
-//= Geffen Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.51
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 - Spell Checked [massdriller]
-//= 1.2 Fixed more typo’s [Nexon]
-//= 1.3 added a Level 4 weapon quest related NPC [MasterOfMuppets]
-//= 1.4 Removed Duplicates [Silent]
-//= 1.5 Fixed some typos and coordinates [Musashiden]
-//= 1.51 Fixed a small typo [Evera]
-//============================================================
-
-
-// Lady -------------------------------------------------------
-geffen.gat,59,143,8 script Lady#01 91,{
- mes "[Lady]";
- mes "Oh, you must be a Stranger here.";
- next;
- mes "[Lady]";
- mes "Welcome to Geffen, the City of Magic. You Must be very tired? Why don't you eat Some ^ffaa00Honey^000000? It will relieve of your fatigue";
- next;
- mes "[Lady]";
- mes "Honey is very sweet and highly nutritious. It will allow you to ^0000ffregain^000000 some of your ^0000ffHP as well as SP^000000.";
- mes "It's gathered by Hornets for the queen bee ^ff0000Mistress^000000. mistress is a very rare and powerfully monster.";
- next;
- mes "[Lady]";
- mes "BELIEVE me, you DON'T want to try and take honey away from HER....";
- next;
- mes "[Lady]";
- mes "There are other monsters that drop honey but they are fairly strong. Honey is pretty hard to come by which makes it very pricey to buy.";
- next;
- mes "[Lady]";
- mes "Believe it or not Honey is actually NOT the most valuable bee product there is.......";
- mes "Apparently ^ffaa00`Royal Jelly'^000000, which is made by ^ff0000Mistress^000000 herself, is even rarer and more sought after.";
- next;
- mes "[Lady]";
- mes "Ah~ Thinking of Royal Jelly makes my mouth Water~";
- close;
-}
-
-
-// Womankind ------------------------------------------------------------
-geffen.gat,111,48,2 script Kind Woman 101,{
- mes "[Kind Woman]";
- mes "Good Day, adventurer.";
- next;
- mes "[Kind Woman]";
- mes "Have you ever seen the ^ff0000Orcs^000000, the Demi-Human Tribe?";
- next;
- mes "[Kind Woman]";
- mes "South of here, deep in the forest, lies the home land of the Orcs. I hear they have a unique culture and language that is much different from our own.";
- next;
- mes "[Kind Woman]";
- mes "I wonder.....? Do they dream of love and romance just as we do? Hmm..... I wonder........";
- close;
-}
-
-
-// Researcher ------------------------------------------------------------------------
-geffen.gat,156,190,8 script Researcher 57,{
- mes "[Researcher]";
- mes "Hmm... Interesting. Hmm... It is Very interesting....";
- next;
- mes "[Researcher]";
- mes "Oh, you've come at just the right time. Let me tell you about something I just discovered.";
- next;
- mes "[Researcher]";
- mes "You see, I found this Mysterious Scroll when I was researching Magic. In the scroll there is a description of a tree named ^008800Yggdrasill^000000.";
- mes "It says that the leaves, seeds, and fruits of this tree are somehow connected to the creation and preservation of life in this world.";
- next;
- mes "[Researcher]";
- mes "I've never actually come across the leaves, seeds, or fruits of the Yggdrasill, let alone the tree itself..... but.....";
- next;
- mes "[Researcher]";
- mes "The idea of a tree of life is quite amazing! Don't you think so?";
- close;
-}
-
-// Young Man --------------------------------------------------------------------------
-geffen.gat,147,26,0 script Young man#06 97,{
- mes "[Young Man]";
- mes "I heard that somewhere in this world, there is a rare staff which transforms its owner's psychic power into physical powers, and endows with destructive force also...";
- mes "With this, everybody could be as strong as Hercules, despite their lack of muscles. Haw haw...I will take it.";
- next;
- mes "[Young Man]";
- mes "Good heavens! You, since when were you behind me?";
- mes "Did you happen to hear what I said? Ha ma...Muhaha. I didn't say anything. If you heard anything from me, just forget~Forget about it~";
- mes "Yay~ veggie is cheap today~come on!!";
- close;
-}
-
-// Young Man -----------------------------------------------------------------------
-geffen_in.gat,34,170,0 script Young man#07 47,{
- mes "[Young Man]";
- mes "Hello? Isn't it wonderful, today? I am a promising young Mage. Ahem.";
- mes "Nowadays, my mental anguish about magic things keeps me awake every night..sigh...Especially, about the weak point of magic, you know.";
- next;
- mes "[Young Man]";
- mes "Darn! It was really annoying when I encountered that long-ranged enemy last time. It disrupted magic casting.";
- mes "After all I realized I need a weapon to counter Such a long-ranged attack from an enemy....But geez.. It is not easy to make such a weapon I wish.";
- next;
- mes "There should be another way.....Should be.....";
- mes "Any ideas for me?";
- close;
-}
-
-
-//<============================================ Inn =====================================================>\\
-// Waitress ---------------------------------------------------------------------------
-geffen_in.gat,70,67,5 script Waitress#01 80,{
- mes "[Waitress]";
- mes "Ugh!! SO annoying! Why would you drink here when you could drink at the pub!? This is an Inn, not a pub!!";
- mes "That man!... every time he drinks... he gets like that! Ugh!!";
- emotion e_an;
- next;
- mes "[Waitress]";
- mes "(~yells to the man~)'Hey mister! I TOLD you... THIS.. IS.. AN INN, NOT A BAR!!'";
- emotion e_pif;
- next;
- mes "[Waitress]";
- mes "(~sighs~) That old man in the front corner there gives me a headache.";
- mes "My younger sister, who works at the pub, told me that there is someone just like him at the Pub.";
- next;
- mes "[Waitress]";
- mes "To think that there are 2 of them in one city... It's JUST ABSURD!!";
- emotion e_pif;
- next;
- mes "[Waitress]";
- mes "(~mumbles~)... I wish they would both just leave this town and be forgotten forever... that would be nice....";
-M_Menu:
- next;
- menu "May I have a drink?",M_0, "Has there been anything interesting lately?",M_1, "End Conversation",M_End;
-
- M_0:
- mes "[Waitress]";
- mes "Oh my, I'm sorry but that DRUNKARD swallowed up every last drop of liquor we have.";
- mes "Everyday it's the same thing... as soon as the Inn opens he comes in and gulps down drink after drink.";
- next;
- mes "[Waitress]";
- mes "It's amazing he hasn't died yet. Maybe if you came by some other time we'll be restocked... oh who am I kidding....";
- goto M_Menu;
- M_1:
- mes "[Waitress]";
- mes "Well... of all of the people who have stopped by lately, there are a group of merchants that have caught my attention.";
- mes "I could tell right away that they were from out of town. My younger sister tells me they are from Schubaltzwald...";
- next;
- mes "[Waitress]";
- mes "It really doesn't matter who they are or where they're from, after all business is business. They could be from Schuschu Chocolate Land for all I care....";
- next;
- mes "[Waitress]";
- mes "I just wish the amount of local customers would start increasing again, since they are the bulk of my customers.";
- goto M_Menu;
- M_End:
- mes "[Waitress]";
- mes "Have a nice day!";
- close;
-}
-
-// Merchant Daven -------------------------------------------------------------------
-geffen_in.gat,79,75,2 script Merchant Daven 61,{
- mes "[Merchant Daven]";
- mes "Back in the day when I first came to Geffen, the town was a very boring place to live in.";
- next;
- mes "[Merchant Daven]";
- mes "But now there are noble Mages and a flourishing community of Blacksmiths, that make Geffen.......";
- next;
- mes "[Merchant Daven]";
- mes ".... still.... a very BORING place to be.... Bleh! I'm really bored here!!!";
-M_Menu:
- next;
- menu "-Mages?",M_0, "-Blacksmiths?",M_1, "-Who are you?",M_2, "-End Conversation.",M_End;
-
- M_0:
- mes "[Merchant Daven]";
- mes "Mages and Wizards love to carry books around with them wherever they go. That's just how they are.";
- next;
- mes "[Merchant Daven]";
- mes "Mages like to gather at the ^5555FFMagic Academy^000000 where they study the basics of magic use.";
- next;
- mes "[Merchant Daven]";
- mes "After much study and with enough experience, Mages can become Wizards. Wizards can use much more powerful magical spells.";
- mes "You can find them at the top floor of the ^5555FFGeffen Tower^000000.";
- goto M_Menu;
- M_1:
- mes "[Merchant Daven]";
- mes "Blacksmiths are difficult people. They are also a dirty bunch, whose faces are often covered with black soot.";
- mes "No matter where they are or what they do, they always smell of iron and soot.";
- next;
- mes "[Merchant Daven]";
- mes "However, that is something that can't be helped. Blacksmiths are always hard at work, refining ores, and tempering equipment.";
- mes "It's just not possible to be a Blacksmith and not be dirty and smelly. Unfortunately it's part of the job.";
- next;
- mes "[Merchant Daven]";
- mes "Weapons forged by Blacksmiths can be much more unique then those sold in Armories.";
- mes "The actual ores and stones used by the Blacksmiths are of a much higher quality and are often scarce.";
- mes "This can give their weapons special qualities that are very beneficial to a character.";
- goto M_Menu;
- M_2:
- mes "[Merchant Daven]";
- mes "Me?.... Oh I'm the world's PRETTIEST street merchant!!..... the he he...";
- emotion e_kis;
- next;
- menu "..... I'm going to puke....",sM_0, ".... SLAPP him upside his head!!!",sM_1;
-
- sM_0:
- mes "[Merchant Daven]";
- mes "Hehehe.... it was a joke.... a joke ok..... hehehe....";
- emotion e_heh;
- goto M_Menu;
- sM_1:
- mes "~^FF8000!!!^FF0000THWAAACCCKKK^FF8000!!!^000000~";
- next;
- mes "[Merchant Daven]";
- mes "OW!! Ok! Ok! I was just kidding.... sheesh....";
- emotion e_wah;
- goto M_Menu;
- M_End:
- close;
-}
-
-// Drunkard -------------------------------------------------------------------
-geffen_in.gat,59,62,2 script Drunkard#01 120,{
- mes "[Drunkard]";
- mes "Hmm... You're Joshua's friend too??";
- next;
- menu "-Nope.",M_0, "-Who's that??",M_1, "-I have no friends.(~sob~)",M_2;
-
- M_0:
- mes "[Drunkard]";
- mes "Hmf. Yeah... that dork has no reason to have any friends. Forget I even asked.";
- close;
- M_1:
- mes "[Drunkard]";
- mes "Uh... well if you go down this hall to the room on the left... you'll find this dork.";
- mes "All day long, he just stays in that dark room tempering steel.... who the hell knows what he's making....";
- next;
- mes "[Drunkard]";
- mes "If you're interested you should go talk to him. From the looks of it, you two would probably get along really well... HAHAHA!";
- emotion e_heh;
- close;
- M_2:
- mes "[Drunkard]";
- mes "Oh... I see, I see. My apologies. You seem to be sensitive about this. To think that you have no friends....";
- mes "Ya know, you remind me of my younger self! Heck... you might end up just like me... heh heh.";
- next;
- mes "[Drunkard]";
- mes "(~sob~sob~).... oh what happened to my life!!!....(~baaaahhhh~)";
- emotion e_sob;
- next;
- mes "[Waitress]";
- mes "ARGH!! STOP being so noisy!";
- close;
-}
-
-// Schubaltzwald Merchant ----------------------------------------------------------------------
-geffen_in.gat,113,73,4 script Schubaltzwald Merchant 709,{
- mes "[Schubaltzwald Merchant]";
- mes "How are you, Rune-Midgard young'un? I am Schubaltzwald's one and only Hans Hadenhiem.";
- next;
- mes "[Schubaltzwald Merchant]";
- mes "My business associates and I plan to do business, both here in Geffen, and at home in Schubaltzwald.";
- next;
- mes "[Schubaltzwald Merchant]";
- mes "Although Rune-Midgard doesn't seem to have any exciting places to go sight-seeing, it does have a lot of interesting merchandise.";
- mes "Because of their uniqueness, these items have become quite valuable in my city.";
- next;
- mes "[Schubaltzwald Merchant]";
- mes "Something may be plentiful here, but scarce somewhere else, an item may be popular there but not here....";
- mes "That is what makes being a merchant so interesting, the variety of items to buy and sell between different places.";
- next;
- mes "[Schubaltzwald Merchant]";
- mes "Of course it would be ideal if a merchant could have a widespread distribution of the same items in different cities.";
- next;
- mes "[Schubaltzwald Merchant]";
- mes "If you're not satisfied with the merchandise, just wait, and some other day what you're looking for may be in stock.";
- mes "It's a merchant's duty to make the customer happy with the quality of the items being sold!";
- close;
-}
-
-
-//<============================================== Pub ==================================================>\\
-// Waitress -----------------------------------------------------------------
-geffen_in.gat,28,134,4 script Waitress#03 69,{
- mes "[Waitress]";
- mes "Meh! ALWAYS drinking and ALWAYS fighting..... HEY Mister! This is a place of BUSINESS!!";
- emotion e_an;
- next;
- mes "[Waitress]";
- mes "That man gives me a headache. My sister at the Inn says that there is another IDIOT just LIKE HIM there!";
- mes "I CAN'T BELIEEEEVE that there is more that one IDIOT like him in this world..... I wish they would just... just... DISAPPEAR!!";
- next;
- mes "[Waitress]";
- mes "(~sighs~)";
- emotion e_pif;
-M_Menu:
- next;
- menu "Could I get drink?",M_0, "Anything interesting going on lately?",M_1, "End Conversation",M_End;
-
- M_0:
- mes "[Waitress]";
- mes "Jeez, I'm real sorry but we ran out of liquor. THAT DRUNKARD chugged down every last drop we had....";
- mes "As soon as we open he's in here downing drink after drink! I'm surprised he's still alive.";
- next;
- mes "[Waitress]";
- mes "Maybe if you stopped by later.... but then again, the way HE'S been drinking.... you might have better luck else where....";
- goto M_Menu;
- M_1:
- mes "[Waitress]";
- mes "Hmm... there really hasn't been anything new going on lately.... there haven't been any rumors from the customers either....";
- mes "Come to think of it.... you yourself are a person of few words....";
- next;
- mes "[Waitress]";
- mes "I'm sure there's a reason why there has been such a lull as of late....";
- mes "It's just we working girls tend to get REALLLYYY BORED.... so if anything exciting happens let me know okay?";
- goto M_Menu;
- M_End:
- mes "[Waitress]";
- mes "You have a nice day now!";
- close;
-}
-
-// Drunkard ----------------------------------------------------------------------------
-geffen_in.gat,21,125,5 script Drunkard#02 52,{
- mes "[Drunkard]";
- mes "You want to be an idiotic magician? Is that why you came here??";
- emotion e_what;
- close;
-}
-
-// Lvl 4 weapon quest related NPC ------------------------------------------------------
-
-geffen.gat,203,146,5 script Citizen 97, {
- mes "[Citizen]";
- mes "There was a skillful weaponsmith";
- mes "in Al De Baran who had 4 sons.";
- mes "Unfortunately he lost all of his sons";
- mes "while developing a powerful weapon.";
- mes "The father survived alone from the tragedy.";
- next;
- mes "[Citizen]";
- mes "How sad it will be for the father...";
- mes "Because of the incident, the weaponsmith";
- mes "retired from his work and hid himself somewhere.";
- mes "After that, no one could ever see";
- mes "the powerful weapon that he and his sons were developing.";
- next;
- mes "[Citizen]";
- mes "I don't think that 4 sons of him";
- mes "went to the heaven with the anxiety.";
- close;
-}
-
-// Friend of Youth ---------------------------------------------------------------------
-geffen_in.gat,37,124,5 script Friend of Youth 704,{
- set @temp,0;
- mes "[Friend of Youth]";
- mes "Welcome young one! Are you worrying about something? Tell me all your troubles and I will tell you your fortune with my silver ball of mystery!";
-M_Menu:
- next;
- set @temp, rand(5);
- menu "-Life!",M_0, "-Love!",M_1, "-Fortune!",M_2, "-Grades!",M_3, "-Future!",M_4, "-Fashion!",M_5, "-End.",M_End;
-
- M_0:
- if(@temp ==1) goto R0_1;
- if(@temp ==2) goto R0_2;
- if(@temp ==3) goto R0_3;
- if(@temp ==4) goto R0_4;
-
- R0_0:
- mes "[Friend of Youth]";
- mes "It seems that you've had to deal with many problems recently... but don't despair.";
- mes "Although you may have to endure some hardships now, the road ahead of you is clear.";
- next;
- mes "[Friend of Youth]";
- mes "Being tossed out in the desert, naked, and chased by a Peco Peco really isn't that bad.";
- mes "If you maintain your composure and persevere, you will be able to enjoy the sweet taste of accomplishment.";
- next;
- mes "[Friend of Youth]";
- mes "So keep your head up and endure for a bit longer!";
- next;
- goto R0_End;
- R0_1:
- mes "[Friend of Youth]";
- mes "It looks as though you have chosen an obscure path for yourself. You may feel as though you may have made a mistake.";
- mes "This uncertainty about your choices affects you even now. Try to take a break and relax.";
- next;
- mes "[Friend of Youth]";
- mes "Re-organize yourself to better handle the situation that surrounds you.";
- mes "Rearrange your items and equipment to give yourself a 'fresh' start.";
- next;
- goto R0_End;
- R0_2:
- mes "[Friend of Youth]";
- mes "The evil forces that envy your fortune and good health are always watching you.";
- mes "They are jealous of what you have and are eagerly waiting for you to make mistakes.";
- next;
- mes "[Friend of Youth]";
- mes "Therefore you must be more careful with your actions. Proceed with caution, especially in dangerous situations.";
- mes "Remain calm however, and continue to prepare for the days to come.";
- next;
- goto R0_End;
- R0_3:
- mes "[Friend of Youth]";
- mes "Some recent turmoil between you and someone you know still looms over your head.";
- mes "There is no way to avoid the problems... you must face them head on.";
- next;
- mes "[Friend of Youth]";
- mes "Try to resolve the issues in a calm, peaceful, and friendly manner. Think about the relationship you have with this person.";
- next;
- goto R0_End;
- R0_4:
- mes "[Friend of Youth]";
- mes "Lately you have been living in the darkness of the monsters.";
- mes "The power of the dark is too strong and you must pull away from it.";
- next;
- mes "[Friend of Youth]";
- mes "In order to do that you must be physically strong and mentally able. Give it all you have and make good use of your training!";
- next;
-
- R0_End:
- mes "[Friend of Youth]";
- mes "Now, have the questions about your life been answered? Feel free to ask me again. I am always on your side friend!";
- emotion e_no1;
- goto M_Menu;
-
- M_1:
- if(@temp ==1) goto R1_1;
- if(@temp ==2) goto R1_2;
- if(@temp ==3) goto R1_3;
-
- R1_0:
- mes "[Friend of Youth]";
- mes "Tsk tsk.... Are you looking for another love?";
- emotion e_what;
- next;
- mes "[Friend of Youth]";
- mes "So you're not satisfied with the relationship your in now.... you want one that is new, better, more exciting.......";
- next;
- mes "[Friend of Youth]";
- mes "Don't be a fool!! Treasure the love you have now! You never no where a wandering heart will lead you....";
- emotion e_gasp;
- next;
- goto R1_End;
- R1_1:
- mes "[Friend of Youth]";
- mes "Everybody says that love is wonderful. THAT IS, until things go WRONG, then it's not so easy to say that love is wonderful.";
- next;
- mes "[Friend of Youth]";
- mes "Maybe your not quite ready for love right now. Build up some more confidence in yourself then go after that special someone with all your heart.";
- next;
- mes "[Friend of Youth]";
- mes "With that confidence and a little bit of luck, you're sure to find love. Always!!";
- emotion e_no1;
- next;
- goto R1_End;
- R1_2:
- mes "[Friend of Youth]";
- mes "Oh ho! To be in love is a wonderful existence!";
- mes "Love can be as exciting as running through a forest filled with porings while wildly swinging your sword around!!";
- next;
- mes "[Friend of Youth]";
- mes "So BRANDISH your sword in the name of LOVE!!";
- emotion e_no1;
- next;
- goto R1_End;
- R1_3:
- mes "[Friend of Youth]";
- mes "Well now... You're so happy, you don't know what to do!! No matter how hard you try, you can't hide the fact that you're in love!";
- next;
- mes "[Friend of Youth]";
- mes "Heh, I guess there's nothing for me to tell you.";
- next;
- mes "[Friend of Youth]";
- mes "Now if I could only find someone to love.......";
- emotion e_hmm;
- next;
- goto R1_End;
- R1_End:
- mes "[Friend of Youth]";
- mes "Even in this bleak world, love is all around you! Love can be fun so treasure the heart and come back for another reading!";
- emotion e_no;
- goto M_Menu;
-
- M_2:
- if(@temp ==1) goto R2_1;
- if(@temp ==2) goto R2_2;
- if(@temp ==3) goto R2_3;
- if(@temp ==4) goto R2_4;
-
- R2_0:
- mes "[Friend of Youth]";
- mes "For a young one such as yourself, money should not be the most important thing in your life.";
- mes "Don't worry about money too much, just live your life to the fullest! Only then can something wonderful can happen to you.";
- goto M_Menu;
- R2_1:
- mes "[Friend of Youth]";
- mes "Let me tell you something, DON'T become obsessed with materialistic things!";
- next;
- mes "[Friend of Youth]";
- mes "Although you need money to get by in this world, if acquiring wealth is your sole purpose in life....";
- mes "you will ultimately find yourself disappointed and empty.";
- goto M_Menu;
- R2_2:
- mes "[Friend of Youth]";
- mes "Are you envious of someone's else's items?? DON'T BE!!";
- mes "You are better then that! Seek that which makes you a better person";
- goto M_Menu;
- R2_3:
- mes "[Friend of Youth]";
- mes "Saving money is important. Don't get into the habit of buying cheap things you can afford right away.";
- mes "It's better to wait until you have enough for something that is of high quality. That way you spend less money overall.";
- goto M_Menu;
- R2_4:
- mes "[Friend of Youth]";
- mes "It's a very interesting thing. To be honest, money just might be the REAL MONSTER in this world....";
- next;
- mes "[Friend of Youth]";
- mes "One man's trash is another man's treasure! Go out and gather everything you can find! Don't be embarrassed about it!";
- goto M_Menu;
- M_3:
- if(@temp ==1) goto R3_1;
- if(@temp ==2) goto R3_End;
-
- R3_0:
- mes "[Friend of Youth]";
- mes "It's good to be worried about your grades. You will have a bright future if you study hard and get good grades.";
- mes "It can be difficult to do, but that is how life is. The difficult things in life are the ones worth doing.";
- next;
- goto R3_End;
- R3_1:
- mes "[Friend of Youth]";
- mes "Worrying about your grades can be a hassle. And sometimes it's hard to be confident that you will get good grades.";
- mes "But stay positive and keep your head up! With hard work and perseverance you'll surely achieve your goals.";
- next;
- goto R3_End;
- R3_End:
- mes "[Friend of Youth]";
- mes "Concentrating on studies is difficult. Come back any time to ask questions regarding your studies! I'll be waiting.";
- goto M_Menu;
-
- M_4:
- if(@temp ==1) goto R4_1;
- if(@temp ==2) goto R4_2;
- if(@temp ==3) goto R4_3;
-
- R4_0:
- mes "[Friend of Youth]";
- mes "A person who worries about the future is one who is ill prepared for it.";
- mes "And yet a person who prepares for the future is also one who worries about it.";
- next;
- goto R4_End;
- R4_1:
- mes "[Friend of Youth]";
- mes "Hmm... Don't you think you're worrying too much about the future?? Try focusing more on the present.";
- mes "Obsessing over the future will eventually cause problems for you in the hear and now.";
- next;
- goto R4_End;
- R4_2:
- mes "[Friend of Youth]";
- mes "If all you do is play and you don't plan ahead for your future, you may have to re-think your approach to life.";
- next;
- mes "[Friend of Youth]";
- mes "There is an old story about the Thief Bug who was happy and full during the winter months,....";
- mes "while the Rocker was starving and cold...The Thief Bug planned ahead and gathered enough food for winter,.....";
- mes "where as the Rocker had spent all his time playing and did not have enough food for the winter.";
- next;
- mes "[Friend of Youth]";
- mes "The person who treasures his/her life prepares for the future. So treasure your life and plan for the future!!";
- next;
- goto R4_End;
- R4_3:
- mes "[Friend of Youth]";
- mes "You have the ability to leap towards the future! But the past has a hold of your ankle and wont let go.";
- next;
- mes "[Friend of Youth]";
- mes "Break free and move towards the future and be prepared to face what lies ahead!";
- emotion e_no1;
- next;
- goto R4_End;
- R4_End:
- mes "[Friend of Youth]";
- mes "There are many reasons to look forward to the future. So until you find one for yourself, keep searching for it.";
- mes "And feel free to come back for another reading any time okay?";
- goto M_Menu;
- M_5:
- if(@temp ==1 && countitem(2280)>=1) goto R5_1;
- if(@temp ==2) goto R5_2;
- if(@temp ==3) goto R5_3;
- if(@temp ==4) goto R5_4;
-
- R5_0:
- mes "[Friend of Youth]";
- mes "Equipping basic items that provide you with exactly what you need is important.";
- mes "But isn't there a way to make equipment more stylish?";
- next;
- goto R5_End;
- R5_1:
- mes "[Friend of Youth]";
- mes "Wah! A Sakkat hat with that type of outfit is a bad idea!!";
- emotion e_omg;
- next;
- mes "[Friend of Youth]";
- mes "Wow, now that I think about it, it's unbearable!!";
- next;
- goto R5_End;
-
- R5_2:
- mes "[Friend of Youth]";
- mes "A Mr. Smile mask and an Orc Helmet look cute when used together. But a Mr. Smile cap by itself is just plain scary!";
- next;
- mes "[Friend of Youth]";
- mes "Why is that??";
- emotion e_what;
- next;
- goto R5_End;
- R5_3:
- mes "[Friend of Youth]";
- mes "An Adventurer's Suit is so cool! Especially when a guy wears it. It just seems to add to his charm!";
- next;
- mes "[Friend of Youth]";
- mes "But wear a pair of Red Sandals with it.... and that becomes just TOOOO much to bear!!";
- emotion e_swt2;
- next;
- goto R5_End;
- R5_4:
- mes "[Friend of Youth]";
- mes "It's nice to wear expensive headgear. It's nice to wear fancy clothing too!";
- mes "But remember to make everything match or you'll look like a fool!";
- mes "You can't just wear everything that you think is fancy.";
- next;
- mes "[Friend of Youth]";
- mes "Make sure the things you wear go with each other and compliment one another.";
- next;
- goto R5_End;
- R5_End:
- mes "[Friend of Youth]";
- mes "Hmm... this has nothing to do with fortune telling... but still... I like talking about fashion.";
- goto M_Menu;
-
- M_End:
- close;
-}
-
-
-//<============================================ Mage Guild ===============================================>\\
-// Dark Wizard -------------------------------------------------------------------------
-geffen_in.gat,164,109,2 script Dark Wizard 64,{
-
- if(BaseJob == 2 || BaseJob == 9) goto L_Magic;
-
- mes "[Dark Wizard]";
- mes "Hmf. I only speak to those with magic abilities....";
- close;
-
-L_Magic:
- mes "[Dark Wizard]";
- mes "Oh... I can feel the mighty spirits stirring around me.";
- next;
- mes "[Dark Wizard]";
- mes "You there, I sense that you too use magic.";
- next;
- mes "[Dark Wizard]";
- mes "Magic... a great power which is dictated by cause and effect. If it is used for good then in turn positive reactions will occur.";
- mes "However, if it is used for evil, then negative reactions will occur instead. When using magic you truly reap what you sew.";
- next;
- mes "[Dark Wizard]";
- mes "Have you ever heard of ^0000ddGemstones^000000? Some magic spells are so powerful that they require the use of a Gemstone.";
- mes "These stones amplify a magic users power and allow them to cast high level spells. They can be bought at the magic store in town.";
- next;
- mes "[Dark Wizard]";
- mes "Always remember that magic should only be used for the benefit of people, not to do them harm.";
- close;
-}
+//===== eAthena Script =======================================
+//= Geffen Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.51
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 - Spell Checked [massdriller]
+//= 1.2 Fixed more typo’s [Nexon]
+//= 1.3 added a Level 4 weapon quest related NPC [MasterOfMuppets]
+//= 1.4 Removed Duplicates [Silent]
+//= 1.5 Fixed some typos and coordinates [Musashiden]
+//= 1.51 Fixed a small typo [Evera]
+//============================================================
+
+
+// Lady -------------------------------------------------------
+geffen.gat,59,143,8 script Lady#01 91,{
+ mes "[Lady]";
+ mes "Oh, you must be a Stranger here.";
+ next;
+ mes "[Lady]";
+ mes "Welcome to Geffen, the City of Magic. You Must be very tired? Why don't you eat Some ^ffaa00Honey^000000? It will relieve of your fatigue";
+ next;
+ mes "[Lady]";
+ mes "Honey is very sweet and highly nutritious. It will allow you to ^0000ffregain^000000 some of your ^0000ffHP as well as SP^000000.";
+ mes "It's gathered by Hornets for the queen bee ^ff0000Mistress^000000. mistress is a very rare and powerfully monster.";
+ next;
+ mes "[Lady]";
+ mes "BELIEVE me, you DON'T want to try and take honey away from HER....";
+ next;
+ mes "[Lady]";
+ mes "There are other monsters that drop honey but they are fairly strong. Honey is pretty hard to come by which makes it very pricey to buy.";
+ next;
+ mes "[Lady]";
+ mes "Believe it or not Honey is actually NOT the most valuable bee product there is.......";
+ mes "Apparently ^ffaa00`Royal Jelly'^000000, which is made by ^ff0000Mistress^000000 herself, is even rarer and more sought after.";
+ next;
+ mes "[Lady]";
+ mes "Ah~ Thinking of Royal Jelly makes my mouth Water~";
+ close;
+}
+
+
+// Womankind ------------------------------------------------------------
+geffen.gat,111,48,2 script Kind Woman 101,{
+ mes "[Kind Woman]";
+ mes "Good Day, adventurer.";
+ next;
+ mes "[Kind Woman]";
+ mes "Have you ever seen the ^ff0000Orcs^000000, the Demi-Human Tribe?";
+ next;
+ mes "[Kind Woman]";
+ mes "South of here, deep in the forest, lies the home land of the Orcs. I hear they have a unique culture and language that is much different from our own.";
+ next;
+ mes "[Kind Woman]";
+ mes "I wonder.....? Do they dream of love and romance just as we do? Hmm..... I wonder........";
+ close;
+}
+
+
+// Researcher ------------------------------------------------------------------------
+geffen.gat,156,190,8 script Researcher 57,{
+ mes "[Researcher]";
+ mes "Hmm... Interesting. Hmm... It is Very interesting....";
+ next;
+ mes "[Researcher]";
+ mes "Oh, you've come at just the right time. Let me tell you about something I just discovered.";
+ next;
+ mes "[Researcher]";
+ mes "You see, I found this Mysterious Scroll when I was researching Magic. In the scroll there is a description of a tree named ^008800Yggdrasill^000000.";
+ mes "It says that the leaves, seeds, and fruits of this tree are somehow connected to the creation and preservation of life in this world.";
+ next;
+ mes "[Researcher]";
+ mes "I've never actually come across the leaves, seeds, or fruits of the Yggdrasill, let alone the tree itself..... but.....";
+ next;
+ mes "[Researcher]";
+ mes "The idea of a tree of life is quite amazing! Don't you think so?";
+ close;
+}
+
+// Young Man --------------------------------------------------------------------------
+geffen.gat,147,26,0 script Young man#06 97,{
+ mes "[Young Man]";
+ mes "I heard that somewhere in this world, there is a rare staff which transforms its owner's psychic power into physical powers, and endows with destructive force also...";
+ mes "With this, everybody could be as strong as Hercules, despite their lack of muscles. Haw haw...I will take it.";
+ next;
+ mes "[Young Man]";
+ mes "Good heavens! You, since when were you behind me?";
+ mes "Did you happen to hear what I said? Ha ma...Muhaha. I didn't say anything. If you heard anything from me, just forget~Forget about it~";
+ mes "Yay~ veggie is cheap today~come on!!";
+ close;
+}
+
+// Young Man -----------------------------------------------------------------------
+geffen_in.gat,34,170,0 script Young man#07 47,{
+ mes "[Young Man]";
+ mes "Hello? Isn't it wonderful, today? I am a promising young Mage. Ahem.";
+ mes "Nowadays, my mental anguish about magic things keeps me awake every night..sigh...Especially, about the weak point of magic, you know.";
+ next;
+ mes "[Young Man]";
+ mes "Darn! It was really annoying when I encountered that long-ranged enemy last time. It disrupted magic casting.";
+ mes "After all I realized I need a weapon to counter Such a long-ranged attack from an enemy....But geez.. It is not easy to make such a weapon I wish.";
+ next;
+ mes "There should be another way.....Should be.....";
+ mes "Any ideas for me?";
+ close;
+}
+
+
+//<============================================ Inn =====================================================>\\
+// Waitress ---------------------------------------------------------------------------
+geffen_in.gat,70,67,5 script Waitress#01 80,{
+ mes "[Waitress]";
+ mes "Ugh!! SO annoying! Why would you drink here when you could drink at the pub!? This is an Inn, not a pub!!";
+ mes "That man!... every time he drinks... he gets like that! Ugh!!";
+ emotion e_an;
+ next;
+ mes "[Waitress]";
+ mes "(~yells to the man~)'Hey mister! I TOLD you... THIS.. IS.. AN INN, NOT A BAR!!'";
+ emotion e_pif;
+ next;
+ mes "[Waitress]";
+ mes "(~sighs~) That old man in the front corner there gives me a headache.";
+ mes "My younger sister, who works at the pub, told me that there is someone just like him at the Pub.";
+ next;
+ mes "[Waitress]";
+ mes "To think that there are 2 of them in one city... It's JUST ABSURD!!";
+ emotion e_pif;
+ next;
+ mes "[Waitress]";
+ mes "(~mumbles~)... I wish they would both just leave this town and be forgotten forever... that would be nice....";
+M_Menu:
+ next;
+ menu "May I have a drink?",M_0, "Has there been anything interesting lately?",M_1, "End Conversation",M_End;
+
+ M_0:
+ mes "[Waitress]";
+ mes "Oh my, I'm sorry but that DRUNKARD swallowed up every last drop of liquor we have.";
+ mes "Everyday it's the same thing... as soon as the Inn opens he comes in and gulps down drink after drink.";
+ next;
+ mes "[Waitress]";
+ mes "It's amazing he hasn't died yet. Maybe if you came by some other time we'll be restocked... oh who am I kidding....";
+ goto M_Menu;
+ M_1:
+ mes "[Waitress]";
+ mes "Well... of all of the people who have stopped by lately, there are a group of merchants that have caught my attention.";
+ mes "I could tell right away that they were from out of town. My younger sister tells me they are from Schubaltzwald...";
+ next;
+ mes "[Waitress]";
+ mes "It really doesn't matter who they are or where they're from, after all business is business. They could be from Schuschu Chocolate Land for all I care....";
+ next;
+ mes "[Waitress]";
+ mes "I just wish the amount of local customers would start increasing again, since they are the bulk of my customers.";
+ goto M_Menu;
+ M_End:
+ mes "[Waitress]";
+ mes "Have a nice day!";
+ close;
+}
+
+// Merchant Daven -------------------------------------------------------------------
+geffen_in.gat,79,75,2 script Merchant Daven 61,{
+ mes "[Merchant Daven]";
+ mes "Back in the day when I first came to Geffen, the town was a very boring place to live in.";
+ next;
+ mes "[Merchant Daven]";
+ mes "But now there are noble Mages and a flourishing community of Blacksmiths, that make Geffen.......";
+ next;
+ mes "[Merchant Daven]";
+ mes ".... still.... a very BORING place to be.... Bleh! I'm really bored here!!!";
+M_Menu:
+ next;
+ menu "-Mages?",M_0, "-Blacksmiths?",M_1, "-Who are you?",M_2, "-End Conversation.",M_End;
+
+ M_0:
+ mes "[Merchant Daven]";
+ mes "Mages and Wizards love to carry books around with them wherever they go. That's just how they are.";
+ next;
+ mes "[Merchant Daven]";
+ mes "Mages like to gather at the ^5555FFMagic Academy^000000 where they study the basics of magic use.";
+ next;
+ mes "[Merchant Daven]";
+ mes "After much study and with enough experience, Mages can become Wizards. Wizards can use much more powerful magical spells.";
+ mes "You can find them at the top floor of the ^5555FFGeffen Tower^000000.";
+ goto M_Menu;
+ M_1:
+ mes "[Merchant Daven]";
+ mes "Blacksmiths are difficult people. They are also a dirty bunch, whose faces are often covered with black soot.";
+ mes "No matter where they are or what they do, they always smell of iron and soot.";
+ next;
+ mes "[Merchant Daven]";
+ mes "However, that is something that can't be helped. Blacksmiths are always hard at work, refining ores, and tempering equipment.";
+ mes "It's just not possible to be a Blacksmith and not be dirty and smelly. Unfortunately it's part of the job.";
+ next;
+ mes "[Merchant Daven]";
+ mes "Weapons forged by Blacksmiths can be much more unique then those sold in Armories.";
+ mes "The actual ores and stones used by the Blacksmiths are of a much higher quality and are often scarce.";
+ mes "This can give their weapons special qualities that are very beneficial to a character.";
+ goto M_Menu;
+ M_2:
+ mes "[Merchant Daven]";
+ mes "Me?.... Oh I'm the world's PRETTIEST street merchant!!..... the he he...";
+ emotion e_kis;
+ next;
+ menu "..... I'm going to puke....",sM_0, ".... SLAPP him upside his head!!!",sM_1;
+
+ sM_0:
+ mes "[Merchant Daven]";
+ mes "Hehehe.... it was a joke.... a joke ok..... hehehe....";
+ emotion e_heh;
+ goto M_Menu;
+ sM_1:
+ mes "~^FF8000!!!^FF0000THWAAACCCKKK^FF8000!!!^000000~";
+ next;
+ mes "[Merchant Daven]";
+ mes "OW!! Ok! Ok! I was just kidding.... sheesh....";
+ emotion e_wah;
+ goto M_Menu;
+ M_End:
+ close;
+}
+
+// Drunkard -------------------------------------------------------------------
+geffen_in.gat,59,62,2 script Drunkard#01 120,{
+ mes "[Drunkard]";
+ mes "Hmm... You're Joshua's friend too??";
+ next;
+ menu "-Nope.",M_0, "-Who's that??",M_1, "-I have no friends.(~sob~)",M_2;
+
+ M_0:
+ mes "[Drunkard]";
+ mes "Hmf. Yeah... that dork has no reason to have any friends. Forget I even asked.";
+ close;
+ M_1:
+ mes "[Drunkard]";
+ mes "Uh... well if you go down this hall to the room on the left... you'll find this dork.";
+ mes "All day long, he just stays in that dark room tempering steel.... who the hell knows what he's making....";
+ next;
+ mes "[Drunkard]";
+ mes "If you're interested you should go talk to him. From the looks of it, you two would probably get along really well... HAHAHA!";
+ emotion e_heh;
+ close;
+ M_2:
+ mes "[Drunkard]";
+ mes "Oh... I see, I see. My apologies. You seem to be sensitive about this. To think that you have no friends....";
+ mes "Ya know, you remind me of my younger self! Heck... you might end up just like me... heh heh.";
+ next;
+ mes "[Drunkard]";
+ mes "(~sob~sob~).... oh what happened to my life!!!....(~baaaahhhh~)";
+ emotion e_sob;
+ next;
+ mes "[Waitress]";
+ mes "ARGH!! STOP being so noisy!";
+ close;
+}
+
+// Schubaltzwald Merchant ----------------------------------------------------------------------
+geffen_in.gat,113,73,4 script Schubaltzwald Merchant 709,{
+ mes "[Schubaltzwald Merchant]";
+ mes "How are you, Rune-Midgard young'un? I am Schubaltzwald's one and only Hans Hadenhiem.";
+ next;
+ mes "[Schubaltzwald Merchant]";
+ mes "My business associates and I plan to do business, both here in Geffen, and at home in Schubaltzwald.";
+ next;
+ mes "[Schubaltzwald Merchant]";
+ mes "Although Rune-Midgard doesn't seem to have any exciting places to go sight-seeing, it does have a lot of interesting merchandise.";
+ mes "Because of their uniqueness, these items have become quite valuable in my city.";
+ next;
+ mes "[Schubaltzwald Merchant]";
+ mes "Something may be plentiful here, but scarce somewhere else, an item may be popular there but not here....";
+ mes "That is what makes being a merchant so interesting, the variety of items to buy and sell between different places.";
+ next;
+ mes "[Schubaltzwald Merchant]";
+ mes "Of course it would be ideal if a merchant could have a widespread distribution of the same items in different cities.";
+ next;
+ mes "[Schubaltzwald Merchant]";
+ mes "If you're not satisfied with the merchandise, just wait, and some other day what you're looking for may be in stock.";
+ mes "It's a merchant's duty to make the customer happy with the quality of the items being sold!";
+ close;
+}
+
+
+//<============================================== Pub ==================================================>\\
+// Waitress -----------------------------------------------------------------
+geffen_in.gat,28,134,4 script Waitress#03 69,{
+ mes "[Waitress]";
+ mes "Meh! ALWAYS drinking and ALWAYS fighting..... HEY Mister! This is a place of BUSINESS!!";
+ emotion e_an;
+ next;
+ mes "[Waitress]";
+ mes "That man gives me a headache. My sister at the Inn says that there is another IDIOT just LIKE HIM there!";
+ mes "I CAN'T BELIEEEEVE that there is more that one IDIOT like him in this world..... I wish they would just... just... DISAPPEAR!!";
+ next;
+ mes "[Waitress]";
+ mes "(~sighs~)";
+ emotion e_pif;
+M_Menu:
+ next;
+ menu "Could I get drink?",M_0, "Anything interesting going on lately?",M_1, "End Conversation",M_End;
+
+ M_0:
+ mes "[Waitress]";
+ mes "Jeez, I'm real sorry but we ran out of liquor. THAT DRUNKARD chugged down every last drop we had....";
+ mes "As soon as we open he's in here downing drink after drink! I'm surprised he's still alive.";
+ next;
+ mes "[Waitress]";
+ mes "Maybe if you stopped by later.... but then again, the way HE'S been drinking.... you might have better luck else where....";
+ goto M_Menu;
+ M_1:
+ mes "[Waitress]";
+ mes "Hmm... there really hasn't been anything new going on lately.... there haven't been any rumors from the customers either....";
+ mes "Come to think of it.... you yourself are a person of few words....";
+ next;
+ mes "[Waitress]";
+ mes "I'm sure there's a reason why there has been such a lull as of late....";
+ mes "It's just we working girls tend to get REALLLYYY BORED.... so if anything exciting happens let me know okay?";
+ goto M_Menu;
+ M_End:
+ mes "[Waitress]";
+ mes "You have a nice day now!";
+ close;
+}
+
+// Drunkard ----------------------------------------------------------------------------
+geffen_in.gat,21,125,5 script Drunkard#02 52,{
+ mes "[Drunkard]";
+ mes "You want to be an idiotic magician? Is that why you came here??";
+ emotion e_what;
+ close;
+}
+
+// Lvl 4 weapon quest related NPC ------------------------------------------------------
+
+geffen.gat,203,146,5 script Citizen 97, {
+ mes "[Citizen]";
+ mes "There was a skillful weaponsmith";
+ mes "in Al De Baran who had 4 sons.";
+ mes "Unfortunately he lost all of his sons";
+ mes "while developing a powerful weapon.";
+ mes "The father survived alone from the tragedy.";
+ next;
+ mes "[Citizen]";
+ mes "How sad it will be for the father...";
+ mes "Because of the incident, the weaponsmith";
+ mes "retired from his work and hid himself somewhere.";
+ mes "After that, no one could ever see";
+ mes "the powerful weapon that he and his sons were developing.";
+ next;
+ mes "[Citizen]";
+ mes "I don't think that 4 sons of him";
+ mes "went to the heaven with the anxiety.";
+ close;
+}
+
+// Friend of Youth ---------------------------------------------------------------------
+geffen_in.gat,37,124,5 script Friend of Youth 704,{
+ set @temp,0;
+ mes "[Friend of Youth]";
+ mes "Welcome young one! Are you worrying about something? Tell me all your troubles and I will tell you your fortune with my silver ball of mystery!";
+M_Menu:
+ next;
+ set @temp, rand(5);
+ menu "-Life!",M_0, "-Love!",M_1, "-Fortune!",M_2, "-Grades!",M_3, "-Future!",M_4, "-Fashion!",M_5, "-End.",M_End;
+
+ M_0:
+ if(@temp ==1) goto R0_1;
+ if(@temp ==2) goto R0_2;
+ if(@temp ==3) goto R0_3;
+ if(@temp ==4) goto R0_4;
+
+ R0_0:
+ mes "[Friend of Youth]";
+ mes "It seems that you've had to deal with many problems recently... but don't despair.";
+ mes "Although you may have to endure some hardships now, the road ahead of you is clear.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Being tossed out in the desert, naked, and chased by a Peco Peco really isn't that bad.";
+ mes "If you maintain your composure and persevere, you will be able to enjoy the sweet taste of accomplishment.";
+ next;
+ mes "[Friend of Youth]";
+ mes "So keep your head up and endure for a bit longer!";
+ next;
+ goto R0_End;
+ R0_1:
+ mes "[Friend of Youth]";
+ mes "It looks as though you have chosen an obscure path for yourself. You may feel as though you may have made a mistake.";
+ mes "This uncertainty about your choices affects you even now. Try to take a break and relax.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Re-organize yourself to better handle the situation that surrounds you.";
+ mes "Rearrange your items and equipment to give yourself a 'fresh' start.";
+ next;
+ goto R0_End;
+ R0_2:
+ mes "[Friend of Youth]";
+ mes "The evil forces that envy your fortune and good health are always watching you.";
+ mes "They are jealous of what you have and are eagerly waiting for you to make mistakes.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Therefore you must be more careful with your actions. Proceed with caution, especially in dangerous situations.";
+ mes "Remain calm however, and continue to prepare for the days to come.";
+ next;
+ goto R0_End;
+ R0_3:
+ mes "[Friend of Youth]";
+ mes "Some recent turmoil between you and someone you know still looms over your head.";
+ mes "There is no way to avoid the problems... you must face them head on.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Try to resolve the issues in a calm, peaceful, and friendly manner. Think about the relationship you have with this person.";
+ next;
+ goto R0_End;
+ R0_4:
+ mes "[Friend of Youth]";
+ mes "Lately you have been living in the darkness of the monsters.";
+ mes "The power of the dark is too strong and you must pull away from it.";
+ next;
+ mes "[Friend of Youth]";
+ mes "In order to do that you must be physically strong and mentally able. Give it all you have and make good use of your training!";
+ next;
+
+ R0_End:
+ mes "[Friend of Youth]";
+ mes "Now, have the questions about your life been answered? Feel free to ask me again. I am always on your side friend!";
+ emotion e_no1;
+ goto M_Menu;
+
+ M_1:
+ if(@temp ==1) goto R1_1;
+ if(@temp ==2) goto R1_2;
+ if(@temp ==3) goto R1_3;
+
+ R1_0:
+ mes "[Friend of Youth]";
+ mes "Tsk tsk.... Are you looking for another love?";
+ emotion e_what;
+ next;
+ mes "[Friend of Youth]";
+ mes "So you're not satisfied with the relationship your in now.... you want one that is new, better, more exciting.......";
+ next;
+ mes "[Friend of Youth]";
+ mes "Don't be a fool!! Treasure the love you have now! You never no where a wandering heart will lead you....";
+ emotion e_gasp;
+ next;
+ goto R1_End;
+ R1_1:
+ mes "[Friend of Youth]";
+ mes "Everybody says that love is wonderful. THAT IS, until things go WRONG, then it's not so easy to say that love is wonderful.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Maybe your not quite ready for love right now. Build up some more confidence in yourself then go after that special someone with all your heart.";
+ next;
+ mes "[Friend of Youth]";
+ mes "With that confidence and a little bit of luck, you're sure to find love. Always!!";
+ emotion e_no1;
+ next;
+ goto R1_End;
+ R1_2:
+ mes "[Friend of Youth]";
+ mes "Oh ho! To be in love is a wonderful existence!";
+ mes "Love can be as exciting as running through a forest filled with porings while wildly swinging your sword around!!";
+ next;
+ mes "[Friend of Youth]";
+ mes "So BRANDISH your sword in the name of LOVE!!";
+ emotion e_no1;
+ next;
+ goto R1_End;
+ R1_3:
+ mes "[Friend of Youth]";
+ mes "Well now... You're so happy, you don't know what to do!! No matter how hard you try, you can't hide the fact that you're in love!";
+ next;
+ mes "[Friend of Youth]";
+ mes "Heh, I guess there's nothing for me to tell you.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Now if I could only find someone to love.......";
+ emotion e_hmm;
+ next;
+ goto R1_End;
+ R1_End:
+ mes "[Friend of Youth]";
+ mes "Even in this bleak world, love is all around you! Love can be fun so treasure the heart and come back for another reading!";
+ emotion e_no;
+ goto M_Menu;
+
+ M_2:
+ if(@temp ==1) goto R2_1;
+ if(@temp ==2) goto R2_2;
+ if(@temp ==3) goto R2_3;
+ if(@temp ==4) goto R2_4;
+
+ R2_0:
+ mes "[Friend of Youth]";
+ mes "For a young one such as yourself, money should not be the most important thing in your life.";
+ mes "Don't worry about money too much, just live your life to the fullest! Only then can something wonderful can happen to you.";
+ goto M_Menu;
+ R2_1:
+ mes "[Friend of Youth]";
+ mes "Let me tell you something, DON'T become obsessed with materialistic things!";
+ next;
+ mes "[Friend of Youth]";
+ mes "Although you need money to get by in this world, if acquiring wealth is your sole purpose in life....";
+ mes "you will ultimately find yourself disappointed and empty.";
+ goto M_Menu;
+ R2_2:
+ mes "[Friend of Youth]";
+ mes "Are you envious of someone's else's items?? DON'T BE!!";
+ mes "You are better then that! Seek that which makes you a better person";
+ goto M_Menu;
+ R2_3:
+ mes "[Friend of Youth]";
+ mes "Saving money is important. Don't get into the habit of buying cheap things you can afford right away.";
+ mes "It's better to wait until you have enough for something that is of high quality. That way you spend less money overall.";
+ goto M_Menu;
+ R2_4:
+ mes "[Friend of Youth]";
+ mes "It's a very interesting thing. To be honest, money just might be the REAL MONSTER in this world....";
+ next;
+ mes "[Friend of Youth]";
+ mes "One man's trash is another man's treasure! Go out and gather everything you can find! Don't be embarrassed about it!";
+ goto M_Menu;
+ M_3:
+ if(@temp ==1) goto R3_1;
+ if(@temp ==2) goto R3_End;
+
+ R3_0:
+ mes "[Friend of Youth]";
+ mes "It's good to be worried about your grades. You will have a bright future if you study hard and get good grades.";
+ mes "It can be difficult to do, but that is how life is. The difficult things in life are the ones worth doing.";
+ next;
+ goto R3_End;
+ R3_1:
+ mes "[Friend of Youth]";
+ mes "Worrying about your grades can be a hassle. And sometimes it's hard to be confident that you will get good grades.";
+ mes "But stay positive and keep your head up! With hard work and perseverance you'll surely achieve your goals.";
+ next;
+ goto R3_End;
+ R3_End:
+ mes "[Friend of Youth]";
+ mes "Concentrating on studies is difficult. Come back any time to ask questions regarding your studies! I'll be waiting.";
+ goto M_Menu;
+
+ M_4:
+ if(@temp ==1) goto R4_1;
+ if(@temp ==2) goto R4_2;
+ if(@temp ==3) goto R4_3;
+
+ R4_0:
+ mes "[Friend of Youth]";
+ mes "A person who worries about the future is one who is ill prepared for it.";
+ mes "And yet a person who prepares for the future is also one who worries about it.";
+ next;
+ goto R4_End;
+ R4_1:
+ mes "[Friend of Youth]";
+ mes "Hmm... Don't you think you're worrying too much about the future?? Try focusing more on the present.";
+ mes "Obsessing over the future will eventually cause problems for you in the hear and now.";
+ next;
+ goto R4_End;
+ R4_2:
+ mes "[Friend of Youth]";
+ mes "If all you do is play and you don't plan ahead for your future, you may have to re-think your approach to life.";
+ next;
+ mes "[Friend of Youth]";
+ mes "There is an old story about the Thief Bug who was happy and full during the winter months,....";
+ mes "while the Rocker was starving and cold...The Thief Bug planned ahead and gathered enough food for winter,.....";
+ mes "where as the Rocker had spent all his time playing and did not have enough food for the winter.";
+ next;
+ mes "[Friend of Youth]";
+ mes "The person who treasures his/her life prepares for the future. So treasure your life and plan for the future!!";
+ next;
+ goto R4_End;
+ R4_3:
+ mes "[Friend of Youth]";
+ mes "You have the ability to leap towards the future! But the past has a hold of your ankle and wont let go.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Break free and move towards the future and be prepared to face what lies ahead!";
+ emotion e_no1;
+ next;
+ goto R4_End;
+ R4_End:
+ mes "[Friend of Youth]";
+ mes "There are many reasons to look forward to the future. So until you find one for yourself, keep searching for it.";
+ mes "And feel free to come back for another reading any time okay?";
+ goto M_Menu;
+ M_5:
+ if(@temp ==1 && countitem(2280)>=1) goto R5_1;
+ if(@temp ==2) goto R5_2;
+ if(@temp ==3) goto R5_3;
+ if(@temp ==4) goto R5_4;
+
+ R5_0:
+ mes "[Friend of Youth]";
+ mes "Equipping basic items that provide you with exactly what you need is important.";
+ mes "But isn't there a way to make equipment more stylish?";
+ next;
+ goto R5_End;
+ R5_1:
+ mes "[Friend of Youth]";
+ mes "Wah! A Sakkat hat with that type of outfit is a bad idea!!";
+ emotion e_omg;
+ next;
+ mes "[Friend of Youth]";
+ mes "Wow, now that I think about it, it's unbearable!!";
+ next;
+ goto R5_End;
+
+ R5_2:
+ mes "[Friend of Youth]";
+ mes "A Mr. Smile mask and an Orc Helmet look cute when used together. But a Mr. Smile cap by itself is just plain scary!";
+ next;
+ mes "[Friend of Youth]";
+ mes "Why is that??";
+ emotion e_what;
+ next;
+ goto R5_End;
+ R5_3:
+ mes "[Friend of Youth]";
+ mes "An Adventurer's Suit is so cool! Especially when a guy wears it. It just seems to add to his charm!";
+ next;
+ mes "[Friend of Youth]";
+ mes "But wear a pair of Red Sandals with it.... and that becomes just TOOOO much to bear!!";
+ emotion e_swt2;
+ next;
+ goto R5_End;
+ R5_4:
+ mes "[Friend of Youth]";
+ mes "It's nice to wear expensive headgear. It's nice to wear fancy clothing too!";
+ mes "But remember to make everything match or you'll look like a fool!";
+ mes "You can't just wear everything that you think is fancy.";
+ next;
+ mes "[Friend of Youth]";
+ mes "Make sure the things you wear go with each other and compliment one another.";
+ next;
+ goto R5_End;
+ R5_End:
+ mes "[Friend of Youth]";
+ mes "Hmm... this has nothing to do with fortune telling... but still... I like talking about fashion.";
+ goto M_Menu;
+
+ M_End:
+ close;
+}
+
+
+//<============================================ Mage Guild ===============================================>\\
+// Dark Wizard -------------------------------------------------------------------------
+geffen_in.gat,164,109,2 script Dark Wizard 64,{
+
+ if(BaseJob == 2 || BaseJob == 9) goto L_Magic;
+
+ mes "[Dark Wizard]";
+ mes "Hmf. I only speak to those with magic abilities....";
+ close;
+
+L_Magic:
+ mes "[Dark Wizard]";
+ mes "Oh... I can feel the mighty spirits stirring around me.";
+ next;
+ mes "[Dark Wizard]";
+ mes "You there, I sense that you too use magic.";
+ next;
+ mes "[Dark Wizard]";
+ mes "Magic... a great power which is dictated by cause and effect. If it is used for good then in turn positive reactions will occur.";
+ mes "However, if it is used for evil, then negative reactions will occur instead. When using magic you truly reap what you sew.";
+ next;
+ mes "[Dark Wizard]";
+ mes "Have you ever heard of ^0000ddGemstones^000000? Some magic spells are so powerful that they require the use of a Gemstone.";
+ mes "These stones amplify a magic users power and allow them to cast high level spells. They can be bought at the magic store in town.";
+ next;
+ mes "[Dark Wizard]";
+ mes "Always remember that magic should only be used for the benefit of people, not to do them harm.";
+ close;
+}
diff --git a/npc/cities/gonryun.txt b/npc/cities/gonryun.txt
index 1549721d3..405a0c119 100644
--- a/npc/cities/gonryun.txt
+++ b/npc/cities/gonryun.txt
@@ -1,572 +1,572 @@
-//===== eAthena Script =======================================
-//= Gonryun Town
-//===== By: ==================================================
-//= x[tsk], KarLaeda
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//
-//===== Additional Comments: =================================
-// May be missing npc's and dialogue.
-//= 1.1 Fixed Typo’s [Nexon]
-//= 1.2 Removed Duplicates [Silent]
-//= 1.3 Max NPC Name is 23 [Toms]
-//= 1.3a Removed temp NPC plugs due Broken Sword quest [Lupus]
-//= 1.4 Added missing NPC [KarLaeda]
-//============================================================
-
-
-alberta.gat,245,69,4 script Public Relations#01 776,{
- mes "[Waba]";
- mes "Hello there! I have traveled far from the Kingdom of Gonryun, my hometown.";
- mes "I invite all to visit and celebrate the diversity of Gonryun! We welcome all sorts of visitors.";
- M_Menu:
- next;
- menu "Gonryun? What is that?",M_1, "Travel to Gonryun.",M_2, "Nevermind.",M_End;
-
- M_1:
- mes "[Waba]";
- mes "The Kingdom of Gonryun is a sight to behold! It floats high above the sky, beyond the pillar of light!";
- next;
- mes "[Waba]";
- mes "You can certainly appreciate the sights of the floating mainland! If you go, be sure to try.";
- mes "The steamed dumplings and peaches, they're a Gonryun specialty not to be missed!";
- goto M_Menu;
- M_2:
- mes "[Waba]";
- mes "The traveling expenses are ^0000ff10,000 zeny^000000. The fee is a bit pricy but this is because of the dangerous nature of the trip.";
- mes "The return trip is free, however. Are you prepared to go?";
- next;
- menu "Let's Go!",-, "Actually... I changed my mind, sorry.",M_End;
-
- if (Zeny < 10000){
- mes "[Waba]";
- mes "I am sorry if it seems like a lot, but the ^0000ff10,000 zeny^000000 we request is necessary in order to make the trip.";
- close;
- }
- set Zeny,Zeny-10000;
- warp "gon_fild01.gat",258,82;
- end;
- M_End:
- mes "[Waba]";
- mes "Please see me again if you want to visit! I am pleased just to meet an honored guest from the Continent.";
- close;
-
-}
-
-//===============================================================================
-
-gon_fild01.gat,255,79,6 script Public Relations#02 776,{
- mes "[Waba]";
- mes "We are ready to head back as soon as the conditions are favorable.";
- next;
- menu "ALBERTA.",-,"I'll stay a bit longer.",M_End;
-
- warp "alberta.gat",243,68;
- end;
- M_End:
- mes "[Waba]";
- mes "Oh there's no rush! Enjoy yourself and take in all the sights!";
- close;
-}
-
-//===============================================================================
-
-gon_fild01.gat,187,239,4 script Public Relations#03 776,{
- mes "[Choseryu]";
- mes "The sacred pillar of light connects this island to Gonryun Kingdom. There's no time to idly chit chat now, be on your way.";
- mes "I hope you will have many fond memories of Gonryun before you leave.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,153,64,0 script Public Relations#04 776,{
- mes "[Choseryu]";
- mes "If you're ready to set sail I can send you back to the harbor.";
- next;
- menu "Send me to the harbor.",-,"I'd like to stay a bit longer.",M_End;
-
- mes "[Choseryu]";
- mes "Please come back to visit soon!";
- next;
- warp "gon_fild01.gat",258,82;
- close;
- M_End:
- mes "[Choseryu]";
- mes "Be sure to see all that Gonryun has to offer!";
- close;
-}
-
-//===============================================================================
-//Inn
-//===============================================================================
-
-gon_in.gat,153,35,4 script Hotel Manager 702,{
- mes "[Mayouban]";
- mes "Welcome! Your face is new around here. We've had many strangers from the outside coming into the village recently.";
- mes "We've been quite short-handed here at the hotel.";
- next;
- mes "[Mayouban]";
- mes "It always seems to be 'get me this' or 'get me that' with the customers! Never a tip or a compliment. I suppose I should really welcome all the extra business.";
- next;
- menu "I'd like something to drink.",-,"I'll be on my way.",M_End;
-
- mes "[Mayouban]";
- mes "Here you go. There have been so many rowdy customers lately sometimes I'd just like to sit down and have a drink myself.";
- close;
- M_End:
- mes "[Mayouban]";
- mes "May you have a safe journey! Come back any time.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,139,142,6 script Girl#08 772,{
- mes "[Sanfayon]";
- mes "................";
- mes "It's been great having new visitors come to the village, but........ ever since I was robbed by that Thief.......";
- next;
- mes "[Sanfayon]";
- mes "I have been so afraid of the foreigners.....";
- emotion e_wah;
- close;
-}
-
-//===============================================================================
-
-gon_in.gat,18,27,4 script Elder's Wife 771,{
- mes "[Sangufayon]";
- mes "Oh my! You look like an important visitor from the outside. Aren't you?";
- next;
- menu "Yes, I am.",-,"Where is the village Elder?",M_End;
-
- mes "[Sangufayon]";
- mes "We do not get many visitors from the outside to see my husband so it's so easy to spot them. Hohohohoho!";
- close;
- M_End:
- mes "[Sangufayon]";
- mes "The master of the house, hohohohoho? Why... he is upstairs on the second floor if you need to talk to him, hohohoho.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,119,111,4 script Chen Wan Sok 89,{
- mes "[Chen Wan Sok]";
- mes "The village Elder here is truly a sociable fellow. Just because he is friendly does not mean he is lax on the rules! He can get riled up sometimes.";
- next;
- mes "[Chen Wan Sok]";
- mes "When the Elder's blessing, you can get away with a lot of things in this town. Sometimes there are those that cause mischief, but they are always dealt with.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,237,225,4 script Hanyon Kyou 776,{
- mes "[Hanyon Kyou]";
- mes "How could I have done something like this?";
- mes "..............";
- next;
- mes "[Hanyon Kyou]";
- mes "I've dropped my lucky knife! Now it's probably gone forever.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,51,101,4 script Gaiysonchoru 778,{
- mes "[Gaiysonchoru]";
- emotion e_swt;
- mes "..............";
- next;
- mes "[Gaiysonchoru]";
- mes "Well......... I'm worried.";
- next;
- mes "[Gaiysonchoru]";
- mes "So very worried.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,237,226,3 script YunKyoHam#gn 776,{
- mes "[YunKyoHam]";
- if (nakha < 2) {
- mes "Oh no~ Holy cow!";
- mes "Can't believe I dropped";
- mes "my valuable knife! ahhhhhh.";
- if (baselevel >= 20) {
- next;
- if (nakha == 0) set nakha,1;
- mes "[YunKyoHam]";
- mes "I need to go down to get it";
- mes "but...the monsters..";
- mes "I am so scared.. What should I do!";
- }
- } else if (nakha == 2) {
- mes "ehhhh.. what should I do..";
- mes "got any business to";
- mes "take care of?";
- mes "hmm?";
- if (countitem(1201) < 1) close;
- next;
- mes "[YunKyoHam]";
- mes "uk! that...that knife";
- mes "is my ancestor's knife that";
- mes "I dropped from here.";
- mes "Where did you get it?";
- next;
- mes "[YunKyoHam]";
- mes "I dropped that knife from";
- mes "here and it belongs to my";
- mes "ancestor's property. It sure is";
- mes "a cheap knife,";
- mes "but really valuable to me";
- mes "and my family.";
- next;
- mes "[YunKyoHam]";
- mes "Would you hand that";
- mes "knife to me?";
- next;
- if (select("give.:ignore.") == 2 || countitem(1201) < 1) {
- mes "[YunKyoHam]";
- mes "Huk! my family heiloom!!";
- mes "You Evil! Satan! Animal! Hode";
- mes "My curse shall be on his head!!!";
- close;
- }
- mes "[YunKyoHam]";
- mes "ohoh! Thank you!";
- mes "Take these potions.";
- mes "They are not expensive";
- mes "but my favorites.";
- set nakha,3;
- delitem 1201, 1; // Knife
- getitem 505,2; // Blue_Potion
- next;
- mes "[YunKyoHam]";
- mes "You kept my family";
- mes "treasure safe. Thank you!!";
- mes "hahaha";
- } else {
- mes "next.. I heard my neighbor";
- mes "is worrying about something";
- mes "these days.. well, I got my";
- mes "own business to take care of.";
- }
- close;
-}
-
-gon_fild01.gat,245,257,0 script lost knife#gn 139,1,1,{
- if (nakha == 1) {
- set nakha, 2;
- mes "-something is hidden underneath the sand dunes-";
- mes " ";
- mes "-You have found an -";
- mes "-undefined knife.-";
- close2;
- getitem 1201, 1; // Knife
- end;
- }
-}
-
-gonryun.gat,200,82,3 script Sungson Gam#gn 774,{
- mes "[Sungson Gam]";
- mes "Festival is always wonderful.";
- mes "That's why I love this town.";
- mes "This town make me feel that I am";
- mes "in the middle of festival all the time. hehe.";
- close;
-}
-
-gonryun.gat,268,88,3 script Joonpo Lyang#gn 776,{
- mes "[Joonpo Lyang]";
- mes "We are proud in name of independent nation";
- mes "We've been fighting againt the evil envaders";
- mes "who wanted to take this blessed land.";
- mes "And we did win the battles and kept our land until now.";
- next;
- mes "[Joonpo Lyang]";
- mes "We believe in Victory of Triumphal song!";
- mes "That represents our sunrise!";
- close;
-}
-
-gonryun.gat,118,111,5 script Wonsuk Chen#gn 89,{
- mes "[Wonsuk Chen]";
- mes "A chieft of this town is";
- mes "an open-hearted man.";
- mes "But I heard that there are some";
- mes "people who don't like his character. hmm..";
- next;
- mes "[Wonsuk Chen]";
- mes "Well, I like my town. Chief's efforts";
- mes "make our town way better. I just hope";
- mes "I don't get to see some dummies";
- mes "around the town anymore.";
- close;
-}
-
-gonryun.gat,181,161,3 script Moonjin Chung#gn 773,{
- mes "[Moonjin Chung]";
- mes "The men in our town, Gonryun are";
- mes "all brave and energetic.";
- mes "But, they are unable to get married";
- mes "these days..";
- next;
- mes "[Moonjin Chung]";
- mes "It's all because there are";
- mes "way more men than women.";
- mes "I am not even sure whether";
- mes "my son could get married";
- mes "or not. hmm..";
- close;
-}
-
-gonryun.gat,113,135,6 script Gatekeeper#gn1 780,{
- mes "[Gatekeeper]";
- mes "Welcome. This is a resident";
- mes "of SaYumMoon, a chief";
- mes "of this town.";
- next;
- mes "[Gatekeeper]";
- mes "It won't likely to happen";
- mes "but, if we see anything suspicious,";
- mes "we'll arrest you right away.";
- next;
- mes "[Gatekeeper]";
- mes "But do not worry that much.";
- mes "Nothing will happen I believe.";
- mes "Enjoy your visit.";
- close;
-}
-
-gonryun.gat,113,127,6 script Gatekeeper#gn2 780,{
- mes "[Gatekeeper]";
- mes "Welcome. This is a resident";
- mes "of SaYumMoon, a chief";
- mes "of this town.";
- next;
- mes "[Gatekeeper]";
- mes "It won't likely to happen";
- mes "but, if we see anything suspicious,";
- mes "we'll arrest you right away.";
- next;
- mes "[Gatekeeper]";
- mes "But do not worry that much.";
- mes "Nothing will happen I believe.";
- mes "Enjoy your visit.";
- close;
-}
-
-gon_in.gat,73,82,5 script SungChul Ki#gn 778,{
- mes "[SungChul Ki]";
- if (nakha != 3) {
- mes "............";
- next;
- mes "[SungChul Ki]";
- mes "puuuuu....This sure is";
- mes "something to worry about.";
- close;
- }
- set cha, 1;
- mes "SungChul Ki is my name.";
- mes "I am a great tea maker.";
- mes "I give all my efforts";
- mes "in making tasty tea";
- mes "night and day.";
- next;
- mes "[SungChul Ki]";
- mes "hu...but I haven't make any";
- mes "great tea lately.";
- mes "I need some special";
- mes "ingredients...";
- next;
- mes "[SungChul Ki]";
- mes "There's a rumor says with snake,";
- mes "it's possible to make great tea.";
- mes "But where can I find and how can";
- mes "I catch one? that's not possible.";
- mes "hmm...";
- close;
-
-// no idea what should happen after you started the quest...
-// if ((v[cha] == 1) & (v[°Ç°-ȯ] > 0))
-// mes "[SungChul Ki]"
-// mes "...À_? ¹ìÀ> Àâ_Æ_- _ª¿Â"
-// mes "¹°°ÇÀ̶ó°í? ÈåÀ_..."
-// mes "¿ØÁö ¸ð¸_°Ô ÁÁ_ƺ¸ÀÌ_°É."
-// mes "À̸R Áຸ°Ô. Çѹø Â÷¸¦"
-// mes "¸¸÷é_°Ú_×!"
-// next;
-// mes "................................"
-// next;
-// mes "................................"
-// next;
-// mes "................................"
-// next;
-// endif
-//
-//
-//
-}
-
-//==============ÃàÁ¦ °ü¸RÀÎ================
-//npc "gon_in" "È_ÀÌ _º" 4_M_TWMIDMAN 101 21 3 5 5
-//OnClick:
-// mes "[È_ÀÌ _º]"
-// mes "ÈÞ¿ì... °ÆÁ¤ÀÌ+º."
-// mes "____ À̹ø¿¡÷÷ ÃàÁ¦¸¦ ¹úÀÏ"
-// mes "ŸÀ̹ÖÀÌ ¿Ô_Â÷_ _îÂî÷È"
-// mes "ÀÏÀÎÁö ÀüÇô ÃàÁ¦Áغñ°¡"
-// mes "÷ÇÁö_Ê_Ò_î..."
-// next;
-// mes "[È_ÀÌ _º]"
-
-gon_in.gat,173,27,3 script Kuha Woo#gn 774,{
- mes "[Kuha Woo]";
- mes "Like I expected, with my age,";
- mes "they don't sell alcohol to me.";
- mes "Adults seems enjoying drinks.";
- mes "I wonder how it taste.";
- next;
- mes "[Kuha Woo]";
- mes "However, they're making";
- mes "some tasty tea that even kid";
- mes "like me can enjoy.";
- mes "It's such a heart beating";
- mes "just even thinking about this new tea.";
- close;
-}
-
-gonryun.gat,163,60,4 script Gonryun Guide 780,{
- mes "[Wonchi Ha]";
- mes "Come to Gonryun where passion";
- mes "and energy overflows. You can feel liveliness";
- mes "just by walking around!";
- next;
- mes "[Wonchi Ha]";
- mes "I am responsible to help you";
- mes "with any questions you may have.";
- mes "so please feel free to ask any";
- next;
- switch(select("resident of Chief:Tool Dealer:Weapon Dealer:Armor Dealer:wine shop")){
- case 1:
- viewpoint 1,109,131,1,0xFF3355;
- mes "[Wonchi Ha]";
- mes "In your minimap";
- mes "Head to ^FF3355+^000000";
- mes "You'll get to a resident of chief.";
- mes "Enjoy your trip in";
- mes "lovely Gonryun!";
- break;
- case 2:
- viewpoint 1,147,82,2,0xCE6300;
- mes "[Wonchi Ha]";
- mes "In your minimap";
- mes "Head to ^CE6300+^000000";
- mes "You'll get to a Tool Dealer.";
- mes "Enjoy your trip in";
- mes "lovely Gonryun!";
- break;
- case 3:
- viewpoint 1,174,104,3,0x55FF33;
- mes "[Wonchi Ha]";
- mes "In your minimap";
- mes "Head to ^55FF33+^000000";
- mes "You'll get to a Weapon Dealer.";
- mes "Enjoy your trip in";
- mes "lovely Gonryun!";
- break;
- case 4:
- viewpoint 1,173,84,4,0x3355FF;
- mes "[Wonchi Ha]";
- mes "In your minimap";
- mes "Head to ^3355FF+^000000";
- mes "You'll get to an Armor Dealer.";
- mes "Enjoy your trip in";
- mes "lovely Gonryun!";
- break;
- case 5:
- viewpoint 1,215,114,5,0xFFFFFF;
- mes "[Wonchi Ha]";
- mes "In your minimap";
- mes "Head to ^FFFFFF+^000000";
- mes "You'll get to a wine shop.";
- mes "Enjoy your trip in";
- mes "lovely Gonryun!";
- break;
- }
- close;
-}
-
-gonryun.gat,166,196,3 script Soldier#gn 780,{
- mes "[Waguo]";
- if (b_sword < 7) {
- mes "You know what?";
- mes "This place used to be a shrine.";
- mes "From the certain period time,";
- mes "the Taoist hermits who failed to";
- mes "get to the kingdom in the sky began";
- mes "to gather, it became a den of monsters.";
- } else if (b_sword > 6 && b_sword < 10){
- mes "It was pretty noisy last night huh?";
- mes "Because of that theif, it was a mess.";
- mes "Noisier than the festivals.";
- mes "I couldn't sleep at all...";
- next;
- mes "[Waguo]";
- mes "Ahh~~~~!";
- mes "I was night working last night";
- mes "and all of a sudden, I saw";
- mes "something running straight";
- mes "into a shrine.";
- next;
- mes "[Waguo]";
- mes "It was moving so fast that";
- mes "I couldn't even decide to chase it";
- mes "at all. It was a ponderous creature";
- mes "looked like human. I wonder";
- mes "what it was...";
- } else {
- mes "You know what??";
- mes "This place used to be a shrine.";
- mes "From the certain period time,";
- mes "the Taoist hermits who failed to";
- mes "get to the kingdom in the sky began";
- mes "to gather, it became a den of monsters.";
- next;
- mes "[Waguo]";
- mes "Town is getting ready for the";
- mes "Festival, But it's taking long time.";
- mes "It never happended in the past.";
- }
- close;
-}
-
-gonryun.gat,169,71,3 script Guide#gn 770,{
- mes "[Leeheemin]";
- mes "Welcome~";
- mes "Did you enjoy sightseeing";
- mes "on the way?";
- mes "Small buildings you saw are a structures";
- mes "we made with hard working efforts.";
- next;
- mes "[Leeheemin]";
- mes "They are a miniatures of";
- mes "Rune-Midgarts Kingdom.";
- mes "You can have a view of";
- mes "cities at a glance.";
- mes "It was not easy to work on it.";
- mes "Don't you think they're masterpiece?";
- next;
- mes "[Leeheemin]";
- mes "If you look around carefully,";
- mes "You'll find a lots of beautiful";
- mes "sights all over the town.";
- close;
+//===== eAthena Script =======================================
+//= Gonryun Town
+//===== By: ==================================================
+//= x[tsk], KarLaeda
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//
+//===== Additional Comments: =================================
+// May be missing npc's and dialogue.
+//= 1.1 Fixed Typo’s [Nexon]
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Max NPC Name is 23 [Toms]
+//= 1.3a Removed temp NPC plugs due Broken Sword quest [Lupus]
+//= 1.4 Added missing NPC [KarLaeda]
+//============================================================
+
+
+alberta.gat,245,69,4 script Public Relations#01 776,{
+ mes "[Waba]";
+ mes "Hello there! I have traveled far from the Kingdom of Gonryun, my hometown.";
+ mes "I invite all to visit and celebrate the diversity of Gonryun! We welcome all sorts of visitors.";
+ M_Menu:
+ next;
+ menu "Gonryun? What is that?",M_1, "Travel to Gonryun.",M_2, "Nevermind.",M_End;
+
+ M_1:
+ mes "[Waba]";
+ mes "The Kingdom of Gonryun is a sight to behold! It floats high above the sky, beyond the pillar of light!";
+ next;
+ mes "[Waba]";
+ mes "You can certainly appreciate the sights of the floating mainland! If you go, be sure to try.";
+ mes "The steamed dumplings and peaches, they're a Gonryun specialty not to be missed!";
+ goto M_Menu;
+ M_2:
+ mes "[Waba]";
+ mes "The traveling expenses are ^0000ff10,000 zeny^000000. The fee is a bit pricy but this is because of the dangerous nature of the trip.";
+ mes "The return trip is free, however. Are you prepared to go?";
+ next;
+ menu "Let's Go!",-, "Actually... I changed my mind, sorry.",M_End;
+
+ if (Zeny < 10000){
+ mes "[Waba]";
+ mes "I am sorry if it seems like a lot, but the ^0000ff10,000 zeny^000000 we request is necessary in order to make the trip.";
+ close;
+ }
+ set Zeny,Zeny-10000;
+ warp "gon_fild01.gat",258,82;
+ end;
+ M_End:
+ mes "[Waba]";
+ mes "Please see me again if you want to visit! I am pleased just to meet an honored guest from the Continent.";
+ close;
+
+}
+
+//===============================================================================
+
+gon_fild01.gat,255,79,6 script Public Relations#02 776,{
+ mes "[Waba]";
+ mes "We are ready to head back as soon as the conditions are favorable.";
+ next;
+ menu "ALBERTA.",-,"I'll stay a bit longer.",M_End;
+
+ warp "alberta.gat",243,68;
+ end;
+ M_End:
+ mes "[Waba]";
+ mes "Oh there's no rush! Enjoy yourself and take in all the sights!";
+ close;
+}
+
+//===============================================================================
+
+gon_fild01.gat,187,239,4 script Public Relations#03 776,{
+ mes "[Choseryu]";
+ mes "The sacred pillar of light connects this island to Gonryun Kingdom. There's no time to idly chit chat now, be on your way.";
+ mes "I hope you will have many fond memories of Gonryun before you leave.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,153,64,0 script Public Relations#04 776,{
+ mes "[Choseryu]";
+ mes "If you're ready to set sail I can send you back to the harbor.";
+ next;
+ menu "Send me to the harbor.",-,"I'd like to stay a bit longer.",M_End;
+
+ mes "[Choseryu]";
+ mes "Please come back to visit soon!";
+ next;
+ warp "gon_fild01.gat",258,82;
+ close;
+ M_End:
+ mes "[Choseryu]";
+ mes "Be sure to see all that Gonryun has to offer!";
+ close;
+}
+
+//===============================================================================
+//Inn
+//===============================================================================
+
+gon_in.gat,153,35,4 script Hotel Manager 702,{
+ mes "[Mayouban]";
+ mes "Welcome! Your face is new around here. We've had many strangers from the outside coming into the village recently.";
+ mes "We've been quite short-handed here at the hotel.";
+ next;
+ mes "[Mayouban]";
+ mes "It always seems to be 'get me this' or 'get me that' with the customers! Never a tip or a compliment. I suppose I should really welcome all the extra business.";
+ next;
+ menu "I'd like something to drink.",-,"I'll be on my way.",M_End;
+
+ mes "[Mayouban]";
+ mes "Here you go. There have been so many rowdy customers lately sometimes I'd just like to sit down and have a drink myself.";
+ close;
+ M_End:
+ mes "[Mayouban]";
+ mes "May you have a safe journey! Come back any time.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,139,142,6 script Girl#08 772,{
+ mes "[Sanfayon]";
+ mes "................";
+ mes "It's been great having new visitors come to the village, but........ ever since I was robbed by that Thief.......";
+ next;
+ mes "[Sanfayon]";
+ mes "I have been so afraid of the foreigners.....";
+ emotion e_wah;
+ close;
+}
+
+//===============================================================================
+
+gon_in.gat,18,27,4 script Elder's Wife 771,{
+ mes "[Sangufayon]";
+ mes "Oh my! You look like an important visitor from the outside. Aren't you?";
+ next;
+ menu "Yes, I am.",-,"Where is the village Elder?",M_End;
+
+ mes "[Sangufayon]";
+ mes "We do not get many visitors from the outside to see my husband so it's so easy to spot them. Hohohohoho!";
+ close;
+ M_End:
+ mes "[Sangufayon]";
+ mes "The master of the house, hohohohoho? Why... he is upstairs on the second floor if you need to talk to him, hohohoho.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,119,111,4 script Chen Wan Sok 89,{
+ mes "[Chen Wan Sok]";
+ mes "The village Elder here is truly a sociable fellow. Just because he is friendly does not mean he is lax on the rules! He can get riled up sometimes.";
+ next;
+ mes "[Chen Wan Sok]";
+ mes "When the Elder's blessing, you can get away with a lot of things in this town. Sometimes there are those that cause mischief, but they are always dealt with.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,237,225,4 script Hanyon Kyou 776,{
+ mes "[Hanyon Kyou]";
+ mes "How could I have done something like this?";
+ mes "..............";
+ next;
+ mes "[Hanyon Kyou]";
+ mes "I've dropped my lucky knife! Now it's probably gone forever.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,51,101,4 script Gaiysonchoru 778,{
+ mes "[Gaiysonchoru]";
+ emotion e_swt;
+ mes "..............";
+ next;
+ mes "[Gaiysonchoru]";
+ mes "Well......... I'm worried.";
+ next;
+ mes "[Gaiysonchoru]";
+ mes "So very worried.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,237,226,3 script YunKyoHam#gn 776,{
+ mes "[YunKyoHam]";
+ if (nakha < 2) {
+ mes "Oh no~ Holy cow!";
+ mes "Can't believe I dropped";
+ mes "my valuable knife! ahhhhhh.";
+ if (baselevel >= 20) {
+ next;
+ if (nakha == 0) set nakha,1;
+ mes "[YunKyoHam]";
+ mes "I need to go down to get it";
+ mes "but...the monsters..";
+ mes "I am so scared.. What should I do!";
+ }
+ } else if (nakha == 2) {
+ mes "ehhhh.. what should I do..";
+ mes "got any business to";
+ mes "take care of?";
+ mes "hmm?";
+ if (countitem(1201) < 1) close;
+ next;
+ mes "[YunKyoHam]";
+ mes "uk! that...that knife";
+ mes "is my ancestor's knife that";
+ mes "I dropped from here.";
+ mes "Where did you get it?";
+ next;
+ mes "[YunKyoHam]";
+ mes "I dropped that knife from";
+ mes "here and it belongs to my";
+ mes "ancestor's property. It sure is";
+ mes "a cheap knife,";
+ mes "but really valuable to me";
+ mes "and my family.";
+ next;
+ mes "[YunKyoHam]";
+ mes "Would you hand that";
+ mes "knife to me?";
+ next;
+ if (select("give.:ignore.") == 2 || countitem(1201) < 1) {
+ mes "[YunKyoHam]";
+ mes "Huk! my family heiloom!!";
+ mes "You Evil! Satan! Animal! Hode";
+ mes "My curse shall be on his head!!!";
+ close;
+ }
+ mes "[YunKyoHam]";
+ mes "ohoh! Thank you!";
+ mes "Take these potions.";
+ mes "They are not expensive";
+ mes "but my favorites.";
+ set nakha,3;
+ delitem 1201, 1; // Knife
+ getitem 505,2; // Blue_Potion
+ next;
+ mes "[YunKyoHam]";
+ mes "You kept my family";
+ mes "treasure safe. Thank you!!";
+ mes "hahaha";
+ } else {
+ mes "next.. I heard my neighbor";
+ mes "is worrying about something";
+ mes "these days.. well, I got my";
+ mes "own business to take care of.";
+ }
+ close;
+}
+
+gon_fild01.gat,245,257,0 script lost knife#gn 139,1,1,{
+ if (nakha == 1) {
+ set nakha, 2;
+ mes "-something is hidden underneath the sand dunes-";
+ mes " ";
+ mes "-You have found an -";
+ mes "-undefined knife.-";
+ close2;
+ getitem 1201, 1; // Knife
+ end;
+ }
+}
+
+gonryun.gat,200,82,3 script Sungson Gam#gn 774,{
+ mes "[Sungson Gam]";
+ mes "Festival is always wonderful.";
+ mes "That's why I love this town.";
+ mes "This town make me feel that I am";
+ mes "in the middle of festival all the time. hehe.";
+ close;
+}
+
+gonryun.gat,268,88,3 script Joonpo Lyang#gn 776,{
+ mes "[Joonpo Lyang]";
+ mes "We are proud in name of independent nation";
+ mes "We've been fighting againt the evil envaders";
+ mes "who wanted to take this blessed land.";
+ mes "And we did win the battles and kept our land until now.";
+ next;
+ mes "[Joonpo Lyang]";
+ mes "We believe in Victory of Triumphal song!";
+ mes "That represents our sunrise!";
+ close;
+}
+
+gonryun.gat,118,111,5 script Wonsuk Chen#gn 89,{
+ mes "[Wonsuk Chen]";
+ mes "A chieft of this town is";
+ mes "an open-hearted man.";
+ mes "But I heard that there are some";
+ mes "people who don't like his character. hmm..";
+ next;
+ mes "[Wonsuk Chen]";
+ mes "Well, I like my town. Chief's efforts";
+ mes "make our town way better. I just hope";
+ mes "I don't get to see some dummies";
+ mes "around the town anymore.";
+ close;
+}
+
+gonryun.gat,181,161,3 script Moonjin Chung#gn 773,{
+ mes "[Moonjin Chung]";
+ mes "The men in our town, Gonryun are";
+ mes "all brave and energetic.";
+ mes "But, they are unable to get married";
+ mes "these days..";
+ next;
+ mes "[Moonjin Chung]";
+ mes "It's all because there are";
+ mes "way more men than women.";
+ mes "I am not even sure whether";
+ mes "my son could get married";
+ mes "or not. hmm..";
+ close;
+}
+
+gonryun.gat,113,135,6 script Gatekeeper#gn1 780,{
+ mes "[Gatekeeper]";
+ mes "Welcome. This is a resident";
+ mes "of SaYumMoon, a chief";
+ mes "of this town.";
+ next;
+ mes "[Gatekeeper]";
+ mes "It won't likely to happen";
+ mes "but, if we see anything suspicious,";
+ mes "we'll arrest you right away.";
+ next;
+ mes "[Gatekeeper]";
+ mes "But do not worry that much.";
+ mes "Nothing will happen I believe.";
+ mes "Enjoy your visit.";
+ close;
+}
+
+gonryun.gat,113,127,6 script Gatekeeper#gn2 780,{
+ mes "[Gatekeeper]";
+ mes "Welcome. This is a resident";
+ mes "of SaYumMoon, a chief";
+ mes "of this town.";
+ next;
+ mes "[Gatekeeper]";
+ mes "It won't likely to happen";
+ mes "but, if we see anything suspicious,";
+ mes "we'll arrest you right away.";
+ next;
+ mes "[Gatekeeper]";
+ mes "But do not worry that much.";
+ mes "Nothing will happen I believe.";
+ mes "Enjoy your visit.";
+ close;
+}
+
+gon_in.gat,73,82,5 script SungChul Ki#gn 778,{
+ mes "[SungChul Ki]";
+ if (nakha != 3) {
+ mes "............";
+ next;
+ mes "[SungChul Ki]";
+ mes "puuuuu....This sure is";
+ mes "something to worry about.";
+ close;
+ }
+ set cha, 1;
+ mes "SungChul Ki is my name.";
+ mes "I am a great tea maker.";
+ mes "I give all my efforts";
+ mes "in making tasty tea";
+ mes "night and day.";
+ next;
+ mes "[SungChul Ki]";
+ mes "hu...but I haven't make any";
+ mes "great tea lately.";
+ mes "I need some special";
+ mes "ingredients...";
+ next;
+ mes "[SungChul Ki]";
+ mes "There's a rumor says with snake,";
+ mes "it's possible to make great tea.";
+ mes "But where can I find and how can";
+ mes "I catch one? that's not possible.";
+ mes "hmm...";
+ close;
+
+// no idea what should happen after you started the quest...
+// if ((v[cha] == 1) & (v[°Ç°-ȯ] > 0))
+// mes "[SungChul Ki]"
+// mes "...À_? ¹ìÀ> Àâ_Æ_- _ª¿Â"
+// mes "¹°°ÇÀ̶ó°í? ÈåÀ_..."
+// mes "¿ØÁö ¸ð¸_°Ô ÁÁ_ƺ¸ÀÌ_°É."
+// mes "À̸R Áຸ°Ô. Çѹø Â÷¸¦"
+// mes "¸¸÷é_°Ú_×!"
+// next;
+// mes "................................"
+// next;
+// mes "................................"
+// next;
+// mes "................................"
+// next;
+// endif
+//
+//
+//
+}
+
+//==============ÃàÁ¦ °ü¸RÀÎ================
+//npc "gon_in" "È_ÀÌ _º" 4_M_TWMIDMAN 101 21 3 5 5
+//OnClick:
+// mes "[È_ÀÌ _º]"
+// mes "ÈÞ¿ì... °ÆÁ¤ÀÌ+º."
+// mes "____ À̹ø¿¡÷÷ ÃàÁ¦¸¦ ¹úÀÏ"
+// mes "ŸÀ̹ÖÀÌ ¿Ô_Â÷_ _îÂî÷È"
+// mes "ÀÏÀÎÁö ÀüÇô ÃàÁ¦Áغñ°¡"
+// mes "÷ÇÁö_Ê_Ò_î..."
+// next;
+// mes "[È_ÀÌ _º]"
+
+gon_in.gat,173,27,3 script Kuha Woo#gn 774,{
+ mes "[Kuha Woo]";
+ mes "Like I expected, with my age,";
+ mes "they don't sell alcohol to me.";
+ mes "Adults seems enjoying drinks.";
+ mes "I wonder how it taste.";
+ next;
+ mes "[Kuha Woo]";
+ mes "However, they're making";
+ mes "some tasty tea that even kid";
+ mes "like me can enjoy.";
+ mes "It's such a heart beating";
+ mes "just even thinking about this new tea.";
+ close;
+}
+
+gonryun.gat,163,60,4 script Gonryun Guide 780,{
+ mes "[Wonchi Ha]";
+ mes "Come to Gonryun where passion";
+ mes "and energy overflows. You can feel liveliness";
+ mes "just by walking around!";
+ next;
+ mes "[Wonchi Ha]";
+ mes "I am responsible to help you";
+ mes "with any questions you may have.";
+ mes "so please feel free to ask any";
+ next;
+ switch(select("resident of Chief:Tool Dealer:Weapon Dealer:Armor Dealer:wine shop")){
+ case 1:
+ viewpoint 1,109,131,1,0xFF3355;
+ mes "[Wonchi Ha]";
+ mes "In your minimap";
+ mes "Head to ^FF3355+^000000";
+ mes "You'll get to a resident of chief.";
+ mes "Enjoy your trip in";
+ mes "lovely Gonryun!";
+ break;
+ case 2:
+ viewpoint 1,147,82,2,0xCE6300;
+ mes "[Wonchi Ha]";
+ mes "In your minimap";
+ mes "Head to ^CE6300+^000000";
+ mes "You'll get to a Tool Dealer.";
+ mes "Enjoy your trip in";
+ mes "lovely Gonryun!";
+ break;
+ case 3:
+ viewpoint 1,174,104,3,0x55FF33;
+ mes "[Wonchi Ha]";
+ mes "In your minimap";
+ mes "Head to ^55FF33+^000000";
+ mes "You'll get to a Weapon Dealer.";
+ mes "Enjoy your trip in";
+ mes "lovely Gonryun!";
+ break;
+ case 4:
+ viewpoint 1,173,84,4,0x3355FF;
+ mes "[Wonchi Ha]";
+ mes "In your minimap";
+ mes "Head to ^3355FF+^000000";
+ mes "You'll get to an Armor Dealer.";
+ mes "Enjoy your trip in";
+ mes "lovely Gonryun!";
+ break;
+ case 5:
+ viewpoint 1,215,114,5,0xFFFFFF;
+ mes "[Wonchi Ha]";
+ mes "In your minimap";
+ mes "Head to ^FFFFFF+^000000";
+ mes "You'll get to a wine shop.";
+ mes "Enjoy your trip in";
+ mes "lovely Gonryun!";
+ break;
+ }
+ close;
+}
+
+gonryun.gat,166,196,3 script Soldier#gn 780,{
+ mes "[Waguo]";
+ if (b_sword < 7) {
+ mes "You know what?";
+ mes "This place used to be a shrine.";
+ mes "From the certain period time,";
+ mes "the Taoist hermits who failed to";
+ mes "get to the kingdom in the sky began";
+ mes "to gather, it became a den of monsters.";
+ } else if (b_sword > 6 && b_sword < 10){
+ mes "It was pretty noisy last night huh?";
+ mes "Because of that theif, it was a mess.";
+ mes "Noisier than the festivals.";
+ mes "I couldn't sleep at all...";
+ next;
+ mes "[Waguo]";
+ mes "Ahh~~~~!";
+ mes "I was night working last night";
+ mes "and all of a sudden, I saw";
+ mes "something running straight";
+ mes "into a shrine.";
+ next;
+ mes "[Waguo]";
+ mes "It was moving so fast that";
+ mes "I couldn't even decide to chase it";
+ mes "at all. It was a ponderous creature";
+ mes "looked like human. I wonder";
+ mes "what it was...";
+ } else {
+ mes "You know what??";
+ mes "This place used to be a shrine.";
+ mes "From the certain period time,";
+ mes "the Taoist hermits who failed to";
+ mes "get to the kingdom in the sky began";
+ mes "to gather, it became a den of monsters.";
+ next;
+ mes "[Waguo]";
+ mes "Town is getting ready for the";
+ mes "Festival, But it's taking long time.";
+ mes "It never happended in the past.";
+ }
+ close;
+}
+
+gonryun.gat,169,71,3 script Guide#gn 770,{
+ mes "[Leeheemin]";
+ mes "Welcome~";
+ mes "Did you enjoy sightseeing";
+ mes "on the way?";
+ mes "Small buildings you saw are a structures";
+ mes "we made with hard working efforts.";
+ next;
+ mes "[Leeheemin]";
+ mes "They are a miniatures of";
+ mes "Rune-Midgarts Kingdom.";
+ mes "You can have a view of";
+ mes "cities at a glance.";
+ mes "It was not easy to work on it.";
+ mes "Don't you think they're masterpiece?";
+ next;
+ mes "[Leeheemin]";
+ mes "If you look around carefully,";
+ mes "You'll find a lots of beautiful";
+ mes "sights all over the town.";
+ close;
} \ No newline at end of file
diff --git a/npc/cities/hugel.txt b/npc/cities/hugel.txt
index 61c6c5bb0..f792c19d5 100644
--- a/npc/cities/hugel.txt
+++ b/npc/cities/hugel.txt
@@ -1,103 +1,103 @@
-//===== eAthena Script =======================================
-//= Hugel City
-//===== By: ==================================================
-//= vicious_pucca, Poki#3, erKURITA
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= NPC's for the City of Hugel.
-//===== Additional Comments: =================================
-//= Cords and Sprites are 100% Correct, but the names are not.
-//= Plus no one knows what the NPCs are talking right now :/ [Poki#3]
-//= Note: Not all the sprites were correct :P [erKURITA]
-//= 1.0 Added the first shop, firecrackers. Thanks RockmanEXE for the info [erKURITA]
-//= Added more missing npc, but again, only locations and temp names =/ [erKURITA]
-//= Started the basis of Poring Track. [erKURITA]
-//= Moved the old lady to npc\guides\guides_hu.txt, since it's Hugel's guard [erKURITA]
-//= Special thanks to RockmanEXE who provided all necesary info =3
-//= Abducted/Moved Yan and Yalmire(temp names) to npc\events\custom\p_track. [erKURITA]
-//= 1.1 Commented out the whole list of dummy npcs. They're there for nothing anyway,
-//= just using up memory. [erKURITA]
-//============================================================
-
-hu_in01.gat,23,311,4 script Johsh 898,{
- set @npcname$, "[Josh]";
-
- mes @npcname$;
- mes "Hi ho~ I sell some awesome firecrackers, would you like to buy one?";
- mes "Only 500z and you get 5 ^FF0000firecrackers^000000!";
- next;
- switch(select("Yes Please:No thanks")) {
- case 1:
- if (Zeny < 500) {
- mes @npcname$;
- mes "Err sir, you don't have 500z zeny. I can't sell you anything";
- close;
- } else
- set Zeny,Zeny-500;
- getitem 12018,5;
- mes @npcname$;
- mes "Good! here you go! Have fun with them!";
- close;
- case 2:
- mes @npcname$;
- mes "Aww~~ you miss it";
- close;
- }
-}
-
-//Should be moved later on to Bulletin Boards.txt
-//hugel.gat,91,152,4 script Bulletin Board 837,{end;}
-
-
-//= New Npcs
-//hugel.gat,76,134,4 script Yahna 101,{end;}
-//hugel.gat,71,137,5 script Jamira 879,{end;}
-
-//hugel.gat,175,115,5 script Anhi Anh 897,{end;}
-//hugel.gat,191,172,4 script Yanhe 895,{end;}
-//hugel.gat,196,164,3 script Amnot 50,{end;}
-//hugel.gat,203,166,0 script Star#1 111,{
-//invisible but clickeable npc
-//end;
-//}
-//hugel.gat,209,164,0 script Star#2 111,{
-//invisible but clickeable npc
-//end;
-//}
-//hugel.gat,216,158,0 script Shellfish 111,{
-//invisible but clickeable npc
-//end;
-//}
-//hugel.gat,168,183,5 script Thief 118,{end;}
-//hugel.gat,126,151,4 script Tanyee 90,{end;}
-//hugel.gat,88,168,4 script Zondaman 874,{end;}
-//hugel.gat,71,198,3 script Kampia 90,{end;}
-//hugel.gat,84,125,4 script Anzian 700,{end;}
-//= End of new npcs
-
-//hugel.gat,102,161,3 script Young Sailor 100,{end;}
-//hugel.gat,85,139,3 script Yoko 86,{end;}
-//hugel.gat,100,102,3 script Grandpa Hohi 866,{end;}
-//hugel.gat,85,93,3 script Grandpa Hiho 866,{end;}
-//hugel.gat,85,165,5 script Cudy 896,{end;}
-//hugel.gat,107,67,3 script Kiddy the Kid 706,{end;}
-
-//hugel.gat,71,83,4 script Hon Kiki 900,{end;}
-//hugel.gat,56,103,4 script Sarko 709,{end;}
-//hugel.gat,68,99,2 script Billy the Bull 889,{end;}
-//hugel.gat,169,112,5 script Sani 892,{end;}
-//hu_in01.gat,26,77,4 script Bokie 50,{end;}
-//hu_in01.gat,18,94,2 script Katsuki 95,{end;}
-//hu_in01.gat,16,20,4 script Jamie 70,{end;}
-//hu_in01.gat,14,11,4 script Jana 49,{end;}
-//hu_in01.gat,19,161,2 script Matilda 803,{end;}
-//hu_in01.gat,18,167,4 script Gin 86,{end;}
-//hu_in01.gat,381,304,5 script Soldier 105,{end;}
-//hu_in01.gat,111,386,4 script Jino 86,{end;}
-//Johsh was here!
-//hu_in01.gat,246,107,2 script Receptionist 53,{end;}
-//hu_in01.gat,256,40,2 script Garud 897,{end;}
-
+//===== eAthena Script =======================================
+//= Hugel City
+//===== By: ==================================================
+//= vicious_pucca, Poki#3, erKURITA
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= NPC's for the City of Hugel.
+//===== Additional Comments: =================================
+//= Cords and Sprites are 100% Correct, but the names are not.
+//= Plus no one knows what the NPCs are talking right now :/ [Poki#3]
+//= Note: Not all the sprites were correct :P [erKURITA]
+//= 1.0 Added the first shop, firecrackers. Thanks RockmanEXE for the info [erKURITA]
+//= Added more missing npc, but again, only locations and temp names =/ [erKURITA]
+//= Started the basis of Poring Track. [erKURITA]
+//= Moved the old lady to npc\guides\guides_hu.txt, since it's Hugel's guard [erKURITA]
+//= Special thanks to RockmanEXE who provided all necesary info =3
+//= Abducted/Moved Yan and Yalmire(temp names) to npc\events\custom\p_track. [erKURITA]
+//= 1.1 Commented out the whole list of dummy npcs. They're there for nothing anyway,
+//= just using up memory. [erKURITA]
+//============================================================
+
+hu_in01.gat,23,311,4 script Johsh 898,{
+ set @npcname$, "[Josh]";
+
+ mes @npcname$;
+ mes "Hi ho~ I sell some awesome firecrackers, would you like to buy one?";
+ mes "Only 500z and you get 5 ^FF0000firecrackers^000000!";
+ next;
+ switch(select("Yes Please:No thanks")) {
+ case 1:
+ if (Zeny < 500) {
+ mes @npcname$;
+ mes "Err sir, you don't have 500z zeny. I can't sell you anything";
+ close;
+ } else
+ set Zeny,Zeny-500;
+ getitem 12018,5;
+ mes @npcname$;
+ mes "Good! here you go! Have fun with them!";
+ close;
+ case 2:
+ mes @npcname$;
+ mes "Aww~~ you miss it";
+ close;
+ }
+}
+
+//Should be moved later on to Bulletin Boards.txt
+//hugel.gat,91,152,4 script Bulletin Board 837,{end;}
+
+
+//= New Npcs
+//hugel.gat,76,134,4 script Yahna 101,{end;}
+//hugel.gat,71,137,5 script Jamira 879,{end;}
+
+//hugel.gat,175,115,5 script Anhi Anh 897,{end;}
+//hugel.gat,191,172,4 script Yanhe 895,{end;}
+//hugel.gat,196,164,3 script Amnot 50,{end;}
+//hugel.gat,203,166,0 script Star#1 111,{
+//invisible but clickeable npc
+//end;
+//}
+//hugel.gat,209,164,0 script Star#2 111,{
+//invisible but clickeable npc
+//end;
+//}
+//hugel.gat,216,158,0 script Shellfish 111,{
+//invisible but clickeable npc
+//end;
+//}
+//hugel.gat,168,183,5 script Thief 118,{end;}
+//hugel.gat,126,151,4 script Tanyee 90,{end;}
+//hugel.gat,88,168,4 script Zondaman 874,{end;}
+//hugel.gat,71,198,3 script Kampia 90,{end;}
+//hugel.gat,84,125,4 script Anzian 700,{end;}
+//= End of new npcs
+
+//hugel.gat,102,161,3 script Young Sailor 100,{end;}
+//hugel.gat,85,139,3 script Yoko 86,{end;}
+//hugel.gat,100,102,3 script Grandpa Hohi 866,{end;}
+//hugel.gat,85,93,3 script Grandpa Hiho 866,{end;}
+//hugel.gat,85,165,5 script Cudy 896,{end;}
+//hugel.gat,107,67,3 script Kiddy the Kid 706,{end;}
+
+//hugel.gat,71,83,4 script Hon Kiki 900,{end;}
+//hugel.gat,56,103,4 script Sarko 709,{end;}
+//hugel.gat,68,99,2 script Billy the Bull 889,{end;}
+//hugel.gat,169,112,5 script Sani 892,{end;}
+//hu_in01.gat,26,77,4 script Bokie 50,{end;}
+//hu_in01.gat,18,94,2 script Katsuki 95,{end;}
+//hu_in01.gat,16,20,4 script Jamie 70,{end;}
+//hu_in01.gat,14,11,4 script Jana 49,{end;}
+//hu_in01.gat,19,161,2 script Matilda 803,{end;}
+//hu_in01.gat,18,167,4 script Gin 86,{end;}
+//hu_in01.gat,381,304,5 script Soldier 105,{end;}
+//hu_in01.gat,111,386,4 script Jino 86,{end;}
+//Johsh was here!
+//hu_in01.gat,246,107,2 script Receptionist 53,{end;}
+//hu_in01.gat,256,40,2 script Garud 897,{end;}
+
diff --git a/npc/cities/izlude.txt b/npc/cities/izlude.txt
index 6846f3f83..8172594a6 100644
--- a/npc/cities/izlude.txt
+++ b/npc/cities/izlude.txt
@@ -1,892 +1,892 @@
-//===== eAthena Script =======================================
-//= Izlude Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 fixed 2 zeny bugs/checks [Lupus]
-//= 1.2 Fixed a lot of typos [Nexon]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Added a Jawaii related npc. 1.4a Fixed a small bug to
-//= the Jawaii warper, thanks to reddozen and Silent [MasterOfMuppets]
-//= 1.5 Replaced iz_move_alberta with MISC_QUEST & 16 [Lupus]
-//= 1.6 Removed Duplicates [Silent]
-//= 1.7 Split quest to quests/quests_izlude.txt [Evera]
-//============================================================
-
-
-
-// Welcome Sign ----------------------------------------------------------
-izlude.gat,125,116,1 script Welcome Sign::ws_izlude 111,{
- mes "~sign reads...~";
- mes "Salutations and welcome to Izlude! Izlude is the satellite of Prontera and is home to Swordsmen and the Cool Event Corp.'s Monster Arena!";
- close;
-}
-
-// Sign: Marina -----------------------------------------------------------------
-izlude.gat,179,183,1 script Izlude Marina 111,{
- mes "~sign reads...~";
- mes "Take a boat ride to the city of Alberta or to the island of Byalan.";
- close;
-}
-
-// Sign: Swordsman Assoc. ----------------------------------------------------
-izlude.gat,54,139,1 script Swordsman Association 111,{
- mes "~sign reads...~";
- mes "The Izlude Swordsman Association is proud to provide Rune-Midgard with the bravest and strongest warriors.";
- close;
-}
-
-//Bonne-----------------------------------------------------------------------------------
-izlude.gat,55,74,2 script Bonne 90,{
- mes "[Bonne]";
- mes "Greetings!";
- mes "Izlude welcomes you.";
- next;
- mes "[Bonne]";
- mes "Izlude is the satelite city of";
- mes "Prontera, capital of the";
- mes "kingdom of Rune-Midgard.";
- next;
- mes "[Bonne]";
- mes "Izlude is key to our kingdom";
- mes "because of the Swordsman";
- mes "Association located here, as well";
- mes "as the fact that Izlude is in";
- mes "charge of protecting the";
- mes "Rune-Midgard coastline.";
- next;
- mes "[Bonne]";
- mes "I know, this bridge might look weak";
- mes "and fragile, but it is actually";
- mes "state of the art, built with the";
- mes "most sophisticated technology.";
- next;
- mes "[Bonne]";
- mes "No matter how strong storms may be,";
- mes "or how many people may stand on it,";
- mes "this bridge will NEEEEVER";
- mes "collapse.";
- next;
- mes "[Bonne]";
- mes "Please enjoy";
- mes "your visit";
- mes "here in Izlude.";
- close;
-}
-
-
-//Cuskoal-------------------------------------------------------------------------------------
-izlude.gat,119,121,1 script Cuskoal 124,{
- set @TEMP, rand(2);
- mes "[Cuskoal]";
- if(@TEMP != 0) goto L_R0;
- mes "The Arena here is THE place for";
- mes "capable young people from all over";
- mes "the Rune-Midgarts Kingdom to";
- mes "challenge themsleves and test their";
- mes "skills.";
- next;
- mes "[Cuskoal]";
- mes "You can battle with monsters of";
- mes "different levels. So, the number of";
- mes "stages you survive will be a";
- mes "testiment to you battle powers.";
- next;
- mes "[Cuskoal]";
- mes "So, whaddya say?";
- close;
-
- L_R0:
- mes "The pubs in Prontera are always";
- mes "full of people from local areas and";
- mes "from out-of-town. It can get pretty";
- mes "busy.";
- next;
- mes "[Cuskoal]";
- mes "It's a pretty good place to stop by";
- mes "for general information and to";
- mes "listen to rumors.";
- next;
- mes "[Cuskoal]";
- mes "So if you listen carefully, you";
- mes "just might get lucky and learn some";
- mes "very useful information for";
- mes "yourself.";
- close;
-}
-
-//Charfri-------------------------------------------------------------------------------------
-izlude.gat,135,78,2 script Charfri 91,{
- set @TEMP,rand(2);
- mes "[Charfri]";
- if(@TEMP != 0) goto L_R0;
- mes "Some people may think Izlude is";
- mes "just a satelite city of Prontera,";
- mes "and not really that important...";
- next;
- mes "[Charfri]";
- mes "But Izlude is a beautiful town";
- mes "right next to the ocean, as well as";
- mes "beautiful Byalan Island.";
- next;
- mes "[Charfri]";
- mes "You'll have to board on a ship at";
- mes "the port to get to Byalan Island.";
- mes "There are dangerous dungeons on";
- mes "that island, so don't go snooping";
- mes "around just anywhere.";
- close;
-
- L_R0:
- mes "Though it is very beautiful, Byalan";
- mes "Island has a mysterious dungeon";
- mes "that extends deep under the sea.";
- next;
- mes "[Charfri]";
- mes "People who've actually been there";
- mes "have said that if you go deep";
- mes "enough, the dungeon actually";
- mes "descends underwater.";
- next;
- mes "[Charfri]";
- mes "Surprisingly, once you're";
- mes "underwater, you can breathe just";
- mes "like a fish. Maybe some kind of";
- mes "supernatural force is in effect.";
- next;
- mes "[Charfri]";
- mes "Ah...";
- mes "The people who've seen the";
- mes "underwater view say it is so";
- mes "fantastic that they've kept";
- mes "dreaming of it ever since.";
- next;
- mes "[Charfri]";
- mes "But unfortunately, the monsters are";
- mes "too strong for ordinary people to";
- mes "merely go sight seeing there.";
- mes "Still, just once, I'd like to go";
- mes "down there...";
- close;
-}
-
-//Dega-------------------------------------------------------------------------------------
-izlude.gat,150,118,3 script Dega 84,{
- set @TEMP,rand(3);
- mes "[Dega]";
- if(@TEMP != 0) goto L_R0;
- mes "Mt. Mjolnir, located north of";
- mes "Prontera, is a tough";
- mes "and steep climb.";
- next;
- mes "[Dega]";
- mes "Aside from the dangers of the";
- mes "mountain itself, insanely vicious";
- mes "insects live there too. I mean,";
- mes "they'll just attack you for no";
- mes "reason.";
- next;
- mes "[Dega]";
- mes "If you ever want to visit somewhere";
- mes "pas Mt. Mjolnir, then you prepare";
- mes "your self for the challenge. Or you";
- mes "could walk around it.";
- close;
-
- L_R0:
- if(@TEMP != 1) goto L_R1;
- mes "Some monsters in the world have the.";
- mes "unique ability to sense mystical";
- mes "energy, and can detect Magic spells";
- mes "before they are cast.";
- next;
- mes "[Dega]";
- mes "Golem of the desert is one of them.";
- mes "Don't underestimate it due to it's";
- mes "sluggishness...";
- next;
- mes "[Dega]";
- mes "If you try to cast magic near it,";
- mes "it will notice and saunter over to";
- mes "smash you. So you better watch out";
- mes "for Golem.";
- close;
- L_R1:
- mes "There's a very delightful place";
- mes "where you can find every";
- mes "type of Poring.";
- next;
- mes "[Dega]";
- mes "It's somewhere near the bridge";
- mes "connecting the forest and the";
- mes "desert, on the way to the city of";
- mes "Payon which is Southeast from";
- mes "here.";
- next;
- mes "[Dega]";
- mes "There are not only pink Porings but";
- mes "also Drops, which can be found at";
- mes "the desert, and the green";
- mes "Poporing.";
- next;
- mes "[Dega]";
- mes "But be careful, before you realize";
- mes "it, you may come face to face with";
- mes "Ghostring, a deadly Poring that";
- mes "floats around the air like a";
- mes "ghost.";
- next;
- mes "[Dega]";
- mes "Well, of course, they are all very";
- mes "cute, but Ghostring is an";
- mes "EXCEPTION. It is very very";
- mes "dangerous.";
- next;
- mes "[Dega]";
- mes "If you are lucky enough, you might";
- mes "even bump into Angeling, the";
- mes "Poring with Angel wings.";
- next;
- menu "Ghostring?",-,"Angeling?",M1,"End Conversation.",MEnd;
-
- mes "[Dega]";
- mes "Ghostring is a grayish Poring that";
- mes "floats around in the air like a";
- mes "ghost. Just like other ghosts,";
- mes "physical attacks can't do any";
- mes "damage to it.";
- next;
- mes "[Dega]";
- mes "Those whose main attack methods are";
- mes "physical like Swordman and Archer";
- mes "might have to run for their lives";
- mes "when facing Ghostrings.";
- next;
- mes "[Dega]";
- mes "But don't leave just yet~! There is";
- mes "great news for people with those";
- mes "jobs. Making a weapon of some";
- mes "elemental property is the key.";
- next;
- mes "[Dega]";
- mes "This way, even a Swordman or an";
- mes "Archer can inflict damage, the way";
- mes "Magic does, on Ghostrings.";
- close;
- M1:
- mes "[Dega]";
- mes "Angelings are immune to Magic";
- mes "attacks. If people who can only";
- mes "attack with Magic face an";
- mes "Angeling, then it's time for";
- mes "them to run.";
- next;
- mes "[Dega]";
- mes "If you've got an extra knife or";
- mes "sword, you could give it a shot.";
- mes "But it will be very difficult";
- mes "alone, don't you think?";
- close;
- MEnd:
- mes "[Dega]";
- mes "Good Luck~";
- close;
-}
-
-//Kylick-------------------------------------------------------------------------------------
-izlude.gat,150,143,4 script Kylick 97,{
- set @TEMP,rand(2);
- mes "[Kylick]";
- if (@TEMP != 0) goto L_R0;
-
- mes "Don't you think Binoculars";
- mes "are really COOL?! You can";
- mes "see all sorts of places...!";
- next;
- mes "[Kylick]";
- mes "Here in Izlude, we are responsible";
- mes "for maintaining peace not only on";
- mes "land but also at sea. That's why";
- mes "this city has a huge telescope.";
- next;
- mes "This telescope constantly watches";
- mes "over the sea, so that we can";
- mes "prevent any serious trouble from";
- mes "happening. You know...";
- next;
- mes "An ounce of";
- mes "prevention is worth";
- mes "a pound of cure";
- mes "after all, right?";
- close;
-
- L_R0:
- mes "I was thinking, even though the";
- mes "people of Izlude live so close to";
- mes "the ocean...";
- next;
- mes "[Kylick]";
- mes "There are other cultures that have";
- mes "completely developed by living off";
- mes "of the sea. Of course, I'm talking";
- mes "about Amatsu.";
- next;
- mes "[Kylick]";
- mes "I hear the cuisine there is really";
- mes "good! Although the idea of eating";
- mes "raw fish is new to me, I would love";
- mes "to go there, and try it just once!";
- close;
-}
-
-// Soldier ------------------------------------------------------------------------------
-izlude.gat,124,178,4 script Soldier 105,{
- mes "[Soldier]";
- mes "Hehehehe... Hahahaha";
- mes "Huh? Why am I so happy?";
- mes "You wanna know?";
- next;
- menu "Sure, why?",-, "Not really, I don't care.",M_1;
-
- mes "[Soldier]";
- mes "Ah~~ There's not much for us to do";
- mes "these days. You see, Merchants buy";
- mes "items dropped by monsters. But you";
- mes "knew that, right?";
- next;
- menu "Of course",sM_0, "Eh? Really?",sM_1;
-
- sM_0:
- mes "[Soldier]";
- mes "Haha, in fact, that used to be part";
- mes "of our job. But there were more and";
- mes "more hunters who come in order to";
- mes "get paid, so it became too much to";
- mes "handle.";
- next;
- mes "[Soldier]";
- mes "We had to work overtime every day.";
- mes "Ah, it was a nightmare...! Anyways,";
- mes "the government eventually made a";
- mes "wise decision in creating the";
- mes "Registration System.";
- next;
- mes "[Soldier]";
- mes "The Office of Prize Compensation";
- mes "only pays those who have the";
- mes "Registration. Of course, you'd have";
- mes "to be a merchant and stay in the";
- mes "same place all day long.";
- next;
- mes "[Soldier]";
- mes "The Office gives away the";
- mes "registration to any merchant who";
- mes "fulfills those requirements. So";
- mes "nowadays, the hunters sell their";
- mes "goods to the registered merchants.";
- next;
- mes "[Soldier]";
- mes "So nowadays, the hunters sell their";
- mes "goods to the registered merchants.";
- mes "Not too many people come to us for";
- mes "that anymore.";
- next;
- mes "[Soldier]";
- mes "I mean we are still busy, but";
- mes "that's nothing compared to how it";
- mes "was before. People who have felt";
- mes "suffering know how to appreciate";
- mes "even the slightest comfort.";
- close;
- sM_1:
- mes "[Soldier]";
- mes "What?! What do you mean you didn't";
- mes "know?! Well, you know you can get";
- mes "items by killing monsters. If you";
- mes "bring and sell those to a merchant,";
- mes "you can make some money.";
- next;
- mes "[Soldier]";
- mes "HaHa, in fact, that used to be part";
- mes "of our job. But there were more and";
- mes "more hunters who come in order to";
- mes "get paid, so it became too much to";
- mes "handle.";
- next;
- mes "[Soldier]";
- mes "We had to work overtime every day.";
- mes "Ah, it was a nightmare...! Anyways,";
- mes "the government eventually made a";
- mes "wise decision in creating the";
- mes "Registration System.";
- next;
- mes "[Soldier]";
- mes "The Office of Prize Compensation";
- mes "only pays those who have the";
- mes "Registration. Of course, you'd have";
- mes "to be a merchant and stay in the";
- mes "same place all day long.";
- next;
- mes "[Soldier]";
- mes "The Office gives away the";
- mes "registration to any merchant who";
- mes "fulfills those requirements. So";
- mes "nowadays, the hunters sell their";
- mes "goods to the registered merchants.";
- next;
- mes "[Soldier]";
- mes "I mean we are still busy, but";
- mes "that's nothing compared to how it";
- mes "was before. People who have felt";
- mes "suffering know how to appreciate";
- mes "even the slightest comfort.";
- close;
- M_1:
- mes "[Soldier]";
- mes "Okay Good bye~~";
- close;
-}
-
-//Red-------------------------------------------------------------------------------------
-izlude.gat,58,126,1 script Red 98,{
-
- mes "[Red]";
- mes "The only skill that's needed for a";
- mes "Swordman is ^FF0000Bash^000000! Bash, Bash and";
- mes "ONLY ^FF0000BASH^000000! No need to waste time";
- mes "and effort for smaller skills!";
- mes "Everything else is for cowards and";
- mes "wusses!";
- next;
- mes "[Cebalis]";
- mes "What are you talking about!? The";
- mes "ideal Swordman resolutely stands";
- mes "alone, surrounded by countless";
- mes "enemies and smashing them all with";
- mes "one awesome attack.";
- next;
- mes "[Cebalis]";
- mes "^FF0000MAGNUM BREAK^000000";
- mes "That's right, Magnum Break";
- mes "is the skill that does";
- mes "the job right~!!";
- next;
- mes "[Cebalis]";
- mes "Well... Sometimes the explosive";
- mes "damage might accidentally hit some";
- mes "wandering monsters, and those guys";
- mes "end up coming after you, but that's";
- mes "a risk a Swordman should be willing";
- mes "to take!!";
- next;
- mes "[Red]";
- mes "That's exactly why you're dumb, you";
- mes "idiot! And what's this about the";
- mes "'the ideal Swordman?' I still";
- mes "remember the last time you used";
- mes "Magnum Break...";
- next;
- mes "[Red]";
- mes "You ended up running away from all";
- mes "those monsters you hit with that";
- mes "stupid skill! Weakling! All those";
- mes "Porings around you got hit and they";
- mes "all tried to kill you.";
- next;
- mes "[Cebalis]";
- mes "Hmpf. As I recall, you were running";
- mes "away too, apparently too busy to";
- mes "use your precious bash. In any";
- mes "case, Magnum Break is THE skill for";
- mes "a Swordman~!!";
- next;
- mes "[Cebalis]";
- mes "Something simplistic like Bash";
- mes "is just one of the little steps";
- mes "towards Magnum Break.";
- next;
- mes "[Red]";
- mes "Oh man~";
- mes "Hey, I know you just";
- mes "heard everything.";
- mes "So what do you think?";
- next;
- mes "[Red]";
- mes "Which one do you think is better?";
- mes "The critical damage skill, ^FF0000Bash^000000, or";
- mes "the Splash damage skill, ^FF0000Magnum^000000";
- mes "^FF0000Break^000000?";
- next;
- menu "Bash",-,"Magnum Break",L1;
-
- mes "[Red]";
- if( baseClass == Job_Swordman ) goto L00;
- mes "Hahahaha!! See!? Someone who";
- mes "pursues a different job agrees with";
- mes "me~! You really are a great guy!";
- mes "Hahaha!! Undoubtedly, only ^FF0000Bash^000000";
- mes "suits a Swordman. Please tell that";
- mes "to this NIMROD over here~ Hahaha!";
- close;
-
- L00:
- mes "Hahahaha!!! I knew you'd see things";
- mes "my way! You ARE a great guy!!";
- mes "Undoubtedly, only ^FF0000Bash^000000 suits a";
- mes "Swordman. Please tell that to this";
- mes "BONEHEAD over here~ Hahaha!";
- next;
- mes "[Red]";
- mes "Hmm, let me give you a bit of";
- mes "advice. After you achieve level 5";
- mes "Bash', the amount of SP consumed";
- mes "by the skill increased greatly, so";
- mes "watch out for your SP.";
- close;
- L1:
- mes "[Cebalis]";
- if( baseClass == Job_Swordman ) goto L01;
- mes "Right?! ^FF0000Magnum Break^000000 is THE BEST!!!";
- mes "You know what you're talking about,";
- mes "eh? I don't know why this jerk face";
- mes "is being sooooo stubborn.";
- close;
-
- L01:
- mes "Alright!! ^FF0000Magnum Break^000000 is the";
- mes "BEST!! Now you're talking~!! You";
- mes "know the stuff~Hahaha!";
- next;
- mes "[Cebalis]";
- mes "You wanna know some useful";
- mes "information? Okay, lemme tell";
- mes "ya! Magnum Break has Fire";
- mes "Property.";
- next;
- mes "[Cebalis]";
- mes "So it won't be too effective";
- mes "against monsters with the Water";
- mes "property, but this is THE skill to";
- mes "use against Undead and Earth";
- mes "property monsters!";
- next;
- mes "[Cebalis]";
- mes "And most importantly, look around";
- mes "before you use it. Otherwise you'll";
- mes "be in BIG trouble~";
- close;
-}
-
-//Cebalis-------------------------------------------------------------------------------------
-izlude.gat,56,126,7 script Cebalis 85,{
-
- mes "[Red]";
- mes "The only slill that's needed for a";
- mes "Swordman is ^FF0000Bash^000000! Bash, Bash and";
- mes "ONLY ^FF0000BASH^000000! No need to waste time";
- mes "and effort for smaller skills!";
- mes "Everything else is for cowards and";
- mes "wusses!";
- next;
- mes "[Cebalis]";
- mes "What are you talking about!? The";
- mes "ideal Swordman resolutely stands";
- mes "alone, surrounded by countless";
- mes "enemies and smashing them all with";
- mes "one awesome attack.";
- next;
- mes "[Cebalis]";
- mes "^FF0000MAGNUM BREAK^000000";
- mes "That's right, Magnum Break";
- mes "is the skill that does";
- mes "the job right~!!";
- next;
- mes "[Cebalis]";
- mes "Well... Sometimes the explosive";
- mes "damage might accidentally hit some";
- mes "wandering monsters, and those guys";
- mes "end up coming after you, but that's";
- mes "a risk a Swordman should be willing";
- mes "to take!!";
- next;
- mes "[Red]";
- mes "That's exactly why you're dumb, you";
- mes "idiot! And what's this about the";
- mes "'the ideal Swordman?' I still";
- mes "remember the last time you used";
- mes "Magnum Break...";
- next;
- mes "[Red]";
- mes "You ended up running away from all";
- mes "those monsters you hit with that";
- mes "stupid skill! Weakling! All those";
- mes "Porings around you got hit and they";
- mes "all tried to kill you.";
- next;
- mes "[Cebalis]";
- mes "Hmpf. As I recall, you were running";
- mes "away too, apparently too busy to";
- mes "use your precious bash. In any";
- mes "case, Magnum Break is THE skill for";
- mes "a Swordman~!!";
- next;
- mes "[Cebalis]";
- mes "Something simplistic like Bash";
- mes "is just one of the little steps";
- mes "towards Magnum Break.";
- next;
- mes "[Red]";
- mes "Oh man~";
- mes "Hey, I know you just";
- mes "heard everything.";
- mes "So what do you think?";
- next;
- mes "[Red]";
- mes "Which one do you think is better?";
- mes "The critical damage skill, ^FF0000Bash^000000, or";
- mes "the Splash damage skill, ^FF0000Magnum^000000";
- mes "^FF0000Break^000000?";
- next;
- menu "Bash",-,"Magnum Break",L1;
-
- mes "[Red]";
- if( baseClass == Job_Swordman ) goto L00;
- mes "Hahahaha!! See!? Someone who";
- mes "pursues a different job agrees with";
- mes "me~! You really are a great guy!";
- mes "Hahaha!! Undoubtedly, only ^FF0000Bash^000000";
- mes "suits a Swordman. Please tell that";
- mes "to this NIMROD over here~ Hahaha!";
- close;
-
- L00:
- mes "Hahahaha!!! I knew you'd see things";
- mes "my way! You ARE a great guy!!";
- mes "Undoubtedly, only ^FF0000Bash^000000 suits a";
- mes "Swordman. Please tell that to this";
- mes "BONEHEAD over here~ Hahaha!";
- next;
- mes "[Red]";
- mes "Hmm, let me give you a bit of";
- mes "advice. After you achieve level 5";
- mes "Bash', the amount of SP consumed";
- mes "by the skill increased greatly, so";
- mes "watch out for your SP.";
- close;
- L1:
- mes "[Cebalis]";
- if( baseClass == Job_Swordman ) goto L01;
- mes "Right?! ^FF0000Magnum Break^000000 is THE BEST!!!";
- mes "You know what you're talking about,";
- mes "eh? I don't know why this jerk face";
- mes "is being sooooo stubborn.";
- close;
-
- L01:
- mes "Alright!! ^FF0000Magnum Break^000000 is the";
- mes "BEST!! Now you're talking~!! You";
- mes "know the stuff~HaHaHa!";
- next;
- mes "[Cebalis]";
- mes "You wanna know some useful";
- mes "information? Okay, lemme tell";
- mes "ya! Magnum Break has Fire";
- mes "Property.";
- next;
- mes "[Cebalis]";
- mes "So it won't be too effective";
- mes "against monsters with the Water";
- mes "property, but this is THE skill to";
- mes "use against Undead and Earth";
- mes "property monsters!";
- next;
- mes "[Cebalis]";
- mes "And most importantly, look around";
- mes "before you use it. Otherwise you'll";
- mes "be in BIG trouble~";
- close;
-}
-
-//Aaron-------------------------------------------------------------------------------------
-izlude_in.gat,125,164,5 script Aaron 65,{
- mes "[Aaron]";
- mes "Don't you think Strong VIT and";
- mes "training in a unique breathing";
- mes "method which enables quick HP";
- mes "recovery are the greatest";
- mes "advantages for a Swordman?";
- next;
- mes "[Aaron]";
- mes "If you train your skills very hard,";
- mes "you can even see your HP";
- mes "recovering. The amount of";
- mes "recovered depends on";
- mes "vitality, or VIT.";
- next;
- mes "[Aaron]";
- mes "So if you invest more of your stats";
- mes "in VIT, you'll recover more HP";
- mes "overall when resting.";
- next;
- mes "[Aaron]";
- mes "But of course, it'd be good to have";
- mes "high Attack, wouldn't it? You can";
- mes "either acquire a good weapon or";
- mes "bring up your STR to support you";
- mes "Attack.";
- next;
- mes "[Aaron]";
- mes "You know you'll need some strength";
- mes "anyways to swing good weapons";
- mes "easily, anyway.";
- next;
- mes "[Aaron]";
- mes "Another important thing is how";
- mes "accurate you can hit your";
- mes "opponents. DEX is the key here. If";
- mes "you train DEX, then the gap between";
- mes "the MIN and MAX damage will also";
- mes "decrease.";
- next;
- mes "[Aaron]";
- mes "Hm...";
- mes "Are you bored by all this talk? Or";
- mes "do you want me to go on?";
- next;
- menu "Tell me more please.",-,"End conversation",LEnd;
-
- mes "[Aaron]";
- mes "Hmm...";
- mes "In that case, I'll explain about";
- mes "the other attributes to you";
- mes "briefly. In order to attack and";
- mes "evade quickly, you've gotta pay";
- mes "attention to AGI.";
- next;
- mes "[Aaron]";
- mes "In case you want to make more";
- mes "critical hits, it's a good idea to";
- mes "invest in LUK. INT also increases";
- mes "Max SP, which is needed to use";
- mes "various skills... but it's really";
- mes "up to you.";
- close;
- LEnd:
- mes "[Aaron]";
- mes "Okay then,";
- mes "train hard~~";
- close;
-}
-
-//Sailor-------------------------------------------------------------------------------------
-izlude.gat,201,181,2 script Sailor#06 100,{
- mes "[Sailor]";
- mes "Hey Everybody!";
- mes "Attention, attention!";
- mes "Come and Ride the Wind";
- mes "on a Fantastic Ship!";
- mes "Hurry, hurry";
- next;
- menu "Byalan Island -> 150 Zeny.",-,"Alberta Marina -> 500 Zeny.",L1,"Cancel",LEnd;
-
- if(Zeny < 150) goto sl_NoZenyBya;
- set Zeny, Zeny - 150;
- warp "izlu2dun.gat",107,50;
- close;
- L1:
- if(Zeny < 500) goto sl_NoZenyMar;
- set Zeny, Zeny - 500;
- warp "alberta.gat",188,169;
- LEnd:
- close;
- sl_NoZenyBya:
- mes "[Sailor]";
- mes "150 Zeny!";
- mes "Only 150 Zeny to ride!";
- close;
- sl_NoZenyMar:
- mes "[Sailor]";
- mes "500 Zeny!";
- mes "Only 500 Zeny to ride!";
- close;
-}
-
-//Sailor-------------------------------------------------------------------------------------
-izlu2dun.gat,108,27,4 script Sailor#07 100,{
- mes "[Sailor]";
- mes "Wanna";
- mes "head back?";
- next;
- menu "Yeah, I am Tired to Death.",-,"Nope I love this place.",L1;
-
- warp "izlude.gat",176,182;
- L1:
- close;
-}
-
-izlude.gat,171,185,3 script Honeymoon Helper#Izlude I 71,{
-
- mes "[Marry Happy]";
- mes "Newly weds and already weds...";
- mes "You can go to the imaginary recreational area anytime.";
- mes "Welcome to Jawaii!";
- next;
- menu "'Jawaii'?",-,"Let's go to 'Jawaii'~",s_Go,"Cancel",s_Cancel;
-
- mes "[Marry Happy]";
- mes "A distant island from the continent of Rune Midgard... ";
- mes "there is a peaceful and charming recreational area,";
- mes "that can't be easily reached by people.";
- mes "Since it is a famous spot for honeymoon,";
- mes "only married couples are allowed to go there.";
- next;
- mes "[Marry Happy]";
- mes "Since it's a special journey,";
- mes "the payment will be a bit expensive than normal. It will cost you 10,000z !!";
- mes "And that's what lets you enjoy";
- mes "a peaceful and fascinating";
- mes "honey moon trip...?";
- close;
-
-s_Go:
- if(getpartnerid() == 0)
-{
- mes "[Marry Happy]";
- mes "UhOh, I'm sorry.";
- mes "You can't go there if you're not married...";
- mes "Why don't you go to the Prontera Inn,";
- mes "and cheer yourself up?";
- close;
-}
- else if(Zeny < 10000)
-{
- mes "[Marry Happy]";
- mes "I've explained about the trip to 'Jawaii'.";
- mes "You'll need 10,000 z.";
- mes "If you do not have enough zeny,";
- mes "why don't you seek help from your partner...?";
- close;
-}
- set Zeny,Zeny - 10000;
- mes "[Marry Happy]";
- mes "Enjoy your trip...!!";
- mes "Let's go to 'Jawaii'...!!";
- close2;
- warp "jawaii.gat",241,115;
- end;
-
-s_Cancel:
- mes "[Marry Happy]";
- mes "There's nothing that is as exciting as";
- mes "travelling together, especially when";
- mes "you're travelling with your loved ones.";
- mes "You must be very happy, aren't you?";
- close;
-}
+//===== eAthena Script =======================================
+//= Izlude Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 fixed 2 zeny bugs/checks [Lupus]
+//= 1.2 Fixed a lot of typos [Nexon]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Added a Jawaii related npc. 1.4a Fixed a small bug to
+//= the Jawaii warper, thanks to reddozen and Silent [MasterOfMuppets]
+//= 1.5 Replaced iz_move_alberta with MISC_QUEST & 16 [Lupus]
+//= 1.6 Removed Duplicates [Silent]
+//= 1.7 Split quest to quests/quests_izlude.txt [Evera]
+//============================================================
+
+
+
+// Welcome Sign ----------------------------------------------------------
+izlude.gat,125,116,1 script Welcome Sign::ws_izlude 111,{
+ mes "~sign reads...~";
+ mes "Salutations and welcome to Izlude! Izlude is the satellite of Prontera and is home to Swordsmen and the Cool Event Corp.'s Monster Arena!";
+ close;
+}
+
+// Sign: Marina -----------------------------------------------------------------
+izlude.gat,179,183,1 script Izlude Marina 111,{
+ mes "~sign reads...~";
+ mes "Take a boat ride to the city of Alberta or to the island of Byalan.";
+ close;
+}
+
+// Sign: Swordsman Assoc. ----------------------------------------------------
+izlude.gat,54,139,1 script Swordsman Association 111,{
+ mes "~sign reads...~";
+ mes "The Izlude Swordsman Association is proud to provide Rune-Midgard with the bravest and strongest warriors.";
+ close;
+}
+
+//Bonne-----------------------------------------------------------------------------------
+izlude.gat,55,74,2 script Bonne 90,{
+ mes "[Bonne]";
+ mes "Greetings!";
+ mes "Izlude welcomes you.";
+ next;
+ mes "[Bonne]";
+ mes "Izlude is the satelite city of";
+ mes "Prontera, capital of the";
+ mes "kingdom of Rune-Midgard.";
+ next;
+ mes "[Bonne]";
+ mes "Izlude is key to our kingdom";
+ mes "because of the Swordsman";
+ mes "Association located here, as well";
+ mes "as the fact that Izlude is in";
+ mes "charge of protecting the";
+ mes "Rune-Midgard coastline.";
+ next;
+ mes "[Bonne]";
+ mes "I know, this bridge might look weak";
+ mes "and fragile, but it is actually";
+ mes "state of the art, built with the";
+ mes "most sophisticated technology.";
+ next;
+ mes "[Bonne]";
+ mes "No matter how strong storms may be,";
+ mes "or how many people may stand on it,";
+ mes "this bridge will NEEEEVER";
+ mes "collapse.";
+ next;
+ mes "[Bonne]";
+ mes "Please enjoy";
+ mes "your visit";
+ mes "here in Izlude.";
+ close;
+}
+
+
+//Cuskoal-------------------------------------------------------------------------------------
+izlude.gat,119,121,1 script Cuskoal 124,{
+ set @TEMP, rand(2);
+ mes "[Cuskoal]";
+ if(@TEMP != 0) goto L_R0;
+ mes "The Arena here is THE place for";
+ mes "capable young people from all over";
+ mes "the Rune-Midgarts Kingdom to";
+ mes "challenge themsleves and test their";
+ mes "skills.";
+ next;
+ mes "[Cuskoal]";
+ mes "You can battle with monsters of";
+ mes "different levels. So, the number of";
+ mes "stages you survive will be a";
+ mes "testiment to you battle powers.";
+ next;
+ mes "[Cuskoal]";
+ mes "So, whaddya say?";
+ close;
+
+ L_R0:
+ mes "The pubs in Prontera are always";
+ mes "full of people from local areas and";
+ mes "from out-of-town. It can get pretty";
+ mes "busy.";
+ next;
+ mes "[Cuskoal]";
+ mes "It's a pretty good place to stop by";
+ mes "for general information and to";
+ mes "listen to rumors.";
+ next;
+ mes "[Cuskoal]";
+ mes "So if you listen carefully, you";
+ mes "just might get lucky and learn some";
+ mes "very useful information for";
+ mes "yourself.";
+ close;
+}
+
+//Charfri-------------------------------------------------------------------------------------
+izlude.gat,135,78,2 script Charfri 91,{
+ set @TEMP,rand(2);
+ mes "[Charfri]";
+ if(@TEMP != 0) goto L_R0;
+ mes "Some people may think Izlude is";
+ mes "just a satelite city of Prontera,";
+ mes "and not really that important...";
+ next;
+ mes "[Charfri]";
+ mes "But Izlude is a beautiful town";
+ mes "right next to the ocean, as well as";
+ mes "beautiful Byalan Island.";
+ next;
+ mes "[Charfri]";
+ mes "You'll have to board on a ship at";
+ mes "the port to get to Byalan Island.";
+ mes "There are dangerous dungeons on";
+ mes "that island, so don't go snooping";
+ mes "around just anywhere.";
+ close;
+
+ L_R0:
+ mes "Though it is very beautiful, Byalan";
+ mes "Island has a mysterious dungeon";
+ mes "that extends deep under the sea.";
+ next;
+ mes "[Charfri]";
+ mes "People who've actually been there";
+ mes "have said that if you go deep";
+ mes "enough, the dungeon actually";
+ mes "descends underwater.";
+ next;
+ mes "[Charfri]";
+ mes "Surprisingly, once you're";
+ mes "underwater, you can breathe just";
+ mes "like a fish. Maybe some kind of";
+ mes "supernatural force is in effect.";
+ next;
+ mes "[Charfri]";
+ mes "Ah...";
+ mes "The people who've seen the";
+ mes "underwater view say it is so";
+ mes "fantastic that they've kept";
+ mes "dreaming of it ever since.";
+ next;
+ mes "[Charfri]";
+ mes "But unfortunately, the monsters are";
+ mes "too strong for ordinary people to";
+ mes "merely go sight seeing there.";
+ mes "Still, just once, I'd like to go";
+ mes "down there...";
+ close;
+}
+
+//Dega-------------------------------------------------------------------------------------
+izlude.gat,150,118,3 script Dega 84,{
+ set @TEMP,rand(3);
+ mes "[Dega]";
+ if(@TEMP != 0) goto L_R0;
+ mes "Mt. Mjolnir, located north of";
+ mes "Prontera, is a tough";
+ mes "and steep climb.";
+ next;
+ mes "[Dega]";
+ mes "Aside from the dangers of the";
+ mes "mountain itself, insanely vicious";
+ mes "insects live there too. I mean,";
+ mes "they'll just attack you for no";
+ mes "reason.";
+ next;
+ mes "[Dega]";
+ mes "If you ever want to visit somewhere";
+ mes "pas Mt. Mjolnir, then you prepare";
+ mes "your self for the challenge. Or you";
+ mes "could walk around it.";
+ close;
+
+ L_R0:
+ if(@TEMP != 1) goto L_R1;
+ mes "Some monsters in the world have the.";
+ mes "unique ability to sense mystical";
+ mes "energy, and can detect Magic spells";
+ mes "before they are cast.";
+ next;
+ mes "[Dega]";
+ mes "Golem of the desert is one of them.";
+ mes "Don't underestimate it due to it's";
+ mes "sluggishness...";
+ next;
+ mes "[Dega]";
+ mes "If you try to cast magic near it,";
+ mes "it will notice and saunter over to";
+ mes "smash you. So you better watch out";
+ mes "for Golem.";
+ close;
+ L_R1:
+ mes "There's a very delightful place";
+ mes "where you can find every";
+ mes "type of Poring.";
+ next;
+ mes "[Dega]";
+ mes "It's somewhere near the bridge";
+ mes "connecting the forest and the";
+ mes "desert, on the way to the city of";
+ mes "Payon which is Southeast from";
+ mes "here.";
+ next;
+ mes "[Dega]";
+ mes "There are not only pink Porings but";
+ mes "also Drops, which can be found at";
+ mes "the desert, and the green";
+ mes "Poporing.";
+ next;
+ mes "[Dega]";
+ mes "But be careful, before you realize";
+ mes "it, you may come face to face with";
+ mes "Ghostring, a deadly Poring that";
+ mes "floats around the air like a";
+ mes "ghost.";
+ next;
+ mes "[Dega]";
+ mes "Well, of course, they are all very";
+ mes "cute, but Ghostring is an";
+ mes "EXCEPTION. It is very very";
+ mes "dangerous.";
+ next;
+ mes "[Dega]";
+ mes "If you are lucky enough, you might";
+ mes "even bump into Angeling, the";
+ mes "Poring with Angel wings.";
+ next;
+ menu "Ghostring?",-,"Angeling?",M1,"End Conversation.",MEnd;
+
+ mes "[Dega]";
+ mes "Ghostring is a grayish Poring that";
+ mes "floats around in the air like a";
+ mes "ghost. Just like other ghosts,";
+ mes "physical attacks can't do any";
+ mes "damage to it.";
+ next;
+ mes "[Dega]";
+ mes "Those whose main attack methods are";
+ mes "physical like Swordman and Archer";
+ mes "might have to run for their lives";
+ mes "when facing Ghostrings.";
+ next;
+ mes "[Dega]";
+ mes "But don't leave just yet~! There is";
+ mes "great news for people with those";
+ mes "jobs. Making a weapon of some";
+ mes "elemental property is the key.";
+ next;
+ mes "[Dega]";
+ mes "This way, even a Swordman or an";
+ mes "Archer can inflict damage, the way";
+ mes "Magic does, on Ghostrings.";
+ close;
+ M1:
+ mes "[Dega]";
+ mes "Angelings are immune to Magic";
+ mes "attacks. If people who can only";
+ mes "attack with Magic face an";
+ mes "Angeling, then it's time for";
+ mes "them to run.";
+ next;
+ mes "[Dega]";
+ mes "If you've got an extra knife or";
+ mes "sword, you could give it a shot.";
+ mes "But it will be very difficult";
+ mes "alone, don't you think?";
+ close;
+ MEnd:
+ mes "[Dega]";
+ mes "Good Luck~";
+ close;
+}
+
+//Kylick-------------------------------------------------------------------------------------
+izlude.gat,150,143,4 script Kylick 97,{
+ set @TEMP,rand(2);
+ mes "[Kylick]";
+ if (@TEMP != 0) goto L_R0;
+
+ mes "Don't you think Binoculars";
+ mes "are really COOL?! You can";
+ mes "see all sorts of places...!";
+ next;
+ mes "[Kylick]";
+ mes "Here in Izlude, we are responsible";
+ mes "for maintaining peace not only on";
+ mes "land but also at sea. That's why";
+ mes "this city has a huge telescope.";
+ next;
+ mes "This telescope constantly watches";
+ mes "over the sea, so that we can";
+ mes "prevent any serious trouble from";
+ mes "happening. You know...";
+ next;
+ mes "An ounce of";
+ mes "prevention is worth";
+ mes "a pound of cure";
+ mes "after all, right?";
+ close;
+
+ L_R0:
+ mes "I was thinking, even though the";
+ mes "people of Izlude live so close to";
+ mes "the ocean...";
+ next;
+ mes "[Kylick]";
+ mes "There are other cultures that have";
+ mes "completely developed by living off";
+ mes "of the sea. Of course, I'm talking";
+ mes "about Amatsu.";
+ next;
+ mes "[Kylick]";
+ mes "I hear the cuisine there is really";
+ mes "good! Although the idea of eating";
+ mes "raw fish is new to me, I would love";
+ mes "to go there, and try it just once!";
+ close;
+}
+
+// Soldier ------------------------------------------------------------------------------
+izlude.gat,124,178,4 script Soldier 105,{
+ mes "[Soldier]";
+ mes "Hehehehe... Hahahaha";
+ mes "Huh? Why am I so happy?";
+ mes "You wanna know?";
+ next;
+ menu "Sure, why?",-, "Not really, I don't care.",M_1;
+
+ mes "[Soldier]";
+ mes "Ah~~ There's not much for us to do";
+ mes "these days. You see, Merchants buy";
+ mes "items dropped by monsters. But you";
+ mes "knew that, right?";
+ next;
+ menu "Of course",sM_0, "Eh? Really?",sM_1;
+
+ sM_0:
+ mes "[Soldier]";
+ mes "Haha, in fact, that used to be part";
+ mes "of our job. But there were more and";
+ mes "more hunters who come in order to";
+ mes "get paid, so it became too much to";
+ mes "handle.";
+ next;
+ mes "[Soldier]";
+ mes "We had to work overtime every day.";
+ mes "Ah, it was a nightmare...! Anyways,";
+ mes "the government eventually made a";
+ mes "wise decision in creating the";
+ mes "Registration System.";
+ next;
+ mes "[Soldier]";
+ mes "The Office of Prize Compensation";
+ mes "only pays those who have the";
+ mes "Registration. Of course, you'd have";
+ mes "to be a merchant and stay in the";
+ mes "same place all day long.";
+ next;
+ mes "[Soldier]";
+ mes "The Office gives away the";
+ mes "registration to any merchant who";
+ mes "fulfills those requirements. So";
+ mes "nowadays, the hunters sell their";
+ mes "goods to the registered merchants.";
+ next;
+ mes "[Soldier]";
+ mes "So nowadays, the hunters sell their";
+ mes "goods to the registered merchants.";
+ mes "Not too many people come to us for";
+ mes "that anymore.";
+ next;
+ mes "[Soldier]";
+ mes "I mean we are still busy, but";
+ mes "that's nothing compared to how it";
+ mes "was before. People who have felt";
+ mes "suffering know how to appreciate";
+ mes "even the slightest comfort.";
+ close;
+ sM_1:
+ mes "[Soldier]";
+ mes "What?! What do you mean you didn't";
+ mes "know?! Well, you know you can get";
+ mes "items by killing monsters. If you";
+ mes "bring and sell those to a merchant,";
+ mes "you can make some money.";
+ next;
+ mes "[Soldier]";
+ mes "HaHa, in fact, that used to be part";
+ mes "of our job. But there were more and";
+ mes "more hunters who come in order to";
+ mes "get paid, so it became too much to";
+ mes "handle.";
+ next;
+ mes "[Soldier]";
+ mes "We had to work overtime every day.";
+ mes "Ah, it was a nightmare...! Anyways,";
+ mes "the government eventually made a";
+ mes "wise decision in creating the";
+ mes "Registration System.";
+ next;
+ mes "[Soldier]";
+ mes "The Office of Prize Compensation";
+ mes "only pays those who have the";
+ mes "Registration. Of course, you'd have";
+ mes "to be a merchant and stay in the";
+ mes "same place all day long.";
+ next;
+ mes "[Soldier]";
+ mes "The Office gives away the";
+ mes "registration to any merchant who";
+ mes "fulfills those requirements. So";
+ mes "nowadays, the hunters sell their";
+ mes "goods to the registered merchants.";
+ next;
+ mes "[Soldier]";
+ mes "I mean we are still busy, but";
+ mes "that's nothing compared to how it";
+ mes "was before. People who have felt";
+ mes "suffering know how to appreciate";
+ mes "even the slightest comfort.";
+ close;
+ M_1:
+ mes "[Soldier]";
+ mes "Okay Good bye~~";
+ close;
+}
+
+//Red-------------------------------------------------------------------------------------
+izlude.gat,58,126,1 script Red 98,{
+
+ mes "[Red]";
+ mes "The only skill that's needed for a";
+ mes "Swordman is ^FF0000Bash^000000! Bash, Bash and";
+ mes "ONLY ^FF0000BASH^000000! No need to waste time";
+ mes "and effort for smaller skills!";
+ mes "Everything else is for cowards and";
+ mes "wusses!";
+ next;
+ mes "[Cebalis]";
+ mes "What are you talking about!? The";
+ mes "ideal Swordman resolutely stands";
+ mes "alone, surrounded by countless";
+ mes "enemies and smashing them all with";
+ mes "one awesome attack.";
+ next;
+ mes "[Cebalis]";
+ mes "^FF0000MAGNUM BREAK^000000";
+ mes "That's right, Magnum Break";
+ mes "is the skill that does";
+ mes "the job right~!!";
+ next;
+ mes "[Cebalis]";
+ mes "Well... Sometimes the explosive";
+ mes "damage might accidentally hit some";
+ mes "wandering monsters, and those guys";
+ mes "end up coming after you, but that's";
+ mes "a risk a Swordman should be willing";
+ mes "to take!!";
+ next;
+ mes "[Red]";
+ mes "That's exactly why you're dumb, you";
+ mes "idiot! And what's this about the";
+ mes "'the ideal Swordman?' I still";
+ mes "remember the last time you used";
+ mes "Magnum Break...";
+ next;
+ mes "[Red]";
+ mes "You ended up running away from all";
+ mes "those monsters you hit with that";
+ mes "stupid skill! Weakling! All those";
+ mes "Porings around you got hit and they";
+ mes "all tried to kill you.";
+ next;
+ mes "[Cebalis]";
+ mes "Hmpf. As I recall, you were running";
+ mes "away too, apparently too busy to";
+ mes "use your precious bash. In any";
+ mes "case, Magnum Break is THE skill for";
+ mes "a Swordman~!!";
+ next;
+ mes "[Cebalis]";
+ mes "Something simplistic like Bash";
+ mes "is just one of the little steps";
+ mes "towards Magnum Break.";
+ next;
+ mes "[Red]";
+ mes "Oh man~";
+ mes "Hey, I know you just";
+ mes "heard everything.";
+ mes "So what do you think?";
+ next;
+ mes "[Red]";
+ mes "Which one do you think is better?";
+ mes "The critical damage skill, ^FF0000Bash^000000, or";
+ mes "the Splash damage skill, ^FF0000Magnum^000000";
+ mes "^FF0000Break^000000?";
+ next;
+ menu "Bash",-,"Magnum Break",L1;
+
+ mes "[Red]";
+ if( baseClass == Job_Swordman ) goto L00;
+ mes "Hahahaha!! See!? Someone who";
+ mes "pursues a different job agrees with";
+ mes "me~! You really are a great guy!";
+ mes "Hahaha!! Undoubtedly, only ^FF0000Bash^000000";
+ mes "suits a Swordman. Please tell that";
+ mes "to this NIMROD over here~ Hahaha!";
+ close;
+
+ L00:
+ mes "Hahahaha!!! I knew you'd see things";
+ mes "my way! You ARE a great guy!!";
+ mes "Undoubtedly, only ^FF0000Bash^000000 suits a";
+ mes "Swordman. Please tell that to this";
+ mes "BONEHEAD over here~ Hahaha!";
+ next;
+ mes "[Red]";
+ mes "Hmm, let me give you a bit of";
+ mes "advice. After you achieve level 5";
+ mes "Bash', the amount of SP consumed";
+ mes "by the skill increased greatly, so";
+ mes "watch out for your SP.";
+ close;
+ L1:
+ mes "[Cebalis]";
+ if( baseClass == Job_Swordman ) goto L01;
+ mes "Right?! ^FF0000Magnum Break^000000 is THE BEST!!!";
+ mes "You know what you're talking about,";
+ mes "eh? I don't know why this jerk face";
+ mes "is being sooooo stubborn.";
+ close;
+
+ L01:
+ mes "Alright!! ^FF0000Magnum Break^000000 is the";
+ mes "BEST!! Now you're talking~!! You";
+ mes "know the stuff~Hahaha!";
+ next;
+ mes "[Cebalis]";
+ mes "You wanna know some useful";
+ mes "information? Okay, lemme tell";
+ mes "ya! Magnum Break has Fire";
+ mes "Property.";
+ next;
+ mes "[Cebalis]";
+ mes "So it won't be too effective";
+ mes "against monsters with the Water";
+ mes "property, but this is THE skill to";
+ mes "use against Undead and Earth";
+ mes "property monsters!";
+ next;
+ mes "[Cebalis]";
+ mes "And most importantly, look around";
+ mes "before you use it. Otherwise you'll";
+ mes "be in BIG trouble~";
+ close;
+}
+
+//Cebalis-------------------------------------------------------------------------------------
+izlude.gat,56,126,7 script Cebalis 85,{
+
+ mes "[Red]";
+ mes "The only slill that's needed for a";
+ mes "Swordman is ^FF0000Bash^000000! Bash, Bash and";
+ mes "ONLY ^FF0000BASH^000000! No need to waste time";
+ mes "and effort for smaller skills!";
+ mes "Everything else is for cowards and";
+ mes "wusses!";
+ next;
+ mes "[Cebalis]";
+ mes "What are you talking about!? The";
+ mes "ideal Swordman resolutely stands";
+ mes "alone, surrounded by countless";
+ mes "enemies and smashing them all with";
+ mes "one awesome attack.";
+ next;
+ mes "[Cebalis]";
+ mes "^FF0000MAGNUM BREAK^000000";
+ mes "That's right, Magnum Break";
+ mes "is the skill that does";
+ mes "the job right~!!";
+ next;
+ mes "[Cebalis]";
+ mes "Well... Sometimes the explosive";
+ mes "damage might accidentally hit some";
+ mes "wandering monsters, and those guys";
+ mes "end up coming after you, but that's";
+ mes "a risk a Swordman should be willing";
+ mes "to take!!";
+ next;
+ mes "[Red]";
+ mes "That's exactly why you're dumb, you";
+ mes "idiot! And what's this about the";
+ mes "'the ideal Swordman?' I still";
+ mes "remember the last time you used";
+ mes "Magnum Break...";
+ next;
+ mes "[Red]";
+ mes "You ended up running away from all";
+ mes "those monsters you hit with that";
+ mes "stupid skill! Weakling! All those";
+ mes "Porings around you got hit and they";
+ mes "all tried to kill you.";
+ next;
+ mes "[Cebalis]";
+ mes "Hmpf. As I recall, you were running";
+ mes "away too, apparently too busy to";
+ mes "use your precious bash. In any";
+ mes "case, Magnum Break is THE skill for";
+ mes "a Swordman~!!";
+ next;
+ mes "[Cebalis]";
+ mes "Something simplistic like Bash";
+ mes "is just one of the little steps";
+ mes "towards Magnum Break.";
+ next;
+ mes "[Red]";
+ mes "Oh man~";
+ mes "Hey, I know you just";
+ mes "heard everything.";
+ mes "So what do you think?";
+ next;
+ mes "[Red]";
+ mes "Which one do you think is better?";
+ mes "The critical damage skill, ^FF0000Bash^000000, or";
+ mes "the Splash damage skill, ^FF0000Magnum^000000";
+ mes "^FF0000Break^000000?";
+ next;
+ menu "Bash",-,"Magnum Break",L1;
+
+ mes "[Red]";
+ if( baseClass == Job_Swordman ) goto L00;
+ mes "Hahahaha!! See!? Someone who";
+ mes "pursues a different job agrees with";
+ mes "me~! You really are a great guy!";
+ mes "Hahaha!! Undoubtedly, only ^FF0000Bash^000000";
+ mes "suits a Swordman. Please tell that";
+ mes "to this NIMROD over here~ Hahaha!";
+ close;
+
+ L00:
+ mes "Hahahaha!!! I knew you'd see things";
+ mes "my way! You ARE a great guy!!";
+ mes "Undoubtedly, only ^FF0000Bash^000000 suits a";
+ mes "Swordman. Please tell that to this";
+ mes "BONEHEAD over here~ Hahaha!";
+ next;
+ mes "[Red]";
+ mes "Hmm, let me give you a bit of";
+ mes "advice. After you achieve level 5";
+ mes "Bash', the amount of SP consumed";
+ mes "by the skill increased greatly, so";
+ mes "watch out for your SP.";
+ close;
+ L1:
+ mes "[Cebalis]";
+ if( baseClass == Job_Swordman ) goto L01;
+ mes "Right?! ^FF0000Magnum Break^000000 is THE BEST!!!";
+ mes "You know what you're talking about,";
+ mes "eh? I don't know why this jerk face";
+ mes "is being sooooo stubborn.";
+ close;
+
+ L01:
+ mes "Alright!! ^FF0000Magnum Break^000000 is the";
+ mes "BEST!! Now you're talking~!! You";
+ mes "know the stuff~HaHaHa!";
+ next;
+ mes "[Cebalis]";
+ mes "You wanna know some useful";
+ mes "information? Okay, lemme tell";
+ mes "ya! Magnum Break has Fire";
+ mes "Property.";
+ next;
+ mes "[Cebalis]";
+ mes "So it won't be too effective";
+ mes "against monsters with the Water";
+ mes "property, but this is THE skill to";
+ mes "use against Undead and Earth";
+ mes "property monsters!";
+ next;
+ mes "[Cebalis]";
+ mes "And most importantly, look around";
+ mes "before you use it. Otherwise you'll";
+ mes "be in BIG trouble~";
+ close;
+}
+
+//Aaron-------------------------------------------------------------------------------------
+izlude_in.gat,125,164,5 script Aaron 65,{
+ mes "[Aaron]";
+ mes "Don't you think Strong VIT and";
+ mes "training in a unique breathing";
+ mes "method which enables quick HP";
+ mes "recovery are the greatest";
+ mes "advantages for a Swordman?";
+ next;
+ mes "[Aaron]";
+ mes "If you train your skills very hard,";
+ mes "you can even see your HP";
+ mes "recovering. The amount of";
+ mes "recovered depends on";
+ mes "vitality, or VIT.";
+ next;
+ mes "[Aaron]";
+ mes "So if you invest more of your stats";
+ mes "in VIT, you'll recover more HP";
+ mes "overall when resting.";
+ next;
+ mes "[Aaron]";
+ mes "But of course, it'd be good to have";
+ mes "high Attack, wouldn't it? You can";
+ mes "either acquire a good weapon or";
+ mes "bring up your STR to support you";
+ mes "Attack.";
+ next;
+ mes "[Aaron]";
+ mes "You know you'll need some strength";
+ mes "anyways to swing good weapons";
+ mes "easily, anyway.";
+ next;
+ mes "[Aaron]";
+ mes "Another important thing is how";
+ mes "accurate you can hit your";
+ mes "opponents. DEX is the key here. If";
+ mes "you train DEX, then the gap between";
+ mes "the MIN and MAX damage will also";
+ mes "decrease.";
+ next;
+ mes "[Aaron]";
+ mes "Hm...";
+ mes "Are you bored by all this talk? Or";
+ mes "do you want me to go on?";
+ next;
+ menu "Tell me more please.",-,"End conversation",LEnd;
+
+ mes "[Aaron]";
+ mes "Hmm...";
+ mes "In that case, I'll explain about";
+ mes "the other attributes to you";
+ mes "briefly. In order to attack and";
+ mes "evade quickly, you've gotta pay";
+ mes "attention to AGI.";
+ next;
+ mes "[Aaron]";
+ mes "In case you want to make more";
+ mes "critical hits, it's a good idea to";
+ mes "invest in LUK. INT also increases";
+ mes "Max SP, which is needed to use";
+ mes "various skills... but it's really";
+ mes "up to you.";
+ close;
+ LEnd:
+ mes "[Aaron]";
+ mes "Okay then,";
+ mes "train hard~~";
+ close;
+}
+
+//Sailor-------------------------------------------------------------------------------------
+izlude.gat,201,181,2 script Sailor#06 100,{
+ mes "[Sailor]";
+ mes "Hey Everybody!";
+ mes "Attention, attention!";
+ mes "Come and Ride the Wind";
+ mes "on a Fantastic Ship!";
+ mes "Hurry, hurry";
+ next;
+ menu "Byalan Island -> 150 Zeny.",-,"Alberta Marina -> 500 Zeny.",L1,"Cancel",LEnd;
+
+ if(Zeny < 150) goto sl_NoZenyBya;
+ set Zeny, Zeny - 150;
+ warp "izlu2dun.gat",107,50;
+ close;
+ L1:
+ if(Zeny < 500) goto sl_NoZenyMar;
+ set Zeny, Zeny - 500;
+ warp "alberta.gat",188,169;
+ LEnd:
+ close;
+ sl_NoZenyBya:
+ mes "[Sailor]";
+ mes "150 Zeny!";
+ mes "Only 150 Zeny to ride!";
+ close;
+ sl_NoZenyMar:
+ mes "[Sailor]";
+ mes "500 Zeny!";
+ mes "Only 500 Zeny to ride!";
+ close;
+}
+
+//Sailor-------------------------------------------------------------------------------------
+izlu2dun.gat,108,27,4 script Sailor#07 100,{
+ mes "[Sailor]";
+ mes "Wanna";
+ mes "head back?";
+ next;
+ menu "Yeah, I am Tired to Death.",-,"Nope I love this place.",L1;
+
+ warp "izlude.gat",176,182;
+ L1:
+ close;
+}
+
+izlude.gat,171,185,3 script Honeymoon Helper#Izlude I 71,{
+
+ mes "[Marry Happy]";
+ mes "Newly weds and already weds...";
+ mes "You can go to the imaginary recreational area anytime.";
+ mes "Welcome to Jawaii!";
+ next;
+ menu "'Jawaii'?",-,"Let's go to 'Jawaii'~",s_Go,"Cancel",s_Cancel;
+
+ mes "[Marry Happy]";
+ mes "A distant island from the continent of Rune Midgard... ";
+ mes "there is a peaceful and charming recreational area,";
+ mes "that can't be easily reached by people.";
+ mes "Since it is a famous spot for honeymoon,";
+ mes "only married couples are allowed to go there.";
+ next;
+ mes "[Marry Happy]";
+ mes "Since it's a special journey,";
+ mes "the payment will be a bit expensive than normal. It will cost you 10,000z !!";
+ mes "And that's what lets you enjoy";
+ mes "a peaceful and fascinating";
+ mes "honey moon trip...?";
+ close;
+
+s_Go:
+ if(getpartnerid() == 0)
+{
+ mes "[Marry Happy]";
+ mes "UhOh, I'm sorry.";
+ mes "You can't go there if you're not married...";
+ mes "Why don't you go to the Prontera Inn,";
+ mes "and cheer yourself up?";
+ close;
+}
+ else if(Zeny < 10000)
+{
+ mes "[Marry Happy]";
+ mes "I've explained about the trip to 'Jawaii'.";
+ mes "You'll need 10,000 z.";
+ mes "If you do not have enough zeny,";
+ mes "why don't you seek help from your partner...?";
+ close;
+}
+ set Zeny,Zeny - 10000;
+ mes "[Marry Happy]";
+ mes "Enjoy your trip...!!";
+ mes "Let's go to 'Jawaii'...!!";
+ close2;
+ warp "jawaii.gat",241,115;
+ end;
+
+s_Cancel:
+ mes "[Marry Happy]";
+ mes "There's nothing that is as exciting as";
+ mes "travelling together, especially when";
+ mes "you're travelling with your loved ones.";
+ mes "You must be very happy, aren't you?";
+ close;
+}
diff --git a/npc/cities/jawaii.txt b/npc/cities/jawaii.txt
index 4b5101e40..74674c5e6 100644
--- a/npc/cities/jawaii.txt
+++ b/npc/cities/jawaii.txt
@@ -1,773 +1,773 @@
-//===== eAthena script =======================================
-//= Jawaii (The Lovers Paradise) Town script
-//===== By: ==================================================
-//= jAthena (1.0)
-//= DNett123 (1.1 - 1.5)
-//===== Current Version: =====================================
-//= 2.02
-//===== Compatible With: =====================================
-//= Latest eAthena SVN
-//===== Description: =========================================
-//= Jawaii Town Npcs
-//===== Additional Comments: =================================
-//= 1.0 - Done By jAthena
-//= 1.1 - Rough Translation [DNett123]
-//= 1.2 - Started Grammer Corrections [DNett123]
-//= 1.3 - Some Edits Thanks To Vidar & Fusion [DNett123]
-//= 1.4 - Edited Dancer, Thanks ceskil [DNett123]
-//= 1.5 - Fixed Script, and spelling errors, some thanks to Sparkles [DNett123]
-//= 1.6 - Final corrections (not complete), thanks to the public, and DNett123!
-//= 1.6c - added missing monsters. Still 1 type is missing [Lupus]
-//= 1.7 – Fixed a lot of typo’s [Nexon]
-//= 1.8 - Removed monster spawns, added aegis ep 8.5 spawns to npc/mobs/fields/jawaii.txt [MasterOfMuppets]
-//= 2.0 - Updated the npcs according to iRO [MasterOfMuppets]
-//= 2.01 fixed missing @ at randomdrink, thanks to theultramage [Lupus]
-//= 2.02 - Fixed Classic Suite NPC warping directly above a warp [Evera]
-//============================================================
-
-//===== Shop: ================================================
-jawaii.gat,186,174,2 shop Jawaii Dealer 85,536:150
-
-//===== Jawaii Scripts ===================================
-jawaii.gat,141,200,3 script Attendant#Sweetness Suite 798,{
-
- mes "[Alowawu]";
- mes "Welcome.";
- mes "This is the Sweetness suite.";
- mes "I have cleaned and tidy up the place.";
- mes "So please feel free to use it.";
- next;
- mes "[Alowawu]";
- mes "The rental is 1000 zeny per person.";
- mes "If you give it to me,";
- mes "I'll transfer you inside.";
- mes "There's no other way to get inside directly.";
- next;
- mes "[Alowawu]";
- mes "I'll help you with the baggages,";
- mes "or else, my boss will";
- mes "beat me up with Triple Blows.";
- mes "That really hurts.";
- next;
- menu "Use it",-,"Cancel",s_Cancel;
- if(Zeny > 999)
-{
- mes "[Alowawu]";
- mes "Thank you.";
- mes "I'll open a portal for you right now.";
- mes "Have a nice stay";
- close2;
- set Zeny,Zeny - 1000;
- warp "jawaii_in.gat",116,64;
- end;
-}
- else
-{
- mes "[Alowawu]";;
- mes "Ah. Dear customer,";
- mes "you don't have enough zeny to pay for the room.";
- mes "I can't let you in. Or else,";
- mes "my boss with get angry and hit me with Triple Blows.";
- close;
-}
-s_Cancel:
- mes "[Alowawu]";
- mes "Haha, this room is better than others.";
- mes "Believe, it's nice and clean.";
- mes "If you have any change of mind,";
- mes "just come and find me.";
- close;
-}
-
-jawaii.gat,108,199,5 script Attendant#Classic_Suite 74,{
-
- mes "[Poyi Oland]";
- mes "Welcome.";
- mes "This is the Classic suite with two rooms.";
- mes "It's totally perfect for both of you!";
- mes "Although the appearances of the houses look alike,";
- mes "the interior is totally different!";
- next;
- mes "[Poyi Oland]";
- mes "The rental is 1000 zeny per person.";
- mes "and we're on a post paid basis!";
- mes "Since you're here on a trip,";
- mes "I suggest that you choose a better room!";
- next;
- mes "[Poyi Oland]";
- mes "If you ever need anything, just call us.";
- mes "We'll be at your service immediately.";
- next;
- menu "Use",-,"Cancel",s_Cancel;
-
- if (Zeny > 999)
-{
- mes "[Poyi Oland]";
- mes "Thank you for using.";
- mes "Please enjoy your stay.";
- close2;
- set Zeny,Zeny - 1000;
- warp "jawaii_in.gat",130,109;
- end;
-}
- else
-{
- mes "[Poyi Oland]";
- mes "I'm sorry!";
- mes "You do not have enough zeny.";
- mes "Please confirm your zeny and come again!";
- close;
-}
-s_Cancel:
- mes "[Poyi Oland]";
- mes "So, please come again after you've confirmed it.";
- mes "Presence of any guest is always welcomed.";
- close;
-}
-
-jawaii.gat,107,189,5 script Attendant#Honeymoon Suite 93,{
-
- mes "[Saroki Lania]";
- mes "...This is the Honeymoon suite and the cost is 1000 zeny.";
- next;
- mes "[Saroki Lania]";
- mes "...Do you want to go in?";
- next;
- mes "[Poyi Oland]";
- mes "If you ever need anything, just call us.";
- mes "We'll be at your service immediately.";
- next;
- menu "Yes",-,"Cancel",s_Cancel;
-
- if(Zeny > 999)
-{
- mes "[Saroki Lania]";
- mes "...Please come in.";
- close2;
- set Zeny,Zeny - 1000;
- warp "jawaii_in.gat",86,117;
- end;
-}
- else
-{
- mes "[Saroki Lania]";
- mes "...Not enough zeny?";
- close;
-}
-s_Cancel:
- mes "[Saroki Lania]";
- mes "...Ok then.";
- close;
-}
-jawaii.gat,112,173,7 script Attendant#Villa Suite 93,{
-
- mes "[Lakers Lania]";
- mes "Saroki, this is rude.";
- mes "Can't you treat the customer nicely?";
- mes "This will make them feel uneasy. Oh, customer!";
- mes "Welcome. Are you here on a trip?";
- next;
- mes "[Lakers Lania]";
- mes "This is the Villa suite.";
- mes "It is as comfortable as your home.";
- mes "The rental is only 1000 zeny.";
- next;
- mes "[Lakers Lania]";
- mes "If you want to use it, I can serve you right now.";
- mes "What do you think?";
- next;
- menu "Use it",-,"Cancel",s_Cancel;
- if(Zeny > 999)
-{
- mes "[Lakers Lania]";
- mes "Thanks and rest well.";
- mes "I hope you'll enjoy your trip.";
- close2;
- set Zeny,Zeny - 1000;
- warp "jawaii_in.gat",87,75;
- end;
-}
- else
-{
- mes "[Lakers Lania]";
- mes "Oh, you don't have enough zeny for the stay...?";
- mes "Maybe you can ask from your partner.";
- mes "Huhuhuhu-";
- close;
-}
-s_Cancel:
- mes "[Lakers Lania]";
- mes "Hmm, maybe you can try the honeymoon suite beside us.";
- mes "Although Saroki is not sociable,";
- mes "the room is a true masterpiece!";
- close;
-}
-
-jawaii.gat,122,263,5 script Sailor#Alberta 100,{
-
- mes "[Sailor]";
- mes "This ship will bring you back to Alberta.";
- mes "do you enjoy your stay at Jawaii?";
- mes "Please make sure that,";
- mes "you haven't left out anything.";
- next;
- mes "[Sailor]";
- mes "Well then, are you ready to return to Alberta?";
- next;
- menu "Yes, I am",-,"Cancel",s_Cancel;
-
- mes "[Sailor]";
- mes "Anchors away! Next stop! Alberta!!";
- close2;
- warp "alberta.gat",192,157;
- end;
-
-s_Cancel:
- mes "[Sailor]";
- mes "Well then, spend a little more time before you leave!";
- mes "It's not like you can come here everyday!";
- close;
-}
-
-jawaii.gat,239,112,7 script Sailor#Jawaii2 100,{
-
- mes "[Sailor]";
- mes "This ship will bring you back to Izlude Island.";
- mes "do you enjoy your stay at Jawaii?";
- mes "Please make sure that,";
- mes "you haven't left out anything.";
- next;
- mes "[Sailor]";
- mes "Well then, are you ready to return to Izlude Island?";
- next;
- menu "Yes, I am",-,"Cancel",s_Cancel;
-
- mes "[Sailor]";
- mes "Anchors away! Next stop! Izlude Island!!";
- close2;
- warp "izlude",176,182;
- end;
-
-s_Cancel:
- mes "[Sailor]";
- mes "Well then, spend a little more time before you leave!";
- mes "It's not like you can come here everyday!";
- close;
-}
-
-jawaii.gat,220,235,3 script Jawaii Citizen#Love Bo 724,{
-
- mes "[JawaJawa]";
- mes "Do you know where is the most beautiful place in Jawaii?";
- mes "It's the 'Island of Love',";
- mes "located at the north of Jawaii.";
- mes "Since the water is shallow,";
- mes "you'll be able to reach there if you're careful.";
- next;
- mes "[JawaJawa]";
- mes "It's also a suitable place for a couple to relax and spend some quality time.";
- mes "If you sit there alone,";
- mes "you'll look like a castaway,";
- mes "stranded on a deserted island!";
- next;
- mes "[JawaJawa]";
- mes "Well, of course you can play Castaway";
- mes "with the letter in empty bottle!";
- mes "But don't that look pathetic?";
- close;
-}
-
-jawaii.gat,239,146,3 script Jawaii Citizen#Explain1 100,{
-
- mes "[WaiiWaii]";
- mes "Welcome to Jawaii!";
- mes "What would a marriage be without a honeymoon?";
- mes "At this place,";
- mes "you can ignore the threat from those pathetic dateless losers.";
- next;
- mes "[WaiiWaii]";
- mes "You might encounter some monsters here.";
- mes "But as long as you leave them alone, it will be fine!";
- mes "They have inhabited this place for a long time,";
- mes "so you can just take them a part of the view.";
- close;
-}
-
-jawaii.gat,168,247,5 script Jawaii Citizen#Explain2 724,{
-
- mes "[WajaWaja]";
- mes "The hostels are located at the west.";
- mes "Every room has a different environment.";
- mes "So choose the one suitable for you.";
- mes "It would be better if you ask the staff there.";
- next;
- mes "[WajaWaja]";
- mes "Please use the ship at the northwest";
- mes "and southeast if you want to go back.";
- mes "There're boats scheduled to";
- mes "Alberta and Izlude Island.";
- close;
-}
-
-jawaii.gat,165,121,1 script Jawaii Citizen#Explain3 724,{
-
- mes "[IwaIwa]";
- mes "Jawaii~ Isn't this island of happiness great?";
- mes "You can just lay down";
- mes "and do nothing for the whole day.";
- mes "That what Jawaii is meant for.";
- next;
- mes "[IwaIwa]";
- mes "This is the stage,";
- mes "wher they hold a performance sometimes.";
- mes "Do you want to go up there and sing us a song?";
- mes "Jawaii~ Island of Happiness.";
- close;
-}
-
-jawaii_in.gat,43,115,0 script Customer#jaw_1 97,{
-
- mes "[Boogie]";
- mes "uhOh....Oh my! How do I come to a place like this?";
- mes "Everyone here is filled with happiness!";
- next;
- mes "[Boogie]";
- mes "But for a dateless person like me, it just makes me look more like a loser!!";
- mes "You, you must have felt the same too, right?";
- next;
- mes "[Boogie]";
- mes "Urgh....";
- mes "Boss, give me another shot!";
- close;
-}
-
-jawaii_in.gat,41,106,3 script Customer#Kyle Jeet 98,{
-
- mes "[Kyle Jeet]";
- mes "Eat and eat...!!";
- mes "Drink! Drink...!!";
- next;
- mes "[Kyle Jeet]";
- mes "We are released...!";
- mes "from being a couple in hell...!";
- mes "to a healthy and precious single in heaven...!";
- close;
-}
-
-jawaii_in.gat,15,104,0 script Field Attendant#jawaii 80,{
-
- mes "[Attendant]";
- mes "....Well, I don't know what's your purpose of coming here.";
- //Emotion?
- next;
- mes "[Attendant]";
- mes "If you try to disturb those people in happiness,";
- mes "Get a drink from the bar tender and go away after you finish it!";
- next;
- menu "I am the great single!!",-,"...I just came to congratulate...",s_Cong;
-
- mes "[Attendant]";
- mes "How selfish of you...";
- mes "You should congratulate those happy couples!";
- mes "Whether you are single of married, don't cause any troube!!";
- next;
- mes "[Attendant]";
- mes "Or else, get married and come here for honeymoon. I'll be glad to serve you.";
- close;
-s_Cong:
- mes "[Attendant]";
- mes "....? What? You're here to celebrate?";
- mes "Oh my god! I'm so sorry! How rude of me!";
- mes "Please rest well then~";
- close;
-}
-
-jawaii_in.gat,28,124,0 script Bartender#jaw 46,{
-
- set @drinkcount,0;
- mes "[Bartender]";
- mes "Welcome, dear customer.";
- mes "So, what's your order?";
- next;
- Loopback:
- menu "Today's special",-,"Nimi",s_Nimi,"Refreshing",s_Refreshing,"Misa",s_Misa,"Magnificent Blue",s_Magn;
-
- if(@drinkcount >= 4)
-{
- mes "[Bartender]";
- mes "You have taken a lot of drinks. Do you still want to continue?";
- next;
- input @jawaiitstring$;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss, because of ";
- mes @jawaiitstring$;
- mes "I'm not feeling well...";
- next;
- mes "[Bartender]";
- mes "....Here, this is my recommendation, ^0000FF`Special J&J screw file driver ver.¨¤«×¾¹'^000000 ";
- mes "It's on the house.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Thank you, boss...";
- percentheal -100,0;
- close;
-}
- else
-{
- set @randomdrink,rand(1,4);
- if(@randomdrink == 1)
-{
- mes "[Bartender]";
- mes "Well...How about this..?";
- set Zeny,Zeny - 100;
- next;
- mes "[Bartender]";
- mes "I recommend this ^0000FF`Hot Kiss Assault'^000000¡A";
- mes "a mixture of sweet scent with the unique scarlet color that bring great passions.";
- next;
- mes "You receive a sugar coated overturned triangular glass. -";
- mes "It is releasing a great amount of sweet scent.-";
- mes "Although the scent is attractive, it seems dangerous. -";
- next;
- mes "[Bartender]";
- mes "The first encounter is the most important stage.";
- mes "The feeling of sugar jumping in your mouth is totally awesome.";
- next;
- mes "Adjust the direction you sip the drink and taste it slowly.";
- percentheal -20,0;
- specialeffect2 38;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
- else if(@randomdrink == 2)
-{
- mes "[Bartender]";
- mes "How about this one?";
- next;
- mes "[Bartender]";
- mes "I recommend this ^0000FF`Black Siberian Double Shot'^000000 ";
- mes "A drink that let you feel the power of Russia and the greatness of land.";
- next;
- mes "- You look at the mixture of ice cube and black liquid.-";
- mes "- Although the scent is sweet-";
- mes "- You find a slight scent of male after shave.-";
- next;
- mes "[Bartender]";
- mes "It's suitable to taste it bits by bits due to its strong taste.";
- mes "It is a special mixture loved by the Siberians.";
- next;
- mes "- You feel the scent and drink it bits by bits. -";
- percentheal -20,0;
- specialeffect2 63; //Fire Ivy?
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
- else if(@randomdrink == 3)
-{
- mes "[Bartender]";
- mes "Let me recommend...";
- next;
- mes "[Bartender]";
- mes "I recommend this ^0000FF`White Hot Magarita'^000000 ";
- mes "The sour scent of lemon is really special, especially when you feel the soul of a Mexican within!";
- next;
- mes "- You receive an overturned triangular glass coated with lemon juice.-";
- mes "- It is releasing a sweet and sour scent.-";
- mes "- As attractive as it looks, you cannot ignore the danger behind it.";
- next;
- mes "[Bartender]";
- mes "The sweet and refreshing taste make it popular among the girls,";
- mes "especially when it contains the sensation of a Mexican.";
- next;
- mes "- You can imagine yourself wearing a Mexican Sombrero-";
- mes "- and drinking this cocktail! -";
- percentheal -20,0;
- specialeffect2 17;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
- else if(@randomdrink == 4)
-{
- mes "[Bartender]";
- mes "Hmm... How about this?";
- next;
- mes "[Bartender]";
- mes "I recommend this ^0000FF`Barcardi 151 Barcelona Crusade'^000000";
- mes "It's a pirate cocktail with a lot of memories";
- next;
- mes "-You look at the yellow liquid in the small glass. -";
- mes "-Although it looks like you can finish it in 1 sip, -";
- mes "-it looks like a really dangerous drink. -";
- next;
- mes "[Bartender]";
- mes "This flaming baby will burn you up.";
- mes "Finish it in one sip to feel the burning sensation.";
- next;
- mes "- You finish it in one sip. -";
- percentheal -20,0;
- specialeffect2 171;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
-}
-
-s_Nimi:
- if(@drinkcount >= 5)
-{
- mes "[Bartender]";
- mes "...I'll buy you a drink.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...Thanks ...Boss...";
- percentheal -100,0;
- close;
-}
- else
-{
- mes "[Bartender]";
- mes "Here, try this.";
- set Zeny,Zeny - 100;
- next;
- mes "[Bartender]";
- mes "If you want to show your interest to a girld, choose this!";
- mes "With the special and strong scent,";
- mes "it makes you look like a special person too.";
- next;
- mes "- You receive a simple looking glass containing white liquid-";
- mes "- Although there's a slight scent of sweetness, it tastes sour -";
- mes "- And it makes you want to shout out loud. - ";
- next;
- mes "[Bartender]";
- mes "A lot of people say taht mixed taste of sweet and bitter is like the taste of life.";
- mes "So it's best for you to taste it with the tip of your tounge.";
- next;
- mes "- Drink it from the tip of your tounge -";
- next;
- mes "-And it makes me feel.... Bang !!' -";
- percentheal -10,0;
- specialeffect2 18;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
-s_Refreshing:
- if (@drinkcount >= 5)
-{
- mes "[Bartender]";
- mes "...I'll buy you a drink.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...Thanks ...Boss...";
- percentheal -100,0;
- close;
-}
- else
-{
- mes "[Bartender]";
- mes "Here, try this!";
- set Zeny,Zeny - 100;
- next;
- mes "[Bartender]";
- mes "This one tastes like an old friend.";
- mes "The more you drink, the better you'll feel.";
- mes "You can drink it whenever, wherever and with whoever you want.";
- next;
- mes "- The tasty looking blue liquid is served to you. -";
- mes "- Contained in a fancy looking glass, -";
- mes "- it gives excitement to your nostril with the sour yet sweet scent. -";
- next;
- mes "[Bartender]";
- mes "Don't just take one shot of this.";
- mes "It will get better the more you drink it!";
- next;
- mes "- Your mouth is filled with the sour yet sweet scent after you finish the drink in 3 sips-";
- mes "- It's really a special blend... -";
- percentheal -10,0;
- specialeffect2 84; //Magnificat?
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
-s_Misa:
- if (@drinkcount >= 5)
-{
- mes "[Bartender]";
- mes "...I'll buy you a drink.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...Thanks ...Boss...";
- percentheal -100,0;
- close;
-}
- else
-{
- mes "[Bartender]";
- mes "Here, try this!";
- set Zeny,Zeny - 100;
- next;
- mes "[Bartender]";
- mes "This one tastes like an old friend.";
- mes "The more you drink, the better you'll feel.";
- mes "You can drink it whenever, wherever and with whoever you want.";
- next;
- mes "- The tasty looking blue liquid is served to you. -";
- mes "- Contained in a fancy looking glass, -";
- mes "- it gives excitement to your nostril with the sour yet sweet scent. -";
- next;
- mes "[Bartender]";
- mes "Don't just take one shot of this.";
- mes "It will get better the more you drink it!";
- next;
- mes "- Your mouth is filled with the sour yet sweet scent after you finish the drink in 3 sips-";
- mes "- It's really a special blend... -";
- percentheal -10,0;
- specialeffect2 97;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
-
-s_Magn:
- if (@drinkcount >= 5)
-{
- mes "[Bartender]";
- mes "...I'll buy you a drink.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...Thanks ...Boss...";
- percentheal -100,0;
- close;
-}
- else
-{
- mes "[Bartender]";
- mes "Here, try this.";
- set Zeny,Zeny - 100;
- next;
- mes "[Bartender]";
- mes "This is recommended for those who miss the glorious memories of the pass...";
- mes "For those who starts a war to preserve the peace...";
- mes "And of course... For those who fake the truth of history.";
- next;
- mes "- You receive a brown liquid in a shaking bottle. -";
- mes "- You feel the heavy and thick scent like the machines oil. -";
- mes "- Scent of fireworks? No, it's a little different than that... -";
- next;
- mes "[Bartender]";
- mes "It might look a lot but you better finish it in 1 sip.";
- mes "You'll lose its taste if you drink it too slow.";
- next;
- mes "- Grabbing the Shake bottle, you immediately finish it.-";
- next;
- mes "- And it feels like you're hit by a canon.-";
- percentheal -10,0;
- specialeffect2 132;
- set @drinkcount,@drinkcount + 1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Boss...Give me another shot...";
- next;
-}
-goto Loopback;
-}
-
-jawaii_in.gat,25,94,5 script Attendant#jaw1 724,{
-
- mes "[Attendant Teleteer]";
- mes "Welcome to the Inn of Jawaii~";
- mes "I hope you'll enjoy your stay here...";
- mes "But don't get drunk and cause any trouble!";
- close;
-}
-
-jawaii_in.gat,25,96,5 script Attendant#jaw2 724,{
-
- mes "[Attendant PoYi]";
- mes "Welcome to the Inn of Jawaii~";
- mes "I hope you'll enjoy yourself~";
- mes "But, don't get jealous and criticize people who are blessed with happiness!";
- close;
-}
-
-jawaii_in.gat,25,98,5 script Attendant#jaw3 724,{
-
- mes "[Attendant Poppy]";
- mes "Welcome to the Inn of Jawaii~";
- next;
- mes "[Attendant Poppy]";
- mes "May I ask....are you from a foreign land?";
- mes "You're still single, right?";
- mes "I am a good cook too, will you consider me?";
- mes "How about that? Huh?";
- close;
-}
-
-jawaii_in.gat,25,100,5 script Attendant#jaw4 724,{
-
- mes "[Attendant Ether]";
- mes "Welcome to the Inn of Jawaii~";
- mes "Criticizing, no! Discouraging, no!";
- mes "Get drunk, no! Congratulate, YES!";
- close;
-}
-
-jawaii_in.gat,30,94,4 script Attendant#jaw5 724,{
-
- mes "[Attendant Donna]";
- mes "Welcome to the Inn of Jawaii~";
- mes "......Oh no.....";
- mes "...Welcome! But please don't get drunk and cause trouble again! ";
- close;
-}
-
-jawaii_in.gat,30,96,4 script Attendant#jaw6 724,{
-
- mes "[Attendant Ken]";
- mes "Welcome to the Inn of Jawaii~";
- mes "It's ok for you to relax, but...";
- mes "Please control yourself...";
- close;
-}
-
-jawaii_in.gat,30,98,4 script Attendant#jaw7 724,{
-
- mes "[Attendant Emater]";
- mes "Welcome to the Inn of Jawaii~";
- next;
- mes "[Attendant Emater]";
- mes "...You're like a wandering soul.";
- mes "This place is not suitable for you!";
- mes "Well, as long as you like it,";
- mes "have fun but please don't cause any trouble~";
- close;
-}
-
-jawaii_in.gat,30,100,4 script Attendant#jaw8 724,{
-
- mes "[Attendant GoYa]";
- mes "Welcome to the Inn of Jawaii~";
- next;
- mes "[Attendant GoYa]";
- mes "Just like a story with a chapter missing,";
- mes "you look disgusting.";
- mes "Find yourself a partner so that you can enjoy your adventure~";
- close;
-}
+//===== eAthena script =======================================
+//= Jawaii (The Lovers Paradise) Town script
+//===== By: ==================================================
+//= jAthena (1.0)
+//= DNett123 (1.1 - 1.5)
+//===== Current Version: =====================================
+//= 2.02
+//===== Compatible With: =====================================
+//= Latest eAthena SVN
+//===== Description: =========================================
+//= Jawaii Town Npcs
+//===== Additional Comments: =================================
+//= 1.0 - Done By jAthena
+//= 1.1 - Rough Translation [DNett123]
+//= 1.2 - Started Grammer Corrections [DNett123]
+//= 1.3 - Some Edits Thanks To Vidar & Fusion [DNett123]
+//= 1.4 - Edited Dancer, Thanks ceskil [DNett123]
+//= 1.5 - Fixed Script, and spelling errors, some thanks to Sparkles [DNett123]
+//= 1.6 - Final corrections (not complete), thanks to the public, and DNett123!
+//= 1.6c - added missing monsters. Still 1 type is missing [Lupus]
+//= 1.7 – Fixed a lot of typo’s [Nexon]
+//= 1.8 - Removed monster spawns, added aegis ep 8.5 spawns to npc/mobs/fields/jawaii.txt [MasterOfMuppets]
+//= 2.0 - Updated the npcs according to iRO [MasterOfMuppets]
+//= 2.01 fixed missing @ at randomdrink, thanks to theultramage [Lupus]
+//= 2.02 - Fixed Classic Suite NPC warping directly above a warp [Evera]
+//============================================================
+
+//===== Shop: ================================================
+jawaii.gat,186,174,2 shop Jawaii Dealer 85,536:150
+
+//===== Jawaii Scripts ===================================
+jawaii.gat,141,200,3 script Attendant#Sweetness Suite 798,{
+
+ mes "[Alowawu]";
+ mes "Welcome.";
+ mes "This is the Sweetness suite.";
+ mes "I have cleaned and tidy up the place.";
+ mes "So please feel free to use it.";
+ next;
+ mes "[Alowawu]";
+ mes "The rental is 1000 zeny per person.";
+ mes "If you give it to me,";
+ mes "I'll transfer you inside.";
+ mes "There's no other way to get inside directly.";
+ next;
+ mes "[Alowawu]";
+ mes "I'll help you with the baggages,";
+ mes "or else, my boss will";
+ mes "beat me up with Triple Blows.";
+ mes "That really hurts.";
+ next;
+ menu "Use it",-,"Cancel",s_Cancel;
+ if(Zeny > 999)
+{
+ mes "[Alowawu]";
+ mes "Thank you.";
+ mes "I'll open a portal for you right now.";
+ mes "Have a nice stay";
+ close2;
+ set Zeny,Zeny - 1000;
+ warp "jawaii_in.gat",116,64;
+ end;
+}
+ else
+{
+ mes "[Alowawu]";;
+ mes "Ah. Dear customer,";
+ mes "you don't have enough zeny to pay for the room.";
+ mes "I can't let you in. Or else,";
+ mes "my boss with get angry and hit me with Triple Blows.";
+ close;
+}
+s_Cancel:
+ mes "[Alowawu]";
+ mes "Haha, this room is better than others.";
+ mes "Believe, it's nice and clean.";
+ mes "If you have any change of mind,";
+ mes "just come and find me.";
+ close;
+}
+
+jawaii.gat,108,199,5 script Attendant#Classic_Suite 74,{
+
+ mes "[Poyi Oland]";
+ mes "Welcome.";
+ mes "This is the Classic suite with two rooms.";
+ mes "It's totally perfect for both of you!";
+ mes "Although the appearances of the houses look alike,";
+ mes "the interior is totally different!";
+ next;
+ mes "[Poyi Oland]";
+ mes "The rental is 1000 zeny per person.";
+ mes "and we're on a post paid basis!";
+ mes "Since you're here on a trip,";
+ mes "I suggest that you choose a better room!";
+ next;
+ mes "[Poyi Oland]";
+ mes "If you ever need anything, just call us.";
+ mes "We'll be at your service immediately.";
+ next;
+ menu "Use",-,"Cancel",s_Cancel;
+
+ if (Zeny > 999)
+{
+ mes "[Poyi Oland]";
+ mes "Thank you for using.";
+ mes "Please enjoy your stay.";
+ close2;
+ set Zeny,Zeny - 1000;
+ warp "jawaii_in.gat",130,109;
+ end;
+}
+ else
+{
+ mes "[Poyi Oland]";
+ mes "I'm sorry!";
+ mes "You do not have enough zeny.";
+ mes "Please confirm your zeny and come again!";
+ close;
+}
+s_Cancel:
+ mes "[Poyi Oland]";
+ mes "So, please come again after you've confirmed it.";
+ mes "Presence of any guest is always welcomed.";
+ close;
+}
+
+jawaii.gat,107,189,5 script Attendant#Honeymoon Suite 93,{
+
+ mes "[Saroki Lania]";
+ mes "...This is the Honeymoon suite and the cost is 1000 zeny.";
+ next;
+ mes "[Saroki Lania]";
+ mes "...Do you want to go in?";
+ next;
+ mes "[Poyi Oland]";
+ mes "If you ever need anything, just call us.";
+ mes "We'll be at your service immediately.";
+ next;
+ menu "Yes",-,"Cancel",s_Cancel;
+
+ if(Zeny > 999)
+{
+ mes "[Saroki Lania]";
+ mes "...Please come in.";
+ close2;
+ set Zeny,Zeny - 1000;
+ warp "jawaii_in.gat",86,117;
+ end;
+}
+ else
+{
+ mes "[Saroki Lania]";
+ mes "...Not enough zeny?";
+ close;
+}
+s_Cancel:
+ mes "[Saroki Lania]";
+ mes "...Ok then.";
+ close;
+}
+jawaii.gat,112,173,7 script Attendant#Villa Suite 93,{
+
+ mes "[Lakers Lania]";
+ mes "Saroki, this is rude.";
+ mes "Can't you treat the customer nicely?";
+ mes "This will make them feel uneasy. Oh, customer!";
+ mes "Welcome. Are you here on a trip?";
+ next;
+ mes "[Lakers Lania]";
+ mes "This is the Villa suite.";
+ mes "It is as comfortable as your home.";
+ mes "The rental is only 1000 zeny.";
+ next;
+ mes "[Lakers Lania]";
+ mes "If you want to use it, I can serve you right now.";
+ mes "What do you think?";
+ next;
+ menu "Use it",-,"Cancel",s_Cancel;
+ if(Zeny > 999)
+{
+ mes "[Lakers Lania]";
+ mes "Thanks and rest well.";
+ mes "I hope you'll enjoy your trip.";
+ close2;
+ set Zeny,Zeny - 1000;
+ warp "jawaii_in.gat",87,75;
+ end;
+}
+ else
+{
+ mes "[Lakers Lania]";
+ mes "Oh, you don't have enough zeny for the stay...?";
+ mes "Maybe you can ask from your partner.";
+ mes "Huhuhuhu-";
+ close;
+}
+s_Cancel:
+ mes "[Lakers Lania]";
+ mes "Hmm, maybe you can try the honeymoon suite beside us.";
+ mes "Although Saroki is not sociable,";
+ mes "the room is a true masterpiece!";
+ close;
+}
+
+jawaii.gat,122,263,5 script Sailor#Alberta 100,{
+
+ mes "[Sailor]";
+ mes "This ship will bring you back to Alberta.";
+ mes "do you enjoy your stay at Jawaii?";
+ mes "Please make sure that,";
+ mes "you haven't left out anything.";
+ next;
+ mes "[Sailor]";
+ mes "Well then, are you ready to return to Alberta?";
+ next;
+ menu "Yes, I am",-,"Cancel",s_Cancel;
+
+ mes "[Sailor]";
+ mes "Anchors away! Next stop! Alberta!!";
+ close2;
+ warp "alberta.gat",192,157;
+ end;
+
+s_Cancel:
+ mes "[Sailor]";
+ mes "Well then, spend a little more time before you leave!";
+ mes "It's not like you can come here everyday!";
+ close;
+}
+
+jawaii.gat,239,112,7 script Sailor#Jawaii2 100,{
+
+ mes "[Sailor]";
+ mes "This ship will bring you back to Izlude Island.";
+ mes "do you enjoy your stay at Jawaii?";
+ mes "Please make sure that,";
+ mes "you haven't left out anything.";
+ next;
+ mes "[Sailor]";
+ mes "Well then, are you ready to return to Izlude Island?";
+ next;
+ menu "Yes, I am",-,"Cancel",s_Cancel;
+
+ mes "[Sailor]";
+ mes "Anchors away! Next stop! Izlude Island!!";
+ close2;
+ warp "izlude",176,182;
+ end;
+
+s_Cancel:
+ mes "[Sailor]";
+ mes "Well then, spend a little more time before you leave!";
+ mes "It's not like you can come here everyday!";
+ close;
+}
+
+jawaii.gat,220,235,3 script Jawaii Citizen#Love Bo 724,{
+
+ mes "[JawaJawa]";
+ mes "Do you know where is the most beautiful place in Jawaii?";
+ mes "It's the 'Island of Love',";
+ mes "located at the north of Jawaii.";
+ mes "Since the water is shallow,";
+ mes "you'll be able to reach there if you're careful.";
+ next;
+ mes "[JawaJawa]";
+ mes "It's also a suitable place for a couple to relax and spend some quality time.";
+ mes "If you sit there alone,";
+ mes "you'll look like a castaway,";
+ mes "stranded on a deserted island!";
+ next;
+ mes "[JawaJawa]";
+ mes "Well, of course you can play Castaway";
+ mes "with the letter in empty bottle!";
+ mes "But don't that look pathetic?";
+ close;
+}
+
+jawaii.gat,239,146,3 script Jawaii Citizen#Explain1 100,{
+
+ mes "[WaiiWaii]";
+ mes "Welcome to Jawaii!";
+ mes "What would a marriage be without a honeymoon?";
+ mes "At this place,";
+ mes "you can ignore the threat from those pathetic dateless losers.";
+ next;
+ mes "[WaiiWaii]";
+ mes "You might encounter some monsters here.";
+ mes "But as long as you leave them alone, it will be fine!";
+ mes "They have inhabited this place for a long time,";
+ mes "so you can just take them a part of the view.";
+ close;
+}
+
+jawaii.gat,168,247,5 script Jawaii Citizen#Explain2 724,{
+
+ mes "[WajaWaja]";
+ mes "The hostels are located at the west.";
+ mes "Every room has a different environment.";
+ mes "So choose the one suitable for you.";
+ mes "It would be better if you ask the staff there.";
+ next;
+ mes "[WajaWaja]";
+ mes "Please use the ship at the northwest";
+ mes "and southeast if you want to go back.";
+ mes "There're boats scheduled to";
+ mes "Alberta and Izlude Island.";
+ close;
+}
+
+jawaii.gat,165,121,1 script Jawaii Citizen#Explain3 724,{
+
+ mes "[IwaIwa]";
+ mes "Jawaii~ Isn't this island of happiness great?";
+ mes "You can just lay down";
+ mes "and do nothing for the whole day.";
+ mes "That what Jawaii is meant for.";
+ next;
+ mes "[IwaIwa]";
+ mes "This is the stage,";
+ mes "wher they hold a performance sometimes.";
+ mes "Do you want to go up there and sing us a song?";
+ mes "Jawaii~ Island of Happiness.";
+ close;
+}
+
+jawaii_in.gat,43,115,0 script Customer#jaw_1 97,{
+
+ mes "[Boogie]";
+ mes "uhOh....Oh my! How do I come to a place like this?";
+ mes "Everyone here is filled with happiness!";
+ next;
+ mes "[Boogie]";
+ mes "But for a dateless person like me, it just makes me look more like a loser!!";
+ mes "You, you must have felt the same too, right?";
+ next;
+ mes "[Boogie]";
+ mes "Urgh....";
+ mes "Boss, give me another shot!";
+ close;
+}
+
+jawaii_in.gat,41,106,3 script Customer#Kyle Jeet 98,{
+
+ mes "[Kyle Jeet]";
+ mes "Eat and eat...!!";
+ mes "Drink! Drink...!!";
+ next;
+ mes "[Kyle Jeet]";
+ mes "We are released...!";
+ mes "from being a couple in hell...!";
+ mes "to a healthy and precious single in heaven...!";
+ close;
+}
+
+jawaii_in.gat,15,104,0 script Field Attendant#jawaii 80,{
+
+ mes "[Attendant]";
+ mes "....Well, I don't know what's your purpose of coming here.";
+ //Emotion?
+ next;
+ mes "[Attendant]";
+ mes "If you try to disturb those people in happiness,";
+ mes "Get a drink from the bar tender and go away after you finish it!";
+ next;
+ menu "I am the great single!!",-,"...I just came to congratulate...",s_Cong;
+
+ mes "[Attendant]";
+ mes "How selfish of you...";
+ mes "You should congratulate those happy couples!";
+ mes "Whether you are single of married, don't cause any troube!!";
+ next;
+ mes "[Attendant]";
+ mes "Or else, get married and come here for honeymoon. I'll be glad to serve you.";
+ close;
+s_Cong:
+ mes "[Attendant]";
+ mes "....? What? You're here to celebrate?";
+ mes "Oh my god! I'm so sorry! How rude of me!";
+ mes "Please rest well then~";
+ close;
+}
+
+jawaii_in.gat,28,124,0 script Bartender#jaw 46,{
+
+ set @drinkcount,0;
+ mes "[Bartender]";
+ mes "Welcome, dear customer.";
+ mes "So, what's your order?";
+ next;
+ Loopback:
+ menu "Today's special",-,"Nimi",s_Nimi,"Refreshing",s_Refreshing,"Misa",s_Misa,"Magnificent Blue",s_Magn;
+
+ if(@drinkcount >= 4)
+{
+ mes "[Bartender]";
+ mes "You have taken a lot of drinks. Do you still want to continue?";
+ next;
+ input @jawaiitstring$;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss, because of ";
+ mes @jawaiitstring$;
+ mes "I'm not feeling well...";
+ next;
+ mes "[Bartender]";
+ mes "....Here, this is my recommendation, ^0000FF`Special J&J screw file driver ver.¨¤«×¾¹'^000000 ";
+ mes "It's on the house.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Thank you, boss...";
+ percentheal -100,0;
+ close;
+}
+ else
+{
+ set @randomdrink,rand(1,4);
+ if(@randomdrink == 1)
+{
+ mes "[Bartender]";
+ mes "Well...How about this..?";
+ set Zeny,Zeny - 100;
+ next;
+ mes "[Bartender]";
+ mes "I recommend this ^0000FF`Hot Kiss Assault'^000000¡A";
+ mes "a mixture of sweet scent with the unique scarlet color that bring great passions.";
+ next;
+ mes "You receive a sugar coated overturned triangular glass. -";
+ mes "It is releasing a great amount of sweet scent.-";
+ mes "Although the scent is attractive, it seems dangerous. -";
+ next;
+ mes "[Bartender]";
+ mes "The first encounter is the most important stage.";
+ mes "The feeling of sugar jumping in your mouth is totally awesome.";
+ next;
+ mes "Adjust the direction you sip the drink and taste it slowly.";
+ percentheal -20,0;
+ specialeffect2 38;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+ else if(@randomdrink == 2)
+{
+ mes "[Bartender]";
+ mes "How about this one?";
+ next;
+ mes "[Bartender]";
+ mes "I recommend this ^0000FF`Black Siberian Double Shot'^000000 ";
+ mes "A drink that let you feel the power of Russia and the greatness of land.";
+ next;
+ mes "- You look at the mixture of ice cube and black liquid.-";
+ mes "- Although the scent is sweet-";
+ mes "- You find a slight scent of male after shave.-";
+ next;
+ mes "[Bartender]";
+ mes "It's suitable to taste it bits by bits due to its strong taste.";
+ mes "It is a special mixture loved by the Siberians.";
+ next;
+ mes "- You feel the scent and drink it bits by bits. -";
+ percentheal -20,0;
+ specialeffect2 63; //Fire Ivy?
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+ else if(@randomdrink == 3)
+{
+ mes "[Bartender]";
+ mes "Let me recommend...";
+ next;
+ mes "[Bartender]";
+ mes "I recommend this ^0000FF`White Hot Magarita'^000000 ";
+ mes "The sour scent of lemon is really special, especially when you feel the soul of a Mexican within!";
+ next;
+ mes "- You receive an overturned triangular glass coated with lemon juice.-";
+ mes "- It is releasing a sweet and sour scent.-";
+ mes "- As attractive as it looks, you cannot ignore the danger behind it.";
+ next;
+ mes "[Bartender]";
+ mes "The sweet and refreshing taste make it popular among the girls,";
+ mes "especially when it contains the sensation of a Mexican.";
+ next;
+ mes "- You can imagine yourself wearing a Mexican Sombrero-";
+ mes "- and drinking this cocktail! -";
+ percentheal -20,0;
+ specialeffect2 17;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+ else if(@randomdrink == 4)
+{
+ mes "[Bartender]";
+ mes "Hmm... How about this?";
+ next;
+ mes "[Bartender]";
+ mes "I recommend this ^0000FF`Barcardi 151 Barcelona Crusade'^000000";
+ mes "It's a pirate cocktail with a lot of memories";
+ next;
+ mes "-You look at the yellow liquid in the small glass. -";
+ mes "-Although it looks like you can finish it in 1 sip, -";
+ mes "-it looks like a really dangerous drink. -";
+ next;
+ mes "[Bartender]";
+ mes "This flaming baby will burn you up.";
+ mes "Finish it in one sip to feel the burning sensation.";
+ next;
+ mes "- You finish it in one sip. -";
+ percentheal -20,0;
+ specialeffect2 171;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+}
+
+s_Nimi:
+ if(@drinkcount >= 5)
+{
+ mes "[Bartender]";
+ mes "...I'll buy you a drink.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Thanks ...Boss...";
+ percentheal -100,0;
+ close;
+}
+ else
+{
+ mes "[Bartender]";
+ mes "Here, try this.";
+ set Zeny,Zeny - 100;
+ next;
+ mes "[Bartender]";
+ mes "If you want to show your interest to a girld, choose this!";
+ mes "With the special and strong scent,";
+ mes "it makes you look like a special person too.";
+ next;
+ mes "- You receive a simple looking glass containing white liquid-";
+ mes "- Although there's a slight scent of sweetness, it tastes sour -";
+ mes "- And it makes you want to shout out loud. - ";
+ next;
+ mes "[Bartender]";
+ mes "A lot of people say taht mixed taste of sweet and bitter is like the taste of life.";
+ mes "So it's best for you to taste it with the tip of your tounge.";
+ next;
+ mes "- Drink it from the tip of your tounge -";
+ next;
+ mes "-And it makes me feel.... Bang !!' -";
+ percentheal -10,0;
+ specialeffect2 18;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+s_Refreshing:
+ if (@drinkcount >= 5)
+{
+ mes "[Bartender]";
+ mes "...I'll buy you a drink.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Thanks ...Boss...";
+ percentheal -100,0;
+ close;
+}
+ else
+{
+ mes "[Bartender]";
+ mes "Here, try this!";
+ set Zeny,Zeny - 100;
+ next;
+ mes "[Bartender]";
+ mes "This one tastes like an old friend.";
+ mes "The more you drink, the better you'll feel.";
+ mes "You can drink it whenever, wherever and with whoever you want.";
+ next;
+ mes "- The tasty looking blue liquid is served to you. -";
+ mes "- Contained in a fancy looking glass, -";
+ mes "- it gives excitement to your nostril with the sour yet sweet scent. -";
+ next;
+ mes "[Bartender]";
+ mes "Don't just take one shot of this.";
+ mes "It will get better the more you drink it!";
+ next;
+ mes "- Your mouth is filled with the sour yet sweet scent after you finish the drink in 3 sips-";
+ mes "- It's really a special blend... -";
+ percentheal -10,0;
+ specialeffect2 84; //Magnificat?
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+s_Misa:
+ if (@drinkcount >= 5)
+{
+ mes "[Bartender]";
+ mes "...I'll buy you a drink.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Thanks ...Boss...";
+ percentheal -100,0;
+ close;
+}
+ else
+{
+ mes "[Bartender]";
+ mes "Here, try this!";
+ set Zeny,Zeny - 100;
+ next;
+ mes "[Bartender]";
+ mes "This one tastes like an old friend.";
+ mes "The more you drink, the better you'll feel.";
+ mes "You can drink it whenever, wherever and with whoever you want.";
+ next;
+ mes "- The tasty looking blue liquid is served to you. -";
+ mes "- Contained in a fancy looking glass, -";
+ mes "- it gives excitement to your nostril with the sour yet sweet scent. -";
+ next;
+ mes "[Bartender]";
+ mes "Don't just take one shot of this.";
+ mes "It will get better the more you drink it!";
+ next;
+ mes "- Your mouth is filled with the sour yet sweet scent after you finish the drink in 3 sips-";
+ mes "- It's really a special blend... -";
+ percentheal -10,0;
+ specialeffect2 97;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+
+s_Magn:
+ if (@drinkcount >= 5)
+{
+ mes "[Bartender]";
+ mes "...I'll buy you a drink.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Thanks ...Boss...";
+ percentheal -100,0;
+ close;
+}
+ else
+{
+ mes "[Bartender]";
+ mes "Here, try this.";
+ set Zeny,Zeny - 100;
+ next;
+ mes "[Bartender]";
+ mes "This is recommended for those who miss the glorious memories of the pass...";
+ mes "For those who starts a war to preserve the peace...";
+ mes "And of course... For those who fake the truth of history.";
+ next;
+ mes "- You receive a brown liquid in a shaking bottle. -";
+ mes "- You feel the heavy and thick scent like the machines oil. -";
+ mes "- Scent of fireworks? No, it's a little different than that... -";
+ next;
+ mes "[Bartender]";
+ mes "It might look a lot but you better finish it in 1 sip.";
+ mes "You'll lose its taste if you drink it too slow.";
+ next;
+ mes "- Grabbing the Shake bottle, you immediately finish it.-";
+ next;
+ mes "- And it feels like you're hit by a canon.-";
+ percentheal -10,0;
+ specialeffect2 132;
+ set @drinkcount,@drinkcount + 1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Boss...Give me another shot...";
+ next;
+}
+goto Loopback;
+}
+
+jawaii_in.gat,25,94,5 script Attendant#jaw1 724,{
+
+ mes "[Attendant Teleteer]";
+ mes "Welcome to the Inn of Jawaii~";
+ mes "I hope you'll enjoy your stay here...";
+ mes "But don't get drunk and cause any trouble!";
+ close;
+}
+
+jawaii_in.gat,25,96,5 script Attendant#jaw2 724,{
+
+ mes "[Attendant PoYi]";
+ mes "Welcome to the Inn of Jawaii~";
+ mes "I hope you'll enjoy yourself~";
+ mes "But, don't get jealous and criticize people who are blessed with happiness!";
+ close;
+}
+
+jawaii_in.gat,25,98,5 script Attendant#jaw3 724,{
+
+ mes "[Attendant Poppy]";
+ mes "Welcome to the Inn of Jawaii~";
+ next;
+ mes "[Attendant Poppy]";
+ mes "May I ask....are you from a foreign land?";
+ mes "You're still single, right?";
+ mes "I am a good cook too, will you consider me?";
+ mes "How about that? Huh?";
+ close;
+}
+
+jawaii_in.gat,25,100,5 script Attendant#jaw4 724,{
+
+ mes "[Attendant Ether]";
+ mes "Welcome to the Inn of Jawaii~";
+ mes "Criticizing, no! Discouraging, no!";
+ mes "Get drunk, no! Congratulate, YES!";
+ close;
+}
+
+jawaii_in.gat,30,94,4 script Attendant#jaw5 724,{
+
+ mes "[Attendant Donna]";
+ mes "Welcome to the Inn of Jawaii~";
+ mes "......Oh no.....";
+ mes "...Welcome! But please don't get drunk and cause trouble again! ";
+ close;
+}
+
+jawaii_in.gat,30,96,4 script Attendant#jaw6 724,{
+
+ mes "[Attendant Ken]";
+ mes "Welcome to the Inn of Jawaii~";
+ mes "It's ok for you to relax, but...";
+ mes "Please control yourself...";
+ close;
+}
+
+jawaii_in.gat,30,98,4 script Attendant#jaw7 724,{
+
+ mes "[Attendant Emater]";
+ mes "Welcome to the Inn of Jawaii~";
+ next;
+ mes "[Attendant Emater]";
+ mes "...You're like a wandering soul.";
+ mes "This place is not suitable for you!";
+ mes "Well, as long as you like it,";
+ mes "have fun but please don't cause any trouble~";
+ close;
+}
+
+jawaii_in.gat,30,100,4 script Attendant#jaw8 724,{
+
+ mes "[Attendant GoYa]";
+ mes "Welcome to the Inn of Jawaii~";
+ next;
+ mes "[Attendant GoYa]";
+ mes "Just like a story with a chapter missing,";
+ mes "you look disgusting.";
+ mes "Find yourself a partner so that you can enjoy your adventure~";
+ close;
+}
diff --git a/npc/cities/lighthalzen.txt b/npc/cities/lighthalzen.txt
index c03c2c2d0..5dd29a812 100644
--- a/npc/cities/lighthalzen.txt
+++ b/npc/cities/lighthalzen.txt
@@ -1,2058 +1,2058 @@
-//===== eAthena Script =======================================
-//= Lighthalzen City
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 1.0b
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Lighthalzen NPCs (Temporal names for now) [erKURITA]
-//===== Additional Comments: ==================================
-//= 0.1 Placed temporal names, why there weren't on the SVN before? [erKURITA]
-//= 0.2 Implemented some crap NPCs [MasterOfMuppets]
-//= 0.3 Another load of NPCs. Scripted by Kargha [MasterOfMuppets]
-//= 0.4 More Town NPCs. [Musashiden]
-//= 0.5 Added a BIG load of Lighthalzen NPCs. [musashiden]
-//= 0.6 Fixed some typos+Coordinates. [Musashiden]
-//= 0.7 Implemented some more crap NPCs and the second entrance to biolabs [MasterOfMuppets]
-//= 0.8 Removed Duplicates [Silent]
-//= 0.9 Removed Duplicates [Toms]
-//= 1.0 Added a missing feature to the donation NPC [MasterOfMuppets]
-//= 1.0a added constants to emotions, minor optimization [Lupus]
-//= 1.0b npcid fix [KarLaeda]
-//=============================================================
-
-lighthalzen.gat,198,285,5 script Jiwon 862,{
-
- mes "[Jiwon]";
- mes "I think we're really";
- mes "fortunate to be able to";
- mes "live in such a beautiful";
- mes "and peaceful city like this.";
- next;
- mes "[Jiwon]";
- mes "It's just so nice to";
- mes "have this pleasant weather,";
- mes "these lush gardens and to";
- mes "meet all of these kind people.";
- mes "Lighthalzen is like Asgard";
- mes "in Midgard, heaven on earth~";
- close;
-}
-
-
-lighthalzen.gat,220,244,3 script Samnang 863,{
-
- mes "[Samnang]";
- mes "*Sigh...*";
- mes "It gets harder for me";
- mes "to move around as I get";
- mes "older. That's understandable";
- mes "for an elderly person, right?";
- next;
- mes "[Samnang]";
- mes "Just the other day, these";
- mes "hoodlums in black suits";
- mes "were yelling at me to get out";
- mes "of their way. But of course,";
- mes "I didn't move quickly enough.";
- mes "So what did they do to me?";
- next;
- mes "[Samnang]";
- mes "They punched me.";
- mes "Right in the womb!";
- mes "I know that i'm not";
- mes "pregnant, but that's";
- mes "besides the point. Never hit";
- mes "a lady, especially an old one!";
- close;
-}
-
-
-lighthalzen.gat,261,112,3 script Ruth 862,{
-
- mes "[Ruth]";
- mes "Sweety, isn't it";
- mes "nice to be together";
- mes "under this beautiful";
- mes "sunlight? It's perfect";
- mes "for our date. Ahhhh~";
- next;
- mes "[Ruth]";
- mes "I'm so happy to be";
- mes "with you. I feel like";
- mes "I'm just melting with";
- mes "happiness. Ohm I love";
- mes "you so much, Oyoung.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Whoa...";
- mes "This couple is";
- mes "really headed for";
- mes "Cloud 9, aren't they?";
- close;
-}
-
-
-lighthalzen.gat,259,108,7 script Oyoung 869,{
-
- mes "[Oyoung]";
- mes "Girl, you look like";
- mes "you're comin' down with";
- mes "the love bug. But there's";
- mes "only one prescription for";
- mes "this ailment, ooooh yeah...";
- next;
- mes "[Oyoung]";
- mes "You need yo'self";
- mes "your daily dose of";
- mes "vitamin O-YOUNG.";
- mes "And your lips look like";
- mes "they got vitamin deficiency.";
- mes "i better take care of that~";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Sweet Sister!";
- mes "I don't know what's";
- mes "more mind boggling--";
- mes "The fact that he used";
- mes "that line or the fact that";
- mes "it's actually working...";
- close;
-}
-
-lighthalzen.gat,233,121,4 script Kariya 72,{
-
- mes "[Kariya]";
- mes "I think \"Lighthalzen\" is";
- mes "supposed to mean \"crest of";
- mes "light\", though i hear that this";
- mes "city was actually named after";
- mes "somebody. Who knows for sure?";
- next;
- mes "[Kariya]";
- mes "Still, It's a fitting";
- mes "name for the wealthiest";
- mes "and most luxurious city in";
- mes "all the Schwaltzvalt Republic.";
- mes "So how do you like this place?";
- close;
-}
-
-
-lighthalzen.gat,233,82,4 script Sung 716,{
-
- mes "[Sung]";
- mes "When i grow up, I want";
- mes "to become such a great";
- mes "person that they'll make";
- mes "a statue of me, just like";
- mes "those statues over there.";
- next;
- mes "[Sung]";
- mes "Then people would be like,";
- mes "\"Hey yo. That statue. That";
- mes "guy must have been great!\"";
- mes "Just thinking about that";
- mes "makes me feel so good!";
- next;
- mes "[Sung]";
- mes "That's it. I'm gonna";
- mes "grow up as soon as i can.";
- mes "Ooh, and i better grow tall";
- mes "and handsome so my statue";
- mes "will be even more awesome.";
- mes "Yeah. Yeah, good idea, Sung...";
- close;
-}
-
-
-lighthalzen.gat,89,73,4 script Sameer 854,{
-
- mes "[Sameer]";
- mes "There are too many";
- mes "loving couples in this city.";
- mes "Cuddling and kissing and";
- mes "hugging and necking. It's...";
- mes "It's utterly distasteful.";
- next;
- mes "[Sameer]";
- mes "I can't believe the";
- mes "indencenct I see everyday";
- mes "near my own home. Don't";
- mes "they know better than to be";
- mes "so affectionate in places";
- mes "where the public can see them?!";
- next;
- mes "[Sameer]";
- mes "Fortunately for the";
- mes "world, i'm a bulwark";
- mes "of morality. In fact, I have";
- mes "no need for a woman. All";
- mes "I need are my ship models,";
- mes "teen novels and dominos.";
- next;
- mes "[Sameer]";
- mes "I'm a completely well";
- mes "adjusted individual, which";
- mes "is why the authorities should";
- mes "listen to me when i tell them";
- mes "to arrest couples for indecency!";
- mes "Hand holding. Have they no shame!?";
- close;
-}
-
-
-
-lighthalzen.gat,45,59,8 script Janice 863,{
-
- mes "[Janice]";
- mes "Oh no, I think i got";
- mes "lost again. The roads";
- mes "here are so confusing!";
- mes "I've lived here for such";
- mes "a long time and I still";
- mes "can't find my way around...";
- close;
-}
-
-
-lighthalzen.gat,66,94,5 script Elmer Keays 866,{
-
- mes "[Elmer Keays]";
- mes "Walking side by side";
- mes "with you like this reminds";
- mes "me of the old days. Back";
- mes "then, everyone was jealous";
- mes "that i had such a beautiful";
- mes "woman by my side. Heh heh~";
- next;
- mes "[Elmer Keays]";
- mes "You're still the most";
- mes "precious sight to these";
- mes "old eyes, my dear. I'm";
- mes "really lucky to be with you.";
- close;
-}
-
-lighthalzen.gat,65,94,4 script Margie Keays 863,{
-
- mes "[Margie Keays]";
- mes "Oh darling, the";
- mes "weather is so nice";
- mes "and pleasant today.";
- mes "I'm really glad we";
- mes "decided to go take";
- mes "a walk together~";
- close;
-}
-
-lighthalzen.gat,78,120,3 script Maivi 862,{
-
- mes "[Maivi]";
- mes "...";
- next;
- mes "[Maivi]";
- mes "...";
- mes ".....";
- next;
- mes "[Maivi]";
- mes "Ah...";
- mes "I just had the nicest";
- mes "nap, This nice weather";
- mes "never fails to relax me.";
- mes "The air here is so clean,";
- mes "not like that Einbroch~";
- next;
- mes "[Maivi]";
- mes "This clean, pristine";
- mes "environment is all thanks";
- mes "to the Rekenber Corporation.";
- mes "It's incredible what they can";
- mes "do with technology now, isn't";
- mes "it? Ahhh, it's so peaceful~";
- close;
-}
-
-
-lighthalzen.gat,226,210,3 script Nannan 86,{
-
- mes "[Nannan]";
- mes "You know, I always thought";
- mes "that all Alchemists were bookish,";
- mes "scholarly types, their faces always";
- mes "buried in books and studying. But";
- mes "I managed to find one who doesn't";
- mes "fit that nerdy stereotype at all.";
- next;
- mes "[Nannan]";
- mes "This guy, What's-his-face,";
- mes "Broncher, is always wasting";
- mes "his time drinking. I guess he";
- mes "discovered the secret of turning";
- mes "water into Grade A booze. But";
- mes "at least he's not the stuffy type.";
- next;
- mes "[Nannan]";
- mes "I don't know how much";
- mes "help he'd be to an aspiring";
- mes "Alchemist, but in my opinion,";
- mes "the man is a fully fledged";
- mes "genius! At least, compared";
- mes "to a street guy like me...";
- close;
-}
-
-lighthalzen.gat,230,182,4 script Klaubis 866,{
-
- mes "[Klaubis]";
- mes "Excuse me, but are you";
- mes "a tourist? Well, welcome";
- mes "to Lighthalzen! This city";
- mes "has everything we need,";
- mes "but it can be a little too";
- mes "quiet and uneventful here.";
- next;
- menu "Have you lived in here long?",live,"I agree.",agree,"Have you heard about the serial killer?",killer;
-
-
-live:
- mes "[Klaubis]";
- mes "Yes, our family has";
- mes "lived in this city for a";
- mes "long time, starting with";
- mes "my great grandfather. Let's";
- mes "see, my family's been here";
- mes "for about two hundred years.";
- next;
- mes "[Klaubis]";
- mes "You'd be surprised how";
- mes "many people stay in their";
- mes "hometowns. Even if you do";
- mes "leave, though, you can always";
- mes "come back. It wouldn't be your";
- mes "hometown if you couldn't, right?";
- close;
-
-agree:
- mes "[Klaubis]";
- mes "Yes, the atmosphere";
- mes "can get pretty listless";
- mes "around here. But still,";
- mes "there are plenty of nice";
- mes "sights to enjoy here in";
- mes "Lighthalzen, so look around~";
- close;
-
-killer:
- mes "[Klaubis]";
- mes "You mean the Serial";
- mes "Axe Murderer? I thought";
- mes "that was an old ghost story.";
- mes "Hm. I think that lady inside";
- mes "the Weapon Shop would";
- mes "know more about that tale...";
- close;
-
-}
-
-
-lighthalzen.gat,232,156,4 script Sigmund 866,{
-
- mes "[Sigmund Ting]";
- mes "You know what i noticed?";
- mes "The guards at the border";
- mes "to the slum seem distracted";
- mes "sometimes. I made use of one";
- mes "of their less attentive moments";
- mes "and basically jumped the fence!";
- next;
- mes "[Sigmund Ting]";
- mes "But once i was in the";
- mes "Slums, I was pretty bored.";
- mes "There really isn't much to";
- mes "do there. Which makes me";
- mes "Wonder... Why guard it?";
- close;
-
-}
-
-lighthalzen.gat,190,134,5 script Joyce 862,{
-
- mes "[Joyce]";
- mes "I can sense your";
- mes "longing look within";
- mes "the depths of my heart,";
- mes "beating faster and faster";
- mes "with a feverish passion~";
- close;
-
-}
-
-
-lighthalzen.gat,191,134,5 script Dan Song 869,{
-
- mes "[Dan Song]";
- mes "Those eyes of yours...";
- mes "So pure and so deep,";
- mes "like glimmering pools";
- mes "of light. So, so beautiful...";
- close;
-
-}
-
-
-
-lighthalzen.gat,115,159,5 script Collins 866,{
-
- mes "[Collins]";
- mes "I really wish that my";
- mes "son will be able to join";
- mes "the Rekenber Corporation.";
- mes "They certainly provide the";
- mes "best jobs in Lighthalzen.";
- next;
- mes "[Collins]";
- mes "Although they're a large,";
- mes "major corporation, it's";
- mes "almost impossible to get";
- mes "emplyed by them. How";
- mes "do people get hired there";
- mes "in the first place anyway?";
- close;
-
-}
-
-
-
-lighthalzen.gat,77,157,5 script Villagomez 866,{
-
- mes "[Villagomez]";
- mes "I just step out to get";
- mes "a haircut and now i'm";
- mes "lost. Boy oh boy, I hope";
- mes "i don't keep my family";
- mes "waiting. *Sigh...*";
- close;
-
-}
-
-
-lighthalzen.gat,125,68,5 script Kemp 97,{
-
- mes "[Kemp]";
- mes "Have you ever seen the";
- mes "people who work in that big";
- mes "corporation over there? I think";
- mes "their employees are all a bit";
- mes "off kilter for some reason.";
- next;
- mes "[Kemp]";
- mes "I haven't been there";
- mes "myself, but something";
- mes "strange is happening with";
- mes "all the people who work there.";
- close;
-
-}
-
-
-lighthalzen.gat,138,50,8 script Mauro 847,{
-
- mes "[Mauro]";
- mes "The youth in this city";
- mes "have no appreciation for";
- mes "their elders. i've worked";
- mes "so hard to help build this";
- mes "city for so many years and";
- mes "this is the thanks i get?";
- next;
- mes "[Mauro]";
- mes "Bah! If it weren't for";
- mes "us, Lighthalzen wouldn't";
- mes "be as prosperous as it is";
- mes "today! Those kids don't";
- mes "know that they owe their";
- mes "lives of luxury to us...";
- close;
-
-}
-
-
-lighthalzen.gat,132,103,5 script Sefith 734,{
-
- mes "[Sefith]";
- mes "Good looks. Intelligence.";
- mes "Excellent manners. A strong,";
- mes "manly chin and overpowering,";
- mes "piercing eyes. Perfectly balanced";
- mes "passion and charisma. All the";
- mes "good things that ladies want.";
- next;
- mes "[Sefith]";
- mes "But Enough about me. Let's";
- mes "discuss how sorry i should";
- mes "feel for any other man living";
- mes "in Lighthalzen. They don't hold";
- mes "a candle to my studliness~";
- close;
-
-}
-
-
-lighthalzen.gat,239,64,5 script Jade 862,{
-
- mes "[Jade]";
- mes "I've heard that there's a";
- mes "strange kingdom out there";
- mes "that's basically ruled by";
- mes "magic and swords, where";
- mes "adventurers are enlisted";
- mes "for the greater good.";
- next;
- mes "[Jade]";
- mes "So are you from";
- mes "Rune-Midgard?";
- mes "What do you think";
- mes "of our city with its";
- mes "advanced technology";
- mes "and economy? Huh...";
- next;
- mes "[Jade]";
- mes "Someday, I'd like";
- mes "to go visit the land";
- mes "where you came from.";
- mes "It sounds so fantastic";
- mes "and romantic in a way...";
- close;
-
-}
-
-lighthalzen.gat,205,208,3 script Greedy Looking Man 853,{
-
- mes "[Khramptd]";
- mes "The land around here";
- mes "is some pretty expensive";
- mes "property. Yes, it's perfect";
- mes "for building my awesome palace!";
- mes "I don't have enough funds at the";
- mes "moment, but the day will come~";
- close;
-
-}
-
-lhz_in02.gat,34,213,4 script Maggie 91,{
-
- mes "[Maggie]";
- mes "Sure, I sell a lot";
- mes "of flowers here, but";
- mes "the lease that this city";
- mes "makes me pay cuts into";
- mes "my profits. It's almost not";
- mes "worth renting this property.";
- next;
- mes "[Maggie]";
- mes "I pay such a ridiculous";
- mes "amount for the lease and the";
- mes "laws here won't let me raise";
- mes "the price of my flowers. Why";
- mes "are the city officials so greedy?";
- close;
-
-}
-
-lighthalzen.gat,202,94,5 script Wallace 847,{
-
- mes "[Wallace]";
- mes ".....";
- mes "That lady, working";
- mes "for that one company";
- mes "Kafra, Mafra or whatever";
- mes "She certainly is very charming.";
- next;
- mes "[Wallace]";
- mes "Now, if I were";
- mes "thirty years younger...";
- mes "Wait! I'm a rich and powerful";
- mes "man. I could ask her out now.";
- mes "Hm? What's that look for?";
- close;
-
-}
-
-lighthalzen.gat,182,102,3 script Lucius 866,{
-
- mes "[Lucius]";
- mes "Hello youngster~";
- mes "Would you like to";
- mes "make a donation";
- mes "to help the hungry?";
- next;
- menu "Sure.",s_Sure,"No, thanks.",-;
-
- mes "[Lucius]";
-s_Cancel:
- mes "I understand. Still,";
- mes "keep in mind that when";
- mes "you give from your heart,";
- mes "you will be rewarded tenfold.";
- mes "Though I admit, the benefits";
- mes "aren't always readily apparent.";
- close;
-
-s_Sure:
- mes "[Lucius]";
- mes "Now, you can donate 1 to";
- mes "30,000 zeny that will be used";
- mes "to support the poor and feed";
- mes "starving children. If you wish";
- mes "to cancel, please enter '0'.";
- next;
- input @zenydonate;
- mes "[Lucius]";
- if(!@zenydonate)goto s_Cancel;
- if(@zenydonate > 30000){
- mes "I'm sorry but you can't";
- mes "donate more than 30,000";
- mes "zeny. Please choose another";
- mes "number.";
- close;
- }
- if(Zeny < @zenydonate){
- mes "I'm sorry but you do";
- mes "not have as much zeny";
- mes "as you wish to donate.";
- mes "Please come back when you";
- mes "do!";
- close;
- }
- set Zeny,Zeny - @zenydonate;
- set $donatedzeny,$donatedzeny + @zenydonate;
- mes "Thank you so much";
- mes "for your " + @zenydonate + " zeny donation.";
- mes "I promise that your money";
- mes "will be put to good use in";
- mes "benefiting the poor and needy.";
- next;
- mes "[Lucius]";
- mes "So far, I've received";
- mes "a total of " + $donatedzeny + " zeny in";
- mes "donations. I'm glad to see";
- mes "that there are still kinda and";
- mes "generous people in the world.";
- if($donatedzeny > 259999){
- next;
- mes "[Lucius]";
- mes "This should be enough";
- mes "to send to the Poor Relief";
- mes "Organization. Please accpet";
- mes "this small gift as a token of";
- mes "my gratitude, adventurer. Bless";
- mes "you, youngster and take care.";
- getitem 603,1;
- getitem 12016,1;
- set $donatedzeny,0;
- }
- close;
-
-}
-
-lighthalzen.gat,147,105,3 script Laqumet 869,{
-
- mes "[Laqumet]";
- mes "Sure, manliness is quite";
- mes "attractive, but I think women";
- mes "appreciate a guy who could";
- mes "sympathize and talk with them";
- mes "a little more. Don't you agree?";
- next;
- mes "[Laqumet]";
- mes "I might not be like Sefith,";
- mes "but I guess I've got a cute";
- mes "smile, a good personality and";
- mes "I'm a dandy to boo. Hopefull,";
- mes "my honesty and loyalty will";
- mes "help me find someone good.";
- close;
-
-}
-
-lhz_in02.gat,230,284,4 script Hotel Employee#01 86,{
-
- mes "[Hotel Employee]";
- mes "Welcome to";
- mes "the Royal Dragon,";
- mes "where you can find the";
- mes "finest accomodations";
- mes "and the best service.";
- next;
- menu "Save Point",s_Save,"Rest - 5,000 zeny",s_Rest,"Cancel",-;
-
- mes "[Hotel Employee]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-
-s_Save:
- savepoint "lhz_in02.gat",209,275;
- mes "[Hotel Employee]";
- mes "Thank you, your";
- mes "Respawn Point has";
- mes "been saved here in";
- mes "the Royal Dragon.";
- close;
-
-s_Rest:
- if(Zeny < 5000)goto s_NEnoughZ;
- set Zeny,Zeny - 5000;
- mes "[Hotel Employee]";
- mes "Thank you~";
- mes "I hope you enjoy";
- mes "your stay in the";
- mes "Royal Dragon.";
- close2;
- warp "lhz_in02.gat",219,150;
- percentheal 100,100;
- sc_start SC_BLESSING,240000,10;
- skilleffect AL_BLESSING,0;
- end;
-
-s_NEnoughZ:
- mes "[Hotel Employee]";
- mes "I'm sorry but you do not";
- mes "have enough zeny, please";
- mes "come back when you do!";
- close;
-}
-
-lhz_in02.gat,241,172,8 script Hotel Employee#02 868,{
-
- mes "[Hotel Employee]";
- mes "Please use the stairs";
- mes "at the northern end to";
- mes "go downstairs so that you";
- mes "can go to the Front Desk.";
- mes "Thank you and I hope that";
- mes "you enjoy your stay here.";
- close;
-
-}
-
-lhz_in02.gat,210,189,2 script Christopher Michael 849,{
-
- mes "[Christopher Michael]";
- mes "OoooOoh~";
- mes "Soooo comfortable";
- mes "Don't want to wake up.";
- mes "Don't want to get up.";
- mes "Ever again. OoOoooh...";
- close;
-
-}
-
-lhz_in02.gat,201,181,6 script Safwat Fahmy 853,{
-
- mes "[Safwat Fahmy]";
- mes "This hotel is nice";
- mes "and comfortable, but";
- mes "to be quite frank, the";
- mes "drinks here are horrible.";
- mes "They're unfit for being";
- mes "drunk by men such as myself.";
- next;
- mes "[Safwat Fahmy]";
- mes "If this is the best hotel,";
- mes "I expect them to provide me";
- mes "with the best alcohol. When";
- mes "I stay at a hotel, that's what";
- mes "I want. To spend the entire";
- mes "day not being sober.";
- next;
- mes "[Safwat Fahmy]";
- mes "It looks like that";
- mes "today I'll be heading";
- mes "out ot to the bar again...";
- mes "I just wish there were";
- mes "some place quieter to drink.";
- close;
-
-}
-
-lhz_in02.gat,251,212,2 script Hotel Employee#03 868,{
-
- mes "[Hotel Employee]";
- mes "This is the Couple Suite.";
- mes "A single can also check";
- mes "in here, but our hotel will";
- mes "prioritize couples when";
- mes "assigning this room.";
- close;
-
-}
-
-lhz_in02.gat,229,217,2 script Tanoue 863,{
-
- mes "[Tanoue]";
- mes "This chair looks";
- mes "very nice, but it really";
- mes "chills my bottom. Brr...!";
- mes "It's mighty uncomfortable!";
- next;
- mes "[Tanoue]";
- mes "You know what the";
- mes "perfect chair would";
- mes "be like? It would be";
- mes "plush and have electronic";
- mes "massage and heating controls...";
- close;
-
-}
-
-lhz_in02.gat,209,277,4 script Ben Allen 84,{
-
- mes "[Ben Allen]";
- mes "Aaahhh Oooooh~";
- mes "It's sooooo comfy~";
- mes "The air's so fresh and";
- mes "this couch is so plush...";
- mes "Why can't home be like this?";
- next;
- mes "[Ben Allen]";
- mes "I've been in those other";
- mes "hotels and let me tell you,";
- mes "this place is the best ever.";
- mes "After a night's sleep over";
- mes "here, I feel like a new man!";
- close;
-
-}
-
-lhz_in02.gat,221,276,4 script Harp 869,{
-
- mes "[Harp]";
- mes "Oh sweet jiminy...";
- mes "That Kafra Lady is so hot.";
- mes "What a body. And those glasses.";
- mes "I just gotta ask her out somehow.";
- next;
- mes "[Harp]";
- mes "Hm, but what should";
- mes "I do? A love letter? Naw,";
- mes "that's kind of outdated.";
- mes "Argh, I can't think! Just";
- mes "looking at her makes me feel";
- mes "so happy! Praise be to Kafra!";
- close;
-
-}
-
-lhz_in02.gat,238,275,4 script Hotel Employee#04 869,{
-
- mes "[Hotel Employee]";
- mes "\"Hospitality with a smile";
- mes "and total devotion to your";
- mes "comfort.\" That's our motto";
- mes "in the Royal Dragon Hotel.";
- mes "Please inquire at the front";
- mes "desk if you wish to check in.";
- close;
-
-}
-
-lhz_in02.gat,247,275,4 script Hotel Employee#05 868,{
-
- mes "[Hotel Employee]";
- mes "Welcome to the";
- mes "Royal Dragon Hotel Bar.";
- mes "How about a nice night";
- mes "cap before going to bed?";
- next;
- mes "[Hotel Employee]";
- mes "If you're looking";
- mes "for a friend, you";
- mes "can almost always";
- mes "make one in this bar.";
- mes "Alcohol certainly is the";
- mes "grease for social gears.";
- close;
-
-}
-
-lhz_in02.gat,271,281,2 script Citizen#01 47,{
-
- mes "[Hachi]";
- mes "Oh yeah. I love-love-love";
- mes "bars. If I don't come here";
- mes "for the booze, then I'm here";
- mes "for all these beautiful ladies.";
- next;
- mes "[Hachi]";
- mes "Weird. It's the very first";
- mes "time I've tried this place's";
- mes "rum, but doesn't it taste like";
- mes "pure sexiness to you? Huh...";
- mes "Oh well, back to schmoozin'";
- mes "with all the hot chicks~";
- close;
-
-}
-
-lhz_in02.gat,277,285,4 script Bartender 61,{
-
- mes "[Duff]";
- mes "Hey, you're from";
- mes "Rune-Midgard, right?";
- mes "Please make yourself";
- mes "at home while you're here";
- mes "in Lighthalzen and have";
- mes "yourself a good time.";
- close;
-
-}
-
-lhz_in02.gat,281,280,6 script Customer#01 816,{
-
- mes "[Rona]";
- mes "I hate it when guys";
- mes "just sidle up and sort";
- mes "of just skip Steps One";
- mes "and Two. And before you";
- mes "get all weird, Step Three";
- mes "is \"Ask for my phone number.\"";
- next;
- mes "[Rona]";
- mes "I would just really";
- mes "appreciate it if one";
- mes "nice boy would just";
- mes "talk to me for real.";
- close;
-
-}
-
-lhz_in02.gat,287,282,4 script Customer#02 853,{
-
- mes "[Greenfield]";
- mes "I don't believe it...";
- mes "This unluck streak";
- mes "will never end, will it?";
- mes "I lost all my Apples";
- mes "playing Dice today.";
- mes "Again. Oh man...";
- next;
- mes "[Greenfield]";
- mes "Okay. Okay.";
- mes "If I just keep";
- mes "playing, eventually";
- mes "I'll win. I mean, that's";
- mes "the way the odds work, right?";
- mes "Even when they're against me...";
- close;
-
-}
-
-lighthalzen.gat,123,212,4 script Merpi 700,{
-
- mes "[Merpi]";
- mes "Isn't the weather nice";
- mes "today? All this sunlight";
- mes "will dry these clothes";
- mes "quickly and give them";
- mes "a fresh, lovely scent.";
- next;
- mes "[Merpi]";
- mes "Oh, an adventurer from";
- mes "Rune-Midgarts, are you?";
- mes "How do you like our city?";
- mes "If you have any questions,";
- mes "feel free to ask me anything.";
- next;
- menu "Well, I have nothing to ask...",-,"Any news or rumors?",L_rumors,"I like laundry too.",L_laundry;
- mes "[Merpi]";
- mes "Oh, really?";
- mes "Well, if you've traveled";
- mes "all over the world, maybe";
- mes "you've found a place just";
- mes "like Lighthalzen, so maybe";
- mes "you're already comfortable?";
- close;
-
-L_rumors:
- mes "[Merpi]";
- mes "Well, things have";
- mes "been pretty peaceful";
- mes "for the past few years.";
- mes "The only rumor floating";
- mes "around is about some";
- mes "weird axe murderer...";
- close;
-
-L_laundry:
- mes "[Merpi]";
- mes "Oh, that's wonderful!";
- mes "I so love doing hand";
- mes "laundry, though I'm not";
- mes "quite sure why. Oh well~";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,297,239,3 script Pilia 818,{
-
- mes "[Pilia]";
- mes "Hmm? Oh, I'm sorry,";
- mes "but my little brother";
- mes "just won't stop crying.";
- mes "I'm sorry if we're loud...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,296,239,3 script Berru 706,{
-
- mes "[Berru]";
- mes "Daddy...! Waaaaah~!";
- mes "I wanna see my daddy!";
- emotion e_sob;
- next;
- mes "[Pilia]";
- mes "Berru, I don't";
- mes "think Daddy's coming";
- mes "home tonight. Come on,";
- mes "we should go to bed.";
- next;
- mes "[Berru]";
- mes "No, I'm not gonna";
- mes "sleep 'til Daddy gets";
- mes "home! He said he'll";
- mes "bring us candy tonight!";
- mes "You go sleep first, Pilia!";
- emotion e_ag;
- next;
- mes "[Pilia]";
- mes "*Sigh...*";
- mes "Where's out Daddy?";
- mes "He said he found a";
- mes "good job, but we haven't";
- mes "heard from him since then...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,312,234,2 script Beggar 777,{
-
- mes "[Beggar]";
- mes "Please...";
- mes "My child is starving...";
- mes "Would you give me";
- mes "some money?";
- next;
- if(select("Give him some money.:Ignore him.")==2){
- mes "[" + strcharinfo(0) + "]";
- mes "...";
- mes "......";
- close;
- }
- if(Zeny < 50){
- mes "[Beggar]";
- mes "You don't seem to have";
- mes "enough zeny.";
- close;
- }
- set Zeny,Zeny-50;
- mes "[" + strcharinfo(0) + "]";
- mes "Here you go,";
- mes "take this.";
- next;
- mes "[Beggar]";
- mes "Thank you so much.";
- mes "I have nothing to offer you";
- mes "in exchange, but I can share";
- mes "a story with you and impart";
- mes "some of the wisdom I've";
- mes "learned over the years.";
- emotion e_thx;
- next;
- mes "[Beggar]";
- mes "Anger. People deal with";
- mes "it in different ways. Some";
- mes "suppress it. Some relish it.";
- mes "Some fear being angry. Now,";
- mes "to be simple, let's say there";
- mes "are two kinds of anger.";
- next;
- mes "[Beggar]";
- mes "The first is the kind that";
- mes "isn't so productive. More of";
- mes "a frustration that you can let";
- mes "go. Someone cut you off on the";
- mes "freeway or a friend innocently";
- mes "forgot your birthday? No Biggie.";
- next;
- mes "[Beggar]";
- mes "Don't let this kind of";
- mes "anger get to you or you'll";
- mes "look like a looser. Think of";
- mes "the big picture and if you're";
- mes "still upset, vent appropriatly.";
- mes "Be honest without hurting anyone.";
- next;
- mes "[Beggar]";
- mes "The second kind of anger is";
- mes "righteous anger. You've been";
- mes "wronged and need some form";
- mes "of retribution. Remember to";
- mes "make appropriate confontrations";
- mes "and don't misdirect your rage.";
- next;
- mes "[Beggar]";
- mes "Getting into a fight with";
- mes "righteous anger, say to protect";
- mes "someone dear to you, will make";
- mes "you a hero. Fighting with anger";
- mes "born of frustration will make you";
- mes "a bully. Know the difference.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes ". . . . . . . . . . . .";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes ". . . . . . . . . . . .";
- mes ". . . . . . . . . . . .";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes ". . . . . . . . . . . .";
- mes ". . . . . . . . . . . .";
- mes ". . . . . . . . . . . .";
- next;
- mes "[Beggar]";
- mes "What's wrong?";
- mes "It might be a lot";
- mes "to take in, I know.";
- close;
-
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,311,194,3 script Reuben 870,{
-
- mes "[Reuben]";
- mes "Someday...";
- mes "Someday I just gotta";
- mes "become a train conductor";
- mes "and just get outta here.!";
- mes "I really hate this place!";
- next;
- mes "[Reuben]";
- mes "Wh-whoa...!";
- mes "Did you just hear";
- mes "me talk to myself?";
- mes "Crud! Don't be so nosy!";
- emotion e_an;
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,306,324,3 script Shengwen 870,{
-
- mes "[Shengwen]";
- mes "Am I just getting";
- mes "paranoid? I really";
- mes "think that some of";
- mes "the people I know";
- mes "are dissapearing";
- mes "for no good reason!";
- next;
- mes "[Shengwen]";
- mes "I mean, all of my close";
- mes "friend are all right,";
- mes "but I'm starting not to see";
- mes "certain acquaintances and";
- mes "familiar faces. Maybe I'm";
- mes "just thinking too much...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,26,167,4 script Shayna 850,{
-
- mes "[Shayna]";
- mes "*Sigh...*";
- mes "Oh, you poor";
- mes "darling girl...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,134,45,2 script Cenku Dekdam#Cenku_Dekdam 869,{
-
- mes "[Cenku Dekdam]";
- mes "Man, if you were";
- mes "gonna take this whole";
- mes "city and sell it, what";
- mes "do you think Lighthalzen's";
- mes "price tag would be, eh?";
- next;
- mes "[Cenku Dekdam]";
- mes "I mean, this city";
- mes "is basically just made";
- mes "of money. Money is what";
- mes "makes this city such a nice";
- mes "and pleasant place to live.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,330,276,3 script Nun 79,{
-
- mes "[Angela]";
- mes "Greetings, adventurer.";
- mes "I'm Angela, a social";
- mes "worker for the Poor";
- mes "Relief Organization.";
- next;
- mes "[Angela]";
- mes "I've noticed that the";
- mes "people living here have";
- mes "extremely bad health and";
- mes "it's not just because of";
- mes "their circumstances.";
- next;
- mes "[Angela]";
- mes "I've filed a report";
- mes "to my superiors, but";
- mes "they haven't sent me";
- mes "a response yet for some";
- mes "reason. I'm starting to get";
- mes "a little worried about this...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,337,296,3 script Employee 867,{
-
- mes "[Rekenber Employee]";
- mes "Greetings. As part of our";
- mes "effort to relieve the poor,";
- mes "Rekenber is providing job";
- mes "opportunities targeted for";
- mes "citizens of the slum areas.";
- next;
- mes "[Rekenber Employee]";
- mes "You can choose to work";
- mes "from home, or undergo a";
- mes "little bit of training for more";
- mes "professional positions. This";
- mes "is a great chance to make a";
- mes "difference... and some money~";
- emotion e_no1;
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,134,38,2 script Bankri Kun#Bankri_Kun 86,{
-
- mes "[Bankri Kun]";
- mes "Must work...";
- mes "Must focus...";
- mes "Resist sleepiness...";
- mes "Why do I keep coming";
- mes "here? ugh, h-horrible.";
- next;
- mes "[Bankri Kun]";
- mes "hey youngster. You wanted";
- mes "adventuring advice? Okay.";
- mes "Um. Hm. Always. Brush.";
- mes "Your teeth. Brush them";
- mes "everyday. Oh, and don't";
- mes "forget to floss, either.";
- next;
- mes "[Bankri Kun]";
- mes "Now it's time for me";
- mes "to head back to work.";
- mes "I'll see you later, kid.";
- mes "Sorry my advice was so";
- mes "lame-- I couldn't think of";
- mes "anything else to tell you.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,139,40,2 script Enoz 53,{
-
- mes "[Enoz]";
- mes "So, the novel I ordered from";
- mes "the Rune-Midgarts Kingdom";
- mes "just recently arrived. It's real";
- mes "good, by the guy who wrote";
- mes "\"Roda Frog Adventure\"";
- mes "years ago. Remember?";
- next;
- mes "[Enoz]";
- mes "Anyway, this new book,";
- mes "\"Where the Red Plant Grows\"";
- mes "is up for the Yggdrasilberry";
- mes "Award. I... I don't know why";
- mes "I was compelled to share that";
- mes "with you. Seriously, I don't...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,124,28,2 script Ellette 66,{
-
- mes "[Ellette]";
- mes "...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Excuse me.";
- next;
- mes "[Ellette]";
- mes "...";
- mes "......";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Hello?";
- next;
- mes "[Ellette]";
- mes "...Oh! Everyone!";
- mes "I just completed";
- mes "another one! Hooray!";
- next;
- mes "[All other Employees]";
- mes "Wh-what?!";
- mes "No way, not again!";
- next;
- mes "[Leekal]";
- mes "Are you even human?";
- mes "You must have some";
- mes "secret for that much";
- mes "productivity. It's weird...";
- next;
- mes "[Ellette]";
- mes "Oh, come on.";
- mes "Maybe I'm a little";
- mes "good at this, but there's";
- mes "no way I can beat Cenku.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,125,40,2 script Dowbow Ryuei#Dowbow_Ryuei 843,{
-
- mes "[Dowbow Ryuei]";
- mes "Just out of, oh I dunno,";
- mes "curiosity, which word do";
- mes "you like better?\"Uber-Cool\"";
- mes "or \"Reality?\" Pick one~";
- next;
- menu "Uber-Cool",-,"Reality",L_reality;
- mes "[Dowbow Ryuei]";
- mes "Oh yeah? Me too!";
- mes "Yeah, we got the same";
- mes "outlook on life. If you don't";
- mes "mind, I'd like to shake";
- mes "your hand, adventurer.";
- emotion e_no1;
- close;
-
-L_reality:
- mes "[Dowbow Ryuei]";
- mes "Reality, eh?";
- mes "Well, I agree that";
- mes "being realistic has its";
- mes "perks, I'm more of a dreamer.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,125,46,2 script Leekal 849,{
-
- mes "[Leekal]";
- mes "So... Very broke.";
- mes "Why did I spend so much";
- mes "money on wine, women and";
- mes "song? I regret it all, all the";
- mes "pleasure I've had this month.";
- mes "Yes, it was too much pleasure.";
- next;
- mes "[Ninjose]";
- mes "That's what happens";
- mes "when you're irresponsible";
- mes "with your money. You really";
- mes "should read this \"Anybody";
- mes "Can Be Rich\" book.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,116,53,6 script Ninjose 841,{
-
- mes "[Ninjose]";
- mes "At long last, I've finally";
- mes "bought my own home. You";
- mes "should invest your money for";
- mes "your future too! Read this,";
- mes "\"Anybody Can Be Rich!\"";
- mes "It's such a great book.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,116,39,6 script Kejulle Rekenber#Kejulle_Rekenber 822,{
-
- mes "[Kejulle Rekenber]";
- mes "Hm? Sure, my last name";
- mes "is Rekenber and that's the";
- mes "same name as our chairman,";
- mes "but that's just a coincidence.";
- mes "I'm merely a normal employee.";
- mes "Yeah, no special treatment...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-lhz_in01.gat,110,40,2 script Jorjerro 89,{
-
- mes "^0000AAThis man here";
- mes "is motionless,";
- mes "and for all intents";
- mes "and purposes, is";
- mes "soundly asleep.^000000";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,116,45,6 script Joshua 704,{
-
- mes "[Joshua]";
- mes "What am I doing here?";
- mes "Waiting for my dream";
- mes "woman to fall into my lap,";
- mes "what else does it look like?";
- next;
- mes "[Joshua]";
- mes "Tall, blond, creamy";
- mes "complexion and smooth";
- mes "skin. That's right. Come";
- mes "right to Joshua, babes.";
- mes "I got my pheremone spray";
- mes "on and I'm ready to cruise~";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,93,45,4 script Researcher#02 865,{
-
- mes "[Researcher]";
- mes "You know what's weird?";
- mes "Why do they use blue and";
- mes "red wires when they make";
- mes "bombs? There's so many";
- mes "others you could use, like";
- mes "pink or yellow or or green...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,286,226,2 script Secretary Slierre#Secretary_Slierre 831,{
-
- mes "[Sueii Slierre]";
- mes "Excuse me, but you are";
- mes "not allowed to be in here.";
- mes "Please visit the Help Desk";
- mes "if you have any questions about";
- mes "the Rekenber Corporation.";
- mes "Thank you for cooperating.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,32,162,2 script Crippled Girl#Crippled_Girl 53,{
-
- mes "[Crippled Girl]";
- mes "...";
- mes "......";
- mes "*Sigh...*";
- next;
- menu "Hello, how are you?",-;
- mes "[Crippled Girl]";
- mes "Oh, I'm fine,";
- mes "thanks for asking.";
- mes "I'm just waiting for";
- mes "somebody, that's all.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,346,263,2 script Elder 846,{
-
- mes "[Elder]";
- mes "Predators are always";
- mes "on the lookout for easy";
- mes "prey. Be careful, youngster!";
- mes "You look innocent enough";
- mes "to become a victim in the city.";
- next;
- menu "About Lighthalzen",L_lighthalzen,"About the Slum",L_slum,"????",-;
- mes "[Elder]";
- mes "Well, if you need any";
- mes "help around here or have";
- mes "any questions, come back";
- mes "and ask me. I get the feeling";
- mes "that we'll probably meet again.";
- close;
-
-L_lighthalzen:
- mes "[Elder]";
- mes "Lighthalzen might seem";
- mes "like a splendid city at first,";
- mes "but you'll learn quickly that";
- mes "the poor are segregated from";
- mes "the rich and treated as less";
- mes "than second class citizens.";
- next;
- mes "[Elder]";
- mes "At first, separation between";
- mes "the rich and poor districts was";
- mes "subtly enforced. They built the";
- mes "railroad right between the two";
- mes "districts to make it easier for";
- mes "the rich to ignore the poor.";
- next;
- mes "[Elder]";
- mes "But now they even have";
- mes "guards to make sure that";
- mes "the poor can't bother the";
- mes "rich. I'm pretty sure that";
- mes "this segregation won't be";
- mes "ending anytime soon...";
- next;
- mes "[Elder]";
- mes "Now, I've heard that the";
- mes "Rekenber Corporation is";
- mes "actually providing jobs for";
- mes "people in the slums. Beggars";
- mes "can't be choosers, so I'm sure";
- mes "these jobs aren't that great.";
- close;
-
-L_slum:
- mes "[Elder]";
- mes "To live in the slum is to";
- mes "be familiar with poverty,";
- mes "disease, condemnation";
- mes "and contempt. But we're all";
- mes "still people, you know, so let";
- mes "go of any of your misgivings.";
- next;
- mes "[Elder]";
- mes "We're struggling just";
- mes "to survive here. At the";
- mes "very least, please respect";
- mes "that. It's a fact that the";
- mes "people in the rich district";
- mes "seem to keep forgetting.";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lighthalzen.gat,326,249,5 script Grinnel 870,{
-
- mes "[Grinnel]";
- mes "You know the men in";
- mes "black suits? Boy, did";
- mes "I get a scare! They actually";
- mes "tracked me down to ask me";
- mes "all these weird questions!";
- next;
- mes "[Grinnel]";
- mes "They kept wanting to";
- mes "know if I had ever met";
- mes "anyone from the Rekenber";
- mes "Corporation, if I've ever been";
- mes "Uptown, that sort of thing. They";
- mes "really scared the crap out of me.";
- next;
- mes "[Grinnel]";
- mes "Man, living in the";
- mes "slums is such a drag.";
- mes "Not only is life rough,";
- mes "but all sorts of people";
- mes "think they can push you";
- mes "around. I hate Lighthalzen...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,192,19,2 script Haggar 855,{
-
- mes "[Haggar]";
- mes "Whiskey!";
- mes "I need me some";
- mes "hard liquor now!";
- next;
- mes "[Haggar]";
- mes "Wha--? I didn't";
- mes "order this stinkin'";
- mes "rum! I want a man's";
- mes "drink! Gimme whisky!";
- Close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,193,25,2 script Bartender#01 61,{
-
- mes "[Tony]";
- mes "Hey man, I know this";
- mes "joint is a dive, pretty much";
- mes "on the verge of bein' totally";
- mes "ghetto, but we're proud to";
- mes "have the best rum in all of";
- mes "Rune-Midgard. It's true~";
- next;
- mes "[Tony]";
- mes "Just a sip of this";
- mes "beautiful drink and";
- mes "you're on top of the";
- mes "world! But it's best";
- mes "for helpin' yah relax";
- mes "and forget your worries.";
- next;
- mes "[Tony]";
- mes "I don't take to bein'";
- mes "a poet, but I do know";
- mes "this. Our rum has the";
- mes "sweet sweet flavor of";
- mes "loneliness. You really";
- mes "oughta try it when you can .";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,185,20,6 script Bad Drunk#Bad_Drunk 869,{
-
- mes "[Garry]";
- mes "Hey! Hey you...!";
- mes "D'you wanna, you";
- mes "wanna hear me tell";
- mes "you a joke?! It goes...";
- mes "Um, it goes like this...";
- next;
- mes "[Garry]";
- mes "Hey riddle middle,";
- mes "the cat and th--";
- mes "No! No, damn it!";
- mes "That's a song!";
- mes "No, wait, that's";
- mes "not a song either...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,186,29,6 script Bad Drunk#Bad_Drunk2 869,{
-
- mes "[Bonse]";
- mes "*Hiccup* I loooove";
- mes "this rum! I caught a cold";
- mes "once and one glass made";
- mes "it go away! 'Course, I slept";
- mes "for a week too, but that doesn't";
- mes "matter! Pshaw! Science...";
- next;
- mes "[Bonse]";
- mes "Oh, the flavor is just";
- mes "so clean, but it's also";
- mes "got a bit of a kick. I don't";
- mes "know how to describe it.";
- mes "Its the taste of happiness?";
- mes "I'm too drunk to even tell!";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,192,93,2 script City Girl#City_Girl 862,{
-
- mes "[Lanko]";
- mes "Oh, I'm only here";
- mes "working as a waitress";
- mes "to help my father.";
- mes "This job is so tiring, but";
- mes "it's nice to see people so";
- mes "relaxed and having a good time.";
- next;
- mes "[Lanko]";
- mes "When I get some time";
- mes "off, I'm going to explore";
- mes "Lighthalzen and see all that";
- mes "there is to see. But for now,";
- mes "it doesn't look like we've got";
- mes "any real shortage of drunks...";
- close;
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,189,87,4 script Drunken Man#04 869,{
-
- mes "[Enku]";
- mes "*Sob* I just got";
- mes "dumped! Yeah, I thought";
- mes "we were gonna get married,";
- mes "but obviously I was wrong!";
- mes "Damn it Sheryline! I loved you!";
- next;
- mes "[Enku]";
- mes "I usually don't care for";
- mes "drinking, especiallys stuff";
- mes "like gin or rum, but today,";
- mes "this stuff tastes just like";
- mes "my misery. This is all the";
- mes "comfort I need, you hear?!";
- close;
-
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,183,82,6 script Drunken Man#05 870,{
-
- mes "[Linus]";
- mes "After ten years";
- mes "of marriage. My";
- mes "wife divorced me...";
- next;
- mes "[Linus]";
- mes "So I guess there's no";
- mes "place for me but here for";
- mes "now. I don't know what it is,";
- mes "but the rum is really good";
- mes "today. Like, it's the flavor";
- mes "of relaxing, joyous relief~";
- close;
-
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,180,83,6 script Citizen#02 86,{
-
- mes "[Mitchell]";
- mes "You know, everyone";
- mes "is different, but I think";
- mes "humans are similar enough";
- mes "that we can all meaningfully";
- mes "connect on some level, right?";
- next;
- mes "[Mitchell]";
- mes "Sure, a rich person might";
- mes "have different problem than";
- mes "a poor person, but the point";
- mes "is, they've both got problems!";
- mes "Pain, pleasure, sadness, joy.";
- mes "Those link us all together.";
- next;
- mes "[Mitchell]";
- mes "So try not to be picky";
- mes "about who's your pal and";
- mes "who's not. We all need";
- mes "somebody to be with, right?";
- close;
-
-}
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,176,85,4 script Citizen#Citizen2 869,{
-
- mes "[Dique]";
- mes "One of the things I look";
- mes "forward to during my day";
- mes "is the drink I enjoy right";
- mes "after work. It's the most";
- mes "relaxing thing in the world.";
- next;
- mes "[Dique]";
- mes "Of course, there's";
- mes "more to life than just";
- mes "hanging out in pubs and";
- mes "bars. The thing is, in my";
- mes "case, pubs and bars are";
- mes "all I happen to need~";
- close;
-
-}
-
-
-// ---------------------------------------------------------------------------
-
-lhz_in03.gat,184,38,2 script Loudmouth 55,{
-
- mes "[Loudmouth]";
- mes "Do you know who I am?!";
- mes "Just look at this peg leg.";
- mes "I was in the Comodo War,";
- mes "Ski Troop division! I lost my";
- mes "leg to earn your freedom!";
- next;
- mes "[Loudmouth]";
- mes "H-hey! What's that";
- mes "look for? What, you";
- mes "don't believe me?!";
- close;
-
-}
-// ---------------------------------------------------------------------------
-
-lhz_in01.gat,114,181,3 script Representative::LhzRep 71,{
-
- mes "[Representative]";
- mes "Greetings, and welcome";
- mes "to the Rekenber Corporation.";
- mes "How may I be of service today?";
- next;
- menu "Building Information.",-;
-
-loopback:
- mes "[Representative]";
- mes "Please tell me";
- mes "which floor you'd like";
- mes "to know more about.";
- next;
- menu "1F",s_1,"2F",s_2,"B1",s_B,"Cancel",-;
-
- mes "[Representative]";
- mes "We are always doing our";
- mes "best to provide the best";
- mes "services to our customers.";
- mes "Remember that Rekenber";
- mes "is the name you can trust.";
- mes "Thank you and have a nice day.";
- close;
-
-s_1:
- mes "[Representative]";
- mes "The ^3131FFRekenber Library^000000 can";
- mes "be found at the end of the";
- mes "left hallway. Our library is";
- mes "a great resource of innovative";
- mes "ideas and information for our";
- mes "system development employees.";
- next;
- mes "[Representative]";
- mes "The ^3131FFBall Room^000000, where";
- mes "various official events are";
- mes "usually held, can be accessed";
- mes "through the right hallway.";
- next;
- goto loopback;
-
-s_2:
- mes "[Representative]";
- mes "Please use the stairs";
- mes "located on both sides of";
- mes "the Help Desk to go to the";
- mes "Second Floor. The Second";
- mes "Floor is mostly used for";
- mes "administrative purposes.";
- next;
- mes "[Representative]";
- mes "There, you can find";
- mes "the ^3131FFConference Room^000000,";
- mes "^3131FFSecretary Office^000000, the";
- mes "^3131FFAuditorium^000000 and the";
- mes "^3131FFChairman's Office^000000.";
- next;
- goto loopback;
-s_B:
- mes "[Representative]";
- mes "The first underground floor";
- mes "is used by the ^3131FFRegenshirm^000000,";
- mes "our laboratory affiliate. For";
- mes "security reasons, this floor";
- mes "is not accessible to visitors";
- next;
- goto loopback;
-
-}
-
-lhz_in01.gat,26,247,2 duplicate(LhzRep) Representative 71
-
-lhz_in01.gat,173,28,4 script Guard#01::LhzRekGuard 868,{
-
- mes "[Guard]";
- mes "This is a";
- mes "restricted area.";
- mes "Please keep clear";
- mes "if you do not have";
- mes "special authorization.";
- mes "Thank you for your cooperating.";
- close;
-
-}
-
-lhz_in01.gat,180,28,4 duplicate(LhzRekGuard) Guard#03 868
-
-lhz_in01.gat,72,209,4 script Guide#01 862,{
-
- mes "[Lasoei]";
- mes "Oh phooey.";
- mes "The same customers";
- mes "are always coming in,";
- mes "day after day. Can it";
- mes "get any less exciting?";
- next;
- mes "[Lasoei]";
- mes "Oh...!";
- mes "W-welcome~";
- mes "C-can I help you";
- mes "with anything?";
- close;
-
-}
-
-lhz_in01.gat,72,195,8 script Guide#02 90,{
-
- mes "[Geonuii]";
- mes "Greetings. This path";
- mes "leads to the Library and";
- mes "the Laboratory. Please be";
- mes "aware that these places";
- mes "are restricted from access";
- mes "by the general public.";
- close;
-
-}
-
-lhz_in01.gat,73,188,4 script Guide#03 862,{
-
- mes "[Bonnie]";
- mes "Oh no...";
- mes "Where did I put it?";
- close;
-
-}
-
-lhz_in01.gat,34,226,4 script Rekenber Guard#01 867,{
-
- if(isequipped(2241) && isequipped(2243)) goto s_Staff;
- mes "[Rekenber Guard]";
- mes "This is a restricted";
- mes "area! Please show";
- mes "some ID immediately!";
- next;
- menu "ID?",s_ID,"Cancel",-;
-
- mes "[Rekenber Guard]";
- mes "Unless you have special";
- mes "authorization, nobody is";
- mes "allowed into the Underground";
- mes "Laboratory for security reasons.";
- close;
-
-s_ID:
- mes "[Rekenber Guard]";
- mes "I don't know how you";
- mes "adventurers do things in";
- mes "Rune-Midgard, but over here";
- mes "we have laws about trespassing!";
- close;
-
-s_Staff:
- mes "[Rekenber Guard]";
- mes "^3131FF(Whoa, it's a member";
- mes "of the staff)^000000 Good day!";
- close2;
- warp "lhz_in01.gat",37,225;
- end;
-
-}
-
-lhz_in01.gat,19,129,0 script LhzHiddenTrg1::LhzTrig -1,1,1{
-OnTouch:
- mes "[Rekenber Guard]";
- if(isequipped(2241) && isequipped(2243)){
- mes "Keep your eyes open.";
- mes "I've heard rumors that some";
- mes "adventurers from Rune-Midgard";
- mes "are trying to sneak into here!";
- mes "I know the security here is";
- mes "pretty much failsafe, but...";
- close;
- }
- mes "This area is restricted";
- mes "to the public! Who are you";
- mes "and how did you get in here?!";
- mes "Hey, I need backup right away!";
- close2;
- warp "lhz_in01.gat",34,224;
- end;
-
-}
-
-lhz_in01.gat,23,137,0 duplicate(LhzTrig) LhzHiddenTrg2 139,1,1
-
-lhz_in01.gat,24,131,2 duplicate(LhzTrig) Rekenber Guard#02 867
-
-lhz_in01.gat,25,141,4 script Regenschirm Guard 868,{
-
- mes "[Regenschirm Guard]";
- if(isequipped(2241) && isequipped(2243)){
- mes "Do you wish to";
- mes "go underground?";
- next;
- if(select("Yes:No")==1){
- if(isequipped(2657)){
- warp "lhz_dun01.gat",150,288;
- end;
- }
- mes "[Regenschirm Guard]";
- mes "I'm sorry but I can't let";
- mes "staff without proper autorization";
- mes "pass. Only staff members with";
- mes "Laboratory Passports are allowed";
- mes "to enter the underground.";
- close;
-
- }
- mes "[Regenschirm Guard]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
- }
- mes "This area is restricted";
- mes "to the public! Who are you";
- mes "and how did you get in here?!";
- mes "Hey, I need backup right away!";
- close2;
- warp "lhz_in01.gat",34,224;
- end;
-
-}
+//===== eAthena Script =======================================
+//= Lighthalzen City
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 1.0b
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Lighthalzen NPCs (Temporal names for now) [erKURITA]
+//===== Additional Comments: ==================================
+//= 0.1 Placed temporal names, why there weren't on the SVN before? [erKURITA]
+//= 0.2 Implemented some crap NPCs [MasterOfMuppets]
+//= 0.3 Another load of NPCs. Scripted by Kargha [MasterOfMuppets]
+//= 0.4 More Town NPCs. [Musashiden]
+//= 0.5 Added a BIG load of Lighthalzen NPCs. [musashiden]
+//= 0.6 Fixed some typos+Coordinates. [Musashiden]
+//= 0.7 Implemented some more crap NPCs and the second entrance to biolabs [MasterOfMuppets]
+//= 0.8 Removed Duplicates [Silent]
+//= 0.9 Removed Duplicates [Toms]
+//= 1.0 Added a missing feature to the donation NPC [MasterOfMuppets]
+//= 1.0a added constants to emotions, minor optimization [Lupus]
+//= 1.0b npcid fix [KarLaeda]
+//=============================================================
+
+lighthalzen.gat,198,285,5 script Jiwon 862,{
+
+ mes "[Jiwon]";
+ mes "I think we're really";
+ mes "fortunate to be able to";
+ mes "live in such a beautiful";
+ mes "and peaceful city like this.";
+ next;
+ mes "[Jiwon]";
+ mes "It's just so nice to";
+ mes "have this pleasant weather,";
+ mes "these lush gardens and to";
+ mes "meet all of these kind people.";
+ mes "Lighthalzen is like Asgard";
+ mes "in Midgard, heaven on earth~";
+ close;
+}
+
+
+lighthalzen.gat,220,244,3 script Samnang 863,{
+
+ mes "[Samnang]";
+ mes "*Sigh...*";
+ mes "It gets harder for me";
+ mes "to move around as I get";
+ mes "older. That's understandable";
+ mes "for an elderly person, right?";
+ next;
+ mes "[Samnang]";
+ mes "Just the other day, these";
+ mes "hoodlums in black suits";
+ mes "were yelling at me to get out";
+ mes "of their way. But of course,";
+ mes "I didn't move quickly enough.";
+ mes "So what did they do to me?";
+ next;
+ mes "[Samnang]";
+ mes "They punched me.";
+ mes "Right in the womb!";
+ mes "I know that i'm not";
+ mes "pregnant, but that's";
+ mes "besides the point. Never hit";
+ mes "a lady, especially an old one!";
+ close;
+}
+
+
+lighthalzen.gat,261,112,3 script Ruth 862,{
+
+ mes "[Ruth]";
+ mes "Sweety, isn't it";
+ mes "nice to be together";
+ mes "under this beautiful";
+ mes "sunlight? It's perfect";
+ mes "for our date. Ahhhh~";
+ next;
+ mes "[Ruth]";
+ mes "I'm so happy to be";
+ mes "with you. I feel like";
+ mes "I'm just melting with";
+ mes "happiness. Ohm I love";
+ mes "you so much, Oyoung.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Whoa...";
+ mes "This couple is";
+ mes "really headed for";
+ mes "Cloud 9, aren't they?";
+ close;
+}
+
+
+lighthalzen.gat,259,108,7 script Oyoung 869,{
+
+ mes "[Oyoung]";
+ mes "Girl, you look like";
+ mes "you're comin' down with";
+ mes "the love bug. But there's";
+ mes "only one prescription for";
+ mes "this ailment, ooooh yeah...";
+ next;
+ mes "[Oyoung]";
+ mes "You need yo'self";
+ mes "your daily dose of";
+ mes "vitamin O-YOUNG.";
+ mes "And your lips look like";
+ mes "they got vitamin deficiency.";
+ mes "i better take care of that~";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Sweet Sister!";
+ mes "I don't know what's";
+ mes "more mind boggling--";
+ mes "The fact that he used";
+ mes "that line or the fact that";
+ mes "it's actually working...";
+ close;
+}
+
+lighthalzen.gat,233,121,4 script Kariya 72,{
+
+ mes "[Kariya]";
+ mes "I think \"Lighthalzen\" is";
+ mes "supposed to mean \"crest of";
+ mes "light\", though i hear that this";
+ mes "city was actually named after";
+ mes "somebody. Who knows for sure?";
+ next;
+ mes "[Kariya]";
+ mes "Still, It's a fitting";
+ mes "name for the wealthiest";
+ mes "and most luxurious city in";
+ mes "all the Schwaltzvalt Republic.";
+ mes "So how do you like this place?";
+ close;
+}
+
+
+lighthalzen.gat,233,82,4 script Sung 716,{
+
+ mes "[Sung]";
+ mes "When i grow up, I want";
+ mes "to become such a great";
+ mes "person that they'll make";
+ mes "a statue of me, just like";
+ mes "those statues over there.";
+ next;
+ mes "[Sung]";
+ mes "Then people would be like,";
+ mes "\"Hey yo. That statue. That";
+ mes "guy must have been great!\"";
+ mes "Just thinking about that";
+ mes "makes me feel so good!";
+ next;
+ mes "[Sung]";
+ mes "That's it. I'm gonna";
+ mes "grow up as soon as i can.";
+ mes "Ooh, and i better grow tall";
+ mes "and handsome so my statue";
+ mes "will be even more awesome.";
+ mes "Yeah. Yeah, good idea, Sung...";
+ close;
+}
+
+
+lighthalzen.gat,89,73,4 script Sameer 854,{
+
+ mes "[Sameer]";
+ mes "There are too many";
+ mes "loving couples in this city.";
+ mes "Cuddling and kissing and";
+ mes "hugging and necking. It's...";
+ mes "It's utterly distasteful.";
+ next;
+ mes "[Sameer]";
+ mes "I can't believe the";
+ mes "indencenct I see everyday";
+ mes "near my own home. Don't";
+ mes "they know better than to be";
+ mes "so affectionate in places";
+ mes "where the public can see them?!";
+ next;
+ mes "[Sameer]";
+ mes "Fortunately for the";
+ mes "world, i'm a bulwark";
+ mes "of morality. In fact, I have";
+ mes "no need for a woman. All";
+ mes "I need are my ship models,";
+ mes "teen novels and dominos.";
+ next;
+ mes "[Sameer]";
+ mes "I'm a completely well";
+ mes "adjusted individual, which";
+ mes "is why the authorities should";
+ mes "listen to me when i tell them";
+ mes "to arrest couples for indecency!";
+ mes "Hand holding. Have they no shame!?";
+ close;
+}
+
+
+
+lighthalzen.gat,45,59,8 script Janice 863,{
+
+ mes "[Janice]";
+ mes "Oh no, I think i got";
+ mes "lost again. The roads";
+ mes "here are so confusing!";
+ mes "I've lived here for such";
+ mes "a long time and I still";
+ mes "can't find my way around...";
+ close;
+}
+
+
+lighthalzen.gat,66,94,5 script Elmer Keays 866,{
+
+ mes "[Elmer Keays]";
+ mes "Walking side by side";
+ mes "with you like this reminds";
+ mes "me of the old days. Back";
+ mes "then, everyone was jealous";
+ mes "that i had such a beautiful";
+ mes "woman by my side. Heh heh~";
+ next;
+ mes "[Elmer Keays]";
+ mes "You're still the most";
+ mes "precious sight to these";
+ mes "old eyes, my dear. I'm";
+ mes "really lucky to be with you.";
+ close;
+}
+
+lighthalzen.gat,65,94,4 script Margie Keays 863,{
+
+ mes "[Margie Keays]";
+ mes "Oh darling, the";
+ mes "weather is so nice";
+ mes "and pleasant today.";
+ mes "I'm really glad we";
+ mes "decided to go take";
+ mes "a walk together~";
+ close;
+}
+
+lighthalzen.gat,78,120,3 script Maivi 862,{
+
+ mes "[Maivi]";
+ mes "...";
+ next;
+ mes "[Maivi]";
+ mes "...";
+ mes ".....";
+ next;
+ mes "[Maivi]";
+ mes "Ah...";
+ mes "I just had the nicest";
+ mes "nap, This nice weather";
+ mes "never fails to relax me.";
+ mes "The air here is so clean,";
+ mes "not like that Einbroch~";
+ next;
+ mes "[Maivi]";
+ mes "This clean, pristine";
+ mes "environment is all thanks";
+ mes "to the Rekenber Corporation.";
+ mes "It's incredible what they can";
+ mes "do with technology now, isn't";
+ mes "it? Ahhh, it's so peaceful~";
+ close;
+}
+
+
+lighthalzen.gat,226,210,3 script Nannan 86,{
+
+ mes "[Nannan]";
+ mes "You know, I always thought";
+ mes "that all Alchemists were bookish,";
+ mes "scholarly types, their faces always";
+ mes "buried in books and studying. But";
+ mes "I managed to find one who doesn't";
+ mes "fit that nerdy stereotype at all.";
+ next;
+ mes "[Nannan]";
+ mes "This guy, What's-his-face,";
+ mes "Broncher, is always wasting";
+ mes "his time drinking. I guess he";
+ mes "discovered the secret of turning";
+ mes "water into Grade A booze. But";
+ mes "at least he's not the stuffy type.";
+ next;
+ mes "[Nannan]";
+ mes "I don't know how much";
+ mes "help he'd be to an aspiring";
+ mes "Alchemist, but in my opinion,";
+ mes "the man is a fully fledged";
+ mes "genius! At least, compared";
+ mes "to a street guy like me...";
+ close;
+}
+
+lighthalzen.gat,230,182,4 script Klaubis 866,{
+
+ mes "[Klaubis]";
+ mes "Excuse me, but are you";
+ mes "a tourist? Well, welcome";
+ mes "to Lighthalzen! This city";
+ mes "has everything we need,";
+ mes "but it can be a little too";
+ mes "quiet and uneventful here.";
+ next;
+ menu "Have you lived in here long?",live,"I agree.",agree,"Have you heard about the serial killer?",killer;
+
+
+live:
+ mes "[Klaubis]";
+ mes "Yes, our family has";
+ mes "lived in this city for a";
+ mes "long time, starting with";
+ mes "my great grandfather. Let's";
+ mes "see, my family's been here";
+ mes "for about two hundred years.";
+ next;
+ mes "[Klaubis]";
+ mes "You'd be surprised how";
+ mes "many people stay in their";
+ mes "hometowns. Even if you do";
+ mes "leave, though, you can always";
+ mes "come back. It wouldn't be your";
+ mes "hometown if you couldn't, right?";
+ close;
+
+agree:
+ mes "[Klaubis]";
+ mes "Yes, the atmosphere";
+ mes "can get pretty listless";
+ mes "around here. But still,";
+ mes "there are plenty of nice";
+ mes "sights to enjoy here in";
+ mes "Lighthalzen, so look around~";
+ close;
+
+killer:
+ mes "[Klaubis]";
+ mes "You mean the Serial";
+ mes "Axe Murderer? I thought";
+ mes "that was an old ghost story.";
+ mes "Hm. I think that lady inside";
+ mes "the Weapon Shop would";
+ mes "know more about that tale...";
+ close;
+
+}
+
+
+lighthalzen.gat,232,156,4 script Sigmund 866,{
+
+ mes "[Sigmund Ting]";
+ mes "You know what i noticed?";
+ mes "The guards at the border";
+ mes "to the slum seem distracted";
+ mes "sometimes. I made use of one";
+ mes "of their less attentive moments";
+ mes "and basically jumped the fence!";
+ next;
+ mes "[Sigmund Ting]";
+ mes "But once i was in the";
+ mes "Slums, I was pretty bored.";
+ mes "There really isn't much to";
+ mes "do there. Which makes me";
+ mes "Wonder... Why guard it?";
+ close;
+
+}
+
+lighthalzen.gat,190,134,5 script Joyce 862,{
+
+ mes "[Joyce]";
+ mes "I can sense your";
+ mes "longing look within";
+ mes "the depths of my heart,";
+ mes "beating faster and faster";
+ mes "with a feverish passion~";
+ close;
+
+}
+
+
+lighthalzen.gat,191,134,5 script Dan Song 869,{
+
+ mes "[Dan Song]";
+ mes "Those eyes of yours...";
+ mes "So pure and so deep,";
+ mes "like glimmering pools";
+ mes "of light. So, so beautiful...";
+ close;
+
+}
+
+
+
+lighthalzen.gat,115,159,5 script Collins 866,{
+
+ mes "[Collins]";
+ mes "I really wish that my";
+ mes "son will be able to join";
+ mes "the Rekenber Corporation.";
+ mes "They certainly provide the";
+ mes "best jobs in Lighthalzen.";
+ next;
+ mes "[Collins]";
+ mes "Although they're a large,";
+ mes "major corporation, it's";
+ mes "almost impossible to get";
+ mes "emplyed by them. How";
+ mes "do people get hired there";
+ mes "in the first place anyway?";
+ close;
+
+}
+
+
+
+lighthalzen.gat,77,157,5 script Villagomez 866,{
+
+ mes "[Villagomez]";
+ mes "I just step out to get";
+ mes "a haircut and now i'm";
+ mes "lost. Boy oh boy, I hope";
+ mes "i don't keep my family";
+ mes "waiting. *Sigh...*";
+ close;
+
+}
+
+
+lighthalzen.gat,125,68,5 script Kemp 97,{
+
+ mes "[Kemp]";
+ mes "Have you ever seen the";
+ mes "people who work in that big";
+ mes "corporation over there? I think";
+ mes "their employees are all a bit";
+ mes "off kilter for some reason.";
+ next;
+ mes "[Kemp]";
+ mes "I haven't been there";
+ mes "myself, but something";
+ mes "strange is happening with";
+ mes "all the people who work there.";
+ close;
+
+}
+
+
+lighthalzen.gat,138,50,8 script Mauro 847,{
+
+ mes "[Mauro]";
+ mes "The youth in this city";
+ mes "have no appreciation for";
+ mes "their elders. i've worked";
+ mes "so hard to help build this";
+ mes "city for so many years and";
+ mes "this is the thanks i get?";
+ next;
+ mes "[Mauro]";
+ mes "Bah! If it weren't for";
+ mes "us, Lighthalzen wouldn't";
+ mes "be as prosperous as it is";
+ mes "today! Those kids don't";
+ mes "know that they owe their";
+ mes "lives of luxury to us...";
+ close;
+
+}
+
+
+lighthalzen.gat,132,103,5 script Sefith 734,{
+
+ mes "[Sefith]";
+ mes "Good looks. Intelligence.";
+ mes "Excellent manners. A strong,";
+ mes "manly chin and overpowering,";
+ mes "piercing eyes. Perfectly balanced";
+ mes "passion and charisma. All the";
+ mes "good things that ladies want.";
+ next;
+ mes "[Sefith]";
+ mes "But Enough about me. Let's";
+ mes "discuss how sorry i should";
+ mes "feel for any other man living";
+ mes "in Lighthalzen. They don't hold";
+ mes "a candle to my studliness~";
+ close;
+
+}
+
+
+lighthalzen.gat,239,64,5 script Jade 862,{
+
+ mes "[Jade]";
+ mes "I've heard that there's a";
+ mes "strange kingdom out there";
+ mes "that's basically ruled by";
+ mes "magic and swords, where";
+ mes "adventurers are enlisted";
+ mes "for the greater good.";
+ next;
+ mes "[Jade]";
+ mes "So are you from";
+ mes "Rune-Midgard?";
+ mes "What do you think";
+ mes "of our city with its";
+ mes "advanced technology";
+ mes "and economy? Huh...";
+ next;
+ mes "[Jade]";
+ mes "Someday, I'd like";
+ mes "to go visit the land";
+ mes "where you came from.";
+ mes "It sounds so fantastic";
+ mes "and romantic in a way...";
+ close;
+
+}
+
+lighthalzen.gat,205,208,3 script Greedy Looking Man 853,{
+
+ mes "[Khramptd]";
+ mes "The land around here";
+ mes "is some pretty expensive";
+ mes "property. Yes, it's perfect";
+ mes "for building my awesome palace!";
+ mes "I don't have enough funds at the";
+ mes "moment, but the day will come~";
+ close;
+
+}
+
+lhz_in02.gat,34,213,4 script Maggie 91,{
+
+ mes "[Maggie]";
+ mes "Sure, I sell a lot";
+ mes "of flowers here, but";
+ mes "the lease that this city";
+ mes "makes me pay cuts into";
+ mes "my profits. It's almost not";
+ mes "worth renting this property.";
+ next;
+ mes "[Maggie]";
+ mes "I pay such a ridiculous";
+ mes "amount for the lease and the";
+ mes "laws here won't let me raise";
+ mes "the price of my flowers. Why";
+ mes "are the city officials so greedy?";
+ close;
+
+}
+
+lighthalzen.gat,202,94,5 script Wallace 847,{
+
+ mes "[Wallace]";
+ mes ".....";
+ mes "That lady, working";
+ mes "for that one company";
+ mes "Kafra, Mafra or whatever";
+ mes "She certainly is very charming.";
+ next;
+ mes "[Wallace]";
+ mes "Now, if I were";
+ mes "thirty years younger...";
+ mes "Wait! I'm a rich and powerful";
+ mes "man. I could ask her out now.";
+ mes "Hm? What's that look for?";
+ close;
+
+}
+
+lighthalzen.gat,182,102,3 script Lucius 866,{
+
+ mes "[Lucius]";
+ mes "Hello youngster~";
+ mes "Would you like to";
+ mes "make a donation";
+ mes "to help the hungry?";
+ next;
+ menu "Sure.",s_Sure,"No, thanks.",-;
+
+ mes "[Lucius]";
+s_Cancel:
+ mes "I understand. Still,";
+ mes "keep in mind that when";
+ mes "you give from your heart,";
+ mes "you will be rewarded tenfold.";
+ mes "Though I admit, the benefits";
+ mes "aren't always readily apparent.";
+ close;
+
+s_Sure:
+ mes "[Lucius]";
+ mes "Now, you can donate 1 to";
+ mes "30,000 zeny that will be used";
+ mes "to support the poor and feed";
+ mes "starving children. If you wish";
+ mes "to cancel, please enter '0'.";
+ next;
+ input @zenydonate;
+ mes "[Lucius]";
+ if(!@zenydonate)goto s_Cancel;
+ if(@zenydonate > 30000){
+ mes "I'm sorry but you can't";
+ mes "donate more than 30,000";
+ mes "zeny. Please choose another";
+ mes "number.";
+ close;
+ }
+ if(Zeny < @zenydonate){
+ mes "I'm sorry but you do";
+ mes "not have as much zeny";
+ mes "as you wish to donate.";
+ mes "Please come back when you";
+ mes "do!";
+ close;
+ }
+ set Zeny,Zeny - @zenydonate;
+ set $donatedzeny,$donatedzeny + @zenydonate;
+ mes "Thank you so much";
+ mes "for your " + @zenydonate + " zeny donation.";
+ mes "I promise that your money";
+ mes "will be put to good use in";
+ mes "benefiting the poor and needy.";
+ next;
+ mes "[Lucius]";
+ mes "So far, I've received";
+ mes "a total of " + $donatedzeny + " zeny in";
+ mes "donations. I'm glad to see";
+ mes "that there are still kinda and";
+ mes "generous people in the world.";
+ if($donatedzeny > 259999){
+ next;
+ mes "[Lucius]";
+ mes "This should be enough";
+ mes "to send to the Poor Relief";
+ mes "Organization. Please accpet";
+ mes "this small gift as a token of";
+ mes "my gratitude, adventurer. Bless";
+ mes "you, youngster and take care.";
+ getitem 603,1;
+ getitem 12016,1;
+ set $donatedzeny,0;
+ }
+ close;
+
+}
+
+lighthalzen.gat,147,105,3 script Laqumet 869,{
+
+ mes "[Laqumet]";
+ mes "Sure, manliness is quite";
+ mes "attractive, but I think women";
+ mes "appreciate a guy who could";
+ mes "sympathize and talk with them";
+ mes "a little more. Don't you agree?";
+ next;
+ mes "[Laqumet]";
+ mes "I might not be like Sefith,";
+ mes "but I guess I've got a cute";
+ mes "smile, a good personality and";
+ mes "I'm a dandy to boo. Hopefull,";
+ mes "my honesty and loyalty will";
+ mes "help me find someone good.";
+ close;
+
+}
+
+lhz_in02.gat,230,284,4 script Hotel Employee#01 86,{
+
+ mes "[Hotel Employee]";
+ mes "Welcome to";
+ mes "the Royal Dragon,";
+ mes "where you can find the";
+ mes "finest accomodations";
+ mes "and the best service.";
+ next;
+ menu "Save Point",s_Save,"Rest - 5,000 zeny",s_Rest,"Cancel",-;
+
+ mes "[Hotel Employee]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+
+s_Save:
+ savepoint "lhz_in02.gat",209,275;
+ mes "[Hotel Employee]";
+ mes "Thank you, your";
+ mes "Respawn Point has";
+ mes "been saved here in";
+ mes "the Royal Dragon.";
+ close;
+
+s_Rest:
+ if(Zeny < 5000)goto s_NEnoughZ;
+ set Zeny,Zeny - 5000;
+ mes "[Hotel Employee]";
+ mes "Thank you~";
+ mes "I hope you enjoy";
+ mes "your stay in the";
+ mes "Royal Dragon.";
+ close2;
+ warp "lhz_in02.gat",219,150;
+ percentheal 100,100;
+ sc_start SC_BLESSING,240000,10;
+ skilleffect AL_BLESSING,0;
+ end;
+
+s_NEnoughZ:
+ mes "[Hotel Employee]";
+ mes "I'm sorry but you do not";
+ mes "have enough zeny, please";
+ mes "come back when you do!";
+ close;
+}
+
+lhz_in02.gat,241,172,8 script Hotel Employee#02 868,{
+
+ mes "[Hotel Employee]";
+ mes "Please use the stairs";
+ mes "at the northern end to";
+ mes "go downstairs so that you";
+ mes "can go to the Front Desk.";
+ mes "Thank you and I hope that";
+ mes "you enjoy your stay here.";
+ close;
+
+}
+
+lhz_in02.gat,210,189,2 script Christopher Michael 849,{
+
+ mes "[Christopher Michael]";
+ mes "OoooOoh~";
+ mes "Soooo comfortable";
+ mes "Don't want to wake up.";
+ mes "Don't want to get up.";
+ mes "Ever again. OoOoooh...";
+ close;
+
+}
+
+lhz_in02.gat,201,181,6 script Safwat Fahmy 853,{
+
+ mes "[Safwat Fahmy]";
+ mes "This hotel is nice";
+ mes "and comfortable, but";
+ mes "to be quite frank, the";
+ mes "drinks here are horrible.";
+ mes "They're unfit for being";
+ mes "drunk by men such as myself.";
+ next;
+ mes "[Safwat Fahmy]";
+ mes "If this is the best hotel,";
+ mes "I expect them to provide me";
+ mes "with the best alcohol. When";
+ mes "I stay at a hotel, that's what";
+ mes "I want. To spend the entire";
+ mes "day not being sober.";
+ next;
+ mes "[Safwat Fahmy]";
+ mes "It looks like that";
+ mes "today I'll be heading";
+ mes "out ot to the bar again...";
+ mes "I just wish there were";
+ mes "some place quieter to drink.";
+ close;
+
+}
+
+lhz_in02.gat,251,212,2 script Hotel Employee#03 868,{
+
+ mes "[Hotel Employee]";
+ mes "This is the Couple Suite.";
+ mes "A single can also check";
+ mes "in here, but our hotel will";
+ mes "prioritize couples when";
+ mes "assigning this room.";
+ close;
+
+}
+
+lhz_in02.gat,229,217,2 script Tanoue 863,{
+
+ mes "[Tanoue]";
+ mes "This chair looks";
+ mes "very nice, but it really";
+ mes "chills my bottom. Brr...!";
+ mes "It's mighty uncomfortable!";
+ next;
+ mes "[Tanoue]";
+ mes "You know what the";
+ mes "perfect chair would";
+ mes "be like? It would be";
+ mes "plush and have electronic";
+ mes "massage and heating controls...";
+ close;
+
+}
+
+lhz_in02.gat,209,277,4 script Ben Allen 84,{
+
+ mes "[Ben Allen]";
+ mes "Aaahhh Oooooh~";
+ mes "It's sooooo comfy~";
+ mes "The air's so fresh and";
+ mes "this couch is so plush...";
+ mes "Why can't home be like this?";
+ next;
+ mes "[Ben Allen]";
+ mes "I've been in those other";
+ mes "hotels and let me tell you,";
+ mes "this place is the best ever.";
+ mes "After a night's sleep over";
+ mes "here, I feel like a new man!";
+ close;
+
+}
+
+lhz_in02.gat,221,276,4 script Harp 869,{
+
+ mes "[Harp]";
+ mes "Oh sweet jiminy...";
+ mes "That Kafra Lady is so hot.";
+ mes "What a body. And those glasses.";
+ mes "I just gotta ask her out somehow.";
+ next;
+ mes "[Harp]";
+ mes "Hm, but what should";
+ mes "I do? A love letter? Naw,";
+ mes "that's kind of outdated.";
+ mes "Argh, I can't think! Just";
+ mes "looking at her makes me feel";
+ mes "so happy! Praise be to Kafra!";
+ close;
+
+}
+
+lhz_in02.gat,238,275,4 script Hotel Employee#04 869,{
+
+ mes "[Hotel Employee]";
+ mes "\"Hospitality with a smile";
+ mes "and total devotion to your";
+ mes "comfort.\" That's our motto";
+ mes "in the Royal Dragon Hotel.";
+ mes "Please inquire at the front";
+ mes "desk if you wish to check in.";
+ close;
+
+}
+
+lhz_in02.gat,247,275,4 script Hotel Employee#05 868,{
+
+ mes "[Hotel Employee]";
+ mes "Welcome to the";
+ mes "Royal Dragon Hotel Bar.";
+ mes "How about a nice night";
+ mes "cap before going to bed?";
+ next;
+ mes "[Hotel Employee]";
+ mes "If you're looking";
+ mes "for a friend, you";
+ mes "can almost always";
+ mes "make one in this bar.";
+ mes "Alcohol certainly is the";
+ mes "grease for social gears.";
+ close;
+
+}
+
+lhz_in02.gat,271,281,2 script Citizen#01 47,{
+
+ mes "[Hachi]";
+ mes "Oh yeah. I love-love-love";
+ mes "bars. If I don't come here";
+ mes "for the booze, then I'm here";
+ mes "for all these beautiful ladies.";
+ next;
+ mes "[Hachi]";
+ mes "Weird. It's the very first";
+ mes "time I've tried this place's";
+ mes "rum, but doesn't it taste like";
+ mes "pure sexiness to you? Huh...";
+ mes "Oh well, back to schmoozin'";
+ mes "with all the hot chicks~";
+ close;
+
+}
+
+lhz_in02.gat,277,285,4 script Bartender 61,{
+
+ mes "[Duff]";
+ mes "Hey, you're from";
+ mes "Rune-Midgard, right?";
+ mes "Please make yourself";
+ mes "at home while you're here";
+ mes "in Lighthalzen and have";
+ mes "yourself a good time.";
+ close;
+
+}
+
+lhz_in02.gat,281,280,6 script Customer#01 816,{
+
+ mes "[Rona]";
+ mes "I hate it when guys";
+ mes "just sidle up and sort";
+ mes "of just skip Steps One";
+ mes "and Two. And before you";
+ mes "get all weird, Step Three";
+ mes "is \"Ask for my phone number.\"";
+ next;
+ mes "[Rona]";
+ mes "I would just really";
+ mes "appreciate it if one";
+ mes "nice boy would just";
+ mes "talk to me for real.";
+ close;
+
+}
+
+lhz_in02.gat,287,282,4 script Customer#02 853,{
+
+ mes "[Greenfield]";
+ mes "I don't believe it...";
+ mes "This unluck streak";
+ mes "will never end, will it?";
+ mes "I lost all my Apples";
+ mes "playing Dice today.";
+ mes "Again. Oh man...";
+ next;
+ mes "[Greenfield]";
+ mes "Okay. Okay.";
+ mes "If I just keep";
+ mes "playing, eventually";
+ mes "I'll win. I mean, that's";
+ mes "the way the odds work, right?";
+ mes "Even when they're against me...";
+ close;
+
+}
+
+lighthalzen.gat,123,212,4 script Merpi 700,{
+
+ mes "[Merpi]";
+ mes "Isn't the weather nice";
+ mes "today? All this sunlight";
+ mes "will dry these clothes";
+ mes "quickly and give them";
+ mes "a fresh, lovely scent.";
+ next;
+ mes "[Merpi]";
+ mes "Oh, an adventurer from";
+ mes "Rune-Midgarts, are you?";
+ mes "How do you like our city?";
+ mes "If you have any questions,";
+ mes "feel free to ask me anything.";
+ next;
+ menu "Well, I have nothing to ask...",-,"Any news or rumors?",L_rumors,"I like laundry too.",L_laundry;
+ mes "[Merpi]";
+ mes "Oh, really?";
+ mes "Well, if you've traveled";
+ mes "all over the world, maybe";
+ mes "you've found a place just";
+ mes "like Lighthalzen, so maybe";
+ mes "you're already comfortable?";
+ close;
+
+L_rumors:
+ mes "[Merpi]";
+ mes "Well, things have";
+ mes "been pretty peaceful";
+ mes "for the past few years.";
+ mes "The only rumor floating";
+ mes "around is about some";
+ mes "weird axe murderer...";
+ close;
+
+L_laundry:
+ mes "[Merpi]";
+ mes "Oh, that's wonderful!";
+ mes "I so love doing hand";
+ mes "laundry, though I'm not";
+ mes "quite sure why. Oh well~";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,297,239,3 script Pilia 818,{
+
+ mes "[Pilia]";
+ mes "Hmm? Oh, I'm sorry,";
+ mes "but my little brother";
+ mes "just won't stop crying.";
+ mes "I'm sorry if we're loud...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,296,239,3 script Berru 706,{
+
+ mes "[Berru]";
+ mes "Daddy...! Waaaaah~!";
+ mes "I wanna see my daddy!";
+ emotion e_sob;
+ next;
+ mes "[Pilia]";
+ mes "Berru, I don't";
+ mes "think Daddy's coming";
+ mes "home tonight. Come on,";
+ mes "we should go to bed.";
+ next;
+ mes "[Berru]";
+ mes "No, I'm not gonna";
+ mes "sleep 'til Daddy gets";
+ mes "home! He said he'll";
+ mes "bring us candy tonight!";
+ mes "You go sleep first, Pilia!";
+ emotion e_ag;
+ next;
+ mes "[Pilia]";
+ mes "*Sigh...*";
+ mes "Where's out Daddy?";
+ mes "He said he found a";
+ mes "good job, but we haven't";
+ mes "heard from him since then...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,312,234,2 script Beggar 777,{
+
+ mes "[Beggar]";
+ mes "Please...";
+ mes "My child is starving...";
+ mes "Would you give me";
+ mes "some money?";
+ next;
+ if(select("Give him some money.:Ignore him.")==2){
+ mes "[" + strcharinfo(0) + "]";
+ mes "...";
+ mes "......";
+ close;
+ }
+ if(Zeny < 50){
+ mes "[Beggar]";
+ mes "You don't seem to have";
+ mes "enough zeny.";
+ close;
+ }
+ set Zeny,Zeny-50;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Here you go,";
+ mes "take this.";
+ next;
+ mes "[Beggar]";
+ mes "Thank you so much.";
+ mes "I have nothing to offer you";
+ mes "in exchange, but I can share";
+ mes "a story with you and impart";
+ mes "some of the wisdom I've";
+ mes "learned over the years.";
+ emotion e_thx;
+ next;
+ mes "[Beggar]";
+ mes "Anger. People deal with";
+ mes "it in different ways. Some";
+ mes "suppress it. Some relish it.";
+ mes "Some fear being angry. Now,";
+ mes "to be simple, let's say there";
+ mes "are two kinds of anger.";
+ next;
+ mes "[Beggar]";
+ mes "The first is the kind that";
+ mes "isn't so productive. More of";
+ mes "a frustration that you can let";
+ mes "go. Someone cut you off on the";
+ mes "freeway or a friend innocently";
+ mes "forgot your birthday? No Biggie.";
+ next;
+ mes "[Beggar]";
+ mes "Don't let this kind of";
+ mes "anger get to you or you'll";
+ mes "look like a looser. Think of";
+ mes "the big picture and if you're";
+ mes "still upset, vent appropriatly.";
+ mes "Be honest without hurting anyone.";
+ next;
+ mes "[Beggar]";
+ mes "The second kind of anger is";
+ mes "righteous anger. You've been";
+ mes "wronged and need some form";
+ mes "of retribution. Remember to";
+ mes "make appropriate confontrations";
+ mes "and don't misdirect your rage.";
+ next;
+ mes "[Beggar]";
+ mes "Getting into a fight with";
+ mes "righteous anger, say to protect";
+ mes "someone dear to you, will make";
+ mes "you a hero. Fighting with anger";
+ mes "born of frustration will make you";
+ mes "a bully. Know the difference.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes ". . . . . . . . . . . .";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes ". . . . . . . . . . . .";
+ mes ". . . . . . . . . . . .";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes ". . . . . . . . . . . .";
+ mes ". . . . . . . . . . . .";
+ mes ". . . . . . . . . . . .";
+ next;
+ mes "[Beggar]";
+ mes "What's wrong?";
+ mes "It might be a lot";
+ mes "to take in, I know.";
+ close;
+
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,311,194,3 script Reuben 870,{
+
+ mes "[Reuben]";
+ mes "Someday...";
+ mes "Someday I just gotta";
+ mes "become a train conductor";
+ mes "and just get outta here.!";
+ mes "I really hate this place!";
+ next;
+ mes "[Reuben]";
+ mes "Wh-whoa...!";
+ mes "Did you just hear";
+ mes "me talk to myself?";
+ mes "Crud! Don't be so nosy!";
+ emotion e_an;
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,306,324,3 script Shengwen 870,{
+
+ mes "[Shengwen]";
+ mes "Am I just getting";
+ mes "paranoid? I really";
+ mes "think that some of";
+ mes "the people I know";
+ mes "are dissapearing";
+ mes "for no good reason!";
+ next;
+ mes "[Shengwen]";
+ mes "I mean, all of my close";
+ mes "friend are all right,";
+ mes "but I'm starting not to see";
+ mes "certain acquaintances and";
+ mes "familiar faces. Maybe I'm";
+ mes "just thinking too much...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,26,167,4 script Shayna 850,{
+
+ mes "[Shayna]";
+ mes "*Sigh...*";
+ mes "Oh, you poor";
+ mes "darling girl...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,134,45,2 script Cenku Dekdam#Cenku_Dekdam 869,{
+
+ mes "[Cenku Dekdam]";
+ mes "Man, if you were";
+ mes "gonna take this whole";
+ mes "city and sell it, what";
+ mes "do you think Lighthalzen's";
+ mes "price tag would be, eh?";
+ next;
+ mes "[Cenku Dekdam]";
+ mes "I mean, this city";
+ mes "is basically just made";
+ mes "of money. Money is what";
+ mes "makes this city such a nice";
+ mes "and pleasant place to live.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,330,276,3 script Nun 79,{
+
+ mes "[Angela]";
+ mes "Greetings, adventurer.";
+ mes "I'm Angela, a social";
+ mes "worker for the Poor";
+ mes "Relief Organization.";
+ next;
+ mes "[Angela]";
+ mes "I've noticed that the";
+ mes "people living here have";
+ mes "extremely bad health and";
+ mes "it's not just because of";
+ mes "their circumstances.";
+ next;
+ mes "[Angela]";
+ mes "I've filed a report";
+ mes "to my superiors, but";
+ mes "they haven't sent me";
+ mes "a response yet for some";
+ mes "reason. I'm starting to get";
+ mes "a little worried about this...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,337,296,3 script Employee 867,{
+
+ mes "[Rekenber Employee]";
+ mes "Greetings. As part of our";
+ mes "effort to relieve the poor,";
+ mes "Rekenber is providing job";
+ mes "opportunities targeted for";
+ mes "citizens of the slum areas.";
+ next;
+ mes "[Rekenber Employee]";
+ mes "You can choose to work";
+ mes "from home, or undergo a";
+ mes "little bit of training for more";
+ mes "professional positions. This";
+ mes "is a great chance to make a";
+ mes "difference... and some money~";
+ emotion e_no1;
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,134,38,2 script Bankri Kun#Bankri_Kun 86,{
+
+ mes "[Bankri Kun]";
+ mes "Must work...";
+ mes "Must focus...";
+ mes "Resist sleepiness...";
+ mes "Why do I keep coming";
+ mes "here? ugh, h-horrible.";
+ next;
+ mes "[Bankri Kun]";
+ mes "hey youngster. You wanted";
+ mes "adventuring advice? Okay.";
+ mes "Um. Hm. Always. Brush.";
+ mes "Your teeth. Brush them";
+ mes "everyday. Oh, and don't";
+ mes "forget to floss, either.";
+ next;
+ mes "[Bankri Kun]";
+ mes "Now it's time for me";
+ mes "to head back to work.";
+ mes "I'll see you later, kid.";
+ mes "Sorry my advice was so";
+ mes "lame-- I couldn't think of";
+ mes "anything else to tell you.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,139,40,2 script Enoz 53,{
+
+ mes "[Enoz]";
+ mes "So, the novel I ordered from";
+ mes "the Rune-Midgarts Kingdom";
+ mes "just recently arrived. It's real";
+ mes "good, by the guy who wrote";
+ mes "\"Roda Frog Adventure\"";
+ mes "years ago. Remember?";
+ next;
+ mes "[Enoz]";
+ mes "Anyway, this new book,";
+ mes "\"Where the Red Plant Grows\"";
+ mes "is up for the Yggdrasilberry";
+ mes "Award. I... I don't know why";
+ mes "I was compelled to share that";
+ mes "with you. Seriously, I don't...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,124,28,2 script Ellette 66,{
+
+ mes "[Ellette]";
+ mes "...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Excuse me.";
+ next;
+ mes "[Ellette]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Hello?";
+ next;
+ mes "[Ellette]";
+ mes "...Oh! Everyone!";
+ mes "I just completed";
+ mes "another one! Hooray!";
+ next;
+ mes "[All other Employees]";
+ mes "Wh-what?!";
+ mes "No way, not again!";
+ next;
+ mes "[Leekal]";
+ mes "Are you even human?";
+ mes "You must have some";
+ mes "secret for that much";
+ mes "productivity. It's weird...";
+ next;
+ mes "[Ellette]";
+ mes "Oh, come on.";
+ mes "Maybe I'm a little";
+ mes "good at this, but there's";
+ mes "no way I can beat Cenku.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,125,40,2 script Dowbow Ryuei#Dowbow_Ryuei 843,{
+
+ mes "[Dowbow Ryuei]";
+ mes "Just out of, oh I dunno,";
+ mes "curiosity, which word do";
+ mes "you like better?\"Uber-Cool\"";
+ mes "or \"Reality?\" Pick one~";
+ next;
+ menu "Uber-Cool",-,"Reality",L_reality;
+ mes "[Dowbow Ryuei]";
+ mes "Oh yeah? Me too!";
+ mes "Yeah, we got the same";
+ mes "outlook on life. If you don't";
+ mes "mind, I'd like to shake";
+ mes "your hand, adventurer.";
+ emotion e_no1;
+ close;
+
+L_reality:
+ mes "[Dowbow Ryuei]";
+ mes "Reality, eh?";
+ mes "Well, I agree that";
+ mes "being realistic has its";
+ mes "perks, I'm more of a dreamer.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,125,46,2 script Leekal 849,{
+
+ mes "[Leekal]";
+ mes "So... Very broke.";
+ mes "Why did I spend so much";
+ mes "money on wine, women and";
+ mes "song? I regret it all, all the";
+ mes "pleasure I've had this month.";
+ mes "Yes, it was too much pleasure.";
+ next;
+ mes "[Ninjose]";
+ mes "That's what happens";
+ mes "when you're irresponsible";
+ mes "with your money. You really";
+ mes "should read this \"Anybody";
+ mes "Can Be Rich\" book.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,116,53,6 script Ninjose 841,{
+
+ mes "[Ninjose]";
+ mes "At long last, I've finally";
+ mes "bought my own home. You";
+ mes "should invest your money for";
+ mes "your future too! Read this,";
+ mes "\"Anybody Can Be Rich!\"";
+ mes "It's such a great book.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,116,39,6 script Kejulle Rekenber#Kejulle_Rekenber 822,{
+
+ mes "[Kejulle Rekenber]";
+ mes "Hm? Sure, my last name";
+ mes "is Rekenber and that's the";
+ mes "same name as our chairman,";
+ mes "but that's just a coincidence.";
+ mes "I'm merely a normal employee.";
+ mes "Yeah, no special treatment...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+lhz_in01.gat,110,40,2 script Jorjerro 89,{
+
+ mes "^0000AAThis man here";
+ mes "is motionless,";
+ mes "and for all intents";
+ mes "and purposes, is";
+ mes "soundly asleep.^000000";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,116,45,6 script Joshua 704,{
+
+ mes "[Joshua]";
+ mes "What am I doing here?";
+ mes "Waiting for my dream";
+ mes "woman to fall into my lap,";
+ mes "what else does it look like?";
+ next;
+ mes "[Joshua]";
+ mes "Tall, blond, creamy";
+ mes "complexion and smooth";
+ mes "skin. That's right. Come";
+ mes "right to Joshua, babes.";
+ mes "I got my pheremone spray";
+ mes "on and I'm ready to cruise~";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,93,45,4 script Researcher#02 865,{
+
+ mes "[Researcher]";
+ mes "You know what's weird?";
+ mes "Why do they use blue and";
+ mes "red wires when they make";
+ mes "bombs? There's so many";
+ mes "others you could use, like";
+ mes "pink or yellow or or green...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,286,226,2 script Secretary Slierre#Secretary_Slierre 831,{
+
+ mes "[Sueii Slierre]";
+ mes "Excuse me, but you are";
+ mes "not allowed to be in here.";
+ mes "Please visit the Help Desk";
+ mes "if you have any questions about";
+ mes "the Rekenber Corporation.";
+ mes "Thank you for cooperating.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,32,162,2 script Crippled Girl#Crippled_Girl 53,{
+
+ mes "[Crippled Girl]";
+ mes "...";
+ mes "......";
+ mes "*Sigh...*";
+ next;
+ menu "Hello, how are you?",-;
+ mes "[Crippled Girl]";
+ mes "Oh, I'm fine,";
+ mes "thanks for asking.";
+ mes "I'm just waiting for";
+ mes "somebody, that's all.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,346,263,2 script Elder 846,{
+
+ mes "[Elder]";
+ mes "Predators are always";
+ mes "on the lookout for easy";
+ mes "prey. Be careful, youngster!";
+ mes "You look innocent enough";
+ mes "to become a victim in the city.";
+ next;
+ menu "About Lighthalzen",L_lighthalzen,"About the Slum",L_slum,"????",-;
+ mes "[Elder]";
+ mes "Well, if you need any";
+ mes "help around here or have";
+ mes "any questions, come back";
+ mes "and ask me. I get the feeling";
+ mes "that we'll probably meet again.";
+ close;
+
+L_lighthalzen:
+ mes "[Elder]";
+ mes "Lighthalzen might seem";
+ mes "like a splendid city at first,";
+ mes "but you'll learn quickly that";
+ mes "the poor are segregated from";
+ mes "the rich and treated as less";
+ mes "than second class citizens.";
+ next;
+ mes "[Elder]";
+ mes "At first, separation between";
+ mes "the rich and poor districts was";
+ mes "subtly enforced. They built the";
+ mes "railroad right between the two";
+ mes "districts to make it easier for";
+ mes "the rich to ignore the poor.";
+ next;
+ mes "[Elder]";
+ mes "But now they even have";
+ mes "guards to make sure that";
+ mes "the poor can't bother the";
+ mes "rich. I'm pretty sure that";
+ mes "this segregation won't be";
+ mes "ending anytime soon...";
+ next;
+ mes "[Elder]";
+ mes "Now, I've heard that the";
+ mes "Rekenber Corporation is";
+ mes "actually providing jobs for";
+ mes "people in the slums. Beggars";
+ mes "can't be choosers, so I'm sure";
+ mes "these jobs aren't that great.";
+ close;
+
+L_slum:
+ mes "[Elder]";
+ mes "To live in the slum is to";
+ mes "be familiar with poverty,";
+ mes "disease, condemnation";
+ mes "and contempt. But we're all";
+ mes "still people, you know, so let";
+ mes "go of any of your misgivings.";
+ next;
+ mes "[Elder]";
+ mes "We're struggling just";
+ mes "to survive here. At the";
+ mes "very least, please respect";
+ mes "that. It's a fact that the";
+ mes "people in the rich district";
+ mes "seem to keep forgetting.";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lighthalzen.gat,326,249,5 script Grinnel 870,{
+
+ mes "[Grinnel]";
+ mes "You know the men in";
+ mes "black suits? Boy, did";
+ mes "I get a scare! They actually";
+ mes "tracked me down to ask me";
+ mes "all these weird questions!";
+ next;
+ mes "[Grinnel]";
+ mes "They kept wanting to";
+ mes "know if I had ever met";
+ mes "anyone from the Rekenber";
+ mes "Corporation, if I've ever been";
+ mes "Uptown, that sort of thing. They";
+ mes "really scared the crap out of me.";
+ next;
+ mes "[Grinnel]";
+ mes "Man, living in the";
+ mes "slums is such a drag.";
+ mes "Not only is life rough,";
+ mes "but all sorts of people";
+ mes "think they can push you";
+ mes "around. I hate Lighthalzen...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,192,19,2 script Haggar 855,{
+
+ mes "[Haggar]";
+ mes "Whiskey!";
+ mes "I need me some";
+ mes "hard liquor now!";
+ next;
+ mes "[Haggar]";
+ mes "Wha--? I didn't";
+ mes "order this stinkin'";
+ mes "rum! I want a man's";
+ mes "drink! Gimme whisky!";
+ Close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,193,25,2 script Bartender#01 61,{
+
+ mes "[Tony]";
+ mes "Hey man, I know this";
+ mes "joint is a dive, pretty much";
+ mes "on the verge of bein' totally";
+ mes "ghetto, but we're proud to";
+ mes "have the best rum in all of";
+ mes "Rune-Midgard. It's true~";
+ next;
+ mes "[Tony]";
+ mes "Just a sip of this";
+ mes "beautiful drink and";
+ mes "you're on top of the";
+ mes "world! But it's best";
+ mes "for helpin' yah relax";
+ mes "and forget your worries.";
+ next;
+ mes "[Tony]";
+ mes "I don't take to bein'";
+ mes "a poet, but I do know";
+ mes "this. Our rum has the";
+ mes "sweet sweet flavor of";
+ mes "loneliness. You really";
+ mes "oughta try it when you can .";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,185,20,6 script Bad Drunk#Bad_Drunk 869,{
+
+ mes "[Garry]";
+ mes "Hey! Hey you...!";
+ mes "D'you wanna, you";
+ mes "wanna hear me tell";
+ mes "you a joke?! It goes...";
+ mes "Um, it goes like this...";
+ next;
+ mes "[Garry]";
+ mes "Hey riddle middle,";
+ mes "the cat and th--";
+ mes "No! No, damn it!";
+ mes "That's a song!";
+ mes "No, wait, that's";
+ mes "not a song either...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,186,29,6 script Bad Drunk#Bad_Drunk2 869,{
+
+ mes "[Bonse]";
+ mes "*Hiccup* I loooove";
+ mes "this rum! I caught a cold";
+ mes "once and one glass made";
+ mes "it go away! 'Course, I slept";
+ mes "for a week too, but that doesn't";
+ mes "matter! Pshaw! Science...";
+ next;
+ mes "[Bonse]";
+ mes "Oh, the flavor is just";
+ mes "so clean, but it's also";
+ mes "got a bit of a kick. I don't";
+ mes "know how to describe it.";
+ mes "Its the taste of happiness?";
+ mes "I'm too drunk to even tell!";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,192,93,2 script City Girl#City_Girl 862,{
+
+ mes "[Lanko]";
+ mes "Oh, I'm only here";
+ mes "working as a waitress";
+ mes "to help my father.";
+ mes "This job is so tiring, but";
+ mes "it's nice to see people so";
+ mes "relaxed and having a good time.";
+ next;
+ mes "[Lanko]";
+ mes "When I get some time";
+ mes "off, I'm going to explore";
+ mes "Lighthalzen and see all that";
+ mes "there is to see. But for now,";
+ mes "it doesn't look like we've got";
+ mes "any real shortage of drunks...";
+ close;
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,189,87,4 script Drunken Man#04 869,{
+
+ mes "[Enku]";
+ mes "*Sob* I just got";
+ mes "dumped! Yeah, I thought";
+ mes "we were gonna get married,";
+ mes "but obviously I was wrong!";
+ mes "Damn it Sheryline! I loved you!";
+ next;
+ mes "[Enku]";
+ mes "I usually don't care for";
+ mes "drinking, especiallys stuff";
+ mes "like gin or rum, but today,";
+ mes "this stuff tastes just like";
+ mes "my misery. This is all the";
+ mes "comfort I need, you hear?!";
+ close;
+
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,183,82,6 script Drunken Man#05 870,{
+
+ mes "[Linus]";
+ mes "After ten years";
+ mes "of marriage. My";
+ mes "wife divorced me...";
+ next;
+ mes "[Linus]";
+ mes "So I guess there's no";
+ mes "place for me but here for";
+ mes "now. I don't know what it is,";
+ mes "but the rum is really good";
+ mes "today. Like, it's the flavor";
+ mes "of relaxing, joyous relief~";
+ close;
+
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,180,83,6 script Citizen#02 86,{
+
+ mes "[Mitchell]";
+ mes "You know, everyone";
+ mes "is different, but I think";
+ mes "humans are similar enough";
+ mes "that we can all meaningfully";
+ mes "connect on some level, right?";
+ next;
+ mes "[Mitchell]";
+ mes "Sure, a rich person might";
+ mes "have different problem than";
+ mes "a poor person, but the point";
+ mes "is, they've both got problems!";
+ mes "Pain, pleasure, sadness, joy.";
+ mes "Those link us all together.";
+ next;
+ mes "[Mitchell]";
+ mes "So try not to be picky";
+ mes "about who's your pal and";
+ mes "who's not. We all need";
+ mes "somebody to be with, right?";
+ close;
+
+}
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,176,85,4 script Citizen#Citizen2 869,{
+
+ mes "[Dique]";
+ mes "One of the things I look";
+ mes "forward to during my day";
+ mes "is the drink I enjoy right";
+ mes "after work. It's the most";
+ mes "relaxing thing in the world.";
+ next;
+ mes "[Dique]";
+ mes "Of course, there's";
+ mes "more to life than just";
+ mes "hanging out in pubs and";
+ mes "bars. The thing is, in my";
+ mes "case, pubs and bars are";
+ mes "all I happen to need~";
+ close;
+
+}
+
+
+// ---------------------------------------------------------------------------
+
+lhz_in03.gat,184,38,2 script Loudmouth 55,{
+
+ mes "[Loudmouth]";
+ mes "Do you know who I am?!";
+ mes "Just look at this peg leg.";
+ mes "I was in the Comodo War,";
+ mes "Ski Troop division! I lost my";
+ mes "leg to earn your freedom!";
+ next;
+ mes "[Loudmouth]";
+ mes "H-hey! What's that";
+ mes "look for? What, you";
+ mes "don't believe me?!";
+ close;
+
+}
+// ---------------------------------------------------------------------------
+
+lhz_in01.gat,114,181,3 script Representative::LhzRep 71,{
+
+ mes "[Representative]";
+ mes "Greetings, and welcome";
+ mes "to the Rekenber Corporation.";
+ mes "How may I be of service today?";
+ next;
+ menu "Building Information.",-;
+
+loopback:
+ mes "[Representative]";
+ mes "Please tell me";
+ mes "which floor you'd like";
+ mes "to know more about.";
+ next;
+ menu "1F",s_1,"2F",s_2,"B1",s_B,"Cancel",-;
+
+ mes "[Representative]";
+ mes "We are always doing our";
+ mes "best to provide the best";
+ mes "services to our customers.";
+ mes "Remember that Rekenber";
+ mes "is the name you can trust.";
+ mes "Thank you and have a nice day.";
+ close;
+
+s_1:
+ mes "[Representative]";
+ mes "The ^3131FFRekenber Library^000000 can";
+ mes "be found at the end of the";
+ mes "left hallway. Our library is";
+ mes "a great resource of innovative";
+ mes "ideas and information for our";
+ mes "system development employees.";
+ next;
+ mes "[Representative]";
+ mes "The ^3131FFBall Room^000000, where";
+ mes "various official events are";
+ mes "usually held, can be accessed";
+ mes "through the right hallway.";
+ next;
+ goto loopback;
+
+s_2:
+ mes "[Representative]";
+ mes "Please use the stairs";
+ mes "located on both sides of";
+ mes "the Help Desk to go to the";
+ mes "Second Floor. The Second";
+ mes "Floor is mostly used for";
+ mes "administrative purposes.";
+ next;
+ mes "[Representative]";
+ mes "There, you can find";
+ mes "the ^3131FFConference Room^000000,";
+ mes "^3131FFSecretary Office^000000, the";
+ mes "^3131FFAuditorium^000000 and the";
+ mes "^3131FFChairman's Office^000000.";
+ next;
+ goto loopback;
+s_B:
+ mes "[Representative]";
+ mes "The first underground floor";
+ mes "is used by the ^3131FFRegenshirm^000000,";
+ mes "our laboratory affiliate. For";
+ mes "security reasons, this floor";
+ mes "is not accessible to visitors";
+ next;
+ goto loopback;
+
+}
+
+lhz_in01.gat,26,247,2 duplicate(LhzRep) Representative 71
+
+lhz_in01.gat,173,28,4 script Guard#01::LhzRekGuard 868,{
+
+ mes "[Guard]";
+ mes "This is a";
+ mes "restricted area.";
+ mes "Please keep clear";
+ mes "if you do not have";
+ mes "special authorization.";
+ mes "Thank you for your cooperating.";
+ close;
+
+}
+
+lhz_in01.gat,180,28,4 duplicate(LhzRekGuard) Guard#03 868
+
+lhz_in01.gat,72,209,4 script Guide#01 862,{
+
+ mes "[Lasoei]";
+ mes "Oh phooey.";
+ mes "The same customers";
+ mes "are always coming in,";
+ mes "day after day. Can it";
+ mes "get any less exciting?";
+ next;
+ mes "[Lasoei]";
+ mes "Oh...!";
+ mes "W-welcome~";
+ mes "C-can I help you";
+ mes "with anything?";
+ close;
+
+}
+
+lhz_in01.gat,72,195,8 script Guide#02 90,{
+
+ mes "[Geonuii]";
+ mes "Greetings. This path";
+ mes "leads to the Library and";
+ mes "the Laboratory. Please be";
+ mes "aware that these places";
+ mes "are restricted from access";
+ mes "by the general public.";
+ close;
+
+}
+
+lhz_in01.gat,73,188,4 script Guide#03 862,{
+
+ mes "[Bonnie]";
+ mes "Oh no...";
+ mes "Where did I put it?";
+ close;
+
+}
+
+lhz_in01.gat,34,226,4 script Rekenber Guard#01 867,{
+
+ if(isequipped(2241) && isequipped(2243)) goto s_Staff;
+ mes "[Rekenber Guard]";
+ mes "This is a restricted";
+ mes "area! Please show";
+ mes "some ID immediately!";
+ next;
+ menu "ID?",s_ID,"Cancel",-;
+
+ mes "[Rekenber Guard]";
+ mes "Unless you have special";
+ mes "authorization, nobody is";
+ mes "allowed into the Underground";
+ mes "Laboratory for security reasons.";
+ close;
+
+s_ID:
+ mes "[Rekenber Guard]";
+ mes "I don't know how you";
+ mes "adventurers do things in";
+ mes "Rune-Midgard, but over here";
+ mes "we have laws about trespassing!";
+ close;
+
+s_Staff:
+ mes "[Rekenber Guard]";
+ mes "^3131FF(Whoa, it's a member";
+ mes "of the staff)^000000 Good day!";
+ close2;
+ warp "lhz_in01.gat",37,225;
+ end;
+
+}
+
+lhz_in01.gat,19,129,0 script LhzHiddenTrg1::LhzTrig -1,1,1{
+OnTouch:
+ mes "[Rekenber Guard]";
+ if(isequipped(2241) && isequipped(2243)){
+ mes "Keep your eyes open.";
+ mes "I've heard rumors that some";
+ mes "adventurers from Rune-Midgard";
+ mes "are trying to sneak into here!";
+ mes "I know the security here is";
+ mes "pretty much failsafe, but...";
+ close;
+ }
+ mes "This area is restricted";
+ mes "to the public! Who are you";
+ mes "and how did you get in here?!";
+ mes "Hey, I need backup right away!";
+ close2;
+ warp "lhz_in01.gat",34,224;
+ end;
+
+}
+
+lhz_in01.gat,23,137,0 duplicate(LhzTrig) LhzHiddenTrg2 139,1,1
+
+lhz_in01.gat,24,131,2 duplicate(LhzTrig) Rekenber Guard#02 867
+
+lhz_in01.gat,25,141,4 script Regenschirm Guard 868,{
+
+ mes "[Regenschirm Guard]";
+ if(isequipped(2241) && isequipped(2243)){
+ mes "Do you wish to";
+ mes "go underground?";
+ next;
+ if(select("Yes:No")==1){
+ if(isequipped(2657)){
+ warp "lhz_dun01.gat",150,288;
+ end;
+ }
+ mes "[Regenschirm Guard]";
+ mes "I'm sorry but I can't let";
+ mes "staff without proper autorization";
+ mes "pass. Only staff members with";
+ mes "Laboratory Passports are allowed";
+ mes "to enter the underground.";
+ close;
+
+ }
+ mes "[Regenschirm Guard]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+ }
+ mes "This area is restricted";
+ mes "to the public! Who are you";
+ mes "and how did you get in here?!";
+ mes "Hey, I need backup right away!";
+ close2;
+ warp "lhz_in01.gat",34,224;
+ end;
+
+}
diff --git a/npc/cities/louyang.txt b/npc/cities/louyang.txt
index f751a1f10..52dac1655 100644
--- a/npc/cities/louyang.txt
+++ b/npc/cities/louyang.txt
@@ -1,574 +1,574 @@
-//===== eAthena Script =======================================
-//= Louyang City NPC's
-//===== By: ==================================================
-//= Vidar (1.0)
-//= Mass Zero (1.1)
-//= Dino9021, roughly translated by Celest (1.2)
-//= Mass Zero (1.3)
-//= MasterOfMuppets (2.0)
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 2.7b
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Official NPC's for Louyang city.
-//===== Additional Comments: =================================
-//= Originally made for Vidar
-//= 1.2 - Added official warp NPC's
-//= 1.3 - Fixed gramatical errors. (Like wtf's with the weird
-// texts celest? xD)
-//= 2.0 - Completely rewrote the current scripts based on iRO.
-// Added the 'Shouting Quest' and the 'Medicine Quest'
-//= 2.1 Optimized, made quest vars unique [Lupus]
-//= 2.1a minor fix, 2.1b Fixed Typo’s [Nexon]
-//= 2.2 Fixed exploits [Lupus]
-//= 2.2a Updated the color codes a little and fixed the shouting quest
-//= to broadcast green text.
-//= 2.2b A small fix to the shout quest npc in louyang field not warping you
-//= back up to the tower if you died or teleported out of there. [MasterOfMuppets]
-//= 2.3 A small fix, the code is so messy I can't believe I scripted it >.< [MasterOfMuppets]
-//= 2.4 Implemented a few more npcs, thanks to Prometheus for them. [MasterOfMuppets]
-//= 2.5 Implemented the Poison King quest, beware of potential bugs. [MasterOfMuppets]
-//= 2.6 Removed Duplicates [Silent]
-//= 2.6a Updated a few names with new item_db.txt names [Evera]
-//= 2.7 Split quests to quests/quests_louyang.txt [Evera]
-//= 2.7a Minor optimizations before Louyang quests [Lupus]
-//= 2.7b Moved guides to the Guides folder [Lupus]
-//============================================================
-
-alberta.gat,245,45,4 script Girl#02 815,{
- mes "[Girl]";
- mes "La la la la~";
- mes "I feel so good today~";
- mes "I'm in the mood to go";
- mes "on a picnic somewhere~";
- mes "La la la la~";
- next;
- menu "About Louyang.",-,"Go to Louyang.",M_GOTO,"Cancel.",M_CANCEL;
-
- mes "[Girl]";
- mes "Oh, are you";
- mes "Interested in Louyang?";
- mes "It's a nice place to";
- mes "visit for travelers.";
- next;
- mes "[Girl]";
- mes "Louyang has a long history";
- mes "with stories of ancient magic and warriors. It's also rumored that many evil beasts roam the Louyang area";
- next;
- mes "[Girl]";
- mes "You can find cure-all medicines, mysterious occurrences, and martial artists all in one place!";
- next;
- mes "[Girl]";
- mes "I used to train in the martial arts every morning back when I was in Louyang. I might not look like it, but I'm pretty strong!";
- next;
- mes "[Girl]";
- mes "If you want to visit";
- mes "Louyang, feel free to";
- mes "tell me. Just give me";
- mes "some Zeny and we'll go~";
- close;
-
-M_GOTO:
- mes "[Girl]";
- mes "I'll guide you to";
- mes "Louyang right away.";
- mes "For my service, I am";
- mes "accepting 10,000 zeny";
- next;
- mes "[Girl]";
- mes "So, are you ready?";
- next;
- menu "Sure",-,"Cancel",M_CANCEL2;
-
- mes "[Girl]";
- if(Zeny < 10000){
- mes "...";
- mes "You don't seem";
- mes "to have 10,100 zeny...";
- mes "Go get some money first!";
- close;
- }
- mes "Okay~";
- mes "Ready!";
- mes "Have fun!";
- close2;
- set Zeny,Zeny-10000;
- warp "lou_fild01.gat",190,101;
- end;
-
-M_CANCEL:
- mes "[Girl]";
- mes "Oh...";
- mes "Have a good day!";
- close;
-
-M_CANCEL2:
- mes "[Girl]";
- mes "Oh...";
- mes "It's so disappointing to hear you say that.";
- mes "Well, have a good day!";
- close;
-}
-
-lou_fild01.gat,190,100,1 script Girl#03 815,{
- mes "[Girl]";
- mes "You'd like to go back to Alberta?";
- next;
- menu "Go back to Alberta.",-,"Cancel.",M_CANCEL;
-
- mes "[Girl]";
- mes "I hope to";
- mes "see you again!";
- mes "Bye bye!";
- close2;
- warp "alberta.gat",235,45;
- end;
-
-M_CANCEL:
- mes "[Girl]";
- mes "If you like this area, why don't you stay and enjoy the food and the sights!";
- next;
- mes "[Girl]";
- mes "And by sights...";
- mes "I mean girls!";
- mes "Tee hee~";
- close;
-}
-
-louyang.gat,261,123,4 script Chi Wu Ping 824,{
- mes "[Chi Wu Ping]";
- mes "I don't feel good...";
- mes "So... Totally out of it...";
- next;
- mes "[Chi Wu Ping]";
- mes "Oh, my aching body!";
- mes "All my muscles are sore...";
- mes "There's only one thing that could";
- mes "cure all of this agonizing...";
- mes "pain...";
- next;
- mes "[Chi Wu Ping]";
- mes "Hey kid~!";
- mes "You don't look like a local!";
- mes "Why don't you follow the road ahead";
- mes "and check out the big restaurant?";
- next;
- mes "[Chi Wu Ping]";
- mes "The soup that they sell there is probably the healthiest food you can ever find.";
- next;
- mes "[Chi Wu Ping]";
- mes "I guess you could eat";
- mes "some of that soup";
- mes "for your health.";
- close;
-}
-
-lou_in02.gat,43,169,8 script Jiang Rong 827,{
- mes "[Jiang Rong]";
- mes "Dragon Soup is known for its spicy";
- mes "yea sweet and refreshing taste.";
- next;
- mes "[Jiang Rong]";
- mes "It's made with all sorts of";
- mes "medicinal herbs, so it's good";
- mes "for your health as well";
- next;
- mes "[Jiang Rong]";
- mes "Dragon Soup draws out the";
- mes "unnecessary heat created inside";
- mes "the body and circulates the blood.";
- mes "So it helps optimize the body'";
- mes "functions and promotes longevity.";
- next;
- mes "[Jiang Rong]";
- mes "I've eaten Dragon Soup regularly";
- mes "ever since I was young. Look at me,";
- mes "don't you think I look so healthy";
- mes "considering my age?";
- close;
-}
-
-lou_in02.gat,76,181,2 script Employee#03 822,{
- mes "[Huang Jia Xian]";
- mes "Ehhhh...";
- mes "Forgive me...";
- mes "....................";
- mes "...Zzzzz...Zzzz...";
- close;
-}
-
-lou_in02.gat,58,183,4 script Chef Assistant 823,{
- mes "[Jin Wei Ling]";
- mes "I used to be";
- mes "an enthusiastic";
- mes "martial artist.";
- next;
- mes "[Jin Wei Ling]";
- mes "Although I became an";
- mes "assistant chef for a living, I";
- mes "always think of myself as a martial";
- mes "artist first.";
- next;
- mes "[Jin Wei Ling]";
- mes "So, I decided to reflect the spirit";
- mes "of the martial arts into my";
- mes "cooking. We are often very busy";
- mes "when there are many customers.";
- next;
- mes "[Jin Wei Ling]";
- mes "When we're busy I can use my";
- mes "martial arts to cook cuisine much";
- mes "more quickly! Hahaha~ Martial arts";
- mes "can be very practical!";
- next;
- mes "[Jin Wei Ling]";
- mes "Waaa-!!!!";
- misceffect 55;
- next;
- mes "[Jin Wei Ling]";
- mes "Waaa Taah-!!!!!";
- misceffect 11;
- next;
- mes "[Jin Wei Ling]";
- mes "Waaa...";
- mes "Waa Taaah-!!!!!";
- misceffect 121;
- next;
- mes "[Jin Wei Ling]";
- mes "^3131FF*Chop chop chop chop chop*^000000";
- donpcevent "Lounpc::OnEffect";
- next;
- mes "[Jin Wei Ling]";
- emotion e_no1;
- mes "Hahahaha! Look at these perfect";
- mes "vegetable slices! Muhahahaha!!";
- mes "I will continue to hone my martial";
- mes "arts through cooking!";
- close;
-}
-
-lou_in02.gat,58,181,2 script Lounpc 139,{
-OnEffect:
- misceffect 122;
- end;
-}
-
-louyang.gat,274,136,4 script Powerful-looking guy 819,{
- mes "[Akiira]";
- mes "I am practicing my 'Claw of";
- mes "Dragon.' I not only need to use the";
- mes "power of my fists, I must also";
- mes "condition myself spiritually.";
- next;
- mes "[Akiira]";
- mes "Every martial art requires";
- mes "spiritual training since the";
- mes "mind controls the body.";
- mes "If you've trained yourself";
- mes "spiritually, you can easily";
- mes "use any part of the body!";
- next;
- mes "[Akiira]";
- mes "If you are considering";
- mes "studying the martial arts, you";
- mes "should first attain knowledge";
- mes "before jumping into the";
- mes "physical training.";
- next;
- mes "[Akiira]";
- mes "Learn about the martial arts";
- mes "and meditate on life's truths.";
- mes "First, you must find peace of mind";
- mes "before you can hope to master the";
- mes "mind and body.";
- close;
-}
-
-louyang.gat,276,136,4 script Fist Master 819,{
- mes "[Zhiang Xiau Ji]";
- mes "Finally...";
- mes "I have mastered";
- mes "the 'Claw of Draon!'";
- next;
- mes "[Zhiang Xiau Ji]";
- mes "Although there are eight basic";
- mes "steps, I had to learn the history";
- mes "of this art, and meditate, focusing";
- mes "on my spiritual improvement,";
- mes "for three years";
- next;
- mes "[Zhiang Xiau Ji]";
- mes "After that, my master finally";
- mes "started to give me the physical";
- mes "training so I could use the eight";
- mes "steps of the Claw of Dragon. I've";
- mes "devoted myself to this art for thirty years.";
- next;
- mes "[Zhiang Xiau Ji]";
- mes "I'm very proud that I've";
- mes "mastered this art ten years earlier";
- mes "than I expected. Now I need to";
- mes "study this form and improve it by";
- mes "correcting its weak points and";
- mes "enhancing its strengths.";
- next;
- mes "[Zhiang Xiau Ji]";
- mes "I guess that would take me about";
- mes "ten years. But I'm not disheartened";
- mes "by that at all.";
- next;
- mes "[Zhiang Xiau Ji]";
- mes "When you're learning a martial art,";
- mes "you can't rush yourself and learn";
- mes "everything in a short period of";
- mes "time. It's impossible! Plus, that";
- mes "isn't the essence of ?";
- close;
-}
-
-louyang.gat,272,133,0 script Trainee::trainees 819,{
- mes "[Trainee]";
- switch(rand(12)){
- case 0:
- mes "Aha~!";
- mes "Hai~!!";
- mes "Huh...";
- close;
- case 1:
- mes "[Trainee]";
- mes "Woh~!";
- mes "Hai~!!";
- mes "Huh huh...";
- close;
- case 2:
- mes "Kyaa~";
- mes "Yah~~!!";
- mes ".......";
- close;
- case 3:
- mes "Hu~!";
- mes "Hu hu~~!!";
- mes "Hu...";
- close;
- case 4:
- mes "Wah?!";
- mes "Ahchiu~~!!";
- mes "Wah...";
- close;
- case 5:
- mes "Yaah~";
- mes "...!";
- mes "........!!";
- close;
- case 6:
- mes "Chongchiu!!";
- mes "Hu~~!!";
- mes "Hwooh~~";
- close;
- case 7:
- mes "Zhua loh~!";
- mes ".....";
- mes "Hu";
- close;
- case 8:
- mes "One hit~!";
- mes "Hai~!!";
- mes "Yah~!!";
- close;
- case 9:
- mes "Ai yah..";
- mes "Yaahah~~";
- mes "(rolls around)......";
- close;
- case 10:
- mes "Niu ah...";
- mes "One~~!!";
- mes "Two~~!!!";
- close;
- case 11:
- default:
- mes "Yeeah~!";
- mes "Ah I’m so tired~~!!";
- mes "(faints).....";
- close;
- }
-}
-
-louyang.gat,272,131,0 duplicate(trainees) Trainee#2 819
-louyang.gat,272,129,0 duplicate(trainees) Trainee#3 819
-louyang.gat,274,133,0 duplicate(trainees) Trainee#4 819
-louyang.gat,274,131,0 duplicate(trainees) Trainee#5 819
-louyang.gat,274,129,0 duplicate(trainees) Trainee#6 819
-louyang.gat,276,133,0 duplicate(trainees) Trainee#7 819
-louyang.gat,276,131,0 duplicate(trainees) Trainee#8 819
-louyang.gat,276,129,0 duplicate(trainees) Trainee#9 819
-louyang.gat,278,133,0 duplicate(trainees) Trainee#10 819
-louyang.gat,278,131,0 duplicate(trainees) Trainee#11 819
-louyang.gat,278,129,0 duplicate(trainees) Trainee#12 819
-
-
-
-lou_in01.gat,111,151,4 script Soldier#11 825,{
- mes "[Soldier]";
- mes "*Yawn* It's so boring here";
- mes "nowadays. Although, I hear that";
- mes "a long time ago, things were";
- mes "much different.";
- next;
- mes "[Soldier]";
- mes "Supposedly, monsters used to";
- mes "intrude Louyang all the time! Heh,";
- mes "but that's just rumor. Still,";
- mes "there are a bunch of rumors going";
- mes "around that I'm curious about...";
- close;
-}
-
-lou_in01.gat,91,151,4 script Soldier#12 825,{
- mes "[Soldier]";
- mes "....z..Z..z...";
- next;
- menu "Hey, wake up!",-;
- mes "[Soldier]";
- mes "Yeeeesss...Sir!";
- mes "I was not dozing off~";
- mes "Seerious...ly...";
- next;
- mes "[Soldier]";
- mes "...";
- next;
- mes "[Soldier]";
- mes "...";
- mes "......";
- next;
- mes "[Soldier]";
- mes "...";
- mes "......";
- mes "....z..Z..z...";
- close;
-}
-
-lou_in01.gat,82,139,6 script Soldier#13 825,{
- mes "[Soldier]";
- mes "There is nothing much, but if you";
- mes "wish to look around this room,";
- mes "please be my guest.";
- close;
-}
-
-lou_in01.gat,45,138,4 script Soldier#14 825,{
- mes "[Soldier]";
- mes "It's strange to see outsiders in";
- mes "this kind of place. We don't have";
- mes "any business with you,";
- mes "so move along.";
- close;
-}
-
-lou_in01.gat,102,144,4 script Soldier#15 825,{
- mes "[Soldier]";
- mes "People have been";
- mes "saying that there's";
- mes "a scammer at the entrance of town...";
- next;
- menu "...?",-;
- mes "[Soldier]";
- mes "But I went there and I didn't";
- mes "find anyone suspicious. I swear,";
- mes "everything seemed completely";
- mes "normal!";
- close;
-}
-
-lou_in01.gat,99,144,4 script Soldier#16 825,{
- mes "[Soldier]";
- mes "Ah, don't bother";
- mes "to listen to this";
- mes "guy beside of me.";
- next;
- mes "[Soldier]";
- mes "I hope you have a good time while";
- mes "you're staying in Louyang!";
- close;
-}
-
-lou_in01.gat,25,23,4 script Friendly Looking Lady 817,{
- mes "[Hong Miao]";
- mes "Welcome.";
- next;
- mes "[Hong Miao]";
- mes "This is an elevator which leads";
- mes "to the Observation Tower. We are";
- mes "providing you a safe and fast";
- mes "transfer service for an affordable";
- mes "fee. Would you like to use this ";
- mes "service?";
- next;
- menu "Information",-,"Yes",s_Yes,"Maybe next time.",s_Next_Time;
- mes "[Hong Miao]";
- mes "After many suggestions and";
- mes "proposals were sent to the Louyang";
- mes "tourism office, the Observation";
- mes "Tower was built do tourists";
- mes "can enjoy the sights.";
- next;
- mes "[Hong Miao]";
- mes "Due to the geographical";
- mes "features of Louyang, it's difficult";
- mes "to enjoy the breath taking view";
- mes "that our land has to offer.";
- next;
- mes "[Hong Miao]";
- mes "You can come up to the tower by";
- mes "taking the elevator right here. We";
- mes "are providing this quick and safe";
- mes "transfer service for 500 zeny per";
- mes "person.";
- close;
-s_Yes:
- mes "[Hong Miao]";
- if(zeny < 500){
- mes "I am sorry, but you don't have enough money.";
- close;
- }
- set Zeny,Zeny - 500;
- mes "Thank for your patronage.";
- mes "We are trying to provide you with";
- mes "the best service, Please";
- mes "come again.";
- close2;
- warp "lou_in01.gat",16,19;
- end;
-
-s_Next_Time:
- mes "[Hong Miao]";
- mes "Please come";
- mes "back later.";
- mes "Have a good day.";
- close;
-}
-
-louyang.gat,84,253,0 script Exit 111,{
-
- mes "^3131FFThere is some sort";
- mes "of descent apparatus.";
- mes "Would you like to use it?^000000";
- next;
- menu "Yes",-,"No",s_No;
- warp "lou_in01.gat",10,18;
- end;
-s_No:
- close;
-}
-
-lou_in02.gat,272,55,1 script Familiar-Looking Patient 86,{
-
- mes "[??????]";
- mes "*Cough cough...*";
- mes "Awww......www...";
- mes "Aww...wwww..";
- emotion e_dots;
- close;
+//===== eAthena Script =======================================
+//= Louyang City NPC's
+//===== By: ==================================================
+//= Vidar (1.0)
+//= Mass Zero (1.1)
+//= Dino9021, roughly translated by Celest (1.2)
+//= Mass Zero (1.3)
+//= MasterOfMuppets (2.0)
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 2.7b
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Official NPC's for Louyang city.
+//===== Additional Comments: =================================
+//= Originally made for Vidar
+//= 1.2 - Added official warp NPC's
+//= 1.3 - Fixed gramatical errors. (Like wtf's with the weird
+// texts celest? xD)
+//= 2.0 - Completely rewrote the current scripts based on iRO.
+// Added the 'Shouting Quest' and the 'Medicine Quest'
+//= 2.1 Optimized, made quest vars unique [Lupus]
+//= 2.1a minor fix, 2.1b Fixed Typo’s [Nexon]
+//= 2.2 Fixed exploits [Lupus]
+//= 2.2a Updated the color codes a little and fixed the shouting quest
+//= to broadcast green text.
+//= 2.2b A small fix to the shout quest npc in louyang field not warping you
+//= back up to the tower if you died or teleported out of there. [MasterOfMuppets]
+//= 2.3 A small fix, the code is so messy I can't believe I scripted it >.< [MasterOfMuppets]
+//= 2.4 Implemented a few more npcs, thanks to Prometheus for them. [MasterOfMuppets]
+//= 2.5 Implemented the Poison King quest, beware of potential bugs. [MasterOfMuppets]
+//= 2.6 Removed Duplicates [Silent]
+//= 2.6a Updated a few names with new item_db.txt names [Evera]
+//= 2.7 Split quests to quests/quests_louyang.txt [Evera]
+//= 2.7a Minor optimizations before Louyang quests [Lupus]
+//= 2.7b Moved guides to the Guides folder [Lupus]
+//============================================================
+
+alberta.gat,245,45,4 script Girl#02 815,{
+ mes "[Girl]";
+ mes "La la la la~";
+ mes "I feel so good today~";
+ mes "I'm in the mood to go";
+ mes "on a picnic somewhere~";
+ mes "La la la la~";
+ next;
+ menu "About Louyang.",-,"Go to Louyang.",M_GOTO,"Cancel.",M_CANCEL;
+
+ mes "[Girl]";
+ mes "Oh, are you";
+ mes "Interested in Louyang?";
+ mes "It's a nice place to";
+ mes "visit for travelers.";
+ next;
+ mes "[Girl]";
+ mes "Louyang has a long history";
+ mes "with stories of ancient magic and warriors. It's also rumored that many evil beasts roam the Louyang area";
+ next;
+ mes "[Girl]";
+ mes "You can find cure-all medicines, mysterious occurrences, and martial artists all in one place!";
+ next;
+ mes "[Girl]";
+ mes "I used to train in the martial arts every morning back when I was in Louyang. I might not look like it, but I'm pretty strong!";
+ next;
+ mes "[Girl]";
+ mes "If you want to visit";
+ mes "Louyang, feel free to";
+ mes "tell me. Just give me";
+ mes "some Zeny and we'll go~";
+ close;
+
+M_GOTO:
+ mes "[Girl]";
+ mes "I'll guide you to";
+ mes "Louyang right away.";
+ mes "For my service, I am";
+ mes "accepting 10,000 zeny";
+ next;
+ mes "[Girl]";
+ mes "So, are you ready?";
+ next;
+ menu "Sure",-,"Cancel",M_CANCEL2;
+
+ mes "[Girl]";
+ if(Zeny < 10000){
+ mes "...";
+ mes "You don't seem";
+ mes "to have 10,100 zeny...";
+ mes "Go get some money first!";
+ close;
+ }
+ mes "Okay~";
+ mes "Ready!";
+ mes "Have fun!";
+ close2;
+ set Zeny,Zeny-10000;
+ warp "lou_fild01.gat",190,101;
+ end;
+
+M_CANCEL:
+ mes "[Girl]";
+ mes "Oh...";
+ mes "Have a good day!";
+ close;
+
+M_CANCEL2:
+ mes "[Girl]";
+ mes "Oh...";
+ mes "It's so disappointing to hear you say that.";
+ mes "Well, have a good day!";
+ close;
+}
+
+lou_fild01.gat,190,100,1 script Girl#03 815,{
+ mes "[Girl]";
+ mes "You'd like to go back to Alberta?";
+ next;
+ menu "Go back to Alberta.",-,"Cancel.",M_CANCEL;
+
+ mes "[Girl]";
+ mes "I hope to";
+ mes "see you again!";
+ mes "Bye bye!";
+ close2;
+ warp "alberta.gat",235,45;
+ end;
+
+M_CANCEL:
+ mes "[Girl]";
+ mes "If you like this area, why don't you stay and enjoy the food and the sights!";
+ next;
+ mes "[Girl]";
+ mes "And by sights...";
+ mes "I mean girls!";
+ mes "Tee hee~";
+ close;
+}
+
+louyang.gat,261,123,4 script Chi Wu Ping 824,{
+ mes "[Chi Wu Ping]";
+ mes "I don't feel good...";
+ mes "So... Totally out of it...";
+ next;
+ mes "[Chi Wu Ping]";
+ mes "Oh, my aching body!";
+ mes "All my muscles are sore...";
+ mes "There's only one thing that could";
+ mes "cure all of this agonizing...";
+ mes "pain...";
+ next;
+ mes "[Chi Wu Ping]";
+ mes "Hey kid~!";
+ mes "You don't look like a local!";
+ mes "Why don't you follow the road ahead";
+ mes "and check out the big restaurant?";
+ next;
+ mes "[Chi Wu Ping]";
+ mes "The soup that they sell there is probably the healthiest food you can ever find.";
+ next;
+ mes "[Chi Wu Ping]";
+ mes "I guess you could eat";
+ mes "some of that soup";
+ mes "for your health.";
+ close;
+}
+
+lou_in02.gat,43,169,8 script Jiang Rong 827,{
+ mes "[Jiang Rong]";
+ mes "Dragon Soup is known for its spicy";
+ mes "yea sweet and refreshing taste.";
+ next;
+ mes "[Jiang Rong]";
+ mes "It's made with all sorts of";
+ mes "medicinal herbs, so it's good";
+ mes "for your health as well";
+ next;
+ mes "[Jiang Rong]";
+ mes "Dragon Soup draws out the";
+ mes "unnecessary heat created inside";
+ mes "the body and circulates the blood.";
+ mes "So it helps optimize the body'";
+ mes "functions and promotes longevity.";
+ next;
+ mes "[Jiang Rong]";
+ mes "I've eaten Dragon Soup regularly";
+ mes "ever since I was young. Look at me,";
+ mes "don't you think I look so healthy";
+ mes "considering my age?";
+ close;
+}
+
+lou_in02.gat,76,181,2 script Employee#03 822,{
+ mes "[Huang Jia Xian]";
+ mes "Ehhhh...";
+ mes "Forgive me...";
+ mes "....................";
+ mes "...Zzzzz...Zzzz...";
+ close;
+}
+
+lou_in02.gat,58,183,4 script Chef Assistant 823,{
+ mes "[Jin Wei Ling]";
+ mes "I used to be";
+ mes "an enthusiastic";
+ mes "martial artist.";
+ next;
+ mes "[Jin Wei Ling]";
+ mes "Although I became an";
+ mes "assistant chef for a living, I";
+ mes "always think of myself as a martial";
+ mes "artist first.";
+ next;
+ mes "[Jin Wei Ling]";
+ mes "So, I decided to reflect the spirit";
+ mes "of the martial arts into my";
+ mes "cooking. We are often very busy";
+ mes "when there are many customers.";
+ next;
+ mes "[Jin Wei Ling]";
+ mes "When we're busy I can use my";
+ mes "martial arts to cook cuisine much";
+ mes "more quickly! Hahaha~ Martial arts";
+ mes "can be very practical!";
+ next;
+ mes "[Jin Wei Ling]";
+ mes "Waaa-!!!!";
+ misceffect 55;
+ next;
+ mes "[Jin Wei Ling]";
+ mes "Waaa Taah-!!!!!";
+ misceffect 11;
+ next;
+ mes "[Jin Wei Ling]";
+ mes "Waaa...";
+ mes "Waa Taaah-!!!!!";
+ misceffect 121;
+ next;
+ mes "[Jin Wei Ling]";
+ mes "^3131FF*Chop chop chop chop chop*^000000";
+ donpcevent "Lounpc::OnEffect";
+ next;
+ mes "[Jin Wei Ling]";
+ emotion e_no1;
+ mes "Hahahaha! Look at these perfect";
+ mes "vegetable slices! Muhahahaha!!";
+ mes "I will continue to hone my martial";
+ mes "arts through cooking!";
+ close;
+}
+
+lou_in02.gat,58,181,2 script Lounpc 139,{
+OnEffect:
+ misceffect 122;
+ end;
+}
+
+louyang.gat,274,136,4 script Powerful-looking guy 819,{
+ mes "[Akiira]";
+ mes "I am practicing my 'Claw of";
+ mes "Dragon.' I not only need to use the";
+ mes "power of my fists, I must also";
+ mes "condition myself spiritually.";
+ next;
+ mes "[Akiira]";
+ mes "Every martial art requires";
+ mes "spiritual training since the";
+ mes "mind controls the body.";
+ mes "If you've trained yourself";
+ mes "spiritually, you can easily";
+ mes "use any part of the body!";
+ next;
+ mes "[Akiira]";
+ mes "If you are considering";
+ mes "studying the martial arts, you";
+ mes "should first attain knowledge";
+ mes "before jumping into the";
+ mes "physical training.";
+ next;
+ mes "[Akiira]";
+ mes "Learn about the martial arts";
+ mes "and meditate on life's truths.";
+ mes "First, you must find peace of mind";
+ mes "before you can hope to master the";
+ mes "mind and body.";
+ close;
+}
+
+louyang.gat,276,136,4 script Fist Master 819,{
+ mes "[Zhiang Xiau Ji]";
+ mes "Finally...";
+ mes "I have mastered";
+ mes "the 'Claw of Draon!'";
+ next;
+ mes "[Zhiang Xiau Ji]";
+ mes "Although there are eight basic";
+ mes "steps, I had to learn the history";
+ mes "of this art, and meditate, focusing";
+ mes "on my spiritual improvement,";
+ mes "for three years";
+ next;
+ mes "[Zhiang Xiau Ji]";
+ mes "After that, my master finally";
+ mes "started to give me the physical";
+ mes "training so I could use the eight";
+ mes "steps of the Claw of Dragon. I've";
+ mes "devoted myself to this art for thirty years.";
+ next;
+ mes "[Zhiang Xiau Ji]";
+ mes "I'm very proud that I've";
+ mes "mastered this art ten years earlier";
+ mes "than I expected. Now I need to";
+ mes "study this form and improve it by";
+ mes "correcting its weak points and";
+ mes "enhancing its strengths.";
+ next;
+ mes "[Zhiang Xiau Ji]";
+ mes "I guess that would take me about";
+ mes "ten years. But I'm not disheartened";
+ mes "by that at all.";
+ next;
+ mes "[Zhiang Xiau Ji]";
+ mes "When you're learning a martial art,";
+ mes "you can't rush yourself and learn";
+ mes "everything in a short period of";
+ mes "time. It's impossible! Plus, that";
+ mes "isn't the essence of ?";
+ close;
+}
+
+louyang.gat,272,133,0 script Trainee::trainees 819,{
+ mes "[Trainee]";
+ switch(rand(12)){
+ case 0:
+ mes "Aha~!";
+ mes "Hai~!!";
+ mes "Huh...";
+ close;
+ case 1:
+ mes "[Trainee]";
+ mes "Woh~!";
+ mes "Hai~!!";
+ mes "Huh huh...";
+ close;
+ case 2:
+ mes "Kyaa~";
+ mes "Yah~~!!";
+ mes ".......";
+ close;
+ case 3:
+ mes "Hu~!";
+ mes "Hu hu~~!!";
+ mes "Hu...";
+ close;
+ case 4:
+ mes "Wah?!";
+ mes "Ahchiu~~!!";
+ mes "Wah...";
+ close;
+ case 5:
+ mes "Yaah~";
+ mes "...!";
+ mes "........!!";
+ close;
+ case 6:
+ mes "Chongchiu!!";
+ mes "Hu~~!!";
+ mes "Hwooh~~";
+ close;
+ case 7:
+ mes "Zhua loh~!";
+ mes ".....";
+ mes "Hu";
+ close;
+ case 8:
+ mes "One hit~!";
+ mes "Hai~!!";
+ mes "Yah~!!";
+ close;
+ case 9:
+ mes "Ai yah..";
+ mes "Yaahah~~";
+ mes "(rolls around)......";
+ close;
+ case 10:
+ mes "Niu ah...";
+ mes "One~~!!";
+ mes "Two~~!!!";
+ close;
+ case 11:
+ default:
+ mes "Yeeah~!";
+ mes "Ah I’m so tired~~!!";
+ mes "(faints).....";
+ close;
+ }
+}
+
+louyang.gat,272,131,0 duplicate(trainees) Trainee#2 819
+louyang.gat,272,129,0 duplicate(trainees) Trainee#3 819
+louyang.gat,274,133,0 duplicate(trainees) Trainee#4 819
+louyang.gat,274,131,0 duplicate(trainees) Trainee#5 819
+louyang.gat,274,129,0 duplicate(trainees) Trainee#6 819
+louyang.gat,276,133,0 duplicate(trainees) Trainee#7 819
+louyang.gat,276,131,0 duplicate(trainees) Trainee#8 819
+louyang.gat,276,129,0 duplicate(trainees) Trainee#9 819
+louyang.gat,278,133,0 duplicate(trainees) Trainee#10 819
+louyang.gat,278,131,0 duplicate(trainees) Trainee#11 819
+louyang.gat,278,129,0 duplicate(trainees) Trainee#12 819
+
+
+
+lou_in01.gat,111,151,4 script Soldier#11 825,{
+ mes "[Soldier]";
+ mes "*Yawn* It's so boring here";
+ mes "nowadays. Although, I hear that";
+ mes "a long time ago, things were";
+ mes "much different.";
+ next;
+ mes "[Soldier]";
+ mes "Supposedly, monsters used to";
+ mes "intrude Louyang all the time! Heh,";
+ mes "but that's just rumor. Still,";
+ mes "there are a bunch of rumors going";
+ mes "around that I'm curious about...";
+ close;
+}
+
+lou_in01.gat,91,151,4 script Soldier#12 825,{
+ mes "[Soldier]";
+ mes "....z..Z..z...";
+ next;
+ menu "Hey, wake up!",-;
+ mes "[Soldier]";
+ mes "Yeeeesss...Sir!";
+ mes "I was not dozing off~";
+ mes "Seerious...ly...";
+ next;
+ mes "[Soldier]";
+ mes "...";
+ next;
+ mes "[Soldier]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Soldier]";
+ mes "...";
+ mes "......";
+ mes "....z..Z..z...";
+ close;
+}
+
+lou_in01.gat,82,139,6 script Soldier#13 825,{
+ mes "[Soldier]";
+ mes "There is nothing much, but if you";
+ mes "wish to look around this room,";
+ mes "please be my guest.";
+ close;
+}
+
+lou_in01.gat,45,138,4 script Soldier#14 825,{
+ mes "[Soldier]";
+ mes "It's strange to see outsiders in";
+ mes "this kind of place. We don't have";
+ mes "any business with you,";
+ mes "so move along.";
+ close;
+}
+
+lou_in01.gat,102,144,4 script Soldier#15 825,{
+ mes "[Soldier]";
+ mes "People have been";
+ mes "saying that there's";
+ mes "a scammer at the entrance of town...";
+ next;
+ menu "...?",-;
+ mes "[Soldier]";
+ mes "But I went there and I didn't";
+ mes "find anyone suspicious. I swear,";
+ mes "everything seemed completely";
+ mes "normal!";
+ close;
+}
+
+lou_in01.gat,99,144,4 script Soldier#16 825,{
+ mes "[Soldier]";
+ mes "Ah, don't bother";
+ mes "to listen to this";
+ mes "guy beside of me.";
+ next;
+ mes "[Soldier]";
+ mes "I hope you have a good time while";
+ mes "you're staying in Louyang!";
+ close;
+}
+
+lou_in01.gat,25,23,4 script Friendly Looking Lady 817,{
+ mes "[Hong Miao]";
+ mes "Welcome.";
+ next;
+ mes "[Hong Miao]";
+ mes "This is an elevator which leads";
+ mes "to the Observation Tower. We are";
+ mes "providing you a safe and fast";
+ mes "transfer service for an affordable";
+ mes "fee. Would you like to use this ";
+ mes "service?";
+ next;
+ menu "Information",-,"Yes",s_Yes,"Maybe next time.",s_Next_Time;
+ mes "[Hong Miao]";
+ mes "After many suggestions and";
+ mes "proposals were sent to the Louyang";
+ mes "tourism office, the Observation";
+ mes "Tower was built do tourists";
+ mes "can enjoy the sights.";
+ next;
+ mes "[Hong Miao]";
+ mes "Due to the geographical";
+ mes "features of Louyang, it's difficult";
+ mes "to enjoy the breath taking view";
+ mes "that our land has to offer.";
+ next;
+ mes "[Hong Miao]";
+ mes "You can come up to the tower by";
+ mes "taking the elevator right here. We";
+ mes "are providing this quick and safe";
+ mes "transfer service for 500 zeny per";
+ mes "person.";
+ close;
+s_Yes:
+ mes "[Hong Miao]";
+ if(zeny < 500){
+ mes "I am sorry, but you don't have enough money.";
+ close;
+ }
+ set Zeny,Zeny - 500;
+ mes "Thank for your patronage.";
+ mes "We are trying to provide you with";
+ mes "the best service, Please";
+ mes "come again.";
+ close2;
+ warp "lou_in01.gat",16,19;
+ end;
+
+s_Next_Time:
+ mes "[Hong Miao]";
+ mes "Please come";
+ mes "back later.";
+ mes "Have a good day.";
+ close;
+}
+
+louyang.gat,84,253,0 script Exit 111,{
+
+ mes "^3131FFThere is some sort";
+ mes "of descent apparatus.";
+ mes "Would you like to use it?^000000";
+ next;
+ menu "Yes",-,"No",s_No;
+ warp "lou_in01.gat",10,18;
+ end;
+s_No:
+ close;
+}
+
+lou_in02.gat,272,55,1 script Familiar-Looking Patient 86,{
+
+ mes "[??????]";
+ mes "*Cough cough...*";
+ mes "Awww......www...";
+ mes "Aww...wwww..";
+ emotion e_dots;
+ close;
} \ No newline at end of file
diff --git a/npc/cities/lutie.txt b/npc/cities/lutie.txt
index f7df58d63..2a9bb1215 100644
--- a/npc/cities/lutie.txt
+++ b/npc/cities/lutie.txt
@@ -1,962 +1,962 @@
-//===== eAthena Script =======================================
-//= Lutie Town
-//===== By: ==================================================
-//=
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 Edited some text and updated/enabled some triggers
-//= for the quest.[kobra_k88]
-//= 1.2 Fixed exploit. Checked for Bard Job Quest compatibility [Lupus]
-//= 1.3 Fixed typo’s [Nexon] 1.4 Fixed exploit [Lupus]
-//= 1.5 Fixed a bug that could reset Lutie quest state [Lupus]
-//============================================================
-
-
-//=====================================================
-// Getting To Lutie
-//=====================================================
-aldebaran.gat,168,168,4 script Mr. Claus 718,{
- mes "[Mr. Claus]";
- mes "Merry Christmas!!";
- mes "I wish you all happiness!";
- next;
- menu "Where are you from?",L0, "Take me to ^5533FF'Lutie'^000000",L1, "Cancel",LEnd;
-
- L0:
- mes "[Mr. Claus]";
- mes "I come from ^3355FF'Lutie'^000000,the Fantastic Christmas Town!!";
- mes "There it is Christmas all year round, with delicious cakes,";
- mes "and toys as far as the eye can see.";
- next;
- mes "[Mr. Claus]";
- mes "Happiness and joy fills the city! It is a magical place to be!";
- mes "Doesn't this place sound fantastic?";
- next;
- mes "[Mr. Claus]";
- mes "Then what are you waiting for?! Just say the word and I'll take";
- mes "you to Lutie right away! You might even meet the big boss Santa";
- mes "Claus.";
- close;
- L1:
- mes "[Mr. Claus]";
- mes "So you're ready to go to the greatest place in the world?";
- next;
- mes "[Mr. Claus]";
- mes "Ok then, off you go to enjoy the fun and excitement that Lutie";
- mes "Has to offer!";
- close2;
- warp "xmas_fild01.gat",78,68;
- end;
- LEnd:
- mes "[Mr. Claus]";
- mes "Well... if you want to visit Lutie, just let me know anytime.";
- mes "Merry Christmas!! Merry Christmas!!";
- close;
-}
-
-
-//=====================================================================
-// NPCs inside
-//=====================================================================
-
-// Mima
-//============================================================
-xmas_in.gat,27,103,4 script Mima 701,{
- if(xmas_npc==5) goto Xmas5;
- if(xmas_npc==6) goto Xmas6;
- if(xmas_npc==7) goto Xmas7;
- if(xmas_npc==8) goto Xmas8;
- mes "[Mima]";
- mes "Merry Christmas!";
- mes "I can feel the spirit of Christmas surrounding me whenever I look,";
- mes "at the young strangers out there... I wish you a merry Christmas!";
- next;
- mes "[Mima]";
- mes "There is an abandoned ^5533FFToy Factory^000000 here in town. It";
- mes "looks quite interesting, however....";
- next;
- mes "[Mima]";
- mes "Recently I've noticed that many monsters have taken residence";
- mes "inside of the factory. Some of them look like the monsters found";
- mes "outside of town... I mean they look completely identical!!";
- next;
- mes "[Mima]";
- mes "Even though they look similar, they actually are not the same. For";
- mes "some reason these monsters have different characteristics from the";
- mes "ones found outside. Some of them are very unique and it seems that";
- mes "their offspring are adapting to the environment here.";
- next;
- mes "[Mima]";
- mes "... Oh I almost forgot, I have to go make some";
- mes "kimchi(spicy pickled cabbage)... mmm.. Chocolate kimchi is my";
- mes "favorite!";
- next;
- mes "[Mima]";
- mes "Between each slice of kimchi, I spread on a special chocolate which";
- mes "melts rather easily. The rest is a family secret.... hehe.";
- close;
-
-Xmas5:
- mes "[Mima]";
- mes "Hmmm? Hairy Uncle Ken told you about me, didn't he? Well well, I";
- mes "know what he's thinking... Hoo hoo! He intends to make me feel";
- mes "happy and expects me to give him some free jars of kimchi!";
- mes "Hoo hoo, oh well.";
- next;
- mes "[Mima]";
- mes "He knows too much about me... I can't stop him from getting some";
- mes "of my kimchi. Yes yes. Even I know my kimchi is the best in town!";
- mes "Whoo? The story of ^3355FF'Jack Frost'^000000? Oh... Yes yes, I see.";
- next;
- mes "[Mima]";
- mes "But I can't just tell you his story.... As you know the most";
- mes "powerful human beings are aunties! And I'm one of them! They never";
- mes "allow others to take advantage of them. As they say, 'There is no";
- mes "such thing as a free lunch'. So I have a favour to ask of you.";
- mes "Jack Frost has been keeping something for me.....";
- next;
- mes "[Mima]";
- mes "Would you please bring it back to me? ^3355FF'The roughest salt in";
- mes "the world'^000000. It is an essential ingredient for pickling";
- mes "cabbages. Just tell him I sent you and he will understand.";
- next;
- mes "[Mima]";
- mes "He will give you my salt. Now dear, hurry up. Return Quickly.";
- set xmas_npc,6;
- close;
-Xmas6:
- mes "[Mima]";
- mes "Hohohoho -";
- mes "Let's see... Huh? Didn't you yet bring it?";
- mes "Oh my goodness, my cabbages will get sour soon!";
- mes "( ? )";
- mes "Hurry up, Chop Chop -!!";
- next;
- mes "[Mima]";
- mes "*sigh* You are really a scatterbrained person, my dear...";
- mes "I said BRING ME ^3355FF' THE ROUGHEST SALT IN THE WORLD '^000000";
- mes "!!!!!!!! Leave now and hurry up!";
- close;
-Xmas7:
- mes "[Mima]";
- mes "Hohohohoh hohohohoho !";
- mes "Let's see Let's see...... Thank you my dear, Thank you!";
- next;
- mes "-Handed ^3355FF' The roughest salt in the world'^000000 to her-";
- set xmas_npc,8;
- next;
- mes "[Mima]";
- mes "Now I am able to pickle my cabbages properly. Thank you my dear,";
- mes "Thank you . . . . . Hooo? Ahhh yes, sorry, I almost forgot I";
- mes "promised you... Yes I remember you asked me about Jack Frost's";
- mes "gift bag, didn't you?";
- next;
- mes "[Mima]";
- mes "If you already met Uncle Hairy Uncle Ken you must know by now,";
- mes "Jack Frost has been made out of some mysterious snow covering up";
- mes "a thick-grass filed of magical force,";
- next;
- mes "[Mima]";
- mes "I can't tell you what the reason was, but I figured out Jack Frost";
- mes "came to possess the gift bag within, due to the strange reaction";
- mes "between alchemy items used by Great alchemist and its original";
- mes "structure material, the mysterious snow.";
- next;
- mes "[Mima]";
- mes "Aside from it, the gift bag creates present as many as Jack Frost";
- mes "wants. It seems like something magical grants Jack Frost with";
- mes "the same ability of Santa Claus. If this power fell into bad man's";
- mes "hands, we would probably be in trouble, but everybody knows that";
- mes "Jack Frost is very nice and innocent creature... We've never";
- mes "worried about his unique ability...";
- next;
-Xmas8:
- mes "[Mima]";
- mes "Hohohoho . . Ah and, lately I've heard some surprising news from";
- mes "^3355FF'Howie'^000000 the clown. It is an interesting story... If you're";
- mes "interested, why don't you go meet him?";
- close;
-}
-
-// Santa Claus
-//===================================================================
-xmas_in.gat,100,96,4 script Father Christmas::Santa1 718,{
- if(@talkedsanta == 1) goto L_Xmas1;
- mes "[Santa Claus]";
- mes "Ho Ho Ho~";
- mes "Meeerry Christmas !!";
- next;
- mes "[Santa Claus]";
- mes "Ho Ho Ho~";
- mes "I am a Santa Claus, and I bring gifts to every boy and girl on";
- mes "Christmas!";
- next;
- mes "[Santa Claus]";
- mes "Ho Ho Ho~";
- mes "If for some reason you wish to leave the wonderful town of Lutie,";
- mes "just head south of town. You'll find a warp that will lead you";
- mes "back to Al De Baran.";
- next;
- mes "[Santa Claus]";
- mes "Ho Ho Ho~ Merry Christmas !!";
- mes "Merry Christmas!!";
- if(xmas_npc==0) set @talkedsanta, 1;
- close;
-
-L_Xmas1:
- mes "[Santa]";
- mes "I'm Santa Claus.";
- mes "I have a present for you, let me look in my bag.";
- next;
- mes "[Santa]";
- mes "Yep, I've got a present with your name on it.";
- mes "Here you are!";
- next;
- set @temp, rand(1,4);
- if (@temp == 2) goto L_2;
- if (@temp == 3) goto L_3;
- if (@temp == 4) goto L_4;
-
- getitem 529,5;
- goto L_End;
-L_1:
- getitem 530,3;
- goto L_End;
-L_2:
- getitem 528,1;
- if(xmas_npc==0) set xmas_npc, 1;
- set @talkedsanta, 0;
- mes "[Santa]";
- mes "Hmm, you must not have been a very good";
- mes "person this year. Do better!";
- close;
-L_3:
- getitem 539,2;
- goto L_End;
-L_4:
- getitem 539,1;
-L_End:
- if(xmas_npc==0) set xmas_npc, 1;
- set @talkedsanta, 0;
- mes "[Santa]";
- mes "Hope you like your present!";
- mes "My elves made it especially for you.";
- close;
-}
-
-// Debra
-//==================================================================
-xmas_in.gat,165,173,4 script Debra 711,{
- if(xmas_npc==1 || xmas_npc==2) goto Xmas1;
- mes "[Debra]";
- mes "Merry Christmas!";
- mes "Welcome to Lutie!";
- next;
- mes "[Debra]";
- mes "Have you ever talked to the snowman in front of this town?";
- mes "Snowman in solitude, made of White Snow....";
- next;
- mes "[Debra]";
- mes "However he got a warm heart. Sometimes I talk to ' Jack Frost '";
- mes "the snowman. Without reason.. even though he is a snowman,";
- mes "He can understand and stand to listen to us";
- next;
- mes "[Debra]";
- mes ". . . . .";
- mes "When I talk to Jack Frost, I get to wonder about many things of";
- mes "him and feel something mysterious, I assume you will be the same";
- mes "as me, if you try to talk to him.";
- next;
- mes "[Debra]";
- mes "like how he has been created, who granted him to posses the heart";
- mes "of human and can talk,";
- next;
- mes "[Debra]";
- mes "Where he was from, That place has a lot of snow all the time or";
- mes "not... how he came to arrive this town without legs...";
- next;
- mes "[Debra]";
- mes "Lately in this town,";
- mes "it seems the number of curious people coming to him gets increased.";
- mes "If you still couldn't solve his secret after talking with him";
- next;
- mes "[Debra]";
- mes "I suggest you to talk to other towners...";
- if(xmas_npc==0) goto Xmas0;
- close;
-
- Xmas0:
- mes "Ah!... I almost forgot you to tell... Santa Claus lives here in";
- mes "this town....";
- next;
- mes "[Debra]";
- mes "Didn't you see him yet? Why don't you go meet him then? Take";
- mes "care now! Merry Christmas!!";
- close;
-
- Xmas1:
- mes "[Debra]";
- mes "Merry Christmas!";
- mes "Welcome to Lutie!";
- next;
- mes "[Debra]";
- mes "You got a present from Santa Claus?! You must be really exited!";
- mes "Ha ha! Have you ever heard that we have a person equally as";
- mes "famous as Santa Claus here?";
- next;
- mes "[Debra]";
- mes "That person is ^3355FF'Jack Frost'^000000 the mysterious snowman,";
- mes "who can communicate with humans.";
- next;
- mes "[Debra]";
- mes "Yet you didn't meet Jack Frost yet? I think you should try to";
- mes "talk to him at least once... Well then, Merry Christmas!!";
- set xmas_npc,2;
- close;
-}
-
-
-//=======================================================================
-// NPC's Outside
-//=======================================================================
-
-// Peterson
-//=========================================================
-xmas.gat,117,304,4 script Peterson 713,{
- if((xmas_npc==3) || (xmas_npc==4)) goto Xmas34;
- mes "[Peterson]";
- mes "Merry Christmas!";
- next;
- mes "[Peterson]";
- mes "Here in Lutie, it's always Christmas 24 hours a day and 365";
- mes "days a year, Christmas is celebrated non stop here! This beautiful";
- mes "city fills your heart with the joyous spirit of Christmas...";
- next;
- mes "[Peterson]";
- mes "Walk around town and you will see... this city has some of the";
- mes "best facilities and attractions of any other place.";
- next;
- mes "[Peterson]";
- mes "Lutie is a great place for those who don't want to worry about";
- mes "anything. So may happiness be with you... Merry Christmas!!";
- close;
-
-Xmas34:
- mes "[Peterson]";
- mes "Did ^3355FF'Jack Frost'^000000 tell you about me? Oh I see... he is a";
- mes "snowman who has no legs. It's a shame he can't come here to see";
- mes "me... I appreciate you to coming here for him. I will visit him";
- mes "someday.";
- next;
- mes "[Peterson]";
- mes "There is a man who knows about Jack Frost's secret.....";
- mes "That man is ^3355FF'Hairy Uncle Ken'^000000... Yes, he definitely knows...";
- next;
- mes "[Peterson]";
- mes "One day when an apprentice of the great alchemist visited Lutie,";
- mes "I listened to the conversation between Hairy Uncle Ken and";
- mes "Jack Frost.";
- next;
- mes "[Peterson]";
- mes "Once upon a time, a great alchemist came to Jack Frost's home";
- mes "land and found him dying and melting away into water. He revived";
- mes "him with several ores of magic and some other things.....";
- next;
- mes "[Peterson]";
- mes "Well, as far as the details of the story, I recommend you listen";
- mes "to what ^3355FF'Hairy Uncle Ken'^000000 has to say.";
- set xmas_npc,4;
- close;
-}
-
-// Hairy Uncle Ken
-//==========================================================
-xmas.gat,176,236,4 script Hairy Uncle Ken 712,{
- if(xmas_npc==4) goto Xmas4;
- if(xmas_npc==5) goto Xmas5;
- mes "[Hairy Uncle Ken]";
- mes "Meeeerrrrrrryyyy Christmas !";
- mes "Welcome to the Christmas Town!!";
- mes "Your face is glowing... The weather here is really ... Cold!";
- mes "And it's so cold that it makes you look like........";
- next;
- mes "[Hairy Uncle Ken]";
- mes "A ^3355FF' Red Little Apple '^000000,";
- mes "HarHarHarHar!";
- mes "Try not to catch a cold. The flu in Lutie is very strong.......";
- next;
- mes "[Hairy Uncle Ken]";
- mes "... Speaking of the cold, that reminds me...";
- next;
- mes "[Hairy Uncle Ken]";
- mes "My kid recently caught a serious cold.... It happened at midnight";
- mes "and all the pharmacies were closed. I was desperate so I went to";
- mes "the abandoned ^5533FFToy Factory^000000 .......";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Little monster were running around all over... even ^5533FFIce Porings^000000!";
- mes "People here often call them Ice Ball Porings... anyways I grabbed";
- mes "one of them and ran back to the house. I put it on top of my";
- mes "childs head...";
- next;
- mes "[Hairy Uncle Ken]";
- mes "And what do you know... his fever cooled down right away! Heh! This";
- mes "is such a convenient village to live in. I've talked too much....";
- mes "Good luck to you!";
- close;
-
-Xmas4:
- if(countitem(1024)>0 && countitem(938)>0) goto XmasL0;
- mes "[Hairy Uncle Ken]";
- mes "Oh yeah ? Peterson told you to come speak to me, did he?";
- mes "Haw Haw Haw ! ! Yeah, yeah, I know him a little bit . .";
- mes "To be honest, you can say I'm his weak point!";
- mes "Cause I know the secret of ^3355FF'Jack Frost's birth'^000000!!";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Are you curious about it? *Chuckles* Yeah, I can tell by your face.";
- mes "However! Don't think that I'd tell you this secret for nothing...";
- mes "Come to think of it... I am feeling really thirsty now....";
- mes "Bring me ^3355FF'1 Squid Ink'^000000 and ^3355FF'1 Sticky Muscus'^000000!!!";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Wahhahaha! Don't look at me like that! My tastes are none of your";
- mes "business!!! Start finding a way to get me what I want, otherwise";
- mes "...... you won't get what YOU want.... *Chuckles*";
- close;
-
- XmasL0:
- delitem 1024,1;
- delitem 938,1;
- mes "[Hairy Uncle Ken]";
- mes "Oh ?! *Chuckles* !! You seem to be a reliable person..";
- mes "Good! Ok, first I need something to drink....";
- next;
- mes "^3355FF- Handed him Squid Ink and -^000000";
- mes "^3355FF- Sticky Muscus. -^000000";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Burrrrpppp - Ok now ! Well now, it's the time for my story...";
- mes "Keep in mind this is the story from what I know......";
- mes "I am not sure how much you heard about this though . .";
- next;
- mes "[Hairy Uncle Ken]";
- mes "A long, long, time ago, there was a great Alchemist living in";
- mes "the far north. His name was ^3355FF' Philip Varsez '^000000 !!";
- next;
- mes "[Hairy Uncle Ken]";
- mes "He was eager to keep beyond the bounds of new alchemy,";
- mes "and new alchemy needed rare materials to be accomplished as";
- mes "he wanted. So he decided to go travel all over the world to";
- mes "look for items possessing Strong Magic Force within.";
- mes "Eventually he arrived at a village of freezing weather,";
- mes "somewhere up north...";
- next;
- mes "[Hairy Uncle Ken]";
- mes "As immediately came inside the village he encountered a grim";
- mes "scene..... Everything was destroyed.... there was nothing left.";
- mes "People groaned and moaned in pain, and were dying...";
- mes "It was the worst scene he'd ever witnessed.";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Suddenly some strange force caught his attention.... That";
- mes "strange thing was a snowman that was melting down into water";
- mes "....^3355FF' Jack Frost '^000000! Even more astonishing was";
- mes "the fact that it held 2 crying babies in its arms. So the";
- mes "great alchemist could assumed the snowman sacrificed itself to";
- mes "protect them from great danger.";
- next;
- mes "[Hairy Uncle Ken]";
- mes "It touched the Alchemist to see that, and he decided to save";
- mes "the life of snowman with his great power of alchemy. He";
- mes "transported the snowman to Lutie, this Christmas Town, the";
- mes "safest place in this world.";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Some time later, rumors began to circulate that not only was";
- mes "Jack Frost saved by the mercy of the Alchemist, but also";
- mes "because of the snow that Jack Frost was made out of.";
- next;
- mes "[Hairy Uncle Ken]";
- mes "The truth is, Jack Frost was made out of snow covering up the";
- mes "mysterious field where Magical flowers and plants grew all";
- mes "over.";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Muhahaha -";
- mes "Alrighty then... this is the whole story as far as I know.";
- mes "How about you now? Did my story satisfy you? Haw Haw Haw!!";
- next;
- mes "[Hairy Uncle Ken]";
- mes "Oh well... Now I regret to say, I have no idea about the";
- mes "special ability that Jack Frost has that creates unlimited";
- mes "Christmas presents...";
- next;
- Xmas5:
- mes "[Hairy Uncle Ken]";
- mes " ^3355FF' Mima '^000000 the excellent kimchi maker";
- mes "knows about it through and through... If you're interested";
- mes "you'd better to go visit her. Alrighty, Merry Christmas !!";
- set xmas_npc,5;
- close;
-}
-
-// Jack Frost
-//====================================================================
-xmas.gat,134,112,4 script Jack Frost 710,{
- mes "[Jack Frost]";
- if(xmas_npc==2) goto Xmas2;
- if(xmas_npc==3) goto Xmas3;
- if(xmas_npc==4) goto Xmas4;
- if(xmas_npc==5) goto Xmas5;
- if(xmas_npc==6) goto Xmas6;
- if(xmas_npc==7) goto Xmas7;
- if(xmas_npc==8) goto Xmas8;
- if(xmas_npc==9) goto Xmas9;
- if(xmas_npc==10) goto Xmas10;
- if(xmas_npc==11) goto Xmas11;
- mes "*sob*sob*........ I'm so lonely..... I can't go anywhere! I";
- mes "am stuck here day and night... frozen to this cold earth....";
- emotion e_sob;
- next;
- menu "^0000FFJack Frost?^000000",L0, "A secret Toy Factory?",L1, "...............",LEnd;
-
- L0:
- mes "[Jack Frost]";
- mes "I was created by a human..... A giant snow doll is what some call me.....";
- mes "I remember being born somewhere very cold......";
- next;
- mes "[Jack Frost]";
- mes "Just like Lutie, this is a chilly little town.... I used to be happy up north but.......";
- next;
- mes "[Jack Frost]";
- mes "On day a horrible old lady came to my village...... Her name was.... ^790079'Mariposum'^000000......";
- mes "I heard she came from some place extremely hot..... Some weird village in some kind of cave.";
- next;
- mes "[Jack Frost]";
- mes "On the fourth night after she arrived here, she went to central square.......";
- mes "Without warning she started casting horrible spells....... Suddenly a huge storm emerged.....";
- next;
- mes "[Jack Frost]";
- mes "Almost immediately the powerful storm knocked my friend and I unconscious........";
- next;
- mes "[Jack Frost]";
- mes "I don't know how long I was out, but when I woke up I found myself right here in Lutie..........";
- next;
- mes "[Jack Frost]";
- mes "But my friends were not...... I have lost all of my friends.......... I feel so lonely.......";
- emotion e_sob;
- close;
- L1:
- mes "[Jack Frost]";
- mes "Somewhere in Lutie there is a place that looks just like a ^5533FFToy";
- mes "Factory^000000....... It's well decorated and looks like a lot of";
- mes "fun but.......";
- next;
- mes "[Jack Frost]";
- mes "I heard that it is overrun with possessed toy soldiers and gift";
- mes "boxes........";
- next;
- mes "[Jack Frost]";
- mes "Part of me is intrigued by this place and I would like to see it";
- mes "just once..... But part of me is also a little frighten of the";
- mes "possessed toys.....";
- close;
- LEnd:
- mes "[Jack Frost]";
- mes "So long! Come visit me any time. Merry Christmas!";
- close;
-
-Xmas2:
- mes "Did you hear something from 'Debra'? Heh heh... the people of";
- mes "Lutie call me a mysterious Snowman... honestly I am nothing but";
- mes "a simple snowman... heh heh.";
- next;
- mes "[Jack Frost]";
- mes "Besides I don't even know who I really am. Maybe I know as much";
- mes "about myself as do the people here.";
- next;
- mes "[Jack Frost]";
- mes "Mr.^3355FF'Peterson'^000000 gave me his name card and told me to visit";
- mes "him whenever I wanted to.... but as you can see.....";
- next;
- mes "[Jack Frost]";
- mes "I don't have any legs so I can't go anywhere..... ";
- emotion e_sob;
- next;
- mes "[Jack Frost]";
- mes "How did I get here...? Why can I communicate with humans...?";
- mes "How can I......??";
- next;
- mes "^3355FF- Jack Frost falls deep into his thoughts -^000000";
- mes "^3355FF- He is looking at 'Peterson's' name card -^000000";
- set xmas_npc,3;
- close;
-Xmas3:
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^3355FF- Jack Frost falls deep into his thoughts -^000000";
- mes "^3355FF- He is looking at 'Peterson's' name card -^000000";
- close;
-Xmas4:
- mes "Did you meet 'Peterson'? He is a honest and diligent guy . .";
- mes "And I know . . He fell in love with 'Debra'....";
- mes "hehehehehe...";
- next;
- mes "[Jack Frost]";
- mes "I think 'Debra' needs to be more generous. She is very kind to";
- mes "everyone, except Peterson. But I know... Debra likes Peterson";
- mes "as much as he does here...";
- close;
-Xmas5:
- mes "You spoke with ^3355FF'Hairy Uncle Ken '^000000?";
- mes "Hairy Uncle Ken has loud voice, and doesn't take showers.....";
- mes "he smells kinda bad.... but he is a very funny and diligent guy.";
- mes "Everybody likes him.";
- next;
- mes "[Jack Frost]";
- mes "He enjoys drinking some strange kind of drink......";
- mes "They say it is a miracle that he doesn't have a stomachache.";
- mes "Heh~ . .I love this guy too . .";
- close;
-Xmas6:
- mes "Hmmm you did you meet ^3355FF'Mima'^000000, the kimchi expert?";
- mes "Yeah yeah. I've been keeping this for here. Here you go, It is";
- mes "the salt she wants.";
- next;
- set xmas_npc,7;
- mes "^3355FF' Got the roughest salt in the world'^000000.";
- next;
- mes "[Jack Frost]";
- mes "I like her cooking because it is so delicious.";
- mes "Sometimes she offers me cups of ice flakes with grape syrup...";
- next;
- mes "[Jack Frost]";
-Xmas7:
- mes "^3355FF' The roughest salt in the world '^000000";
- mes "hopefully you will deliver it safely to her . .";
- close;
-Xmas8:
- mes "Boring Clown 'Howie'... At first glance, he looks a dumb,";
- mes "talent less clown..... But he has a pure heart and is always";
- mes "taking care of the 2 orphans...";
- close;
-Xmas9:
- mes "'Charlie ' the boy of optimism.";
- mes "He will become a big shot in future . .";
- mes "Just like me ! -";
- mes "Hahahaha . . . . .";
- close;
-Xmas10:
- mes ". . . . . Thank you for listening to me so far.";
- mes "I very much appreciate you trying to understand me,";
- mes "even though you are a stranger here.";
- next;
- mes "[Jack Frost]";
- mes "I think you know more about me than anyone else in this town.";
- mes "Hahahaha.... I want to give you a small present in return.";
- next;
- mes "[Jack Frost]";
- mes "Tah dah!! Pick up anything you want in here - !!";
- next;
- mes "^3355FF- Stir the gift bag -^000000";
- next;
-
- //it's a part of Bard Job Quest also
- set xmas_npc,11;
-
- set @temp, rand(1,8);
- if(@temp == 2) goto L_Prize2;
- if(@temp == 3) goto L_Prize3;
- if(@temp == 4) goto L_Prize4;
- if(@temp == 5) goto L_Prize5;
- if(@temp == 6) goto L_Prize6;
- if(@temp == 7) goto L_Prize7;
- if(@temp == 8) goto L_Prize8;
-
- L_Prize1:
- getitem 529,5;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 5 Candy -^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize2:
- getitem 529,10;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 10 Candy -^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize3:
- getitem 530,5;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 5 Candy Cane-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize4:
- getitem 530,10;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 10 Candy Cane-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize5:
- getitem 539,1;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 1 Piece of Cake-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize6:
- getitem 539,2;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 2 Piece of Cake-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize7:
- getitem 538,5;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 5 Cookie-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
- L_Prize8:
- getitem 538,10;
- mes "[Jack Frost]";
- mes "Wow -Congratulations!!";
- mes "^3355FF- 10 Cookie-^000000!";
- mes "Dear my friend,";
- mes "Please visit me from time to time, and take a chitchat with me.";
- mes "See you soon -";
- mes "Merry Christmas!!";
- close;
-Xmas11:
- mes "Welcome dear my friend -";
- mes "You are always welcomed in this Christmas Town.";
- mes "Especially by me, Jack Frost !";
- mes "Merry Christmas !!";
- close;
-}
-
-// Howie the Clown
-//=====================================================================
-xmas.gat,146,136,4 script Howie the Clown 715,{
- mes "[Howie]";
- mes "Meeee~RrrrrYYYY Christmas~!";
- mes "La La La! La La La La!~";
- mes "Dum di Dum di Dum";
- next;
- menu "Hey, Clown, what are you doing?",L0, "About the Snowman",L1, "Quit conversation",LEnd;
-
- L0:
- mes "[Howie]";
- mes "La La La~ Dum di Dum di Dum........ Huh?.....";
- next;
- mes "[Howie]";
- mes "Oh, I'm working on a show to entertain two lovely kids....";
- mes "^5533FFCharlie and Marsha^000000.... and it's not easy!";
- next;
- mes "[Howie]";
- mes "Beleive it or not you have to be smart, talented, and of course";
- mes "funny to be a clown. It's getting tougher and tougher to make kids";
- mes "laugh nowadays.... they just get bored so easily.... *sigh*";
- next;
- mes "[Howie]";
- mes "So I have to push myself to be more creative.... to act funnier and";
- mes "talk funnier...... to make them laugh out loud!!";
- next;
- mes "[Howie]";
- mes "HaHaHaHa! HeHeHeHeHe! HoHoHoHoHo! Merry Christmas!!";
- close;
- L1:
- if(xmas_npc==8 || xmas_npc==9) goto Xmas8;
- mes "[Howie]";
- mes "You mean ^5533FF' Jack Frost '^000000? Of course I know him. Everyone";
- mes "knows Jack Frost the Snowman. Sometimes I go and chat with him.";
- next;
- mes "[Howie]";
- mes "I even do performances for him. But I'm not quite sure if he likes";
- mes "them.... cause whenever I finish my act.... He doesn't seem to have";
- mes "any kind of reaction to it.....";
- next;
- mes "[Howie]";
- mes "How could he not like an amazing show like mine??";
- emotion e_hmm;
- next;
- mes "[Howie]";
- mes "There's something strange about Jack Frost.... anyways...";
- mes "La La La~ Dum di Dum di Dum";
- mes "Merry Christmas- !!";
- close;
-
- Xmas8:
- mes "[Howie]";
- mes "Dum di Dum di Dum... Ah ha ! I assume you're here because of";
- mes "Jack Frost? Well, after all it is nothing peculiar....";
- next;
- mes "[Howie]";
- mes "It's about two naughty kids, ^3355FF'Charlie'^000000 and ^3355FF'Marsha'^000000,";
- mes "they are regular viewers of my show. Did you heard about the";
- mes "incindent happened in the northland from Hairy Uncle Ken by any";
- mes "chance?";
- next;
- mes "[Howie]";
- mes ". . . . . Then hopefully you will remember the 2 babies, whom";
- mes "Jack Frost carried in his arms...while his body melted away...";
- next;
- mes "[Howie]";
- mes "You guessed it... the 2 babies were Charlie and Marsha. They";
- mes "don't seem to know about this. Jack Frost told me their story...";
- mes "He used his body to block the big giant fire ball rushing towards";
- mes "the 2 babies....";
- next;
- mes "[Howie]";
- mes "Jack Frost made the ultimate sacrifice for Charlie and Marsha....";
- mes "I can see you are quite interested in the story of Jack Frost,";
- mes "why don't you go meet those 2 children for more information?";
- next;
- mes "[Howie]";
- mes "They might tell you some story we've never got the chance to hear.";
- mes "Ok then, good luck! Bye bye!";
- set xmas_npc,9;
- close;
- LEnd:
- mes "[Howie]";
- mes "La La La... Dum di Dum di Dum";
- mes "Merry Christmas! Have a great day!";
- close;
-}
-
-// Charlie
-//================================================================
-xmas.gat,206,168,4 script Charlie 706,{
- if(xmas_npc==9) goto Xmas9;
- mes "[Charlie]";
- mes "Merry, Merry Christmas! Did you talk to that clown, ^5533FFHowie^000000 yet? Man that";
- mes "clown is REALLY boring......";
- next;
- mes "[Charlie]";
- mes "After watching his show, me and Marsha felt like we had wasted our time.....";
- next;
- mes "[Marsha]";
- mes "How can you say that? You know he always tries his best to make us happy.....";
- next;
- mes "[Charlie]";
- mes "Meh.... whatever.... I still think he's boring....... I'd rather talk";
- mes "to ^3355FF' Jack Frost '^000000. He's a LOT more fun.";
- next;
- mes "[Charlie]";
- mes "Have you met the Snowman, Jack Frost, yet...... if not go find him.";
- mes "He's a really funny guy.";
- next;
- mes "[Charlie]";
- mes "Anyways, Merry Christmas! Enjoy your stay in Lutie!";
- close;
-
-Xmas9:
- mes "[Charlie]";
- mes "Errr ? Jack Frost? Hmmm - Let me see....A nice snowman...";
- mes "You want to know about Jack Frost.... Is this what you want? Ummm";
- mes "let me see again... Argh - I am not that smart . . . . .";
- mes "Better ask of Marsha though !";
- close;
-}
-
-// Marsha
-//================================================================
-xmas.gat,208,168,4 script Marsha 703,{
- if(xmas_npc==10) goto Xmas10;
- if(xmas_npc==9) goto Xmas9a;
-
- mes "[Marsha]";
- mes "Merry Christmas to you!";
- next;
- mes "[Marsha]";
- mes "I don't know if this is true... but I heard that the Snowman has";
- mes "something special that is un imaginable..... a special power of sorts..";
- next;
- mes "[Marsha]";
- mes "Oh by the way..... Have you met ^5533FFSanta Claus^000000 yet? He";
- mes "carries TONS and tons of gifts is his BIG bag! I heard that the Snowman";
- mes "also does that.... Isn't that AMAZING!?? So exciting!!";
- emotion e_ic;
- next;
- mes "[Marsha]";
- mes "I mean he has a big bag full of gifts too.... those how have been";
- mes "friendly to the Snowman have gotten cool gifts from him!";
- next;
- mes "[Marsha]";
- mes "..... Well at least that's what people say... but still.... isn't it";
- mes "AMAZING!!";
- emotion e_hmm;
- close;
-
-Xmas9a:
- mes "[Marsha]";
- mes "You mean Jack Frost? Of course I know.. He is nice and funny guy.";
- mes "As Charlie always insists, he is better than Howie.....";
- mes "(But please don't tell it to Howie~)";
- next;
- mes "[Marsha]";
- mes "Charlie and I are Orphans. We don't remember our parents at all.";
- mes "We've been brought up by the kind people of Lutie, including";
- mes "Hairy Uncle Ken and Auntie Mima.";
- next;
- mes "[Marsha]";
- mes "They are all nice and generous, and we appreciate all of them for";
- mes "taking care of us. By the way I heard Jack Frost doesn't have a";
- mes "mom or dad either... and I also heard that neither we nor Jack";
- mes "Frost were born in this Christmas Town.";
- next;
- mes "[Marsha]";
- mes "There is a rumor that myself, Charlie, and Jack Frost came here";
- mes "from somewhere else. I am not actually sure about that but,";
- mes "at least I know that all of us have the same types of burns on";
- mes "our bodies. Charlie and I have it on our backs.";
- next;
- mes "[Marsha]";
- mes "Jack Frost has a dark smudge on his tummy.... It makes me feel as";
- mes "if we are somehow connected to each other...";
- next;
-Xmas10:
- mes "[Marsha]";
- mes "Oh? Now I see.... You've come to know a lot about Jack Frost....";
- mes "Maybe even more than any one person in this town. Please try to";
- mes "talk to Mr. Jack Frost. He will probably be delighted that you";
- mes "are so interested in him. Maybe you will even be able to get a";
- mes "present from him.";
- next;
- mes "[Marsha]";
- mes "I wish you the best of luck. Merry Christmas!!";
- set xmas_npc,10;
- close;
-}
+//===== eAthena Script =======================================
+//= Lutie Town
+//===== By: ==================================================
+//=
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 Edited some text and updated/enabled some triggers
+//= for the quest.[kobra_k88]
+//= 1.2 Fixed exploit. Checked for Bard Job Quest compatibility [Lupus]
+//= 1.3 Fixed typo’s [Nexon] 1.4 Fixed exploit [Lupus]
+//= 1.5 Fixed a bug that could reset Lutie quest state [Lupus]
+//============================================================
+
+
+//=====================================================
+// Getting To Lutie
+//=====================================================
+aldebaran.gat,168,168,4 script Mr. Claus 718,{
+ mes "[Mr. Claus]";
+ mes "Merry Christmas!!";
+ mes "I wish you all happiness!";
+ next;
+ menu "Where are you from?",L0, "Take me to ^5533FF'Lutie'^000000",L1, "Cancel",LEnd;
+
+ L0:
+ mes "[Mr. Claus]";
+ mes "I come from ^3355FF'Lutie'^000000,the Fantastic Christmas Town!!";
+ mes "There it is Christmas all year round, with delicious cakes,";
+ mes "and toys as far as the eye can see.";
+ next;
+ mes "[Mr. Claus]";
+ mes "Happiness and joy fills the city! It is a magical place to be!";
+ mes "Doesn't this place sound fantastic?";
+ next;
+ mes "[Mr. Claus]";
+ mes "Then what are you waiting for?! Just say the word and I'll take";
+ mes "you to Lutie right away! You might even meet the big boss Santa";
+ mes "Claus.";
+ close;
+ L1:
+ mes "[Mr. Claus]";
+ mes "So you're ready to go to the greatest place in the world?";
+ next;
+ mes "[Mr. Claus]";
+ mes "Ok then, off you go to enjoy the fun and excitement that Lutie";
+ mes "Has to offer!";
+ close2;
+ warp "xmas_fild01.gat",78,68;
+ end;
+ LEnd:
+ mes "[Mr. Claus]";
+ mes "Well... if you want to visit Lutie, just let me know anytime.";
+ mes "Merry Christmas!! Merry Christmas!!";
+ close;
+}
+
+
+//=====================================================================
+// NPCs inside
+//=====================================================================
+
+// Mima
+//============================================================
+xmas_in.gat,27,103,4 script Mima 701,{
+ if(xmas_npc==5) goto Xmas5;
+ if(xmas_npc==6) goto Xmas6;
+ if(xmas_npc==7) goto Xmas7;
+ if(xmas_npc==8) goto Xmas8;
+ mes "[Mima]";
+ mes "Merry Christmas!";
+ mes "I can feel the spirit of Christmas surrounding me whenever I look,";
+ mes "at the young strangers out there... I wish you a merry Christmas!";
+ next;
+ mes "[Mima]";
+ mes "There is an abandoned ^5533FFToy Factory^000000 here in town. It";
+ mes "looks quite interesting, however....";
+ next;
+ mes "[Mima]";
+ mes "Recently I've noticed that many monsters have taken residence";
+ mes "inside of the factory. Some of them look like the monsters found";
+ mes "outside of town... I mean they look completely identical!!";
+ next;
+ mes "[Mima]";
+ mes "Even though they look similar, they actually are not the same. For";
+ mes "some reason these monsters have different characteristics from the";
+ mes "ones found outside. Some of them are very unique and it seems that";
+ mes "their offspring are adapting to the environment here.";
+ next;
+ mes "[Mima]";
+ mes "... Oh I almost forgot, I have to go make some";
+ mes "kimchi(spicy pickled cabbage)... mmm.. Chocolate kimchi is my";
+ mes "favorite!";
+ next;
+ mes "[Mima]";
+ mes "Between each slice of kimchi, I spread on a special chocolate which";
+ mes "melts rather easily. The rest is a family secret.... hehe.";
+ close;
+
+Xmas5:
+ mes "[Mima]";
+ mes "Hmmm? Hairy Uncle Ken told you about me, didn't he? Well well, I";
+ mes "know what he's thinking... Hoo hoo! He intends to make me feel";
+ mes "happy and expects me to give him some free jars of kimchi!";
+ mes "Hoo hoo, oh well.";
+ next;
+ mes "[Mima]";
+ mes "He knows too much about me... I can't stop him from getting some";
+ mes "of my kimchi. Yes yes. Even I know my kimchi is the best in town!";
+ mes "Whoo? The story of ^3355FF'Jack Frost'^000000? Oh... Yes yes, I see.";
+ next;
+ mes "[Mima]";
+ mes "But I can't just tell you his story.... As you know the most";
+ mes "powerful human beings are aunties! And I'm one of them! They never";
+ mes "allow others to take advantage of them. As they say, 'There is no";
+ mes "such thing as a free lunch'. So I have a favour to ask of you.";
+ mes "Jack Frost has been keeping something for me.....";
+ next;
+ mes "[Mima]";
+ mes "Would you please bring it back to me? ^3355FF'The roughest salt in";
+ mes "the world'^000000. It is an essential ingredient for pickling";
+ mes "cabbages. Just tell him I sent you and he will understand.";
+ next;
+ mes "[Mima]";
+ mes "He will give you my salt. Now dear, hurry up. Return Quickly.";
+ set xmas_npc,6;
+ close;
+Xmas6:
+ mes "[Mima]";
+ mes "Hohohoho -";
+ mes "Let's see... Huh? Didn't you yet bring it?";
+ mes "Oh my goodness, my cabbages will get sour soon!";
+ mes "( ? )";
+ mes "Hurry up, Chop Chop -!!";
+ next;
+ mes "[Mima]";
+ mes "*sigh* You are really a scatterbrained person, my dear...";
+ mes "I said BRING ME ^3355FF' THE ROUGHEST SALT IN THE WORLD '^000000";
+ mes "!!!!!!!! Leave now and hurry up!";
+ close;
+Xmas7:
+ mes "[Mima]";
+ mes "Hohohohoh hohohohoho !";
+ mes "Let's see Let's see...... Thank you my dear, Thank you!";
+ next;
+ mes "-Handed ^3355FF' The roughest salt in the world'^000000 to her-";
+ set xmas_npc,8;
+ next;
+ mes "[Mima]";
+ mes "Now I am able to pickle my cabbages properly. Thank you my dear,";
+ mes "Thank you . . . . . Hooo? Ahhh yes, sorry, I almost forgot I";
+ mes "promised you... Yes I remember you asked me about Jack Frost's";
+ mes "gift bag, didn't you?";
+ next;
+ mes "[Mima]";
+ mes "If you already met Uncle Hairy Uncle Ken you must know by now,";
+ mes "Jack Frost has been made out of some mysterious snow covering up";
+ mes "a thick-grass filed of magical force,";
+ next;
+ mes "[Mima]";
+ mes "I can't tell you what the reason was, but I figured out Jack Frost";
+ mes "came to possess the gift bag within, due to the strange reaction";
+ mes "between alchemy items used by Great alchemist and its original";
+ mes "structure material, the mysterious snow.";
+ next;
+ mes "[Mima]";
+ mes "Aside from it, the gift bag creates present as many as Jack Frost";
+ mes "wants. It seems like something magical grants Jack Frost with";
+ mes "the same ability of Santa Claus. If this power fell into bad man's";
+ mes "hands, we would probably be in trouble, but everybody knows that";
+ mes "Jack Frost is very nice and innocent creature... We've never";
+ mes "worried about his unique ability...";
+ next;
+Xmas8:
+ mes "[Mima]";
+ mes "Hohohoho . . Ah and, lately I've heard some surprising news from";
+ mes "^3355FF'Howie'^000000 the clown. It is an interesting story... If you're";
+ mes "interested, why don't you go meet him?";
+ close;
+}
+
+// Santa Claus
+//===================================================================
+xmas_in.gat,100,96,4 script Father Christmas::Santa1 718,{
+ if(@talkedsanta == 1) goto L_Xmas1;
+ mes "[Santa Claus]";
+ mes "Ho Ho Ho~";
+ mes "Meeerry Christmas !!";
+ next;
+ mes "[Santa Claus]";
+ mes "Ho Ho Ho~";
+ mes "I am a Santa Claus, and I bring gifts to every boy and girl on";
+ mes "Christmas!";
+ next;
+ mes "[Santa Claus]";
+ mes "Ho Ho Ho~";
+ mes "If for some reason you wish to leave the wonderful town of Lutie,";
+ mes "just head south of town. You'll find a warp that will lead you";
+ mes "back to Al De Baran.";
+ next;
+ mes "[Santa Claus]";
+ mes "Ho Ho Ho~ Merry Christmas !!";
+ mes "Merry Christmas!!";
+ if(xmas_npc==0) set @talkedsanta, 1;
+ close;
+
+L_Xmas1:
+ mes "[Santa]";
+ mes "I'm Santa Claus.";
+ mes "I have a present for you, let me look in my bag.";
+ next;
+ mes "[Santa]";
+ mes "Yep, I've got a present with your name on it.";
+ mes "Here you are!";
+ next;
+ set @temp, rand(1,4);
+ if (@temp == 2) goto L_2;
+ if (@temp == 3) goto L_3;
+ if (@temp == 4) goto L_4;
+
+ getitem 529,5;
+ goto L_End;
+L_1:
+ getitem 530,3;
+ goto L_End;
+L_2:
+ getitem 528,1;
+ if(xmas_npc==0) set xmas_npc, 1;
+ set @talkedsanta, 0;
+ mes "[Santa]";
+ mes "Hmm, you must not have been a very good";
+ mes "person this year. Do better!";
+ close;
+L_3:
+ getitem 539,2;
+ goto L_End;
+L_4:
+ getitem 539,1;
+L_End:
+ if(xmas_npc==0) set xmas_npc, 1;
+ set @talkedsanta, 0;
+ mes "[Santa]";
+ mes "Hope you like your present!";
+ mes "My elves made it especially for you.";
+ close;
+}
+
+// Debra
+//==================================================================
+xmas_in.gat,165,173,4 script Debra 711,{
+ if(xmas_npc==1 || xmas_npc==2) goto Xmas1;
+ mes "[Debra]";
+ mes "Merry Christmas!";
+ mes "Welcome to Lutie!";
+ next;
+ mes "[Debra]";
+ mes "Have you ever talked to the snowman in front of this town?";
+ mes "Snowman in solitude, made of White Snow....";
+ next;
+ mes "[Debra]";
+ mes "However he got a warm heart. Sometimes I talk to ' Jack Frost '";
+ mes "the snowman. Without reason.. even though he is a snowman,";
+ mes "He can understand and stand to listen to us";
+ next;
+ mes "[Debra]";
+ mes ". . . . .";
+ mes "When I talk to Jack Frost, I get to wonder about many things of";
+ mes "him and feel something mysterious, I assume you will be the same";
+ mes "as me, if you try to talk to him.";
+ next;
+ mes "[Debra]";
+ mes "like how he has been created, who granted him to posses the heart";
+ mes "of human and can talk,";
+ next;
+ mes "[Debra]";
+ mes "Where he was from, That place has a lot of snow all the time or";
+ mes "not... how he came to arrive this town without legs...";
+ next;
+ mes "[Debra]";
+ mes "Lately in this town,";
+ mes "it seems the number of curious people coming to him gets increased.";
+ mes "If you still couldn't solve his secret after talking with him";
+ next;
+ mes "[Debra]";
+ mes "I suggest you to talk to other towners...";
+ if(xmas_npc==0) goto Xmas0;
+ close;
+
+ Xmas0:
+ mes "Ah!... I almost forgot you to tell... Santa Claus lives here in";
+ mes "this town....";
+ next;
+ mes "[Debra]";
+ mes "Didn't you see him yet? Why don't you go meet him then? Take";
+ mes "care now! Merry Christmas!!";
+ close;
+
+ Xmas1:
+ mes "[Debra]";
+ mes "Merry Christmas!";
+ mes "Welcome to Lutie!";
+ next;
+ mes "[Debra]";
+ mes "You got a present from Santa Claus?! You must be really exited!";
+ mes "Ha ha! Have you ever heard that we have a person equally as";
+ mes "famous as Santa Claus here?";
+ next;
+ mes "[Debra]";
+ mes "That person is ^3355FF'Jack Frost'^000000 the mysterious snowman,";
+ mes "who can communicate with humans.";
+ next;
+ mes "[Debra]";
+ mes "Yet you didn't meet Jack Frost yet? I think you should try to";
+ mes "talk to him at least once... Well then, Merry Christmas!!";
+ set xmas_npc,2;
+ close;
+}
+
+
+//=======================================================================
+// NPC's Outside
+//=======================================================================
+
+// Peterson
+//=========================================================
+xmas.gat,117,304,4 script Peterson 713,{
+ if((xmas_npc==3) || (xmas_npc==4)) goto Xmas34;
+ mes "[Peterson]";
+ mes "Merry Christmas!";
+ next;
+ mes "[Peterson]";
+ mes "Here in Lutie, it's always Christmas 24 hours a day and 365";
+ mes "days a year, Christmas is celebrated non stop here! This beautiful";
+ mes "city fills your heart with the joyous spirit of Christmas...";
+ next;
+ mes "[Peterson]";
+ mes "Walk around town and you will see... this city has some of the";
+ mes "best facilities and attractions of any other place.";
+ next;
+ mes "[Peterson]";
+ mes "Lutie is a great place for those who don't want to worry about";
+ mes "anything. So may happiness be with you... Merry Christmas!!";
+ close;
+
+Xmas34:
+ mes "[Peterson]";
+ mes "Did ^3355FF'Jack Frost'^000000 tell you about me? Oh I see... he is a";
+ mes "snowman who has no legs. It's a shame he can't come here to see";
+ mes "me... I appreciate you to coming here for him. I will visit him";
+ mes "someday.";
+ next;
+ mes "[Peterson]";
+ mes "There is a man who knows about Jack Frost's secret.....";
+ mes "That man is ^3355FF'Hairy Uncle Ken'^000000... Yes, he definitely knows...";
+ next;
+ mes "[Peterson]";
+ mes "One day when an apprentice of the great alchemist visited Lutie,";
+ mes "I listened to the conversation between Hairy Uncle Ken and";
+ mes "Jack Frost.";
+ next;
+ mes "[Peterson]";
+ mes "Once upon a time, a great alchemist came to Jack Frost's home";
+ mes "land and found him dying and melting away into water. He revived";
+ mes "him with several ores of magic and some other things.....";
+ next;
+ mes "[Peterson]";
+ mes "Well, as far as the details of the story, I recommend you listen";
+ mes "to what ^3355FF'Hairy Uncle Ken'^000000 has to say.";
+ set xmas_npc,4;
+ close;
+}
+
+// Hairy Uncle Ken
+//==========================================================
+xmas.gat,176,236,4 script Hairy Uncle Ken 712,{
+ if(xmas_npc==4) goto Xmas4;
+ if(xmas_npc==5) goto Xmas5;
+ mes "[Hairy Uncle Ken]";
+ mes "Meeeerrrrrrryyyy Christmas !";
+ mes "Welcome to the Christmas Town!!";
+ mes "Your face is glowing... The weather here is really ... Cold!";
+ mes "And it's so cold that it makes you look like........";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "A ^3355FF' Red Little Apple '^000000,";
+ mes "HarHarHarHar!";
+ mes "Try not to catch a cold. The flu in Lutie is very strong.......";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "... Speaking of the cold, that reminds me...";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "My kid recently caught a serious cold.... It happened at midnight";
+ mes "and all the pharmacies were closed. I was desperate so I went to";
+ mes "the abandoned ^5533FFToy Factory^000000 .......";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Little monster were running around all over... even ^5533FFIce Porings^000000!";
+ mes "People here often call them Ice Ball Porings... anyways I grabbed";
+ mes "one of them and ran back to the house. I put it on top of my";
+ mes "childs head...";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "And what do you know... his fever cooled down right away! Heh! This";
+ mes "is such a convenient village to live in. I've talked too much....";
+ mes "Good luck to you!";
+ close;
+
+Xmas4:
+ if(countitem(1024)>0 && countitem(938)>0) goto XmasL0;
+ mes "[Hairy Uncle Ken]";
+ mes "Oh yeah ? Peterson told you to come speak to me, did he?";
+ mes "Haw Haw Haw ! ! Yeah, yeah, I know him a little bit . .";
+ mes "To be honest, you can say I'm his weak point!";
+ mes "Cause I know the secret of ^3355FF'Jack Frost's birth'^000000!!";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Are you curious about it? *Chuckles* Yeah, I can tell by your face.";
+ mes "However! Don't think that I'd tell you this secret for nothing...";
+ mes "Come to think of it... I am feeling really thirsty now....";
+ mes "Bring me ^3355FF'1 Squid Ink'^000000 and ^3355FF'1 Sticky Muscus'^000000!!!";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Wahhahaha! Don't look at me like that! My tastes are none of your";
+ mes "business!!! Start finding a way to get me what I want, otherwise";
+ mes "...... you won't get what YOU want.... *Chuckles*";
+ close;
+
+ XmasL0:
+ delitem 1024,1;
+ delitem 938,1;
+ mes "[Hairy Uncle Ken]";
+ mes "Oh ?! *Chuckles* !! You seem to be a reliable person..";
+ mes "Good! Ok, first I need something to drink....";
+ next;
+ mes "^3355FF- Handed him Squid Ink and -^000000";
+ mes "^3355FF- Sticky Muscus. -^000000";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Burrrrpppp - Ok now ! Well now, it's the time for my story...";
+ mes "Keep in mind this is the story from what I know......";
+ mes "I am not sure how much you heard about this though . .";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "A long, long, time ago, there was a great Alchemist living in";
+ mes "the far north. His name was ^3355FF' Philip Varsez '^000000 !!";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "He was eager to keep beyond the bounds of new alchemy,";
+ mes "and new alchemy needed rare materials to be accomplished as";
+ mes "he wanted. So he decided to go travel all over the world to";
+ mes "look for items possessing Strong Magic Force within.";
+ mes "Eventually he arrived at a village of freezing weather,";
+ mes "somewhere up north...";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "As immediately came inside the village he encountered a grim";
+ mes "scene..... Everything was destroyed.... there was nothing left.";
+ mes "People groaned and moaned in pain, and were dying...";
+ mes "It was the worst scene he'd ever witnessed.";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Suddenly some strange force caught his attention.... That";
+ mes "strange thing was a snowman that was melting down into water";
+ mes "....^3355FF' Jack Frost '^000000! Even more astonishing was";
+ mes "the fact that it held 2 crying babies in its arms. So the";
+ mes "great alchemist could assumed the snowman sacrificed itself to";
+ mes "protect them from great danger.";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "It touched the Alchemist to see that, and he decided to save";
+ mes "the life of snowman with his great power of alchemy. He";
+ mes "transported the snowman to Lutie, this Christmas Town, the";
+ mes "safest place in this world.";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Some time later, rumors began to circulate that not only was";
+ mes "Jack Frost saved by the mercy of the Alchemist, but also";
+ mes "because of the snow that Jack Frost was made out of.";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "The truth is, Jack Frost was made out of snow covering up the";
+ mes "mysterious field where Magical flowers and plants grew all";
+ mes "over.";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Muhahaha -";
+ mes "Alrighty then... this is the whole story as far as I know.";
+ mes "How about you now? Did my story satisfy you? Haw Haw Haw!!";
+ next;
+ mes "[Hairy Uncle Ken]";
+ mes "Oh well... Now I regret to say, I have no idea about the";
+ mes "special ability that Jack Frost has that creates unlimited";
+ mes "Christmas presents...";
+ next;
+ Xmas5:
+ mes "[Hairy Uncle Ken]";
+ mes " ^3355FF' Mima '^000000 the excellent kimchi maker";
+ mes "knows about it through and through... If you're interested";
+ mes "you'd better to go visit her. Alrighty, Merry Christmas !!";
+ set xmas_npc,5;
+ close;
+}
+
+// Jack Frost
+//====================================================================
+xmas.gat,134,112,4 script Jack Frost 710,{
+ mes "[Jack Frost]";
+ if(xmas_npc==2) goto Xmas2;
+ if(xmas_npc==3) goto Xmas3;
+ if(xmas_npc==4) goto Xmas4;
+ if(xmas_npc==5) goto Xmas5;
+ if(xmas_npc==6) goto Xmas6;
+ if(xmas_npc==7) goto Xmas7;
+ if(xmas_npc==8) goto Xmas8;
+ if(xmas_npc==9) goto Xmas9;
+ if(xmas_npc==10) goto Xmas10;
+ if(xmas_npc==11) goto Xmas11;
+ mes "*sob*sob*........ I'm so lonely..... I can't go anywhere! I";
+ mes "am stuck here day and night... frozen to this cold earth....";
+ emotion e_sob;
+ next;
+ menu "^0000FFJack Frost?^000000",L0, "A secret Toy Factory?",L1, "...............",LEnd;
+
+ L0:
+ mes "[Jack Frost]";
+ mes "I was created by a human..... A giant snow doll is what some call me.....";
+ mes "I remember being born somewhere very cold......";
+ next;
+ mes "[Jack Frost]";
+ mes "Just like Lutie, this is a chilly little town.... I used to be happy up north but.......";
+ next;
+ mes "[Jack Frost]";
+ mes "On day a horrible old lady came to my village...... Her name was.... ^790079'Mariposum'^000000......";
+ mes "I heard she came from some place extremely hot..... Some weird village in some kind of cave.";
+ next;
+ mes "[Jack Frost]";
+ mes "On the fourth night after she arrived here, she went to central square.......";
+ mes "Without warning she started casting horrible spells....... Suddenly a huge storm emerged.....";
+ next;
+ mes "[Jack Frost]";
+ mes "Almost immediately the powerful storm knocked my friend and I unconscious........";
+ next;
+ mes "[Jack Frost]";
+ mes "I don't know how long I was out, but when I woke up I found myself right here in Lutie..........";
+ next;
+ mes "[Jack Frost]";
+ mes "But my friends were not...... I have lost all of my friends.......... I feel so lonely.......";
+ emotion e_sob;
+ close;
+ L1:
+ mes "[Jack Frost]";
+ mes "Somewhere in Lutie there is a place that looks just like a ^5533FFToy";
+ mes "Factory^000000....... It's well decorated and looks like a lot of";
+ mes "fun but.......";
+ next;
+ mes "[Jack Frost]";
+ mes "I heard that it is overrun with possessed toy soldiers and gift";
+ mes "boxes........";
+ next;
+ mes "[Jack Frost]";
+ mes "Part of me is intrigued by this place and I would like to see it";
+ mes "just once..... But part of me is also a little frighten of the";
+ mes "possessed toys.....";
+ close;
+ LEnd:
+ mes "[Jack Frost]";
+ mes "So long! Come visit me any time. Merry Christmas!";
+ close;
+
+Xmas2:
+ mes "Did you hear something from 'Debra'? Heh heh... the people of";
+ mes "Lutie call me a mysterious Snowman... honestly I am nothing but";
+ mes "a simple snowman... heh heh.";
+ next;
+ mes "[Jack Frost]";
+ mes "Besides I don't even know who I really am. Maybe I know as much";
+ mes "about myself as do the people here.";
+ next;
+ mes "[Jack Frost]";
+ mes "Mr.^3355FF'Peterson'^000000 gave me his name card and told me to visit";
+ mes "him whenever I wanted to.... but as you can see.....";
+ next;
+ mes "[Jack Frost]";
+ mes "I don't have any legs so I can't go anywhere..... ";
+ emotion e_sob;
+ next;
+ mes "[Jack Frost]";
+ mes "How did I get here...? Why can I communicate with humans...?";
+ mes "How can I......??";
+ next;
+ mes "^3355FF- Jack Frost falls deep into his thoughts -^000000";
+ mes "^3355FF- He is looking at 'Peterson's' name card -^000000";
+ set xmas_npc,3;
+ close;
+Xmas3:
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^3355FF- Jack Frost falls deep into his thoughts -^000000";
+ mes "^3355FF- He is looking at 'Peterson's' name card -^000000";
+ close;
+Xmas4:
+ mes "Did you meet 'Peterson'? He is a honest and diligent guy . .";
+ mes "And I know . . He fell in love with 'Debra'....";
+ mes "hehehehehe...";
+ next;
+ mes "[Jack Frost]";
+ mes "I think 'Debra' needs to be more generous. She is very kind to";
+ mes "everyone, except Peterson. But I know... Debra likes Peterson";
+ mes "as much as he does here...";
+ close;
+Xmas5:
+ mes "You spoke with ^3355FF'Hairy Uncle Ken '^000000?";
+ mes "Hairy Uncle Ken has loud voice, and doesn't take showers.....";
+ mes "he smells kinda bad.... but he is a very funny and diligent guy.";
+ mes "Everybody likes him.";
+ next;
+ mes "[Jack Frost]";
+ mes "He enjoys drinking some strange kind of drink......";
+ mes "They say it is a miracle that he doesn't have a stomachache.";
+ mes "Heh~ . .I love this guy too . .";
+ close;
+Xmas6:
+ mes "Hmmm you did you meet ^3355FF'Mima'^000000, the kimchi expert?";
+ mes "Yeah yeah. I've been keeping this for here. Here you go, It is";
+ mes "the salt she wants.";
+ next;
+ set xmas_npc,7;
+ mes "^3355FF' Got the roughest salt in the world'^000000.";
+ next;
+ mes "[Jack Frost]";
+ mes "I like her cooking because it is so delicious.";
+ mes "Sometimes she offers me cups of ice flakes with grape syrup...";
+ next;
+ mes "[Jack Frost]";
+Xmas7:
+ mes "^3355FF' The roughest salt in the world '^000000";
+ mes "hopefully you will deliver it safely to her . .";
+ close;
+Xmas8:
+ mes "Boring Clown 'Howie'... At first glance, he looks a dumb,";
+ mes "talent less clown..... But he has a pure heart and is always";
+ mes "taking care of the 2 orphans...";
+ close;
+Xmas9:
+ mes "'Charlie ' the boy of optimism.";
+ mes "He will become a big shot in future . .";
+ mes "Just like me ! -";
+ mes "Hahahaha . . . . .";
+ close;
+Xmas10:
+ mes ". . . . . Thank you for listening to me so far.";
+ mes "I very much appreciate you trying to understand me,";
+ mes "even though you are a stranger here.";
+ next;
+ mes "[Jack Frost]";
+ mes "I think you know more about me than anyone else in this town.";
+ mes "Hahahaha.... I want to give you a small present in return.";
+ next;
+ mes "[Jack Frost]";
+ mes "Tah dah!! Pick up anything you want in here - !!";
+ next;
+ mes "^3355FF- Stir the gift bag -^000000";
+ next;
+
+ //it's a part of Bard Job Quest also
+ set xmas_npc,11;
+
+ set @temp, rand(1,8);
+ if(@temp == 2) goto L_Prize2;
+ if(@temp == 3) goto L_Prize3;
+ if(@temp == 4) goto L_Prize4;
+ if(@temp == 5) goto L_Prize5;
+ if(@temp == 6) goto L_Prize6;
+ if(@temp == 7) goto L_Prize7;
+ if(@temp == 8) goto L_Prize8;
+
+ L_Prize1:
+ getitem 529,5;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 5 Candy -^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize2:
+ getitem 529,10;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 10 Candy -^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize3:
+ getitem 530,5;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 5 Candy Cane-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize4:
+ getitem 530,10;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 10 Candy Cane-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize5:
+ getitem 539,1;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 1 Piece of Cake-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize6:
+ getitem 539,2;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 2 Piece of Cake-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize7:
+ getitem 538,5;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 5 Cookie-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+ L_Prize8:
+ getitem 538,10;
+ mes "[Jack Frost]";
+ mes "Wow -Congratulations!!";
+ mes "^3355FF- 10 Cookie-^000000!";
+ mes "Dear my friend,";
+ mes "Please visit me from time to time, and take a chitchat with me.";
+ mes "See you soon -";
+ mes "Merry Christmas!!";
+ close;
+Xmas11:
+ mes "Welcome dear my friend -";
+ mes "You are always welcomed in this Christmas Town.";
+ mes "Especially by me, Jack Frost !";
+ mes "Merry Christmas !!";
+ close;
+}
+
+// Howie the Clown
+//=====================================================================
+xmas.gat,146,136,4 script Howie the Clown 715,{
+ mes "[Howie]";
+ mes "Meeee~RrrrrYYYY Christmas~!";
+ mes "La La La! La La La La!~";
+ mes "Dum di Dum di Dum";
+ next;
+ menu "Hey, Clown, what are you doing?",L0, "About the Snowman",L1, "Quit conversation",LEnd;
+
+ L0:
+ mes "[Howie]";
+ mes "La La La~ Dum di Dum di Dum........ Huh?.....";
+ next;
+ mes "[Howie]";
+ mes "Oh, I'm working on a show to entertain two lovely kids....";
+ mes "^5533FFCharlie and Marsha^000000.... and it's not easy!";
+ next;
+ mes "[Howie]";
+ mes "Beleive it or not you have to be smart, talented, and of course";
+ mes "funny to be a clown. It's getting tougher and tougher to make kids";
+ mes "laugh nowadays.... they just get bored so easily.... *sigh*";
+ next;
+ mes "[Howie]";
+ mes "So I have to push myself to be more creative.... to act funnier and";
+ mes "talk funnier...... to make them laugh out loud!!";
+ next;
+ mes "[Howie]";
+ mes "HaHaHaHa! HeHeHeHeHe! HoHoHoHoHo! Merry Christmas!!";
+ close;
+ L1:
+ if(xmas_npc==8 || xmas_npc==9) goto Xmas8;
+ mes "[Howie]";
+ mes "You mean ^5533FF' Jack Frost '^000000? Of course I know him. Everyone";
+ mes "knows Jack Frost the Snowman. Sometimes I go and chat with him.";
+ next;
+ mes "[Howie]";
+ mes "I even do performances for him. But I'm not quite sure if he likes";
+ mes "them.... cause whenever I finish my act.... He doesn't seem to have";
+ mes "any kind of reaction to it.....";
+ next;
+ mes "[Howie]";
+ mes "How could he not like an amazing show like mine??";
+ emotion e_hmm;
+ next;
+ mes "[Howie]";
+ mes "There's something strange about Jack Frost.... anyways...";
+ mes "La La La~ Dum di Dum di Dum";
+ mes "Merry Christmas- !!";
+ close;
+
+ Xmas8:
+ mes "[Howie]";
+ mes "Dum di Dum di Dum... Ah ha ! I assume you're here because of";
+ mes "Jack Frost? Well, after all it is nothing peculiar....";
+ next;
+ mes "[Howie]";
+ mes "It's about two naughty kids, ^3355FF'Charlie'^000000 and ^3355FF'Marsha'^000000,";
+ mes "they are regular viewers of my show. Did you heard about the";
+ mes "incindent happened in the northland from Hairy Uncle Ken by any";
+ mes "chance?";
+ next;
+ mes "[Howie]";
+ mes ". . . . . Then hopefully you will remember the 2 babies, whom";
+ mes "Jack Frost carried in his arms...while his body melted away...";
+ next;
+ mes "[Howie]";
+ mes "You guessed it... the 2 babies were Charlie and Marsha. They";
+ mes "don't seem to know about this. Jack Frost told me their story...";
+ mes "He used his body to block the big giant fire ball rushing towards";
+ mes "the 2 babies....";
+ next;
+ mes "[Howie]";
+ mes "Jack Frost made the ultimate sacrifice for Charlie and Marsha....";
+ mes "I can see you are quite interested in the story of Jack Frost,";
+ mes "why don't you go meet those 2 children for more information?";
+ next;
+ mes "[Howie]";
+ mes "They might tell you some story we've never got the chance to hear.";
+ mes "Ok then, good luck! Bye bye!";
+ set xmas_npc,9;
+ close;
+ LEnd:
+ mes "[Howie]";
+ mes "La La La... Dum di Dum di Dum";
+ mes "Merry Christmas! Have a great day!";
+ close;
+}
+
+// Charlie
+//================================================================
+xmas.gat,206,168,4 script Charlie 706,{
+ if(xmas_npc==9) goto Xmas9;
+ mes "[Charlie]";
+ mes "Merry, Merry Christmas! Did you talk to that clown, ^5533FFHowie^000000 yet? Man that";
+ mes "clown is REALLY boring......";
+ next;
+ mes "[Charlie]";
+ mes "After watching his show, me and Marsha felt like we had wasted our time.....";
+ next;
+ mes "[Marsha]";
+ mes "How can you say that? You know he always tries his best to make us happy.....";
+ next;
+ mes "[Charlie]";
+ mes "Meh.... whatever.... I still think he's boring....... I'd rather talk";
+ mes "to ^3355FF' Jack Frost '^000000. He's a LOT more fun.";
+ next;
+ mes "[Charlie]";
+ mes "Have you met the Snowman, Jack Frost, yet...... if not go find him.";
+ mes "He's a really funny guy.";
+ next;
+ mes "[Charlie]";
+ mes "Anyways, Merry Christmas! Enjoy your stay in Lutie!";
+ close;
+
+Xmas9:
+ mes "[Charlie]";
+ mes "Errr ? Jack Frost? Hmmm - Let me see....A nice snowman...";
+ mes "You want to know about Jack Frost.... Is this what you want? Ummm";
+ mes "let me see again... Argh - I am not that smart . . . . .";
+ mes "Better ask of Marsha though !";
+ close;
+}
+
+// Marsha
+//================================================================
+xmas.gat,208,168,4 script Marsha 703,{
+ if(xmas_npc==10) goto Xmas10;
+ if(xmas_npc==9) goto Xmas9a;
+
+ mes "[Marsha]";
+ mes "Merry Christmas to you!";
+ next;
+ mes "[Marsha]";
+ mes "I don't know if this is true... but I heard that the Snowman has";
+ mes "something special that is un imaginable..... a special power of sorts..";
+ next;
+ mes "[Marsha]";
+ mes "Oh by the way..... Have you met ^5533FFSanta Claus^000000 yet? He";
+ mes "carries TONS and tons of gifts is his BIG bag! I heard that the Snowman";
+ mes "also does that.... Isn't that AMAZING!?? So exciting!!";
+ emotion e_ic;
+ next;
+ mes "[Marsha]";
+ mes "I mean he has a big bag full of gifts too.... those how have been";
+ mes "friendly to the Snowman have gotten cool gifts from him!";
+ next;
+ mes "[Marsha]";
+ mes "..... Well at least that's what people say... but still.... isn't it";
+ mes "AMAZING!!";
+ emotion e_hmm;
+ close;
+
+Xmas9a:
+ mes "[Marsha]";
+ mes "You mean Jack Frost? Of course I know.. He is nice and funny guy.";
+ mes "As Charlie always insists, he is better than Howie.....";
+ mes "(But please don't tell it to Howie~)";
+ next;
+ mes "[Marsha]";
+ mes "Charlie and I are Orphans. We don't remember our parents at all.";
+ mes "We've been brought up by the kind people of Lutie, including";
+ mes "Hairy Uncle Ken and Auntie Mima.";
+ next;
+ mes "[Marsha]";
+ mes "They are all nice and generous, and we appreciate all of them for";
+ mes "taking care of us. By the way I heard Jack Frost doesn't have a";
+ mes "mom or dad either... and I also heard that neither we nor Jack";
+ mes "Frost were born in this Christmas Town.";
+ next;
+ mes "[Marsha]";
+ mes "There is a rumor that myself, Charlie, and Jack Frost came here";
+ mes "from somewhere else. I am not actually sure about that but,";
+ mes "at least I know that all of us have the same types of burns on";
+ mes "our bodies. Charlie and I have it on our backs.";
+ next;
+ mes "[Marsha]";
+ mes "Jack Frost has a dark smudge on his tummy.... It makes me feel as";
+ mes "if we are somehow connected to each other...";
+ next;
+Xmas10:
+ mes "[Marsha]";
+ mes "Oh? Now I see.... You've come to know a lot about Jack Frost....";
+ mes "Maybe even more than any one person in this town. Please try to";
+ mes "talk to Mr. Jack Frost. He will probably be delighted that you";
+ mes "are so interested in him. Maybe you will even be able to get a";
+ mes "present from him.";
+ next;
+ mes "[Marsha]";
+ mes "I wish you the best of luck. Merry Christmas!!";
+ set xmas_npc,10;
+ close;
+}
diff --git a/npc/cities/morocc.txt b/npc/cities/morocc.txt
index c46a13ee9..7cc30da71 100644
--- a/npc/cities/morocc.txt
+++ b/npc/cities/morocc.txt
@@ -1,470 +1,470 @@
-//===== eAthena Script =======================================
-//= Morroc Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= Fixed Lapidary sprite, Implemented ANTHELL trigger
-//= (in both NPC/Warps) [Lupus]. Removed it from NPC and put in Warp
-//= 1.3 Removed some NPC due to Assassin Job Quest [kobra_k88]
-//= 1.3b mobs name corrected [Lupus], 1.3c - Adv classes support
-//= 1.4 Fixed typo’s [Nexon]
-//= 1.5 Added a lvl 4 weapon quest related NPC [MasterOfMuppets]
-//= 1.6 Added Bartender NPC, made by Persian69 [Vicious_Pucca]
-//= 1.7 Removed Duplicates [Silent]
-//============================================================
-
-
-//==================================================== Town of Morroc ====================================================\\
-
-// Old Scholar ===============================
-morocc_in.gat,112,122,2 script Old Scholar 61,{
- mes "[Old Scholar]";
- mes "I've devoted my Life to researching the Pyramids. Although I not found anything significant yet, I am confident that I will find the Tomb of Ancient King, Osiris!";
- next;
- mes "[Old Scholar]";
- mes "It is within the largest of the Morroc Pyramids, that the Greatest King in History sleeps the eternal sleep. That is... if my memory serves me correctly......";
- close;
-}
-
-// Drunk Man =================================
-morocc.gat,44,180,8 script Drunk Man 89,{
- mes "[Drunk Man]";
- mes "Heh Heh... (Hiccup)! Oh, Are you new here? Nice to meet ya, Buddy! So how was your trip?";
- mes "This was predestined that you and I meet here, I tell you what (Hiccup). Let me tell you something I just heard from the pub....";
- next;
- mes "[Drunk Man]";
- mes "It's rumored that there is a special Dagger that can bring great fortune to its owner.";
- mes "There is a well-know Thief in Rune-Midgard that possesses this Dagger, and has never been caught";
- next;
- mes "[Drunk Man]";
- mes "What I would give to get my hands something like that(Hiccup). But only in my dreams....";
- next;
- mes "[Drunk Man]";
- mes "How about you? Why don't you Look for it? It shouldn't be a problem for someone as brave as yourself?";
- mes "Kekeke keke(Hiccup)! Buy me a drink later if you ever find that dagger. Promise me, alright?(Hiccup!)";
- emotion e_hmm;
- close;
-}
-
-// Towner =================================
-morocc.gat,68,260,8 script Towner 99,{
- mes "[Towner]";
- mes "Those giant, Triangular Buildings North West of town are called Pyramids... They have been there for thousands and thousands of years.";
- next;
- mes "[Towner]";
- mes "Nobody knows when and why they were built or who built them. All we know for sure is that there are tons of Horrendous Monsters inside of them.";
- next;
- mes "[Towner]";
- mes "I think you'd better stay away from them. The monsters in the Pyramid LOVE to feed on strangers. Kekekekek...";
- close;
-}
-
-// Ant Man Akira =============================
-morocc.gat,76,75,4 script Ant Man Akira 47,{
- mes "[Ant Man Akira]";
- mes "About 1 map north and 3 maps east of Morroc, there lies the entrance to a cave known as ^ff0000ANTHELL^000000 ...";
-M_Menu:
- next;
- menu "'Anthell ?'",M_Anthell,"Ants?",M_Ants,"End conversation",M_End;
-
- M_Anthell:
- mes "[Ant Man Akira]";
- mes "Anthell gets it's name from the fact that the cave is home to the largest colony of giant ants in Rune-Midgard.";
- mes "There are literally thousands of ants performing work for the colony while their queens lay hundreds and hundreds of eggs.";
- next;
- mes "[Ant Man Akira]";
- mes "Many people go there to train because of the numerous amounts of ant eggs. But be careful...";
- next;
- mes "[Ant Man Akira]";
- mes "Attack an ant by mistake, and you'll find yourself surrounded by a swarm of them before you can even use a fly wing!";
- emotion e_gasp;
- goto M_Menu;
- M_Ants:
- mes "[Ant Man Akira]";
- mes "There are 3 different kinds of Ant, each with a unique color and name. Each one has a different role in the colony.";
- mes "Andres are white, Pieres are green, and Deniros are red colored. Their differences are not merely cosmetic however.";
- next;
- mes "[Ant Man Akira]";
- mes "Andres are the weakest of the ants while Deniros are the most fierce some of the ants. Pieres lay somewhere in the middle.";
- next;
- mes "[Ant Man Akira]";
- mes "Be careful when your around them. If you hit 1 Andre the other Andres in the area with swarm and attack you.";
- mes "The same goes for Deniros and Pieres. You should also know that ants are looters so watch out for your items.";
- goto M_Menu;
- M_End:
- mes "[Ant Man Akira]";
- mes "Before you go, let me tell you about Giearths. They are not ants but they live in Anthell. Don't underestimate them because of their small size.";
- mes "They are extremely tough and should only be handled by high level wariors.";
- next;
- mes "[Ant Man Akira]";
- mes "Well see ya around.";
- close;
-}
-
-// Poring Lady Syvia ==================================
-morocc.gat,79,111,2 script Poring Lady Syvia 700,{
- mes "[Poring Lady Syvia]";
- mes "All over Rune-Midgard you can see lots of cute monsters such as Spores, the mushroom type creature....";
- next;
- mes "[Poring Lady Syvia]";
- mes "Or Pickys, desert chicks that wear egg shells on their heads and jump around in the Morroc Desert..!";
- mes "However you can't deny that the ^FF8888Poring^000000 is the cutest and most popular creature in all of Rune-Midgard.";
- next;
- mes "[Poring Lady Syvia]";
- mes "Although everybody knows about the common pink Poring, there are 2 Rare porings that live near Prontera and are getting a lot of attention.";
- next;
- mes "[Poring Lady Syvia]";
- mes "They are the ^ffaa00Angeling^000000 and the ^5555ffGhostring^000000";
-M_Menu:
- next;
- menu "Angeling?",M_Angel,"Ghostring?",M_Ghost,"Quit Conversation",M_Quit;
-
- M_Angel:
- mes "[Poring Lady Syvia]";
- mes "The Angeling is a poring with angel wings. It is rarely seen but it is quite a sight. Don't not be fooled by it's angelic look however.";
- mes "It is a high level monster armed with the Holy property. It is immune to almost all magic attacks except those of the neutral & shadow property.";
- next;
- mes "[Poring Lady Syvia]";
- mes "Physical attacks are definitely the way to go against these monsters.";
- next;
- mes "[Poring Lady Syvia]";
- mes "Don't I know a lot about porings? Quite frankly I'm in love with them.... =P";
- goto M_Menu;
-
- M_Ghost:
- mes "[Poring Lady Syvia]";
- mes "The Ghostring is an evil ghost poring. It is rarely seen and luckly so.";
- next;
- mes "[Poring Lady Syvia]";
- mes "It is a high-level monster armed with the ghost property. This makes it immune to physical attacks. So Archers, Swordsman, and Thieves beware!";
- mes "Only weapons with elemental properties will work on Ghostrings. Of course magic attacks work very well on them also.";
- next;
- mes "[Poring Lady Syvia]";
- mes "Don't I know a lot about porings? Quite frankly I'm in love with them.... =P";
- goto M_Menu;
-
- M_Quit:
- mes "[Poring Lady Syvia]";
- mes "OMG!";
- emotion e_omg;
- next;
- mes "[Poring Lady Syvia]";
- mes "You dare dismiss a poring expert such as myself? I am proud of my knowledge about all things poring!!";
- next;
- mes "[Poring Lady Syvia]";
- mes "Hmf!";
- emotion e_pif;
- close;
-}
-
-// Slayer Kid ====================================
-morocc.gat,123,58,4 script Slayer Kid 118,{
- mes "[Slayer Kid]";
- mes ".... An expert in hand to hand combat who polishes off enemies quickly and quietly....";
- next;
- mes "[Slayer Kid]";
- mes "That is the ^ff00ffAssassin^000000!!";
-M_Menu:
- next;
- menu "Hmm??",M_0,"Where can I find the Assassin Clan?",M_1,"End conversation",M_End;
-
- M_0:
- mes "[Slayer Kid]";
- mes "Assassins are a secretive group of elite killers. People say Assassins are highly trained in 'eliminating' their targets without leaving a trace.";
- next;
- mes "[Slayer Kid]";
- mes "It's been 3 months since I left home to search for the Assassin clan.... Just where are they??!!!";
- goto M_Menu;
- M_1:
- mes "[Slayer Kid]";
- mes "People say that if you go 2 maps on the east of Morroc, then 2 maps south, you'll be able to find the Assassin Clan.";
- next;
- mes "[Slayer Kid]";
- mes "If you are granted an Assassin Cross, the emblem of the clan master, you will be allowed to become an Assassin.";
- mes "The Assassin Cross is a high honor and is given to the best Assassin among Assassins!";
- next;
- mes "[Slayer Kid]";
- mes "To tell you the truth however... I don't think they the clan really exists...";
- next;
- mes "[Slayer Kid]";
- mes "I've been searching for them for over 3 months now and nothing. It seems almost impossible for me to become an Assassin now......";
- goto M_Menu;
- M_End:
- close;
-
-}
-
-// Lapidary =======================================
-morocc.gat,150,50,8 script Lapidary 99,{
- mes "[Lapidary]";
- mes "The Queen of Jewelry is the Diamond. No one can deny its beautiful appearance. That's why it cost so much to buy...";
- next;
- mes "[Lapidary]";
- mes "Many factors increase its value, with the most important factor being size.";
- next;
- mes "[Lapidary]";
- mes "A high quality Diamond should be perfect and not chipped or cracked in any way.";
- close;
-}
-
-// Uncle Dimitrii ==========================================
-morocc.gat,180,155,4 script Uncle Dimitri 49,{
- mes "[Uncle Dimitrii]";
- mes "The avarage temperature in the Morroc Desert is many times higher than anywhere else in the Rune-Midgard Kingdom.";
- next;
- mes "[Uncle Dimitrii]";
- mes "Be careful of where you choose to sit down and rest. Choose the wrong spot and your butt may catch on fire!!";
-M_Menu:
- next;
- menu "About the Desert sand",M_1,"About the remedy for Fatigue",M_2,"End conversation",M_End;
-
- M_1:
- mes "[Uncle Dimitri]";
- mes ". . . . . Well";
- next;
- mes "[Uncle Dimitri]";
- mes "It's SUPPOSED to be HOT!!! But it actually isn't really that hot.....";
- next;
- mes "[Uncle Dimitri]";
- mes "For some odd reason the sand in the Morroc desert doesn't conduct as much heat as the sand in other deserts.";
- mes "Instead of being scorching hot, the sand just feels warm.... so it's ok for you to sit down for a good rest";
- next;
- mes "[Uncle Dimitri]";
- mes "So everybody can recover their HP and SP without fear of catching on fire.";
- goto M_Menu;
- M_2:
- mes "[Uncle Dimitri]";
- mes "Aaaaahhh!!!!";
- next;
- mes "[Uncle Dimitri]";
- mes "Nothing beats desert fatigue like a couple of potions! The ^ff0000Red^000000 ones are especially popular because of their low cost and light weight.";
- next;
- mes "[Uncle Dimitri]";
- mes "They only recover a small amount of hp, but combined with a dip in a desert oasis, a couple ^ff0000Reds^000000 are all you need.";
- goto M_Menu;
- M_End:
- mes "[Uncle Dimitri]";
- mes "Did you know that you can get ^0000bb'Milk'^000000 from a 'PecoPeco's Egg'? I wonder how that works......?";
- close;
-}
-
-// Trader Joe =====================================
-morocc.gat,208,85,7 script Trader Joe 83,{
- mes "[Trader Joe]";
- mes "I earn a living as a Trader so I'm constantly traveling between Morroc and Prontera.";
- mes "I can't even count how many times I've been across the Hot, Dry desert.";
- next;
- mes "[Trader Joe]";
- mes "One day, while I was out in the Desert, I unexpectedly ran out of water and became extremely thirsty.";
- mes "I was desperate so I decided to try to get some water out of a cactus when.......";
- next;
- mes "[Trader Joe]";
- mes "ALL OF THE SUDDEN!!! The cactus let out this LOUD SCREAM and started to SHOOT its NEEDLES at me!!";
- emotion e_omg;
- next;
- mes "[Trader Joe]";
- mes "It was THE WORST experience of my ENTIRE LIFE.";
- next;
- mes "[Trader Joe]";
- mes "I figured out later that it wasn't a normal cactus that attacked me but it was ^00cc00Muka^000000, the cactus monster.";
- next;
- mes "[Trader Joe]";
- mes "So be careful the next time you're out in the desert. You don't want to make the same mistake I made. (~Sigh~)";
- close;
-}
-
-// Fly Man Armani ===============================
-morocc.gat,234,273,3 script Fly Man Armani 54,{
- mes "[Fly Man Armani]";
- mes "I SAW IT!! I SAW IT!!!";
- emotion e_ic;
- next;
- mes "[Fly Man Armani]";
- mes "I saw the rare ^ff0000Dragon Fly^000000 just South of here! It was incredible!!";
- next;
- menu "What... Dragon Fly?!",M_0,"So what?",M_1;
-
- M_0:
- mes "[Fly Man Armani]";
- mes "It is the boss of desert flies and its much stronger than any other ordinary fly.";
- mes "It's a rare sight to behold, and for anybody strong enough and lucky enough to defeat it.... ";
- next;
- mes "[Fly Man Armani]";
- mes "The Dragon Fly may even drop an UTLRA RARE item called a ^0000ddClip^000000!";
- mes "Clips are items that you can attach to weapons, armor, and almost every kind of accessory.";
- next;
- mes "[Fly Man Armani]";
- mes "Clips are ^ffaa00slotted^000000 and therefore you can insert cards into them. That's what makes them so valuable.";
- mes "It seems like everyone is yearning for a clip these days.";
- next;
- mes "[Fly Man Armani]";
- mes "Say.... why don't YOU challenge the Dragon Fly?";
- emotion e_hmm;
- close;
- M_1:
- mes "[Fly Man Armani]";
- mes "SO WHAT!!??";
- emotion e_omg;
- next;
- mes "[Fly Man Armani]";
- mes "Do you dare underestimate the Dragon Fly?? Bleh! It may be a fly, but I guarantee you THIS FLY is more than you can handle!";
- emotion e_pif;
- next;
- mes "[Fly Man Armani]";
- mes "No matter. If you ARE fortunate enough to run into it, you'll quickly see what I mean. After all, it IS the FLY of ALL FLIES!!!!";
- next;
- mes "[Fly Man Armani]";
- mes "^ff0000Dragon Fly^000000. Remember this name well!!";
- close;
-}
-
-// Uncle Phlanette ================================
-morocc.gat,277,213,4 script Uncle Phlanette 48,{
- mes "[Uncle Phlanette]";
- mes "Morroc is a highly dry region surrounded by desert. There isn't a place as hot or dry as Morroc anywhere in Rune-Midgard.";
-M_Menu:
- next;
- menu "Desert Story",M_0,"Quit Coversation",M_End;
-
- M_0:
- mes "[Uncle Phlanette]";
- mes "Let me tell you a little about the desert.....";
- next;
- mes "[Uncle Phlanette]";
- mes "You see the desert is a place that is bare of vegetation due to low rainfall and a high evaporation rate.";
- mes "Even so there are plants that seem to thrive in the desert. And where there are plants, there are animals.";
- next;
- mes "[Uncle Phlanette]";
- mes "So even with the high temperatures, and limited water, living creatures still find a way to survive in the desert.";
- next;
- mes "[Uncle Phlanette]";
- mes "Unfortunately, for unknown reasons, some of the plants and animals in the desert have turned into dangerous monsters.";
- mes "The ^00cc00'Mukas'^000000 are one of those monsters. They were originally cactus plants.";
- goto M_Menu;
- M_End:
- mes "[Uncle Phlanette]";
- mes "Sand HERE! Sand THERE! Sand EVERYWHERE!!!!";
- emotion e_gasp;
- next;
- mes "[Uncle Phlanette]";
- mes "(~Sigh~) I'm SICK and TIRED of this sand and desert...";
- next;
- mes "[Uncle Phlantette]";
- mes "Morroc......!! I HATE YOU!!!!!!";
- emotion e_pif;
- close;
-}
-
-//Bartender
-morocc_in.gat,166,76,3 script Bartender#02 46,{
- mes "[Bartender]";
- mes "What are you going to order?";
- next;
- menu "Tropical Sograt",L1,"Vemillion the Beach",L2,"Nothing.",-;
-
- mes "[Bartender]";
- mes "Hmm...";
- close;
-
-L1:
- if (zeny < 1000 ) goto Nomoney;
- getitem 12112,1;
- set zeny,zeny-1000;
- mes "[Bartender]";
- mes "Here you go.";
- mes "Fruits are major ingredients,";
- mes "but don't drink too much.";
- close;
-
-L2:
- if (zeny < 1000 ) goto Nomoney;
- getitem 12113,1;
- set zeny,zeny-1000;
- mes "[Bartender]";
- mes "Here you go.";
- mes "but don't drink too much.";
- close;
-
-Nomoney:
- mes "[Bartender]";
- mes "Are you asking me to give it for free?";
- mes "You are one crazy person.";
- mes "Don't even think about drinking if you don't have 1,000 zeny.";
- close;
-}
-
-// Lvl 4 weapon quest related NPC ================================
-
-morocc.gat,289,230,3 script Citizen#06 92, {
- mes "[Citizen]";
- mes "Meeting a dead man is basically";
- mes "impossible.";
- mes "Even if you met one,";
- mes "he would not have the full memory of his life.";
- next;
- mes "[Citizen]";
- mes "But if you brought a thing that he";
- mes "used to keep in his life,";
- mes "it would be possible to retrieve his memory of the life.";
- mes "Of course, we can confirm this theory only";
- mes "when we meet a dead man.";
- close;
-}
-
-//<================================================== Assassin Guild ====================================================>\\
-
-// Hashisid ====================================
-moc_fild16.gat,199,212,4 script Hashisid 48,{
- mes "[Hashisid]";
- mes "For Assassins, it is important not to look a target in the eye. If a target is smart, he/she may be able to tell what you're up too.";
- next;
- menu "About Assassins",M_0,"Quit Conversation",M_End;
-
- M_0:
- mes "[Hashisid]";
- mes "Let me tell you a little bit about Assassins";
- next;
- mes "[Hashisid]";
- mes "Assassin's are hired to infiltrate, gather intelligence, and even commit murder without being seen or heard.";
- mes "Stealth and speed are vital to Assassins. Assassins live in the shadows and never get praise or congratulations.";
- next;
- mes "[Hashisid]";
- mes "It's their job to go unnoticed. Though an Assassin may seem like a cruel and heartless individual....";
- mes "An Assassin will never do any harm to an innocent being. The main purpose of the Assassin to seek out and destroy evil forces!";
- close;
- M_End:
- close;
-}
-
-//==================================================
-// Assassin Guild Guards
-//===================================================
-
-moc_fild16.gat,195,281,4 script Assassin Guardian#1::SinGuard 707,{
- mes "[Assassin Guardian]";
- if(BaseJob == Job_Assassin) {
- mes "Welcome.";
- close;
- }
- set @temp, rand(1,4);
- if(@temp == 1) mes "........";
- if(@temp == 2) mes "Hmmm..........";
- if(@temp == 3) mes "Hmmm... you shouldn't be here.....";
- if(@temp == 4) mes "You're trespassing on forbidden grounds.......";
- close;
-}
-
-moc_fild16.gat,204,281,4 duplicate(SinGuard) Assassin Guardian#2 707
-moc_fild16.gat,207,281,4 duplicate(SinGuard) Assassin Guardian#3 707
-moc_fild16.gat,216,281,4 duplicate(SinGuard) Assassin Guardian#4 707
-moc_fild16.gat,200,231,4 duplicate(SinGuard) Assassin Guardian#5 707
-moc_fild16.gat,211,231,4 duplicate(SinGuard) Assassin Guardian#6 707
-moc_fild16.gat,200,257,4 duplicate(SinGuard) Assassin Guardian#7 707
-moc_fild16.gat,211,257,4 duplicate(SinGuard) Assassin Guardian#8 707
+//===== eAthena Script =======================================
+//= Morroc Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= Fixed Lapidary sprite, Implemented ANTHELL trigger
+//= (in both NPC/Warps) [Lupus]. Removed it from NPC and put in Warp
+//= 1.3 Removed some NPC due to Assassin Job Quest [kobra_k88]
+//= 1.3b mobs name corrected [Lupus], 1.3c - Adv classes support
+//= 1.4 Fixed typo’s [Nexon]
+//= 1.5 Added a lvl 4 weapon quest related NPC [MasterOfMuppets]
+//= 1.6 Added Bartender NPC, made by Persian69 [Vicious_Pucca]
+//= 1.7 Removed Duplicates [Silent]
+//============================================================
+
+
+//==================================================== Town of Morroc ====================================================\\
+
+// Old Scholar ===============================
+morocc_in.gat,112,122,2 script Old Scholar 61,{
+ mes "[Old Scholar]";
+ mes "I've devoted my Life to researching the Pyramids. Although I not found anything significant yet, I am confident that I will find the Tomb of Ancient King, Osiris!";
+ next;
+ mes "[Old Scholar]";
+ mes "It is within the largest of the Morroc Pyramids, that the Greatest King in History sleeps the eternal sleep. That is... if my memory serves me correctly......";
+ close;
+}
+
+// Drunk Man =================================
+morocc.gat,44,180,8 script Drunk Man 89,{
+ mes "[Drunk Man]";
+ mes "Heh Heh... (Hiccup)! Oh, Are you new here? Nice to meet ya, Buddy! So how was your trip?";
+ mes "This was predestined that you and I meet here, I tell you what (Hiccup). Let me tell you something I just heard from the pub....";
+ next;
+ mes "[Drunk Man]";
+ mes "It's rumored that there is a special Dagger that can bring great fortune to its owner.";
+ mes "There is a well-know Thief in Rune-Midgard that possesses this Dagger, and has never been caught";
+ next;
+ mes "[Drunk Man]";
+ mes "What I would give to get my hands something like that(Hiccup). But only in my dreams....";
+ next;
+ mes "[Drunk Man]";
+ mes "How about you? Why don't you Look for it? It shouldn't be a problem for someone as brave as yourself?";
+ mes "Kekeke keke(Hiccup)! Buy me a drink later if you ever find that dagger. Promise me, alright?(Hiccup!)";
+ emotion e_hmm;
+ close;
+}
+
+// Towner =================================
+morocc.gat,68,260,8 script Towner 99,{
+ mes "[Towner]";
+ mes "Those giant, Triangular Buildings North West of town are called Pyramids... They have been there for thousands and thousands of years.";
+ next;
+ mes "[Towner]";
+ mes "Nobody knows when and why they were built or who built them. All we know for sure is that there are tons of Horrendous Monsters inside of them.";
+ next;
+ mes "[Towner]";
+ mes "I think you'd better stay away from them. The monsters in the Pyramid LOVE to feed on strangers. Kekekekek...";
+ close;
+}
+
+// Ant Man Akira =============================
+morocc.gat,76,75,4 script Ant Man Akira 47,{
+ mes "[Ant Man Akira]";
+ mes "About 1 map north and 3 maps east of Morroc, there lies the entrance to a cave known as ^ff0000ANTHELL^000000 ...";
+M_Menu:
+ next;
+ menu "'Anthell ?'",M_Anthell,"Ants?",M_Ants,"End conversation",M_End;
+
+ M_Anthell:
+ mes "[Ant Man Akira]";
+ mes "Anthell gets it's name from the fact that the cave is home to the largest colony of giant ants in Rune-Midgard.";
+ mes "There are literally thousands of ants performing work for the colony while their queens lay hundreds and hundreds of eggs.";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Many people go there to train because of the numerous amounts of ant eggs. But be careful...";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Attack an ant by mistake, and you'll find yourself surrounded by a swarm of them before you can even use a fly wing!";
+ emotion e_gasp;
+ goto M_Menu;
+ M_Ants:
+ mes "[Ant Man Akira]";
+ mes "There are 3 different kinds of Ant, each with a unique color and name. Each one has a different role in the colony.";
+ mes "Andres are white, Pieres are green, and Deniros are red colored. Their differences are not merely cosmetic however.";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Andres are the weakest of the ants while Deniros are the most fierce some of the ants. Pieres lay somewhere in the middle.";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Be careful when your around them. If you hit 1 Andre the other Andres in the area with swarm and attack you.";
+ mes "The same goes for Deniros and Pieres. You should also know that ants are looters so watch out for your items.";
+ goto M_Menu;
+ M_End:
+ mes "[Ant Man Akira]";
+ mes "Before you go, let me tell you about Giearths. They are not ants but they live in Anthell. Don't underestimate them because of their small size.";
+ mes "They are extremely tough and should only be handled by high level wariors.";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Well see ya around.";
+ close;
+}
+
+// Poring Lady Syvia ==================================
+morocc.gat,79,111,2 script Poring Lady Syvia 700,{
+ mes "[Poring Lady Syvia]";
+ mes "All over Rune-Midgard you can see lots of cute monsters such as Spores, the mushroom type creature....";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Or Pickys, desert chicks that wear egg shells on their heads and jump around in the Morroc Desert..!";
+ mes "However you can't deny that the ^FF8888Poring^000000 is the cutest and most popular creature in all of Rune-Midgard.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Although everybody knows about the common pink Poring, there are 2 Rare porings that live near Prontera and are getting a lot of attention.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "They are the ^ffaa00Angeling^000000 and the ^5555ffGhostring^000000";
+M_Menu:
+ next;
+ menu "Angeling?",M_Angel,"Ghostring?",M_Ghost,"Quit Conversation",M_Quit;
+
+ M_Angel:
+ mes "[Poring Lady Syvia]";
+ mes "The Angeling is a poring with angel wings. It is rarely seen but it is quite a sight. Don't not be fooled by it's angelic look however.";
+ mes "It is a high level monster armed with the Holy property. It is immune to almost all magic attacks except those of the neutral & shadow property.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Physical attacks are definitely the way to go against these monsters.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Don't I know a lot about porings? Quite frankly I'm in love with them.... =P";
+ goto M_Menu;
+
+ M_Ghost:
+ mes "[Poring Lady Syvia]";
+ mes "The Ghostring is an evil ghost poring. It is rarely seen and luckly so.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "It is a high-level monster armed with the ghost property. This makes it immune to physical attacks. So Archers, Swordsman, and Thieves beware!";
+ mes "Only weapons with elemental properties will work on Ghostrings. Of course magic attacks work very well on them also.";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Don't I know a lot about porings? Quite frankly I'm in love with them.... =P";
+ goto M_Menu;
+
+ M_Quit:
+ mes "[Poring Lady Syvia]";
+ mes "OMG!";
+ emotion e_omg;
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "You dare dismiss a poring expert such as myself? I am proud of my knowledge about all things poring!!";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Hmf!";
+ emotion e_pif;
+ close;
+}
+
+// Slayer Kid ====================================
+morocc.gat,123,58,4 script Slayer Kid 118,{
+ mes "[Slayer Kid]";
+ mes ".... An expert in hand to hand combat who polishes off enemies quickly and quietly....";
+ next;
+ mes "[Slayer Kid]";
+ mes "That is the ^ff00ffAssassin^000000!!";
+M_Menu:
+ next;
+ menu "Hmm??",M_0,"Where can I find the Assassin Clan?",M_1,"End conversation",M_End;
+
+ M_0:
+ mes "[Slayer Kid]";
+ mes "Assassins are a secretive group of elite killers. People say Assassins are highly trained in 'eliminating' their targets without leaving a trace.";
+ next;
+ mes "[Slayer Kid]";
+ mes "It's been 3 months since I left home to search for the Assassin clan.... Just where are they??!!!";
+ goto M_Menu;
+ M_1:
+ mes "[Slayer Kid]";
+ mes "People say that if you go 2 maps on the east of Morroc, then 2 maps south, you'll be able to find the Assassin Clan.";
+ next;
+ mes "[Slayer Kid]";
+ mes "If you are granted an Assassin Cross, the emblem of the clan master, you will be allowed to become an Assassin.";
+ mes "The Assassin Cross is a high honor and is given to the best Assassin among Assassins!";
+ next;
+ mes "[Slayer Kid]";
+ mes "To tell you the truth however... I don't think they the clan really exists...";
+ next;
+ mes "[Slayer Kid]";
+ mes "I've been searching for them for over 3 months now and nothing. It seems almost impossible for me to become an Assassin now......";
+ goto M_Menu;
+ M_End:
+ close;
+
+}
+
+// Lapidary =======================================
+morocc.gat,150,50,8 script Lapidary 99,{
+ mes "[Lapidary]";
+ mes "The Queen of Jewelry is the Diamond. No one can deny its beautiful appearance. That's why it cost so much to buy...";
+ next;
+ mes "[Lapidary]";
+ mes "Many factors increase its value, with the most important factor being size.";
+ next;
+ mes "[Lapidary]";
+ mes "A high quality Diamond should be perfect and not chipped or cracked in any way.";
+ close;
+}
+
+// Uncle Dimitrii ==========================================
+morocc.gat,180,155,4 script Uncle Dimitri 49,{
+ mes "[Uncle Dimitrii]";
+ mes "The avarage temperature in the Morroc Desert is many times higher than anywhere else in the Rune-Midgard Kingdom.";
+ next;
+ mes "[Uncle Dimitrii]";
+ mes "Be careful of where you choose to sit down and rest. Choose the wrong spot and your butt may catch on fire!!";
+M_Menu:
+ next;
+ menu "About the Desert sand",M_1,"About the remedy for Fatigue",M_2,"End conversation",M_End;
+
+ M_1:
+ mes "[Uncle Dimitri]";
+ mes ". . . . . Well";
+ next;
+ mes "[Uncle Dimitri]";
+ mes "It's SUPPOSED to be HOT!!! But it actually isn't really that hot.....";
+ next;
+ mes "[Uncle Dimitri]";
+ mes "For some odd reason the sand in the Morroc desert doesn't conduct as much heat as the sand in other deserts.";
+ mes "Instead of being scorching hot, the sand just feels warm.... so it's ok for you to sit down for a good rest";
+ next;
+ mes "[Uncle Dimitri]";
+ mes "So everybody can recover their HP and SP without fear of catching on fire.";
+ goto M_Menu;
+ M_2:
+ mes "[Uncle Dimitri]";
+ mes "Aaaaahhh!!!!";
+ next;
+ mes "[Uncle Dimitri]";
+ mes "Nothing beats desert fatigue like a couple of potions! The ^ff0000Red^000000 ones are especially popular because of their low cost and light weight.";
+ next;
+ mes "[Uncle Dimitri]";
+ mes "They only recover a small amount of hp, but combined with a dip in a desert oasis, a couple ^ff0000Reds^000000 are all you need.";
+ goto M_Menu;
+ M_End:
+ mes "[Uncle Dimitri]";
+ mes "Did you know that you can get ^0000bb'Milk'^000000 from a 'PecoPeco's Egg'? I wonder how that works......?";
+ close;
+}
+
+// Trader Joe =====================================
+morocc.gat,208,85,7 script Trader Joe 83,{
+ mes "[Trader Joe]";
+ mes "I earn a living as a Trader so I'm constantly traveling between Morroc and Prontera.";
+ mes "I can't even count how many times I've been across the Hot, Dry desert.";
+ next;
+ mes "[Trader Joe]";
+ mes "One day, while I was out in the Desert, I unexpectedly ran out of water and became extremely thirsty.";
+ mes "I was desperate so I decided to try to get some water out of a cactus when.......";
+ next;
+ mes "[Trader Joe]";
+ mes "ALL OF THE SUDDEN!!! The cactus let out this LOUD SCREAM and started to SHOOT its NEEDLES at me!!";
+ emotion e_omg;
+ next;
+ mes "[Trader Joe]";
+ mes "It was THE WORST experience of my ENTIRE LIFE.";
+ next;
+ mes "[Trader Joe]";
+ mes "I figured out later that it wasn't a normal cactus that attacked me but it was ^00cc00Muka^000000, the cactus monster.";
+ next;
+ mes "[Trader Joe]";
+ mes "So be careful the next time you're out in the desert. You don't want to make the same mistake I made. (~Sigh~)";
+ close;
+}
+
+// Fly Man Armani ===============================
+morocc.gat,234,273,3 script Fly Man Armani 54,{
+ mes "[Fly Man Armani]";
+ mes "I SAW IT!! I SAW IT!!!";
+ emotion e_ic;
+ next;
+ mes "[Fly Man Armani]";
+ mes "I saw the rare ^ff0000Dragon Fly^000000 just South of here! It was incredible!!";
+ next;
+ menu "What... Dragon Fly?!",M_0,"So what?",M_1;
+
+ M_0:
+ mes "[Fly Man Armani]";
+ mes "It is the boss of desert flies and its much stronger than any other ordinary fly.";
+ mes "It's a rare sight to behold, and for anybody strong enough and lucky enough to defeat it.... ";
+ next;
+ mes "[Fly Man Armani]";
+ mes "The Dragon Fly may even drop an UTLRA RARE item called a ^0000ddClip^000000!";
+ mes "Clips are items that you can attach to weapons, armor, and almost every kind of accessory.";
+ next;
+ mes "[Fly Man Armani]";
+ mes "Clips are ^ffaa00slotted^000000 and therefore you can insert cards into them. That's what makes them so valuable.";
+ mes "It seems like everyone is yearning for a clip these days.";
+ next;
+ mes "[Fly Man Armani]";
+ mes "Say.... why don't YOU challenge the Dragon Fly?";
+ emotion e_hmm;
+ close;
+ M_1:
+ mes "[Fly Man Armani]";
+ mes "SO WHAT!!??";
+ emotion e_omg;
+ next;
+ mes "[Fly Man Armani]";
+ mes "Do you dare underestimate the Dragon Fly?? Bleh! It may be a fly, but I guarantee you THIS FLY is more than you can handle!";
+ emotion e_pif;
+ next;
+ mes "[Fly Man Armani]";
+ mes "No matter. If you ARE fortunate enough to run into it, you'll quickly see what I mean. After all, it IS the FLY of ALL FLIES!!!!";
+ next;
+ mes "[Fly Man Armani]";
+ mes "^ff0000Dragon Fly^000000. Remember this name well!!";
+ close;
+}
+
+// Uncle Phlanette ================================
+morocc.gat,277,213,4 script Uncle Phlanette 48,{
+ mes "[Uncle Phlanette]";
+ mes "Morroc is a highly dry region surrounded by desert. There isn't a place as hot or dry as Morroc anywhere in Rune-Midgard.";
+M_Menu:
+ next;
+ menu "Desert Story",M_0,"Quit Coversation",M_End;
+
+ M_0:
+ mes "[Uncle Phlanette]";
+ mes "Let me tell you a little about the desert.....";
+ next;
+ mes "[Uncle Phlanette]";
+ mes "You see the desert is a place that is bare of vegetation due to low rainfall and a high evaporation rate.";
+ mes "Even so there are plants that seem to thrive in the desert. And where there are plants, there are animals.";
+ next;
+ mes "[Uncle Phlanette]";
+ mes "So even with the high temperatures, and limited water, living creatures still find a way to survive in the desert.";
+ next;
+ mes "[Uncle Phlanette]";
+ mes "Unfortunately, for unknown reasons, some of the plants and animals in the desert have turned into dangerous monsters.";
+ mes "The ^00cc00'Mukas'^000000 are one of those monsters. They were originally cactus plants.";
+ goto M_Menu;
+ M_End:
+ mes "[Uncle Phlanette]";
+ mes "Sand HERE! Sand THERE! Sand EVERYWHERE!!!!";
+ emotion e_gasp;
+ next;
+ mes "[Uncle Phlanette]";
+ mes "(~Sigh~) I'm SICK and TIRED of this sand and desert...";
+ next;
+ mes "[Uncle Phlantette]";
+ mes "Morroc......!! I HATE YOU!!!!!!";
+ emotion e_pif;
+ close;
+}
+
+//Bartender
+morocc_in.gat,166,76,3 script Bartender#02 46,{
+ mes "[Bartender]";
+ mes "What are you going to order?";
+ next;
+ menu "Tropical Sograt",L1,"Vemillion the Beach",L2,"Nothing.",-;
+
+ mes "[Bartender]";
+ mes "Hmm...";
+ close;
+
+L1:
+ if (zeny < 1000 ) goto Nomoney;
+ getitem 12112,1;
+ set zeny,zeny-1000;
+ mes "[Bartender]";
+ mes "Here you go.";
+ mes "Fruits are major ingredients,";
+ mes "but don't drink too much.";
+ close;
+
+L2:
+ if (zeny < 1000 ) goto Nomoney;
+ getitem 12113,1;
+ set zeny,zeny-1000;
+ mes "[Bartender]";
+ mes "Here you go.";
+ mes "but don't drink too much.";
+ close;
+
+Nomoney:
+ mes "[Bartender]";
+ mes "Are you asking me to give it for free?";
+ mes "You are one crazy person.";
+ mes "Don't even think about drinking if you don't have 1,000 zeny.";
+ close;
+}
+
+// Lvl 4 weapon quest related NPC ================================
+
+morocc.gat,289,230,3 script Citizen#06 92, {
+ mes "[Citizen]";
+ mes "Meeting a dead man is basically";
+ mes "impossible.";
+ mes "Even if you met one,";
+ mes "he would not have the full memory of his life.";
+ next;
+ mes "[Citizen]";
+ mes "But if you brought a thing that he";
+ mes "used to keep in his life,";
+ mes "it would be possible to retrieve his memory of the life.";
+ mes "Of course, we can confirm this theory only";
+ mes "when we meet a dead man.";
+ close;
+}
+
+//<================================================== Assassin Guild ====================================================>\\
+
+// Hashisid ====================================
+moc_fild16.gat,199,212,4 script Hashisid 48,{
+ mes "[Hashisid]";
+ mes "For Assassins, it is important not to look a target in the eye. If a target is smart, he/she may be able to tell what you're up too.";
+ next;
+ menu "About Assassins",M_0,"Quit Conversation",M_End;
+
+ M_0:
+ mes "[Hashisid]";
+ mes "Let me tell you a little bit about Assassins";
+ next;
+ mes "[Hashisid]";
+ mes "Assassin's are hired to infiltrate, gather intelligence, and even commit murder without being seen or heard.";
+ mes "Stealth and speed are vital to Assassins. Assassins live in the shadows and never get praise or congratulations.";
+ next;
+ mes "[Hashisid]";
+ mes "It's their job to go unnoticed. Though an Assassin may seem like a cruel and heartless individual....";
+ mes "An Assassin will never do any harm to an innocent being. The main purpose of the Assassin to seek out and destroy evil forces!";
+ close;
+ M_End:
+ close;
+}
+
+//==================================================
+// Assassin Guild Guards
+//===================================================
+
+moc_fild16.gat,195,281,4 script Assassin Guardian#1::SinGuard 707,{
+ mes "[Assassin Guardian]";
+ if(BaseJob == Job_Assassin) {
+ mes "Welcome.";
+ close;
+ }
+ set @temp, rand(1,4);
+ if(@temp == 1) mes "........";
+ if(@temp == 2) mes "Hmmm..........";
+ if(@temp == 3) mes "Hmmm... you shouldn't be here.....";
+ if(@temp == 4) mes "You're trespassing on forbidden grounds.......";
+ close;
+}
+
+moc_fild16.gat,204,281,4 duplicate(SinGuard) Assassin Guardian#2 707
+moc_fild16.gat,207,281,4 duplicate(SinGuard) Assassin Guardian#3 707
+moc_fild16.gat,216,281,4 duplicate(SinGuard) Assassin Guardian#4 707
+moc_fild16.gat,200,231,4 duplicate(SinGuard) Assassin Guardian#5 707
+moc_fild16.gat,211,231,4 duplicate(SinGuard) Assassin Guardian#6 707
+moc_fild16.gat,200,257,4 duplicate(SinGuard) Assassin Guardian#7 707
+moc_fild16.gat,211,257,4 duplicate(SinGuard) Assassin Guardian#8 707
diff --git a/npc/cities/niflheim.txt b/npc/cities/niflheim.txt
index 7dc7a0aa1..9c23d22c1 100644
--- a/npc/cities/niflheim.txt
+++ b/npc/cities/niflheim.txt
@@ -1,211 +1,211 @@
-//===== eAthena Script =======================================
-//= Niflheim Script
-//===== By: ==================================================
-//= Fyrien, Dizzy, PKGINGO
-//= Official NPCs translated and re-edited by Celest
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= Any eAthena Version; Niflheim Required
-//===== Description: =========================================
-//= Official NPC's for Niflheim
-//= 1.01 Splitted file(guides, shops). Fixed rand() bugs,
-//= missing labels bugs, optimization [Lupus]
-//= 1.03 fixed end; -> close;
-//= 1.04-1.05 fixed several bugs with missing CLOSE button, wrong var name
-//= in Piano Keys quest
-//= fixed zeny/item, exploit in Sairin, some optimizations [Lupus]
-//= 1.06 some typos in some variables fixed (thx 2 Dr.Evil) [Lupus]
-//= 1.07 Fixed typos [Nexon]
-//= 1.08 Commented "Traveler" out as it is not official & we have correct Bungee quest in.
-//= Also removed TODO, as they are already done. [Vicious_Pucca]
-//= 1.1 Replaced nif_q_done with MISC_QUEST & 32. nif_t -> @nif_t [Lupus]
-//= 1.2 Removed Duplicates [Silent]
-//= 1.3 Moved Book of Devil and Piano quest to quests/quests_niflheim.txt [Evera]
-//============================================================
-
-
-niflheim.gat,52,174,3 script Kirz 796,{
- mes "[Kirz]";
- mes "Humans are not allowed here!";
- mes "Living things-! are not";
- mes "allowed to pass!";
- close;
-}
-
-niflheim.gat,213,221,0 script Spirit::spirits 802,{
- mes "[Spirit]";
- mes "Welcome to my world...";
- mes "This land we call....";
- mes "Niflheim....";
- percentheal -85,-85;
- close;
-}
-
-niflheim.gat,39,146,0 duplicate(spirits) Spirit#2 802
-niflheim.gat,95,61,0 duplicate(spirits) Spirit#3 802
-niflheim.gat,313,187,0 duplicate(spirits) Spirit#4 802
-niflheim.gat,212,264,0 duplicate(spirits) Spirit#5 802
-niflheim.gat,247,72,0 duplicate(spirits) Spirit#6 802
-niflheim.gat,130,176,0 duplicate(spirits) Spirit#7 802
-niflheim.gat,173,110,0 duplicate(spirits) Spirit#8 802
-niflheim.gat,182,167,0 duplicate(spirits) Spirit#9 802
-
-
-niflheim.gat,195,211,5 script Gigantia 796,{
- mes "[Gigantia]";
- mes "The Lord of Death always sees everything...";
- close;
-}
-
-niflheim.gat,153,215,3 script Feline 794,{
- mes "[Feline]";
- mes "Why are you in this dangerous village?";
- mes "Better go back fast...";
- close;
-}
-
-nif_in.gat,16,27,1 script Dead Cock 800,{
- mes "[Dead Cock]";
- mes "I was eaten by humans when alive,";
- mes "now it's my turn to eat you! Gugugugu~";
- mes "Aaah, I can't believe there's such a world after death, gugugu";
- percentheal -5,0;
- close;
-}
-
-nif_in.gat,16,30,4 script Vampire Bat 799,{
- mes "[Vampire Bat]";
- mes "Alive or dead, human blood";
- mes "is always the tastiest!";
- mes "What? You want your blood";
- mes "to be sucked by me? Nice nice-!";
- percentheal -5,0;
- close;
-}
-
-nif_in.gat,156,93,5 script Child 793,{
- mes "[Alakina Ann]";
- mes "Where, is this place? I just woke up";
- mes "and found myself here... mommy...";
- mes "have you seen my mommy, hmm? ... sob...";
- mes "I want to go home...";
- next;
- menu "About the witch...",L_Wizzard,"About the curse...",L_Curse,"Stop conversation",L_end;
-
-L_Wizzard:
- mes "[Alakina Ann]";
- mes "A witch? I don't know any witches...";
- mes "although I read about them in storybooks,";
- mes "but I don't know if they're real or not,";
- mes "must be really scary if she is real...";
- next;
- mes "[Alakina Ann]";
- mes "But why is it so cold?";
- if (sex == 1) mes "Aren't you cold, brother? Wierd... Hu~";
- if (sex == 0) mes "Aren't you cold, sister? Wierd... Hu~";
- mes "I miss my warm home,";
- mes "Can you help me please? Hmmm? Hmmm?";
- close;
-
-L_Curse:
- mes "[Alakina Ann]";
- mes "Curse... My grandma told me";
- mes "she has a way to avoid any curse";
- mes "unlifteable by holy blessings...";
- next;
- mes "[Alakina Ann]";
- mes "Klaatu...";
- mes "Verata.....";
- mes "And... something... something... what was it?";
- mes "I can't remember the last one.";
- next;
- mes "[Alakina Ann]";
- mes "She said if you can pronounce these magic words";
- mes "to escape a cursed fate.";
- mes "Now I can't remember what she said was important...";
- mes "looks like I forgot them too.";
- close;
-
-L_end:
- mes "[Alakina Ann]";
- mes "So cold... so cold... I wish I could";
- mes "go home... if you can please take me with you...";
- mes "it's too scary here...";
- mes "please.... help me....";
- close;
-}
-
-niflheim.gat,350,258,5 script Cursed Soul::cursedsoul 802,{
- killmonster "niflheim.gat","cursedsoul::OnNFMob";
- mes "[Ashe Bruce]";
- mes "I feel a strong curse on youaaaahhhhh";
- mes "I shall deny your existanceahhhhhhh";
- mes "Turn back or you will dieeeaaaahhhh";
- mes "Don't touch my boookkssaaaahhhh";
- next;
- menu "Pick up 1st book",L_book1,"Pick up 2nd book",L_book2,"Pick up 3rd book",L_book3,"Leave silently",L_back;
-
-L_book1:
- mes "[Ashe Bruce]";
- mes "Don't you touch my bookssssahhh!!";
- mes "Ahahaha, I curse you for being bitten, torn and clawed at!!";
- mes "Forever binded to this curse!!";
- monster "niflheim.gat",350,258,"Rideword",1478,1,"cursedsoul::OnNFMob";
- close;
-
-L_book2:
- mes "[Ashe Bruce]";
- mes "I said don't touch my booksssahhh...";
- mes "Get lost....";
- mes "Don't disrupt my restingggaaahh!!";
- warp "niflheim.gat",34,162;
- close;
-
-L_book3:
- set @nif_t,0;
- mes "[Ashe Bruce]";
- mes "Ahahaha.... I see you are brave!!";
- mes "Start reading your prayersahahahah!!";
- next;
- if(select("Clover.:Klaatu.:Kleitos.")==2)
- set @nif_t,@nif_t + 10;
-
- if(select("Verit.:Veritas.:Verata.")==3)
- set @nif_t,@nif_t + 10;
-
- if(select("Necktie.:Necklace.:Nero.:^FFFFFFNictu.^000000")==4)
- set @nif_t,@nif_t + 10;
-
- mes "[Ashe Bruce]";
- if(@nif_t == 30){
- if(rand(9)){
- mes "Your prayers were correctaaahhhh...";
- mes "but your curse still remainsaaahhhh!!";
- mes "Haahahahaha.....!!!";
- close;
- }
- mes "Hahahaha!! Your curse has been lifted!!";
- mes "Gahahahaha.....!!!";
- close;
- }
- mes "Hahahaha!! Your prayers were wrong!!";
- mes "Time to face deathohohohoho,";
- mes "May you be cursed forevahahahaha!!";
- monster "niflheim.gat",349,256,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",347,258,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",347,254,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",350,252,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",344,255,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",348,252,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- monster "niflheim.gat",347,259,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
- close;
-
-L_back:
- mes "[Ashe Bruce]";
- mes "Ahahahaha! Not bad thinking at alllhhhaahaaa...";
- mes "I shall pray that you live to returnahhhh....";
- close;
-OnNFMob:
- end;
-}
+//===== eAthena Script =======================================
+//= Niflheim Script
+//===== By: ==================================================
+//= Fyrien, Dizzy, PKGINGO
+//= Official NPCs translated and re-edited by Celest
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= Any eAthena Version; Niflheim Required
+//===== Description: =========================================
+//= Official NPC's for Niflheim
+//= 1.01 Splitted file(guides, shops). Fixed rand() bugs,
+//= missing labels bugs, optimization [Lupus]
+//= 1.03 fixed end; -> close;
+//= 1.04-1.05 fixed several bugs with missing CLOSE button, wrong var name
+//= in Piano Keys quest
+//= fixed zeny/item, exploit in Sairin, some optimizations [Lupus]
+//= 1.06 some typos in some variables fixed (thx 2 Dr.Evil) [Lupus]
+//= 1.07 Fixed typos [Nexon]
+//= 1.08 Commented "Traveler" out as it is not official & we have correct Bungee quest in.
+//= Also removed TODO, as they are already done. [Vicious_Pucca]
+//= 1.1 Replaced nif_q_done with MISC_QUEST & 32. nif_t -> @nif_t [Lupus]
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Moved Book of Devil and Piano quest to quests/quests_niflheim.txt [Evera]
+//============================================================
+
+
+niflheim.gat,52,174,3 script Kirz 796,{
+ mes "[Kirz]";
+ mes "Humans are not allowed here!";
+ mes "Living things-! are not";
+ mes "allowed to pass!";
+ close;
+}
+
+niflheim.gat,213,221,0 script Spirit::spirits 802,{
+ mes "[Spirit]";
+ mes "Welcome to my world...";
+ mes "This land we call....";
+ mes "Niflheim....";
+ percentheal -85,-85;
+ close;
+}
+
+niflheim.gat,39,146,0 duplicate(spirits) Spirit#2 802
+niflheim.gat,95,61,0 duplicate(spirits) Spirit#3 802
+niflheim.gat,313,187,0 duplicate(spirits) Spirit#4 802
+niflheim.gat,212,264,0 duplicate(spirits) Spirit#5 802
+niflheim.gat,247,72,0 duplicate(spirits) Spirit#6 802
+niflheim.gat,130,176,0 duplicate(spirits) Spirit#7 802
+niflheim.gat,173,110,0 duplicate(spirits) Spirit#8 802
+niflheim.gat,182,167,0 duplicate(spirits) Spirit#9 802
+
+
+niflheim.gat,195,211,5 script Gigantia 796,{
+ mes "[Gigantia]";
+ mes "The Lord of Death always sees everything...";
+ close;
+}
+
+niflheim.gat,153,215,3 script Feline 794,{
+ mes "[Feline]";
+ mes "Why are you in this dangerous village?";
+ mes "Better go back fast...";
+ close;
+}
+
+nif_in.gat,16,27,1 script Dead Cock 800,{
+ mes "[Dead Cock]";
+ mes "I was eaten by humans when alive,";
+ mes "now it's my turn to eat you! Gugugugu~";
+ mes "Aaah, I can't believe there's such a world after death, gugugu";
+ percentheal -5,0;
+ close;
+}
+
+nif_in.gat,16,30,4 script Vampire Bat 799,{
+ mes "[Vampire Bat]";
+ mes "Alive or dead, human blood";
+ mes "is always the tastiest!";
+ mes "What? You want your blood";
+ mes "to be sucked by me? Nice nice-!";
+ percentheal -5,0;
+ close;
+}
+
+nif_in.gat,156,93,5 script Child 793,{
+ mes "[Alakina Ann]";
+ mes "Where, is this place? I just woke up";
+ mes "and found myself here... mommy...";
+ mes "have you seen my mommy, hmm? ... sob...";
+ mes "I want to go home...";
+ next;
+ menu "About the witch...",L_Wizzard,"About the curse...",L_Curse,"Stop conversation",L_end;
+
+L_Wizzard:
+ mes "[Alakina Ann]";
+ mes "A witch? I don't know any witches...";
+ mes "although I read about them in storybooks,";
+ mes "but I don't know if they're real or not,";
+ mes "must be really scary if she is real...";
+ next;
+ mes "[Alakina Ann]";
+ mes "But why is it so cold?";
+ if (sex == 1) mes "Aren't you cold, brother? Wierd... Hu~";
+ if (sex == 0) mes "Aren't you cold, sister? Wierd... Hu~";
+ mes "I miss my warm home,";
+ mes "Can you help me please? Hmmm? Hmmm?";
+ close;
+
+L_Curse:
+ mes "[Alakina Ann]";
+ mes "Curse... My grandma told me";
+ mes "she has a way to avoid any curse";
+ mes "unlifteable by holy blessings...";
+ next;
+ mes "[Alakina Ann]";
+ mes "Klaatu...";
+ mes "Verata.....";
+ mes "And... something... something... what was it?";
+ mes "I can't remember the last one.";
+ next;
+ mes "[Alakina Ann]";
+ mes "She said if you can pronounce these magic words";
+ mes "to escape a cursed fate.";
+ mes "Now I can't remember what she said was important...";
+ mes "looks like I forgot them too.";
+ close;
+
+L_end:
+ mes "[Alakina Ann]";
+ mes "So cold... so cold... I wish I could";
+ mes "go home... if you can please take me with you...";
+ mes "it's too scary here...";
+ mes "please.... help me....";
+ close;
+}
+
+niflheim.gat,350,258,5 script Cursed Soul::cursedsoul 802,{
+ killmonster "niflheim.gat","cursedsoul::OnNFMob";
+ mes "[Ashe Bruce]";
+ mes "I feel a strong curse on youaaaahhhhh";
+ mes "I shall deny your existanceahhhhhhh";
+ mes "Turn back or you will dieeeaaaahhhh";
+ mes "Don't touch my boookkssaaaahhhh";
+ next;
+ menu "Pick up 1st book",L_book1,"Pick up 2nd book",L_book2,"Pick up 3rd book",L_book3,"Leave silently",L_back;
+
+L_book1:
+ mes "[Ashe Bruce]";
+ mes "Don't you touch my bookssssahhh!!";
+ mes "Ahahaha, I curse you for being bitten, torn and clawed at!!";
+ mes "Forever binded to this curse!!";
+ monster "niflheim.gat",350,258,"Rideword",1478,1,"cursedsoul::OnNFMob";
+ close;
+
+L_book2:
+ mes "[Ashe Bruce]";
+ mes "I said don't touch my booksssahhh...";
+ mes "Get lost....";
+ mes "Don't disrupt my restingggaaahh!!";
+ warp "niflheim.gat",34,162;
+ close;
+
+L_book3:
+ set @nif_t,0;
+ mes "[Ashe Bruce]";
+ mes "Ahahaha.... I see you are brave!!";
+ mes "Start reading your prayersahahahah!!";
+ next;
+ if(select("Clover.:Klaatu.:Kleitos.")==2)
+ set @nif_t,@nif_t + 10;
+
+ if(select("Verit.:Veritas.:Verata.")==3)
+ set @nif_t,@nif_t + 10;
+
+ if(select("Necktie.:Necklace.:Nero.:^FFFFFFNictu.^000000")==4)
+ set @nif_t,@nif_t + 10;
+
+ mes "[Ashe Bruce]";
+ if(@nif_t == 30){
+ if(rand(9)){
+ mes "Your prayers were correctaaahhhh...";
+ mes "but your curse still remainsaaahhhh!!";
+ mes "Haahahahaha.....!!!";
+ close;
+ }
+ mes "Hahahaha!! Your curse has been lifted!!";
+ mes "Gahahahaha.....!!!";
+ close;
+ }
+ mes "Hahahaha!! Your prayers were wrong!!";
+ mes "Time to face deathohohohoho,";
+ mes "May you be cursed forevahahahaha!!";
+ monster "niflheim.gat",349,256,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",347,258,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",347,254,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",350,252,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",344,255,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",348,252,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ monster "niflheim.gat",347,259,"Orc Skeleton",1462,1,"cursedsoul::OnNFMob";
+ close;
+
+L_back:
+ mes "[Ashe Bruce]";
+ mes "Ahahahaha! Not bad thinking at alllhhhaahaaa...";
+ mes "I shall pray that you live to returnahhhh....";
+ close;
+OnNFMob:
+ end;
+}
diff --git a/npc/cities/payon.txt b/npc/cities/payon.txt
index 1ae304201..14aec2245 100644
--- a/npc/cities/payon.txt
+++ b/npc/cities/payon.txt
@@ -1,1024 +1,1024 @@
-//===== eAthena Script =======================================
-//= Payon City
-//===== By: ==================================================
-//= Muad Dib (1.0) Darkchild (1.1) Muad Dib (1.2)
-//= Darkchild (1.3) DracoRPG (1.5)
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= (New) Payon City Npcs
-//===== Additional Comments: =================================
-//= Most Credits To Muad Dib, Some Stuff By Me
-//= 1.4 - Corrected a few typos
-//= 1.5 - Rescripted old NPCs + scripted new ones (from iRO Sak) [DracoRPG]
-//= 1.5b - Used Dino9021's script for the Gemstone exchanger [DracoRPG]
-//= 1.5b1 fixed Gemstone Exchanger NPC [Lupus]
-//= 1.5b2 added adv.classes/baby classes support [Lupus]
-//= 1.6 Fixed typo’s [Nexon]
-//= 1.7 Fixed bugs and exploits V__V [Lupus]
-//= 1.8 Removed Duplicates [Silent]
-//= 1.9 Fixed missing next;'s [Evera]
-//= 2.0 fixed some bugs, optimized script, added missing msg [Lupus]
-//============================================================
-
-payon.gat,190,115,0 script Lady#05 90,{
- mes "[Lady]";
- mes "Did you know that in the past Payon was not as prosperous as it is now? Back then we had difficulty making a living for ourselves.";
- emotion e_gasp;
- next;
- mes "[Lady]";
- mes "The towns people were so poor that they could not even afford to properly bury their deceased family members.";
- mes "Because of this many people chose to simply place the dead corpses in the Cave near the village.";
- next;
- mes "[Lady]";
- mes "Not only was this a terrible way to treat those that passed away but it would later prove to have grave consequences for this town.";
- next;
- mes "[Lady]";
- mes "You see, because they were not given a proper burial, the dead were not able to leave this world and pass on to the other world.";
- mes "Instead they became mindless zombies, wretched souls that were forced to walk the earth for all eternity.";
- next;
- mes "[Lady]";
- mes "Their rotten bodies filled with pain and suffering, yearned for the taste of human flesh. Any living person who came near the cave would fall victim to these zombies.";
- mes "In order to protect the village the Elder Chief founded the Archer Village to train young warriors who could fight the zombies.";
- next;
- mes "[Lady]";
- mes "To this day the battle between the living and the undead still goes on.";
- mes "It is a very tragic situation, for those zombies were at one time beloved members of the Payon community.";
- close;
-}
-payon_in01.gat,177,91,5 script Young Man#06 88,{
- mes "[Young Man]";
- mes "I can see you are a stranger from the appearance of your traveling outfit. You must be a well-experienced fighter otherwise you couldn't successfully arrive at this steep place with all tough those creatures outside.";
- mes "However you miss something important for fights. You can't defeat those monsters only with might.";
- next;
- mes "[Young Man]";
- mes "Sometimes you will encounter some creatures with a hard-shell body which can't be damaged by physical attacks. Only psychic power like magic can defeat them at ease.";
- mes "If you study magic’s, works will be easier... If you don't, you'd better accompany with somebody using magic.";
- close;
-}
-
-payon.gat,104,62,5 script Young Man#07 88,{
- mes "[Young Man]";
- mes "I still remember the story my grandfather told me long ago about the Amulet that possessed an Evil Power within it.";
- next;
- mes "[Young Man]";
- mes "According to the story the Amulet could raise the dead from their Graves!!";
- mes "I am not sure if the story is true or not, but I wonder what would happen if I summoned my grandfather from his grave with it??...";
- next;
- mes "[Spooky Voice]";
- mes "~~~~My child... do not even think of such a thing!!!~~~~~";
- next;
- mes "[Young Man]";
- mes "Eeeeeeeeekkkkk?! Grampa? I-I-Is-Is t-t-th-that you?? ...";
- emotion e_wah;
- next;
- mes "(you notice that his pants have become wet... eeeewwwwwwwwww!!!....)";
- close;
-}
-
-payon_in01.gat,180,7,0 script Waitress 90,{
- mes "[Waitress]";
- mes "People in this place seem to be busy all the time, they come and go to be Archers or to buy arrows, I have to stick with this small shop.";
- mes "I feel so melancholy and bored.";
- emotion e_sob;
- next;
- mes "[Waitress]";
- mes "I am sick and tired of noodle soup. I have to take too many showers to get rid of the smell.";
- mes "But it isn't easy to deodorize. sigh...";
- next;
- mes "[Waitress]";
- mes "Where can I find the right person who is a really hot, sexy hunk, and who can take me out of this small place?";
- next;
- mes "[Waitress]";
- if(Sex)
- mes "Hello, mister?";
- else
- mes "Hello, lady?";
- next;
- mes "[Waitress]";
- mes "Grandma the fortuneteller told me that I would meet great luck in the near future!";
- mes "But look at me, what's wrong with me!! I am leaving a manageable life everyday!!";
- mes "Oh.. boy. What a dumb wishy-washy person I am.";
- emotion e_an;
- next;
- mes "[Waitress]";
- mes "I am so sorry, I should haven't said this to you. Now I am acting like i'm stupid.";
- mes "I am sorry dear, please forgive my misbehavior.";
- emotion e_swt;
- next;
- mes "[Waitress]";
- mes "So, how may I help you? ";
- next;
- menu "Have you ever heard of Zombies?",L_Menu1,"I want to have my fortune told.",L_Menu2,"I need some booze.",L_Menu3,"I'm good",L_Menu4;
-L_Menu1:
- mes "[Waitress]";
- mes "Zombies are the walking dead. You can easily spot them in this village, Payon.";
- mes "It's rumored that they fear holiness. That's why Archers prefer to use arrows made out of holy metal, silver against Zombies.";
- next;
- mes "[Waitress]";
- mes "Legend says the chief of this town used silver arrows against walking zombies that used to be his brethren, to enlighten their souls to rest in peace.";
- mes "We believe only this way, zombies can be leaded to the peaceful world beyond the realm.";
- next;
- mes "[Waitress]";
- mes "You might not agree on our tradition which respects the diseased.";
- next;
- mes "[Waitress]";
- mes "Somehow I would like to appreciate the chief to enlighten my grandfather's poor soul.";
- close;
-L_Menu2:
- mes "[Waitress]";
- mes "Oh! I must say she is really an extraordinary person. Well, it could be your luck, she doesn't hang around here much as she used to do.";
- emotion e_ic;
- next;
- mes "[Waitress]";
- mes "On the first place, she stayed here to mind her business, but ever since the chief recognized her talent, she's stayed in the central palace.";
- mes "You'd better go to there if you want to see her.";
- close;
-L_Menu3:
- mes "[Waitress]";
- mes "I am so sorry they're all sold out and we can't afford to prepare alcohol anymore due to hostile creatures out there.";
- mes "My master built a very strict rule of his own, that is we only provide the best drinks to customers.";
- next;
- mes "[Waitress]";
- mes "So please come later again.";
- next;
- mes "[Waitress]";
- mes "Sorry for your inconvenience.";
- emotion e_sry;
- close;
-L_Menu4:
- mes "[Waitress]";
- mes "Have a nice day, dear.";
- mes "Sob...I wish I could be in bed of roses.";
- emotion e_sob;
- close;
-}
-
-payon.gat,193,116,1 script Woman#05 66,{
- mes "[Woman]";
- mes "Welcome to Payon. You must have had a hard time getting through the thick forest? I hope you didn't run into too much trouble?";
- next;
- mes "[Woman]";
- mes "I'm glad to see a new face around here. You see the number of tourists has decreased drastically due to the enormous amount of monsters outside.";
- next;
- mes "[Woman]";
- mes "Payon has become a very quite town because of this. There's isn't much for the towns people to do nowadays. As for myself I'm just chit-chatting with my friends.";
- next;
- mes "[Woman]";
- mes "To be honest, things are getting tough because of those creatures... (sighs)...";
- next;
- mes "[Woman]";
- if(Sex){
- mes "Hmm... you look as strong as a Rocker! How many monsters have you killed?";
- mes "Let me tell you about a place where you can go train and become even stronger.";
- emotion e_hmm;
- }else{
- mes "Miss, how many monsters have you killed?";
- mes "I know a very good place for you to go train and get good monster drops.";
- emotion e_hmm;
- }
- next;
- mes "[Woman]";
- mes "I know of a cave near Archer Village. Just take the exit north of town and follow the path to your left.";
- mes "The cave is full of monsters and their spawn rate is very high. Does it sound interesting to you?";
- next;
- menu "It sounds dangerous.",L_Menu1,"I think I need to fully prepare for that place.",L_Menu2,"Lady, you wear nice clothing~",L_Menu3;
-L_Menu1:
- mes "[Woman]";
- mes "Oh don't be such a coward! It's just a simple cave filled with normal monsters. Archer Village is near by so you shouldn't be worried~ hohoho~";
- next;
- mes "[Woman]";
- mes "Of course... there are the zombies... and Munaks... and Bonguns... which can be VERY DEADLY.....";
- emotion e_hmm;
- close;
-L_Menu2:
- mes "[Woman]";
- mes "No need to worry about preparing yourself. There is an excellent tool dealer in front of town where you can purchase the items you need.";
- next;
- mes "[Woman]";
- mes "I know because he's my husband... oops... I mean an acquaintance of mine... heh heh..";
- emotion e_swt;
- close;
-L_Menu3:
- mes "[Woman]";
- mes "Oh hohohoho! SO you noticed! This is what's in-style in Prontera these days! The women in this town don't know anything about fashion!";
- emotion e_ic;
- next;
- mes "[Woman]";
- mes "My husband buys me these clothes with the money he makes selling overpriced items to foolish young people... oh ho oh hoho...";
- emotion e_heh;
- close;
-}
-
-payon.gat,190,119,5 script Woman#06 66,{
- mes "[Jim's Mother]";
- mes "Oh boy there she goes again. She is a confirmed gossip. Please don't mistake her for being a typical Payon citizen.";
- emotion e_dots;
- next;
- mes "[Jim's Mother]";
- mes "Believe me, she's an exception. Not all of us here in Payon have big mouths. She gets too exited with fortune telling.";
- next;
- mes "[Jim's Mother]";
- mes "Anyway, you look like a new face. Are you new in town?";
- next;
- mes "[Jim's Mother]";
- if(Sex){
- mes "... Oh, you have broad shoulders ... tehehe! Will you go out with me? I'd like to make you a nice dinner...(bats eyelashes)";
- emotion e_kis;
- }else{
- mes "Don't you think your dress is too lousy?";
- mes "I don't like young ladies pounce up.";
- }
- next;
- menu "Fortune Telling?",-,"...Good Bye.",L_Bye;
-
- mes "[Jim's Mother]";
- mes "Oh yes, there is an extraordinary fortune teller here in town. You can find her in the central palace.";
- mes "The more money you pay her the more accurate your fortune will be told.";
- next;
- mes "[Jim's Mother]";
- mes "I saw her recently and she told me that I would meet a handsome young man this month............";
- if(Sex)
- mes ".......... tehehe. (winks at you)";
- else
- emotion e_lv;
- close;
-L_Bye:
- mes "[Jim's Mother]";
- mes "What? You have to go? Awwww...Why don't you stay and chit chat with me for a while...hmm? ...";
- close;
-}
-
-payon.gat,210,110,4 script Drunk 120,{
- mes "[Drunk]";
- if(BaseJob == Job_Archer){
- mes "Yoyo! Archer brother! Salute to your fingers stretching bowstring!";
- emotion e_ho;
- }else{
- mes "Hey hey! I am wondering how stupid archers who don't know how to aim targets could drink alcohol. Hahaha~!";
- mes "Do you want to buy me a drink?";
- emotion e_heh;
- }
- next;
- mes "[Drunk]";
- mes "Do you want to buy me a drink?";
- next;
- menu "Promise me you won't drink more than one jug.",L_Menu1,"No thanks,buddy.",L_Menu2,"Oh my god~ hell no~!",L_Menu3;
-L_Menu1:
- mes "[Drunk]";
- if(BaseJob == Job_Archer)
- mes "Thanksh brothaaa!... archerrrzzz are alwayssszz a generoushhh bunch!...(hicup!)";
- else
- mes "Thanksh!... shhtrangersszz are alwayssszz a generoushhh bunch!... archer guysh are penny pinchershh nowadayssszz!..(hicup!)";
- next;
- emotion e_thx;
- if(Zeny < 200) goto L_SUB_1;
- set Zeny,Zeny-200;
- mes "[Drunk]";
- mes "Thanks brother! Strangers are always generous without exception! Archer guys are pinch-pennies nowadays!";
- mes "Muhahahaha! I wasn't like that when I was young.";
- mes "Back then I was young, I used to fool around with girls! One of the grannies in this village and I was really hot back then!";
- mes "She still acts like a young lady in taste for cosmetics and stuff!";
- next;
- mes "[Drunk]";
- mes "Gulp~Gulp~Man! This is great! Thank you may man! Thank you! Muhahahahaha!";
- emotion e_no1;
- close;
-L_SUB_1:
- mes "[Drunk]";
- mes "Cheapass, don't even have enough money. Move on young one, your waisting my time!";
- close;
-L_Menu2:
- mes "[Drunk]";
- mes "Blah. Young people don't know how to respect elderly people!";
- mes "Fine! I won't beg you anymore! I won't...";
- emotion e_pif;
- close;
-L_Menu3:
- mes "[Drunk]";
- mes "Umm, oookay. Fine by me...";
- emotion e_no1;
- close;
-}
-
-payon_in01.gat,47,59,5 script Archer Zakk 88,{
- mes "[Archer Zakk]";
- mes "I am so worried about one of my pals. He speaks about much crap.";
- mes "Well he is an expert of archery, but I hate his big mouth...";
- mes "Our chief is also fed up with him.";
- emotion e_ag;
- next;
- menu "Archer?",-,"Chief?",L_Menu2,"Big Mouth?",L_Menu3;
-
- mes "[Archer Zakk]";
- mes "Ah yeah yeah. My friend is the number one archer in Payon, in the same costume as me too.";
- mes "He teaches newbie archers around the archer village.";
- mes "Well...you'd better talk to him at lease once.";
- close;
-L_Menu2:
- mes "[Archer Zakk]";
- mes "Chief lives in the central palace. He is the spiritual guide of Payon.";
- mes "He used to dictate to the whole Payon forest carrying Gakkung. I remember the battle scene he showed when I was a little kid. Hmm~";
- mes "Even though he is old and weak now...his eyes...he still has keen-sighted eyes of his young days, he can hit targets without missing.";
- next;
- mes "[Archer Zakk]";
- mes "I admire him from the bottom of my heart.";
- close;
-L_Menu3:
- mes "[Archer Zakk]";
- mes "You know a big mouth is the person who is much talkative and who doesn't stop talking.";
- mes "He never stops talking as I said, one day he started to talk while we did laundry at the riverbank, he stopped talking when we realized our shirts tunrned out to get tattered.";
- mes "He became a kind of legend, people used to call him as Bowing Mouth or Chatterbox instead of his real name.";
- mes "I've never seen a person talk as much as him.";
- next;
- mes "[Archer Zakk]";
- mes "I've been many places, but I didn't see any guy who likes talking or being talkative.";
- mes "Maybe other people agree on my opinion. Oh yes, I think you are with me.";
- mes "As I see your face, you've got friends of few words so far! Hmm Hmm!!";
- mes "Taciturnity is bliss, you know.";
- next;
- mes "[Archer Zakk]";
- mes "Ah, My friend Wolt? He doesn't have his place so he always stay at inn.";
- mes "I guess you can meet him by now. Why don't you go see him?";
- close;
-}
-
-payon_in01.gat,66,64,5 script Archer Wolt 88,{
- mes "[Archer Wolt]";
- mes "Archers should practice as much as they can. Otherwise they won't be an expert.";
- mes "Are you new here? Howdy!";
- next;
- mes "[Archer Wolt]";
- mes "I am Wolt the Archer. Just call me Wolt.";
- mes "I know this is an expected question, do you tend to idle away your time?";
- next;
- menu "Hell no.",L_Menu1,"Yeah I guess.",L_Menu2;
-L_Menu1:
- mes "[Archer Wolt]";
- mes "Hmm... You don't? You are born to be an archer then.";
- next;
- mes "[Archer Wolt]";
- mes "We Archers are constantly practicing and rarely have time to just sit around. So we hate people who are not diligent.";
- next;
- mes "[Archer Wolt]";
- mes "Are you curious about HOW we practice?";
- emotion e_what;
- next;
- mes "[Archer Wolt]";
- mes "From sunrise to sunset the Archers of Payon search the surrounding forest for monsters.";
- next;
- mes "[Archer Wolt]";
- mes "With a bow in our hands and arrows on our back we fight dangerous monsters in order to train ourselves as well as to help keep Payon safe";
- next;
- mes "[Archer Wolt]";
- mes "For us fighting monsters is a way of life...(blah blah blah)...I once saw the sun set on a river...(blah blah blah blah)...sometimes I feel pretty...(blah blah)...";
- next;
- menu "You must need a good bow.",L_sub1,"Oh well, isn't it a practice?",-;
- close;
-L_sub1:
- mes "[Archer Wolt]";
- mes "....Well YES!! A well crafted Bow is essential to the success of an archer!";
- emotion e_ic;
- next;
- mes "[Archer Wolt]";
- mes "Bows constructed in Payon are the greatest bows you can find in Rune-Midgard! They are light yet, strong and very durable.";
- emotion e_no1;
- next;
- mes "[Archer Wolt]";
- mes "This is because they are made out of high quality wood found only in the Payon Forest!";
- mes "My bow was made from a Walnut tree and will last for generations to come.";
- next;
- mes "[Archer Wolt]";
- mes "Unfortunately many of the wonderful trees in Payon forest have been affected by the evil force that has spread throughout Rune-Midgard and have turned into horrible creatures.";
- next;
- mes "[Archer Wolt]";
- mes "It's a pitty to see such beautiful trees become tools of evil...";
- next;
- mes "[Archer Wolt]";
- mes "Strange as it may sound, even as monsters the trees still provide high quality wood that can be used for bows.";
- mes "Maybe the trees seek to help us fight the evils in the land?...";
- next;
- menu "I didn't realize the forest was so dangerous",L_case,"(This guy talks way to much)",L_End;
-L_case:
- mes "[Archer Wolt]";
- mes "But you know monsters don't appear only in the forest. Don't you realize why the archer village was established in this place?";
- mes "Heading west, you can see a cave. Inside the cave, enormous monsters keep spawning without limit.";
- mes "We are here, to protect our territory against them in obedience to our chief's order.";
- next;
- menu "Cave?!",L_para1,"Chief?",L_para2,"Oh man I hate this stupid town~",L_para3;
-L_para1:
- mes "[Archer Wolt]";
- mes "Head north of town, you can see the cave I told you about.";
- mes "Inside there, you will encounter lots of ugly monsters such as bastard looking like a bat or the walking dead.";
- mes "If we let them out of the place, they would invade our town. We frequently clean up the cave.";
- next;
- mes "[Archer Wolt]";
- mes "However they are endlessly respawned. It seems we're wasting our time and labor without nothing...";
- mes "Enough already, let's cut off this crap. Even I can't talk more than this.";
- mes "I have lots of things to do!";
- close;
-L_para2:
- mes "[Archer Wolt]";
- mes "The Elder Chief is such a great person... although he always scolds me because he says I talk too much.";
- next;
- mes "[Archer Wolt]";
- mes "I don't think I talk all that much...I mean..(blah blah blah)...so I said to the guy...(blah blah blah blah blah).....";
- next;
- mes "[Archer Wolt]";
- mes "... uh... anyways... back to the Chief...";
- emotion e_swt;
- next;
- mes "[Archer Wolt]";
- mes "In the past he bravely protected Payon with his Gakung Bow. Now he is elderly, though he still worries about the safety of the town.";
- mes "He resides in the Palace and has his own personal gaurd. Only high level warriors are allowed to speak with him.";
- close;
-L_para3:
- mes "[Archer Wolt]";
- mes "Well that’s not very nice!";
- mes "If you don't like our humble town then you should leave, bastard!";
- close;
-L_Menu2:
- mes "[Archer Wolt]";
- mes "Hmm...sometimes you need rest.";
- mes "Do you want to listen to my story? I set fire on my house during my last holiday~ hahaha~ I fell a sleep while I heated the bath. Hahaha!";
- next;
- menu "Is it ok to take a rest?",L_temp1,"But how about my training?",L_temp2,"...Blah see ya.",L_temp3;
-L_temp1:
- mes "[Archer Wolt]";
- mes "Umm...it won't be ok if you don't practice and just goof around. Probably our chief will get mad at you...Well you could be the drunk in the pub in the future... Hahaha. Muhahaha.";
- next;
- menu "Chief?",L_sub_para1,"Drunk?",L_sub_para2,"I know you're already out of your mind!",L_sub_para3;
-L_sub_para1:
- mes "[Archer Wolt]";
- mes "Chief? Ah he is such a great guy. Well, he always scolds me because I talk too much talking.";
- mes "He always tries to keep us in safety. Lately it seems he doesn't come out of his palace.";
- mes "He is inside a room guarded by a warrior.";
- next;
- mes "[Archer Wolt]";
- mes "Heheheh~ I will be in trouble if he gets to know I tell you this to a stranger~ hehehe~";
- mes "Well somehow I already burst it out, no use to regret!";
- mes "Ummm however I think I'd better seal my lips by now. Ok bye, see you later dude!";
- close;
-L_sub_para2:
- mes "[Archer Wolt]";
- mes "Ah that guy in the pub. When I get spare money I buy him a drink sometimes, I am so worried about his drinking disorder.";
- mes "He is one of my villagers, I don't want to see him dead.";
- mes "Hmm...he reminds me of a jug full of beer...";
- mes "I got to go to the pub! Ok then, See you later!";
- close;
-L_sub_para3:
- mes "[Archer Wolt]";
- mes "Yeah dumbo.";
- close;
-L_temp2:
- mes "[Archer Wolt]";
- mes "Hmm...You don't? You are born to be an archer then.";
- mes "We, archers should not idle away without practice.";
- mes "So we hate people who are not diligent.";
- next;
- mes "[Archer Wolt]";
- mes "It is so amazing that lazy guy like me could be an archer.";
- mes "Life is worth to live.";
- mes "So live your life with passion!";
- close;
-L_End:
- mes "[Archer Wolt]";
- mes "...... (blah blah blah)......";
- close;
-L_temp3:
- close;
-}
-
-pay_arche.gat,77,131,2 script Archer Joe 88,{
- mes "[Archer Joe]";
- mes "Payon! What a wonderful place! Superb Bows! Excellent Archers!";
- emotion e_no1;
- next;
- mes "[Archer Joe]";
- mes "Hay you! Have you heard of our fame?";
- next;
- menu "Oh yeah!",L_Menu1,"Err Sorry?!",L_Menu2,"......",L_Menu3;
-L_Menu1:
- mes "[Archer Joe]";
- mes "Oh! You my man buddy! Archers of Payon! You know who we are!";
- emotion e_ok;
- next;
- mes "[Archer Joe]";
- mes "Arrows of Payon Archers never miss the targets! Even it can aim at the heart of the enemy from a long distance!";
- next;
- menu "You like this place, huh?",L_Msub1,"Haha...",L_Msub2;
-L_Msub1:
- mes "[Archer Joe]";
- mes "Yes! I love this place! So now I am researching Payon!";
- mes "If you have any questions, please ask me!";
- emotion e_ok;
- next;
- menu "People are wearing unique costumes in here.",L_Mpara1,"Can you tell me what the building is in the middle of town?",L_Mpara2,"Who is the guy drinking...Over there?",L_Mpara3,"Talk to you later.",L_Mpara4;
-L_Mpara1:
- mes "[Archer Joe]";
- mes "Yes, I agree.";
- mes "You must know this place has been isolated from the outside because of the thick forest, and people living here got to form a very unique culture, which is quite different from the one of this continent.";
- mes "This costume is the one of their traditional clothing! Why don't you try? It is very comfortable!";
- close;
-L_Mpara2:
- mes "[Archer Joe]";
- mes "Strangers are not allowed to enter the central palace. I've never been there.";
- mes "People say, royal families and their friends from outside are gathered in the place.";
- mes "In fact I would like to go in there. It attracts my attention.";
- close;
-L_Mpara3:
- mes "[Archer Joe]";
- mes "Oh! He is a notorious guy in this town! Don't treat him to drinks! You will regret that!";
- emotion e_gasp;
- close;
-L_Mpara4:
- mes "[Archer Joe]";
- mes "Ok! Catch you later! See ya!";
- close;
-L_Msub2:
- close;
-L_Menu2:
- mes "[Archer Joe]";
- mes "Oh boy, what a shame! How on earth can't you know there is something about archers of Payon!";
- emotion e_omg;
- next;
- mes "[Archer Joe]";
- mes "Please come back later when you become more skillful! Let's talk about what makes archers of Payon so attractive later!";
- close;
-L_Menu3:
- mes "[Archer Joe]";
- mes "What makes you zip your mouth? Are you shy?";
- mes "Ummm... you don't have to be shy before me..";
- emotion e_hmm;
- close;
-}
-
-payon.gat,132,235,2 script Monster Scholar 98,{
- mes "[Monster Scholar Vuicokk]";
- mes "Nice to meet you. I am Vuicokk the scholar in the monster research organization of Rune Midgard.";
- mes "Do you have any questions about monsters of Rune Midgard?";
- next;
- menu "Late News.",-,"Undead Monster.",L_Menu2,"Monster Research Organization.",L_Menu3,"Good day",L_End;
-
- mes "[Monster Scholar Vuicokk]";
- mes "Payon is located deep inside the forest, you can easily get attacked by monster troops.";
- mes "Besides a dangerous cave is near the town.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "Especially in the cave, monsters of undead attribute are spotted here and there, monster academic world is paying attention on the cave.";
- mes "My mission in here is analyzing their characters.";
- close;
-L_Menu2:
- mes "[Monster Scholar Vuicokk]";
- mes "The remarkable thing about the Undead monsters of Payon is that many of them used to be citizens of Payon.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "Now they are but lost, tortured, souls seeking release from their painful existence....";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "Undead monsters are of a totally different classification then the other monsters because of the fact that they used to be humans.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "It is for this reason that the King of Rune Midgard has a great deal of interest in our research on Undead monsters. ";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "To know that they used to be citizens of his kingdom is very troubling to him.....";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "His Majesty Tristram the 3rd has mandated that we do all we can to find a way to remove the undead from this world.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "In order to do that we must put an end to the source of the problem. I have tremendous faith that we can succeed in doing so.";
- close;
-L_Menu3:
- mes "[Monster Scholar Vuicokk]";
- mes "The Monster Research Organization was formed to find ways to counteract the sudden and rapid growth of monsters in Rune Midgard.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "Talented scientist from all over the land have been called forth to participate in this research.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "Of course this work is not as easy as one might expect. We are constantly risking our lives when we go out into the field.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "There have already been countless injuries and fatalities suffered by the research team.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "However NOTHING can stop us! We will continue to persevere for the benefit of the people of RUNE MIDGARD!!!";
- emotion e_gasp;
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "... Eh em... please excuse my emotional outburst... I am very passionate about this work.....";
- mes "Anyway if you happen to meet other scholars like myself, please treat them kindly.";
- close;
-L_End:
- mes "[Monster Scholar Vuicokk]";
- mes "Have a nice day.";
- close;
-}
-
-payon.gat,158,246,4 script Guardsman 708,{}
-payon.gat,158,245,4 script PayonGuard1TriggerArea 139,3,2,{
- mes "[Guardsman]";
- mes "This is the Central Palace of Payon. This place is open to the public, but in accordance with our laws, you must behave in an orderly fashion while inside.";
- next;
- mes "[Guardsman]";
- mes "In the interest of protecting the peace, we will disarm your equipment once you enter.";
- mes "Your cooperation is";
- mes "much appreciated.";
- close;
-}
-
-payon_in03.gat,96,116,4 script Chief Guardsman 708,{}
-payon_in03.gat,96,117,4 script PayonGuard2TriggerArea 139,3,2,{
- mes "[Chief Guardsman]";
- mes "What brings";
- mes "you here?";
- next;
- mes "[Chief Guardsman]";
- mes "I can see you are none of the Payon locals. I would just like to remind you to conduct yourself in an orderly manner. Remember, you are a guest here.";
- next;
- nude;
- mes "[Chief Guardsman]";
- mes "In the interest of protecting the public peace, I will disarm your equipment. Thank you for your cooperation.";
- close;
-}
-
-payon_in03.gat,102,185,4 script Guard#06 708,{
- mes "[Guard]";
- mes "Hey...!";
- mes "You're not";
- mes "allowed here!";
- mes "Go back outside!";
- close;
-}
-
-payon_in03.gat,99,190,4 script Chief 120,{}
-payon_in03.gat,99,189,4 script PayonChiefAreaTrigger 139,2,1,{
- if(BaseLevel < 30){
- mes "[Guard]";
- mes "Hey...";
- mes "Hey...!";
- mes "Show your respect";
- mes "to our chief!";
- close;
- }
- mes "[Chief]";
- next;
- menu "Please tell me about Payon.",L_Menu1,"Where the guards come from?",L_Menu2,"Please tell me about the cave.",L_Menu3,"I am wondering what archer does.",L_Menu4,"I am wondering what hunter does.",L_Menu5;
-L_Menu1:
- mes "[Chief]";
- mes "Payon is the city of highlanders, who'be been self-supporting and self-sufficient.";
- mes "Although our ancestors couldn't take civilized cultural benefits as much as farmers or citizens did, they knew how to make their living without help.";
- mes "Young acting power motivated them to survive from the elemental forces. We, payon people including females have learned how to go hunt and how to protect ourselves from danger.";
- next;
- mes "[Chief]";
- mes "I heard of weak young people who fear fields or dungeons filled with monsters. But to us, battle against monsters is a part of our lives.";
- mes "That's why his majesty Tristram 3rd expects us to teach young people how to efficiently fight against evil creatures.";
- close;
-L_Menu2:
- mes "[Chief]";
- mes "Prontera has sent civil servants to Payon as I was young.";
- mes "Royal troops, Kafra ladies, officers...at first we used to argue due to different customs.";
- mes "However I cannot deny they've helped to activate foreign trade with other countries briskly.";
- next;
- mes "[Chief]";
- mes "Now young people outside Payon constitute themselves Payon villagers...I could hardly imagine this scene when I was young. Hh huh...";
- mes "I am very pleased to see them. Even though they came from other places they love Payon.";
- close;
-L_Menu3:
- mes "[Chief]";
- mes "The cave up North is the place I used to go to sometimes.";
- mes "It was harder then now, evil creatures that I'd never seen kept respawning inside without limit.";
- mes "Present monsters are...different from the monsters we used to fight with.";
- next;
- mes "[Chief]";
- mes "Have you ever happened to see? A lasting grudge coming out of the cave...it was caused from the dead who never came back after going inside the cave to protect this village.";
- next;
- mes "[Chief]";
- mes "Those walking dead make another victim...ah...I am too old to endure such a severe pain...I am too old...";
- next;
- mes "[Chief]";
- mes "I can do anything to stop the dead.....I can do anything....";
- close;
-L_Menu4:
- mes "[Chief]";
- mes "We gather enough wood from the huge forest surrounding Payon.";
- mes "It is a natural benefit that we own excellent archers. You might think Forest welcomes archers to practice bowing, but it takes the side opposite yours.";
- next;
- mes "[Chief]";
- mes "The forest aids you in hiding yourself, blocking the way of enemies who must approach to attack.";
- mes "Archers are dexterous to attack dull enemies from a long distance.";
- next;
- mes "[Chief]";
- mes "Besides...there is an expected merit being inside the forest. When I was young I was out of arrows while fighting against monsters in the woods, but arrows dropped by monsters saved my life from them. Muhahahaha!";
- close;
-L_Menu5:
- mes "[Chief]";
- mes "As foreign cultures were introduced in Payon, the battle style of ours has been changed.";
- mes "Especially explosive compound and technology have remarkably affected on people's life style. It seems people were not satisfied only with bows and arrows to fight.";
- next;
- mes "[Chief]";
- mes "Trapping skills which enable to hunt monsters easier were invented, so the previous Chief granted them a name of hunter.";
- mes "Even though it was all the go on the first place, trapping is a really dangerous skill, we hardly approve the youth to be hunters.";
- next;
- mes "[Chief]";
- mes "People who have enough responsibility on themselves can challenge on the class.";
- close;
- next;
-}
-
-payon.gat,160,185,0 script Billboard 111,{
- mes "^993333- The Billboard Reads -^000000";
- mes "Welcome, and enjoy your stay in";
- mes "the beautiful town of Payon.";
- close;
-}
-
-payon.gat,173,238,5 script Jade#01 754,{
- mes "[Jade]";
- mes "Bring me two";
- mes "Gemstones of the";
- mes "same color, and I will";
- mes "change them to Gemstones";
- mes "of a different color.";
- next;
-
- menu "Blue Gemstones into Red ones!",L_BlueToRed,"Red Gemstones into Yellow ones!",L_RedToYellow,"Yellow Gemstones into Blue ones!",L_YellowToBlue,"Cancel",L_Cancel;
-
-L_BlueToRed:
- set @SourceGemstones$,"Blue";
- set @SourceGemstonesID,717;
- set @TargetGemstones$,"Red";
- set @TargetGemstonesID,716;
- goto L_BeginExchange;
-
-L_RedToYellow:
- set @SourceGemstones$,"Red";
- set @SourceGemstonesID,716;
- set @TargetGemstones$,"Yellow";
- set @TargetGemstonesID,715;
- goto L_BeginExchange;
-
-L_YellowToBlue:
- set @SourceGemstones$,"Yellow";
- set @SourceGemstonesID,715;
- set @TargetGemstones$,"Blue";
- set @TargetGemstonesID,717;
- goto L_BeginExchange;
-
-L_BeginExchange:
- if(countitem(@SourceGemstonesID) >= 2) goto L_ExchangeOK;
- mes "[Jade]";
- mes "Hah...!";
- mes "You're kidding me, right?";
- mes "I can't give you "+@TargetGemstones$+" Gemstones";
- mes "if you don't give me at least";
- mes "2 "+@SourceGemstones$+" Gemstones!";
- close;
-
-L_ExchangeOK:
- set @ExchangeCount,countitem(@SourceGemstonesID)/2;
- mes "[Jade]";
- mes "This may Exchange "+@ExchangeCount+" "+@TargetGemstones$+" Gemstones";
- mes "How many do you want?";
- next;
- menu "Exchange all",L_ExchangeAll,"I want to set a number",L_PointCount,"Cancel",L_Cancel;
-
-L_ExchangeAll:
- if(countitem(@SourceGemstonesID) < @ExchangeCount*2) goto L_ExchangeNo;
- delitem @SourceGemstonesID,@ExchangeCount*2;
- getitem @TargetGemstonesID,@ExchangeCount;
- goto L_ExchangeDone;
-
-L_PointCount:
- mes "[Jade]";
- mes "How many do you want?";
- mes "Limit is '100'";
- next;
-L_InputPointCount:
- input @number;
- if(@number <= 0) goto L_ExchangeNo;
- if(@number > 100) goto L_ExchangeAbove;
- if(@number > @ExchangeCount) goto L_ExchangeNotEnough;
- if(countitem(@SourceGemstonesID) < @number*2) goto L_ExchangeNo;
- delitem @SourceGemstonesID,@number*2;
- getitem @TargetGemstonesID,@number;
- goto L_ExchangeDone;
-
-L_ExchangeNo:
- mes "[Jade]";
- mes "Hmmm... Very funny...";
- close;
-
-L_ExchangeAbove:
- mes "[Jade]";
- mes "Hmmm... Please don't set a number above '100'";
- next;
- goto L_InputPointCount;
-
-L_ExchangeNotEnough:
- mes "[Jade]";
- mes "Hmmm... The "+@SourceGemstones$+" Gemstones you have";
- mes "is not enough for "+@number+" "+@TargetGemstones$+" Gemstones.";
- mes "Please set a new number";
- next;
- goto L_InputPointCount;
-
-L_ExchangeDone:
- mes "[Jade]";
- mes "Here, This is the "+@TargetGemstones$+" Gemstones you need...";
- mes "Come back to me when you need more";
- mes "...mmm? Is there something on my face?";
- close;
-
-L_Cancel:
- mes "[Jade]";
- mes "OK, Very well... Come back if you need anything.";
- mes "I'll Exchange it for you anytime.";
- close;
-}
-
-//Need to find out ALL fortunes he can tell for each answer...
-payon_in03.gat,117,128,4 script Fortune Teller 704,{
- mes "[Lhimetorra]";
- mes "You're an adventurer of this";
- mes "world... " + strcharinfo(0) + ", right? So, what can an old person like me do for you?";
- next;
- menu "I would like a tarot card reading.",-,"What's a tarot card reading?",L_Info;
- mes "[Lhimetorra]";
- mes "Is that so...?";
- mes "Well, if you want a monster card reading, you must first show me your faith. Otherwise, the spirits will grow angry and place a curse on you.";
- next;
- mes "[Lhimetorra]";
- mes "So, would you like a monster card reading?";
- next;
- menu "Yes.",-,"I would like to think over it once more.",L_No;
- mes "[Lhimetorra]";
- mes "Then...";
- mes "Please pay your fee with all of your sincerity.";
- next;
- input @fee;
- if(@fee < 0 || @fee > Zeny) goto L_FeeNotOK;
- if(@fee > 0) goto L_FeeOK;
- mes "[Lhimetorra]";
- mes "Ah...?!";
- mes "You have angered the monster spirits!";
- close;
-L_FeeNotOK:
- mes "[Lhimetorra]";
- mes "There's no need to overdo it! Just give with all your heart... *Tsk";
- mes "tsk*";
- close;
-L_FeeOK:
- set Zeny,Zeny-@fee;
- mes "[Lhimetorra]";
- mes "I accept your heart and your";
- mes "devotion with my gratitude.";
- mes "Thoughts are more important than the amount when paying a fortune teller.";
- next;
- mes "[Lhimetorra]";
- mes "Then, I will begin to tell the";
- mes "fortune of your wish. Concentrate";
- mes "on yourself...";
- next;
- mes "[Lhimetorra]";
- mes "...";
- mes "Clear your mind...";
- next;
- mes "[Lhimetorra]";
- mes "...";
- mes "Once you have emptied your mind, think of the thing you most wish to know.";
- next;
- mes "[Lhimetorra]";
- menu "(I would like to know my love fortune.)",L_AskLove,"(How rich will I be?)",L_AskMoney,"(I need advice about my future.)",L_AskFuture,"(Can I get a warning of any dangers awaiting?)",L_AskDangers;
-L_AskLove:
- mes "[Lhimetorra]";
- mes "I see it... I see a sign of";
- mes "love...";
- next;
- set @TEMP,rand(6);
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "Can't you hear the cry of the card? It is suffering. Love is like that.";
- if(@TEMP == 1) mes "His navel is very pretty. You have to meet someone with that type of navel to be happy.";
- if(@TEMP == 2) {
- mes "Hmm. How about giving a cute puppy as a gift? One with a round nose.";
- mes "Then they will surely be happy.";
- }
- if(@TEMP == 3) mes "No matter how fearful the bull may be, if it has a nose ring, it has already been tamed by humans. No matter how astonishing that person may be, taming is your responsibility.";
- if(@TEMP == 4) mes "Who is he so fiercely gazing at with those grand muscles? He is looking at someone else for sure.";
- if(@TEMP == 5){
- mes "They may seem dreary and ominous, but their attire is spotless. They show devotion to the other.";
- mes "Even though you are not satisfied with your love right now, take a look at they attire.";
- }
- next;
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "So don't be upset about it!";
- if(@TEMP == 1) mes "Ok? Keep that in mind~";
- if(@TEMP == 2){
- mes "But can't help if they don't";
- mes "like puppies.";
- }
- if(@TEMP == 3) mes "Approach them with more sincerity and consideration.";
- if(@TEMP == 4) mes "Don't get sidetracked and look elsewhere! You will be cursed!";
- if(@TEMP == 5){
- mes "If it is carefully worn, their";
- mes "heart for you can be seen in it as well..";
- }
- next;
- mes "[Lhimetorra]";
- mes "You seek advice about love.";
- mes "Even if you may not pleased with it, consider it calmly and make an effort to find true happiness.";
- next;
- mes "[Lhimetorra]";
- mes "Then...";
- close;
-L_AskMoney:
- mes "[Lhimetorra]";
- mes "Ooh... something about your future is starting to show...";
- next;
- set @TEMP,rand(3);
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "Do you know what a joker's specialty is? It is tricking others and making money. Be wary of the joker.";
- if(@TEMP == 1) mes "The Skeleton says that you can make money by going north. Go north.";
- if(@TEMP == 2) mes "A knight values honor more than fortune. They consider discussing wealth itself dirty not worthy. How would you be able to as such a knight a fortune about wealth?";
- next;
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "Jokers do not exist in one form. They will aim for your money in several different ways.";
- if(@TEMP == 1) mes "There must be great fortune in that direction.";
- if(@TEMP == 2) mes "The knight says that a new road of life will open once you look away from fortune.";
- next;
- mes "[Lhimetorra]";
- mes "Most people are curious about money.";
- mes "It is a very humanly and common curiosity. Cards are very stingy about fortunes regarding wealth.";
- next;
- mes "[Lhimetorra]";
- mes "Therefore, getting a fortune like this is considered being lucky. Use this fortune to prosper.";
- close;
-L_AskFuture:
- mes "[Lhimetorra]";
- mes "Future... the card that sees the future is beginning to speak...... Prepare yourself...";
- next;
- set @TEMP,rand(2);
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "Jack says you may be frustrated in the future.";
- if(@TEMP == 1) mes "He says to overcome the frustration, it is necessary to think of happy thoughts.";
- next;
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "Meaning your future will become a battle between happiness and frustration...";
- if(@TEMP == 1) mes "......"; //missing txt
- next;
- mes "[Lhimetorra]";
- mes "Speaking of the future is as dangerous act.";
- mes "Humans may face disaster if speaking of the future carelessly. That's why we ask cards about the future.";
- next;
- mes "[Lhimetorra]";
- mes "Your fortune is a rather good one. There are some in this world who get more horrible fortunes.";
- mes "Use this fortune as a support in your life. Ok?";
- close;
-L_AskDangers:
- mes "[Lhimetorra]";
- mes "Someone that knows of the dangers you do not, will warn you in the";
- mes "form of cards... so listen";
- mes "carefully-!";
- next;
- set @TEMP,rand(2);
- mes "[Lhimetorra]";
- if(@TEMP == 0) mes "The pirate is warning you of your beauty. Don't show off your beauty too much. Pirates are very jealous of appearance, as well.";
- if(@TEMP == 1) mes "A warning is always a useful fortune. You can never lose anything.";
- next;
- mes "[Lhimetorra]";
- mes "I hope you will able to avoid misfortune with this warning.";
- mes "Then...";
- close;
-L_No:
- mes "[Lhimetorra]";
- mes "Ok then. Young adventurer, may luck be with you.";
- close;
-L_Info:
- mes "[Lhimetorra]";
- mes "Monster card reading uses the cards of familiar monsters around us to get advice about our future, love and many other things.";
- mes "A fortuneteller like me takes a question from a person and asks the card. The card answers and I tell the person.";
- next;
- mes "[Lhimetorra]";
- mes "You should get no more than one card reading a day, and don't get one often since the cards can get angry or confused.";
- mes "Also, it can have a bad influence on your life, too!";
- next;
- mes "[Lhimetorra]";
- mes "And... one more thing.";
- mes "A card reading is only a";
- mes "reading... No matter how";
- mes "extraordinary the result may be,";
- mes "don't get too caught up with it.";
- mes "Bear that in mind.";
- close;
-}
-
-payon_in03.gat,131,7,4 script Hunter 59,{
- mes "[Hunter]";
- mes "...Can I help you?";
- mes "I'm here for official business and am busy at the moment. If you'll excuse me...";
- close;
+//===== eAthena Script =======================================
+//= Payon City
+//===== By: ==================================================
+//= Muad Dib (1.0) Darkchild (1.1) Muad Dib (1.2)
+//= Darkchild (1.3) DracoRPG (1.5)
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= (New) Payon City Npcs
+//===== Additional Comments: =================================
+//= Most Credits To Muad Dib, Some Stuff By Me
+//= 1.4 - Corrected a few typos
+//= 1.5 - Rescripted old NPCs + scripted new ones (from iRO Sak) [DracoRPG]
+//= 1.5b - Used Dino9021's script for the Gemstone exchanger [DracoRPG]
+//= 1.5b1 fixed Gemstone Exchanger NPC [Lupus]
+//= 1.5b2 added adv.classes/baby classes support [Lupus]
+//= 1.6 Fixed typo’s [Nexon]
+//= 1.7 Fixed bugs and exploits V__V [Lupus]
+//= 1.8 Removed Duplicates [Silent]
+//= 1.9 Fixed missing next;'s [Evera]
+//= 2.0 fixed some bugs, optimized script, added missing msg [Lupus]
+//============================================================
+
+payon.gat,190,115,0 script Lady#05 90,{
+ mes "[Lady]";
+ mes "Did you know that in the past Payon was not as prosperous as it is now? Back then we had difficulty making a living for ourselves.";
+ emotion e_gasp;
+ next;
+ mes "[Lady]";
+ mes "The towns people were so poor that they could not even afford to properly bury their deceased family members.";
+ mes "Because of this many people chose to simply place the dead corpses in the Cave near the village.";
+ next;
+ mes "[Lady]";
+ mes "Not only was this a terrible way to treat those that passed away but it would later prove to have grave consequences for this town.";
+ next;
+ mes "[Lady]";
+ mes "You see, because they were not given a proper burial, the dead were not able to leave this world and pass on to the other world.";
+ mes "Instead they became mindless zombies, wretched souls that were forced to walk the earth for all eternity.";
+ next;
+ mes "[Lady]";
+ mes "Their rotten bodies filled with pain and suffering, yearned for the taste of human flesh. Any living person who came near the cave would fall victim to these zombies.";
+ mes "In order to protect the village the Elder Chief founded the Archer Village to train young warriors who could fight the zombies.";
+ next;
+ mes "[Lady]";
+ mes "To this day the battle between the living and the undead still goes on.";
+ mes "It is a very tragic situation, for those zombies were at one time beloved members of the Payon community.";
+ close;
+}
+payon_in01.gat,177,91,5 script Young Man#06 88,{
+ mes "[Young Man]";
+ mes "I can see you are a stranger from the appearance of your traveling outfit. You must be a well-experienced fighter otherwise you couldn't successfully arrive at this steep place with all tough those creatures outside.";
+ mes "However you miss something important for fights. You can't defeat those monsters only with might.";
+ next;
+ mes "[Young Man]";
+ mes "Sometimes you will encounter some creatures with a hard-shell body which can't be damaged by physical attacks. Only psychic power like magic can defeat them at ease.";
+ mes "If you study magic’s, works will be easier... If you don't, you'd better accompany with somebody using magic.";
+ close;
+}
+
+payon.gat,104,62,5 script Young Man#07 88,{
+ mes "[Young Man]";
+ mes "I still remember the story my grandfather told me long ago about the Amulet that possessed an Evil Power within it.";
+ next;
+ mes "[Young Man]";
+ mes "According to the story the Amulet could raise the dead from their Graves!!";
+ mes "I am not sure if the story is true or not, but I wonder what would happen if I summoned my grandfather from his grave with it??...";
+ next;
+ mes "[Spooky Voice]";
+ mes "~~~~My child... do not even think of such a thing!!!~~~~~";
+ next;
+ mes "[Young Man]";
+ mes "Eeeeeeeeekkkkk?! Grampa? I-I-Is-Is t-t-th-that you?? ...";
+ emotion e_wah;
+ next;
+ mes "(you notice that his pants have become wet... eeeewwwwwwwwww!!!....)";
+ close;
+}
+
+payon_in01.gat,180,7,0 script Waitress 90,{
+ mes "[Waitress]";
+ mes "People in this place seem to be busy all the time, they come and go to be Archers or to buy arrows, I have to stick with this small shop.";
+ mes "I feel so melancholy and bored.";
+ emotion e_sob;
+ next;
+ mes "[Waitress]";
+ mes "I am sick and tired of noodle soup. I have to take too many showers to get rid of the smell.";
+ mes "But it isn't easy to deodorize. sigh...";
+ next;
+ mes "[Waitress]";
+ mes "Where can I find the right person who is a really hot, sexy hunk, and who can take me out of this small place?";
+ next;
+ mes "[Waitress]";
+ if(Sex)
+ mes "Hello, mister?";
+ else
+ mes "Hello, lady?";
+ next;
+ mes "[Waitress]";
+ mes "Grandma the fortuneteller told me that I would meet great luck in the near future!";
+ mes "But look at me, what's wrong with me!! I am leaving a manageable life everyday!!";
+ mes "Oh.. boy. What a dumb wishy-washy person I am.";
+ emotion e_an;
+ next;
+ mes "[Waitress]";
+ mes "I am so sorry, I should haven't said this to you. Now I am acting like i'm stupid.";
+ mes "I am sorry dear, please forgive my misbehavior.";
+ emotion e_swt;
+ next;
+ mes "[Waitress]";
+ mes "So, how may I help you? ";
+ next;
+ menu "Have you ever heard of Zombies?",L_Menu1,"I want to have my fortune told.",L_Menu2,"I need some booze.",L_Menu3,"I'm good",L_Menu4;
+L_Menu1:
+ mes "[Waitress]";
+ mes "Zombies are the walking dead. You can easily spot them in this village, Payon.";
+ mes "It's rumored that they fear holiness. That's why Archers prefer to use arrows made out of holy metal, silver against Zombies.";
+ next;
+ mes "[Waitress]";
+ mes "Legend says the chief of this town used silver arrows against walking zombies that used to be his brethren, to enlighten their souls to rest in peace.";
+ mes "We believe only this way, zombies can be leaded to the peaceful world beyond the realm.";
+ next;
+ mes "[Waitress]";
+ mes "You might not agree on our tradition which respects the diseased.";
+ next;
+ mes "[Waitress]";
+ mes "Somehow I would like to appreciate the chief to enlighten my grandfather's poor soul.";
+ close;
+L_Menu2:
+ mes "[Waitress]";
+ mes "Oh! I must say she is really an extraordinary person. Well, it could be your luck, she doesn't hang around here much as she used to do.";
+ emotion e_ic;
+ next;
+ mes "[Waitress]";
+ mes "On the first place, she stayed here to mind her business, but ever since the chief recognized her talent, she's stayed in the central palace.";
+ mes "You'd better go to there if you want to see her.";
+ close;
+L_Menu3:
+ mes "[Waitress]";
+ mes "I am so sorry they're all sold out and we can't afford to prepare alcohol anymore due to hostile creatures out there.";
+ mes "My master built a very strict rule of his own, that is we only provide the best drinks to customers.";
+ next;
+ mes "[Waitress]";
+ mes "So please come later again.";
+ next;
+ mes "[Waitress]";
+ mes "Sorry for your inconvenience.";
+ emotion e_sry;
+ close;
+L_Menu4:
+ mes "[Waitress]";
+ mes "Have a nice day, dear.";
+ mes "Sob...I wish I could be in bed of roses.";
+ emotion e_sob;
+ close;
+}
+
+payon.gat,193,116,1 script Woman#05 66,{
+ mes "[Woman]";
+ mes "Welcome to Payon. You must have had a hard time getting through the thick forest? I hope you didn't run into too much trouble?";
+ next;
+ mes "[Woman]";
+ mes "I'm glad to see a new face around here. You see the number of tourists has decreased drastically due to the enormous amount of monsters outside.";
+ next;
+ mes "[Woman]";
+ mes "Payon has become a very quite town because of this. There's isn't much for the towns people to do nowadays. As for myself I'm just chit-chatting with my friends.";
+ next;
+ mes "[Woman]";
+ mes "To be honest, things are getting tough because of those creatures... (sighs)...";
+ next;
+ mes "[Woman]";
+ if(Sex){
+ mes "Hmm... you look as strong as a Rocker! How many monsters have you killed?";
+ mes "Let me tell you about a place where you can go train and become even stronger.";
+ emotion e_hmm;
+ }else{
+ mes "Miss, how many monsters have you killed?";
+ mes "I know a very good place for you to go train and get good monster drops.";
+ emotion e_hmm;
+ }
+ next;
+ mes "[Woman]";
+ mes "I know of a cave near Archer Village. Just take the exit north of town and follow the path to your left.";
+ mes "The cave is full of monsters and their spawn rate is very high. Does it sound interesting to you?";
+ next;
+ menu "It sounds dangerous.",L_Menu1,"I think I need to fully prepare for that place.",L_Menu2,"Lady, you wear nice clothing~",L_Menu3;
+L_Menu1:
+ mes "[Woman]";
+ mes "Oh don't be such a coward! It's just a simple cave filled with normal monsters. Archer Village is near by so you shouldn't be worried~ hohoho~";
+ next;
+ mes "[Woman]";
+ mes "Of course... there are the zombies... and Munaks... and Bonguns... which can be VERY DEADLY.....";
+ emotion e_hmm;
+ close;
+L_Menu2:
+ mes "[Woman]";
+ mes "No need to worry about preparing yourself. There is an excellent tool dealer in front of town where you can purchase the items you need.";
+ next;
+ mes "[Woman]";
+ mes "I know because he's my husband... oops... I mean an acquaintance of mine... heh heh..";
+ emotion e_swt;
+ close;
+L_Menu3:
+ mes "[Woman]";
+ mes "Oh hohohoho! SO you noticed! This is what's in-style in Prontera these days! The women in this town don't know anything about fashion!";
+ emotion e_ic;
+ next;
+ mes "[Woman]";
+ mes "My husband buys me these clothes with the money he makes selling overpriced items to foolish young people... oh ho oh hoho...";
+ emotion e_heh;
+ close;
+}
+
+payon.gat,190,119,5 script Woman#06 66,{
+ mes "[Jim's Mother]";
+ mes "Oh boy there she goes again. She is a confirmed gossip. Please don't mistake her for being a typical Payon citizen.";
+ emotion e_dots;
+ next;
+ mes "[Jim's Mother]";
+ mes "Believe me, she's an exception. Not all of us here in Payon have big mouths. She gets too exited with fortune telling.";
+ next;
+ mes "[Jim's Mother]";
+ mes "Anyway, you look like a new face. Are you new in town?";
+ next;
+ mes "[Jim's Mother]";
+ if(Sex){
+ mes "... Oh, you have broad shoulders ... tehehe! Will you go out with me? I'd like to make you a nice dinner...(bats eyelashes)";
+ emotion e_kis;
+ }else{
+ mes "Don't you think your dress is too lousy?";
+ mes "I don't like young ladies pounce up.";
+ }
+ next;
+ menu "Fortune Telling?",-,"...Good Bye.",L_Bye;
+
+ mes "[Jim's Mother]";
+ mes "Oh yes, there is an extraordinary fortune teller here in town. You can find her in the central palace.";
+ mes "The more money you pay her the more accurate your fortune will be told.";
+ next;
+ mes "[Jim's Mother]";
+ mes "I saw her recently and she told me that I would meet a handsome young man this month............";
+ if(Sex)
+ mes ".......... tehehe. (winks at you)";
+ else
+ emotion e_lv;
+ close;
+L_Bye:
+ mes "[Jim's Mother]";
+ mes "What? You have to go? Awwww...Why don't you stay and chit chat with me for a while...hmm? ...";
+ close;
+}
+
+payon.gat,210,110,4 script Drunk 120,{
+ mes "[Drunk]";
+ if(BaseJob == Job_Archer){
+ mes "Yoyo! Archer brother! Salute to your fingers stretching bowstring!";
+ emotion e_ho;
+ }else{
+ mes "Hey hey! I am wondering how stupid archers who don't know how to aim targets could drink alcohol. Hahaha~!";
+ mes "Do you want to buy me a drink?";
+ emotion e_heh;
+ }
+ next;
+ mes "[Drunk]";
+ mes "Do you want to buy me a drink?";
+ next;
+ menu "Promise me you won't drink more than one jug.",L_Menu1,"No thanks,buddy.",L_Menu2,"Oh my god~ hell no~!",L_Menu3;
+L_Menu1:
+ mes "[Drunk]";
+ if(BaseJob == Job_Archer)
+ mes "Thanksh brothaaa!... archerrrzzz are alwayssszz a generoushhh bunch!...(hicup!)";
+ else
+ mes "Thanksh!... shhtrangersszz are alwayssszz a generoushhh bunch!... archer guysh are penny pinchershh nowadayssszz!..(hicup!)";
+ next;
+ emotion e_thx;
+ if(Zeny < 200) goto L_SUB_1;
+ set Zeny,Zeny-200;
+ mes "[Drunk]";
+ mes "Thanks brother! Strangers are always generous without exception! Archer guys are pinch-pennies nowadays!";
+ mes "Muhahahaha! I wasn't like that when I was young.";
+ mes "Back then I was young, I used to fool around with girls! One of the grannies in this village and I was really hot back then!";
+ mes "She still acts like a young lady in taste for cosmetics and stuff!";
+ next;
+ mes "[Drunk]";
+ mes "Gulp~Gulp~Man! This is great! Thank you may man! Thank you! Muhahahahaha!";
+ emotion e_no1;
+ close;
+L_SUB_1:
+ mes "[Drunk]";
+ mes "Cheapass, don't even have enough money. Move on young one, your waisting my time!";
+ close;
+L_Menu2:
+ mes "[Drunk]";
+ mes "Blah. Young people don't know how to respect elderly people!";
+ mes "Fine! I won't beg you anymore! I won't...";
+ emotion e_pif;
+ close;
+L_Menu3:
+ mes "[Drunk]";
+ mes "Umm, oookay. Fine by me...";
+ emotion e_no1;
+ close;
+}
+
+payon_in01.gat,47,59,5 script Archer Zakk 88,{
+ mes "[Archer Zakk]";
+ mes "I am so worried about one of my pals. He speaks about much crap.";
+ mes "Well he is an expert of archery, but I hate his big mouth...";
+ mes "Our chief is also fed up with him.";
+ emotion e_ag;
+ next;
+ menu "Archer?",-,"Chief?",L_Menu2,"Big Mouth?",L_Menu3;
+
+ mes "[Archer Zakk]";
+ mes "Ah yeah yeah. My friend is the number one archer in Payon, in the same costume as me too.";
+ mes "He teaches newbie archers around the archer village.";
+ mes "Well...you'd better talk to him at lease once.";
+ close;
+L_Menu2:
+ mes "[Archer Zakk]";
+ mes "Chief lives in the central palace. He is the spiritual guide of Payon.";
+ mes "He used to dictate to the whole Payon forest carrying Gakkung. I remember the battle scene he showed when I was a little kid. Hmm~";
+ mes "Even though he is old and weak now...his eyes...he still has keen-sighted eyes of his young days, he can hit targets without missing.";
+ next;
+ mes "[Archer Zakk]";
+ mes "I admire him from the bottom of my heart.";
+ close;
+L_Menu3:
+ mes "[Archer Zakk]";
+ mes "You know a big mouth is the person who is much talkative and who doesn't stop talking.";
+ mes "He never stops talking as I said, one day he started to talk while we did laundry at the riverbank, he stopped talking when we realized our shirts tunrned out to get tattered.";
+ mes "He became a kind of legend, people used to call him as Bowing Mouth or Chatterbox instead of his real name.";
+ mes "I've never seen a person talk as much as him.";
+ next;
+ mes "[Archer Zakk]";
+ mes "I've been many places, but I didn't see any guy who likes talking or being talkative.";
+ mes "Maybe other people agree on my opinion. Oh yes, I think you are with me.";
+ mes "As I see your face, you've got friends of few words so far! Hmm Hmm!!";
+ mes "Taciturnity is bliss, you know.";
+ next;
+ mes "[Archer Zakk]";
+ mes "Ah, My friend Wolt? He doesn't have his place so he always stay at inn.";
+ mes "I guess you can meet him by now. Why don't you go see him?";
+ close;
+}
+
+payon_in01.gat,66,64,5 script Archer Wolt 88,{
+ mes "[Archer Wolt]";
+ mes "Archers should practice as much as they can. Otherwise they won't be an expert.";
+ mes "Are you new here? Howdy!";
+ next;
+ mes "[Archer Wolt]";
+ mes "I am Wolt the Archer. Just call me Wolt.";
+ mes "I know this is an expected question, do you tend to idle away your time?";
+ next;
+ menu "Hell no.",L_Menu1,"Yeah I guess.",L_Menu2;
+L_Menu1:
+ mes "[Archer Wolt]";
+ mes "Hmm... You don't? You are born to be an archer then.";
+ next;
+ mes "[Archer Wolt]";
+ mes "We Archers are constantly practicing and rarely have time to just sit around. So we hate people who are not diligent.";
+ next;
+ mes "[Archer Wolt]";
+ mes "Are you curious about HOW we practice?";
+ emotion e_what;
+ next;
+ mes "[Archer Wolt]";
+ mes "From sunrise to sunset the Archers of Payon search the surrounding forest for monsters.";
+ next;
+ mes "[Archer Wolt]";
+ mes "With a bow in our hands and arrows on our back we fight dangerous monsters in order to train ourselves as well as to help keep Payon safe";
+ next;
+ mes "[Archer Wolt]";
+ mes "For us fighting monsters is a way of life...(blah blah blah)...I once saw the sun set on a river...(blah blah blah blah)...sometimes I feel pretty...(blah blah)...";
+ next;
+ menu "You must need a good bow.",L_sub1,"Oh well, isn't it a practice?",-;
+ close;
+L_sub1:
+ mes "[Archer Wolt]";
+ mes "....Well YES!! A well crafted Bow is essential to the success of an archer!";
+ emotion e_ic;
+ next;
+ mes "[Archer Wolt]";
+ mes "Bows constructed in Payon are the greatest bows you can find in Rune-Midgard! They are light yet, strong and very durable.";
+ emotion e_no1;
+ next;
+ mes "[Archer Wolt]";
+ mes "This is because they are made out of high quality wood found only in the Payon Forest!";
+ mes "My bow was made from a Walnut tree and will last for generations to come.";
+ next;
+ mes "[Archer Wolt]";
+ mes "Unfortunately many of the wonderful trees in Payon forest have been affected by the evil force that has spread throughout Rune-Midgard and have turned into horrible creatures.";
+ next;
+ mes "[Archer Wolt]";
+ mes "It's a pitty to see such beautiful trees become tools of evil...";
+ next;
+ mes "[Archer Wolt]";
+ mes "Strange as it may sound, even as monsters the trees still provide high quality wood that can be used for bows.";
+ mes "Maybe the trees seek to help us fight the evils in the land?...";
+ next;
+ menu "I didn't realize the forest was so dangerous",L_case,"(This guy talks way to much)",L_End;
+L_case:
+ mes "[Archer Wolt]";
+ mes "But you know monsters don't appear only in the forest. Don't you realize why the archer village was established in this place?";
+ mes "Heading west, you can see a cave. Inside the cave, enormous monsters keep spawning without limit.";
+ mes "We are here, to protect our territory against them in obedience to our chief's order.";
+ next;
+ menu "Cave?!",L_para1,"Chief?",L_para2,"Oh man I hate this stupid town~",L_para3;
+L_para1:
+ mes "[Archer Wolt]";
+ mes "Head north of town, you can see the cave I told you about.";
+ mes "Inside there, you will encounter lots of ugly monsters such as bastard looking like a bat or the walking dead.";
+ mes "If we let them out of the place, they would invade our town. We frequently clean up the cave.";
+ next;
+ mes "[Archer Wolt]";
+ mes "However they are endlessly respawned. It seems we're wasting our time and labor without nothing...";
+ mes "Enough already, let's cut off this crap. Even I can't talk more than this.";
+ mes "I have lots of things to do!";
+ close;
+L_para2:
+ mes "[Archer Wolt]";
+ mes "The Elder Chief is such a great person... although he always scolds me because he says I talk too much.";
+ next;
+ mes "[Archer Wolt]";
+ mes "I don't think I talk all that much...I mean..(blah blah blah)...so I said to the guy...(blah blah blah blah blah).....";
+ next;
+ mes "[Archer Wolt]";
+ mes "... uh... anyways... back to the Chief...";
+ emotion e_swt;
+ next;
+ mes "[Archer Wolt]";
+ mes "In the past he bravely protected Payon with his Gakung Bow. Now he is elderly, though he still worries about the safety of the town.";
+ mes "He resides in the Palace and has his own personal gaurd. Only high level warriors are allowed to speak with him.";
+ close;
+L_para3:
+ mes "[Archer Wolt]";
+ mes "Well that’s not very nice!";
+ mes "If you don't like our humble town then you should leave, bastard!";
+ close;
+L_Menu2:
+ mes "[Archer Wolt]";
+ mes "Hmm...sometimes you need rest.";
+ mes "Do you want to listen to my story? I set fire on my house during my last holiday~ hahaha~ I fell a sleep while I heated the bath. Hahaha!";
+ next;
+ menu "Is it ok to take a rest?",L_temp1,"But how about my training?",L_temp2,"...Blah see ya.",L_temp3;
+L_temp1:
+ mes "[Archer Wolt]";
+ mes "Umm...it won't be ok if you don't practice and just goof around. Probably our chief will get mad at you...Well you could be the drunk in the pub in the future... Hahaha. Muhahaha.";
+ next;
+ menu "Chief?",L_sub_para1,"Drunk?",L_sub_para2,"I know you're already out of your mind!",L_sub_para3;
+L_sub_para1:
+ mes "[Archer Wolt]";
+ mes "Chief? Ah he is such a great guy. Well, he always scolds me because I talk too much talking.";
+ mes "He always tries to keep us in safety. Lately it seems he doesn't come out of his palace.";
+ mes "He is inside a room guarded by a warrior.";
+ next;
+ mes "[Archer Wolt]";
+ mes "Heheheh~ I will be in trouble if he gets to know I tell you this to a stranger~ hehehe~";
+ mes "Well somehow I already burst it out, no use to regret!";
+ mes "Ummm however I think I'd better seal my lips by now. Ok bye, see you later dude!";
+ close;
+L_sub_para2:
+ mes "[Archer Wolt]";
+ mes "Ah that guy in the pub. When I get spare money I buy him a drink sometimes, I am so worried about his drinking disorder.";
+ mes "He is one of my villagers, I don't want to see him dead.";
+ mes "Hmm...he reminds me of a jug full of beer...";
+ mes "I got to go to the pub! Ok then, See you later!";
+ close;
+L_sub_para3:
+ mes "[Archer Wolt]";
+ mes "Yeah dumbo.";
+ close;
+L_temp2:
+ mes "[Archer Wolt]";
+ mes "Hmm...You don't? You are born to be an archer then.";
+ mes "We, archers should not idle away without practice.";
+ mes "So we hate people who are not diligent.";
+ next;
+ mes "[Archer Wolt]";
+ mes "It is so amazing that lazy guy like me could be an archer.";
+ mes "Life is worth to live.";
+ mes "So live your life with passion!";
+ close;
+L_End:
+ mes "[Archer Wolt]";
+ mes "...... (blah blah blah)......";
+ close;
+L_temp3:
+ close;
+}
+
+pay_arche.gat,77,131,2 script Archer Joe 88,{
+ mes "[Archer Joe]";
+ mes "Payon! What a wonderful place! Superb Bows! Excellent Archers!";
+ emotion e_no1;
+ next;
+ mes "[Archer Joe]";
+ mes "Hay you! Have you heard of our fame?";
+ next;
+ menu "Oh yeah!",L_Menu1,"Err Sorry?!",L_Menu2,"......",L_Menu3;
+L_Menu1:
+ mes "[Archer Joe]";
+ mes "Oh! You my man buddy! Archers of Payon! You know who we are!";
+ emotion e_ok;
+ next;
+ mes "[Archer Joe]";
+ mes "Arrows of Payon Archers never miss the targets! Even it can aim at the heart of the enemy from a long distance!";
+ next;
+ menu "You like this place, huh?",L_Msub1,"Haha...",L_Msub2;
+L_Msub1:
+ mes "[Archer Joe]";
+ mes "Yes! I love this place! So now I am researching Payon!";
+ mes "If you have any questions, please ask me!";
+ emotion e_ok;
+ next;
+ menu "People are wearing unique costumes in here.",L_Mpara1,"Can you tell me what the building is in the middle of town?",L_Mpara2,"Who is the guy drinking...Over there?",L_Mpara3,"Talk to you later.",L_Mpara4;
+L_Mpara1:
+ mes "[Archer Joe]";
+ mes "Yes, I agree.";
+ mes "You must know this place has been isolated from the outside because of the thick forest, and people living here got to form a very unique culture, which is quite different from the one of this continent.";
+ mes "This costume is the one of their traditional clothing! Why don't you try? It is very comfortable!";
+ close;
+L_Mpara2:
+ mes "[Archer Joe]";
+ mes "Strangers are not allowed to enter the central palace. I've never been there.";
+ mes "People say, royal families and their friends from outside are gathered in the place.";
+ mes "In fact I would like to go in there. It attracts my attention.";
+ close;
+L_Mpara3:
+ mes "[Archer Joe]";
+ mes "Oh! He is a notorious guy in this town! Don't treat him to drinks! You will regret that!";
+ emotion e_gasp;
+ close;
+L_Mpara4:
+ mes "[Archer Joe]";
+ mes "Ok! Catch you later! See ya!";
+ close;
+L_Msub2:
+ close;
+L_Menu2:
+ mes "[Archer Joe]";
+ mes "Oh boy, what a shame! How on earth can't you know there is something about archers of Payon!";
+ emotion e_omg;
+ next;
+ mes "[Archer Joe]";
+ mes "Please come back later when you become more skillful! Let's talk about what makes archers of Payon so attractive later!";
+ close;
+L_Menu3:
+ mes "[Archer Joe]";
+ mes "What makes you zip your mouth? Are you shy?";
+ mes "Ummm... you don't have to be shy before me..";
+ emotion e_hmm;
+ close;
+}
+
+payon.gat,132,235,2 script Monster Scholar 98,{
+ mes "[Monster Scholar Vuicokk]";
+ mes "Nice to meet you. I am Vuicokk the scholar in the monster research organization of Rune Midgard.";
+ mes "Do you have any questions about monsters of Rune Midgard?";
+ next;
+ menu "Late News.",-,"Undead Monster.",L_Menu2,"Monster Research Organization.",L_Menu3,"Good day",L_End;
+
+ mes "[Monster Scholar Vuicokk]";
+ mes "Payon is located deep inside the forest, you can easily get attacked by monster troops.";
+ mes "Besides a dangerous cave is near the town.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "Especially in the cave, monsters of undead attribute are spotted here and there, monster academic world is paying attention on the cave.";
+ mes "My mission in here is analyzing their characters.";
+ close;
+L_Menu2:
+ mes "[Monster Scholar Vuicokk]";
+ mes "The remarkable thing about the Undead monsters of Payon is that many of them used to be citizens of Payon.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "Now they are but lost, tortured, souls seeking release from their painful existence....";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "Undead monsters are of a totally different classification then the other monsters because of the fact that they used to be humans.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "It is for this reason that the King of Rune Midgard has a great deal of interest in our research on Undead monsters. ";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "To know that they used to be citizens of his kingdom is very troubling to him.....";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "His Majesty Tristram the 3rd has mandated that we do all we can to find a way to remove the undead from this world.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "In order to do that we must put an end to the source of the problem. I have tremendous faith that we can succeed in doing so.";
+ close;
+L_Menu3:
+ mes "[Monster Scholar Vuicokk]";
+ mes "The Monster Research Organization was formed to find ways to counteract the sudden and rapid growth of monsters in Rune Midgard.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "Talented scientist from all over the land have been called forth to participate in this research.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "Of course this work is not as easy as one might expect. We are constantly risking our lives when we go out into the field.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "There have already been countless injuries and fatalities suffered by the research team.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "However NOTHING can stop us! We will continue to persevere for the benefit of the people of RUNE MIDGARD!!!";
+ emotion e_gasp;
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "... Eh em... please excuse my emotional outburst... I am very passionate about this work.....";
+ mes "Anyway if you happen to meet other scholars like myself, please treat them kindly.";
+ close;
+L_End:
+ mes "[Monster Scholar Vuicokk]";
+ mes "Have a nice day.";
+ close;
+}
+
+payon.gat,158,246,4 script Guardsman 708,{}
+payon.gat,158,245,4 script PayonGuard1TriggerArea 139,3,2,{
+ mes "[Guardsman]";
+ mes "This is the Central Palace of Payon. This place is open to the public, but in accordance with our laws, you must behave in an orderly fashion while inside.";
+ next;
+ mes "[Guardsman]";
+ mes "In the interest of protecting the peace, we will disarm your equipment once you enter.";
+ mes "Your cooperation is";
+ mes "much appreciated.";
+ close;
+}
+
+payon_in03.gat,96,116,4 script Chief Guardsman 708,{}
+payon_in03.gat,96,117,4 script PayonGuard2TriggerArea 139,3,2,{
+ mes "[Chief Guardsman]";
+ mes "What brings";
+ mes "you here?";
+ next;
+ mes "[Chief Guardsman]";
+ mes "I can see you are none of the Payon locals. I would just like to remind you to conduct yourself in an orderly manner. Remember, you are a guest here.";
+ next;
+ nude;
+ mes "[Chief Guardsman]";
+ mes "In the interest of protecting the public peace, I will disarm your equipment. Thank you for your cooperation.";
+ close;
+}
+
+payon_in03.gat,102,185,4 script Guard#06 708,{
+ mes "[Guard]";
+ mes "Hey...!";
+ mes "You're not";
+ mes "allowed here!";
+ mes "Go back outside!";
+ close;
+}
+
+payon_in03.gat,99,190,4 script Chief 120,{}
+payon_in03.gat,99,189,4 script PayonChiefAreaTrigger 139,2,1,{
+ if(BaseLevel < 30){
+ mes "[Guard]";
+ mes "Hey...";
+ mes "Hey...!";
+ mes "Show your respect";
+ mes "to our chief!";
+ close;
+ }
+ mes "[Chief]";
+ next;
+ menu "Please tell me about Payon.",L_Menu1,"Where the guards come from?",L_Menu2,"Please tell me about the cave.",L_Menu3,"I am wondering what archer does.",L_Menu4,"I am wondering what hunter does.",L_Menu5;
+L_Menu1:
+ mes "[Chief]";
+ mes "Payon is the city of highlanders, who'be been self-supporting and self-sufficient.";
+ mes "Although our ancestors couldn't take civilized cultural benefits as much as farmers or citizens did, they knew how to make their living without help.";
+ mes "Young acting power motivated them to survive from the elemental forces. We, payon people including females have learned how to go hunt and how to protect ourselves from danger.";
+ next;
+ mes "[Chief]";
+ mes "I heard of weak young people who fear fields or dungeons filled with monsters. But to us, battle against monsters is a part of our lives.";
+ mes "That's why his majesty Tristram 3rd expects us to teach young people how to efficiently fight against evil creatures.";
+ close;
+L_Menu2:
+ mes "[Chief]";
+ mes "Prontera has sent civil servants to Payon as I was young.";
+ mes "Royal troops, Kafra ladies, officers...at first we used to argue due to different customs.";
+ mes "However I cannot deny they've helped to activate foreign trade with other countries briskly.";
+ next;
+ mes "[Chief]";
+ mes "Now young people outside Payon constitute themselves Payon villagers...I could hardly imagine this scene when I was young. Hh huh...";
+ mes "I am very pleased to see them. Even though they came from other places they love Payon.";
+ close;
+L_Menu3:
+ mes "[Chief]";
+ mes "The cave up North is the place I used to go to sometimes.";
+ mes "It was harder then now, evil creatures that I'd never seen kept respawning inside without limit.";
+ mes "Present monsters are...different from the monsters we used to fight with.";
+ next;
+ mes "[Chief]";
+ mes "Have you ever happened to see? A lasting grudge coming out of the cave...it was caused from the dead who never came back after going inside the cave to protect this village.";
+ next;
+ mes "[Chief]";
+ mes "Those walking dead make another victim...ah...I am too old to endure such a severe pain...I am too old...";
+ next;
+ mes "[Chief]";
+ mes "I can do anything to stop the dead.....I can do anything....";
+ close;
+L_Menu4:
+ mes "[Chief]";
+ mes "We gather enough wood from the huge forest surrounding Payon.";
+ mes "It is a natural benefit that we own excellent archers. You might think Forest welcomes archers to practice bowing, but it takes the side opposite yours.";
+ next;
+ mes "[Chief]";
+ mes "The forest aids you in hiding yourself, blocking the way of enemies who must approach to attack.";
+ mes "Archers are dexterous to attack dull enemies from a long distance.";
+ next;
+ mes "[Chief]";
+ mes "Besides...there is an expected merit being inside the forest. When I was young I was out of arrows while fighting against monsters in the woods, but arrows dropped by monsters saved my life from them. Muhahahaha!";
+ close;
+L_Menu5:
+ mes "[Chief]";
+ mes "As foreign cultures were introduced in Payon, the battle style of ours has been changed.";
+ mes "Especially explosive compound and technology have remarkably affected on people's life style. It seems people were not satisfied only with bows and arrows to fight.";
+ next;
+ mes "[Chief]";
+ mes "Trapping skills which enable to hunt monsters easier were invented, so the previous Chief granted them a name of hunter.";
+ mes "Even though it was all the go on the first place, trapping is a really dangerous skill, we hardly approve the youth to be hunters.";
+ next;
+ mes "[Chief]";
+ mes "People who have enough responsibility on themselves can challenge on the class.";
+ close;
+ next;
+}
+
+payon.gat,160,185,0 script Billboard 111,{
+ mes "^993333- The Billboard Reads -^000000";
+ mes "Welcome, and enjoy your stay in";
+ mes "the beautiful town of Payon.";
+ close;
+}
+
+payon.gat,173,238,5 script Jade#01 754,{
+ mes "[Jade]";
+ mes "Bring me two";
+ mes "Gemstones of the";
+ mes "same color, and I will";
+ mes "change them to Gemstones";
+ mes "of a different color.";
+ next;
+
+ menu "Blue Gemstones into Red ones!",L_BlueToRed,"Red Gemstones into Yellow ones!",L_RedToYellow,"Yellow Gemstones into Blue ones!",L_YellowToBlue,"Cancel",L_Cancel;
+
+L_BlueToRed:
+ set @SourceGemstones$,"Blue";
+ set @SourceGemstonesID,717;
+ set @TargetGemstones$,"Red";
+ set @TargetGemstonesID,716;
+ goto L_BeginExchange;
+
+L_RedToYellow:
+ set @SourceGemstones$,"Red";
+ set @SourceGemstonesID,716;
+ set @TargetGemstones$,"Yellow";
+ set @TargetGemstonesID,715;
+ goto L_BeginExchange;
+
+L_YellowToBlue:
+ set @SourceGemstones$,"Yellow";
+ set @SourceGemstonesID,715;
+ set @TargetGemstones$,"Blue";
+ set @TargetGemstonesID,717;
+ goto L_BeginExchange;
+
+L_BeginExchange:
+ if(countitem(@SourceGemstonesID) >= 2) goto L_ExchangeOK;
+ mes "[Jade]";
+ mes "Hah...!";
+ mes "You're kidding me, right?";
+ mes "I can't give you "+@TargetGemstones$+" Gemstones";
+ mes "if you don't give me at least";
+ mes "2 "+@SourceGemstones$+" Gemstones!";
+ close;
+
+L_ExchangeOK:
+ set @ExchangeCount,countitem(@SourceGemstonesID)/2;
+ mes "[Jade]";
+ mes "This may Exchange "+@ExchangeCount+" "+@TargetGemstones$+" Gemstones";
+ mes "How many do you want?";
+ next;
+ menu "Exchange all",L_ExchangeAll,"I want to set a number",L_PointCount,"Cancel",L_Cancel;
+
+L_ExchangeAll:
+ if(countitem(@SourceGemstonesID) < @ExchangeCount*2) goto L_ExchangeNo;
+ delitem @SourceGemstonesID,@ExchangeCount*2;
+ getitem @TargetGemstonesID,@ExchangeCount;
+ goto L_ExchangeDone;
+
+L_PointCount:
+ mes "[Jade]";
+ mes "How many do you want?";
+ mes "Limit is '100'";
+ next;
+L_InputPointCount:
+ input @number;
+ if(@number <= 0) goto L_ExchangeNo;
+ if(@number > 100) goto L_ExchangeAbove;
+ if(@number > @ExchangeCount) goto L_ExchangeNotEnough;
+ if(countitem(@SourceGemstonesID) < @number*2) goto L_ExchangeNo;
+ delitem @SourceGemstonesID,@number*2;
+ getitem @TargetGemstonesID,@number;
+ goto L_ExchangeDone;
+
+L_ExchangeNo:
+ mes "[Jade]";
+ mes "Hmmm... Very funny...";
+ close;
+
+L_ExchangeAbove:
+ mes "[Jade]";
+ mes "Hmmm... Please don't set a number above '100'";
+ next;
+ goto L_InputPointCount;
+
+L_ExchangeNotEnough:
+ mes "[Jade]";
+ mes "Hmmm... The "+@SourceGemstones$+" Gemstones you have";
+ mes "is not enough for "+@number+" "+@TargetGemstones$+" Gemstones.";
+ mes "Please set a new number";
+ next;
+ goto L_InputPointCount;
+
+L_ExchangeDone:
+ mes "[Jade]";
+ mes "Here, This is the "+@TargetGemstones$+" Gemstones you need...";
+ mes "Come back to me when you need more";
+ mes "...mmm? Is there something on my face?";
+ close;
+
+L_Cancel:
+ mes "[Jade]";
+ mes "OK, Very well... Come back if you need anything.";
+ mes "I'll Exchange it for you anytime.";
+ close;
+}
+
+//Need to find out ALL fortunes he can tell for each answer...
+payon_in03.gat,117,128,4 script Fortune Teller 704,{
+ mes "[Lhimetorra]";
+ mes "You're an adventurer of this";
+ mes "world... " + strcharinfo(0) + ", right? So, what can an old person like me do for you?";
+ next;
+ menu "I would like a tarot card reading.",-,"What's a tarot card reading?",L_Info;
+ mes "[Lhimetorra]";
+ mes "Is that so...?";
+ mes "Well, if you want a monster card reading, you must first show me your faith. Otherwise, the spirits will grow angry and place a curse on you.";
+ next;
+ mes "[Lhimetorra]";
+ mes "So, would you like a monster card reading?";
+ next;
+ menu "Yes.",-,"I would like to think over it once more.",L_No;
+ mes "[Lhimetorra]";
+ mes "Then...";
+ mes "Please pay your fee with all of your sincerity.";
+ next;
+ input @fee;
+ if(@fee < 0 || @fee > Zeny) goto L_FeeNotOK;
+ if(@fee > 0) goto L_FeeOK;
+ mes "[Lhimetorra]";
+ mes "Ah...?!";
+ mes "You have angered the monster spirits!";
+ close;
+L_FeeNotOK:
+ mes "[Lhimetorra]";
+ mes "There's no need to overdo it! Just give with all your heart... *Tsk";
+ mes "tsk*";
+ close;
+L_FeeOK:
+ set Zeny,Zeny-@fee;
+ mes "[Lhimetorra]";
+ mes "I accept your heart and your";
+ mes "devotion with my gratitude.";
+ mes "Thoughts are more important than the amount when paying a fortune teller.";
+ next;
+ mes "[Lhimetorra]";
+ mes "Then, I will begin to tell the";
+ mes "fortune of your wish. Concentrate";
+ mes "on yourself...";
+ next;
+ mes "[Lhimetorra]";
+ mes "...";
+ mes "Clear your mind...";
+ next;
+ mes "[Lhimetorra]";
+ mes "...";
+ mes "Once you have emptied your mind, think of the thing you most wish to know.";
+ next;
+ mes "[Lhimetorra]";
+ menu "(I would like to know my love fortune.)",L_AskLove,"(How rich will I be?)",L_AskMoney,"(I need advice about my future.)",L_AskFuture,"(Can I get a warning of any dangers awaiting?)",L_AskDangers;
+L_AskLove:
+ mes "[Lhimetorra]";
+ mes "I see it... I see a sign of";
+ mes "love...";
+ next;
+ set @TEMP,rand(6);
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "Can't you hear the cry of the card? It is suffering. Love is like that.";
+ if(@TEMP == 1) mes "His navel is very pretty. You have to meet someone with that type of navel to be happy.";
+ if(@TEMP == 2) {
+ mes "Hmm. How about giving a cute puppy as a gift? One with a round nose.";
+ mes "Then they will surely be happy.";
+ }
+ if(@TEMP == 3) mes "No matter how fearful the bull may be, if it has a nose ring, it has already been tamed by humans. No matter how astonishing that person may be, taming is your responsibility.";
+ if(@TEMP == 4) mes "Who is he so fiercely gazing at with those grand muscles? He is looking at someone else for sure.";
+ if(@TEMP == 5){
+ mes "They may seem dreary and ominous, but their attire is spotless. They show devotion to the other.";
+ mes "Even though you are not satisfied with your love right now, take a look at they attire.";
+ }
+ next;
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "So don't be upset about it!";
+ if(@TEMP == 1) mes "Ok? Keep that in mind~";
+ if(@TEMP == 2){
+ mes "But can't help if they don't";
+ mes "like puppies.";
+ }
+ if(@TEMP == 3) mes "Approach them with more sincerity and consideration.";
+ if(@TEMP == 4) mes "Don't get sidetracked and look elsewhere! You will be cursed!";
+ if(@TEMP == 5){
+ mes "If it is carefully worn, their";
+ mes "heart for you can be seen in it as well..";
+ }
+ next;
+ mes "[Lhimetorra]";
+ mes "You seek advice about love.";
+ mes "Even if you may not pleased with it, consider it calmly and make an effort to find true happiness.";
+ next;
+ mes "[Lhimetorra]";
+ mes "Then...";
+ close;
+L_AskMoney:
+ mes "[Lhimetorra]";
+ mes "Ooh... something about your future is starting to show...";
+ next;
+ set @TEMP,rand(3);
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "Do you know what a joker's specialty is? It is tricking others and making money. Be wary of the joker.";
+ if(@TEMP == 1) mes "The Skeleton says that you can make money by going north. Go north.";
+ if(@TEMP == 2) mes "A knight values honor more than fortune. They consider discussing wealth itself dirty not worthy. How would you be able to as such a knight a fortune about wealth?";
+ next;
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "Jokers do not exist in one form. They will aim for your money in several different ways.";
+ if(@TEMP == 1) mes "There must be great fortune in that direction.";
+ if(@TEMP == 2) mes "The knight says that a new road of life will open once you look away from fortune.";
+ next;
+ mes "[Lhimetorra]";
+ mes "Most people are curious about money.";
+ mes "It is a very humanly and common curiosity. Cards are very stingy about fortunes regarding wealth.";
+ next;
+ mes "[Lhimetorra]";
+ mes "Therefore, getting a fortune like this is considered being lucky. Use this fortune to prosper.";
+ close;
+L_AskFuture:
+ mes "[Lhimetorra]";
+ mes "Future... the card that sees the future is beginning to speak...... Prepare yourself...";
+ next;
+ set @TEMP,rand(2);
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "Jack says you may be frustrated in the future.";
+ if(@TEMP == 1) mes "He says to overcome the frustration, it is necessary to think of happy thoughts.";
+ next;
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "Meaning your future will become a battle between happiness and frustration...";
+ if(@TEMP == 1) mes "......"; //missing txt
+ next;
+ mes "[Lhimetorra]";
+ mes "Speaking of the future is as dangerous act.";
+ mes "Humans may face disaster if speaking of the future carelessly. That's why we ask cards about the future.";
+ next;
+ mes "[Lhimetorra]";
+ mes "Your fortune is a rather good one. There are some in this world who get more horrible fortunes.";
+ mes "Use this fortune as a support in your life. Ok?";
+ close;
+L_AskDangers:
+ mes "[Lhimetorra]";
+ mes "Someone that knows of the dangers you do not, will warn you in the";
+ mes "form of cards... so listen";
+ mes "carefully-!";
+ next;
+ set @TEMP,rand(2);
+ mes "[Lhimetorra]";
+ if(@TEMP == 0) mes "The pirate is warning you of your beauty. Don't show off your beauty too much. Pirates are very jealous of appearance, as well.";
+ if(@TEMP == 1) mes "A warning is always a useful fortune. You can never lose anything.";
+ next;
+ mes "[Lhimetorra]";
+ mes "I hope you will able to avoid misfortune with this warning.";
+ mes "Then...";
+ close;
+L_No:
+ mes "[Lhimetorra]";
+ mes "Ok then. Young adventurer, may luck be with you.";
+ close;
+L_Info:
+ mes "[Lhimetorra]";
+ mes "Monster card reading uses the cards of familiar monsters around us to get advice about our future, love and many other things.";
+ mes "A fortuneteller like me takes a question from a person and asks the card. The card answers and I tell the person.";
+ next;
+ mes "[Lhimetorra]";
+ mes "You should get no more than one card reading a day, and don't get one often since the cards can get angry or confused.";
+ mes "Also, it can have a bad influence on your life, too!";
+ next;
+ mes "[Lhimetorra]";
+ mes "And... one more thing.";
+ mes "A card reading is only a";
+ mes "reading... No matter how";
+ mes "extraordinary the result may be,";
+ mes "don't get too caught up with it.";
+ mes "Bear that in mind.";
+ close;
+}
+
+payon_in03.gat,131,7,4 script Hunter 59,{
+ mes "[Hunter]";
+ mes "...Can I help you?";
+ mes "I'm here for official business and am busy at the moment. If you'll excuse me...";
+ close;
} \ No newline at end of file
diff --git a/npc/cities/prontera.txt b/npc/cities/prontera.txt
index a632bf557..ef68c80fe 100644
--- a/npc/cities/prontera.txt
+++ b/npc/cities/prontera.txt
@@ -1,626 +1,626 @@
-//===== eAthena Script =======================================
-//= Prontera Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.8a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= NPCs in Prontera
-//===== Additional Comments: =================================
-//= Fully working
-//= +AntiNovice exploit fix [Lupus] 1.2 added baby novice check
-//= Spellchecked [massdriller]
-//= 1.4 Optimized. Novices > 20 BaseJob can go to Culvert, too [Lupus]
-//= 1.5a Added a Jawaii related npc [MasterOfMuppets]
-//= 1.6 Replaced sewer_prt with (MISC_QUEST & 8) [Lupus]
-//= 1.7 Removed Duplicates [Silent]
-//= 1.8 Moved Culvert to quests/quests_prontera.txt
-//============================================================
-
-
-
-// Tono ---------------------------------------------------------------
-prontera.gat,54,240,5 script Tono 97,{
- mes "[Tono]";
- mes "Did you know the larva of a Creamy is a Fabre.";
- mes "The pupa stage of a Fabre is simply called Pupa.";
- mes "As you can imagine, there is another metamorphic monster out in the desert.";
- next;
- mes "[Tono]";
- mes "That's it! It the Peco Peco.";
- mes "The infant of the Peco Peco is called the Picky";
- mes "Unlike the colourfull Peco Peco, the Picky is a very cute pink.";
- close;
-}
-
-// Dairene ----------------------------------------------------------------
-prontera.gat,78,150,3 script Dairenne 90,{
- mes "[Town girl Dairenne]";
- mes "(Cough Cough)... Nowadays the streets are too crowded. (Cough Cough)...";
- mes "Oh..So Dusty...So dirty here... Now I think the Capital City isn't all that good.";
- next;
- mes "[Town girl Dairenne]";
- mes "Hmm... Anyway what is the matter?";
- next;
- menu "Talk",-,"Cancel",L_END;
-
- mes "[Town girl Dairenne]";
- if(Sex == 1) mes "I'm not sure if your into Girllie Dress Stuff..Hohoho..but...";
- mes "These days, the most interesting topic around here is beautiful dresses Dyed in various Colours.";
- next;
- mes "[Town girl Dairenne]";
- mes "To enhance your Clothing with those Dazzling Colours, you must use ^0000ffDyestuffs^000000 made in ^0000ffMorroc^000000 city... I hear they will cost you alot of money.";
- next;
- mes "[Town girl Dairenne]";
- mes "Ah... I wish I could wear a Dress like that just once in my life...";
- close;
-
- L_END:
- mes "[Town girl Dairenne]";
- mes "(Cough)....See you around.";
- close;
-}
-
-// Merideth --------------------------------------------------------------
-prontera.gat,106,117,6 script Merideth 91,{
- mes "[Merideth]";
- mes "The weather was nice on my day off, so my family and I decided to have a picnic.";
- mes "We chose to go to a somewhat secluded area and were amazed at what we saw.";
- next;
- mes "[Merideth]";
- mes "A HUGE swarm of hornets!! I never saw anything like it! But what was even more surprising was the Queen Bee.";
- mes "The fact that she could control all of them with such ease....";
- emotion e_omg;
- next;
- mes "[Merideth]";
- mes "If only a girl like myself had that much power over guys.... NOW THAT, would be really cool!!";
- emotion e_gg;
- close;
-}
-
-// YuNa ---------------------------------------------------------------------
-prontera.gat,146,204,2 script YuNa 700,{
- mes "[YuNa]";
- mes "Odin is the god of wisdom and war. He courageously removed one of his eyes in order to acquire ultimate wisdom. ";
- next;
- mes "[YuNa]";
- mes "The statue in the middle of the water fountain over there is sculpted after the god himself.";
- mes "I don't know who the sculptor was, which is a pity because.... because.";
- next;
- mes "[YuNa]";
- mes "HE DID IT ALL WRONG!!";
- emotion e_ag;
- next;
- mes "[YuNa]";
- mes "The statue is just totally different from the Odin we all know! He insisted that it was his artistic view or something....";
- next;
- mes "[YuNa]";
- mes "Look~ He doesn't have a broad brimmed hat.... he's not even riding Sleipnir.... this is just totally unacceptable~!";
- emotion e_pif;
- close;
-}
-
-// YuPi -----------------------------------------------------------------------
-prontera.gat,160,133,2 script YuPi 102,{
- mes "[YuPi]";
- mes "Among monsters of the same species, there are some that are MORE FEROCIOUS than others";
- mes "If you even TOUCH them by mistake, you'd better prepare yourself for what's gonna happen next.";
- next;
- mes "[YuPi]";
- mes "You can tell the difference between the more AGGRESSIVE ones and the more PASSSIVE ones by their body color.";
- mes "The more AGGRESSIVE the monster is, the more bright, and flashy it's color is.";
- close;
-}
-
-// Shuger -------------------------------------------------------------
-prontera.gat,102,287,5 script Shuger 98,{
- mes "[Shuger]";
- mes "In the fields outside of town, there are pink monsters called '^FF8888Porings^000000'.";
- mes "Though they are cute and do not harm people, they are notorious looters. They will absorb any item that they find on the ground.";
- next;
- mes "[Shuger]";
- mes "There are also green coloured ones, called ^008800Poporings^000000'. They are like the pink Porings but are much stronger.";
- mes "It would be a HUGE MISTAKE for a newbie to attack a Poporing, thinking that it was as weak as a Poring!";
- close;
-}
-
-
-
-//------------------------------------------------------------------------------------- Prontera Church -------------------------------------------------------------------------------\\
-// Henson ---------------------------------------------------------------
-prt_church.gat,103,71,2 script Henson 120,{
- mes "[Henson]";
- mes "Our duty is not only to help others, but to also purify poor souls that have been turned into the Undead.";
- mes "In order to successfully accomplish our duty, we have to learn special skills and practice them very diligently.";
- next;
- mes "[Henson]";
- mes "Well, what was it you wanted to ask me about?";
-L_MENU:
- next;
- menu "About Divine Protection",-, "About Demon Bane",L1, "About Decrease AGI",L2, "About Signum Crisis",L3, "About Pneuma",L4,
- "About Ruwach",L5, "About Teleport",L6, "End conversation.",L_END;
-
- mes "[Henson]";
- mes "If you want to improve your Defence against the Undead, it is a good idea to learn the skill called 'Divine Protection'.";
- mes "It is the most basic skill you'll need, and it doesn't even have a time limit or anything, anyways....";
- next;
- mes "[Henson]";
- mes "If you raise it to level 3, then a skill called 'Deamon Bane' will be available for you. 'Demon Bane' increases your attack against the Undead.";
- mes "With 'Divine Protection' as a foundation, several high class skills such as 'Angelus' and 'Blessing' will be available to you.";
- goto L_MENU;
- L1:
- mes "[Henson]";
- mes "'Demon Bane' improves your attack against the Undead. You need 3 levels of 'Divine Protection' before you can learn Demon Bane.";
- mes "As which 'Divine Protection', 'Demon Bane' is a passive skill and requires no sp and has no time limit.";
- next;
- mes "[Henson]";
- mes "Also, you have to acquire 3 levels of 'Demon Bane' to use a skill called, 'Signum Crisis', which lowers the Defence of Undead and Dark property monsters.";
- goto L_MENU;
-
- L2:
- mes "[Henson]";
- mes "When you use this skill, the movement speed, attack rate, and evasion rate of a targeted monster will be reduced.";
- mes "You will need to get 1 level of 'Increase AGI' first, before you can learn 'Decrease AGI.";
- goto L_MENU;
-
- L3:
- mes "[Henson]";
- mes "You can lower the defence of Undead and Dark property monsters with this skill, and the range of attack is very wide.";
- mes "The success rate, however, is pretty low since it is a very difficult skill to master.";
- next;
- mes "[Henson]";
- mes "Do not be disappointed even if you don't successfully use this skill all the time. You need level 3 'Demon Bane' to acquire this skill.";
- goto L_MENU;
-
- L4:
- mes "[Henson]";
- mes "Once you master 'Warp Portal', you can learn this skill.";
- next;
- mes "[Henson]";
- mes "It generates a barrier that defends you perfectly from long-range attacks, such as archer attacks.";
- goto L_MENU;
-
- L5:
- mes "[Henson]";
- mes "Ruwach allows you to see hidden monsters or players. You also need this skill to learn 'Teleport.";
- goto L_MENU;
-
- L6:
- mes "[Henson]";
- mes "At level 1, it allows you teleport to a random spot on the map you are in. At level2 it allows you to teleport to your last save point.";
- mes "You must learn Ruwach first in order to learn teleport.";
- goto L_MENU;
-
- L_END:
- mes "[Henson]";
- mes "If you're still not certain about all of this, you are always welcome to speak with me later!";
- close;
-}
-
-// Garnet --------------------------------------------------------------
-prt_church.gat,103,76,2 script Garnet 67,{
- mes "[Garnet]";
- mes "Oh~ you want to find pleasure in helping other people, but you don't know how to do so?";
- mes "Fortunately we have the abilities to help and support other people.";
- next;
- mes "[Garnet]";
- mes "We can heal people who are in poor health or awaken the potential hidden deep within others.";
- next;
- mes "[Garnet]";
- mes "Feel free to ask me anything. Although the priest scolds me for my lack of skill, I can assure you I have a VERY STRONG grasp of the theories.";
-L_MENU:
- next;
- menu "About Heal",-,"About Cure",L1,"About Increase AGI",L2,"About Angelus",L3,"Abour Blessing",L4,"About Warp Portal",L5,"End conversation",L_END;
-
- mes "[Garnet]";
- mes "You can recover either your own, or someone else's HP with 'Heal'.";
- next;
- mes "[Garnet]";
- mes "If you learned 'Heal' while you were an Acolyte, then as priest you can create an HP recovering area with the skill 'Sanctuary'.";
- next;
- mes "[Garnet]";
- mes "Here is a little secret... if you use 'Heal' on Undead monsters, it will actually inflict damage, not help them.";
- mes "Ah~ Don't forget to hold the 'Shift' key when you use it though... Ahem~ shhhhh~~!";
- goto L_MENU;
-
- L1:
- mes "[Garnet]";
- mes "'Cure' can alleviate any abnormal status effects you may have. You have to have level 2 'Heal' in order to learn Cure though.";
- goto L_MENU;
-
- L2:
- mes "[Garnet]";
- mes "'Increase AGI' increases your movement speed, attack rate, and evade rate. You can learn it after you've learned 3 levels of 'Heal'.";
- goto L_MENU;
-
- L3:
- mes "[Garnet]";
- mes "You can use 'Angelus' in order to increase the Defence of either yourself or your party members.";
- mes "Now remember, you can only use it on members IN YOUR party.";
- next;
- mes "[Garnet]";
- mes "Level 3 'Divine Protection' is needed to learn this skill.";
- next;
- mes "[Garnet]";
- mes "If you practice 'Angelus' you'll be able to use 'Kyrie Eleison' as a Priest, which allows you to evade attacks for a short period of time.";
- goto L_MENU;
-
- L4:
- mes "[Garnet]";
- mes "'Blessing' temporarily increases STR, DEX and INT. I am sure this skill will be of great advantage for your friends.";
- next;
- mes "[Garnet]";
- mes "'Blessing', like 'Angelus', also requires you know 'Divine Protection'. But you'll need to have 5 levels of 'Divine Protection' to learn it.";
- goto L_MENU;
-
- L5:
- mes "[Garnet]";
- mes "In order to open a 'Warp Portal' you first need to know how to 'Teleport', and in order to 'Teleport, you need 'Ruwach'.";
- next;
- mes "[Garnet]";
- mes "You can remember up to 4 warp points depending on the levels of 'Warp Portal' you've learned.";
- mes "But at least one place must be saved with a Kafra employee.";
- next;
- mes "[Garnet]";
- mes "It's a bit of a hassle, but you have to physically be at the place you want to warp to, and save the position first.";
- mes "This can be very dangerous in some areas so be quick~. Go in, save, and 'Teleport' out!";
- next;
- mes "[Garnet]";
- mes "Also, 'Warp Portal' consumes a huge amount of energy, so you MUST use a 'Blue Gemstone' as a catalyst.";
- next;
- mes "[Garnet]";
- mes "One more thing, you cannot Warp to the inside of dungeons so don't even waste your time trying to.";
- goto L_MENU;
-
- L_END:
- mes "[Garnet]";
- mes "Hehehe, hope I wasn't showing off too much. Well, be Happy in whatever you do~~!";
- close;
-}
-
-// ----------------------------------------------------------------------------------------------- PUB -----------------------------------------------------------------------------------------------------\\
-// Sir Michael (West End Pub)
-prt_in.gat,26,30,1 script Sir Michael 54,{
- mes "[Sir Michael]";
- mes "I dunno if you'll ever believe me, but I saw the WEIRDEST thing down in the ^5555FFCulvert Sewers^000000.";
- mes "I've been training in the 3rd level of the sewers for a long time now, so there's nothing about that area that I don't know.";
- next;
- mes "[Sir Michael]";
- mes "The 4th level is a different story however, and I must have ventured there when it happened.......";
- next;
- mes "[Sir Michael]";
- mes "I saw a GIAGANTIC, SHIMMERING, ^FF5555GOLDEN THIEF BUG^000000.";
- emotion e_gasp;
- next;
- mes "[Sir Michael]";
- mes "I all my years I've never seen a thief bug as LARGE or as SHINY!!! What an amazing sight!";
- close;
-}
-
-//Shevild ----------------------------------------------------
-prt_in.gat,173,24,2 script Shevild 85,{
- mes "[Shevild]";
- mes "Hey~Hey~ Come on over and have a drink, man. I'll tell you some exciting stories.";
- mes "Do not judge me by the way I look... I've been everywhere you can imagine around Prontera.";
- mes "I've been to places packed with monsters, but they also have the greatest view.";
- next;
- menu "Where can I find those places?",-,"Never mind",L_END;
-
- mes "[Shevild]";
- mes "In spite of how I look, I'm a all around-player~~!!!";
- mes "I go hunting, I carry weapons and stuff... and I deliver this and that...";
- mes "Some people ask, 'isn't that a job for an errand boy?....'";
- next;
- mes "[Shevild]";
- mes "But personally I am very proud of myself and of what I'm doing. You should know how harsh the world can be, right?";
- mes "But for me, nothing stands in the way of me accomplishing a job ~Ahem!";
- next;
- mes "[Shevild]";
- mes "Anyways, thanks to my career, I've been able to visit many interesting places where nobody has ever visited before...";
- mes "Oh~ that's the true charm of my job...";
- next;
- mes "[Shevild]";
- mes "Hm... Now... I'm suddenly reminded of a mysterious dungeon and a dangerous forest....";
- emotion e_hmm;
- next;
- L_MENU:
- menu "The mysterious Dungeon?",-,"The dangerous forest?",M_L01,"End conversation",M_END0;
-
- mes "[Shevild]";
- mes "Hm... yeah... yeah... a while ago I followed some hunters to a very mysterious dungeon to the north of Prontera.";
- next;
- mes "[Shevild]";
- mes "Rumour says that the monsters are very tough there, but because of the high risk that you take, you get rewarded with valuable monster drops.";
- mes "So I followed some highly skilled hunters there, but as soon as we stepped into the dungeon, we became confused by the maze of tunnels...";
- next;
- mes "[Shevild]";
- mes "No matter which direction you moved it seemed like you were ending up where you started.";
- mes "So we just got out empty-handed. I really want to explore that dungeon again sometime.";
- next;
- menu "How can I get there?",-,"End conversation",M_END0;
-
- mes "[Shevild]";
- mes "Huh? What? haven't you even wandered around just outside of Prontera yet, man?";
- mes "Alright, alright. I'll tell you. If you go north from the castle of Prontera, the dungeon is at the edge of the north-west side of the forest.";
- emotion e_what;
- next;
- goto L_MENU;
-
- M_L01:
- mes "[Shevild]";
- mes "There is a splendid ruin to the north-east of Prontera. I went there a while ago to deliver something to a priest there.";
- mes "Before you get to the ruins, there is a forest full of monkeys called ^FF4444Yoyos^000000.";
- next;
- mes "You have to be very cautious. As once as you drop something on the ground, a Yoyo jumps out of nowhere and snatches it.";
- next;
- menu "How can I get there?",-,"End conversation",M_END0;
-
- mes "[Shevild]";
- mes "The directions might sound a little confusing, but it really isn't, actually. Go out to the north and keep going to the east. Then you will find it.";
- next;
- goto L_MENU;
-
- M_END0:
- mes "[Shevild]";
- mes "Okay... Anyways watch out while you're travelling out here ~ pal!!";
- close;
- L_END:
- mes "[Shevild]";
- mes "Sure... if you wanna hear more, come back here any time. No problem~~";
- close;
-}
-
-// Bartender ---------------------------------------------------------
-prt_in.gat,181,21,2 script Bartender#03 61,{
- mes "[Bartender]";
- mes "Phew~ more and more people a crawling in these days.";
- mes "I am getting more and more tired everyday, though business has never been better...";
- mes "To tell you the truth, it's getting hard to get the right ingredients for my special dishes.";
- next;
- mes "[Bartender]";
- mes "As you probably know, recently there have many more monsters appearing outside of town. I don't dare step outside of this town any more.";
- mes "Think about it. How can I possibly make my Ultra Nice Super Special dishes with just regular ingredients?";
- next;
- mes "[Bartender]";
- mes "I don't just use any ingredients from the market you know. I use ingredients that come directly from monsters slain by Super heavy level hunters I personally hired.";
- mes "And they are EXTREMELY FRESH, I might add.";
- mes "But it's getting very hard to get enough of what I need even from them";
- next;
- mes "[Bartender]";
- mes "If things don't change... my special menu of 'Sour Crunches' and 'Tasty Yum-Yum' will disappear from people's memories, sob... sob...";
- emotion e_sob;
- next;
-L_MENU:
- menu "'Sour Crunches'?",-,"'Tasty Yum-Yum?'",L1,"Better let him be....",L_END;
-
- mes "[Bartender]";
- mes "Special Ant is the essential ingredient in making Sour Crunches. It can be found in Ant Hell on the way to the desert city of Morocc.";
- mes "The problem is that the number of ants grows exponentially and they also get very hostile. Most hunters don't even think about going near there.";
- next;
- mes "[Bartender]";
- mes "I can already see the ill fate that awaits my beloved pub... (Sighs~~)";
- next;
- goto L_MENU;
- L1:
- mes "[Bartender]";
- mes "It is a very tasty dish prepared with the legs of grasshopper creatures, called Rockers, that can be caught in the area past the forest to the west. ITS tHE BEST dish we have!";
- mes "Those grasshoppers have became very hostile and, moreover, an enormous number of bees have appeared out of nowhere in that area. It's almost impossible to get them.";
- next;
- mes "[Bartender]";
- mes "I can already see the ill fate that awaits my beloved pub... (Sighs~~)";
- next;
- goto L_MENU;
- L_END:
- mes "[Bartender]";
- mes "(Sighs..) Anyways, be careful and take care of yourself~.";
- close;
-}
-
-// Marvin -----------------------------------------------------------
-prt_in.gat,177,18,2 script Marvin 80,{
- mes "[Marvin]";
- mes "....Usually skills are mastered at level 10. So some people get nervous about selecting which one they should learn.";
- next;
- mes "[Marvin]";
- mes "'Hm... if I learn this, I won't be able to learn that...' or 'Uh-Huh? With that skill, will I have enough points to master this skill?' Like this...";
- mes "BUT every rule has an EXCEPTION~~.";
- mes "Not all skills require 10 skill points to be mastered. Ta-da~~... Ahem...";
- next;
- mes "[Marvin]";
- mes "you can master some skills when at level 5. Even better, some skills only require 1 or 2 levels.";
- mes "How pitiful would it be if you didn't learn a tremendously useful skill only because you were afraid of using up your skill points.";
- next;
- mes "[Marvin]";
- mes "But don't just willy nilly and use up all your skill points on every skill either. Collect some information about skills and plan ahead.";
- mes "That way, you can use your valuable skill points very wisely without wasting any.";
- close;
-}
-
-// Tensue -----------------------------------------------------
-prt_in.gat,177,20,2 script TenSue 97,{
- mes "[TenSue]";
- set @TEMP,rand(3);
- if(@TEMP == 1) goto L_TMP1;
- if(@TEMP == 0) goto L_TMP0;
-
- mes "What? You're sick and tired of killing monsters in fields and dungeons?";
- mes "Hahaha, it seems like you are very confident in your training. If you think so...";
- mes "Why don't you visit Izlude, the satellite of Prontera.";
- emotion e_what;
- next;
- mes "[TenSue]";
- mes "Cool Event Corp. has opened up the arena called Time Limit Fight and Battle Ordeal, to full fill the young people's thirst for more excitement...";
- mes "Well... Of course you will have to pay a small fee to participate...";
- next;
- mes "[TenSue]";
- mes "Are you gonna give it a shot?";
- close;
- L_TMP1:
- mes "One time I walked all the way to a place called 'Al de Barman. It was a very dangerous trip with all those monsters...";
- mes "Some of monsters just kept following and attacking me although I did nothing to harm them.";
- next;
- mes "[TenSue]";
- mes "Well.. Nonetheless, the scenic views on the way were so magnificent that I truly believe it was worth trying...";
- mes "A canal surrounding 'Al de Baran' makes the city more distinguishably beautiful.";
- next;
- mes "[TenSue]";
- mes "Also the Kafra Main Office is located there so you can expect great services. Haha. Don't forget to visit there once.";
- close;
- L_TMP0:
- mes "Prontera is presently under the reign of Tristran the 3rd. Everything we have now is only available thanks to his Majesty.";
- next;
- mes "[TenSue]";
- mes "But you know those outsiders at the corner of Prontera? Why do we have to accept them all the time...I really think that is NOT necessary at all.";
- mes "His Majesty ...well...is waaaaaaay to generous..";
- close;
-}
-
-
-//----------------------------------------------- Library -----------------------------------------------------\\
-
-// Library Girl Ellen ----------------------------------------------------
-prt_in.gat,175,50,2 script Librarian Ellen 71,{
- if(@libtmp)goto L_1;
- mes "[Librarian Ellen]";
- mes "Welcome. You can find books about monsters, organized by their properties here. There are also books about Merchant and Blacksmith skills.";
- next;
- mes "[Librarian Ellen]";
- mes "Ah~! The library next door also has many interesting reading materials so please visit there too.";
- set @libtmp,1;
- close;
-L_1:
- mes "[Librarian Ellen]";
- mes "What you think is what you get. From the seas to the air of the great";
- mes "One who hears the bell of chime, he trades what life is left of time";
- next;
- mes "[Librarian Ellen]";
- mes "You need the egg of blobs to seek the truth, the truth you seek is near it comes.";
- mes "What you want is not far, but to get this far you have seek in par.";
- set @libtmp,0;
- close;
-
-}
-
-// Gurator Guiss -------------------------------------------------------
-prt_in.gat,178,92,2 script Curator Guiss 57,{
- mes "[Curator Guiss]";
- mes "Our library keeps records of monsters in various dungeons scattered around Rune-Midgard.";
- mes "They are categorized according to each dungeon where the specific monster resides. Needless to say, every record is very easily accessible.";
- next;
- mes "[Curator Guiss]";
- mes "There are also must-read books for adventures on the top shelves. Please take your time and read those.";
- next;
- mes "[Curator Guiss]";
- mes "The library next door has organized records of monsters according to their properties.";
- mes "If you are interested, you should stop by there, too.";
- close;
-}
-
-// Drunken man in the inn -----------------------------------------------
-prt_in.gat,173,13,4 script Customer#Hans Solo 86,{
-
- set @number_drink,0;
- set @number_place,0;
- mes "[Hans Solo]";
- mes "UhOh... I'm drunk. hiccups!";
- mes "Hey, you. You look lonely!";
- next;
- mes "[Hans Solo]";
- mes "You must be angry seeing others busy getting marry too? You're upset, aren't you?";
- next;
- mes "[Hans Solo]";
- mes "You must be upset with the couples who ignore everyone and drown themselves in happiness,";
- mes "aren't you?";
- next;
- mes "[Hans Solo]";
- mes "I wonder since when everybody starts praising only themselves?";
- mes "It used to be peaceful before that...";
- next;
- mes "[Hans Solo]";
- mes "Anyway, it's ok even if you're not married, friend!!";
- mes "Come, I'll buy you a drink.";
- next;
- mes "- How do I become his friend all of a sudden?! -";
- mes "- Anyway, a free drink won't do any harm.... -";
- next;
- mes "- Gulu Gulu GuLu -";
- percentheal -10,0;
- next;
- mes "[Hans Solo]";
- mes "It's good, isn't it? I know a great place to hang out.";
- mes "Do you want to tag along?";
- next;
- Loopback:
- menu "...Give me another drink",-,"........What place is that?",s_What;
-
- mes "[Hans Solo]";
- mes "Well then, another drink it is.";
- mes "Hey,BaZooKa...let's have a drink!";
- next;
- mes "[Hans Solo]";
- mes "Cheers to the dateless adventurers!";
- next;
- mes "- Gulu Gulu GuLu -";
- percentheal -10,0;
- next;
- set @number_drink,@number_drink + 1;
- if (@number_drink == 5)goto s_Five;
- goto s_While;
-s_What:
- mes "[Hans Solo]";
- mes "Eat and drink as much as you like!";
- mes "Still don't have enough!";
- mes "Come, have more!";
- next;
- mes "[Hans Solo]";
- mes "Cheers for the dateless adventurers!";
- next;
- mes "- Gulu Gulu GuLu -";
- percentheal -10,0;
- next;
- set @number_place,@number_place + 1;
- goto s_While;
-
-s_Five:
- mes "[Hans Solo]";
- mes "UhOh... Are you alright?";
- mes "Come, sign your name here.";
- mes "I'll take you to a wonderful place!";
- next;
- menu "Sign it",-,"Don't sign it",s_Dont;
-
- mes "[Hans Solo]";
- mes "Good! Let me send you to that place now...Hehe..";
- percentheal 100,0;
- close2;
- warp "jawaii_in.gat",44,124;
- end;
-
-s_Dont:
- mes "[Hans Solo]";
- mes "....Hey!";
- close;
-s_While:
- if (@number_drink >= 4 && @number_place >= 1 || @number_place >= 4)
-{
- mes "[Hans Solo]";
- mes "Hiccups... So you finally decide to go there?";
- mes "Come... Sign your name here,";
- mes "I'll take you to a great place!";
- next;
- menu "Sign it",-,"Don't sign it",s_Dont2;
- mes "[Hans Solo]";
- mes "Good! I'll send you there now...Hehe..";
- mes "Grumble about your pityful life while you can...Hehe...";
- percentheal 100,0;
- warp "jawaii_in.gat",44,124;
- close;
-s_Dont2:
- mes "[Hans Solo]";
- mes "....Hey!";
- close;
-}
-goto Loopback;
+//===== eAthena Script =======================================
+//= Prontera Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.8a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= NPCs in Prontera
+//===== Additional Comments: =================================
+//= Fully working
+//= +AntiNovice exploit fix [Lupus] 1.2 added baby novice check
+//= Spellchecked [massdriller]
+//= 1.4 Optimized. Novices > 20 BaseJob can go to Culvert, too [Lupus]
+//= 1.5a Added a Jawaii related npc [MasterOfMuppets]
+//= 1.6 Replaced sewer_prt with (MISC_QUEST & 8) [Lupus]
+//= 1.7 Removed Duplicates [Silent]
+//= 1.8 Moved Culvert to quests/quests_prontera.txt
+//============================================================
+
+
+
+// Tono ---------------------------------------------------------------
+prontera.gat,54,240,5 script Tono 97,{
+ mes "[Tono]";
+ mes "Did you know the larva of a Creamy is a Fabre.";
+ mes "The pupa stage of a Fabre is simply called Pupa.";
+ mes "As you can imagine, there is another metamorphic monster out in the desert.";
+ next;
+ mes "[Tono]";
+ mes "That's it! It the Peco Peco.";
+ mes "The infant of the Peco Peco is called the Picky";
+ mes "Unlike the colourfull Peco Peco, the Picky is a very cute pink.";
+ close;
+}
+
+// Dairene ----------------------------------------------------------------
+prontera.gat,78,150,3 script Dairenne 90,{
+ mes "[Town girl Dairenne]";
+ mes "(Cough Cough)... Nowadays the streets are too crowded. (Cough Cough)...";
+ mes "Oh..So Dusty...So dirty here... Now I think the Capital City isn't all that good.";
+ next;
+ mes "[Town girl Dairenne]";
+ mes "Hmm... Anyway what is the matter?";
+ next;
+ menu "Talk",-,"Cancel",L_END;
+
+ mes "[Town girl Dairenne]";
+ if(Sex == 1) mes "I'm not sure if your into Girllie Dress Stuff..Hohoho..but...";
+ mes "These days, the most interesting topic around here is beautiful dresses Dyed in various Colours.";
+ next;
+ mes "[Town girl Dairenne]";
+ mes "To enhance your Clothing with those Dazzling Colours, you must use ^0000ffDyestuffs^000000 made in ^0000ffMorroc^000000 city... I hear they will cost you alot of money.";
+ next;
+ mes "[Town girl Dairenne]";
+ mes "Ah... I wish I could wear a Dress like that just once in my life...";
+ close;
+
+ L_END:
+ mes "[Town girl Dairenne]";
+ mes "(Cough)....See you around.";
+ close;
+}
+
+// Merideth --------------------------------------------------------------
+prontera.gat,106,117,6 script Merideth 91,{
+ mes "[Merideth]";
+ mes "The weather was nice on my day off, so my family and I decided to have a picnic.";
+ mes "We chose to go to a somewhat secluded area and were amazed at what we saw.";
+ next;
+ mes "[Merideth]";
+ mes "A HUGE swarm of hornets!! I never saw anything like it! But what was even more surprising was the Queen Bee.";
+ mes "The fact that she could control all of them with such ease....";
+ emotion e_omg;
+ next;
+ mes "[Merideth]";
+ mes "If only a girl like myself had that much power over guys.... NOW THAT, would be really cool!!";
+ emotion e_gg;
+ close;
+}
+
+// YuNa ---------------------------------------------------------------------
+prontera.gat,146,204,2 script YuNa 700,{
+ mes "[YuNa]";
+ mes "Odin is the god of wisdom and war. He courageously removed one of his eyes in order to acquire ultimate wisdom. ";
+ next;
+ mes "[YuNa]";
+ mes "The statue in the middle of the water fountain over there is sculpted after the god himself.";
+ mes "I don't know who the sculptor was, which is a pity because.... because.";
+ next;
+ mes "[YuNa]";
+ mes "HE DID IT ALL WRONG!!";
+ emotion e_ag;
+ next;
+ mes "[YuNa]";
+ mes "The statue is just totally different from the Odin we all know! He insisted that it was his artistic view or something....";
+ next;
+ mes "[YuNa]";
+ mes "Look~ He doesn't have a broad brimmed hat.... he's not even riding Sleipnir.... this is just totally unacceptable~!";
+ emotion e_pif;
+ close;
+}
+
+// YuPi -----------------------------------------------------------------------
+prontera.gat,160,133,2 script YuPi 102,{
+ mes "[YuPi]";
+ mes "Among monsters of the same species, there are some that are MORE FEROCIOUS than others";
+ mes "If you even TOUCH them by mistake, you'd better prepare yourself for what's gonna happen next.";
+ next;
+ mes "[YuPi]";
+ mes "You can tell the difference between the more AGGRESSIVE ones and the more PASSSIVE ones by their body color.";
+ mes "The more AGGRESSIVE the monster is, the more bright, and flashy it's color is.";
+ close;
+}
+
+// Shuger -------------------------------------------------------------
+prontera.gat,102,287,5 script Shuger 98,{
+ mes "[Shuger]";
+ mes "In the fields outside of town, there are pink monsters called '^FF8888Porings^000000'.";
+ mes "Though they are cute and do not harm people, they are notorious looters. They will absorb any item that they find on the ground.";
+ next;
+ mes "[Shuger]";
+ mes "There are also green coloured ones, called ^008800Poporings^000000'. They are like the pink Porings but are much stronger.";
+ mes "It would be a HUGE MISTAKE for a newbie to attack a Poporing, thinking that it was as weak as a Poring!";
+ close;
+}
+
+
+
+//------------------------------------------------------------------------------------- Prontera Church -------------------------------------------------------------------------------\\
+// Henson ---------------------------------------------------------------
+prt_church.gat,103,71,2 script Henson 120,{
+ mes "[Henson]";
+ mes "Our duty is not only to help others, but to also purify poor souls that have been turned into the Undead.";
+ mes "In order to successfully accomplish our duty, we have to learn special skills and practice them very diligently.";
+ next;
+ mes "[Henson]";
+ mes "Well, what was it you wanted to ask me about?";
+L_MENU:
+ next;
+ menu "About Divine Protection",-, "About Demon Bane",L1, "About Decrease AGI",L2, "About Signum Crisis",L3, "About Pneuma",L4,
+ "About Ruwach",L5, "About Teleport",L6, "End conversation.",L_END;
+
+ mes "[Henson]";
+ mes "If you want to improve your Defence against the Undead, it is a good idea to learn the skill called 'Divine Protection'.";
+ mes "It is the most basic skill you'll need, and it doesn't even have a time limit or anything, anyways....";
+ next;
+ mes "[Henson]";
+ mes "If you raise it to level 3, then a skill called 'Deamon Bane' will be available for you. 'Demon Bane' increases your attack against the Undead.";
+ mes "With 'Divine Protection' as a foundation, several high class skills such as 'Angelus' and 'Blessing' will be available to you.";
+ goto L_MENU;
+ L1:
+ mes "[Henson]";
+ mes "'Demon Bane' improves your attack against the Undead. You need 3 levels of 'Divine Protection' before you can learn Demon Bane.";
+ mes "As which 'Divine Protection', 'Demon Bane' is a passive skill and requires no sp and has no time limit.";
+ next;
+ mes "[Henson]";
+ mes "Also, you have to acquire 3 levels of 'Demon Bane' to use a skill called, 'Signum Crisis', which lowers the Defence of Undead and Dark property monsters.";
+ goto L_MENU;
+
+ L2:
+ mes "[Henson]";
+ mes "When you use this skill, the movement speed, attack rate, and evasion rate of a targeted monster will be reduced.";
+ mes "You will need to get 1 level of 'Increase AGI' first, before you can learn 'Decrease AGI.";
+ goto L_MENU;
+
+ L3:
+ mes "[Henson]";
+ mes "You can lower the defence of Undead and Dark property monsters with this skill, and the range of attack is very wide.";
+ mes "The success rate, however, is pretty low since it is a very difficult skill to master.";
+ next;
+ mes "[Henson]";
+ mes "Do not be disappointed even if you don't successfully use this skill all the time. You need level 3 'Demon Bane' to acquire this skill.";
+ goto L_MENU;
+
+ L4:
+ mes "[Henson]";
+ mes "Once you master 'Warp Portal', you can learn this skill.";
+ next;
+ mes "[Henson]";
+ mes "It generates a barrier that defends you perfectly from long-range attacks, such as archer attacks.";
+ goto L_MENU;
+
+ L5:
+ mes "[Henson]";
+ mes "Ruwach allows you to see hidden monsters or players. You also need this skill to learn 'Teleport.";
+ goto L_MENU;
+
+ L6:
+ mes "[Henson]";
+ mes "At level 1, it allows you teleport to a random spot on the map you are in. At level2 it allows you to teleport to your last save point.";
+ mes "You must learn Ruwach first in order to learn teleport.";
+ goto L_MENU;
+
+ L_END:
+ mes "[Henson]";
+ mes "If you're still not certain about all of this, you are always welcome to speak with me later!";
+ close;
+}
+
+// Garnet --------------------------------------------------------------
+prt_church.gat,103,76,2 script Garnet 67,{
+ mes "[Garnet]";
+ mes "Oh~ you want to find pleasure in helping other people, but you don't know how to do so?";
+ mes "Fortunately we have the abilities to help and support other people.";
+ next;
+ mes "[Garnet]";
+ mes "We can heal people who are in poor health or awaken the potential hidden deep within others.";
+ next;
+ mes "[Garnet]";
+ mes "Feel free to ask me anything. Although the priest scolds me for my lack of skill, I can assure you I have a VERY STRONG grasp of the theories.";
+L_MENU:
+ next;
+ menu "About Heal",-,"About Cure",L1,"About Increase AGI",L2,"About Angelus",L3,"Abour Blessing",L4,"About Warp Portal",L5,"End conversation",L_END;
+
+ mes "[Garnet]";
+ mes "You can recover either your own, or someone else's HP with 'Heal'.";
+ next;
+ mes "[Garnet]";
+ mes "If you learned 'Heal' while you were an Acolyte, then as priest you can create an HP recovering area with the skill 'Sanctuary'.";
+ next;
+ mes "[Garnet]";
+ mes "Here is a little secret... if you use 'Heal' on Undead monsters, it will actually inflict damage, not help them.";
+ mes "Ah~ Don't forget to hold the 'Shift' key when you use it though... Ahem~ shhhhh~~!";
+ goto L_MENU;
+
+ L1:
+ mes "[Garnet]";
+ mes "'Cure' can alleviate any abnormal status effects you may have. You have to have level 2 'Heal' in order to learn Cure though.";
+ goto L_MENU;
+
+ L2:
+ mes "[Garnet]";
+ mes "'Increase AGI' increases your movement speed, attack rate, and evade rate. You can learn it after you've learned 3 levels of 'Heal'.";
+ goto L_MENU;
+
+ L3:
+ mes "[Garnet]";
+ mes "You can use 'Angelus' in order to increase the Defence of either yourself or your party members.";
+ mes "Now remember, you can only use it on members IN YOUR party.";
+ next;
+ mes "[Garnet]";
+ mes "Level 3 'Divine Protection' is needed to learn this skill.";
+ next;
+ mes "[Garnet]";
+ mes "If you practice 'Angelus' you'll be able to use 'Kyrie Eleison' as a Priest, which allows you to evade attacks for a short period of time.";
+ goto L_MENU;
+
+ L4:
+ mes "[Garnet]";
+ mes "'Blessing' temporarily increases STR, DEX and INT. I am sure this skill will be of great advantage for your friends.";
+ next;
+ mes "[Garnet]";
+ mes "'Blessing', like 'Angelus', also requires you know 'Divine Protection'. But you'll need to have 5 levels of 'Divine Protection' to learn it.";
+ goto L_MENU;
+
+ L5:
+ mes "[Garnet]";
+ mes "In order to open a 'Warp Portal' you first need to know how to 'Teleport', and in order to 'Teleport, you need 'Ruwach'.";
+ next;
+ mes "[Garnet]";
+ mes "You can remember up to 4 warp points depending on the levels of 'Warp Portal' you've learned.";
+ mes "But at least one place must be saved with a Kafra employee.";
+ next;
+ mes "[Garnet]";
+ mes "It's a bit of a hassle, but you have to physically be at the place you want to warp to, and save the position first.";
+ mes "This can be very dangerous in some areas so be quick~. Go in, save, and 'Teleport' out!";
+ next;
+ mes "[Garnet]";
+ mes "Also, 'Warp Portal' consumes a huge amount of energy, so you MUST use a 'Blue Gemstone' as a catalyst.";
+ next;
+ mes "[Garnet]";
+ mes "One more thing, you cannot Warp to the inside of dungeons so don't even waste your time trying to.";
+ goto L_MENU;
+
+ L_END:
+ mes "[Garnet]";
+ mes "Hehehe, hope I wasn't showing off too much. Well, be Happy in whatever you do~~!";
+ close;
+}
+
+// ----------------------------------------------------------------------------------------------- PUB -----------------------------------------------------------------------------------------------------\\
+// Sir Michael (West End Pub)
+prt_in.gat,26,30,1 script Sir Michael 54,{
+ mes "[Sir Michael]";
+ mes "I dunno if you'll ever believe me, but I saw the WEIRDEST thing down in the ^5555FFCulvert Sewers^000000.";
+ mes "I've been training in the 3rd level of the sewers for a long time now, so there's nothing about that area that I don't know.";
+ next;
+ mes "[Sir Michael]";
+ mes "The 4th level is a different story however, and I must have ventured there when it happened.......";
+ next;
+ mes "[Sir Michael]";
+ mes "I saw a GIAGANTIC, SHIMMERING, ^FF5555GOLDEN THIEF BUG^000000.";
+ emotion e_gasp;
+ next;
+ mes "[Sir Michael]";
+ mes "I all my years I've never seen a thief bug as LARGE or as SHINY!!! What an amazing sight!";
+ close;
+}
+
+//Shevild ----------------------------------------------------
+prt_in.gat,173,24,2 script Shevild 85,{
+ mes "[Shevild]";
+ mes "Hey~Hey~ Come on over and have a drink, man. I'll tell you some exciting stories.";
+ mes "Do not judge me by the way I look... I've been everywhere you can imagine around Prontera.";
+ mes "I've been to places packed with monsters, but they also have the greatest view.";
+ next;
+ menu "Where can I find those places?",-,"Never mind",L_END;
+
+ mes "[Shevild]";
+ mes "In spite of how I look, I'm a all around-player~~!!!";
+ mes "I go hunting, I carry weapons and stuff... and I deliver this and that...";
+ mes "Some people ask, 'isn't that a job for an errand boy?....'";
+ next;
+ mes "[Shevild]";
+ mes "But personally I am very proud of myself and of what I'm doing. You should know how harsh the world can be, right?";
+ mes "But for me, nothing stands in the way of me accomplishing a job ~Ahem!";
+ next;
+ mes "[Shevild]";
+ mes "Anyways, thanks to my career, I've been able to visit many interesting places where nobody has ever visited before...";
+ mes "Oh~ that's the true charm of my job...";
+ next;
+ mes "[Shevild]";
+ mes "Hm... Now... I'm suddenly reminded of a mysterious dungeon and a dangerous forest....";
+ emotion e_hmm;
+ next;
+ L_MENU:
+ menu "The mysterious Dungeon?",-,"The dangerous forest?",M_L01,"End conversation",M_END0;
+
+ mes "[Shevild]";
+ mes "Hm... yeah... yeah... a while ago I followed some hunters to a very mysterious dungeon to the north of Prontera.";
+ next;
+ mes "[Shevild]";
+ mes "Rumour says that the monsters are very tough there, but because of the high risk that you take, you get rewarded with valuable monster drops.";
+ mes "So I followed some highly skilled hunters there, but as soon as we stepped into the dungeon, we became confused by the maze of tunnels...";
+ next;
+ mes "[Shevild]";
+ mes "No matter which direction you moved it seemed like you were ending up where you started.";
+ mes "So we just got out empty-handed. I really want to explore that dungeon again sometime.";
+ next;
+ menu "How can I get there?",-,"End conversation",M_END0;
+
+ mes "[Shevild]";
+ mes "Huh? What? haven't you even wandered around just outside of Prontera yet, man?";
+ mes "Alright, alright. I'll tell you. If you go north from the castle of Prontera, the dungeon is at the edge of the north-west side of the forest.";
+ emotion e_what;
+ next;
+ goto L_MENU;
+
+ M_L01:
+ mes "[Shevild]";
+ mes "There is a splendid ruin to the north-east of Prontera. I went there a while ago to deliver something to a priest there.";
+ mes "Before you get to the ruins, there is a forest full of monkeys called ^FF4444Yoyos^000000.";
+ next;
+ mes "You have to be very cautious. As once as you drop something on the ground, a Yoyo jumps out of nowhere and snatches it.";
+ next;
+ menu "How can I get there?",-,"End conversation",M_END0;
+
+ mes "[Shevild]";
+ mes "The directions might sound a little confusing, but it really isn't, actually. Go out to the north and keep going to the east. Then you will find it.";
+ next;
+ goto L_MENU;
+
+ M_END0:
+ mes "[Shevild]";
+ mes "Okay... Anyways watch out while you're travelling out here ~ pal!!";
+ close;
+ L_END:
+ mes "[Shevild]";
+ mes "Sure... if you wanna hear more, come back here any time. No problem~~";
+ close;
+}
+
+// Bartender ---------------------------------------------------------
+prt_in.gat,181,21,2 script Bartender#03 61,{
+ mes "[Bartender]";
+ mes "Phew~ more and more people a crawling in these days.";
+ mes "I am getting more and more tired everyday, though business has never been better...";
+ mes "To tell you the truth, it's getting hard to get the right ingredients for my special dishes.";
+ next;
+ mes "[Bartender]";
+ mes "As you probably know, recently there have many more monsters appearing outside of town. I don't dare step outside of this town any more.";
+ mes "Think about it. How can I possibly make my Ultra Nice Super Special dishes with just regular ingredients?";
+ next;
+ mes "[Bartender]";
+ mes "I don't just use any ingredients from the market you know. I use ingredients that come directly from monsters slain by Super heavy level hunters I personally hired.";
+ mes "And they are EXTREMELY FRESH, I might add.";
+ mes "But it's getting very hard to get enough of what I need even from them";
+ next;
+ mes "[Bartender]";
+ mes "If things don't change... my special menu of 'Sour Crunches' and 'Tasty Yum-Yum' will disappear from people's memories, sob... sob...";
+ emotion e_sob;
+ next;
+L_MENU:
+ menu "'Sour Crunches'?",-,"'Tasty Yum-Yum?'",L1,"Better let him be....",L_END;
+
+ mes "[Bartender]";
+ mes "Special Ant is the essential ingredient in making Sour Crunches. It can be found in Ant Hell on the way to the desert city of Morocc.";
+ mes "The problem is that the number of ants grows exponentially and they also get very hostile. Most hunters don't even think about going near there.";
+ next;
+ mes "[Bartender]";
+ mes "I can already see the ill fate that awaits my beloved pub... (Sighs~~)";
+ next;
+ goto L_MENU;
+ L1:
+ mes "[Bartender]";
+ mes "It is a very tasty dish prepared with the legs of grasshopper creatures, called Rockers, that can be caught in the area past the forest to the west. ITS tHE BEST dish we have!";
+ mes "Those grasshoppers have became very hostile and, moreover, an enormous number of bees have appeared out of nowhere in that area. It's almost impossible to get them.";
+ next;
+ mes "[Bartender]";
+ mes "I can already see the ill fate that awaits my beloved pub... (Sighs~~)";
+ next;
+ goto L_MENU;
+ L_END:
+ mes "[Bartender]";
+ mes "(Sighs..) Anyways, be careful and take care of yourself~.";
+ close;
+}
+
+// Marvin -----------------------------------------------------------
+prt_in.gat,177,18,2 script Marvin 80,{
+ mes "[Marvin]";
+ mes "....Usually skills are mastered at level 10. So some people get nervous about selecting which one they should learn.";
+ next;
+ mes "[Marvin]";
+ mes "'Hm... if I learn this, I won't be able to learn that...' or 'Uh-Huh? With that skill, will I have enough points to master this skill?' Like this...";
+ mes "BUT every rule has an EXCEPTION~~.";
+ mes "Not all skills require 10 skill points to be mastered. Ta-da~~... Ahem...";
+ next;
+ mes "[Marvin]";
+ mes "you can master some skills when at level 5. Even better, some skills only require 1 or 2 levels.";
+ mes "How pitiful would it be if you didn't learn a tremendously useful skill only because you were afraid of using up your skill points.";
+ next;
+ mes "[Marvin]";
+ mes "But don't just willy nilly and use up all your skill points on every skill either. Collect some information about skills and plan ahead.";
+ mes "That way, you can use your valuable skill points very wisely without wasting any.";
+ close;
+}
+
+// Tensue -----------------------------------------------------
+prt_in.gat,177,20,2 script TenSue 97,{
+ mes "[TenSue]";
+ set @TEMP,rand(3);
+ if(@TEMP == 1) goto L_TMP1;
+ if(@TEMP == 0) goto L_TMP0;
+
+ mes "What? You're sick and tired of killing monsters in fields and dungeons?";
+ mes "Hahaha, it seems like you are very confident in your training. If you think so...";
+ mes "Why don't you visit Izlude, the satellite of Prontera.";
+ emotion e_what;
+ next;
+ mes "[TenSue]";
+ mes "Cool Event Corp. has opened up the arena called Time Limit Fight and Battle Ordeal, to full fill the young people's thirst for more excitement...";
+ mes "Well... Of course you will have to pay a small fee to participate...";
+ next;
+ mes "[TenSue]";
+ mes "Are you gonna give it a shot?";
+ close;
+ L_TMP1:
+ mes "One time I walked all the way to a place called 'Al de Barman. It was a very dangerous trip with all those monsters...";
+ mes "Some of monsters just kept following and attacking me although I did nothing to harm them.";
+ next;
+ mes "[TenSue]";
+ mes "Well.. Nonetheless, the scenic views on the way were so magnificent that I truly believe it was worth trying...";
+ mes "A canal surrounding 'Al de Baran' makes the city more distinguishably beautiful.";
+ next;
+ mes "[TenSue]";
+ mes "Also the Kafra Main Office is located there so you can expect great services. Haha. Don't forget to visit there once.";
+ close;
+ L_TMP0:
+ mes "Prontera is presently under the reign of Tristran the 3rd. Everything we have now is only available thanks to his Majesty.";
+ next;
+ mes "[TenSue]";
+ mes "But you know those outsiders at the corner of Prontera? Why do we have to accept them all the time...I really think that is NOT necessary at all.";
+ mes "His Majesty ...well...is waaaaaaay to generous..";
+ close;
+}
+
+
+//----------------------------------------------- Library -----------------------------------------------------\\
+
+// Library Girl Ellen ----------------------------------------------------
+prt_in.gat,175,50,2 script Librarian Ellen 71,{
+ if(@libtmp)goto L_1;
+ mes "[Librarian Ellen]";
+ mes "Welcome. You can find books about monsters, organized by their properties here. There are also books about Merchant and Blacksmith skills.";
+ next;
+ mes "[Librarian Ellen]";
+ mes "Ah~! The library next door also has many interesting reading materials so please visit there too.";
+ set @libtmp,1;
+ close;
+L_1:
+ mes "[Librarian Ellen]";
+ mes "What you think is what you get. From the seas to the air of the great";
+ mes "One who hears the bell of chime, he trades what life is left of time";
+ next;
+ mes "[Librarian Ellen]";
+ mes "You need the egg of blobs to seek the truth, the truth you seek is near it comes.";
+ mes "What you want is not far, but to get this far you have seek in par.";
+ set @libtmp,0;
+ close;
+
+}
+
+// Gurator Guiss -------------------------------------------------------
+prt_in.gat,178,92,2 script Curator Guiss 57,{
+ mes "[Curator Guiss]";
+ mes "Our library keeps records of monsters in various dungeons scattered around Rune-Midgard.";
+ mes "They are categorized according to each dungeon where the specific monster resides. Needless to say, every record is very easily accessible.";
+ next;
+ mes "[Curator Guiss]";
+ mes "There are also must-read books for adventures on the top shelves. Please take your time and read those.";
+ next;
+ mes "[Curator Guiss]";
+ mes "The library next door has organized records of monsters according to their properties.";
+ mes "If you are interested, you should stop by there, too.";
+ close;
+}
+
+// Drunken man in the inn -----------------------------------------------
+prt_in.gat,173,13,4 script Customer#Hans Solo 86,{
+
+ set @number_drink,0;
+ set @number_place,0;
+ mes "[Hans Solo]";
+ mes "UhOh... I'm drunk. hiccups!";
+ mes "Hey, you. You look lonely!";
+ next;
+ mes "[Hans Solo]";
+ mes "You must be angry seeing others busy getting marry too? You're upset, aren't you?";
+ next;
+ mes "[Hans Solo]";
+ mes "You must be upset with the couples who ignore everyone and drown themselves in happiness,";
+ mes "aren't you?";
+ next;
+ mes "[Hans Solo]";
+ mes "I wonder since when everybody starts praising only themselves?";
+ mes "It used to be peaceful before that...";
+ next;
+ mes "[Hans Solo]";
+ mes "Anyway, it's ok even if you're not married, friend!!";
+ mes "Come, I'll buy you a drink.";
+ next;
+ mes "- How do I become his friend all of a sudden?! -";
+ mes "- Anyway, a free drink won't do any harm.... -";
+ next;
+ mes "- Gulu Gulu GuLu -";
+ percentheal -10,0;
+ next;
+ mes "[Hans Solo]";
+ mes "It's good, isn't it? I know a great place to hang out.";
+ mes "Do you want to tag along?";
+ next;
+ Loopback:
+ menu "...Give me another drink",-,"........What place is that?",s_What;
+
+ mes "[Hans Solo]";
+ mes "Well then, another drink it is.";
+ mes "Hey,BaZooKa...let's have a drink!";
+ next;
+ mes "[Hans Solo]";
+ mes "Cheers to the dateless adventurers!";
+ next;
+ mes "- Gulu Gulu GuLu -";
+ percentheal -10,0;
+ next;
+ set @number_drink,@number_drink + 1;
+ if (@number_drink == 5)goto s_Five;
+ goto s_While;
+s_What:
+ mes "[Hans Solo]";
+ mes "Eat and drink as much as you like!";
+ mes "Still don't have enough!";
+ mes "Come, have more!";
+ next;
+ mes "[Hans Solo]";
+ mes "Cheers for the dateless adventurers!";
+ next;
+ mes "- Gulu Gulu GuLu -";
+ percentheal -10,0;
+ next;
+ set @number_place,@number_place + 1;
+ goto s_While;
+
+s_Five:
+ mes "[Hans Solo]";
+ mes "UhOh... Are you alright?";
+ mes "Come, sign your name here.";
+ mes "I'll take you to a wonderful place!";
+ next;
+ menu "Sign it",-,"Don't sign it",s_Dont;
+
+ mes "[Hans Solo]";
+ mes "Good! Let me send you to that place now...Hehe..";
+ percentheal 100,0;
+ close2;
+ warp "jawaii_in.gat",44,124;
+ end;
+
+s_Dont:
+ mes "[Hans Solo]";
+ mes "....Hey!";
+ close;
+s_While:
+ if (@number_drink >= 4 && @number_place >= 1 || @number_place >= 4)
+{
+ mes "[Hans Solo]";
+ mes "Hiccups... So you finally decide to go there?";
+ mes "Come... Sign your name here,";
+ mes "I'll take you to a great place!";
+ next;
+ menu "Sign it",-,"Don't sign it",s_Dont2;
+ mes "[Hans Solo]";
+ mes "Good! I'll send you there now...Hehe..";
+ mes "Grumble about your pityful life while you can...Hehe...";
+ percentheal 100,0;
+ warp "jawaii_in.gat",44,124;
+ close;
+s_Dont2:
+ mes "[Hans Solo]";
+ mes "....Hey!";
+ close;
+}
+goto Loopback;
} \ No newline at end of file
diff --git a/npc/cities/umbala.txt b/npc/cities/umbala.txt
index c0ae1e84d..bfd3bdb82 100644
--- a/npc/cities/umbala.txt
+++ b/npc/cities/umbala.txt
@@ -1,885 +1,885 @@
-//===== eAthena script =======================================
-//= Umbala Town script
-//===== By: ==================================================
-//= jAthena (1.0) Fusion Dev Team (1.1) Muad Dib (1.2) Darkchild (1.3)
-//===== Current Version: =====================================
-//= 1.9
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Episode XX
-//===== Description: =========================================
-//= Umbala Town Npcs
-//==================================================
-//===== Additional Comments: =================================
-//= 1.0 - Done By jAthena (dunno Who)
-//= 1.1 - Translated by Fusion Dev Team
-//= 1.2 - Fixed Something by Muad Dib
-//= 1.3 - Fixed up For eA by Darkchild
-//= 1.4 - Fixed some wrong item names [Lupus]
-//= 1.5 – Spell Checked [massdriller]
-//= 1.6 - Fixed item names, added a chance to get to Niflheim via Jumping Bungy Area [Lupus]
-//= 1.7 - Fixed bugs and exploits [Lupus]
-//= 1.8 - Warps you to Niff with 1HP [Lance]
-//= 1.9 - Moved Umbala Event, Create Essence/Dismantle Stone, and Skeletal Gate to npc/quests/quests_umbala.txt [Evera]
-//= 2.0 - Removed duplicates, max NPC name length is 23, so Utan Tribe Young Adult#1, the 1 is skipped [Toms]
-//============================================================
-
-
-//========================================================
-// == NPCs on the road to Umbala ==
-//========================================================
-//Note that On_Emotion is NOT an npc command but just an trigger for DoNpcEvent!!
-comodo.gat,170,137,7 script Reid 84,{
- close;
-On_Emotion20:
- emotion e_hmm;
- end;
-On_Emotion29:
- emotion e_gg;
- end;
-}
-
-//========================================================
-comodo.gat,171,137,1 script Heath 92,{
- mes "[Reid]";
- mes "There's a huuuuuuuge treasure hidden";
- mes "somewhere around here!";
- next;
- mes "[Heath]";
- mes "If only we could get our hands on it,";
- mes "the people who call us the 'Dunce Duo'";
- mes "will certainly have to eat their words!!";
- next;
- mes "[Reid]";
- mes "We'll keep looking as long as it takes!";
- next;
- donpcevent "Reid::On_Emotion29";
- emotion e_gg;
- mes "[Heath]";
- mes "Hey, Reid, come on!";
- next;
- mes "[Reid]";
- mes "............";
- next;
- donpcevent "Reid::On_Emotion29";
- emotion e_hmm;
- mes "[Reid]";
- mes "Okay, okay...I'm coming.";
- next;
- menu "Hey, wait! Treasure?",Lwhat_1;
-
- Lwhat_1:
- mes "[Reid]";
- mes "You mean you've never heard of it?!";
- next;
- emotion e_gg;
- mes "[Heath]";
- mes "Oh, you want to hear the story of the";
- mes "treasure, huh? Well, how important";
- mes "is it to you, really?";
- next;
- mes "[Reid and Heath]";
- donpcevent "Reid::On_Emotion29";
- emotion e_gg;
- mes "Important enough for you to";
- mes "cough up 1000 zeny?!";
- next;
- menu "Alright. I'll be a sucker today",Lzeny_1,"Dream on, Dunce Duo!",Lzeny_2;
-
- Lzeny_1:
- if(Zeny < 1000) goto Lzeny_no;
- set Zeny,Zeny-1000;
- mes "[Heath]";
- mes "Alright, my 'friend'. listen up.";
- next;
- mes "[Reid]";
- mes "A famous adventurer named Niles";
- mes "returned to this village from his";
- mes "adventures abroad.";
- mes "He was dragging...";
- next;
- mes "[Heath]";
- mes "...(Whisperwhisperwhisper)";
- mes "a really big box along behind him!!";
- next;
- mes "[Reid]";
- mes "He returned during the dead of night,";
- mes "hoping no one would see his cargo.";
- next;
- mes "[Heath]";
- mes "There has to be something";
- mes "valuable in that box!";
- mes "There's no other explanation!";
- next;
- mes "[Reid]";
- mes "I'm on a search for that box!";
- mes "I'm going to find it!";
- next;
- emotion e_hmm;
- mes "[Heath]";
- mes "There's just one problem.";
- mes "We don't have the slightest";
- mes "idea where Niles put the treasure.";
- next;
- mes "[Reid]";
- mes "Niles is making us look foolish!";
- next;
- menu "Where is Niles now?",Lwhere_1;
-
- Lwhere_1:
- mes "[Reid]";
- mes "He's on the north side of the village.";
- next;
- mes "[Heath]";
- mes "I hope this information was worth";
- mes "it.";
- next;
- mes "[Reid and Heath]";
- mes "It was certainly worth it to us!";
- mes "Heh heh heh!";
- close;
-
- Lzeny_no:
- mes "[Reid]";
- mes "Hey! Come back when you're not dirt";
- mes "poor! Gotta spend money to make money, right?";
- close;
-
- Lzeny_2:
- donpcevent "Reid::On_Emotion20";
- emotion e_hmm;
- mes "[Heath]";
- mes "Whaaaaat?! I swear that our marks";
- mes "aren't as gullible as they used to be.";
- mes "How are we supposed to make an honest zeny?!";
- close;
-}
-
-//========================================================
-cmd_in01.gat,175,120,3 script Iria 69,{
- mes "[Iria]";
- mes "That guy over at the far table";
- mes "in the corner is the adventurer";
- mes "Niles. He seems to have a wealth";
- mes "of stories about his many adventures.";
- next;
- mes "[Iria]";
- mes "He's always so boisterous, saying things";
- mes "like 'Will your journey lead you to fame,";
- mes "or to certain death?!'";
- next;
- mes "[Iria]";
- mes "Nevertheless, anyone who talks to Niles";
- mes "for any length of time seems to be invariably";
- mes "inspired by his passion.";
- close;
-}
-
-//========================================================
-cmd_in01.gat,164,115,1 script Niles 731,{
- mes "[Niles]";
- mes "Oh?";
- mes "Another fool come to ask about";
- mes "that idiotic rumour circulating";
- mes "around town?";
- next;
- mes "[Niles]";
- mes "The story about me finding a great";
- mes "treasure is a big misunderstanding.";
- mes "In reality, it's just my collection";
- mes "of modest finds.";
- next;
- mes "[Niles]";
- mes "That said, I think I have a lead";
- mes "on a potentially lucrative ";
- mes "item just waiting to be found.";
- next;
- mes "[Niles]";
- mes "Don't you think that cave";
- mes "near Comodo village is interesting?";
- next;
- mes "[Niles]";
- mes "I think a large jewel may be";
- mes "hidden within its confines.";
- next;
- mes "[Niles]";
- mes "Until recently, we didn't know how to";
- mes "reach the cave.";
- next;
- mes "[Niles]";
- mes ".............";
- next;
- mes "[Niles]";
- mes ".......Hm?";
- next;
- mes "[Niles]";
- mes "Is your mind set on going there?!";
- mes "Can you imagine what you'll find?!";
- next;
- mes "[Niles]";
- mes "Doesn't just talking about it make";
- mes "you want to go on an adventure?!!!";
- next;
- mes "[Niles]";
- mes "Just break down any barrier in your";
- mes "path and trust your primal instincts";
- mes "to guide you to your goal!";
- next;
- mes "[Niles]";
- mes "Go! Quickly!";
- next;
- mes "[Niles]";
- mes "Will you find the path to fame on";
- mes "your journey, or the path to certain";
- mes "death?! Hahahaha!!!!";
- close;
-}
-
-
-//==================================================================
-// Umbala NPCs and Quests
-//==================================================================
-
-//==================================================================
-//Trade money for meat
-umbala.gat,70,106,3 script Utan Child#1 781,{
-if(event_umbala < 3) goto LumWord;
- mes "[???]";
- mes "Hello! I'm a member of";
- mes "the Utan tribe.";
- next;
- mes "[???]";
- mes "My name is Hatan! Nice to";
- mes "meet you.";
- emotion e_heh;
- next;
- mes "[Hatan]";
- mes "...I can't play now, because";
- mes "a recent thunderstorm caused";
- mes "the roof of our house to become";
- mes "cracked...";
- emotion e_sob;
- next;
- mes "[Hatan]";
- mes "...!";
- next;
- mes "[Hatan]";
- mes "Hey! You guys seem pretty well";
- mes "off. Do you think you could";
- mes "give us a little zeny";
- mes "so we can fix the crack?";
- mes "Please!";
- emotion e_sob;
- next;
- menu "Nod",-,"Shake Head",Lend2;
-
- if(Zeny < 1000) goto LError2;
- mes "[Hatan]";
- mes "Yay!!";
- mes "You're the best!!";
- set Zeny,Zeny-1000;
- getitem 517,1;//Items: Meat,
- emotion e_swt2;
- next;
- mes "[Hatan]";
- mes "Please take this as a token of my gratitude.";
- emotion e_heh;
- close;
-
- LError2:
- mes "[Hatan]";
- mes "Well, maybe I underestimated your";
- mes "wealth, but you shouldn't lie...";
- emotion e_pif;
- close;
- Lend2:
- mes "[Hatan]";
- mes "...Awwwww.";
- emotion e_sob;
- close;
-
-LumWord:
- mes "[???]";
- mes "Umba!";
- mes "Umbaluwababawamuba.";
- next;
- mes "[???]";
- mes "Umba! Umbaumba!";
- mes "Umbabama Hatan baba.";
- emotion e_heh;
- next;
- mes "[Hatan]";
- mes "...Umba, Umbaumbaumba.";
- mes "Umbaumbaumbababa.";
- mes "Umbabawaumbaumbaba.";
- mes "Umbaumba.";
- mes "...Umbaumbamabababumba.";
- emotion e_sob;
- next;
- mes "[Hatan]";
- mes "...!";
- next;
- mes "[Hatan]";
- mes "Umba!";
- mes "Umbaumbaumbababa.";
- mes "Umbababaumbawabaumba!";
- mes "Umbaumbaumbababa.";
- mes "wamfuba! Umba!";
- emotion e_sob;
- next;
- menu "Nod",-,"Shake Head",Lend;
-
- if(Zeny < 1000) goto LError;
- mes "[Hatan]";
- mes "Umbaumba!!";
- mes "Um!-babaumba-baumba-.";
- mes "Umba-umba-Umbabawamamaba!";
- set Zeny,Zeny-1000;
- getitem 517,1;//Items: Meat,
- emotion e_swt2;
- next;
- mes "[Hatan]";
- mes "Umbaumba....";
- emotion e_heh;
- close;
-
- LError:
- mes "[Hatan]";
- mes "Umba-Umbana!";
- emotion e_pif;
- close;
- Lend:
- mes "[Hatan]";
- mes "....Umba....";
- emotion e_sob;
- close;
-}
-
-//==================================================================
-//Trade Meat for Clover, ???, and Soft Fur
-umbala.gat,59,243,5 script Utan Child#4 787,{
-if(event_umbala < 3) goto LumWord;
- mes "[Kotan]";
- mes ".....";
- mes ".....";
- mes "...I want meat.";
- mes "...Gimme meat!";
- next;
- menu "Sure",-,"No way!",L2;
- if(countitem(517) < 1) goto LError;//Items: Meat,
- delitem 517,1;//Items: Meat,
- mes "[Kotan]";
- mes "Hey, thanks!";
- mes "Take these!";
- emotion e_scissors;
- getitem 909,2;//Items: Jellopy,
- getitem 914,2;//Items: Fluff,
- getitem 705,2;//Items: Clover,
- close;
- L2:
- mes "[Kotan]";
- mes "......";
- mes "...I'm hungry!";
- mes "...Gimme meat!";
- emotion e_sob;
- close;
-LError:
- mes "[Kotan]";
- mes "Hey! You said you have";
- mes "meat! So you were lying?";
- mes "I hate you!";
- emotion e_an;
- close;
-LumWord:
- mes "[???]";
- mes "....";
- mes "....";
- mes "...Umbaba!";
- mes "...Famba!";
- emotion e_rock;
- next;
- menu "Umba",-,"Umbabu",Lu2;
- if(countitem(517) < 1) goto LuError;//Items: Meat,
- delitem 517,1;//Items: Meat,
- mes "[???]";
- mes "Umbaumbaumbababa.";
- mes "Umbababauma.";
- emotion e_scissors;
- getitem 909,2;//Items: Jellopy,
- getitem 914,2;//Items: Fluff,
- getitem 705,2;//Items: Clover,
- close;
- Lu2:
- mes "[???]";
- mes "....";
- mes "......Unguba!";
- mes "....Umbababa.";
- emotion e_sob;
- close;
-LuError:
- mes "[???]";
- mes "Umbawamufumabababa!";
- mes "Umbabababaumbaumbu!";
- emotion e_an;
- close;
-}
-
-
-//=====================================================================
-umbala.gat,177,153,3 script Bast 97,{
- if (event_umbala>=3) emotion e_gasp;
- mes "[Bast]";
- mes "Oh! Another outsider. It's";
- mes "great to encounter another one";
- mes "in this village! My name is";
- mes "Bast.";
- next;
- mes "[Bast]";
- mes "Because Umbala village is isolated";
- mes "within a deep forest, its culture";
- mes "is unaffected by the steady pull";
- mes "of progress.";
- next;
- mes "[Bast]";
- mes "Not only that, but the natives' skin colour";
- mes "and language are also different.";
- mes "Aren't you confused by their";
- mes "alien gestures and expressions?";
- next;
- mes "[Bast]";
- mes "Even the things you would expect";
- mes "to transcend culture have a";
- mes "different meaning in Umbala.";
- next;
- mes "[Bast]";
- mes "Just because a tribeman's face laughs";
- mes "doesn't necessarily mean his";
- mes "heart is laughing. Understand?";
- next;
- emotion e_sob;
- mes "[Bast]";
- mes "Because of that, people in the village";
- mes "who know our language may have trouble!!";
- close;
-}
-
-//=====================================================================
-umbala.gat,80,146,4 script Yuki 753,{
- mes "[Yuki]";
- mes "Umbaubaugau...Oh!";
- mes "You're from abroad? That's";
- mes "wonderful! I didn't think that";
- mes "I would meet someone else from abroad.";
- mes "Hahaha.";
- next;
- mes "[Yuki]";
- mes "I came here looking for strong";
- mes "companions, but I was unable";
- mes "to understand the language.";
- mes "I had to listen to the language being spoken";
- mes "for some time before I picked it up.";
- mes "Hahaha.";
- next;
- mes "[Yuki]";
- mes "The people here seem to want to";
- mes "preserve their native culture while";
- mes "eschewing the trappings of modern life.";
- mes "The tribesmen are really prone to";
- mes "mischief-making.";
- next;
- mes "[Yuki]";
- mes "The primitive atmosphere here is really";
- mes "refreshing. Tribal law is very lax and";
- mes "doesn't intrude upon one's enjoyment of";
- mes "the village. It's really wonderful.";
- close;
-}
-
-//=====================================================================
-um_in.gat,101,73,3 script Yunatan 783,{
- if(event_umbala < 3) goto LumWord;
- mes "[Yunatan]";
- mes "I'm standing out here because I";
- mes "can't stand to lay eyes on";
- mes "that lecher Wambokoriotan.";
- mes "I hate his guts!";
- close;
-LumWord:
- mes "[Yunatan]";
- mes "Umbaba! Umbaumbaugaga";
- mes "Ugugumubaugaumuumu.";
- mes "Umbabababababababa.";
- close;
-}
-
-//=====================================================================
-um_in.gat,94,123,5 script Bartsutan 783,{
- if(event_umbala < 3) goto LumWord;
- mes "[Bartsutan]";
- mes "I want to see Wambokoriotan";
- mes "morph into an insect so I can";
- mes "have the satisfaction of crushing";
- mes "his skull! I hate him and his";
- mes "advances! I wish he would just stay";
- mes "away from me.";
- close;
-LumWord:
- mes "[Bartsutan]";
- mes "Umbarugumbarumbauma!";
- mes "Umuguugumubarumba.";
- mes "Umba...uumu.";
- close;
-}
-
-//=====================================================================
-umbala.gat,140,157,6 script Utan Tribe Young Adult::UtanTribeYougAdult1 785,{
- if(event_umbala < 3) goto LumWord;
- mes "[Seirutan]";
- mes "Bungy jumping is extremely dangerous.";
- mes "As such, completing a successful";
- mes "jump is a prerequisite for recognition";
- mes "as an adult in the Utan tribe.";
- close;
-LumWord:
- mes "[?????]";
- mes "Umbaumbafumba.";
- mes "Uwambaunbaumbabaufumba";
- mes "Umbababaumbaumba.";
- close;
-}
-
-//=====================================================================
-umbala.gat,146,157,4 script Utan Young Adult#2 786,{
- if(event_umbala < 3) goto LumWord;
- mes "[Arotan]";
- mes "Making a safe bungy jump is a";
- mes "really big deal. When someone makes";
- mes "their first jump safely, many people";
- mes "gather for a large feast.";
- close;
-LumWord:
- mes "[????]";
- mes "Umbaumbaumbabaumbaba.";
- mes "Umbaumbabaumbababaumufumuba.";
- close;
-}
-
-//=====================================================================
-umbala.gat,149,165,4 script Utan Young Adult#3 781,{
- if(event_umbala < 3) goto LumWord;
- mes "[Kryubatan]";
- mes "I'm really afraid of heights,";
- mes "so I really don't want to jump,";
- mes "but I must in order to be";
- mes "recognized as a courageous";
- mes "member of the Utan tribe.";
- close;
-LumWord:
- mes "[??????]";
- mes "Umbaumbaumbababa.";
- mes "Umbaumbaumumbabaumfumuba.";
- mes "Umbaumbaumumubafumba.";
- close;
-}
-
-//=====================================================================
-umbala.gat,92,159,4 script Hartan 785,{
- if(event_umbala < 3) goto LumWord;
- mes "[Hartan]";
- mes "You want to know why our";
- mes "skin is jet-black?";
- mes "......";
- next;
- mes "[Hartan]";
- mes "Well...";
- mes "Every night before we sleep,";
- mes "we eat lots of chocolate!";
- next;
- mes "[Hartan]";
- mes "Mmmmmmm...Chocolate...";
- close;
-LumWord:
- mes "[????]";
- mes "Umbaumbaumba";
- mes "Umbaumbaumba";
- mes "Umbaumbaumba";
- next;
- mes "[????]";
- mes "Umbaumbabaungaha.";
- emotion e_sob;
- close;
-}
-
-//=====================================================================
-umbala.gat,194,104,4 script Utan Tribe Child#2 787,{
- if(event_umbala < 3) goto LumWord;
- mes "[Burkatan]";
- mes "An outsider?";
- mes "Are you here to try bungy jumping?";
- next;
- menu "You got it",-,"Well....",L2;
- mes "[Burkatan]";
- mes "What courage!";
- mes "The Utan tribe welcomes those";
- mes "with courageous hearts.";
- close;
- L2:
- mes "[Burkatan]";
- mes "The adults don't want me to even";
- mes "get close to the bungy jumping area.";
- mes "In this tribe, bungy jumping is a rite";
- mes "of passage. If I can show them that";
- mes "I'm big enough to brave bungy jumping,";
- mes "they'll have to recognize me as an adult!";
- close;
-LumWord:
- mes "[???]";
- mes "Umbaumbababaumfumuba.";
- mes "Umbababaumbabaumbaumba.";
- next;
- menu "Um...yes?",-,"Nope...",Lu2;
- mes "[???]";
- mes "Umbaumbaumbababa.";
- mes "Umbaumbaumubaba.";
- close;
- Lu2:
- mes "[???]";
- mes "Umbaumbaumuam.";
- mes "Umbaumbaumbaba.";
- mes "Umbaumfumababaumu.";
- close;
-}
-
-//=====================================================================
-umbala.gat,193,208,6 script Utan Child#3 789,{
- if(event_umbala < 3) goto LumWord;
- mes "[Fuitan]";
- mes "When I was younger, I went bungy";
- mes "jumping even though it was extremely";
- mes "dangerous. I did it, though, and my";
- mes "chest swelled with a feeling of achievement.";
- mes "The tradition encourages rash behavior, but";
- mes "boys will be boys, don't you think?";
- close;
-LumWord:
- mes "[????]";
- mes "Umbaumbababa.";
- mes "Umbamubafumabaumumbabamua";
- mes "Umumbababaumbafuma.";
- close;
-}
-
-//=====================================================================
-umbala.gat,139,205,4 script Utan Tribe Young Adult::UtanTribeYougAdult5 785,{
- if(event_umbala < 3) goto LumWord;
- mes "[Tsunitan]";
- mes "Awesome! I haven't seen an outsider in some time.";
- mes "You're just in time to watch as";
- mes "youth from all over the village bungy";
- mes "jump to prove their courage!";
- next;
- mes "[Tsunitan]";
- mes "After you jump, you can use the";
- mes "cord to climb. Also, if you search";
- mes "underwater, you might be able to find";
- mes "a submerged cave. Of course, there have";
- mes "been unlucky souls who have died...";
- next;
- mes "[Tsunitan]";
- mes "You may also feel sick";
- mes "as the bottom draws near, because";
- mes "the ominous shapes of aquatic monsters";
- mes "drift slowly under the surface.";
- mes "If you linger underwater, you might die...";
- close;
-LumWord:
- mes "[????]";
- mes "Umbaumba!";
- mes "Umbaumbabababaumumba.";
- mes "Babaum Utan Umbaumbaba";
- mes "Umbababafumu.";
- mes "Umfumubabaumbaumbaumbaba.";
- next;
- mes "[????]";
- mes "Umbafumumababaumba.";
- mes "Umbabatanumbaumba.";
- mes "Umumu. Umbaumbaumbaum.";
- mes "Umbabaumbaumbaumubaamum.";
- mes "Umbaumbaumbafumu.";
- close;
-}
-
-//=====================================================================
-um_in.gat,158,71,3 script Utan Tribesman 787,{
- if(event_umbala < 3) goto LumWord;
- mes "[Mutakutan]";
- mes "Umbala has enough interesting trees";
- mes "that studying them never gets old!";
- next;
- mes "[Mutakutan]";
- mes "My favourite tree near Umbala is huge!";
- mes "It stretches into the sky as far";
- mes "as the eye can see!";
- mes "It's supposed to be the tallest tree in the world!";
- emotion e_ok;
- next;
- mes "[Mutakutan]";
- mes "It's so old and large that";
- mes "the top can't even be seen!";
- next;
- mes "[Mutakutan]";
- mes "Even after climbing the tree";
- mes "to quite a height, the top was not";
- mes "in sight. I consider myself";
- mes "a tree-climbing expert, so this";
- mes "was quite distressing.";
- next;
- mes "[Mutakutan]";
- mes "That said, the fruit I was able";
- mes "to pick off of some of the higher";
- mes "branches is yummy!";
- emotion e_no1;
- next;
- mes "[Mutakutan]";
- mes "It has a slightly sour taste. Eating";
- mes "it makes me feel all tingly inside!!";
- emotion e_no1;
- next;
- mes "[Mutakutan]";
- mes "At the same time, a terrible illness";
- mes "was ravaging Umbala village.";
- next;
- mes "[Mutakutan]";
- mes "The elder's health was declining";
- mes "and he was in danger of dying, but";
- mes "when I gave him a piece of that";
- mes "fruit, his health improved";
- mes "dramatically in a short time. Surely";
- mes "this fruit was a gift from the forest!";
- emotion e_sob;
- next;
- mes "[Mutakutan]";
- mes "The tree is north of the village. Why";
- mes "not visit it if you're over that way?";
- close;
-LumWord:
- mes "[????]";
- mes "Umbaumbaumbabaumba!";
- mes "Umbaumbaumbababaumba";
- mes "Umbaumbaumba";
- mes "Umbabaumbaumbaba.";
- close;
-}
-
-//=====================================================================
-umbala.gat,145,217,3 script Chibibatan 783,{
- if(event_umbala < 3) goto LumWord;
- mes "[Chibibatan]";
- mes "I want to have some fun with";
- mes "Wambokoriotan, but after seeing";
- mes "how his wife can be, I don't know if";
- mes "I want to end up being on her bad side.";
- close;
-LumWord:
- mes "[Chibibatan]";
- mes "Umbaba.";
- mes "Ugaugumbarumbaruuuu!";
- mes "Ugugauwubaruguagumbagua.";
- close;
-}
-
-//=====================================================================
-um_in.gat,139,48,5 script Purenotan 783,{
- if(event_umbala < 3) goto LumWord;
- mes "[Purenotan]";
- mes "See that loser over there?";
- mes "I'm on to him. He hasn't";
- mes "exactly made a secret of his desire";
- mes "to have an affair or three.";
- mes "He needs to be smacked in the nuts, HARD.";
- close;
-LumWord:
- mes "[Purenotan]";
- mes "Umbaumbaugaga!";
- mes "Umbaumbabababa!";
- mes "Umbaumba!";
- emotion e_an;
- next;
- mes "[Purenotan]";
- mes "Umbaumabaumbaumbaba!";
- mes "Umbababababaugau!";
- mes "Uguugaumbabaumbagumba!";
- emotion e_oh;
- next;
- emotion e_go;
- close;
-On_emo:
-emotion e_an;
-end;
-}
-
-//=====================================================================
-um_in.gat,144,45,5 script Wambokoriotan 789,{
- if(event_umbala < 3) goto LumWord;
- mes "[Wambokoriotan]";
- mes "Ahhh...My wife is a real";
- mes "hothead. Ouch...ouch.";
- next;
- mes "[Wambokoriotan]";
- mes "Yunatan, Bartsutan, Chibibatan...";
- mes "I want Umbala's babes as much";
- mes "as they want me...Ouch...ouch!";
- close;
-LumWord:
- mes "[Wambokoriotan]";
- mes "Umbaumbaba.....";
- mes "Umbaugua!";
- mes "Umbagumumbabagumbagaga!";
- emotion e_heh;
- next;
- donpcevent "Purenotan::On_emo";
- close;
-}
-
-//==============================================================================
-//Bungee jumping!
-//==============================================================================
-umbala.gat,140,197,0 script #Shibonochikka 139,0,1,{
- set @jumprand,rand(0,4);
- if (@jumprand == 1) goto L1;
- if (@jumprand == 2) goto L2;
- if (@jumprand == 3) goto L3;
- if (@jumprand == 4) goto L4;
- mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Iyahaaaaahh!",8;
- end;
-
-L1:
-//Dead
- mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Ukiyaaaaaaaaaa!",8;
- percentheal -100,0;
- end;
-
-L2:
-//HP50% Damage
- mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Kyaaaaaaaaaaa!",8;
- percentheal -50,0;
- end;
-
-L3:
-//HP99% Damage
- mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Waaaaaaaaaah!",8;
- percentheal -99,0;
- end;
-
-L4:
-//1 HP left, warp to Niflheim
- mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : No-o!",8;
- heal -HP+1,0;
- warp "nif_in.gat",69,15;
- end;
-}
-
-//=====================================================================
-umbala.gat,136,195,0 script #Warp Point 139,1,1,{
- warp "umbala.gat",145,166;
- end;
-}
+//===== eAthena script =======================================
+//= Umbala Town script
+//===== By: ==================================================
+//= jAthena (1.0) Fusion Dev Team (1.1) Muad Dib (1.2) Darkchild (1.3)
+//===== Current Version: =====================================
+//= 1.9
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Episode XX
+//===== Description: =========================================
+//= Umbala Town Npcs
+//==================================================
+//===== Additional Comments: =================================
+//= 1.0 - Done By jAthena (dunno Who)
+//= 1.1 - Translated by Fusion Dev Team
+//= 1.2 - Fixed Something by Muad Dib
+//= 1.3 - Fixed up For eA by Darkchild
+//= 1.4 - Fixed some wrong item names [Lupus]
+//= 1.5 – Spell Checked [massdriller]
+//= 1.6 - Fixed item names, added a chance to get to Niflheim via Jumping Bungy Area [Lupus]
+//= 1.7 - Fixed bugs and exploits [Lupus]
+//= 1.8 - Warps you to Niff with 1HP [Lance]
+//= 1.9 - Moved Umbala Event, Create Essence/Dismantle Stone, and Skeletal Gate to npc/quests/quests_umbala.txt [Evera]
+//= 2.0 - Removed duplicates, max NPC name length is 23, so Utan Tribe Young Adult#1, the 1 is skipped [Toms]
+//============================================================
+
+
+//========================================================
+// == NPCs on the road to Umbala ==
+//========================================================
+//Note that On_Emotion is NOT an npc command but just an trigger for DoNpcEvent!!
+comodo.gat,170,137,7 script Reid 84,{
+ close;
+On_Emotion20:
+ emotion e_hmm;
+ end;
+On_Emotion29:
+ emotion e_gg;
+ end;
+}
+
+//========================================================
+comodo.gat,171,137,1 script Heath 92,{
+ mes "[Reid]";
+ mes "There's a huuuuuuuge treasure hidden";
+ mes "somewhere around here!";
+ next;
+ mes "[Heath]";
+ mes "If only we could get our hands on it,";
+ mes "the people who call us the 'Dunce Duo'";
+ mes "will certainly have to eat their words!!";
+ next;
+ mes "[Reid]";
+ mes "We'll keep looking as long as it takes!";
+ next;
+ donpcevent "Reid::On_Emotion29";
+ emotion e_gg;
+ mes "[Heath]";
+ mes "Hey, Reid, come on!";
+ next;
+ mes "[Reid]";
+ mes "............";
+ next;
+ donpcevent "Reid::On_Emotion29";
+ emotion e_hmm;
+ mes "[Reid]";
+ mes "Okay, okay...I'm coming.";
+ next;
+ menu "Hey, wait! Treasure?",Lwhat_1;
+
+ Lwhat_1:
+ mes "[Reid]";
+ mes "You mean you've never heard of it?!";
+ next;
+ emotion e_gg;
+ mes "[Heath]";
+ mes "Oh, you want to hear the story of the";
+ mes "treasure, huh? Well, how important";
+ mes "is it to you, really?";
+ next;
+ mes "[Reid and Heath]";
+ donpcevent "Reid::On_Emotion29";
+ emotion e_gg;
+ mes "Important enough for you to";
+ mes "cough up 1000 zeny?!";
+ next;
+ menu "Alright. I'll be a sucker today",Lzeny_1,"Dream on, Dunce Duo!",Lzeny_2;
+
+ Lzeny_1:
+ if(Zeny < 1000) goto Lzeny_no;
+ set Zeny,Zeny-1000;
+ mes "[Heath]";
+ mes "Alright, my 'friend'. listen up.";
+ next;
+ mes "[Reid]";
+ mes "A famous adventurer named Niles";
+ mes "returned to this village from his";
+ mes "adventures abroad.";
+ mes "He was dragging...";
+ next;
+ mes "[Heath]";
+ mes "...(Whisperwhisperwhisper)";
+ mes "a really big box along behind him!!";
+ next;
+ mes "[Reid]";
+ mes "He returned during the dead of night,";
+ mes "hoping no one would see his cargo.";
+ next;
+ mes "[Heath]";
+ mes "There has to be something";
+ mes "valuable in that box!";
+ mes "There's no other explanation!";
+ next;
+ mes "[Reid]";
+ mes "I'm on a search for that box!";
+ mes "I'm going to find it!";
+ next;
+ emotion e_hmm;
+ mes "[Heath]";
+ mes "There's just one problem.";
+ mes "We don't have the slightest";
+ mes "idea where Niles put the treasure.";
+ next;
+ mes "[Reid]";
+ mes "Niles is making us look foolish!";
+ next;
+ menu "Where is Niles now?",Lwhere_1;
+
+ Lwhere_1:
+ mes "[Reid]";
+ mes "He's on the north side of the village.";
+ next;
+ mes "[Heath]";
+ mes "I hope this information was worth";
+ mes "it.";
+ next;
+ mes "[Reid and Heath]";
+ mes "It was certainly worth it to us!";
+ mes "Heh heh heh!";
+ close;
+
+ Lzeny_no:
+ mes "[Reid]";
+ mes "Hey! Come back when you're not dirt";
+ mes "poor! Gotta spend money to make money, right?";
+ close;
+
+ Lzeny_2:
+ donpcevent "Reid::On_Emotion20";
+ emotion e_hmm;
+ mes "[Heath]";
+ mes "Whaaaaat?! I swear that our marks";
+ mes "aren't as gullible as they used to be.";
+ mes "How are we supposed to make an honest zeny?!";
+ close;
+}
+
+//========================================================
+cmd_in01.gat,175,120,3 script Iria 69,{
+ mes "[Iria]";
+ mes "That guy over at the far table";
+ mes "in the corner is the adventurer";
+ mes "Niles. He seems to have a wealth";
+ mes "of stories about his many adventures.";
+ next;
+ mes "[Iria]";
+ mes "He's always so boisterous, saying things";
+ mes "like 'Will your journey lead you to fame,";
+ mes "or to certain death?!'";
+ next;
+ mes "[Iria]";
+ mes "Nevertheless, anyone who talks to Niles";
+ mes "for any length of time seems to be invariably";
+ mes "inspired by his passion.";
+ close;
+}
+
+//========================================================
+cmd_in01.gat,164,115,1 script Niles 731,{
+ mes "[Niles]";
+ mes "Oh?";
+ mes "Another fool come to ask about";
+ mes "that idiotic rumour circulating";
+ mes "around town?";
+ next;
+ mes "[Niles]";
+ mes "The story about me finding a great";
+ mes "treasure is a big misunderstanding.";
+ mes "In reality, it's just my collection";
+ mes "of modest finds.";
+ next;
+ mes "[Niles]";
+ mes "That said, I think I have a lead";
+ mes "on a potentially lucrative ";
+ mes "item just waiting to be found.";
+ next;
+ mes "[Niles]";
+ mes "Don't you think that cave";
+ mes "near Comodo village is interesting?";
+ next;
+ mes "[Niles]";
+ mes "I think a large jewel may be";
+ mes "hidden within its confines.";
+ next;
+ mes "[Niles]";
+ mes "Until recently, we didn't know how to";
+ mes "reach the cave.";
+ next;
+ mes "[Niles]";
+ mes ".............";
+ next;
+ mes "[Niles]";
+ mes ".......Hm?";
+ next;
+ mes "[Niles]";
+ mes "Is your mind set on going there?!";
+ mes "Can you imagine what you'll find?!";
+ next;
+ mes "[Niles]";
+ mes "Doesn't just talking about it make";
+ mes "you want to go on an adventure?!!!";
+ next;
+ mes "[Niles]";
+ mes "Just break down any barrier in your";
+ mes "path and trust your primal instincts";
+ mes "to guide you to your goal!";
+ next;
+ mes "[Niles]";
+ mes "Go! Quickly!";
+ next;
+ mes "[Niles]";
+ mes "Will you find the path to fame on";
+ mes "your journey, or the path to certain";
+ mes "death?! Hahahaha!!!!";
+ close;
+}
+
+
+//==================================================================
+// Umbala NPCs and Quests
+//==================================================================
+
+//==================================================================
+//Trade money for meat
+umbala.gat,70,106,3 script Utan Child#1 781,{
+if(event_umbala < 3) goto LumWord;
+ mes "[???]";
+ mes "Hello! I'm a member of";
+ mes "the Utan tribe.";
+ next;
+ mes "[???]";
+ mes "My name is Hatan! Nice to";
+ mes "meet you.";
+ emotion e_heh;
+ next;
+ mes "[Hatan]";
+ mes "...I can't play now, because";
+ mes "a recent thunderstorm caused";
+ mes "the roof of our house to become";
+ mes "cracked...";
+ emotion e_sob;
+ next;
+ mes "[Hatan]";
+ mes "...!";
+ next;
+ mes "[Hatan]";
+ mes "Hey! You guys seem pretty well";
+ mes "off. Do you think you could";
+ mes "give us a little zeny";
+ mes "so we can fix the crack?";
+ mes "Please!";
+ emotion e_sob;
+ next;
+ menu "Nod",-,"Shake Head",Lend2;
+
+ if(Zeny < 1000) goto LError2;
+ mes "[Hatan]";
+ mes "Yay!!";
+ mes "You're the best!!";
+ set Zeny,Zeny-1000;
+ getitem 517,1;//Items: Meat,
+ emotion e_swt2;
+ next;
+ mes "[Hatan]";
+ mes "Please take this as a token of my gratitude.";
+ emotion e_heh;
+ close;
+
+ LError2:
+ mes "[Hatan]";
+ mes "Well, maybe I underestimated your";
+ mes "wealth, but you shouldn't lie...";
+ emotion e_pif;
+ close;
+ Lend2:
+ mes "[Hatan]";
+ mes "...Awwwww.";
+ emotion e_sob;
+ close;
+
+LumWord:
+ mes "[???]";
+ mes "Umba!";
+ mes "Umbaluwababawamuba.";
+ next;
+ mes "[???]";
+ mes "Umba! Umbaumba!";
+ mes "Umbabama Hatan baba.";
+ emotion e_heh;
+ next;
+ mes "[Hatan]";
+ mes "...Umba, Umbaumbaumba.";
+ mes "Umbaumbaumbababa.";
+ mes "Umbabawaumbaumbaba.";
+ mes "Umbaumba.";
+ mes "...Umbaumbamabababumba.";
+ emotion e_sob;
+ next;
+ mes "[Hatan]";
+ mes "...!";
+ next;
+ mes "[Hatan]";
+ mes "Umba!";
+ mes "Umbaumbaumbababa.";
+ mes "Umbababaumbawabaumba!";
+ mes "Umbaumbaumbababa.";
+ mes "wamfuba! Umba!";
+ emotion e_sob;
+ next;
+ menu "Nod",-,"Shake Head",Lend;
+
+ if(Zeny < 1000) goto LError;
+ mes "[Hatan]";
+ mes "Umbaumba!!";
+ mes "Um!-babaumba-baumba-.";
+ mes "Umba-umba-Umbabawamamaba!";
+ set Zeny,Zeny-1000;
+ getitem 517,1;//Items: Meat,
+ emotion e_swt2;
+ next;
+ mes "[Hatan]";
+ mes "Umbaumba....";
+ emotion e_heh;
+ close;
+
+ LError:
+ mes "[Hatan]";
+ mes "Umba-Umbana!";
+ emotion e_pif;
+ close;
+ Lend:
+ mes "[Hatan]";
+ mes "....Umba....";
+ emotion e_sob;
+ close;
+}
+
+//==================================================================
+//Trade Meat for Clover, ???, and Soft Fur
+umbala.gat,59,243,5 script Utan Child#4 787,{
+if(event_umbala < 3) goto LumWord;
+ mes "[Kotan]";
+ mes ".....";
+ mes ".....";
+ mes "...I want meat.";
+ mes "...Gimme meat!";
+ next;
+ menu "Sure",-,"No way!",L2;
+ if(countitem(517) < 1) goto LError;//Items: Meat,
+ delitem 517,1;//Items: Meat,
+ mes "[Kotan]";
+ mes "Hey, thanks!";
+ mes "Take these!";
+ emotion e_scissors;
+ getitem 909,2;//Items: Jellopy,
+ getitem 914,2;//Items: Fluff,
+ getitem 705,2;//Items: Clover,
+ close;
+ L2:
+ mes "[Kotan]";
+ mes "......";
+ mes "...I'm hungry!";
+ mes "...Gimme meat!";
+ emotion e_sob;
+ close;
+LError:
+ mes "[Kotan]";
+ mes "Hey! You said you have";
+ mes "meat! So you were lying?";
+ mes "I hate you!";
+ emotion e_an;
+ close;
+LumWord:
+ mes "[???]";
+ mes "....";
+ mes "....";
+ mes "...Umbaba!";
+ mes "...Famba!";
+ emotion e_rock;
+ next;
+ menu "Umba",-,"Umbabu",Lu2;
+ if(countitem(517) < 1) goto LuError;//Items: Meat,
+ delitem 517,1;//Items: Meat,
+ mes "[???]";
+ mes "Umbaumbaumbababa.";
+ mes "Umbababauma.";
+ emotion e_scissors;
+ getitem 909,2;//Items: Jellopy,
+ getitem 914,2;//Items: Fluff,
+ getitem 705,2;//Items: Clover,
+ close;
+ Lu2:
+ mes "[???]";
+ mes "....";
+ mes "......Unguba!";
+ mes "....Umbababa.";
+ emotion e_sob;
+ close;
+LuError:
+ mes "[???]";
+ mes "Umbawamufumabababa!";
+ mes "Umbabababaumbaumbu!";
+ emotion e_an;
+ close;
+}
+
+
+//=====================================================================
+umbala.gat,177,153,3 script Bast 97,{
+ if (event_umbala>=3) emotion e_gasp;
+ mes "[Bast]";
+ mes "Oh! Another outsider. It's";
+ mes "great to encounter another one";
+ mes "in this village! My name is";
+ mes "Bast.";
+ next;
+ mes "[Bast]";
+ mes "Because Umbala village is isolated";
+ mes "within a deep forest, its culture";
+ mes "is unaffected by the steady pull";
+ mes "of progress.";
+ next;
+ mes "[Bast]";
+ mes "Not only that, but the natives' skin colour";
+ mes "and language are also different.";
+ mes "Aren't you confused by their";
+ mes "alien gestures and expressions?";
+ next;
+ mes "[Bast]";
+ mes "Even the things you would expect";
+ mes "to transcend culture have a";
+ mes "different meaning in Umbala.";
+ next;
+ mes "[Bast]";
+ mes "Just because a tribeman's face laughs";
+ mes "doesn't necessarily mean his";
+ mes "heart is laughing. Understand?";
+ next;
+ emotion e_sob;
+ mes "[Bast]";
+ mes "Because of that, people in the village";
+ mes "who know our language may have trouble!!";
+ close;
+}
+
+//=====================================================================
+umbala.gat,80,146,4 script Yuki 753,{
+ mes "[Yuki]";
+ mes "Umbaubaugau...Oh!";
+ mes "You're from abroad? That's";
+ mes "wonderful! I didn't think that";
+ mes "I would meet someone else from abroad.";
+ mes "Hahaha.";
+ next;
+ mes "[Yuki]";
+ mes "I came here looking for strong";
+ mes "companions, but I was unable";
+ mes "to understand the language.";
+ mes "I had to listen to the language being spoken";
+ mes "for some time before I picked it up.";
+ mes "Hahaha.";
+ next;
+ mes "[Yuki]";
+ mes "The people here seem to want to";
+ mes "preserve their native culture while";
+ mes "eschewing the trappings of modern life.";
+ mes "The tribesmen are really prone to";
+ mes "mischief-making.";
+ next;
+ mes "[Yuki]";
+ mes "The primitive atmosphere here is really";
+ mes "refreshing. Tribal law is very lax and";
+ mes "doesn't intrude upon one's enjoyment of";
+ mes "the village. It's really wonderful.";
+ close;
+}
+
+//=====================================================================
+um_in.gat,101,73,3 script Yunatan 783,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Yunatan]";
+ mes "I'm standing out here because I";
+ mes "can't stand to lay eyes on";
+ mes "that lecher Wambokoriotan.";
+ mes "I hate his guts!";
+ close;
+LumWord:
+ mes "[Yunatan]";
+ mes "Umbaba! Umbaumbaugaga";
+ mes "Ugugumubaugaumuumu.";
+ mes "Umbabababababababa.";
+ close;
+}
+
+//=====================================================================
+um_in.gat,94,123,5 script Bartsutan 783,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Bartsutan]";
+ mes "I want to see Wambokoriotan";
+ mes "morph into an insect so I can";
+ mes "have the satisfaction of crushing";
+ mes "his skull! I hate him and his";
+ mes "advances! I wish he would just stay";
+ mes "away from me.";
+ close;
+LumWord:
+ mes "[Bartsutan]";
+ mes "Umbarugumbarumbauma!";
+ mes "Umuguugumubarumba.";
+ mes "Umba...uumu.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,140,157,6 script Utan Tribe Young Adult::UtanTribeYougAdult1 785,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Seirutan]";
+ mes "Bungy jumping is extremely dangerous.";
+ mes "As such, completing a successful";
+ mes "jump is a prerequisite for recognition";
+ mes "as an adult in the Utan tribe.";
+ close;
+LumWord:
+ mes "[?????]";
+ mes "Umbaumbafumba.";
+ mes "Uwambaunbaumbabaufumba";
+ mes "Umbababaumbaumba.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,146,157,4 script Utan Young Adult#2 786,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Arotan]";
+ mes "Making a safe bungy jump is a";
+ mes "really big deal. When someone makes";
+ mes "their first jump safely, many people";
+ mes "gather for a large feast.";
+ close;
+LumWord:
+ mes "[????]";
+ mes "Umbaumbaumbabaumbaba.";
+ mes "Umbaumbabaumbababaumufumuba.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,149,165,4 script Utan Young Adult#3 781,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Kryubatan]";
+ mes "I'm really afraid of heights,";
+ mes "so I really don't want to jump,";
+ mes "but I must in order to be";
+ mes "recognized as a courageous";
+ mes "member of the Utan tribe.";
+ close;
+LumWord:
+ mes "[??????]";
+ mes "Umbaumbaumbababa.";
+ mes "Umbaumbaumumbabaumfumuba.";
+ mes "Umbaumbaumumubafumba.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,92,159,4 script Hartan 785,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Hartan]";
+ mes "You want to know why our";
+ mes "skin is jet-black?";
+ mes "......";
+ next;
+ mes "[Hartan]";
+ mes "Well...";
+ mes "Every night before we sleep,";
+ mes "we eat lots of chocolate!";
+ next;
+ mes "[Hartan]";
+ mes "Mmmmmmm...Chocolate...";
+ close;
+LumWord:
+ mes "[????]";
+ mes "Umbaumbaumba";
+ mes "Umbaumbaumba";
+ mes "Umbaumbaumba";
+ next;
+ mes "[????]";
+ mes "Umbaumbabaungaha.";
+ emotion e_sob;
+ close;
+}
+
+//=====================================================================
+umbala.gat,194,104,4 script Utan Tribe Child#2 787,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Burkatan]";
+ mes "An outsider?";
+ mes "Are you here to try bungy jumping?";
+ next;
+ menu "You got it",-,"Well....",L2;
+ mes "[Burkatan]";
+ mes "What courage!";
+ mes "The Utan tribe welcomes those";
+ mes "with courageous hearts.";
+ close;
+ L2:
+ mes "[Burkatan]";
+ mes "The adults don't want me to even";
+ mes "get close to the bungy jumping area.";
+ mes "In this tribe, bungy jumping is a rite";
+ mes "of passage. If I can show them that";
+ mes "I'm big enough to brave bungy jumping,";
+ mes "they'll have to recognize me as an adult!";
+ close;
+LumWord:
+ mes "[???]";
+ mes "Umbaumbababaumfumuba.";
+ mes "Umbababaumbabaumbaumba.";
+ next;
+ menu "Um...yes?",-,"Nope...",Lu2;
+ mes "[???]";
+ mes "Umbaumbaumbababa.";
+ mes "Umbaumbaumubaba.";
+ close;
+ Lu2:
+ mes "[???]";
+ mes "Umbaumbaumuam.";
+ mes "Umbaumbaumbaba.";
+ mes "Umbaumfumababaumu.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,193,208,6 script Utan Child#3 789,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Fuitan]";
+ mes "When I was younger, I went bungy";
+ mes "jumping even though it was extremely";
+ mes "dangerous. I did it, though, and my";
+ mes "chest swelled with a feeling of achievement.";
+ mes "The tradition encourages rash behavior, but";
+ mes "boys will be boys, don't you think?";
+ close;
+LumWord:
+ mes "[????]";
+ mes "Umbaumbababa.";
+ mes "Umbamubafumabaumumbabamua";
+ mes "Umumbababaumbafuma.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,139,205,4 script Utan Tribe Young Adult::UtanTribeYougAdult5 785,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Tsunitan]";
+ mes "Awesome! I haven't seen an outsider in some time.";
+ mes "You're just in time to watch as";
+ mes "youth from all over the village bungy";
+ mes "jump to prove their courage!";
+ next;
+ mes "[Tsunitan]";
+ mes "After you jump, you can use the";
+ mes "cord to climb. Also, if you search";
+ mes "underwater, you might be able to find";
+ mes "a submerged cave. Of course, there have";
+ mes "been unlucky souls who have died...";
+ next;
+ mes "[Tsunitan]";
+ mes "You may also feel sick";
+ mes "as the bottom draws near, because";
+ mes "the ominous shapes of aquatic monsters";
+ mes "drift slowly under the surface.";
+ mes "If you linger underwater, you might die...";
+ close;
+LumWord:
+ mes "[????]";
+ mes "Umbaumba!";
+ mes "Umbaumbabababaumumba.";
+ mes "Babaum Utan Umbaumbaba";
+ mes "Umbababafumu.";
+ mes "Umfumubabaumbaumbaumbaba.";
+ next;
+ mes "[????]";
+ mes "Umbafumumababaumba.";
+ mes "Umbabatanumbaumba.";
+ mes "Umumu. Umbaumbaumbaum.";
+ mes "Umbabaumbaumbaumubaamum.";
+ mes "Umbaumbaumbafumu.";
+ close;
+}
+
+//=====================================================================
+um_in.gat,158,71,3 script Utan Tribesman 787,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Mutakutan]";
+ mes "Umbala has enough interesting trees";
+ mes "that studying them never gets old!";
+ next;
+ mes "[Mutakutan]";
+ mes "My favourite tree near Umbala is huge!";
+ mes "It stretches into the sky as far";
+ mes "as the eye can see!";
+ mes "It's supposed to be the tallest tree in the world!";
+ emotion e_ok;
+ next;
+ mes "[Mutakutan]";
+ mes "It's so old and large that";
+ mes "the top can't even be seen!";
+ next;
+ mes "[Mutakutan]";
+ mes "Even after climbing the tree";
+ mes "to quite a height, the top was not";
+ mes "in sight. I consider myself";
+ mes "a tree-climbing expert, so this";
+ mes "was quite distressing.";
+ next;
+ mes "[Mutakutan]";
+ mes "That said, the fruit I was able";
+ mes "to pick off of some of the higher";
+ mes "branches is yummy!";
+ emotion e_no1;
+ next;
+ mes "[Mutakutan]";
+ mes "It has a slightly sour taste. Eating";
+ mes "it makes me feel all tingly inside!!";
+ emotion e_no1;
+ next;
+ mes "[Mutakutan]";
+ mes "At the same time, a terrible illness";
+ mes "was ravaging Umbala village.";
+ next;
+ mes "[Mutakutan]";
+ mes "The elder's health was declining";
+ mes "and he was in danger of dying, but";
+ mes "when I gave him a piece of that";
+ mes "fruit, his health improved";
+ mes "dramatically in a short time. Surely";
+ mes "this fruit was a gift from the forest!";
+ emotion e_sob;
+ next;
+ mes "[Mutakutan]";
+ mes "The tree is north of the village. Why";
+ mes "not visit it if you're over that way?";
+ close;
+LumWord:
+ mes "[????]";
+ mes "Umbaumbaumbabaumba!";
+ mes "Umbaumbaumbababaumba";
+ mes "Umbaumbaumba";
+ mes "Umbabaumbaumbaba.";
+ close;
+}
+
+//=====================================================================
+umbala.gat,145,217,3 script Chibibatan 783,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Chibibatan]";
+ mes "I want to have some fun with";
+ mes "Wambokoriotan, but after seeing";
+ mes "how his wife can be, I don't know if";
+ mes "I want to end up being on her bad side.";
+ close;
+LumWord:
+ mes "[Chibibatan]";
+ mes "Umbaba.";
+ mes "Ugaugumbarumbaruuuu!";
+ mes "Ugugauwubaruguagumbagua.";
+ close;
+}
+
+//=====================================================================
+um_in.gat,139,48,5 script Purenotan 783,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Purenotan]";
+ mes "See that loser over there?";
+ mes "I'm on to him. He hasn't";
+ mes "exactly made a secret of his desire";
+ mes "to have an affair or three.";
+ mes "He needs to be smacked in the nuts, HARD.";
+ close;
+LumWord:
+ mes "[Purenotan]";
+ mes "Umbaumbaugaga!";
+ mes "Umbaumbabababa!";
+ mes "Umbaumba!";
+ emotion e_an;
+ next;
+ mes "[Purenotan]";
+ mes "Umbaumabaumbaumbaba!";
+ mes "Umbababababaugau!";
+ mes "Uguugaumbabaumbagumba!";
+ emotion e_oh;
+ next;
+ emotion e_go;
+ close;
+On_emo:
+emotion e_an;
+end;
+}
+
+//=====================================================================
+um_in.gat,144,45,5 script Wambokoriotan 789,{
+ if(event_umbala < 3) goto LumWord;
+ mes "[Wambokoriotan]";
+ mes "Ahhh...My wife is a real";
+ mes "hothead. Ouch...ouch.";
+ next;
+ mes "[Wambokoriotan]";
+ mes "Yunatan, Bartsutan, Chibibatan...";
+ mes "I want Umbala's babes as much";
+ mes "as they want me...Ouch...ouch!";
+ close;
+LumWord:
+ mes "[Wambokoriotan]";
+ mes "Umbaumbaba.....";
+ mes "Umbaugua!";
+ mes "Umbagumumbabagumbagaga!";
+ emotion e_heh;
+ next;
+ donpcevent "Purenotan::On_emo";
+ close;
+}
+
+//==============================================================================
+//Bungee jumping!
+//==============================================================================
+umbala.gat,140,197,0 script #Shibonochikka 139,0,1,{
+ set @jumprand,rand(0,4);
+ if (@jumprand == 1) goto L1;
+ if (@jumprand == 2) goto L2;
+ if (@jumprand == 3) goto L3;
+ if (@jumprand == 4) goto L4;
+ mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Iyahaaaaahh!",8;
+ end;
+
+L1:
+//Dead
+ mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Ukiyaaaaaaaaaa!",8;
+ percentheal -100,0;
+ end;
+
+L2:
+//HP50% Damage
+ mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Kyaaaaaaaaaaa!",8;
+ percentheal -50,0;
+ end;
+
+L3:
+//HP99% Damage
+ mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : Waaaaaaaaaah!",8;
+ percentheal -99,0;
+ end;
+
+L4:
+//1 HP left, warp to Niflheim
+ mapannounce "umbala.gat","Bungy Jumping Area: " + strcharinfo(0) + " : No-o!",8;
+ heal -HP+1,0;
+ warp "nif_in.gat",69,15;
+ end;
+}
+
+//=====================================================================
+umbala.gat,136,195,0 script #Warp Point 139,1,1,{
+ warp "umbala.gat",145,166;
+ end;
+}
diff --git a/npc/cities/valkyrie.txt b/npc/cities/valkyrie.txt
index 1aea9c3aa..4b64b826b 100644
--- a/npc/cities/valkyrie.txt
+++ b/npc/cities/valkyrie.txt
@@ -1,553 +1,553 @@
-//===== eAthena Script =======================================
-//= Valkyrie Realm
-//===== By: ==================================================
-//= Nana, fixes by Poki
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 2.6a
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= The Jobquest from kRO on how to advance to a Reborn class.
-//===== Additional Comments: =================================
-//= 1.1 Made all into functions,additional checks,quest skills,now Valhallana can return you back. She also makes reborn process only when you got no Zeny/items (as in kRO) [Lupus]
-//= 1.2 now alternative classes can use their 1-1 job NPC to become Advanced 1st Class [Lupus]
-//= 1.4 added Baby Class support [Lupus]
-//= 1.5 Fixed loads of gramatical errors. [Mass Zero]
-//= 1.6 Added a func which prevent advanced classes passing 2nd Job Quests again. It also guides adv classes where to go. [Lupus]
-//= 1.7 On reborn reset some Job Quest Vars and Reset Girls Counter [Lupus]
-//= 1.8 Added Taekwondo classes check [Lupus]
-//= 1.9 Added support for Job NPC Fase pics, sorrected one dialogue stuff [Lupus]
-//= 2.0 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 2.1 Changed all numbers into constants. [Vicious]
-//= 2.2 Now ALL quests skills are saved/restored [Lupus] 2.3 Removed Duplicates [Silent] 2.4 Fixed typos, optimized [Lupus] 2.5 Fixed a stuck bug [Lupus]
-//= 2.6a Adding proper dialogues [Lupus]
-//============================================================
-
-
-// -== Warp's needed! ==-
-valkyrie.gat,48,73,0 warp valk01 1,1,valkyrie.gat,48,64
-valkyrie.gat,48,66,0 warp valk01 1,1,valkyrie.gat,48,75
-
-// -== Book of Ymir (Heavens Door) ==-
-yuno_in02.gat,93,207,0 script Book of Ymir 111,{
- mes "[Book of Ymir]";
- if(Upper==1 || valkyrie_Q>1){
- mes "...The entrance to the Hall of Honor";
- mes "is open to everyone who will move forward, into their next lives.";
- mes "It is there to help heroes decide what they want to do, and can";
- mes "access every place in this world.";
- next;
- mes "[Book of Ymir]";
- mes "In the Hall of Honor, everything is perfectly prepared for heroes.";
- mes "It is rumored that any wish that";
- mes "cannot be fulfilled in our reality";
- mes "can be realized in the Hall of Honor.";
- next;
- switch(select("Stop reading.:Continue reading.")) {
- case 1:
- mes "[Book of Ymir]";
- mes ". . . . .";
- close;
- break;
- case 2:
- mes "[Book of Ymir]";
- mes "There is a forgotten path which leads to";
- mes "the Hall of Honor, the closest place to the heavens. However, it is forbidden";
- mes "for ordinary people to know about it...";
- close2;
- warp "valkyrie",48,9; //48,8?
- end;
- break;
- }
- }
- if(valkyrie_Q<1 || Upper==2 || BaseClass == Job_Taekwon || BaseJob == Job_Gunslinger || BaseJob == Job_Ninja){
- mes ". . . . .";
- }
- mes "...Therefore, ancient heroes were";
- mes "always in anguish, knowing that";
- mes "eventually, they were mortal and";
- mes "would pass from this realm...";
- next;
- mes "[The Book of Ymir]";
- mes "There were no documents, songs";
- mes "or remaining folklore that";
- mes "had any information on life";
- mes "after death. However, I recently";
- mes "uncovered an old scroll about";
- mes "Valkyrie...";
- next;
- mes "[The Book of Ymir]";
- mes "Valkyrie...";
- mes "The legendary guardian angel";
- mes "angel of Ragnarok.";
- next;
- mes "[The Book of Ymir]";
- mes "Adventurers of great strength";
- mes "and bravery will be lead by";
- mes "Valkyrie to Valhalla, the Hall";
- mes "of Honor. There, they will be";
- mes "given a new life.";
- next;
- mes "[The Book of Ymir]";
- mes "Reborn, they will live again as";
- mes "even greater heroes that will";
- mes "brighten the world. Bodies that";
- mes "were exhausted will be filled";
- mes "with energy...";
- next;
- mes "[The Book of Ymir]";
- mes "And the spirit will be given";
- mes "abilities with the heart of Ymir.";
- mes "However, the heart of Ymir was";
- mes "totally destroyed and scattered";
- mes "all over the world after the battle of the Rune-Midgarts.";
- next;
- mes "[The Book of Ymir]";
- mes "I had found a small amount of";
- mes "Ymir heart pieces over a long";
- mes "long period of time. But I can't";
- mes "confirm if the story of Valkyrie";
- mes "and Valhalla is true or not";
- mes "through scientific tests.";
- next;
- mes "[The Book of Ymir]";
- mes "So, I am leaving this record";
- mes "and hope that someone in the future";
- mes "can confirm that Valkyrie and Valhalla";
- mes "exist through my records.";
- next;
- mes "[The book of Ymir]";
- mes "Let the heroes live new lives";
- mes "so they could protect the world from danger.";
- mes "And then......";
- mes "...........";
- close;
-}
-
-// -== The Librarian that watches the "Book of Ymir" ==-
-yuno_in02.gat,91,176,5 script Librarian 754,{
- mes "[Librarian]";
- if(valkyrie_Q){
- mes "Why? You have already paid me.";
- mes "Now go and look for the Book of Ymir.";
- close;
- }
- if(BaseJob >= Job_Knight && Upper==0) goto L_PAY;
- mes "Have a look around, but don't touch the book. Only a few chosen ones can read its wise words.";
- close;
-
-L_PAY:
- mes "You seem like a worthy human.";
- mes "I, the 78th Librarian of the secret order have sworn to protect this book, it won't thread lightly on you.";
- mes "In order to let me allow you to view into this wonderous book, you have to do two things for me.";
- next;
- mes "[Librarian]";
- mes "One. You have to pay me 1,285,000 Zeny. Remember that you need the accurate amount. Not over or under 1,285,000z.";
- mes "Two. You have to venture deep inside of Yuno castle, into the Heart of Ymir.";
- mes "Remember that you cannot view the book unless you have done this.";
- mes "Now go, brave one.";
- next;
- menu "Pay now",-,"Close",M_EXIT;
-
- mes "[Librarian]";
- if(Zeny != 1285000){
- mes "You didn't bring me the accurate number of zeny I wanted. Bring me back only 1,285,000 zeny!";
- mes "Not more, nor less.";
- close;
- }
- set Zeny,0;
- set valkyrie_Q,1;
- mes "Go now, into Heart of Ymir";
- mes "There, you'll find the last piece of information before you can open the book.";
-M_EXIT:
- close;
-}
-
-// -== The Heart of Ymir ==-
-yuno_in05.gat,50,44,0 script Heart of Ymir 111,{
- mes "[Heart of Ymir]";
- if(valkyrie_Q == 1){
- mes "Thus upon hard times and when our self esteem is at its lowest, then is when our faith has to be the strongest.";
- mes "For aeons the secret guardians of the path to heaven have protected the secret gate from evil spirits entering it.";
- mes "Thus, the bonds became to weaken over time... That's when the Legion of Sages started recruiting and making young, brave and quick minded mages and sages, teaching them the laws and propositions of our world.";
- next;
- mes "[Heart of Ymir]";
- mes "Aeons passed and the Sages grew stronger in both mind and forces, until they all were feared throughout the monsters' world.";
- mes "Now, after listening to my words of wisdom, please advance to the Book of Ymir and give yourself into Gods light.";
- mes "If you are pure of heart and have no evil intentions, the gates of dawn will open for you and take you in...";
- set valkyrie_Q,2;
- close;
- }
- if(valkyrie_Q == 2){
- mes "I have nothing more to teach you, nor to tell you.";
- close;
- }
- mes ". . .";
- close;
-}
-
-// -== Researcher of the Book of Ymir ==-
-yuno_in02.gat,90,77,4 script Researcher#06 744,{
- mes "[Researcher]";
- mes "Argh, where is it!?";
- mes "They said that it would be around here somewhere...";
- mes "Maybe I have to look deeper into this castle...";
- emotion e_what;
- close;
-}
-
-// -== Valhallana ==-
-valkyrie.gat,48,86,6 script Valkyrie 811,{
- mes "[Valhallana]";
- if(BaseJob == Job_SuperNovice) goto L_SN;
- if(baseClass == Job_Taekwon || BaseJob == Job_Gunslinger || BaseJob == Job_Ninja) goto L_CANT; //sent back any Taekwondo/GS/NJ classes
- if(Upper == 2) goto L_BABY;
- if(Upper > 0) goto L_ALREADY;
- if(BaseLevel >= 99 && JobLevel >= 50 && BaseJob > Job_Thief) goto L_CHANGE;
- if(BaseJob <= Job_Thief) goto L_NOTHING;
-
- mes "You need 99 Base Level and 50 Job Level.";
- mes "Also you must get rid of all of your money and items.";
- next;
- goto L_NOTHING;
-
-L_BABY:
- mes "A Baby?! How did you get here?";
- mes "I'm passing you back to your parents.";
- emotion e_what;
- next;
-L_Y:
- warp "yuno_in02.gat",93,204;
- close;
-
-L_CANT:
- mes "How did you get here?";
- emotion e_what;
- next;
- goto L_Y;
-
-L_SN:
- mes "Welcome to Valkyrie, "+strcharinfo(0)+".";
- mes "I see you have followed a hard way of the Super Novice.";
- next;
- mes "[Valhallana]";
- mes "I am sorry, but I can't help you.";
- emotion e_sry;
- next;
- goto L_NOTHING;
-
-L_ALREADY:
- mes "I can't help you anymore.";
- if(Class == Job_Novice_High) mes "You have been reborn already.";
- if(Class >= Job_Swordman_High && Class <= Job_Thief_High) mes "Please go over there, to the person representing your class.";
- next;
-
-L_NOTHING:
- mes "Do you wish to go back to your world?";
- next;
- menu "Yes",L_Y,"No",-;
-
- mes "[Valhallana]";
- mes "As you wish...";
- close;
-
-L_CHANGE:
- mes "Welcome to Valkyrie, "+strcharinfo(0)+". From this point on, there is no returning back.";
- next;
- mes "[Valhallana]";
- if(Zeny || Weight) goto L_ZENYITEMS;
- if(checkcart(0)) goto L_CART;
- if(checkfalcon(0)) goto L_FALCON;
- if(checkriding(0)) goto L_PECO;
- if(skillpoint > 0) goto L_SKILLPNTS;
-
- mes "Let's start your reincarnation ceremony...";
- next;
-
- set ADVJOB, Class+Job_Novice_High; //memo the target 3rd Job ID
- if(ADVJOB == Job_Lord_Knight2) set ADVJOB,Job_Lord_Knight;
- if(ADVJOB == Job_Paladin2) set ADVJOB,Job_Paladin;
-
- callfunc("F_SaveQuestSkills");
-
- mes "[Valhallana]";
- mes "Done...";
- mes "Good luck.";
- jobchange Job_Novice_High;
- resetlvl(1);
- callfunc "F_ClearJobVar";
- set RES_SKILL,0; //we reset Reset Skills NPC counter
- next;
- if(ADVJOB == Job_Lord_Knight || ADVJOB == Job_Paladin) goto L_Izl;
- if(ADVJOB == Job_High_Priest || ADVJOB == Job_Champion) goto L_Pro;
- if(ADVJOB == Job_High_Wizard || ADVJOB == Job_Professor) goto L_Gef;
- if(ADVJOB == Job_Whitesmith || ADVJOB == Job_Creator) goto L_Alb;
- if(ADVJOB == Job_Sniper || ADVJOB == Job_Clown || ADVJOB == Job_Gypsy) goto L_Pay;
- if(ADVJOB == Job_Assassin_Cross || ADVJOB == Job_Stalker) goto L_Mor;
-
-L_Pro:
- savepoint "prontera.gat",273,354;
- warp "prontera.gat",273,354;
- close;
-
-L_Mor:
- savepoint "morocc.gat",160,94;
- warp "morocc.gat",160,94;
- close;
-
-L_Alb:
- savepoint "alberta.gat",116,57;
- warp "alberta.gat",116,57;
- close;
-
-L_Pay:
- savepoint "payon.gat",155,90;
- warp "payon.gat",155,90;
- close;
-
-L_Izl:
- savepoint "izlude.gat",94,103;
- warp "izlude.gat",94,103;
- close;
-
-L_Gef:
- savepoint "geffen.gat",120,100;
- warp "geffen.gat",120,100;
- close;
-
-L_ZENYITEMS:
- mes "Your money and items do rope you to your routine life.";
- mes "You should get rid of them.";
- close;
-
-L_CART:
- mes "Please, drop your cart and we'll continue.";
- close;
-
-L_FALCON:
- mes "Please, free your Falcon and we'll continue.";
- close;
-
-L_PECO:
- mes "Please, free your PecoPeco and we'll continue.";
- close;
-
-L_SKILLPNTS:
- mes "You will need to use up all of your skill points if you want me to continue.";
- close;
-}
-
-// function HIGH NOVICE -> HIGH 1
-//getarg(0) - High Job ID
-//getarg(1) - High Job Name
-//getarg(2) - 3rd Job ID
-//getarg(3) - current NPC's name
-
-function script F_ToHigh {
- if(Upper == 2) return; //Baby Class - skip it
- if(ADVJOB == Job_Lord_Knight2) set ADVJOB,Job_Lord_Knight;
- if(ADVJOB == Job_Paladin2) set ADVJOB,Job_Paladin;
- set @fjob,ADVJOB; //alternative classes should pass, too
- if(@fjob == Job_Stalker) set @fjob,Job_Assassin_Cross;
- if(@fjob == Job_Creator) set @fjob,Job_Whitesmith;
- if(@fjob == Job_Clown || @fjob == Job_Gypsy) set @fjob,Job_Sniper;
- if(@fjob == Job_Paladin) set @fjob,Job_Lord_Knight;
- if(@fjob == Job_Champion) set @fjob,Job_High_Priest;
- if(@fjob == Job_Professor) set @fjob,Job_High_Wizard;
-
- if(Class == getarg(0)) goto L_WELCOME; //3rd Job
- if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY; //already advanced class
- if(Class == Job_Novice_High && @fjob == getarg(2)) goto L_GETHIGH; //High Novice -> High XXXX
- if(Class == Job_Novice_High) {
- mes "Hello, Novice High! If you are going to became a "+getarg(1)+", then go visit your very first job teacher.";
- close;
- }
- return; //this char doesn't want to get HIGH class
-
-L_GETHIGH:
- mes "["+getarg(3)+"]";
- if(JobLevel < 10) goto L_NOTREADY;
- if(checkcart(0)) goto L_CART;
- if(checkfalcon(0)) goto L_FALCON;
- if(checkriding(0)) goto L_PECO;
- if(skillpoint > 0) goto L_SKILLPNTS;
-
- mes "Hello there, "+strcharinfo(0)+"!";
- mes "You've made a brave choice in coming here to be reborn and stepping forth into the advanced ranks.";
- mes "Now... close your eyes.";
- next;
- mes "["+getarg(3)+"]";
- mes "Open your eyes.";
- mes "You have become a "+getarg(1)+".";
- jobchange getarg(0); //High Class
- next;
- if(ADV_QSK){
- mes "["+getarg(3)+"]";
- mes "Let me just add in the missing Quest Skills you lost under the Reborn process, "+strcharinfo(0)+".";
- next;
- //return learnt quest skills
- callfunc("F_Load1Skills");
- }
- mes "["+getarg(3)+"]";
- mes "I wish you good fortune in the near future!";
- emotion e_grat;
- close;
-
-L_NOTREADY:
- mes "You are not ready to become a "+getarg(1)+".";
- mes "You have to raise your Job Level to 10.";
- emotion e_gasp;
- close;
-
-L_SKILLPNTS:
- mes "You will need to use up all of your skill points if you want me to continue.";
- emotion e_hmm;
- close;
-
-L_CART:
- mes "Please, drop your cart and we'll continue.";
- emotion e_hmm;
- close;
-
-L_FALCON:
- mes "Please, free your Falcon and we'll continue.";
- emotion e_hmm;
- close;
-
-L_PECO:
- mes "Please, free your Pecopeco and we'll continue.";
- emotion e_hmm;
- close;
-
-L_WELCOME:
- mes "["+getarg(3)+"]";
- mes "You are welcome, "+strcharinfo(0)+"!";
- mes "We're always glad to see a "+getarg(1)+" here!";
- close;
-
-L_ALREADY:
- mes "["+getarg(3)+"]";
- mes "It's such a big honor to salute envoys of Valhalla.";
- mes "Come again.";
- emotion e_ho;
- close;
-}
-
-// function GET 3rd JOB
-//getarg(0) - High Job ID
-//getarg(1) - High Job Name
-//getarg(2) - 3rd Job ID
-//getarg(3) - 3rd Job Name
-function script F_Rebirth {
- mes "["+getarg(3)+"]";
- if(Upper == 2) goto L_BABY; //Baby Class - skip it
- if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY; //already advanced class
- if(Class == getarg(0) && ADVJOB == getarg(2)) goto L_GET3RD; //Hight XXXX -> 3rd Job
- mes "Go talk to either Valhallana or one of my collegues...";
- emotion e_sry;
- close;
-
-L_GET3RD:
- if(JobLevel < 45) goto L_NOTREADY;
- if(checkcart(0)) goto L_CART;
- if(checkfalcon(0)) goto L_FALCON;
- if(checkriding(0)) goto L_PECO;
- if(skillpoint > 0) goto L_SKILLPNTS;
-
- mes "Congratulations!";
- mes "You have trained well. Now stroll here as a "+getarg(3)+"!";
- jobchange getarg(2); //Rebirth Class
- set ADVJOB,0;
- if(ADV_QSK2){
- next;
- mes "["+getarg(3)+"]";
- mes "Let me just add in the missing Quest Skills you lost under the Reborn process, "+strcharinfo(0)+".";
- next;
- //return learnt quest skills
- callfunc("F_Load2Skills");
- }
- close;
-
-L_NOTREADY:
- mes "You have went so far to get here. But I am sorry, you aren't quite ready to become a "+getarg(3)+".";
- mes "You need at least Job Level 45 or higher.";
- emotion e_gasp;
- close;
-
-L_SKILLPNTS:
- mes "You will need to use up all of your skill points if you want me to continue.";
- emotion e_hmm;
- close;
-
-L_CART:
- mes "Please, drop your cart and we'll continue.";
- emotion e_hmm;
- close;
-
-L_FALCON:
- mes "Please, free your Falcon and we'll continue.";
- emotion e_hmm;
- close;
-
-L_PECO:
- mes "Please, free your Pecopeco and we'll continue.";
- emotion e_hmm;
- close;
-
-L_ALREADY:
- mes "Well, hello there! You have been reborn once, there is no second chance.";
- emotion e_ho;
- close;
-
-L_BABY:
- mes "What a lively baby!";
- mes "How did you get here? Go to aunt Valhallana and ask her to take your home.";
- emotion e_pat;
- close;
-}
-
-// function GUIDE player to Valhalla for getting 3rd JOB
-// this function prevents passing 2nd JOB QUESTS by advanced classes also
-//getarg(0) - High Job ID
-//getarg(1) - High Job Name
-//getarg(2) - 3rd Job ID
-//getarg(3) - 3rd Job Name
-//getarg(4) - NPC Name
-function script F_BlockHigh {
- if(Upper != 1) return; //This func should interact with Advanced classes only
- mes "["+getarg(4)+"]";
- if(Class == getarg(0) && ADVJOB == getarg(2)) goto L_RIGHTHIGH;
- if(Class == getarg(2)) goto L_RIGHT3RD;
- if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY3RD; //already advanced class, but from wrong guild
-//this player is a High Novice
- if(Class == Job_Novice_High) mes "Hello, Novice High! If you are going to became a "+getarg(1)+", then go visit your very first job teacher.";
-//this player has 1st advanced job, but from wrong guild
- if(Class == getarg(0)) mes "A "+getarg(1)+"?";
- if(Class != Job_Novice_High) mes "Rumors say only Valhallana knows your way...";
- emotion e_sry;
- close;
-
-L_RIGHT3RD:
- mes "Well, hello there! You look... younger.";
- emotion e_hmm;
- next;
- mes "["+getarg(4)+"]";
- mes "You are always welcome here, "+strcharinfo(0)+"!";
- mes "Our good old guild is your second home, isn't it?";
- emotion e_no1;
- close;
-
-L_RIGHTHIGH:
- mes "Hello, "+strcharinfo(0)+"!";
- mes "If you are going to become a "+getarg(3)+", then you should visit Valhalla again.";
- if(JobLevel < 45) mes "But you need at least Job Level 45 or higher.";
- emotion e_gasp;
- close;
-
-L_ALREADY3RD:
- mes "A "+getarg(3)+"?";
- mes "You don't belong to our guild. Begone!";
- emotion e_omg;
- close;
-}
+//===== eAthena Script =======================================
+//= Valkyrie Realm
+//===== By: ==================================================
+//= Nana, fixes by Poki
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 2.6a
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= The Jobquest from kRO on how to advance to a Reborn class.
+//===== Additional Comments: =================================
+//= 1.1 Made all into functions,additional checks,quest skills,now Valhallana can return you back. She also makes reborn process only when you got no Zeny/items (as in kRO) [Lupus]
+//= 1.2 now alternative classes can use their 1-1 job NPC to become Advanced 1st Class [Lupus]
+//= 1.4 added Baby Class support [Lupus]
+//= 1.5 Fixed loads of gramatical errors. [Mass Zero]
+//= 1.6 Added a func which prevent advanced classes passing 2nd Job Quests again. It also guides adv classes where to go. [Lupus]
+//= 1.7 On reborn reset some Job Quest Vars and Reset Girls Counter [Lupus]
+//= 1.8 Added Taekwondo classes check [Lupus]
+//= 1.9 Added support for Job NPC Fase pics, sorrected one dialogue stuff [Lupus]
+//= 2.0 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 2.1 Changed all numbers into constants. [Vicious]
+//= 2.2 Now ALL quests skills are saved/restored [Lupus] 2.3 Removed Duplicates [Silent] 2.4 Fixed typos, optimized [Lupus] 2.5 Fixed a stuck bug [Lupus]
+//= 2.6a Adding proper dialogues [Lupus]
+//============================================================
+
+
+// -== Warp's needed! ==-
+valkyrie.gat,48,73,0 warp valk01 1,1,valkyrie.gat,48,64
+valkyrie.gat,48,66,0 warp valk01 1,1,valkyrie.gat,48,75
+
+// -== Book of Ymir (Heavens Door) ==-
+yuno_in02.gat,93,207,0 script Book of Ymir 111,{
+ mes "[Book of Ymir]";
+ if(Upper==1 || valkyrie_Q>1){
+ mes "...The entrance to the Hall of Honor";
+ mes "is open to everyone who will move forward, into their next lives.";
+ mes "It is there to help heroes decide what they want to do, and can";
+ mes "access every place in this world.";
+ next;
+ mes "[Book of Ymir]";
+ mes "In the Hall of Honor, everything is perfectly prepared for heroes.";
+ mes "It is rumored that any wish that";
+ mes "cannot be fulfilled in our reality";
+ mes "can be realized in the Hall of Honor.";
+ next;
+ switch(select("Stop reading.:Continue reading.")) {
+ case 1:
+ mes "[Book of Ymir]";
+ mes ". . . . .";
+ close;
+ break;
+ case 2:
+ mes "[Book of Ymir]";
+ mes "There is a forgotten path which leads to";
+ mes "the Hall of Honor, the closest place to the heavens. However, it is forbidden";
+ mes "for ordinary people to know about it...";
+ close2;
+ warp "valkyrie",48,9; //48,8?
+ end;
+ break;
+ }
+ }
+ if(valkyrie_Q<1 || Upper==2 || BaseClass == Job_Taekwon || BaseJob == Job_Gunslinger || BaseJob == Job_Ninja){
+ mes ". . . . .";
+ }
+ mes "...Therefore, ancient heroes were";
+ mes "always in anguish, knowing that";
+ mes "eventually, they were mortal and";
+ mes "would pass from this realm...";
+ next;
+ mes "[The Book of Ymir]";
+ mes "There were no documents, songs";
+ mes "or remaining folklore that";
+ mes "had any information on life";
+ mes "after death. However, I recently";
+ mes "uncovered an old scroll about";
+ mes "Valkyrie...";
+ next;
+ mes "[The Book of Ymir]";
+ mes "Valkyrie...";
+ mes "The legendary guardian angel";
+ mes "angel of Ragnarok.";
+ next;
+ mes "[The Book of Ymir]";
+ mes "Adventurers of great strength";
+ mes "and bravery will be lead by";
+ mes "Valkyrie to Valhalla, the Hall";
+ mes "of Honor. There, they will be";
+ mes "given a new life.";
+ next;
+ mes "[The Book of Ymir]";
+ mes "Reborn, they will live again as";
+ mes "even greater heroes that will";
+ mes "brighten the world. Bodies that";
+ mes "were exhausted will be filled";
+ mes "with energy...";
+ next;
+ mes "[The Book of Ymir]";
+ mes "And the spirit will be given";
+ mes "abilities with the heart of Ymir.";
+ mes "However, the heart of Ymir was";
+ mes "totally destroyed and scattered";
+ mes "all over the world after the battle of the Rune-Midgarts.";
+ next;
+ mes "[The Book of Ymir]";
+ mes "I had found a small amount of";
+ mes "Ymir heart pieces over a long";
+ mes "long period of time. But I can't";
+ mes "confirm if the story of Valkyrie";
+ mes "and Valhalla is true or not";
+ mes "through scientific tests.";
+ next;
+ mes "[The Book of Ymir]";
+ mes "So, I am leaving this record";
+ mes "and hope that someone in the future";
+ mes "can confirm that Valkyrie and Valhalla";
+ mes "exist through my records.";
+ next;
+ mes "[The book of Ymir]";
+ mes "Let the heroes live new lives";
+ mes "so they could protect the world from danger.";
+ mes "And then......";
+ mes "...........";
+ close;
+}
+
+// -== The Librarian that watches the "Book of Ymir" ==-
+yuno_in02.gat,91,176,5 script Librarian 754,{
+ mes "[Librarian]";
+ if(valkyrie_Q){
+ mes "Why? You have already paid me.";
+ mes "Now go and look for the Book of Ymir.";
+ close;
+ }
+ if(BaseJob >= Job_Knight && Upper==0) goto L_PAY;
+ mes "Have a look around, but don't touch the book. Only a few chosen ones can read its wise words.";
+ close;
+
+L_PAY:
+ mes "You seem like a worthy human.";
+ mes "I, the 78th Librarian of the secret order have sworn to protect this book, it won't thread lightly on you.";
+ mes "In order to let me allow you to view into this wonderous book, you have to do two things for me.";
+ next;
+ mes "[Librarian]";
+ mes "One. You have to pay me 1,285,000 Zeny. Remember that you need the accurate amount. Not over or under 1,285,000z.";
+ mes "Two. You have to venture deep inside of Yuno castle, into the Heart of Ymir.";
+ mes "Remember that you cannot view the book unless you have done this.";
+ mes "Now go, brave one.";
+ next;
+ menu "Pay now",-,"Close",M_EXIT;
+
+ mes "[Librarian]";
+ if(Zeny != 1285000){
+ mes "You didn't bring me the accurate number of zeny I wanted. Bring me back only 1,285,000 zeny!";
+ mes "Not more, nor less.";
+ close;
+ }
+ set Zeny,0;
+ set valkyrie_Q,1;
+ mes "Go now, into Heart of Ymir";
+ mes "There, you'll find the last piece of information before you can open the book.";
+M_EXIT:
+ close;
+}
+
+// -== The Heart of Ymir ==-
+yuno_in05.gat,50,44,0 script Heart of Ymir 111,{
+ mes "[Heart of Ymir]";
+ if(valkyrie_Q == 1){
+ mes "Thus upon hard times and when our self esteem is at its lowest, then is when our faith has to be the strongest.";
+ mes "For aeons the secret guardians of the path to heaven have protected the secret gate from evil spirits entering it.";
+ mes "Thus, the bonds became to weaken over time... That's when the Legion of Sages started recruiting and making young, brave and quick minded mages and sages, teaching them the laws and propositions of our world.";
+ next;
+ mes "[Heart of Ymir]";
+ mes "Aeons passed and the Sages grew stronger in both mind and forces, until they all were feared throughout the monsters' world.";
+ mes "Now, after listening to my words of wisdom, please advance to the Book of Ymir and give yourself into Gods light.";
+ mes "If you are pure of heart and have no evil intentions, the gates of dawn will open for you and take you in...";
+ set valkyrie_Q,2;
+ close;
+ }
+ if(valkyrie_Q == 2){
+ mes "I have nothing more to teach you, nor to tell you.";
+ close;
+ }
+ mes ". . .";
+ close;
+}
+
+// -== Researcher of the Book of Ymir ==-
+yuno_in02.gat,90,77,4 script Researcher#06 744,{
+ mes "[Researcher]";
+ mes "Argh, where is it!?";
+ mes "They said that it would be around here somewhere...";
+ mes "Maybe I have to look deeper into this castle...";
+ emotion e_what;
+ close;
+}
+
+// -== Valhallana ==-
+valkyrie.gat,48,86,6 script Valkyrie 811,{
+ mes "[Valhallana]";
+ if(BaseJob == Job_SuperNovice) goto L_SN;
+ if(baseClass == Job_Taekwon || BaseJob == Job_Gunslinger || BaseJob == Job_Ninja) goto L_CANT; //sent back any Taekwondo/GS/NJ classes
+ if(Upper == 2) goto L_BABY;
+ if(Upper > 0) goto L_ALREADY;
+ if(BaseLevel >= 99 && JobLevel >= 50 && BaseJob > Job_Thief) goto L_CHANGE;
+ if(BaseJob <= Job_Thief) goto L_NOTHING;
+
+ mes "You need 99 Base Level and 50 Job Level.";
+ mes "Also you must get rid of all of your money and items.";
+ next;
+ goto L_NOTHING;
+
+L_BABY:
+ mes "A Baby?! How did you get here?";
+ mes "I'm passing you back to your parents.";
+ emotion e_what;
+ next;
+L_Y:
+ warp "yuno_in02.gat",93,204;
+ close;
+
+L_CANT:
+ mes "How did you get here?";
+ emotion e_what;
+ next;
+ goto L_Y;
+
+L_SN:
+ mes "Welcome to Valkyrie, "+strcharinfo(0)+".";
+ mes "I see you have followed a hard way of the Super Novice.";
+ next;
+ mes "[Valhallana]";
+ mes "I am sorry, but I can't help you.";
+ emotion e_sry;
+ next;
+ goto L_NOTHING;
+
+L_ALREADY:
+ mes "I can't help you anymore.";
+ if(Class == Job_Novice_High) mes "You have been reborn already.";
+ if(Class >= Job_Swordman_High && Class <= Job_Thief_High) mes "Please go over there, to the person representing your class.";
+ next;
+
+L_NOTHING:
+ mes "Do you wish to go back to your world?";
+ next;
+ menu "Yes",L_Y,"No",-;
+
+ mes "[Valhallana]";
+ mes "As you wish...";
+ close;
+
+L_CHANGE:
+ mes "Welcome to Valkyrie, "+strcharinfo(0)+". From this point on, there is no returning back.";
+ next;
+ mes "[Valhallana]";
+ if(Zeny || Weight) goto L_ZENYITEMS;
+ if(checkcart(0)) goto L_CART;
+ if(checkfalcon(0)) goto L_FALCON;
+ if(checkriding(0)) goto L_PECO;
+ if(skillpoint > 0) goto L_SKILLPNTS;
+
+ mes "Let's start your reincarnation ceremony...";
+ next;
+
+ set ADVJOB, Class+Job_Novice_High; //memo the target 3rd Job ID
+ if(ADVJOB == Job_Lord_Knight2) set ADVJOB,Job_Lord_Knight;
+ if(ADVJOB == Job_Paladin2) set ADVJOB,Job_Paladin;
+
+ callfunc("F_SaveQuestSkills");
+
+ mes "[Valhallana]";
+ mes "Done...";
+ mes "Good luck.";
+ jobchange Job_Novice_High;
+ resetlvl(1);
+ callfunc "F_ClearJobVar";
+ set RES_SKILL,0; //we reset Reset Skills NPC counter
+ next;
+ if(ADVJOB == Job_Lord_Knight || ADVJOB == Job_Paladin) goto L_Izl;
+ if(ADVJOB == Job_High_Priest || ADVJOB == Job_Champion) goto L_Pro;
+ if(ADVJOB == Job_High_Wizard || ADVJOB == Job_Professor) goto L_Gef;
+ if(ADVJOB == Job_Whitesmith || ADVJOB == Job_Creator) goto L_Alb;
+ if(ADVJOB == Job_Sniper || ADVJOB == Job_Clown || ADVJOB == Job_Gypsy) goto L_Pay;
+ if(ADVJOB == Job_Assassin_Cross || ADVJOB == Job_Stalker) goto L_Mor;
+
+L_Pro:
+ savepoint "prontera.gat",273,354;
+ warp "prontera.gat",273,354;
+ close;
+
+L_Mor:
+ savepoint "morocc.gat",160,94;
+ warp "morocc.gat",160,94;
+ close;
+
+L_Alb:
+ savepoint "alberta.gat",116,57;
+ warp "alberta.gat",116,57;
+ close;
+
+L_Pay:
+ savepoint "payon.gat",155,90;
+ warp "payon.gat",155,90;
+ close;
+
+L_Izl:
+ savepoint "izlude.gat",94,103;
+ warp "izlude.gat",94,103;
+ close;
+
+L_Gef:
+ savepoint "geffen.gat",120,100;
+ warp "geffen.gat",120,100;
+ close;
+
+L_ZENYITEMS:
+ mes "Your money and items do rope you to your routine life.";
+ mes "You should get rid of them.";
+ close;
+
+L_CART:
+ mes "Please, drop your cart and we'll continue.";
+ close;
+
+L_FALCON:
+ mes "Please, free your Falcon and we'll continue.";
+ close;
+
+L_PECO:
+ mes "Please, free your PecoPeco and we'll continue.";
+ close;
+
+L_SKILLPNTS:
+ mes "You will need to use up all of your skill points if you want me to continue.";
+ close;
+}
+
+// function HIGH NOVICE -> HIGH 1
+//getarg(0) - High Job ID
+//getarg(1) - High Job Name
+//getarg(2) - 3rd Job ID
+//getarg(3) - current NPC's name
+
+function script F_ToHigh {
+ if(Upper == 2) return; //Baby Class - skip it
+ if(ADVJOB == Job_Lord_Knight2) set ADVJOB,Job_Lord_Knight;
+ if(ADVJOB == Job_Paladin2) set ADVJOB,Job_Paladin;
+ set @fjob,ADVJOB; //alternative classes should pass, too
+ if(@fjob == Job_Stalker) set @fjob,Job_Assassin_Cross;
+ if(@fjob == Job_Creator) set @fjob,Job_Whitesmith;
+ if(@fjob == Job_Clown || @fjob == Job_Gypsy) set @fjob,Job_Sniper;
+ if(@fjob == Job_Paladin) set @fjob,Job_Lord_Knight;
+ if(@fjob == Job_Champion) set @fjob,Job_High_Priest;
+ if(@fjob == Job_Professor) set @fjob,Job_High_Wizard;
+
+ if(Class == getarg(0)) goto L_WELCOME; //3rd Job
+ if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY; //already advanced class
+ if(Class == Job_Novice_High && @fjob == getarg(2)) goto L_GETHIGH; //High Novice -> High XXXX
+ if(Class == Job_Novice_High) {
+ mes "Hello, Novice High! If you are going to became a "+getarg(1)+", then go visit your very first job teacher.";
+ close;
+ }
+ return; //this char doesn't want to get HIGH class
+
+L_GETHIGH:
+ mes "["+getarg(3)+"]";
+ if(JobLevel < 10) goto L_NOTREADY;
+ if(checkcart(0)) goto L_CART;
+ if(checkfalcon(0)) goto L_FALCON;
+ if(checkriding(0)) goto L_PECO;
+ if(skillpoint > 0) goto L_SKILLPNTS;
+
+ mes "Hello there, "+strcharinfo(0)+"!";
+ mes "You've made a brave choice in coming here to be reborn and stepping forth into the advanced ranks.";
+ mes "Now... close your eyes.";
+ next;
+ mes "["+getarg(3)+"]";
+ mes "Open your eyes.";
+ mes "You have become a "+getarg(1)+".";
+ jobchange getarg(0); //High Class
+ next;
+ if(ADV_QSK){
+ mes "["+getarg(3)+"]";
+ mes "Let me just add in the missing Quest Skills you lost under the Reborn process, "+strcharinfo(0)+".";
+ next;
+ //return learnt quest skills
+ callfunc("F_Load1Skills");
+ }
+ mes "["+getarg(3)+"]";
+ mes "I wish you good fortune in the near future!";
+ emotion e_grat;
+ close;
+
+L_NOTREADY:
+ mes "You are not ready to become a "+getarg(1)+".";
+ mes "You have to raise your Job Level to 10.";
+ emotion e_gasp;
+ close;
+
+L_SKILLPNTS:
+ mes "You will need to use up all of your skill points if you want me to continue.";
+ emotion e_hmm;
+ close;
+
+L_CART:
+ mes "Please, drop your cart and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_FALCON:
+ mes "Please, free your Falcon and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_PECO:
+ mes "Please, free your Pecopeco and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_WELCOME:
+ mes "["+getarg(3)+"]";
+ mes "You are welcome, "+strcharinfo(0)+"!";
+ mes "We're always glad to see a "+getarg(1)+" here!";
+ close;
+
+L_ALREADY:
+ mes "["+getarg(3)+"]";
+ mes "It's such a big honor to salute envoys of Valhalla.";
+ mes "Come again.";
+ emotion e_ho;
+ close;
+}
+
+// function GET 3rd JOB
+//getarg(0) - High Job ID
+//getarg(1) - High Job Name
+//getarg(2) - 3rd Job ID
+//getarg(3) - 3rd Job Name
+function script F_Rebirth {
+ mes "["+getarg(3)+"]";
+ if(Upper == 2) goto L_BABY; //Baby Class - skip it
+ if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY; //already advanced class
+ if(Class == getarg(0) && ADVJOB == getarg(2)) goto L_GET3RD; //Hight XXXX -> 3rd Job
+ mes "Go talk to either Valhallana or one of my collegues...";
+ emotion e_sry;
+ close;
+
+L_GET3RD:
+ if(JobLevel < 45) goto L_NOTREADY;
+ if(checkcart(0)) goto L_CART;
+ if(checkfalcon(0)) goto L_FALCON;
+ if(checkriding(0)) goto L_PECO;
+ if(skillpoint > 0) goto L_SKILLPNTS;
+
+ mes "Congratulations!";
+ mes "You have trained well. Now stroll here as a "+getarg(3)+"!";
+ jobchange getarg(2); //Rebirth Class
+ set ADVJOB,0;
+ if(ADV_QSK2){
+ next;
+ mes "["+getarg(3)+"]";
+ mes "Let me just add in the missing Quest Skills you lost under the Reborn process, "+strcharinfo(0)+".";
+ next;
+ //return learnt quest skills
+ callfunc("F_Load2Skills");
+ }
+ close;
+
+L_NOTREADY:
+ mes "You have went so far to get here. But I am sorry, you aren't quite ready to become a "+getarg(3)+".";
+ mes "You need at least Job Level 45 or higher.";
+ emotion e_gasp;
+ close;
+
+L_SKILLPNTS:
+ mes "You will need to use up all of your skill points if you want me to continue.";
+ emotion e_hmm;
+ close;
+
+L_CART:
+ mes "Please, drop your cart and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_FALCON:
+ mes "Please, free your Falcon and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_PECO:
+ mes "Please, free your Pecopeco and we'll continue.";
+ emotion e_hmm;
+ close;
+
+L_ALREADY:
+ mes "Well, hello there! You have been reborn once, there is no second chance.";
+ emotion e_ho;
+ close;
+
+L_BABY:
+ mes "What a lively baby!";
+ mes "How did you get here? Go to aunt Valhallana and ask her to take your home.";
+ emotion e_pat;
+ close;
+}
+
+// function GUIDE player to Valhalla for getting 3rd JOB
+// this function prevents passing 2nd JOB QUESTS by advanced classes also
+//getarg(0) - High Job ID
+//getarg(1) - High Job Name
+//getarg(2) - 3rd Job ID
+//getarg(3) - 3rd Job Name
+//getarg(4) - NPC Name
+function script F_BlockHigh {
+ if(Upper != 1) return; //This func should interact with Advanced classes only
+ mes "["+getarg(4)+"]";
+ if(Class == getarg(0) && ADVJOB == getarg(2)) goto L_RIGHTHIGH;
+ if(Class == getarg(2)) goto L_RIGHT3RD;
+ if(Class >= Job_Lord_Knight && Class <= Job_Paladin2) goto L_ALREADY3RD; //already advanced class, but from wrong guild
+//this player is a High Novice
+ if(Class == Job_Novice_High) mes "Hello, Novice High! If you are going to became a "+getarg(1)+", then go visit your very first job teacher.";
+//this player has 1st advanced job, but from wrong guild
+ if(Class == getarg(0)) mes "A "+getarg(1)+"?";
+ if(Class != Job_Novice_High) mes "Rumors say only Valhallana knows your way...";
+ emotion e_sry;
+ close;
+
+L_RIGHT3RD:
+ mes "Well, hello there! You look... younger.";
+ emotion e_hmm;
+ next;
+ mes "["+getarg(4)+"]";
+ mes "You are always welcome here, "+strcharinfo(0)+"!";
+ mes "Our good old guild is your second home, isn't it?";
+ emotion e_no1;
+ close;
+
+L_RIGHTHIGH:
+ mes "Hello, "+strcharinfo(0)+"!";
+ mes "If you are going to become a "+getarg(3)+", then you should visit Valhalla again.";
+ if(JobLevel < 45) mes "But you need at least Job Level 45 or higher.";
+ emotion e_gasp;
+ close;
+
+L_ALREADY3RD:
+ mes "A "+getarg(3)+"?";
+ mes "You don't belong to our guild. Begone!";
+ emotion e_omg;
+ close;
+}
diff --git a/npc/cities/yuno.txt b/npc/cities/yuno.txt
index 6d4c16fa3..7c8f97348 100644
--- a/npc/cities/yuno.txt
+++ b/npc/cities/yuno.txt
@@ -1,392 +1,392 @@
-//===== eAthena Script =======================================
-//= Yuno City
-//===== By: ==================================================
-//= KitsuneStarwind, kobra_k88
-//===== Current Version: =====================================
-//= 1.3.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Added additional npcs. Added Metto quest. [kobra_k88]
-//= Moved item quest to quest folder. Re-edited a majority of the npcs. [kobra_k88]
-//= Removed duplicate npcs already found in the sage quest.
-//= Fixed & Spellchecked [massdriller]
-//= 1.3 Started updating Juno NPCs based on iRO. 10% complete.
-//= 1.3.2 Started updating Juno NPCs based on iRO. 30% complete.
-//============================================================
-
-
-yuno.gat,330,100,4 script Knight 734,{
- mes "[Leibech]";
- mes "I have a great";
- mes "interest in collecting";
- mes "unique and uncommon";
- mes "goods. You know, things";
- mes "that most people see just";
- mes "once in their lifetimes.";
- next;
- mes "[Leibech]";
- mes "I usually use the";
- mes "Alchesh Trading Company.";
- mes "to help add to my collection.";
- mes "Their prices aren't the cheapest,";
- mes "but their service is very";
- mes "reliable.";
- close;
-}
-
-//======================================================================================
-yuno.gat,208,164,4 script Active little girl 101,{
- mes "[Hisa]";
- mes ".....";
- mes "This town is so boring.";
- mes "No events, no festivals...";
- mes "All people do all day is stay";
- mes "at home and study. How dull!";
- close;
-}
-
-
-//======================================================================================
-yuno.gat,164,200,4 script Noyee 101,{
- mes "[Noyee]";
- mes "Did you know that there's a";
- mes "difference between the armor you";
- mes "can buy from NPC shops and the";
- mes "kinds you obtain from hunting";
- mes "monsters?";
- next;
- mes "[Noyee]";
- mes "The difference, my friend, is in";
- mes "the number of ^5533FFslots^000000 in your armor.";
- next;
- mes "[Noyee]";
- mes "The same kind of Armor will have";
- mes "the same Defense. However, if an";
- mes "Armor has a slot, you can insert a";
- mes "Monster Card which will add an";
- mes "enhancement to that armor.";
- next;
- mes "[Noyee]";
- mes "Both Monster Cards and Slotted";
- mes "Armors are rarely dropped by";
- mes "monsters, and are thus valuable";
- mes "commodies.";
- close;
-}
-
-//======================================================================================
-yuno.gat,184,173,4 script Freidrich 729,{
- mes "[Freidrich]";
- mes "The city of Sages,";
- mes "^5533FFJuno^000000, is made of";
- mes "three isnlands.";
- next;
- mes "[Freidrich]";
- mes "These are Solomon, the islands of";
- mes "honor, Mineta, the islands of";
- mes "prosperity, and Snotora, the island";
- mes "of knowledge.";
- next;
- mes "[Freidrich]";
- mes "The location of each island is";
- mes "North-west : Solomon";
- mes "North-east : Snotora";
- mes "South : Mineta.";
- close;
-}
-
-//======================================================================================
-yuno.gat,157,87,4 script A Citizen of Yuno 102,{
- mes "[Shalima]";
- mes "When you go north from Al De Baran,";
- mes "you will arrive at 'Elmeth";
- mes "Plateau', a place covered with";
- mes "molten rock.";
- next;
- mes "[Shalima]";
- mes "On the top of a mountain connected";
- mes "to the plateau, you can find a";
- mes "bridge which leads you this";
- mes "place!,^5533FFJuno^000000, the city of Sages.";
- next;
- mes "[Shalima]";
- mes "In Juno, you can visit places such";
- mes " as the 'Juphero Plaza', 'Juno";
- mes "Conference Hall', 'Schweicherbil";
- mes "Magic Academy', or the 'Monster";
- mes "'Museum'. These places are famous";
- mes "around the world!";
- next;
- mes "[Shalima]";
- mes "You may also wish to drop by the";
- mes "'Sage Castle', where people can";
- mes "change their jobs into 'Sage', one";
- mes "of the more unique classes.";
- next;
- mes "[Shalima]";
- mes "If you're interested in the Sage";
- mes "class, why don't you go look around";
- mes "the castle?";
- close;
-}
-
-//=======================================================================================
-yuno.gat,157,205,4 script Juno Artisan 54,{
- mes "[Artisan]";
- mes "*Mumble mumble...*";
- next;
- mes "[Artisan]";
- mes "Oh, hello there. Let me introduce";
- mes "myself. I am an artisan who tries";
- mes "to succeed the rights and duties of";
- mes "item makers in Juno.";
- next;
- menu "About Powerful Equipment.",M_1,"About Unique Items",M_2,"About Authentic Food",M_3,"End Conversation",M_End;
-
- M_1:
- mes "[Artisan]";
- mes "Let me suggest the ^5533FFHoly Guard^000000 and";
- mes "^5533FFHoly Avenger^000000 which are";
- mes "special items for Crusaders.";
- next;
- mes "[Artisan]";
- mes "These pieces of equipment are very";
- mes "light and have sufficient";
- mes "abilities. They also happen to";
- mes "possess holy power.";
- next;
- mes "[Artisan]";
- mes "Therefore, this equipment is more";
- mes "powerful over some kinds of";
- mes "monsters such as Ghosts or the";
- mes "Undead.";
- next;
- mes "[Artisan]";
- mes "However it is rumored that only a";
- mes "few chosen Crusaders are able to";
- mes "obtain those items due of their";
- mes "rarity.";
- close;
-
- M_2:
- mes "[Artisan]";
- mes "It looks like a simple scroll";
- mes "marked with concentric circles and";
- mes "a star. Although the ^5533FFWorn-Out Magic^000000";
- mes "^5533FFScroll^000000 is very old, it's wanted by";
- mes "many Sages for research purposes.";
- next;
- mes "[Artisan]";
- mes "It seems you can use that item when";
- mes "you chant a high-level magic";
- mes "spell.";
- close;
-
- M_3:
- mes "[Artisan]";
- mes "^5533FFRice Cake^000000! Yes, it's a traditional";
- mes "food that's favored by a lot of";
- mes "people. There's a lot of nostalgic";
- mes "memories of old fashioned markets";
- mes "that are connected to the Rice";
- mes "Cake.";
- next;
- mes "[Artisan]";
- mes "Ahhh~";
- mes "I wish i could eat a bit of Rice";
- mes "Cake right now.";
- close;
-
- M_End:
- mes "[Artisan]";
- mes "Although Yuno is known as the city of";
- mes "Sages, I hope you understand that";
- mes "ordinary people live and prosper";
- mes "here as well. Please enjoy the";
- mes "unique atmosphere that Juno has to";
- mes "offer.";
- close;
-}
-
-//======================================================================================
-yuno.gat,336,227,4 script Juno Granny 103,{
- mes "[Granny]";
- mes "I am an old Sage granny who";
- mes "foresees everything...";
- next;
- mes "[Granny]";
- mes "Have you heard of a boss monster";
- mes "that has been around Juno for a";
- mes "long time? it's known only as the";
- mes "^FF3355Lord of the Dead^000000.";
- next;
- mes "[Granny]";
- mes "It is rumored to be from the realm";
- mes "of the dead. It brings many undead";
- mes "monsters with it, intending to lead";
- mes "living creatures to its cold and";
- mes "icy realm.";
- next;
- mes "[Granny]";
- mes "You have already chosen whether or";
- mes "not you will challenge the Lord of";
- mes "the Dead. All you need to do right";
- mes "now is understand why you made the";
- mes "decision.";
- close;
-}
-
-//========================================================================================
-yuno.gat,328,239,4 script Juno Fighter 732,{
- mes "[Sergiof]";
- mes "My name is Sergiof,";
- mes "the fighter who";
- mes "serves Granny.";
- next;
- mes "[Sergiof]";
- mes "I will tell you about ^5533FF'Grand Peco'^000000";
- mes "which is a high level Peco Peco.";
- mes "Grand Peco is faster than Peco Peco";
- mes "and is quite aggressive";
- next;
- mes "[Sergiof]";
- mes "It attacks using its strong bill";
- mes "and many Peco Pecos follow it.";
- mes "There's quite a difference in power";
- mes "between Peco Peco and the Grand";
- mes "Peco.";
- close;
-}
-
-//========================================================================================
-yuno.gat,343,68,4 script Juno Despot 730,{
- mes "[Ninno]";
- mes "Have you ever heard of an Egyptian";
- mes "king who was once believed to be a";
- mes "son of a god? his name is ^5533FFPharaoh^000000.";
- next;
- mes "[Ninno]";
- mes "He was rumored to be a high";
- mes "sorcerer that used his power to";
- mes "curse innocents. It is said that he";
- mes "is still around, placing his curses";
- mes "on people.";
- next;
- mes "[Ninno]";
- mes "As an adventurer, it's possible";
- mes "that you may see him in your";
- mes "travels. Be careful...";
- close;
-}
-
-//=======================================================================================
-yuno.gat,261,99,4 script Sage Yklah 735,{
- mes "[Yklah]";
- mes "^5533FFJuphero^000000...";
- mes "That was the name of the city that";
- mes "once existed in ancient times.";
- next;
- mes "[Yklah]";
- mes "The most intelligent and talented";
- mes "people of that time lived there,";
- mes "harnessing the pieces of Ymir's";
- mes "heart to power their civilization.";
- next;
- mes "[Yklah]";
- mes "Unfortunately, they happened to";
- mes "abuse that great power and somehow";
- mes "destroyed themselves.";
- next;
- mes "[Yklah]";
- mes "If you long to acquire God's";
- mes "knowledge, you must first be";
- mes "humble. Otherwise...";
- close;
-}
-
-//=========================================================================================
-yuno.gat,305,207,6 script Sage Syklah 735,{
- mes "[Syklah]";
- mes "The people here keep talking of";
- mes "some suspicious man living in";
- mes "Juno.";
- next;
- mes "[Syklah]";
- mes "Supposedly, he's pretty dangerous,";
- mes "and is always immersing himself in";
- mes "some kind of research.";
- next;
- mes "[Syklah]";
- mes "People already consider him a 'Mad";
- mes "Scientist', wasting his time";
- mes "studying impractical things beyond";
- mes "the understanding of normal";
- mes "people.";
- next;
- mes "[Syklah]";
- mes "It's rumored that this scientist is";
- mes "responsible for creating 'Blazer',";
- mes "a monster made of magic flame.";
- next;
- mes "[Syklah]";
- mes "It's a dangerous and fearsome";
- mes "monster that casts spells like Fire";
- mes "Bolt and Fire Ball that lives";
- mes "outside of Juno.";
- close;
-}
-
-//==========================================================================================
-yuno.gat,213,298,4 script Sage Esklah 735,{
- mes "[Esklah]";
- mes "I remember watching a harmless";
- mes "piece of paper floating";
- mes "trough the air...";
- next;
- mes "[Esklah]";
- mes "As i was thinking of how";
- mes "wonderfully poetic that image was,";
- mes "that paper suddenly attacked me!";
- mes "Me, one of Juno's greatest Sages!";
- next;
- mes "[Esklah]";
- mes "I tried defending myself with my";
- mes "trusty sword, but being paper-thin,";
- mes "that monster managed to dodge all";
- mes "of my blows. I had to cast magic in";
- mes "order to destroy it.";
- next;
- mes "[Esklah]";
- mes "Later, I learned that monster is";
- mes "known as ^FF5533The Paper^000000.";
- next;
- mes "[Esklah]";
- mes "It used to be a part of an old book";
- mes "that contained a lot of ancient";
- mes "knowledge about Juno, but somehow,";
- mes "became a monster. Isn't that";
- mes "peculiar?";
- close;
-}
-
-
-
-//======================================================================================
-yuno.gat,165,111,4 script Juno Sage 123,{
- mes "[Le Morpheous]";
- mes "^FF5533Apocalypse...^000000";
- mes "It is the name of an android that";
- mes "used to guard Juno long ago.";
- next;
- mes "[Le Morpheus]";
- mes "Because its artificial intelligence";
- mes "has corrupted over the years, it";
- mes "can no longer distinguish comrades";
- mes "from enemies. Sadly, that android";
- mes "is nothing but a mindless monster";
- mes "now.";
- close;
+//===== eAthena Script =======================================
+//= Yuno City
+//===== By: ==================================================
+//= KitsuneStarwind, kobra_k88
+//===== Current Version: =====================================
+//= 1.3.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Added additional npcs. Added Metto quest. [kobra_k88]
+//= Moved item quest to quest folder. Re-edited a majority of the npcs. [kobra_k88]
+//= Removed duplicate npcs already found in the sage quest.
+//= Fixed & Spellchecked [massdriller]
+//= 1.3 Started updating Juno NPCs based on iRO. 10% complete.
+//= 1.3.2 Started updating Juno NPCs based on iRO. 30% complete.
+//============================================================
+
+
+yuno.gat,330,100,4 script Knight 734,{
+ mes "[Leibech]";
+ mes "I have a great";
+ mes "interest in collecting";
+ mes "unique and uncommon";
+ mes "goods. You know, things";
+ mes "that most people see just";
+ mes "once in their lifetimes.";
+ next;
+ mes "[Leibech]";
+ mes "I usually use the";
+ mes "Alchesh Trading Company.";
+ mes "to help add to my collection.";
+ mes "Their prices aren't the cheapest,";
+ mes "but their service is very";
+ mes "reliable.";
+ close;
+}
+
+//======================================================================================
+yuno.gat,208,164,4 script Active little girl 101,{
+ mes "[Hisa]";
+ mes ".....";
+ mes "This town is so boring.";
+ mes "No events, no festivals...";
+ mes "All people do all day is stay";
+ mes "at home and study. How dull!";
+ close;
+}
+
+
+//======================================================================================
+yuno.gat,164,200,4 script Noyee 101,{
+ mes "[Noyee]";
+ mes "Did you know that there's a";
+ mes "difference between the armor you";
+ mes "can buy from NPC shops and the";
+ mes "kinds you obtain from hunting";
+ mes "monsters?";
+ next;
+ mes "[Noyee]";
+ mes "The difference, my friend, is in";
+ mes "the number of ^5533FFslots^000000 in your armor.";
+ next;
+ mes "[Noyee]";
+ mes "The same kind of Armor will have";
+ mes "the same Defense. However, if an";
+ mes "Armor has a slot, you can insert a";
+ mes "Monster Card which will add an";
+ mes "enhancement to that armor.";
+ next;
+ mes "[Noyee]";
+ mes "Both Monster Cards and Slotted";
+ mes "Armors are rarely dropped by";
+ mes "monsters, and are thus valuable";
+ mes "commodies.";
+ close;
+}
+
+//======================================================================================
+yuno.gat,184,173,4 script Freidrich 729,{
+ mes "[Freidrich]";
+ mes "The city of Sages,";
+ mes "^5533FFJuno^000000, is made of";
+ mes "three isnlands.";
+ next;
+ mes "[Freidrich]";
+ mes "These are Solomon, the islands of";
+ mes "honor, Mineta, the islands of";
+ mes "prosperity, and Snotora, the island";
+ mes "of knowledge.";
+ next;
+ mes "[Freidrich]";
+ mes "The location of each island is";
+ mes "North-west : Solomon";
+ mes "North-east : Snotora";
+ mes "South : Mineta.";
+ close;
+}
+
+//======================================================================================
+yuno.gat,157,87,4 script A Citizen of Yuno 102,{
+ mes "[Shalima]";
+ mes "When you go north from Al De Baran,";
+ mes "you will arrive at 'Elmeth";
+ mes "Plateau', a place covered with";
+ mes "molten rock.";
+ next;
+ mes "[Shalima]";
+ mes "On the top of a mountain connected";
+ mes "to the plateau, you can find a";
+ mes "bridge which leads you this";
+ mes "place!,^5533FFJuno^000000, the city of Sages.";
+ next;
+ mes "[Shalima]";
+ mes "In Juno, you can visit places such";
+ mes " as the 'Juphero Plaza', 'Juno";
+ mes "Conference Hall', 'Schweicherbil";
+ mes "Magic Academy', or the 'Monster";
+ mes "'Museum'. These places are famous";
+ mes "around the world!";
+ next;
+ mes "[Shalima]";
+ mes "You may also wish to drop by the";
+ mes "'Sage Castle', where people can";
+ mes "change their jobs into 'Sage', one";
+ mes "of the more unique classes.";
+ next;
+ mes "[Shalima]";
+ mes "If you're interested in the Sage";
+ mes "class, why don't you go look around";
+ mes "the castle?";
+ close;
+}
+
+//=======================================================================================
+yuno.gat,157,205,4 script Juno Artisan 54,{
+ mes "[Artisan]";
+ mes "*Mumble mumble...*";
+ next;
+ mes "[Artisan]";
+ mes "Oh, hello there. Let me introduce";
+ mes "myself. I am an artisan who tries";
+ mes "to succeed the rights and duties of";
+ mes "item makers in Juno.";
+ next;
+ menu "About Powerful Equipment.",M_1,"About Unique Items",M_2,"About Authentic Food",M_3,"End Conversation",M_End;
+
+ M_1:
+ mes "[Artisan]";
+ mes "Let me suggest the ^5533FFHoly Guard^000000 and";
+ mes "^5533FFHoly Avenger^000000 which are";
+ mes "special items for Crusaders.";
+ next;
+ mes "[Artisan]";
+ mes "These pieces of equipment are very";
+ mes "light and have sufficient";
+ mes "abilities. They also happen to";
+ mes "possess holy power.";
+ next;
+ mes "[Artisan]";
+ mes "Therefore, this equipment is more";
+ mes "powerful over some kinds of";
+ mes "monsters such as Ghosts or the";
+ mes "Undead.";
+ next;
+ mes "[Artisan]";
+ mes "However it is rumored that only a";
+ mes "few chosen Crusaders are able to";
+ mes "obtain those items due of their";
+ mes "rarity.";
+ close;
+
+ M_2:
+ mes "[Artisan]";
+ mes "It looks like a simple scroll";
+ mes "marked with concentric circles and";
+ mes "a star. Although the ^5533FFWorn-Out Magic^000000";
+ mes "^5533FFScroll^000000 is very old, it's wanted by";
+ mes "many Sages for research purposes.";
+ next;
+ mes "[Artisan]";
+ mes "It seems you can use that item when";
+ mes "you chant a high-level magic";
+ mes "spell.";
+ close;
+
+ M_3:
+ mes "[Artisan]";
+ mes "^5533FFRice Cake^000000! Yes, it's a traditional";
+ mes "food that's favored by a lot of";
+ mes "people. There's a lot of nostalgic";
+ mes "memories of old fashioned markets";
+ mes "that are connected to the Rice";
+ mes "Cake.";
+ next;
+ mes "[Artisan]";
+ mes "Ahhh~";
+ mes "I wish i could eat a bit of Rice";
+ mes "Cake right now.";
+ close;
+
+ M_End:
+ mes "[Artisan]";
+ mes "Although Yuno is known as the city of";
+ mes "Sages, I hope you understand that";
+ mes "ordinary people live and prosper";
+ mes "here as well. Please enjoy the";
+ mes "unique atmosphere that Juno has to";
+ mes "offer.";
+ close;
+}
+
+//======================================================================================
+yuno.gat,336,227,4 script Juno Granny 103,{
+ mes "[Granny]";
+ mes "I am an old Sage granny who";
+ mes "foresees everything...";
+ next;
+ mes "[Granny]";
+ mes "Have you heard of a boss monster";
+ mes "that has been around Juno for a";
+ mes "long time? it's known only as the";
+ mes "^FF3355Lord of the Dead^000000.";
+ next;
+ mes "[Granny]";
+ mes "It is rumored to be from the realm";
+ mes "of the dead. It brings many undead";
+ mes "monsters with it, intending to lead";
+ mes "living creatures to its cold and";
+ mes "icy realm.";
+ next;
+ mes "[Granny]";
+ mes "You have already chosen whether or";
+ mes "not you will challenge the Lord of";
+ mes "the Dead. All you need to do right";
+ mes "now is understand why you made the";
+ mes "decision.";
+ close;
+}
+
+//========================================================================================
+yuno.gat,328,239,4 script Juno Fighter 732,{
+ mes "[Sergiof]";
+ mes "My name is Sergiof,";
+ mes "the fighter who";
+ mes "serves Granny.";
+ next;
+ mes "[Sergiof]";
+ mes "I will tell you about ^5533FF'Grand Peco'^000000";
+ mes "which is a high level Peco Peco.";
+ mes "Grand Peco is faster than Peco Peco";
+ mes "and is quite aggressive";
+ next;
+ mes "[Sergiof]";
+ mes "It attacks using its strong bill";
+ mes "and many Peco Pecos follow it.";
+ mes "There's quite a difference in power";
+ mes "between Peco Peco and the Grand";
+ mes "Peco.";
+ close;
+}
+
+//========================================================================================
+yuno.gat,343,68,4 script Juno Despot 730,{
+ mes "[Ninno]";
+ mes "Have you ever heard of an Egyptian";
+ mes "king who was once believed to be a";
+ mes "son of a god? his name is ^5533FFPharaoh^000000.";
+ next;
+ mes "[Ninno]";
+ mes "He was rumored to be a high";
+ mes "sorcerer that used his power to";
+ mes "curse innocents. It is said that he";
+ mes "is still around, placing his curses";
+ mes "on people.";
+ next;
+ mes "[Ninno]";
+ mes "As an adventurer, it's possible";
+ mes "that you may see him in your";
+ mes "travels. Be careful...";
+ close;
+}
+
+//=======================================================================================
+yuno.gat,261,99,4 script Sage Yklah 735,{
+ mes "[Yklah]";
+ mes "^5533FFJuphero^000000...";
+ mes "That was the name of the city that";
+ mes "once existed in ancient times.";
+ next;
+ mes "[Yklah]";
+ mes "The most intelligent and talented";
+ mes "people of that time lived there,";
+ mes "harnessing the pieces of Ymir's";
+ mes "heart to power their civilization.";
+ next;
+ mes "[Yklah]";
+ mes "Unfortunately, they happened to";
+ mes "abuse that great power and somehow";
+ mes "destroyed themselves.";
+ next;
+ mes "[Yklah]";
+ mes "If you long to acquire God's";
+ mes "knowledge, you must first be";
+ mes "humble. Otherwise...";
+ close;
+}
+
+//=========================================================================================
+yuno.gat,305,207,6 script Sage Syklah 735,{
+ mes "[Syklah]";
+ mes "The people here keep talking of";
+ mes "some suspicious man living in";
+ mes "Juno.";
+ next;
+ mes "[Syklah]";
+ mes "Supposedly, he's pretty dangerous,";
+ mes "and is always immersing himself in";
+ mes "some kind of research.";
+ next;
+ mes "[Syklah]";
+ mes "People already consider him a 'Mad";
+ mes "Scientist', wasting his time";
+ mes "studying impractical things beyond";
+ mes "the understanding of normal";
+ mes "people.";
+ next;
+ mes "[Syklah]";
+ mes "It's rumored that this scientist is";
+ mes "responsible for creating 'Blazer',";
+ mes "a monster made of magic flame.";
+ next;
+ mes "[Syklah]";
+ mes "It's a dangerous and fearsome";
+ mes "monster that casts spells like Fire";
+ mes "Bolt and Fire Ball that lives";
+ mes "outside of Juno.";
+ close;
+}
+
+//==========================================================================================
+yuno.gat,213,298,4 script Sage Esklah 735,{
+ mes "[Esklah]";
+ mes "I remember watching a harmless";
+ mes "piece of paper floating";
+ mes "trough the air...";
+ next;
+ mes "[Esklah]";
+ mes "As i was thinking of how";
+ mes "wonderfully poetic that image was,";
+ mes "that paper suddenly attacked me!";
+ mes "Me, one of Juno's greatest Sages!";
+ next;
+ mes "[Esklah]";
+ mes "I tried defending myself with my";
+ mes "trusty sword, but being paper-thin,";
+ mes "that monster managed to dodge all";
+ mes "of my blows. I had to cast magic in";
+ mes "order to destroy it.";
+ next;
+ mes "[Esklah]";
+ mes "Later, I learned that monster is";
+ mes "known as ^FF5533The Paper^000000.";
+ next;
+ mes "[Esklah]";
+ mes "It used to be a part of an old book";
+ mes "that contained a lot of ancient";
+ mes "knowledge about Juno, but somehow,";
+ mes "became a monster. Isn't that";
+ mes "peculiar?";
+ close;
+}
+
+
+
+//======================================================================================
+yuno.gat,165,111,4 script Juno Sage 123,{
+ mes "[Le Morpheous]";
+ mes "^FF5533Apocalypse...^000000";
+ mes "It is the name of an android that";
+ mes "used to guard Juno long ago.";
+ next;
+ mes "[Le Morpheus]";
+ mes "Because its artificial intelligence";
+ mes "has corrupted over the years, it";
+ mes "can no longer distinguish comrades";
+ mes "from enemies. Sadly, that android";
+ mes "is nothing but a mindless monster";
+ mes "now.";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/Auctioneer.txt b/npc/custom/Auctioneer.txt
index 9a36bc268..14ca7d331 100644
--- a/npc/custom/Auctioneer.txt
+++ b/npc/custom/Auctioneer.txt
@@ -1,563 +1,563 @@
-//===== eAthena Script ======================================================================
-//= 1. Auctioneer
-//= 2. Auction Helping (Gives info only, but still good to have in)
-//===== Original By =========================================================================
-//= Fredzilla
-//===== Helped By ===========================================================================
-//= Not one quite yet, but you never know ;)
-//===== Current Version: ====================================================================
-//= 1.0 (Beta) < Thats means it is in testing
-//===== Compatible With: ====================================================================
-//= Any eAthena, that also has a script_athena.conf
-//===== Description: ========================================================================
-//= Lets a people place items into an auction, max of 10 items per round
-//= People can bid on them item
-//= Then buy the items, and sellers pickup there money
-//===== Comments and Credits ===========================================================
-//= This script would not have been made possible if it was not for "Maeki Rika"
-//= My praise goes out to her for finding out all the things we can do with the
-//= current system that eAthena uses
-//=
-//= More comments are listed down the page, in a attempt to explain what is going on in each
-//= section of the script
-//=
-//= This script is currently in testing, and any loss of items will, not only need to be
-//= reported inside the thread I made for this script, but be replaced by GM if proof was given :D
-//===========================================================================================
-
-prontera.gat,153,193,5 script Auctioneer 807,{
- mes "[Auctioneer]";
- set @num,0;
-// These few line below are to recover item that would be lost due to a new auction starting
-L_RNameLoop:
- if(strcharinfo(0)==$ANamesB$[@num] && $paidB[@num]==0) goto L_RBackup;
- set @num,@num+1;
- if(@num<10) goto L_RNameLoop;
- if($Auction==1) goto L_Register;
- if($Auction==2) goto L_Bid;
- if($Auction==3) goto L_PayPickup;
-
-// After a server restart, and no auction value is set, it will run this
-// People who placed items in there before the restart should still be to retrieve there items
-
- mes "You are able to sell and buy things inside the auction, unfortunately nothing has been started, you need to wait for the auction to start";
- mes "No items lost will be given back, please remember you used this at your own risk";
- next;
- mes "[Auctioneer]";
- mes "I am very sorry if you have lost items";
- close;
-
-// If the Auction has started, it will run this, during this time items can be registerd and registerd items retrieved
-
-L_Register:
- mes "Welcome to the auction, you may register you items at this time";
- next;
- set @num,0;
-L_NameLoop:
- if(strcharinfo(0)==$ANames$[@num]) goto L_Already;
- set @num,@num+1;
- if(@num<10) goto L_NameLoop;
- if(getarraysize($AItems)==10) goto L_AFull;
- menu "I want to register an item now",L_IRegister,"I dont want to leave an item",-;
-L_End:
- mes "[Auctioneer]";
- mes "Ok, come back whenever";
- close;
-L_IRegister:
- mes "[Auctioneer]";
- mes "Listed below is the first 10 items you have on you now";
- mes "What do you want to register?";
- next;
- set @array,0;
- set @item,500;
-// set @loopcount,0;
-L_ILoop:
-// set @loopcount,@loopcount+1;
-// debugmes @loopcount;
- set @item,@item+1;
- if(@item>=13005) goto L_Menu;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- set @item,@item+1;
- if(countitem(@item)>0) set @item2[@array],@item;
- if(countitem(@item)>0) set @array,@array+1;
- if(@array==10) goto L_Menu;
- goto L_ILoop;
-L_Menu:
- menu getitemname(@item2[0]),-,getitemname(@item2[1]),-,getitemname(@item2[2]),-,getitemname(@item2[3]),-,getitemname(@item2[4]),-,getitemname(@item2[5]),-,getitemname(@item2[6]),-,getitemname(@item2[7]),-,getitemname(@item2[8]),-,getitemname(@item2[9]),-,"Next Page",L_WipeLoop;
- set @setitem,@item2[@menu-1];
- set @num,0;
-L_SorryLoop:
- set @num,@num+1;
- if(@menu==@num && @setitem == 0) goto L_Sorry;
- if(@num==10) goto L_FinalReg;
- goto L_SorryLoop;
-L_FinalReg:
- mes "[Auctioneer]";
- mes "Please remember that if this item does contain cards, or is crafted, these distinctions will be lost when it is put into the auction";
- mes "This also means if you get the item back, that this applies to, you will have lost out";
- mes " ";
- mes "So you want to register your "+getitemname(@setitem);
- next;
- menu "Yes please",-,"No",L_End;
- mes "[Auctioneer]";
- mes "Ok I will register this item now";
- next;
- set @amount,1;
- if(countitem(@setitem)==1) goto L_FinalInput;
- mes "[Auctioneer]";
- mes "Wait a minute it seems you have more than one of that item, please enter the ammount you want to put in the aution";
- next;
- input @amount;
- if(countitem(@setitem)<@amount) goto L_NotEnough;
-L_FinalInput:
- set $AItems[$array],@setitem;
- set $ANames$[$array],strcharinfo(0);
- set $AAmount[$array],@amount;
- set $array,$array+1;
- delitem @setitem,@amount;
- mes "[Auctioneer]";
- mes "You item has been taken into storage, ready for sale, the auction will begin soon, watch for the announcment";
- close;
-L_AFull:
- mes "[Auctioneer]";
- mes "Oh, sorry, it seems my auction is full this time round, please try in the next one";
- close;
-L_WipeLoop:
- deletearray @item2[0],10;
- set @array,0;
- goto L_ILoop;
-L_Sorry:
- mes "[Auctioneer]";
- mes "It seems that is all you have to offer me, come back when you know what you want to sell";
- close;
-L_Already:
- mes "[Auctioneer]";
- mes "It seems you already have have an item registerd here, would you like to retrieve your item?";
- next;
- menu "Yes",-,"No",L_End;
- getitem $AItems[@num],$AAmount[@num];
-L_AItemsLoop:
- set $AItems[@num],$AItems[@num+1];
- set $ANames$[@num],$ANames$[@num+1];
- set $AAmount[@num],$AAmount[@num+1];
- set @num,@num+1;
- if(@num<10) goto L_AItemsLoop;
- set $array,$array-1;
- set @num,0;
- mes "[Auctioneer]";
- mes "Ok, all items present and acounted for, have a nice day";
- close;
-L_NotEnough:
- mes "[Auctioneer]";
- mes "Seems you dont have that much "+getitemname(@setitem)+"'s";
- close;
-// If the Auction has enterd phase 2, it will run this, during this time items you can bid on registerd
-// No items can be retrieved during this time, they are now stuck
-
-L_Bid:
- mes "What would you like to bid on?";
- next;
- set @num,0;
-L_MenuLoop:
- set @menu$[@num],$AAmount[@num]+" x "+getitemname($AItems[@num])+" "+$bid[@num]+"z";
- set @num,@num+1;
- if($AItems[@num]!=0) goto L_MenuLoop;
- menu
- @menu$[0],-,
- @menu$[1],-,
- @menu$[2],-,
- @menu$[3],-,
- @menu$[4],-,
- @menu$[5],-,
- @menu$[6],-,
- @menu$[7],-,
- @menu$[8],-,
- @menu$[9],-;
- mes "[Auctioneer]";
- set @num,@menu-1;
- if(strcharinfo(0)==$ANames$[@num]) goto L_CantBid;
-L_ReBid:
- mes "You are currently bidding on "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
- mes "The current bid is at "+$bid[@num]+"z";
- mes "This was made by "+$bidders$[@num];
- if($bidders$[@num]==strcharinfo(0)) goto L_AlreadyBid;
- mes "How much do you want to bid yourself";
- mes "(Use 0 to cancel at this point)";
- next;
- input @bid;
- if(@bid<=0) goto L_End;
- if(zeny<@bid) goto L_LowZeny;
- if(@bid<$bid[@num]) goto L_LowBid;
- mes "[Auctioneer]";
- mes "You are about to bid "+@bid+"z for "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
- mes "Are you sure?";
- next;
- menu "Yes",-,"No",L_End;
- set $bid[@num],@bid;
- set $bidders$[@num],strcharinfo(0);
- mes "[Auctioneer]";
- mes "Your bid has been entered";
- close;
-L_LowZeny:
- mes "[Auctioneer]";
- mes "Sorry you need to show me that amount as proof you could pay, if you do win";
- mes "Please either get more money, or bid lower";
- close;
-L_CantBid:
- mes "Sorry, you cant bid on your own lots";
- close;
-L_LowBid:
- mes "[Auctioneer]";
- mes "Your bid seems lower than the current one, try entering a higher ammount of zeny";
- next;
- mes "[Auctioneer]";
- goto L_ReBid;
-L_AlreadyBid:
- mes "Hey wait, that is you, you can't bid again";
- close;
-// If the Auction has entered phase 3, it will run this
-// During this time, items that have been bid on can be bought
-// Items not bid on can be picked back up by the seller
-// And if any of the items have been bought, and are paid for, seller can pick up their money
-
-L_PayPickup:
- mes "The auction has now ended";
- mes "What would you like to do?";
- next;
- menu "Check for items I have sold",-,"Check for items I have won",L_Won,"Nothing",L_End;
-
-// Check starts here for if you have sold anything during this auction
-
- set @num,0;
-L_SoldLoop:
- if($ANames$[@num]==strcharinfo(0)) goto L_Sold;
- set @num,@num+1;
- if(@num<10) goto L_SoldLoop;
- mes "[Auctioneer]";
- mes "Sorry it seems you have either picked up all you items, money";
- mes "or you didnt register any items in this auction";
- close;
-L_Sold:
- mes "[Auctioneer]";
- if($paid[@num]==3) goto L_Returned;
- mes "Ah I see here, you sold your "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
- mes "Lets see here it sold for";
- next;
- if($bid[@num]==0) goto L_GiveBack;
- if($paid[@num]==2) goto L_AlreadyPaid;
- mes "[Auctioneer]";
- mes $bid[@num]+"z and "+$bidders$[@num]+" bought it from you";
- if($paid[@num]!=1) goto L_NoMoney;
- mes "They have fully paid for it, so here is your money";
- next;
- set zeny,zeny+$bid[@num];
- set $paid[@num],2;
- goto L_End;
-L_AlreadyPaid:
- mes "[Auctioneer]";
- mes "Hmm, seems you already have you money for this lot, not trying to con me are you?";
- close;
-L_Returned:
- mes "[Auctioneer]";
- mes "Seems we returned you item already";
- close;
-L_GiveBack:
- mes "[Auctioneer]";
- mes "Seems no-one wanted your item(s)";
- mes "So you can have them back now";
- getitem $AItems[@num],$AAmount[@num];
- set $paid[@num],3;
- close;
-L_NoMoney:
- mes "Sorry to say this but they havent paid this yet";
- mes "You can go and talk to them now, or you can wait";
- mes "If they havent paid by the time the next Auction starts come back to me to retrieve your item(s)";
- close;
-
-// Check starts here for if you won any items during this auction, futher options follow
-
-L_Won:
- set @num,0;
- mes "[Auctioneer]";
-L_WonLoop:
- if($bidders$[@num]==strcharinfo(0)) goto L_Winner;
-L_CarryOn:
- set @num,@num+1;
- if(@num<10) goto L_WonLoop;
- mes "Sorry you didnt win any of the lots, please try again next time";
- close;
-L_Winner:
- if($paid[@num]>0) goto L_CarryOn;
- mes "Well it does seem you have won an item";
- mes "You won "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
- mes "And you bid "+$bid[@num]+"z for this lot";
- mes "What do you want to do now?";
- next;
-
-// At this point they can choose from 3 options, to Buy the current lot
-// see the next one they might have won, or give up that lot
-
- menu "Buy this lot",-,"See Next Lot you won",L_CarryOn,"Relinquish this lot",L_Back;
- if(zeny<$bid[@num]) goto L_2lowzeny;
- set zeny,zeny-$bid[@num];
- getitem $AItems[@num],$AAmount[@num];
- set $paid[@num],1;
- mes "[Auctioneer]";
- mes "Our transaction is completed";
- mes "See you again soon";
- close;
-L_2lowzeny:
- mes "[Auctioneer]";
- mes "Sorry it seems you dont have enough zeny on you, please acquire more";
- close;
-L_Back:
- mes "[Auctioneer]";
- mes "Are you sure you want to give up this lot?";
- next;
- menu "Yes",-,"No",L_End;
- set $bid[@num],0;
- set $bidders$[@num],"no-one";
- mes "[Auctioneer]";
- mes "It is done, you might want to tell "+$ANames$[@num]+" they can come and pickup his item(s)";
- close;
-
-// All the times that will start the Auction
-
-OnClock0100:
-OnClock0400:
-OnClock0700:
-OnClock1000:
-OnClock1300:
-OnClock1600:
-OnClock1900:
-OnClock2200:
-// Starting Backup
- copyarray $AItemsB[0],$AItems[0],10;
- copyarray $ANamesB$[0],$ANames$[0],10;
- copyarray $AAmountB[0],$AAmount[0],10;
- copyarray $paidB[0],$paid[0],10;
-// End backup - Start Wiping
- deletearray $paid[0],10;
- deletearray $bid[0],10;
- deletearray $bidders$[0],10;
- deletearray $AItems[0],10;
- deletearray $ANames$[0],10;
- deletearray $AAmount[0],10;
- set $array,0;
-// End Wiping - Begin Announce + Phase setting
- announce "Registration time has begun, see the Auctioneer to register your items",0;
- cleararray $bidders$[0],"no-one",10;
- set $Auction,1;
- end;
-
-// All the times that will start the bidding section
-
-OnClock0200:
-OnClock0500:
-OnClock0800:
-OnClock1100:
-OnClock1400:
-OnClock1700:
-OnClock2000:
-OnClock2300:
- if($Auction==0) end;
- announce "Registration time has ended, time for the biding to begin",0;
- set $Auction,2;
- initnpctimer;
- end;
-
-// All the times that will start the last phase, buying and seller, and item retrieval
-
-OnClock0300:
-OnClock0600:
-OnClock0900:
-OnClock1200:
-OnClock1500:
-OnClock1800:
-OnClock2100:
-OnClock0000:
- if($Auction==0) end;
- announce "Bidding time has ended, see the Auctioneer to get your items, or money",0;
- set $Auction,3;
- end;
-
-// On the start of the server it will reset the Auction state, but not the items it contains
-// so people still have have a chance to retrieve there lost items
-
-OnInit:
- copyarray $AItemsB[0],$AItems[0],10;
- copyarray $ANamesB$[0],$ANames$[0],10;
- copyarray $AAmountB[0],$AAmount[0],10;
- copyarray $paidB[0],$paid[0],10;
- deletearray $paid[0],10;
- deletearray $bid[0],10;
- deletearray $bidders$[0],10;
- deletearray $AItems[0],10;
- deletearray $ANames$[0],10;
- deletearray $AAmount[0],10;
- set $array,0;
- set $Auction,0;
- end;
-
-// All below is for anouncing the items in this auction, if there are none it will say so
-// and if there are none in there at the start of phase 2 it will reset the auctions state
-// This is to stop the auction ending message, and will only start again when it reachs phase 1 again
-
-OnTimer5000:
- announce "Today in our auction we have",0;
- end;
-OnTimer7000:
- if($AItems[0]==0) setnpctimer 25001;
- if($AAmount[0]==1) announce "A lovely "+getitemname($AItems[0])+" left by "+$ANames$[0],0;
- if($AAmount[0]>1) announce $AAmount[0]+" lovely "+getitemname($AItems[0])+" left by "+$ANames$[0],0;
- end;
-OnTimer9000:
- if($AItems[1]==0) setnpctimer 25001;
- if($AAmount[1]==1) announce "A great "+getitemname($AItems[1])+" left by "+$ANames$[1],0;
- if($AAmount[1]>1) announce $AAmount[1]+" great "+getitemname($AItems[1])+" left by "+$ANames$[1],0;
- end;
-OnTimer11000:
- if($AItems[2]==0) setnpctimer 25001;
- if($AAmount[2]==1) announce "A excellent "+getitemname($AItems[2])+" left by "+$ANames$[2],0;
- if($AAmount[2]>1) announce $AAmount[2]+" excellent "+getitemname($AItems[2])+" left by "+$ANames$[2],0;
- end;
-OnTimer13000:
- if($AItems[3]==0) setnpctimer 25001;
- if($AAmount[3]==1) announce "A superb "+getitemname($AItems[3])+" left by "+$ANames$[3],0;
- if($AAmount[3]>1) announce $AAmount[3]+" superb "+getitemname($AItems[3])+" left by "+$ANames$[3],0;
- end;
-OnTimer15000:
- if($AItems[4]==0) setnpctimer 25001;
- if($AAmount[4]==1) announce "A terrific "+getitemname($AItems[4])+" left by "+$ANames$[4],0;
- if($AAmount[4]>1) announce $AAmount[4]+" terrific "+getitemname($AItems[4])+" left by "+$ANames$[4],0;
- end;
-OnTimer17000:
- if($AItems[5]==0) setnpctimer 25001;
- if($AAmount[5]==1) announce "A wonderful "+getitemname($AItems[5])+" left by "+$ANames$[5],0;
- if($AAmount[5]>1) announce $AAmount[5]+" wonderful "+getitemname($AItems[5])+" left by "+$ANames$[5],0;
- end;
-OnTimer19000:
- if($AItems[6]==0) setnpctimer 25001;
- if($AAmount[6]==1) announce "A pretty "+getitemname($AItems[6])+" left by "+$ANames$[6],0;
- if($AAmount[6]>1) announce $AAmount[6]+" pretty "+getitemname($AItems[6])+" left by "+$ANames$[6],0;
- end;
-OnTimer21000:
- if($AItems[7]==0) setnpctimer 25001;
- if($AAmount[7]==1) announce "A sweet "+getitemname($AItems[7])+" left by "+$ANames$[7],0;
- if($AAmount[7]>1) announce $AAmount[7]+" sweet "+getitemname($AItems[7])+" left by "+$ANames$[7],0;
- end;
-OnTimer23000:
- if($AItems[8]==0) setnpctimer 25001;
- if($AAmount[8]==1) announce "A stunning "+getitemname($AItems[8])+" left by "+$ANames$[8],0;
- if($AAmount[8]>1) announce $AAmount[8]+" stunning "+getitemname($AItems[8])+" left by "+$ANames$[8],0;
- end;
-OnTimer25000:
- if($AItems[9]==0) end;
- if($AAmount[9]==1) announce "A fine "+getitemname($AItems[9])+" left by "+$ANames$[9],0;
- if($AAmount[9]>1) announce $AAmount[9]+" fine "+getitemname($AItems[9])+" left by "+$ANames$[9],0;
-OnTimer27000:
- if($AItems[0]!=0) announce "That is all the items we have this time round, so get bidding",0;
- if($AItems[0]==0) announce "Seems there are no items this time round",0;
- if($AItems[0]==0) set $Auction,0;
- stopnpctimer;
- setnpctimer 0;
- end;
-
-// this is only be run if you own any items left over, not paid for, from the last auction, or the server failed, and items are left over
-
-L_RBackup:
- mes "You seem to have items left over from the last auction, here you go, have it back";
- next;
- getitem $AItemsB[@num],$AAmountB[@num];
-L_BItemsLoop:
- set $AItemsB[@num],$AItemsB[@num+1];
- set $ANamesB$[@num],$ANamesB$[@num+1];
- set $AAmountB[@num],$AAmountB[@num+1];
- set @num,@num+1;
- if(@num<10) goto L_BItemsLoop;
- mes "[Auctioneer]";
- mes "Have a nice day";
- close;
-}
-
-// Only for display purposes, and telling people info about the auction
-// Can also be used for finding out what phase the auction is in
-
-prontera.gat,158,193,3 script Auction Helper 833,{
- mes "[Auction Helper]";
- set @num,0;
- if($Auction==0 && $AItemsB[@num]!=0) goto L_ItemRecover;
- if(($Auction==1 || $Auction ==2) && $AItems[@num]!=0) goto L_LLoop;
- if($Auction==3 && $AItems[@num]!=0) goto L_Win;
- mes "Ok Currently we have nothing in the auction.";
- mes "Please return at the correct time.";
- close;
-L_LLoop:
- mes "Ok Currently we have :-";
-L_Loop:
- mes $ANames$[@num]+" with "+$AAmount[@num]+" x "+getitemname($AItems[@num])+"('s)";
- set @num,@num+1;
- if($AItems[@num]==0) close;
- if(@num<10) goto L_Loop;
- close;
-L_ItemRecover:
- mes "Seems there was a problem, and the auction ended prematurely.";
- mes "This means we still have :-";
-L_BLoop:
- if($paid[@num]==0) mes $ANamesB$[@num]+" with "+$AAmountB[@num]+" x "+getitemname($AItemsB[@num])+"('s)";
- set @num,@num+1;
- if($AItems[@num]==0) close;
- if(@num<10) goto L_BLoop;
- close;
-L_Win:
- mes "The Auction is in the last stage, at this point you can :-";
- mes " * buy your items";
- mes " * Pick-up you money";
- mes "(or if you were unlucky)";
- mes " * Pick-up unsold items";
- next;
- mes "[Auction Helper]";
- mes "Here is a list of Sellers and Winners";
- set @num,0;
-L_Loop2:
- mes $ANames$[@num]+" with "+$AAmount[@num]+" "+getitemname($AItems[@num])+"('s), won by "+$bidders$[@num]+" for "+$bid[@num]+"z";
- set @num,@num+1;
- if($AItems[@num]==0) close;
- if(@num<10) goto L_Loop2;
- close;
-
-}
+//===== eAthena Script ======================================================================
+//= 1. Auctioneer
+//= 2. Auction Helping (Gives info only, but still good to have in)
+//===== Original By =========================================================================
+//= Fredzilla
+//===== Helped By ===========================================================================
+//= Not one quite yet, but you never know ;)
+//===== Current Version: ====================================================================
+//= 1.0 (Beta) < Thats means it is in testing
+//===== Compatible With: ====================================================================
+//= Any eAthena, that also has a script_athena.conf
+//===== Description: ========================================================================
+//= Lets a people place items into an auction, max of 10 items per round
+//= People can bid on them item
+//= Then buy the items, and sellers pickup there money
+//===== Comments and Credits ===========================================================
+//= This script would not have been made possible if it was not for "Maeki Rika"
+//= My praise goes out to her for finding out all the things we can do with the
+//= current system that eAthena uses
+//=
+//= More comments are listed down the page, in a attempt to explain what is going on in each
+//= section of the script
+//=
+//= This script is currently in testing, and any loss of items will, not only need to be
+//= reported inside the thread I made for this script, but be replaced by GM if proof was given :D
+//===========================================================================================
+
+prontera.gat,153,193,5 script Auctioneer 807,{
+ mes "[Auctioneer]";
+ set @num,0;
+// These few line below are to recover item that would be lost due to a new auction starting
+L_RNameLoop:
+ if(strcharinfo(0)==$ANamesB$[@num] && $paidB[@num]==0) goto L_RBackup;
+ set @num,@num+1;
+ if(@num<10) goto L_RNameLoop;
+ if($Auction==1) goto L_Register;
+ if($Auction==2) goto L_Bid;
+ if($Auction==3) goto L_PayPickup;
+
+// After a server restart, and no auction value is set, it will run this
+// People who placed items in there before the restart should still be to retrieve there items
+
+ mes "You are able to sell and buy things inside the auction, unfortunately nothing has been started, you need to wait for the auction to start";
+ mes "No items lost will be given back, please remember you used this at your own risk";
+ next;
+ mes "[Auctioneer]";
+ mes "I am very sorry if you have lost items";
+ close;
+
+// If the Auction has started, it will run this, during this time items can be registerd and registerd items retrieved
+
+L_Register:
+ mes "Welcome to the auction, you may register you items at this time";
+ next;
+ set @num,0;
+L_NameLoop:
+ if(strcharinfo(0)==$ANames$[@num]) goto L_Already;
+ set @num,@num+1;
+ if(@num<10) goto L_NameLoop;
+ if(getarraysize($AItems)==10) goto L_AFull;
+ menu "I want to register an item now",L_IRegister,"I dont want to leave an item",-;
+L_End:
+ mes "[Auctioneer]";
+ mes "Ok, come back whenever";
+ close;
+L_IRegister:
+ mes "[Auctioneer]";
+ mes "Listed below is the first 10 items you have on you now";
+ mes "What do you want to register?";
+ next;
+ set @array,0;
+ set @item,500;
+// set @loopcount,0;
+L_ILoop:
+// set @loopcount,@loopcount+1;
+// debugmes @loopcount;
+ set @item,@item+1;
+ if(@item>=13005) goto L_Menu;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ set @item,@item+1;
+ if(countitem(@item)>0) set @item2[@array],@item;
+ if(countitem(@item)>0) set @array,@array+1;
+ if(@array==10) goto L_Menu;
+ goto L_ILoop;
+L_Menu:
+ menu getitemname(@item2[0]),-,getitemname(@item2[1]),-,getitemname(@item2[2]),-,getitemname(@item2[3]),-,getitemname(@item2[4]),-,getitemname(@item2[5]),-,getitemname(@item2[6]),-,getitemname(@item2[7]),-,getitemname(@item2[8]),-,getitemname(@item2[9]),-,"Next Page",L_WipeLoop;
+ set @setitem,@item2[@menu-1];
+ set @num,0;
+L_SorryLoop:
+ set @num,@num+1;
+ if(@menu==@num && @setitem == 0) goto L_Sorry;
+ if(@num==10) goto L_FinalReg;
+ goto L_SorryLoop;
+L_FinalReg:
+ mes "[Auctioneer]";
+ mes "Please remember that if this item does contain cards, or is crafted, these distinctions will be lost when it is put into the auction";
+ mes "This also means if you get the item back, that this applies to, you will have lost out";
+ mes " ";
+ mes "So you want to register your "+getitemname(@setitem);
+ next;
+ menu "Yes please",-,"No",L_End;
+ mes "[Auctioneer]";
+ mes "Ok I will register this item now";
+ next;
+ set @amount,1;
+ if(countitem(@setitem)==1) goto L_FinalInput;
+ mes "[Auctioneer]";
+ mes "Wait a minute it seems you have more than one of that item, please enter the ammount you want to put in the aution";
+ next;
+ input @amount;
+ if(countitem(@setitem)<@amount) goto L_NotEnough;
+L_FinalInput:
+ set $AItems[$array],@setitem;
+ set $ANames$[$array],strcharinfo(0);
+ set $AAmount[$array],@amount;
+ set $array,$array+1;
+ delitem @setitem,@amount;
+ mes "[Auctioneer]";
+ mes "You item has been taken into storage, ready for sale, the auction will begin soon, watch for the announcment";
+ close;
+L_AFull:
+ mes "[Auctioneer]";
+ mes "Oh, sorry, it seems my auction is full this time round, please try in the next one";
+ close;
+L_WipeLoop:
+ deletearray @item2[0],10;
+ set @array,0;
+ goto L_ILoop;
+L_Sorry:
+ mes "[Auctioneer]";
+ mes "It seems that is all you have to offer me, come back when you know what you want to sell";
+ close;
+L_Already:
+ mes "[Auctioneer]";
+ mes "It seems you already have have an item registerd here, would you like to retrieve your item?";
+ next;
+ menu "Yes",-,"No",L_End;
+ getitem $AItems[@num],$AAmount[@num];
+L_AItemsLoop:
+ set $AItems[@num],$AItems[@num+1];
+ set $ANames$[@num],$ANames$[@num+1];
+ set $AAmount[@num],$AAmount[@num+1];
+ set @num,@num+1;
+ if(@num<10) goto L_AItemsLoop;
+ set $array,$array-1;
+ set @num,0;
+ mes "[Auctioneer]";
+ mes "Ok, all items present and acounted for, have a nice day";
+ close;
+L_NotEnough:
+ mes "[Auctioneer]";
+ mes "Seems you dont have that much "+getitemname(@setitem)+"'s";
+ close;
+// If the Auction has enterd phase 2, it will run this, during this time items you can bid on registerd
+// No items can be retrieved during this time, they are now stuck
+
+L_Bid:
+ mes "What would you like to bid on?";
+ next;
+ set @num,0;
+L_MenuLoop:
+ set @menu$[@num],$AAmount[@num]+" x "+getitemname($AItems[@num])+" "+$bid[@num]+"z";
+ set @num,@num+1;
+ if($AItems[@num]!=0) goto L_MenuLoop;
+ menu
+ @menu$[0],-,
+ @menu$[1],-,
+ @menu$[2],-,
+ @menu$[3],-,
+ @menu$[4],-,
+ @menu$[5],-,
+ @menu$[6],-,
+ @menu$[7],-,
+ @menu$[8],-,
+ @menu$[9],-;
+ mes "[Auctioneer]";
+ set @num,@menu-1;
+ if(strcharinfo(0)==$ANames$[@num]) goto L_CantBid;
+L_ReBid:
+ mes "You are currently bidding on "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
+ mes "The current bid is at "+$bid[@num]+"z";
+ mes "This was made by "+$bidders$[@num];
+ if($bidders$[@num]==strcharinfo(0)) goto L_AlreadyBid;
+ mes "How much do you want to bid yourself";
+ mes "(Use 0 to cancel at this point)";
+ next;
+ input @bid;
+ if(@bid<=0) goto L_End;
+ if(zeny<@bid) goto L_LowZeny;
+ if(@bid<$bid[@num]) goto L_LowBid;
+ mes "[Auctioneer]";
+ mes "You are about to bid "+@bid+"z for "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
+ mes "Are you sure?";
+ next;
+ menu "Yes",-,"No",L_End;
+ set $bid[@num],@bid;
+ set $bidders$[@num],strcharinfo(0);
+ mes "[Auctioneer]";
+ mes "Your bid has been entered";
+ close;
+L_LowZeny:
+ mes "[Auctioneer]";
+ mes "Sorry you need to show me that amount as proof you could pay, if you do win";
+ mes "Please either get more money, or bid lower";
+ close;
+L_CantBid:
+ mes "Sorry, you cant bid on your own lots";
+ close;
+L_LowBid:
+ mes "[Auctioneer]";
+ mes "Your bid seems lower than the current one, try entering a higher ammount of zeny";
+ next;
+ mes "[Auctioneer]";
+ goto L_ReBid;
+L_AlreadyBid:
+ mes "Hey wait, that is you, you can't bid again";
+ close;
+// If the Auction has entered phase 3, it will run this
+// During this time, items that have been bid on can be bought
+// Items not bid on can be picked back up by the seller
+// And if any of the items have been bought, and are paid for, seller can pick up their money
+
+L_PayPickup:
+ mes "The auction has now ended";
+ mes "What would you like to do?";
+ next;
+ menu "Check for items I have sold",-,"Check for items I have won",L_Won,"Nothing",L_End;
+
+// Check starts here for if you have sold anything during this auction
+
+ set @num,0;
+L_SoldLoop:
+ if($ANames$[@num]==strcharinfo(0)) goto L_Sold;
+ set @num,@num+1;
+ if(@num<10) goto L_SoldLoop;
+ mes "[Auctioneer]";
+ mes "Sorry it seems you have either picked up all you items, money";
+ mes "or you didnt register any items in this auction";
+ close;
+L_Sold:
+ mes "[Auctioneer]";
+ if($paid[@num]==3) goto L_Returned;
+ mes "Ah I see here, you sold your "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
+ mes "Lets see here it sold for";
+ next;
+ if($bid[@num]==0) goto L_GiveBack;
+ if($paid[@num]==2) goto L_AlreadyPaid;
+ mes "[Auctioneer]";
+ mes $bid[@num]+"z and "+$bidders$[@num]+" bought it from you";
+ if($paid[@num]!=1) goto L_NoMoney;
+ mes "They have fully paid for it, so here is your money";
+ next;
+ set zeny,zeny+$bid[@num];
+ set $paid[@num],2;
+ goto L_End;
+L_AlreadyPaid:
+ mes "[Auctioneer]";
+ mes "Hmm, seems you already have you money for this lot, not trying to con me are you?";
+ close;
+L_Returned:
+ mes "[Auctioneer]";
+ mes "Seems we returned you item already";
+ close;
+L_GiveBack:
+ mes "[Auctioneer]";
+ mes "Seems no-one wanted your item(s)";
+ mes "So you can have them back now";
+ getitem $AItems[@num],$AAmount[@num];
+ set $paid[@num],3;
+ close;
+L_NoMoney:
+ mes "Sorry to say this but they havent paid this yet";
+ mes "You can go and talk to them now, or you can wait";
+ mes "If they havent paid by the time the next Auction starts come back to me to retrieve your item(s)";
+ close;
+
+// Check starts here for if you won any items during this auction, futher options follow
+
+L_Won:
+ set @num,0;
+ mes "[Auctioneer]";
+L_WonLoop:
+ if($bidders$[@num]==strcharinfo(0)) goto L_Winner;
+L_CarryOn:
+ set @num,@num+1;
+ if(@num<10) goto L_WonLoop;
+ mes "Sorry you didnt win any of the lots, please try again next time";
+ close;
+L_Winner:
+ if($paid[@num]>0) goto L_CarryOn;
+ mes "Well it does seem you have won an item";
+ mes "You won "+$AAmount[@num]+" x "+getitemname($AItems[@num]);
+ mes "And you bid "+$bid[@num]+"z for this lot";
+ mes "What do you want to do now?";
+ next;
+
+// At this point they can choose from 3 options, to Buy the current lot
+// see the next one they might have won, or give up that lot
+
+ menu "Buy this lot",-,"See Next Lot you won",L_CarryOn,"Relinquish this lot",L_Back;
+ if(zeny<$bid[@num]) goto L_2lowzeny;
+ set zeny,zeny-$bid[@num];
+ getitem $AItems[@num],$AAmount[@num];
+ set $paid[@num],1;
+ mes "[Auctioneer]";
+ mes "Our transaction is completed";
+ mes "See you again soon";
+ close;
+L_2lowzeny:
+ mes "[Auctioneer]";
+ mes "Sorry it seems you dont have enough zeny on you, please acquire more";
+ close;
+L_Back:
+ mes "[Auctioneer]";
+ mes "Are you sure you want to give up this lot?";
+ next;
+ menu "Yes",-,"No",L_End;
+ set $bid[@num],0;
+ set $bidders$[@num],"no-one";
+ mes "[Auctioneer]";
+ mes "It is done, you might want to tell "+$ANames$[@num]+" they can come and pickup his item(s)";
+ close;
+
+// All the times that will start the Auction
+
+OnClock0100:
+OnClock0400:
+OnClock0700:
+OnClock1000:
+OnClock1300:
+OnClock1600:
+OnClock1900:
+OnClock2200:
+// Starting Backup
+ copyarray $AItemsB[0],$AItems[0],10;
+ copyarray $ANamesB$[0],$ANames$[0],10;
+ copyarray $AAmountB[0],$AAmount[0],10;
+ copyarray $paidB[0],$paid[0],10;
+// End backup - Start Wiping
+ deletearray $paid[0],10;
+ deletearray $bid[0],10;
+ deletearray $bidders$[0],10;
+ deletearray $AItems[0],10;
+ deletearray $ANames$[0],10;
+ deletearray $AAmount[0],10;
+ set $array,0;
+// End Wiping - Begin Announce + Phase setting
+ announce "Registration time has begun, see the Auctioneer to register your items",0;
+ cleararray $bidders$[0],"no-one",10;
+ set $Auction,1;
+ end;
+
+// All the times that will start the bidding section
+
+OnClock0200:
+OnClock0500:
+OnClock0800:
+OnClock1100:
+OnClock1400:
+OnClock1700:
+OnClock2000:
+OnClock2300:
+ if($Auction==0) end;
+ announce "Registration time has ended, time for the biding to begin",0;
+ set $Auction,2;
+ initnpctimer;
+ end;
+
+// All the times that will start the last phase, buying and seller, and item retrieval
+
+OnClock0300:
+OnClock0600:
+OnClock0900:
+OnClock1200:
+OnClock1500:
+OnClock1800:
+OnClock2100:
+OnClock0000:
+ if($Auction==0) end;
+ announce "Bidding time has ended, see the Auctioneer to get your items, or money",0;
+ set $Auction,3;
+ end;
+
+// On the start of the server it will reset the Auction state, but not the items it contains
+// so people still have have a chance to retrieve there lost items
+
+OnInit:
+ copyarray $AItemsB[0],$AItems[0],10;
+ copyarray $ANamesB$[0],$ANames$[0],10;
+ copyarray $AAmountB[0],$AAmount[0],10;
+ copyarray $paidB[0],$paid[0],10;
+ deletearray $paid[0],10;
+ deletearray $bid[0],10;
+ deletearray $bidders$[0],10;
+ deletearray $AItems[0],10;
+ deletearray $ANames$[0],10;
+ deletearray $AAmount[0],10;
+ set $array,0;
+ set $Auction,0;
+ end;
+
+// All below is for anouncing the items in this auction, if there are none it will say so
+// and if there are none in there at the start of phase 2 it will reset the auctions state
+// This is to stop the auction ending message, and will only start again when it reachs phase 1 again
+
+OnTimer5000:
+ announce "Today in our auction we have",0;
+ end;
+OnTimer7000:
+ if($AItems[0]==0) setnpctimer 25001;
+ if($AAmount[0]==1) announce "A lovely "+getitemname($AItems[0])+" left by "+$ANames$[0],0;
+ if($AAmount[0]>1) announce $AAmount[0]+" lovely "+getitemname($AItems[0])+" left by "+$ANames$[0],0;
+ end;
+OnTimer9000:
+ if($AItems[1]==0) setnpctimer 25001;
+ if($AAmount[1]==1) announce "A great "+getitemname($AItems[1])+" left by "+$ANames$[1],0;
+ if($AAmount[1]>1) announce $AAmount[1]+" great "+getitemname($AItems[1])+" left by "+$ANames$[1],0;
+ end;
+OnTimer11000:
+ if($AItems[2]==0) setnpctimer 25001;
+ if($AAmount[2]==1) announce "A excellent "+getitemname($AItems[2])+" left by "+$ANames$[2],0;
+ if($AAmount[2]>1) announce $AAmount[2]+" excellent "+getitemname($AItems[2])+" left by "+$ANames$[2],0;
+ end;
+OnTimer13000:
+ if($AItems[3]==0) setnpctimer 25001;
+ if($AAmount[3]==1) announce "A superb "+getitemname($AItems[3])+" left by "+$ANames$[3],0;
+ if($AAmount[3]>1) announce $AAmount[3]+" superb "+getitemname($AItems[3])+" left by "+$ANames$[3],0;
+ end;
+OnTimer15000:
+ if($AItems[4]==0) setnpctimer 25001;
+ if($AAmount[4]==1) announce "A terrific "+getitemname($AItems[4])+" left by "+$ANames$[4],0;
+ if($AAmount[4]>1) announce $AAmount[4]+" terrific "+getitemname($AItems[4])+" left by "+$ANames$[4],0;
+ end;
+OnTimer17000:
+ if($AItems[5]==0) setnpctimer 25001;
+ if($AAmount[5]==1) announce "A wonderful "+getitemname($AItems[5])+" left by "+$ANames$[5],0;
+ if($AAmount[5]>1) announce $AAmount[5]+" wonderful "+getitemname($AItems[5])+" left by "+$ANames$[5],0;
+ end;
+OnTimer19000:
+ if($AItems[6]==0) setnpctimer 25001;
+ if($AAmount[6]==1) announce "A pretty "+getitemname($AItems[6])+" left by "+$ANames$[6],0;
+ if($AAmount[6]>1) announce $AAmount[6]+" pretty "+getitemname($AItems[6])+" left by "+$ANames$[6],0;
+ end;
+OnTimer21000:
+ if($AItems[7]==0) setnpctimer 25001;
+ if($AAmount[7]==1) announce "A sweet "+getitemname($AItems[7])+" left by "+$ANames$[7],0;
+ if($AAmount[7]>1) announce $AAmount[7]+" sweet "+getitemname($AItems[7])+" left by "+$ANames$[7],0;
+ end;
+OnTimer23000:
+ if($AItems[8]==0) setnpctimer 25001;
+ if($AAmount[8]==1) announce "A stunning "+getitemname($AItems[8])+" left by "+$ANames$[8],0;
+ if($AAmount[8]>1) announce $AAmount[8]+" stunning "+getitemname($AItems[8])+" left by "+$ANames$[8],0;
+ end;
+OnTimer25000:
+ if($AItems[9]==0) end;
+ if($AAmount[9]==1) announce "A fine "+getitemname($AItems[9])+" left by "+$ANames$[9],0;
+ if($AAmount[9]>1) announce $AAmount[9]+" fine "+getitemname($AItems[9])+" left by "+$ANames$[9],0;
+OnTimer27000:
+ if($AItems[0]!=0) announce "That is all the items we have this time round, so get bidding",0;
+ if($AItems[0]==0) announce "Seems there are no items this time round",0;
+ if($AItems[0]==0) set $Auction,0;
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+// this is only be run if you own any items left over, not paid for, from the last auction, or the server failed, and items are left over
+
+L_RBackup:
+ mes "You seem to have items left over from the last auction, here you go, have it back";
+ next;
+ getitem $AItemsB[@num],$AAmountB[@num];
+L_BItemsLoop:
+ set $AItemsB[@num],$AItemsB[@num+1];
+ set $ANamesB$[@num],$ANamesB$[@num+1];
+ set $AAmountB[@num],$AAmountB[@num+1];
+ set @num,@num+1;
+ if(@num<10) goto L_BItemsLoop;
+ mes "[Auctioneer]";
+ mes "Have a nice day";
+ close;
+}
+
+// Only for display purposes, and telling people info about the auction
+// Can also be used for finding out what phase the auction is in
+
+prontera.gat,158,193,3 script Auction Helper 833,{
+ mes "[Auction Helper]";
+ set @num,0;
+ if($Auction==0 && $AItemsB[@num]!=0) goto L_ItemRecover;
+ if(($Auction==1 || $Auction ==2) && $AItems[@num]!=0) goto L_LLoop;
+ if($Auction==3 && $AItems[@num]!=0) goto L_Win;
+ mes "Ok Currently we have nothing in the auction.";
+ mes "Please return at the correct time.";
+ close;
+L_LLoop:
+ mes "Ok Currently we have :-";
+L_Loop:
+ mes $ANames$[@num]+" with "+$AAmount[@num]+" x "+getitemname($AItems[@num])+"('s)";
+ set @num,@num+1;
+ if($AItems[@num]==0) close;
+ if(@num<10) goto L_Loop;
+ close;
+L_ItemRecover:
+ mes "Seems there was a problem, and the auction ended prematurely.";
+ mes "This means we still have :-";
+L_BLoop:
+ if($paid[@num]==0) mes $ANamesB$[@num]+" with "+$AAmountB[@num]+" x "+getitemname($AItemsB[@num])+"('s)";
+ set @num,@num+1;
+ if($AItems[@num]==0) close;
+ if(@num<10) goto L_BLoop;
+ close;
+L_Win:
+ mes "The Auction is in the last stage, at this point you can :-";
+ mes " * buy your items";
+ mes " * Pick-up you money";
+ mes "(or if you were unlucky)";
+ mes " * Pick-up unsold items";
+ next;
+ mes "[Auction Helper]";
+ mes "Here is a list of Sellers and Winners";
+ set @num,0;
+L_Loop2:
+ mes $ANames$[@num]+" with "+$AAmount[@num]+" "+getitemname($AItems[@num])+"('s), won by "+$bidders$[@num]+" for "+$bid[@num]+"z";
+ set @num,@num+1;
+ if($AItems[@num]==0) close;
+ if(@num<10) goto L_Loop2;
+ close;
+
+}
diff --git a/npc/custom/Lance/FR_HallOfFame.c b/npc/custom/Lance/FR_HallOfFame.c
index e82a9590f..ed03a6af2 100644
--- a/npc/custom/Lance/FR_HallOfFame.c
+++ b/npc/custom/Lance/FR_HallOfFame.c
@@ -1,297 +1,297 @@
-//===== eAthena Script ======================================
-//= Hall of Fame
-//===========================================================
-//===== By ==================================================
-//= [Lance]
-//= Idea from emilylee78
-//===== Version =============================================
-//= 2.3 FINAL
-//===== Compatible With =====================================
-//= eAthena SVN and Freya SVN
-//===== Description =========================================
-//= A Hall of Fame framework. Will update the list on every
-//= login and logout in a safe manner.
-//=
-//= Usage: callfunc "printHallOfFame", $;
-//= $ - Can be either 0 or 1.
-//= 0 - Display the current rankings.
-//= 1 - Display last week's rankings.
-//= Note : Remember to put a close; after calling it.
-//===== Comments ============================================
-//= 1.0 - Initial beta release [Lance]
-//= 1.1 - Fixed typos. Optimized a teeny bit. [Lance]
-//= 1.2 - Bug fixes. [Lance]
-//= 1.3 - Added a more realistic shuffling. [Lance]
-//= 1.4 - Added Weekly Top 10 list. [Lance]
-//= 1.5 - Friggin typos =< + Better shuffling [Lance]
-//= 1.6 - Bugfixes [Lance]
-//= 1.7 - More bugfixes. Type mismatch =P [Lance]
-//= 2.0 - Exclude GMs and add recovery plan.
-//= Suggested by EvilPoringOfDooom. [Lance]
-//= 2.1 - Typo.. again.. T_T [Lance]
-//= 2.2 - Minor updates and added Jury [Lance]
-//= 2.3 - Utilizing eAthena's new scripting engine [Lance]
-//===========================================================
-
-prontera.gat,0,0,0 script OnPCLoginEvent -1,{
- callfunc "HallOfFameInit";
- end;
-
-OnInit:
- // Total Number of Players in Hall of Fame
- // =======================================
- set $HoF_totalCount, 10;
- // Reshuffle (Will affect perfomance) ====
- set $HoF_reshuffle, 1;
- // Minimum GM Lvl to be excluded from HoF=
- set $HoF_minGMLvl, 99;
- // Recovery Plan to Remove GMs ============
- set $@HoF_recovery, 0;
- // =======================================
-
- set $HoF_totalCount, $HoF_totalCount - 1;
- set $@FebruaryD, 28;
- if((gettime(7) % 4) == 0) {
- set $@FebruaryD, 29;
- }
- setarray $@MonthDayThing[1],31, $@FebruaryD,31,30,31,30,31,31,30,31,30,31;
- set $@HoF_TimeUpdateD, $HoF_LastUpdateD;
- set $@HoF_TimeUpdateM, $HoF_LastUpdateM;
- set $@HoF_TimeUpdateY, $HoF_LastUpdateY;
- // Time to do some maths
- set $@TimeNowD, gettime(5);
- set $@TimeNowM, gettime(6);
- set $@TimeNowY, gettime(7);
- // Debug Message --
- debugmes "[Hall of Fame] Last Update is Year " + $@HoF_TimeUpdateY + " Month " + $@HoF_TimeUpdateM + " Day " + $@HoF_TimeUpdateD;
- debugmes "[Hall of Fame] Today is Year " + $@TimeNowY + " Month " + $@TimeNowM + " Day " + $@TimeNowD;
- if(($@TimeNowD - $@HoF_TimeUpdateD) < 0){
- set $@TimeNowD, $@TimeNowD + $@MonthDayThing[$@TimeNowM];
- set $@TimeNowM, $@TimeNowM - 1;
- }
- set $@GapD, $@TimeNowD - $@HoF_TimeUpdateD;
- if(($@TimeNowM - $@HoF_TimeUpdateM) < 0){
- set $@TimeNowM, $@TimeNowM + 12;
- set $@TimeNowY, $@TimeNowY - 1;
- }
- set $@GapM, $@TimeNowM - $@HoF_TimeUpdateM;
- set $@GapY, $@TimeNowY - $@HoF_TimeUpdateY;
- debugmes "[Hall of Fame] Gap is " + $@GapY + " Years " + $@GapM + " Months " + $@GapD + " Days.";
- if($@GapY > 0 || $@GapM > 0 || $@GapD >= 7) {
- callfunc "hallOfFameReset"; // Phew..
- }
- end;
-
-OnClock0000:
- set $HoF_UpdateCount, $HoF_UpdateCount + 1;
- if($HoF_UpdateCount == 7) {
- callfunc "hallOfFameReset";
- }
- end;
-}
-
-prontera.gat,0,0,0 script PCLogoutEvent -1,{
- callfunc "HallOfFameInit";
- end;
-}
-
-function script hallOfFameReset {
- copyarray $HoF_LadderNameO$[0], $HoF_LadderName$[0], $HoF_totalCount;
- copyarray $HoF_LadderBLevelO[0], $HoF_LadderBLevel[0], $HoF_totalCount;
- copyarray $HoF_LadderJLevelO[0], $HoF_LadderJLevel[0], $HoF_totalCount;
- copyarray $HoF_LadderZenyO[0], $HoF_LadderZeny[0], $HoF_totalCount;
- set $@number, $HoF_totalCount + 1;
- deletearray $HoF_LadderName$[0], $@number;
- deletearray $HoF_LadderBLevel[0], $@number;
- deletearray $HoF_LadderJLevel[0], $@number;
- deletearray $HoF_LadderZeny[0], $@number;
- set $HoF_LastUpdateD, gettime(5);
- set $HoF_LastUpdateM, gettime(6);
- set $HoF_LastUpdateY, gettime(7);
- set $HoF_UpdateCount, 0;
- debugmes "[Hall of Fame] System Reset Invoked!";
- return;
-}
-
-function script HallOfFameInit {
- if(getgmlevel() >= $HoF_minGMLvl && $@HoF_recovery != 1) {
- set PCLogoutEvent, 0;
- } else {
- set PCLogoutEvent, 1;
- callfunc "updateHallofFame", $HoF_reshuffle;
- }
- return;
-}
-
-function script updateHallofFame {
- set @i, 0;
- if(getarg(0) == 1){
- goto L_ShuffleName;
- }
- if(BaseLevel >= $HoF_LadderBLevel[$HoF_totalCount]){
- goto L_checkBase;
- }
- goto L_End;
-
-L_ShuffleName:
- if($HoF_LadderName$[@i] == strcharinfo(0)) {
- goto L_ShuffleScore;
- }
- if(@i == $HoF_totalCount) {
- goto L_checkEntry;
- }
- set @i, @i + 1;
- goto L_ShuffleName;
-
-L_ShuffleScore:
- deletearray $HoF_LadderName$[@i],1;
- deletearray $HoF_LadderZeny[@i],1;
- deletearray $HoF_LadderJLevel[@i],1;
- deletearray $HoF_LadderBLevel[@i],1;
- goto L_ShuffleName;
-
-L_checkEntry:
- if(getgmlevel() >= $HoF_minGMLvl){
- end;
- }
- set @i, 0;
- goto L_checkBase;
-
-L_checkBase:
- if(BaseLevel >= $HoF_LadderBLevel[@i]) {
- goto L_BaseOK;
- } else {
- goto L_Increment;
- }
-
-L_BaseOK:
- if(BaseLevel == $HoF_LadderBLevel[@i]){
- goto L_BaseSameLoop;
- } else {
- goto L_NewEntry;
- }
-
-L_BaseSameLoop:
- if(JobLevel >= $HoF_LadderJLevel[@i]) {
- goto L_JobOK;
- } else if(Zeny >= $HoF_LadderZeny[@i]) {
- goto L_ZenyOK;
- }
- goto L_Increment;
-
-L_JobOK:
- if(JobLevel == $HoF_LadderJLevel[@i]) {
- goto L_JobSame;
- } else {
- goto L_NewEntry;
- }
-
-L_ZenyOK:
- if(Zeny == $HoF_LadderZeny[@i]){
- goto L_Increment;
- } else {
- goto L_NewEntry;
- }
-
-L_JobSame:
- if(Zeny >= $HoF_LadderZeny[@i]) {
- goto L_ZenyOK;
- } else {
- goto L_Increment;
- }
-
-L_NewEntry:
- callfunc "hallOfFameNewEntry", @i, strcharinfo(0), BaseLevel, JobLevel, Zeny;
- end;
-
-L_Increment:
- if(@i == $HoF_totalCount) {
- goto L_End;
- } else {
- set @i, @i + 1;
- goto L_checkBase;
- }
-
-L_End:
- return;
-
-}
-
-
-function script hallOfFameNewEntry {
- if(getarg(0) == 0 || getarg(1) != $HoF_LadderName$[getarg(0) - 1]) {
- set @startPos, getarg(0);
- copyarray @HoF_LadderNameB$[0], $HoF_LadderName$[@startPos], $HoF_totalCount;
- copyarray @HoF_LadderBLevelB[0], $HoF_LadderBLevel[@startPos], $HoF_totalCount;
- copyarray @HoF_LadderJLevelB[0], $HoF_LadderJLevel[@startPos], $HoF_totalCount;
- copyarray @HoF_LadderZenyB[0], $HoF_LadderZeny[@startPos], $HoF_totalCount;
- set $HoF_LadderName$[@startPos], getarg(1);
- set $HoF_LadderBLevel[@startPos], getarg(2);
- set $HoF_LadderJLevel[@startPos], getarg(3);
- set $HoF_LadderZeny[@startPos], getarg(4);
- set @startPos, @startPos + 1;
- set @limitPos, $HoF_totalCount - @startPos;
- copyarray $HoF_LadderName$[@startPos], @HoF_LadderNameB$[0], @limitPos;
- copyarray $HoF_LadderBLevel[@startPos], @HoF_LadderBLevelB[0], @limitPos;
- copyarray $HoF_LadderJLevel[@startPos], @HoF_LadderJLevelB[0], @limitPos;
- copyarray $HoF_LadderZeny[@startPos], @HoF_LadderZenyB[0], @limitPos;
- announce "[Hall of Fame] " + getarg(1) + " has made his/herself onto the No. " + @startPos + " ranking in Hall of Fame!", bc_all;
- }
- return;
-}
-
-function script printHallOfFame {
- if(getarg(0) == 1) {
- mes "[Hall of Fame] - Last Week's Rankings";
- for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
- mes "^ff0000";
- mes "Position No. " + (@loop + 1) + ":^0000ff";
- mes "+================================+";
- mes "^000000Name :" + $HoF_LadderNameO$[@loop];
- mes "BLvl :" + $HoF_LadderBLevelO[@loop];
- mes "JLvl :" + $HoF_LadderJLevelO[@loop];
- mes "Zeny :" + $HoF_LadderZenyO[@loop] + "^0000ff";
- mes "+================================+^000000";
- }
- } else {
- mes "[Hall of Fame] - Current Rankings";
- for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
- mes "^ff0000";
- mes "Position No. " + (@loop + 1) + ":^0000ff";
- mes "+================================+";
- mes "^000000Name :" + $HoF_LadderName$[@loop];
- mes "BLvl :" + $HoF_LadderBLevel[@loop];
- mes "JLvl :" + $HoF_LadderJLevel[@loop];
- mes "Zeny :" + $HoF_LadderZeny[@loop] + "^0000ff";
- mes "+================================+^000000";
- }
- }
- return;
-}
-
-prontera.gat,180,200,4 script Jury 109,{
- mes "[Jury]";
- mes "Good day. Would you like to view the Hall of Fame?";
- next;
- menu "Yes",L_OK,"No",L_QUIT;
-
-L_OK:
- mes "[Jury]";
- mes "Would you like to view the current or the past rankings?";
-
-L_MENU:
- next;
- menu "Current", L_CUR, "Past", -,"Nevermind",L_QUIT;
- callfunc "printHallOfFame",1;
- goto L_MENU;
-
-L_CUR:
- callfunc "printHallOfFame",0;
- goto L_MENU;
-
-L_QUIT:
- mes "[Jury]";
- mes "Have a nice day then.";
- close;
-
+//===== eAthena Script ======================================
+//= Hall of Fame
+//===========================================================
+//===== By ==================================================
+//= [Lance]
+//= Idea from emilylee78
+//===== Version =============================================
+//= 2.3 FINAL
+//===== Compatible With =====================================
+//= eAthena SVN and Freya SVN
+//===== Description =========================================
+//= A Hall of Fame framework. Will update the list on every
+//= login and logout in a safe manner.
+//=
+//= Usage: callfunc "printHallOfFame", $;
+//= $ - Can be either 0 or 1.
+//= 0 - Display the current rankings.
+//= 1 - Display last week's rankings.
+//= Note : Remember to put a close; after calling it.
+//===== Comments ============================================
+//= 1.0 - Initial beta release [Lance]
+//= 1.1 - Fixed typos. Optimized a teeny bit. [Lance]
+//= 1.2 - Bug fixes. [Lance]
+//= 1.3 - Added a more realistic shuffling. [Lance]
+//= 1.4 - Added Weekly Top 10 list. [Lance]
+//= 1.5 - Friggin typos =< + Better shuffling [Lance]
+//= 1.6 - Bugfixes [Lance]
+//= 1.7 - More bugfixes. Type mismatch =P [Lance]
+//= 2.0 - Exclude GMs and add recovery plan.
+//= Suggested by EvilPoringOfDooom. [Lance]
+//= 2.1 - Typo.. again.. T_T [Lance]
+//= 2.2 - Minor updates and added Jury [Lance]
+//= 2.3 - Utilizing eAthena's new scripting engine [Lance]
+//===========================================================
+
+prontera.gat,0,0,0 script OnPCLoginEvent -1,{
+ callfunc "HallOfFameInit";
+ end;
+
+OnInit:
+ // Total Number of Players in Hall of Fame
+ // =======================================
+ set $HoF_totalCount, 10;
+ // Reshuffle (Will affect perfomance) ====
+ set $HoF_reshuffle, 1;
+ // Minimum GM Lvl to be excluded from HoF=
+ set $HoF_minGMLvl, 99;
+ // Recovery Plan to Remove GMs ============
+ set $@HoF_recovery, 0;
+ // =======================================
+
+ set $HoF_totalCount, $HoF_totalCount - 1;
+ set $@FebruaryD, 28;
+ if((gettime(7) % 4) == 0) {
+ set $@FebruaryD, 29;
+ }
+ setarray $@MonthDayThing[1],31, $@FebruaryD,31,30,31,30,31,31,30,31,30,31;
+ set $@HoF_TimeUpdateD, $HoF_LastUpdateD;
+ set $@HoF_TimeUpdateM, $HoF_LastUpdateM;
+ set $@HoF_TimeUpdateY, $HoF_LastUpdateY;
+ // Time to do some maths
+ set $@TimeNowD, gettime(5);
+ set $@TimeNowM, gettime(6);
+ set $@TimeNowY, gettime(7);
+ // Debug Message --
+ debugmes "[Hall of Fame] Last Update is Year " + $@HoF_TimeUpdateY + " Month " + $@HoF_TimeUpdateM + " Day " + $@HoF_TimeUpdateD;
+ debugmes "[Hall of Fame] Today is Year " + $@TimeNowY + " Month " + $@TimeNowM + " Day " + $@TimeNowD;
+ if(($@TimeNowD - $@HoF_TimeUpdateD) < 0){
+ set $@TimeNowD, $@TimeNowD + $@MonthDayThing[$@TimeNowM];
+ set $@TimeNowM, $@TimeNowM - 1;
+ }
+ set $@GapD, $@TimeNowD - $@HoF_TimeUpdateD;
+ if(($@TimeNowM - $@HoF_TimeUpdateM) < 0){
+ set $@TimeNowM, $@TimeNowM + 12;
+ set $@TimeNowY, $@TimeNowY - 1;
+ }
+ set $@GapM, $@TimeNowM - $@HoF_TimeUpdateM;
+ set $@GapY, $@TimeNowY - $@HoF_TimeUpdateY;
+ debugmes "[Hall of Fame] Gap is " + $@GapY + " Years " + $@GapM + " Months " + $@GapD + " Days.";
+ if($@GapY > 0 || $@GapM > 0 || $@GapD >= 7) {
+ callfunc "hallOfFameReset"; // Phew..
+ }
+ end;
+
+OnClock0000:
+ set $HoF_UpdateCount, $HoF_UpdateCount + 1;
+ if($HoF_UpdateCount == 7) {
+ callfunc "hallOfFameReset";
+ }
+ end;
+}
+
+prontera.gat,0,0,0 script PCLogoutEvent -1,{
+ callfunc "HallOfFameInit";
+ end;
+}
+
+function script hallOfFameReset {
+ copyarray $HoF_LadderNameO$[0], $HoF_LadderName$[0], $HoF_totalCount;
+ copyarray $HoF_LadderBLevelO[0], $HoF_LadderBLevel[0], $HoF_totalCount;
+ copyarray $HoF_LadderJLevelO[0], $HoF_LadderJLevel[0], $HoF_totalCount;
+ copyarray $HoF_LadderZenyO[0], $HoF_LadderZeny[0], $HoF_totalCount;
+ set $@number, $HoF_totalCount + 1;
+ deletearray $HoF_LadderName$[0], $@number;
+ deletearray $HoF_LadderBLevel[0], $@number;
+ deletearray $HoF_LadderJLevel[0], $@number;
+ deletearray $HoF_LadderZeny[0], $@number;
+ set $HoF_LastUpdateD, gettime(5);
+ set $HoF_LastUpdateM, gettime(6);
+ set $HoF_LastUpdateY, gettime(7);
+ set $HoF_UpdateCount, 0;
+ debugmes "[Hall of Fame] System Reset Invoked!";
+ return;
+}
+
+function script HallOfFameInit {
+ if(getgmlevel() >= $HoF_minGMLvl && $@HoF_recovery != 1) {
+ set PCLogoutEvent, 0;
+ } else {
+ set PCLogoutEvent, 1;
+ callfunc "updateHallofFame", $HoF_reshuffle;
+ }
+ return;
+}
+
+function script updateHallofFame {
+ set @i, 0;
+ if(getarg(0) == 1){
+ goto L_ShuffleName;
+ }
+ if(BaseLevel >= $HoF_LadderBLevel[$HoF_totalCount]){
+ goto L_checkBase;
+ }
+ goto L_End;
+
+L_ShuffleName:
+ if($HoF_LadderName$[@i] == strcharinfo(0)) {
+ goto L_ShuffleScore;
+ }
+ if(@i == $HoF_totalCount) {
+ goto L_checkEntry;
+ }
+ set @i, @i + 1;
+ goto L_ShuffleName;
+
+L_ShuffleScore:
+ deletearray $HoF_LadderName$[@i],1;
+ deletearray $HoF_LadderZeny[@i],1;
+ deletearray $HoF_LadderJLevel[@i],1;
+ deletearray $HoF_LadderBLevel[@i],1;
+ goto L_ShuffleName;
+
+L_checkEntry:
+ if(getgmlevel() >= $HoF_minGMLvl){
+ end;
+ }
+ set @i, 0;
+ goto L_checkBase;
+
+L_checkBase:
+ if(BaseLevel >= $HoF_LadderBLevel[@i]) {
+ goto L_BaseOK;
+ } else {
+ goto L_Increment;
+ }
+
+L_BaseOK:
+ if(BaseLevel == $HoF_LadderBLevel[@i]){
+ goto L_BaseSameLoop;
+ } else {
+ goto L_NewEntry;
+ }
+
+L_BaseSameLoop:
+ if(JobLevel >= $HoF_LadderJLevel[@i]) {
+ goto L_JobOK;
+ } else if(Zeny >= $HoF_LadderZeny[@i]) {
+ goto L_ZenyOK;
+ }
+ goto L_Increment;
+
+L_JobOK:
+ if(JobLevel == $HoF_LadderJLevel[@i]) {
+ goto L_JobSame;
+ } else {
+ goto L_NewEntry;
+ }
+
+L_ZenyOK:
+ if(Zeny == $HoF_LadderZeny[@i]){
+ goto L_Increment;
+ } else {
+ goto L_NewEntry;
+ }
+
+L_JobSame:
+ if(Zeny >= $HoF_LadderZeny[@i]) {
+ goto L_ZenyOK;
+ } else {
+ goto L_Increment;
+ }
+
+L_NewEntry:
+ callfunc "hallOfFameNewEntry", @i, strcharinfo(0), BaseLevel, JobLevel, Zeny;
+ end;
+
+L_Increment:
+ if(@i == $HoF_totalCount) {
+ goto L_End;
+ } else {
+ set @i, @i + 1;
+ goto L_checkBase;
+ }
+
+L_End:
+ return;
+
+}
+
+
+function script hallOfFameNewEntry {
+ if(getarg(0) == 0 || getarg(1) != $HoF_LadderName$[getarg(0) - 1]) {
+ set @startPos, getarg(0);
+ copyarray @HoF_LadderNameB$[0], $HoF_LadderName$[@startPos], $HoF_totalCount;
+ copyarray @HoF_LadderBLevelB[0], $HoF_LadderBLevel[@startPos], $HoF_totalCount;
+ copyarray @HoF_LadderJLevelB[0], $HoF_LadderJLevel[@startPos], $HoF_totalCount;
+ copyarray @HoF_LadderZenyB[0], $HoF_LadderZeny[@startPos], $HoF_totalCount;
+ set $HoF_LadderName$[@startPos], getarg(1);
+ set $HoF_LadderBLevel[@startPos], getarg(2);
+ set $HoF_LadderJLevel[@startPos], getarg(3);
+ set $HoF_LadderZeny[@startPos], getarg(4);
+ set @startPos, @startPos + 1;
+ set @limitPos, $HoF_totalCount - @startPos;
+ copyarray $HoF_LadderName$[@startPos], @HoF_LadderNameB$[0], @limitPos;
+ copyarray $HoF_LadderBLevel[@startPos], @HoF_LadderBLevelB[0], @limitPos;
+ copyarray $HoF_LadderJLevel[@startPos], @HoF_LadderJLevelB[0], @limitPos;
+ copyarray $HoF_LadderZeny[@startPos], @HoF_LadderZenyB[0], @limitPos;
+ announce "[Hall of Fame] " + getarg(1) + " has made his/herself onto the No. " + @startPos + " ranking in Hall of Fame!", bc_all;
+ }
+ return;
+}
+
+function script printHallOfFame {
+ if(getarg(0) == 1) {
+ mes "[Hall of Fame] - Last Week's Rankings";
+ for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
+ mes "^ff0000";
+ mes "Position No. " + (@loop + 1) + ":^0000ff";
+ mes "+================================+";
+ mes "^000000Name :" + $HoF_LadderNameO$[@loop];
+ mes "BLvl :" + $HoF_LadderBLevelO[@loop];
+ mes "JLvl :" + $HoF_LadderJLevelO[@loop];
+ mes "Zeny :" + $HoF_LadderZenyO[@loop] + "^0000ff";
+ mes "+================================+^000000";
+ }
+ } else {
+ mes "[Hall of Fame] - Current Rankings";
+ for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
+ mes "^ff0000";
+ mes "Position No. " + (@loop + 1) + ":^0000ff";
+ mes "+================================+";
+ mes "^000000Name :" + $HoF_LadderName$[@loop];
+ mes "BLvl :" + $HoF_LadderBLevel[@loop];
+ mes "JLvl :" + $HoF_LadderJLevel[@loop];
+ mes "Zeny :" + $HoF_LadderZeny[@loop] + "^0000ff";
+ mes "+================================+^000000";
+ }
+ }
+ return;
+}
+
+prontera.gat,180,200,4 script Jury 109,{
+ mes "[Jury]";
+ mes "Good day. Would you like to view the Hall of Fame?";
+ next;
+ menu "Yes",L_OK,"No",L_QUIT;
+
+L_OK:
+ mes "[Jury]";
+ mes "Would you like to view the current or the past rankings?";
+
+L_MENU:
+ next;
+ menu "Current", L_CUR, "Past", -,"Nevermind",L_QUIT;
+ callfunc "printHallOfFame",1;
+ goto L_MENU;
+
+L_CUR:
+ callfunc "printHallOfFame",0;
+ goto L_MENU;
+
+L_QUIT:
+ mes "[Jury]";
+ mes "Have a nice day then.";
+ close;
+
} \ No newline at end of file
diff --git a/npc/custom/Lance/FR_MailSystem.c b/npc/custom/Lance/FR_MailSystem.c
index 8111f3dea..f0a6a4638 100644
--- a/npc/custom/Lance/FR_MailSystem.c
+++ b/npc/custom/Lance/FR_MailSystem.c
@@ -1,118 +1,118 @@
-//(=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)
-//( (c)2005 RagMods Modification Team presents )
-//( ______ __ __ )
-//( /\ _ \/\ \__/\ \ v 1.00.00 )
-//( __\ \ \_\ \ \ ,_\ \ \___ __ ___ __ )
-//( /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\ )
-//( /\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \_\.\_ )
-//( \ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\ )
-//( \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/ )
-//( )
-//( -- [s] [c] [r] [i] [p] [t] [s] -- )
-//( _ _ _ _ _ _ _ _ _ _ _ _ _ )
-//( / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ )
-//( ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) )
-//( \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ )
-//( )
-//( Advanced Fusion Maps (c) 2003-2005 The Fusion Project )
-//(=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)
-//===== eAthena Script ======================================
-//= Mail System (using built in mail function)
-//===========================================================
-//===== By ==================================================
-//= [Lance]
-//===== Version =============================================
-//= 1.0
-//===== Compatible With =====================================
-//= Any flavours of Athena SQL
-//===== Description =========================================
-//= Allows players to send and receive mails without GM lvl.
-//===== Comments ============================================
-//= 1.0 - Initial release [Lance]
-//===========================================================
-prontera.gat,143,171,3 script Messenger 738,1,1,{
- mes "[Messenger Deviruchi]";
- mes "Hiya! I'm the fastest messenger in Rune Midgard!";
- next;
- mes "[Messenger Deviruchi]";
- mes "I can send your friends messages even if he or she is offline!";
- next;
- mes "[Messenger Deviruchi]";
- mes "Wanna try?";
- menu "Yes", MENUSYS, "No", -;
- close;
-
-MENUSYS:
- next;
- mes "[Messenger Deviruchi]";
- mes "What can I do for ya?";
- emotion e_what;
- menu "Check Mail",L_CHECK,"Send Mail",L_SEND, "Leave", -;
- next;
- mes "[Messenger Deviruchi]";
- mes "Do come again!";
- emotion e_no1;
- close;
-
-L_CHECK:
- atcommand strcharinfo(0) + ":@listnewmail";
- menu "Read Mail", L_READ, "Check All Mails",CHKALLMAIL,"Send Mail",L_SEND, "Delete Mail", DELMAIL, "Back", MENUSYS;
- close;
-
-CHKALLMAIL:
- atcommand strcharinfo(0) + ":@listmail";
- menu "Read Mail", L_READ, "Delete Mail", DELMAIL, "Back", MENUSYS;
- close;
-
-L_READ:
- next;
- mes "[Messenger Deviruchi]";
- mes "Please tell me the message number you want to read.";
- input @msgnum;
- next;
- mes "[Messenger Deviruchi]";
- mes "Here it is!";
- emotion e_no1;
- atcommand strcharinfo(0) + ":@readmail " + @msgnum;
- menu "Reply Mail", L_SEND, "Back", MENUSYS;
- close;
-
-L_SEND:
- next;
- mes "[Messenger Deviruchi]";
- mes "Who do you want to send this message to?";
- input @rcpt$;
- next;
- mes "[Messenger Deviruchi]";
- mes "What message do you want to send to him?";
- input @body$;
- next;
- atcommand strcharinfo(0) + ":@sendmail " + @rcpt$ + " " + @body$;
- mes "[Messenger Deviruchi]";
- mes "All done!";
- emotion e_no1;
- menu "Send another mail", L_SEND, "Back", MENUSYS;
- close;
-
-DELMAIL:
- next;
- mes "[Messenger Deviruchi]";
- mes "Which message number do you want me to delete?";
- input @msgnum;
- next;
- mes "[Messenger Deviruchi]";
- mes "Are you sure you want to delete mail no. " + @msgnum + "?";
- menu "Yes",-,"No",DELMAIL, "Back", MENUSYS;
- atcommand strcharinfo(0) + ":@deletemail " + @msgnum;
- mes "[Messenger Deviruchi]";
- mes "All done!";
+//(=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)
+//( (c)2005 RagMods Modification Team presents )
+//( ______ __ __ )
+//( /\ _ \/\ \__/\ \ v 1.00.00 )
+//( __\ \ \_\ \ \ ,_\ \ \___ __ ___ __ )
+//( /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\ )
+//( /\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \_\.\_ )
+//( \ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\ )
+//( \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/ )
+//( )
+//( -- [s] [c] [r] [i] [p] [t] [s] -- )
+//( _ _ _ _ _ _ _ _ _ _ _ _ _ )
+//( / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ )
+//( ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) )
+//( \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ )
+//( )
+//( Advanced Fusion Maps (c) 2003-2005 The Fusion Project )
+//(=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)
+//===== eAthena Script ======================================
+//= Mail System (using built in mail function)
+//===========================================================
+//===== By ==================================================
+//= [Lance]
+//===== Version =============================================
+//= 1.0
+//===== Compatible With =====================================
+//= Any flavours of Athena SQL
+//===== Description =========================================
+//= Allows players to send and receive mails without GM lvl.
+//===== Comments ============================================
+//= 1.0 - Initial release [Lance]
+//===========================================================
+prontera.gat,143,171,3 script Messenger 738,1,1,{
+ mes "[Messenger Deviruchi]";
+ mes "Hiya! I'm the fastest messenger in Rune Midgard!";
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "I can send your friends messages even if he or she is offline!";
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Wanna try?";
+ menu "Yes", MENUSYS, "No", -;
+ close;
- emotion e_no1;
- menu "Delete another mail", DELMAIL, "Back", MENUSYS;
- close;
-
-OnTouch:
- npctalk "Relax.. I'm no bad guy..";
- emotion e_heh;
- end;
+MENUSYS:
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "What can I do for ya?";
+ emotion e_what;
+ menu "Check Mail",L_CHECK,"Send Mail",L_SEND, "Leave", -;
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Do come again!";
+ emotion e_no1;
+ close;
+
+L_CHECK:
+ atcommand strcharinfo(0) + ":@listnewmail";
+ menu "Read Mail", L_READ, "Check All Mails",CHKALLMAIL,"Send Mail",L_SEND, "Delete Mail", DELMAIL, "Back", MENUSYS;
+ close;
+
+CHKALLMAIL:
+ atcommand strcharinfo(0) + ":@listmail";
+ menu "Read Mail", L_READ, "Delete Mail", DELMAIL, "Back", MENUSYS;
+ close;
+
+L_READ:
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Please tell me the message number you want to read.";
+ input @msgnum;
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Here it is!";
+ emotion e_no1;
+ atcommand strcharinfo(0) + ":@readmail " + @msgnum;
+ menu "Reply Mail", L_SEND, "Back", MENUSYS;
+ close;
+
+L_SEND:
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Who do you want to send this message to?";
+ input @rcpt$;
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "What message do you want to send to him?";
+ input @body$;
+ next;
+ atcommand strcharinfo(0) + ":@sendmail " + @rcpt$ + " " + @body$;
+ mes "[Messenger Deviruchi]";
+ mes "All done!";
+ emotion e_no1;
+ menu "Send another mail", L_SEND, "Back", MENUSYS;
+ close;
+
+DELMAIL:
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Which message number do you want me to delete?";
+ input @msgnum;
+ next;
+ mes "[Messenger Deviruchi]";
+ mes "Are you sure you want to delete mail no. " + @msgnum + "?";
+ menu "Yes",-,"No",DELMAIL, "Back", MENUSYS;
+ atcommand strcharinfo(0) + ":@deletemail " + @msgnum;
+ mes "[Messenger Deviruchi]";
+ mes "All done!";
+
+ emotion e_no1;
+ menu "Delete another mail", DELMAIL, "Back", MENUSYS;
+ close;
+
+OnTouch:
+ npctalk "Relax.. I'm no bad guy..";
+ emotion e_heh;
+ end;
} \ No newline at end of file
diff --git a/npc/custom/Lance/FR_WeatherController.c b/npc/custom/Lance/FR_WeatherController.c
index db808d8af..b7c803876 100644
--- a/npc/custom/Lance/FR_WeatherController.c
+++ b/npc/custom/Lance/FR_WeatherController.c
@@ -1,403 +1,403 @@
-- script dayNight -1,{
- end;
-
-OnInit:
- if(gettime(3) > 7 && gettime(3) < 19) {
- goto L_Day;
- } else {
- goto L_Night;
- }
-
-L_Day:
- day;
- callfunc "RcloudFlag";
- end;
-
-L_Night:
- night;
- callfunc "cloudFlag";
- end;
-
-OnClock1900:
- goto L_Night;
-
-OnClock0700:
- goto L_Day;
-}
-
-function script cloudFlag {
-setmapflag "alb2trea.gat",mf_clouds;
-setmapflag "alberta.gat",mf_clouds;
-setmapflag "aldebaran.gat",mf_clouds;
-setmapflag "gef_fild00.gat",mf_clouds;
-setmapflag "gef_fild01.gat",mf_clouds;
-setmapflag "gef_fild02.gat",mf_clouds;
-setmapflag "gef_fild03.gat",mf_clouds;
-setmapflag "gef_fild04.gat",mf_clouds;
-setmapflag "gef_fild05.gat",mf_clouds;
-setmapflag "gef_fild06.gat",mf_clouds;
-setmapflag "gef_fild07.gat",mf_clouds;
-setmapflag "gef_fild08.gat",mf_clouds;
-setmapflag "gef_fild09.gat",mf_clouds;
-setmapflag "gef_fild10.gat",mf_clouds;
-setmapflag "gef_fild11.gat",mf_clouds;
-setmapflag "geffen.gat",mf_clouds;
-setmapflag "gl_church.gat",mf_clouds;
-setmapflag "gl_chyard.gat",mf_clouds;
-setmapflag "gl_knt01.gat",mf_clouds;
-setmapflag "gl_knt02.gat",mf_clouds;
-setmapflag "gl_step.gat",mf_clouds;
-setmapflag "glast_01.gat",mf_clouds;
-//setmapflag "hunter_1-1.gat",mf_clouds;
-//setmapflag "hunter_2-1.gat",mf_clouds;
-//setmapflag "hunter_3-1.gat",mf_clouds;
-setmapflag "izlude.gat",mf_clouds;
-setmapflag "job_thief1.gat",mf_clouds;
-//setmapflag "knight_1-1.gat",mf_clouds;
-//setmapflag "knight_2-1.gat",mf_clouds;
-//setmapflag "knight_3-1.gat",mf_clouds;
-setmapflag "mjolnir_01.gat",mf_clouds;
-setmapflag "mjolnir_02.gat",mf_clouds;
-setmapflag "mjolnir_03.gat",mf_clouds;
-setmapflag "mjolnir_04.gat",mf_clouds;
-setmapflag "mjolnir_05.gat",mf_clouds;
-setmapflag "mjolnir_06.gat",mf_clouds;
-setmapflag "mjolnir_07.gat",mf_clouds;
-setmapflag "mjolnir_08.gat",mf_clouds;
-setmapflag "mjolnir_09.gat",mf_clouds;
-setmapflag "mjolnir_10.gat",mf_clouds;
-setmapflag "mjolnir_11.gat",mf_clouds;
-setmapflag "mjolnir_12.gat",mf_clouds;
-setmapflag "moc_fild01.gat",mf_clouds;
-setmapflag "moc_fild02.gat",mf_clouds;
-setmapflag "moc_fild03.gat",mf_clouds;
-setmapflag "moc_fild04.gat",mf_clouds;
-setmapflag "moc_fild05.gat",mf_clouds;
-setmapflag "moc_fild06.gat",mf_clouds;
-setmapflag "moc_fild07.gat",mf_clouds;
-setmapflag "moc_fild08.gat",mf_clouds;
-setmapflag "moc_fild09.gat",mf_clouds;
-setmapflag "moc_fild10.gat",mf_clouds;
-setmapflag "moc_fild11.gat",mf_clouds;
-setmapflag "moc_fild12.gat",mf_clouds;
-setmapflag "moc_fild13.gat",mf_clouds;
-setmapflag "moc_fild14.gat",mf_clouds;
-setmapflag "moc_fild15.gat",mf_clouds;
-setmapflag "moc_fild16.gat",mf_clouds;
-setmapflag "moc_fild17.gat",mf_clouds;
-setmapflag "moc_fild18.gat",mf_clouds;
-setmapflag "moc_fild19.gat",mf_clouds;
-setmapflag "moc_pryd01.gat",mf_clouds;
-setmapflag "moc_pryd02.gat",mf_clouds;
-setmapflag "moc_pryd03.gat",mf_clouds;
-setmapflag "moc_pryd04.gat",mf_clouds;
-setmapflag "moc_pryd05.gat",mf_clouds;
-setmapflag "moc_pryd06.gat",mf_clouds;
-setmapflag "moc_prydb1.gat",mf_clouds;
-setmapflag "moc_ruins.gat",mf_clouds;
-setmapflag "morocc.gat",mf_clouds;
-//setmapflag "new_1-1.gat",mf_clouds;
-//setmapflag "new_1-2.gat",mf_clouds;
-//setmapflag "new_1-3.gat",mf_clouds;
-//setmapflag "new_1-4.gat",mf_clouds;
-setmapflag "pay_arche.gat",mf_clouds;
-setmapflag "pay_fild01.gat",mf_clouds;
-setmapflag "pay_fild02.gat",mf_clouds;
-setmapflag "pay_fild03.gat",mf_clouds;
-setmapflag "pay_fild04.gat",mf_clouds;
-setmapflag "pay_fild05.gat",mf_clouds;
-setmapflag "pay_fild06.gat",mf_clouds;
-setmapflag "pay_fild07.gat",mf_clouds;
-setmapflag "pay_fild08.gat",mf_clouds;
-setmapflag "pay_fild09.gat",mf_clouds;
-setmapflag "pay_fild10.gat",mf_clouds;
-setmapflag "pay_fild11.gat",mf_clouds;
-//setmapflag "priest_1-1.gat",mf_clouds;
-//setmapflag "priest_2-1.gat",mf_clouds;
-//setmapflag "priest_3-1.gat",mf_clouds;
-setmapflag "prontera.gat",mf_clouds;
-setmapflag "prt_are01.gat",mf_clouds;
-setmapflag "prt_fild00.gat",mf_clouds;
-setmapflag "prt_fild01.gat",mf_clouds;
-setmapflag "prt_fild02.gat",mf_clouds;
-setmapflag "prt_fild03.gat",mf_clouds;
-setmapflag "prt_fild04.gat",mf_clouds;
-setmapflag "prt_fild05.gat",mf_clouds;
-setmapflag "prt_fild06.gat",mf_clouds;
-setmapflag "prt_fild07.gat",mf_clouds;
-setmapflag "prt_fild08.gat",mf_clouds;
-setmapflag "prt_fild09.gat",mf_clouds;
-setmapflag "prt_fild10.gat",mf_clouds;
-setmapflag "prt_fild11.gat",mf_clouds;
-setmapflag "prt_maze01.gat",mf_clouds;
-setmapflag "prt_maze02.gat",mf_clouds;
-setmapflag "prt_maze03.gat",mf_clouds;
-setmapflag "prt_monk.gat",mf_clouds;
-setmapflag "cmd_fild01.gat",mf_clouds;
-setmapflag "cmd_fild02.gat",mf_clouds;
-setmapflag "cmd_fild03.gat",mf_clouds;
-setmapflag "cmd_fild04.gat",mf_clouds;
-setmapflag "cmd_fild05.gat",mf_clouds;
-setmapflag "cmd_fild06.gat",mf_clouds;
-setmapflag "cmd_fild07.gat",mf_clouds;
-setmapflag "cmd_fild08.gat",mf_clouds;
-setmapflag "cmd_fild09.gat",mf_clouds;
-setmapflag "cmd_in01.gat",mf_clouds;
-setmapflag "cmd_in02.gat",mf_clouds;
-setmapflag "gef_fild12.gat",mf_clouds;
-setmapflag "gef_fild13.gat",mf_clouds;
-setmapflag "gef_fild14.gat",mf_clouds;
-setmapflag "alde_gld.gat",mf_clouds;
-setmapflag "pay_gld.gat",mf_clouds;
-setmapflag "prt_gld.gat",mf_clouds;
-setmapflag "alde_alche.gat",mf_clouds;
-setmapflag "yuno.gat",mf_clouds;
-setmapflag "yuno_fild01.gat",mf_clouds;
-setmapflag "yuno_fild02.gat",mf_clouds;
-setmapflag "yuno_fild03.gat",mf_clouds;
-setmapflag "yuno_fild04.gat",mf_clouds;
-setmapflag "ama_fild01.gat",mf_clouds;
-setmapflag "ama_test.gat",mf_clouds;
-setmapflag "amatsu.gat",mf_clouds;
-setmapflag "gon_fild01.gat",mf_clouds;
-setmapflag "gon_test.gat",mf_clouds;
-setmapflag "gonryun.gat",mf_clouds;
-setmapflag "umbala.gat",mf_clouds;
-setmapflag "um_fild01.gat",mf_clouds;
-setmapflag "um_fild02.gat",mf_clouds;
-setmapflag "um_fild03.gat",mf_clouds;
-setmapflag "um_fild04.gat",mf_clouds;
-setmapflag "niflheim.gat",mf_clouds;
-setmapflag "nif_fild01.gat",mf_clouds;
-setmapflag "nif_fild02.gat",mf_clouds;
-setmapflag "nif_in.gat",mf_clouds;
-setmapflag "yggdrasil01.gat",mf_clouds;
-setmapflag "valkyrie.gat",mf_clouds;
-setmapflag "lou_fild01.gat",mf_clouds;
-setmapflag "louyang.gat",mf_clouds;
-setmapflag "nguild_gef.gat",mf_clouds;
-setmapflag "nguild_prt.gat",mf_clouds;
-setmapflag "nguild_pay.gat",mf_clouds;
-setmapflag "nguild_alde.gat",mf_clouds;
-setmapflag "jawaii.gat",mf_clouds;
-setmapflag "jawaii_in.gat",mf_clouds;
-setmapflag "gefenia01.gat",mf_clouds;
-setmapflag "gefenia02.gat",mf_clouds;
-setmapflag "gefenia03.gat",mf_clouds;
-setmapflag "gefenia04.gat",mf_clouds;
-setmapflag "payon.gat",mf_clouds;
-setmapflag "ayothaya.gat",mf_clouds;
-setmapflag "ayo_in01.gat",mf_clouds;
-setmapflag "ayo_in02.gat",mf_clouds;
-setmapflag "ayo_fild01.gat",mf_clouds;
-setmapflag "ayo_fild02.gat",mf_clouds;
-setmapflag "que_god01.gat",mf_clouds;
-setmapflag "que_god02.gat",mf_clouds;
-setmapflag "yuno_fild05.gat",mf_clouds;
-setmapflag "yuno_fild07.gat",mf_clouds;
-setmapflag "yuno_fild08.gat",mf_clouds;
-setmapflag "yuno_fild09.gat",mf_clouds;
-setmapflag "yuno_fild11.gat",mf_clouds;
-setmapflag "yuno_fild12.gat",mf_clouds;
-setmapflag "alde_tt02.gat",mf_clouds;
-setmapflag "einbech.gat",mf_clouds;
-setmapflag "einbroch.gat",mf_clouds;
-setmapflag "ein_fild06.gat",mf_clouds;
-setmapflag "ein_fild07.gat",mf_clouds;
-setmapflag "ein_fild08.gat",mf_clouds;
-setmapflag "ein_fild09.gat",mf_clouds;
-setmapflag "ein_fild10.gat",mf_clouds;
-setmapflag "que_sign01.gat",mf_clouds;
-setmapflag "ein_fild03.gat",mf_clouds;
-setmapflag "ein_fild04.gat",mf_clouds;
-setmapflag "lhz_fild02.gat",mf_clouds;
-setmapflag "lhz_fild03.gat",mf_clouds;
-return;
-}
-
-function script RcloudFlag {
-removemapflag "alb2trea.gat",mf_clouds;
-removemapflag "alberta.gat",mf_clouds;
-removemapflag "aldebaran.gat",mf_clouds;
-removemapflag "gef_fild00.gat",mf_clouds;
-removemapflag "gef_fild01.gat",mf_clouds;
-removemapflag "gef_fild02.gat",mf_clouds;
-removemapflag "gef_fild03.gat",mf_clouds;
-removemapflag "gef_fild04.gat",mf_clouds;
-removemapflag "gef_fild05.gat",mf_clouds;
-removemapflag "gef_fild06.gat",mf_clouds;
-removemapflag "gef_fild07.gat",mf_clouds;
-removemapflag "gef_fild08.gat",mf_clouds;
-removemapflag "gef_fild09.gat",mf_clouds;
-removemapflag "gef_fild10.gat",mf_clouds;
-removemapflag "gef_fild11.gat",mf_clouds;
-removemapflag "geffen.gat",mf_clouds;
-removemapflag "gl_church.gat",mf_clouds;
-removemapflag "gl_chyard.gat",mf_clouds;
-removemapflag "gl_knt01.gat",mf_clouds;
-removemapflag "gl_knt02.gat",mf_clouds;
-removemapflag "gl_step.gat",mf_clouds;
-removemapflag "glast_01.gat",mf_clouds;
-removemapflag "hunter_1-1.gat",mf_clouds;
-removemapflag "hunter_2-1.gat",mf_clouds;
-removemapflag "hunter_3-1.gat",mf_clouds;
-removemapflag "izlude.gat",mf_clouds;
-removemapflag "mjolnir_01.gat",mf_clouds;
-removemapflag "mjolnir_02.gat",mf_clouds;
-removemapflag "mjolnir_03.gat",mf_clouds;
-removemapflag "mjolnir_04.gat",mf_clouds;
-removemapflag "mjolnir_05.gat",mf_clouds;
-removemapflag "mjolnir_06.gat",mf_clouds;
-removemapflag "mjolnir_07.gat",mf_clouds;
-removemapflag "mjolnir_08.gat",mf_clouds;
-removemapflag "mjolnir_09.gat",mf_clouds;
-removemapflag "mjolnir_10.gat",mf_clouds;
-removemapflag "mjolnir_11.gat",mf_clouds;
-removemapflag "mjolnir_12.gat",mf_clouds;
-removemapflag "moc_fild01.gat",mf_clouds;
-removemapflag "moc_fild02.gat",mf_clouds;
-removemapflag "moc_fild03.gat",mf_clouds;
-removemapflag "moc_fild04.gat",mf_clouds;
-removemapflag "moc_fild05.gat",mf_clouds;
-removemapflag "moc_fild06.gat",mf_clouds;
-removemapflag "moc_fild07.gat",mf_clouds;
-removemapflag "moc_fild08.gat",mf_clouds;
-removemapflag "moc_fild09.gat",mf_clouds;
-removemapflag "moc_fild10.gat",mf_clouds;
-removemapflag "moc_fild11.gat",mf_clouds;
-removemapflag "moc_fild12.gat",mf_clouds;
-removemapflag "moc_fild13.gat",mf_clouds;
-removemapflag "moc_fild14.gat",mf_clouds;
-removemapflag "moc_fild15.gat",mf_clouds;
-removemapflag "moc_fild16.gat",mf_clouds;
-removemapflag "moc_fild17.gat",mf_clouds;
-removemapflag "moc_fild18.gat",mf_clouds;
-removemapflag "moc_fild19.gat",mf_clouds;
-removemapflag "moc_pryd01.gat",mf_clouds;
-removemapflag "moc_pryd02.gat",mf_clouds;
-removemapflag "moc_pryd03.gat",mf_clouds;
-removemapflag "moc_pryd04.gat",mf_clouds;
-removemapflag "moc_pryd05.gat",mf_clouds;
-removemapflag "moc_pryd06.gat",mf_clouds;
-removemapflag "moc_prydb1.gat",mf_clouds;
-removemapflag "moc_ruins.gat",mf_clouds;
-removemapflag "morocc.gat",mf_clouds;
-removemapflag "new_1-1.gat",mf_clouds;
-removemapflag "new_1-2.gat",mf_clouds;
-removemapflag "new_1-3.gat",mf_clouds;
-removemapflag "new_1-4.gat",mf_clouds;
-removemapflag "pay_arche.gat",mf_clouds;
-removemapflag "pay_fild01.gat",mf_clouds;
-removemapflag "pay_fild02.gat",mf_clouds;
-removemapflag "pay_fild03.gat",mf_clouds;
-removemapflag "pay_fild04.gat",mf_clouds;
-removemapflag "pay_fild05.gat",mf_clouds;
-removemapflag "pay_fild06.gat",mf_clouds;
-removemapflag "pay_fild07.gat",mf_clouds;
-removemapflag "pay_fild08.gat",mf_clouds;
-removemapflag "pay_fild09.gat",mf_clouds;
-removemapflag "pay_fild10.gat",mf_clouds;
-removemapflag "pay_fild11.gat",mf_clouds;
-removemapflag "priest_1-1.gat",mf_clouds;
-removemapflag "priest_2-1.gat",mf_clouds;
-removemapflag "priest_3-1.gat",mf_clouds;
-removemapflag "prontera.gat",mf_clouds;
-removemapflag "prt_are01.gat",mf_clouds;
-removemapflag "prt_fild00.gat",mf_clouds;
-removemapflag "prt_fild01.gat",mf_clouds;
-removemapflag "prt_fild02.gat",mf_clouds;
-removemapflag "prt_fild03.gat",mf_clouds;
-removemapflag "prt_fild04.gat",mf_clouds;
-removemapflag "prt_fild05.gat",mf_clouds;
-removemapflag "prt_fild06.gat",mf_clouds;
-removemapflag "prt_fild07.gat",mf_clouds;
-removemapflag "prt_fild08.gat",mf_clouds;
-removemapflag "prt_fild09.gat",mf_clouds;
-removemapflag "prt_fild10.gat",mf_clouds;
-removemapflag "prt_fild11.gat",mf_clouds;
-removemapflag "prt_maze01.gat",mf_clouds;
-removemapflag "prt_maze02.gat",mf_clouds;
-removemapflag "prt_maze03.gat",mf_clouds;
-removemapflag "prt_monk.gat",mf_clouds;
-removemapflag "cmd_fild01.gat",mf_clouds;
-removemapflag "cmd_fild02.gat",mf_clouds;
-removemapflag "cmd_fild03.gat",mf_clouds;
-removemapflag "cmd_fild04.gat",mf_clouds;
-removemapflag "cmd_fild05.gat",mf_clouds;
-removemapflag "cmd_fild06.gat",mf_clouds;
-removemapflag "cmd_fild07.gat",mf_clouds;
-removemapflag "cmd_fild08.gat",mf_clouds;
-removemapflag "cmd_fild09.gat",mf_clouds;
-removemapflag "gef_fild12.gat",mf_clouds;
-removemapflag "gef_fild13.gat",mf_clouds;
-removemapflag "gef_fild14.gat",mf_clouds;
-removemapflag "alde_gld.gat",mf_clouds;
-removemapflag "pay_gld.gat",mf_clouds;
-removemapflag "prt_gld.gat",mf_clouds;
-removemapflag "alde_alche.gat",mf_clouds;
-removemapflag "yuno.gat",mf_clouds;
-removemapflag "yuno_fild01.gat",mf_clouds;
-removemapflag "yuno_fild02.gat",mf_clouds;
-removemapflag "yuno_fild03.gat",mf_clouds;
-removemapflag "yuno_fild04.gat",mf_clouds;
-removemapflag "ama_fild01.gat",mf_clouds;
-removemapflag "ama_test.gat",mf_clouds;
-removemapflag "amatsu.gat",mf_clouds;
-removemapflag "gon_fild01.gat",mf_clouds;
-removemapflag "gon_in.gat",mf_clouds;
-removemapflag "gon_test.gat",mf_clouds;
-removemapflag "gonryun.gat",mf_clouds;
-removemapflag "umbala.gat",mf_clouds;
-removemapflag "um_fild01.gat",mf_clouds;
-removemapflag "um_fild02.gat",mf_clouds;
-removemapflag "um_fild03.gat",mf_clouds;
-removemapflag "um_fild04.gat",mf_clouds;
-removemapflag "niflheim.gat",mf_clouds;
-removemapflag "nif_fild01.gat",mf_clouds;
-removemapflag "nif_fild02.gat",mf_clouds;
-removemapflag "nif_in.gat",mf_clouds;
-removemapflag "yggdrasil01.gat",mf_clouds;
-removemapflag "valkyrie.gat",mf_clouds;
-removemapflag "lou_fild01.gat",mf_clouds;
-removemapflag "louyang.gat",mf_clouds;
-removemapflag "nguild_gef.gat",mf_clouds;
-removemapflag "nguild_prt.gat",mf_clouds;
-removemapflag "nguild_pay.gat",mf_clouds;
-removemapflag "nguild_alde.gat",mf_clouds;
-removemapflag "jawaii.gat",mf_clouds;
-removemapflag "jawaii_in.gat",mf_clouds;
-removemapflag "gefenia01.gat",mf_clouds;
-removemapflag "gefenia02.gat",mf_clouds;
-removemapflag "gefenia03.gat",mf_clouds;
-removemapflag "gefenia04.gat",mf_clouds;
-removemapflag "payon.gat",mf_clouds;
-removemapflag "ayothaya.gat",mf_clouds;
-removemapflag "ayo_in01.gat",mf_clouds;
-removemapflag "ayo_in02.gat",mf_clouds;
-removemapflag "ayo_fild01.gat",mf_clouds;
-removemapflag "ayo_fild02.gat",mf_clouds;
-removemapflag "que_god01.gat",mf_clouds;
-removemapflag "que_god02.gat",mf_clouds;
-removemapflag "yuno_fild05.gat",mf_clouds;
-removemapflag "yuno_fild07.gat",mf_clouds;
-removemapflag "yuno_fild08.gat",mf_clouds;
-removemapflag "yuno_fild09.gat",mf_clouds;
-removemapflag "yuno_fild11.gat",mf_clouds;
-removemapflag "yuno_fild12.gat",mf_clouds;
-removemapflag "alde_tt02.gat",mf_clouds;
-removemapflag "einbech.gat",mf_clouds;
-removemapflag "einbroch.gat",mf_clouds;
-removemapflag "ein_fild06.gat",mf_clouds;
-removemapflag "ein_fild07.gat",mf_clouds;
-removemapflag "ein_fild08.gat",mf_clouds;
-removemapflag "ein_fild09.gat",mf_clouds;
-removemapflag "ein_fild10.gat",mf_clouds;
-removemapflag "que_sign01.gat",mf_clouds;
-removemapflag "ein_fild03.gat",mf_clouds;
-removemapflag "ein_fild04.gat",mf_clouds;
-removemapflag "lhz_fild02.gat",mf_clouds;
-removemapflag "lhz_fild03.gat",mf_clouds;
-return;
-}
-
-
+- script dayNight -1,{
+ end;
+
+OnInit:
+ if(gettime(3) > 7 && gettime(3) < 19) {
+ goto L_Day;
+ } else {
+ goto L_Night;
+ }
+
+L_Day:
+ day;
+ callfunc "RcloudFlag";
+ end;
+
+L_Night:
+ night;
+ callfunc "cloudFlag";
+ end;
+
+OnClock1900:
+ goto L_Night;
+
+OnClock0700:
+ goto L_Day;
+}
+
+function script cloudFlag {
+setmapflag "alb2trea.gat",mf_clouds;
+setmapflag "alberta.gat",mf_clouds;
+setmapflag "aldebaran.gat",mf_clouds;
+setmapflag "gef_fild00.gat",mf_clouds;
+setmapflag "gef_fild01.gat",mf_clouds;
+setmapflag "gef_fild02.gat",mf_clouds;
+setmapflag "gef_fild03.gat",mf_clouds;
+setmapflag "gef_fild04.gat",mf_clouds;
+setmapflag "gef_fild05.gat",mf_clouds;
+setmapflag "gef_fild06.gat",mf_clouds;
+setmapflag "gef_fild07.gat",mf_clouds;
+setmapflag "gef_fild08.gat",mf_clouds;
+setmapflag "gef_fild09.gat",mf_clouds;
+setmapflag "gef_fild10.gat",mf_clouds;
+setmapflag "gef_fild11.gat",mf_clouds;
+setmapflag "geffen.gat",mf_clouds;
+setmapflag "gl_church.gat",mf_clouds;
+setmapflag "gl_chyard.gat",mf_clouds;
+setmapflag "gl_knt01.gat",mf_clouds;
+setmapflag "gl_knt02.gat",mf_clouds;
+setmapflag "gl_step.gat",mf_clouds;
+setmapflag "glast_01.gat",mf_clouds;
+//setmapflag "hunter_1-1.gat",mf_clouds;
+//setmapflag "hunter_2-1.gat",mf_clouds;
+//setmapflag "hunter_3-1.gat",mf_clouds;
+setmapflag "izlude.gat",mf_clouds;
+setmapflag "job_thief1.gat",mf_clouds;
+//setmapflag "knight_1-1.gat",mf_clouds;
+//setmapflag "knight_2-1.gat",mf_clouds;
+//setmapflag "knight_3-1.gat",mf_clouds;
+setmapflag "mjolnir_01.gat",mf_clouds;
+setmapflag "mjolnir_02.gat",mf_clouds;
+setmapflag "mjolnir_03.gat",mf_clouds;
+setmapflag "mjolnir_04.gat",mf_clouds;
+setmapflag "mjolnir_05.gat",mf_clouds;
+setmapflag "mjolnir_06.gat",mf_clouds;
+setmapflag "mjolnir_07.gat",mf_clouds;
+setmapflag "mjolnir_08.gat",mf_clouds;
+setmapflag "mjolnir_09.gat",mf_clouds;
+setmapflag "mjolnir_10.gat",mf_clouds;
+setmapflag "mjolnir_11.gat",mf_clouds;
+setmapflag "mjolnir_12.gat",mf_clouds;
+setmapflag "moc_fild01.gat",mf_clouds;
+setmapflag "moc_fild02.gat",mf_clouds;
+setmapflag "moc_fild03.gat",mf_clouds;
+setmapflag "moc_fild04.gat",mf_clouds;
+setmapflag "moc_fild05.gat",mf_clouds;
+setmapflag "moc_fild06.gat",mf_clouds;
+setmapflag "moc_fild07.gat",mf_clouds;
+setmapflag "moc_fild08.gat",mf_clouds;
+setmapflag "moc_fild09.gat",mf_clouds;
+setmapflag "moc_fild10.gat",mf_clouds;
+setmapflag "moc_fild11.gat",mf_clouds;
+setmapflag "moc_fild12.gat",mf_clouds;
+setmapflag "moc_fild13.gat",mf_clouds;
+setmapflag "moc_fild14.gat",mf_clouds;
+setmapflag "moc_fild15.gat",mf_clouds;
+setmapflag "moc_fild16.gat",mf_clouds;
+setmapflag "moc_fild17.gat",mf_clouds;
+setmapflag "moc_fild18.gat",mf_clouds;
+setmapflag "moc_fild19.gat",mf_clouds;
+setmapflag "moc_pryd01.gat",mf_clouds;
+setmapflag "moc_pryd02.gat",mf_clouds;
+setmapflag "moc_pryd03.gat",mf_clouds;
+setmapflag "moc_pryd04.gat",mf_clouds;
+setmapflag "moc_pryd05.gat",mf_clouds;
+setmapflag "moc_pryd06.gat",mf_clouds;
+setmapflag "moc_prydb1.gat",mf_clouds;
+setmapflag "moc_ruins.gat",mf_clouds;
+setmapflag "morocc.gat",mf_clouds;
+//setmapflag "new_1-1.gat",mf_clouds;
+//setmapflag "new_1-2.gat",mf_clouds;
+//setmapflag "new_1-3.gat",mf_clouds;
+//setmapflag "new_1-4.gat",mf_clouds;
+setmapflag "pay_arche.gat",mf_clouds;
+setmapflag "pay_fild01.gat",mf_clouds;
+setmapflag "pay_fild02.gat",mf_clouds;
+setmapflag "pay_fild03.gat",mf_clouds;
+setmapflag "pay_fild04.gat",mf_clouds;
+setmapflag "pay_fild05.gat",mf_clouds;
+setmapflag "pay_fild06.gat",mf_clouds;
+setmapflag "pay_fild07.gat",mf_clouds;
+setmapflag "pay_fild08.gat",mf_clouds;
+setmapflag "pay_fild09.gat",mf_clouds;
+setmapflag "pay_fild10.gat",mf_clouds;
+setmapflag "pay_fild11.gat",mf_clouds;
+//setmapflag "priest_1-1.gat",mf_clouds;
+//setmapflag "priest_2-1.gat",mf_clouds;
+//setmapflag "priest_3-1.gat",mf_clouds;
+setmapflag "prontera.gat",mf_clouds;
+setmapflag "prt_are01.gat",mf_clouds;
+setmapflag "prt_fild00.gat",mf_clouds;
+setmapflag "prt_fild01.gat",mf_clouds;
+setmapflag "prt_fild02.gat",mf_clouds;
+setmapflag "prt_fild03.gat",mf_clouds;
+setmapflag "prt_fild04.gat",mf_clouds;
+setmapflag "prt_fild05.gat",mf_clouds;
+setmapflag "prt_fild06.gat",mf_clouds;
+setmapflag "prt_fild07.gat",mf_clouds;
+setmapflag "prt_fild08.gat",mf_clouds;
+setmapflag "prt_fild09.gat",mf_clouds;
+setmapflag "prt_fild10.gat",mf_clouds;
+setmapflag "prt_fild11.gat",mf_clouds;
+setmapflag "prt_maze01.gat",mf_clouds;
+setmapflag "prt_maze02.gat",mf_clouds;
+setmapflag "prt_maze03.gat",mf_clouds;
+setmapflag "prt_monk.gat",mf_clouds;
+setmapflag "cmd_fild01.gat",mf_clouds;
+setmapflag "cmd_fild02.gat",mf_clouds;
+setmapflag "cmd_fild03.gat",mf_clouds;
+setmapflag "cmd_fild04.gat",mf_clouds;
+setmapflag "cmd_fild05.gat",mf_clouds;
+setmapflag "cmd_fild06.gat",mf_clouds;
+setmapflag "cmd_fild07.gat",mf_clouds;
+setmapflag "cmd_fild08.gat",mf_clouds;
+setmapflag "cmd_fild09.gat",mf_clouds;
+setmapflag "cmd_in01.gat",mf_clouds;
+setmapflag "cmd_in02.gat",mf_clouds;
+setmapflag "gef_fild12.gat",mf_clouds;
+setmapflag "gef_fild13.gat",mf_clouds;
+setmapflag "gef_fild14.gat",mf_clouds;
+setmapflag "alde_gld.gat",mf_clouds;
+setmapflag "pay_gld.gat",mf_clouds;
+setmapflag "prt_gld.gat",mf_clouds;
+setmapflag "alde_alche.gat",mf_clouds;
+setmapflag "yuno.gat",mf_clouds;
+setmapflag "yuno_fild01.gat",mf_clouds;
+setmapflag "yuno_fild02.gat",mf_clouds;
+setmapflag "yuno_fild03.gat",mf_clouds;
+setmapflag "yuno_fild04.gat",mf_clouds;
+setmapflag "ama_fild01.gat",mf_clouds;
+setmapflag "ama_test.gat",mf_clouds;
+setmapflag "amatsu.gat",mf_clouds;
+setmapflag "gon_fild01.gat",mf_clouds;
+setmapflag "gon_test.gat",mf_clouds;
+setmapflag "gonryun.gat",mf_clouds;
+setmapflag "umbala.gat",mf_clouds;
+setmapflag "um_fild01.gat",mf_clouds;
+setmapflag "um_fild02.gat",mf_clouds;
+setmapflag "um_fild03.gat",mf_clouds;
+setmapflag "um_fild04.gat",mf_clouds;
+setmapflag "niflheim.gat",mf_clouds;
+setmapflag "nif_fild01.gat",mf_clouds;
+setmapflag "nif_fild02.gat",mf_clouds;
+setmapflag "nif_in.gat",mf_clouds;
+setmapflag "yggdrasil01.gat",mf_clouds;
+setmapflag "valkyrie.gat",mf_clouds;
+setmapflag "lou_fild01.gat",mf_clouds;
+setmapflag "louyang.gat",mf_clouds;
+setmapflag "nguild_gef.gat",mf_clouds;
+setmapflag "nguild_prt.gat",mf_clouds;
+setmapflag "nguild_pay.gat",mf_clouds;
+setmapflag "nguild_alde.gat",mf_clouds;
+setmapflag "jawaii.gat",mf_clouds;
+setmapflag "jawaii_in.gat",mf_clouds;
+setmapflag "gefenia01.gat",mf_clouds;
+setmapflag "gefenia02.gat",mf_clouds;
+setmapflag "gefenia03.gat",mf_clouds;
+setmapflag "gefenia04.gat",mf_clouds;
+setmapflag "payon.gat",mf_clouds;
+setmapflag "ayothaya.gat",mf_clouds;
+setmapflag "ayo_in01.gat",mf_clouds;
+setmapflag "ayo_in02.gat",mf_clouds;
+setmapflag "ayo_fild01.gat",mf_clouds;
+setmapflag "ayo_fild02.gat",mf_clouds;
+setmapflag "que_god01.gat",mf_clouds;
+setmapflag "que_god02.gat",mf_clouds;
+setmapflag "yuno_fild05.gat",mf_clouds;
+setmapflag "yuno_fild07.gat",mf_clouds;
+setmapflag "yuno_fild08.gat",mf_clouds;
+setmapflag "yuno_fild09.gat",mf_clouds;
+setmapflag "yuno_fild11.gat",mf_clouds;
+setmapflag "yuno_fild12.gat",mf_clouds;
+setmapflag "alde_tt02.gat",mf_clouds;
+setmapflag "einbech.gat",mf_clouds;
+setmapflag "einbroch.gat",mf_clouds;
+setmapflag "ein_fild06.gat",mf_clouds;
+setmapflag "ein_fild07.gat",mf_clouds;
+setmapflag "ein_fild08.gat",mf_clouds;
+setmapflag "ein_fild09.gat",mf_clouds;
+setmapflag "ein_fild10.gat",mf_clouds;
+setmapflag "que_sign01.gat",mf_clouds;
+setmapflag "ein_fild03.gat",mf_clouds;
+setmapflag "ein_fild04.gat",mf_clouds;
+setmapflag "lhz_fild02.gat",mf_clouds;
+setmapflag "lhz_fild03.gat",mf_clouds;
+return;
+}
+
+function script RcloudFlag {
+removemapflag "alb2trea.gat",mf_clouds;
+removemapflag "alberta.gat",mf_clouds;
+removemapflag "aldebaran.gat",mf_clouds;
+removemapflag "gef_fild00.gat",mf_clouds;
+removemapflag "gef_fild01.gat",mf_clouds;
+removemapflag "gef_fild02.gat",mf_clouds;
+removemapflag "gef_fild03.gat",mf_clouds;
+removemapflag "gef_fild04.gat",mf_clouds;
+removemapflag "gef_fild05.gat",mf_clouds;
+removemapflag "gef_fild06.gat",mf_clouds;
+removemapflag "gef_fild07.gat",mf_clouds;
+removemapflag "gef_fild08.gat",mf_clouds;
+removemapflag "gef_fild09.gat",mf_clouds;
+removemapflag "gef_fild10.gat",mf_clouds;
+removemapflag "gef_fild11.gat",mf_clouds;
+removemapflag "geffen.gat",mf_clouds;
+removemapflag "gl_church.gat",mf_clouds;
+removemapflag "gl_chyard.gat",mf_clouds;
+removemapflag "gl_knt01.gat",mf_clouds;
+removemapflag "gl_knt02.gat",mf_clouds;
+removemapflag "gl_step.gat",mf_clouds;
+removemapflag "glast_01.gat",mf_clouds;
+removemapflag "hunter_1-1.gat",mf_clouds;
+removemapflag "hunter_2-1.gat",mf_clouds;
+removemapflag "hunter_3-1.gat",mf_clouds;
+removemapflag "izlude.gat",mf_clouds;
+removemapflag "mjolnir_01.gat",mf_clouds;
+removemapflag "mjolnir_02.gat",mf_clouds;
+removemapflag "mjolnir_03.gat",mf_clouds;
+removemapflag "mjolnir_04.gat",mf_clouds;
+removemapflag "mjolnir_05.gat",mf_clouds;
+removemapflag "mjolnir_06.gat",mf_clouds;
+removemapflag "mjolnir_07.gat",mf_clouds;
+removemapflag "mjolnir_08.gat",mf_clouds;
+removemapflag "mjolnir_09.gat",mf_clouds;
+removemapflag "mjolnir_10.gat",mf_clouds;
+removemapflag "mjolnir_11.gat",mf_clouds;
+removemapflag "mjolnir_12.gat",mf_clouds;
+removemapflag "moc_fild01.gat",mf_clouds;
+removemapflag "moc_fild02.gat",mf_clouds;
+removemapflag "moc_fild03.gat",mf_clouds;
+removemapflag "moc_fild04.gat",mf_clouds;
+removemapflag "moc_fild05.gat",mf_clouds;
+removemapflag "moc_fild06.gat",mf_clouds;
+removemapflag "moc_fild07.gat",mf_clouds;
+removemapflag "moc_fild08.gat",mf_clouds;
+removemapflag "moc_fild09.gat",mf_clouds;
+removemapflag "moc_fild10.gat",mf_clouds;
+removemapflag "moc_fild11.gat",mf_clouds;
+removemapflag "moc_fild12.gat",mf_clouds;
+removemapflag "moc_fild13.gat",mf_clouds;
+removemapflag "moc_fild14.gat",mf_clouds;
+removemapflag "moc_fild15.gat",mf_clouds;
+removemapflag "moc_fild16.gat",mf_clouds;
+removemapflag "moc_fild17.gat",mf_clouds;
+removemapflag "moc_fild18.gat",mf_clouds;
+removemapflag "moc_fild19.gat",mf_clouds;
+removemapflag "moc_pryd01.gat",mf_clouds;
+removemapflag "moc_pryd02.gat",mf_clouds;
+removemapflag "moc_pryd03.gat",mf_clouds;
+removemapflag "moc_pryd04.gat",mf_clouds;
+removemapflag "moc_pryd05.gat",mf_clouds;
+removemapflag "moc_pryd06.gat",mf_clouds;
+removemapflag "moc_prydb1.gat",mf_clouds;
+removemapflag "moc_ruins.gat",mf_clouds;
+removemapflag "morocc.gat",mf_clouds;
+removemapflag "new_1-1.gat",mf_clouds;
+removemapflag "new_1-2.gat",mf_clouds;
+removemapflag "new_1-3.gat",mf_clouds;
+removemapflag "new_1-4.gat",mf_clouds;
+removemapflag "pay_arche.gat",mf_clouds;
+removemapflag "pay_fild01.gat",mf_clouds;
+removemapflag "pay_fild02.gat",mf_clouds;
+removemapflag "pay_fild03.gat",mf_clouds;
+removemapflag "pay_fild04.gat",mf_clouds;
+removemapflag "pay_fild05.gat",mf_clouds;
+removemapflag "pay_fild06.gat",mf_clouds;
+removemapflag "pay_fild07.gat",mf_clouds;
+removemapflag "pay_fild08.gat",mf_clouds;
+removemapflag "pay_fild09.gat",mf_clouds;
+removemapflag "pay_fild10.gat",mf_clouds;
+removemapflag "pay_fild11.gat",mf_clouds;
+removemapflag "priest_1-1.gat",mf_clouds;
+removemapflag "priest_2-1.gat",mf_clouds;
+removemapflag "priest_3-1.gat",mf_clouds;
+removemapflag "prontera.gat",mf_clouds;
+removemapflag "prt_are01.gat",mf_clouds;
+removemapflag "prt_fild00.gat",mf_clouds;
+removemapflag "prt_fild01.gat",mf_clouds;
+removemapflag "prt_fild02.gat",mf_clouds;
+removemapflag "prt_fild03.gat",mf_clouds;
+removemapflag "prt_fild04.gat",mf_clouds;
+removemapflag "prt_fild05.gat",mf_clouds;
+removemapflag "prt_fild06.gat",mf_clouds;
+removemapflag "prt_fild07.gat",mf_clouds;
+removemapflag "prt_fild08.gat",mf_clouds;
+removemapflag "prt_fild09.gat",mf_clouds;
+removemapflag "prt_fild10.gat",mf_clouds;
+removemapflag "prt_fild11.gat",mf_clouds;
+removemapflag "prt_maze01.gat",mf_clouds;
+removemapflag "prt_maze02.gat",mf_clouds;
+removemapflag "prt_maze03.gat",mf_clouds;
+removemapflag "prt_monk.gat",mf_clouds;
+removemapflag "cmd_fild01.gat",mf_clouds;
+removemapflag "cmd_fild02.gat",mf_clouds;
+removemapflag "cmd_fild03.gat",mf_clouds;
+removemapflag "cmd_fild04.gat",mf_clouds;
+removemapflag "cmd_fild05.gat",mf_clouds;
+removemapflag "cmd_fild06.gat",mf_clouds;
+removemapflag "cmd_fild07.gat",mf_clouds;
+removemapflag "cmd_fild08.gat",mf_clouds;
+removemapflag "cmd_fild09.gat",mf_clouds;
+removemapflag "gef_fild12.gat",mf_clouds;
+removemapflag "gef_fild13.gat",mf_clouds;
+removemapflag "gef_fild14.gat",mf_clouds;
+removemapflag "alde_gld.gat",mf_clouds;
+removemapflag "pay_gld.gat",mf_clouds;
+removemapflag "prt_gld.gat",mf_clouds;
+removemapflag "alde_alche.gat",mf_clouds;
+removemapflag "yuno.gat",mf_clouds;
+removemapflag "yuno_fild01.gat",mf_clouds;
+removemapflag "yuno_fild02.gat",mf_clouds;
+removemapflag "yuno_fild03.gat",mf_clouds;
+removemapflag "yuno_fild04.gat",mf_clouds;
+removemapflag "ama_fild01.gat",mf_clouds;
+removemapflag "ama_test.gat",mf_clouds;
+removemapflag "amatsu.gat",mf_clouds;
+removemapflag "gon_fild01.gat",mf_clouds;
+removemapflag "gon_in.gat",mf_clouds;
+removemapflag "gon_test.gat",mf_clouds;
+removemapflag "gonryun.gat",mf_clouds;
+removemapflag "umbala.gat",mf_clouds;
+removemapflag "um_fild01.gat",mf_clouds;
+removemapflag "um_fild02.gat",mf_clouds;
+removemapflag "um_fild03.gat",mf_clouds;
+removemapflag "um_fild04.gat",mf_clouds;
+removemapflag "niflheim.gat",mf_clouds;
+removemapflag "nif_fild01.gat",mf_clouds;
+removemapflag "nif_fild02.gat",mf_clouds;
+removemapflag "nif_in.gat",mf_clouds;
+removemapflag "yggdrasil01.gat",mf_clouds;
+removemapflag "valkyrie.gat",mf_clouds;
+removemapflag "lou_fild01.gat",mf_clouds;
+removemapflag "louyang.gat",mf_clouds;
+removemapflag "nguild_gef.gat",mf_clouds;
+removemapflag "nguild_prt.gat",mf_clouds;
+removemapflag "nguild_pay.gat",mf_clouds;
+removemapflag "nguild_alde.gat",mf_clouds;
+removemapflag "jawaii.gat",mf_clouds;
+removemapflag "jawaii_in.gat",mf_clouds;
+removemapflag "gefenia01.gat",mf_clouds;
+removemapflag "gefenia02.gat",mf_clouds;
+removemapflag "gefenia03.gat",mf_clouds;
+removemapflag "gefenia04.gat",mf_clouds;
+removemapflag "payon.gat",mf_clouds;
+removemapflag "ayothaya.gat",mf_clouds;
+removemapflag "ayo_in01.gat",mf_clouds;
+removemapflag "ayo_in02.gat",mf_clouds;
+removemapflag "ayo_fild01.gat",mf_clouds;
+removemapflag "ayo_fild02.gat",mf_clouds;
+removemapflag "que_god01.gat",mf_clouds;
+removemapflag "que_god02.gat",mf_clouds;
+removemapflag "yuno_fild05.gat",mf_clouds;
+removemapflag "yuno_fild07.gat",mf_clouds;
+removemapflag "yuno_fild08.gat",mf_clouds;
+removemapflag "yuno_fild09.gat",mf_clouds;
+removemapflag "yuno_fild11.gat",mf_clouds;
+removemapflag "yuno_fild12.gat",mf_clouds;
+removemapflag "alde_tt02.gat",mf_clouds;
+removemapflag "einbech.gat",mf_clouds;
+removemapflag "einbroch.gat",mf_clouds;
+removemapflag "ein_fild06.gat",mf_clouds;
+removemapflag "ein_fild07.gat",mf_clouds;
+removemapflag "ein_fild08.gat",mf_clouds;
+removemapflag "ein_fild09.gat",mf_clouds;
+removemapflag "ein_fild10.gat",mf_clouds;
+removemapflag "que_sign01.gat",mf_clouds;
+removemapflag "ein_fild03.gat",mf_clouds;
+removemapflag "ein_fild04.gat",mf_clouds;
+removemapflag "lhz_fild02.gat",mf_clouds;
+removemapflag "lhz_fild03.gat",mf_clouds;
+return;
+}
+
+
diff --git a/npc/custom/MVP_arena/amvp_func.txt b/npc/custom/MVP_arena/amvp_func.txt
index c8ee2fc65..ba66795c8 100644
--- a/npc/custom/MVP_arena/amvp_func.txt
+++ b/npc/custom/MVP_arena/amvp_func.txt
@@ -1,101 +1,101 @@
-// ---- MVP ARENA!!!!!! By Darkchild with 16 diff MVP's inside
-// -- Optimised The MVP arena!!!! By massdriller
-// - NPC in prontera
-
-// --- Optimising Functions
-
-function script Ramvp_1 {
-
- mes "[ ^0065DFAlpha MVP^000000 ]";
- mes "Here you go!";
- return;
-}
-
-function script Ramvp_2 {
-
- mes "[ ^0065DFBeta MVP^000000 ]";
- mes "Here you go!";
- return;
-}
-
-function script Ramvp_3 {
-
- mes "[ ^0065DFTheta MVP^000000 ]";
- mes "Here you go!";
- return;
-
-}
-
-
-function script Ramvp_4 {
-
- mes "[ ^0065DFEpsilon MVP^000000 ]";
- mes "Here you go!";
- return;
-
-}
-
-function script Ramvp_M {
-
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- return;
-
- L_Heal:
- percentheal 100,100;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-
-}
-
-function script Ramvp_M2 {
-
- mes "How do you need help?.";
- menu "Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Heal:
- percentheal 100,100;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-
-}
-
-function script Ramvp_Main {
-
-menu "Intro",L_Intro,"I want to go back",L_Leave,"Heal me please",L_Heal,"Cancel",L_Cancel;
-
-L_Intro:
-mes "[ ^0065DFMVP Arena Guide^000000 ]";
-mes "Welcome and behold this sacred place, Here you will find out if you truly have what it takes to call yourself a warrior, and a Team mate.";
-next;
-mes "Here in [ ^0065DFSvRO^000000 ] we like to be a family, and as a family you learn you must help and assist one-another, so if you want to survive you should learn to Co-operate.";
-next;
-mes "There are Plenty of rooms with MVP's in them so don't all fight over the one room just cause you think it's the only one, just move to the next one.";
-next;
-mes "If you can't get along, and there is too much complaining about people stealing MVP kills and items... then this place will be removed.";
-next;
-mes "Now the npc's are in groups of monsters, there are 4 different mvps per each npc, i wont tell you which it's a surprise hehe.";
-next;
-mes "Good luck, Live long and Prosper!.";
-close;
-
-L_Leave:
-warp "prontera",156,179;
-close;
-
-L_Heal:
-Heal 32500,32500;
-close;
-
-L_Cancel:
-close;
-
+// ---- MVP ARENA!!!!!! By Darkchild with 16 diff MVP's inside
+// -- Optimised The MVP arena!!!! By massdriller
+// - NPC in prontera
+
+// --- Optimising Functions
+
+function script Ramvp_1 {
+
+ mes "[ ^0065DFAlpha MVP^000000 ]";
+ mes "Here you go!";
+ return;
+}
+
+function script Ramvp_2 {
+
+ mes "[ ^0065DFBeta MVP^000000 ]";
+ mes "Here you go!";
+ return;
+}
+
+function script Ramvp_3 {
+
+ mes "[ ^0065DFTheta MVP^000000 ]";
+ mes "Here you go!";
+ return;
+
+}
+
+
+function script Ramvp_4 {
+
+ mes "[ ^0065DFEpsilon MVP^000000 ]";
+ mes "Here you go!";
+ return;
+
+}
+
+function script Ramvp_M {
+
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ return;
+
+ L_Heal:
+ percentheal 100,100;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+
+}
+
+function script Ramvp_M2 {
+
+ mes "How do you need help?.";
+ menu "Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Heal:
+ percentheal 100,100;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+
+}
+
+function script Ramvp_Main {
+
+menu "Intro",L_Intro,"I want to go back",L_Leave,"Heal me please",L_Heal,"Cancel",L_Cancel;
+
+L_Intro:
+mes "[ ^0065DFMVP Arena Guide^000000 ]";
+mes "Welcome and behold this sacred place, Here you will find out if you truly have what it takes to call yourself a warrior, and a Team mate.";
+next;
+mes "Here in [ ^0065DFSvRO^000000 ] we like to be a family, and as a family you learn you must help and assist one-another, so if you want to survive you should learn to Co-operate.";
+next;
+mes "There are Plenty of rooms with MVP's in them so don't all fight over the one room just cause you think it's the only one, just move to the next one.";
+next;
+mes "If you can't get along, and there is too much complaining about people stealing MVP kills and items... then this place will be removed.";
+next;
+mes "Now the npc's are in groups of monsters, there are 4 different mvps per each npc, i wont tell you which it's a surprise hehe.";
+next;
+mes "Good luck, Live long and Prosper!.";
+close;
+
+L_Leave:
+warp "prontera",156,179;
+close;
+
+L_Heal:
+Heal 32500,32500;
+close;
+
+L_Cancel:
+close;
+
} \ No newline at end of file
diff --git a/npc/custom/MVP_arena/arena_mvp.txt b/npc/custom/MVP_arena/arena_mvp.txt
index bb19d6a23..816879c21 100644
--- a/npc/custom/MVP_arena/arena_mvp.txt
+++ b/npc/custom/MVP_arena/arena_mvp.txt
@@ -1,792 +1,792 @@
-// ---- MVP ARENA!!!!!! By Darkchild with 16 diff MVP's inside
-// -- Optimised The MVP arena!!!! By massdriller
-// - NPC in prontera
-// - Removed Duplicates [Silent]
-
-prontera.gat,154,197,3 script MVP Warper 768,{
-mes "[ ^0065DFMVP Warper^000000 ]";
-mes "Would you like to go to the MVP Arena ?...";
-menu "Yes!",L_MVP,"No thanks.",L_No;
-
-L_MVP:
-warp "quiz_00",50,24;
-close;
-L_No:
-close;
-}
-// --- Inside the Arena
-// --- NPC's That explains thigns
-quiz_00.gat,49,31,4 script MVP Arena Guide 778,{
- callfunc "Ramvp_Main";
-
-}
-
-// --- The first Alpha-MVP warper
-quiz_00.gat,56,31,4 script Alpha MVP 770,{
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "I am the first Keeper, are you ready?.";
-menu "Yes!",L_Yes,"Urrr No.",L_No;
-
-L_Yes:
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Which Arena you want to go to??";
- menu "Arena 1 [" + getmapusers("pvp_n_1-2.gat") + " / 50]",Larena1,
- "Arena 2 [" + getmapusers("pvp_n_2-2.gat") + " / 50]",Larena2,
- "Arena 3 [" + getmapusers("pvp_n_3-2.gat") + " / 15]",Larena3,
- "Arena 4 [" + getmapusers("pvp_n_4-2.gat") + " / 15]",Larena4,
- "Arena 5 [" + getmapusers("pvp_n_5-2.gat") + " / 15]",Larena5,
- "Arena 6 [" + getmapusers("pvp_n_2-2.gat") + " / 15]",Larena6,
- "Arena 7 [" + getmapusers("pvp_n_3-2.gat") + " / 15]",Larena7,
- "Arena 8 [" + getmapusers("pvp_n_4-2.gat") + " / 15]",Larena8,
- "Quit",Lcancel;
-
-L_No:
-close;
-
-Larena1:
-if (getmapusers("pvp_n_1-2.gat") > 49) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_1-2",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-2.gat") > 49) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_2-2",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_3-2",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_4-2",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_5-2",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_6-2",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_7-2",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-2.gat") > 14) goto Lsorry;
-callfunc "Ramvp_1";
-warp "pvp_n_8-2",102,102;
-close;
-
-Lsorry:
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Sorry but this Arena is already full, maybe you can try another one!";
-close;
-}
-
-// --- The first Beta-MVP warper
-quiz_00.gat,58,31,4 script Beta MVP 773,{
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "I am the first Keeper, are you ready?.";
-menu "Yes!",L_Yes,"Urrr No.",L_No;
-
-L_Yes:
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Which Arena you want to go to??";
- menu "Arena 1 [" + getmapusers("pvp_n_1-3.gat") + " / 50]",Larena1,
- "Arena 2 [" + getmapusers("pvp_n_2-3.gat") + " / 15]",Larena2,
- "Arena 3 [" + getmapusers("pvp_n_3-3.gat") + " / 15]",Larena3,
- "Arena 4 [" + getmapusers("pvp_n_4-3.gat") + " / 15]",Larena4,
- "Arena 5 [" + getmapusers("pvp_n_5-3.gat") + " / 15]",Larena5,
- "Arena 6 [" + getmapusers("pvp_n_2-3.gat") + " / 15]",Larena6,
- "Arena 7 [" + getmapusers("pvp_n_3-3.gat") + " / 15]",Larena7,
- "Arena 8 [" + getmapusers("pvp_n_4-3.gat") + " / 15]",Larena8,
- "Quit",Lcancel;
-
-L_No:
-close;
-
-Lcancel:
-close;
-
-Larena1:
-if (getmapusers("pvp_n_1-3.gat") > 49) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_1-3",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_2-3",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_3-3",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_4-3.gat",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_5-3.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_6-3.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_7-3.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-3.gat") > 14) goto Lsorry;
-callfunc "Ramvp_2";
-warp "pvp_n_8-3.gat",102,102;
-close;
-
-Lsorry:
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Sorry but this Arena is already full, maybe you can try another one!";
-close;
-}
-
-
-// --- The first Theta-MVP warper
-quiz_00.gat,60,31,4 script Theta MVP 774,{
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "I am the first Keeper, are you ready?.";
-menu "Yes!",L_Yes,"Urrr No.",L_No;
-
-L_Yes:
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Which Arena you want to go to??";
- menu "Arena 1 [" + getmapusers("pvp_n_1-4.gat") + " / 50]",Larena1,
- "Arena 2 [" + getmapusers("pvp_n_2-4.gat") + " / 15]",Larena2,
- "Arena 3 [" + getmapusers("pvp_n_3-4.gat") + " / 15]",Larena3,
- "Arena 4 [" + getmapusers("pvp_n_4-4.gat") + " / 15]",Larena4,
- "Arena 5 [" + getmapusers("pvp_n_5-4.gat") + " / 15]",Larena5,
- "Arena 6 [" + getmapusers("pvp_n_2-4.gat") + " / 15]",Larena6,
- "Arena 7 [" + getmapusers("pvp_n_3-4.gat") + " / 15]",Larena7,
- "Arena 8 [" + getmapusers("pvp_n_4-4.gat") + " / 15]",Larena8,
- "Quit",Lcancel;
-
-L_No:
-close;
-
-Larena1:
-if (getmapusers("pvp_n_1-4.gat") > 49) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_1-4.gat",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_2-4.gat",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_3-4.gat",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_4-4.gat",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_5-4.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_6-4.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_7-4.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-4.gat") > 14) goto Lsorry;
-callfunc "Ramvp_3";
-warp "pvp_n_8-4.gat",102,102;
-close;
-
-Lsorry:
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Sorry but this Arena is already full, maybe you can try another one!";
-close;
-}
-
-
-// --- The first Epsilon-MVP warper
-quiz_00.gat,62,31,4 script Epsilon MVP 776,{
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "I am the first Keeper, are you ready?.";
-menu "Yes!",L_Yes,"Urrr No.",L_No;
-
-L_Yes:
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Which Arena you want to go to??";
- menu "Arena 1 [" + getmapusers("pvp_n_1-5.gat") + " / 50]",Larena1,
- "Arena 2 [" + getmapusers("pvp_n_2-5.gat") + " / 15]",Larena2,
- "Arena 3 [" + getmapusers("pvp_n_3-5.gat") + " / 15]",Larena3,
- "Arena 4 [" + getmapusers("pvp_n_4-5.gat") + " / 15]",Larena4,
- "Arena 5 [" + getmapusers("pvp_n_5-5.gat") + " / 15]",Larena5,
- "Arena 6 [" + getmapusers("pvp_n_2-5.gat") + " / 15]",Larena6,
- "Arena 7 [" + getmapusers("pvp_n_3-5.gat") + " / 15]",Larena7,
- "Arena 8 [" + getmapusers("pvp_n_4-5.gat") + " / 15]",Larena8,
- "Quit",Lcancel;
-
-L_No:
-close;
-
-Larena1:
-if (getmapusers("pvp_n_1-5.gat") > 49) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_1-5.gat",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_2-5.gat",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_3-5.gat",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_4-5.gat",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_5-5.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_6-5.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_7-5.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-5.gat") > 14) goto Lsorry;
-callfunc "Ramvp_4";
-warp "pvp_n_8-5.gat",102,102;
-close;
-
-Lsorry:
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Sorry but this Arena is already full, maybe you can try another one!";
-close;
-}
-
-
-// ---- Inside MVP-Arena NPC's
-// --- Alpha-MVP #1
-pvp_n_1-2.gat,100,100,4 script MVP-Protector#01 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_2-2",102,102;
- close;
-
-}
-
-// --- Alpha-MVP #2
-pvp_n_2-2.gat,100,100,4 script MVP-Protector#02 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_3-2",102,102;
- close;
-
-}
-// --- Alpha-MVP #3
-pvp_n_3-2.gat,100,100,4 script MVP-Protector#03 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_4-2.gat",102,102;
- close;
-
-}
-// --- Alpha-MVP #4
-pvp_n_4-2.gat,100,100,4 script MVP-Protector#04 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_5-2.gat",102,102;
- close;
-
-}
-// --- Alpha-MVP #5
-pvp_n_5-2.gat,100,100,4 script MVP-Protector#05 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_6-2.gat",102,102;
- close;
-
-}
-// --- Alpha-MVP #6
-pvp_n_6-2.gat,100,100,4 script MVP-Protector#06 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_7-2.gat",102,102;
- close;
-
-}
-// --- Alpha-MVP #7
-pvp_n_7-2.gat,100,100,4 script MVP-Protector#07 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_8-2.gat",102,102;
- close;
-}
-// --- Alpha-MVP #8
-pvp_n_8-2.gat,100,100,4 script MVP-Protector#08 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M2";
-}
-// --- Beta-MVP #1
-pvp_n_1-3.gat,100,100,4 script MVP-Protector#09 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_2-3.gat",102,102;
- close;
-
-}
-
-// --- Beta-MVP #2
-pvp_n_2-3.gat,100,100,4 script MVP-Protector#10 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_3-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #3
-pvp_n_3-3.gat,100,100,4 script MVP-Protector#11 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_4-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #4
-pvp_n_4-3.gat,100,100,4 script MVP-Protector#12 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_5-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #5
-pvp_n_5-3.gat,100,100,4 script MVP-Protector#13 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_6-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #6
-pvp_n_6-3.gat,100,100,4 script MVP-Protector#14 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_7-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #7
-pvp_n_7-3.gat,100,100,4 script MVP-Protector#15 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_8-3.gat",102,102;
- close;
-
-}
-// --- Beta-MVP #8
-pvp_n_8-3.gat,100,100,4 script MVP-Protector#16 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M2";
-}
-// --- Theta-MVP #1
-pvp_n_1-4.gat,100,100,4 script MVP-Protector#17 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_2-4.gat",102,102;
- close;
-
-}
-
-// --- Theta-MVP #2
-pvp_n_2-4.gat,100,100,4 script MVP-Protector#18 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_3-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #3
-pvp_n_3-4.gat,100,100,4 script MVP-Protector#19 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_4-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #4
-pvp_n_4-4.gat,100,100,4 script MVP-Protector#20 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_5-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #5
-pvp_n_5-4.gat,100,100,4 script MVP-Protector#21 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_6-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #6
-pvp_n_6-4.gat,100,100,4 script MVP-Protector#22 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_7-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #7
-pvp_n_7-4.gat,100,100,4 script MVP-Protector#23 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_8-4.gat",102,102;
- close;
-
-}
-// --- Theta-MVP #8
-pvp_n_8-4.gat,100,100,4 script MVP-Protector#24 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M2";
-}
-// --- Epsilon-MVP #1
-pvp_n_1-5.gat,100,100,4 script MVP-Protector#25 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_2-5.gat",102,102;
- close;
-
-}
-
-// --- Epsilon-MVP #2
-pvp_n_2-5.gat,100,100,4 script MVP-Protector#26 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_3-5.gat",102,102;
- close;
-
-}
-// --- Epsilon-MVP #3
-pvp_n_3-5.gat,100,100,4 script MVP-Protector#27 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_4-5.gat",102,102;
- close;
-
-}
-// --- Epsilon-MVP #4
-pvp_n_4-5.gat,100,100,4 script MVP-Protector#28 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_5-5.gat",102,102;
- close;
-
-}
-// --- Epsilon-MVP #5
-pvp_n_5-5.gat,100,100,4 script MVP-Protector#29 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_6-5.gat",102,102;
- close;
-
-}
-// --- Epsilon-MVP #6
-pvp_n_6-5.gat,100,100,4 script MVP-Protector#30 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_7-5.gat",102,102;
- close;
-
-}
-// --- Epsilon-MVP #7
-pvp_n_7-5.gat,100,100,4 script MVP-Protector#31 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M";
-
- L_Next:
- warp "pvp_n_8-5.gat",102,102;
- close;
-}
-// --- Epsilon-MVP #8
-pvp_n_8-5.gat,100,100,4 script MVP-Protector#32 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- callfunc "Ramvp_M2";
-}
-
-// ---- Monsters for the MVP-Arena
-// --- Alpha-MVP Maps
-// --- First Alpha-MVP area
-pvp_n_1-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
-pvp_n_1-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
-// --- Second Alpha-MVP area
-pvp_n_2-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
-pvp_n_2-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
-// --- Third Alpha-MVP area
-pvp_n_3-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
-pvp_n_3-2.gat,0,0,0,0 monster Moonlight 1150,2,60000,66000
-pvp_n_3-2.gat,0,0,0,0 monster Maya 1147,1,60000,66000
-// --- Fourth Alpha-MVP area
-pvp_n_4-2.gat,0,0,0,0 monster Eddga 1115,1,60000,66000
-pvp_n_4-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
-pvp_n_4-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
-pvp_n_4-2.gat,0,0,0,0 monster Maya 1147,1,60000,66000
-// --- Fifth Alpha-MVP area
-pvp_n_5-2.gat,0,0,0,0 monster Eddga 1115,1,60000,66000
-pvp_n_5-2.gat,0,0,0,0 monster Mistress 1059,2,60000,66000
-pvp_n_5-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
-pvp_n_5-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
-// --- Sixth Alpha-MVP area
-pvp_n_6-2.gat,0,0,0,0 monster Eddga 1115,2,60000,66000
-pvp_n_6-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
-pvp_n_6-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
-pvp_n_6-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
-// --- Seventh Alpha-MVP area
-pvp_n_7-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
-pvp_n_7-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
-pvp_n_7-2.gat,0,0,0,0 monster Moonlight 1150,2,60000,66000
-pvp_n_7-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
-// --- Eighth Alpha-MVP area
-pvp_n_8-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
-pvp_n_8-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
-pvp_n_8-2.gat,0,0,0,0 monster Moonlight 1150,3,60000,66000
-pvp_n_8-2.gat,0,0,0,0 monster Maya 1147,3,60000,66000
-
-// --- Beta-MVP Maps
-// --- First Beta-MVP area
-pvp_n_1-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
-pvp_n_1-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-// --- Second Beta-MVP area
-pvp_n_2-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
-pvp_n_3-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-pvp_n_2-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
-// --- Third Beta-MVP area
-pvp_n_3-3.gat,0,0,0,0 monster Phreeoni 1159,1,60000,66000
-pvp_n_3-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-pvp_n_3-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
-pvp_n_3-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
-// --- Fourth Beta-MVP area
-pvp_n_4-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
-pvp_n_4-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-pvp_n_4-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
-pvp_n_4-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
-// --- Fifth Beta-MVP area
-pvp_n_5-3.gat,0,0,0,0 monster Phreeoni 1159,1,60000,66000
-pvp_n_5-3.gat,0,0,0,0 monster Turtle General 1312,2,60000,66000
-pvp_n_5-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
-pvp_n_5-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
-// --- Sixth Beta-MVP area
-pvp_n_6-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
-pvp_n_6-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-pvp_n_6-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
-pvp_n_6-3.gat,0,0,0,0 monster Orc Lord 1190,2,60000,66000
-// --- Seventh Beta-MVP area
-pvp_n_7-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
-pvp_n_7-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
-pvp_n_7-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
-pvp_n_7-3.gat,0,0,0,0 monster Orc Lord 1190,3,60000,66000
-// --- Eighth Beta-MVP area
-pvp_n_8-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
-pvp_n_8-3.gat,0,0,0,0 monster Turtle General 1312,3,60000,66000
-pvp_n_8-3.gat,0,0,0,0 monster Orc Hero 1087,3,60000,66000
-pvp_n_8-3.gat,0,0,0,0 monster Orc Lord 1190,3,60000,66000
-
-// --- Theta-MVP Maps
-// --- First Theta-MVP area
-pvp_n_1-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
-pvp_n_1-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
-// --- Second Theta-MVP area
-pvp_n_2-4.gat,0,0,0,0 monster Drake 1112,2,60000,66000
-pvp_n_2-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
-pvp_n_2-4.gat,0,0,0,0 monster Doppelganger 1046,1,60000,66000
-// --- Third Theta-MVP area
-pvp_n_3-4.gat,0,0,0,0 monster Drake 1112,1,60000,66000
-pvp_n_3-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
-pvp_n_3-4.gat,0,0,0,0 monster Doppelganger 1046,1,60000,66000
-pvp_n_3-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
-// --- Fourth Theta-MVP area
-pvp_n_4-4.gat,0,0,0,0 monster Drake 1112,2,60000,66000
-pvp_n_4-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
-pvp_n_4-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
-pvp_n_4-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
-// --- Fifth Theta-MVP area
-pvp_n_5-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
-pvp_n_5-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
-pvp_n_5-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
-pvp_n_5-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
-// --- Sixth Theta-MVP area
-pvp_n_6-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
-pvp_n_6-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
-pvp_n_6-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
-pvp_n_6-4.gat,0,0,0,0 monster Lord of Death 1373,2,60000,66000
-// --- Seventh Theta-MVP area
-pvp_n_7-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
-pvp_n_7-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
-pvp_n_7-4.gat,0,0,0,0 monster Doppelganger 1046,3,60000,66000
-pvp_n_7-4.gat,0,0,0,0 monster Lord of Death 1373,2,60000,66000
-// --- Eighth Theta-MVP area
-pvp_n_8-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
-pvp_n_8-4.gat,0,0,0,0 monster Osiris 1038,3,60000,66000
-pvp_n_8-4.gat,0,0,0,0 monster Doppelganger 1046,3,60000,66000
-pvp_n_8-4.gat,0,0,0,0 monster Lord of Death 1373,3,60000,66000
-
-// --- Epsilon-MVP Maps
-// --- First Epsilon-MVP area
-pvp_n_1-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
-pvp_n_1-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_2-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
-pvp_n_2-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
-pvp_n_2-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_3-5.gat,0,0,0,0 monster Incantation Samurai 1492,1,60000,66000
-pvp_n_3-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
-pvp_n_3-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
-pvp_n_3-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_4-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
-pvp_n_4-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
-pvp_n_4-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
-pvp_n_4-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_5-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
-pvp_n_5-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
-pvp_n_5-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
-pvp_n_5-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_6-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
-pvp_n_6-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
-pvp_n_6-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
-pvp_n_6-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_7-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
-pvp_n_7-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
-pvp_n_7-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
-pvp_n_7-5.gat,0,0,0,0 monster Baphomet 1039,2,60000,66000
-// --- First Epsilon-MVP area
-pvp_n_8-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
-pvp_n_8-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
-pvp_n_8-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
-pvp_n_8-5.gat,0,0,0,0 monster Baphomet 1039,2,60000,66000
+// ---- MVP ARENA!!!!!! By Darkchild with 16 diff MVP's inside
+// -- Optimised The MVP arena!!!! By massdriller
+// - NPC in prontera
+// - Removed Duplicates [Silent]
+
+prontera.gat,154,197,3 script MVP Warper 768,{
+mes "[ ^0065DFMVP Warper^000000 ]";
+mes "Would you like to go to the MVP Arena ?...";
+menu "Yes!",L_MVP,"No thanks.",L_No;
+
+L_MVP:
+warp "quiz_00",50,24;
+close;
+L_No:
+close;
+}
+// --- Inside the Arena
+// --- NPC's That explains thigns
+quiz_00.gat,49,31,4 script MVP Arena Guide 778,{
+ callfunc "Ramvp_Main";
+
+}
+
+// --- The first Alpha-MVP warper
+quiz_00.gat,56,31,4 script Alpha MVP 770,{
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "I am the first Keeper, are you ready?.";
+menu "Yes!",L_Yes,"Urrr No.",L_No;
+
+L_Yes:
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Which Arena you want to go to??";
+ menu "Arena 1 [" + getmapusers("pvp_n_1-2.gat") + " / 50]",Larena1,
+ "Arena 2 [" + getmapusers("pvp_n_2-2.gat") + " / 50]",Larena2,
+ "Arena 3 [" + getmapusers("pvp_n_3-2.gat") + " / 15]",Larena3,
+ "Arena 4 [" + getmapusers("pvp_n_4-2.gat") + " / 15]",Larena4,
+ "Arena 5 [" + getmapusers("pvp_n_5-2.gat") + " / 15]",Larena5,
+ "Arena 6 [" + getmapusers("pvp_n_2-2.gat") + " / 15]",Larena6,
+ "Arena 7 [" + getmapusers("pvp_n_3-2.gat") + " / 15]",Larena7,
+ "Arena 8 [" + getmapusers("pvp_n_4-2.gat") + " / 15]",Larena8,
+ "Quit",Lcancel;
+
+L_No:
+close;
+
+Larena1:
+if (getmapusers("pvp_n_1-2.gat") > 49) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_1-2",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-2.gat") > 49) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_2-2",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_3-2",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_4-2",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_5-2",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_6-2",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_7-2",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-2.gat") > 14) goto Lsorry;
+callfunc "Ramvp_1";
+warp "pvp_n_8-2",102,102;
+close;
+
+Lsorry:
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Sorry but this Arena is already full, maybe you can try another one!";
+close;
+}
+
+// --- The first Beta-MVP warper
+quiz_00.gat,58,31,4 script Beta MVP 773,{
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "I am the first Keeper, are you ready?.";
+menu "Yes!",L_Yes,"Urrr No.",L_No;
+
+L_Yes:
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Which Arena you want to go to??";
+ menu "Arena 1 [" + getmapusers("pvp_n_1-3.gat") + " / 50]",Larena1,
+ "Arena 2 [" + getmapusers("pvp_n_2-3.gat") + " / 15]",Larena2,
+ "Arena 3 [" + getmapusers("pvp_n_3-3.gat") + " / 15]",Larena3,
+ "Arena 4 [" + getmapusers("pvp_n_4-3.gat") + " / 15]",Larena4,
+ "Arena 5 [" + getmapusers("pvp_n_5-3.gat") + " / 15]",Larena5,
+ "Arena 6 [" + getmapusers("pvp_n_2-3.gat") + " / 15]",Larena6,
+ "Arena 7 [" + getmapusers("pvp_n_3-3.gat") + " / 15]",Larena7,
+ "Arena 8 [" + getmapusers("pvp_n_4-3.gat") + " / 15]",Larena8,
+ "Quit",Lcancel;
+
+L_No:
+close;
+
+Lcancel:
+close;
+
+Larena1:
+if (getmapusers("pvp_n_1-3.gat") > 49) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_1-3",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_2-3",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_3-3",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_4-3.gat",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_5-3.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_6-3.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_7-3.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-3.gat") > 14) goto Lsorry;
+callfunc "Ramvp_2";
+warp "pvp_n_8-3.gat",102,102;
+close;
+
+Lsorry:
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Sorry but this Arena is already full, maybe you can try another one!";
+close;
+}
+
+
+// --- The first Theta-MVP warper
+quiz_00.gat,60,31,4 script Theta MVP 774,{
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "I am the first Keeper, are you ready?.";
+menu "Yes!",L_Yes,"Urrr No.",L_No;
+
+L_Yes:
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Which Arena you want to go to??";
+ menu "Arena 1 [" + getmapusers("pvp_n_1-4.gat") + " / 50]",Larena1,
+ "Arena 2 [" + getmapusers("pvp_n_2-4.gat") + " / 15]",Larena2,
+ "Arena 3 [" + getmapusers("pvp_n_3-4.gat") + " / 15]",Larena3,
+ "Arena 4 [" + getmapusers("pvp_n_4-4.gat") + " / 15]",Larena4,
+ "Arena 5 [" + getmapusers("pvp_n_5-4.gat") + " / 15]",Larena5,
+ "Arena 6 [" + getmapusers("pvp_n_2-4.gat") + " / 15]",Larena6,
+ "Arena 7 [" + getmapusers("pvp_n_3-4.gat") + " / 15]",Larena7,
+ "Arena 8 [" + getmapusers("pvp_n_4-4.gat") + " / 15]",Larena8,
+ "Quit",Lcancel;
+
+L_No:
+close;
+
+Larena1:
+if (getmapusers("pvp_n_1-4.gat") > 49) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_1-4.gat",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_2-4.gat",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_3-4.gat",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_4-4.gat",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_5-4.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_6-4.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_7-4.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-4.gat") > 14) goto Lsorry;
+callfunc "Ramvp_3";
+warp "pvp_n_8-4.gat",102,102;
+close;
+
+Lsorry:
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Sorry but this Arena is already full, maybe you can try another one!";
+close;
+}
+
+
+// --- The first Epsilon-MVP warper
+quiz_00.gat,62,31,4 script Epsilon MVP 776,{
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "I am the first Keeper, are you ready?.";
+menu "Yes!",L_Yes,"Urrr No.",L_No;
+
+L_Yes:
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Which Arena you want to go to??";
+ menu "Arena 1 [" + getmapusers("pvp_n_1-5.gat") + " / 50]",Larena1,
+ "Arena 2 [" + getmapusers("pvp_n_2-5.gat") + " / 15]",Larena2,
+ "Arena 3 [" + getmapusers("pvp_n_3-5.gat") + " / 15]",Larena3,
+ "Arena 4 [" + getmapusers("pvp_n_4-5.gat") + " / 15]",Larena4,
+ "Arena 5 [" + getmapusers("pvp_n_5-5.gat") + " / 15]",Larena5,
+ "Arena 6 [" + getmapusers("pvp_n_2-5.gat") + " / 15]",Larena6,
+ "Arena 7 [" + getmapusers("pvp_n_3-5.gat") + " / 15]",Larena7,
+ "Arena 8 [" + getmapusers("pvp_n_4-5.gat") + " / 15]",Larena8,
+ "Quit",Lcancel;
+
+L_No:
+close;
+
+Larena1:
+if (getmapusers("pvp_n_1-5.gat") > 49) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_1-5.gat",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_2-5.gat",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_3-5.gat",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_4-5.gat",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_5-5.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_6-5.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_7-5.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-5.gat") > 14) goto Lsorry;
+callfunc "Ramvp_4";
+warp "pvp_n_8-5.gat",102,102;
+close;
+
+Lsorry:
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Sorry but this Arena is already full, maybe you can try another one!";
+close;
+}
+
+
+// ---- Inside MVP-Arena NPC's
+// --- Alpha-MVP #1
+pvp_n_1-2.gat,100,100,4 script MVP-Protector#01 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_2-2",102,102;
+ close;
+
+}
+
+// --- Alpha-MVP #2
+pvp_n_2-2.gat,100,100,4 script MVP-Protector#02 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_3-2",102,102;
+ close;
+
+}
+// --- Alpha-MVP #3
+pvp_n_3-2.gat,100,100,4 script MVP-Protector#03 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_4-2.gat",102,102;
+ close;
+
+}
+// --- Alpha-MVP #4
+pvp_n_4-2.gat,100,100,4 script MVP-Protector#04 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_5-2.gat",102,102;
+ close;
+
+}
+// --- Alpha-MVP #5
+pvp_n_5-2.gat,100,100,4 script MVP-Protector#05 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_6-2.gat",102,102;
+ close;
+
+}
+// --- Alpha-MVP #6
+pvp_n_6-2.gat,100,100,4 script MVP-Protector#06 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_7-2.gat",102,102;
+ close;
+
+}
+// --- Alpha-MVP #7
+pvp_n_7-2.gat,100,100,4 script MVP-Protector#07 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_8-2.gat",102,102;
+ close;
+}
+// --- Alpha-MVP #8
+pvp_n_8-2.gat,100,100,4 script MVP-Protector#08 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M2";
+}
+// --- Beta-MVP #1
+pvp_n_1-3.gat,100,100,4 script MVP-Protector#09 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_2-3.gat",102,102;
+ close;
+
+}
+
+// --- Beta-MVP #2
+pvp_n_2-3.gat,100,100,4 script MVP-Protector#10 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_3-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #3
+pvp_n_3-3.gat,100,100,4 script MVP-Protector#11 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_4-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #4
+pvp_n_4-3.gat,100,100,4 script MVP-Protector#12 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_5-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #5
+pvp_n_5-3.gat,100,100,4 script MVP-Protector#13 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_6-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #6
+pvp_n_6-3.gat,100,100,4 script MVP-Protector#14 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_7-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #7
+pvp_n_7-3.gat,100,100,4 script MVP-Protector#15 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_8-3.gat",102,102;
+ close;
+
+}
+// --- Beta-MVP #8
+pvp_n_8-3.gat,100,100,4 script MVP-Protector#16 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M2";
+}
+// --- Theta-MVP #1
+pvp_n_1-4.gat,100,100,4 script MVP-Protector#17 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_2-4.gat",102,102;
+ close;
+
+}
+
+// --- Theta-MVP #2
+pvp_n_2-4.gat,100,100,4 script MVP-Protector#18 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_3-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #3
+pvp_n_3-4.gat,100,100,4 script MVP-Protector#19 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_4-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #4
+pvp_n_4-4.gat,100,100,4 script MVP-Protector#20 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_5-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #5
+pvp_n_5-4.gat,100,100,4 script MVP-Protector#21 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_6-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #6
+pvp_n_6-4.gat,100,100,4 script MVP-Protector#22 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_7-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #7
+pvp_n_7-4.gat,100,100,4 script MVP-Protector#23 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_8-4.gat",102,102;
+ close;
+
+}
+// --- Theta-MVP #8
+pvp_n_8-4.gat,100,100,4 script MVP-Protector#24 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M2";
+}
+// --- Epsilon-MVP #1
+pvp_n_1-5.gat,100,100,4 script MVP-Protector#25 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_2-5.gat",102,102;
+ close;
+
+}
+
+// --- Epsilon-MVP #2
+pvp_n_2-5.gat,100,100,4 script MVP-Protector#26 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_3-5.gat",102,102;
+ close;
+
+}
+// --- Epsilon-MVP #3
+pvp_n_3-5.gat,100,100,4 script MVP-Protector#27 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_4-5.gat",102,102;
+ close;
+
+}
+// --- Epsilon-MVP #4
+pvp_n_4-5.gat,100,100,4 script MVP-Protector#28 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_5-5.gat",102,102;
+ close;
+
+}
+// --- Epsilon-MVP #5
+pvp_n_5-5.gat,100,100,4 script MVP-Protector#29 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_6-5.gat",102,102;
+ close;
+
+}
+// --- Epsilon-MVP #6
+pvp_n_6-5.gat,100,100,4 script MVP-Protector#30 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_7-5.gat",102,102;
+ close;
+
+}
+// --- Epsilon-MVP #7
+pvp_n_7-5.gat,100,100,4 script MVP-Protector#31 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M";
+
+ L_Next:
+ warp "pvp_n_8-5.gat",102,102;
+ close;
+}
+// --- Epsilon-MVP #8
+pvp_n_8-5.gat,100,100,4 script MVP-Protector#32 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ callfunc "Ramvp_M2";
+}
+
+// ---- Monsters for the MVP-Arena
+// --- Alpha-MVP Maps
+// --- First Alpha-MVP area
+pvp_n_1-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_1-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
+// --- Second Alpha-MVP area
+pvp_n_2-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_2-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
+// --- Third Alpha-MVP area
+pvp_n_3-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
+pvp_n_3-2.gat,0,0,0,0 monster Moonlight 1150,2,60000,66000
+pvp_n_3-2.gat,0,0,0,0 monster Maya 1147,1,60000,66000
+// --- Fourth Alpha-MVP area
+pvp_n_4-2.gat,0,0,0,0 monster Eddga 1115,1,60000,66000
+pvp_n_4-2.gat,0,0,0,0 monster Mistress 1059,1,60000,66000
+pvp_n_4-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_4-2.gat,0,0,0,0 monster Maya 1147,1,60000,66000
+// --- Fifth Alpha-MVP area
+pvp_n_5-2.gat,0,0,0,0 monster Eddga 1115,1,60000,66000
+pvp_n_5-2.gat,0,0,0,0 monster Mistress 1059,2,60000,66000
+pvp_n_5-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_5-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
+// --- Sixth Alpha-MVP area
+pvp_n_6-2.gat,0,0,0,0 monster Eddga 1115,2,60000,66000
+pvp_n_6-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_6-2.gat,0,0,0,0 monster Moonlight 1150,1,60000,66000
+pvp_n_6-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
+// --- Seventh Alpha-MVP area
+pvp_n_7-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_7-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_7-2.gat,0,0,0,0 monster Moonlight 1150,2,60000,66000
+pvp_n_7-2.gat,0,0,0,0 monster Maya 1147,2,60000,66000
+// --- Eighth Alpha-MVP area
+pvp_n_8-2.gat,0,0,0,0 monster Eddga 1115,3,60000,66000
+pvp_n_8-2.gat,0,0,0,0 monster Mistress 1059,3,60000,66000
+pvp_n_8-2.gat,0,0,0,0 monster Moonlight 1150,3,60000,66000
+pvp_n_8-2.gat,0,0,0,0 monster Maya 1147,3,60000,66000
+
+// --- Beta-MVP Maps
+// --- First Beta-MVP area
+pvp_n_1-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_1-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+// --- Second Beta-MVP area
+pvp_n_2-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_3-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_2-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+// --- Third Beta-MVP area
+pvp_n_3-3.gat,0,0,0,0 monster Phreeoni 1159,1,60000,66000
+pvp_n_3-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_3-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+pvp_n_3-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+// --- Fourth Beta-MVP area
+pvp_n_4-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_4-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_4-3.gat,0,0,0,0 monster Orc Hero 1087,1,60000,66000
+pvp_n_4-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+// --- Fifth Beta-MVP area
+pvp_n_5-3.gat,0,0,0,0 monster Phreeoni 1159,1,60000,66000
+pvp_n_5-3.gat,0,0,0,0 monster Turtle General 1312,2,60000,66000
+pvp_n_5-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_5-3.gat,0,0,0,0 monster Orc Lord 1190,1,60000,66000
+// --- Sixth Beta-MVP area
+pvp_n_6-3.gat,0,0,0,0 monster Phreeoni 1159,2,60000,66000
+pvp_n_6-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_6-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_6-3.gat,0,0,0,0 monster Orc Lord 1190,2,60000,66000
+// --- Seventh Beta-MVP area
+pvp_n_7-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_7-3.gat,0,0,0,0 monster Turtle General 1312,1,60000,66000
+pvp_n_7-3.gat,0,0,0,0 monster Orc Hero 1087,2,60000,66000
+pvp_n_7-3.gat,0,0,0,0 monster Orc Lord 1190,3,60000,66000
+// --- Eighth Beta-MVP area
+pvp_n_8-3.gat,0,0,0,0 monster Phreeoni 1159,3,60000,66000
+pvp_n_8-3.gat,0,0,0,0 monster Turtle General 1312,3,60000,66000
+pvp_n_8-3.gat,0,0,0,0 monster Orc Hero 1087,3,60000,66000
+pvp_n_8-3.gat,0,0,0,0 monster Orc Lord 1190,3,60000,66000
+
+// --- Theta-MVP Maps
+// --- First Theta-MVP area
+pvp_n_1-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_1-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
+// --- Second Theta-MVP area
+pvp_n_2-4.gat,0,0,0,0 monster Drake 1112,2,60000,66000
+pvp_n_2-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_2-4.gat,0,0,0,0 monster Doppelganger 1046,1,60000,66000
+// --- Third Theta-MVP area
+pvp_n_3-4.gat,0,0,0,0 monster Drake 1112,1,60000,66000
+pvp_n_3-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_3-4.gat,0,0,0,0 monster Doppelganger 1046,1,60000,66000
+pvp_n_3-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+// --- Fourth Theta-MVP area
+pvp_n_4-4.gat,0,0,0,0 monster Drake 1112,2,60000,66000
+pvp_n_4-4.gat,0,0,0,0 monster Osiris 1038,1,60000,66000
+pvp_n_4-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_4-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+// --- Fifth Theta-MVP area
+pvp_n_5-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_5-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_5-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_5-4.gat,0,0,0,0 monster Lord of Death 1373,1,60000,66000
+// --- Sixth Theta-MVP area
+pvp_n_6-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_6-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_6-4.gat,0,0,0,0 monster Doppelganger 1046,2,60000,66000
+pvp_n_6-4.gat,0,0,0,0 monster Lord of Death 1373,2,60000,66000
+// --- Seventh Theta-MVP area
+pvp_n_7-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_7-4.gat,0,0,0,0 monster Osiris 1038,2,60000,66000
+pvp_n_7-4.gat,0,0,0,0 monster Doppelganger 1046,3,60000,66000
+pvp_n_7-4.gat,0,0,0,0 monster Lord of Death 1373,2,60000,66000
+// --- Eighth Theta-MVP area
+pvp_n_8-4.gat,0,0,0,0 monster Drake 1112,3,60000,66000
+pvp_n_8-4.gat,0,0,0,0 monster Osiris 1038,3,60000,66000
+pvp_n_8-4.gat,0,0,0,0 monster Doppelganger 1046,3,60000,66000
+pvp_n_8-4.gat,0,0,0,0 monster Lord of Death 1373,3,60000,66000
+
+// --- Epsilon-MVP Maps
+// --- First Epsilon-MVP area
+pvp_n_1-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_1-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_2-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_2-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_2-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_3-5.gat,0,0,0,0 monster Incantation Samurai 1492,1,60000,66000
+pvp_n_3-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_3-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+pvp_n_3-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_4-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_4-5.gat,0,0,0,0 monster Pharoh 1157,1,60000,66000
+pvp_n_4-5.gat,0,0,0,0 monster Dark Lord 1272,1,60000,66000
+pvp_n_4-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_5-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_5-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_5-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_5-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_6-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_6-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_6-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_6-5.gat,0,0,0,0 monster Baphomet 1039,1,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_7-5.gat,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000
+pvp_n_7-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_7-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_7-5.gat,0,0,0,0 monster Baphomet 1039,2,60000,66000
+// --- First Epsilon-MVP area
+pvp_n_8-5.gat,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000
+pvp_n_8-5.gat,0,0,0,0 monster Pharoh 1157,2,60000,66000
+pvp_n_8-5.gat,0,0,0,0 monster Dark Lord 1272,2,60000,66000
+pvp_n_8-5.gat,0,0,0,0 monster Baphomet 1039,2,60000,66000
diff --git a/npc/custom/WoE_Setter.txt b/npc/custom/WoE_Setter.txt
index 7a0d92971..8a842dec7 100644
--- a/npc/custom/WoE_Setter.txt
+++ b/npc/custom/WoE_Setter.txt
@@ -1,187 +1,187 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Time Setter
-//===== By: ==================================================
-//= Fredzilla
-//===== Current Version: =====================================
-//= 1.5a
-//===== Compatible With: =====================================
-//= eAthena 1.0 Final TXT
-//===== Description: =========================================
-//= Lets a GM set WoE times from inside the game
-//===== Additional Comments: =================================
-//= Loops used = 4 (I like loops ^_^)
-//= Only GM's of lvl 99 can use it
-//= If anyone else tries to use it they will just get a list of WoE times
-//= It give you the option, as a GM, to Add a new time, Reset all times,
-//= or just view the current set times
-//= If a WoE is in Progress no time reset is possible
-//= A maximum of 200 WoE times can be set, if that is even possible ;)
-//= Added in v1.5
-//= Change day setting to a menu call, more GUI this way
-//= You can choose for the WoE to last between days
-//= IE, Sat 23 till Sun 01, is now possible
-//= Not even the normal WoE script can do this (by dafault)
-//= Removed the need for disabling the normal agit_event
-//= 1.5a Applied Playtester's fix. [Vicious]
-//============================================================
-prontera.gat,162,194,5 script WoE Setter 806,{
- mes "[Woe Setter]";
- if(getgmlevel(99)<1) goto L_NotGM;
- mes "Welcome, I can set WoE times for you";
- mes "Simply follow the intruction given in each section after this, and it should be set and ready to use";
- next;
- mes "[Woe Setter]";
- mes "Now the fun starts";
- mes "Please select what you want to do";
- next;
- menu "Add a WoE time",L_Add,"Reset All WoE times",L_Reset,"View Current WoE times",-;
- mes "[Woe Setter]";
- mes "Ok currently you have WoE times set for:-";
- set @num,0;
-L_LoopList:
- if($sday[@num] == 0 && $eday[@num] == 0 && $woetime[@num] == 0 && $woetime2[@num] == 0) goto L_LoopListEnd;
- if($sday[@num]==0) set $@tempday$,"Sunday";
- if($sday[@num]==1) set $@tempday$,"Monday";
- if($sday[@num]==2) set $@tempday$,"Tuesday";
- if($sday[@num]==3) set $@tempday$,"Wednesday";
- if($sday[@num]==4) set $@tempday$,"Thursday";
- if($sday[@num]==5) set $@tempday$,"Friday";
- if($sday[@num]==6) set $@tempday$,"Saturday";
- if($eday[@num]==0) set $@tempday2$,"Sunday";
- if($eday[@num]==1) set $@tempday2$,"Monday";
- if($eday[@num]==2) set $@tempday2$,"Tuesday";
- if($eday[@num]==3) set $@tempday2$,"Wednesday";
- if($eday[@num]==4) set $@tempday2$,"Thursday";
- if($eday[@num]==5) set $@tempday2$,"Friday";
- if($eday[@num]==6) set $@tempday2$,"Saturday";
- if($eday[@num]==$sday[@num]) mes $@tempday$+" from "+$woetime[@num]+":00 till "+$woetime2[@num]+":00";
- if($eday[@num]!=$sday[@num]) mes "From "+$@tempday$+" "+$woetime[@num]+":00 till "+$@tempday2$+" "+$woetime2[@num]+":00";
- set @num,@num+1;
- goto L_LoopList;
-L_LoopListEnd:
- close;
-L_Add:
- set @num,0;
-L_AddLoop:
- if($sday[@num] == 0 && $eday[@num] == 0 && $woetime[@num] == 0 && $woetime2[@num] == 0) goto L_AddLoopEnd;
- set @num,@num+1;
- goto L_AddLoop;
-L_AddLoopEnd:
- mes "[Woe Setter]";
- mes "What day do you want the WoE to start ^FF0000start^000000 in?";
- next;
- menu "Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;
- if(@menu==1) set $sday[@num],0;
- if(@menu==2) set $sday[@num],1;
- if(@menu==3) set $sday[@num],2;
- if(@menu==4) set $sday[@num],3;
- if(@menu==5) set $sday[@num],4;
- if(@menu==6) set $sday[@num],5;
- if(@menu==7) set $sday[@num],6;
- mes "[Woe Setter]";
- mes "Ok, now please enter the hour you wish the WoE to ^FF0000start^000000 at";
- mes "This is using a 24 hour clock";
- mes "00 = Midnight";
- mes "12 = Mid-day";
- mes "23 = 11pm";
- next;
- input @input;
- if (@input < 0 || @input > 24) goto L_BadNumber;
- set $woetime[@num],@input;
- mes "[Woe Setter]";
- mes "What day do you want the WoE to start ^FF0000finish^000000 in?";
- next;
- menu "Same as start",-,"Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;
- if(@menu==1) set $eday[@num],$sday[@num];
- if(@menu==2) set $eday[@num],0;
- if(@menu==3) set $eday[@num],1;
- if(@menu==4) set $eday[@num],2;
- if(@menu==5) set $eday[@num],3;
- if(@menu==6) set $eday[@num],4;
- if(@menu==7) set $eday[@num],5;
- if(@menu==8) set $eday[@num],6;
- mes "[Woe Setter]";
- mes "Ok, now please enter the hour you wish the WoE to ^FF0000finish^000000 at";
- mes "This also uses the 24 hour clock";
- mes "00 = Midnight";
- mes "12 = Mid-day";
- mes "23 = 11pm";
- next;
- input @input;
- if (@input < 0 || @input > 24) goto L_BadNumber;
- set $woetime2[@num],@input;
- mes "[Woe Setter]";
- mes "You WoE time has now been set";
- mes "To confirm this, ask me to show you the ^FF0000'View Current WoE times'^000000";
- close;
-L_Reset:
- mes "[Woe Setter]";
- mes "You are about to reset all the set WoE times you have created";
- mes "Are you sure?";
- next;
- menu "No, what was I thinking",L_No,"Yes I really want to do it",-;
- if(agitcheck(0)==1) goto L_WoEOn;
- deletearray $sday[0],200;
- deletearray $eday[0],200;
- deletearray $woetime[0],200;
- deletearray $woetime2[0],200;
- mes "[Woe Setter]";
- mes "They are all gone now, please remember to set new ones";
- close;
-L_WoEOn:
- mes "[Woe Setter]";
- mes "Sorry since there is a WoE in progress you cannot reset the WoE times";
- close;
-L_No:
- mes "[Woe Setter]";
- mes "Oh, good, come back whenever";
- close;
-L_NotGM:
- mes "The current WoE times are :-";
- set @num,0;
- goto L_LoopList;
- end;
-L_BadNumber:
- mes "[Woe Setter]";
- mes "Sorry that was an invalid number, please try again";
- close;
-}
-- script Agit_Event2 -1,{
- end;
-OnInit:
-disablenpc "Agit_Event";
-OnMinute00:
-OnAgitInit:
-
-// starting time check
- set $@num,0;
-L_StartLoop:
- if($sday[$@num] == 0 && $eday[$@num] == 0 && $woetime[$@num] == 0 && $woetime2[$@num] == 0) goto L_StartLoopEnd;
- if(gettime(4)==$sday[$@num] && gettime(3)>=$woetime[$@num] && (gettime(3)<$woetime2[$@num] || $sday[$@num]!=$eday[$@num])) goto L_Start;
- set $@num,$@num+1;
- goto L_StartLoop;
-
-// end time checks
- L_StartLoopEnd:
- set $@num,0;
- L_EndLoop:
- if($eday[$@num] == 0 && $woetime[$@num] == 0 && $woetime2[$@num] == 0) end;
- if((gettime(4)==$eday[$@num]) && (gettime(3)==$woetime2[$@num])) goto L_End;
- set $@num,$@num+1;
- goto L_EndLoop;
- end;
-
-// Stop WoE
-L_End:
- if(agitcheck(0)==0) end;
- Announce "The War Of Emperium is over!",8;
- AgitEnd;
- end;
-
-// Start WoE
-L_Start:
- if(agitcheck(0)==1) end;
- Announce "The War Of Emperium has begun!",8;
- AgitStart;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - Time Setter
+//===== By: ==================================================
+//= Fredzilla
+//===== Current Version: =====================================
+//= 1.5a
+//===== Compatible With: =====================================
+//= eAthena 1.0 Final TXT
+//===== Description: =========================================
+//= Lets a GM set WoE times from inside the game
+//===== Additional Comments: =================================
+//= Loops used = 4 (I like loops ^_^)
+//= Only GM's of lvl 99 can use it
+//= If anyone else tries to use it they will just get a list of WoE times
+//= It give you the option, as a GM, to Add a new time, Reset all times,
+//= or just view the current set times
+//= If a WoE is in Progress no time reset is possible
+//= A maximum of 200 WoE times can be set, if that is even possible ;)
+//= Added in v1.5
+//= Change day setting to a menu call, more GUI this way
+//= You can choose for the WoE to last between days
+//= IE, Sat 23 till Sun 01, is now possible
+//= Not even the normal WoE script can do this (by dafault)
+//= Removed the need for disabling the normal agit_event
+//= 1.5a Applied Playtester's fix. [Vicious]
+//============================================================
+prontera.gat,162,194,5 script WoE Setter 806,{
+ mes "[Woe Setter]";
+ if(getgmlevel(99)<1) goto L_NotGM;
+ mes "Welcome, I can set WoE times for you";
+ mes "Simply follow the intruction given in each section after this, and it should be set and ready to use";
+ next;
+ mes "[Woe Setter]";
+ mes "Now the fun starts";
+ mes "Please select what you want to do";
+ next;
+ menu "Add a WoE time",L_Add,"Reset All WoE times",L_Reset,"View Current WoE times",-;
+ mes "[Woe Setter]";
+ mes "Ok currently you have WoE times set for:-";
+ set @num,0;
+L_LoopList:
+ if($sday[@num] == 0 && $eday[@num] == 0 && $woetime[@num] == 0 && $woetime2[@num] == 0) goto L_LoopListEnd;
+ if($sday[@num]==0) set $@tempday$,"Sunday";
+ if($sday[@num]==1) set $@tempday$,"Monday";
+ if($sday[@num]==2) set $@tempday$,"Tuesday";
+ if($sday[@num]==3) set $@tempday$,"Wednesday";
+ if($sday[@num]==4) set $@tempday$,"Thursday";
+ if($sday[@num]==5) set $@tempday$,"Friday";
+ if($sday[@num]==6) set $@tempday$,"Saturday";
+ if($eday[@num]==0) set $@tempday2$,"Sunday";
+ if($eday[@num]==1) set $@tempday2$,"Monday";
+ if($eday[@num]==2) set $@tempday2$,"Tuesday";
+ if($eday[@num]==3) set $@tempday2$,"Wednesday";
+ if($eday[@num]==4) set $@tempday2$,"Thursday";
+ if($eday[@num]==5) set $@tempday2$,"Friday";
+ if($eday[@num]==6) set $@tempday2$,"Saturday";
+ if($eday[@num]==$sday[@num]) mes $@tempday$+" from "+$woetime[@num]+":00 till "+$woetime2[@num]+":00";
+ if($eday[@num]!=$sday[@num]) mes "From "+$@tempday$+" "+$woetime[@num]+":00 till "+$@tempday2$+" "+$woetime2[@num]+":00";
+ set @num,@num+1;
+ goto L_LoopList;
+L_LoopListEnd:
+ close;
+L_Add:
+ set @num,0;
+L_AddLoop:
+ if($sday[@num] == 0 && $eday[@num] == 0 && $woetime[@num] == 0 && $woetime2[@num] == 0) goto L_AddLoopEnd;
+ set @num,@num+1;
+ goto L_AddLoop;
+L_AddLoopEnd:
+ mes "[Woe Setter]";
+ mes "What day do you want the WoE to start ^FF0000start^000000 in?";
+ next;
+ menu "Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;
+ if(@menu==1) set $sday[@num],0;
+ if(@menu==2) set $sday[@num],1;
+ if(@menu==3) set $sday[@num],2;
+ if(@menu==4) set $sday[@num],3;
+ if(@menu==5) set $sday[@num],4;
+ if(@menu==6) set $sday[@num],5;
+ if(@menu==7) set $sday[@num],6;
+ mes "[Woe Setter]";
+ mes "Ok, now please enter the hour you wish the WoE to ^FF0000start^000000 at";
+ mes "This is using a 24 hour clock";
+ mes "00 = Midnight";
+ mes "12 = Mid-day";
+ mes "23 = 11pm";
+ next;
+ input @input;
+ if (@input < 0 || @input > 24) goto L_BadNumber;
+ set $woetime[@num],@input;
+ mes "[Woe Setter]";
+ mes "What day do you want the WoE to start ^FF0000finish^000000 in?";
+ next;
+ menu "Same as start",-,"Sunday",-,"Monday",-,"Tuesday",-,"Wednesday",-,"Thursday",-,"Friday",-,"Saturday",-;
+ if(@menu==1) set $eday[@num],$sday[@num];
+ if(@menu==2) set $eday[@num],0;
+ if(@menu==3) set $eday[@num],1;
+ if(@menu==4) set $eday[@num],2;
+ if(@menu==5) set $eday[@num],3;
+ if(@menu==6) set $eday[@num],4;
+ if(@menu==7) set $eday[@num],5;
+ if(@menu==8) set $eday[@num],6;
+ mes "[Woe Setter]";
+ mes "Ok, now please enter the hour you wish the WoE to ^FF0000finish^000000 at";
+ mes "This also uses the 24 hour clock";
+ mes "00 = Midnight";
+ mes "12 = Mid-day";
+ mes "23 = 11pm";
+ next;
+ input @input;
+ if (@input < 0 || @input > 24) goto L_BadNumber;
+ set $woetime2[@num],@input;
+ mes "[Woe Setter]";
+ mes "You WoE time has now been set";
+ mes "To confirm this, ask me to show you the ^FF0000'View Current WoE times'^000000";
+ close;
+L_Reset:
+ mes "[Woe Setter]";
+ mes "You are about to reset all the set WoE times you have created";
+ mes "Are you sure?";
+ next;
+ menu "No, what was I thinking",L_No,"Yes I really want to do it",-;
+ if(agitcheck(0)==1) goto L_WoEOn;
+ deletearray $sday[0],200;
+ deletearray $eday[0],200;
+ deletearray $woetime[0],200;
+ deletearray $woetime2[0],200;
+ mes "[Woe Setter]";
+ mes "They are all gone now, please remember to set new ones";
+ close;
+L_WoEOn:
+ mes "[Woe Setter]";
+ mes "Sorry since there is a WoE in progress you cannot reset the WoE times";
+ close;
+L_No:
+ mes "[Woe Setter]";
+ mes "Oh, good, come back whenever";
+ close;
+L_NotGM:
+ mes "The current WoE times are :-";
+ set @num,0;
+ goto L_LoopList;
+ end;
+L_BadNumber:
+ mes "[Woe Setter]";
+ mes "Sorry that was an invalid number, please try again";
+ close;
+}
+- script Agit_Event2 -1,{
+ end;
+OnInit:
+disablenpc "Agit_Event";
+OnMinute00:
+OnAgitInit:
+
+// starting time check
+ set $@num,0;
+L_StartLoop:
+ if($sday[$@num] == 0 && $eday[$@num] == 0 && $woetime[$@num] == 0 && $woetime2[$@num] == 0) goto L_StartLoopEnd;
+ if(gettime(4)==$sday[$@num] && gettime(3)>=$woetime[$@num] && (gettime(3)<$woetime2[$@num] || $sday[$@num]!=$eday[$@num])) goto L_Start;
+ set $@num,$@num+1;
+ goto L_StartLoop;
+
+// end time checks
+ L_StartLoopEnd:
+ set $@num,0;
+ L_EndLoop:
+ if($eday[$@num] == 0 && $woetime[$@num] == 0 && $woetime2[$@num] == 0) end;
+ if((gettime(4)==$eday[$@num]) && (gettime(3)==$woetime2[$@num])) goto L_End;
+ set $@num,$@num+1;
+ goto L_EndLoop;
+ end;
+
+// Stop WoE
+L_End:
+ if(agitcheck(0)==0) end;
+ Announce "The War Of Emperium is over!",8;
+ AgitEnd;
+ end;
+
+// Start WoE
+L_Start:
+ if(agitcheck(0)==1) end;
+ Announce "The War Of Emperium has begun!",8;
+ AgitStart;
+ end;
+}
diff --git a/npc/custom/adoption.txt b/npc/custom/adoption.txt
index a027a437a..af0c8d3b2 100644
--- a/npc/custom/adoption.txt
+++ b/npc/custom/adoption.txt
@@ -1,503 +1,503 @@
-//===== Athena Script =======================================
-//= Simple Adoption Script
-//===== By ================================================
-//= Fredzilla with help from Kamari,Acky
-//===== Version ===========================================
-//= 1.6a Fixed wrong label name [KarLaeda]
-//= 1.6 Removed call to function Is_Taekwon_Class in favor of baseClass == Job_Taekwon [Silentdragon]
-//= 1.5 Added GM menu to reset current adoption [Lupus]
-//= 1.4 Got rid of useless "event_adoptXXX" variables [Lupus]
-//= 1.3c - Slightly rewrote the anti-taekwon protection to
-//= detect problems more easily [DracoRPG]
-//= 1.3a - Added anti Taekwon Classes protection (they can't
-//= be adopted) [Lupus]
-//= 1.3 - Now it can teach parents/baby their missing skills.
-//= Your old families should talk to these NPCs to get
-//= their family skills [Lupus]
-//= 1.2b - More fixes + Added Acky's teacher to the end
-//= (stoped it from saying a particular word I thought
-//= was inapropriate for a kids game)
-//= 1.1 - Minor correction, replaced missing close; and mes :D
-//= 1.0 - First Release, most likely going to have some bugs
-//= Is using @adopt instead of proper NPC script command
-//===== Compatible With ===================================
-//= eAthena Final (SVN), any version that contained the GM command @adopt
-//= This is any version released after 03/29/05, dont know the number
-//===== Description =======================================
-//= A simple adoption script that lets couples adopt a
-//= lvl 1/1 novice without the help of a GM there
-//===== Comments ==========================================
-//= List or Variables used
-//= $@AdoptionActive = Stops other people trying to use
-//= the adoption NPC's intill the currant one is over.
-//= @AdoptionReady = Marks person that talks to first NPC,
-//= this person will end up being ParentOne.
-//= $@ParentOne$ = Explains itself.
-//= $@ParentTwo$ = "" ""
-//= $@Baby$ = "" ""
-//= $@GenderBaby$ = Set so it can state boy or girl.
-//= $@FinalQuestion = Lets the parents take one last chance
-//= to cancel the adoption before it is perminant.
-//= $@CheckAll = Follow on from the last one, when this = 3,
-//= the adoption will take place and will be perminant.
-//= @regged = Stops the same person being counted twice
-//= before the adoption is completed.
-//= Lupus removed:
-//= *event_adopt = Put on the parents so they cannot adopt again.
-//= *event_adopted = Put on baby so it cant be adopted again.
-//= Use "getchildid()>0" insread of event_adopt
-//= Use "Upper==2" insread of event_adopted
-//=========================================================
-
-prt_church.gat,115,122,0 warp prtch03 1,2,prt_church.gat,164,171
-prt_church.gat,162,171,0 warp prtch01-3 1,2,prt_church.gat,113,122
-
-prt_church.gat,166,176,3 script Adoption Man 61,{
-
- //If u're a GM you can always reset current Adoption process
- if(getgmlevel(99)>=90) {
- mes "[GM Menu]";
- mes "Would you like to reset curent adoption?";
- next;
- menu "Yes",-,"No",L_SKIP;
- callfunc "AdoptReset","GM reset";
- close;
- }
-L_SKIP:
-
- if($@AdoptionActive == 1) goto A_Cannot;
- mes "[Oliver]";
- if (Upper==2) goto A_YouBaby;
- if (getchildid()>0 && getskilllv(410)<=0) goto A_GetSkill;
- if (getchildid()>0) goto A_Already;
- mes "Would you like to adopt someone?";
- next;
- menu "Yes",A_Yes,"No",-;
-A_No:
- mes "[Oliver]";
- mes "I am sorry to hear that, please come back when you believe you are ready.";
- close;
-A_Cannot:
- mes "[Oliver]";
- mes "There is currentlly an adoption in progress, come back when it is finished.";
- close;
-A_Yes:
- mes "[Oliver]";
- mes "Good to hear it!";
- mes "But do you meet the requirments for adoption?";
- next;
- mes "[Oliver]";
- mes "We cant just give out babies at the drop of a hat.";
- mes "Before we can let you leave with a baby we have to know you are strong enough to take care of it.";
- next;
- mes "[Oliver]";
- mes "We also need to know you have a partner you are married to.";
- mes "We wont give a baby to an un-married couple.";
- next;
- mes "[Oliver]";
- mes "Do you think you meet these criteria?";
- next;
- menu "Yes, I would love to adopt?",-,"No, I dont think I can",A_No;
- mes "[Oliver]";
- mes "Well you seem set on this.";
- next;
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- if ($@AdoptionActive == 1) goto A_Cannot;
- set $@AdoptionActive,1;
- set @AdoptionReady,1;
- mes "[Oliver]";
- mes "I will refer you to my coleage over there.";
- close;
-
-A_GetSkill:
- mes "You have just adopted a baby. I'll teach you a useful skill CALL BABY !";
- next;
- emotion 46;
- skill 410,1,0;
- mes "[Oliver]";
- mes "Done! Tell your partner to call me, too.";
- mes "Our children are our future!";
- close;
-A_Already:
- emotion 1;
- mes "How is your baby today?";
- close;
-A_YouBaby:
- emotion 2;
- mes "Say HI to your parents! Be cool!";
- if (getskilllv(408)<=0 || getskilllv(409)<=0) mes "By the way, our Teacher's wanting to see you.";
- close;
-}
-
-prt_church.gat,172,177,3 script Adoption Lady 103,{
- if (Upper==2) goto A_YouBaby;
- if (getchildid()>0 && getskilllv(410)<=0) goto A_GetSkill;
- if (getchildid()>0) goto A_Already;
- if ($@FinalQuestion==1 && $@ParentOne$==strcharinfo(0)) goto A_ParentOneEnd;
- if ($@FinalQuestion==1 && $@ParentTwo$==strcharinfo(0)) goto A_ParentTwoEnd;
- if ($@FinalQuestion==1 && $@Baby$==strcharinfo(0)) goto A_BabyEnd;
- if (strcharinfo(0)==$@Baby$) goto A_FinalTest;
- if (strcharinfo(0)==$@ParentTwo$) goto A_SecondReg;
- if (@AdoptionReady==0 || $@AdoptionActive==0) goto A_SeeFriend;
- mes "[Inanna]";
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- mes "So you think you meet our strict requirments?";
- mes "Let's see here, are you over level 70?";
- next;
- menu "Yes, I am over level 70",A_lvl,"No, sorry to bother you",-;
- mes "[Inanna]";
- mes "Oh, I am sorry to hear that, please return when you meet this requirment.";
- callfunc "AdoptReset","the parent didnt meet level requirments";
- close;
-A_SeeFriend:
- mes "[Inanna]";
- mes "Seems you havent talked to my friend here.";
- mes "He will refer you to me, when he thinks you are ready.";
- close;
-A_lvl:
- if(BaseLevel >= 70) goto A_lvlpassed;
- mes "[Inanna]";
- mes "Not only should I fail you on being a low level, but you also lied to me.";
- next;
- mes "[Inanna]";
- mes "I cant give a baby to you";
- callfunc "AdoptReset","the parent didnt meet level requirments";
- close;
-A_lvlpassed:
- mes "[Inanna]";
- mes "WOW, you have passed the test of strength.";
- next;
- mes "[Inanna]";
- mes "But lets see if you are happily married.";
- mes "For this I will need to see your wedding ring.";
- next;
- mes "[Inanna]";
- mes "Do you have you wedding ring on you now?";
- next;
- menu "Yes, here you go",A_Wedring,"No, Sorry I dont",A_Noring,"I am not married",-;
- mes "[Inanna]";
- mes "Well, as my fried said here, we will not give a baby to a family that is not married";
- callfunc "AdoptReset","the parent isnt married";
- close;
-A_Noring:
- mes "[Inanna]";
- mes "I cant believe you are in a loving marrige when you dont have your ring on you at all times!!!";
- next;
- mes "[Inanna]";
- mes "I dont believe you deserve a baby.";
- callfunc "AdoptReset","the parent hasnt got a wedding ring as proof of marriage.";
- close;
-A_Wedring:
- if ( countitem(2634)>0 || countitem(2635)>0 ) goto A_Wedringpassed;
- goto A_Noring;
-A_Wedringpassed:
- mes "[Inanna]";
- mes "Awwwww, such a lovely ring, you must love your partner.";
- next;
- if (getchildid()>0) goto A_AlreadyHaveBaby;
- mes "[Inanna]";
- mes "I need to see them, please tell me their name.";
- next;
- input $@ParentTwo$;
- set $@ParentOne$, strcharinfo(0);
- mes "[Inanna]";
- mes "Your partner now has 5 min to talk to me before the adoption is canceled.";
- next;
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- areaannounce "prt_church.gat",0,0,350,350,"Can I please see "+$@ParentTwo$+" please",0;
- mes "[Inanna]";
- mes "Can you now please wait for me to call you again, thank you.";
- close;
-A_AlreadyHaveBaby:
- mes "Now lets look at the inscription on your ring, oh it seems you already have a baby.";
- next;
- mes "[Inanna]";
- mes "I am sorry, you can only ever adopt once.";
- mes "Please take care of you baby.";
- callfunc "AdoptReset","the parent has already adopted once before";
- close;
-A_SecondReg:
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- mes "[Inanna]";
- mes "You must be "+$@ParentTwo$+", I just talked to your partner "+$@ParentOne$+", they mentioned you want to adopt baby.";
- next;
- mes "[Inanna]";
- mes "Do you agree with "+$@ParentOne$+", do you want to adopt?";
- next;
- menu "Yes, I agree with them",A_agree,"No, I dont want to adopt",-;
- mes "[Inanna]";
- mes "This is bad news, I am very sorry to hear this.";
- callfunc "AdoptReset","the 2nd parent does not want to adopt";
- close;
-A_agree:
- mes "[Inanna]";
- mes "Now I will put you through the same test as your partner.";
- next;
- if(BaseLevel >= 70) goto A_lvltwo;
- mes "[Inanna]";
- mes "Sorry you are not over level 70.";
- callfunc "AdoptReset","the 2nd parent didnt meet the level requirments";
- close;
-A_lvltwo:
- if ( countitem(2634)>0 || countitem(2635)>0 ) goto A_Wedringtwo;
- mes "[Inanna]";
- mes "Sorry you dont have a wedding ring on you as proof of marriage.";
- callfunc "AdoptReset","the 2nd parent hasnt got a wedding ring as proof of marriage";
- close;
-A_Wedringtwo:
- if (getchildid()>0) goto A_AlreadyHaveBaby;
- mes "[Inanna]";
- mes "You have checked out, and have passed all the requirments.";
- mes "All you need is a novice to adopt.";
- next;
- mes "[Inanna]";
- mes "Do you have a novice to adopt?";
- next;
- menu "Yes, right here",A_YesBaby,"No, I'm sorry",-;
- mes "[Inanna]";
- mes "I suggest you find one, remember to get your parent to talk to my friend first when you return.";
- callfunc "AdoptReset","there is no novice present to be adopted";
- close;
-A_YesBaby:
- mes "[Inanna]";
- mes "Can I please know thier name?";
- next;
- input $@Baby$;
- mes "[Inanna]";
- mes "The novice now has 5min to come and talk to me, or the adopt will be canceled.";
- next;
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- mes "[Inanna]";
- mes "Thank you, can you please wait with your partner, and wait to be called back.";
- areaannounce "prt_church.gat",0,0,350,350,"Can I please see "+$@Baby$+", please",0;
- close;
-A_FinalTest:
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- if(Upper==2) goto A_AlreadyAdopted;
- if(baseClass == Job_Taekwon) goto A_CantBeAdopted;
- mes "[Inanna]";
- mes "You must be "+$@Baby$+", its very nice to meet you.";
- mes "Some very nice people, "+$@ParentOne$+" and "+$@ParentTwo$+", have asked to adopt you.";
- next;
- if(sex!=0) set $@GenderBaby$,"boy";
- if(sex==0) set $@GenderBaby$,"girl";
-
- mes "[Inanna]";
- mes "Now can you be a good "+$@GenderBaby$+" and go with these nice people?";
- next;
- menu "Yes, me would luv too",A_BabyYes,"NOOOOO!!!",-;
- mes "[Inanna]";
- mes "Please calm down.";
- mes "I will try and find better parents for you next time.";
- callfunc "AdoptReset","the novice didnt want to be adopted";
- close;
-A_BabyYes:
- mes "[Inanna]";
- mes "Awwww, so cute, good to hear it.";
- mes "Now lets see here.";
- next;
- mes "[Inanna]";
- mes "I need to do a check on your level to prove you are a novice, stand still.";
- next;
- if (BaseLevel == 1 && JobLevel == 1) goto A_Ready;
- mes "[Inanna]";
- mes "Sorry but you are higher than level one, and cause of this you are a true novice.";
- callfunc "AdoptReset","the person that would be adopted, is over level 1";
- close;
-A_Ready:
- mes "[Inanna]";
- mes "You are just as sweet an inocent as the day our lord made you.";
- next;
- mes "[Inanna]";
- mes "I have no objections to you being adopted.";
- mes "Before you can be adopted I will need to see your parents, and you, one last time.";
- set $@FinalQuestion,1;
- areaannounce "prt_church.gat",0,0,350,350,"Can I please see all people involved with this adoption please",0;
- deltimer "timeadopt::OnAdopt";
- addtimer 300000,"timeadopt::OnAdopt";
- close;
-A_AlreadyAdopted:
- mes "[Inanna]";
- mes "Oh you are already adopted, so you cant be adopted again.";
- callfunc "AdoptReset","the person that would be adopted has already been adopted before";
- close;
-A_CantBeAdopted:
- mes "[Inanna]";
- mes "Sorry, but your job does not allow adoption.";
- callfunc "AdoptReset","the person that would be adopted has a job that can't be adopted";
- close;
-A_ParentOneEnd:
- if (@regged>1) goto A_AlreadyReged;
- if ($@ParentOne$==$@ParentTwo$) goto A_SameFail;
- mes "[Inanna]";
- mes "Nice to talk to you again "+$@ParentOne$;
- mes "This is you last chance to back out";
- next;
- mes "[Inanna]";
- mes "You can only ever adopt once, so if you adopt "+$@Baby$+", you can never adopt any one else ever";
- next;
- mes "[Inanna]";
- mes "Are you sure you want to proceed";
- next;
- menu "Yes",A_FinalYesP,"No",-;
- mes "[Inanna]";
- mes "I cannot believe you would come this far to say no!";
- mes "Are you sure you want to stop now?";
- next;
- menu "Yes, I dont want to adopt",-,"No, I made a mistake",A_ParentOneEnd;
-A_Failend:
- mes "[Inanna]";
- mes "Well if you are sure";
- callfunc "AdoptReset","a parent or the novice pulled out";
- close;
-A_FinalYesP:
- mes "[Inanna]";
- mes "OK everything is ready to start this adoption";
- mes "I will announce to everyone when it is complete";
- set @regged,1;
- set $@checkall,$@checkall+1;
- if ($@checkall==3) goto THEEND;
- close;
-A_ParentTwoEnd:
- if (@regged>1) goto A_AlreadyReged;
- mes "[Inanna]";
- mes "Nice to talk to you again "+$@ParentTwo$;
- mes "This is you last chance to back out";
- next;
- mes "[Inanna]";
- mes "You can only ever adopt once, so if you adopt "+$@Baby$+", you can never adopt any one else ever";
- next;
- mes "[Inanna]";
- mes "Are you sure you want to proceed";
- next;
- menu "Yes",A_FinalYesP,"No",-;
- mes "[Inanna]";
- mes "I cannot believe you would come this far to say no!";
- mes "Are you sure you want to stop now?";
- next;
- menu "Yes, I dont want to adopt",A_Failend,"No, I made a mistake",A_ParentTwoEnd;
-A_AlreadyReged:
- mes "[Inanna]";
- mes "Please wait for the others to talk to me";
- close;
-A_BabyEnd:
- if (@regged>1) goto A_AlreadyReged;
- mes "[Inanna]";
- mes "Nice to talk to you again "+$@Baby$;
- mes "This is you last chance to back out";
- next;
- mes "[Inanna]";
- mes "You can only ever be adopted once, so if you are adopted by "+$@ParentOne$+" and "+$@ParentTwo$+", you can never be adopted again";
- next;
- mes "[Inanna]";
- mes "Are you sure you want to proceed";
- next;
- menu "Yes",A_FinalYesB,"No",-;
- mes "[Inanna]";
- mes "I cannot believe you would come this far to say no!";
- mes "Are you sure you want to stop now?";
- next;
- menu "Yes, I dont want to adopt",A_Failend,"No, I made a mistake",A_BabyEnd;
-A_FinalYesB:
- mes "[Inanna]";
- mes "OK everything is ready to start this adoption";
- mes "I will announce to everyone when it is complete";
- set @regged,1;
- set $@checkall,$@checkall+1;
- if ($@checkall==3) goto THEEND;
- close;
-A_SameFail:
- mes "[Inanna]";
- mes "Sorry, it seems you have registerd as both parents, this isnt allowed";
- callfunc "AdoptReset","both parents are the same person";
- close;
-
-A_GetSkill:
- emotion 20;
- mes "[Inanna]";
- mes "You can't see your baby often?.. I'll try to teach you one skil... Where's my skills manual?";
- next;
- mes "[Oliver]";
- mes "Hey, Inanna! This is my job. Pass them to me!";
- close;
-A_Already:
- mes "[Inanna]";
- emotion 21;
- mes "How is your baby now?";
- close;
-A_YouBaby:
- mes "[Inanna]";
- emotion 30;
- mes "Tell your father he's a good father!";
- if (getskilllv(408)<=0 || getskilllv(409)<=0) mes "You should talk to our Teacher.";
- close;
-
-THEEND:
- logmes "Adoption: "+$@Baby$+" adopted by "+$@ParentOne$+" and "+$@ParentTwo$+".";
- adopt $@ParentOne$,$@ParentTwo$,$@Baby$;
- announce $@ParentOne$+" and "+$@ParentTwo$+" has just adopted a new baby "+$@GenderBaby$+", called "+$@Baby$,5;
- deltimer "timeadopt::OnAdopt";
- set $@AdoptionActive, 0;
- set $@ParentOne$, null;
- set $@ParentTwo$, null;
- set $@Baby$, null;
- set $@GenderBaby$, null;
- set $@FinalQuestion, 0;
- set $@CheckAll, 0;
- close;
- end;
-}
-
-prt_church.gat,165,175,0 script timeadopt -1,{
-OnAdopt:
- callfunc "AdoptReset","too much time has passed between steps";
- end;
-}
-function script AdoptReset {
- deltimer "timeadopt::OnAdopt";
- set $@AdoptionActive, 0;
- set $@ParentOne$, null;
- set $@ParentTwo$, null;
- set $@Baby$, null;
- set $@GenderBaby$, null;
- set $@FinalQuestion, 0;
- set $@CheckAll, 0;
- areaannounce "prt_church.gat",0,0,350,350,"The adoption has been canceled because "+getarg(0),0;
- return;
-}
-
-prt_church.gat,165,166,6 script Teacher 97,{
- mes "[Mario]";
- if (Upper==2 && (getskilllv(408)<=0 || getskilllv(409)<=0)) goto L_Teach;
- if (Upper==2) mes "Hello, baby! How are you?";
- if (Upper!=2) mes "How are you?";
- next;
- menu "Great!",-,"Fine.",-,"So-so...",-,"Shoot me, please.",-;
- mes "[Mario]";
- mes "So nice!";
- emotion rand(19,21);
- close;
-
-L_Teach:
- skill 408,1,0;
- skill 409,1,0;
- mes "Ta-da! Now you know 2 quite useful skills!";
- mes "1. Call your Parents (when you're in a danger).";
- mes "2. Protect your parents' EXP with yor love!";
- emotion 41;
- next;
- mes "[Mario]";
- mes "On seeing a baby tell them to visit me.";
- next;
-
-L_Cancel:
- mes "[Mario]";
- mes "Bye bye!";
- close;
-}
+//===== Athena Script =======================================
+//= Simple Adoption Script
+//===== By ================================================
+//= Fredzilla with help from Kamari,Acky
+//===== Version ===========================================
+//= 1.6a Fixed wrong label name [KarLaeda]
+//= 1.6 Removed call to function Is_Taekwon_Class in favor of baseClass == Job_Taekwon [Silentdragon]
+//= 1.5 Added GM menu to reset current adoption [Lupus]
+//= 1.4 Got rid of useless "event_adoptXXX" variables [Lupus]
+//= 1.3c - Slightly rewrote the anti-taekwon protection to
+//= detect problems more easily [DracoRPG]
+//= 1.3a - Added anti Taekwon Classes protection (they can't
+//= be adopted) [Lupus]
+//= 1.3 - Now it can teach parents/baby their missing skills.
+//= Your old families should talk to these NPCs to get
+//= their family skills [Lupus]
+//= 1.2b - More fixes + Added Acky's teacher to the end
+//= (stoped it from saying a particular word I thought
+//= was inapropriate for a kids game)
+//= 1.1 - Minor correction, replaced missing close; and mes :D
+//= 1.0 - First Release, most likely going to have some bugs
+//= Is using @adopt instead of proper NPC script command
+//===== Compatible With ===================================
+//= eAthena Final (SVN), any version that contained the GM command @adopt
+//= This is any version released after 03/29/05, dont know the number
+//===== Description =======================================
+//= A simple adoption script that lets couples adopt a
+//= lvl 1/1 novice without the help of a GM there
+//===== Comments ==========================================
+//= List or Variables used
+//= $@AdoptionActive = Stops other people trying to use
+//= the adoption NPC's intill the currant one is over.
+//= @AdoptionReady = Marks person that talks to first NPC,
+//= this person will end up being ParentOne.
+//= $@ParentOne$ = Explains itself.
+//= $@ParentTwo$ = "" ""
+//= $@Baby$ = "" ""
+//= $@GenderBaby$ = Set so it can state boy or girl.
+//= $@FinalQuestion = Lets the parents take one last chance
+//= to cancel the adoption before it is perminant.
+//= $@CheckAll = Follow on from the last one, when this = 3,
+//= the adoption will take place and will be perminant.
+//= @regged = Stops the same person being counted twice
+//= before the adoption is completed.
+//= Lupus removed:
+//= *event_adopt = Put on the parents so they cannot adopt again.
+//= *event_adopted = Put on baby so it cant be adopted again.
+//= Use "getchildid()>0" insread of event_adopt
+//= Use "Upper==2" insread of event_adopted
+//=========================================================
+
+prt_church.gat,115,122,0 warp prtch03 1,2,prt_church.gat,164,171
+prt_church.gat,162,171,0 warp prtch01-3 1,2,prt_church.gat,113,122
+
+prt_church.gat,166,176,3 script Adoption Man 61,{
+
+ //If u're a GM you can always reset current Adoption process
+ if(getgmlevel(99)>=90) {
+ mes "[GM Menu]";
+ mes "Would you like to reset curent adoption?";
+ next;
+ menu "Yes",-,"No",L_SKIP;
+ callfunc "AdoptReset","GM reset";
+ close;
+ }
+L_SKIP:
+
+ if($@AdoptionActive == 1) goto A_Cannot;
+ mes "[Oliver]";
+ if (Upper==2) goto A_YouBaby;
+ if (getchildid()>0 && getskilllv(410)<=0) goto A_GetSkill;
+ if (getchildid()>0) goto A_Already;
+ mes "Would you like to adopt someone?";
+ next;
+ menu "Yes",A_Yes,"No",-;
+A_No:
+ mes "[Oliver]";
+ mes "I am sorry to hear that, please come back when you believe you are ready.";
+ close;
+A_Cannot:
+ mes "[Oliver]";
+ mes "There is currentlly an adoption in progress, come back when it is finished.";
+ close;
+A_Yes:
+ mes "[Oliver]";
+ mes "Good to hear it!";
+ mes "But do you meet the requirments for adoption?";
+ next;
+ mes "[Oliver]";
+ mes "We cant just give out babies at the drop of a hat.";
+ mes "Before we can let you leave with a baby we have to know you are strong enough to take care of it.";
+ next;
+ mes "[Oliver]";
+ mes "We also need to know you have a partner you are married to.";
+ mes "We wont give a baby to an un-married couple.";
+ next;
+ mes "[Oliver]";
+ mes "Do you think you meet these criteria?";
+ next;
+ menu "Yes, I would love to adopt?",-,"No, I dont think I can",A_No;
+ mes "[Oliver]";
+ mes "Well you seem set on this.";
+ next;
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ if ($@AdoptionActive == 1) goto A_Cannot;
+ set $@AdoptionActive,1;
+ set @AdoptionReady,1;
+ mes "[Oliver]";
+ mes "I will refer you to my coleage over there.";
+ close;
+
+A_GetSkill:
+ mes "You have just adopted a baby. I'll teach you a useful skill CALL BABY !";
+ next;
+ emotion 46;
+ skill 410,1,0;
+ mes "[Oliver]";
+ mes "Done! Tell your partner to call me, too.";
+ mes "Our children are our future!";
+ close;
+A_Already:
+ emotion 1;
+ mes "How is your baby today?";
+ close;
+A_YouBaby:
+ emotion 2;
+ mes "Say HI to your parents! Be cool!";
+ if (getskilllv(408)<=0 || getskilllv(409)<=0) mes "By the way, our Teacher's wanting to see you.";
+ close;
+}
+
+prt_church.gat,172,177,3 script Adoption Lady 103,{
+ if (Upper==2) goto A_YouBaby;
+ if (getchildid()>0 && getskilllv(410)<=0) goto A_GetSkill;
+ if (getchildid()>0) goto A_Already;
+ if ($@FinalQuestion==1 && $@ParentOne$==strcharinfo(0)) goto A_ParentOneEnd;
+ if ($@FinalQuestion==1 && $@ParentTwo$==strcharinfo(0)) goto A_ParentTwoEnd;
+ if ($@FinalQuestion==1 && $@Baby$==strcharinfo(0)) goto A_BabyEnd;
+ if (strcharinfo(0)==$@Baby$) goto A_FinalTest;
+ if (strcharinfo(0)==$@ParentTwo$) goto A_SecondReg;
+ if (@AdoptionReady==0 || $@AdoptionActive==0) goto A_SeeFriend;
+ mes "[Inanna]";
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ mes "So you think you meet our strict requirments?";
+ mes "Let's see here, are you over level 70?";
+ next;
+ menu "Yes, I am over level 70",A_lvl,"No, sorry to bother you",-;
+ mes "[Inanna]";
+ mes "Oh, I am sorry to hear that, please return when you meet this requirment.";
+ callfunc "AdoptReset","the parent didnt meet level requirments";
+ close;
+A_SeeFriend:
+ mes "[Inanna]";
+ mes "Seems you havent talked to my friend here.";
+ mes "He will refer you to me, when he thinks you are ready.";
+ close;
+A_lvl:
+ if(BaseLevel >= 70) goto A_lvlpassed;
+ mes "[Inanna]";
+ mes "Not only should I fail you on being a low level, but you also lied to me.";
+ next;
+ mes "[Inanna]";
+ mes "I cant give a baby to you";
+ callfunc "AdoptReset","the parent didnt meet level requirments";
+ close;
+A_lvlpassed:
+ mes "[Inanna]";
+ mes "WOW, you have passed the test of strength.";
+ next;
+ mes "[Inanna]";
+ mes "But lets see if you are happily married.";
+ mes "For this I will need to see your wedding ring.";
+ next;
+ mes "[Inanna]";
+ mes "Do you have you wedding ring on you now?";
+ next;
+ menu "Yes, here you go",A_Wedring,"No, Sorry I dont",A_Noring,"I am not married",-;
+ mes "[Inanna]";
+ mes "Well, as my fried said here, we will not give a baby to a family that is not married";
+ callfunc "AdoptReset","the parent isnt married";
+ close;
+A_Noring:
+ mes "[Inanna]";
+ mes "I cant believe you are in a loving marrige when you dont have your ring on you at all times!!!";
+ next;
+ mes "[Inanna]";
+ mes "I dont believe you deserve a baby.";
+ callfunc "AdoptReset","the parent hasnt got a wedding ring as proof of marriage.";
+ close;
+A_Wedring:
+ if ( countitem(2634)>0 || countitem(2635)>0 ) goto A_Wedringpassed;
+ goto A_Noring;
+A_Wedringpassed:
+ mes "[Inanna]";
+ mes "Awwwww, such a lovely ring, you must love your partner.";
+ next;
+ if (getchildid()>0) goto A_AlreadyHaveBaby;
+ mes "[Inanna]";
+ mes "I need to see them, please tell me their name.";
+ next;
+ input $@ParentTwo$;
+ set $@ParentOne$, strcharinfo(0);
+ mes "[Inanna]";
+ mes "Your partner now has 5 min to talk to me before the adoption is canceled.";
+ next;
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ areaannounce "prt_church.gat",0,0,350,350,"Can I please see "+$@ParentTwo$+" please",0;
+ mes "[Inanna]";
+ mes "Can you now please wait for me to call you again, thank you.";
+ close;
+A_AlreadyHaveBaby:
+ mes "Now lets look at the inscription on your ring, oh it seems you already have a baby.";
+ next;
+ mes "[Inanna]";
+ mes "I am sorry, you can only ever adopt once.";
+ mes "Please take care of you baby.";
+ callfunc "AdoptReset","the parent has already adopted once before";
+ close;
+A_SecondReg:
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ mes "[Inanna]";
+ mes "You must be "+$@ParentTwo$+", I just talked to your partner "+$@ParentOne$+", they mentioned you want to adopt baby.";
+ next;
+ mes "[Inanna]";
+ mes "Do you agree with "+$@ParentOne$+", do you want to adopt?";
+ next;
+ menu "Yes, I agree with them",A_agree,"No, I dont want to adopt",-;
+ mes "[Inanna]";
+ mes "This is bad news, I am very sorry to hear this.";
+ callfunc "AdoptReset","the 2nd parent does not want to adopt";
+ close;
+A_agree:
+ mes "[Inanna]";
+ mes "Now I will put you through the same test as your partner.";
+ next;
+ if(BaseLevel >= 70) goto A_lvltwo;
+ mes "[Inanna]";
+ mes "Sorry you are not over level 70.";
+ callfunc "AdoptReset","the 2nd parent didnt meet the level requirments";
+ close;
+A_lvltwo:
+ if ( countitem(2634)>0 || countitem(2635)>0 ) goto A_Wedringtwo;
+ mes "[Inanna]";
+ mes "Sorry you dont have a wedding ring on you as proof of marriage.";
+ callfunc "AdoptReset","the 2nd parent hasnt got a wedding ring as proof of marriage";
+ close;
+A_Wedringtwo:
+ if (getchildid()>0) goto A_AlreadyHaveBaby;
+ mes "[Inanna]";
+ mes "You have checked out, and have passed all the requirments.";
+ mes "All you need is a novice to adopt.";
+ next;
+ mes "[Inanna]";
+ mes "Do you have a novice to adopt?";
+ next;
+ menu "Yes, right here",A_YesBaby,"No, I'm sorry",-;
+ mes "[Inanna]";
+ mes "I suggest you find one, remember to get your parent to talk to my friend first when you return.";
+ callfunc "AdoptReset","there is no novice present to be adopted";
+ close;
+A_YesBaby:
+ mes "[Inanna]";
+ mes "Can I please know thier name?";
+ next;
+ input $@Baby$;
+ mes "[Inanna]";
+ mes "The novice now has 5min to come and talk to me, or the adopt will be canceled.";
+ next;
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ mes "[Inanna]";
+ mes "Thank you, can you please wait with your partner, and wait to be called back.";
+ areaannounce "prt_church.gat",0,0,350,350,"Can I please see "+$@Baby$+", please",0;
+ close;
+A_FinalTest:
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ if(Upper==2) goto A_AlreadyAdopted;
+ if(baseClass == Job_Taekwon) goto A_CantBeAdopted;
+ mes "[Inanna]";
+ mes "You must be "+$@Baby$+", its very nice to meet you.";
+ mes "Some very nice people, "+$@ParentOne$+" and "+$@ParentTwo$+", have asked to adopt you.";
+ next;
+ if(sex!=0) set $@GenderBaby$,"boy";
+ if(sex==0) set $@GenderBaby$,"girl";
+
+ mes "[Inanna]";
+ mes "Now can you be a good "+$@GenderBaby$+" and go with these nice people?";
+ next;
+ menu "Yes, me would luv too",A_BabyYes,"NOOOOO!!!",-;
+ mes "[Inanna]";
+ mes "Please calm down.";
+ mes "I will try and find better parents for you next time.";
+ callfunc "AdoptReset","the novice didnt want to be adopted";
+ close;
+A_BabyYes:
+ mes "[Inanna]";
+ mes "Awwww, so cute, good to hear it.";
+ mes "Now lets see here.";
+ next;
+ mes "[Inanna]";
+ mes "I need to do a check on your level to prove you are a novice, stand still.";
+ next;
+ if (BaseLevel == 1 && JobLevel == 1) goto A_Ready;
+ mes "[Inanna]";
+ mes "Sorry but you are higher than level one, and cause of this you are a true novice.";
+ callfunc "AdoptReset","the person that would be adopted, is over level 1";
+ close;
+A_Ready:
+ mes "[Inanna]";
+ mes "You are just as sweet an inocent as the day our lord made you.";
+ next;
+ mes "[Inanna]";
+ mes "I have no objections to you being adopted.";
+ mes "Before you can be adopted I will need to see your parents, and you, one last time.";
+ set $@FinalQuestion,1;
+ areaannounce "prt_church.gat",0,0,350,350,"Can I please see all people involved with this adoption please",0;
+ deltimer "timeadopt::OnAdopt";
+ addtimer 300000,"timeadopt::OnAdopt";
+ close;
+A_AlreadyAdopted:
+ mes "[Inanna]";
+ mes "Oh you are already adopted, so you cant be adopted again.";
+ callfunc "AdoptReset","the person that would be adopted has already been adopted before";
+ close;
+A_CantBeAdopted:
+ mes "[Inanna]";
+ mes "Sorry, but your job does not allow adoption.";
+ callfunc "AdoptReset","the person that would be adopted has a job that can't be adopted";
+ close;
+A_ParentOneEnd:
+ if (@regged>1) goto A_AlreadyReged;
+ if ($@ParentOne$==$@ParentTwo$) goto A_SameFail;
+ mes "[Inanna]";
+ mes "Nice to talk to you again "+$@ParentOne$;
+ mes "This is you last chance to back out";
+ next;
+ mes "[Inanna]";
+ mes "You can only ever adopt once, so if you adopt "+$@Baby$+", you can never adopt any one else ever";
+ next;
+ mes "[Inanna]";
+ mes "Are you sure you want to proceed";
+ next;
+ menu "Yes",A_FinalYesP,"No",-;
+ mes "[Inanna]";
+ mes "I cannot believe you would come this far to say no!";
+ mes "Are you sure you want to stop now?";
+ next;
+ menu "Yes, I dont want to adopt",-,"No, I made a mistake",A_ParentOneEnd;
+A_Failend:
+ mes "[Inanna]";
+ mes "Well if you are sure";
+ callfunc "AdoptReset","a parent or the novice pulled out";
+ close;
+A_FinalYesP:
+ mes "[Inanna]";
+ mes "OK everything is ready to start this adoption";
+ mes "I will announce to everyone when it is complete";
+ set @regged,1;
+ set $@checkall,$@checkall+1;
+ if ($@checkall==3) goto THEEND;
+ close;
+A_ParentTwoEnd:
+ if (@regged>1) goto A_AlreadyReged;
+ mes "[Inanna]";
+ mes "Nice to talk to you again "+$@ParentTwo$;
+ mes "This is you last chance to back out";
+ next;
+ mes "[Inanna]";
+ mes "You can only ever adopt once, so if you adopt "+$@Baby$+", you can never adopt any one else ever";
+ next;
+ mes "[Inanna]";
+ mes "Are you sure you want to proceed";
+ next;
+ menu "Yes",A_FinalYesP,"No",-;
+ mes "[Inanna]";
+ mes "I cannot believe you would come this far to say no!";
+ mes "Are you sure you want to stop now?";
+ next;
+ menu "Yes, I dont want to adopt",A_Failend,"No, I made a mistake",A_ParentTwoEnd;
+A_AlreadyReged:
+ mes "[Inanna]";
+ mes "Please wait for the others to talk to me";
+ close;
+A_BabyEnd:
+ if (@regged>1) goto A_AlreadyReged;
+ mes "[Inanna]";
+ mes "Nice to talk to you again "+$@Baby$;
+ mes "This is you last chance to back out";
+ next;
+ mes "[Inanna]";
+ mes "You can only ever be adopted once, so if you are adopted by "+$@ParentOne$+" and "+$@ParentTwo$+", you can never be adopted again";
+ next;
+ mes "[Inanna]";
+ mes "Are you sure you want to proceed";
+ next;
+ menu "Yes",A_FinalYesB,"No",-;
+ mes "[Inanna]";
+ mes "I cannot believe you would come this far to say no!";
+ mes "Are you sure you want to stop now?";
+ next;
+ menu "Yes, I dont want to adopt",A_Failend,"No, I made a mistake",A_BabyEnd;
+A_FinalYesB:
+ mes "[Inanna]";
+ mes "OK everything is ready to start this adoption";
+ mes "I will announce to everyone when it is complete";
+ set @regged,1;
+ set $@checkall,$@checkall+1;
+ if ($@checkall==3) goto THEEND;
+ close;
+A_SameFail:
+ mes "[Inanna]";
+ mes "Sorry, it seems you have registerd as both parents, this isnt allowed";
+ callfunc "AdoptReset","both parents are the same person";
+ close;
+
+A_GetSkill:
+ emotion 20;
+ mes "[Inanna]";
+ mes "You can't see your baby often?.. I'll try to teach you one skil... Where's my skills manual?";
+ next;
+ mes "[Oliver]";
+ mes "Hey, Inanna! This is my job. Pass them to me!";
+ close;
+A_Already:
+ mes "[Inanna]";
+ emotion 21;
+ mes "How is your baby now?";
+ close;
+A_YouBaby:
+ mes "[Inanna]";
+ emotion 30;
+ mes "Tell your father he's a good father!";
+ if (getskilllv(408)<=0 || getskilllv(409)<=0) mes "You should talk to our Teacher.";
+ close;
+
+THEEND:
+ logmes "Adoption: "+$@Baby$+" adopted by "+$@ParentOne$+" and "+$@ParentTwo$+".";
+ adopt $@ParentOne$,$@ParentTwo$,$@Baby$;
+ announce $@ParentOne$+" and "+$@ParentTwo$+" has just adopted a new baby "+$@GenderBaby$+", called "+$@Baby$,5;
+ deltimer "timeadopt::OnAdopt";
+ set $@AdoptionActive, 0;
+ set $@ParentOne$, null;
+ set $@ParentTwo$, null;
+ set $@Baby$, null;
+ set $@GenderBaby$, null;
+ set $@FinalQuestion, 0;
+ set $@CheckAll, 0;
+ close;
+ end;
+}
+
+prt_church.gat,165,175,0 script timeadopt -1,{
+OnAdopt:
+ callfunc "AdoptReset","too much time has passed between steps";
+ end;
+}
+function script AdoptReset {
+ deltimer "timeadopt::OnAdopt";
+ set $@AdoptionActive, 0;
+ set $@ParentOne$, null;
+ set $@ParentTwo$, null;
+ set $@Baby$, null;
+ set $@GenderBaby$, null;
+ set $@FinalQuestion, 0;
+ set $@CheckAll, 0;
+ areaannounce "prt_church.gat",0,0,350,350,"The adoption has been canceled because "+getarg(0),0;
+ return;
+}
+
+prt_church.gat,165,166,6 script Teacher 97,{
+ mes "[Mario]";
+ if (Upper==2 && (getskilllv(408)<=0 || getskilllv(409)<=0)) goto L_Teach;
+ if (Upper==2) mes "Hello, baby! How are you?";
+ if (Upper!=2) mes "How are you?";
+ next;
+ menu "Great!",-,"Fine.",-,"So-so...",-,"Shoot me, please.",-;
+ mes "[Mario]";
+ mes "So nice!";
+ emotion rand(19,21);
+ close;
+
+L_Teach:
+ skill 408,1,0;
+ skill 409,1,0;
+ mes "Ta-da! Now you know 2 quite useful skills!";
+ mes "1. Call your Parents (when you're in a danger).";
+ mes "2. Protect your parents' EXP with yor love!";
+ emotion 41;
+ next;
+ mes "[Mario]";
+ mes "On seeing a baby tell them to visit me.";
+ next;
+
+L_Cancel:
+ mes "[Mario]";
+ mes "Bye bye!";
+ close;
+}
diff --git a/npc/custom/airplane.txt b/npc/custom/airplane.txt
index 5f99d7f04..87f6729c8 100644
--- a/npc/custom/airplane.txt
+++ b/npc/custom/airplane.txt
@@ -1,439 +1,439 @@
-//===== eAthena Script =======================================
-//= elRO Airship
-//===== By: ==================================================
-//= Edited And removed irrelevent comments by eAthena Dev Team
-//= Draike\Bluto\Hephaestus
-//===== Current Version: =====================================
-//= 2.2a
-//===== Compatible With: =====================================
-//= eAthena SVN 02/05/2005 +
-//===== Description: =========================================
-//= It's the elRO airship. XD
-//===== Additional Comments: =================================
-//= ALWAYS HAVE AT LEAST TWELVE (12) LOCATIONS AS THE MINIMUM. This is unless you modify to OnMinutes and change the schedule around.
-//= If you have "airplane.gat,103,72,0 warp airs02a 1,1,airplane.gat,102,200" as a warp, remove it. Where it's supposed to go, I have no clue.
-//= 2.1 Removed Duplicates [Silent]
-//= 2.2 Added missing next;'s [Evera]
-//============================================================
-payon.gat,153,43,5 script itinsetter -1,{
-
-//This is just OnInit stuff to set the hourly intinerary.
-OnInit:
-deletearray $locationsname$[0],500;
-deletearray $locationsmap$[0],500;
-deletearray $locationsx[0],500;
-deletearray $locationsy[0],500;
-deletearray $alreadygoneto[0],500;
-setarray $locationsname$[0],"Airport";
-setarray $locationsname$[1],"Prontera";
-setarray $locationsname$[2],"Payon";
-setarray $locationsname$[3],"Aldebaran";
-setarray $locationsname$[4],"Alberta";
-setarray $locationsname$[5],"Geffen";
-setarray $locationsname$[6],"Morocc";
-setarray $locationsname$[7],"Glast Heim";
-setarray $locationsname$[8],"Umbala";
-setarray $locationsname$[9],"Comodo";
-setarray $locationsname$[10],"Amatsu";
-setarray $locationsname$[11],"Niflheim";
-setarray $locationsname$[12],"Lutie";
-setarray $locationsname$[13],"Louyang";
-setarray $locationsname$[14],"Gonryun";
-setarray $locationsname$[15],"Yuno";
-setarray $locationsname$[16],"Ant Hell";
-setarray $locationsname$[17],"Jawaii";
-setarray $locationsname$[18],"Orc Village";
-setarray $locationsname$[19],"Mjolnir Coal Mines";
-setarray $locationsname$[20],"Gefenia Ruins";
-setarray $locationsname$[21],"Ayothaya";
-setarray $locationsname$[22],"Lighthalzen";
-setarray $locationsname$[23],"Juperos";
-setarray $locationsmap$[0],"airport.gat";
-setarray $locationsmap$[1],"prt_fild08.gat";
-setarray $locationsmap$[2],"pay_fild08.gat";
-setarray $locationsmap$[3],"mjolnir_12.gat";
-setarray $locationsmap$[4],"pay_fild03.gat";
-setarray $locationsmap$[5],"gef_fild00.gat";
-setarray $locationsmap$[6],"moc_fild10.gat";
-setarray $locationsmap$[7],"glast_01.gat";
-setarray $locationsmap$[8],"umbala.gat";
-setarray $locationsmap$[9],"comodo.gat";
-setarray $locationsmap$[10],"amatsu.gat";
-setarray $locationsmap$[11],"niflheim.gat";
-setarray $locationsmap$[12],"xmas.gat";
-setarray $locationsmap$[13],"louyang.gat";
-setarray $locationsmap$[14],"gonryun.gat";
-setarray $locationsmap$[15],"yuno.gat";
-setarray $locationsmap$[16],"moc_fild04.gat";
-setarray $locationsmap$[17],"jawaii.gat";
-setarray $locationsmap$[18],"gef_fild10.gat";
-setarray $locationsmap$[19],"mjolnir_02.gat";
-setarray $locationsmap$[20],"gefenia01.gat";
-setarray $locationsmap$[21],"ayothaya.gat";
-setarray $locationsmap$[22],"lighthalzen.gat";
-setarray $locationsmap$[23],"jupe_gate.gat";
-setarray $locationsx[0],148;
-setarray $locationsx[1],206;
-setarray $locationsx[2],159;
-setarray $locationsx[3],62;
-setarray $locationsx[4],194;
-setarray $locationsx[5],50;
-setarray $locationsx[6],163;
-setarray $locationsx[7],196;
-setarray $locationsx[8],187;
-setarray $locationsx[9],203;
-setarray $locationsx[10],115;
-setarray $locationsx[11],132;
-setarray $locationsx[12],232;
-setarray $locationsx[13],36;
-setarray $locationsx[14],82;
-setarray $locationsx[15],58;
-setarray $locationsx[16],209;
-setarray $locationsx[17],248;
-setarray $locationsx[18],158;
-setarray $locationsx[19],76;
-setarray $locationsx[20],98;
-setarray $locationsx[21],183;
-setarray $locationsx[22],99;
-setarray $locationsx[23],46;
-setarray $locationsy[0],45;
-setarray $locationsy[1],280;
-setarray $locationsy[2],92;
-setarray $locationsy[3],381;
-setarray $locationsy[4],182;
-setarray $locationsy[5],365;
-setarray $locationsy[6],172;
-setarray $locationsy[7],327;
-setarray $locationsy[8],98;
-setarray $locationsy[9],76;
-setarray $locationsy[10],79;
-setarray $locationsy[11],241;
-setarray $locationsy[12],308;
-setarray $locationsy[13],279;
-setarray $locationsy[14],96;
-setarray $locationsy[15],194;
-setarray $locationsy[16],326;
-setarray $locationsy[17],175;
-setarray $locationsy[18],95;
-setarray $locationsy[19],363;
-setarray $locationsy[20],21;
-setarray $locationsy[21],104;
-setarray $locationsy[22],240;
-setarray $locationsy[23],19;
-goto resetgoneto;
-end;
-
-setrandomitin:
-set $@settervariable,$@settervariable + 1;
-setarray $locationn[$@settervariable],rand(0,getarraysize($locationsname$) - 1);
-if($alreadygoneto[$locationn[$@settervariable]]==1)set $@settervariable,$@settervariable - 1;
-if($alreadygoneto[$locationn[$@settervariable]]==1)goto setrandomitin;
-setarray $alreadygoneto[$locationn[$@settervariable]], 1;
-if($@settervariable<12)goto setrandomitin;
-end;
-
-resetgoneto:
-deletearray $alreadygoneto[0], 500;
-set $@currenttime, 0;
-goto setrandomitin;
-
-OnMinute00:
-set $@currenttime, 1;
-callfunc "F_Itinreset",12,1,2;
-
-OnMinute03:
-set $destination,250;
-end;
-
-OnMinute05:
-set $@currenttime, 2;
-callfunc "F_Itinreset",1,2,3;
-
-OnMinute08:
-set $destination,250;
-end;
-
-OnMinute10:
-set $@currenttime, 3;
-callfunc "F_Itinreset",2,3,4;
-
-OnMinute13:
-set $destination,250;
-end;
-
-OnMinute15:
-set $@currenttime, 4;
-callfunc "F_Itinreset",3,4,5;
-
-OnMinute18:
-set $destination,250;
-end;
-
-OnMinute20:
-set $@currenttime, 5;
-callfunc "F_Itinreset",4,5,6;
-
-OnMinute23:
-set $destination,250;
-end;
-
-OnMinute25:
-set $@currenttime, 6;
-callfunc "F_Itinreset",5,6,7;
-
-OnMinute28:
-set $destination,250;
-end;
-
-OnMinute30:
-set $@currenttime, 7;
-callfunc "F_Itinreset",6,7,8;
-
-OnMinute33:
-set $destination,250;
-end;
-
-OnMinute35:
-set $@currenttime, 8;
-callfunc "F_Itinreset",7,8,9;
-
-OnMinute38:
-set $destination,250;
-end;
-
-OnMinute40:
-set $@currenttime, 9;
-callfunc "F_Itinreset",8,9,10;
-
-OnMinute43:
-set $destination,250;
-end;
-
-OnMinute45:
-set $@currenttime, 10;
-callfunc "F_Itinreset",9,10,11;
-
-OnMinute48:
-set $destination,250;
-end;
-
-OnMinute50:
-set $@currenttime, 11;
-callfunc "F_Itinreset",10,11,12;
-
-OnMinute53:
-set $destination,250;
-end;
-
-OnMinute55:
-set $@currenttime, 12;
-callfunc "F_Itinreset",11,12,1;
-
-OnMinute58:
-set $destination,250;
-end;
-}
-function script F_Porter {
- if($destination==getarg(0))goto Board;
- if($destination!=getarg(0))goto Notime;
-
-Board:
- mes "^FF0000[Porter]^000000";
- mes "The plane is currently ported. Would you like to board?";
- next;
- menu "Yes.",L_Yes,"No.",L_Nope,"View Hourly Itinerary.",Itin;
-
-L_Yes:
- if($destination!=getarg(0))goto Notime;
- warp "airplane.gat", 105, 72;
- specialeffect2 501;
-L_Nope:
- mes "^FF0000[Porter]^000000";
- mes "Have a good day. Thank you for traveling with Airship.";
- close;
-
-Notime:
- mes "^FF0000[Porter]^000000";
- if(sex==0) mes "Sorry, ma'am, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
- if(sex==1) mes "Sorry, sir, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
- next;
- menu "Yes, please.",Itin,"No thanks.",L_Nope;
- close;
- end;
-
-Itin:
-mes "^FF0000[Porter]^000000";
-callfunc "F_Itin";
-}
-airport.gat,153,43,5 script Airport Porter 774,{
-callfunc "F_Porter",0;
-}
-prt_fild08.gat,206,279,5 script Porter#01 774,{
-callfunc "F_Porter",1;
-}
-gef_fild00.gat,50,364,5 script Porter#02 774,{
-callfunc "F_Porter",5;
-}
-moc_fild10.gat,163,173,5 script Porter#03 774,{
-callfunc "F_Porter",6;
-}
-mjolnir_12.gat,61,380,5 script Porter#04 774,{
-callfunc "F_Porter",3;
-}
-pay_fild08.gat,159,91,5 script Porter#05 774,{
-callfunc "F_Porter",2;
-}
-pay_fild03.gat,194,181,5 script Porter#06 774,{
-callfunc "F_Porter",4;
-}
-glast_01.gat,196,326,1 script Porter#07 774,{
-callfunc "F_Porter",7;
-}
-umbala.gat,188,98,3 script Porter#08 774,{
-callfunc "F_Porter",8;
-}
-comodo.gat,203,75,8 script Porter#09 774,{
-callfunc "F_Porter",9;
-}
-amatsu.gat,115,78,8 script Porter#10 774,{
-callfunc "F_Porter",10;
-}
-niflheim.gat,132,242,5 script Porter#11 774,{
-callfunc "F_Porter",11;
-}
-xmas.gat,232,309,5 script Porter#12 774,{
-callfunc "F_Porter",12;
-}
-louyang.gat,35,279,8 script Porter#13 774,{
-callfunc "F_Porter",13;
-}
-gonryun.gat,82,95,7 script Porter#14 774,{
-callfunc "F_Porter",14;
-}
-yuno.gat,58,195,4 script Porter#15 774,{
-callfunc "F_Porter",15;
-}
-moc_fild04.gat,210,326,2 script Porter#16 774,{
-callfunc "F_Porter",16;
-}
-jawaii.gat,247,174,7 script Porter#17 774,{
-callfunc "F_Porter",17;
-}
-gef_fild10.gat,159,95,2 script Porter#18 774,{
-callfunc "F_Porter",18;
-}
-mjolnir_02.gat,76,364,5 script Porter#19 774,{
-callfunc "F_Porter",19;
-}
-gefenia01.gat,97,22,6 script Porter#20 774,{
-callfunc "F_Porter",20;
-}
-ayothaya.gat,182,105,5 script Porter#21 774,{
-callfunc "F_Porter",21;
-}
-lighthalzen.gat,99,241,4 script Porter#22 774,{
-callfunc "F_Porter",22;
-}
-jupe_gate.gat,46,18,7 script Porter#23 774,{
-callfunc "F_Porter",23;
-}
-airport.gat,141,43,5 script Itinerary Schedule 837,{
-mes "^FF0000[Itinerary]^000000";
-callfunc "F_Itin";
-}
-airplane.gat,102,68,5 script Docker 852,{
- if($destination == 250) goto Nowhere;
- mes "^FF0000[Airplane Attendant]^000000";
- if($destination == 250)goto Notime;
- set @dockky, $destination;
- if($destination != 250)mes "We are currently docked at "+$locationsname$[$destination]+". Would you like to exit?";
- next;
- menu "Yes.",Lyes,"No.",Lnope;
-
-Lyes:
- if($destination == 250)goto Notime;
- if($destination != @dockky)goto Notime;
- warp $locationsmap$[$destination], $locationsx[$destination], $locationsy[$destination];
- specialeffect2 501;
-
-Lnope:
- mes "^FF0000[Airplane Attendant]^000000";
- mes "Have a good day. Thank you for traveling with us.";
- close;
-
-Notime:
- mes "^FF0000[Airplane Attendant]^000000";
- if(sex==0) mes "Sorry, ma'am, but the plane currently isn't docked. Please wait.";
- if(sex==1) mes "Sorry, sir, but the plane currently isn't docked. Please wait.";
- close;
-
-Nowhere:
- mes "^FF0000[Airplane Attendant]^000000";
- mes "We're currently in air. Please wait until the pilot has announced that we have safely landed.";
- close;
-}
-function script F_Itin {
-//This is the itinerary's function. It should work well enough.
-if($@currenttime==0)mes "Try again later. A recent server reboot or rehash has messed the itinerary up for a bit.";
-if($@currenttime==0)close;
-if($@currenttime==0)end;
-set @tempo, 0;
-set @tempo, $@currenttime - 1;
-goto seta;
-close;
-
-seta:
-set @tempo, @tempo + 1;
-set @time, gettime(3);
-set @minutes, 5 * @tempo - 5;
-set @minutess, 5 * @tempo - 2;
-if(@minutes<10)set @minutes$, "0" + @minutes;
-if(@minutes>9)set @minutes$, @minutes;
-if(@minutess<10)set @minutess$, "0" + @minutess;
-if(@minutess>9)set @minutess$, @minutess;
-if(@time<12)set @time$,@time;
-if(@time==12)set @time$,12;
-if(@time>12)set @time$,@time - 12;
-if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$ + ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@tempo<12)goto seta;
-set @tempo, 0;
-goto setb;
-
-setb:
-if($@currenttime - 1==@tempo)goto setc;
-set @tempo, @tempo + 1;
-set @time, gettime(3) + 1;
-set @minutes, 5 * @tempo - 5;
-set @minutess, 5 * @tempo - 2;
-if(@minutes<10)set @minutes$, "0" + @minutes;
-if(@minutes>9)set @minutes$, @minutes;
-if(@minutess<10)set @minutess$, "0" + @minutess;
-if(@minutess>9)set @minutess$, @minutess;
-if(@time<12)set @time$,@time;
-if(@time==12)set @time$,12;
-if(@time>12)set @time$,@time - 12;
-if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
-goto setb;
-
-setc:
-close;
-end;
-}
-function script F_Itinreset {
-setarray $alreadygoneto[$locationn[getarg(0)]], 0;
-goto sest;
-
-sest:
-setarray $locationn[getarg(0)],rand(0,getarraysize($locationsname$) - 1);
-if($alreadygoneto[$locationn[getarg(0)]]==1)goto sest;
-setarray $alreadygoneto[$locationn[getarg(0)]], 1;
-set $destination,$locationn[$@currenttime];
-announce "Pilot: The plane has arrived at "+$locationsname$[$locationn[getarg(1)]]+". Departure to "+ $locationsname$[$locationn[getarg(2)]] + " is in 3 minutes.",16;
-end;
+//===== eAthena Script =======================================
+//= elRO Airship
+//===== By: ==================================================
+//= Edited And removed irrelevent comments by eAthena Dev Team
+//= Draike\Bluto\Hephaestus
+//===== Current Version: =====================================
+//= 2.2a
+//===== Compatible With: =====================================
+//= eAthena SVN 02/05/2005 +
+//===== Description: =========================================
+//= It's the elRO airship. XD
+//===== Additional Comments: =================================
+//= ALWAYS HAVE AT LEAST TWELVE (12) LOCATIONS AS THE MINIMUM. This is unless you modify to OnMinutes and change the schedule around.
+//= If you have "airplane.gat,103,72,0 warp airs02a 1,1,airplane.gat,102,200" as a warp, remove it. Where it's supposed to go, I have no clue.
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Added missing next;'s [Evera]
+//============================================================
+payon.gat,153,43,5 script itinsetter -1,{
+
+//This is just OnInit stuff to set the hourly intinerary.
+OnInit:
+deletearray $locationsname$[0],500;
+deletearray $locationsmap$[0],500;
+deletearray $locationsx[0],500;
+deletearray $locationsy[0],500;
+deletearray $alreadygoneto[0],500;
+setarray $locationsname$[0],"Airport";
+setarray $locationsname$[1],"Prontera";
+setarray $locationsname$[2],"Payon";
+setarray $locationsname$[3],"Aldebaran";
+setarray $locationsname$[4],"Alberta";
+setarray $locationsname$[5],"Geffen";
+setarray $locationsname$[6],"Morocc";
+setarray $locationsname$[7],"Glast Heim";
+setarray $locationsname$[8],"Umbala";
+setarray $locationsname$[9],"Comodo";
+setarray $locationsname$[10],"Amatsu";
+setarray $locationsname$[11],"Niflheim";
+setarray $locationsname$[12],"Lutie";
+setarray $locationsname$[13],"Louyang";
+setarray $locationsname$[14],"Gonryun";
+setarray $locationsname$[15],"Yuno";
+setarray $locationsname$[16],"Ant Hell";
+setarray $locationsname$[17],"Jawaii";
+setarray $locationsname$[18],"Orc Village";
+setarray $locationsname$[19],"Mjolnir Coal Mines";
+setarray $locationsname$[20],"Gefenia Ruins";
+setarray $locationsname$[21],"Ayothaya";
+setarray $locationsname$[22],"Lighthalzen";
+setarray $locationsname$[23],"Juperos";
+setarray $locationsmap$[0],"airport.gat";
+setarray $locationsmap$[1],"prt_fild08.gat";
+setarray $locationsmap$[2],"pay_fild08.gat";
+setarray $locationsmap$[3],"mjolnir_12.gat";
+setarray $locationsmap$[4],"pay_fild03.gat";
+setarray $locationsmap$[5],"gef_fild00.gat";
+setarray $locationsmap$[6],"moc_fild10.gat";
+setarray $locationsmap$[7],"glast_01.gat";
+setarray $locationsmap$[8],"umbala.gat";
+setarray $locationsmap$[9],"comodo.gat";
+setarray $locationsmap$[10],"amatsu.gat";
+setarray $locationsmap$[11],"niflheim.gat";
+setarray $locationsmap$[12],"xmas.gat";
+setarray $locationsmap$[13],"louyang.gat";
+setarray $locationsmap$[14],"gonryun.gat";
+setarray $locationsmap$[15],"yuno.gat";
+setarray $locationsmap$[16],"moc_fild04.gat";
+setarray $locationsmap$[17],"jawaii.gat";
+setarray $locationsmap$[18],"gef_fild10.gat";
+setarray $locationsmap$[19],"mjolnir_02.gat";
+setarray $locationsmap$[20],"gefenia01.gat";
+setarray $locationsmap$[21],"ayothaya.gat";
+setarray $locationsmap$[22],"lighthalzen.gat";
+setarray $locationsmap$[23],"jupe_gate.gat";
+setarray $locationsx[0],148;
+setarray $locationsx[1],206;
+setarray $locationsx[2],159;
+setarray $locationsx[3],62;
+setarray $locationsx[4],194;
+setarray $locationsx[5],50;
+setarray $locationsx[6],163;
+setarray $locationsx[7],196;
+setarray $locationsx[8],187;
+setarray $locationsx[9],203;
+setarray $locationsx[10],115;
+setarray $locationsx[11],132;
+setarray $locationsx[12],232;
+setarray $locationsx[13],36;
+setarray $locationsx[14],82;
+setarray $locationsx[15],58;
+setarray $locationsx[16],209;
+setarray $locationsx[17],248;
+setarray $locationsx[18],158;
+setarray $locationsx[19],76;
+setarray $locationsx[20],98;
+setarray $locationsx[21],183;
+setarray $locationsx[22],99;
+setarray $locationsx[23],46;
+setarray $locationsy[0],45;
+setarray $locationsy[1],280;
+setarray $locationsy[2],92;
+setarray $locationsy[3],381;
+setarray $locationsy[4],182;
+setarray $locationsy[5],365;
+setarray $locationsy[6],172;
+setarray $locationsy[7],327;
+setarray $locationsy[8],98;
+setarray $locationsy[9],76;
+setarray $locationsy[10],79;
+setarray $locationsy[11],241;
+setarray $locationsy[12],308;
+setarray $locationsy[13],279;
+setarray $locationsy[14],96;
+setarray $locationsy[15],194;
+setarray $locationsy[16],326;
+setarray $locationsy[17],175;
+setarray $locationsy[18],95;
+setarray $locationsy[19],363;
+setarray $locationsy[20],21;
+setarray $locationsy[21],104;
+setarray $locationsy[22],240;
+setarray $locationsy[23],19;
+goto resetgoneto;
+end;
+
+setrandomitin:
+set $@settervariable,$@settervariable + 1;
+setarray $locationn[$@settervariable],rand(0,getarraysize($locationsname$) - 1);
+if($alreadygoneto[$locationn[$@settervariable]]==1)set $@settervariable,$@settervariable - 1;
+if($alreadygoneto[$locationn[$@settervariable]]==1)goto setrandomitin;
+setarray $alreadygoneto[$locationn[$@settervariable]], 1;
+if($@settervariable<12)goto setrandomitin;
+end;
+
+resetgoneto:
+deletearray $alreadygoneto[0], 500;
+set $@currenttime, 0;
+goto setrandomitin;
+
+OnMinute00:
+set $@currenttime, 1;
+callfunc "F_Itinreset",12,1,2;
+
+OnMinute03:
+set $destination,250;
+end;
+
+OnMinute05:
+set $@currenttime, 2;
+callfunc "F_Itinreset",1,2,3;
+
+OnMinute08:
+set $destination,250;
+end;
+
+OnMinute10:
+set $@currenttime, 3;
+callfunc "F_Itinreset",2,3,4;
+
+OnMinute13:
+set $destination,250;
+end;
+
+OnMinute15:
+set $@currenttime, 4;
+callfunc "F_Itinreset",3,4,5;
+
+OnMinute18:
+set $destination,250;
+end;
+
+OnMinute20:
+set $@currenttime, 5;
+callfunc "F_Itinreset",4,5,6;
+
+OnMinute23:
+set $destination,250;
+end;
+
+OnMinute25:
+set $@currenttime, 6;
+callfunc "F_Itinreset",5,6,7;
+
+OnMinute28:
+set $destination,250;
+end;
+
+OnMinute30:
+set $@currenttime, 7;
+callfunc "F_Itinreset",6,7,8;
+
+OnMinute33:
+set $destination,250;
+end;
+
+OnMinute35:
+set $@currenttime, 8;
+callfunc "F_Itinreset",7,8,9;
+
+OnMinute38:
+set $destination,250;
+end;
+
+OnMinute40:
+set $@currenttime, 9;
+callfunc "F_Itinreset",8,9,10;
+
+OnMinute43:
+set $destination,250;
+end;
+
+OnMinute45:
+set $@currenttime, 10;
+callfunc "F_Itinreset",9,10,11;
+
+OnMinute48:
+set $destination,250;
+end;
+
+OnMinute50:
+set $@currenttime, 11;
+callfunc "F_Itinreset",10,11,12;
+
+OnMinute53:
+set $destination,250;
+end;
+
+OnMinute55:
+set $@currenttime, 12;
+callfunc "F_Itinreset",11,12,1;
+
+OnMinute58:
+set $destination,250;
+end;
+}
+function script F_Porter {
+ if($destination==getarg(0))goto Board;
+ if($destination!=getarg(0))goto Notime;
+
+Board:
+ mes "^FF0000[Porter]^000000";
+ mes "The plane is currently ported. Would you like to board?";
+ next;
+ menu "Yes.",L_Yes,"No.",L_Nope,"View Hourly Itinerary.",Itin;
+
+L_Yes:
+ if($destination!=getarg(0))goto Notime;
+ warp "airplane.gat", 105, 72;
+ specialeffect2 501;
+L_Nope:
+ mes "^FF0000[Porter]^000000";
+ mes "Have a good day. Thank you for traveling with Airship.";
+ close;
+
+Notime:
+ mes "^FF0000[Porter]^000000";
+ if(sex==0) mes "Sorry, ma'am, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
+ if(sex==1) mes "Sorry, sir, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary.";
+ next;
+ menu "Yes, please.",Itin,"No thanks.",L_Nope;
+ close;
+ end;
+
+Itin:
+mes "^FF0000[Porter]^000000";
+callfunc "F_Itin";
+}
+airport.gat,153,43,5 script Airport Porter 774,{
+callfunc "F_Porter",0;
+}
+prt_fild08.gat,206,279,5 script Porter#01 774,{
+callfunc "F_Porter",1;
+}
+gef_fild00.gat,50,364,5 script Porter#02 774,{
+callfunc "F_Porter",5;
+}
+moc_fild10.gat,163,173,5 script Porter#03 774,{
+callfunc "F_Porter",6;
+}
+mjolnir_12.gat,61,380,5 script Porter#04 774,{
+callfunc "F_Porter",3;
+}
+pay_fild08.gat,159,91,5 script Porter#05 774,{
+callfunc "F_Porter",2;
+}
+pay_fild03.gat,194,181,5 script Porter#06 774,{
+callfunc "F_Porter",4;
+}
+glast_01.gat,196,326,1 script Porter#07 774,{
+callfunc "F_Porter",7;
+}
+umbala.gat,188,98,3 script Porter#08 774,{
+callfunc "F_Porter",8;
+}
+comodo.gat,203,75,8 script Porter#09 774,{
+callfunc "F_Porter",9;
+}
+amatsu.gat,115,78,8 script Porter#10 774,{
+callfunc "F_Porter",10;
+}
+niflheim.gat,132,242,5 script Porter#11 774,{
+callfunc "F_Porter",11;
+}
+xmas.gat,232,309,5 script Porter#12 774,{
+callfunc "F_Porter",12;
+}
+louyang.gat,35,279,8 script Porter#13 774,{
+callfunc "F_Porter",13;
+}
+gonryun.gat,82,95,7 script Porter#14 774,{
+callfunc "F_Porter",14;
+}
+yuno.gat,58,195,4 script Porter#15 774,{
+callfunc "F_Porter",15;
+}
+moc_fild04.gat,210,326,2 script Porter#16 774,{
+callfunc "F_Porter",16;
+}
+jawaii.gat,247,174,7 script Porter#17 774,{
+callfunc "F_Porter",17;
+}
+gef_fild10.gat,159,95,2 script Porter#18 774,{
+callfunc "F_Porter",18;
+}
+mjolnir_02.gat,76,364,5 script Porter#19 774,{
+callfunc "F_Porter",19;
+}
+gefenia01.gat,97,22,6 script Porter#20 774,{
+callfunc "F_Porter",20;
+}
+ayothaya.gat,182,105,5 script Porter#21 774,{
+callfunc "F_Porter",21;
+}
+lighthalzen.gat,99,241,4 script Porter#22 774,{
+callfunc "F_Porter",22;
+}
+jupe_gate.gat,46,18,7 script Porter#23 774,{
+callfunc "F_Porter",23;
+}
+airport.gat,141,43,5 script Itinerary Schedule 837,{
+mes "^FF0000[Itinerary]^000000";
+callfunc "F_Itin";
+}
+airplane.gat,102,68,5 script Docker 852,{
+ if($destination == 250) goto Nowhere;
+ mes "^FF0000[Airplane Attendant]^000000";
+ if($destination == 250)goto Notime;
+ set @dockky, $destination;
+ if($destination != 250)mes "We are currently docked at "+$locationsname$[$destination]+". Would you like to exit?";
+ next;
+ menu "Yes.",Lyes,"No.",Lnope;
+
+Lyes:
+ if($destination == 250)goto Notime;
+ if($destination != @dockky)goto Notime;
+ warp $locationsmap$[$destination], $locationsx[$destination], $locationsy[$destination];
+ specialeffect2 501;
+
+Lnope:
+ mes "^FF0000[Airplane Attendant]^000000";
+ mes "Have a good day. Thank you for traveling with us.";
+ close;
+
+Notime:
+ mes "^FF0000[Airplane Attendant]^000000";
+ if(sex==0) mes "Sorry, ma'am, but the plane currently isn't docked. Please wait.";
+ if(sex==1) mes "Sorry, sir, but the plane currently isn't docked. Please wait.";
+ close;
+
+Nowhere:
+ mes "^FF0000[Airplane Attendant]^000000";
+ mes "We're currently in air. Please wait until the pilot has announced that we have safely landed.";
+ close;
+}
+function script F_Itin {
+//This is the itinerary's function. It should work well enough.
+if($@currenttime==0)mes "Try again later. A recent server reboot or rehash has messed the itinerary up for a bit.";
+if($@currenttime==0)close;
+if($@currenttime==0)end;
+set @tempo, 0;
+set @tempo, $@currenttime - 1;
+goto seta;
+close;
+
+seta:
+set @tempo, @tempo + 1;
+set @time, gettime(3);
+set @minutes, 5 * @tempo - 5;
+set @minutess, 5 * @tempo - 2;
+if(@minutes<10)set @minutes$, "0" + @minutes;
+if(@minutes>9)set @minutes$, @minutes;
+if(@minutess<10)set @minutess$, "0" + @minutess;
+if(@minutess>9)set @minutess$, @minutess;
+if(@time<12)set @time$,@time;
+if(@time==12)set @time$,12;
+if(@time>12)set @time$,@time - 12;
+if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$ + ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@tempo<12)goto seta;
+set @tempo, 0;
+goto setb;
+
+setb:
+if($@currenttime - 1==@tempo)goto setc;
+set @tempo, @tempo + 1;
+set @time, gettime(3) + 1;
+set @minutes, 5 * @tempo - 5;
+set @minutess, 5 * @tempo - 2;
+if(@minutes<10)set @minutes$, "0" + @minutes;
+if(@minutes>9)set @minutes$, @minutes;
+if(@minutess<10)set @minutess$, "0" + @minutess;
+if(@minutess>9)set @minutess$, @minutess;
+if(@time<12)set @time$,@time;
+if(@time==12)set @time$,12;
+if(@time>12)set @time$,@time - 12;
+if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000";
+goto setb;
+
+setc:
+close;
+end;
+}
+function script F_Itinreset {
+setarray $alreadygoneto[$locationn[getarg(0)]], 0;
+goto sest;
+
+sest:
+setarray $locationn[getarg(0)],rand(0,getarraysize($locationsname$) - 1);
+if($alreadygoneto[$locationn[getarg(0)]]==1)goto sest;
+setarray $alreadygoneto[$locationn[getarg(0)]], 1;
+set $destination,$locationn[$@currenttime];
+announce "Pilot: The plane has arrived at "+$locationsname$[$locationn[getarg(1)]]+". Departure to "+ $locationsname$[$locationn[getarg(2)]] + " is in 3 minutes.",16;
+end;
} \ No newline at end of file
diff --git a/npc/custom/banks/bank.txt b/npc/custom/banks/bank.txt
index 67889a139..379ddc735 100644
--- a/npc/custom/banks/bank.txt
+++ b/npc/custom/banks/bank.txt
@@ -1,126 +1,126 @@
-//===== eAthena Script =======================================
-//= Banker Script
-//===== By: ==================================================
-//= Syrus22 (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any eAthena version with Account variables.
-//===== Description: =========================================
-//= An account wide Banker to store Zeny
-//===== Additional Comments: =================================
-//= Syrus22 - There's an optional transaction fee at the top of
-//= the script. To use it simply change the first set command
-//= to set the cost variable to whatever you want the fee to be.
-//============================================================
-prontera.gat,132,217,5 script Banker 109,{
-set @cost,500;
-mes "[Banker]";
-mes "Welcome to the First Bank of Prontera. How can I help you today?";
-next;
-menu "I'd like to make a deposit.",Ldeposit,"I'd like to make a withdrawl.",Lwithdrawl,"What's my current balance?",Lbalance,"Cancel",Lcancel;
-
-Ldeposit:
- mes "[Banker]";
- mes "Very well... How much would you like to deposit? The maximum you can deposit at once is 999,999 Zeny.";
- next;
- if (@cost > 0) goto Ldepocost;
- goto Ldepocont;
-
- Ldepocost:
- mes "[Banker]";
- mes "Oh and don't forget there is a " + @cost + " Zeny charge on all transactions.";
- next;
- goto Ldepocont;
-
-Ldepocont:
- input @deposit;
- if (@deposit < 1) goto Lrealamount;
- if (@deposit > Zeny) goto Lneedzeny;
- if (@deposit > (Zeny - @cost)) goto Lneedzeny2;
- set Zeny,Zeny - @deposit;
- set Zeny,Zeny - @cost;
- set #bankstorage,#bankstorage + @deposit;
- mes "[Banker]";
- mes "Thank you very much... Your zeny is in good hands.";
- close;
-
-Lwithdrawl:
- mes "[Banker]";
- mes "Very well... How much would you like to withdraw? The maximum you can withdraw at one time is 999,999 Zeny";
- next;
- if (@cost > 0) goto Lwithcost;
- goto Lwithcont;
-
- Lwithcost:
- mes "[Banker]";
- mes "Oh and don't forget there is a " + @cost + " Zeny charge on all transactions.";
- next;
- goto Lwithcont;
-
-Lwithcont:
- input @withdrawl;
- if (@withdrawl < 1) goto Lrealamount;
- if (@withdrawl > #bankstorage) goto Lneedzeny3;
- if ((@cost > Zeny) && ((Zeny + @withdrawl) > @cost)) goto Lcostask;
- if (@cost > Zeny) goto Lneedzeny2;
- goto Lwithcont2;
-
- Lcostask:
- mes "[Banker]";
- mes "You don't have the Zeny for the transaction fee right now. Would you like me to take the fee directly from your withdrawl?";
- next;
- menu "Yes please.",Lwithtake,"No thank you.",Lcancel;
-
- Lwithtake:
- mes "[Banker]";
- mes "Ok then.";
- set @withdrawl,@withdrawl - @cost;
- set #bankstorage,#bankstorage - @cost;
- set @cost,0;
- next;
- goto Lwithcont2;
-
-Lwithcont2:
- set Zeny,Zeny - @cost;
- set Zeny,Zeny + @withdrawl;
- set #bankstorage,#bankstorage - @withdrawl;
- mes "[Banker]";
- mes "There's your Zeny. Have a good day.";
- close;
-
-Lbalance:
- mes "[Banker]";
- mes "Hmmmm lemme check the paper work.";
- next;
- mes "*Rustle, Rustle*";
- next;
- mes "[Banker]";
- mes "You currently have " + #bankstorage + " Zeny in your account.";
- close;
-
-Lrealamount:
- mes "[Banker]";
- mes "Don't play jokes with me please. Next time ask for a real amount.";
- close;
-
-Lneedzeny:
- mes "[Banker]";
- mes "You don't have enough Zeny to make that deposit.";
- close;
-
-Lneedzeny2:
- mes "[Banker]";
- mes "You don't have enough Zeny to cover the transaction fee.";
- close;
-
-Lneedzeny3:
- mes "[Banker]";
- mes "You don't have enough Zeny in your account.";
- close;
-
-Lcancel:
- mes "[Banker]";
- mes "Very well... come again soon.";
- close;
+//===== eAthena Script =======================================
+//= Banker Script
+//===== By: ==================================================
+//= Syrus22 (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any eAthena version with Account variables.
+//===== Description: =========================================
+//= An account wide Banker to store Zeny
+//===== Additional Comments: =================================
+//= Syrus22 - There's an optional transaction fee at the top of
+//= the script. To use it simply change the first set command
+//= to set the cost variable to whatever you want the fee to be.
+//============================================================
+prontera.gat,132,217,5 script Banker 109,{
+set @cost,500;
+mes "[Banker]";
+mes "Welcome to the First Bank of Prontera. How can I help you today?";
+next;
+menu "I'd like to make a deposit.",Ldeposit,"I'd like to make a withdrawl.",Lwithdrawl,"What's my current balance?",Lbalance,"Cancel",Lcancel;
+
+Ldeposit:
+ mes "[Banker]";
+ mes "Very well... How much would you like to deposit? The maximum you can deposit at once is 999,999 Zeny.";
+ next;
+ if (@cost > 0) goto Ldepocost;
+ goto Ldepocont;
+
+ Ldepocost:
+ mes "[Banker]";
+ mes "Oh and don't forget there is a " + @cost + " Zeny charge on all transactions.";
+ next;
+ goto Ldepocont;
+
+Ldepocont:
+ input @deposit;
+ if (@deposit < 1) goto Lrealamount;
+ if (@deposit > Zeny) goto Lneedzeny;
+ if (@deposit > (Zeny - @cost)) goto Lneedzeny2;
+ set Zeny,Zeny - @deposit;
+ set Zeny,Zeny - @cost;
+ set #bankstorage,#bankstorage + @deposit;
+ mes "[Banker]";
+ mes "Thank you very much... Your zeny is in good hands.";
+ close;
+
+Lwithdrawl:
+ mes "[Banker]";
+ mes "Very well... How much would you like to withdraw? The maximum you can withdraw at one time is 999,999 Zeny";
+ next;
+ if (@cost > 0) goto Lwithcost;
+ goto Lwithcont;
+
+ Lwithcost:
+ mes "[Banker]";
+ mes "Oh and don't forget there is a " + @cost + " Zeny charge on all transactions.";
+ next;
+ goto Lwithcont;
+
+Lwithcont:
+ input @withdrawl;
+ if (@withdrawl < 1) goto Lrealamount;
+ if (@withdrawl > #bankstorage) goto Lneedzeny3;
+ if ((@cost > Zeny) && ((Zeny + @withdrawl) > @cost)) goto Lcostask;
+ if (@cost > Zeny) goto Lneedzeny2;
+ goto Lwithcont2;
+
+ Lcostask:
+ mes "[Banker]";
+ mes "You don't have the Zeny for the transaction fee right now. Would you like me to take the fee directly from your withdrawl?";
+ next;
+ menu "Yes please.",Lwithtake,"No thank you.",Lcancel;
+
+ Lwithtake:
+ mes "[Banker]";
+ mes "Ok then.";
+ set @withdrawl,@withdrawl - @cost;
+ set #bankstorage,#bankstorage - @cost;
+ set @cost,0;
+ next;
+ goto Lwithcont2;
+
+Lwithcont2:
+ set Zeny,Zeny - @cost;
+ set Zeny,Zeny + @withdrawl;
+ set #bankstorage,#bankstorage - @withdrawl;
+ mes "[Banker]";
+ mes "There's your Zeny. Have a good day.";
+ close;
+
+Lbalance:
+ mes "[Banker]";
+ mes "Hmmmm lemme check the paper work.";
+ next;
+ mes "*Rustle, Rustle*";
+ next;
+ mes "[Banker]";
+ mes "You currently have " + #bankstorage + " Zeny in your account.";
+ close;
+
+Lrealamount:
+ mes "[Banker]";
+ mes "Don't play jokes with me please. Next time ask for a real amount.";
+ close;
+
+Lneedzeny:
+ mes "[Banker]";
+ mes "You don't have enough Zeny to make that deposit.";
+ close;
+
+Lneedzeny2:
+ mes "[Banker]";
+ mes "You don't have enough Zeny to cover the transaction fee.";
+ close;
+
+Lneedzeny3:
+ mes "[Banker]";
+ mes "You don't have enough Zeny in your account.";
+ close;
+
+Lcancel:
+ mes "[Banker]";
+ mes "Very well... come again soon.";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/banks/kafra_bank.txt b/npc/custom/banks/kafra_bank.txt
index 941501e88..970581ce7 100644
--- a/npc/custom/banks/kafra_bank.txt
+++ b/npc/custom/banks/kafra_bank.txt
@@ -1,116 +1,116 @@
-//===== eAthena Script =======================================
-//= The 2nd Bank of Prontera ( with daily 0.01% income! )
-//===== By: ==================================================
-//= Lupus (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.x
-//===== Description: =========================================
-//= A bank which has an interest %
-//===== Additional Comments: =================================
-// Look for this formula and setup your Bank daily % interest
-// #kafrabank/1000 = 0.1% of interest per day
-// #kafrabank/100 = 1% of interest per day
-// #kafrabank/10 = 10% of interest per day
-//
-// 1.1 Added log of bank operation -> logmes "some info";
-// 1.2 Set max income to 100,000z. It would help to avoid
-// zeny exploits when you change DATE at your server
-//============================================================
-
-prontera.gat,131,190,1 script Bank Clerk::bankg 833,{
- mes"[Maniss]";
- mes strcharinfo(0)+", welcome to the 2nd Bank of Prontera!";
-
- set @kb_int,(gettime(6)*31)+gettime(5); //today's number
- set @income,0;
-//calculate %
- if (#kafrabank<=0 || #kb_int>=@kb_int) goto L_NoIncomeToday;
- set @income,(#kafrabank/1000)*(@kb_int-#kb_int); //@income == % of the sum
-//max income constant:
- if (@income>100000) set @income,100000;
-L_NoIncomeToday:
- set #kb_int,@kb_int; //reset days timer
-
- if(#kafrabank==0) mes "We could open you an account.";
- if(@income>0) mes "Today's income: ^135445" + @income + "^000000 zeny.";
- set #kafrabank,#kafrabank+@income;
- if(#kafrabank>0) mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
- mes "What would you like?";
- next;
- if(#kafrabank==0) menu "-Open an account",-,"-Quit",B_EXIT2;
- if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2;
-
- mes"[Maniss]";
- mes "Please, tell me how much zeny you would like to deposit.";
- next;
- input @kafrabank;
-
- if(@kafrabank<1000) goto L_LESS_1000;
- if(@kafrabank>10000000) goto L_TOO_BIG_AMOUNT;
- if(@kafrabank>zeny) goto L_NOT_ENOUGH;
- set zeny,zeny-@kafrabank;
- set #kafrabank,#kafrabank+@kafrabank;
- mes"[Maniss]";
- mes "You've made a deposit of ^135445" + @kafrabank + "z^000000.";
-//we log these zeny operations into the log db
- logmes "Bank %: " + @income +"z, Deposit: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
- goto B_EXIT;
-
-M_WITHDRAW:
- if(#kafrabank==0) goto L_ZERO_ACCOUNT;
- mes"[Maniss]";
- mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
- mes "How much zeny would you like to withdraw?";
- next;
- input @kafrabank;
-
- if(@kafrabank<1) goto B_EXIT2;
- if(@kafrabank>10000000) goto L_TOO_BIG_AMOUNT;
- if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH;
- set #kafrabank,#kafrabank-@kafrabank;
- set zeny,zeny+@kafrabank;
- mes"[Maniss]";
- mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here...";
-//we log these zeny operations into the log db
- logmes "Bank %: " + @income +"z, Withdraw: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
- goto B_EXIT;
-
-L_NOT_ENOUGH:
- mes"[Maniss]";
- mes "You don't have enough zeny for this operation.";
- next;
- goto B_EXIT2;
-
-L_ZERO_ACCOUNT:
- mes"[Maniss]";
- mes "You don't have any zeny on your account!";
- next;
- goto B_EXIT2;
-
-L_TOO_BIG_AMOUNT:
- mes"[Maniss]";
- mes "Sorry. The maximum deposit you can make on a time is 10,000,000 zeny.";
- next;
- goto B_EXIT2;
-
-L_LESS_1000:
- mes"[Maniss]";
- mes "We're sorry, the minimum amount of zeny you can deposit is 1,000 zeny.";
- next;
- goto B_EXIT2;
-
-B_EXIT:
- mes "Very well... Come again soon!";
- next;
-
-B_EXIT2:
- mes"[Maniss]";
- mes "Thank you for using our Bank Service. We hope to see you again soon.";
- close;
-}
-
-geffen.gat,125,73,3 duplicate(bankg) Bank Clerk#2 833
-izlude.gat,145,107,1 duplicate(bankg) Bank Clerk#3 833
-morocc.gat,147,84,7 duplicate(bankg) Bank Clerk#4 833
+//===== eAthena Script =======================================
+//= The 2nd Bank of Prontera ( with daily 0.01% income! )
+//===== By: ==================================================
+//= Lupus (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.x
+//===== Description: =========================================
+//= A bank which has an interest %
+//===== Additional Comments: =================================
+// Look for this formula and setup your Bank daily % interest
+// #kafrabank/1000 = 0.1% of interest per day
+// #kafrabank/100 = 1% of interest per day
+// #kafrabank/10 = 10% of interest per day
+//
+// 1.1 Added log of bank operation -> logmes "some info";
+// 1.2 Set max income to 100,000z. It would help to avoid
+// zeny exploits when you change DATE at your server
+//============================================================
+
+prontera.gat,131,190,1 script Bank Clerk::bankg 833,{
+ mes"[Maniss]";
+ mes strcharinfo(0)+", welcome to the 2nd Bank of Prontera!";
+
+ set @kb_int,(gettime(6)*31)+gettime(5); //today's number
+ set @income,0;
+//calculate %
+ if (#kafrabank<=0 || #kb_int>=@kb_int) goto L_NoIncomeToday;
+ set @income,(#kafrabank/1000)*(@kb_int-#kb_int); //@income == % of the sum
+//max income constant:
+ if (@income>100000) set @income,100000;
+L_NoIncomeToday:
+ set #kb_int,@kb_int; //reset days timer
+
+ if(#kafrabank==0) mes "We could open you an account.";
+ if(@income>0) mes "Today's income: ^135445" + @income + "^000000 zeny.";
+ set #kafrabank,#kafrabank+@income;
+ if(#kafrabank>0) mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
+ mes "What would you like?";
+ next;
+ if(#kafrabank==0) menu "-Open an account",-,"-Quit",B_EXIT2;
+ if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2;
+
+ mes"[Maniss]";
+ mes "Please, tell me how much zeny you would like to deposit.";
+ next;
+ input @kafrabank;
+
+ if(@kafrabank<1000) goto L_LESS_1000;
+ if(@kafrabank>10000000) goto L_TOO_BIG_AMOUNT;
+ if(@kafrabank>zeny) goto L_NOT_ENOUGH;
+ set zeny,zeny-@kafrabank;
+ set #kafrabank,#kafrabank+@kafrabank;
+ mes"[Maniss]";
+ mes "You've made a deposit of ^135445" + @kafrabank + "z^000000.";
+//we log these zeny operations into the log db
+ logmes "Bank %: " + @income +"z, Deposit: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
+ goto B_EXIT;
+
+M_WITHDRAW:
+ if(#kafrabank==0) goto L_ZERO_ACCOUNT;
+ mes"[Maniss]";
+ mes "Your account: ^135445" + #kafrabank + "^000000 zeny.";
+ mes "How much zeny would you like to withdraw?";
+ next;
+ input @kafrabank;
+
+ if(@kafrabank<1) goto B_EXIT2;
+ if(@kafrabank>10000000) goto L_TOO_BIG_AMOUNT;
+ if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH;
+ set #kafrabank,#kafrabank-@kafrabank;
+ set zeny,zeny+@kafrabank;
+ mes"[Maniss]";
+ mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here...";
+//we log these zeny operations into the log db
+ logmes "Bank %: " + @income +"z, Withdraw: "+ @kafrabank +"z, Final: "+ #kafrabank +"z";
+ goto B_EXIT;
+
+L_NOT_ENOUGH:
+ mes"[Maniss]";
+ mes "You don't have enough zeny for this operation.";
+ next;
+ goto B_EXIT2;
+
+L_ZERO_ACCOUNT:
+ mes"[Maniss]";
+ mes "You don't have any zeny on your account!";
+ next;
+ goto B_EXIT2;
+
+L_TOO_BIG_AMOUNT:
+ mes"[Maniss]";
+ mes "Sorry. The maximum deposit you can make on a time is 10,000,000 zeny.";
+ next;
+ goto B_EXIT2;
+
+L_LESS_1000:
+ mes"[Maniss]";
+ mes "We're sorry, the minimum amount of zeny you can deposit is 1,000 zeny.";
+ next;
+ goto B_EXIT2;
+
+B_EXIT:
+ mes "Very well... Come again soon!";
+ next;
+
+B_EXIT2:
+ mes"[Maniss]";
+ mes "Thank you for using our Bank Service. We hope to see you again soon.";
+ close;
+}
+
+geffen.gat,125,73,3 duplicate(bankg) Bank Clerk#2 833
+izlude.gat,145,107,1 duplicate(bankg) Bank Clerk#3 833
+morocc.gat,147,84,7 duplicate(bankg) Bank Clerk#4 833
diff --git a/npc/custom/blackjack.txt b/npc/custom/blackjack.txt
index 0f8aa4e2a..c3429b5ec 100644
--- a/npc/custom/blackjack.txt
+++ b/npc/custom/blackjack.txt
@@ -1,349 +1,349 @@
-//===== eAthena Script =======================================
-//= Black Jack
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= Black Jack card game. Gameplay based off standard casino
-//= black jack rules. Dealer must have at least 17 to stay and will
-//= automatically stay at 17 and up. Player must have at least
-//= 13 to stay. Aces counted as 11 or 1. Option to "Double Down".
-//= Currently does not allow for "insurance", or "splitting"
-//= of pairs.
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-cmd_in02.gat,188,89,1 script Black Jack Dealer 57,{
-
- mes "[Dealer]";
- mes "Hello there! Would you like to play a game of Black Jack?";
- M_Menu:
- next;
- menu "What are the rules?",M_0, "I want to play.",L_Play, "No thanks.",M_End;
-
- M_0:
- mes "[Dealer]";
- mes "What would you like to know?";
- sM_Menu0:
- next;
- menu "The basics.",sM_0a, "Winning and loosing.",sM_0b, "'Double Down'.",sM_0c,
- "Ace value.",sM_0d, "Nothing.",M_Menu;
-
- sM_0a:
- mes "[Dealer]";
- mes "Black Jack is a card game in which the goal is to get 21, or as";
- mes "close to 21 points as possible, without going over 21.";
- next;
- mes "[Dealer]";
- mes "Before the game starts, the player must make a bet. Once the bet";
- mes "has been made, both the dealer and the player are dealt 2 cards";
- mes "each. Depending on what cards you have, you can choose to ^5533FF'stay'^000000,";
- mes "or you can choose to ^5533FF'pull'^000000.";
- next;
- mes "[Dealer]";
- mes "When you choose to 'stay', you are telling the dealer that you don't";
- mes "need anymore cards. This allows the dealer to pull if he/she";
- mes "wants to. In order to stay, you must have ^FF3355at least 13 points^000000. The";
- mes "dealer can only stay when he/she has^FF3355 17 points or more^000000.";
- next;
- mes "[Dealer]";
- mes "When you choose to 'pull', you are telling the dealer that you want";
- mes "another card. By pulling more cards you can increase your point";
- mes "total. As long has you have ^FF3355less than 21^000000 points you can pull a";
- mes "card from the deck.";
- goto sM_Menu0;
- sM_0b:
- mes "[Dealer]";
- mes "There are 3 ways to win and loose at Black Jack.";
- next;
- mes "[Dealer]";
- mes "1.) At the end of a Black Jack round, if you have more points";
- mes "than the dealer you will win the round. Conversely if you have";
- mes "less points than the dealer you will loose.";
- next;
- mes "[Dealer]";
- mes "2.) If you pull a card that makes your point total go over 21 you";
- mes "will automatically loose the round. This is called a ^5533FF'bust'^000000. If";
- mes "the dealer busts then you will win the round.";
- next;
- mes "[Dealer]";
- mes "3.) If you have a point total of 21 with the first 2 cards, you";
- mes "will automatically win the round. This is called a ^5533FF'Black Jack'^000000";
- mes "and happens when you get an 'Ace' and a '10 valued' card. If the";
- mes "dealer gets a Black Jack he/she will automatically win the round.";
- next;
- mes "[Dealer]";
- mes "4.) Besides winning and loosing, you can tie with the dealer. If";
- mes "both you and the dealer have the same point total at the end of a";
- mes "round, this will result in a tie with no winner and no loss or gain";
- mes "in money.";
- next;
- mes "[Dealer]";
- mes "This is called a ^5533FF'push'^000000 with the dealer. This also";
- mes "applies to both you and the dealer having Black Jack at the same";
- mes "time.";
- goto sM_Menu0;
- sM_0c:
- mes "[Dealer]";
- mes "The 'Double Down' option allows you to double your current bet,";
- mes "but with the drawback that you will only be able to pull one";
- mes "additional card. This option is only available at the beggining of";
- mes "each round.";
- next;
- mes "[Dealer]";
- mes "An example of when doubling down is usefull, is when";
- mes "your first 2 cards give you a point total of 11. You have a good";
- mes "chance of getting 21 or 20 with the next card that you draw. This";
- mes "would be a good hand to double down on.";
- goto sM_Menu0;
- sM_0d:
- mes "[Dealer]";
- mes "The 'Ace' card is a unique card in the game of Black Jack because";
- mes "it can have 2 values. An Ace can be counted as either 11 points,";
- mes "or just 1 point. For example if you had an Ace and a 4, that would";
- mes "give you either 15 or 5 points.";
- next;
- mes "[Dealer]";
- mes "If you decided to stay, the Ace would automatically be counted as";
- mes "11 points to give you 15 points total.";
- next;
- mes "[Dealer]";
- mes "If you had decided to pull and recieved a 9, the ace would";
- mes "automatically be counted as 1 point to give you a total of 14";
- mes "points. If the Ace was counted as 11 points, you would have a";
- mes "point total over 21 and would have lost.";
- next;
- mes "[Dealer]";
- mes "It is because of the flexibilty you have with the 'Ace' that makes";
- mes "it the most powerfull card in the game.";
- goto sM_Menu0;
- M_End:
- mes "[Dealer]";
- mes "Feel free to come back anytime";
- close;
-
-//================
-L_Play:
- mes "[Dealer]";
- mes "Please place your bets...";
- next;
- menu "2z",M_1a, "10z",M_1b, "20z",M_1c, "100z",M_1d, "Too rich for my blood....",M_End;
-
- M_1a:
- if(Zeny < 2) goto sL_NotEnuf;
- set @bet, 2;
- goto L_Cont0;
- M_1b:
- if(Zeny < 10) goto sL_NotEnuf;
- set @bet, 10;
- goto L_Cont0;
- M_1c:
- if(Zeny < 20) goto sL_NotEnuf;
- set @bet, 20;
- goto L_Cont0;
- M_1d:
- if(Zeny < 100) goto sL_NotEnuf;
- set @bet, 100;
- goto L_Cont0;
-
- sL_NotEnuf:
- mes "[Dealer]";
- mes "I'm sorry but you don't have enough zeny to make that bet.";
- close;
-
- L_Cont0:
- mes "(the cards are being dealt)";
- next;
- deletearray $@card[0],13;
- set @dealerTurn, 0;
- set @numP, 0;
- set @numD, 0;
- set @pAce, 0;
- set @dAce, 0;
- callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
- callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
- callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
- callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
-
-//==============
-L_Start:
- callsub sF_GetTot;
-
- mes "- Here are the ^FF5533DEALER'S^000000 cards:";
- if (@numD==2) callsub sF_D2cards;
- if (@numD==3) callsub sF_D3cards;
- if (@numD==4) callsub sF_D4cards;
- if (@numD==5) callsub sF_D5cards;
- mes " The DEALER has: ^FF5533"+@dealTot+"^000000";
- mes " ";
- mes "- Here are ^5533FFYOUR^000000 cards:";
- if (@numP==2) callsub sF_P2cards;
- if (@numP==3) callsub sF_P3cards;
- if (@numP==4) callsub sF_P4cards;
- if (@numP==5) callsub sF_P5cards;
- if(@pAce != 1 || @playTot == 21) mes " YOU have: ^5533FF" +@playTot+ "^000000";
- if(@pAce == 1 && @playTot != 21) mes " You have: ^5533FF" +@playTot+ "^000000, or ^5533FF" +(@playTot-10)+ "^000000";
- next;
- if(@playTot==21 && @dealTot==21) goto sL_Push;
- if(@numP==2 && @playTot == 21) goto sL_Win;
- if(@numD==2 && @dealTot == 21) goto sL_Lose;
- if(@playTot > 21) goto sL_Lose;
- if(@dealTot > 21) goto sL_Win;
- if(@numP==2 && @dealerTurn==0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay, "Double Down",M_Double;
- if(@dealerTurn == 0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay;
-
- M_Stay:
- mes "[Dealer]";
- if(@playTot < 13) goto sL_PlayToLow;
- if(@dealTot > 16) mes "The Dealer stays.";
- if(@dealTot > 16 || @numD == 5) goto L_Check;
- mes "The Dealer is going to pull";
- next;
- callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
- set @dealerTurn, 1;
- goto L_Start;
-
- sL_PlayToLow:
- mes "I'm sorry but you do not have a high enough total to stay. You must pull.";
- next;
- goto M_Hit;
-
- M_Hit:
- if(@numP == 5) goto M_Stay;
- callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
- goto L_Start;
- M_Double:
- mes "[Dealer]";
- mes "Player has chosen to Double Down. You're current bet will be";
- mes "doubled, and you will only be able to pull 1 extra card.";
- next;
- set @dealerTurn, 1;
- set @bet, @bet*2;
- callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
- goto L_Start;
-
-//=============
-L_Check:
- next;
- if(@playTot < @dealTot) goto sL_Lose;
- if(@playTot == @dealTot) goto sL_Push;
-
- sL_Win:
- mes "[Dealer]";
- mes "Congratulations, you've won!";
- next;
- set Zeny, Zeny + @bet;
- goto L_Play;
- sL_Lose:
- mes "[Dealer]";
- mes "I'm sorry but you've lost.";
- set Zeny, Zeny - @bet;
- next;
- goto L_Play;
- sL_Push:
- mes "[Dealer]";
- mes "Its a push. You tied with the Dealer.";
- next;
- goto L_Play;
-
-
-//==================================
-// Sub function for dealing/pulling the cards
-sF_GetCards:
- set @rnd, rand(1,13);
- if($@card[@rnd] == 4) goto sF_GetCards;
- set $@card[@rnd], $@card[@rnd] + 1;
- set getarg(1), @rnd;
- if(getarg(1) > 10) set getarg(1), 10;
- if(getarg(1) == 1 && getarg(3) < 1) set getarg(1), 11;
- if(getarg(1) == 11) set getarg(3), 1;
- set getarg(2), " " + getarg(1) + " ";
- if(@rnd == 10) set getarg(2), getarg(1);
- if(@rnd == 1) set getarg(2), " A ";
- if(@rnd == 11) set getarg(2), " J ";
- if(@rnd == 12) set getarg(2), " Q ";
- if(@rnd == 13) set getarg(2), " K ";
- set getarg(0), getarg(0) + 1;
- return;
-
-//==================================
-// Sub function for getting the total score for each hand
-sF_GetTot:
- set @i, 0;
- set @dealTot, 0;
- set @playTot, 0;
-
- GetDealTot:
- set @dealTot, @dealTot + @dealCard[@i];
- set @i, @i + 1;
- if(@i < @numD) goto GetDealTot;
- if(@dAce == 1 && @dealTot > 21) set @dealTot, @dealTot - 10;
- set @i, 0;
- GetPlayTot:
- set @playTot, @playTot + @playCard[@i];
- set @i, @i + 1;
- if(@i < @numP) goto GetPlayTot;
- if(@pAce == 1 && @playTot > 21) set @pAce, 2;
- if(@pAce > 0 && @playTot > 21) set @playTot, @playTot - 10;
- return;
-
-//=======================================
-// Sub function for displaying the Cards
-sF_D2cards:
- mes " .-----. .-----. ";
- mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | ";
- mes " '-----' '-----' ";
- return;
-sF_P2cards:
- mes " .-----. .-----. ";
- mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | ";
- mes " '-----' '-----' ";
- return;
-sF_D3cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
- mes " '-----' '-----' '-----' ";
- return;
-sF_P3cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
- mes " '-----' '-----' '-----' ";
- return;
-sF_D4cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
- mes " '-----' '-----' '-----' ";
- mes " .-----. ";
- mes " | "+@dealCard$[3]+" |";
- mes " '-----' ";
- return;
-sF_P4cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" |";
- mes " '-----' '-----' '-----' ";
- mes " .-----. ";
- mes " | "+@playCard$[3]+" |";
- mes " '-----' ";
- return;
-sF_D5cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
- mes " '-----' '-----' '-----' ";
- mes " .-----. .-----. ";
- mes " | "+@dealCard$[3]+" | | "+@dealCard$[4]+" | ";
- mes " '-----' '-----' ";
- return;
-sF_P5cards:
- mes " .-----. .-----. .-----. ";
- mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
- mes " '-----' '-----' '-----' ";
- mes " .-----. .-----. ";
- mes " | "+@playCard$[3]+" | | "+@playCard$[4]+" | ";
- mes " '-----' '-----' ";
- return;
-}
+//===== eAthena Script =======================================
+//= Black Jack
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= Black Jack card game. Gameplay based off standard casino
+//= black jack rules. Dealer must have at least 17 to stay and will
+//= automatically stay at 17 and up. Player must have at least
+//= 13 to stay. Aces counted as 11 or 1. Option to "Double Down".
+//= Currently does not allow for "insurance", or "splitting"
+//= of pairs.
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+cmd_in02.gat,188,89,1 script Black Jack Dealer 57,{
+
+ mes "[Dealer]";
+ mes "Hello there! Would you like to play a game of Black Jack?";
+ M_Menu:
+ next;
+ menu "What are the rules?",M_0, "I want to play.",L_Play, "No thanks.",M_End;
+
+ M_0:
+ mes "[Dealer]";
+ mes "What would you like to know?";
+ sM_Menu0:
+ next;
+ menu "The basics.",sM_0a, "Winning and loosing.",sM_0b, "'Double Down'.",sM_0c,
+ "Ace value.",sM_0d, "Nothing.",M_Menu;
+
+ sM_0a:
+ mes "[Dealer]";
+ mes "Black Jack is a card game in which the goal is to get 21, or as";
+ mes "close to 21 points as possible, without going over 21.";
+ next;
+ mes "[Dealer]";
+ mes "Before the game starts, the player must make a bet. Once the bet";
+ mes "has been made, both the dealer and the player are dealt 2 cards";
+ mes "each. Depending on what cards you have, you can choose to ^5533FF'stay'^000000,";
+ mes "or you can choose to ^5533FF'pull'^000000.";
+ next;
+ mes "[Dealer]";
+ mes "When you choose to 'stay', you are telling the dealer that you don't";
+ mes "need anymore cards. This allows the dealer to pull if he/she";
+ mes "wants to. In order to stay, you must have ^FF3355at least 13 points^000000. The";
+ mes "dealer can only stay when he/she has^FF3355 17 points or more^000000.";
+ next;
+ mes "[Dealer]";
+ mes "When you choose to 'pull', you are telling the dealer that you want";
+ mes "another card. By pulling more cards you can increase your point";
+ mes "total. As long has you have ^FF3355less than 21^000000 points you can pull a";
+ mes "card from the deck.";
+ goto sM_Menu0;
+ sM_0b:
+ mes "[Dealer]";
+ mes "There are 3 ways to win and loose at Black Jack.";
+ next;
+ mes "[Dealer]";
+ mes "1.) At the end of a Black Jack round, if you have more points";
+ mes "than the dealer you will win the round. Conversely if you have";
+ mes "less points than the dealer you will loose.";
+ next;
+ mes "[Dealer]";
+ mes "2.) If you pull a card that makes your point total go over 21 you";
+ mes "will automatically loose the round. This is called a ^5533FF'bust'^000000. If";
+ mes "the dealer busts then you will win the round.";
+ next;
+ mes "[Dealer]";
+ mes "3.) If you have a point total of 21 with the first 2 cards, you";
+ mes "will automatically win the round. This is called a ^5533FF'Black Jack'^000000";
+ mes "and happens when you get an 'Ace' and a '10 valued' card. If the";
+ mes "dealer gets a Black Jack he/she will automatically win the round.";
+ next;
+ mes "[Dealer]";
+ mes "4.) Besides winning and loosing, you can tie with the dealer. If";
+ mes "both you and the dealer have the same point total at the end of a";
+ mes "round, this will result in a tie with no winner and no loss or gain";
+ mes "in money.";
+ next;
+ mes "[Dealer]";
+ mes "This is called a ^5533FF'push'^000000 with the dealer. This also";
+ mes "applies to both you and the dealer having Black Jack at the same";
+ mes "time.";
+ goto sM_Menu0;
+ sM_0c:
+ mes "[Dealer]";
+ mes "The 'Double Down' option allows you to double your current bet,";
+ mes "but with the drawback that you will only be able to pull one";
+ mes "additional card. This option is only available at the beggining of";
+ mes "each round.";
+ next;
+ mes "[Dealer]";
+ mes "An example of when doubling down is usefull, is when";
+ mes "your first 2 cards give you a point total of 11. You have a good";
+ mes "chance of getting 21 or 20 with the next card that you draw. This";
+ mes "would be a good hand to double down on.";
+ goto sM_Menu0;
+ sM_0d:
+ mes "[Dealer]";
+ mes "The 'Ace' card is a unique card in the game of Black Jack because";
+ mes "it can have 2 values. An Ace can be counted as either 11 points,";
+ mes "or just 1 point. For example if you had an Ace and a 4, that would";
+ mes "give you either 15 or 5 points.";
+ next;
+ mes "[Dealer]";
+ mes "If you decided to stay, the Ace would automatically be counted as";
+ mes "11 points to give you 15 points total.";
+ next;
+ mes "[Dealer]";
+ mes "If you had decided to pull and recieved a 9, the ace would";
+ mes "automatically be counted as 1 point to give you a total of 14";
+ mes "points. If the Ace was counted as 11 points, you would have a";
+ mes "point total over 21 and would have lost.";
+ next;
+ mes "[Dealer]";
+ mes "It is because of the flexibilty you have with the 'Ace' that makes";
+ mes "it the most powerfull card in the game.";
+ goto sM_Menu0;
+ M_End:
+ mes "[Dealer]";
+ mes "Feel free to come back anytime";
+ close;
+
+//================
+L_Play:
+ mes "[Dealer]";
+ mes "Please place your bets...";
+ next;
+ menu "2z",M_1a, "10z",M_1b, "20z",M_1c, "100z",M_1d, "Too rich for my blood....",M_End;
+
+ M_1a:
+ if(Zeny < 2) goto sL_NotEnuf;
+ set @bet, 2;
+ goto L_Cont0;
+ M_1b:
+ if(Zeny < 10) goto sL_NotEnuf;
+ set @bet, 10;
+ goto L_Cont0;
+ M_1c:
+ if(Zeny < 20) goto sL_NotEnuf;
+ set @bet, 20;
+ goto L_Cont0;
+ M_1d:
+ if(Zeny < 100) goto sL_NotEnuf;
+ set @bet, 100;
+ goto L_Cont0;
+
+ sL_NotEnuf:
+ mes "[Dealer]";
+ mes "I'm sorry but you don't have enough zeny to make that bet.";
+ close;
+
+ L_Cont0:
+ mes "(the cards are being dealt)";
+ next;
+ deletearray $@card[0],13;
+ set @dealerTurn, 0;
+ set @numP, 0;
+ set @numD, 0;
+ set @pAce, 0;
+ set @dAce, 0;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+
+//==============
+L_Start:
+ callsub sF_GetTot;
+
+ mes "- Here are the ^FF5533DEALER'S^000000 cards:";
+ if (@numD==2) callsub sF_D2cards;
+ if (@numD==3) callsub sF_D3cards;
+ if (@numD==4) callsub sF_D4cards;
+ if (@numD==5) callsub sF_D5cards;
+ mes " The DEALER has: ^FF5533"+@dealTot+"^000000";
+ mes " ";
+ mes "- Here are ^5533FFYOUR^000000 cards:";
+ if (@numP==2) callsub sF_P2cards;
+ if (@numP==3) callsub sF_P3cards;
+ if (@numP==4) callsub sF_P4cards;
+ if (@numP==5) callsub sF_P5cards;
+ if(@pAce != 1 || @playTot == 21) mes " YOU have: ^5533FF" +@playTot+ "^000000";
+ if(@pAce == 1 && @playTot != 21) mes " You have: ^5533FF" +@playTot+ "^000000, or ^5533FF" +(@playTot-10)+ "^000000";
+ next;
+ if(@playTot==21 && @dealTot==21) goto sL_Push;
+ if(@numP==2 && @playTot == 21) goto sL_Win;
+ if(@numD==2 && @dealTot == 21) goto sL_Lose;
+ if(@playTot > 21) goto sL_Lose;
+ if(@dealTot > 21) goto sL_Win;
+ if(@numP==2 && @dealerTurn==0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay, "Double Down",M_Double;
+ if(@dealerTurn == 0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay;
+
+ M_Stay:
+ mes "[Dealer]";
+ if(@playTot < 13) goto sL_PlayToLow;
+ if(@dealTot > 16) mes "The Dealer stays.";
+ if(@dealTot > 16 || @numD == 5) goto L_Check;
+ mes "The Dealer is going to pull";
+ next;
+ callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce;
+ set @dealerTurn, 1;
+ goto L_Start;
+
+ sL_PlayToLow:
+ mes "I'm sorry but you do not have a high enough total to stay. You must pull.";
+ next;
+ goto M_Hit;
+
+ M_Hit:
+ if(@numP == 5) goto M_Stay;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ goto L_Start;
+ M_Double:
+ mes "[Dealer]";
+ mes "Player has chosen to Double Down. You're current bet will be";
+ mes "doubled, and you will only be able to pull 1 extra card.";
+ next;
+ set @dealerTurn, 1;
+ set @bet, @bet*2;
+ callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce;
+ goto L_Start;
+
+//=============
+L_Check:
+ next;
+ if(@playTot < @dealTot) goto sL_Lose;
+ if(@playTot == @dealTot) goto sL_Push;
+
+ sL_Win:
+ mes "[Dealer]";
+ mes "Congratulations, you've won!";
+ next;
+ set Zeny, Zeny + @bet;
+ goto L_Play;
+ sL_Lose:
+ mes "[Dealer]";
+ mes "I'm sorry but you've lost.";
+ set Zeny, Zeny - @bet;
+ next;
+ goto L_Play;
+ sL_Push:
+ mes "[Dealer]";
+ mes "Its a push. You tied with the Dealer.";
+ next;
+ goto L_Play;
+
+
+//==================================
+// Sub function for dealing/pulling the cards
+sF_GetCards:
+ set @rnd, rand(1,13);
+ if($@card[@rnd] == 4) goto sF_GetCards;
+ set $@card[@rnd], $@card[@rnd] + 1;
+ set getarg(1), @rnd;
+ if(getarg(1) > 10) set getarg(1), 10;
+ if(getarg(1) == 1 && getarg(3) < 1) set getarg(1), 11;
+ if(getarg(1) == 11) set getarg(3), 1;
+ set getarg(2), " " + getarg(1) + " ";
+ if(@rnd == 10) set getarg(2), getarg(1);
+ if(@rnd == 1) set getarg(2), " A ";
+ if(@rnd == 11) set getarg(2), " J ";
+ if(@rnd == 12) set getarg(2), " Q ";
+ if(@rnd == 13) set getarg(2), " K ";
+ set getarg(0), getarg(0) + 1;
+ return;
+
+//==================================
+// Sub function for getting the total score for each hand
+sF_GetTot:
+ set @i, 0;
+ set @dealTot, 0;
+ set @playTot, 0;
+
+ GetDealTot:
+ set @dealTot, @dealTot + @dealCard[@i];
+ set @i, @i + 1;
+ if(@i < @numD) goto GetDealTot;
+ if(@dAce == 1 && @dealTot > 21) set @dealTot, @dealTot - 10;
+ set @i, 0;
+ GetPlayTot:
+ set @playTot, @playTot + @playCard[@i];
+ set @i, @i + 1;
+ if(@i < @numP) goto GetPlayTot;
+ if(@pAce == 1 && @playTot > 21) set @pAce, 2;
+ if(@pAce > 0 && @playTot > 21) set @playTot, @playTot - 10;
+ return;
+
+//=======================================
+// Sub function for displaying the Cards
+sF_D2cards:
+ mes " .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_P2cards:
+ mes " .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_D3cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ return;
+sF_P3cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ return;
+sF_D4cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. ";
+ mes " | "+@dealCard$[3]+" |";
+ mes " '-----' ";
+ return;
+sF_P4cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" |";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. ";
+ mes " | "+@playCard$[3]+" |";
+ mes " '-----' ";
+ return;
+sF_D5cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. .-----. ";
+ mes " | "+@dealCard$[3]+" | | "+@dealCard$[4]+" | ";
+ mes " '-----' '-----' ";
+ return;
+sF_P5cards:
+ mes " .-----. .-----. .-----. ";
+ mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | ";
+ mes " '-----' '-----' '-----' ";
+ mes " .-----. .-----. ";
+ mes " | "+@playCard$[3]+" | | "+@playCard$[4]+" | ";
+ mes " '-----' '-----' ";
+ return;
+}
diff --git a/npc/custom/breeder.txt b/npc/custom/breeder.txt
index 03ed47d9d..5f36d4165 100644
--- a/npc/custom/breeder.txt
+++ b/npc/custom/breeder.txt
@@ -1,87 +1,87 @@
-//===== eAthena Script =======================================
-//= Custom Free Breeder aka Universal Renter (not reccomended)
-//===== By: ==================================================
-//= eAthena Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0 Final +
-//===== Description: =========================================
-//= A Free PecoPeco and Falcon Breeder
-//===== Additional Comments: =================================
-//FIXED checkriding/cart/falcon funcs [Lupus]
-//Added Rebirth/Advanced Class support [Mass Zero]
-//Simplified the checks of job [Silentdragon]
-//============================================================
-
-
-prontera.gat,122,200,1 script Universal Rental Npc 726,{
- mes "[Universal Rental Npc]";
- mes "Hi, here you can rent Carts, Falcons or Pecopecos.";
- next;
-
-L_Menu:
- menu "Rent a Cart",L_Cart,"Rent a Falcon",L_Falcon,"Rent a Pecopeco",L_Peco,"Quit",L_Quit;
- close;
-
-L_Cart:
- if((BaseClass == Job_Merchant || BaseJob == Job_SuperNovice) && checkcart(0) == 0) goto L_Cart_Ok;
- if(getskilllv(39)<1) goto L_Need_Skill;
-
- mes "[Universal Rental Npc]";
- mes "Sorry " + strcharinfo(0) + ", but I only rent carts to people with the Merchant job root, who have enough skills to handle a cart.";
- close;
-
-L_Cart_Ok:
- setcart;
- goto L_Quit2;
-
-L_Need_Skill:
- mes "[Universal Rental Npc]";
- mes "Sorry you don't have the required skill to rent a cart.";
- close;
-
-L_Falcon:
- if(BaseJob != Job_Archer && BaseClass == Job_Archer && checkfalcon(0) == 0) goto L_Falc;
- if(getskilllv(127)<1) goto L_Need_Skill2;
-
- mes "[Universal Rental Npc]";
- mes "Sorry " + strcharinfo(0) + ", but I only rent falcons to Hunters and Snipers who the ability to handle 'em.";
- close;
-
-L_Falc:
- setfalcon;
- goto L_Quit2;
-
-L_Need_Skill2:
- mes "[Universal Rental Npc]";
- mes "Sorry you don't have the required skill to own a Falcon.";
- close;
-
-L_Peco:
- if (BaseJob != Job_Swordman && BaseClass == Job_Swordman && checkriding(0) == 0) goto L_Peco_Ok;
- if(getskilllv(63)<1) goto L_Need_Skill3;
-
- mes "[Universal Rental Npc]";
- mes "Sorry " + strcharinfo(0) + ", but I only rent Pecopecos to Knights and Crusaders who have the ability to handle 'em.";
- close;
-
-L_Peco_Ok:
- setriding;
- goto L_Quit2;
-
-L_Need_Skill3:
- mes "[Universal Rental Npc]";
- mes "Sorry you don't have the required skill to ride a Peco Peco.";
- close;
-
-L_Quit:
- mes "[Universal Rental Npc]";
- mes strcharinfo(0) + ", please come back when you are ready to rent something.";
- close;
-
-L_Quit2:
- mes "[Universal Rental Npc]";
- mes strcharinfo(0) + ", please come again when you want another...";
- close;
-}
+//===== eAthena Script =======================================
+//= Custom Free Breeder aka Universal Renter (not reccomended)
+//===== By: ==================================================
+//= eAthena Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0 Final +
+//===== Description: =========================================
+//= A Free PecoPeco and Falcon Breeder
+//===== Additional Comments: =================================
+//FIXED checkriding/cart/falcon funcs [Lupus]
+//Added Rebirth/Advanced Class support [Mass Zero]
+//Simplified the checks of job [Silentdragon]
+//============================================================
+
+
+prontera.gat,122,200,1 script Universal Rental Npc 726,{
+ mes "[Universal Rental Npc]";
+ mes "Hi, here you can rent Carts, Falcons or Pecopecos.";
+ next;
+
+L_Menu:
+ menu "Rent a Cart",L_Cart,"Rent a Falcon",L_Falcon,"Rent a Pecopeco",L_Peco,"Quit",L_Quit;
+ close;
+
+L_Cart:
+ if((BaseClass == Job_Merchant || BaseJob == Job_SuperNovice) && checkcart(0) == 0) goto L_Cart_Ok;
+ if(getskilllv(39)<1) goto L_Need_Skill;
+
+ mes "[Universal Rental Npc]";
+ mes "Sorry " + strcharinfo(0) + ", but I only rent carts to people with the Merchant job root, who have enough skills to handle a cart.";
+ close;
+
+L_Cart_Ok:
+ setcart;
+ goto L_Quit2;
+
+L_Need_Skill:
+ mes "[Universal Rental Npc]";
+ mes "Sorry you don't have the required skill to rent a cart.";
+ close;
+
+L_Falcon:
+ if(BaseJob != Job_Archer && BaseClass == Job_Archer && checkfalcon(0) == 0) goto L_Falc;
+ if(getskilllv(127)<1) goto L_Need_Skill2;
+
+ mes "[Universal Rental Npc]";
+ mes "Sorry " + strcharinfo(0) + ", but I only rent falcons to Hunters and Snipers who the ability to handle 'em.";
+ close;
+
+L_Falc:
+ setfalcon;
+ goto L_Quit2;
+
+L_Need_Skill2:
+ mes "[Universal Rental Npc]";
+ mes "Sorry you don't have the required skill to own a Falcon.";
+ close;
+
+L_Peco:
+ if (BaseJob != Job_Swordman && BaseClass == Job_Swordman && checkriding(0) == 0) goto L_Peco_Ok;
+ if(getskilllv(63)<1) goto L_Need_Skill3;
+
+ mes "[Universal Rental Npc]";
+ mes "Sorry " + strcharinfo(0) + ", but I only rent Pecopecos to Knights and Crusaders who have the ability to handle 'em.";
+ close;
+
+L_Peco_Ok:
+ setriding;
+ goto L_Quit2;
+
+L_Need_Skill3:
+ mes "[Universal Rental Npc]";
+ mes "Sorry you don't have the required skill to ride a Peco Peco.";
+ close;
+
+L_Quit:
+ mes "[Universal Rental Npc]";
+ mes strcharinfo(0) + ", please come back when you are ready to rent something.";
+ close;
+
+L_Quit2:
+ mes "[Universal Rental Npc]";
+ mes strcharinfo(0) + ", please come again when you want another...";
+ close;
+}
diff --git a/npc/custom/card_remover.txt b/npc/custom/card_remover.txt
index 8af6ed157..3b3e97dd8 100644
--- a/npc/custom/card_remover.txt
+++ b/npc/custom/card_remover.txt
@@ -1,175 +1,175 @@
-// Card removal NPC by TyrNemesis^
-// DANGEROUS! TODO: Think.. think 8) [Lupus]
-
-
-prt_in.gat,28,73,4 script Wise Old Woman 78,{
-
-UPGRADEROOT:
- mes "[Wise Old Woman]";
- mes "Good day, young one. I have the power to remove cards that you have compounded onto your equipment. Does this idea please you?";
- next;
- menu "Yes, it does.",REMOVEMENU,
- "What do you charge?",REMOVEPRICE,
- "No thanks.",CLOSEOUT;
-
-REMOVEPRICE:
- mes "[Wise Old Woman]";
- mes "I charge a flat fee of 200000 zeny, plus 25000 zeny for each card I remove from the item. In addition, I need a star crumb and a yellow gemstone to work my magic.";
- next;
- menu "Very well. Let's do it.",REMOVEMENU,
- "No thanks.",CLOSEOUT;
-
-REMOVEMENU:
- mes "[Wise Old Woman]";
- mes "Very well. Which item shall I examine for you?";
- next;
- menu "I changed my mind.",CLOSEOUT,
- getequipname(1),SLOT1,
- getequipname(2),SLOT2,
- getequipname(3),SLOT3,
- getequipname(4),SLOT4,
- getequipname(5),SLOT5,
- getequipname(6),SLOT6,
- getequipname(7),SLOT7,
- getequipname(8),SLOT8,
- getequipname(9),SLOT9,
- getequipname(10),SLOT10;
-
-SLOT1:
- set @part,1;
- goto CARDNUMCHECK;
-
-SLOT2:
- set @part,2;
- goto CARDNUMCHECK;
-
-SLOT3:
- set @part,3;
- goto CARDNUMCHECK;
-
-SLOT4:
- set @part,4;
- goto CARDNUMCHECK;
-
-SLOT5:
- set @part,5;
- goto CARDNUMCHECK;
-
-SLOT6:
- set @part,6;
- goto CARDNUMCHECK;
-
-SLOT7:
- set @part,7;
- goto CARDNUMCHECK;
-
-SLOT8:
- set @part,8;
- goto CARDNUMCHECK;
-
-SLOT9:
- set @part,9;
- goto CARDNUMCHECK;
-
-SLOT10:
- set @part,10;
- goto CARDNUMCHECK;
-
-CARDNUMCHECK:
- if(getequipcardcnt(@part) == 0) goto DENYCARDCOUNT;
- set @cardcount,getequipcardcnt(@part);
- if(@cardcount > 1) goto CARDNUMMULTIMSG;
- mes "[Wise Old Woman]";
- mes "This item has " + @cardcount + " card compounded on it. To perform my magic, I will need 225000 zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
- goto CARDNUMPOSTMSG;
-CARDNUMMULTIMSG:
- mes "[Wise Old Woman]";
- mes "This item has " + @cardcount + " cards compounded on it. To perform my magic, I will need " + (200000+(@cardcount * 25000)) + " zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
-CARDNUMPOSTMSG:
- next;
- menu "Very well. Do it.",REMOVECARDWARNING,
- "Never mind.",CLOSEOUT;
-
-REMOVECARDWARNING:
- mes "[Wise Old Woman]";
- mes "Before I begin, I must warn you--I may fail. If I do, I may destroy the cards, the item, or both. I do not give refunds. That being said, which is more important to you: The cards, or the item?";
- next;
- menu "I changed my mind about this.",CLOSEOUT,
- "The item.",PRIORITYITEM,
- "The cards.",PRIORITYCARD;
-
-PRIORITYITEM:
- set @failtype,1;
- goto REMOVECARD;
-
-PRIORITYCARD:
- set @failtype,2;
- goto REMOVECARD;
-
-REMOVECARD:
- mes "[Wise Old Woman]";
- mes "Very well. I shall begin.";
- if((zeny < (200000+(@cardcount * 25000))) || (countitem(1000) < 1) || (countitem(715) < 1)) goto DENYMATERIAL;
- set zeny,zeny - (200000+(@cardcount * 25000));
- delitem 1000,1;
- delitem 715,1;
-// Replace the constants in the next 3 lines with failure chance values defined in refine_db.txt
-// First value = Total failure chance (item and cards destroyed)
-// Second value = Partial failure chance (one or the other is destroyed, player decides which one is safe)
-// Third value = Harmless failure chance (all that's lost is your investment)
-
- set @failchance,rand(100);
-// if(@failchance < 2) goto FAILREMOVECARD0;
-// if((@failchance < 8) && (@failtype == 1)) goto FAILREMOVECARD1;
-// if((@failchance < 8) && (@failtype == 2)) goto FAILREMOVECARD2;
- if(@failchance < 10) goto FAILREMOVECARD3;
- successremovecards @part;
- next;
- mes "[Wise Old Woman]";
- mes "The process was a success. Here are your cards and your item. Farewell.";
- close;
-
-FAILREMOVECARD0:
- failedremovecards @part,0;
- next;
- mes "[Wise Old Woman]";
- mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
- close;
-
-FAILREMOVECARD1:
- failedremovecards @part,1;
- next;
- mes "[Wise Old Woman]";
- mes "While I have managed to remove the cards from the item, they were destroyed in the process. The item, however, is okay.";
- close;
-
-FAILREMOVECARD2:
- failedremovecards @part,2;
- next;
- mes "[Wise Old Woman]";
- mes "Most unfortunate. I succeeded at removing the cards, but the item itself was destroyed in the process.";
- close;
-
-FAILREMOVECARD3:
- failedremovecards @part,3;
- next;
- mes "[Wise Old Woman]";
- mes "I have failed to remove the cards. Luckily, however, both the item and the cards are still okay.";
- close;
-
-DENYCARDCOUNT:
- mes "[Wise Old Woman]";
- mes "Young one... There are no cards compounded on this item. I can do nothing with it, I'm afraid.";
- close;
-
-DENYMATERIAL:
- next;
- mes "[Wise Old Woman]";
- mes "You do not have all the items I require to work my magic, child. Come again when you do.";
- close;
-
-CLOSEOUT:
- mes "[Wise Old Woman]";
- mes "Very well. Return at once if you seek my services.";
- close;
-}
+// Card removal NPC by TyrNemesis^
+// DANGEROUS! TODO: Think.. think 8) [Lupus]
+
+
+prt_in.gat,28,73,4 script Wise Old Woman 78,{
+
+UPGRADEROOT:
+ mes "[Wise Old Woman]";
+ mes "Good day, young one. I have the power to remove cards that you have compounded onto your equipment. Does this idea please you?";
+ next;
+ menu "Yes, it does.",REMOVEMENU,
+ "What do you charge?",REMOVEPRICE,
+ "No thanks.",CLOSEOUT;
+
+REMOVEPRICE:
+ mes "[Wise Old Woman]";
+ mes "I charge a flat fee of 200000 zeny, plus 25000 zeny for each card I remove from the item. In addition, I need a star crumb and a yellow gemstone to work my magic.";
+ next;
+ menu "Very well. Let's do it.",REMOVEMENU,
+ "No thanks.",CLOSEOUT;
+
+REMOVEMENU:
+ mes "[Wise Old Woman]";
+ mes "Very well. Which item shall I examine for you?";
+ next;
+ menu "I changed my mind.",CLOSEOUT,
+ getequipname(1),SLOT1,
+ getequipname(2),SLOT2,
+ getequipname(3),SLOT3,
+ getequipname(4),SLOT4,
+ getequipname(5),SLOT5,
+ getequipname(6),SLOT6,
+ getequipname(7),SLOT7,
+ getequipname(8),SLOT8,
+ getequipname(9),SLOT9,
+ getequipname(10),SLOT10;
+
+SLOT1:
+ set @part,1;
+ goto CARDNUMCHECK;
+
+SLOT2:
+ set @part,2;
+ goto CARDNUMCHECK;
+
+SLOT3:
+ set @part,3;
+ goto CARDNUMCHECK;
+
+SLOT4:
+ set @part,4;
+ goto CARDNUMCHECK;
+
+SLOT5:
+ set @part,5;
+ goto CARDNUMCHECK;
+
+SLOT6:
+ set @part,6;
+ goto CARDNUMCHECK;
+
+SLOT7:
+ set @part,7;
+ goto CARDNUMCHECK;
+
+SLOT8:
+ set @part,8;
+ goto CARDNUMCHECK;
+
+SLOT9:
+ set @part,9;
+ goto CARDNUMCHECK;
+
+SLOT10:
+ set @part,10;
+ goto CARDNUMCHECK;
+
+CARDNUMCHECK:
+ if(getequipcardcnt(@part) == 0) goto DENYCARDCOUNT;
+ set @cardcount,getequipcardcnt(@part);
+ if(@cardcount > 1) goto CARDNUMMULTIMSG;
+ mes "[Wise Old Woman]";
+ mes "This item has " + @cardcount + " card compounded on it. To perform my magic, I will need 225000 zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
+ goto CARDNUMPOSTMSG;
+CARDNUMMULTIMSG:
+ mes "[Wise Old Woman]";
+ mes "This item has " + @cardcount + " cards compounded on it. To perform my magic, I will need " + (200000+(@cardcount * 25000)) + " zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
+CARDNUMPOSTMSG:
+ next;
+ menu "Very well. Do it.",REMOVECARDWARNING,
+ "Never mind.",CLOSEOUT;
+
+REMOVECARDWARNING:
+ mes "[Wise Old Woman]";
+ mes "Before I begin, I must warn you--I may fail. If I do, I may destroy the cards, the item, or both. I do not give refunds. That being said, which is more important to you: The cards, or the item?";
+ next;
+ menu "I changed my mind about this.",CLOSEOUT,
+ "The item.",PRIORITYITEM,
+ "The cards.",PRIORITYCARD;
+
+PRIORITYITEM:
+ set @failtype,1;
+ goto REMOVECARD;
+
+PRIORITYCARD:
+ set @failtype,2;
+ goto REMOVECARD;
+
+REMOVECARD:
+ mes "[Wise Old Woman]";
+ mes "Very well. I shall begin.";
+ if((zeny < (200000+(@cardcount * 25000))) || (countitem(1000) < 1) || (countitem(715) < 1)) goto DENYMATERIAL;
+ set zeny,zeny - (200000+(@cardcount * 25000));
+ delitem 1000,1;
+ delitem 715,1;
+// Replace the constants in the next 3 lines with failure chance values defined in refine_db.txt
+// First value = Total failure chance (item and cards destroyed)
+// Second value = Partial failure chance (one or the other is destroyed, player decides which one is safe)
+// Third value = Harmless failure chance (all that's lost is your investment)
+
+ set @failchance,rand(100);
+// if(@failchance < 2) goto FAILREMOVECARD0;
+// if((@failchance < 8) && (@failtype == 1)) goto FAILREMOVECARD1;
+// if((@failchance < 8) && (@failtype == 2)) goto FAILREMOVECARD2;
+ if(@failchance < 10) goto FAILREMOVECARD3;
+ successremovecards @part;
+ next;
+ mes "[Wise Old Woman]";
+ mes "The process was a success. Here are your cards and your item. Farewell.";
+ close;
+
+FAILREMOVECARD0:
+ failedremovecards @part,0;
+ next;
+ mes "[Wise Old Woman]";
+ mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
+ close;
+
+FAILREMOVECARD1:
+ failedremovecards @part,1;
+ next;
+ mes "[Wise Old Woman]";
+ mes "While I have managed to remove the cards from the item, they were destroyed in the process. The item, however, is okay.";
+ close;
+
+FAILREMOVECARD2:
+ failedremovecards @part,2;
+ next;
+ mes "[Wise Old Woman]";
+ mes "Most unfortunate. I succeeded at removing the cards, but the item itself was destroyed in the process.";
+ close;
+
+FAILREMOVECARD3:
+ failedremovecards @part,3;
+ next;
+ mes "[Wise Old Woman]";
+ mes "I have failed to remove the cards. Luckily, however, both the item and the cards are still okay.";
+ close;
+
+DENYCARDCOUNT:
+ mes "[Wise Old Woman]";
+ mes "Young one... There are no cards compounded on this item. I can do nothing with it, I'm afraid.";
+ close;
+
+DENYMATERIAL:
+ next;
+ mes "[Wise Old Woman]";
+ mes "You do not have all the items I require to work my magic, child. Come again when you do.";
+ close;
+
+CLOSEOUT:
+ mes "[Wise Old Woman]";
+ mes "Very well. Return at once if you seek my services.";
+ close;
+}
diff --git a/npc/custom/devnpc.txt b/npc/custom/devnpc.txt
index 6e17bb170..77f3dc16a 100644
--- a/npc/custom/devnpc.txt
+++ b/npc/custom/devnpc.txt
@@ -1,508 +1,508 @@
-//===== eAthena Script =======================================
-//= Dev edition NPCs!
-//===== By: ==================================================
-//= Most NPCs by Aria
-//= MouseJstr NPC by MouseJstr
-//= Massdriller NPC by massdriller
-//= Evera NPC by Evera
-//= Kevin NPC by Kevin
-//===== Current Version: =====================================
-//= 0.5
-//===== Compatible With: =====================================
-//= eAthena 1.0 Final +
-//===== Description: =========================================
-//= NPCs of the devs!
-//===== Additional Comments: =================================
-//= Some devs don't have their quotes yet >_>
-//= currently we only have Aria, Mouse, and MC_Cameri done.
-//= David is there because he has coords, but he's incomplete;
-//= he has no biography
-//============================================================
-
-// MouseJstr =========================================================>\\
-ayothaya.gat,76,145,5 script MouseJstr 763,{
- npcspeed 50;
- mes "[MouseJstr]";
- mes "Yo homeslices..";
- mes "I am MouseJstr on AIM and josh in real life..";
- next;
- mes "I enjoy maintaining a RO server because of the abuse I get";
- close;
- OnTimer15000:
- npcwalkto 70+rand(17),135+rand(16);
- setnpctimer 0;
-
-doitagain:
- set $foo,rand(5);
- if($foo == 0) goto Lquote0;
- if($foo == 1) goto Lquote1;
- if($foo == 2) goto Lquote2;
- if($foo == 3) goto Lquote3;
- if($foo == 4) goto Lquote4;
- goto doitagain;
-
-Lquote0:
- npctalk "Brb.. my baby is throwing up on my leg.";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "The only difference between a hurricane and skydiving is which direction the tree's come at you from..";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "Wanna be a GM? Write me a C routine that reverses a string in place..";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "Wanna be a GM? Write me a C routine that finds me the highest bit set in a network order 32 bit integer...";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "I am the dark angel of eAthena.. withen weeks of my arrival, almost everybody was gone or dead.. fear me...";
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-
-// MC Cameri =========================================================>\\
-morocc.gat,160,97,4 script MC Cameri 706,{
- npcspeed 100;
- mes "[MC Cameri]";
- mes "I'm the @command guy from oA...";
- mes "^FF8040Real Name^000000: Can't tell you my name";
- mes "^FF8040Age^000000: 16 years";
- mes "^FF8040Where I live^000000: Dominican Republic, in the caribbean";
- next;
- mes "[MC Cameri]";
- mes "^FF8040What I Do^000000: mostly working on @commands for GMs...";
- mes "^FF8040Why I'm here^000000: Because I like programming...";
- next;
- mes "[MC Cameri]";
- mes "I'm a senior student, programmer, body builder(yes, I lift weights), etc.";
- close;
- OnTimer15000:
- npcwalkto 154+rand(17),87+rand(16);
- setnpctimer 0;
-
-Lmctalk:
- set $mctalk,rand(10);
- if($mctalk == 0) goto Lquote0;
- if($mctalk == 1) goto Lquote1;
- if($mctalk == 2) goto Lquote2;
- if($mctalk == 3) goto Lquote3;
- if($mctalk == 4) goto Lquote4;
- if($mctalk == 5) goto Lquote5;
- if($mctalk == 6) goto Lquote6;
- if($mctalk == 7) goto Lquote7;
- if($mctalk == 8) goto Lquote8;
- if($mctalk == 9) goto Lquote9;
- if($mctalk == 10) goto Lquote10;
- goto Lmctalk;
-Lquote0:
- npctalk "OMGWTFBBQ";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "I owns you all, under my commands. *lol*";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "I forgot my script, what do I have to say again? *_*U";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "Are you guys my friends?";
- setnpctimer 0;
- end;
-Lquote5:
- npctalk "My mom told me not to talk to strangers. *stares*";
- setnpctimer 0;
- end;
-Lquote6:
- npctalk "How can you be SO ugly!?";
- setnpctimer 0;
- end;
-Lquote7:
- npctalk "I need a friend to play with =(. *sobs*";
- setnpctimer 0;
- end;
-Lquote8:
- npctalk "I've been kicking this rock for as long as I can remember.";
- setnpctimer 0;
- end;
-Lquote9:
- npctalk "My computer just broke, and I don't know how to format. *sobs*";
- setnpctimer 0;
- end;
-Lquote10:
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-
-
-// Davidsiaw =========================================================>\\
-payon.gat,182,104,4 script Davidsiaw 1002,{
- npcspeed 150;
- mes "[Davidsiaw]";
- mes "omghi";
- close;
-OnTimer15000:
- npcwalkto 176+rand(17),94+rand(16);
- setnpctimer 0;
-
-Ldavidtalk:
- set $davidtalk,rand(10);
- if($davidtalk == 0) goto Lquote0;
- if($davidtalk == 1) goto Lquote1;
- if($davidtalk == 2) goto Lquote2;
- if($davidtalk == 3) goto Lquote3;
- if($davidtalk == 4) goto Lquote4;
- if($davidtalk == 5) goto Lquote5;
- if($davidtalk == 6) goto Lquote6;
- goto Ldavidtalk;
-Lquote0:
- npctalk "OMGWTFBBQ";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "Wud are you looking at?";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "baka...";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "*drops 100 Mjolnirs on the floor*";
- setnpctimer 0;
- end;
-Lquote5:
- npctalk "There ya go ;)";
- setnpctimer 0;
- end;
-Lquote6:
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-
-//Aria\\
-prontera.gat,156,179,4 script Aria 805,{
- npcspeed 150;
- mes "[Aria]";
- mes "Okay, I'm Evera's brother, Aria";
- mes "^FF00FFAge^000000: 13 years";
- mes "^FF00FFWhat I do^000000: Graphics and NPCs";
- mes "^FF00FFWhy I'm here^000000: Cuz eAthena ROX";
- close;
-OnTimer15000:
- npcwalkto 150+rand(17),169+rand(16);
- setnpctimer 0;
-
-Lariatalk:
- set $ariatalk,rand(10);
- if($ariatalk == 0) goto Lquote0;
- if($ariatalk == 1) goto Lquote1;
- if($ariatalk == 2) goto Lquote2;
- if($ariatalk == 3) goto Lquote3;
- if($ariatalk == 4) goto Lquote4;
- if($ariatalk == 5) goto Lquote5;
- if($ariatalk == 6) goto Lquote6;
- if($ariatalk == 7) goto Lquote7;
- if($ariatalk == 8) goto Lquote8;
- if($ariatalk == 9) goto Lquote9;
- if($ariatalk == 10) goto Lquote10;
- goto Lariatalk;
-
-Lquote0:
- npctalk "OMGWTFBBQ";
- end;
-Lquote1:
- npctalk "So its u -> 0";
- npctalk "... That did not look right";
- end;
-Lquote2:
- npctalk "????";
- end;
-
-Lquote3:
- npctalk "OMGITSJEEBUS!#!@%!";
- setnpctimer 0;
- end;
-
-Lquote4:
- npctalk "Evera died. I guess.";
- setnpctimer 0;
- end;
-
-Lquote5:
- npctalk "I CLICK THE BUTTON AND THEY DON'T DIE!";
- setnpctimer 0;
- end;
-
-Lquote6:
- npctalk "RO? wtf?";
- npctalk "Oh yeah.";
- setnpctimer 0;
- end;
-
-Lquote7:
- npctalk "omgnoob. DIE!";
- setnpctimer 0;
- end;
-
-Lquote8:
- npctalk "WooT!";
- setnpctimer 0;
- end;
-
-Lquote9:
- npctalk "is that why u bought windows";
- npctalk "cuz bill has red hair";
- setnpctimer 0;
- end;
-
-Lquote10:
- setnpctimer 0;
- end;
-
-OnInit:
- initnpctimer;
- end;
-}
-
-// Evera =========================================================>\\
-prontera.gat,156,183,5 script Evera 769,{
- npcspeed 50;
- mes "[Evera]";
- mes "Hi";
- mes "I betcha you thoguht I was dead, right?";
- next;
- mes "Well, I'M (not really) BACK!";
- mes "And I also enjoy long walks on the beach ^.^";
- close;
- OnTimer15000:
- npcwalkto 150+rand(17),173+rand(16);
- setnpctimer 0;
-
-doitagain:
- set $lol,rand(5);
- if($lol == 0) goto Lquote0;
- if($lol == 1) goto Lquote1;
- if($lol == 2) goto Lquote2;
- if($lol == 3) goto Lquote3;
- if($lol == 4) goto Lquote4;
- if($lol == 5) goto Lquote5;
- goto doitagain;
-
-Lquote0:
- npctalk "Does anyone actually remember who I am?";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "O_o";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "Bananaphone!";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "Go away troll.";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "Aria can go to hell.";
- setnpctimer 0;
- end;
-Lquote5:
- npctalk "Sup, I'm back.";
- setnpctimer 0;
- end;
-Lquote6:
- npctalk "WTFPWNED";
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-
-// Kevin =========================================================>\\
-prontera.gat,178,204,5 script Kevin 774,{
- npcspeed 50;
- mes "[Kevin]";
- mes "SUP?!?!?!?!";
- mes "YOU JUST GOT PWNED!!!";
- next;
- mes "OUCH, ANOTHER PERSON PWNED BY KEVIN!";
- close;
- OnTimer15000:
- npcwalkto 170+rand(17),200+rand(16);
- setnpctimer 0;
-
-doitagain:
- set $lol,rand(9);
- if($lol == 0) goto Lquote0;
- if($lol == 1) goto Lquote1;
- if($lol == 2) goto Lquote2;
- if($lol == 3) goto Lquote3;
- if($lol == 4) goto Lquote4;
- if($lol == 5) goto Lquote1;
- if($lol == 6) goto Lquote2;
- if($lol == 7) goto Lquote3;
- if($lol == 8) goto Lquote4;
- goto doitagain;
-
-Lquote0:
- npctalk "OMFGLMFAO I HAVE PWNED SO MANY PEOPLE!";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "GO EA DEVS!";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "WATCH OUT FOR ME ON THE IRC CHANNEL! HAHAHA!";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "WANNA SEE MY NEW MIRC SCRIPT?!?";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "w00t! YOU ARE SUCH A N00B YOU... N00B";
- setnpctimer 0;
- end;
-Lquote5:
- npctalk "d00d! i r l337!";
- setnpctimer 0;
- end;
-Lquote6:
- npctalk "pssst: what do you think of my evil plot to take over the da irc network?";
- setnpctimer 0;
- end;
-Lquote7:
- npctalk "ORANGE COUNTY LIBERATION FRONT!";
- setnpctimer 0;
- end;
-Lquote8:
- npctalk "OMFG YOU ARE SO UGLY!";
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-
-
-// massdriller =========================================================>\\
-geffen.gat,122,63,5 script massdriller 823,{
- npcspeed 50;
- mes "[massdriller]";
- mes "Who am i? I am A nobody!";
- mes "I like pwning people!";
- next;
- mes "[massdriller]";
- mes "Main goal in life is to annoy and pwn Kevin";
- close;
- OnTimer15000:
- npcwalkto 170+rand(17),200+rand(16);
- setnpctimer 0;
-
-doitagain:
- set $lol,rand(9);
- if($lol == 0) goto Lquote0;
- if($lol == 1) goto Lquote1;
- if($lol == 2) goto Lquote2;
- if($lol == 3) goto Lquote3;
- if($lol == 4) goto Lquote4;
- if($lol == 5) goto Lquote1;
- if($lol == 6) goto Lquote2;
- if($lol == 7) goto Lquote3;
- if($lol == 8) goto Lquote4;
- goto doitagain;
-
-Lquote0:
- npctalk "Hmm....What script needs to be fixed...";
- setnpctimer 0;
- end;
-Lquote1:
- npctalk "OMFG...you suck!";
- setnpctimer 0;
- end;
-Lquote2:
- npctalk "The worst kind of noobs are the heal! zeny! items plz! type.";
- setnpctimer 0;
- end;
-Lquote3:
- npctalk "What happens when you die of boredom?";
- setnpctimer 0;
- end;
-Lquote4:
- npctalk "I'm such a kewl Person...";
- setnpctimer 0;
- end;
-Lquote5:
- npctalk "OMFGWTFBBQ...I'm also known as MadDawg";
- setnpctimer 0;
- end;
-Lquote6:
- npctalk "Gimme your items...I'll eat them and eat you...";
- setnpctimer 0;
- end;
-Lquote7:
- npctalk "Aren't porings cute?";
- setnpctimer 0;
- end;
-Lquote8:
- npctalk "Omfg..you are full of shit....";
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
-aldebaran.gat,137,118,5 script Fredzilla 4020,0,0,{
- npcspeed 140;
-OnTouch:
- mes "[Fredzilla]";
- mes "I dont really know what I do";
- mes "Well I have made some scripts, translated some scripts and corrected some scripts.";
- next;
- mes "[Fredzilla]";
- mes "But other than that I do nothing.";
- close;
-OnTimer25000:
- npcwalkto 137+rand(5),118+rand(5);
- setnpctimer 0;
-doitagain:
- set $fred,rand(6);
- if($fred == 0) npctalk "I have the most optimized Dev NPC";
- if($fred == 1) npctalk "Yeah I am a Dev, what do you mean I'm just a member on the forum !!!";
- if($fred == 2) npctalk "I probably the worst speller on the Dev team.";
- if($fred == 3) npctalk "You didnt think I was a real player did you?!?";
- if($fred == 4) npctalk "Golden, Ripe, Boneless Bananas, 39 Cents A Pound.";
- if($fred == 5) npctalk "All those who believe in telekinesis, raise my hand.";
- if($fred > 5 || $fred < 0) goto doitagain;
- setnpctimer 0;
- end;
-OnInit:
- initnpctimer;
- end;
-}
+//===== eAthena Script =======================================
+//= Dev edition NPCs!
+//===== By: ==================================================
+//= Most NPCs by Aria
+//= MouseJstr NPC by MouseJstr
+//= Massdriller NPC by massdriller
+//= Evera NPC by Evera
+//= Kevin NPC by Kevin
+//===== Current Version: =====================================
+//= 0.5
+//===== Compatible With: =====================================
+//= eAthena 1.0 Final +
+//===== Description: =========================================
+//= NPCs of the devs!
+//===== Additional Comments: =================================
+//= Some devs don't have their quotes yet >_>
+//= currently we only have Aria, Mouse, and MC_Cameri done.
+//= David is there because he has coords, but he's incomplete;
+//= he has no biography
+//============================================================
+
+// MouseJstr =========================================================>\\
+ayothaya.gat,76,145,5 script MouseJstr 763,{
+ npcspeed 50;
+ mes "[MouseJstr]";
+ mes "Yo homeslices..";
+ mes "I am MouseJstr on AIM and josh in real life..";
+ next;
+ mes "I enjoy maintaining a RO server because of the abuse I get";
+ close;
+ OnTimer15000:
+ npcwalkto 70+rand(17),135+rand(16);
+ setnpctimer 0;
+
+doitagain:
+ set $foo,rand(5);
+ if($foo == 0) goto Lquote0;
+ if($foo == 1) goto Lquote1;
+ if($foo == 2) goto Lquote2;
+ if($foo == 3) goto Lquote3;
+ if($foo == 4) goto Lquote4;
+ goto doitagain;
+
+Lquote0:
+ npctalk "Brb.. my baby is throwing up on my leg.";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "The only difference between a hurricane and skydiving is which direction the tree's come at you from..";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "Wanna be a GM? Write me a C routine that reverses a string in place..";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "Wanna be a GM? Write me a C routine that finds me the highest bit set in a network order 32 bit integer...";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "I am the dark angel of eAthena.. withen weeks of my arrival, almost everybody was gone or dead.. fear me...";
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+
+// MC Cameri =========================================================>\\
+morocc.gat,160,97,4 script MC Cameri 706,{
+ npcspeed 100;
+ mes "[MC Cameri]";
+ mes "I'm the @command guy from oA...";
+ mes "^FF8040Real Name^000000: Can't tell you my name";
+ mes "^FF8040Age^000000: 16 years";
+ mes "^FF8040Where I live^000000: Dominican Republic, in the caribbean";
+ next;
+ mes "[MC Cameri]";
+ mes "^FF8040What I Do^000000: mostly working on @commands for GMs...";
+ mes "^FF8040Why I'm here^000000: Because I like programming...";
+ next;
+ mes "[MC Cameri]";
+ mes "I'm a senior student, programmer, body builder(yes, I lift weights), etc.";
+ close;
+ OnTimer15000:
+ npcwalkto 154+rand(17),87+rand(16);
+ setnpctimer 0;
+
+Lmctalk:
+ set $mctalk,rand(10);
+ if($mctalk == 0) goto Lquote0;
+ if($mctalk == 1) goto Lquote1;
+ if($mctalk == 2) goto Lquote2;
+ if($mctalk == 3) goto Lquote3;
+ if($mctalk == 4) goto Lquote4;
+ if($mctalk == 5) goto Lquote5;
+ if($mctalk == 6) goto Lquote6;
+ if($mctalk == 7) goto Lquote7;
+ if($mctalk == 8) goto Lquote8;
+ if($mctalk == 9) goto Lquote9;
+ if($mctalk == 10) goto Lquote10;
+ goto Lmctalk;
+Lquote0:
+ npctalk "OMGWTFBBQ";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "I owns you all, under my commands. *lol*";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "I forgot my script, what do I have to say again? *_*U";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "Are you guys my friends?";
+ setnpctimer 0;
+ end;
+Lquote5:
+ npctalk "My mom told me not to talk to strangers. *stares*";
+ setnpctimer 0;
+ end;
+Lquote6:
+ npctalk "How can you be SO ugly!?";
+ setnpctimer 0;
+ end;
+Lquote7:
+ npctalk "I need a friend to play with =(. *sobs*";
+ setnpctimer 0;
+ end;
+Lquote8:
+ npctalk "I've been kicking this rock for as long as I can remember.";
+ setnpctimer 0;
+ end;
+Lquote9:
+ npctalk "My computer just broke, and I don't know how to format. *sobs*";
+ setnpctimer 0;
+ end;
+Lquote10:
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+
+
+// Davidsiaw =========================================================>\\
+payon.gat,182,104,4 script Davidsiaw 1002,{
+ npcspeed 150;
+ mes "[Davidsiaw]";
+ mes "omghi";
+ close;
+OnTimer15000:
+ npcwalkto 176+rand(17),94+rand(16);
+ setnpctimer 0;
+
+Ldavidtalk:
+ set $davidtalk,rand(10);
+ if($davidtalk == 0) goto Lquote0;
+ if($davidtalk == 1) goto Lquote1;
+ if($davidtalk == 2) goto Lquote2;
+ if($davidtalk == 3) goto Lquote3;
+ if($davidtalk == 4) goto Lquote4;
+ if($davidtalk == 5) goto Lquote5;
+ if($davidtalk == 6) goto Lquote6;
+ goto Ldavidtalk;
+Lquote0:
+ npctalk "OMGWTFBBQ";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "Wud are you looking at?";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "baka...";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "*drops 100 Mjolnirs on the floor*";
+ setnpctimer 0;
+ end;
+Lquote5:
+ npctalk "There ya go ;)";
+ setnpctimer 0;
+ end;
+Lquote6:
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+
+//Aria\\
+prontera.gat,156,179,4 script Aria 805,{
+ npcspeed 150;
+ mes "[Aria]";
+ mes "Okay, I'm Evera's brother, Aria";
+ mes "^FF00FFAge^000000: 13 years";
+ mes "^FF00FFWhat I do^000000: Graphics and NPCs";
+ mes "^FF00FFWhy I'm here^000000: Cuz eAthena ROX";
+ close;
+OnTimer15000:
+ npcwalkto 150+rand(17),169+rand(16);
+ setnpctimer 0;
+
+Lariatalk:
+ set $ariatalk,rand(10);
+ if($ariatalk == 0) goto Lquote0;
+ if($ariatalk == 1) goto Lquote1;
+ if($ariatalk == 2) goto Lquote2;
+ if($ariatalk == 3) goto Lquote3;
+ if($ariatalk == 4) goto Lquote4;
+ if($ariatalk == 5) goto Lquote5;
+ if($ariatalk == 6) goto Lquote6;
+ if($ariatalk == 7) goto Lquote7;
+ if($ariatalk == 8) goto Lquote8;
+ if($ariatalk == 9) goto Lquote9;
+ if($ariatalk == 10) goto Lquote10;
+ goto Lariatalk;
+
+Lquote0:
+ npctalk "OMGWTFBBQ";
+ end;
+Lquote1:
+ npctalk "So its u -> 0";
+ npctalk "... That did not look right";
+ end;
+Lquote2:
+ npctalk "????";
+ end;
+
+Lquote3:
+ npctalk "OMGITSJEEBUS!#!@%!";
+ setnpctimer 0;
+ end;
+
+Lquote4:
+ npctalk "Evera died. I guess.";
+ setnpctimer 0;
+ end;
+
+Lquote5:
+ npctalk "I CLICK THE BUTTON AND THEY DON'T DIE!";
+ setnpctimer 0;
+ end;
+
+Lquote6:
+ npctalk "RO? wtf?";
+ npctalk "Oh yeah.";
+ setnpctimer 0;
+ end;
+
+Lquote7:
+ npctalk "omgnoob. DIE!";
+ setnpctimer 0;
+ end;
+
+Lquote8:
+ npctalk "WooT!";
+ setnpctimer 0;
+ end;
+
+Lquote9:
+ npctalk "is that why u bought windows";
+ npctalk "cuz bill has red hair";
+ setnpctimer 0;
+ end;
+
+Lquote10:
+ setnpctimer 0;
+ end;
+
+OnInit:
+ initnpctimer;
+ end;
+}
+
+// Evera =========================================================>\\
+prontera.gat,156,183,5 script Evera 769,{
+ npcspeed 50;
+ mes "[Evera]";
+ mes "Hi";
+ mes "I betcha you thoguht I was dead, right?";
+ next;
+ mes "Well, I'M (not really) BACK!";
+ mes "And I also enjoy long walks on the beach ^.^";
+ close;
+ OnTimer15000:
+ npcwalkto 150+rand(17),173+rand(16);
+ setnpctimer 0;
+
+doitagain:
+ set $lol,rand(5);
+ if($lol == 0) goto Lquote0;
+ if($lol == 1) goto Lquote1;
+ if($lol == 2) goto Lquote2;
+ if($lol == 3) goto Lquote3;
+ if($lol == 4) goto Lquote4;
+ if($lol == 5) goto Lquote5;
+ goto doitagain;
+
+Lquote0:
+ npctalk "Does anyone actually remember who I am?";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "O_o";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "Bananaphone!";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "Go away troll.";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "Aria can go to hell.";
+ setnpctimer 0;
+ end;
+Lquote5:
+ npctalk "Sup, I'm back.";
+ setnpctimer 0;
+ end;
+Lquote6:
+ npctalk "WTFPWNED";
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+
+// Kevin =========================================================>\\
+prontera.gat,178,204,5 script Kevin 774,{
+ npcspeed 50;
+ mes "[Kevin]";
+ mes "SUP?!?!?!?!";
+ mes "YOU JUST GOT PWNED!!!";
+ next;
+ mes "OUCH, ANOTHER PERSON PWNED BY KEVIN!";
+ close;
+ OnTimer15000:
+ npcwalkto 170+rand(17),200+rand(16);
+ setnpctimer 0;
+
+doitagain:
+ set $lol,rand(9);
+ if($lol == 0) goto Lquote0;
+ if($lol == 1) goto Lquote1;
+ if($lol == 2) goto Lquote2;
+ if($lol == 3) goto Lquote3;
+ if($lol == 4) goto Lquote4;
+ if($lol == 5) goto Lquote1;
+ if($lol == 6) goto Lquote2;
+ if($lol == 7) goto Lquote3;
+ if($lol == 8) goto Lquote4;
+ goto doitagain;
+
+Lquote0:
+ npctalk "OMFGLMFAO I HAVE PWNED SO MANY PEOPLE!";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "GO EA DEVS!";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "WATCH OUT FOR ME ON THE IRC CHANNEL! HAHAHA!";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "WANNA SEE MY NEW MIRC SCRIPT?!?";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "w00t! YOU ARE SUCH A N00B YOU... N00B";
+ setnpctimer 0;
+ end;
+Lquote5:
+ npctalk "d00d! i r l337!";
+ setnpctimer 0;
+ end;
+Lquote6:
+ npctalk "pssst: what do you think of my evil plot to take over the da irc network?";
+ setnpctimer 0;
+ end;
+Lquote7:
+ npctalk "ORANGE COUNTY LIBERATION FRONT!";
+ setnpctimer 0;
+ end;
+Lquote8:
+ npctalk "OMFG YOU ARE SO UGLY!";
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+
+
+// massdriller =========================================================>\\
+geffen.gat,122,63,5 script massdriller 823,{
+ npcspeed 50;
+ mes "[massdriller]";
+ mes "Who am i? I am A nobody!";
+ mes "I like pwning people!";
+ next;
+ mes "[massdriller]";
+ mes "Main goal in life is to annoy and pwn Kevin";
+ close;
+ OnTimer15000:
+ npcwalkto 170+rand(17),200+rand(16);
+ setnpctimer 0;
+
+doitagain:
+ set $lol,rand(9);
+ if($lol == 0) goto Lquote0;
+ if($lol == 1) goto Lquote1;
+ if($lol == 2) goto Lquote2;
+ if($lol == 3) goto Lquote3;
+ if($lol == 4) goto Lquote4;
+ if($lol == 5) goto Lquote1;
+ if($lol == 6) goto Lquote2;
+ if($lol == 7) goto Lquote3;
+ if($lol == 8) goto Lquote4;
+ goto doitagain;
+
+Lquote0:
+ npctalk "Hmm....What script needs to be fixed...";
+ setnpctimer 0;
+ end;
+Lquote1:
+ npctalk "OMFG...you suck!";
+ setnpctimer 0;
+ end;
+Lquote2:
+ npctalk "The worst kind of noobs are the heal! zeny! items plz! type.";
+ setnpctimer 0;
+ end;
+Lquote3:
+ npctalk "What happens when you die of boredom?";
+ setnpctimer 0;
+ end;
+Lquote4:
+ npctalk "I'm such a kewl Person...";
+ setnpctimer 0;
+ end;
+Lquote5:
+ npctalk "OMFGWTFBBQ...I'm also known as MadDawg";
+ setnpctimer 0;
+ end;
+Lquote6:
+ npctalk "Gimme your items...I'll eat them and eat you...";
+ setnpctimer 0;
+ end;
+Lquote7:
+ npctalk "Aren't porings cute?";
+ setnpctimer 0;
+ end;
+Lquote8:
+ npctalk "Omfg..you are full of shit....";
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
+aldebaran.gat,137,118,5 script Fredzilla 4020,0,0,{
+ npcspeed 140;
+OnTouch:
+ mes "[Fredzilla]";
+ mes "I dont really know what I do";
+ mes "Well I have made some scripts, translated some scripts and corrected some scripts.";
+ next;
+ mes "[Fredzilla]";
+ mes "But other than that I do nothing.";
+ close;
+OnTimer25000:
+ npcwalkto 137+rand(5),118+rand(5);
+ setnpctimer 0;
+doitagain:
+ set $fred,rand(6);
+ if($fred == 0) npctalk "I have the most optimized Dev NPC";
+ if($fred == 1) npctalk "Yeah I am a Dev, what do you mean I'm just a member on the forum !!!";
+ if($fred == 2) npctalk "I probably the worst speller on the Dev team.";
+ if($fred == 3) npctalk "You didnt think I was a real player did you?!?";
+ if($fred == 4) npctalk "Golden, Ripe, Boneless Bananas, 39 Cents A Pound.";
+ if($fred == 5) npctalk "All those who believe in telekinesis, raise my hand.";
+ if($fred > 5 || $fred < 0) goto doitagain;
+ setnpctimer 0;
+ end;
+OnInit:
+ initnpctimer;
+ end;
+}
diff --git a/npc/custom/dye.txt b/npc/custom/dye.txt
index 4ebfc41f9..f7fb16afc 100644
--- a/npc/custom/dye.txt
+++ b/npc/custom/dye.txt
@@ -1,176 +1,176 @@
-//===== eAthena Script =======================================
-//= Stylist Script
-//===== By: ==================================================
-//= eAthena Dev team
-//= Revised by Nekosume [pyRO v3.0]
-//===== Current Version: =====================================
-//= 4.0
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Revised dye NPC
-//===== Additional Comments: =================================
-//= v4.1 - New hairstyles added [Mass Zero]
-//= v4.0 - Refined and Combined [Darkchild]
-//= v3.0 - Added the 'Browse' options
-//= v2.5 - Added more hair colors
-//= v2.0 - Changed palette and hair style select
-//= v1.5 - Revised script / different dialog
-//= v1.0 - Split into two NPCs
-//============================================================
-
-
-//Stylist------------------------------------------------------------------------------------------------------------
-prontera.gat,170,180,1 script Stylist 122,{
- mes "[^FF8000Stylist^000000]";
- mes "I'm the greatest stylist in all of Rune-Midgard~~!";
- mes "I can change your hair style or color!";
- mes "What do you wish to change?";
- next;
- menu "Hair style",Lstyle,"Hair color",Lcolor,"Cloth Color",Lcloth,"Nothing",LCancel;
-
- Lstyle:
- mes "[^FF8000Stylist^000000]";
- mes "Do you want to browse through the choices, or do you know what you want?";
- next;
- menu "Browse",Lbrowsesty,"I know what I want",Lwantsty;
-
- Lwantsty:
- mes "[^FF8000Stylist^000000]";
- mes "Great! Now just pick a style and I'll get started!";
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Please pick a style number ^0000FFbetween 0 and 23^000000.";
- mes "Number 0, by the way, is the default style for your character.";
- next;
- input @sty;
- if (@sty>23) close;
- if (@sty<0) close;
- setlook 1,@sty;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Is this good, or do you want a different style?";
- next;
- menu "This is good",-,"Different style, please",Lwantsty;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "You look great~! Come back again, okay?";
- close;
-
- Lbrowsesty:
- set @look, -1;
- mes "[^FF8000Stylist^000000]";
- mes "Okay, here we go~! Just stop me when you see something you like, okay?";
- next;
-
- Lbrowserep:
- set @look,@look+1;
- setlook 1,@look;
- mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
- if(@look == 23) menu "Back To The Begin",Lbrowsesty,"I like this one",Lstop;
- if(@look != 23) menu "Keep going",Lbrowserep,"I like this one",Lstop;
-
- Lcolor:
- mes "[^FF8000Stylist^000000]";
- mes "Do you want to browse through the choices, or do you know what you want?";
- next;
- menu "Browse",Lbrowsecolor,"I know what I want",Lwantcolor;
-
- Lwantcolor:
- mes "[^FF8000Stylist^000000]";
- mes "Just pick a color and we can get started.";
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Please pick a style number ^0000FFbetween 0 and 20^000000.";
- mes "Number 0, by the way, is the default color for your character.";
- next;
- mes "[^FF8000Stylist^000000]";
- mes "0 is default...";
- mes "1 is blonde...";
- mes "2 is lavender...";
- mes "3 is brown...";
- mes "4 is green...";
- mes "5 is blue...";
- mes "6 is white...";
- mes "7 is black...";
- mes "8 is red...";
- mes "and 9-20 are new colors.";
- input @color;
- if (@color>20) close;
- if (@color<0) close;
- setlook 6,@color;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Is this good, or do you want a different color?";
- next;
- menu "This is good",-,"Different color, please",Lwantcolor;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "You look great~! Come back again, okay?";
- close;
-
- Lbrowsecolor:
- set @look, -1;
- mes "[^FF8000Stylist^000000]";
- mes "Okay, here we go~! Just stop me when you see something you like, okay?";
- next;
-
- Lbrowsecolorrep:
- set @look,@look+1;
- setlook 6,@look;
- mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
- if(@look == 20) menu "Back To The Begin",Lbrowsecolor,"I like this one",Lstop;
- if(@look != 20) menu "Keep going",Lbrowsecolorrep,"I like this one",Lstop;
-
- Lstop:
- mes "[^FF8000Stylist^000000]";
- mes "You look great~! I love it~! ^_^";
- close;
-
- LCancel:
- mes "[^FF8000Stylist^000000]";
- mes "Well come again.";
- close;
-
- Lcloth:
- mes "[^FF8000Stylist^000000]";
- mes "Do you want to browse through the choices, or do you know what you want?";
- next;
- menu "Browse",Lbrowsecloth,"I know what I want",Lwantcloth;
-
- Lwantcloth:
- mes "[^FF8000Stylist^000000]";
- mes "Great! Now just pick a pallete and I'll get started!";
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Please pick a style number ^0000FFbetween 0 and 77^000000.";
- mes "Number 0, by the way, is the default style for your character.";
- next;
- input @pal;
- if (@pal>77) close;
- if (@pal<0) close;
- setlook 7,@pal;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "Is this good, or do you want a different pallet";
- next;
- menu "This is good",-,"Different pallet, please",Lwantcloth;
- next;
- mes "[^FF8000Stylist^000000]";
- mes "You look great~! Come back again, okay?";
- close;
-
- Lbrowsecloth:
- set @look, -1;
- mes "[^FF8000Stylist^000000]";
- mes "Okay, here we go~! Just stop me when you see something you like, okay?";
- next;
-
- Lbrowseclothrep:
- set @look,@look+1;
- setlook 7,@look;
- mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
- if(@look == 77) menu "Back To The Begin",Lbrowsecloth,"I like this one",Lstop;
- if(@look != 77) menu "Keep going",Lbrowseclothrep,"I like this one",Lstop;
-}
-
+//===== eAthena Script =======================================
+//= Stylist Script
+//===== By: ==================================================
+//= eAthena Dev team
+//= Revised by Nekosume [pyRO v3.0]
+//===== Current Version: =====================================
+//= 4.0
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Revised dye NPC
+//===== Additional Comments: =================================
+//= v4.1 - New hairstyles added [Mass Zero]
+//= v4.0 - Refined and Combined [Darkchild]
+//= v3.0 - Added the 'Browse' options
+//= v2.5 - Added more hair colors
+//= v2.0 - Changed palette and hair style select
+//= v1.5 - Revised script / different dialog
+//= v1.0 - Split into two NPCs
+//============================================================
+
+
+//Stylist------------------------------------------------------------------------------------------------------------
+prontera.gat,170,180,1 script Stylist 122,{
+ mes "[^FF8000Stylist^000000]";
+ mes "I'm the greatest stylist in all of Rune-Midgard~~!";
+ mes "I can change your hair style or color!";
+ mes "What do you wish to change?";
+ next;
+ menu "Hair style",Lstyle,"Hair color",Lcolor,"Cloth Color",Lcloth,"Nothing",LCancel;
+
+ Lstyle:
+ mes "[^FF8000Stylist^000000]";
+ mes "Do you want to browse through the choices, or do you know what you want?";
+ next;
+ menu "Browse",Lbrowsesty,"I know what I want",Lwantsty;
+
+ Lwantsty:
+ mes "[^FF8000Stylist^000000]";
+ mes "Great! Now just pick a style and I'll get started!";
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Please pick a style number ^0000FFbetween 0 and 23^000000.";
+ mes "Number 0, by the way, is the default style for your character.";
+ next;
+ input @sty;
+ if (@sty>23) close;
+ if (@sty<0) close;
+ setlook 1,@sty;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Is this good, or do you want a different style?";
+ next;
+ menu "This is good",-,"Different style, please",Lwantsty;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "You look great~! Come back again, okay?";
+ close;
+
+ Lbrowsesty:
+ set @look, -1;
+ mes "[^FF8000Stylist^000000]";
+ mes "Okay, here we go~! Just stop me when you see something you like, okay?";
+ next;
+
+ Lbrowserep:
+ set @look,@look+1;
+ setlook 1,@look;
+ mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
+ if(@look == 23) menu "Back To The Begin",Lbrowsesty,"I like this one",Lstop;
+ if(@look != 23) menu "Keep going",Lbrowserep,"I like this one",Lstop;
+
+ Lcolor:
+ mes "[^FF8000Stylist^000000]";
+ mes "Do you want to browse through the choices, or do you know what you want?";
+ next;
+ menu "Browse",Lbrowsecolor,"I know what I want",Lwantcolor;
+
+ Lwantcolor:
+ mes "[^FF8000Stylist^000000]";
+ mes "Just pick a color and we can get started.";
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Please pick a style number ^0000FFbetween 0 and 20^000000.";
+ mes "Number 0, by the way, is the default color for your character.";
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "0 is default...";
+ mes "1 is blonde...";
+ mes "2 is lavender...";
+ mes "3 is brown...";
+ mes "4 is green...";
+ mes "5 is blue...";
+ mes "6 is white...";
+ mes "7 is black...";
+ mes "8 is red...";
+ mes "and 9-20 are new colors.";
+ input @color;
+ if (@color>20) close;
+ if (@color<0) close;
+ setlook 6,@color;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Is this good, or do you want a different color?";
+ next;
+ menu "This is good",-,"Different color, please",Lwantcolor;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "You look great~! Come back again, okay?";
+ close;
+
+ Lbrowsecolor:
+ set @look, -1;
+ mes "[^FF8000Stylist^000000]";
+ mes "Okay, here we go~! Just stop me when you see something you like, okay?";
+ next;
+
+ Lbrowsecolorrep:
+ set @look,@look+1;
+ setlook 6,@look;
+ mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
+ if(@look == 20) menu "Back To The Begin",Lbrowsecolor,"I like this one",Lstop;
+ if(@look != 20) menu "Keep going",Lbrowsecolorrep,"I like this one",Lstop;
+
+ Lstop:
+ mes "[^FF8000Stylist^000000]";
+ mes "You look great~! I love it~! ^_^";
+ close;
+
+ LCancel:
+ mes "[^FF8000Stylist^000000]";
+ mes "Well come again.";
+ close;
+
+ Lcloth:
+ mes "[^FF8000Stylist^000000]";
+ mes "Do you want to browse through the choices, or do you know what you want?";
+ next;
+ menu "Browse",Lbrowsecloth,"I know what I want",Lwantcloth;
+
+ Lwantcloth:
+ mes "[^FF8000Stylist^000000]";
+ mes "Great! Now just pick a pallete and I'll get started!";
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Please pick a style number ^0000FFbetween 0 and 77^000000.";
+ mes "Number 0, by the way, is the default style for your character.";
+ next;
+ input @pal;
+ if (@pal>77) close;
+ if (@pal<0) close;
+ setlook 7,@pal;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "Is this good, or do you want a different pallet";
+ next;
+ menu "This is good",-,"Different pallet, please",Lwantcloth;
+ next;
+ mes "[^FF8000Stylist^000000]";
+ mes "You look great~! Come back again, okay?";
+ close;
+
+ Lbrowsecloth:
+ set @look, -1;
+ mes "[^FF8000Stylist^000000]";
+ mes "Okay, here we go~! Just stop me when you see something you like, okay?";
+ next;
+
+ Lbrowseclothrep:
+ set @look,@look+1;
+ setlook 7,@look;
+ mes "This is Pallete Number^FF9009 "+@look+" ^000000!";
+ if(@look == 77) menu "Back To The Begin",Lbrowsecloth,"I like this one",Lstop;
+ if(@look != 77) menu "Keep going",Lbrowseclothrep,"I like this one",Lstop;
+}
+
diff --git a/npc/custom/eAAC_Scripts/DonationGirl/donate.txt b/npc/custom/eAAC_Scripts/DonationGirl/donate.txt
index 84824b8d7..66e619333 100644
--- a/npc/custom/eAAC_Scripts/DonationGirl/donate.txt
+++ b/npc/custom/eAAC_Scripts/DonationGirl/donate.txt
@@ -1,365 +1,365 @@
-//===== Athena Script =======================================
-//= Donation NPC
-//===== By ==================================================
-//= Josh
-//===== Version =============================================
-//= 1.0 - First release. Probably contains bugs/security
-//= risks
-//= 1.1 - Added a check for whether the account exists when
-//= adding a donator. Need to improve ordering when
-//= viewing all donations.
-//= 1.2 - Modified for public use. Added checkweight feature.
-//= 2.0 - Many changes, especially ones I had always wanted
-//= to add to this script. Includes reading items from
-//= a separate SQL table and more database manipulation
-//= options for GMs.
-//= 2.1 - Made few changes including the add/remove items
-//= feature.
-//= 3.0 - All strings inputed by a user and user/char names
-//= in SQL queries are now escaped. Each item has a
-//= price rather than a quantity. This script can work
-//= with decimals.
-//= 3.1 - Added quotes to some queries, fixed a variable and
-//= removed a comment.
-//= 3.2 - Fixed a problem where eAthena would crash if a
-//= query returned NULL.
-//= 3.3 - Optimized query speeds by combining a few select
-//= queries into one. Requires Trunk 7975.
-//===== Compatible With =====================================
-//= eAthena - any version that contains the new query_sql
-//= command (Trunk 7975).
-//===== Description =========================================
-//= A script that lets a player claim an item for donating.
-//= Allows a GM to input each donation.
-//===== Comments ============================================
-//= This script uses SQL tables to store variables for the
-//= amount donated by users and the items claimable.
-//===== Installation ========================================
-//= You must execute donate.sql and donate_item_db.sql before
-//= using this script.
-//===========================================================
-//= Thanks to Vich for helping me with the SQL syntax.
-//= Thanks to Lance for helping me with the the arrays and
-//= for implementing query_sql.
-//= Thanks to Skotlex for implementing escape_sql.
-//= Thanks to Toms for implementing the new multi-column
-//= query_sql command.
-//===========================================================
-
-prontera.gat,145,179,5 script Donation Girl 714,{
-
-if (getgmlevel() >= 80) goto L_GM;
-
-L_START:
-mes "[Donation Girl]";
-mes "Hello! I'm the Donation Girl!";
-mes "If you have made a donation,";
-mes "you are entitled to a reward!";
-next;
-menu "More info",-,"Make a claim",L_CHECK,"Statistics",L_STATS;
-L_INFO:
-mes "[Donation Girl]";
-mes "Each month, a lot of money is paid to keep this server running.";
-next;
-mes "[Donation Girl]";
-mes "You can support us by donating any amount of money.";
-next;
-mes "[Donation Girl]";
-mes "To show our appreciation, we will gladly give you a reward.";
-next;
-menu "Continue",L_START,"Cancel",-;
-close;
-
-L_CHECK:
-query_sql "SELECT `amount`,`claimed` FROM `donate` WHERE `account_id` = "+getcharid(3)+"", @amount$, @claimed$;
-query_sql "SELECT MIN(price) FROM `donate_item_db`", @min$;
-query_sql "SELECT '"+@amount$+"' - '"+@claimed$+"'", @value$;
-query_sql "SELECT '"+@value$+"' >= '"+@min$+"'", @enough;
-if(@enough) goto L_CLAIM;
-mes "[Donation Girl]";
-mes "Sorry, you do not have enough to make a claim.";
-mes "If you have donated but have not made a claim,";
-mes "Please give us time to process your donation.";
-close;
-
-L_CLAIM:
-mes "[Donation Girl]";
-mes "Thankyou for donating!";
-mes "You have $"+@value$+" worth of credit!";
-mes "Would you like to claim an item now?";
-next;
-menu "No",-,"Yes",L_YES;
-mes "[Donation Girl]";
-mes "Ok! You are able to collect your item(s) any time!";
-close;
-
-L_YES:
-mes "[Donation Girl]";
-mes "Very well. Which item would you like?";
-next;
-query_sql "SELECT `name` FROM `donate_item_db` ORDER BY `name` ASC",$@name$;
-set $@menu$, $@name$[0];
- for(set $@i, 1; $@i < 127; set $@i, $@i + 1){
- set $@menu$, $@menu$ + ":" + $@name$[$@i];
- }
-
-set @menu, (select($@menu$))-1;
-
-query_sql "SELECT `id`,`price` FROM `donate_item_db` WHERE `name` = '"+$@name$[@menu]+"'", @id, @price$;
-query_sql "SELECT TRUNCATE("+@value$+" / "+@price$+",0)", @max;
-
-mes "[Donation Girl]";
-mes ""+$@name$[@menu]+"s cost $"+@price$+" each.";
-mes "How many "+$@name$[@menu]+"s would you like to claim?";
-mes "Maximum: "+@max+".";
-input @quantity;
-
-if(@quantity>@max) {
- mes "[Donation Girl]";
- mes "Sorry, but you do not have enough to claim "+@quantity+" "+$@name$[@menu]+"s.";
- next;
- goto L_CLAIM;
- }
-
-if(!@quantity) {
- mes "[Donation Girl]";
- mes "You can't have 0 as an amount!";
- next;
- goto L_CLAIM;
- }
-
-if (checkweight(@id,@quantity) == 0) {
- mes "[Donation Girl]";
- mes "I'm sorry, but you cannot carry "+@quantity+" "+$@name$[@menu]+"s.";
- next;
- goto L_CLAIM;
- }
-
-query_sql "SELECT "+@quantity+" * "+@price$+"", @total$;
-mes "Are you sure you want to claim "+@quantity+" "+$@name$[@menu]+"s for $"+@total$+"?";
-next;
-menu "No",L_CLAIM,"Yes",-;
-query_sql "UPDATE `donate` SET `claimed` = `claimed` + "+@total$+" WHERE `account_id` = '"+getcharid(3)+"'";
-getitem @id,@quantity;
-mes "[Donation Girl]";
-mes "Thankyou for donating! We hope you enjoy your gift!";
-close;
-
-L_STATS:
-mes "[Donation Girl]";
-query_sql "SELECT IFNULL((SELECT SUM(amount) FROM `donate`),0)", @total$;
-mes "Our fund is at a total of $"+@total$+"";
-next;
-menu "More info",L_INFO,"Make a claim",L_CHECK,"Statistics",L_STATS;
-close;
-
-L_GM:
-mes "[GM Menu]";
-mes "Hello GM!";
-mes "What would you like to do?";
-next;
-menu "Add/Remove Donation",L_GM2,"Add/Remove Items",L_ITEM,"Test Script",L_START;
-close;
-
-L_GM2:
-menu "Add a donation",L_DONATE,"Remove a donation",L_REMOVE,"View all donations",L_VIEWALL;
-close;
-
-L_ITEM:
-menu "Add an item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS,"Return to main menu",L_GM;
-close;
-
-
-L_NEWITEM:
-mes "[GM Menu]";
-mes "Please enter the item name:";
-input @itemname$;
-query_sql "SELECT `id` FROM `item_db` WHERE `name_english` = '"+escape_sql(@itemname$)+"'", @iid;
-query_sql "SELECT `id` FROM `donate_item_db` WHERE `name` = '"+escape_sql(@itemname$)+"'", @check;
-if(@iid==0) goto L_INONE;
-mes "[GM Menu]";
-mes "Please enter the cost of each "+@itemname$+":";
-input @cost$;
-query_sql "SELECT "+escape_sql(@cost$)+" = 0", @invalid;
-if(@invalid) goto L_ZERO;
-query_sql "SELECT CAST('"+escape_sql(@cost$)+"' AS DECIMAL)", @cost$;
-mes "[GM Menu]";
-mes "You have specified that donators can claim "+@itemname$+"s for $"+@cost$+" each.";
-mes "Would you like to continue?";
-next;
-menu "No",L_ITEM,"Yes",-;
-if(@check!=0) goto L_REPLACE;
-query_sql "INSERT INTO `donate_item_db` VALUES ('"+@iid+"', '"+escape_sql(@itemname$)+"', '"+@cost$+"')";
-mes "[GM Menu]";
-mes "Item added successfully!";
-next;
-menu "Add annother item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS;
-close;
-
-L_REPLACE:
-mes "[GM Menu]";
-mes "Item "+@itemname$+" already exists in the database.";
-mes "Would you like to replace it?";
-next;
-menu "No",L_ITEM,"Yes",-;
-query_sql "REPLACE INTO `donate_item_db` VALUES ('"+@iid+"', '"+@itemname$+"', '"+@cost$+"')";
-mes "[GM Menu]";
-mes "Item replaced successfully!";
-next;
-menu "Add annother item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS;
-close;
-
-L_INONE:
-mes "[GM Menu]";
-mes "Item "+@itemname$+" does not exist.";
-next;
-goto L_ITEM;
-
-L_DELITEM:
-mes "[GM Menu]";
-mes "Please enter the item name:";
-input @itemname$;
-query_sql "SELECT `id` FROM `donate_item_db` WHERE `name` = '"+escape_sql(@itemname$)+"'", @iid;
-if(@iid==0) goto L_INONE;
-next;
-mes "[GM Menu]";
-mes "You have specified to delete "+@itemname$+" from the database.";
-mes "Would you like to continue?";
-next;
-menu "No",L_ITEM,"Yes",-;
-query_sql "DELETE FROM `donate_item_db` WHERE `id` = '"+@iid+"'";
-mes "[GM Menu]";
-mes "Item deleted successfully!";
-next;
-menu "Add an item",L_NEWITEM,"Remove another item",L_DELITEM,"View all items",L_ALLITEMS;
-close;
-
-L_ALLITEMS:
-mes "[GM Menu]";
-query_sql "SELECT `name`,`price` FROM `donate_item_db` ORDER BY `name` ASC", @items$, @itemamount$;
-for(set @i, 0; @i < getarraysize(@items$); set @i, @i + 1){
- mes ""+@items$[@i]+" - $"+@itemamount$[@i]+"";
- }
-next;
-goto L_GM;
-
-L_DONATE:
-mes "[GM Menu]";
-mes "Please enter the donator's username:";
-input @donator$;
-query_sql "SELECT `account_id` FROM `login` WHERE `userid` = '"+escape_sql(@donator$)+"'", @aid;
-if(@aid==0) goto L_NONE;
-query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @donated$;
-query_sql "SELECT '"+@donated$+"' > 0", @donated;
-switch(@donated) {
- case 0:
- mes ""+@donator$+" has not donated before.";
- break;
- case 1:
- mes ""+@donator$+" has donated $"+@donated$+".";
- break;
- }
-next;
-mes "[GM Menu]";
-mes "Please enter the amount donated by "+@donator$+"";
-input @donating$;
-query_sql "SELECT "+escape_sql(@donating$)+" = 0", @invalid;
-if(@invalid) goto L_ZERO;
-query_sql "SELECT CAST('"+escape_sql(@donating$)+"' AS DECIMAL)", @donating$;
-mes "[GM Menu]";
-mes "You have specified that "+@donator$+" has donated $"+@donating$+".";
-mes "Would you like to continue?";
-next;
-menu "No",L_GM,"Yes",-;
-switch(@donated) {
- case 0:
- query_sql "INSERT INTO `donate` VALUES ('"+@aid+"', '"+@donating$+"', '0')";
- break;
- case 1:
- query_sql "UPDATE `donate` SET `amount` = `amount` + "+@donating$+" WHERE `account_id` = '"+@aid+"'";
- break;
- }
-query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @newdonated$;
-mes "[GM Menu]";
-mes "Donation added successfully!";
-mes ""+@donator$+" has donated a total of $"+@newdonated$+"";
-next;
-goto L_GM;
-
-L_ZERO:
-mes "[GM Menu]";
-mes "You can't have 0 as an amount!";
-next;
-goto L_GM;
-
-L_NONE:
-mes "[GM Menu]";
-mes "Account name "+@donator$+" does not exist.";
-next;
-goto L_GM;
-
-L_REMOVE:
-mes "[GM Menu]";
-mes "Please enter the donator's username:";
-input @donator$;
-query_sql "SELECT `account_id` FROM `login` WHERE `userid` = '"+escape_sql(@donator$)+"'", @aid;
-if(@aid==0) goto L_NONE;
-query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @donated$;
-query_sql "SELECT '"+@donated$+"' > 0", @donated;
-
-if(@donated==0) {
- query_sql "DELETE FROM `donate` WHERE `account_id` = '"+@aid+"'";
- mes ""+@donator$+" is not a donator and has been deleted from the donation database.";
- goto L_GM;
- }
-
-mes ""+@donator$+" has donated $"+@donated$+".";
-next;
-menu "Deduct an amount from "+@donator$+"",L_MINUS,"Remove "+@donator$+" from the donation database",L_DELETE;
-close;
-
-L_MINUS:
-mes "[GM Menu]";
-mes "Please enter the amount "+@donator$+" is to be deducted by:";
-input @deduct$;
-query_sql "SELECT "+escape_sql(@deduct$)+" = 0", @invalid;
-if(@invalid) goto L_ZERO;
-query_sql "SELECT CAST('"+escape_sql(@deduct$)+"' AS DECIMAL)", @deduct$;
-mes "[GM Menu]";
-mes "You have specified that "+@donator$+" is to be deducted by $"+@deduct$+".";
-mes "Would you like to continue?";
-next;
-menu "No",L_GM,"Yes",-;
-query_sql "UPDATE `donate` SET `amount` = `amount` - "+@deduct$+" WHERE `account_id` = '"+@aid+"'";
-query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @afterdeduct$;
-mes "[GM Menu]";
-mes "Donation deducted successfully!";
-mes ""+@donator$+" has donated a total of $"+@afterdeduct$+"";
-next;
-goto L_GM;
-
-L_DELETE:
-mes "[GM Menu]";
-mes "You have specified to remove "+@donator$+" from the donation database.";
-mes "Would you like to continue?";
-next;
-menu "No",L_GM,"Yes",-;
-query_sql "DELETE FROM `donate` WHERE `account_id` = '"+@aid+"'";
-mes "[GM Menu]";
-mes "Donator deleted successfully!";
-next;
-goto L_GM;
-
-L_VIEWALL:
-mes "[GM Menu]";
-query_sql "SELECT `account_id`,`amount` FROM `donate` ORDER BY `amount` DESC", @donatoraid, @donatedamount$;
-for(set @i, 0; @i < getarraysize(@donatoraid); set @i, @i + 1){
- query_sql "SELECT `userid` FROM `login` WHERE `account_id` = '"+@donatoraid[@i]+"'", @donateruserid$;
- for(set @j, 0; @j < getarraysize(@donateruserid$); set @j, @j + 1){
- mes ""+@donateruserid$[@j]+" - "+@donatedamount$[@i]+"";
- }
-}
-next;
-goto L_GM;
-
+//===== Athena Script =======================================
+//= Donation NPC
+//===== By ==================================================
+//= Josh
+//===== Version =============================================
+//= 1.0 - First release. Probably contains bugs/security
+//= risks
+//= 1.1 - Added a check for whether the account exists when
+//= adding a donator. Need to improve ordering when
+//= viewing all donations.
+//= 1.2 - Modified for public use. Added checkweight feature.
+//= 2.0 - Many changes, especially ones I had always wanted
+//= to add to this script. Includes reading items from
+//= a separate SQL table and more database manipulation
+//= options for GMs.
+//= 2.1 - Made few changes including the add/remove items
+//= feature.
+//= 3.0 - All strings inputed by a user and user/char names
+//= in SQL queries are now escaped. Each item has a
+//= price rather than a quantity. This script can work
+//= with decimals.
+//= 3.1 - Added quotes to some queries, fixed a variable and
+//= removed a comment.
+//= 3.2 - Fixed a problem where eAthena would crash if a
+//= query returned NULL.
+//= 3.3 - Optimized query speeds by combining a few select
+//= queries into one. Requires Trunk 7975.
+//===== Compatible With =====================================
+//= eAthena - any version that contains the new query_sql
+//= command (Trunk 7975).
+//===== Description =========================================
+//= A script that lets a player claim an item for donating.
+//= Allows a GM to input each donation.
+//===== Comments ============================================
+//= This script uses SQL tables to store variables for the
+//= amount donated by users and the items claimable.
+//===== Installation ========================================
+//= You must execute donate.sql and donate_item_db.sql before
+//= using this script.
+//===========================================================
+//= Thanks to Vich for helping me with the SQL syntax.
+//= Thanks to Lance for helping me with the the arrays and
+//= for implementing query_sql.
+//= Thanks to Skotlex for implementing escape_sql.
+//= Thanks to Toms for implementing the new multi-column
+//= query_sql command.
+//===========================================================
+
+prontera.gat,145,179,5 script Donation Girl 714,{
+
+if (getgmlevel() >= 80) goto L_GM;
+
+L_START:
+mes "[Donation Girl]";
+mes "Hello! I'm the Donation Girl!";
+mes "If you have made a donation,";
+mes "you are entitled to a reward!";
+next;
+menu "More info",-,"Make a claim",L_CHECK,"Statistics",L_STATS;
+L_INFO:
+mes "[Donation Girl]";
+mes "Each month, a lot of money is paid to keep this server running.";
+next;
+mes "[Donation Girl]";
+mes "You can support us by donating any amount of money.";
+next;
+mes "[Donation Girl]";
+mes "To show our appreciation, we will gladly give you a reward.";
+next;
+menu "Continue",L_START,"Cancel",-;
+close;
+
+L_CHECK:
+query_sql "SELECT `amount`,`claimed` FROM `donate` WHERE `account_id` = "+getcharid(3)+"", @amount$, @claimed$;
+query_sql "SELECT MIN(price) FROM `donate_item_db`", @min$;
+query_sql "SELECT '"+@amount$+"' - '"+@claimed$+"'", @value$;
+query_sql "SELECT '"+@value$+"' >= '"+@min$+"'", @enough;
+if(@enough) goto L_CLAIM;
+mes "[Donation Girl]";
+mes "Sorry, you do not have enough to make a claim.";
+mes "If you have donated but have not made a claim,";
+mes "Please give us time to process your donation.";
+close;
+
+L_CLAIM:
+mes "[Donation Girl]";
+mes "Thankyou for donating!";
+mes "You have $"+@value$+" worth of credit!";
+mes "Would you like to claim an item now?";
+next;
+menu "No",-,"Yes",L_YES;
+mes "[Donation Girl]";
+mes "Ok! You are able to collect your item(s) any time!";
+close;
+
+L_YES:
+mes "[Donation Girl]";
+mes "Very well. Which item would you like?";
+next;
+query_sql "SELECT `name` FROM `donate_item_db` ORDER BY `name` ASC",$@name$;
+set $@menu$, $@name$[0];
+ for(set $@i, 1; $@i < 127; set $@i, $@i + 1){
+ set $@menu$, $@menu$ + ":" + $@name$[$@i];
+ }
+
+set @menu, (select($@menu$))-1;
+
+query_sql "SELECT `id`,`price` FROM `donate_item_db` WHERE `name` = '"+$@name$[@menu]+"'", @id, @price$;
+query_sql "SELECT TRUNCATE("+@value$+" / "+@price$+",0)", @max;
+
+mes "[Donation Girl]";
+mes ""+$@name$[@menu]+"s cost $"+@price$+" each.";
+mes "How many "+$@name$[@menu]+"s would you like to claim?";
+mes "Maximum: "+@max+".";
+input @quantity;
+
+if(@quantity>@max) {
+ mes "[Donation Girl]";
+ mes "Sorry, but you do not have enough to claim "+@quantity+" "+$@name$[@menu]+"s.";
+ next;
+ goto L_CLAIM;
+ }
+
+if(!@quantity) {
+ mes "[Donation Girl]";
+ mes "You can't have 0 as an amount!";
+ next;
+ goto L_CLAIM;
+ }
+
+if (checkweight(@id,@quantity) == 0) {
+ mes "[Donation Girl]";
+ mes "I'm sorry, but you cannot carry "+@quantity+" "+$@name$[@menu]+"s.";
+ next;
+ goto L_CLAIM;
+ }
+
+query_sql "SELECT "+@quantity+" * "+@price$+"", @total$;
+mes "Are you sure you want to claim "+@quantity+" "+$@name$[@menu]+"s for $"+@total$+"?";
+next;
+menu "No",L_CLAIM,"Yes",-;
+query_sql "UPDATE `donate` SET `claimed` = `claimed` + "+@total$+" WHERE `account_id` = '"+getcharid(3)+"'";
+getitem @id,@quantity;
+mes "[Donation Girl]";
+mes "Thankyou for donating! We hope you enjoy your gift!";
+close;
+
+L_STATS:
+mes "[Donation Girl]";
+query_sql "SELECT IFNULL((SELECT SUM(amount) FROM `donate`),0)", @total$;
+mes "Our fund is at a total of $"+@total$+"";
+next;
+menu "More info",L_INFO,"Make a claim",L_CHECK,"Statistics",L_STATS;
+close;
+
+L_GM:
+mes "[GM Menu]";
+mes "Hello GM!";
+mes "What would you like to do?";
+next;
+menu "Add/Remove Donation",L_GM2,"Add/Remove Items",L_ITEM,"Test Script",L_START;
+close;
+
+L_GM2:
+menu "Add a donation",L_DONATE,"Remove a donation",L_REMOVE,"View all donations",L_VIEWALL;
+close;
+
+L_ITEM:
+menu "Add an item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS,"Return to main menu",L_GM;
+close;
+
+
+L_NEWITEM:
+mes "[GM Menu]";
+mes "Please enter the item name:";
+input @itemname$;
+query_sql "SELECT `id` FROM `item_db` WHERE `name_english` = '"+escape_sql(@itemname$)+"'", @iid;
+query_sql "SELECT `id` FROM `donate_item_db` WHERE `name` = '"+escape_sql(@itemname$)+"'", @check;
+if(@iid==0) goto L_INONE;
+mes "[GM Menu]";
+mes "Please enter the cost of each "+@itemname$+":";
+input @cost$;
+query_sql "SELECT "+escape_sql(@cost$)+" = 0", @invalid;
+if(@invalid) goto L_ZERO;
+query_sql "SELECT CAST('"+escape_sql(@cost$)+"' AS DECIMAL)", @cost$;
+mes "[GM Menu]";
+mes "You have specified that donators can claim "+@itemname$+"s for $"+@cost$+" each.";
+mes "Would you like to continue?";
+next;
+menu "No",L_ITEM,"Yes",-;
+if(@check!=0) goto L_REPLACE;
+query_sql "INSERT INTO `donate_item_db` VALUES ('"+@iid+"', '"+escape_sql(@itemname$)+"', '"+@cost$+"')";
+mes "[GM Menu]";
+mes "Item added successfully!";
+next;
+menu "Add annother item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS;
+close;
+
+L_REPLACE:
+mes "[GM Menu]";
+mes "Item "+@itemname$+" already exists in the database.";
+mes "Would you like to replace it?";
+next;
+menu "No",L_ITEM,"Yes",-;
+query_sql "REPLACE INTO `donate_item_db` VALUES ('"+@iid+"', '"+@itemname$+"', '"+@cost$+"')";
+mes "[GM Menu]";
+mes "Item replaced successfully!";
+next;
+menu "Add annother item",L_NEWITEM,"Remove an item",L_DELITEM,"View all items",L_ALLITEMS;
+close;
+
+L_INONE:
+mes "[GM Menu]";
+mes "Item "+@itemname$+" does not exist.";
+next;
+goto L_ITEM;
+
+L_DELITEM:
+mes "[GM Menu]";
+mes "Please enter the item name:";
+input @itemname$;
+query_sql "SELECT `id` FROM `donate_item_db` WHERE `name` = '"+escape_sql(@itemname$)+"'", @iid;
+if(@iid==0) goto L_INONE;
+next;
+mes "[GM Menu]";
+mes "You have specified to delete "+@itemname$+" from the database.";
+mes "Would you like to continue?";
+next;
+menu "No",L_ITEM,"Yes",-;
+query_sql "DELETE FROM `donate_item_db` WHERE `id` = '"+@iid+"'";
+mes "[GM Menu]";
+mes "Item deleted successfully!";
+next;
+menu "Add an item",L_NEWITEM,"Remove another item",L_DELITEM,"View all items",L_ALLITEMS;
+close;
+
+L_ALLITEMS:
+mes "[GM Menu]";
+query_sql "SELECT `name`,`price` FROM `donate_item_db` ORDER BY `name` ASC", @items$, @itemamount$;
+for(set @i, 0; @i < getarraysize(@items$); set @i, @i + 1){
+ mes ""+@items$[@i]+" - $"+@itemamount$[@i]+"";
+ }
+next;
+goto L_GM;
+
+L_DONATE:
+mes "[GM Menu]";
+mes "Please enter the donator's username:";
+input @donator$;
+query_sql "SELECT `account_id` FROM `login` WHERE `userid` = '"+escape_sql(@donator$)+"'", @aid;
+if(@aid==0) goto L_NONE;
+query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @donated$;
+query_sql "SELECT '"+@donated$+"' > 0", @donated;
+switch(@donated) {
+ case 0:
+ mes ""+@donator$+" has not donated before.";
+ break;
+ case 1:
+ mes ""+@donator$+" has donated $"+@donated$+".";
+ break;
+ }
+next;
+mes "[GM Menu]";
+mes "Please enter the amount donated by "+@donator$+"";
+input @donating$;
+query_sql "SELECT "+escape_sql(@donating$)+" = 0", @invalid;
+if(@invalid) goto L_ZERO;
+query_sql "SELECT CAST('"+escape_sql(@donating$)+"' AS DECIMAL)", @donating$;
+mes "[GM Menu]";
+mes "You have specified that "+@donator$+" has donated $"+@donating$+".";
+mes "Would you like to continue?";
+next;
+menu "No",L_GM,"Yes",-;
+switch(@donated) {
+ case 0:
+ query_sql "INSERT INTO `donate` VALUES ('"+@aid+"', '"+@donating$+"', '0')";
+ break;
+ case 1:
+ query_sql "UPDATE `donate` SET `amount` = `amount` + "+@donating$+" WHERE `account_id` = '"+@aid+"'";
+ break;
+ }
+query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @newdonated$;
+mes "[GM Menu]";
+mes "Donation added successfully!";
+mes ""+@donator$+" has donated a total of $"+@newdonated$+"";
+next;
+goto L_GM;
+
+L_ZERO:
+mes "[GM Menu]";
+mes "You can't have 0 as an amount!";
+next;
+goto L_GM;
+
+L_NONE:
+mes "[GM Menu]";
+mes "Account name "+@donator$+" does not exist.";
+next;
+goto L_GM;
+
+L_REMOVE:
+mes "[GM Menu]";
+mes "Please enter the donator's username:";
+input @donator$;
+query_sql "SELECT `account_id` FROM `login` WHERE `userid` = '"+escape_sql(@donator$)+"'", @aid;
+if(@aid==0) goto L_NONE;
+query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @donated$;
+query_sql "SELECT '"+@donated$+"' > 0", @donated;
+
+if(@donated==0) {
+ query_sql "DELETE FROM `donate` WHERE `account_id` = '"+@aid+"'";
+ mes ""+@donator$+" is not a donator and has been deleted from the donation database.";
+ goto L_GM;
+ }
+
+mes ""+@donator$+" has donated $"+@donated$+".";
+next;
+menu "Deduct an amount from "+@donator$+"",L_MINUS,"Remove "+@donator$+" from the donation database",L_DELETE;
+close;
+
+L_MINUS:
+mes "[GM Menu]";
+mes "Please enter the amount "+@donator$+" is to be deducted by:";
+input @deduct$;
+query_sql "SELECT "+escape_sql(@deduct$)+" = 0", @invalid;
+if(@invalid) goto L_ZERO;
+query_sql "SELECT CAST('"+escape_sql(@deduct$)+"' AS DECIMAL)", @deduct$;
+mes "[GM Menu]";
+mes "You have specified that "+@donator$+" is to be deducted by $"+@deduct$+".";
+mes "Would you like to continue?";
+next;
+menu "No",L_GM,"Yes",-;
+query_sql "UPDATE `donate` SET `amount` = `amount` - "+@deduct$+" WHERE `account_id` = '"+@aid+"'";
+query_sql "SELECT `amount` FROM `donate` WHERE `account_id` = "+@aid+"", @afterdeduct$;
+mes "[GM Menu]";
+mes "Donation deducted successfully!";
+mes ""+@donator$+" has donated a total of $"+@afterdeduct$+"";
+next;
+goto L_GM;
+
+L_DELETE:
+mes "[GM Menu]";
+mes "You have specified to remove "+@donator$+" from the donation database.";
+mes "Would you like to continue?";
+next;
+menu "No",L_GM,"Yes",-;
+query_sql "DELETE FROM `donate` WHERE `account_id` = '"+@aid+"'";
+mes "[GM Menu]";
+mes "Donator deleted successfully!";
+next;
+goto L_GM;
+
+L_VIEWALL:
+mes "[GM Menu]";
+query_sql "SELECT `account_id`,`amount` FROM `donate` ORDER BY `amount` DESC", @donatoraid, @donatedamount$;
+for(set @i, 0; @i < getarraysize(@donatoraid); set @i, @i + 1){
+ query_sql "SELECT `userid` FROM `login` WHERE `account_id` = '"+@donatoraid[@i]+"'", @donateruserid$;
+ for(set @j, 0; @j < getarraysize(@donateruserid$); set @j, @j + 1){
+ mes ""+@donateruserid$[@j]+" - "+@donatedamount$[@i]+"";
+ }
+}
+next;
+goto L_GM;
+
} \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/Kafra_Express_files.conf b/npc/custom/eAAC_Scripts/Kafra_Express_files.conf
index 11e9fd23c..2244e8eb4 100644
--- a/npc/custom/eAAC_Scripts/Kafra_Express_files.conf
+++ b/npc/custom/eAAC_Scripts/Kafra_Express_files.conf
@@ -1,33 +1,33 @@
-//|-----------------------------------------------------------------|
-//|- English Athena Approved Certified Script: Kafra Express Set -|
-//|-----------------------------------------------------------------|
-//| Under this is the global_functions.txt needed for this set to work.
-//| Note that if you enable this, you will have to go to the scripts_main.conf
-//| and disable the original one.
-npc: npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt
-//|
-//| The configuration file.
-npc: npc/custom/eAAC_Scripts/kafraExpress/config.txt
-
-//| The files for this npc.
-
-npc: npc/custom/eAAC_Scripts/kafraExpress/kafras.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_rent.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_shop.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt
-npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt
-
-//| For more info referring this script, open the provided readme.txt in this folder.
+//|-----------------------------------------------------------------|
+//|- English Athena Approved Certified Script: Kafra Express Set -|
+//|-----------------------------------------------------------------|
+//| Under this is the global_functions.txt needed for this set to work.
+//| Note that if you enable this, you will have to go to the scripts_main.conf
+//| and disable the original one.
+npc: npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt
+//|
+//| The configuration file.
+npc: npc/custom/eAAC_Scripts/kafraExpress/config.txt
+
+//| The files for this npc.
+
+npc: npc/custom/eAAC_Scripts/kafraExpress/kafras.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_rent.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_shop.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt
+npc: npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt
+
+//| For more info referring this script, open the provided readme.txt in this folder.
//| Copyright © 2004 - 2006 Skotlex. All Rights Reserved for him (this is almost a trademark =X) \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/banker.txt b/npc/custom/eAAC_Scripts/banker.txt
index 7e0ac7584..ee98775de 100644
--- a/npc/custom/eAAC_Scripts/banker.txt
+++ b/npc/custom/eAAC_Scripts/banker.txt
@@ -1,461 +1,461 @@
-//| ~~~~~~~~~~~ Information ~~~~~~~~~~~
-//| | This is a simple banking npc, |
-//| | which uses coins to store zeny |
-//| | instead of using those global |
-//| | variables :P |
-//| | |
-//| | It's fully customizable, you |
-//| | can exchange the coin ID used |
-//| | at will, it won't affect the |
-//| | script whatsoever =3 |
-//| | |
-//| | The prices can also be set, the |
-//| | way you like the most, as they |
-//| | won't affect the script either |
-//| | |
-//| | No db/client files modification |
-//| | needed, just "Plug&Play" ;P |
-//| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-//| Revision:
-//| v.1.0: Released script. No problems or bugs found, at least :P
-//| It's your duty to find them now if there are.
-//| @minvalue must contain the coin price of the lowest coin value
-//| in order for the script to work correctly. By default it's set
-//| to the bronze coin
-
-//| Revision:
-//| v.2.0: Added a Mix option in the Zeny to Coin function,
-//| where it allows you to split your desired Zeny into
-//| the coins you wish to obtain, without having to go
-//| through the other functions to obtain them all. That way
-//| you can get them all at once ;3
-//|
-//| It also displays the total zeny being exchanged,
-//| the total coins obtained and the difference between
-//| the amount of zeny you've inputted and the sum of
-//| the coin's values.
-
-//| Revision:
-//| v.2.5: Replaced all the coin names with a variable that has
-//| getitemname(<coin_id), for more customization of the script.
-//|
-//| Fixed aswell a 0 at the mixing function, it had an unexistant
-//| variable plus it was rendering a message to 0. Pretty bad =/
-//|
-//| The implementation of the getitemname was because some people
-//| complaining that those items seemed to be wrong, that the name
-//| in the db was Platinum while the script had Silver, so well,
-//| there you have it. No more silver coins, thanks to you :)
-
-//| Revision:
-//| v.2.6: Added another Weight check to prevent coins from dropping
-//| to the ground because A) Too many coins (more than 30,000 ea)
-//| B) Your current weight + total coins weight were greater than
-//| your max weight, causing them to drop due to "over-weight".
-//| Thanks to Niktout for spotting it.
-
-//| Revision:
-//| v.2.7: Added a check to the Zeny -> Coin Mix label. It seems you
-//| can trade with negative zeny (meh...). This should prevent it.
-//| Thanks to Niktout.
-
-//| Revision:
-//| v.2.8: Added a n00b check for the Zeny -> Coin function. Should
-//| prevent zeny overflow. Also added a variable cleaning section
-//| at the beginning of the Mix function, to prevent old values
-//| to be used as a payout.
-
-//| Upcomming possible updates:
-//| v.3.0: Adding a refining system, so you can gather ore and the likes
-//| to make your own coins. They will have a failure chance
-//| of course. You will need, for now: 10 ores of the type of
-//| coin you wish, a mini furnace, an anvil depending on what
-//| You're crafting, and a hammer according to it.
-
-//| Copyright © 2006 erKURITA. All Rights Reserved
-
-prontera.gat,155,188,3 script Zacariath Madhat 872,{
-
-//|~~~~~~~~~ Settings of the NPC: ~~~~~~~~~~~~~~~~~
-set @npcname$,"^999999[Zach]^000000"; //|
-set @bronzeprice,10000; //|
-set @silverprice,100000; //|
-set @goldprice,1000000; //|
-set @mithrilprice,10000000; //|
-set @bronzecoinid,673; //|
-set @silvercoinid,677; //|
-set @goldcoinid,671; //|
-set @mithrilcoinid,674; //|
-set @minvalue,@bronzeprice; //|
-set @name1$,getitemname(@bronzecoinid); //|
-set @name2$,getitemname(@silvercoinid); //|
-set @name3$,getitemname(@goldcoinid); //|
-set @name4$,getitemname(@mithrilcoinid); //|
-set @MAX_ZENY,1000000000; //|
-//|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-mes @npcname$;
-mes "Hi "+strcharinfo(0)+", I'm this town's banker";
-mes "I can allow you to exchange your zeny into useful and handy coins, which you can use to make trades between players, or just save them";
-next;
-mes @npcname$;
-mes "^996600"+@name1$+"s^000000 are worth "+@bronzeprice+"z, ^999999"+@name2$+"s^000000 are worth "+@silverprice+"z, ^FFCC00"+@name3$+"s^000000 "+@goldprice+"z, ^CCCCCC"+@name4$+"s^000000 are worth "+@mithrilprice+"z";
-next;
-goto L_Menu;
-
-L_Menu:
-mes @npcname$;
-mes "What do you want to do then?";
-menu "Exchange my coins into zeny",L_CoinZeny,"Exchange my zeny into coins",L_ZenyCoin,"Nothing for now, sorry",L_End;
-
-//| Here starts the Coin to Zeny Exchange
-
-L_CoinZeny:
-
- next;
- mes @npcname$;
- mes "First than anything, what kind of coins are you going to exchange?";
- menu @name1$+"s",L_Bronze,@name2$+"s",L_Silver,@name3$+"s",L_Gold,@name4$+"s",L_Mithril,"None for now",L_Menu;
-
-
- L_Bronze:
- callsub L_Coincheckout,@bronzecoinid,@bronzeprice;
- goto L_CoinZeny;
-
- L_Silver:
- callsub L_Coincheckout,@silvercoinid,@silverprice;
- goto L_CoinZeny;
-
- L_Gold:
- callsub L_Coincheckout,@goldcoinid,@goldprice;
- goto L_CoinZeny;
-
- L_Mithril:
- callsub L_Coincheckout,@mithrilcoinid,@mithrilprice;
- goto L_CoinZeny;
-
-L_Coincheckout:
-
-switch(getarg(0)) {
- case @bronzecoinid:
- set @coinname$,"^996600"+getitemname(getarg(0))+"^000000";
- break;
- case @silvercoinid:
- set @coinname$,"^999999"+getitemname(getarg(0))+"^000000";
- break;
- case @goldcoinid:
- set @coinname$,"^FFCC00"+getitemname(getarg(0))+"^000000";
- break;
- case @mithrilcoinid:
- set @coinname$,"^CCCCCC"+getitemname(getarg(0))+"^000000";
- break;
- }
-
-
-L_PreInputing:
-next;
- mes @npcname$;
- mes "Let's see, how many coins do you want to exchange?";
- next;
- goto L_Inputing;
-
- L_Inputing:
- input @coinamount;
-
- if (@coinamount == 0) {
- mes @npcname$;
- mes "You didn't input any amount, please retry";
- next;
- goto L_Inputing;
- } else if (countitem(getarg(0)) < @coinamount) {
- mes @npcname$;
- mes "You don't have enough coins, please get some";
- next;
- goto L_Menu;
- } else if (@coinamount*getarg(1) > @MAX_ZENY) {
- mes @npcname$;
- mes "I'm sorry, the quantity you inputted gives a bigger zeny amount than the max allowed. I can't allow this.";
- next;
- goto L_Menu
- } else
-
- next;
- mes @npcname$;
- mes "So, you want to exchange "+@coinamount+" "+@coinname$+" ?";
- menu "Yes, I want to exchange this much",L_Proceed,"No, I want to exchange something else",L_CoinZeny,"No, I want to input another number",L_Inputing,"No, I dont want to exchange anything",L_Menu;
-
- L_Proceed:
- next;
- set @price,getarg(1)*@coinamount;
- set Zeny,Zeny+@price;
- delitem getarg(0),@coinamount;
- mes @npcname$;
- mes "There we go, here's your money";
- next;
- return;
-
-//| Here starts the Zeny to Coin exchange.
-
-L_ZenyCoin:
- next;
- if (MaxWeight*50/100 < Weight) {
- if (MaxWeight*90/100 < Weight) {
- mes @npcname$;
- mes "Sorry but you have more than 90% weight. Your coins might drop. I can't give you anything.";
- next;
- goto L_Menu;
- } else
- mes @npcname$;
- mes "You have 50% or more weight, do you still want to continue?";
- menu "Yes",L_ContinueZenyCoin,"No, thanks",L_Menu;
- }
-L_ContinueZenyCoin:
- mes @npcname$;
- mes "First, how much zeny do you want to exchange";
- callsub L_Inputingzeny;
- callsub L_Zenycoins;
- next;
- mes @npcname$;
- mes "You can have, with "+@zenyamount+":";
- mes "^996600"+@bronzezeny+"^000000 "+@name1$+"s";
- mes "^999999"+@silverzeny+"^000000 "+@name2$+"s";
- mes "^FFCC00"+@goldzeny+"^000000 "+@name3$+"s";
- mes "or";
- mes "^CCCCCC"+@mithrilzeny+"^000000 "+@name4$+"s";
- next;
- if (@zenyamount < @minvalue) goto L_Moremoney;
- goto L_ZenyCoin2;
-
- L_ZenyCoin2:
- mes @npcname$;
- mes "Which coins do you want? Or do you want a mix of them?";
- menu "I want the "+@name1$+"s",L_Bronzes,"I want the "+@name2$+"s",L_Silvers,"I want the "+@name3$+"s",L_Golds,"I want the "+@name4$+"s",L_Mithrils,"I want a mix of them",L_Mix,"Nothing for now, sorry",L_Menu;
-
- L_Bronzes:
- if (@bronzezeny == 0) goto L_Moremoney;
- callsub L_Zenycheckout,@bronzecoinid,@bronzeprice,@bronzezeny;
- goto L_Menu;
-
- L_Silvers:
- if (@silverzeny == 0) goto L_Moremoney;
- callsub L_Zenycheckout,@silvercoinid,@silverprice,@silverzeny;
- goto L_Menu;
-
- L_Golds:
- if (@goldzeny == 0) goto L_Moremoney;
- callsub L_Zenycheckout,@goldcoinid,@goldprice,@goldzeny;
- goto L_Menu;
-
- L_Mithrils:
- if (@mithrilzeny == 0) goto L_Moremoney;
- callsub L_Zenycheckout,@mithrilcoinid,@mithrilprice,@mithrilzeny;
- goto L_Menu;
-
-L_Zenycheckout:
- next;
- if (((getiteminfo(getarg(0),6))*getarg(2)) > (MaxWeight-Weight)) {
- mes @npcname$;
- mes "Sorry, your max weight does not allow me to give you this much of zeny coins";
- mes "Either choose another type of coins or a lower quantity, thanks";
- close;
- }
- if (getarg(2) > 30000) {
- mes @npcname$;
- mes "Sorry, I can't give you more than 30,000 ea";
- mes "Pick another coin type";
- close;
- }
- set @itemid,getarg(0);
- set @pricea,getarg(1)*getarg(2);
- getitem @itemid,getarg(2);
- set Zeny,Zeny-@pricea;
- mes @npcname$;
- mes "There you go, here's your coins";
- next;
- return;
-
-L_Zenycoins:
- set @bronzezeny,@zenyamount/@bronzeprice;
- set @silverzeny,@zenyamount/@silverprice;
- set @goldzeny,@zenyamount/@goldprice;
- set @mithrilzeny,@zenyamount/@mithrilprice;
- return;
-
-L_Inputingzeny:
-
- input @zenyamount;
- if (Zeny == 0) {
- mes @npcname$;
- mes "You don't have any Zeny left. I can't do anything. Get some Zeny first";
- next;
- goto L_Menu;
- } else if (@zenyamount == 0) {
- mes @npcname$;
- mes "You didn't input any amount, please retry";
- next;
- goto L_Inputingzeny;
- } else if (@zenyamount > Zeny) {
- mes @npcname$;
- mes "The inputted zeny amount is bigger than your actual zeny amount";
- mes "Please re-entry another amount";
- next;
- goto L_Inputingzeny;
-
- } else return;
-
-//| Other labels
-
-L_Moremoney:
- mes @npcname$;
- mes "You need to get more zeny, I can't give you anything with "+@zenyamount+"z, sorry";
- next;
- goto L_Menu;
-
-L_End:
- next;
- mes @npcname$;
- mes "Good to see you and hope to see you again. Bye";
- close;
-
-
-//| Mix function
-
-L_Mix:
- set @totalzeny,0;
- set @totalcoins,0;
- set @bronzecoins,0;
- set @silvercoins,0;
- set @goldcoins,0;
- set @mithrilcoins,0;
- next;
- mes @npcname$;
- mes "Ok, let's start with ^996600"+@name1$+"s^000000";
- next;
- mes @npcname$;
- mes "How many coins do you want?";
- input @bronzecoins;
- next;
- set @totalzeny,@bronzecoins*@bronzeprice;
- set @totalcoins,@bronzecoins;
- mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
- mes "Coins:";
- mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
- mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
- if (@totalzeny > @zenyamount || @totalzeny < 0) {
- mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- goto L_Overzeny;
- } else
- mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- next;
- if (@totalzeny > @zenyamount || @totalzeny < 0)
- mes @npcname$;
- mes "Is this enough or do you want more?";
- menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
- next;
- mes @npcname$;
- mes "Now ^999999"+@name2$+"s^000000. How many coins do you want?";
- next;
- input @silvercoins;
- next;
- set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice;
- set @totalcoins,@bronzecoins+@silvercoins;
- mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
- mes "Coins:";
- mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
- mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
- mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
- if (@totalzeny > @zenyamount || @totalzeny < 0) {
- mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- goto L_Overzeny;
- } else
- mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- next;
- if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
- mes @npcname$;
- mes "Is this enough or do you want more?";
- menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
- next;
- mes @npcname$;
- mes "Now ^FFCC00"+@name3$+"s^000000. How many coins do you want?";
- input @goldcoins;
- next;
- set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice+@goldcoins*@goldprice;
- set @totalcoins,@bronzecoins+@silvercoins+@goldcoins;
- mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
- mes "Coins:";
- mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
- mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
- mes " ^FFCC00"+@name3$+"s^000000: "+@goldcoins+" ^CC0000"+@goldcoins*@goldprice+"^000000";
- mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
- if (@totalzeny > @zenyamount || @totalzeny < 0) {
- mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- goto L_Overzeny;
- } else
- mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- next;
- if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
- mes @npcname$;
- mes "Is this enough or do you want more?";
- menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
- next;
- mes @npcname$;
- mes "Now ^CCCCCC"+@name4$+"s^000000. How many coins do you want?";
- input @mithrilcoins;
- next;
- set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice+@goldcoins*@goldprice+@mithrilcoins*@mithrilprice;
- set @totalcoins,@bronzecoins+@silvercoins+@goldcoins+@mithrilcoins;
- mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
- mes "Coins:";
- mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
- mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
- mes " ^FFCC00"+@name3$+"s^000000: "+@goldcoins+" ^CC0000"+@goldcoins*@goldprice+"^000000";
- mes " ^CCCCCC"+@name4$+"s^000000: "+@mithrilcoins+" ^CC0000"+@mithrilcoins*@mithrilprice+"^000000";
- mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
- if (@totalzeny > @zenyamount || @totalzeny < 0) {
- mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- goto L_Overzeny;
- } else
- mes "TOTAL: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
- mes "Zeny Left: "+(@zenyamount-@totalzeny);
- next;
- if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
- mes @npcname$;
- mes "Is this ok?: "+@bronzecoins+" "+@name1$+"s, "+@silvercoins+" "+@name2$+"s, "+@goldcoins+" "+@name3$+"s, "+@mithrilcoins+" "+@name4$+"s, for a total amount of "+@totalzeny;
- menu "Yes, it's ok",L_Payoff,"No, I want to re-intro them",L_Mix,"Sorry, I dont want anything",L_Menu;
-
-L_Payoff:
- next;
- if (@zenyamount > Zeny) goto L_Overzeny;
- set Zeny,Zeny-@totalzeny;
- getitem @bronzecoinid,@bronzecoins;
- getitem @silvercoinid,@silvercoins;
- getitem @goldcoinid,@goldcoins;
- getitem @mithrilcoinid,@mithrilcoins;
- mes @npcname$;
- mes "There you go, here's your coins";
- next;
- set @bronzecoins,0;
- set @silvercoins,0;
- set @goldcoins,0;
- set @mithrilcoins,0;
- goto L_End;
-
-L_Overzeny:
- next;
- mes @npcname$;
- mes "Sorry, I can't do anything else. Either the sum of all the coins you inputted is bigger than the zeny amount inputted, or the inputted amout of zeny is bigger that your total Zeny. Please retry.";
- next;
- goto L_Menu;
-
-OnInit:
-setitemscript 671,"{}";
-end;
+//| ~~~~~~~~~~~ Information ~~~~~~~~~~~
+//| | This is a simple banking npc, |
+//| | which uses coins to store zeny |
+//| | instead of using those global |
+//| | variables :P |
+//| | |
+//| | It's fully customizable, you |
+//| | can exchange the coin ID used |
+//| | at will, it won't affect the |
+//| | script whatsoever =3 |
+//| | |
+//| | The prices can also be set, the |
+//| | way you like the most, as they |
+//| | won't affect the script either |
+//| | |
+//| | No db/client files modification |
+//| | needed, just "Plug&Play" ;P |
+//| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+//| Revision:
+//| v.1.0: Released script. No problems or bugs found, at least :P
+//| It's your duty to find them now if there are.
+//| @minvalue must contain the coin price of the lowest coin value
+//| in order for the script to work correctly. By default it's set
+//| to the bronze coin
+
+//| Revision:
+//| v.2.0: Added a Mix option in the Zeny to Coin function,
+//| where it allows you to split your desired Zeny into
+//| the coins you wish to obtain, without having to go
+//| through the other functions to obtain them all. That way
+//| you can get them all at once ;3
+//|
+//| It also displays the total zeny being exchanged,
+//| the total coins obtained and the difference between
+//| the amount of zeny you've inputted and the sum of
+//| the coin's values.
+
+//| Revision:
+//| v.2.5: Replaced all the coin names with a variable that has
+//| getitemname(<coin_id), for more customization of the script.
+//|
+//| Fixed aswell a 0 at the mixing function, it had an unexistant
+//| variable plus it was rendering a message to 0. Pretty bad =/
+//|
+//| The implementation of the getitemname was because some people
+//| complaining that those items seemed to be wrong, that the name
+//| in the db was Platinum while the script had Silver, so well,
+//| there you have it. No more silver coins, thanks to you :)
+
+//| Revision:
+//| v.2.6: Added another Weight check to prevent coins from dropping
+//| to the ground because A) Too many coins (more than 30,000 ea)
+//| B) Your current weight + total coins weight were greater than
+//| your max weight, causing them to drop due to "over-weight".
+//| Thanks to Niktout for spotting it.
+
+//| Revision:
+//| v.2.7: Added a check to the Zeny -> Coin Mix label. It seems you
+//| can trade with negative zeny (meh...). This should prevent it.
+//| Thanks to Niktout.
+
+//| Revision:
+//| v.2.8: Added a n00b check for the Zeny -> Coin function. Should
+//| prevent zeny overflow. Also added a variable cleaning section
+//| at the beginning of the Mix function, to prevent old values
+//| to be used as a payout.
+
+//| Upcomming possible updates:
+//| v.3.0: Adding a refining system, so you can gather ore and the likes
+//| to make your own coins. They will have a failure chance
+//| of course. You will need, for now: 10 ores of the type of
+//| coin you wish, a mini furnace, an anvil depending on what
+//| You're crafting, and a hammer according to it.
+
+//| Copyright © 2006 erKURITA. All Rights Reserved
+
+prontera.gat,155,188,3 script Zacariath Madhat 872,{
+
+//|~~~~~~~~~ Settings of the NPC: ~~~~~~~~~~~~~~~~~
+set @npcname$,"^999999[Zach]^000000"; //|
+set @bronzeprice,10000; //|
+set @silverprice,100000; //|
+set @goldprice,1000000; //|
+set @mithrilprice,10000000; //|
+set @bronzecoinid,673; //|
+set @silvercoinid,677; //|
+set @goldcoinid,671; //|
+set @mithrilcoinid,674; //|
+set @minvalue,@bronzeprice; //|
+set @name1$,getitemname(@bronzecoinid); //|
+set @name2$,getitemname(@silvercoinid); //|
+set @name3$,getitemname(@goldcoinid); //|
+set @name4$,getitemname(@mithrilcoinid); //|
+set @MAX_ZENY,1000000000; //|
+//|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+mes @npcname$;
+mes "Hi "+strcharinfo(0)+", I'm this town's banker";
+mes "I can allow you to exchange your zeny into useful and handy coins, which you can use to make trades between players, or just save them";
+next;
+mes @npcname$;
+mes "^996600"+@name1$+"s^000000 are worth "+@bronzeprice+"z, ^999999"+@name2$+"s^000000 are worth "+@silverprice+"z, ^FFCC00"+@name3$+"s^000000 "+@goldprice+"z, ^CCCCCC"+@name4$+"s^000000 are worth "+@mithrilprice+"z";
+next;
+goto L_Menu;
+
+L_Menu:
+mes @npcname$;
+mes "What do you want to do then?";
+menu "Exchange my coins into zeny",L_CoinZeny,"Exchange my zeny into coins",L_ZenyCoin,"Nothing for now, sorry",L_End;
+
+//| Here starts the Coin to Zeny Exchange
+
+L_CoinZeny:
+
+ next;
+ mes @npcname$;
+ mes "First than anything, what kind of coins are you going to exchange?";
+ menu @name1$+"s",L_Bronze,@name2$+"s",L_Silver,@name3$+"s",L_Gold,@name4$+"s",L_Mithril,"None for now",L_Menu;
+
+
+ L_Bronze:
+ callsub L_Coincheckout,@bronzecoinid,@bronzeprice;
+ goto L_CoinZeny;
+
+ L_Silver:
+ callsub L_Coincheckout,@silvercoinid,@silverprice;
+ goto L_CoinZeny;
+
+ L_Gold:
+ callsub L_Coincheckout,@goldcoinid,@goldprice;
+ goto L_CoinZeny;
+
+ L_Mithril:
+ callsub L_Coincheckout,@mithrilcoinid,@mithrilprice;
+ goto L_CoinZeny;
+
+L_Coincheckout:
+
+switch(getarg(0)) {
+ case @bronzecoinid:
+ set @coinname$,"^996600"+getitemname(getarg(0))+"^000000";
+ break;
+ case @silvercoinid:
+ set @coinname$,"^999999"+getitemname(getarg(0))+"^000000";
+ break;
+ case @goldcoinid:
+ set @coinname$,"^FFCC00"+getitemname(getarg(0))+"^000000";
+ break;
+ case @mithrilcoinid:
+ set @coinname$,"^CCCCCC"+getitemname(getarg(0))+"^000000";
+ break;
+ }
+
+
+L_PreInputing:
+next;
+ mes @npcname$;
+ mes "Let's see, how many coins do you want to exchange?";
+ next;
+ goto L_Inputing;
+
+ L_Inputing:
+ input @coinamount;
+
+ if (@coinamount == 0) {
+ mes @npcname$;
+ mes "You didn't input any amount, please retry";
+ next;
+ goto L_Inputing;
+ } else if (countitem(getarg(0)) < @coinamount) {
+ mes @npcname$;
+ mes "You don't have enough coins, please get some";
+ next;
+ goto L_Menu;
+ } else if (@coinamount*getarg(1) > @MAX_ZENY) {
+ mes @npcname$;
+ mes "I'm sorry, the quantity you inputted gives a bigger zeny amount than the max allowed. I can't allow this.";
+ next;
+ goto L_Menu
+ } else
+
+ next;
+ mes @npcname$;
+ mes "So, you want to exchange "+@coinamount+" "+@coinname$+" ?";
+ menu "Yes, I want to exchange this much",L_Proceed,"No, I want to exchange something else",L_CoinZeny,"No, I want to input another number",L_Inputing,"No, I dont want to exchange anything",L_Menu;
+
+ L_Proceed:
+ next;
+ set @price,getarg(1)*@coinamount;
+ set Zeny,Zeny+@price;
+ delitem getarg(0),@coinamount;
+ mes @npcname$;
+ mes "There we go, here's your money";
+ next;
+ return;
+
+//| Here starts the Zeny to Coin exchange.
+
+L_ZenyCoin:
+ next;
+ if (MaxWeight*50/100 < Weight) {
+ if (MaxWeight*90/100 < Weight) {
+ mes @npcname$;
+ mes "Sorry but you have more than 90% weight. Your coins might drop. I can't give you anything.";
+ next;
+ goto L_Menu;
+ } else
+ mes @npcname$;
+ mes "You have 50% or more weight, do you still want to continue?";
+ menu "Yes",L_ContinueZenyCoin,"No, thanks",L_Menu;
+ }
+L_ContinueZenyCoin:
+ mes @npcname$;
+ mes "First, how much zeny do you want to exchange";
+ callsub L_Inputingzeny;
+ callsub L_Zenycoins;
+ next;
+ mes @npcname$;
+ mes "You can have, with "+@zenyamount+":";
+ mes "^996600"+@bronzezeny+"^000000 "+@name1$+"s";
+ mes "^999999"+@silverzeny+"^000000 "+@name2$+"s";
+ mes "^FFCC00"+@goldzeny+"^000000 "+@name3$+"s";
+ mes "or";
+ mes "^CCCCCC"+@mithrilzeny+"^000000 "+@name4$+"s";
+ next;
+ if (@zenyamount < @minvalue) goto L_Moremoney;
+ goto L_ZenyCoin2;
+
+ L_ZenyCoin2:
+ mes @npcname$;
+ mes "Which coins do you want? Or do you want a mix of them?";
+ menu "I want the "+@name1$+"s",L_Bronzes,"I want the "+@name2$+"s",L_Silvers,"I want the "+@name3$+"s",L_Golds,"I want the "+@name4$+"s",L_Mithrils,"I want a mix of them",L_Mix,"Nothing for now, sorry",L_Menu;
+
+ L_Bronzes:
+ if (@bronzezeny == 0) goto L_Moremoney;
+ callsub L_Zenycheckout,@bronzecoinid,@bronzeprice,@bronzezeny;
+ goto L_Menu;
+
+ L_Silvers:
+ if (@silverzeny == 0) goto L_Moremoney;
+ callsub L_Zenycheckout,@silvercoinid,@silverprice,@silverzeny;
+ goto L_Menu;
+
+ L_Golds:
+ if (@goldzeny == 0) goto L_Moremoney;
+ callsub L_Zenycheckout,@goldcoinid,@goldprice,@goldzeny;
+ goto L_Menu;
+
+ L_Mithrils:
+ if (@mithrilzeny == 0) goto L_Moremoney;
+ callsub L_Zenycheckout,@mithrilcoinid,@mithrilprice,@mithrilzeny;
+ goto L_Menu;
+
+L_Zenycheckout:
+ next;
+ if (((getiteminfo(getarg(0),6))*getarg(2)) > (MaxWeight-Weight)) {
+ mes @npcname$;
+ mes "Sorry, your max weight does not allow me to give you this much of zeny coins";
+ mes "Either choose another type of coins or a lower quantity, thanks";
+ close;
+ }
+ if (getarg(2) > 30000) {
+ mes @npcname$;
+ mes "Sorry, I can't give you more than 30,000 ea";
+ mes "Pick another coin type";
+ close;
+ }
+ set @itemid,getarg(0);
+ set @pricea,getarg(1)*getarg(2);
+ getitem @itemid,getarg(2);
+ set Zeny,Zeny-@pricea;
+ mes @npcname$;
+ mes "There you go, here's your coins";
+ next;
+ return;
+
+L_Zenycoins:
+ set @bronzezeny,@zenyamount/@bronzeprice;
+ set @silverzeny,@zenyamount/@silverprice;
+ set @goldzeny,@zenyamount/@goldprice;
+ set @mithrilzeny,@zenyamount/@mithrilprice;
+ return;
+
+L_Inputingzeny:
+
+ input @zenyamount;
+ if (Zeny == 0) {
+ mes @npcname$;
+ mes "You don't have any Zeny left. I can't do anything. Get some Zeny first";
+ next;
+ goto L_Menu;
+ } else if (@zenyamount == 0) {
+ mes @npcname$;
+ mes "You didn't input any amount, please retry";
+ next;
+ goto L_Inputingzeny;
+ } else if (@zenyamount > Zeny) {
+ mes @npcname$;
+ mes "The inputted zeny amount is bigger than your actual zeny amount";
+ mes "Please re-entry another amount";
+ next;
+ goto L_Inputingzeny;
+
+ } else return;
+
+//| Other labels
+
+L_Moremoney:
+ mes @npcname$;
+ mes "You need to get more zeny, I can't give you anything with "+@zenyamount+"z, sorry";
+ next;
+ goto L_Menu;
+
+L_End:
+ next;
+ mes @npcname$;
+ mes "Good to see you and hope to see you again. Bye";
+ close;
+
+
+//| Mix function
+
+L_Mix:
+ set @totalzeny,0;
+ set @totalcoins,0;
+ set @bronzecoins,0;
+ set @silvercoins,0;
+ set @goldcoins,0;
+ set @mithrilcoins,0;
+ next;
+ mes @npcname$;
+ mes "Ok, let's start with ^996600"+@name1$+"s^000000";
+ next;
+ mes @npcname$;
+ mes "How many coins do you want?";
+ input @bronzecoins;
+ next;
+ set @totalzeny,@bronzecoins*@bronzeprice;
+ set @totalcoins,@bronzecoins;
+ mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
+ mes "Coins:";
+ mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
+ mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
+ if (@totalzeny > @zenyamount || @totalzeny < 0) {
+ mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ goto L_Overzeny;
+ } else
+ mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ next;
+ if (@totalzeny > @zenyamount || @totalzeny < 0)
+ mes @npcname$;
+ mes "Is this enough or do you want more?";
+ menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
+ next;
+ mes @npcname$;
+ mes "Now ^999999"+@name2$+"s^000000. How many coins do you want?";
+ next;
+ input @silvercoins;
+ next;
+ set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice;
+ set @totalcoins,@bronzecoins+@silvercoins;
+ mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
+ mes "Coins:";
+ mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
+ mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
+ mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
+ if (@totalzeny > @zenyamount || @totalzeny < 0) {
+ mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ goto L_Overzeny;
+ } else
+ mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ next;
+ if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
+ mes @npcname$;
+ mes "Is this enough or do you want more?";
+ menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
+ next;
+ mes @npcname$;
+ mes "Now ^FFCC00"+@name3$+"s^000000. How many coins do you want?";
+ input @goldcoins;
+ next;
+ set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice+@goldcoins*@goldprice;
+ set @totalcoins,@bronzecoins+@silvercoins+@goldcoins;
+ mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
+ mes "Coins:";
+ mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
+ mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
+ mes " ^FFCC00"+@name3$+"s^000000: "+@goldcoins+" ^CC0000"+@goldcoins*@goldprice+"^000000";
+ mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
+ if (@totalzeny > @zenyamount || @totalzeny < 0) {
+ mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ goto L_Overzeny;
+ } else
+ mes "TOTAL Zeny: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ next;
+ if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
+ mes @npcname$;
+ mes "Is this enough or do you want more?";
+ menu "It's enough, thanks",L_Payoff,"No, I want some more",-;
+ next;
+ mes @npcname$;
+ mes "Now ^CCCCCC"+@name4$+"s^000000. How many coins do you want?";
+ input @mithrilcoins;
+ next;
+ set @totalzeny,@bronzecoins*@bronzeprice+@silvercoins*@silverprice+@goldcoins*@goldprice+@mithrilcoins*@mithrilprice;
+ set @totalcoins,@bronzecoins+@silvercoins+@goldcoins+@mithrilcoins;
+ mes "Zeny Amount Inputted: ^000066"+@zenyamount+"^000000";
+ mes "Coins:";
+ mes " ^996600"+@name1$+"s^000000: "+@bronzecoins+" ^CC0000"+@bronzecoins*@bronzeprice+"^000000";
+ mes " ^999999"+@name2$+"s^000000: "+@silvercoins+" ^CC0000"+@silvercoins*@silverprice+"^000000";
+ mes " ^FFCC00"+@name3$+"s^000000: "+@goldcoins+" ^CC0000"+@goldcoins*@goldprice+"^000000";
+ mes " ^CCCCCC"+@name4$+"s^000000: "+@mithrilcoins+" ^CC0000"+@mithrilcoins*@mithrilprice+"^000000";
+ mes "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯";
+ if (@totalzeny > @zenyamount || @totalzeny < 0) {
+ mes "TOTAL Zeny: "+@totalcoins+" - ^CC0000"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ goto L_Overzeny;
+ } else
+ mes "TOTAL: "+@totalcoins+" ^00CC00"+@totalzeny+"^000000";
+ mes "Zeny Left: "+(@zenyamount-@totalzeny);
+ next;
+ if (@totalzeny > @zenyamount || @totalzeny < 0) goto L_Overzeny;
+ mes @npcname$;
+ mes "Is this ok?: "+@bronzecoins+" "+@name1$+"s, "+@silvercoins+" "+@name2$+"s, "+@goldcoins+" "+@name3$+"s, "+@mithrilcoins+" "+@name4$+"s, for a total amount of "+@totalzeny;
+ menu "Yes, it's ok",L_Payoff,"No, I want to re-intro them",L_Mix,"Sorry, I dont want anything",L_Menu;
+
+L_Payoff:
+ next;
+ if (@zenyamount > Zeny) goto L_Overzeny;
+ set Zeny,Zeny-@totalzeny;
+ getitem @bronzecoinid,@bronzecoins;
+ getitem @silvercoinid,@silvercoins;
+ getitem @goldcoinid,@goldcoins;
+ getitem @mithrilcoinid,@mithrilcoins;
+ mes @npcname$;
+ mes "There you go, here's your coins";
+ next;
+ set @bronzecoins,0;
+ set @silvercoins,0;
+ set @goldcoins,0;
+ set @mithrilcoins,0;
+ goto L_End;
+
+L_Overzeny:
+ next;
+ mes @npcname$;
+ mes "Sorry, I can't do anything else. Either the sum of all the coins you inputted is bigger than the zeny amount inputted, or the inputted amout of zeny is bigger that your total Zeny. Please retry.";
+ next;
+ goto L_Menu;
+
+OnInit:
+setitemscript 671,"{}";
+end;
} \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/disguiser.txt b/npc/custom/eAAC_Scripts/disguiser.txt
index 218de0196..7b184cc90 100644
--- a/npc/custom/eAAC_Scripts/disguiser.txt
+++ b/npc/custom/eAAC_Scripts/disguiser.txt
@@ -1,179 +1,179 @@
-//===== eAthena Script =======================================
-//= Disguiser Quesr
-//===== By: ==================================================
-//= PalasX (http://cashaan.dontexist.org)
-//===== Current Version: =====================================
-//= v1.20 Unified
-//===== Compatible With: =====================================
-//= SVN 5690+ (getmonsterinfo)
-//===== Description: =========================================
-//= Baphomet disguises you if you find all his brothers.
-//===== Additional Comments: =================================
-//= Gotta find them all in order
-//= Dynamically edits item 2614(eye of dullahan) with
-//= setitemscript 2614,"{bonus bdisguise,var_disguise;}";
-//= so your SVN better support it
-//= Uses GetMonsterInfo to pull monster names from server, but
-//= without sql_query, the mob IDs are set statically
-//= Went crazy with the functions, the script is TINY now :)
-//============================================================
-
-//////////////////////////
-//Places all of our NPCs//
-//////////////////////////
-prt_fild05.gat,277,226,5 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",0,quest_disguise;
-Close;
-}
-
-moc_fild10.gat,34,283,4 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",1,quest_disguise;
-close;
-}
-
-gef_fild00.gat,97,123,4 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",2,quest_disguise;
-close;
-}
-
-pay_fild01.gat,369,305,4 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",3,quest_disguise;
-close;
-}
-
-pay_fild03.gat,313,40,4 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",4,quest_disguise;
-close;
-}
-
-prt_fild08.gat,362,185,4 script Dullahan Master 736,{
- callfunc "PXC_Disguiser",5,quest_disguise;
- close;
-
-
-//////////////////////////
-// edits the item used ///
-//////////////////////////
-OnInit:
- //EDIT EYE OF DULLAHAN
- setitemscript 2614,"{ bonus bdisguise,var_disguise; }";
- end;
-}
-
-
-
-
-
-//////////////////////////
-// Function. Takes:
-// INTEGER, the order number that the bapho should be visited
-// VARIABLE, the quest progression variable quest_disguise. may be changed if conflicts occur
-//
-// Puts:
-// Everything the NPC does. If you are at the right one, increase your order variable, if not, tell you where to head next on the list, when you finish, offer you to change ring properties.
-// Whenever you dont have a ring, the script will push one on you in ALL instances (wrong NPC, right NPC, and done quest).
-//////////////////////////
-
-function script PXC_Disguiser {
-
- setarray $@PXC_Next$[0],"Culvert","Morocc","Geffen","Payon","Alberta","Izlude";
-
- if(var_disguise > 1) goto Complete;
- if(getarg(0) == 5 && getarg(1) == 5) goto Last;
- if(getarg(0) == getarg(1)) goto Quest;
-
-NotMe:
- mes "[Baphomet]";
- mes "You must visit us in the proper order, as is Thor's will. Only then can we teach you the power of self-transmutation! Hunt around "+$@PXC_Next$[getarg(1)]+" Next!";
- next;
- if(countitem(2614) < 1) goto NeedRing;
- close;
-
-Cancel:
- mes "[Baphomet]";
- mes "Later.";
- close;
-
-Quest:
- set quest_disguise,getarg(1)+1;
- mes "[Baphomet]";
- mes "What am I doing here? Find my brothers and you shall learn a great secret. It is one of the secret and ancient powers of Thor! Search around "+$@PXC_Next$[getarg(1)]+" next!";
- next;
- if(countitem(2614) < 1) goto NeedRing;
- close;
-
-NeedRing:
- mes "[Baphomet]";
- mes "You will need an Eye of Dullahan ring in order to obtain our secret. I can sell you one for 500,000 zeny. Simply bring me the money, and I'll offer it unto Thor in trade!";
- next;
- menu "Buy Ring",-,"Forget it!",Cancel;
- if(Zeny < 500000) goto Cancel;
- set Zeny,Zeny-500000;
- getitem 2614,1;
- mes "[Baphomet]";
- mes "Here is your ring.";
- next;
- goto Cancel;
- close;
-
-Last:
- set quest_disguise,0;
- set var_disguise,1002;
- mes "[Baphomet]";
- mes "I am the last of the six. Forgive us for giving such horrible directions, for we, too, are born from Thor's left eye, and have a terrible mean streak. Plus, being monsters, we're complete and total idiots with a shoddy A.I.! You shall now receive your reward.";
- next;
- goto Complete;
-
-
-Complete:
- if(countitem(2614) < 1) goto NeedRing;
-
- mes "[Baphomet]";
- mes "Several millenia ago, Thor, the creator breathed life onto Midgar. In the beginning, all was well, but Thor's left eye proved to be the bane of our existance. As it's gaze set upon our land, all the monsters were let loose from within Thor's soul. Thor cast out his own eye, the only thing that could control the monsters. Your ring is made from his eye, and will give you the same powers.";
- next;
- mes "[Baphomet]";
- mes "I can change your ring's mystical properties. Which monster spirit shall I weave into your ring?";
- next;
-
- if(getarg(0)==0) callfunc "PXC_DoMenu",1001,1125;
- if(getarg(0)==1) callfunc "PXC_DoMenu",1126,1250;
- if(getarg(0)==2) callfunc "PXC_DoMenu",1251,1375;
- if(getarg(0)==3) callfunc "PXC_DoMenu",1376,1500;
- if(getarg(0)==4) callfunc "PXC_DoMenu",1503,1625;
- if(getarg(0)==5) callfunc "PXC_DoMenu",1626,1721;
-
- close;
- end;
-}
-
-//////////////////////////
-// FUNCTION.
-// Takes:
-// integer, first monster ID to show
-// integer, last monster ID to show
-//////////////////////////
-function script PXC_DoMenu {
-
- //set menu options to mob names, doing the first one manualy so we dont have an empty :
- set $@menu$, getmonsterinfo(getarg(0),MOB_NAME);
-
- for(set $@i, getarg(0)+1; $@i <= getarg(1); set $@i, $@i + 1){
- set $@menu$, $@menu$ + ":" + getmonsterinfo($@i,MOB_NAME);
- }
-
- //Fire our menu
- set @menu, select($@menu$);
-
- //Zero deliminated (off-by-one errors sux0r!!!)
- set @menu, @menu-1;
-
- //congratulate our user
- mes "Behold, whilst you wear this ring, your form shall become that of a "+getmonsterinfo(@menu + getarg(0),MOB_NAME);
-
- //update our variable, with @menu offset addded to the base getarg(0)
- set var_disguise, @menu + getarg(0);
-
- close;
- end;
-
+//===== eAthena Script =======================================
+//= Disguiser Quesr
+//===== By: ==================================================
+//= PalasX (http://cashaan.dontexist.org)
+//===== Current Version: =====================================
+//= v1.20 Unified
+//===== Compatible With: =====================================
+//= SVN 5690+ (getmonsterinfo)
+//===== Description: =========================================
+//= Baphomet disguises you if you find all his brothers.
+//===== Additional Comments: =================================
+//= Gotta find them all in order
+//= Dynamically edits item 2614(eye of dullahan) with
+//= setitemscript 2614,"{bonus bdisguise,var_disguise;}";
+//= so your SVN better support it
+//= Uses GetMonsterInfo to pull monster names from server, but
+//= without sql_query, the mob IDs are set statically
+//= Went crazy with the functions, the script is TINY now :)
+//============================================================
+
+//////////////////////////
+//Places all of our NPCs//
+//////////////////////////
+prt_fild05.gat,277,226,5 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",0,quest_disguise;
+Close;
+}
+
+moc_fild10.gat,34,283,4 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",1,quest_disguise;
+close;
+}
+
+gef_fild00.gat,97,123,4 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",2,quest_disguise;
+close;
+}
+
+pay_fild01.gat,369,305,4 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",3,quest_disguise;
+close;
+}
+
+pay_fild03.gat,313,40,4 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",4,quest_disguise;
+close;
+}
+
+prt_fild08.gat,362,185,4 script Dullahan Master 736,{
+ callfunc "PXC_Disguiser",5,quest_disguise;
+ close;
+
+
+//////////////////////////
+// edits the item used ///
+//////////////////////////
+OnInit:
+ //EDIT EYE OF DULLAHAN
+ setitemscript 2614,"{ bonus bdisguise,var_disguise; }";
+ end;
+}
+
+
+
+
+
+//////////////////////////
+// Function. Takes:
+// INTEGER, the order number that the bapho should be visited
+// VARIABLE, the quest progression variable quest_disguise. may be changed if conflicts occur
+//
+// Puts:
+// Everything the NPC does. If you are at the right one, increase your order variable, if not, tell you where to head next on the list, when you finish, offer you to change ring properties.
+// Whenever you dont have a ring, the script will push one on you in ALL instances (wrong NPC, right NPC, and done quest).
+//////////////////////////
+
+function script PXC_Disguiser {
+
+ setarray $@PXC_Next$[0],"Culvert","Morocc","Geffen","Payon","Alberta","Izlude";
+
+ if(var_disguise > 1) goto Complete;
+ if(getarg(0) == 5 && getarg(1) == 5) goto Last;
+ if(getarg(0) == getarg(1)) goto Quest;
+
+NotMe:
+ mes "[Baphomet]";
+ mes "You must visit us in the proper order, as is Thor's will. Only then can we teach you the power of self-transmutation! Hunt around "+$@PXC_Next$[getarg(1)]+" Next!";
+ next;
+ if(countitem(2614) < 1) goto NeedRing;
+ close;
+
+Cancel:
+ mes "[Baphomet]";
+ mes "Later.";
+ close;
+
+Quest:
+ set quest_disguise,getarg(1)+1;
+ mes "[Baphomet]";
+ mes "What am I doing here? Find my brothers and you shall learn a great secret. It is one of the secret and ancient powers of Thor! Search around "+$@PXC_Next$[getarg(1)]+" next!";
+ next;
+ if(countitem(2614) < 1) goto NeedRing;
+ close;
+
+NeedRing:
+ mes "[Baphomet]";
+ mes "You will need an Eye of Dullahan ring in order to obtain our secret. I can sell you one for 500,000 zeny. Simply bring me the money, and I'll offer it unto Thor in trade!";
+ next;
+ menu "Buy Ring",-,"Forget it!",Cancel;
+ if(Zeny < 500000) goto Cancel;
+ set Zeny,Zeny-500000;
+ getitem 2614,1;
+ mes "[Baphomet]";
+ mes "Here is your ring.";
+ next;
+ goto Cancel;
+ close;
+
+Last:
+ set quest_disguise,0;
+ set var_disguise,1002;
+ mes "[Baphomet]";
+ mes "I am the last of the six. Forgive us for giving such horrible directions, for we, too, are born from Thor's left eye, and have a terrible mean streak. Plus, being monsters, we're complete and total idiots with a shoddy A.I.! You shall now receive your reward.";
+ next;
+ goto Complete;
+
+
+Complete:
+ if(countitem(2614) < 1) goto NeedRing;
+
+ mes "[Baphomet]";
+ mes "Several millenia ago, Thor, the creator breathed life onto Midgar. In the beginning, all was well, but Thor's left eye proved to be the bane of our existance. As it's gaze set upon our land, all the monsters were let loose from within Thor's soul. Thor cast out his own eye, the only thing that could control the monsters. Your ring is made from his eye, and will give you the same powers.";
+ next;
+ mes "[Baphomet]";
+ mes "I can change your ring's mystical properties. Which monster spirit shall I weave into your ring?";
+ next;
+
+ if(getarg(0)==0) callfunc "PXC_DoMenu",1001,1125;
+ if(getarg(0)==1) callfunc "PXC_DoMenu",1126,1250;
+ if(getarg(0)==2) callfunc "PXC_DoMenu",1251,1375;
+ if(getarg(0)==3) callfunc "PXC_DoMenu",1376,1500;
+ if(getarg(0)==4) callfunc "PXC_DoMenu",1503,1625;
+ if(getarg(0)==5) callfunc "PXC_DoMenu",1626,1721;
+
+ close;
+ end;
+}
+
+//////////////////////////
+// FUNCTION.
+// Takes:
+// integer, first monster ID to show
+// integer, last monster ID to show
+//////////////////////////
+function script PXC_DoMenu {
+
+ //set menu options to mob names, doing the first one manualy so we dont have an empty :
+ set $@menu$, getmonsterinfo(getarg(0),MOB_NAME);
+
+ for(set $@i, getarg(0)+1; $@i <= getarg(1); set $@i, $@i + 1){
+ set $@menu$, $@menu$ + ":" + getmonsterinfo($@i,MOB_NAME);
+ }
+
+ //Fire our menu
+ set @menu, select($@menu$);
+
+ //Zero deliminated (off-by-one errors sux0r!!!)
+ set @menu, @menu-1;
+
+ //congratulate our user
+ mes "Behold, whilst you wear this ring, your form shall become that of a "+getmonsterinfo(@menu + getarg(0),MOB_NAME);
+
+ //update our variable, with @menu offset addded to the base getarg(0)
+ set var_disguise, @menu + getarg(0);
+
+ close;
+ end;
+
} \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/Changelog.txt b/npc/custom/eAAC_Scripts/kafraExpress/Changelog.txt
index aa027b96f..2f9555f1d 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/Changelog.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/Changelog.txt
@@ -1,483 +1,483 @@
-09/February/2006
-* Refine v2.7
-- Fixed buying of ores being free.
-05/February/2006
-* Readme v1.8
-- Added Kafra Shop section
-* Config v1.9
-- Added Kafra Shop section
-* Shop v0.1
-- Initial release
-* Main v5.4
-- Added support for the Kafra Shop
-* Refine v2.6
-- Inverted order of item processing to prevent overweight problems (first the
- items are charged, then you get the refined ones)
-
-08/January/2006
-* Job Swap v3.1
-- Fixed incorrect menu entry causing crash in the 2nd job menu for female classes.
-- Fixed job names from the menu not matching the job you were about to change
- into (bard/dancer adjust was broken)
-- Fixed job revert saying your previous class was always the same as the current.
-
-04/January/2006
-* readme.txt v1.7
-- Added information about the new stat reset variables.
-
-30/December/2005
-* Main v5.3
-- Fixed NPC dialog freezing after healing both HP/SP
-* Stats v2.2
-- Added option to charge reset based on base/job levels.
-* Config v1.8
-- Added reset by level cost options.
-
-20/December/2005
-* Stats v2.1
-- Fixed resets charging you again when selecting return.
-
-12/December/2005
-* Bank v2.7
-- Fixed inifite loop that would trigger on year change.
-
-08/November/2005
-* Dungeon Warping v3.1
-- Fixed a crash when warping to GonRyun
-
-02/November/2005
-* Config v1.7
-- Added Taekwon equipment variables
-- Added dungeon variables for Abyss/Thanatos/Juperos
-
-01/November/2005
-* Job Changer v3.5
-- Clean up and optimized to the new scripting engine.
-- Added Taekwon Class support
-- Acquired items will now display the slot count they have.
-
-31/October/2005
-* Pvp Warps v1.7, Woe Warps v1.7
-- Clean up and optimized to the new scripting engine.
-
-30/October/2005
-* Dungeon Warps v3.0
-- Added Abyss Lake, Thanatos Tower and Juperos.
-
-29/October/2005
-* Dungeon Warps v2.9
-- Clean up and optimized to the new scripting engine.
-
-28/October/2005
-* Refine v2.5, Renter v1.8, Stat Market v2.0, Stats v2.0, Uncard v1.5
-- Clean up and optimized to the new scripting engine.
-
-27/October/2005
-* Broadcast v3.0, Bank v2.6, Dye v1.9, Job Swapper v3.0, Main v5.2
-- Clean up and optimized to the new scripting engine.
-
-14/October/2005
-* Pvp Warps v1.6
-- Fixed standard pvp mode warps.
-
-07/October/2005
-* JobSwapper v2.5
-- Updated to work on the new script engine.
-
-06/October/2005
-* Broadcast v2.8
-- Fixed a bug when broadcasting to Room Four.
-
-17/September/2005
-* Pvp Warps v1.5
-- Made warps random.
-
-04/September/2005
-* Town Warps v1.6
-- Label fix.
-
-11/August/2005
-* PvP Warps v1.4
-- Removed the obtained item, the pvp maps are "no return" areas afterall.
-
-02/August/2005
-* Job Changer v3.2
-- Fixed issues with UpperPolicy = 1 and SkipNovice = 1 not working correctly.
-
-* readme.txt v1.6
-- Updated to reflect current changes.
-
-* Bank v2.5, Broadcast v2.7, Dye v1.7, Job Changer v3,1, Job Swapper v2.4,
- Main v5.0, Refine v2.3, Renting v1.7, StatMarket v1.9, Stats v1.8,
- Uncarder v1.3, Warp Dungeon v2.7, Warp PvP v1.3, Warp Town v1.5, Warp WoE v1.6
-- Updated all 'emotion's to use a e_* constant instead of numbers.
-- Updated function F_keIntro to simplify code.
-- Updated headers to reflect actual script requirements.
-
-* Job Changer v3.0, Job Swapper v2.6, Config v1.6
-- Removed Upper type related code as this is not really implemented in eA.
-
-07/July/2005
-* readme v1.5
-- Updated documentation regarding traveller's mode.
-- Added descriptions for the new variables in the Stat Market.
-
-* Config v1.5
-- Updated comments for Traveller's warp mode.
-- Added variables kesm_skTradeCost, kesm_stTradeCost
-- Removed Gefenia
-
-* Stat Market v1.8
-- Added support for trading directly skills->stats or stats->skills.
-
-* Town Warps v1.4
-- Added again Einbech
-- Added Traveller's Warp mode 2
-
-* Dungeon Warps v2.6
-- Added Traveller's Warp mode 2
-- Sunken Ship Traveller mode bugfix.
-- Removed Gefenia
-
-* Kafras v1.9
-- Readded Einbech's town Kafra
-- Removed Gefenia
-
-05/July/2005
-* Town Warps v1.3
-- Fixed warps being free.
-- Some optimizations.
-
-04/July/2005
-* Job Swap v2.2
-- Fixed script 'freeze' when you don't have enough to revert to the previous job.
-- Fixed job-swapping being free if you did not have enough zeny.
-
-29/June/2005
-* Config v1.4
-- Added LightHalzen Rekkeben Cost
-
-* Dungeon Warps v2.5
-- Added LightHalzen
-- Miscellanous name corrections
-
-* Town Warps v1.2
-- Removed Einbech (it is just a Einbroch Station?)
-- Added LightHalzen
-
-* Kafras v1.8
-- Removed Einbech
-- Added LightHalzen (Town + Dungeon)
-
-* Broadcast v2.6
-- Added variable kebc_showOnline to display count of recipients.
-
-* Woe Warps v1.5, Town Warps v1.1, Pvp Warps v1.2, Dungeon Warps v1.4, Config v1.2
-- Changed variable kewd_onlineStr to ked_users
-
-* Main v4.9
-- Updated to use the new warp dungeon file.
-- Some cleanup and reorganization of menus.
-
-* Warp Dungeon v2.3
-- Merged Short Warps & Deep Warps into a single file.
-
-* Main v4.8
-- Moved the warping function here.
-- ke_warp_core.txt no longer needed (removed)
-
-* Job Changer v2.9, Job Swapper v2.1
-- Some cleaning
-
-* Config v1.1
-- Reorganized, some cleaning.
-
-28/June/2005
-* readme.txt v1.3
-- Updated and cleaned documentation.
-
-* Warp Town v1.0
-- Branched off Warp Core v3.1
-
-* Warp Core v3.2
-- Removed the Town warp code.
-
-* Main v4.7
-- Reorganized Menus
-
-* Bank v2.4, Broadcast v2.5, Dye v1.6, Job Changer v2.8, Job Swap v2.0,
- Main v4.6, Refine v2.2, Rent v1.6, Stat Market v1.7, Stats v1.7,
- Uncard v1.2, Warp Core v3.1, Warp Deep v2.2, Warp Short v2.1, Warp WoE v1.4
-- Upgraded to use config.txt
-
-27/June/2005
-* Job Swap v1.9
-- Fixed another stupid bug when job-reverting
-
-14/June/2005
-* Job Changer v2.7
-- Stupid fix for changing from adv 1st class to adv 2nd...
-
-10/June/2005
-* Job Swap v1.8
-- Fixed a silly bug with the announce option.
-
-05/June/2005
-* Core Warps v3.0, Short Warps v2.0
-- Bug Fix. kewd_pyramids -> kewd_pyramid
-- kewd_turtle -> kewd_turtleIsland
-
-04/June/2005
-* Core Warps v2.9, Deep Warps v2.1
-- Bug fix related to deep warps.
-- Fixed town warp costs being always zero.
-- Fixed Niflheim cost display when online count is on.
-
-02/June/2005
-* Core Warps v2.7, Short Warps 1.9, Deep Warps 2.0, Kafras v1.7
-- Added Einbech Mines
-
-* Kafras v1.6
-- Updated Kafras with Type 2
-
-* Deep Warp v1.9, Short Warps v1.8
-- Added support for kewd_travel
-
-* Main v4.5
-- Added kewd_travel for traveller's warp system.
-- Moved Warp Menu into this module.
-
-* Pvp Warp v1.0
-- Branched off ke_warp.txt v2.4
-
-* Core Warp v2.5:
-- Added kewt_discount for town warps discount
-- Added kewd_travel for traveller's warp system.
-- Changed cost display for towns, implemented Kafra Pass discount value
-
-1/June/2005
-* Bank v 2.3
-- Added kebk_capacity variable for limited account size.
-- Added kebk_useGlobalBank variable for enabling global counter.
-
-31/May/2005
-* Job Changer v2.5, Job Swapper v1.7
-- Modified code to work around the callfunc/menu bug
-
-* Main v2.4
-- Added SaveOnSpot option
-
-26/May/2005
-* Short Warps v1.7
-- Added option kewd_turtleCave for toggling island/cave warp (Turtle Island)
-
-* Bank v2.1, Broadcast v2.4, Dye v1.5, Main v4.2, Refine v2.1, Renting v1.5
- StatMarket v1.6, Stats v1.6, Uncarder v1.1, Warp Core v2.3, Deep Warps v1.8
- Short Warps v1.6, WoE Warps v1.3, JobSwapper 1.6, JobChanger 2.4
-- Label cleaning & standarization
-
-* JobChanger v2.3
-- Replaced functions with subfunctions
-- Implemented use of new global function GF_getJobId
-
-* JobSwapper v1.5
-- Replaced functions with subfunctions
-- Implemented use of new global function GF_getJobId
-- Added Support for Baby Classes
-
-25/May/2005
-* Kafras v1.5, Bank v2.0, Broadcast v2.3, Dye v1.4, JobChange v2.1,
- JobSwapper v1.3, Main v4.1, Refine v2.0, Renting v1.4, StatMarket v1.5,
- Stats & Resets v1.5, Warp Core v2.2, Deep Warps v1.7, WoE Warps v1.2
-- Header Cleanup
-- Global Variables standarized
-
-* Bank v1.9, Refine v1.8, Warp Core v2.1, Deep Warps v1.6
-- Changed callfunc's to callsub where applicable.
-
-* Broadcast v2.2
-- Changed callfunc's to callsub where applicable.
-- Updated calls to global functions file new version.
-
-* Dye v1.3
-- New variable kedy_clothJWED specifies max dye count for wedding class
-- Changed callfunc's to callsub where applicable.
-- Updated calls to global functions file new version.
-
-* Rent v1.3
-- Removed cost of GrandPeco, simplified script to enable all classes to rent
- anything (as long as they have the required skill)
-- Updated calls to global functions file new version.
-
-* Statmarket v1.4
-- Added some more overflow checks
-
-* Stats v1.4
-- Added ke_resetbasic, specifies if basic skills are reset as well.
-
-* JobChanger v2.0
-- Restructured, updated to work with Baby Classes
-
-* UnCarder v1.0
-- Initial Release
-
-01/Apr/2005
-* Kafras v1.5
-- Updated Niflheim Kafra type
-
-* Warp Core v2.0
-- Added Nifflheim Quest Support
-- Added Ayothaya Dungeon Cost
-
-* Warp Short v1.5, Warp Deep v1.5
-- Added Ayothaya Dungeon
-- Changed callfunc's to callsub where appliable.
-
-31/Mar/2005
-* Core Module v4.0
-- Added charge functions for Kafra Pass calculations
-- Added Nifflheim Quest Support
-
-* Broadcast v2.1, JobSwaper v1.2, Renting v1.1, StatMarket v1.3,
-* Stats v1.3, Core Warping v1.9, Deep Warping v1.4, Short Warping v1.4,
-* Woe Warping v1.1
-- Updated to new charge functions
-
-* Banker v1.8
-- Updated to new charge functions
-- Refined messages when charging monthly and not having enough
-
-* Refiner v1.8
-- Updated to new charge functions
-- Fixed bug where Kafra Pass discount was ignored when repairing equipment
-
-30/Mar/2005
-
-* Warper v1.8
-- Added Cities: Ayothaya, Einbroch, Einbech
-
-* Kafras v1.4
-- Added Kafras for towns: Ayothaya, Einbroch, Einbech
-
-26/Mar/2005
-* Job Changer v1.6
-- Shortened label lengths
-
-15/Mar/2005
-* Job Changer v1.5
-- Fixed infinite loop bug on change from High Novice to High First Class
-
-03/Mar/2005
-* Job Swapper v1.1
-- Added support for saving dye on revert
-- Added support to reset dye on swap
-
-* Job Changer v1.4
-- Added support for dye reset on change
-
-* Stylist v1.2
-- Added support for independent dye ranges per job-class
-
-24/Feb/2005
-* Job Swapper v1.0
-- Initial Release
-
-* Job Changer v1.3
-- Updated to work with the latest GF_getJob version
-
-* BroadCast Module v2.0
-- Updated to work with the latest GF_getJob version
-- Added confirmation before broadcasting
-
-* Core Module v3.8
-- Added support for the Job Swap entry
-- The Kafra image is now removed after the close
-- Added option to not expire Kafra Pass on exit
-
-23/Feb/2005
-* Job Changer v1.2
-- Added alternate weapons when changing at high job levels
-- Added "show details" to display detailed information of what will happen when you change jobs.
-- Added missing '-' on female (archer/thief) raising menu
-- Fixed a typo by which first High Classes could change regardless of job level
-
-19/Feb/2005
-* Job Changer v1.0
-- Initial Release
-
-* Core Module v3.6
-- Added support for the Job change entry
-
-18/Feb/2005
-* Dye v1.1
-- Added a missing 'end;' on the OnInit event
-
-* Stat Market v1.2
-- Added a missing 'end;' on the OnInit event
-
-* Stat/Reset System v1.2
-- Added a missing 'end;' on the OnInit event
-
-16/Feb/2005
-* Broadcasting v1.8
-- Updated use of GF_getJob
-
-11/Feb/2005
-* Warping Deep/Short v1.3
-- Updated Amatsu Entrance Warp
-
-01/Feb/2005
-* Bank Module v1.7
-- Fixed Monthly costs
-- Added overflow protection
-
-26/Jan/2005
-* Stat Market v1.1
-- Fixed overflow exploit when qty*price overflows.
-
-* Refining System v1.7
-- Fixed overflow exploit when qty*price overflows.
-
-* Banking Module v1.6
-- Added maximum transaction costs
-
-12/Jan/2005
-* Core Module v3.5
-- Fixed Negative Bug exploit on regular storage
-- Added Guild Storage Support
-
-* Banking Module v1.5
-- Fixed bug when gaining interests between years
-- Added monthly maintenance fees
-- Added minimum transaction costs
-
-* Refine Module v1.6
-- Added option to display success/failure chances
-- Item names are displayed now using getitemname()
-
-* Core Warping Module v.1.7
-- Minor name corrections
-- Added entry for Guild Wars warping
-
-* Deep Warping Module v1.2
-- Minor name corrections
-- Changed Orcs Dungeon warping location
-
-* Short Warping Module v.1.2
-- Minor name corrections
-- Changed Orcs Dungeon warping location
-
-* WoE Warping Module v1.0
-- Initial Release
-
-20/Nov/2004
-* Core Module v3.2
-- Fixed Kafra Image not being removed when opening storage
-
-* Warp Core Module v1.6
-- Expanded PvP system to use 8x5 rooms
-
-* Broadcast Module v1.7
-- Expanded to include new PvP rooms
-
--- Too old to remember :P
+09/February/2006
+* Refine v2.7
+- Fixed buying of ores being free.
+05/February/2006
+* Readme v1.8
+- Added Kafra Shop section
+* Config v1.9
+- Added Kafra Shop section
+* Shop v0.1
+- Initial release
+* Main v5.4
+- Added support for the Kafra Shop
+* Refine v2.6
+- Inverted order of item processing to prevent overweight problems (first the
+ items are charged, then you get the refined ones)
+
+08/January/2006
+* Job Swap v3.1
+- Fixed incorrect menu entry causing crash in the 2nd job menu for female classes.
+- Fixed job names from the menu not matching the job you were about to change
+ into (bard/dancer adjust was broken)
+- Fixed job revert saying your previous class was always the same as the current.
+
+04/January/2006
+* readme.txt v1.7
+- Added information about the new stat reset variables.
+
+30/December/2005
+* Main v5.3
+- Fixed NPC dialog freezing after healing both HP/SP
+* Stats v2.2
+- Added option to charge reset based on base/job levels.
+* Config v1.8
+- Added reset by level cost options.
+
+20/December/2005
+* Stats v2.1
+- Fixed resets charging you again when selecting return.
+
+12/December/2005
+* Bank v2.7
+- Fixed inifite loop that would trigger on year change.
+
+08/November/2005
+* Dungeon Warping v3.1
+- Fixed a crash when warping to GonRyun
+
+02/November/2005
+* Config v1.7
+- Added Taekwon equipment variables
+- Added dungeon variables for Abyss/Thanatos/Juperos
+
+01/November/2005
+* Job Changer v3.5
+- Clean up and optimized to the new scripting engine.
+- Added Taekwon Class support
+- Acquired items will now display the slot count they have.
+
+31/October/2005
+* Pvp Warps v1.7, Woe Warps v1.7
+- Clean up and optimized to the new scripting engine.
+
+30/October/2005
+* Dungeon Warps v3.0
+- Added Abyss Lake, Thanatos Tower and Juperos.
+
+29/October/2005
+* Dungeon Warps v2.9
+- Clean up and optimized to the new scripting engine.
+
+28/October/2005
+* Refine v2.5, Renter v1.8, Stat Market v2.0, Stats v2.0, Uncard v1.5
+- Clean up and optimized to the new scripting engine.
+
+27/October/2005
+* Broadcast v3.0, Bank v2.6, Dye v1.9, Job Swapper v3.0, Main v5.2
+- Clean up and optimized to the new scripting engine.
+
+14/October/2005
+* Pvp Warps v1.6
+- Fixed standard pvp mode warps.
+
+07/October/2005
+* JobSwapper v2.5
+- Updated to work on the new script engine.
+
+06/October/2005
+* Broadcast v2.8
+- Fixed a bug when broadcasting to Room Four.
+
+17/September/2005
+* Pvp Warps v1.5
+- Made warps random.
+
+04/September/2005
+* Town Warps v1.6
+- Label fix.
+
+11/August/2005
+* PvP Warps v1.4
+- Removed the obtained item, the pvp maps are "no return" areas afterall.
+
+02/August/2005
+* Job Changer v3.2
+- Fixed issues with UpperPolicy = 1 and SkipNovice = 1 not working correctly.
+
+* readme.txt v1.6
+- Updated to reflect current changes.
+
+* Bank v2.5, Broadcast v2.7, Dye v1.7, Job Changer v3,1, Job Swapper v2.4,
+ Main v5.0, Refine v2.3, Renting v1.7, StatMarket v1.9, Stats v1.8,
+ Uncarder v1.3, Warp Dungeon v2.7, Warp PvP v1.3, Warp Town v1.5, Warp WoE v1.6
+- Updated all 'emotion's to use a e_* constant instead of numbers.
+- Updated function F_keIntro to simplify code.
+- Updated headers to reflect actual script requirements.
+
+* Job Changer v3.0, Job Swapper v2.6, Config v1.6
+- Removed Upper type related code as this is not really implemented in eA.
+
+07/July/2005
+* readme v1.5
+- Updated documentation regarding traveller's mode.
+- Added descriptions for the new variables in the Stat Market.
+
+* Config v1.5
+- Updated comments for Traveller's warp mode.
+- Added variables kesm_skTradeCost, kesm_stTradeCost
+- Removed Gefenia
+
+* Stat Market v1.8
+- Added support for trading directly skills->stats or stats->skills.
+
+* Town Warps v1.4
+- Added again Einbech
+- Added Traveller's Warp mode 2
+
+* Dungeon Warps v2.6
+- Added Traveller's Warp mode 2
+- Sunken Ship Traveller mode bugfix.
+- Removed Gefenia
+
+* Kafras v1.9
+- Readded Einbech's town Kafra
+- Removed Gefenia
+
+05/July/2005
+* Town Warps v1.3
+- Fixed warps being free.
+- Some optimizations.
+
+04/July/2005
+* Job Swap v2.2
+- Fixed script 'freeze' when you don't have enough to revert to the previous job.
+- Fixed job-swapping being free if you did not have enough zeny.
+
+29/June/2005
+* Config v1.4
+- Added LightHalzen Rekkeben Cost
+
+* Dungeon Warps v2.5
+- Added LightHalzen
+- Miscellanous name corrections
+
+* Town Warps v1.2
+- Removed Einbech (it is just a Einbroch Station?)
+- Added LightHalzen
+
+* Kafras v1.8
+- Removed Einbech
+- Added LightHalzen (Town + Dungeon)
+
+* Broadcast v2.6
+- Added variable kebc_showOnline to display count of recipients.
+
+* Woe Warps v1.5, Town Warps v1.1, Pvp Warps v1.2, Dungeon Warps v1.4, Config v1.2
+- Changed variable kewd_onlineStr to ked_users
+
+* Main v4.9
+- Updated to use the new warp dungeon file.
+- Some cleanup and reorganization of menus.
+
+* Warp Dungeon v2.3
+- Merged Short Warps & Deep Warps into a single file.
+
+* Main v4.8
+- Moved the warping function here.
+- ke_warp_core.txt no longer needed (removed)
+
+* Job Changer v2.9, Job Swapper v2.1
+- Some cleaning
+
+* Config v1.1
+- Reorganized, some cleaning.
+
+28/June/2005
+* readme.txt v1.3
+- Updated and cleaned documentation.
+
+* Warp Town v1.0
+- Branched off Warp Core v3.1
+
+* Warp Core v3.2
+- Removed the Town warp code.
+
+* Main v4.7
+- Reorganized Menus
+
+* Bank v2.4, Broadcast v2.5, Dye v1.6, Job Changer v2.8, Job Swap v2.0,
+ Main v4.6, Refine v2.2, Rent v1.6, Stat Market v1.7, Stats v1.7,
+ Uncard v1.2, Warp Core v3.1, Warp Deep v2.2, Warp Short v2.1, Warp WoE v1.4
+- Upgraded to use config.txt
+
+27/June/2005
+* Job Swap v1.9
+- Fixed another stupid bug when job-reverting
+
+14/June/2005
+* Job Changer v2.7
+- Stupid fix for changing from adv 1st class to adv 2nd...
+
+10/June/2005
+* Job Swap v1.8
+- Fixed a silly bug with the announce option.
+
+05/June/2005
+* Core Warps v3.0, Short Warps v2.0
+- Bug Fix. kewd_pyramids -> kewd_pyramid
+- kewd_turtle -> kewd_turtleIsland
+
+04/June/2005
+* Core Warps v2.9, Deep Warps v2.1
+- Bug fix related to deep warps.
+- Fixed town warp costs being always zero.
+- Fixed Niflheim cost display when online count is on.
+
+02/June/2005
+* Core Warps v2.7, Short Warps 1.9, Deep Warps 2.0, Kafras v1.7
+- Added Einbech Mines
+
+* Kafras v1.6
+- Updated Kafras with Type 2
+
+* Deep Warp v1.9, Short Warps v1.8
+- Added support for kewd_travel
+
+* Main v4.5
+- Added kewd_travel for traveller's warp system.
+- Moved Warp Menu into this module.
+
+* Pvp Warp v1.0
+- Branched off ke_warp.txt v2.4
+
+* Core Warp v2.5:
+- Added kewt_discount for town warps discount
+- Added kewd_travel for traveller's warp system.
+- Changed cost display for towns, implemented Kafra Pass discount value
+
+1/June/2005
+* Bank v 2.3
+- Added kebk_capacity variable for limited account size.
+- Added kebk_useGlobalBank variable for enabling global counter.
+
+31/May/2005
+* Job Changer v2.5, Job Swapper v1.7
+- Modified code to work around the callfunc/menu bug
+
+* Main v2.4
+- Added SaveOnSpot option
+
+26/May/2005
+* Short Warps v1.7
+- Added option kewd_turtleCave for toggling island/cave warp (Turtle Island)
+
+* Bank v2.1, Broadcast v2.4, Dye v1.5, Main v4.2, Refine v2.1, Renting v1.5
+ StatMarket v1.6, Stats v1.6, Uncarder v1.1, Warp Core v2.3, Deep Warps v1.8
+ Short Warps v1.6, WoE Warps v1.3, JobSwapper 1.6, JobChanger 2.4
+- Label cleaning & standarization
+
+* JobChanger v2.3
+- Replaced functions with subfunctions
+- Implemented use of new global function GF_getJobId
+
+* JobSwapper v1.5
+- Replaced functions with subfunctions
+- Implemented use of new global function GF_getJobId
+- Added Support for Baby Classes
+
+25/May/2005
+* Kafras v1.5, Bank v2.0, Broadcast v2.3, Dye v1.4, JobChange v2.1,
+ JobSwapper v1.3, Main v4.1, Refine v2.0, Renting v1.4, StatMarket v1.5,
+ Stats & Resets v1.5, Warp Core v2.2, Deep Warps v1.7, WoE Warps v1.2
+- Header Cleanup
+- Global Variables standarized
+
+* Bank v1.9, Refine v1.8, Warp Core v2.1, Deep Warps v1.6
+- Changed callfunc's to callsub where applicable.
+
+* Broadcast v2.2
+- Changed callfunc's to callsub where applicable.
+- Updated calls to global functions file new version.
+
+* Dye v1.3
+- New variable kedy_clothJWED specifies max dye count for wedding class
+- Changed callfunc's to callsub where applicable.
+- Updated calls to global functions file new version.
+
+* Rent v1.3
+- Removed cost of GrandPeco, simplified script to enable all classes to rent
+ anything (as long as they have the required skill)
+- Updated calls to global functions file new version.
+
+* Statmarket v1.4
+- Added some more overflow checks
+
+* Stats v1.4
+- Added ke_resetbasic, specifies if basic skills are reset as well.
+
+* JobChanger v2.0
+- Restructured, updated to work with Baby Classes
+
+* UnCarder v1.0
+- Initial Release
+
+01/Apr/2005
+* Kafras v1.5
+- Updated Niflheim Kafra type
+
+* Warp Core v2.0
+- Added Nifflheim Quest Support
+- Added Ayothaya Dungeon Cost
+
+* Warp Short v1.5, Warp Deep v1.5
+- Added Ayothaya Dungeon
+- Changed callfunc's to callsub where appliable.
+
+31/Mar/2005
+* Core Module v4.0
+- Added charge functions for Kafra Pass calculations
+- Added Nifflheim Quest Support
+
+* Broadcast v2.1, JobSwaper v1.2, Renting v1.1, StatMarket v1.3,
+* Stats v1.3, Core Warping v1.9, Deep Warping v1.4, Short Warping v1.4,
+* Woe Warping v1.1
+- Updated to new charge functions
+
+* Banker v1.8
+- Updated to new charge functions
+- Refined messages when charging monthly and not having enough
+
+* Refiner v1.8
+- Updated to new charge functions
+- Fixed bug where Kafra Pass discount was ignored when repairing equipment
+
+30/Mar/2005
+
+* Warper v1.8
+- Added Cities: Ayothaya, Einbroch, Einbech
+
+* Kafras v1.4
+- Added Kafras for towns: Ayothaya, Einbroch, Einbech
+
+26/Mar/2005
+* Job Changer v1.6
+- Shortened label lengths
+
+15/Mar/2005
+* Job Changer v1.5
+- Fixed infinite loop bug on change from High Novice to High First Class
+
+03/Mar/2005
+* Job Swapper v1.1
+- Added support for saving dye on revert
+- Added support to reset dye on swap
+
+* Job Changer v1.4
+- Added support for dye reset on change
+
+* Stylist v1.2
+- Added support for independent dye ranges per job-class
+
+24/Feb/2005
+* Job Swapper v1.0
+- Initial Release
+
+* Job Changer v1.3
+- Updated to work with the latest GF_getJob version
+
+* BroadCast Module v2.0
+- Updated to work with the latest GF_getJob version
+- Added confirmation before broadcasting
+
+* Core Module v3.8
+- Added support for the Job Swap entry
+- The Kafra image is now removed after the close
+- Added option to not expire Kafra Pass on exit
+
+23/Feb/2005
+* Job Changer v1.2
+- Added alternate weapons when changing at high job levels
+- Added "show details" to display detailed information of what will happen when you change jobs.
+- Added missing '-' on female (archer/thief) raising menu
+- Fixed a typo by which first High Classes could change regardless of job level
+
+19/Feb/2005
+* Job Changer v1.0
+- Initial Release
+
+* Core Module v3.6
+- Added support for the Job change entry
+
+18/Feb/2005
+* Dye v1.1
+- Added a missing 'end;' on the OnInit event
+
+* Stat Market v1.2
+- Added a missing 'end;' on the OnInit event
+
+* Stat/Reset System v1.2
+- Added a missing 'end;' on the OnInit event
+
+16/Feb/2005
+* Broadcasting v1.8
+- Updated use of GF_getJob
+
+11/Feb/2005
+* Warping Deep/Short v1.3
+- Updated Amatsu Entrance Warp
+
+01/Feb/2005
+* Bank Module v1.7
+- Fixed Monthly costs
+- Added overflow protection
+
+26/Jan/2005
+* Stat Market v1.1
+- Fixed overflow exploit when qty*price overflows.
+
+* Refining System v1.7
+- Fixed overflow exploit when qty*price overflows.
+
+* Banking Module v1.6
+- Added maximum transaction costs
+
+12/Jan/2005
+* Core Module v3.5
+- Fixed Negative Bug exploit on regular storage
+- Added Guild Storage Support
+
+* Banking Module v1.5
+- Fixed bug when gaining interests between years
+- Added monthly maintenance fees
+- Added minimum transaction costs
+
+* Refine Module v1.6
+- Added option to display success/failure chances
+- Item names are displayed now using getitemname()
+
+* Core Warping Module v.1.7
+- Minor name corrections
+- Added entry for Guild Wars warping
+
+* Deep Warping Module v1.2
+- Minor name corrections
+- Changed Orcs Dungeon warping location
+
+* Short Warping Module v.1.2
+- Minor name corrections
+- Changed Orcs Dungeon warping location
+
+* WoE Warping Module v1.0
+- Initial Release
+
+20/Nov/2004
+* Core Module v3.2
+- Fixed Kafra Image not being removed when opening storage
+
+* Warp Core Module v1.6
+- Expanded PvP system to use 8x5 rooms
+
+* Broadcast Module v1.7
+- Expanded to include new PvP rooms
+
+-- Too old to remember :P
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/config.txt b/npc/custom/eAAC_Scripts/kafraExpress/config.txt
index 1e2bf3e1b..4848cb88c 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/config.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/config.txt
@@ -1,400 +1,400 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Config Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= Any eAthena Version with function support
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= This module contains the configuration of all modules.
-//===== Additional Comments: =================================
-//= See <http://www.eathena.deltaanime.net/board/index.php?showtopic=20290>
-//= for indepth explanation of the Kafra Express Script Package.
-//============================================================
-
-- script keConfig -1,{
- //-------------------------------------------------------------------------------
- //Config for the Main Module
- //-------------------------------------------------------------------------------
-OnInit:
- set $@ke_saveOnSpot,0; //If 1, the respawn point is saved where the char is standing.
- set $@keh_hpCost,10; //Cost of HP healing (per 10HP)
- set $@keh_spCost,100; //Cost of SP healing (per 10SP)
- set $@kes_cost,50; //Cost of opening the storage
- set $@kegs_cost,500; //Cost of opening the guild storage
-
- //Kafra Pass Options:
- set $@kekp_reset,1; //Kafra passes Expire when you speak to a Kafra?
- //(otherwise duration is as long as a temporary variable)
- set $@kekp_reserveCost,100; //Cost of each Reserve Point in Zeny (0 disable)
- set $@kekp_minReserve,1; //Min Reserve Points you can earn in a single transaction
- set $@kekp_maxReserve,150; //Max Reserve Points you can earn in a single transaction
-
- //Display Options
- set $@ked_users$,"people"; //String used when referring to people (player count).
- // Values like "ppl", "users" or "on" are also recommended.
- end;
- //-------------------------------------------------------------------------------
- //Config for the Bank Module
- //-------------------------------------------------------------------------------
-OnLoadBank:
- set $@kebk_depositCost,0; //Fee for bank deposits in % (10 = 10%)
- set $@kebk_withdrawCost,5; //Fee for bank withdrawals in % (10 = 10%)
- set $@kebk_minTransact,1000; //Value of the Minimum Transaction (deposit/withdraw)
- set $@kebk_maxTransact,999999; //Value of the Maximum Transaction (deposit/withdraw)
- set $@kebk_capacity,99999999; //Account capacity: Max zeny that can be held.
- set $@kebk_dayInterest,10; //Savings daily interests in 0.01% units (100 = 1%)
- set $@kebk_monMaintenance,1000; //Monthly flat fee charged for account maintenance
- set $@kebk_useGlobalBank,0; //When 1, all charged fees go to $ke_globalbank
- end;
- //-------------------------------------------------------------------------------
- //Config for the Broadcast Module
- //-------------------------------------------------------------------------------
-OnLoadBroadcast:
- //Following costs are for current map costs:
- set $@kebc_showOnline,0; //if 1, count of recipients will be listed.
- set $@kebc_partyCost,2500; //party request broadcast cost
- set $@kebc_pvpCost,5000; //pvp request broadcast cost
- set $@kebc_cost,10000; //general broadcast cost
- set $@kebc_anonCost,100000; //anonymous broadcast cost
- set $@kebc_globalFactor,1000; //When doing server bcs, the prices are increased by this amount (500 = 500% = 5x)
- set $@kebc_discount,15; //% Discount to apply when the KafraPass is active
- end;
- //-------------------------------------------------------------------------------
- //Config for the Dye and Stylist Module
- //-------------------------------------------------------------------------------
-OnLoadDye:
- set $@kedy_enableHairstyle,0; //Set to 1 to enable haircut style change.
- set $@kedy_styles,23; //Highest available haircut style (default 23)
- set $@kedy_hair,8; //Highest available hair dye (RO default is 8)
-
- //Highest available cloth dye depending on job-class
- set $@kedy_clothJN,77; //Novice (+High/Baby)
- set $@kedy_clothJ1ST,77; //1st Jobs (+High/Baby)
- set $@kedy_clothJ2ND,77; //2nd Jobs (+High/Baby)
- set $@kedy_clothJSN,77; //Super Novice (+Baby)
- set $@kedy_clothJWED,77; //Wedding Class
- end;
- //-------------------------------------------------------------------------------
- //Config for the Job Changer Module
- //-------------------------------------------------------------------------------
-OnLoadJobChange:
- set $@kejc_skillsPolicy,0; //Remaining Skill Points Policy:
- //0: Do not allow job changing until points are used up
- //1: Discard the remaining skill points
- //2: Let extra skill points be carried to next job
-
- set $@kejc_upperPolicy,0; //Upper Job management policy:
- //0: Ignore Mode: People can change in any order
- //1: Force Mode: Job changes are forced on the correct path.
-
- set $@kejc_announce,1; //Do a global announce when someone changes job.
- set $@kejc_resetDye,1; //Set to 1 to reset cloth dye upon change
- set $@kejc_skipNovice,0; //0: Novice needs Job 10 to change, 1: Can Skip Novice Class
- set $@kejc_baseSN,30; //Base lv required to become a Super Novice
-
- //Note that the change costs can be converted into rewards by specifying a negative amount.
- set $@kejc_base2ND,1; //Base lv required to change into a second class
- set $@kejc_job2ND,40; //Job Lv required to change into a second Class
- set $@kejc_cost2ND,-25000; //Zeny cost when changing into a second Class
-
- set $@kejc_baseRebirth,99; //Base lv required to do the Rebirth
- set $@kejc_jobRebirth,50; //Job Lv required to do the Rebirth
- set $@kejc_costRebirth,1000000; //Zeny cost required to do the Rebirth
-
- set $@kejc_rebirthReset,1; //When changing to a high novice, reset base level to 1?
- set $@kejc_weaponPolicy,1; //Set to 1 to give a weapon upon job change
-
- if ($@kejc_weaponPolicy == 0) //don't touch
- end;
-
- set $@kejc_wBonusLv,50; //Job level for upgraded weapon version, use 0 to disable
-
- //Weapons awarded to each job upon change (use 0 to disable for a particular class)
- //First classes:
- set $@kejc_wAcolyte,1501; //Club
- set $@kejc_wArcher,1701; //Bow
- set $@kejc_wMage,1601; //Rod
- set $@kejc_wMerchant,1301; //Axe
- set $@kejc_wSwordman,1101; //Sword
- set $@kejc_wThief,1201; //Knife
- set $@kejc_wTaekwon,0; //Nothing (they don't wield weapons)
- set $@kejc_wSuperNovice,1202; //Knife
-
- //Normal Weapons for Second classes
- set $@kejc_wPriest,1551; //Bible
- set $@kejc_wMonk,1801; //Waghnak
- set $@kejc_wHunter,1704; //Composite Bow
- set $@kejc_wBard,1901; //Violin
- set $@kejc_wDancer,1950; //Rope
- set $@kejc_wWizard,1602; //Rod
- set $@kejc_wSage,1550; //Book
- set $@kejc_wBlacksmith,1351; //Battle Axe
- set $@kejc_wAlchemist,1351; //Battle Axe
- set $@kejc_wKnight,1116; //Katana
- set $@kejc_wCrusader,1107; //Blade
- set $@kejc_wAssassin,1250; //Jur
- set $@kejc_wRogue,1210; //Cutter
- set $@kejc_wStarGladiator,1550; //Book
- set $@kejc_wSoulLinker,1602; //Rod
-
- if ($@kejc_wBonusLv == 0) //Don't touch.
- end;
-
- //Improved versions awarded to second classes
- set $@kejc_w2Priest,1519; //Chain
- set $@kejc_w2Monk,1811; //Finger
- set $@kejc_w2Hunter,1714; //Gakkung
- set $@kejc_w2Bard,1911; //Guh Moon Goh
- set $@kejc_w2Dancer,1960; //Whip
- set $@kejc_w2Wizard,1610; //Arc Wand
- set $@kejc_w2Sage,1552; //Tablet
- set $@kejc_w2Blacksmith,1360; //Two-Handed Axe
- set $@kejc_w2Alchemist,1360; //Two-Handed Axe
- set $@kejc_w2Knight,1160; //Broad-Sword
- set $@kejc_w2Crusader,1119; //Tsurugi
- set $@kejc_w2Assassin,1254; //Jamadhar
- set $@kejc_w2Rogue,1222; //Damascus
- set $@kejc_w2StarGladiator,1552; //Tablet
- set $@kejc_w2SoulLinker,1610; //Arc Wand
- end;
- //-------------------------------------------------------------------------------
- //Config for the Job Swapping Module
- //-------------------------------------------------------------------------------
-OnLoadJobSwap:
- set $@kejs_SNpolicy,0; //Super Novice is considered as...
- //0: Super Novices can't swap job.
- //1: 1st Class Range: Can only be swapped with First classes (including baby)
-
- set $@kejs_revertPolicy,1; //Allows reverting to the last Class one changed from...
- // 0: do not allow reverting
- // 1: Can revert to last Job ONLY when the last job belongs to the same "level" as
- // the current one. (ie: it is lost on job change/upgrade)
- // 2: Can revert to the last job regardless of situation.
-
- set $@kejs_announce,0; //Do a global announce when someone swaps job.
- set $@kejs_revertCost,100000; //Cost of reverting back to previous Job.
- set $@kejs_saveDye,1; //Set to 1 to save and restore previous dye when reverting
- set $@kejs_resetDye,0; //Set to 1 to reset cloth dye when swapping
- set $@kejs_swapDiscount, 20; //Kafra Pass % Discount when swapping jobs
- set $@kejs_revertDiscount, 20; //Kafra Pass % Discount when reverting to a previous job.
-
- //Minimum Job level required for swapping
- set $@kejs_job1ST,20; //among 1st classes
- set $@kejs_job2ND,50; //among 2nd classes
-
- //Base Cost for swapping job at min job level required
- set $@kejs_cost1ST,25000; //among 1st jobs
- set $@kejs_cost2ND,250000; //among 2nd jobs
-
- //Percentage discount for every level over the minimum
- set $@kejs_discount1ST,3; //among 1st jobs
- set $@kejs_discount2ND,3; //among 2nd jobs
-
- //How much to preserve of the previous Job in %?
- //(25% means that if you change at Lv100, you will become a Lv25 upon swap)
- set $@kejs_preserve1ST,50; //among 1st jobs
- set $@kejs_preserve2ND,0; //among 2nd jobs
- end;
- //-------------------------------------------------------------------------------
- //Config for the Refining Module
- //-------------------------------------------------------------------------------
-OnLoadRefine:
- set $@kerf_maxLv,10; //Max refinement level for equipment
- set $@kerf_safe,0; //Set to 1 to enable 100% safe refinement.
- set $@kerf_showChance,0; //Set to 1 to see the refine Success Chance
- set $@kerf_refineAll,0; //Set to 1 to enable refinement of anything (ie: accesories)
- set $@kerf_discount,0; //Discount % rate for forging when Kafra Pass is active.
- set $@kerf_armorCost,2000; //Cost to refine armor (default 2000z)
- set $@kerf_weaponLv1Cost,50; //Cost to refine lv1 weapons (default 50z)
- set $@kerf_weaponLv2Cost,200; //Cost to refine lv2 weapons (default 200z)
- set $@kerf_weaponLv3Cost,5000; //Cost to refine lv3 weapons (default 5000z)
- set $@kerf_weaponLv4Cost,20000; //Cost to refine lv4 weapons (default 20000z)
- set $@kerf_purifyAll,0; //Set to 1 to enable purifying elemental stones and the like
- set $@kerf_repairCost,10000; //Cost to repair broken equipment.
- set $@kerf_repairDiscount,25; //Discount % rate for repairing when Kafra Pass is active
- set $@kerf_repairSteel,1; //Set to 1 to make repairing equipment require 1 Steel.
- end;
- //-------------------------------------------------------------------------------
- //Config for the Renting Module
- //-------------------------------------------------------------------------------
-OnLoadRent:
- set $@kert_cartOnly, 0; //Set to 1 to enable only cart rental, 0 enables all add-ons.
- set $@kert_cartCost, 1000; //Cost to rent a Cart.
- set $@kert_falconCost, 2000; //Cost to rent a Falcon.
- set $@kert_pecoCost, 2000; //Cost to rent a PecoPeco.
- end;
- //-------------------------------------------------------------------------------
- //Config for the Kafra Shop Module
- //-------------------------------------------------------------------------------
-OnLoadShop:
- set $@kesh_towntype, 0; //Town shop type (1: buy, 2: sell, Other: both)
- set $@kesh_duntype, 2; //Dungeon shop type (1: buy, 2: sell, Other: both)
- set $@kesh_townshop$, "ke_townshop"; //Name of town shop to invoke.
- set $@kesh_dunshop$, "ke_dunshop"; //Name of dungeon shop to invoke.
- end;
- //-------------------------------------------------------------------------------
- //Config for the Stat Market Module
- //-------------------------------------------------------------------------------
-OnLoadStatMarket:
- set $@kesm_stBuyPrice,10000; //Cost of buying stat points
- set $@kesm_stSellPrice,0; //Return cash for selling stat points
- set $@kesm_skBuyPrice,1000000; //Cost of buying skill points
- set $@kesm_skSellPrice,50000; //Return cash for selling skill points
- set $@kesm_skTradePrice, 20; //Stats needed to trade for a skill. (Stat->Skill)
- set $@kesm_stTradePrice, 15; //Stats received per Skill traded. (Skill->Stat)
- set $@kesm_discount,0; //Discount % applied when buying if Kafra Pass is active
- end;
- //-------------------------------------------------------------------------------
- //Config for the Stats Reset/Raising Module
- //-------------------------------------------------------------------------------
-OnLoadStats:
- set $@kest_stResetCost,50000; //Cost to reset stats
- set $@kest_skResetCost,50000; //Cost to reset skills
- set $@kest_resetCost,75000; //Cost to reset both
- set $@kest_BaseLvCost,25000; //Additional cost per base level to reset stats
- set $@kest_JobLvCost,25000; //Additional cost per job level to reset skills
- set $@kest_BothLvCost,20000; //Additional cost per base+job level to reset both
-
- set $@kest_discount,15; //Discount % to be applied when Kafra Pass is active.
- set $@kest_resetBasic,0; //Set to 1 if you want basic skills resetted as well.
- end;
- //-------------------------------------------------------------------------------
- //Config for the Uncarding Module
- //-------------------------------------------------------------------------------
-OnLoadUncard:
- set $@keuc_BaseCost, 100000; //Base Cost
- set $@keuc_CardCost, 25000; //Extra Cost per Card
- set $@keuc_UpgradeCostA, 1000; //Extra Cost per Upgrade, Armor
- set $@keuc_UpgradeCostW1, 1000; //Extra Cost per Upgrade, Weapons Lv1
- set $@keuc_UpgradeCostW2, 2000; //Extra Cost per Upgrade, Weapons Lv2
- set $@keuc_UpgradeCostW3, 3000; //Extra Cost per Upgrade, Weapons Lv3
- set $@keuc_UpgradeCostW4, 5000; //Extra Cost per Upgrade, Weapons Lv4
- set $@keuc_discount, 10; //% Discount when using a Kafra Pass
- set $@keuc_Mat1,1000; //Material #1 needed (Star Crumb)
- set $@keuc_Qty1,1; //Qty of material #1 needed (use 0 to disable)
- set $@keuc_Mat2,715; //Material #2 needed (Yellow Gemstone)
- set $@keuc_Qty2,1; //Qty of material #2 needed (use 0 to disable)
-
- //Failure Chances. 1000 = 100.0%, set to 0 to disable failing chance.
- set $@keuc_Fail0Chance, 250; //Chance of harmless failure
- set $@keuc_Fail1Chance, 100; //Chance of losing item OR card
- set $@keuc_Fail2Chance, 25; //Chance of losing both
- end;
- //-------------------------------------------------------------------------------
- //Config for the Town Warps Module
- //-------------------------------------------------------------------------------
-OnLoadWarpTown:
- set $@kewt_showOnline,1; //Set to 1 to show online count on cities
- set $@kewt_cost, 1000; //Cost of warping to a town
- set $@kewt_niflCost, 5000; //Cost of warping to Niflheim
- set $@kewt_travel, 0; //Traveller's Mode type for towns:
- //0: Disabled (normal warping)
- //1: You can only warp to towns you've been before (per character basis)
- //2: You can only warp to towns you've been before (per account basis)
- set $@kewt_free, 0; //Set to 1 to let people warp to towns even when poor
- set $@kewt_discount, 100; //Discount % to apply when the Kafra Pass is active (towns)
- end;
- //-------------------------------------------------------------------------------
- //Config for the Dungeons Warps Module
- //-------------------------------------------------------------------------------
-OnLoadWarpDungeon:
- set $@kewd_showOnline,0; //Set to 1 to show online count on dungeons
- set $@kewd_discount, 50; //Discount % to apply when the Kafra Pass is active
- set $@kewd_travel, 0; //Traveller's mode type for dungeons:
- //0: Disabled (normal warping)
- //1: You can only warp to dungeons you've been before (per character basis)
- //2: You can only warp to dungeons you've been before (per account basis)
- set $@kewd_deep, 1; //If 1, people can warp to all levels of dungeons.
- //If 0, people can only warp to the entrance of dungeons.
-
- //Variables for Deep Warping
- set $@kewd_levelCost, 30; // cost % increase for warping to floors deep into the dungeon
- set $@kewd_entryDiscount, 25; //Discount % when using the Kafra right next to the dungeon one is warping into
-
- //Variables for Short Warping
- set $@kewd_turtleCave,0; //If 1, Turtle Island's warp leads to the
- //entrance of the cave, not the Island's shore.
-
- //Dungeon Costs
- set $@kewd_abyssLake,5000; //Abyss Lake base cost
- set $@kewd_amatsu,2500; //Amatsu Dungeon base cost
- set $@kewd_antHell,1750; //Anthell base cost
- set $@kewd_ayothaya,1750; //Ayothaya Dungeon base cost
- set $@kewd_byalan,1250; //Byalan base cost
- set $@kewd_comodo,2500; //Comodo Caves base cost
- set $@kewd_clockTower,6250; //Clock Tower base cost
- set $@kewd_coalMines,3750; //Coal Mines base cost
- set $@kewd_culvert,500; //Prontera Culvert base cost
- set $@kewd_einbech,5000; //Einbech Mines base cost
- set $@kewd_gefenia,25000; //Gefenia base cost
- set $@kewd_geffen,5000; //Geffen Dungeon base cost
- set $@kewd_glastHeim,10000; //Glast Heim base cost
- set $@kewd_gonRyun,3750; //Gonryun Dungeon base cost
- set $@kewd_hiddenTemple,250; //Hidden Temple base cost
- set $@kewd_juperos,7500; //Juperos base cost
- set $@kewd_lightHalzen,15000; //LightHalzen Rekkenber base cost
- set $@kewd_louYang,2500; //Louyang Dungeon base cost
- set $@kewd_magma,3750; //Magma Dungeon base cost
- set $@kewd_orc,2500; //Orc Dungeon base cost
- set $@kewd_payon,1100; //Payon Dungeon base cost
- set $@kewd_pyramid,2500; //Pyramids base cost
- set $@kewd_sphinx,1750; //Sphinx base cost
- set $@kewd_sunkenShip,1000; //Sunken Ship base cost
- set $@kewd_thanatosTower,15000; //Thanatos Tower base cost
- set $@kewd_toyFactory,2500; //Toy Factory base cost
- set $@kewd_turtleIsland,12500; //Turtle Island base cost
- set $@kewd_umbala,3550; //Umbala Dungeon base cost
- end;
- //-------------------------------------------------------------------------------
- //Config for the Pvp Warps Module
- //-------------------------------------------------------------------------------
-OnLoadWarpPvp:
- set $@kewp_showOnline,1; //Set to 1 to show online count on pvp maps
- set $@kewp_advanced,0; //Set to 0 to enable a single group of pvp rooms
- //(no level restrictions, kewp_cost is used)
- set $@kewp_cost, 1000; //Cost for Free For All (no level restrictions)
-
- if ($@kewp_advanced == 0) //Don't touch
- end;
-
- set $@kewp_cost1, 100; //Cost of warping to a pvp arena, lvls group 1
- set $@kewp_cost2, 250; //Cost for lvls group 2
- set $@kewp_cost3, 500; //Cost for lvls group 3
- set $@kewp_cost4, 1000; //Cost for lvls group 4
- set $@kewp_cost5, 2000; //Cost for lvls group 5
- set $@kewp_cost6, 4000; //Cost for lvls group 6
- set $@kewp_cost7, 8000; //Cost for lvls group 7
- set $@kewp_baseLv1, 35; //Level required for pvp, lv1
- set $@kewp_baseLv2, 45; //Level required for pvp, lv2
- set $@kewp_baseLv3, 55; //Level required for pvp, lv3
- set $@kewp_baseLv4, 65; //Level required for pvp, lv4
- set $@kewp_baseLv5, 75; //Level required for pvp, lv5
- set $@kewp_baseLv6, 85; //Level required for pvp, lv6
- set $@kewp_baseLv7, 95; //Level required for pvp, lv7
- set $@kewp_range, 5; //Range of levels allowed (ie: Warp to Lv1: levels 10+/-5)
- end;
- //-------------------------------------------------------------------------------
- //Config for the WoE Warps Module
- //-------------------------------------------------------------------------------
-OnLoadWarpWoe:
- //Note: See ke_warp_woe.txt for instructions on how to unlock the Guild Dungeons.
- set $@kewg_check,1; //If 0, people don't need to belong to a Guild to warp
- set $@kewg_checkAgit,1; //If 1, you can't warp until WoE starts
- set $@kewg_showOnline,0; //Set to 1 to show online count and Castle Status
- set $@kewg_discount,20; //Kafra Pass discount for WoE warps
-
- set $@kewg_baldur, 25000; //Guild Dungeon - Baldur
- set $@kewg_luina, 25000; //Guild Dungeon - Luina
- set $@kewg_valkyrie, 25000; //Guild Dungeon - Valkyrie
- set $@kewg_britoniah, 25000; //Guild Dungeon - Britoniah
-
- set $@kewg_alDeBaran, 2500; //Al De Baran Guild
- set $@kewg_geffen, 2500; //Geffen Guild
- set $@kewg_payon, 2500; //Payon Guild
- set $@kewg_prontera, 2500; //Prontera Guild
- end;
- //-------------------------------------------------------------------------------
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Config Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= Any eAthena Version with function support
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= This module contains the configuration of all modules.
+//===== Additional Comments: =================================
+//= See <http://www.eathena.deltaanime.net/board/index.php?showtopic=20290>
+//= for indepth explanation of the Kafra Express Script Package.
+//============================================================
+
+- script keConfig -1,{
+ //-------------------------------------------------------------------------------
+ //Config for the Main Module
+ //-------------------------------------------------------------------------------
+OnInit:
+ set $@ke_saveOnSpot,0; //If 1, the respawn point is saved where the char is standing.
+ set $@keh_hpCost,10; //Cost of HP healing (per 10HP)
+ set $@keh_spCost,100; //Cost of SP healing (per 10SP)
+ set $@kes_cost,50; //Cost of opening the storage
+ set $@kegs_cost,500; //Cost of opening the guild storage
+
+ //Kafra Pass Options:
+ set $@kekp_reset,1; //Kafra passes Expire when you speak to a Kafra?
+ //(otherwise duration is as long as a temporary variable)
+ set $@kekp_reserveCost,100; //Cost of each Reserve Point in Zeny (0 disable)
+ set $@kekp_minReserve,1; //Min Reserve Points you can earn in a single transaction
+ set $@kekp_maxReserve,150; //Max Reserve Points you can earn in a single transaction
+
+ //Display Options
+ set $@ked_users$,"people"; //String used when referring to people (player count).
+ // Values like "ppl", "users" or "on" are also recommended.
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Bank Module
+ //-------------------------------------------------------------------------------
+OnLoadBank:
+ set $@kebk_depositCost,0; //Fee for bank deposits in % (10 = 10%)
+ set $@kebk_withdrawCost,5; //Fee for bank withdrawals in % (10 = 10%)
+ set $@kebk_minTransact,1000; //Value of the Minimum Transaction (deposit/withdraw)
+ set $@kebk_maxTransact,999999; //Value of the Maximum Transaction (deposit/withdraw)
+ set $@kebk_capacity,99999999; //Account capacity: Max zeny that can be held.
+ set $@kebk_dayInterest,10; //Savings daily interests in 0.01% units (100 = 1%)
+ set $@kebk_monMaintenance,1000; //Monthly flat fee charged for account maintenance
+ set $@kebk_useGlobalBank,0; //When 1, all charged fees go to $ke_globalbank
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Broadcast Module
+ //-------------------------------------------------------------------------------
+OnLoadBroadcast:
+ //Following costs are for current map costs:
+ set $@kebc_showOnline,0; //if 1, count of recipients will be listed.
+ set $@kebc_partyCost,2500; //party request broadcast cost
+ set $@kebc_pvpCost,5000; //pvp request broadcast cost
+ set $@kebc_cost,10000; //general broadcast cost
+ set $@kebc_anonCost,100000; //anonymous broadcast cost
+ set $@kebc_globalFactor,1000; //When doing server bcs, the prices are increased by this amount (500 = 500% = 5x)
+ set $@kebc_discount,15; //% Discount to apply when the KafraPass is active
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Dye and Stylist Module
+ //-------------------------------------------------------------------------------
+OnLoadDye:
+ set $@kedy_enableHairstyle,0; //Set to 1 to enable haircut style change.
+ set $@kedy_styles,23; //Highest available haircut style (default 23)
+ set $@kedy_hair,8; //Highest available hair dye (RO default is 8)
+
+ //Highest available cloth dye depending on job-class
+ set $@kedy_clothJN,77; //Novice (+High/Baby)
+ set $@kedy_clothJ1ST,77; //1st Jobs (+High/Baby)
+ set $@kedy_clothJ2ND,77; //2nd Jobs (+High/Baby)
+ set $@kedy_clothJSN,77; //Super Novice (+Baby)
+ set $@kedy_clothJWED,77; //Wedding Class
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Job Changer Module
+ //-------------------------------------------------------------------------------
+OnLoadJobChange:
+ set $@kejc_skillsPolicy,0; //Remaining Skill Points Policy:
+ //0: Do not allow job changing until points are used up
+ //1: Discard the remaining skill points
+ //2: Let extra skill points be carried to next job
+
+ set $@kejc_upperPolicy,0; //Upper Job management policy:
+ //0: Ignore Mode: People can change in any order
+ //1: Force Mode: Job changes are forced on the correct path.
+
+ set $@kejc_announce,1; //Do a global announce when someone changes job.
+ set $@kejc_resetDye,1; //Set to 1 to reset cloth dye upon change
+ set $@kejc_skipNovice,0; //0: Novice needs Job 10 to change, 1: Can Skip Novice Class
+ set $@kejc_baseSN,30; //Base lv required to become a Super Novice
+
+ //Note that the change costs can be converted into rewards by specifying a negative amount.
+ set $@kejc_base2ND,1; //Base lv required to change into a second class
+ set $@kejc_job2ND,40; //Job Lv required to change into a second Class
+ set $@kejc_cost2ND,-25000; //Zeny cost when changing into a second Class
+
+ set $@kejc_baseRebirth,99; //Base lv required to do the Rebirth
+ set $@kejc_jobRebirth,50; //Job Lv required to do the Rebirth
+ set $@kejc_costRebirth,1000000; //Zeny cost required to do the Rebirth
+
+ set $@kejc_rebirthReset,1; //When changing to a high novice, reset base level to 1?
+ set $@kejc_weaponPolicy,1; //Set to 1 to give a weapon upon job change
+
+ if ($@kejc_weaponPolicy == 0) //don't touch
+ end;
+
+ set $@kejc_wBonusLv,50; //Job level for upgraded weapon version, use 0 to disable
+
+ //Weapons awarded to each job upon change (use 0 to disable for a particular class)
+ //First classes:
+ set $@kejc_wAcolyte,1501; //Club
+ set $@kejc_wArcher,1701; //Bow
+ set $@kejc_wMage,1601; //Rod
+ set $@kejc_wMerchant,1301; //Axe
+ set $@kejc_wSwordman,1101; //Sword
+ set $@kejc_wThief,1201; //Knife
+ set $@kejc_wTaekwon,0; //Nothing (they don't wield weapons)
+ set $@kejc_wSuperNovice,1202; //Knife
+
+ //Normal Weapons for Second classes
+ set $@kejc_wPriest,1551; //Bible
+ set $@kejc_wMonk,1801; //Waghnak
+ set $@kejc_wHunter,1704; //Composite Bow
+ set $@kejc_wBard,1901; //Violin
+ set $@kejc_wDancer,1950; //Rope
+ set $@kejc_wWizard,1602; //Rod
+ set $@kejc_wSage,1550; //Book
+ set $@kejc_wBlacksmith,1351; //Battle Axe
+ set $@kejc_wAlchemist,1351; //Battle Axe
+ set $@kejc_wKnight,1116; //Katana
+ set $@kejc_wCrusader,1107; //Blade
+ set $@kejc_wAssassin,1250; //Jur
+ set $@kejc_wRogue,1210; //Cutter
+ set $@kejc_wStarGladiator,1550; //Book
+ set $@kejc_wSoulLinker,1602; //Rod
+
+ if ($@kejc_wBonusLv == 0) //Don't touch.
+ end;
+
+ //Improved versions awarded to second classes
+ set $@kejc_w2Priest,1519; //Chain
+ set $@kejc_w2Monk,1811; //Finger
+ set $@kejc_w2Hunter,1714; //Gakkung
+ set $@kejc_w2Bard,1911; //Guh Moon Goh
+ set $@kejc_w2Dancer,1960; //Whip
+ set $@kejc_w2Wizard,1610; //Arc Wand
+ set $@kejc_w2Sage,1552; //Tablet
+ set $@kejc_w2Blacksmith,1360; //Two-Handed Axe
+ set $@kejc_w2Alchemist,1360; //Two-Handed Axe
+ set $@kejc_w2Knight,1160; //Broad-Sword
+ set $@kejc_w2Crusader,1119; //Tsurugi
+ set $@kejc_w2Assassin,1254; //Jamadhar
+ set $@kejc_w2Rogue,1222; //Damascus
+ set $@kejc_w2StarGladiator,1552; //Tablet
+ set $@kejc_w2SoulLinker,1610; //Arc Wand
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Job Swapping Module
+ //-------------------------------------------------------------------------------
+OnLoadJobSwap:
+ set $@kejs_SNpolicy,0; //Super Novice is considered as...
+ //0: Super Novices can't swap job.
+ //1: 1st Class Range: Can only be swapped with First classes (including baby)
+
+ set $@kejs_revertPolicy,1; //Allows reverting to the last Class one changed from...
+ // 0: do not allow reverting
+ // 1: Can revert to last Job ONLY when the last job belongs to the same "level" as
+ // the current one. (ie: it is lost on job change/upgrade)
+ // 2: Can revert to the last job regardless of situation.
+
+ set $@kejs_announce,0; //Do a global announce when someone swaps job.
+ set $@kejs_revertCost,100000; //Cost of reverting back to previous Job.
+ set $@kejs_saveDye,1; //Set to 1 to save and restore previous dye when reverting
+ set $@kejs_resetDye,0; //Set to 1 to reset cloth dye when swapping
+ set $@kejs_swapDiscount, 20; //Kafra Pass % Discount when swapping jobs
+ set $@kejs_revertDiscount, 20; //Kafra Pass % Discount when reverting to a previous job.
+
+ //Minimum Job level required for swapping
+ set $@kejs_job1ST,20; //among 1st classes
+ set $@kejs_job2ND,50; //among 2nd classes
+
+ //Base Cost for swapping job at min job level required
+ set $@kejs_cost1ST,25000; //among 1st jobs
+ set $@kejs_cost2ND,250000; //among 2nd jobs
+
+ //Percentage discount for every level over the minimum
+ set $@kejs_discount1ST,3; //among 1st jobs
+ set $@kejs_discount2ND,3; //among 2nd jobs
+
+ //How much to preserve of the previous Job in %?
+ //(25% means that if you change at Lv100, you will become a Lv25 upon swap)
+ set $@kejs_preserve1ST,50; //among 1st jobs
+ set $@kejs_preserve2ND,0; //among 2nd jobs
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Refining Module
+ //-------------------------------------------------------------------------------
+OnLoadRefine:
+ set $@kerf_maxLv,10; //Max refinement level for equipment
+ set $@kerf_safe,0; //Set to 1 to enable 100% safe refinement.
+ set $@kerf_showChance,0; //Set to 1 to see the refine Success Chance
+ set $@kerf_refineAll,0; //Set to 1 to enable refinement of anything (ie: accesories)
+ set $@kerf_discount,0; //Discount % rate for forging when Kafra Pass is active.
+ set $@kerf_armorCost,2000; //Cost to refine armor (default 2000z)
+ set $@kerf_weaponLv1Cost,50; //Cost to refine lv1 weapons (default 50z)
+ set $@kerf_weaponLv2Cost,200; //Cost to refine lv2 weapons (default 200z)
+ set $@kerf_weaponLv3Cost,5000; //Cost to refine lv3 weapons (default 5000z)
+ set $@kerf_weaponLv4Cost,20000; //Cost to refine lv4 weapons (default 20000z)
+ set $@kerf_purifyAll,0; //Set to 1 to enable purifying elemental stones and the like
+ set $@kerf_repairCost,10000; //Cost to repair broken equipment.
+ set $@kerf_repairDiscount,25; //Discount % rate for repairing when Kafra Pass is active
+ set $@kerf_repairSteel,1; //Set to 1 to make repairing equipment require 1 Steel.
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Renting Module
+ //-------------------------------------------------------------------------------
+OnLoadRent:
+ set $@kert_cartOnly, 0; //Set to 1 to enable only cart rental, 0 enables all add-ons.
+ set $@kert_cartCost, 1000; //Cost to rent a Cart.
+ set $@kert_falconCost, 2000; //Cost to rent a Falcon.
+ set $@kert_pecoCost, 2000; //Cost to rent a PecoPeco.
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Kafra Shop Module
+ //-------------------------------------------------------------------------------
+OnLoadShop:
+ set $@kesh_towntype, 0; //Town shop type (1: buy, 2: sell, Other: both)
+ set $@kesh_duntype, 2; //Dungeon shop type (1: buy, 2: sell, Other: both)
+ set $@kesh_townshop$, "ke_townshop"; //Name of town shop to invoke.
+ set $@kesh_dunshop$, "ke_dunshop"; //Name of dungeon shop to invoke.
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Stat Market Module
+ //-------------------------------------------------------------------------------
+OnLoadStatMarket:
+ set $@kesm_stBuyPrice,10000; //Cost of buying stat points
+ set $@kesm_stSellPrice,0; //Return cash for selling stat points
+ set $@kesm_skBuyPrice,1000000; //Cost of buying skill points
+ set $@kesm_skSellPrice,50000; //Return cash for selling skill points
+ set $@kesm_skTradePrice, 20; //Stats needed to trade for a skill. (Stat->Skill)
+ set $@kesm_stTradePrice, 15; //Stats received per Skill traded. (Skill->Stat)
+ set $@kesm_discount,0; //Discount % applied when buying if Kafra Pass is active
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Stats Reset/Raising Module
+ //-------------------------------------------------------------------------------
+OnLoadStats:
+ set $@kest_stResetCost,50000; //Cost to reset stats
+ set $@kest_skResetCost,50000; //Cost to reset skills
+ set $@kest_resetCost,75000; //Cost to reset both
+ set $@kest_BaseLvCost,25000; //Additional cost per base level to reset stats
+ set $@kest_JobLvCost,25000; //Additional cost per job level to reset skills
+ set $@kest_BothLvCost,20000; //Additional cost per base+job level to reset both
+
+ set $@kest_discount,15; //Discount % to be applied when Kafra Pass is active.
+ set $@kest_resetBasic,0; //Set to 1 if you want basic skills resetted as well.
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Uncarding Module
+ //-------------------------------------------------------------------------------
+OnLoadUncard:
+ set $@keuc_BaseCost, 100000; //Base Cost
+ set $@keuc_CardCost, 25000; //Extra Cost per Card
+ set $@keuc_UpgradeCostA, 1000; //Extra Cost per Upgrade, Armor
+ set $@keuc_UpgradeCostW1, 1000; //Extra Cost per Upgrade, Weapons Lv1
+ set $@keuc_UpgradeCostW2, 2000; //Extra Cost per Upgrade, Weapons Lv2
+ set $@keuc_UpgradeCostW3, 3000; //Extra Cost per Upgrade, Weapons Lv3
+ set $@keuc_UpgradeCostW4, 5000; //Extra Cost per Upgrade, Weapons Lv4
+ set $@keuc_discount, 10; //% Discount when using a Kafra Pass
+ set $@keuc_Mat1,1000; //Material #1 needed (Star Crumb)
+ set $@keuc_Qty1,1; //Qty of material #1 needed (use 0 to disable)
+ set $@keuc_Mat2,715; //Material #2 needed (Yellow Gemstone)
+ set $@keuc_Qty2,1; //Qty of material #2 needed (use 0 to disable)
+
+ //Failure Chances. 1000 = 100.0%, set to 0 to disable failing chance.
+ set $@keuc_Fail0Chance, 250; //Chance of harmless failure
+ set $@keuc_Fail1Chance, 100; //Chance of losing item OR card
+ set $@keuc_Fail2Chance, 25; //Chance of losing both
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Town Warps Module
+ //-------------------------------------------------------------------------------
+OnLoadWarpTown:
+ set $@kewt_showOnline,1; //Set to 1 to show online count on cities
+ set $@kewt_cost, 1000; //Cost of warping to a town
+ set $@kewt_niflCost, 5000; //Cost of warping to Niflheim
+ set $@kewt_travel, 0; //Traveller's Mode type for towns:
+ //0: Disabled (normal warping)
+ //1: You can only warp to towns you've been before (per character basis)
+ //2: You can only warp to towns you've been before (per account basis)
+ set $@kewt_free, 0; //Set to 1 to let people warp to towns even when poor
+ set $@kewt_discount, 100; //Discount % to apply when the Kafra Pass is active (towns)
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Dungeons Warps Module
+ //-------------------------------------------------------------------------------
+OnLoadWarpDungeon:
+ set $@kewd_showOnline,0; //Set to 1 to show online count on dungeons
+ set $@kewd_discount, 50; //Discount % to apply when the Kafra Pass is active
+ set $@kewd_travel, 0; //Traveller's mode type for dungeons:
+ //0: Disabled (normal warping)
+ //1: You can only warp to dungeons you've been before (per character basis)
+ //2: You can only warp to dungeons you've been before (per account basis)
+ set $@kewd_deep, 1; //If 1, people can warp to all levels of dungeons.
+ //If 0, people can only warp to the entrance of dungeons.
+
+ //Variables for Deep Warping
+ set $@kewd_levelCost, 30; // cost % increase for warping to floors deep into the dungeon
+ set $@kewd_entryDiscount, 25; //Discount % when using the Kafra right next to the dungeon one is warping into
+
+ //Variables for Short Warping
+ set $@kewd_turtleCave,0; //If 1, Turtle Island's warp leads to the
+ //entrance of the cave, not the Island's shore.
+
+ //Dungeon Costs
+ set $@kewd_abyssLake,5000; //Abyss Lake base cost
+ set $@kewd_amatsu,2500; //Amatsu Dungeon base cost
+ set $@kewd_antHell,1750; //Anthell base cost
+ set $@kewd_ayothaya,1750; //Ayothaya Dungeon base cost
+ set $@kewd_byalan,1250; //Byalan base cost
+ set $@kewd_comodo,2500; //Comodo Caves base cost
+ set $@kewd_clockTower,6250; //Clock Tower base cost
+ set $@kewd_coalMines,3750; //Coal Mines base cost
+ set $@kewd_culvert,500; //Prontera Culvert base cost
+ set $@kewd_einbech,5000; //Einbech Mines base cost
+ set $@kewd_gefenia,25000; //Gefenia base cost
+ set $@kewd_geffen,5000; //Geffen Dungeon base cost
+ set $@kewd_glastHeim,10000; //Glast Heim base cost
+ set $@kewd_gonRyun,3750; //Gonryun Dungeon base cost
+ set $@kewd_hiddenTemple,250; //Hidden Temple base cost
+ set $@kewd_juperos,7500; //Juperos base cost
+ set $@kewd_lightHalzen,15000; //LightHalzen Rekkenber base cost
+ set $@kewd_louYang,2500; //Louyang Dungeon base cost
+ set $@kewd_magma,3750; //Magma Dungeon base cost
+ set $@kewd_orc,2500; //Orc Dungeon base cost
+ set $@kewd_payon,1100; //Payon Dungeon base cost
+ set $@kewd_pyramid,2500; //Pyramids base cost
+ set $@kewd_sphinx,1750; //Sphinx base cost
+ set $@kewd_sunkenShip,1000; //Sunken Ship base cost
+ set $@kewd_thanatosTower,15000; //Thanatos Tower base cost
+ set $@kewd_toyFactory,2500; //Toy Factory base cost
+ set $@kewd_turtleIsland,12500; //Turtle Island base cost
+ set $@kewd_umbala,3550; //Umbala Dungeon base cost
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the Pvp Warps Module
+ //-------------------------------------------------------------------------------
+OnLoadWarpPvp:
+ set $@kewp_showOnline,1; //Set to 1 to show online count on pvp maps
+ set $@kewp_advanced,0; //Set to 0 to enable a single group of pvp rooms
+ //(no level restrictions, kewp_cost is used)
+ set $@kewp_cost, 1000; //Cost for Free For All (no level restrictions)
+
+ if ($@kewp_advanced == 0) //Don't touch
+ end;
+
+ set $@kewp_cost1, 100; //Cost of warping to a pvp arena, lvls group 1
+ set $@kewp_cost2, 250; //Cost for lvls group 2
+ set $@kewp_cost3, 500; //Cost for lvls group 3
+ set $@kewp_cost4, 1000; //Cost for lvls group 4
+ set $@kewp_cost5, 2000; //Cost for lvls group 5
+ set $@kewp_cost6, 4000; //Cost for lvls group 6
+ set $@kewp_cost7, 8000; //Cost for lvls group 7
+ set $@kewp_baseLv1, 35; //Level required for pvp, lv1
+ set $@kewp_baseLv2, 45; //Level required for pvp, lv2
+ set $@kewp_baseLv3, 55; //Level required for pvp, lv3
+ set $@kewp_baseLv4, 65; //Level required for pvp, lv4
+ set $@kewp_baseLv5, 75; //Level required for pvp, lv5
+ set $@kewp_baseLv6, 85; //Level required for pvp, lv6
+ set $@kewp_baseLv7, 95; //Level required for pvp, lv7
+ set $@kewp_range, 5; //Range of levels allowed (ie: Warp to Lv1: levels 10+/-5)
+ end;
+ //-------------------------------------------------------------------------------
+ //Config for the WoE Warps Module
+ //-------------------------------------------------------------------------------
+OnLoadWarpWoe:
+ //Note: See ke_warp_woe.txt for instructions on how to unlock the Guild Dungeons.
+ set $@kewg_check,1; //If 0, people don't need to belong to a Guild to warp
+ set $@kewg_checkAgit,1; //If 1, you can't warp until WoE starts
+ set $@kewg_showOnline,0; //Set to 1 to show online count and Castle Status
+ set $@kewg_discount,20; //Kafra Pass discount for WoE warps
+
+ set $@kewg_baldur, 25000; //Guild Dungeon - Baldur
+ set $@kewg_luina, 25000; //Guild Dungeon - Luina
+ set $@kewg_valkyrie, 25000; //Guild Dungeon - Valkyrie
+ set $@kewg_britoniah, 25000; //Guild Dungeon - Britoniah
+
+ set $@kewg_alDeBaran, 2500; //Al De Baran Guild
+ set $@kewg_geffen, 2500; //Geffen Guild
+ set $@kewg_payon, 2500; //Payon Guild
+ set $@kewg_prontera, 2500; //Prontera Guild
+ end;
+ //-------------------------------------------------------------------------------
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt b/npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt
index dc2325ff0..5dbe75677 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/global_functionsKE.txt
@@ -1,332 +1,332 @@
-//===== eAthena Script =======================================
-//= Global functions
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+, RO Ep6+
-//===== Description: =========================================
-//= Global Functions
-//=
-//===== Additional Comments: =================================
-//= GF_getJobName= function for getting a job's name
-//= GF_getJobName2= gets a jobs name modified by Type (see below)
-//= GF_getJobId= gets a jobs number modified by Type (see below)
-//= GF_getJobLevel= identifies novices/1st/2nd among classes
-//= GF_getJobType= identifies normal/advanced/babies classes
-//= - GF_getJobClass= identifies job class (swordie, mage, etc)
-//============================================================
-
-function script GF_getJobName {
-
- switch (getarg(0)) {
-
- case Job_Novice:
- return "novice";
- case Job_Acolyte:
- return "acolyte";
- case Job_Archer:
- return "archer";
- case Job_Mage:
- return "mage";
- case Job_Merchant:
- return "merchant";
- case Job_Swordman:
- return "swordsman";
- case Job_Thief:
- return "thief";
- case Job_Taekwon:
- return "taekwon kid";
- case Job_SuperNovice:
- return "super novice";
-
- case Job_Hunter:
- return "hunter";
- case Job_Dancer:
- return "dancer";
- case Job_Bard:
- return "bard";
- case Job_Priest:
- return "priest";
- case Job_Monk:
- return "monk";
- case Job_Wizard:
- return "wizard";
- case Job_Sage:
- return "sage";
- case Job_BlackSmith:
- return "blacksmith";
- case Job_Alchem:
- return "alchemist";
- case Job_Knight:
- case Job_Knight2:
- return "knight";
- case Job_Crusader:
- case Job_Crusader2:
- return "crusader";
- case Job_Assassin:
- return "assassin";
- case Job_Rogue:
- return "rogue";
- case Job_Star_Gladiator:
- case Job_Star_Gladiator2:
- return "star gladiator";
- case Job_Soul_Linker:
- return "soul linker";
-
- case Job_Novice_High:
- return "high novice";
- case Job_Acolyte_High:
- return "high acolyte";
- case Job_Archer_High:
- return "high archer";
- case Job_Mage_High:
- return "high mage";
- case Job_Merchant_High:
- return "high merchant";
- case Job_Swordman_High:
- return "high swordsman";
- case Job_Thief_High:
- return "high thief";
-
- case Job_Assassin_Cross:
- return "assassin cross";
- case Job_Champion:
- return "champion";
- case Job_Clown:
- return "minstrel";
- case Job_Creator:
- return "biochemist";
- case Job_Gypsy:
- return "gypsy";
- case Job_High_Priest:
- return "high priest";
- case Job_High_Wizard:
- return "high wizard";
- case Job_Lord_Knight:
- case Job_Lord_Knight2:
- return "lord knight";
- case Job_Paladin:
- case Job_Paladin2:
- return "paladin";
- case Job_Professor:
- return "professor";
- case Job_Sniper:
- return "sniper";
- case Job_Stalker:
- return "stalker";
- case Job_Whitesmith:
- return "whitesmith";
-
- case Job_Baby:
- return "baby";
- case Job_Baby_Acolyte:
- return "baby acolyte";
- case Job_Baby_Archer:
- return "baby archer";
- case Job_Baby_Mage:
- return "baby mage";
- case Job_Baby_Merchant:
- return "baby merchant";
- case Job_Baby_Swordman:
- return "baby swordsman";
- case Job_Baby_Thief:
- return "baby thief";
- case Job_Super_Baby:
- return "super baby";
-
- case Job_Baby_Hunter:
- return "baby hunter";
- case Job_Baby_Dancer:
- return "baby dancer";
- case Job_Baby_Bard:
- return "baby bard";
- case Job_Baby_Priest:
- return "baby priest";
- case Job_Baby_Monk:
- return "baby monk";
- case Job_Baby_Wizard:
- return "baby wizard";
- case Job_Baby_Sage:
- return "baby sage";
- case Job_Baby_BlackSmith:
- return "baby blacksmith";
- case Job_Baby_Alchem:
- return "baby alchemist";
- case Job_Baby_Knight:
- case Job_Baby_Knight2:
- return "baby knight";
- case Job_Baby_Crusader:
- case Job_Baby_Crusader2:
- return "baby crusader";
- case Job_Baby_Assassin:
- return "baby assassin";
- case Job_Baby_Rogue:
- return "baby rogue";
- default:
- return "unknown";
- }
-
-}
-
-//Returns job name using two params: JobId and Type
-function script GF_getJobName2 {
- set @classId, callfunc("GF_getJobId", getarg(0), getarg(1));
- return callfunc("GF_getJobName", @classId);
-}
-
-//Returns a Job's ID modified by their Type
-function script GF_getJobId {
- set @classId, getarg(0);
- set @type, getarg(1);
-
- if (@classId == Job_SuperNovice || @classId == Job_Super_Baby) {
- switch (@type) {
- case 0:
- return Job_SuperNovice;
- case 2:
- return Job_Super_Baby;
- default:
- return @classId;
- }
- }
- if (@classId >= Job_Taekwon && @classId <= Job_Soul_Linker) {
- //Currently has no alternates.
- return @classId;
- }
- if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
- set @classId, @classId -Job_Novice_High;
- else
- if (@classId >= Job_Baby && @classId <= Job_Super_Baby)
- set @classId, @classId -Job_Baby;
-
- if (@type == 1)
- set @classId, @classId +Job_Novice_High;
-
- if (@type == 2)
- set @classId, @classId +Job_Baby;
-
- return @classId;
-}
-
-//Returns the type of class:
-//0= Novice, 1= First Class, 2= Second Class, 3= Super Novice
-//4= Wedding
-function script GF_getJobLevel {
-
- set @classId, getarg(0);
-
- if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
- set @classId, @classId -Job_Novice_High;
-
- if (@classId >= Job_Baby && @classId <= Job_Baby_Crusader2)
- set @classId, @classId -Job_Baby;
-
- if(@classId == Job_Novice) {
- return 0;
- }
- if((@classId >= Job_Swordman && @classId <= Job_Thief)
- || @classId == Job_Taekwon) {
- return 1;
- }
- if ((@classId >= Job_Knight && @classId <= Job_Crusader2)
- || (@classId >= Job_Star_Gladiator && @classId <= Job_Soul_Linker)) {
- return 2;
- }
-
- if(@classId == Job_SuperNovice || @classId == Job_Super_Baby) {
- return 3;
- }
- if(@classId == 22) {
- return 4;
- }
- return -1;
-}
-
-//Returns the type of class, based on path:
-//0= Normal Jobs, 1= Upper Jobs, 2= Baby Jobs
-//Works the same as Upper, except you can pass any job id to get it's upper value
-function script GF_getJobType {
- set @classId, getarg(0);
-
- if ((@classId >= Job_Novice && @classId <= Job_SuperNovice)
- || (@classId >= Job_Taekwon && @classId <= Job_Soul_Linker)) {
- return 0;
- }
- if (@classId >= Job_Novice_High && @classId <= Job_Paladin2) {
- return 1;
- }
- if (@classId >= Job_Baby && @classId <= Job_Super_Baby) {
- return 2;
- }
- return -1;
-}
-//Returns the base class of the given job, return values are:
-//Job_Novice (Novice, Baby Novice, Super Novice
-//Job_Acolyte (Aco, Priest, Monk +High/Baby variations)
-//Job_Archer (Archer, Sniper, Bard, Dancer +High/Baby variations)
-//Job_Mage (Mage, Wizard, Sage +High/Baby variations)
-//Job_Swordman (Swordsman, Knight, Crusader +High/Baby variations)
-//Job_Thief (Thief, Assassin, Rogue +High/Baby variations)
-//-1 : others (when wearing Tux/Wedding dress, for example)
-//Works the same as baseClass, except you pass the class which you want
-//examined.
-function script GF_getJobClass {
- set @classId, getarg(0);
-
- if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
- set @classId, @classId -Job_Novice_High;
-
- if (@classId >= Job_Baby && @classId <= Job_Baby_Crusader2)
- set @classId, @classId -Job_Baby;
-
- switch (@classId) {
- case Job_Novice:
- case Job_SuperNovice:
- case Job_Super_Baby:
- return Job_Novice;
-
- case Job_Acolyte:
- case Job_Priest:
- case Job_Monk:
- return Job_Acolyte;
-
- case Job_Archer:
- case Job_Hunter:
- case Job_Bard:
- case Job_Dancer:
- return Job_Archer;
-
- case Job_Mage:
- case Job_Wizard:
- case Job_Sage:
- return Job_Mage;
-
- case Job_Merchant:
- case Job_BlackSmith:
- case Job_Alchem:
- return Job_Merchant;
-
- case Job_Swordman:
- case Job_Knight:
- case Job_Knight2:
- case Job_Paladin:
- case Job_Paladin2:
- return Job_Swordman;
-
- case Job_Thief:
- case Job_Assassin:
- case Job_Rogue:
- return Job_Thief;
-
- case Job_Taekwon:
- case Job_Star_Gladiator:
- case Job_Star_Gladiator2:
- case Job_Soul_Linker:
- return Job_Taekwon;
-
- default:
- return -1;
- }
+//===== eAthena Script =======================================
+//= Global functions
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+, RO Ep6+
+//===== Description: =========================================
+//= Global Functions
+//=
+//===== Additional Comments: =================================
+//= GF_getJobName= function for getting a job's name
+//= GF_getJobName2= gets a jobs name modified by Type (see below)
+//= GF_getJobId= gets a jobs number modified by Type (see below)
+//= GF_getJobLevel= identifies novices/1st/2nd among classes
+//= GF_getJobType= identifies normal/advanced/babies classes
+//= - GF_getJobClass= identifies job class (swordie, mage, etc)
+//============================================================
+
+function script GF_getJobName {
+
+ switch (getarg(0)) {
+
+ case Job_Novice:
+ return "novice";
+ case Job_Acolyte:
+ return "acolyte";
+ case Job_Archer:
+ return "archer";
+ case Job_Mage:
+ return "mage";
+ case Job_Merchant:
+ return "merchant";
+ case Job_Swordman:
+ return "swordsman";
+ case Job_Thief:
+ return "thief";
+ case Job_Taekwon:
+ return "taekwon kid";
+ case Job_SuperNovice:
+ return "super novice";
+
+ case Job_Hunter:
+ return "hunter";
+ case Job_Dancer:
+ return "dancer";
+ case Job_Bard:
+ return "bard";
+ case Job_Priest:
+ return "priest";
+ case Job_Monk:
+ return "monk";
+ case Job_Wizard:
+ return "wizard";
+ case Job_Sage:
+ return "sage";
+ case Job_BlackSmith:
+ return "blacksmith";
+ case Job_Alchem:
+ return "alchemist";
+ case Job_Knight:
+ case Job_Knight2:
+ return "knight";
+ case Job_Crusader:
+ case Job_Crusader2:
+ return "crusader";
+ case Job_Assassin:
+ return "assassin";
+ case Job_Rogue:
+ return "rogue";
+ case Job_Star_Gladiator:
+ case Job_Star_Gladiator2:
+ return "star gladiator";
+ case Job_Soul_Linker:
+ return "soul linker";
+
+ case Job_Novice_High:
+ return "high novice";
+ case Job_Acolyte_High:
+ return "high acolyte";
+ case Job_Archer_High:
+ return "high archer";
+ case Job_Mage_High:
+ return "high mage";
+ case Job_Merchant_High:
+ return "high merchant";
+ case Job_Swordman_High:
+ return "high swordsman";
+ case Job_Thief_High:
+ return "high thief";
+
+ case Job_Assassin_Cross:
+ return "assassin cross";
+ case Job_Champion:
+ return "champion";
+ case Job_Clown:
+ return "minstrel";
+ case Job_Creator:
+ return "biochemist";
+ case Job_Gypsy:
+ return "gypsy";
+ case Job_High_Priest:
+ return "high priest";
+ case Job_High_Wizard:
+ return "high wizard";
+ case Job_Lord_Knight:
+ case Job_Lord_Knight2:
+ return "lord knight";
+ case Job_Paladin:
+ case Job_Paladin2:
+ return "paladin";
+ case Job_Professor:
+ return "professor";
+ case Job_Sniper:
+ return "sniper";
+ case Job_Stalker:
+ return "stalker";
+ case Job_Whitesmith:
+ return "whitesmith";
+
+ case Job_Baby:
+ return "baby";
+ case Job_Baby_Acolyte:
+ return "baby acolyte";
+ case Job_Baby_Archer:
+ return "baby archer";
+ case Job_Baby_Mage:
+ return "baby mage";
+ case Job_Baby_Merchant:
+ return "baby merchant";
+ case Job_Baby_Swordman:
+ return "baby swordsman";
+ case Job_Baby_Thief:
+ return "baby thief";
+ case Job_Super_Baby:
+ return "super baby";
+
+ case Job_Baby_Hunter:
+ return "baby hunter";
+ case Job_Baby_Dancer:
+ return "baby dancer";
+ case Job_Baby_Bard:
+ return "baby bard";
+ case Job_Baby_Priest:
+ return "baby priest";
+ case Job_Baby_Monk:
+ return "baby monk";
+ case Job_Baby_Wizard:
+ return "baby wizard";
+ case Job_Baby_Sage:
+ return "baby sage";
+ case Job_Baby_BlackSmith:
+ return "baby blacksmith";
+ case Job_Baby_Alchem:
+ return "baby alchemist";
+ case Job_Baby_Knight:
+ case Job_Baby_Knight2:
+ return "baby knight";
+ case Job_Baby_Crusader:
+ case Job_Baby_Crusader2:
+ return "baby crusader";
+ case Job_Baby_Assassin:
+ return "baby assassin";
+ case Job_Baby_Rogue:
+ return "baby rogue";
+ default:
+ return "unknown";
+ }
+
+}
+
+//Returns job name using two params: JobId and Type
+function script GF_getJobName2 {
+ set @classId, callfunc("GF_getJobId", getarg(0), getarg(1));
+ return callfunc("GF_getJobName", @classId);
+}
+
+//Returns a Job's ID modified by their Type
+function script GF_getJobId {
+ set @classId, getarg(0);
+ set @type, getarg(1);
+
+ if (@classId == Job_SuperNovice || @classId == Job_Super_Baby) {
+ switch (@type) {
+ case 0:
+ return Job_SuperNovice;
+ case 2:
+ return Job_Super_Baby;
+ default:
+ return @classId;
+ }
+ }
+ if (@classId >= Job_Taekwon && @classId <= Job_Soul_Linker) {
+ //Currently has no alternates.
+ return @classId;
+ }
+ if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
+ set @classId, @classId -Job_Novice_High;
+ else
+ if (@classId >= Job_Baby && @classId <= Job_Super_Baby)
+ set @classId, @classId -Job_Baby;
+
+ if (@type == 1)
+ set @classId, @classId +Job_Novice_High;
+
+ if (@type == 2)
+ set @classId, @classId +Job_Baby;
+
+ return @classId;
+}
+
+//Returns the type of class:
+//0= Novice, 1= First Class, 2= Second Class, 3= Super Novice
+//4= Wedding
+function script GF_getJobLevel {
+
+ set @classId, getarg(0);
+
+ if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
+ set @classId, @classId -Job_Novice_High;
+
+ if (@classId >= Job_Baby && @classId <= Job_Baby_Crusader2)
+ set @classId, @classId -Job_Baby;
+
+ if(@classId == Job_Novice) {
+ return 0;
+ }
+ if((@classId >= Job_Swordman && @classId <= Job_Thief)
+ || @classId == Job_Taekwon) {
+ return 1;
+ }
+ if ((@classId >= Job_Knight && @classId <= Job_Crusader2)
+ || (@classId >= Job_Star_Gladiator && @classId <= Job_Soul_Linker)) {
+ return 2;
+ }
+
+ if(@classId == Job_SuperNovice || @classId == Job_Super_Baby) {
+ return 3;
+ }
+ if(@classId == 22) {
+ return 4;
+ }
+ return -1;
+}
+
+//Returns the type of class, based on path:
+//0= Normal Jobs, 1= Upper Jobs, 2= Baby Jobs
+//Works the same as Upper, except you can pass any job id to get it's upper value
+function script GF_getJobType {
+ set @classId, getarg(0);
+
+ if ((@classId >= Job_Novice && @classId <= Job_SuperNovice)
+ || (@classId >= Job_Taekwon && @classId <= Job_Soul_Linker)) {
+ return 0;
+ }
+ if (@classId >= Job_Novice_High && @classId <= Job_Paladin2) {
+ return 1;
+ }
+ if (@classId >= Job_Baby && @classId <= Job_Super_Baby) {
+ return 2;
+ }
+ return -1;
+}
+//Returns the base class of the given job, return values are:
+//Job_Novice (Novice, Baby Novice, Super Novice
+//Job_Acolyte (Aco, Priest, Monk +High/Baby variations)
+//Job_Archer (Archer, Sniper, Bard, Dancer +High/Baby variations)
+//Job_Mage (Mage, Wizard, Sage +High/Baby variations)
+//Job_Swordman (Swordsman, Knight, Crusader +High/Baby variations)
+//Job_Thief (Thief, Assassin, Rogue +High/Baby variations)
+//-1 : others (when wearing Tux/Wedding dress, for example)
+//Works the same as baseClass, except you pass the class which you want
+//examined.
+function script GF_getJobClass {
+ set @classId, getarg(0);
+
+ if (@classId >= Job_Novice_High && @classId <= Job_Paladin2)
+ set @classId, @classId -Job_Novice_High;
+
+ if (@classId >= Job_Baby && @classId <= Job_Baby_Crusader2)
+ set @classId, @classId -Job_Baby;
+
+ switch (@classId) {
+ case Job_Novice:
+ case Job_SuperNovice:
+ case Job_Super_Baby:
+ return Job_Novice;
+
+ case Job_Acolyte:
+ case Job_Priest:
+ case Job_Monk:
+ return Job_Acolyte;
+
+ case Job_Archer:
+ case Job_Hunter:
+ case Job_Bard:
+ case Job_Dancer:
+ return Job_Archer;
+
+ case Job_Mage:
+ case Job_Wizard:
+ case Job_Sage:
+ return Job_Mage;
+
+ case Job_Merchant:
+ case Job_BlackSmith:
+ case Job_Alchem:
+ return Job_Merchant;
+
+ case Job_Swordman:
+ case Job_Knight:
+ case Job_Knight2:
+ case Job_Paladin:
+ case Job_Paladin2:
+ return Job_Swordman;
+
+ case Job_Thief:
+ case Job_Assassin:
+ case Job_Rogue:
+ return Job_Thief;
+
+ case Job_Taekwon:
+ case Job_Star_Gladiator:
+ case Job_Star_Gladiator2:
+ case Job_Soul_Linker:
+ return Job_Taekwon;
+
+ default:
+ return -1;
+ }
} \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/kafras.txt b/npc/custom/eAAC_Scripts/kafraExpress/kafras.txt
index 739dcc58e..329adf296 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/kafras.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/kafras.txt
@@ -1,296 +1,296 @@
-//===== eAthena Script =======================================
-//= Kafra Express - NPC definitions
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= Any eAthena Version with function support; RO Episode 8+ (LightHalzen)
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Here is where the npcs are defined.
-//===== Additional Comments: =================================
-//= To define your own Kafra, keep in mind the order and meaning
-//= of the arguments for the main function.
-//============================================================
-
-//This is the model for the call: Type is 0 for towns, 1 for dungeons (2 for both)
-//callfunc "F_KafraExpress","NPC Name","Image File", type, "Save Map", Save X, Save Y;
-
-//Town Kafras
-alberta.gat,113,60,5 script Kafra Express::Alberta 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"alberta.gat",116,57;
-}
-
-aldebaran.gat,133,124,5 script Kafra Express::AlDeBaran 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",2,"aldebaran.gat",139,131;
-}
-
-amatsu.gat,201,80,8 script Kafra Express::Amatsu 114,{
- callfunc "F_KafraExpress","Kafra Express","kafra_04",0,"amatsu.gat",197,81;
-}
-
-ayothaya.gat,195,160,8 script Kafra Express::Ayothaya 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",0,"ayothaya.gat",194,173;
-}
-
-comodo.gat,190,153,5 script Kafra Express::Comodo 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"comodo.gat",189,166;
-}
-
-geffen.gat,121,62,8 script Kafra Express::Geffen 113,{
- callfunc "F_KafraExpress","Kafra Express","kafra_05",0,"geffen.gat",119,56;
-}
-
-gonryun.gat,169,188,2 script Kafra Express::GonRyun 117,{
- callfunc "F_KafraExpress","Kafra Express","kafra_01",2,"gonryun.gat",168,199;
-}
-
-einbech.gat,143,243,3 script Kafra Express::Einbech 860,{
- callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"einbech.gat",157,250;
-}
-
-einbroch.gat,58,207,4 script Kafra Express::Einbroch 860,{
- callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"einbroch.gat",64,184;
-}
-
-hugel.gat,101,117,1 script Kafra Express::Hugel 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",0,"hugel.gat",102,109;
-}
-
-izlude.gat,136,94,2 script Kafra Express::Izlude 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",0,"izlude.gat",147,99;
-}
-
-jawaii.gat,208,217,7 script Kafra Express::Jawaii 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"jawaii.gat",213,209;
-}
-
-lighthalzen.gat,165,106,3 script Kafra Express::Lighthalzen 861,{
- callfunc "F_KafraExpress","Kafra Express","kafra_09",0,"lighthalzen.gat",152,106;
-}
-
-louyang.gat,220,123,3 script Kafra Express::LouYang 117,{
- callfunc "F_KafraExpress","Kafra Express","kafra_01",0,"louyang.gat",221,128;
-}
-
-xmas.gat,148,126,4 script Kafra Express::Lutie 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",0,"xmas.gat",149,117;
-}
-
-morocc.gat,156,97,3 script Kafra Express::Morocc 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"morocc.gat",156,91;
-}
-
-niflheim.gat,196,192,3 script Kafra Express::Niflheim 791,{
- callfunc "F_KafraExpress","Kafra Express","",3,"niflheim.gat",194,185;
-}
-
-payon.gat,152,181,5 script Kafra Express::Payon 114,{
- callfunc "F_KafraExpress","Kafra Express","kafra_04",0,"payon.gat",162,182;
-}
-
-prontera.gat,147,177,7 script Kafra Express::Prontera 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"prontera.gat",156,195;
-}
-
-umbala.gat,89,159,4 script Kafra Express::Umbala 860,{
- callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"umbala.gat",91,159;
-}
-
-yuno.gat,159,87,5 script Kafra Express::Yuno 861,{
- callfunc "F_KafraExpress","Kafra Express","kafra_09",0,"yuno.gat",159,52;
-}
-
-//Dungeon Kafras
-//Abyss Lake
-hu_fild05.gat,170,305,7 script Kafra Express::D_Abyss 861,{
- callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"hu_fild05.gat",160,302;
-}
-
-//Amatsu D
-ama_in02.gat,115,184,6 script Kafra Express::D_Amatsu 117,{
- callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"ama_in02.gat",118,184;
-}
-
-//AntHell North
-moc_fild04.gat,208,323,1 script Kafra Express::D_Anthell1 114,{
- callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"moc_fild04.gat",207,332;
-}
-
-//AntHell South
-moc_fild15.gat,251,243,3 script Kafra Express::D_Anthell2 114,{
- callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"moc_fild15.gat",246,251;
-}
-
-//Ayothaya Dungeon
-ayo_fild02.gat,289,144,3 script Kafra Express::D_Ayothaya 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"ayo_fild02.gat",289,155;
-}
-
-//Byalan Island
-izlu2dun.gat,101,82,7 script Kafra Express::D_Byalan 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"izlu2dun.gat",112,84;
-}
-
-//Comodo East Cave
-cmd_fild01.gat,33,321,4 script Kafra Express::D_ComodoE 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"cmd_fild01.gat",34,325;
-}
-
-//Comodo West Cave
-comodo.gat,31,218,4 script Kafra Express::D_ComodoW 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"comodo.gat",32,209;
-}
-
-//Comodo North Cave
-comodo.gat,182,347,2 script Kafra Express::D_ComodoN 721,{
- callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"comodo.gat",180,352;
-}
-
-//Coal Mines
-mjolnir_02.gat,83,364,4 script Kafra Express::D_Coal 861,{
- callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"mjolnir_02.gat",89,358;
-}
-
-//Culvert
-prt_fild05.gat,275,219,5 script Kafra Express::D_Culvert 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"prt_fild05.gat",274,208;
-}
-
-//Gefenia
-gefenia01.gat,56,171,6 script Kafra Express::D_Gefenia1 861,{
- callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"gefenia01.gat",59,169;
-}
-
-//Geffen Dungeon
-gef_tower.gat,156,33,3 script Kafra Express::D_Geffen 113,{
- callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"gef_tower.gat",147,35;
-}
-
-//GH: Church
-glast_01.gat,193,136,5 script Kafra Express::D_GHChurch 791,{
- callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",206,136;
-}
-
-//GH: Castle
-glast_01.gat,200,350,4 script Kafra Express::D_GHCastle 791,{
- callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",200,347;
-}
-
-//GH: Staircase
-glast_01.gat,58,103,7 script Kafra Express::D_GHStair 791,{
- callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",62,107;
-}
-
-//GH: Chivalry
-glast_01.gat,62,198,6 script Kafra Express::D_GHChivalry 791,{
- callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",69,193;
-}
-
-//LightHalzen Rekkenber (Sewer Entrance)
-lighthalzen.gat,311,293,1 script Kafra Express::D_Lhz 860,{
- callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"lighthalzen.gat",301,286;
-}
-
-//LightHalzen Rekkenber (Rekkenber Entrance)(
-//lighthalzen.gat,69,57,7 script Kafra Express::D_Lhz 860,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"lighthalzen.gat",78,57;
-//}
-
-//Juperos
-jupe_cave.gat,45,55,5 script Kafra Express::D_Juperos 860,{
- callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"jupe_cave.gat",45,48;
-}
-
-//Laberynth
-prt_fild01.gat,143,365,3 script Kafra Express::D_Maze 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"prt_fild01.gat",136,361;
-}
-
-//LouYang D
-louyang.gat,35,276,6 script Kafra Express::D_Louyang 117,{
- callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"louyang.gat",41,267;
-}
-
-//Magma D
-yuno_fild03.gat,34,143,5 script Kafra Express::D_Magma 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"yuno_fild03.gat",35,135;
-}
-
-//Orc D North
-in_orcs01.gat,24,165,5 script Kafra Express::D_OrcsN 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"in_orcs01.gat",34,165;
-}
-
-//Orc D South
-in_orcs01.gat,103,99,5 script Kafra Express::D_OrcsS 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"in_orcs01.gat",112,99;
-}
-
-//Payon D
-pay_arche.gat,38,138,6 script Kafra Express::D_Payon 112,{
- callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"pay_arche.gat",41,133;
-}
-
-//Pyramids D
-moc_ruins.gat,60,166,5 script Kafra Express::D_Pyramid 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"moc_ruins.gat",62,162;
-}
-
-//Sphinx D
-moc_fild19.gat,106,97,8 script Kafra Express::D_Sphinx 115,{
- callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"moc_fild19.gat",107,100;
-}
-
-//Sunken Ship
-alb2trea.gat,75,101,5 script Kafra Express::D_Sunken 114,{
- callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"alb2trea.gat",87,103;
-}
-
-//Thanatos Tower
-tha_scene01.gat,139,194,0 script Kafra Express::D_Thanatos 113,{
- callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tha_scene01.gat",132,220;
-}
-
-//Toy Factory
-xmas.gat,138,307,6 script Kafra Express::D_Toy 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"xmas.gat",144,306;
-}
-
-//Turtle Cave Entrance
-tur_dun01.gat,147,237,6 script Kafra Express::D_TCave 113,{
- callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tur_dun01.gat",155,234;
-}
-
-//Turtle Island Entrance
-tur_dun01.gat,148,54,6 script Kafra Express::D_TIsland 113,{
- callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tur_dun01.gat",153,47;
-}
-
-//Umbala D
-umbala.gat,120,284,3 script Kafra Express::D_Umbala 117,{
- callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"umbala.gat",113,282;
-}
-
-//Guild War Kafras: Disabled by Default!
-
-//Al De Baran Guild Grounds
-//alde_gld.gat,156,165,3 script Kafra Express::G_AlDeBaran 116,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"alde_gld.gat",156,157;
-//}
-
-//Geffen Guild Grounds
-//gef_fild13.gat,237,182,6 script Kafra Express::G_Geffen 113,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"gef_fild13.gat",231,181;
-//}
-
-//Payon Guild Grounds
-//pay_gld.gat,243,172,6 script Kafra Express::G_Payon 117,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"pay_gld.gat",243,178;
-//}
-
-//Prontera Guild Grounds
-//prt_gld.gat,127,163,5 script Kafra Express::G_Prontera 115,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"prt_gld.gat",129,170;
-//}
+//===== eAthena Script =======================================
+//= Kafra Express - NPC definitions
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= Any eAthena Version with function support; RO Episode 8+ (LightHalzen)
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Here is where the npcs are defined.
+//===== Additional Comments: =================================
+//= To define your own Kafra, keep in mind the order and meaning
+//= of the arguments for the main function.
+//============================================================
+
+//This is the model for the call: Type is 0 for towns, 1 for dungeons (2 for both)
+//callfunc "F_KafraExpress","NPC Name","Image File", type, "Save Map", Save X, Save Y;
+
+//Town Kafras
+alberta.gat,113,60,5 script Kafra Express::Alberta 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"alberta.gat",116,57;
+}
+
+aldebaran.gat,133,124,5 script Kafra Express::AlDeBaran 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",2,"aldebaran.gat",139,131;
+}
+
+amatsu.gat,201,80,8 script Kafra Express::Amatsu 114,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_04",0,"amatsu.gat",197,81;
+}
+
+ayothaya.gat,195,160,8 script Kafra Express::Ayothaya 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",0,"ayothaya.gat",194,173;
+}
+
+comodo.gat,190,153,5 script Kafra Express::Comodo 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"comodo.gat",189,166;
+}
+
+geffen.gat,121,62,8 script Kafra Express::Geffen 113,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_05",0,"geffen.gat",119,56;
+}
+
+gonryun.gat,169,188,2 script Kafra Express::GonRyun 117,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_01",2,"gonryun.gat",168,199;
+}
+
+einbech.gat,143,243,3 script Kafra Express::Einbech 860,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"einbech.gat",157,250;
+}
+
+einbroch.gat,58,207,4 script Kafra Express::Einbroch 860,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"einbroch.gat",64,184;
+}
+
+hugel.gat,101,117,1 script Kafra Express::Hugel 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",0,"hugel.gat",102,109;
+}
+
+izlude.gat,136,94,2 script Kafra Express::Izlude 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",0,"izlude.gat",147,99;
+}
+
+jawaii.gat,208,217,7 script Kafra Express::Jawaii 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"jawaii.gat",213,209;
+}
+
+lighthalzen.gat,165,106,3 script Kafra Express::Lighthalzen 861,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_09",0,"lighthalzen.gat",152,106;
+}
+
+louyang.gat,220,123,3 script Kafra Express::LouYang 117,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_01",0,"louyang.gat",221,128;
+}
+
+xmas.gat,148,126,4 script Kafra Express::Lutie 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",0,"xmas.gat",149,117;
+}
+
+morocc.gat,156,97,3 script Kafra Express::Morocc 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",0,"morocc.gat",156,91;
+}
+
+niflheim.gat,196,192,3 script Kafra Express::Niflheim 791,{
+ callfunc "F_KafraExpress","Kafra Express","",3,"niflheim.gat",194,185;
+}
+
+payon.gat,152,181,5 script Kafra Express::Payon 114,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_04",0,"payon.gat",162,182;
+}
+
+prontera.gat,147,177,7 script Kafra Express::Prontera 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"prontera.gat",156,195;
+}
+
+umbala.gat,89,159,4 script Kafra Express::Umbala 860,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_08",0,"umbala.gat",91,159;
+}
+
+yuno.gat,159,87,5 script Kafra Express::Yuno 861,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_09",0,"yuno.gat",159,52;
+}
+
+//Dungeon Kafras
+//Abyss Lake
+hu_fild05.gat,170,305,7 script Kafra Express::D_Abyss 861,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"hu_fild05.gat",160,302;
+}
+
+//Amatsu D
+ama_in02.gat,115,184,6 script Kafra Express::D_Amatsu 117,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"ama_in02.gat",118,184;
+}
+
+//AntHell North
+moc_fild04.gat,208,323,1 script Kafra Express::D_Anthell1 114,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"moc_fild04.gat",207,332;
+}
+
+//AntHell South
+moc_fild15.gat,251,243,3 script Kafra Express::D_Anthell2 114,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"moc_fild15.gat",246,251;
+}
+
+//Ayothaya Dungeon
+ayo_fild02.gat,289,144,3 script Kafra Express::D_Ayothaya 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"ayo_fild02.gat",289,155;
+}
+
+//Byalan Island
+izlu2dun.gat,101,82,7 script Kafra Express::D_Byalan 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"izlu2dun.gat",112,84;
+}
+
+//Comodo East Cave
+cmd_fild01.gat,33,321,4 script Kafra Express::D_ComodoE 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"cmd_fild01.gat",34,325;
+}
+
+//Comodo West Cave
+comodo.gat,31,218,4 script Kafra Express::D_ComodoW 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"comodo.gat",32,209;
+}
+
+//Comodo North Cave
+comodo.gat,182,347,2 script Kafra Express::D_ComodoN 721,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_07",1,"comodo.gat",180,352;
+}
+
+//Coal Mines
+mjolnir_02.gat,83,364,4 script Kafra Express::D_Coal 861,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"mjolnir_02.gat",89,358;
+}
+
+//Culvert
+prt_fild05.gat,275,219,5 script Kafra Express::D_Culvert 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"prt_fild05.gat",274,208;
+}
+
+//Gefenia
+gefenia01.gat,56,171,6 script Kafra Express::D_Gefenia1 861,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_09",1,"gefenia01.gat",59,169;
+}
+
+//Geffen Dungeon
+gef_tower.gat,156,33,3 script Kafra Express::D_Geffen 113,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"gef_tower.gat",147,35;
+}
+
+//GH: Church
+glast_01.gat,193,136,5 script Kafra Express::D_GHChurch 791,{
+ callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",206,136;
+}
+
+//GH: Castle
+glast_01.gat,200,350,4 script Kafra Express::D_GHCastle 791,{
+ callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",200,347;
+}
+
+//GH: Staircase
+glast_01.gat,58,103,7 script Kafra Express::D_GHStair 791,{
+ callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",62,107;
+}
+
+//GH: Chivalry
+glast_01.gat,62,198,6 script Kafra Express::D_GHChivalry 791,{
+ callfunc "F_KafraExpress","Kafra Express","",1,"glast_01.gat",69,193;
+}
+
+//LightHalzen Rekkenber (Sewer Entrance)
+lighthalzen.gat,311,293,1 script Kafra Express::D_Lhz 860,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"lighthalzen.gat",301,286;
+}
+
+//LightHalzen Rekkenber (Rekkenber Entrance)(
+//lighthalzen.gat,69,57,7 script Kafra Express::D_Lhz 860,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"lighthalzen.gat",78,57;
+//}
+
+//Juperos
+jupe_cave.gat,45,55,5 script Kafra Express::D_Juperos 860,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_08",1,"jupe_cave.gat",45,48;
+}
+
+//Laberynth
+prt_fild01.gat,143,365,3 script Kafra Express::D_Maze 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"prt_fild01.gat",136,361;
+}
+
+//LouYang D
+louyang.gat,35,276,6 script Kafra Express::D_Louyang 117,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"louyang.gat",41,267;
+}
+
+//Magma D
+yuno_fild03.gat,34,143,5 script Kafra Express::D_Magma 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"yuno_fild03.gat",35,135;
+}
+
+//Orc D North
+in_orcs01.gat,24,165,5 script Kafra Express::D_OrcsN 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"in_orcs01.gat",34,165;
+}
+
+//Orc D South
+in_orcs01.gat,103,99,5 script Kafra Express::D_OrcsS 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"in_orcs01.gat",112,99;
+}
+
+//Payon D
+pay_arche.gat,38,138,6 script Kafra Express::D_Payon 112,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_06",1,"pay_arche.gat",41,133;
+}
+
+//Pyramids D
+moc_ruins.gat,60,166,5 script Kafra Express::D_Pyramid 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"moc_ruins.gat",62,162;
+}
+
+//Sphinx D
+moc_fild19.gat,106,97,8 script Kafra Express::D_Sphinx 115,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"moc_fild19.gat",107,100;
+}
+
+//Sunken Ship
+alb2trea.gat,75,101,5 script Kafra Express::D_Sunken 114,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_04",1,"alb2trea.gat",87,103;
+}
+
+//Thanatos Tower
+tha_scene01.gat,139,194,0 script Kafra Express::D_Thanatos 113,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tha_scene01.gat",132,220;
+}
+
+//Toy Factory
+xmas.gat,138,307,6 script Kafra Express::D_Toy 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"xmas.gat",144,306;
+}
+
+//Turtle Cave Entrance
+tur_dun01.gat,147,237,6 script Kafra Express::D_TCave 113,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tur_dun01.gat",155,234;
+}
+
+//Turtle Island Entrance
+tur_dun01.gat,148,54,6 script Kafra Express::D_TIsland 113,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"tur_dun01.gat",153,47;
+}
+
+//Umbala D
+umbala.gat,120,284,3 script Kafra Express::D_Umbala 117,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"umbala.gat",113,282;
+}
+
+//Guild War Kafras: Disabled by Default!
+
+//Al De Baran Guild Grounds
+//alde_gld.gat,156,165,3 script Kafra Express::G_AlDeBaran 116,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_02",1,"alde_gld.gat",156,157;
+//}
+
+//Geffen Guild Grounds
+//gef_fild13.gat,237,182,6 script Kafra Express::G_Geffen 113,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_05",1,"gef_fild13.gat",231,181;
+//}
+
+//Payon Guild Grounds
+//pay_gld.gat,243,172,6 script Kafra Express::G_Payon 117,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_01",1,"pay_gld.gat",243,178;
+//}
+
+//Prontera Guild Grounds
+//prt_gld.gat,127,163,5 script Kafra Express::G_Prontera 115,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"prt_gld.gat",129,170;
+//}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt
index 9594dae47..6ad0c2d50 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_bank.txt
@@ -1,175 +1,175 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Bank Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.7
-//===== Compatible With: =====================================
-//= eAthena SVN R3524+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers banking services with daily interests, and
-//= withdrawal/deposit fees.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_bank -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadBank";
- end;
-}
-
-function script F_keBank {
-
- function SF_calcInterest;
- SF_calcInterest();
-
- do {
- set @feeD,callfunc("F_keCost",$@kebk_depositCost,100);
- set @maxDep,Zeny;
- if (@maxDep > $@kebk_maxTransact)
- set @maxDep,$@kebk_maxTransact;
- if (#ke_bank + @maxDep > $@kebk_capacity)
- set @maxDep,$@kebk_capacity-#ke_bank;
-
- set @feeW,callfunc("F_keCost",$@kebk_withdrawCost,100);
- set @maxWith,#ke_bank-(#ke_bank*@feeW/100);
- if (@maxWith > $@kebk_maxTransact)
- set @maxWith,$@kebk_maxTransact;
-
- if (#ke_bank < $@kebk_capacity) {
- set @kmenu, select(
- "- Return (balance is "+#ke_bank+"z)",
- "- Deposit (up to "+@maxDep+"z - "+@feeD+"% fee)",
- "- Withdraw (up to "+@maxWith+"z + "+@feeW+"% fee)",
- "- Transfer from 1st B.o.P. ("+#bankstorage+"z)",
- "- Transfer from 2nd B.o.P. ("+#kafrabank+"z)"
- );
- } else {
- set @kmenu, select(
- "- Return (balance is "+#ke_bank+"z)",
- "- Withdraw (up to "+@maxWith+"z + "+@feeW+"% fee)",
- "- Transfer from 1st B.o.P. ("+#bankstorage+"z)",
- "- Transfer from 2nd B.o.P. ("+#kafrabank+"z)"
- );
- if (@kmenu > 1)
- set @kmenu, @kmenu+1;
- }
- switch (@kmenu) {
- case 2: //Deposit
- input @amount;
- if (@amount < $@kebk_minTransact) {
- callfunc "F_keIntro", -1, "Sorry, the minimum transaction value is "+$@kebk_minTransact+"z.";
- break;
- }
- if (@amount > @maxDep) {
- callfunc "F_keIntro", e_an, "You can't deposit that quantity!";
- break;
- }
- set #ke_bank,#ke_bank+@amount-(@amount*@feeD/100);
- if ($@kebk_useGlobalBank)
- set $ke_globalbank, $ke_globalbank +@amount*@feeD/100;
- set Zeny,Zeny-@amount;
- emotion e_cash;
- break;
-
- case 3: //Withdraw
- input @amount;
- if (@amount < $@kebk_minTransact) {
- callfunc "F_keIntro", -1, "Sorry, the minimum transaction value is "+$@kebk_minTransact+"z.";
- break;
- }
- if (@amount > @maxWith) {
- callfunc "F_keIntro", e_X, "You can't withdraw that quantity!";
- break;
- }
- set #ke_bank,#ke_bank-@amount-(@amount*@feeW/100);
- if ($@kebk_useGlobalBank)
- set $ke_globalbank, $ke_globalbank +@amount*@feeW/100;
- set Zeny,Zeny+@amount;
- emotion e_oh;
- break;
-
- case 4: //1st B.o.P.
- if (#bankstorage==0) {
- callfunc "F_keIntro", -1, "Sorry, there is nothing left to transfer.";
- break;
- }
- callfunc "F_keIntro", -1, #bankstorage+"z have been transferred from your account in the First Bank of Prontera.";
- set #ke_bank,#ke_bank+#bankstorage;
- set #bankstorage,0;
- break;
-
- case 5: //2nd B.o.P.
- if (#kafrabank==0) {
- callfunc "F_keIntro", -1, "Sorry, there is nothing left to transfer.";
- break;
- }
- callfunc "F_keIntro", -1, #kafrabank+"z have been transferred from your account in the Second Bank of Prontera.";
- set #ke_bank,#ke_bank+#kafrabank;
- set #kafrabank,0;
- break;
- }
- } while (@kmenu > 1);
-return;
-
-//Subfunction: SF_calcInterest
-//Calculates the interests gained on the account. Uses 30-day months
-function SF_calcInterest {
- set @day,gettime(5);
- if (@day>30)
- set @day,30; //Use 30 day-months
- set @month,gettime(6);
- if (#ke_banktick == 0) { //Init bank.
- set #ke_banktick,gettime(6)*30+@day;
- if ($@kebk_monMaintenance < 1) return;
- set #ke_bankmtick,@month;
- return;
- }
- set @banktick,gettime(6)*30+@day;
- if (@banktick == #ke_banktick) return;
- if (@banktick < #ke_banktick) { //Year change.
- do {
- set #ke_banktick,#ke_banktick-360;
- if ($@kebk_monMaintenance > 0) set #ke_bankmtick,#ke_bankmtick-12;
- } while (@banktick < #ke_banktick);
- }
- if ($@kebk_monMaintenance > 0 && #ke_bankmtick < @month){ //Month change
- set @qty,0;
- do {
- if (#ke_bank < $@kebk_monMaintenance) {
- if (@qty>0)
- mes "You've been charged "+@qty+"z for account maintenance, but it was not enough.";
- if ($@kebk_useGlobalBank)
- set $ke_globalbank, $ke_globalbank + @qty;
- mes "You owe the Bank "+($@kebk_monMaintenance*(#ke_bankmtick-@month))+"z for maintenance costs. Until paid you won't earn interests...";
- return;
- }
- set @qty, @qty+$@kebk_monMaintenance;
- set #ke_bankmtick,#ke_bankmtick+1;
- set #ke_bank, #ke_bank-$@kebk_monMaintenance;
- } while (#ke_bankmtick < @month);
- mes "You've been charged "+@qty+"z for account maintenance.";
- if ($@kebk_useGlobalBank)
- set $ke_globalbank, $ke_globalbank + @qty;
- }
- set @qty,0;
- if (#ke_bank > $@kebk_monMaintenance && #ke_bank < $@kebk_capacity)
- set @qty,#ke_bank*$@kebk_dayInterest*(@banktick-#ke_banktick)/10000;
- set #ke_banktick,@banktick;
- if (@qty == 0) return;
- if (@qty < 0) {
- callfunc "F_keIntro", -1, "Sorry, your gained interests have been cancelled for being way too much.";
- return;
- }
- if (#ke_bank + @qty > $@kebk_capacity)
- set #ke_bank, $@kebk_capacity;
- else
- set #ke_bank,#ke_bank+@qty;
-
- callfunc "F_keIntro", -1, "Since your last visit, you've earned an interest of "+@qty+"z!";
-} //SF end
-
-}
-
+//===== eAthena Script =======================================
+//= Kafra Express - Bank Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.7
+//===== Compatible With: =====================================
+//= eAthena SVN R3524+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers banking services with daily interests, and
+//= withdrawal/deposit fees.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_bank -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadBank";
+ end;
+}
+
+function script F_keBank {
+
+ function SF_calcInterest;
+ SF_calcInterest();
+
+ do {
+ set @feeD,callfunc("F_keCost",$@kebk_depositCost,100);
+ set @maxDep,Zeny;
+ if (@maxDep > $@kebk_maxTransact)
+ set @maxDep,$@kebk_maxTransact;
+ if (#ke_bank + @maxDep > $@kebk_capacity)
+ set @maxDep,$@kebk_capacity-#ke_bank;
+
+ set @feeW,callfunc("F_keCost",$@kebk_withdrawCost,100);
+ set @maxWith,#ke_bank-(#ke_bank*@feeW/100);
+ if (@maxWith > $@kebk_maxTransact)
+ set @maxWith,$@kebk_maxTransact;
+
+ if (#ke_bank < $@kebk_capacity) {
+ set @kmenu, select(
+ "- Return (balance is "+#ke_bank+"z)",
+ "- Deposit (up to "+@maxDep+"z - "+@feeD+"% fee)",
+ "- Withdraw (up to "+@maxWith+"z + "+@feeW+"% fee)",
+ "- Transfer from 1st B.o.P. ("+#bankstorage+"z)",
+ "- Transfer from 2nd B.o.P. ("+#kafrabank+"z)"
+ );
+ } else {
+ set @kmenu, select(
+ "- Return (balance is "+#ke_bank+"z)",
+ "- Withdraw (up to "+@maxWith+"z + "+@feeW+"% fee)",
+ "- Transfer from 1st B.o.P. ("+#bankstorage+"z)",
+ "- Transfer from 2nd B.o.P. ("+#kafrabank+"z)"
+ );
+ if (@kmenu > 1)
+ set @kmenu, @kmenu+1;
+ }
+ switch (@kmenu) {
+ case 2: //Deposit
+ input @amount;
+ if (@amount < $@kebk_minTransact) {
+ callfunc "F_keIntro", -1, "Sorry, the minimum transaction value is "+$@kebk_minTransact+"z.";
+ break;
+ }
+ if (@amount > @maxDep) {
+ callfunc "F_keIntro", e_an, "You can't deposit that quantity!";
+ break;
+ }
+ set #ke_bank,#ke_bank+@amount-(@amount*@feeD/100);
+ if ($@kebk_useGlobalBank)
+ set $ke_globalbank, $ke_globalbank +@amount*@feeD/100;
+ set Zeny,Zeny-@amount;
+ emotion e_cash;
+ break;
+
+ case 3: //Withdraw
+ input @amount;
+ if (@amount < $@kebk_minTransact) {
+ callfunc "F_keIntro", -1, "Sorry, the minimum transaction value is "+$@kebk_minTransact+"z.";
+ break;
+ }
+ if (@amount > @maxWith) {
+ callfunc "F_keIntro", e_X, "You can't withdraw that quantity!";
+ break;
+ }
+ set #ke_bank,#ke_bank-@amount-(@amount*@feeW/100);
+ if ($@kebk_useGlobalBank)
+ set $ke_globalbank, $ke_globalbank +@amount*@feeW/100;
+ set Zeny,Zeny+@amount;
+ emotion e_oh;
+ break;
+
+ case 4: //1st B.o.P.
+ if (#bankstorage==0) {
+ callfunc "F_keIntro", -1, "Sorry, there is nothing left to transfer.";
+ break;
+ }
+ callfunc "F_keIntro", -1, #bankstorage+"z have been transferred from your account in the First Bank of Prontera.";
+ set #ke_bank,#ke_bank+#bankstorage;
+ set #bankstorage,0;
+ break;
+
+ case 5: //2nd B.o.P.
+ if (#kafrabank==0) {
+ callfunc "F_keIntro", -1, "Sorry, there is nothing left to transfer.";
+ break;
+ }
+ callfunc "F_keIntro", -1, #kafrabank+"z have been transferred from your account in the Second Bank of Prontera.";
+ set #ke_bank,#ke_bank+#kafrabank;
+ set #kafrabank,0;
+ break;
+ }
+ } while (@kmenu > 1);
+return;
+
+//Subfunction: SF_calcInterest
+//Calculates the interests gained on the account. Uses 30-day months
+function SF_calcInterest {
+ set @day,gettime(5);
+ if (@day>30)
+ set @day,30; //Use 30 day-months
+ set @month,gettime(6);
+ if (#ke_banktick == 0) { //Init bank.
+ set #ke_banktick,gettime(6)*30+@day;
+ if ($@kebk_monMaintenance < 1) return;
+ set #ke_bankmtick,@month;
+ return;
+ }
+ set @banktick,gettime(6)*30+@day;
+ if (@banktick == #ke_banktick) return;
+ if (@banktick < #ke_banktick) { //Year change.
+ do {
+ set #ke_banktick,#ke_banktick-360;
+ if ($@kebk_monMaintenance > 0) set #ke_bankmtick,#ke_bankmtick-12;
+ } while (@banktick < #ke_banktick);
+ }
+ if ($@kebk_monMaintenance > 0 && #ke_bankmtick < @month){ //Month change
+ set @qty,0;
+ do {
+ if (#ke_bank < $@kebk_monMaintenance) {
+ if (@qty>0)
+ mes "You've been charged "+@qty+"z for account maintenance, but it was not enough.";
+ if ($@kebk_useGlobalBank)
+ set $ke_globalbank, $ke_globalbank + @qty;
+ mes "You owe the Bank "+($@kebk_monMaintenance*(#ke_bankmtick-@month))+"z for maintenance costs. Until paid you won't earn interests...";
+ return;
+ }
+ set @qty, @qty+$@kebk_monMaintenance;
+ set #ke_bankmtick,#ke_bankmtick+1;
+ set #ke_bank, #ke_bank-$@kebk_monMaintenance;
+ } while (#ke_bankmtick < @month);
+ mes "You've been charged "+@qty+"z for account maintenance.";
+ if ($@kebk_useGlobalBank)
+ set $ke_globalbank, $ke_globalbank + @qty;
+ }
+ set @qty,0;
+ if (#ke_bank > $@kebk_monMaintenance && #ke_bank < $@kebk_capacity)
+ set @qty,#ke_bank*$@kebk_dayInterest*(@banktick-#ke_banktick)/10000;
+ set #ke_banktick,@banktick;
+ if (@qty == 0) return;
+ if (@qty < 0) {
+ callfunc "F_keIntro", -1, "Sorry, your gained interests have been cancelled for being way too much.";
+ return;
+ }
+ if (#ke_bank + @qty > $@kebk_capacity)
+ set #ke_bank, $@kebk_capacity;
+ else
+ set #ke_bank,#ke_bank+@qty;
+
+ callfunc "F_keIntro", -1, "Since your last visit, you've earned an interest of "+@qty+"z!";
+} //SF end
+
+}
+
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt
index 669942e72..ad7a02c4b 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_broadcast.txt
@@ -1,224 +1,224 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Broadcasting Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 3.0
-//===== Compatible With: =====================================
-//= eAthena SVN3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers broadcasting for party requests, pvp, general
-//= and anonymous. Broadcasts can be to the current map
-//= or server-wide
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= For the PVP broadcasts, variables from the Pvp Warping
-//= Module are used.
-//============================================================
-
-- script keInit_broadcast -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadBroadcast";
- end;
-}
-
-//Function F_keBroadcast(String currentMapName)
-function script F_keBroadcast {
-
- function SF_calcPrice;
- function SF_broadcasts;
- function SF_bcPvp;
- function SF_doBroadcast;
-
- if ($@kebc_showOnline) {
- set @kmenu, select(
- "- Return",
- "- Map Broadcasts ("+getarg(0)+"/"+getmapusers(getarg(0))+" "+$@ked_users$+")",
- "- Global Broadcasts ("+getusers(1)+" "+$@ked_users$+")"
- );
- } else {
- set @kmenu, select(
- "- Return",
- "- Map Broadcasts ("+getarg(0)+")",
- "- Global Broadcasts"
- );
- }
- switch(@kmenu) {
- case 2:
- SF_calcPrice(0);
- set @map$,getarg(0);
- SF_broadcasts("Map ("+getarg(0)+")");
- break;
- case 3:
- SF_calcPrice(1);
- set @map$,"";
- SF_broadcasts("Global");
- break;
- }
-return;
-
-//Sub Function SF_broadcasts: Handles main broadcast menu.
-function SF_broadcasts {
-
- do {
- switch (select (
- "- Cancel "+getarg(0)+" Broadcast",
- "- Party request Broadcast ("+@partycost+"z)",
- "- PvP challenge Broadcast ("+@pvpcost+"z)",
- "- General Broadcast ("+@cost+"z)",
- "- General Anonymous Broadcast ("+@anoncost+"z)"
- )) {
- case 2: //Party
- SF_doBroadcast $@kebc_partyCost,@map$,"The "+callfunc("GF_getJobName",class)+" "+strcharinfo(0)+" (levels "+baselevel+"/"+joblevel+") is looking for a party to join.",0;
- break;
- case 3: //Pvp
- if ($@kewp_advanced == 0)
- SF_bcPvp $@kebc_pvpCost,@map$,0,0;
- else {
- do {
- set @kmenu, select (
- "- Cancel",
- "- advertise all levels rooms",
- "- advertise levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" rooms",
- "- advertise levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" rooms"
- );
- switch (@kmenu) {
- case 2: //All levels
- SF_bcPvp $@kebc_pvpCost,@map$,0,0;
- break;
- case 3: //Lv1
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv1-$@kewp_range,$@kewp_baseLv1+$@kewp_range;
- break;
- case 4: //Lv2
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv2-$@kewp_range,$@kewp_baseLv2+$@kewp_range;
- break;
- case 5: //Lv3
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv3-$@kewp_range,$@kewp_baseLv3+$@kewp_range;
- break;
- case 6: //Lv4
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv4-$@kewp_range,$@kewp_baseLv4+$@kewp_range;
- break;
- case 7: //Lv5
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv5-$@kewp_range,$@kewp_baseLv5+$@kewp_range;
- break;
- case 8: //Lv6
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv6-$@kewp_range,$@kewp_baseLv6+$@kewp_range;
- break;
- case 9: //Lv7
- SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv7-$@kewp_range,$@kewp_baseLv7+$@kewp_range;
- break;
- default:
- break;
- }
- } while (@kmenu > 1);
- }
- break;
- case 4: //General
- SF_doBroadcast $@kebc_cost,@map$,"(From "+strcharinfo(0)+") ",1;
- break;
- case 5: //Anonymous
- SF_doBroadcast $@kebc_anonCost,@map$,"(Anonymous) ",1;
- break;
- default:
- return;
- }
- } while (1);
-} //SF_ end
-
-//SubFunction: Calculates prices for Broadcast services (argument 0 == 1 for global bc, 0 for map bc
-function SF_calcPrice {
- set @partycost,callfunc("F_keCost",$@kebc_partyCost,$@kebc_discount);
- set @pvpcost,callfunc("F_keCost",$@kebc_pvpCost,$@kebc_discount);
- set @cost,callfunc("F_keCost",$@kebc_cost,$@kebc_discount);
- set @anoncost,callfunc("F_keCost",$@kebc_anonCost,$@kebc_discount);
- if (getarg(0)) { //Global fix
- set @partycost,@partycost*$@kebc_globalFactor/100;
- set @pvpcost,@pvpcost*$@kebc_globalFactor/100;
- set @cost,@cost*$@kebc_globalFactor/100;
- set @anoncost,@anoncost*$@kebc_globalFactor/100;
- }
-} //SF_ end
-
-//SubFunction SF_doBroadcast(int cost, String map, String message, int input)
-//If map is "", do a global broadcast
-//If input is 1, concat a user string to message.
-function SF_doBroadcast {
- set @cost, getarg(0);
- if (getarg(1)=="")
- set @cost, @cost*$@kebc_globalFactor/100;
- if (getarg(3)) { //Input message
- input @msg$;
- set @msg$,getarg(2)+@msg$;
- } else
- set @msg$,getarg(2);
-
- mes "Broadcast '"+@msg$+"'?";
- switch (select(
- "- Cancel Broadcast",
- "- Broadcast Message"
- )) {
- case 2:
- if (!(callfunc("F_keCharge",@cost,$@kebc_discount,1))) {
- callfunc "F_keIntro", e_pif, "You don't have enough Zeny...";
- return;
- }
-
- callfunc "F_keIntro", e_what, "Broadcasting...";
- if (getarg(1)=="")
- announce @msg$,16;
- else
- mapannounce getarg(1),@msg$,3;
- break;
- default:
- callfunc "F_keIntro", -1, "Ok...";
- }
-} //SF_ end
-
-//SubFunction SF_bcPvp (int cost, String map, int min level, int max level)
-//Does the second part of PvP Room Advertising. Level is the level group to
-//advertise (1->8 where 8 is free for all)
-function SF_bcPvp {
- set @msg$, "advertising";
- set @lvls$, "";
- if (getarg(3)) {
- if (BaseLevel < getarg(2) || BaseLevel > getarg(3)) {
- callfunc "F_keIntro", e_bzz, "You can only broadcast requests for PvP rooms you can enter!";
- return;
- }
- set @msg$,"levels "+getarg(2)+"-"+getarg(3);
- set @lvls$,"(levels "+getarg(2)+"-"+getarg(3)+") ";
- }
- set @pvpcost,getarg(0);
- switch(select(
- "- Cancel (PvP Rooms "+@msg$+")",
- "- advertise 'Room Sandwich'",
- "- advertise 'Room Rock On'",
- "- advertise 'Four Room'",
- "- advertise 'Room Undercross'",
- "- advertise 'Room Compass'"
- )) {
- case 2: //Sandwich
- SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Sandwich'!",0;
- break;
- case 3: //Rockon
- SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Rock On'!",0;
- break;
- case 4: //Room Four
- SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Four Room'!",0;
- break;
- case 5: //Undercross
- SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Undercross'!",0;
- break;
- case 6: //Compass
- SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Compass'!",0;
- break;
- }
-} //SF_ end
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Broadcasting Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 3.0
+//===== Compatible With: =====================================
+//= eAthena SVN3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers broadcasting for party requests, pvp, general
+//= and anonymous. Broadcasts can be to the current map
+//= or server-wide
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= For the PVP broadcasts, variables from the Pvp Warping
+//= Module are used.
+//============================================================
+
+- script keInit_broadcast -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadBroadcast";
+ end;
+}
+
+//Function F_keBroadcast(String currentMapName)
+function script F_keBroadcast {
+
+ function SF_calcPrice;
+ function SF_broadcasts;
+ function SF_bcPvp;
+ function SF_doBroadcast;
+
+ if ($@kebc_showOnline) {
+ set @kmenu, select(
+ "- Return",
+ "- Map Broadcasts ("+getarg(0)+"/"+getmapusers(getarg(0))+" "+$@ked_users$+")",
+ "- Global Broadcasts ("+getusers(1)+" "+$@ked_users$+")"
+ );
+ } else {
+ set @kmenu, select(
+ "- Return",
+ "- Map Broadcasts ("+getarg(0)+")",
+ "- Global Broadcasts"
+ );
+ }
+ switch(@kmenu) {
+ case 2:
+ SF_calcPrice(0);
+ set @map$,getarg(0);
+ SF_broadcasts("Map ("+getarg(0)+")");
+ break;
+ case 3:
+ SF_calcPrice(1);
+ set @map$,"";
+ SF_broadcasts("Global");
+ break;
+ }
+return;
+
+//Sub Function SF_broadcasts: Handles main broadcast menu.
+function SF_broadcasts {
+
+ do {
+ switch (select (
+ "- Cancel "+getarg(0)+" Broadcast",
+ "- Party request Broadcast ("+@partycost+"z)",
+ "- PvP challenge Broadcast ("+@pvpcost+"z)",
+ "- General Broadcast ("+@cost+"z)",
+ "- General Anonymous Broadcast ("+@anoncost+"z)"
+ )) {
+ case 2: //Party
+ SF_doBroadcast $@kebc_partyCost,@map$,"The "+callfunc("GF_getJobName",class)+" "+strcharinfo(0)+" (levels "+baselevel+"/"+joblevel+") is looking for a party to join.",0;
+ break;
+ case 3: //Pvp
+ if ($@kewp_advanced == 0)
+ SF_bcPvp $@kebc_pvpCost,@map$,0,0;
+ else {
+ do {
+ set @kmenu, select (
+ "- Cancel",
+ "- advertise all levels rooms",
+ "- advertise levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" rooms",
+ "- advertise levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" rooms"
+ );
+ switch (@kmenu) {
+ case 2: //All levels
+ SF_bcPvp $@kebc_pvpCost,@map$,0,0;
+ break;
+ case 3: //Lv1
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv1-$@kewp_range,$@kewp_baseLv1+$@kewp_range;
+ break;
+ case 4: //Lv2
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv2-$@kewp_range,$@kewp_baseLv2+$@kewp_range;
+ break;
+ case 5: //Lv3
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv3-$@kewp_range,$@kewp_baseLv3+$@kewp_range;
+ break;
+ case 6: //Lv4
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv4-$@kewp_range,$@kewp_baseLv4+$@kewp_range;
+ break;
+ case 7: //Lv5
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv5-$@kewp_range,$@kewp_baseLv5+$@kewp_range;
+ break;
+ case 8: //Lv6
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv6-$@kewp_range,$@kewp_baseLv6+$@kewp_range;
+ break;
+ case 9: //Lv7
+ SF_bcPvp $@kebc_pvpCost,@map$,$@kewp_baseLv7-$@kewp_range,$@kewp_baseLv7+$@kewp_range;
+ break;
+ default:
+ break;
+ }
+ } while (@kmenu > 1);
+ }
+ break;
+ case 4: //General
+ SF_doBroadcast $@kebc_cost,@map$,"(From "+strcharinfo(0)+") ",1;
+ break;
+ case 5: //Anonymous
+ SF_doBroadcast $@kebc_anonCost,@map$,"(Anonymous) ",1;
+ break;
+ default:
+ return;
+ }
+ } while (1);
+} //SF_ end
+
+//SubFunction: Calculates prices for Broadcast services (argument 0 == 1 for global bc, 0 for map bc
+function SF_calcPrice {
+ set @partycost,callfunc("F_keCost",$@kebc_partyCost,$@kebc_discount);
+ set @pvpcost,callfunc("F_keCost",$@kebc_pvpCost,$@kebc_discount);
+ set @cost,callfunc("F_keCost",$@kebc_cost,$@kebc_discount);
+ set @anoncost,callfunc("F_keCost",$@kebc_anonCost,$@kebc_discount);
+ if (getarg(0)) { //Global fix
+ set @partycost,@partycost*$@kebc_globalFactor/100;
+ set @pvpcost,@pvpcost*$@kebc_globalFactor/100;
+ set @cost,@cost*$@kebc_globalFactor/100;
+ set @anoncost,@anoncost*$@kebc_globalFactor/100;
+ }
+} //SF_ end
+
+//SubFunction SF_doBroadcast(int cost, String map, String message, int input)
+//If map is "", do a global broadcast
+//If input is 1, concat a user string to message.
+function SF_doBroadcast {
+ set @cost, getarg(0);
+ if (getarg(1)=="")
+ set @cost, @cost*$@kebc_globalFactor/100;
+ if (getarg(3)) { //Input message
+ input @msg$;
+ set @msg$,getarg(2)+@msg$;
+ } else
+ set @msg$,getarg(2);
+
+ mes "Broadcast '"+@msg$+"'?";
+ switch (select(
+ "- Cancel Broadcast",
+ "- Broadcast Message"
+ )) {
+ case 2:
+ if (!(callfunc("F_keCharge",@cost,$@kebc_discount,1))) {
+ callfunc "F_keIntro", e_pif, "You don't have enough Zeny...";
+ return;
+ }
+
+ callfunc "F_keIntro", e_what, "Broadcasting...";
+ if (getarg(1)=="")
+ announce @msg$,16;
+ else
+ mapannounce getarg(1),@msg$,3;
+ break;
+ default:
+ callfunc "F_keIntro", -1, "Ok...";
+ }
+} //SF_ end
+
+//SubFunction SF_bcPvp (int cost, String map, int min level, int max level)
+//Does the second part of PvP Room Advertising. Level is the level group to
+//advertise (1->8 where 8 is free for all)
+function SF_bcPvp {
+ set @msg$, "advertising";
+ set @lvls$, "";
+ if (getarg(3)) {
+ if (BaseLevel < getarg(2) || BaseLevel > getarg(3)) {
+ callfunc "F_keIntro", e_bzz, "You can only broadcast requests for PvP rooms you can enter!";
+ return;
+ }
+ set @msg$,"levels "+getarg(2)+"-"+getarg(3);
+ set @lvls$,"(levels "+getarg(2)+"-"+getarg(3)+") ";
+ }
+ set @pvpcost,getarg(0);
+ switch(select(
+ "- Cancel (PvP Rooms "+@msg$+")",
+ "- advertise 'Room Sandwich'",
+ "- advertise 'Room Rock On'",
+ "- advertise 'Four Room'",
+ "- advertise 'Room Undercross'",
+ "- advertise 'Room Compass'"
+ )) {
+ case 2: //Sandwich
+ SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Sandwich'!",0;
+ break;
+ case 3: //Rockon
+ SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Rock On'!",0;
+ break;
+ case 4: //Room Four
+ SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Four Room'!",0;
+ break;
+ case 5: //Undercross
+ SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Undercross'!",0;
+ break;
+ case 6: //Compass
+ SF_doBroadcast @pvpcost,@map$,"The "+callfunc("GF_getJobName", class)+" "+strcharinfo(0)+" is looking for PvP challengers "+@lvls$+"in the 'Room Compass'!",0;
+ break;
+ }
+} //SF_ end
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt
index bcd916b21..735ef5465 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_dye.txt
@@ -1,139 +1,139 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Stylist Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.9
-//===== Compatible With: =====================================
-//= eAthena SVN 3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers dying of hair, clothes and hair-style adjusts
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_dye -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadDye";
- end;
-}
-
-function script F_keStylist {
-
- function SF_inputpalette;
- function SF_wheelpalette;
-
- set @jobClass,callfunc("GF_getJobLevel",class);
- set @maxCDye,0;
-
- switch (@jobClass) {
- case 0:
- set @maxCDye, $@kedy_clothJN;
- break;
- case 1:
- set @maxCDye, $@kedy_clothJ1ST;
- break;
- case 2:
- set @maxCDye, $@kedy_clothJ2ND;
- break;
- case 3:
- set @maxCDye, $@kedy_clothJSN;
- break;
- case 4:
- set @maxCDye, $@kedy_clothJWED;
- break;
- }
- do {
- if ($@kedy_enableHairstyle) {
- set @kmenu, select(
- "- Return",
- "- Change hairstyle (current is "+getlook(1)+"/max is "+$@kedy_styles+")",
- "- Change hairstyle (by wheel)",
- "- Dye hair (current is "+getlook(6)+"/max is "+$@kedy_hair+")",
- "- Dye hair (by wheel)",
- "- Dye clothes (current is "+getlook(7)+"/max is "+@maxCDye+")",
- "- Dye clothes (by wheel)"
- );
- } else {
- set @kmenu, select(
- "- Return",
- "- Dye hair (current is "+getlook(6)+"/max is "+$@kedy_hair+")",
- "- Dye hair (by wheel)",
- "- Dye clothes (current is "+getlook(7)+"/max is "+@maxCDye+")",
- "- Dye clothes (by wheel)"
- );
- if (@kmenu > 1)
- set @kmenu, @kmenu+2;
- }
- switch (@kmenu) {
- case 2: //Hair Style Input
- SF_inputpalette 1,$@kedy_styles;
- break;
- case 3: //Hair Style Wheel
- SF_wheelpalette 1,$@kedy_styles;
- break;
- case 4: //Hair Dye Input
- SF_inputpalette 6,$@kedy_hair;
- break;
- case 5: //Hair Dye Wheel
- SF_wheelpalette 6,$@kedy_hair;
- break;
- case 6: //Clothes Input
- SF_inputpalette 7,@maxCDye;
- break;
- case 7: //Clothes Wheel
- SF_wheelpalette 7,@maxCDye ;
- break;
- }
- } while (@kmenu > 1);
- return;
-
-//Subfunction: SF_inputpalette(int part, int maxPalette)
-//Sets a palette from the user's request.
-function SF_inputpalette {
- input @pal;
- if (@pal < 0 || @pal > getarg(1)) {
- callfunc "F_keIntro", e_swt2, "Sorry, we do not have that dye available.";
- return;
- }
- setlook getarg(0),@pal;
- emotion e_lv;
-} //SF_ end
-
-//Subfunction: SF_wheelpalette(int part, int maxPalette)
-//Sets a palette through browsing.
-function SF_wheelpalette {
- set @loc, getarg(0);
- set @max, getarg(1);
- set @pal, getlook(@loc);
- set @dir, 1;
- do {
- if (@dir > 0)
- set @submenu, select(
- "Next",
- "Previous",
- "Done (current is "+@pal+")"
- );
- else
- set @submenu, select(
- "Previous",
- "Next",
- "Done (current is "+@pal+")"
- );
- switch (@submenu) {
- case 2: //Swap direction
- set @dir, @dir*-1;
- case 1:
- set @pal, @pal+@dir;
- if (@pal < 0)
- set @pal, @max;
- else if (@pal > @max)
- set @pal, 0;
- setlook @loc,@pal;
- }
- } while (@submenu != 3);
- emotion e_lv2;
-} //SF_ end
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Stylist Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.9
+//===== Compatible With: =====================================
+//= eAthena SVN 3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers dying of hair, clothes and hair-style adjusts
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_dye -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadDye";
+ end;
+}
+
+function script F_keStylist {
+
+ function SF_inputpalette;
+ function SF_wheelpalette;
+
+ set @jobClass,callfunc("GF_getJobLevel",class);
+ set @maxCDye,0;
+
+ switch (@jobClass) {
+ case 0:
+ set @maxCDye, $@kedy_clothJN;
+ break;
+ case 1:
+ set @maxCDye, $@kedy_clothJ1ST;
+ break;
+ case 2:
+ set @maxCDye, $@kedy_clothJ2ND;
+ break;
+ case 3:
+ set @maxCDye, $@kedy_clothJSN;
+ break;
+ case 4:
+ set @maxCDye, $@kedy_clothJWED;
+ break;
+ }
+ do {
+ if ($@kedy_enableHairstyle) {
+ set @kmenu, select(
+ "- Return",
+ "- Change hairstyle (current is "+getlook(1)+"/max is "+$@kedy_styles+")",
+ "- Change hairstyle (by wheel)",
+ "- Dye hair (current is "+getlook(6)+"/max is "+$@kedy_hair+")",
+ "- Dye hair (by wheel)",
+ "- Dye clothes (current is "+getlook(7)+"/max is "+@maxCDye+")",
+ "- Dye clothes (by wheel)"
+ );
+ } else {
+ set @kmenu, select(
+ "- Return",
+ "- Dye hair (current is "+getlook(6)+"/max is "+$@kedy_hair+")",
+ "- Dye hair (by wheel)",
+ "- Dye clothes (current is "+getlook(7)+"/max is "+@maxCDye+")",
+ "- Dye clothes (by wheel)"
+ );
+ if (@kmenu > 1)
+ set @kmenu, @kmenu+2;
+ }
+ switch (@kmenu) {
+ case 2: //Hair Style Input
+ SF_inputpalette 1,$@kedy_styles;
+ break;
+ case 3: //Hair Style Wheel
+ SF_wheelpalette 1,$@kedy_styles;
+ break;
+ case 4: //Hair Dye Input
+ SF_inputpalette 6,$@kedy_hair;
+ break;
+ case 5: //Hair Dye Wheel
+ SF_wheelpalette 6,$@kedy_hair;
+ break;
+ case 6: //Clothes Input
+ SF_inputpalette 7,@maxCDye;
+ break;
+ case 7: //Clothes Wheel
+ SF_wheelpalette 7,@maxCDye ;
+ break;
+ }
+ } while (@kmenu > 1);
+ return;
+
+//Subfunction: SF_inputpalette(int part, int maxPalette)
+//Sets a palette from the user's request.
+function SF_inputpalette {
+ input @pal;
+ if (@pal < 0 || @pal > getarg(1)) {
+ callfunc "F_keIntro", e_swt2, "Sorry, we do not have that dye available.";
+ return;
+ }
+ setlook getarg(0),@pal;
+ emotion e_lv;
+} //SF_ end
+
+//Subfunction: SF_wheelpalette(int part, int maxPalette)
+//Sets a palette through browsing.
+function SF_wheelpalette {
+ set @loc, getarg(0);
+ set @max, getarg(1);
+ set @pal, getlook(@loc);
+ set @dir, 1;
+ do {
+ if (@dir > 0)
+ set @submenu, select(
+ "Next",
+ "Previous",
+ "Done (current is "+@pal+")"
+ );
+ else
+ set @submenu, select(
+ "Previous",
+ "Next",
+ "Done (current is "+@pal+")"
+ );
+ switch (@submenu) {
+ case 2: //Swap direction
+ set @dir, @dir*-1;
+ case 1:
+ set @pal, @pal+@dir;
+ if (@pal < 0)
+ set @pal, @max;
+ else if (@pal > @max)
+ set @pal, 0;
+ setlook @loc,@pal;
+ }
+ } while (@submenu != 3);
+ emotion e_lv2;
+} //SF_ end
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
index 0093fe2ae..766918fd0 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
@@ -1,533 +1,533 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Job Changing Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 3.5
-//===== Compatible With: =====================================
-//= eAthena SVN R3579+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Enables job changing through the class trees.
-//= Novice -> 1st Class, 1st Class -> 2nd Class, rebirths, etc
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= When using Upper Job policy, previous jobs are stored in
-//= the server wide variables kej_class1 and kej_class2
-//============================================================
-
-- script keInit_jobchange -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadJobChange";
- end;
-}
-
-function script F_keJobChange {
-
- function SF_to1stJob;
- function SF_to2ndJob;
- function SF_getJobNames;
- function SF_testChangeJob;
- function SF_changeJob;
-
- set @job, callfunc("GF_getJobLevel", class);
- set @upper, Upper; //Because it is changed when rebirthing
- set @reset, 0; //Base Level is reset only on rebirths
- switch (@job) {
- case 0: //Novices
- if ($@kejc_skipNovice)
- set @jobLv, 0; //jobLv is used again when checking for S.Novice's base level restriction.
- else
- set @jobLv, 10;
- if (SF_testChangeJob(0,0,@jobLv))
- SF_to1stJob(0);
- break;
- case 1: //First Classes
- if (SF_testChangeJob($@kejc_cost2ND,$@kejc_base2ND,$@kejc_job2ND))
- SF_to2ndJob();
- break;
- case 2: //Second Classes
- if (Upper == 0 && BaseClass != Job_Taekwon) {
- if (SF_testChangeJob($@kejc_costRebirth,$@kejc_baseRebirth,$@kejc_jobRebirth)) {
- set @upper, 1;
- if ($@kejc_skipNovice)
- SF_to1stJob(1);
- else
- SF_changeJob @job,Upper,Job_Novice,1,0,0,$@kejc_costRebirth,1,$@kejc_rebirthReset;
- }
- break;
- }
- default: //Dead End
- callfunc "F_keIntro", e_swt2, "I cannot change you from your current job.";
- break;
- }
- return;
-
-//Handles changing to 1st job.
-function SF_to1stJob {
- do {
- set @submenu, 1;
- if (@upper == 1 && $@kejc_upperPolicy && kej_class1) {
- switch (kej_class1) {
- case Job_Acolyte:
- set @submenu, 2;
- break;
- case Job_Archer:
- set @submenu, 3;
- break;
- case Job_Mage:
- set @submenu, 4;
- break;
- case Job_Merchant:
- set @submenu, 5;
- break;
- case Job_Swordman:
- set @submenu, 6;
- break;
- case Job_Thief:
- set @submenu, 7;
- break;
- case Job_Taekwon:
- set @submenu, 8;
- break;
- }
- }
- if (@submenu == 1) {
- SF_getJobNames 8,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_Taekwon,Job_SuperNovice;
- switch (@upper) {
- case 0: //All
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$,
- "- "+@name7$,
- "- "+@name8$
- );
- break;
- case 1: //No Taekwon/S.Novice
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$
- );
- break;
- case 2: //No Taekwon
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$,
- "- "+@name8$
- );
- if (@submenu == 8)
- set @submenu, 9;
- break;
- }
- }
- switch (@submenu) {
- case 2: //Acolyte
- set @newJob,Job_Acolyte;
- set @weapon, $@kejc_wAcolyte;
- break;
- case 3: //Archer
- set @newJob,Job_Archer;
- set @weapon, $@kejc_wArcher;
- break;
- case 4: //Mage
- set @newJob,Job_Mage;
- set @weapon, $@kejc_wMage;
- break;
- case 5: //Merchant
- set @newJob,Job_Merchant;
- set @weapon, $@kejc_wMerchant;
- break;
- case 6: //Swordman
- set @newJob,Job_Swordman;
- set @weapon, $@kejc_wSwordman;
- break;
- case 7: //Thief
- set @newJob,Job_Thief;
- set @weapon, $@kejc_wThief;
- break;
- case 8: //Taekwon
- set @newJob,Job_Taekwon;
- set @weapon, $@kejc_wTaekwon;
- break;
- case 9: //S. Novice
- set @newJob,Job_SuperNovice;
- set @weapon, $@kejc_wSuperNovice;
- if (SF_testChangeJob(0,$@kejc_baseSN,@jobLv) == 0)
- return;
- break;
- }
- if (@submenu > 1) {
- if (getarg(0)) { //Skipping High Novice, charge rebirth costs.
- if (SF_changeJob(@job,Upper,@newJob,1,@weapon,0,$@kejc_costRebirth,2,$@kejc_rebirthReset))
- return;
- } else {
- if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,0,0,2,0))
- return;
- }
- }
- } while (@submenu > 1);
-}
-
-function SF_to2ndJob {
- do {
- set @submenu, 1;
- if (@upper == 1 && $@kejc_upperPolicy && kej_class2) {
- switch (kej_class2) {
- case Job_Priest:
- case Job_Hunter:
- case Job_Wizard:
- case Job_Blacksmith:
- case Job_Knight:
- case Job_Knight2:
- case Job_Assassin:
- case Job_Star_Gladiator:
- case Job_Star_Gladiator2:
- set @submenu, 2;
- break;
- case Job_Monk:
- case Job_Bard:
- case Job_Dancer:
- case Job_Sage:
- case Job_Alchem:
- case Job_Crusader:
- case Job_Crusader2:
- case Job_Rogue:
- case Job_Soul_Linker:
- set @submenu, 3;
- break;
- }
- }
- if (@submenu == 1) { //Fetch from menu.
- switch (BaseClass) {
- case Job_Acolyte:
- SF_getJobNames 2,Job_Priest,Job_Monk;
- break;
- case Job_Archer:
- SF_getJobNames 3,Job_Hunter,Job_Bard,Job_Dancer;
- if (sex == 0)
- set @name2$, @name3$;
- break;
- case Job_Mage:
- SF_getJobNames 2,Job_Wizard,Job_Sage;
- break;
- case Job_Merchant:
- SF_getJobNames 2,Job_Blacksmith,Job_Alchem;
- break;
- case Job_Swordman:
- SF_getJobNames 2,Job_Knight,Job_Crusader;
- break;
- case Job_Thief:
- SF_getJobNames 2,Job_Assassin,Job_Rogue;
- break;
- case Job_Taekwon:
- SF_getJobNames 2,Job_Star_Gladiator,Job_Soul_Linker;
- break;
- default:
- callfunc "F_keIntro", e_swt2, "I don't know how to change you from your current job.";
- return;
- }
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$
- );
- }
- switch (BaseClass) {
- case Job_Acolyte:
- switch (@submenu) {
- case 2: //Priest
- set @newJob,Job_Priest;
- set @weapon,$@kejc_wPriest;
- set @weapon2,$@kejc_w2Priest;
- break;
- case 3: //Monk
- set @newJob,Job_Monk;
- set @weapon,$@kejc_wMonk;
- set @weapon2,$@kejc_w2Monk;
- break;
- }
- break;
- case Job_Archer:
- switch (@submenu) {
- case 2: //Hunter
- set @newJob,Job_Hunter;
- set @weapon,$@kejc_wHunter;
- set @weapon2,$@kejc_w2Hunter;
- break;
- case 3: //Bard/Dancer
- if (sex == 1) { //Bard
- set @newJob,Job_Bard;
- set @weapon,$@kejc_wBard;
- set @weapon2,$@kejc_w2Bard;
- } else { //Dancer
- set @newJob,Job_Dancer;
- set @weapon,$@kejc_wDancer;
- set @weapon2,$@kejc_w2Dancer;
- }
- break;
- }
- break;
- case Job_Mage:
- switch (@submenu) {
- case 2: //Wizard
- set @newJob,Job_Wizard;
- set @weapon,$@kejc_wWizard;
- set @weapon2,$@kejc_w2Wizard;
- break;
- case 3: //Sage
- set @newJob,Job_Sage;
- set @weapon,$@kejc_wSage;
- set @weapon2,$@kejc_w2Sage;
- break;
- }
- break;
- case Job_Merchant:
- switch (@submenu) {
- case 2: //Blacksmith
- set @newJob,Job_Blacksmith;
- set @weapon,$@kejc_wBlacksmith;
- set @weapon2,$@kejc_w2Blacksmith;
- break;
- case 3: //Alchemist
- set @newJob,Job_Alchem;
- set @weapon,$@kejc_wAlchemist;
- set @weapon2,$@kejc_w2Alchemist;
- break;
- }
- break;
- case Job_Swordman:
- switch (@submenu) {
- case 2: //Knight
- set @newJob,Job_Knight;
- set @weapon,$@kejc_wKnight;
- set @weapon2,$@kejc_w2Knight;
- break;
- case 3: //Crusader
- set @newJob,Job_Crusader;
- set @weapon,$@kejc_wCrusader;
- set @weapon2,$@kejc_w2Crusader;
- break;
- default:
- mes "uh oh";
- break;
- }
- break;
- case Job_Thief:
- switch (@submenu) {
- case 2: //Assassin
- set @newJob,Job_Assassin;
- set @weapon,$@kejc_wAssassin;
- set @weapon2,$@kejc_w2Assassin;
- break;
- case 3: //Rogue
- set @newJob,Job_Rogue;
- set @weapon,$@kejc_wRogue;
- set @weapon2,$@kejc_w2Rogue;
- break;
- }
- break;
- case Job_Taekwon:
- switch (@submenu) {
- case 2: //Star Gladiator
- set @newJob,Job_Star_Gladiator;
- set @weapon,$@kejc_wStarGladiator;
- set @weapon2,$@kejc_w2StarGladiator;
- break;
- case 3: //Soul Linker
- set @newJob,Job_Soul_Linker;
- set @weapon,$@kejc_wSoulLinker;
- set @weapon2,$@kejc_w2SoulLinker;
- break;
- }
- break;
- }
- if (@submenu > 1) {
- if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,@weapon2,$@kejc_cost2ND,0,0))
- return;
- }
- } while (@submenu > 1);
-}
-
-//SubFunction: SF_testChangeJob(Zeny, BaseLv, JobLv)
-//Function that checks if the player qualifies for job changing.
-function SF_testChangeJob {
- set @fail, 0;
- if (Zeny < getarg(0))
- set @fail, 1;
- if (BaseLevel < getarg(1))
- set @fail, @fail+2;
- if (JobLevel < getarg(2))
- set @fail, @fail+4;
- if (@fail > 0) {
- if (@fail&1)
- mes "You need "+getarg(0)+"z for the conversion process.";
- if (@fail&2)
- mes "You need to be at least Lv "+getarg(1)+".";
- if (@fail&4)
- mes "You need at least job Lv "+getarg(2)+".";
- callfunc "F_keIntro", e_pif, "Sorry, you don't qualify for a job change yet.";
- return 0;
- }
-
- if (SkillPoint > 0 && $@kejc_skillsPolicy == 0) {
- callfunc "F_keIntro", e_dots, "Sorry, use your remaining Skill points before being able to change class.";
- return 0;
- }
- return 1;
-}
-
-//SubFunction: SF_changeJob (CurrentJobLv, CurrentJobType, NewJobBase, NewJobType
-//Weapon, Weapon2, Zeny, WipeSkills, ResetLv)
-//Attempts to change to the Jobgiven.
-//CurrentJobLv is 0-3 (novice, 1st class, 2nd class, s.novice)
-//Type is 0-2 (Normal, Advanced Class, Baby)
-//Weapon is the ID of the weapon to grant
-//Weapon2 is the alternative weapon granted when your job level is above $@kejc_wBonusLv
-//Zeny is the money required (if negative, it is money awarded)
-//WipeSkills if 1, indicates that skills should be wiped,
-//if 2, it means basic skills have to be given back
-//Reset Level indicates the base lv must be reset to 1.
-//Note: Zeny/Base/Job requirements should had been checked with SF_testChangeJob already!
-function SF_changeJob {
- set @newjob,getarg(2);
- set @newtype,getarg(3);
- set @weapon,getarg(4);
- set @weapon2,getarg(5);
- set @cost,getarg(6);
- set @wipeSkill,getarg(7);
- set @resetLv,getarg(8);
-
- set @jobStr$, callfunc("GF_getJobName2",@newjob, @newtype);
- if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1) {
- set @selection, select(
- "- Do not change yet",
- "- Change to "+@jobStr$+" (skill points lost)",
- "- View details"
- );
- } else {
- set @selection, select(
- "- Cancel",
- "- Change to "+@jobStr$,
- "- View details"
- );
- }
- switch (@selection) {
- case 3: //Details
- mes "Okay.. listen up:";
- next;
- mes "["+@name$+"]";
- mes "Changing to "+@jobStr$+" now means:";
- if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1)
- mes "- You will lose your "+SkillPoint+" unused skill points.";
- else if (@wipeSkill == 1)
- mes "- You will lose all your skills.";
- if (@resetLv)
- mes "- Your base level will be reset to 1.";
- if (@cost > 0)
- mes "- You will be charged "+@cost+"z.";
- else if (@cost < 0)
- mes "- You will be aided with "+(0-@cost)+"z.";
- if (@weapon > 0) {
- if (@weapon2 > 0 && $@kejc_wBonusLv) {
- if (JobLevel < $@kejc_wBonusLv) {
- mes "- You will receive a "+getitemname(@weapon)+"["+getitemslots(@weapon)+"].";
- mes "- If you wait until Job Lv"+$@kejc_wBonusLv+", you can receive instead a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"].";
- } else {
- mes "- You will receive a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"] for reaching Job Lv"+$@kejc_wBonusLv+".";
- }
- } else
- mes "- You will receive a "+getitemname(@weapon)+".";
- }
- mes "So... will you change?";
- if (select(
- "- Cancel",
- "- Change to "+@jobStr$
- ) != 2) {
- callfunc "F_keIntro", e_dots, "...alright.";
- return 0;
- }
- callfunc "F_keIntro", -1, "Enjoy your new Job.";
- case 2: //Change
- //Set/Unset job path variables as needed.
- if($@kejc_upperPolicy) {
- set @class,getarg(0);
- set @type, getarg(1);
- if(@class == 1 && @type == 0)
- set kej_class1,class; //Advancing to second class, so...
- if(@class == 2)
- set kej_class2,class; //Only way of being here is by doing a rebirth
- if(@type > 0)
- set kej_class1,0; //Clear when one is a high class
- if(@type > 0 && @class == 1)
- set kej_class2,0; //Clear when leaving high 1st class
- }
- if (@resetLv) {
- jobchange Job_Novice_High; //Done to give players those 100 points from High classes
- resetlvl(1);
- }
- if (@wipeSkill) {
- resetskill;
- setoption(0);
- set SkillPoint,0;
- } else if ($@kejc_skillsPolicy == 1)
- set SkillPoint,0;
- if (@wipeSkill>1)
- skill 1,9,0;
- if($@kejc_resetDye)
- setlook 7,0;
- jobchange @newjob, @newtype;
- if ($@kejc_announce)
- announce strcharinfo(0)+" has been promoted to "+@jobStr$+"!",8;
- set Zeny,Zeny-@cost;
- if ($@kejc_weaponPolicy && @weapon > 0) {
- if ($@kejc_wBonusLv && @weapon2 > 0) {
- if (JobLevel < $@kejc_wBonusLv)
- getitem @weapon,1;
- else
- getitem @weapon2,1;
- } else
- getitem @weapon,1;
- }
- emotion e_grat;
- return 1;
- default: //Cancel...
- callfunc "F_keIntro", e_dots, "...alright.";
- return 0;
- }
-}
-//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
-//Workaround until eA gets a fix for the bug where you can't use callfunc or
-//callsub within a menu
-function SF_getJobNames {
- switch (getarg(0)) {
- case 8:
- set @name8$, callfunc("GF_getJobName2",getarg(8),@upper);
- set @name7$, callfunc("GF_getJobName2",getarg(7),@upper);
- set @name6$, callfunc("GF_getJobName2",getarg(6),@upper);
- set @name5$, callfunc("GF_getJobName2",getarg(5),@upper);
- set @name4$, callfunc("GF_getJobName2",getarg(4),@upper);
- case 3:
- set @name3$, callfunc("GF_getJobName2",getarg(3),@upper);
- case 2:
- set @name2$, callfunc("GF_getJobName2",getarg(2),@upper);
- set @name1$, callfunc("GF_getJobName2",getarg(1),@upper);
- }
- return;
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Job Changing Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 3.5
+//===== Compatible With: =====================================
+//= eAthena SVN R3579+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Enables job changing through the class trees.
+//= Novice -> 1st Class, 1st Class -> 2nd Class, rebirths, etc
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= When using Upper Job policy, previous jobs are stored in
+//= the server wide variables kej_class1 and kej_class2
+//============================================================
+
+- script keInit_jobchange -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadJobChange";
+ end;
+}
+
+function script F_keJobChange {
+
+ function SF_to1stJob;
+ function SF_to2ndJob;
+ function SF_getJobNames;
+ function SF_testChangeJob;
+ function SF_changeJob;
+
+ set @job, callfunc("GF_getJobLevel", class);
+ set @upper, Upper; //Because it is changed when rebirthing
+ set @reset, 0; //Base Level is reset only on rebirths
+ switch (@job) {
+ case 0: //Novices
+ if ($@kejc_skipNovice)
+ set @jobLv, 0; //jobLv is used again when checking for S.Novice's base level restriction.
+ else
+ set @jobLv, 10;
+ if (SF_testChangeJob(0,0,@jobLv))
+ SF_to1stJob(0);
+ break;
+ case 1: //First Classes
+ if (SF_testChangeJob($@kejc_cost2ND,$@kejc_base2ND,$@kejc_job2ND))
+ SF_to2ndJob();
+ break;
+ case 2: //Second Classes
+ if (Upper == 0 && BaseClass != Job_Taekwon) {
+ if (SF_testChangeJob($@kejc_costRebirth,$@kejc_baseRebirth,$@kejc_jobRebirth)) {
+ set @upper, 1;
+ if ($@kejc_skipNovice)
+ SF_to1stJob(1);
+ else
+ SF_changeJob @job,Upper,Job_Novice,1,0,0,$@kejc_costRebirth,1,$@kejc_rebirthReset;
+ }
+ break;
+ }
+ default: //Dead End
+ callfunc "F_keIntro", e_swt2, "I cannot change you from your current job.";
+ break;
+ }
+ return;
+
+//Handles changing to 1st job.
+function SF_to1stJob {
+ do {
+ set @submenu, 1;
+ if (@upper == 1 && $@kejc_upperPolicy && kej_class1) {
+ switch (kej_class1) {
+ case Job_Acolyte:
+ set @submenu, 2;
+ break;
+ case Job_Archer:
+ set @submenu, 3;
+ break;
+ case Job_Mage:
+ set @submenu, 4;
+ break;
+ case Job_Merchant:
+ set @submenu, 5;
+ break;
+ case Job_Swordman:
+ set @submenu, 6;
+ break;
+ case Job_Thief:
+ set @submenu, 7;
+ break;
+ case Job_Taekwon:
+ set @submenu, 8;
+ break;
+ }
+ }
+ if (@submenu == 1) {
+ SF_getJobNames 8,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_Taekwon,Job_SuperNovice;
+ switch (@upper) {
+ case 0: //All
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$,
+ "- "+@name7$,
+ "- "+@name8$
+ );
+ break;
+ case 1: //No Taekwon/S.Novice
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$
+ );
+ break;
+ case 2: //No Taekwon
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$,
+ "- "+@name8$
+ );
+ if (@submenu == 8)
+ set @submenu, 9;
+ break;
+ }
+ }
+ switch (@submenu) {
+ case 2: //Acolyte
+ set @newJob,Job_Acolyte;
+ set @weapon, $@kejc_wAcolyte;
+ break;
+ case 3: //Archer
+ set @newJob,Job_Archer;
+ set @weapon, $@kejc_wArcher;
+ break;
+ case 4: //Mage
+ set @newJob,Job_Mage;
+ set @weapon, $@kejc_wMage;
+ break;
+ case 5: //Merchant
+ set @newJob,Job_Merchant;
+ set @weapon, $@kejc_wMerchant;
+ break;
+ case 6: //Swordman
+ set @newJob,Job_Swordman;
+ set @weapon, $@kejc_wSwordman;
+ break;
+ case 7: //Thief
+ set @newJob,Job_Thief;
+ set @weapon, $@kejc_wThief;
+ break;
+ case 8: //Taekwon
+ set @newJob,Job_Taekwon;
+ set @weapon, $@kejc_wTaekwon;
+ break;
+ case 9: //S. Novice
+ set @newJob,Job_SuperNovice;
+ set @weapon, $@kejc_wSuperNovice;
+ if (SF_testChangeJob(0,$@kejc_baseSN,@jobLv) == 0)
+ return;
+ break;
+ }
+ if (@submenu > 1) {
+ if (getarg(0)) { //Skipping High Novice, charge rebirth costs.
+ if (SF_changeJob(@job,Upper,@newJob,1,@weapon,0,$@kejc_costRebirth,2,$@kejc_rebirthReset))
+ return;
+ } else {
+ if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,0,0,2,0))
+ return;
+ }
+ }
+ } while (@submenu > 1);
+}
+
+function SF_to2ndJob {
+ do {
+ set @submenu, 1;
+ if (@upper == 1 && $@kejc_upperPolicy && kej_class2) {
+ switch (kej_class2) {
+ case Job_Priest:
+ case Job_Hunter:
+ case Job_Wizard:
+ case Job_Blacksmith:
+ case Job_Knight:
+ case Job_Knight2:
+ case Job_Assassin:
+ case Job_Star_Gladiator:
+ case Job_Star_Gladiator2:
+ set @submenu, 2;
+ break;
+ case Job_Monk:
+ case Job_Bard:
+ case Job_Dancer:
+ case Job_Sage:
+ case Job_Alchem:
+ case Job_Crusader:
+ case Job_Crusader2:
+ case Job_Rogue:
+ case Job_Soul_Linker:
+ set @submenu, 3;
+ break;
+ }
+ }
+ if (@submenu == 1) { //Fetch from menu.
+ switch (BaseClass) {
+ case Job_Acolyte:
+ SF_getJobNames 2,Job_Priest,Job_Monk;
+ break;
+ case Job_Archer:
+ SF_getJobNames 3,Job_Hunter,Job_Bard,Job_Dancer;
+ if (sex == 0)
+ set @name2$, @name3$;
+ break;
+ case Job_Mage:
+ SF_getJobNames 2,Job_Wizard,Job_Sage;
+ break;
+ case Job_Merchant:
+ SF_getJobNames 2,Job_Blacksmith,Job_Alchem;
+ break;
+ case Job_Swordman:
+ SF_getJobNames 2,Job_Knight,Job_Crusader;
+ break;
+ case Job_Thief:
+ SF_getJobNames 2,Job_Assassin,Job_Rogue;
+ break;
+ case Job_Taekwon:
+ SF_getJobNames 2,Job_Star_Gladiator,Job_Soul_Linker;
+ break;
+ default:
+ callfunc "F_keIntro", e_swt2, "I don't know how to change you from your current job.";
+ return;
+ }
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$
+ );
+ }
+ switch (BaseClass) {
+ case Job_Acolyte:
+ switch (@submenu) {
+ case 2: //Priest
+ set @newJob,Job_Priest;
+ set @weapon,$@kejc_wPriest;
+ set @weapon2,$@kejc_w2Priest;
+ break;
+ case 3: //Monk
+ set @newJob,Job_Monk;
+ set @weapon,$@kejc_wMonk;
+ set @weapon2,$@kejc_w2Monk;
+ break;
+ }
+ break;
+ case Job_Archer:
+ switch (@submenu) {
+ case 2: //Hunter
+ set @newJob,Job_Hunter;
+ set @weapon,$@kejc_wHunter;
+ set @weapon2,$@kejc_w2Hunter;
+ break;
+ case 3: //Bard/Dancer
+ if (sex == 1) { //Bard
+ set @newJob,Job_Bard;
+ set @weapon,$@kejc_wBard;
+ set @weapon2,$@kejc_w2Bard;
+ } else { //Dancer
+ set @newJob,Job_Dancer;
+ set @weapon,$@kejc_wDancer;
+ set @weapon2,$@kejc_w2Dancer;
+ }
+ break;
+ }
+ break;
+ case Job_Mage:
+ switch (@submenu) {
+ case 2: //Wizard
+ set @newJob,Job_Wizard;
+ set @weapon,$@kejc_wWizard;
+ set @weapon2,$@kejc_w2Wizard;
+ break;
+ case 3: //Sage
+ set @newJob,Job_Sage;
+ set @weapon,$@kejc_wSage;
+ set @weapon2,$@kejc_w2Sage;
+ break;
+ }
+ break;
+ case Job_Merchant:
+ switch (@submenu) {
+ case 2: //Blacksmith
+ set @newJob,Job_Blacksmith;
+ set @weapon,$@kejc_wBlacksmith;
+ set @weapon2,$@kejc_w2Blacksmith;
+ break;
+ case 3: //Alchemist
+ set @newJob,Job_Alchem;
+ set @weapon,$@kejc_wAlchemist;
+ set @weapon2,$@kejc_w2Alchemist;
+ break;
+ }
+ break;
+ case Job_Swordman:
+ switch (@submenu) {
+ case 2: //Knight
+ set @newJob,Job_Knight;
+ set @weapon,$@kejc_wKnight;
+ set @weapon2,$@kejc_w2Knight;
+ break;
+ case 3: //Crusader
+ set @newJob,Job_Crusader;
+ set @weapon,$@kejc_wCrusader;
+ set @weapon2,$@kejc_w2Crusader;
+ break;
+ default:
+ mes "uh oh";
+ break;
+ }
+ break;
+ case Job_Thief:
+ switch (@submenu) {
+ case 2: //Assassin
+ set @newJob,Job_Assassin;
+ set @weapon,$@kejc_wAssassin;
+ set @weapon2,$@kejc_w2Assassin;
+ break;
+ case 3: //Rogue
+ set @newJob,Job_Rogue;
+ set @weapon,$@kejc_wRogue;
+ set @weapon2,$@kejc_w2Rogue;
+ break;
+ }
+ break;
+ case Job_Taekwon:
+ switch (@submenu) {
+ case 2: //Star Gladiator
+ set @newJob,Job_Star_Gladiator;
+ set @weapon,$@kejc_wStarGladiator;
+ set @weapon2,$@kejc_w2StarGladiator;
+ break;
+ case 3: //Soul Linker
+ set @newJob,Job_Soul_Linker;
+ set @weapon,$@kejc_wSoulLinker;
+ set @weapon2,$@kejc_w2SoulLinker;
+ break;
+ }
+ break;
+ }
+ if (@submenu > 1) {
+ if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,@weapon2,$@kejc_cost2ND,0,0))
+ return;
+ }
+ } while (@submenu > 1);
+}
+
+//SubFunction: SF_testChangeJob(Zeny, BaseLv, JobLv)
+//Function that checks if the player qualifies for job changing.
+function SF_testChangeJob {
+ set @fail, 0;
+ if (Zeny < getarg(0))
+ set @fail, 1;
+ if (BaseLevel < getarg(1))
+ set @fail, @fail+2;
+ if (JobLevel < getarg(2))
+ set @fail, @fail+4;
+ if (@fail > 0) {
+ if (@fail&1)
+ mes "You need "+getarg(0)+"z for the conversion process.";
+ if (@fail&2)
+ mes "You need to be at least Lv "+getarg(1)+".";
+ if (@fail&4)
+ mes "You need at least job Lv "+getarg(2)+".";
+ callfunc "F_keIntro", e_pif, "Sorry, you don't qualify for a job change yet.";
+ return 0;
+ }
+
+ if (SkillPoint > 0 && $@kejc_skillsPolicy == 0) {
+ callfunc "F_keIntro", e_dots, "Sorry, use your remaining Skill points before being able to change class.";
+ return 0;
+ }
+ return 1;
+}
+
+//SubFunction: SF_changeJob (CurrentJobLv, CurrentJobType, NewJobBase, NewJobType
+//Weapon, Weapon2, Zeny, WipeSkills, ResetLv)
+//Attempts to change to the Jobgiven.
+//CurrentJobLv is 0-3 (novice, 1st class, 2nd class, s.novice)
+//Type is 0-2 (Normal, Advanced Class, Baby)
+//Weapon is the ID of the weapon to grant
+//Weapon2 is the alternative weapon granted when your job level is above $@kejc_wBonusLv
+//Zeny is the money required (if negative, it is money awarded)
+//WipeSkills if 1, indicates that skills should be wiped,
+//if 2, it means basic skills have to be given back
+//Reset Level indicates the base lv must be reset to 1.
+//Note: Zeny/Base/Job requirements should had been checked with SF_testChangeJob already!
+function SF_changeJob {
+ set @newjob,getarg(2);
+ set @newtype,getarg(3);
+ set @weapon,getarg(4);
+ set @weapon2,getarg(5);
+ set @cost,getarg(6);
+ set @wipeSkill,getarg(7);
+ set @resetLv,getarg(8);
+
+ set @jobStr$, callfunc("GF_getJobName2",@newjob, @newtype);
+ if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1) {
+ set @selection, select(
+ "- Do not change yet",
+ "- Change to "+@jobStr$+" (skill points lost)",
+ "- View details"
+ );
+ } else {
+ set @selection, select(
+ "- Cancel",
+ "- Change to "+@jobStr$,
+ "- View details"
+ );
+ }
+ switch (@selection) {
+ case 3: //Details
+ mes "Okay.. listen up:";
+ next;
+ mes "["+@name$+"]";
+ mes "Changing to "+@jobStr$+" now means:";
+ if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1)
+ mes "- You will lose your "+SkillPoint+" unused skill points.";
+ else if (@wipeSkill == 1)
+ mes "- You will lose all your skills.";
+ if (@resetLv)
+ mes "- Your base level will be reset to 1.";
+ if (@cost > 0)
+ mes "- You will be charged "+@cost+"z.";
+ else if (@cost < 0)
+ mes "- You will be aided with "+(0-@cost)+"z.";
+ if (@weapon > 0) {
+ if (@weapon2 > 0 && $@kejc_wBonusLv) {
+ if (JobLevel < $@kejc_wBonusLv) {
+ mes "- You will receive a "+getitemname(@weapon)+"["+getitemslots(@weapon)+"].";
+ mes "- If you wait until Job Lv"+$@kejc_wBonusLv+", you can receive instead a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"].";
+ } else {
+ mes "- You will receive a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"] for reaching Job Lv"+$@kejc_wBonusLv+".";
+ }
+ } else
+ mes "- You will receive a "+getitemname(@weapon)+".";
+ }
+ mes "So... will you change?";
+ if (select(
+ "- Cancel",
+ "- Change to "+@jobStr$
+ ) != 2) {
+ callfunc "F_keIntro", e_dots, "...alright.";
+ return 0;
+ }
+ callfunc "F_keIntro", -1, "Enjoy your new Job.";
+ case 2: //Change
+ //Set/Unset job path variables as needed.
+ if($@kejc_upperPolicy) {
+ set @class,getarg(0);
+ set @type, getarg(1);
+ if(@class == 1 && @type == 0)
+ set kej_class1,class; //Advancing to second class, so...
+ if(@class == 2)
+ set kej_class2,class; //Only way of being here is by doing a rebirth
+ if(@type > 0)
+ set kej_class1,0; //Clear when one is a high class
+ if(@type > 0 && @class == 1)
+ set kej_class2,0; //Clear when leaving high 1st class
+ }
+ if (@resetLv) {
+ jobchange Job_Novice_High; //Done to give players those 100 points from High classes
+ resetlvl(1);
+ }
+ if (@wipeSkill) {
+ resetskill;
+ setoption(0);
+ set SkillPoint,0;
+ } else if ($@kejc_skillsPolicy == 1)
+ set SkillPoint,0;
+ if (@wipeSkill>1)
+ skill 1,9,0;
+ if($@kejc_resetDye)
+ setlook 7,0;
+ jobchange @newjob, @newtype;
+ if ($@kejc_announce)
+ announce strcharinfo(0)+" has been promoted to "+@jobStr$+"!",8;
+ set Zeny,Zeny-@cost;
+ if ($@kejc_weaponPolicy && @weapon > 0) {
+ if ($@kejc_wBonusLv && @weapon2 > 0) {
+ if (JobLevel < $@kejc_wBonusLv)
+ getitem @weapon,1;
+ else
+ getitem @weapon2,1;
+ } else
+ getitem @weapon,1;
+ }
+ emotion e_grat;
+ return 1;
+ default: //Cancel...
+ callfunc "F_keIntro", e_dots, "...alright.";
+ return 0;
+ }
+}
+//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
+//Workaround until eA gets a fix for the bug where you can't use callfunc or
+//callsub within a menu
+function SF_getJobNames {
+ switch (getarg(0)) {
+ case 8:
+ set @name8$, callfunc("GF_getJobName2",getarg(8),@upper);
+ set @name7$, callfunc("GF_getJobName2",getarg(7),@upper);
+ set @name6$, callfunc("GF_getJobName2",getarg(6),@upper);
+ set @name5$, callfunc("GF_getJobName2",getarg(5),@upper);
+ set @name4$, callfunc("GF_getJobName2",getarg(4),@upper);
+ case 3:
+ set @name3$, callfunc("GF_getJobName2",getarg(3),@upper);
+ case 2:
+ set @name2$, callfunc("GF_getJobName2",getarg(2),@upper);
+ set @name1$, callfunc("GF_getJobName2",getarg(1),@upper);
+ }
+ return;
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt
index 59311cca5..8d91242cc 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobswap.txt
@@ -1,418 +1,418 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Job Swapping Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 3.4
-//===== Compatible With: =====================================
-//= eAthena SVN R7896+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Enables job changing among classes of the same 'type'
-//= (ie among 1st classes, or among 2nd classes)
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= * The previous Job, when enabled, is stored in:
-//= kej_prev_job (job id)
-//= kej_prev_joblv (job level)
-//= kej_prev_skills (skill count)
-//= kej_prev_dye (cloth dye)
-//============================================================
-
-- script keInit_jobSwap -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadJobSwap";
- end;
-}
-
-function script F_keJobSwap {
-
-function SF_canRevert;
-function SF_canSwitch;
-function SF_revertJob;
-function SF_switch;
-function SF_calcSwapCost;
-function SF_testSwap;
-function SF_swapJob;
-function SF_getJobNames;
-
- set @thisLevel, callfunc("GF_getJobLevel", Class);
-
- set @prevId, kej_prev_job;
- set @prevLv, kej_prev_joblv;
- set @prevLevel, 0;
- set @prevType, 0;
-
- if ($@kejs_revertPolicy && @prevId && @prevLv) {
- set @prevLevel, callfunc("GF_getJobLevel", @prevId);
- set @prevType, callfunc("GF_getJobType", @prevId);
- }
-
- if (SF_canRevert())
- { //Qualifies for Reverting
- do {
- set @revertmenu, select(
- "- Return",
- "- Return to previous class",
- "- Change into another class"
- );
- switch (@revertmenu) {
- case 2: //Revert
- if (SF_revertJob())
- return;
- break;
- case 3: //Switch
- if (SF_switch() == 0)
- return;
- break;
- }
- } while (@revertmenu > 1);
- return;
- }
- if (SF_canSwitch())
- {
- SF_switch();
- return;
- }
-
- callfunc "F_keIntro", e_swt2, "There are no available jobs of your level.";
- return;
-
-//SubFunction SF_canRevert, specifies if the character can revert to previous job.
-function SF_canRevert {
- if ($@kejs_revertPolicy == 0 || @prevId == 0 || (Upper == 2 && @prevType != 2))
- return 0;
- if((@thisLevel == @prevLevel && Upper == @prevType) || $@kejs_revertPolicy == 2)
- return 1;
- if ($@kejs_SNpolicy && @prevType == Upper && ((@prevLevel == 3 && @thisLevel == 1) || (@prevLevel == 1 && @thisLevel == 3)))
- return 1;
- return 0;
-}
-
-//SubFunction SF_canSwitch, specifies if character can change to another job.
-function SF_canSwitch {
- if (@thisLevel == 3)
- return $@kejs_SNpolicy;
- if (@thisLevel == 1 || @thisLevel == 2)
- return 1;
- return 0;
-}
-
-//Sub Function SF_switch. Presents the switch job menu. Returns 1 only if the
-//menu was left by picking "Cancel".
-function SF_switch {
- switch (@thisLevel) {
- case 1:
- case 3: //First Classes
- set @cost, SF_calcSwapCost($@kejs_job1ST, $@kejs_cost1ST, $@kejs_discount1ST);
- set @preserve, $@kejs_preserve1ST;
- if (SF_testSwap($@kejs_job1ST, @cost)) {
- do {
- if ($@kejs_SNpolicy && Upper != 1) { //S. Novice Menu
- SF_getJobNames 7,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_SuperNovice;
- set @kmenu, select(
- "- Cancel job swap",
- "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,"- "+@name7$
- );
- } else {
- SF_getJobNames 6,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief;
- set @kmenu, select(
- "- Cancel job swap",
- "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$
- );
- }
- switch (@kmenu) {
- case 2: //Acolyte
- if (SF_swapJob(callfunc("GF_getJobId", Job_Acolyte, Upper),@cost,@preserve))
- return 0;
- break;
- case 3: //Archer
- if (SF_swapJob(callfunc("GF_getJobId", Job_Archer, Upper),@cost,@preserve))
- return 0;
- break;
- case 4: //Mage
- if (SF_swapJob(callfunc("GF_getJobId", Job_Mage, Upper),@cost,@preserve))
- return 0;
- break;
- case 5: //Merchant
- if (SF_swapJob(callfunc("GF_getJobId", Job_Merchant, Upper),@cost,@preserve))
- return 0;
- break;
- case 6: //Swordman
- if (SF_swapJob(callfunc("GF_getJobId", Job_Swordman, Upper),@cost,@preserve))
- return 0;
- break;
- case 7: //Thief
- if (SF_swapJob(callfunc("GF_getJobId", Job_Thief, Upper),@cost,@preserve))
- return 0;
- break;
- case 8: //S. Novice
- if (SF_swapJob(callfunc("GF_getJobId", Job_SuperNovice, Upper),@cost,@preserve))
- return 0;
- break;
- }
- } while (@kmenu > 1);
- return 1;
- }
- break;
-
- case 2: //Second Classes
- set @cost, SF_calcSwapCost($@kejs_job2ND, $@kejs_cost2ND, $@kejs_discount2ND);
- set @preserve, $@kejs_preserve2ND;
- if (SF_testSwap($@kejs_job2ND, @cost)) {
- do {
- if (sex == 1) {
- SF_getJobNames 12,Job_Alchem,Job_Assassin,Job_Bard,Job_Blacksmith,Job_Crusader,Job_Hunter,Job_Knight,Job_Monk,Job_Priest,Job_Rogue,Job_Sage,Job_Wizard;
- set @kmenu, select(
- "- Cancel job change",
- "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,
- "- "+@name7$,"- "+@name8$,"- "+@name9$,"- "+@name10$,"- "+@name11$,"- "+@name12$
- );
- if (@kmenu >= 7) //Dancer should be at pos 7.
- set @kmenu, @kmenu+1;
- } else {
- SF_getJobNames 12,Job_Alchem,Job_Assassin,Job_Blacksmith,Job_Crusader,Job_Dancer,Job_Hunter,Job_Knight,Job_Monk,Job_Priest,Job_Rogue,Job_Sage,Job_Wizard;
- set @kmenu, select(
- "- Cancel job change",
- "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,
- "- "+@name7$,"- "+@name8$,"- "+@name9$,"- "+@name10$,"- "+@name11$,"- "+@name12$
- );
- if (@kmenu >= 4) //Bard should be at pos 4.
- set @kmenu, @kmenu+1;
- }
- switch (@kmenu)
- {
- case 2: //ALCHEMIST
- if (SF_swapJob(callfunc("GF_getJobId", Job_Alchem, Upper),@cost,@preserve))
- return 0;
- break;
- case 3: //ASSASSIN
- if (SF_swapJob(callfunc("GF_getJobId", Job_Assassin, Upper),@cost,@preserve))
- return 0;
- break;
- case 4: //BARD
- if (SF_swapJob(callfunc("GF_getJobId", Job_Bard, Upper),@cost,@preserve))
- return 0;
- break;
- case 5: //BLACKSMITH
- if (SF_swapJob(callfunc("GF_getJobId", Job_Blacksmith, Upper),@cost,@preserve))
- return 0;
- break;
- case 6: //CRUSADER
- if (SF_swapJob(callfunc("GF_getJobId", Job_Crusader, Upper),@cost,@preserve))
- return 0;
- break;
- case 7: //DANCER
- if (SF_swapJob(callfunc("GF_getJobId", Job_Dancer, Upper),@cost,@preserve))
- return 0;
- break;
- case 8: //HUNTER
- if (SF_swapJob(callfunc("GF_getJobId", Job_Hunter, Upper),@cost,@preserve))
- return 0;
- break;
- case 9: //KNIGHT
- if (SF_swapJob(callfunc("GF_getJobId", Job_Knight, Upper),@cost,@preserve))
- return 0;
- break;
- case 10: //MONK
- if (SF_swapJob(callfunc("GF_getJobId", Job_Monk, Upper),@cost,@preserve))
- return 0;
- break;
- case 11: //PRIEST
- if (SF_swapJob(callfunc("GF_getJobId", Job_Priest, Upper),@cost,@preserve))
- return 0;
- break;
- case 12: //ROGUE
- if (SF_swapJob(callfunc("GF_getJobId", Job_Rogue, Upper),@cost,@preserve))
- return 0;
- break;
- case 13: //SAGE
- if (SF_swapJob(callfunc("GF_getJobId", Job_Sage, Upper),@cost,@preserve))
- return 0;
- break;
- case 14: //WIZARD
- if (SF_swapJob(callfunc("GF_getJobId", Job_Wizard, Upper),@cost,@preserve))
- return 0;
- break;
- }
- } while (@kmenu > 1);
- return 1;
- }
- }
- return 0;
-}
-
-//SubFunction: SF_calcSwapCost (MinJob, BaseCost, Discount)
-//Calculates cost to swap jobs
-function SF_calcSwapCost {
- set @cost, getarg(1);
- set @cost, @cost - @cost*getarg(2)*(JobLevel-getarg(0))/100;
- if (@cost < 0)
- set @cost,0; //Free Change
- return @cost;
-}
-
-//SubFunction: SF_testSwap(MinJobLv, Cost)
-//Checks if the player qualifies for job changing.
-function SF_testSwap {
- if (JobLevel < getarg(0)) {
- callfunc "F_keIntro", e_dots, "You need to be at least Job Lv "+getarg(0)+" before exchanging.";
- return 0;
- }
-
- set @cost, callfunc("F_keCost",getarg(1),$@kejs_swapDiscount);
- if (Zeny < @cost) {
- callfunc "F_keIntro", e_dots, "You need "+@cost+"z to be able to change.";
- return 0;
- }
- return 1;
-}
-
-//SubFunction: SF_swapJob (JobNumber, Zeny, PreserveRate)
-//Attempts to swap to the Jobgiven.
-//Zeny is the money cost
-//Preserve is how much of the previous job to preserve.
-function SF_swapJob {
- set @newjobId, getarg(0);
- set @cost, callfunc("F_keCost",getarg(1),$@kejs_swapDiscount);
- set @preserve, getarg(2);
-
- if (Class == @newjobId) {
- callfunc "F_keIntro", e_meh, "Um... you are already that class!";
- return 0;
- }
-
- set @newJob$, callfunc("GF_getJobName",@newjobId);
- set @oldJob$, callfunc("GF_getJobName",Class);
- set @newjoblv, JobLevel*@preserve/100;
-
- if (@newjoblv > 1) {
- if (select("- Cancel", "- Change to a Lv"+@newjoblv+" "+@newJob$+" ("+@cost+"z)") != 2)
- return 0;
- } else {
- set @newjoblv,1;
- if (select("- Cancel", "- Change to "+@newJob$+" ("+@cost+"z)") != 2)
- return 0;
- }
-
- set @basic, getSkilllv(1);
- set @preserve, skillpointcount() -JobLevel -@basic +@newjoblv; //Preserve holds the final amount of SkillPoints you should have.
-
- if (@preserve < 0) {
- callfunc "F_keIntro", e_gasp, "You need "+(-@preserve)+" more skill points to change class!";
- return 0;
- }
-
- set @thisJoblevel, JobLevel;
- resetSkill;
-
- //Set previous job as needed.
- if ($@kejs_revertPolicy) {
- set kej_prev_job, Class;
- set kej_prev_joblv, @thisJoblevel;
- set kej_prev_skills, SkillPoint;
- }
- if ($@kejs_announce)
- announce strcharinfo(0)+" has changed from "+@oldJob$+" to "+@newJob$+"...",16;
-
- if ($@kejs_resetDye)
- setlook 7,0;
- jobchange @newjobId, 0;
- skill 1,@basic,0;
- set JobLevel, @newjoblv;
- set SkillPoint, @preserve;
- setoption(0);
- sc_end -1;
- callfunc "F_keCharge",getarg(2),$@kejs_swapDiscount,1;
-
- emotion e_ok;
- return 1;
-}
-
-//SubFunction: SF_revertJob (cost)
-//Reverts to the previous job.
-function SF_revertJob {
- if (Class == kej_prev_job) {
- callfunc "F_keIntro", e_no, "Hmm... You can't go back, because your previous class is the same as your current one??";
- return 0;
- }
- set @newjob$, callfunc ("GF_getJobName",kej_prev_job);
-
- set @cost,callfunc("F_keCost",$@kejs_revertCost,$@kejs_revertDiscount);
-
- if (select("- Cancel","- Return to a Lv"+kej_prev_joblv+" "+@newjob$+" ("+@cost+"z)") != 2)
- return 0;
-
- if (!(callfunc("F_keCharge",$@kejs_revertCost,$@kejs_revertDiscount,1))) {
- callfunc "F_keIntro", -1, "Sorry, you need "+@cost+"z before you can revert to a Lv"+kej_prev_joblv+" "+@newjob$+".";
- return 0;
- }
- set @thisJobId, Class;
- set @thisJobLv, JobLevel;
-
- set @basic, getSkilllv(1);
- resetSkill;
- set @skill, SkillPoint;
- if($@kejs_saveDye) {
- set @prevDye, getlook(7);
- setlook 7,0;
- }
- if ($@kejs_resetDye)
- setlook 7,0;
- jobchange kej_prev_job, 0;
- if($@kejs_saveDye) {
- setlook 7,kej_prev_dye;
- set kej_prev_dye,@prevDye;
- }
- set JobLevel, kej_prev_joblv;
- set SkillPoint, kej_prev_skills;
-
- skill 1, @basic, 0;
- set SkillPoint, SkillPoint-@basic;
-
- set kej_prev_job, @thisJobId;
- set kej_prev_joblv, @thisJobLv;
- set kej_prev_skills, @skill;
- setoption(0);
- sc_end -1;
-
- if ($@kejs_announce)
- announce strcharinfo(0)+" has changed from "+callfunc ("GF_getJobName",@thisJobId)+" to "+@newjob$+"...",16;
- return 1;
-}
-
-//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
-//Workaround until eA gets a fix for the bug where you can't use callfunc or
-//callsub within a menu
-function SF_getJobNames {
- switch (getarg(0)) {
- case 12:
- set @name12$, callfunc("GF_getJobName2",getarg(12),Upper);
- case 11:
- set @name11$, callfunc("GF_getJobName2",getarg(11),Upper);
- case 10:
- set @name10$, callfunc("GF_getJobName2",getarg(10),Upper);
- case 9:
- set @name9$, callfunc("GF_getJobName2",getarg(9),Upper);
- case 8:
- set @name8$, callfunc("GF_getJobName2",getarg(8),Upper);
- case 7:
- set @name7$, callfunc("GF_getJobName2",getarg(7),Upper);
- case 6:
- set @name6$, callfunc("GF_getJobName2",getarg(6),Upper);
- case 5:
- set @name5$, callfunc("GF_getJobName2",getarg(5),Upper);
- case 4:
- set @name4$, callfunc("GF_getJobName2",getarg(4),Upper);
- case 3:
- set @name3$, callfunc("GF_getJobName2",getarg(3),Upper);
- case 2:
- set @name2$, callfunc("GF_getJobName2",getarg(2),Upper);
- case 1:
- set @name1$, callfunc("GF_getJobName2",getarg(1),Upper);
- default:
- return;
- }
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Job Swapping Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 3.4
+//===== Compatible With: =====================================
+//= eAthena SVN R7896+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Enables job changing among classes of the same 'type'
+//= (ie among 1st classes, or among 2nd classes)
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= * The previous Job, when enabled, is stored in:
+//= kej_prev_job (job id)
+//= kej_prev_joblv (job level)
+//= kej_prev_skills (skill count)
+//= kej_prev_dye (cloth dye)
+//============================================================
+
+- script keInit_jobSwap -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadJobSwap";
+ end;
+}
+
+function script F_keJobSwap {
+
+function SF_canRevert;
+function SF_canSwitch;
+function SF_revertJob;
+function SF_switch;
+function SF_calcSwapCost;
+function SF_testSwap;
+function SF_swapJob;
+function SF_getJobNames;
+
+ set @thisLevel, callfunc("GF_getJobLevel", Class);
+
+ set @prevId, kej_prev_job;
+ set @prevLv, kej_prev_joblv;
+ set @prevLevel, 0;
+ set @prevType, 0;
+
+ if ($@kejs_revertPolicy && @prevId && @prevLv) {
+ set @prevLevel, callfunc("GF_getJobLevel", @prevId);
+ set @prevType, callfunc("GF_getJobType", @prevId);
+ }
+
+ if (SF_canRevert())
+ { //Qualifies for Reverting
+ do {
+ set @revertmenu, select(
+ "- Return",
+ "- Return to previous class",
+ "- Change into another class"
+ );
+ switch (@revertmenu) {
+ case 2: //Revert
+ if (SF_revertJob())
+ return;
+ break;
+ case 3: //Switch
+ if (SF_switch() == 0)
+ return;
+ break;
+ }
+ } while (@revertmenu > 1);
+ return;
+ }
+ if (SF_canSwitch())
+ {
+ SF_switch();
+ return;
+ }
+
+ callfunc "F_keIntro", e_swt2, "There are no available jobs of your level.";
+ return;
+
+//SubFunction SF_canRevert, specifies if the character can revert to previous job.
+function SF_canRevert {
+ if ($@kejs_revertPolicy == 0 || @prevId == 0 || (Upper == 2 && @prevType != 2))
+ return 0;
+ if((@thisLevel == @prevLevel && Upper == @prevType) || $@kejs_revertPolicy == 2)
+ return 1;
+ if ($@kejs_SNpolicy && @prevType == Upper && ((@prevLevel == 3 && @thisLevel == 1) || (@prevLevel == 1 && @thisLevel == 3)))
+ return 1;
+ return 0;
+}
+
+//SubFunction SF_canSwitch, specifies if character can change to another job.
+function SF_canSwitch {
+ if (@thisLevel == 3)
+ return $@kejs_SNpolicy;
+ if (@thisLevel == 1 || @thisLevel == 2)
+ return 1;
+ return 0;
+}
+
+//Sub Function SF_switch. Presents the switch job menu. Returns 1 only if the
+//menu was left by picking "Cancel".
+function SF_switch {
+ switch (@thisLevel) {
+ case 1:
+ case 3: //First Classes
+ set @cost, SF_calcSwapCost($@kejs_job1ST, $@kejs_cost1ST, $@kejs_discount1ST);
+ set @preserve, $@kejs_preserve1ST;
+ if (SF_testSwap($@kejs_job1ST, @cost)) {
+ do {
+ if ($@kejs_SNpolicy && Upper != 1) { //S. Novice Menu
+ SF_getJobNames 7,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_SuperNovice;
+ set @kmenu, select(
+ "- Cancel job swap",
+ "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,"- "+@name7$
+ );
+ } else {
+ SF_getJobNames 6,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief;
+ set @kmenu, select(
+ "- Cancel job swap",
+ "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$
+ );
+ }
+ switch (@kmenu) {
+ case 2: //Acolyte
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Acolyte, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 3: //Archer
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Archer, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 4: //Mage
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Mage, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 5: //Merchant
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Merchant, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 6: //Swordman
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Swordman, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 7: //Thief
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Thief, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 8: //S. Novice
+ if (SF_swapJob(callfunc("GF_getJobId", Job_SuperNovice, Upper),@cost,@preserve))
+ return 0;
+ break;
+ }
+ } while (@kmenu > 1);
+ return 1;
+ }
+ break;
+
+ case 2: //Second Classes
+ set @cost, SF_calcSwapCost($@kejs_job2ND, $@kejs_cost2ND, $@kejs_discount2ND);
+ set @preserve, $@kejs_preserve2ND;
+ if (SF_testSwap($@kejs_job2ND, @cost)) {
+ do {
+ if (sex == 1) {
+ SF_getJobNames 12,Job_Alchem,Job_Assassin,Job_Bard,Job_Blacksmith,Job_Crusader,Job_Hunter,Job_Knight,Job_Monk,Job_Priest,Job_Rogue,Job_Sage,Job_Wizard;
+ set @kmenu, select(
+ "- Cancel job change",
+ "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,
+ "- "+@name7$,"- "+@name8$,"- "+@name9$,"- "+@name10$,"- "+@name11$,"- "+@name12$
+ );
+ if (@kmenu >= 7) //Dancer should be at pos 7.
+ set @kmenu, @kmenu+1;
+ } else {
+ SF_getJobNames 12,Job_Alchem,Job_Assassin,Job_Blacksmith,Job_Crusader,Job_Dancer,Job_Hunter,Job_Knight,Job_Monk,Job_Priest,Job_Rogue,Job_Sage,Job_Wizard;
+ set @kmenu, select(
+ "- Cancel job change",
+ "- "+@name1$,"- "+@name2$,"- "+@name3$,"- "+@name4$,"- "+@name5$,"- "+@name6$,
+ "- "+@name7$,"- "+@name8$,"- "+@name9$,"- "+@name10$,"- "+@name11$,"- "+@name12$
+ );
+ if (@kmenu >= 4) //Bard should be at pos 4.
+ set @kmenu, @kmenu+1;
+ }
+ switch (@kmenu)
+ {
+ case 2: //ALCHEMIST
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Alchem, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 3: //ASSASSIN
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Assassin, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 4: //BARD
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Bard, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 5: //BLACKSMITH
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Blacksmith, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 6: //CRUSADER
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Crusader, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 7: //DANCER
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Dancer, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 8: //HUNTER
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Hunter, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 9: //KNIGHT
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Knight, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 10: //MONK
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Monk, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 11: //PRIEST
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Priest, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 12: //ROGUE
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Rogue, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 13: //SAGE
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Sage, Upper),@cost,@preserve))
+ return 0;
+ break;
+ case 14: //WIZARD
+ if (SF_swapJob(callfunc("GF_getJobId", Job_Wizard, Upper),@cost,@preserve))
+ return 0;
+ break;
+ }
+ } while (@kmenu > 1);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+//SubFunction: SF_calcSwapCost (MinJob, BaseCost, Discount)
+//Calculates cost to swap jobs
+function SF_calcSwapCost {
+ set @cost, getarg(1);
+ set @cost, @cost - @cost*getarg(2)*(JobLevel-getarg(0))/100;
+ if (@cost < 0)
+ set @cost,0; //Free Change
+ return @cost;
+}
+
+//SubFunction: SF_testSwap(MinJobLv, Cost)
+//Checks if the player qualifies for job changing.
+function SF_testSwap {
+ if (JobLevel < getarg(0)) {
+ callfunc "F_keIntro", e_dots, "You need to be at least Job Lv "+getarg(0)+" before exchanging.";
+ return 0;
+ }
+
+ set @cost, callfunc("F_keCost",getarg(1),$@kejs_swapDiscount);
+ if (Zeny < @cost) {
+ callfunc "F_keIntro", e_dots, "You need "+@cost+"z to be able to change.";
+ return 0;
+ }
+ return 1;
+}
+
+//SubFunction: SF_swapJob (JobNumber, Zeny, PreserveRate)
+//Attempts to swap to the Jobgiven.
+//Zeny is the money cost
+//Preserve is how much of the previous job to preserve.
+function SF_swapJob {
+ set @newjobId, getarg(0);
+ set @cost, callfunc("F_keCost",getarg(1),$@kejs_swapDiscount);
+ set @preserve, getarg(2);
+
+ if (Class == @newjobId) {
+ callfunc "F_keIntro", e_meh, "Um... you are already that class!";
+ return 0;
+ }
+
+ set @newJob$, callfunc("GF_getJobName",@newjobId);
+ set @oldJob$, callfunc("GF_getJobName",Class);
+ set @newjoblv, JobLevel*@preserve/100;
+
+ if (@newjoblv > 1) {
+ if (select("- Cancel", "- Change to a Lv"+@newjoblv+" "+@newJob$+" ("+@cost+"z)") != 2)
+ return 0;
+ } else {
+ set @newjoblv,1;
+ if (select("- Cancel", "- Change to "+@newJob$+" ("+@cost+"z)") != 2)
+ return 0;
+ }
+
+ set @basic, getSkilllv(1);
+ set @preserve, skillpointcount() -JobLevel -@basic +@newjoblv; //Preserve holds the final amount of SkillPoints you should have.
+
+ if (@preserve < 0) {
+ callfunc "F_keIntro", e_gasp, "You need "+(-@preserve)+" more skill points to change class!";
+ return 0;
+ }
+
+ set @thisJoblevel, JobLevel;
+ resetSkill;
+
+ //Set previous job as needed.
+ if ($@kejs_revertPolicy) {
+ set kej_prev_job, Class;
+ set kej_prev_joblv, @thisJoblevel;
+ set kej_prev_skills, SkillPoint;
+ }
+ if ($@kejs_announce)
+ announce strcharinfo(0)+" has changed from "+@oldJob$+" to "+@newJob$+"...",16;
+
+ if ($@kejs_resetDye)
+ setlook 7,0;
+ jobchange @newjobId, 0;
+ skill 1,@basic,0;
+ set JobLevel, @newjoblv;
+ set SkillPoint, @preserve;
+ setoption(0);
+ sc_end -1;
+ callfunc "F_keCharge",getarg(2),$@kejs_swapDiscount,1;
+
+ emotion e_ok;
+ return 1;
+}
+
+//SubFunction: SF_revertJob (cost)
+//Reverts to the previous job.
+function SF_revertJob {
+ if (Class == kej_prev_job) {
+ callfunc "F_keIntro", e_no, "Hmm... You can't go back, because your previous class is the same as your current one??";
+ return 0;
+ }
+ set @newjob$, callfunc ("GF_getJobName",kej_prev_job);
+
+ set @cost,callfunc("F_keCost",$@kejs_revertCost,$@kejs_revertDiscount);
+
+ if (select("- Cancel","- Return to a Lv"+kej_prev_joblv+" "+@newjob$+" ("+@cost+"z)") != 2)
+ return 0;
+
+ if (!(callfunc("F_keCharge",$@kejs_revertCost,$@kejs_revertDiscount,1))) {
+ callfunc "F_keIntro", -1, "Sorry, you need "+@cost+"z before you can revert to a Lv"+kej_prev_joblv+" "+@newjob$+".";
+ return 0;
+ }
+ set @thisJobId, Class;
+ set @thisJobLv, JobLevel;
+
+ set @basic, getSkilllv(1);
+ resetSkill;
+ set @skill, SkillPoint;
+ if($@kejs_saveDye) {
+ set @prevDye, getlook(7);
+ setlook 7,0;
+ }
+ if ($@kejs_resetDye)
+ setlook 7,0;
+ jobchange kej_prev_job, 0;
+ if($@kejs_saveDye) {
+ setlook 7,kej_prev_dye;
+ set kej_prev_dye,@prevDye;
+ }
+ set JobLevel, kej_prev_joblv;
+ set SkillPoint, kej_prev_skills;
+
+ skill 1, @basic, 0;
+ set SkillPoint, SkillPoint-@basic;
+
+ set kej_prev_job, @thisJobId;
+ set kej_prev_joblv, @thisJobLv;
+ set kej_prev_skills, @skill;
+ setoption(0);
+ sc_end -1;
+
+ if ($@kejs_announce)
+ announce strcharinfo(0)+" has changed from "+callfunc ("GF_getJobName",@thisJobId)+" to "+@newjob$+"...",16;
+ return 1;
+}
+
+//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
+//Workaround until eA gets a fix for the bug where you can't use callfunc or
+//callsub within a menu
+function SF_getJobNames {
+ switch (getarg(0)) {
+ case 12:
+ set @name12$, callfunc("GF_getJobName2",getarg(12),Upper);
+ case 11:
+ set @name11$, callfunc("GF_getJobName2",getarg(11),Upper);
+ case 10:
+ set @name10$, callfunc("GF_getJobName2",getarg(10),Upper);
+ case 9:
+ set @name9$, callfunc("GF_getJobName2",getarg(9),Upper);
+ case 8:
+ set @name8$, callfunc("GF_getJobName2",getarg(8),Upper);
+ case 7:
+ set @name7$, callfunc("GF_getJobName2",getarg(7),Upper);
+ case 6:
+ set @name6$, callfunc("GF_getJobName2",getarg(6),Upper);
+ case 5:
+ set @name5$, callfunc("GF_getJobName2",getarg(5),Upper);
+ case 4:
+ set @name4$, callfunc("GF_getJobName2",getarg(4),Upper);
+ case 3:
+ set @name3$, callfunc("GF_getJobName2",getarg(3),Upper);
+ case 2:
+ set @name2$, callfunc("GF_getJobName2",getarg(2),Upper);
+ case 1:
+ set @name1$, callfunc("GF_getJobName2",getarg(1),Upper);
+ default:
+ return;
+ }
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt
index f5d1e0ef2..5aa2d3dd4 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_main.txt
@@ -1,405 +1,405 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Main Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 5.4
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= This module contains the main menu, plus the healing and
-//= storage services.
-//===== Additional Comments: =================================
-//= See <http://www.eathena.deltaanime.net/board/index.php?showtopic=20290>
-//= for indepth explanation of the Kafra Express Script Package.
-//= Services available: comment/uncomment what you want (lines 37-104)
-//= See config.txt for per-module configuration.
-//============================================================
-
-// F_KafraExpress (String "Kafra's name", String "kafra image file",
-//int location (0 = Town Kafra, 1 = Dungeon Kafra, 2 = Both),
-//String "save map", int save x, int save y)
-function script F_KafraExpress {
- set @name$,getarg(0);
- set @ke_type,getarg(2);
- if ($@kekp_reset)
- set @kafraPass,0;
- if (getarg(1) != "")
- cutin getarg(1),2;
- callfunc "F_keIntro",-1,"";
-
-M_INIT:
- set @discount, callfunc("F_keCost",1,100);
-
- if (@ke_type == 1) goto MD_INIT;
- menu
- "- Leave",L_END,
- "- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
- "- Warp Service",M_WARP,
- "- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
- "- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
- "- Job Services",M_JOB,
- "- Other Services",M_OTHER,
- "- Save Respawn point",L_SAVE;
-
-MD_INIT:
- menu
- "- Leave",L_END,
- "- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
- "- Warp Service",M_WARP,
- "- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
- "- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
- "- Job Services",M_JOB,
- "- Other Services",M_OTHER,
- "- Save Respawn point",L_SAVE;
-
-M_WARP:
- if (@ke_type == 3 && nif_q_done != 1)
- goto L_DENIED;
- if (@ke_type == 1)
- goto MD_WARP;
- menu
- "- Return",M_INIT,
- "- Dungeons",L_DUNGEON,
- "- PvP Arena",L_PVP,
- "- Guild Wars",L_GUILD_DUNGEON,
- "- Towns",L_TOWN;
-
-MD_WARP:
- menu
- "- Return",M_INIT,
- "- Dungeons",L_DUNGEON,
- "- PvP Arena",L_PVP,
- "- Guild Wars",L_GUILD_DUNGEON,
- "- Towns",L_TOWN;
-
-M_JOB:
- if (@ke_type == 1) goto MD_JOB;
- menu
- "- Return", M_INIT,
- "- Change Job",L_JOB_CHANGE,
- "- Swap Job",L_JOB_SWAP,
- "- Stat/Skill Services",L_STATS,
- "- Stat/Skill Market",L_STAT_MARKET,
- "- Rental Service",L_RENT;
-
-MD_JOB:
- menu
- "- Return", M_INIT,
- "- Change Job",L_JOB_CHANGE,
- "- Swap Job",L_JOB_SWAP,
- "- Stat/Skill Services",L_STATS,
- "- Stat/Skill Market",L_STAT_MARKET,
- "- Rental Service",L_RENT;
-
-M_OTHER:
- if (@ke_type == 1) goto MD_OTHER;
- menu
- "- Return",M_INIT,
- "- Bank Services",L_BANK,
- "- Use Kafra Shop",L_SHOP,
- "- Broadcast a message",L_BROADCAST,
- "- Refine Services",L_REFINE,
- "- Uncard Services",L_UNCARD,
- "- Stylist Service",L_STYLE,
- "- Use a Kafra Pass",L_PASS;
-
-MD_OTHER:
- menu
- "- Return",M_INIT,
- "- Bank Services",L_BANK,
- "- Use Kafra Shop",L_SHOP,
- "- Broadcast a message",L_BROADCAST,
- "- Refine Services",L_REFINE,
- "- Uncard Services",L_UNCARD,
- "- Stylist Service",L_STYLE,
- "- Use a Kafra Pass",L_PASS;
-
-L_HEAL:
- callfunc "F_keHeal";
- goto M_INIT;
-
-L_TOWN:
- callfunc "F_keWarpTown";
- goto M_WARP;
-
-L_DUNGEON:
- callfunc "F_keDungeonWarps", getarg(3);
- goto M_WARP;
-
-L_GUILD_DUNGEON:
- callfunc "F_keWarpWOE";
- goto M_WARP;
-
-L_PVP:
- callfunc "F_keWarpPvp";
- goto M_WARP;
-
-L_STORAGE:
- callfunc "F_keStorage", getarg(1);
- goto M_INIT;
-
-L_GUILD_STORAGE:
- callfunc "F_keGuildStorage", getarg(1);
- goto M_INIT;
-
-L_BANK:
- callfunc "F_keBank";
- goto M_OTHER;
-
-L_SHOP:
- callfunc "F_keShop",@ke_type, getarg(1);
- goto M_OTHER;
-
-L_BROADCAST:
- callfunc "F_keBroadcast",getarg(3);
- goto M_OTHER;
-
-L_PASS:
- callfunc "F_kePass";
- goto M_OTHER;
-
-L_REFINE:
- callfunc "F_keRefine";
- goto M_OTHER;
-
-L_UNCARD:
- callfunc "F_keUncard";
- goto M_OTHER;
-
-L_STYLE:
- callfunc "F_keStylist";
- goto M_OTHER;
-
-L_JOB_CHANGE:
- callfunc "F_keJobChange";
- goto M_JOB;
-
-L_JOB_SWAP:
- callfunc "F_keJobSwap";
- goto M_JOB;
-
-L_STATS:
- callfunc "F_keStats";
- goto M_JOB;
-
-L_STAT_MARKET:
- callfunc "F_keStatMarket";
- goto M_JOB;
-
-L_RENT:
- callfunc "F_keRent";
- goto M_JOB;
-
-L_SAVE:
- if (@ke_type == 3 && nif_q_done != 1)
- goto L_DENIED;
- if ($@kewt_travel && @ke_type != 1) {
- callfunc "F_keAddTravelTown", getarg(3);
- }
- if ($@kewd_travel && @ke_type != 0) {
- callfunc "F_keAddTravelDungeon", getarg(3);
- }
- if ($@ke_saveOnSpot) {
- getmapxy @map$,@x,@y,0;
- savepoint @map$,@x,@y;
- } else {
- savepoint getarg(3),getarg(4),getarg(5);
- }
- emotion e_scissors;
- goto M_INIT;
-
-L_DENIED:
- callfunc "F_keIntro", e_gg, "...no.";
- goto M_INIT;
-
-L_END:
- mes "Thank you for using Kafra Services.";
- close2;
- cutin getarg(1), 255;
- end;
-}
-
-//Function F_keIntro (emotion, message)
-//Displays a message followed by an emotion, then a next button, and finally
-//shows the intro message.
-function script F_keIntro {
- if (getarg(0) >= 0)
- emotion getarg(0);
- if (getarg(1) != "") {
- mes getarg(1);
- next;
- }
- mes "["+@name$+"]";
- mes "Welcome to Kafra Corp. Always by your side, wherever you go.";
- if(@kafraPass) mes "Your Kafra Pass is active,";
- mes "How may I be of help?";
- return;
-}
-
-//Function Heal, offers the heal subsystem.
-function script F_keHeal {
- set @qtyHP,MaxHp-Hp;
- set @qtySP,MaxSp-Sp;
- set @costHP, $@keh_hpCost*(MaxHp-Hp)/10;
- set @costSP, $@keh_spCost*(MaxSp-Sp)/10;
- set @costHPSP, @costHP+@costSP;
- set @discount, callfunc("F_keCost",1,100);
-
- if (@qtyHP + @qtySP == 0) {
- callfunc "F_keIntro", -1, "...you don't need to be healed.";
- return;
- }
- if (@qtyHP == 0) goto M_NO_HP;
- if (@qtySP == 0) goto M_NO_SP;
- menu "- Cancel",-,
- "- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP,
- "- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP,
- "- Heal Both ("+(@costHPSP*@discount)+"z)",L_HEAL_ALL;
- return;
-
-M_NO_HP:
- menu "- Cancel",-,
- "- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP;
- return;
-
-M_NO_SP:
- menu "- Cancel",-,
- "- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP;
- return;
-
-L_HEAL_HP:
- if (!(callfunc("F_keCharge",@costHP,100,0))) {
- callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
- return;
- }
- emotion e_no1;
- heal @qtyHP,0;
- return;
-
-L_HEAL_SP:
- if (!(callfunc("F_keCharge",@costSP,100,0))) {
- callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
- return;
- }
- emotion e_no1;
- heal 0,@qtySP;
- return;
-
-L_HEAL_ALL:
- if (!(callfunc("F_keCharge",@costHPSP,100,0))) {
- callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
- return;
- }
- emotion e_no1;
- heal @qtyHP,@qtySP;
- return;
-}
-
-//Function storage: allows access to the storage facility
-//The sent argument is the displaying image, so we can clear it afterwards.
-function script F_keStorage {
- if(basicskillcheck(0) > 0 && getskilllv(1) < 6) {
- callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
- return;
- }
- if (!(callfunc("F_keCharge",$@kes_cost,100,1))) {
- callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
- return;
- }
- mes "Thank for you using Kafra services.";
- emotion e_thx;
- close2;
- openstorage;
- cutin getarg(0), 255;
- end;
-}
-
-//Function G Storage: Allows access to the Guild Storage
-function script F_keGuildStorage {
- if(basicskillcheck(0) > 0 && getskilllv(1) < 6) {
- callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
- return;
- }
- if(getcharid(2) < 1) {
- callfunc "F_keIntro", e_swt, "You can't use the Guild Storage if you don't belong to a guild!";
- return;
- }
- if (callfunc("F_keCost",$@kegs_cost,100) > Zeny) {
- callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
- return;
- }
- if (guildopenstorage(0) == 1) {
- callfunc "F_keIntro", -1, "Sorry, the guild storage is currently in use by someone else. Try again later.";
- return;
- }
- callfunc "F_keCharge",$@kegs_cost,100,1;
- mes "Thank for you using Kafra services.";
- emotion e_thx;
- close2;
- cutin getarg(0), 255;
- end;
-}
-
-function script F_kePass {
- if (@kafraPass) {
- callfunc "F_keIntro", -1, "You already are using a Kafra Pass...";
- return;
- }
- if (countitem(1084)<1) {
- callfunc "F_keIntro", -1, "You obviously need a 'Kafra Pass' if you want to activate it.";
- return;
- }
- delitem 1084,1;
- set @kafraPass,1;
- callfunc "F_keIntro", e_lv, "Your Kafra Pass has been activated.";
- return;
-}
-
-//F_keCost(int cost, int discount%)
-//Returns what would be the cost of a service considering the KafraPass.
-//The discount value should be between 0 and 100
-function script F_keCost {
- if (@kafraPass) {
- return getarg(0)*(100-getarg(1))/100;
- }
- return getarg(0);
-}
-
-//F_keCharge(int cost, int discount%, bool appliesKP)
-//Charges for a service, using the KafraPass state and discount value.
-//appliesKP marks if the cost savings apply for stocking Kafra Reserve Points
-//Function returns 1 if successful, 0 if there's not enough zeny.
-function script F_keCharge {
- set @savings, 0;
- if (@kafraPass)
- set @savings, getarg(0)*getarg(1)/100;
- set @cost, getarg(0)-@savings;
- if (@cost > Zeny || @cost < 0) { // (@cost < 0) for overflow protection
- return 0;
- }
- set Zeny, Zeny-@cost;
-
- if (getarg(2) && @savings > 0 && $@kekp_reserveCost > 0) {
- set @savings, @savings/$@kekp_reserveCost;
- if (@savings < $@kekp_minReserve)
- set @savings, $@kekp_minReserve;
- if (@savings > $@kekp_maxReserve)
- set @savings, $@kekp_maxReserve;
-
- set RESRVPTS, RESRVPTS + @savings;
- }
- return 1;
-}
-
-//Function F_keWarp (int cost, int discount, int emotion, String map, int x, int y)
-function script F_keWarp {
- if (!(callfunc("F_keCharge",getarg(0),getarg(1),1))) {
- callfunc "F_keIntro", e_an, "You don't have enough Zeny...";
- return;
- }
- emotion getarg(2);
- warp getarg(3),getarg(4),getarg(5);
- end;
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Main Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 5.4
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= This module contains the main menu, plus the healing and
+//= storage services.
+//===== Additional Comments: =================================
+//= See <http://www.eathena.deltaanime.net/board/index.php?showtopic=20290>
+//= for indepth explanation of the Kafra Express Script Package.
+//= Services available: comment/uncomment what you want (lines 37-104)
+//= See config.txt for per-module configuration.
+//============================================================
+
+// F_KafraExpress (String "Kafra's name", String "kafra image file",
+//int location (0 = Town Kafra, 1 = Dungeon Kafra, 2 = Both),
+//String "save map", int save x, int save y)
+function script F_KafraExpress {
+ set @name$,getarg(0);
+ set @ke_type,getarg(2);
+ if ($@kekp_reset)
+ set @kafraPass,0;
+ if (getarg(1) != "")
+ cutin getarg(1),2;
+ callfunc "F_keIntro",-1,"";
+
+M_INIT:
+ set @discount, callfunc("F_keCost",1,100);
+
+ if (@ke_type == 1) goto MD_INIT;
+ menu
+ "- Leave",L_END,
+ "- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
+ "- Warp Service",M_WARP,
+ "- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
+ "- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
+ "- Job Services",M_JOB,
+ "- Other Services",M_OTHER,
+ "- Save Respawn point",L_SAVE;
+
+MD_INIT:
+ menu
+ "- Leave",L_END,
+ "- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
+ "- Warp Service",M_WARP,
+ "- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
+ "- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
+ "- Job Services",M_JOB,
+ "- Other Services",M_OTHER,
+ "- Save Respawn point",L_SAVE;
+
+M_WARP:
+ if (@ke_type == 3 && nif_q_done != 1)
+ goto L_DENIED;
+ if (@ke_type == 1)
+ goto MD_WARP;
+ menu
+ "- Return",M_INIT,
+ "- Dungeons",L_DUNGEON,
+ "- PvP Arena",L_PVP,
+ "- Guild Wars",L_GUILD_DUNGEON,
+ "- Towns",L_TOWN;
+
+MD_WARP:
+ menu
+ "- Return",M_INIT,
+ "- Dungeons",L_DUNGEON,
+ "- PvP Arena",L_PVP,
+ "- Guild Wars",L_GUILD_DUNGEON,
+ "- Towns",L_TOWN;
+
+M_JOB:
+ if (@ke_type == 1) goto MD_JOB;
+ menu
+ "- Return", M_INIT,
+ "- Change Job",L_JOB_CHANGE,
+ "- Swap Job",L_JOB_SWAP,
+ "- Stat/Skill Services",L_STATS,
+ "- Stat/Skill Market",L_STAT_MARKET,
+ "- Rental Service",L_RENT;
+
+MD_JOB:
+ menu
+ "- Return", M_INIT,
+ "- Change Job",L_JOB_CHANGE,
+ "- Swap Job",L_JOB_SWAP,
+ "- Stat/Skill Services",L_STATS,
+ "- Stat/Skill Market",L_STAT_MARKET,
+ "- Rental Service",L_RENT;
+
+M_OTHER:
+ if (@ke_type == 1) goto MD_OTHER;
+ menu
+ "- Return",M_INIT,
+ "- Bank Services",L_BANK,
+ "- Use Kafra Shop",L_SHOP,
+ "- Broadcast a message",L_BROADCAST,
+ "- Refine Services",L_REFINE,
+ "- Uncard Services",L_UNCARD,
+ "- Stylist Service",L_STYLE,
+ "- Use a Kafra Pass",L_PASS;
+
+MD_OTHER:
+ menu
+ "- Return",M_INIT,
+ "- Bank Services",L_BANK,
+ "- Use Kafra Shop",L_SHOP,
+ "- Broadcast a message",L_BROADCAST,
+ "- Refine Services",L_REFINE,
+ "- Uncard Services",L_UNCARD,
+ "- Stylist Service",L_STYLE,
+ "- Use a Kafra Pass",L_PASS;
+
+L_HEAL:
+ callfunc "F_keHeal";
+ goto M_INIT;
+
+L_TOWN:
+ callfunc "F_keWarpTown";
+ goto M_WARP;
+
+L_DUNGEON:
+ callfunc "F_keDungeonWarps", getarg(3);
+ goto M_WARP;
+
+L_GUILD_DUNGEON:
+ callfunc "F_keWarpWOE";
+ goto M_WARP;
+
+L_PVP:
+ callfunc "F_keWarpPvp";
+ goto M_WARP;
+
+L_STORAGE:
+ callfunc "F_keStorage", getarg(1);
+ goto M_INIT;
+
+L_GUILD_STORAGE:
+ callfunc "F_keGuildStorage", getarg(1);
+ goto M_INIT;
+
+L_BANK:
+ callfunc "F_keBank";
+ goto M_OTHER;
+
+L_SHOP:
+ callfunc "F_keShop",@ke_type, getarg(1);
+ goto M_OTHER;
+
+L_BROADCAST:
+ callfunc "F_keBroadcast",getarg(3);
+ goto M_OTHER;
+
+L_PASS:
+ callfunc "F_kePass";
+ goto M_OTHER;
+
+L_REFINE:
+ callfunc "F_keRefine";
+ goto M_OTHER;
+
+L_UNCARD:
+ callfunc "F_keUncard";
+ goto M_OTHER;
+
+L_STYLE:
+ callfunc "F_keStylist";
+ goto M_OTHER;
+
+L_JOB_CHANGE:
+ callfunc "F_keJobChange";
+ goto M_JOB;
+
+L_JOB_SWAP:
+ callfunc "F_keJobSwap";
+ goto M_JOB;
+
+L_STATS:
+ callfunc "F_keStats";
+ goto M_JOB;
+
+L_STAT_MARKET:
+ callfunc "F_keStatMarket";
+ goto M_JOB;
+
+L_RENT:
+ callfunc "F_keRent";
+ goto M_JOB;
+
+L_SAVE:
+ if (@ke_type == 3 && nif_q_done != 1)
+ goto L_DENIED;
+ if ($@kewt_travel && @ke_type != 1) {
+ callfunc "F_keAddTravelTown", getarg(3);
+ }
+ if ($@kewd_travel && @ke_type != 0) {
+ callfunc "F_keAddTravelDungeon", getarg(3);
+ }
+ if ($@ke_saveOnSpot) {
+ getmapxy @map$,@x,@y,0;
+ savepoint @map$,@x,@y;
+ } else {
+ savepoint getarg(3),getarg(4),getarg(5);
+ }
+ emotion e_scissors;
+ goto M_INIT;
+
+L_DENIED:
+ callfunc "F_keIntro", e_gg, "...no.";
+ goto M_INIT;
+
+L_END:
+ mes "Thank you for using Kafra Services.";
+ close2;
+ cutin getarg(1), 255;
+ end;
+}
+
+//Function F_keIntro (emotion, message)
+//Displays a message followed by an emotion, then a next button, and finally
+//shows the intro message.
+function script F_keIntro {
+ if (getarg(0) >= 0)
+ emotion getarg(0);
+ if (getarg(1) != "") {
+ mes getarg(1);
+ next;
+ }
+ mes "["+@name$+"]";
+ mes "Welcome to Kafra Corp. Always by your side, wherever you go.";
+ if(@kafraPass) mes "Your Kafra Pass is active,";
+ mes "How may I be of help?";
+ return;
+}
+
+//Function Heal, offers the heal subsystem.
+function script F_keHeal {
+ set @qtyHP,MaxHp-Hp;
+ set @qtySP,MaxSp-Sp;
+ set @costHP, $@keh_hpCost*(MaxHp-Hp)/10;
+ set @costSP, $@keh_spCost*(MaxSp-Sp)/10;
+ set @costHPSP, @costHP+@costSP;
+ set @discount, callfunc("F_keCost",1,100);
+
+ if (@qtyHP + @qtySP == 0) {
+ callfunc "F_keIntro", -1, "...you don't need to be healed.";
+ return;
+ }
+ if (@qtyHP == 0) goto M_NO_HP;
+ if (@qtySP == 0) goto M_NO_SP;
+ menu "- Cancel",-,
+ "- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP,
+ "- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP,
+ "- Heal Both ("+(@costHPSP*@discount)+"z)",L_HEAL_ALL;
+ return;
+
+M_NO_HP:
+ menu "- Cancel",-,
+ "- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP;
+ return;
+
+M_NO_SP:
+ menu "- Cancel",-,
+ "- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP;
+ return;
+
+L_HEAL_HP:
+ if (!(callfunc("F_keCharge",@costHP,100,0))) {
+ callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
+ return;
+ }
+ emotion e_no1;
+ heal @qtyHP,0;
+ return;
+
+L_HEAL_SP:
+ if (!(callfunc("F_keCharge",@costSP,100,0))) {
+ callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
+ return;
+ }
+ emotion e_no1;
+ heal 0,@qtySP;
+ return;
+
+L_HEAL_ALL:
+ if (!(callfunc("F_keCharge",@costHPSP,100,0))) {
+ callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
+ return;
+ }
+ emotion e_no1;
+ heal @qtyHP,@qtySP;
+ return;
+}
+
+//Function storage: allows access to the storage facility
+//The sent argument is the displaying image, so we can clear it afterwards.
+function script F_keStorage {
+ if(basicskillcheck(0) > 0 && getskilllv(1) < 6) {
+ callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
+ return;
+ }
+ if (!(callfunc("F_keCharge",$@kes_cost,100,1))) {
+ callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
+ return;
+ }
+ mes "Thank for you using Kafra services.";
+ emotion e_thx;
+ close2;
+ openstorage;
+ cutin getarg(0), 255;
+ end;
+}
+
+//Function G Storage: Allows access to the Guild Storage
+function script F_keGuildStorage {
+ if(basicskillcheck(0) > 0 && getskilllv(1) < 6) {
+ callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
+ return;
+ }
+ if(getcharid(2) < 1) {
+ callfunc "F_keIntro", e_swt, "You can't use the Guild Storage if you don't belong to a guild!";
+ return;
+ }
+ if (callfunc("F_keCost",$@kegs_cost,100) > Zeny) {
+ callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
+ return;
+ }
+ if (guildopenstorage(0) == 1) {
+ callfunc "F_keIntro", -1, "Sorry, the guild storage is currently in use by someone else. Try again later.";
+ return;
+ }
+ callfunc "F_keCharge",$@kegs_cost,100,1;
+ mes "Thank for you using Kafra services.";
+ emotion e_thx;
+ close2;
+ cutin getarg(0), 255;
+ end;
+}
+
+function script F_kePass {
+ if (@kafraPass) {
+ callfunc "F_keIntro", -1, "You already are using a Kafra Pass...";
+ return;
+ }
+ if (countitem(1084)<1) {
+ callfunc "F_keIntro", -1, "You obviously need a 'Kafra Pass' if you want to activate it.";
+ return;
+ }
+ delitem 1084,1;
+ set @kafraPass,1;
+ callfunc "F_keIntro", e_lv, "Your Kafra Pass has been activated.";
+ return;
+}
+
+//F_keCost(int cost, int discount%)
+//Returns what would be the cost of a service considering the KafraPass.
+//The discount value should be between 0 and 100
+function script F_keCost {
+ if (@kafraPass) {
+ return getarg(0)*(100-getarg(1))/100;
+ }
+ return getarg(0);
+}
+
+//F_keCharge(int cost, int discount%, bool appliesKP)
+//Charges for a service, using the KafraPass state and discount value.
+//appliesKP marks if the cost savings apply for stocking Kafra Reserve Points
+//Function returns 1 if successful, 0 if there's not enough zeny.
+function script F_keCharge {
+ set @savings, 0;
+ if (@kafraPass)
+ set @savings, getarg(0)*getarg(1)/100;
+ set @cost, getarg(0)-@savings;
+ if (@cost > Zeny || @cost < 0) { // (@cost < 0) for overflow protection
+ return 0;
+ }
+ set Zeny, Zeny-@cost;
+
+ if (getarg(2) && @savings > 0 && $@kekp_reserveCost > 0) {
+ set @savings, @savings/$@kekp_reserveCost;
+ if (@savings < $@kekp_minReserve)
+ set @savings, $@kekp_minReserve;
+ if (@savings > $@kekp_maxReserve)
+ set @savings, $@kekp_maxReserve;
+
+ set RESRVPTS, RESRVPTS + @savings;
+ }
+ return 1;
+}
+
+//Function F_keWarp (int cost, int discount, int emotion, String map, int x, int y)
+function script F_keWarp {
+ if (!(callfunc("F_keCharge",getarg(0),getarg(1),1))) {
+ callfunc "F_keIntro", e_an, "You don't have enough Zeny...";
+ return;
+ }
+ emotion getarg(2);
+ warp getarg(3),getarg(4),getarg(5);
+ end;
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt
index 88c5104f0..b59830e89 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_refine.txt
@@ -1,339 +1,339 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Refining Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.7
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Does item forging, ore purifying and repairing.
-//= Can also sell phracon/emveretarcon
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_refine -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadRefine";
- end;
-}
-
-function script F_keRefine {
-
-function SF_refine;
-function SF_repair;
-function SF_purify;
-function SF_sellOres;
-
- do {
- set @kmenu, select(
- "- Return",
- "- Refine Equipment",
- "- Repair Equipment",
- "- Buy Ores",
- "- Purify Ores"
- );
- switch(@kmenu) {
- case 2: //Refine
- SF_refine();
- break;
- case 3: //Repair
- SF_repair();
- break;
- case 4: //Buy Ore
- SF_sellOres();
- break;
- case 5: //Purify Ore
- SF_purify();
- break;
- }
- } while (@kmenu > 1);
- return;
-
-//Subfunction SF_refine, presents the refining menu.
-function SF_refine {
- do {
- set @part, select(
- "- Cancel upgrading",
- "- "+getequipname(1),
- "- "+getequipname(2),
- "- "+getequipname(3),
- "- "+getequipname(4),
- "- "+getequipname(5),
- "- "+getequipname(6),
- "- "+getequipname(7),
- "- "+getequipname(8),
- "- "+getequipname(9),
- "- "+getequipname(10)
- );
- set @part, @part-1;
- if (@part == 0)
- break;
- if (getequipisequiped(@part) == 0) {
- callfunc "F_keIntro", e_swt, "There is nothing to refine there...";
- } else
- if(getequipisenableref(@part) == 0 && $@kerf_refineAll == 0) {
- callfunc "F_keIntro", -1, "Sorry, this item cannot be refined.";
- } else
- if(getequiprefinerycnt(@part) >= $@kerf_maxLv) {
- callfunc "F_keIntro", -1, "This item cannot be refined further.";
- break;
- } else {
- switch (getequipweaponlv(@part))
- {
- case 0: //Armor
- set @mat,985;
- set @cost,$@kerf_armorCost;
- break;
- case 1:
- set @mat,1010;
- set @cost,$@kerf_weaponLv1Cost;
- break;
- case 2:
- set @mat,1011;
- set @cost,$@kerf_weaponLv2Cost;
- break;
- case 3:
- set @mat,984;
- set @cost,$@kerf_weaponLv3Cost;
- break;
- default:
- set @mat,984;
- set @cost,$@kerf_weaponLv4Cost;
- break;
- }
- set @cost, callfunc("F_keCost",@cost,$@kerf_discount);
- do {
- if ($@kerf_safe==0 && getequippercentrefinery(@part) < 100) {
- if ($@kerf_showChance) {
- if (select(
- "- Return ("+(100-getequippercentrefinery(@part))+"% chance refine will fail)",
- "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
- break;
- } else {
- if (select(
- "- Return (Upgrade not safe, item might break!)",
- "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
- break;
- }
- } else {
- if (select(
- "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)",
- "- Cancel") != 1)
- break;
- }
- if (getequiprefinerycnt(@part) >= $@kerf_maxLv) {
- callfunc "F_keIntro", e_ok, "This item has reached it's maximum level.";
- break;
- }
- if (countitem(@mat) < 1) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
- break;
- }
- if (!(callfunc("F_keCharge",@cost,$@kerf_discount,1))) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
- break;
- }
- delitem @mat,1;
- if ($@kerf_safe || getequippercentrefinery(@part)>rand(100)) {
- successrefitem @part;
- emotion e_rock;
- } else {
- failedrefitem @part;
- callfunc "F_keIntro", e_swt, "...sorry.";
- break;
- }
- } while (1);
- }
- } while (@part > 0);
- return;
-}
-
-//Subfunction: SF_repair()
-function SF_repair {
- set @cost,callfunc("F_keCost",$@kerf_repairCost,$@kerf_repairDiscount);
- do {
- set @broken1,getbrokenid(1);
- if(@broken1==NULL) {
- callfunc "F_keIntro", -1, "You don't need anything repaired for now.";
- return;
- }
- set @broken2,getbrokenid(2);
- set @broken3,getbrokenid(3);
- set @broken4,getbrokenid(4);
- set @broken5,getbrokenid(5);
- set @broken6,getbrokenid(6);
- set @broken7,getbrokenid(7);
- set @broken8,getbrokenid(8);
- set @broken9,getbrokenid(9);
- set @broken10,getbrokenid(10);
-
- if ($@kerf_repairSteel)
- set @str$,"- Cancel (Repairing costs "+@cost+"z and 1 "+getitemname(999);
- else
- set @str$,"- Cancel (Repairing costs "+@cost+"z)";
-
- set @idRepair, select(
- @str$,
- getitemname(@broken1),
- getitemname(@broken2),
- getitemname(@broken3),
- getitemname(@broken4),
- getitemname(@broken5),
- getitemname(@broken6),
- getitemname(@broken7),
- getitemname(@broken8),
- getitemname(@broken9),
- getitemname(@broken10)
- );
- set @idRepair, @idRepair-1;
- if (@idRepair == 0) break;
- if ($@kerf_repairSteel && countitem(999) < 1) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
- return;
- }
- if (!(callfunc("F_keCharge", $@kerf_repairCost, $@kerf_repairDiscount,1))) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
- return;
- }
- if ($@kerf_repairSteel) delitem 999,1;
- repair(@idRepair);
- emotion e_lv2;
- } while (@idRepair > 0);
-}
-
-//Subfunction: SF_purify()
-function SF_purify {
- if ($@kerf_purifyAll) {
- set @submenu, select (
- "- Return",
- "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
- "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")",
- "- Purify "+getitemname(998)+" (need 2 "+getitemname(1002)+")",
- "- Temper "+getitemname(999)+" (need 5 "+getitemname(998)+", 1 "+getitemname(1003)+")",
- "- Temper "+getitemname(994)+" (need 10 "+getitemname(990)+")",
- "- Temper "+getitemname(995)+" (need 10 "+getitemname(991)+")",
- "- Temper "+getitemname(996)+" (need 10 "+getitemname(992)+")",
- "- Temper "+getitemname(997)+" (need 10 "+getitemname(993)+")",
- "- Temper "+getitemname(1000)+" (need 10 "+getitemname(1001)+")"
- );
- } else {
- set @submenu, select(
- "- Return",
- "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
- "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")"
- );
- }
- switch (@submenu) {
- case 2: //Oridecon
- set @item, 984;
- set @rough, 756;
- set @qty, 5;
- break;
- case 3: //Elunium
- set @item, 985;
- set @rough, 757;
- set @qty, 5;
- break;
- case 4: //Iron
- set @item, 998;
- set @rough, 1002;
- set @qty, 2;
- break;
- case 5: //Steel
- set @item,999;
- set @rough,998;
- set @qty,5;
- set @rough2,1003;
- set @qty2,1;
-
- set @count,countitem(@rough1);
- set @count2,countitem(@rough2);
- if (@count < @qty || @count2 < @qty2) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
- return;
- }
- set @count, @count/@qty;
- set @count2, @count2/@qty2;
- if (@count2 < @count)
- set @count,@count2;
- delitem @rough2,@qty2*@count;
- break;
- case 6: //Fire
- set @item, 994;
- set @rough, 990;
- set @qty, 10;
- break;
- case 7: //Ice
- set @item, 995;
- set @rough, 991;
- set @qty, 10;
- break;
- case 8: //Wind
- set @item, 996;
- set @rough, 992;
- set @qty, 10;
- break;
- case 9: //Earth
- set @item, 997;
- set @rough, 993;
- set @qty, 10;
- break;
- case 10: //Star
- set @item, 1000;
- set @rough, 1001;
- set @qty, 10;
- break;
- default:
- return;
- }
- set @count,countitem(@rough);
- if (@count < @qty) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
- return;
- }
- set @count, @count/@qty;
- delitem @rough,@qty*@count;
- getitem @item,@count;
- emotion e_paper;
-}
-
-//Subfunction: SF_sellOres()
-function SF_sellOres {
- do {
- set @submenu, select(
- "- Return",
- "- Buy "+getitemname(1010)+" (200z each)",
- "- Buy "+getitemname(1011)+" (1000z each)"
- );
- switch (@submenu) {
- case 2: //Phracon
- set @mat, 1010;
- set @cost, 200;
- break;
- case 3: //Emveratarcon
- set @mat, 1011;
- set @cost, 1000;
- break;
- default:
- return;
- }
- input @qty;
- set @cost,@cost*@qty;
- if (@qty < 1) {
- callfunc "F_keIntro", e_pif, "That is NOT a valid quantity...";
- } else if (@cost > Zeny) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
- } else if (@cost < 0) {
- callfunc "F_keIntro", e_swt2, "Sorry, that's too much! Try buying less...";
- } else {
- set Zeny,Zeny-@cost;
- getitem @mat,@qty;
- emotion e_paper;
- }
- } while (@submenu > 1);
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Refining Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.7
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Does item forging, ore purifying and repairing.
+//= Can also sell phracon/emveretarcon
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_refine -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadRefine";
+ end;
+}
+
+function script F_keRefine {
+
+function SF_refine;
+function SF_repair;
+function SF_purify;
+function SF_sellOres;
+
+ do {
+ set @kmenu, select(
+ "- Return",
+ "- Refine Equipment",
+ "- Repair Equipment",
+ "- Buy Ores",
+ "- Purify Ores"
+ );
+ switch(@kmenu) {
+ case 2: //Refine
+ SF_refine();
+ break;
+ case 3: //Repair
+ SF_repair();
+ break;
+ case 4: //Buy Ore
+ SF_sellOres();
+ break;
+ case 5: //Purify Ore
+ SF_purify();
+ break;
+ }
+ } while (@kmenu > 1);
+ return;
+
+//Subfunction SF_refine, presents the refining menu.
+function SF_refine {
+ do {
+ set @part, select(
+ "- Cancel upgrading",
+ "- "+getequipname(1),
+ "- "+getequipname(2),
+ "- "+getequipname(3),
+ "- "+getequipname(4),
+ "- "+getequipname(5),
+ "- "+getequipname(6),
+ "- "+getequipname(7),
+ "- "+getequipname(8),
+ "- "+getequipname(9),
+ "- "+getequipname(10)
+ );
+ set @part, @part-1;
+ if (@part == 0)
+ break;
+ if (getequipisequiped(@part) == 0) {
+ callfunc "F_keIntro", e_swt, "There is nothing to refine there...";
+ } else
+ if(getequipisenableref(@part) == 0 && $@kerf_refineAll == 0) {
+ callfunc "F_keIntro", -1, "Sorry, this item cannot be refined.";
+ } else
+ if(getequiprefinerycnt(@part) >= $@kerf_maxLv) {
+ callfunc "F_keIntro", -1, "This item cannot be refined further.";
+ break;
+ } else {
+ switch (getequipweaponlv(@part))
+ {
+ case 0: //Armor
+ set @mat,985;
+ set @cost,$@kerf_armorCost;
+ break;
+ case 1:
+ set @mat,1010;
+ set @cost,$@kerf_weaponLv1Cost;
+ break;
+ case 2:
+ set @mat,1011;
+ set @cost,$@kerf_weaponLv2Cost;
+ break;
+ case 3:
+ set @mat,984;
+ set @cost,$@kerf_weaponLv3Cost;
+ break;
+ default:
+ set @mat,984;
+ set @cost,$@kerf_weaponLv4Cost;
+ break;
+ }
+ set @cost, callfunc("F_keCost",@cost,$@kerf_discount);
+ do {
+ if ($@kerf_safe==0 && getequippercentrefinery(@part) < 100) {
+ if ($@kerf_showChance) {
+ if (select(
+ "- Return ("+(100-getequippercentrefinery(@part))+"% chance refine will fail)",
+ "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
+ break;
+ } else {
+ if (select(
+ "- Return (Upgrade not safe, item might break!)",
+ "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
+ break;
+ }
+ } else {
+ if (select(
+ "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)",
+ "- Cancel") != 1)
+ break;
+ }
+ if (getequiprefinerycnt(@part) >= $@kerf_maxLv) {
+ callfunc "F_keIntro", e_ok, "This item has reached it's maximum level.";
+ break;
+ }
+ if (countitem(@mat) < 1) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
+ break;
+ }
+ if (!(callfunc("F_keCharge",@cost,$@kerf_discount,1))) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
+ break;
+ }
+ delitem @mat,1;
+ if ($@kerf_safe || getequippercentrefinery(@part)>rand(100)) {
+ successrefitem @part;
+ emotion e_rock;
+ } else {
+ failedrefitem @part;
+ callfunc "F_keIntro", e_swt, "...sorry.";
+ break;
+ }
+ } while (1);
+ }
+ } while (@part > 0);
+ return;
+}
+
+//Subfunction: SF_repair()
+function SF_repair {
+ set @cost,callfunc("F_keCost",$@kerf_repairCost,$@kerf_repairDiscount);
+ do {
+ set @broken1,getbrokenid(1);
+ if(@broken1==NULL) {
+ callfunc "F_keIntro", -1, "You don't need anything repaired for now.";
+ return;
+ }
+ set @broken2,getbrokenid(2);
+ set @broken3,getbrokenid(3);
+ set @broken4,getbrokenid(4);
+ set @broken5,getbrokenid(5);
+ set @broken6,getbrokenid(6);
+ set @broken7,getbrokenid(7);
+ set @broken8,getbrokenid(8);
+ set @broken9,getbrokenid(9);
+ set @broken10,getbrokenid(10);
+
+ if ($@kerf_repairSteel)
+ set @str$,"- Cancel (Repairing costs "+@cost+"z and 1 "+getitemname(999);
+ else
+ set @str$,"- Cancel (Repairing costs "+@cost+"z)";
+
+ set @idRepair, select(
+ @str$,
+ getitemname(@broken1),
+ getitemname(@broken2),
+ getitemname(@broken3),
+ getitemname(@broken4),
+ getitemname(@broken5),
+ getitemname(@broken6),
+ getitemname(@broken7),
+ getitemname(@broken8),
+ getitemname(@broken9),
+ getitemname(@broken10)
+ );
+ set @idRepair, @idRepair-1;
+ if (@idRepair == 0) break;
+ if ($@kerf_repairSteel && countitem(999) < 1) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
+ return;
+ }
+ if (!(callfunc("F_keCharge", $@kerf_repairCost, $@kerf_repairDiscount,1))) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
+ return;
+ }
+ if ($@kerf_repairSteel) delitem 999,1;
+ repair(@idRepair);
+ emotion e_lv2;
+ } while (@idRepair > 0);
+}
+
+//Subfunction: SF_purify()
+function SF_purify {
+ if ($@kerf_purifyAll) {
+ set @submenu, select (
+ "- Return",
+ "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
+ "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")",
+ "- Purify "+getitemname(998)+" (need 2 "+getitemname(1002)+")",
+ "- Temper "+getitemname(999)+" (need 5 "+getitemname(998)+", 1 "+getitemname(1003)+")",
+ "- Temper "+getitemname(994)+" (need 10 "+getitemname(990)+")",
+ "- Temper "+getitemname(995)+" (need 10 "+getitemname(991)+")",
+ "- Temper "+getitemname(996)+" (need 10 "+getitemname(992)+")",
+ "- Temper "+getitemname(997)+" (need 10 "+getitemname(993)+")",
+ "- Temper "+getitemname(1000)+" (need 10 "+getitemname(1001)+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Return",
+ "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
+ "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")"
+ );
+ }
+ switch (@submenu) {
+ case 2: //Oridecon
+ set @item, 984;
+ set @rough, 756;
+ set @qty, 5;
+ break;
+ case 3: //Elunium
+ set @item, 985;
+ set @rough, 757;
+ set @qty, 5;
+ break;
+ case 4: //Iron
+ set @item, 998;
+ set @rough, 1002;
+ set @qty, 2;
+ break;
+ case 5: //Steel
+ set @item,999;
+ set @rough,998;
+ set @qty,5;
+ set @rough2,1003;
+ set @qty2,1;
+
+ set @count,countitem(@rough1);
+ set @count2,countitem(@rough2);
+ if (@count < @qty || @count2 < @qty2) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
+ return;
+ }
+ set @count, @count/@qty;
+ set @count2, @count2/@qty2;
+ if (@count2 < @count)
+ set @count,@count2;
+ delitem @rough2,@qty2*@count;
+ break;
+ case 6: //Fire
+ set @item, 994;
+ set @rough, 990;
+ set @qty, 10;
+ break;
+ case 7: //Ice
+ set @item, 995;
+ set @rough, 991;
+ set @qty, 10;
+ break;
+ case 8: //Wind
+ set @item, 996;
+ set @rough, 992;
+ set @qty, 10;
+ break;
+ case 9: //Earth
+ set @item, 997;
+ set @rough, 993;
+ set @qty, 10;
+ break;
+ case 10: //Star
+ set @item, 1000;
+ set @rough, 1001;
+ set @qty, 10;
+ break;
+ default:
+ return;
+ }
+ set @count,countitem(@rough);
+ if (@count < @qty) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
+ return;
+ }
+ set @count, @count/@qty;
+ delitem @rough,@qty*@count;
+ getitem @item,@count;
+ emotion e_paper;
+}
+
+//Subfunction: SF_sellOres()
+function SF_sellOres {
+ do {
+ set @submenu, select(
+ "- Return",
+ "- Buy "+getitemname(1010)+" (200z each)",
+ "- Buy "+getitemname(1011)+" (1000z each)"
+ );
+ switch (@submenu) {
+ case 2: //Phracon
+ set @mat, 1010;
+ set @cost, 200;
+ break;
+ case 3: //Emveratarcon
+ set @mat, 1011;
+ set @cost, 1000;
+ break;
+ default:
+ return;
+ }
+ input @qty;
+ set @cost,@cost*@qty;
+ if (@qty < 1) {
+ callfunc "F_keIntro", e_pif, "That is NOT a valid quantity...";
+ } else if (@cost > Zeny) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
+ } else if (@cost < 0) {
+ callfunc "F_keIntro", e_swt2, "Sorry, that's too much! Try buying less...";
+ } else {
+ set Zeny,Zeny-@cost;
+ getitem @mat,@qty;
+ emotion e_paper;
+ }
+ } while (@submenu > 1);
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt
index b25691cb2..286739204 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_statmarket.txt
@@ -1,128 +1,128 @@
-//===== eAthena Script =======================================
-//= Kafra Expres - Stat/Skill Market Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= eAthena SVN R3579+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Lets players buy/sell skill points/stat points
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_statmarket -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadStatMarket";
- end;
-}
-
-function script F_keStatMarket {
- set @discount,callfunc("F_keCost",100,$@kesm_discount);
- do {
- set @kmenu, select (
- "- Return",
- "- Buy Stat points ("+($@kesm_stBuyPrice*@discount/100)+"z each)",
- "- Sell Stat points (up to "+StatusPoint+"/"+$@kesm_stSellPrice+"z each)",
- "- Buy Skill points ("+($@kesm_skBuyPrice*@discount/100)+"z each)",
- "- Sell Skill points (up to "+SkillPoint+"/"+$@kesm_skSellPrice+"z each)",
- "- Trade Stats -> Skill ("+$@kesm_skTradePrice+" stats/skill)",
- "- Trade Skills -> Stats ("+$@kesm_stTradePrice+" stats/skill)"
- );
- if (@kmenu > 1)
- input @qty;
- switch (@kmenu) {
- case 2: //Buy Stat
- set @min, 1;
- set @max, 9999;
- set @cost, @qty*$@kesm_stBuyPrice;
- break;
- case 3: //Sell Stat
- input @qty;
- set @min, 1;
- set @max, StatusPoint;
- set @cost, @qty*$@kesm_stSellPrice;
- break;
- case 4: //Buy Skill
- set @min, 1;
- set @max, 9999;
- set @cost, @qty*$@kesm_skBuyPrice;
- break;
- case 5: //Sell Skill
- set @min, 1;
- set @max, SkillPoint;
- set @cost, @qty*$@kesm_skSellPrice;
- break;
- case 6: //Convert stats -> skills
- set @min, $@kesm_skTradePrice;
- set @max, StatusPoint;
- set @cost, @qty/$@kesm_skTradePrice;
- break;
- case 7: //Convert skills -> stats
- set @min, 1;
- set @max, SkillPoint;
- set @cost, @qty*$@kesm_stTradePrice;
- break;
- default:
- return;
- }
- if (@qty < @min) {
- if (@min == 1)
- callfunc "F_keIntro", e_dots, "Was that supposed to be funny?";
- else
- callfunc "F_keIntro", e_dots, "That is not enough to buy a single skill...";
- } else
- if (@qty > @max) {
- if (@max == 9999)
- callfunc "F_keIntro", e_X, "You can't buy that much!";
- else
- callfunc "F_keIntro", e_X, "You don't have that many to sell...";
- } else
- if (@cost < 0) {
- callfunc "F_keIntro", e_swt2, "That is too much for a single transaction! Try a smaller quantity... please?";
- } else {
- switch(@kmenu) {
- case 2: //Buy Stat
- if (!(callfunc("F_keCharge",@cost,$@kesm_discount,1))) {
- callfunc "F_keIntro", e_X, "You do not have enough zeny to buy that much.";
- break;
- }
- set StatusPoint,StatusPoint+@qty;
- emotion e_oh;
- break;
- case 3: //Sell Stat
- set StatusPoint,StatusPoint-@qty;
- set Zeny,Zeny+@cost;
- emotion e_oh;
- break;
- case 4: //Buy Skill
- if (!(callfunc("F_keCharge",@cost,$@kesm_discount,1))) {
- callfunc "F_keIntro", e_X, "You do not have enough zeny to buy that much.";
- break;
- }
- set SkillPoint,SkillPoint+@qty;
- emotion e_oh;
- break;
- case 5: //Sell Skill
- set SkillPoint,SkillPoint-@qty;
- set Zeny,Zeny+@cost;
- emotion e_oh;
- break;
- case 6: //Convert stats -> skills
- set @qty, @cost*$@kesm_skTradePrice;
- set StatusPoint,StatusPoint-@qty;
- set SkillPoint,SkillPoint+@cost;
- emotion e_oh;
- break;
- case 7: //Convert skills -> stats
- set SkillPoint,SkillPoint-@qty;
- set StatusPoint,StatusPoint+@cost;
- emotion e_oh;
- break;
- }
- }
- } while (@kmenu > 1);
- return;
-}
+//===== eAthena Script =======================================
+//= Kafra Expres - Stat/Skill Market Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= eAthena SVN R3579+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Lets players buy/sell skill points/stat points
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_statmarket -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadStatMarket";
+ end;
+}
+
+function script F_keStatMarket {
+ set @discount,callfunc("F_keCost",100,$@kesm_discount);
+ do {
+ set @kmenu, select (
+ "- Return",
+ "- Buy Stat points ("+($@kesm_stBuyPrice*@discount/100)+"z each)",
+ "- Sell Stat points (up to "+StatusPoint+"/"+$@kesm_stSellPrice+"z each)",
+ "- Buy Skill points ("+($@kesm_skBuyPrice*@discount/100)+"z each)",
+ "- Sell Skill points (up to "+SkillPoint+"/"+$@kesm_skSellPrice+"z each)",
+ "- Trade Stats -> Skill ("+$@kesm_skTradePrice+" stats/skill)",
+ "- Trade Skills -> Stats ("+$@kesm_stTradePrice+" stats/skill)"
+ );
+ if (@kmenu > 1)
+ input @qty;
+ switch (@kmenu) {
+ case 2: //Buy Stat
+ set @min, 1;
+ set @max, 9999;
+ set @cost, @qty*$@kesm_stBuyPrice;
+ break;
+ case 3: //Sell Stat
+ input @qty;
+ set @min, 1;
+ set @max, StatusPoint;
+ set @cost, @qty*$@kesm_stSellPrice;
+ break;
+ case 4: //Buy Skill
+ set @min, 1;
+ set @max, 9999;
+ set @cost, @qty*$@kesm_skBuyPrice;
+ break;
+ case 5: //Sell Skill
+ set @min, 1;
+ set @max, SkillPoint;
+ set @cost, @qty*$@kesm_skSellPrice;
+ break;
+ case 6: //Convert stats -> skills
+ set @min, $@kesm_skTradePrice;
+ set @max, StatusPoint;
+ set @cost, @qty/$@kesm_skTradePrice;
+ break;
+ case 7: //Convert skills -> stats
+ set @min, 1;
+ set @max, SkillPoint;
+ set @cost, @qty*$@kesm_stTradePrice;
+ break;
+ default:
+ return;
+ }
+ if (@qty < @min) {
+ if (@min == 1)
+ callfunc "F_keIntro", e_dots, "Was that supposed to be funny?";
+ else
+ callfunc "F_keIntro", e_dots, "That is not enough to buy a single skill...";
+ } else
+ if (@qty > @max) {
+ if (@max == 9999)
+ callfunc "F_keIntro", e_X, "You can't buy that much!";
+ else
+ callfunc "F_keIntro", e_X, "You don't have that many to sell...";
+ } else
+ if (@cost < 0) {
+ callfunc "F_keIntro", e_swt2, "That is too much for a single transaction! Try a smaller quantity... please?";
+ } else {
+ switch(@kmenu) {
+ case 2: //Buy Stat
+ if (!(callfunc("F_keCharge",@cost,$@kesm_discount,1))) {
+ callfunc "F_keIntro", e_X, "You do not have enough zeny to buy that much.";
+ break;
+ }
+ set StatusPoint,StatusPoint+@qty;
+ emotion e_oh;
+ break;
+ case 3: //Sell Stat
+ set StatusPoint,StatusPoint-@qty;
+ set Zeny,Zeny+@cost;
+ emotion e_oh;
+ break;
+ case 4: //Buy Skill
+ if (!(callfunc("F_keCharge",@cost,$@kesm_discount,1))) {
+ callfunc "F_keIntro", e_X, "You do not have enough zeny to buy that much.";
+ break;
+ }
+ set SkillPoint,SkillPoint+@qty;
+ emotion e_oh;
+ break;
+ case 5: //Sell Skill
+ set SkillPoint,SkillPoint-@qty;
+ set Zeny,Zeny+@cost;
+ emotion e_oh;
+ break;
+ case 6: //Convert stats -> skills
+ set @qty, @cost*$@kesm_skTradePrice;
+ set StatusPoint,StatusPoint-@qty;
+ set SkillPoint,SkillPoint+@cost;
+ emotion e_oh;
+ break;
+ case 7: //Convert skills -> stats
+ set SkillPoint,SkillPoint-@qty;
+ set StatusPoint,StatusPoint+@cost;
+ emotion e_oh;
+ break;
+ }
+ }
+ } while (@kmenu > 1);
+ return;
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt
index 8ad75e7a6..73618c9eb 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_stats.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Stat/Reset Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers stat raising and Stat/Reset skills
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_stats -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadStats";
- end;
-}
-
-function script F_keStats {
-
- function SF_statRaise;
-
- set @discount,callfunc("F_keCost",100,$@kest_discount);
- do {
- set @kmenu, select(
- "- Return",
- "- Raise Stats",
- "- Reset Stats ("+$@kest_stResetCost+"z+"+$@kest_BaseLvCost+"/blv)",
- "- Reset Skills ("+$@kest_skResetCost+"z+"+$@kest_JobLvCost+"/jlv)",
- "- Reset Both ("+$@kest_resetCost+"z+"+$@kest_BothLvCost+"/lv)"
- );
- switch (@kmenu) {
- case 2: //Stat raising
- SF_statRaise();
- set @cost, 0;
- set @reset, 0;
- break;
- case 3: //Reset Stat
- set @cost, $@kest_stResetCost+BaseLevel*$@kest_BaseLvCost;
- set @reset, 1;
- break;
- case 4: //Reset Skills
- set @cost, $@kest_skResetCost+(JobLevel+jobchange_level)*$@kest_JobLvCost;
- set @reset, 2;
- break;
- case 5: //Reset Both
- set @cost, $@kest_resetCost+(BaseLevel+JobLevel+jobchange_level)*$@kest_BothLvCost;
- set @reset, 3;
- break;
- default: //Cancel
- set @cost, 0;
- set @reset, 0;
- break;
- }
- if (@reset > 0) {
- if (select("- Cancel","- Reset for "+(@cost*@discount/100)+"z") == 2) {
- if (!(callfunc("F_keCharge",@cost,$@kest_discount,1))) {
- callfunc "F_keIntro", e_an, "Sorry, you don't have enough Zeny.";
- } else {
- if (@reset&1)
- ResetStatus;
- if (@reset&2) {
- if ($@kest_resetBasic)
- ResetSkill;
- else {
- set @skill1,getskilllv(1);
- ResetSkill;
- skill 1,@skill1,0;
- set SkillPoint,SkillPoint-@skill1;
- }
- }
- emotion e_hmm;
- }
- }
- }
- } while (@kmenu > 1);
- return;
-
-function SF_statRaise {
- do {
- set @submenu, select(
- "- Return",
- "- Raise Strength",
- "- Raise Agility",
- "- Raise Vitality",
- "- Raise Intelligence",
- "- Raise Dexterity",
- "- Raise Luck"
- );
- switch (@submenu) {
- case 2:
- set @stat,bStr;
- break;
- case 3:
- set @stat,bAgi;
- break;
- case 4:
- set @stat,bVit;
- break;
- case 5:
- set @stat,bInt;
- break;
- case 6:
- set @stat,bDex;
- break;
- case 7:
- set @stat,bLuk;
- break;
- default:
- return;
- }
- input @qty;
- if (@qty <1) {
- callfunc "F_keIntro", e_swt, "I don't lower stats, try resetting them.";
- } else if (@qty >100) {
- callfunc "F_keIntro", e_swt2, "Sorry... I can only raise stats up to 100 at a time.";
- } else {
- do {
- statusup @stat;
- set @qty,@qty-1;
- } while (@qty > 0);
- emotion e_ok;
- }
- } while (@submenu > 1);
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Stat/Reset Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers stat raising and Stat/Reset skills
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_stats -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadStats";
+ end;
+}
+
+function script F_keStats {
+
+ function SF_statRaise;
+
+ set @discount,callfunc("F_keCost",100,$@kest_discount);
+ do {
+ set @kmenu, select(
+ "- Return",
+ "- Raise Stats",
+ "- Reset Stats ("+$@kest_stResetCost+"z+"+$@kest_BaseLvCost+"/blv)",
+ "- Reset Skills ("+$@kest_skResetCost+"z+"+$@kest_JobLvCost+"/jlv)",
+ "- Reset Both ("+$@kest_resetCost+"z+"+$@kest_BothLvCost+"/lv)"
+ );
+ switch (@kmenu) {
+ case 2: //Stat raising
+ SF_statRaise();
+ set @cost, 0;
+ set @reset, 0;
+ break;
+ case 3: //Reset Stat
+ set @cost, $@kest_stResetCost+BaseLevel*$@kest_BaseLvCost;
+ set @reset, 1;
+ break;
+ case 4: //Reset Skills
+ set @cost, $@kest_skResetCost+(JobLevel+jobchange_level)*$@kest_JobLvCost;
+ set @reset, 2;
+ break;
+ case 5: //Reset Both
+ set @cost, $@kest_resetCost+(BaseLevel+JobLevel+jobchange_level)*$@kest_BothLvCost;
+ set @reset, 3;
+ break;
+ default: //Cancel
+ set @cost, 0;
+ set @reset, 0;
+ break;
+ }
+ if (@reset > 0) {
+ if (select("- Cancel","- Reset for "+(@cost*@discount/100)+"z") == 2) {
+ if (!(callfunc("F_keCharge",@cost,$@kest_discount,1))) {
+ callfunc "F_keIntro", e_an, "Sorry, you don't have enough Zeny.";
+ } else {
+ if (@reset&1)
+ ResetStatus;
+ if (@reset&2) {
+ if ($@kest_resetBasic)
+ ResetSkill;
+ else {
+ set @skill1,getskilllv(1);
+ ResetSkill;
+ skill 1,@skill1,0;
+ set SkillPoint,SkillPoint-@skill1;
+ }
+ }
+ emotion e_hmm;
+ }
+ }
+ }
+ } while (@kmenu > 1);
+ return;
+
+function SF_statRaise {
+ do {
+ set @submenu, select(
+ "- Return",
+ "- Raise Strength",
+ "- Raise Agility",
+ "- Raise Vitality",
+ "- Raise Intelligence",
+ "- Raise Dexterity",
+ "- Raise Luck"
+ );
+ switch (@submenu) {
+ case 2:
+ set @stat,bStr;
+ break;
+ case 3:
+ set @stat,bAgi;
+ break;
+ case 4:
+ set @stat,bVit;
+ break;
+ case 5:
+ set @stat,bInt;
+ break;
+ case 6:
+ set @stat,bDex;
+ break;
+ case 7:
+ set @stat,bLuk;
+ break;
+ default:
+ return;
+ }
+ input @qty;
+ if (@qty <1) {
+ callfunc "F_keIntro", e_swt, "I don't lower stats, try resetting them.";
+ } else if (@qty >100) {
+ callfunc "F_keIntro", e_swt2, "Sorry... I can only raise stats up to 100 at a time.";
+ } else {
+ do {
+ statusup @stat;
+ set @qty,@qty-1;
+ } while (@qty > 0);
+ emotion e_ok;
+ }
+ } while (@submenu > 1);
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt
index d39d5d1bc..4ff5b7c8b 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_uncard.txt
@@ -1,165 +1,165 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Uncarder Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers uncarding services.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_uncard -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadUncard";
- end;
-}
-
-function script F_keUncard {
-
-function SF_uncard;
-
- do {
- set @kmenu, select(
- "- Return",
- "- See Price Specifics",
- "- "+getequipname(1),
- "- "+getequipname(2),
- "- "+getequipname(3),
- "- "+getequipname(4),
- "- "+getequipname(5),
- "- "+getequipname(6),
- "- "+getequipname(7),
- "- "+getequipname(8),
- "- "+getequipname(9),
- "- "+getequipname(10)
- );
- if (@kmenu == 1)
- return;
- if (@kmenu == 2) { //Details
- mes "Okay, listen up...";
- next;
- mes "["+@name$+"]";
- if ($@keuc_BaseCost)
- mes "The base cost is of "+$@keuc_BaseCost+"z.";
- mes "Each card to be removed incurs a cost of +"+$@keuc_CardCost+"z.";
- mes "The refine level of the compounded equipment can incur an additional cost:";
- mes "Armors: "+$@keuc_UpgradeCostA+"z per level.";
- mes "Lv1 Weapons: "+$@keuc_UpgradeCostW1+"z per level.";
- mes "Lv2 Weapons: "+$@keuc_UpgradeCostW2+"z per level.";
- mes "Lv3 Weapons: "+$@keuc_UpgradeCostW3+"z per level.";
- mes "Lv4 Weapons: "+$@keuc_UpgradeCostW4+"z per level.";
-
- if ($@keuc_Mat1 && $@keuc_Qty1) {
- mes "The materials needed are:";
- mes "- "+$@keuc_Qty1+" "+getitemname($@keuc_Mat1)+".";
- }
- if ($@keuc_Mat2 && $@keuc_Qty2)
- mes "- "+$@keuc_Qty2+" "+getitemname($@keuc_Mat2)+".";
-
- if ($@keuc_Fail1Chance || $@keuc_Fail2Chance)
- mes "There is a chance the process might fail and you'll lose your items.";
-
- next;
- callfunc "F_keIntro", -1, "";
- } else {
- if (SF_uncard(@kmenu-2))
- return;
- }
- } while (@kmenu >1);
- return;
-
-//Subfunction SF_uncard (equipment-position)
-//Attempts to uncard the equipment.
-function SF_uncard {
- set @part, getarg(0);
- if(getequipcardcnt(@part) == 0) {
- callfunc "F_keIntro", e_ag, "There are no cards to remove there!";
- return 0;
- }
- set @cost, $@keuc_BaseCost;
- set @cost, @cost + $@keuc_CardCost*getequipcardcnt(@part);
-
- switch (getequipweaponlv(@part)) {
- case 0: //Armor
- set @upgradeCost, $@keuc_UpgradeCostA;
- break;
- case 1: //Lv1 Weapons
- set @upgradeCost, $@keuc_UpgradeCostW1;
- break;
- case 2: //Lv2 Weapons
- set @upgradeCost, $@keuc_UpgradeCostW2;
- break;
- case 3: //Lv3 Weapons
- set @upgradeCost, $@keuc_UpgradeCostW3;
- break;
- default: //Lv4 Weapons
- set @upgradeCost, $@keuc_UpgradeCostW4;
- }
-
- set @cost, @cost + @upgradeCost*getequiprefinerycnt(@part);
-
- set @price, callfunc("F_keCost",@cost,$@keuc_discount);
-
- if ($@keuc_Fail1Chance) {
- set @failsave, select(
- "- Cancel",
- "- Remove cards ("+@price+"z, item gets priority)",
- "- Remove cards ("+@price+"z, cards get priority)"
- );
- } else {
- set @failsave, select(
- "- Cancel",
- "- Remove cards ("+@price+"z)"
- );
- }
- if (@failsave == 1)
- return 0;
- set @failsave, @failsave-1; //1: Save item, 2: Save Card
-
- if (($@keuc_Mat1 && countitem($@keuc_Mat1) < $@keuc_Qty1)
- || ($@keuc_Mat2 && countitem($@keuc_Mat2) < $@keuc_Qty2)) {
- callfunc "F_keIntro", e_pif, "You do not have all the materials I need...";
- return 0;
- }
-
- if (!(callfunc("F_keCharge",@cost,$@keuc_discount,1))) {
- callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
- return 0;
- }
-
- if ($@keuc_Mat1 && $@keuc_Qty1)
- delitem $@keuc_Mat1, $@keuc_Qty1;
- if ($@keuc_Mat2 && $@keuc_Qty2)
- delitem $@keuc_Mat2, $@keuc_Qty2;
-
- set @failtype,-1;
- //Recycling cost...
- set @cost, rand(1000);
- if (@cost < $@keuc_Fail2Chance) //Total Failure
- set @failtype, 0;
- else if (@cost < $@keuc_Fail1Chance) //Partial Failure
- set @failtype, @failsave;
- else if (@cost < $@keuc_Fail0Chance) //Harmless Failure
- set @failtype, 3;
- else { //Success
- successremovecards @part;
- emotion e_ho;
- return 1;
- }
- failedremovecards @part,@failtype;
- if (@failtype == 1)
- mes "The cards were lost...";
- if (@failtype == 2)
- mes "The item was lost...";
- if (@failtype == 0)
- mes "Lost the cards and item...";
- callfunc "F_keIntro", e_swt, "...oops.";
- return 1;
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Uncarder Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers uncarding services.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_uncard -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadUncard";
+ end;
+}
+
+function script F_keUncard {
+
+function SF_uncard;
+
+ do {
+ set @kmenu, select(
+ "- Return",
+ "- See Price Specifics",
+ "- "+getequipname(1),
+ "- "+getequipname(2),
+ "- "+getequipname(3),
+ "- "+getequipname(4),
+ "- "+getequipname(5),
+ "- "+getequipname(6),
+ "- "+getequipname(7),
+ "- "+getequipname(8),
+ "- "+getequipname(9),
+ "- "+getequipname(10)
+ );
+ if (@kmenu == 1)
+ return;
+ if (@kmenu == 2) { //Details
+ mes "Okay, listen up...";
+ next;
+ mes "["+@name$+"]";
+ if ($@keuc_BaseCost)
+ mes "The base cost is of "+$@keuc_BaseCost+"z.";
+ mes "Each card to be removed incurs a cost of +"+$@keuc_CardCost+"z.";
+ mes "The refine level of the compounded equipment can incur an additional cost:";
+ mes "Armors: "+$@keuc_UpgradeCostA+"z per level.";
+ mes "Lv1 Weapons: "+$@keuc_UpgradeCostW1+"z per level.";
+ mes "Lv2 Weapons: "+$@keuc_UpgradeCostW2+"z per level.";
+ mes "Lv3 Weapons: "+$@keuc_UpgradeCostW3+"z per level.";
+ mes "Lv4 Weapons: "+$@keuc_UpgradeCostW4+"z per level.";
+
+ if ($@keuc_Mat1 && $@keuc_Qty1) {
+ mes "The materials needed are:";
+ mes "- "+$@keuc_Qty1+" "+getitemname($@keuc_Mat1)+".";
+ }
+ if ($@keuc_Mat2 && $@keuc_Qty2)
+ mes "- "+$@keuc_Qty2+" "+getitemname($@keuc_Mat2)+".";
+
+ if ($@keuc_Fail1Chance || $@keuc_Fail2Chance)
+ mes "There is a chance the process might fail and you'll lose your items.";
+
+ next;
+ callfunc "F_keIntro", -1, "";
+ } else {
+ if (SF_uncard(@kmenu-2))
+ return;
+ }
+ } while (@kmenu >1);
+ return;
+
+//Subfunction SF_uncard (equipment-position)
+//Attempts to uncard the equipment.
+function SF_uncard {
+ set @part, getarg(0);
+ if(getequipcardcnt(@part) == 0) {
+ callfunc "F_keIntro", e_ag, "There are no cards to remove there!";
+ return 0;
+ }
+ set @cost, $@keuc_BaseCost;
+ set @cost, @cost + $@keuc_CardCost*getequipcardcnt(@part);
+
+ switch (getequipweaponlv(@part)) {
+ case 0: //Armor
+ set @upgradeCost, $@keuc_UpgradeCostA;
+ break;
+ case 1: //Lv1 Weapons
+ set @upgradeCost, $@keuc_UpgradeCostW1;
+ break;
+ case 2: //Lv2 Weapons
+ set @upgradeCost, $@keuc_UpgradeCostW2;
+ break;
+ case 3: //Lv3 Weapons
+ set @upgradeCost, $@keuc_UpgradeCostW3;
+ break;
+ default: //Lv4 Weapons
+ set @upgradeCost, $@keuc_UpgradeCostW4;
+ }
+
+ set @cost, @cost + @upgradeCost*getequiprefinerycnt(@part);
+
+ set @price, callfunc("F_keCost",@cost,$@keuc_discount);
+
+ if ($@keuc_Fail1Chance) {
+ set @failsave, select(
+ "- Cancel",
+ "- Remove cards ("+@price+"z, item gets priority)",
+ "- Remove cards ("+@price+"z, cards get priority)"
+ );
+ } else {
+ set @failsave, select(
+ "- Cancel",
+ "- Remove cards ("+@price+"z)"
+ );
+ }
+ if (@failsave == 1)
+ return 0;
+ set @failsave, @failsave-1; //1: Save item, 2: Save Card
+
+ if (($@keuc_Mat1 && countitem($@keuc_Mat1) < $@keuc_Qty1)
+ || ($@keuc_Mat2 && countitem($@keuc_Mat2) < $@keuc_Qty2)) {
+ callfunc "F_keIntro", e_pif, "You do not have all the materials I need...";
+ return 0;
+ }
+
+ if (!(callfunc("F_keCharge",@cost,$@keuc_discount,1))) {
+ callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
+ return 0;
+ }
+
+ if ($@keuc_Mat1 && $@keuc_Qty1)
+ delitem $@keuc_Mat1, $@keuc_Qty1;
+ if ($@keuc_Mat2 && $@keuc_Qty2)
+ delitem $@keuc_Mat2, $@keuc_Qty2;
+
+ set @failtype,-1;
+ //Recycling cost...
+ set @cost, rand(1000);
+ if (@cost < $@keuc_Fail2Chance) //Total Failure
+ set @failtype, 0;
+ else if (@cost < $@keuc_Fail1Chance) //Partial Failure
+ set @failtype, @failsave;
+ else if (@cost < $@keuc_Fail0Chance) //Harmless Failure
+ set @failtype, 3;
+ else { //Success
+ successremovecards @part;
+ emotion e_ho;
+ return 1;
+ }
+ failedremovecards @part,@failtype;
+ if (@failtype == 1)
+ mes "The cards were lost...";
+ if (@failtype == 2)
+ mes "The item was lost...";
+ if (@failtype == 0)
+ mes "Lost the cards and item...";
+ callfunc "F_keIntro", e_swt, "...oops.";
+ return 1;
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt
index 84cbef768..2bc99b515 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_dungeon.txt
@@ -1,1761 +1,1761 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Dungeon Warps Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 3.5
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+, RO Episode 8+ (Hugel)
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers warping to dungeons.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= Flag values used for dungeons:
-//= 0x00000001 Abyss Lake
-//= 0x00000002 Amatsu
-//= 0x00000004 AntHell
-//= 0x00000008 Ayothaya
-//= 0x00000010 Byalan
-//= 0x00000020 Comodo
-//= 0x00000040 Clock tower
-//= 0x00000080 Coal Mines
-//= 0x00000100 Culvert
-//= 0x00000200 Einbech
-//= 0x00000400 Gefenia
-//= 0x00000800 Geffen
-//= 0x00001000 GlastHeim
-//= 0x00002000 Gon Ryun
-//= 0x00004000 Hidden Temple
-//= 0x00008000 Juperos
-//= 0x00010000 Lighthalzen
-//= 0x00020000 Lou Yang
-//= 0x00040000 Magma Caves
-//= 0x00080000 Orcs
-//= 0x00100000 Payon
-//= 0x00200000 Pyramid
-//= 0x00400000 Sphinx
-//= 0x00800000 Sunken Ship
-//= 0x01000000 Thanatos
-//= 0x02000000 Toy Factory
-//= 0x04000000 Turtle Island
-//= 0x08000000 Umbala
-
-//============================================================
-
-- script keInit_warpDungeon -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadWarpDungeon";
- end;
-}
-
-function script F_keDungeonWarps {
-
-function SF_abyssLake;
-function SF_amatsu;
-function SF_antHell;
-function SF_ayothaya;
-function SF_byalan;
-function SF_comodo;
-function SF_clockTower;
-function SF_coalMine;
-function SF_culvert;
-function SF_einbech;
-function SF_gefenia;
-function SF_geffen;
-function SF_glastHeim;
-function SF_gonRyun;
-function SF_hiddenTemple;
-function SF_juperos;
-function SF_lightHalzen;
-function SF_louYang;
-function SF_magma;
-function SF_orcs;
-function SF_payon;
-function SF_pyramid;
-function SF_sphinx;
-function SF_sunkenShip;
-function SF_thanatosTower;
-function SF_toyFactory;
-function SF_turtleIsland;
-function SF_umbala;
- //Store player map, will be needed in any of the submenus.
- set @map$, getarg(0);
- do {
- set @discount,callfunc("F_keCost",100,$@kewd_discount);
- if ($@kewd_showOnline) {
- set @kmenu, select (
- "- Cancel",
- "- Abyss Lake ("+$@kewd_abyssLake*@discount/100+"z/"+(getmapusers("abyss_01.gat")
- +getmapusers("abyss_02.gat")+getmapusers("abyss_03.gat"))+" "+$@ked_users$+")",
- "- Amatsu Dungeon ("+$@kewd_amatsu*@discount/100+"z/"+(getmapusers("ama_dun01.gat")
- +getmapusers("ama_dun02.gat")+getmapusers("ama_dun03.gat"))+" "+$@ked_users$+")",
- "- Ant Hell ("+$@kewd_antHell*@discount/100+"z/"+(getmapusers("anthell01.gat")
- +getmapusers("anthell02.gat"))+" "+$@ked_users$+")",
- "- Ayothaya Ancient Shrine ("+$@kewd_ayothaya*@discount/100+"z/"+(getmapusers("ayo_dun01.gat")
- +getmapusers("ayo_dun02.gat"))+" "+$@ked_users$+")",
- "- Byalan Dungeon ("+$@kewd_byalan*@discount/100+"z/"+(getmapusers("iz_dun00.gat")
- +getmapusers("iz_dun01.gat")+getmapusers("iz_dun02.gat")+getmapusers("iz_dun03.gat")
- +getmapusers("iz_dun04.gat"))+" "+$@ked_users$+")",
- "- Comodo Caves ("+$@kewd_comodo*@discount/100+"z/"+(getmapusers("beach_dun.gat")
- +getmapusers("beach_dun2.gat")+getmapusers("beach_dun3.gat"))+" "+$@ked_users$+")",
- "- Clock Tower ("+$@kewd_clockTower*@discount/100+"z/"+(getmapusers("c_tower1.gat")
- +getmapusers("c_tower2.gat")+getmapusers("c_tower3.gat")+getmapusers("c_tower4.gat")
- +getmapusers("alde_dun01.gat")+getmapusers("alde_dun02.gat")+getmapusers("alde_dun03.gat")
- +getmapusers("alde_dun04.gat"))+" "+$@ked_users$+")",
- "- Coal Mine ("+$@kewd_coalMines*@discount/100+"z/"+(getmapusers("mjo_dun01.gat")
- +getmapusers("mjo_dun02.gat")+getmapusers("mjo_dun03.gat"))+" "+$@ked_users$+")",
- "- Culvert ("+$@kewd_culvert*@discount/100+"z/"+(getmapusers("prt_sewb1.gat")+getmapusers("prt_sewb2.gat")
- +getmapusers("prt_sewb3.gat")+getmapusers("prt_sewb4.gat"))+" "+$@ked_users$+")",
- "- Einbroch Station ("+$@kewd_einbech*@discount/100+"z/"+(getmapusers("ein_dun01.gat")
- +getmapusers("ein_dun02.gat"))+" "+$@ked_users$+")",
- "- Gefenia ("+$@kewd_gefenia*@discount/100+"z/"+(getmapusers("gefenia01.gat")+getmapusers("gefenia02.gat")
- +getmapusers("gefenia03.gat")+getmapusers("gefenia04.gat"))+" "+$@ked_users$+")",
- "- Geffen Dungeon ("+$@kewd_geffen*@discount/100+"z/"+(getmapusers("gef_dun00.gat")
- +getmapusers("gef_dun01.gat")+getmapusers("gef_dun02.gat")+getmapusers("gef_dun03.gat"))+" "+$@ked_users$+")",
- "- Glast Heim ("+$@kewd_glastHeim*@discount/100+"z/"+(getmapusers("gl_cas02.gat")+getmapusers("gl_church.gat")
- +getmapusers("gl_chyard.gat")+getmapusers("gl_dun01.gat")+getmapusers("gl_dun02.gat")
- +getmapusers("gl_in01.gat")+getmapusers("gl_knt01.gat")+getmapusers("gl_knt02.gat")
- +getmapusers("gl_prison.gat")+getmapusers("gl_prison1.gat")+getmapusers("gl_sew01.gat")
- +getmapusers("gl_sew02.gat")+getmapusers("gl_sew03.gat")+getmapusers("gl_sew04.gat")
- +getmapusers("gl_step.gat")+getmapusers("glast_01.gat"))+" "+$@ked_users$+")",
- "- Gon Ryun Dungeon ("+$@kewd_gonRyun*@discount/100+"z/"+(getmapusers("gon_dun01.gat")
- +getmapusers("gon_dun02.gat")+getmapusers("gon_dun03.gat"))+" "+$@ked_users$+")",
- "- Hidden Temple ("+$@kewd_hiddenTemple*@discount/100+"z/"+(getmapusers("prt_maze01.gat")
- +getmapusers("prt_maze02.gat")+getmapusers("prt_maze03.gat"))+" "+$@ked_users$+")",
- "- Juperos ("+$@kewd_juperos*@discount/100+"z/"+(getmapusers("juperos_01.gat")+getmapusers("juperos_02.gat")
- +getmapusers("jupe_area1.gat")+getmapusers("jupe_area2.gat")+getmapusers("jupe_core.gat")
- +getmapusers("jupe_gate.gat")+getmapusers("jupe_area1.gat"))+" "+$@ked_users$+")",
- "- LightHalzen Rekkenber ("+$@kewd_lightHalzen*@discount/100+"z/"+(getmapusers("lhz_dun01.gat")
- +getmapusers("lhz_dun02.gat")+getmapusers("lhz_dun03.gat"))+" "+$@ked_users$+")",
- "- Lou Yang Royal Tomb ("+$@kewd_louYang*@discount/100+"z/"+(getmapusers("lou_dun01.gat")
- +getmapusers("lou_dun02.gat")+getmapusers("lou_dun03.gat"))+" "+$@ked_users$+")",
- "- Magma Dungeon ("+$@kewd_magma*@discount/100+"z/"+(getmapusers("mag_dun01.gat")
- +getmapusers("mag_dun02.gat"))+" "+$@ked_users$+")",
- "- Orc Dungeon ("+$@kewd_orc*@discount/100+"z/"+(getmapusers("orcsdun01.gat")
- +getmapusers("orcsdun02.gat"))+" "+$@ked_users$+")",
- "- Payon Dungeon ("+$@kewd_payon*@discount/100+"z/"+(getmapusers("pay_dun00.gat")
- +getmapusers("pay_dun01.gat")+getmapusers("pay_dun02.gat")+getmapusers("pay_dun03.gat")
- +getmapusers("pay_dun04.gat"))+" "+$@ked_users$+")",
- "- Pyramid ("+$@kewd_pyramid*@discount/100+"z/"+(getmapusers("moc_pryd01.gat")+getmapusers("moc_pryd02.gat")
- +getmapusers("moc_pryd03.gat")+getmapusers("moc_pryd04.gat")+getmapusers("moc_pryd05.gat")
- +getmapusers("moc_pryd06.gat")+getmapusers("moc_prydb1.gat"))+" "+$@ked_users$+")",
- "- Sphinx ("+$@kewd_sphinx*@discount/100+"z/"+(getmapusers("in_sphinx1.gat")
- +getmapusers("in_sphinx2.gat")+getmapusers("in_sphinx3.gat")+getmapusers("in_sphinx4.gat")
- +getmapusers("in_sphinx5.gat"))+" "+$@ked_users$+")",
- "- Sunken Ship ("+$@kewd_sunkenShip*@discount/100+"z/"+(getmapusers("treasure01.gat")
- +getmapusers("treasure02.gat"))+" "+$@ked_users$+")",
- "- Thanatos Tower ("+$@kewd_thanatosTower*@discount/100+"z/"+(getmapusers("tha_t01.gat")
- +getmapusers("tha_t02.gat")+getmapusers("tha_t03.gat")+getmapusers("tha_t04.gat")
- +getmapusers("tha_t05.gat")+getmapusers("tha_t06.gat")+getmapusers("tha_t07.gat")
- +getmapusers("tha_t08.gat")+getmapusers("tha_t09.gat")+getmapusers("tha_t10.gat")
- +getmapusers("tha_t11.gat")+getmapusers("tha_t12.gat")+getmapusers("thana_step.gat")
- +getmapusers("thana_boss.gat"))+" "+$@ked_users$+")",
- "- Toy Factory ("+$@kewd_toyFactory*@discount/100+"z/"+(getmapusers("xmas_dun01.gat")
- +getmapusers("xmas_dun02.gat"))+" "+$@ked_users$+")",
- "- Turtle Island ("+$@kewd_turtleIsland*@discount/100+"z/"+(getmapusers("tur_dun01.gat")
- +getmapusers("tur_dun02.gat")+getmapusers("tur_dun03.gat")+getmapusers("tur_dun04.gat")
- +getmapusers("tur_dun05.gat")+getmapusers("tur_dun06.gat"))+" "+$@ked_users$+")",
- "- Umbala Dungeon ("+$@kewd_umbala*@discount/100+"z/"+(getmapusers("um_dun01.gat")
- +getmapusers("um_dun02.gat"))+" "+$@ked_users$+")"
- );
- } else {
- set @kmenu, select(
- "- Cancel",
- "- Abyss Lake ("+$@kewd_abyssLake*@discount/100+"z)",
- "- Amatsu Dungeon ("+$@kewd_amatsu*@discount/100+"z)",
- "- Ant Hell ("+$@kewd_antHell*@discount/100+"z)",
- "- Ayothaya Ancient Shrine ("+$@kewd_ayothaya*@discount/100+"z)",
- "- Byalan Dungeon ("+$@kewd_byalan*@discount/100+"z)",
- "- Comodo Caves ("+$@kewd_comodo*@discount/100+"z)",
- "- Clock Tower ("+$@kewd_clockTower*@discount/100+"z)",
- "- Coal Mine ("+$@kewd_coalMines*@discount/100+"z)",
- "- Culvert ("+$@kewd_culvert*@discount/100+"z)",
- "- Einbroch Mine ("+$@kewd_einbech*@discount/100+"z)",
- "- Gefenia ("+$@kewd_gefenia*@discount/100+"z)",
- "- Geffen Dungeon ("+$@kewd_geffen*@discount/100+"z)",
- "- Glast Heim ("+$@kewd_glastHeim*@discount/100+"z)",
- "- Gon Ryun Dungeon ("+$@kewd_gonRyun*@discount/100+"z)",
- "- Hidden Temple ("+$@kewd_hiddenTemple*@discount/100+"z)",
- "- Juperos ("+$@kewd_juperos*@discount/100+"z)",
- "- LightHalzen Rekkenber ("+$@kewd_lightHalzen*@discount/100+"z)",
- "- Lou Yang Royal Tomb ("+$@kewd_louYang*@discount/100+"z)",
- "- Magma Dungeon ("+$@kewd_magma*@discount/100+"z)",
- "- Orcs Dungeon ("+$@kewd_orc*@discount/100+"z)",
- "- Payon Dungeon ("+$@kewd_payon*@discount/100+"z)",
- "- Pyramid ("+$@kewd_pyramid*@discount/100+"z)",
- "- Sphinx ("+$@kewd_sphinx*@discount/100+"z)",
- "- Sunken Ship ("+$@kewd_sunkenShip*@discount/100+"z)",
- "- Thanatos Tower ("+$@kewd_thanatosTower*@discount/100+"z)",
- "- Toy Factory ("+$@kewd_toyFactory*@discount/100+"z)",
- "- Turtle Island ("+$@kewd_turtleIsland*@discount/100+"z)",
- "- Umbala Dungeon ("+$@kewd_umbala*@discount/100+"z)"
- );
- }
- switch (@kmenu) {
- case 2:
- SF_abyssLake();
- break;
- case 3:
- SF_amatsu();
- break;
- case 4:
- SF_antHell();
- break;
- case 5:
- SF_ayothaya();
- break;
- case 6:
- SF_byalan();
- break;
- case 7:
- SF_comodo();
- break;
- case 8:
- SF_clockTower();
- break;
- case 9:
- SF_coalMine();
- break;
- case 10:
- SF_culvert();
- break;
- case 11:
- SF_einbech();
- break;
- case 12:
- SF_gefenia();
- break;
- case 13:
- SF_geffen();
- break;
- case 14:
- SF_glastHeim();
- break;
- case 15:
- SF_gonRyun();
- break;
- case 16:
- SF_hiddenTemple();
- break;
- case 17:
- SF_juperos();
- break;
- case 18:
- SF_lightHalzen();
- break;
- case 19:
- SF_louYang();
- break;
- case 20:
- SF_magma();
- break;
- case 21:
- SF_orcs();
- break;
- case 22:
- SF_payon();
- break;
- case 23:
- SF_pyramid();
- break;
- case 24:
- SF_sphinx();
- break;
- case 25:
- SF_sunkenShip();
- break;
- case 26:
- SF_thanatosTower();
- break;
- case 27:
- SF_toyFactory();
- break;
- case 28:
- SF_turtleIsland();
- break;
- case 29:
- SF_umbala();
- break;
- default:
- return;
- }
- } while (@kmenu > 1);
- return;
-
-//Subfunction SF_check(flag, cost, floor-count, player-map, dungeon-map#, map#1, map#2, ...)
-//If kewd_travel is set, the flag needs to match to be to warp there.
-//Floor count is the amount of levels the dungeon needs a price for,
-//dungeon-map# is the number of maps passed that need to be checked against
-//the player's map to see if they are warping from within the entrance.
-
-function SF_check {
- if ($@kewd_travel && !((kewd_travel|#kewd_travel)&getarg(0))) {
- callfunc "F_keIntro", e_sry, "Sorry, but we can only warp you to dungeons you have saved in before.";
- return 0;
- }
- set @cost, getarg(1);
- set @discount,100;
- set @map$, getarg(3);
- set @mapI, getarg(4);
-
- while (@mapI > 0)
- {
- if (@map$ == getarg(4+@mapI)) {
- set @discount,100-$@kewd_entryDiscount;
- break;
- }
- set @mapI, @mapI-1;
- }
- set @discountKP, callfunc("F_keCost",100,$@kewd_discount);
- set @discount,@discount*@discountKP/100;
-
- set @cost,@cost*@discount/100;
- set @inc,@cost*$@kewd_levelCost/100;
-
- //@discountKP is used to reverse the price to before the KP discount takes place
- if (@discountKP == 0)
- set @discountKP,1;
- if ($@kewd_deep == 0)
- return 1;
-
- switch (getarg(2)) {
- case 9:
- set @cost9, @cost +8*@inc;
- case 8:
- set @cost8, @cost +7*@inc;
- case 7:
- set @cost7, @cost +6*@inc;
- case 6:
- set @cost6, @cost +5*@inc;
- case 5:
- set @cost5, @cost +4*@inc;
- case 4:
- set @cost4, @cost +3*@inc;
- case 3:
- set @cost3, @cost +2*@inc;
- case 2:
- set @cost2, @cost +@inc;
- }
- return 1;
-}
-
-function SF_abyssLake {
- if (!(SF_check(0x1, $@kewd_abyssLake, 3, @map$, 1, "hu_fild05.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Abyss Lake",
- "- Entrance ("+@cost+"z/"+getmapusers("abyss_01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("abyss_02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("abyss_03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Abyss Lake",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"hu_fild05.gat",173,308;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"abyss_02.gat",272,270;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"abyss_03.gat",116,29;
- break;
- }
-}
-
-function SF_amatsu {
- if (!(SF_check(0x2, $@kewd_amatsu, 3, @map$, 1, "ama_in02.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Amatsu Dungeon",
- "- Entrance ("+@cost+"z/"+getmapusers("ama_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("ama_dun02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("ama_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Amatsu Dungeon",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"ama_in02.gat",120,181;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ama_dun02.gat",34,41;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"ama_dun03.gat",119,14;
- break;
- }
-}
-
-function SF_antHell {
- if (!(SF_check(0x4, $@kewd_antHell, 1, @map$, 2, "moc_fild04.gat","moc_fild15.gat")))
- return;
- if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Ant Hell",
- "- Northern Entrance ("+@cost+"z/"+getmapusers("anthell01.gat")+" "+$@ked_users$+")",
- "- Southern Entrance ("+@cost+"z/"+getmapusers("anthell02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Ant Hell",
- "- Northern Entrance ("+@cost+"z)",
- "- Southern Entrance ("+@cost+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild04.gat",201,327;
- break;
- case 3:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild15.gat",246,251;
- break;
- }
-}
-
-function SF_ayothaya {
- if (!(SF_check(0x8, $@kewd_ayothaya, 2, @map$, 1, "ayo_fild02.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Ancient Shrine",
- "- Entrance ("+@cost+"z/"+getmapusers("ayo_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("ayo_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Ancient Shrine",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"ayo_fild02.gat",273,150;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ayo_dun02.gat",24,28;
- break;
- }
-}
-
-function SF_byalan {
- if (!(SF_check(0x10, $@kewd_byalan, 5, @map$, 1, "izlu2dun.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Undersea Tunnel",
- "- Entrance ("+@cost+"z/"+getmapusers("iz_dun00.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("iz_dun01.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("iz_dun02.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("iz_dun03.gat")+" "+$@ked_users$+")",
- "- Level 5 ("+@cost5+"z/"+getmapusers("iz_dun04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Undersea Tunnel",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)",
- "- Level 5 ("+@cost5+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"izlu2dun.gat",114,84;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun01.gat",253,252;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun02.gat",236,204;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun03.gat",32,63;
- break;
- case 6:
- callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun04.gat",26,27;
- break;
- }
-}
-
-function SF_comodo {
- if (!(SF_check(0x20, $@kewd_comodo, 1, @map$, 2, "comodo.gat","cmd_fild01.gat")))
- return;
-
- if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Comodo Caves",
- "- Mao, The Eastern Cave ("+@cost+"z/"+getmapusers("beach_dun3.gat")+" "+$@ked_users$+")",
- "- Karu, The Western Cave ("+@cost+"z/"+getmapusers("beach_dun.gat")+" "+$@ked_users$+")",
- "- Ruande, The Northern Cave ("+@cost+"z/"+getmapusers("beach_dun2.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Comodo Caves",
- "- Mao, The Eastern Cave ("+@cost+"z)",
- "- Karu, The Western Cave ("+@cost+"z)",
- "- Ruande, The Northern Cave ("+@cost+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"cmd_fild01.gat",34,325;
- break;
- case 3:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"comodo.gat",32,209;
- break;
- case 4:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"comodo.gat",180,352;
- break;
- }
-}
-
-function SF_clockTower {
- if (!(SF_check(0x40, $@kewd_clockTower, 5, @map$, 1, "aldebaran.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Clock Tower",
- "- Entrance ("+@cost+"z/"+getmapusers("c_tower1.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("c_tower2.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("c_tower3.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("c_tower4.gat")+" "+$@ked_users$+")",
- "- Basement 1 ("+@cost2+"z/"+getmapusers("alde_dun01.gat")+" "+$@ked_users$+")",
- "- Basement 2 ("+@cost3+"z/"+getmapusers("alde_dun02.gat")+" "+$@ked_users$+")",
- "- Basement 3 ("+@cost4+"z/"+getmapusers("alde_dun03.gat")+" "+$@ked_users$+")",
- "- Basement 4 ("+@cost5+"z/"+getmapusers("alde_dun04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Clock Tower",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)",
- "- Basement 1 ("+@cost2+"z)",
- "- Basement 2 ("+@cost3+"z)",
- "- Basement 3 ("+@cost4+"z)",
- "- Basement 4 ("+@cost5+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"aldebaran.gat",140,130;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"c_tower2.gat",268,26;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"c_tower3.gat",68,146;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"c_tower4.gat",185,44;
- break;
- case 6:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun01.gat",297,25;
- break;
- case 7:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun02.gat",43,24;
- break;
- case 8:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun03.gat",18,267;
- break;
- case 9:
- callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun04.gat",82,267;
- break;
- }
-}
-
-function SF_coalMine {
- if (!(SF_check(0x80, $@kewd_coalMines, 3, @map$, 1, "mjolnir_02.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Mjolnir Dead Pit",
- "- Entrance ("+@cost+"z/"+getmapusers("mjo_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("mjo_dun02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("mjo_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Mjolnir Dead Pit",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"mjolnir_02.gat",89,358;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"mjo_dun02.gat",376,342;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"mjo_dun03.gat",305,260;
- break;
- }
-}
-
-function SF_culvert {
- if (!(SF_check(0x100, $@kewd_culvert, 4, @map$, 1, "prt_fild05.gat")))
- return;
- if ($@kewd_deep == 0) {
- set @submenu, 2;
- } else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Prontera Culvert",
- "- Entrance ("+@cost+"z/"+getmapusers("prt_sewb1.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("prt_sewb2.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("prt_sewb3.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("prt_sewb4.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Prontera Culvert",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"prt_fild05.gat",274,208;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb2.gat",19,19;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb3.gat",180,169;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb4.gat",100,92;
- break;
- }
-}
-
-function SF_einbech {
- if (!(SF_check(0x200, $@kewd_einbech, 2, @map$, 1, "einbech.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Einbroch Mines",
- "- Entrance ("+@cost+"z/"+getmapusers("ein_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("ein_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Einbech Mines",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"einbech.gat",138,244;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ein_dun02.gat",290,285;
- break;
- }
-}
-
-function SF_geffen {
- if (!(SF_check(0x800, $@kewd_geffen, 3, @map$, 1, "gef_tower.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Geffen Dungeon",
- "- Entrance ("+@cost+"z/"+getmapusers("gef_dun00.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("gef_dun01.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("gef_dun02.gat")+" "+$@ked_users$+")"
-// "- Level 4 ("+@cost4+"z/"+getmapusers("gef_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Geffen Dungeon",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
-// "- Level 4 ("+@cost4+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gef_tower.gat",147,35;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun01.gat",115,236;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun02.gat",106,132;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun03.gat",203,200;
- break;
- }
-}
-
-function SF_gefenia {
- if (!(SF_check(0x400, $@kewd_gefenia, 2, @map$, 4, "gefenia01.gat","gefenia02.gat","gefenia03.gat","gefenia04.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Gefenia",
- "- Level 1 ("+@cost+"z/"+getmapusers("gefenia01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("gefenia02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost2+"z/"+getmapusers("gefenia03.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost+"z/"+getmapusers("gefenia04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Gefenia",
- "- Level 1 ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost2+"z)",
- "- Level 4 ("+@cost+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gefenia01.gat",60,169;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gefenia02.gat",116,116;
- break;
- case 4:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gefenia03.gat",119,277;
- break;
- case 5:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gefenia04.gat",129,86;
- break;
- }
-}
-
-function SF_glastHeim {
- if (!(SF_check(0x1000, $@kewd_glastHeim, 7, @map$, 1, "glast_01.gat")))
- return;
- if ($@kewd_deep == 0) {
- if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Glast Heim",
- "- Church Entrance ("+@cost+"z/"+getmapusers("gl_church.gat")+" "+$@ked_users$+")",
- "- Castle Terrace ("+@cost+"z/"+(getmapusers("gl_cas01.gat")+getmapusers("gl_cas02.gat"))+" "+$@ked_users$+")",
- "- Staircase Entrance ("+@cost+"z/"+getmapusers("gl_step.gat")+" "+$@ked_users$+")",
- "- Chivalry Entrance ("+@cost+"z/"+getmapusers("gl_knt01.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Glast Heim",
- "- Church Entrance ("+@cost+"z)",
- "- Castle Terrace ("+@cost+"z)",
- "- Staircase Entrance ("+@cost+"z)",
- "- Chivalry Entrance ("+@cost+"z)"
- );
- }
- if (@submenu > 2) //Churchyard is index 3.
- set @submenu, @submenu+1;
- } else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Glast Heim",
- "- Church Entrance ("+@cost+"z/"+getmapusers("gl_church.gat")+" "+$@ked_users$+")",
- "- Churchyard ("+@cost2+"z/"+getmapusers("gl_chyard.gat")+" "+$@ked_users$+")",
- "- Castle Terrace ("+@cost+"z/"+(getmapusers("gl_cas01.gat")+getmapusers("gl_cas02.gat"))+" "+$@ked_users$+")",
- "- Staircase Entrance ("+@cost+"z/"+getmapusers("gl_step.gat")+" "+$@ked_users$+")",
- "- Chivalry Entrance ("+@cost+"z/"+getmapusers("gl_knt01.gat")+" "+$@ked_users$+")",
- "- Chivalry Level 2 ("+@cost2+"z/"+getmapusers("gl_knt02.gat")+" "+$@ked_users$+")",
- "- Underground Prison 1 ("+@cost2+"z/"+getmapusers("gl_prison.gat")+" "+$@ked_users$+")",
- "- Underground Prison 2 ("+@cost3+"z/"+getmapusers("gl_prison1.gat")+" "+$@ked_users$+")",
- "- Culvert Level 1 ("+@cost4+"z/"+getmapusers("gl_sew01.gat")+" "+$@ked_users$+")",
- "- Culvert Level 2 ("+@cost3+"z/"+getmapusers("gl_sew02.gat")+" "+$@ked_users$+")",
- "- Culvert Level 3 ("+@cost4+"z/"+getmapusers("gl_sew03.gat")+" "+$@ked_users$+")",
- "- Culvert Level 4 ("+@cost5+"z/"+getmapusers("gl_sew04.gat")+" "+$@ked_users$+")",
- "- Underground Cave 1 ("+@cost6+"z/"+getmapusers("gl_dun01.gat")+" "+$@ked_users$+")",
- "- Underground Cave 2 ("+@cost7+"z/"+getmapusers("gl_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Glast Heim",
- "- Church Entrance ("+@cost+"z)",
- "- Churchyard ("+@cost2+"z)",
- "- Castle Terrace ("+@cost+"z)",
- "- Staircase Entrance ("+@cost+"z)",
- "- Chivalry Entrance ("+@cost+"z)",
- "- Chivalry Level 2 ("+@cost2+"z)",
- "- Underground Prison Level 1 ("+@cost2+"z)",
- "- Underground Prison Level 2 ("+@cost3+"z)",
- "- Culvert Level 1 ("+@cost4+"z)",
- "- Culvert Level 2 ("+@cost3+"z)",
- "- Culvert Level 3 ("+@cost4+"z)",
- "- Culvert Level 4 ("+@cost5+"z)",
- "- Underground Cave Level 1 ("+@cost6+"z)",
- "- Underground Cave Level 2 ("+@cost7+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",206,136;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_chyard.gat",147,15;
- break;
- case 4:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",199,335;
- break;
- case 5:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",62,107;
- break;
- case 6:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",69,193;
- break;
- case 7:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_knt02.gat",157,287;
- break;
- case 8:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_prison.gat",14,70;
- break;
- case 9:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gl_prison1.gat",150,14;
- break;
- case 10:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew01.gat",258,255;
- break;
- case 11:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew02.gat",108,291;
- break;
- case 12:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew03.gat",171,283;
- break;
- case 13:
- callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew04.gat",68,277;
- break;
- case 14:
- callfunc "F_keWarp",@cost6*100/@discountKP,$@kewd_discount,e_hmm,"gl_dun01.gat",133,271;
- break;
- case 15:
- callfunc "F_keWarp",@cost7*100/@discountKP,$@kewd_discount,e_hmm,"gl_dun02.gat",224,274;
- break;
- }
-}
-
-function SF_gonRyun {
- if (!(SF_check(0x2000, $@kewd_gonRyun, 3, @map$, 1, "gonryun.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Gon Ryun Dungeon",
- "- Entrance ("+@cost+"z/"+getmapusers("gon_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("gon_dun02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("gon_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Gon Ryun Dungeon",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gonryun.gat",161,195;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gon_dun02.gat",22,114;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gon_dun03.gat",68,11;
- break;
- }
-}
-
-function SF_hiddenTemple {
- if (!(SF_check(0x4000, $@kewd_hiddenTemple, 3, @map$, 1, "prt_fild01.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Laberynth Forest",
- "- Entrance ("+@cost+"z/"+getmapusers("prt_maze01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("prt_maze02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("prt_maze03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Laberynth Forest",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"prt_fild01.gat",136,361;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"prt_maze02.gat",106,62;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"prt_maze03.gat",23,8;
- break;
- }
-}
-
-function SF_juperos {
- if (!(SF_check(0x8000, $@kewd_juperos, 3, @map$, 1, "jupe_cave.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Juperos",
- "- Entrance ("+@cost+"z/"+getmapusers("juperos_01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("juperos_02.gat")+" "+$@ked_users$+")",
- "- Core ("+@cost3+"z/"+getmapusers("jupe_core.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Juperos",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Core ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"jupe_cave.gat",55,52;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"juperos_02.gat",37,63;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"jupe_gate.gat",-1,-1;
- break;
- }
-}
-
-function SF_lightHalzen {
- if (!(SF_check(0x10000, $@kewd_lightHalzen, 3, @map$, 1, "lighthalzen.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Rekkenber",
- "- Entrance ("+@cost+"z/"+getmapusers("lou_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("lou_dun02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("lou_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Rekkenber",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
-//This is the Rekkenber building entrance, which officially is only a dungeon exit.
-// callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"lighthalzen.gat",74,72;
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"lighthalzen.gat",303,302;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"lhz_dun02.gat",154,18;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"lhz_dun03.gat",141,132;
- break;
- }
-}
-
-function SF_louYang {
- if (!(SF_check(0x20000, $@kewd_louYang, 3, @map$, 1, "louyang.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Royal Tomb",
- "- Entrance ("+@cost+"z/"+getmapusers("lou_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("lou_dun02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("lou_dun03.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Royal Tomb",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)"
- );
- };
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"louyang.gat",41,267;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"lou_dun02.gat",281,20;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"lou_dun03.gat",165,39;
- break;
- }
-}
-
-function SF_magma {
- if (!(SF_check(0x40000, $@kewd_magma, 2, @map$, 1, "yuno_fild03.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Nogg Road",
- "- Entrance ("+@cost+"z/"+getmapusers("mag_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("mag_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Nogg Road",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"yuno_fild03.gat",35,135;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"mag_dun02.gat",47,30;
- break;
- }
-}
-
-function SF_orcs {
- if (!(SF_check(0x80000, $@kewd_orc, 2, @map$, 1, "gef_fild10.gat")))
- return;
- if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Orcs Dungeon",
- "- Front Entrance ("+@cost+"z/"+getmapusers("orcsdun01.gat")+" "+$@ked_users$+")",
- "- Back Entrance ("+@cost+"z/"+getmapusers("orcsdun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Orcs Dungeon",
- "- Front Entrance ("+@cost+"z)",
- "- Back Entrance ("+@cost+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"in_orcs01.gat",34,165;
- break;
- case 3:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"in_orcs01.gat",112,99;
- break;
- }
-}
-
-function SF_payon {
- if (!(SF_check(0x100000, $@kewd_payon, 5, @map$, 1, "pay_arche.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Payon Cave",
- "- Entrance ("+@cost+"z/"+getmapusers("pay_dun00.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("pay_dun01.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("pay_dun02.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("pay_dun03.gat")+" "+$@ked_users$+")",
- "- Level 5 ("+@cost5+"z/"+getmapusers("pay_dun04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Payon Cave",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)",
- "- Level 5 ("+@cost5+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"pay_arche.gat",41,133;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun01.gat",19,33;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun02.gat",19,63;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun03.gat",155,159;
- break;
- case 6:
- callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun04.gat",34,202;
- break;
- }
-}
-
-function SF_pyramid {
- if (!(SF_check(0x200000, $@kewd_pyramid, 4, @map$,1, "moc_ruins.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Pyramid",
- "- Entrance ("+@cost+"z/"+getmapusers("moc_pryd01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("moc_pryd02.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("moc_pryd03.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("moc_pryd04.gat")+" "+$@ked_users$+")",
- "- Basement 1 ("+@cost2+"z/"+getmapusers("moc_pryd05.gat")+" "+$@ked_users$+")",
- "- Basement 2 ("+@cost3+"z/"+getmapusers("moc_pryd06.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Pyramid",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)",
- "- Basement 1 ("+@cost2+"z)",
- "- Basement 2 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_ruins.gat",62,162;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd02.gat",10,192;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd03.gat",100,92;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd04.gat",18,187;
- break;
- case 6:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd05.gat",94,96;
- break;
- case 7:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd06.gat",192,11;
- break;
- }
-}
-
-function SF_sphinx {
- if (!(SF_check(0x400000, $@kewd_sphinx, 5, @map$, 1, "moc_fild19.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to the Sphinx",
- "- Entrance ("+@cost+"z/"+getmapusers("in_sphinx1.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("in_sphinx2.gat")+" "+$@ked_users$+")",
- "- Level 3 ("+@cost3+"z/"+getmapusers("in_sphinx3.gat")+" "+$@ked_users$+")",
- "- Level 4 ("+@cost4+"z/"+getmapusers("in_sphinx4.gat")+" "+$@ked_users$+")",
- "- Level 5 ("+@cost5+"z/"+getmapusers("in_sphinx5.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to the Sphinx",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)",
- "- Level 3 ("+@cost3+"z)",
- "- Level 4 ("+@cost4+"z)",
- "- Level 5 ("+@cost5+"z)"
- );
- }
-
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild19.gat",107,100;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx2.gat",149,81;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx3.gat",210,54;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx4.gat",10,222;
- break;
- case 6:
- callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx5.gat",100,99;
- break;
- }
-}
-
-function SF_sunkenShip {
- if (!(SF_check(0x800000, $@kewd_sunkenShip, 2, @map$, 1, "alb2trea.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Sunken Ship",
- "- Entrance ("+@cost+"z/"+getmapusers("treasure01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("treasure02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Sunken Ship",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
-
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"alb2trea.gat",87,103;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"treasure02.gat",102,27;
- break;
- }
-}
-
-function SF_thanatosTower {
- if (!(SF_check(0x1000000, $@kewd_thanatosTower, 9, @map$, 1, "tha_t01.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Thanatos Tower",
- "- Entrance ("+@cost+"z/"+getmapusers("tha_t01.gat")+" "+$@ked_users$+")",
- "- Floor 2 ("+@cost2+"z/"+getmapusers("tha_t02.gat")+" "+$@ked_users$+")",
- "- Floor 3 ("+@cost3+"z/"+getmapusers("tha_t03.gat")+" "+$@ked_users$+")",
- "- Floor 4 ("+@cost4+"z/"+getmapusers("tha_t04.gat")+" "+$@ked_users$+")",
- "- Floor 5 ("+@cost5+"z/"+getmapusers("tha_t05.gat")+" "+$@ked_users$+")",
- "- Floor 6 ("+@cost6+"z/"+getmapusers("tha_t06.gat")+" "+$@ked_users$+")",
- "- Floor 7 ("+@cost7+"z/"+getmapusers("tha_t07.gat")+" "+$@ked_users$+")",
- "- Floor 8 ("+@cost8+"z/"+getmapusers("tha_t08.gat")+" "+$@ked_users$+")",
- "- Floor 9 ("+@cost9+"z/"+getmapusers("tha_t09.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Thanatos Tower",
- "- Entrance ("+@cost+"z)",
- "- Floor 2 ("+@cost2+"z)",
- "- Floor 3 ("+@cost3+"z)",
- "- Floor 4 ("+@cost4+"z)",
- "- Floor 5 ("+@cost5+"z)",
- "- Floor 6 ("+@cost6+"z)",
- "- Floor 7 ("+@cost7+"z)",
- "- Floor 8 ("+@cost8+"z)",
- "- Floor 9 ("+@cost9+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tha_scene01.gat",139,201;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"tha_t02.gat",149,136;
- break;
- case 4:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"tha_t03.gat",220,159;
- break;
- case 5:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t04.gat",59,144;
- break;
- case 6:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t05.gat",62,9;
- break;
- case 7:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t06.gat",120,225;
- break;
- case 8:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t07.gat",32,166;
- break;
- case 9:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t08.gat",108,44;
- break;
- case 10:
- callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t09.gat",87,145;
- break;
- }
-}
-
-function SF_toyFactory {
- if (!(SF_check(0x2000000, $@kewd_toyFactory, 2, @map$, 1, "xmas.gat")))
- return;
-
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Toy Factory",
- "- Entrance ("+@cost+"z/"+getmapusers("xmas_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("xmas_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Toy Factory",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
-
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"xmas.gat",144,306;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"xmas_dun02.gat",129,133;
- break;
- }
-}
-
-function SF_turtleIsland {
- if (!(SF_check(0x4000000, $@kewd_turtleIsland, 3, @map$, 1, "tur_dun01.gat")))
- return;
- if ($@kewd_deep == 0) {
- if ($@kewd_turtleCave)
- set @submenu, 3;
- else
- set @submenu, 2;
- } else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Turtle Island",
- "- Island Entrance ("+@cost+"z/"+getmapusers("tur_dun01.gat")+" "+$@ked_users$+")",
- "- Cave Entrance ("+@cost+"z/"+getmapusers("tur_dun02.gat")+" "+$@ked_users$+")",
- "- Cave Level 2 ("+@cost2+"z/"+getmapusers("tur_dun03.gat")+" "+$@ked_users$+")",
- "- Cave Level 3 ("+@cost3+"z/"+getmapusers("tur_dun04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Turtle Island",
- "- Island Entrance ("+@cost+"z)",
- "- Cave Entrance ("+@cost+"z)",
- "- Cave Level 2 ("+@cost2+"z)",
- "- Cave Level 3 ("+@cost3+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun01.gat",153,47;
- break;
- case 3:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun01.gat",155,234;
- break;
- case 4:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun03.gat",132,189;
- break;
- case 5:
- callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun04.gat",100,192;
- break;
- }
-}
-
-function SF_umbala {
- if (!(SF_check(0x8000000, $@kewd_umbala, 2, @map$, 1, "umbala.gat")))
- return;
- if ($@kewd_deep == 0)
- set @submenu, 2;
- else if ($@kewd_showOnline) {
- set @submenu, select(
- "- Cancel warp to Umbala Dungeon",
- "- Entrance ("+@cost+"z/"+getmapusers("um_dun01.gat")+" "+$@ked_users$+")",
- "- Level 2 ("+@cost2+"z/"+getmapusers("um_dun02.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel warp to Umbala Dungeon",
- "- Entrance ("+@cost+"z)",
- "- Level 2 ("+@cost2+"z)"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"umbala.gat",113,282;
- break;
- case 3:
- callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"um_dun02.gat",48,31;
- break;
- }
-}
-
-}
-
-//Invoked when we want to add a map to the list of travelled-to dungeons
-function script F_keAddTravelDungeon {
- set @map$, getarg(0);
-// Temporary code to update the previous variable format to the new one.
- if(kewd_abyss) {
- set kewd_travel,kewd_travel|0x1;
- set kewd_abyss,0;
- }
- if(kewd_amatsu) {
- set kewd_travel,kewd_travel|0x2;
- set kewd_amatsu,0;
- }
- if(kewd_antHell) {
- set kewd_travel,kewd_travel|0x4;
- set kewd_antHell,0;
- }
- if(kewd_ayothaya) {
- set kewd_travel,kewd_travel|0x8;
- set kewd_ayothaya,0;
- }
- if(kewd_byalan) {
- set kewd_travel,kewd_travel|0x10;
- set kewd_byalan,0;
- }
- if(kewd_comodo) {
- set kewd_travel,kewd_travel|0x20;
- set kewd_comodo,0;
- }
- if(kewd_clockTower) {
- set kewd_travel,kewd_travel|0x40;
- set kewd_clockTower,0;
- }
- if(kewd_coalMines) {
- set kewd_travel,kewd_travel|0x80;
- set kewd_coalMines,0;
- }
- if(kewd_culvert) {
- set kewd_travel,kewd_travel|0x100;
- set kewd_culvert,0;
- }
- if(kewd_einbech) {
- set kewd_travel,kewd_travel|0x200;
- set kewd_einbech,0;
- }
- if(kewd_geffen) {
- set kewd_travel,kewd_travel|0x800;
- set kewd_geffen,0;
- }
- if(kewd_glastHeim) {
- set kewd_travel,kewd_travel|0x1000;
- set kewd_glastHeim,0;
- }
- if(kewd_gonRyun) {
- set kewd_travel,kewd_travel|0x2000;
- set kewd_gonRyun,0;
- }
- if(kewd_hiddenTemple) {
- set kewd_travel,kewd_travel|0x4000;
- set kewd_hiddenTemple,0;
- }
- if(kewd_juperos) {
- set kewd_travel,kewd_travel|0x8000;
- set kewd_juperos,0;
- }
- if(kewd_lightHalzen) {
- set kewd_travel,kewd_travel|0x10000;
- set kewd_lightHalzen,0;
- }
- if(kewd_louYang) {
- set kewd_travel,kewd_travel|0x20000;
- set kewd_louYang,0;
- }
- if(kewd_magma) {
- set kewd_travel,kewd_travel|0x40000;
- set kewd_magma,0;
- }
- if(kewd_orc) {
- set kewd_travel,kewd_travel|0x80000;
- set kewd_orc,0;
- }
- if(kewd_payon) {
- set kewd_travel,kewd_travel|0x100000;
- set kewd_payon,0;
- }
- if(kewd_pyramid) {
- set kewd_travel,kewd_travel|0x200000;
- set kewd_pyramid,0;
- }
- if(kewd_sphinx) {
- set kewd_travel,kewd_travel|0x400000;
- set kewd_sphinx,0;
- }
- if(kewd_sunkenShip) {
- set kewd_travel,kewd_travel|0x800000;
- set kewd_sunkenShip,0;
- }
- if(kewd_thanatosTower) {
- set kewd_travel,kewd_travel|0x1000000;
- set kewd_thanatosTower,0;
- }
- if(kewd_toyFactory) {
- set kewd_travel,kewd_travel|0x2000000;
- set kewd_toyFactory,0;
- }
- if(kewd_turtleIsland) {
- set kewd_travel,kewd_travel|0x4000000;
- set kewd_turtleIsland,0;
- }
- if(kewd_umbala) {
- set kewd_travel,kewd_travel|0x8000000;
- set kewd_umbala,0;
- }
-
- if(#kewd_abyss) {
- set #kewd_travel,#kewd_travel|0x1;
- set #kewd_abyss,0;
- }
- if(#kewd_amatsu) {
- set #kewd_travel,#kewd_travel|0x2;
- set #kewd_amatsu,0;
- }
- if(#kewd_antHell) {
- set #kewd_travel,#kewd_travel|0x4;
- set #kewd_antHell,0;
- }
- if(#kewd_ayothaya) {
- set #kewd_travel,#kewd_travel|0x8;
- set #kewd_ayothaya,0;
- }
- if(#kewd_byalan) {
- set #kewd_travel,#kewd_travel|0x10;
- set #kewd_byalan,0;
- }
- if(#kewd_comodo) {
- set #kewd_travel,#kewd_travel|0x20;
- set #kewd_comodo,0;
- }
- if(#kewd_clockTower) {
- set #kewd_travel,#kewd_travel|0x40;
- set #kewd_clockTower,0;
- }
- if(#kewd_coalMines) {
- set #kewd_travel,#kewd_travel|0x80;
- set #kewd_coalMines,0;
- }
- if(#kewd_culvert) {
- set #kewd_travel,#kewd_travel|0x100;
- set #kewd_culvert,0;
- }
- if(#kewd_einbech) {
- set #kewd_travel,#kewd_travel|0x200;
- set #kewd_einbech,0;
- }
- if(#kewd_geffen) {
- set #kewd_travel,#kewd_travel|0x800;
- set #kewd_geffen,0;
- }
- if(#kewd_glastHeim) {
- set #kewd_travel,#kewd_travel|0x1000;
- set #kewd_glastHeim,0;
- }
- if(#kewd_gonRyun) {
- set #kewd_travel,#kewd_travel|0x2000;
- set #kewd_gonRyun,0;
- }
- if(#kewd_hiddenTemple) {
- set #kewd_travel,#kewd_travel|0x4000;
- set #kewd_hiddenTemple,0;
- }
- if(#kewd_juperos) {
- set #kewd_travel,#kewd_travel|0x8000;
- set #kewd_juperos,0;
- }
- if(#kewd_lightHalzen) {
- set #kewd_travel,#kewd_travel|0x10000;
- set #kewd_lightHalzen,0;
- }
- if(#kewd_louYang) {
- set #kewd_travel,#kewd_travel|0x20000;
- set #kewd_louYang,0;
- }
- if(#kewd_magma) {
- set #kewd_travel,#kewd_travel|0x40000;
- set #kewd_magma,0;
- }
- if(#kewd_orc) {
- set #kewd_travel,#kewd_travel|0x80000;
- set #kewd_orc,0;
- }
- if(#kewd_payon) {
- set #kewd_travel,#kewd_travel|0x100000;
- set #kewd_payon,0;
- }
- if(#kewd_pyramid) {
- set #kewd_travel,#kewd_travel|0x200000;
- set #kewd_pyramid,0;
- }
- if(#kewd_sphinx) {
- set #kewd_travel,#kewd_travel|0x400000;
- set #kewd_sphinx,0;
- }
- if(#kewd_sunkenShip) {
- set #kewd_travel,#kewd_travel|0x800000;
- set #kewd_sunkenShip,0;
- }
- if(#kewd_thanatosTower) {
- set #kewd_travel,#kewd_travel|0x1000000;
- set #kewd_thanatosTower,0;
- }
- if(#kewd_toyFactory) {
- set #kewd_travel,#kewd_travel|0x2000000;
- set #kewd_toyFactory,0;
- }
- if(#kewd_turtleIsland) {
- set #kewd_travel,#kewd_travel|0x4000000;
- set #kewd_turtleIsland,0;
- }
- if(#kewd_umbala) {
- set #kewd_travel,#kewd_travel|0x8000000;
- set #kewd_umbala,0;
- }
-
-// End transition code.
- if ($@kewd_travel > 1) {
- if (@map$ == "hu_fild05.gat" || kewd_travel&0x1)
- set #kewd_travel,#kewd_travel|0x1;
- if (@map$ == "ama_in02.gat" || kewd_travel&0x2)
- set #kewd_travel,#kewd_travel|0x2;
- if (@map$ == "moc_fild04.gat" || @map$ == "moc_fild15.gat" || kewd_travel&0x4)
- set #kewd_travel,#kewd_travel|0x4;
- if (@map$ == "ayo_fild02.gat" || kewd_travel&0x8)
- set #kewd_travel,#kewd_travel|0x8;
- if (@map$ == "izlu2dun.gat" || kewd_travel&0x10)
- set #kewd_travel,#kewd_travel|0x10;
- if (@map$ == "comodo.gat" || @map$ == "cmd_fild01.gat" || kewd_travel&0x20)
- set #kewd_travel,#kewd_travel|0x20;
- if (@map$ == "aldebaran.gat" || kewd_travel&0x40)
- set #kewd_travel,#kewd_travel|0x40;
- if (@map$ == "mjolnir_02.gat" || kewd_travel&0x80)
- set #kewd_travel,#kewd_travel|0x80;
- if (@map$ == "prt_fild05.gat" || kewd_travel&0x100)
- set #kewd_travel,#kewd_travel|0x100;
- if (@map$ == "einbech.gat" || kewd_travel&0x200)
- set #kewd_travel,#kewd_travel|0x200;
- if (@map$ == "gef_tower.gat" || kewd_travel&0x800)
- set #kewd_travel,#kewd_travel|0x800;
- if (@map$ == "glast_01.gat" || kewd_travel&0x1000)
- set #kewd_travel,#kewd_travel|0x1000;
- if (@map$ == "gonryun.gat" || kewd_travel&0x2000)
- set #kewd_travel,#kewd_travel|0x2000;
- if (@map$ == "prt_fild01.gat" || kewd_travel&0x4000)
- set #kewd_travel,#kewd_travel|0x4000;
- if (@map$ == "jupe_cave.gat" || kewd_travel&0x8000)
- set #kewd_travel,#kewd_travel|0x8000;
- if (@map$ == "lighthalzen.gat" || kewd_travel&0x10000)
- set #kewd_travel,#kewd_travel|0x10000;
- if (@map$ == "louyang.gat" || kewd_travel&0x20000)
- set #kewd_travel,#kewd_travel|0x20000;
- if (@map$ == "yuno_fild03.gat" || kewd_travel&0x40000)
- set #kewd_travel,#kewd_travel|0x40000;
- if (@map$ == "in_orcs01.gat" || kewd_travel&0x80000)
- set #kewd_travel,#kewd_travel|0x80000;
- if (@map$ == "pay_arche.gat" || kewd_travel&0x100000)
- set #kewd_travel,#kewd_travel|0x100000;
- if (@map$ == "moc_ruins.gat" || kewd_travel&0x200000)
- set #kewd_travel,#kewd_travel|0x200000;
- if (@map$ == "moc_fild19.gat" || kewd_travel&0x400000)
- set #kewd_travel,#kewd_travel|0x400000;
- if (@map$ == "alb2trea.gat" || kewd_travel&0x800000)
- set #kewd_travel,#kewd_travel|0x800000;
- if (@map$ == "tha_t01.gat" || kewd_travel&0x1000000)
- set #kewd_travel,#kewd_travel|0x1000000;
- if (@map$ == "xmas.gat" || kewd_travel&0x2000000)
- set #kewd_travel,#kewd_travel|0x2000000;
- if (@map$ == "tur_dun01.gat" || kewd_travel&0x4000000)
- set #kewd_travel,#kewd_travel|0x4000000;
- if (@map$ == "umbala.gat" || kewd_travel&0x8000000)
- set #kewd_travel,#kewd_travel|0x8000000;
- } else {
- if (@map$ == "hu_fild05.gat")
- set kewd_travel,kewd_travel|0x1;
- if (@map$ == "ama_in02.gat")
- set kewd_travel,kewd_travel|0x2;
- if (@map$ == "moc_fild04.gat" || @map$ == "moc_fild15.gat")
- set kewd_travel,kewd_travel|0x4;
- if (@map$ == "ayo_fild02.gat")
- set kewd_travel,kewd_travel|0x8;
- if (@map$ == "izlu2dun.gat")
- set kewd_travel,kewd_travel|0x10;
- if (@map$ == "comodo.gat" || @map$ == "cmd_fild01.gat")
- set kewd_travel,kewd_travel|0x20;
- if (@map$ == "aldebaran.gat")
- set kewd_travel,kewd_travel|0x40;
- if (@map$ == "mjolnir_02.gat")
- set kewd_travel,kewd_travel|0x80;
- if (@map$ == "prt_fild05.gat")
- set kewd_travel,kewd_travel|0x100;
- if (@map$ == "einbech.gat")
- set kewd_travel,kewd_travel|0x200;
- if (@map$ == "gef_tower.gat")
- set kewd_travel,kewd_travel|0x800;
- if (@map$ == "glast_01.gat")
- set kewd_travel,kewd_travel|0x1000;
- if (@map$ == "gonryun.gat")
- set kewd_travel,kewd_travel|0x2000;
- if (@map$ == "prt_fild01.gat")
- set kewd_travel,kewd_travel|0x4000;
- if (@map$ == "jupe_cave.gat")
- set kewd_travel,kewd_travel|0x8000;
- if (@map$ == "lighthalzen.gat")
- set kewd_travel,kewd_travel|0x10000;
- if (@map$ == "louyang.gat")
- set kewd_travel,kewd_travel|0x20000;
- if (@map$ == "yuno_fild03.gat")
- set kewd_travel,kewd_travel|0x40000;
- if (@map$ == "in_orcs01.gat")
- set kewd_travel,kewd_travel|0x80000;
- if (@map$ == "pay_arche.gat")
- set kewd_travel,kewd_travel|0x100000;
- if (@map$ == "moc_ruins.gat")
- set kewd_travel,kewd_travel|0x200000;
- if (@map$ == "moc_fild19.gat")
- set kewd_travel,kewd_travel|0x400000;
- if (@map$ == "alb2trea.gat")
- set kewd_travel,kewd_travel|0x800000;
- if (@map$ == "tha_t01.gat")
- set kewd_travel,kewd_travel|0x1000000;
- if (@map$ == "xmas.gat")
- set kewd_travel,kewd_travel|0x2000000;
- if (@map$ == "tur_dun01.gat")
- set kewd_travel,kewd_travel|0x4000000;
- if (@map$ == "umbala.gat")
- set kewd_travel,kewd_travel|0x8000000;
- }
- return;
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Dungeon Warps Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 3.5
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+, RO Episode 8+ (Hugel)
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers warping to dungeons.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= Flag values used for dungeons:
+//= 0x00000001 Abyss Lake
+//= 0x00000002 Amatsu
+//= 0x00000004 AntHell
+//= 0x00000008 Ayothaya
+//= 0x00000010 Byalan
+//= 0x00000020 Comodo
+//= 0x00000040 Clock tower
+//= 0x00000080 Coal Mines
+//= 0x00000100 Culvert
+//= 0x00000200 Einbech
+//= 0x00000400 Gefenia
+//= 0x00000800 Geffen
+//= 0x00001000 GlastHeim
+//= 0x00002000 Gon Ryun
+//= 0x00004000 Hidden Temple
+//= 0x00008000 Juperos
+//= 0x00010000 Lighthalzen
+//= 0x00020000 Lou Yang
+//= 0x00040000 Magma Caves
+//= 0x00080000 Orcs
+//= 0x00100000 Payon
+//= 0x00200000 Pyramid
+//= 0x00400000 Sphinx
+//= 0x00800000 Sunken Ship
+//= 0x01000000 Thanatos
+//= 0x02000000 Toy Factory
+//= 0x04000000 Turtle Island
+//= 0x08000000 Umbala
+
+//============================================================
+
+- script keInit_warpDungeon -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadWarpDungeon";
+ end;
+}
+
+function script F_keDungeonWarps {
+
+function SF_abyssLake;
+function SF_amatsu;
+function SF_antHell;
+function SF_ayothaya;
+function SF_byalan;
+function SF_comodo;
+function SF_clockTower;
+function SF_coalMine;
+function SF_culvert;
+function SF_einbech;
+function SF_gefenia;
+function SF_geffen;
+function SF_glastHeim;
+function SF_gonRyun;
+function SF_hiddenTemple;
+function SF_juperos;
+function SF_lightHalzen;
+function SF_louYang;
+function SF_magma;
+function SF_orcs;
+function SF_payon;
+function SF_pyramid;
+function SF_sphinx;
+function SF_sunkenShip;
+function SF_thanatosTower;
+function SF_toyFactory;
+function SF_turtleIsland;
+function SF_umbala;
+ //Store player map, will be needed in any of the submenus.
+ set @map$, getarg(0);
+ do {
+ set @discount,callfunc("F_keCost",100,$@kewd_discount);
+ if ($@kewd_showOnline) {
+ set @kmenu, select (
+ "- Cancel",
+ "- Abyss Lake ("+$@kewd_abyssLake*@discount/100+"z/"+(getmapusers("abyss_01.gat")
+ +getmapusers("abyss_02.gat")+getmapusers("abyss_03.gat"))+" "+$@ked_users$+")",
+ "- Amatsu Dungeon ("+$@kewd_amatsu*@discount/100+"z/"+(getmapusers("ama_dun01.gat")
+ +getmapusers("ama_dun02.gat")+getmapusers("ama_dun03.gat"))+" "+$@ked_users$+")",
+ "- Ant Hell ("+$@kewd_antHell*@discount/100+"z/"+(getmapusers("anthell01.gat")
+ +getmapusers("anthell02.gat"))+" "+$@ked_users$+")",
+ "- Ayothaya Ancient Shrine ("+$@kewd_ayothaya*@discount/100+"z/"+(getmapusers("ayo_dun01.gat")
+ +getmapusers("ayo_dun02.gat"))+" "+$@ked_users$+")",
+ "- Byalan Dungeon ("+$@kewd_byalan*@discount/100+"z/"+(getmapusers("iz_dun00.gat")
+ +getmapusers("iz_dun01.gat")+getmapusers("iz_dun02.gat")+getmapusers("iz_dun03.gat")
+ +getmapusers("iz_dun04.gat"))+" "+$@ked_users$+")",
+ "- Comodo Caves ("+$@kewd_comodo*@discount/100+"z/"+(getmapusers("beach_dun.gat")
+ +getmapusers("beach_dun2.gat")+getmapusers("beach_dun3.gat"))+" "+$@ked_users$+")",
+ "- Clock Tower ("+$@kewd_clockTower*@discount/100+"z/"+(getmapusers("c_tower1.gat")
+ +getmapusers("c_tower2.gat")+getmapusers("c_tower3.gat")+getmapusers("c_tower4.gat")
+ +getmapusers("alde_dun01.gat")+getmapusers("alde_dun02.gat")+getmapusers("alde_dun03.gat")
+ +getmapusers("alde_dun04.gat"))+" "+$@ked_users$+")",
+ "- Coal Mine ("+$@kewd_coalMines*@discount/100+"z/"+(getmapusers("mjo_dun01.gat")
+ +getmapusers("mjo_dun02.gat")+getmapusers("mjo_dun03.gat"))+" "+$@ked_users$+")",
+ "- Culvert ("+$@kewd_culvert*@discount/100+"z/"+(getmapusers("prt_sewb1.gat")+getmapusers("prt_sewb2.gat")
+ +getmapusers("prt_sewb3.gat")+getmapusers("prt_sewb4.gat"))+" "+$@ked_users$+")",
+ "- Einbroch Station ("+$@kewd_einbech*@discount/100+"z/"+(getmapusers("ein_dun01.gat")
+ +getmapusers("ein_dun02.gat"))+" "+$@ked_users$+")",
+ "- Gefenia ("+$@kewd_gefenia*@discount/100+"z/"+(getmapusers("gefenia01.gat")+getmapusers("gefenia02.gat")
+ +getmapusers("gefenia03.gat")+getmapusers("gefenia04.gat"))+" "+$@ked_users$+")",
+ "- Geffen Dungeon ("+$@kewd_geffen*@discount/100+"z/"+(getmapusers("gef_dun00.gat")
+ +getmapusers("gef_dun01.gat")+getmapusers("gef_dun02.gat")+getmapusers("gef_dun03.gat"))+" "+$@ked_users$+")",
+ "- Glast Heim ("+$@kewd_glastHeim*@discount/100+"z/"+(getmapusers("gl_cas02.gat")+getmapusers("gl_church.gat")
+ +getmapusers("gl_chyard.gat")+getmapusers("gl_dun01.gat")+getmapusers("gl_dun02.gat")
+ +getmapusers("gl_in01.gat")+getmapusers("gl_knt01.gat")+getmapusers("gl_knt02.gat")
+ +getmapusers("gl_prison.gat")+getmapusers("gl_prison1.gat")+getmapusers("gl_sew01.gat")
+ +getmapusers("gl_sew02.gat")+getmapusers("gl_sew03.gat")+getmapusers("gl_sew04.gat")
+ +getmapusers("gl_step.gat")+getmapusers("glast_01.gat"))+" "+$@ked_users$+")",
+ "- Gon Ryun Dungeon ("+$@kewd_gonRyun*@discount/100+"z/"+(getmapusers("gon_dun01.gat")
+ +getmapusers("gon_dun02.gat")+getmapusers("gon_dun03.gat"))+" "+$@ked_users$+")",
+ "- Hidden Temple ("+$@kewd_hiddenTemple*@discount/100+"z/"+(getmapusers("prt_maze01.gat")
+ +getmapusers("prt_maze02.gat")+getmapusers("prt_maze03.gat"))+" "+$@ked_users$+")",
+ "- Juperos ("+$@kewd_juperos*@discount/100+"z/"+(getmapusers("juperos_01.gat")+getmapusers("juperos_02.gat")
+ +getmapusers("jupe_area1.gat")+getmapusers("jupe_area2.gat")+getmapusers("jupe_core.gat")
+ +getmapusers("jupe_gate.gat")+getmapusers("jupe_area1.gat"))+" "+$@ked_users$+")",
+ "- LightHalzen Rekkenber ("+$@kewd_lightHalzen*@discount/100+"z/"+(getmapusers("lhz_dun01.gat")
+ +getmapusers("lhz_dun02.gat")+getmapusers("lhz_dun03.gat"))+" "+$@ked_users$+")",
+ "- Lou Yang Royal Tomb ("+$@kewd_louYang*@discount/100+"z/"+(getmapusers("lou_dun01.gat")
+ +getmapusers("lou_dun02.gat")+getmapusers("lou_dun03.gat"))+" "+$@ked_users$+")",
+ "- Magma Dungeon ("+$@kewd_magma*@discount/100+"z/"+(getmapusers("mag_dun01.gat")
+ +getmapusers("mag_dun02.gat"))+" "+$@ked_users$+")",
+ "- Orc Dungeon ("+$@kewd_orc*@discount/100+"z/"+(getmapusers("orcsdun01.gat")
+ +getmapusers("orcsdun02.gat"))+" "+$@ked_users$+")",
+ "- Payon Dungeon ("+$@kewd_payon*@discount/100+"z/"+(getmapusers("pay_dun00.gat")
+ +getmapusers("pay_dun01.gat")+getmapusers("pay_dun02.gat")+getmapusers("pay_dun03.gat")
+ +getmapusers("pay_dun04.gat"))+" "+$@ked_users$+")",
+ "- Pyramid ("+$@kewd_pyramid*@discount/100+"z/"+(getmapusers("moc_pryd01.gat")+getmapusers("moc_pryd02.gat")
+ +getmapusers("moc_pryd03.gat")+getmapusers("moc_pryd04.gat")+getmapusers("moc_pryd05.gat")
+ +getmapusers("moc_pryd06.gat")+getmapusers("moc_prydb1.gat"))+" "+$@ked_users$+")",
+ "- Sphinx ("+$@kewd_sphinx*@discount/100+"z/"+(getmapusers("in_sphinx1.gat")
+ +getmapusers("in_sphinx2.gat")+getmapusers("in_sphinx3.gat")+getmapusers("in_sphinx4.gat")
+ +getmapusers("in_sphinx5.gat"))+" "+$@ked_users$+")",
+ "- Sunken Ship ("+$@kewd_sunkenShip*@discount/100+"z/"+(getmapusers("treasure01.gat")
+ +getmapusers("treasure02.gat"))+" "+$@ked_users$+")",
+ "- Thanatos Tower ("+$@kewd_thanatosTower*@discount/100+"z/"+(getmapusers("tha_t01.gat")
+ +getmapusers("tha_t02.gat")+getmapusers("tha_t03.gat")+getmapusers("tha_t04.gat")
+ +getmapusers("tha_t05.gat")+getmapusers("tha_t06.gat")+getmapusers("tha_t07.gat")
+ +getmapusers("tha_t08.gat")+getmapusers("tha_t09.gat")+getmapusers("tha_t10.gat")
+ +getmapusers("tha_t11.gat")+getmapusers("tha_t12.gat")+getmapusers("thana_step.gat")
+ +getmapusers("thana_boss.gat"))+" "+$@ked_users$+")",
+ "- Toy Factory ("+$@kewd_toyFactory*@discount/100+"z/"+(getmapusers("xmas_dun01.gat")
+ +getmapusers("xmas_dun02.gat"))+" "+$@ked_users$+")",
+ "- Turtle Island ("+$@kewd_turtleIsland*@discount/100+"z/"+(getmapusers("tur_dun01.gat")
+ +getmapusers("tur_dun02.gat")+getmapusers("tur_dun03.gat")+getmapusers("tur_dun04.gat")
+ +getmapusers("tur_dun05.gat")+getmapusers("tur_dun06.gat"))+" "+$@ked_users$+")",
+ "- Umbala Dungeon ("+$@kewd_umbala*@discount/100+"z/"+(getmapusers("um_dun01.gat")
+ +getmapusers("um_dun02.gat"))+" "+$@ked_users$+")"
+ );
+ } else {
+ set @kmenu, select(
+ "- Cancel",
+ "- Abyss Lake ("+$@kewd_abyssLake*@discount/100+"z)",
+ "- Amatsu Dungeon ("+$@kewd_amatsu*@discount/100+"z)",
+ "- Ant Hell ("+$@kewd_antHell*@discount/100+"z)",
+ "- Ayothaya Ancient Shrine ("+$@kewd_ayothaya*@discount/100+"z)",
+ "- Byalan Dungeon ("+$@kewd_byalan*@discount/100+"z)",
+ "- Comodo Caves ("+$@kewd_comodo*@discount/100+"z)",
+ "- Clock Tower ("+$@kewd_clockTower*@discount/100+"z)",
+ "- Coal Mine ("+$@kewd_coalMines*@discount/100+"z)",
+ "- Culvert ("+$@kewd_culvert*@discount/100+"z)",
+ "- Einbroch Mine ("+$@kewd_einbech*@discount/100+"z)",
+ "- Gefenia ("+$@kewd_gefenia*@discount/100+"z)",
+ "- Geffen Dungeon ("+$@kewd_geffen*@discount/100+"z)",
+ "- Glast Heim ("+$@kewd_glastHeim*@discount/100+"z)",
+ "- Gon Ryun Dungeon ("+$@kewd_gonRyun*@discount/100+"z)",
+ "- Hidden Temple ("+$@kewd_hiddenTemple*@discount/100+"z)",
+ "- Juperos ("+$@kewd_juperos*@discount/100+"z)",
+ "- LightHalzen Rekkenber ("+$@kewd_lightHalzen*@discount/100+"z)",
+ "- Lou Yang Royal Tomb ("+$@kewd_louYang*@discount/100+"z)",
+ "- Magma Dungeon ("+$@kewd_magma*@discount/100+"z)",
+ "- Orcs Dungeon ("+$@kewd_orc*@discount/100+"z)",
+ "- Payon Dungeon ("+$@kewd_payon*@discount/100+"z)",
+ "- Pyramid ("+$@kewd_pyramid*@discount/100+"z)",
+ "- Sphinx ("+$@kewd_sphinx*@discount/100+"z)",
+ "- Sunken Ship ("+$@kewd_sunkenShip*@discount/100+"z)",
+ "- Thanatos Tower ("+$@kewd_thanatosTower*@discount/100+"z)",
+ "- Toy Factory ("+$@kewd_toyFactory*@discount/100+"z)",
+ "- Turtle Island ("+$@kewd_turtleIsland*@discount/100+"z)",
+ "- Umbala Dungeon ("+$@kewd_umbala*@discount/100+"z)"
+ );
+ }
+ switch (@kmenu) {
+ case 2:
+ SF_abyssLake();
+ break;
+ case 3:
+ SF_amatsu();
+ break;
+ case 4:
+ SF_antHell();
+ break;
+ case 5:
+ SF_ayothaya();
+ break;
+ case 6:
+ SF_byalan();
+ break;
+ case 7:
+ SF_comodo();
+ break;
+ case 8:
+ SF_clockTower();
+ break;
+ case 9:
+ SF_coalMine();
+ break;
+ case 10:
+ SF_culvert();
+ break;
+ case 11:
+ SF_einbech();
+ break;
+ case 12:
+ SF_gefenia();
+ break;
+ case 13:
+ SF_geffen();
+ break;
+ case 14:
+ SF_glastHeim();
+ break;
+ case 15:
+ SF_gonRyun();
+ break;
+ case 16:
+ SF_hiddenTemple();
+ break;
+ case 17:
+ SF_juperos();
+ break;
+ case 18:
+ SF_lightHalzen();
+ break;
+ case 19:
+ SF_louYang();
+ break;
+ case 20:
+ SF_magma();
+ break;
+ case 21:
+ SF_orcs();
+ break;
+ case 22:
+ SF_payon();
+ break;
+ case 23:
+ SF_pyramid();
+ break;
+ case 24:
+ SF_sphinx();
+ break;
+ case 25:
+ SF_sunkenShip();
+ break;
+ case 26:
+ SF_thanatosTower();
+ break;
+ case 27:
+ SF_toyFactory();
+ break;
+ case 28:
+ SF_turtleIsland();
+ break;
+ case 29:
+ SF_umbala();
+ break;
+ default:
+ return;
+ }
+ } while (@kmenu > 1);
+ return;
+
+//Subfunction SF_check(flag, cost, floor-count, player-map, dungeon-map#, map#1, map#2, ...)
+//If kewd_travel is set, the flag needs to match to be to warp there.
+//Floor count is the amount of levels the dungeon needs a price for,
+//dungeon-map# is the number of maps passed that need to be checked against
+//the player's map to see if they are warping from within the entrance.
+
+function SF_check {
+ if ($@kewd_travel && !((kewd_travel|#kewd_travel)&getarg(0))) {
+ callfunc "F_keIntro", e_sry, "Sorry, but we can only warp you to dungeons you have saved in before.";
+ return 0;
+ }
+ set @cost, getarg(1);
+ set @discount,100;
+ set @map$, getarg(3);
+ set @mapI, getarg(4);
+
+ while (@mapI > 0)
+ {
+ if (@map$ == getarg(4+@mapI)) {
+ set @discount,100-$@kewd_entryDiscount;
+ break;
+ }
+ set @mapI, @mapI-1;
+ }
+ set @discountKP, callfunc("F_keCost",100,$@kewd_discount);
+ set @discount,@discount*@discountKP/100;
+
+ set @cost,@cost*@discount/100;
+ set @inc,@cost*$@kewd_levelCost/100;
+
+ //@discountKP is used to reverse the price to before the KP discount takes place
+ if (@discountKP == 0)
+ set @discountKP,1;
+ if ($@kewd_deep == 0)
+ return 1;
+
+ switch (getarg(2)) {
+ case 9:
+ set @cost9, @cost +8*@inc;
+ case 8:
+ set @cost8, @cost +7*@inc;
+ case 7:
+ set @cost7, @cost +6*@inc;
+ case 6:
+ set @cost6, @cost +5*@inc;
+ case 5:
+ set @cost5, @cost +4*@inc;
+ case 4:
+ set @cost4, @cost +3*@inc;
+ case 3:
+ set @cost3, @cost +2*@inc;
+ case 2:
+ set @cost2, @cost +@inc;
+ }
+ return 1;
+}
+
+function SF_abyssLake {
+ if (!(SF_check(0x1, $@kewd_abyssLake, 3, @map$, 1, "hu_fild05.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Abyss Lake",
+ "- Entrance ("+@cost+"z/"+getmapusers("abyss_01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("abyss_02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("abyss_03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Abyss Lake",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"hu_fild05.gat",173,308;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"abyss_02.gat",272,270;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"abyss_03.gat",116,29;
+ break;
+ }
+}
+
+function SF_amatsu {
+ if (!(SF_check(0x2, $@kewd_amatsu, 3, @map$, 1, "ama_in02.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Amatsu Dungeon",
+ "- Entrance ("+@cost+"z/"+getmapusers("ama_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("ama_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("ama_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Amatsu Dungeon",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"ama_in02.gat",120,181;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ama_dun02.gat",34,41;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"ama_dun03.gat",119,14;
+ break;
+ }
+}
+
+function SF_antHell {
+ if (!(SF_check(0x4, $@kewd_antHell, 1, @map$, 2, "moc_fild04.gat","moc_fild15.gat")))
+ return;
+ if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Ant Hell",
+ "- Northern Entrance ("+@cost+"z/"+getmapusers("anthell01.gat")+" "+$@ked_users$+")",
+ "- Southern Entrance ("+@cost+"z/"+getmapusers("anthell02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Ant Hell",
+ "- Northern Entrance ("+@cost+"z)",
+ "- Southern Entrance ("+@cost+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild04.gat",201,327;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild15.gat",246,251;
+ break;
+ }
+}
+
+function SF_ayothaya {
+ if (!(SF_check(0x8, $@kewd_ayothaya, 2, @map$, 1, "ayo_fild02.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Ancient Shrine",
+ "- Entrance ("+@cost+"z/"+getmapusers("ayo_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("ayo_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Ancient Shrine",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"ayo_fild02.gat",273,150;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ayo_dun02.gat",24,28;
+ break;
+ }
+}
+
+function SF_byalan {
+ if (!(SF_check(0x10, $@kewd_byalan, 5, @map$, 1, "izlu2dun.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Undersea Tunnel",
+ "- Entrance ("+@cost+"z/"+getmapusers("iz_dun00.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("iz_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("iz_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("iz_dun03.gat")+" "+$@ked_users$+")",
+ "- Level 5 ("+@cost5+"z/"+getmapusers("iz_dun04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Undersea Tunnel",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)",
+ "- Level 5 ("+@cost5+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"izlu2dun.gat",114,84;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun01.gat",253,252;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun02.gat",236,204;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun03.gat",32,63;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"iz_dun04.gat",26,27;
+ break;
+ }
+}
+
+function SF_comodo {
+ if (!(SF_check(0x20, $@kewd_comodo, 1, @map$, 2, "comodo.gat","cmd_fild01.gat")))
+ return;
+
+ if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Comodo Caves",
+ "- Mao, The Eastern Cave ("+@cost+"z/"+getmapusers("beach_dun3.gat")+" "+$@ked_users$+")",
+ "- Karu, The Western Cave ("+@cost+"z/"+getmapusers("beach_dun.gat")+" "+$@ked_users$+")",
+ "- Ruande, The Northern Cave ("+@cost+"z/"+getmapusers("beach_dun2.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Comodo Caves",
+ "- Mao, The Eastern Cave ("+@cost+"z)",
+ "- Karu, The Western Cave ("+@cost+"z)",
+ "- Ruande, The Northern Cave ("+@cost+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"cmd_fild01.gat",34,325;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"comodo.gat",32,209;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"comodo.gat",180,352;
+ break;
+ }
+}
+
+function SF_clockTower {
+ if (!(SF_check(0x40, $@kewd_clockTower, 5, @map$, 1, "aldebaran.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Clock Tower",
+ "- Entrance ("+@cost+"z/"+getmapusers("c_tower1.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("c_tower2.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("c_tower3.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("c_tower4.gat")+" "+$@ked_users$+")",
+ "- Basement 1 ("+@cost2+"z/"+getmapusers("alde_dun01.gat")+" "+$@ked_users$+")",
+ "- Basement 2 ("+@cost3+"z/"+getmapusers("alde_dun02.gat")+" "+$@ked_users$+")",
+ "- Basement 3 ("+@cost4+"z/"+getmapusers("alde_dun03.gat")+" "+$@ked_users$+")",
+ "- Basement 4 ("+@cost5+"z/"+getmapusers("alde_dun04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Clock Tower",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)",
+ "- Basement 1 ("+@cost2+"z)",
+ "- Basement 2 ("+@cost3+"z)",
+ "- Basement 3 ("+@cost4+"z)",
+ "- Basement 4 ("+@cost5+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"aldebaran.gat",140,130;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"c_tower2.gat",268,26;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"c_tower3.gat",68,146;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"c_tower4.gat",185,44;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun01.gat",297,25;
+ break;
+ case 7:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun02.gat",43,24;
+ break;
+ case 8:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun03.gat",18,267;
+ break;
+ case 9:
+ callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"alde_dun04.gat",82,267;
+ break;
+ }
+}
+
+function SF_coalMine {
+ if (!(SF_check(0x80, $@kewd_coalMines, 3, @map$, 1, "mjolnir_02.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Mjolnir Dead Pit",
+ "- Entrance ("+@cost+"z/"+getmapusers("mjo_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("mjo_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("mjo_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Mjolnir Dead Pit",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"mjolnir_02.gat",89,358;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"mjo_dun02.gat",376,342;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"mjo_dun03.gat",305,260;
+ break;
+ }
+}
+
+function SF_culvert {
+ if (!(SF_check(0x100, $@kewd_culvert, 4, @map$, 1, "prt_fild05.gat")))
+ return;
+ if ($@kewd_deep == 0) {
+ set @submenu, 2;
+ } else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Prontera Culvert",
+ "- Entrance ("+@cost+"z/"+getmapusers("prt_sewb1.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("prt_sewb2.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("prt_sewb3.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("prt_sewb4.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Prontera Culvert",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"prt_fild05.gat",274,208;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb2.gat",19,19;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb3.gat",180,169;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"prt_sewb4.gat",100,92;
+ break;
+ }
+}
+
+function SF_einbech {
+ if (!(SF_check(0x200, $@kewd_einbech, 2, @map$, 1, "einbech.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Einbroch Mines",
+ "- Entrance ("+@cost+"z/"+getmapusers("ein_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("ein_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Einbech Mines",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"einbech.gat",138,244;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"ein_dun02.gat",290,285;
+ break;
+ }
+}
+
+function SF_geffen {
+ if (!(SF_check(0x800, $@kewd_geffen, 3, @map$, 1, "gef_tower.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Geffen Dungeon",
+ "- Entrance ("+@cost+"z/"+getmapusers("gef_dun00.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("gef_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("gef_dun02.gat")+" "+$@ked_users$+")"
+// "- Level 4 ("+@cost4+"z/"+getmapusers("gef_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Geffen Dungeon",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+// "- Level 4 ("+@cost4+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gef_tower.gat",147,35;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun01.gat",115,236;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun02.gat",106,132;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gef_dun03.gat",203,200;
+ break;
+ }
+}
+
+function SF_gefenia {
+ if (!(SF_check(0x400, $@kewd_gefenia, 2, @map$, 4, "gefenia01.gat","gefenia02.gat","gefenia03.gat","gefenia04.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Gefenia",
+ "- Level 1 ("+@cost+"z/"+getmapusers("gefenia01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("gefenia02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost2+"z/"+getmapusers("gefenia03.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost+"z/"+getmapusers("gefenia04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Gefenia",
+ "- Level 1 ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost2+"z)",
+ "- Level 4 ("+@cost+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gefenia01.gat",60,169;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gefenia02.gat",116,116;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gefenia03.gat",119,277;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gefenia04.gat",129,86;
+ break;
+ }
+}
+
+function SF_glastHeim {
+ if (!(SF_check(0x1000, $@kewd_glastHeim, 7, @map$, 1, "glast_01.gat")))
+ return;
+ if ($@kewd_deep == 0) {
+ if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Glast Heim",
+ "- Church Entrance ("+@cost+"z/"+getmapusers("gl_church.gat")+" "+$@ked_users$+")",
+ "- Castle Terrace ("+@cost+"z/"+(getmapusers("gl_cas01.gat")+getmapusers("gl_cas02.gat"))+" "+$@ked_users$+")",
+ "- Staircase Entrance ("+@cost+"z/"+getmapusers("gl_step.gat")+" "+$@ked_users$+")",
+ "- Chivalry Entrance ("+@cost+"z/"+getmapusers("gl_knt01.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Glast Heim",
+ "- Church Entrance ("+@cost+"z)",
+ "- Castle Terrace ("+@cost+"z)",
+ "- Staircase Entrance ("+@cost+"z)",
+ "- Chivalry Entrance ("+@cost+"z)"
+ );
+ }
+ if (@submenu > 2) //Churchyard is index 3.
+ set @submenu, @submenu+1;
+ } else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Glast Heim",
+ "- Church Entrance ("+@cost+"z/"+getmapusers("gl_church.gat")+" "+$@ked_users$+")",
+ "- Churchyard ("+@cost2+"z/"+getmapusers("gl_chyard.gat")+" "+$@ked_users$+")",
+ "- Castle Terrace ("+@cost+"z/"+(getmapusers("gl_cas01.gat")+getmapusers("gl_cas02.gat"))+" "+$@ked_users$+")",
+ "- Staircase Entrance ("+@cost+"z/"+getmapusers("gl_step.gat")+" "+$@ked_users$+")",
+ "- Chivalry Entrance ("+@cost+"z/"+getmapusers("gl_knt01.gat")+" "+$@ked_users$+")",
+ "- Chivalry Level 2 ("+@cost2+"z/"+getmapusers("gl_knt02.gat")+" "+$@ked_users$+")",
+ "- Underground Prison 1 ("+@cost2+"z/"+getmapusers("gl_prison.gat")+" "+$@ked_users$+")",
+ "- Underground Prison 2 ("+@cost3+"z/"+getmapusers("gl_prison1.gat")+" "+$@ked_users$+")",
+ "- Culvert Level 1 ("+@cost4+"z/"+getmapusers("gl_sew01.gat")+" "+$@ked_users$+")",
+ "- Culvert Level 2 ("+@cost3+"z/"+getmapusers("gl_sew02.gat")+" "+$@ked_users$+")",
+ "- Culvert Level 3 ("+@cost4+"z/"+getmapusers("gl_sew03.gat")+" "+$@ked_users$+")",
+ "- Culvert Level 4 ("+@cost5+"z/"+getmapusers("gl_sew04.gat")+" "+$@ked_users$+")",
+ "- Underground Cave 1 ("+@cost6+"z/"+getmapusers("gl_dun01.gat")+" "+$@ked_users$+")",
+ "- Underground Cave 2 ("+@cost7+"z/"+getmapusers("gl_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Glast Heim",
+ "- Church Entrance ("+@cost+"z)",
+ "- Churchyard ("+@cost2+"z)",
+ "- Castle Terrace ("+@cost+"z)",
+ "- Staircase Entrance ("+@cost+"z)",
+ "- Chivalry Entrance ("+@cost+"z)",
+ "- Chivalry Level 2 ("+@cost2+"z)",
+ "- Underground Prison Level 1 ("+@cost2+"z)",
+ "- Underground Prison Level 2 ("+@cost3+"z)",
+ "- Culvert Level 1 ("+@cost4+"z)",
+ "- Culvert Level 2 ("+@cost3+"z)",
+ "- Culvert Level 3 ("+@cost4+"z)",
+ "- Culvert Level 4 ("+@cost5+"z)",
+ "- Underground Cave Level 1 ("+@cost6+"z)",
+ "- Underground Cave Level 2 ("+@cost7+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",206,136;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_chyard.gat",147,15;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",199,335;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",62,107;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"glast_01.gat",69,193;
+ break;
+ case 7:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_knt02.gat",157,287;
+ break;
+ case 8:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gl_prison.gat",14,70;
+ break;
+ case 9:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gl_prison1.gat",150,14;
+ break;
+ case 10:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew01.gat",258,255;
+ break;
+ case 11:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew02.gat",108,291;
+ break;
+ case 12:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew03.gat",171,283;
+ break;
+ case 13:
+ callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"gl_sew04.gat",68,277;
+ break;
+ case 14:
+ callfunc "F_keWarp",@cost6*100/@discountKP,$@kewd_discount,e_hmm,"gl_dun01.gat",133,271;
+ break;
+ case 15:
+ callfunc "F_keWarp",@cost7*100/@discountKP,$@kewd_discount,e_hmm,"gl_dun02.gat",224,274;
+ break;
+ }
+}
+
+function SF_gonRyun {
+ if (!(SF_check(0x2000, $@kewd_gonRyun, 3, @map$, 1, "gonryun.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Gon Ryun Dungeon",
+ "- Entrance ("+@cost+"z/"+getmapusers("gon_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("gon_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("gon_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Gon Ryun Dungeon",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"gonryun.gat",161,195;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"gon_dun02.gat",22,114;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"gon_dun03.gat",68,11;
+ break;
+ }
+}
+
+function SF_hiddenTemple {
+ if (!(SF_check(0x4000, $@kewd_hiddenTemple, 3, @map$, 1, "prt_fild01.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Laberynth Forest",
+ "- Entrance ("+@cost+"z/"+getmapusers("prt_maze01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("prt_maze02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("prt_maze03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Laberynth Forest",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"prt_fild01.gat",136,361;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"prt_maze02.gat",106,62;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"prt_maze03.gat",23,8;
+ break;
+ }
+}
+
+function SF_juperos {
+ if (!(SF_check(0x8000, $@kewd_juperos, 3, @map$, 1, "jupe_cave.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Juperos",
+ "- Entrance ("+@cost+"z/"+getmapusers("juperos_01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("juperos_02.gat")+" "+$@ked_users$+")",
+ "- Core ("+@cost3+"z/"+getmapusers("jupe_core.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Juperos",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Core ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"jupe_cave.gat",55,52;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"juperos_02.gat",37,63;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"jupe_gate.gat",-1,-1;
+ break;
+ }
+}
+
+function SF_lightHalzen {
+ if (!(SF_check(0x10000, $@kewd_lightHalzen, 3, @map$, 1, "lighthalzen.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Rekkenber",
+ "- Entrance ("+@cost+"z/"+getmapusers("lou_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("lou_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("lou_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Rekkenber",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+//This is the Rekkenber building entrance, which officially is only a dungeon exit.
+// callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"lighthalzen.gat",74,72;
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"lighthalzen.gat",303,302;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"lhz_dun02.gat",154,18;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"lhz_dun03.gat",141,132;
+ break;
+ }
+}
+
+function SF_louYang {
+ if (!(SF_check(0x20000, $@kewd_louYang, 3, @map$, 1, "louyang.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Royal Tomb",
+ "- Entrance ("+@cost+"z/"+getmapusers("lou_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("lou_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("lou_dun03.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Royal Tomb",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)"
+ );
+ };
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"louyang.gat",41,267;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"lou_dun02.gat",281,20;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"lou_dun03.gat",165,39;
+ break;
+ }
+}
+
+function SF_magma {
+ if (!(SF_check(0x40000, $@kewd_magma, 2, @map$, 1, "yuno_fild03.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Nogg Road",
+ "- Entrance ("+@cost+"z/"+getmapusers("mag_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("mag_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Nogg Road",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"yuno_fild03.gat",35,135;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"mag_dun02.gat",47,30;
+ break;
+ }
+}
+
+function SF_orcs {
+ if (!(SF_check(0x80000, $@kewd_orc, 2, @map$, 1, "gef_fild10.gat")))
+ return;
+ if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Orcs Dungeon",
+ "- Front Entrance ("+@cost+"z/"+getmapusers("orcsdun01.gat")+" "+$@ked_users$+")",
+ "- Back Entrance ("+@cost+"z/"+getmapusers("orcsdun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Orcs Dungeon",
+ "- Front Entrance ("+@cost+"z)",
+ "- Back Entrance ("+@cost+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"in_orcs01.gat",34,165;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"in_orcs01.gat",112,99;
+ break;
+ }
+}
+
+function SF_payon {
+ if (!(SF_check(0x100000, $@kewd_payon, 5, @map$, 1, "pay_arche.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Payon Cave",
+ "- Entrance ("+@cost+"z/"+getmapusers("pay_dun00.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("pay_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("pay_dun02.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("pay_dun03.gat")+" "+$@ked_users$+")",
+ "- Level 5 ("+@cost5+"z/"+getmapusers("pay_dun04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Payon Cave",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)",
+ "- Level 5 ("+@cost5+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"pay_arche.gat",41,133;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun01.gat",19,33;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun02.gat",19,63;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun03.gat",155,159;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"pay_dun04.gat",34,202;
+ break;
+ }
+}
+
+function SF_pyramid {
+ if (!(SF_check(0x200000, $@kewd_pyramid, 4, @map$,1, "moc_ruins.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Pyramid",
+ "- Entrance ("+@cost+"z/"+getmapusers("moc_pryd01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("moc_pryd02.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("moc_pryd03.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("moc_pryd04.gat")+" "+$@ked_users$+")",
+ "- Basement 1 ("+@cost2+"z/"+getmapusers("moc_pryd05.gat")+" "+$@ked_users$+")",
+ "- Basement 2 ("+@cost3+"z/"+getmapusers("moc_pryd06.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Pyramid",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)",
+ "- Basement 1 ("+@cost2+"z)",
+ "- Basement 2 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_ruins.gat",62,162;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd02.gat",10,192;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd03.gat",100,92;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd04.gat",18,187;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd05.gat",94,96;
+ break;
+ case 7:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"moc_pryd06.gat",192,11;
+ break;
+ }
+}
+
+function SF_sphinx {
+ if (!(SF_check(0x400000, $@kewd_sphinx, 5, @map$, 1, "moc_fild19.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to the Sphinx",
+ "- Entrance ("+@cost+"z/"+getmapusers("in_sphinx1.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("in_sphinx2.gat")+" "+$@ked_users$+")",
+ "- Level 3 ("+@cost3+"z/"+getmapusers("in_sphinx3.gat")+" "+$@ked_users$+")",
+ "- Level 4 ("+@cost4+"z/"+getmapusers("in_sphinx4.gat")+" "+$@ked_users$+")",
+ "- Level 5 ("+@cost5+"z/"+getmapusers("in_sphinx5.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to the Sphinx",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)",
+ "- Level 3 ("+@cost3+"z)",
+ "- Level 4 ("+@cost4+"z)",
+ "- Level 5 ("+@cost5+"z)"
+ );
+ }
+
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"moc_fild19.gat",107,100;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx2.gat",149,81;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx3.gat",210,54;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx4.gat",10,222;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost5*100/@discountKP,$@kewd_discount,e_hmm,"in_sphinx5.gat",100,99;
+ break;
+ }
+}
+
+function SF_sunkenShip {
+ if (!(SF_check(0x800000, $@kewd_sunkenShip, 2, @map$, 1, "alb2trea.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Sunken Ship",
+ "- Entrance ("+@cost+"z/"+getmapusers("treasure01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("treasure02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Sunken Ship",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"alb2trea.gat",87,103;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"treasure02.gat",102,27;
+ break;
+ }
+}
+
+function SF_thanatosTower {
+ if (!(SF_check(0x1000000, $@kewd_thanatosTower, 9, @map$, 1, "tha_t01.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Thanatos Tower",
+ "- Entrance ("+@cost+"z/"+getmapusers("tha_t01.gat")+" "+$@ked_users$+")",
+ "- Floor 2 ("+@cost2+"z/"+getmapusers("tha_t02.gat")+" "+$@ked_users$+")",
+ "- Floor 3 ("+@cost3+"z/"+getmapusers("tha_t03.gat")+" "+$@ked_users$+")",
+ "- Floor 4 ("+@cost4+"z/"+getmapusers("tha_t04.gat")+" "+$@ked_users$+")",
+ "- Floor 5 ("+@cost5+"z/"+getmapusers("tha_t05.gat")+" "+$@ked_users$+")",
+ "- Floor 6 ("+@cost6+"z/"+getmapusers("tha_t06.gat")+" "+$@ked_users$+")",
+ "- Floor 7 ("+@cost7+"z/"+getmapusers("tha_t07.gat")+" "+$@ked_users$+")",
+ "- Floor 8 ("+@cost8+"z/"+getmapusers("tha_t08.gat")+" "+$@ked_users$+")",
+ "- Floor 9 ("+@cost9+"z/"+getmapusers("tha_t09.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Thanatos Tower",
+ "- Entrance ("+@cost+"z)",
+ "- Floor 2 ("+@cost2+"z)",
+ "- Floor 3 ("+@cost3+"z)",
+ "- Floor 4 ("+@cost4+"z)",
+ "- Floor 5 ("+@cost5+"z)",
+ "- Floor 6 ("+@cost6+"z)",
+ "- Floor 7 ("+@cost7+"z)",
+ "- Floor 8 ("+@cost8+"z)",
+ "- Floor 9 ("+@cost9+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tha_scene01.gat",139,201;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"tha_t02.gat",149,136;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"tha_t03.gat",220,159;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t04.gat",59,144;
+ break;
+ case 6:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t05.gat",62,9;
+ break;
+ case 7:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t06.gat",120,225;
+ break;
+ case 8:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t07.gat",32,166;
+ break;
+ case 9:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t08.gat",108,44;
+ break;
+ case 10:
+ callfunc "F_keWarp",@cost4*100/@discountKP,$@kewd_discount,e_hmm,"tha_t09.gat",87,145;
+ break;
+ }
+}
+
+function SF_toyFactory {
+ if (!(SF_check(0x2000000, $@kewd_toyFactory, 2, @map$, 1, "xmas.gat")))
+ return;
+
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Toy Factory",
+ "- Entrance ("+@cost+"z/"+getmapusers("xmas_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("xmas_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Toy Factory",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"xmas.gat",144,306;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"xmas_dun02.gat",129,133;
+ break;
+ }
+}
+
+function SF_turtleIsland {
+ if (!(SF_check(0x4000000, $@kewd_turtleIsland, 3, @map$, 1, "tur_dun01.gat")))
+ return;
+ if ($@kewd_deep == 0) {
+ if ($@kewd_turtleCave)
+ set @submenu, 3;
+ else
+ set @submenu, 2;
+ } else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Turtle Island",
+ "- Island Entrance ("+@cost+"z/"+getmapusers("tur_dun01.gat")+" "+$@ked_users$+")",
+ "- Cave Entrance ("+@cost+"z/"+getmapusers("tur_dun02.gat")+" "+$@ked_users$+")",
+ "- Cave Level 2 ("+@cost2+"z/"+getmapusers("tur_dun03.gat")+" "+$@ked_users$+")",
+ "- Cave Level 3 ("+@cost3+"z/"+getmapusers("tur_dun04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Turtle Island",
+ "- Island Entrance ("+@cost+"z)",
+ "- Cave Entrance ("+@cost+"z)",
+ "- Cave Level 2 ("+@cost2+"z)",
+ "- Cave Level 3 ("+@cost3+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun01.gat",153,47;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun01.gat",155,234;
+ break;
+ case 4:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun03.gat",132,189;
+ break;
+ case 5:
+ callfunc "F_keWarp",@cost3*100/@discountKP,$@kewd_discount,e_hmm,"tur_dun04.gat",100,192;
+ break;
+ }
+}
+
+function SF_umbala {
+ if (!(SF_check(0x8000000, $@kewd_umbala, 2, @map$, 1, "umbala.gat")))
+ return;
+ if ($@kewd_deep == 0)
+ set @submenu, 2;
+ else if ($@kewd_showOnline) {
+ set @submenu, select(
+ "- Cancel warp to Umbala Dungeon",
+ "- Entrance ("+@cost+"z/"+getmapusers("um_dun01.gat")+" "+$@ked_users$+")",
+ "- Level 2 ("+@cost2+"z/"+getmapusers("um_dun02.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel warp to Umbala Dungeon",
+ "- Entrance ("+@cost+"z)",
+ "- Level 2 ("+@cost2+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",@cost*100/@discountKP,$@kewd_discount,e_hmm,"umbala.gat",113,282;
+ break;
+ case 3:
+ callfunc "F_keWarp",@cost2*100/@discountKP,$@kewd_discount,e_hmm,"um_dun02.gat",48,31;
+ break;
+ }
+}
+
+}
+
+//Invoked when we want to add a map to the list of travelled-to dungeons
+function script F_keAddTravelDungeon {
+ set @map$, getarg(0);
+// Temporary code to update the previous variable format to the new one.
+ if(kewd_abyss) {
+ set kewd_travel,kewd_travel|0x1;
+ set kewd_abyss,0;
+ }
+ if(kewd_amatsu) {
+ set kewd_travel,kewd_travel|0x2;
+ set kewd_amatsu,0;
+ }
+ if(kewd_antHell) {
+ set kewd_travel,kewd_travel|0x4;
+ set kewd_antHell,0;
+ }
+ if(kewd_ayothaya) {
+ set kewd_travel,kewd_travel|0x8;
+ set kewd_ayothaya,0;
+ }
+ if(kewd_byalan) {
+ set kewd_travel,kewd_travel|0x10;
+ set kewd_byalan,0;
+ }
+ if(kewd_comodo) {
+ set kewd_travel,kewd_travel|0x20;
+ set kewd_comodo,0;
+ }
+ if(kewd_clockTower) {
+ set kewd_travel,kewd_travel|0x40;
+ set kewd_clockTower,0;
+ }
+ if(kewd_coalMines) {
+ set kewd_travel,kewd_travel|0x80;
+ set kewd_coalMines,0;
+ }
+ if(kewd_culvert) {
+ set kewd_travel,kewd_travel|0x100;
+ set kewd_culvert,0;
+ }
+ if(kewd_einbech) {
+ set kewd_travel,kewd_travel|0x200;
+ set kewd_einbech,0;
+ }
+ if(kewd_geffen) {
+ set kewd_travel,kewd_travel|0x800;
+ set kewd_geffen,0;
+ }
+ if(kewd_glastHeim) {
+ set kewd_travel,kewd_travel|0x1000;
+ set kewd_glastHeim,0;
+ }
+ if(kewd_gonRyun) {
+ set kewd_travel,kewd_travel|0x2000;
+ set kewd_gonRyun,0;
+ }
+ if(kewd_hiddenTemple) {
+ set kewd_travel,kewd_travel|0x4000;
+ set kewd_hiddenTemple,0;
+ }
+ if(kewd_juperos) {
+ set kewd_travel,kewd_travel|0x8000;
+ set kewd_juperos,0;
+ }
+ if(kewd_lightHalzen) {
+ set kewd_travel,kewd_travel|0x10000;
+ set kewd_lightHalzen,0;
+ }
+ if(kewd_louYang) {
+ set kewd_travel,kewd_travel|0x20000;
+ set kewd_louYang,0;
+ }
+ if(kewd_magma) {
+ set kewd_travel,kewd_travel|0x40000;
+ set kewd_magma,0;
+ }
+ if(kewd_orc) {
+ set kewd_travel,kewd_travel|0x80000;
+ set kewd_orc,0;
+ }
+ if(kewd_payon) {
+ set kewd_travel,kewd_travel|0x100000;
+ set kewd_payon,0;
+ }
+ if(kewd_pyramid) {
+ set kewd_travel,kewd_travel|0x200000;
+ set kewd_pyramid,0;
+ }
+ if(kewd_sphinx) {
+ set kewd_travel,kewd_travel|0x400000;
+ set kewd_sphinx,0;
+ }
+ if(kewd_sunkenShip) {
+ set kewd_travel,kewd_travel|0x800000;
+ set kewd_sunkenShip,0;
+ }
+ if(kewd_thanatosTower) {
+ set kewd_travel,kewd_travel|0x1000000;
+ set kewd_thanatosTower,0;
+ }
+ if(kewd_toyFactory) {
+ set kewd_travel,kewd_travel|0x2000000;
+ set kewd_toyFactory,0;
+ }
+ if(kewd_turtleIsland) {
+ set kewd_travel,kewd_travel|0x4000000;
+ set kewd_turtleIsland,0;
+ }
+ if(kewd_umbala) {
+ set kewd_travel,kewd_travel|0x8000000;
+ set kewd_umbala,0;
+ }
+
+ if(#kewd_abyss) {
+ set #kewd_travel,#kewd_travel|0x1;
+ set #kewd_abyss,0;
+ }
+ if(#kewd_amatsu) {
+ set #kewd_travel,#kewd_travel|0x2;
+ set #kewd_amatsu,0;
+ }
+ if(#kewd_antHell) {
+ set #kewd_travel,#kewd_travel|0x4;
+ set #kewd_antHell,0;
+ }
+ if(#kewd_ayothaya) {
+ set #kewd_travel,#kewd_travel|0x8;
+ set #kewd_ayothaya,0;
+ }
+ if(#kewd_byalan) {
+ set #kewd_travel,#kewd_travel|0x10;
+ set #kewd_byalan,0;
+ }
+ if(#kewd_comodo) {
+ set #kewd_travel,#kewd_travel|0x20;
+ set #kewd_comodo,0;
+ }
+ if(#kewd_clockTower) {
+ set #kewd_travel,#kewd_travel|0x40;
+ set #kewd_clockTower,0;
+ }
+ if(#kewd_coalMines) {
+ set #kewd_travel,#kewd_travel|0x80;
+ set #kewd_coalMines,0;
+ }
+ if(#kewd_culvert) {
+ set #kewd_travel,#kewd_travel|0x100;
+ set #kewd_culvert,0;
+ }
+ if(#kewd_einbech) {
+ set #kewd_travel,#kewd_travel|0x200;
+ set #kewd_einbech,0;
+ }
+ if(#kewd_geffen) {
+ set #kewd_travel,#kewd_travel|0x800;
+ set #kewd_geffen,0;
+ }
+ if(#kewd_glastHeim) {
+ set #kewd_travel,#kewd_travel|0x1000;
+ set #kewd_glastHeim,0;
+ }
+ if(#kewd_gonRyun) {
+ set #kewd_travel,#kewd_travel|0x2000;
+ set #kewd_gonRyun,0;
+ }
+ if(#kewd_hiddenTemple) {
+ set #kewd_travel,#kewd_travel|0x4000;
+ set #kewd_hiddenTemple,0;
+ }
+ if(#kewd_juperos) {
+ set #kewd_travel,#kewd_travel|0x8000;
+ set #kewd_juperos,0;
+ }
+ if(#kewd_lightHalzen) {
+ set #kewd_travel,#kewd_travel|0x10000;
+ set #kewd_lightHalzen,0;
+ }
+ if(#kewd_louYang) {
+ set #kewd_travel,#kewd_travel|0x20000;
+ set #kewd_louYang,0;
+ }
+ if(#kewd_magma) {
+ set #kewd_travel,#kewd_travel|0x40000;
+ set #kewd_magma,0;
+ }
+ if(#kewd_orc) {
+ set #kewd_travel,#kewd_travel|0x80000;
+ set #kewd_orc,0;
+ }
+ if(#kewd_payon) {
+ set #kewd_travel,#kewd_travel|0x100000;
+ set #kewd_payon,0;
+ }
+ if(#kewd_pyramid) {
+ set #kewd_travel,#kewd_travel|0x200000;
+ set #kewd_pyramid,0;
+ }
+ if(#kewd_sphinx) {
+ set #kewd_travel,#kewd_travel|0x400000;
+ set #kewd_sphinx,0;
+ }
+ if(#kewd_sunkenShip) {
+ set #kewd_travel,#kewd_travel|0x800000;
+ set #kewd_sunkenShip,0;
+ }
+ if(#kewd_thanatosTower) {
+ set #kewd_travel,#kewd_travel|0x1000000;
+ set #kewd_thanatosTower,0;
+ }
+ if(#kewd_toyFactory) {
+ set #kewd_travel,#kewd_travel|0x2000000;
+ set #kewd_toyFactory,0;
+ }
+ if(#kewd_turtleIsland) {
+ set #kewd_travel,#kewd_travel|0x4000000;
+ set #kewd_turtleIsland,0;
+ }
+ if(#kewd_umbala) {
+ set #kewd_travel,#kewd_travel|0x8000000;
+ set #kewd_umbala,0;
+ }
+
+// End transition code.
+ if ($@kewd_travel > 1) {
+ if (@map$ == "hu_fild05.gat" || kewd_travel&0x1)
+ set #kewd_travel,#kewd_travel|0x1;
+ if (@map$ == "ama_in02.gat" || kewd_travel&0x2)
+ set #kewd_travel,#kewd_travel|0x2;
+ if (@map$ == "moc_fild04.gat" || @map$ == "moc_fild15.gat" || kewd_travel&0x4)
+ set #kewd_travel,#kewd_travel|0x4;
+ if (@map$ == "ayo_fild02.gat" || kewd_travel&0x8)
+ set #kewd_travel,#kewd_travel|0x8;
+ if (@map$ == "izlu2dun.gat" || kewd_travel&0x10)
+ set #kewd_travel,#kewd_travel|0x10;
+ if (@map$ == "comodo.gat" || @map$ == "cmd_fild01.gat" || kewd_travel&0x20)
+ set #kewd_travel,#kewd_travel|0x20;
+ if (@map$ == "aldebaran.gat" || kewd_travel&0x40)
+ set #kewd_travel,#kewd_travel|0x40;
+ if (@map$ == "mjolnir_02.gat" || kewd_travel&0x80)
+ set #kewd_travel,#kewd_travel|0x80;
+ if (@map$ == "prt_fild05.gat" || kewd_travel&0x100)
+ set #kewd_travel,#kewd_travel|0x100;
+ if (@map$ == "einbech.gat" || kewd_travel&0x200)
+ set #kewd_travel,#kewd_travel|0x200;
+ if (@map$ == "gef_tower.gat" || kewd_travel&0x800)
+ set #kewd_travel,#kewd_travel|0x800;
+ if (@map$ == "glast_01.gat" || kewd_travel&0x1000)
+ set #kewd_travel,#kewd_travel|0x1000;
+ if (@map$ == "gonryun.gat" || kewd_travel&0x2000)
+ set #kewd_travel,#kewd_travel|0x2000;
+ if (@map$ == "prt_fild01.gat" || kewd_travel&0x4000)
+ set #kewd_travel,#kewd_travel|0x4000;
+ if (@map$ == "jupe_cave.gat" || kewd_travel&0x8000)
+ set #kewd_travel,#kewd_travel|0x8000;
+ if (@map$ == "lighthalzen.gat" || kewd_travel&0x10000)
+ set #kewd_travel,#kewd_travel|0x10000;
+ if (@map$ == "louyang.gat" || kewd_travel&0x20000)
+ set #kewd_travel,#kewd_travel|0x20000;
+ if (@map$ == "yuno_fild03.gat" || kewd_travel&0x40000)
+ set #kewd_travel,#kewd_travel|0x40000;
+ if (@map$ == "in_orcs01.gat" || kewd_travel&0x80000)
+ set #kewd_travel,#kewd_travel|0x80000;
+ if (@map$ == "pay_arche.gat" || kewd_travel&0x100000)
+ set #kewd_travel,#kewd_travel|0x100000;
+ if (@map$ == "moc_ruins.gat" || kewd_travel&0x200000)
+ set #kewd_travel,#kewd_travel|0x200000;
+ if (@map$ == "moc_fild19.gat" || kewd_travel&0x400000)
+ set #kewd_travel,#kewd_travel|0x400000;
+ if (@map$ == "alb2trea.gat" || kewd_travel&0x800000)
+ set #kewd_travel,#kewd_travel|0x800000;
+ if (@map$ == "tha_t01.gat" || kewd_travel&0x1000000)
+ set #kewd_travel,#kewd_travel|0x1000000;
+ if (@map$ == "xmas.gat" || kewd_travel&0x2000000)
+ set #kewd_travel,#kewd_travel|0x2000000;
+ if (@map$ == "tur_dun01.gat" || kewd_travel&0x4000000)
+ set #kewd_travel,#kewd_travel|0x4000000;
+ if (@map$ == "umbala.gat" || kewd_travel&0x8000000)
+ set #kewd_travel,#kewd_travel|0x8000000;
+ } else {
+ if (@map$ == "hu_fild05.gat")
+ set kewd_travel,kewd_travel|0x1;
+ if (@map$ == "ama_in02.gat")
+ set kewd_travel,kewd_travel|0x2;
+ if (@map$ == "moc_fild04.gat" || @map$ == "moc_fild15.gat")
+ set kewd_travel,kewd_travel|0x4;
+ if (@map$ == "ayo_fild02.gat")
+ set kewd_travel,kewd_travel|0x8;
+ if (@map$ == "izlu2dun.gat")
+ set kewd_travel,kewd_travel|0x10;
+ if (@map$ == "comodo.gat" || @map$ == "cmd_fild01.gat")
+ set kewd_travel,kewd_travel|0x20;
+ if (@map$ == "aldebaran.gat")
+ set kewd_travel,kewd_travel|0x40;
+ if (@map$ == "mjolnir_02.gat")
+ set kewd_travel,kewd_travel|0x80;
+ if (@map$ == "prt_fild05.gat")
+ set kewd_travel,kewd_travel|0x100;
+ if (@map$ == "einbech.gat")
+ set kewd_travel,kewd_travel|0x200;
+ if (@map$ == "gef_tower.gat")
+ set kewd_travel,kewd_travel|0x800;
+ if (@map$ == "glast_01.gat")
+ set kewd_travel,kewd_travel|0x1000;
+ if (@map$ == "gonryun.gat")
+ set kewd_travel,kewd_travel|0x2000;
+ if (@map$ == "prt_fild01.gat")
+ set kewd_travel,kewd_travel|0x4000;
+ if (@map$ == "jupe_cave.gat")
+ set kewd_travel,kewd_travel|0x8000;
+ if (@map$ == "lighthalzen.gat")
+ set kewd_travel,kewd_travel|0x10000;
+ if (@map$ == "louyang.gat")
+ set kewd_travel,kewd_travel|0x20000;
+ if (@map$ == "yuno_fild03.gat")
+ set kewd_travel,kewd_travel|0x40000;
+ if (@map$ == "in_orcs01.gat")
+ set kewd_travel,kewd_travel|0x80000;
+ if (@map$ == "pay_arche.gat")
+ set kewd_travel,kewd_travel|0x100000;
+ if (@map$ == "moc_ruins.gat")
+ set kewd_travel,kewd_travel|0x200000;
+ if (@map$ == "moc_fild19.gat")
+ set kewd_travel,kewd_travel|0x400000;
+ if (@map$ == "alb2trea.gat")
+ set kewd_travel,kewd_travel|0x800000;
+ if (@map$ == "tha_t01.gat")
+ set kewd_travel,kewd_travel|0x1000000;
+ if (@map$ == "xmas.gat")
+ set kewd_travel,kewd_travel|0x2000000;
+ if (@map$ == "tur_dun01.gat")
+ set kewd_travel,kewd_travel|0x4000000;
+ if (@map$ == "umbala.gat")
+ set kewd_travel,kewd_travel|0x8000000;
+ }
+ return;
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt
index 73f278b5d..b12d0fcb1 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_pvp.txt
@@ -1,156 +1,156 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Pvp Warping Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers warping to the PvP arenas.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//============================================================
-
-- script keInit_warpPvp -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadWarpPvp";
- end;
-}
-
-function script F_keWarpPvp {
-
- function SF_pvpMenu;
-
- set @cost,callfunc("F_keCost",1,100);
- if ($@kewp_advanced == 0) {
- SF_pvpMenu 1,$@kewp_cost,100,0,0;
- return;
- }
-
- do {
- if ($@kewp_showOnline) {
- set @kmenu, select(
- "- Cancel",
- "- All Levels Rooms ("+($@kewp_cost*@cost)+"z/"+(getmapusers("pvp_n_8-1.gat")+getmapusers("pvp_n_8-2.gat")
- +getmapusers("pvp_n_8-3.gat")+getmapusers("pvp_n_8-4.gat")+getmapusers("pvp_n_8-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" Rooms ("+($@kewp_cost1*@cost)+"z/"
- +(getmapusers("pvp_n_1-1.gat")+getmapusers("pvp_n_1-2.gat")+getmapusers("pvp_n_1-3.gat")
- +getmapusers("pvp_n_1-4.gat")+getmapusers("pvp_n_1-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" Rooms ("+($@kewp_cost2*@cost)+"z/"
- +(getmapusers("pvp_n_2-1.gat")+getmapusers("pvp_n_2-2.gat")+getmapusers("pvp_n_2-3.gat")
- +getmapusers("pvp_n_2-4.gat")+getmapusers("pvp_n_2-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" Rooms ("+($@kewp_cost3*@cost)+"z/"
- +(getmapusers("pvp_n_3-1.gat")+getmapusers("pvp_n_3-2.gat")+getmapusers("pvp_n_3-3.gat")
- +getmapusers("pvp_n_3-4.gat")+getmapusers("pvp_n_3-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" Rooms ("+($@kewp_cost4*@cost)+"z/"
- +(getmapusers("pvp_n_4-1.gat")+getmapusers("pvp_n_4-2.gat")+getmapusers("pvp_n_4-3.gat")
- +getmapusers("pvp_n_4-4.gat")+getmapusers("pvp_n_4-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" Rooms ("+($@kewp_cost5*@cost)+"z/"
- +(getmapusers("pvp_n_5-1.gat")+getmapusers("pvp_n_5-2.gat")+getmapusers("pvp_n_5-3.gat")
- +getmapusers("pvp_n_5-4.gat")+getmapusers("pvp_n_5-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" Rooms ("+($@kewp_cost6*@cost)+"z/"
- +(getmapusers("pvp_n_6-1.gat")+getmapusers("pvp_n_6-2.gat")+getmapusers("pvp_n_6-3.gat")
- +getmapusers("pvp_n_6-4.gat")+getmapusers("pvp_n_6-5.gat"))+" "+$@ked_users$+")",
- "- Levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" Rooms ("+($@kewp_cost7*@cost)+"z/"
- +(getmapusers("pvp_n_7-1.gat")+getmapusers("pvp_n_7-2.gat")+getmapusers("pvp_n_7-3.gat")
- +getmapusers("pvp_n_7-4.gat")+getmapusers("pvp_n_7-5.gat"))+" "+$@ked_users$+")"
- );
- } else {
- set @kmenu, select(
- "- Cancel",
- "- No Level Restriction Rooms ("+($@kewp_cost*@cost)+"z)",
- "- Levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" Rooms ("+($@kewp_cost1*@cost)+"z)",
- "- Levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" Rooms ("+($@kewp_cost2*@cost)+"z)",
- "- Levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" Rooms ("+($@kewp_cost3*@cost)+"z)",
- "- Levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" Rooms ("+($@kewp_cost4*@cost)+"z)",
- "- Levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" Rooms ("+($@kewp_cost5*@cost)+"z)",
- "- Levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" Rooms ("+($@kewp_cost6*@cost)+"z)",
- "- Levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" Rooms ("+($@kewp_cost7*@cost)+"z)"
- );
- }
- switch(@kmenu) {
- case 2: //No restrictions
- SF_pvpMenu 8,$@kewp_cost,100,0,0;
- break;
- case 3:
- SF_pvpMenu 1,$@kewp_cost1,100,$@kewp_baseLv1-$@kewp_range,$@kewp_baseLv1+$@kewp_range;
- break;
- case 4:
- SF_pvpMenu 2,$@kewp_cost2,100,$@kewp_baseLv2-$@kewp_range,$@kewp_baseLv2+$@kewp_range;
- break;
- case 5:
- SF_pvpMenu 3,$@kewp_cost3,100,$@kewp_baseLv3-$@kewp_range,$@kewp_baseLv3+$@kewp_range;
- break;
- case 6:
- SF_pvpMenu 4,$@kewp_cost4,100,$@kewp_baseLv4-$@kewp_range,$@kewp_baseLv4+$@kewp_range;
- break;
- case 7:
- SF_pvpMenu 5,$@kewp_cost5,100,$@kewp_baseLv5-$@kewp_range,$@kewp_baseLv5+$@kewp_range;
- break;
- case 8:
- SF_pvpMenu 6,$@kewp_cost6,100,$@kewp_baseLv6-$@kewp_range,$@kewp_baseLv6+$@kewp_range;
- break;
- case 9:
- SF_pvpMenu 7,$@kewp_cost7,100,$@kewp_baseLv7-$@kewp_range,$@kewp_baseLv7+$@kewp_range;
- break;
- }
- } while (@kmenu > 1);
- return;
-
-//SubFunction: SF_pvpMenu (int map-group, int cost, int min level, int max level)
-//Displays the list of the five available Pvp rooms to warp to.
-//map-group is the first index of the pvp map names (in pvp_n_2-3.gat it would be 2)
-function SF_pvpMenu {
- if (getarg(4)) {
- if (BaseLevel < getarg(3)) {
- callfunc "F_keIntro", e_sry, "Sorry, you need at least level "+getarg(2)+" to enter these arenas.";
- return;
- }
- if (BaseLevel > getarg(4)) {
- callfunc "F_keIntro", e_bzz, "Sorry, people above level "+getarg(3)+" are not allowed within these arenas.";
- return;
- }
- set @msg$,"levels "+getarg(3)+"-"+getarg(3);
- } else
- set @msg$,"all levels";
- if ($@kewp_showOnline) {
- set @submenu, select(
- "- Cancel Warp (Rooms for "+@msg$+"/"+(getarg(1)*@cost)+"z)",
- "- Room Sandwich ("+getmapusers("pvp_n_"+getarg(0)+"-1.gat")+" "+$@ked_users$+")",
- "- Room Rock On ("+getmapusers("pvp_n_"+getarg(0)+"-2.gat")+" "+$@ked_users$+")",
- "- Four Room ("+getmapusers("pvp_n_"+getarg(0)+"-3.gat")+" "+$@ked_users$+")",
- "- Room Undercross ("+getmapusers("pvp_n_"+getarg(0)+"-4.gat")+" "+$@ked_users$+")",
- "- Room Compass ("+getmapusers("pvp_n_"+getarg(0)+"-5.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel Warp (Rooms for "+@msg$+"/"+(getarg(1)*@cost)+"z)",
- "- Room Sandwich",
- "- Room Rock On",
- "- Four Room",
- "- Room Undercross",
- "- Room Compass"
- );
- }
- switch (@submenu) {
- case 2:
- callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-1.gat",-1,-1;
- break;
- case 3:
- callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-2.gat",-1,-1;
- break;
- case 4:
- callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-3.gat",-1,-1;
- break;
- case 5:
- callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-4.gat",-1,-1;
- break;
- case 6:
- callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-5.gat",-1,-1;
- break;
- }
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Pvp Warping Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers warping to the PvP arenas.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//============================================================
+
+- script keInit_warpPvp -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadWarpPvp";
+ end;
+}
+
+function script F_keWarpPvp {
+
+ function SF_pvpMenu;
+
+ set @cost,callfunc("F_keCost",1,100);
+ if ($@kewp_advanced == 0) {
+ SF_pvpMenu 1,$@kewp_cost,100,0,0;
+ return;
+ }
+
+ do {
+ if ($@kewp_showOnline) {
+ set @kmenu, select(
+ "- Cancel",
+ "- All Levels Rooms ("+($@kewp_cost*@cost)+"z/"+(getmapusers("pvp_n_8-1.gat")+getmapusers("pvp_n_8-2.gat")
+ +getmapusers("pvp_n_8-3.gat")+getmapusers("pvp_n_8-4.gat")+getmapusers("pvp_n_8-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" Rooms ("+($@kewp_cost1*@cost)+"z/"
+ +(getmapusers("pvp_n_1-1.gat")+getmapusers("pvp_n_1-2.gat")+getmapusers("pvp_n_1-3.gat")
+ +getmapusers("pvp_n_1-4.gat")+getmapusers("pvp_n_1-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" Rooms ("+($@kewp_cost2*@cost)+"z/"
+ +(getmapusers("pvp_n_2-1.gat")+getmapusers("pvp_n_2-2.gat")+getmapusers("pvp_n_2-3.gat")
+ +getmapusers("pvp_n_2-4.gat")+getmapusers("pvp_n_2-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" Rooms ("+($@kewp_cost3*@cost)+"z/"
+ +(getmapusers("pvp_n_3-1.gat")+getmapusers("pvp_n_3-2.gat")+getmapusers("pvp_n_3-3.gat")
+ +getmapusers("pvp_n_3-4.gat")+getmapusers("pvp_n_3-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" Rooms ("+($@kewp_cost4*@cost)+"z/"
+ +(getmapusers("pvp_n_4-1.gat")+getmapusers("pvp_n_4-2.gat")+getmapusers("pvp_n_4-3.gat")
+ +getmapusers("pvp_n_4-4.gat")+getmapusers("pvp_n_4-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" Rooms ("+($@kewp_cost5*@cost)+"z/"
+ +(getmapusers("pvp_n_5-1.gat")+getmapusers("pvp_n_5-2.gat")+getmapusers("pvp_n_5-3.gat")
+ +getmapusers("pvp_n_5-4.gat")+getmapusers("pvp_n_5-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" Rooms ("+($@kewp_cost6*@cost)+"z/"
+ +(getmapusers("pvp_n_6-1.gat")+getmapusers("pvp_n_6-2.gat")+getmapusers("pvp_n_6-3.gat")
+ +getmapusers("pvp_n_6-4.gat")+getmapusers("pvp_n_6-5.gat"))+" "+$@ked_users$+")",
+ "- Levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" Rooms ("+($@kewp_cost7*@cost)+"z/"
+ +(getmapusers("pvp_n_7-1.gat")+getmapusers("pvp_n_7-2.gat")+getmapusers("pvp_n_7-3.gat")
+ +getmapusers("pvp_n_7-4.gat")+getmapusers("pvp_n_7-5.gat"))+" "+$@ked_users$+")"
+ );
+ } else {
+ set @kmenu, select(
+ "- Cancel",
+ "- No Level Restriction Rooms ("+($@kewp_cost*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv1-$@kewp_range)+"-"+($@kewp_baseLv1+$@kewp_range)+" Rooms ("+($@kewp_cost1*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv2-$@kewp_range)+"-"+($@kewp_baseLv2+$@kewp_range)+" Rooms ("+($@kewp_cost2*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv3-$@kewp_range)+"-"+($@kewp_baseLv3+$@kewp_range)+" Rooms ("+($@kewp_cost3*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv4-$@kewp_range)+"-"+($@kewp_baseLv4+$@kewp_range)+" Rooms ("+($@kewp_cost4*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv5-$@kewp_range)+"-"+($@kewp_baseLv5+$@kewp_range)+" Rooms ("+($@kewp_cost5*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv6-$@kewp_range)+"-"+($@kewp_baseLv6+$@kewp_range)+" Rooms ("+($@kewp_cost6*@cost)+"z)",
+ "- Levels "+($@kewp_baseLv7-$@kewp_range)+"-"+($@kewp_baseLv7+$@kewp_range)+" Rooms ("+($@kewp_cost7*@cost)+"z)"
+ );
+ }
+ switch(@kmenu) {
+ case 2: //No restrictions
+ SF_pvpMenu 8,$@kewp_cost,100,0,0;
+ break;
+ case 3:
+ SF_pvpMenu 1,$@kewp_cost1,100,$@kewp_baseLv1-$@kewp_range,$@kewp_baseLv1+$@kewp_range;
+ break;
+ case 4:
+ SF_pvpMenu 2,$@kewp_cost2,100,$@kewp_baseLv2-$@kewp_range,$@kewp_baseLv2+$@kewp_range;
+ break;
+ case 5:
+ SF_pvpMenu 3,$@kewp_cost3,100,$@kewp_baseLv3-$@kewp_range,$@kewp_baseLv3+$@kewp_range;
+ break;
+ case 6:
+ SF_pvpMenu 4,$@kewp_cost4,100,$@kewp_baseLv4-$@kewp_range,$@kewp_baseLv4+$@kewp_range;
+ break;
+ case 7:
+ SF_pvpMenu 5,$@kewp_cost5,100,$@kewp_baseLv5-$@kewp_range,$@kewp_baseLv5+$@kewp_range;
+ break;
+ case 8:
+ SF_pvpMenu 6,$@kewp_cost6,100,$@kewp_baseLv6-$@kewp_range,$@kewp_baseLv6+$@kewp_range;
+ break;
+ case 9:
+ SF_pvpMenu 7,$@kewp_cost7,100,$@kewp_baseLv7-$@kewp_range,$@kewp_baseLv7+$@kewp_range;
+ break;
+ }
+ } while (@kmenu > 1);
+ return;
+
+//SubFunction: SF_pvpMenu (int map-group, int cost, int min level, int max level)
+//Displays the list of the five available Pvp rooms to warp to.
+//map-group is the first index of the pvp map names (in pvp_n_2-3.gat it would be 2)
+function SF_pvpMenu {
+ if (getarg(4)) {
+ if (BaseLevel < getarg(3)) {
+ callfunc "F_keIntro", e_sry, "Sorry, you need at least level "+getarg(2)+" to enter these arenas.";
+ return;
+ }
+ if (BaseLevel > getarg(4)) {
+ callfunc "F_keIntro", e_bzz, "Sorry, people above level "+getarg(3)+" are not allowed within these arenas.";
+ return;
+ }
+ set @msg$,"levels "+getarg(3)+"-"+getarg(3);
+ } else
+ set @msg$,"all levels";
+ if ($@kewp_showOnline) {
+ set @submenu, select(
+ "- Cancel Warp (Rooms for "+@msg$+"/"+(getarg(1)*@cost)+"z)",
+ "- Room Sandwich ("+getmapusers("pvp_n_"+getarg(0)+"-1.gat")+" "+$@ked_users$+")",
+ "- Room Rock On ("+getmapusers("pvp_n_"+getarg(0)+"-2.gat")+" "+$@ked_users$+")",
+ "- Four Room ("+getmapusers("pvp_n_"+getarg(0)+"-3.gat")+" "+$@ked_users$+")",
+ "- Room Undercross ("+getmapusers("pvp_n_"+getarg(0)+"-4.gat")+" "+$@ked_users$+")",
+ "- Room Compass ("+getmapusers("pvp_n_"+getarg(0)+"-5.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel Warp (Rooms for "+@msg$+"/"+(getarg(1)*@cost)+"z)",
+ "- Room Sandwich",
+ "- Room Rock On",
+ "- Four Room",
+ "- Room Undercross",
+ "- Room Compass"
+ );
+ }
+ switch (@submenu) {
+ case 2:
+ callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-1.gat",-1,-1;
+ break;
+ case 3:
+ callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-2.gat",-1,-1;
+ break;
+ case 4:
+ callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-3.gat",-1,-1;
+ break;
+ case 5:
+ callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-4.gat",-1,-1;
+ break;
+ case 6:
+ callfunc "F_keWarp",getarg(1),getarg(2),e_com,"pvp_n_"+getarg(0)+"-5.gat",-1,-1;
+ break;
+ }
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt
index 2cef196d8..d1596401a 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_town.txt
@@ -1,500 +1,500 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Warping Town Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+, RO Episode 8+ (Hugel)
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers warp services to towns.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= Flag values used for towns:
-//= 0x00000001 Alberta
-//= 0x00000002 AlDeBaran
-//= 0x00000004 Amatsu
-//= 0x00000008 Ayothaya
-//= 0x00000010 Comodo
-//= 0x00000020 Einbech
-//= 0x00000040 Einbroch
-//= 0x00000080 Geffen
-//= 0x00000100 Gon Ryun
-//= 0x00000200 Hugel
-//= 0x00000400 Izlude
-//= 0x00000800 Jawaii
-//= 0x00001000 LightHalzen
-//= 0x00002000 Lou Yang
-//= 0x00004000 Lutie
-//= 0x00008000 Morocc
-//= 0x00010000 Niflheim
-//= 0x00020000 Payon
-//= 0x00040000 Prontera
-//= 0x00080000 Umbala
-//= 0x00100000 Yuno
-//============================================================
-
-- script keInit_warpTown -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadWarpTown";
- end;
-}
-
-function script F_keWarpTown {
-
- function SF_check;
- function SF_warp;
-
- set @cost,callfunc("F_keCost",$@kewt_cost,$@kewt_discount);
- set @niflcost,callfunc("F_keCost",$@kewt_niflCost,$@kewd_discount);
- if (@cost > Zeny && $@kewt_free)
- set @cost, Zeny;
- do {
- if ($@kewt_showOnline) {
- set @kmenu, select(
- "- Cancel",
- "- Alberta ("+@cost+"z/"+(getmapusers("alberta.gat")+getmapusers("alberta_in.gat"))+" "+$@ked_users$+")",
- "- Al De Baran ("+@cost+"z/"+(getmapusers("aldebaran.gat")+getmapusers("aldeba_in.gat"))+" "+$@ked_users$+")",
- "- Amatsu ("+@cost+"z/"+(getmapusers("amatsu.gat")+getmapusers("ama_in01.gat")+getmapusers("ama_in02.gat"))
- +" "+$@ked_users$+")",
- "- Ayothaya ("+@cost+"z/"+(getmapusers("ayothaya.gat")+getmapusers("ayo_in01.gat")+getmapusers("ayo_in02.gat"))
- +" "+$@ked_users$+")",
- "- Comodo ("+@cost+"z/"+(getmapusers("comodo.gat")+getmapusers("cmd_in01.gat")+getmapusers("cmd_in02.gat"))
- +" "+$@ked_users$+")",
- "- Einbech ("+@cost+"z/"+(getmapusers("einbech.gat"))+" "+$@ked_users$+")",
- "- Einbroch ("+@cost+"z/"+(getmapusers("einbroch.gat")+getmapusers("ein_in01.gat"))+" "+$@ked_users$+")",
- "- Geffen ("+@cost+"z/"+(getmapusers("geffen.gat")+getmapusers("geffen_in.gat")+getmapusers("gef_tower.gat"))
- +" "+$@ked_users$+")",
- "- Gon Ryun ("+@cost+"z/"+(getmapusers("gonryun.gat")+getmapusers("gon_in.gat"))+" "+$@ked_users$+")",
- "- Hugel ("+@cost+"z/"+(getmapusers("hugel.gat")+getmapusers("hu_in01.gat"))+" "+$@ked_users$+")",
- "- Izlude ("+@cost+"z/"+(getmapusers("izlude.gat")+getmapusers("izlude_in.gat"))+" "+$@ked_users$+")",
- "- Jawaii ("+@cost+"z/"+(getmapusers("jawaii.gat")+getmapusers("jawaii_in.gat"))+" "+$@ked_users$+")",
- "- LightHalzen ("+@cost+"z/"+(getmapusers("lighthalzen.gat")+getmapusers("lhz_in01.gat")
- +getmapusers("lhz_in02.gat")+getmapusers("lhz_in03.gat"))+" "+$@ked_users$+")",
- "- Lou Yang ("+@cost+"z/"+(getmapusers("louyang.gat")+getmapusers("lou_in01.gat")+getmapusers("lou_in02.gat"))
- +" "+$@ked_users$+")",
- "- Lutie ("+@cost+"z/"+(getmapusers("xmas.gat")+getmapusers("xmas_in.gat"))+" "+$@ked_users$+")",
- "- Morocc ("+@cost+"z/"+(getmapusers("morocc.gat")+getmapusers("morocc_in.gat")+getmapusers("moc_castle.gat"))
- +" "+$@ked_users$+")",
- "- Niflheim ("+@niflcost+"z/"+(getmapusers("niflheim.gat")+getmapusers("nif_in.gat"))+" "+$@ked_users$+")",
- "- Payon ("+@cost+"z/"+(getmapusers("payon.gat")+getmapusers("payon_in01.gat")+getmapusers("payon_in02.gat"))
- +" "+$@ked_users$+")",
- "- Prontera ("+@cost+"z/"+(getmapusers("prontera.gat")+getmapusers("prt_castle.gat")
- +getmapusers("prt_church.gat")+getmapusers("prt_in.gat"))+" "+$@ked_users$+")",
- "- Umbala ("+@cost+"z/"+(getmapusers("umbala.gat")+getmapusers("um_in.gat"))+" "+$@ked_users$+")",
- "- Yuno ("+@cost+"z/"+(getmapusers("yuno.gat")+getmapusers("yuno_in01.gat")+getmapusers("yuno_in02.gat")
- +getmapusers("yuno_in03.gat")+getmapusers("yuno_in04.gat")+getmapusers("yuno_in05.gat"))+" "+$@ked_users$+")"
- );
- } else {
- set @kmenu, select(
- "- Cancel",
- "- Alberta ("+@cost+"z)",
- "- Al De Baran ("+@cost+"z)",
- "- Amatsu ("+@cost+"z)",
- "- Ayothaya ("+@cost+"z)",
- "- Comodo ("+@cost+"z)",
- "- Einbech ("+@cost+"z)",
- "- Einbroch ("+@cost+"z)",
- "- Geffen ("+@cost+"z)",
- "- Gon Ryun ("+@cost+"z)",
- "- Hugel ("+@cost+"z)",
- "- Izlude ("+@cost+"z)",
- "- Jawaii ("+@cost+"z)",
- "- LightHalzen ("+@cost+"z)",
- "- Lou Yang ("+@cost+"z)",
- "- Lutie ("+@cost+"z)",
- "- Morocc ("+@cost+"z)",
- "- Niflheim ("+@niflcost+"z)",
- "- Payon ("+@cost+"z)",
- "- Prontera ("+@cost+"z)",
- "- Umbala ("+@cost+"z)",
- "- Yuno ("+@cost+"z)"
- );
- }
- switch (@kmenu) {
- case 2: //Alberta
- if (SF_check(0x1))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"alberta.gat",117,56;
- break;
- case 3: //AlDeBaran
- if (SF_check(0x2))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"aldebaran.gat",139,124;
- break;
- case 4: //Amatsu
- if (SF_check(0x4))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"amatsu.gat",197,88;
- break;
- case 5: //Ayathoya
- if (SF_check(0x8))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"ayothaya.gat",202,174;
- break;
- case 6: //Comodo
- if (SF_check(0x10))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"comodo.gat",189,150;
- break;
- case 7: //Einbech
- if (SF_check(0x20))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"einbech.gat",137,220;
- break;
- case 8: //Einbroch
- if (SF_check(0x40))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"einbroch.gat",64,199;
- break;
- case 9: //Geffen
- if (SF_check(0x80))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"geffen.gat",120,66;
- break;
- case 10: //GonRyun
- if (SF_check(0x100))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"gonryun.gat",160,180;
- break;
- case 11: //Hugel
- if (SF_check(0x200))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"hugel.gat",96,105;
- break;
- case 12: //Izlude
- if (SF_check(0x400))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"izlude.gat",127,97;
- break;
- case 13: //Jawaii
- if (SF_check(0x800))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"jawaii.gat",214,223;
- break;
- case 14: //LightHalzen
- if (SF_check(0x1000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"lighthalzen.gat",158,92;
- break;
- case 15: //LouYang
- if (SF_check(0x2000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"louyang.gat",218,118;
- break;
- case 16: //Lutie
- if (SF_check(0x4000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"xmas.gat",148,133;
- break;
- case 17: //Morocc
- if (SF_check(0x8000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"morocc.gat",162,91;
- break;
- case 18: //Niflheim
- if (SF_check(0x10000)) {
- if (nif_q_done != 1) {
- mes "...?";
- callfunc "F_keIntro", e_no, "For some reason I can't warp you there!";
- } else
- callfunc "F_keWarp",$@kewt_niflCost,$@kewd_discount,e_yawn,"niflheim.gat",194,185;
- }
- break;
- case 19: //Payon
- if (SF_check(0x20000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"payon.gat",159,181;
- break;
- case 20: //Prontera
- if (SF_check(0x40000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"prontera.gat",156,175;
- break;
- case 21: //Umbala
- if (SF_check(0x80000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"umbala.gat",88,153;
- break;
- case 22: //Yuno
- if (SF_check(0x100000))
- SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"yuno.gat",158,77;
- break;
- }
- } while (@kmenu > 1);
- return;
-
-//SubFunction SF_check(char-flag, account_flag)
-//Checks if the character can warp to that town taking into consideration
-//traveller's mode.
-function SF_check {
- if ($@kewt_travel && !((kewt_travel|#kewt_travel)&getarg(0))) {
- callfunc "F_keIntro", e_sry, "Sorry, but we can only warp you to towns you have saved in at least once.";
- return 0;
- }
- return 1;
-}
-
-//SubFunction SF_warp (int cost, int discount, int emotion, String map, int x, int y)
-//Modded from F_keWarp to allow free warping to towns when not enough zeny.
-function SF_warp {
- set @cost, getarg(0);
- if (@cost > Zeny && $@kewt_free)
- set @cost, Zeny;
- if (!(callfunc("F_keCharge",@cost,getarg(1),1))) {
- callfunc "F_keIntro", e_an, "You don't have enough Zeny...";
- return;
- }
- emotion getarg(2);
- warp getarg(3),getarg(4),getarg(5);
- end;
-}
-
-}
-
-//Invoked when we want to add a map to the list of travelled-to towns
-function script F_keAddTravelTown {
- set @map$, getarg(0);
-// Temporary code to update variables from old format to new.
- if(ketw_alberta) {
- set kewt_travel,kewt_travel|0x1;
- set ketw_alberta,0;
- }
- if(ketw_aldebaran) {
- set kewt_travel,kewt_travel|0x2;
- set ketw_aldebaran,0;
- }
- if(ketw_amatsu) {
- set kewt_travel,kewt_travel|0x4;
- set ketw_amatsu,0;
- }
- if(ketw_ayothaya) {
- set kewt_travel,kewt_travel|0x8;
- set ketw_ayothaya,0;
- }
- if(ketw_comodo) {
- set kewt_travel,kewt_travel|0x10;
- set ketw_comodo,0;
- }
- if(ketw_einbech) {
- set kewt_travel,kewt_travel|0x20;
- set ketw_einbech,0;
- }
- if(ketw_einbroch) {
- set kewt_travel,kewt_travel|0x40;
- set ketw_einbroch,0;
- }
- if(ketw_geffen) {
- set kewt_travel,kewt_travel|0x80;
- set ketw_geffen,0;
- }
- if(ketw_gonryun) {
- set kewt_travel,kewt_travel|0x100;
- set ketw_gonryun,0;
- }
- if(ketw_hugel) {
- set kewt_travel,kewt_travel|0x200;
- set ketw_hugel,0;
- }
- if(ketw_izlude) {
- set kewt_travel,kewt_travel|0x400;
- set ketw_izlude,0;
- }
- if(ketw_jawaii) {
- set kewt_travel,kewt_travel|0x800;
- set ketw_jawaii,0;
- }
- if(ketw_lighthalzen) {
- set kewt_travel,kewt_travel|0x1000;
- set ketw_lighthalzen,0;
- }
- if(ketw_louyang) {
- set kewt_travel,kewt_travel|0x2000;
- set ketw_louyang,0;
- }
- if(ketw_lutie) {
- set kewt_travel,kewt_travel|0x4000;
- set ketw_lutie,0;
- }
- if(ketw_morroc) {
- set kewt_travel,kewt_travel|0x8000;
- set ketw_morroc,0;
- }
- if(ketw_niflheim) {
- set kewt_travel,kewt_travel|0x10000;
- set ketw_niflheim,0;
- }
- if(ketw_payon) {
- set kewt_travel,kewt_travel|0x20000;
- set ketw_payon,0;
- }
- if(ketw_prontera) {
- set kewt_travel,kewt_travel|0x40000;
- set ketw_prontera,0;
- }
- if(ketw_umbala) {
- set kewt_travel,kewt_travel|0x80000;
- set ketw_umbala,0;
- }
- if(ketw_yuno) {
- set kewt_travel,kewt_travel|0x100000;
- set ketw_yuno,0;
- }
-
- if(#ketw_alberta) {
- set #kewt_travel,#kewt_travel|0x1;
- set #ketw_alberta,0;
- }
- if(#ketw_aldebaran) {
- set #kewt_travel,#kewt_travel|0x2;
- set #ketw_aldebaran,0;
- }
- if(#ketw_amatsu) {
- set #kewt_travel,#kewt_travel|0x4;
- set #ketw_amatsu,0;
- }
- if(#ketw_ayothaya) {
- set #kewt_travel,#kewt_travel|0x8;
- set #ketw_ayothaya,0;
- }
- if(#ketw_comodo) {
- set #kewt_travel,#kewt_travel|0x10;
- set #ketw_comodo,0;
- }
- if(#ketw_einbech) {
- set #kewt_travel,#kewt_travel|0x20;
- set #ketw_einbech,0;
- }
- if(#ketw_einbroch) {
- set #kewt_travel,#kewt_travel|0x40;
- set #ketw_einbroch,0;
- }
- if(#ketw_geffen) {
- set #kewt_travel,#kewt_travel|0x80;
- set #ketw_geffen,0;
- }
- if(#ketw_gonryun) {
- set #kewt_travel,#kewt_travel|0x100;
- set #ketw_gonryun,0;
- }
- if(#ketw_hugel) {
- set #kewt_travel,#kewt_travel|0x200;
- set #ketw_hugel,0;
- }
- if(#ketw_izlude) {
- set #kewt_travel,#kewt_travel|0x400;
- set #ketw_izlude,0;
- }
- if(#ketw_jawaii) {
- set #kewt_travel,#kewt_travel|0x800;
- set #ketw_jawaii,0;
- }
- if(#ketw_lighthalzen) {
- set #kewt_travel,#kewt_travel|0x1000;
- set #ketw_lighthalzen,0;
- }
- if(#ketw_louyang) {
- set #kewt_travel,#kewt_travel|0x2000;
- set #ketw_louyang,0;
- }
- if(#ketw_lutie) {
- set #kewt_travel,#kewt_travel|0x4000;
- set #ketw_lutie,0;
- }
- if(#ketw_morroc) {
- set #kewt_travel,#kewt_travel|0x8000;
- set #ketw_morroc,0;
- }
- if(#ketw_niflheim) {
- set #kewt_travel,#kewt_travel|0x10000;
- set #ketw_niflheim,0;
- }
- if(#ketw_payon) {
- set #kewt_travel,#kewt_travel|0x20000;
- set #ketw_payon,0;
- }
- if(#ketw_prontera) {
- set #kewt_travel,#kewt_travel|0x40000;
- set #ketw_prontera,0;
- }
- if(#ketw_umbala) {
- set #kewt_travel,#kewt_travel|0x80000;
- set #ketw_umbala,0;
- }
- if(#ketw_yuno) {
- set #kewt_travel,#kewt_travel|0x100000;
- set #ketw_yuno,0;
- }
-// End update code.
-
- if ($@kewt_travel > 1) {
- if (@map$ == "alberta.gat" || kewt_travel&0x1)
- set #kewt_travel,#kewt_travel|0x1;
- if (@map$ == "aldebaran.gat" || kewt_travel&0x2)
- set #kewt_travel,#kewt_travel|0x2;
- if (@map$ == "amatsu.gat" || kewt_travel&0x4)
- set #kewt_travel,#kewt_travel|0x4;
- if (@map$ == "ayothaya.gat" || kewt_travel&0x8)
- set #kewt_travel,#kewt_travel|0x8;
- if (@map$ == "comodo.gat" || kewt_travel&0x10)
- set #kewt_travel,#kewt_travel|0x10;
- if (@map$ == "einbech.gat" || kewt_travel&0x20)
- set #kewt_travel,#kewt_travel|0x20;
- if (@map$ == "einbroch.gat" || kewt_travel&0x40)
- set #kewt_travel,#kewt_travel|0x40;
- if (@map$ == "geffen.gat" || kewt_travel&0x80)
- set #kewt_travel,#kewt_travel|0x80;
- if (@map$ == "gonryun.gat" || kewt_travel&0x100)
- set #kewt_travel,#kewt_travel|0x100;
- if (@map$ == "hugel.gat" || kewt_travel&0x200)
- set #kewt_travel,#kewt_travel|0x200;
- if (@map$ == "izlude.gat" || kewt_travel&0x400)
- set #kewt_travel,#kewt_travel|0x400;
- if (@map$ == "jawaii.gat" || kewt_travel&0x800)
- set #kewt_travel,#kewt_travel|0x800;
- if (@map$ == "lighthalzen.gat" || kewt_travel&1000)
- set #kewt_travel,#kewt_travel|0x1000;
- if (@map$ == "louyang.gat" || kewt_travel&0x2000)
- set #kewt_travel,#kewt_travel|0x2000;
- if (@map$ == "xmas.gat" || kewt_travel&0x4000)
- set #kewt_travel,#kewt_travel|0x4000;
- if (@map$ == "morocc.gat" || kewt_travel&0x8000)
- set #kewt_travel,#kewt_travel|0x8000;
- if (@map$ == "niflheim.gat" || kewt_travel&0x10000)
- set #kewt_travel,#kewt_travel|0x10000;
- if (@map$ == "payon.gat" || kewt_travel&0x20000)
- set #kewt_travel,#kewt_travel|0x20000;
- if (@map$ == "prontera.gat" || kewt_travel&0x40000)
- set #kewt_travel,#kewt_travel|0x40000;
- if (@map$ == "umbala.gat" || kewt_travel&0x80000)
- set #kewt_travel,#kewt_travel|0x80000;
- if (@map$ == "yuno.gat" || kewt_travel&0x100000)
- set #kewt_travel,#kewt_travel|0x100000;
- } else {
- if (@map$ == "alberta.gat")
- set kewt_travel,kewt_travel|0x1;
- if (@map$ == "aldebaran.gat")
- set kewt_travel,kewt_travel|0x2;
- if (@map$ == "amatsu.gat")
- set kewt_travel,kewt_travel|0x4;
- if (@map$ == "ayothaya.gat")
- set kewt_travel,kewt_travel|0x8;
- if (@map$ == "comodo.gat")
- set kewt_travel,kewt_travel|0x10;
- if (@map$ == "einbech.gat")
- set kewt_travel,kewt_travel|0x20;
- if (@map$ == "einbroch.gat")
- set kewt_travel,kewt_travel|0x40;
- if (@map$ == "geffen.gat")
- set kewt_travel,kewt_travel|0x80;
- if (@map$ == "gonryun.gat")
- set kewt_travel,kewt_travel|0x100;
- if (@map$ == "hugel.gat")
- set kewt_travel,kewt_travel|0x200;
- if (@map$ == "izlude.gat")
- set kewt_travel,kewt_travel|0x400;
- if (@map$ == "jawaii.gat")
- set kewt_travel,kewt_travel|0x800;
- if (@map$ == "lighthalzen.gat")
- set kewt_travel,kewt_travel|0x1000;
- if (@map$ == "louyang.gat")
- set kewt_travel,kewt_travel|0x2000;
- if (@map$ == "xmas.gat")
- set kewt_travel,kewt_travel|0x4000;
- if (@map$ == "morocc.gat")
- set kewt_travel,kewt_travel|0x8000;
- if (@map$ == "niflheim.gat")
- set kewt_travel,kewt_travel|0x10000;
- if (@map$ == "payon.gat")
- set kewt_travel,kewt_travel|0x20000;
- if (@map$ == "prontera.gat")
- set kewt_travel,kewt_travel|0x40000;
- if (@map$ == "umbala.gat")
- set kewt_travel,kewt_travel|0x80000;
- if (@map$ == "yuno.gat")
- set kewt_travel,kewt_travel|0x100000;
- }
- return;
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Warping Town Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+, RO Episode 8+ (Hugel)
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers warp services to towns.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= Flag values used for towns:
+//= 0x00000001 Alberta
+//= 0x00000002 AlDeBaran
+//= 0x00000004 Amatsu
+//= 0x00000008 Ayothaya
+//= 0x00000010 Comodo
+//= 0x00000020 Einbech
+//= 0x00000040 Einbroch
+//= 0x00000080 Geffen
+//= 0x00000100 Gon Ryun
+//= 0x00000200 Hugel
+//= 0x00000400 Izlude
+//= 0x00000800 Jawaii
+//= 0x00001000 LightHalzen
+//= 0x00002000 Lou Yang
+//= 0x00004000 Lutie
+//= 0x00008000 Morocc
+//= 0x00010000 Niflheim
+//= 0x00020000 Payon
+//= 0x00040000 Prontera
+//= 0x00080000 Umbala
+//= 0x00100000 Yuno
+//============================================================
+
+- script keInit_warpTown -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadWarpTown";
+ end;
+}
+
+function script F_keWarpTown {
+
+ function SF_check;
+ function SF_warp;
+
+ set @cost,callfunc("F_keCost",$@kewt_cost,$@kewt_discount);
+ set @niflcost,callfunc("F_keCost",$@kewt_niflCost,$@kewd_discount);
+ if (@cost > Zeny && $@kewt_free)
+ set @cost, Zeny;
+ do {
+ if ($@kewt_showOnline) {
+ set @kmenu, select(
+ "- Cancel",
+ "- Alberta ("+@cost+"z/"+(getmapusers("alberta.gat")+getmapusers("alberta_in.gat"))+" "+$@ked_users$+")",
+ "- Al De Baran ("+@cost+"z/"+(getmapusers("aldebaran.gat")+getmapusers("aldeba_in.gat"))+" "+$@ked_users$+")",
+ "- Amatsu ("+@cost+"z/"+(getmapusers("amatsu.gat")+getmapusers("ama_in01.gat")+getmapusers("ama_in02.gat"))
+ +" "+$@ked_users$+")",
+ "- Ayothaya ("+@cost+"z/"+(getmapusers("ayothaya.gat")+getmapusers("ayo_in01.gat")+getmapusers("ayo_in02.gat"))
+ +" "+$@ked_users$+")",
+ "- Comodo ("+@cost+"z/"+(getmapusers("comodo.gat")+getmapusers("cmd_in01.gat")+getmapusers("cmd_in02.gat"))
+ +" "+$@ked_users$+")",
+ "- Einbech ("+@cost+"z/"+(getmapusers("einbech.gat"))+" "+$@ked_users$+")",
+ "- Einbroch ("+@cost+"z/"+(getmapusers("einbroch.gat")+getmapusers("ein_in01.gat"))+" "+$@ked_users$+")",
+ "- Geffen ("+@cost+"z/"+(getmapusers("geffen.gat")+getmapusers("geffen_in.gat")+getmapusers("gef_tower.gat"))
+ +" "+$@ked_users$+")",
+ "- Gon Ryun ("+@cost+"z/"+(getmapusers("gonryun.gat")+getmapusers("gon_in.gat"))+" "+$@ked_users$+")",
+ "- Hugel ("+@cost+"z/"+(getmapusers("hugel.gat")+getmapusers("hu_in01.gat"))+" "+$@ked_users$+")",
+ "- Izlude ("+@cost+"z/"+(getmapusers("izlude.gat")+getmapusers("izlude_in.gat"))+" "+$@ked_users$+")",
+ "- Jawaii ("+@cost+"z/"+(getmapusers("jawaii.gat")+getmapusers("jawaii_in.gat"))+" "+$@ked_users$+")",
+ "- LightHalzen ("+@cost+"z/"+(getmapusers("lighthalzen.gat")+getmapusers("lhz_in01.gat")
+ +getmapusers("lhz_in02.gat")+getmapusers("lhz_in03.gat"))+" "+$@ked_users$+")",
+ "- Lou Yang ("+@cost+"z/"+(getmapusers("louyang.gat")+getmapusers("lou_in01.gat")+getmapusers("lou_in02.gat"))
+ +" "+$@ked_users$+")",
+ "- Lutie ("+@cost+"z/"+(getmapusers("xmas.gat")+getmapusers("xmas_in.gat"))+" "+$@ked_users$+")",
+ "- Morocc ("+@cost+"z/"+(getmapusers("morocc.gat")+getmapusers("morocc_in.gat")+getmapusers("moc_castle.gat"))
+ +" "+$@ked_users$+")",
+ "- Niflheim ("+@niflcost+"z/"+(getmapusers("niflheim.gat")+getmapusers("nif_in.gat"))+" "+$@ked_users$+")",
+ "- Payon ("+@cost+"z/"+(getmapusers("payon.gat")+getmapusers("payon_in01.gat")+getmapusers("payon_in02.gat"))
+ +" "+$@ked_users$+")",
+ "- Prontera ("+@cost+"z/"+(getmapusers("prontera.gat")+getmapusers("prt_castle.gat")
+ +getmapusers("prt_church.gat")+getmapusers("prt_in.gat"))+" "+$@ked_users$+")",
+ "- Umbala ("+@cost+"z/"+(getmapusers("umbala.gat")+getmapusers("um_in.gat"))+" "+$@ked_users$+")",
+ "- Yuno ("+@cost+"z/"+(getmapusers("yuno.gat")+getmapusers("yuno_in01.gat")+getmapusers("yuno_in02.gat")
+ +getmapusers("yuno_in03.gat")+getmapusers("yuno_in04.gat")+getmapusers("yuno_in05.gat"))+" "+$@ked_users$+")"
+ );
+ } else {
+ set @kmenu, select(
+ "- Cancel",
+ "- Alberta ("+@cost+"z)",
+ "- Al De Baran ("+@cost+"z)",
+ "- Amatsu ("+@cost+"z)",
+ "- Ayothaya ("+@cost+"z)",
+ "- Comodo ("+@cost+"z)",
+ "- Einbech ("+@cost+"z)",
+ "- Einbroch ("+@cost+"z)",
+ "- Geffen ("+@cost+"z)",
+ "- Gon Ryun ("+@cost+"z)",
+ "- Hugel ("+@cost+"z)",
+ "- Izlude ("+@cost+"z)",
+ "- Jawaii ("+@cost+"z)",
+ "- LightHalzen ("+@cost+"z)",
+ "- Lou Yang ("+@cost+"z)",
+ "- Lutie ("+@cost+"z)",
+ "- Morocc ("+@cost+"z)",
+ "- Niflheim ("+@niflcost+"z)",
+ "- Payon ("+@cost+"z)",
+ "- Prontera ("+@cost+"z)",
+ "- Umbala ("+@cost+"z)",
+ "- Yuno ("+@cost+"z)"
+ );
+ }
+ switch (@kmenu) {
+ case 2: //Alberta
+ if (SF_check(0x1))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"alberta.gat",117,56;
+ break;
+ case 3: //AlDeBaran
+ if (SF_check(0x2))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"aldebaran.gat",139,124;
+ break;
+ case 4: //Amatsu
+ if (SF_check(0x4))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"amatsu.gat",197,88;
+ break;
+ case 5: //Ayathoya
+ if (SF_check(0x8))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"ayothaya.gat",202,174;
+ break;
+ case 6: //Comodo
+ if (SF_check(0x10))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"comodo.gat",189,150;
+ break;
+ case 7: //Einbech
+ if (SF_check(0x20))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"einbech.gat",137,220;
+ break;
+ case 8: //Einbroch
+ if (SF_check(0x40))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"einbroch.gat",64,199;
+ break;
+ case 9: //Geffen
+ if (SF_check(0x80))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"geffen.gat",120,66;
+ break;
+ case 10: //GonRyun
+ if (SF_check(0x100))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"gonryun.gat",160,180;
+ break;
+ case 11: //Hugel
+ if (SF_check(0x200))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"hugel.gat",96,105;
+ break;
+ case 12: //Izlude
+ if (SF_check(0x400))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"izlude.gat",127,97;
+ break;
+ case 13: //Jawaii
+ if (SF_check(0x800))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"jawaii.gat",214,223;
+ break;
+ case 14: //LightHalzen
+ if (SF_check(0x1000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"lighthalzen.gat",158,92;
+ break;
+ case 15: //LouYang
+ if (SF_check(0x2000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"louyang.gat",218,118;
+ break;
+ case 16: //Lutie
+ if (SF_check(0x4000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"xmas.gat",148,133;
+ break;
+ case 17: //Morocc
+ if (SF_check(0x8000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"morocc.gat",162,91;
+ break;
+ case 18: //Niflheim
+ if (SF_check(0x10000)) {
+ if (nif_q_done != 1) {
+ mes "...?";
+ callfunc "F_keIntro", e_no, "For some reason I can't warp you there!";
+ } else
+ callfunc "F_keWarp",$@kewt_niflCost,$@kewd_discount,e_yawn,"niflheim.gat",194,185;
+ }
+ break;
+ case 19: //Payon
+ if (SF_check(0x20000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"payon.gat",159,181;
+ break;
+ case 20: //Prontera
+ if (SF_check(0x40000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"prontera.gat",156,175;
+ break;
+ case 21: //Umbala
+ if (SF_check(0x80000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"umbala.gat",88,153;
+ break;
+ case 22: //Yuno
+ if (SF_check(0x100000))
+ SF_warp $@kewt_cost,$@kewt_discount,e_yawn,"yuno.gat",158,77;
+ break;
+ }
+ } while (@kmenu > 1);
+ return;
+
+//SubFunction SF_check(char-flag, account_flag)
+//Checks if the character can warp to that town taking into consideration
+//traveller's mode.
+function SF_check {
+ if ($@kewt_travel && !((kewt_travel|#kewt_travel)&getarg(0))) {
+ callfunc "F_keIntro", e_sry, "Sorry, but we can only warp you to towns you have saved in at least once.";
+ return 0;
+ }
+ return 1;
+}
+
+//SubFunction SF_warp (int cost, int discount, int emotion, String map, int x, int y)
+//Modded from F_keWarp to allow free warping to towns when not enough zeny.
+function SF_warp {
+ set @cost, getarg(0);
+ if (@cost > Zeny && $@kewt_free)
+ set @cost, Zeny;
+ if (!(callfunc("F_keCharge",@cost,getarg(1),1))) {
+ callfunc "F_keIntro", e_an, "You don't have enough Zeny...";
+ return;
+ }
+ emotion getarg(2);
+ warp getarg(3),getarg(4),getarg(5);
+ end;
+}
+
+}
+
+//Invoked when we want to add a map to the list of travelled-to towns
+function script F_keAddTravelTown {
+ set @map$, getarg(0);
+// Temporary code to update variables from old format to new.
+ if(ketw_alberta) {
+ set kewt_travel,kewt_travel|0x1;
+ set ketw_alberta,0;
+ }
+ if(ketw_aldebaran) {
+ set kewt_travel,kewt_travel|0x2;
+ set ketw_aldebaran,0;
+ }
+ if(ketw_amatsu) {
+ set kewt_travel,kewt_travel|0x4;
+ set ketw_amatsu,0;
+ }
+ if(ketw_ayothaya) {
+ set kewt_travel,kewt_travel|0x8;
+ set ketw_ayothaya,0;
+ }
+ if(ketw_comodo) {
+ set kewt_travel,kewt_travel|0x10;
+ set ketw_comodo,0;
+ }
+ if(ketw_einbech) {
+ set kewt_travel,kewt_travel|0x20;
+ set ketw_einbech,0;
+ }
+ if(ketw_einbroch) {
+ set kewt_travel,kewt_travel|0x40;
+ set ketw_einbroch,0;
+ }
+ if(ketw_geffen) {
+ set kewt_travel,kewt_travel|0x80;
+ set ketw_geffen,0;
+ }
+ if(ketw_gonryun) {
+ set kewt_travel,kewt_travel|0x100;
+ set ketw_gonryun,0;
+ }
+ if(ketw_hugel) {
+ set kewt_travel,kewt_travel|0x200;
+ set ketw_hugel,0;
+ }
+ if(ketw_izlude) {
+ set kewt_travel,kewt_travel|0x400;
+ set ketw_izlude,0;
+ }
+ if(ketw_jawaii) {
+ set kewt_travel,kewt_travel|0x800;
+ set ketw_jawaii,0;
+ }
+ if(ketw_lighthalzen) {
+ set kewt_travel,kewt_travel|0x1000;
+ set ketw_lighthalzen,0;
+ }
+ if(ketw_louyang) {
+ set kewt_travel,kewt_travel|0x2000;
+ set ketw_louyang,0;
+ }
+ if(ketw_lutie) {
+ set kewt_travel,kewt_travel|0x4000;
+ set ketw_lutie,0;
+ }
+ if(ketw_morroc) {
+ set kewt_travel,kewt_travel|0x8000;
+ set ketw_morroc,0;
+ }
+ if(ketw_niflheim) {
+ set kewt_travel,kewt_travel|0x10000;
+ set ketw_niflheim,0;
+ }
+ if(ketw_payon) {
+ set kewt_travel,kewt_travel|0x20000;
+ set ketw_payon,0;
+ }
+ if(ketw_prontera) {
+ set kewt_travel,kewt_travel|0x40000;
+ set ketw_prontera,0;
+ }
+ if(ketw_umbala) {
+ set kewt_travel,kewt_travel|0x80000;
+ set ketw_umbala,0;
+ }
+ if(ketw_yuno) {
+ set kewt_travel,kewt_travel|0x100000;
+ set ketw_yuno,0;
+ }
+
+ if(#ketw_alberta) {
+ set #kewt_travel,#kewt_travel|0x1;
+ set #ketw_alberta,0;
+ }
+ if(#ketw_aldebaran) {
+ set #kewt_travel,#kewt_travel|0x2;
+ set #ketw_aldebaran,0;
+ }
+ if(#ketw_amatsu) {
+ set #kewt_travel,#kewt_travel|0x4;
+ set #ketw_amatsu,0;
+ }
+ if(#ketw_ayothaya) {
+ set #kewt_travel,#kewt_travel|0x8;
+ set #ketw_ayothaya,0;
+ }
+ if(#ketw_comodo) {
+ set #kewt_travel,#kewt_travel|0x10;
+ set #ketw_comodo,0;
+ }
+ if(#ketw_einbech) {
+ set #kewt_travel,#kewt_travel|0x20;
+ set #ketw_einbech,0;
+ }
+ if(#ketw_einbroch) {
+ set #kewt_travel,#kewt_travel|0x40;
+ set #ketw_einbroch,0;
+ }
+ if(#ketw_geffen) {
+ set #kewt_travel,#kewt_travel|0x80;
+ set #ketw_geffen,0;
+ }
+ if(#ketw_gonryun) {
+ set #kewt_travel,#kewt_travel|0x100;
+ set #ketw_gonryun,0;
+ }
+ if(#ketw_hugel) {
+ set #kewt_travel,#kewt_travel|0x200;
+ set #ketw_hugel,0;
+ }
+ if(#ketw_izlude) {
+ set #kewt_travel,#kewt_travel|0x400;
+ set #ketw_izlude,0;
+ }
+ if(#ketw_jawaii) {
+ set #kewt_travel,#kewt_travel|0x800;
+ set #ketw_jawaii,0;
+ }
+ if(#ketw_lighthalzen) {
+ set #kewt_travel,#kewt_travel|0x1000;
+ set #ketw_lighthalzen,0;
+ }
+ if(#ketw_louyang) {
+ set #kewt_travel,#kewt_travel|0x2000;
+ set #ketw_louyang,0;
+ }
+ if(#ketw_lutie) {
+ set #kewt_travel,#kewt_travel|0x4000;
+ set #ketw_lutie,0;
+ }
+ if(#ketw_morroc) {
+ set #kewt_travel,#kewt_travel|0x8000;
+ set #ketw_morroc,0;
+ }
+ if(#ketw_niflheim) {
+ set #kewt_travel,#kewt_travel|0x10000;
+ set #ketw_niflheim,0;
+ }
+ if(#ketw_payon) {
+ set #kewt_travel,#kewt_travel|0x20000;
+ set #ketw_payon,0;
+ }
+ if(#ketw_prontera) {
+ set #kewt_travel,#kewt_travel|0x40000;
+ set #ketw_prontera,0;
+ }
+ if(#ketw_umbala) {
+ set #kewt_travel,#kewt_travel|0x80000;
+ set #ketw_umbala,0;
+ }
+ if(#ketw_yuno) {
+ set #kewt_travel,#kewt_travel|0x100000;
+ set #ketw_yuno,0;
+ }
+// End update code.
+
+ if ($@kewt_travel > 1) {
+ if (@map$ == "alberta.gat" || kewt_travel&0x1)
+ set #kewt_travel,#kewt_travel|0x1;
+ if (@map$ == "aldebaran.gat" || kewt_travel&0x2)
+ set #kewt_travel,#kewt_travel|0x2;
+ if (@map$ == "amatsu.gat" || kewt_travel&0x4)
+ set #kewt_travel,#kewt_travel|0x4;
+ if (@map$ == "ayothaya.gat" || kewt_travel&0x8)
+ set #kewt_travel,#kewt_travel|0x8;
+ if (@map$ == "comodo.gat" || kewt_travel&0x10)
+ set #kewt_travel,#kewt_travel|0x10;
+ if (@map$ == "einbech.gat" || kewt_travel&0x20)
+ set #kewt_travel,#kewt_travel|0x20;
+ if (@map$ == "einbroch.gat" || kewt_travel&0x40)
+ set #kewt_travel,#kewt_travel|0x40;
+ if (@map$ == "geffen.gat" || kewt_travel&0x80)
+ set #kewt_travel,#kewt_travel|0x80;
+ if (@map$ == "gonryun.gat" || kewt_travel&0x100)
+ set #kewt_travel,#kewt_travel|0x100;
+ if (@map$ == "hugel.gat" || kewt_travel&0x200)
+ set #kewt_travel,#kewt_travel|0x200;
+ if (@map$ == "izlude.gat" || kewt_travel&0x400)
+ set #kewt_travel,#kewt_travel|0x400;
+ if (@map$ == "jawaii.gat" || kewt_travel&0x800)
+ set #kewt_travel,#kewt_travel|0x800;
+ if (@map$ == "lighthalzen.gat" || kewt_travel&1000)
+ set #kewt_travel,#kewt_travel|0x1000;
+ if (@map$ == "louyang.gat" || kewt_travel&0x2000)
+ set #kewt_travel,#kewt_travel|0x2000;
+ if (@map$ == "xmas.gat" || kewt_travel&0x4000)
+ set #kewt_travel,#kewt_travel|0x4000;
+ if (@map$ == "morocc.gat" || kewt_travel&0x8000)
+ set #kewt_travel,#kewt_travel|0x8000;
+ if (@map$ == "niflheim.gat" || kewt_travel&0x10000)
+ set #kewt_travel,#kewt_travel|0x10000;
+ if (@map$ == "payon.gat" || kewt_travel&0x20000)
+ set #kewt_travel,#kewt_travel|0x20000;
+ if (@map$ == "prontera.gat" || kewt_travel&0x40000)
+ set #kewt_travel,#kewt_travel|0x40000;
+ if (@map$ == "umbala.gat" || kewt_travel&0x80000)
+ set #kewt_travel,#kewt_travel|0x80000;
+ if (@map$ == "yuno.gat" || kewt_travel&0x100000)
+ set #kewt_travel,#kewt_travel|0x100000;
+ } else {
+ if (@map$ == "alberta.gat")
+ set kewt_travel,kewt_travel|0x1;
+ if (@map$ == "aldebaran.gat")
+ set kewt_travel,kewt_travel|0x2;
+ if (@map$ == "amatsu.gat")
+ set kewt_travel,kewt_travel|0x4;
+ if (@map$ == "ayothaya.gat")
+ set kewt_travel,kewt_travel|0x8;
+ if (@map$ == "comodo.gat")
+ set kewt_travel,kewt_travel|0x10;
+ if (@map$ == "einbech.gat")
+ set kewt_travel,kewt_travel|0x20;
+ if (@map$ == "einbroch.gat")
+ set kewt_travel,kewt_travel|0x40;
+ if (@map$ == "geffen.gat")
+ set kewt_travel,kewt_travel|0x80;
+ if (@map$ == "gonryun.gat")
+ set kewt_travel,kewt_travel|0x100;
+ if (@map$ == "hugel.gat")
+ set kewt_travel,kewt_travel|0x200;
+ if (@map$ == "izlude.gat")
+ set kewt_travel,kewt_travel|0x400;
+ if (@map$ == "jawaii.gat")
+ set kewt_travel,kewt_travel|0x800;
+ if (@map$ == "lighthalzen.gat")
+ set kewt_travel,kewt_travel|0x1000;
+ if (@map$ == "louyang.gat")
+ set kewt_travel,kewt_travel|0x2000;
+ if (@map$ == "xmas.gat")
+ set kewt_travel,kewt_travel|0x4000;
+ if (@map$ == "morocc.gat")
+ set kewt_travel,kewt_travel|0x8000;
+ if (@map$ == "niflheim.gat")
+ set kewt_travel,kewt_travel|0x10000;
+ if (@map$ == "payon.gat")
+ set kewt_travel,kewt_travel|0x20000;
+ if (@map$ == "prontera.gat")
+ set kewt_travel,kewt_travel|0x40000;
+ if (@map$ == "umbala.gat")
+ set kewt_travel,kewt_travel|0x80000;
+ if (@map$ == "yuno.gat")
+ set kewt_travel,kewt_travel|0x100000;
+ }
+ return;
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt
index 89f536de3..2adce07a0 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_warp_woe.txt
@@ -1,159 +1,159 @@
-//===== eAthena Script =======================================
-//= Kafra Express - WoE Warping Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena SVN R3424+, RO Episode 4.1+ (War of Emperium)
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Offers warping to the War of Emperium grounds.
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= Remove the comment on lines 52,53 and 63 to enable direct G. Dungeon warping
-//============================================================
-
-- script keInit_warpWoe -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadWarpWoe";
- end;
-}
-
-function script F_keWarpWOE {
- if ($@kewg_check && getcharid(2) <= 0) {
- callfunc "F_keIntro", e_srt, "Sorry, these warps are only available to people who belong to a Guild.";
- return;
- }
- if ($@kewg_checkAgit && agitcheck(0) == 0) {
- callfunc "F_keIntro", e_srt, "Sorry, these warps are only enabled during the Guild Wars.";
- return;
- }
-
- function SF_dungeons;
- set @cost, callfunc("F_keCost",100,$@kewg_discount);
-
- do {
- if ($@kewg_showOnline) {
- set @kmenu, select(
- "- Cancel",
- "- Al De Baran Guild ("+($@kewg_alDeBaran*@cost/100)+"z/"+(getmapusers("alde_gld.gat")
- +getmapusers("aldeg_cas01.gat")+getmapusers("aldeg_cas02.gat")+getmapusers("aldeg_cas03.gat")
- +getmapusers("aldeg_cas04.gat")+getmapusers("aldeg_cas05.gat"))+" "+$@ked_users$+")",
- "- Geffen Guild ("+($@kewg_geffen*@cost/100)+"z/"+(getmapusers("gef_fild13.gat")
- +getmapusers("gefg_cas01.gat")+getmapusers("gefg_cas02.gat")+getmapusers("gefg_cas03.gat")
- +getmapusers("gefg_cas04.gat")+getmapusers("gefg_cas05.gat"))+" "+$@ked_users$+")",
- "- Payon Guild ("+($@kewg_payon*@cost/100)+"z/"+(getmapusers("pay_gld.gat")
- +getmapusers("payg_cas01.gat")+getmapusers("payg_cas02.gat")+getmapusers("payg_cas03.gat")
- +getmapusers("payg_cas04.gat")+getmapusers("payg_cas05.gat"))+" "+$@ked_users$+")",
- "- Prontera Guild ("+($@kewg_prontera*@cost/100)+"z/"+(getmapusers("prt_gld.gat")
- +getmapusers("prtg_cas01.gat")+getmapusers("prtg_cas02.gat")+getmapusers("prtg_cas03.gat")
- +getmapusers("prtg_cas04.gat")+getmapusers("prtg_cas05.gat"))+" "+$@ked_users$+")",
-// "- Guild Dungeons ("+(getmapusers("gld_dun01.gat")+getmapusers("gld_dun02.gat")
-// +getmapusers("gld_dun03.gat")+getmapusers("gld_dun04.gat"))+" "+$@ked_users$+")",
- "- See "+$@ked_users$+" distribution"
- );
- } else {
- set @kmenu, select(
- "- Cancel",
- "- Al De Baran Guild ("+($@kewg_alDeBaran*@cost/100)+"z)",
- "- Geffen Guild ("+($@kewg_geffen*@cost/100)+"z)",
- "- Payon Guild ("+($@kewg_payon*@cost/100)+"z)",
- "- Prontera Guild ("+($@kewg_prontera*@cost/100)+"z)"
-// ,"- Guild Dungeons"
- );
- }
- switch (@kmenu) {
- case 2: //Al De Baran
- callfunc "F_keWarp",$@kewg_alDeBaran,$@kewg_discount,44,"alde_gld.gat",153,160;
- break;
- case 3: //Geffen
- callfunc "F_keWarp",$@kewg_geffen,$@kewg_discount,44,"gef_fild13.gat",243,180;
- break;
- case 4: //Payon
- callfunc "F_keWarp",$@kewg_payon,$@kewg_discount,44,"pay_gld.gat",249,177;
- break;
- case 5: //Prontera
- callfunc "F_keWarp",$@kewg_prontera,$@kewg_discount,44,"prt_gld.gat",119,160;
- break;
- case 6: //Guild Dungeons
- SF_dungeons();
- break;
- case 7: //Info
- mes "The current distribution of "+$@ked_users$+" is as follows:";
- next;
- mes "[Al De Baran]";
- mes "- Guild Grounds: "+getmapusers("alde_gld.gat");
- mes "- Castle 1 - Noisyubantian: "+getmapusers("aldeg_cas01.gat");
- mes "- Castle 2 - Hohensyubangawoo: "+getmapusers("aldeg_cas02.gat");
- mes "- Castle 3 - Nyirenverk: "+getmapusers("aldeg_cas03.gat");
- mes "- Castle 4 - Byirtsburi: "+getmapusers("aldeg_cas04.gat");
- mes "- Castle 5 - Rotenburk: "+getmapusers("aldeg_cas05.gat");
- next;
- mes "[Geffen]";
- mes "- Guild Grounds: "+getmapusers("gef_fild13.gat");
- mes "- Castle 1 - Reprion: "+getmapusers("gefg_cas01.gat");
- mes "- Castle 2 - Yolbriger: "+getmapusers("gefg_cas02.gat");
- mes "- Castle 3 - Isinlife: "+getmapusers("gefg_cas03.gat");
- mes "- Castle 4 - Berigel: "+getmapusers("gefg_cas04.gat");
- mes "- Castle 5 - Melsedetsu: "+getmapusers("gefg_cas05.gat");
- next;
- mes "[Payon]";
- mes "- Guild Grounds: "+getmapusers("pay_gld.gat");
- mes "- Castle 1 - Mingting: "+getmapusers("payg_cas01.gat");
- mes "- Castle 2 - Tiantan: "+getmapusers("payg_cas02.gat");
- mes "- Castle 3 - Fuying: "+getmapusers("payg_cas03.gat");
- mes "- Castle 4 - Honglou: "+getmapusers("payg_cas04.gat");
- mes "- Castle 5 - Zhulinxian: "+getmapusers("payg_cas05.gat");
- next;
- mes "[Prontera]";
- mes "- Guild Grounds: "+getmapusers("prt_gld.gat");
- mes "- Castle 1 - Creamhilt: "+getmapusers("prtg_cas01.gat");
- mes "- Castle 2 - Sbanhealt: "+getmapusers("prtg_cas02.gat");
- mes "- Castle 3 - Lazrigees: "+getmapusers("prtg_cas03.gat");
- mes "- Castle 4 - Squagul: "+getmapusers("prtg_cas04.gat");
- mes "- Castle 5 - Guindull: "+getmapusers("prtg_cas05.gat");
- next;
- callfunc "F_keIntro", -1, "";
- break;
- }
- } while (@kmenu > 1);
- return;
-
-function SF_dungeons {
- do {
- if ($@kewg_showOnline) {
- set @submenu, select(
- "- Cancel",
- "- Baldur Dungeon ("+($@kewg_baldur*@cost/100)+"z/"+getmapusers("gld_dun01.gat")+" "+$@ked_users$+")",
- "- Luina Dungeon ("+($@kewg_luina*@cost/100)+"z/"+getmapusers("gld_dun02.gat")+" "+$@ked_users$+")",
- "- Valkyrie Dungeon ("+($@kewg_valkyrie*@cost/100)+"z/"+getmapusers("gld_dun03.gat")+" "+$@ked_users$+")",
- "- Britoniah Dungeon ("+($@kewg_britoniah*@cost/100)+"z/"+getmapusers("gld_dun04.gat")+" "+$@ked_users$+")"
- );
- } else {
- set @submenu, select(
- "- Cancel",
- "- Baldur Dungeon ("+($@kewg_baldur*@cost/100)+"z)",
- "- Luina Dungeon ("+($@kewg_luina*@cost/100)+"z)",
- "- Valkyrie Dungeon ("+($@kewg_valkyrie*@cost/100)+"z)",
- "- Britoniah Dungeon ("+($@kewg_britoniah*@cost/100)+"z)"
- );
- }
- switch (@submenu) {
- case 2: //Baldur
- callfunc "F_keWarp",$@kewg_baldur,$@kewg_discount,44,"gld_dun01.gat",119,18;
- break;
- case 3: //Luina
- callfunc "F_keWarp",$@kewg_luina,$@kewg_discount,44,"gld_dun02.gat",174,113;
- break;
- case 4: //Valkyrie
- callfunc "F_keWarp",$@kewg_valkyrie,$@kewg_discount,44,"gld_dun03.gat",37,34;
- break;
- case 5: //Britoniah
- callfunc "F_keWarp",$@kewg_britoniah,$@kewg_discount,44,"gld_dun04.gat",42,230;
- break;
- }
- } while (@submenu > 1);
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - WoE Warping Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena SVN R3424+, RO Episode 4.1+ (War of Emperium)
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Offers warping to the War of Emperium grounds.
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= Remove the comment on lines 52,53 and 63 to enable direct G. Dungeon warping
+//============================================================
+
+- script keInit_warpWoe -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadWarpWoe";
+ end;
+}
+
+function script F_keWarpWOE {
+ if ($@kewg_check && getcharid(2) <= 0) {
+ callfunc "F_keIntro", e_srt, "Sorry, these warps are only available to people who belong to a Guild.";
+ return;
+ }
+ if ($@kewg_checkAgit && agitcheck(0) == 0) {
+ callfunc "F_keIntro", e_srt, "Sorry, these warps are only enabled during the Guild Wars.";
+ return;
+ }
+
+ function SF_dungeons;
+ set @cost, callfunc("F_keCost",100,$@kewg_discount);
+
+ do {
+ if ($@kewg_showOnline) {
+ set @kmenu, select(
+ "- Cancel",
+ "- Al De Baran Guild ("+($@kewg_alDeBaran*@cost/100)+"z/"+(getmapusers("alde_gld.gat")
+ +getmapusers("aldeg_cas01.gat")+getmapusers("aldeg_cas02.gat")+getmapusers("aldeg_cas03.gat")
+ +getmapusers("aldeg_cas04.gat")+getmapusers("aldeg_cas05.gat"))+" "+$@ked_users$+")",
+ "- Geffen Guild ("+($@kewg_geffen*@cost/100)+"z/"+(getmapusers("gef_fild13.gat")
+ +getmapusers("gefg_cas01.gat")+getmapusers("gefg_cas02.gat")+getmapusers("gefg_cas03.gat")
+ +getmapusers("gefg_cas04.gat")+getmapusers("gefg_cas05.gat"))+" "+$@ked_users$+")",
+ "- Payon Guild ("+($@kewg_payon*@cost/100)+"z/"+(getmapusers("pay_gld.gat")
+ +getmapusers("payg_cas01.gat")+getmapusers("payg_cas02.gat")+getmapusers("payg_cas03.gat")
+ +getmapusers("payg_cas04.gat")+getmapusers("payg_cas05.gat"))+" "+$@ked_users$+")",
+ "- Prontera Guild ("+($@kewg_prontera*@cost/100)+"z/"+(getmapusers("prt_gld.gat")
+ +getmapusers("prtg_cas01.gat")+getmapusers("prtg_cas02.gat")+getmapusers("prtg_cas03.gat")
+ +getmapusers("prtg_cas04.gat")+getmapusers("prtg_cas05.gat"))+" "+$@ked_users$+")",
+// "- Guild Dungeons ("+(getmapusers("gld_dun01.gat")+getmapusers("gld_dun02.gat")
+// +getmapusers("gld_dun03.gat")+getmapusers("gld_dun04.gat"))+" "+$@ked_users$+")",
+ "- See "+$@ked_users$+" distribution"
+ );
+ } else {
+ set @kmenu, select(
+ "- Cancel",
+ "- Al De Baran Guild ("+($@kewg_alDeBaran*@cost/100)+"z)",
+ "- Geffen Guild ("+($@kewg_geffen*@cost/100)+"z)",
+ "- Payon Guild ("+($@kewg_payon*@cost/100)+"z)",
+ "- Prontera Guild ("+($@kewg_prontera*@cost/100)+"z)"
+// ,"- Guild Dungeons"
+ );
+ }
+ switch (@kmenu) {
+ case 2: //Al De Baran
+ callfunc "F_keWarp",$@kewg_alDeBaran,$@kewg_discount,44,"alde_gld.gat",153,160;
+ break;
+ case 3: //Geffen
+ callfunc "F_keWarp",$@kewg_geffen,$@kewg_discount,44,"gef_fild13.gat",243,180;
+ break;
+ case 4: //Payon
+ callfunc "F_keWarp",$@kewg_payon,$@kewg_discount,44,"pay_gld.gat",249,177;
+ break;
+ case 5: //Prontera
+ callfunc "F_keWarp",$@kewg_prontera,$@kewg_discount,44,"prt_gld.gat",119,160;
+ break;
+ case 6: //Guild Dungeons
+ SF_dungeons();
+ break;
+ case 7: //Info
+ mes "The current distribution of "+$@ked_users$+" is as follows:";
+ next;
+ mes "[Al De Baran]";
+ mes "- Guild Grounds: "+getmapusers("alde_gld.gat");
+ mes "- Castle 1 - Noisyubantian: "+getmapusers("aldeg_cas01.gat");
+ mes "- Castle 2 - Hohensyubangawoo: "+getmapusers("aldeg_cas02.gat");
+ mes "- Castle 3 - Nyirenverk: "+getmapusers("aldeg_cas03.gat");
+ mes "- Castle 4 - Byirtsburi: "+getmapusers("aldeg_cas04.gat");
+ mes "- Castle 5 - Rotenburk: "+getmapusers("aldeg_cas05.gat");
+ next;
+ mes "[Geffen]";
+ mes "- Guild Grounds: "+getmapusers("gef_fild13.gat");
+ mes "- Castle 1 - Reprion: "+getmapusers("gefg_cas01.gat");
+ mes "- Castle 2 - Yolbriger: "+getmapusers("gefg_cas02.gat");
+ mes "- Castle 3 - Isinlife: "+getmapusers("gefg_cas03.gat");
+ mes "- Castle 4 - Berigel: "+getmapusers("gefg_cas04.gat");
+ mes "- Castle 5 - Melsedetsu: "+getmapusers("gefg_cas05.gat");
+ next;
+ mes "[Payon]";
+ mes "- Guild Grounds: "+getmapusers("pay_gld.gat");
+ mes "- Castle 1 - Mingting: "+getmapusers("payg_cas01.gat");
+ mes "- Castle 2 - Tiantan: "+getmapusers("payg_cas02.gat");
+ mes "- Castle 3 - Fuying: "+getmapusers("payg_cas03.gat");
+ mes "- Castle 4 - Honglou: "+getmapusers("payg_cas04.gat");
+ mes "- Castle 5 - Zhulinxian: "+getmapusers("payg_cas05.gat");
+ next;
+ mes "[Prontera]";
+ mes "- Guild Grounds: "+getmapusers("prt_gld.gat");
+ mes "- Castle 1 - Creamhilt: "+getmapusers("prtg_cas01.gat");
+ mes "- Castle 2 - Sbanhealt: "+getmapusers("prtg_cas02.gat");
+ mes "- Castle 3 - Lazrigees: "+getmapusers("prtg_cas03.gat");
+ mes "- Castle 4 - Squagul: "+getmapusers("prtg_cas04.gat");
+ mes "- Castle 5 - Guindull: "+getmapusers("prtg_cas05.gat");
+ next;
+ callfunc "F_keIntro", -1, "";
+ break;
+ }
+ } while (@kmenu > 1);
+ return;
+
+function SF_dungeons {
+ do {
+ if ($@kewg_showOnline) {
+ set @submenu, select(
+ "- Cancel",
+ "- Baldur Dungeon ("+($@kewg_baldur*@cost/100)+"z/"+getmapusers("gld_dun01.gat")+" "+$@ked_users$+")",
+ "- Luina Dungeon ("+($@kewg_luina*@cost/100)+"z/"+getmapusers("gld_dun02.gat")+" "+$@ked_users$+")",
+ "- Valkyrie Dungeon ("+($@kewg_valkyrie*@cost/100)+"z/"+getmapusers("gld_dun03.gat")+" "+$@ked_users$+")",
+ "- Britoniah Dungeon ("+($@kewg_britoniah*@cost/100)+"z/"+getmapusers("gld_dun04.gat")+" "+$@ked_users$+")"
+ );
+ } else {
+ set @submenu, select(
+ "- Cancel",
+ "- Baldur Dungeon ("+($@kewg_baldur*@cost/100)+"z)",
+ "- Luina Dungeon ("+($@kewg_luina*@cost/100)+"z)",
+ "- Valkyrie Dungeon ("+($@kewg_valkyrie*@cost/100)+"z)",
+ "- Britoniah Dungeon ("+($@kewg_britoniah*@cost/100)+"z)"
+ );
+ }
+ switch (@submenu) {
+ case 2: //Baldur
+ callfunc "F_keWarp",$@kewg_baldur,$@kewg_discount,44,"gld_dun01.gat",119,18;
+ break;
+ case 3: //Luina
+ callfunc "F_keWarp",$@kewg_luina,$@kewg_discount,44,"gld_dun02.gat",174,113;
+ break;
+ case 4: //Valkyrie
+ callfunc "F_keWarp",$@kewg_valkyrie,$@kewg_discount,44,"gld_dun03.gat",37,34;
+ break;
+ case 5: //Britoniah
+ callfunc "F_keWarp",$@kewg_britoniah,$@kewg_discount,44,"gld_dun04.gat",42,230;
+ break;
+ }
+ } while (@submenu > 1);
+}
+
+}
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/readme.txt b/npc/custom/eAAC_Scripts/kafraExpress/readme.txt
index 8952d1913..d37b025e9 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/readme.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/readme.txt
@@ -1,1170 +1,1170 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Kafra Express Script Package Documentation %
-% - by Skotlex %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-This file's purpose is to give an indepth explanation about setting up, and
-configuring the Kafra Express Script Package (KESP). It is intended to be
-viewed by a text editor using fixed-width font and 80-character long lines.
-
-Document Version v1.9 (15/June/2006)
-////////////////////////////////////////////////////////////////////////////////
-Table of Contents
-////////////////////////////////////////////////////////////////////////////////
-[00] Including the NPC files and menu editing
-[01] Intro to module configuring and general options (config.txt)
-[02] Module: Main Core (ke_main.txt)
-[03] Module: Bank (ke_bank.txt)
-[04] Module: Broadcast (ke_broadcast.txt)
-[05] Module: Stylist (ke_dye.txt)
-[06] Module: Job Changer (ke_jobchange.txt)
-[07] Module: Job Swapper (ke_jobswap.txt)
-[08] Module: Smithery (ke_refine.txt)
-[09] Module: Renting (ke_refine.txt)
-[10] Module: Kafra Shop (ke_shop.txt)
-[11] Module: Stat/Skill Market (ke_statmarket.txt)
-[12] Module: Stat/Skill Resets/Raising (ke_stats.txt)
-[13] Module: Uncarding (ke_uncard.txt)
-[14] Module: Town Warping (ke_warp_town.txt)
-[15] Module: Dungeon Warping (ke_warp_dungeon.txt)
-[16] Module: PvP Warping (ke_warp_pvp.txt)
-[17] Module: WoE Warping (ke_warp_woe.txt)
-[18] The kafras.txt file: About Kafra Definitions
-
-////////////////////////////////////////////////////////////////////////////////
-[00] Including the NPC files and menu editing
-////////////////////////////////////////////////////////////////////////////////
-
-Because of the script's complexity, placing everything in a single file
-is out of the question, therefore the KESP comes bundled in different
-files. Because of the dynamic nature of the script, there are two things
-you need to do in order to enable/disable a particular service:
-
-1. Include the txt file with the corresponding module.
-To include the txt files, you need to know two things: where are the script
-files located, and which is the configuration file where you place the npc
-includes. We'll assume on this guide that you unpacked the KESP in
-npc/custom/kafraExpress. The configuration file for scripts is
-conf/map_athena.conf for eA1.0rc5, and npcs/scripts_custom.txt for current eA
-SVN versions. Add the files you want in the following manner:
-
- npc: npc/custom/kafraExpress/ke_main.txt
- //npc: npc/custom/kafraExpress/ke_rent.txt
-
-The first line is including the file ke_main.,txt, while the following
-excludes ke_rent from being used. Placing the "//" at the beginning of the
-line is known as commenting, and it's a useful way of quickly toggling a
-certain script on/off. The following is the list of all files that come
-bundled in the package:
-
-npc: npc/custom/kafraExpress/kafras.txt
-npc: npc/custom/kafraExpress/config.txt
-npc: npc/custom/kafraExpress/ke_main.txt
-
-npc: npc/custom/kafraExpress/ke_bank.txt
-npc: npc/custom/kafraExpress/ke_broadcast.txt
-npc: npc/custom/kafraExpress/ke_dye.txt
-npc: npc/custom/kafraExpress/ke_jobchange.txt
-npc: npc/custom/kafraExpress/ke_jobswap.txt
-npc: npc/custom/kafraExpress/ke_rent.txt
-npc: npc/custom/kafraExpress/ke_shop.txt
-npc: npc/custom/kafraExpress/ke_statmarket.txt
-npc: npc/custom/kafraExpress/ke_stats.txt
-npc: npc/custom/kafraExpress/ke_refine.txt
-npc: npc/custom/kafraExpress/ke_uncard.txt
-npc: npc/custom/kafraExpress/ke_warp_dungeon.txt
-npc: npc/custom/kafraExpress/ke_warp_pvp.txt
-npc: npc/custom/kafraExpress/ke_warp_town.txt
-npc: npc/custom/kafraExpress/ke_warp_woe.txt
-
-What files can be commented, which files you want to include? On the minimum,
-you need ke_main.txt, kafras.txt and config.txt to have the bare-bones functionality.
-Refer to the table of context to see the relation between files and the
-services they offer.
-
-2. Configure the Menus
-The second part of the configuration is adding/removing the menu entries that
-lead to the specific services. Failure to do this can either A. leave you with
-menu entries that lead to "Function Not found!" errors on the map server, or
-B. Services that were included, but you can't pick because they don't show up
-in the menu. The main file where you should configure the menus is ke_main.txt.
-
-From the main module, ke_main.txt, you must pick which services are available.
-The file contains eight menu sections, which is made up of two pairs of
-identitical menus. The only difference is that the first menu is displayed on
-Kafras placed on towns, while the second menu is for Kafras placed on fields and
-dungeons. The menu roughly looks like this:
-
- menu
- "- Leave",L_END,
- "- Heal Service ("<some code here>"z/10SP)",L_HEAL,
- "- Warp Service",L_WARP,
-// "- Use Storage ("<some code here>"z)",L_STORAGE,
-// "- Use Guild Storage ("<some code here>"z)",L_GUILD_STORAGE,
- "- Job Services",M_JOB,
- "- Other Services",M_OTHER,
- "- Save Respawn point",L_SAVE;
-
-This is the main menu, as you can see the only service unavailable is to use
-the storage. Like in the npc/config file, you can comment the lines of the
-services you do not want.
-
-WARNING: If you need to comment the last option of a menu, remember to replace
-the comma for a semi-colon on the next-to-last option or script parsing errors
-will occur.
-
-The "Warp Service" leads to the second pair of menus you can configure:
-
- menu
- "- Return",-,
- "- Dungeons",L_DUNGEON,
-// "- PvP Arena",L_PVP,
-// "- Guild Wars",L_GUILD_DUNGEON,
- "- Towns",L_TOWN;
- goto M_INIT;
-
-As before, you can comment/uncomment the features you want or not. Likewise,
-the third menu under "Job Services" contains features related to job changing,
-stats/skills and renting. The fourth pair is the "Other Services" menu which
-contains the rest of modules which are probably not going to be used
-frequently.
-
-For your convenience, the following is the list of all the menu options and the file(s) required for it to work:
-
-//Main Menu (under labels M_INIT/MD_INIT)
-
- "- Heal Service" -> ke_main.txt
- "- Warp Service"
- "- Use Storage" -> ke_main.txt
- "- Use Guild Storage" -> ke_main.txt
- "- Job Services"
- "- Other Services"
- "- Save Respawn point" -> ke_main.txt
-
-//Warp Menu (under labels M_WARP/MD_WARP)
-
- "- Dungeons" -> ke_warp_dungeon.txt
- "- PvP Arena" -> ke_warp_pvp.txt
- "- Guild Wars" -> ke_warp_gvg.txt
- "- Towns" -> ke_warp_town.txt
-
-//Job Services Menu (under labels M_JOB/MD_JOB)
-
- "- Change Job" -> ke_jobchange.txt
- "- Swap Job" -> ke_jobswap.txt
- "- Stat/Skill Services" -> ke_stats.txt
- "- Stat/Skill Market" -> ke_statmarket.txt
- "- Rental Service" -> ke_rent.txt
-
-//Other Services Menu (under labels M_OTHER/MD_OTHER)
-
- "- Bank Services" -> ke_bank.txt
- "- Use Kafra Shop" -> ke_shop.txt
- "- Broadcast a message" -> ke_broadcast.txt
- "- Refine Services" -> ke_refine.txt
- "- Uncard Services" -> ke_uncard.txt
- "- Stylist Service" -> ke_dye.txt
- "- Use a Kafra Pass" -> ke_main.txt
-
-////////////////////////////////////////////////////////////////////////////////
-[01] Intro to individual module configuration.
-////////////////////////////////////////////////////////////////////////////////
-
-For portability reasons, the configure options for every module is in the file
-config.txt, which lets you upgrade to future versions without having to
-readjust your settings every time.
-The config file has the options separated per module to make it easier to
-read. There may be bits of code in each section to avoid parsing configure
-options for unneeded variables which should be left alone. In some rare
-occassions variables from one module will be used in a different module (ie:
-Broadcasting PvP messages uses the variables from the pvp module). all variables
-follow the standard "ke<module initials>_variablename", so a variable called
-"kewd_discount" refers to the discount variable in the deep warps module (wd).
-For example, the renting module's configuration segment is:
-
- //-------------------------------------------------------------------------------
- //Config for the Renting Module
- //-------------------------------------------------------------------------------
-OnLoadRent:
- set $@kert_cartOnly, 0; //Set to 1 to enable only cart rental, 0 enables all add-ons.
- set $@kert_cartCost, 2000; //Cost to rent a Cart.
- set $@kert_falconCost, 2000; //Cost to rent a Falcon.
- set $@kert_pecoCost, 2000; //Cost to rent a PecoPeco.
- end;
-
-Variables are usually of two types: Exact value based or Percentage based.
-Exact value variables are often price for different services, while the
-percentage based are things like 30% discount when using Kafra Passes.
-Percentage values are expressed per-hundredth (that is, 10 = 10%, 100 = 100%)
-unless otherwise specified.
-
-Each variable has a small description next to it, hence the need of this
-document. In this document the variable type is identified next to it by: (1)
-when it's boolean, (%) when it's a percentage, ($) when it's a price, (#) for
-numbers and (") for strings.
-
-////////////////////////////////////////////////////////////////////////////////
-[02] Module: Main Core (ke_main.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-This module offers the core functionality of the Kafra Express. Contains the
-main menu and handles the Kafra Pass Reserve Points system.
-
-Variables
-================================================================================
-
-(1) ke_saveOnSpot
------------------
-When 1, a character's respawn point is saved exactly where they are standing.
-otherwise, the respawn point is specified by the kafra definition (see Section
-18).
-
-($) keh_hpCost
-($) keh_spCost
---------------
-The cost of healing sp per every 10 sp. For example, if the cost is 1, it
-costs 100z to heal 1000.
-
-($) kes_cost
-($) kegs_cost
--------------
-The cost of using the storage, guild storage (respectively)
-
-(1) kekp_reset
---------------
-For Kafra Passes. When 1, the Pass expires when starting a chat with the
-Kafra. Otherwise the variable remains active a pretty long time (probably all
-session).
-
-($) kekp_reserveCost
---------------------
-The cost in zeny of reserve points. When using a Kafra Pass many services will
-be cheaper, the amount of zeny saved is "used" to grant the player reserve
-points. For example, if the reserve cost is 100, for every 100z the player
-saves, he'll earn 1 reserve points. Reserve points can be used in scripts, and
-by default is used in the Al De Baran Kafra Headquarters to gain items. Use a
-value of 0 to disable Reserve Point gaining.
-
-(#) kekp_minReserve
-(#) kekp_maxReserve
----------------
-What is the minimum/maximum reserve points the player can gain when using a
-Kafra Pass per transaction? This only applies when the player has saved at
-least 1z.
-
-(") ked_users
--------------
-Certain modules (in particular, the warping ones) have the ability to display
-the number of players related to the function (ie: number of users in a
-dungeon), in such cases this variable is used to display the 'unit' of said
-count. For example, if ked_users is "kids" then the related modules might
-display things like "- Glast Heim (6 kids)".
-
-////////////////////////////////////////////////////////////////////////////////
-[03] Module: Bank (ke_bank.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-This modules enables characters to "store" zeny on a virtual bank account
-which is shared among characters of the same account. There can be deposits,
-withdrawals, which can have transactions fees associated.
-
-It is also possible to establish a monthly maintenance fee that has to be
-payed, when the player does not has enough money in the account to pay this
-fee, they stop gaining interests until they deposit enough to pay it up.
-Finally, all fees charged by the bank can be stored in a server-wide variable
-which may be used by other custom scripts.
-
-Variables
-================================================================================
-
-(%) kebk_depositCost
-(%) kebk_withdrawCost
----------------------
-The Fee in % charged whenever a player does a deposit/withdrawal. For example,
-when a player deposits 100z and the fee is 3%, only 97z are deposited, and 3z
-are charged. Likewise, if a player withdraws 100z when the fee is of 5%,
-they'll withdraw 100z and an additional 5z will be removed from their accounts
-as fee cost.
-
-($) kebk_minTransact
-($) kebk_maxTransact
---------------------
-The minimum/maximum values of a single transaction (deposit or withdrawal)
-
-($) kebk_capacity
------------------
-Indicates what is the bank account capacity for players. That is, what is the
-maximum zeny their account can hold. You can't deposit anymore once the max
-has been reached, and daily interests are lost while maxed.
-
-(%) kebk_dayInterest
---------------------
-The daily interests that the account makes. The value is in 0.01% units, so a
-value of 100 equals 1% daily interests.
-
-($) kebk_monMaintenance
------------------------
-Monthly flat fee charged for maintenance.
-
-(1) kebk_useGlobalBank
-----------------------
-When 1, every fee charged from the player goes into a server variable
-($ke_globalbank), which can then be used by other scripts. is 0 by default
-because none of the Kafra Express modules uses it.
-
-////////////////////////////////////////////////////////////////////////////////
-[04] Module: Broadcast (ke_broadcast.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Provides broadcasting services for players. Broadcasts can be local (current
-map only) or global (server announce), there are also four types of broadcast:
-Requests for a party, PvP Challenge invitations, General Broadcasts (player
-input the string they want to say) and General Anonymous Broadcasts (player
-name is not displayed when doing the broadcast).
-
-Note that the variables from ke_warp_pvp.txt will be used for auto-configuring
-the pvp broadcasts.
-
-Variables:
-================================================================================
-
-(1) kebc_showOnline
--------------------
-When 1, the total count of players will be displayed in the menu (map users
-next to the local broadcast entry, server users next to the global broadcast
-entry).
-
-($) kebc_partyCost
-($) kebc_pvpCost
-($) kebc_cost
-($) kebc_anonCost
-------------------
-Respective base costs for doing Party-Requests/Pvp Challenge/General/Anonymous
-broadcasts.
-
-(%) kebc_globalFactor
----------------------
-When the broadcast is global, the base cost is multipled by this factor. If
-the factor is 500, then global broadcasts cost 5x times the cost of the map's
-broadcast.
-
-(%) kebc_discount
------------------
-Discount on broadcast prices when the Kafra Pass is active.
-
-////////////////////////////////////////////////////////////////////////////////
-[05] Module: Stylist (ke_dye.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Offers cloth dye, hair dye and hair style changes, both by input and by wheel
-browsing. Does not consumes dyestuffs because it is designed for custom dye
-packages.
-
-Variables
-================================================================================
-
-(1) kedy_enableHairstyle
-------------------------
-If one, the menu will include hair-style changing options, otherwise only
-dye-changes are offered
-
-(#) kedy_styles
----------------
-Specifies the number of available hair styles
-
-(#) kedy_hair
--------------
-Specificies the number of hair dyes
-
-(#) kedy_clothJN
-(#) kedy_clothJ1ST
-(#) kedy_clothJ2ND
-(#) kedy_clothJSN
-(#) kedy_clothJWED
-------------------
-Specifies the number of cloth dyes based on job-type: Novices, First Classes,
-Second Classes, Super Novices, Wedding Class.
-
-////////////////////////////////////////////////////////////////////////////////
-[06] Module: Job Changer (ke_jobchange.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Offers job changing, including rebirth and baby classes. The rebirth system
-can allow people free changing through a different path, or forcing the
-correct path. Zeny can be charged/granted as well as weapons on job-change.
-Remaining Skill Points can be wiped, ignored or prevent the change from
-happening. Before changing players can review the consequences of doing so,
-including weapons to gain.
-
-Finally, there's an option that makes it possible to skip the novice class
-altogether and change directly to first jobs.
-
-Variables
-================================================================================
-
-(#) kejc_skillsPolicy
----------------------
-Determines what to do with remaining skill points upon change:
- 0: No job changing until points are used.
- 1: Extra Skill Points are wiped.
- 2: Extra skill points are conserved.
-
-(#) kejc_upperPolicy
---------------------
-What to do about the advanced classes?
- 0: Free for all, players can pick any advanced job regardless of the previous.
- 1: Force mode, classes are auto-selected from the previous path. In the
- case the path could not be determined (players changed jobs previously
- using other npcs), players will be able to select their next job.
-
-(1) kejc_announce
------------------
-When 1, a global announce will be done upon change.
-
-(1) kejc_resetDye
------------------
-If one, the cloth dye is reset upon changing.
-
-(1) kejc_skipNovice
--------------------
-If one, players can skip the novice class and directly into their first job.
-Exploit proof, skills are wiped when changing to a 1st class this way, and
-their basic skill level is set to 9.
-
-(#) kejc_baseSN
----------------
-Base Level required before changing into a Super Novice.
-
-(#) kejc_base2ND
-(#) kejc_job2ND
-(#) kejc_cost2ND
-----------------
-Base level, Job level and zeny required to change into a second job. If the
-cost is below zero, zeny will be given to the player instead of charged.
-
-(#) kejc_baseRebirth
-(#) kejc_jobRebirth
-(#) kejc_costRebirth
---------------------
-Base level, Job level and zeny required before doing a rebirth (change to High
-Novice).
-
-(1) kejc_rebirthReset
----------------------
-If 1, when changing into a HighNovice characters will have their level reset
-to 1 (with the additional 100 stat points)
-
-(1) kejc_weaponPolicy
----------------------
-If 1, characters will get a weapon upon job change. For each first&second
-class there are two weapons to specify, the standard weapon and the "premium"
-one.
-
-(#) kejc_wBonusLv
------------------
-When characters reach this job level, they will receive the premium weapon instead of the normal one. If 0, premium weapons are disabled.
-
-(#) kejc_wAcolyte
-(#) kejc_wArcher
-(#) kejc_wMage
-(#) kejc_wMerchant
-(#) kejc_wSwordman
-(#) kejc_wThief
-(#) kejc_wSuperNovice
-(#) kejc_wPriest
-(#) kejc_wMonk
-(#) kejc_wHunter
-(#) kejc_wBard
-(#) kejc_wDancer
-(#) kejc_wWizard
-(#) kejc_wSage
-(#) kejc_wBlacksmith
-(#) kejc_wAlchemist
-(#) kejc_wKnight
-(#) kejc_wCrusader
-(#) kejc_wAssassin
-(#) kejc_wRogue
------------------------
-ID of the normal weapons received upon job change (if weapon policy is in
-effect).
-
-(#) kejc_w2Priest
-(#) kejc_w2Monk
-(#) kejc_w2Hunter
-(#) kejc_w2Bard
-(#) kejc_w2Dancer
-(#) kejc_w2Wizard
-(#) kejc_w2Sage
-(#) kejc_w2Blacksmith
-(#) kejc_w2Alchemist
-(#) kejc_w2Knight
-(#) kejc_w2Crusader
-(#) kejc_w2Assassin
-(#) kejc_w2Rogue
---------------------
-ID of the premium weapons received upon job chane (if bonus weapon policy is
-in effect). Note that first classes can't get a bonus weapon.
-
-////////////////////////////////////////////////////////////////////////////////
-[07] Module: Job Swapper (ke_jobswap.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Permits characters to change jobs among other jobs of their same "level".
-This is, between first classes or between second classes. It is also possible
-to store the last job used and revert to it at a later date. Dye, Job Level
-and Skill Point count is saved, however the skill-tree is not saved and skills
-need be reallocated. When reverting to the previous class, characters might be
-able to return from an adv class to a normal one, but if they are baby
-classes, they can't change back to a normal one.
-
-Variables
-================================================================================
-
-(1) kejs_SNpolicy
------------------
-Determines what to do with Super Novices. if 0, they can't swap jobs, if 1,
-they are considered first classes.
-
-(#) kejs_revertPolicy
----------------------
-Determines if Reverting classes is possible and when:
- 0: Cannot go back to the previous job.
- 1: Can only go back if the previous job belongs to the same type as the
- first (is also a 1st/2nd job and is the same normal/adv/baby category).
- 2: Can return to the previous job regardless (exception: when one of the
- two jobs is a baby job and the other is not).
-
-(1) kejs_announce
------------------
-If 1 does a server announce when swapping jobs.
-
-($) kejs_revertCost
--------------------
-Cost of changing to the previous job.
-
-(1) kejs_saveDye
-----------------
-If one, the dye is saved when swapping and restored upon revert.
-
-(1) kejs_resetDye
------------------
-If 1 the clothe dye is reset upon swap.
-
-(%) kejs_swapDiscount
-(%) kejs_revertDiscount
------------------------
-Discount % to apply when the kafra pass is active for swapping/reverting.
-
-(#) kejs_job1ST
-(#) kejs_job2ND
----------------
-Minimum job level before being able to swap among 1st/2nd classes.
-
-($) kejs_cost1ST
-($) kejs_cost2ND
-----------------
-Base cost of swaping jobs.
-
-(%) kejs_discount1ST
-(%) kejs_discount2ND
---------------------
-Discount % to apply to the base cost for every job level above the minimum
-required. For example, if the discount is 1% per level and you change when you
-have +10 level more than the min necessary, you get a 10% discount.
-
-(%) kejs_preserve1ST
-(%) kejs_preserve2ND
---------------------
-Indicates how much of the previous job level to preserve when changing. For
-example, if the preserve value is 50 (50%) and you change from a level 40
-Knight into Priest, you'll become a lv 20 Priest. Skill points are adjusted
-accordingly so it's exploit-free.
-
-////////////////////////////////////////////////////////////////////////////////
-[08] Module: Smithery (ke_refine.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Offers the services usually found in the town smithery and then some more:
-Item refining, Item Repairing, Ore Purification (rough oris -> pure ones).
-Also sells Phracon and Emveretarcon.
-
-Item refining can follow all the rules of normal refining, but it can also
-override them to refine everything, or safe refines up to max level.
-
-Ore Purification can be extended to include all the rough materials that
-blacksmiths can purify (star dust -> star crumbs, for example).
-
-Variables
-================================================================================
-
-(#) kerf_maxLv
---------------
-Maximum refinement level of equipment.
-
-(1) kerf_safe
--------------
-If 1 success chances are ignoring and refining never fails.
-
-(1) kerf_showChance
--------------------
-If 1 the chance of success/failure is actually shown before confirming.
-
-(1) kerf_refineAll
-------------------
-If 1 then unrefinable items will be refined too (like accesories)
-
-(%) kerf_discount
------------------
-Discount rate to be applied during forging when the Kafra Pass is active.
-
-($) kerf_armorCost
-($) kerf_weaponLv1Cost
-($) kerf_weaponLv2Cost
-($) kerf_weaponLv3Cost
-($) kerf_weaponLv4Cost
-----------------------
-Cost per level to refine armors, and level 1/2/3/4 weapons.
-
-(1) kerf_purifyAll
-------------------
-If 1, the extended purify menu will be used, which shows how to purify steels,
-star crumbs, etc; otherwise, just elus and oris are available.
-
-($) kerf_repairCost
--------------------
-Cost of repairing a broken weapon.
-
-(%) kerf_repairDiscount
------------------------
-Repair Discount% when the kafra pass is active.
-
-(1) kerf_repairSteel
---------------------
-If 1, a steel will be required to repair items.
-
-////////////////////////////////////////////////////////////////////////////////
-[09] Module: Renting (ke_refine.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Allows renting of Cart/Falcon/PecoPeco. Note that the only restriction applied
-is whether the character has "PushCart", "Falcon Taming" or "PecoPeco Riding",
-it does not checks for the character's class.
-
-It must also be noted that renting is free while the Kafra Pass is active.
-
-Variables
-================================================================================
-
-(1) kert_cartOnly
------------------
-If 1, this module only offers cart rentals. Otherwise you can rent any of the three.
-
-($) kert_cartCost
-($) kert_falconCost
-($) kert_pecoCost
--------------------
-Cost for renting carts/falcons/pecos.
-
-////////////////////////////////////////////////////////////////////////////////
-[10] Module: Kafra Shop (ke_shop.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Allows invoking of a shop from the Kafra. Note that the shops must be of
-invisible type (ke_shop.txt has an example of two such shops). The config
-enables you to select whether the shop will allow buying, selling or
-both, as well as the name of the shops to use in towns or dungeons (if you
-want to use a custom shop defined elsewhere or want to use the same shop for
-both).
-
-Variables
-================================================================================
-
-(#) $@kesh_towntype
-(#) $@kesh_duntype
--------------------
-Specifies the type of transaction allowed at the shop. Use 1 to enable only
-buying of items, 2 for only selling, or any other value for both.
-
-(#) $@kesh_townshop$
-(#) $@kesh_dunshop$
---------------------
-Specifies the name of the shop to use for buying/selling of items. By default
-the file includes two such shops which you can use, or you can disable them
-and specify your own in the config changing these variables.
-
-////////////////////////////////////////////////////////////////////////////////
-[11] Module: Stat/Skill Market (ke_statmarket.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Not really a "market", this module lets players sell and buy stat/skill
-points. Also allows for direct trading between stats/skills.
-
-NOTE: Selling stat points can lead to zeny exploits if your server uses the
-stat_db.txt file, because players can then sell all their stat points, do a
-reset and get them back! To prevent this, set the following battle config
-option:
- use_statpoint_table: no
-Alternatively, you can set the selling point of statpoints to be 0z.
-
-Variables
-================================================================================
-
-($) kesm_stBuyPrice
-($) kesm_stSellPrice
---------------------
-Price for every stat point to be bought/sold.
-
-($) kesm_skBuyPrice
-($) kesm_skSellPrice
---------------------
-Price for every skill point to be bought/sold.
-
-(%) kesm_discount
------------------
-Discount price when kafra pass is active. Only applies to buying stats/skills.
-
-(#) kesm_skTradePrice
-(#) kesm_stTradePrice
----------------------
-These two define how many stat points are traded per each skill point when
-doing a direct conversion between stats/skills. The idea is that trading
-directly one for the other should be cheaper than selling them and then buying
-from the other. You can set both to the same value and the trading will have
-no loss.
-Notice that skTradePrice is the cost for converting stats to skills and
-stTradePrice is the cost for converting skills to stats. So... NEVER set
-stTradePrice higher than skTradePrice or you allow an easy exploit of infinite
-stats/skills!
-
-////////////////////////////////////////////////////////////////////////////////
-[11] Module: Stat/Skill Resets/Raising (ke_stats.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Does stat/skills resets, and additionally helps characters raise their basic
-stats faster. Optionally, skill resets will not touch the basic-skill level.
-Price have two components: base fee and per level fee, so characters with
-higher levels will have to pay more for a reset than low level ones.
-For stat resetting, base level is taken into account. For skill resets, job
-levels. For a dual reset, the addition of both is considered. Also, when taken
-into consideration job level for second classes, the job-level at which one
-changed jobs is also considered. So a Job level 1 Knight actually has job
-level of 41~51.
-
-NOTE: Be careful with quest skills. If your server is configured to reset
-quest skills and players can get their quest skills for free, you are letting
-them exploit the system and get unlimited skill points! (even worse if they
-can sell'em in the Stat/Skills market module). Be sure to either remove free
-quest skills npcs or make quest skills not resetable.
-
-Variables:
-================================================================================
-
-($) kest_stResetCost
---------------------
-Base cost of doing a stat reset.
-
-($) kest_skResetCost
---------------------
-Base cost of doing a skill reset.
-
-($) kest_resetCost
-------------------
-Base cost of a dual reset.
-
-($) kest_BaseLvCost
--------------------
-Cost per Base level for doing a stat reset.
-
-($) kest_JobLvCost
-------------------
-Cost per Job level for doing a skill reset.
-
-($) kest_BothLvCost
--------------------
-Cost per Base+Job level for doing a dual reset.
-
-(%) kest_discount
------------------
-Discount % applied when Kafra Pass is active.
-
-(1) kest_resetBasic
--------------------
-If 1, the skill "basic skill" is also reset.
-
-////////////////////////////////////////////////////////////////////////////////
-[12] Module: Uncarding (ke_uncard.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-This module allows people to remove cards from their equipped items. Prices
-are modified by the item type, the amount of cards and the refine level of the
-item. There's also a chance the removal will fail and: Nothing is lost, the
-card or item is lost, both are lost. The procedure may also require up to two
-different items (and each one with their own specified qty).
-
-Variables:
-================================================================================
-
-($) keuc_BaseCost
------------------
-Base cost of uncarding, modified by the following conditions:
-
-($) keuc_CardCost
------------------
-Each card to be removed increases the total by this value.
-
-($) keuc_UpgradeCostA
-($) keuc_UpgradeCostW1
-($) keuc_UpgradeCostW2
-($) keuc_UpgradeCostW3
-($) keuc_UpgradeCostW4
-----------------------
-These indicate the price increase per refine level for armors and weapons
-levels 1/2/3/4. A +10 armor gets a price increases of ten times
-keuc_UpgradeCostA.
-
-(%) keuc_discount
------------------
-Discount % to apply when kafra pass is active.
-
-(#) keuc_Mat1
-(#) keuc_Qty1
--------------
-Id and Qty of the first material that is needed to uncard. If the qty is zero,
-then it's disabled.
-
-(#) keuc_Mat2
-(#) keuc_Qty2
--------------
-id & Qty of the second material to use. Only valid if the first material was
-also defined, use qty=0 to disable.
-
-(%) keuc_Fail0Chance
---------------------
-This is the safe failure chance (0-1000, where 1000 = 100.0%). A Safe failure
-means the original item remains intact, but you are still charged the money
-and the materials. Use 0 to disable this type of failure.
-
-(%) keuc_Fail1Chance
---------------------
-This is the partial failure chance (0-1000). Partial failures are when either
-the cards or the item is lost. The player gets to choose which one is more
-important before proceeding. Use 0 to disable.
-
-(%) keuc_Fail2Chance
---------------------
-Total failure chance (0-1000). When this triggers, both item and cards are
-lost. Use 0 to disable.
-
-////////////////////////////////////////////////////////////////////////////////
-[14] Module: Town Warping (ke_warp_town.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-This module enables warping to towns. Currently all towns have the same
-warping cost, independent of how far away they are placed. The only exception
-is Niflheim, which is more of a dungeon than a town.
-
-Variables
-================================================================================
-
-(1) kewt_showOnline
--------------------
-If set to 1, the menus will display the online count of players in
-towns.
-
-($) kewt_cost
--------------
-Cost of warping to a town.
-
-($) kewt_niflCost
------------------
-Cost of warping to Niflheim. Different cost since Niflheim is more of a
-dungeon than a city. Also, players can't warp to Niflheim until they do the
-Niflheim Piano Key Quest.
-
-(#) kewt_travel
----------------
-Allows enabling the traveller system. The traveller system makes it so you can't
-warp to a town until you have been there first by some other means (usually
-walking) and saved with the Kafra Express in that town.
-There are three valid values for this variable: 0, 1, 2.
-0 - Disables this mode.
-1 - Uses the mode on a per character basis; that is, each character needs to
-travel to that town and save and that unlocks warping only for that
-character.
-2 - Uses the mode on a per account basis; that is, once a character has saved
-on a town, all other (and future) characters from the same account have the
-warp unlocked.
-
-(1) kewt_free
--------------
-If 1, players will be able to warp to towns even if they run out of money.
-Niflheim excepted.
-
-(%) kewt_discount
------------------
-Discount % to apply when warping while the Kafra Pass is active.
-
-////////////////////////////////////////////////////////////////////////////////
-[15] Module: Dungeon Warping (ke_warp_dungeon.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-Offers warps to all dungeons. Dungeon warping has two main operation modes:
-Deep Dungeon Warping and Short Dungeon Warping. Deep Dungeon warping enables
-players to warp to any level of any dungeon, while Short Dungeon Warping is
-restricted to warping only to the entrance of the dungeon. Traveller's mode is
-also available for dungeons.
-
-Variables
-================================================================================
-
-(1) kewd_showOnline
--------------------
-If set to 1, the menus will display the online online count of characters in
-the dungeons.
-
-(%) kewd_discount
------------------
-Discount % to apply when warping while the Kafra Pass is active.
-
-(#) kewd_travel
----------------
-Enables the traveller system. Just like the traveller's system for towns,
-you can't warp to any dungeon to which you have not visited first on foot and
-saved with the corresponding Kafra Express first.
-If 1, traveller's mode is enabled on a per character basis (so once a
-character saves, only that character has unlocked the warp).
-If 2, traveller's mode is enabled on a per account basis (so once a character
-saves, all charaters of the corresponding account have the warp unlocked).
-
-(1) kewd_deep
--------------
-This variable decides whether deep or short warps will be used. There's no
-need to set it as it will be set automatically based on which file was
-included (ke_warp_short.txt or ke_warp_deep.txt).
-
-(%) kewd_levelCost
-------------------
-This variable only applies to deep warps. It indicates in percentage the cost
-increase per level. For example, if the dungeon costs 1000z to warp to, and
-the levelCost increase is of 50 (50%) then warping to level 2 costs 1500, lv3
-costs 2000, and so on.
-
-(%) kewd_entryDiscount
-----------------------
-The discount for using the Kafra in the dungeon entrance to warp within the
-dungeon. For example, if you use the Kafra next to Payon dungeon to warp to
-Payon Dungeon lv5, this discount is then applied. This variable only makes
-sense on deep warp mode.
-
-(1) kewd_turtleCave
--------------------
-Only used on short warps. If 1, then warping to Turtle Dungeon should lead
-directly to the cave's entrance, otherwise it warps you to the Island's
-entrance.
-
-($) kewd_amatsu
-($) kewd_antHell
-($) kewd_ayothaya
-($) kewd_byalan
-($) kewd_comodo
-($) kewd_clockTower
-($) kewd_coalMines
-($) kewd_culvert
-($) kewd_gefenia
-($) kewd_geffen
-($) kewd_glastHeim
-($) kewd_gonRyun
-($) kewd_hiddenTemple
-($) kewd_louYang
-($) kewd_magma
-($) kewd_orc
-($) kewd_payon
-($) kewd_pyramids
-($) kewd_sphinx
-($) kewd_sunkenShip
-($) kewd_toyFactory
-($) kewd_turtleIsland
-($) kewd_umbala
----------------------
-Base cost of warping to each dungeon, that is, the entrance level cost.
-
-////////////////////////////////////////////////////////////////////////////////
-[16] Module: PvP Warping (ke_pvp.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-The PvP warping module leads to the pvp maps named pvp_n_*-*.gat. It has two
-modes: simple and advanced. On simple mode, every player of every level gets
-thrown into the pvp_n_1-*.gat maps to nuke it out, on advanced mode each of
-the map groups gets their own range of permissible levels to enter. Since
-there is no sure way how characters should escape from a pvp map, they are
-currently given a butterfly wing when they warp.
-
-Variables
-================================================================================
-
-(1) kewp_showOnline
--------------------
-If 1, the menu entries will display the online count of players of each entry.
-
-(1) kewp_advanced
------------------
-Use the advanced pvp system if 1 (see module description)
-
-($) kewp_cost
--------------
-Cost of warping to the pvp rooms used in non-advanced rooms and "free for all"
-in advanced mode.
-
-($) kewp_cost1
-($) kewp_cost2
-($) kewp_cost3
-($) kewp_cost4
-($) kewp_cost5
-($) kewp_cost6
-($) kewp_cost7
---------------
-The costs for each of the pvp room groups in advanced mode.
-
-(#) kewp_baseLv1
-(#) kewp_baseLv2
-(#) kewp_baseLv3
-(#) kewp_baseLv4
-(#) kewp_baseLv5
-(#) kewp_baseLv6
-(#) kewp_baseLv7
-----------------
-These indicate the nominal base level for each room (which base level should
-characters be around to join it). Applicable only to advanced mode.
-
-(#) kewp_range
---------------
-Specifies how far away the character's level can be from the nominal value to
-still be allowed within the room. If the nominal level is 50 and the range is
-3, only characters with levels 47-53 may join.
-
-////////////////////////////////////////////////////////////////////////////////
-[17] Module: WoE Warps (warp_woe.txt)
-////////////////////////////////////////////////////////////////////////////////
-
-Description
-================================================================================
-This module allows characters to warp into the WoE grounds during (or out of)
-War of Emperium times. Players may warp directly into the Guild Dungeons if
-the proper lines are uncommented on the warp menu (See warp_woe.txt's header
-for the location of the menu entries):
-
- menu "- Cancel",-,
-// "- Guild Dungeons",M_DUNGEON,
- "- Al De Baran Guild ("<some code>"z)",L_ALDEBARAN,
- "- Geffen Guild ("<some code>"z)",L_GEFFEN,
- "- Payon Guild ("<some code>"z)",L_PAYON,
- "- Prontera Guild ("<some code>"z)",L_PRONTERA;
- return;
-
-Variables
-================================================================================
-
-(1) kewg_check
---------------
-Does a guild check. If 1, only characters who belong to a guild can use these
-warps.
-
-(1) kewg_checkAgit
-------------------
-Does the WoE times check. If 1, only during War of Emperium the warps will be
-active.
-
-(1) kewg_showOnline
--------------------
-Set to 1 to display in the menus the online count of players in each of the
-guild areas. It also adds a menu entry that displays the summary of players
-within each castle and guild grounds.
-
-(%) kewg_discount
------------------
-Discount % to be applied for warps while the Kafra Pass is active.
-
-($) kewg_baldur
-($) kewg_luina
-($) kewg_valkyrie
-($) kewg_britoniah
-------------------
-Costs to the respective guild dungeons when enabled.
-
-($) kewg_alDeBaran
-($) kewg_geffen
-($) kewg_payon
-($) kewg_prontera
-------------------
-Costs to each of the guild grounds.
-
-////////////////////////////////////////////////////////////////////////////////
-[18] The kafras.txt file: About Kafra Definitions
-////////////////////////////////////////////////////////////////////////////////
-
-The file kafras.txt contains the definition of the Kafras, which is the actual
-sprite on-screen that characters speak with. An enabled kafra may look like
-this:
-
-//Alberta
-alberta.gat,113,53,7 script Kafra Express 116,{
- callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"alberta.gat",116,57;
-}
-
-And a disabled/commented Kafra would look like this:
-
-//Prontera Guild Grounds
-//prt_gld.gat,127,163,5 script Kafra Express 115,{
-// callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"prt_gld.gat",129,170;
-//}
-
-For scripters, the way to define an NPC is not new, and beyond the scope of
-this document, so I'll only document the function "F_KafraExpress":
-
-F_KafraExpress (String "Kafra's name", String "kafra image file", int location, String map, int x, int save y)
-
-The first parameter, the Kafra's name, is the name that will be displayed all
-over the dialogue windows. The Kafra Image file is the image that is to be
-displayed on the screen during the npc chat (without the extension). You can
-use "" to disable the image.
-
-Location refers to the type of Kafra. Type=0 refers to Kafras in towns while
-Type=1 refers to Kafras placed in the wild, ie: in dungeons. Type=2 is for
-Kafras that should count as both town & dungeon. Under these situations, the
-menus displayed are those of the town, the type is used for the traveller's
-warping mode. Finally, Type=3 is a special type used only for the Niflheim
-Kafra.
-
-The last three Parameters are used to define the save location when you save
-your respawn. They are not needed if you use the "Save-on-spot" feature, but
-it's recommended to pass them nevertheless. Note that the map name will still
-be used when using traveller's mode.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Kafra Express Script Package Documentation %
+% - by Skotlex %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+This file's purpose is to give an indepth explanation about setting up, and
+configuring the Kafra Express Script Package (KESP). It is intended to be
+viewed by a text editor using fixed-width font and 80-character long lines.
+
+Document Version v1.9 (15/June/2006)
+////////////////////////////////////////////////////////////////////////////////
+Table of Contents
+////////////////////////////////////////////////////////////////////////////////
+[00] Including the NPC files and menu editing
+[01] Intro to module configuring and general options (config.txt)
+[02] Module: Main Core (ke_main.txt)
+[03] Module: Bank (ke_bank.txt)
+[04] Module: Broadcast (ke_broadcast.txt)
+[05] Module: Stylist (ke_dye.txt)
+[06] Module: Job Changer (ke_jobchange.txt)
+[07] Module: Job Swapper (ke_jobswap.txt)
+[08] Module: Smithery (ke_refine.txt)
+[09] Module: Renting (ke_refine.txt)
+[10] Module: Kafra Shop (ke_shop.txt)
+[11] Module: Stat/Skill Market (ke_statmarket.txt)
+[12] Module: Stat/Skill Resets/Raising (ke_stats.txt)
+[13] Module: Uncarding (ke_uncard.txt)
+[14] Module: Town Warping (ke_warp_town.txt)
+[15] Module: Dungeon Warping (ke_warp_dungeon.txt)
+[16] Module: PvP Warping (ke_warp_pvp.txt)
+[17] Module: WoE Warping (ke_warp_woe.txt)
+[18] The kafras.txt file: About Kafra Definitions
+
+////////////////////////////////////////////////////////////////////////////////
+[00] Including the NPC files and menu editing
+////////////////////////////////////////////////////////////////////////////////
+
+Because of the script's complexity, placing everything in a single file
+is out of the question, therefore the KESP comes bundled in different
+files. Because of the dynamic nature of the script, there are two things
+you need to do in order to enable/disable a particular service:
+
+1. Include the txt file with the corresponding module.
+To include the txt files, you need to know two things: where are the script
+files located, and which is the configuration file where you place the npc
+includes. We'll assume on this guide that you unpacked the KESP in
+npc/custom/kafraExpress. The configuration file for scripts is
+conf/map_athena.conf for eA1.0rc5, and npcs/scripts_custom.txt for current eA
+SVN versions. Add the files you want in the following manner:
+
+ npc: npc/custom/kafraExpress/ke_main.txt
+ //npc: npc/custom/kafraExpress/ke_rent.txt
+
+The first line is including the file ke_main.,txt, while the following
+excludes ke_rent from being used. Placing the "//" at the beginning of the
+line is known as commenting, and it's a useful way of quickly toggling a
+certain script on/off. The following is the list of all files that come
+bundled in the package:
+
+npc: npc/custom/kafraExpress/kafras.txt
+npc: npc/custom/kafraExpress/config.txt
+npc: npc/custom/kafraExpress/ke_main.txt
+
+npc: npc/custom/kafraExpress/ke_bank.txt
+npc: npc/custom/kafraExpress/ke_broadcast.txt
+npc: npc/custom/kafraExpress/ke_dye.txt
+npc: npc/custom/kafraExpress/ke_jobchange.txt
+npc: npc/custom/kafraExpress/ke_jobswap.txt
+npc: npc/custom/kafraExpress/ke_rent.txt
+npc: npc/custom/kafraExpress/ke_shop.txt
+npc: npc/custom/kafraExpress/ke_statmarket.txt
+npc: npc/custom/kafraExpress/ke_stats.txt
+npc: npc/custom/kafraExpress/ke_refine.txt
+npc: npc/custom/kafraExpress/ke_uncard.txt
+npc: npc/custom/kafraExpress/ke_warp_dungeon.txt
+npc: npc/custom/kafraExpress/ke_warp_pvp.txt
+npc: npc/custom/kafraExpress/ke_warp_town.txt
+npc: npc/custom/kafraExpress/ke_warp_woe.txt
+
+What files can be commented, which files you want to include? On the minimum,
+you need ke_main.txt, kafras.txt and config.txt to have the bare-bones functionality.
+Refer to the table of context to see the relation between files and the
+services they offer.
+
+2. Configure the Menus
+The second part of the configuration is adding/removing the menu entries that
+lead to the specific services. Failure to do this can either A. leave you with
+menu entries that lead to "Function Not found!" errors on the map server, or
+B. Services that were included, but you can't pick because they don't show up
+in the menu. The main file where you should configure the menus is ke_main.txt.
+
+From the main module, ke_main.txt, you must pick which services are available.
+The file contains eight menu sections, which is made up of two pairs of
+identitical menus. The only difference is that the first menu is displayed on
+Kafras placed on towns, while the second menu is for Kafras placed on fields and
+dungeons. The menu roughly looks like this:
+
+ menu
+ "- Leave",L_END,
+ "- Heal Service ("<some code here>"z/10SP)",L_HEAL,
+ "- Warp Service",L_WARP,
+// "- Use Storage ("<some code here>"z)",L_STORAGE,
+// "- Use Guild Storage ("<some code here>"z)",L_GUILD_STORAGE,
+ "- Job Services",M_JOB,
+ "- Other Services",M_OTHER,
+ "- Save Respawn point",L_SAVE;
+
+This is the main menu, as you can see the only service unavailable is to use
+the storage. Like in the npc/config file, you can comment the lines of the
+services you do not want.
+
+WARNING: If you need to comment the last option of a menu, remember to replace
+the comma for a semi-colon on the next-to-last option or script parsing errors
+will occur.
+
+The "Warp Service" leads to the second pair of menus you can configure:
+
+ menu
+ "- Return",-,
+ "- Dungeons",L_DUNGEON,
+// "- PvP Arena",L_PVP,
+// "- Guild Wars",L_GUILD_DUNGEON,
+ "- Towns",L_TOWN;
+ goto M_INIT;
+
+As before, you can comment/uncomment the features you want or not. Likewise,
+the third menu under "Job Services" contains features related to job changing,
+stats/skills and renting. The fourth pair is the "Other Services" menu which
+contains the rest of modules which are probably not going to be used
+frequently.
+
+For your convenience, the following is the list of all the menu options and the file(s) required for it to work:
+
+//Main Menu (under labels M_INIT/MD_INIT)
+
+ "- Heal Service" -> ke_main.txt
+ "- Warp Service"
+ "- Use Storage" -> ke_main.txt
+ "- Use Guild Storage" -> ke_main.txt
+ "- Job Services"
+ "- Other Services"
+ "- Save Respawn point" -> ke_main.txt
+
+//Warp Menu (under labels M_WARP/MD_WARP)
+
+ "- Dungeons" -> ke_warp_dungeon.txt
+ "- PvP Arena" -> ke_warp_pvp.txt
+ "- Guild Wars" -> ke_warp_gvg.txt
+ "- Towns" -> ke_warp_town.txt
+
+//Job Services Menu (under labels M_JOB/MD_JOB)
+
+ "- Change Job" -> ke_jobchange.txt
+ "- Swap Job" -> ke_jobswap.txt
+ "- Stat/Skill Services" -> ke_stats.txt
+ "- Stat/Skill Market" -> ke_statmarket.txt
+ "- Rental Service" -> ke_rent.txt
+
+//Other Services Menu (under labels M_OTHER/MD_OTHER)
+
+ "- Bank Services" -> ke_bank.txt
+ "- Use Kafra Shop" -> ke_shop.txt
+ "- Broadcast a message" -> ke_broadcast.txt
+ "- Refine Services" -> ke_refine.txt
+ "- Uncard Services" -> ke_uncard.txt
+ "- Stylist Service" -> ke_dye.txt
+ "- Use a Kafra Pass" -> ke_main.txt
+
+////////////////////////////////////////////////////////////////////////////////
+[01] Intro to individual module configuration.
+////////////////////////////////////////////////////////////////////////////////
+
+For portability reasons, the configure options for every module is in the file
+config.txt, which lets you upgrade to future versions without having to
+readjust your settings every time.
+The config file has the options separated per module to make it easier to
+read. There may be bits of code in each section to avoid parsing configure
+options for unneeded variables which should be left alone. In some rare
+occassions variables from one module will be used in a different module (ie:
+Broadcasting PvP messages uses the variables from the pvp module). all variables
+follow the standard "ke<module initials>_variablename", so a variable called
+"kewd_discount" refers to the discount variable in the deep warps module (wd).
+For example, the renting module's configuration segment is:
+
+ //-------------------------------------------------------------------------------
+ //Config for the Renting Module
+ //-------------------------------------------------------------------------------
+OnLoadRent:
+ set $@kert_cartOnly, 0; //Set to 1 to enable only cart rental, 0 enables all add-ons.
+ set $@kert_cartCost, 2000; //Cost to rent a Cart.
+ set $@kert_falconCost, 2000; //Cost to rent a Falcon.
+ set $@kert_pecoCost, 2000; //Cost to rent a PecoPeco.
+ end;
+
+Variables are usually of two types: Exact value based or Percentage based.
+Exact value variables are often price for different services, while the
+percentage based are things like 30% discount when using Kafra Passes.
+Percentage values are expressed per-hundredth (that is, 10 = 10%, 100 = 100%)
+unless otherwise specified.
+
+Each variable has a small description next to it, hence the need of this
+document. In this document the variable type is identified next to it by: (1)
+when it's boolean, (%) when it's a percentage, ($) when it's a price, (#) for
+numbers and (") for strings.
+
+////////////////////////////////////////////////////////////////////////////////
+[02] Module: Main Core (ke_main.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+This module offers the core functionality of the Kafra Express. Contains the
+main menu and handles the Kafra Pass Reserve Points system.
+
+Variables
+================================================================================
+
+(1) ke_saveOnSpot
+-----------------
+When 1, a character's respawn point is saved exactly where they are standing.
+otherwise, the respawn point is specified by the kafra definition (see Section
+18).
+
+($) keh_hpCost
+($) keh_spCost
+--------------
+The cost of healing sp per every 10 sp. For example, if the cost is 1, it
+costs 100z to heal 1000.
+
+($) kes_cost
+($) kegs_cost
+-------------
+The cost of using the storage, guild storage (respectively)
+
+(1) kekp_reset
+--------------
+For Kafra Passes. When 1, the Pass expires when starting a chat with the
+Kafra. Otherwise the variable remains active a pretty long time (probably all
+session).
+
+($) kekp_reserveCost
+--------------------
+The cost in zeny of reserve points. When using a Kafra Pass many services will
+be cheaper, the amount of zeny saved is "used" to grant the player reserve
+points. For example, if the reserve cost is 100, for every 100z the player
+saves, he'll earn 1 reserve points. Reserve points can be used in scripts, and
+by default is used in the Al De Baran Kafra Headquarters to gain items. Use a
+value of 0 to disable Reserve Point gaining.
+
+(#) kekp_minReserve
+(#) kekp_maxReserve
+---------------
+What is the minimum/maximum reserve points the player can gain when using a
+Kafra Pass per transaction? This only applies when the player has saved at
+least 1z.
+
+(") ked_users
+-------------
+Certain modules (in particular, the warping ones) have the ability to display
+the number of players related to the function (ie: number of users in a
+dungeon), in such cases this variable is used to display the 'unit' of said
+count. For example, if ked_users is "kids" then the related modules might
+display things like "- Glast Heim (6 kids)".
+
+////////////////////////////////////////////////////////////////////////////////
+[03] Module: Bank (ke_bank.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+This modules enables characters to "store" zeny on a virtual bank account
+which is shared among characters of the same account. There can be deposits,
+withdrawals, which can have transactions fees associated.
+
+It is also possible to establish a monthly maintenance fee that has to be
+payed, when the player does not has enough money in the account to pay this
+fee, they stop gaining interests until they deposit enough to pay it up.
+Finally, all fees charged by the bank can be stored in a server-wide variable
+which may be used by other custom scripts.
+
+Variables
+================================================================================
+
+(%) kebk_depositCost
+(%) kebk_withdrawCost
+---------------------
+The Fee in % charged whenever a player does a deposit/withdrawal. For example,
+when a player deposits 100z and the fee is 3%, only 97z are deposited, and 3z
+are charged. Likewise, if a player withdraws 100z when the fee is of 5%,
+they'll withdraw 100z and an additional 5z will be removed from their accounts
+as fee cost.
+
+($) kebk_minTransact
+($) kebk_maxTransact
+--------------------
+The minimum/maximum values of a single transaction (deposit or withdrawal)
+
+($) kebk_capacity
+-----------------
+Indicates what is the bank account capacity for players. That is, what is the
+maximum zeny their account can hold. You can't deposit anymore once the max
+has been reached, and daily interests are lost while maxed.
+
+(%) kebk_dayInterest
+--------------------
+The daily interests that the account makes. The value is in 0.01% units, so a
+value of 100 equals 1% daily interests.
+
+($) kebk_monMaintenance
+-----------------------
+Monthly flat fee charged for maintenance.
+
+(1) kebk_useGlobalBank
+----------------------
+When 1, every fee charged from the player goes into a server variable
+($ke_globalbank), which can then be used by other scripts. is 0 by default
+because none of the Kafra Express modules uses it.
+
+////////////////////////////////////////////////////////////////////////////////
+[04] Module: Broadcast (ke_broadcast.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Provides broadcasting services for players. Broadcasts can be local (current
+map only) or global (server announce), there are also four types of broadcast:
+Requests for a party, PvP Challenge invitations, General Broadcasts (player
+input the string they want to say) and General Anonymous Broadcasts (player
+name is not displayed when doing the broadcast).
+
+Note that the variables from ke_warp_pvp.txt will be used for auto-configuring
+the pvp broadcasts.
+
+Variables:
+================================================================================
+
+(1) kebc_showOnline
+-------------------
+When 1, the total count of players will be displayed in the menu (map users
+next to the local broadcast entry, server users next to the global broadcast
+entry).
+
+($) kebc_partyCost
+($) kebc_pvpCost
+($) kebc_cost
+($) kebc_anonCost
+------------------
+Respective base costs for doing Party-Requests/Pvp Challenge/General/Anonymous
+broadcasts.
+
+(%) kebc_globalFactor
+---------------------
+When the broadcast is global, the base cost is multipled by this factor. If
+the factor is 500, then global broadcasts cost 5x times the cost of the map's
+broadcast.
+
+(%) kebc_discount
+-----------------
+Discount on broadcast prices when the Kafra Pass is active.
+
+////////////////////////////////////////////////////////////////////////////////
+[05] Module: Stylist (ke_dye.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Offers cloth dye, hair dye and hair style changes, both by input and by wheel
+browsing. Does not consumes dyestuffs because it is designed for custom dye
+packages.
+
+Variables
+================================================================================
+
+(1) kedy_enableHairstyle
+------------------------
+If one, the menu will include hair-style changing options, otherwise only
+dye-changes are offered
+
+(#) kedy_styles
+---------------
+Specifies the number of available hair styles
+
+(#) kedy_hair
+-------------
+Specificies the number of hair dyes
+
+(#) kedy_clothJN
+(#) kedy_clothJ1ST
+(#) kedy_clothJ2ND
+(#) kedy_clothJSN
+(#) kedy_clothJWED
+------------------
+Specifies the number of cloth dyes based on job-type: Novices, First Classes,
+Second Classes, Super Novices, Wedding Class.
+
+////////////////////////////////////////////////////////////////////////////////
+[06] Module: Job Changer (ke_jobchange.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Offers job changing, including rebirth and baby classes. The rebirth system
+can allow people free changing through a different path, or forcing the
+correct path. Zeny can be charged/granted as well as weapons on job-change.
+Remaining Skill Points can be wiped, ignored or prevent the change from
+happening. Before changing players can review the consequences of doing so,
+including weapons to gain.
+
+Finally, there's an option that makes it possible to skip the novice class
+altogether and change directly to first jobs.
+
+Variables
+================================================================================
+
+(#) kejc_skillsPolicy
+---------------------
+Determines what to do with remaining skill points upon change:
+ 0: No job changing until points are used.
+ 1: Extra Skill Points are wiped.
+ 2: Extra skill points are conserved.
+
+(#) kejc_upperPolicy
+--------------------
+What to do about the advanced classes?
+ 0: Free for all, players can pick any advanced job regardless of the previous.
+ 1: Force mode, classes are auto-selected from the previous path. In the
+ case the path could not be determined (players changed jobs previously
+ using other npcs), players will be able to select their next job.
+
+(1) kejc_announce
+-----------------
+When 1, a global announce will be done upon change.
+
+(1) kejc_resetDye
+-----------------
+If one, the cloth dye is reset upon changing.
+
+(1) kejc_skipNovice
+-------------------
+If one, players can skip the novice class and directly into their first job.
+Exploit proof, skills are wiped when changing to a 1st class this way, and
+their basic skill level is set to 9.
+
+(#) kejc_baseSN
+---------------
+Base Level required before changing into a Super Novice.
+
+(#) kejc_base2ND
+(#) kejc_job2ND
+(#) kejc_cost2ND
+----------------
+Base level, Job level and zeny required to change into a second job. If the
+cost is below zero, zeny will be given to the player instead of charged.
+
+(#) kejc_baseRebirth
+(#) kejc_jobRebirth
+(#) kejc_costRebirth
+--------------------
+Base level, Job level and zeny required before doing a rebirth (change to High
+Novice).
+
+(1) kejc_rebirthReset
+---------------------
+If 1, when changing into a HighNovice characters will have their level reset
+to 1 (with the additional 100 stat points)
+
+(1) kejc_weaponPolicy
+---------------------
+If 1, characters will get a weapon upon job change. For each first&second
+class there are two weapons to specify, the standard weapon and the "premium"
+one.
+
+(#) kejc_wBonusLv
+-----------------
+When characters reach this job level, they will receive the premium weapon instead of the normal one. If 0, premium weapons are disabled.
+
+(#) kejc_wAcolyte
+(#) kejc_wArcher
+(#) kejc_wMage
+(#) kejc_wMerchant
+(#) kejc_wSwordman
+(#) kejc_wThief
+(#) kejc_wSuperNovice
+(#) kejc_wPriest
+(#) kejc_wMonk
+(#) kejc_wHunter
+(#) kejc_wBard
+(#) kejc_wDancer
+(#) kejc_wWizard
+(#) kejc_wSage
+(#) kejc_wBlacksmith
+(#) kejc_wAlchemist
+(#) kejc_wKnight
+(#) kejc_wCrusader
+(#) kejc_wAssassin
+(#) kejc_wRogue
+-----------------------
+ID of the normal weapons received upon job change (if weapon policy is in
+effect).
+
+(#) kejc_w2Priest
+(#) kejc_w2Monk
+(#) kejc_w2Hunter
+(#) kejc_w2Bard
+(#) kejc_w2Dancer
+(#) kejc_w2Wizard
+(#) kejc_w2Sage
+(#) kejc_w2Blacksmith
+(#) kejc_w2Alchemist
+(#) kejc_w2Knight
+(#) kejc_w2Crusader
+(#) kejc_w2Assassin
+(#) kejc_w2Rogue
+--------------------
+ID of the premium weapons received upon job chane (if bonus weapon policy is
+in effect). Note that first classes can't get a bonus weapon.
+
+////////////////////////////////////////////////////////////////////////////////
+[07] Module: Job Swapper (ke_jobswap.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Permits characters to change jobs among other jobs of their same "level".
+This is, between first classes or between second classes. It is also possible
+to store the last job used and revert to it at a later date. Dye, Job Level
+and Skill Point count is saved, however the skill-tree is not saved and skills
+need be reallocated. When reverting to the previous class, characters might be
+able to return from an adv class to a normal one, but if they are baby
+classes, they can't change back to a normal one.
+
+Variables
+================================================================================
+
+(1) kejs_SNpolicy
+-----------------
+Determines what to do with Super Novices. if 0, they can't swap jobs, if 1,
+they are considered first classes.
+
+(#) kejs_revertPolicy
+---------------------
+Determines if Reverting classes is possible and when:
+ 0: Cannot go back to the previous job.
+ 1: Can only go back if the previous job belongs to the same type as the
+ first (is also a 1st/2nd job and is the same normal/adv/baby category).
+ 2: Can return to the previous job regardless (exception: when one of the
+ two jobs is a baby job and the other is not).
+
+(1) kejs_announce
+-----------------
+If 1 does a server announce when swapping jobs.
+
+($) kejs_revertCost
+-------------------
+Cost of changing to the previous job.
+
+(1) kejs_saveDye
+----------------
+If one, the dye is saved when swapping and restored upon revert.
+
+(1) kejs_resetDye
+-----------------
+If 1 the clothe dye is reset upon swap.
+
+(%) kejs_swapDiscount
+(%) kejs_revertDiscount
+-----------------------
+Discount % to apply when the kafra pass is active for swapping/reverting.
+
+(#) kejs_job1ST
+(#) kejs_job2ND
+---------------
+Minimum job level before being able to swap among 1st/2nd classes.
+
+($) kejs_cost1ST
+($) kejs_cost2ND
+----------------
+Base cost of swaping jobs.
+
+(%) kejs_discount1ST
+(%) kejs_discount2ND
+--------------------
+Discount % to apply to the base cost for every job level above the minimum
+required. For example, if the discount is 1% per level and you change when you
+have +10 level more than the min necessary, you get a 10% discount.
+
+(%) kejs_preserve1ST
+(%) kejs_preserve2ND
+--------------------
+Indicates how much of the previous job level to preserve when changing. For
+example, if the preserve value is 50 (50%) and you change from a level 40
+Knight into Priest, you'll become a lv 20 Priest. Skill points are adjusted
+accordingly so it's exploit-free.
+
+////////////////////////////////////////////////////////////////////////////////
+[08] Module: Smithery (ke_refine.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Offers the services usually found in the town smithery and then some more:
+Item refining, Item Repairing, Ore Purification (rough oris -> pure ones).
+Also sells Phracon and Emveretarcon.
+
+Item refining can follow all the rules of normal refining, but it can also
+override them to refine everything, or safe refines up to max level.
+
+Ore Purification can be extended to include all the rough materials that
+blacksmiths can purify (star dust -> star crumbs, for example).
+
+Variables
+================================================================================
+
+(#) kerf_maxLv
+--------------
+Maximum refinement level of equipment.
+
+(1) kerf_safe
+-------------
+If 1 success chances are ignoring and refining never fails.
+
+(1) kerf_showChance
+-------------------
+If 1 the chance of success/failure is actually shown before confirming.
+
+(1) kerf_refineAll
+------------------
+If 1 then unrefinable items will be refined too (like accesories)
+
+(%) kerf_discount
+-----------------
+Discount rate to be applied during forging when the Kafra Pass is active.
+
+($) kerf_armorCost
+($) kerf_weaponLv1Cost
+($) kerf_weaponLv2Cost
+($) kerf_weaponLv3Cost
+($) kerf_weaponLv4Cost
+----------------------
+Cost per level to refine armors, and level 1/2/3/4 weapons.
+
+(1) kerf_purifyAll
+------------------
+If 1, the extended purify menu will be used, which shows how to purify steels,
+star crumbs, etc; otherwise, just elus and oris are available.
+
+($) kerf_repairCost
+-------------------
+Cost of repairing a broken weapon.
+
+(%) kerf_repairDiscount
+-----------------------
+Repair Discount% when the kafra pass is active.
+
+(1) kerf_repairSteel
+--------------------
+If 1, a steel will be required to repair items.
+
+////////////////////////////////////////////////////////////////////////////////
+[09] Module: Renting (ke_refine.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Allows renting of Cart/Falcon/PecoPeco. Note that the only restriction applied
+is whether the character has "PushCart", "Falcon Taming" or "PecoPeco Riding",
+it does not checks for the character's class.
+
+It must also be noted that renting is free while the Kafra Pass is active.
+
+Variables
+================================================================================
+
+(1) kert_cartOnly
+-----------------
+If 1, this module only offers cart rentals. Otherwise you can rent any of the three.
+
+($) kert_cartCost
+($) kert_falconCost
+($) kert_pecoCost
+-------------------
+Cost for renting carts/falcons/pecos.
+
+////////////////////////////////////////////////////////////////////////////////
+[10] Module: Kafra Shop (ke_shop.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Allows invoking of a shop from the Kafra. Note that the shops must be of
+invisible type (ke_shop.txt has an example of two such shops). The config
+enables you to select whether the shop will allow buying, selling or
+both, as well as the name of the shops to use in towns or dungeons (if you
+want to use a custom shop defined elsewhere or want to use the same shop for
+both).
+
+Variables
+================================================================================
+
+(#) $@kesh_towntype
+(#) $@kesh_duntype
+-------------------
+Specifies the type of transaction allowed at the shop. Use 1 to enable only
+buying of items, 2 for only selling, or any other value for both.
+
+(#) $@kesh_townshop$
+(#) $@kesh_dunshop$
+--------------------
+Specifies the name of the shop to use for buying/selling of items. By default
+the file includes two such shops which you can use, or you can disable them
+and specify your own in the config changing these variables.
+
+////////////////////////////////////////////////////////////////////////////////
+[11] Module: Stat/Skill Market (ke_statmarket.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Not really a "market", this module lets players sell and buy stat/skill
+points. Also allows for direct trading between stats/skills.
+
+NOTE: Selling stat points can lead to zeny exploits if your server uses the
+stat_db.txt file, because players can then sell all their stat points, do a
+reset and get them back! To prevent this, set the following battle config
+option:
+ use_statpoint_table: no
+Alternatively, you can set the selling point of statpoints to be 0z.
+
+Variables
+================================================================================
+
+($) kesm_stBuyPrice
+($) kesm_stSellPrice
+--------------------
+Price for every stat point to be bought/sold.
+
+($) kesm_skBuyPrice
+($) kesm_skSellPrice
+--------------------
+Price for every skill point to be bought/sold.
+
+(%) kesm_discount
+-----------------
+Discount price when kafra pass is active. Only applies to buying stats/skills.
+
+(#) kesm_skTradePrice
+(#) kesm_stTradePrice
+---------------------
+These two define how many stat points are traded per each skill point when
+doing a direct conversion between stats/skills. The idea is that trading
+directly one for the other should be cheaper than selling them and then buying
+from the other. You can set both to the same value and the trading will have
+no loss.
+Notice that skTradePrice is the cost for converting stats to skills and
+stTradePrice is the cost for converting skills to stats. So... NEVER set
+stTradePrice higher than skTradePrice or you allow an easy exploit of infinite
+stats/skills!
+
+////////////////////////////////////////////////////////////////////////////////
+[11] Module: Stat/Skill Resets/Raising (ke_stats.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Does stat/skills resets, and additionally helps characters raise their basic
+stats faster. Optionally, skill resets will not touch the basic-skill level.
+Price have two components: base fee and per level fee, so characters with
+higher levels will have to pay more for a reset than low level ones.
+For stat resetting, base level is taken into account. For skill resets, job
+levels. For a dual reset, the addition of both is considered. Also, when taken
+into consideration job level for second classes, the job-level at which one
+changed jobs is also considered. So a Job level 1 Knight actually has job
+level of 41~51.
+
+NOTE: Be careful with quest skills. If your server is configured to reset
+quest skills and players can get their quest skills for free, you are letting
+them exploit the system and get unlimited skill points! (even worse if they
+can sell'em in the Stat/Skills market module). Be sure to either remove free
+quest skills npcs or make quest skills not resetable.
+
+Variables:
+================================================================================
+
+($) kest_stResetCost
+--------------------
+Base cost of doing a stat reset.
+
+($) kest_skResetCost
+--------------------
+Base cost of doing a skill reset.
+
+($) kest_resetCost
+------------------
+Base cost of a dual reset.
+
+($) kest_BaseLvCost
+-------------------
+Cost per Base level for doing a stat reset.
+
+($) kest_JobLvCost
+------------------
+Cost per Job level for doing a skill reset.
+
+($) kest_BothLvCost
+-------------------
+Cost per Base+Job level for doing a dual reset.
+
+(%) kest_discount
+-----------------
+Discount % applied when Kafra Pass is active.
+
+(1) kest_resetBasic
+-------------------
+If 1, the skill "basic skill" is also reset.
+
+////////////////////////////////////////////////////////////////////////////////
+[12] Module: Uncarding (ke_uncard.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+This module allows people to remove cards from their equipped items. Prices
+are modified by the item type, the amount of cards and the refine level of the
+item. There's also a chance the removal will fail and: Nothing is lost, the
+card or item is lost, both are lost. The procedure may also require up to two
+different items (and each one with their own specified qty).
+
+Variables:
+================================================================================
+
+($) keuc_BaseCost
+-----------------
+Base cost of uncarding, modified by the following conditions:
+
+($) keuc_CardCost
+-----------------
+Each card to be removed increases the total by this value.
+
+($) keuc_UpgradeCostA
+($) keuc_UpgradeCostW1
+($) keuc_UpgradeCostW2
+($) keuc_UpgradeCostW3
+($) keuc_UpgradeCostW4
+----------------------
+These indicate the price increase per refine level for armors and weapons
+levels 1/2/3/4. A +10 armor gets a price increases of ten times
+keuc_UpgradeCostA.
+
+(%) keuc_discount
+-----------------
+Discount % to apply when kafra pass is active.
+
+(#) keuc_Mat1
+(#) keuc_Qty1
+-------------
+Id and Qty of the first material that is needed to uncard. If the qty is zero,
+then it's disabled.
+
+(#) keuc_Mat2
+(#) keuc_Qty2
+-------------
+id & Qty of the second material to use. Only valid if the first material was
+also defined, use qty=0 to disable.
+
+(%) keuc_Fail0Chance
+--------------------
+This is the safe failure chance (0-1000, where 1000 = 100.0%). A Safe failure
+means the original item remains intact, but you are still charged the money
+and the materials. Use 0 to disable this type of failure.
+
+(%) keuc_Fail1Chance
+--------------------
+This is the partial failure chance (0-1000). Partial failures are when either
+the cards or the item is lost. The player gets to choose which one is more
+important before proceeding. Use 0 to disable.
+
+(%) keuc_Fail2Chance
+--------------------
+Total failure chance (0-1000). When this triggers, both item and cards are
+lost. Use 0 to disable.
+
+////////////////////////////////////////////////////////////////////////////////
+[14] Module: Town Warping (ke_warp_town.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+This module enables warping to towns. Currently all towns have the same
+warping cost, independent of how far away they are placed. The only exception
+is Niflheim, which is more of a dungeon than a town.
+
+Variables
+================================================================================
+
+(1) kewt_showOnline
+-------------------
+If set to 1, the menus will display the online count of players in
+towns.
+
+($) kewt_cost
+-------------
+Cost of warping to a town.
+
+($) kewt_niflCost
+-----------------
+Cost of warping to Niflheim. Different cost since Niflheim is more of a
+dungeon than a city. Also, players can't warp to Niflheim until they do the
+Niflheim Piano Key Quest.
+
+(#) kewt_travel
+---------------
+Allows enabling the traveller system. The traveller system makes it so you can't
+warp to a town until you have been there first by some other means (usually
+walking) and saved with the Kafra Express in that town.
+There are three valid values for this variable: 0, 1, 2.
+0 - Disables this mode.
+1 - Uses the mode on a per character basis; that is, each character needs to
+travel to that town and save and that unlocks warping only for that
+character.
+2 - Uses the mode on a per account basis; that is, once a character has saved
+on a town, all other (and future) characters from the same account have the
+warp unlocked.
+
+(1) kewt_free
+-------------
+If 1, players will be able to warp to towns even if they run out of money.
+Niflheim excepted.
+
+(%) kewt_discount
+-----------------
+Discount % to apply when warping while the Kafra Pass is active.
+
+////////////////////////////////////////////////////////////////////////////////
+[15] Module: Dungeon Warping (ke_warp_dungeon.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+Offers warps to all dungeons. Dungeon warping has two main operation modes:
+Deep Dungeon Warping and Short Dungeon Warping. Deep Dungeon warping enables
+players to warp to any level of any dungeon, while Short Dungeon Warping is
+restricted to warping only to the entrance of the dungeon. Traveller's mode is
+also available for dungeons.
+
+Variables
+================================================================================
+
+(1) kewd_showOnline
+-------------------
+If set to 1, the menus will display the online online count of characters in
+the dungeons.
+
+(%) kewd_discount
+-----------------
+Discount % to apply when warping while the Kafra Pass is active.
+
+(#) kewd_travel
+---------------
+Enables the traveller system. Just like the traveller's system for towns,
+you can't warp to any dungeon to which you have not visited first on foot and
+saved with the corresponding Kafra Express first.
+If 1, traveller's mode is enabled on a per character basis (so once a
+character saves, only that character has unlocked the warp).
+If 2, traveller's mode is enabled on a per account basis (so once a character
+saves, all charaters of the corresponding account have the warp unlocked).
+
+(1) kewd_deep
+-------------
+This variable decides whether deep or short warps will be used. There's no
+need to set it as it will be set automatically based on which file was
+included (ke_warp_short.txt or ke_warp_deep.txt).
+
+(%) kewd_levelCost
+------------------
+This variable only applies to deep warps. It indicates in percentage the cost
+increase per level. For example, if the dungeon costs 1000z to warp to, and
+the levelCost increase is of 50 (50%) then warping to level 2 costs 1500, lv3
+costs 2000, and so on.
+
+(%) kewd_entryDiscount
+----------------------
+The discount for using the Kafra in the dungeon entrance to warp within the
+dungeon. For example, if you use the Kafra next to Payon dungeon to warp to
+Payon Dungeon lv5, this discount is then applied. This variable only makes
+sense on deep warp mode.
+
+(1) kewd_turtleCave
+-------------------
+Only used on short warps. If 1, then warping to Turtle Dungeon should lead
+directly to the cave's entrance, otherwise it warps you to the Island's
+entrance.
+
+($) kewd_amatsu
+($) kewd_antHell
+($) kewd_ayothaya
+($) kewd_byalan
+($) kewd_comodo
+($) kewd_clockTower
+($) kewd_coalMines
+($) kewd_culvert
+($) kewd_gefenia
+($) kewd_geffen
+($) kewd_glastHeim
+($) kewd_gonRyun
+($) kewd_hiddenTemple
+($) kewd_louYang
+($) kewd_magma
+($) kewd_orc
+($) kewd_payon
+($) kewd_pyramids
+($) kewd_sphinx
+($) kewd_sunkenShip
+($) kewd_toyFactory
+($) kewd_turtleIsland
+($) kewd_umbala
+---------------------
+Base cost of warping to each dungeon, that is, the entrance level cost.
+
+////////////////////////////////////////////////////////////////////////////////
+[16] Module: PvP Warping (ke_pvp.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+The PvP warping module leads to the pvp maps named pvp_n_*-*.gat. It has two
+modes: simple and advanced. On simple mode, every player of every level gets
+thrown into the pvp_n_1-*.gat maps to nuke it out, on advanced mode each of
+the map groups gets their own range of permissible levels to enter. Since
+there is no sure way how characters should escape from a pvp map, they are
+currently given a butterfly wing when they warp.
+
+Variables
+================================================================================
+
+(1) kewp_showOnline
+-------------------
+If 1, the menu entries will display the online count of players of each entry.
+
+(1) kewp_advanced
+-----------------
+Use the advanced pvp system if 1 (see module description)
+
+($) kewp_cost
+-------------
+Cost of warping to the pvp rooms used in non-advanced rooms and "free for all"
+in advanced mode.
+
+($) kewp_cost1
+($) kewp_cost2
+($) kewp_cost3
+($) kewp_cost4
+($) kewp_cost5
+($) kewp_cost6
+($) kewp_cost7
+--------------
+The costs for each of the pvp room groups in advanced mode.
+
+(#) kewp_baseLv1
+(#) kewp_baseLv2
+(#) kewp_baseLv3
+(#) kewp_baseLv4
+(#) kewp_baseLv5
+(#) kewp_baseLv6
+(#) kewp_baseLv7
+----------------
+These indicate the nominal base level for each room (which base level should
+characters be around to join it). Applicable only to advanced mode.
+
+(#) kewp_range
+--------------
+Specifies how far away the character's level can be from the nominal value to
+still be allowed within the room. If the nominal level is 50 and the range is
+3, only characters with levels 47-53 may join.
+
+////////////////////////////////////////////////////////////////////////////////
+[17] Module: WoE Warps (warp_woe.txt)
+////////////////////////////////////////////////////////////////////////////////
+
+Description
+================================================================================
+This module allows characters to warp into the WoE grounds during (or out of)
+War of Emperium times. Players may warp directly into the Guild Dungeons if
+the proper lines are uncommented on the warp menu (See warp_woe.txt's header
+for the location of the menu entries):
+
+ menu "- Cancel",-,
+// "- Guild Dungeons",M_DUNGEON,
+ "- Al De Baran Guild ("<some code>"z)",L_ALDEBARAN,
+ "- Geffen Guild ("<some code>"z)",L_GEFFEN,
+ "- Payon Guild ("<some code>"z)",L_PAYON,
+ "- Prontera Guild ("<some code>"z)",L_PRONTERA;
+ return;
+
+Variables
+================================================================================
+
+(1) kewg_check
+--------------
+Does a guild check. If 1, only characters who belong to a guild can use these
+warps.
+
+(1) kewg_checkAgit
+------------------
+Does the WoE times check. If 1, only during War of Emperium the warps will be
+active.
+
+(1) kewg_showOnline
+-------------------
+Set to 1 to display in the menus the online count of players in each of the
+guild areas. It also adds a menu entry that displays the summary of players
+within each castle and guild grounds.
+
+(%) kewg_discount
+-----------------
+Discount % to be applied for warps while the Kafra Pass is active.
+
+($) kewg_baldur
+($) kewg_luina
+($) kewg_valkyrie
+($) kewg_britoniah
+------------------
+Costs to the respective guild dungeons when enabled.
+
+($) kewg_alDeBaran
+($) kewg_geffen
+($) kewg_payon
+($) kewg_prontera
+------------------
+Costs to each of the guild grounds.
+
+////////////////////////////////////////////////////////////////////////////////
+[18] The kafras.txt file: About Kafra Definitions
+////////////////////////////////////////////////////////////////////////////////
+
+The file kafras.txt contains the definition of the Kafras, which is the actual
+sprite on-screen that characters speak with. An enabled kafra may look like
+this:
+
+//Alberta
+alberta.gat,113,53,7 script Kafra Express 116,{
+ callfunc "F_KafraExpress","Kafra Express","kafra_02",0,"alberta.gat",116,57;
+}
+
+And a disabled/commented Kafra would look like this:
+
+//Prontera Guild Grounds
+//prt_gld.gat,127,163,5 script Kafra Express 115,{
+// callfunc "F_KafraExpress","Kafra Express","kafra_03",1,"prt_gld.gat",129,170;
+//}
+
+For scripters, the way to define an NPC is not new, and beyond the scope of
+this document, so I'll only document the function "F_KafraExpress":
+
+F_KafraExpress (String "Kafra's name", String "kafra image file", int location, String map, int x, int save y)
+
+The first parameter, the Kafra's name, is the name that will be displayed all
+over the dialogue windows. The Kafra Image file is the image that is to be
+displayed on the screen during the npc chat (without the extension). You can
+use "" to disable the image.
+
+Location refers to the type of Kafra. Type=0 refers to Kafras in towns while
+Type=1 refers to Kafras placed in the wild, ie: in dungeons. Type=2 is for
+Kafras that should count as both town & dungeon. Under these situations, the
+menus displayed are those of the town, the type is used for the traveller's
+warping mode. Finally, Type=3 is a special type used only for the Niflheim
+Kafra.
+
+The last three Parameters are used to define the save location when you save
+your respawn. They are not needed if you use the "Save-on-spot" feature, but
+it's recommended to pass them nevertheless. Note that the map name will still
+be used when using traveller's mode.
diff --git a/npc/custom/eAAC_Scripts/messageboards.txt b/npc/custom/eAAC_Scripts/messageboards.txt
index 73f77ca1f..331e42385 100644
--- a/npc/custom/eAAC_Scripts/messageboards.txt
+++ b/npc/custom/eAAC_Scripts/messageboards.txt
@@ -1,421 +1,421 @@
-geffen.gat,122,102,4 script Message Man 774,{
-mes "[Robert]";
-mes "Hello, I am here to serve you. Enjoy my service. ^_-";
-next;
-mes "[Robert]";
-mes "Please keep in mind, that all messages are wiped once every two days";
-mes "-Msg From Creator- In new version this will be set able, look forward to this! -End Msg From Creator-";
-next;
-L_Menu01:
-mes "[Robert]";
-mes "What would you like to do??";
-next;
-if((getgmlevel(0) >= 90)) menu "Public board",L_pubgmmenu,"Gm Board",L_gmmenu,"Close Public Board",L_clospub,"Open Public Board",L_openpub;
-if(($messagepubclose == 1)) goto L_pubclosed;
-menu "Read messages!",L_readmsg,"Post a message!",L_Postmsg,"Leave",L_leave;
-L_pubgmmenu:
-if(($messagepubclose == 1)) goto L_pubclosed;
-menu "Re-set the rotation",L_setrot,"Reset Message",L_Clearmsgs,"Read messages!",L_readmsg,"Post a message!",L_Postmsg,"Leave",L_leave;
-L_gmmenu:
-menu "Read messages!",L_gmboardread,"Post a Message!",L_gmboardpost,"Reset Messages",L_gmboardreset;
-
-L_openpub:
-mes "[Robert]";
-mes "Are you sure?";
-menu "Yes",-,"No",L_openpubn;
-mes "[Robert]";
-mes "It is done.";
-close2;
-set $messagepubclose,0;
-end;
-
-L_openpubn:
-mes "[Robert]";
-mes "Very well it shall remain closed.";
-close;
-
-L_pubclosed:
-mes "[Robert]";
-mes "Im sorry. The public boards are currently Closed.";
-close;
-
-L_clospub:
-mes "[Robert]";
-mes "Are you sure?";
-next;
-menu "Yes.",-,"No",L_closepubn;
-mes "[Robert]";
-mes "Very well I will not allow anyone into the public board.";
-close2;
-set $messagepubclose,1;
-end;
-
-L_closepubn:
-mes "[Robert]";
-mes "Have a nice day";
-close;
-
-L_gmboardreset:
-mes "[Robert]";
-mes "This will require atleast 2 GM's approval to reset the gm board.";
-mes "-Msg From Creator- This is bugged same gm can vote twice. Planned to revise in next version. -End Msg From Creator-";
-next;
-menu "Vote for reset.",L_gmboardresetvote,"Back to main.",L_Menu01,"Leave.",L_leave;
-
-L_gmboardresetvote:
-callfunc "F_gmresetcheck";
-set @tempid,getcharid(0);
-set $gmboardresetvotenumb,$gmboardresetvotenumb+1;
-set $gmboardresetvoted[$gmboardresetvotenumb],1;
-set $gmboardresetvoteid[$gmboardresetvotenumb],@tempid;
-set @tempid,0;
-set $gmboardreset,$gmboardreset-1;
-mes "[Robert]";
-mes "Thank you.";
-next;
-if(($gmboardreset == 0)) goto L_gmresetdone;
-if(($gmboardreset >= 1)) goto L_gmresetnotdone;
-close;
-
-L_gmresetdone:
-deletearray $gmmessageboardpost$[1],$gmmessageboardpostnumber;
-deletearray $gmmessageboardpostdate$[1],$gmmessageboardpostnumber;
-deletearray $gmmessageboardpostname$[1],$gmmessageboardpostnumber;
-deletearray $gmmessageboardeditdate$[1],$gmmessageboardpostnumber;
-deletearray $gmboardresetvoted[1],$gmboardresetvotenumber;
-deletearray $gmboardresetvoted[1],$gmboardresetvotenumber;
-deletearray $gmboardresetvoteid[1],$gmboardresetvotenumber;
-set $gmboardresetvotenumber,0;
-set $gmboardreset,2;
-mes "[Robert]";
-mes "The reset has been done.";
-close;
-
-L_gmresetnotdone:
-mes "[Robert]";
-mes "There needs to be "+$gmboardreset+" more gm(s) approval to do the reset.";
-close;
-
-L_gmboardread:
-if(($gmmessageboardpostnumber == 0)) goto L_msgno;
-callfunc "F_gmmessage";
-end;
-
-L_gmboardpost:
-if(($gmmessageboardpostnumber >= 127)) goto L_postmsgyestm;
-set @gmmessageboardpostername$,strcharinfo(0);
-set @gmmessageboarddate$,gettimestr("%Y-%m/%d %H:%M:%S",21);
-set $gmmessageboardpostnumber,$gmmessageboardpostnumber+1;
-input @gmmsgboardmsgt$;
-set $gmmessageboardpost$[$gmmessageboardpostnumber],@gmmsgboardmsgt$;
-set $gmmessageboardpostdate$[$gmmessageboardpostnumber],@gmmessageboarddate$;
-set $gmmessageboardpostname$[$gmmessageboardpostnumber],@gmmessageboardpostername$;
-mes "[Robert]";
-mes "Here is what your message looks like";
-next;
-mes "Posted by: "+$gmmessageboardpostname$[$gmmessageboardpostnumber]+".";
-mes "On: "+$gmmessageboardpostdate$[$gmmessageboardpostnumber]+".";
-mes $gmmessageboardpost$[$gmmessageboardpostnumber];
-close;
-
-
-L_setrot:
-set $@determinedayrotation,gettime(4); //this determines the day rotation for clearing messages.
-if(($@determinedayrotation == 0)) set $rotation,0;
-if(($@determinedayrotation == 1)) set $rotation,1;
-if(($@determinedayrotation == 2)) set $rotation,0;
-if(($@determinedayrotation == 3)) set $rotation,1;
-if(($@determinedayrotation == 4)) set $rotation,0;
-if(($@determinedayrotation == 5)) set $rotation,1;
-if(($@determinedayrotation == 6)) set $rotation,0;
-mes "It is done.";
-close;
-
-L_Clearmsgs:
-mes "[Robert]";
-mes "Are you sure?";
-next;
-menu "Yes",L_clearmsgsy,"No thanks.",L_Menu01;
-
-L_clearmsgsy:
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $messageboardeditdate$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-mes "[Robert]";
-mes "It is done.";
-close;
-
-L_leave:
-close;
-
-L_Postmsg:
-mes "[Robert]";
-mes "What do you want to say in your message?";
-next;
-set @msgboardmsgt$,0;
-input @msgboardmsgt$;
-mes "[Robert]";
-mes "are you sure this is the message you want?";
-mes @msgboardmsgt$;
-next;
-menu "Yes!",L_postmsgyes,"No let me re-do it!",L_Postmsg,"Ive changed my mind let me leave.",lleave;
-
-L_postmsgyes:
-if(($messageboardpostnumber >= 127)) goto L_postmsgyestm;
-set @messageboardpostername$,strcharinfo(0);
-set @messageboarddate$,gettimestr("%Y-%m/%d %H:%M:%S",21);
-set $messageboardpostnumber,$messageboardpostnumber+1;
-set @mymessage2,$messageboardpostnumber;
-set $mymessage[$messageboardpostnumber],5;
-set $messageboardpost$[$messageboardpostnumber],@msgboardmsgt$;
-set $messageboardpostdate$[$messageboardpostnumber],@messageboarddate$;
-set $messageboardpostname$[$messageboardpostnumber],@messageboardpostername$;
-mes "[Robert]";
-mes "here is what your message looks like";
-next;
-mes "Posted by: "+$messageboardpostname$[$messageboardpostnumber]+".";
-mes "On: "+$messageboardpostdate$[$messageboardpostnumber]+".";
-mes $messageboardpost$[$messageboardpostnumber];
-close;
-
-L_postmsgyestm:
-set @mesboardmsgt$,0;
-mes "[Robert]";
-mes "Im sorry your going to have to wait till more space opens up for messages, it should be in 1 or 2 days =)";
-close;
-
-lleave:
-deletearray $messageboardpost$[@tempview],@tempview;
-deletearray $messageboardpostname$[@tempview],@tempview;
-deletearray $messageboardpostdate$[@tempview],@tempview;
-deletearray $mymessage[@tempview],@tempview;
-set $messageboardpostnumber,$messageboardpostnumber-1;
-set @msgboardmsgt$,0;
-close;
-
-L_readmsg:
-if(($messageboardpostnumber == 0)) goto L_msgno;
-callfunc "F_message";
-end;
-
-L_msgno:
-mes "[Robert]";
-mes "There are currently no messages.";
-close;
-
-OnInit:
-set $gmboardreset,2;
-set $gmboardresetvotenumb,0;
-end;
-
-OnInterIfInitOnce:
-set $@determinedayrotation,gettime(4); //this determines the day rotation for clearing messages.
-if(($@determinedayrotation == 0)) set $rotation,0;
-if(($@determinedayrotation == 1)) set $rotation,1;
-if(($@determinedayrotation == 2)) set $rotation,0;
-if(($@determinedayrotation == 3)) set $rotation,1;
-if(($@determinedayrotation == 4)) set $rotation,0;
-if(($@determinedayrotation == 5)) set $rotation,1;
-if(($@determinedayrotation == 6)) set $rotation,0;
-end;
-
-
-OnSun1200:
-if(($rotation == 1)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnSat1200:
-if(($rotation == 0)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnMon1200:
-if(($rotation == 1)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnTue1200:
-if(($rotation == 0)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnWed1200:
-if(($rotation == 1)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnThu1200:
-if(($rotation == 0)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[1],$messageboardpostnumber;
-set $messageboardpostnumber,0;
-end;
-
-OnFri1200:
-if(($rotation == 1)) end;
-deletearray $messageboardpost$[1],$messageboardpostnumber;
-deletearray $messageboardpostdate$[1],$messageboardpostnumber;
-deletearray $messageboardpostname$[1],$messageboardpostnumber;
-deletearray $mymessage[@tempview],@tempview;
-set $messageboardpostnumber,0;
-end;
-}
-
-function script F_gmresetcheck {
-set @tempcheck,0;
-L_top:
-set @tempcheck,@tempcheck+1;
-if(($gmboardresetvoted[@tempview] == 1)) goto L_votecheck;
-if(($gmboardresetvoted[@tempview] == 0)) return;
-goto L_top;
-end;
-
-L_votecheck:
-set @tempcheckid,0;
-set @tempcheckid,getcharid(0);
-if(($gmboardresetvoteid[@tempview] != @tempcheckid)) goto L_top;
-if(($gmboardresetvoteid[@tempview] == @tempcheckid)) goto L_voted;
-end;
-}
-
-function script F_gmmessage {
-set @tempview,0;
-L_top:
-set @tempview,@tempview+1;
-mes "Posted By: "+$gmmessageboardpostname$[@tempview]+".";
-mes "On: "+$gmmessageboardpostdate$[@tempview]+".";
-mes $gmmessageboardpost$[@tempview]+".";
-menu "Next Message",L_top2;
-
-L_top2:
-if(($gmmessageboardpostnumber > @tempview)) goto L_top;
-close;
-}
-
-function script F_message {
-set @tempview,0;
-L_top:
-set @tempview,@tempview+1;
-mes "Posted By: "+$messageboardpostname$[@tempview]+".";
-mes "On: "+$messageboardpostdate$[@tempview]+".";
-mes $messageboardpost$[@tempview]+".";
-next;
-if(($mymessage[@tempview] == 5) && (getgmlevel(99)>0)) menu "Next Message",L_top2,"Delete My Message",L_delmy,"Edit my message",L_editmy,"Delete This message",L_Del;
-if((getgmlevel(99)>0)) menu "Next Message",L_top2,"Delete This message",L_Del;
-if(($mymessage[@tempview] == 5)) menu "Next Message",L_top2,"Delete My Message",L_delmy,"Edit my message",L_editmy;
-menu "Next message",L_top2;
-close;
-
-L_editmy:
-mes "Are you sure?";
-next;
-menu "Yes",L_editmyy,"No",L_editmyn;
-
-L_editmyy:
-mes "what do you want your new message to be?";
-next;
-mes "Current message!";
-mes $messageboardpost$[@tempview];
-set @tempeditmsg$,0;
-input @tempeditmsg$;
-next;
-mes "is this what you want?";
-mes @tempeditmsg$;
-next;
-menu "Yes!",L_editmyyy,"No.",L_editmyyn;
-
-L_editmyyy:
-deletearray $messageboardpost$[@tempview],@tempview;
-set $messageboardpost$[@tempview],@tempeditmsg$;
-mes "Here is what your new message looks like.";
-next;
-mes "Posted By: "+$messageboardpostname$[@tempview]+".";
-mes "On: "+$messageboardpostdate$[@tempview]+".";
-mes $messageboardpost$[@tempview]+".";
-close2;
-set @tempview,0;
-end;
-
-L_editmyn:
-Mes "So be it.";
-set @tempview,0;
-close;
-
-L_editmyyn:
-mes "So be it!";
-set @tempeditmsg$,0;
-set @tempview,0;
-close;
-
-L_delmy:
-mes "Are you sure...?";
-next;
-menu "Yes",L_delmyy,"No thanks.",L_delmyn;
-
-L_delmyy:
-deletearray $messageboardpost$[@tempview],@tempview;
-deletearray $messageboardpostname$[@tempview],@tempview;
-deletearray $messageboardpostdate$[@tempview],@tempview;
-deletearray $mymessage[@tempview],@tempview;
-deletearray $messageboardeditdate$[@tempview],@tempview;
-set $messageboardpostnumber,$messageboardpostnumber-1;
-set @tempview,0;
-mes "It is done.";
-close;
-
-L_delmyn:
-mes "Come back soon.";
-set @tempview,0;
-close;
-
-L_top2:
-if(($messageboardpostnumber > @tempview)) goto L_top;
-close;
-
-L_Del:
-mes "Are you sure?";
-next;
-menu "Yes",L_Dely,"No",L_Deln;
-
-L_Dely:
-deletearray $messageboardpost$[@tempview],@tempview;
-deletearray $messageboardpostname$[@tempview],@tempview;
-deletearray $messageboardpostdate$[@tempview],@tempview;
-deletearray $mymessage[@tempview],@tempview;
-deletearray $messageboardeditdate$[@tempview],@tempview;
-set $messageboardpostnumber,$messageboardpostnumber-1;
-mes "It is done.";
-set @tempview,0;
-close;
-
-L_Deln:
-mes "Come back soon!";
-set @tempview,0;
-close;
+geffen.gat,122,102,4 script Message Man 774,{
+mes "[Robert]";
+mes "Hello, I am here to serve you. Enjoy my service. ^_-";
+next;
+mes "[Robert]";
+mes "Please keep in mind, that all messages are wiped once every two days";
+mes "-Msg From Creator- In new version this will be set able, look forward to this! -End Msg From Creator-";
+next;
+L_Menu01:
+mes "[Robert]";
+mes "What would you like to do??";
+next;
+if((getgmlevel(0) >= 90)) menu "Public board",L_pubgmmenu,"Gm Board",L_gmmenu,"Close Public Board",L_clospub,"Open Public Board",L_openpub;
+if(($messagepubclose == 1)) goto L_pubclosed;
+menu "Read messages!",L_readmsg,"Post a message!",L_Postmsg,"Leave",L_leave;
+L_pubgmmenu:
+if(($messagepubclose == 1)) goto L_pubclosed;
+menu "Re-set the rotation",L_setrot,"Reset Message",L_Clearmsgs,"Read messages!",L_readmsg,"Post a message!",L_Postmsg,"Leave",L_leave;
+L_gmmenu:
+menu "Read messages!",L_gmboardread,"Post a Message!",L_gmboardpost,"Reset Messages",L_gmboardreset;
+
+L_openpub:
+mes "[Robert]";
+mes "Are you sure?";
+menu "Yes",-,"No",L_openpubn;
+mes "[Robert]";
+mes "It is done.";
+close2;
+set $messagepubclose,0;
+end;
+
+L_openpubn:
+mes "[Robert]";
+mes "Very well it shall remain closed.";
+close;
+
+L_pubclosed:
+mes "[Robert]";
+mes "Im sorry. The public boards are currently Closed.";
+close;
+
+L_clospub:
+mes "[Robert]";
+mes "Are you sure?";
+next;
+menu "Yes.",-,"No",L_closepubn;
+mes "[Robert]";
+mes "Very well I will not allow anyone into the public board.";
+close2;
+set $messagepubclose,1;
+end;
+
+L_closepubn:
+mes "[Robert]";
+mes "Have a nice day";
+close;
+
+L_gmboardreset:
+mes "[Robert]";
+mes "This will require atleast 2 GM's approval to reset the gm board.";
+mes "-Msg From Creator- This is bugged same gm can vote twice. Planned to revise in next version. -End Msg From Creator-";
+next;
+menu "Vote for reset.",L_gmboardresetvote,"Back to main.",L_Menu01,"Leave.",L_leave;
+
+L_gmboardresetvote:
+callfunc "F_gmresetcheck";
+set @tempid,getcharid(0);
+set $gmboardresetvotenumb,$gmboardresetvotenumb+1;
+set $gmboardresetvoted[$gmboardresetvotenumb],1;
+set $gmboardresetvoteid[$gmboardresetvotenumb],@tempid;
+set @tempid,0;
+set $gmboardreset,$gmboardreset-1;
+mes "[Robert]";
+mes "Thank you.";
+next;
+if(($gmboardreset == 0)) goto L_gmresetdone;
+if(($gmboardreset >= 1)) goto L_gmresetnotdone;
+close;
+
+L_gmresetdone:
+deletearray $gmmessageboardpost$[1],$gmmessageboardpostnumber;
+deletearray $gmmessageboardpostdate$[1],$gmmessageboardpostnumber;
+deletearray $gmmessageboardpostname$[1],$gmmessageboardpostnumber;
+deletearray $gmmessageboardeditdate$[1],$gmmessageboardpostnumber;
+deletearray $gmboardresetvoted[1],$gmboardresetvotenumber;
+deletearray $gmboardresetvoted[1],$gmboardresetvotenumber;
+deletearray $gmboardresetvoteid[1],$gmboardresetvotenumber;
+set $gmboardresetvotenumber,0;
+set $gmboardreset,2;
+mes "[Robert]";
+mes "The reset has been done.";
+close;
+
+L_gmresetnotdone:
+mes "[Robert]";
+mes "There needs to be "+$gmboardreset+" more gm(s) approval to do the reset.";
+close;
+
+L_gmboardread:
+if(($gmmessageboardpostnumber == 0)) goto L_msgno;
+callfunc "F_gmmessage";
+end;
+
+L_gmboardpost:
+if(($gmmessageboardpostnumber >= 127)) goto L_postmsgyestm;
+set @gmmessageboardpostername$,strcharinfo(0);
+set @gmmessageboarddate$,gettimestr("%Y-%m/%d %H:%M:%S",21);
+set $gmmessageboardpostnumber,$gmmessageboardpostnumber+1;
+input @gmmsgboardmsgt$;
+set $gmmessageboardpost$[$gmmessageboardpostnumber],@gmmsgboardmsgt$;
+set $gmmessageboardpostdate$[$gmmessageboardpostnumber],@gmmessageboarddate$;
+set $gmmessageboardpostname$[$gmmessageboardpostnumber],@gmmessageboardpostername$;
+mes "[Robert]";
+mes "Here is what your message looks like";
+next;
+mes "Posted by: "+$gmmessageboardpostname$[$gmmessageboardpostnumber]+".";
+mes "On: "+$gmmessageboardpostdate$[$gmmessageboardpostnumber]+".";
+mes $gmmessageboardpost$[$gmmessageboardpostnumber];
+close;
+
+
+L_setrot:
+set $@determinedayrotation,gettime(4); //this determines the day rotation for clearing messages.
+if(($@determinedayrotation == 0)) set $rotation,0;
+if(($@determinedayrotation == 1)) set $rotation,1;
+if(($@determinedayrotation == 2)) set $rotation,0;
+if(($@determinedayrotation == 3)) set $rotation,1;
+if(($@determinedayrotation == 4)) set $rotation,0;
+if(($@determinedayrotation == 5)) set $rotation,1;
+if(($@determinedayrotation == 6)) set $rotation,0;
+mes "It is done.";
+close;
+
+L_Clearmsgs:
+mes "[Robert]";
+mes "Are you sure?";
+next;
+menu "Yes",L_clearmsgsy,"No thanks.",L_Menu01;
+
+L_clearmsgsy:
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $messageboardeditdate$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+mes "[Robert]";
+mes "It is done.";
+close;
+
+L_leave:
+close;
+
+L_Postmsg:
+mes "[Robert]";
+mes "What do you want to say in your message?";
+next;
+set @msgboardmsgt$,0;
+input @msgboardmsgt$;
+mes "[Robert]";
+mes "are you sure this is the message you want?";
+mes @msgboardmsgt$;
+next;
+menu "Yes!",L_postmsgyes,"No let me re-do it!",L_Postmsg,"Ive changed my mind let me leave.",lleave;
+
+L_postmsgyes:
+if(($messageboardpostnumber >= 127)) goto L_postmsgyestm;
+set @messageboardpostername$,strcharinfo(0);
+set @messageboarddate$,gettimestr("%Y-%m/%d %H:%M:%S",21);
+set $messageboardpostnumber,$messageboardpostnumber+1;
+set @mymessage2,$messageboardpostnumber;
+set $mymessage[$messageboardpostnumber],5;
+set $messageboardpost$[$messageboardpostnumber],@msgboardmsgt$;
+set $messageboardpostdate$[$messageboardpostnumber],@messageboarddate$;
+set $messageboardpostname$[$messageboardpostnumber],@messageboardpostername$;
+mes "[Robert]";
+mes "here is what your message looks like";
+next;
+mes "Posted by: "+$messageboardpostname$[$messageboardpostnumber]+".";
+mes "On: "+$messageboardpostdate$[$messageboardpostnumber]+".";
+mes $messageboardpost$[$messageboardpostnumber];
+close;
+
+L_postmsgyestm:
+set @mesboardmsgt$,0;
+mes "[Robert]";
+mes "Im sorry your going to have to wait till more space opens up for messages, it should be in 1 or 2 days =)";
+close;
+
+lleave:
+deletearray $messageboardpost$[@tempview],@tempview;
+deletearray $messageboardpostname$[@tempview],@tempview;
+deletearray $messageboardpostdate$[@tempview],@tempview;
+deletearray $mymessage[@tempview],@tempview;
+set $messageboardpostnumber,$messageboardpostnumber-1;
+set @msgboardmsgt$,0;
+close;
+
+L_readmsg:
+if(($messageboardpostnumber == 0)) goto L_msgno;
+callfunc "F_message";
+end;
+
+L_msgno:
+mes "[Robert]";
+mes "There are currently no messages.";
+close;
+
+OnInit:
+set $gmboardreset,2;
+set $gmboardresetvotenumb,0;
+end;
+
+OnInterIfInitOnce:
+set $@determinedayrotation,gettime(4); //this determines the day rotation for clearing messages.
+if(($@determinedayrotation == 0)) set $rotation,0;
+if(($@determinedayrotation == 1)) set $rotation,1;
+if(($@determinedayrotation == 2)) set $rotation,0;
+if(($@determinedayrotation == 3)) set $rotation,1;
+if(($@determinedayrotation == 4)) set $rotation,0;
+if(($@determinedayrotation == 5)) set $rotation,1;
+if(($@determinedayrotation == 6)) set $rotation,0;
+end;
+
+
+OnSun1200:
+if(($rotation == 1)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnSat1200:
+if(($rotation == 0)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnMon1200:
+if(($rotation == 1)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnTue1200:
+if(($rotation == 0)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnWed1200:
+if(($rotation == 1)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnThu1200:
+if(($rotation == 0)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[1],$messageboardpostnumber;
+set $messageboardpostnumber,0;
+end;
+
+OnFri1200:
+if(($rotation == 1)) end;
+deletearray $messageboardpost$[1],$messageboardpostnumber;
+deletearray $messageboardpostdate$[1],$messageboardpostnumber;
+deletearray $messageboardpostname$[1],$messageboardpostnumber;
+deletearray $mymessage[@tempview],@tempview;
+set $messageboardpostnumber,0;
+end;
+}
+
+function script F_gmresetcheck {
+set @tempcheck,0;
+L_top:
+set @tempcheck,@tempcheck+1;
+if(($gmboardresetvoted[@tempview] == 1)) goto L_votecheck;
+if(($gmboardresetvoted[@tempview] == 0)) return;
+goto L_top;
+end;
+
+L_votecheck:
+set @tempcheckid,0;
+set @tempcheckid,getcharid(0);
+if(($gmboardresetvoteid[@tempview] != @tempcheckid)) goto L_top;
+if(($gmboardresetvoteid[@tempview] == @tempcheckid)) goto L_voted;
+end;
+}
+
+function script F_gmmessage {
+set @tempview,0;
+L_top:
+set @tempview,@tempview+1;
+mes "Posted By: "+$gmmessageboardpostname$[@tempview]+".";
+mes "On: "+$gmmessageboardpostdate$[@tempview]+".";
+mes $gmmessageboardpost$[@tempview]+".";
+menu "Next Message",L_top2;
+
+L_top2:
+if(($gmmessageboardpostnumber > @tempview)) goto L_top;
+close;
+}
+
+function script F_message {
+set @tempview,0;
+L_top:
+set @tempview,@tempview+1;
+mes "Posted By: "+$messageboardpostname$[@tempview]+".";
+mes "On: "+$messageboardpostdate$[@tempview]+".";
+mes $messageboardpost$[@tempview]+".";
+next;
+if(($mymessage[@tempview] == 5) && (getgmlevel(99)>0)) menu "Next Message",L_top2,"Delete My Message",L_delmy,"Edit my message",L_editmy,"Delete This message",L_Del;
+if((getgmlevel(99)>0)) menu "Next Message",L_top2,"Delete This message",L_Del;
+if(($mymessage[@tempview] == 5)) menu "Next Message",L_top2,"Delete My Message",L_delmy,"Edit my message",L_editmy;
+menu "Next message",L_top2;
+close;
+
+L_editmy:
+mes "Are you sure?";
+next;
+menu "Yes",L_editmyy,"No",L_editmyn;
+
+L_editmyy:
+mes "what do you want your new message to be?";
+next;
+mes "Current message!";
+mes $messageboardpost$[@tempview];
+set @tempeditmsg$,0;
+input @tempeditmsg$;
+next;
+mes "is this what you want?";
+mes @tempeditmsg$;
+next;
+menu "Yes!",L_editmyyy,"No.",L_editmyyn;
+
+L_editmyyy:
+deletearray $messageboardpost$[@tempview],@tempview;
+set $messageboardpost$[@tempview],@tempeditmsg$;
+mes "Here is what your new message looks like.";
+next;
+mes "Posted By: "+$messageboardpostname$[@tempview]+".";
+mes "On: "+$messageboardpostdate$[@tempview]+".";
+mes $messageboardpost$[@tempview]+".";
+close2;
+set @tempview,0;
+end;
+
+L_editmyn:
+Mes "So be it.";
+set @tempview,0;
+close;
+
+L_editmyyn:
+mes "So be it!";
+set @tempeditmsg$,0;
+set @tempview,0;
+close;
+
+L_delmy:
+mes "Are you sure...?";
+next;
+menu "Yes",L_delmyy,"No thanks.",L_delmyn;
+
+L_delmyy:
+deletearray $messageboardpost$[@tempview],@tempview;
+deletearray $messageboardpostname$[@tempview],@tempview;
+deletearray $messageboardpostdate$[@tempview],@tempview;
+deletearray $mymessage[@tempview],@tempview;
+deletearray $messageboardeditdate$[@tempview],@tempview;
+set $messageboardpostnumber,$messageboardpostnumber-1;
+set @tempview,0;
+mes "It is done.";
+close;
+
+L_delmyn:
+mes "Come back soon.";
+set @tempview,0;
+close;
+
+L_top2:
+if(($messageboardpostnumber > @tempview)) goto L_top;
+close;
+
+L_Del:
+mes "Are you sure?";
+next;
+menu "Yes",L_Dely,"No",L_Deln;
+
+L_Dely:
+deletearray $messageboardpost$[@tempview],@tempview;
+deletearray $messageboardpostname$[@tempview],@tempview;
+deletearray $messageboardpostdate$[@tempview],@tempview;
+deletearray $mymessage[@tempview],@tempview;
+deletearray $messageboardeditdate$[@tempview],@tempview;
+set $messageboardpostnumber,$messageboardpostnumber-1;
+mes "It is done.";
+set @tempview,0;
+close;
+
+L_Deln:
+mes "Come back soon!";
+set @tempview,0;
+close;
} \ No newline at end of file
diff --git a/npc/custom/eAAC_Scripts/quest_warper.txt b/npc/custom/eAAC_Scripts/quest_warper.txt
index 24b61f0de..bfd876060 100644
--- a/npc/custom/eAAC_Scripts/quest_warper.txt
+++ b/npc/custom/eAAC_Scripts/quest_warper.txt
@@ -1,2136 +1,2136 @@
-//===== eAthena Script ============================================
-//= Quest Warper Script
-//===== By: =======================================================
-//= Old Warper 2 by Darkchild - Remade with quest format by DZeroX
-//= Huge Rewrite by Neouni
-//===== Current Version: ==========================================
-//= 2.0c
-//===== Compatible With: ==========================================
-//= Any eAthena Version
-//===== Description: ==============================================
-//= Warper that works only after locations are unlocked
-//===== Warning: ==================================================
-// you have to set the securitycode value [1337] the same as in
-// functions_kafras.txt if you changed it !!
-//===== Additional Comments: ======================================
-//= 1.0 - NPCs created
-//= 1.1 - Add Dungeons by sturm
-//= 1.2 - Add All char in account unlocked by ace_killer
-//= 1.3 - Add new 7 towns and 7 dungeons by escoteiro
-// - Correct bug jawaii town by escoteiro
-// - Remove some excessive warpras by escoteiro
-//= 1.4 - Rewrite of the Warpa system [Neouni]
-// - Corrected some bugs caused by autoconverting the old script
-//= 1.4a - Rewrite of menu to be custom for each player [Neouni]
-// - Dungeon listing rewrite
-// - Town listing rewrite
-// - GameMaster can Customise Main menu
-//= 1.4b - Pricing round [Neouni]
-// - GM menu added for pricing
-// - Town Warp pricing tags added
-// - Dungeon Warp pricing tags added
-//= 1.5 - storage functions pricing [Neouni]
-// - storage pricing added
-// - kafra points setting added
-// - kafra storage code security added
-// - Healing scripts pricing added
-// - Heal Part script added
-//= 1.6 - Dungeon warp [Neouni] (beta only)
-// - added option to add a extra fee for going down deeper into dungeon
-// partly by rebuilding the dungeon warping into variable menu's
-//= 1.6a - alot of fixes for beta release [Neouni] (public release)
-// - fixed syntax problems
-// - fixed missing pyramid gats in @DGat$ array
-// - removed the culver level 5 that didn't exist
-// and caused quite alot of problems (i didn't check while converting)
-//-1.7 - Readability of Dungeon menu building increased [Neouni]
-// - Thanatos Tower & Louyang Dungeon added
-//-1.8 - changed around unlock variables [Neouni]
-// - Moved warp variables to mark what you have unlocked to an binary array in login based permanent variable
-// (warp variables are saved in login database, so all charservers have these unlocked)
-// - Town Warp unlock array max 21/(unknown max) items used instead of max account #variables 32 !
-// - Dungeon Warp unlock array 28/(unknown max) items used instead of max account #variables 32 !
-// - (max login ##variables = 16, i used 3)
-// - old variables are cleared on next save
-// - Extra Variable clear added for every character, just in case (request by Terces)
-//-1.8a - Show ammount of users on map [Neouni]
-// - Default = off, enable in GM menu
-// - Requested by escoteiro
-//-1.8b - Small typo fixed in stampcard script [Neouni]
-// - Reported by escoteiro
-//-1.9 - Making it more edit friendly [Neouni]
-// - Made Dungeon warp arrays more readable & editable (QWS_Darray)
-// - Made town warp arrays more readable & editable (QWS_Tarray)
-//-2.0 - Special Warp menu added [Neouni]
-// - when all towns and dungeons are collected a new option on the main menu will show
-// - it will only show when you setup the mapname of the warp !
-// - requested by escoteiro
-// - several bugs fixed
-//-2.0a - Dungeon Level Limit & Split dungeon fees
-// - Limits dungeon based on Depth, access special setup menu thru GM-Menu
-// - Dungeon fees split up based on Basic , Advanced & Overseas
-// - Old Dungeon fee system removed, all dungeon fees now set to 0
-//-2.0b - Special warpname menu option name bug fixed
-//-2.0c - Parenthesis fixes [KarLaeda]
-//=================================================================
-
-//========================Function=&=Script========================
-
-
-function script Q_Warpra {
-// Quick hack for backwards compatibility pre 1.8
-if (##QWS_UP < 18) callfunc "QWS_BackComp";
-// Extra clear variables because marker is saved on all char servers and variables can be on multiple servers
-if (QWS_ExtraVARClear < 18) callfunc "Extra_Variable_Clear";
-
- mes "[Warpra]";
- mes "Hello,";
- mes "I can warp you to any town or dungeon, but you need to unlock them first.";
- mes "To unlock them, you have to visit us.";
- mes "What do you need?";
-
- if(getarg(0) == 0) callfunc "QWS_MMarray",0;
- if(getarg(0) == 1) callfunc "QWS_MMarray",1;
-
- set @MMenu,select(@Mmenulist$[0],@Mmenulist$[1],@Mmenulist$[2],@Mmenulist$[3],@Mmenulist$[4],@Mmenulist$[5],@Mmenulist$[6],@Mmenulist$[7],@Mmenulist$[8],@Mmenulist$[9],@Mmenulist$[10],@Mmenulist$[11]);
-
- switch(@Mmenuref[@MMenu-1]+1){
- case 1:
- goto GM_Menu;
- case 2:
- warp $QW_SP_WarpMap$, $QW_SP_WarpX, $QW_SP_WarpY;
- close2;
- debugmes "Please check your special warp menu settings on the Warpra";
- end;
- case 3:
- goto L_town;
- case 4:
- goto L_dungeon;
- case 5:
- goto L_FewWarps;
- case 6:
- goto L_NoUnlock;
- case 7:
- goto L_heal_Full;
- case 8:
- goto L_heal_Part;
- case 9:
- goto L_Storage;
- case 10:
- goto L_GStorage;
- case 11:
- goto L_end;
- default:
- goto L_end;
-}
-
-//=====================GM-Menu=Functions===========================
-
-GM_Menu:
-next;
-//----------------Town-Warp
- if ($QW_TW_OFF == 0) mes "Town warping = ^00FF00 On ^000000";
- if ($QW_TW_OFF == 1) mes "Town warping = ^FF0000 Off ^000000";
-//----------------Dungeon-Warp
- if ($QW_DW_OFF == 0) mes "Dungeon warping = ^00FF00 On ^000000";
- if ($QW_DW_OFF == 1) mes "Dungeon warping = ^FF0000 Off ^000000";
-//----------------Dungeon-Depth-Limit
- if ($QW_DL == 1) mes "Dungeon Depth limit is ^00FF00 On ^000000";
- if ($QW_DL == 0) mes "Dungeon Depth limit is ^FF0000 Off ^000000";
- mes "If on Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
-//----------------ShowMapUsers
- if ($QW_MapUserShow == 1) mes "Show Map Users = ^00FF00 On ^000000";
- if ($QW_MapUserShow == 0) mes "Show Map Users = ^FF0000 Off ^000000";
-//----------------Healfull
- if ($QW_HF == 1) mes "Healing full = ^00FF00 On ^000000";
-//----------------Healpart
- if ($QW_HP == 1) mes "Healing partly = ^00FF00 On ^000000";
- if ($QW_HF == 0 && $QW_HP == 0) mes "Healing = ^FF0000 Off ^000000";
-//----------------Storage
- if ($QW_Stor == 1) mes "Storage = ^00FF00 On ^000000";
- if ($QW_Stor == 0) mes "Storage = ^FF0000 Off ^000000";
-//----------------GuildStorage
- if ($QW_GStor == 1) mes "Guild Storage = ^00FF00 On ^000000";
- if ($QW_GStor == 0) mes "Guild Storage = ^FF0000 Off ^000000";
-//----------------KafraPoints
- if ($QW_KPoint == 1) mes "Kafra points collect = ^00FF00 On ^000000";
- if ($QW_KPoint == 0) mes "Kafra points collect = ^FF0000 Off ^000000";
-//----------------GMmenu
- switch(select("Town Warping","Dungeon Warping","Dungeon Level Limit","Show Map Users","Healing full","Healing partly","Storage","Guild Storage","Kafra points collect","Set Prices","Special Warp","Exit")) {
-
-// Using callsub and a small check to not make 1 part of the script set it on and the other turning it off again
-
-case 1:
- if ($QW_TW_OFF == 0) {
- set $QW_TW_OFF,1;
- goto GM_Menu;
- } else
- set $QW_TW_OFF,0;
- goto GM_Menu;
-case 2:
- if ($QW_DW_OFF == 0) {
- set $QW_DW_OFF,1;
- goto GM_Menu;
- } else
- set $QW_DW_OFF,0;
- goto GM_Menu;
-case 3:
- goto DungeonLevelLimit;
-case 4:
- if ($QW_MapUserShow == 0) {
- set $QW_MapUserShow,1;
- goto GM_Menu;
- } else
- set $QW_MapUserShow,0;
- goto GM_Menu;
-case 5:
- if ($QW_HF == 0) {
- set $QW_HF,1;
- set $QW_HP,0;
- goto GM_Menu;
- } else
- set $QW_HF,0;
- goto GM_Menu;
-case 6:
- if ($QW_HP == 0) {
- set $QW_HP,1;
- set $QW_HF,0;
- goto GM_Menu;
- } else
- set $QW_HP,0;
- goto GM_Menu;
-case 7:
- if ($QW_Stor == 0) {
- set $QW_Stor,1;
- goto GM_Menu;
- } else
- set $QW_Stor,0;
- goto GM_Menu;
-case 8:
- if ($QW_GStor == 0) {
- set $QW_GStor,1;
- goto GM_Menu;
- } else
- set $QW_GStor,0;
- goto GM_Menu;
-case 9:
- if ($QW_KPoint == 0) {
- set $QW_KPoint,1;
- goto GM_Menu;
- } else
- set $QW_KPoint,0;
- goto GM_Menu;
-case 10:
- goto Setprice;
-case 11:
- goto SpecialWarpMenu;
-default:
- close;
- end;
-}
-
-
-//======================GM-Menu=Pricing============================
-
-Setprice:
- if ($QW_DW_FEE != 0) set $QW_DW_FEE,0;
- next;
- mes "Scroll thru the list to see all the options";
-//----------------Warp-Basic-Price
- if ($QW_BW_PRICE != 0) mes "Basic - Warps are = ^00FF00 "+$QW_BW_PRICE+" ^000000";
- if ($QW_BW_PRICE == 0) mes "Basic - Warps are = ^FF0000 Free ^000000";
-//----------------Warp-Advanced-Price
- if ($QW_AW_PRICE != 0) mes "Advanced - Warps are = ^00FF00 "+$QW_AW_PRICE+" ^000000";
- if ($QW_AW_PRICE == 0) mes "Advanced - Warps are = ^FF0000 Free ^000000";
-//----------------Warp-Oversea-Price
- if ($QW_OW_PRICE != 0) mes "Overseas - Warps are = ^00FF00 "+$QW_OW_PRICE+" ^000000";
- if ($QW_OW_PRICE == 0) mes "Overseas - Warps are = ^FF0000 Free ^000000";
-//----------------Basic-Dungeon-Level-Warp-Fee
- if ($QW_BW_FEE != 0) mes "Basic Dungeon level warp fee = ^00FF00 "+$QW_BW_FEE+" ^000000 zeny per level";
- if ($QW_BW_FEE == 0) mes "Basic Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
-//----------------Advanced-Dungeon-Level-Warp-Fee
- if ($QW_AW_FEE != 0) mes "Advanced Dungeon level warp fee = ^00FF00 "+$QW_AW_FEE+" ^000000 zeny per level";
- if ($QW_AW_FEE == 0) mes "Advanced Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
-//----------------Overseas-Dungeon-Level-Warp-Fee
- if ($QW_OW_FEE != 0) mes "Overseas Dungeon level warp fee = ^00FF00 "+$QW_OW_FEE+" ^000000 zeny per level";
- if ($QW_OW_FEE == 0) mes "Overseas Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
-//----------------Heal-Full
- if ($QW_HF_PRICE != 0) mes "Full Healing = ^00FF00 "+$QW_HF_PRICE+" ^000000";
- if ($QW_HF_PRICE == 0) mes "Full Healing = ^FF0000 Free ^000000";
-//----------------Heal-Part
- if ($QW_HP_H_PRICE != 0) mes "^FF0000HP ^000000Part Healing = ^00FF00 "+$QW_HP_H_PRICE+" ^000000 a point";
- if ($QW_HP_H_PRICE == 0) mes "^FF0000HP ^000000Part Healing = ^FF0000 Free ^000000";
- if ($QW_HP_S_PRICE != 0) mes "^0000FFSP ^000000Part Healing = ^00FF00 "+$QW_HP_S_PRICE+" ^000000 a point";
- if ($QW_HP_S_PRICE == 0) mes "^0000FFSP ^000000Part Healing = ^FF0000 Free ^000000";
-//----------------Storage
- if ($QW_S_PRICE != 0 && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
- if ($QW_S_PRICE == 0) mes "Storage = ^FF0000 Free ^000000";
- if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
-//----------------Guild-Storage
- if ($QW_GS_PRICE != 0) mes "Guild Storage = ^00FF00 "+$QW_GS_PRICE+" ^000000";
- if ($QW_GS_PRICE == 0) mes "Guild Storage = ^FF0000 Free ^000000";
-
- switch(select("Basic - Warps","Advanced - Warps","Overseas - Warps","Basic Dungeon warp fee","Advanced Dungeon warp fee","Overseas Dungeon warp fee","Full Healing","Part Healing","Storage","Guild Storage","Back","Exit")) {
-
-case 1:
- next;
- if ($QW_BW_PRICE != 0) mes "Basic - Warps are = ^00FF00 "+$QW_BW_PRICE+" ^000000";
- if ($QW_BW_PRICE == 0) mes "Basic - Warps are = ^FF0000 Free ^000000";
- mes "Basic - Warps are starter towns and related dungeons";
- input $QW_BW_PRICE;
- goto Setprice;
-
-case 2:
- next;
- if ($QW_AW_PRICE != 0) mes "Advanced - Warps are = ^00FF00 "+$QW_AW_PRICE+" ^000000";
- if ($QW_AW_PRICE == 0) mes "Advanced - Warps are = ^FF0000 Free ^000000";
- mes "Advanced - Warps are towns and dungeons on the same island but not close to any starter town";
- input $QW_AW_PRICE;
- goto Setprice;
-
-case 3:
- next;
- if ($QW_OW_PRICE != 0) mes "Overseas - Warps are = ^00FF00 "+$QW_OW_PRICE+" ^000000";
- if ($QW_OW_PRICE == 0) mes "Overseas - Warps are = ^FF0000 Free ^000000";
- mes "Overseas - Warps are towns and dungeons overseas reachable by boat from alberta";
- input $QW_OW_PRICE;
- goto Setprice;
-
-case 4:
- next;
- if ($QW_BW_FEE != 0) mes "Basic Dungeon level warp fee = ^00FF00 "+$QW_BW_FEE+" ^000000 zeny per level";
- if ($QW_BW_FEE == 0) mes "Basic Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
- mes "Basic - Warps are starter town related dungeons";
- mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
- mes "These costs are on top of the regular Warp costs";
- input $QW_BW_FEE;
- goto Setprice;
-
-case 5:
- next;
- if ($QW_AW_FEE != 0) mes "Advanced Dungeon level warp fee = ^00FF00 "+$QW_AW_FEE+" ^000000 zeny per level";
- if ($QW_AW_FEE == 0) mes "Advanced Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
- mes "Advanced - Warps are dungeons not close to any starter town";
- mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
- mes "These costs are on top of the regular Warp costs";
- input $QW_AW_FEE;
- goto Setprice;
-
-case 6:
- next;
- if ($QW_OW_FEE != 0) mes "Overseas Dungeon level warp fee = ^00FF00 "+$QW_OW_FEE+" ^000000 zeny per level";
- if ($QW_OW_FEE == 0) mes "Overseas Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
- mes "Overseas - Warps are dungeons related to towns overseas reachable by boat from alberta";
- mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
- mes "These costs are on top of the regular Warp costs";
- input $QW_OW_FEE;
- goto Setprice;
-
-case 7:
- next;
- if ($QW_HF_PRICE != 0) mes "Full Healing = ^00FF00 "+$QW_HF_PRICE+" ^000000";
- if ($QW_HF_PRICE == 0) mes "Full Healing = ^FF0000 Free ^000000";
- mes "Instant full healing 1 price";
- input $QW_HF_PRICE;
- goto Setprice;
-
-case 8:
- next;
- if ($QW_HP_H_PRICE != 0) mes "^FF0000HP ^000000Part Healing = ^00FF00 "+$QW_HP_H_PRICE+" ^000000 a point";
- if ($QW_HP_H_PRICE == 0) mes "^FF0000HP ^000000Part Healing = ^FF0000 Free ^000000";
- if ($QW_HP_S_PRICE != 0) mes "^0000FFSP ^000000Part Healing = ^00FF00 "+$QW_HP_S_PRICE+" ^000000 a point";
- if ($QW_HP_S_PRICE == 0) mes "^0000FFSP ^000000Part Healing = ^FF0000 Free ^000000";
- mes "Healing price per 1 HP";
- mes "Healing price per 1 SP";
- mes "2 inputs, first HP then SP";
- input $QW_HP_H_PRICE;
- input $QW_HP_S_PRICE;
- goto Setprice;
-
-case 9:
- next;
- if ($QW_S_PRICE != 0 && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
- if ($QW_S_PRICE == 0) mes "Storage = ^FF0000 Free ^000000";
- if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
- mes "Storage cost, if set to 60 Kafra pricing will be handled";
- input $QW_S_PRICE;
- goto Setprice;
-
-case 10:
- next;
- if ($QW_GS_PRICE != 0) mes "Guild Storage = ^00FF00 "+$QW_GS_PRICE+" ^000000";
- if ($QW_GS_PRICE == 0) mes "Guild Storage = ^FF0000 Free ^000000";
- mes "Guild Storage, free on Guild Kafras";
- input $QW_GS_PRICE;
- goto Setprice;
-case 11:
- goto GM_Menu;
-default:
- close;
- end;
-}
-
-//======================Special=Warp=Menu==========================
-
-SpecialWarpMenu:
- if ($QW_SP_Warpname$ == "") set $QW_SP_Warpname$,"Special Warp";
- next;
- mes "Scroll down to see all the information";
- mes "The Special warp menu option will show in the main menu when all towns & dungeons are unlocked";
- mes "And when the map for special warping has been set";
- mes "menu option name set to ^0000FF"+$QW_SP_Warpname$+"^000000";
- if ($QW_SP_WarpMap$ == "") mes "map is currently ^FF0000not^000000 set, and Special warp menu is off";
- if ($QW_SP_WarpMap$ != "") mes "map is currently set to ^0000FF"+$QW_SP_WarpMap$+"^000000 and Special Warp menu is on";
- mes "coords are set to ^0000FF"+$QW_SP_WarpX+","+$QW_SP_WarpY+"^000000";
- switch(select("Set Special Warp name to show in menu", "Set WarpMap","Set Coords","Go Back to GM_Menu","Exit")){
-
-case 1:
- next;
- mes "set the name to show in the menu as option";
- input $QW_SP_Warpname$;
- goto SpecialWarpMenu;
-case 2:
- next;
- mes "set the map in the ^0000FFmapname.gat^000000 format";
- mes "when this warpmap is set the option for players will show once they meet the requirments";
- mes "to disable Special Warp Menu option clear this !";
- input $QW_SP_WarpMap$;
- goto SpecialWarpMenu;
-case 3:
- next;
- mes "First input = Xcoord";
- mes "Second input = Ycoord";
- input $QW_SP_WarpX;
- input $QW_SP_WarpY;
- goto SpecialWarpMenu;
-case 4:
- goto GM_Menu;
-default:
- close;
- end;
-}
-
-//======================Dungeon=Level=Limit========================
-DungeonLevelLimit:
- next;
- if ($QW_DL == 1) mes "Dungeon Depth limit is ^00FF00 On ^000000";
- if ($QW_DL == 0) mes "Dungeon Depth limit is ^FF0000 Off ^000000";
- mes "If^00FF00 On ^000000Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
-
- switch(select("Toggle Dungeon Depth Limit", "Set Dungeon Depth Limit","Go Back to GM_Menu","Exit")){
-
-case 1:
- if ($QW_DL == 0) {
- set $QW_DL,1;
- goto DungeonLevelLimit;
- } else
- set $QW_DL,0;
- goto DungeonLevelLimit;
-case 2:
- next;
- mes "set limit of Dungeon Depth 0 = entrance";
- mes "Depth 1 is a map connected to 0 and so on";
- mes "Shortest Route to map counts as depth";
- input $QW_DDL;
- goto DungeonLevelLimit;
-case 3:
- goto GM_Menu;
-default:
- close;
- end;
-}
-
-//===========================Towns=================================
-
-L_town:
- callfunc "QWS_Tarray";
-
-// Expected maximum is set to 25 items, if you add more options add more ",@Tmenulist$[xx]"
-
- set @TWMenu,select(@Tmenulist$[0],@Tmenulist$[1],@Tmenulist$[2],@Tmenulist$[3],@Tmenulist$[4],@Tmenulist$[5],@Tmenulist$[6],@Tmenulist$[7],@Tmenulist$[8],@Tmenulist$[9],@Tmenulist$[10],@Tmenulist$[11],@Tmenulist$[12],@Tmenulist$[13],@Tmenulist$[14],@Tmenulist$[15],@Tmenulist$[16],@Tmenulist$[17],@Tmenulist$[18],@Tmenulist$[19],@Tmenulist$[20],@Tmenulist$[21],@Tmenulist$[22],@Tmenulist$[23],@Tmenulist$[24]);
-
- if (@Tmenuref[@TWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
-
- if(Zeny<@pTprice[@Tmenuref[@TWMenu-1]]) callsub L_Short_on_zeny,0;
-
- set Zeny, Zeny-@pTprice[@Tmenuref[@TWMenu-1]];
- if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@pTprice[@Tmenuref[@TWMenu-1]]/16);
- warp @pTmap$[@Tmenuref[@TWMenu-1]],@pTXcoords[@Tmenuref[@TWMenu-1]],@pTYcoords[@Tmenuref[@TWMenu-1]];
- close2; // this part safegaurds against errors/typos
- set Zeny, Zeny+@pTprice[@Tmenuref[@TWMenu-1]];
- end;
-
-//=========================Dungeons================================
-
-L_dungeon:
- callfunc "QWS_Darray";
-
-// Expected maximum is set to 35 items, if you add more options add more ",@Dmenulist$[xx]"
-
- set @DWMenu,select(@Dmenulist$[0],@Dmenulist$[1],@Dmenulist$[2],@Dmenulist$[3],@Dmenulist$[4],@Dmenulist$[5],@Dmenulist$[6],@Dmenulist$[7],@Dmenulist$[8],@Dmenulist$[9],@Dmenulist$[10],@Dmenulist$[11],@Dmenulist$[12],@Dmenulist$[13],@Dmenulist$[14],@Dmenulist$[15],@Dmenulist$[16],@Dmenulist$[17],@Dmenulist$[18],@Dmenulist$[19],@Dmenulist$[20],@Dmenulist$[21],@Dmenulist$[22],@Dmenulist$[23],@Dmenulist$[24],@Dmenulist$[25],@Dmenulist$[26],@Dmenulist$[27],@Dmenulist$[28],@Dmenulist$[29],@Dmenulist$[30],@Dmenulist$[31],@Dmenulist$[32],@Dmenulist$[33],@Dmenulist$[34]);
-
- if (@Dmenuref[@DWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
- set @DwarpMenu, (@Dmenuref[@DWMenu-1]);
- callfunc "QWS_DLarray";
-
- next;
- mes "[Warpra]";
- mes "Please select where you want to go";
-
-// Expected maximum is set to 18 items, if you have dungeons with more levels add more ",@DWLmenulist$[xx]"
- set @DWLMenu,select(@DWLmenulist$[0], @DWLmenulist$[1], @DWLmenulist$[2], @DWLmenulist$[3], @DWLmenulist$[4], @DWLmenulist$[5], @DWLmenulist$[6], @DWLmenulist$[7], @DWLmenulist$[8], @DWLmenulist$[9], @DWLmenulist$[10], @DWLmenulist$[11], @DWLmenulist$[12], @DWLmenulist$[13], @DWLmenulist$[14], @DWLmenulist$[15], @DWLmenulist$[16], @DWLmenulist$[17]);
-
- if (@DWLmenuref[@DWLMenu-1] == 57005) goto L_end; // 57005='dead' in hex
-
- set @Darrayref, @DWLmenuref[@DWLMenu-1];
- set @warpprice, @pDprice[@Dmenuref[@DWMenu-1]]+(getd(@pDfee$[@Dmenuref[@DWMenu-1]])*(@DDepth[@Darrayref]));
-
- if(Zeny<@warpprice) callsub L_Short_on_zeny,1;
-
- set Zeny, Zeny-(@warpprice);
- if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@warpprice/16);
- warp @DGat$[@Darrayref],@DXcoords[@Darrayref],@DYcoords[@Darrayref];
- close2; // this part safegaurds against errors/typos
- set Zeny, Zeny+@pTprice[@Tmenuref[@DWMenu-1]];
- end;
-
-//=============================Healing=============================
-
-L_heal_Full:
- set @healfee, $QW_HF_PRICE;
- if(Zeny<@healfee) callsub L_Short_on_zeny,4;
- set Zeny, Zeny-@healfee;
- if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@healfee/500);
- next;
- mes "[Warpra]";
- mes "Close this window and I will Heal you.";
- close2;
- percentheal 100,100;
- end;
-
-L_heal_Part:
- set @healchoice,select("Full heal","Health Points only","Skill Points only","Exit");
- if (@healchoice == 1) callsub PHeal,1,1;
- if (@healchoice == 2) callsub PHeal,1,0;
- if (@healchoice == 3) callsub PHeal,0,1;
- goto L_end;
-
-PHeal:
- next;
- set @Hp, MaxHp-Hp;
- set @Sp, MaxSp-Sp;
- set @HpPrice, @hp*$QW_HP_H_PRICE;
- set @SpPrice, @sp*$QW_HP_S_PRICE;
- mes "[Warpra]";
- if(getarg(0) == 1) mes ""+@HpPrice+" Zeny for "+@Hp+" health points";
- if(getarg(1) == 1) mes ""+@SpPrice+" Zeny for "+@Sp+" skill points";
- set @total, @HpPrice+@SpPrice;
- mes "for a total of "+@total+" zeny";
- if (select("Heal me","Let me see the choices again")==2) goto L_heal_Part;
-
- if(getarg(0) == 1)set @HpPrice, (MaxHp-Hp)*$QW_HP_H_PRICE;
- if(getarg(1) == 1)set @SpPrice, (MaxSp-Sp)*$QW_HP_S_PRICE;
- set @healfee, @HpPrice+@SpPrice;
- if (getarg(0) == 1 && getarg(1) == 1 && Zeny<@healfee) goto Zeny_Short_Both;
- if (getarg(0) == 1 && Zeny<@healfee) goto Zeny_short_HP;
- if (getarg(1) == 1 && Zeny<@healfee) goto Zeny_short_SP;
- set Zeny, Zeny-@healfee;
- if (getarg(0) == 1 && getarg(1) == 1) percentheal 100,100;
- if (getarg(0) == 1) percentheal 100,0;
- if (getarg(1) == 1) percentheal 0,100;
- close;
- end;
-
-Zeny_Short_Both:
- mes "[Warpra]";
- mes "choose another option, you can afford both.";
- mes "I can heal as much as you can afford too.";
- if (select("OK","Exit") == 2) goto L_end;
- goto PHeal;
-
-Zeny_short_HP:
- mes "[Warpra]";
- mes "do you want me to partly heal your HP ?";
- if (select("Yes","No") == 2) goto L_end;
- set @Hp, Zeny/$QW_HP_H_PRICE;
- set @HpPrice, @Hp*$QW_HP_H_PRICE;
- if (@Hp == 1) mes "your not worth the effort";
- if (@Hp == 1) goto L_end;
- set Zeny, Zeny-@HpPrice;
- heal @Hp,0;
- close;
- end;
-
-Zeny_short_SP:
- mes "[Warpra]";
- mes "do you want me to partly heal your SP ?";
- if (select("Yes","No") == 2) goto L_end;
- set @Sp, Zeny/$QW_HP_S_PRICE;
- set @SpPrice, @Sp*$QW_HP_S_PRICE;
- if (@Sp == 1) mes "your not worth the effort";
- if (@Sp == 1) goto L_end;
- set Zeny, Zeny-@SpPrice;
- heal 0,@Sp;
- close;
- end;
-
-//=============================Storage=============================
-
-L_Storage:
- next;
- if(basicskillcheck(0) > 0 && getskilllv(1) < 6) goto L_StorageJBlow;
- set @fee, $QW_S_PRICE;
- if ($QW_S_PRICE == 60 && BaseJob == Job_Novice) set @fee, 30;
- if(Zeny<@fee) callsub L_Short_on_zeny,2;
- set Zeny, Zeny-@fee;
- if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@fee/5);
-
- mes "[Warpra]";
- mes "Close this window and i will open your storage.";
-
- callsub F_CheckKafCode; //check your storage password thru kafra coding, if set
-
- close2;
- openstorage;
- end;
-
-F_CheckKafCode:
-// you have to set the 1337 value the same as in functions_kafras.txt if you changed it !!
- if(#kafra_code==0) return;
- mes "Enter your storage password:";
- set @code_,0;
- input @code_;
- if(@code_ != #kafra_code-getcharid(3)-1337) {
- dispbottom "Wrong storage password.";
- close;
- }
- set @kafcode_try,0;
- set @code_,0;
- return;
-
-L_StorageJBlow:
- mes "[Warpra]";
- mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage.";
- return;
-
-L_GStorage:
- if(@GID==0) goto L_NoGuild;
- if(Zeny<$QW_GS_PRICE) callsub L_Short_on_zeny,3;
- set Zeny, Zeny-$QW_GS_PRICE;
- if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + ($QW_GS_PRICE/5);
- next;
- mes "[Warpra]";
- mes "Close this window and i will open the ^5533FF" + GetGuildName(@GID) + "^000000 storage.";
- close2;
- guildopenstorage;
- end;
-
-L_NoGuild:
- next;
- mes "[Warpra]";
- mes "You are not a part of a guild I can't help you.";
- close;
- end;
-
-L_end:
- close;
- end;
-
-//============================Few=Warp=============================
-L_FewWarps:
- next;
- mes "[Warpra ]";
- mes "You need to unlock locations before they come available to you.";
- mes "To unlock a location talk to my colleagues all over the world.";
- mes "Each account got it's own stamp card.";
- mes "Want me to check what stamps you have collected so far ?.";
- if (select("Yes","No")==1) callsub stampcard;
- close;
- end;
-
-
-//============================No=Unlock============================
-
-L_NoUnlock:
- next;
- mes "[Warpra ]";
- mes "I don't unlock this location, my assistant deeper in the dungeon will unlock this place.";
- close;
- end;
-
-//=========================Short=On=Zeny===========================
-L_Short_on_zeny:
- next;
- if (getarg(0) == 0) mes "you don't seem to have "+@pTprice[@Tmenuref[@TWMenu-1]]+" zeny, to pay for the warp fee to "+@pTmenuitems$[@Tmenuref[@TWMenu-1]]+"";
- if (getarg(0) == 1) mes "you don't seem to have "+@warpprice+" zeny, to pay for the warp fee to "+@DLevelName$[@DWLmenuref[@DWLMenu-1]]+" at "+@pDmenuitems$[@Dmenuref[@DWMenu-1]]+"";
- if (getarg(0) == 2) mes "you don't seem to have "+@fee+" zeny, to pay for the storage fee";
- if (getarg(0) == 3) mes "you don't seem to have "+$QW_GS_PRICE+" zeny, to pay for the guild storage fee";
- if (getarg(0) == 4) mes "you don't seem to have "+@healfee+" zeny, to pay for your healing";
- close;
- end;
-
-//===========================Stamp=Card============================
-stampcard:
-// Counting of the ammount of places you have unlocked
- next;
- mes "Let me check what Towns you have";
-
- callfunc "QWS_TownStamps";
-
- mes "you collected^00FF00 "+@Tstamp+" of "+@MaxTstamp+" ^000000Towns.";
- if (@Tstamp == 15) mes "They say there is an island you can only get to when married";
- if (@Tstamp == 15) emotion 18;
- next;
-
- mes "Let me check what dungeons you have";
-
- callfunc "QWS_DungeonStamps";
-
- mes "you collected^00FF00 "+@Dstamp+" of "+@MaxDstamp+" ^000000Dungeons";
- mes "To unlock a dungeon, search for my colleague.";
- mes "You can usually find them near the middle or end of the dungeon";
- return;
-}
-
-function script QWS_TownStamps {
- set @Tstamp,0;
- set @MaxTstamp,21; //maximum number of towns
- set @binvalue,1;
- set @Tstamploop,0;
- do {
- if ((@binvalue & ##QWS_T_Unlock) == @binvalue) set @Tstamp,@Tstamp+1;
-
- set @binvalue, @binvalue *2;
- set @Tstamploop, @Tstamploop + 1;
-
-}while (@Tstamploop < @MaxTstamp);
-return;
-}
-
-function script QWS_DungeonStamps {
- set @Dstamp,0;
- set @MaxDstamp,29; //maximum number of dungeons
- set @binvalue,1;
- set @Dstamploop,0;
- do {
- if ((@binvalue & ##QWS_D_Unlock) == @binvalue) set @Dstamp,@Dstamp+1;
-
- set @binvalue, @binvalue *2;
- set @Dstamploop, @Dstamploop + 1;
-
-}while (@Dstamploop < @MaxDstamp);
-return;
-}
-
-//======================Main=Menu=Array============================
-
-function script QWS_MMarray {
-
-// Currently 9 items
-
- setarray @pMmenuitems$[0], "GameMaster Menu", $QW_SP_Warpname$, "Warp to Towns", "Warp to Dungeons", "Why so few Warps ?", "Why don't you Unlock this location ?", "Heal", "Heal", "Storage", "Guild Storage", "Cancel";
- set @Mi,0; // That's our loop counter.
- set @Mj,0; // That's the menu lines counter.
-//----------------GameMaster-Menu
- if (getgmlevel(80)) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if (getgmlevel(80)) set @Mmenuref[@Mj],@Mi;
- if (getgmlevel(80)) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Special-Warp
- callfunc "QWS_TownStamps";
- callfunc "QWS_DungeonStamps";
- if (@Tstamp == @MaxTstamp && @Dstamp == @MaxDstamp && $QW_SP_WarpMap$ != "") {
- set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- set @Mmenuref[@Mj],@Mi;
- set @Mj,@Mj+1;
- }
- set @Mi,@Mi+1;
-//----------------Town-Warp
- if ($QW_TW_OFF == 0) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_TW_OFF == 0) set @Mmenuref[@Mj],@Mi;
- if ($QW_TW_OFF == 0) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Dungeon-Warp
- if ($QW_DW_OFF == 0) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_DW_OFF == 0) set @Mmenuref[@Mj],@Mi;
- if ($QW_DW_OFF == 0) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Why-So-Few-Warps
- set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- set @Mmenuref[@Mj],@Mi;
- set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------No-Unlock
- if (getarg(0) == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if (getarg(0) == 1) set @Mmenuref[@Mj],@Mi;
- if (getarg(0) == 1) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Healfull
- if ($QW_HF == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_HF == 1) set @Mmenuref[@Mj],@Mi;
- if ($QW_HF == 1) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Healpart
- if ($QW_HP == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_HP == 1) set @Mmenuref[@Mj],@Mi;
- if ($QW_HP == 1) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Storage
- if ($QW_Stor == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_Stor == 1) set @Mmenuref[@Mj],@Mi;
- if ($QW_Stor == 1) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------GuildStorage
- if ($QW_GStor == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- if ($QW_GStor == 1) set @Mmenuref[@Mj],@Mi;
- if ($QW_GStor == 1) set @Mj,@Mj+1;
- set @Mi,@Mi+1;
-//----------------Cancel
- set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
- set @Mmenuref[@Mj],@Mi;
- return;
- }
-
-
-
-//======================Town=Menu=Array============================
-
-//----------------Prontera // I do this to find back sections quickly altho almost the same name is a line below it now
-// setarray @pTmenuitems$[@Ti], "Prontera"; // Name of Town shown in Town select Menu
-// setarray @pTprice[@Ti], $QW_BW_PRICE; // warp prices (Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas $QW_OW_PRICE)
-//
-// setarray @pTmap$[@Ti], "prontera.gat"; // mapfilename of town
-// setarray @pTXcoords[@Ti], 156; // X warp coords
-// setarray @pTYcoords[@Ti], 187; // Y warp coords
-//
-// QWS_Make_Town_Menu XXX;
-//
-// the full wap commands send out by this script for these example would be
-//warp example_01.gat 123 123
-//
-// use the same XXX number as you used when making your own town warpra
-// Read below how
-//
-// example:
-//
-//syntax:
-//mapname.gat,xcoord,ycoord,directionfacing script Name of NPC NPC-ID,{
-//
-// Full example using fake map & coords
-//
-//example_01.gat,213,213,4 script Warpra 112,{
-// callfunc "QWS_Town_Warpra",XXX,"A FAKE TOWN FOR EXAMPLE";
-// close;
-// }
-// use a free number for XXX, last used is 20, for Yuno
-
-function script QWS_Tarray {
- function QWS_Make_Town_Menu;
-
- set @Ti,0; // That's our loop counter.
- set @Tj,0; // That's the menu lines counter.
-//----------------Prontera
- setarray @pTmenuitems$[@Ti], "Prontera";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "prontera.gat";
- setarray @pTXcoords[@Ti], 156;
- setarray @pTYcoords[@Ti], 187;
-
- QWS_Make_Town_Menu 0;
-//----------------Alberta
- setarray @pTmenuitems$[@Ti], "Alberta";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "alberta.gat";
- setarray @pTXcoords[@Ti], 27;
- setarray @pTYcoords[@Ti], 236;
-
- QWS_Make_Town_Menu 1;
-//----------------Aldebaran
- setarray @pTmenuitems$[@Ti], "Aldebaran";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "aldebaran.gat";
- setarray @pTXcoords[@Ti], 145;
- setarray @pTYcoords[@Ti], 120;
-
- QWS_Make_Town_Menu 2;
-//----------------Amatsu:
- setarray @pTmenuitems$[@Ti], "Amatsu";
- setarray @pTprice[@Ti], $QW_OW_PRICE;
-
- setarray @pTmap$[@Ti], "amatsu.gat";
- setarray @pTXcoords[@Ti], 197;
- setarray @pTYcoords[@Ti], 86;
-
- QWS_Make_Town_Menu 3;
-//----------------Ayothaya:
- setarray @pTmenuitems$[@Ti], "Ayothaya";
- setarray @pTprice[@Ti], $QW_OW_PRICE;
-
- setarray @pTmap$[@Ti], "ayothaya.gat";
- setarray @pTXcoords[@Ti], 150;
- setarray @pTYcoords[@Ti], 57;
-
- QWS_Make_Town_Menu 4;
-//----------------Comodo:
- setarray @pTmenuitems$[@Ti], "Comodo";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "comodo.gat";
- setarray @pTXcoords[@Ti], 188;
- setarray @pTYcoords[@Ti], 161;
-
- QWS_Make_Town_Menu 5;
-//----------------Einbech:
- setarray @pTmenuitems$[@Ti], "Einbech";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "einbech.gat";
- setarray @pTXcoords[@Ti], 172;
- setarray @pTYcoords[@Ti], 126;
-
- QWS_Make_Town_Menu 6;
-//----------------Einbroch:
- setarray @pTmenuitems$[@Ti], "Einbroch";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "einbroch.gat";
- setarray @pTXcoords[@Ti], 230;
- setarray @pTYcoords[@Ti], 191;
-
- QWS_Make_Town_Menu 7;
-//----------------Geffen:
- setarray @pTmenuitems$[@Ti], "Geffen";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "geffen.gat";
- setarray @pTXcoords[@Ti], 119;
- setarray @pTYcoords[@Ti], 66;
-
- QWS_Make_Town_Menu 8;
-//----------------Gonryun:
- setarray @pTmenuitems$[@Ti], "Gonryun";
- setarray @pTprice[@Ti], $QW_OW_PRICE;
-
- setarray @pTmap$[@Ti], "gonryun.gat";
- setarray @pTXcoords[@Ti], 150;
- setarray @pTYcoords[@Ti], 130;
-
- QWS_Make_Town_Menu 9;
-//----------------Hugel:
- setarray @pTmenuitems$[@Ti], "Hugel";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "hugel.gat";
- setarray @pTXcoords[@Ti], 95;
- setarray @pTYcoords[@Ti], 121;
-
- QWS_Make_Town_Menu 10;
-//----------------Izlude:
- setarray @pTmenuitems$[@Ti], "Izlude";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "izlude.gat";
- setarray @pTXcoords[@Ti], 128;
- setarray @pTYcoords[@Ti], 111;
-
- QWS_Make_Town_Menu 11;
-//----------------Jawaii:
- setarray @pTmenuitems$[@Ti], "Jawaii";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "jawaii.gat";
- setarray @pTXcoords[@Ti], 243;
- setarray @pTYcoords[@Ti], 115;
-
- QWS_Make_Town_Menu 12;
-//----------------Lighthalzen:
- setarray @pTmenuitems$[@Ti], "Lighthalzen";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "lighthalzen.gat";
- setarray @pTXcoords[@Ti], 158;
- setarray @pTYcoords[@Ti], 110;
-
- QWS_Make_Town_Menu 13;
-//----------------Louyang:
- setarray @pTmenuitems$[@Ti], "Louyang";
- setarray @pTprice[@Ti], $QW_OW_PRICE;
-
- setarray @pTmap$[@Ti], "louyang.gat";
- setarray @pTXcoords[@Ti], 210;
- setarray @pTYcoords[@Ti], 108;
-
- QWS_Make_Town_Menu 14;
-//----------------Lutie
- setarray @pTmenuitems$[@Ti], "Lutie";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "xmas.gat";
- setarray @pTXcoords[@Ti], 148;
- setarray @pTYcoords[@Ti], 131;
-
- QWS_Make_Town_Menu 15;
-//----------------Morroc:
- setarray @pTmenuitems$[@Ti], "Morroc";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "morocc.gat";
- setarray @pTXcoords[@Ti], 159;
- setarray @pTYcoords[@Ti], 93;
-
- QWS_Make_Town_Menu 16;
-//----------------Niflheim:
- setarray @pTmenuitems$[@Ti], "Niflheim";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "niflheim.gat";
- setarray @pTXcoords[@Ti], 195;
- setarray @pTYcoords[@Ti], 186;
-
- QWS_Make_Town_Menu 17;
-//----------------Payon:
- setarray @pTmenuitems$[@Ti], "Payon";
- setarray @pTprice[@Ti], $QW_BW_PRICE;
-
- setarray @pTmap$[@Ti], "payon.gat";
- setarray @pTXcoords[@Ti], 152;
- setarray @pTYcoords[@Ti], 75;
-
- QWS_Make_Town_Menu 18;
-//----------------Umbala:
- setarray @pTmenuitems$[@Ti], "Umbala";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "umbala.gat";
- setarray @pTXcoords[@Ti], 130;
- setarray @pTYcoords[@Ti], 130;
-
- QWS_Make_Town_Menu 19;
-//----------------Yuno:
- setarray @pTmenuitems$[@Ti], "Yuno";
- setarray @pTprice[@Ti], $QW_AW_PRICE;
-
- setarray @pTmap$[@Ti], "yuno.gat";
- setarray @pTXcoords[@Ti], 160;
- setarray @pTYcoords[@Ti], 168;
-
- QWS_Make_Town_Menu 20;
-//----------------Cancel
- setarray @pTmenuitems$[@Ti], "Cancel";
- setarray @pTprice[@Ti], 0;
-
- set @Tmenulist$[@Tj],@pTmenuitems$[@Ti];
- set @Tmenuref[@Tj],57005; // 57005='dead' in hex
- return;
-
-
-//----------------Make Town Menu Function
-
-function QWS_Make_Town_Menu {
- set @temptownmenubin,1;
- if (getarg(0) == 0) goto menu_item;
- set @templooptownmenu,0;
- do {
- set @temptownmenubin, @temptownmenubin * 2;
- set @templooptownmenu, @templooptownmenu + 1;
- }while (getarg(0) > @templooptownmenu);
-// check marker and make menu item
-menu_item:
- if ((@temptownmenubin & ##QWS_T_Unlock) != @temptownmenubin) {
- set @Ti,@Ti+1;
- return;
- }
- if (@pTprice[@Ti] != 0 && $QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" -> "+@pTprice[@Ti];
- if (@pTprice[@Ti] == 0 && $QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti];
- if (@pTprice[@Ti] != 0 && $QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]"+" -> "+@pTprice[@Ti];
- if (@pTprice[@Ti] == 0 && $QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]";
- set @Tmenuref[@Tj],@Ti;
- set @Tj,@Tj+1;
- set @Ti,@Ti+1;
- return;
-
-}
-}
-
-//====================Dungeon=Menu=Arrays==========================
-
-//----------------A FAKE DUNGEON FOR EXAMPLE // I do this to find back sections quickly altho almost the same name is a line below it now
-// setarray @pDmenuitems$[@Di], "Fake Dungeon"; // Name of Dungeon shown in Dungeon select Menu
-// setarray @pDprice[@Di], $QW_BW_PRICE; // warp prices (Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas $QW_OW_PRICE)
-// setarray @pDfee$[@Di], "$QW_BW_FEE"; // Identifyer for the Dungeon fee caluclation (Basic ("$QW_BW_FEE"), Advanced ("$QW_AW_FEE"), Overseas ("$QW_OW_FEE")) please use setting in relation with option above (Don't forget "")
-// setarray @DLevels[@Di], 2; //number of levels in dungeon (very important if set to high will shift all leveldata!!)
-//
-// setarray @DGat$[@Dref], "example_01.gat", "example_02.gat"; // mapfilename of dungeon level
-// setarray @DLevelName$[@Dref], "Example Level 1", "Example Level 2"; // level name shown in dungeon level select
-// setarray @DXcoords[@Dref], 123, 234; // X warp coords
-// setarray @DYcoords[@Dref], 123, 234;// Y warp coords
-// setarray @DDepth[@Dref], 0, 1; // relative depth to entrance to calculate extra warp fee
-//
-// QWS_Make_Dungeon_Menu XXX
-//
-// the full wap commands send out by this scripts for these examples would be
-// for Example Level 1:
-//warp example_01.gat 123 123
-//
-// for Example Level 2:
-//warp example_02.gat 234 234
-//
-// use the same XXX number as you used when making your own dungeon unlocker (Warpra Helper) inside the dungeon
-// (usually half way near a warp to next level)
-// Read below how
-//
-// example:
-//
-//syntax:
-//mapname.gat,xcoord,ycoord,directionfacing script Name of NPC NPC-ID,{
-//
-// Full example using fake map & coords
-//
-//example_01.gat,213,213,4 script Warpra Helper 112,{
-// callfunc "QWS_Dungeon_Warpra",XXX,"A FAKE DUNGEON FOR EXAMPLE";
-// close;
-// }
-// use a free number for XXX, last used is 28, for Kiel Dungeon
-
-function script QWS_Darray {
- function QWS_Make_Dungeon_Menu;
-
- set @Di,0;
- set @Dj,0;
- set @Dref,0;
-//----------------ABYSS LAKE
- setarray @pDmenuitems$[@Di], "Abyss Lake";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "abyss_01.gat", "abyss_02.gat", "abyss_03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 265, 275, 116;
- setarray @DYcoords[@Dref], 273, 270, 27;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 0;
-
-//----------------AMATSU DUNGEON
- setarray @pDmenuitems$[@Di], "Amatsu Dungeon";
- setarray @pDprice[@Di], $QW_OW_PRICE;
- setarray @pDfee$[@Di], "$QW_OW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "ama_dun01.gat", "ama_dun02.gat", "ama_dun03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 227, 32, 119;
- setarray @DYcoords[@Dref], 10, 43, 15;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 1;
-
-//----------------ANT HELL
- setarray @pDmenuitems$[@Di], "Ant Hell Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[2], 2;
-
- setarray @DGat$[@Dref], "anthell01.gat", "anthell02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 32, 34;
- setarray @DYcoords[@Dref], 262, 263;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 2;
-
-//----------------AYOTAYA
- setarray @pDmenuitems$[@Di], "Ayotaya Dungeon";
- setarray @pDprice[@Di], $QW_OW_PRICE;
- setarray @pDfee$[@Di], "$QW_OW_FEE";
- setarray @DLevels[3], 2;
-
- setarray @DGat$[@Dref], "ayo_dun01.gat", "ayo_dun02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 275, 150;
- setarray @DYcoords[@Dref], 17, 13;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 3;
-
-//----------------BYALAN
- setarray @pDmenuitems$[@Di], "Byalan Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[4], 5;
-
- setarray @DGat$[@Dref], "iz_dun00.gat", "iz_dun01.gat", "iz_dun02.gat", "iz_dun03.gat", "iz_dun04.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
- setarray @DXcoords[@Dref], 168, 41, 236, 32, 26;
- setarray @DYcoords[@Dref], 168, 37, 204, 63, 27;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
-
- QWS_Make_Dungeon_Menu 4;
-
-//----------------CLOCK TOWER
- setarray @pDmenuitems$[@Di], "Clock Tower Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[5], 8;
-
- setarray @DGat$[@Dref], "c_tower1.gat", "c_tower2.gat", "c_tower3.gat", "c_tower4.gat", "alde_dun01.gat", "alde_dun02.gat", "alde_dun03.gat", "alde_dun04.gat";
- setarray @DLevelName$[@Dref], "Clock Tower Level 1", "Clock Tower Level 2", "Clock Tower Level 3", "Clock Tower Level 4", "Basement 1F", "Basement 2F", "Basement 3F", "Basement 4F";
- setarray @DXcoords[@Dref], 200, 268, 64, 32, 197, 262, 276, 130;
- setarray @DYcoords[@Dref], 163, 26, 148, 63, 25, 41, 53, 130;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2, 3, 4;
-
- QWS_Make_Dungeon_Menu 5;
-
-//----------------COAL MINE
- setarray @pDmenuitems$[@Di], "Coal Mine Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[6], 3;
-
- setarray @DGat$[@Dref], "mjo_dun01.gat", "mjo_dun02.gat", "mjo_dun03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 52, 381, 302;
- setarray @DYcoords[@Dref], 17, 343, 261;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 6;
-
-//----------------CULVERT
- setarray @pDmenuitems$[@Di], "Culvert Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[7], 4;
-
- setarray @DGat$[@Dref], "prt_sewb1.gat", "prt_sewb2.gat", "prt_sewb3.gat", "prt_sewb4.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
- setarray @DXcoords[@Dref], 132, 19, 180, 100;
- setarray @DYcoords[@Dref], 248, 19, 169, 92;
- setarray @DDepth[@Dref], 0, 1, 2, 3;
-
- QWS_Make_Dungeon_Menu 7;
-
-//----------------EINBECH DUNGEON
- setarray @pDmenuitems$[@Di], "Einbech Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[8], 2;
-
- setarray @DGat$[@Dref], "ein_dun01.gat", "ein_dun02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 22, 292;
- setarray @DYcoords[@Dref], 14, 290;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 8;
-
-//----------------GEFENIA DUNGEON
- setarray @pDmenuitems$[@Di], "Gefenia Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[9], 4;
-
- setarray @DGat$[@Dref], "gefenia01.gat", "gefenia02.gat", "gefenia03.gat", "gefenia04.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
- setarray @DXcoords[@Dref], 59, 201, 264, 33;
- setarray @DYcoords[@Dref], 167, 35, 236, 270;
- setarray @DDepth[@Dref], 0, 1, 2, 3;
-
- QWS_Make_Dungeon_Menu 9;
-
-//----------------GEFFEN DUNGEON
- setarray @pDmenuitems$[@Di], "Geffen Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 4;
-
- setarray @DGat$[@Dref], "gef_dun00.gat", "gef_dun01.gat", "gef_dun02.gat", "gef_dun03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
- setarray @DXcoords[@Dref], 104, 115, 106, 203;
- setarray @DYcoords[@Dref], 100, 236, 132, 200;
- setarray @DDepth[@Dref], 0, 1, 2, 3;
-
- QWS_Make_Dungeon_Menu 10;
-
-//----------------GLAST HEIM
- setarray @pDmenuitems$[@Di], "Glast Heim Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 17;
-
- setarray @DGat$[@Dref], "glast_01.gat", "gl_church.gat", "gl_chyard.gat", "gl_in01.gat", "gl_cas01.gat", "gl_cas02.gat", "gl_knt01.gat", "gl_knt02.gat", "gl_prison.gat", "gl_prison1.gat", "gl_step.gat", "gl_sew01.gat", "gl_sew02.gat", "gl_sew03.gat", "gl_sew04.gat", "gl_dun01.gat", "gl_dun02.gat";
- setarray @DLevelName$[@Dref], "Glast Heim Entrance", "St. Abbey", "Churchyard", "Inside Glast Heim", "Castle 1", "Castle 2", "Chivalry 1", "Chivalry 2", "Prison 1", "Prison 2", "Steps", "Sewers 1", "Sewers 2", "Sewers 3", "Sewers 4", "Lowest Cave 1", "Lowest Cave 2";
- setarray @DXcoords[@Dref], 370, 156, 147, 121, 199, 104, 150, 157, 14, 150, 117, 258, 108, 171, 68, 133, 224;
- setarray @DYcoords[@Dref], 300, 8, 15, 59, 29, 25, 10, 287, 70, 14, 124, 255, 291, 273, 277, 271, 274;
- setarray @DDepth[@Dref], 0, 1, 2, 1, 1, 2, 1, 2, 2, 3, 1, 4, 2, 3, 4, 5, 6;
-
- QWS_Make_Dungeon_Menu 11;
-
-//----------------GONRYUN DUNGEON
- setarray @pDmenuitems$[@Di], "Gonryun Dungeon";
- setarray @pDprice[@Di], $QW_OW_PRICE;
- setarray @pDfee$[@Di], "$QW_OW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "gon_dun01.gat", "gon_dun02.gat", "gon_dun03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 143, 17, 68;
- setarray @DYcoords[@Dref], 59, 114, 9;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 12;
-
-//----------------HIDDEN DUNGEON
- setarray @pDmenuitems$[@Di], "Hidden Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "prt_maze01.gat", "prt_maze02.gat", "prt_maze03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 176, 94, 23;
- setarray @DYcoords[@Dref], 6, 19, 8;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 13;
-
-//----------------JUPEROS CAVE
- setarray @pDmenuitems$[@Di], "Juperos Cave";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "juperos_01.gat", "juperos_02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 53, 36;
- setarray @DYcoords[@Dref], 247, 60;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 14;
-
-//----------------KIEL DUNGEON
- setarray @pDmenuitems$[@Di], "Kiel Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "kh_dun01.gat", "kh_dun02.gat";
- setarray @DLevelName$[@Dref], "1st Floor", "2nd Floor";
- setarray @DXcoords[@Dref], 63, 42;
- setarray @DYcoords[@Dref], 10, 197;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 28;
-
-//----------------LIGHTHALZEN BIO LAB
- setarray @pDmenuitems$[@Di], "Lighthalzen Bio Lab";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "lhz_dun01.gat", "lhz_dun02.gat", "lhz_dun03.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 150, 150, 140;
- setarray @DYcoords[@Dref], 287, 18, 137;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 15;
-
-//----------------LOUYANG DUNGEON
- setarray @pDmenuitems$[@Di], "Louyang Dungeon";
- setarray @pDprice[@Di], $QW_OW_PRICE;
- setarray @pDfee$[@Di], "$QW_OW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "lou_dun02.gat", "lou_dun03.gat";
- setarray @DLevelName$[@Dref], "Royal Tomb Level 1", "Royal Tomb Level 2";
- setarray @DXcoords[@Dref], 282, 165;
- setarray @DYcoords[@Dref], 20, 38;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 16;
-
-//----------------MAGMA DUNGEON
- setarray @pDmenuitems$[@Di], "Magma Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "mag_dun01.gat", "mag_dun02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 126, 47;
- setarray @DYcoords[@Dref], 69, 32;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 17;
-
-//----------------ODIN TEMPLE
- setarray @pDmenuitems$[@Di], "Odin Temple";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 1;
-
- setarray @DGat$[@Dref], "odin_tem01.gat";
- setarray @DLevelName$[@Dref], "Level 1";
- setarray @DXcoords[@Dref], 96;
- setarray @DYcoords[@Dref], 145;
- setarray @DDepth[@Dref], 0;
-
- QWS_Make_Dungeon_Menu 18;
-
-//----------------ORC DUNGEON
- setarray @pDmenuitems$[@Di], "Orc Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "orcsdun01.gat", "orcsdun02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 32, 21;
- setarray @DYcoords[@Dref], 169, 185;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 19;
-
-//----------------PAYON DUNGEON
- setarray @pDmenuitems$[@Di], "Payon Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 5;
-
- setarray @DGat$[@Dref], "pay_dun00.gat", "pay_dun01.gat", "pay_dun02.gat", "pay_dun03.gat", "pay_dun04.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
- setarray @DXcoords[@Dref], 22, 19, 19, 155, 201;
- setarray @DYcoords[@Dref], 180, 33, 63, 159, 204;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
-
- QWS_Make_Dungeon_Menu 20;
-
-//----------------PYRAMIDS
- setarray @pDmenuitems$[@Di], "Pyramids Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 6;
-
- setarray @DGat$[@Dref], "moc_pryd01.gat", "moc_pryd02.gat", "moc_pryd03.gat", "moc_pryd04.gat", "moc_pryd05.gat", "moc_pryd06.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Basement 1", "Basement 2";
- setarray @DXcoords[@Dref], 192, 10, 100, 181, 94, 192;
- setarray @DYcoords[@Dref], 9, 192, 92, 11, 96, 8;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2;
-
- QWS_Make_Dungeon_Menu 21;
-
-//----------------SPHINX
- setarray @pDmenuitems$[@Di], "Sphinx Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 5;
-
- setarray @DGat$[@Dref], "in_sphinx1.gat", "in_sphinx2.gat", "in_sphinx3.gat", "in_sphinx4.gat", "in_sphinx5.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
- setarray @DXcoords[@Dref], 192, 149, 210, 10, 100;
- setarray @DYcoords[@Dref], 9, 81, 54, 222, 99;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
-
- QWS_Make_Dungeon_Menu 22;
-
-//----------------SUNKEN SHIP
- setarray @pDmenuitems$[@Di], "Sunken Ship Dungeon";
- setarray @pDprice[@Di], $QW_BW_PRICE;
- setarray @pDfee$[@Di], "$QW_BW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "treasure01.gat", "treasure02.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2";
- setarray @DXcoords[@Dref], 69, 102;
- setarray @DYcoords[@Dref], 24, 27;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 23;
-
-//----------------THANATOS TOWER
- setarray @pDmenuitems$[@Di], "Thanatos Tower";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 13;
-
- setarray @DGat$[@Dref], "tha_t01.gat", "tha_t02.gat", "tha_t03.gat", "tha_t04.gat", "tha_t05.gat", "tha_t06.gat", "tha_t07.gat", "tha_t08.gat", "tha_t09.gat", "tha_t10.gat", "tha_t11.gat", "tha_t12.gat", "thana_boss.gat";
- setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Level 6", "Level 7", "Level 8", "Level 9", "Level 10", "Level 11", "Level 12", "Thanatos Boss";
- setarray @DXcoords[@Dref], 150, 150, 220, 59, 62, 206, 35, 105, 88, 168, 90, 129, 85;
- setarray @DYcoords[@Dref], 35, 136, 158, 143, 11, 8, 166, 44, 145, 138, 36, 83, 76;
- setarray @DDepth[@Dref], 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
-
- QWS_Make_Dungeon_Menu 24;
-
-//----------------TOY FACTORY
- setarray @pDmenuitems$[@Di], "Toy Factory Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 2;
-
- setarray @DGat$[@Dref], "xmas_dun01.gat", "xmas_dun02.gat";
- setarray @DLevelName$[@Dref], "Factory Warehouse", "Classifying Room";
- setarray @DXcoords[@Dref], 205, 129;
- setarray @DYcoords[@Dref], 16, 133;
- setarray @DDepth[@Dref], 0, 1;
-
- QWS_Make_Dungeon_Menu 25;
-
-//----------------TURTLE ISTLAND
- setarray @pDmenuitems$[@Di], "Turtle Island Dungeon";
- setarray @pDprice[@Di], $QW_AW_PRICE;
- setarray @pDfee$[@Di], "$QW_AW_FEE";
- setarray @DLevels[@Di], 4;
-
- setarray @DGat$[@Dref], "tur_dun01.gat", "tur_dun02.gat", "tur_dun03.gat", "tur_dun04.gat";
- setarray @DLevelName$[@Dref], "Outside", "Level 1", "Level 2", "Level 3";
- setarray @DXcoords[@Dref], 161, 148, 132, 100;
- setarray @DYcoords[@Dref], 34, 256, 190, 192;
- setarray @DDepth[@Dref], 0, 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 26;
-
-//----------------UMBALA
- setarray @pDmenuitems$[@Di], "Umbala Dungeon";
- setarray @pDprice[@Di], $QW_OW_PRICE;
- setarray @pDfee$[@Di], "$QW_OW_FEE";
- setarray @DLevels[@Di], 3;
-
- setarray @DGat$[@Dref], "um_dun01.gat", "um_dun02.gat", "yggdrasil01.gat";
- setarray @DLevelName$[@Dref], "Carpenter's Shop in The Tree", "Passage to a Foreign World", "Hvergelmir's Fountain";
- setarray @DXcoords[@Dref], 205, 48, 40;
- setarray @DYcoords[@Dref], 16, 30, 63;
- setarray @DDepth[@Dref], 0, 1, 2;
-
- QWS_Make_Dungeon_Menu 27;
-
-//----------------Cancel
- setarray @pDmenuitems$[@Di], "Cancel";
- setarray @pDprice[@Di], 0;
-
- set @Dmenulist$[@Dj],@pDmenuitems$[@Di];
- set @Dmenuref[@Dj],57005; // 57005='dead' in hex
- return;
-
-
-//----------------Make Dungeon Menu Function
-
-function QWS_Make_Dungeon_Menu {
- set @tempdungeonmenubin,1;
- if (getarg(0) == 0) goto menu_item;
- set @temploopdungeonmenu,0;
- do {
- set @tempdungeonmenubin, @tempdungeonmenubin * 2;
- set @temploopdungeonmenu, @temploopdungeonmenu + 1;
- }while (getarg(0) > @temploopdungeonmenu);
-// check marker and make menu item
-menu_item:
- if ((@tempdungeonmenubin & ##QWS_D_Unlock) != @tempdungeonmenubin) {
- setarray @DLocRef[@Di], @Dref;
- set @Dref, @Dref+@DLevels[@Di];
- set @Di,@Di+1;
- return;
- }
- if ($QW_MapUserShow == 1) {
- set @tempmapusers,0;
- set @mapusersloop,0;
- do {
- set @tempmapusers,(getmapusers(@DGat$[@Dref+@mapusersloop]) + @tempmapusers);
- set @mapusersloop, (@mapusersloop + 1);
- }while (@DLevels[@Di] > @mapusersloop);
- if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"] -> "+@pDprice[@Di];
- if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"]";
- set @Dmenuref[@Dj],@Di;
- set @Dj,@Dj+1;
- setarray @DLocRef[@Di], @Dref;
- set @Dref, @Dref+@DLevels[@Di];
- set @Di,@Di+1;
- return;
- }
- if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" -> "+@pDprice[@Di];
- if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di];
- set @Dmenuref[@Dj],@Di;
- set @Dj,@Dj+1;
- setarray @DLocRef[@Di], @Dref;
- set @Dref, @Dref+@DLevels[@Di];
- set @Di,@Di+1;
- return;
-
-}
-}
-
-function script QWS_DLarray {
-//----------------Start building Menu
- set @DWref,@DLocRef[@DwarpMenu]; // That's our reference to the arrays with leveldata.
- set @DWi,0; // That's our loop counter.
- set @DWj,0; // That's the menu lines counter.
- cleararray @DWLmenulist$[0],"",20; // Clearing the array to get rid off ghost items in menu
- do {
- if ($QW_DL == 0 || $QW_DDL >= @DDepth[@DWref]) {
- set @warpprice, (@pDprice[@DwarpMenu]+ (getd(@pDfee$[@DwarpMenu])*@DDepth[@DWref]));
-
- if (@warpprice != 0 && $QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" -> "+@warpprice;
- if (@warpprice == 0 && $QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref];
- if (@warpprice != 0 && $QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"] -> "+@warpprice;
- if (@warpprice == 0 && $QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"]";
- set @DWLmenuref[@DWj],@DWref;
-
- set @DWj,@DWj+1;
- }
- set @DWref, @DWref+1;
- set @DWi,@DWi+1;
- }while (@DWi < @DLevels[@DwarpMenu]);
- set @DWLmenulist$[@DWj], "Exit";
- set @DWLmenuref[@DWj],57005; // 57005='dead' in hex
- return;
- }
-
-
-//=================Backwards=Compatibility=Pre=1.8=================
-
-function script QWS_BackComp {
-// reference where i put the towns: "Prontera"[0], "Alberta"[1], "Aldebaran"[2], "Amatsu"[3], "Ayothaya"[4], "Comodo"[5], "Einbech"[6], "Einbroch"[7], "Geffen"[8], "Gonryun"[9], "Hugel"[10], "Izlude"[11], "Jawaii"[12], "Lighthalzen"[13], "Louyang"[14], "Lutie"[15], "Morroc"[16], "Niflheim"[17], "Payon"[18], "Umbala"[19], "Yuno"[20];
-// reference where i put the dungeons: "Abyss Lake"[0], "Amatsu Dungeon"[1], "Ant Hell Dungeon"[2], "Ayotaya Dungeon"[3], "Byalan Dungeon"[4], "Clock Tower Dungeon"[5], "Coal Mine Dungeon"[6], "Culvert Dungeon"[7], "Einbech Dungeon"[8], "Gefenia Dungeon"[9], "Geffen Dungeon"[10], "Glast Heim Dungeon"[11], "Gonryun Dungeon"[12], "Hidden Dungeon"[13], "Juperos Cave"[14], "Lighthalzen Bio Lab"[15], "Louyang Dungeon"[16], "Magma Dungeon"[17], "Odin Temple"[18], "Orc Dungeon"[19], "Payon Dungeon"[20], "Pyramids Dungeon"[21], "Sphinx Dungeon"[22], "Sunken Ship Dungeon"[23], "Thanatos Tower"[24], "Toy Factory Dungeon"[25], "Turtle Island Dungeon"[26], "Umbala Dungeon"[27], "Kiel Dungeon[28];
-// also clears variables so that the account file variables can be used for something else variable 0 = variable delete on next save
-
-// Towns
- set @towntemp,0;
- if (#prontera != 0) set @towntemp,@towntemp + 1;
- if (#alberta != 0) set @towntemp,@towntemp + 2;
- if (#aldebaran != 0) set @towntemp,@towntemp + 4;
- if (#amatsu != 0) set @towntemp,@towntemp + 8;
- if (#ayotaya != 0) set @towntemp,@towntemp + 16;
- if (#comodo != 0) set @towntemp,@towntemp + 32;
- if (#einbech != 0) set @towntemp,@towntemp + 64;
- if (#einbroch != 0) set @towntemp,@towntemp + 128;
- if (#geffen != 0) set @towntemp,@towntemp + 256;
- if (#gonryun != 0) set @towntemp,@towntemp + 512;
- if (#hugel != 0) set @towntemp,@towntemp + 1024;
- if (#izlude != 0) set @towntemp,@towntemp + 2048;
- if (#jawaii != 0) set @towntemp,@towntemp + 4096;
- if (#lighthalzen != 0) set @towntemp,@towntemp + 8192;
- if (#louyang != 0) set @towntemp,@towntemp + 16384;
- if (#xmas != 0) set @towntemp,@towntemp + 32768;
- if (#morocc != 0) set @towntemp,@towntemp + 65536;
- if (#niflheim != 0) set @towntemp,@towntemp + 131072;
- if (#payon != 0) set @towntemp,@towntemp + 262144;
- if (#umbala != 0) set @towntemp,@towntemp + 524288;
- if (#yuno != 0) set @towntemp,@towntemp + 1048576;
-// Clear Town variables
- set #prontera,0;
- set #alberta,0;
- set #aldebaran,0;
- set #amatsu,0;
- set #ayotaya,0;
- set #comodo,0;
- set #einbech,0;
- set #einbroch,0;
- set #geffen,0;
- set #gonryun,0;
- set #hugel,0;
- set #izlude,0;
- set #jawaii,0;
- set #lighthalzen,0;
- set #louyang,0;
- set #xmas,0;
- set #morocc,0;
- set #niflheim,0;
- set #payon,0;
- set #umbala,0;
- set #yuno,0;
-// set Town warp unlock variable
-set ##QWS_T_Unlock, (##QWS_T_Unlock | @towntemp);
- //because multiple account servers now stack on 1 variable i used a 'or' to stack them
-// Dungeons
- set @dungeontemp,0;
- if (#abyss != 0) set @dungeontemp,@dungeontemp + 1;
- if (#ama_dun != 0) set @dungeontemp,@dungeontemp + 2;
- if (#anthell != 0) set @dungeontemp,@dungeontemp + 4;
- if (#ayotaya_dun != 0) set @dungeontemp,@dungeontemp + 8;
- if (#iz_dun != 0) set @dungeontemp,@dungeontemp + 16;
- if (#c_tower != 0) set @dungeontemp,@dungeontemp + 32;
- if (#mjo_dun != 0) set @dungeontemp,@dungeontemp + 64;
- if (#prt_sewb != 0) set @dungeontemp,@dungeontemp + 128;
- if (#einbech_dun != 0) set @dungeontemp,@dungeontemp + 256;
- if (#gefenia != 0) set @dungeontemp,@dungeontemp + 512;
- if (#gef_dun != 0) set @dungeontemp,@dungeontemp + 1024;
- if (#gl_dun != 0) set @dungeontemp,@dungeontemp + 2048;
- if (#gon_dun != 0) set @dungeontemp,@dungeontemp + 4096;
- if (#hid_dun != 0) set @dungeontemp,@dungeontemp + 8192;
- if (#juperos != 0) set @dungeontemp,@dungeontemp + 16384;
- if (#lighthalzen_dun != 0) set @dungeontemp,@dungeontemp + 32768;
- if (#louyang_dun != 0) set @dungeontemp,@dungeontemp + 65536;
- if (#mag_dun != 0) set @dungeontemp,@dungeontemp + 131072;
- if (#odintemple != 0) set @dungeontemp,@dungeontemp + 262144;
- if (#orcsdun != 0) set @dungeontemp,@dungeontemp + 524288;
- if (#pay_dun != 0) set @dungeontemp,@dungeontemp + 1048576;
- if (#moc_pryd != 0) set @dungeontemp,@dungeontemp + 2097152;
- if (#in_sphinx != 0) set @dungeontemp,@dungeontemp + 4194304;
- if (#treasure != 0) set @dungeontemp,@dungeontemp + 8388608;
- if (#thanatos_tower != 0) set @dungeontemp,@dungeontemp + 16777216;
- if (#xmas_dun != 0) set @dungeontemp,@dungeontemp + 33554432;
- if (#tur_dun != 0) set @dungeontemp,@dungeontemp + 67108864;
- if (#um_dun != 0) set @dungeontemp,@dungeontemp + 134217728;
-// Clear Dungeon variables
- set #abyss,0;
- set #ama_dun,0;
- set #anthell,0;
- set #ayotaya_dun,0;
- set #iz_dun,0;
- set #c_tower,0;
- set #mjo_dun,0;
- set #prt_sewb,0;
- set #einbech_dun,0;
- set #gefenia,0;
- set #gef_dun,0;
- set #gl_dun,0;
- set #gon_dun,0;
- set #hid_dun,0;
- set #juperos,0;
- set #lighthalzen_dun,0;
- set #louyang_dun,0;
- set #mag_dun,0;
- set #odintemple,0;
- set #orcsdun,0;
- set #pay_dun,0;
- set #moc_pryd,0;
- set #in_sphinx,0;
- set #treasure,0;
- set #thanatos_tower,0;
- set #xmas_dun,0;
- set #tur_dun,0;
- set #um_dun,0;
-// set Town warp unlock variable
-set ##QWS_D_Unlock, (##QWS_D_Unlock | @dungeontemp);
-//mark that this character has done the upgrade to 1.8
-set ##QWS_UP,18;
-return;
-}
-
-
-//===================Extra=Variable=Clear=Pre=1.8==================
-function script Extra_Variable_Clear {
-// Clear Town variables
- set #prontera,0;
- set #alberta,0;
- set #aldebaran,0;
- set #amatsu,0;
- set #ayotaya,0;
- set #comodo,0;
- set #einbech,0;
- set #einbroch,0;
- set #geffen,0;
- set #gonryun,0;
- set #hugel,0;
- set #izlude,0;
- set #jawaii,0;
- set #lighthalzen,0;
- set #louyang,0;
- set #xmas,0;
- set #morocc,0;
- set #niflheim,0;
- set #payon,0;
- set #umbala,0;
- set #yuno,0;
-
-// Clear Dungeon variables
- set #abyss,0;
- set #ama_dun,0;
- set #anthell,0;
- set #ayotaya_dun,0;
- set #iz_dun,0;
- set #c_tower,0;
- set #mjo_dun,0;
- set #prt_sewb,0;
- set #einbech_dun,0;
- set #gefenia,0;
- set #gef_dun,0;
- set #gl_dun,0;
- set #gon_dun,0;
- set #hid_dun,0;
- set #juperos,0;
- set #lighthalzen_dun,0;
- set #louyang_dun,0;
- set #mag_dun,0;
- set #odintemple,0;
- set #orcsdun,0;
- set #pay_dun,0;
- set #moc_pryd,0;
- set #in_sphinx,0;
- set #treasure,0;
- set #thanatos_tower,0;
- set #xmas_dun,0;
- set #tur_dun,0;
- set #um_dun,0;
-
-// as the account based variables are limited just run this on every character to save some variables
-set QWS_ExtraVARClear,18;
-return;
-}
-
-//================Dungeon=Warpras=That=Only=Unlock=================
-
-function script QWS_Dungeon_Warpra {
- function QWS_D_getbin;
- function QWS_D_setbin;
-
- if (QWS_D_getbin(getarg(0)) == 0 && getarg(1) != "") {
- mes "[Warpra]";
- mes getarg(1)+" unlocked!";
- QWS_D_setbin(getarg(0));
- return;
- } else if (QWS_D_getbin(getarg(0)) == 1){
- mes "[Warpra]";
- mes "Sorry I can only unlock this location.";
- } else
- debugmes "QWS_Dungeon_Warpra error, improper syntax ?";
- return;
-
-
-function QWS_D_setbin {
- set @tempsetbindata,1;
- if (getarg(0) == 0) goto binset;
- set @temploopsetbin,0;
- do {
- set @tempsetbindata, @tempsetbindata * 2;
- set @temploopsetbin, @temploopsetbin + 1;
- } while (getarg(0) > @temploopsetbin);
-binset:
- set ##QWS_D_Unlock,(##QWS_D_Unlock | @tempsetbindata);
- return;
-}
-
-function QWS_D_getbin {
- set @tempgetbindata,1;
- if (getarg(0) == 0) goto binget;
- set @temploopgetbin,0;
- do {
- set @tempgetbindata, @tempgetbindata * 2;
- set @temploopgetbin, @temploopgetbin + 1;
- } while (getarg(0) > @temploopgetbin);
-binget:
- if ((@tempgetbindata & ##QWS_D_Unlock) == @tempgetbindata) return 1;
- return 0;
-}
-}
-
-//==========================Town=Warpras===========================
-
-function script QWS_Town_Warpra {
- function QWS_T_getbin;
- function QWS_T_setbin;
-
- if (QWS_T_getbin(getarg(0)) == 0 && getarg(1) != "") {
- mes "[Warpra]";
- mes getarg(1)+" unlocked!";
- QWS_T_setbin(getarg(0));
- return;
- } else if (QWS_T_getbin(getarg(0)) == 1){
-callfunc "Q_Warpra",0;
- } else
- debugmes "QWS_Town_Warpra error, improper syntax ?";
- return;
-
-
-function QWS_T_setbin {
- set @tempsetbindata,1;
- if (getarg(0) == 0) goto binset;
- set @temploopsetbin,0;
- do {
- set @tempsetbindata, @tempsetbindata * 2;
- set @temploopsetbin, @temploopsetbin + 1;
- } while (getarg(0) > @temploopsetbin);
-binset:
- set ##QWS_T_Unlock,(##QWS_T_Unlock | @tempsetbindata);
- return;
-}
-
-function QWS_T_getbin {
- set @tempgetbindata,1;
- if (getarg(0) == 0) goto binget;
- set @temploopgetbin,0;
- do {
- set @tempgetbindata, @tempgetbindata * 2;
- set @temploopgetbin, @temploopgetbin + 1;
- } while (getarg(0) > @temploopgetbin);
-binget:
- if ((@tempgetbindata & ##QWS_T_Unlock) == @tempgetbindata) return 1;
- return 0;
-}
-}
-//============================Warpras==============================
-
-alb2trea.gat,73,101,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-ama_fild01.gat,178,325,1 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-gef_fild10.gat,71,339,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-izlu2dun.gat,104,82,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-mjolnir_02.gat,85,363,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-moc_fild04.gat,207,331,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-moc_fild19.gat,106,97,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-moc_ruins.gat,64,166,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-niflheim.gat,197,192,3 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-pay_arche.gat,39,135,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-prt_fild05.gat,273,215,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-tur_dun01.gat,148,239,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-valkyrie.gat,48,35,8 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-yuno_fild03.gat,37,135,4 script Warpra 113,{
- callfunc "Q_Warpra",1;
-}
-
-alberta.gat,32,240,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",1,"Alberta Town";
- close;
-}
-aldebaran.gat,146,118,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",2,"Aldebaran Town";
- close;
-}
-ayothaya.gat,216,171,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",4,"Ayotaya Town";
- close;
-}
-amatsu.gat,193,81,1 script Warpra 113,{
- callfunc "QWS_Town_Warpra",3,"Amatsu Town";
- close;
-}
-comodo.gat,195,158,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",5,"Comodo Town";
- close;
-}
-einbroch.gat,229,196,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",7,"Einbroch Town";
- close;
-}
-einbech.gat,173,131,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",6,"Einbech Town";
- close;
-}
-geffen.gat,116,66,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",8,"Geffen Town";
- close;
-}
-gonryun.gat,152,130,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",9,"Gonryun Town";
- close;
-}
-hugel.gat,90,127,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",10,"Hugel Town";
- close;
-}
-jawaii.gat,107,182,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",12,"Jawaii Town";
- close;
-}
-izlude.gat,132,116,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",11,"Izlude Town";
- close;
-}
-lighthalzen.gat,153,100,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",13,"Lighthalzen Town";
- close;
-}
-louyang.gat,211,106,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",14,"Louyang Town";
- close;
-}
-morocc.gat,157,95,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",16,"Morroc Town";
- close;
-}
-nif_fild01.gat,319,77,1 script Warpra 113,{
- callfunc "QWS_Town_Warpra",17,"Niflheim Town";
- close;
-}
-payon.gat,183,110,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",18,"Payon Town";
- close;
-}
-prontera.gat,147,172,5 script Warpra 113,{
- callfunc "QWS_Town_Warpra",0,"Prontera Town";
- close;
-}
-umbala.gat,133,130,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",19,"Umbala Town";
- close;
-}
-xmas.gat,151,136,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",15,"Lutie Town";
- close;
-}
-yuno.gat,138,162,4 script Warpra 113,{
- callfunc "QWS_Town_Warpra",20,"Yuno Town";
- close;
-}
-
-abyss_02.gat,274,266,1 script Warpra 113,{
- callfunc "QWS_Dungeon_Warpra",0,"Abyss Lake";
- close;
-}
-
-ama_dun02.gat,192,118,5 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",1,"Amatsu Dungeon";
- close;
-}
-
-anthell02.gat,170,165,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",2,"Ant Hell Dungeon";
- close;
-}
-
-ayo_dun02.gat,258,193,5 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",3,"Ayotaya Dungeon";
- close;
-}
-
-ein_dun02.gat,292,282,1 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",8,"Einbech Dungeon";
- close;
-}
-
-iz_dun03.gat,202,47,2 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",4,"Byalan Dungeon";
- close;
-}
-
-c_tower3.gat,129,106,4 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",5,"Clock Tower Dungeon";
- close;
-}
-
-mjo_dun02.gat,39,25,4 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",6,"Coal Mine Dungeon";
- close;
-}
-
-prt_sewb2.gat,176,30,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",7,"Culvert Dungeon";
- close;
-}
-
-gefenia03.gat,137,34,0 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",9,"Gefenia Dungeon";
- close;
-}
-
-gef_dun02.gat,218,61,2 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",10,"Gefen Dungeon";
- close;
-}
-
-glast_01.gat,371,308,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",11,"Glast Heim Dungeon";
- close;
-}
-
-gon_dun01.gat,167,273,4 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",12,"Gonryun Dungeon";
- close;
-}
-
-juperos_02.gat,127,154,5 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",14,"Juperos Cave";
- close;
-}
-
-kh_dun01.gat,14,224,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",28,"Kiel Dungeon";
- close;
-}
-
-lhz_dun02.gat,156,151,5 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",15,"Lighthalzen Bio Lab";
- close;
-}
-
-lou_dun02.gat,168,264,4 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",16,"Louyang Dungeon";
- close;
-}
-
-mag_dun02.gat,46,41,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",17,"Magma Dungeon";
- close;
-}
-
-odin_tem01.gat,115,148,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",18,"Odin Temple";
- close;
-}
-
-orcsdun01.gat,185,11,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",19,"Orc Dungeon";
- close;
-}
-
-pay_dun03.gat,162,143,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",20,"Payon Dungeon";
- close;
-}
-
-moc_pryd02.gat,101,95,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",21,"Pyramides Dungeon";
- close;
-}
-
-in_sphinx2.gat,274,268,1 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",22,"Sphinx Dungeon";
- close;
-}
-
-tha_t07.gat,111,162,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",24,"Thanatos Tower";
- close;
-}
-
-treasure02.gat,104,40,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",23,"Sunken Ship Dungeon";
- close;
-}
-
-xmas_dun02.gat,124,131,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",25,"Toy Factory Dungeon";
- close;
-}
-
-um_dun02.gat,44,28,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",27,"Umbala Dungeon";
- close;
-}
-
-tur_dun02.gat,162,23,3 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",26,"Turtle Island Dungeon";
- close;
-}
-prt_maze02.gat,102,69,4 script Warpra Helper 112,{
- callfunc "QWS_Dungeon_Warpra",13,"Hidden Dungeon";
- close;
-}
+//===== eAthena Script ============================================
+//= Quest Warper Script
+//===== By: =======================================================
+//= Old Warper 2 by Darkchild - Remade with quest format by DZeroX
+//= Huge Rewrite by Neouni
+//===== Current Version: ==========================================
+//= 2.0c
+//===== Compatible With: ==========================================
+//= Any eAthena Version
+//===== Description: ==============================================
+//= Warper that works only after locations are unlocked
+//===== Warning: ==================================================
+// you have to set the securitycode value [1337] the same as in
+// functions_kafras.txt if you changed it !!
+//===== Additional Comments: ======================================
+//= 1.0 - NPCs created
+//= 1.1 - Add Dungeons by sturm
+//= 1.2 - Add All char in account unlocked by ace_killer
+//= 1.3 - Add new 7 towns and 7 dungeons by escoteiro
+// - Correct bug jawaii town by escoteiro
+// - Remove some excessive warpras by escoteiro
+//= 1.4 - Rewrite of the Warpa system [Neouni]
+// - Corrected some bugs caused by autoconverting the old script
+//= 1.4a - Rewrite of menu to be custom for each player [Neouni]
+// - Dungeon listing rewrite
+// - Town listing rewrite
+// - GameMaster can Customise Main menu
+//= 1.4b - Pricing round [Neouni]
+// - GM menu added for pricing
+// - Town Warp pricing tags added
+// - Dungeon Warp pricing tags added
+//= 1.5 - storage functions pricing [Neouni]
+// - storage pricing added
+// - kafra points setting added
+// - kafra storage code security added
+// - Healing scripts pricing added
+// - Heal Part script added
+//= 1.6 - Dungeon warp [Neouni] (beta only)
+// - added option to add a extra fee for going down deeper into dungeon
+// partly by rebuilding the dungeon warping into variable menu's
+//= 1.6a - alot of fixes for beta release [Neouni] (public release)
+// - fixed syntax problems
+// - fixed missing pyramid gats in @DGat$ array
+// - removed the culver level 5 that didn't exist
+// and caused quite alot of problems (i didn't check while converting)
+//-1.7 - Readability of Dungeon menu building increased [Neouni]
+// - Thanatos Tower & Louyang Dungeon added
+//-1.8 - changed around unlock variables [Neouni]
+// - Moved warp variables to mark what you have unlocked to an binary array in login based permanent variable
+// (warp variables are saved in login database, so all charservers have these unlocked)
+// - Town Warp unlock array max 21/(unknown max) items used instead of max account #variables 32 !
+// - Dungeon Warp unlock array 28/(unknown max) items used instead of max account #variables 32 !
+// - (max login ##variables = 16, i used 3)
+// - old variables are cleared on next save
+// - Extra Variable clear added for every character, just in case (request by Terces)
+//-1.8a - Show ammount of users on map [Neouni]
+// - Default = off, enable in GM menu
+// - Requested by escoteiro
+//-1.8b - Small typo fixed in stampcard script [Neouni]
+// - Reported by escoteiro
+//-1.9 - Making it more edit friendly [Neouni]
+// - Made Dungeon warp arrays more readable & editable (QWS_Darray)
+// - Made town warp arrays more readable & editable (QWS_Tarray)
+//-2.0 - Special Warp menu added [Neouni]
+// - when all towns and dungeons are collected a new option on the main menu will show
+// - it will only show when you setup the mapname of the warp !
+// - requested by escoteiro
+// - several bugs fixed
+//-2.0a - Dungeon Level Limit & Split dungeon fees
+// - Limits dungeon based on Depth, access special setup menu thru GM-Menu
+// - Dungeon fees split up based on Basic , Advanced & Overseas
+// - Old Dungeon fee system removed, all dungeon fees now set to 0
+//-2.0b - Special warpname menu option name bug fixed
+//-2.0c - Parenthesis fixes [KarLaeda]
+//=================================================================
+
+//========================Function=&=Script========================
+
+
+function script Q_Warpra {
+// Quick hack for backwards compatibility pre 1.8
+if (##QWS_UP < 18) callfunc "QWS_BackComp";
+// Extra clear variables because marker is saved on all char servers and variables can be on multiple servers
+if (QWS_ExtraVARClear < 18) callfunc "Extra_Variable_Clear";
+
+ mes "[Warpra]";
+ mes "Hello,";
+ mes "I can warp you to any town or dungeon, but you need to unlock them first.";
+ mes "To unlock them, you have to visit us.";
+ mes "What do you need?";
+
+ if(getarg(0) == 0) callfunc "QWS_MMarray",0;
+ if(getarg(0) == 1) callfunc "QWS_MMarray",1;
+
+ set @MMenu,select(@Mmenulist$[0],@Mmenulist$[1],@Mmenulist$[2],@Mmenulist$[3],@Mmenulist$[4],@Mmenulist$[5],@Mmenulist$[6],@Mmenulist$[7],@Mmenulist$[8],@Mmenulist$[9],@Mmenulist$[10],@Mmenulist$[11]);
+
+ switch(@Mmenuref[@MMenu-1]+1){
+ case 1:
+ goto GM_Menu;
+ case 2:
+ warp $QW_SP_WarpMap$, $QW_SP_WarpX, $QW_SP_WarpY;
+ close2;
+ debugmes "Please check your special warp menu settings on the Warpra";
+ end;
+ case 3:
+ goto L_town;
+ case 4:
+ goto L_dungeon;
+ case 5:
+ goto L_FewWarps;
+ case 6:
+ goto L_NoUnlock;
+ case 7:
+ goto L_heal_Full;
+ case 8:
+ goto L_heal_Part;
+ case 9:
+ goto L_Storage;
+ case 10:
+ goto L_GStorage;
+ case 11:
+ goto L_end;
+ default:
+ goto L_end;
+}
+
+//=====================GM-Menu=Functions===========================
+
+GM_Menu:
+next;
+//----------------Town-Warp
+ if ($QW_TW_OFF == 0) mes "Town warping = ^00FF00 On ^000000";
+ if ($QW_TW_OFF == 1) mes "Town warping = ^FF0000 Off ^000000";
+//----------------Dungeon-Warp
+ if ($QW_DW_OFF == 0) mes "Dungeon warping = ^00FF00 On ^000000";
+ if ($QW_DW_OFF == 1) mes "Dungeon warping = ^FF0000 Off ^000000";
+//----------------Dungeon-Depth-Limit
+ if ($QW_DL == 1) mes "Dungeon Depth limit is ^00FF00 On ^000000";
+ if ($QW_DL == 0) mes "Dungeon Depth limit is ^FF0000 Off ^000000";
+ mes "If on Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
+//----------------ShowMapUsers
+ if ($QW_MapUserShow == 1) mes "Show Map Users = ^00FF00 On ^000000";
+ if ($QW_MapUserShow == 0) mes "Show Map Users = ^FF0000 Off ^000000";
+//----------------Healfull
+ if ($QW_HF == 1) mes "Healing full = ^00FF00 On ^000000";
+//----------------Healpart
+ if ($QW_HP == 1) mes "Healing partly = ^00FF00 On ^000000";
+ if ($QW_HF == 0 && $QW_HP == 0) mes "Healing = ^FF0000 Off ^000000";
+//----------------Storage
+ if ($QW_Stor == 1) mes "Storage = ^00FF00 On ^000000";
+ if ($QW_Stor == 0) mes "Storage = ^FF0000 Off ^000000";
+//----------------GuildStorage
+ if ($QW_GStor == 1) mes "Guild Storage = ^00FF00 On ^000000";
+ if ($QW_GStor == 0) mes "Guild Storage = ^FF0000 Off ^000000";
+//----------------KafraPoints
+ if ($QW_KPoint == 1) mes "Kafra points collect = ^00FF00 On ^000000";
+ if ($QW_KPoint == 0) mes "Kafra points collect = ^FF0000 Off ^000000";
+//----------------GMmenu
+ switch(select("Town Warping","Dungeon Warping","Dungeon Level Limit","Show Map Users","Healing full","Healing partly","Storage","Guild Storage","Kafra points collect","Set Prices","Special Warp","Exit")) {
+
+// Using callsub and a small check to not make 1 part of the script set it on and the other turning it off again
+
+case 1:
+ if ($QW_TW_OFF == 0) {
+ set $QW_TW_OFF,1;
+ goto GM_Menu;
+ } else
+ set $QW_TW_OFF,0;
+ goto GM_Menu;
+case 2:
+ if ($QW_DW_OFF == 0) {
+ set $QW_DW_OFF,1;
+ goto GM_Menu;
+ } else
+ set $QW_DW_OFF,0;
+ goto GM_Menu;
+case 3:
+ goto DungeonLevelLimit;
+case 4:
+ if ($QW_MapUserShow == 0) {
+ set $QW_MapUserShow,1;
+ goto GM_Menu;
+ } else
+ set $QW_MapUserShow,0;
+ goto GM_Menu;
+case 5:
+ if ($QW_HF == 0) {
+ set $QW_HF,1;
+ set $QW_HP,0;
+ goto GM_Menu;
+ } else
+ set $QW_HF,0;
+ goto GM_Menu;
+case 6:
+ if ($QW_HP == 0) {
+ set $QW_HP,1;
+ set $QW_HF,0;
+ goto GM_Menu;
+ } else
+ set $QW_HP,0;
+ goto GM_Menu;
+case 7:
+ if ($QW_Stor == 0) {
+ set $QW_Stor,1;
+ goto GM_Menu;
+ } else
+ set $QW_Stor,0;
+ goto GM_Menu;
+case 8:
+ if ($QW_GStor == 0) {
+ set $QW_GStor,1;
+ goto GM_Menu;
+ } else
+ set $QW_GStor,0;
+ goto GM_Menu;
+case 9:
+ if ($QW_KPoint == 0) {
+ set $QW_KPoint,1;
+ goto GM_Menu;
+ } else
+ set $QW_KPoint,0;
+ goto GM_Menu;
+case 10:
+ goto Setprice;
+case 11:
+ goto SpecialWarpMenu;
+default:
+ close;
+ end;
+}
+
+
+//======================GM-Menu=Pricing============================
+
+Setprice:
+ if ($QW_DW_FEE != 0) set $QW_DW_FEE,0;
+ next;
+ mes "Scroll thru the list to see all the options";
+//----------------Warp-Basic-Price
+ if ($QW_BW_PRICE != 0) mes "Basic - Warps are = ^00FF00 "+$QW_BW_PRICE+" ^000000";
+ if ($QW_BW_PRICE == 0) mes "Basic - Warps are = ^FF0000 Free ^000000";
+//----------------Warp-Advanced-Price
+ if ($QW_AW_PRICE != 0) mes "Advanced - Warps are = ^00FF00 "+$QW_AW_PRICE+" ^000000";
+ if ($QW_AW_PRICE == 0) mes "Advanced - Warps are = ^FF0000 Free ^000000";
+//----------------Warp-Oversea-Price
+ if ($QW_OW_PRICE != 0) mes "Overseas - Warps are = ^00FF00 "+$QW_OW_PRICE+" ^000000";
+ if ($QW_OW_PRICE == 0) mes "Overseas - Warps are = ^FF0000 Free ^000000";
+//----------------Basic-Dungeon-Level-Warp-Fee
+ if ($QW_BW_FEE != 0) mes "Basic Dungeon level warp fee = ^00FF00 "+$QW_BW_FEE+" ^000000 zeny per level";
+ if ($QW_BW_FEE == 0) mes "Basic Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+//----------------Advanced-Dungeon-Level-Warp-Fee
+ if ($QW_AW_FEE != 0) mes "Advanced Dungeon level warp fee = ^00FF00 "+$QW_AW_FEE+" ^000000 zeny per level";
+ if ($QW_AW_FEE == 0) mes "Advanced Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+//----------------Overseas-Dungeon-Level-Warp-Fee
+ if ($QW_OW_FEE != 0) mes "Overseas Dungeon level warp fee = ^00FF00 "+$QW_OW_FEE+" ^000000 zeny per level";
+ if ($QW_OW_FEE == 0) mes "Overseas Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+//----------------Heal-Full
+ if ($QW_HF_PRICE != 0) mes "Full Healing = ^00FF00 "+$QW_HF_PRICE+" ^000000";
+ if ($QW_HF_PRICE == 0) mes "Full Healing = ^FF0000 Free ^000000";
+//----------------Heal-Part
+ if ($QW_HP_H_PRICE != 0) mes "^FF0000HP ^000000Part Healing = ^00FF00 "+$QW_HP_H_PRICE+" ^000000 a point";
+ if ($QW_HP_H_PRICE == 0) mes "^FF0000HP ^000000Part Healing = ^FF0000 Free ^000000";
+ if ($QW_HP_S_PRICE != 0) mes "^0000FFSP ^000000Part Healing = ^00FF00 "+$QW_HP_S_PRICE+" ^000000 a point";
+ if ($QW_HP_S_PRICE == 0) mes "^0000FFSP ^000000Part Healing = ^FF0000 Free ^000000";
+//----------------Storage
+ if ($QW_S_PRICE != 0 && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
+ if ($QW_S_PRICE == 0) mes "Storage = ^FF0000 Free ^000000";
+ if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
+//----------------Guild-Storage
+ if ($QW_GS_PRICE != 0) mes "Guild Storage = ^00FF00 "+$QW_GS_PRICE+" ^000000";
+ if ($QW_GS_PRICE == 0) mes "Guild Storage = ^FF0000 Free ^000000";
+
+ switch(select("Basic - Warps","Advanced - Warps","Overseas - Warps","Basic Dungeon warp fee","Advanced Dungeon warp fee","Overseas Dungeon warp fee","Full Healing","Part Healing","Storage","Guild Storage","Back","Exit")) {
+
+case 1:
+ next;
+ if ($QW_BW_PRICE != 0) mes "Basic - Warps are = ^00FF00 "+$QW_BW_PRICE+" ^000000";
+ if ($QW_BW_PRICE == 0) mes "Basic - Warps are = ^FF0000 Free ^000000";
+ mes "Basic - Warps are starter towns and related dungeons";
+ input $QW_BW_PRICE;
+ goto Setprice;
+
+case 2:
+ next;
+ if ($QW_AW_PRICE != 0) mes "Advanced - Warps are = ^00FF00 "+$QW_AW_PRICE+" ^000000";
+ if ($QW_AW_PRICE == 0) mes "Advanced - Warps are = ^FF0000 Free ^000000";
+ mes "Advanced - Warps are towns and dungeons on the same island but not close to any starter town";
+ input $QW_AW_PRICE;
+ goto Setprice;
+
+case 3:
+ next;
+ if ($QW_OW_PRICE != 0) mes "Overseas - Warps are = ^00FF00 "+$QW_OW_PRICE+" ^000000";
+ if ($QW_OW_PRICE == 0) mes "Overseas - Warps are = ^FF0000 Free ^000000";
+ mes "Overseas - Warps are towns and dungeons overseas reachable by boat from alberta";
+ input $QW_OW_PRICE;
+ goto Setprice;
+
+case 4:
+ next;
+ if ($QW_BW_FEE != 0) mes "Basic Dungeon level warp fee = ^00FF00 "+$QW_BW_FEE+" ^000000 zeny per level";
+ if ($QW_BW_FEE == 0) mes "Basic Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+ mes "Basic - Warps are starter town related dungeons";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
+ mes "These costs are on top of the regular Warp costs";
+ input $QW_BW_FEE;
+ goto Setprice;
+
+case 5:
+ next;
+ if ($QW_AW_FEE != 0) mes "Advanced Dungeon level warp fee = ^00FF00 "+$QW_AW_FEE+" ^000000 zeny per level";
+ if ($QW_AW_FEE == 0) mes "Advanced Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+ mes "Advanced - Warps are dungeons not close to any starter town";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
+ mes "These costs are on top of the regular Warp costs";
+ input $QW_AW_FEE;
+ goto Setprice;
+
+case 6:
+ next;
+ if ($QW_OW_FEE != 0) mes "Overseas Dungeon level warp fee = ^00FF00 "+$QW_OW_FEE+" ^000000 zeny per level";
+ if ($QW_OW_FEE == 0) mes "Overseas Dungeon level warp fee = ^FF0000 NO ^000000 zeny per level";
+ mes "Overseas - Warps are dungeons related to towns overseas reachable by boat from alberta";
+ mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee";
+ mes "These costs are on top of the regular Warp costs";
+ input $QW_OW_FEE;
+ goto Setprice;
+
+case 7:
+ next;
+ if ($QW_HF_PRICE != 0) mes "Full Healing = ^00FF00 "+$QW_HF_PRICE+" ^000000";
+ if ($QW_HF_PRICE == 0) mes "Full Healing = ^FF0000 Free ^000000";
+ mes "Instant full healing 1 price";
+ input $QW_HF_PRICE;
+ goto Setprice;
+
+case 8:
+ next;
+ if ($QW_HP_H_PRICE != 0) mes "^FF0000HP ^000000Part Healing = ^00FF00 "+$QW_HP_H_PRICE+" ^000000 a point";
+ if ($QW_HP_H_PRICE == 0) mes "^FF0000HP ^000000Part Healing = ^FF0000 Free ^000000";
+ if ($QW_HP_S_PRICE != 0) mes "^0000FFSP ^000000Part Healing = ^00FF00 "+$QW_HP_S_PRICE+" ^000000 a point";
+ if ($QW_HP_S_PRICE == 0) mes "^0000FFSP ^000000Part Healing = ^FF0000 Free ^000000";
+ mes "Healing price per 1 HP";
+ mes "Healing price per 1 SP";
+ mes "2 inputs, first HP then SP";
+ input $QW_HP_H_PRICE;
+ input $QW_HP_S_PRICE;
+ goto Setprice;
+
+case 9:
+ next;
+ if ($QW_S_PRICE != 0 && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000";
+ if ($QW_S_PRICE == 0) mes "Storage = ^FF0000 Free ^000000";
+ if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000";
+ mes "Storage cost, if set to 60 Kafra pricing will be handled";
+ input $QW_S_PRICE;
+ goto Setprice;
+
+case 10:
+ next;
+ if ($QW_GS_PRICE != 0) mes "Guild Storage = ^00FF00 "+$QW_GS_PRICE+" ^000000";
+ if ($QW_GS_PRICE == 0) mes "Guild Storage = ^FF0000 Free ^000000";
+ mes "Guild Storage, free on Guild Kafras";
+ input $QW_GS_PRICE;
+ goto Setprice;
+case 11:
+ goto GM_Menu;
+default:
+ close;
+ end;
+}
+
+//======================Special=Warp=Menu==========================
+
+SpecialWarpMenu:
+ if ($QW_SP_Warpname$ == "") set $QW_SP_Warpname$,"Special Warp";
+ next;
+ mes "Scroll down to see all the information";
+ mes "The Special warp menu option will show in the main menu when all towns & dungeons are unlocked";
+ mes "And when the map for special warping has been set";
+ mes "menu option name set to ^0000FF"+$QW_SP_Warpname$+"^000000";
+ if ($QW_SP_WarpMap$ == "") mes "map is currently ^FF0000not^000000 set, and Special warp menu is off";
+ if ($QW_SP_WarpMap$ != "") mes "map is currently set to ^0000FF"+$QW_SP_WarpMap$+"^000000 and Special Warp menu is on";
+ mes "coords are set to ^0000FF"+$QW_SP_WarpX+","+$QW_SP_WarpY+"^000000";
+ switch(select("Set Special Warp name to show in menu", "Set WarpMap","Set Coords","Go Back to GM_Menu","Exit")){
+
+case 1:
+ next;
+ mes "set the name to show in the menu as option";
+ input $QW_SP_Warpname$;
+ goto SpecialWarpMenu;
+case 2:
+ next;
+ mes "set the map in the ^0000FFmapname.gat^000000 format";
+ mes "when this warpmap is set the option for players will show once they meet the requirments";
+ mes "to disable Special Warp Menu option clear this !";
+ input $QW_SP_WarpMap$;
+ goto SpecialWarpMenu;
+case 3:
+ next;
+ mes "First input = Xcoord";
+ mes "Second input = Ycoord";
+ input $QW_SP_WarpX;
+ input $QW_SP_WarpY;
+ goto SpecialWarpMenu;
+case 4:
+ goto GM_Menu;
+default:
+ close;
+ end;
+}
+
+//======================Dungeon=Level=Limit========================
+DungeonLevelLimit:
+ next;
+ if ($QW_DL == 1) mes "Dungeon Depth limit is ^00FF00 On ^000000";
+ if ($QW_DL == 0) mes "Dungeon Depth limit is ^FF0000 Off ^000000";
+ mes "If^00FF00 On ^000000Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000";
+
+ switch(select("Toggle Dungeon Depth Limit", "Set Dungeon Depth Limit","Go Back to GM_Menu","Exit")){
+
+case 1:
+ if ($QW_DL == 0) {
+ set $QW_DL,1;
+ goto DungeonLevelLimit;
+ } else
+ set $QW_DL,0;
+ goto DungeonLevelLimit;
+case 2:
+ next;
+ mes "set limit of Dungeon Depth 0 = entrance";
+ mes "Depth 1 is a map connected to 0 and so on";
+ mes "Shortest Route to map counts as depth";
+ input $QW_DDL;
+ goto DungeonLevelLimit;
+case 3:
+ goto GM_Menu;
+default:
+ close;
+ end;
+}
+
+//===========================Towns=================================
+
+L_town:
+ callfunc "QWS_Tarray";
+
+// Expected maximum is set to 25 items, if you add more options add more ",@Tmenulist$[xx]"
+
+ set @TWMenu,select(@Tmenulist$[0],@Tmenulist$[1],@Tmenulist$[2],@Tmenulist$[3],@Tmenulist$[4],@Tmenulist$[5],@Tmenulist$[6],@Tmenulist$[7],@Tmenulist$[8],@Tmenulist$[9],@Tmenulist$[10],@Tmenulist$[11],@Tmenulist$[12],@Tmenulist$[13],@Tmenulist$[14],@Tmenulist$[15],@Tmenulist$[16],@Tmenulist$[17],@Tmenulist$[18],@Tmenulist$[19],@Tmenulist$[20],@Tmenulist$[21],@Tmenulist$[22],@Tmenulist$[23],@Tmenulist$[24]);
+
+ if (@Tmenuref[@TWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+
+ if(Zeny<@pTprice[@Tmenuref[@TWMenu-1]]) callsub L_Short_on_zeny,0;
+
+ set Zeny, Zeny-@pTprice[@Tmenuref[@TWMenu-1]];
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@pTprice[@Tmenuref[@TWMenu-1]]/16);
+ warp @pTmap$[@Tmenuref[@TWMenu-1]],@pTXcoords[@Tmenuref[@TWMenu-1]],@pTYcoords[@Tmenuref[@TWMenu-1]];
+ close2; // this part safegaurds against errors/typos
+ set Zeny, Zeny+@pTprice[@Tmenuref[@TWMenu-1]];
+ end;
+
+//=========================Dungeons================================
+
+L_dungeon:
+ callfunc "QWS_Darray";
+
+// Expected maximum is set to 35 items, if you add more options add more ",@Dmenulist$[xx]"
+
+ set @DWMenu,select(@Dmenulist$[0],@Dmenulist$[1],@Dmenulist$[2],@Dmenulist$[3],@Dmenulist$[4],@Dmenulist$[5],@Dmenulist$[6],@Dmenulist$[7],@Dmenulist$[8],@Dmenulist$[9],@Dmenulist$[10],@Dmenulist$[11],@Dmenulist$[12],@Dmenulist$[13],@Dmenulist$[14],@Dmenulist$[15],@Dmenulist$[16],@Dmenulist$[17],@Dmenulist$[18],@Dmenulist$[19],@Dmenulist$[20],@Dmenulist$[21],@Dmenulist$[22],@Dmenulist$[23],@Dmenulist$[24],@Dmenulist$[25],@Dmenulist$[26],@Dmenulist$[27],@Dmenulist$[28],@Dmenulist$[29],@Dmenulist$[30],@Dmenulist$[31],@Dmenulist$[32],@Dmenulist$[33],@Dmenulist$[34]);
+
+ if (@Dmenuref[@DWMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+ set @DwarpMenu, (@Dmenuref[@DWMenu-1]);
+ callfunc "QWS_DLarray";
+
+ next;
+ mes "[Warpra]";
+ mes "Please select where you want to go";
+
+// Expected maximum is set to 18 items, if you have dungeons with more levels add more ",@DWLmenulist$[xx]"
+ set @DWLMenu,select(@DWLmenulist$[0], @DWLmenulist$[1], @DWLmenulist$[2], @DWLmenulist$[3], @DWLmenulist$[4], @DWLmenulist$[5], @DWLmenulist$[6], @DWLmenulist$[7], @DWLmenulist$[8], @DWLmenulist$[9], @DWLmenulist$[10], @DWLmenulist$[11], @DWLmenulist$[12], @DWLmenulist$[13], @DWLmenulist$[14], @DWLmenulist$[15], @DWLmenulist$[16], @DWLmenulist$[17]);
+
+ if (@DWLmenuref[@DWLMenu-1] == 57005) goto L_end; // 57005='dead' in hex
+
+ set @Darrayref, @DWLmenuref[@DWLMenu-1];
+ set @warpprice, @pDprice[@Dmenuref[@DWMenu-1]]+(getd(@pDfee$[@Dmenuref[@DWMenu-1]])*(@DDepth[@Darrayref]));
+
+ if(Zeny<@warpprice) callsub L_Short_on_zeny,1;
+
+ set Zeny, Zeny-(@warpprice);
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@warpprice/16);
+ warp @DGat$[@Darrayref],@DXcoords[@Darrayref],@DYcoords[@Darrayref];
+ close2; // this part safegaurds against errors/typos
+ set Zeny, Zeny+@pTprice[@Tmenuref[@DWMenu-1]];
+ end;
+
+//=============================Healing=============================
+
+L_heal_Full:
+ set @healfee, $QW_HF_PRICE;
+ if(Zeny<@healfee) callsub L_Short_on_zeny,4;
+ set Zeny, Zeny-@healfee;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@healfee/500);
+ next;
+ mes "[Warpra]";
+ mes "Close this window and I will Heal you.";
+ close2;
+ percentheal 100,100;
+ end;
+
+L_heal_Part:
+ set @healchoice,select("Full heal","Health Points only","Skill Points only","Exit");
+ if (@healchoice == 1) callsub PHeal,1,1;
+ if (@healchoice == 2) callsub PHeal,1,0;
+ if (@healchoice == 3) callsub PHeal,0,1;
+ goto L_end;
+
+PHeal:
+ next;
+ set @Hp, MaxHp-Hp;
+ set @Sp, MaxSp-Sp;
+ set @HpPrice, @hp*$QW_HP_H_PRICE;
+ set @SpPrice, @sp*$QW_HP_S_PRICE;
+ mes "[Warpra]";
+ if(getarg(0) == 1) mes ""+@HpPrice+" Zeny for "+@Hp+" health points";
+ if(getarg(1) == 1) mes ""+@SpPrice+" Zeny for "+@Sp+" skill points";
+ set @total, @HpPrice+@SpPrice;
+ mes "for a total of "+@total+" zeny";
+ if (select("Heal me","Let me see the choices again")==2) goto L_heal_Part;
+
+ if(getarg(0) == 1)set @HpPrice, (MaxHp-Hp)*$QW_HP_H_PRICE;
+ if(getarg(1) == 1)set @SpPrice, (MaxSp-Sp)*$QW_HP_S_PRICE;
+ set @healfee, @HpPrice+@SpPrice;
+ if (getarg(0) == 1 && getarg(1) == 1 && Zeny<@healfee) goto Zeny_Short_Both;
+ if (getarg(0) == 1 && Zeny<@healfee) goto Zeny_short_HP;
+ if (getarg(1) == 1 && Zeny<@healfee) goto Zeny_short_SP;
+ set Zeny, Zeny-@healfee;
+ if (getarg(0) == 1 && getarg(1) == 1) percentheal 100,100;
+ if (getarg(0) == 1) percentheal 100,0;
+ if (getarg(1) == 1) percentheal 0,100;
+ close;
+ end;
+
+Zeny_Short_Both:
+ mes "[Warpra]";
+ mes "choose another option, you can afford both.";
+ mes "I can heal as much as you can afford too.";
+ if (select("OK","Exit") == 2) goto L_end;
+ goto PHeal;
+
+Zeny_short_HP:
+ mes "[Warpra]";
+ mes "do you want me to partly heal your HP ?";
+ if (select("Yes","No") == 2) goto L_end;
+ set @Hp, Zeny/$QW_HP_H_PRICE;
+ set @HpPrice, @Hp*$QW_HP_H_PRICE;
+ if (@Hp == 1) mes "your not worth the effort";
+ if (@Hp == 1) goto L_end;
+ set Zeny, Zeny-@HpPrice;
+ heal @Hp,0;
+ close;
+ end;
+
+Zeny_short_SP:
+ mes "[Warpra]";
+ mes "do you want me to partly heal your SP ?";
+ if (select("Yes","No") == 2) goto L_end;
+ set @Sp, Zeny/$QW_HP_S_PRICE;
+ set @SpPrice, @Sp*$QW_HP_S_PRICE;
+ if (@Sp == 1) mes "your not worth the effort";
+ if (@Sp == 1) goto L_end;
+ set Zeny, Zeny-@SpPrice;
+ heal 0,@Sp;
+ close;
+ end;
+
+//=============================Storage=============================
+
+L_Storage:
+ next;
+ if(basicskillcheck(0) > 0 && getskilllv(1) < 6) goto L_StorageJBlow;
+ set @fee, $QW_S_PRICE;
+ if ($QW_S_PRICE == 60 && BaseJob == Job_Novice) set @fee, 30;
+ if(Zeny<@fee) callsub L_Short_on_zeny,2;
+ set Zeny, Zeny-@fee;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@fee/5);
+
+ mes "[Warpra]";
+ mes "Close this window and i will open your storage.";
+
+ callsub F_CheckKafCode; //check your storage password thru kafra coding, if set
+
+ close2;
+ openstorage;
+ end;
+
+F_CheckKafCode:
+// you have to set the 1337 value the same as in functions_kafras.txt if you changed it !!
+ if(#kafra_code==0) return;
+ mes "Enter your storage password:";
+ set @code_,0;
+ input @code_;
+ if(@code_ != #kafra_code-getcharid(3)-1337) {
+ dispbottom "Wrong storage password.";
+ close;
+ }
+ set @kafcode_try,0;
+ set @code_,0;
+ return;
+
+L_StorageJBlow:
+ mes "[Warpra]";
+ mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage.";
+ return;
+
+L_GStorage:
+ if(@GID==0) goto L_NoGuild;
+ if(Zeny<$QW_GS_PRICE) callsub L_Short_on_zeny,3;
+ set Zeny, Zeny-$QW_GS_PRICE;
+ if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + ($QW_GS_PRICE/5);
+ next;
+ mes "[Warpra]";
+ mes "Close this window and i will open the ^5533FF" + GetGuildName(@GID) + "^000000 storage.";
+ close2;
+ guildopenstorage;
+ end;
+
+L_NoGuild:
+ next;
+ mes "[Warpra]";
+ mes "You are not a part of a guild I can't help you.";
+ close;
+ end;
+
+L_end:
+ close;
+ end;
+
+//============================Few=Warp=============================
+L_FewWarps:
+ next;
+ mes "[Warpra ]";
+ mes "You need to unlock locations before they come available to you.";
+ mes "To unlock a location talk to my colleagues all over the world.";
+ mes "Each account got it's own stamp card.";
+ mes "Want me to check what stamps you have collected so far ?.";
+ if (select("Yes","No")==1) callsub stampcard;
+ close;
+ end;
+
+
+//============================No=Unlock============================
+
+L_NoUnlock:
+ next;
+ mes "[Warpra ]";
+ mes "I don't unlock this location, my assistant deeper in the dungeon will unlock this place.";
+ close;
+ end;
+
+//=========================Short=On=Zeny===========================
+L_Short_on_zeny:
+ next;
+ if (getarg(0) == 0) mes "you don't seem to have "+@pTprice[@Tmenuref[@TWMenu-1]]+" zeny, to pay for the warp fee to "+@pTmenuitems$[@Tmenuref[@TWMenu-1]]+"";
+ if (getarg(0) == 1) mes "you don't seem to have "+@warpprice+" zeny, to pay for the warp fee to "+@DLevelName$[@DWLmenuref[@DWLMenu-1]]+" at "+@pDmenuitems$[@Dmenuref[@DWMenu-1]]+"";
+ if (getarg(0) == 2) mes "you don't seem to have "+@fee+" zeny, to pay for the storage fee";
+ if (getarg(0) == 3) mes "you don't seem to have "+$QW_GS_PRICE+" zeny, to pay for the guild storage fee";
+ if (getarg(0) == 4) mes "you don't seem to have "+@healfee+" zeny, to pay for your healing";
+ close;
+ end;
+
+//===========================Stamp=Card============================
+stampcard:
+// Counting of the ammount of places you have unlocked
+ next;
+ mes "Let me check what Towns you have";
+
+ callfunc "QWS_TownStamps";
+
+ mes "you collected^00FF00 "+@Tstamp+" of "+@MaxTstamp+" ^000000Towns.";
+ if (@Tstamp == 15) mes "They say there is an island you can only get to when married";
+ if (@Tstamp == 15) emotion 18;
+ next;
+
+ mes "Let me check what dungeons you have";
+
+ callfunc "QWS_DungeonStamps";
+
+ mes "you collected^00FF00 "+@Dstamp+" of "+@MaxDstamp+" ^000000Dungeons";
+ mes "To unlock a dungeon, search for my colleague.";
+ mes "You can usually find them near the middle or end of the dungeon";
+ return;
+}
+
+function script QWS_TownStamps {
+ set @Tstamp,0;
+ set @MaxTstamp,21; //maximum number of towns
+ set @binvalue,1;
+ set @Tstamploop,0;
+ do {
+ if ((@binvalue & ##QWS_T_Unlock) == @binvalue) set @Tstamp,@Tstamp+1;
+
+ set @binvalue, @binvalue *2;
+ set @Tstamploop, @Tstamploop + 1;
+
+}while (@Tstamploop < @MaxTstamp);
+return;
+}
+
+function script QWS_DungeonStamps {
+ set @Dstamp,0;
+ set @MaxDstamp,29; //maximum number of dungeons
+ set @binvalue,1;
+ set @Dstamploop,0;
+ do {
+ if ((@binvalue & ##QWS_D_Unlock) == @binvalue) set @Dstamp,@Dstamp+1;
+
+ set @binvalue, @binvalue *2;
+ set @Dstamploop, @Dstamploop + 1;
+
+}while (@Dstamploop < @MaxDstamp);
+return;
+}
+
+//======================Main=Menu=Array============================
+
+function script QWS_MMarray {
+
+// Currently 9 items
+
+ setarray @pMmenuitems$[0], "GameMaster Menu", $QW_SP_Warpname$, "Warp to Towns", "Warp to Dungeons", "Why so few Warps ?", "Why don't you Unlock this location ?", "Heal", "Heal", "Storage", "Guild Storage", "Cancel";
+ set @Mi,0; // That's our loop counter.
+ set @Mj,0; // That's the menu lines counter.
+//----------------GameMaster-Menu
+ if (getgmlevel(80)) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if (getgmlevel(80)) set @Mmenuref[@Mj],@Mi;
+ if (getgmlevel(80)) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Special-Warp
+ callfunc "QWS_TownStamps";
+ callfunc "QWS_DungeonStamps";
+ if (@Tstamp == @MaxTstamp && @Dstamp == @MaxDstamp && $QW_SP_WarpMap$ != "") {
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ }
+ set @Mi,@Mi+1;
+//----------------Town-Warp
+ if ($QW_TW_OFF == 0) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_TW_OFF == 0) set @Mmenuref[@Mj],@Mi;
+ if ($QW_TW_OFF == 0) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Dungeon-Warp
+ if ($QW_DW_OFF == 0) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_DW_OFF == 0) set @Mmenuref[@Mj],@Mi;
+ if ($QW_DW_OFF == 0) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Why-So-Few-Warps
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------No-Unlock
+ if (getarg(0) == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if (getarg(0) == 1) set @Mmenuref[@Mj],@Mi;
+ if (getarg(0) == 1) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Healfull
+ if ($QW_HF == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_HF == 1) set @Mmenuref[@Mj],@Mi;
+ if ($QW_HF == 1) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Healpart
+ if ($QW_HP == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_HP == 1) set @Mmenuref[@Mj],@Mi;
+ if ($QW_HP == 1) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Storage
+ if ($QW_Stor == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_Stor == 1) set @Mmenuref[@Mj],@Mi;
+ if ($QW_Stor == 1) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------GuildStorage
+ if ($QW_GStor == 1) set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ if ($QW_GStor == 1) set @Mmenuref[@Mj],@Mi;
+ if ($QW_GStor == 1) set @Mj,@Mj+1;
+ set @Mi,@Mi+1;
+//----------------Cancel
+ set @Mmenulist$[@Mj],@pMmenuitems$[@Mi];
+ set @Mmenuref[@Mj],@Mi;
+ return;
+ }
+
+
+
+//======================Town=Menu=Array============================
+
+//----------------Prontera // I do this to find back sections quickly altho almost the same name is a line below it now
+// setarray @pTmenuitems$[@Ti], "Prontera"; // Name of Town shown in Town select Menu
+// setarray @pTprice[@Ti], $QW_BW_PRICE; // warp prices (Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas $QW_OW_PRICE)
+//
+// setarray @pTmap$[@Ti], "prontera.gat"; // mapfilename of town
+// setarray @pTXcoords[@Ti], 156; // X warp coords
+// setarray @pTYcoords[@Ti], 187; // Y warp coords
+//
+// QWS_Make_Town_Menu XXX;
+//
+// the full wap commands send out by this script for these example would be
+//warp example_01.gat 123 123
+//
+// use the same XXX number as you used when making your own town warpra
+// Read below how
+//
+// example:
+//
+//syntax:
+//mapname.gat,xcoord,ycoord,directionfacing script Name of NPC NPC-ID,{
+//
+// Full example using fake map & coords
+//
+//example_01.gat,213,213,4 script Warpra 112,{
+// callfunc "QWS_Town_Warpra",XXX,"A FAKE TOWN FOR EXAMPLE";
+// close;
+// }
+// use a free number for XXX, last used is 20, for Yuno
+
+function script QWS_Tarray {
+ function QWS_Make_Town_Menu;
+
+ set @Ti,0; // That's our loop counter.
+ set @Tj,0; // That's the menu lines counter.
+//----------------Prontera
+ setarray @pTmenuitems$[@Ti], "Prontera";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "prontera.gat";
+ setarray @pTXcoords[@Ti], 156;
+ setarray @pTYcoords[@Ti], 187;
+
+ QWS_Make_Town_Menu 0;
+//----------------Alberta
+ setarray @pTmenuitems$[@Ti], "Alberta";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "alberta.gat";
+ setarray @pTXcoords[@Ti], 27;
+ setarray @pTYcoords[@Ti], 236;
+
+ QWS_Make_Town_Menu 1;
+//----------------Aldebaran
+ setarray @pTmenuitems$[@Ti], "Aldebaran";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "aldebaran.gat";
+ setarray @pTXcoords[@Ti], 145;
+ setarray @pTYcoords[@Ti], 120;
+
+ QWS_Make_Town_Menu 2;
+//----------------Amatsu:
+ setarray @pTmenuitems$[@Ti], "Amatsu";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "amatsu.gat";
+ setarray @pTXcoords[@Ti], 197;
+ setarray @pTYcoords[@Ti], 86;
+
+ QWS_Make_Town_Menu 3;
+//----------------Ayothaya:
+ setarray @pTmenuitems$[@Ti], "Ayothaya";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "ayothaya.gat";
+ setarray @pTXcoords[@Ti], 150;
+ setarray @pTYcoords[@Ti], 57;
+
+ QWS_Make_Town_Menu 4;
+//----------------Comodo:
+ setarray @pTmenuitems$[@Ti], "Comodo";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "comodo.gat";
+ setarray @pTXcoords[@Ti], 188;
+ setarray @pTYcoords[@Ti], 161;
+
+ QWS_Make_Town_Menu 5;
+//----------------Einbech:
+ setarray @pTmenuitems$[@Ti], "Einbech";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "einbech.gat";
+ setarray @pTXcoords[@Ti], 172;
+ setarray @pTYcoords[@Ti], 126;
+
+ QWS_Make_Town_Menu 6;
+//----------------Einbroch:
+ setarray @pTmenuitems$[@Ti], "Einbroch";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "einbroch.gat";
+ setarray @pTXcoords[@Ti], 230;
+ setarray @pTYcoords[@Ti], 191;
+
+ QWS_Make_Town_Menu 7;
+//----------------Geffen:
+ setarray @pTmenuitems$[@Ti], "Geffen";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "geffen.gat";
+ setarray @pTXcoords[@Ti], 119;
+ setarray @pTYcoords[@Ti], 66;
+
+ QWS_Make_Town_Menu 8;
+//----------------Gonryun:
+ setarray @pTmenuitems$[@Ti], "Gonryun";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "gonryun.gat";
+ setarray @pTXcoords[@Ti], 150;
+ setarray @pTYcoords[@Ti], 130;
+
+ QWS_Make_Town_Menu 9;
+//----------------Hugel:
+ setarray @pTmenuitems$[@Ti], "Hugel";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "hugel.gat";
+ setarray @pTXcoords[@Ti], 95;
+ setarray @pTYcoords[@Ti], 121;
+
+ QWS_Make_Town_Menu 10;
+//----------------Izlude:
+ setarray @pTmenuitems$[@Ti], "Izlude";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "izlude.gat";
+ setarray @pTXcoords[@Ti], 128;
+ setarray @pTYcoords[@Ti], 111;
+
+ QWS_Make_Town_Menu 11;
+//----------------Jawaii:
+ setarray @pTmenuitems$[@Ti], "Jawaii";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "jawaii.gat";
+ setarray @pTXcoords[@Ti], 243;
+ setarray @pTYcoords[@Ti], 115;
+
+ QWS_Make_Town_Menu 12;
+//----------------Lighthalzen:
+ setarray @pTmenuitems$[@Ti], "Lighthalzen";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "lighthalzen.gat";
+ setarray @pTXcoords[@Ti], 158;
+ setarray @pTYcoords[@Ti], 110;
+
+ QWS_Make_Town_Menu 13;
+//----------------Louyang:
+ setarray @pTmenuitems$[@Ti], "Louyang";
+ setarray @pTprice[@Ti], $QW_OW_PRICE;
+
+ setarray @pTmap$[@Ti], "louyang.gat";
+ setarray @pTXcoords[@Ti], 210;
+ setarray @pTYcoords[@Ti], 108;
+
+ QWS_Make_Town_Menu 14;
+//----------------Lutie
+ setarray @pTmenuitems$[@Ti], "Lutie";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "xmas.gat";
+ setarray @pTXcoords[@Ti], 148;
+ setarray @pTYcoords[@Ti], 131;
+
+ QWS_Make_Town_Menu 15;
+//----------------Morroc:
+ setarray @pTmenuitems$[@Ti], "Morroc";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "morocc.gat";
+ setarray @pTXcoords[@Ti], 159;
+ setarray @pTYcoords[@Ti], 93;
+
+ QWS_Make_Town_Menu 16;
+//----------------Niflheim:
+ setarray @pTmenuitems$[@Ti], "Niflheim";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "niflheim.gat";
+ setarray @pTXcoords[@Ti], 195;
+ setarray @pTYcoords[@Ti], 186;
+
+ QWS_Make_Town_Menu 17;
+//----------------Payon:
+ setarray @pTmenuitems$[@Ti], "Payon";
+ setarray @pTprice[@Ti], $QW_BW_PRICE;
+
+ setarray @pTmap$[@Ti], "payon.gat";
+ setarray @pTXcoords[@Ti], 152;
+ setarray @pTYcoords[@Ti], 75;
+
+ QWS_Make_Town_Menu 18;
+//----------------Umbala:
+ setarray @pTmenuitems$[@Ti], "Umbala";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "umbala.gat";
+ setarray @pTXcoords[@Ti], 130;
+ setarray @pTYcoords[@Ti], 130;
+
+ QWS_Make_Town_Menu 19;
+//----------------Yuno:
+ setarray @pTmenuitems$[@Ti], "Yuno";
+ setarray @pTprice[@Ti], $QW_AW_PRICE;
+
+ setarray @pTmap$[@Ti], "yuno.gat";
+ setarray @pTXcoords[@Ti], 160;
+ setarray @pTYcoords[@Ti], 168;
+
+ QWS_Make_Town_Menu 20;
+//----------------Cancel
+ setarray @pTmenuitems$[@Ti], "Cancel";
+ setarray @pTprice[@Ti], 0;
+
+ set @Tmenulist$[@Tj],@pTmenuitems$[@Ti];
+ set @Tmenuref[@Tj],57005; // 57005='dead' in hex
+ return;
+
+
+//----------------Make Town Menu Function
+
+function QWS_Make_Town_Menu {
+ set @temptownmenubin,1;
+ if (getarg(0) == 0) goto menu_item;
+ set @templooptownmenu,0;
+ do {
+ set @temptownmenubin, @temptownmenubin * 2;
+ set @templooptownmenu, @templooptownmenu + 1;
+ }while (getarg(0) > @templooptownmenu);
+// check marker and make menu item
+menu_item:
+ if ((@temptownmenubin & ##QWS_T_Unlock) != @temptownmenubin) {
+ set @Ti,@Ti+1;
+ return;
+ }
+ if (@pTprice[@Ti] != 0 && $QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" -> "+@pTprice[@Ti];
+ if (@pTprice[@Ti] == 0 && $QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti];
+ if (@pTprice[@Ti] != 0 && $QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]"+" -> "+@pTprice[@Ti];
+ if (@pTprice[@Ti] == 0 && $QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]";
+ set @Tmenuref[@Tj],@Ti;
+ set @Tj,@Tj+1;
+ set @Ti,@Ti+1;
+ return;
+
+}
+}
+
+//====================Dungeon=Menu=Arrays==========================
+
+//----------------A FAKE DUNGEON FOR EXAMPLE // I do this to find back sections quickly altho almost the same name is a line below it now
+// setarray @pDmenuitems$[@Di], "Fake Dungeon"; // Name of Dungeon shown in Dungeon select Menu
+// setarray @pDprice[@Di], $QW_BW_PRICE; // warp prices (Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas $QW_OW_PRICE)
+// setarray @pDfee$[@Di], "$QW_BW_FEE"; // Identifyer for the Dungeon fee caluclation (Basic ("$QW_BW_FEE"), Advanced ("$QW_AW_FEE"), Overseas ("$QW_OW_FEE")) please use setting in relation with option above (Don't forget "")
+// setarray @DLevels[@Di], 2; //number of levels in dungeon (very important if set to high will shift all leveldata!!)
+//
+// setarray @DGat$[@Dref], "example_01.gat", "example_02.gat"; // mapfilename of dungeon level
+// setarray @DLevelName$[@Dref], "Example Level 1", "Example Level 2"; // level name shown in dungeon level select
+// setarray @DXcoords[@Dref], 123, 234; // X warp coords
+// setarray @DYcoords[@Dref], 123, 234;// Y warp coords
+// setarray @DDepth[@Dref], 0, 1; // relative depth to entrance to calculate extra warp fee
+//
+// QWS_Make_Dungeon_Menu XXX
+//
+// the full wap commands send out by this scripts for these examples would be
+// for Example Level 1:
+//warp example_01.gat 123 123
+//
+// for Example Level 2:
+//warp example_02.gat 234 234
+//
+// use the same XXX number as you used when making your own dungeon unlocker (Warpra Helper) inside the dungeon
+// (usually half way near a warp to next level)
+// Read below how
+//
+// example:
+//
+//syntax:
+//mapname.gat,xcoord,ycoord,directionfacing script Name of NPC NPC-ID,{
+//
+// Full example using fake map & coords
+//
+//example_01.gat,213,213,4 script Warpra Helper 112,{
+// callfunc "QWS_Dungeon_Warpra",XXX,"A FAKE DUNGEON FOR EXAMPLE";
+// close;
+// }
+// use a free number for XXX, last used is 28, for Kiel Dungeon
+
+function script QWS_Darray {
+ function QWS_Make_Dungeon_Menu;
+
+ set @Di,0;
+ set @Dj,0;
+ set @Dref,0;
+//----------------ABYSS LAKE
+ setarray @pDmenuitems$[@Di], "Abyss Lake";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "abyss_01.gat", "abyss_02.gat", "abyss_03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 265, 275, 116;
+ setarray @DYcoords[@Dref], 273, 270, 27;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 0;
+
+//----------------AMATSU DUNGEON
+ setarray @pDmenuitems$[@Di], "Amatsu Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "ama_dun01.gat", "ama_dun02.gat", "ama_dun03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 227, 32, 119;
+ setarray @DYcoords[@Dref], 10, 43, 15;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 1;
+
+//----------------ANT HELL
+ setarray @pDmenuitems$[@Di], "Ant Hell Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[2], 2;
+
+ setarray @DGat$[@Dref], "anthell01.gat", "anthell02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 32, 34;
+ setarray @DYcoords[@Dref], 262, 263;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 2;
+
+//----------------AYOTAYA
+ setarray @pDmenuitems$[@Di], "Ayotaya Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[3], 2;
+
+ setarray @DGat$[@Dref], "ayo_dun01.gat", "ayo_dun02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 275, 150;
+ setarray @DYcoords[@Dref], 17, 13;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 3;
+
+//----------------BYALAN
+ setarray @pDmenuitems$[@Di], "Byalan Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[4], 5;
+
+ setarray @DGat$[@Dref], "iz_dun00.gat", "iz_dun01.gat", "iz_dun02.gat", "iz_dun03.gat", "iz_dun04.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 168, 41, 236, 32, 26;
+ setarray @DYcoords[@Dref], 168, 37, 204, 63, 27;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 4;
+
+//----------------CLOCK TOWER
+ setarray @pDmenuitems$[@Di], "Clock Tower Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[5], 8;
+
+ setarray @DGat$[@Dref], "c_tower1.gat", "c_tower2.gat", "c_tower3.gat", "c_tower4.gat", "alde_dun01.gat", "alde_dun02.gat", "alde_dun03.gat", "alde_dun04.gat";
+ setarray @DLevelName$[@Dref], "Clock Tower Level 1", "Clock Tower Level 2", "Clock Tower Level 3", "Clock Tower Level 4", "Basement 1F", "Basement 2F", "Basement 3F", "Basement 4F";
+ setarray @DXcoords[@Dref], 200, 268, 64, 32, 197, 262, 276, 130;
+ setarray @DYcoords[@Dref], 163, 26, 148, 63, 25, 41, 53, 130;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 5;
+
+//----------------COAL MINE
+ setarray @pDmenuitems$[@Di], "Coal Mine Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[6], 3;
+
+ setarray @DGat$[@Dref], "mjo_dun01.gat", "mjo_dun02.gat", "mjo_dun03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 52, 381, 302;
+ setarray @DYcoords[@Dref], 17, 343, 261;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 6;
+
+//----------------CULVERT
+ setarray @pDmenuitems$[@Di], "Culvert Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[7], 4;
+
+ setarray @DGat$[@Dref], "prt_sewb1.gat", "prt_sewb2.gat", "prt_sewb3.gat", "prt_sewb4.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 132, 19, 180, 100;
+ setarray @DYcoords[@Dref], 248, 19, 169, 92;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 7;
+
+//----------------EINBECH DUNGEON
+ setarray @pDmenuitems$[@Di], "Einbech Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[8], 2;
+
+ setarray @DGat$[@Dref], "ein_dun01.gat", "ein_dun02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 22, 292;
+ setarray @DYcoords[@Dref], 14, 290;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 8;
+
+//----------------GEFENIA DUNGEON
+ setarray @pDmenuitems$[@Di], "Gefenia Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[9], 4;
+
+ setarray @DGat$[@Dref], "gefenia01.gat", "gefenia02.gat", "gefenia03.gat", "gefenia04.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 59, 201, 264, 33;
+ setarray @DYcoords[@Dref], 167, 35, 236, 270;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 9;
+
+//----------------GEFFEN DUNGEON
+ setarray @pDmenuitems$[@Di], "Geffen Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 4;
+
+ setarray @DGat$[@Dref], "gef_dun00.gat", "gef_dun01.gat", "gef_dun02.gat", "gef_dun03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4";
+ setarray @DXcoords[@Dref], 104, 115, 106, 203;
+ setarray @DYcoords[@Dref], 100, 236, 132, 200;
+ setarray @DDepth[@Dref], 0, 1, 2, 3;
+
+ QWS_Make_Dungeon_Menu 10;
+
+//----------------GLAST HEIM
+ setarray @pDmenuitems$[@Di], "Glast Heim Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 17;
+
+ setarray @DGat$[@Dref], "glast_01.gat", "gl_church.gat", "gl_chyard.gat", "gl_in01.gat", "gl_cas01.gat", "gl_cas02.gat", "gl_knt01.gat", "gl_knt02.gat", "gl_prison.gat", "gl_prison1.gat", "gl_step.gat", "gl_sew01.gat", "gl_sew02.gat", "gl_sew03.gat", "gl_sew04.gat", "gl_dun01.gat", "gl_dun02.gat";
+ setarray @DLevelName$[@Dref], "Glast Heim Entrance", "St. Abbey", "Churchyard", "Inside Glast Heim", "Castle 1", "Castle 2", "Chivalry 1", "Chivalry 2", "Prison 1", "Prison 2", "Steps", "Sewers 1", "Sewers 2", "Sewers 3", "Sewers 4", "Lowest Cave 1", "Lowest Cave 2";
+ setarray @DXcoords[@Dref], 370, 156, 147, 121, 199, 104, 150, 157, 14, 150, 117, 258, 108, 171, 68, 133, 224;
+ setarray @DYcoords[@Dref], 300, 8, 15, 59, 29, 25, 10, 287, 70, 14, 124, 255, 291, 273, 277, 271, 274;
+ setarray @DDepth[@Dref], 0, 1, 2, 1, 1, 2, 1, 2, 2, 3, 1, 4, 2, 3, 4, 5, 6;
+
+ QWS_Make_Dungeon_Menu 11;
+
+//----------------GONRYUN DUNGEON
+ setarray @pDmenuitems$[@Di], "Gonryun Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "gon_dun01.gat", "gon_dun02.gat", "gon_dun03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 143, 17, 68;
+ setarray @DYcoords[@Dref], 59, 114, 9;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 12;
+
+//----------------HIDDEN DUNGEON
+ setarray @pDmenuitems$[@Di], "Hidden Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "prt_maze01.gat", "prt_maze02.gat", "prt_maze03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 176, 94, 23;
+ setarray @DYcoords[@Dref], 6, 19, 8;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 13;
+
+//----------------JUPEROS CAVE
+ setarray @pDmenuitems$[@Di], "Juperos Cave";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "juperos_01.gat", "juperos_02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 53, 36;
+ setarray @DYcoords[@Dref], 247, 60;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 14;
+
+//----------------KIEL DUNGEON
+ setarray @pDmenuitems$[@Di], "Kiel Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "kh_dun01.gat", "kh_dun02.gat";
+ setarray @DLevelName$[@Dref], "1st Floor", "2nd Floor";
+ setarray @DXcoords[@Dref], 63, 42;
+ setarray @DYcoords[@Dref], 10, 197;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 28;
+
+//----------------LIGHTHALZEN BIO LAB
+ setarray @pDmenuitems$[@Di], "Lighthalzen Bio Lab";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "lhz_dun01.gat", "lhz_dun02.gat", "lhz_dun03.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 150, 150, 140;
+ setarray @DYcoords[@Dref], 287, 18, 137;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 15;
+
+//----------------LOUYANG DUNGEON
+ setarray @pDmenuitems$[@Di], "Louyang Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "lou_dun02.gat", "lou_dun03.gat";
+ setarray @DLevelName$[@Dref], "Royal Tomb Level 1", "Royal Tomb Level 2";
+ setarray @DXcoords[@Dref], 282, 165;
+ setarray @DYcoords[@Dref], 20, 38;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 16;
+
+//----------------MAGMA DUNGEON
+ setarray @pDmenuitems$[@Di], "Magma Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "mag_dun01.gat", "mag_dun02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 126, 47;
+ setarray @DYcoords[@Dref], 69, 32;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 17;
+
+//----------------ODIN TEMPLE
+ setarray @pDmenuitems$[@Di], "Odin Temple";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 1;
+
+ setarray @DGat$[@Dref], "odin_tem01.gat";
+ setarray @DLevelName$[@Dref], "Level 1";
+ setarray @DXcoords[@Dref], 96;
+ setarray @DYcoords[@Dref], 145;
+ setarray @DDepth[@Dref], 0;
+
+ QWS_Make_Dungeon_Menu 18;
+
+//----------------ORC DUNGEON
+ setarray @pDmenuitems$[@Di], "Orc Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "orcsdun01.gat", "orcsdun02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 32, 21;
+ setarray @DYcoords[@Dref], 169, 185;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 19;
+
+//----------------PAYON DUNGEON
+ setarray @pDmenuitems$[@Di], "Payon Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 5;
+
+ setarray @DGat$[@Dref], "pay_dun00.gat", "pay_dun01.gat", "pay_dun02.gat", "pay_dun03.gat", "pay_dun04.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 22, 19, 19, 155, 201;
+ setarray @DYcoords[@Dref], 180, 33, 63, 159, 204;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 20;
+
+//----------------PYRAMIDS
+ setarray @pDmenuitems$[@Di], "Pyramids Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 6;
+
+ setarray @DGat$[@Dref], "moc_pryd01.gat", "moc_pryd02.gat", "moc_pryd03.gat", "moc_pryd04.gat", "moc_pryd05.gat", "moc_pryd06.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Basement 1", "Basement 2";
+ setarray @DXcoords[@Dref], 192, 10, 100, 181, 94, 192;
+ setarray @DYcoords[@Dref], 9, 192, 92, 11, 96, 8;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2;
+
+ QWS_Make_Dungeon_Menu 21;
+
+//----------------SPHINX
+ setarray @pDmenuitems$[@Di], "Sphinx Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 5;
+
+ setarray @DGat$[@Dref], "in_sphinx1.gat", "in_sphinx2.gat", "in_sphinx3.gat", "in_sphinx4.gat", "in_sphinx5.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5";
+ setarray @DXcoords[@Dref], 192, 149, 210, 10, 100;
+ setarray @DYcoords[@Dref], 9, 81, 54, 222, 99;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4;
+
+ QWS_Make_Dungeon_Menu 22;
+
+//----------------SUNKEN SHIP
+ setarray @pDmenuitems$[@Di], "Sunken Ship Dungeon";
+ setarray @pDprice[@Di], $QW_BW_PRICE;
+ setarray @pDfee$[@Di], "$QW_BW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "treasure01.gat", "treasure02.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2";
+ setarray @DXcoords[@Dref], 69, 102;
+ setarray @DYcoords[@Dref], 24, 27;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 23;
+
+//----------------THANATOS TOWER
+ setarray @pDmenuitems$[@Di], "Thanatos Tower";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 13;
+
+ setarray @DGat$[@Dref], "tha_t01.gat", "tha_t02.gat", "tha_t03.gat", "tha_t04.gat", "tha_t05.gat", "tha_t06.gat", "tha_t07.gat", "tha_t08.gat", "tha_t09.gat", "tha_t10.gat", "tha_t11.gat", "tha_t12.gat", "thana_boss.gat";
+ setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Level 6", "Level 7", "Level 8", "Level 9", "Level 10", "Level 11", "Level 12", "Thanatos Boss";
+ setarray @DXcoords[@Dref], 150, 150, 220, 59, 62, 206, 35, 105, 88, 168, 90, 129, 85;
+ setarray @DYcoords[@Dref], 35, 136, 158, 143, 11, 8, 166, 44, 145, 138, 36, 83, 76;
+ setarray @DDepth[@Dref], 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
+
+ QWS_Make_Dungeon_Menu 24;
+
+//----------------TOY FACTORY
+ setarray @pDmenuitems$[@Di], "Toy Factory Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 2;
+
+ setarray @DGat$[@Dref], "xmas_dun01.gat", "xmas_dun02.gat";
+ setarray @DLevelName$[@Dref], "Factory Warehouse", "Classifying Room";
+ setarray @DXcoords[@Dref], 205, 129;
+ setarray @DYcoords[@Dref], 16, 133;
+ setarray @DDepth[@Dref], 0, 1;
+
+ QWS_Make_Dungeon_Menu 25;
+
+//----------------TURTLE ISTLAND
+ setarray @pDmenuitems$[@Di], "Turtle Island Dungeon";
+ setarray @pDprice[@Di], $QW_AW_PRICE;
+ setarray @pDfee$[@Di], "$QW_AW_FEE";
+ setarray @DLevels[@Di], 4;
+
+ setarray @DGat$[@Dref], "tur_dun01.gat", "tur_dun02.gat", "tur_dun03.gat", "tur_dun04.gat";
+ setarray @DLevelName$[@Dref], "Outside", "Level 1", "Level 2", "Level 3";
+ setarray @DXcoords[@Dref], 161, 148, 132, 100;
+ setarray @DYcoords[@Dref], 34, 256, 190, 192;
+ setarray @DDepth[@Dref], 0, 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 26;
+
+//----------------UMBALA
+ setarray @pDmenuitems$[@Di], "Umbala Dungeon";
+ setarray @pDprice[@Di], $QW_OW_PRICE;
+ setarray @pDfee$[@Di], "$QW_OW_FEE";
+ setarray @DLevels[@Di], 3;
+
+ setarray @DGat$[@Dref], "um_dun01.gat", "um_dun02.gat", "yggdrasil01.gat";
+ setarray @DLevelName$[@Dref], "Carpenter's Shop in The Tree", "Passage to a Foreign World", "Hvergelmir's Fountain";
+ setarray @DXcoords[@Dref], 205, 48, 40;
+ setarray @DYcoords[@Dref], 16, 30, 63;
+ setarray @DDepth[@Dref], 0, 1, 2;
+
+ QWS_Make_Dungeon_Menu 27;
+
+//----------------Cancel
+ setarray @pDmenuitems$[@Di], "Cancel";
+ setarray @pDprice[@Di], 0;
+
+ set @Dmenulist$[@Dj],@pDmenuitems$[@Di];
+ set @Dmenuref[@Dj],57005; // 57005='dead' in hex
+ return;
+
+
+//----------------Make Dungeon Menu Function
+
+function QWS_Make_Dungeon_Menu {
+ set @tempdungeonmenubin,1;
+ if (getarg(0) == 0) goto menu_item;
+ set @temploopdungeonmenu,0;
+ do {
+ set @tempdungeonmenubin, @tempdungeonmenubin * 2;
+ set @temploopdungeonmenu, @temploopdungeonmenu + 1;
+ }while (getarg(0) > @temploopdungeonmenu);
+// check marker and make menu item
+menu_item:
+ if ((@tempdungeonmenubin & ##QWS_D_Unlock) != @tempdungeonmenubin) {
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+ }
+ if ($QW_MapUserShow == 1) {
+ set @tempmapusers,0;
+ set @mapusersloop,0;
+ do {
+ set @tempmapusers,(getmapusers(@DGat$[@Dref+@mapusersloop]) + @tempmapusers);
+ set @mapusersloop, (@mapusersloop + 1);
+ }while (@DLevels[@Di] > @mapusersloop);
+ if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"] -> "+@pDprice[@Di];
+ if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"]";
+ set @Dmenuref[@Dj],@Di;
+ set @Dj,@Dj+1;
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+ }
+ if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" -> "+@pDprice[@Di];
+ if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di];
+ set @Dmenuref[@Dj],@Di;
+ set @Dj,@Dj+1;
+ setarray @DLocRef[@Di], @Dref;
+ set @Dref, @Dref+@DLevels[@Di];
+ set @Di,@Di+1;
+ return;
+
+}
+}
+
+function script QWS_DLarray {
+//----------------Start building Menu
+ set @DWref,@DLocRef[@DwarpMenu]; // That's our reference to the arrays with leveldata.
+ set @DWi,0; // That's our loop counter.
+ set @DWj,0; // That's the menu lines counter.
+ cleararray @DWLmenulist$[0],"",20; // Clearing the array to get rid off ghost items in menu
+ do {
+ if ($QW_DL == 0 || $QW_DDL >= @DDepth[@DWref]) {
+ set @warpprice, (@pDprice[@DwarpMenu]+ (getd(@pDfee$[@DwarpMenu])*@DDepth[@DWref]));
+
+ if (@warpprice != 0 && $QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" -> "+@warpprice;
+ if (@warpprice == 0 && $QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref];
+ if (@warpprice != 0 && $QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"] -> "+@warpprice;
+ if (@warpprice == 0 && $QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"]";
+ set @DWLmenuref[@DWj],@DWref;
+
+ set @DWj,@DWj+1;
+ }
+ set @DWref, @DWref+1;
+ set @DWi,@DWi+1;
+ }while (@DWi < @DLevels[@DwarpMenu]);
+ set @DWLmenulist$[@DWj], "Exit";
+ set @DWLmenuref[@DWj],57005; // 57005='dead' in hex
+ return;
+ }
+
+
+//=================Backwards=Compatibility=Pre=1.8=================
+
+function script QWS_BackComp {
+// reference where i put the towns: "Prontera"[0], "Alberta"[1], "Aldebaran"[2], "Amatsu"[3], "Ayothaya"[4], "Comodo"[5], "Einbech"[6], "Einbroch"[7], "Geffen"[8], "Gonryun"[9], "Hugel"[10], "Izlude"[11], "Jawaii"[12], "Lighthalzen"[13], "Louyang"[14], "Lutie"[15], "Morroc"[16], "Niflheim"[17], "Payon"[18], "Umbala"[19], "Yuno"[20];
+// reference where i put the dungeons: "Abyss Lake"[0], "Amatsu Dungeon"[1], "Ant Hell Dungeon"[2], "Ayotaya Dungeon"[3], "Byalan Dungeon"[4], "Clock Tower Dungeon"[5], "Coal Mine Dungeon"[6], "Culvert Dungeon"[7], "Einbech Dungeon"[8], "Gefenia Dungeon"[9], "Geffen Dungeon"[10], "Glast Heim Dungeon"[11], "Gonryun Dungeon"[12], "Hidden Dungeon"[13], "Juperos Cave"[14], "Lighthalzen Bio Lab"[15], "Louyang Dungeon"[16], "Magma Dungeon"[17], "Odin Temple"[18], "Orc Dungeon"[19], "Payon Dungeon"[20], "Pyramids Dungeon"[21], "Sphinx Dungeon"[22], "Sunken Ship Dungeon"[23], "Thanatos Tower"[24], "Toy Factory Dungeon"[25], "Turtle Island Dungeon"[26], "Umbala Dungeon"[27], "Kiel Dungeon[28];
+// also clears variables so that the account file variables can be used for something else variable 0 = variable delete on next save
+
+// Towns
+ set @towntemp,0;
+ if (#prontera != 0) set @towntemp,@towntemp + 1;
+ if (#alberta != 0) set @towntemp,@towntemp + 2;
+ if (#aldebaran != 0) set @towntemp,@towntemp + 4;
+ if (#amatsu != 0) set @towntemp,@towntemp + 8;
+ if (#ayotaya != 0) set @towntemp,@towntemp + 16;
+ if (#comodo != 0) set @towntemp,@towntemp + 32;
+ if (#einbech != 0) set @towntemp,@towntemp + 64;
+ if (#einbroch != 0) set @towntemp,@towntemp + 128;
+ if (#geffen != 0) set @towntemp,@towntemp + 256;
+ if (#gonryun != 0) set @towntemp,@towntemp + 512;
+ if (#hugel != 0) set @towntemp,@towntemp + 1024;
+ if (#izlude != 0) set @towntemp,@towntemp + 2048;
+ if (#jawaii != 0) set @towntemp,@towntemp + 4096;
+ if (#lighthalzen != 0) set @towntemp,@towntemp + 8192;
+ if (#louyang != 0) set @towntemp,@towntemp + 16384;
+ if (#xmas != 0) set @towntemp,@towntemp + 32768;
+ if (#morocc != 0) set @towntemp,@towntemp + 65536;
+ if (#niflheim != 0) set @towntemp,@towntemp + 131072;
+ if (#payon != 0) set @towntemp,@towntemp + 262144;
+ if (#umbala != 0) set @towntemp,@towntemp + 524288;
+ if (#yuno != 0) set @towntemp,@towntemp + 1048576;
+// Clear Town variables
+ set #prontera,0;
+ set #alberta,0;
+ set #aldebaran,0;
+ set #amatsu,0;
+ set #ayotaya,0;
+ set #comodo,0;
+ set #einbech,0;
+ set #einbroch,0;
+ set #geffen,0;
+ set #gonryun,0;
+ set #hugel,0;
+ set #izlude,0;
+ set #jawaii,0;
+ set #lighthalzen,0;
+ set #louyang,0;
+ set #xmas,0;
+ set #morocc,0;
+ set #niflheim,0;
+ set #payon,0;
+ set #umbala,0;
+ set #yuno,0;
+// set Town warp unlock variable
+set ##QWS_T_Unlock, (##QWS_T_Unlock | @towntemp);
+ //because multiple account servers now stack on 1 variable i used a 'or' to stack them
+// Dungeons
+ set @dungeontemp,0;
+ if (#abyss != 0) set @dungeontemp,@dungeontemp + 1;
+ if (#ama_dun != 0) set @dungeontemp,@dungeontemp + 2;
+ if (#anthell != 0) set @dungeontemp,@dungeontemp + 4;
+ if (#ayotaya_dun != 0) set @dungeontemp,@dungeontemp + 8;
+ if (#iz_dun != 0) set @dungeontemp,@dungeontemp + 16;
+ if (#c_tower != 0) set @dungeontemp,@dungeontemp + 32;
+ if (#mjo_dun != 0) set @dungeontemp,@dungeontemp + 64;
+ if (#prt_sewb != 0) set @dungeontemp,@dungeontemp + 128;
+ if (#einbech_dun != 0) set @dungeontemp,@dungeontemp + 256;
+ if (#gefenia != 0) set @dungeontemp,@dungeontemp + 512;
+ if (#gef_dun != 0) set @dungeontemp,@dungeontemp + 1024;
+ if (#gl_dun != 0) set @dungeontemp,@dungeontemp + 2048;
+ if (#gon_dun != 0) set @dungeontemp,@dungeontemp + 4096;
+ if (#hid_dun != 0) set @dungeontemp,@dungeontemp + 8192;
+ if (#juperos != 0) set @dungeontemp,@dungeontemp + 16384;
+ if (#lighthalzen_dun != 0) set @dungeontemp,@dungeontemp + 32768;
+ if (#louyang_dun != 0) set @dungeontemp,@dungeontemp + 65536;
+ if (#mag_dun != 0) set @dungeontemp,@dungeontemp + 131072;
+ if (#odintemple != 0) set @dungeontemp,@dungeontemp + 262144;
+ if (#orcsdun != 0) set @dungeontemp,@dungeontemp + 524288;
+ if (#pay_dun != 0) set @dungeontemp,@dungeontemp + 1048576;
+ if (#moc_pryd != 0) set @dungeontemp,@dungeontemp + 2097152;
+ if (#in_sphinx != 0) set @dungeontemp,@dungeontemp + 4194304;
+ if (#treasure != 0) set @dungeontemp,@dungeontemp + 8388608;
+ if (#thanatos_tower != 0) set @dungeontemp,@dungeontemp + 16777216;
+ if (#xmas_dun != 0) set @dungeontemp,@dungeontemp + 33554432;
+ if (#tur_dun != 0) set @dungeontemp,@dungeontemp + 67108864;
+ if (#um_dun != 0) set @dungeontemp,@dungeontemp + 134217728;
+// Clear Dungeon variables
+ set #abyss,0;
+ set #ama_dun,0;
+ set #anthell,0;
+ set #ayotaya_dun,0;
+ set #iz_dun,0;
+ set #c_tower,0;
+ set #mjo_dun,0;
+ set #prt_sewb,0;
+ set #einbech_dun,0;
+ set #gefenia,0;
+ set #gef_dun,0;
+ set #gl_dun,0;
+ set #gon_dun,0;
+ set #hid_dun,0;
+ set #juperos,0;
+ set #lighthalzen_dun,0;
+ set #louyang_dun,0;
+ set #mag_dun,0;
+ set #odintemple,0;
+ set #orcsdun,0;
+ set #pay_dun,0;
+ set #moc_pryd,0;
+ set #in_sphinx,0;
+ set #treasure,0;
+ set #thanatos_tower,0;
+ set #xmas_dun,0;
+ set #tur_dun,0;
+ set #um_dun,0;
+// set Town warp unlock variable
+set ##QWS_D_Unlock, (##QWS_D_Unlock | @dungeontemp);
+//mark that this character has done the upgrade to 1.8
+set ##QWS_UP,18;
+return;
+}
+
+
+//===================Extra=Variable=Clear=Pre=1.8==================
+function script Extra_Variable_Clear {
+// Clear Town variables
+ set #prontera,0;
+ set #alberta,0;
+ set #aldebaran,0;
+ set #amatsu,0;
+ set #ayotaya,0;
+ set #comodo,0;
+ set #einbech,0;
+ set #einbroch,0;
+ set #geffen,0;
+ set #gonryun,0;
+ set #hugel,0;
+ set #izlude,0;
+ set #jawaii,0;
+ set #lighthalzen,0;
+ set #louyang,0;
+ set #xmas,0;
+ set #morocc,0;
+ set #niflheim,0;
+ set #payon,0;
+ set #umbala,0;
+ set #yuno,0;
+
+// Clear Dungeon variables
+ set #abyss,0;
+ set #ama_dun,0;
+ set #anthell,0;
+ set #ayotaya_dun,0;
+ set #iz_dun,0;
+ set #c_tower,0;
+ set #mjo_dun,0;
+ set #prt_sewb,0;
+ set #einbech_dun,0;
+ set #gefenia,0;
+ set #gef_dun,0;
+ set #gl_dun,0;
+ set #gon_dun,0;
+ set #hid_dun,0;
+ set #juperos,0;
+ set #lighthalzen_dun,0;
+ set #louyang_dun,0;
+ set #mag_dun,0;
+ set #odintemple,0;
+ set #orcsdun,0;
+ set #pay_dun,0;
+ set #moc_pryd,0;
+ set #in_sphinx,0;
+ set #treasure,0;
+ set #thanatos_tower,0;
+ set #xmas_dun,0;
+ set #tur_dun,0;
+ set #um_dun,0;
+
+// as the account based variables are limited just run this on every character to save some variables
+set QWS_ExtraVARClear,18;
+return;
+}
+
+//================Dungeon=Warpras=That=Only=Unlock=================
+
+function script QWS_Dungeon_Warpra {
+ function QWS_D_getbin;
+ function QWS_D_setbin;
+
+ if (QWS_D_getbin(getarg(0)) == 0 && getarg(1) != "") {
+ mes "[Warpra]";
+ mes getarg(1)+" unlocked!";
+ QWS_D_setbin(getarg(0));
+ return;
+ } else if (QWS_D_getbin(getarg(0)) == 1){
+ mes "[Warpra]";
+ mes "Sorry I can only unlock this location.";
+ } else
+ debugmes "QWS_Dungeon_Warpra error, improper syntax ?";
+ return;
+
+
+function QWS_D_setbin {
+ set @tempsetbindata,1;
+ if (getarg(0) == 0) goto binset;
+ set @temploopsetbin,0;
+ do {
+ set @tempsetbindata, @tempsetbindata * 2;
+ set @temploopsetbin, @temploopsetbin + 1;
+ } while (getarg(0) > @temploopsetbin);
+binset:
+ set ##QWS_D_Unlock,(##QWS_D_Unlock | @tempsetbindata);
+ return;
+}
+
+function QWS_D_getbin {
+ set @tempgetbindata,1;
+ if (getarg(0) == 0) goto binget;
+ set @temploopgetbin,0;
+ do {
+ set @tempgetbindata, @tempgetbindata * 2;
+ set @temploopgetbin, @temploopgetbin + 1;
+ } while (getarg(0) > @temploopgetbin);
+binget:
+ if ((@tempgetbindata & ##QWS_D_Unlock) == @tempgetbindata) return 1;
+ return 0;
+}
+}
+
+//==========================Town=Warpras===========================
+
+function script QWS_Town_Warpra {
+ function QWS_T_getbin;
+ function QWS_T_setbin;
+
+ if (QWS_T_getbin(getarg(0)) == 0 && getarg(1) != "") {
+ mes "[Warpra]";
+ mes getarg(1)+" unlocked!";
+ QWS_T_setbin(getarg(0));
+ return;
+ } else if (QWS_T_getbin(getarg(0)) == 1){
+callfunc "Q_Warpra",0;
+ } else
+ debugmes "QWS_Town_Warpra error, improper syntax ?";
+ return;
+
+
+function QWS_T_setbin {
+ set @tempsetbindata,1;
+ if (getarg(0) == 0) goto binset;
+ set @temploopsetbin,0;
+ do {
+ set @tempsetbindata, @tempsetbindata * 2;
+ set @temploopsetbin, @temploopsetbin + 1;
+ } while (getarg(0) > @temploopsetbin);
+binset:
+ set ##QWS_T_Unlock,(##QWS_T_Unlock | @tempsetbindata);
+ return;
+}
+
+function QWS_T_getbin {
+ set @tempgetbindata,1;
+ if (getarg(0) == 0) goto binget;
+ set @temploopgetbin,0;
+ do {
+ set @tempgetbindata, @tempgetbindata * 2;
+ set @temploopgetbin, @temploopgetbin + 1;
+ } while (getarg(0) > @temploopgetbin);
+binget:
+ if ((@tempgetbindata & ##QWS_T_Unlock) == @tempgetbindata) return 1;
+ return 0;
+}
+}
+//============================Warpras==============================
+
+alb2trea.gat,73,101,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+ama_fild01.gat,178,325,1 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+gef_fild10.gat,71,339,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+izlu2dun.gat,104,82,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+mjolnir_02.gat,85,363,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+moc_fild04.gat,207,331,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+moc_fild19.gat,106,97,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+moc_ruins.gat,64,166,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+niflheim.gat,197,192,3 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+pay_arche.gat,39,135,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+prt_fild05.gat,273,215,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+tur_dun01.gat,148,239,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+valkyrie.gat,48,35,8 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+yuno_fild03.gat,37,135,4 script Warpra 113,{
+ callfunc "Q_Warpra",1;
+}
+
+alberta.gat,32,240,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",1,"Alberta Town";
+ close;
+}
+aldebaran.gat,146,118,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",2,"Aldebaran Town";
+ close;
+}
+ayothaya.gat,216,171,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",4,"Ayotaya Town";
+ close;
+}
+amatsu.gat,193,81,1 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",3,"Amatsu Town";
+ close;
+}
+comodo.gat,195,158,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",5,"Comodo Town";
+ close;
+}
+einbroch.gat,229,196,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",7,"Einbroch Town";
+ close;
+}
+einbech.gat,173,131,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",6,"Einbech Town";
+ close;
+}
+geffen.gat,116,66,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",8,"Geffen Town";
+ close;
+}
+gonryun.gat,152,130,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",9,"Gonryun Town";
+ close;
+}
+hugel.gat,90,127,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",10,"Hugel Town";
+ close;
+}
+jawaii.gat,107,182,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",12,"Jawaii Town";
+ close;
+}
+izlude.gat,132,116,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",11,"Izlude Town";
+ close;
+}
+lighthalzen.gat,153,100,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",13,"Lighthalzen Town";
+ close;
+}
+louyang.gat,211,106,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",14,"Louyang Town";
+ close;
+}
+morocc.gat,157,95,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",16,"Morroc Town";
+ close;
+}
+nif_fild01.gat,319,77,1 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",17,"Niflheim Town";
+ close;
+}
+payon.gat,183,110,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",18,"Payon Town";
+ close;
+}
+prontera.gat,147,172,5 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",0,"Prontera Town";
+ close;
+}
+umbala.gat,133,130,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",19,"Umbala Town";
+ close;
+}
+xmas.gat,151,136,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",15,"Lutie Town";
+ close;
+}
+yuno.gat,138,162,4 script Warpra 113,{
+ callfunc "QWS_Town_Warpra",20,"Yuno Town";
+ close;
+}
+
+abyss_02.gat,274,266,1 script Warpra 113,{
+ callfunc "QWS_Dungeon_Warpra",0,"Abyss Lake";
+ close;
+}
+
+ama_dun02.gat,192,118,5 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",1,"Amatsu Dungeon";
+ close;
+}
+
+anthell02.gat,170,165,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",2,"Ant Hell Dungeon";
+ close;
+}
+
+ayo_dun02.gat,258,193,5 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",3,"Ayotaya Dungeon";
+ close;
+}
+
+ein_dun02.gat,292,282,1 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",8,"Einbech Dungeon";
+ close;
+}
+
+iz_dun03.gat,202,47,2 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",4,"Byalan Dungeon";
+ close;
+}
+
+c_tower3.gat,129,106,4 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",5,"Clock Tower Dungeon";
+ close;
+}
+
+mjo_dun02.gat,39,25,4 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",6,"Coal Mine Dungeon";
+ close;
+}
+
+prt_sewb2.gat,176,30,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",7,"Culvert Dungeon";
+ close;
+}
+
+gefenia03.gat,137,34,0 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",9,"Gefenia Dungeon";
+ close;
+}
+
+gef_dun02.gat,218,61,2 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",10,"Gefen Dungeon";
+ close;
+}
+
+glast_01.gat,371,308,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",11,"Glast Heim Dungeon";
+ close;
+}
+
+gon_dun01.gat,167,273,4 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",12,"Gonryun Dungeon";
+ close;
+}
+
+juperos_02.gat,127,154,5 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",14,"Juperos Cave";
+ close;
+}
+
+kh_dun01.gat,14,224,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",28,"Kiel Dungeon";
+ close;
+}
+
+lhz_dun02.gat,156,151,5 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",15,"Lighthalzen Bio Lab";
+ close;
+}
+
+lou_dun02.gat,168,264,4 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",16,"Louyang Dungeon";
+ close;
+}
+
+mag_dun02.gat,46,41,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",17,"Magma Dungeon";
+ close;
+}
+
+odin_tem01.gat,115,148,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",18,"Odin Temple";
+ close;
+}
+
+orcsdun01.gat,185,11,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",19,"Orc Dungeon";
+ close;
+}
+
+pay_dun03.gat,162,143,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",20,"Payon Dungeon";
+ close;
+}
+
+moc_pryd02.gat,101,95,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",21,"Pyramides Dungeon";
+ close;
+}
+
+in_sphinx2.gat,274,268,1 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",22,"Sphinx Dungeon";
+ close;
+}
+
+tha_t07.gat,111,162,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",24,"Thanatos Tower";
+ close;
+}
+
+treasure02.gat,104,40,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",23,"Sunken Ship Dungeon";
+ close;
+}
+
+xmas_dun02.gat,124,131,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",25,"Toy Factory Dungeon";
+ close;
+}
+
+um_dun02.gat,44,28,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",27,"Umbala Dungeon";
+ close;
+}
+
+tur_dun02.gat,162,23,3 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",26,"Turtle Island Dungeon";
+ close;
+}
+prt_maze02.gat,102,69,4 script Warpra Helper 112,{
+ callfunc "QWS_Dungeon_Warpra",13,"Hidden Dungeon";
+ close;
+}
diff --git a/npc/custom/eAAC_Scripts/roll_a_dice.txt b/npc/custom/eAAC_Scripts/roll_a_dice.txt
index 5a5e47b73..469683dd7 100644
--- a/npc/custom/eAAC_Scripts/roll_a_dice.txt
+++ b/npc/custom/eAAC_Scripts/roll_a_dice.txt
@@ -1,244 +1,244 @@
-//==========================================================
-//Roll a Dice NPC
-//==========================================================
-//Made by birkiczd
-//==========================================================
-//This game lets you and the Dicer throw 3 dices.
-//Whoever get's a higher number (the player or dealer) wins.
-//==========================================================
-//Version:1.0 - made script public
-// 1.1 - fixed a few bugs,added dice emos =)
-// 1.2 - made variables for the amount of zenys for
-// each bet so it is easy for people to costumize
-// the script
-// 1.3 - added more emoticons,made an Info menu
-// option which contains explanations and rules,
-// added the amount of lost/won zeny on the end
-// of each game,added more colors
-// 1.4 - some small code optimization thanks to Myzter
-//==========================================================
-
-
-cmd_in02.gat,181,98,2 script Dicer 57,{
-
-//These variables allow you to set the amount of zeny people can bet
-set @betzeny1,500; //500 zeny
-set @betzeny2,1000; //1000 zeny
-set @betzeny3,2000; //2000 zeny
-set @betzeny4,10000; //10000 zeny
-
-//Variable for the number guess zeny bet
-set @betnum, 1000; //1000 Zeny
-
-
- mes "[Dicer]";
- mes "Welcome to the Revolution Dice Game.You wanna check your luck with dices?Remember I am the dice expert and rarely someone was able to beat me.";
- next;
- mes "[Dicer]";
- mes "What would you like to do?";
- next;
- menu "Play",L_play,"Info",L_info,"Go away",L_go;
-
-L_go:
- mes "[Dicer]";
- mes "Please come again when you are ready.";
- close;
-
-L_info:
- mes "[Dicer]";
- mes "Please choose one of the following options for more informations:";
- next;
- menu "Main Rules",L_main,"Bets and Wins",L_bet,"Extra Games",L_extra,"Go away",L_go;
-
-L_main:
- mes "[Dicer]";
- mes "^0080FFRoll A Dice^000000 is a very simple game.The game allows you and the NPC to throw 3 dices.Whoever gets a higher total number wins.";
- next;
- goto L_info;
-
-L_bet:
- mes "[Dicer]";
- mes "You have 4 zeny amounts to choose for your bet.If you choose a high bet your win will also be higher,it is that simple.Also various extra games can increase your win.";
- next;
- mes "[Dicer]";
- mes "Example:";
- mes "^0080FFBet^000000 ^0080FFWin^000000";
- mes "500 1000";
- mes "1000 2000";
- mes "2000 4000";
- mes "10000 20000";
- next;
- goto L_info;
-
-L_extra:
- mes "[Dicer]";
- mes "You can also try increasing your win by playing extra games like guessing your total number at the end of the game.It will cost you an extra amount of zeny but if you guess the number your win will be tripled instead of doubled.";
- next;
- goto L_info;
-
-L_play:
- mes "[Dicer]";
- mes "Ok,please choose the amount of zeny you want to bet:";
- next;
- menu ""+@betzeny1+" Zeny",L_zeny1,""+@betzeny2+" Zeny",L_zeny2,""+@betzeny3+" Zeny",L_zeny3,""+@betzeny4+" Zeny",L_zeny4,"Too rich for my blood...",L_go;
-
- L_zeny1:
- if(Zeny < @betzeny1) goto L_nzeny;
- set @bet, @betzeny1;
- goto L_gamea;
- L_zeny2:
- if(Zeny < @betzeny2) goto L_nzeny;
- set @bet, @betzeny2;
- goto L_gamea;
- L_zeny3:
- if(Zeny < @betzeny3) goto L_nzeny;
- set @bet, @betzeny3;
- goto L_gamea;
- L_zeny4:
- if(Zeny < @betzeny4) goto L_nzeny;
- set @bet, @betzeny4;
- goto L_gamea;
-
-L_nzeny:
- mes "[Dicer]";
- emotion 20;
- mes "Sorry but it seems you don't have enough zeny!";
- close;
-
-L_gamea:
- mes "[Dicer]";
- mes "Would you like to try to increase your win by trying to guess the number you will get?";
- mes "It will cost you another ^0080FF"+@betnum+"^000000 zeny.";
- next;
- menu "Yes",L_gamec,"No",L_gameb;
-
-L_gamec:
- if(Zeny < @betnum + @bet) goto L_nzeny;
- mes "[Dicer]";
- mes "Please input the number you think you will get (3-18).";
- input @numg;
- if(@numg<3) message strcharinfo(0),"Number is too low, input again.";
- if(@numg>18) message strcharinfo(0),"Number is too high, input again.";
- if(@numg<3||@numg>18) goto L_gamec;
- set Zeny, Zeny - @betnum;
- next;
- goto L_gameb;
-
-L_gameb:
-
- set @dea1, rand(1,6);
- set @dea2, rand(1,6);
- set @dea3, rand(1,6);
- set @pla1, rand(1,6);
- set @pla2, rand(1,6);
- set @pla3, rand(1,6);
- set @deatot, @dea1+@dea2+@dea3;
- set @platot, @pla1+@pla2+@pla3;
-
- mes "[Dicer]";
- mes "I will be the first one to roll the dices,and after that you will throw them.I am feeling lucky today, so you better go away before I take every zeny you have.";
- next;
- mes "[^0080FFDicer 1st Turn^000000]";
- mes "Throwing first dice!";
- mes ".....roll.....roll....roll....";
- emotion 58;
- mes " ";
- mes "First throw: ^0080FF"+@dea1+" ^000000";
- next;
- mes "[^0080FFDicer 2nd Turn^000000]";
- mes "Throwing second dice!";
- emotion 58;
- mes ".....roll.....roll....roll....";
- mes " ";
- mes "Second throw: ^0080FF"+@dea2+" ^000000";
- next;
- mes "[^0080FFDicer 3rd Turn^000000]";
- mes "Throwing third dice!";
- emotion 58;
- mes ".....roll.....roll....roll....";
- mes " ";
- mes "Third throw: ^0080FF"+@dea3+" ^000000";
- next;
- mes "[Dicer]";
- mes "Now it's your turn to throw the dices.I bet you can't get higher numbers then me.";
- next;
- mes "[^0080FFPlayer 1st Turn^000000]";
- mes "Throwing first dice!";
- mes ".....roll.....roll....roll....";
- emotion 58;
- mes " ";
- mes "First throw: ^0080FF"+@pla1+" ^000000";
- next;
- mes "[^0080FFPlayer 2nd Turn^000000]";
- mes "Throwing second dice!";
- emotion 58;
- mes ".....roll.....roll....roll....";
- mes " ";
- mes "Second throw: ^0080FF"+@pla2+" ^000000";
- next;
- mes "[^0080FFPlayer 3rd Turn^000000]";
- mes "Throwing third dice!";
- emotion 58;
- mes ".....roll.....roll....roll....";
- mes " ";
- mes "Third throw: ^0080FF"+@pla3+" ^000000";
- next;
- mes "[Dicer]";
- mes "Let's look at our total numbers:";
- mes " ";
- mes "Dicer Total: ^0080FF"+@deatot+" ^000000.";
- mes "Player Total: ^0080FF"+@platot+" ^000000.";
- next;
- if (@platot < @deatot) goto L_lose;
- if (@platot == @deatot) goto L_again;
- if (@platot > @deatot && @platot == @numg) goto L_win2;
- if (@platot > @deatot) goto L_win1;
-
-L_lose:
- mes "[Dicer]";
- set Zeny, Zeny - @bet;
- emotion 39;
- mes "I got a higher number!!!";
- mes "See I told you nobody can beat me!";
- mes " ";
- mes "You lost ^0080FF"+@bet+"^000000 Zeny.";
- next;
- goto L_againa;
-
-L_again:
- mes "[Dicer]";
- emotion 54;
- mes "It seems it's a draw.Let's play again.";
- next;
- goto L_play;
-
-L_win1:
- mes "[Dicer]";
- set Zeny, Zeny + @bet*2;
- set @wona, @bet*2;
- emotion 36;
- mes "I can't belive I lost. Here take your money.";
- mes " ";
- mes "You won ^0080FF"+@wona+"^000000 Zeny.";
- next;
- goto L_againa;
-
-L_win2:
- mes "[Dicer]";
- set Zeny, Zeny + @bet*3;
- set @wonb, @bet*3;
- emotion 36;
- mes "You even guessed the total number you got.I can't belive I lost. Here is your money.";
- mes " ";
- mes "You won ^0080FF"+@wonb+"^000000 Zeny.";
- next;
- goto L_againa;
-
-L_againa:
- mes "[Dicer]";
- mes "Would you like to play again?";
- next;
- menu "Yes",L_play,"No",L_go;
-
-
-}
+//==========================================================
+//Roll a Dice NPC
+//==========================================================
+//Made by birkiczd
+//==========================================================
+//This game lets you and the Dicer throw 3 dices.
+//Whoever get's a higher number (the player or dealer) wins.
+//==========================================================
+//Version:1.0 - made script public
+// 1.1 - fixed a few bugs,added dice emos =)
+// 1.2 - made variables for the amount of zenys for
+// each bet so it is easy for people to costumize
+// the script
+// 1.3 - added more emoticons,made an Info menu
+// option which contains explanations and rules,
+// added the amount of lost/won zeny on the end
+// of each game,added more colors
+// 1.4 - some small code optimization thanks to Myzter
+//==========================================================
+
+
+cmd_in02.gat,181,98,2 script Dicer 57,{
+
+//These variables allow you to set the amount of zeny people can bet
+set @betzeny1,500; //500 zeny
+set @betzeny2,1000; //1000 zeny
+set @betzeny3,2000; //2000 zeny
+set @betzeny4,10000; //10000 zeny
+
+//Variable for the number guess zeny bet
+set @betnum, 1000; //1000 Zeny
+
+
+ mes "[Dicer]";
+ mes "Welcome to the Revolution Dice Game.You wanna check your luck with dices?Remember I am the dice expert and rarely someone was able to beat me.";
+ next;
+ mes "[Dicer]";
+ mes "What would you like to do?";
+ next;
+ menu "Play",L_play,"Info",L_info,"Go away",L_go;
+
+L_go:
+ mes "[Dicer]";
+ mes "Please come again when you are ready.";
+ close;
+
+L_info:
+ mes "[Dicer]";
+ mes "Please choose one of the following options for more informations:";
+ next;
+ menu "Main Rules",L_main,"Bets and Wins",L_bet,"Extra Games",L_extra,"Go away",L_go;
+
+L_main:
+ mes "[Dicer]";
+ mes "^0080FFRoll A Dice^000000 is a very simple game.The game allows you and the NPC to throw 3 dices.Whoever gets a higher total number wins.";
+ next;
+ goto L_info;
+
+L_bet:
+ mes "[Dicer]";
+ mes "You have 4 zeny amounts to choose for your bet.If you choose a high bet your win will also be higher,it is that simple.Also various extra games can increase your win.";
+ next;
+ mes "[Dicer]";
+ mes "Example:";
+ mes "^0080FFBet^000000 ^0080FFWin^000000";
+ mes "500 1000";
+ mes "1000 2000";
+ mes "2000 4000";
+ mes "10000 20000";
+ next;
+ goto L_info;
+
+L_extra:
+ mes "[Dicer]";
+ mes "You can also try increasing your win by playing extra games like guessing your total number at the end of the game.It will cost you an extra amount of zeny but if you guess the number your win will be tripled instead of doubled.";
+ next;
+ goto L_info;
+
+L_play:
+ mes "[Dicer]";
+ mes "Ok,please choose the amount of zeny you want to bet:";
+ next;
+ menu ""+@betzeny1+" Zeny",L_zeny1,""+@betzeny2+" Zeny",L_zeny2,""+@betzeny3+" Zeny",L_zeny3,""+@betzeny4+" Zeny",L_zeny4,"Too rich for my blood...",L_go;
+
+ L_zeny1:
+ if(Zeny < @betzeny1) goto L_nzeny;
+ set @bet, @betzeny1;
+ goto L_gamea;
+ L_zeny2:
+ if(Zeny < @betzeny2) goto L_nzeny;
+ set @bet, @betzeny2;
+ goto L_gamea;
+ L_zeny3:
+ if(Zeny < @betzeny3) goto L_nzeny;
+ set @bet, @betzeny3;
+ goto L_gamea;
+ L_zeny4:
+ if(Zeny < @betzeny4) goto L_nzeny;
+ set @bet, @betzeny4;
+ goto L_gamea;
+
+L_nzeny:
+ mes "[Dicer]";
+ emotion 20;
+ mes "Sorry but it seems you don't have enough zeny!";
+ close;
+
+L_gamea:
+ mes "[Dicer]";
+ mes "Would you like to try to increase your win by trying to guess the number you will get?";
+ mes "It will cost you another ^0080FF"+@betnum+"^000000 zeny.";
+ next;
+ menu "Yes",L_gamec,"No",L_gameb;
+
+L_gamec:
+ if(Zeny < @betnum + @bet) goto L_nzeny;
+ mes "[Dicer]";
+ mes "Please input the number you think you will get (3-18).";
+ input @numg;
+ if(@numg<3) message strcharinfo(0),"Number is too low, input again.";
+ if(@numg>18) message strcharinfo(0),"Number is too high, input again.";
+ if(@numg<3||@numg>18) goto L_gamec;
+ set Zeny, Zeny - @betnum;
+ next;
+ goto L_gameb;
+
+L_gameb:
+
+ set @dea1, rand(1,6);
+ set @dea2, rand(1,6);
+ set @dea3, rand(1,6);
+ set @pla1, rand(1,6);
+ set @pla2, rand(1,6);
+ set @pla3, rand(1,6);
+ set @deatot, @dea1+@dea2+@dea3;
+ set @platot, @pla1+@pla2+@pla3;
+
+ mes "[Dicer]";
+ mes "I will be the first one to roll the dices,and after that you will throw them.I am feeling lucky today, so you better go away before I take every zeny you have.";
+ next;
+ mes "[^0080FFDicer 1st Turn^000000]";
+ mes "Throwing first dice!";
+ mes ".....roll.....roll....roll....";
+ emotion 58;
+ mes " ";
+ mes "First throw: ^0080FF"+@dea1+" ^000000";
+ next;
+ mes "[^0080FFDicer 2nd Turn^000000]";
+ mes "Throwing second dice!";
+ emotion 58;
+ mes ".....roll.....roll....roll....";
+ mes " ";
+ mes "Second throw: ^0080FF"+@dea2+" ^000000";
+ next;
+ mes "[^0080FFDicer 3rd Turn^000000]";
+ mes "Throwing third dice!";
+ emotion 58;
+ mes ".....roll.....roll....roll....";
+ mes " ";
+ mes "Third throw: ^0080FF"+@dea3+" ^000000";
+ next;
+ mes "[Dicer]";
+ mes "Now it's your turn to throw the dices.I bet you can't get higher numbers then me.";
+ next;
+ mes "[^0080FFPlayer 1st Turn^000000]";
+ mes "Throwing first dice!";
+ mes ".....roll.....roll....roll....";
+ emotion 58;
+ mes " ";
+ mes "First throw: ^0080FF"+@pla1+" ^000000";
+ next;
+ mes "[^0080FFPlayer 2nd Turn^000000]";
+ mes "Throwing second dice!";
+ emotion 58;
+ mes ".....roll.....roll....roll....";
+ mes " ";
+ mes "Second throw: ^0080FF"+@pla2+" ^000000";
+ next;
+ mes "[^0080FFPlayer 3rd Turn^000000]";
+ mes "Throwing third dice!";
+ emotion 58;
+ mes ".....roll.....roll....roll....";
+ mes " ";
+ mes "Third throw: ^0080FF"+@pla3+" ^000000";
+ next;
+ mes "[Dicer]";
+ mes "Let's look at our total numbers:";
+ mes " ";
+ mes "Dicer Total: ^0080FF"+@deatot+" ^000000.";
+ mes "Player Total: ^0080FF"+@platot+" ^000000.";
+ next;
+ if (@platot < @deatot) goto L_lose;
+ if (@platot == @deatot) goto L_again;
+ if (@platot > @deatot && @platot == @numg) goto L_win2;
+ if (@platot > @deatot) goto L_win1;
+
+L_lose:
+ mes "[Dicer]";
+ set Zeny, Zeny - @bet;
+ emotion 39;
+ mes "I got a higher number!!!";
+ mes "See I told you nobody can beat me!";
+ mes " ";
+ mes "You lost ^0080FF"+@bet+"^000000 Zeny.";
+ next;
+ goto L_againa;
+
+L_again:
+ mes "[Dicer]";
+ emotion 54;
+ mes "It seems it's a draw.Let's play again.";
+ next;
+ goto L_play;
+
+L_win1:
+ mes "[Dicer]";
+ set Zeny, Zeny + @bet*2;
+ set @wona, @bet*2;
+ emotion 36;
+ mes "I can't belive I lost. Here take your money.";
+ mes " ";
+ mes "You won ^0080FF"+@wona+"^000000 Zeny.";
+ next;
+ goto L_againa;
+
+L_win2:
+ mes "[Dicer]";
+ set Zeny, Zeny + @bet*3;
+ set @wonb, @bet*3;
+ emotion 36;
+ mes "You even guessed the total number you got.I can't belive I lost. Here is your money.";
+ mes " ";
+ mes "You won ^0080FF"+@wonb+"^000000 Zeny.";
+ next;
+ goto L_againa;
+
+L_againa:
+ mes "[Dicer]";
+ mes "Would you like to play again?";
+ next;
+ menu "Yes",L_play,"No",L_go;
+
+
+}
diff --git a/npc/custom/eAAC_Scripts/vendmachine.txt b/npc/custom/eAAC_Scripts/vendmachine.txt
index 82a514c8d..ac7735b23 100644
--- a/npc/custom/eAAC_Scripts/vendmachine.txt
+++ b/npc/custom/eAAC_Scripts/vendmachine.txt
@@ -1,296 +1,296 @@
-//=====================================
-// Vending Machine Script
-// v2.3
-//=====================================
-// by Celestria
-//=====================================
-// Changelog:
-// 2.3 - Added in "Slam" feature, as well as admin ability to turn machine on and off.
-// - Added admin menu. Allows GMs to put machines in/out of service, and to clear
-// all jammed items.
-//
-// 2.2 - Added in/Renamed some variables to allow a single machine to block on several
-// items simultaneously. This fix also allows the two-item drop to work with every
-// item the machine is jammed on.
-//
-// 2.1 - Fixed an error where if one machine jammed on a menu item (say 3 for example),
-// if another machine also jammed on the same menu item (3 in this case), the original
-// machine to jam would be unjammed.
-// - This fix only allows a machine to jam one item at a time. Will fix in the future.
-//
-// 2.0 - Completely redid the script using a call-function.
-// Now all replica scripts can simply be a copy of Vending Machine,
-// but with variables modified to suit it''s intended use.
-//
-// 1.1 - Fixed $jamplayer1 not being a string, thanks to Terces.
-// - Changed random number that intiates jam to 1, to allow for faster modification of jam rates.
-//
-// 1.0 - Creted a script for selling numerous items that would occasionally jam on players.
-// - Used numbered variables to allow for multiplacation of the script.
-//=====================================
-
-p_track01.gat,45,58,4 script Vending Machine#1 910,{
-
- set @machine,1; //sets the unique number of this machine
- //DO NOT have two machines with the same number
-
- set @jamrate,1000; //Odds of machine jamming will be 1 in @jamrate
-
- set @slam,0; //set this to 0 to turn on the slam feature, any other setting disables it.
- set @fallrate,10; //Odds of machine falling on someone who hits it are 1 in @fallrate
- set @freerate,10000; //Odds of machine giving an item to someone who hits it are 1 in @freerate
-
- set @admin,99; //sets GM level needed to access Admin menu
-
- // the following sets the items for sale. Script currently only handles 10 items.
- setarray @item[0], 12143, 519, 565;
- setarray @price[0], 100, 50, 200;
-
- set @itemn$[0], getitemname(@item[0]);
- set @itemn$[1], getitemname(@item[1]);
- set @itemn$[2], getitemname(@item[2]);
- set @itemn$[3], getitemname(@item[3]);
- set @itemn$[4], getitemname(@item[4]);
- set @itemn$[5], getitemname(@item[5]);
- set @itemn$[6], getitemname(@item[6]);
- set @itemn$[7], getitemname(@item[7]);
- set @itemn$[8], getitemname(@item[8]);
- set @itemn$[9], getitemname(@item[9]);
-
- set @menu$[0], @itemn$[0]+" - "+@price[0];
- set @menu$[1], @itemn$[1]+" - "+@price[1];
- set @menu$[2], @itemn$[2]+" - "+@price[2];
- set @menu$[3], "Cancel";
- set @menu$[4], "";
- set @menu$[5], "";
- set @menu$[6], "";
- set @menu$[7], "";
- set @menu$[8], "";
- set @menu$[9], "";
- set @menu$[10], ""; // "Cancel" only. Used if vending ten items.
-
- callfunc "F_Vend1";
-}
-
-
-
-
-
-
-
-
-
-//===============================================================================================
-// Functions
-//
-// !!!DO NOT EDIT BELOW THIS LINE!!!
-//
-//===============================================================================================
-
-function script F_Vend1 {
-
- if(getgmlevel() >= @admin) goto M_Admin;
-
-M_Player:
- if($outorder[@machine]) goto M_Ooo;
- if(@slam) callfunc "F_Vend2";
- mes "You see a vending machine. What would you like to do?";
- next;
- menu "Buy an item",M_Vend,"Hit it",M_Hit;
-
-M_Vend:
- callfunc "F_Vend2";
- end;
-
-M_Hit:
- callfunc "F_Slam";
- end;
-
-M_Admin:
- mes "[Admin Mode]";
- mes "What would you like to do?";
- next;
- menu "Player Mode",M_Player,"Post 'Out of Order'",M_Ooo2,"Remove 'Out of Order'",M_Ooo3,"Fix Jammed Items",M_Fix;
-
-M_Ooo:
- mes "Out of Order";
- close;
-
-M_Ooo2:
- set $outorder[@machine],1;
- mes "The machine is now Out of Service";
- close;
-
-M_Ooo3:
- set $outorder[@machine],0;
- mes "The machine is now in service.";
- close;
-
-M_Fix:
- set $itemjam0$[@machine],"0";
- set $itemjam1$[@machine],"0";
- set $itemjam2$[@machine],"0";
- set $itemjam3$[@machine],"0";
- set $itemjam4$[@machine],"0";
- set $itemjam5$[@machine],"0";
- set $itemjam6$[@machine],"0";
- set $itemjam7$[@machine],"0";
- set $itemjam8$[@machine],"0";
- set $itemjam9$[@machine],"0";
- mes "All jammed items have been fixed.";
- close;
-}
-
-function script F_Vend2 {
-
- if(strcharinfo(0)==$itemjam0$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam1$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam2$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam3$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam4$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam5$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam6$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam7$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam8$[@machine]) goto B_StillJammed;
- if(strcharinfo(0)==$itemjam9$[@machine]) goto B_StillJammed;
- set @jammed,rand(1,@jamrate);
- mes "You peek inside the vending machine to see what's available.";
- next;
- menu @menu$[0],M_Ite0, @menu$[1],M_Ite1, @menu$[2],M_Ite2, @menu$[3],M_Ite3,
- @menu$[4],M_Ite4, @menu$[5],M_Ite5, @menu$[6],M_Ite6, @menu$[7],M_Ite7,
- @menu$[8],M_Ite8, @menu$[9],M_Ite9, @menu$[10],M_Ite10;
-
- M_Ite0:
- set @num, 0;
- goto B_Buy;
- M_Ite1:
- set @num, 1;
- goto B_Buy;
- M_Ite2:
- set @num, 2;
- goto B_Buy;
- M_Ite3:
- set @num, 3;
- goto B_Buy;
- M_Ite4:
- set @num, 4;
- goto B_Buy;
- M_Ite5:
- set @num, 5;
- goto B_Buy;
- M_Ite6:
- set @num, 6;
- goto B_Buy;
- M_Ite7:
- set @num, 7;
- goto B_Buy;
- M_Ite8:
- set @num, 8;
- goto B_Buy;
- M_Ite9:
- set @num, 9;
- goto B_Buy;
- M_Ite10:
- set @num, 10;
- goto B_Buy;
-
-
-
-B_Cancel:
- mes "On second thoughts, you decide not to buy anything.";
- close;
-
-B_StillJammed:
- mes "You shake and punch the vending machine, but it appears no matter how much energy you exert, the dang item isn't going to come loose.";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "DANG VENDING MACHINES!";
- close;
-
-B_Broke:
- mes "As you put your last zeny in, you realise you don't have enough to afford the product.";
- mes "Sadly you hit the refund button and pick up what little zeny you have.";
- close;
-
-B_Buy:
- if (@menu$[@num] == "Cancel") goto B_Cancel;
- if(@num==0){if($itemjam0$[@machine]!="0") set @jammed,0;}
- if(@num==1){if($itemjam1$[@machine]!="0") set @jammed,0;}
- if(@num==2){if($itemjam2$[@machine]!="0") set @jammed,0;}
- if(@num==3){if($itemjam3$[@machine]!="0") set @jammed,0;}
- if(@num==4){if($itemjam4$[@machine]!="0") set @jammed,0;}
- if(@num==5){if($itemjam5$[@machine]!="0") set @jammed,0;}
- if(@num==6){if($itemjam6$[@machine]!="0") set @jammed,0;}
- if(@num==7){if($itemjam7$[@machine]!="0") set @jammed,0;}
- if(@num==8){if($itemjam8$[@machine]!="0") set @jammed,0;}
- if(@num==9){if($itemjam9$[@machine]!="0") set @jammed,0;}
- if(Zeny < @price[@num]) goto B_Broke;
- set Zeny,Zeny-@price[@num];
- if(@jammed == 1) goto B_Jamitem;
- mes "Vrrrrrrrr~";
- mes "*clunk*";
- next;
- if(@jammed == 0) goto B_Get2;
- getitem @item[@num],1;
- mes "A "+@itemn$[@num]+" pops out.";
- close;
-B_Get2:
- getitem @item[@num],2;
- mes "What the!?";
- mes "Two "+@itemn$[@num]+"s popped out!";
- mes "It must be your lucky day.";
- if(@num==0) set $itemjam0$[@machine],"0";
- if(@num==1) set $itemjam1$[@machine],"0";
- if(@num==2) set $itemjam2$[@machine],"0";
- if(@num==3) set $itemjam3$[@machine],"0";
- if(@num==4) set $itemjam4$[@machine],"0";
- if(@num==5) set $itemjam5$[@machine],"0";
- if(@num==6) set $itemjam6$[@machine],"0";
- if(@num==7) set $itemjam7$[@machine],"0";
- if(@num==8) set $itemjam8$[@machine],"0";
- if(@num==9) set $itemjam9$[@machine],"0";
- close;
-B_Jamitem:
- mes "Vrrrrrrrr~";
- mes "*click*";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Dammit!";
- mes "I hate it when these damn things jam!";
- if(@num==0) set $itemjam0$[@machine],strcharinfo(0);
- if(@num==1) set $itemjam1$[@machine],strcharinfo(0);
- if(@num==2) set $itemjam2$[@machine],strcharinfo(0);
- if(@num==3) set $itemjam3$[@machine],strcharinfo(0);
- if(@num==4) set $itemjam4$[@machine],strcharinfo(0);
- if(@num==5) set $itemjam5$[@machine],strcharinfo(0);
- if(@num==6) set $itemjam6$[@machine],strcharinfo(0);
- if(@num==7) set $itemjam7$[@machine],strcharinfo(0);
- if(@num==8) set $itemjam8$[@machine],strcharinfo(0);
- if(@num==9) set $itemjam9$[@machine],strcharinfo(0);
- close;
-}
-
-function script F_Slam {
-
- set @fall,rand(1,@fallrate);
- set @free,rand(1,@freerate);
-R_Item:
- set @num,rand(9);
- if(@item[@num]==0) goto R_Item;
-
- mes "You give the vending machine a good solid whack.";
- next;
- mes "...";
- next;
- if(@fall==1){
- mes "The machine shakes, and then falls directly on top of you.";
- close2;
- percentheal -100,-100;
- end;}
- if(@free==1){
- getitem @item[@num],1;
- mes "The machine shakes, and then drops an item.";
- close;}
- mes "The machine shakes, but nothing happens";
- close;
-}
+//=====================================
+// Vending Machine Script
+// v2.3
+//=====================================
+// by Celestria
+//=====================================
+// Changelog:
+// 2.3 - Added in "Slam" feature, as well as admin ability to turn machine on and off.
+// - Added admin menu. Allows GMs to put machines in/out of service, and to clear
+// all jammed items.
+//
+// 2.2 - Added in/Renamed some variables to allow a single machine to block on several
+// items simultaneously. This fix also allows the two-item drop to work with every
+// item the machine is jammed on.
+//
+// 2.1 - Fixed an error where if one machine jammed on a menu item (say 3 for example),
+// if another machine also jammed on the same menu item (3 in this case), the original
+// machine to jam would be unjammed.
+// - This fix only allows a machine to jam one item at a time. Will fix in the future.
+//
+// 2.0 - Completely redid the script using a call-function.
+// Now all replica scripts can simply be a copy of Vending Machine,
+// but with variables modified to suit it''s intended use.
+//
+// 1.1 - Fixed $jamplayer1 not being a string, thanks to Terces.
+// - Changed random number that intiates jam to 1, to allow for faster modification of jam rates.
+//
+// 1.0 - Creted a script for selling numerous items that would occasionally jam on players.
+// - Used numbered variables to allow for multiplacation of the script.
+//=====================================
+
+p_track01.gat,45,58,4 script Vending Machine#1 910,{
+
+ set @machine,1; //sets the unique number of this machine
+ //DO NOT have two machines with the same number
+
+ set @jamrate,1000; //Odds of machine jamming will be 1 in @jamrate
+
+ set @slam,0; //set this to 0 to turn on the slam feature, any other setting disables it.
+ set @fallrate,10; //Odds of machine falling on someone who hits it are 1 in @fallrate
+ set @freerate,10000; //Odds of machine giving an item to someone who hits it are 1 in @freerate
+
+ set @admin,99; //sets GM level needed to access Admin menu
+
+ // the following sets the items for sale. Script currently only handles 10 items.
+ setarray @item[0], 12143, 519, 565;
+ setarray @price[0], 100, 50, 200;
+
+ set @itemn$[0], getitemname(@item[0]);
+ set @itemn$[1], getitemname(@item[1]);
+ set @itemn$[2], getitemname(@item[2]);
+ set @itemn$[3], getitemname(@item[3]);
+ set @itemn$[4], getitemname(@item[4]);
+ set @itemn$[5], getitemname(@item[5]);
+ set @itemn$[6], getitemname(@item[6]);
+ set @itemn$[7], getitemname(@item[7]);
+ set @itemn$[8], getitemname(@item[8]);
+ set @itemn$[9], getitemname(@item[9]);
+
+ set @menu$[0], @itemn$[0]+" - "+@price[0];
+ set @menu$[1], @itemn$[1]+" - "+@price[1];
+ set @menu$[2], @itemn$[2]+" - "+@price[2];
+ set @menu$[3], "Cancel";
+ set @menu$[4], "";
+ set @menu$[5], "";
+ set @menu$[6], "";
+ set @menu$[7], "";
+ set @menu$[8], "";
+ set @menu$[9], "";
+ set @menu$[10], ""; // "Cancel" only. Used if vending ten items.
+
+ callfunc "F_Vend1";
+}
+
+
+
+
+
+
+
+
+
+//===============================================================================================
+// Functions
+//
+// !!!DO NOT EDIT BELOW THIS LINE!!!
+//
+//===============================================================================================
+
+function script F_Vend1 {
+
+ if(getgmlevel() >= @admin) goto M_Admin;
+
+M_Player:
+ if($outorder[@machine]) goto M_Ooo;
+ if(@slam) callfunc "F_Vend2";
+ mes "You see a vending machine. What would you like to do?";
+ next;
+ menu "Buy an item",M_Vend,"Hit it",M_Hit;
+
+M_Vend:
+ callfunc "F_Vend2";
+ end;
+
+M_Hit:
+ callfunc "F_Slam";
+ end;
+
+M_Admin:
+ mes "[Admin Mode]";
+ mes "What would you like to do?";
+ next;
+ menu "Player Mode",M_Player,"Post 'Out of Order'",M_Ooo2,"Remove 'Out of Order'",M_Ooo3,"Fix Jammed Items",M_Fix;
+
+M_Ooo:
+ mes "Out of Order";
+ close;
+
+M_Ooo2:
+ set $outorder[@machine],1;
+ mes "The machine is now Out of Service";
+ close;
+
+M_Ooo3:
+ set $outorder[@machine],0;
+ mes "The machine is now in service.";
+ close;
+
+M_Fix:
+ set $itemjam0$[@machine],"0";
+ set $itemjam1$[@machine],"0";
+ set $itemjam2$[@machine],"0";
+ set $itemjam3$[@machine],"0";
+ set $itemjam4$[@machine],"0";
+ set $itemjam5$[@machine],"0";
+ set $itemjam6$[@machine],"0";
+ set $itemjam7$[@machine],"0";
+ set $itemjam8$[@machine],"0";
+ set $itemjam9$[@machine],"0";
+ mes "All jammed items have been fixed.";
+ close;
+}
+
+function script F_Vend2 {
+
+ if(strcharinfo(0)==$itemjam0$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam1$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam2$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam3$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam4$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam5$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam6$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam7$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam8$[@machine]) goto B_StillJammed;
+ if(strcharinfo(0)==$itemjam9$[@machine]) goto B_StillJammed;
+ set @jammed,rand(1,@jamrate);
+ mes "You peek inside the vending machine to see what's available.";
+ next;
+ menu @menu$[0],M_Ite0, @menu$[1],M_Ite1, @menu$[2],M_Ite2, @menu$[3],M_Ite3,
+ @menu$[4],M_Ite4, @menu$[5],M_Ite5, @menu$[6],M_Ite6, @menu$[7],M_Ite7,
+ @menu$[8],M_Ite8, @menu$[9],M_Ite9, @menu$[10],M_Ite10;
+
+ M_Ite0:
+ set @num, 0;
+ goto B_Buy;
+ M_Ite1:
+ set @num, 1;
+ goto B_Buy;
+ M_Ite2:
+ set @num, 2;
+ goto B_Buy;
+ M_Ite3:
+ set @num, 3;
+ goto B_Buy;
+ M_Ite4:
+ set @num, 4;
+ goto B_Buy;
+ M_Ite5:
+ set @num, 5;
+ goto B_Buy;
+ M_Ite6:
+ set @num, 6;
+ goto B_Buy;
+ M_Ite7:
+ set @num, 7;
+ goto B_Buy;
+ M_Ite8:
+ set @num, 8;
+ goto B_Buy;
+ M_Ite9:
+ set @num, 9;
+ goto B_Buy;
+ M_Ite10:
+ set @num, 10;
+ goto B_Buy;
+
+
+
+B_Cancel:
+ mes "On second thoughts, you decide not to buy anything.";
+ close;
+
+B_StillJammed:
+ mes "You shake and punch the vending machine, but it appears no matter how much energy you exert, the dang item isn't going to come loose.";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "DANG VENDING MACHINES!";
+ close;
+
+B_Broke:
+ mes "As you put your last zeny in, you realise you don't have enough to afford the product.";
+ mes "Sadly you hit the refund button and pick up what little zeny you have.";
+ close;
+
+B_Buy:
+ if (@menu$[@num] == "Cancel") goto B_Cancel;
+ if(@num==0){if($itemjam0$[@machine]!="0") set @jammed,0;}
+ if(@num==1){if($itemjam1$[@machine]!="0") set @jammed,0;}
+ if(@num==2){if($itemjam2$[@machine]!="0") set @jammed,0;}
+ if(@num==3){if($itemjam3$[@machine]!="0") set @jammed,0;}
+ if(@num==4){if($itemjam4$[@machine]!="0") set @jammed,0;}
+ if(@num==5){if($itemjam5$[@machine]!="0") set @jammed,0;}
+ if(@num==6){if($itemjam6$[@machine]!="0") set @jammed,0;}
+ if(@num==7){if($itemjam7$[@machine]!="0") set @jammed,0;}
+ if(@num==8){if($itemjam8$[@machine]!="0") set @jammed,0;}
+ if(@num==9){if($itemjam9$[@machine]!="0") set @jammed,0;}
+ if(Zeny < @price[@num]) goto B_Broke;
+ set Zeny,Zeny-@price[@num];
+ if(@jammed == 1) goto B_Jamitem;
+ mes "Vrrrrrrrr~";
+ mes "*clunk*";
+ next;
+ if(@jammed == 0) goto B_Get2;
+ getitem @item[@num],1;
+ mes "A "+@itemn$[@num]+" pops out.";
+ close;
+B_Get2:
+ getitem @item[@num],2;
+ mes "What the!?";
+ mes "Two "+@itemn$[@num]+"s popped out!";
+ mes "It must be your lucky day.";
+ if(@num==0) set $itemjam0$[@machine],"0";
+ if(@num==1) set $itemjam1$[@machine],"0";
+ if(@num==2) set $itemjam2$[@machine],"0";
+ if(@num==3) set $itemjam3$[@machine],"0";
+ if(@num==4) set $itemjam4$[@machine],"0";
+ if(@num==5) set $itemjam5$[@machine],"0";
+ if(@num==6) set $itemjam6$[@machine],"0";
+ if(@num==7) set $itemjam7$[@machine],"0";
+ if(@num==8) set $itemjam8$[@machine],"0";
+ if(@num==9) set $itemjam9$[@machine],"0";
+ close;
+B_Jamitem:
+ mes "Vrrrrrrrr~";
+ mes "*click*";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Dammit!";
+ mes "I hate it when these damn things jam!";
+ if(@num==0) set $itemjam0$[@machine],strcharinfo(0);
+ if(@num==1) set $itemjam1$[@machine],strcharinfo(0);
+ if(@num==2) set $itemjam2$[@machine],strcharinfo(0);
+ if(@num==3) set $itemjam3$[@machine],strcharinfo(0);
+ if(@num==4) set $itemjam4$[@machine],strcharinfo(0);
+ if(@num==5) set $itemjam5$[@machine],strcharinfo(0);
+ if(@num==6) set $itemjam6$[@machine],strcharinfo(0);
+ if(@num==7) set $itemjam7$[@machine],strcharinfo(0);
+ if(@num==8) set $itemjam8$[@machine],strcharinfo(0);
+ if(@num==9) set $itemjam9$[@machine],strcharinfo(0);
+ close;
+}
+
+function script F_Slam {
+
+ set @fall,rand(1,@fallrate);
+ set @free,rand(1,@freerate);
+R_Item:
+ set @num,rand(9);
+ if(@item[@num]==0) goto R_Item;
+
+ mes "You give the vending machine a good solid whack.";
+ next;
+ mes "...";
+ next;
+ if(@fall==1){
+ mes "The machine shakes, and then falls directly on top of you.";
+ close2;
+ percentheal -100,-100;
+ end;}
+ if(@free==1){
+ getitem @item[@num],1;
+ mes "The machine shakes, and then drops an item.";
+ close;}
+ mes "The machine shakes, but nothing happens";
+ close;
+}
diff --git a/npc/custom/eliza.txt b/npc/custom/eliza.txt
index 7915492b5..c5e7c3d43 100644
--- a/npc/custom/eliza.txt
+++ b/npc/custom/eliza.txt
@@ -1,702 +1,702 @@
-prontera.gat,152,181,5 script MouseJstr 763,{
-
-// hello
-Lquote0:
- npctalk "How do you do. Please state your problem.";
- end;
-// computer
-Lquote1:
- set $foo,rand(4);
- if($foo == 0) goto Lquote1a;
- if($foo == 1) goto Lquote1b;
- if($foo == 2) goto Lquote1c;
- if($foo == 3) goto Lquote1d;
-Lquote1a:
- npctalk "Do computers worry you?";
- end;
-Lquote1b:
- npctalk "What do you think about machines?";
- end;
-Lquote1c:
- npctalk "Why do you mention computers?";
- end;
-Lquote1d:
- npctalk "What do you think machines have to do with your problem?";
- end;
-// name
-Lquote2:
- npctalk "I am not interested in names";
- end;
-// sorry
-Lquote3:
- set $foo,rand(3);
- if($foo == 0) goto Lquote3a;
- if($foo == 1) goto Lquote3b;
- if($foo == 2) goto Lquote3c;
-
-Lquote3a:
- npctalk "Please don't apologize";
- end;
-
-Lquote3b:
- npctalk "Apologies are not necessary";
- end;
-
-Lquote3c:
- npctalk "What feelings do you have when you apologize";
- end;
-
-// I remember $p2$
-Lquote4:
- set $foo,rand(6);
- if($foo == 0) goto Lquote4a;
- if($foo == 1) goto Lquote4b;
- if($foo == 2) goto Lquote4c;
- if($foo == 3) goto Lquote4d;
- if($foo == 4) goto Lquote4e;
- if($foo == 5) goto Lquote4f;
-
-Lquote4a:
- npctalk "Do you often think of "+$p2$+"?";
- end;
-
-Lquote4b:
- npctalk "Does thinking of "+$p2$+" bring anything else to mind?";
- end;
-
-Lquote4c:
- npctalk "What else do you remember?";
- end;
-
-Lquote4d:
- npctalk "Why do you recall "+$p2$+" right now?";
- end;
-
-Lquote4e:
- npctalk "What in the present situation reminds you of "+$p2$+"?";
- end;
-
-Lquote4f:
- npctalk "What is the connection between me and "+$p2$+"?";
- end;
-
-// do you remember
-Lquote5:
- set $foo,rand(4);
- if($foo == 0) goto Lquote5a;
- if($foo == 1) goto Lquote5b;
- if($foo == 2) goto Lquote5c;
- if($foo == 3) goto Lquote5d;
-Lquote5a:
- npctalk "Did you think I would forget "+$p2$+" ?";
- end;
-
-Lquote5b:
- npctalk "Why do you think I should recall "+$p2$+" now";
- end;
-
-Lquote5c:
- npctalk "What about "+$p2$+"";
- end;
-
-Lquote5d:
- npctalk "You mentioned "+$p2$+"";
- end;
-
-// if
-Lquote6:
- set $foo,rand(4);
- if($foo == 0) goto Lquote6a;
- if($foo == 1) goto Lquote6b;
- if($foo == 2) goto Lquote6c;
- if($foo == 3) goto Lquote6d;
-Lquote6a:
- npctalk "Do you really think its likely that "+$p2$+"";
- end;
-
-Lquote6b:
- npctalk "Do you wish that "+$p2$+"?";
- end;
-
-Lquote6c:
- npctalk "What do you think about "+$p2$+"?";
- end;
-
-Lquote6d:
- npctalk "Really-- if "+$p2$+"?";
- end;
-
-// i dreamt
-Lquote7:
- set $foo,rand(3);
- if($foo == 0) goto Lquote7a;
- if($foo == 1) goto Lquote7b;
- if($foo == 2) goto Lquote7c;
-Lquote7a:
- npctalk "Really-- "+$p2$+"";
- end;
-
-Lquote7b:
- npctalk "Have you ever fantasized "+$p2$+" while you were awake?";
- end;
-
-Lquote7c:
- npctalk "Have you dreamt "+$p2$+" before?";
- end;
-
-// dream about
-
-Lquote8:
- npctalk "How do you feel about "+$p2$+" in reality?";
- end;
-
-// dream
-Lquote9:
- set $foo,rand(4);
- if($foo == 0) goto Lquote9a;
- if($foo == 1) goto Lquote9b;
- if($foo == 2) goto Lquote9c;
- if($foo == 3) goto Lquote9d;
-Lquote9a:
- npctalk "What does this dream suggest to you?";
- end;
-
-Lquote9b:
- npctalk "Do you dream often?";
- end;
-
-Lquote9c:
- npctalk "What persons appear in your dreams?";
- end;
-
-Lquote9d:
- npctalk "Don't you believe that dream has to do with your problem?";
- end;
-
-// my mother
-Lquote10:
- set $foo,rand(2);
- if($foo == 0) goto Lquote10a;
- if($foo == 1) goto Lquote10b;
-Lquote10a:
- npctalk "Who else in your family "+$p2$+"";
- end;
-
-Lquote10b:
- npctalk "Tell me more about your family";
- end;
-
-// my father
-Lquote11:
- set $foo,rand(3);
- if($foo == 0) goto Lquote11a;
- if($foo == 1) goto Lquote11b;
- if($foo == 2) goto Lquote11c;
-Lquote11a:
- npctalk "Your father";
- end;
-
-Lquote11b:
- npctalk "Does he influence you strongly?";
- end;
-
-Lquote11c:
- npctalk "What else comes to mind when you think of your father?";
- end;
-
-// I want
-Lquote12:
- set $foo,rand(3);
- if($foo == 0) goto Lquote12a;
- if($foo == 1) goto Lquote12b;
- if($foo == 2) goto Lquote12c;
-Lquote12a:
- npctalk "What would it mean if you got "+$p2$+"";
- end;
-
-Lquote12b:
- npctalk "Why do you want "+$p2$+"";
- end;
-
-Lquote12c:
- npctalk "Suppose you got "+$p2$+" soon";
- end;
-
-// I am glad
-Lquote13:
- set $foo,rand(3);
- if($foo == 0) goto Lquote13a;
- if($foo == 1) goto Lquote13b;
- if($foo == 2) goto Lquote13c;
-Lquote13a:
- npctalk "How have I helped you to be "+$p2$+"";
- end;
-
-Lquote13b:
- npctalk "What makes you happy just now";
- end;
-
-Lquote13c:
- npctalk "Can you explain why you are suddenly "+$p2$+"";
- end;
-
-// I am sad
-Lquote14:
- set $foo,rand(2);
- if($foo == 0) goto Lquote14a;
- if($foo == 1) goto Lquote14b;
-Lquote14a:
- npctalk "I am sorry to hear you are depressed";
- end;
-
-Lquote14b:
- npctalk "I'm sure its not pleasant to be sad";
- end;
-
-// $p2 are like "+$p3$+"
-Lquote15:
- npctalk "What resemblance do you see between "+$p2$+" and "+$p3$+"";
- end;
-
-// "+$p2$+" is like "+$p3$+"
-Lquote16:
- set $foo,rand(4);
- if($foo == 0) goto Lquote16a;
- if($foo == 1) goto Lquote16b;
- if($foo == 2) goto Lquote16c;
- if($foo == 3) goto Lquote16d;
-Lquote16a:
- npctalk "In what way is it that "+$p2$+" is like "+$p3$+"";
- end;
-
-Lquote16b:
- npctalk "What resemblance do you see?";
- end;
-
-Lquote16c:
- npctalk "Could there really be some connection?";
- end;
-
-Lquote16d:
- npctalk "How?";
- end;
-// alike
-Lquote17:
- set $foo,rand(2);
- if($foo == 0) goto Lquote17a;
- if($foo == 1) goto Lquote17b;
-Lquote17a:
- npctalk "In what way?";
- end;
-
-Lquote17b:
- npctalk "What similarities are there?";
- end;
-// same
-Lquote18:
- npctalk "What other connections do you see?";
- end;
-
-// I was "+$p2$+"
-Lquote19:
- set $foo,rand(3);
- if($foo == 0) goto Lquote19a;
- if($foo == 1) goto Lquote19b;
- if($foo == 2) goto Lquote19c;
-Lquote19a:
- npctalk "Were you really?";
- end;
-
-Lquote19b:
- npctalk "Perhaps I already knew you were "+$p2$+"";
- end;
-
-Lquote19c:
- npctalk "Why do you tell me you were "+$p2$+" now?";
- end;
-
-// was I
-Lquote20:
- set $foo,rand(3);
- if($foo == 0) goto Lquote20a;
- if($foo == 1) goto Lquote20b;
- if($foo == 2) goto Lquote20c;
-Lquote20a:
- npctalk "What if you were "+$p2$+" ?";
- end;
-
-Lquote20b:
- npctalk "Do you thin you were "+$p2$+"";
- end;
-
-Lquote20c:
- npctalk "What would it mean if you were "+$p2$+"";
- end;
-
-// I am
-Lquote21:
- set $foo,rand(2);
- if($foo == 0) goto Lquote21a;
- if($foo == 1) goto Lquote21b;
-Lquote21a:
- npctalk "In what way are you "+$p2$+"";
- end;
-
-Lquote21b:
- npctalk "Do you want to be "+$p2$+" ?";
- end;
-
-// am I
-Lquote22:
- set $foo,rand(4);
- if($foo == 0) goto Lquote22a;
- if($foo == 1) goto Lquote22b;
- if($foo == 2) goto Lquote22c;
- if($foo == 3) goto Lquote22d;
-Lquote22a:
- npctalk "Do you believe you are "+$p2$+"";
- end;
-
-Lquote22b:
- npctalk "Would you want to be "+$p2$+"";
- end;
-
-Lquote22c:
- npctalk "You wish I would tell you you are "+$p2$+"";
- end;
-
-Lquote22d:
- npctalk "What would it mean if you were "+$p2$+"";
- end;
-
-// am
-Lquote23:
- set $foo,rand(2);
- if($foo == 0) goto Lquote23a;
- if($foo == 1) goto Lquote23b;
-
-Lquote23a:
- npctalk "Why do you say AM?";
- end;
-
-Lquote23b:
- npctalk "I don't understand that";
- end;
-
-// are you
-Lquote24:
- set $foo,rand(3);
- if($foo == 0) goto Lquote24a;
- if($foo == 1) goto Lquote24b;
- if($foo == 2) goto Lquote24c;
-Lquote24a:
- npctalk "Why are you interested in whether I am "+$p2$+" or not?";
- end;
-
-Lquote24b:
- npctalk "Would you prefer if I weren't "+$p2$+"";
- end;
-
-Lquote24c:
- npctalk "Perhaps I am "+$p2$+" in your fantasies";
- end;
-
-// you are
-Lquote25:
- npctalk "What makes you think I am "+$p2$+" ?";
- end;
-
-// because
-Lquote26:
- set $foo,rand(3);
- if($foo == 0) goto Lquote26a;
- if($foo == 1) goto Lquote26b;
- if($foo == 2) goto Lquote26c;
-Lquote26a:
- npctalk "Is that the real reason?";
- end;
-
-Lquote26b:
- npctalk "What other reasons might there be?";
- end;
-
-Lquote26c:
- npctalk "Does that reason seem to explain anything else?";
- end;
-
-// were you
-Lquote27:
- set $foo,rand(3);
- if($foo == 0) goto Lquote27a;
- if($foo == 1) goto Lquote27b;
- if($foo == 2) goto Lquote27c;
-Lquote27a:
- npctalk "Perhaps I was "+$p2$+"";
- end;
-
-Lquote27b:
- npctalk "What do you think?";
- end;
-
-Lquote27c:
- npctalk "What if I had been "+$p2$+"";
- end;
-
-// I can't
-Lquote28:
- set $foo,rand(2);
- if($foo == 0) goto Lquote28a;
- if($foo == 1) goto Lquote28b;
-Lquote28a:
- npctalk "Maybe you could "+$p2$+" now";
- end;
-
-Lquote28b:
- npctalk "What if you could "+$p2$+" ?";
- end;
-
-// I feel
-Lquote29:
- npctalk "Do you often feel "+$p2$+" ?";
- end;
-
-// I felt
-Lquote30:
- npctalk "What other feelings do you have?";
- end;
-
-// $p1$ I $p2$ you $p3$
-Lquote31:
- npctalk "Perhaps in your fantasy we "+$p3$+" each other?";
- end;
-
-// why don't you
-Lquote32:
- set $foo,rand(3);
- if($foo == 0) goto Lquote32a;
- if($foo == 1) goto Lquote32b;
- if($foo == 2) goto Lquote32c;
-Lquote32a:
- npctalk "Should you "+$p2$+" yourself?";
- end;
-
-Lquote32b:
- npctalk "Do you believe I don't "+$p2$+"";
- end;
-
-Lquote32c:
- npctalk "Perhaps I will "+$p2$+" in good time";
- end;
-
-// yes
-Lquote33:
- set $foo,rand(3);
- if($foo == 0) goto Lquote33a;
- if($foo == 1) goto Lquote33b;
- if($foo == 2) goto Lquote33c;
-Lquote33a:
- npctalk "You seem quite positive";
- end;
-
-Lquote33b:
- npctalk "You are sure?";
- end;
-
-Lquote33c:
- npctalk "I understand";
- end;
-
-// no
-Lquote34:
- set $foo,rand(3);
- if($foo == 0) goto Lquote34a;
- if($foo == 1) goto Lquote34b;
- if($foo == 2) goto Lquote34c;
-Lquote34a:
- npctalk "Why not?";
- end;
-
-Lquote34b:
- npctalk "You are being a bit negative";
- end;
-
-Lquote34c:
- npctalk "Are you saying NO just to be negative?";
- end;
-
-// someone
-Lquote35:
- npctalk "Can you be more specific?";
- end;
-
-// everyone
-Lquote36:
- set $foo,rand(4);
- if($foo == 0) goto Lquote36a;
- if($foo == 1) goto Lquote36b;
- if($foo == 2) goto Lquote36c;
- if($foo == 3) goto Lquote36d;
-Lquote36a:
- npctalk "surely not everyone";
- end;
-
-Lquote36b:
- npctalk "Can you think of anyone in particular?";
- end;
-
-Lquote36c:
- npctalk "Who for example?";
- end;
-
-Lquote36d:
- npctalk "You are thinking of a special person?";
- end;
-
-// always
-Lquote37:
- set $foo,rand(4);
- if($foo == 0) goto Lquote37a;
- if($foo == 1) goto Lquote37b;
- if($foo == 2) goto Lquote37c;
- if($foo == 3) goto Lquote37d;
-Lquote37a:
- npctalk "Can you think of a specific example?";
- end;
-
-Lquote37b:
- npctalk "When?";
- end;
-
-Lquote37c:
- npctalk "What incident are you thinking of?";
- end;
-
-Lquote37d:
- npctalk "Really-- always?";
- end;
-
-// what
-Lquote38:
- set $foo,rand(5);
- if($foo == 0) goto Lquote38a;
- if($foo == 1) goto Lquote38b;
- if($foo == 2) goto Lquote38c;
- if($foo == 3) goto Lquote38d;
- if($foo == 4) goto Lquote38e;
-Lquote38a:
- npctalk "Why do you ask?";
- end;
-
-Lquote38b:
- npctalk "Does that question interest you?";
- end;
-
-Lquote38c:
- npctalk "What is it you really want to know?";
- end;
-
-Lquote38d:
- npctalk "What do you think?";
- end;
-
-Lquote38e:
- npctalk "What comes to your mind when you ask that?";
- end;
-
-// perhaps
-Lquote39:
- npctalk "You do not seem quite certain";
- end;
-
-// are
-Lquote40:
- set $foo,rand(2);
- if($foo == 0) goto Lquote40a;
- if($foo == 1) goto Lquote40b;
-Lquote40a:
- npctalk "Did you think they might not be "+$p2$+"";
- end;
-
-Lquote40b:
- npctalk "Possibly they are "+$p2$;
- end;
-
-// default
-Lquote41:
- set $foo,rand(6);
- if($foo == 0) goto Lquote41a;
- if($foo == 1) goto Lquote41b;
- if($foo == 2) goto Lquote41c;
- if($foo == 3) goto Lquote41d;
- if($foo == 4) goto Lquote41e;
- if($foo == 5) goto Lquote41f;
-Lquote41a:
- npctalk "Very interesting";
- end;
-
-Lquote41b:
- npctalk "I am not sure I understand you fully";
- end;
-
-Lquote41c:
- npctalk "What does that suggest to you?";
- end;
-
-Lquote41d:
- npctalk "Please continue";
- end;
-
-Lquote41e:
- npctalk "Go on";
- end;
-
-Lquote41f:
- npctalk "Do you feel strongly about discussing such things?";
- end;
-OnInit:
- defpattern 1, "([^:]+):.*\\shello.*", "Lquote0";
- defpattern 1, "([^:]+):.*\\scomputer.*", "Lquote1";
- defpattern 1, "([^:]+):.*\\sname.*", "Lquote2";
- defpattern 1, "([^:]+):.*\\ssorry.*", "Lquote3";
- defpattern 1, "([^:]+):.*\\si\\s+remember\\s+(.*)", "Lquote4";
- defpattern 1, "([^:]+):.*\\sdo\\s+you\\s+remember\\s+(.*)", "Lquote5";
- defpattern 1, "([^:]+):.*\\sif\\s+(.*)", "Lquote6";
- defpattern 1, "([^:]+):.*\\si\\s+dreamt\\s+(.*)", "Lquote7";
- defpattern 1, "([^:]+):.*\\sdream\\s+about\\s+(.*)", "Lquote8";
- defpattern 1, "([^:]+):.*\\sdream\\s+(.*)", "Lquote9";
- defpattern 1, "([^:]+):.*\\smy\\s+mother\\s+(.*)", "Lquote10";
- defpattern 1, "([^:]+):.*\\smy\\s+father\\s+(.*)", "Lquote11";
- defpattern 1, "([^:]+):.*\\si\\s+want\\s+(.*)", "Lquote12";
- defpattern 1, "([^:]+):.*\\si\\s+am\\s+glad\\s+(.*)", "Lquote13";
- defpattern 1, "([^:]+):\\s+(.*)\\s+i\\s+am\\s+sad\\s+(.*)", "Lquote14";
- defpattern 1, "([^:]+):\\s+(.*)\\s+are\\s+like\\s+(.*)", "Lquote15";
- defpattern 1, "([^:]+):\\s+(.*)\\s+is\\s+like\\s+(.*)", "Lquote16";
- defpattern 1, "([^:]+):.*\\salike\\s+(.*)", "Lquote17";
- defpattern 1, "([^:]+):.*\\ssame\\s+(.*)", "Lquote18";
- defpattern 1, "([^:]+):.*\\si\\s+was\\s+(.*)", "Lquote19";
- defpattern 1, "([^:]+):.*\\swas\\s+i\\s+(.*)", "Lquote20";
- defpattern 1, "([^:]+):.*\\si\\s+am\\s+(.*)", "Lquote21";
- defpattern 1, "([^:]+):.*\\sam\\s+i\\s+(.*)", "Lquote22";
- defpattern 1, "([^:]+):.*\\sam\\s+(.*)", "Lquote23";
- defpattern 1, "([^:]+):.*\\sare\\s+you\\s+(.*)", "Lquote24";
- defpattern 1, "([^:]+):.*\\syou\\s+are\\s+(.*)", "Lquote25";
- defpattern 1, "([^:]+):.*\\sbecause\\s+(.*)", "Lquote26";
- defpattern 1, "([^:]+):.*\\swere\\s+you\\s+(.*)", "Lquote27";
- defpattern 1, "([^:]+):.*\\si\\s+(cant|can't|cannot)\\s+(.*)", "Lquote28";
- defpattern 1, "([^:]+):.*\\si\\s+feel\\s+(.*)", "Lquote29";
- defpattern 1, "([^:]+):.*\\si\\s+felt\\s+(.*)", "Lquote30";
- defpattern 1, "([^:]+):.*\\si\\s+(.*)\\s+you\\s+(.*)", "Lquote31";
- defpattern 1, "([^:]+):.*\\swhy\\s+(don't|dont)\\s+you\\s+(.*)", "Lquote32";
- defpattern 1, "([^:]+):.*\\syes\\s+(.*)", "Lquote33";
- defpattern 1, "([^:]+):.*\\sno\\s+(.*)", "Lquote34";
- defpattern 1, "([^:]+):.*\\ssomeone\\s+(.*)", "Lquote35";
- defpattern 1, "([^:]+):.*\\severyone\\s+(.*)", "Lquote36";
- defpattern 1, "([^:]+):.*\\salways\\s+(.*)", "Lquote37";
- defpattern 1, "([^:]+):.*\\swhat\\s+(.*)", "Lquote38";
- defpattern 1, "([^:]+):.*\\sperhaps\\s+(.*)", "Lquote39";
- defpattern 1, "([^:]+):.*\\sare\\s+(.*)", "Lquote40";
- defpattern 1, "([^:]+):(.*)", "Lquote41";
-
- activatepset 1;
- end;
-}
+prontera.gat,152,181,5 script MouseJstr 763,{
+
+// hello
+Lquote0:
+ npctalk "How do you do. Please state your problem.";
+ end;
+// computer
+Lquote1:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote1a;
+ if($foo == 1) goto Lquote1b;
+ if($foo == 2) goto Lquote1c;
+ if($foo == 3) goto Lquote1d;
+Lquote1a:
+ npctalk "Do computers worry you?";
+ end;
+Lquote1b:
+ npctalk "What do you think about machines?";
+ end;
+Lquote1c:
+ npctalk "Why do you mention computers?";
+ end;
+Lquote1d:
+ npctalk "What do you think machines have to do with your problem?";
+ end;
+// name
+Lquote2:
+ npctalk "I am not interested in names";
+ end;
+// sorry
+Lquote3:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote3a;
+ if($foo == 1) goto Lquote3b;
+ if($foo == 2) goto Lquote3c;
+
+Lquote3a:
+ npctalk "Please don't apologize";
+ end;
+
+Lquote3b:
+ npctalk "Apologies are not necessary";
+ end;
+
+Lquote3c:
+ npctalk "What feelings do you have when you apologize";
+ end;
+
+// I remember $p2$
+Lquote4:
+ set $foo,rand(6);
+ if($foo == 0) goto Lquote4a;
+ if($foo == 1) goto Lquote4b;
+ if($foo == 2) goto Lquote4c;
+ if($foo == 3) goto Lquote4d;
+ if($foo == 4) goto Lquote4e;
+ if($foo == 5) goto Lquote4f;
+
+Lquote4a:
+ npctalk "Do you often think of "+$p2$+"?";
+ end;
+
+Lquote4b:
+ npctalk "Does thinking of "+$p2$+" bring anything else to mind?";
+ end;
+
+Lquote4c:
+ npctalk "What else do you remember?";
+ end;
+
+Lquote4d:
+ npctalk "Why do you recall "+$p2$+" right now?";
+ end;
+
+Lquote4e:
+ npctalk "What in the present situation reminds you of "+$p2$+"?";
+ end;
+
+Lquote4f:
+ npctalk "What is the connection between me and "+$p2$+"?";
+ end;
+
+// do you remember
+Lquote5:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote5a;
+ if($foo == 1) goto Lquote5b;
+ if($foo == 2) goto Lquote5c;
+ if($foo == 3) goto Lquote5d;
+Lquote5a:
+ npctalk "Did you think I would forget "+$p2$+" ?";
+ end;
+
+Lquote5b:
+ npctalk "Why do you think I should recall "+$p2$+" now";
+ end;
+
+Lquote5c:
+ npctalk "What about "+$p2$+"";
+ end;
+
+Lquote5d:
+ npctalk "You mentioned "+$p2$+"";
+ end;
+
+// if
+Lquote6:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote6a;
+ if($foo == 1) goto Lquote6b;
+ if($foo == 2) goto Lquote6c;
+ if($foo == 3) goto Lquote6d;
+Lquote6a:
+ npctalk "Do you really think its likely that "+$p2$+"";
+ end;
+
+Lquote6b:
+ npctalk "Do you wish that "+$p2$+"?";
+ end;
+
+Lquote6c:
+ npctalk "What do you think about "+$p2$+"?";
+ end;
+
+Lquote6d:
+ npctalk "Really-- if "+$p2$+"?";
+ end;
+
+// i dreamt
+Lquote7:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote7a;
+ if($foo == 1) goto Lquote7b;
+ if($foo == 2) goto Lquote7c;
+Lquote7a:
+ npctalk "Really-- "+$p2$+"";
+ end;
+
+Lquote7b:
+ npctalk "Have you ever fantasized "+$p2$+" while you were awake?";
+ end;
+
+Lquote7c:
+ npctalk "Have you dreamt "+$p2$+" before?";
+ end;
+
+// dream about
+
+Lquote8:
+ npctalk "How do you feel about "+$p2$+" in reality?";
+ end;
+
+// dream
+Lquote9:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote9a;
+ if($foo == 1) goto Lquote9b;
+ if($foo == 2) goto Lquote9c;
+ if($foo == 3) goto Lquote9d;
+Lquote9a:
+ npctalk "What does this dream suggest to you?";
+ end;
+
+Lquote9b:
+ npctalk "Do you dream often?";
+ end;
+
+Lquote9c:
+ npctalk "What persons appear in your dreams?";
+ end;
+
+Lquote9d:
+ npctalk "Don't you believe that dream has to do with your problem?";
+ end;
+
+// my mother
+Lquote10:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote10a;
+ if($foo == 1) goto Lquote10b;
+Lquote10a:
+ npctalk "Who else in your family "+$p2$+"";
+ end;
+
+Lquote10b:
+ npctalk "Tell me more about your family";
+ end;
+
+// my father
+Lquote11:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote11a;
+ if($foo == 1) goto Lquote11b;
+ if($foo == 2) goto Lquote11c;
+Lquote11a:
+ npctalk "Your father";
+ end;
+
+Lquote11b:
+ npctalk "Does he influence you strongly?";
+ end;
+
+Lquote11c:
+ npctalk "What else comes to mind when you think of your father?";
+ end;
+
+// I want
+Lquote12:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote12a;
+ if($foo == 1) goto Lquote12b;
+ if($foo == 2) goto Lquote12c;
+Lquote12a:
+ npctalk "What would it mean if you got "+$p2$+"";
+ end;
+
+Lquote12b:
+ npctalk "Why do you want "+$p2$+"";
+ end;
+
+Lquote12c:
+ npctalk "Suppose you got "+$p2$+" soon";
+ end;
+
+// I am glad
+Lquote13:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote13a;
+ if($foo == 1) goto Lquote13b;
+ if($foo == 2) goto Lquote13c;
+Lquote13a:
+ npctalk "How have I helped you to be "+$p2$+"";
+ end;
+
+Lquote13b:
+ npctalk "What makes you happy just now";
+ end;
+
+Lquote13c:
+ npctalk "Can you explain why you are suddenly "+$p2$+"";
+ end;
+
+// I am sad
+Lquote14:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote14a;
+ if($foo == 1) goto Lquote14b;
+Lquote14a:
+ npctalk "I am sorry to hear you are depressed";
+ end;
+
+Lquote14b:
+ npctalk "I'm sure its not pleasant to be sad";
+ end;
+
+// $p2 are like "+$p3$+"
+Lquote15:
+ npctalk "What resemblance do you see between "+$p2$+" and "+$p3$+"";
+ end;
+
+// "+$p2$+" is like "+$p3$+"
+Lquote16:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote16a;
+ if($foo == 1) goto Lquote16b;
+ if($foo == 2) goto Lquote16c;
+ if($foo == 3) goto Lquote16d;
+Lquote16a:
+ npctalk "In what way is it that "+$p2$+" is like "+$p3$+"";
+ end;
+
+Lquote16b:
+ npctalk "What resemblance do you see?";
+ end;
+
+Lquote16c:
+ npctalk "Could there really be some connection?";
+ end;
+
+Lquote16d:
+ npctalk "How?";
+ end;
+// alike
+Lquote17:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote17a;
+ if($foo == 1) goto Lquote17b;
+Lquote17a:
+ npctalk "In what way?";
+ end;
+
+Lquote17b:
+ npctalk "What similarities are there?";
+ end;
+// same
+Lquote18:
+ npctalk "What other connections do you see?";
+ end;
+
+// I was "+$p2$+"
+Lquote19:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote19a;
+ if($foo == 1) goto Lquote19b;
+ if($foo == 2) goto Lquote19c;
+Lquote19a:
+ npctalk "Were you really?";
+ end;
+
+Lquote19b:
+ npctalk "Perhaps I already knew you were "+$p2$+"";
+ end;
+
+Lquote19c:
+ npctalk "Why do you tell me you were "+$p2$+" now?";
+ end;
+
+// was I
+Lquote20:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote20a;
+ if($foo == 1) goto Lquote20b;
+ if($foo == 2) goto Lquote20c;
+Lquote20a:
+ npctalk "What if you were "+$p2$+" ?";
+ end;
+
+Lquote20b:
+ npctalk "Do you thin you were "+$p2$+"";
+ end;
+
+Lquote20c:
+ npctalk "What would it mean if you were "+$p2$+"";
+ end;
+
+// I am
+Lquote21:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote21a;
+ if($foo == 1) goto Lquote21b;
+Lquote21a:
+ npctalk "In what way are you "+$p2$+"";
+ end;
+
+Lquote21b:
+ npctalk "Do you want to be "+$p2$+" ?";
+ end;
+
+// am I
+Lquote22:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote22a;
+ if($foo == 1) goto Lquote22b;
+ if($foo == 2) goto Lquote22c;
+ if($foo == 3) goto Lquote22d;
+Lquote22a:
+ npctalk "Do you believe you are "+$p2$+"";
+ end;
+
+Lquote22b:
+ npctalk "Would you want to be "+$p2$+"";
+ end;
+
+Lquote22c:
+ npctalk "You wish I would tell you you are "+$p2$+"";
+ end;
+
+Lquote22d:
+ npctalk "What would it mean if you were "+$p2$+"";
+ end;
+
+// am
+Lquote23:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote23a;
+ if($foo == 1) goto Lquote23b;
+
+Lquote23a:
+ npctalk "Why do you say AM?";
+ end;
+
+Lquote23b:
+ npctalk "I don't understand that";
+ end;
+
+// are you
+Lquote24:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote24a;
+ if($foo == 1) goto Lquote24b;
+ if($foo == 2) goto Lquote24c;
+Lquote24a:
+ npctalk "Why are you interested in whether I am "+$p2$+" or not?";
+ end;
+
+Lquote24b:
+ npctalk "Would you prefer if I weren't "+$p2$+"";
+ end;
+
+Lquote24c:
+ npctalk "Perhaps I am "+$p2$+" in your fantasies";
+ end;
+
+// you are
+Lquote25:
+ npctalk "What makes you think I am "+$p2$+" ?";
+ end;
+
+// because
+Lquote26:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote26a;
+ if($foo == 1) goto Lquote26b;
+ if($foo == 2) goto Lquote26c;
+Lquote26a:
+ npctalk "Is that the real reason?";
+ end;
+
+Lquote26b:
+ npctalk "What other reasons might there be?";
+ end;
+
+Lquote26c:
+ npctalk "Does that reason seem to explain anything else?";
+ end;
+
+// were you
+Lquote27:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote27a;
+ if($foo == 1) goto Lquote27b;
+ if($foo == 2) goto Lquote27c;
+Lquote27a:
+ npctalk "Perhaps I was "+$p2$+"";
+ end;
+
+Lquote27b:
+ npctalk "What do you think?";
+ end;
+
+Lquote27c:
+ npctalk "What if I had been "+$p2$+"";
+ end;
+
+// I can't
+Lquote28:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote28a;
+ if($foo == 1) goto Lquote28b;
+Lquote28a:
+ npctalk "Maybe you could "+$p2$+" now";
+ end;
+
+Lquote28b:
+ npctalk "What if you could "+$p2$+" ?";
+ end;
+
+// I feel
+Lquote29:
+ npctalk "Do you often feel "+$p2$+" ?";
+ end;
+
+// I felt
+Lquote30:
+ npctalk "What other feelings do you have?";
+ end;
+
+// $p1$ I $p2$ you $p3$
+Lquote31:
+ npctalk "Perhaps in your fantasy we "+$p3$+" each other?";
+ end;
+
+// why don't you
+Lquote32:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote32a;
+ if($foo == 1) goto Lquote32b;
+ if($foo == 2) goto Lquote32c;
+Lquote32a:
+ npctalk "Should you "+$p2$+" yourself?";
+ end;
+
+Lquote32b:
+ npctalk "Do you believe I don't "+$p2$+"";
+ end;
+
+Lquote32c:
+ npctalk "Perhaps I will "+$p2$+" in good time";
+ end;
+
+// yes
+Lquote33:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote33a;
+ if($foo == 1) goto Lquote33b;
+ if($foo == 2) goto Lquote33c;
+Lquote33a:
+ npctalk "You seem quite positive";
+ end;
+
+Lquote33b:
+ npctalk "You are sure?";
+ end;
+
+Lquote33c:
+ npctalk "I understand";
+ end;
+
+// no
+Lquote34:
+ set $foo,rand(3);
+ if($foo == 0) goto Lquote34a;
+ if($foo == 1) goto Lquote34b;
+ if($foo == 2) goto Lquote34c;
+Lquote34a:
+ npctalk "Why not?";
+ end;
+
+Lquote34b:
+ npctalk "You are being a bit negative";
+ end;
+
+Lquote34c:
+ npctalk "Are you saying NO just to be negative?";
+ end;
+
+// someone
+Lquote35:
+ npctalk "Can you be more specific?";
+ end;
+
+// everyone
+Lquote36:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote36a;
+ if($foo == 1) goto Lquote36b;
+ if($foo == 2) goto Lquote36c;
+ if($foo == 3) goto Lquote36d;
+Lquote36a:
+ npctalk "surely not everyone";
+ end;
+
+Lquote36b:
+ npctalk "Can you think of anyone in particular?";
+ end;
+
+Lquote36c:
+ npctalk "Who for example?";
+ end;
+
+Lquote36d:
+ npctalk "You are thinking of a special person?";
+ end;
+
+// always
+Lquote37:
+ set $foo,rand(4);
+ if($foo == 0) goto Lquote37a;
+ if($foo == 1) goto Lquote37b;
+ if($foo == 2) goto Lquote37c;
+ if($foo == 3) goto Lquote37d;
+Lquote37a:
+ npctalk "Can you think of a specific example?";
+ end;
+
+Lquote37b:
+ npctalk "When?";
+ end;
+
+Lquote37c:
+ npctalk "What incident are you thinking of?";
+ end;
+
+Lquote37d:
+ npctalk "Really-- always?";
+ end;
+
+// what
+Lquote38:
+ set $foo,rand(5);
+ if($foo == 0) goto Lquote38a;
+ if($foo == 1) goto Lquote38b;
+ if($foo == 2) goto Lquote38c;
+ if($foo == 3) goto Lquote38d;
+ if($foo == 4) goto Lquote38e;
+Lquote38a:
+ npctalk "Why do you ask?";
+ end;
+
+Lquote38b:
+ npctalk "Does that question interest you?";
+ end;
+
+Lquote38c:
+ npctalk "What is it you really want to know?";
+ end;
+
+Lquote38d:
+ npctalk "What do you think?";
+ end;
+
+Lquote38e:
+ npctalk "What comes to your mind when you ask that?";
+ end;
+
+// perhaps
+Lquote39:
+ npctalk "You do not seem quite certain";
+ end;
+
+// are
+Lquote40:
+ set $foo,rand(2);
+ if($foo == 0) goto Lquote40a;
+ if($foo == 1) goto Lquote40b;
+Lquote40a:
+ npctalk "Did you think they might not be "+$p2$+"";
+ end;
+
+Lquote40b:
+ npctalk "Possibly they are "+$p2$;
+ end;
+
+// default
+Lquote41:
+ set $foo,rand(6);
+ if($foo == 0) goto Lquote41a;
+ if($foo == 1) goto Lquote41b;
+ if($foo == 2) goto Lquote41c;
+ if($foo == 3) goto Lquote41d;
+ if($foo == 4) goto Lquote41e;
+ if($foo == 5) goto Lquote41f;
+Lquote41a:
+ npctalk "Very interesting";
+ end;
+
+Lquote41b:
+ npctalk "I am not sure I understand you fully";
+ end;
+
+Lquote41c:
+ npctalk "What does that suggest to you?";
+ end;
+
+Lquote41d:
+ npctalk "Please continue";
+ end;
+
+Lquote41e:
+ npctalk "Go on";
+ end;
+
+Lquote41f:
+ npctalk "Do you feel strongly about discussing such things?";
+ end;
+OnInit:
+ defpattern 1, "([^:]+):.*\\shello.*", "Lquote0";
+ defpattern 1, "([^:]+):.*\\scomputer.*", "Lquote1";
+ defpattern 1, "([^:]+):.*\\sname.*", "Lquote2";
+ defpattern 1, "([^:]+):.*\\ssorry.*", "Lquote3";
+ defpattern 1, "([^:]+):.*\\si\\s+remember\\s+(.*)", "Lquote4";
+ defpattern 1, "([^:]+):.*\\sdo\\s+you\\s+remember\\s+(.*)", "Lquote5";
+ defpattern 1, "([^:]+):.*\\sif\\s+(.*)", "Lquote6";
+ defpattern 1, "([^:]+):.*\\si\\s+dreamt\\s+(.*)", "Lquote7";
+ defpattern 1, "([^:]+):.*\\sdream\\s+about\\s+(.*)", "Lquote8";
+ defpattern 1, "([^:]+):.*\\sdream\\s+(.*)", "Lquote9";
+ defpattern 1, "([^:]+):.*\\smy\\s+mother\\s+(.*)", "Lquote10";
+ defpattern 1, "([^:]+):.*\\smy\\s+father\\s+(.*)", "Lquote11";
+ defpattern 1, "([^:]+):.*\\si\\s+want\\s+(.*)", "Lquote12";
+ defpattern 1, "([^:]+):.*\\si\\s+am\\s+glad\\s+(.*)", "Lquote13";
+ defpattern 1, "([^:]+):\\s+(.*)\\s+i\\s+am\\s+sad\\s+(.*)", "Lquote14";
+ defpattern 1, "([^:]+):\\s+(.*)\\s+are\\s+like\\s+(.*)", "Lquote15";
+ defpattern 1, "([^:]+):\\s+(.*)\\s+is\\s+like\\s+(.*)", "Lquote16";
+ defpattern 1, "([^:]+):.*\\salike\\s+(.*)", "Lquote17";
+ defpattern 1, "([^:]+):.*\\ssame\\s+(.*)", "Lquote18";
+ defpattern 1, "([^:]+):.*\\si\\s+was\\s+(.*)", "Lquote19";
+ defpattern 1, "([^:]+):.*\\swas\\s+i\\s+(.*)", "Lquote20";
+ defpattern 1, "([^:]+):.*\\si\\s+am\\s+(.*)", "Lquote21";
+ defpattern 1, "([^:]+):.*\\sam\\s+i\\s+(.*)", "Lquote22";
+ defpattern 1, "([^:]+):.*\\sam\\s+(.*)", "Lquote23";
+ defpattern 1, "([^:]+):.*\\sare\\s+you\\s+(.*)", "Lquote24";
+ defpattern 1, "([^:]+):.*\\syou\\s+are\\s+(.*)", "Lquote25";
+ defpattern 1, "([^:]+):.*\\sbecause\\s+(.*)", "Lquote26";
+ defpattern 1, "([^:]+):.*\\swere\\s+you\\s+(.*)", "Lquote27";
+ defpattern 1, "([^:]+):.*\\si\\s+(cant|can't|cannot)\\s+(.*)", "Lquote28";
+ defpattern 1, "([^:]+):.*\\si\\s+feel\\s+(.*)", "Lquote29";
+ defpattern 1, "([^:]+):.*\\si\\s+felt\\s+(.*)", "Lquote30";
+ defpattern 1, "([^:]+):.*\\si\\s+(.*)\\s+you\\s+(.*)", "Lquote31";
+ defpattern 1, "([^:]+):.*\\swhy\\s+(don't|dont)\\s+you\\s+(.*)", "Lquote32";
+ defpattern 1, "([^:]+):.*\\syes\\s+(.*)", "Lquote33";
+ defpattern 1, "([^:]+):.*\\sno\\s+(.*)", "Lquote34";
+ defpattern 1, "([^:]+):.*\\ssomeone\\s+(.*)", "Lquote35";
+ defpattern 1, "([^:]+):.*\\severyone\\s+(.*)", "Lquote36";
+ defpattern 1, "([^:]+):.*\\salways\\s+(.*)", "Lquote37";
+ defpattern 1, "([^:]+):.*\\swhat\\s+(.*)", "Lquote38";
+ defpattern 1, "([^:]+):.*\\sperhaps\\s+(.*)", "Lquote39";
+ defpattern 1, "([^:]+):.*\\sare\\s+(.*)", "Lquote40";
+ defpattern 1, "([^:]+):(.*)", "Lquote41";
+
+ activatepset 1;
+ end;
+}
diff --git a/npc/custom/floating_rates.txt b/npc/custom/floating_rates.txt
index 906afb74b..d1db13913 100644
--- a/npc/custom/floating_rates.txt
+++ b/npc/custom/floating_rates.txt
@@ -1,45 +1,45 @@
-//===== eAthena Script ======================================================================
-//= Floating Server Rates
-//===== Original By =========================================================================
-//= Lupus
-//===== Current Version: ====================================================================
-//= 1.0
-//===== Compatible With: ====================================================================
-//= Any eAthena, that has 'setbattleflag' function
-//===== Description: ========================================================================
-//= It's a simply example of setbattleflag
-//= This script will change your server rates from 1x to 1.5x every 6 hours
-//= Note: It doesn't affect Card granted drops, MVP & Treasure Chests drops ^_-
-//= It also doesn't affect CARD drops, because they are just 0.01%
-//===== Comments and Credits ================================================================
-//= You can make incredible scripts with 'setbattleflag'!
-//===========================================================================================
-
-
-prontera.gat,3,4,5 script FloatingRates -1,{
- end;
-OnInit:
-
-//add any other HOURS
-OnHour00:
-OnHour06:
-OnHour12:
-OnHour18:
-//-------------------
- set $@brate,rand(100,150);
- set $@jrate,rand(100,150);
- set $@drate,rand(100,150);
- //Base exp
- setbattleflag("base_exp_rate",$@brate);
- //Job exp
- setbattleflag("job_exp_rate",$@jrate);
- //Drops
- setbattleflag("item_rate_common",$@drate);
- setbattleflag("item_rate_heal",$@drate);
- setbattleflag("item_rate_use",$@drate);
- setbattleflag("item_rate_equip",$@drate);
- //we don't change card drops rate, because these values won't change them anyway
-
- announce "Current Rune-Midgard rates are: 1."+($@brate-100)+"x 1."+($@jrate-100)+"x 1."+($@drate-100)+"x",bc_all,0xFF6060;
- end;
-}
+//===== eAthena Script ======================================================================
+//= Floating Server Rates
+//===== Original By =========================================================================
+//= Lupus
+//===== Current Version: ====================================================================
+//= 1.0
+//===== Compatible With: ====================================================================
+//= Any eAthena, that has 'setbattleflag' function
+//===== Description: ========================================================================
+//= It's a simply example of setbattleflag
+//= This script will change your server rates from 1x to 1.5x every 6 hours
+//= Note: It doesn't affect Card granted drops, MVP & Treasure Chests drops ^_-
+//= It also doesn't affect CARD drops, because they are just 0.01%
+//===== Comments and Credits ================================================================
+//= You can make incredible scripts with 'setbattleflag'!
+//===========================================================================================
+
+
+prontera.gat,3,4,5 script FloatingRates -1,{
+ end;
+OnInit:
+
+//add any other HOURS
+OnHour00:
+OnHour06:
+OnHour12:
+OnHour18:
+//-------------------
+ set $@brate,rand(100,150);
+ set $@jrate,rand(100,150);
+ set $@drate,rand(100,150);
+ //Base exp
+ setbattleflag("base_exp_rate",$@brate);
+ //Job exp
+ setbattleflag("job_exp_rate",$@jrate);
+ //Drops
+ setbattleflag("item_rate_common",$@drate);
+ setbattleflag("item_rate_heal",$@drate);
+ setbattleflag("item_rate_use",$@drate);
+ setbattleflag("item_rate_equip",$@drate);
+ //we don't change card drops rate, because these values won't change them anyway
+
+ announce "Current Rune-Midgard rates are: 1."+($@brate-100)+"x 1."+($@jrate-100)+"x 1."+($@drate-100)+"x",bc_all,0xFF6060;
+ end;
+}
diff --git a/npc/custom/gefenia.txt b/npc/custom/gefenia.txt
index af6d07b4a..547c9482c 100644
--- a/npc/custom/gefenia.txt
+++ b/npc/custom/gefenia.txt
@@ -1,34 +1,34 @@
-//===== Athena Script ========================================
-//= Gefenia Warper Script
-//===== By: ==================================================
-//= Darkchild (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Temp Warper to Gefenia
-//===== Additional Comments: =================================
-//= IF you know how you SHOULD get there then please tell me
-//= there's OFFICIAL The Sign quest
-//============================================================
-
-
-prontera.gat,154,198,5 script Geovani 805,{
- mes "[Geovani]";
- mes "Hi there my friend,";
- mes "A while ago a very wise man taught me something.";
- next;
- mes "[Geovani]";
- mes "He taught me how to warp people";
- mes "And yesterday i finally mastered it!!";
- next;
- mes "[Geovani]";
- mes "Want me to show you?";
- mes "I can warp you to Gefenia, the old ruins of the rebuild city, Geffen";
- next;
- menu "Sure, Warp Me ;)",Mwarpme,"Nah, Don't Try It On me",-;
- close;
-Mwarpme:
- warp "gefenia01.gat", 40, 103; close;
+//===== Athena Script ========================================
+//= Gefenia Warper Script
+//===== By: ==================================================
+//= Darkchild (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Temp Warper to Gefenia
+//===== Additional Comments: =================================
+//= IF you know how you SHOULD get there then please tell me
+//= there's OFFICIAL The Sign quest
+//============================================================
+
+
+prontera.gat,154,198,5 script Geovani 805,{
+ mes "[Geovani]";
+ mes "Hi there my friend,";
+ mes "A while ago a very wise man taught me something.";
+ next;
+ mes "[Geovani]";
+ mes "He taught me how to warp people";
+ mes "And yesterday i finally mastered it!!";
+ next;
+ mes "[Geovani]";
+ mes "Want me to show you?";
+ mes "I can warp you to Gefenia, the old ruins of the rebuild city, Geffen";
+ next;
+ menu "Sure, Warp Me ;)",Mwarpme,"Nah, Don't Try It On me",-;
+ close;
+Mwarpme:
+ warp "gefenia01.gat", 40, 103; close;
} \ No newline at end of file
diff --git a/npc/custom/healers/heal.txt b/npc/custom/healers/heal.txt
index d065d30c1..0c0038dac 100644
--- a/npc/custom/healers/heal.txt
+++ b/npc/custom/healers/heal.txt
@@ -1,52 +1,52 @@
-//===== eAthena Script =======================================
-//= Heal Npc
-//===== By: ==================================================
-//= Lotsa People (1.x)
-//===== Current Version: =====================================
-//= 3.0
-//===== Compatible With: =====================================
-//= eAthena 0.1+;
-//===== Description: =========================================
-//= Healer NPC Which Heals For Free
-//===== Additional Comments: =================================
-//= 3.0 By massdriller, Changed and edited the script
-//= added other warp points of maps.
-//= 2.0 By Darkchild, Duplicates And Changed A Bit
-//= you can replace this script file by heal_payment.txt
-//= if you want that players have to pay their healings.
-//============================================================
-
-prontera.gat,150,184,5 script Healer#h1-1::Healer 742,{
-
- mes "[Healer]";
- mes "I have amazing healing powers!!";
- mes "You look like a person who needs them";
- mes "Want some?";
- next;
- menu "Heal",-,"No thanks",CANCEL;
- percentheal 100,100;
- mes "[Healer]";
- mes "Wonderfull, You are now healed!.";
- mes "Have fun adventuring!!";
- close;
- CANCEL:
- mes "[Healer]";
- mes "Allright, come back if you need a heal.";
- close;
-}
-
-morocc.gat,159,96,5 duplicate(Healer) Healer#h1-2 742
-ayothaya.gat,155,111,5 duplicate(Healer) Healer#h1-3 742
-geffen.gat,121,61,5 duplicate(Healer) Healer#h1-4 742
-umbala.gat,94,162,5 duplicate(Healer) Healer#h1-5 742
-payon.gat,180,105,5 duplicate(Healer) Healer#h1-6 742
-alberta.gat,185,144,5 duplicate(Healer) Healer#h1-7 742
-aldebaran.gat,134,123,5 duplicate(Healer) Healer#h1-8 742
-izlude.gat,125,118,5 duplicate(Healer) Healer#h1-9 742
-xmas.gat,149,136,5 duplicate(Healer) Healer#h1-10 742
-comodo.gat,188,162,5 duplicate(Healer) Healer#h1-11 742
-amatsu.gat,200,80,5 duplicate(Healer) Healer#h1-12 742
-gonryun.gat,164,130,5 duplicate(Healer) Healer#h1-13 742
-yuno.gat,152,186,5 duplicate(Healer) Healer#h1-14 742
-niflheim.gat,188,180,5 duplicate(Healer) Healer#h1-15 742
+//===== eAthena Script =======================================
+//= Heal Npc
+//===== By: ==================================================
+//= Lotsa People (1.x)
+//===== Current Version: =====================================
+//= 3.0
+//===== Compatible With: =====================================
+//= eAthena 0.1+;
+//===== Description: =========================================
+//= Healer NPC Which Heals For Free
+//===== Additional Comments: =================================
+//= 3.0 By massdriller, Changed and edited the script
+//= added other warp points of maps.
+//= 2.0 By Darkchild, Duplicates And Changed A Bit
+//= you can replace this script file by heal_payment.txt
+//= if you want that players have to pay their healings.
+//============================================================
+
+prontera.gat,150,184,5 script Healer#h1-1::Healer 742,{
+
+ mes "[Healer]";
+ mes "I have amazing healing powers!!";
+ mes "You look like a person who needs them";
+ mes "Want some?";
+ next;
+ menu "Heal",-,"No thanks",CANCEL;
+ percentheal 100,100;
+ mes "[Healer]";
+ mes "Wonderfull, You are now healed!.";
+ mes "Have fun adventuring!!";
+ close;
+ CANCEL:
+ mes "[Healer]";
+ mes "Allright, come back if you need a heal.";
+ close;
+}
+
+morocc.gat,159,96,5 duplicate(Healer) Healer#h1-2 742
+ayothaya.gat,155,111,5 duplicate(Healer) Healer#h1-3 742
+geffen.gat,121,61,5 duplicate(Healer) Healer#h1-4 742
+umbala.gat,94,162,5 duplicate(Healer) Healer#h1-5 742
+payon.gat,180,105,5 duplicate(Healer) Healer#h1-6 742
+alberta.gat,185,144,5 duplicate(Healer) Healer#h1-7 742
+aldebaran.gat,134,123,5 duplicate(Healer) Healer#h1-8 742
+izlude.gat,125,118,5 duplicate(Healer) Healer#h1-9 742
+xmas.gat,149,136,5 duplicate(Healer) Healer#h1-10 742
+comodo.gat,188,162,5 duplicate(Healer) Healer#h1-11 742
+amatsu.gat,200,80,5 duplicate(Healer) Healer#h1-12 742
+gonryun.gat,164,130,5 duplicate(Healer) Healer#h1-13 742
+yuno.gat,152,186,5 duplicate(Healer) Healer#h1-14 742
+niflheim.gat,188,180,5 duplicate(Healer) Healer#h1-15 742
louyang.gat,225,103,5 duplicate(Healer) Healer#h1-16 742 \ No newline at end of file
diff --git a/npc/custom/healers/heal_payment.txt b/npc/custom/healers/heal_payment.txt
index 2a64035d2..d3ea9fff4 100644
--- a/npc/custom/healers/heal_payment.txt
+++ b/npc/custom/healers/heal_payment.txt
@@ -1,107 +1,107 @@
-//===== eAthena Script =======================================
-//= Healer Script (/w payments)
-//===== By: ==================================================
-//= Yor & abunch of other people
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= NPC heals/regenerates people against zenys
-//===== Additional Comments: =================================
-//= alternative dog with payment.
-//= each HP need 1 zeny
-//= each SP need (baselevel / 5) zenys
-//= calculation is done at start of the script
-//= Added Duplicates And Correct payon Loc [Darkchild]
-//= Some modifications. Added NPC locations. [massdriller]
-//= Removed Duplicates [Silent]
-//============================================================
-
-prontera.gat,150,184,5 script Healer#h2-1::Healer2 742,{
- set @tempHp, MaxHp-Hp;
- set @tempSpReal, MaxSp-Sp;
- set @tempSp, ((MaxSp-Sp) * BaseLevel) / 5;
- if (@tempHp > 0) goto WOUNDED;
- if (@tempSpReal > 0) goto ONLY_REGENERATION;
-
- mes "[Healer]";
- mes "Oh?";
- mes "You do not look like a person in pain.";
- close;
-
- WOUNDED:
- if (@tempSp > 0) goto WITH_REGENERATION;
- mes "[Healer]";
- mes "Oh dear, you look really hurt,";
- mes "I can cure you for: "+@tempHp+" z)";
- mes "Do you want me to cure you?";
- next;
- menu "Healings ("+@tempHp+"z)",HEALINGS,"No, thanks",CANCEL;
-
- WITH_REGENERATION:
- mes "[Healer]";
- mes "Do you want only your HP to be healed? ("+@tempHp+" z)";
- mes "Do you want only your SP to be healed? ("+@tempSp+" z)?";
- mes "Or Would you like both? ("+(@tempHp+@tempSp)+" z)";
- next;
- menu "Only HP ("+@tempHp+"z)",HEALINGS,"Only SP ("+@tempSp+"z)",REGENERATION,"Both HP & SP ("+(@tempHp+@tempSp)+"z)",HEALINGS_AND_REGEN,"Nothing, thanks",CANCEL;
-
- ONLY_REGENERATION:
- mes "[Healer]";
- mes "So, you only want your SP to heal? ("+@tempSp+" z)";
- mes "I need to make a living...";
- next;
- menu "Regeneration ("+@tempSp+"z)",REGENERATION,"No, thanks",CANCEL;
-
- HEALINGS:
- if (Zeny < @tempHp) goto NO_ZENYS;
- set Zeny, Zeny-@tempHp;
- heal @tempHp,0;
- goto FIN;
-
- REGENERATION:
- if (Zeny < @tempSp) goto NO_ZENYS;
- set Zeny, Zeny-@tempSp;
- heal 0,@tempSpReal;
- goto FIN;
-
- HEALINGS_AND_REGEN:
- if (Zeny < (@tempHp+@tempSp)) goto NO_ZENYS;
- set Zeny, Zeny-(@tempHp+@tempSp);
- heal @tempHp,@tempSpReal;
- goto FIN;
-
- NO_ZENYS:
- mes "[Healer]";
- mes "Oh dear, you don't look like you have enough zeny.";
- mes "Sorry, i can't help you.";
- close;
-
- FIN:
- mes "[Healer]";
- mes "You are Completely Healed.";
- close;
-
- CANCEL:
- mes "[Healer]";
- mes "Allright. Please come again if you need anything.";
- close;
-}
-
-
-morocc.gat,159,96,5 duplicate(Healer2) Healer#h2-2 742
-ayothaya.gat,155,111,5 duplicate(Healer2) Healer#h2-3 742
-geffen.gat,121,61,5 duplicate(Healer2) Healer#h2-4 742
-umbala.gat,94,162,5 duplicate(Healer2) Healer#h2-5 742
-payon.gat,180,105,5 duplicate(Healer2) Healer#h2-6 742
-alberta.gat,185,144,5 duplicate(Healer2) Healer#h2-7 742
-aldebaran.gat,134,123,5 duplicate(Healer2) Healer#h2-8 742
-izlude.gat,125,118,5 duplicate(Healer2) Healer#h2-9 742
-xmas.gat,149,136,5 duplicate(Healer2) Healer#h2-10 742
-comodo.gat,188,162,5 duplicate(Healer2) Healer#h2-11 742
-amatsu.gat,200,80,5 duplicate(Healer2) Healer#h2-12 742
-gonryun.gat,164,130,5 duplicate(Healer2) Healer#h2-13 742
-yuno.gat,152,186,5 duplicate(Healer2) Healer#h2-14 742
-niflheim.gat,188,180,5 duplicate(Healer2) Healer#h2-15 742
+//===== eAthena Script =======================================
+//= Healer Script (/w payments)
+//===== By: ==================================================
+//= Yor & abunch of other people
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= NPC heals/regenerates people against zenys
+//===== Additional Comments: =================================
+//= alternative dog with payment.
+//= each HP need 1 zeny
+//= each SP need (baselevel / 5) zenys
+//= calculation is done at start of the script
+//= Added Duplicates And Correct payon Loc [Darkchild]
+//= Some modifications. Added NPC locations. [massdriller]
+//= Removed Duplicates [Silent]
+//============================================================
+
+prontera.gat,150,184,5 script Healer#h2-1::Healer2 742,{
+ set @tempHp, MaxHp-Hp;
+ set @tempSpReal, MaxSp-Sp;
+ set @tempSp, ((MaxSp-Sp) * BaseLevel) / 5;
+ if (@tempHp > 0) goto WOUNDED;
+ if (@tempSpReal > 0) goto ONLY_REGENERATION;
+
+ mes "[Healer]";
+ mes "Oh?";
+ mes "You do not look like a person in pain.";
+ close;
+
+ WOUNDED:
+ if (@tempSp > 0) goto WITH_REGENERATION;
+ mes "[Healer]";
+ mes "Oh dear, you look really hurt,";
+ mes "I can cure you for: "+@tempHp+" z)";
+ mes "Do you want me to cure you?";
+ next;
+ menu "Healings ("+@tempHp+"z)",HEALINGS,"No, thanks",CANCEL;
+
+ WITH_REGENERATION:
+ mes "[Healer]";
+ mes "Do you want only your HP to be healed? ("+@tempHp+" z)";
+ mes "Do you want only your SP to be healed? ("+@tempSp+" z)?";
+ mes "Or Would you like both? ("+(@tempHp+@tempSp)+" z)";
+ next;
+ menu "Only HP ("+@tempHp+"z)",HEALINGS,"Only SP ("+@tempSp+"z)",REGENERATION,"Both HP & SP ("+(@tempHp+@tempSp)+"z)",HEALINGS_AND_REGEN,"Nothing, thanks",CANCEL;
+
+ ONLY_REGENERATION:
+ mes "[Healer]";
+ mes "So, you only want your SP to heal? ("+@tempSp+" z)";
+ mes "I need to make a living...";
+ next;
+ menu "Regeneration ("+@tempSp+"z)",REGENERATION,"No, thanks",CANCEL;
+
+ HEALINGS:
+ if (Zeny < @tempHp) goto NO_ZENYS;
+ set Zeny, Zeny-@tempHp;
+ heal @tempHp,0;
+ goto FIN;
+
+ REGENERATION:
+ if (Zeny < @tempSp) goto NO_ZENYS;
+ set Zeny, Zeny-@tempSp;
+ heal 0,@tempSpReal;
+ goto FIN;
+
+ HEALINGS_AND_REGEN:
+ if (Zeny < (@tempHp+@tempSp)) goto NO_ZENYS;
+ set Zeny, Zeny-(@tempHp+@tempSp);
+ heal @tempHp,@tempSpReal;
+ goto FIN;
+
+ NO_ZENYS:
+ mes "[Healer]";
+ mes "Oh dear, you don't look like you have enough zeny.";
+ mes "Sorry, i can't help you.";
+ close;
+
+ FIN:
+ mes "[Healer]";
+ mes "You are Completely Healed.";
+ close;
+
+ CANCEL:
+ mes "[Healer]";
+ mes "Allright. Please come again if you need anything.";
+ close;
+}
+
+
+morocc.gat,159,96,5 duplicate(Healer2) Healer#h2-2 742
+ayothaya.gat,155,111,5 duplicate(Healer2) Healer#h2-3 742
+geffen.gat,121,61,5 duplicate(Healer2) Healer#h2-4 742
+umbala.gat,94,162,5 duplicate(Healer2) Healer#h2-5 742
+payon.gat,180,105,5 duplicate(Healer2) Healer#h2-6 742
+alberta.gat,185,144,5 duplicate(Healer2) Healer#h2-7 742
+aldebaran.gat,134,123,5 duplicate(Healer2) Healer#h2-8 742
+izlude.gat,125,118,5 duplicate(Healer2) Healer#h2-9 742
+xmas.gat,149,136,5 duplicate(Healer2) Healer#h2-10 742
+comodo.gat,188,162,5 duplicate(Healer2) Healer#h2-11 742
+amatsu.gat,200,80,5 duplicate(Healer2) Healer#h2-12 742
+gonryun.gat,164,130,5 duplicate(Healer2) Healer#h2-13 742
+yuno.gat,152,186,5 duplicate(Healer2) Healer#h2-14 742
+niflheim.gat,188,180,5 duplicate(Healer2) Healer#h2-15 742
louyang.gat,225,103,5 duplicate(Healer2) Healer#h2-16 742 \ No newline at end of file
diff --git a/npc/custom/jobs/jobmaster.txt b/npc/custom/jobs/jobmaster.txt
index c929d4894..a8c147f11 100644
--- a/npc/custom/jobs/jobmaster.txt
+++ b/npc/custom/jobs/jobmaster.txt
@@ -1,265 +1,265 @@
-//===== eAthena Script =======================================
-//= eAthena Jobchanger AKA Job Master
-//===== By: ==================================================
-//= eAthena Dev Team [Ori:LunatikBunnie] [Cur:Lance]
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena SVN Trunk 6674
-//===== Description: =========================================
-//= Changes your job without asking too much
-//= For other info, please contact me at Lunatikbunnie@gmail.com
-//= Editted menu to avoid button mashing.
-//= 1.3 Added TK/SL/SG, thanks to Haplo. Fixed minor bugs [Lupus]
-//= script leaves grabage variable: 'lastJob'
-//= 1.4 Added NJ/GS, changed all job numbers to Job_* constants.
-//= All credits go to pxxx [Skotlex]
-//= 1.5 Rewrite everything from scratch. [Lance]
-//============================================================
-prontera.gat,153,193,6 script Job Master 123,{
- mes "^ff0000[Job Master]^000000";
- if(Upper == 1 && Class >= Job_Lord_Knight) goto L_noReq;
- if(SkillPoint != 0){
- mes "I'm sorry, please use up all your skill points before changing jobs";
- mes "Please come again soon!";
- close;
- }
- if(JobLevel < 10) goto L_LvError;
- switch(Class){
- case Job_Novice_High:
- case Job_Baby:
- case Job_Novice:
- skill 142,1,0;
- skill 143,1,0;
- mes "Welcome, please select the job you wish to change into";
- if(lastJob != 0 && Class == Job_Novice_High){
- switch(lastJob){
- case Job_Knight:
- case Job_Crusader:
- set @target_job, Job_Swordman_High;
- break;
- case Job_Monk:
- case Job_Priest:
- set @target_job, Job_Acolyte_High;
- break;
- case Job_Alchem:
- case Job_Blacksmith:
- set @target_job, Job_Merchant_High;
- break;
- case Job_Rogue:
- case Job_Assassin:
- set @target_job, Job_Thief_High;
- break;
- case Job_Wizard:
- case Job_Sage:
- set @target_job, Job_Mage_High;
- break;
- case Job_Hunter:
- case Job_Bard:
- case Job_Dancer:
- set @target_job, Job_Archer_High;
- break;
- }
- } else {
- switch(select("Swordsman","Mage","Archer","Acolyte","Merchant","Thief",
- "Super Novice","Taekwon","Gunslinger","Ninja")){
- case 7:
- if(Class == Job_Novice_High) goto L_noReq;
- if($@JC_SupNovM > BaseLevel) goto L_BvError;
- set @target_job, Job_SuperNovice;
- break;
- case 8:
- if(Class == Job_Novice_High) goto L_noReq;
- if(Upper == 2) goto L_noReq;
- set @target_job, Job_Taekwon;
- break;
- case 9:
- case 10:
- if(Class == Job_Novice_High) goto L_noReq;
- set @target_job, @menu + 15;
- break;
- default:
- set @target_job, @menu;
- if(Class == Job_Novice_High) set @target_job, @target_job + 4001;
- break;
- }
- }
- mes "Are you sure you want to change to " + callfunc("getJobName",@target_job) + "?";
- if(select("No","Yes") == 2){
- callfunc "Job_Change", @target_job;
- if(@target_job == Job_Gunsliger || @target_job == Job_Ninja || @target_job == Job_Taekwon) {
- callfunc "F_ClearJobVar";
- } else {
- if($@JC_Plat) goto L_GivePlat;
- }
- }
- close;
- break;
- default:
- if(JobLevel < $@JC_MinimumJB) goto L_LvError;
- deletearray @job_opt, getarraysize(@job_opt);
- if(Class < Job_Knight || Class == Job_Taekwon || (Class > Job_Baby && Class < Job_Baby_Knight) || (Class > Job_Novice_High && Class < Job_Lord_Knight)){
- if(lastJob != 0){
- set @target_job, lastJob + 4001;
- } else {
- switch(Class){
- case Job_Swordman_High:
- case Job_Baby_Swordman:
- case Job_Swordman:
- set @job_opt[0], Job_Knight;
- set @job_opt[1], Job_Crusader;
- break;
- case Job_Mage_High:
- case Job_Baby_Mage:
- case Job_Mage:
- set @job_opt[0], Job_Wizard;
- set @job_opt[1], Job_Sage;
- break;
- case Job_Archer_High:
- case Job_Baby_Archer:
- case Job_Archer:
- set @job_opt[0], Job_Hunter;
- if(Sex == 0)
- set @job_opt[1], Job_Dancer;
- else
- set @job_opt[1], Job_Bard;
- break;
- case Job_Acolyte_High:
- case Job_Baby_Acolyte:
- case Job_Acolyte:
- set @job_opt[0], Job_Priest;
- set @job_opt[1], Job_Monk;
- break;
- case Job_Merchant_High:
- case Job_Baby_Merchant:
- case Job_Merchant:
- set @job_opt[0], Job_Blacksmith;
- set @job_opt[1], Job_Alchem;
- break;
- case Job_Thief_High:
- case Job_Baby_Thief:
- case Job_Thief:
- set @job_opt[0], Job_Assassin;
- set @job_opt[1], Job_Rogue;
- break;
- default:
- set @job_opt[0], Job_Star_Gladiator;
- set @job_opt[1], Job_Soul_Linker;
- break;
- }
- mes "Welcome, please select the job you wish to change into";
- set @target_job, @job_opt[select(callfunc("getJobName",@job_opt[0]), callfunc("getJobName",@job_opt[1]))-1];
- if(Class > Job_Novice_High && Class < Job_Lord_Knight) set @target_job, @target_job + 4001;
- }
- mes "Are you sure you want to change to " + callfunc("getJobName",@target_job) + "?";
- if(select("No","Yes")==2){
- callfunc "Job_Change", @target_job;
- if(@target_job == Job_Star_Gladiator || @target_job == Job_Soul_Linker) {
- callfunc "F_ClearJobVar";
- } else {
- if($@JC_Plat) goto L_GivePlat;
- }
- }
- close;
- }
- if(checkfalcon(0) || checkcart(0) || checkriding(0)) goto L_remove;
- if((Class >=Job_Knight) && (Class <=Job_Crusader2)){
- mes "Do you want to reborn?";
- if(select("Yes","No")==1){
- if(BaseLevel < 99 || JobLevel < 50) goto L_cantCh;
- set lastJob, Class;
- if(Class == Job_Knight2){
- set lastJob, Job_Knight;
- } else {
- if(Class == Job_Crusader2){
- set lastJob, Job_Crusader;
- }
- }
- jobchange Job_Novice_High;
- resetlvl(1);
- skill 142,1,0;
- skill 143,1,0;
- }
- close;
- }
- }
- mes "Looks like something has gone wrong. Please report to the eAthena Development Team about this error.";
- close;
-
-L_GivePlat:
- if (BaseClass==Job_SuperNovice) goto L_sSuperN;
- if (BaseClass==Job_Swordman) goto L_sSword;
- if (BaseClass==Job_Mage) goto L_sMage;
- if (BaseClass==Job_Archer) goto L_sArcher;
- if (BaseClass==Job_Acolyte) goto L_sAcolyte;
- if (BaseClass==Job_Merchant) goto L_sMerchant;
- if (BaseClass==Job_Thief) goto L_sThief;
- close;
-L_sSuperN:
- skill 142,1,0;
- close;
-L_sSword:
- skill 142,1,0;
- skill 144,1,0;
- skill 145,1,0;
- skill 146,1,0;
- close;
-L_sMage:
- skill 142,1,0;
- skill 157,1,0;
- close;
-L_sArcher:
- skill 142,1,0;
- skill 147,1,0;
- skill 148,1,0;
- close;
-L_sAcolyte:
- skill 142,1,0;
- skill 156,1,0;
- close;
-L_sMerchant:
- skill 142,1,0;
- skill 153,1,0;
- skill 154,1,0;
- skill 155,1,0;
- close;
-L_sThief:
- skill 142,1,0;
- skill 149,1,0;
- skill 150,1,0;
- skill 151,1,0;
- skill 152,1,0;
- close;
-
-L_cantCh:
- mes "I'm sorry, you do not meet the requirements to change";
- mes "Please come again soon!";
- close;
-
-L_LvError:
- mes "I'm sorry, you do not seem to have enough Job Levels";
- mes "Please come again soon!";
- close;
-
-L_BvError:
- mes "I'm sorry, you do not seem to have enough Base Levels";
- mes "Please come again soon!";
- close;
-
-L_noReq:
- mes "I'm sorry, you do not meet the requirements to change";
- mes "Please come again soon!";
- close;
-
-L_remove:
- mes "Please remove your cart,falcon or peco";
- mes "Please come again soon!";
- close;
-
-OnInit:
- // Variable Setup
- set $@JC_MinimumJB, 40; //Minimum job level for changing between 2nd and advance Class (Default : 40)
- set $@JC_Plat, 1; //Give Platinum skills on Jobchange (Default : 1-yes)
- set $@JC_SupNovM, 45; //Base Level to change into Super Novice (Default : 45)
- end;
-}
+//===== eAthena Script =======================================
+//= eAthena Jobchanger AKA Job Master
+//===== By: ==================================================
+//= eAthena Dev Team [Ori:LunatikBunnie] [Cur:Lance]
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena SVN Trunk 6674
+//===== Description: =========================================
+//= Changes your job without asking too much
+//= For other info, please contact me at Lunatikbunnie@gmail.com
+//= Editted menu to avoid button mashing.
+//= 1.3 Added TK/SL/SG, thanks to Haplo. Fixed minor bugs [Lupus]
+//= script leaves grabage variable: 'lastJob'
+//= 1.4 Added NJ/GS, changed all job numbers to Job_* constants.
+//= All credits go to pxxx [Skotlex]
+//= 1.5 Rewrite everything from scratch. [Lance]
+//============================================================
+prontera.gat,153,193,6 script Job Master 123,{
+ mes "^ff0000[Job Master]^000000";
+ if(Upper == 1 && Class >= Job_Lord_Knight) goto L_noReq;
+ if(SkillPoint != 0){
+ mes "I'm sorry, please use up all your skill points before changing jobs";
+ mes "Please come again soon!";
+ close;
+ }
+ if(JobLevel < 10) goto L_LvError;
+ switch(Class){
+ case Job_Novice_High:
+ case Job_Baby:
+ case Job_Novice:
+ skill 142,1,0;
+ skill 143,1,0;
+ mes "Welcome, please select the job you wish to change into";
+ if(lastJob != 0 && Class == Job_Novice_High){
+ switch(lastJob){
+ case Job_Knight:
+ case Job_Crusader:
+ set @target_job, Job_Swordman_High;
+ break;
+ case Job_Monk:
+ case Job_Priest:
+ set @target_job, Job_Acolyte_High;
+ break;
+ case Job_Alchem:
+ case Job_Blacksmith:
+ set @target_job, Job_Merchant_High;
+ break;
+ case Job_Rogue:
+ case Job_Assassin:
+ set @target_job, Job_Thief_High;
+ break;
+ case Job_Wizard:
+ case Job_Sage:
+ set @target_job, Job_Mage_High;
+ break;
+ case Job_Hunter:
+ case Job_Bard:
+ case Job_Dancer:
+ set @target_job, Job_Archer_High;
+ break;
+ }
+ } else {
+ switch(select("Swordsman","Mage","Archer","Acolyte","Merchant","Thief",
+ "Super Novice","Taekwon","Gunslinger","Ninja")){
+ case 7:
+ if(Class == Job_Novice_High) goto L_noReq;
+ if($@JC_SupNovM > BaseLevel) goto L_BvError;
+ set @target_job, Job_SuperNovice;
+ break;
+ case 8:
+ if(Class == Job_Novice_High) goto L_noReq;
+ if(Upper == 2) goto L_noReq;
+ set @target_job, Job_Taekwon;
+ break;
+ case 9:
+ case 10:
+ if(Class == Job_Novice_High) goto L_noReq;
+ set @target_job, @menu + 15;
+ break;
+ default:
+ set @target_job, @menu;
+ if(Class == Job_Novice_High) set @target_job, @target_job + 4001;
+ break;
+ }
+ }
+ mes "Are you sure you want to change to " + callfunc("getJobName",@target_job) + "?";
+ if(select("No","Yes") == 2){
+ callfunc "Job_Change", @target_job;
+ if(@target_job == Job_Gunsliger || @target_job == Job_Ninja || @target_job == Job_Taekwon) {
+ callfunc "F_ClearJobVar";
+ } else {
+ if($@JC_Plat) goto L_GivePlat;
+ }
+ }
+ close;
+ break;
+ default:
+ if(JobLevel < $@JC_MinimumJB) goto L_LvError;
+ deletearray @job_opt, getarraysize(@job_opt);
+ if(Class < Job_Knight || Class == Job_Taekwon || (Class > Job_Baby && Class < Job_Baby_Knight) || (Class > Job_Novice_High && Class < Job_Lord_Knight)){
+ if(lastJob != 0){
+ set @target_job, lastJob + 4001;
+ } else {
+ switch(Class){
+ case Job_Swordman_High:
+ case Job_Baby_Swordman:
+ case Job_Swordman:
+ set @job_opt[0], Job_Knight;
+ set @job_opt[1], Job_Crusader;
+ break;
+ case Job_Mage_High:
+ case Job_Baby_Mage:
+ case Job_Mage:
+ set @job_opt[0], Job_Wizard;
+ set @job_opt[1], Job_Sage;
+ break;
+ case Job_Archer_High:
+ case Job_Baby_Archer:
+ case Job_Archer:
+ set @job_opt[0], Job_Hunter;
+ if(Sex == 0)
+ set @job_opt[1], Job_Dancer;
+ else
+ set @job_opt[1], Job_Bard;
+ break;
+ case Job_Acolyte_High:
+ case Job_Baby_Acolyte:
+ case Job_Acolyte:
+ set @job_opt[0], Job_Priest;
+ set @job_opt[1], Job_Monk;
+ break;
+ case Job_Merchant_High:
+ case Job_Baby_Merchant:
+ case Job_Merchant:
+ set @job_opt[0], Job_Blacksmith;
+ set @job_opt[1], Job_Alchem;
+ break;
+ case Job_Thief_High:
+ case Job_Baby_Thief:
+ case Job_Thief:
+ set @job_opt[0], Job_Assassin;
+ set @job_opt[1], Job_Rogue;
+ break;
+ default:
+ set @job_opt[0], Job_Star_Gladiator;
+ set @job_opt[1], Job_Soul_Linker;
+ break;
+ }
+ mes "Welcome, please select the job you wish to change into";
+ set @target_job, @job_opt[select(callfunc("getJobName",@job_opt[0]), callfunc("getJobName",@job_opt[1]))-1];
+ if(Class > Job_Novice_High && Class < Job_Lord_Knight) set @target_job, @target_job + 4001;
+ }
+ mes "Are you sure you want to change to " + callfunc("getJobName",@target_job) + "?";
+ if(select("No","Yes")==2){
+ callfunc "Job_Change", @target_job;
+ if(@target_job == Job_Star_Gladiator || @target_job == Job_Soul_Linker) {
+ callfunc "F_ClearJobVar";
+ } else {
+ if($@JC_Plat) goto L_GivePlat;
+ }
+ }
+ close;
+ }
+ if(checkfalcon(0) || checkcart(0) || checkriding(0)) goto L_remove;
+ if((Class >=Job_Knight) && (Class <=Job_Crusader2)){
+ mes "Do you want to reborn?";
+ if(select("Yes","No")==1){
+ if(BaseLevel < 99 || JobLevel < 50) goto L_cantCh;
+ set lastJob, Class;
+ if(Class == Job_Knight2){
+ set lastJob, Job_Knight;
+ } else {
+ if(Class == Job_Crusader2){
+ set lastJob, Job_Crusader;
+ }
+ }
+ jobchange Job_Novice_High;
+ resetlvl(1);
+ skill 142,1,0;
+ skill 143,1,0;
+ }
+ close;
+ }
+ }
+ mes "Looks like something has gone wrong. Please report to the eAthena Development Team about this error.";
+ close;
+
+L_GivePlat:
+ if (BaseClass==Job_SuperNovice) goto L_sSuperN;
+ if (BaseClass==Job_Swordman) goto L_sSword;
+ if (BaseClass==Job_Mage) goto L_sMage;
+ if (BaseClass==Job_Archer) goto L_sArcher;
+ if (BaseClass==Job_Acolyte) goto L_sAcolyte;
+ if (BaseClass==Job_Merchant) goto L_sMerchant;
+ if (BaseClass==Job_Thief) goto L_sThief;
+ close;
+L_sSuperN:
+ skill 142,1,0;
+ close;
+L_sSword:
+ skill 142,1,0;
+ skill 144,1,0;
+ skill 145,1,0;
+ skill 146,1,0;
+ close;
+L_sMage:
+ skill 142,1,0;
+ skill 157,1,0;
+ close;
+L_sArcher:
+ skill 142,1,0;
+ skill 147,1,0;
+ skill 148,1,0;
+ close;
+L_sAcolyte:
+ skill 142,1,0;
+ skill 156,1,0;
+ close;
+L_sMerchant:
+ skill 142,1,0;
+ skill 153,1,0;
+ skill 154,1,0;
+ skill 155,1,0;
+ close;
+L_sThief:
+ skill 142,1,0;
+ skill 149,1,0;
+ skill 150,1,0;
+ skill 151,1,0;
+ skill 152,1,0;
+ close;
+
+L_cantCh:
+ mes "I'm sorry, you do not meet the requirements to change";
+ mes "Please come again soon!";
+ close;
+
+L_LvError:
+ mes "I'm sorry, you do not seem to have enough Job Levels";
+ mes "Please come again soon!";
+ close;
+
+L_BvError:
+ mes "I'm sorry, you do not seem to have enough Base Levels";
+ mes "Please come again soon!";
+ close;
+
+L_noReq:
+ mes "I'm sorry, you do not meet the requirements to change";
+ mes "Please come again soon!";
+ close;
+
+L_remove:
+ mes "Please remove your cart,falcon or peco";
+ mes "Please come again soon!";
+ close;
+
+OnInit:
+ // Variable Setup
+ set $@JC_MinimumJB, 40; //Minimum job level for changing between 2nd and advance Class (Default : 40)
+ set $@JC_Plat, 1; //Give Platinum skills on Jobchange (Default : 1-yes)
+ set $@JC_SupNovM, 45; //Base Level to change into Super Novice (Default : 45)
+ end;
+}
diff --git a/npc/custom/jobs/old/jobchange.txt b/npc/custom/jobs/old/jobchange.txt
index d1921a3b8..c8fbc44ae 100644
--- a/npc/custom/jobs/old/jobchange.txt
+++ b/npc/custom/jobs/old/jobchange.txt
@@ -1,734 +1,734 @@
-//===== eAthena Script =======================================
-//= Jobchanger Script
-//===== By: ==================================================
-//= eAthena Scripting Team
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= Athena Version RC1+
-//===== Description: =========================================
-//= Changes to every class ingame.
-//= Making sure they become the right class.
-//===== Additional Comments: =================================
-//Added missing param into resetlevel [Lupus]
-//Remade Adv. Classes Menu. [shadowlady]
-//Fixed some bugs, by midas
-//Fixed Mounted Class bugs and Baby Class bugs [Zoc]
-//============================================================
-
-prontera.gat,160,186,6 script Job Changer 94,{
-cutin "kafra_01",2;
-mes "[ ^0065DFJobra^000000 ]";
-mes "Sup? I'm the insanely cool and uber cute jobchanger thingy for eAthena! First of all, what class would you like to change into (must meet preliminary requirements for each class..)?";
-next;
-menu "First Class",LFirstClass,"Second Class (2-1)",LSecondClass,"Alternate Second Class (2-2)",LSecondClass2,"Novice High",LNovice2,"Advance First Class",Llevelcheck,"Advance Second Class",Llevelcheck,"Super Novice",LSuperNovice;
-LNovice2:
- if ((readparam(11) >= 99) && (readparam(55) >= 50) || ((readparam(19) > 20) && (readparam(19) != 23))) goto Lchange;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ummmm, excuse me... o.O...";
- mes "Hey! You don't MEET the class requirements...";
- mes "You're not ready! Get away, punk! *rolls eyes*";
- mes "Only the bravest and highest level 2nd Classes and Alternate 2nd Classes can change into the Novice High... jeeze.";
- cutin "kafra_01",255;
- close;
-
-Lchange:
- if (((readparam(19) >= 46) && (readparam(19) <= 68)) || ((readparam(19) >= 4023) && (readparam(19) <= 4045))) goto Babynochange;
- mes "[ ^0065DFJobra^000000 ]";
- mes "We shall start the ceremony....";
- next;
- if(oldclass > 0) goto Llevelcheck;
- set oldclass, readparam(19);
- jobchange 24;
- resetlvl(1);
- mes "[ ^0065DFJobra^000000 ]";
- mes "You have been reborn...";
- cutin "kafra_01",255;
- close;
-
-Babynochange:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Sorry little one, baby classes can't change to Novice High. They would loose their cuteness and their parents won't allow it.";
- cutin "kafra_01",255;
- close;
-
-Llevelcheck:
- if(readparam(55) >= 45 || readparam(19) == 4001 && readparam(55) >= 10) goto Ladvclasses;
- mes "[ ^0065DFJobra^000000 ]";
- mes "You need a higher level to change...";
- cutin "kafra_01",255;
- close;
-
-Ladvclasses:
- if(SkillPoint != 0) goto Lskillpt;
-//Lord Knight & Paladin
- if(oldclass == 7 && readparam(19) == 4001 || oldclass == 13 && readparam(19) == 4001 || oldclass == 14 &&
-readparam(19) == 4001 || oldclass == 21 && readparam(19) == 4001) goto Lswordsmanhigh;
- if(readparam(19) == 4002 && oldclass == 7 || readparam(19) == 4002 && oldclass == 13) goto Llordknight;
- if(readparam(19) == 4002 && oldclass == 14 || readparam(19) == 4002 && oldclass == 21) goto Lpaladin;
-//Assassin Cross & Stalker
- if(oldclass == 12 && readparam(19) == 4001 || oldclass == 17 && readparam(19) == 4001) goto Lthiefhigh;
- if(readparam(19) == 4007 && oldclass == 12) goto Lassassincross;
- if(readparam(19) == 4007 && oldclass == 17) goto Lstalker;
-//High Priest & Champion
- if(oldclass == 8 && readparam(19) == 4001 || oldclass == 15 && readparam(19) == 4001) goto Lacolytehigh;
- if(readparam(19) == 4005 && oldclass == 8) goto Lhighpriest;
- if(readparam(19) == 4005 && oldclass == 15) goto Lchampion;
-//Sniper & Clown & Gypsy
- if(oldclass == 11 && readparam(19) == 4001 || oldclass == 19 && readparam(19) == 4001 || oldclass == 20 && readparam(19) == 4001) goto Larcherhigh;
- if(readparam(19) == 4004 && oldclass == 11) goto Lsniper;
- if(readparam(19) == 4004 && oldclass == 19) goto Lclown;
- if(readparam(19) == 4004 && oldclass == 20) goto Lgypsy;
-//Whitesmith & Creator
- if(oldclass == 10 && readparam(19) == 4001 || oldclass == 18 && readparam(19) == 4001) goto Lmerchanthigh;
- if(readparam(19) == 4006 && oldclass == 10) goto Lwhitesmith;
- if(readparam(19) == 4006 && oldclass == 18) goto Lcreator;
-//High Wizard & Professor
- if(oldclass == 9 && readparam(19) == 4001 || oldclass == 16 && readparam(19) == 4001) goto Lhighmage;
- if(readparam(19) == 4003 && oldclass == 9) goto Lhighwizard;
- if(readparam(19) == 4003 && oldclass == 16) goto Lprofessor;
- if ( oldclass == 0 && readparam(19) >= 4001) goto Nooldclasset;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Please... Remove your cart, leave your falcon and get off your peco before you change.";
- mes "[" + readparam(19) + "] [" + oldclass + "]";
- cutin "kafra_01",255;
- close;
-//Lord Knight & Paladin
- Nooldclasset:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Say, what were you before you were reborn?";
- if (readparam(19) == 4001) goto Ishnov;
- if (readparam(19) == 4002) goto Ishsword;
- if (readparam(19) == 4003) goto Ishmage;
- if (readparam(19) == 4004 && Sex == 0) goto Isharcherf;
- if (readparam(19) == 4004 && Sex == 1) goto Isharcherm;
- if (readparam(19) == 4005) goto Ishacco;
- if (readparam(19) == 4006) goto Ishmerch;
- if (readparam(19) == 4002) goto Ishthief;
-
- Ishnov:
- menu "Knight",Wasknight,"Priest",Waspriest,"Wizard",Waswizard,"Blacksmith",Wasblacksmith,"Hunter",Washunter,"Assasin",Wasassa,"Crusader",Wascrusader,"Monk",Wasmonk,"Sage",Wassage,"Rogue",Wasrogue,"Alchemist",Wasalche,"Bard",Wasbard,"Dancer",Wasdancer;
- Ishsword:
- menu "Knight",Wasknight,"Crusader",Wascrusader;
- Ishmage:
- menu "Wizard",Waswizard,"Sage",Wassage;
- Isharcherf:
- menu "Hunter",Washunter,"Dancer",Wasdancer;
- Isharcherm:
- menu "Hunter",Washunter,"Bard",Wasbard;
- Ishacco:
- menu "Priest",Waspriest,"Monk",Wasmonk;
- Ishmerch:
- menu "Blacksmith",Wasblacksmith,"Alchemist",Wasalche;
- Ishthief:
- menu "Assasin",Wasassa,"Rogue",Wasrogue;
-// now finally the setting of oldclass
- Wasknight:
- set oldclass,7;
- goto Ladvclasses;
- Waspriest:
- set oldclass,8;
- goto Ladvclasses;
- Waswizard:
- set oldclass,9;
- goto Ladvclasses;
- Wasblacksmith:
- set oldclass,10;
- goto Ladvclasses;
- Washunter:
- set oldclass,11;
- goto Ladvclasses;
- Wasassa:
- set oldclass,12;
- goto Ladvclasses;
- Wascrusader:
- set oldclass,14;
- goto Ladvclasses;
- Wasmonk:
- set oldclass,15;
- goto Ladvclasses;
- Wassage:
- set oldclass,16;
- goto Ladvclasses;
- Wasrogue:
- set oldclass,17;
- goto Ladvclasses;
- Wasalche:
- set oldclass,18;
- goto Ladvclasses;
- Wasbard:
- set oldclass,19;
- goto Ladvclasses;
- Wasdancer:
- set oldclass,20;
- goto Ladvclasses;
-
-//Lord Knight & Paladin
-Lswordsmanhigh:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Wow, fantastic! Doesn't all that hard work feel like its paid off? *kekeke* I see the ^B70004BLOOD of Porings^000000 on your hands! You truly are fit for the ^0005CESwordsman^000000 job! ^_^";
- cutin "kafra_01",255;
- jobchange 4002;
- close;
-
-Llordknight:
- mes "[ ^0065DFJobra^000000 ]";
- mes "w00t w00t! You are Job Level 40, you've been a Swordie High all your life...";
- mes "Alrite, you are ready to become the doer of Justice, the embodiment of Heroism, the very soul and life of Valor! ";
- mes "...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yes! You are ready to become... a Lord Knight! ";
- mes "Go save a Damsel in Distress or something..";
- cutin "kafra_01",255;
- jobchange 4008;
- close;
-
-Lpaladin:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Mmmmm, I always liked Paladins.. their broad shoulders always turned me on....";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Go Forth On Your Mission To Serve God";
- mes "This Mission is Free of Charge";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "That means your not getting paid dumbass!";
- emotion 29;
- cutin "kafra_01",255;
- jobchange 38;
- close;
-//Assassin Cross & Stalker
-Lthiefhigh:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Those devious hand of yours really look like they need to grab something (no comment)..... go forth and steal!!";
- cutin "kafra_01",255;
- jobchange 4007;
- close;
-
-Lassassincross:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Poof! Kekeke... ";
- cutin "kafra_01",255;
- jobchange 4013;
- close;
-
-Lstalker:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Hmf.";
- mes "How goes the stalking lately?";
- mes "Found Any New Victims?";
- cutin "kafra_01",255;
- jobchange 41;
- close;
-//High Priest & Champion
-Lacolytehigh:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yay.. go read a Bible.. or whatever.. er..yeah";
- cutin "kafra_01",255;
- jobchange 4005;
- close;
-
-Lhighpriest:
- mes "[ ^0065DFJobra^000000 ]";
- mes "I bet you are GODDAMNED TIRED of NOT having Sp Recovery, right? Well I am tired of hearing little Jesus-Hugging Acolytes scream this every time they're low on Sp... ";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yay! You've now reached Priesthood! It's sorta like Manhood.. but not really, see with Manhood, you get this little thingy between your legs.. WHOOPs, I am getting so off topic..";
- cutin "kafra_01",255;
- jobchange 4009;
- close;
-
-Lchampion:
- mes "[ ^0065DFJobra^000000 ]";
- mes "You are the Champion of the Weak and Poor.";
- mes "Wow it must suck being you ^_^!!!";
- cutin "kafra_01",255;
- jobchange 39;
- close;
-
-//Sniper & Clown & Gypsy
-Larcherhigh:
- mes "[ ^0065DFJobra^000000 ]";
- mes "I used to poke things with a stick when I was a child..";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "I guess you're like me! You hurl pointed sticks at things! Kekeke...";
- cutin "kafra_01",255;
- jobchange 4004;
- close;
-
-Lsniper:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oh goodie, you've met all the requirements... did you have fun hurling pointed sticks at monsters? Well guess what?";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Now you can hurl pointed sticks at monsters AND keep them in one place! w00t, yea! Traps are a great thing...";
- jobchange 35;// Job: Job_Sniper
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "You know what... since I'm just soooo nice... (as long as you dont piss me off *grumble grumble*)";
- mes "I'm gonna give you a complimentary falcon! Use it well! Oh.. and you might wanna wear a hat, this falcon sometimes, uh... poops..";
- cutin "kafra_01",255;
- setfalcon;
- jobchange 4012;
- close;
-Lclown:
- mes "[ ^0065DFJobra^000000 ]";
- mes "What an amusing fellow.";
- mes "Yay! Go play some ballads for some Dancers or something, I just can't stand your clothes... ewww.";
- cutin "kafra_01",255;
- jobchange 43;
- next;
-Lgypsy:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Uh-huh, swivel those hips girl! Gypsies are sooo sexy.. too bad I'm stuck in this ugly Kafra dress.. blah, if only I could strip down to a little thong too... *sigh*";
- cutin "kafra_01",255;
- jobchange 44;
- close;
-
-//Whitesmith & Creator
-Lmerchanthigh:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oh yeah, Mr. Moneybags, SOMEBODY here just loves the sound of coins jinglin'...";
- mes "Well its not me!.. >_>..... <_<... bah.. ";
- cutin "kafra_01",255;
- jobchange 4006;
- close;
-
-Lwhitesmith:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oooo~~ Goodie goodie gumdrops! You meet all the requirements! Guess what I'm gonna do ^_^...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "YUP! You guessed it! I turned you into a Whitesmith! Aren't you PROUD of yourself... Go and make a few weapons! Open up shops across the nation! Yea yea yea! Go go go! w00t! Ho yeah! ";
- cutin "kafra_01",255;
- jobchange 4011;
- close;
-Lcreator:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Create potions for the brave heros of Rune-Midgart";
- cutin "kafra_01",255;
- jobchange 42;
- close;
-//High Wizard & Professor
-Lhighmage:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nice, now you can finally wield the power of ^2200DFM^7600F9A^AF00FBN^DA00DFA^000000, your spiritual energy!!!";
- cutin "kafra_01",255;
- jobchange 4003;
- close;
-
-Lhighwizard:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Weeee, doesn't it feel great to finally become a High Wizard? It's like a warm bath.... ahhhhhhh......";
- cutin "kafra_01",255;
- jobchange 4010;
- close;
-
-Lprofessor:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Time for you to teach your first quantum physics class";
- cutin "kafra_01",255;
- jobchange 40;
- close;
-
-LFirstClass:
- if(class != 0) goto Lnovice;
- if(joblevel<10) goto Ljobten;
- if(SkillPoint != 0) goto Lskillpt;
- mes "[ ^0065DFJobra^000000 ]";
- mes "So... getting your first job, eh? Thats cool, we all need to grow up sometime I guess...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Pick a job, any job! Bwahaha.........";
- menu "Swordsman",LSword,"Mage",LMage,"Thief",LThief,"Merchant",LMerc,"Acolyte",LAco,"Archer",LArch,"Cancel",LCancel;
-
-Lnovice:
- cutin "kafra_01",255;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ummmm, excuse me... o.O...";
- mes "You don't LOOK like a novice...";
- mes "Hey! You're no novice! Get away, punk!";
- mes "*rolls eyes*";
- mes "Only NOVICES can change into the First Job... jeeze.";
- cutin "kafra_01",255;
- close;
-
-Lskillpt:
- cutin "kafra_01",255;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Please use up all your skill points before changing into the next job! ";
- cutin "kafra_01",255;
- close;
-
-Ljobten:
- cutin "kafra_01",255;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ugh, you need to have at least a Job Level of 10 before changing into the first class... go kill some porings or something.. >.>'";
- cutin "kafra_01",255;
- close;
-
-LSword:
- cutin "kafra_01",255;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Wow, fantastic! Doesn't all that hard work feel like its paid off? *kekeke* I see the ^B70004BLOOD of Porings^000000 on your hands! You truly are fit for the ^0005CESwordsman^000000 job! ^_^";
- cutin "kafra_01",255;
- jobchange 1;// Job: Job_Swordman
- close;
-
-LMage:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nice, now you can finally wield the power of ^2200DFM^7600F9A^AF00FBN^DA00DFA^000000, your spiritual energy!!!";
- cutin "kafra_01",255;
- jobchange 2;// Job: Job_Mage
- close;
-
-LThief:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Those devious hand of yours really look like they need to grab something (no comment)..... go forth and steal!!";
- cutin "kafra_01",255;
- jobchange 6;// Job: Job_Thief
- close;
-
-LMerc:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oh yeah, Mr. Moneybags, SOMEBODY here just loves the sound of coins jinglin'...";
- mes "Well its not me!.. >_>..... <_<... bah.. ";
- cutin "kafra_01",255;
- jobchange 5;// Job: Job_Merchant
- close;
-
-LAco:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yay.. go read a Bible.. or whatever.. er..yeah";
- cutin "kafra_01",255;
- jobchange 4;// Job: Job_Acolyte
- close;
-
-LArch:
- mes "[ ^0065DFJobra^000000 ]";
- mes "I used to poke things with a stick when I was a child..";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "I guess you're like me! You hurl pointed sticks at things! Kekeke...";
- cutin "kafra_01",255;
- jobchange 3;// Job: Job_Archer
- close;
-
-LSecondClass:
- if(SkillPoint != 0) goto Lskillpt;
- if(joblevel<40) goto Ljobforty;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nice... you are ready to change into the Second Job! Things get really fun after this!";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "What would you like to be? (Please be the preliminary job)";
- menu "Knight",LKnight,"Wizard",LWizard,"Hunter",LHunter,"Blacksmith",LBlacksmith,"Assassin",LAssassin,"Priest",LPriest,"Cancel",LCancel;
-
- Ljobforty:
- mes "[ ^0065DFJobra^000000 ]";
- mes "You must be at least Job Level 40 before even thinking about changing into the Second Job.";
- cutin "kafra_01",255;
- close;
-
- LKnight:
- if(class !=1) goto LNotSword;
- mes "[ ^0065DFJobra^000000 ]";
- mes "w00t w00t! You are Job Level 40, you've been a Swordie all your life...";
- mes "Alrite, you are ready to become the doer of Justice, the embodiment of Heroism, the very soul and life of Valor! ";
- mes "...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yes! You are ready to become... a Knight! ";
- mes "Go save a Damsel in Distress or something..";
- jobchange 7;// Job: Job_Knight
- cutin "kafra_01",255;
- close;
-
-
- LNotSword:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Well... you see, there's a little, teensy-weensy problem with YOU becoming a Knight.";
- mes "Please be a Swordman before even thinking about 'magically' turning into a Knight... jeeze. *rolls eyes*";
- cutin "kafra_01",255;
- close;
-
- LHunter:
- if(class !=3) goto LNotArcher;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oh goodie, you've met all the requirements... did you have fun hurling pointed sticks at monsters? Well guess what?";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Now you can hurl pointed sticks at monsters AND keep them in one place! w00t, yea! Traps are a great thing...";
- jobchange 11;// Job: Job_Hunter
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "You know what... since I'm just soooo nice... (as long as you dont piss me off *grumble grumble*)";
- mes "I'm gonna give you a complimentary falcon! Use it well! Oh.. and you might wanna wear a hat, this falcon sometimes, uh... poops..";
- cutin "kafra_01",255;
- setfalcon;
- close;
-
- LNotArcher:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Guess what?";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "YOU'RE NOT AN ARCHER >_<....";
- mes "WTF?! Do you really think you can magically turn into a Hunter!? I DONT THINK SO BIYATCH!!! >8-(...";
- mes "Go away! *grumble grumble*";
- cutin "kafra_01",255;
- close;
-
- LBlacksmith:
- mes "[ ^0065DFJobra^000000 ]";
- if(class !=5) goto LNotMerc;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oooo~~ Goodie goodie gumdrops! You meet allll the requirements! Guess what I'm gonna do ^_^...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "YUP! You guessed it! I turned you into a Blacksmith! Aren't you PROUD of yourself... Go and make a few weapons! Open up shops across the nation! Yea yea yea! Go go go! w00t! Ho yeah! ";
- cutin "kafra_01",255;
- jobchange 10;// Job: Job_Blacksmith
- close;
-
- LNotMerc:
- mes "[ ^0065DFJobra^000000 ]";
- mes "No, uh-uh, you are no Merchant! Go away! Only MERCHANTS can change into Blacksmiths!!";
- mes "Its like the cycle of life or something! Stop trying to disrupt the order of the universe >_<!!";
- cutin "kafra_01",255;
- close;
-
- LAssassin:
- if(class !=6) goto LNotThief;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Did you know I used to be a male Assassin? Well, I had a few things done to my hair, got a face lift, some implants here and there...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oh my, too much information, right? Kekeke, okay, go off and become the most sinister of all Jobs in this world... ^6500BFAssassin...";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Poof! Kekeke... ";
- jobchange 12;// Job: Job_Assassin
- cutin "kafra_01",255;
- close;
-
- LNotThief:
- mes "[ ^0065DFJobra^000000 ]";
- mes ".... You're not even a thief.. >_>... go away..";
- cutin "kafra_01",255;
- close;
-
- LPriest:
- if(class !=4) goto LNotAco;
- mes "[ ^0065DFJobra^000000 ]";
- mes "I bet you are GODDAMNED TIRED of NOT having Sp Recovery, right? Well I am tired of hearing little Jesus-Hugging Acolytes scream this every time they're low on Sp... ";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yay! You've now reached Priesthood! It's sorta like Manhood.. but not really, see with Manhood, you get this little thingy between your legs.. WHOOPs, I am getting so off topic..";
- jobchange 8;// Job: Job_Priest
- cutin "kafra_01",255;
- close;
-
- LNotAco:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Okay I'm getting tired of this.. you are NOT an Acolyte... I bet you haven't even read the Bible ONCE! You're going to HELL!";
- cutin "kafra_01",255;
- close;
-
- LWizard:
- if(class !=2) goto LNotMage;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Weeee, doesn't it feel great to finally become a Wizard? It's like a warm bath.... ahhhhhhh......";
- jobchange 9;// Job: Job_Wizard
- cutin "kafra_01",255;
- close;
-
- LNotMage:
- mes "[ ^0065DFJobra^000000 ]";
- mes "I bet you've never cast a spell in your life.. go away >_>...";
- cutin "kafra_01",255;
- close;
-
-LSecondClass2:
- if(SkillPoint != 0) goto Lskillpt;
- if(joblevel<40) goto Ljobforty;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Wow, your ready to become second job already?!";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Very well then, what would you like to be?";
- menu "Crusader",LCrusader,"Sage",LSage,"Bard / Dancer",LBardDancer,"Alchemist",LAlchemist,"Rogue",LRogue,"Monk",LMonk,"Cancel",LCancel;
-
- LCrusader:
- if(class !=1) goto LNotSword2;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Mmmmm, I always liked Crusaders.. their Broad Shoulders always turned me on....";
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Oooo~~~ yeah, thats it... yummy...";
- jobchange 14;// Job: Job_Crusader
- cutin "kafra_01",255;
- close;
-
- LNotSword2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nuh-uh... you ain't no Swordman! Get out of here! Scat!";
- mes ".......Everybody can't be a Crusader.";
- cutin "kafra_01",255;
- close;
-
- LBardDancer:
- if(sex==0) goto LDancer;
- if(sex==1) goto LBard;
-
- LBard:
- if(class !=3) goto LNotArch3;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Yay! Go play some ballads for some Dancers or something, I just can't stand your clothes... ewww.";
- jobchange 19;// Job: Job_Bard
- cutin "kafra_01",255;
- close;
-
- LNotArch3:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nope.. you got it wrong bub.. you gotta be an ARCHER before becoming a Bard..";
- mes "Silly players.. just don't know when to stop...";
- cutin "kafra_01",255;
- close;
-
- LDancer:
- if(class !=3) goto LNotArch2;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Uh-huh, swivel those hips girl ^_~ Dancers are sooo sexy.. too bad I'm stuck in this ugly Kafra dress.. blah, if only I could strip down to a little thong too... *sigh*";
- jobchange 20;// Job: Job_Dancer
- cutin "kafra_01",255;
- close;
-
- LNotArch2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nope.. you got it wrong girl.. you gotta be an ARCHER before becoming a Dancer..";
- mes "Silly players.. just don't know when to stop...";
- cutin "kafra_01",255;
- close;
-
- LAlchemist:
- mes "[ ^0065DFJobra^000000 ]";
- if(class !=5) goto LNotMerc2;
- mes "Cool! Go make some potions! Open a Pharmacy! yeah yeah yeah! ^_^";
- jobchange 18;// Job: Job_Alchem
- cutin "kafra_01",255;
- close;
-
-
- LNotMerc2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ummm... no, you gotta be a Merchant first...";
- cutin "kafra_01",255;
- close;
-
- LRogue:
- if(class !=6) goto LNotThief2;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Wow! ^_^ You.. are.. SOOOOO COOOL!! KYAAHH XD!! *drools*";
- jobchange 17;// Job: Job_Rogue
- cutin "kafra_01",255;
- close;
-
- LNotThief2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Look... you gotta be a THIEF before becoming a Rogue..";
- mes "I know you think they are really cool.. but NO is NO!";
- cutin "kafra_01",255;
- close;
-
- LMonk:
- if(class !=4) goto LNotAco2;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Nice.... Monks are pretty darn cool!";
- jobchange 15;// Job: Job_Monk
- cutin "kafra_01",255;
- close;
-
- LNotAco2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Go read a Bible.. you're not an Acolyte.. and guess what?";
- mes "YOU GOTTA BE A ACO BEFORE BECOMING A MONK!!! >_<";
- cutin "kafra_01",255;
- close;
-
- LSage:
- if(class !=2) goto LNotMage2;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ahhhh, soo cool! I'll never get tired of seeing people turn into those new 2-2 sprites.. KYAHH XD!!";
- mes "Go forth Sage! Show those wizzies what a real mana-wielder can do! Mwahaha...";
- jobchange 16;// Job: Job_Sage
- cutin "kafra_01",255;
- close;
-
- LNotMage2:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Other jobs except `Mage' are not permitted to be Sages.";
- cutin "kafra_01",255;
- close;
-
-LCancel:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Blah.. be that way.. >_>..";
- cutin "kafra_01",255;
- close;
-
-LSuperNovice:
- if(Class == 23) goto L_Twice;
- if(Class != 0) goto L_Otherjob;
- if(JobLevel < 10) goto L_LowSkill;
- if(BaseLevel < 45) goto L_LowLevel;
- if(SkillPoint != 0) goto L_StillSk;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Hello, Novice!";
- mes "Are you enjoying yourself as a novice, the preferred class of the common man?";
- menu "Yes, I love Novices!",L_SNChange,"Ewww, Novices sucks...",LCancel;
-
-L_SNChange:
- mes "[ ^0065DFJobra^000000 ]";
- mes "We pride ourselves on our slogan 'Common Man, Common Goals, Common Dreams'!";
- mes "Have fun with all those skills.";
- cutin "kafra_01",255;
- jobchange 23;
- close;
-
-L_LowSkill:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Well...it seems your level is a little too common at the moment.";
- mes "You need to have a class level of ^0000FFat least 9^000000 in order to become a Super Novice.";
- cutin "kafra_01",255;
- close;
-
-L_LowLevel:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Well...it seems your level is a little too common at the moment.";
- mes "You need to have a primary level of ^0000FFat least 45^000000 in order to become a Super Novice.";
- cutin "kafra_01",255;
- close;
-
-L_StillSk:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Well...it seems you still have some skill points.";
- mes "You need to have ^0000FFNO^000000 skill points left in order to change jobs.";
- cutin "kafra_01",255;
- close;
-
-L_Twice:
- mes "[ ^0065DFJobra^000000 ]";
- mes "You are already a Super Novice...";
- cutin "kafra_01",255;
- close;
-
-L_Otherjob:
- next;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Such people don't have a place in Novice common society. I'm sorry.";
- cutin "kafra_01",255;
- close;
-}
+//===== eAthena Script =======================================
+//= Jobchanger Script
+//===== By: ==================================================
+//= eAthena Scripting Team
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= Athena Version RC1+
+//===== Description: =========================================
+//= Changes to every class ingame.
+//= Making sure they become the right class.
+//===== Additional Comments: =================================
+//Added missing param into resetlevel [Lupus]
+//Remade Adv. Classes Menu. [shadowlady]
+//Fixed some bugs, by midas
+//Fixed Mounted Class bugs and Baby Class bugs [Zoc]
+//============================================================
+
+prontera.gat,160,186,6 script Job Changer 94,{
+cutin "kafra_01",2;
+mes "[ ^0065DFJobra^000000 ]";
+mes "Sup? I'm the insanely cool and uber cute jobchanger thingy for eAthena! First of all, what class would you like to change into (must meet preliminary requirements for each class..)?";
+next;
+menu "First Class",LFirstClass,"Second Class (2-1)",LSecondClass,"Alternate Second Class (2-2)",LSecondClass2,"Novice High",LNovice2,"Advance First Class",Llevelcheck,"Advance Second Class",Llevelcheck,"Super Novice",LSuperNovice;
+LNovice2:
+ if ((readparam(11) >= 99) && (readparam(55) >= 50) || ((readparam(19) > 20) && (readparam(19) != 23))) goto Lchange;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ummmm, excuse me... o.O...";
+ mes "Hey! You don't MEET the class requirements...";
+ mes "You're not ready! Get away, punk! *rolls eyes*";
+ mes "Only the bravest and highest level 2nd Classes and Alternate 2nd Classes can change into the Novice High... jeeze.";
+ cutin "kafra_01",255;
+ close;
+
+Lchange:
+ if (((readparam(19) >= 46) && (readparam(19) <= 68)) || ((readparam(19) >= 4023) && (readparam(19) <= 4045))) goto Babynochange;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "We shall start the ceremony....";
+ next;
+ if(oldclass > 0) goto Llevelcheck;
+ set oldclass, readparam(19);
+ jobchange 24;
+ resetlvl(1);
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You have been reborn...";
+ cutin "kafra_01",255;
+ close;
+
+Babynochange:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Sorry little one, baby classes can't change to Novice High. They would loose their cuteness and their parents won't allow it.";
+ cutin "kafra_01",255;
+ close;
+
+Llevelcheck:
+ if(readparam(55) >= 45 || readparam(19) == 4001 && readparam(55) >= 10) goto Ladvclasses;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You need a higher level to change...";
+ cutin "kafra_01",255;
+ close;
+
+Ladvclasses:
+ if(SkillPoint != 0) goto Lskillpt;
+//Lord Knight & Paladin
+ if(oldclass == 7 && readparam(19) == 4001 || oldclass == 13 && readparam(19) == 4001 || oldclass == 14 &&
+readparam(19) == 4001 || oldclass == 21 && readparam(19) == 4001) goto Lswordsmanhigh;
+ if(readparam(19) == 4002 && oldclass == 7 || readparam(19) == 4002 && oldclass == 13) goto Llordknight;
+ if(readparam(19) == 4002 && oldclass == 14 || readparam(19) == 4002 && oldclass == 21) goto Lpaladin;
+//Assassin Cross & Stalker
+ if(oldclass == 12 && readparam(19) == 4001 || oldclass == 17 && readparam(19) == 4001) goto Lthiefhigh;
+ if(readparam(19) == 4007 && oldclass == 12) goto Lassassincross;
+ if(readparam(19) == 4007 && oldclass == 17) goto Lstalker;
+//High Priest & Champion
+ if(oldclass == 8 && readparam(19) == 4001 || oldclass == 15 && readparam(19) == 4001) goto Lacolytehigh;
+ if(readparam(19) == 4005 && oldclass == 8) goto Lhighpriest;
+ if(readparam(19) == 4005 && oldclass == 15) goto Lchampion;
+//Sniper & Clown & Gypsy
+ if(oldclass == 11 && readparam(19) == 4001 || oldclass == 19 && readparam(19) == 4001 || oldclass == 20 && readparam(19) == 4001) goto Larcherhigh;
+ if(readparam(19) == 4004 && oldclass == 11) goto Lsniper;
+ if(readparam(19) == 4004 && oldclass == 19) goto Lclown;
+ if(readparam(19) == 4004 && oldclass == 20) goto Lgypsy;
+//Whitesmith & Creator
+ if(oldclass == 10 && readparam(19) == 4001 || oldclass == 18 && readparam(19) == 4001) goto Lmerchanthigh;
+ if(readparam(19) == 4006 && oldclass == 10) goto Lwhitesmith;
+ if(readparam(19) == 4006 && oldclass == 18) goto Lcreator;
+//High Wizard & Professor
+ if(oldclass == 9 && readparam(19) == 4001 || oldclass == 16 && readparam(19) == 4001) goto Lhighmage;
+ if(readparam(19) == 4003 && oldclass == 9) goto Lhighwizard;
+ if(readparam(19) == 4003 && oldclass == 16) goto Lprofessor;
+ if ( oldclass == 0 && readparam(19) >= 4001) goto Nooldclasset;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Please... Remove your cart, leave your falcon and get off your peco before you change.";
+ mes "[" + readparam(19) + "] [" + oldclass + "]";
+ cutin "kafra_01",255;
+ close;
+//Lord Knight & Paladin
+ Nooldclasset:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Say, what were you before you were reborn?";
+ if (readparam(19) == 4001) goto Ishnov;
+ if (readparam(19) == 4002) goto Ishsword;
+ if (readparam(19) == 4003) goto Ishmage;
+ if (readparam(19) == 4004 && Sex == 0) goto Isharcherf;
+ if (readparam(19) == 4004 && Sex == 1) goto Isharcherm;
+ if (readparam(19) == 4005) goto Ishacco;
+ if (readparam(19) == 4006) goto Ishmerch;
+ if (readparam(19) == 4002) goto Ishthief;
+
+ Ishnov:
+ menu "Knight",Wasknight,"Priest",Waspriest,"Wizard",Waswizard,"Blacksmith",Wasblacksmith,"Hunter",Washunter,"Assasin",Wasassa,"Crusader",Wascrusader,"Monk",Wasmonk,"Sage",Wassage,"Rogue",Wasrogue,"Alchemist",Wasalche,"Bard",Wasbard,"Dancer",Wasdancer;
+ Ishsword:
+ menu "Knight",Wasknight,"Crusader",Wascrusader;
+ Ishmage:
+ menu "Wizard",Waswizard,"Sage",Wassage;
+ Isharcherf:
+ menu "Hunter",Washunter,"Dancer",Wasdancer;
+ Isharcherm:
+ menu "Hunter",Washunter,"Bard",Wasbard;
+ Ishacco:
+ menu "Priest",Waspriest,"Monk",Wasmonk;
+ Ishmerch:
+ menu "Blacksmith",Wasblacksmith,"Alchemist",Wasalche;
+ Ishthief:
+ menu "Assasin",Wasassa,"Rogue",Wasrogue;
+// now finally the setting of oldclass
+ Wasknight:
+ set oldclass,7;
+ goto Ladvclasses;
+ Waspriest:
+ set oldclass,8;
+ goto Ladvclasses;
+ Waswizard:
+ set oldclass,9;
+ goto Ladvclasses;
+ Wasblacksmith:
+ set oldclass,10;
+ goto Ladvclasses;
+ Washunter:
+ set oldclass,11;
+ goto Ladvclasses;
+ Wasassa:
+ set oldclass,12;
+ goto Ladvclasses;
+ Wascrusader:
+ set oldclass,14;
+ goto Ladvclasses;
+ Wasmonk:
+ set oldclass,15;
+ goto Ladvclasses;
+ Wassage:
+ set oldclass,16;
+ goto Ladvclasses;
+ Wasrogue:
+ set oldclass,17;
+ goto Ladvclasses;
+ Wasalche:
+ set oldclass,18;
+ goto Ladvclasses;
+ Wasbard:
+ set oldclass,19;
+ goto Ladvclasses;
+ Wasdancer:
+ set oldclass,20;
+ goto Ladvclasses;
+
+//Lord Knight & Paladin
+Lswordsmanhigh:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Wow, fantastic! Doesn't all that hard work feel like its paid off? *kekeke* I see the ^B70004BLOOD of Porings^000000 on your hands! You truly are fit for the ^0005CESwordsman^000000 job! ^_^";
+ cutin "kafra_01",255;
+ jobchange 4002;
+ close;
+
+Llordknight:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "w00t w00t! You are Job Level 40, you've been a Swordie High all your life...";
+ mes "Alrite, you are ready to become the doer of Justice, the embodiment of Heroism, the very soul and life of Valor! ";
+ mes "...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yes! You are ready to become... a Lord Knight! ";
+ mes "Go save a Damsel in Distress or something..";
+ cutin "kafra_01",255;
+ jobchange 4008;
+ close;
+
+Lpaladin:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Mmmmm, I always liked Paladins.. their broad shoulders always turned me on....";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Go Forth On Your Mission To Serve God";
+ mes "This Mission is Free of Charge";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "That means your not getting paid dumbass!";
+ emotion 29;
+ cutin "kafra_01",255;
+ jobchange 38;
+ close;
+//Assassin Cross & Stalker
+Lthiefhigh:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Those devious hand of yours really look like they need to grab something (no comment)..... go forth and steal!!";
+ cutin "kafra_01",255;
+ jobchange 4007;
+ close;
+
+Lassassincross:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Poof! Kekeke... ";
+ cutin "kafra_01",255;
+ jobchange 4013;
+ close;
+
+Lstalker:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Hmf.";
+ mes "How goes the stalking lately?";
+ mes "Found Any New Victims?";
+ cutin "kafra_01",255;
+ jobchange 41;
+ close;
+//High Priest & Champion
+Lacolytehigh:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yay.. go read a Bible.. or whatever.. er..yeah";
+ cutin "kafra_01",255;
+ jobchange 4005;
+ close;
+
+Lhighpriest:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I bet you are GODDAMNED TIRED of NOT having Sp Recovery, right? Well I am tired of hearing little Jesus-Hugging Acolytes scream this every time they're low on Sp... ";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yay! You've now reached Priesthood! It's sorta like Manhood.. but not really, see with Manhood, you get this little thingy between your legs.. WHOOPs, I am getting so off topic..";
+ cutin "kafra_01",255;
+ jobchange 4009;
+ close;
+
+Lchampion:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You are the Champion of the Weak and Poor.";
+ mes "Wow it must suck being you ^_^!!!";
+ cutin "kafra_01",255;
+ jobchange 39;
+ close;
+
+//Sniper & Clown & Gypsy
+Larcherhigh:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I used to poke things with a stick when I was a child..";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I guess you're like me! You hurl pointed sticks at things! Kekeke...";
+ cutin "kafra_01",255;
+ jobchange 4004;
+ close;
+
+Lsniper:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oh goodie, you've met all the requirements... did you have fun hurling pointed sticks at monsters? Well guess what?";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Now you can hurl pointed sticks at monsters AND keep them in one place! w00t, yea! Traps are a great thing...";
+ jobchange 35;// Job: Job_Sniper
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You know what... since I'm just soooo nice... (as long as you dont piss me off *grumble grumble*)";
+ mes "I'm gonna give you a complimentary falcon! Use it well! Oh.. and you might wanna wear a hat, this falcon sometimes, uh... poops..";
+ cutin "kafra_01",255;
+ setfalcon;
+ jobchange 4012;
+ close;
+Lclown:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "What an amusing fellow.";
+ mes "Yay! Go play some ballads for some Dancers or something, I just can't stand your clothes... ewww.";
+ cutin "kafra_01",255;
+ jobchange 43;
+ next;
+Lgypsy:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Uh-huh, swivel those hips girl! Gypsies are sooo sexy.. too bad I'm stuck in this ugly Kafra dress.. blah, if only I could strip down to a little thong too... *sigh*";
+ cutin "kafra_01",255;
+ jobchange 44;
+ close;
+
+//Whitesmith & Creator
+Lmerchanthigh:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oh yeah, Mr. Moneybags, SOMEBODY here just loves the sound of coins jinglin'...";
+ mes "Well its not me!.. >_>..... <_<... bah.. ";
+ cutin "kafra_01",255;
+ jobchange 4006;
+ close;
+
+Lwhitesmith:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oooo~~ Goodie goodie gumdrops! You meet all the requirements! Guess what I'm gonna do ^_^...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "YUP! You guessed it! I turned you into a Whitesmith! Aren't you PROUD of yourself... Go and make a few weapons! Open up shops across the nation! Yea yea yea! Go go go! w00t! Ho yeah! ";
+ cutin "kafra_01",255;
+ jobchange 4011;
+ close;
+Lcreator:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Create potions for the brave heros of Rune-Midgart";
+ cutin "kafra_01",255;
+ jobchange 42;
+ close;
+//High Wizard & Professor
+Lhighmage:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nice, now you can finally wield the power of ^2200DFM^7600F9A^AF00FBN^DA00DFA^000000, your spiritual energy!!!";
+ cutin "kafra_01",255;
+ jobchange 4003;
+ close;
+
+Lhighwizard:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Weeee, doesn't it feel great to finally become a High Wizard? It's like a warm bath.... ahhhhhhh......";
+ cutin "kafra_01",255;
+ jobchange 4010;
+ close;
+
+Lprofessor:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Time for you to teach your first quantum physics class";
+ cutin "kafra_01",255;
+ jobchange 40;
+ close;
+
+LFirstClass:
+ if(class != 0) goto Lnovice;
+ if(joblevel<10) goto Ljobten;
+ if(SkillPoint != 0) goto Lskillpt;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "So... getting your first job, eh? Thats cool, we all need to grow up sometime I guess...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Pick a job, any job! Bwahaha.........";
+ menu "Swordsman",LSword,"Mage",LMage,"Thief",LThief,"Merchant",LMerc,"Acolyte",LAco,"Archer",LArch,"Cancel",LCancel;
+
+Lnovice:
+ cutin "kafra_01",255;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ummmm, excuse me... o.O...";
+ mes "You don't LOOK like a novice...";
+ mes "Hey! You're no novice! Get away, punk!";
+ mes "*rolls eyes*";
+ mes "Only NOVICES can change into the First Job... jeeze.";
+ cutin "kafra_01",255;
+ close;
+
+Lskillpt:
+ cutin "kafra_01",255;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Please use up all your skill points before changing into the next job! ";
+ cutin "kafra_01",255;
+ close;
+
+Ljobten:
+ cutin "kafra_01",255;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ugh, you need to have at least a Job Level of 10 before changing into the first class... go kill some porings or something.. >.>'";
+ cutin "kafra_01",255;
+ close;
+
+LSword:
+ cutin "kafra_01",255;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Wow, fantastic! Doesn't all that hard work feel like its paid off? *kekeke* I see the ^B70004BLOOD of Porings^000000 on your hands! You truly are fit for the ^0005CESwordsman^000000 job! ^_^";
+ cutin "kafra_01",255;
+ jobchange 1;// Job: Job_Swordman
+ close;
+
+LMage:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nice, now you can finally wield the power of ^2200DFM^7600F9A^AF00FBN^DA00DFA^000000, your spiritual energy!!!";
+ cutin "kafra_01",255;
+ jobchange 2;// Job: Job_Mage
+ close;
+
+LThief:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Those devious hand of yours really look like they need to grab something (no comment)..... go forth and steal!!";
+ cutin "kafra_01",255;
+ jobchange 6;// Job: Job_Thief
+ close;
+
+LMerc:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oh yeah, Mr. Moneybags, SOMEBODY here just loves the sound of coins jinglin'...";
+ mes "Well its not me!.. >_>..... <_<... bah.. ";
+ cutin "kafra_01",255;
+ jobchange 5;// Job: Job_Merchant
+ close;
+
+LAco:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yay.. go read a Bible.. or whatever.. er..yeah";
+ cutin "kafra_01",255;
+ jobchange 4;// Job: Job_Acolyte
+ close;
+
+LArch:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I used to poke things with a stick when I was a child..";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I guess you're like me! You hurl pointed sticks at things! Kekeke...";
+ cutin "kafra_01",255;
+ jobchange 3;// Job: Job_Archer
+ close;
+
+LSecondClass:
+ if(SkillPoint != 0) goto Lskillpt;
+ if(joblevel<40) goto Ljobforty;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nice... you are ready to change into the Second Job! Things get really fun after this!";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "What would you like to be? (Please be the preliminary job)";
+ menu "Knight",LKnight,"Wizard",LWizard,"Hunter",LHunter,"Blacksmith",LBlacksmith,"Assassin",LAssassin,"Priest",LPriest,"Cancel",LCancel;
+
+ Ljobforty:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You must be at least Job Level 40 before even thinking about changing into the Second Job.";
+ cutin "kafra_01",255;
+ close;
+
+ LKnight:
+ if(class !=1) goto LNotSword;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "w00t w00t! You are Job Level 40, you've been a Swordie all your life...";
+ mes "Alrite, you are ready to become the doer of Justice, the embodiment of Heroism, the very soul and life of Valor! ";
+ mes "...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yes! You are ready to become... a Knight! ";
+ mes "Go save a Damsel in Distress or something..";
+ jobchange 7;// Job: Job_Knight
+ cutin "kafra_01",255;
+ close;
+
+
+ LNotSword:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Well... you see, there's a little, teensy-weensy problem with YOU becoming a Knight.";
+ mes "Please be a Swordman before even thinking about 'magically' turning into a Knight... jeeze. *rolls eyes*";
+ cutin "kafra_01",255;
+ close;
+
+ LHunter:
+ if(class !=3) goto LNotArcher;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oh goodie, you've met all the requirements... did you have fun hurling pointed sticks at monsters? Well guess what?";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Now you can hurl pointed sticks at monsters AND keep them in one place! w00t, yea! Traps are a great thing...";
+ jobchange 11;// Job: Job_Hunter
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You know what... since I'm just soooo nice... (as long as you dont piss me off *grumble grumble*)";
+ mes "I'm gonna give you a complimentary falcon! Use it well! Oh.. and you might wanna wear a hat, this falcon sometimes, uh... poops..";
+ cutin "kafra_01",255;
+ setfalcon;
+ close;
+
+ LNotArcher:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Guess what?";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "YOU'RE NOT AN ARCHER >_<....";
+ mes "WTF?! Do you really think you can magically turn into a Hunter!? I DONT THINK SO BIYATCH!!! >8-(...";
+ mes "Go away! *grumble grumble*";
+ cutin "kafra_01",255;
+ close;
+
+ LBlacksmith:
+ mes "[ ^0065DFJobra^000000 ]";
+ if(class !=5) goto LNotMerc;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oooo~~ Goodie goodie gumdrops! You meet allll the requirements! Guess what I'm gonna do ^_^...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "YUP! You guessed it! I turned you into a Blacksmith! Aren't you PROUD of yourself... Go and make a few weapons! Open up shops across the nation! Yea yea yea! Go go go! w00t! Ho yeah! ";
+ cutin "kafra_01",255;
+ jobchange 10;// Job: Job_Blacksmith
+ close;
+
+ LNotMerc:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "No, uh-uh, you are no Merchant! Go away! Only MERCHANTS can change into Blacksmiths!!";
+ mes "Its like the cycle of life or something! Stop trying to disrupt the order of the universe >_<!!";
+ cutin "kafra_01",255;
+ close;
+
+ LAssassin:
+ if(class !=6) goto LNotThief;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Did you know I used to be a male Assassin? Well, I had a few things done to my hair, got a face lift, some implants here and there...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oh my, too much information, right? Kekeke, okay, go off and become the most sinister of all Jobs in this world... ^6500BFAssassin...";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Poof! Kekeke... ";
+ jobchange 12;// Job: Job_Assassin
+ cutin "kafra_01",255;
+ close;
+
+ LNotThief:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes ".... You're not even a thief.. >_>... go away..";
+ cutin "kafra_01",255;
+ close;
+
+ LPriest:
+ if(class !=4) goto LNotAco;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I bet you are GODDAMNED TIRED of NOT having Sp Recovery, right? Well I am tired of hearing little Jesus-Hugging Acolytes scream this every time they're low on Sp... ";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yay! You've now reached Priesthood! It's sorta like Manhood.. but not really, see with Manhood, you get this little thingy between your legs.. WHOOPs, I am getting so off topic..";
+ jobchange 8;// Job: Job_Priest
+ cutin "kafra_01",255;
+ close;
+
+ LNotAco:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Okay I'm getting tired of this.. you are NOT an Acolyte... I bet you haven't even read the Bible ONCE! You're going to HELL!";
+ cutin "kafra_01",255;
+ close;
+
+ LWizard:
+ if(class !=2) goto LNotMage;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Weeee, doesn't it feel great to finally become a Wizard? It's like a warm bath.... ahhhhhhh......";
+ jobchange 9;// Job: Job_Wizard
+ cutin "kafra_01",255;
+ close;
+
+ LNotMage:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "I bet you've never cast a spell in your life.. go away >_>...";
+ cutin "kafra_01",255;
+ close;
+
+LSecondClass2:
+ if(SkillPoint != 0) goto Lskillpt;
+ if(joblevel<40) goto Ljobforty;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Wow, your ready to become second job already?!";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Very well then, what would you like to be?";
+ menu "Crusader",LCrusader,"Sage",LSage,"Bard / Dancer",LBardDancer,"Alchemist",LAlchemist,"Rogue",LRogue,"Monk",LMonk,"Cancel",LCancel;
+
+ LCrusader:
+ if(class !=1) goto LNotSword2;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Mmmmm, I always liked Crusaders.. their Broad Shoulders always turned me on....";
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Oooo~~~ yeah, thats it... yummy...";
+ jobchange 14;// Job: Job_Crusader
+ cutin "kafra_01",255;
+ close;
+
+ LNotSword2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nuh-uh... you ain't no Swordman! Get out of here! Scat!";
+ mes ".......Everybody can't be a Crusader.";
+ cutin "kafra_01",255;
+ close;
+
+ LBardDancer:
+ if(sex==0) goto LDancer;
+ if(sex==1) goto LBard;
+
+ LBard:
+ if(class !=3) goto LNotArch3;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Yay! Go play some ballads for some Dancers or something, I just can't stand your clothes... ewww.";
+ jobchange 19;// Job: Job_Bard
+ cutin "kafra_01",255;
+ close;
+
+ LNotArch3:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nope.. you got it wrong bub.. you gotta be an ARCHER before becoming a Bard..";
+ mes "Silly players.. just don't know when to stop...";
+ cutin "kafra_01",255;
+ close;
+
+ LDancer:
+ if(class !=3) goto LNotArch2;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Uh-huh, swivel those hips girl ^_~ Dancers are sooo sexy.. too bad I'm stuck in this ugly Kafra dress.. blah, if only I could strip down to a little thong too... *sigh*";
+ jobchange 20;// Job: Job_Dancer
+ cutin "kafra_01",255;
+ close;
+
+ LNotArch2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nope.. you got it wrong girl.. you gotta be an ARCHER before becoming a Dancer..";
+ mes "Silly players.. just don't know when to stop...";
+ cutin "kafra_01",255;
+ close;
+
+ LAlchemist:
+ mes "[ ^0065DFJobra^000000 ]";
+ if(class !=5) goto LNotMerc2;
+ mes "Cool! Go make some potions! Open a Pharmacy! yeah yeah yeah! ^_^";
+ jobchange 18;// Job: Job_Alchem
+ cutin "kafra_01",255;
+ close;
+
+
+ LNotMerc2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ummm... no, you gotta be a Merchant first...";
+ cutin "kafra_01",255;
+ close;
+
+ LRogue:
+ if(class !=6) goto LNotThief2;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Wow! ^_^ You.. are.. SOOOOO COOOL!! KYAAHH XD!! *drools*";
+ jobchange 17;// Job: Job_Rogue
+ cutin "kafra_01",255;
+ close;
+
+ LNotThief2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Look... you gotta be a THIEF before becoming a Rogue..";
+ mes "I know you think they are really cool.. but NO is NO!";
+ cutin "kafra_01",255;
+ close;
+
+ LMonk:
+ if(class !=4) goto LNotAco2;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Nice.... Monks are pretty darn cool!";
+ jobchange 15;// Job: Job_Monk
+ cutin "kafra_01",255;
+ close;
+
+ LNotAco2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Go read a Bible.. you're not an Acolyte.. and guess what?";
+ mes "YOU GOTTA BE A ACO BEFORE BECOMING A MONK!!! >_<";
+ cutin "kafra_01",255;
+ close;
+
+ LSage:
+ if(class !=2) goto LNotMage2;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ahhhh, soo cool! I'll never get tired of seeing people turn into those new 2-2 sprites.. KYAHH XD!!";
+ mes "Go forth Sage! Show those wizzies what a real mana-wielder can do! Mwahaha...";
+ jobchange 16;// Job: Job_Sage
+ cutin "kafra_01",255;
+ close;
+
+ LNotMage2:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Other jobs except `Mage' are not permitted to be Sages.";
+ cutin "kafra_01",255;
+ close;
+
+LCancel:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Blah.. be that way.. >_>..";
+ cutin "kafra_01",255;
+ close;
+
+LSuperNovice:
+ if(Class == 23) goto L_Twice;
+ if(Class != 0) goto L_Otherjob;
+ if(JobLevel < 10) goto L_LowSkill;
+ if(BaseLevel < 45) goto L_LowLevel;
+ if(SkillPoint != 0) goto L_StillSk;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Hello, Novice!";
+ mes "Are you enjoying yourself as a novice, the preferred class of the common man?";
+ menu "Yes, I love Novices!",L_SNChange,"Ewww, Novices sucks...",LCancel;
+
+L_SNChange:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "We pride ourselves on our slogan 'Common Man, Common Goals, Common Dreams'!";
+ mes "Have fun with all those skills.";
+ cutin "kafra_01",255;
+ jobchange 23;
+ close;
+
+L_LowSkill:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Well...it seems your level is a little too common at the moment.";
+ mes "You need to have a class level of ^0000FFat least 9^000000 in order to become a Super Novice.";
+ cutin "kafra_01",255;
+ close;
+
+L_LowLevel:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Well...it seems your level is a little too common at the moment.";
+ mes "You need to have a primary level of ^0000FFat least 45^000000 in order to become a Super Novice.";
+ cutin "kafra_01",255;
+ close;
+
+L_StillSk:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Well...it seems you still have some skill points.";
+ mes "You need to have ^0000FFNO^000000 skill points left in order to change jobs.";
+ cutin "kafra_01",255;
+ close;
+
+L_Twice:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You are already a Super Novice...";
+ cutin "kafra_01",255;
+ close;
+
+L_Otherjob:
+ next;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Such people don't have a place in Novice common society. I'm sorry.";
+ cutin "kafra_01",255;
+ close;
+}
diff --git a/npc/custom/jobs/reset.txt b/npc/custom/jobs/reset.txt
index 65339d19c..5cd207f49 100644
--- a/npc/custom/jobs/reset.txt
+++ b/npc/custom/jobs/reset.txt
@@ -1,40 +1,40 @@
-//Reset NPC for Athena by Script&DB Team
-prontera.gat,150,193,4 script Reset Girl 124,{
- mes "[Reset Girl]";
- mes "I am a Reset Girl.";
- mes "Reset Stats: 5,000z";
- mes "Reset Skills: 5,000z";
- mes "Reset Both: 9,000z";
- mes "Please select the service you want:";
- next;
- menu "^FF3355Reset Skills",L0,"Reset Stats",L1,"Reset Both^000000",L2,"Quit",LEnd;
-
- L0:
- mes "[Reset Girl]";
- if (Zeny < 5000) goto NeedZenys;
- mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
- set Zeny,zeny-5000;
- ResetSkill;
- close;
- L1:
- mes "[Reset Girl]";
- if (Zeny < 5000) goto NeedZenys;
- mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
- set Zeny,zeny-5000;
- ResetStatus;
- close;
- L2:
- mes "[Reset Girl]";
- if (Zeny < 9000) goto NeedZenys;
- mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
- set Zeny,zeny-9000;
- ResetSkill;
- ResetStatus;
- close;
-
- NeedZenys:
- mes "Sorry, you don't have enough Zeny.";
- close;
- LEnd:
- close;
+//Reset NPC for Athena by Script&DB Team
+prontera.gat,150,193,4 script Reset Girl 124,{
+ mes "[Reset Girl]";
+ mes "I am a Reset Girl.";
+ mes "Reset Stats: 5,000z";
+ mes "Reset Skills: 5,000z";
+ mes "Reset Both: 9,000z";
+ mes "Please select the service you want:";
+ next;
+ menu "^FF3355Reset Skills",L0,"Reset Stats",L1,"Reset Both^000000",L2,"Quit",LEnd;
+
+ L0:
+ mes "[Reset Girl]";
+ if (Zeny < 5000) goto NeedZenys;
+ mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
+ set Zeny,zeny-5000;
+ ResetSkill;
+ close;
+ L1:
+ mes "[Reset Girl]";
+ if (Zeny < 5000) goto NeedZenys;
+ mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
+ set Zeny,zeny-5000;
+ ResetStatus;
+ close;
+ L2:
+ mes "[Reset Girl]";
+ if (Zeny < 9000) goto NeedZenys;
+ mes "Alright, here we go now.. Remember, changes won't take effect until you log back on!";
+ set Zeny,zeny-9000;
+ ResetSkill;
+ ResetStatus;
+ close;
+
+ NeedZenys:
+ mes "Sorry, you don't have enough Zeny.";
+ close;
+ LEnd:
+ close;
} \ No newline at end of file
diff --git a/npc/custom/lottery.txt b/npc/custom/lottery.txt
index 218fb4feb..ed35fa42e 100644
--- a/npc/custom/lottery.txt
+++ b/npc/custom/lottery.txt
@@ -1,457 +1,457 @@
-//===== eAthena Script =======================================
-//= Lottery Script
-//===== By: ==================================================
-//= acky - god@acky.com
-//===== Current Version: =====================================
-//= 1.2.1a
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Daily lottery draw.
-//===== Additional Comments: =================================
-//= Numbers drawn daily (Time is configured line 29)
-//= *Added GM-Riggability
-//= *Ability to renew ticket
-//= *Improved interface
-//= *Fixed minor bug where first load didn't work.
-//= 1.2.1a fix due to new script engine
-//============================================================
-
-prontera.gat,1,1,1 script lotterygenerator 111,{
-OnInit:
-set $L_TicketPrice,4750; // TICKET COST
-set $L_Prize_Money,5000000; // JACKPOT AMOUNT
-set $L_Prize_Money_Small,1000000; // SECONDARY PRIZE
-if ($LID == 0) goto L_GenID;
-end;
-
-//Modify for own time
-OnClock2045:
-// CHECKS IF LOTTERY IS RIGGED
-if ($L_Rigged == 1) goto L_Rigged_Draw;
-// GENERATES RANDOM NUMBERS 1-40
-Pick1:
-set $LW1,rand (1,40);
-
-Pick2:
-set $LW2,rand (1,40);
-if ($LW2 == $LW1) goto Pick2;
-
-Pick3:
-set $LW3,rand (1,40);
-if ($LW3 == $LW2) goto Pick3;
-if ($LW3 == $LW1) goto Pick3;
-
-Pick4:
-set $LW4,rand (1,40);
-if ($LW4 == $LW2) goto Pick4;
-if ($LW4 == $LW1) goto Pick4;
-if ($LW4 == $LW3) goto Pick4;
-
-Pick5:
-set $LW5,rand (1,40);
-if ($LW5 == $LW1) goto Pick5;
-if ($LW5 == $LW2) goto Pick5;
-if ($LW5 == $LW3) goto Pick5;
-if ($LW5 == $LW4) goto Pick5;
-
-Pick6:
-set $LW6,rand (1,40);
-if ($LW6 == $LW1) goto Pick6;
-if ($LW6 == $LW2) goto Pick6;
-if ($LW6 == $LW3) goto Pick6;
-if ($LW6 == $LW4) goto Pick6;
-if ($LW6 == $LW5) goto Pick6;
-
-// BROADCASTS DRAW
-L_Broadcast:
-Announce "Lottery: Welcome to tonight's lotto draw!",8;
-Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
-Announce "Congratulations to the winners of tonight!",8;
-
-// GENERATES DRAW ID CODE
-L_GenID:
-set $LID2,$LID;
-// SETS TOMORROW'S ID NUMBER
-set $LID,rand (100000,999999);
-end;
-
-// SETS DRAW TO RIGGED NUMBERS
-L_Rigged_Draw:
-set $LW1,$LR1;
-set $LW2,$LR2;
-set $LW3,$LR3;
-set $LW4,$LR4;
-set $LW5,$LR5;
-set $LW6,$LR6;
-set $L_Rigged,0;
-goto L_Broadcast;
-}
-
-// BEGIN LOTTERY SCRIPT
-- script lottery 76,{
-L_Begin:
-mes "[Lottery]";
-mes "Winning Lotto Numbers ("+$LID2+"):";
-mes "^0000FF[" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]^000000";
-if ($LID > 99999) mes "Your Ticket ("+#LID+"):";
-if ($LID > 99999) mes "^FF0000[" + #LW1 + "] [" + #LW2 + "] [" + #LW3 + "] [" + #LW4 + "] [" + #LW5 + "] [" + #LW6 + "]^000000";
-mes "Next Draw-ID: ^FF0000" + $LID + "^000000.";
-next;
-if (getgmlevel(3) > 90) goto L_GM;
-menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"Cancel",L_Cancel;
-
-// PURCHASE TICKET
-L_Buy:
-if (#LID == $LID && #L1 != 0) goto L_DoubleTicket;
-mes "[Lottery]";
-mes "Tickets cost ^0000FF" + $L_TicketPrice + "z^000000.";
-mes "The Jackpot is ^FF0000" + $L_Prize_Money + "z^000000.";
-next;
-menu "Buy Ticket",-,"Cancel",L_Cancel;
-if (zeny < $L_TicketPrice) goto L_NoZeny;
-set zeny,zeny-$L_TicketPrice;
-mes "[Lottery]";
-mes "Would you like your numbers hand picked or computer generated?";
-next;
-menu "Computer Generated",L_ComputerGen,"Hand Picked",L_HandPick,"Renew Ticket",L_Renew;
-
-// RENEW LAST TICKET
-L_Renew:
-if ($LID < 99999) goto L_Invalid;
-set #LID,$LID;
-goto L_Confirm2;
-
-L_ComputerGen:
-// SELECTS RANDOM NUMBERS
-set @L1,0;
-set @L2,0;
-set @L3,0;
-set @L4,0;
-set @L5,0;
-set @L6,0;
-Pick1:
-set @L1,rand (1,40);
-Pick2:
-set @L2,rand (1,40);
-if (@L2 == @L1) goto Pick2;
-Pick3:
-set @L3,rand (1,40);
-if (@L3 == @L2) goto Pick3;
-if (@L3 == @L1) goto Pick3;
-Pick4:
-set @L4,rand (1,40);
-if (@L4 == @L2) goto Pick4;
-if (@L4 == @L1) goto Pick4;
-if (@L4 == @L3) goto Pick4;
-Pick5:
-set @L5,rand (1,40);
-if (@L5 == @L1) goto Pick5;
-if (@L5 == @L2) goto Pick5;
-if (@L5 == @L3) goto Pick5;
-if (@L5 == @L4) goto Pick5;
-Pick6:
-set @L6,rand (1,40);
-if (@L6 == @L1) goto Pick6;
-if (@L6 == @L2) goto Pick6;
-if (@L6 == @L3) goto Pick6;
-if (@L6 == @L4) goto Pick6;
-if (@L6 == @L5) goto Pick6;
-mes "[Lottery]";
-mes "The computer has selected the following numbers:";
-mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
-next;
-menu "Confirm",L_Confirm,"Re-Generate",L_ComputerGen;
-
-// HAND PICK LOTTERY NUMBERS
-L_HandPick:
-mes "[Lottery]";
-mes "Please pick your numbers (1-40):";
-set @L1,0;
-set @L2,0;
-set @L3,0;
-set @L4,0;
-set @L5,0;
-set @L6,0;
-Input1:
-input @L1;
-if (@L1 < 1 || @L1 > 40) goto Input1;
-mes @L1;
-Input2:
-input @L2;
-if (@L2 < 1 || @L2 > 40) goto Input2;
-if (@L2 == @L1) goto Input2;
-mes @L2;
-Input3:
-input @L3;
-if (@L3 < 1 || @L3 > 40) goto Input3;
-if (@L3 == @L1) goto Input3;
-if (@L3 == @L2) goto Input3;
-mes @L3;
-Input4:
-input @L4;
-if (@L4 < 1 || @L4 > 40) goto Input4;
-if (@L4 == @L1) goto Input4;
-if (@L4 == @L2) goto Input4;
-if (@L4 == @L3) goto Input4;
-mes @L4;
-Input5:
-input @L5;
-if (@L5 < 1 || @L5 > 40) goto Input5;
-if (@L5 == @L1) goto Input5;
-if (@L5 == @L2) goto Input5;
-if (@L5 == @L3) goto Input5;
-if (@L5 == @L4) goto Input5;
-mes @L5;
-Input6:
-input @L6;
-if (@L6 < 1 || @L6 > 40) goto Input6;
-if (@L6 == @L1) goto Input6;
-if (@L6 == @L2) goto Input6;
-if (@L6 == @L3) goto Input6;
-if (@L6 == @L4) goto Input6;
-if (@L6 == @L5) goto Input6;
-mes @L6;
-next;
-mes "[Lottery]";
-mes "Your numbers are:";
-mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
-next;
-menu "Confirm",L_Confirm,"Re-Pick",L_HandPick;
-
-L_Confirm:
-set #LW1,@L1;
-set #LW2,@L2;
-set #LW3,@L3;
-set #LW4,@L4;
-set #LW5,@L5;
-set #LW6,@L6;
-set #LID,$LID;
-L_Confirm2:
-mes "[Lottery]";
-mes "The live broadcasted draw is at 9pm.";
-mes "You can claim your ticket between then and the next draw.";
-next;
-mes "[Lottery]";
-mes "Good luck!";
-close;
-
-L_Claim:
-// CHECKS TICKET VALIDILITY
-if (#LID != $LID2) goto L_Invalid;
-// CHECKS HOW MANY NUMBERS MATCHED
-set @LPrize,0;
-if (#LW1 == $LW1) set @LPrize,@LPrize+1;
-if (#LW1 == $LW2) set @LPrize,@LPrize+1;
-if (#LW1 == $LW3) set @LPrize,@LPrize+1;
-if (#LW1 == $LW4) set @LPrize,@LPrize+1;
-if (#LW1 == $LW5) set @LPrize,@LPrize+1;
-if (#LW1 == $LW6) set @LPrize,@LPrize+1;
-if (#LW2 == $LW1) set @LPrize,@LPrize+1;
-if (#LW2 == $LW2) set @LPrize,@LPrize+1;
-if (#LW2 == $LW3) set @LPrize,@LPrize+1;
-if (#LW2 == $LW4) set @LPrize,@LPrize+1;
-if (#LW2 == $LW5) set @LPrize,@LPrize+1;
-if (#LW2 == $LW6) set @LPrize,@LPrize+1;
-if (#LW3 == $LW1) set @LPrize,@LPrize+1;
-if (#LW3 == $LW2) set @LPrize,@LPrize+1;
-if (#LW3 == $LW3) set @LPrize,@LPrize+1;
-if (#LW3 == $LW4) set @LPrize,@LPrize+1;
-if (#LW3 == $LW5) set @LPrize,@LPrize+1;
-if (#LW3 == $LW6) set @LPrize,@LPrize+1;
-if (#LW4 == $LW1) set @LPrize,@LPrize+1;
-if (#LW4 == $LW2) set @LPrize,@LPrize+1;
-if (#LW4 == $LW3) set @LPrize,@LPrize+1;
-if (#LW4 == $LW4) set @LPrize,@LPrize+1;
-if (#LW4 == $LW5) set @LPrize,@LPrize+1;
-if (#LW4 == $LW6) set @LPrize,@LPrize+1;
-if (#LW5 == $LW1) set @LPrize,@LPrize+1;
-if (#LW5 == $LW2) set @LPrize,@LPrize+1;
-if (#LW5 == $LW3) set @LPrize,@LPrize+1;
-if (#LW5 == $LW4) set @LPrize,@LPrize+1;
-if (#LW5 == $LW5) set @LPrize,@LPrize+1;
-if (#LW5 == $LW6) set @LPrize,@LPrize+1;
-if (#LW6 == $LW1) set @LPrize,@LPrize+1;
-if (#LW6 == $LW2) set @LPrize,@LPrize+1;
-if (#LW6 == $LW3) set @LPrize,@LPrize+1;
-if (#LW6 == $LW4) set @LPrize,@LPrize+1;
-if (#LW6 == $LW5) set @LPrize,@LPrize+1;
-if (#LW6 == $LW6) set @LPrize,@LPrize+1;
-
-if (@LPrize == 6) goto LWinBig;
-if (@LPrize > 3 && @LPrize < 6) goto LWinSmall;
-
-// NO WINNER
-mes "[Lottery]";
-mes "Bad luck, it appears you do not hold a winning ticket.";
-next;
-mes "[Lottery]";
-mes "Better luck next time!.";
-close;
-
-// MATCHED ALL SIX
-LWinBig:
-mes "[Lottery]";
-mes "You have matched all six numbers!";
-mes "Jackpot!";
-mes "You've won ^0000FF" + $L_Prize_Money + "z^000000.";
-set zeny,zeny+$L_Prize_Money;
-Announce "Lottery: " + strcharinfo(0) + " has won the JACKPOT of " + $L_Prize_Money + "z!",8;
-set #LID,0;
-close;
-
-// MATCHED AT LEAST 4
-LWinSmall:
-mes "[Lottery]";
-mes "You have matched at least 4 numbers!";
-mes "You've won ^0000FF" + $L_Prize_Money_Small + "z^000000.";
-set zeny,zeny+$L_Prize_Money_Small;
-Announce "Lottery: " + strcharinfo(0) + " has won a prize of " + $L_Prize_Money_Small + "z!",8;
-set #LID,0;
-close;
-
-// NO ZENY
-L_NoZeny:
-mes "[Lottery]";
-mes "You can't afford a lottery ticket.";
-close;
-
-// INVALID TICKET
-L_Invalid:
-mes "[Lottery]";
-mes "I'm sorry but it appears that you have an invalid ticket.";
-close;
-
-// DOUBLE TICKET
-L_DoubleTicket:
-mes "[Lottery]";
-mes "It appears that you already have a ticket for today.";
-mes "You may only purchase one ticket per draw.";
-close;
-
-L_Cancel:
-mes "[Lottery]";
-mes "Come back soon!";
-close;
-
-// GM MENU (Lets you manually do draws)
-L_GM:
-menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"[GM]Do Draw Now",-,"[GM]Rig the Lottery",L_GM_Rig,"Cancel",L_Cancel;
-
-// CHECKS IF LOTTERY IS RIGGED
-if ($L_Rigged == 1) goto L_Rigged_Draw;
-// GENERATES RANDOM NUMBERS 1-40
-GMPick1:
-set $LW1,rand (1,40);
-
-GMPick2:
-set $LW2,rand (1,40);
-if ($LW2 == $LW1) goto GMPick2;
-
-GMPick3:
-set $LW3,rand (1,40);
-if ($LW3 == $LW2) goto GMPick3;
-if ($LW3 == $LW1) goto GMPick3;
-
-GMPick4:
-set $LW4,rand (1,40);
-if ($LW4 == $LW2) goto GMPick4;
-if ($LW4 == $LW1) goto GMPick4;
-if ($LW4 == $LW3) goto GMPick4;
-
-GMPick5:
-set $LW5,rand (1,40);
-if ($LW5 == $LW1) goto GMPick5;
-if ($LW5 == $LW2) goto GMPick5;
-if ($LW5 == $LW3) goto GMPick5;
-if ($LW5 == $LW4) goto GMPick5;
-
-GMPick6:
-set $LW6,rand (1,40);
-if ($LW6 == $LW1) goto GMPick6;
-if ($LW6 == $LW2) goto GMPick6;
-if ($LW6 == $LW3) goto GMPick6;
-if ($LW6 == $LW4) goto GMPick6;
-if ($LW6 == $LW5) goto GMPick6;
-
-// BROADCASTS DRAW
-L_Broadcast:
-Announce "Lottery: Welcome to the special GM's lotto draw!",8;
-Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
-Announce "Congratulations to the winners!",8;
-
-// GENERATES DRAW ID CODE
-L_GenID:
-set $LID2,$LID;
-// SETS TOMORROW'S ID NUMBER
-set $LID,rand (100000,999999);
-close;
-
-// SETS DRAW TO RIGGED NUMBERS
-L_Rigged_Draw:
-set $LW1,$LR1;
-set $LW2,$LR2;
-set $LW3,$LR3;
-set $LW4,$LR4;
-set $LW5,$LR5;
-set $LW6,$LR6;
-set $L_Rigged,0;
-goto L_Broadcast;
-
-// ALLOWS GM TO DO A RIGGED DRAW
-L_GM_Rig:
-mes "[Lottery]";
-mes "Please pick your numbers (1-40):";
-set $LR1,0;
-set $LR2,0;
-set $LR3,0;
-set $LR4,0;
-set $LR5,0;
-set $LR6,0;
-GMInput1:
-Input $LR1;
-if ($LR1 < 1 || $LR1 > 40) goto GMInput1;
-mes $LR1;
-GMInput2:
-Input $LR2;
-if ($LR2 < 1 || $LR2 > 40) goto GMInput2;
-if ($LR2 == $LR1) goto GMInput2;
-mes $LR2;
-GMInput3:
-Input $LR3;
-if ($LR3 < 1 || $LR3 > 40) goto GMInput3;
-if ($LR3 == $LR1) goto GMInput3;
-if ($LR3 == $LR2) goto GMInput3;
-mes $LR3;
-GMInput4:
-Input $LR4;
-if ($LR4 < 1 || $LR4 > 40) goto GMInput4;
-if ($LR4 == $LR1) goto GMInput4;
-if ($LR4 == $LR2) goto GMInput4;
-if ($LR4 == $LR3) goto GMInput4;
-mes $LR4;
-GMInput5:
-Input $LR5;
-if ($LR5 < 1 || $LR5 > 40) goto GMInput5;
-if ($LR5 == $LR1) goto GMInput5;
-if ($LR5 == $LR2) goto GMInput5;
-if ($LR5 == $LR3) goto GMInput5;
-if ($LR5 == $LR4) goto GMInput5;
-mes $LR5;
-GMInput6:
-Input $LR6;
-if ($LR6 < 1 || $LR6 > 40) goto GMInput6;
-if ($LR6 == $LR1) goto GMInput6;
-if ($LR6 == $LR2) goto GMInput6;
-if ($LR6 == $LR3) goto GMInput6;
-if ($LR6 == $LR4) goto GMInput6;
-if ($LR6 == $LR5) goto GMInput6;
-mes $LR6;
-next;
-mes "[Lottery]";
-mes "Lottery rigged for next draw.";
-set $L_Rigged,1;
-close;
-}
-
+//===== eAthena Script =======================================
+//= Lottery Script
+//===== By: ==================================================
+//= acky - god@acky.com
+//===== Current Version: =====================================
+//= 1.2.1a
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Daily lottery draw.
+//===== Additional Comments: =================================
+//= Numbers drawn daily (Time is configured line 29)
+//= *Added GM-Riggability
+//= *Ability to renew ticket
+//= *Improved interface
+//= *Fixed minor bug where first load didn't work.
+//= 1.2.1a fix due to new script engine
+//============================================================
+
+prontera.gat,1,1,1 script lotterygenerator 111,{
+OnInit:
+set $L_TicketPrice,4750; // TICKET COST
+set $L_Prize_Money,5000000; // JACKPOT AMOUNT
+set $L_Prize_Money_Small,1000000; // SECONDARY PRIZE
+if ($LID == 0) goto L_GenID;
+end;
+
+//Modify for own time
+OnClock2045:
+// CHECKS IF LOTTERY IS RIGGED
+if ($L_Rigged == 1) goto L_Rigged_Draw;
+// GENERATES RANDOM NUMBERS 1-40
+Pick1:
+set $LW1,rand (1,40);
+
+Pick2:
+set $LW2,rand (1,40);
+if ($LW2 == $LW1) goto Pick2;
+
+Pick3:
+set $LW3,rand (1,40);
+if ($LW3 == $LW2) goto Pick3;
+if ($LW3 == $LW1) goto Pick3;
+
+Pick4:
+set $LW4,rand (1,40);
+if ($LW4 == $LW2) goto Pick4;
+if ($LW4 == $LW1) goto Pick4;
+if ($LW4 == $LW3) goto Pick4;
+
+Pick5:
+set $LW5,rand (1,40);
+if ($LW5 == $LW1) goto Pick5;
+if ($LW5 == $LW2) goto Pick5;
+if ($LW5 == $LW3) goto Pick5;
+if ($LW5 == $LW4) goto Pick5;
+
+Pick6:
+set $LW6,rand (1,40);
+if ($LW6 == $LW1) goto Pick6;
+if ($LW6 == $LW2) goto Pick6;
+if ($LW6 == $LW3) goto Pick6;
+if ($LW6 == $LW4) goto Pick6;
+if ($LW6 == $LW5) goto Pick6;
+
+// BROADCASTS DRAW
+L_Broadcast:
+Announce "Lottery: Welcome to tonight's lotto draw!",8;
+Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
+Announce "Congratulations to the winners of tonight!",8;
+
+// GENERATES DRAW ID CODE
+L_GenID:
+set $LID2,$LID;
+// SETS TOMORROW'S ID NUMBER
+set $LID,rand (100000,999999);
+end;
+
+// SETS DRAW TO RIGGED NUMBERS
+L_Rigged_Draw:
+set $LW1,$LR1;
+set $LW2,$LR2;
+set $LW3,$LR3;
+set $LW4,$LR4;
+set $LW5,$LR5;
+set $LW6,$LR6;
+set $L_Rigged,0;
+goto L_Broadcast;
+}
+
+// BEGIN LOTTERY SCRIPT
+- script lottery 76,{
+L_Begin:
+mes "[Lottery]";
+mes "Winning Lotto Numbers ("+$LID2+"):";
+mes "^0000FF[" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]^000000";
+if ($LID > 99999) mes "Your Ticket ("+#LID+"):";
+if ($LID > 99999) mes "^FF0000[" + #LW1 + "] [" + #LW2 + "] [" + #LW3 + "] [" + #LW4 + "] [" + #LW5 + "] [" + #LW6 + "]^000000";
+mes "Next Draw-ID: ^FF0000" + $LID + "^000000.";
+next;
+if (getgmlevel(3) > 90) goto L_GM;
+menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"Cancel",L_Cancel;
+
+// PURCHASE TICKET
+L_Buy:
+if (#LID == $LID && #L1 != 0) goto L_DoubleTicket;
+mes "[Lottery]";
+mes "Tickets cost ^0000FF" + $L_TicketPrice + "z^000000.";
+mes "The Jackpot is ^FF0000" + $L_Prize_Money + "z^000000.";
+next;
+menu "Buy Ticket",-,"Cancel",L_Cancel;
+if (zeny < $L_TicketPrice) goto L_NoZeny;
+set zeny,zeny-$L_TicketPrice;
+mes "[Lottery]";
+mes "Would you like your numbers hand picked or computer generated?";
+next;
+menu "Computer Generated",L_ComputerGen,"Hand Picked",L_HandPick,"Renew Ticket",L_Renew;
+
+// RENEW LAST TICKET
+L_Renew:
+if ($LID < 99999) goto L_Invalid;
+set #LID,$LID;
+goto L_Confirm2;
+
+L_ComputerGen:
+// SELECTS RANDOM NUMBERS
+set @L1,0;
+set @L2,0;
+set @L3,0;
+set @L4,0;
+set @L5,0;
+set @L6,0;
+Pick1:
+set @L1,rand (1,40);
+Pick2:
+set @L2,rand (1,40);
+if (@L2 == @L1) goto Pick2;
+Pick3:
+set @L3,rand (1,40);
+if (@L3 == @L2) goto Pick3;
+if (@L3 == @L1) goto Pick3;
+Pick4:
+set @L4,rand (1,40);
+if (@L4 == @L2) goto Pick4;
+if (@L4 == @L1) goto Pick4;
+if (@L4 == @L3) goto Pick4;
+Pick5:
+set @L5,rand (1,40);
+if (@L5 == @L1) goto Pick5;
+if (@L5 == @L2) goto Pick5;
+if (@L5 == @L3) goto Pick5;
+if (@L5 == @L4) goto Pick5;
+Pick6:
+set @L6,rand (1,40);
+if (@L6 == @L1) goto Pick6;
+if (@L6 == @L2) goto Pick6;
+if (@L6 == @L3) goto Pick6;
+if (@L6 == @L4) goto Pick6;
+if (@L6 == @L5) goto Pick6;
+mes "[Lottery]";
+mes "The computer has selected the following numbers:";
+mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
+next;
+menu "Confirm",L_Confirm,"Re-Generate",L_ComputerGen;
+
+// HAND PICK LOTTERY NUMBERS
+L_HandPick:
+mes "[Lottery]";
+mes "Please pick your numbers (1-40):";
+set @L1,0;
+set @L2,0;
+set @L3,0;
+set @L4,0;
+set @L5,0;
+set @L6,0;
+Input1:
+input @L1;
+if (@L1 < 1 || @L1 > 40) goto Input1;
+mes @L1;
+Input2:
+input @L2;
+if (@L2 < 1 || @L2 > 40) goto Input2;
+if (@L2 == @L1) goto Input2;
+mes @L2;
+Input3:
+input @L3;
+if (@L3 < 1 || @L3 > 40) goto Input3;
+if (@L3 == @L1) goto Input3;
+if (@L3 == @L2) goto Input3;
+mes @L3;
+Input4:
+input @L4;
+if (@L4 < 1 || @L4 > 40) goto Input4;
+if (@L4 == @L1) goto Input4;
+if (@L4 == @L2) goto Input4;
+if (@L4 == @L3) goto Input4;
+mes @L4;
+Input5:
+input @L5;
+if (@L5 < 1 || @L5 > 40) goto Input5;
+if (@L5 == @L1) goto Input5;
+if (@L5 == @L2) goto Input5;
+if (@L5 == @L3) goto Input5;
+if (@L5 == @L4) goto Input5;
+mes @L5;
+Input6:
+input @L6;
+if (@L6 < 1 || @L6 > 40) goto Input6;
+if (@L6 == @L1) goto Input6;
+if (@L6 == @L2) goto Input6;
+if (@L6 == @L3) goto Input6;
+if (@L6 == @L4) goto Input6;
+if (@L6 == @L5) goto Input6;
+mes @L6;
+next;
+mes "[Lottery]";
+mes "Your numbers are:";
+mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000";
+next;
+menu "Confirm",L_Confirm,"Re-Pick",L_HandPick;
+
+L_Confirm:
+set #LW1,@L1;
+set #LW2,@L2;
+set #LW3,@L3;
+set #LW4,@L4;
+set #LW5,@L5;
+set #LW6,@L6;
+set #LID,$LID;
+L_Confirm2:
+mes "[Lottery]";
+mes "The live broadcasted draw is at 9pm.";
+mes "You can claim your ticket between then and the next draw.";
+next;
+mes "[Lottery]";
+mes "Good luck!";
+close;
+
+L_Claim:
+// CHECKS TICKET VALIDILITY
+if (#LID != $LID2) goto L_Invalid;
+// CHECKS HOW MANY NUMBERS MATCHED
+set @LPrize,0;
+if (#LW1 == $LW1) set @LPrize,@LPrize+1;
+if (#LW1 == $LW2) set @LPrize,@LPrize+1;
+if (#LW1 == $LW3) set @LPrize,@LPrize+1;
+if (#LW1 == $LW4) set @LPrize,@LPrize+1;
+if (#LW1 == $LW5) set @LPrize,@LPrize+1;
+if (#LW1 == $LW6) set @LPrize,@LPrize+1;
+if (#LW2 == $LW1) set @LPrize,@LPrize+1;
+if (#LW2 == $LW2) set @LPrize,@LPrize+1;
+if (#LW2 == $LW3) set @LPrize,@LPrize+1;
+if (#LW2 == $LW4) set @LPrize,@LPrize+1;
+if (#LW2 == $LW5) set @LPrize,@LPrize+1;
+if (#LW2 == $LW6) set @LPrize,@LPrize+1;
+if (#LW3 == $LW1) set @LPrize,@LPrize+1;
+if (#LW3 == $LW2) set @LPrize,@LPrize+1;
+if (#LW3 == $LW3) set @LPrize,@LPrize+1;
+if (#LW3 == $LW4) set @LPrize,@LPrize+1;
+if (#LW3 == $LW5) set @LPrize,@LPrize+1;
+if (#LW3 == $LW6) set @LPrize,@LPrize+1;
+if (#LW4 == $LW1) set @LPrize,@LPrize+1;
+if (#LW4 == $LW2) set @LPrize,@LPrize+1;
+if (#LW4 == $LW3) set @LPrize,@LPrize+1;
+if (#LW4 == $LW4) set @LPrize,@LPrize+1;
+if (#LW4 == $LW5) set @LPrize,@LPrize+1;
+if (#LW4 == $LW6) set @LPrize,@LPrize+1;
+if (#LW5 == $LW1) set @LPrize,@LPrize+1;
+if (#LW5 == $LW2) set @LPrize,@LPrize+1;
+if (#LW5 == $LW3) set @LPrize,@LPrize+1;
+if (#LW5 == $LW4) set @LPrize,@LPrize+1;
+if (#LW5 == $LW5) set @LPrize,@LPrize+1;
+if (#LW5 == $LW6) set @LPrize,@LPrize+1;
+if (#LW6 == $LW1) set @LPrize,@LPrize+1;
+if (#LW6 == $LW2) set @LPrize,@LPrize+1;
+if (#LW6 == $LW3) set @LPrize,@LPrize+1;
+if (#LW6 == $LW4) set @LPrize,@LPrize+1;
+if (#LW6 == $LW5) set @LPrize,@LPrize+1;
+if (#LW6 == $LW6) set @LPrize,@LPrize+1;
+
+if (@LPrize == 6) goto LWinBig;
+if (@LPrize > 3 && @LPrize < 6) goto LWinSmall;
+
+// NO WINNER
+mes "[Lottery]";
+mes "Bad luck, it appears you do not hold a winning ticket.";
+next;
+mes "[Lottery]";
+mes "Better luck next time!.";
+close;
+
+// MATCHED ALL SIX
+LWinBig:
+mes "[Lottery]";
+mes "You have matched all six numbers!";
+mes "Jackpot!";
+mes "You've won ^0000FF" + $L_Prize_Money + "z^000000.";
+set zeny,zeny+$L_Prize_Money;
+Announce "Lottery: " + strcharinfo(0) + " has won the JACKPOT of " + $L_Prize_Money + "z!",8;
+set #LID,0;
+close;
+
+// MATCHED AT LEAST 4
+LWinSmall:
+mes "[Lottery]";
+mes "You have matched at least 4 numbers!";
+mes "You've won ^0000FF" + $L_Prize_Money_Small + "z^000000.";
+set zeny,zeny+$L_Prize_Money_Small;
+Announce "Lottery: " + strcharinfo(0) + " has won a prize of " + $L_Prize_Money_Small + "z!",8;
+set #LID,0;
+close;
+
+// NO ZENY
+L_NoZeny:
+mes "[Lottery]";
+mes "You can't afford a lottery ticket.";
+close;
+
+// INVALID TICKET
+L_Invalid:
+mes "[Lottery]";
+mes "I'm sorry but it appears that you have an invalid ticket.";
+close;
+
+// DOUBLE TICKET
+L_DoubleTicket:
+mes "[Lottery]";
+mes "It appears that you already have a ticket for today.";
+mes "You may only purchase one ticket per draw.";
+close;
+
+L_Cancel:
+mes "[Lottery]";
+mes "Come back soon!";
+close;
+
+// GM MENU (Lets you manually do draws)
+L_GM:
+menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"[GM]Do Draw Now",-,"[GM]Rig the Lottery",L_GM_Rig,"Cancel",L_Cancel;
+
+// CHECKS IF LOTTERY IS RIGGED
+if ($L_Rigged == 1) goto L_Rigged_Draw;
+// GENERATES RANDOM NUMBERS 1-40
+GMPick1:
+set $LW1,rand (1,40);
+
+GMPick2:
+set $LW2,rand (1,40);
+if ($LW2 == $LW1) goto GMPick2;
+
+GMPick3:
+set $LW3,rand (1,40);
+if ($LW3 == $LW2) goto GMPick3;
+if ($LW3 == $LW1) goto GMPick3;
+
+GMPick4:
+set $LW4,rand (1,40);
+if ($LW4 == $LW2) goto GMPick4;
+if ($LW4 == $LW1) goto GMPick4;
+if ($LW4 == $LW3) goto GMPick4;
+
+GMPick5:
+set $LW5,rand (1,40);
+if ($LW5 == $LW1) goto GMPick5;
+if ($LW5 == $LW2) goto GMPick5;
+if ($LW5 == $LW3) goto GMPick5;
+if ($LW5 == $LW4) goto GMPick5;
+
+GMPick6:
+set $LW6,rand (1,40);
+if ($LW6 == $LW1) goto GMPick6;
+if ($LW6 == $LW2) goto GMPick6;
+if ($LW6 == $LW3) goto GMPick6;
+if ($LW6 == $LW4) goto GMPick6;
+if ($LW6 == $LW5) goto GMPick6;
+
+// BROADCASTS DRAW
+L_Broadcast:
+Announce "Lottery: Welcome to the special GM's lotto draw!",8;
+Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8;
+Announce "Congratulations to the winners!",8;
+
+// GENERATES DRAW ID CODE
+L_GenID:
+set $LID2,$LID;
+// SETS TOMORROW'S ID NUMBER
+set $LID,rand (100000,999999);
+close;
+
+// SETS DRAW TO RIGGED NUMBERS
+L_Rigged_Draw:
+set $LW1,$LR1;
+set $LW2,$LR2;
+set $LW3,$LR3;
+set $LW4,$LR4;
+set $LW5,$LR5;
+set $LW6,$LR6;
+set $L_Rigged,0;
+goto L_Broadcast;
+
+// ALLOWS GM TO DO A RIGGED DRAW
+L_GM_Rig:
+mes "[Lottery]";
+mes "Please pick your numbers (1-40):";
+set $LR1,0;
+set $LR2,0;
+set $LR3,0;
+set $LR4,0;
+set $LR5,0;
+set $LR6,0;
+GMInput1:
+Input $LR1;
+if ($LR1 < 1 || $LR1 > 40) goto GMInput1;
+mes $LR1;
+GMInput2:
+Input $LR2;
+if ($LR2 < 1 || $LR2 > 40) goto GMInput2;
+if ($LR2 == $LR1) goto GMInput2;
+mes $LR2;
+GMInput3:
+Input $LR3;
+if ($LR3 < 1 || $LR3 > 40) goto GMInput3;
+if ($LR3 == $LR1) goto GMInput3;
+if ($LR3 == $LR2) goto GMInput3;
+mes $LR3;
+GMInput4:
+Input $LR4;
+if ($LR4 < 1 || $LR4 > 40) goto GMInput4;
+if ($LR4 == $LR1) goto GMInput4;
+if ($LR4 == $LR2) goto GMInput4;
+if ($LR4 == $LR3) goto GMInput4;
+mes $LR4;
+GMInput5:
+Input $LR5;
+if ($LR5 < 1 || $LR5 > 40) goto GMInput5;
+if ($LR5 == $LR1) goto GMInput5;
+if ($LR5 == $LR2) goto GMInput5;
+if ($LR5 == $LR3) goto GMInput5;
+if ($LR5 == $LR4) goto GMInput5;
+mes $LR5;
+GMInput6:
+Input $LR6;
+if ($LR6 < 1 || $LR6 > 40) goto GMInput6;
+if ($LR6 == $LR1) goto GMInput6;
+if ($LR6 == $LR2) goto GMInput6;
+if ($LR6 == $LR3) goto GMInput6;
+if ($LR6 == $LR4) goto GMInput6;
+if ($LR6 == $LR5) goto GMInput6;
+mes $LR6;
+next;
+mes "[Lottery]";
+mes "Lottery rigged for next draw.";
+set $L_Rigged,1;
+close;
+}
+
prontera.gat,141,182,5 duplicate(lottery) Lottery 76 \ No newline at end of file
diff --git a/npc/custom/market.txt b/npc/custom/market.txt
index 7cf84bb62..c3484c896 100644
--- a/npc/custom/market.txt
+++ b/npc/custom/market.txt
@@ -1,43 +1,43 @@
-//===== Athena Script =======================================
-//= Market Place
-//===== By ================================================
-//= Lupus
-//===== Version ===========================================
-//= 1.0
-//===== Compatible With ===================================
-//= eAthena 5760+
-//===== Description =======================================
-//= This script should move vending crowds from Prontera
-//= streets to a suitable market place. Save your traffic 8)
-//===== Comments ==========================================
-// No comments yet
-//=========================================================
-
-
-prontera.gat,144,174,3 script Market Place 722,{
- mes"[Market Place]";
- mes"Tristan III's order: ^FF0000Move all the private shops to a special Market Place^000000.";
- next;
- menu "Enter the Market",M_ENTER, "Cancel",-;
- close2;
- end;
-
-M_ENTER:
- if(rand(10)==0 && checkcart(0) && @mrketflg<30 && @mrketflg>5 && getcharid(2)>1) FlagEmblem getcharid(2);
- warp "gon_test",27+rand(5),98;
- set @mrketflg,@mrketflg+1;
- end;
-}
-
-gon_test,73,103,0 script MarketExit 45,1,2,{
- warp "prontera.gat",155,177-rand(10);
- end;
-}
-
-//disable vending in Prontera
-prontera.gat mapflag novending
-prt_in.gat mapflag novending
-//Market Place settings
-gon_test mapflag noteleport
-gon_test mapflag nomemo
-gon_test mapflag nobranch
+//===== Athena Script =======================================
+//= Market Place
+//===== By ================================================
+//= Lupus
+//===== Version ===========================================
+//= 1.0
+//===== Compatible With ===================================
+//= eAthena 5760+
+//===== Description =======================================
+//= This script should move vending crowds from Prontera
+//= streets to a suitable market place. Save your traffic 8)
+//===== Comments ==========================================
+// No comments yet
+//=========================================================
+
+
+prontera.gat,144,174,3 script Market Place 722,{
+ mes"[Market Place]";
+ mes"Tristan III's order: ^FF0000Move all the private shops to a special Market Place^000000.";
+ next;
+ menu "Enter the Market",M_ENTER, "Cancel",-;
+ close2;
+ end;
+
+M_ENTER:
+ if(rand(10)==0 && checkcart(0) && @mrketflg<30 && @mrketflg>5 && getcharid(2)>1) FlagEmblem getcharid(2);
+ warp "gon_test",27+rand(5),98;
+ set @mrketflg,@mrketflg+1;
+ end;
+}
+
+gon_test,73,103,0 script MarketExit 45,1,2,{
+ warp "prontera.gat",155,177-rand(10);
+ end;
+}
+
+//disable vending in Prontera
+prontera.gat mapflag novending
+prt_in.gat mapflag novending
+//Market Place settings
+gon_test mapflag noteleport
+gon_test mapflag nomemo
+gon_test mapflag nobranch
diff --git a/npc/custom/morroc_raceway.txt b/npc/custom/morroc_raceway.txt
index d0c21a09b..a1fd85785 100644
--- a/npc/custom/morroc_raceway.txt
+++ b/npc/custom/morroc_raceway.txt
@@ -1,246 +1,246 @@
-//===== eAthena Script =======================================
-//= Morroc Raceway Script
-//===== By: ==================================================
-//= acky (god@acky.com)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Lets players race around Morroc (pvp_y_1-5.gat)
-//===== Additional Comments: =================================
-//= If there are more than 3 players, at least 3 people
-//= must finish before a new race can be started.
-//=
-//= If there are less than 3 players, at least 1 person
-//= must finish before a new race can be started.
-//=
-//= Removed permanent global variables
-//= 1.2 Removed Duplicates [Silent]
-//============================================================
-
-//Warps you into race way
-morocc.gat,166,105,6 script Race Girl#01 116,{
-mes "[Race Girl]";
-mes "Would you like to visit ^0000FFMorroc Raceway^000000?";
-next;
-menu "Yes",L_Warp,"No",-;
-mes "[Race Girl]";
-mes "Alright, talk to me again when you want to go.";
-close;
-
-L_Warp:
-warp "pvp_y_1-5.gat",165,256;
-close;
-}
-
-//Warps you out of raceway
-pvp_y_1-5.gat,169,265,5 script Race Girl#02 116,{
-mes "[Race Girl]";
-mes "Welcome to Morroc Raceway!";
-next;
-menu "Information",-,"Leave",L_Warp,"Cancel",L_Cancel;
-mes "[Race Girl]";
-mes "Someone must click on the Starter NPC to start the race.";
-next;
-mes "[Race Girl]";
-mes "Once the race is started, run around Morroc anti-clockwise.";
-next;
-mes "[Race Girl]";
-mes "You must reach all the checkpoints - No cheating!";
-close;
-
-L_Warp:
-warp "morocc.gat",165,101;
-
-L_Cancel:
-mes "[Race Girl]";
-mes "Come again soon!";
-close;
-}
-
-//Counts down and starts race
-pvp_y_1-5.gat,145,269,5 script Starter 733,{
-if ($@race != 0) goto L_Started;
-if ($@counting != 0) goto L_Started;
-if ($@racecount == 1) goto L_Started;
-L_Menu:
-mes "[Race Starter]";
-mes "Please stay on the Eastern side of me.";
-menu "Start Race",L_Count,"Cancel",-;
-close;
-
- L_Count:
- set $@counting,1;
- mes "Counting down...";
- addtimer 1000, "Starter::OnCount1000";
- addtimer 2000, "Starter::OnCount2000";
- addtimer 3000, "Starter::OnCount3000";
- addtimer 4000, "Starter::OnCount4000";
- announce strcharinfo(0) + "Started a countdown",1;
- announce "Get ready to race!",1;
- close;
-
-
- OnCount1000:
- announce "[3]",1;
- end;
-
- OnCount2000:
- announce "[2]",1;
- end;
-
- OnCount3000:
- announce "[1]",1;
- end;
-
- OnCount4000:
- emotion 27;
- specialeffect 267;
- announce "[GO!]",1;
- set $@race,1;
- set $@position,0;
- set $@counting,0;
- set $@raceid,rand(100000,999999);
- end;
-
-
-L_Started:
-if ((getmapusers("pvp_y_1-5.gat") < 3) && ($@position > 0)) goto L_Menu;
-if ($@position > 2) goto L_Menu;
-mes "[Starter]";
-mes "Race in progress";
-close;
-
-OnInit:
-set $@race,0;
-set $@position,0;
-set $@racecount,0;
-end;
-}
-
-//Checkpoint 1
-pvp_y_1-5.gat,144,262,5 script Check Point 1 111,0,5,{
-end;
-OnTouch:
-if (@raceid != $@raceid) goto L_Started;
-if (@race == 6) goto L_Finished;
-if ($@race == 1) goto L_Started;
-mes "The race has not started, please move back.";
-close;
-L_Started:
-set @race,1;
-set @raceid,$@raceid;
-end;
-L_Finished:
-mes "You have already completed the race.";
-close;
-}
-
-//Checkpoint 2
-pvp_y_1-5.gat,73,247,5 script Check Point 2 111,6,6,{
-end;
-OnTouch:
-if (@race != 1) goto L_Miss;
-set @race,2;
-announce "[" + strcharinfo(0) +"] has reached Checkpoint [1]",1;
-end;
-L_Miss:
-mes "You have missed a Checkpoint. Please go back.";
-close;
-}
-
-//Checkpoint 3
-pvp_y_1-5.gat,77,44,5 script Check Point 3 111,6,6,{
-end;
-OnTouch:
-if (@race != 2) goto L_Miss;
-set @race,3;
-announce "[" + strcharinfo(0) +"] has reached Checkpoint [2]",1;
-end;
-L_Miss:
-mes "You have missed a Checkpoint. Please go back.";
-close;
-}
-
-//Checkpoint 3
-pvp_y_1-5.gat,249,60,5 script Check Point 4 111,6,6,{
-end;
-OnTouch:
-if (@race != 3) goto L_Miss;
-set @race,4;
-announce "[" + strcharinfo(0) +"] has reached Checkpoint [3]",1;
-end;
-L_Miss:
-mes "You have missed a Checkpoint. Please go back.";
-close;
-}
-
-//Checkpoint 4
-pvp_y_1-5.gat,255,256,5 script Check Point 5 111,6,6,{
-end;
-OnTouch:
-if (@race != 4) goto L_Miss;
-set @race,5;
-announce "[" + strcharinfo(0) +"] has reached Checkpoint [4]",1;
-end;
-L_Miss:
-mes "You have missed a Checkpoint. Please go back.";
-close;
-}
-
-//Finish Line
-pvp_y_1-5.gat,174,244,5 script Finish Line 111,6,6,{
-end;
-OnTouch:
-if (@raceid != $@raceid) goto L_WrongRace;
-if (@race != 5) goto L_Miss;
-set @race,6;
-set $@position,$@position+1;
-announce "[" + strcharinfo(0) +"] has reached The Finish line! [Position: " + $@position + "]",1;
-end;
-L_Miss:
-mes "You have missed a Checkpoint. Please go back.";
-close;
-L_WrongRace:
-mes "You are not in this race.";
-close;
-}
-
-//Check Point Marker Flags
-pvp_y_1-5.gat,144,267,4 script Check Point 1#01 722,{
-end;
-}
-pvp_y_1-5.gat,144,257,4 script Check Point 1#02 722,{
-end;
-}
-pvp_y_1-5.gat,70,252,3 script Check Point 2#01 722,{
-end;
-}
-pvp_y_1-5.gat,77,243,3 script Check Point 2#02 722,{
-end;
-}
-pvp_y_1-5.gat,81,48,1 script Check Point 3#01 722,{
-end;
-}
-pvp_y_1-5.gat,72,40,1 script Check Point 3#02 722,{
-end;
-}
-pvp_y_1-5.gat,244,65,7 script Check Point 4#01 722,{
-end;
-}
-pvp_y_1-5.gat,252,57,7 script Check Point 4#02 722,{
-end;
-}
-pvp_y_1-5.gat,259,260,5 script Check Point 5#01 722,{
-end;
-}
-pvp_y_1-5.gat,251,252,5 script Check Point 5#02 722,{
-end;
-}
-pvp_y_1-5.gat,174,249,4 script Finish Line#01 722,{
-end;
-}
-pvp_y_1-5.gat,174,238,4 script Finish Line#02 722,{
-end;
+//===== eAthena Script =======================================
+//= Morroc Raceway Script
+//===== By: ==================================================
+//= acky (god@acky.com)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Lets players race around Morroc (pvp_y_1-5.gat)
+//===== Additional Comments: =================================
+//= If there are more than 3 players, at least 3 people
+//= must finish before a new race can be started.
+//=
+//= If there are less than 3 players, at least 1 person
+//= must finish before a new race can be started.
+//=
+//= Removed permanent global variables
+//= 1.2 Removed Duplicates [Silent]
+//============================================================
+
+//Warps you into race way
+morocc.gat,166,105,6 script Race Girl#01 116,{
+mes "[Race Girl]";
+mes "Would you like to visit ^0000FFMorroc Raceway^000000?";
+next;
+menu "Yes",L_Warp,"No",-;
+mes "[Race Girl]";
+mes "Alright, talk to me again when you want to go.";
+close;
+
+L_Warp:
+warp "pvp_y_1-5.gat",165,256;
+close;
+}
+
+//Warps you out of raceway
+pvp_y_1-5.gat,169,265,5 script Race Girl#02 116,{
+mes "[Race Girl]";
+mes "Welcome to Morroc Raceway!";
+next;
+menu "Information",-,"Leave",L_Warp,"Cancel",L_Cancel;
+mes "[Race Girl]";
+mes "Someone must click on the Starter NPC to start the race.";
+next;
+mes "[Race Girl]";
+mes "Once the race is started, run around Morroc anti-clockwise.";
+next;
+mes "[Race Girl]";
+mes "You must reach all the checkpoints - No cheating!";
+close;
+
+L_Warp:
+warp "morocc.gat",165,101;
+
+L_Cancel:
+mes "[Race Girl]";
+mes "Come again soon!";
+close;
+}
+
+//Counts down and starts race
+pvp_y_1-5.gat,145,269,5 script Starter 733,{
+if ($@race != 0) goto L_Started;
+if ($@counting != 0) goto L_Started;
+if ($@racecount == 1) goto L_Started;
+L_Menu:
+mes "[Race Starter]";
+mes "Please stay on the Eastern side of me.";
+menu "Start Race",L_Count,"Cancel",-;
+close;
+
+ L_Count:
+ set $@counting,1;
+ mes "Counting down...";
+ addtimer 1000, "Starter::OnCount1000";
+ addtimer 2000, "Starter::OnCount2000";
+ addtimer 3000, "Starter::OnCount3000";
+ addtimer 4000, "Starter::OnCount4000";
+ announce strcharinfo(0) + "Started a countdown",1;
+ announce "Get ready to race!",1;
+ close;
+
+
+ OnCount1000:
+ announce "[3]",1;
+ end;
+
+ OnCount2000:
+ announce "[2]",1;
+ end;
+
+ OnCount3000:
+ announce "[1]",1;
+ end;
+
+ OnCount4000:
+ emotion 27;
+ specialeffect 267;
+ announce "[GO!]",1;
+ set $@race,1;
+ set $@position,0;
+ set $@counting,0;
+ set $@raceid,rand(100000,999999);
+ end;
+
+
+L_Started:
+if ((getmapusers("pvp_y_1-5.gat") < 3) && ($@position > 0)) goto L_Menu;
+if ($@position > 2) goto L_Menu;
+mes "[Starter]";
+mes "Race in progress";
+close;
+
+OnInit:
+set $@race,0;
+set $@position,0;
+set $@racecount,0;
+end;
+}
+
+//Checkpoint 1
+pvp_y_1-5.gat,144,262,5 script Check Point 1 111,0,5,{
+end;
+OnTouch:
+if (@raceid != $@raceid) goto L_Started;
+if (@race == 6) goto L_Finished;
+if ($@race == 1) goto L_Started;
+mes "The race has not started, please move back.";
+close;
+L_Started:
+set @race,1;
+set @raceid,$@raceid;
+end;
+L_Finished:
+mes "You have already completed the race.";
+close;
+}
+
+//Checkpoint 2
+pvp_y_1-5.gat,73,247,5 script Check Point 2 111,6,6,{
+end;
+OnTouch:
+if (@race != 1) goto L_Miss;
+set @race,2;
+announce "[" + strcharinfo(0) +"] has reached Checkpoint [1]",1;
+end;
+L_Miss:
+mes "You have missed a Checkpoint. Please go back.";
+close;
+}
+
+//Checkpoint 3
+pvp_y_1-5.gat,77,44,5 script Check Point 3 111,6,6,{
+end;
+OnTouch:
+if (@race != 2) goto L_Miss;
+set @race,3;
+announce "[" + strcharinfo(0) +"] has reached Checkpoint [2]",1;
+end;
+L_Miss:
+mes "You have missed a Checkpoint. Please go back.";
+close;
+}
+
+//Checkpoint 3
+pvp_y_1-5.gat,249,60,5 script Check Point 4 111,6,6,{
+end;
+OnTouch:
+if (@race != 3) goto L_Miss;
+set @race,4;
+announce "[" + strcharinfo(0) +"] has reached Checkpoint [3]",1;
+end;
+L_Miss:
+mes "You have missed a Checkpoint. Please go back.";
+close;
+}
+
+//Checkpoint 4
+pvp_y_1-5.gat,255,256,5 script Check Point 5 111,6,6,{
+end;
+OnTouch:
+if (@race != 4) goto L_Miss;
+set @race,5;
+announce "[" + strcharinfo(0) +"] has reached Checkpoint [4]",1;
+end;
+L_Miss:
+mes "You have missed a Checkpoint. Please go back.";
+close;
+}
+
+//Finish Line
+pvp_y_1-5.gat,174,244,5 script Finish Line 111,6,6,{
+end;
+OnTouch:
+if (@raceid != $@raceid) goto L_WrongRace;
+if (@race != 5) goto L_Miss;
+set @race,6;
+set $@position,$@position+1;
+announce "[" + strcharinfo(0) +"] has reached The Finish line! [Position: " + $@position + "]",1;
+end;
+L_Miss:
+mes "You have missed a Checkpoint. Please go back.";
+close;
+L_WrongRace:
+mes "You are not in this race.";
+close;
+}
+
+//Check Point Marker Flags
+pvp_y_1-5.gat,144,267,4 script Check Point 1#01 722,{
+end;
+}
+pvp_y_1-5.gat,144,257,4 script Check Point 1#02 722,{
+end;
+}
+pvp_y_1-5.gat,70,252,3 script Check Point 2#01 722,{
+end;
+}
+pvp_y_1-5.gat,77,243,3 script Check Point 2#02 722,{
+end;
+}
+pvp_y_1-5.gat,81,48,1 script Check Point 3#01 722,{
+end;
+}
+pvp_y_1-5.gat,72,40,1 script Check Point 3#02 722,{
+end;
+}
+pvp_y_1-5.gat,244,65,7 script Check Point 4#01 722,{
+end;
+}
+pvp_y_1-5.gat,252,57,7 script Check Point 4#02 722,{
+end;
+}
+pvp_y_1-5.gat,259,260,5 script Check Point 5#01 722,{
+end;
+}
+pvp_y_1-5.gat,251,252,5 script Check Point 5#02 722,{
+end;
+}
+pvp_y_1-5.gat,174,249,4 script Finish Line#01 722,{
+end;
+}
+pvp_y_1-5.gat,174,238,4 script Finish Line#02 722,{
+end;
} \ No newline at end of file
diff --git a/npc/custom/mvm.txt b/npc/custom/mvm.txt
index 6c4236b4c..47bd8cc23 100644
--- a/npc/custom/mvm.txt
+++ b/npc/custom/mvm.txt
@@ -1,896 +1,896 @@
-//===== eAthena Script =======================================
-//= Monster vs Monster
-//===== By: ==================================================
-//= acky - god@acky.com
-//===== Current Version: =====================================
-//= 1.1.3
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= Players train monsters and battle other players.
-//= Experience can be earned and monsters upgraded.
-//===== Additional Comments: =================================
-//= To add monsters, add lines after the commends labled:
-//= '// #. ---Change to Add Monsters--- //'
-//= There are 6 steps to add a monster at the moment.
-//= Added Duel Room
-//= ---------------------------------------------------------
-//= Script is messy! Be careful!
-//= 1.1.2 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
-//= 1.1.3 Removed Duplicate Names [Silent]
-//= 1.1.4 Fixed SummonPad syntax. [KarLaeda]
-//============================================================
-
-// Entrance //
-prontera.gat,158,193,6 script Monster Arena 702,{
-mes "[Monster Arena]";
-mes "Would you like to enter the Monster Arena?";
-mes "Currently ^FF0000" + getmapusers("gon_test.gat") + "^000000 players";
-mes "^FF0000Note:^000000 Pecos, Falcons and Carts will be lost on entry.";
-L_Menu:
-next;
-menu "Enter",-,"Information",L_Info,"Cancel",L_Exit;
-
-set @marena,1;
-savepoint "gon_test.gat",56,99;
-set @battle,0;
-warp "gon_test.gat",57,99;
-close;
-
-L_Exit:
-mes "[Monster Arena]";
-mes "Come back any time.";
-close;
-
-L_Info:
-mes "[Monster Arena]";
-mes "You must purchase a pet from the Monster Tamer to start fighting.";
-next;
-mes "[Monster Arena]";
-mes "Then talk to the Usher and tell him you would like to compete.";
-next;
-mes "[Monster Arena]";
-mes "Talk to the referee to summon your monster.";
-mes "Once your monster has fought, you must talk to the Usher again and choose to spectate.";
-next;
-mes "[Monster Arena]";
-mes "Talk to the Monster Trainer, he will ask you to heal your pet.";
-next;
-mes "[Monster Arena]";
-mes "To do this, click the Nurse repearedly until it says your pet is healed.";
-next;
-mes "[Monster Arena]";
-mes "The more monsters you kill, the more exp you get and the quicker you can upgrade.";
-next;
-mes "[Monster Arena]";
-mes "The stronger your monster is, the longer it will take to summon again.";
-
-goto L_Menu;
-}
-
-// Monster Summon Function //
-function script monstersummon {
-// 1. ---Change to Add Monsters--- //
-if (#monster == 10) summon strcharinfo(0) + "'s Poring",1002, "OnPoringKilled";
-if (#monster == 20) summon strcharinfo(0) + "'s Fabre",1007, "OnFaberKilled";
-if (#monster == 30) summon strcharinfo(0) + "'s Lunatic",1063, "OnLunaticKilled";
-if (#monster == 31) summon strcharinfo(0) + "'s Drops",1113, "OnDropsKilled";
-if (#monster == 32) summon strcharinfo(0) + "'s Picky",1049, "OnPickyKilled";
-if (#monster == 40) summon strcharinfo(0) + "'s ChonChon",1011, "OnChonChonKilled";
-if (#monster == 41) summon strcharinfo(0) + "'s Super Picky",1050, "OnSPickyKilled";
-if (#monster == 42) summon strcharinfo(0) + "'s Willow",1010, "OnWillowKilled";
-if (#monster == 50) summon strcharinfo(0) + "'s Roda Frog",1012, "OnRodaKilled";
-if (#monster == 51) summon strcharinfo(0) + "'s Condor",1009, "OnCondorKilled";
-if (#monster == 60) summon strcharinfo(0) + "'s Thief Bug Larva",1051, "OnThiefKilled";
-if (#monster == 70) summon strcharinfo(0) + "'s Savage Babe",1167, "OnSavageKilled";
-if (#monster == 80) summon strcharinfo(0) + "'s Familiar",1005, "OnFamiliarKilled";
-if (#monster == 81) summon strcharinfo(0) + "'s Hornet",1004, "OnHornetKilled";
-if (#monster == 90) summon strcharinfo(0) + "'s Desert Wolf Puppy",1107, "OnPuppyKilled";
-if (#monster == 91) summon strcharinfo(0) + "'s Spore",1014, "OnSporeKilled";
-if (#monster == 92) summon strcharinfo(0) + "'s Rocker",1052, "OnRockerKilled";
-if (#monster == 100) summon strcharinfo(0) + "'s Skeleton",1076, "OnSkeletonKilled";
-if (#monster == 101) summon strcharinfo(0) + "'s Plankton",1161, "OnPlanktonKilled";
-if (#monster == 102) summon strcharinfo(0) + "'s Antonio",1247, "OnAntonioKilled";
-if (#monster == 103) summon strcharinfo(0) + "'s Thief Bug Female",1053, "OnThiefFemaleKilled";
-close;
-}
-
-// Referee //
-- script monsterreferee 61,{
-if (@fighting == 1) end;
-if (@battle == 1) goto L_Start;
-end;
-
-L_Start:
-mes "[Referee]";
-mes "Your monster is:";
-
-// 2. ---Change to Add Monsters--- //
-if (#monster == 10) mes "Poring";
-if (#monster == 20) mes "Faber";
-if (#monster == 30) mes "Lunatic";
-if (#monster == 31) mes "Drops";
-if (#monster == 32) mes "Picky";
-if (#monster == 40) mes "ChonChon";
-if (#monster == 41) mes "Super Picky";
-if (#monster == 42) mes "Willow";
-if (#monster == 50) mes "Roda Frog";
-if (#monster == 51) mes "Condor";
-if (#monster == 60) mes "Thief Bug Larva";
-if (#monster == 70) mes "Savage Babe";
-if (#monster == 80) mes "Familiar";
-if (#monster == 81) mes "Hornet";
-if (#monster == 90) mes "Desert Wolf Puppy";
-if (#monster == 91) mes "Spore";
-if (#monster == 92) mes "Rocker";
-if (#monster == 100) mes "Skeleton";
-if (#monster == 101) mes "Plankton";
-if (#monster == 102) mes "Antonio";
-if (#monster == 103) mes "Thief Bug Female";
-
-mes "Would you like to fight?";
-next;
-menu "Fight",-,"Cancel",L_Exit;
-
-set @fighting,1;
-set #heal,1;
-set @special,rand (100); // Chance of special summon
-if (@special == 1) goto Special1;
-if (@special == 2) goto Special2;
-if (@special == 3) goto Special3;
-if (@special == 4) goto Special4;
-if (@special == 5) goto Special5;
-
-callfunc "monstersummon";
-close;
-
-// Special Summons //
-Special1:
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
-close;
-
-Special2:
-summon strcharinfo(0) + "'s Mastering",1090, "OnSpecialKilled";
-close;
-
-Special3:
-summon strcharinfo(0) + "'s Eclipse",1093, "OnSpecialKilled";
-close;
-
-Special4:
-summon strcharinfo(0) + "'s Dragon Fly",1091, "OnSpecialKilled";
-close;
-
-Special5:
-summon strcharinfo(0) + "'s Toad",1089, "OnSpecialKilled";
-close;
-
-L_Exit:
-mes "[Referee]";
-mes "Alright";
-close;
-}
-gon_test.gat,56,91,6 duplicate(monsterreferee) Referee#01 61
-
-
-// Usher //
-gon_test.gat,58,94,6 script Usher 86,{
-set @marena,1;
-mes "[Usher]";
-mes "What would you like to do?";
-next;
-menu "^0000FFSpectate",L_Spec,"^FF0000Compete^000000",-,"Return to Town",L_Exit,"Cancel",L_Cancel;
-
-if (#monster == 0) goto L_NoMon;
-if (#heal == 1) goto L_Heal;
-
-if (#monster < 40) goto L_Low;
-if (#monster > 30 && #monster < 80) goto L_Med;
-if (#monster > 70) goto L_High;
-
-L_Low:
-menu "Level 1-3",L_1to3,"^FF0000All Levels",L_High;
-close;
-
-L_Med:
-menu "Level 4-7",L_4to6,"^FF0000All Levels",L_High;
-close;
-
-L_High:
-savepoint "gon_test.gat",56,99;
-set @battle,1;
-warp "gon_test.gat",72,87;
-atcommand strcharinfo(0) + "@option 64 0 64";
-close;
-
-L_4to6:
-savepoint "gon_test.gat",56,99;
-set @battle,1;
-warp "gon_test.gat",57,86;
-atcommand strcharinfo(0) + "@option 64 0 64";
-close;
-
-L_1to3:
-savepoint "gon_test.gat",56,99;
-set @battle,1;
-warp "gon_test.gat",43,87;
-atcommand strcharinfo(0) + "@option 64 0 64";
-close;
-
-
-L_Exit:
-savepoint "prontera.gat",149,186;
-set @battle,0;
-atcommand strcharinfo(0) + "@option 0 0 0";
-warp "prontera.gat",149,186;
-end;
-close;
-
-L_Spec:
-atcommand strcharinfo(0) + "@option 0 0 0";
-savepoint "gon_test.gat",56,99;
-set @battle,0;
-warp "gon_test.gat",57,99;
-close;
-
-L_NoMon:
-mes "[Usher]";
-mes "You haven't got a monster, you can only spectate.";
-close;
-
-L_Heal:
-mes "[Usher]";
-mes "You have to heal your monster before you can fight again.";
-close;
-
-L_Cancel:
-close;
-}
-
-// Monster Trainer //
-gon_test.gat,52,103,6 script Monster Trainer 87,{
-mes "[Monster Trainer]";
-if (#monster != 0) goto L_Mon;
-
-mes "Welcome to the monster arena, would you like to start training?";
-next;
-menu "Yes",-,"No",L_Exit;
-
-mes "[Monster Trainer]";
-mes "New trainers may only start with Porings.";
-mes "They cost 1000z, Would you like to buy one?";
-next;
-menu "Yes",-,"No",L_Exit;
-
-if (zeny < 1000) goto L_NoZeny;
-set zeny,zeny-1000;
-set #monster,10;
-mes "[Monster Trainer]";
-mes "Congratulations!";
-mes "When your Poring earns enough experience, talk to me to upgrade.";
-close;
-
-L_Mon:
-mes "Welcome back, " + strcharinfo(0) + ".";
-mes "Your monster has " + #monpoints + " exp points.";
-next;
-if (@fighting == 1) goto L_Heal;
-menu "Upgrade Monster",L_Upgrade,"Sell Experience",L_Sell,"^FF0000Abandon Monster^000000",L_Abandon,"Cancel",L_Exit;
-
-L_Abandon:
-mes "[Monster Trainer]";
-mes "Are you sure you want to abandon your monster?";
-next;
-menu "Yes",-,"No",L_Exit;
-set #monster,0;
-set #monpoints,0;
-mes "[Monster Trainer]";
-mes "Monster released into the wild.";
-close;
-
-L_Sell:
-mes "[Monster Trainer]";
-mes "You can sell your monster's experience for 100z each.";
-next;
-menu "Sell",-,"Cancel",L_Exit;
-mes "[Monster Trainer]";
-mes "You have: ^FF0000" + #monpoints + "^000000 experience points";
-mes "How many would you like to sell?";
-next;
-input @sellexp;
-if (@sellexp > #monpoints) goto L_NoExp;
-set #monpoints,#monpoints-@sellexp;
-set @sellearn,100*@sellexp; // Price of exp
-set zeny,zeny+@sellearn;
-mes "[Monster Trainer]";
-mes "You earned ^0000FF" + @sellearn + "^000000z.";
-close;
-
-
-L_NoExp:
-mes "[Monster Trainer]";
-mes "You do not have enough experience.";
-next;
-goto L_Exit;
-
-// Monster Upgrades //
-L_Upgrade:
-mes "[Monster Trainer]";
-// 3. ---Change to Add Monsters - May not be required--- //
-if (#monster > 1 && #monster < 20) mes "You need 10 exp points to upgrade your monster.";
-if (#monster > 19 && #monster < 30) mes "You need 20 exp points to upgrade your monster.";
-if (#monster > 29 && #monster < 40) mes "You need 40 exp points to upgrade your monster.";
-if (#monster > 39 && #monster < 50) mes "You need 80 exp points to upgrade your monster.";
-if (#monster > 49 && #monster < 60) mes "You need 160 exp points to upgrade your monster.";
-if (#monster > 59 && #monster < 70) mes "You need 320 exp points to upgrade your monster.";
-if (#monster > 69 && #monster < 80) mes "You need 640 exp points to upgrade your monster.";
-if (#monster > 79 && #monster < 90) mes "You need 1280 exp points to upgrade your monster.";
-if (#monster > 89 && #monster < 100) mes "You need 2560 exp points to upgrade your monster.";
-next;
-menu "Continue",-,"Cancel",L_Exit;
-mes "[Monster Trainer]";
-
-// 4. ---Change to Add Monsters - May not be required--- //
-if (#monster > 1 && #monster < 20 && #monpoints > 9) goto L_Up1;
-if (#monster > 19 && #monster < 30 && #monpoints > 19) goto L_Up2;
-if (#monster > 29 && #monster < 40 && #monpoints > 39) goto L_Up3;
-if (#monster > 39 && #monster < 50 && #monpoints > 79) goto L_Up4;
-if (#monster > 49 && #monster < 60 && #monpoints > 159) goto L_Up5;
-if (#monster > 59 && #monster < 70 && #monpoints > 319) goto L_Up6;
-if (#monster > 69 && #monster < 80 && #monpoints > 639) goto L_Up7;
-if (#monster > 79 && #monster < 90 && #monpoints > 1279) goto L_Up8;
-if (#monster > 89 && #monster < 100 && #monpoints > 2559) goto L_Up9;
-
-mes "Unable to upgrade.";
-close;
-
-// 5. ---Change to Add Monsters--- //
- L_Up1:
- set #monster,20;
- set #monpoints,#monpoints-10;
- mes "Upgraded to Fabre!";
- close;
-
- L_Up2:
- mes "Which monster would you like to upgrade to?";
- next;
- menu "Lunatic",U_Lunatic,"Drops",U_Drops,"Picky",U_Picky;
-
- U_Drops:
- set #monster,31;
- set #monpoints,#monpoints-20;
- mes "[Monster Trainer]";
- mes "Upgraded to Drops!";
- close;
-
- U_Picky:
- set #monster,32;
- set #monpoints,#monpoints-20;
- mes "[Monster Trainer]";
- mes "Upgraded to Picky!";
- close;
-
- U_Lunatic:
- set #monster,30;
- set #monpoints,#monpoints-20;
- mes "[Monster Trainer]";
- mes "Upgraded to Lunatic!";
- close;
-
- L_Up3:
- mes "Which monster would you like to upgrade to?";
- next;
- menu "ChonChon",U_ChonChon,"Super Picky",U_SPicky,"Willow",U_Willow;
-
- U_ChonChon:
- set #monster,40;
- set #monpoints,#monpoints-40;
- mes "[Monster Trainer]";
- mes "Upgraded to ChonChon!";
- close;
-
- U_SPicky:
- set #monster,41;
- set #monpoints,#monpoints-40;
- mes "[Monster Trainer]";
- mes "Upgraded to Super Picky!";
- close;
-
- U_Willow:
- set #monster,42;
- set #monpoints,#monpoints-40;
- mes "[Monster Trainer]";
- mes "Upgraded to Willow!";
- close;
-
- L_Up4:
- mes "Which monster would you like to upgrade to?";
- next;
- menu "Condor",U_Condor,"Roda Frog",U_Roda;
-
- U_Condor:
- set #monster,51;
- set #monpoints,#monpoints-80;
- mes "[Monster Trainer]";
- mes "Upgraded to Condor!";
- close;
-
- U_Roda:
- set #monster,50;
- set #monpoints,#monpoints-80;
- mes "[Monster Trainer]";
- mes "Upgraded to Roda Frog!";
- close;
-
- L_Up5:
- set #monster,60;
- set #monpoints,#monpoints-160;
- mes "Upgraded to Thief Bug Larva!";
- close;
-
- L_Up6:
- set #monster,70;
- set #monpoints,#monpoints-320;
- mes "Upgraded to Savage Babe!";
- close;
-
- L_Up7:
- mes "Which monster would you like to upgrade to?";
- next;
- menu "Familiar",U_Familiar,"Hornet",U_Hornet;
-
- U_Hornet:
- set #monster,81;
- set #monpoints,#monpoints-640;
- mes "[Monster Trainer]";
- mes "Upgraded to Hornet!";
- close;
-
- U_Familiar:
- set #monster,80;
- set #monpoints,#monpoints-640;
- mes "[Monster Trainer]";
- mes "Upgraded to Familiar!";
- close;
-
- L_Up8:
- mes "[Monster Trainer]";
- mes "Which monster would you like to upgrade to?";
- next;
- menu "Desert Wolf Puppy",U_Puppy,"Spore",U_Spore,"Rocker",U_Rocker;
-
- U_Spore:
- set #monster,91;
- set #monpoints,#monpoints-1280;
- mes "[Monster Trainer]";
- mes "Upgraded to Spore!";
- close;
-
- U_Rocker:
- set #monster,92;
- set #monpoints,#monpoints-1280;
- mes "[Monster Trainer]";
- mes "Upgraded to Rocker!";
- close;
-
- U_Puppy:
- set #monster,90;
- set #monpoints,#monpoints-1280;
- mes "[Monster Trainer]";
- mes "Upgraded to Desert Wolf Puppy!";
- close;
-
- L_Up9:
- mes "Which monster would you like to upgrade to?";
- next;
- menu "Skeleton",U_Skeleton,"Antonio",U_Antonio,"Plankton",U_Plankton,"Thief Bug Female",U_ThiefFemale;
-
- U_Plankton:
- set #monster,101;
- set #monpoints,#monpoints-2560;
- mes "[Monster Trainer]";
- mes "Upgraded to Plankton!";
- close;
-
- U_Antonio:
- set #monster,102;
- set #monpoints,#monpoints-2560;
- mes "[Monster Trainer]";
- mes "Upgraded to Antonio!";
- close;
-
- U_ThiefFemale:
- set #monster,103;
- set #monpoints,#monpoints-2560;
- mes "[Monster Trainer]";
- mes "Upgraded to Thief Bug Female!";
- close;
-
- U_Skeleton:
- set #monster,100;
- set #monpoints,#monpoints-2560;
- mes "[Monster Trainer]";
- mes "Upgraded to Skeleton!";
- close;
-
-L_NoZeny:
-mes "[Monster Trainer]";
-mes "You don't have enough zeny!";
-close;
-
-L_Exit:
-mes "[Monster Trainer]";
-mes "Goodbye.";
-close;
-
-L_Heal:
-mes "[Monster Trainer]";
-mes "Your monster needs to heal.";
-mes "It will heal faster if you click the nurse faster.";
-set #heal,1;
-close;
-}
-
-// Kill Trigger //
-// 6/Final. ---Change to Add Monsters--- //
- gon_test.gat,56,91,6 script OnPoringKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+1;
- announce "You killed a Poring - Gained 1 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnFaberKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+2;
- announce "You killed a Faber - Gained 2 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnLunaticKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+4;
- announce "You killed a Lunatic - Gained 4 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnDropsKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+4;
- announce "You killed a Drops - Gained 4 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnPickyKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+4;
- announce "You killed a Picky - Gained 4 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnChonChonKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+8;
- announce "You killed a ChonChon - Gained 8 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnSPickyKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+8;
- announce "You killed a Super Picky - Gained 8 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnWillowKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+8;
- announce "You killed a Willow - Gained 8 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnRodaKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+16;
- announce "You killed a Roda Frog - Gained 16 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnCondorKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+16;
- announce "You killed a Condor - Gained 16 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnThiefKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+32;
- announce "You killed a Theif Bug Larva - Gained 32 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnSavageKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+64;
- announce "You killed a Savage Babe - Gained 64 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnFamiliarKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+128;
- announce "You killed a Familiar - Gained 128 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnHornetKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+128;
- announce "You killed a Hornet - Gained 128 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnPuppyKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+256;
- announce "You killed a Desert Wolf Puppy - Gained 256 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnRockerKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+256;
- announce "You killed a Rocker - Gained 256 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnSporeKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+256;
- announce "You killed a Spore - Gained 256 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnSkeletonKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+512;
- announce "You killed a Skeleton - Gained 512 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnPlanktonKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+512;
- announce "You killed a Plankton - Gained 512 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnAntonioKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+512;
- announce "You killed an Antonio - Gained 512 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnThiefFemaleKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+512;
- announce "You killed a Thief Bug Female - Gained 512 exp",19;
- callfunc "duelkill";
- }
-
- gon_test.gat,56,91,6 script OnSpecialKilled -1,{
- if (@marena == 0) callfunc "illegalkill";
- set #monpoints,#monpoints+512;
- announce "You killed a Special Monster - Gained 1024 exp",19;
- callfunc "duelkill";
- }
-
-function script duelkill {
-if (strcharinfo(0) == $@duelist1$ || strcharinfo(0) == $@duelist2$) goto L_Heal;
-end;
- L_Heal:
- announce strcharinfo(0) + " won the Duel",1;
- set @fighting,0;
- set #heal,0;
- set @healing,0;
- end;
-}
-
-function script illegalkill {
-announce "Illegal Kill by " + strcharinfo(0) + " Detected",1;
-percentheal -100,-100;
-end;
-}
-
-// Healer //
-gon_test.gat,55,103,6 script Nurse 90,{
-if (@battle == 1 || #heal == 0) goto L_NoHeal;
-if (#heal == 1 && @healing < 100) goto L_Heal; //Total healing required
-set @fighting,0;
-set #heal,0;
-set @healing,0;
-specialeffect2 364;
-announce "Your monster has healed.",19;
-end;
-
- L_Heal:
- set @healrate,140 / #monster; //Rate of heal per click
- set @healing,@healing + @healrate;
- end;
-
- L_NoHeal:
- announce "Your monster does not need healing yet.",19;
- end;
-}
-
-// Warps players //
-gon_test.gat,57,86,5 script Summon Pad 1::SummonPad 111,2,2,{
-end;
-OnTouch:
-set @marena,1;
-warp "gon_test.gat",57,99;
-}
-gon_test.gat,43,87,5 duplicate(SummonPad) Summon Pad 2 111,2,2
-gon_test.gat,72,87,5 duplicate(SummonPad) Summon Pad 3 111,2,2
-
-
-
-// Skill Disabler //
-gon_test.gat,57,99,5 script Skill Disable 111,3,3,{
-atcommand strcharinfo(0) + "@skilloff";
-disablenpc "Skill Disable";
-end;
-}
-
-// Duel Arena //
-gon_test.gat,58,103,5 script Duel Master#01 92,{
-if ($@duelist1$ == "") set @duel,0;
-if ($@monster1 == "") set @duel,0;
-set @marena,1;
-if (#monster == 0) goto L_NoMon;
-mes "[Duel Master]";
-if ($@duel == 1) goto L_Waiting;
-if ($@duel == 2) goto L_Dueling;
-
-mes "There are currently no players dueling.";
-next;
-menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
-
-// Player 1 Enters Duel Area //
-if (#heal == 1) goto L_NeedHeal;
-if ($@duel == 1) goto L_Duel2;
-set $@duel,1;
-if (#monster > 1 && #monster < 20) set $@monster1,1;
-if (#monster > 19 && #monster < 30) set $@monster1,2;
-if (#monster > 29 && #monster < 40) set $@monster1,3;
-if (#monster > 39 && #monster < 50) set $@monster1,4;
-if (#monster > 49 && #monster < 60) set $@monster1,5;
-if (#monster > 59 && #monster < 70) set $@monster1,6;
-if (#monster > 69 && #monster < 80) set $@monster1,7;
-if (#monster > 79 && #monster < 90) set $@monster1,8;
-if (#monster > 89 && #monster < 100) set $@monster1,9;
-if (#monster > 99 && #monster < 110) set $@monster1,10;
-set $@duelist1$,strcharinfo(0);
-set @battle,1;
-announce strcharinfo(0) + " [Monster Level: " + $@monster1 + "] is waiting for a duel",1;
-atcommand strcharinfo(0) + "@option 64 0 64";
-warp "gon_test.gat",49,5;
-close;
-
-L_Waiting:
-mes "^0000FF " + $@duelist1$ + "^000000 [Monster Level: ^FF0000" + $@monster1 + "^000000]";
-mes "Is waiting for an opponent";
-next;
-menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
-
-// Player 2 Enters Duel Area //
-if (#heal == 1) goto L_NeedHeal;
-L_Duel2:
-if ($@duel == 2) goto L_Spec;
-set $@duel,2;
-if (#monster > 1 && #monster < 20) set $@monster2,1;
-if (#monster > 19 && #monster < 30) set $@monster2,2;
-if (#monster > 29 && #monster < 40) set $@monster2,3;
-if (#monster > 39 && #monster < 50) set $@monster2,4;
-if (#monster > 49 && #monster < 60) set $@monster2,5;
-if (#monster > 59 && #monster < 70) set $@monster2,6;
-if (#monster > 69 && #monster < 80) set $@monster2,7;
-if (#monster > 79 && #monster < 90) set $@monster2,8;
-if (#monster > 89 && #monster < 100) set $@monster2,9;
-if (#monster > 99 && #monster < 110) set $@monster2,10;
-set $@duelist2$,strcharinfo(0);
-set @battle,1;
-announce strcharinfo(0) + " [Monster Level: " + $@monster2 + "] has joined the duel",1;
-atcommand strcharinfo(0) + "@option 64 0 64";
-warp "gon_test.gat",49,5;
-close;
-
- L_Dueling:
- mes "^0000FF" + $@duelist1$ + "^000000 [Monster Level: ^0000FF" + $@monster1 + "^000000]";
- mes " VS.";
- mes "^FF0000" + $@duelist2$ + "^000000 [Monster Level: ^FF0000" + $@monster2 + "^000000]";
- next;
- menu "Spectate",L_Spec,"Cancel",L_Exit;
-
- L_Spec:
- set @battle,0;
- atcommand strcharinfo(0) + "@option 64 0 64";
- warp "gon_test.gat",49,5;
- close;
-
- L_Exit:
- mes "[Duel Master]";
- mes "Goodbye.";
- close;
-
- L_NoMon:
- mes "[Duel Master]";
- mes "You haven't got a monster, you can't participate.";
- close;
-
- L_NeedHeal:
- mes "[Duel Master]";
- mes "You need to heal before you can join.";
- close;
-}
-
-// Duel Exit //
-gon_test.gat,42,8,5 script Duel Master#02 92,{
-mes "[Duel Master]";
-mes "Would you like to return?";
-menu "Yes",L_Leave,"No",-;
-mes "Alright";
-close;
-
- L_Leave:
- if ($@duelist1$ == strcharinfo(0)) goto L_Leave1;
- if ($@duelist2$ == strcharinfo(0)) goto L_Leave2;
-
- L_Leave3:
- atcommand strcharinfo(0) + "@option 0 0 0";
- set @battle,0;
- warp "gon_test.gat",57,99;
- close;
-
- L_Leave1:
- set $@duelist1$,$@duelist2$;
- set $@monster1,$@monster2;
- set $@duel,$@duel-1;
- announce strcharinfo(0) + " stopped dueling",1;
- goto L_Leave3;
-
- L_Leave2:
- set $@duelist2$,"";
- set $@monster2,0;
- set $@duel,$@duel-1;
- announce strcharinfo(0) + " stopped dueling",1;
- goto L_Leave3;
-}
-
-gon_test.gat,49,5,5 duplicate(SummonPad) Summon Pad 4 111,2,2
+//===== eAthena Script =======================================
+//= Monster vs Monster
+//===== By: ==================================================
+//= acky - god@acky.com
+//===== Current Version: =====================================
+//= 1.1.3
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= Players train monsters and battle other players.
+//= Experience can be earned and monsters upgraded.
+//===== Additional Comments: =================================
+//= To add monsters, add lines after the commends labled:
+//= '// #. ---Change to Add Monsters--- //'
+//= There are 6 steps to add a monster at the moment.
+//= Added Duel Room
+//= ---------------------------------------------------------
+//= Script is messy! Be careful!
+//= 1.1.2 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
+//= 1.1.3 Removed Duplicate Names [Silent]
+//= 1.1.4 Fixed SummonPad syntax. [KarLaeda]
+//============================================================
+
+// Entrance //
+prontera.gat,158,193,6 script Monster Arena 702,{
+mes "[Monster Arena]";
+mes "Would you like to enter the Monster Arena?";
+mes "Currently ^FF0000" + getmapusers("gon_test.gat") + "^000000 players";
+mes "^FF0000Note:^000000 Pecos, Falcons and Carts will be lost on entry.";
+L_Menu:
+next;
+menu "Enter",-,"Information",L_Info,"Cancel",L_Exit;
+
+set @marena,1;
+savepoint "gon_test.gat",56,99;
+set @battle,0;
+warp "gon_test.gat",57,99;
+close;
+
+L_Exit:
+mes "[Monster Arena]";
+mes "Come back any time.";
+close;
+
+L_Info:
+mes "[Monster Arena]";
+mes "You must purchase a pet from the Monster Tamer to start fighting.";
+next;
+mes "[Monster Arena]";
+mes "Then talk to the Usher and tell him you would like to compete.";
+next;
+mes "[Monster Arena]";
+mes "Talk to the referee to summon your monster.";
+mes "Once your monster has fought, you must talk to the Usher again and choose to spectate.";
+next;
+mes "[Monster Arena]";
+mes "Talk to the Monster Trainer, he will ask you to heal your pet.";
+next;
+mes "[Monster Arena]";
+mes "To do this, click the Nurse repearedly until it says your pet is healed.";
+next;
+mes "[Monster Arena]";
+mes "The more monsters you kill, the more exp you get and the quicker you can upgrade.";
+next;
+mes "[Monster Arena]";
+mes "The stronger your monster is, the longer it will take to summon again.";
+
+goto L_Menu;
+}
+
+// Monster Summon Function //
+function script monstersummon {
+// 1. ---Change to Add Monsters--- //
+if (#monster == 10) summon strcharinfo(0) + "'s Poring",1002, "OnPoringKilled";
+if (#monster == 20) summon strcharinfo(0) + "'s Fabre",1007, "OnFaberKilled";
+if (#monster == 30) summon strcharinfo(0) + "'s Lunatic",1063, "OnLunaticKilled";
+if (#monster == 31) summon strcharinfo(0) + "'s Drops",1113, "OnDropsKilled";
+if (#monster == 32) summon strcharinfo(0) + "'s Picky",1049, "OnPickyKilled";
+if (#monster == 40) summon strcharinfo(0) + "'s ChonChon",1011, "OnChonChonKilled";
+if (#monster == 41) summon strcharinfo(0) + "'s Super Picky",1050, "OnSPickyKilled";
+if (#monster == 42) summon strcharinfo(0) + "'s Willow",1010, "OnWillowKilled";
+if (#monster == 50) summon strcharinfo(0) + "'s Roda Frog",1012, "OnRodaKilled";
+if (#monster == 51) summon strcharinfo(0) + "'s Condor",1009, "OnCondorKilled";
+if (#monster == 60) summon strcharinfo(0) + "'s Thief Bug Larva",1051, "OnThiefKilled";
+if (#monster == 70) summon strcharinfo(0) + "'s Savage Babe",1167, "OnSavageKilled";
+if (#monster == 80) summon strcharinfo(0) + "'s Familiar",1005, "OnFamiliarKilled";
+if (#monster == 81) summon strcharinfo(0) + "'s Hornet",1004, "OnHornetKilled";
+if (#monster == 90) summon strcharinfo(0) + "'s Desert Wolf Puppy",1107, "OnPuppyKilled";
+if (#monster == 91) summon strcharinfo(0) + "'s Spore",1014, "OnSporeKilled";
+if (#monster == 92) summon strcharinfo(0) + "'s Rocker",1052, "OnRockerKilled";
+if (#monster == 100) summon strcharinfo(0) + "'s Skeleton",1076, "OnSkeletonKilled";
+if (#monster == 101) summon strcharinfo(0) + "'s Plankton",1161, "OnPlanktonKilled";
+if (#monster == 102) summon strcharinfo(0) + "'s Antonio",1247, "OnAntonioKilled";
+if (#monster == 103) summon strcharinfo(0) + "'s Thief Bug Female",1053, "OnThiefFemaleKilled";
+close;
+}
+
+// Referee //
+- script monsterreferee 61,{
+if (@fighting == 1) end;
+if (@battle == 1) goto L_Start;
+end;
+
+L_Start:
+mes "[Referee]";
+mes "Your monster is:";
+
+// 2. ---Change to Add Monsters--- //
+if (#monster == 10) mes "Poring";
+if (#monster == 20) mes "Faber";
+if (#monster == 30) mes "Lunatic";
+if (#monster == 31) mes "Drops";
+if (#monster == 32) mes "Picky";
+if (#monster == 40) mes "ChonChon";
+if (#monster == 41) mes "Super Picky";
+if (#monster == 42) mes "Willow";
+if (#monster == 50) mes "Roda Frog";
+if (#monster == 51) mes "Condor";
+if (#monster == 60) mes "Thief Bug Larva";
+if (#monster == 70) mes "Savage Babe";
+if (#monster == 80) mes "Familiar";
+if (#monster == 81) mes "Hornet";
+if (#monster == 90) mes "Desert Wolf Puppy";
+if (#monster == 91) mes "Spore";
+if (#monster == 92) mes "Rocker";
+if (#monster == 100) mes "Skeleton";
+if (#monster == 101) mes "Plankton";
+if (#monster == 102) mes "Antonio";
+if (#monster == 103) mes "Thief Bug Female";
+
+mes "Would you like to fight?";
+next;
+menu "Fight",-,"Cancel",L_Exit;
+
+set @fighting,1;
+set #heal,1;
+set @special,rand (100); // Chance of special summon
+if (@special == 1) goto Special1;
+if (@special == 2) goto Special2;
+if (@special == 3) goto Special3;
+if (@special == 4) goto Special4;
+if (@special == 5) goto Special5;
+
+callfunc "monstersummon";
+close;
+
+// Special Summons //
+Special1:
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled";
+close;
+
+Special2:
+summon strcharinfo(0) + "'s Mastering",1090, "OnSpecialKilled";
+close;
+
+Special3:
+summon strcharinfo(0) + "'s Eclipse",1093, "OnSpecialKilled";
+close;
+
+Special4:
+summon strcharinfo(0) + "'s Dragon Fly",1091, "OnSpecialKilled";
+close;
+
+Special5:
+summon strcharinfo(0) + "'s Toad",1089, "OnSpecialKilled";
+close;
+
+L_Exit:
+mes "[Referee]";
+mes "Alright";
+close;
+}
+gon_test.gat,56,91,6 duplicate(monsterreferee) Referee#01 61
+
+
+// Usher //
+gon_test.gat,58,94,6 script Usher 86,{
+set @marena,1;
+mes "[Usher]";
+mes "What would you like to do?";
+next;
+menu "^0000FFSpectate",L_Spec,"^FF0000Compete^000000",-,"Return to Town",L_Exit,"Cancel",L_Cancel;
+
+if (#monster == 0) goto L_NoMon;
+if (#heal == 1) goto L_Heal;
+
+if (#monster < 40) goto L_Low;
+if (#monster > 30 && #monster < 80) goto L_Med;
+if (#monster > 70) goto L_High;
+
+L_Low:
+menu "Level 1-3",L_1to3,"^FF0000All Levels",L_High;
+close;
+
+L_Med:
+menu "Level 4-7",L_4to6,"^FF0000All Levels",L_High;
+close;
+
+L_High:
+savepoint "gon_test.gat",56,99;
+set @battle,1;
+warp "gon_test.gat",72,87;
+atcommand strcharinfo(0) + "@option 64 0 64";
+close;
+
+L_4to6:
+savepoint "gon_test.gat",56,99;
+set @battle,1;
+warp "gon_test.gat",57,86;
+atcommand strcharinfo(0) + "@option 64 0 64";
+close;
+
+L_1to3:
+savepoint "gon_test.gat",56,99;
+set @battle,1;
+warp "gon_test.gat",43,87;
+atcommand strcharinfo(0) + "@option 64 0 64";
+close;
+
+
+L_Exit:
+savepoint "prontera.gat",149,186;
+set @battle,0;
+atcommand strcharinfo(0) + "@option 0 0 0";
+warp "prontera.gat",149,186;
+end;
+close;
+
+L_Spec:
+atcommand strcharinfo(0) + "@option 0 0 0";
+savepoint "gon_test.gat",56,99;
+set @battle,0;
+warp "gon_test.gat",57,99;
+close;
+
+L_NoMon:
+mes "[Usher]";
+mes "You haven't got a monster, you can only spectate.";
+close;
+
+L_Heal:
+mes "[Usher]";
+mes "You have to heal your monster before you can fight again.";
+close;
+
+L_Cancel:
+close;
+}
+
+// Monster Trainer //
+gon_test.gat,52,103,6 script Monster Trainer 87,{
+mes "[Monster Trainer]";
+if (#monster != 0) goto L_Mon;
+
+mes "Welcome to the monster arena, would you like to start training?";
+next;
+menu "Yes",-,"No",L_Exit;
+
+mes "[Monster Trainer]";
+mes "New trainers may only start with Porings.";
+mes "They cost 1000z, Would you like to buy one?";
+next;
+menu "Yes",-,"No",L_Exit;
+
+if (zeny < 1000) goto L_NoZeny;
+set zeny,zeny-1000;
+set #monster,10;
+mes "[Monster Trainer]";
+mes "Congratulations!";
+mes "When your Poring earns enough experience, talk to me to upgrade.";
+close;
+
+L_Mon:
+mes "Welcome back, " + strcharinfo(0) + ".";
+mes "Your monster has " + #monpoints + " exp points.";
+next;
+if (@fighting == 1) goto L_Heal;
+menu "Upgrade Monster",L_Upgrade,"Sell Experience",L_Sell,"^FF0000Abandon Monster^000000",L_Abandon,"Cancel",L_Exit;
+
+L_Abandon:
+mes "[Monster Trainer]";
+mes "Are you sure you want to abandon your monster?";
+next;
+menu "Yes",-,"No",L_Exit;
+set #monster,0;
+set #monpoints,0;
+mes "[Monster Trainer]";
+mes "Monster released into the wild.";
+close;
+
+L_Sell:
+mes "[Monster Trainer]";
+mes "You can sell your monster's experience for 100z each.";
+next;
+menu "Sell",-,"Cancel",L_Exit;
+mes "[Monster Trainer]";
+mes "You have: ^FF0000" + #monpoints + "^000000 experience points";
+mes "How many would you like to sell?";
+next;
+input @sellexp;
+if (@sellexp > #monpoints) goto L_NoExp;
+set #monpoints,#monpoints-@sellexp;
+set @sellearn,100*@sellexp; // Price of exp
+set zeny,zeny+@sellearn;
+mes "[Monster Trainer]";
+mes "You earned ^0000FF" + @sellearn + "^000000z.";
+close;
+
+
+L_NoExp:
+mes "[Monster Trainer]";
+mes "You do not have enough experience.";
+next;
+goto L_Exit;
+
+// Monster Upgrades //
+L_Upgrade:
+mes "[Monster Trainer]";
+// 3. ---Change to Add Monsters - May not be required--- //
+if (#monster > 1 && #monster < 20) mes "You need 10 exp points to upgrade your monster.";
+if (#monster > 19 && #monster < 30) mes "You need 20 exp points to upgrade your monster.";
+if (#monster > 29 && #monster < 40) mes "You need 40 exp points to upgrade your monster.";
+if (#monster > 39 && #monster < 50) mes "You need 80 exp points to upgrade your monster.";
+if (#monster > 49 && #monster < 60) mes "You need 160 exp points to upgrade your monster.";
+if (#monster > 59 && #monster < 70) mes "You need 320 exp points to upgrade your monster.";
+if (#monster > 69 && #monster < 80) mes "You need 640 exp points to upgrade your monster.";
+if (#monster > 79 && #monster < 90) mes "You need 1280 exp points to upgrade your monster.";
+if (#monster > 89 && #monster < 100) mes "You need 2560 exp points to upgrade your monster.";
+next;
+menu "Continue",-,"Cancel",L_Exit;
+mes "[Monster Trainer]";
+
+// 4. ---Change to Add Monsters - May not be required--- //
+if (#monster > 1 && #monster < 20 && #monpoints > 9) goto L_Up1;
+if (#monster > 19 && #monster < 30 && #monpoints > 19) goto L_Up2;
+if (#monster > 29 && #monster < 40 && #monpoints > 39) goto L_Up3;
+if (#monster > 39 && #monster < 50 && #monpoints > 79) goto L_Up4;
+if (#monster > 49 && #monster < 60 && #monpoints > 159) goto L_Up5;
+if (#monster > 59 && #monster < 70 && #monpoints > 319) goto L_Up6;
+if (#monster > 69 && #monster < 80 && #monpoints > 639) goto L_Up7;
+if (#monster > 79 && #monster < 90 && #monpoints > 1279) goto L_Up8;
+if (#monster > 89 && #monster < 100 && #monpoints > 2559) goto L_Up9;
+
+mes "Unable to upgrade.";
+close;
+
+// 5. ---Change to Add Monsters--- //
+ L_Up1:
+ set #monster,20;
+ set #monpoints,#monpoints-10;
+ mes "Upgraded to Fabre!";
+ close;
+
+ L_Up2:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Lunatic",U_Lunatic,"Drops",U_Drops,"Picky",U_Picky;
+
+ U_Drops:
+ set #monster,31;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Drops!";
+ close;
+
+ U_Picky:
+ set #monster,32;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Picky!";
+ close;
+
+ U_Lunatic:
+ set #monster,30;
+ set #monpoints,#monpoints-20;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Lunatic!";
+ close;
+
+ L_Up3:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "ChonChon",U_ChonChon,"Super Picky",U_SPicky,"Willow",U_Willow;
+
+ U_ChonChon:
+ set #monster,40;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to ChonChon!";
+ close;
+
+ U_SPicky:
+ set #monster,41;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Super Picky!";
+ close;
+
+ U_Willow:
+ set #monster,42;
+ set #monpoints,#monpoints-40;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Willow!";
+ close;
+
+ L_Up4:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Condor",U_Condor,"Roda Frog",U_Roda;
+
+ U_Condor:
+ set #monster,51;
+ set #monpoints,#monpoints-80;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Condor!";
+ close;
+
+ U_Roda:
+ set #monster,50;
+ set #monpoints,#monpoints-80;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Roda Frog!";
+ close;
+
+ L_Up5:
+ set #monster,60;
+ set #monpoints,#monpoints-160;
+ mes "Upgraded to Thief Bug Larva!";
+ close;
+
+ L_Up6:
+ set #monster,70;
+ set #monpoints,#monpoints-320;
+ mes "Upgraded to Savage Babe!";
+ close;
+
+ L_Up7:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Familiar",U_Familiar,"Hornet",U_Hornet;
+
+ U_Hornet:
+ set #monster,81;
+ set #monpoints,#monpoints-640;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Hornet!";
+ close;
+
+ U_Familiar:
+ set #monster,80;
+ set #monpoints,#monpoints-640;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Familiar!";
+ close;
+
+ L_Up8:
+ mes "[Monster Trainer]";
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Desert Wolf Puppy",U_Puppy,"Spore",U_Spore,"Rocker",U_Rocker;
+
+ U_Spore:
+ set #monster,91;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Spore!";
+ close;
+
+ U_Rocker:
+ set #monster,92;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Rocker!";
+ close;
+
+ U_Puppy:
+ set #monster,90;
+ set #monpoints,#monpoints-1280;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Desert Wolf Puppy!";
+ close;
+
+ L_Up9:
+ mes "Which monster would you like to upgrade to?";
+ next;
+ menu "Skeleton",U_Skeleton,"Antonio",U_Antonio,"Plankton",U_Plankton,"Thief Bug Female",U_ThiefFemale;
+
+ U_Plankton:
+ set #monster,101;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Plankton!";
+ close;
+
+ U_Antonio:
+ set #monster,102;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Antonio!";
+ close;
+
+ U_ThiefFemale:
+ set #monster,103;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Thief Bug Female!";
+ close;
+
+ U_Skeleton:
+ set #monster,100;
+ set #monpoints,#monpoints-2560;
+ mes "[Monster Trainer]";
+ mes "Upgraded to Skeleton!";
+ close;
+
+L_NoZeny:
+mes "[Monster Trainer]";
+mes "You don't have enough zeny!";
+close;
+
+L_Exit:
+mes "[Monster Trainer]";
+mes "Goodbye.";
+close;
+
+L_Heal:
+mes "[Monster Trainer]";
+mes "Your monster needs to heal.";
+mes "It will heal faster if you click the nurse faster.";
+set #heal,1;
+close;
+}
+
+// Kill Trigger //
+// 6/Final. ---Change to Add Monsters--- //
+ gon_test.gat,56,91,6 script OnPoringKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+1;
+ announce "You killed a Poring - Gained 1 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnFaberKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+2;
+ announce "You killed a Faber - Gained 2 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnLunaticKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Lunatic - Gained 4 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnDropsKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Drops - Gained 4 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnPickyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+4;
+ announce "You killed a Picky - Gained 4 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnChonChonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a ChonChon - Gained 8 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnSPickyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a Super Picky - Gained 8 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnWillowKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+8;
+ announce "You killed a Willow - Gained 8 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnRodaKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+16;
+ announce "You killed a Roda Frog - Gained 16 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnCondorKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+16;
+ announce "You killed a Condor - Gained 16 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnThiefKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+32;
+ announce "You killed a Theif Bug Larva - Gained 32 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnSavageKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+64;
+ announce "You killed a Savage Babe - Gained 64 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnFamiliarKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+128;
+ announce "You killed a Familiar - Gained 128 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnHornetKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+128;
+ announce "You killed a Hornet - Gained 128 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnPuppyKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Desert Wolf Puppy - Gained 256 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnRockerKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Rocker - Gained 256 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnSporeKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+256;
+ announce "You killed a Spore - Gained 256 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnSkeletonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Skeleton - Gained 512 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnPlanktonKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Plankton - Gained 512 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnAntonioKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed an Antonio - Gained 512 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnThiefFemaleKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Thief Bug Female - Gained 512 exp",19;
+ callfunc "duelkill";
+ }
+
+ gon_test.gat,56,91,6 script OnSpecialKilled -1,{
+ if (@marena == 0) callfunc "illegalkill";
+ set #monpoints,#monpoints+512;
+ announce "You killed a Special Monster - Gained 1024 exp",19;
+ callfunc "duelkill";
+ }
+
+function script duelkill {
+if (strcharinfo(0) == $@duelist1$ || strcharinfo(0) == $@duelist2$) goto L_Heal;
+end;
+ L_Heal:
+ announce strcharinfo(0) + " won the Duel",1;
+ set @fighting,0;
+ set #heal,0;
+ set @healing,0;
+ end;
+}
+
+function script illegalkill {
+announce "Illegal Kill by " + strcharinfo(0) + " Detected",1;
+percentheal -100,-100;
+end;
+}
+
+// Healer //
+gon_test.gat,55,103,6 script Nurse 90,{
+if (@battle == 1 || #heal == 0) goto L_NoHeal;
+if (#heal == 1 && @healing < 100) goto L_Heal; //Total healing required
+set @fighting,0;
+set #heal,0;
+set @healing,0;
+specialeffect2 364;
+announce "Your monster has healed.",19;
+end;
+
+ L_Heal:
+ set @healrate,140 / #monster; //Rate of heal per click
+ set @healing,@healing + @healrate;
+ end;
+
+ L_NoHeal:
+ announce "Your monster does not need healing yet.",19;
+ end;
+}
+
+// Warps players //
+gon_test.gat,57,86,5 script Summon Pad 1::SummonPad 111,2,2,{
+end;
+OnTouch:
+set @marena,1;
+warp "gon_test.gat",57,99;
+}
+gon_test.gat,43,87,5 duplicate(SummonPad) Summon Pad 2 111,2,2
+gon_test.gat,72,87,5 duplicate(SummonPad) Summon Pad 3 111,2,2
+
+
+
+// Skill Disabler //
+gon_test.gat,57,99,5 script Skill Disable 111,3,3,{
+atcommand strcharinfo(0) + "@skilloff";
+disablenpc "Skill Disable";
+end;
+}
+
+// Duel Arena //
+gon_test.gat,58,103,5 script Duel Master#01 92,{
+if ($@duelist1$ == "") set @duel,0;
+if ($@monster1 == "") set @duel,0;
+set @marena,1;
+if (#monster == 0) goto L_NoMon;
+mes "[Duel Master]";
+if ($@duel == 1) goto L_Waiting;
+if ($@duel == 2) goto L_Dueling;
+
+mes "There are currently no players dueling.";
+next;
+menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
+
+// Player 1 Enters Duel Area //
+if (#heal == 1) goto L_NeedHeal;
+if ($@duel == 1) goto L_Duel2;
+set $@duel,1;
+if (#monster > 1 && #monster < 20) set $@monster1,1;
+if (#monster > 19 && #monster < 30) set $@monster1,2;
+if (#monster > 29 && #monster < 40) set $@monster1,3;
+if (#monster > 39 && #monster < 50) set $@monster1,4;
+if (#monster > 49 && #monster < 60) set $@monster1,5;
+if (#monster > 59 && #monster < 70) set $@monster1,6;
+if (#monster > 69 && #monster < 80) set $@monster1,7;
+if (#monster > 79 && #monster < 90) set $@monster1,8;
+if (#monster > 89 && #monster < 100) set $@monster1,9;
+if (#monster > 99 && #monster < 110) set $@monster1,10;
+set $@duelist1$,strcharinfo(0);
+set @battle,1;
+announce strcharinfo(0) + " [Monster Level: " + $@monster1 + "] is waiting for a duel",1;
+atcommand strcharinfo(0) + "@option 64 0 64";
+warp "gon_test.gat",49,5;
+close;
+
+L_Waiting:
+mes "^0000FF " + $@duelist1$ + "^000000 [Monster Level: ^FF0000" + $@monster1 + "^000000]";
+mes "Is waiting for an opponent";
+next;
+menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit;
+
+// Player 2 Enters Duel Area //
+if (#heal == 1) goto L_NeedHeal;
+L_Duel2:
+if ($@duel == 2) goto L_Spec;
+set $@duel,2;
+if (#monster > 1 && #monster < 20) set $@monster2,1;
+if (#monster > 19 && #monster < 30) set $@monster2,2;
+if (#monster > 29 && #monster < 40) set $@monster2,3;
+if (#monster > 39 && #monster < 50) set $@monster2,4;
+if (#monster > 49 && #monster < 60) set $@monster2,5;
+if (#monster > 59 && #monster < 70) set $@monster2,6;
+if (#monster > 69 && #monster < 80) set $@monster2,7;
+if (#monster > 79 && #monster < 90) set $@monster2,8;
+if (#monster > 89 && #monster < 100) set $@monster2,9;
+if (#monster > 99 && #monster < 110) set $@monster2,10;
+set $@duelist2$,strcharinfo(0);
+set @battle,1;
+announce strcharinfo(0) + " [Monster Level: " + $@monster2 + "] has joined the duel",1;
+atcommand strcharinfo(0) + "@option 64 0 64";
+warp "gon_test.gat",49,5;
+close;
+
+ L_Dueling:
+ mes "^0000FF" + $@duelist1$ + "^000000 [Monster Level: ^0000FF" + $@monster1 + "^000000]";
+ mes " VS.";
+ mes "^FF0000" + $@duelist2$ + "^000000 [Monster Level: ^FF0000" + $@monster2 + "^000000]";
+ next;
+ menu "Spectate",L_Spec,"Cancel",L_Exit;
+
+ L_Spec:
+ set @battle,0;
+ atcommand strcharinfo(0) + "@option 64 0 64";
+ warp "gon_test.gat",49,5;
+ close;
+
+ L_Exit:
+ mes "[Duel Master]";
+ mes "Goodbye.";
+ close;
+
+ L_NoMon:
+ mes "[Duel Master]";
+ mes "You haven't got a monster, you can't participate.";
+ close;
+
+ L_NeedHeal:
+ mes "[Duel Master]";
+ mes "You need to heal before you can join.";
+ close;
+}
+
+// Duel Exit //
+gon_test.gat,42,8,5 script Duel Master#02 92,{
+mes "[Duel Master]";
+mes "Would you like to return?";
+menu "Yes",L_Leave,"No",-;
+mes "Alright";
+close;
+
+ L_Leave:
+ if ($@duelist1$ == strcharinfo(0)) goto L_Leave1;
+ if ($@duelist2$ == strcharinfo(0)) goto L_Leave2;
+
+ L_Leave3:
+ atcommand strcharinfo(0) + "@option 0 0 0";
+ set @battle,0;
+ warp "gon_test.gat",57,99;
+ close;
+
+ L_Leave1:
+ set $@duelist1$,$@duelist2$;
+ set $@monster1,$@monster2;
+ set $@duel,$@duel-1;
+ announce strcharinfo(0) + " stopped dueling",1;
+ goto L_Leave3;
+
+ L_Leave2:
+ set $@duelist2$,"";
+ set $@monster2,0;
+ set $@duel,$@duel-1;
+ announce strcharinfo(0) + " stopped dueling",1;
+ goto L_Leave3;
+}
+
+gon_test.gat,49,5,5 duplicate(SummonPad) Summon Pad 4 111,2,2
gon_test.gat,55,8,6 duplicate(monsterreferee) Referee#02 61 \ No newline at end of file
diff --git a/npc/custom/penal_servitude.txt b/npc/custom/penal_servitude.txt
index 75ae8f726..ec32bb663 100644
--- a/npc/custom/penal_servitude.txt
+++ b/npc/custom/penal_servitude.txt
@@ -1,194 +1,194 @@
-//===== Athena Script =======================================
-//= Penal Servitude Script
-//===== By ================================================
-//= Lupus
-//===== Version ===========================================
-//= 1.2
-//===== Compatible With ===================================
-//= eAthena Final (SVN)
-//===== Description =======================================
-//= A simple Penal Servitude Script.
-//= It could cheer up your prisoners a bit.
-//===== Comments ==========================================
-// This script uses CHEQUES of the 2nd KAFRA_BANK.TXT
-// var PRISON - it counts number of your imprisonments.
-// 1.1 English translation
-// 1.2 Stricted the conditions a bit
-//=========================================================
-
-sec_pri.gat,36,58,1 script Chief Warder 105,{
- mes "[Saddeus]";
- emotion 1;
- if(sex) {
- mes "Mr. Prisoner #"+BaseLevel+JobLevel+",";
- } else {
- mes "Ms. Prisoner #"+BaseLevel+JobLevel+",";
- }
- mes "what's the noise over there?";
- next;
- menu "Let me free, I'll pay!",-, "Let me to work off my freedom!",M_Q1, "Nothing",M_NO_THANKS;
-
-M_PAY:
- mes "[Saddeus]";
- set @MUSTPAY,(PRISON+1)*1000000;
- if (@MUSTPAY<1000000) set @MUSTPAY,1000000;
- if (@MUSTPAY>100000000) set @MUSTPAY,100000000;
- if (PRISON==1) mes "I can't remember you. Is it your 1st time?";
- if (PRISON>1) mes "You again? Sombody hasn't grown wiser from the very first visit...";
- mes "OK, we could release you for ^FF0000"+@MUSTPAY+"z^000000.";
- next;
- menu "I pay cash!",M_PAYCASH,"Do you accept cheques?",M_PAYBANK,"I've changed my mind.",-;
-
- mes "[Saddeus]";
- mes "You've got some time to think about...";
- close;
-
-M_PAYCASH:
- if (@MUSTPAY>Zeny) goto L_NOCASH;
- set Zeny,Zeny-@MUSTPAY;
- mes "[Saddeus]";
- mes "OK, sing here and there.";
- goto L_RELEASE;
-
-L_NOCASH:
- mes "[Saddeus]";
- mes "What's this? It's not enough!";
- close;
-
-M_PAYBANK:
- if (@MUSTPAY>#kafrabank) goto L_NOBANK;
- set #kafrabank,#kafrabank-@MUSTPAY;
- mes "[Saddeus]";
- mes "OK, sign your cheque. And put down your name in my book.";
- goto L_RELEASE;
-
-L_NOBANK:
- mes "[Saddeus]";
- if (#kafrabank==0) mes "Your case says nothing about your bank accounts.";
- if (#kafrabank!=0) mes "Alas, there's your bank account info... ^FF0000"+#kafrabank+"z^000000... in the case. It's not enough.";
- mes "Stop your silly games now!";
- close;
-
-L_RELEASE:
- set PRISON,PRISON+1;
- next;
- mes "[Saddeus]";
- mes "You are free now!";
- next;
- savepoint "izlude.gat",105,112;
- warp "izlude.gat",105,112;
- close;
-
-M_Q1:
-//EåñE1
- mes "[Saddeus]";
- mes "Our stocks are short of toadstools. Remember your morning's skilly? What about some work at our sponsored mushroom farm?";
- next;
- menu "OK, I'll work off!",-, "I love this prison!",M_NO_THANKS;
-
- mes "[Saddeus]";
- if(checkcart(0) || checkfalcon(0) || checkriding(0)){
- emotion e_hmm;
- mes "I'm sorry, you should release your Cart, PecoPeco or Falcon!";
- close;
- }
- mes "Talk to our overseer, Oliver.";
- next;
-
- nude;
-
- set @rw,rand(1,4);
- if (@rw==2) goto L_W2;
- if (@rw==3) goto L_W3;
- if (@rw==4) goto L_W4;
-
-L_W1:
- savepoint "sec_in02.gat",179,76;
- warp "sec_in02.gat",179,76;
- close;
-
-L_W2:
- savepoint "sec_in02.gat",139,32;
- warp "sec_in02.gat",139,32;
- close;
-
-L_W3:
- savepoint "sec_in02.gat",100,28;
- warp "sec_in02.gat",100,28;
- close;
-
-L_W4:
- savepoint "sec_in02.gat",107,75;
- warp "sec_in02.gat",107,75;
- close;
-
-M_NO_THANKS:
- mes "[Saddeus]";
- if (rand(2)) mes "Is today X-Mas time, huh?";
- mes "Now shut up and back off!";
- if (rand(2)) emotion 23;
- close;
-}
-
-sec_in02.gat,137,57,1 script Overseer 708,{
- mes "[Oliver]";
-
- delitem 4002,countitem(4002);//Items: Fabre_Card,
- delitem 4009,countitem(4009);//Items: Chonchon_Card,
- delitem 4022,countitem(4022);//Items: Spore_Card,
- delitem 4048,countitem(4048);//Items: Poison_Spore_Card,
-
- if (PRISON_Q <= 0 ) goto L_GET_Q;
-
- mes "I want you to gather ^FF0000"+PRISON_Q+" Orange Net Mushroom^000000.";
- if ( countitem(1069)<PRISON_Q ) close;//Items: Orange_Net_Mushroom,
- mes "OK... hand me all the shrooms...";
- mes "Let me see... "+countitem(1069)+" of almost eadible ones...";//Items: Orange_Net_Mushroom,
- mes "And "+countitem(1070)+" useless deadly ones.";//Items: Orange_Gooey_Mushroom_,
- next;
- mes "[Oliver]";
- mes "Thank you. You are free!";
- set PRISON_Q,0;
- delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
- delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
- next;
- savepoint "izlude.gat",105,112;
- warp "izlude.gat",105,112;
- close;
-
-L_GET_Q:
- set PRISON,PRISON+1;
- if (PRISON > 1) mes "Hmm... You've been here already... Well-well...";
-
- if ( countitem(1069) || countitem(1070) ) mes "Drop these mushrooms!! They are poisonous!";//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
- delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
- delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
-
- set PRISON_Q, PRISON*3 + BaseLevel/3;
- set PRISON_Q, PRISON_Q * (readparam(bAspd)/55 + 1);
- set PRISON_Q, PRISON_Q+rand(50,60);
- mes "OK, you must bring me ^FF0000"+PRISON_Q+"^000000 edible ^FF0000Orange Net Mushroom^000000 toadstoo.. shrooms.";
- if(readparam(bAspd)>=100) mes "You're a fast fella! You'll have to get more shrooms, then.";
- if (rand(10)<4) mes "And you may eat the deadly ones for breakfast.";
- close;
-}
-
-
-sec_in02.gat mapflag nomemo
-sec_in02.gat mapflag nosave SavePoint
-sec_in02.gat mapflag noteleport
-sec_in02.gat mapflag nobranch
-sec_in02.gat mapflag nowarp
-sec_in02.gat mapflag nowarpto
-sec_in02.gat mapflag noexp
-sec_in02.gat mapflag noskill
-//sec_in02.gat mapflag pvp
-//sec_in02.gat mapflag pvp_noparty
-//sec_in02.gat mapflag gvg
-sec_in02.gat mapflag pvp_nightmaredrop random,all,300
-
-sec_in02.gat,138,55,100,100 monster Toadstool 1182,30,10000,10000,1
-sec_in02.gat,138,55,100,100 monster Fabre 1184,10,20000,20000
-sec_in02.gat,138,55,100,100 monster Chonchon 1183,11,20000,20000
-sec_in02.gat,138,55,100,100 monster Spore 1014,12,20000,20000
-sec_in02.gat,138,55,100,100 monster Poison Spore 1077,3,20000,20000
+//===== Athena Script =======================================
+//= Penal Servitude Script
+//===== By ================================================
+//= Lupus
+//===== Version ===========================================
+//= 1.2
+//===== Compatible With ===================================
+//= eAthena Final (SVN)
+//===== Description =======================================
+//= A simple Penal Servitude Script.
+//= It could cheer up your prisoners a bit.
+//===== Comments ==========================================
+// This script uses CHEQUES of the 2nd KAFRA_BANK.TXT
+// var PRISON - it counts number of your imprisonments.
+// 1.1 English translation
+// 1.2 Stricted the conditions a bit
+//=========================================================
+
+sec_pri.gat,36,58,1 script Chief Warder 105,{
+ mes "[Saddeus]";
+ emotion 1;
+ if(sex) {
+ mes "Mr. Prisoner #"+BaseLevel+JobLevel+",";
+ } else {
+ mes "Ms. Prisoner #"+BaseLevel+JobLevel+",";
+ }
+ mes "what's the noise over there?";
+ next;
+ menu "Let me free, I'll pay!",-, "Let me to work off my freedom!",M_Q1, "Nothing",M_NO_THANKS;
+
+M_PAY:
+ mes "[Saddeus]";
+ set @MUSTPAY,(PRISON+1)*1000000;
+ if (@MUSTPAY<1000000) set @MUSTPAY,1000000;
+ if (@MUSTPAY>100000000) set @MUSTPAY,100000000;
+ if (PRISON==1) mes "I can't remember you. Is it your 1st time?";
+ if (PRISON>1) mes "You again? Sombody hasn't grown wiser from the very first visit...";
+ mes "OK, we could release you for ^FF0000"+@MUSTPAY+"z^000000.";
+ next;
+ menu "I pay cash!",M_PAYCASH,"Do you accept cheques?",M_PAYBANK,"I've changed my mind.",-;
+
+ mes "[Saddeus]";
+ mes "You've got some time to think about...";
+ close;
+
+M_PAYCASH:
+ if (@MUSTPAY>Zeny) goto L_NOCASH;
+ set Zeny,Zeny-@MUSTPAY;
+ mes "[Saddeus]";
+ mes "OK, sing here and there.";
+ goto L_RELEASE;
+
+L_NOCASH:
+ mes "[Saddeus]";
+ mes "What's this? It's not enough!";
+ close;
+
+M_PAYBANK:
+ if (@MUSTPAY>#kafrabank) goto L_NOBANK;
+ set #kafrabank,#kafrabank-@MUSTPAY;
+ mes "[Saddeus]";
+ mes "OK, sign your cheque. And put down your name in my book.";
+ goto L_RELEASE;
+
+L_NOBANK:
+ mes "[Saddeus]";
+ if (#kafrabank==0) mes "Your case says nothing about your bank accounts.";
+ if (#kafrabank!=0) mes "Alas, there's your bank account info... ^FF0000"+#kafrabank+"z^000000... in the case. It's not enough.";
+ mes "Stop your silly games now!";
+ close;
+
+L_RELEASE:
+ set PRISON,PRISON+1;
+ next;
+ mes "[Saddeus]";
+ mes "You are free now!";
+ next;
+ savepoint "izlude.gat",105,112;
+ warp "izlude.gat",105,112;
+ close;
+
+M_Q1:
+//EåñE1
+ mes "[Saddeus]";
+ mes "Our stocks are short of toadstools. Remember your morning's skilly? What about some work at our sponsored mushroom farm?";
+ next;
+ menu "OK, I'll work off!",-, "I love this prison!",M_NO_THANKS;
+
+ mes "[Saddeus]";
+ if(checkcart(0) || checkfalcon(0) || checkriding(0)){
+ emotion e_hmm;
+ mes "I'm sorry, you should release your Cart, PecoPeco or Falcon!";
+ close;
+ }
+ mes "Talk to our overseer, Oliver.";
+ next;
+
+ nude;
+
+ set @rw,rand(1,4);
+ if (@rw==2) goto L_W2;
+ if (@rw==3) goto L_W3;
+ if (@rw==4) goto L_W4;
+
+L_W1:
+ savepoint "sec_in02.gat",179,76;
+ warp "sec_in02.gat",179,76;
+ close;
+
+L_W2:
+ savepoint "sec_in02.gat",139,32;
+ warp "sec_in02.gat",139,32;
+ close;
+
+L_W3:
+ savepoint "sec_in02.gat",100,28;
+ warp "sec_in02.gat",100,28;
+ close;
+
+L_W4:
+ savepoint "sec_in02.gat",107,75;
+ warp "sec_in02.gat",107,75;
+ close;
+
+M_NO_THANKS:
+ mes "[Saddeus]";
+ if (rand(2)) mes "Is today X-Mas time, huh?";
+ mes "Now shut up and back off!";
+ if (rand(2)) emotion 23;
+ close;
+}
+
+sec_in02.gat,137,57,1 script Overseer 708,{
+ mes "[Oliver]";
+
+ delitem 4002,countitem(4002);//Items: Fabre_Card,
+ delitem 4009,countitem(4009);//Items: Chonchon_Card,
+ delitem 4022,countitem(4022);//Items: Spore_Card,
+ delitem 4048,countitem(4048);//Items: Poison_Spore_Card,
+
+ if (PRISON_Q <= 0 ) goto L_GET_Q;
+
+ mes "I want you to gather ^FF0000"+PRISON_Q+" Orange Net Mushroom^000000.";
+ if ( countitem(1069)<PRISON_Q ) close;//Items: Orange_Net_Mushroom,
+ mes "OK... hand me all the shrooms...";
+ mes "Let me see... "+countitem(1069)+" of almost eadible ones...";//Items: Orange_Net_Mushroom,
+ mes "And "+countitem(1070)+" useless deadly ones.";//Items: Orange_Gooey_Mushroom_,
+ next;
+ mes "[Oliver]";
+ mes "Thank you. You are free!";
+ set PRISON_Q,0;
+ delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ next;
+ savepoint "izlude.gat",105,112;
+ warp "izlude.gat",105,112;
+ close;
+
+L_GET_Q:
+ set PRISON,PRISON+1;
+ if (PRISON > 1) mes "Hmm... You've been here already... Well-well...";
+
+ if ( countitem(1069) || countitem(1070) ) mes "Drop these mushrooms!! They are poisonous!";//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+ delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_,
+
+ set PRISON_Q, PRISON*3 + BaseLevel/3;
+ set PRISON_Q, PRISON_Q * (readparam(bAspd)/55 + 1);
+ set PRISON_Q, PRISON_Q+rand(50,60);
+ mes "OK, you must bring me ^FF0000"+PRISON_Q+"^000000 edible ^FF0000Orange Net Mushroom^000000 toadstoo.. shrooms.";
+ if(readparam(bAspd)>=100) mes "You're a fast fella! You'll have to get more shrooms, then.";
+ if (rand(10)<4) mes "And you may eat the deadly ones for breakfast.";
+ close;
+}
+
+
+sec_in02.gat mapflag nomemo
+sec_in02.gat mapflag nosave SavePoint
+sec_in02.gat mapflag noteleport
+sec_in02.gat mapflag nobranch
+sec_in02.gat mapflag nowarp
+sec_in02.gat mapflag nowarpto
+sec_in02.gat mapflag noexp
+sec_in02.gat mapflag noskill
+//sec_in02.gat mapflag pvp
+//sec_in02.gat mapflag pvp_noparty
+//sec_in02.gat mapflag gvg
+sec_in02.gat mapflag pvp_nightmaredrop random,all,300
+
+sec_in02.gat,138,55,100,100 monster Toadstool 1182,30,10000,10000,1
+sec_in02.gat,138,55,100,100 monster Fabre 1184,10,20000,20000
+sec_in02.gat,138,55,100,100 monster Chonchon 1183,11,20000,20000
+sec_in02.gat,138,55,100,100 monster Spore 1014,12,20000,20000
+sec_in02.gat,138,55,100,100 monster Poison Spore 1077,3,20000,20000
diff --git a/npc/custom/platinum_skills.txt b/npc/custom/platinum_skills.txt
index 3be00a151..a6768afd0 100644
--- a/npc/custom/platinum_skills.txt
+++ b/npc/custom/platinum_skills.txt
@@ -1,112 +1,112 @@
-//===== eAthena Script ======================================================================
-//= Platinum Skills NPC
-//===== By: =================================================================================
-//= Keichii and edited by DarkChild
-//===== Current Version: ====================================================================
-//= 2.2
-//===== Compatible With: ====================================================================
-//= Any eAthena Version
-//===== Description: ========================================================================
-//= Single NPC that assigns quests skills for all classes.
-//===== Additional Comments: ================================================================
-//= Added advanced classes by ShadowLady.
-//= Added baby clases by Midas
-//= Simplified Job Checks [Silentdragon]
-//===========================================================================================
-prontera.gat,128,200,6 script Platinum Skill NPC 94,{
-mes "[Platinum Skill NPC]";
-mes "I can give you the special skills available to your job. Would you like these skills now?";
-next;
-menu "Yes",Lgetskills,"No",Lnogetskills;
-
-Lgetskills:
-if (BaseClass==Job_Novice) goto Lskillsnovice;
-if (BaseClass==Job_Swordman) goto Lskillsswordie;
-if (BaseClass==Job_Mage) goto Lskillsmage;
-if (BaseClass==Job_Archer) goto Lskillsarcher;
-if (BaseClass==Job_Acolyte) goto Lskillsaco;
-if (BaseClass==Job_Merchant) goto Lskillsmerchie;
-if (BaseClass==Job_Thief) goto Lskillsthief;
-Lskillsnovice:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Novice Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-if(BaseJob==0) skill 143,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsswordie:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Swordman Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 144,1,0;
-skill 145,1,0;
-skill 146,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsmage:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Mage Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 157,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsarcher:
-mes "[Platinum Skill NPC]";
-mes "I see that you are an Archer Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 147,1,0;
-skill 148,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsaco:
-mes "[Platinum Skill NPC]";
-mes "I see that you are an Acolyte Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 156,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsmerchie:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Merchant Class.I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 153,1,0;
-skill 154,1,0;
-skill 155,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-Lskillsthief:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Thief Class. I will now add the special skills available to these jobs.";
-skill 142,1,0;
-skill 149,1,0;
-skill 150,1,0;
-skill 151,1,0;
-skill 152,1,0;
-mes " ";
-mes "You now have all the special skills available to the these jobs.";
-next;
-goto LskillsEND;
-LskillsEND:
-mes "[Platinum Skill NPC]";
-mes "Have a nice day.";
-close;
-Lnogetskills:
-mes "[Platinum Skill NPC]";
-mes "Aww, how come you dont want my special skills?";
-mes "*sob* FINE!";
-mes "Have a nice day... >.>";
-close;
-}
-
+//===== eAthena Script ======================================================================
+//= Platinum Skills NPC
+//===== By: =================================================================================
+//= Keichii and edited by DarkChild
+//===== Current Version: ====================================================================
+//= 2.2
+//===== Compatible With: ====================================================================
+//= Any eAthena Version
+//===== Description: ========================================================================
+//= Single NPC that assigns quests skills for all classes.
+//===== Additional Comments: ================================================================
+//= Added advanced classes by ShadowLady.
+//= Added baby clases by Midas
+//= Simplified Job Checks [Silentdragon]
+//===========================================================================================
+prontera.gat,128,200,6 script Platinum Skill NPC 94,{
+mes "[Platinum Skill NPC]";
+mes "I can give you the special skills available to your job. Would you like these skills now?";
+next;
+menu "Yes",Lgetskills,"No",Lnogetskills;
+
+Lgetskills:
+if (BaseClass==Job_Novice) goto Lskillsnovice;
+if (BaseClass==Job_Swordman) goto Lskillsswordie;
+if (BaseClass==Job_Mage) goto Lskillsmage;
+if (BaseClass==Job_Archer) goto Lskillsarcher;
+if (BaseClass==Job_Acolyte) goto Lskillsaco;
+if (BaseClass==Job_Merchant) goto Lskillsmerchie;
+if (BaseClass==Job_Thief) goto Lskillsthief;
+Lskillsnovice:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Novice Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+if(BaseJob==0) skill 143,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsswordie:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Swordman Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 144,1,0;
+skill 145,1,0;
+skill 146,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsmage:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Mage Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 157,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsarcher:
+mes "[Platinum Skill NPC]";
+mes "I see that you are an Archer Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 147,1,0;
+skill 148,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsaco:
+mes "[Platinum Skill NPC]";
+mes "I see that you are an Acolyte Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 156,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsmerchie:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Merchant Class.I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 153,1,0;
+skill 154,1,0;
+skill 155,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+Lskillsthief:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Thief Class. I will now add the special skills available to these jobs.";
+skill 142,1,0;
+skill 149,1,0;
+skill 150,1,0;
+skill 151,1,0;
+skill 152,1,0;
+mes " ";
+mes "You now have all the special skills available to the these jobs.";
+next;
+goto LskillsEND;
+LskillsEND:
+mes "[Platinum Skill NPC]";
+mes "Have a nice day.";
+close;
+Lnogetskills:
+mes "[Platinum Skill NPC]";
+mes "Aww, how come you dont want my special skills?";
+mes "*sob* FINE!";
+mes "Have a nice day... >.>";
+close;
+}
+
diff --git a/npc/custom/poetry/ayothaya.txt b/npc/custom/poetry/ayothaya.txt
index e4b842df4..7d5b651a1 100644
--- a/npc/custom/poetry/ayothaya.txt
+++ b/npc/custom/poetry/ayothaya.txt
@@ -1,724 +1,724 @@
-//===== eAthena Script =======================================
-//= Wandering poet NPC
-//===== By: ==================================================
-//= by MouseJstr
-//===== Current Version: =====================================
-//= 0.2a
-//===== Compatible With: =====================================
-//= eAthena 1.0 Final +
-//===== Description: =========================================
-
-ayothaya.gat,58,134,5 script Louise Gluck 763,{
- mes "[Louise Gluck]";
- mes "What is the next line? ";
- close;
-
- OnTimer5000:
- npcwalkto 65,129;
- npctalk "Twas brillig, and the slithy toves Did gyre and gimble in the wabe:";
- end;
-
- OnTimer10000:
- npcwalkto 71,131;
- npctalk "All mimsy were the bogoroves, And the mome raths outgrabe.";
- end;
-
- OnTimer15000:
- npcwalkto 75,127;
- npctalk "Beware the Jabberwock, my son! The jaws that bite, theh claws that catch!";
- end;
-
- OnTimer20000:
- npcwalkto 80,122;
- npctalk "Beware the Jubjub bird and shun The frumious Bandersnatch!";
- end;
-
- OnTimer25000:
- npcwalkto 82,118;
- npctalk "He took his vorpal sword in hand: Long time the manxome foe he sought-";
- end;
-
- OnTimer30000:
- npcwalkto 93,115;
- npctalk "So rested he by the Tumtum tree, And stood a while in thought.";
- end;
-
- OnTimer35000:
- npcwalkto 94,112;
- npctalk "And, as in uffish thought he stood, The Jabberwock, with eyes of flame,";
- end;
-
- OnTimer40000:
- npcwalkto 88,124;
- npctalk "Came whiffling through the tulgey wood, And burbled as it came!";
- end;
-
- OnTimer45000:
- npcwalkto 81,129;
- npctalk "One, two! One, two! And through and through The vorpal blade went snicker-snack!";
- end;
-
- OnTimer50000:
- npcwalkto 76,139;
- npctalk "He left it dead, and with its head He went galumphing back.";
- end;
-
- OnTimer55000:
- npcwalkto 67,138;
- npctalk "And hast though slain the Jabberwock? Come to my arms beamish boy!";
- end;
-
- OnTimer60000:
- npcwalkto 59,144;
- npctalk "O frabjous day! Callooh! Callay! He chortled in his joy.";
- end;
-
- OnTimer65000:
- npcwalkto 55,124;
- npctalk "Twas brillig, and the slithy toves Did gyre and gimble in the wabe:";
- end;
-
- OnTimer70000:
- npcwalkto 58,134;
- npctalk "All mimsy were the bogoroves, And the mome raths outgrabe.";
- setnpctimer 0;
- end;
-
- OnInit:
- npcspeed 150;
- initnpctimer;
- end;
-}
-
-
-ayothaya.gat,212,276,0 script Romeo 50,{
- mes "[Romeo]";
- mes "What is the next line? ";
- close;
- OnTimer0:
- npctalk "He jests at scars that never felt a wound.";
- end;
- OnTimer6000:
- npctalk "But, soft! what light through yonder window breaks?";
- end;
- OnTimer8000:
- npctalk "It is the east, and Juliet is the sun.";
- end;
- OnTimer10000:
- npctalk "Arise, fair sun, and kill the envious moon,";
- end;
- OnTimer12000:
- npctalk "Who is already sick and pale with grief,";
- end;
- OnTimer14000:
- npctalk "That thou her maid art far more fair than she:";
- end;
- OnTimer16000:
- npctalk "Be not her maid, since she is envious;";
- end;
- OnTimer18000:
- npctalk "Her vestal livery is but sick and green";
- end;
- OnTimer20000:
- npctalk "And none but fools do wear it; cast it off.";
- end;
- OnTimer22000:
- npctalk "It is my lady, O, it is my love!";
- end;
- OnTimer24000:
- npctalk "O, that she knew she were!";
- end;
- OnTimer26000:
- npctalk "She speaks yet she says nothing: what of that?";
- end;
- OnTimer28000:
- npctalk "Her eye discourses; I will answer it.";
- end;
- OnTimer30000:
- npctalk "I am too bold, tis not to me she speaks:";
- end;
- OnTimer32000:
- npctalk "Two of the fairest stars in all the heaven,";
- end;
- OnTimer34000:
- npctalk "Having some business, do entreat her eyes";
- end;
- OnTimer36000:
- npctalk "To twinkle in their spheres till they return.";
- end;
- OnTimer38000:
- npctalk "What if her eyes were there, they in her head?";
- end;
- OnTimer40000:
- npctalk "The brightness of her cheek would shame those stars,";
- end;
- OnTimer42000:
- npctalk "As daylight doth a lamp; her eyes in heaven";
- end;
- OnTimer44000:
- npctalk "Would through the airy region stream so bright";
- end;
- OnTimer46000:
- npctalk "That birds would sing and think it were not night.";
- end;
- OnTimer48000:
- npctalk "See, how she leans her cheek upon her hand!";
- end;
- OnTimer50000:
- npctalk "O, that I were a glove upon that hand,";
- end;
- OnTimer52000:
- npctalk "That I might touch that cheek!";
- end;
- OnTimer56000:
- npctalk "She speaks:";
- end;
- OnTimer58000:
- npctalk "O, speak again, bright angel! for thou art";
- end;
- OnTimer60000:
- npctalk "As glorious to this night, being oer my head";
- end;
- OnTimer62000:
- npctalk "As is a winged messenger of heaven";
- end;
- OnTimer64000:
- npctalk "Unto the white-upturned wondering eyes";
- end;
- OnTimer66000:
- npctalk "Of mortals that fall back to gaze on him";
- end;
- OnTimer68000:
- npctalk "When he bestrides the lazy-pacing clouds";
- end;
- OnTimer70000:
- npctalk "And sails upon the bosom of the air.";
- end;
- OnTimer80000:
- npctalk "Shall I hear more, or shall I speak at this?";
- end;
- OnTimer106000:
- npctalk "I take thee at thy word:";
- end;
- OnTimer108000:
- npctalk "Call me but love, and Ill be new baptized;";
- end;
- OnTimer110000:
- npctalk "Henceforth I never will be Romeo.";
- end;
- OnTimer116000:
- npctalk "By a name";
- end;
- OnTimer118000:
- npctalk "I know not how to tell thee who I am:";
- end;
- OnTimer120000:
- npctalk "My name, dear saint, is hateful to myself,";
- end;
- OnTimer122000:
- npctalk "Because it is an enemy to thee;";
- end;
- OnTimer124000:
- npctalk "Had I it written, I would tear the word.";
- end;
- OnTimer132000:
- npctalk "Neither, fair saint, if either thee dislike.";
- end;
- OnTimer142000:
- npctalk "With loves light wings did I oer-perch these walls;";
- end;
- OnTimer144000:
- npctalk "For stony limits cannot hold love out,";
- end;
- OnTimer146000:
- npctalk "And what love can do that dares love attempt;";
- end;
- OnTimer148000:
- npctalk "Therefore thy kinsmen are no let to me.";
- end;
- OnTimer152000:
- npctalk "Alack, there lies more peril in thine eye";
- end;
- OnTimer154000:
- npctalk "Than twenty of their swords: look thou but sweet,";
- end;
- OnTimer156000:
- npctalk "And I am proof against their enmity.";
- end;
- OnTimer160000:
- npctalk "I have nights cloak to hide me from their sight;";
- end;
- OnTimer162000:
- npctalk "And but thou love me, let them find me here:";
- end;
- OnTimer164000:
- npctalk "My life were better ended by their hate,";
- end;
- OnTimer166000:
- npctalk "Than death prorogued, wanting of thy love.";
- end;
- OnTimer170000:
- npctalk "By love, who first did prompt me to inquire;";
- end;
- OnTimer172000:
- npctalk "He lent me counsel and I lent him eyes.";
- end;
- OnTimer174000:
- npctalk "I am no pilot; yet, wert thou as far";
- end;
- OnTimer176000:
- npctalk "As that vast shore washd with the farthest sea,";
- end;
- OnTimer178000:
- npctalk "I would adventure for such merchandise.";
- end;
- OnTimer224000:
- npctalk "Lady, by yonder blessed moon I swear";
- end;
- OnTimer226000:
- npctalk "That tips with silver all these fruit-tree tops--";
- end;
- OnTimer234000:
- npctalk "What shall I swear by?";
- end;
- OnTimer244000:
- npctalk "If my hearts dear love--";
- end;
- OnTimer264000:
- npctalk "O, wilt thou leave me so unsatisfied?";
- end;
- OnTimer268000:
- npctalk "The exchange of thy loves faithful vow for mine.";
- end;
- OnTimer274000:
- npctalk "Wouldst thou withdraw it? for what purpose, love?";
- end;
- OnTimer294000:
- npctalk "O blessed, blessed night! I am afeard.";
- end;
- OnTimer296000:
- npctalk "Being in night, all this is but a dream,";
- end;
- OnTimer298000:
- npctalk "Too flattering-sweet to be substantial.";
- end;
- OnTimer330000:
- npctalk "So thrive my soul--";
- end;
- OnTimer334000:
- npctalk "A thousand times the worse, to want thy light.";
- end;
- OnTimer336000:
- npctalk "Love goes toward love, as schoolboys from";
- end;
- OnTimer338000:
- npctalk "their books,";
- end;
- OnTimer340000:
- npctalk "But love from love, toward school with heavy looks.";
- end;
- OnTimer356000:
- npctalk "It is my soul that calls upon my name:";
- end;
- OnTimer358000:
- npctalk "How silver-sweet sound lovers tongues by night,";
- end;
- OnTimer360000:
- npctalk "Like softest music to attending ears!";
- end;
- OnTimer364000:
- npctalk "My dear?";
- end;
- OnTimer370000:
- npctalk "At the hour of nine.";
- end;
- OnTimer376000:
- npctalk "Let me stand here till thou remember it.";
- end;
- OnTimer382000:
- npctalk "And Ill still stay, to have thee still forget,";
- end;
- OnTimer384000:
- npctalk "Forgetting any other home but this.";
- end;
- OnTimer398000:
- npctalk "I would I were thy bird.";
- end;
- OnTimer410000:
- npctalk "Sleep dwell upon thine eyes, peace in thy breast!";
- end;
- OnTimer412000:
- npctalk "Would I were sleep and peace, so sweet to rest!";
- end;
- OnTimer414000:
- npctalk "Hence will I to my ghostly fathers cell,";
- end;
- OnTimer416000:
- npctalk "His help to crave, and my dear hap to tell.";
- end;
- OnTimer538000:
- setnpctimer 0;
- end;
- OnInit:
- npcspeed 150;
- initnpctimer;
- end;
-}
-
-ayothaya.gat,214,279,3 script Juliet 53,{
- mes "[Juliet]";
- mes "What is the next line? ";
- close;
- OnTimer54000:
- npctalk "Ay me!";
- end;
- OnTimer72000:
- npctalk "O Romeo, Romeo! wherefore art thou Romeo?";
- end;
- OnTimer74000:
- npctalk "Deny thy father and refuse thy name;";
- end;
- OnTimer76000:
- npctalk "Or, if thou wilt not, be but sworn my love,";
- end;
- OnTimer78000:
- npctalk "And Ill no longer be a Capulet.";
- end;
- OnTimer82000:
- npctalk "Tis but thy name that is my enemy;";
- end;
- OnTimer84000:
- npctalk "Thou art thyself, though not a Montague.";
- end;
- OnTimer86000:
- npctalk "Whats Montague? it is nor hand, nor foot,";
- end;
- OnTimer88000:
- npctalk "Nor arm, nor face, nor any other part";
- end;
- OnTimer90000:
- npctalk "Belonging to a man. O, be some other name!";
- end;
- OnTimer92000:
- npctalk "Whats in a name? that which we call a rose";
- end;
- OnTimer94000:
- npctalk "By any other name would smell as sweet;";
- end;
- OnTimer96000:
- npctalk "So Romeo would, were he not Romeo calld,";
- end;
- OnTimer98000:
- npctalk "Retain that dear perfection which he owes";
- end;
- OnTimer100000:
- npctalk "Without that title. Romeo, doff thy name,";
- end;
- OnTimer102000:
- npctalk "And for that name which is no part of thee";
- end;
- OnTimer104000:
- npctalk "Take all myself.";
- end;
- OnTimer112000:
- npctalk "What man art thou that thus bescreend in night";
- end;
- OnTimer114000:
- npctalk "So stumblest on my counsel?";
- end;
- OnTimer126000:
- npctalk "My ears have not yet drunk a hundred words";
- end;
- OnTimer128000:
- npctalk "Of that tongues utterance, yet I know the sound:";
- end;
- OnTimer130000:
- npctalk "Art thou not Romeo and a Montague?";
- end;
- OnTimer134000:
- npctalk "How camest thou hither, tell me, and wherefore?";
- end;
- OnTimer136000:
- npctalk "The orchard walls are high and hard to climb,";
- end;
- OnTimer138000:
- npctalk "And the place death, considering who thou art,";
- end;
- OnTimer140000:
- npctalk "If any of my kinsmen find thee here.";
- end;
- OnTimer150000:
- npctalk "If they do see thee, they will murder thee.";
- end;
- OnTimer158000:
- npctalk "I would not for the world they saw thee here.";
- end;
- OnTimer168000:
- npctalk "By whose direction foundst thou out this place?";
- end;
- OnTimer180000:
- npctalk "Thou knowst the mask of night is on my face,";
- end;
- OnTimer182000:
- npctalk "Else would a maiden blush bepaint my cheek";
- end;
- OnTimer184000:
- npctalk "For that which thou hast heard me speak to-night";
- end;
- OnTimer186000:
- npctalk "Fain would I dwell on form, fain, fain deny";
- end;
- OnTimer188000:
- npctalk "What I have spoke: but farewell compliment!";
- end;
- OnTimer190000:
- npctalk "Dost thou love me? I know thou wilt say Ay,";
- end;
- OnTimer192000:
- npctalk "And I will take thy word: yet if thou swearst,";
- end;
- OnTimer194000:
- npctalk "Thou mayst prove false; at lovers perjuries";
- end;
- OnTimer196000:
- npctalk "Then say, Jove laughs. O gentle Romeo,";
- end;
- OnTimer198000:
- npctalk "If thou dost love, pronounce it faithfully:";
- end;
- OnTimer200000:
- npctalk "Or if thou thinkst I am too quickly won,";
- end;
- OnTimer202000:
- npctalk "Ill frown and be perverse an say thee nay,";
- end;
- OnTimer204000:
- npctalk "So thou wilt woo; but else, not for the world.";
- end;
- OnTimer206000:
- npctalk "In truth, fair Montague, I am too fond,";
- end;
- OnTimer208000:
- npctalk "And therefore thou mayst think my havior light:";
- end;
- OnTimer210000:
- npctalk "But trust me, gentleman, Ill prove more true";
- end;
- OnTimer212000:
- npctalk "Than those that have more cunning to be strange.";
- end;
- OnTimer214000:
- npctalk "I should have been more strange, I must confess,";
- end;
- OnTimer216000:
- npctalk "But that thou overheardst, ere I was ware,";
- end;
- OnTimer218000:
- npctalk "My true loves passion: therefore pardon me,";
- end;
- OnTimer220000:
- npctalk "And not impute this yielding to light love,";
- end;
- OnTimer222000:
- npctalk "Which the dark night hath so discovered.";
- end;
- OnTimer228000:
- npctalk "O, swear not by the moon, the inconstant moon,";
- end;
- OnTimer230000:
- npctalk "That monthly changes in her circled orb,";
- end;
- OnTimer232000:
- npctalk "Lest that thy love prove likewise variable.";
- end;
- OnTimer236000:
- npctalk "Do not swear at all;";
- end;
- OnTimer238000:
- npctalk "Or, if thou wilt, swear by thy gracious self,";
- end;
- OnTimer240000:
- npctalk "Which is the god of my idolatry,";
- end;
- OnTimer242000:
- npctalk "And Ill believe thee.";
- end;
- OnTimer246000:
- npctalk "Well, do not swear: although I joy in thee,";
- end;
- OnTimer248000:
- npctalk "I have no joy of this contract to-night:";
- end;
- OnTimer250000:
- npctalk "It is too rash, too unadvised, too sudden;";
- end;
- OnTimer252000:
- npctalk "Too like the lightning, which doth cease to be";
- end;
- OnTimer254000:
- npctalk "Ere one can say It lightens. Sweet, good night!";
- end;
- OnTimer256000:
- npctalk "This bud of love, by summers ripening breath,";
- end;
- OnTimer258000:
- npctalk "May prove a beauteous flower when next we meet.";
- end;
- OnTimer260000:
- npctalk "Good night, good night! as sweet repose and rest";
- end;
- OnTimer262000:
- npctalk "Come to thy heart as that within my breast!";
- end;
- OnTimer266000:
- npctalk "What satisfaction canst thou have to-night?";
- end;
- OnTimer270000:
- npctalk "I gave thee mine before thou didst request it:";
- end;
- OnTimer272000:
- npctalk "And yet I would it were to give again.";
- end;
- OnTimer276000:
- npctalk "But to be frank, and give it thee again.";
- end;
- OnTimer278000:
- npctalk "And yet I wish but for the thing I have:";
- end;
- OnTimer280000:
- npctalk "My bounty is as boundless as the sea,";
- end;
- OnTimer282000:
- npctalk "My love as deep; the more I give to thee,";
- end;
- OnTimer284000:
- npctalk "The more I have, for both are infinite.";
- end;
- OnTimer288000:
- npctalk "I hear some noise within; dear love, adieu!";
- end;
- OnTimer290000:
- npctalk "Anon, good nurse! Sweet Montague, be true.";
- end;
- OnTimer292000:
- npctalk "Stay but a little, I will come again.";
- end;
- OnTimer302000:
- npctalk "Three words, dear Romeo, and good night indeed.";
- end;
- OnTimer304000:
- npctalk "If that thy bent of love be honourable,";
- end;
- OnTimer306000:
- npctalk "Thy purpose marriage, send me word to-morrow,";
- end;
- OnTimer308000:
- npctalk "By one that Ill procure to come to thee,";
- end;
- OnTimer310000:
- npctalk "Where and what time thou wilt perform the rite;";
- end;
- OnTimer312000:
- npctalk "And all my fortunes at thy foot Ill lay";
- end;
- OnTimer314000:
- npctalk "And follow thee my lord throughout the world.";
- end;
- OnTimer318000:
- npctalk "I come, anon.--But if thou meanst not well,";
- end;
- OnTimer320000:
- npctalk "I do beseech thee--";
- end;
- OnTimer324000:
- npctalk "By and by, I come:--";
- end;
- OnTimer326000:
- npctalk "To cease thy suit, and leave me to my grief:";
- end;
- OnTimer328000:
- npctalk "To-morrow will I send.";
- end;
- OnTimer332000:
- npctalk "A thousand times good night!";
- end;
- OnTimer344000:
- npctalk "Hist! Romeo, hist! O, for a falconers voice,";
- end;
- OnTimer346000:
- npctalk "To lure this tassel-gentle back again!";
- end;
- OnTimer348000:
- npctalk "Bondage is hoarse, and may not speak aloud;";
- end;
- OnTimer350000:
- npctalk "Else would I tear the cave where Echo lies,";
- end;
- OnTimer352000:
- npctalk "And make her airy tongue more hoarse than mine,";
- end;
- OnTimer354000:
- npctalk "With repetition of my Romeos name.";
- end;
- OnTimer362000:
- npctalk "Romeo!";
- end;
- OnTimer366000:
- npctalk "At what oclock to-morrow";
- end;
- OnTimer368000:
- npctalk "Shall I send to thee?";
- end;
- OnTimer372000:
- npctalk "I will not fail: tis twenty years till then.";
- end;
- OnTimer374000:
- npctalk "I have forgot why I did call thee back.";
- end;
- OnTimer378000:
- npctalk "I shall forget, to have thee still stand there,";
- end;
- OnTimer380000:
- npctalk "Remembering how I love thy company.";
- end;
- OnTimer386000:
- npctalk "Tis almost morning; I would have thee gone:";
- end;
- OnTimer388000:
- npctalk "And yet no further than a wantons bird;";
- end;
- OnTimer390000:
- npctalk "Who lets it hop a little from her hand,";
- end;
- OnTimer392000:
- npctalk "Like a poor prisoner in his twisted gyves,";
- end;
- OnTimer394000:
- npctalk "And with a silk thread plucks it back again,";
- end;
- OnTimer396000:
- npctalk "So loving-jealous of his liberty.";
- end;
- OnTimer400000:
- npctalk "Sweet, so would I:";
- end;
- OnTimer402000:
- npctalk "Yet I should kill thee with much cherishing.";
- end;
- OnTimer404000:
- npctalk "Good night, good night! parting is such";
- end;
- OnTimer406000:
- npctalk "sweet sorrow,";
- end;
- OnTimer408000:
- npctalk "That I shall say good night till it be morrow.";
- end;
- OnTimer538000:
- setnpctimer 0;
- end;
- OnInit:
- npcspeed 150;
- initnpctimer;
- end;
-}
+//===== eAthena Script =======================================
+//= Wandering poet NPC
+//===== By: ==================================================
+//= by MouseJstr
+//===== Current Version: =====================================
+//= 0.2a
+//===== Compatible With: =====================================
+//= eAthena 1.0 Final +
+//===== Description: =========================================
+
+ayothaya.gat,58,134,5 script Louise Gluck 763,{
+ mes "[Louise Gluck]";
+ mes "What is the next line? ";
+ close;
+
+ OnTimer5000:
+ npcwalkto 65,129;
+ npctalk "Twas brillig, and the slithy toves Did gyre and gimble in the wabe:";
+ end;
+
+ OnTimer10000:
+ npcwalkto 71,131;
+ npctalk "All mimsy were the bogoroves, And the mome raths outgrabe.";
+ end;
+
+ OnTimer15000:
+ npcwalkto 75,127;
+ npctalk "Beware the Jabberwock, my son! The jaws that bite, theh claws that catch!";
+ end;
+
+ OnTimer20000:
+ npcwalkto 80,122;
+ npctalk "Beware the Jubjub bird and shun The frumious Bandersnatch!";
+ end;
+
+ OnTimer25000:
+ npcwalkto 82,118;
+ npctalk "He took his vorpal sword in hand: Long time the manxome foe he sought-";
+ end;
+
+ OnTimer30000:
+ npcwalkto 93,115;
+ npctalk "So rested he by the Tumtum tree, And stood a while in thought.";
+ end;
+
+ OnTimer35000:
+ npcwalkto 94,112;
+ npctalk "And, as in uffish thought he stood, The Jabberwock, with eyes of flame,";
+ end;
+
+ OnTimer40000:
+ npcwalkto 88,124;
+ npctalk "Came whiffling through the tulgey wood, And burbled as it came!";
+ end;
+
+ OnTimer45000:
+ npcwalkto 81,129;
+ npctalk "One, two! One, two! And through and through The vorpal blade went snicker-snack!";
+ end;
+
+ OnTimer50000:
+ npcwalkto 76,139;
+ npctalk "He left it dead, and with its head He went galumphing back.";
+ end;
+
+ OnTimer55000:
+ npcwalkto 67,138;
+ npctalk "And hast though slain the Jabberwock? Come to my arms beamish boy!";
+ end;
+
+ OnTimer60000:
+ npcwalkto 59,144;
+ npctalk "O frabjous day! Callooh! Callay! He chortled in his joy.";
+ end;
+
+ OnTimer65000:
+ npcwalkto 55,124;
+ npctalk "Twas brillig, and the slithy toves Did gyre and gimble in the wabe:";
+ end;
+
+ OnTimer70000:
+ npcwalkto 58,134;
+ npctalk "All mimsy were the bogoroves, And the mome raths outgrabe.";
+ setnpctimer 0;
+ end;
+
+ OnInit:
+ npcspeed 150;
+ initnpctimer;
+ end;
+}
+
+
+ayothaya.gat,212,276,0 script Romeo 50,{
+ mes "[Romeo]";
+ mes "What is the next line? ";
+ close;
+ OnTimer0:
+ npctalk "He jests at scars that never felt a wound.";
+ end;
+ OnTimer6000:
+ npctalk "But, soft! what light through yonder window breaks?";
+ end;
+ OnTimer8000:
+ npctalk "It is the east, and Juliet is the sun.";
+ end;
+ OnTimer10000:
+ npctalk "Arise, fair sun, and kill the envious moon,";
+ end;
+ OnTimer12000:
+ npctalk "Who is already sick and pale with grief,";
+ end;
+ OnTimer14000:
+ npctalk "That thou her maid art far more fair than she:";
+ end;
+ OnTimer16000:
+ npctalk "Be not her maid, since she is envious;";
+ end;
+ OnTimer18000:
+ npctalk "Her vestal livery is but sick and green";
+ end;
+ OnTimer20000:
+ npctalk "And none but fools do wear it; cast it off.";
+ end;
+ OnTimer22000:
+ npctalk "It is my lady, O, it is my love!";
+ end;
+ OnTimer24000:
+ npctalk "O, that she knew she were!";
+ end;
+ OnTimer26000:
+ npctalk "She speaks yet she says nothing: what of that?";
+ end;
+ OnTimer28000:
+ npctalk "Her eye discourses; I will answer it.";
+ end;
+ OnTimer30000:
+ npctalk "I am too bold, tis not to me she speaks:";
+ end;
+ OnTimer32000:
+ npctalk "Two of the fairest stars in all the heaven,";
+ end;
+ OnTimer34000:
+ npctalk "Having some business, do entreat her eyes";
+ end;
+ OnTimer36000:
+ npctalk "To twinkle in their spheres till they return.";
+ end;
+ OnTimer38000:
+ npctalk "What if her eyes were there, they in her head?";
+ end;
+ OnTimer40000:
+ npctalk "The brightness of her cheek would shame those stars,";
+ end;
+ OnTimer42000:
+ npctalk "As daylight doth a lamp; her eyes in heaven";
+ end;
+ OnTimer44000:
+ npctalk "Would through the airy region stream so bright";
+ end;
+ OnTimer46000:
+ npctalk "That birds would sing and think it were not night.";
+ end;
+ OnTimer48000:
+ npctalk "See, how she leans her cheek upon her hand!";
+ end;
+ OnTimer50000:
+ npctalk "O, that I were a glove upon that hand,";
+ end;
+ OnTimer52000:
+ npctalk "That I might touch that cheek!";
+ end;
+ OnTimer56000:
+ npctalk "She speaks:";
+ end;
+ OnTimer58000:
+ npctalk "O, speak again, bright angel! for thou art";
+ end;
+ OnTimer60000:
+ npctalk "As glorious to this night, being oer my head";
+ end;
+ OnTimer62000:
+ npctalk "As is a winged messenger of heaven";
+ end;
+ OnTimer64000:
+ npctalk "Unto the white-upturned wondering eyes";
+ end;
+ OnTimer66000:
+ npctalk "Of mortals that fall back to gaze on him";
+ end;
+ OnTimer68000:
+ npctalk "When he bestrides the lazy-pacing clouds";
+ end;
+ OnTimer70000:
+ npctalk "And sails upon the bosom of the air.";
+ end;
+ OnTimer80000:
+ npctalk "Shall I hear more, or shall I speak at this?";
+ end;
+ OnTimer106000:
+ npctalk "I take thee at thy word:";
+ end;
+ OnTimer108000:
+ npctalk "Call me but love, and Ill be new baptized;";
+ end;
+ OnTimer110000:
+ npctalk "Henceforth I never will be Romeo.";
+ end;
+ OnTimer116000:
+ npctalk "By a name";
+ end;
+ OnTimer118000:
+ npctalk "I know not how to tell thee who I am:";
+ end;
+ OnTimer120000:
+ npctalk "My name, dear saint, is hateful to myself,";
+ end;
+ OnTimer122000:
+ npctalk "Because it is an enemy to thee;";
+ end;
+ OnTimer124000:
+ npctalk "Had I it written, I would tear the word.";
+ end;
+ OnTimer132000:
+ npctalk "Neither, fair saint, if either thee dislike.";
+ end;
+ OnTimer142000:
+ npctalk "With loves light wings did I oer-perch these walls;";
+ end;
+ OnTimer144000:
+ npctalk "For stony limits cannot hold love out,";
+ end;
+ OnTimer146000:
+ npctalk "And what love can do that dares love attempt;";
+ end;
+ OnTimer148000:
+ npctalk "Therefore thy kinsmen are no let to me.";
+ end;
+ OnTimer152000:
+ npctalk "Alack, there lies more peril in thine eye";
+ end;
+ OnTimer154000:
+ npctalk "Than twenty of their swords: look thou but sweet,";
+ end;
+ OnTimer156000:
+ npctalk "And I am proof against their enmity.";
+ end;
+ OnTimer160000:
+ npctalk "I have nights cloak to hide me from their sight;";
+ end;
+ OnTimer162000:
+ npctalk "And but thou love me, let them find me here:";
+ end;
+ OnTimer164000:
+ npctalk "My life were better ended by their hate,";
+ end;
+ OnTimer166000:
+ npctalk "Than death prorogued, wanting of thy love.";
+ end;
+ OnTimer170000:
+ npctalk "By love, who first did prompt me to inquire;";
+ end;
+ OnTimer172000:
+ npctalk "He lent me counsel and I lent him eyes.";
+ end;
+ OnTimer174000:
+ npctalk "I am no pilot; yet, wert thou as far";
+ end;
+ OnTimer176000:
+ npctalk "As that vast shore washd with the farthest sea,";
+ end;
+ OnTimer178000:
+ npctalk "I would adventure for such merchandise.";
+ end;
+ OnTimer224000:
+ npctalk "Lady, by yonder blessed moon I swear";
+ end;
+ OnTimer226000:
+ npctalk "That tips with silver all these fruit-tree tops--";
+ end;
+ OnTimer234000:
+ npctalk "What shall I swear by?";
+ end;
+ OnTimer244000:
+ npctalk "If my hearts dear love--";
+ end;
+ OnTimer264000:
+ npctalk "O, wilt thou leave me so unsatisfied?";
+ end;
+ OnTimer268000:
+ npctalk "The exchange of thy loves faithful vow for mine.";
+ end;
+ OnTimer274000:
+ npctalk "Wouldst thou withdraw it? for what purpose, love?";
+ end;
+ OnTimer294000:
+ npctalk "O blessed, blessed night! I am afeard.";
+ end;
+ OnTimer296000:
+ npctalk "Being in night, all this is but a dream,";
+ end;
+ OnTimer298000:
+ npctalk "Too flattering-sweet to be substantial.";
+ end;
+ OnTimer330000:
+ npctalk "So thrive my soul--";
+ end;
+ OnTimer334000:
+ npctalk "A thousand times the worse, to want thy light.";
+ end;
+ OnTimer336000:
+ npctalk "Love goes toward love, as schoolboys from";
+ end;
+ OnTimer338000:
+ npctalk "their books,";
+ end;
+ OnTimer340000:
+ npctalk "But love from love, toward school with heavy looks.";
+ end;
+ OnTimer356000:
+ npctalk "It is my soul that calls upon my name:";
+ end;
+ OnTimer358000:
+ npctalk "How silver-sweet sound lovers tongues by night,";
+ end;
+ OnTimer360000:
+ npctalk "Like softest music to attending ears!";
+ end;
+ OnTimer364000:
+ npctalk "My dear?";
+ end;
+ OnTimer370000:
+ npctalk "At the hour of nine.";
+ end;
+ OnTimer376000:
+ npctalk "Let me stand here till thou remember it.";
+ end;
+ OnTimer382000:
+ npctalk "And Ill still stay, to have thee still forget,";
+ end;
+ OnTimer384000:
+ npctalk "Forgetting any other home but this.";
+ end;
+ OnTimer398000:
+ npctalk "I would I were thy bird.";
+ end;
+ OnTimer410000:
+ npctalk "Sleep dwell upon thine eyes, peace in thy breast!";
+ end;
+ OnTimer412000:
+ npctalk "Would I were sleep and peace, so sweet to rest!";
+ end;
+ OnTimer414000:
+ npctalk "Hence will I to my ghostly fathers cell,";
+ end;
+ OnTimer416000:
+ npctalk "His help to crave, and my dear hap to tell.";
+ end;
+ OnTimer538000:
+ setnpctimer 0;
+ end;
+ OnInit:
+ npcspeed 150;
+ initnpctimer;
+ end;
+}
+
+ayothaya.gat,214,279,3 script Juliet 53,{
+ mes "[Juliet]";
+ mes "What is the next line? ";
+ close;
+ OnTimer54000:
+ npctalk "Ay me!";
+ end;
+ OnTimer72000:
+ npctalk "O Romeo, Romeo! wherefore art thou Romeo?";
+ end;
+ OnTimer74000:
+ npctalk "Deny thy father and refuse thy name;";
+ end;
+ OnTimer76000:
+ npctalk "Or, if thou wilt not, be but sworn my love,";
+ end;
+ OnTimer78000:
+ npctalk "And Ill no longer be a Capulet.";
+ end;
+ OnTimer82000:
+ npctalk "Tis but thy name that is my enemy;";
+ end;
+ OnTimer84000:
+ npctalk "Thou art thyself, though not a Montague.";
+ end;
+ OnTimer86000:
+ npctalk "Whats Montague? it is nor hand, nor foot,";
+ end;
+ OnTimer88000:
+ npctalk "Nor arm, nor face, nor any other part";
+ end;
+ OnTimer90000:
+ npctalk "Belonging to a man. O, be some other name!";
+ end;
+ OnTimer92000:
+ npctalk "Whats in a name? that which we call a rose";
+ end;
+ OnTimer94000:
+ npctalk "By any other name would smell as sweet;";
+ end;
+ OnTimer96000:
+ npctalk "So Romeo would, were he not Romeo calld,";
+ end;
+ OnTimer98000:
+ npctalk "Retain that dear perfection which he owes";
+ end;
+ OnTimer100000:
+ npctalk "Without that title. Romeo, doff thy name,";
+ end;
+ OnTimer102000:
+ npctalk "And for that name which is no part of thee";
+ end;
+ OnTimer104000:
+ npctalk "Take all myself.";
+ end;
+ OnTimer112000:
+ npctalk "What man art thou that thus bescreend in night";
+ end;
+ OnTimer114000:
+ npctalk "So stumblest on my counsel?";
+ end;
+ OnTimer126000:
+ npctalk "My ears have not yet drunk a hundred words";
+ end;
+ OnTimer128000:
+ npctalk "Of that tongues utterance, yet I know the sound:";
+ end;
+ OnTimer130000:
+ npctalk "Art thou not Romeo and a Montague?";
+ end;
+ OnTimer134000:
+ npctalk "How camest thou hither, tell me, and wherefore?";
+ end;
+ OnTimer136000:
+ npctalk "The orchard walls are high and hard to climb,";
+ end;
+ OnTimer138000:
+ npctalk "And the place death, considering who thou art,";
+ end;
+ OnTimer140000:
+ npctalk "If any of my kinsmen find thee here.";
+ end;
+ OnTimer150000:
+ npctalk "If they do see thee, they will murder thee.";
+ end;
+ OnTimer158000:
+ npctalk "I would not for the world they saw thee here.";
+ end;
+ OnTimer168000:
+ npctalk "By whose direction foundst thou out this place?";
+ end;
+ OnTimer180000:
+ npctalk "Thou knowst the mask of night is on my face,";
+ end;
+ OnTimer182000:
+ npctalk "Else would a maiden blush bepaint my cheek";
+ end;
+ OnTimer184000:
+ npctalk "For that which thou hast heard me speak to-night";
+ end;
+ OnTimer186000:
+ npctalk "Fain would I dwell on form, fain, fain deny";
+ end;
+ OnTimer188000:
+ npctalk "What I have spoke: but farewell compliment!";
+ end;
+ OnTimer190000:
+ npctalk "Dost thou love me? I know thou wilt say Ay,";
+ end;
+ OnTimer192000:
+ npctalk "And I will take thy word: yet if thou swearst,";
+ end;
+ OnTimer194000:
+ npctalk "Thou mayst prove false; at lovers perjuries";
+ end;
+ OnTimer196000:
+ npctalk "Then say, Jove laughs. O gentle Romeo,";
+ end;
+ OnTimer198000:
+ npctalk "If thou dost love, pronounce it faithfully:";
+ end;
+ OnTimer200000:
+ npctalk "Or if thou thinkst I am too quickly won,";
+ end;
+ OnTimer202000:
+ npctalk "Ill frown and be perverse an say thee nay,";
+ end;
+ OnTimer204000:
+ npctalk "So thou wilt woo; but else, not for the world.";
+ end;
+ OnTimer206000:
+ npctalk "In truth, fair Montague, I am too fond,";
+ end;
+ OnTimer208000:
+ npctalk "And therefore thou mayst think my havior light:";
+ end;
+ OnTimer210000:
+ npctalk "But trust me, gentleman, Ill prove more true";
+ end;
+ OnTimer212000:
+ npctalk "Than those that have more cunning to be strange.";
+ end;
+ OnTimer214000:
+ npctalk "I should have been more strange, I must confess,";
+ end;
+ OnTimer216000:
+ npctalk "But that thou overheardst, ere I was ware,";
+ end;
+ OnTimer218000:
+ npctalk "My true loves passion: therefore pardon me,";
+ end;
+ OnTimer220000:
+ npctalk "And not impute this yielding to light love,";
+ end;
+ OnTimer222000:
+ npctalk "Which the dark night hath so discovered.";
+ end;
+ OnTimer228000:
+ npctalk "O, swear not by the moon, the inconstant moon,";
+ end;
+ OnTimer230000:
+ npctalk "That monthly changes in her circled orb,";
+ end;
+ OnTimer232000:
+ npctalk "Lest that thy love prove likewise variable.";
+ end;
+ OnTimer236000:
+ npctalk "Do not swear at all;";
+ end;
+ OnTimer238000:
+ npctalk "Or, if thou wilt, swear by thy gracious self,";
+ end;
+ OnTimer240000:
+ npctalk "Which is the god of my idolatry,";
+ end;
+ OnTimer242000:
+ npctalk "And Ill believe thee.";
+ end;
+ OnTimer246000:
+ npctalk "Well, do not swear: although I joy in thee,";
+ end;
+ OnTimer248000:
+ npctalk "I have no joy of this contract to-night:";
+ end;
+ OnTimer250000:
+ npctalk "It is too rash, too unadvised, too sudden;";
+ end;
+ OnTimer252000:
+ npctalk "Too like the lightning, which doth cease to be";
+ end;
+ OnTimer254000:
+ npctalk "Ere one can say It lightens. Sweet, good night!";
+ end;
+ OnTimer256000:
+ npctalk "This bud of love, by summers ripening breath,";
+ end;
+ OnTimer258000:
+ npctalk "May prove a beauteous flower when next we meet.";
+ end;
+ OnTimer260000:
+ npctalk "Good night, good night! as sweet repose and rest";
+ end;
+ OnTimer262000:
+ npctalk "Come to thy heart as that within my breast!";
+ end;
+ OnTimer266000:
+ npctalk "What satisfaction canst thou have to-night?";
+ end;
+ OnTimer270000:
+ npctalk "I gave thee mine before thou didst request it:";
+ end;
+ OnTimer272000:
+ npctalk "And yet I would it were to give again.";
+ end;
+ OnTimer276000:
+ npctalk "But to be frank, and give it thee again.";
+ end;
+ OnTimer278000:
+ npctalk "And yet I wish but for the thing I have:";
+ end;
+ OnTimer280000:
+ npctalk "My bounty is as boundless as the sea,";
+ end;
+ OnTimer282000:
+ npctalk "My love as deep; the more I give to thee,";
+ end;
+ OnTimer284000:
+ npctalk "The more I have, for both are infinite.";
+ end;
+ OnTimer288000:
+ npctalk "I hear some noise within; dear love, adieu!";
+ end;
+ OnTimer290000:
+ npctalk "Anon, good nurse! Sweet Montague, be true.";
+ end;
+ OnTimer292000:
+ npctalk "Stay but a little, I will come again.";
+ end;
+ OnTimer302000:
+ npctalk "Three words, dear Romeo, and good night indeed.";
+ end;
+ OnTimer304000:
+ npctalk "If that thy bent of love be honourable,";
+ end;
+ OnTimer306000:
+ npctalk "Thy purpose marriage, send me word to-morrow,";
+ end;
+ OnTimer308000:
+ npctalk "By one that Ill procure to come to thee,";
+ end;
+ OnTimer310000:
+ npctalk "Where and what time thou wilt perform the rite;";
+ end;
+ OnTimer312000:
+ npctalk "And all my fortunes at thy foot Ill lay";
+ end;
+ OnTimer314000:
+ npctalk "And follow thee my lord throughout the world.";
+ end;
+ OnTimer318000:
+ npctalk "I come, anon.--But if thou meanst not well,";
+ end;
+ OnTimer320000:
+ npctalk "I do beseech thee--";
+ end;
+ OnTimer324000:
+ npctalk "By and by, I come:--";
+ end;
+ OnTimer326000:
+ npctalk "To cease thy suit, and leave me to my grief:";
+ end;
+ OnTimer328000:
+ npctalk "To-morrow will I send.";
+ end;
+ OnTimer332000:
+ npctalk "A thousand times good night!";
+ end;
+ OnTimer344000:
+ npctalk "Hist! Romeo, hist! O, for a falconers voice,";
+ end;
+ OnTimer346000:
+ npctalk "To lure this tassel-gentle back again!";
+ end;
+ OnTimer348000:
+ npctalk "Bondage is hoarse, and may not speak aloud;";
+ end;
+ OnTimer350000:
+ npctalk "Else would I tear the cave where Echo lies,";
+ end;
+ OnTimer352000:
+ npctalk "And make her airy tongue more hoarse than mine,";
+ end;
+ OnTimer354000:
+ npctalk "With repetition of my Romeos name.";
+ end;
+ OnTimer362000:
+ npctalk "Romeo!";
+ end;
+ OnTimer366000:
+ npctalk "At what oclock to-morrow";
+ end;
+ OnTimer368000:
+ npctalk "Shall I send to thee?";
+ end;
+ OnTimer372000:
+ npctalk "I will not fail: tis twenty years till then.";
+ end;
+ OnTimer374000:
+ npctalk "I have forgot why I did call thee back.";
+ end;
+ OnTimer378000:
+ npctalk "I shall forget, to have thee still stand there,";
+ end;
+ OnTimer380000:
+ npctalk "Remembering how I love thy company.";
+ end;
+ OnTimer386000:
+ npctalk "Tis almost morning; I would have thee gone:";
+ end;
+ OnTimer388000:
+ npctalk "And yet no further than a wantons bird;";
+ end;
+ OnTimer390000:
+ npctalk "Who lets it hop a little from her hand,";
+ end;
+ OnTimer392000:
+ npctalk "Like a poor prisoner in his twisted gyves,";
+ end;
+ OnTimer394000:
+ npctalk "And with a silk thread plucks it back again,";
+ end;
+ OnTimer396000:
+ npctalk "So loving-jealous of his liberty.";
+ end;
+ OnTimer400000:
+ npctalk "Sweet, so would I:";
+ end;
+ OnTimer402000:
+ npctalk "Yet I should kill thee with much cherishing.";
+ end;
+ OnTimer404000:
+ npctalk "Good night, good night! parting is such";
+ end;
+ OnTimer406000:
+ npctalk "sweet sorrow,";
+ end;
+ OnTimer408000:
+ npctalk "That I shall say good night till it be morrow.";
+ end;
+ OnTimer538000:
+ setnpctimer 0;
+ end;
+ OnInit:
+ npcspeed 150;
+ initnpctimer;
+ end;
+}
diff --git a/npc/custom/quests/bandit_beard.txt b/npc/custom/quests/bandit_beard.txt
index 609a7fe14..a1872215f 100644
--- a/npc/custom/quests/bandit_beard.txt
+++ b/npc/custom/quests/bandit_beard.txt
@@ -1,236 +1,236 @@
-//===== eAthena Script =======================================
-//= Bandit Beard Quest
-//===== By: ==================================================
-//= Mega Man Expert & Lupus
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//= A harmless quest for a simply item w/o any bonuses "Bandit Beard"
-//===== Additional Comments: =================================
-//= Fully working.
-//= 1.0 First release
-//= 1.1 Fixed some exploits, bugs and typos. Optimized 8) [Lupus]
-//= 1.1b fixed some typos
-//= 1.2 fixed donpcevent label [Lupus]
-//============================================================
-
-umbala.gat,126,129,4 script Bearded Man 120,{
- if(BEARD_QUEST == 4 ) goto L_MAKE;
- if(BEARD_QUEST >= 5 ) goto L_DONE;
- if(BEARD_QUEST >= 1 ) goto L_THREAD;
-
- mes "[Bearded Man]";
- mes "Beards! Get your wonderful beards!";
- mes "Would you like a beard?";
- next;
- menu "Yes, I'd like some facial hair!",-,"No thanks, thats gross!",M_NO;
-
- mes "[Bearded Man]";
- mes "HoHo~ So you want some whiskers.";
- emotion 18;
- mes "Well I would give you my beards but there not cheap.";
- mes "Matter of fact I have only one left...";
- mes "but I'm not selling it.";
- mes "But don't get mad! I can make you one.";
- next;
- set BEARD_QUEST,1;
-L_THREAD:
- mes "[Bearded Man]";
- mes "I would need some ^8080FFThread^000000 for the Beard.";
- mes "Talk to my friend in Izlude for some ^8080FFThread^000000.";
- next;
-
- mes "[Bearded Man]";
- mes "Also I would need you to get me some things for the beard.";
- mes "They are:";
-L_LIST:
- mes "^8080FFElastic Band^000000";
- mes "^8080FF5 Animal Skins^000000";
- mes "^8080FFBlack Dye Stuff^000000";
- mes "^8080FFGranpa Beard^000000";
- mes "^8080FF100 sticky Mucus^000000";
- mes "^8080FFCounteragent^000000";
- mes " and one ^8080FF2 Carat Diamond^000000";
- close;
-
-M_NO:
- mes "[Bearded Man]";
- mes "Fine, be that way!";
- emotion 7;
- close;
-
-L_DONE:
- mes "[Bearded Man]";
- mes "Sorry, I can only make one per person.";
- mes "We dont want too many beards now. Right?";
- emotion 29;
- close;
-
-L_MAKE:
- mes "[Bearded Man]";
- mes "Let's make you your beard!";
- next;
- if(countitem(7200) < 1 || countitem(919) < 1 || countitem(983) < 1 || countitem(2241) < 1 ||
- countitem(938) < 100 || countitem(973) < 1 || countitem(731) < 1) goto L_NOITEMS;
- delitem 7200, 1;
- delitem 919, 1;
- delitem 983, 1;
- delitem 2241, 1;
- delitem 938, 100;
- delitem 973, 1;
- delitem 731, 1;
- mes "^8080FF~You see him cutting and sewing the beard together~^000000";
- next;
- mes "^8080FF~He hands you the finished beard~^000000";
- next;
- getitem 2237, 1;
- set BEARD_QUEST, 5;
- mes "[Bearded Man]";
- mes "Have a nice day!";
- emotion 29;
- close;
-
-L_NOITEMS:
- mes "[Bearded Man]";
- mes "What the hell! I can't make a beard without the items!";
- mes "Here is the list again:";
- emotion 23;
- goto L_LIST;
-}
-
-//Master Tailor----------
-izlude_in.gat,123,175,4 script Master Tailor 50,{
- mes "[Master Tailor]";
- mes "Good evening! I am the Master Tailor!";
- if(BEARD_QUEST != 1 ) close;
-
- next;
- mes "[Master Tailor]";
- mes "What? A Bearded Man sent you...";
- mes "Well I'm sorry to say that I am out of ^8080FFThread^000000.";
- mes "But I have the address to where I get the shipments.";
- mes "It is in Al de Baran Karfa Inc. warehouse area.";
- mes "The address is: Al de Baran 59, 221";
- mes "See you later.";
- set BEARD_QUEST, 2;
- close;
-}
-// Karfa Thread Clerk---
-aldeba_in.gat,70,179,5 script Karfa Clerk 113,{
- mes "[Karfa Clerk]";
- if(BEARD_QUEST == 3 ) goto L_REPEAT;
- if(BEARD_QUEST > 3 ) goto L_DONE;
-
- mes "What can I do for you?";
- next;
- if(BEARD_QUEST == 2 ) goto L_DELIVERY;
-
- menu "What's in the boxes?",-,"Nothing.",M_NOPE;
-
- mes "[Karfa Clerk]";
- mes "They're empty.";
-M_NOPE:
- close;
-
-L_DELIVERY:
-
- mes "[Karfa Clerk]";
- mes "Sorry but we have not received any ^8080FFThread^000000.";
- mes "Our shipments have been put off until its safe.";
- mes "You see we get our ^8080FFThread^000000 from Alberta and a monsters keeps attacking our merchants.";
- next;
- mes "[Karfa Clerk]";
- mes "Now this monsters has not been doing this before.";
- mes "It may have to do with the warmer months.";
- mes "Please help us out!";
- set BEARD_QUEST,3;
- next;
- mes "[Karfa Clerk]";
-L_REPEAT:
- mes "Oh by the way, that Thread Merchant is somewhere around Alberta 60 and 100...";
-L_DONE:
- mes "Thank You!";
- close;
-}
-
-//Thread Merchant ------
-alberta.gat,65,123,6 script Man 85,{
- if(BEARD_QUEST == 3 && $@beardMobD) goto L_KILLED;
- if(BEARD_QUEST > 3) goto L_DONE;
-
- mes "[Thread Merchant]";
- mes "ARGGG!! I can never get my stuff to Al de Baran!";
- mes "I keep getting mobbed by some bugs.";
- mes "They steal all my supplies and ^8080FFThread^000000.";
- next;
- mes "[Thread Merchant]";
-
- if(BEARD_QUEST != 3) mes "What am I to do?";
- if(BEARD_QUEST != 3) close;
-
- if($@beardmob > 0) mes "Kill! Kill them already!!!";
- if($@beardmob > 0) close;
- mes "Are you here to help me?";
- emotion 1;
- next;
- menu "Yes",-,"No",M_NO;
-
- mes "[Thread Merchant]";
- mes "Oh thank the Gods!";
- mes "If you can only just kill the bugs I would be able to make my delivery.";
- next;
- mes "[Thread Merchant]";
- mes "Oh NO! Here they come!!";
- emotion 19;
- donpcevent "BRDQ_MOBS::OnStart";
- close;
-
-L_KILLED:
- set $@beardMobD,0;
- mes "[Thread Merchant]";
- mes "Thank you for killing the Thief Bugs.";
- mes "As a token of my gratitude here is a box full of ^8080FFThread^000000.";
- set BEARD_QUEST,4;
- close;
-
-L_DONE:
- mes "[Thread Merchant]";
- mes "Thank you again!";
- emotion 15;
- close;
-
-M_NO:
- mes "[Thread Merchant]";
- mes "What to do...";
- close;
-}
-
-//mobsummons -------
-alberta.gat,1,1,1 script BRDQ_MOBS -1,{
-OnStart:
- set $@beardMob,10;
- set $@beardMobD,0;
- monster "alberta.gat",65,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",66,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",67,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",68,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",66,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",67,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",68,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",66,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",67,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- monster "alberta.gat",68,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
- end;
-OnDie:
- set $@beardmob, $@beardmob - 1;
- if($@beardmob > 0) end;
- set $@beardMobD,1;
- end;
-On1201:
-On0001:
- set $@beardMob,0;
- set $@beardMobD,0;
- end;
+//===== eAthena Script =======================================
+//= Bandit Beard Quest
+//===== By: ==================================================
+//= Mega Man Expert & Lupus
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//= A harmless quest for a simply item w/o any bonuses "Bandit Beard"
+//===== Additional Comments: =================================
+//= Fully working.
+//= 1.0 First release
+//= 1.1 Fixed some exploits, bugs and typos. Optimized 8) [Lupus]
+//= 1.1b fixed some typos
+//= 1.2 fixed donpcevent label [Lupus]
+//============================================================
+
+umbala.gat,126,129,4 script Bearded Man 120,{
+ if(BEARD_QUEST == 4 ) goto L_MAKE;
+ if(BEARD_QUEST >= 5 ) goto L_DONE;
+ if(BEARD_QUEST >= 1 ) goto L_THREAD;
+
+ mes "[Bearded Man]";
+ mes "Beards! Get your wonderful beards!";
+ mes "Would you like a beard?";
+ next;
+ menu "Yes, I'd like some facial hair!",-,"No thanks, thats gross!",M_NO;
+
+ mes "[Bearded Man]";
+ mes "HoHo~ So you want some whiskers.";
+ emotion 18;
+ mes "Well I would give you my beards but there not cheap.";
+ mes "Matter of fact I have only one left...";
+ mes "but I'm not selling it.";
+ mes "But don't get mad! I can make you one.";
+ next;
+ set BEARD_QUEST,1;
+L_THREAD:
+ mes "[Bearded Man]";
+ mes "I would need some ^8080FFThread^000000 for the Beard.";
+ mes "Talk to my friend in Izlude for some ^8080FFThread^000000.";
+ next;
+
+ mes "[Bearded Man]";
+ mes "Also I would need you to get me some things for the beard.";
+ mes "They are:";
+L_LIST:
+ mes "^8080FFElastic Band^000000";
+ mes "^8080FF5 Animal Skins^000000";
+ mes "^8080FFBlack Dye Stuff^000000";
+ mes "^8080FFGranpa Beard^000000";
+ mes "^8080FF100 sticky Mucus^000000";
+ mes "^8080FFCounteragent^000000";
+ mes " and one ^8080FF2 Carat Diamond^000000";
+ close;
+
+M_NO:
+ mes "[Bearded Man]";
+ mes "Fine, be that way!";
+ emotion 7;
+ close;
+
+L_DONE:
+ mes "[Bearded Man]";
+ mes "Sorry, I can only make one per person.";
+ mes "We dont want too many beards now. Right?";
+ emotion 29;
+ close;
+
+L_MAKE:
+ mes "[Bearded Man]";
+ mes "Let's make you your beard!";
+ next;
+ if(countitem(7200) < 1 || countitem(919) < 1 || countitem(983) < 1 || countitem(2241) < 1 ||
+ countitem(938) < 100 || countitem(973) < 1 || countitem(731) < 1) goto L_NOITEMS;
+ delitem 7200, 1;
+ delitem 919, 1;
+ delitem 983, 1;
+ delitem 2241, 1;
+ delitem 938, 100;
+ delitem 973, 1;
+ delitem 731, 1;
+ mes "^8080FF~You see him cutting and sewing the beard together~^000000";
+ next;
+ mes "^8080FF~He hands you the finished beard~^000000";
+ next;
+ getitem 2237, 1;
+ set BEARD_QUEST, 5;
+ mes "[Bearded Man]";
+ mes "Have a nice day!";
+ emotion 29;
+ close;
+
+L_NOITEMS:
+ mes "[Bearded Man]";
+ mes "What the hell! I can't make a beard without the items!";
+ mes "Here is the list again:";
+ emotion 23;
+ goto L_LIST;
+}
+
+//Master Tailor----------
+izlude_in.gat,123,175,4 script Master Tailor 50,{
+ mes "[Master Tailor]";
+ mes "Good evening! I am the Master Tailor!";
+ if(BEARD_QUEST != 1 ) close;
+
+ next;
+ mes "[Master Tailor]";
+ mes "What? A Bearded Man sent you...";
+ mes "Well I'm sorry to say that I am out of ^8080FFThread^000000.";
+ mes "But I have the address to where I get the shipments.";
+ mes "It is in Al de Baran Karfa Inc. warehouse area.";
+ mes "The address is: Al de Baran 59, 221";
+ mes "See you later.";
+ set BEARD_QUEST, 2;
+ close;
+}
+// Karfa Thread Clerk---
+aldeba_in.gat,70,179,5 script Karfa Clerk 113,{
+ mes "[Karfa Clerk]";
+ if(BEARD_QUEST == 3 ) goto L_REPEAT;
+ if(BEARD_QUEST > 3 ) goto L_DONE;
+
+ mes "What can I do for you?";
+ next;
+ if(BEARD_QUEST == 2 ) goto L_DELIVERY;
+
+ menu "What's in the boxes?",-,"Nothing.",M_NOPE;
+
+ mes "[Karfa Clerk]";
+ mes "They're empty.";
+M_NOPE:
+ close;
+
+L_DELIVERY:
+
+ mes "[Karfa Clerk]";
+ mes "Sorry but we have not received any ^8080FFThread^000000.";
+ mes "Our shipments have been put off until its safe.";
+ mes "You see we get our ^8080FFThread^000000 from Alberta and a monsters keeps attacking our merchants.";
+ next;
+ mes "[Karfa Clerk]";
+ mes "Now this monsters has not been doing this before.";
+ mes "It may have to do with the warmer months.";
+ mes "Please help us out!";
+ set BEARD_QUEST,3;
+ next;
+ mes "[Karfa Clerk]";
+L_REPEAT:
+ mes "Oh by the way, that Thread Merchant is somewhere around Alberta 60 and 100...";
+L_DONE:
+ mes "Thank You!";
+ close;
+}
+
+//Thread Merchant ------
+alberta.gat,65,123,6 script Man 85,{
+ if(BEARD_QUEST == 3 && $@beardMobD) goto L_KILLED;
+ if(BEARD_QUEST > 3) goto L_DONE;
+
+ mes "[Thread Merchant]";
+ mes "ARGGG!! I can never get my stuff to Al de Baran!";
+ mes "I keep getting mobbed by some bugs.";
+ mes "They steal all my supplies and ^8080FFThread^000000.";
+ next;
+ mes "[Thread Merchant]";
+
+ if(BEARD_QUEST != 3) mes "What am I to do?";
+ if(BEARD_QUEST != 3) close;
+
+ if($@beardmob > 0) mes "Kill! Kill them already!!!";
+ if($@beardmob > 0) close;
+ mes "Are you here to help me?";
+ emotion 1;
+ next;
+ menu "Yes",-,"No",M_NO;
+
+ mes "[Thread Merchant]";
+ mes "Oh thank the Gods!";
+ mes "If you can only just kill the bugs I would be able to make my delivery.";
+ next;
+ mes "[Thread Merchant]";
+ mes "Oh NO! Here they come!!";
+ emotion 19;
+ donpcevent "BRDQ_MOBS::OnStart";
+ close;
+
+L_KILLED:
+ set $@beardMobD,0;
+ mes "[Thread Merchant]";
+ mes "Thank you for killing the Thief Bugs.";
+ mes "As a token of my gratitude here is a box full of ^8080FFThread^000000.";
+ set BEARD_QUEST,4;
+ close;
+
+L_DONE:
+ mes "[Thread Merchant]";
+ mes "Thank you again!";
+ emotion 15;
+ close;
+
+M_NO:
+ mes "[Thread Merchant]";
+ mes "What to do...";
+ close;
+}
+
+//mobsummons -------
+alberta.gat,1,1,1 script BRDQ_MOBS -1,{
+OnStart:
+ set $@beardMob,10;
+ set $@beardMobD,0;
+ monster "alberta.gat",65,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",66,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",67,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",68,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",66,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",67,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",68,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",66,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",67,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ monster "alberta.gat",68,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie";
+ end;
+OnDie:
+ set $@beardmob, $@beardmob - 1;
+ if($@beardmob > 0) end;
+ set $@beardMobD,1;
+ end;
+On1201:
+On0001:
+ set $@beardMob,0;
+ set $@beardMobD,0;
+ end;
} \ No newline at end of file
diff --git a/npc/custom/quests/berzebub.txt b/npc/custom/quests/berzebub.txt
index 9b26f7ad0..a58cadc18 100644
--- a/npc/custom/quests/berzebub.txt
+++ b/npc/custom/quests/berzebub.txt
@@ -1,74 +1,74 @@
-//===== eAthena Script =======================================
-//= Berzebub Card Quest Script
-//===== By: ==================================================
-//= jabs
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Episode XX
-//===== Description: =========================================
-//= Quest to get the Berzebub Card
-//===== Additional Comments: =================================
-//= 1.1 Fixed ingredients. Was too exploitable [Lupus]
-//============================================================
-prontera.gat,165,178,8 script Old Woman 103,{
- mes "[Old Woman]";
- if(BerzQuest == 1) goto L_Already;
- mes "Greeting lad. I found a really nifty item while I was picking mushrooms near Glast Heim.";
- next;
- menu "Keep talking",-, "Leave", M_Leave;
-
- mes "[Old Woman]";
- mes "I have never seen an item like this before. I am told it can be placed inside am accessory that has a slot avaiable in it.";
- next;
- mes "[Old Woman]";
- mes "If you're interested in this item, tell me and I'll tell you what you need for me to make you one of your own. I can only give one of these to each player, so once you finish this quest once, you may not do it again.";
- next;
- menu "Tell me more about it",-, "Nah, I don't care about it", M_Leave;
-
- mes "[Old Woman]";
- mes "I believe the item is called a ^FF0000Berzebub Card^000000. It can make any spell caster cast spells really fast!";
- next;
- mes "[Old Woman]";
- mes "I need all of the following items:";
- mes "^0080FF25^000000 Emperiums";
- mes "^0080FF100^000000 Witched Starsands";
- mes "^0080FF200^000000 Needles of Alarm";
- mes "^0080FF10^000000 Worn Out Scrolls";
- mes "^0080FF2^000000 Biblies";
- mes "^0080FF1^000000 Wand of the Occult";
- mes "^0080FF20^000000 Opals";
- next;
- menu "I have all that!",-, "I'll get those ASAP", M_Leave;
-
- mes "[Old Woman]";
- mes "Anyone can say they have the items, but do they really have them? Let's take a look here...";
- next;
- mes "[Old Woman]";
- if(countitem(714) < 25 || countitem(1061) < 100 || countitem(1095) < 200 || countitem(618) < 10 || countitem(1551) < 2 || countitem(1614) < 1 || countitem(727) < 20) goto L_noItems;
- delitem 714, 25;
- delitem 1061, 100;
- delitem 1095, 200;
- delitem 618, 10;
- delitem 1551, 2;
- delitem 1614, 1;
- delitem 727, 20;
- getitem 4145, 1;
- set BerzQuest, 1;
- mes "Well congratulations! You have all the items. Here is your ^FF0000Berzebub Card^000000, just as I promised.";
- emotion e_grat;
- close;
-
- M_Leave:
- mes "[Old Woman]";
- mes "Such a great item I have right here...";
- close;
-
- L_noItems:
- mes "I knew you were lying! Get out of here and get those items you sorry excuse for a rock star.";
- close;
-
- L_Already:
- mes "Hey I remember you! I already told you that you may only complete this quest once.";
- close;
-}
+//===== eAthena Script =======================================
+//= Berzebub Card Quest Script
+//===== By: ==================================================
+//= jabs
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Episode XX
+//===== Description: =========================================
+//= Quest to get the Berzebub Card
+//===== Additional Comments: =================================
+//= 1.1 Fixed ingredients. Was too exploitable [Lupus]
+//============================================================
+prontera.gat,165,178,8 script Old Woman 103,{
+ mes "[Old Woman]";
+ if(BerzQuest == 1) goto L_Already;
+ mes "Greeting lad. I found a really nifty item while I was picking mushrooms near Glast Heim.";
+ next;
+ menu "Keep talking",-, "Leave", M_Leave;
+
+ mes "[Old Woman]";
+ mes "I have never seen an item like this before. I am told it can be placed inside am accessory that has a slot avaiable in it.";
+ next;
+ mes "[Old Woman]";
+ mes "If you're interested in this item, tell me and I'll tell you what you need for me to make you one of your own. I can only give one of these to each player, so once you finish this quest once, you may not do it again.";
+ next;
+ menu "Tell me more about it",-, "Nah, I don't care about it", M_Leave;
+
+ mes "[Old Woman]";
+ mes "I believe the item is called a ^FF0000Berzebub Card^000000. It can make any spell caster cast spells really fast!";
+ next;
+ mes "[Old Woman]";
+ mes "I need all of the following items:";
+ mes "^0080FF25^000000 Emperiums";
+ mes "^0080FF100^000000 Witched Starsands";
+ mes "^0080FF200^000000 Needles of Alarm";
+ mes "^0080FF10^000000 Worn Out Scrolls";
+ mes "^0080FF2^000000 Biblies";
+ mes "^0080FF1^000000 Wand of the Occult";
+ mes "^0080FF20^000000 Opals";
+ next;
+ menu "I have all that!",-, "I'll get those ASAP", M_Leave;
+
+ mes "[Old Woman]";
+ mes "Anyone can say they have the items, but do they really have them? Let's take a look here...";
+ next;
+ mes "[Old Woman]";
+ if(countitem(714) < 25 || countitem(1061) < 100 || countitem(1095) < 200 || countitem(618) < 10 || countitem(1551) < 2 || countitem(1614) < 1 || countitem(727) < 20) goto L_noItems;
+ delitem 714, 25;
+ delitem 1061, 100;
+ delitem 1095, 200;
+ delitem 618, 10;
+ delitem 1551, 2;
+ delitem 1614, 1;
+ delitem 727, 20;
+ getitem 4145, 1;
+ set BerzQuest, 1;
+ mes "Well congratulations! You have all the items. Here is your ^FF0000Berzebub Card^000000, just as I promised.";
+ emotion e_grat;
+ close;
+
+ M_Leave:
+ mes "[Old Woman]";
+ mes "Such a great item I have right here...";
+ close;
+
+ L_noItems:
+ mes "I knew you were lying! Get out of here and get those items you sorry excuse for a rock star.";
+ close;
+
+ L_Already:
+ mes "Hey I remember you! I already told you that you may only complete this quest once.";
+ close;
+}
diff --git a/npc/custom/quests/dead_branch.txt b/npc/custom/quests/dead_branch.txt
index 73e226fe7..3c393b456 100644
--- a/npc/custom/quests/dead_branch.txt
+++ b/npc/custom/quests/dead_branch.txt
@@ -1,105 +1,105 @@
-//===== eAthena Script =======================================
-//= Dead Branch (+Bloody Branch) Quest
-//===== By: ==================================================
-//= GM-Yevon
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-// Simple item trade-in quest, a person can get a Dead Branch
-// by simply providing the items: Log x3 (7201), Wooden Heart x1 (7189),
-// Trunk x5 (1019), and Wooden Gnarl x1 (7222).
-//===== Additional Comments: =================================
-//= Fully working.
-//= 1.1 Optimized, added Bloody Branch with 0.01% chance [Lupus]
-//============================================================
-
-niflheim.gat,204,179,3 script Mister Mobry 121,{
-
- mes "[Mister Mobry]";
- mes "Trees possess spirits you know...";
- next;
-
- mes "[Mister Mobry]";
- mes "In fact I know a secret about these spirits that can in some way... perhaps aid you...";
- next;
-
- mes "[Mister Mobry]";
- mes "I can create a spirited branch... That is, if you can provide me with the correct materials...";
- next;
- goto L_MENU;
-
-L_MENU:
- menu "What Do I Need?",-,"Where Can I find this Crap?",M_FIND,"Make me a Dead Branch!",M_CREATE,"Forget it...",M_END;
-
- mes "[Mister Mobry]";
- mes "Mwehehe... I see you want to control tree spirits am I right? Ok... I need:";
- mes "^1354453 Logs^000000";
- mes "^1354451 Wooden Heart^000000";
- mes "^1354455 Trunk^000000";
- mes "^1354451 Wooden Gnarl^000000";
- next;
- goto L_MENU;
-
-M_FIND:
- mes "[Mister Mobry]";
- mes "You can find the following items from certain monsters heheh...";
- mes "^135445Logs can be found off of Tree Golems.^000000";
- mes "^135445Wooden Hearts the essence of Tree Golems.^000000";
- mes "^135445Trunks? Seriously, think wood...^000000";
- mes "^135445Wooden Gnarl... Gibbet...^000000";
- next;
- goto L_MENU;
-
-L_NOLOG:
- mes "[Mister Mobry]";
- mes "^135445Logs^000000 are the body... I need more of them.";
- mes "Get me three logs and I'll make you the spirit...";
- close;
-
-L_NOHEART:
- mes "[Mister Mobry]";
- mes "The ^135445Wooden Heart^000000 is the essence of the spirit.";
- mes "Get me one wooden heart and I'll make you the spirit...";
- close;
-
-L_NOTRUNK:
- mes "[Mister Mobry]";
- mes "What? You couldn't even find ^1354455 Trunks^000000?";
- mes "Kill Elder Willows or something... Geez... no trunks heh... pathetic.";
- close;
-
-L_NOGNARL:
- mes "[Mister Mobry]";
- mes "How can I make one without a ^135445Wooden Gnarl^000000?";
- mes "I said Gibbet... they are all around this place...";
- close;
-
-M_CREATE:
- mes "[Mister Mobry]";
- mes "Well...let us see what you brought me...";
- next;
- if(countitem(7201)<3) goto L_NOLOG;
- if(countitem(7189)<1) goto L_NOHEART;
- if(countitem(1019)<5) goto L_NOTRUNK;
- if(countitem(7222)<1) goto L_NOGNARL;
- delitem 7201,3;
- delitem 7189,1;
- delitem 1019,5;
- delitem 7222,1;
- mes "[Mister Mobry]";
- mes "Heh... Hope you have fun with the tree spirits... Careful now...";
- mes "Heh... careful now? What do I care if you di..... Never mind.";
- if(rand(1000)==0) goto L_GIVE2;
- getitem 604,1; //Dead Branch
- close;
-L_GIVE2:
- getitem 12103,1; //Bloody Branch
- close;
-
-M_END:
- mes "[Mister Mobry]";
- mes "No spirit for you... then go!";
- close;
-}
+//===== eAthena Script =======================================
+//= Dead Branch (+Bloody Branch) Quest
+//===== By: ==================================================
+//= GM-Yevon
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+// Simple item trade-in quest, a person can get a Dead Branch
+// by simply providing the items: Log x3 (7201), Wooden Heart x1 (7189),
+// Trunk x5 (1019), and Wooden Gnarl x1 (7222).
+//===== Additional Comments: =================================
+//= Fully working.
+//= 1.1 Optimized, added Bloody Branch with 0.01% chance [Lupus]
+//============================================================
+
+niflheim.gat,204,179,3 script Mister Mobry 121,{
+
+ mes "[Mister Mobry]";
+ mes "Trees possess spirits you know...";
+ next;
+
+ mes "[Mister Mobry]";
+ mes "In fact I know a secret about these spirits that can in some way... perhaps aid you...";
+ next;
+
+ mes "[Mister Mobry]";
+ mes "I can create a spirited branch... That is, if you can provide me with the correct materials...";
+ next;
+ goto L_MENU;
+
+L_MENU:
+ menu "What Do I Need?",-,"Where Can I find this Crap?",M_FIND,"Make me a Dead Branch!",M_CREATE,"Forget it...",M_END;
+
+ mes "[Mister Mobry]";
+ mes "Mwehehe... I see you want to control tree spirits am I right? Ok... I need:";
+ mes "^1354453 Logs^000000";
+ mes "^1354451 Wooden Heart^000000";
+ mes "^1354455 Trunk^000000";
+ mes "^1354451 Wooden Gnarl^000000";
+ next;
+ goto L_MENU;
+
+M_FIND:
+ mes "[Mister Mobry]";
+ mes "You can find the following items from certain monsters heheh...";
+ mes "^135445Logs can be found off of Tree Golems.^000000";
+ mes "^135445Wooden Hearts the essence of Tree Golems.^000000";
+ mes "^135445Trunks? Seriously, think wood...^000000";
+ mes "^135445Wooden Gnarl... Gibbet...^000000";
+ next;
+ goto L_MENU;
+
+L_NOLOG:
+ mes "[Mister Mobry]";
+ mes "^135445Logs^000000 are the body... I need more of them.";
+ mes "Get me three logs and I'll make you the spirit...";
+ close;
+
+L_NOHEART:
+ mes "[Mister Mobry]";
+ mes "The ^135445Wooden Heart^000000 is the essence of the spirit.";
+ mes "Get me one wooden heart and I'll make you the spirit...";
+ close;
+
+L_NOTRUNK:
+ mes "[Mister Mobry]";
+ mes "What? You couldn't even find ^1354455 Trunks^000000?";
+ mes "Kill Elder Willows or something... Geez... no trunks heh... pathetic.";
+ close;
+
+L_NOGNARL:
+ mes "[Mister Mobry]";
+ mes "How can I make one without a ^135445Wooden Gnarl^000000?";
+ mes "I said Gibbet... they are all around this place...";
+ close;
+
+M_CREATE:
+ mes "[Mister Mobry]";
+ mes "Well...let us see what you brought me...";
+ next;
+ if(countitem(7201)<3) goto L_NOLOG;
+ if(countitem(7189)<1) goto L_NOHEART;
+ if(countitem(1019)<5) goto L_NOTRUNK;
+ if(countitem(7222)<1) goto L_NOGNARL;
+ delitem 7201,3;
+ delitem 7189,1;
+ delitem 1019,5;
+ delitem 7222,1;
+ mes "[Mister Mobry]";
+ mes "Heh... Hope you have fun with the tree spirits... Careful now...";
+ mes "Heh... careful now? What do I care if you di..... Never mind.";
+ if(rand(1000)==0) goto L_GIVE2;
+ getitem 604,1; //Dead Branch
+ close;
+L_GIVE2:
+ getitem 12103,1; //Bloody Branch
+ close;
+
+M_END:
+ mes "[Mister Mobry]";
+ mes "No spirit for you... then go!";
+ close;
+}
diff --git a/npc/custom/quests/elvenear.txt b/npc/custom/quests/elvenear.txt
index d4b80afdd..ab6258a4d 100644
--- a/npc/custom/quests/elvenear.txt
+++ b/npc/custom/quests/elvenear.txt
@@ -1,68 +1,68 @@
-//===== eAthena Script =======================================
-//= Daily Job Quest For Elven Ears
-//===== By: ==================================================
-//= Someone
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Elven Ears (require 75+ Base Level)
-//===== Additional Comments: =================================
-//= Optimized [Lupus], 1.1 misc fix
-//= 1.2 Fixed exploit [Lupus]
-//============================================================
-
-geffen.gat,127,49,5 script Elven Ears Quest 84,{
- mes "[Elven Ears Quest]";
- mes "Hi, today's quest is....";
- mes "Ah, the ^61B031Elven Ears ^000000Quest!";
- next;
- menu "Requirements",L_Bl, "Make Item",-,"Cancel",L_Cancel;
-
- mes "[Elven Ears quest]";
- mes "Good good, let me just check";
- next;
- if(countitem(2213)<1 || countitem(1040)<20 || countitem(919)<20) goto L_NoMake;
- delitem 2213,1;
- delitem 1040,20;
- delitem 919,20;
- mes "[Elven Ears quest]";
- mes "Give me a second.....";
- next;
- getitem 2286,1;
- mes "[Elven Ears Quest]";
- mes "Ok done!";
- close;
-
-L_NoMake:
- mes "[Elven Ears Quest]";
- mes "You don't have the requirements.";
- mes "Please come back another time...";
- close;
-
-L_Bl:
- mes "[Elven Ears Quest]";
- mes "Ok all you have to do is collect:";
- mes "^362ED61 Kitty Band^000000";
- mes "^362ED620 Elder Pixie Mustaches^000000";
- mes "and ^362ED620 Animal Skin^000000";
- next;
- menu "Accept",-, "Leave",L_Leave;
-
- mes "[Elven Ears Quest]";
- mes "When you are done, bring the items to me. Ok good luck finding those items.";
- close;
-
-L_Leave:
- mes "[Elven Ears quest]";
- mes "Maybe another time?";
- close;
-
-L_Cancel:
- mes "[Elven Ears quest]";
- mes "Aw, what a shame";
- mes "Giving up already?";
- mes "Oh well maybe you will participate in tommorow's quest.";
- close;
-}
+//===== eAthena Script =======================================
+//= Daily Job Quest For Elven Ears
+//===== By: ==================================================
+//= Someone
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Elven Ears (require 75+ Base Level)
+//===== Additional Comments: =================================
+//= Optimized [Lupus], 1.1 misc fix
+//= 1.2 Fixed exploit [Lupus]
+//============================================================
+
+geffen.gat,127,49,5 script Elven Ears Quest 84,{
+ mes "[Elven Ears Quest]";
+ mes "Hi, today's quest is....";
+ mes "Ah, the ^61B031Elven Ears ^000000Quest!";
+ next;
+ menu "Requirements",L_Bl, "Make Item",-,"Cancel",L_Cancel;
+
+ mes "[Elven Ears quest]";
+ mes "Good good, let me just check";
+ next;
+ if(countitem(2213)<1 || countitem(1040)<20 || countitem(919)<20) goto L_NoMake;
+ delitem 2213,1;
+ delitem 1040,20;
+ delitem 919,20;
+ mes "[Elven Ears quest]";
+ mes "Give me a second.....";
+ next;
+ getitem 2286,1;
+ mes "[Elven Ears Quest]";
+ mes "Ok done!";
+ close;
+
+L_NoMake:
+ mes "[Elven Ears Quest]";
+ mes "You don't have the requirements.";
+ mes "Please come back another time...";
+ close;
+
+L_Bl:
+ mes "[Elven Ears Quest]";
+ mes "Ok all you have to do is collect:";
+ mes "^362ED61 Kitty Band^000000";
+ mes "^362ED620 Elder Pixie Mustaches^000000";
+ mes "and ^362ED620 Animal Skin^000000";
+ next;
+ menu "Accept",-, "Leave",L_Leave;
+
+ mes "[Elven Ears Quest]";
+ mes "When you are done, bring the items to me. Ok good luck finding those items.";
+ close;
+
+L_Leave:
+ mes "[Elven Ears quest]";
+ mes "Maybe another time?";
+ close;
+
+L_Cancel:
+ mes "[Elven Ears quest]";
+ mes "Aw, what a shame";
+ mes "Giving up already?";
+ mes "Oh well maybe you will participate in tommorow's quest.";
+ close;
+}
diff --git a/npc/custom/quests/event_6_new_hats.txt b/npc/custom/quests/event_6_new_hats.txt
index d91a780d0..45f8d355e 100644
--- a/npc/custom/quests/event_6_new_hats.txt
+++ b/npc/custom/quests/event_6_new_hats.txt
@@ -1,372 +1,372 @@
-//===== eAthena Script =======================================
-//= Custom Quest For New Headgears
-//===== By: ==================================================
-//= RedxSwordxHero, Lupus
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= 4 brothers give you quests to get 6 new hats (missing
-//= from official quests)
-//= Use this custom quest instead of event_32_new_hats.txt
-//= -Bongun Hat
-//= -Poring Hat, Sphinx Hat
-//= -Kafra Band, Panda Hat
-//= -Crescent Hairpin
-//===== Additional Comments: =================================
-//= Event New Hats by RedxSwordxHero
-//= Ported and improved with timers [Lupus]
-//= Thanks to x[tsk],fixed all item requirments to iRO specs exept
-//= for hats which cannot be made on the real server. [Lupus]
-//= 1.2 removed already existing official hat quests [Lupus]
-//= 1.3 Spiffed up the NPC coords and their appearance [Lupus]
-//= 1.4 Fixed exploits. 1.4a fixed wrong item ID [Lupus]
-//============================================================
-
-
-prt_in.gat,130,66,5 script Zac 704,{
- mes "[Zac]";
- mes "I am the oldest and strongest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
- next;
- mes "[Zac]";
- mes "I provide 1 hat and my brothers provides the other 5.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Zac]";
- mes "What hat do you want me to make?";
- next;
- menu "Bongun Hat",L1_4;
-L1_4:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(609) < 10) goto L_ITEM_1c;//Items: Amulet,
- if(countitem(978) < 1) goto L_ITEM_2c;//Items: Cobaltblue Dyestuff,
- if(countitem(2264) < 1) goto L_ITEM_3c;//Items: Munak Hat,
- delitem 609,10;//Items: Amulet,
- delitem 978,1;//Items: Cobaltblue Dyestuff,
- delitem 2264,1; //Items: Munak Hat,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Bongun Hat for you right away. Please Wait a Moment.";
- next;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Bongun Hat^000000...! Please Take it!";
- getitem 5046,1;//Items: Bongun Hat,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1c:
- mes "[Zac]";
- mes "Oh, dear. You need 10 Amulets...";
- close;
-L_ITEM_2c:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
- close;
-L_ITEM_3c:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Munak Hat...";
- close;
-L2:
- mes "[Zac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Bongun Hat",L2_4;
-L2_4:
- mes "[Zac]";
- mes "You need 10 Amulets, 1 Cobaltblue Dyestuff and 1 Munak Hat for Bongun Hat.";
- close;
-L3:
- mes "[Zac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-prt_in.gat,162,131,5 script Blac 732,{
- mes "[Blac]";
- mes "I am the youngest and sexiest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
- next;
- mes "[Blac]";
- mes "I provide 1 hat and my brothers provides the other 5.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Blac]";
- mes "What hat do you want me to make?";
- next;
- menu "Crescent Hairpin",L1_9;
-L1_9:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(5041) < 1) goto L_ITEM_1;//Items: Heart Hairpin,
- if(countitem(999) < 10) goto L_ITEM_2;//Items: Steel,
- delitem 5041,1;//Items: Heart Hairpin,
- delitem 999,10; //Items: Steel,
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Crescent Hairpin for you right away. Please Wait a Moment.";
- next;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Crescent Hairpin^000000...! Please Take it!";
- getitem 5048,1;//Items: Cresent Hairpin,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Heart Hairpin...";
- close;
-L_ITEM_2:
- mes "[Blac]";
- mes "Oh, dear. You need 10 Steels...";
- close;
-L2:
- mes "[Blac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Crescent Hairpin",L2_9;
-L2_9:
- mes "[Blac]";
- mes "You need 1 Heart Hairpin and 10 Steels for Crescent Hairpin.";
- close;
-L3:
- mes "[Blac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-prt_in.gat,53,56,5 script Jac 107,{
- mes "[Jac]";
- mes "I am the 2nd oldest and calmest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
- next;
- mes "[Jac]";
- mes "I provide 2 hats and my brothers provides the other 4.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Jac]";
- mes "What hat do you want me to make?";
- next;
- menu "Kafra Band",L1_19,"Panda Hat",L1_24;
-L1_19:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(10007) < 1) goto L_ITEM_1b;//Items: Silk Ribbon,
- if(countitem(10009) < 1) goto L_ITEM_2b;//Items: Wild Flower,
- delitem 10007,1;//Items: Silk Ribbon,
- delitem 10009,1; //Items: Wild Flower,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Kafra Band for you right away. Please Wait a Moment.";
- next;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Kafra Band^000000...! Please Take it!";
- getitem 5020,1;//Items: Kafra's Band,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1b:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Silk Ribbon...";
- close;
-L_ITEM_2b:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Wild Flower...";
- close;
-L1_24:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(999) < 10) goto L_ITEM_1g;//Items: Steel,
- if(countitem(948) < 200) goto L_ITEM_2g;//Items: Bears Footskin,
- delitem 999,10;//Items: Steel,
- delitem 948,200; //Items: Bears Footskin,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Panda Hat for you right away. Please Wait a Moment.";
- next;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Panda Hat^000000...! Please Take it!";
- getitem 5030,1;//Items: Panda Hat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1g:
- mes "[Jac]";
- mes "Oh, dear. You need 10 Steels...";
- close;
-L_ITEM_2g:
- mes "[Jac]";
- mes "Oh, dear. You need 200 Bear Footskins...";
- close;
-L2:
- mes "[Jac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Kafra Band",L2_19,"Panda Hat",L2_24;
-L2_19:
- mes "[Jac]";
- mes "You need 1 Silk Ribbon and 1 Wild Flower for Kafra Band.";
- close;
-L2_24:
- mes "[Jac]";
- mes "You need 10 Steels and 200 Bear Footskins for Panda Hat.";
- close;
-L3:
- mes "[Jac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-prt_in.gat,45,113,5 script Pac 705,{
- mes "[Pac]";
- mes "I am 3rd oldest and wisest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat so I can make them.";
- next;
- mes "[Pac]";
- mes "I provide 2 hats and my brothers provides the other 4.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Pac]";
- mes "What hat do you want me to make?";
- next;
- menu "Poring Hat",L1_26,"Sphinx Hat",L1_29;
-L1_26:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(741) < 1) goto L_ITEM_1a;//Items: Poring Doll,
- if(countitem(909) < 300) goto L_ITEM_2a;//Items: Jellopy,
- delitem 741,1;//Items: Poring Doll,
- delitem 909,300;//Items: Jellopy,
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Poring Hat for you right away. Please Wait a Moment.";
- next;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Poring Hat^000000...! Please Take it!";
- getitem 5035,1;//Items: Poring Hat,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1a:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Poring Doll...";
- close;
-L_ITEM_2a:
- mes "[Pac]";
- mes "Oh, dear. You need 300 Jellopys...";
- close;
-L1_29:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(999) < 25) goto L_ITEM_1d;//Items: Steel,
- if(countitem(979) < 1) goto L_ITEM_2d;//Items: Darkgreen Dyestuff,
- if(countitem(976) < 1) goto L_ITEM_3d;//Items: Lemon Dyestuffs,
- if(countitem(1059) < 150) goto L_ITEM_4d;//Items: Fabric,
- if(countitem(969) < 2) goto L_ITEM_5d;//Items: Gold,
- delitem 999,25;//Items: Steel,
- delitem 979,1;//Items: Darkgreen Dyestuff,
- delitem 976,1;//Items: Lemon Dyestuffs,
- delitem 1059,150;//Items: Fabric,
- delitem 969,2; //Items: Gold,
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Sphinx Hat for you right away. Please Wait a Moment.";
- next;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Sphinx Hat^000000...! Please Take it!";
- getitem 5053,1;//Items: Sphinx Hat,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1d:
- mes "[Pac]";
- mes "Oh, dear. You need 25 Steels...";
- close;
-L_ITEM_2d:
- mes "[Pac]";
- mes "Oh, dear. You need 1 DarkGreen Dyestuff...";
- close;
-L_ITEM_3d:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Lemon Dyestuff...";
- close;
-L_ITEM_4d:
- mes "[Pac]";
- mes "Oh, dear. You need 150 Fabric...";
- close;
-L_ITEM_5d:
- mes "[Pac]";
- mes "Oh, dear. You need 2 Gold Bar's...";
- close;
-L2:
- mes "[Pac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Poring Hat",L2_26,"Sphinx Hat",L2_29;
-L2_26:
- mes "[Pac]";
- mes "You need 1 Poring Doll and 300 Jellopys for Poring Hat.";
- close;
-L2_29:
- mes "[Pac]";
- mes "You need 25 Steels, 1 DarkGreen Dyestuff, 1 Lemon Dyestuff, 150 Fabric and 2 Gold Bar's for Sphinx Hat.";
- close;
-L3:
- mes "[Pac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-
-//these scripts make our brothers to appear and disappear in order
-- script EDZac -1,{
-OnInit:
-OnMinute15:
- disablenpc "Zac";
- end;
-OnMinute01:
- if(rand(2)) end;
- enablenpc "Zac";
- end;
-}
-
-- script EDJac -1,{
-OnInit:
-OnMinute30:
- disablenpc "Jac";
- end;
-OnMinute16:
- if(rand(2)) end;
- enablenpc "Jac";
- end;
-}
-
-- script EDPac -1,{
-OnInit:
-OnMinute45:
- disablenpc "Pac";
- end;
-OnMinute31:
- if(rand(2)) end;
- enablenpc "Pac";
- end;
-}
-
-- script EDBlac -1,{
-OnInit:
-OnMinute00:
- disablenpc "Blac";
- end;
-OnMinute46:
- if(rand(2)) end;
- enablenpc "Blac";
- end;
+//===== eAthena Script =======================================
+//= Custom Quest For New Headgears
+//===== By: ==================================================
+//= RedxSwordxHero, Lupus
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= 4 brothers give you quests to get 6 new hats (missing
+//= from official quests)
+//= Use this custom quest instead of event_32_new_hats.txt
+//= -Bongun Hat
+//= -Poring Hat, Sphinx Hat
+//= -Kafra Band, Panda Hat
+//= -Crescent Hairpin
+//===== Additional Comments: =================================
+//= Event New Hats by RedxSwordxHero
+//= Ported and improved with timers [Lupus]
+//= Thanks to x[tsk],fixed all item requirments to iRO specs exept
+//= for hats which cannot be made on the real server. [Lupus]
+//= 1.2 removed already existing official hat quests [Lupus]
+//= 1.3 Spiffed up the NPC coords and their appearance [Lupus]
+//= 1.4 Fixed exploits. 1.4a fixed wrong item ID [Lupus]
+//============================================================
+
+
+prt_in.gat,130,66,5 script Zac 704,{
+ mes "[Zac]";
+ mes "I am the oldest and strongest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
+ next;
+ mes "[Zac]";
+ mes "I provide 1 hat and my brothers provides the other 5.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Zac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Bongun Hat",L1_4;
+L1_4:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(609) < 10) goto L_ITEM_1c;//Items: Amulet,
+ if(countitem(978) < 1) goto L_ITEM_2c;//Items: Cobaltblue Dyestuff,
+ if(countitem(2264) < 1) goto L_ITEM_3c;//Items: Munak Hat,
+ delitem 609,10;//Items: Amulet,
+ delitem 978,1;//Items: Cobaltblue Dyestuff,
+ delitem 2264,1; //Items: Munak Hat,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Bongun Hat for you right away. Please Wait a Moment.";
+ next;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Bongun Hat^000000...! Please Take it!";
+ getitem 5046,1;//Items: Bongun Hat,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1c:
+ mes "[Zac]";
+ mes "Oh, dear. You need 10 Amulets...";
+ close;
+L_ITEM_2c:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
+ close;
+L_ITEM_3c:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Munak Hat...";
+ close;
+L2:
+ mes "[Zac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Bongun Hat",L2_4;
+L2_4:
+ mes "[Zac]";
+ mes "You need 10 Amulets, 1 Cobaltblue Dyestuff and 1 Munak Hat for Bongun Hat.";
+ close;
+L3:
+ mes "[Zac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+prt_in.gat,162,131,5 script Blac 732,{
+ mes "[Blac]";
+ mes "I am the youngest and sexiest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
+ next;
+ mes "[Blac]";
+ mes "I provide 1 hat and my brothers provides the other 5.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Blac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Crescent Hairpin",L1_9;
+L1_9:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(5041) < 1) goto L_ITEM_1;//Items: Heart Hairpin,
+ if(countitem(999) < 10) goto L_ITEM_2;//Items: Steel,
+ delitem 5041,1;//Items: Heart Hairpin,
+ delitem 999,10; //Items: Steel,
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Crescent Hairpin for you right away. Please Wait a Moment.";
+ next;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Crescent Hairpin^000000...! Please Take it!";
+ getitem 5048,1;//Items: Cresent Hairpin,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Heart Hairpin...";
+ close;
+L_ITEM_2:
+ mes "[Blac]";
+ mes "Oh, dear. You need 10 Steels...";
+ close;
+L2:
+ mes "[Blac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Crescent Hairpin",L2_9;
+L2_9:
+ mes "[Blac]";
+ mes "You need 1 Heart Hairpin and 10 Steels for Crescent Hairpin.";
+ close;
+L3:
+ mes "[Blac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+prt_in.gat,53,56,5 script Jac 107,{
+ mes "[Jac]";
+ mes "I am the 2nd oldest and calmest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them.";
+ next;
+ mes "[Jac]";
+ mes "I provide 2 hats and my brothers provides the other 4.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Jac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Kafra Band",L1_19,"Panda Hat",L1_24;
+L1_19:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(10007) < 1) goto L_ITEM_1b;//Items: Silk Ribbon,
+ if(countitem(10009) < 1) goto L_ITEM_2b;//Items: Wild Flower,
+ delitem 10007,1;//Items: Silk Ribbon,
+ delitem 10009,1; //Items: Wild Flower,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Kafra Band for you right away. Please Wait a Moment.";
+ next;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Kafra Band^000000...! Please Take it!";
+ getitem 5020,1;//Items: Kafra's Band,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1b:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Silk Ribbon...";
+ close;
+L_ITEM_2b:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Wild Flower...";
+ close;
+L1_24:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(999) < 10) goto L_ITEM_1g;//Items: Steel,
+ if(countitem(948) < 200) goto L_ITEM_2g;//Items: Bears Footskin,
+ delitem 999,10;//Items: Steel,
+ delitem 948,200; //Items: Bears Footskin,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Panda Hat for you right away. Please Wait a Moment.";
+ next;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Panda Hat^000000...! Please Take it!";
+ getitem 5030,1;//Items: Panda Hat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1g:
+ mes "[Jac]";
+ mes "Oh, dear. You need 10 Steels...";
+ close;
+L_ITEM_2g:
+ mes "[Jac]";
+ mes "Oh, dear. You need 200 Bear Footskins...";
+ close;
+L2:
+ mes "[Jac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Kafra Band",L2_19,"Panda Hat",L2_24;
+L2_19:
+ mes "[Jac]";
+ mes "You need 1 Silk Ribbon and 1 Wild Flower for Kafra Band.";
+ close;
+L2_24:
+ mes "[Jac]";
+ mes "You need 10 Steels and 200 Bear Footskins for Panda Hat.";
+ close;
+L3:
+ mes "[Jac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+prt_in.gat,45,113,5 script Pac 705,{
+ mes "[Pac]";
+ mes "I am 3rd oldest and wisest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat so I can make them.";
+ next;
+ mes "[Pac]";
+ mes "I provide 2 hats and my brothers provides the other 4.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Pac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Poring Hat",L1_26,"Sphinx Hat",L1_29;
+L1_26:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(741) < 1) goto L_ITEM_1a;//Items: Poring Doll,
+ if(countitem(909) < 300) goto L_ITEM_2a;//Items: Jellopy,
+ delitem 741,1;//Items: Poring Doll,
+ delitem 909,300;//Items: Jellopy,
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Poring Hat for you right away. Please Wait a Moment.";
+ next;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Poring Hat^000000...! Please Take it!";
+ getitem 5035,1;//Items: Poring Hat,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1a:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Poring Doll...";
+ close;
+L_ITEM_2a:
+ mes "[Pac]";
+ mes "Oh, dear. You need 300 Jellopys...";
+ close;
+L1_29:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(999) < 25) goto L_ITEM_1d;//Items: Steel,
+ if(countitem(979) < 1) goto L_ITEM_2d;//Items: Darkgreen Dyestuff,
+ if(countitem(976) < 1) goto L_ITEM_3d;//Items: Lemon Dyestuffs,
+ if(countitem(1059) < 150) goto L_ITEM_4d;//Items: Fabric,
+ if(countitem(969) < 2) goto L_ITEM_5d;//Items: Gold,
+ delitem 999,25;//Items: Steel,
+ delitem 979,1;//Items: Darkgreen Dyestuff,
+ delitem 976,1;//Items: Lemon Dyestuffs,
+ delitem 1059,150;//Items: Fabric,
+ delitem 969,2; //Items: Gold,
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Sphinx Hat for you right away. Please Wait a Moment.";
+ next;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Sphinx Hat^000000...! Please Take it!";
+ getitem 5053,1;//Items: Sphinx Hat,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1d:
+ mes "[Pac]";
+ mes "Oh, dear. You need 25 Steels...";
+ close;
+L_ITEM_2d:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 DarkGreen Dyestuff...";
+ close;
+L_ITEM_3d:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Lemon Dyestuff...";
+ close;
+L_ITEM_4d:
+ mes "[Pac]";
+ mes "Oh, dear. You need 150 Fabric...";
+ close;
+L_ITEM_5d:
+ mes "[Pac]";
+ mes "Oh, dear. You need 2 Gold Bar's...";
+ close;
+L2:
+ mes "[Pac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Poring Hat",L2_26,"Sphinx Hat",L2_29;
+L2_26:
+ mes "[Pac]";
+ mes "You need 1 Poring Doll and 300 Jellopys for Poring Hat.";
+ close;
+L2_29:
+ mes "[Pac]";
+ mes "You need 25 Steels, 1 DarkGreen Dyestuff, 1 Lemon Dyestuff, 150 Fabric and 2 Gold Bar's for Sphinx Hat.";
+ close;
+L3:
+ mes "[Pac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+
+//these scripts make our brothers to appear and disappear in order
+- script EDZac -1,{
+OnInit:
+OnMinute15:
+ disablenpc "Zac";
+ end;
+OnMinute01:
+ if(rand(2)) end;
+ enablenpc "Zac";
+ end;
+}
+
+- script EDJac -1,{
+OnInit:
+OnMinute30:
+ disablenpc "Jac";
+ end;
+OnMinute16:
+ if(rand(2)) end;
+ enablenpc "Jac";
+ end;
+}
+
+- script EDPac -1,{
+OnInit:
+OnMinute45:
+ disablenpc "Pac";
+ end;
+OnMinute31:
+ if(rand(2)) end;
+ enablenpc "Pac";
+ end;
+}
+
+- script EDBlac -1,{
+OnInit:
+OnMinute00:
+ disablenpc "Blac";
+ end;
+OnMinute46:
+ if(rand(2)) end;
+ enablenpc "Blac";
+ end;
} \ No newline at end of file
diff --git a/npc/custom/quests/fashion.txt b/npc/custom/quests/fashion.txt
index 0681478f9..cf8d9dc4a 100644
--- a/npc/custom/quests/fashion.txt
+++ b/npc/custom/quests/fashion.txt
@@ -1,69 +1,69 @@
-//===== eAthena Script =======================================
-//= Quest for Fashion Glasses (Daily Job Quest)
-//===== By: ==================================================
-//= 1.1 None
-//===== Current Version: =====================================
-//= Any
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Quest for Fashion Glasses
-//===== Additional Comments: =================================
-//= 1.0 Fully Working [Lupus]
-//= 1.1 fixed exploit [Lupus]
-//============================================================
-
-izlude.gat,135,96,5 script Fashion Glasses Quest 76,{
- mes "[Fashionable Glasses Quest]";
- mes "Hi, today's quest is....";
- mes "Ah, the ^CC6633Fashionable Glasses^000000 Quest!";
- next;
- menu "Requirements",M_INFO,"Make Item",-,"Cancel",M_CANCEL;
-
- mes "[Fashionable Glasses Quest]";
- mes "Good good, let me just check";
- next;
- if(countitem(2271)<1 || countitem(975)<1) goto M_NOITEMS;
- delitem 2271,1;
- delitem 975,1;
- mes "[Fashionable Glasses Quest]";
- mes "Give me a second.....";
- next;
- getitem 5047,1;
- mes "[Fashionable Glasses Quest]";
- mes "Ok done!";
- close;
-
-M_NOITEMS:
- mes "[Fashionable Glasses Quest]";
- mes "You don't have the requirements.";
- mes "Please come back another time...";
- close;
-
-M_INFO:
- mes "[Fashionable Glasses Quest]";
- mes "Ok all you have to do is collect";
- mes "^CC66331 Jack'a Dandy^000000";
- mes "and ^CC66331 Scalet Dyestuff^000000.";
- next;
- menu "Accept",-,"Leave",M_LEAVE;
-
- mes "[Fashionable Glasses Quest]";
- mes "When you are done, bring the items to me,";
- mes "Ok good luck finding those items.";
- close;
-
-M_LEAVE:
- mes "[Fashionable Glasses Quest]";
- mes "Maybe another time?";
- close;
-
-M_CANCEL:
- mes "[Fashionable Glasses Quest]";
- mes "Aw, what a shame";
- mes "Giving up already?";
- mes "Oh well maybe you will";
- mes "participate in tommorow's";
- mes "quest.";
- close;
-}
+//===== eAthena Script =======================================
+//= Quest for Fashion Glasses (Daily Job Quest)
+//===== By: ==================================================
+//= 1.1 None
+//===== Current Version: =====================================
+//= Any
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Quest for Fashion Glasses
+//===== Additional Comments: =================================
+//= 1.0 Fully Working [Lupus]
+//= 1.1 fixed exploit [Lupus]
+//============================================================
+
+izlude.gat,135,96,5 script Fashion Glasses Quest 76,{
+ mes "[Fashionable Glasses Quest]";
+ mes "Hi, today's quest is....";
+ mes "Ah, the ^CC6633Fashionable Glasses^000000 Quest!";
+ next;
+ menu "Requirements",M_INFO,"Make Item",-,"Cancel",M_CANCEL;
+
+ mes "[Fashionable Glasses Quest]";
+ mes "Good good, let me just check";
+ next;
+ if(countitem(2271)<1 || countitem(975)<1) goto M_NOITEMS;
+ delitem 2271,1;
+ delitem 975,1;
+ mes "[Fashionable Glasses Quest]";
+ mes "Give me a second.....";
+ next;
+ getitem 5047,1;
+ mes "[Fashionable Glasses Quest]";
+ mes "Ok done!";
+ close;
+
+M_NOITEMS:
+ mes "[Fashionable Glasses Quest]";
+ mes "You don't have the requirements.";
+ mes "Please come back another time...";
+ close;
+
+M_INFO:
+ mes "[Fashionable Glasses Quest]";
+ mes "Ok all you have to do is collect";
+ mes "^CC66331 Jack'a Dandy^000000";
+ mes "and ^CC66331 Scalet Dyestuff^000000.";
+ next;
+ menu "Accept",-,"Leave",M_LEAVE;
+
+ mes "[Fashionable Glasses Quest]";
+ mes "When you are done, bring the items to me,";
+ mes "Ok good luck finding those items.";
+ close;
+
+M_LEAVE:
+ mes "[Fashionable Glasses Quest]";
+ mes "Maybe another time?";
+ close;
+
+M_CANCEL:
+ mes "[Fashionable Glasses Quest]";
+ mes "Aw, what a shame";
+ mes "Giving up already?";
+ mes "Oh well maybe you will";
+ mes "participate in tommorow's";
+ mes "quest.";
+ close;
+}
diff --git a/npc/custom/quests/ironcane.txt b/npc/custom/quests/ironcane.txt
index 39b5f0aaa..123f04a51 100644
--- a/npc/custom/quests/ironcane.txt
+++ b/npc/custom/quests/ironcane.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= Quest For Iron Cain
-//===== By: ==================================================
-//= eA Dev Team
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Iron Cain (lower part of a full helmet)
-//===== Additional Comments: =================================
-//= 1.1 Fixed exploit [Lupus]
-//============================================================
-
-payon.gat,109,118,5 script Iron Cain Quest 76,{
- mes "[Iron Cain Quest]";
- mes "Here's what you need";
- mes "The requirements, should you be brave enough to collect them, are:";
- mes "- 200 Orcish vouchers";
- mes "- 1 Heroic Emblem";
- next;
- mes "[Iron Cain Quest]";
- mes "Are you ready for me to make this special item?";
- next;
- menu "Sure am!",-, "The requirements are unfathomable!",L_Unfathomable;
-
- mes "[Iron Cain Quest]";
- if(countitem(931) < 200 || countitem(968) < 1) goto L_NotEnough;
- delitem 931,200;
- delitem 968,1;
- mes "Wow! You are brave indeed!";
- next;
- mes "[Iron Cain Quest]";
- mes "Enjoy!";
- getitem 2266,1;
- close;
-
-L_NotEnough:
- mes ". . .I'm sorry. You don't have enough money and items.";
- mes "I can't afford to make this if you don't bring all materials needed.";
- mes "Please understand this is to benefit heroes such as yourself!";
- close;
-
-L_Unfathomable:
- mes "[Iron Cain Quest]";
- mes "What I had to go through was more unfathomable..";
- mes "If you succeed in getting these items, you will have incredible strength!";
- close;
-}
+//===== eAthena Script =======================================
+//= Quest For Iron Cain
+//===== By: ==================================================
+//= eA Dev Team
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Iron Cain (lower part of a full helmet)
+//===== Additional Comments: =================================
+//= 1.1 Fixed exploit [Lupus]
+//============================================================
+
+payon.gat,109,118,5 script Iron Cain Quest 76,{
+ mes "[Iron Cain Quest]";
+ mes "Here's what you need";
+ mes "The requirements, should you be brave enough to collect them, are:";
+ mes "- 200 Orcish vouchers";
+ mes "- 1 Heroic Emblem";
+ next;
+ mes "[Iron Cain Quest]";
+ mes "Are you ready for me to make this special item?";
+ next;
+ menu "Sure am!",-, "The requirements are unfathomable!",L_Unfathomable;
+
+ mes "[Iron Cain Quest]";
+ if(countitem(931) < 200 || countitem(968) < 1) goto L_NotEnough;
+ delitem 931,200;
+ delitem 968,1;
+ mes "Wow! You are brave indeed!";
+ next;
+ mes "[Iron Cain Quest]";
+ mes "Enjoy!";
+ getitem 2266,1;
+ close;
+
+L_NotEnough:
+ mes ". . .I'm sorry. You don't have enough money and items.";
+ mes "I can't afford to make this if you don't bring all materials needed.";
+ mes "Please understand this is to benefit heroes such as yourself!";
+ close;
+
+L_Unfathomable:
+ mes "[Iron Cain Quest]";
+ mes "What I had to go through was more unfathomable..";
+ mes "If you succeed in getting these items, you will have incredible strength!";
+ close;
+}
diff --git a/npc/custom/quests/kaho_balmung.txt b/npc/custom/quests/kaho_balmung.txt
index a0a0975aa..7b6650ba4 100644
--- a/npc/custom/quests/kaho_balmung.txt
+++ b/npc/custom/quests/kaho_balmung.txt
@@ -1,76 +1,76 @@
-// $Id: kaho_balmung.txt,v 1.1.1.1 2004/09/10 17:26:46 MagicalTux Exp $
-//-------------------- 'Balmung & Lord Kaho's Horns' Quest --------------------
-// Warning! Don't use this quest 8)
-
-prontera.gat,158,356,4 script Royal Messenger 105,{
- mes "[Royal Messenger]";
- mes "Welcome to prontera, I am the Royal Messenger in charge of the royal quest.";
- next;
- menu "Listen",-,"No",Lend;
-
- mes "[Royal Messenger]";
- mes "There are too quests please chose the one you must like.";
- next;
- menu "Balmung",-,"Lord Kahos horns",Lkahos,"No",Lend;
-
- mes "[Royal Messenger]";
- mes "The Balmung quest consist of the next items:";
- mes "120 Steel";
- mes "10 Oridecon";
- mes "10 Rough Wind";
- mes "10 Flame Heart";
- mes "10 Mystic Frozen";
- mes "10 Great Nature";
- mes "1,000,000z";
- next;
- if(countitem(999)<120 || countitem(984)<10 || countitem(996)<10 || countitem(994)<10
- || countitem(995)<10 || countitem(997)<10 || Zeny<1000000) goto NoItems;
- delitem 999,120;
- delitem 984,10;
- delitem 996,10;
- delitem 994,10;
- delitem 995,10;
- delitem 997,10;
- set Zeny,Zeny-1000000;
- mes "[Royal Messenger]";
- mes "I see you already have all the items you need.";
- mes "nice work.";
- getitem 1161,1;
- close;
-
-Lkahos:
- mes "[Royal Messenger]";
- mes "The Lord Kahos horns quest consists of the next items:";
- mes "1 Green Feelers";
- mes "10 Star Dust";
- mes "10 Rough Wind";
- mes "10 Flame Heart";
- mes "10 Mystic Frozen";
- mes "10 Great Nature";
- mes "1,000,000z";
- next;
- if(countitem(2298)<1 || countitem(1001)<10 || countitem(996)<10 || countitem(994)<10
- || countitem(995)<10 || countitem(997)<10 || Zeny<1000000) goto NoItems;
- delitem 2298,1;
- delitem 1001,10;
- delitem 996,10;
- delitem 994,10;
- delitem 995,10;
- delitem 997,10;
- set Zeny,Zeny-1000000;
- mes "[Royal Messenger]";
- mes "I see you already have all the items you need.";
- mes "nice work.";
- getitem 5013,1;
- close;
-
-Lend:
- mes "[Royal Messenger]";
- mes "Have a nice day.";
- close;
-NoItems:
- mes "[Royal Messenger]";
- mes "Sorry you dont have all the items or zeny I need.";
- mes "Come back when you have them all";
- close;
-}
+// $Id: kaho_balmung.txt,v 1.1.1.1 2004/09/10 17:26:46 MagicalTux Exp $
+//-------------------- 'Balmung & Lord Kaho's Horns' Quest --------------------
+// Warning! Don't use this quest 8)
+
+prontera.gat,158,356,4 script Royal Messenger 105,{
+ mes "[Royal Messenger]";
+ mes "Welcome to prontera, I am the Royal Messenger in charge of the royal quest.";
+ next;
+ menu "Listen",-,"No",Lend;
+
+ mes "[Royal Messenger]";
+ mes "There are too quests please chose the one you must like.";
+ next;
+ menu "Balmung",-,"Lord Kahos horns",Lkahos,"No",Lend;
+
+ mes "[Royal Messenger]";
+ mes "The Balmung quest consist of the next items:";
+ mes "120 Steel";
+ mes "10 Oridecon";
+ mes "10 Rough Wind";
+ mes "10 Flame Heart";
+ mes "10 Mystic Frozen";
+ mes "10 Great Nature";
+ mes "1,000,000z";
+ next;
+ if(countitem(999)<120 || countitem(984)<10 || countitem(996)<10 || countitem(994)<10
+ || countitem(995)<10 || countitem(997)<10 || Zeny<1000000) goto NoItems;
+ delitem 999,120;
+ delitem 984,10;
+ delitem 996,10;
+ delitem 994,10;
+ delitem 995,10;
+ delitem 997,10;
+ set Zeny,Zeny-1000000;
+ mes "[Royal Messenger]";
+ mes "I see you already have all the items you need.";
+ mes "nice work.";
+ getitem 1161,1;
+ close;
+
+Lkahos:
+ mes "[Royal Messenger]";
+ mes "The Lord Kahos horns quest consists of the next items:";
+ mes "1 Green Feelers";
+ mes "10 Star Dust";
+ mes "10 Rough Wind";
+ mes "10 Flame Heart";
+ mes "10 Mystic Frozen";
+ mes "10 Great Nature";
+ mes "1,000,000z";
+ next;
+ if(countitem(2298)<1 || countitem(1001)<10 || countitem(996)<10 || countitem(994)<10
+ || countitem(995)<10 || countitem(997)<10 || Zeny<1000000) goto NoItems;
+ delitem 2298,1;
+ delitem 1001,10;
+ delitem 996,10;
+ delitem 994,10;
+ delitem 995,10;
+ delitem 997,10;
+ set Zeny,Zeny-1000000;
+ mes "[Royal Messenger]";
+ mes "I see you already have all the items you need.";
+ mes "nice work.";
+ getitem 5013,1;
+ close;
+
+Lend:
+ mes "[Royal Messenger]";
+ mes "Have a nice day.";
+ close;
+NoItems:
+ mes "[Royal Messenger]";
+ mes "Sorry you dont have all the items or zeny I need.";
+ mes "Come back when you have them all";
+ close;
+}
diff --git a/npc/custom/quests/kahohorn.txt b/npc/custom/quests/kahohorn.txt
index 2a74b6c06..50872bcfd 100644
--- a/npc/custom/quests/kahohorn.txt
+++ b/npc/custom/quests/kahohorn.txt
@@ -1,84 +1,84 @@
-//This quest is custom. Don't use it.
-
-geffen.gat,115,107,5 script Lord Kaho's Servant 61,{
- mes "[Lord Kaho's Servant]";
- mes "I worked myself to death trying to fulfill Lord Kaho's ridiculous expectations for a headgear!";
- mes "Now that I've finally found the formula for the perfect headgear, I'm willing to share my time and talents";
- next;
- mes "You need the following to get the Kaho horns!";
- mes "3 emperiums";
- mes "Oh yea... i also forgot to mention these X_X";
- next;
- mes "1 Skull - From Dark Lord";
- mes "1 Heroic Emblem - From Orc Hero";
- mes "1 Evil Horn - From Baphomet";
- mes "1 Red Frame - From Doppelganger";
- mes "1 Smoking Pipe - From Eddga";
- mes "1 Fang of Garm - From Garm";
- mes "1 Mother's Nightmare - From Maya";
- mes "1 Sphynx Hat - from Osiris";
- mes "1 Diamond Ring - from Mistress";
- next;
- mes "Were' not done yet sweety...";
- mes "Im a big fan of dolls, so you need to bring me these cuties";
- mes "1 Poring Doll - a Poring drop";
- mes "1 Chonchon Doll - a Chonchon Drop";
- mes "1 Baphomet Doll - a Baphomet drop";
- mes "1 Osiris Doll - an Osiris drop";
- mes "1 Rocker Doll - a Rocker drop";
- mes "1 Apez Fanitem Doll - a Yoyo drop";
- mes "1 Racoon Doll - a Smokie drop";
- mes "1 Spore Doll - a Spore drop";
- next;
- mes "Finally, i worked hard to make these horns for my master with all the mentioned items above...";
- mes "Please include 5 million zeny for my efforts.";
- next;
- mes "[Lord Kaho's Servant]";
- mes ". . . . . .";
- mes "Are you ready for me to make this special item?";
- next;
- menu "Sure am!",-,"These requirements are unfathomable!",LUnfathomable;
-
- mes "[Lord Kaho's Servant]";
- if(countitem(754) < 1 || countitem(753) < 1 || countitem(752) < 1 || countitem(751) < 1 || countitem(750) < 1
- || countitem(743) < 1 || countitem(742) < 1 || countitem(741) < 1 || countitem(2613) < 1
- || countitem(5053) < 1 || countitem(7020) < 1 || countitem(7036) < 1 || countitem(2268) < 1
- || countitem(734) < 1 || countitem(923) < 1 || countitem(968) < 1 || countitem(7005) < 1
- || countitem(714) < 3 || Zeny < 5000000) goto LNotEnough;
- delitem 754,1;
- delitem 753,1;
- delitem 752,1;
- delitem 751,1;
- delitem 750,1;
- delitem 743,1;
- delitem 742,1;
- delitem 741,1;
- delitem 2613,1;
- delitem 5053,1;
- delitem 7020,1;
- delitem 7036,1;
- delitem 2268,1;
- delitem 734,1;
- delitem 923,1;
- delitem 968,1;
- delitem 7005,1;
- delitem 714,3;
- set Zeny,Zeny-5000000;
- mes "Wow! You are brave indeed!";
- getitem 5013,1;
- mes ". . . . .";
- mes "Enjoy being God of Rune Midgard!";
- close;
-
- LNotEnough:
- mes ". . . . .";
- mes ". . .I'm sorry .. You don't have enough money and items ..";
- mes "I can't afford to make this if you don't bring all materials needed. Please understand this is to benefit heroes such as yourself!";
- close;
-
- LUnfathomable:
- mes ". . . . .";
- mes "What I had to go through was more unfathomable..";
- mes "If you succeed in getting these items, you will have incredible strength!";
- close;
-}
+//This quest is custom. Don't use it.
+
+geffen.gat,115,107,5 script Lord Kaho's Servant 61,{
+ mes "[Lord Kaho's Servant]";
+ mes "I worked myself to death trying to fulfill Lord Kaho's ridiculous expectations for a headgear!";
+ mes "Now that I've finally found the formula for the perfect headgear, I'm willing to share my time and talents";
+ next;
+ mes "You need the following to get the Kaho horns!";
+ mes "3 emperiums";
+ mes "Oh yea... i also forgot to mention these X_X";
+ next;
+ mes "1 Skull - From Dark Lord";
+ mes "1 Heroic Emblem - From Orc Hero";
+ mes "1 Evil Horn - From Baphomet";
+ mes "1 Red Frame - From Doppelganger";
+ mes "1 Smoking Pipe - From Eddga";
+ mes "1 Fang of Garm - From Garm";
+ mes "1 Mother's Nightmare - From Maya";
+ mes "1 Sphynx Hat - from Osiris";
+ mes "1 Diamond Ring - from Mistress";
+ next;
+ mes "Were' not done yet sweety...";
+ mes "Im a big fan of dolls, so you need to bring me these cuties";
+ mes "1 Poring Doll - a Poring drop";
+ mes "1 Chonchon Doll - a Chonchon Drop";
+ mes "1 Baphomet Doll - a Baphomet drop";
+ mes "1 Osiris Doll - an Osiris drop";
+ mes "1 Rocker Doll - a Rocker drop";
+ mes "1 Apez Fanitem Doll - a Yoyo drop";
+ mes "1 Racoon Doll - a Smokie drop";
+ mes "1 Spore Doll - a Spore drop";
+ next;
+ mes "Finally, i worked hard to make these horns for my master with all the mentioned items above...";
+ mes "Please include 5 million zeny for my efforts.";
+ next;
+ mes "[Lord Kaho's Servant]";
+ mes ". . . . . .";
+ mes "Are you ready for me to make this special item?";
+ next;
+ menu "Sure am!",-,"These requirements are unfathomable!",LUnfathomable;
+
+ mes "[Lord Kaho's Servant]";
+ if(countitem(754) < 1 || countitem(753) < 1 || countitem(752) < 1 || countitem(751) < 1 || countitem(750) < 1
+ || countitem(743) < 1 || countitem(742) < 1 || countitem(741) < 1 || countitem(2613) < 1
+ || countitem(5053) < 1 || countitem(7020) < 1 || countitem(7036) < 1 || countitem(2268) < 1
+ || countitem(734) < 1 || countitem(923) < 1 || countitem(968) < 1 || countitem(7005) < 1
+ || countitem(714) < 3 || Zeny < 5000000) goto LNotEnough;
+ delitem 754,1;
+ delitem 753,1;
+ delitem 752,1;
+ delitem 751,1;
+ delitem 750,1;
+ delitem 743,1;
+ delitem 742,1;
+ delitem 741,1;
+ delitem 2613,1;
+ delitem 5053,1;
+ delitem 7020,1;
+ delitem 7036,1;
+ delitem 2268,1;
+ delitem 734,1;
+ delitem 923,1;
+ delitem 968,1;
+ delitem 7005,1;
+ delitem 714,3;
+ set Zeny,Zeny-5000000;
+ mes "Wow! You are brave indeed!";
+ getitem 5013,1;
+ mes ". . . . .";
+ mes "Enjoy being God of Rune Midgard!";
+ close;
+
+ LNotEnough:
+ mes ". . . . .";
+ mes ". . .I'm sorry .. You don't have enough money and items ..";
+ mes "I can't afford to make this if you don't bring all materials needed. Please understand this is to benefit heroes such as yourself!";
+ close;
+
+ LUnfathomable:
+ mes ". . . . .";
+ mes "What I had to go through was more unfathomable..";
+ mes "If you succeed in getting these items, you will have incredible strength!";
+ close;
+}
diff --git a/npc/custom/quests/kiel_quest.txt b/npc/custom/quests/kiel_quest.txt
index 862079f1d..cfc22e588 100644
--- a/npc/custom/quests/kiel_quest.txt
+++ b/npc/custom/quests/kiel_quest.txt
@@ -1,63 +1,63 @@
-//===== eAthena Script =======================================
-//= Custom Kiel Dungeon Warper
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= I't custom 8) But you have to pay every time u enter
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-prontera.gat,157,168,2 script Kiel Capry 68,{
- mes "[Kiel Capry]";
- mes callfunc("F_Hi");
- mes "Help us! Everybody's evacuated! There's an accident in my father's University...";
- if(rand(2))close;
- specialeffect 417;
- next;
- emotion e_wah;
- mes "[Kiel Capry]";
- mes "My father, ^FF0000Kiel Carlo^000000 is waiting for help in the broken elevator.";
- if(rand(2))close;
- next;
- mes "[Kiel Capry]";
- mes "What? Our home is located in the middle of ^FF0000Yuno field 08^000000...";
- close;
-}
-
-kh_school.gat,119,146,3 script Kiel Carlo 748,{
- mes "[Kiel Carlo]";
- mes callfunc("F_Hi");
- mes "We have evacuated all the students!";
- mes "What? Are you going to jump in the lift tunnel, just in hands of the gone bad robots?";
- mes "Well... we nedd money. Will you pay 10.000z?";
- next;
- emotion e_hmm;
- menu "Yep.",M_GO, "No way!",-;
-
- mes "[Kiel Carlo]";
- mes "Well... "+callfunc("F_Bye");
- close;
-
-M_GO:
- mes "[Kiel Carlo]";
- mes "I never let you go if you don't meet these conditions:";
- mes "1. You have to be 70 Base Level or upper.";
- mes "2. You have to donate 10.000 zeny.";
- next;
- if(BaseLevel<70 || Zeny<10000){
- mes "[Kiel Carlo]";
- mes "Alas... I can't let you in.";
- emotion e_sry;
- close;
- }
- set Zeny,Zeny-10000;
- warp "kh_kiehl02.gat",rand(46,53),rand(9,12);
- end;
-}
-
-kh_kiehl02.gat,49,5,0 warp warpk06 1,1,kh_school.gat,119,146
+//===== eAthena Script =======================================
+//= Custom Kiel Dungeon Warper
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= I't custom 8) But you have to pay every time u enter
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+prontera.gat,157,168,2 script Kiel Capry 68,{
+ mes "[Kiel Capry]";
+ mes callfunc("F_Hi");
+ mes "Help us! Everybody's evacuated! There's an accident in my father's University...";
+ if(rand(2))close;
+ specialeffect 417;
+ next;
+ emotion e_wah;
+ mes "[Kiel Capry]";
+ mes "My father, ^FF0000Kiel Carlo^000000 is waiting for help in the broken elevator.";
+ if(rand(2))close;
+ next;
+ mes "[Kiel Capry]";
+ mes "What? Our home is located in the middle of ^FF0000Yuno field 08^000000...";
+ close;
+}
+
+kh_school.gat,119,146,3 script Kiel Carlo 748,{
+ mes "[Kiel Carlo]";
+ mes callfunc("F_Hi");
+ mes "We have evacuated all the students!";
+ mes "What? Are you going to jump in the lift tunnel, just in hands of the gone bad robots?";
+ mes "Well... we nedd money. Will you pay 10.000z?";
+ next;
+ emotion e_hmm;
+ menu "Yep.",M_GO, "No way!",-;
+
+ mes "[Kiel Carlo]";
+ mes "Well... "+callfunc("F_Bye");
+ close;
+
+M_GO:
+ mes "[Kiel Carlo]";
+ mes "I never let you go if you don't meet these conditions:";
+ mes "1. You have to be 70 Base Level or upper.";
+ mes "2. You have to donate 10.000 zeny.";
+ next;
+ if(BaseLevel<70 || Zeny<10000){
+ mes "[Kiel Carlo]";
+ mes "Alas... I can't let you in.";
+ emotion e_sry;
+ close;
+ }
+ set Zeny,Zeny-10000;
+ warp "kh_kiehl02.gat",rand(46,53),rand(9,12);
+ end;
+}
+
+kh_kiehl02.gat,49,5,0 warp warpk06 1,1,kh_school.gat,119,146
diff --git a/npc/custom/quests/lvl99_quest.txt b/npc/custom/quests/lvl99_quest.txt
index aebb44d3d..9788cd57d 100644
--- a/npc/custom/quests/lvl99_quest.txt
+++ b/npc/custom/quests/lvl99_quest.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= Quest for 99 Base Level Players
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= It makes players stay longer at 99th level and get a
-//= Jewel Case as a reward
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-lighthalzen.gat,108,229,2 script La Fenn 766,{
- mes "[La Fenn]";
- if(BaseLevel<99) {
- if(Q_99LVL) {
- mes "You... You got younger!!! But you are defenitely YOU!";
- mes "I couldn't think you were able to meet my condition...";
- emotion e_hmm;
- next;
- mes "[La Fenn]";
- mes "Here is your prize. It's yours for good.";
- set Q_99LVL,0;
- getitem 12106,1; //Jewel Case
- emotion e_grat;
- } else {
- mes callfunc("F_Hi");
- mes "...";
- emotion e_yawn;
- next;
- mes "[La Fenn]";
- mes "I've got a riddle for a strong man of 2nd Class and 99 Base Level.";
- mes "*Yawn* If you meet some, please tell them about my riddle.";
- }
- close;
- }
- if(BaseLevel==99 && Upper==0) {
- if(Q_99LVL) {
- mes "Now go forth and get younger!";
- mes "If you solve my riddle, then I'll give you a magical Jewel Case with a rare accessory.";
- } else {
- mes callfunc("F_Hi")+" The Hero!";
- if(BaseExp<1000000) {
- mes "Now you're strong.";
- mes "But... not quite strong for my riddle.";
- if(rand(2)) {
- mes "Kill "+((1000000-BaseExp)/3765+1)+" more Seals and return.";
- } else {
- mes "Kill "+((1000000-BaseExp)/81+1)+" more Poporings and come back.";
- }
- } else {
- mes "Now you're REALLY strong.";
- mes "And if you get younger than now I'll give you my treasure.";
- set Q_99LVL,1;
- emotion e_no1;
- }
- }
- close;
- }
- emotion e_hmm;
- mes "...";
- close;
+//===== eAthena Script =======================================
+//= Quest for 99 Base Level Players
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= It makes players stay longer at 99th level and get a
+//= Jewel Case as a reward
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+lighthalzen.gat,108,229,2 script La Fenn 766,{
+ mes "[La Fenn]";
+ if(BaseLevel<99) {
+ if(Q_99LVL) {
+ mes "You... You got younger!!! But you are defenitely YOU!";
+ mes "I couldn't think you were able to meet my condition...";
+ emotion e_hmm;
+ next;
+ mes "[La Fenn]";
+ mes "Here is your prize. It's yours for good.";
+ set Q_99LVL,0;
+ getitem 12106,1; //Jewel Case
+ emotion e_grat;
+ } else {
+ mes callfunc("F_Hi");
+ mes "...";
+ emotion e_yawn;
+ next;
+ mes "[La Fenn]";
+ mes "I've got a riddle for a strong man of 2nd Class and 99 Base Level.";
+ mes "*Yawn* If you meet some, please tell them about my riddle.";
+ }
+ close;
+ }
+ if(BaseLevel==99 && Upper==0) {
+ if(Q_99LVL) {
+ mes "Now go forth and get younger!";
+ mes "If you solve my riddle, then I'll give you a magical Jewel Case with a rare accessory.";
+ } else {
+ mes callfunc("F_Hi")+" The Hero!";
+ if(BaseExp<1000000) {
+ mes "Now you're strong.";
+ mes "But... not quite strong for my riddle.";
+ if(rand(2)) {
+ mes "Kill "+((1000000-BaseExp)/3765+1)+" more Seals and return.";
+ } else {
+ mes "Kill "+((1000000-BaseExp)/81+1)+" more Poporings and come back.";
+ }
+ } else {
+ mes "Now you're REALLY strong.";
+ mes "And if you get younger than now I'll give you my treasure.";
+ set Q_99LVL,1;
+ emotion e_no1;
+ }
+ }
+ close;
+ }
+ emotion e_hmm;
+ mes "...";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/quests/magicalhatquest.txt b/npc/custom/quests/magicalhatquest.txt
index 69fb42390..dd5d04682 100644
--- a/npc/custom/quests/magicalhatquest.txt
+++ b/npc/custom/quests/magicalhatquest.txt
@@ -1,58 +1,58 @@
-//===== eAthena Script =======================================
-//= Wizard Hat Custom Quest
-//===== By: ==================================================
-//= Who
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Wizard Hat quest. Harmless, doesn't screw game balance.
-//===== Additional Comments: =================================
-//= 1.1 Reversed ingreadients and the quest result due to
-//= treasue boxes drops fix [Lupus]
-//============================================================
-
-geffen.gat,126,107,5 script Wizard Hat Dude 51,{
- mes "[Wizard Hat Dude]";
- mes "Huh! What do you want?";
- mes "Ohh, I see, you want me to make you something.";
- emotion e_what;
- next;
- mes "[Wizard Hat Dude]";
- mes "Well if you want this Wizard Hat here is a list of the items I need you to go out and get them for me:";
- mes "1 Magican Hat";
- mes "1 Bathory Card";
- mes "and 200,000z for my efforts";
- next;
- mes "[Wizard Hat Dude]";
- mes "Are you ready for me to make this magical item?";
- next;
- menu "Sure am!",-,"These requirements are unfathomable!",M_RIPOFF;
-
- mes "[Wizard Hat Dude]";
- if(countitem(5045) < 1 || countitem(4119) < 1 || Zeny < 200000) goto L_NotEnough;
- delitem 5045,1;
- delitem 4119,1;
- set Zeny,Zeny-200000;
- mes "Wow! You are brave indeed!";
- emotion e_no1;
- next;
- mes "[Wizard Hat Dude]";
- mes "Enjoy your Wizard Hat!";
- getitem 2252,1;
- close;
-
-L_NotEnough:
- mes ". . .I'm sorry .. You don't have enough money and items ..";
- mes "I can't afford to make this if you don't bring all materials needed. Please understand this is to benefit heroes such as yourself!";
- emotion e_sry;
- close;
-
-M_RIPOFF:
- mes "[Wizard Hat Dude]";
- mes "What I had to go through was more unfathomable..";
- mes "If you succeed in getting these items, you will have incredible strength!";
- emotion e_hmm;
- close;
-}
+//===== eAthena Script =======================================
+//= Wizard Hat Custom Quest
+//===== By: ==================================================
+//= Who
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Wizard Hat quest. Harmless, doesn't screw game balance.
+//===== Additional Comments: =================================
+//= 1.1 Reversed ingreadients and the quest result due to
+//= treasue boxes drops fix [Lupus]
+//============================================================
+
+geffen.gat,126,107,5 script Wizard Hat Dude 51,{
+ mes "[Wizard Hat Dude]";
+ mes "Huh! What do you want?";
+ mes "Ohh, I see, you want me to make you something.";
+ emotion e_what;
+ next;
+ mes "[Wizard Hat Dude]";
+ mes "Well if you want this Wizard Hat here is a list of the items I need you to go out and get them for me:";
+ mes "1 Magican Hat";
+ mes "1 Bathory Card";
+ mes "and 200,000z for my efforts";
+ next;
+ mes "[Wizard Hat Dude]";
+ mes "Are you ready for me to make this magical item?";
+ next;
+ menu "Sure am!",-,"These requirements are unfathomable!",M_RIPOFF;
+
+ mes "[Wizard Hat Dude]";
+ if(countitem(5045) < 1 || countitem(4119) < 1 || Zeny < 200000) goto L_NotEnough;
+ delitem 5045,1;
+ delitem 4119,1;
+ set Zeny,Zeny-200000;
+ mes "Wow! You are brave indeed!";
+ emotion e_no1;
+ next;
+ mes "[Wizard Hat Dude]";
+ mes "Enjoy your Wizard Hat!";
+ getitem 2252,1;
+ close;
+
+L_NotEnough:
+ mes ". . .I'm sorry .. You don't have enough money and items ..";
+ mes "I can't afford to make this if you don't bring all materials needed. Please understand this is to benefit heroes such as yourself!";
+ emotion e_sry;
+ close;
+
+M_RIPOFF:
+ mes "[Wizard Hat Dude]";
+ mes "What I had to go through was more unfathomable..";
+ mes "If you succeed in getting these items, you will have incredible strength!";
+ emotion e_hmm;
+ close;
+}
diff --git a/npc/custom/quests/may_hats.txt b/npc/custom/quests/may_hats.txt
index f514432c3..2c8d6dfb8 100644
--- a/npc/custom/quests/may_hats.txt
+++ b/npc/custom/quests/may_hats.txt
@@ -1,180 +1,180 @@
-//===== eAthena Script =======================================
-//= Quests: Bird Nest, Lion Mask, Skeleton Manteau,
-//= Fashion Hip Sack & Sales Banner
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.01
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Custom quest for some RO mobile game bonus items
-//===== Additional Comments: =================================
-//= 1 May, 2006
-//= 1.01 translated the rest of dialogues
-//============================================================
-
-gonryun.gat,187,140,4 script Yakima 850,{
- mes "[Yakima]";
- mes callfunc("F_Hi");
- mes "I can make some items for you.";
- mes "They are quite rare novadays...";
- specialeffect 417;
- next;
- menu "Bird Nest",-,"Lion Mask",M_2,"Skeleton Manteau",M_3,"Fashion Hip Sack",M_4,"Sales Banner",M_5,"Leave",M_EXIT;
-
- mes "[Yakima]";
- mes "Oh.. it's an excellent item for any beast hunter.";
- emotion e_rock;
- next;
- mes "[Yakima]";
- mes "For the hat I'll need:";
- mes "1 Sombrero,";
- mes "920 Feathers of Birds and";
- mes "310 Bills of Birds.";
- next;
- mes "[Yakima]";
- mes "Do you have all the items?";
- next;
- menu "Yeah.",-,"Nay.",M_EXIT;
-
- if(countitem(5067) < 1 || countitem(916) < 920 || countitem(925) < 310) GOTO L_NOITEM;//Items: Sombrero, Feather_of_Birds, Bill_of_Birds,
- delitem 5067,1;//Items: Sombrero,
- delitem 916,920;//Items: Feather_of_Birds,
- delitem 925,310;//Items: Bill_of_Birds,
- getitem 5129,1;//Items: Bird_Nest,
- mes "[Yakima]";
- mes "Thank you very very much!";
- mes callfunc("F_Bye");
- close;
-
-M_2:
- mes "[Yakima]";
- mes "Bingo! Many people are afraid of lions... to the muteness...";
- emotion e_slur;
- next;
- mes "[Yakima]";
- mes "For the hat I'll need:";
- mes "1 Tiger Mask,";
- mes "10 Tiger's Footskins,";
- mes "30 Tiger Skins and";
- mes "300 Tiger Panties.";
- next;
- mes "[Yakima]";
- mes "Do you have all the items?";
- next;
- menu "Yeah.",-,"Nay.",M_EXIT;
-
- if(countitem(5098) < 1 || countitem(1030) < 10 || countitem(1029) < 30 || countitem(7267) < 300) GOTO L_NOITEM;//Items: Tiger_Mask, Tiger_Skin, Tiger's_Footskin, Tiger_Panty,
- delitem 5098,1;//Items: Tiger_Mask,
- delitem 1030,10;//Items: Tiger's_Footskin,
- delitem 1029,30;//Items: Tiger_Skin,
- delitem 7267,300;//Items: Tiger_Panty,
- getitem 5130,1;//Items: Lion_Mask,
- mes "[Yakima]";
- mes "Thank you very very much!";
- mes callfunc("F_Bye");
- close;
-
-M_3:
- mes "[Yakima]";
- mes "I wish I sold this filthy manteau faster...";
- mes "Guess it isn't so plain as it looks... Hmm.";
- emotion e_wah;
- next;
- mes "[Yakima]";
- mes "I'm giving it almost for free:";
- mes "10 Old Manteaus,";
- mes "3 Skull Rings,";
- mes "2 Manteau[1] and";
- mes "1 Ragamuffin Manteau.";
- next;
- mes "[Yakima]";
- mes "Do you have all the items?";
- next;
- menu "Yeah.",-,"Nay.",M_EXIT;
-
- if(countitem(2508) < 1 || countitem(2506) < 2 || countitem(2609) < 3 || countitem(7207) < 10) GOTO L_NOITEM;//Items: Ragamuffin_Manteau, Manteau_, Skull_Ring, Old_Manteau,
- delitem 2508,1;//Items: Ragamuffin_Manteau,
- delitem 2506,2;//Items: Manteau_,
- delitem 2609,3;//Items: Skull_Ring,
- delitem 7207,10;//Items: Old_Manteau,
- getitem 2511,1;//Items: Skeleton_Manteau,
- mes "[Yakima]";
- mes "Thank you very very much!";
- mes callfunc("F_Bye");
- close;
-
-M_4:
- mes "[Yakima]";
- mes "It's a fresh style! Ancessory and a bag all in one! You'd get +2 STR... It's different from that sabby nest!";
- mes "It fits to Merchant classonly.";
- emotion e_heh;
- next;
- mes "[Yakima]";
- mes "Now my stock is full of those bags... So I'll make it from 3 flower things and a rough piece of clothes:";
- mes "3 Romantic Flowers,";
- mes "3 Fancy Flowers,";
- mes "2 Flower Rings and";
- mes "3 Pirate Bandanas.";
- next;
- mes "[Yakima]";
- mes "Do you have all the items?";
- next;
- menu "Yeah.",-,"Nay.",M_EXIT;
-
- if(countitem(2269) < 3 || countitem(2207) < 3 || countitem(2612) < 2 || countitem(2287)<3 ) GOTO L_NOITEM;//Items: Romantic_Flower, Fancy_Flower, Flower_Ring,
- delitem 2269,3;//Items: Romantic_Flower,
- delitem 2207,3;//Items: Fancy_Flower,
- delitem 2612,2;//Items: Flower_Ring,
- delitem 2287,3;//Items: Pirate_Bandana
- getitem 2641,1;//Items: Fashion_Hip_Sack,
- mes "[Yakima]";
- mes "Thank you very very much!";
- mes callfunc("F_Bye");
- close;
-
-M_5:
- mes "[Yakima]";
- mes "Well, well, well... this sign fits any class from a certain level!";
- mes "Your foes'd be dazzled!";
- emotion e_no1;
- next;
- mes "[Yakima]";
- mes "Well... we construct it from some common items:";
- mes "1 Scarlet Dyestuff,";
- mes "1 Orange Dyestuff,";
- mes "2 Stop Posts,";
- mes "3 Clown Noses,";
- mes "180 Fig Leaves and";
- mes "20 Solid Peaches.";
- next;
- mes "[Yakima]";
- mes "Do you have all the items?";
- next;
- menu "Yeah.",-,"Nay.",M_EXIT;
-
- if(countitem(975) < 1 || countitem(980) < 1 || countitem(2272) < 2 || countitem(2262) < 3 || countitem(7298) < 180 || countitem(7164) < 20) GOTO L_NOITEM;//Items: Scarlet_Dyestuff, Orange_Dyestuff, Stop_Post, Clown_Nose, Fig_Leaf, Solid_Peach,
- delitem 975,1;//Items: Scarlet_Dyestuff,
- delitem 980,1;//Items: Orange_Dyestuff,
- delitem 2272,2;//Items: Stop_Post,
- delitem 2262,3;//Items: Clown_Nose,
- delitem 7298,180;//Items: Fig_Leaf,
- delitem 7164,20;//Items: Solid_Peach,
- getitem 5100,1;//Items: Sales_Banner,
- mes "[Yakima]";
- mes "Thank you very very much!";
- mes callfunc("F_Bye");
- close;
-
-L_NOITEM:
- mes "[Yakima]";
- mes "You are lack of items. Please, get all the items.";
- emotion e_sry;
- close;
-
-M_EXIT:
- mes "[Yakima]";
- mes callfunc("F_Bye");
- close;
-}
+//===== eAthena Script =======================================
+//= Quests: Bird Nest, Lion Mask, Skeleton Manteau,
+//= Fashion Hip Sack & Sales Banner
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.01
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Custom quest for some RO mobile game bonus items
+//===== Additional Comments: =================================
+//= 1 May, 2006
+//= 1.01 translated the rest of dialogues
+//============================================================
+
+gonryun.gat,187,140,4 script Yakima 850,{
+ mes "[Yakima]";
+ mes callfunc("F_Hi");
+ mes "I can make some items for you.";
+ mes "They are quite rare novadays...";
+ specialeffect 417;
+ next;
+ menu "Bird Nest",-,"Lion Mask",M_2,"Skeleton Manteau",M_3,"Fashion Hip Sack",M_4,"Sales Banner",M_5,"Leave",M_EXIT;
+
+ mes "[Yakima]";
+ mes "Oh.. it's an excellent item for any beast hunter.";
+ emotion e_rock;
+ next;
+ mes "[Yakima]";
+ mes "For the hat I'll need:";
+ mes "1 Sombrero,";
+ mes "920 Feathers of Birds and";
+ mes "310 Bills of Birds.";
+ next;
+ mes "[Yakima]";
+ mes "Do you have all the items?";
+ next;
+ menu "Yeah.",-,"Nay.",M_EXIT;
+
+ if(countitem(5067) < 1 || countitem(916) < 920 || countitem(925) < 310) GOTO L_NOITEM;//Items: Sombrero, Feather_of_Birds, Bill_of_Birds,
+ delitem 5067,1;//Items: Sombrero,
+ delitem 916,920;//Items: Feather_of_Birds,
+ delitem 925,310;//Items: Bill_of_Birds,
+ getitem 5129,1;//Items: Bird_Nest,
+ mes "[Yakima]";
+ mes "Thank you very very much!";
+ mes callfunc("F_Bye");
+ close;
+
+M_2:
+ mes "[Yakima]";
+ mes "Bingo! Many people are afraid of lions... to the muteness...";
+ emotion e_slur;
+ next;
+ mes "[Yakima]";
+ mes "For the hat I'll need:";
+ mes "1 Tiger Mask,";
+ mes "10 Tiger's Footskins,";
+ mes "30 Tiger Skins and";
+ mes "300 Tiger Panties.";
+ next;
+ mes "[Yakima]";
+ mes "Do you have all the items?";
+ next;
+ menu "Yeah.",-,"Nay.",M_EXIT;
+
+ if(countitem(5098) < 1 || countitem(1030) < 10 || countitem(1029) < 30 || countitem(7267) < 300) GOTO L_NOITEM;//Items: Tiger_Mask, Tiger_Skin, Tiger's_Footskin, Tiger_Panty,
+ delitem 5098,1;//Items: Tiger_Mask,
+ delitem 1030,10;//Items: Tiger's_Footskin,
+ delitem 1029,30;//Items: Tiger_Skin,
+ delitem 7267,300;//Items: Tiger_Panty,
+ getitem 5130,1;//Items: Lion_Mask,
+ mes "[Yakima]";
+ mes "Thank you very very much!";
+ mes callfunc("F_Bye");
+ close;
+
+M_3:
+ mes "[Yakima]";
+ mes "I wish I sold this filthy manteau faster...";
+ mes "Guess it isn't so plain as it looks... Hmm.";
+ emotion e_wah;
+ next;
+ mes "[Yakima]";
+ mes "I'm giving it almost for free:";
+ mes "10 Old Manteaus,";
+ mes "3 Skull Rings,";
+ mes "2 Manteau[1] and";
+ mes "1 Ragamuffin Manteau.";
+ next;
+ mes "[Yakima]";
+ mes "Do you have all the items?";
+ next;
+ menu "Yeah.",-,"Nay.",M_EXIT;
+
+ if(countitem(2508) < 1 || countitem(2506) < 2 || countitem(2609) < 3 || countitem(7207) < 10) GOTO L_NOITEM;//Items: Ragamuffin_Manteau, Manteau_, Skull_Ring, Old_Manteau,
+ delitem 2508,1;//Items: Ragamuffin_Manteau,
+ delitem 2506,2;//Items: Manteau_,
+ delitem 2609,3;//Items: Skull_Ring,
+ delitem 7207,10;//Items: Old_Manteau,
+ getitem 2511,1;//Items: Skeleton_Manteau,
+ mes "[Yakima]";
+ mes "Thank you very very much!";
+ mes callfunc("F_Bye");
+ close;
+
+M_4:
+ mes "[Yakima]";
+ mes "It's a fresh style! Ancessory and a bag all in one! You'd get +2 STR... It's different from that sabby nest!";
+ mes "It fits to Merchant classonly.";
+ emotion e_heh;
+ next;
+ mes "[Yakima]";
+ mes "Now my stock is full of those bags... So I'll make it from 3 flower things and a rough piece of clothes:";
+ mes "3 Romantic Flowers,";
+ mes "3 Fancy Flowers,";
+ mes "2 Flower Rings and";
+ mes "3 Pirate Bandanas.";
+ next;
+ mes "[Yakima]";
+ mes "Do you have all the items?";
+ next;
+ menu "Yeah.",-,"Nay.",M_EXIT;
+
+ if(countitem(2269) < 3 || countitem(2207) < 3 || countitem(2612) < 2 || countitem(2287)<3 ) GOTO L_NOITEM;//Items: Romantic_Flower, Fancy_Flower, Flower_Ring,
+ delitem 2269,3;//Items: Romantic_Flower,
+ delitem 2207,3;//Items: Fancy_Flower,
+ delitem 2612,2;//Items: Flower_Ring,
+ delitem 2287,3;//Items: Pirate_Bandana
+ getitem 2641,1;//Items: Fashion_Hip_Sack,
+ mes "[Yakima]";
+ mes "Thank you very very much!";
+ mes callfunc("F_Bye");
+ close;
+
+M_5:
+ mes "[Yakima]";
+ mes "Well, well, well... this sign fits any class from a certain level!";
+ mes "Your foes'd be dazzled!";
+ emotion e_no1;
+ next;
+ mes "[Yakima]";
+ mes "Well... we construct it from some common items:";
+ mes "1 Scarlet Dyestuff,";
+ mes "1 Orange Dyestuff,";
+ mes "2 Stop Posts,";
+ mes "3 Clown Noses,";
+ mes "180 Fig Leaves and";
+ mes "20 Solid Peaches.";
+ next;
+ mes "[Yakima]";
+ mes "Do you have all the items?";
+ next;
+ menu "Yeah.",-,"Nay.",M_EXIT;
+
+ if(countitem(975) < 1 || countitem(980) < 1 || countitem(2272) < 2 || countitem(2262) < 3 || countitem(7298) < 180 || countitem(7164) < 20) GOTO L_NOITEM;//Items: Scarlet_Dyestuff, Orange_Dyestuff, Stop_Post, Clown_Nose, Fig_Leaf, Solid_Peach,
+ delitem 975,1;//Items: Scarlet_Dyestuff,
+ delitem 980,1;//Items: Orange_Dyestuff,
+ delitem 2272,2;//Items: Stop_Post,
+ delitem 2262,3;//Items: Clown_Nose,
+ delitem 7298,180;//Items: Fig_Leaf,
+ delitem 7164,20;//Items: Solid_Peach,
+ getitem 5100,1;//Items: Sales_Banner,
+ mes "[Yakima]";
+ mes "Thank you very very much!";
+ mes callfunc("F_Bye");
+ close;
+
+L_NOITEM:
+ mes "[Yakima]";
+ mes "You are lack of items. Please, get all the items.";
+ emotion e_sry;
+ close;
+
+M_EXIT:
+ mes "[Yakima]";
+ mes callfunc("F_Bye");
+ close;
+}
diff --git a/npc/custom/quests/sphinx_mask.txt b/npc/custom/quests/sphinx_mask.txt
index 2ebffe22a..59d36ad05 100644
--- a/npc/custom/quests/sphinx_mask.txt
+++ b/npc/custom/quests/sphinx_mask.txt
@@ -1,80 +1,80 @@
-//===== eAthena Script =======================================
-//= Sphinx Mask Quest (custom)
-//===== By: ==================================================
-//= sabernet09 & eAthena Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= this quest is related to Umbalian Chief
-//= 1.1 Removed it from official Umbala quests [Lupus]
-//= 1.2 Added a missing variable (sphmask_q) [erKURITA]
-//============================================================
-
-
-//===========================================================================
-morocc.gat,140,156,5 script Turban Thief 58,{
- if(event_umbala < 2) goto AWAY;
- if(sphmask_q) goto NoBus;
- mes "[Turban Thief]";
- mes "E'llo mah frien, would I interesst tu with this rare mask? Its value I assure you is real mah frien. Tis manific!";
- next;
- mes "[Turban Thief]";
- mes "Wah? O ho ho ho, so you know thaz I steal dis from those savages no? Well I won'tz give it back. But I will for a pricez... wat you say?";
- next;
- menu "Pay 1,000,000z",-,"No deal",NoGo;
-
- if(Zeny < 1000000) goto NotEnough;
- set Zeny,Zeny-1000000;
- mes "[Turban Thief]";
- mes "O ho ho, its a deal then!";
- getitem 7114,1;//Items: Sphinx Mask,
- set sphmask_q,1;
- close;
-
- NoGo:
- mes "[Turban Thief]";
- mes "Ahh a business man are you no? Fine, how about...";
- next;
- menu "Pay 750,000",-,"Nope lower",NoGoB;
-
- if(Zeny < 750000) goto NotEnough;
- set Zeny,Zeny-750000;
- mes "[Turban Thief]";
- mes "It is a done deal, no refunds!";
- getitem 7114,1;//Items: Sphinx Mask,
- set sphmask_q,1;
- close;
- NoGoB:
- mes "[Turban Thief]";
- mes "Hmmm... you drive a hard bargain, ok... my final offer...";
- next;
- menu "Pay 500,000",-,"It can go lower than that.",NoGoC;
-
- if(Zeny < 500000) goto NotEnough;
- set Zeny,Zeny-500000;
- mes "[Turban Thief]";
- mes "Alright, here you go then...";
- getitem 7114,1;//Items: Sphinx Mask,
- set sphmask_q,1;
- close;
- NoGoC:
- next;
- mes "[Turban Thief]";
- mes "Ack! Forgez it! I can do bettaz en elsez where!";
- set sphmask_q,1;
- close;
- NoBus:
- mes "[Turban Thief]";
- mes "You have no more business with me, go away!";
- close;
- AWAY:
- mes "[Turban Thief]";
- mes "What do you wan te withz me? Be gone!";
- close;
- NotEnough:
- mes "[Turban Thief]";
- mes "Are youz playin wit me? You don't have ze money!";
- close;
+//===== eAthena Script =======================================
+//= Sphinx Mask Quest (custom)
+//===== By: ==================================================
+//= sabernet09 & eAthena Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= this quest is related to Umbalian Chief
+//= 1.1 Removed it from official Umbala quests [Lupus]
+//= 1.2 Added a missing variable (sphmask_q) [erKURITA]
+//============================================================
+
+
+//===========================================================================
+morocc.gat,140,156,5 script Turban Thief 58,{
+ if(event_umbala < 2) goto AWAY;
+ if(sphmask_q) goto NoBus;
+ mes "[Turban Thief]";
+ mes "E'llo mah frien, would I interesst tu with this rare mask? Its value I assure you is real mah frien. Tis manific!";
+ next;
+ mes "[Turban Thief]";
+ mes "Wah? O ho ho ho, so you know thaz I steal dis from those savages no? Well I won'tz give it back. But I will for a pricez... wat you say?";
+ next;
+ menu "Pay 1,000,000z",-,"No deal",NoGo;
+
+ if(Zeny < 1000000) goto NotEnough;
+ set Zeny,Zeny-1000000;
+ mes "[Turban Thief]";
+ mes "O ho ho, its a deal then!";
+ getitem 7114,1;//Items: Sphinx Mask,
+ set sphmask_q,1;
+ close;
+
+ NoGo:
+ mes "[Turban Thief]";
+ mes "Ahh a business man are you no? Fine, how about...";
+ next;
+ menu "Pay 750,000",-,"Nope lower",NoGoB;
+
+ if(Zeny < 750000) goto NotEnough;
+ set Zeny,Zeny-750000;
+ mes "[Turban Thief]";
+ mes "It is a done deal, no refunds!";
+ getitem 7114,1;//Items: Sphinx Mask,
+ set sphmask_q,1;
+ close;
+ NoGoB:
+ mes "[Turban Thief]";
+ mes "Hmmm... you drive a hard bargain, ok... my final offer...";
+ next;
+ menu "Pay 500,000",-,"It can go lower than that.",NoGoC;
+
+ if(Zeny < 500000) goto NotEnough;
+ set Zeny,Zeny-500000;
+ mes "[Turban Thief]";
+ mes "Alright, here you go then...";
+ getitem 7114,1;//Items: Sphinx Mask,
+ set sphmask_q,1;
+ close;
+ NoGoC:
+ next;
+ mes "[Turban Thief]";
+ mes "Ack! Forgez it! I can do bettaz en elsez where!";
+ set sphmask_q,1;
+ close;
+ NoBus:
+ mes "[Turban Thief]";
+ mes "You have no more business with me, go away!";
+ close;
+ AWAY:
+ mes "[Turban Thief]";
+ mes "What do you wan te withz me? Be gone!";
+ close;
+ NotEnough:
+ mes "[Turban Thief]";
+ mes "Are youz playin wit me? You don't have ze money!";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/quests/sunglasses.txt b/npc/custom/quests/sunglasses.txt
index f8830eec6..bcd4cf364 100644
--- a/npc/custom/quests/sunglasses.txt
+++ b/npc/custom/quests/sunglasses.txt
@@ -1,144 +1,144 @@
-//===== eAthena Script =======================================
-//= Quest For Slotted Sunglasses
-//===== By: ==================================================
-//= Aegis - amichan
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any eAthena Version;
-//===== Description: =========================================
-//= Quest to get Slotted Sunglasses
-//===== Additional Comments: =================================
-//= 1.0 by Aegis 1.1 by aichan 1.2 by x[tsk] 1.3 by Darkchild
-//= 1.5 Fixed Exploit [Lupus]
-//============================================================
-
-// quest will reset it self after 1 pair of Slotted Sunglasses is made.
-// 1st part of the quest
-
-alberta.gat,88,193,5 script Sunglasses Trader 73,{
- if(SG_QUEST1 == 1) goto L_SG_Q1_Done;
- mes "[Sunglasses Trader]";
- mes "Hello. What can I do for you?";
- next;
- menu "I heard that you can make ^0000FFSlotted Sunglasses^000000.",-,"Nothing, sorry to bother you.",L_SG_No;
-
- mes "[Sunglasses Trader]";
- mes "I do not make them, but I can tell you where to find the person who does. For a small fee...";
- next;
- menu "How much?",L_SG_1,"No way, I will find her, myself!",-;
-
- mes "[Sunglasses Trader]";
- mes "Suit yourself, the Maker will not make you ^0000FFSlotted Sunglasses^000000 unless she knows that you are coming.";
- mes "Only I can tell her you are coming.";
- next;
- mes "[Sunglasses Trader]";
- mes "Come back to me, when you have given up. Hahaha.";
- close;
-L_SG_1:
- mes "[Sunglasses Trader]";
- mes "In order for me to tell you information on ^0000FFSlotted Sunglasses^000000 you need to get me: ";
- mes "^0000881 Carat Diamond^000000, ";
- mes "^00008850 Feathers^000000, ";
- mes "and ^000088100000z^000000.";
- next;
- menu "Alright, here.",L_SG_1_Check,"That's too much!",-;
-
- mes "[Sunglasses Trader]";
- mes "Suit Yourself.";
- close;
-L_SG_1_Check:
- if (countitem(730) < 1) goto L_SG_Diamond;
- if (countitem(949) < 50) goto L_SG_Feathers;
- if (zeny<100000) goto L_SG_Funds;
- delitem 730,1;
- delitem 949,50;
- set zeny,zeny-100000;
- set SG_QUEST1,1;
- mes "[Sunglasses Trader]";
- mes "Great. Now, listen carefully.";
- next;
- mes "[Sunglasses Trader]";
- mes "Look for someone name Maseph somewhere in the east of Morroc.";
- mes "I will send her a message to let her know that you are coming.";
- close;
-L_SG_Diamond:
- mes "[Sunglasses Trader]";
- mes "You do not have the ^0000881 Carat Diamond^000000. Come back to me when you do.";
- close;
-L_SG_Feathers:
- mes "[Sunglasses Trader]";
- mes "You do not have ^00008850 Feathers^000000. Come back to me when you do.";
- close;
-L_SG_Funds:
- mes "[Sunglasses Trader]";
- mes "You do not have ^000088100000z^000000. Come back to me when you do.";
- close;
-L_SG_Q1_Done:
- mes "[Sunglasses Trader]";
- mes "There is nothing more I can tell you.";
- next;
- mes "[Sunglasses Trader]";
- mes "Go see Maseph. She is somewhere east of Morroc.";
- close;
-L_SG_No:
- mes "[Sunglasses Trader]";
- mes "Come back to me than you are ready.";
- close;
-}
-
-// 2nd part of the quest
-
-moc_fild09.gat,209,128,5 script Maseph 702,{
- if(SG_QUEST1 == 1) goto L_SG_2;
- mes "[Maseph]";
- mes "Lovely Day, isn't it ?";
- close;
-L_SG_2:
- mes "[Maseph]";
- mes "Hello there.";
- next;
- mes "[Maseph]";
- mes "You came for the ^000088Slotted Sunglasses^000000, right?";
- next;
- menu "Yes",L_SG_2_Start,"No, sorry to bother you.",-;
-
- mes "[Maseph]";
- mes "Off you go, then.";
- close;
-L_SG_2_Start:
- mes "[Maseph]";
- mes "To make one, I will need one pair of ^000088Sunglasses^000000 and 400000z.";
- next;
- menu "Here you go.",L_SG_Q2_Check,"No, thanks.",-;
-
- mes "[Maseph]";
- mes "As you wish.";
- close;
-L_SG_Q2_Check:
- if(countitem(2201) < 1) goto L_SG_Sunglasses;
- if(zeny<400000) goto L_SG_Funds;
- delitem 2201,1;
- set zeny,zeny-400000;
- mes "[Maseph]";
- mes "Thank you. I will get on it right away.";
- next;
- mes "[Maseph]";
- mes "Here you go my friend.";
- getitem 2202,1;
- next;
- mes "[Maseph]";
- mes "Enjoy your ^000088Slotted Sunglasses^000000.";
-// quest reset
- set SG_QUEST1,0;
- close;
-L_SG_Sunglasses:
- mes "[Maseph]";
- mes "I need one pair of ^000088Sunglasses^000000. Come back to me when you have one.";
- close;
-L_SG_Funds:
- mes "[Maseph]";
- mes "You do not have enough money. Please come back to me when you do.";
- close;
-}
-
+//===== eAthena Script =======================================
+//= Quest For Slotted Sunglasses
+//===== By: ==================================================
+//= Aegis - amichan
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any eAthena Version;
+//===== Description: =========================================
+//= Quest to get Slotted Sunglasses
+//===== Additional Comments: =================================
+//= 1.0 by Aegis 1.1 by aichan 1.2 by x[tsk] 1.3 by Darkchild
+//= 1.5 Fixed Exploit [Lupus]
+//============================================================
+
+// quest will reset it self after 1 pair of Slotted Sunglasses is made.
+// 1st part of the quest
+
+alberta.gat,88,193,5 script Sunglasses Trader 73,{
+ if(SG_QUEST1 == 1) goto L_SG_Q1_Done;
+ mes "[Sunglasses Trader]";
+ mes "Hello. What can I do for you?";
+ next;
+ menu "I heard that you can make ^0000FFSlotted Sunglasses^000000.",-,"Nothing, sorry to bother you.",L_SG_No;
+
+ mes "[Sunglasses Trader]";
+ mes "I do not make them, but I can tell you where to find the person who does. For a small fee...";
+ next;
+ menu "How much?",L_SG_1,"No way, I will find her, myself!",-;
+
+ mes "[Sunglasses Trader]";
+ mes "Suit yourself, the Maker will not make you ^0000FFSlotted Sunglasses^000000 unless she knows that you are coming.";
+ mes "Only I can tell her you are coming.";
+ next;
+ mes "[Sunglasses Trader]";
+ mes "Come back to me, when you have given up. Hahaha.";
+ close;
+L_SG_1:
+ mes "[Sunglasses Trader]";
+ mes "In order for me to tell you information on ^0000FFSlotted Sunglasses^000000 you need to get me: ";
+ mes "^0000881 Carat Diamond^000000, ";
+ mes "^00008850 Feathers^000000, ";
+ mes "and ^000088100000z^000000.";
+ next;
+ menu "Alright, here.",L_SG_1_Check,"That's too much!",-;
+
+ mes "[Sunglasses Trader]";
+ mes "Suit Yourself.";
+ close;
+L_SG_1_Check:
+ if (countitem(730) < 1) goto L_SG_Diamond;
+ if (countitem(949) < 50) goto L_SG_Feathers;
+ if (zeny<100000) goto L_SG_Funds;
+ delitem 730,1;
+ delitem 949,50;
+ set zeny,zeny-100000;
+ set SG_QUEST1,1;
+ mes "[Sunglasses Trader]";
+ mes "Great. Now, listen carefully.";
+ next;
+ mes "[Sunglasses Trader]";
+ mes "Look for someone name Maseph somewhere in the east of Morroc.";
+ mes "I will send her a message to let her know that you are coming.";
+ close;
+L_SG_Diamond:
+ mes "[Sunglasses Trader]";
+ mes "You do not have the ^0000881 Carat Diamond^000000. Come back to me when you do.";
+ close;
+L_SG_Feathers:
+ mes "[Sunglasses Trader]";
+ mes "You do not have ^00008850 Feathers^000000. Come back to me when you do.";
+ close;
+L_SG_Funds:
+ mes "[Sunglasses Trader]";
+ mes "You do not have ^000088100000z^000000. Come back to me when you do.";
+ close;
+L_SG_Q1_Done:
+ mes "[Sunglasses Trader]";
+ mes "There is nothing more I can tell you.";
+ next;
+ mes "[Sunglasses Trader]";
+ mes "Go see Maseph. She is somewhere east of Morroc.";
+ close;
+L_SG_No:
+ mes "[Sunglasses Trader]";
+ mes "Come back to me than you are ready.";
+ close;
+}
+
+// 2nd part of the quest
+
+moc_fild09.gat,209,128,5 script Maseph 702,{
+ if(SG_QUEST1 == 1) goto L_SG_2;
+ mes "[Maseph]";
+ mes "Lovely Day, isn't it ?";
+ close;
+L_SG_2:
+ mes "[Maseph]";
+ mes "Hello there.";
+ next;
+ mes "[Maseph]";
+ mes "You came for the ^000088Slotted Sunglasses^000000, right?";
+ next;
+ menu "Yes",L_SG_2_Start,"No, sorry to bother you.",-;
+
+ mes "[Maseph]";
+ mes "Off you go, then.";
+ close;
+L_SG_2_Start:
+ mes "[Maseph]";
+ mes "To make one, I will need one pair of ^000088Sunglasses^000000 and 400000z.";
+ next;
+ menu "Here you go.",L_SG_Q2_Check,"No, thanks.",-;
+
+ mes "[Maseph]";
+ mes "As you wish.";
+ close;
+L_SG_Q2_Check:
+ if(countitem(2201) < 1) goto L_SG_Sunglasses;
+ if(zeny<400000) goto L_SG_Funds;
+ delitem 2201,1;
+ set zeny,zeny-400000;
+ mes "[Maseph]";
+ mes "Thank you. I will get on it right away.";
+ next;
+ mes "[Maseph]";
+ mes "Here you go my friend.";
+ getitem 2202,1;
+ next;
+ mes "[Maseph]";
+ mes "Enjoy your ^000088Slotted Sunglasses^000000.";
+// quest reset
+ set SG_QUEST1,0;
+ close;
+L_SG_Sunglasses:
+ mes "[Maseph]";
+ mes "I need one pair of ^000088Sunglasses^000000. Come back to me when you have one.";
+ close;
+L_SG_Funds:
+ mes "[Maseph]";
+ mes "You do not have enough money. Please come back to me when you do.";
+ close;
+}
+
diff --git a/npc/custom/quests/tha_statues.txt b/npc/custom/quests/tha_statues.txt
index d33811847..9a9bdd29f 100644
--- a/npc/custom/quests/tha_statues.txt
+++ b/npc/custom/quests/tha_statues.txt
@@ -1,277 +1,277 @@
-//===== eAthena Script =======================================
-//= Custom Thanatos Tower Quest
-//===== By: ==================================================
-//= Bibilol & Moryagorn
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any eAthena Version;
-//===== Description: =========================================
-//= Custom Thanatos Tower Quest
-//===== Additional Comments: =================================
-//= 1.1 Fixed wrong NPC names in their dialogues, added
-//= Justin84's gems check in Sox NPC [Lupus]
-//============================================================
-
-
-//Statue (NPC)(U: UP, D: DOWN, R: RIGHT, L: LEFT) :
-// Explain Npc
-tha_t08.gat,69,106,4 script Statue 111,{
-
- mes "You can read on the back of the statue:";
- mes "'By the spirit of olds, the walls are closed";
- mes "Upper floors or foreign taboo";
- mes "By the order of the Statues you will find the way";
- mes "Which perhaps a day will bring you to me.";
- mes ".....Thanatos '";
- close;
-}
-
-//Tha_t09 :
-//(Thalos)(U,L)-->tha_t09.gat,17,158,4
-//(Mediane)(D,R)-->tha_t09.gat,84,99,4
-//Script:
-
-tha_t09.gat,17,158,4 script Thalos 111,{
-
- if(TSQ_CHK == 1) goto done;
- mes "[Thalos]";
- mes "You must find the 2nd Statue now.";
- set TSQ_CHK,1;
- close;
-
-done:
- mes "[Thalos]";
- mes "Go search the 2nd Statue!";
- close;
-
-}
-
-tha_t09.gat,84,99,4 script Mediane 111,{
-
- if(TSQ_CHK != 1) goto nook;
- mes "[Mediane]";
- mes "Okay, i am warping you to the next floor now.";
- next;
- set TSQ_CHK,0;
- warp "tha_t10.gat", 165, 138;
- close;
-nook:
- mes "[Mediane]";
- mes "You must talk with the Spirit in the 1st Statue.";
- close;
-}
-
-//Tha_t10 :
-//(Melkor)(U)-->tha_t10.gat,130,159,4
-//(Zebrus)(D,R)-->tha_t10.gat,160,98,4
-//(Veriaelle)(D,L)-->tha_t10.gat,99,97,4
-//Script:
-
-tha_t10.gat,130,159,4 script Melkor 111,{
-
- if(TSQ_CHK == 1) goto done;
- mes "[Melkor]";
- mes "You must find the other Spirits now.";
- mes "We are 3.";
- set TSQ_CHK,1;
- close;
-done:
- mes "[Melkor]";
- mes "Go Search, They are in this floor.";
- close;
-}
-
-tha_t10.gat,160,98,4 script Zebrus 111,{
-
- if(TSQ_CHK != 1) goto nook;
- mes "[Zebrus]";
- mes "Keep on this way, There is one Spirit left";
- set TSQ_CHK,2;
- close;
-nook:
- mes "[Zebrus]";
- mes "You seems to be lost, Go back and talk to Melkor.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t10.gat,99,97,4 script Veriaelle 111,{
-
- if(TSQ_CHK != 2) goto nook;
- mes "[Veriaelle]";
- mes "Okay, i am warping you to the next floor.";
- next;
- set TSQ_CHK,0;
- warp "tha_t11.gat", 86, 38;
- close;
-nook:
- mes "[Veriaelle]";
- mes "You seems to be lost, Go back and talk to Melkor.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-//Tha_t11 :
-//(Throtre)(U,L)-->tha_t11.gat,16,85,4
-//(Klermaz)(D,R)-->tha_t11.gat,85,16,4
-//(Mihane)(D,L)-->tha_t11.gat,16,16,4
-//(Seranes)(U,R)-->tha_t11.gat,85,85,4
-//Script:
-
-tha_t11.gat,16,85,4 script Throtre 111,{
- if(TSQ_CHK == 1) goto done;
- mes "[Throtre]";
- mes "You got my authorization for the next floor";
- mes "However, you must show how strong you are to the other Spirits";
- set TSQ_CHK,1;
- close;
-done:
- mes "[Throtre]";
- mes "Go search, They Can't leave this floor.";
- close;
-}
-
-tha_t11.gat,85,16,4 script Klermaz 111,{
- if(TSQ_CHK != 1) goto nook;
- mes "[Klermaz]";
- mes "Hmm it seems that Throtre allowed you to pass.";
- mes "Well then you have my blessing, 2 Spirits remaining.";
- set TSQ_CHK,2;
- close;
-nook:
- mes "[Klermaz]";
- mes "You seems to be lost, Go back and talk to Throtre.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t11.gat,16,16,4 script Mihane 111,{
- if(TSQ_CHK != 2) goto nook;
- mes "[Mihane]";
- mes "Keep on this way, Only 1 Left.";
- set TSQ_CHK,3;
- close;
-nook:
- mes "[Mihane]";
- mes "Sorry, You must start over from the begining.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t11.gat,85,85,4 script Seranes 111,{
- if(TSQ_CHK != 3 ) goto nook;
- mes "[Seranes]";
- mes "Perfect, it seems that the other spirits grants you the access.";
- mes "I am warping you to the next floor.";
- next;
- set TSQ_CHK,0;
- warp "tha_t12.gat", 129, 58;
- close;
-nook:
- mes "[Seranes]";
- mes "You did not follow the good order, starts again from the begining.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-//Tha_t12 ( M: Middle):
-//(Nox)(D,L)-->tha_t12.gat,103,18,4
-//(Vox)(R)-->tha_t12.gat,162,58,4
-//(Hox)(L)-->tha_t12.gat,96,57,4
-//(Dox)(D,R)-->tha_t12.gat,153,17,4
-//(Sox)(U)-->tha_t12.gat,128,88,4
-//Script:
-
-tha_t12.gat,103,18,4 script Nox 111,{
- if(TSQ_CHK == 1 ) goto done;
- mes "[Nox]";
- mes "Fine, 4 Spirits left.";
- set TSQ_CHK,1;
- close;
-done:
- mes "[Nox]";
- mes "Go search, They can't leave this floor.";
- close;
-}
-
-tha_t12.gat,162,58,4 script Vox 111,{
- if(TSQ_CHK != 1 ) goto nook;
- mes "[Vox]";
- mes "Keep on this way, 3 Spirits remaining !";
- set TSQ_CHK,2;
- close;
-nook:
- mes "[Vox]";
- mes "Sorry, Go back and talk to Nox.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t12.gat,96,57,4 script Hox 111,{
- if(TSQ_CHK != 2 ) goto nook;
- mes "[Hox]";
- mes "You are on the good way, 2 Spirits remaining !";
- set TSQ_CHK,3;
- close;
-nook:
- mes "[Hox]";
- mes "Sorry, Go back and talk to Vox.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t12.gat,153,17,4 script Dox 111,{
- if(TSQ_CHK != 3 ) goto nook;
- mes "[Dox]";
- mes "Perfect, 1 Spirit left.";
- set TSQ_CHK,4;
- close;
-nook:
- mes "[Dox]";
- mes "Sorry, Go back and talk to Hox.";
- next;
- set TSQ_CHK,0;
- close;
-}
-
-tha_t12.gat,128,88,4 script Sox 111,{
- if(TSQ_CHK != 4 ) goto nook;
- mes "[Sox]";
- mes "You have just passed the test successfully.";
- next;
- mes "[Sox]";
- mes "You have to give me Red Magic Stone, Yellow Magic Stone, Blue Magic Stone & Green Magic Stone.";
- next;
- if(countitem(7426) < 1 || countitem(7427) < 1 || countitem(7428) < 1 || countitem(7429) < 1) goto nostone;
- delitem 7426,1;
- delitem 7427,1;
- delitem 7428,1;
- delitem 7429,1;
- mes "[Sox]";
- mes "I will now warp you to steps of Fate.";
- mes "Good-bye.";
- next;
- set TSQ_CHK,0;
- warp "thana_step.gat", 186, 223;
- close;
-
-nostone:
- mes "[Sox]";
- mes "Oh well, seems you don't have enough stones.";
- close;
-
-nook:
- mes "[Sox]";
- mes "Sorry, Go back and talk to Dox.";
- next;
- set TSQ_CHK,0;
- close;
+//===== eAthena Script =======================================
+//= Custom Thanatos Tower Quest
+//===== By: ==================================================
+//= Bibilol & Moryagorn
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any eAthena Version;
+//===== Description: =========================================
+//= Custom Thanatos Tower Quest
+//===== Additional Comments: =================================
+//= 1.1 Fixed wrong NPC names in their dialogues, added
+//= Justin84's gems check in Sox NPC [Lupus]
+//============================================================
+
+
+//Statue (NPC)(U: UP, D: DOWN, R: RIGHT, L: LEFT) :
+// Explain Npc
+tha_t08.gat,69,106,4 script Statue 111,{
+
+ mes "You can read on the back of the statue:";
+ mes "'By the spirit of olds, the walls are closed";
+ mes "Upper floors or foreign taboo";
+ mes "By the order of the Statues you will find the way";
+ mes "Which perhaps a day will bring you to me.";
+ mes ".....Thanatos '";
+ close;
+}
+
+//Tha_t09 :
+//(Thalos)(U,L)-->tha_t09.gat,17,158,4
+//(Mediane)(D,R)-->tha_t09.gat,84,99,4
+//Script:
+
+tha_t09.gat,17,158,4 script Thalos 111,{
+
+ if(TSQ_CHK == 1) goto done;
+ mes "[Thalos]";
+ mes "You must find the 2nd Statue now.";
+ set TSQ_CHK,1;
+ close;
+
+done:
+ mes "[Thalos]";
+ mes "Go search the 2nd Statue!";
+ close;
+
+}
+
+tha_t09.gat,84,99,4 script Mediane 111,{
+
+ if(TSQ_CHK != 1) goto nook;
+ mes "[Mediane]";
+ mes "Okay, i am warping you to the next floor now.";
+ next;
+ set TSQ_CHK,0;
+ warp "tha_t10.gat", 165, 138;
+ close;
+nook:
+ mes "[Mediane]";
+ mes "You must talk with the Spirit in the 1st Statue.";
+ close;
+}
+
+//Tha_t10 :
+//(Melkor)(U)-->tha_t10.gat,130,159,4
+//(Zebrus)(D,R)-->tha_t10.gat,160,98,4
+//(Veriaelle)(D,L)-->tha_t10.gat,99,97,4
+//Script:
+
+tha_t10.gat,130,159,4 script Melkor 111,{
+
+ if(TSQ_CHK == 1) goto done;
+ mes "[Melkor]";
+ mes "You must find the other Spirits now.";
+ mes "We are 3.";
+ set TSQ_CHK,1;
+ close;
+done:
+ mes "[Melkor]";
+ mes "Go Search, They are in this floor.";
+ close;
+}
+
+tha_t10.gat,160,98,4 script Zebrus 111,{
+
+ if(TSQ_CHK != 1) goto nook;
+ mes "[Zebrus]";
+ mes "Keep on this way, There is one Spirit left";
+ set TSQ_CHK,2;
+ close;
+nook:
+ mes "[Zebrus]";
+ mes "You seems to be lost, Go back and talk to Melkor.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t10.gat,99,97,4 script Veriaelle 111,{
+
+ if(TSQ_CHK != 2) goto nook;
+ mes "[Veriaelle]";
+ mes "Okay, i am warping you to the next floor.";
+ next;
+ set TSQ_CHK,0;
+ warp "tha_t11.gat", 86, 38;
+ close;
+nook:
+ mes "[Veriaelle]";
+ mes "You seems to be lost, Go back and talk to Melkor.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+//Tha_t11 :
+//(Throtre)(U,L)-->tha_t11.gat,16,85,4
+//(Klermaz)(D,R)-->tha_t11.gat,85,16,4
+//(Mihane)(D,L)-->tha_t11.gat,16,16,4
+//(Seranes)(U,R)-->tha_t11.gat,85,85,4
+//Script:
+
+tha_t11.gat,16,85,4 script Throtre 111,{
+ if(TSQ_CHK == 1) goto done;
+ mes "[Throtre]";
+ mes "You got my authorization for the next floor";
+ mes "However, you must show how strong you are to the other Spirits";
+ set TSQ_CHK,1;
+ close;
+done:
+ mes "[Throtre]";
+ mes "Go search, They Can't leave this floor.";
+ close;
+}
+
+tha_t11.gat,85,16,4 script Klermaz 111,{
+ if(TSQ_CHK != 1) goto nook;
+ mes "[Klermaz]";
+ mes "Hmm it seems that Throtre allowed you to pass.";
+ mes "Well then you have my blessing, 2 Spirits remaining.";
+ set TSQ_CHK,2;
+ close;
+nook:
+ mes "[Klermaz]";
+ mes "You seems to be lost, Go back and talk to Throtre.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t11.gat,16,16,4 script Mihane 111,{
+ if(TSQ_CHK != 2) goto nook;
+ mes "[Mihane]";
+ mes "Keep on this way, Only 1 Left.";
+ set TSQ_CHK,3;
+ close;
+nook:
+ mes "[Mihane]";
+ mes "Sorry, You must start over from the begining.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t11.gat,85,85,4 script Seranes 111,{
+ if(TSQ_CHK != 3 ) goto nook;
+ mes "[Seranes]";
+ mes "Perfect, it seems that the other spirits grants you the access.";
+ mes "I am warping you to the next floor.";
+ next;
+ set TSQ_CHK,0;
+ warp "tha_t12.gat", 129, 58;
+ close;
+nook:
+ mes "[Seranes]";
+ mes "You did not follow the good order, starts again from the begining.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+//Tha_t12 ( M: Middle):
+//(Nox)(D,L)-->tha_t12.gat,103,18,4
+//(Vox)(R)-->tha_t12.gat,162,58,4
+//(Hox)(L)-->tha_t12.gat,96,57,4
+//(Dox)(D,R)-->tha_t12.gat,153,17,4
+//(Sox)(U)-->tha_t12.gat,128,88,4
+//Script:
+
+tha_t12.gat,103,18,4 script Nox 111,{
+ if(TSQ_CHK == 1 ) goto done;
+ mes "[Nox]";
+ mes "Fine, 4 Spirits left.";
+ set TSQ_CHK,1;
+ close;
+done:
+ mes "[Nox]";
+ mes "Go search, They can't leave this floor.";
+ close;
+}
+
+tha_t12.gat,162,58,4 script Vox 111,{
+ if(TSQ_CHK != 1 ) goto nook;
+ mes "[Vox]";
+ mes "Keep on this way, 3 Spirits remaining !";
+ set TSQ_CHK,2;
+ close;
+nook:
+ mes "[Vox]";
+ mes "Sorry, Go back and talk to Nox.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t12.gat,96,57,4 script Hox 111,{
+ if(TSQ_CHK != 2 ) goto nook;
+ mes "[Hox]";
+ mes "You are on the good way, 2 Spirits remaining !";
+ set TSQ_CHK,3;
+ close;
+nook:
+ mes "[Hox]";
+ mes "Sorry, Go back and talk to Vox.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t12.gat,153,17,4 script Dox 111,{
+ if(TSQ_CHK != 3 ) goto nook;
+ mes "[Dox]";
+ mes "Perfect, 1 Spirit left.";
+ set TSQ_CHK,4;
+ close;
+nook:
+ mes "[Dox]";
+ mes "Sorry, Go back and talk to Hox.";
+ next;
+ set TSQ_CHK,0;
+ close;
+}
+
+tha_t12.gat,128,88,4 script Sox 111,{
+ if(TSQ_CHK != 4 ) goto nook;
+ mes "[Sox]";
+ mes "You have just passed the test successfully.";
+ next;
+ mes "[Sox]";
+ mes "You have to give me Red Magic Stone, Yellow Magic Stone, Blue Magic Stone & Green Magic Stone.";
+ next;
+ if(countitem(7426) < 1 || countitem(7427) < 1 || countitem(7428) < 1 || countitem(7429) < 1) goto nostone;
+ delitem 7426,1;
+ delitem 7427,1;
+ delitem 7428,1;
+ delitem 7429,1;
+ mes "[Sox]";
+ mes "I will now warp you to steps of Fate.";
+ mes "Good-bye.";
+ next;
+ set TSQ_CHK,0;
+ warp "thana_step.gat", 186, 223;
+ close;
+
+nostone:
+ mes "[Sox]";
+ mes "Oh well, seems you don't have enough stones.";
+ close;
+
+nook:
+ mes "[Sox]";
+ mes "Sorry, Go back and talk to Dox.";
+ next;
+ set TSQ_CHK,0;
+ close;
} \ No newline at end of file
diff --git a/npc/custom/quests/thq/THQS_ChatingNPC.txt b/npc/custom/quests/thq/THQS_ChatingNPC.txt
index d7ec81d2c..6d3a938dd 100644
--- a/npc/custom/quests/thq/THQS_ChatingNPC.txt
+++ b/npc/custom/quests/thq/THQS_ChatingNPC.txt
@@ -1,103 +1,103 @@
-//===== Athena Script =====================================
-//= Treasure Hunter Script
-//===== Converted By ======================================
-//= Fredzilla
-//= Original
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Treasure Hunter Quests //
-// By: Ezekial //
-// for the use on nRO run by Newbe5 //
-// revised By Warlock //
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//===== Version ===========================================
-//= 1.0 - Straight conversion of Aegis NPC file
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Start for Treasure hunter quests
-//===== Comments ==========================================
-//= Event_THQS - Used to check if you have already registerd
-//= #Treasure_Token - used to keep track of tokens
-//////////////////////////////////////////////////////////
-
-
-//Entrance Flags
-yuno.gat,48,101,6 script Notice 722,{
- mes "^FF0000[ Treasure Hunter Guild House ]^000000";
- mes " ";
- mes "Welcome to the Treasure Hunter's Guild House.";
- mes "Feel free to drop in and look around";
- mes "and feel free to become a memeber if you wish.";
- mes " ";
- mes "For membership applications please talk to Keegan";
- mes "up the stairs and down the hall.";
- close;
-}
-//Saver Girl;
-yuno_in01.gat,32,178,3 script Ahlma 94,{
- mes "[Ahlma]";
- if (Event_THQS == 0) goto N_Member;
- mes "Welcome to The Treasure Hunter Guild.";
- mes "How may I help you?";
- next;
- menu "Save",-,"Quit",N_Quit;
- mes "[Ahlma]";
- mes "Ok, saved. Thank you ~ See you soon~";
- savepoint "yuno_in01.gat",34,176;
- close;
-N_Quit:
- mes "[Ahlma]";
- mes "Well if you think you are safe, good on you.";
- close;
-N_Member:
- mes "Sorry, members only.";
- close;
-}
-//Retired Smile mask girl;
-yuno_in01.gat,33,162,3 script Smile Helper 92,{
- mes "[Smile Gal]";
- mes "Oh man...I am so sick of";
- mes "trading Mr. Smile masks for crap.";
- mes " ";
- mes "You ask me for one and you'll find yourself 10 pounds lighter!";
- close;
-}
-//Usless Female Assasin;
-yuno_in01.gat,22,162,6 script Female Assasin 725,{
- mes "[Sharlet]";
- if (Event_THQS > 0) goto N_Member;
- mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!";
- close;
-N_Member:
- set @TEMP,rand(1,2);
- if (@TEMP == 1) goto N_Chat1;
- if (@TEMP == 2) goto N_Chat2;
- mes "How are you reading this???";
- mes "Well unless you are reading the code :)";
- close;
-N_Chat1:
- mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+".";
- mes "Did you hear about that brave man that went into Glast Heim alone?! He must be crazy.";
- close;
-N_Chat2:
- mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest.";
- close;
-}
-//another usless member
-yuno_in01.gat,25,162,6 script Female Wizard 123,{
- mes "[Sasha]";
- if (Event_THQS > 0) goto N_Member;
- mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!";
- close;
-N_Member:
- set @TEMP,rand(2);
- if (@TEMP == 1) goto N_Chat;
- mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+".";
- mes "Did you hear about that goat man running around in the trees?";
- mes " ";
- mes "Aperently his name is Baphomet and he has been runing around the Forest Maze out side of prontera for quite some time now.";
- close;
-N_Chat:
- mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest.";
- close;
+//===== Athena Script =====================================
+//= Treasure Hunter Script
+//===== Converted By ======================================
+//= Fredzilla
+//= Original
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Treasure Hunter Quests //
+// By: Ezekial //
+// for the use on nRO run by Newbe5 //
+// revised By Warlock //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//===== Version ===========================================
+//= 1.0 - Straight conversion of Aegis NPC file
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Start for Treasure hunter quests
+//===== Comments ==========================================
+//= Event_THQS - Used to check if you have already registerd
+//= #Treasure_Token - used to keep track of tokens
+//////////////////////////////////////////////////////////
+
+
+//Entrance Flags
+yuno.gat,48,101,6 script Notice 722,{
+ mes "^FF0000[ Treasure Hunter Guild House ]^000000";
+ mes " ";
+ mes "Welcome to the Treasure Hunter's Guild House.";
+ mes "Feel free to drop in and look around";
+ mes "and feel free to become a memeber if you wish.";
+ mes " ";
+ mes "For membership applications please talk to Keegan";
+ mes "up the stairs and down the hall.";
+ close;
+}
+//Saver Girl;
+yuno_in01.gat,32,178,3 script Ahlma 94,{
+ mes "[Ahlma]";
+ if (Event_THQS == 0) goto N_Member;
+ mes "Welcome to The Treasure Hunter Guild.";
+ mes "How may I help you?";
+ next;
+ menu "Save",-,"Quit",N_Quit;
+ mes "[Ahlma]";
+ mes "Ok, saved. Thank you ~ See you soon~";
+ savepoint "yuno_in01.gat",34,176;
+ close;
+N_Quit:
+ mes "[Ahlma]";
+ mes "Well if you think you are safe, good on you.";
+ close;
+N_Member:
+ mes "Sorry, members only.";
+ close;
+}
+//Retired Smile mask girl;
+yuno_in01.gat,33,162,3 script Smile Helper 92,{
+ mes "[Smile Gal]";
+ mes "Oh man...I am so sick of";
+ mes "trading Mr. Smile masks for crap.";
+ mes " ";
+ mes "You ask me for one and you'll find yourself 10 pounds lighter!";
+ close;
+}
+//Usless Female Assasin;
+yuno_in01.gat,22,162,6 script Female Assasin 725,{
+ mes "[Sharlet]";
+ if (Event_THQS > 0) goto N_Member;
+ mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!";
+ close;
+N_Member:
+ set @TEMP,rand(1,2);
+ if (@TEMP == 1) goto N_Chat1;
+ if (@TEMP == 2) goto N_Chat2;
+ mes "How are you reading this???";
+ mes "Well unless you are reading the code :)";
+ close;
+N_Chat1:
+ mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+".";
+ mes "Did you hear about that brave man that went into Glast Heim alone?! He must be crazy.";
+ close;
+N_Chat2:
+ mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest.";
+ close;
+}
+//another usless member
+yuno_in01.gat,25,162,6 script Female Wizard 123,{
+ mes "[Sasha]";
+ if (Event_THQS > 0) goto N_Member;
+ mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!";
+ close;
+N_Member:
+ set @TEMP,rand(2);
+ if (@TEMP == 1) goto N_Chat;
+ mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+".";
+ mes "Did you hear about that goat man running around in the trees?";
+ mes " ";
+ mes "Aperently his name is Baphomet and he has been runing around the Forest Maze out side of prontera for quite some time now.";
+ close;
+N_Chat:
+ mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest.";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/quests/thq/THQS_GuildNPC.txt b/npc/custom/quests/thq/THQS_GuildNPC.txt
index 8a8da7e4c..6f12a6fe5 100644
--- a/npc/custom/quests/thq/THQS_GuildNPC.txt
+++ b/npc/custom/quests/thq/THQS_GuildNPC.txt
@@ -1,95 +1,95 @@
-//===== Athena Script =====================================
-//= Treasure Hunter Script
-//===== Converted By ======================================
-//= Fredzilla
-//= Original
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Treasure Hunter Quests //
-// By: Ezekial //
-// for the use on nRO run by Newbe5 //
-// revised By Warlock //
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//===== Version ===========================================
-//= 1.0 - Straight conversion of Aegis NPC file
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Start for Treasure hunter quests
-//===== Comments ==========================================
-//= Event_THQS - Used to check if you have already registerd
-//= #Treasure_Token - used to keep track of tokens
-//////////////////////////////////////////////////////////
-
-
-yuno_in01.gat,124,164,6 script Guild Leader 108,{
- mes "[Keegan]";
- mes "What brings you here? Have something to say?";
- next;
- menu "I want to be a Treasure Hunter",-,"Take a New Quest.",N_NQuest,"Take me to the Official Shop.",N_OShop,"Nevermind.",N_NVM;
- if(Event_THQS==1) goto N_AlreadyReg;
- mes "[Keegan]";
- mes "Well "+strcharinfo(0)+" if you want to be a Treasure Hunter first you must.";
- mes " ";
- mes "^FF00001.^000000 You well be changed ^FF000025,000z^000000 for basic training and your proof of being a member.";
- mes " ";
- mes "Umm... Well that is all you need to do. Hahaha.";
- next;
- menu "Pay ^FF000025,000z^000000.",-,"Thats way to high!!",N_HighPrice;
- if (zeny < 25000) goto N_NoZeny;
- set Zeny,Zeny-25000;
- //getitem 7950, 1;
- //getitem 7951, 1;
- set Event_THQS,1;
- mes "[Keegan]";
- mes "Congratulations!";
- emotion 46;
- next;
- mes "[Keegan]";
- mes "Welcome to the Guild of Treasure Hunters.";
- mes "You may now take a Treasure Hunting Quest as you see fit.";
- close;
-N_NoZeny:
- mes "[Keegan]";
- mes "Hmmm you don't seem to have ^FF000025,000z^000000 "+strcharinfo(0)+". Please come back when you do.";
- close;
-N_HighPrice:
- mes "[Keegan]";
- mes "Well if you can't afford a small ^FF000025,000z^000000 you shouldent be a Treasure Hunter yet.";
- close;
-N_AlreadyReg:
- mes "[Keegan]";
- mes "Ha ha ha...you are already a member.";
- close;
-N_NQuest:
- if (Event_THQS!=1) goto A_NeedReg;
- mes "[Keegan]";
- mes "Well "+strcharinfo(0)+" if you wish to take a quest go talk to the fellow Treasure Hunter in the other room there.";
- close;
-A_NeedReg:
- mes "[Keegan]";
- mes "Sorry you must be a member of the Treasure Hunter Guild if you wish to take a quest.";
- mes " ";
- mes "Also now that you are a member feel free to use our shops anytime you wish.They are all located on this floor.";
- mes " ";
- mes "We also have another shop for members only,in which we use little metal diamonds called Treasure Hunter Tokens to exchange for rare goods.";
- mes " ";
- mes "You will even have access to our exclusive personal Dungeon.";
- close;
-N_OShop:
- if (Event_THQS!=1) goto N_NeedMem;
- mes "[Keegan]";
- mes "Yes "+strcharinfo(0)+" I will take you to our shop right away!";
- next;
- warp "prt_in.gat",166,171;
- close;
- end;
-N_NeedMem:
- mes "[Keegan]";
- mes "Im sorry only members may visit our private shop.";
- close;
-N_NVM:
- mes "[Keegan]";
- mes "Alright come back when you have the free time to spare.";
- close;
-
+//===== Athena Script =====================================
+//= Treasure Hunter Script
+//===== Converted By ======================================
+//= Fredzilla
+//= Original
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Treasure Hunter Quests //
+// By: Ezekial //
+// for the use on nRO run by Newbe5 //
+// revised By Warlock //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//===== Version ===========================================
+//= 1.0 - Straight conversion of Aegis NPC file
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Start for Treasure hunter quests
+//===== Comments ==========================================
+//= Event_THQS - Used to check if you have already registerd
+//= #Treasure_Token - used to keep track of tokens
+//////////////////////////////////////////////////////////
+
+
+yuno_in01.gat,124,164,6 script Guild Leader 108,{
+ mes "[Keegan]";
+ mes "What brings you here? Have something to say?";
+ next;
+ menu "I want to be a Treasure Hunter",-,"Take a New Quest.",N_NQuest,"Take me to the Official Shop.",N_OShop,"Nevermind.",N_NVM;
+ if(Event_THQS==1) goto N_AlreadyReg;
+ mes "[Keegan]";
+ mes "Well "+strcharinfo(0)+" if you want to be a Treasure Hunter first you must.";
+ mes " ";
+ mes "^FF00001.^000000 You well be changed ^FF000025,000z^000000 for basic training and your proof of being a member.";
+ mes " ";
+ mes "Umm... Well that is all you need to do. Hahaha.";
+ next;
+ menu "Pay ^FF000025,000z^000000.",-,"Thats way to high!!",N_HighPrice;
+ if (zeny < 25000) goto N_NoZeny;
+ set Zeny,Zeny-25000;
+ //getitem 7950, 1;
+ //getitem 7951, 1;
+ set Event_THQS,1;
+ mes "[Keegan]";
+ mes "Congratulations!";
+ emotion 46;
+ next;
+ mes "[Keegan]";
+ mes "Welcome to the Guild of Treasure Hunters.";
+ mes "You may now take a Treasure Hunting Quest as you see fit.";
+ close;
+N_NoZeny:
+ mes "[Keegan]";
+ mes "Hmmm you don't seem to have ^FF000025,000z^000000 "+strcharinfo(0)+". Please come back when you do.";
+ close;
+N_HighPrice:
+ mes "[Keegan]";
+ mes "Well if you can't afford a small ^FF000025,000z^000000 you shouldent be a Treasure Hunter yet.";
+ close;
+N_AlreadyReg:
+ mes "[Keegan]";
+ mes "Ha ha ha...you are already a member.";
+ close;
+N_NQuest:
+ if (Event_THQS!=1) goto A_NeedReg;
+ mes "[Keegan]";
+ mes "Well "+strcharinfo(0)+" if you wish to take a quest go talk to the fellow Treasure Hunter in the other room there.";
+ close;
+A_NeedReg:
+ mes "[Keegan]";
+ mes "Sorry you must be a member of the Treasure Hunter Guild if you wish to take a quest.";
+ mes " ";
+ mes "Also now that you are a member feel free to use our shops anytime you wish.They are all located on this floor.";
+ mes " ";
+ mes "We also have another shop for members only,in which we use little metal diamonds called Treasure Hunter Tokens to exchange for rare goods.";
+ mes " ";
+ mes "You will even have access to our exclusive personal Dungeon.";
+ close;
+N_OShop:
+ if (Event_THQS!=1) goto N_NeedMem;
+ mes "[Keegan]";
+ mes "Yes "+strcharinfo(0)+" I will take you to our shop right away!";
+ next;
+ warp "prt_in.gat",166,171;
+ close;
+ end;
+N_NeedMem:
+ mes "[Keegan]";
+ mes "Im sorry only members may visit our private shop.";
+ close;
+N_NVM:
+ mes "[Keegan]";
+ mes "Alright come back when you have the free time to spare.";
+ close;
+
} \ No newline at end of file
diff --git a/npc/custom/quests/thq/THQS_QuestNPC.txt b/npc/custom/quests/thq/THQS_QuestNPC.txt
index a2e7ddb21..011553089 100644
--- a/npc/custom/quests/thq/THQS_QuestNPC.txt
+++ b/npc/custom/quests/thq/THQS_QuestNPC.txt
@@ -1,560 +1,560 @@
-//===== Athena Script =====================================
-//= Treasure Hunter Script
-//===== Converted By ======================================
-//= Fredzilla
-//= Original
-///////////////////////////////////////////////////////////
-// Treasure Hunter Quests //
-// By: Ezekial //
-// for the use on nRO run by Newbe5 //
-// revised By Warlock //
-///////////////////////////////////////////////////////////
-//===== Version ===========================================
-//= 1.2
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Start for Treasure hunter quests
-//===== Comments ==========================================
-//= Event_THQS - Used to check if you have already registerd
-//= #Treasure_Token - used to keep track of tokens
-//= 1.0 - Straight conversionof Aegis NPC file
-//= 1.1 Added time penalty to prevent get quests to often [Lupus]
-//= 1.2 Fixed not working penalty, added anti-cheat [Lupus]
-//////////////////////////////////////////////////////////
-
-
-yuno_in01.gat,112,151,6 script Quest Manager 62,{
- mes "[Guy]";
- mes "Welcome to the Treasure Hunters Guild "+strcharinfo(0)+".";
- next;
- if (On_Quest == 0) goto N_NewQuest;
- mes "[Guy]";
- mes "Look " +strcharinfo(0)+ ", you can only 1 quest at a time, you should finish the quest unless you have given up.";
- mes "Giving up will cost you ^FF00002500z^000000.";
- next;
- menu "No, never would I leave a quest!",-,"Yah I'm pathetic... Pay 2500z",N_PayZeny;
- mes "[Guy]";
- mes "Good well get back out there.";
- close;
-N_PayZeny:
- if (zeny < 2500) goto N_ZenyFail;
- set one_qset, 0;
- set two_qset, 0;
- set three_qset, 0;
- set four_qset, 0;
- set five_qset, 0;
- set six_qset, 0;
- set seven_qset, 0;
- set eight_qset, 0;
- set nine_qset, 0;
- set ten_qset, 0;
- set On_Quest, 0;
- set Zeny,Zeny-2500;
- //add time delay penalty. You can get another quest after 2 - 3 hours. [Lupus]
- set #THQ_DELAY, (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)+rand(2,3));
- mes "[Guy]";
- mes "Its sad to see someone give a quest up...";
- mes "Shame on you.";
- emotion 7;
- close;
-
-N_ZenyFail:
- mes "[Guy]";
- mes "Thats sad you don't even have ^FF00002500z^000000.";
- close;
-
-N_NewQuest:
- if (Event_THQS == 0) goto N_Signup;
- //checking if time penalty is over [Lupus]
- if (#THQ_DELAY > (GetTime(7)*12*31*24 + GetTime(6)*31*24 + GetTime(5)*24 + GetTime(3)) ) goto L_NoQuestsForYet;
- mes "[Guy]";
- mes "Ahh welcome fellow Treasure Hunter.";
- mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!";
- mes "Would you like me to asign you a Quest?";
- next;
- menu "Yes I would like a Quest Please.",-,"Sorry Guy no time today.",N_NoTime;
-
- mes "[Guy]";
- mes "Ok lets see what quest we can give you today.";
- mes "The quest names in ^FF0000This Colour^000000 mean that they are more challanging then the rest, but have better rewards.";
- next;
- set #THQ_DELAY,(GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3) + 1); //you can get another quest after 1 hour [Lupus]
- emotion 21;
- if(@treasure_job==0) set @treasure_job,rand(1,10); //doesn't allow cheaters to pick any quest they want
- if(@treasure_job==2) goto N_JobList2;
- if(@treasure_job==3) goto N_JobList3;
- if(@treasure_job==4) goto N_JobList4;
- if(@treasure_job==5) goto N_JobList5;
- if(@treasure_job==6) goto N_JobList6;
- if(@treasure_job==7) goto N_JobList7;
- if(@treasure_job==8) goto N_JobList8;
- if(@treasure_job==9) goto N_JobList9;
- if(@treasure_job==10) goto N_JobList10;
- goto N_JobList1; //if(@treasure_job==1)
-
-N_NoTime:
- mes "[Guy]";
- mes "Alright maybe next time "+strcharinfo(0)+".";
- emotion 20;
- close;
-
-N_Signup:
- mes "[Guy]";
- mes "I'm afraid you must sign up for the guild before you can go on a quest!";
- emotion 17;
- close;
-
-L_NoQuestsForYet:
- mes "[Guy]";
- mes "I'm afraid there aren't any Quests for you yet.";
- mes "Call in "+ (#THQ_DELAY - (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)) )+" hours later.";
- emotion 17;
- close;
-
-L_QuestGiven:
- set On_Quest,1;
- set @treasure_job,0; //next time u get random quest
- close;
-
-///////Job list 1///////
-N_JobList1:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Lost Old Man.",-,"Master needs his Bow.",N_MasterBow,"The Hit List.",N_HitList,"^FF0000The Sad Widow.^000000",N_SadWidow;
- mes "[Guy]";
- mes "^FF0000Lost Old Man^000000";
- mes "^FF0000------------^000000";
- mes "This is an easy and low payed quest.";
- mes " ";
- mes "A wife came in asking us to find his husband, she seems to come in alot asking us to find him over and over again.";
- next;
- mes "[Guy]";
- mes "But he always seems to be around the same place so there isn't much looking involved,check the mountains 1 west and 1 north of prontera.";
- set one_qset,1;
- goto L_QuestGiven;
-
-N_MasterBow:
- mes "[Guy]";
- mes "^FF0000Master needs his Bow^000000";
- mes "^FF0000--------------------^000000";
- mes "This is just a package delivery run, no big deal or anything.";
- mes " ";
- mes "Take this to an archer in the Archer Village outside of Payon.";
- getitem 1072,1; //Delivery_Box
- set one_qset,2;
- goto L_QuestGiven;
-
-N_HitList:
- mes "[Guy]";
- mes "^FF0000The Hit List^000000";
- mes "^FF0000------------^000000";
- mes "In this quest you get to see some action.";
- mes " ";
- mes "There has been a farmer that keeps having all his crops eaten by ^FF0000Thief Bugs, Porings, and Lunitics^000000 here is a lost of what I need you to do. He is nexting East of Prontera.";
- next;
- mes "[Guy]";
- mes "Ok go to the east and bash those little bastards like there is no tommorow. When you are done with that list you have just discard it, but you will NOT get another one!.";
- set one_qset,3;
- goto L_QuestGiven;
-
-N_SadWidow:
- mes "^FF0000The Sad Widow^000000";
- mes "^FF0000*************^000000";
- mes "This is just another quest with possable well pay.";
- mes " ";
- mes "There is an old Widow in pontera, she recently lost her husband due to a monster attack.She has requested a Guild member to come talk to her at the Pontera Graveyard.";
- set one_qset,4;
- goto L_QuestGiven;
-
-///////Job list 2///////
-N_JobList2:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "The Strange Letter",-,"Jur for Jeramiah",N_JurJeramiah,"Bee Keepers Hunny",N_BeeHunny,"^FF0000The Wander Man^000000",N_WanderMan;
-
- mes "^FF0000The Strange Letter^000000";
- mes "^FF0000------------------^000000";
- mes "I do not know much about this quest.";
- mes " ";
- mes "A strange man came in here yesterday and asked me to deliver this ^FF0000Strange Letter^000000 to some woman in Morroc. Knowing us we do not ask questions so you must take care of this delivery.";
- mes "The Woman is in located in Morroc and her name is Erika.";
- set two_qset, 1;
- getitem 1072,1; //Delivery_Message
- goto L_QuestGiven;
-
-N_JurJeramiah:
- mes "^FF0000Jur for Jeramiah^000000";
- mes "^FF0000----------------^000000";
- mes "Standard delivery quest.";
- mes " ";
- mes "Jeramiah ordered a Special Jur from our weapon shop.Your Job is to deliver it to him in the Assasin Temple.";
- getitem 1998,1; //Jeramiah's_Jur
- set two_qset,2;
- goto L_QuestGiven;
-
-N_BeeHunny:
- mes "^FF0000Bee Keepers Hunny^000000";
- mes "^FF0000-----------------^000000";
- mes "Strange man in the marsh need your help.";
- mes " ";
- mes "There is a strange man in the forest in ^FF00001 south and 1 west^000000 of Prontera, he need your help with something.";
- set two_qset,3;
- goto L_QuestGiven;
-
-N_WanderMan:
- mes "^FF0000The Wander Man^000000";
- mes "^FF0000**************^000000";
- mes "There is a woman in Payon that is in desperate for aid.";
- mes " ";
- mes "There is a woman in Payon named Molly please get to her as soon as possable the letter she sent here sounded like someone was killing her.";
- set two_qset,4;
- goto L_QuestGiven;
-
-///////Job list 3///////
-N_JobList3:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Damn Pixies!",-,"Package Delivery",N_Delivery1,"Prontera Culvert",N_ProntCulvert,"^FF0000Trouble at the Coal Mine^000000",N_CoalMine;
- mes "^FF0000Damn Pixies!^000000";
- mes "^FF0000------------^000000";
- mes "Have you ever been to Hell?";
- mes " ";
- mes "A man outside of ^FF0000Ant Hell^000000 has requested your audiance, I suggest you hurry.";
- set three_qset,1;
- goto L_QuestGiven;
-
-N_Delivery1:
- mes "^FF0000Package Delivery^000000";
- mes "^FF0000----------------^000000";
- mes "Standard drop off quest.";
- mes " ";
- mes "In this quest you need to deliver a mystery box to someone names ^FF0000Flank at the bridge between Aldebaran and Juno^000000.";
- getitem 1082,1; //Delivery_Box_
- set three_qset,2;
- goto L_QuestGiven;
-
-N_ProntCulvert:
- mes "^FF0000Prontera Culvert^000000";
- mes "^FF0000----------------^000000";
- mes "The bugs,They are everywere!.";
- mes " ";
- mes "The ^FF0000Prontera Culvert^000000 is out of control!Sign up as a volenteer to clean out some of the culvert.";
- next;
- mes "I know it seems like there is no stoping them but however many you kill does makes a differance. After you have signed up, inside the Culvert there will be a Knight that will give you a quest.";
- set three_qset,3;
- goto L_QuestGiven;
-
-N_CoalMine:
- mes "^FF0000Trouble at the Coal Mine^000000";
- mes "^FF0000************************^000000";
- mes "The fun...err...trouble never stops in Rune Midgar.";
- mes " ";
- mes "Recently there was an acident at the coal mines. There was a huge chasm that released some undead Evil Druids.";
- next;
- mes "The Evil Druids started to turn all the workers into the undead. We do not know why, but we do not want to find out, contact a man named Rudolfo outside the Coal Mines.";
- set three_qset,4;
- goto L_QuestGiven;
-
-///////Job list 4///////
-N_JobList4:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Zombie Attack",-,"Mystic Wizard",N_MWizard,"Aww shoot!",N_Shoot,"^FF0000Emperium^000000",N_Emp;
- mes "^FF0000Zombie Attack^000000";
- mes "^FF0000-------------^000000";
- mes "The undead have invaded Payon Cave!";
- mes " ";
- mes "I remember when Payon Cave used to be a safe place to visit, but now undead Zombies have infested the cave! Please contact ^FF0000Flora outside on Payon Cave^000000 and aid her.";
- set four_qset,1;
- goto L_QuestGiven;
-
-N_MWizard:
- mes "^FF0000Mystic Wizard^000000";
- mes "^FF0000-------------^000000";
- mes "Proto-type of a Staff must be delivered to Zed the Wizard.";
- mes " ";
- mes "Zed the Wizard has requested to try out a new un-named proto-type staff. It will be your job to deliver this to him. Zed tend to stay within the general area of Juno.";
- getitem 1999,1; //Zed's_Staff
- set four_qset,2;
- goto L_QuestGiven;
-
-N_Shoot:
- mes "^FF0000Aww shoot!^000000";
- mes "^FF0000----------^000000";
- mes "A little girl is in trouble.";
- mes " ";
- mes "There is a little girl in trouble, her name is Dassy and she is ^FF0000east of the prontera fountan^000000.";
- set four_qset,3;
- goto L_QuestGiven;
-
-N_Emp:
- mes "^FF0000Emperium^000000";
- mes "^FF0000********^000000";
- mes "This is a strange quest that I know little about.";
- mes " ";
- mes "Someone in ^FF0000Prontera Guild Hall^000000 has requested to see one of our members, his name is Czhore.";
- set four_qset,4;
- goto L_QuestGiven;
-
-///////Job list 5///////
-N_JobList5:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Savage Land",-,"Pyramid's part 1",N_PyrPRT1,"Thinking first",N_Thinkfirst,"^FF0000The not so friendly ghost^000000",N_Ghost;
- mes "^FF0000Savage Land^000000";
- mes "^FF0000-----------^000000";
- mes "Easy for some very hard for others.";
- mes " ";
- mes "A man named Lithin wish's to give you a quest, you can find him north of prontera inside of ^FF0000The Hidden Temple^000000";
- set five_qset,1;
- goto L_QuestGiven;
-
-N_PyrPRT1:
- mes "^FF0000Pyramid's^000000";
- mes "^FF0000---------^000000";
- mes "Its funny cause no one knows how these were really made.";
- mes " ";
- mes "Aperently the Pyramids have are beganing to be infested with undead activity,outside the pyramids a man will be nexting for you. He did no give us his name but he asked for you to hurry.";
- set five_qset,2;
- goto L_QuestGiven;
-
-N_Thinkfirst:
- mes "^FF0000Thinking first^000000";
- mes "^FF0000--------------^000000";
- mes "This sounds like another one of those ditzy girl quests...";
- mes " ";
- mes "Dazzy the local blond around Geffen has asked for you to deliver her these flowers. I don't know why someone would send flowers to herself...";
- getitem 744,1; //Bouquet
- set five_qset,3;
- goto L_QuestGiven;
-
-N_Ghost:
- mes "^FF0000The not so friendly ghost^000000";
- mes "^FF0000*************************^000000";
- mes "Well no one ever said Casper was nice behind the sceens.";
- mes " ";
- mes "A wizard on the 3rd floor of geffen tower want's to talk to you about the anchient ruins underneath the city.";
- set five_qset,4;
- goto L_QuestGiven;
-
-///////Job list 6///////
-N_JobList6:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Package for thiefs",-,"Pyramid's part 2",N_PyrPRT2,"Special delivery",N_Delivery2,"^FF0000Geffenia^000000",N_Gef;
- mes "^FF0000Package for thiefs^000000";
- mes "^FF0000------------------^000000";
- mes "How ironic.";
- mes " ";
- mes "Deliver this Box to the Thiefs guild.";
- set six_qset,1;
- getitem 1083,1; //Delivery_Box__
- goto L_QuestGiven;
-
-N_PyrPRT2:
- mes "^FF0000Pyramid's part 2^000000";
- mes "^FF0000----------------^000000";
- mes "More undead action in this triangle!";
- mes " ";
- mes "Talk to a man outside the entrance of the pyramids, he seems to have another quest for you.";
- set six_qset,2;
- goto L_QuestGiven;
-
-N_Delivery2:
- mes "^FF0000Special delivery^000000";
- mes "^FF0000----------------^000000";
- mes "Well most of what we do is run packages, this is no different from other's.";
- mes " ";
- mes "Take this box, DO NOT OPEN IT! To a little girl in Lutie named Chirach she should be around santa.";
- set six_qset,3;
- getitem 1083,1; //Delivery_Box__
- goto L_QuestGiven;
-
-N_Gef:
- mes "^FF0000Geffenia^000000";
- mes "^FF0000********^000000";
- mes "The little children of Geffen have been haveing strange nightmares.";
- mes " ";
- mes "We belive that the ruins underneath geffen are causeing this problem, talk to a Wizard named Zuuzuu inside Geffen Tower for your mission.";
- set six_qset,4;
- goto L_QuestGiven;
-
-///////Job list 7///////
-N_JobList7:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Apple Juice",-,"Delivery",N_Delivery3,"^FF0000Golden Thief Bug^000000",N_GTB,"^FF0000Evil Pirates^000000",N_EvilPirates;
- mes "^FF0000Apple Juice^000000";
- mes "^FF0000-----------^000000";
- mes "Can't say no to some good apple juice.";
- mes " ";
- mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her.";
- set seven_qset,1;
- goto L_QuestGiven;
-
-N_Delivery3:
- mes "^FF0000Delivery^000000";
- mes "^FF0000--------^000000";
- mes "So many packages so little time.";
- mes " ";
- mes "Take this box to a man in Alberta named Charles.";
- getitem 1082,1; //Delivery_Box_
- set seven_qset,2;
- goto L_QuestGiven;
-
-N_GTB:
- mes "^FF0000Golden Thief Bug^000000";
- mes "^FF0000****************^000000";
- mes "The prontera Culvert has never been the same...";
- mes " ";
- mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert. Talk to a Knight inside the Culvert.";
- set seven_qset,3;
- goto L_QuestGiven;
-
-N_EvilPirates:
- mes "^FF0000Evil Pirates^000000";
- mes "^FF0000************^000000";
- mes "A ghost ship has washed up on shore on an island outside of Izlude.";
- mes " ";
- mes "A female assasin has a quest for you, she is nexting outside the Ghost Ship.There have been reports of evil undead pirates lurking around inside the ship.";
- set seven_qset,4;
- goto L_QuestGiven;
-
-///////Job list 8///////
-N_JobList8:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Banana Juice",-,"Another Delivery",N_Delivery4,"My lost beeds",N_LostBeeds,"^FF0000Baphomet!^000000",N_Bapho;
- mes "^FF0000Banana Juice^FF0000";
- mes "^FF0000------------^FF0000";
- mes "Sound gross to some good to others.";
- mes " ";
- mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her.";
- set eight_qset,1;
- goto L_QuestGiven;
-
-N_Delivery4:
- mes "^FF0000Another Delivery^FF0000";
- mes "^FF0000----------------^FF0000";
- mes "Well yah box delivering is in high demand,lots of lazy people.";
- mes " ";
- mes "Take this package to a man in Morroc named Klye.";
- set eight_qset,2;
- getitem 1081,1; //Delivery_Box
- goto L_QuestGiven;
-
-N_Bapho:
- mes "^FF0000Baphomet!^FF0000";
- mes "^FF0000*********^FF0000";
- mes "Hidden in the Temple he watches and guards.";
- mes " ";
- mes "Rumor has it that a Goat Man is lurking in the Hidden Temple, There is also a man in the Hidden Temple names Zack that needs you help with this Goat Man known as Baphomet.";
- set eight_qset,3;
- goto L_QuestGiven;
-
-N_LostBeeds:
- mes "^FF0000My lost Beeds^FF0000";
- mes "^FF0000-------------^FF0000";
- mes "Oh great I smell stupidity...";
- mes " ";
- mes "A little girl in Payon wants to talk to you, her name is Flower, What a stupid name,Hahaha.";
- set eight_qset,4;
- goto L_QuestGiven;
-
-///////Job list 9///////
-N_JobList9:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "Smelly Box",-,"Payon Cave",N_PayonC,"^FF0000Sohee's Everywere!^000000",N_Sohee,"^FF0000Moonlight Flower^000000",N_Moonlight;
- mes "^FF0000Smelly Box^FF0000";
- mes "^FF0000----------^FF0000";
- mes "Oh god please get this out of here fast.";
- mes " ";
- mes "Oh man smells like someone died in here.Take this to the Magic School in Geffen and hurry,ahh the smell its burning my eye's!!!";
- getitem 1082,1; //Delivery_Box_
- set nine_qset,1;
- goto L_QuestGiven;
-
-N_Sohee:
- mes "^FF0000Sohee's Everywere!^FF0000";
- mes "^FF0000******************^FF0000" ;
- mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
- mes " ";
- mes "Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school.";
- next;
- mes "The strange thing about what happened was that the children inside did not seem to die from the flames.";
- mes "Speak to the little school girl somewere in Payon.";
- set nine_qset,2;
- goto L_QuestGiven;
-
-N_Moonlight:
- mes "^FF0000Moonlight Flower^FF0000";
- mes "^FF0000****************^FF0000" ;
- mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
- mes " ";
- mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave, We don't know much because no one ever seems to make it back alive.";
- set nine_qset,3;
- goto L_QuestGiven;
-
-N_PayonC:
- mes "^FF0000Payon Cave^FF0000";
- mes "^FF0000----------^FF0000" ;
- mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
- mes " ";
- mes "The farther we go into the cave the stranger it gets.";
- set nine_qset,4;
- goto L_QuestGiven;
-
-///////Job list 10///////
-N_JobList10:
- mes "[Guy]";
- mes "Ok you have a couple quests that can be done here.";
- next;
- menu "The Blank Box",-,"^FF0000Eddga^000000",N_Eddga,"^FF0000Phreeoni^000000",N_Phreeoni,"^FF0000Maya^000000",N_Maya;
-
- mes "^FF0000The Blank Box^FF0000";
- mes "^FF0000-------------^FF0000";
- mes "Package to Morroc";
- mes " ";
- mes "There is nothing writen on this box but a notice to deliver it to a man Kreg.";
- getitem 1082,1; //Delivery_Box_
- set ten_qset,1;
- goto L_QuestGiven;
-
-N_Eddga:
- mes "^FF0000Eddga^FF0000";
- mes "^FF0000*****^FF0000";
- mes "Tony the Tiger is on crack and destroying the forest.";
- mes " ";
- mes "Talk to a man outside the 'Hidden' Hunter Guild, He needs your help.";
- set ten_qset,2;
- goto L_QuestGiven;
-
-N_Phreeoni:
- mes "^FF0000Phreeoni^FF0000";
- mes "^FF0000********^FF0000";
- mes "He is big and Pink and you run and hide!";
- mes " ";
- mes "This guy just poped into some hole one day, He dosent look that tough but you would be supprised. Talk to a man named Caral outside of Ant Hell.";
- set ten_qset,3;
- goto L_QuestGiven;
-
-N_Maya:
- mes "^FF0000Maya^FF0000";
- mes "^FF0000****^FF0000";
- mes "Something scary!";
- mes " ";
- mes "This half naked freak need an army to take down, now its your job, good luck. Meet a girl named Jeni outside of the back entrance to Ant Hell.";
- set ten_qset,4;
- goto L_QuestGiven;
-}
+//===== Athena Script =====================================
+//= Treasure Hunter Script
+//===== Converted By ======================================
+//= Fredzilla
+//= Original
+///////////////////////////////////////////////////////////
+// Treasure Hunter Quests //
+// By: Ezekial //
+// for the use on nRO run by Newbe5 //
+// revised By Warlock //
+///////////////////////////////////////////////////////////
+//===== Version ===========================================
+//= 1.2
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Start for Treasure hunter quests
+//===== Comments ==========================================
+//= Event_THQS - Used to check if you have already registerd
+//= #Treasure_Token - used to keep track of tokens
+//= 1.0 - Straight conversionof Aegis NPC file
+//= 1.1 Added time penalty to prevent get quests to often [Lupus]
+//= 1.2 Fixed not working penalty, added anti-cheat [Lupus]
+//////////////////////////////////////////////////////////
+
+
+yuno_in01.gat,112,151,6 script Quest Manager 62,{
+ mes "[Guy]";
+ mes "Welcome to the Treasure Hunters Guild "+strcharinfo(0)+".";
+ next;
+ if (On_Quest == 0) goto N_NewQuest;
+ mes "[Guy]";
+ mes "Look " +strcharinfo(0)+ ", you can only 1 quest at a time, you should finish the quest unless you have given up.";
+ mes "Giving up will cost you ^FF00002500z^000000.";
+ next;
+ menu "No, never would I leave a quest!",-,"Yah I'm pathetic... Pay 2500z",N_PayZeny;
+ mes "[Guy]";
+ mes "Good well get back out there.";
+ close;
+N_PayZeny:
+ if (zeny < 2500) goto N_ZenyFail;
+ set one_qset, 0;
+ set two_qset, 0;
+ set three_qset, 0;
+ set four_qset, 0;
+ set five_qset, 0;
+ set six_qset, 0;
+ set seven_qset, 0;
+ set eight_qset, 0;
+ set nine_qset, 0;
+ set ten_qset, 0;
+ set On_Quest, 0;
+ set Zeny,Zeny-2500;
+ //add time delay penalty. You can get another quest after 2 - 3 hours. [Lupus]
+ set #THQ_DELAY, (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)+rand(2,3));
+ mes "[Guy]";
+ mes "Its sad to see someone give a quest up...";
+ mes "Shame on you.";
+ emotion 7;
+ close;
+
+N_ZenyFail:
+ mes "[Guy]";
+ mes "Thats sad you don't even have ^FF00002500z^000000.";
+ close;
+
+N_NewQuest:
+ if (Event_THQS == 0) goto N_Signup;
+ //checking if time penalty is over [Lupus]
+ if (#THQ_DELAY > (GetTime(7)*12*31*24 + GetTime(6)*31*24 + GetTime(5)*24 + GetTime(3)) ) goto L_NoQuestsForYet;
+ mes "[Guy]";
+ mes "Ahh welcome fellow Treasure Hunter.";
+ mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!";
+ mes "Would you like me to asign you a Quest?";
+ next;
+ menu "Yes I would like a Quest Please.",-,"Sorry Guy no time today.",N_NoTime;
+
+ mes "[Guy]";
+ mes "Ok lets see what quest we can give you today.";
+ mes "The quest names in ^FF0000This Colour^000000 mean that they are more challanging then the rest, but have better rewards.";
+ next;
+ set #THQ_DELAY,(GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3) + 1); //you can get another quest after 1 hour [Lupus]
+ emotion 21;
+ if(@treasure_job==0) set @treasure_job,rand(1,10); //doesn't allow cheaters to pick any quest they want
+ if(@treasure_job==2) goto N_JobList2;
+ if(@treasure_job==3) goto N_JobList3;
+ if(@treasure_job==4) goto N_JobList4;
+ if(@treasure_job==5) goto N_JobList5;
+ if(@treasure_job==6) goto N_JobList6;
+ if(@treasure_job==7) goto N_JobList7;
+ if(@treasure_job==8) goto N_JobList8;
+ if(@treasure_job==9) goto N_JobList9;
+ if(@treasure_job==10) goto N_JobList10;
+ goto N_JobList1; //if(@treasure_job==1)
+
+N_NoTime:
+ mes "[Guy]";
+ mes "Alright maybe next time "+strcharinfo(0)+".";
+ emotion 20;
+ close;
+
+N_Signup:
+ mes "[Guy]";
+ mes "I'm afraid you must sign up for the guild before you can go on a quest!";
+ emotion 17;
+ close;
+
+L_NoQuestsForYet:
+ mes "[Guy]";
+ mes "I'm afraid there aren't any Quests for you yet.";
+ mes "Call in "+ (#THQ_DELAY - (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)) )+" hours later.";
+ emotion 17;
+ close;
+
+L_QuestGiven:
+ set On_Quest,1;
+ set @treasure_job,0; //next time u get random quest
+ close;
+
+///////Job list 1///////
+N_JobList1:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Lost Old Man.",-,"Master needs his Bow.",N_MasterBow,"The Hit List.",N_HitList,"^FF0000The Sad Widow.^000000",N_SadWidow;
+ mes "[Guy]";
+ mes "^FF0000Lost Old Man^000000";
+ mes "^FF0000------------^000000";
+ mes "This is an easy and low payed quest.";
+ mes " ";
+ mes "A wife came in asking us to find his husband, she seems to come in alot asking us to find him over and over again.";
+ next;
+ mes "[Guy]";
+ mes "But he always seems to be around the same place so there isn't much looking involved,check the mountains 1 west and 1 north of prontera.";
+ set one_qset,1;
+ goto L_QuestGiven;
+
+N_MasterBow:
+ mes "[Guy]";
+ mes "^FF0000Master needs his Bow^000000";
+ mes "^FF0000--------------------^000000";
+ mes "This is just a package delivery run, no big deal or anything.";
+ mes " ";
+ mes "Take this to an archer in the Archer Village outside of Payon.";
+ getitem 1072,1; //Delivery_Box
+ set one_qset,2;
+ goto L_QuestGiven;
+
+N_HitList:
+ mes "[Guy]";
+ mes "^FF0000The Hit List^000000";
+ mes "^FF0000------------^000000";
+ mes "In this quest you get to see some action.";
+ mes " ";
+ mes "There has been a farmer that keeps having all his crops eaten by ^FF0000Thief Bugs, Porings, and Lunitics^000000 here is a lost of what I need you to do. He is nexting East of Prontera.";
+ next;
+ mes "[Guy]";
+ mes "Ok go to the east and bash those little bastards like there is no tommorow. When you are done with that list you have just discard it, but you will NOT get another one!.";
+ set one_qset,3;
+ goto L_QuestGiven;
+
+N_SadWidow:
+ mes "^FF0000The Sad Widow^000000";
+ mes "^FF0000*************^000000";
+ mes "This is just another quest with possable well pay.";
+ mes " ";
+ mes "There is an old Widow in pontera, she recently lost her husband due to a monster attack.She has requested a Guild member to come talk to her at the Pontera Graveyard.";
+ set one_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 2///////
+N_JobList2:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "The Strange Letter",-,"Jur for Jeramiah",N_JurJeramiah,"Bee Keepers Hunny",N_BeeHunny,"^FF0000The Wander Man^000000",N_WanderMan;
+
+ mes "^FF0000The Strange Letter^000000";
+ mes "^FF0000------------------^000000";
+ mes "I do not know much about this quest.";
+ mes " ";
+ mes "A strange man came in here yesterday and asked me to deliver this ^FF0000Strange Letter^000000 to some woman in Morroc. Knowing us we do not ask questions so you must take care of this delivery.";
+ mes "The Woman is in located in Morroc and her name is Erika.";
+ set two_qset, 1;
+ getitem 1072,1; //Delivery_Message
+ goto L_QuestGiven;
+
+N_JurJeramiah:
+ mes "^FF0000Jur for Jeramiah^000000";
+ mes "^FF0000----------------^000000";
+ mes "Standard delivery quest.";
+ mes " ";
+ mes "Jeramiah ordered a Special Jur from our weapon shop.Your Job is to deliver it to him in the Assasin Temple.";
+ getitem 1998,1; //Jeramiah's_Jur
+ set two_qset,2;
+ goto L_QuestGiven;
+
+N_BeeHunny:
+ mes "^FF0000Bee Keepers Hunny^000000";
+ mes "^FF0000-----------------^000000";
+ mes "Strange man in the marsh need your help.";
+ mes " ";
+ mes "There is a strange man in the forest in ^FF00001 south and 1 west^000000 of Prontera, he need your help with something.";
+ set two_qset,3;
+ goto L_QuestGiven;
+
+N_WanderMan:
+ mes "^FF0000The Wander Man^000000";
+ mes "^FF0000**************^000000";
+ mes "There is a woman in Payon that is in desperate for aid.";
+ mes " ";
+ mes "There is a woman in Payon named Molly please get to her as soon as possable the letter she sent here sounded like someone was killing her.";
+ set two_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 3///////
+N_JobList3:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Damn Pixies!",-,"Package Delivery",N_Delivery1,"Prontera Culvert",N_ProntCulvert,"^FF0000Trouble at the Coal Mine^000000",N_CoalMine;
+ mes "^FF0000Damn Pixies!^000000";
+ mes "^FF0000------------^000000";
+ mes "Have you ever been to Hell?";
+ mes " ";
+ mes "A man outside of ^FF0000Ant Hell^000000 has requested your audiance, I suggest you hurry.";
+ set three_qset,1;
+ goto L_QuestGiven;
+
+N_Delivery1:
+ mes "^FF0000Package Delivery^000000";
+ mes "^FF0000----------------^000000";
+ mes "Standard drop off quest.";
+ mes " ";
+ mes "In this quest you need to deliver a mystery box to someone names ^FF0000Flank at the bridge between Aldebaran and Juno^000000.";
+ getitem 1082,1; //Delivery_Box_
+ set three_qset,2;
+ goto L_QuestGiven;
+
+N_ProntCulvert:
+ mes "^FF0000Prontera Culvert^000000";
+ mes "^FF0000----------------^000000";
+ mes "The bugs,They are everywere!.";
+ mes " ";
+ mes "The ^FF0000Prontera Culvert^000000 is out of control!Sign up as a volenteer to clean out some of the culvert.";
+ next;
+ mes "I know it seems like there is no stoping them but however many you kill does makes a differance. After you have signed up, inside the Culvert there will be a Knight that will give you a quest.";
+ set three_qset,3;
+ goto L_QuestGiven;
+
+N_CoalMine:
+ mes "^FF0000Trouble at the Coal Mine^000000";
+ mes "^FF0000************************^000000";
+ mes "The fun...err...trouble never stops in Rune Midgar.";
+ mes " ";
+ mes "Recently there was an acident at the coal mines. There was a huge chasm that released some undead Evil Druids.";
+ next;
+ mes "The Evil Druids started to turn all the workers into the undead. We do not know why, but we do not want to find out, contact a man named Rudolfo outside the Coal Mines.";
+ set three_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 4///////
+N_JobList4:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Zombie Attack",-,"Mystic Wizard",N_MWizard,"Aww shoot!",N_Shoot,"^FF0000Emperium^000000",N_Emp;
+ mes "^FF0000Zombie Attack^000000";
+ mes "^FF0000-------------^000000";
+ mes "The undead have invaded Payon Cave!";
+ mes " ";
+ mes "I remember when Payon Cave used to be a safe place to visit, but now undead Zombies have infested the cave! Please contact ^FF0000Flora outside on Payon Cave^000000 and aid her.";
+ set four_qset,1;
+ goto L_QuestGiven;
+
+N_MWizard:
+ mes "^FF0000Mystic Wizard^000000";
+ mes "^FF0000-------------^000000";
+ mes "Proto-type of a Staff must be delivered to Zed the Wizard.";
+ mes " ";
+ mes "Zed the Wizard has requested to try out a new un-named proto-type staff. It will be your job to deliver this to him. Zed tend to stay within the general area of Juno.";
+ getitem 1999,1; //Zed's_Staff
+ set four_qset,2;
+ goto L_QuestGiven;
+
+N_Shoot:
+ mes "^FF0000Aww shoot!^000000";
+ mes "^FF0000----------^000000";
+ mes "A little girl is in trouble.";
+ mes " ";
+ mes "There is a little girl in trouble, her name is Dassy and she is ^FF0000east of the prontera fountan^000000.";
+ set four_qset,3;
+ goto L_QuestGiven;
+
+N_Emp:
+ mes "^FF0000Emperium^000000";
+ mes "^FF0000********^000000";
+ mes "This is a strange quest that I know little about.";
+ mes " ";
+ mes "Someone in ^FF0000Prontera Guild Hall^000000 has requested to see one of our members, his name is Czhore.";
+ set four_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 5///////
+N_JobList5:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Savage Land",-,"Pyramid's part 1",N_PyrPRT1,"Thinking first",N_Thinkfirst,"^FF0000The not so friendly ghost^000000",N_Ghost;
+ mes "^FF0000Savage Land^000000";
+ mes "^FF0000-----------^000000";
+ mes "Easy for some very hard for others.";
+ mes " ";
+ mes "A man named Lithin wish's to give you a quest, you can find him north of prontera inside of ^FF0000The Hidden Temple^000000";
+ set five_qset,1;
+ goto L_QuestGiven;
+
+N_PyrPRT1:
+ mes "^FF0000Pyramid's^000000";
+ mes "^FF0000---------^000000";
+ mes "Its funny cause no one knows how these were really made.";
+ mes " ";
+ mes "Aperently the Pyramids have are beganing to be infested with undead activity,outside the pyramids a man will be nexting for you. He did no give us his name but he asked for you to hurry.";
+ set five_qset,2;
+ goto L_QuestGiven;
+
+N_Thinkfirst:
+ mes "^FF0000Thinking first^000000";
+ mes "^FF0000--------------^000000";
+ mes "This sounds like another one of those ditzy girl quests...";
+ mes " ";
+ mes "Dazzy the local blond around Geffen has asked for you to deliver her these flowers. I don't know why someone would send flowers to herself...";
+ getitem 744,1; //Bouquet
+ set five_qset,3;
+ goto L_QuestGiven;
+
+N_Ghost:
+ mes "^FF0000The not so friendly ghost^000000";
+ mes "^FF0000*************************^000000";
+ mes "Well no one ever said Casper was nice behind the sceens.";
+ mes " ";
+ mes "A wizard on the 3rd floor of geffen tower want's to talk to you about the anchient ruins underneath the city.";
+ set five_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 6///////
+N_JobList6:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Package for thiefs",-,"Pyramid's part 2",N_PyrPRT2,"Special delivery",N_Delivery2,"^FF0000Geffenia^000000",N_Gef;
+ mes "^FF0000Package for thiefs^000000";
+ mes "^FF0000------------------^000000";
+ mes "How ironic.";
+ mes " ";
+ mes "Deliver this Box to the Thiefs guild.";
+ set six_qset,1;
+ getitem 1083,1; //Delivery_Box__
+ goto L_QuestGiven;
+
+N_PyrPRT2:
+ mes "^FF0000Pyramid's part 2^000000";
+ mes "^FF0000----------------^000000";
+ mes "More undead action in this triangle!";
+ mes " ";
+ mes "Talk to a man outside the entrance of the pyramids, he seems to have another quest for you.";
+ set six_qset,2;
+ goto L_QuestGiven;
+
+N_Delivery2:
+ mes "^FF0000Special delivery^000000";
+ mes "^FF0000----------------^000000";
+ mes "Well most of what we do is run packages, this is no different from other's.";
+ mes " ";
+ mes "Take this box, DO NOT OPEN IT! To a little girl in Lutie named Chirach she should be around santa.";
+ set six_qset,3;
+ getitem 1083,1; //Delivery_Box__
+ goto L_QuestGiven;
+
+N_Gef:
+ mes "^FF0000Geffenia^000000";
+ mes "^FF0000********^000000";
+ mes "The little children of Geffen have been haveing strange nightmares.";
+ mes " ";
+ mes "We belive that the ruins underneath geffen are causeing this problem, talk to a Wizard named Zuuzuu inside Geffen Tower for your mission.";
+ set six_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 7///////
+N_JobList7:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Apple Juice",-,"Delivery",N_Delivery3,"^FF0000Golden Thief Bug^000000",N_GTB,"^FF0000Evil Pirates^000000",N_EvilPirates;
+ mes "^FF0000Apple Juice^000000";
+ mes "^FF0000-----------^000000";
+ mes "Can't say no to some good apple juice.";
+ mes " ";
+ mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her.";
+ set seven_qset,1;
+ goto L_QuestGiven;
+
+N_Delivery3:
+ mes "^FF0000Delivery^000000";
+ mes "^FF0000--------^000000";
+ mes "So many packages so little time.";
+ mes " ";
+ mes "Take this box to a man in Alberta named Charles.";
+ getitem 1082,1; //Delivery_Box_
+ set seven_qset,2;
+ goto L_QuestGiven;
+
+N_GTB:
+ mes "^FF0000Golden Thief Bug^000000";
+ mes "^FF0000****************^000000";
+ mes "The prontera Culvert has never been the same...";
+ mes " ";
+ mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert. Talk to a Knight inside the Culvert.";
+ set seven_qset,3;
+ goto L_QuestGiven;
+
+N_EvilPirates:
+ mes "^FF0000Evil Pirates^000000";
+ mes "^FF0000************^000000";
+ mes "A ghost ship has washed up on shore on an island outside of Izlude.";
+ mes " ";
+ mes "A female assasin has a quest for you, she is nexting outside the Ghost Ship.There have been reports of evil undead pirates lurking around inside the ship.";
+ set seven_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 8///////
+N_JobList8:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Banana Juice",-,"Another Delivery",N_Delivery4,"My lost beeds",N_LostBeeds,"^FF0000Baphomet!^000000",N_Bapho;
+ mes "^FF0000Banana Juice^FF0000";
+ mes "^FF0000------------^FF0000";
+ mes "Sound gross to some good to others.";
+ mes " ";
+ mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her.";
+ set eight_qset,1;
+ goto L_QuestGiven;
+
+N_Delivery4:
+ mes "^FF0000Another Delivery^FF0000";
+ mes "^FF0000----------------^FF0000";
+ mes "Well yah box delivering is in high demand,lots of lazy people.";
+ mes " ";
+ mes "Take this package to a man in Morroc named Klye.";
+ set eight_qset,2;
+ getitem 1081,1; //Delivery_Box
+ goto L_QuestGiven;
+
+N_Bapho:
+ mes "^FF0000Baphomet!^FF0000";
+ mes "^FF0000*********^FF0000";
+ mes "Hidden in the Temple he watches and guards.";
+ mes " ";
+ mes "Rumor has it that a Goat Man is lurking in the Hidden Temple, There is also a man in the Hidden Temple names Zack that needs you help with this Goat Man known as Baphomet.";
+ set eight_qset,3;
+ goto L_QuestGiven;
+
+N_LostBeeds:
+ mes "^FF0000My lost Beeds^FF0000";
+ mes "^FF0000-------------^FF0000";
+ mes "Oh great I smell stupidity...";
+ mes " ";
+ mes "A little girl in Payon wants to talk to you, her name is Flower, What a stupid name,Hahaha.";
+ set eight_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 9///////
+N_JobList9:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "Smelly Box",-,"Payon Cave",N_PayonC,"^FF0000Sohee's Everywere!^000000",N_Sohee,"^FF0000Moonlight Flower^000000",N_Moonlight;
+ mes "^FF0000Smelly Box^FF0000";
+ mes "^FF0000----------^FF0000";
+ mes "Oh god please get this out of here fast.";
+ mes " ";
+ mes "Oh man smells like someone died in here.Take this to the Magic School in Geffen and hurry,ahh the smell its burning my eye's!!!";
+ getitem 1082,1; //Delivery_Box_
+ set nine_qset,1;
+ goto L_QuestGiven;
+
+N_Sohee:
+ mes "^FF0000Sohee's Everywere!^FF0000";
+ mes "^FF0000******************^FF0000" ;
+ mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
+ mes " ";
+ mes "Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school.";
+ next;
+ mes "The strange thing about what happened was that the children inside did not seem to die from the flames.";
+ mes "Speak to the little school girl somewere in Payon.";
+ set nine_qset,2;
+ goto L_QuestGiven;
+
+N_Moonlight:
+ mes "^FF0000Moonlight Flower^FF0000";
+ mes "^FF0000****************^FF0000" ;
+ mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
+ mes " ";
+ mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave, We don't know much because no one ever seems to make it back alive.";
+ set nine_qset,3;
+ goto L_QuestGiven;
+
+N_PayonC:
+ mes "^FF0000Payon Cave^FF0000";
+ mes "^FF0000----------^FF0000" ;
+ mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House.";
+ mes " ";
+ mes "The farther we go into the cave the stranger it gets.";
+ set nine_qset,4;
+ goto L_QuestGiven;
+
+///////Job list 10///////
+N_JobList10:
+ mes "[Guy]";
+ mes "Ok you have a couple quests that can be done here.";
+ next;
+ menu "The Blank Box",-,"^FF0000Eddga^000000",N_Eddga,"^FF0000Phreeoni^000000",N_Phreeoni,"^FF0000Maya^000000",N_Maya;
+
+ mes "^FF0000The Blank Box^FF0000";
+ mes "^FF0000-------------^FF0000";
+ mes "Package to Morroc";
+ mes " ";
+ mes "There is nothing writen on this box but a notice to deliver it to a man Kreg.";
+ getitem 1082,1; //Delivery_Box_
+ set ten_qset,1;
+ goto L_QuestGiven;
+
+N_Eddga:
+ mes "^FF0000Eddga^FF0000";
+ mes "^FF0000*****^FF0000";
+ mes "Tony the Tiger is on crack and destroying the forest.";
+ mes " ";
+ mes "Talk to a man outside the 'Hidden' Hunter Guild, He needs your help.";
+ set ten_qset,2;
+ goto L_QuestGiven;
+
+N_Phreeoni:
+ mes "^FF0000Phreeoni^FF0000";
+ mes "^FF0000********^FF0000";
+ mes "He is big and Pink and you run and hide!";
+ mes " ";
+ mes "This guy just poped into some hole one day, He dosent look that tough but you would be supprised. Talk to a man named Caral outside of Ant Hell.";
+ set ten_qset,3;
+ goto L_QuestGiven;
+
+N_Maya:
+ mes "^FF0000Maya^FF0000";
+ mes "^FF0000****^FF0000";
+ mes "Something scary!";
+ mes " ";
+ mes "This half naked freak need an army to take down, now its your job, good luck. Meet a girl named Jeni outside of the back entrance to Ant Hell.";
+ set ten_qset,4;
+ goto L_QuestGiven;
+}
diff --git a/npc/custom/quests/thq/THQS_Quests.txt b/npc/custom/quests/thq/THQS_Quests.txt
index 623e281fc..d7aad4312 100644
--- a/npc/custom/quests/thq/THQS_Quests.txt
+++ b/npc/custom/quests/thq/THQS_Quests.txt
@@ -1,1053 +1,1053 @@
-//===== Athena Script =====================================
-//= Treasure Hunter Script
-//===== Converted By ======================================
-//= Fredzilla
-//= Original
-///////////////////////////////////////////////////////////
-// Treasure Hunter Quests //
-// By: Ezekial //
-// for the use on nRO run by Newbe5 //
-// revised By Warlock //
-///////////////////////////////////////////////////////////
-//===== Version ===========================================
-//= 1.3
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Start for Treasure hunter quests
-//===== Comments ==========================================
-//= Event_THQS - Used to check if you have already registerd
-//= #Treasure_Token - used to keep track of tokens
-//= 1.0 - Straight conversionof Aegis NPC file
-//= 1.2 some bugfixes, typos [Lupus]
-//= 1.3 Removed Duplicates [Silent]
-//////////////////////////////////////////////////////////
-
-
-///////Job list 1///////
-//1-1
-mjolnir_09.gat,187,189,6 script Old Man 107,{
- if (one_qset==1) goto N_QuestStart;
- mes "[Old Man]";
- mes "Eh! Can't and old man walk in peace anymore?!";
- close;
-N_QuestStart:
- mes "[Old Man]";
- mes "Eh? whats that?!";
- mes " ";
- mes "My wife wants me home?! Alright, alright... I'm going, I'm going. Thank you for telling me the message.";
- mes " ";
- mes "Here take this Treasure Token.";
- set one_qset,0;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-}
-//1-2;
-pay_arche.gat,86,129,6 script Archer 732,{
- if (one_qset == 2) goto N_QuestStart;
- mes "[Kieth]";
- mes "Sorry can't talk, I'm a busy man, I'm waiting for my package.";
- close;
-N_QuestStart:
- mes "[Kieth]";
- mes "Ahh, you must be from the Treasure Hunter Agensy. Do you have my bow??";
- mes " ";
- mes "Ahh, good,thank you for your time. Take this Treasure Token.";
- set one_qset,0;
- set On_Quest,0;
- delitem 1072,1;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-}
-//1-3
-prt_fild06.gat,37,192,6 script Farmer 125,{
- if (one_qset == 3 && countitem(909) > 19 && countitem(955) > 19 && countitem(914) > 19 && countitem(705) > 19) goto N_QuestComp;
- if (one_qset==3) goto N_QuestStart;
- mes "[Billy-Bob]";
- mes "Arrrg!... Those Bastard Bugs have eaten everything, this place donest even look like my farm anymore!!";
- close;
-N_QuestComp:
- mes "[Billy-Bob]";
- mes "Ohhh, thank you thats a good start for me.";
- mes "Well those bugs can bugger off...";
- mes " ";
- mes "Well here take these 2 Treasure Tokens.";
- set one_qset,0;
- set #Treasure_Token,#Treasure_Token+2;
- set On_Quest,0;
- delitem 909,20;
- delitem 955,20;
- delitem 914,20;
- delitem 705,20;
- close;
-N_QuestStart:
- mes "[Billy-Bob]";
- mes "Those Bastard Bugs are Everywere!!!";
- mes "You must be from the guild! OK, bring me 20 Worm Peelings, 20 Jellopys, 20 fluff and 20 Clovers.";
- close;
-}
-//1-4
-prontera.gat,264,353,6 script Old Lady 103,{
- if (one_qset == 4 && countitem(934) > 14) goto N_QuestComp;
- if (one_qset == 4) goto N_QuestStart;
- mes "[Old Lady]";
- mes "This is my husbands grave... I'm just paying him a little visit.";
- close;
-N_QuestComp:
- mes "[Old Lady]";
- mes "You have them?!";
- next;
- mes "[Old Lady]";
- mes "Thank you sooo much here have these 3 Treasure Tokens.";
- set #Treasure_Token,#Treasure_Token+3;
- delitem 934,15;
- set one_qset,0;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Old Lady]";
- mes "So your the one that has come to help me?";
- mes " ";
- mes "Ok well this is what I wanted you to do,this greave beside me is my husbands grave and I promised him that I would bury some Mementos with him, The problem is that I have no Mementos...";
- next;
- mes "[Old Lady]";
- mes "Bring me 15 Mementos, please.";
- close;
-}
-///////Job list 2///////
-//2-1;
-morocc.gat,59,109,6 script Erika 700,{
- if (two_qset == 1 && countitem(1072) > 0) goto N_QuestComp;
- if (two_qset == 1) goto N_QuestStart;
- mes "[Erika]";
- mes "Hello my name is Erika.";
- close;
-N_QuestComp:
- mes "[Erika]";
- mes "What's that? You have a letter for me!!";
- mes "Oooooh I just love,love letters :D. next here will I open it.";
- next;
- mes "[Letter]";
- mes "Dear Erika";
- mes " ";
- mes "Sorry to inform you but you have been evicted, please move out within 3-5 days.";
- mes " ";
- mes "-Managment";
- next;
- mes "[Erika]";
- mes "Oh... um... Well fuck, that bastard thinks he can kick me out!!!!! He's got another thing coming!";
- mes " ";
- mes "Well thank you for delivering this anyway have this Treasure Token.";
- delitem 1072,1;
- set two_qset,0;
- set #Treasure_Token,#Treasure_Token+1;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Erika]";
- mes "So your the one that has a letter for me?";
- mes " ";
- mes "Ok well where's the letter?";
- close;
-}
-//2-2;
-in_moc_16.gat,15,30,6 script Jeramiah 730,{
- if (two_qset == 2 && countitem(1998) > 0) goto N_QuestComp;
- if (two_qset == 2) goto N_QuestStart;
- mes "[Jeramiah]";
- mes "Its so boring when you have to next on people...";
- close;
-N_QuestComp:
- mes "[Jeramiah]";
- mes "Ahh hello, you must be from the Treasure Hunter Guild.";
- mes "Do you have my Jur? Ahh good good. Thank you.";
- mes "Here have this Treasure Hunter Token.";
- set two_qset,0;
- set On_Quest,0;
- delitem 1998,1;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Jeramiah]";
- mes "So your the one that is supposed to bring my Jur?";
- mes "So where's my Jur?";
- close;
-}
-//2-3;
-prt_fild07.gat,316,263,6 script Marsh Man 84,{
- if (two_qset == 3 && countitem(518) > 19) goto N_QuestComp;
- if (two_qset == 3) goto N_QuestStart;
- mes "[Lenith]";
- mes "Hello, sorry I don't have much time to talk I'm waiting for someone.";
- close;
-N_QuestComp:
- mes "[Lenith]";
- mes "Oh hello, OH you have my honey, my bees and I thank you.";
- mes " ";
- mes "Here have these 2 Treasure Hunter Tokens.";
- delitem 518,20;
- set #Treasure_Token,#Treasure_Token+2;
- set two_qset,0;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Lenith]";
- mes "Hello, my name is Lenith and I have a quest for you.";
- mes "Well resently a bunch of stupid bears stole the supers off all my bee's nests...Stupid bears.";
- mes " ";
- mes "What I need you to do is find me some more honey so these bee's can get through the winter. I will need about 20 Honey.";
- close;
-}
-//2-4;
-payon.gat,161,72,6 script Molly 714,{
- if (two_qset == 4 && countitem(7005) > 0) goto N_QuestComp;
- if (two_qset == 4) goto N_QuestStart;
- mes "[Molly]";
- mes "Sorry can't talk, I'm waiting for someone.";
- close;
-N_QuestComp:
- mes "[Molly]";
- mes "WOW YOU DID IT!!!";
- mes " ";
- mes "I knew you looked strong, I have no idea how you could have killed that monster though.";
- mes "thank you so much, here have these 3 Guild Tokens as a reward.";
- set two_qset,0;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+3;
- delitem 7005,1;
- close;
-N_QuestStart:
- mes "[Molly]";
- mes "Wow you must be the brave man from the treasure hunter guild!";
- mes "Ok here is whats happening, I don't know what started it but there is a strange Ronan Skeleton running aroung the woods 2 East from here.";
- next;
- mes "[Molly]";
- mes "We have try to kill him in the past but it was not...ummm...It was a bad idea. What I want you to do is go there and bring me back his Skull as proof of you killing him.";
- mes " ";
- mes "Good Luck";
- close;
-}
-///////Job list 3///////
-//3-1;
-moc_fild04.gat,208,322,6 script Clark 65,{
- if (three_qset == 1 && countitem(1040) > 29) goto N_QuestComp;
- if (three_qset == 1) goto N_QuestStart;
- mes "[Clark]";
- mes "Love to chat, but I'm waiting for someone.";
- close;
-N_QuestComp:
- mes "[Clark]";
- mes "Ok well this is a start.";
- mes " ";
- mes "I hope that this hole will go away 1 day, and I might have another quest for you in the future.";
- mes "here take these 2 Treasure Tokens.";
- set #Treasure_Token,#Treasure_Token+2;
- delitem 1040,30;
- set three_qset,0;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Clark]";
- mes "Well hello to you.";
- mes "You must be from the Treasure Hunter Guild.";
- mes " ";
- mes "Ok well this is my problem, yah see that hole in the ground? Yah that thing just popped out of nowhere a couple years ago, inside its full of these ugly ants and these monsters called Giearths.";
- next;
- mes "[Clark]";
- mes "What I want you to do is kill some of the Giearths.Bring me 30 of there little Moustaches.";
- close;
-}
-//3-2;
-yuno_fild01.gat,186,162,6 script Flank 73,{
- if (three_qset == 2 && countitem(1082) > 0) goto N_QuestComp;
- if (three_qset == 2) goto N_QuestStart;
- mes "[Flank]";
- mes "Sorry I'm waiting for my package so I don't want to talk.";
- close;
-N_QuestComp:
- mes "[Flank]";
- mes "Perfect right on time, now I must be going to plant this bomb.... Err I meen give this package to my mother for her birthday.";
- next;
- mes "[Flank]";
- mes "Thanks";
- mes "Have this Treasure Token";
- set three_qset,0;
- delitem 1082,1;
- set #Treasure_Token,#Treasure_Token+1;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Flank]";
- mes "So you have my packages?";
- mes "Well where is it then?";
- close;
-}
-//3-3 Goes to 7-3 using callfunc
-prt_sewb1.gat,120,245,6 script Sewer Managment Knight 705,{
- if (three_qset == 3 && countitem(955) > 149) goto N_QuestComp;
- if (three_qset == 3) goto N_QuestStart;
- if (seven_qset == 3) goto N_QuestStart2;
- mes "[Sewer Managmant]";
- mes "Live dosent get any worse for me,working in the bug filled Culvert every day...";
- close;
-N_QuestComp:
- mes "[Sewer Managment]";
- mes "Well that looked like it was no trouble for you.";
- mes "Thanks have these 4 Treause Tokens.";
- delitem 955,150;
- set #Treasure_Token,#Treasure_Token+4;
- set three_qset,0;
- set On_Quest,0;
- close;
-N_QuestStart:
- mes "[Sewer Managmant]";
- mes "For a while now we have had monster, mostly bugs infesting the culvert...";
- mes " ";
- mes "What I want you to do is kinda clean some of it out, every little bit counts.";
- mes "Bring me 150 Worm Peelings.";
- close;
-N_QuestStart2:
- callfunc "seven_qset-3";
- close;
-}
-//3-4
-mjolnir_02.gat,87,357,6 script Man#01 51,{
- if (three_qset == 4 && countitem(1041) > 49) goto N_QuestComp;
- if (three_qset == 4) goto N_QuestStart;
- mes "[Rudolfo]";
- mes "Danger, the Coal Mine is now a hostile area.";
- close;
-N_QuestComp:
- mes "[Rudolfo]";
- mes "Well its good to see that you have come back alive.";
- mes "I had my doughts but thank you for your help.";
- mes " ";
- mes "Here have these 4 Treasure Tokens.";
- set three_qset,0;
- set On_Quest,0;
- delitem 1041,50;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Rudolfo]";
- mes "Hello, you must be from the Treasure Hunter Guild.";
- mes " ";
- mes "They must have filled you in on what is happening on the lower levels of this Coal Mine, I know its desturbing and we are still trying to figure out why and how 2 Evil Druids got down there.";
- mes " ";
- mes "Well what I want you to do is bring me 50 Lantern's as proof that you have cleaned some of them out, any loot you find down there you may keep other then what I have asked you to get for me.";
- close;
-}
-///////Job list 4///////
-//4-1;
-pay_arche.gat,45,138,6 script Flora 724,{
- if (four_qset == 1 && countitem(957) > 49) goto N_QuestComp;
- if (four_qset == 1) goto N_QuestStart;
- mes "[Flora]";
- mes "Well hello be carfull in the cave, we have heard reports of Undead monster funning around.";
- close;
-N_QuestComp:
- mes "[Flora]";
- mes "Welcome back, good job you did it. (I wonder if that Flaming Bastard is still alive)";
- mes "Well I hope that cut down a bit on the monsters and here have these 2 Tokens.";
- set #Treasure_Token,#Treasure_Token+2;
- delitem 957,50;
- set four_qset,0;
- set On_Quest,0;
- killmonster "pay_dun00.gat","Flora::OnMobDead";
- close;
-N_QuestStart:
- mes "[Flora]";
- mes "Well hello there.";
- mes " ";
- mes "Well this is what I need you to do, bring me 50 Decayed Nails - awile back Payon Cave used to be a safe place to go...But now things have gone out of controll and Zombies have invaded the first floor...";
- mes " ";
- mes "There is also these new monsters that have just poped out of no were, we call them Flaming Bastards...Be carfull if you arn't powerfull yet because they are very strong.";
- next;
- mes "[Flora]";
- mes "Good Luck";
- mes "Remember I need 50 Nail's";
- monster "pay_dun00.gat",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead";
- monster "pay_dun00.gat",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead";
- close;
-OnMobDead:
- end;
-}
-//4-2;
-yuno.gat,45,138,6 script Zed 735,{
- if (four_qset == 2 && countitem(1999) > 0) goto N_QuestComp;
- if (four_qset == 2) goto N_QuestStart;
- mes "[Zed]";
- mes "Get out of my face you flake.";
- close;
-N_QuestComp:
- mes "[Zed]";
- mes "Dear god took you long enough you bastard!";
- mes "You know how much my time is worth!!!!";
- mes "Your slow and I'm never gona recomend a job for you, Gimmie my staff and get out of me face!";
- next;
- mes "[Zed]";
- mes "Well you can take this crapy Treausre Token.";
- set On_Quest,0;
- set four_qset,0;
- delitem 1999,1;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Zed]";
- mes "Where's my staff?";
- close;
-}
-//4-3;
-prontera.gat,176,204,6 script Dassy 95,{
- if (four_qset == 3 && countitem(711) > 19) goto N_QuestComp;
- if (four_qset == 3) goto N_QuestStart;
- mes "[Dassy]";
- mes "Hello!";
- close;
-N_QuestComp:
- mes "[Dassy]";
- mes "Yes! Now my pet will not starve!";
- mes "Thank you so much!";
- mes "Have this Treasure Token.";
- set On_Quest,0;
- set four_qset,0;
- delitem 711,20;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Dassy]";
- mes "Hello person!!";
- mes "You have come to help me? Yes, yes.";
- mes " ";
- mes "Ok I don't want to talk about it but I need you to fine me 20 Shoot's";
- mes "Thank you!";
- close;
-}
-//4-4;
-prt_gld.gat,157,99,6 script Czhore 752,{
- if (four_qset == 4 && countitem(714) > 0) goto N_QuestComp;
- if (four_qset == 4) goto N_QuestStart;
- mes "[Czhore]";
- mes "Hello friend";
- mes "Have you come to check out one of these guild halls?";
- close;
-N_QuestComp:
- mes "[Czhore]";
- mes "Thank god!";
- mes " ";
- mes "I'm so happy to see one of these Emperiums! Thank you "+strcharinfo(0)+".";
- next;
- mes "[Czhore]";
- mes "Here have these 2 Treasure Tokens.";
- mes "And some of my old treasure...";
- monster "prt_gld.gat",155,99,"Old Man's Treasure",1324,1;
- set four_qset,0;
- set On_Quest,0;
- delitem 714,1;
- set #Treasure_Token,#Treasure_Token+2;
- close;
-N_QuestStart:
- mes "[Czhore]";
- mes "Hello friend";
- mes "I know this may sound stupid but ever since I was a boy I have dreamed of having an Emperium...";
- mes "As I know I look old, I have just never been able to find one, now that I am retired from the Treasure Hunter Guild there is no more action for me...";
- mes " ";
- mes "If you can get me one I shall reward you.";
- close;
-}
-///////Job list 5///////
-//5-1;
-prt_maze01.gat,18,184,6 script Lithin#01 752,{
- if (five_qset == 1 && countitem(1028) > 14) goto N_QuestComp;
- if (five_qset == 1) goto N_QuestStart;
- mes "[Lithin]";
- mes "Well hello.";
- mes "Welcome to the Forest Maze.";
- close;
-N_QuestComp:
- mes "[Lithin]";
- mes "Oh thank you so much, but they will be back...";
- next;
- mes "Take these 2 Treasure Tokens";
- set five_qset,0;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+2;
- delitem 1028,15;
- close;
-N_QuestStart:
- mes "[Lithin]";
- mes "Well hello.";
- mes "Welcome to the Forest Maze, I have a task for you.";
- mes " ";
- mes "Ever heard of a moster called a Savage? It looks like a boar but it makes very annoying noices.";
- mes "What I want you to do is bring me 15 Manes from the savages.";
- close;
-}
-//5-2 goes to 6-2 using callfunc;
-moc_ruins.gat,75,167,6 script Lithin#02 87,{
- if (five_qset == 2 && countitem(932) > 29) goto N_QuestComp;
- if (five_qset == 2) goto N_QuestStart;
- if (six_qset == 2) goto N_QuestStart2;
- mes "[Strange Man]";
- mes "...";
- close;
-N_QuestComp:
- mes "[Strange Man]";
- mes "Much thanks I have for you.";
- next;
- mes "Take with you these 2 Treasure Token's.";
- set #Treasure_Token,#Treasure_Token+2;
- set five_qset,0;
- set On_Quest,0;
- delitem 932,30;
- close;
-N_QuestStart:
- mes "[Strange Man]";
- mes "Must do for me you shall.Venture through the Pyramid.";
- mes "When second floor you have reached,slay skeletons of evil.";
- mes "Bring me back there bones you must.";
- mes "It is 30 that I desire.";
- close;
-N_QuestStart2:
- callfunc "six_qset2";
-}
-//5-3;
-geffen.gat,57,130,6 script Blonde Girl 724,{
- if (five_qset == 3 && countitem(744) > 0) goto N_QuestComp;
- if (five_qset == 3) goto N_QuestStart;
- mes "[Blonde Girl]";
- mes "I wonder what happened to my flowers";
- close;
-N_QuestComp:
- mes "[Blonde Girl]";
- mes "Oh are these my flower! To bad I don't want them anymore...";
- mes " ";
- mes "You can keep them is you want.";
- next;
- mes "[Blonde Girl]";
- mes "Here take this Treasure Token as a reward.";
- set five_qset,0;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Blonde Girl]";
- mes "Hello, did you bring me flowers!?!";
- close;
-}
-//5-4;
-gef_tower.gat,49,27,6 script Wizard#01 735,{
- if (five_qset == 4 && countitem(1059) > 49) goto N_QuestComp;
- if (five_qset == 4) goto N_QuestStart;
- mes "[Wizard]";
- mes "Hello, have you seen my Whisper friend?";
- close;
-N_QuestComp:
- mes "[Wizard]";
- mes "Thank you for helping me, I presume the worse.";
- next;
- mes "[Wizard]";
- mes "Here take these 4 Treasure Tokens.";
- set five_qset,0;
- set On_Quest,0;
- delitem 1059,50;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Wizard]";
- mes "Hello, the reason why I brought you here was because of a long time ago I made a friend, which happened to be a Whipser.";
- mes "He told me that he was always bullied by the other ghosts down there and I havent seen him in a while.";
- mes "Thinking of the worse case here, I want vengance!";
- mes " ";
- mes "Bring me 50 Fabrics!";
- close;
-}
-///////Job list 6///////
-//6-1;
-moc_prydb1.gat,47,132,6 script Thief 48,{
- if (six_qset == 1 && countitem(1083) > 0) goto N_QuestComp;
- if (six_qset == 1) goto N_QuestStart;
- mes "[Thief]";
- mes "Welcome to the Thiefs Guild.";
- close;
-N_QuestComp:
- mes "[Thief]";
- mes "Thank you for this delivery.";
- next;
- mes "[Thief]";
- mes "Here take this Treasure Token as a reward.";
- set six_qset,0;
- delitem 1083,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Thief]";
- mes "Where's my delivery?";
- close;
-}
-//6-2
-function script six_qset2 {
- if (six_qset == 2 && countitem(930) > 29) goto N_QuestComp2;
- mes "[Strange Man]";
- mes "Another quest for you I have.";
- mes "Futher into the pyramid you must go.";
- mes "Fighting Mummys is future for you.";
- mes " ";
- mes "Bring back for me their wrappings you must.";
- mes "It is 30 Rotten bandages I desire.";
- close;
-N_QuestComp2:
- mes "[Strange Man]";
- mes "Much thanks for you that I have.";
- next;
- mes "[Strange Man]";
- mes "Take with you these 3 tokens.";
- set #Treasure_Token,#Treasure_Token+3;
- delitem 930,30;
- set On_Quest,0;
- set six_qset,0;
- close;
-}
-//6-3;
-xmas.gat,144,136,6 script Chirach 48,{
- if (six_qset == 3 && countitem(1083) > 0) goto N_QuestComp;
- if (six_qset == 3) goto N_QuestStart;
- mes "[Chirach]";
- mes "Welcome.";
- close;
-N_QuestComp:
- mes "[Chirach]";
- mes "Thank you for this delivery.";
- next;
- mes "[Chirach]";
- mes "Here take this Treasure Token as a reward.";
- set six_qset,0;
- delitem 1083,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Chirach]";
- mes "Where's my delivery?";
- close;
-}
-//6-4;
-gef_tower.gat,52,87,6 script Wizard#02 735,{
- if (six_qset == 4 && countitem(944) > 19) goto N_QuestComp;
- if (six_qset == 4) goto N_QuestStart;
- mes "[Zuuzuu]";
- mes "Hello, welcome to geffen tower.";
- close;
-N_QuestComp:
- mes "[Wizard]";
- mes "Thank you for helping me.";
- next;
- mes "Here take these 4 Treasure Tokens.";
- set six_qset,0;
- set On_Quest,0;
- delitem 944,20;
- set #Treasure_Token,#Treasure_Token+4;
- next;
- mes "[Zuuzuu]";
- mes "Oh dear god!!!";
- mes "One of those evil mosters has followed you up here, Kill it, Kill it!!!";
- next;
- monster "gef_tower.gat",42,89,"Evil Nightmare",1061,1;
- close;
-N_QuestStart:
- mes "[Zuuzuu]";
- mes "Hello, the reason I sent for a young adventurer was because of the problems we are having under the tower.";
- mes "There seem to be more ghosts day after day down there. What I need you to do is go down there and find these mosters we call Nightmares.";
- mes " ";
- mes "You must slay them and bring me 20 of there horse shoes.";
- close;
-}
-///////Job list 7///////
-//7-1 goes to 8-1 using callfunc;
-prontera.gat,123,208,6 script Little Girl 717,{
- if (seven_qset == 1 && countitem(531) > 4) goto N_QuestComp;
- if (seven_qset == 1) goto N_QuestStart;
- if (eight_qset == 1) goto N_QuestStart2;
- mes "[Girl]";
- mes "Hello mister "+strcharinfo(0)+".";
- close;
-N_QuestComp:
- mes "[Girl]";
- mes "Thank you so much!";
- next;
- mes "[Girl]";
- mes "Have these 1 Treasure Tokens.";
- set seven_qset,0;
- set On_Quest,0;
- delitem 531,5;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Girl]";
- mes "Hi mister person. Can you get me some apple juice?";
- mes "I want 5 of them.";
- close;
-N_QuestStart2:
- callfunc "eight_qset1";
-}
-//7-2;
-alberta.gat,101,84,6 script Charles 48,{
- if (seven_qset == 2 && countitem(1082) > 0) goto N_QuestComp;
- if (seven_qset == 2) goto N_QuestStart;
- mes "[Charles]";
- mes "Hello "+strcharinfo(0)+" welcome to Alberta.";
- close;
-N_QuestComp:
- mes "[Charles]";
- mes "Thank you for this delivery.";
- next;
- mes "[Charles]";
- mes "Here take this Treasure Token as a reward.";
- set seven_qset,0;
- delitem 1082,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Charles]";
- mes "So where is my package?";
- close;
-}
-//7-3
-function script seven_qset-3 {
- if (seven_qset == 3 && countitem(969) > 0) goto N_QuestComp2;
- mes "[Sewer Managment]";
- mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert";
- mes " ";
- mes "Bring me 1 Gold Bar from him.";
- close;
-N_QuestComp2:
- mes "[Sewer Managment]";
- mes "Thank you for helping me.";
- next;
- mes "[Sewer Managment]";
- mes "Here take these 4 Treasure Tokens.";
- set seven_qset,0;
- set On_Quest,0;
- delitem 969,1;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-}
-//7-4;
-alb2trea.gat,94,102,6 script Scarlet 725,{
- if (seven_qset == 4 && countitem(1127) > 0) goto N_QuestComp;
- if (seven_qset == 4) goto N_QuestStart;
- mes "[Scarlet]";
- mes "Sorry, busy.";
- close;
-N_QuestComp:
- mes "[Scarlet]";
- mes "Thank you for helping me, I presume the worse.";
- next;
- mes "[Scarlet]";
- mes "Here take these 4 Treasure Tokens.";
- set seven_qset,0;
- set On_Quest,0;
- delitem 1127,1;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Scarlet]";
- mes "Good your here. Ok there are reports of an old captain named Drake abored this ship. Kill Him!";
- mes " ";
- mes "Bring me his Saber as proof!";
- close;
-}
-///////Job list 8///////
-//8-1
-function script eight_qset1 {
- if (eight_qset == 1 && countitem(532) > 4) goto N_QuestComp2;
- mes "[Girl]";
- mes "Hi mister person. Can you get me some Banana juice?";
- mes "I want 5 of them.";
- close;
-N_QuestComp2:
- mes "[Girl]";
- mes "Thank you so much!";
- next;
- mes "[Girl]";
- mes "Have these 1 Treasure Tokens.";
- set eight_qset,0;
- set On_Quest,0;
- delitem 532,5;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-}
-//8-2;
-morocc.gat,165,55,6 script Klye 48,{
- if (eight_qset == 2 && countitem(1081) > 0) goto N_QuestComp;
- if (eight_qset == 2) goto N_QuestStart;
- mes "[Klye]";
- mes "Hello "+strcharinfo(0)+".";
- close;
-N_QuestComp:
- mes "[Klye]";
- mes "Thank you for this delivery.";
- next;
- mes "[Klye]";
- mes "Here take this Treasure Token as a reward.";
- set eight_qset,0;
- delitem 1081,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Kyle]";
- mes "So where's my Delivery";
- close;
-
-}
-//8-3;
-prt_maze02.gat,103,86,6 script Zack 751,{
- if (eight_qset == 3 && countitem(923) > 0) goto N_QuestComp;
- if (eight_qset == 3) goto N_QuestStart;
- mes "[Zack]";
- mes "Hello, have you seen my Whisper friend?";
- close;
-N_QuestComp:
- mes "[Zack]";
- mes "Thank you for helping me, I presume the worse.";
- next;
- mes "[Zack]";
- mes "Here take these 5 Treasure Tokens.";
- set eight_qset,0;
- set On_Quest,0;
- delitem 923,1;
- set #Treasure_Token,#Treasure_Token+5;
- close;
-N_QuestStart:
- mes "[Zack]";
- mes "Hello,the reason why I brought you here was because of a very strange monster known as Baphomet.";
- mes "People say that Baphomet guilds the gate to the under-world but I don't belive them, Kill Baphomet!";
- mes " ";
- mes "Bring me his Evil Horn!";
- close;
-}
-//8-4;
-payon.gat,136,129,6 script Flower 703,{
- if (eight_qset == 4 && countitem(746) > 9) goto N_QuestComp;
- if (eight_qset == 4) goto N_QuestStart;
- mes "[Flower]";
- mes "Sorry I'm waiting for someone. You will have to come back later.";
- close;
-N_QuestComp:
- mes "[Flower]";
- mes "Thank you for helping me, I presume the worse.";
- next;
- mes "[Flower]";
- mes "Here take these 2 Treasure Tokens.";
- set eight_qset,0;
- set On_Quest,0;
- delitem 746,10;
- set #Treasure_Token,#Treasure_Token+2;
- close;
-N_QuestStart:
- mes "[Flower]";
- mes "Help, help I have lost my Beads!! My brother Bush is going to kill me please help";
- mes " ";
- mes "Bring me 10 Glass Beads!";
- close;
-}
-///////Job list 9///////
-//9-1;
-geffen_in.gat,168,124,6 script Mage 48,{
- if (nine_qset == 1 && countitem(1082) > 0) goto N_QuestComp;
- if (nine_qset == 1) goto N_QuestStart;
- mes "[Mage]";
- mes "Hello "+strcharinfo(0)+" welcome to the Mage Guild.";
- close;
-N_QuestComp:
- mes "[Mage]";
- mes "Thank you for this delivery. Sorry about the smell, Its a box of Toad Tounges";
- next;
- mes "[Mage]";
- mes "Here take this Treasure Token as a reward.";
- set nine_qset,0;
- delitem 1082,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Mage]";
- mes "Hello "+strcharinfo(0)+", Where is my box of Toad Tounges?.";
- close;
-}
-//9-2;
-pay_arche.gat,98,74,6 script School Girl 703,{
- if (nine_qset == 2 && countitem(1020) > 19) goto N_QuestComp;
- if (nine_qset == 2) goto N_QuestStart;
- mes "[School Girl]";
- mes "Sorry I'm waiting for someone, you will have to come back later";
- close;
-N_QuestComp:
- mes "[School Girl]";
- mes "Thank you for helping me.";
- next;
- mes "[School Girl]";
- mes "Here take these 4 Treasure Tokens.";
- set nine_qset,0;
- set On_Quest,0;
- delitem 1020,20;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[School Girl]";
- mes "Help, Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school.";
- next;
- mes "[School Girl]";
- mes "The strange thing about what happened was that the children inside did not seem to die from the flames. They have taken over the entire 3rd floor of Payon Cave.";
- mes " ";
- mes "Bring me 20 Black Hair!";
- close;
-}
-//9-3
-payon_in02.gat,19,33,6 script Jack 740,{
- if (nine_qset == 3 && countitem(1022) > 0) goto N_QuestComp;
- if (nine_qset == 3) goto N_QuestStart;
- if (nine_qset == 4) goto N_QuestStart2;
- mes "[Jack]";
- mes "Sorry I'm waiting for someone, you will have to come back later";
- close;
-N_QuestComp:
- mes "[Jack]";
- mes "Thank you for helping me.";
- next;
- mes "[Jack]";
- mes "Here take these 4 Treasure Tokens.";
- set nine_qset,0;
- set On_Quest,0;
- delitem 1022,1;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Jack]";
- mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave. We don't know much because no one ever seems to make it back alive. We suspect a monster we call the Moonlight Flower";
- mes " ";
- mes "Bring me back 1 Nine Tales!";
- close;
-N_QuestStart2:
-//9-4
- if (nine_qset == 4 && countitem(901) > 39) goto N_QuestComp2;
- mes "[Jack]";
- mes "Hello, we need you to investigate some crap in the 3rd level of payon.";
- mes " ";
- mes "Bring me back 40 Daenggie's.";
- close;
-N_QuestComp2:
- mes "[Jack]";
- mes "Thank you for helping me.";
- next;
- mes "[Jack]";
- mes "Here take these 3 Treasure Tokens.";
- set nine_qset,0;
- set On_Quest,0;
- delitem 901,40;
- set #Treasure_Token,#Treasure_Token+3;
- close;
-}
-///////Job list 10///////
-//10-1
-morocc.gat,193,51,6 script Kreg 48,{
- if (ten_qset == 1 && countitem(1082) > 0) goto N_QuestComp;
- if (ten_qset == 1) goto N_QuestStart;
- mes "[Kreg]";
- mes "Hello "+strcharinfo(0)+" welcome to Morroc.";
- close;
-N_QuestComp:
- mes "[Kreg]";
- mes "Thank you for this delivery.";
- next;
- mes "[Kreg]";
- mes "Here take this Treasure Token as a reward.";
- set ten_qset,0;
- delitem 1082,1;
- set On_Quest,0;
- set #Treasure_Token,#Treasure_Token+1;
- close;
-N_QuestStart:
- mes "[Kreg]";
- mes "So where's my Delivery";
- close;
-}
-//10-2;
-pay_fild10.gat,145,252,6 script Man#02 122,{
- if (ten_qset == 2 && countitem(1029) > 0) goto N_QuestComp;
- if (ten_qset == 2) goto N_QuestStart;
- mes "[Man]";
- mes "Sorry I'm waiting for someone, you will have to come back later";
- close;
-N_QuestComp:
- mes "[Man]";
- mes "Thank you for helping me.";
- next;
- mes "[Man]";
- mes "Here take these 4 Treasure Tokens.";
- set ten_qset,0;
- set On_Quest,0;
- delitem 1029,1;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Man]";
- mes "Tony the Tiger is on Crack! He must be stoped, KILL HIM!";
- mes " ";
- mes "Bring me back 1 Tiger's_Skin!";
- close;
-}
-//10-3;
-moc_fild04.gat,193,51,6 script Caral 119,{
- if (ten_qset == 3 && countitem(1015) > 0) goto N_QuestComp;
- if (ten_qset == 3) goto N_QuestStart;
- mes "[Caral]";
- mes "Sorry I'm waiting for someone, you will have to come back later.";
- close;
-N_QuestComp:
- mes "[Caral]";
- mes "Thank you for helping me.";
- next;
- mes "[Caral]";
- mes "Here take these 4 Treasure Tokens.";
- set ten_qset,0;
- set On_Quest,0;
- delitem 1015,1;
- set #Treasure_Token,#Treasure_Token+4;
- close;
-N_QuestStart:
- mes "[Caral]";
- mes "Phreeoni the Pink Fluff is terrorizing little novices! He must be stoped, KILL HIM!";
- mes " ";
- mes "Bring me back 1 Tounge!";
- close;
-}
-//10-4
-moc_fild15.gat,250,251,6 script Jeni 727,{
- if (ten_qset == 4 && countitem(1096) > 0) goto N_QuestComp;
- if (ten_qset == 4) goto N_QuestStart;
- mes "[Jeni]";
- mes "Sorry I'm waiting for someone, You will have to come back later";
- close;
-N_QuestComp:
- mes "[Jeni]";
- mes "Thank you for helping me.";
- next;
- mes "[Jeni]";
- mes "Here take these 3 Treasure Tokens.";
- set ten_qset,0;
- set On_Quest,0;
- delitem 1096,1;
- set #Treasure_Token,#Treasure_Token+3;
- close;
-N_QuestStart:
- mes "[Jeni]";
- mes "This half naked freak need an army to take down, now its your job,good luck.";
- mes " ";
- mes "Bring me back 1 Round Shell!";
- close;
-}
+//===== Athena Script =====================================
+//= Treasure Hunter Script
+//===== Converted By ======================================
+//= Fredzilla
+//= Original
+///////////////////////////////////////////////////////////
+// Treasure Hunter Quests //
+// By: Ezekial //
+// for the use on nRO run by Newbe5 //
+// revised By Warlock //
+///////////////////////////////////////////////////////////
+//===== Version ===========================================
+//= 1.3
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Start for Treasure hunter quests
+//===== Comments ==========================================
+//= Event_THQS - Used to check if you have already registerd
+//= #Treasure_Token - used to keep track of tokens
+//= 1.0 - Straight conversionof Aegis NPC file
+//= 1.2 some bugfixes, typos [Lupus]
+//= 1.3 Removed Duplicates [Silent]
+//////////////////////////////////////////////////////////
+
+
+///////Job list 1///////
+//1-1
+mjolnir_09.gat,187,189,6 script Old Man 107,{
+ if (one_qset==1) goto N_QuestStart;
+ mes "[Old Man]";
+ mes "Eh! Can't and old man walk in peace anymore?!";
+ close;
+N_QuestStart:
+ mes "[Old Man]";
+ mes "Eh? whats that?!";
+ mes " ";
+ mes "My wife wants me home?! Alright, alright... I'm going, I'm going. Thank you for telling me the message.";
+ mes " ";
+ mes "Here take this Treasure Token.";
+ set one_qset,0;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+}
+//1-2;
+pay_arche.gat,86,129,6 script Archer 732,{
+ if (one_qset == 2) goto N_QuestStart;
+ mes "[Kieth]";
+ mes "Sorry can't talk, I'm a busy man, I'm waiting for my package.";
+ close;
+N_QuestStart:
+ mes "[Kieth]";
+ mes "Ahh, you must be from the Treasure Hunter Agensy. Do you have my bow??";
+ mes " ";
+ mes "Ahh, good,thank you for your time. Take this Treasure Token.";
+ set one_qset,0;
+ set On_Quest,0;
+ delitem 1072,1;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+}
+//1-3
+prt_fild06.gat,37,192,6 script Farmer 125,{
+ if (one_qset == 3 && countitem(909) > 19 && countitem(955) > 19 && countitem(914) > 19 && countitem(705) > 19) goto N_QuestComp;
+ if (one_qset==3) goto N_QuestStart;
+ mes "[Billy-Bob]";
+ mes "Arrrg!... Those Bastard Bugs have eaten everything, this place donest even look like my farm anymore!!";
+ close;
+N_QuestComp:
+ mes "[Billy-Bob]";
+ mes "Ohhh, thank you thats a good start for me.";
+ mes "Well those bugs can bugger off...";
+ mes " ";
+ mes "Well here take these 2 Treasure Tokens.";
+ set one_qset,0;
+ set #Treasure_Token,#Treasure_Token+2;
+ set On_Quest,0;
+ delitem 909,20;
+ delitem 955,20;
+ delitem 914,20;
+ delitem 705,20;
+ close;
+N_QuestStart:
+ mes "[Billy-Bob]";
+ mes "Those Bastard Bugs are Everywere!!!";
+ mes "You must be from the guild! OK, bring me 20 Worm Peelings, 20 Jellopys, 20 fluff and 20 Clovers.";
+ close;
+}
+//1-4
+prontera.gat,264,353,6 script Old Lady 103,{
+ if (one_qset == 4 && countitem(934) > 14) goto N_QuestComp;
+ if (one_qset == 4) goto N_QuestStart;
+ mes "[Old Lady]";
+ mes "This is my husbands grave... I'm just paying him a little visit.";
+ close;
+N_QuestComp:
+ mes "[Old Lady]";
+ mes "You have them?!";
+ next;
+ mes "[Old Lady]";
+ mes "Thank you sooo much here have these 3 Treasure Tokens.";
+ set #Treasure_Token,#Treasure_Token+3;
+ delitem 934,15;
+ set one_qset,0;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Old Lady]";
+ mes "So your the one that has come to help me?";
+ mes " ";
+ mes "Ok well this is what I wanted you to do,this greave beside me is my husbands grave and I promised him that I would bury some Mementos with him, The problem is that I have no Mementos...";
+ next;
+ mes "[Old Lady]";
+ mes "Bring me 15 Mementos, please.";
+ close;
+}
+///////Job list 2///////
+//2-1;
+morocc.gat,59,109,6 script Erika 700,{
+ if (two_qset == 1 && countitem(1072) > 0) goto N_QuestComp;
+ if (two_qset == 1) goto N_QuestStart;
+ mes "[Erika]";
+ mes "Hello my name is Erika.";
+ close;
+N_QuestComp:
+ mes "[Erika]";
+ mes "What's that? You have a letter for me!!";
+ mes "Oooooh I just love,love letters :D. next here will I open it.";
+ next;
+ mes "[Letter]";
+ mes "Dear Erika";
+ mes " ";
+ mes "Sorry to inform you but you have been evicted, please move out within 3-5 days.";
+ mes " ";
+ mes "-Managment";
+ next;
+ mes "[Erika]";
+ mes "Oh... um... Well fuck, that bastard thinks he can kick me out!!!!! He's got another thing coming!";
+ mes " ";
+ mes "Well thank you for delivering this anyway have this Treasure Token.";
+ delitem 1072,1;
+ set two_qset,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Erika]";
+ mes "So your the one that has a letter for me?";
+ mes " ";
+ mes "Ok well where's the letter?";
+ close;
+}
+//2-2;
+in_moc_16.gat,15,30,6 script Jeramiah 730,{
+ if (two_qset == 2 && countitem(1998) > 0) goto N_QuestComp;
+ if (two_qset == 2) goto N_QuestStart;
+ mes "[Jeramiah]";
+ mes "Its so boring when you have to next on people...";
+ close;
+N_QuestComp:
+ mes "[Jeramiah]";
+ mes "Ahh hello, you must be from the Treasure Hunter Guild.";
+ mes "Do you have my Jur? Ahh good good. Thank you.";
+ mes "Here have this Treasure Hunter Token.";
+ set two_qset,0;
+ set On_Quest,0;
+ delitem 1998,1;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Jeramiah]";
+ mes "So your the one that is supposed to bring my Jur?";
+ mes "So where's my Jur?";
+ close;
+}
+//2-3;
+prt_fild07.gat,316,263,6 script Marsh Man 84,{
+ if (two_qset == 3 && countitem(518) > 19) goto N_QuestComp;
+ if (two_qset == 3) goto N_QuestStart;
+ mes "[Lenith]";
+ mes "Hello, sorry I don't have much time to talk I'm waiting for someone.";
+ close;
+N_QuestComp:
+ mes "[Lenith]";
+ mes "Oh hello, OH you have my honey, my bees and I thank you.";
+ mes " ";
+ mes "Here have these 2 Treasure Hunter Tokens.";
+ delitem 518,20;
+ set #Treasure_Token,#Treasure_Token+2;
+ set two_qset,0;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Lenith]";
+ mes "Hello, my name is Lenith and I have a quest for you.";
+ mes "Well resently a bunch of stupid bears stole the supers off all my bee's nests...Stupid bears.";
+ mes " ";
+ mes "What I need you to do is find me some more honey so these bee's can get through the winter. I will need about 20 Honey.";
+ close;
+}
+//2-4;
+payon.gat,161,72,6 script Molly 714,{
+ if (two_qset == 4 && countitem(7005) > 0) goto N_QuestComp;
+ if (two_qset == 4) goto N_QuestStart;
+ mes "[Molly]";
+ mes "Sorry can't talk, I'm waiting for someone.";
+ close;
+N_QuestComp:
+ mes "[Molly]";
+ mes "WOW YOU DID IT!!!";
+ mes " ";
+ mes "I knew you looked strong, I have no idea how you could have killed that monster though.";
+ mes "thank you so much, here have these 3 Guild Tokens as a reward.";
+ set two_qset,0;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+3;
+ delitem 7005,1;
+ close;
+N_QuestStart:
+ mes "[Molly]";
+ mes "Wow you must be the brave man from the treasure hunter guild!";
+ mes "Ok here is whats happening, I don't know what started it but there is a strange Ronan Skeleton running aroung the woods 2 East from here.";
+ next;
+ mes "[Molly]";
+ mes "We have try to kill him in the past but it was not...ummm...It was a bad idea. What I want you to do is go there and bring me back his Skull as proof of you killing him.";
+ mes " ";
+ mes "Good Luck";
+ close;
+}
+///////Job list 3///////
+//3-1;
+moc_fild04.gat,208,322,6 script Clark 65,{
+ if (three_qset == 1 && countitem(1040) > 29) goto N_QuestComp;
+ if (three_qset == 1) goto N_QuestStart;
+ mes "[Clark]";
+ mes "Love to chat, but I'm waiting for someone.";
+ close;
+N_QuestComp:
+ mes "[Clark]";
+ mes "Ok well this is a start.";
+ mes " ";
+ mes "I hope that this hole will go away 1 day, and I might have another quest for you in the future.";
+ mes "here take these 2 Treasure Tokens.";
+ set #Treasure_Token,#Treasure_Token+2;
+ delitem 1040,30;
+ set three_qset,0;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Clark]";
+ mes "Well hello to you.";
+ mes "You must be from the Treasure Hunter Guild.";
+ mes " ";
+ mes "Ok well this is my problem, yah see that hole in the ground? Yah that thing just popped out of nowhere a couple years ago, inside its full of these ugly ants and these monsters called Giearths.";
+ next;
+ mes "[Clark]";
+ mes "What I want you to do is kill some of the Giearths.Bring me 30 of there little Moustaches.";
+ close;
+}
+//3-2;
+yuno_fild01.gat,186,162,6 script Flank 73,{
+ if (three_qset == 2 && countitem(1082) > 0) goto N_QuestComp;
+ if (three_qset == 2) goto N_QuestStart;
+ mes "[Flank]";
+ mes "Sorry I'm waiting for my package so I don't want to talk.";
+ close;
+N_QuestComp:
+ mes "[Flank]";
+ mes "Perfect right on time, now I must be going to plant this bomb.... Err I meen give this package to my mother for her birthday.";
+ next;
+ mes "[Flank]";
+ mes "Thanks";
+ mes "Have this Treasure Token";
+ set three_qset,0;
+ delitem 1082,1;
+ set #Treasure_Token,#Treasure_Token+1;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Flank]";
+ mes "So you have my packages?";
+ mes "Well where is it then?";
+ close;
+}
+//3-3 Goes to 7-3 using callfunc
+prt_sewb1.gat,120,245,6 script Sewer Managment Knight 705,{
+ if (three_qset == 3 && countitem(955) > 149) goto N_QuestComp;
+ if (three_qset == 3) goto N_QuestStart;
+ if (seven_qset == 3) goto N_QuestStart2;
+ mes "[Sewer Managmant]";
+ mes "Live dosent get any worse for me,working in the bug filled Culvert every day...";
+ close;
+N_QuestComp:
+ mes "[Sewer Managment]";
+ mes "Well that looked like it was no trouble for you.";
+ mes "Thanks have these 4 Treause Tokens.";
+ delitem 955,150;
+ set #Treasure_Token,#Treasure_Token+4;
+ set three_qset,0;
+ set On_Quest,0;
+ close;
+N_QuestStart:
+ mes "[Sewer Managmant]";
+ mes "For a while now we have had monster, mostly bugs infesting the culvert...";
+ mes " ";
+ mes "What I want you to do is kinda clean some of it out, every little bit counts.";
+ mes "Bring me 150 Worm Peelings.";
+ close;
+N_QuestStart2:
+ callfunc "seven_qset-3";
+ close;
+}
+//3-4
+mjolnir_02.gat,87,357,6 script Man#01 51,{
+ if (three_qset == 4 && countitem(1041) > 49) goto N_QuestComp;
+ if (three_qset == 4) goto N_QuestStart;
+ mes "[Rudolfo]";
+ mes "Danger, the Coal Mine is now a hostile area.";
+ close;
+N_QuestComp:
+ mes "[Rudolfo]";
+ mes "Well its good to see that you have come back alive.";
+ mes "I had my doughts but thank you for your help.";
+ mes " ";
+ mes "Here have these 4 Treasure Tokens.";
+ set three_qset,0;
+ set On_Quest,0;
+ delitem 1041,50;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Rudolfo]";
+ mes "Hello, you must be from the Treasure Hunter Guild.";
+ mes " ";
+ mes "They must have filled you in on what is happening on the lower levels of this Coal Mine, I know its desturbing and we are still trying to figure out why and how 2 Evil Druids got down there.";
+ mes " ";
+ mes "Well what I want you to do is bring me 50 Lantern's as proof that you have cleaned some of them out, any loot you find down there you may keep other then what I have asked you to get for me.";
+ close;
+}
+///////Job list 4///////
+//4-1;
+pay_arche.gat,45,138,6 script Flora 724,{
+ if (four_qset == 1 && countitem(957) > 49) goto N_QuestComp;
+ if (four_qset == 1) goto N_QuestStart;
+ mes "[Flora]";
+ mes "Well hello be carfull in the cave, we have heard reports of Undead monster funning around.";
+ close;
+N_QuestComp:
+ mes "[Flora]";
+ mes "Welcome back, good job you did it. (I wonder if that Flaming Bastard is still alive)";
+ mes "Well I hope that cut down a bit on the monsters and here have these 2 Tokens.";
+ set #Treasure_Token,#Treasure_Token+2;
+ delitem 957,50;
+ set four_qset,0;
+ set On_Quest,0;
+ killmonster "pay_dun00.gat","Flora::OnMobDead";
+ close;
+N_QuestStart:
+ mes "[Flora]";
+ mes "Well hello there.";
+ mes " ";
+ mes "Well this is what I need you to do, bring me 50 Decayed Nails - awile back Payon Cave used to be a safe place to go...But now things have gone out of controll and Zombies have invaded the first floor...";
+ mes " ";
+ mes "There is also these new monsters that have just poped out of no were, we call them Flaming Bastards...Be carfull if you arn't powerfull yet because they are very strong.";
+ next;
+ mes "[Flora]";
+ mes "Good Luck";
+ mes "Remember I need 50 Nail's";
+ monster "pay_dun00.gat",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead";
+ monster "pay_dun00.gat",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead";
+ close;
+OnMobDead:
+ end;
+}
+//4-2;
+yuno.gat,45,138,6 script Zed 735,{
+ if (four_qset == 2 && countitem(1999) > 0) goto N_QuestComp;
+ if (four_qset == 2) goto N_QuestStart;
+ mes "[Zed]";
+ mes "Get out of my face you flake.";
+ close;
+N_QuestComp:
+ mes "[Zed]";
+ mes "Dear god took you long enough you bastard!";
+ mes "You know how much my time is worth!!!!";
+ mes "Your slow and I'm never gona recomend a job for you, Gimmie my staff and get out of me face!";
+ next;
+ mes "[Zed]";
+ mes "Well you can take this crapy Treausre Token.";
+ set On_Quest,0;
+ set four_qset,0;
+ delitem 1999,1;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Zed]";
+ mes "Where's my staff?";
+ close;
+}
+//4-3;
+prontera.gat,176,204,6 script Dassy 95,{
+ if (four_qset == 3 && countitem(711) > 19) goto N_QuestComp;
+ if (four_qset == 3) goto N_QuestStart;
+ mes "[Dassy]";
+ mes "Hello!";
+ close;
+N_QuestComp:
+ mes "[Dassy]";
+ mes "Yes! Now my pet will not starve!";
+ mes "Thank you so much!";
+ mes "Have this Treasure Token.";
+ set On_Quest,0;
+ set four_qset,0;
+ delitem 711,20;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Dassy]";
+ mes "Hello person!!";
+ mes "You have come to help me? Yes, yes.";
+ mes " ";
+ mes "Ok I don't want to talk about it but I need you to fine me 20 Shoot's";
+ mes "Thank you!";
+ close;
+}
+//4-4;
+prt_gld.gat,157,99,6 script Czhore 752,{
+ if (four_qset == 4 && countitem(714) > 0) goto N_QuestComp;
+ if (four_qset == 4) goto N_QuestStart;
+ mes "[Czhore]";
+ mes "Hello friend";
+ mes "Have you come to check out one of these guild halls?";
+ close;
+N_QuestComp:
+ mes "[Czhore]";
+ mes "Thank god!";
+ mes " ";
+ mes "I'm so happy to see one of these Emperiums! Thank you "+strcharinfo(0)+".";
+ next;
+ mes "[Czhore]";
+ mes "Here have these 2 Treasure Tokens.";
+ mes "And some of my old treasure...";
+ monster "prt_gld.gat",155,99,"Old Man's Treasure",1324,1;
+ set four_qset,0;
+ set On_Quest,0;
+ delitem 714,1;
+ set #Treasure_Token,#Treasure_Token+2;
+ close;
+N_QuestStart:
+ mes "[Czhore]";
+ mes "Hello friend";
+ mes "I know this may sound stupid but ever since I was a boy I have dreamed of having an Emperium...";
+ mes "As I know I look old, I have just never been able to find one, now that I am retired from the Treasure Hunter Guild there is no more action for me...";
+ mes " ";
+ mes "If you can get me one I shall reward you.";
+ close;
+}
+///////Job list 5///////
+//5-1;
+prt_maze01.gat,18,184,6 script Lithin#01 752,{
+ if (five_qset == 1 && countitem(1028) > 14) goto N_QuestComp;
+ if (five_qset == 1) goto N_QuestStart;
+ mes "[Lithin]";
+ mes "Well hello.";
+ mes "Welcome to the Forest Maze.";
+ close;
+N_QuestComp:
+ mes "[Lithin]";
+ mes "Oh thank you so much, but they will be back...";
+ next;
+ mes "Take these 2 Treasure Tokens";
+ set five_qset,0;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+2;
+ delitem 1028,15;
+ close;
+N_QuestStart:
+ mes "[Lithin]";
+ mes "Well hello.";
+ mes "Welcome to the Forest Maze, I have a task for you.";
+ mes " ";
+ mes "Ever heard of a moster called a Savage? It looks like a boar but it makes very annoying noices.";
+ mes "What I want you to do is bring me 15 Manes from the savages.";
+ close;
+}
+//5-2 goes to 6-2 using callfunc;
+moc_ruins.gat,75,167,6 script Lithin#02 87,{
+ if (five_qset == 2 && countitem(932) > 29) goto N_QuestComp;
+ if (five_qset == 2) goto N_QuestStart;
+ if (six_qset == 2) goto N_QuestStart2;
+ mes "[Strange Man]";
+ mes "...";
+ close;
+N_QuestComp:
+ mes "[Strange Man]";
+ mes "Much thanks I have for you.";
+ next;
+ mes "Take with you these 2 Treasure Token's.";
+ set #Treasure_Token,#Treasure_Token+2;
+ set five_qset,0;
+ set On_Quest,0;
+ delitem 932,30;
+ close;
+N_QuestStart:
+ mes "[Strange Man]";
+ mes "Must do for me you shall.Venture through the Pyramid.";
+ mes "When second floor you have reached,slay skeletons of evil.";
+ mes "Bring me back there bones you must.";
+ mes "It is 30 that I desire.";
+ close;
+N_QuestStart2:
+ callfunc "six_qset2";
+}
+//5-3;
+geffen.gat,57,130,6 script Blonde Girl 724,{
+ if (five_qset == 3 && countitem(744) > 0) goto N_QuestComp;
+ if (five_qset == 3) goto N_QuestStart;
+ mes "[Blonde Girl]";
+ mes "I wonder what happened to my flowers";
+ close;
+N_QuestComp:
+ mes "[Blonde Girl]";
+ mes "Oh are these my flower! To bad I don't want them anymore...";
+ mes " ";
+ mes "You can keep them is you want.";
+ next;
+ mes "[Blonde Girl]";
+ mes "Here take this Treasure Token as a reward.";
+ set five_qset,0;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Blonde Girl]";
+ mes "Hello, did you bring me flowers!?!";
+ close;
+}
+//5-4;
+gef_tower.gat,49,27,6 script Wizard#01 735,{
+ if (five_qset == 4 && countitem(1059) > 49) goto N_QuestComp;
+ if (five_qset == 4) goto N_QuestStart;
+ mes "[Wizard]";
+ mes "Hello, have you seen my Whisper friend?";
+ close;
+N_QuestComp:
+ mes "[Wizard]";
+ mes "Thank you for helping me, I presume the worse.";
+ next;
+ mes "[Wizard]";
+ mes "Here take these 4 Treasure Tokens.";
+ set five_qset,0;
+ set On_Quest,0;
+ delitem 1059,50;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Wizard]";
+ mes "Hello, the reason why I brought you here was because of a long time ago I made a friend, which happened to be a Whipser.";
+ mes "He told me that he was always bullied by the other ghosts down there and I havent seen him in a while.";
+ mes "Thinking of the worse case here, I want vengance!";
+ mes " ";
+ mes "Bring me 50 Fabrics!";
+ close;
+}
+///////Job list 6///////
+//6-1;
+moc_prydb1.gat,47,132,6 script Thief 48,{
+ if (six_qset == 1 && countitem(1083) > 0) goto N_QuestComp;
+ if (six_qset == 1) goto N_QuestStart;
+ mes "[Thief]";
+ mes "Welcome to the Thiefs Guild.";
+ close;
+N_QuestComp:
+ mes "[Thief]";
+ mes "Thank you for this delivery.";
+ next;
+ mes "[Thief]";
+ mes "Here take this Treasure Token as a reward.";
+ set six_qset,0;
+ delitem 1083,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Thief]";
+ mes "Where's my delivery?";
+ close;
+}
+//6-2
+function script six_qset2 {
+ if (six_qset == 2 && countitem(930) > 29) goto N_QuestComp2;
+ mes "[Strange Man]";
+ mes "Another quest for you I have.";
+ mes "Futher into the pyramid you must go.";
+ mes "Fighting Mummys is future for you.";
+ mes " ";
+ mes "Bring back for me their wrappings you must.";
+ mes "It is 30 Rotten bandages I desire.";
+ close;
+N_QuestComp2:
+ mes "[Strange Man]";
+ mes "Much thanks for you that I have.";
+ next;
+ mes "[Strange Man]";
+ mes "Take with you these 3 tokens.";
+ set #Treasure_Token,#Treasure_Token+3;
+ delitem 930,30;
+ set On_Quest,0;
+ set six_qset,0;
+ close;
+}
+//6-3;
+xmas.gat,144,136,6 script Chirach 48,{
+ if (six_qset == 3 && countitem(1083) > 0) goto N_QuestComp;
+ if (six_qset == 3) goto N_QuestStart;
+ mes "[Chirach]";
+ mes "Welcome.";
+ close;
+N_QuestComp:
+ mes "[Chirach]";
+ mes "Thank you for this delivery.";
+ next;
+ mes "[Chirach]";
+ mes "Here take this Treasure Token as a reward.";
+ set six_qset,0;
+ delitem 1083,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Chirach]";
+ mes "Where's my delivery?";
+ close;
+}
+//6-4;
+gef_tower.gat,52,87,6 script Wizard#02 735,{
+ if (six_qset == 4 && countitem(944) > 19) goto N_QuestComp;
+ if (six_qset == 4) goto N_QuestStart;
+ mes "[Zuuzuu]";
+ mes "Hello, welcome to geffen tower.";
+ close;
+N_QuestComp:
+ mes "[Wizard]";
+ mes "Thank you for helping me.";
+ next;
+ mes "Here take these 4 Treasure Tokens.";
+ set six_qset,0;
+ set On_Quest,0;
+ delitem 944,20;
+ set #Treasure_Token,#Treasure_Token+4;
+ next;
+ mes "[Zuuzuu]";
+ mes "Oh dear god!!!";
+ mes "One of those evil mosters has followed you up here, Kill it, Kill it!!!";
+ next;
+ monster "gef_tower.gat",42,89,"Evil Nightmare",1061,1;
+ close;
+N_QuestStart:
+ mes "[Zuuzuu]";
+ mes "Hello, the reason I sent for a young adventurer was because of the problems we are having under the tower.";
+ mes "There seem to be more ghosts day after day down there. What I need you to do is go down there and find these mosters we call Nightmares.";
+ mes " ";
+ mes "You must slay them and bring me 20 of there horse shoes.";
+ close;
+}
+///////Job list 7///////
+//7-1 goes to 8-1 using callfunc;
+prontera.gat,123,208,6 script Little Girl 717,{
+ if (seven_qset == 1 && countitem(531) > 4) goto N_QuestComp;
+ if (seven_qset == 1) goto N_QuestStart;
+ if (eight_qset == 1) goto N_QuestStart2;
+ mes "[Girl]";
+ mes "Hello mister "+strcharinfo(0)+".";
+ close;
+N_QuestComp:
+ mes "[Girl]";
+ mes "Thank you so much!";
+ next;
+ mes "[Girl]";
+ mes "Have these 1 Treasure Tokens.";
+ set seven_qset,0;
+ set On_Quest,0;
+ delitem 531,5;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Girl]";
+ mes "Hi mister person. Can you get me some apple juice?";
+ mes "I want 5 of them.";
+ close;
+N_QuestStart2:
+ callfunc "eight_qset1";
+}
+//7-2;
+alberta.gat,101,84,6 script Charles 48,{
+ if (seven_qset == 2 && countitem(1082) > 0) goto N_QuestComp;
+ if (seven_qset == 2) goto N_QuestStart;
+ mes "[Charles]";
+ mes "Hello "+strcharinfo(0)+" welcome to Alberta.";
+ close;
+N_QuestComp:
+ mes "[Charles]";
+ mes "Thank you for this delivery.";
+ next;
+ mes "[Charles]";
+ mes "Here take this Treasure Token as a reward.";
+ set seven_qset,0;
+ delitem 1082,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Charles]";
+ mes "So where is my package?";
+ close;
+}
+//7-3
+function script seven_qset-3 {
+ if (seven_qset == 3 && countitem(969) > 0) goto N_QuestComp2;
+ mes "[Sewer Managment]";
+ mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert";
+ mes " ";
+ mes "Bring me 1 Gold Bar from him.";
+ close;
+N_QuestComp2:
+ mes "[Sewer Managment]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Sewer Managment]";
+ mes "Here take these 4 Treasure Tokens.";
+ set seven_qset,0;
+ set On_Quest,0;
+ delitem 969,1;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+}
+//7-4;
+alb2trea.gat,94,102,6 script Scarlet 725,{
+ if (seven_qset == 4 && countitem(1127) > 0) goto N_QuestComp;
+ if (seven_qset == 4) goto N_QuestStart;
+ mes "[Scarlet]";
+ mes "Sorry, busy.";
+ close;
+N_QuestComp:
+ mes "[Scarlet]";
+ mes "Thank you for helping me, I presume the worse.";
+ next;
+ mes "[Scarlet]";
+ mes "Here take these 4 Treasure Tokens.";
+ set seven_qset,0;
+ set On_Quest,0;
+ delitem 1127,1;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Scarlet]";
+ mes "Good your here. Ok there are reports of an old captain named Drake abored this ship. Kill Him!";
+ mes " ";
+ mes "Bring me his Saber as proof!";
+ close;
+}
+///////Job list 8///////
+//8-1
+function script eight_qset1 {
+ if (eight_qset == 1 && countitem(532) > 4) goto N_QuestComp2;
+ mes "[Girl]";
+ mes "Hi mister person. Can you get me some Banana juice?";
+ mes "I want 5 of them.";
+ close;
+N_QuestComp2:
+ mes "[Girl]";
+ mes "Thank you so much!";
+ next;
+ mes "[Girl]";
+ mes "Have these 1 Treasure Tokens.";
+ set eight_qset,0;
+ set On_Quest,0;
+ delitem 532,5;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+}
+//8-2;
+morocc.gat,165,55,6 script Klye 48,{
+ if (eight_qset == 2 && countitem(1081) > 0) goto N_QuestComp;
+ if (eight_qset == 2) goto N_QuestStart;
+ mes "[Klye]";
+ mes "Hello "+strcharinfo(0)+".";
+ close;
+N_QuestComp:
+ mes "[Klye]";
+ mes "Thank you for this delivery.";
+ next;
+ mes "[Klye]";
+ mes "Here take this Treasure Token as a reward.";
+ set eight_qset,0;
+ delitem 1081,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Kyle]";
+ mes "So where's my Delivery";
+ close;
+
+}
+//8-3;
+prt_maze02.gat,103,86,6 script Zack 751,{
+ if (eight_qset == 3 && countitem(923) > 0) goto N_QuestComp;
+ if (eight_qset == 3) goto N_QuestStart;
+ mes "[Zack]";
+ mes "Hello, have you seen my Whisper friend?";
+ close;
+N_QuestComp:
+ mes "[Zack]";
+ mes "Thank you for helping me, I presume the worse.";
+ next;
+ mes "[Zack]";
+ mes "Here take these 5 Treasure Tokens.";
+ set eight_qset,0;
+ set On_Quest,0;
+ delitem 923,1;
+ set #Treasure_Token,#Treasure_Token+5;
+ close;
+N_QuestStart:
+ mes "[Zack]";
+ mes "Hello,the reason why I brought you here was because of a very strange monster known as Baphomet.";
+ mes "People say that Baphomet guilds the gate to the under-world but I don't belive them, Kill Baphomet!";
+ mes " ";
+ mes "Bring me his Evil Horn!";
+ close;
+}
+//8-4;
+payon.gat,136,129,6 script Flower 703,{
+ if (eight_qset == 4 && countitem(746) > 9) goto N_QuestComp;
+ if (eight_qset == 4) goto N_QuestStart;
+ mes "[Flower]";
+ mes "Sorry I'm waiting for someone. You will have to come back later.";
+ close;
+N_QuestComp:
+ mes "[Flower]";
+ mes "Thank you for helping me, I presume the worse.";
+ next;
+ mes "[Flower]";
+ mes "Here take these 2 Treasure Tokens.";
+ set eight_qset,0;
+ set On_Quest,0;
+ delitem 746,10;
+ set #Treasure_Token,#Treasure_Token+2;
+ close;
+N_QuestStart:
+ mes "[Flower]";
+ mes "Help, help I have lost my Beads!! My brother Bush is going to kill me please help";
+ mes " ";
+ mes "Bring me 10 Glass Beads!";
+ close;
+}
+///////Job list 9///////
+//9-1;
+geffen_in.gat,168,124,6 script Mage 48,{
+ if (nine_qset == 1 && countitem(1082) > 0) goto N_QuestComp;
+ if (nine_qset == 1) goto N_QuestStart;
+ mes "[Mage]";
+ mes "Hello "+strcharinfo(0)+" welcome to the Mage Guild.";
+ close;
+N_QuestComp:
+ mes "[Mage]";
+ mes "Thank you for this delivery. Sorry about the smell, Its a box of Toad Tounges";
+ next;
+ mes "[Mage]";
+ mes "Here take this Treasure Token as a reward.";
+ set nine_qset,0;
+ delitem 1082,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Mage]";
+ mes "Hello "+strcharinfo(0)+", Where is my box of Toad Tounges?.";
+ close;
+}
+//9-2;
+pay_arche.gat,98,74,6 script School Girl 703,{
+ if (nine_qset == 2 && countitem(1020) > 19) goto N_QuestComp;
+ if (nine_qset == 2) goto N_QuestStart;
+ mes "[School Girl]";
+ mes "Sorry I'm waiting for someone, you will have to come back later";
+ close;
+N_QuestComp:
+ mes "[School Girl]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[School Girl]";
+ mes "Here take these 4 Treasure Tokens.";
+ set nine_qset,0;
+ set On_Quest,0;
+ delitem 1020,20;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[School Girl]";
+ mes "Help, Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school.";
+ next;
+ mes "[School Girl]";
+ mes "The strange thing about what happened was that the children inside did not seem to die from the flames. They have taken over the entire 3rd floor of Payon Cave.";
+ mes " ";
+ mes "Bring me 20 Black Hair!";
+ close;
+}
+//9-3
+payon_in02.gat,19,33,6 script Jack 740,{
+ if (nine_qset == 3 && countitem(1022) > 0) goto N_QuestComp;
+ if (nine_qset == 3) goto N_QuestStart;
+ if (nine_qset == 4) goto N_QuestStart2;
+ mes "[Jack]";
+ mes "Sorry I'm waiting for someone, you will have to come back later";
+ close;
+N_QuestComp:
+ mes "[Jack]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Jack]";
+ mes "Here take these 4 Treasure Tokens.";
+ set nine_qset,0;
+ set On_Quest,0;
+ delitem 1022,1;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Jack]";
+ mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave. We don't know much because no one ever seems to make it back alive. We suspect a monster we call the Moonlight Flower";
+ mes " ";
+ mes "Bring me back 1 Nine Tales!";
+ close;
+N_QuestStart2:
+//9-4
+ if (nine_qset == 4 && countitem(901) > 39) goto N_QuestComp2;
+ mes "[Jack]";
+ mes "Hello, we need you to investigate some crap in the 3rd level of payon.";
+ mes " ";
+ mes "Bring me back 40 Daenggie's.";
+ close;
+N_QuestComp2:
+ mes "[Jack]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Jack]";
+ mes "Here take these 3 Treasure Tokens.";
+ set nine_qset,0;
+ set On_Quest,0;
+ delitem 901,40;
+ set #Treasure_Token,#Treasure_Token+3;
+ close;
+}
+///////Job list 10///////
+//10-1
+morocc.gat,193,51,6 script Kreg 48,{
+ if (ten_qset == 1 && countitem(1082) > 0) goto N_QuestComp;
+ if (ten_qset == 1) goto N_QuestStart;
+ mes "[Kreg]";
+ mes "Hello "+strcharinfo(0)+" welcome to Morroc.";
+ close;
+N_QuestComp:
+ mes "[Kreg]";
+ mes "Thank you for this delivery.";
+ next;
+ mes "[Kreg]";
+ mes "Here take this Treasure Token as a reward.";
+ set ten_qset,0;
+ delitem 1082,1;
+ set On_Quest,0;
+ set #Treasure_Token,#Treasure_Token+1;
+ close;
+N_QuestStart:
+ mes "[Kreg]";
+ mes "So where's my Delivery";
+ close;
+}
+//10-2;
+pay_fild10.gat,145,252,6 script Man#02 122,{
+ if (ten_qset == 2 && countitem(1029) > 0) goto N_QuestComp;
+ if (ten_qset == 2) goto N_QuestStart;
+ mes "[Man]";
+ mes "Sorry I'm waiting for someone, you will have to come back later";
+ close;
+N_QuestComp:
+ mes "[Man]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Man]";
+ mes "Here take these 4 Treasure Tokens.";
+ set ten_qset,0;
+ set On_Quest,0;
+ delitem 1029,1;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Man]";
+ mes "Tony the Tiger is on Crack! He must be stoped, KILL HIM!";
+ mes " ";
+ mes "Bring me back 1 Tiger's_Skin!";
+ close;
+}
+//10-3;
+moc_fild04.gat,193,51,6 script Caral 119,{
+ if (ten_qset == 3 && countitem(1015) > 0) goto N_QuestComp;
+ if (ten_qset == 3) goto N_QuestStart;
+ mes "[Caral]";
+ mes "Sorry I'm waiting for someone, you will have to come back later.";
+ close;
+N_QuestComp:
+ mes "[Caral]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Caral]";
+ mes "Here take these 4 Treasure Tokens.";
+ set ten_qset,0;
+ set On_Quest,0;
+ delitem 1015,1;
+ set #Treasure_Token,#Treasure_Token+4;
+ close;
+N_QuestStart:
+ mes "[Caral]";
+ mes "Phreeoni the Pink Fluff is terrorizing little novices! He must be stoped, KILL HIM!";
+ mes " ";
+ mes "Bring me back 1 Tounge!";
+ close;
+}
+//10-4
+moc_fild15.gat,250,251,6 script Jeni 727,{
+ if (ten_qset == 4 && countitem(1096) > 0) goto N_QuestComp;
+ if (ten_qset == 4) goto N_QuestStart;
+ mes "[Jeni]";
+ mes "Sorry I'm waiting for someone, You will have to come back later";
+ close;
+N_QuestComp:
+ mes "[Jeni]";
+ mes "Thank you for helping me.";
+ next;
+ mes "[Jeni]";
+ mes "Here take these 3 Treasure Tokens.";
+ set ten_qset,0;
+ set On_Quest,0;
+ delitem 1096,1;
+ set #Treasure_Token,#Treasure_Token+3;
+ close;
+N_QuestStart:
+ mes "[Jeni]";
+ mes "This half naked freak need an army to take down, now its your job,good luck.";
+ mes " ";
+ mes "Bring me back 1 Round Shell!";
+ close;
+}
diff --git a/npc/custom/quests/thq/THQS_TTShop.txt b/npc/custom/quests/thq/THQS_TTShop.txt
index 5a6b2a70e..b76305ede 100644
--- a/npc/custom/quests/thq/THQS_TTShop.txt
+++ b/npc/custom/quests/thq/THQS_TTShop.txt
@@ -1,523 +1,523 @@
-//===== Athena Script =====================================
-//= Treasure Hunter Script
-//===== Converted By ======================================
-//= Fredzilla
-//= Original
-///////////////////////////////////////////////////////////
-// Treasure Hunter Quests //
-// By: Ezekial //
-// for the use on nRO run by Newbe5 //
-// revised By Warlock //
-///////////////////////////////////////////////////////////
-//===== Version ===========================================
-//= 1.1
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Start for Treasure hunter quests
-//===== Comments ==========================================
-//= Event_THQS - Used to check if you have already registerd
-//= #Treasure_Token - used to keep track of tokens
-//= v1.0 - Straight conversion of Aegis NPC file
-//= v1.1 - balanced some prices, fixed 1 missing label
-//= removed Executioner&Mysteltain swords [Lupus]
-//////////////////////////////////////////////////////////
-
-prt_in.gat,159,172,0 warp thqwrp 3,3,yuno_in01.gat,123,155
-
-prt_in.gat,164,174,1 script Treasure Hunter's Shop 65,{
- mes "[Ash]";
- mes "Ahh, "+strcharinfo(0)+"! Welcome to the Offical Treasure Hunter's Guild Shop.";
- mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!";
- next;
- menu "How does this place work?",-,"What do you have in stock?",N_Shop,"Nevermind",N_NVM;
- mes "[Ash]";
- mes "Well you see here you can exchange your treasure hunter tokens for zeny or rare weapons forged by our blacksmiths.";
- mes " ";
- mes "Everything has its own price value and the only way you can get the tokens is by completing quests assigned to you,the system normally works like this.";
- mes " ";
- mes "The harder the mission the more Tokens you will earn. All red quests are worth 4-8 Tokens, and the rest are worth 1-5.";
- mes " ";
- mes "Hope that solves your problem and questions.";
- close;
-N_NVM:
- close;
- end;
-N_Shop:
-//This is when it gets hard :)
- mes "[Ash]";
- mes "Ok here is our Big list of goods.";
- mes " ";
- mes "(Note T stands for a Treasure Token.)";
- next;
- menu "Trade for Zeny",-,"Trade for Weapons",N_BuyWeps,"Trade for Cards",N_BuyCards,"Nevermind",N_NVM;
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "1000z - 1T",-,"10000z - 10T",N_10T,"100000z - 100T",N_100T,"Nevermind",N_NVM;
- if (#Treasure_Token > 0) goto N_GetZeny1k;
- mes "You don't have enough tokens!";
- close;
-N_GetZeny1k:
- set #Treasure_Token,#Treasure_Token-1;
- set zeny,zeny+1000;
- close;
-N_10T:
- if (#Treasure_Token > 9) goto N_GetZeny10k;
- mes "You don't have enough tokens!";
- close;
-N_GetZeny10k:
- set #Treasure_Token,#Treasure_Token-10;
- set zeny,zeny+10000;
- close;
-N_100T:
- if (#Treasure_Token > 99) goto N_GetZeny100k;
- mes "You don't have enough tokens!";
- close;
-N_GetZeny100k:
- set #Treasure_Token,#Treasure_Token-100;
- set zeny,zeny+100000;
- close;
-
-N_BuyWeps:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Axe's",-,"1 Handed Swords",N_1HandSword,"2 Handed Swords",N_2HandSword,"Book's",N_Book,"Bow's",N_Bow,"Katar's",N_Katar,"Knuckle's",N_Knuckle,"Mace's",N_Mace,"Whips",N_Whip,"Wands",N_Wand,"Nevermind",N_NVM;
-
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Sabbath - 160T",-,"Slaughter - 160T",N_Slau,"Tomahawk - 180T",N_Toma,"Great Axe - 200T",N_GreatA,"Guillotine - 200T",N_Guill,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 160) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-160;
- getitem 1365,1;
- logmes "Treasure Token: Bought a Sabbath";
- close;
-N_Slau:
- if (#Treasure_Token < 160) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-160;
- getitem 1367,1;
- logmes "Treasure Token: Bought a Slaughter";
- close;
-N_Toma:
- if (#Treasure_Token < 180) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-180;
- getitem 1368,1;
- logmes "Treasure Token: Bought a Tomahawk";
- close;
-N_GreatA:
- if (#Treasure_Token < 200) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-200;
- getitem 1364,1;
- logmes "Treasure Token: Bought a Great Axe";
- close;
-N_Guill:
- if (#Treasure_Token < 200) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-200;
- getitem 1369,1;
- logmes "Treasure Token: Bought a Guillotine";
- close;
-N_NeedToken:
- mes "[Ash]";
- mes "You don't have enough tokens!";
- close;
-
-
-N_1HandSword:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Edge - 130T",-,"Solar Sword - 150T",N_SolarS,"Caesar's Sword - 170T",N_CaesarS,"Nagan - 180T",N_Nagan,"Immaterial Sword - 200T",N_ImmatS,"Excalibur - 200T",N_Excal,"Byeollungum - 240T",N_Byeoll,"Talefing - 320T",N_Talef,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 130) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-130;
- getitem 1132,1;
- logmes "Treasure Token: Bought a Edge";
- close;
-N_SolarS:
- if (#Treasure_Token < 150) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-150;
- logmes "Treasure Token: Bought a Solar Sword";
- getitem 1136,1;
- close;
-N_CaesarS:
- if (#Treasure_Token < 170) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-170;
- logmes "Treasure Token: Bought a Caesars Sword";
- getitem 1134,1;
- close;
-N_Nagan:
- if (#Treasure_Token < 180) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-180;
- logmes "Treasure Token: Bought a Nagan";
- getitem 1130,1;
- close;
-N_ImmatS:
- if (#Treasure_Token < 200) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-200;
- logmes "Treasure Token: Bought a Immaterial Sword";
- getitem 1141,1;
- close;
-N_Excal:
- if (#Treasure_Token < 200) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-200;
- logmes "Treasure Token: Bought a Excalibur";
- getitem 1137,1;
- close;
-N_Byeoll:
- if (#Treasure_Token < 240) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-240;
- logmes "Treasure Token: Bought a Byeollungum";
- getitem 1140,1;
- close;
-N_Talef:
- if (#Treasure_Token < 320) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-320;
- logmes "Treasure Token: Bought a Talefing";
- getitem 1139,1;
- close;
-
-
-N_2HandSword:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Dragon Slayer - 140T",-,"Schweizersabel - 200T",N_Schwe,"Katzbalger - 300T",N_Katzb,"Muramasa - 300T",N_Murama,"Masamune - 400T",N_Masamu,"Balmung - 2000T",N_Balmu,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 140) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-140;
- logmes "Treasure Token: Bought a Dragon Slayer";
- getitem 1166,1;
- close;
-N_Schwe:
- if (#Treasure_Token < 200) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-200;
- logmes "Treasure Token: Bought a Schweizersabel";
- getitem 1167,1;
- close;
-N_Katzb:
- if (#Treasure_Token < 300) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-300;
- logmes "Treasure Token: Bought a Katzbalger";
- getitem 1170,1;
- close;
-N_Murama:
- if (#Treasure_Token < 300) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-300;
- logmes "Treasure Token: Bought a Muramasa";
- getitem 1164,1;
- close;
-N_Masamu:
- if (#Treasure_Token < 400) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-400;
- logmes "Treasure Token: Bought a Masamune";
- getitem 1165,1;
- close;
-N_Balmu:
- if (#Treasure_Token < 2000) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-2000;
- logmes "Treasure Token: Bought a Balmung";
- getitem 1161,1;
- close;
-
-
-N_Book:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Book of the Burning Sun - 80T",-,"Book of the Rough Seas - 80T",N_RoughSea,"Book of the Dry Winds - 80T",N_DryWinds,"Book of the Ripe Earth - 80T",N_RipeEarth,"Book of the Revelations - 80T",N_Revela,"Bible - 90T",N_Bible,"Tablet - 120T",N_Tablet,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 80) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-80;
- logmes "Treasure Token: Bought a Book of the Burning Sun";
- getitem 1555,1;
- close;
-N_RoughSea:
- if (#Treasure_Token < 80) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-80;
- logmes "Treasure Token: Bought a Book of the Rough Seas";
- getitem 1553,1;
- close;
-N_DryWinds:
- if (#Treasure_Token < 80) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-80;
- logmes "Treasure Token: Bought a Book of the Dry Winds";
- getitem 1556,1;
- close;
-N_RipeEarth:
- if (#Treasure_Token < 80) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-80;
- logmes "Treasure Token: Bought a Book of the Ripe Earth";
- getitem 1554,1;
- close;
-N_Revela:
- if (#Treasure_Token < 80) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-80;
- logmes "Treasure Token: Bought a Book of the Revelations";
- getitem 1557,1;
- close;
-N_Bible:
- if (#Treasure_Token < 90) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-90;
- logmes "Treasure Token: Bought a Bible";
- getitem 1551,1;
- close;
-N_Tablet:
- if (#Treasure_Token < 120) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-120;
- logmes "Treasure Token: Bought a Tablet";
- getitem 1552,1;
- close;
-
-N_Bow:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Rudra's Bow - 150T",-,"Roguemaster's Bow - 150T",N_Rogue,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 150) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-150;
- logmes "Treasure Token: Bought a Rudra Bow";
- getitem 1720,1;
- close;
-N_Rogue:
- if (#Treasure_Token < 150) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-150;
- logmes "Treasure Token: Bought a Roguemaster Bow";
- getitem 1719,1;
- close;
-
-N_Katar:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Katar of the Blazing Rage - 70T",-,"Katar of the Cold Icicle - 70T",N_ColdIce,"Katar of the Piercing Wind - 70T",N_PiercWind,"Katar of the Dusty Thornbush - 70T",N_DustyT,"Sharpened Legbone of Ghoul - 125T",N_Legbone,"Infiltrator - 150T",N_Infiltra,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 70) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-70;
- logmes "Treasure Token: Bought a Katar of the Blazing Rage";
- getitem 1258,1;
- close;
-N_ColdIce:
- if (#Treasure_Token < 70) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-70;
- logmes "Treasure Token: Bought a Katar of the Cold Icicle";
- getitem 1256,1;
- close;
-N_PiercWind:
- if (#Treasure_Token < 70) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-70;
- logmes "Treasure Token: Bought a Katar of the Piercing Wind";
- getitem 1259,1;
- close;
-N_DustyT:
- if (#Treasure_Token < 70) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-70;
- logmes "Treasure Token: Bought a Katar of the Dusty Thornbush";
- getitem 1257,1;
- close;
-N_Legbone:
- if (#Treasure_Token < 125) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-125;
- logmes "Treasure Token: Bought a Sharpened Legbone of Ghoul";
- getitem 1260,1;
- close;
-N_Infiltra:
- if (#Treasure_Token < 150) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-150;
- logmes "Treasure Token: Bought a Infiltrator";
- getitem 1261,1;
- close;
-
-N_Knuckle:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Kaiser Knuckle - 75T",-,"Berserk - 75T",N_Berserk,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 75) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-75;
- logmes "Treasure Token: Bought a Kaiser Knuckle";
- getitem 1813,1;
- close;
-N_Berserk:
- if (#Treasure_Token < 75) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-75;
- logmes "Treasure Token: Bought a Berserk";
- getitem 1814,1;
- close;
-
-N_Mace:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Spike - 65T",-,"Slash - 90T",N_Slash,"Grand Cross - 100T",N_GrandC,"Quadrille - 110T",N_Quadr,"Mjolnir - 1000T",N_MJ,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 65) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-65;
- logmes "Treasure Token: Bought a Spike";
- getitem 1523,1;
- close;
-N_Slash:
- if (#Treasure_Token < 90) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-90;
- logmes "Treasure Token: Bought a Slash";
- getitem 1526,1;
- close;
-N_GrandC:
- if (#Treasure_Token < 100) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-100;
- logmes "Treasure Token: Bought a Grand Cross";
- getitem 1528,1;
- close;
-N_Quadr:
- if (#Treasure_Token < 110) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-110;
- logmes "Treasure Token: Bought a Quadrille";
- getitem 1527,1;
- close;
-N_MJ:
- if (#Treasure_Token < 1000) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-1000;
- logmes "Treasure Token: Bought a Mjolnir";
- getitem 1530,1;
- close;
-
-N_Whip:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Rapture Rose - 50T",-,"Chemeti - 65T",N_Chemeti,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 50) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-50;
- logmes "Treasure Token: Bought a Rapture Rose";
- getitem 1963,1;
- close;
-N_Chemeti:
- if (#Treasure_Token < 65) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-65;
- logmes "Treasure Token: Bought a Chemeti";
- getitem 1964,1;
- close;
-
-N_Wand:
- mes "[Ash]";
- mes "This is what we have to offer.";
- next;
- menu "Mighty Staff - 90T",-,"Wizardry Staff - 150T",N_Wizardry,"Bone Wand - 110T",N_BoneW,"Staff of Soul - 120T",N_SOSoul,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 90) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-90;
- logmes "Treasure Token: Bought a Mighty Staff";
- getitem 1613,1;//Items: Mighty_Staff,
- close;
-N_Wizardry:
- if (#Treasure_Token < 150) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-150;
- logmes "Treasure Token: Bought a Wizardry Staff";
- getitem 1473,1;//Items: Wizardy_Staff,
- close;
-N_BoneW:
- if (#Treasure_Token < 110) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-110;
- logmes "Treasure Token: Bought a Bone Wand";
- getitem 1615,1;//Items: Bone_Wand,
- close;
-N_SOSoul:
- if (#Treasure_Token < 120) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-120;
- logmes "Treasure Token: Bought a Staff of Soul";
- getitem 1472,1;//Items: Staff_of_Soul,
- close;
-
-N_BuyCards:
- mes "[Ash]";
- mes "This is what we have to offer. All Cards are 300T";
- next;
- menu "Poring Card - 2T",-,"Pasana Card - 420T",N_CPasana,"Dokebi Card - 420T",N_CDok,"Swordfish Card - 420T",N_CSFish,
- "Sandman Card - 420T",N_CSMan,"Drainliar Card - 360T",N_CDrain,"Kaho Card - 360T",N_CKaho,"Mandragora Card - 360T",N_CMand,
- "Vadon Card - 360T",N_CVadon,"Mummy Card - 540T",N_CMummy,"Zenorc Card - 240T",N_CZeno,"Condor Card - 240T",N_CCond,
- "Zombie Card - 210T",N_CZomb,"Nevermind",N_NVM;
-
- if (#Treasure_Token < 2) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-2;
- logmes "Treasure Token: Bought a Poring Card";
- getitem 4001,1;//Items: Poring_Card,
- close;
-
-N_CPasana:
- if (#Treasure_Token < 420) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-420;
- logmes "Treasure Token: Bought a Pasana Card";
- getitem 4099,1;//Items: Pasana_Card,
- close;
-N_CDok:
- if (#Treasure_Token < 420) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-420;
- logmes "Treasure Token: Bought a Dokebi Card";
- getitem 4098,1;//Items: Dokebi_Card,
- close;
-N_CSFish:
- if (#Treasure_Token < 420) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-420;
- logmes "Treasure Token: Bought a Swordfish Card";
- getitem 4089,1;//Items: Sword_Fish_Card,
- close;
-N_CSMan:
- if (#Treasure_Token < 420) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-420;
- logmes "Treasure Token: Bought a Sandman Card";
- getitem 4101,1;//Items: Sand_Man_Card,
- close;
-N_CDrain:
- if (#Treasure_Token < 360) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-360;
- logmes "Treasure Token: Bought a Drainliar Card";
- getitem 4069,1;//Items: Drainliar_Card,
- close;
-N_CKaho:
- if (#Treasure_Token < 360) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-360;
- logmes "Treasure Token: Bought a Kaho Card";
- getitem 4065,1;//Items: Kaho_Card,
- close;
-N_CMand:
- if (#Treasure_Token < 360) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-360;
- logmes "Treasure Token: Bought a Mandragora Card";
- getitem 4030,1;//Items: Mandragora_Card,
- close;
-N_CVadon:
- if (#Treasure_Token < 360) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-360;
- logmes "Treasure Token: Bought a Vadon Card";
- getitem 4049,1;//Items: Vadon_Card,
- close;
-N_CMummy:
- if (#Treasure_Token < 540) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-540;
- logmes "Treasure Token: Bought a Mummy Card";
- getitem 4106,1;//Items: Mummy_Card,
- close;
-N_CZeno:
- if (#Treasure_Token < 240) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-240;
- logmes "Treasure Token: Bought a Zenorc Card";
- getitem 4096,1;//Items: Zenorc_Card,
- close;
-N_CCond:
- if (#Treasure_Token < 240) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-240;
- logmes "Treasure Token: Bought a Condor Card";
- getitem 4015,1;//Items: Condor_Card,
- close;
-N_CZomb:
- if (#Treasure_Token < 210) goto N_NeedToken;
- set #Treasure_Token,#Treasure_Token-210;
- logmes "Treasure Token: Bought a Zombie Card";
- getitem 4038,1;//Items: Zombie_Card,
- close;
-}
+//===== Athena Script =====================================
+//= Treasure Hunter Script
+//===== Converted By ======================================
+//= Fredzilla
+//= Original
+///////////////////////////////////////////////////////////
+// Treasure Hunter Quests //
+// By: Ezekial //
+// for the use on nRO run by Newbe5 //
+// revised By Warlock //
+///////////////////////////////////////////////////////////
+//===== Version ===========================================
+//= 1.1
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Start for Treasure hunter quests
+//===== Comments ==========================================
+//= Event_THQS - Used to check if you have already registerd
+//= #Treasure_Token - used to keep track of tokens
+//= v1.0 - Straight conversion of Aegis NPC file
+//= v1.1 - balanced some prices, fixed 1 missing label
+//= removed Executioner&Mysteltain swords [Lupus]
+//////////////////////////////////////////////////////////
+
+prt_in.gat,159,172,0 warp thqwrp 3,3,yuno_in01.gat,123,155
+
+prt_in.gat,164,174,1 script Treasure Hunter's Shop 65,{
+ mes "[Ash]";
+ mes "Ahh, "+strcharinfo(0)+"! Welcome to the Offical Treasure Hunter's Guild Shop.";
+ mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!";
+ next;
+ menu "How does this place work?",-,"What do you have in stock?",N_Shop,"Nevermind",N_NVM;
+ mes "[Ash]";
+ mes "Well you see here you can exchange your treasure hunter tokens for zeny or rare weapons forged by our blacksmiths.";
+ mes " ";
+ mes "Everything has its own price value and the only way you can get the tokens is by completing quests assigned to you,the system normally works like this.";
+ mes " ";
+ mes "The harder the mission the more Tokens you will earn. All red quests are worth 4-8 Tokens, and the rest are worth 1-5.";
+ mes " ";
+ mes "Hope that solves your problem and questions.";
+ close;
+N_NVM:
+ close;
+ end;
+N_Shop:
+//This is when it gets hard :)
+ mes "[Ash]";
+ mes "Ok here is our Big list of goods.";
+ mes " ";
+ mes "(Note T stands for a Treasure Token.)";
+ next;
+ menu "Trade for Zeny",-,"Trade for Weapons",N_BuyWeps,"Trade for Cards",N_BuyCards,"Nevermind",N_NVM;
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "1000z - 1T",-,"10000z - 10T",N_10T,"100000z - 100T",N_100T,"Nevermind",N_NVM;
+ if (#Treasure_Token > 0) goto N_GetZeny1k;
+ mes "You don't have enough tokens!";
+ close;
+N_GetZeny1k:
+ set #Treasure_Token,#Treasure_Token-1;
+ set zeny,zeny+1000;
+ close;
+N_10T:
+ if (#Treasure_Token > 9) goto N_GetZeny10k;
+ mes "You don't have enough tokens!";
+ close;
+N_GetZeny10k:
+ set #Treasure_Token,#Treasure_Token-10;
+ set zeny,zeny+10000;
+ close;
+N_100T:
+ if (#Treasure_Token > 99) goto N_GetZeny100k;
+ mes "You don't have enough tokens!";
+ close;
+N_GetZeny100k:
+ set #Treasure_Token,#Treasure_Token-100;
+ set zeny,zeny+100000;
+ close;
+
+N_BuyWeps:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Axe's",-,"1 Handed Swords",N_1HandSword,"2 Handed Swords",N_2HandSword,"Book's",N_Book,"Bow's",N_Bow,"Katar's",N_Katar,"Knuckle's",N_Knuckle,"Mace's",N_Mace,"Whips",N_Whip,"Wands",N_Wand,"Nevermind",N_NVM;
+
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Sabbath - 160T",-,"Slaughter - 160T",N_Slau,"Tomahawk - 180T",N_Toma,"Great Axe - 200T",N_GreatA,"Guillotine - 200T",N_Guill,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 160) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-160;
+ getitem 1365,1;
+ logmes "Treasure Token: Bought a Sabbath";
+ close;
+N_Slau:
+ if (#Treasure_Token < 160) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-160;
+ getitem 1367,1;
+ logmes "Treasure Token: Bought a Slaughter";
+ close;
+N_Toma:
+ if (#Treasure_Token < 180) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-180;
+ getitem 1368,1;
+ logmes "Treasure Token: Bought a Tomahawk";
+ close;
+N_GreatA:
+ if (#Treasure_Token < 200) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-200;
+ getitem 1364,1;
+ logmes "Treasure Token: Bought a Great Axe";
+ close;
+N_Guill:
+ if (#Treasure_Token < 200) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-200;
+ getitem 1369,1;
+ logmes "Treasure Token: Bought a Guillotine";
+ close;
+N_NeedToken:
+ mes "[Ash]";
+ mes "You don't have enough tokens!";
+ close;
+
+
+N_1HandSword:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Edge - 130T",-,"Solar Sword - 150T",N_SolarS,"Caesar's Sword - 170T",N_CaesarS,"Nagan - 180T",N_Nagan,"Immaterial Sword - 200T",N_ImmatS,"Excalibur - 200T",N_Excal,"Byeollungum - 240T",N_Byeoll,"Talefing - 320T",N_Talef,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 130) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-130;
+ getitem 1132,1;
+ logmes "Treasure Token: Bought a Edge";
+ close;
+N_SolarS:
+ if (#Treasure_Token < 150) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-150;
+ logmes "Treasure Token: Bought a Solar Sword";
+ getitem 1136,1;
+ close;
+N_CaesarS:
+ if (#Treasure_Token < 170) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-170;
+ logmes "Treasure Token: Bought a Caesars Sword";
+ getitem 1134,1;
+ close;
+N_Nagan:
+ if (#Treasure_Token < 180) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-180;
+ logmes "Treasure Token: Bought a Nagan";
+ getitem 1130,1;
+ close;
+N_ImmatS:
+ if (#Treasure_Token < 200) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-200;
+ logmes "Treasure Token: Bought a Immaterial Sword";
+ getitem 1141,1;
+ close;
+N_Excal:
+ if (#Treasure_Token < 200) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-200;
+ logmes "Treasure Token: Bought a Excalibur";
+ getitem 1137,1;
+ close;
+N_Byeoll:
+ if (#Treasure_Token < 240) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-240;
+ logmes "Treasure Token: Bought a Byeollungum";
+ getitem 1140,1;
+ close;
+N_Talef:
+ if (#Treasure_Token < 320) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-320;
+ logmes "Treasure Token: Bought a Talefing";
+ getitem 1139,1;
+ close;
+
+
+N_2HandSword:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Dragon Slayer - 140T",-,"Schweizersabel - 200T",N_Schwe,"Katzbalger - 300T",N_Katzb,"Muramasa - 300T",N_Murama,"Masamune - 400T",N_Masamu,"Balmung - 2000T",N_Balmu,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 140) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-140;
+ logmes "Treasure Token: Bought a Dragon Slayer";
+ getitem 1166,1;
+ close;
+N_Schwe:
+ if (#Treasure_Token < 200) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-200;
+ logmes "Treasure Token: Bought a Schweizersabel";
+ getitem 1167,1;
+ close;
+N_Katzb:
+ if (#Treasure_Token < 300) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-300;
+ logmes "Treasure Token: Bought a Katzbalger";
+ getitem 1170,1;
+ close;
+N_Murama:
+ if (#Treasure_Token < 300) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-300;
+ logmes "Treasure Token: Bought a Muramasa";
+ getitem 1164,1;
+ close;
+N_Masamu:
+ if (#Treasure_Token < 400) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-400;
+ logmes "Treasure Token: Bought a Masamune";
+ getitem 1165,1;
+ close;
+N_Balmu:
+ if (#Treasure_Token < 2000) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-2000;
+ logmes "Treasure Token: Bought a Balmung";
+ getitem 1161,1;
+ close;
+
+
+N_Book:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Book of the Burning Sun - 80T",-,"Book of the Rough Seas - 80T",N_RoughSea,"Book of the Dry Winds - 80T",N_DryWinds,"Book of the Ripe Earth - 80T",N_RipeEarth,"Book of the Revelations - 80T",N_Revela,"Bible - 90T",N_Bible,"Tablet - 120T",N_Tablet,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 80) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-80;
+ logmes "Treasure Token: Bought a Book of the Burning Sun";
+ getitem 1555,1;
+ close;
+N_RoughSea:
+ if (#Treasure_Token < 80) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-80;
+ logmes "Treasure Token: Bought a Book of the Rough Seas";
+ getitem 1553,1;
+ close;
+N_DryWinds:
+ if (#Treasure_Token < 80) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-80;
+ logmes "Treasure Token: Bought a Book of the Dry Winds";
+ getitem 1556,1;
+ close;
+N_RipeEarth:
+ if (#Treasure_Token < 80) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-80;
+ logmes "Treasure Token: Bought a Book of the Ripe Earth";
+ getitem 1554,1;
+ close;
+N_Revela:
+ if (#Treasure_Token < 80) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-80;
+ logmes "Treasure Token: Bought a Book of the Revelations";
+ getitem 1557,1;
+ close;
+N_Bible:
+ if (#Treasure_Token < 90) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-90;
+ logmes "Treasure Token: Bought a Bible";
+ getitem 1551,1;
+ close;
+N_Tablet:
+ if (#Treasure_Token < 120) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-120;
+ logmes "Treasure Token: Bought a Tablet";
+ getitem 1552,1;
+ close;
+
+N_Bow:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Rudra's Bow - 150T",-,"Roguemaster's Bow - 150T",N_Rogue,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 150) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-150;
+ logmes "Treasure Token: Bought a Rudra Bow";
+ getitem 1720,1;
+ close;
+N_Rogue:
+ if (#Treasure_Token < 150) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-150;
+ logmes "Treasure Token: Bought a Roguemaster Bow";
+ getitem 1719,1;
+ close;
+
+N_Katar:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Katar of the Blazing Rage - 70T",-,"Katar of the Cold Icicle - 70T",N_ColdIce,"Katar of the Piercing Wind - 70T",N_PiercWind,"Katar of the Dusty Thornbush - 70T",N_DustyT,"Sharpened Legbone of Ghoul - 125T",N_Legbone,"Infiltrator - 150T",N_Infiltra,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 70) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-70;
+ logmes "Treasure Token: Bought a Katar of the Blazing Rage";
+ getitem 1258,1;
+ close;
+N_ColdIce:
+ if (#Treasure_Token < 70) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-70;
+ logmes "Treasure Token: Bought a Katar of the Cold Icicle";
+ getitem 1256,1;
+ close;
+N_PiercWind:
+ if (#Treasure_Token < 70) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-70;
+ logmes "Treasure Token: Bought a Katar of the Piercing Wind";
+ getitem 1259,1;
+ close;
+N_DustyT:
+ if (#Treasure_Token < 70) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-70;
+ logmes "Treasure Token: Bought a Katar of the Dusty Thornbush";
+ getitem 1257,1;
+ close;
+N_Legbone:
+ if (#Treasure_Token < 125) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-125;
+ logmes "Treasure Token: Bought a Sharpened Legbone of Ghoul";
+ getitem 1260,1;
+ close;
+N_Infiltra:
+ if (#Treasure_Token < 150) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-150;
+ logmes "Treasure Token: Bought a Infiltrator";
+ getitem 1261,1;
+ close;
+
+N_Knuckle:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Kaiser Knuckle - 75T",-,"Berserk - 75T",N_Berserk,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 75) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-75;
+ logmes "Treasure Token: Bought a Kaiser Knuckle";
+ getitem 1813,1;
+ close;
+N_Berserk:
+ if (#Treasure_Token < 75) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-75;
+ logmes "Treasure Token: Bought a Berserk";
+ getitem 1814,1;
+ close;
+
+N_Mace:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Spike - 65T",-,"Slash - 90T",N_Slash,"Grand Cross - 100T",N_GrandC,"Quadrille - 110T",N_Quadr,"Mjolnir - 1000T",N_MJ,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 65) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-65;
+ logmes "Treasure Token: Bought a Spike";
+ getitem 1523,1;
+ close;
+N_Slash:
+ if (#Treasure_Token < 90) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-90;
+ logmes "Treasure Token: Bought a Slash";
+ getitem 1526,1;
+ close;
+N_GrandC:
+ if (#Treasure_Token < 100) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-100;
+ logmes "Treasure Token: Bought a Grand Cross";
+ getitem 1528,1;
+ close;
+N_Quadr:
+ if (#Treasure_Token < 110) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-110;
+ logmes "Treasure Token: Bought a Quadrille";
+ getitem 1527,1;
+ close;
+N_MJ:
+ if (#Treasure_Token < 1000) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-1000;
+ logmes "Treasure Token: Bought a Mjolnir";
+ getitem 1530,1;
+ close;
+
+N_Whip:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Rapture Rose - 50T",-,"Chemeti - 65T",N_Chemeti,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 50) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-50;
+ logmes "Treasure Token: Bought a Rapture Rose";
+ getitem 1963,1;
+ close;
+N_Chemeti:
+ if (#Treasure_Token < 65) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-65;
+ logmes "Treasure Token: Bought a Chemeti";
+ getitem 1964,1;
+ close;
+
+N_Wand:
+ mes "[Ash]";
+ mes "This is what we have to offer.";
+ next;
+ menu "Mighty Staff - 90T",-,"Wizardry Staff - 150T",N_Wizardry,"Bone Wand - 110T",N_BoneW,"Staff of Soul - 120T",N_SOSoul,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 90) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-90;
+ logmes "Treasure Token: Bought a Mighty Staff";
+ getitem 1613,1;//Items: Mighty_Staff,
+ close;
+N_Wizardry:
+ if (#Treasure_Token < 150) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-150;
+ logmes "Treasure Token: Bought a Wizardry Staff";
+ getitem 1473,1;//Items: Wizardy_Staff,
+ close;
+N_BoneW:
+ if (#Treasure_Token < 110) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-110;
+ logmes "Treasure Token: Bought a Bone Wand";
+ getitem 1615,1;//Items: Bone_Wand,
+ close;
+N_SOSoul:
+ if (#Treasure_Token < 120) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-120;
+ logmes "Treasure Token: Bought a Staff of Soul";
+ getitem 1472,1;//Items: Staff_of_Soul,
+ close;
+
+N_BuyCards:
+ mes "[Ash]";
+ mes "This is what we have to offer. All Cards are 300T";
+ next;
+ menu "Poring Card - 2T",-,"Pasana Card - 420T",N_CPasana,"Dokebi Card - 420T",N_CDok,"Swordfish Card - 420T",N_CSFish,
+ "Sandman Card - 420T",N_CSMan,"Drainliar Card - 360T",N_CDrain,"Kaho Card - 360T",N_CKaho,"Mandragora Card - 360T",N_CMand,
+ "Vadon Card - 360T",N_CVadon,"Mummy Card - 540T",N_CMummy,"Zenorc Card - 240T",N_CZeno,"Condor Card - 240T",N_CCond,
+ "Zombie Card - 210T",N_CZomb,"Nevermind",N_NVM;
+
+ if (#Treasure_Token < 2) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-2;
+ logmes "Treasure Token: Bought a Poring Card";
+ getitem 4001,1;//Items: Poring_Card,
+ close;
+
+N_CPasana:
+ if (#Treasure_Token < 420) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-420;
+ logmes "Treasure Token: Bought a Pasana Card";
+ getitem 4099,1;//Items: Pasana_Card,
+ close;
+N_CDok:
+ if (#Treasure_Token < 420) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-420;
+ logmes "Treasure Token: Bought a Dokebi Card";
+ getitem 4098,1;//Items: Dokebi_Card,
+ close;
+N_CSFish:
+ if (#Treasure_Token < 420) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-420;
+ logmes "Treasure Token: Bought a Swordfish Card";
+ getitem 4089,1;//Items: Sword_Fish_Card,
+ close;
+N_CSMan:
+ if (#Treasure_Token < 420) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-420;
+ logmes "Treasure Token: Bought a Sandman Card";
+ getitem 4101,1;//Items: Sand_Man_Card,
+ close;
+N_CDrain:
+ if (#Treasure_Token < 360) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-360;
+ logmes "Treasure Token: Bought a Drainliar Card";
+ getitem 4069,1;//Items: Drainliar_Card,
+ close;
+N_CKaho:
+ if (#Treasure_Token < 360) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-360;
+ logmes "Treasure Token: Bought a Kaho Card";
+ getitem 4065,1;//Items: Kaho_Card,
+ close;
+N_CMand:
+ if (#Treasure_Token < 360) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-360;
+ logmes "Treasure Token: Bought a Mandragora Card";
+ getitem 4030,1;//Items: Mandragora_Card,
+ close;
+N_CVadon:
+ if (#Treasure_Token < 360) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-360;
+ logmes "Treasure Token: Bought a Vadon Card";
+ getitem 4049,1;//Items: Vadon_Card,
+ close;
+N_CMummy:
+ if (#Treasure_Token < 540) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-540;
+ logmes "Treasure Token: Bought a Mummy Card";
+ getitem 4106,1;//Items: Mummy_Card,
+ close;
+N_CZeno:
+ if (#Treasure_Token < 240) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-240;
+ logmes "Treasure Token: Bought a Zenorc Card";
+ getitem 4096,1;//Items: Zenorc_Card,
+ close;
+N_CCond:
+ if (#Treasure_Token < 240) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-240;
+ logmes "Treasure Token: Bought a Condor Card";
+ getitem 4015,1;//Items: Condor_Card,
+ close;
+N_CZomb:
+ if (#Treasure_Token < 210) goto N_NeedToken;
+ set #Treasure_Token,#Treasure_Token-210;
+ logmes "Treasure Token: Bought a Zombie Card";
+ getitem 4038,1;//Items: Zombie_Card,
+ close;
+}
diff --git a/npc/custom/quests/umbalian_language.txt b/npc/custom/quests/umbalian_language.txt
index 55bd878bb..b61569683 100644
--- a/npc/custom/quests/umbalian_language.txt
+++ b/npc/custom/quests/umbalian_language.txt
@@ -1,213 +1,213 @@
-//===== eAthena Script =======================================
-//= Custom Umbalian Language Quest
-//===== By: ==================================================
-//= sabernet09 & eAthena Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= 1.0 Removed it from offical Umbala Quests [Lupus]
-//============================================================
-
-
-//======================================================================================//
-// Custom Umbala Language Quest
-//======================================================================================//
-
-prontera.gat,145,290,5 script Mason 742,{
- mes "[Mason]";
- if(umb_lang==0) goto L_NOT_GOT_QUEST;
- if(umb_lang==2 || umb_mason==1) goto L_AGAIN;
-
- mes "Hey there, I came here to Prontera in search of an old lady who can remove cards from slots. Do you know where I can find her?";
- menu "Yes",-, "No",M_NO;
-
- mes "Oooo, could you please tell me where she's at? I'd be really appreciative.";
- menu "Swordsman Association",-, "Sanctuary",M_Boo1,"Prontera Chivalry",M_Boo2,"Trading Post",M_Boo3,"Kit Shop",M_Boo4,"Inn",M_Boo5,"Armory",M_DONE,"Library",M_Boo6,"Job Agency",M_Boo7,"Prontera Castle",M_Boo8,"City Hall",M_Boo9;
-
- next;
- mes "[Mason]";
- mes "Hmm... I dunno why she would be there... guess I'll take a look.";
- close;
-M_Boo1:
- next;
- mes "[Mason]";
- mes "Wow I never knew she was a religious person... I'll see to it thanks.";
- close;
-M_Boo2:
- next;
- mes "[Mason]";
- mes "Hmm.... are you sure about that?";
- close;
-M_Boo3:
- next;
- mes "[Mason]";
- mes "Why would she need to go there? I think you might be mistaken.";
- close;
-M_Boo4:
- next;
- mes "[Mason]";
- mes "The only thing she'd need at a Kit shop is medicine for her rheumatism. She's probably long gone from there by now.";
- close;
-M_Boo5:
- next;
- mes "[Mason]";
- mes "I don't think she needs to be there, she LIVES here in Prontera.";
- close;
-M_Boo6:
- next;
- mes "[Mason]";
- mes "Ah I see, if she's studying then I don't want to bother her. Thanks anyways.";
- close;
-M_Boo7:
- next;
- mes "[Mason]";
- mes "Job Agency? I don't think so. Don't lead me all around Prontera please! She's already a teacher here.";
- close;
-M_Boo8:
- next;
- mes "[Mason]";
- mes "The castle eh, I don't want to step in there... just doesn't feel like my style. I don't like that noble feeling of importance type of thing.";
- close;
-M_Boo9:
- next;
- mes "[Mason]";
- mes "O wow, did she become an important part of Prontera? I'd think she's too busy for me to visit. I'll try again later.";
- close;
-M_DONE:
- next;
- mes "[Mason]";
- mes "Ah, I heard that her class was somewhere around there... thanks a lot! Here's a lil something for your help.";
- getitem 7117,1;//Items: Torn Spell Book,
- set umb_mason,1;
- close;
-
-L_AGAIN:
- emotion e_thx;
- mes "Yay, I found her! Thank you very much for you help!";
- close;
-
-L_NOT_GOT_QUEST:
- mes "Hi! I came here to Prontera in search of an old lady... But...";
- close;
-M_NO:
- mes "Oh.. Ok.. Thanks anyways.";
- close;
-}
-
-aldebaran.gat,153,212,1 script Mojo 740,{
- mes "[Mojo]";
- if(umb_lang!=1) goto L_NOT_GOT_QUEST;
- mes "Oh no! I lost my teacher's ^FF0000old magic book^000000!";
- mes "What am I going to do... those dumb Bathory...";
- if(umb_lang==1) set umb_mojo,1;
- close;
-L_NOT_GOT_QUEST:
- emotion e_what;
- mes "I lost my teacher's book! What am I going to do...";
- close;
-}
-
-amatsu.gat,267,189,4 script Marie 744,{
- mes "[Marie]";
- if(umb_lang==0) goto L_NOT_GOT_QUEST;
- if(umb_lang==2 || umb_marie==1) goto L_AGAIN;
- if(countitem(9001)>0 && countitem(643)>0) goto L_DONE;//Items: Poring Egg, Pet Incubator,
- mes "Hello, is there something you need?";
- next;
- menu "No nothing at all.",M_NO,"Your teacher sent me.",-;
-
- mes "[Marie]";
- mes "What does he want from me?";
- emotion e_what;
- next;
- mes "[Marie]";
- mes "Oh wait, I see... he wants his reference scroll back am I right? Well, I'm kinda still using it buuut... I'll give it back if you can gimme a poring egg and an incubator. Those things are so cute!";
- close;
-
-L_NOT_GOT_QUEST:
- emotion e_what;
- mes "Hi! What do you want from me?";
- close;
-
-M_NO:
- mes "[Marie]";
- mes "Hrrmm okay? Cya then..";
- close;
-
-L_DONE:
- mes "Heyyy there, you have a poring egg and the pet incubator to go with it! Are those for me?";
- menu "Yep!",-, "Sorry, no.",M_DOH;
-
- mes "[Marie]";
- if(countitem(9001)==0 && countitem(643)==0) goto M_DOH;//Items: Poring Egg, Pet Incubator,
- mes "Yatta! Here's a lil something in return.";
- delitem 9001,1;//Items: Poring Egg,
- delitem 643,1;//Items: Pet Incubator,
- getitem 7118,1;//Items: Torn Scroll,
- set umb_marie,1; //got Torn Scroll
- close;
-
-M_DOH:
- mes "Oh.. pooo... sigh...";
- close;
-
-L_AGAIN:
- emotion e_thx;
- mes "Yay! I love Porings!";
- close;
-}
-
-yuno.gat,157,366,2 script Wise Man Fabius 743,{
- mes "[Fabius]";
- if(event_umbala >= 3) set umb_lang,2; //You already learnt Umbalian language from Umbalian Chief. So this Quest is disabled
- if(umb_lang<2) goto L_QUEST;
- mes "You speak Umbalian fluently! So you will never forget the language of Umbalians!";
- close;
-L_QUEST:
- if((countitem(1006) < 1) || (countitem(7118) < 1) || (countitem(7117) < 1)) goto L_DONE;//Items: Old Magic Book, Torn Scroll, Torn Spell Book,
- delitem 1006,1; //Items: Old Magic Book,
- delitem 7118,1; //Items: Torn Scroll,
- delitem 7117,1;//Items: Torn Spell Book,
- emotion e_thx;
- mes "Ah, you've done well in retrieving my references. These artifacts holds information about ruins around the world, from the burning hell of the Magma Dungeon, to the strange eerie Hidden Forest of Yggsadril.";
- next;
- mes "[Fabius]";
- mes "But enough talk, you're just eager to get your reward aren't you? Well it may not sound much, but my reward for you is knowledge...";
- next;
- mes "[Fabius]";
- mes "Actually it is knowledge of the Umbalian people. They are connected to this world of Midgard in some special way, we just can't confirm it yet. There is a theory that they may be like the elves and protect the ancient tree of Yggsadril.";
- next;
- mes "[Fabius]";
- mes "And I, a great wise man of Yuno, will teach you their language!";
- next;
- mes "^0000FF Learned the language of Umbalians! ^000000";
- set umb_lang,2;
- //clear subquests
- set umb_marie,0;
- set umb_mason,0;
- set umb_mojo,0;
- //make you understand Umbalian people
- //it's an alternative way to learn Umbalian Language
- if(event_umbala < 3) set event_umbala,3;
- close;
-L_DONE:
- set umb_lang,1; //got Quest
- mes "Argh! My three students ran off with my references! Hey you! Can you get them back for me? I'll gladly reward you.";
- next;
- mes "[Fabius]";
- mes "From what I know, they're in different seperate towns making something out of themselves.";
- if(umb_marie==0 && umb_mason==0 && umb_mojo==0) goto L_NOT_MET;
- if(umb_marie==1) mes "Oh... You found Marie in Amatsu.";
- if(umb_mojo==1) mes "You saw Mojo in Aldebaran?";
- if(umb_mason==1) mes "So... Mason's in Prontera now... Well...";
- if(umb_marie==0) mes "I wonder where is our sea girl Marie?";
- if(umb_mojo==0) mes "Mojo should be somewhere near water...";
- if(umb_mason==0) mes "Where'd Mason go then...";
- mes "Oh yeah, tell them I sent you";
- close;
-L_NOT_MET:
- mes "Oh yeah, tell them I sent you, their names are Marie, Mason and Mojo.";
- close;
+//===== eAthena Script =======================================
+//= Custom Umbalian Language Quest
+//===== By: ==================================================
+//= sabernet09 & eAthena Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= 1.0 Removed it from offical Umbala Quests [Lupus]
+//============================================================
+
+
+//======================================================================================//
+// Custom Umbala Language Quest
+//======================================================================================//
+
+prontera.gat,145,290,5 script Mason 742,{
+ mes "[Mason]";
+ if(umb_lang==0) goto L_NOT_GOT_QUEST;
+ if(umb_lang==2 || umb_mason==1) goto L_AGAIN;
+
+ mes "Hey there, I came here to Prontera in search of an old lady who can remove cards from slots. Do you know where I can find her?";
+ menu "Yes",-, "No",M_NO;
+
+ mes "Oooo, could you please tell me where she's at? I'd be really appreciative.";
+ menu "Swordsman Association",-, "Sanctuary",M_Boo1,"Prontera Chivalry",M_Boo2,"Trading Post",M_Boo3,"Kit Shop",M_Boo4,"Inn",M_Boo5,"Armory",M_DONE,"Library",M_Boo6,"Job Agency",M_Boo7,"Prontera Castle",M_Boo8,"City Hall",M_Boo9;
+
+ next;
+ mes "[Mason]";
+ mes "Hmm... I dunno why she would be there... guess I'll take a look.";
+ close;
+M_Boo1:
+ next;
+ mes "[Mason]";
+ mes "Wow I never knew she was a religious person... I'll see to it thanks.";
+ close;
+M_Boo2:
+ next;
+ mes "[Mason]";
+ mes "Hmm.... are you sure about that?";
+ close;
+M_Boo3:
+ next;
+ mes "[Mason]";
+ mes "Why would she need to go there? I think you might be mistaken.";
+ close;
+M_Boo4:
+ next;
+ mes "[Mason]";
+ mes "The only thing she'd need at a Kit shop is medicine for her rheumatism. She's probably long gone from there by now.";
+ close;
+M_Boo5:
+ next;
+ mes "[Mason]";
+ mes "I don't think she needs to be there, she LIVES here in Prontera.";
+ close;
+M_Boo6:
+ next;
+ mes "[Mason]";
+ mes "Ah I see, if she's studying then I don't want to bother her. Thanks anyways.";
+ close;
+M_Boo7:
+ next;
+ mes "[Mason]";
+ mes "Job Agency? I don't think so. Don't lead me all around Prontera please! She's already a teacher here.";
+ close;
+M_Boo8:
+ next;
+ mes "[Mason]";
+ mes "The castle eh, I don't want to step in there... just doesn't feel like my style. I don't like that noble feeling of importance type of thing.";
+ close;
+M_Boo9:
+ next;
+ mes "[Mason]";
+ mes "O wow, did she become an important part of Prontera? I'd think she's too busy for me to visit. I'll try again later.";
+ close;
+M_DONE:
+ next;
+ mes "[Mason]";
+ mes "Ah, I heard that her class was somewhere around there... thanks a lot! Here's a lil something for your help.";
+ getitem 7117,1;//Items: Torn Spell Book,
+ set umb_mason,1;
+ close;
+
+L_AGAIN:
+ emotion e_thx;
+ mes "Yay, I found her! Thank you very much for you help!";
+ close;
+
+L_NOT_GOT_QUEST:
+ mes "Hi! I came here to Prontera in search of an old lady... But...";
+ close;
+M_NO:
+ mes "Oh.. Ok.. Thanks anyways.";
+ close;
+}
+
+aldebaran.gat,153,212,1 script Mojo 740,{
+ mes "[Mojo]";
+ if(umb_lang!=1) goto L_NOT_GOT_QUEST;
+ mes "Oh no! I lost my teacher's ^FF0000old magic book^000000!";
+ mes "What am I going to do... those dumb Bathory...";
+ if(umb_lang==1) set umb_mojo,1;
+ close;
+L_NOT_GOT_QUEST:
+ emotion e_what;
+ mes "I lost my teacher's book! What am I going to do...";
+ close;
+}
+
+amatsu.gat,267,189,4 script Marie 744,{
+ mes "[Marie]";
+ if(umb_lang==0) goto L_NOT_GOT_QUEST;
+ if(umb_lang==2 || umb_marie==1) goto L_AGAIN;
+ if(countitem(9001)>0 && countitem(643)>0) goto L_DONE;//Items: Poring Egg, Pet Incubator,
+ mes "Hello, is there something you need?";
+ next;
+ menu "No nothing at all.",M_NO,"Your teacher sent me.",-;
+
+ mes "[Marie]";
+ mes "What does he want from me?";
+ emotion e_what;
+ next;
+ mes "[Marie]";
+ mes "Oh wait, I see... he wants his reference scroll back am I right? Well, I'm kinda still using it buuut... I'll give it back if you can gimme a poring egg and an incubator. Those things are so cute!";
+ close;
+
+L_NOT_GOT_QUEST:
+ emotion e_what;
+ mes "Hi! What do you want from me?";
+ close;
+
+M_NO:
+ mes "[Marie]";
+ mes "Hrrmm okay? Cya then..";
+ close;
+
+L_DONE:
+ mes "Heyyy there, you have a poring egg and the pet incubator to go with it! Are those for me?";
+ menu "Yep!",-, "Sorry, no.",M_DOH;
+
+ mes "[Marie]";
+ if(countitem(9001)==0 && countitem(643)==0) goto M_DOH;//Items: Poring Egg, Pet Incubator,
+ mes "Yatta! Here's a lil something in return.";
+ delitem 9001,1;//Items: Poring Egg,
+ delitem 643,1;//Items: Pet Incubator,
+ getitem 7118,1;//Items: Torn Scroll,
+ set umb_marie,1; //got Torn Scroll
+ close;
+
+M_DOH:
+ mes "Oh.. pooo... sigh...";
+ close;
+
+L_AGAIN:
+ emotion e_thx;
+ mes "Yay! I love Porings!";
+ close;
+}
+
+yuno.gat,157,366,2 script Wise Man Fabius 743,{
+ mes "[Fabius]";
+ if(event_umbala >= 3) set umb_lang,2; //You already learnt Umbalian language from Umbalian Chief. So this Quest is disabled
+ if(umb_lang<2) goto L_QUEST;
+ mes "You speak Umbalian fluently! So you will never forget the language of Umbalians!";
+ close;
+L_QUEST:
+ if((countitem(1006) < 1) || (countitem(7118) < 1) || (countitem(7117) < 1)) goto L_DONE;//Items: Old Magic Book, Torn Scroll, Torn Spell Book,
+ delitem 1006,1; //Items: Old Magic Book,
+ delitem 7118,1; //Items: Torn Scroll,
+ delitem 7117,1;//Items: Torn Spell Book,
+ emotion e_thx;
+ mes "Ah, you've done well in retrieving my references. These artifacts holds information about ruins around the world, from the burning hell of the Magma Dungeon, to the strange eerie Hidden Forest of Yggsadril.";
+ next;
+ mes "[Fabius]";
+ mes "But enough talk, you're just eager to get your reward aren't you? Well it may not sound much, but my reward for you is knowledge...";
+ next;
+ mes "[Fabius]";
+ mes "Actually it is knowledge of the Umbalian people. They are connected to this world of Midgard in some special way, we just can't confirm it yet. There is a theory that they may be like the elves and protect the ancient tree of Yggsadril.";
+ next;
+ mes "[Fabius]";
+ mes "And I, a great wise man of Yuno, will teach you their language!";
+ next;
+ mes "^0000FF Learned the language of Umbalians! ^000000";
+ set umb_lang,2;
+ //clear subquests
+ set umb_marie,0;
+ set umb_mason,0;
+ set umb_mojo,0;
+ //make you understand Umbalian people
+ //it's an alternative way to learn Umbalian Language
+ if(event_umbala < 3) set event_umbala,3;
+ close;
+L_DONE:
+ set umb_lang,1; //got Quest
+ mes "Argh! My three students ran off with my references! Hey you! Can you get them back for me? I'll gladly reward you.";
+ next;
+ mes "[Fabius]";
+ mes "From what I know, they're in different seperate towns making something out of themselves.";
+ if(umb_marie==0 && umb_mason==0 && umb_mojo==0) goto L_NOT_MET;
+ if(umb_marie==1) mes "Oh... You found Marie in Amatsu.";
+ if(umb_mojo==1) mes "You saw Mojo in Aldebaran?";
+ if(umb_mason==1) mes "So... Mason's in Prontera now... Well...";
+ if(umb_marie==0) mes "I wonder where is our sea girl Marie?";
+ if(umb_mojo==0) mes "Mojo should be somewhere near water...";
+ if(umb_mason==0) mes "Where'd Mason go then...";
+ mes "Oh yeah, tell them I sent you";
+ close;
+L_NOT_MET:
+ mes "Oh yeah, tell them I sent you, their names are Marie, Mason and Mojo.";
+ close;
} \ No newline at end of file
diff --git a/npc/custom/quests/valhallen.txt b/npc/custom/quests/valhallen.txt
index dc61114e2..b9a36a153 100644
--- a/npc/custom/quests/valhallen.txt
+++ b/npc/custom/quests/valhallen.txt
@@ -1,197 +1,197 @@
-//===== eAthena Script =======================================
-//= Valhallen items Quests NPC
-//===== By: ==================================================
-//= Avaji
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= All-in-one: Mjollnir,Sleipnir,Brisingammen,Gleipnir,Megingjard
-//===== Additional Comments: =================================
-//= Custom quest, ingredients based on official RO FAQ
-//============================================================
-
-prontera.gat,147,171,5 script Lenneth 811,{
- mes "[Lenneth]";
- mes "I come from Valhalla to aid you.";
- mes "I can transmute for you many of the Valhallen items.";
- mes "Although they require many rare elements to make.";
- next;
- mes "[Lenneth]";
- mes "What would you like?";
- next;
- menu "Mjollnir",-,"Sleipnir",L_SLE,"Brisingammen",L_BRI,"Gleipnir",L_GLE,"Megingjard",L_MEG;
-
- mes "[Lenneth]";
- mes "^3355FFMjollnir^000000 is the mighty Hammer of Thor.";
- mes "The items I need to transmute 2 ^3355FFSpanners^000000 into ^3355FFMjollnir^000000 are as follows:";
- mes "20 ^3355FFOridecon^000000 5 ^3355FFElunium^000000 and 40 ^3355FFGold^000000";
- mes "I also need the following essences:";
- mes "2 ^3355FFThor's Guntlet^000000";
- mes "4 ^3355FFIron Maiden^000000";
- mes "5 ^3355FFWrath of Valkyrie^000000";
- mes "5 ^3355FFBreath of Soul^000000";
- mes "5 ^3355FFOmen of tempest^000000";
- next;
- mes "[Lenneth]";
- mes "Do you desire ^3355FFMjollnir^000000?";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if(countitem(984) < 20 || countitem(985) < 5 || countitem(969) < 40 || countitem(1531) < 2 || countitem(7089) < 5
- || countitem(7074) < 2 || countitem(7075) < 4 || countitem(7078) < 5 || countitem(7087) < 5) goto L_NOTENOUGH;
-
- delitem 984,20;
- delitem 985,5;
- delitem 969,40;
- delitem 1531,2;
- delitem 7074,2;
- delitem 7075,4;
- delitem 7078,5;
- delitem 7087,5;
- delitem 7089,5;
-
- getitem 1530,1;
-
- mes "[Lenneth]";
- mes "Here is your ^3355FFMjollnir^000000, may it serve you well.";
- close;
-L_SLE:
-
- mes "[Lenneth]";
- mes "^3355FFSleipnir^000000 are boots made after Odin's War Horse.";
- mes "To be able to transmute 2 ^3355FFBoots^000000 into ^3355FFSleipnir^000000 I will need:";
- mes "1 ^3355FFOridecon^000000 10 ^3355FFElunium^000000 and 20 ^3355FFGold^000000";
- mes "I also need the following essences:";
- mes "3 ^3355FFWheel of the Unknown^000000";
- mes "5 ^3355FFFeather of Angel^000000";
- mes "3 ^3355FFSprirt of Fish^000000";
- mes "3 ^3355FFEmblem of the Sun God^000000";
- next;
- mes "[Lenneth]";
- mes "Do you desire ^3355FFSleipnir^000000?";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if(countitem(969) < 20 || countitem(985) < 10 || countitem(984) < 1 || countitem(2406) < 2 || countitem(7076) < 3
- || countitem(7079) < 5 || countitem(7083) < 3 || countitem(7086) < 3) goto L_NOTENOUGH;
-
- delitem 969,20;
- delitem 985,10;
- delitem 984,1;
- delitem 2406,2;
- delitem 7076,3;
- delitem 7079,5;
- delitem 7083,3;
- delitem 7086,3;
-
- getitem 2410,1;
-
- mes "[Lenneth]";
- mes "Here is your ^3355FFSleipnir^000000, may they help you.";
- close;
-L_BRI:
-
- mes "[Lenneth]";
- mes "^3355FFBrisingammen^000000 is the magical Necklace of Freyja, goddess of Beauty.";
- mes "The items I need to transmute a ^3355FFNecklace^000000 into ^3355FFBrisingammen^000000 are as follows:";
- mes "2 ^3355FFSapphire^000000 3 ^3355FFPearl^000000 10 ^3355FFOpal^000000";
- mes "5 ^3355FFRuby^000000 and 20 ^3355FFGold^000000";
- mes "I also need the following essences:";
- mes "4 ^3355FFFreya's Jewel^000000";
- mes "4 ^3355FFSilver Ornament^000000";
- mes "3 ^3355FFSnow Crystal^000000";
- mes "3 ^3355FFQuiet Wave^000000";
- mes "3 ^3355FFDrifting Air^000000";
- next;
- mes "[Lenneth]";
- mes "Do you desire ^3355FFBrisingammen^000000?";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if(countitem(969) < 20 || countitem(723) < 5 || countitem(727) < 10 || countitem(722) < 3 || countitem(726) < 2
- || countitem(7090) < 3 || countitem(7088) < 3 || countitem(7077) < 4 || countitem(7073) < 4 || countitem(2603) < 1
- || countitem(7092) < 3) goto L_NOTENOUGH;
-
- delitem 726,2;
- delitem 722,3;
- delitem 727,10;
- delitem 723,5;
- delitem 969,20;
- delitem 2603,1;
- delitem 7073,4;
- delitem 7077,4;
- delitem 7088,3;
- delitem 7090,3;
- delitem 7092,3;
-
- getitem 2630,1;
-
- mes "[Lenneth]";
- mes "Here is ^3355FFBrisingammen^000000, may it serve you well.";
- close;
-L_GLE:
-
- mes "[Lenneth]";
- mes "The ^3355FFGleipnir^000000 is a light yet strong rope required to make ^3355FFMegingjard^000000";
- mes "I will need the following essences to transmute ^3355FFGleipnir^000000:";
- mes "4 ^3355FFTread of Cat^000000";
- mes "5 ^3355FFWoman's Moustache^000000";
- mes "4 ^3355FFStone Fragment^000000";
- mes "3 ^3355FFSaliva of Bird^000000";
- mes "3 ^3355FFSinew of Bear^000000";
- next;
- mes "[Lenneth]";
- mes "Do you desire ^3355FFGleipnir^000000?";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if(countitem(7085) < 3 || countitem(7084) < 3 || countitem(7082) < 4 || countitem(7081) < 5 || countitem(7080) < 4) goto L_NOTENOUGH;
-
- delitem 7080,4;
- delitem 7081,5;
- delitem 7082,4;
- delitem 7084,3;
- delitem 7085,3;
-
- getitem 7058,1;
-
- mes "[Lenneth]";
- mes "Here is your ^3355FFGleipnir^000000.";
- close;
-L_MEG:
-
- mes "[Lenneth]";
- mes "The ^3355FFMegingjard^000000 is the powerful Belt of Thor.";
- mes "To transmute a ^3355FFBelt^000000 into ^3355FFMegingjard^000000 I will need the following:";
- mes "10 ^3355FFGold^000000 10 ^3355FFSapphire^000000";
- mes "5 ^3355FFOridecon^000000 and 1 ^3355FFGleipnir^000000";
- next;
- mes "[Lenneth]";
- mes "Do you desire ^3355FFMegingjard^000000?";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if(countitem(2627) < 1 || countitem(984) < 5 || countitem(726) < 10 || countitem(969) < 10 || countitem(7058) < 1) goto L_NOTENOUGH;
-
- delitem 7058,1;
- delitem 969,10;
- delitem 726,10;
- delitem 984,5;
- delitem 2627,1;
-
- getitem 2629,1;
-
- mes "[Lenneth]";
- mes "Here is ^3355FFMegingjard^000000, may it serve you well.";
- close;
-L_NOTENOUGH:
- mes "[Lenneth]";
- mes "You are lacking a few items, please return when you have them.";
- close;
-L_OUT:
- mes "[Lenneth]";
- mes "Please return when you change your mind.";
- close;
-}
+//===== eAthena Script =======================================
+//= Valhallen items Quests NPC
+//===== By: ==================================================
+//= Avaji
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= All-in-one: Mjollnir,Sleipnir,Brisingammen,Gleipnir,Megingjard
+//===== Additional Comments: =================================
+//= Custom quest, ingredients based on official RO FAQ
+//============================================================
+
+prontera.gat,147,171,5 script Lenneth 811,{
+ mes "[Lenneth]";
+ mes "I come from Valhalla to aid you.";
+ mes "I can transmute for you many of the Valhallen items.";
+ mes "Although they require many rare elements to make.";
+ next;
+ mes "[Lenneth]";
+ mes "What would you like?";
+ next;
+ menu "Mjollnir",-,"Sleipnir",L_SLE,"Brisingammen",L_BRI,"Gleipnir",L_GLE,"Megingjard",L_MEG;
+
+ mes "[Lenneth]";
+ mes "^3355FFMjollnir^000000 is the mighty Hammer of Thor.";
+ mes "The items I need to transmute 2 ^3355FFSpanners^000000 into ^3355FFMjollnir^000000 are as follows:";
+ mes "20 ^3355FFOridecon^000000 5 ^3355FFElunium^000000 and 40 ^3355FFGold^000000";
+ mes "I also need the following essences:";
+ mes "2 ^3355FFThor's Guntlet^000000";
+ mes "4 ^3355FFIron Maiden^000000";
+ mes "5 ^3355FFWrath of Valkyrie^000000";
+ mes "5 ^3355FFBreath of Soul^000000";
+ mes "5 ^3355FFOmen of tempest^000000";
+ next;
+ mes "[Lenneth]";
+ mes "Do you desire ^3355FFMjollnir^000000?";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if(countitem(984) < 20 || countitem(985) < 5 || countitem(969) < 40 || countitem(1531) < 2 || countitem(7089) < 5
+ || countitem(7074) < 2 || countitem(7075) < 4 || countitem(7078) < 5 || countitem(7087) < 5) goto L_NOTENOUGH;
+
+ delitem 984,20;
+ delitem 985,5;
+ delitem 969,40;
+ delitem 1531,2;
+ delitem 7074,2;
+ delitem 7075,4;
+ delitem 7078,5;
+ delitem 7087,5;
+ delitem 7089,5;
+
+ getitem 1530,1;
+
+ mes "[Lenneth]";
+ mes "Here is your ^3355FFMjollnir^000000, may it serve you well.";
+ close;
+L_SLE:
+
+ mes "[Lenneth]";
+ mes "^3355FFSleipnir^000000 are boots made after Odin's War Horse.";
+ mes "To be able to transmute 2 ^3355FFBoots^000000 into ^3355FFSleipnir^000000 I will need:";
+ mes "1 ^3355FFOridecon^000000 10 ^3355FFElunium^000000 and 20 ^3355FFGold^000000";
+ mes "I also need the following essences:";
+ mes "3 ^3355FFWheel of the Unknown^000000";
+ mes "5 ^3355FFFeather of Angel^000000";
+ mes "3 ^3355FFSprirt of Fish^000000";
+ mes "3 ^3355FFEmblem of the Sun God^000000";
+ next;
+ mes "[Lenneth]";
+ mes "Do you desire ^3355FFSleipnir^000000?";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if(countitem(969) < 20 || countitem(985) < 10 || countitem(984) < 1 || countitem(2406) < 2 || countitem(7076) < 3
+ || countitem(7079) < 5 || countitem(7083) < 3 || countitem(7086) < 3) goto L_NOTENOUGH;
+
+ delitem 969,20;
+ delitem 985,10;
+ delitem 984,1;
+ delitem 2406,2;
+ delitem 7076,3;
+ delitem 7079,5;
+ delitem 7083,3;
+ delitem 7086,3;
+
+ getitem 2410,1;
+
+ mes "[Lenneth]";
+ mes "Here is your ^3355FFSleipnir^000000, may they help you.";
+ close;
+L_BRI:
+
+ mes "[Lenneth]";
+ mes "^3355FFBrisingammen^000000 is the magical Necklace of Freyja, goddess of Beauty.";
+ mes "The items I need to transmute a ^3355FFNecklace^000000 into ^3355FFBrisingammen^000000 are as follows:";
+ mes "2 ^3355FFSapphire^000000 3 ^3355FFPearl^000000 10 ^3355FFOpal^000000";
+ mes "5 ^3355FFRuby^000000 and 20 ^3355FFGold^000000";
+ mes "I also need the following essences:";
+ mes "4 ^3355FFFreya's Jewel^000000";
+ mes "4 ^3355FFSilver Ornament^000000";
+ mes "3 ^3355FFSnow Crystal^000000";
+ mes "3 ^3355FFQuiet Wave^000000";
+ mes "3 ^3355FFDrifting Air^000000";
+ next;
+ mes "[Lenneth]";
+ mes "Do you desire ^3355FFBrisingammen^000000?";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if(countitem(969) < 20 || countitem(723) < 5 || countitem(727) < 10 || countitem(722) < 3 || countitem(726) < 2
+ || countitem(7090) < 3 || countitem(7088) < 3 || countitem(7077) < 4 || countitem(7073) < 4 || countitem(2603) < 1
+ || countitem(7092) < 3) goto L_NOTENOUGH;
+
+ delitem 726,2;
+ delitem 722,3;
+ delitem 727,10;
+ delitem 723,5;
+ delitem 969,20;
+ delitem 2603,1;
+ delitem 7073,4;
+ delitem 7077,4;
+ delitem 7088,3;
+ delitem 7090,3;
+ delitem 7092,3;
+
+ getitem 2630,1;
+
+ mes "[Lenneth]";
+ mes "Here is ^3355FFBrisingammen^000000, may it serve you well.";
+ close;
+L_GLE:
+
+ mes "[Lenneth]";
+ mes "The ^3355FFGleipnir^000000 is a light yet strong rope required to make ^3355FFMegingjard^000000";
+ mes "I will need the following essences to transmute ^3355FFGleipnir^000000:";
+ mes "4 ^3355FFTread of Cat^000000";
+ mes "5 ^3355FFWoman's Moustache^000000";
+ mes "4 ^3355FFStone Fragment^000000";
+ mes "3 ^3355FFSaliva of Bird^000000";
+ mes "3 ^3355FFSinew of Bear^000000";
+ next;
+ mes "[Lenneth]";
+ mes "Do you desire ^3355FFGleipnir^000000?";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if(countitem(7085) < 3 || countitem(7084) < 3 || countitem(7082) < 4 || countitem(7081) < 5 || countitem(7080) < 4) goto L_NOTENOUGH;
+
+ delitem 7080,4;
+ delitem 7081,5;
+ delitem 7082,4;
+ delitem 7084,3;
+ delitem 7085,3;
+
+ getitem 7058,1;
+
+ mes "[Lenneth]";
+ mes "Here is your ^3355FFGleipnir^000000.";
+ close;
+L_MEG:
+
+ mes "[Lenneth]";
+ mes "The ^3355FFMegingjard^000000 is the powerful Belt of Thor.";
+ mes "To transmute a ^3355FFBelt^000000 into ^3355FFMegingjard^000000 I will need the following:";
+ mes "10 ^3355FFGold^000000 10 ^3355FFSapphire^000000";
+ mes "5 ^3355FFOridecon^000000 and 1 ^3355FFGleipnir^000000";
+ next;
+ mes "[Lenneth]";
+ mes "Do you desire ^3355FFMegingjard^000000?";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if(countitem(2627) < 1 || countitem(984) < 5 || countitem(726) < 10 || countitem(969) < 10 || countitem(7058) < 1) goto L_NOTENOUGH;
+
+ delitem 7058,1;
+ delitem 969,10;
+ delitem 726,10;
+ delitem 984,5;
+ delitem 2627,1;
+
+ getitem 2629,1;
+
+ mes "[Lenneth]";
+ mes "Here is ^3355FFMegingjard^000000, may it serve you well.";
+ close;
+L_NOTENOUGH:
+ mes "[Lenneth]";
+ mes "You are lacking a few items, please return when you have them.";
+ close;
+L_OUT:
+ mes "[Lenneth]";
+ mes "Please return when you change your mind.";
+ close;
+}
diff --git a/npc/custom/rpsroulette.txt b/npc/custom/rpsroulette.txt
index d205ae252..247468947 100644
--- a/npc/custom/rpsroulette.txt
+++ b/npc/custom/rpsroulette.txt
@@ -1,286 +1,286 @@
-//===== eAthena Script =======================================
-//= Rock Scissors Roulette Script
-//===== By: ==================================================
-//= acky (1.1)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Plays a hybrid Russian Roulette Rock Scissors Paper game.
-//===== Additional Comments: =================================
-//= Prizes customisable, Added emotions.
-//= 1.2 Fixes by Blackthunder and me [Poki#3]
-//============================================================
-
-cmd_in02.gat,182,126,2 script Crazy Boris 85,{
- mes "Crazy Boris";
- set @counter,1;
- mes "Hey you! Up for Rock Scissors Roulette?";
- next;
- menu "Let me play.",PLAY,"Explain the rules.",RULES,"Leave",LEAVE;
- SAME:
- mes "Draw! Again!";
- next;
- goto PLAY;
-
-WIN:
- mes "Damnit, You Win!";
- emotion 19;
- next;
- goto OPPPULL;
-
-LOSE:
- emotion 18;
- mes "Boorah! You Lose!";
- next;
- goto YOUPULL;
-
-PLAY:
- mes "Rock... Paper...";
- set @opp,rand (1,3);
- menu "^0000FFROCK!",ROCK,"^FF0000SCISSORS!",SCISSORS,"^00FF00PAPER!^000000",PAPER;
-
-ROCK:
- if (@lastchoice == 1) set @opp,rand (1,3);
- if (@opp == 1) emotion 11;
- if (@opp == 2) emotion 10;
- if (@opp == 3) emotion 12;
- set @lastchoice,1;
- if (@opp == 1) goto SAME;
- if (@opp == 2) goto WIN;
- if (@opp == 3) goto LOSE;
-
-SCISSORS:
- if (@lastchoice == 2) set @opp,rand (1,2);
- if (@opp == 1) emotion 11;
- if (@opp == 2) emotion 10;
- if (@opp == 3) emotion 12;
- set @lastchoice,2;
- if (@opp == 1) goto LOSE;
- if (@opp == 2) goto SAME;
- if (@opp == 3) goto WIN;
-
-PAPER:
- if (@lastchoice == 3) set @opp,rand (2,3);
- if (@opp == 1) emotion 11;
- if (@opp == 2) emotion 10;
- if (@opp == 3) emotion 12;
- set @lastchoice,3;
- if (@opp == 1) goto WIN;
- if (@opp == 2) goto LOSE;
- if (@opp == 3) goto SAME;
-
-YOUPULL:
- if (@counter == 1) goto ONE;
- if (@counter == 2) goto TWO;
- if (@counter == 3) goto THREE;
- if (@counter == 4) goto FOUR;
- if (@counter == 5) goto FIVE;
- if (@counter == 6) goto SIX;
-
-OPPPULL:
- if (@counter == 1) goto ONEa;
- if (@counter == 2) goto TWOa;
- if (@counter == 3) goto THREEa;
- if (@counter == 4) goto FOURa;
- if (@counter == 5) goto FIVEa;
- if (@counter == 6) goto SIXa;
-
-ONE:
- set @counter,2;
- mes "1 of 6";
- set @pull,rand (1,6);
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-TWO:
- set @counter,3;
- mes "2 of 6";
- set @pull,rand (1,5);
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-THREE:
- set @counter,4;
- mes "3 of 6";
- set @pull,rand (1,4);
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-FOUR:
- set @counter,5;
- mes "4 of 6";
- set @pull,rand (1,3);
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-FIVE:
- set @counter,6;
- mes "5 of 6";
- set @pull,rand (1,2);
- if (@pull == 1) set @pull,rand (1,2);
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-SIX:
- mes "6 of 6";
- mes "Say your prayers";
- set @pull,1;
- next;
- if (@pull == 1) goto DIE;
- if (@pull != 1) goto SAFE;
-
-ONEa:
- set @counter,2;
- mes "1 of 6";
- set @pull,rand (1,6);
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-TWOa:
- set @counter,3;
- mes "2 of 6";
- set @pull,rand (1,5);
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-THREEa:
- set @counter,4;
- mes "3 of 6";
- set @pull,rand (1,4);
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-FOURa:
- set @counter,5;
- mes "4 of 6";
- set @pull,rand (1,3);
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-FIVEa:
- set @counter,6;
- mes "5 of 6";
- set @pull,rand (1,2);
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-SIXa:
- mes "6 of 6";
- mes "Say your prayers";
- set @pull,1;
- next;
- if (@pull == 1) goto KILL;
- if (@pull != 1) goto SAFE;
-
-SAFE:
- emotion 32;
- mes "*^0000FFClick^000000* whew...";
- goto PLAY;
-
-DIE:
- specialeffect2 183;
- emotion 29;
- percentheal -100,-100;
- mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
- mes "You're dead!";
- close;
-
-KILL:
- specialeffect 183;
- emotion 23;
- mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
- mes "OWWW @#$%^!! THAT HURT LIKE HELL!!";
- next;
- goto PRIZE;
-
-RULES:
- mes "Ok here are the rules:";
- mes "I have with me a ^FF00006^000000 chamber pistol with ^FF00001^000000 round. First we play ^FF0000Scissors ^00FF00Paper ^0000FFRock^000000. The loser pulls the trigger. The winner is whoever comes out best.";
- mes "Beat me to win a prize.";
- menu "Let me play.",CONT,"No thanks.",LEAVE;
-
-CONT:
- mes "Ok here we go...";
- next;
- goto PLAY;
-
-PRIZE:
- mes "Congratulations! You have won...";
- set @prize,rand (1,10);
- if (@prize == 1) goto P1;
- if (@prize == 2) goto P2;
- if (@prize == 3) goto P3;
- if (@prize == 4) goto P4;
- if (@prize == 5) goto P5;
- if (@prize == 6) goto P6;
- if (@prize == 7) goto P7;
- if (@prize == 8) goto P8;
- if (@prize == 9) goto P9;
- if (@prize == 10) goto P10;
-
-P1:
- mes "10x Oridicon!";
- getitem 984,10;
- close;
-
-P2:
- mes "10x Elunium!";
- getitem 985,10;
- close;
-
-P3:
- mes "100x Fly Wings!";
- getitem 601,100;
- close;
-
-P4:
- mes "8x Old Blue Box!";
- getitem 603,8;
- close;
-
-P5:
- mes "4x Old Violet Box!";
- getitem 617,4;
- close;
-
-P6:
- mes "1x Old Card Album!";
- getitem 616,1;
- close;
-
-P7:
- mes "10x Dead Branch!";
- getitem 604,10;
- close;
-
-P8:
- mes "3x Gold!";
- getitem 969,3;
- close;
-
-P9:
- mes "10x Elunium!";
- getitem 985,10;
- close;
-
-P10:
- mes "20x Blue Potion!";
- getitem 505,20;
- close;
-
-LEAVE:
- mes "Pansy.";
- close;
-}
+//===== eAthena Script =======================================
+//= Rock Scissors Roulette Script
+//===== By: ==================================================
+//= acky (1.1)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Plays a hybrid Russian Roulette Rock Scissors Paper game.
+//===== Additional Comments: =================================
+//= Prizes customisable, Added emotions.
+//= 1.2 Fixes by Blackthunder and me [Poki#3]
+//============================================================
+
+cmd_in02.gat,182,126,2 script Crazy Boris 85,{
+ mes "Crazy Boris";
+ set @counter,1;
+ mes "Hey you! Up for Rock Scissors Roulette?";
+ next;
+ menu "Let me play.",PLAY,"Explain the rules.",RULES,"Leave",LEAVE;
+ SAME:
+ mes "Draw! Again!";
+ next;
+ goto PLAY;
+
+WIN:
+ mes "Damnit, You Win!";
+ emotion 19;
+ next;
+ goto OPPPULL;
+
+LOSE:
+ emotion 18;
+ mes "Boorah! You Lose!";
+ next;
+ goto YOUPULL;
+
+PLAY:
+ mes "Rock... Paper...";
+ set @opp,rand (1,3);
+ menu "^0000FFROCK!",ROCK,"^FF0000SCISSORS!",SCISSORS,"^00FF00PAPER!^000000",PAPER;
+
+ROCK:
+ if (@lastchoice == 1) set @opp,rand (1,3);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,1;
+ if (@opp == 1) goto SAME;
+ if (@opp == 2) goto WIN;
+ if (@opp == 3) goto LOSE;
+
+SCISSORS:
+ if (@lastchoice == 2) set @opp,rand (1,2);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,2;
+ if (@opp == 1) goto LOSE;
+ if (@opp == 2) goto SAME;
+ if (@opp == 3) goto WIN;
+
+PAPER:
+ if (@lastchoice == 3) set @opp,rand (2,3);
+ if (@opp == 1) emotion 11;
+ if (@opp == 2) emotion 10;
+ if (@opp == 3) emotion 12;
+ set @lastchoice,3;
+ if (@opp == 1) goto WIN;
+ if (@opp == 2) goto LOSE;
+ if (@opp == 3) goto SAME;
+
+YOUPULL:
+ if (@counter == 1) goto ONE;
+ if (@counter == 2) goto TWO;
+ if (@counter == 3) goto THREE;
+ if (@counter == 4) goto FOUR;
+ if (@counter == 5) goto FIVE;
+ if (@counter == 6) goto SIX;
+
+OPPPULL:
+ if (@counter == 1) goto ONEa;
+ if (@counter == 2) goto TWOa;
+ if (@counter == 3) goto THREEa;
+ if (@counter == 4) goto FOURa;
+ if (@counter == 5) goto FIVEa;
+ if (@counter == 6) goto SIXa;
+
+ONE:
+ set @counter,2;
+ mes "1 of 6";
+ set @pull,rand (1,6);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+TWO:
+ set @counter,3;
+ mes "2 of 6";
+ set @pull,rand (1,5);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+THREE:
+ set @counter,4;
+ mes "3 of 6";
+ set @pull,rand (1,4);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+FOUR:
+ set @counter,5;
+ mes "4 of 6";
+ set @pull,rand (1,3);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+FIVE:
+ set @counter,6;
+ mes "5 of 6";
+ set @pull,rand (1,2);
+ if (@pull == 1) set @pull,rand (1,2);
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+SIX:
+ mes "6 of 6";
+ mes "Say your prayers";
+ set @pull,1;
+ next;
+ if (@pull == 1) goto DIE;
+ if (@pull != 1) goto SAFE;
+
+ONEa:
+ set @counter,2;
+ mes "1 of 6";
+ set @pull,rand (1,6);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+TWOa:
+ set @counter,3;
+ mes "2 of 6";
+ set @pull,rand (1,5);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+THREEa:
+ set @counter,4;
+ mes "3 of 6";
+ set @pull,rand (1,4);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+FOURa:
+ set @counter,5;
+ mes "4 of 6";
+ set @pull,rand (1,3);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+FIVEa:
+ set @counter,6;
+ mes "5 of 6";
+ set @pull,rand (1,2);
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+SIXa:
+ mes "6 of 6";
+ mes "Say your prayers";
+ set @pull,1;
+ next;
+ if (@pull == 1) goto KILL;
+ if (@pull != 1) goto SAFE;
+
+SAFE:
+ emotion 32;
+ mes "*^0000FFClick^000000* whew...";
+ goto PLAY;
+
+DIE:
+ specialeffect2 183;
+ emotion 29;
+ percentheal -100,-100;
+ mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
+ mes "You're dead!";
+ close;
+
+KILL:
+ specialeffect 183;
+ emotion 23;
+ mes "*^0000FFClick^000000* *^FF0000BANG^000000*";
+ mes "OWWW @#$%^!! THAT HURT LIKE HELL!!";
+ next;
+ goto PRIZE;
+
+RULES:
+ mes "Ok here are the rules:";
+ mes "I have with me a ^FF00006^000000 chamber pistol with ^FF00001^000000 round. First we play ^FF0000Scissors ^00FF00Paper ^0000FFRock^000000. The loser pulls the trigger. The winner is whoever comes out best.";
+ mes "Beat me to win a prize.";
+ menu "Let me play.",CONT,"No thanks.",LEAVE;
+
+CONT:
+ mes "Ok here we go...";
+ next;
+ goto PLAY;
+
+PRIZE:
+ mes "Congratulations! You have won...";
+ set @prize,rand (1,10);
+ if (@prize == 1) goto P1;
+ if (@prize == 2) goto P2;
+ if (@prize == 3) goto P3;
+ if (@prize == 4) goto P4;
+ if (@prize == 5) goto P5;
+ if (@prize == 6) goto P6;
+ if (@prize == 7) goto P7;
+ if (@prize == 8) goto P8;
+ if (@prize == 9) goto P9;
+ if (@prize == 10) goto P10;
+
+P1:
+ mes "10x Oridicon!";
+ getitem 984,10;
+ close;
+
+P2:
+ mes "10x Elunium!";
+ getitem 985,10;
+ close;
+
+P3:
+ mes "100x Fly Wings!";
+ getitem 601,100;
+ close;
+
+P4:
+ mes "8x Old Blue Box!";
+ getitem 603,8;
+ close;
+
+P5:
+ mes "4x Old Violet Box!";
+ getitem 617,4;
+ close;
+
+P6:
+ mes "1x Old Card Album!";
+ getitem 616,1;
+ close;
+
+P7:
+ mes "10x Dead Branch!";
+ getitem 604,10;
+ close;
+
+P8:
+ mes "3x Gold!";
+ getitem 969,3;
+ close;
+
+P9:
+ mes "10x Elunium!";
+ getitem 985,10;
+ close;
+
+P10:
+ mes "20x Blue Potion!";
+ getitem 505,20;
+ close;
+
+LEAVE:
+ mes "Pansy.";
+ close;
+}
diff --git a/npc/custom/shifty_assassin.txt b/npc/custom/shifty_assassin.txt
index 9c225e10f..940a7808e 100644
--- a/npc/custom/shifty_assassin.txt
+++ b/npc/custom/shifty_assassin.txt
@@ -1,208 +1,208 @@
-//===== eAthena Script =======================================
-//= Shifty Assassin
-//===== By: ==================================================
-//= acky - god@acky.com
-//===== Current Version: =====================================
-//= 1.1.1
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= Players buy ninjas to assassinate other players
-//===== Additional Comments: =================================
-//= 1.1.1 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
-//============================================================
-
-morocc.gat,148,86,5 script Shifty Assassin 725,{
-set $ninja_price,250000;
-
-// STARTS THE MENU //
-M_Start:
-mes "[Shifty Assassin]";
-mes "What do you want?";
-next;
-if (getgmlevel(3) > 90) goto M_GM;
-menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Cancel",M_Exit;
-M_GM:
-menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Add Ninjas",M_Add,"Cancel",M_Exit;
-
-// GM MENU TO ADD NINJAS //
-M_Add:
-mes "[Shifty Assassin]";
-mes "How many ninjas do you want to make available?";
-next;
-set @add,0;
-input @add;
-set $ninja_avail,$ninja_avail+@add;
-mes @add + " ninjas added.";
-close;
-
-// BUY NINJAS //
-M_Buy:
-mes "[Shifty Assassin]";
-mes "How many ninjas do you want buy?";
-mes "There are ^0000FF" + $ninja_avail + "^000000 ninjas available.";
-mes "They cost ^0000FF" + $ninja_price + " zeny ^000000each.";
-
-set @buy,0;
-input @buy;
-next;
-if ($ninja_avail < 1) goto NoNinjas;
-if ($ninja_avail < @buy) goto NotEnoughNinjas;
-set @price,@buy*$ninja_price;
-if (zeny < @price ) goto NoZeny;
-
-mes "[Shifty Assassin]";
-mes "That will cost you ^0000FF" + @price + " zeny^000000.";
-next;
-menu "Continue",-,"Cancel",M_Exit;
-
-set zeny,zeny-@price;
-set #ninjas,#ninjas+@buy;
-set $ninja_avail,$ninja_avail-@buy;
-
-mes "[Shifty Assassin]";
-mes "Thank you.";
-close;
-
-// ASSASSINATE SOMEBODY //
-M_Kill:
-if ($AgitStarted != 0) goto M_Busy;
-mes "[Shifty Assassin]";
-mes "Enter the name of the target.";
-mes "^FF0000Type the name exactly, otherwise I won't be able to find the victim.^000000";
-next;
-menu "Continue",-,"Cancel",M_Exit;
-set @name$,"0";
-input @name$;
-next;
-mes "[Shifty Assassin]";
-mes "Active Ninjas: "+#ninjas;
-mes "Resting Ninjas: "+#ninjasr;
-mes "How many do you want to send?";
-set @number,0;
-input @number;
-if (@number < 1) goto NoNinjasSent;
-if (@number > #ninjas) goto NotEnoughNinjas1;
-if (@number > 10) goto TooManyNinjas;
-set @chance,rand (1,12);
-set #ninjas,#ninjas-@number;
-set #ninjas,#ninjas+#ninjasr;
-set #ninjasr,0;
-if (@number < @chance) goto M_Failure;
-
-// SUCCESSFUL ATTACK //
-mes "Sending ninjas now.";
-next;
-mes "[Shifty Assassin]";
-set @ninjasurvived,rand (1,@number);
-set #ninjasr,@number-@ninjasurvived;
-mes "Your attack succeeded but only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
-
-atcommand strcharinfo(0) + "@kill "+@name$;
-announce @name$+" has been assassinated by " + strcharinfo(0) +"'s Ninjas.",8;
-close;
-
-// FAILED ATTACK //
-M_Failure:
-mes "Sending ninjas now.";
-next;
-mes "[Shifty Assassin]";
-set @ninjasurvived,rand (1,@number);
-set #ninjasr,@number-@ninjasurvived;
-mes "Your attack failed and only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
-
-announce @name$+" has survived " + strcharinfo(0) +"'s Ninja attack.",8;
-close;
-
-// NINJAS BUSY FOR WOE //
-M_Busy:
-mes "[Shifty Assassin]";
-mes "Sorry, all my ninjas are busy doing War of Emperium.";
-close;
-
-// CHECK YOUR NINJAS //
-M_Check:
-mes "[Shifty Assassin]";
-mes "You have:";
-mes "^FF0000" + #ninjas + "^000000 Active Ninjas.";
-mes "^0000FF" + #ninjasr + "^000000 Resting Ninjas.";
-next;
-goto M_Start;
-
-
-// LIMIT //
-NoNinjasSent:
-mes "[Shifty Assassin]";
-mes "You can't kill anyone without ninjas.";
-next;
-goto M_Start;
-
-TooManyNinjas:
-mes "[Shifty Assassin]";
-mes "You can only send 10 ninjas max.";
-next;
-goto M_Start;
-
-NoZeny:
-mes "[Shifty Assassin]";
-mes "You do not have enough zeny.";
-close;
-
-NotEnoughNinjas:
-mes "[Shifty Assassin]";
-mes "There aren't that many ninjas to buy.";
-next;
-goto M_Start;
-
-NoNinjas:
-mes "[Shifty Assassin]";
-mes "There are no ninjas left to buy.";
-close;
-
-NotEnoughNinjas1:
-mes "[Shifty Assassin]";
-mes "You do not have that many ninjas.";
-next;
-goto M_Start;
-
-M_Exit:
-mes "[Shifty Assassin]";
-mes "Goodbye.";
-close;
-
-// TIMER DELAY NINJA ADDER //
-
-OnClock0600:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-OnClock1200:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-OnClock1500:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-
-OnClock1800:
-set $ninja_avail,$ninja_avail+3;
-end;
-
-OnClock1900:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-OnClock2000:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-
-OnClock0000:
-set $ninja_avail,$ninja_avail+2;
-end;
-
-OnInit:
-set $ninja_avail,$ninja_avail+1;
-end;
+//===== eAthena Script =======================================
+//= Shifty Assassin
+//===== By: ==================================================
+//= acky - god@acky.com
+//===== Current Version: =====================================
+//= 1.1.1
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= Players buy ninjas to assassinate other players
+//===== Additional Comments: =================================
+//= 1.1.1 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious]
+//============================================================
+
+morocc.gat,148,86,5 script Shifty Assassin 725,{
+set $ninja_price,250000;
+
+// STARTS THE MENU //
+M_Start:
+mes "[Shifty Assassin]";
+mes "What do you want?";
+next;
+if (getgmlevel(3) > 90) goto M_GM;
+menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Cancel",M_Exit;
+M_GM:
+menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Add Ninjas",M_Add,"Cancel",M_Exit;
+
+// GM MENU TO ADD NINJAS //
+M_Add:
+mes "[Shifty Assassin]";
+mes "How many ninjas do you want to make available?";
+next;
+set @add,0;
+input @add;
+set $ninja_avail,$ninja_avail+@add;
+mes @add + " ninjas added.";
+close;
+
+// BUY NINJAS //
+M_Buy:
+mes "[Shifty Assassin]";
+mes "How many ninjas do you want buy?";
+mes "There are ^0000FF" + $ninja_avail + "^000000 ninjas available.";
+mes "They cost ^0000FF" + $ninja_price + " zeny ^000000each.";
+
+set @buy,0;
+input @buy;
+next;
+if ($ninja_avail < 1) goto NoNinjas;
+if ($ninja_avail < @buy) goto NotEnoughNinjas;
+set @price,@buy*$ninja_price;
+if (zeny < @price ) goto NoZeny;
+
+mes "[Shifty Assassin]";
+mes "That will cost you ^0000FF" + @price + " zeny^000000.";
+next;
+menu "Continue",-,"Cancel",M_Exit;
+
+set zeny,zeny-@price;
+set #ninjas,#ninjas+@buy;
+set $ninja_avail,$ninja_avail-@buy;
+
+mes "[Shifty Assassin]";
+mes "Thank you.";
+close;
+
+// ASSASSINATE SOMEBODY //
+M_Kill:
+if ($AgitStarted != 0) goto M_Busy;
+mes "[Shifty Assassin]";
+mes "Enter the name of the target.";
+mes "^FF0000Type the name exactly, otherwise I won't be able to find the victim.^000000";
+next;
+menu "Continue",-,"Cancel",M_Exit;
+set @name$,"0";
+input @name$;
+next;
+mes "[Shifty Assassin]";
+mes "Active Ninjas: "+#ninjas;
+mes "Resting Ninjas: "+#ninjasr;
+mes "How many do you want to send?";
+set @number,0;
+input @number;
+if (@number < 1) goto NoNinjasSent;
+if (@number > #ninjas) goto NotEnoughNinjas1;
+if (@number > 10) goto TooManyNinjas;
+set @chance,rand (1,12);
+set #ninjas,#ninjas-@number;
+set #ninjas,#ninjas+#ninjasr;
+set #ninjasr,0;
+if (@number < @chance) goto M_Failure;
+
+// SUCCESSFUL ATTACK //
+mes "Sending ninjas now.";
+next;
+mes "[Shifty Assassin]";
+set @ninjasurvived,rand (1,@number);
+set #ninjasr,@number-@ninjasurvived;
+mes "Your attack succeeded but only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
+
+atcommand strcharinfo(0) + "@kill "+@name$;
+announce @name$+" has been assassinated by " + strcharinfo(0) +"'s Ninjas.",8;
+close;
+
+// FAILED ATTACK //
+M_Failure:
+mes "Sending ninjas now.";
+next;
+mes "[Shifty Assassin]";
+set @ninjasurvived,rand (1,@number);
+set #ninjasr,@number-@ninjasurvived;
+mes "Your attack failed and only ^FF0000" + #ninjasr + "^000000 Ninjas survived.";
+
+announce @name$+" has survived " + strcharinfo(0) +"'s Ninja attack.",8;
+close;
+
+// NINJAS BUSY FOR WOE //
+M_Busy:
+mes "[Shifty Assassin]";
+mes "Sorry, all my ninjas are busy doing War of Emperium.";
+close;
+
+// CHECK YOUR NINJAS //
+M_Check:
+mes "[Shifty Assassin]";
+mes "You have:";
+mes "^FF0000" + #ninjas + "^000000 Active Ninjas.";
+mes "^0000FF" + #ninjasr + "^000000 Resting Ninjas.";
+next;
+goto M_Start;
+
+
+// LIMIT //
+NoNinjasSent:
+mes "[Shifty Assassin]";
+mes "You can't kill anyone without ninjas.";
+next;
+goto M_Start;
+
+TooManyNinjas:
+mes "[Shifty Assassin]";
+mes "You can only send 10 ninjas max.";
+next;
+goto M_Start;
+
+NoZeny:
+mes "[Shifty Assassin]";
+mes "You do not have enough zeny.";
+close;
+
+NotEnoughNinjas:
+mes "[Shifty Assassin]";
+mes "There aren't that many ninjas to buy.";
+next;
+goto M_Start;
+
+NoNinjas:
+mes "[Shifty Assassin]";
+mes "There are no ninjas left to buy.";
+close;
+
+NotEnoughNinjas1:
+mes "[Shifty Assassin]";
+mes "You do not have that many ninjas.";
+next;
+goto M_Start;
+
+M_Exit:
+mes "[Shifty Assassin]";
+mes "Goodbye.";
+close;
+
+// TIMER DELAY NINJA ADDER //
+
+OnClock0600:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+OnClock1200:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+OnClock1500:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+
+OnClock1800:
+set $ninja_avail,$ninja_avail+3;
+end;
+
+OnClock1900:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+OnClock2000:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+
+OnClock0000:
+set $ninja_avail,$ninja_avail+2;
+end;
+
+OnInit:
+set $ninja_avail,$ninja_avail+1;
+end;
} \ No newline at end of file
diff --git a/npc/custom/sign_your_items.txt b/npc/custom/sign_your_items.txt
index af7e759e3..d805caac5 100644
--- a/npc/custom/sign_your_items.txt
+++ b/npc/custom/sign_your_items.txt
@@ -1,215 +1,215 @@
-//===== eAthena Script =======================================
-//= * Sign Your Items *
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1
-//===== Description: =========================================
-//= Write you name on your rare equipment or weapon ^_-
-//= Original X-Mas mini-quest(could be used as a permanent one)
-//===== Additional Comments: =================================
-//= 1.0 First release
-//============================================================
-
-prt_in.gat,24,61,7 script Perchik 47,{
- mes "[Perchik]";
- if(BaseJob==Job_Novice || BaseLevel<50) {
- mes "Sorry, I don't help newbies. Go kill more Porings.";
- emotion e_sry;
- close;
- }
- mes "Hi, I can ^000090sign your name^000000 on almost any rare item you can hold.";
- next;
- menu "Tell me more...",-, "Sign my items, please",M_DO;
-
- mes "[Perchik]";
- mes "I can put your name on any slotless equipment or weapon.";
- emotion e_ic;
- next;
- mes "[Perchik]";
- mes "A week ago, my BOSS told me to send away newbies. I dunno why.";
- next;
- mes "[Perchik]";
- mes "For my work I accept ^0000803 Gift Box^000000es (gray one)";
- mes "plus ^FF00005000z^000000 per each refine of your item.";
- next;
- emotion e_cry;
- mes "[Perchik]";
- mes "Alas, I have 12 hungry children";
- mes "and a very angry wife.";
- next;
- mes "[Perchik]";
- mes "Or it was... 12 angry children";
- mes "and a very hungry wife...";
- emotion e_hmm;
- close;
-
-M_DO:
- mes "[Perchik]";
- mes "Show me your items to sign...";
-M_MENU:
- next;
- menu getequipname(1),M_PART1,getequipname(9),M_PART9,getequipname(10),M_PART10,getequipname(2),M_PART2,getequipname(4),M_PART4,
- getequipname(3),M_PART3,getequipname(5),M_PART5,getequipname(6),M_PART6,getequipname(7),M_PART7,getequipname(8),M_PART8;
-
- //Head Gear
- M_PART1:
- set @part,1;
- if (getequipisequiped(1)) goto L_CHECK1;
- mes "[Perchik]";
- mes "A bald head under a cheap wig... There's nothing worthy to sign.";
- emotion 6;
- goto M_MENU;
- M_PART9:
- set @part,9;
- if (getequipisequiped(9)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Glasses... I can't see any glasses...";
- emotion 20;
- goto M_MENU;
- M_PART10:
- set @part,10;
- if (getequipisequiped(10)) goto L_CHECK1;
- mes "[Perchik]";
- mes "I don't see any mask here.";
- emotion 20;
- goto M_MENU;
- //Armor
- M_PART2:
- set @part,2;
- if (getequipisequiped(2)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Your belly...? Yes, it's rather fat.";
- emotion 6;
- goto M_MENU;
- //Left Hand
- M_PART3:
- set @part,3;
- if (getequipisequiped(3)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Sign your left hand? I'm not a celebrity, you know...";
- emotion 4;
- goto M_MENU;
- //Right Hand
- M_PART4:
- set @part,4;
- if (getequipisequiped(4)) goto L_CHECK1;
- mes "[Perchik]";
- mes "It isn't an armor... It's a mud!!! Wash your hands more often.";
- emotion 4;
- goto M_MENU;
- //Garment
- M_PART5:
- set @part,5;
- if (getequipisequiped(5)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Look... It's empty...";
- goto M_MENU;
- //Foot Gear
- M_PART6:
- set @part,6;
- if (getequipisequiped(6)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Aw!! I don't like stinky feet.";
- emotion 16;
- goto M_MENU;
- //Accessory1
- M_PART7:
- set @part,7;
- if (getequipisequiped(7)) goto L_CHECK1;
- mes "[Perchik]";
- mes "Yep... a pocket with a huge hole...";
- emotion 20;
- goto M_MENU;
- //Accessory2
- M_PART8:
- set @part,8;
- if (getequipisequiped(8)) goto L_CHECK1;
- mes "[Perchik]";
- mes "I see your fat belly...";
- emotion 20;
- goto M_MENU;
-
-L_CHECK1:
- set @ref,0;
- set @id,getequipid(@part);
- if(getequipisidentify(@part)) goto L_CHECK2;
- mes "[Perchik]";
- mes "How could you equip such unknown item?";
- npctalk "What a sneaky cheater!";
- emotion e_wah;
- close;
-
-L_CHECK2:
- set @ref,getequiprefinerycnt(@part);
- mes "[Perchik]";
- mes "You want me to sign your "+getitemname(@id)+"...";
- if(BaseJob==Job_Novice) {
- mes "But you're a Novice. My BOSS told me to send such weaklings away.";
- emotion e_sry;
- goto M_MENU;
- }
- set @slot0,getequipcardid(@part,0);
- set @slot1,getequipcardid(@part,1);
- set @slot2,getequipcardid(@part,2);
- set @slot3,getequipcardid(@part,3);
-
- if(@slot0==255 || @slot0==254 || @slot0<0) {
- mes "Alas, this item's already signed.";
- mes "I would never touch masters work.";
- emotion e_hmm;
- goto M_MENU;
- }
- if(@slot0>4000 && @slot0<5000) {
- mes "A card? Here?!";
- mes "As I said before, I don't sign items with cards.";
- emotion e_hmm;
- goto M_MENU;
- }
- if(getiteminfo(@id,10)) {
- mes "Sorry. I don't sign slotted items.";
- emotion e_sry;
- goto M_MENU;
- }
-
- if(@ref)mes "It has been refined "+@ref+" times... Adding ^FF00005000z^000000 per time.";
- mes "Give me ^0000803 gray Gift Boxes^000000";
- if(@ref)mes "and ^FF0000"+(5000*@ref)+"z^000000.";
- next;
- menu "Ok!",-, "Leave",M_END;
- if(Zeny>=(5000*@ref) && countitem(644)>=3) {
- delitem 644,3;
- set Zeny,Zeny-(5000*@ref);
- goto L_MAKE;
- }
- mes "[Perchik]";
- mes "I don't work for 'thanks'.";
- emotion e_sry;
- close;
-
-L_MAKE:
- if(countitem2(@id,1,@ref,0,@slot0,@slot1,@slot2,@slot3)==0) {
- mes "[Perchik]";
- mes "Where is... "+getitemname(@id)+"?";
- npctalk "You're a snoozy cheater!";
- logmes "CHEATER: Tried to sign an item not having it: "+getitemname(@id);
- emotion e_wah;
- close;
- }
- delitem2 @id,1,1,@ref,0,@slot0,@slot1,@slot2,@slot3;
-
- mes "[Perchik]";
- mes "Done!";
- emotion e_proud;
-
- getitem2 @id,1,1,@ref,0,254,0,getcharid(0)&0xffff,(getcharid(0)>>16)&0xffff;
- close;
-
-M_END:
- mes "[Perchik]";
- mes "See you...";
- emotion e_yawn;
- close;
-}
+//===== eAthena Script =======================================
+//= * Sign Your Items *
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1
+//===== Description: =========================================
+//= Write you name on your rare equipment or weapon ^_-
+//= Original X-Mas mini-quest(could be used as a permanent one)
+//===== Additional Comments: =================================
+//= 1.0 First release
+//============================================================
+
+prt_in.gat,24,61,7 script Perchik 47,{
+ mes "[Perchik]";
+ if(BaseJob==Job_Novice || BaseLevel<50) {
+ mes "Sorry, I don't help newbies. Go kill more Porings.";
+ emotion e_sry;
+ close;
+ }
+ mes "Hi, I can ^000090sign your name^000000 on almost any rare item you can hold.";
+ next;
+ menu "Tell me more...",-, "Sign my items, please",M_DO;
+
+ mes "[Perchik]";
+ mes "I can put your name on any slotless equipment or weapon.";
+ emotion e_ic;
+ next;
+ mes "[Perchik]";
+ mes "A week ago, my BOSS told me to send away newbies. I dunno why.";
+ next;
+ mes "[Perchik]";
+ mes "For my work I accept ^0000803 Gift Box^000000es (gray one)";
+ mes "plus ^FF00005000z^000000 per each refine of your item.";
+ next;
+ emotion e_cry;
+ mes "[Perchik]";
+ mes "Alas, I have 12 hungry children";
+ mes "and a very angry wife.";
+ next;
+ mes "[Perchik]";
+ mes "Or it was... 12 angry children";
+ mes "and a very hungry wife...";
+ emotion e_hmm;
+ close;
+
+M_DO:
+ mes "[Perchik]";
+ mes "Show me your items to sign...";
+M_MENU:
+ next;
+ menu getequipname(1),M_PART1,getequipname(9),M_PART9,getequipname(10),M_PART10,getequipname(2),M_PART2,getequipname(4),M_PART4,
+ getequipname(3),M_PART3,getequipname(5),M_PART5,getequipname(6),M_PART6,getequipname(7),M_PART7,getequipname(8),M_PART8;
+
+ //Head Gear
+ M_PART1:
+ set @part,1;
+ if (getequipisequiped(1)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "A bald head under a cheap wig... There's nothing worthy to sign.";
+ emotion 6;
+ goto M_MENU;
+ M_PART9:
+ set @part,9;
+ if (getequipisequiped(9)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Glasses... I can't see any glasses...";
+ emotion 20;
+ goto M_MENU;
+ M_PART10:
+ set @part,10;
+ if (getequipisequiped(10)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "I don't see any mask here.";
+ emotion 20;
+ goto M_MENU;
+ //Armor
+ M_PART2:
+ set @part,2;
+ if (getequipisequiped(2)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Your belly...? Yes, it's rather fat.";
+ emotion 6;
+ goto M_MENU;
+ //Left Hand
+ M_PART3:
+ set @part,3;
+ if (getequipisequiped(3)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Sign your left hand? I'm not a celebrity, you know...";
+ emotion 4;
+ goto M_MENU;
+ //Right Hand
+ M_PART4:
+ set @part,4;
+ if (getequipisequiped(4)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "It isn't an armor... It's a mud!!! Wash your hands more often.";
+ emotion 4;
+ goto M_MENU;
+ //Garment
+ M_PART5:
+ set @part,5;
+ if (getequipisequiped(5)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Look... It's empty...";
+ goto M_MENU;
+ //Foot Gear
+ M_PART6:
+ set @part,6;
+ if (getequipisequiped(6)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Aw!! I don't like stinky feet.";
+ emotion 16;
+ goto M_MENU;
+ //Accessory1
+ M_PART7:
+ set @part,7;
+ if (getequipisequiped(7)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "Yep... a pocket with a huge hole...";
+ emotion 20;
+ goto M_MENU;
+ //Accessory2
+ M_PART8:
+ set @part,8;
+ if (getequipisequiped(8)) goto L_CHECK1;
+ mes "[Perchik]";
+ mes "I see your fat belly...";
+ emotion 20;
+ goto M_MENU;
+
+L_CHECK1:
+ set @ref,0;
+ set @id,getequipid(@part);
+ if(getequipisidentify(@part)) goto L_CHECK2;
+ mes "[Perchik]";
+ mes "How could you equip such unknown item?";
+ npctalk "What a sneaky cheater!";
+ emotion e_wah;
+ close;
+
+L_CHECK2:
+ set @ref,getequiprefinerycnt(@part);
+ mes "[Perchik]";
+ mes "You want me to sign your "+getitemname(@id)+"...";
+ if(BaseJob==Job_Novice) {
+ mes "But you're a Novice. My BOSS told me to send such weaklings away.";
+ emotion e_sry;
+ goto M_MENU;
+ }
+ set @slot0,getequipcardid(@part,0);
+ set @slot1,getequipcardid(@part,1);
+ set @slot2,getequipcardid(@part,2);
+ set @slot3,getequipcardid(@part,3);
+
+ if(@slot0==255 || @slot0==254 || @slot0<0) {
+ mes "Alas, this item's already signed.";
+ mes "I would never touch masters work.";
+ emotion e_hmm;
+ goto M_MENU;
+ }
+ if(@slot0>4000 && @slot0<5000) {
+ mes "A card? Here?!";
+ mes "As I said before, I don't sign items with cards.";
+ emotion e_hmm;
+ goto M_MENU;
+ }
+ if(getiteminfo(@id,10)) {
+ mes "Sorry. I don't sign slotted items.";
+ emotion e_sry;
+ goto M_MENU;
+ }
+
+ if(@ref)mes "It has been refined "+@ref+" times... Adding ^FF00005000z^000000 per time.";
+ mes "Give me ^0000803 gray Gift Boxes^000000";
+ if(@ref)mes "and ^FF0000"+(5000*@ref)+"z^000000.";
+ next;
+ menu "Ok!",-, "Leave",M_END;
+ if(Zeny>=(5000*@ref) && countitem(644)>=3) {
+ delitem 644,3;
+ set Zeny,Zeny-(5000*@ref);
+ goto L_MAKE;
+ }
+ mes "[Perchik]";
+ mes "I don't work for 'thanks'.";
+ emotion e_sry;
+ close;
+
+L_MAKE:
+ if(countitem2(@id,1,@ref,0,@slot0,@slot1,@slot2,@slot3)==0) {
+ mes "[Perchik]";
+ mes "Where is... "+getitemname(@id)+"?";
+ npctalk "You're a snoozy cheater!";
+ logmes "CHEATER: Tried to sign an item not having it: "+getitemname(@id);
+ emotion e_wah;
+ close;
+ }
+ delitem2 @id,1,1,@ref,0,@slot0,@slot1,@slot2,@slot3;
+
+ mes "[Perchik]";
+ mes "Done!";
+ emotion e_proud;
+
+ getitem2 @id,1,1,@ref,0,254,0,getcharid(0)&0xffff,(getcharid(0)>>16)&0xffff;
+ close;
+
+M_END:
+ mes "[Perchik]";
+ mes "See you...";
+ emotion e_yawn;
+ close;
+}
diff --git a/npc/custom/stock_market.txt b/npc/custom/stock_market.txt
index a4a4f7919..7da3c5244 100644
--- a/npc/custom/stock_market.txt
+++ b/npc/custom/stock_market.txt
@@ -1,793 +1,793 @@
-//===== eAthena Script =======================================
-//= Stock Market Game
-//===== By: ==================================================
-//= acky (acky@bigpond.net.au)
-//===== Current Version: =====================================
-//= 1.3.1
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= NPC for a stock market game.
-//===== Additional Comments: =================================
-//= GM Must activate the NPC before use.
-//= Fixed MAJOR exploit. - players could buy for free
-//= Low prices likely to rise, High prices likely to drop
-//= Small fix by Galeon
-//= Lupus: This script lets players make 40,000,000z a day
-//= so use it on your own risk
-//============================================================
-
-prontera.gat,140,181,5 script sharenames -1,{
-end;
-OnInit:
-// Sets the names of the shares //
-set $S1N$,"JIN";
-set $S2N$,"VNG";
-set $S3N$,"SHA";
-set $S4N$,"RGC";
-set $S5N$,"PSC";
-set $S6N$,"GNG";
-set $S7N$,"XRO";
-set $S8N$,"GRM";
-set $S9N$,"DOP";
-set $S10N$,"POR";
-
-// Transaction fee //
-set $S_Trans,1500;
-
-// Min & Max buyable //
-set $S_BuyMin,1;
-set $S_BuyMax,1000000;
-end;
-
-// Average Price (Your start prices) //
-set $S_Avg,100;
-
-// Set times of fluctuation //
-OnClock1100:
-set $S_LastUpd$,"12:00";
-goto S_Fluc;
-end;
-
-OnClock0000:
-set $S_LastUpd$,"00:00";
-goto S_Fluc;
-end;
-
-OnClock0600:
-set $S_LastUpd$,"06:00";
-goto S_Fluc;
-end;
-
-OnClock1800:
-set $S_LastUpd$,"18:00";
-goto S_Fluc;
-end;
-
-OnClock2100:
-set $S_LastUpd$,"21:00";
-goto S_Fluc;
-end;
-
-OnClock0900:
-set $S_LastUpd$,"09:00";
-goto S_Fluc;
-end;
-
-OnClock1500:
-set $S_LastUpd$,"15:00";
-goto S_Fluc;
-end;
-
-S_Fluc:
-set $fluc,rand (-6,6);
-set $S1B,$S1;
-set $S1,$S1+$fluc;
-if ($S1 < 25) set $S1,$S1+3;
-if ($S1 < 50) set $S1,$S1+2;
-if ($S1 > 150) set $S1,$S1-2;
-if ($S1 > 175) set $S1,$S1-3;
-if ($S1 < 1) set $S1,1;
-
-set $fluc,rand (-6,6);
-set $S2B,$S2;
-set $S2,$S2+$fluc;
-if ($S2 < 25) set $S2,$S2+3;
-if ($S2 < 50) set $S2,$S2+2;
-if ($S2 > 150) set $S2,$S2-2;
-if ($S2 > 175) set $S2,$S2-3;
-if ($S2 < 1) set $S2,1;
-
-set $fluc,rand (-6,6);
-set $S3B,$S3;
-set $S3,$S3+$fluc;
-if ($S3 < 25) set $S3,$S3+3;
-if ($S3 < 50) set $S3,$S3+2;
-if ($S3 > 150) set $S3,$S3-2;
-if ($S3 > 175) set $S3,$S3-3;
-if ($S3 < 1) set $S3,1;
-
-set $fluc,rand (-6,6);
-set $S4B,$S4;
-set $S4,$S4+$fluc;
-if ($S4 < 25) set $S4,$S4+3;
-if ($S4 < 50) set $S4,$S4+2;
-if ($S4 > 150) set $S4,$S4-2;
-if ($S4 > 175) set $S4,$S4-3;
-if ($S4 < 1) set $S4,1;
-
-set $fluc,rand (-6,6);
-set $S5B,$S5;
-set $S5,$S5+$fluc;
-if ($S5 < 25) set $S5,$S5+3;
-if ($S5 < 50) set $S5,$S5+2;
-if ($S5 > 150) set $S5,$S5-2;
-if ($S5 > 175) set $S5,$S5-3;
-if ($S5 < 1) set $S5,1;
-
-set $fluc,rand (-6,6);
-set $S6B,$S6;
-set $S6,$S6+$fluc;
-if ($S6 < 25) set $S6,$S6+3;
-if ($S6 < 50) set $S6,$S6+2;
-if ($S6 > 150) set $S6,$S6-2;
-if ($S6 > 175) set $S6,$S6-3;
-if ($S6 < 1) set $S6,1;
-
-set $fluc,rand (-6,6);
-set $S7B,$S7;
-set $S7,$S7+$fluc;
-if ($S7 < 25) set $S7,$S7+3;
-if ($S7 < 50) set $S7,$S7+2;
-if ($S7 > 150) set $S7,$S7-2;
-if ($S7 > 175) set $S7,$S7-3;
-if ($S7 < 1) set $S7,1;
-
-set $fluc,rand (-6,6);
-set $S8B,$S8;
-set $S8,$S8+$fluc;
-if ($S8 < 25) set $S8,$S8+3;
-if ($S8 < 50) set $S8,$S8+2;
-if ($S8 > 150) set $S8,$S8-2;
-if ($S8 > 175) set $S8,$S8-3;
-if ($S8 < 1) set $S8,1;
-
-set $fluc,rand (-6,6);
-set $S9B,$S9;
-set $S9,$S9+$fluc;
-if ($S9 < 25) set $S9,$S9+3;
-if ($S9 < 50) set $S9,$S9+2;
-if ($S9 > 150) set $S9,$S9-2;
-if ($S9 > 175) set $S9,$S9-3;
-if ($S9 < 1) set $S9,1;
-
-set $fluc,rand (-6,6);
-set $S10B,$S10;
-set $S10,$S10+$fluc;
-if ($S10 < 25) set $S10,$S10+3;
-if ($S10 < 50) set $S10,$S10+2;
-if ($S10 > 150) set $S10,$S10-2;
-if ($S10 > 175) set $S10,$S10-3;
-if ($S10 < 1) set $S10,1;
-end;
-}
-
-- script Stock Market::stockmarket 109,{
-// Ensures no trading when default prices have not been set //
-set @stotal,$S1+$S2+$S3+$S4+$S5+$S6+$S7+$S8+$S9+$S10;
-if (@stotal > 0) goto S_Start;
-mes "[Stock Market]";
-mes "Trading is currently closed.";
-if (getgmlevel(3) > 90) goto GM_Open;
-close;
-
-// Begining of interface //
-S_Start:
-mes "[Stock Market]";
-mes "Last fluctuation: " + $S_LastUpd$;
-
-// Loss/Gain in price //
-set @S1Update,$S1-$S1B;
-set @S2Update,$S2-$S2B;
-set @S3Update,$S3-$S3B;
-set @S4Update,$S4-$S4B;
-set @S5Update,$S5-$S5B;
-set @S6Update,$S6-$S6B;
-set @S7Update,$S7-$S7B;
-set @S8Update,$S8-$S8B;
-set @S9Update,$S9-$S9B;
-set @S10Update,$S10-$S10B;
-
-// Makes Loss/Gain Red/Green //
-if (@S1Update < 0) set @S1Update$,"^FF0000"+@S1Update+"^000000";
-if (@S1Update > 0) set @S1Update$,"^00FF00+"+@S1Update+"^000000";
-if (@S1Update == 0) set @S1Update$,@S1Update;
-
-if (@S2Update < 0) set @S2Update$,"^FF0000"+@S2Update+"^000000";
-if (@S2Update > 0) set @S2Update$,"^00FF00+"+@S2Update+"^000000";
-if (@S2Update == 0) set @S2Update$,@S2Update;
-
-if (@S3Update < 0) set @S3Update$,"^FF0000"+@S3Update+"^000000";
-if (@S3Update > 0) set @S3Update$,"^00FF00+"+@S3Update+"^000000";
-if (@S3Update == 0) set @S3Update$,@S3Update;
-
-if (@S4Update < 0) set @S4Update$,"^FF0000"+@S4Update+"^000000";
-if (@S4Update > 0) set @S4Update$,"^00FF00+"+@S4Update+"^000000";
-if (@S4Update == 0) set @S4Update$,@S4Update;
-
-if (@S5Update < 0) set @S5Update$,"^FF0000"+@S5Update+"^000000";
-if (@S5Update > 0) set @S5Update$,"^00FF00+"+@S5Update+"^000000";
-if (@S5Update == 0) set @S5Update$,@S5Update;
-
-if (@S6Update < 0) set @S6Update$,"^FF0000"+@S6Update+"^000000";
-if (@S6Update > 0) set @S6Update$,"^00FF00+"+@S6Update+"^000000";
-if (@S6Update == 0) set @S6Update$,@S6Update;
-
-if (@S7Update < 0) set @S7Update$,"^FF0000"+@S7Update+"^000000";
-if (@S7Update > 0) set @S7Update$,"^00FF00+"+@S7Update+"^000000";
-if (@S7Update == 0) set @S7Update$,@S7Update;
-
-if (@S8Update < 0) set @S8Update$,"^FF0000"+@S8Update+"^000000";
-if (@S8Update > 0) set @S8Update$,"^00FF00+"+@S8Update+"^000000";
-if (@S8Update == 0) set @S8Update$,@S8Update;
-
-if (@S9Update < 0) set @S9Update$,"^FF0000"+@S9Update+"^000000";
-if (@S9Update > 0) set @S9Update$,"^00FF00+"+@S9Update+"^000000";
-if (@S9Update == 0) set @S9Update$,@S9Update;
-
-if (@S10Update < 0) set @S10Update$,"^FF0000"+@S10Update+"^000000";
-if (@S10Update > 0) set @S10Update$,"^00FF00+"+@S10Update+"^000000";
-if (@S10Update == 0) set @S10Update$,@S10Update;
-
-// Displays shares & prices //
-mes "^21698F"+$S1N$+"^000000" + " " + $S1 + "z (" + @S1Update$ + ")";
-mes "^21698F"+$S2N$+"^000000" + " " + $S2 + "z (" + @S2Update$ + ")";
-mes "^21698F"+$S3N$+"^000000" + " " + $S3 + "z (" + @S3Update$ + ")";
-mes "^21698F"+$S4N$+"^000000" + " " + $S4 + "z (" + @S4Update$ + ")";
-mes "^21698F"+$S5N$+"^000000" + " " + $S5 + "z (" + @S5Update$ + ")";
-mes "^21698F"+$S6N$+"^000000" + " " + $S6 + "z (" + @S6Update$ + ")";
-mes "^21698F"+$S7N$+"^000000" + " " + $S7 + "z (" + @S7Update$ + ")";
-mes "^21698F"+$S8N$+"^000000" + " " + $S8 + "z (" + @S8Update$ + ")";
-mes "^21698F"+$S9N$+"^000000" + " " + $S9 + "z (" + @S9Update$ + ")";
-mes "^21698F"+$S10N$+"^000000" + " " + $S10 + "z (" + @S10Update$ + ")";
-next;
-
-// GM Menu link //
-if (getgmlevel(3) > 90) goto GM_subMenu;
-menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"Cancel",S_Quit;
-
-GM_subMenu:
-menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"GM Menu",GM_Menu,"Cancel",S_Quit;
-
-// Selling Shares //
-S_Sell:
- mes "[Stock Market]";
- mes "Enter the name of the share you wish to sell.";
- mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
- if (#S1 > 0) mes "^0000FF"+$S1N$+"^FF0000" + " x " + #S1 + " [" + $S1 + "z]";
- if (#S2 > 0) mes "^0000FF"+$S2N$+"^FF0000" + " x " + #S2 + " [" + $S2 + "z]";
- if (#S3 > 0) mes "^0000FF"+$S3N$+"^FF0000" + " x " + #S3 + " [" + $S3 + "z]";
- if (#S4 > 0) mes "^0000FF"+$S4N$+"^FF0000" + " x " + #S4 + " [" + $S4 + "z]";
- if (#S5 > 0) mes "^0000FF"+$S5N$+"^FF0000" + " x " + #S5 + " [" + $S5 + "z]";
- if (#S6 > 0) mes "^0000FF"+$S6N$+"^FF0000" + " x " + #S6 + " [" + $S6 + "z]";
- if (#S7 > 0) mes "^0000FF"+$S7N$+"^FF0000" + " x " + #S7 + " [" + $S7 + "z]";
- if (#S8 > 0) mes "^0000FF"+$S8N$+"^FF0000" + " x " + #S8 + " [" + $S8 + "z]";
- if (#S9 > 0) mes "^0000FF"+$S9N$+"^FF0000" + " x " + #S9 + " [" + $S9 + "z]";
- if (#S10 > 0) mes "^0000FF"+$S10N$+"^FF0000" + " x " + #S10 + " [" + $S10 + "z]";
- set @sellname$,"0";
- input @sellname$;
- set @sellamount,0;
- input @sellamount;
- if (@sellamount < 1) goto S_SellInv;
- if (zeny < $S_Trans) goto S_NoZeny;
- set zeny,zeny-$S_Trans;
-
- SELLS1:
- if (@sellname$ != $S1N$) goto SELLS2;
- if (@sellamount > #S1) goto S_SellTooHigh;
- set @price,@sellamount*$S1;
- set #S1,#S1-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S1N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS2:
- if (@sellname$ != $S2N$) goto SELLS3;
- if (@sellamount > #S2) goto S_SellTooHigh;
- set @price,@sellamount*$S2;
- set #S2,#S2-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S2N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS3:
- if (@sellname$ != $S3N$) goto SELLS4;
- if (@sellamount > #S3) goto S_SellTooHigh;
- set @price,@sellamount*$S3;
- set #S3,#S3-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S3N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS4:
- if (@sellname$ != $S4N$) goto SELLS5;
- if (@sellamount > #S4) goto S_SellTooHigh;
- set @price,@sellamount*$S4;
- set #S4,#S4-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S4N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS5:
- if (@sellname$ != $S5N$) goto SELLS6;
- if (@sellamount > #S5) goto S_SellTooHigh;
- set @price,@sellamount*$S5;
- set #S5,#S5-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S5N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS6:
- if (@sellname$ != $S6N$) goto SELLS7;
- if (@sellamount > #S6) goto S_SellTooHigh;
- set @price,@sellamount*$S6;
- set #S6,#S6-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S6N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS7:
- if (@sellname$ != $S7N$) goto SELLS8;
- if (@sellamount > #S7) goto S_SellTooHigh;
- set @price,@sellamount*$S7;
- set #S7,#S7-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S7N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS8:
- if (@sellname$ != $S8N$) goto SELLS9;
- if (@sellamount > #S8) goto S_SellTooHigh;
- set @price,@sellamount*$S8;
- set #S8,#S8-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S8N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS9:
- if (@sellname$ != $S9N$) goto SELLS10;
- if (@sellamount > #S9) goto S_SellTooHigh;
- set @price,@sellamount*$S9;
- set #S9,#S9-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S9N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS10:
- if (@sellname$ != $S10N$) goto SELLS11;
- if (@sellamount > #S10) goto S_SellTooHigh;
- set @price,@sellamount*$S10;
- set #S10,#S10-@sellamount;
- set zeny,zeny+@price;
- next;
- mes "Sold " + @sellamount + " " + $S10N$ + " shares.";
- mes "Earned ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- SELLS11:
- mes "^FF0000Invalid Share Name.^000000";
- next;
- goto S_Start;
-
- S_SellTooHigh:
- mes "^FF0000You don't have that many shares.^000000";
- next;
- goto S_Start;
-
- S_SellInv:
- mes "^FF0000Invalid integer.^000000";
- next;
- goto S_Start;
-
-// Buying Shares //
-S_Buy:
- mes "[Stock Market]";
- mes "Available shares:";
- mes $S1N$;
- mes $S2N$;
- mes $S3N$;
- mes $S4N$;
- mes $S5N$;
- mes $S6N$;
- mes $S7N$;
- mes $S8N$;
- mes $S9N$;
- mes $S10N$;
- next;
- menu "Continue",-,"Cancel",S_Start;
-
- mes "Enter the name of the share company";
- mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
- set @buyname$,"0";
- input @buyname$;
-
- set @buyamount,0;
- input @buyamount;
- // Checks valid number //
- if (@buyamount < $S_BuyMin) goto S_TooLow;
- if (@buyamount > $S_BuyMax) goto S_TooHigh;
- if (zeny < $S_Trans) goto S_NoZeny;
- set zeny,zeny-$S_Trans;
-
- // Purchases the shares //
-
- PURS1:
- if (@buyname$ != $S1N$) goto PURS2;
- set @price,@buyamount*$S1;
- if (zeny < @price) goto S_NoZeny;
- set #S1,#S1+@buyamount;
- set @price,@buyamount*$S1;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S1N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS2:
- if (@buyname$ != $S2N$) goto PURS3;
- set @price,@buyamount*$S2;
- if (zeny < @price) goto S_NoZeny;
- set #S2,#S2+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S2N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS3:
- if (@buyname$ != $S3N$) goto PURS4;
- set @price,@buyamount*$S3;
- if (zeny < @price) goto S_NoZeny;
- set #S3,#S3+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S3N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS4:
- if (@buyname$ != $S4N$) goto PURS5;
- set @price,@buyamount*$S4;
- if (zeny < @price) goto S_NoZeny;
- set #S4,#S4+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S4N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS5:
- if (@buyname$ != $S5N$) goto PURS6;
- set @price,@buyamount*$S5;
- if (zeny < @price) goto S_NoZeny;
- set #S5,#S5+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S5N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS6:
- if (@buyname$ != $S6N$) goto PURS7;
- set @price,@buyamount*$S6;
- if (zeny < @price) goto S_NoZeny;
- set #S6,#S6+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S6N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS7:
- if (@buyname$ != $S7N$) goto PURS8;
- set @price,@buyamount*$S7;
- if (zeny < @price) goto S_NoZeny;
- set #S7,#S7+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S7N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS8:
- if (@buyname$ != $S8N$) goto PURS9;
- set @price,@buyamount*$S8;
- if (zeny < @price) goto S_NoZeny;
- set #S8,#S8+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S8N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS9:
- if (@buyname$ != $S9N$) goto PURS10;
- set @price,@buyamount*$S9;
- if (zeny < @price) goto S_NoZeny;
- set #S9,#S9+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S9N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS10:
- if (@buyname$ != $S10N$) goto PURS11;
- set @price,@buyamount*$S10;
- if (zeny < @price) goto S_NoZeny;
- set #S10,#S10+@buyamount;
- set zeny,zeny-@price;
- mes "Bought " + @buyamount + " " + $S10N$ + " shares.";
- mes "Lost ^0000FF"+@price+"z^000000.";
- next;
- goto S_Start;
-
- PURS11:
- goto S_InvName;
-
- // Number too low //
- S_TooLow:
- mes "^FF0000Minimum of " + $S_BuyMin + " shares can be bought at a time.^000000";
- next;
- goto S_Start;
-
- // Number too high //
- S_TooHigh:
- mes "^FF0000Maximum number of " + $S_BuyMax + " shares can be bought at a time.^000000";
- next;
- goto S_Start;
-
- S_NoZeny:
- mes "^FF0000You do not have enough zeny.^000000";
- next;
- goto S_Start;
-
- // Sends user to start if name invalid //
- S_InvName:
- mes "^FF0000Invalid share name.^000000";
- next;
- goto S_Start;
-
-// Displays your total amount //
-S_Port:
-mes "[Stock Market]";
-
- ACCS1:
- if (#S1 < 1) goto ACCS2;
- set @S1,#S1*$S1;
- mes $S1N$ + ": " + #S1 + " x " + $S1 + "z = " + @S1 + "z";
-
- ACCS2:
- if (#S2 < 1) goto ACCS3;
- set @S2,#S2*$S2;
- mes $S2N$ + ": " + #S2 + " x " + $S2 + "z = " + @S2 + "z";
-
- ACCS3:
- if (#S3 < 1) goto ACCS4;
- set @S3,#S3*$S3;
- mes $S3N$ + ": " + #S3 + " x " + $S3 + "z = " + @S3 + "z";
-
- ACCS4:
- if (#S4 < 1) goto ACCS5;
- set @S4,#S4*$S4;
- mes $S4N$ + ": " + #S4 + " x " + $S4 + "z = " + @S4 + "z";
-
- ACCS5:
- if (#S5 < 1) goto ACCS6;
- set @S5,#S5*$S5;
- mes $S5N$ + ": " + #S5 + " x " + $S5 + "z = " + @S5 + "z";
-
- ACCS6:
- if (#S6 < 1) goto ACCS7;
- set @S6,#S6*$S6;
- mes $S6N$ + ": " + #S6 + " x " + $S6 + "z = " + @S6 + "z";
-
- ACCS7:
- if (#S7 < 1) goto ACCS8;
- set @S7,#S7*$S7;
- mes $S7N$ + ": " + #S7 + " x " + $S7 + "z = " + @S7 + "z";
-
- ACCS8:
- if (#S8 < 1) goto ACCS9;
- set @S8,#S8*$S8;
- mes $S8N$ + ": " + #S8 + " x " + $S8 + "z = " + @S8 + "z";
-
- ACCS9:
- if (#S9 < 1) goto ACCS10;
- set @S9,#S9*$S9;
- mes $S9N$ + ": " + #S9 + " x " + $S9 + "z = " + @S9 + "z";
-
- ACCS10:
- if (#S10 < 1) goto ACCS11;
- set @S10,#S10*$S10;
- mes $S10N$ + ": " + #S10 + " x " + $S10 + "z = " + @S10 + "z";
-
- // Total //
- ACCS11:
- set @total,@S1 + @S2 + @S3 + @S4 + @S5 + @S6 + @S7 + @S8 + @S9 + @S10;
- mes "Total value: "+@total+"z";
- next;
- goto S_Start;
-
-
-// GM MENU //
-GM_Menu:
-mes "[Stock Market]";
-mes "Master, do you require anything?";
-menu "Fluctuate Market",S_Fluc,"Reset Prices",GM_Open,"Nothing",S_Start;
-
-S_Fluc:
-set $fluc,rand (-6,6);
-set $S1B,$S1;
-set $S1,$S1+$fluc;
-if ($S1 < 25) set $S1,$S1+3;
-if ($S1 < 50) set $S1,$S1+2;
-if ($S1 > 150) set $S1,$S1-2;
-if ($S1 > 175) set $S1,$S1-3;
-if ($S1 < 1) set $S1,1;
-
-set $fluc,rand (-6,6);
-set $S2B,$S2;
-set $S2,$S2+$fluc;
-if ($S2 < 25) set $S2,$S2+3;
-if ($S2 < 50) set $S2,$S2+2;
-if ($S2 > 150) set $S2,$S2-2;
-if ($S2 > 175) set $S2,$S2-3;
-if ($S2 < 2) set $S2,1;
-
-set $fluc,rand (-6,6);
-set $S3B,$S3;
-set $S3,$S3+$fluc;
-if ($S3 < 25) set $S3,$S3+3;
-if ($S3 < 50) set $S3,$S3+2;
-if ($S3 > 150) set $S3,$S3-2;
-if ($S3 > 175) set $S3,$S3-3;
-if ($S3 < 1) set $S3,1;
-
-set $fluc,rand (-6,6);
-set $S4B,$S4;
-set $S4,$S4+$fluc;
-if ($S4 < 25) set $S4,$S4+3;
-if ($S4 < 50) set $S4,$S4+2;
-if ($S4 > 150) set $S4,$S4-2;
-if ($S4 > 175) set $S4,$S4-3;
-if ($S4 < 1) set $S4,1;
-
-set $fluc,rand (-6,6);
-set $S5B,$S5;
-set $S5,$S5+$fluc;
-if ($S5 < 25) set $S5,$S5+3;
-if ($S5 < 50) set $S5,$S5+2;
-if ($S5 > 150) set $S5,$S5-2;
-if ($S5 > 175) set $S5,$S5-3;
-if ($S5 < 1) set $S5,1;
-
-set $fluc,rand (-6,6);
-set $S6B,$S6;
-set $S6,$S6+$fluc;
-if ($S6 < 25) set $S6,$S6+3;
-if ($S6 < 50) set $S6,$S6+2;
-if ($S6 > 150) set $S6,$S6-2;
-if ($S6 > 175) set $S6,$S6-3;
-if ($S6 < 1) set $S6,1;
-
-set $fluc,rand (-6,6);
-set $S7B,$S7;
-set $S7,$S7+$fluc;
-if ($S7 < 25) set $S7,$S7+3;
-if ($S7 < 50) set $S7,$S7+2;
-if ($S7 > 150) set $S7,$S7-2;
-if ($S7 > 175) set $S7,$S7-3;
-if ($S7 < 1) set $S7,1;
-
-set $fluc,rand (-6,6);
-set $S8B,$S8;
-set $S8,$S8+$fluc;
-if ($S8 < 25) set $S8,$S8+3;
-if ($S8 < 50) set $S8,$S8+2;
-if ($S8 > 150) set $S8,$S8-2;
-if ($S8 > 175) set $S8,$S8-3;
-if ($S8 < 1) set $S8,1;
-
-set $fluc,rand (-6,6);
-set $S9B,$S9;
-set $S9,$S9+$fluc;
-if ($S9 < 25) set $S9,$S9+3;
-if ($S9 < 50) set $S9,$S9+2;
-if ($S9 > 150) set $S9,$S9-2;
-if ($S9 > 175) set $S9,$S9-3;
-if ($S9 < 1) set $S9,1;
-
-set $fluc,rand (-6,6);
-set $S10B,$S10;
-set $S10,$S10+$fluc;
-if ($S10 < 25) set $S10,$S10+3;
-if ($S10 < 50) set $S10,$S10+2;
-if ($S10 > 150) set $S10,$S10-2;
-if ($S10 > 175) set $S10,$S10-3;
-if ($S10 < 1) set $S10,1;
-
-set $S_LastUpd$,"GM Fluctuation";
-mes "Market fluctuated.";
-close;
-
-GM_Open:
-menu "Set prices to...",GM_Set,"Cancel",-;
-mes "Farewell.";
-close;
-
-GM_Set:
-mes "Are you sure you want to reset?";
-mes "^FF0000All share values will become the same.^000000";
-next;
-menu "Yes",-,"No",GM_Menu;
-set @gmset,0;
-input @gmset;
-set $S1,@gmset;
-set $S2,@gmset;
-set $S3,@gmset;
-set $S4,@gmset;
-set $S5,@gmset;
-set $S6,@gmset;
-set $S7,@gmset;
-set $S8,@gmset;
-set $S9,@gmset;
-set $S10,@gmset;
-set $S1B,@gmset;
-set $S2B,@gmset;
-set $S3B,@gmset;
-set $S4B,@gmset;
-set $S5B,@gmset;
-set $S6B,@gmset;
-set $S7B,@gmset;
-set $S8B,@gmset;
-set $S9B,@gmset;
-set $S10B,@gmset;
-mes "All prices changed to " + @gmset + "z.";
-close;
-
-S_Quit:
-mes "[Stock Market]";
-mes "Goodbye.";
-close;
-}
-
+//===== eAthena Script =======================================
+//= Stock Market Game
+//===== By: ==================================================
+//= acky (acky@bigpond.net.au)
+//===== Current Version: =====================================
+//= 1.3.1
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= NPC for a stock market game.
+//===== Additional Comments: =================================
+//= GM Must activate the NPC before use.
+//= Fixed MAJOR exploit. - players could buy for free
+//= Low prices likely to rise, High prices likely to drop
+//= Small fix by Galeon
+//= Lupus: This script lets players make 40,000,000z a day
+//= so use it on your own risk
+//============================================================
+
+prontera.gat,140,181,5 script sharenames -1,{
+end;
+OnInit:
+// Sets the names of the shares //
+set $S1N$,"JIN";
+set $S2N$,"VNG";
+set $S3N$,"SHA";
+set $S4N$,"RGC";
+set $S5N$,"PSC";
+set $S6N$,"GNG";
+set $S7N$,"XRO";
+set $S8N$,"GRM";
+set $S9N$,"DOP";
+set $S10N$,"POR";
+
+// Transaction fee //
+set $S_Trans,1500;
+
+// Min & Max buyable //
+set $S_BuyMin,1;
+set $S_BuyMax,1000000;
+end;
+
+// Average Price (Your start prices) //
+set $S_Avg,100;
+
+// Set times of fluctuation //
+OnClock1100:
+set $S_LastUpd$,"12:00";
+goto S_Fluc;
+end;
+
+OnClock0000:
+set $S_LastUpd$,"00:00";
+goto S_Fluc;
+end;
+
+OnClock0600:
+set $S_LastUpd$,"06:00";
+goto S_Fluc;
+end;
+
+OnClock1800:
+set $S_LastUpd$,"18:00";
+goto S_Fluc;
+end;
+
+OnClock2100:
+set $S_LastUpd$,"21:00";
+goto S_Fluc;
+end;
+
+OnClock0900:
+set $S_LastUpd$,"09:00";
+goto S_Fluc;
+end;
+
+OnClock1500:
+set $S_LastUpd$,"15:00";
+goto S_Fluc;
+end;
+
+S_Fluc:
+set $fluc,rand (-6,6);
+set $S1B,$S1;
+set $S1,$S1+$fluc;
+if ($S1 < 25) set $S1,$S1+3;
+if ($S1 < 50) set $S1,$S1+2;
+if ($S1 > 150) set $S1,$S1-2;
+if ($S1 > 175) set $S1,$S1-3;
+if ($S1 < 1) set $S1,1;
+
+set $fluc,rand (-6,6);
+set $S2B,$S2;
+set $S2,$S2+$fluc;
+if ($S2 < 25) set $S2,$S2+3;
+if ($S2 < 50) set $S2,$S2+2;
+if ($S2 > 150) set $S2,$S2-2;
+if ($S2 > 175) set $S2,$S2-3;
+if ($S2 < 1) set $S2,1;
+
+set $fluc,rand (-6,6);
+set $S3B,$S3;
+set $S3,$S3+$fluc;
+if ($S3 < 25) set $S3,$S3+3;
+if ($S3 < 50) set $S3,$S3+2;
+if ($S3 > 150) set $S3,$S3-2;
+if ($S3 > 175) set $S3,$S3-3;
+if ($S3 < 1) set $S3,1;
+
+set $fluc,rand (-6,6);
+set $S4B,$S4;
+set $S4,$S4+$fluc;
+if ($S4 < 25) set $S4,$S4+3;
+if ($S4 < 50) set $S4,$S4+2;
+if ($S4 > 150) set $S4,$S4-2;
+if ($S4 > 175) set $S4,$S4-3;
+if ($S4 < 1) set $S4,1;
+
+set $fluc,rand (-6,6);
+set $S5B,$S5;
+set $S5,$S5+$fluc;
+if ($S5 < 25) set $S5,$S5+3;
+if ($S5 < 50) set $S5,$S5+2;
+if ($S5 > 150) set $S5,$S5-2;
+if ($S5 > 175) set $S5,$S5-3;
+if ($S5 < 1) set $S5,1;
+
+set $fluc,rand (-6,6);
+set $S6B,$S6;
+set $S6,$S6+$fluc;
+if ($S6 < 25) set $S6,$S6+3;
+if ($S6 < 50) set $S6,$S6+2;
+if ($S6 > 150) set $S6,$S6-2;
+if ($S6 > 175) set $S6,$S6-3;
+if ($S6 < 1) set $S6,1;
+
+set $fluc,rand (-6,6);
+set $S7B,$S7;
+set $S7,$S7+$fluc;
+if ($S7 < 25) set $S7,$S7+3;
+if ($S7 < 50) set $S7,$S7+2;
+if ($S7 > 150) set $S7,$S7-2;
+if ($S7 > 175) set $S7,$S7-3;
+if ($S7 < 1) set $S7,1;
+
+set $fluc,rand (-6,6);
+set $S8B,$S8;
+set $S8,$S8+$fluc;
+if ($S8 < 25) set $S8,$S8+3;
+if ($S8 < 50) set $S8,$S8+2;
+if ($S8 > 150) set $S8,$S8-2;
+if ($S8 > 175) set $S8,$S8-3;
+if ($S8 < 1) set $S8,1;
+
+set $fluc,rand (-6,6);
+set $S9B,$S9;
+set $S9,$S9+$fluc;
+if ($S9 < 25) set $S9,$S9+3;
+if ($S9 < 50) set $S9,$S9+2;
+if ($S9 > 150) set $S9,$S9-2;
+if ($S9 > 175) set $S9,$S9-3;
+if ($S9 < 1) set $S9,1;
+
+set $fluc,rand (-6,6);
+set $S10B,$S10;
+set $S10,$S10+$fluc;
+if ($S10 < 25) set $S10,$S10+3;
+if ($S10 < 50) set $S10,$S10+2;
+if ($S10 > 150) set $S10,$S10-2;
+if ($S10 > 175) set $S10,$S10-3;
+if ($S10 < 1) set $S10,1;
+end;
+}
+
+- script Stock Market::stockmarket 109,{
+// Ensures no trading when default prices have not been set //
+set @stotal,$S1+$S2+$S3+$S4+$S5+$S6+$S7+$S8+$S9+$S10;
+if (@stotal > 0) goto S_Start;
+mes "[Stock Market]";
+mes "Trading is currently closed.";
+if (getgmlevel(3) > 90) goto GM_Open;
+close;
+
+// Begining of interface //
+S_Start:
+mes "[Stock Market]";
+mes "Last fluctuation: " + $S_LastUpd$;
+
+// Loss/Gain in price //
+set @S1Update,$S1-$S1B;
+set @S2Update,$S2-$S2B;
+set @S3Update,$S3-$S3B;
+set @S4Update,$S4-$S4B;
+set @S5Update,$S5-$S5B;
+set @S6Update,$S6-$S6B;
+set @S7Update,$S7-$S7B;
+set @S8Update,$S8-$S8B;
+set @S9Update,$S9-$S9B;
+set @S10Update,$S10-$S10B;
+
+// Makes Loss/Gain Red/Green //
+if (@S1Update < 0) set @S1Update$,"^FF0000"+@S1Update+"^000000";
+if (@S1Update > 0) set @S1Update$,"^00FF00+"+@S1Update+"^000000";
+if (@S1Update == 0) set @S1Update$,@S1Update;
+
+if (@S2Update < 0) set @S2Update$,"^FF0000"+@S2Update+"^000000";
+if (@S2Update > 0) set @S2Update$,"^00FF00+"+@S2Update+"^000000";
+if (@S2Update == 0) set @S2Update$,@S2Update;
+
+if (@S3Update < 0) set @S3Update$,"^FF0000"+@S3Update+"^000000";
+if (@S3Update > 0) set @S3Update$,"^00FF00+"+@S3Update+"^000000";
+if (@S3Update == 0) set @S3Update$,@S3Update;
+
+if (@S4Update < 0) set @S4Update$,"^FF0000"+@S4Update+"^000000";
+if (@S4Update > 0) set @S4Update$,"^00FF00+"+@S4Update+"^000000";
+if (@S4Update == 0) set @S4Update$,@S4Update;
+
+if (@S5Update < 0) set @S5Update$,"^FF0000"+@S5Update+"^000000";
+if (@S5Update > 0) set @S5Update$,"^00FF00+"+@S5Update+"^000000";
+if (@S5Update == 0) set @S5Update$,@S5Update;
+
+if (@S6Update < 0) set @S6Update$,"^FF0000"+@S6Update+"^000000";
+if (@S6Update > 0) set @S6Update$,"^00FF00+"+@S6Update+"^000000";
+if (@S6Update == 0) set @S6Update$,@S6Update;
+
+if (@S7Update < 0) set @S7Update$,"^FF0000"+@S7Update+"^000000";
+if (@S7Update > 0) set @S7Update$,"^00FF00+"+@S7Update+"^000000";
+if (@S7Update == 0) set @S7Update$,@S7Update;
+
+if (@S8Update < 0) set @S8Update$,"^FF0000"+@S8Update+"^000000";
+if (@S8Update > 0) set @S8Update$,"^00FF00+"+@S8Update+"^000000";
+if (@S8Update == 0) set @S8Update$,@S8Update;
+
+if (@S9Update < 0) set @S9Update$,"^FF0000"+@S9Update+"^000000";
+if (@S9Update > 0) set @S9Update$,"^00FF00+"+@S9Update+"^000000";
+if (@S9Update == 0) set @S9Update$,@S9Update;
+
+if (@S10Update < 0) set @S10Update$,"^FF0000"+@S10Update+"^000000";
+if (@S10Update > 0) set @S10Update$,"^00FF00+"+@S10Update+"^000000";
+if (@S10Update == 0) set @S10Update$,@S10Update;
+
+// Displays shares & prices //
+mes "^21698F"+$S1N$+"^000000" + " " + $S1 + "z (" + @S1Update$ + ")";
+mes "^21698F"+$S2N$+"^000000" + " " + $S2 + "z (" + @S2Update$ + ")";
+mes "^21698F"+$S3N$+"^000000" + " " + $S3 + "z (" + @S3Update$ + ")";
+mes "^21698F"+$S4N$+"^000000" + " " + $S4 + "z (" + @S4Update$ + ")";
+mes "^21698F"+$S5N$+"^000000" + " " + $S5 + "z (" + @S5Update$ + ")";
+mes "^21698F"+$S6N$+"^000000" + " " + $S6 + "z (" + @S6Update$ + ")";
+mes "^21698F"+$S7N$+"^000000" + " " + $S7 + "z (" + @S7Update$ + ")";
+mes "^21698F"+$S8N$+"^000000" + " " + $S8 + "z (" + @S8Update$ + ")";
+mes "^21698F"+$S9N$+"^000000" + " " + $S9 + "z (" + @S9Update$ + ")";
+mes "^21698F"+$S10N$+"^000000" + " " + $S10 + "z (" + @S10Update$ + ")";
+next;
+
+// GM Menu link //
+if (getgmlevel(3) > 90) goto GM_subMenu;
+menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"Cancel",S_Quit;
+
+GM_subMenu:
+menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"GM Menu",GM_Menu,"Cancel",S_Quit;
+
+// Selling Shares //
+S_Sell:
+ mes "[Stock Market]";
+ mes "Enter the name of the share you wish to sell.";
+ mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
+ if (#S1 > 0) mes "^0000FF"+$S1N$+"^FF0000" + " x " + #S1 + " [" + $S1 + "z]";
+ if (#S2 > 0) mes "^0000FF"+$S2N$+"^FF0000" + " x " + #S2 + " [" + $S2 + "z]";
+ if (#S3 > 0) mes "^0000FF"+$S3N$+"^FF0000" + " x " + #S3 + " [" + $S3 + "z]";
+ if (#S4 > 0) mes "^0000FF"+$S4N$+"^FF0000" + " x " + #S4 + " [" + $S4 + "z]";
+ if (#S5 > 0) mes "^0000FF"+$S5N$+"^FF0000" + " x " + #S5 + " [" + $S5 + "z]";
+ if (#S6 > 0) mes "^0000FF"+$S6N$+"^FF0000" + " x " + #S6 + " [" + $S6 + "z]";
+ if (#S7 > 0) mes "^0000FF"+$S7N$+"^FF0000" + " x " + #S7 + " [" + $S7 + "z]";
+ if (#S8 > 0) mes "^0000FF"+$S8N$+"^FF0000" + " x " + #S8 + " [" + $S8 + "z]";
+ if (#S9 > 0) mes "^0000FF"+$S9N$+"^FF0000" + " x " + #S9 + " [" + $S9 + "z]";
+ if (#S10 > 0) mes "^0000FF"+$S10N$+"^FF0000" + " x " + #S10 + " [" + $S10 + "z]";
+ set @sellname$,"0";
+ input @sellname$;
+ set @sellamount,0;
+ input @sellamount;
+ if (@sellamount < 1) goto S_SellInv;
+ if (zeny < $S_Trans) goto S_NoZeny;
+ set zeny,zeny-$S_Trans;
+
+ SELLS1:
+ if (@sellname$ != $S1N$) goto SELLS2;
+ if (@sellamount > #S1) goto S_SellTooHigh;
+ set @price,@sellamount*$S1;
+ set #S1,#S1-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S1N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS2:
+ if (@sellname$ != $S2N$) goto SELLS3;
+ if (@sellamount > #S2) goto S_SellTooHigh;
+ set @price,@sellamount*$S2;
+ set #S2,#S2-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S2N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS3:
+ if (@sellname$ != $S3N$) goto SELLS4;
+ if (@sellamount > #S3) goto S_SellTooHigh;
+ set @price,@sellamount*$S3;
+ set #S3,#S3-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S3N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS4:
+ if (@sellname$ != $S4N$) goto SELLS5;
+ if (@sellamount > #S4) goto S_SellTooHigh;
+ set @price,@sellamount*$S4;
+ set #S4,#S4-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S4N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS5:
+ if (@sellname$ != $S5N$) goto SELLS6;
+ if (@sellamount > #S5) goto S_SellTooHigh;
+ set @price,@sellamount*$S5;
+ set #S5,#S5-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S5N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS6:
+ if (@sellname$ != $S6N$) goto SELLS7;
+ if (@sellamount > #S6) goto S_SellTooHigh;
+ set @price,@sellamount*$S6;
+ set #S6,#S6-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S6N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS7:
+ if (@sellname$ != $S7N$) goto SELLS8;
+ if (@sellamount > #S7) goto S_SellTooHigh;
+ set @price,@sellamount*$S7;
+ set #S7,#S7-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S7N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS8:
+ if (@sellname$ != $S8N$) goto SELLS9;
+ if (@sellamount > #S8) goto S_SellTooHigh;
+ set @price,@sellamount*$S8;
+ set #S8,#S8-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S8N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS9:
+ if (@sellname$ != $S9N$) goto SELLS10;
+ if (@sellamount > #S9) goto S_SellTooHigh;
+ set @price,@sellamount*$S9;
+ set #S9,#S9-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S9N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS10:
+ if (@sellname$ != $S10N$) goto SELLS11;
+ if (@sellamount > #S10) goto S_SellTooHigh;
+ set @price,@sellamount*$S10;
+ set #S10,#S10-@sellamount;
+ set zeny,zeny+@price;
+ next;
+ mes "Sold " + @sellamount + " " + $S10N$ + " shares.";
+ mes "Earned ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ SELLS11:
+ mes "^FF0000Invalid Share Name.^000000";
+ next;
+ goto S_Start;
+
+ S_SellTooHigh:
+ mes "^FF0000You don't have that many shares.^000000";
+ next;
+ goto S_Start;
+
+ S_SellInv:
+ mes "^FF0000Invalid integer.^000000";
+ next;
+ goto S_Start;
+
+// Buying Shares //
+S_Buy:
+ mes "[Stock Market]";
+ mes "Available shares:";
+ mes $S1N$;
+ mes $S2N$;
+ mes $S3N$;
+ mes $S4N$;
+ mes $S5N$;
+ mes $S6N$;
+ mes $S7N$;
+ mes $S8N$;
+ mes $S9N$;
+ mes $S10N$;
+ next;
+ menu "Continue",-,"Cancel",S_Start;
+
+ mes "Enter the name of the share company";
+ mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply.";
+ set @buyname$,"0";
+ input @buyname$;
+
+ set @buyamount,0;
+ input @buyamount;
+ // Checks valid number //
+ if (@buyamount < $S_BuyMin) goto S_TooLow;
+ if (@buyamount > $S_BuyMax) goto S_TooHigh;
+ if (zeny < $S_Trans) goto S_NoZeny;
+ set zeny,zeny-$S_Trans;
+
+ // Purchases the shares //
+
+ PURS1:
+ if (@buyname$ != $S1N$) goto PURS2;
+ set @price,@buyamount*$S1;
+ if (zeny < @price) goto S_NoZeny;
+ set #S1,#S1+@buyamount;
+ set @price,@buyamount*$S1;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S1N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS2:
+ if (@buyname$ != $S2N$) goto PURS3;
+ set @price,@buyamount*$S2;
+ if (zeny < @price) goto S_NoZeny;
+ set #S2,#S2+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S2N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS3:
+ if (@buyname$ != $S3N$) goto PURS4;
+ set @price,@buyamount*$S3;
+ if (zeny < @price) goto S_NoZeny;
+ set #S3,#S3+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S3N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS4:
+ if (@buyname$ != $S4N$) goto PURS5;
+ set @price,@buyamount*$S4;
+ if (zeny < @price) goto S_NoZeny;
+ set #S4,#S4+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S4N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS5:
+ if (@buyname$ != $S5N$) goto PURS6;
+ set @price,@buyamount*$S5;
+ if (zeny < @price) goto S_NoZeny;
+ set #S5,#S5+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S5N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS6:
+ if (@buyname$ != $S6N$) goto PURS7;
+ set @price,@buyamount*$S6;
+ if (zeny < @price) goto S_NoZeny;
+ set #S6,#S6+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S6N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS7:
+ if (@buyname$ != $S7N$) goto PURS8;
+ set @price,@buyamount*$S7;
+ if (zeny < @price) goto S_NoZeny;
+ set #S7,#S7+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S7N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS8:
+ if (@buyname$ != $S8N$) goto PURS9;
+ set @price,@buyamount*$S8;
+ if (zeny < @price) goto S_NoZeny;
+ set #S8,#S8+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S8N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS9:
+ if (@buyname$ != $S9N$) goto PURS10;
+ set @price,@buyamount*$S9;
+ if (zeny < @price) goto S_NoZeny;
+ set #S9,#S9+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S9N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS10:
+ if (@buyname$ != $S10N$) goto PURS11;
+ set @price,@buyamount*$S10;
+ if (zeny < @price) goto S_NoZeny;
+ set #S10,#S10+@buyamount;
+ set zeny,zeny-@price;
+ mes "Bought " + @buyamount + " " + $S10N$ + " shares.";
+ mes "Lost ^0000FF"+@price+"z^000000.";
+ next;
+ goto S_Start;
+
+ PURS11:
+ goto S_InvName;
+
+ // Number too low //
+ S_TooLow:
+ mes "^FF0000Minimum of " + $S_BuyMin + " shares can be bought at a time.^000000";
+ next;
+ goto S_Start;
+
+ // Number too high //
+ S_TooHigh:
+ mes "^FF0000Maximum number of " + $S_BuyMax + " shares can be bought at a time.^000000";
+ next;
+ goto S_Start;
+
+ S_NoZeny:
+ mes "^FF0000You do not have enough zeny.^000000";
+ next;
+ goto S_Start;
+
+ // Sends user to start if name invalid //
+ S_InvName:
+ mes "^FF0000Invalid share name.^000000";
+ next;
+ goto S_Start;
+
+// Displays your total amount //
+S_Port:
+mes "[Stock Market]";
+
+ ACCS1:
+ if (#S1 < 1) goto ACCS2;
+ set @S1,#S1*$S1;
+ mes $S1N$ + ": " + #S1 + " x " + $S1 + "z = " + @S1 + "z";
+
+ ACCS2:
+ if (#S2 < 1) goto ACCS3;
+ set @S2,#S2*$S2;
+ mes $S2N$ + ": " + #S2 + " x " + $S2 + "z = " + @S2 + "z";
+
+ ACCS3:
+ if (#S3 < 1) goto ACCS4;
+ set @S3,#S3*$S3;
+ mes $S3N$ + ": " + #S3 + " x " + $S3 + "z = " + @S3 + "z";
+
+ ACCS4:
+ if (#S4 < 1) goto ACCS5;
+ set @S4,#S4*$S4;
+ mes $S4N$ + ": " + #S4 + " x " + $S4 + "z = " + @S4 + "z";
+
+ ACCS5:
+ if (#S5 < 1) goto ACCS6;
+ set @S5,#S5*$S5;
+ mes $S5N$ + ": " + #S5 + " x " + $S5 + "z = " + @S5 + "z";
+
+ ACCS6:
+ if (#S6 < 1) goto ACCS7;
+ set @S6,#S6*$S6;
+ mes $S6N$ + ": " + #S6 + " x " + $S6 + "z = " + @S6 + "z";
+
+ ACCS7:
+ if (#S7 < 1) goto ACCS8;
+ set @S7,#S7*$S7;
+ mes $S7N$ + ": " + #S7 + " x " + $S7 + "z = " + @S7 + "z";
+
+ ACCS8:
+ if (#S8 < 1) goto ACCS9;
+ set @S8,#S8*$S8;
+ mes $S8N$ + ": " + #S8 + " x " + $S8 + "z = " + @S8 + "z";
+
+ ACCS9:
+ if (#S9 < 1) goto ACCS10;
+ set @S9,#S9*$S9;
+ mes $S9N$ + ": " + #S9 + " x " + $S9 + "z = " + @S9 + "z";
+
+ ACCS10:
+ if (#S10 < 1) goto ACCS11;
+ set @S10,#S10*$S10;
+ mes $S10N$ + ": " + #S10 + " x " + $S10 + "z = " + @S10 + "z";
+
+ // Total //
+ ACCS11:
+ set @total,@S1 + @S2 + @S3 + @S4 + @S5 + @S6 + @S7 + @S8 + @S9 + @S10;
+ mes "Total value: "+@total+"z";
+ next;
+ goto S_Start;
+
+
+// GM MENU //
+GM_Menu:
+mes "[Stock Market]";
+mes "Master, do you require anything?";
+menu "Fluctuate Market",S_Fluc,"Reset Prices",GM_Open,"Nothing",S_Start;
+
+S_Fluc:
+set $fluc,rand (-6,6);
+set $S1B,$S1;
+set $S1,$S1+$fluc;
+if ($S1 < 25) set $S1,$S1+3;
+if ($S1 < 50) set $S1,$S1+2;
+if ($S1 > 150) set $S1,$S1-2;
+if ($S1 > 175) set $S1,$S1-3;
+if ($S1 < 1) set $S1,1;
+
+set $fluc,rand (-6,6);
+set $S2B,$S2;
+set $S2,$S2+$fluc;
+if ($S2 < 25) set $S2,$S2+3;
+if ($S2 < 50) set $S2,$S2+2;
+if ($S2 > 150) set $S2,$S2-2;
+if ($S2 > 175) set $S2,$S2-3;
+if ($S2 < 2) set $S2,1;
+
+set $fluc,rand (-6,6);
+set $S3B,$S3;
+set $S3,$S3+$fluc;
+if ($S3 < 25) set $S3,$S3+3;
+if ($S3 < 50) set $S3,$S3+2;
+if ($S3 > 150) set $S3,$S3-2;
+if ($S3 > 175) set $S3,$S3-3;
+if ($S3 < 1) set $S3,1;
+
+set $fluc,rand (-6,6);
+set $S4B,$S4;
+set $S4,$S4+$fluc;
+if ($S4 < 25) set $S4,$S4+3;
+if ($S4 < 50) set $S4,$S4+2;
+if ($S4 > 150) set $S4,$S4-2;
+if ($S4 > 175) set $S4,$S4-3;
+if ($S4 < 1) set $S4,1;
+
+set $fluc,rand (-6,6);
+set $S5B,$S5;
+set $S5,$S5+$fluc;
+if ($S5 < 25) set $S5,$S5+3;
+if ($S5 < 50) set $S5,$S5+2;
+if ($S5 > 150) set $S5,$S5-2;
+if ($S5 > 175) set $S5,$S5-3;
+if ($S5 < 1) set $S5,1;
+
+set $fluc,rand (-6,6);
+set $S6B,$S6;
+set $S6,$S6+$fluc;
+if ($S6 < 25) set $S6,$S6+3;
+if ($S6 < 50) set $S6,$S6+2;
+if ($S6 > 150) set $S6,$S6-2;
+if ($S6 > 175) set $S6,$S6-3;
+if ($S6 < 1) set $S6,1;
+
+set $fluc,rand (-6,6);
+set $S7B,$S7;
+set $S7,$S7+$fluc;
+if ($S7 < 25) set $S7,$S7+3;
+if ($S7 < 50) set $S7,$S7+2;
+if ($S7 > 150) set $S7,$S7-2;
+if ($S7 > 175) set $S7,$S7-3;
+if ($S7 < 1) set $S7,1;
+
+set $fluc,rand (-6,6);
+set $S8B,$S8;
+set $S8,$S8+$fluc;
+if ($S8 < 25) set $S8,$S8+3;
+if ($S8 < 50) set $S8,$S8+2;
+if ($S8 > 150) set $S8,$S8-2;
+if ($S8 > 175) set $S8,$S8-3;
+if ($S8 < 1) set $S8,1;
+
+set $fluc,rand (-6,6);
+set $S9B,$S9;
+set $S9,$S9+$fluc;
+if ($S9 < 25) set $S9,$S9+3;
+if ($S9 < 50) set $S9,$S9+2;
+if ($S9 > 150) set $S9,$S9-2;
+if ($S9 > 175) set $S9,$S9-3;
+if ($S9 < 1) set $S9,1;
+
+set $fluc,rand (-6,6);
+set $S10B,$S10;
+set $S10,$S10+$fluc;
+if ($S10 < 25) set $S10,$S10+3;
+if ($S10 < 50) set $S10,$S10+2;
+if ($S10 > 150) set $S10,$S10-2;
+if ($S10 > 175) set $S10,$S10-3;
+if ($S10 < 1) set $S10,1;
+
+set $S_LastUpd$,"GM Fluctuation";
+mes "Market fluctuated.";
+close;
+
+GM_Open:
+menu "Set prices to...",GM_Set,"Cancel",-;
+mes "Farewell.";
+close;
+
+GM_Set:
+mes "Are you sure you want to reset?";
+mes "^FF0000All share values will become the same.^000000";
+next;
+menu "Yes",-,"No",GM_Menu;
+set @gmset,0;
+input @gmset;
+set $S1,@gmset;
+set $S2,@gmset;
+set $S3,@gmset;
+set $S4,@gmset;
+set $S5,@gmset;
+set $S6,@gmset;
+set $S7,@gmset;
+set $S8,@gmset;
+set $S9,@gmset;
+set $S10,@gmset;
+set $S1B,@gmset;
+set $S2B,@gmset;
+set $S3B,@gmset;
+set $S4B,@gmset;
+set $S5B,@gmset;
+set $S6B,@gmset;
+set $S7B,@gmset;
+set $S8B,@gmset;
+set $S9B,@gmset;
+set $S10B,@gmset;
+mes "All prices changed to " + @gmset + "z.";
+close;
+
+S_Quit:
+mes "[Stock Market]";
+mes "Goodbye.";
+close;
+}
+
prontera.gat,140,181,5 duplicate(stockmarket) Stock Market 109 \ No newline at end of file
diff --git a/npc/custom/tougijou.txt b/npc/custom/tougijou.txt
index d0576fe63..8daaa3f02 100644
--- a/npc/custom/tougijou.txt
+++ b/npc/custom/tougijou.txt
@@ -1,344 +1,344 @@
-//===============================================================================
-// Tougijou (Arena) EVENT
-//===============================================================================
-gonryun.gat,180,117,0 script Son Mudo 85,{
- if (Class == 0) goto Lnovice;
- if (event_tougijou == 1) goto LStart2;
- mes "[Son Mudo]";
- mes "Ahh... this cool guy does not come. ";
- mes "Hmm? Hey, you. You look strong. I have a little thing todo, are you interested?";
- next;
- menu "I am",L1,"No, not interested",L2,"(ignore him)",L3;
-L1:
- mes "[Son Mudo]";
- mes "Oh... It looks like my eyes were right.";
- mes "But I have to check some things. First, your preparation.";
- next;
- if (checkweight(7049,730)) goto Lweightok;
- mes "^0000ffSon Mudo points to a quite big stone, telling you to lift it up. But because you are too heavy, you cannot raise it.^000000";
- next;
- mes "[Son Mudo]";
- mes "It looks like your training was insufficient. Come back when you have trained a bit more.";
- close;
-Lweightok:
- getitem 7049,730;
- set event_tougijou,1;
- mes "^0000ffSon Mudo points to a quite big stone, telling you to lift it up and you raise it easily.^000000";
- next;
- emotion 21;
- mes "[Son Mudo]";
- mes "Haha, My eyes were absolutely right. When it is about time, I show you a good place. See you then.";
- close;
-L2:
- mes "[Son Mudo]";
- mes "Really?";
- mes "But don't you think, if you have some power, you can get interesting experiences?";
- mes "Haha, when you change your mind, come and take the challenge.";
- close;
-L3:
- emotion 32;
- mes "[Son Mudo]";
- mes "This is... I must have mistaken this one for someone else.";
- mes "Haha......";
- close;
-LStart2:
- mes "[Son Mudo]";
- mes "Oh, we meet again!";
- mes "Want to go to the interesting passage now?";
- next;
- menu "I want to",-,"No, I don't",Lno;
- mes "[Son Mudo]";
- mes "Really?";
- mes "Ah Hahahaha.";
- mes "Well then, have fun!";
- next;
- warp "gon_test.gat",53,6;
- end;
- Lno:
- mes "[Son Mudo]";
- mes "What, you hesitate? Well, it's ok. See you later then.";
- close;
-Lnovice:
- mes "[Son Mudo]";
- mes "Hey, you are just a Novice. Go back to town.";
- close;
-}
-//===============================================================================
-gon_test.gat,50,14,4 script Gonryun Arena Staff 780,{
- mes "[Waiting Room Staff]";
- mes "Hello.";
- mes "Just enter the Chat and wait for your turn.";
- close;
-OnInit:
- waitingroom "Please enter here!!",1,"Gonryun Arena Staff::OnMax";
- end;
-OnMax:
- warpwaitingpc "gon_test.gat",44,86;
- killmonsterall "gon_test.gat";
- initnpctimer "gontimer";
- disablenpc "Gonryun Arena Staff";
- set $@addmon,0;
- set $@kengaku,0;
- end;
-}
-//===============================================================================
-gon_test.gat,46,14,4 script Arena Guide 770,{
- mes "[Son Fiyon]";
- mes "......";
- mes "Ah...... Welcome. This is the Arena.";
- mes "What can I do for you?";
- next;
- menu "Arena?",L1,"Fraulein, would you like to go out with me?",L2,"I want to go to the seats.",L3,"I wanna go back",L4,"Nothing, thanks.",L5;
-L1:
- mes "[Son Fiyon]";
- mes "The Arena is the section of the village where fights with mosters take place.";
- next;
- mes "[Son Fiyon]";
- mes "Because it is necessary to prepare the correct leveled monster, please talk to the Summoner and call for your favorite monster.";
- next;
- mes "[Son Fiyon]";
- mes "In addition there is a time restriction to 3 minutes starting from admission. Please take care of this.";
- close;
-L2:
- mes "[Son Fiyon]";
- mes "Eh.... what?";
- mes "Oh, sorry, but I have to work right now......";
- mes "Please accept my appologies.";
- close;
-L3:
- mes "[Son Fiyon]";
- mes "Certainly! Thank you. Please have a nice time.";
- next;
- set $@kengaku,1;
- warp "gon_test.gat",25,99;
- end;
-L4:
- mes "[Son Fiyon]";
- mes "Thank you. Please use our service again.";
- next;
- warp "gonryun.gat",177,112;
- end;
-L5:
- mes "[Son Fiyon]";
- mes "......";
- mes "Good bye.";
- close;
-}
-//===============================================================================
-gon_test.gat,42,89,4 script Summoner 774,{
- if ($@kengaku == 1) goto LError;
- if ($@addmon == 1) goto Lalready;
- mes "[Son Yon'u]";
- mes "Welcome.";
- mes "What Monster shall I summon?";
- next;
- L0:
- menu "Group 1",L1,"Group 2",L2,"Group 3",L3,"Group 4",L4,"Group 5",L5,"Group 6",L6,"Group 7",L7,"Group 8",L8,"Group 9",L9,"Group 10",L10,"Group 11",L11;
- L1:
- menu "Dizziness",L1_1,"The Poison Food",L1_2,"Anemia",L1_3,"The Bug",L1_4,"Incision",L1_5,"Rabies",L1_6,"back",L0;
- L1_1:
- monster "gon_test.gat",58,87,"Dizziness",1419,1,"mobend::OnMobDead";set $@addmon,1;close;
- L1_2:
- monster "gon_test.gat",58,87,"The Poison Food",1428,1,"mobend::OnMobDead";set $@addmon,1;close;
- L1_3:
- monster "gon_test.gat",58,87,"Anemia",1434,1,"mobend::OnMobDead";set $@addmon,1;close;
- L1_4:
- monster "gon_test.gat",58,87,"The Bug",1430,1,"mobend::OnMobDead";set $@addmon,1;close;
- L1_5:
- monster "gon_test.gat",58,87,"Incision",1457,1,"mobend::OnMobDead";set $@addmon,1;close;
- L1_6:
- monster "gon_test.gat",58,87,"Rabies",1432,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2:
- menu "Samael",L2_1,"Toror",L2_2,"Kangeishi",L2_3,"Blackdock",L2_4,"Merou",L2_5,"Kyoushi",L2_6,"back",L0;
- L2_1:
- monster "gon_test.gat",58,87,"Samael",1462,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2_2:
- monster "gon_test.gat",58,87,"Toror",1442,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2_3:
- monster "gon_test.gat",58,87,"Kangeishi",1469,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2_4:
- monster "gon_test.gat",58,87,"Blackdock",1460,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2_5:
- monster "gon_test.gat",58,87,"Merou",1425,1,"mobend::OnMobDead";set $@addmon,1;close;
- L2_6:
- monster "gon_test.gat",58,87,"Kyoushi",1472,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3:
- menu "Ashimoto",L3_1,"Mushibamu",L3_2,"Sorappo",L3_3,"Freezer",L3_4,"Heat",L3_5,"The Rotten",L3_6,"back",L0;
- L3_1:
- monster "gon_test.gat",58,87,"Ashimoto",1454,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3_2:
- monster "gon_test.gat",58,87,"Mushibamu",1443,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3_3:
- monster "gon_test.gat",58,87,"Sorappo",1455,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3_4:
- monster "gon_test.gat",58,87,"Freezer",1426,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3_5:
- monster "gon_test.gat",58,87,"Heat",1436,1,"mobend::OnMobDead";set $@addmon,1;close;
- L3_6:
- monster "gon_test.gat",58,87,"The Rotten",1423,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4:
- menu "Priest",L4_1,"Onion",L4_2,"Big Centipede",L4_3,"Marionette",L4_4,"Matchstick Girl",L4_5,"Firefly",L4_6,"back",L0;
- L4_1:
- monster "gon_test.gat",58,87,"Priest",1458,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4_2:
- monster "gon_test.gat",58,87,"Onion",1440,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4_3:
- monster "gon_test.gat",58,87,"Big Centipede",1429,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4_4:
- monster "gon_test.gat",58,87,"Marionette",1459,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4_5:
- monster "gon_test.gat",58,87,"Matchstick Girl",1444,1,"mobend::OnMobDead";set $@addmon,1;close;
- L4_6:
- monster "gon_test.gat",58,87,"Fly",1422,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5:
- menu "Femal Curse",L5_1,"Ikitsuchi",L5_2,"Master Snake",L5_3,"Poison Dragon",L5_4,"Seiryuu, the Blue Dragon",L5_5,"Epidemic Devil",L5_6,"back",L0;
- L5_1:
- monster "gon_test.gat",58,87,"Femal Curse",1421,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5_2:
- monster "gon_test.gat",58,87,"Ikitsuchi",1481,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5_3:
- monster "gon_test.gat",58,87,"Master Snake",1424,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5_4:
- monster "gon_test.gat",58,87,"Poison Dragon",1465,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5_5:
- monster "gon_test.gat",58,87,"Seiryuu, the Blue Dragon",1466,1,"mobend::OnMobDead";set $@addmon,1;close;
- L5_6:
- monster "gon_test.gat",58,87,"Epidemic Devil",1433,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6:
- menu "Tapir",L6_1,"Moat Putter",L6_2,"God of Lightning",L6_3,"Revengeing Ghost",L6_4,"Fusoushin",L6_5,"Hanmou",L6_6,"back",L0;
- L6_1:
- monster "gon_test.gat",58,87,"Tapir",1427,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6_2:
- monster "gon_test.gat",58,87,"Moat Putter",1473,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6_3:
- monster "gon_test.gat",58,87,"God of Lightning",1431,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6_4:
- monster "gon_test.gat",58,87,"Revengeing Ghost",1446,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6_5:
- monster "gon_test.gat",58,87,"Fusoushin",1474,1,"mobend::OnMobDead";set $@addmon,1;close;
- L6_6:
- monster "gon_test.gat",58,87,"Hanmou",1471,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7:
- menu "Cane",L7_1,"Axe",L7_2,"Big Hammer",L7_3,"Armor",L7_4,"Bow",L7_5,"Iron Bullet",L7_6,"back",L0;
- L7_1:
- monster "gon_test.gat",58,87,"Cane",1450,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7_2:
- monster "gon_test.gat",58,87,"Axe",1439,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7_3:
- monster "gon_test.gat",58,87,"Big Hammer",1461,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7_4:
- monster "gon_test.gat",58,87,"Armor",1467,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7_5:
- monster "gon_test.gat",58,87,"Bow",1453,1,"mobend::OnMobDead";set $@addmon,1;close;
- L7_6:
- monster "gon_test.gat",58,87,"Iron Bullet",1479,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8:
- menu "Lips",L8_1,"Tooth",L8_2,"Hair",L8_3,"The Hand",L8_4,"Muscle",L8_5,"Bone",L8_6,"back",L0;
- L8_1:
- monster "gon_test.gat",58,87,"Lips",1451,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8_2:
- monster "gon_test.gat",58,87,"Tooth",1475,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8_3:
- monster "gon_test.gat",58,87,"The Hair",1437,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8_4:
- monster "gon_test.gat",58,87,"Hand",1441,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8_5:
- monster "gon_test.gat",58,87,"Muscle",1476,1,"mobend::OnMobDead";set $@addmon,1;close;
- L8_6:
- monster "gon_test.gat",58,87,"Bone",1435,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9:
- menu "Ball",L9_1,"Mirror",L9_2,"Book",L9_3,"Glove",L9_4,"Bag",L9_5,"Clothes",L9_6,"back",L0;
- L9_1:
- monster "gon_test.gat",58,87,"Ball",1477,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9_2:
- monster "gon_test.gat",58,87,"Mirror",1448,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9_3:
- monster "gon_test.gat",58,87,"Book",1478,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9_4:
- monster "gon_test.gat",58,87,"Glove",1489,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9_5:
- monster "gon_test.gat",58,87,"Bag",1488,1,"mobend::OnMobDead";set $@addmon,1;close;
- L9_6:
- monster "gon_test.gat",58,87,"Clothes",1438,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10:
- menu "The Queen",L10_1,"Hot-Blood-Man",L10_2,"Executioner",L10_3,"Mutant Dragon",L10_4,"Syntetic Beast",L10_5,"Satan",L10_6,"back",L0;
- L10_1:
- monster "gon_test.gat",58,87,"The Queen",1482,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10_2:
- monster "gon_test.gat",58,87,"Hot-Blood-Man",1464,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10_3:
- monster "gon_test.gat",58,87,"Executioner",1487,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10_4:
- monster "gon_test.gat",58,87,"Mutant Dragon",1449,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10_5:
- monster "gon_test.gat",58,87,"Syntetic Beast",1456,1,"mobend::OnMobDead";set $@addmon,1;close;
- L10_6:
- monster "gon_test.gat",58,87,"Satan",1486,1,"mobend::OnMobDead";set $@addmon,1;close;
- L11:
- menu "Hunter",L11_1,"Assassin",L11_2,"Samurai",L11_3,"Budoka",L11_4,"Fencer",L11_5,"back",L0;
- L11_1:
- monster "gon_test.gat",58,87,"Hunter",1447,1,"mobend::OnMobDead";set $@addmon,1;close;
- L11_2:
- monster "gon_test.gat",58,87,"Assassin",1483,1,"mobend::OnMobDead";set $@addmon,1;close;
- L11_3:
- monster "gon_test.gat",58,87,"Samurai",1490,1,"mobend::OnMobDead";set $@addmon,1;close;
- L11_4:
- monster "gon_test.gat",58,87,"Budoka",1484,1,"mobend::OnMobDead";set $@addmon,1;close;
- L11_5:
- monster "gon_test.gat",58,87,"Fencer",1485,1,"mobend::OnMobDead";set $@addmon,1;close;
-Lalready:
- mes "[Son Yon'u]";
- mes "The monster has been summoned already. It is only possible to summon one monster at a time. Please re-enter the arena, if you wish another opponent.";
- close;
-LError:
- mes "[Son Yon'u]";
- mes "Please attend after applying formally.";
- close;
-}
-//===============================================================================
-gon_test.gat,58,87,0 script mobend -1,{
-OnMobDead:
- mapannounce "gon_test.gat","Summoner: Congratulations.",0;
- stopnpctimer "gontimer";
- addtimer 5000, "mobend::OnReturn";
- end;
-OnReturn:
- enablenpc "Gonryun Arena Staff";
- donpcevent "Gonryun Arena Staff::OnInit";
- warp "gon_test.gat",44,4;
- end;
-}
-//===============================================================================
-gon_test.gat,70,103,4 script Gateway Staff 773,{
- mes "[Che En'en]";
- mes "You want to return?";
- next;
- menu "Return",-,"Stay",Lno;
- mes "[Che En'en]";
- mes "Thank you. Please come again.";
- next;
- warp "gon_test.gat",44,4;
- set $@kengaku,0;
- end;
- Lno:
- mes "[Che En'en]";
- mes "Thank you. ";
- close;
-}
-//===============================================================================
-gon_test.gat,51,90,0 script gontimer -1,{
-OnTimer1000:
- mapannounce "gon_test.gat","Time limit is 3 Minutes from now.",8;
- end;
-OnTimer120000:
- mapannounce "gon_test.gat","1 minute remaining.",0;
- end;
-OnTimer180000:
- stopnpctimer "gontimer";
- mapannounce "gon_test.gat","Time Limit exceeded.",0;
- areawarp "gon_test.gat",42,82,73,91,"gon_test.gat",44,4;
- enablenpc "Gonryun Arena Staff";
- donpcevent "Gonryun Arena Staff::OnInit";
- killmonsterall "gon_test.gat";
- end;
-}
+//===============================================================================
+// Tougijou (Arena) EVENT
+//===============================================================================
+gonryun.gat,180,117,0 script Son Mudo 85,{
+ if (Class == 0) goto Lnovice;
+ if (event_tougijou == 1) goto LStart2;
+ mes "[Son Mudo]";
+ mes "Ahh... this cool guy does not come. ";
+ mes "Hmm? Hey, you. You look strong. I have a little thing todo, are you interested?";
+ next;
+ menu "I am",L1,"No, not interested",L2,"(ignore him)",L3;
+L1:
+ mes "[Son Mudo]";
+ mes "Oh... It looks like my eyes were right.";
+ mes "But I have to check some things. First, your preparation.";
+ next;
+ if (checkweight(7049,730)) goto Lweightok;
+ mes "^0000ffSon Mudo points to a quite big stone, telling you to lift it up. But because you are too heavy, you cannot raise it.^000000";
+ next;
+ mes "[Son Mudo]";
+ mes "It looks like your training was insufficient. Come back when you have trained a bit more.";
+ close;
+Lweightok:
+ getitem 7049,730;
+ set event_tougijou,1;
+ mes "^0000ffSon Mudo points to a quite big stone, telling you to lift it up and you raise it easily.^000000";
+ next;
+ emotion 21;
+ mes "[Son Mudo]";
+ mes "Haha, My eyes were absolutely right. When it is about time, I show you a good place. See you then.";
+ close;
+L2:
+ mes "[Son Mudo]";
+ mes "Really?";
+ mes "But don't you think, if you have some power, you can get interesting experiences?";
+ mes "Haha, when you change your mind, come and take the challenge.";
+ close;
+L3:
+ emotion 32;
+ mes "[Son Mudo]";
+ mes "This is... I must have mistaken this one for someone else.";
+ mes "Haha......";
+ close;
+LStart2:
+ mes "[Son Mudo]";
+ mes "Oh, we meet again!";
+ mes "Want to go to the interesting passage now?";
+ next;
+ menu "I want to",-,"No, I don't",Lno;
+ mes "[Son Mudo]";
+ mes "Really?";
+ mes "Ah Hahahaha.";
+ mes "Well then, have fun!";
+ next;
+ warp "gon_test.gat",53,6;
+ end;
+ Lno:
+ mes "[Son Mudo]";
+ mes "What, you hesitate? Well, it's ok. See you later then.";
+ close;
+Lnovice:
+ mes "[Son Mudo]";
+ mes "Hey, you are just a Novice. Go back to town.";
+ close;
+}
+//===============================================================================
+gon_test.gat,50,14,4 script Gonryun Arena Staff 780,{
+ mes "[Waiting Room Staff]";
+ mes "Hello.";
+ mes "Just enter the Chat and wait for your turn.";
+ close;
+OnInit:
+ waitingroom "Please enter here!!",1,"Gonryun Arena Staff::OnMax";
+ end;
+OnMax:
+ warpwaitingpc "gon_test.gat",44,86;
+ killmonsterall "gon_test.gat";
+ initnpctimer "gontimer";
+ disablenpc "Gonryun Arena Staff";
+ set $@addmon,0;
+ set $@kengaku,0;
+ end;
+}
+//===============================================================================
+gon_test.gat,46,14,4 script Arena Guide 770,{
+ mes "[Son Fiyon]";
+ mes "......";
+ mes "Ah...... Welcome. This is the Arena.";
+ mes "What can I do for you?";
+ next;
+ menu "Arena?",L1,"Fraulein, would you like to go out with me?",L2,"I want to go to the seats.",L3,"I wanna go back",L4,"Nothing, thanks.",L5;
+L1:
+ mes "[Son Fiyon]";
+ mes "The Arena is the section of the village where fights with mosters take place.";
+ next;
+ mes "[Son Fiyon]";
+ mes "Because it is necessary to prepare the correct leveled monster, please talk to the Summoner and call for your favorite monster.";
+ next;
+ mes "[Son Fiyon]";
+ mes "In addition there is a time restriction to 3 minutes starting from admission. Please take care of this.";
+ close;
+L2:
+ mes "[Son Fiyon]";
+ mes "Eh.... what?";
+ mes "Oh, sorry, but I have to work right now......";
+ mes "Please accept my appologies.";
+ close;
+L3:
+ mes "[Son Fiyon]";
+ mes "Certainly! Thank you. Please have a nice time.";
+ next;
+ set $@kengaku,1;
+ warp "gon_test.gat",25,99;
+ end;
+L4:
+ mes "[Son Fiyon]";
+ mes "Thank you. Please use our service again.";
+ next;
+ warp "gonryun.gat",177,112;
+ end;
+L5:
+ mes "[Son Fiyon]";
+ mes "......";
+ mes "Good bye.";
+ close;
+}
+//===============================================================================
+gon_test.gat,42,89,4 script Summoner 774,{
+ if ($@kengaku == 1) goto LError;
+ if ($@addmon == 1) goto Lalready;
+ mes "[Son Yon'u]";
+ mes "Welcome.";
+ mes "What Monster shall I summon?";
+ next;
+ L0:
+ menu "Group 1",L1,"Group 2",L2,"Group 3",L3,"Group 4",L4,"Group 5",L5,"Group 6",L6,"Group 7",L7,"Group 8",L8,"Group 9",L9,"Group 10",L10,"Group 11",L11;
+ L1:
+ menu "Dizziness",L1_1,"The Poison Food",L1_2,"Anemia",L1_3,"The Bug",L1_4,"Incision",L1_5,"Rabies",L1_6,"back",L0;
+ L1_1:
+ monster "gon_test.gat",58,87,"Dizziness",1419,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L1_2:
+ monster "gon_test.gat",58,87,"The Poison Food",1428,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L1_3:
+ monster "gon_test.gat",58,87,"Anemia",1434,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L1_4:
+ monster "gon_test.gat",58,87,"The Bug",1430,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L1_5:
+ monster "gon_test.gat",58,87,"Incision",1457,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L1_6:
+ monster "gon_test.gat",58,87,"Rabies",1432,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2:
+ menu "Samael",L2_1,"Toror",L2_2,"Kangeishi",L2_3,"Blackdock",L2_4,"Merou",L2_5,"Kyoushi",L2_6,"back",L0;
+ L2_1:
+ monster "gon_test.gat",58,87,"Samael",1462,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2_2:
+ monster "gon_test.gat",58,87,"Toror",1442,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2_3:
+ monster "gon_test.gat",58,87,"Kangeishi",1469,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2_4:
+ monster "gon_test.gat",58,87,"Blackdock",1460,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2_5:
+ monster "gon_test.gat",58,87,"Merou",1425,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L2_6:
+ monster "gon_test.gat",58,87,"Kyoushi",1472,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3:
+ menu "Ashimoto",L3_1,"Mushibamu",L3_2,"Sorappo",L3_3,"Freezer",L3_4,"Heat",L3_5,"The Rotten",L3_6,"back",L0;
+ L3_1:
+ monster "gon_test.gat",58,87,"Ashimoto",1454,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3_2:
+ monster "gon_test.gat",58,87,"Mushibamu",1443,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3_3:
+ monster "gon_test.gat",58,87,"Sorappo",1455,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3_4:
+ monster "gon_test.gat",58,87,"Freezer",1426,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3_5:
+ monster "gon_test.gat",58,87,"Heat",1436,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L3_6:
+ monster "gon_test.gat",58,87,"The Rotten",1423,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4:
+ menu "Priest",L4_1,"Onion",L4_2,"Big Centipede",L4_3,"Marionette",L4_4,"Matchstick Girl",L4_5,"Firefly",L4_6,"back",L0;
+ L4_1:
+ monster "gon_test.gat",58,87,"Priest",1458,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4_2:
+ monster "gon_test.gat",58,87,"Onion",1440,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4_3:
+ monster "gon_test.gat",58,87,"Big Centipede",1429,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4_4:
+ monster "gon_test.gat",58,87,"Marionette",1459,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4_5:
+ monster "gon_test.gat",58,87,"Matchstick Girl",1444,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L4_6:
+ monster "gon_test.gat",58,87,"Fly",1422,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5:
+ menu "Femal Curse",L5_1,"Ikitsuchi",L5_2,"Master Snake",L5_3,"Poison Dragon",L5_4,"Seiryuu, the Blue Dragon",L5_5,"Epidemic Devil",L5_6,"back",L0;
+ L5_1:
+ monster "gon_test.gat",58,87,"Femal Curse",1421,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5_2:
+ monster "gon_test.gat",58,87,"Ikitsuchi",1481,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5_3:
+ monster "gon_test.gat",58,87,"Master Snake",1424,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5_4:
+ monster "gon_test.gat",58,87,"Poison Dragon",1465,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5_5:
+ monster "gon_test.gat",58,87,"Seiryuu, the Blue Dragon",1466,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L5_6:
+ monster "gon_test.gat",58,87,"Epidemic Devil",1433,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6:
+ menu "Tapir",L6_1,"Moat Putter",L6_2,"God of Lightning",L6_3,"Revengeing Ghost",L6_4,"Fusoushin",L6_5,"Hanmou",L6_6,"back",L0;
+ L6_1:
+ monster "gon_test.gat",58,87,"Tapir",1427,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6_2:
+ monster "gon_test.gat",58,87,"Moat Putter",1473,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6_3:
+ monster "gon_test.gat",58,87,"God of Lightning",1431,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6_4:
+ monster "gon_test.gat",58,87,"Revengeing Ghost",1446,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6_5:
+ monster "gon_test.gat",58,87,"Fusoushin",1474,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L6_6:
+ monster "gon_test.gat",58,87,"Hanmou",1471,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7:
+ menu "Cane",L7_1,"Axe",L7_2,"Big Hammer",L7_3,"Armor",L7_4,"Bow",L7_5,"Iron Bullet",L7_6,"back",L0;
+ L7_1:
+ monster "gon_test.gat",58,87,"Cane",1450,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7_2:
+ monster "gon_test.gat",58,87,"Axe",1439,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7_3:
+ monster "gon_test.gat",58,87,"Big Hammer",1461,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7_4:
+ monster "gon_test.gat",58,87,"Armor",1467,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7_5:
+ monster "gon_test.gat",58,87,"Bow",1453,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L7_6:
+ monster "gon_test.gat",58,87,"Iron Bullet",1479,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8:
+ menu "Lips",L8_1,"Tooth",L8_2,"Hair",L8_3,"The Hand",L8_4,"Muscle",L8_5,"Bone",L8_6,"back",L0;
+ L8_1:
+ monster "gon_test.gat",58,87,"Lips",1451,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8_2:
+ monster "gon_test.gat",58,87,"Tooth",1475,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8_3:
+ monster "gon_test.gat",58,87,"The Hair",1437,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8_4:
+ monster "gon_test.gat",58,87,"Hand",1441,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8_5:
+ monster "gon_test.gat",58,87,"Muscle",1476,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L8_6:
+ monster "gon_test.gat",58,87,"Bone",1435,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9:
+ menu "Ball",L9_1,"Mirror",L9_2,"Book",L9_3,"Glove",L9_4,"Bag",L9_5,"Clothes",L9_6,"back",L0;
+ L9_1:
+ monster "gon_test.gat",58,87,"Ball",1477,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9_2:
+ monster "gon_test.gat",58,87,"Mirror",1448,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9_3:
+ monster "gon_test.gat",58,87,"Book",1478,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9_4:
+ monster "gon_test.gat",58,87,"Glove",1489,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9_5:
+ monster "gon_test.gat",58,87,"Bag",1488,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L9_6:
+ monster "gon_test.gat",58,87,"Clothes",1438,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10:
+ menu "The Queen",L10_1,"Hot-Blood-Man",L10_2,"Executioner",L10_3,"Mutant Dragon",L10_4,"Syntetic Beast",L10_5,"Satan",L10_6,"back",L0;
+ L10_1:
+ monster "gon_test.gat",58,87,"The Queen",1482,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10_2:
+ monster "gon_test.gat",58,87,"Hot-Blood-Man",1464,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10_3:
+ monster "gon_test.gat",58,87,"Executioner",1487,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10_4:
+ monster "gon_test.gat",58,87,"Mutant Dragon",1449,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10_5:
+ monster "gon_test.gat",58,87,"Syntetic Beast",1456,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L10_6:
+ monster "gon_test.gat",58,87,"Satan",1486,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L11:
+ menu "Hunter",L11_1,"Assassin",L11_2,"Samurai",L11_3,"Budoka",L11_4,"Fencer",L11_5,"back",L0;
+ L11_1:
+ monster "gon_test.gat",58,87,"Hunter",1447,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L11_2:
+ monster "gon_test.gat",58,87,"Assassin",1483,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L11_3:
+ monster "gon_test.gat",58,87,"Samurai",1490,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L11_4:
+ monster "gon_test.gat",58,87,"Budoka",1484,1,"mobend::OnMobDead";set $@addmon,1;close;
+ L11_5:
+ monster "gon_test.gat",58,87,"Fencer",1485,1,"mobend::OnMobDead";set $@addmon,1;close;
+Lalready:
+ mes "[Son Yon'u]";
+ mes "The monster has been summoned already. It is only possible to summon one monster at a time. Please re-enter the arena, if you wish another opponent.";
+ close;
+LError:
+ mes "[Son Yon'u]";
+ mes "Please attend after applying formally.";
+ close;
+}
+//===============================================================================
+gon_test.gat,58,87,0 script mobend -1,{
+OnMobDead:
+ mapannounce "gon_test.gat","Summoner: Congratulations.",0;
+ stopnpctimer "gontimer";
+ addtimer 5000, "mobend::OnReturn";
+ end;
+OnReturn:
+ enablenpc "Gonryun Arena Staff";
+ donpcevent "Gonryun Arena Staff::OnInit";
+ warp "gon_test.gat",44,4;
+ end;
+}
+//===============================================================================
+gon_test.gat,70,103,4 script Gateway Staff 773,{
+ mes "[Che En'en]";
+ mes "You want to return?";
+ next;
+ menu "Return",-,"Stay",Lno;
+ mes "[Che En'en]";
+ mes "Thank you. Please come again.";
+ next;
+ warp "gon_test.gat",44,4;
+ set $@kengaku,0;
+ end;
+ Lno:
+ mes "[Che En'en]";
+ mes "Thank you. ";
+ close;
+}
+//===============================================================================
+gon_test.gat,51,90,0 script gontimer -1,{
+OnTimer1000:
+ mapannounce "gon_test.gat","Time limit is 3 Minutes from now.",8;
+ end;
+OnTimer120000:
+ mapannounce "gon_test.gat","1 minute remaining.",0;
+ end;
+OnTimer180000:
+ stopnpctimer "gontimer";
+ mapannounce "gon_test.gat","Time Limit exceeded.",0;
+ areawarp "gon_test.gat",42,82,73,91,"gon_test.gat",44,4;
+ enablenpc "Gonryun Arena Staff";
+ donpcevent "Gonryun Arena Staff::OnInit";
+ killmonsterall "gon_test.gat";
+ end;
+}
diff --git a/npc/custom/warper/warper.txt b/npc/custom/warper/warper.txt
index c9858ceda..449b74724 100644
--- a/npc/custom/warper/warper.txt
+++ b/npc/custom/warper/warper.txt
@@ -1,143 +1,143 @@
-//===== eAthena Script =======================================
-//= Warper Script
-//===== By: ==================================================
-//= Darkchild
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= Any eAthena Version;
-//===== Description: =========================================
-//= Generic warper...
-//===== Additional Comments: =================================
-//= 1.0 by Darkchild
-//= 1.1 by jabs
-//= 1.2 by Lupus (placement fixed in Amatsu)
-//= 1.3 fixed Louyang label typo, added warp and WARPRA into
-//= Nifleheim. Also sorted all names in alphabet order [Lupus]
-//= 1.4 fixed morroc warp npc overlaying kafra [Aria]
-//= 1.4a Added Ayothaya and Einbroch to list, and town Warpra's [Fredzilla]
-//= 1.4b fixed Izlude warp npc overlaying BBS [Justin84]
-//= 1.5 Added this NPC to more places [Lupus]
-//= 1.6 Rewrote a lot. Changed the sprite, some locations. [Poki#3]
-//= TODO Add an option for selecting the level of the dungeon. [Poki#3]
-//= 1.7 Temporary? Added F_ClearGarbage to clear unused/outdated variables [Lupus]
-//= 1.8 Removed Duplicates [Silent]
-//============================================================
-//============================================================
-//= To allow selecting the Level of the Dungeon you want to
-//= Warp to set the @lvlselect variable to 1 (Not implemented yet!)
-//============================================================
-
-- script Warp Agent#01::warpra 859,{
-// set @lvlselect,0;
-
- callfunc "F_ClearGarbage"; //Clear outdated, unused variables
-
- mes "[Warp Agent]";
- mes "Hello,";
- mes "I can teleport you to any Town or Dungeon!";
- mes "Were do you want to go?";
- next;
- menu "To a Town",-,"To a Dungeon",L_dungeon;
- next;
- mes "[Warp Agent]";
- mes "Please select your destination.";
- next;
- menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Ayothaya",wayothaya,"Comodo",wcomodo,"Einbroch",weinbroch,"Einbech",weinbech,"Geffen",wgeffen,"Gonryun",wgonryun,"Hugel",whugel,"Izlude",wizlude,"Lighthalzen",wlighthalzen,"Louyang",wlouyang,"Lutie",wxmas,"Morroc",wmorroc,"Payon",wpayon,"Prontera",wprontera,"Umbala",wumbala,"Yuno",wyuno;
-L_dungeon:
- mes "[Warp Agent]";
- mes "Please select your destination.";
- next;
- menu "Abyss Lake",dabbys,"Amatsu Dungeon",damatsu,"Anthell",dant,"Ayothaya Dungeon",dayothaya,"Bibilan Dungeon",dbibilan,"Coal Mine (Dead Pit)",dcoal,"Culvert",dculvert,"Einbech Dungeon",dein,"Glast Heim",dglast,"Gonryun Dungeon",dgonryun,"Juperos",djuperos,"Lighthalzen Bio Lab",dlighthalzen,"Magma Dungeon",dmagma,"Niflheim",dniflheim,"Odin Temple",dodin,"Orc Dungeon",dorc,"Payon Dungeon",dpayon,"Pyramids",dpyramids,"Sphinx",dsphinx,"Sunken Ship",dsunken,"Thanatos Tower",dthanatos,"Turtle Dungeon",dturtle;
-
-
-//----------------Towns----------------\\
-walberta: warp "alberta.gat", 27, 236; end;
-waldebaran: warp "aldebaran.gat", 145, 120; end;
-wamatsu: warp "amatsu.gat", 197, 86; end;
-wayothaya: warp "ayothaya.gat", 149, 118; end;
-wcomodo: warp "comodo.gat", 188, 161; end;
-weinbroch: warp "einbroch.gat", 64, 200; end;
-weinbech: warp "einbech.gat", 70, 95; end;
-wgeffen: warp "geffen.gat", 119, 66; end;
-wgonryun: warp "gonryun.gat", 150, 130; end;
-whugel: warp "hugel.gat", 96, 145; end;
-wizlude: warp "izlude.gat", 128, 111; end;
-wlighthalzen: warp "lighthalzen.gat", 158, 92; end;
-wlouyang: warp "louyang.gat", 210, 108; end;
-wmorroc: warp "morocc.gat", 159, 93; end;
-wprontera: warp "prontera.gat", 156, 187; end;
-wpayon: warp "payon.gat", 152, 75; end;
-wumbala: warp "umbala.gat", 130, 130; end;
-wxmas: warp "xmas.gat", 148, 131; end;
-wyuno: warp "yuno.gat", 160, 168; end;
-
-//----------------Dungeons----------------\\
-dabbys: warp "hu_fild05.gat", 189, 207; end;
-damatsu: warp "ama_dun01.gat", 229, 12; end;
-dant: warp "moc_fild04.gat", 210, 328; end;
-dayothaya: warp "ayo_fild02.gat", 280, 149; end;
-dbibilan: warp "izlu2dun.gat", 106, 88; end;
-dculvert: warp "prt_sewb1.gat", 126, 248; end;
-dcoal: warp "mjolnir_02.gat", 81, 359; end;
-dein: warp "einbech.gat", 135, 249; end;
-dglast: warp "glast_01.gat", 368, 303; end;
-dgonryun: warp "gonryun.gat", 160, 195; end;
-djuperos: warp "yuno_fild07.gat", 218, 176; end;
-dlighthalzen: warp "lighthalzen.gat", 158, 285; end;
-dmagma: warp "yuno_fild03.gat", 39, 140; end;
-dniflheim: warp "niflheim.gat", 35, 161; end;
-dodin: warp "odin_tem01.gat", 98, 144; end;
-dorc: warp "gef_fild10.gat", 70, 332; end;
-dpayon: warp "pay_arche.gat", 43, 132; end;
-dpyramids: warp "moc_ruins.gat", 62, 162; end;
-dsphinx: warp "moc_fild19.gat", 107, 100; end;
-dsunken: warp "alb2trea.gat", 75, 98; end;
-dthanatos: warp "tha_scene01.gat", 131, 223; end;
-dturtle: warp "tur_dun01.gat", 149, 238; end;
-}
-
-//----------------Towns----------------\\
-alberta.gat,31,240,4 duplicate(warpra) Warp Agent#02 859
-aldebaran.gat,145,118,4 duplicate(warpra) Warp Agent#03 859
-amatsu.gat,192,81,1 duplicate(warpra) Warp Agent#04 859
-ayothaya.gat,144,117,6 duplicate(warpra) Warp Agent#05 859
-comodo.gat,194,158,4 duplicate(warpra) Warp Agent#06 859
-einbroch.gat,59,205,4 duplicate(warpra) Warp Agent#07 859
-einbroch.gat,243,189,2 duplicate(warpra) Warp Agent#08 859
-einbech.gat,135,249,4 duplicate(warpra) Warp Agent#09 859
-geffen.gat,115,66,4 duplicate(warpra) Warp Agent#10 859
-gonryun.gat,151,130,4 duplicate(warpra) Warp Agent#11 859
-izlude.gat,133,117,4 duplicate(warpra) Warp Agent#12 859
-hugel.gat,88,151,5 duplicate(warpra) Warp Agent#13 859
-lighthalzen.gat,155,79,6 duplicate(warpra) Warp Agent#14 859
-louyang.gat,210,106,4 duplicate(warpra) Warp Agent#15 859
-morocc.gat,156,95,4 duplicate(warpra) Warp Agent#16 859
-prontera.gat,161,192,4 duplicate(warpra) Warp Agent#17 859
-payon.gat,182,110,4 duplicate(warpra) Warp Agent#18 859
-umbala.gat,132,130,4 duplicate(warpra) Warp Agent#19 859
-xmas.gat,150,136,4 duplicate(warpra) Warp Agent#20 859
-yuno.gat,137,162,4 duplicate(warpra) Warp Agent#21 859
-
-//----------------Dungeons----------------\\
-ama_dun01.gat,233,9,1 duplicate(warpra) Warp Agent#22 859
-moc_fild04.gat,207,331,4 duplicate(warpra) Warp Agent#23 859
-ayo_fild02.gat,279,154,4 duplicate(warpra) Warp Agent#24 859
-izlu2dun.gat,104,82,4 duplicate(warpra) Warp Agent#25 859
-prt_sewb1.gat,125,253,4 duplicate(warpra) Warp Agent#26 859
-mjolnir_02.gat,85,363,4 duplicate(warpra) Warp Agent#27 859
-einbech.gat,81,101,1 duplicate(warpra) Warp Agent#28 859
-glast_01.gat,370,308,4 duplicate(warpra) Warp Agent#29 859
-yuno_fild03.gat,37,135,4 duplicate(warpra) Warp Agent#30 859
-niflheim.gat,32,161,4 duplicate(warpra) Warp Agent#31 859
-gef_fild10.gat,71,339,4 duplicate(warpra) Warp Agent#32 859
-pay_arche.gat,39,135,4 duplicate(warpra) Warp Agent#33 859
-moc_ruins.gat,64,166,4 duplicate(warpra) Warp Agent#34 859
-moc_fild19.gat,106,97,4 duplicate(warpra) Warp Agent#35 859
-alb2trea.gat,73,101,4 duplicate(warpra) Warp Agent#36 859
-tur_dun01.gat,148,239,4 duplicate(warpra) Warp Agent#37 859
-lhz_dun01.gat,157,285,4 duplicate(warpra) Warp Agent#38 859
-hu_fild05.gat,186,210,4 duplicate(warpra) Warp Agent#39 859
-yuno_fild07.gat,221,179,4 duplicate(warpra) Warp Agent#40 859
-tha_scene01.gat,139,194,1 duplicate(warpra) Warp Agent#41 859
-odin_tem01.gat,96,149,4 duplicate(warpra) Warp Agent#42 859
+//===== eAthena Script =======================================
+//= Warper Script
+//===== By: ==================================================
+//= Darkchild
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= Any eAthena Version;
+//===== Description: =========================================
+//= Generic warper...
+//===== Additional Comments: =================================
+//= 1.0 by Darkchild
+//= 1.1 by jabs
+//= 1.2 by Lupus (placement fixed in Amatsu)
+//= 1.3 fixed Louyang label typo, added warp and WARPRA into
+//= Nifleheim. Also sorted all names in alphabet order [Lupus]
+//= 1.4 fixed morroc warp npc overlaying kafra [Aria]
+//= 1.4a Added Ayothaya and Einbroch to list, and town Warpra's [Fredzilla]
+//= 1.4b fixed Izlude warp npc overlaying BBS [Justin84]
+//= 1.5 Added this NPC to more places [Lupus]
+//= 1.6 Rewrote a lot. Changed the sprite, some locations. [Poki#3]
+//= TODO Add an option for selecting the level of the dungeon. [Poki#3]
+//= 1.7 Temporary? Added F_ClearGarbage to clear unused/outdated variables [Lupus]
+//= 1.8 Removed Duplicates [Silent]
+//============================================================
+//============================================================
+//= To allow selecting the Level of the Dungeon you want to
+//= Warp to set the @lvlselect variable to 1 (Not implemented yet!)
+//============================================================
+
+- script Warp Agent#01::warpra 859,{
+// set @lvlselect,0;
+
+ callfunc "F_ClearGarbage"; //Clear outdated, unused variables
+
+ mes "[Warp Agent]";
+ mes "Hello,";
+ mes "I can teleport you to any Town or Dungeon!";
+ mes "Were do you want to go?";
+ next;
+ menu "To a Town",-,"To a Dungeon",L_dungeon;
+ next;
+ mes "[Warp Agent]";
+ mes "Please select your destination.";
+ next;
+ menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Ayothaya",wayothaya,"Comodo",wcomodo,"Einbroch",weinbroch,"Einbech",weinbech,"Geffen",wgeffen,"Gonryun",wgonryun,"Hugel",whugel,"Izlude",wizlude,"Lighthalzen",wlighthalzen,"Louyang",wlouyang,"Lutie",wxmas,"Morroc",wmorroc,"Payon",wpayon,"Prontera",wprontera,"Umbala",wumbala,"Yuno",wyuno;
+L_dungeon:
+ mes "[Warp Agent]";
+ mes "Please select your destination.";
+ next;
+ menu "Abyss Lake",dabbys,"Amatsu Dungeon",damatsu,"Anthell",dant,"Ayothaya Dungeon",dayothaya,"Bibilan Dungeon",dbibilan,"Coal Mine (Dead Pit)",dcoal,"Culvert",dculvert,"Einbech Dungeon",dein,"Glast Heim",dglast,"Gonryun Dungeon",dgonryun,"Juperos",djuperos,"Lighthalzen Bio Lab",dlighthalzen,"Magma Dungeon",dmagma,"Niflheim",dniflheim,"Odin Temple",dodin,"Orc Dungeon",dorc,"Payon Dungeon",dpayon,"Pyramids",dpyramids,"Sphinx",dsphinx,"Sunken Ship",dsunken,"Thanatos Tower",dthanatos,"Turtle Dungeon",dturtle;
+
+
+//----------------Towns----------------\\
+walberta: warp "alberta.gat", 27, 236; end;
+waldebaran: warp "aldebaran.gat", 145, 120; end;
+wamatsu: warp "amatsu.gat", 197, 86; end;
+wayothaya: warp "ayothaya.gat", 149, 118; end;
+wcomodo: warp "comodo.gat", 188, 161; end;
+weinbroch: warp "einbroch.gat", 64, 200; end;
+weinbech: warp "einbech.gat", 70, 95; end;
+wgeffen: warp "geffen.gat", 119, 66; end;
+wgonryun: warp "gonryun.gat", 150, 130; end;
+whugel: warp "hugel.gat", 96, 145; end;
+wizlude: warp "izlude.gat", 128, 111; end;
+wlighthalzen: warp "lighthalzen.gat", 158, 92; end;
+wlouyang: warp "louyang.gat", 210, 108; end;
+wmorroc: warp "morocc.gat", 159, 93; end;
+wprontera: warp "prontera.gat", 156, 187; end;
+wpayon: warp "payon.gat", 152, 75; end;
+wumbala: warp "umbala.gat", 130, 130; end;
+wxmas: warp "xmas.gat", 148, 131; end;
+wyuno: warp "yuno.gat", 160, 168; end;
+
+//----------------Dungeons----------------\\
+dabbys: warp "hu_fild05.gat", 189, 207; end;
+damatsu: warp "ama_dun01.gat", 229, 12; end;
+dant: warp "moc_fild04.gat", 210, 328; end;
+dayothaya: warp "ayo_fild02.gat", 280, 149; end;
+dbibilan: warp "izlu2dun.gat", 106, 88; end;
+dculvert: warp "prt_sewb1.gat", 126, 248; end;
+dcoal: warp "mjolnir_02.gat", 81, 359; end;
+dein: warp "einbech.gat", 135, 249; end;
+dglast: warp "glast_01.gat", 368, 303; end;
+dgonryun: warp "gonryun.gat", 160, 195; end;
+djuperos: warp "yuno_fild07.gat", 218, 176; end;
+dlighthalzen: warp "lighthalzen.gat", 158, 285; end;
+dmagma: warp "yuno_fild03.gat", 39, 140; end;
+dniflheim: warp "niflheim.gat", 35, 161; end;
+dodin: warp "odin_tem01.gat", 98, 144; end;
+dorc: warp "gef_fild10.gat", 70, 332; end;
+dpayon: warp "pay_arche.gat", 43, 132; end;
+dpyramids: warp "moc_ruins.gat", 62, 162; end;
+dsphinx: warp "moc_fild19.gat", 107, 100; end;
+dsunken: warp "alb2trea.gat", 75, 98; end;
+dthanatos: warp "tha_scene01.gat", 131, 223; end;
+dturtle: warp "tur_dun01.gat", 149, 238; end;
+}
+
+//----------------Towns----------------\\
+alberta.gat,31,240,4 duplicate(warpra) Warp Agent#02 859
+aldebaran.gat,145,118,4 duplicate(warpra) Warp Agent#03 859
+amatsu.gat,192,81,1 duplicate(warpra) Warp Agent#04 859
+ayothaya.gat,144,117,6 duplicate(warpra) Warp Agent#05 859
+comodo.gat,194,158,4 duplicate(warpra) Warp Agent#06 859
+einbroch.gat,59,205,4 duplicate(warpra) Warp Agent#07 859
+einbroch.gat,243,189,2 duplicate(warpra) Warp Agent#08 859
+einbech.gat,135,249,4 duplicate(warpra) Warp Agent#09 859
+geffen.gat,115,66,4 duplicate(warpra) Warp Agent#10 859
+gonryun.gat,151,130,4 duplicate(warpra) Warp Agent#11 859
+izlude.gat,133,117,4 duplicate(warpra) Warp Agent#12 859
+hugel.gat,88,151,5 duplicate(warpra) Warp Agent#13 859
+lighthalzen.gat,155,79,6 duplicate(warpra) Warp Agent#14 859
+louyang.gat,210,106,4 duplicate(warpra) Warp Agent#15 859
+morocc.gat,156,95,4 duplicate(warpra) Warp Agent#16 859
+prontera.gat,161,192,4 duplicate(warpra) Warp Agent#17 859
+payon.gat,182,110,4 duplicate(warpra) Warp Agent#18 859
+umbala.gat,132,130,4 duplicate(warpra) Warp Agent#19 859
+xmas.gat,150,136,4 duplicate(warpra) Warp Agent#20 859
+yuno.gat,137,162,4 duplicate(warpra) Warp Agent#21 859
+
+//----------------Dungeons----------------\\
+ama_dun01.gat,233,9,1 duplicate(warpra) Warp Agent#22 859
+moc_fild04.gat,207,331,4 duplicate(warpra) Warp Agent#23 859
+ayo_fild02.gat,279,154,4 duplicate(warpra) Warp Agent#24 859
+izlu2dun.gat,104,82,4 duplicate(warpra) Warp Agent#25 859
+prt_sewb1.gat,125,253,4 duplicate(warpra) Warp Agent#26 859
+mjolnir_02.gat,85,363,4 duplicate(warpra) Warp Agent#27 859
+einbech.gat,81,101,1 duplicate(warpra) Warp Agent#28 859
+glast_01.gat,370,308,4 duplicate(warpra) Warp Agent#29 859
+yuno_fild03.gat,37,135,4 duplicate(warpra) Warp Agent#30 859
+niflheim.gat,32,161,4 duplicate(warpra) Warp Agent#31 859
+gef_fild10.gat,71,339,4 duplicate(warpra) Warp Agent#32 859
+pay_arche.gat,39,135,4 duplicate(warpra) Warp Agent#33 859
+moc_ruins.gat,64,166,4 duplicate(warpra) Warp Agent#34 859
+moc_fild19.gat,106,97,4 duplicate(warpra) Warp Agent#35 859
+alb2trea.gat,73,101,4 duplicate(warpra) Warp Agent#36 859
+tur_dun01.gat,148,239,4 duplicate(warpra) Warp Agent#37 859
+lhz_dun01.gat,157,285,4 duplicate(warpra) Warp Agent#38 859
+hu_fild05.gat,186,210,4 duplicate(warpra) Warp Agent#39 859
+yuno_fild07.gat,221,179,4 duplicate(warpra) Warp Agent#40 859
+tha_scene01.gat,139,194,1 duplicate(warpra) Warp Agent#41 859
+odin_tem01.gat,96,149,4 duplicate(warpra) Warp Agent#42 859
diff --git a/npc/eamobs/Whats done.txt b/npc/eamobs/Whats done.txt
index 58b812468..6c208ebd8 100644
--- a/npc/eamobs/Whats done.txt
+++ b/npc/eamobs/Whats done.txt
@@ -1,61 +1,61 @@
-The "Mobs" folder contains the official spawns
-The "eA Mobs" folder is modified for eAthena in an attempt to have more balanced/fair spawns.
-
-This is a list of what files are modified, and what are not, just so you don't have to go searching all the files for that info.
-The [Modified] tag tells that the file is changed, compared to the official spawn.
-The [Approved] tag tells that the file in not modified, but has been approved as being balanced/fair.
-The [Not Approved] tag tells that the file in not modified and has not yet been approved.
-
---== Fields ==--
-amatsu - [Not Approved]
-ayothaya - [Not Approved]
-comodo - [Modified]
-einbroch - [Not Approved]
-geffen - [Not Approved]
-gonryun - [Not Approved]
-hugel - [Not Approved]
-jawaii - [Not Approved]
-lighthalzen - [Not Approved]
-louyang - [Not Approved]
-lutie - [Not Approved]
-mjolnir - [Modified]
-morocc - [Not Approved]
-niflheim - [Not Approved]
-odin - [Not Approved]
-payon - [Not Approved]
-prontera - [Not Approved]
-umbala - [Modified]
-yuno - [Not Approved]
-
---== Dungeons ==--
-amatdun - [Not Approved]
-anthell - [Not Approved]
-ayodun - [Not Approved]
-abyss - [Not Approved]
-beachdun - [Not Approved]
-byalan - [Modified]
-clocktower - [Modified]
-coalmine - [Modified]
-eindun - [Not Approved]
-gefenia - [Not Approved]
-geftower - [Modified]
-glastheim - [Modified]
-gondun - [Not Approved]
-guilddun - [Not Approved]
-jupedun - [Modified]
-kiel - [Not Approved]
-lhzdun - [Not Approved]
-louydun - [Not Approved]
-magmadun - [Not Approved]
-moc_pyramid - [Modified]
-moc_sphinx - [Modified]
-orcdun - [Not Approved]
-payoncave - [Not Approved]
-pront_maze - [Not Approved]
-pront_sewers - [Not Approved]
-sunkenship - [Modified]
-thanatos - [Not Approved]
-toyfactory - [Not Approved]
-turtleisland - [Not Approved]
-umbaladun - [Not Approved]
-yggdrasil - [Not Approved]
+The "Mobs" folder contains the official spawns
+The "eA Mobs" folder is modified for eAthena in an attempt to have more balanced/fair spawns.
+
+This is a list of what files are modified, and what are not, just so you don't have to go searching all the files for that info.
+The [Modified] tag tells that the file is changed, compared to the official spawn.
+The [Approved] tag tells that the file in not modified, but has been approved as being balanced/fair.
+The [Not Approved] tag tells that the file in not modified and has not yet been approved.
+
+--== Fields ==--
+amatsu - [Not Approved]
+ayothaya - [Not Approved]
+comodo - [Modified]
+einbroch - [Not Approved]
+geffen - [Not Approved]
+gonryun - [Not Approved]
+hugel - [Not Approved]
+jawaii - [Not Approved]
+lighthalzen - [Not Approved]
+louyang - [Not Approved]
+lutie - [Not Approved]
+mjolnir - [Modified]
+morocc - [Not Approved]
+niflheim - [Not Approved]
+odin - [Not Approved]
+payon - [Not Approved]
+prontera - [Not Approved]
+umbala - [Modified]
+yuno - [Not Approved]
+
+--== Dungeons ==--
+amatdun - [Not Approved]
+anthell - [Not Approved]
+ayodun - [Not Approved]
+abyss - [Not Approved]
+beachdun - [Not Approved]
+byalan - [Modified]
+clocktower - [Modified]
+coalmine - [Modified]
+eindun - [Not Approved]
+gefenia - [Not Approved]
+geftower - [Modified]
+glastheim - [Modified]
+gondun - [Not Approved]
+guilddun - [Not Approved]
+jupedun - [Modified]
+kiel - [Not Approved]
+lhzdun - [Not Approved]
+louydun - [Not Approved]
+magmadun - [Not Approved]
+moc_pyramid - [Modified]
+moc_sphinx - [Modified]
+orcdun - [Not Approved]
+payoncave - [Not Approved]
+pront_maze - [Not Approved]
+pront_sewers - [Not Approved]
+sunkenship - [Modified]
+thanatos - [Not Approved]
+toyfactory - [Not Approved]
+turtleisland - [Not Approved]
+umbaladun - [Not Approved]
+yggdrasil - [Not Approved]
diff --git a/npc/eamobs/dungeons/byalan.txt b/npc/eamobs/dungeons/byalan.txt
index a25a94952..eb5e0fa84 100644
--- a/npc/eamobs/dungeons/byalan.txt
+++ b/npc/eamobs/dungeons/byalan.txt
@@ -1,110 +1,110 @@
-//===== eAthena Script =======================================
-//= Byalan Island Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// iz_dun00 - Undersea Tunnel F1
-//==================================================
-iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
-iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
-iz_dun00.gat,0,0,0,0 monster Kukre 1070,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Vadon 1066,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-
-//==================================================
-// iz_dun01 - Undersea Tunnel F2
-//==================================================
-iz_dun01.gat,0,0,0,0 monster Vadon 1066,50,0,0,0
-iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
-iz_dun01.gat,0,0,0,0 monster Marina 1141,15,0,0,0
-iz_dun01.gat,0,0,0,0 monster Cornutus 1067,15,300000,150000,1
-iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
-iz_dun01.gat,0,0,0,0 monster Thara Frog 1034,20,0,0,0
-iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
-
-//==================================================
-// iz_dun02 - Undersea Tunnel F3
-//==================================================
-iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
-iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
-iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
-
-//==================================================
-// iz_dun03 - Undersea Tunnel F4
-//==================================================
-iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
-iz_dun03.gat,0,0,0,0 monster Marc 1045,40,0,0,0
-iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
-iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
-iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,612000,300000,0
-iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,623000,300000,0
-iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,617000,300000,0
-iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,623000,300000,0
-iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,605000,300000,0
-iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,604000,300000,0
-iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,602000,300000,0
-iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,610000,300000,0
-iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,609000,300000,0
-iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,613000,300000,0
-iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,621000,300000,0
-iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,616000,300000,0
-iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,596000,300000,0
-iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,582000,300000,0
-iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,610000,300000,0
-iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,605000,300000,0
-iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,608000,300000,0
-iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,621000,300000,0
-iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
-iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
-
-//==================================================
-// iz_dun04 - Undersea Tunnel F5
-//==================================================
-iz_dun04.gat,0,0,0,0 monster Merman 1264,50,0,0,0
-iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,10,0,0,0
-iz_dun04.gat,0,0,0,0 monster Swordfish 1069,10,0,0,0
-iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,605000,300000,0
-iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,612000,300000,0
-iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,606000,300000,0
-iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,608000,300000,0
-iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,621000,300000,0
-iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,594000,300000,0
-iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,602000,300000,0
-iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,618000,300000,0
-iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,603000,300000,0
-iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,621000,300000,0
-iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,600000,300000,0
-iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,605000,300000,0
-iz_dun04.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,1
-iz_dun04.gat,0,0,0,0 monster Strouf 1065,50,0,0,0
-iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,1200000,600000,0
+//===== eAthena Script =======================================
+//= Byalan Island Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// iz_dun00 - Undersea Tunnel F1
+//==================================================
+iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
+iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
+iz_dun00.gat,0,0,0,0 monster Kukre 1070,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Vadon 1066,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+
+//==================================================
+// iz_dun01 - Undersea Tunnel F2
+//==================================================
+iz_dun01.gat,0,0,0,0 monster Vadon 1066,50,0,0,0
+iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
+iz_dun01.gat,0,0,0,0 monster Marina 1141,15,0,0,0
+iz_dun01.gat,0,0,0,0 monster Cornutus 1067,15,300000,150000,1
+iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
+iz_dun01.gat,0,0,0,0 monster Thara Frog 1034,20,0,0,0
+iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
+
+//==================================================
+// iz_dun02 - Undersea Tunnel F3
+//==================================================
+iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
+iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
+iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
+
+//==================================================
+// iz_dun03 - Undersea Tunnel F4
+//==================================================
+iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
+iz_dun03.gat,0,0,0,0 monster Marc 1045,40,0,0,0
+iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
+iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
+iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,612000,300000,0
+iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,623000,300000,0
+iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,617000,300000,0
+iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,623000,300000,0
+iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,605000,300000,0
+iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,604000,300000,0
+iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,602000,300000,0
+iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,610000,300000,0
+iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,609000,300000,0
+iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,613000,300000,0
+iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,621000,300000,0
+iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,616000,300000,0
+iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,596000,300000,0
+iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,582000,300000,0
+iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,610000,300000,0
+iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,605000,300000,0
+iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,608000,300000,0
+iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,621000,300000,0
+iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
+iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
+
+//==================================================
+// iz_dun04 - Undersea Tunnel F5
+//==================================================
+iz_dun04.gat,0,0,0,0 monster Merman 1264,50,0,0,0
+iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,10,0,0,0
+iz_dun04.gat,0,0,0,0 monster Swordfish 1069,10,0,0,0
+iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,605000,300000,0
+iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,612000,300000,0
+iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,606000,300000,0
+iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,608000,300000,0
+iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,621000,300000,0
+iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,594000,300000,0
+iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,602000,300000,0
+iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,618000,300000,0
+iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,603000,300000,0
+iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,621000,300000,0
+iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,600000,300000,0
+iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,605000,300000,0
+iz_dun04.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,1
+iz_dun04.gat,0,0,0,0 monster Strouf 1065,50,0,0,0
+iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,1200000,600000,0
diff --git a/npc/eamobs/dungeons/clocktower.txt b/npc/eamobs/dungeons/clocktower.txt
index 141d7253f..0a3a15965 100644
--- a/npc/eamobs/dungeons/clocktower.txt
+++ b/npc/eamobs/dungeons/clocktower.txt
@@ -1,161 +1,161 @@
-//===== eAthena Script =======================================
-//= Clock Tower Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// alde_dun01 - Clock Tower B1
-//==================================================
-alde_dun01.gat,0,0,0,0 monster Arclouse 1194,25,0,0,0
-alde_dun01.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-alde_dun01.gat,0,0,0,0 monster Stem Worm 1215,25,0,0,0
-alde_dun01.gat,0,0,0,0 monster Ambernite 1094,10,0,0,0
-alde_dun01.gat,0,0,0,0 monster Brilight 1211,10,0,0,0
-
-//==================================================
-// alde_dun02 - Clock Tower B2
-//==================================================
-alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
-alde_dun02.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-
-//==================================================
-// alde_dun03 - Clock Tower B3
-//==================================================
-alde_dun03.gat,0,0,0,0 monster Cramp 1209,28,0,0,0
-alde_dun03.gat,77,28,5,5 monster Cramp 1209,2,600000,300000,0
-alde_dun03.gat,184,61,30,30 monster Cramp 1209,5,600000,300000,0
-alde_dun03.gat,130,220,40,40 monster Cramp 1209,5,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Cramp 1209,2,600000,300000,0
-alde_dun03.gat,126,53,20,20 monster Cramp 1209,3,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Drainliar 1111,22,0,0,0
-alde_dun03.gat,184,61,30,30 monster Drainliar 1111,5,600000,300000,0
-alde_dun03.gat,126,53,20,20 monster Drainliar 1111,3,600000,300000,0
-alde_dun03.gat,130,220,40,40 monster Drainliar 1111,5,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Drainliar 1111,5,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,47,600000,300000,0
-alde_dun03.gat,163,56,10,10 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,168,42,6,6 monster Penomena 1216,1,600000,300000,0
-alde_dun03.gat,147,30,8,8 monster Penomena 1216,1,600000,300000,0
-alde_dun03.gat,102,40,10,10 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,155,201,25,25 monster Penomena 1216,4,600000,300000,0
-alde_dun03.gat,160,181,8,8 monster Penomena 1216,1,600000,300000,0
-alde_dun03.gat,179,166,6,6 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,142,157,8,8 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,135,140,8,8 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Brilight 1211,35,0,0,0
-
-//==================================================
-// alde_dun04 - Clock Tower B4
-//==================================================
-alde_dun04.gat,0,0,0,0 monster Bathory 1102,40,0,0,0
-alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
-alde_dun04.gat,0,0,0,0 monster Tyrfing 1204,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Anolian 1206,10,0,0,0
-
-//==================================================
-// c_tower1 - Clock Tower F1
-//==================================================
-c_tower1.gat,0,0,0,0 monster Punk 1199,50,0,0,0
-c_tower1.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
-c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower1.gat,0,0,0,0 monster Bathory 1102,16,0,0,0
-c_tower1.gat,0,0,0,0 monster Archer Skeleton 1016,30,0,0,0
-c_tower1.gat,0,0,0,0 monster Baphomet Jr. 1101,15,0,0,0
-
-//==================================================
-// c_tower2 - Clock Tower F2
-//==================================================
-c_tower2.gat,0,0,0,0 monster Punk 1199,20,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock 1269,35,0,0,0
-c_tower2.gat,0,0,0,0 monster Rideword 1195,5,0,0,0
-c_tower2.gat,128,100,10,10 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,1200000,600000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,1200000,600000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower2.gat,0,0,0,0 monster Elder 1377,2,3600000,1800000,0
-c_tower2.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
-c_tower2.gat,0,0,0,0 monster Deviruchi 1109,10,0,0,0
-
-//==================================================
-// c_tower3 - Clock Tower F3
-//==================================================
-c_tower3.gat,0,0,0,0 monster Alarm 1193,50,0,0,0
-c_tower3.gat,0,0,0,0 monster Rideword 1195,9,0,0,0
-c_tower3.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower3.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
-c_tower3.gat,0,0,0,0 monster Horong 1129,10,0,0,0
-c_tower3.gat,153,220,10,10 monster Rideword 1195,1,726000,300000,0
-
-//==================================================
-// c_tower4 - Clock Tower F4
-//==================================================
-c_tower4.gat,108,198,100,10 monster Alarm 1193,6,600000,300000,0
-c_tower4.gat,108,178,100,10 monster Alarm 1193,6,600000,300000,0
-c_tower4.gat,108,158,100,10 monster Alarm 1193,6,600000,300000,0
-c_tower4.gat,108,138,100,10 monster Alarm 1193,6,600000,300000,0
-c_tower4.gat,108,118,100,10 monster Alarm 1193,6,600000,300000,0
-c_tower4.gat,108,98,100,10 monster Clock 1269,7,600000,300000,0
-c_tower4.gat,108,78,100,10 monster Clock 1269,7,600000,300000,0
-c_tower4.gat,108,58,100,10 monster Clock 1269,7,600000,300000,0
-c_tower4.gat,108,38,100,10 monster Clock 1269,7,600000,300000,0
-c_tower4.gat,108,18,100,10 monster Clock 1269,7,600000,300000,0
-c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,600000,300000,0
-c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
-c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,3,1800000,0,0
-c_tower4.gat,98,180,0,0 monster Rideword 1195,1,600000,300000,1
-c_tower4.gat,97,180,0,0 monster Rideword 1195,1,540000,300000,1
-c_tower4.gat,96,180,0,0 monster Rideword 1195,1,650000,300000,1
-c_tower4.gat,95,180,0,0 monster Rideword 1195,1,710000,300000,1
-c_tower4.gat,94,180,0,0 monster Rideword 1195,1,620000,300000,1
-c_tower4.gat,93,180,0,0 monster Rideword 1195,1,560000,300000,1
-c_tower4.gat,92,180,0,0 monster Rideword 1195,1,580000,300000,1
-c_tower4.gat,91,180,0,0 monster Rideword 1195,1,630000,300000,1
-c_tower4.gat,87,180,0,0 monster Rideword 1195,1,700000,300000,1
-c_tower4.gat,86,180,0,0 monster Rideword 1195,1,680000,300000,1
-c_tower4.gat,80,179,0,0 monster Rideword 1195,1,660000,300000,1
-c_tower4.gat,80,180,0,0 monster Rideword 1195,1,650000,300000,1
-c_tower4.gat,80,181,0,0 monster Rideword 1195,1,590000,300000,1
-c_tower4.gat,80,182,0,0 monster Rideword 1195,1,600000,300000,1
-c_tower4.gat,80,183,0,0 monster Rideword 1195,1,640000,300000,1
-c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,201,109,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,0,0,0,0 monster Elder 1377,2,3600000,1800000,1
-c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Clock Tower Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// alde_dun01 - Clock Tower B1
+//==================================================
+alde_dun01.gat,0,0,0,0 monster Arclouse 1194,25,0,0,0
+alde_dun01.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+alde_dun01.gat,0,0,0,0 monster Stem Worm 1215,25,0,0,0
+alde_dun01.gat,0,0,0,0 monster Ambernite 1094,10,0,0,0
+alde_dun01.gat,0,0,0,0 monster Brilight 1211,10,0,0,0
+
+//==================================================
+// alde_dun02 - Clock Tower B2
+//==================================================
+alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
+alde_dun02.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+
+//==================================================
+// alde_dun03 - Clock Tower B3
+//==================================================
+alde_dun03.gat,0,0,0,0 monster Cramp 1209,28,0,0,0
+alde_dun03.gat,77,28,5,5 monster Cramp 1209,2,600000,300000,0
+alde_dun03.gat,184,61,30,30 monster Cramp 1209,5,600000,300000,0
+alde_dun03.gat,130,220,40,40 monster Cramp 1209,5,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Cramp 1209,2,600000,300000,0
+alde_dun03.gat,126,53,20,20 monster Cramp 1209,3,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Drainliar 1111,22,0,0,0
+alde_dun03.gat,184,61,30,30 monster Drainliar 1111,5,600000,300000,0
+alde_dun03.gat,126,53,20,20 monster Drainliar 1111,3,600000,300000,0
+alde_dun03.gat,130,220,40,40 monster Drainliar 1111,5,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Drainliar 1111,5,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,47,600000,300000,0
+alde_dun03.gat,163,56,10,10 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,168,42,6,6 monster Penomena 1216,1,600000,300000,0
+alde_dun03.gat,147,30,8,8 monster Penomena 1216,1,600000,300000,0
+alde_dun03.gat,102,40,10,10 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,155,201,25,25 monster Penomena 1216,4,600000,300000,0
+alde_dun03.gat,160,181,8,8 monster Penomena 1216,1,600000,300000,0
+alde_dun03.gat,179,166,6,6 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,142,157,8,8 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,135,140,8,8 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Brilight 1211,35,0,0,0
+
+//==================================================
+// alde_dun04 - Clock Tower B4
+//==================================================
+alde_dun04.gat,0,0,0,0 monster Bathory 1102,40,0,0,0
+alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
+alde_dun04.gat,0,0,0,0 monster Tyrfing 1204,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Anolian 1206,10,0,0,0
+
+//==================================================
+// c_tower1 - Clock Tower F1
+//==================================================
+c_tower1.gat,0,0,0,0 monster Punk 1199,50,0,0,0
+c_tower1.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
+c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower1.gat,0,0,0,0 monster Bathory 1102,16,0,0,0
+c_tower1.gat,0,0,0,0 monster Archer Skeleton 1016,30,0,0,0
+c_tower1.gat,0,0,0,0 monster Baphomet Jr. 1101,15,0,0,0
+
+//==================================================
+// c_tower2 - Clock Tower F2
+//==================================================
+c_tower2.gat,0,0,0,0 monster Punk 1199,20,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock 1269,35,0,0,0
+c_tower2.gat,0,0,0,0 monster Rideword 1195,5,0,0,0
+c_tower2.gat,128,100,10,10 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,1200000,600000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,1200000,600000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower2.gat,0,0,0,0 monster Elder 1377,2,3600000,1800000,0
+c_tower2.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
+c_tower2.gat,0,0,0,0 monster Deviruchi 1109,10,0,0,0
+
+//==================================================
+// c_tower3 - Clock Tower F3
+//==================================================
+c_tower3.gat,0,0,0,0 monster Alarm 1193,50,0,0,0
+c_tower3.gat,0,0,0,0 monster Rideword 1195,9,0,0,0
+c_tower3.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower3.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
+c_tower3.gat,0,0,0,0 monster Horong 1129,10,0,0,0
+c_tower3.gat,153,220,10,10 monster Rideword 1195,1,726000,300000,0
+
+//==================================================
+// c_tower4 - Clock Tower F4
+//==================================================
+c_tower4.gat,108,198,100,10 monster Alarm 1193,6,600000,300000,0
+c_tower4.gat,108,178,100,10 monster Alarm 1193,6,600000,300000,0
+c_tower4.gat,108,158,100,10 monster Alarm 1193,6,600000,300000,0
+c_tower4.gat,108,138,100,10 monster Alarm 1193,6,600000,300000,0
+c_tower4.gat,108,118,100,10 monster Alarm 1193,6,600000,300000,0
+c_tower4.gat,108,98,100,10 monster Clock 1269,7,600000,300000,0
+c_tower4.gat,108,78,100,10 monster Clock 1269,7,600000,300000,0
+c_tower4.gat,108,58,100,10 monster Clock 1269,7,600000,300000,0
+c_tower4.gat,108,38,100,10 monster Clock 1269,7,600000,300000,0
+c_tower4.gat,108,18,100,10 monster Clock 1269,7,600000,300000,0
+c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,600000,300000,0
+c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
+c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,3,1800000,0,0
+c_tower4.gat,98,180,0,0 monster Rideword 1195,1,600000,300000,1
+c_tower4.gat,97,180,0,0 monster Rideword 1195,1,540000,300000,1
+c_tower4.gat,96,180,0,0 monster Rideword 1195,1,650000,300000,1
+c_tower4.gat,95,180,0,0 monster Rideword 1195,1,710000,300000,1
+c_tower4.gat,94,180,0,0 monster Rideword 1195,1,620000,300000,1
+c_tower4.gat,93,180,0,0 monster Rideword 1195,1,560000,300000,1
+c_tower4.gat,92,180,0,0 monster Rideword 1195,1,580000,300000,1
+c_tower4.gat,91,180,0,0 monster Rideword 1195,1,630000,300000,1
+c_tower4.gat,87,180,0,0 monster Rideword 1195,1,700000,300000,1
+c_tower4.gat,86,180,0,0 monster Rideword 1195,1,680000,300000,1
+c_tower4.gat,80,179,0,0 monster Rideword 1195,1,660000,300000,1
+c_tower4.gat,80,180,0,0 monster Rideword 1195,1,650000,300000,1
+c_tower4.gat,80,181,0,0 monster Rideword 1195,1,590000,300000,1
+c_tower4.gat,80,182,0,0 monster Rideword 1195,1,600000,300000,1
+c_tower4.gat,80,183,0,0 monster Rideword 1195,1,640000,300000,1
+c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,201,109,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,0,0,0,0 monster Elder 1377,2,3600000,1800000,1
+c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
diff --git a/npc/eamobs/dungeons/coalmine.txt b/npc/eamobs/dungeons/coalmine.txt
index 4c34598e9..806113503 100644
--- a/npc/eamobs/dungeons/coalmine.txt
+++ b/npc/eamobs/dungeons/coalmine.txt
@@ -1,40 +1,40 @@
-//===== eAthena Script =======================================
-//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// mjo_dun01 - Mjolnir Dead Pit F1
-//==================================================
-mjo_dun01.gat,0,0,0,0 monster Tarou 1175,40,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Martin 1145,15,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Familiar 1005,25,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Smokie 1056,10,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Piere 1160,10,0,0,0
-
-//==================================================
-// mjo_dun02 - Mjolnir Dead Pit F2
-//==================================================
-mjo_dun02.gat,0,0,0,0 monster Martin 1145,50,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
-mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
-
-//==================================================
-// mjo_dun03 - Mjolnir Dead Pit F3
-//==================================================
-mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,55,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Myst 1151,30,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Martin 1145,10,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Giearth 1121,10,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Evil Druid 1117,3,600000,300000,0
+//===== eAthena Script =======================================
+//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// mjo_dun01 - Mjolnir Dead Pit F1
+//==================================================
+mjo_dun01.gat,0,0,0,0 monster Tarou 1175,40,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Martin 1145,15,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Familiar 1005,25,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Smokie 1056,10,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Piere 1160,10,0,0,0
+
+//==================================================
+// mjo_dun02 - Mjolnir Dead Pit F2
+//==================================================
+mjo_dun02.gat,0,0,0,0 monster Martin 1145,50,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
+mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
+
+//==================================================
+// mjo_dun03 - Mjolnir Dead Pit F3
+//==================================================
+mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,55,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Myst 1151,30,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Martin 1145,10,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Giearth 1121,10,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Evil Druid 1117,3,600000,300000,0
diff --git a/npc/eamobs/dungeons/geftower.txt b/npc/eamobs/dungeons/geftower.txt
index a7be9351d..55bdfc4c3 100644
--- a/npc/eamobs/dungeons/geftower.txt
+++ b/npc/eamobs/dungeons/geftower.txt
@@ -1,77 +1,77 @@
-//===== eAthena Script =======================================
-//= Geffen Tower Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// gef_dun00 - Geffen Dungeon F1
-//==================================================
-gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,35,0,0,0
-gef_dun00.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,1,600000,300000,0
-gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,600000,300000,1
-gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,600000,300000,1
-gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,600000,300000,0
-gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,600000,300000,0
-gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,600000,300000,0
-gef_dun00.gat,0,0,0,0 monster Red Plant 1078,11,600000,300000,1
-gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
-gef_dun00.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-gef_dun00.gat,0,0,0,0 monster Zombie 1015,10,0,0,0
-gef_dun00.gat,0,0,0,0 monster Argos 1100,10,0,0,0
-gef_dun00.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
-
-//==================================================
-// gef_dun01 - Geffen Dungeon F2
-//==================================================
-gef_dun01.gat,0,0,0,0 monster Ghoul 1036,35,0,0,0
-gef_dun01.gat,0,0,0,0 monster Nightmare 1061,15,0,0,0
-gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
-gef_dun01.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
-gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,600000,300000,1
-gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,600000,300000,1
-gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,600000,300000,1
-gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,600000,300000,1
-gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,150000,0
-gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,600000,300000,1
-gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,600000,300000,0
-gef_dun01.gat,0,0,0,0 monster Tyrfing 1204,1,1800000,1200000,0
-gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
-gef_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-gef_dun01.gat,0,0,0,0 monster Myst 1151,10,0,0,0
-
-//==================================================
-// gef_dun02 - Geffenia
-//==================================================
-gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,25,0,0,0
-gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,600000,300000,1
-gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,600000,300000,1
-gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,600000,300000,1
-gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,600000,300000,1
-gef_dun02.gat,0,0,0,0 monster Nightmare 1061,30,300000,150000,0
-gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
-gef_dun02.gat,0,0,0,0 monster Bathory 1102,10,0,0,0
-
-//==================================================
-// gef_dun03 - Geffenia (Event Map)
-//==================================================
-gef_dun03.gat,0,0,0,0 monster Deviruchi 1109,5,0,0,0
-gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,5,0,0,0
-gef_dun03.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
-gef_dun03.gat,0,0,0,0 monster Hellion Revenant 1626,1,600000,300000,1
-gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,5,0,0,0
-gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
+//===== eAthena Script =======================================
+//= Geffen Tower Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// gef_dun00 - Geffen Dungeon F1
+//==================================================
+gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,35,0,0,0
+gef_dun00.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,1,600000,300000,0
+gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,600000,300000,1
+gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,600000,300000,1
+gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,600000,300000,0
+gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,600000,300000,0
+gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,600000,300000,0
+gef_dun00.gat,0,0,0,0 monster Red Plant 1078,11,600000,300000,1
+gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
+gef_dun00.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+gef_dun00.gat,0,0,0,0 monster Zombie 1015,10,0,0,0
+gef_dun00.gat,0,0,0,0 monster Argos 1100,10,0,0,0
+gef_dun00.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
+
+//==================================================
+// gef_dun01 - Geffen Dungeon F2
+//==================================================
+gef_dun01.gat,0,0,0,0 monster Ghoul 1036,35,0,0,0
+gef_dun01.gat,0,0,0,0 monster Nightmare 1061,15,0,0,0
+gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
+gef_dun01.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
+gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,600000,300000,1
+gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,600000,300000,1
+gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,600000,300000,1
+gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,600000,300000,1
+gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,150000,0
+gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,600000,300000,1
+gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,600000,300000,0
+gef_dun01.gat,0,0,0,0 monster Tyrfing 1204,1,1800000,1200000,0
+gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
+gef_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+gef_dun01.gat,0,0,0,0 monster Myst 1151,10,0,0,0
+
+//==================================================
+// gef_dun02 - Geffenia
+//==================================================
+gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,25,0,0,0
+gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,600000,300000,1
+gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,600000,300000,1
+gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,600000,300000,1
+gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,600000,300000,1
+gef_dun02.gat,0,0,0,0 monster Nightmare 1061,30,300000,150000,0
+gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
+gef_dun02.gat,0,0,0,0 monster Bathory 1102,10,0,0,0
+
+//==================================================
+// gef_dun03 - Geffenia (Event Map)
+//==================================================
+gef_dun03.gat,0,0,0,0 monster Deviruchi 1109,5,0,0,0
+gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,5,0,0,0
+gef_dun03.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
+gef_dun03.gat,0,0,0,0 monster Hellion Revenant 1626,1,600000,300000,1
+gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,5,0,0,0
+gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
diff --git a/npc/eamobs/dungeons/glastheim.txt b/npc/eamobs/dungeons/glastheim.txt
index b5292ed4b..344fd36f7 100644
--- a/npc/eamobs/dungeons/glastheim.txt
+++ b/npc/eamobs/dungeons/glastheim.txt
@@ -1,288 +1,288 @@
-//===== eAthena Script =======================================
-//= Glast Heim Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 [Lupus]
-//= 1.2 Updated to ep 8.5 aegis spawns [MasterOfMuppets]
-//= 1.3 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// gl_cas01 - Glast Heim F1
-//==================================================
-gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
-gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
-gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
-gl_cas01.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
-
-//==================================================
-// gl_cas02 - Glast Heim F2
-//==================================================
-gl_cas02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
-gl_cas02.gat,193,167,5,5 monster Raydric 1163,3,600000,300000,0
-gl_cas02.gat,193,135,5,5 monster Raydric 1163,3,600000,300000,0
-gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,600000,300000,1
-gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,600000,300000,1
-gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
-gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,600000,300000,0
-gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
-gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,600000,300000,0
-gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,600000,300000,1
-gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,600000,300000,1
-gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,600000,300000,1
-gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,600000,300000,1
-gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,600000,300000,1
-gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,600000,300000,0
-gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,600000,300000,1
-gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,600000,300000,1
-gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,600000,300000,1
-gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,600000,300000,1
-gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
-gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
-gl_cas02.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
-gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
-gl_cas02.gat,182,12,3,3 monster Chimera 1283,1,3600000,1800000,1
-
-//==================================================
-// gl_in01 - Inside Glast Heim
-//==================================================
-gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
-gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
-gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
-gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
-gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
-gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
-gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
-gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
-gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
-gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
-gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
-gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
-gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_in01.gat,0,0,0,0 monster Owl Duke 1320,1,0,0,0
-
-//==================================================
-// gl_prison - Glast Heim Underprison F1
-//==================================================
-gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,25,0,0,0
-gl_prison.gat,0,0,0,0 monster Injustice 1257,10,0,0,0
-gl_prison.gat,0,0,0,0 monster Rybio 1201,5,0,0,0
-gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,8,0,0,0
-gl_prison.gat,0,0,0,0 monster Skeleton Prisoner 1196,20,0,0,0
-gl_prison.gat,0,0,0,0 monster Brilight 1211,15,0,0,0
-gl_prison.gat,0,0,0,0 monster Whisper 1179,7,0,0,0
-
-//==================================================
-// gl_prison1 - Glast Heim Underprison F2
-//==================================================
-gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
-gl_prison1.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
-gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Rybio 1201,20,0,0,0
-gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
-gl_prison1.gat,0,0,0,0 monster Arclouse 1194,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Zherlthsh 1200,1,3600000,1800000,1
-
-//==================================================
-// glast_01 - Glast Heim
-//==================================================
-glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
-glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,1,600000,300000,1
-glast_01.gat,233,209,15,15 monster Green Plant 1080,8,600000,300000,1
-glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
-glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
-glast_01.gat,0,0,0,0 monster Poison Spore 1077,10,0,0,0
-glast_01.gat,0,0,0,0 monster Myst 1151,5,0,0,0
-glast_01.gat,0,0,0,0 monster Jakk 1130,5,0,0,0
-glast_01.gat,0,0,0,0 monster Bathory 1102,5,0,0,0
-
-//==================================================
-// gl_church - Glast Heim St. Abbey
-//==================================================
-gl_church.gat,0,0,0,0 monster Ghoul 1036,44,0,0,0
-gl_church.gat,0,0,0,0 monster Evil Druid 1117,25,0,0,0
-gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-gl_church.gat,155,92,10,10 monster Mimic 1191,1,600000,300000,0
-gl_church.gat,155,75,10,10 monster Mimic 1191,2,600000,300000,0
-gl_church.gat,155,54,10,10 monster Mimic 1191,1,600000,300000,0
-gl_church.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
-gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
-gl_church.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-gl_church.gat,0,0,0,0 monster Brilight 1211,10,0,0,0
-gl_church.gat,0,0,0,0 monster Nightmare 1061,10,0,0,0
-gl_church.gat,0,0,0,0 monster Joker 1131,1,0,0,0
-
-//==================================================
-// gl_chyard - Glast Heim Churchyard
-//==================================================
-gl_chyard.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
-gl_chyard.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
-gl_chyard.gat,0,0,0,0 monster Wraith 1192,20,0,0,0
-gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,15,0,0,0
-gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
-gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
-gl_chyard.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
-gl_chyard.gat,0,0,0,0 monster Zombie Prisoner 1197,10,0,0,0
-
-//==================================================
-// gl_sew01 - Glast Heim Culvert F1
-//==================================================
-gl_sew01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
-gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
-gl_sew01.gat,0,0,0,0 monster Arclouse 1194,1,0,0,0
-gl_sew01.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-gl_sew01.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
-gl_sew01.gat,0,0,0,0 monster Wind Ghost 1263,10,0,0,0
-
-//==================================================
-// gl_sew02 - Glast Heim Culvert F2
-//==================================================
-gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,25,0,0,0
-gl_sew02.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
-gl_sew02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-gl_sew02.gat,0,0,0,0 monster Anolian 1206,15,0,0,0
-gl_sew02.gat,0,0,0,0 monster Wind Ghost 1263,10,0,0,0
-
-//==================================================
-// gl_sew03 - Glast Heim Culvert F3
-//==================================================
-gl_sew03.gat,0,0,0,0 monster Sting 1207,35,0,0,0
-gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,27,0,0,0
-gl_sew03.gat,147,7,5,1 monster Gargoyle 1253,1,2400000,1800000,0
-gl_sew03.gat,140,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
-gl_sew03.gat,158,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
-gl_sew03.gat,0,0,0,0 monster Cramp 1209,25,0,0,0
-gl_sew03.gat,0,0,0,0 monster Wind Ghost 1263,20,0,0,0
-
-//==================================================
-// gl_sew04 - Glast Heim Culvert F4
-//==================================================
-gl_sew04.gat,0,0,0,0 monster Anolian 1206,30,0,0,0
-gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
-gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-gl_sew04.gat,0,0,0,0 monster Wind Ghost 1263,20,0,0,0
-gl_sew04.gat,0,0,0,0 monster Sting 1207,20,0,0,0
-
-//==================================================
-// gl_step - Glast Heim Staircase Dungeon
-//==================================================
-gl_step.gat,0,0,0,0 monster Wind Ghost 1263,40,0,0,0
-gl_step.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
-gl_step.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,0
-gl_step.gat,0,0,0,0 monster Wraith 1192,15,0,0,0
-
-//==================================================
-// gl_knt01 - Inside Glast Heim Chivalry F1
-//==================================================
-gl_knt01.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
-gl_knt01.gat,33,120,30,30 monster Rideword 1195,9,600000,300000,1
-gl_knt01.gat,26,223,20,20 monster Rideword 1195,9,600000,300000,1
-gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,600000,300000,1
-gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,10,0,0,0
-gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,2,0,0,0
-gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
-gl_knt01.gat,272,263,25,25 monster Brilight 1211,10,600000,300000,1
-gl_knt01.gat,117,271,0,0 monster Evil Druid 1117,1,600000,300000,1
-gl_knt01.gat,118,266,0,0 monster Evil Druid 1117,1,600000,300000,1
-gl_knt01.gat,121,274,0,0 monster Evil Druid 1117,1,600000,300000,1
-gl_knt01.gat,124,266,0,0 monster Evil Druid 1117,1,600000,300000,1
-gl_knt01.gat,126,271,0,0 monster Evil Druid 1117,1,600000,300000,1
-gl_knt01.gat,235,238,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,240,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,241,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,242,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,243,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,244,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,235,245,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,243,233,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,243,254,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,243,263,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,244,258,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,259,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,264,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,269,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,278,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,283,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,288,239,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,292,233,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,48,13,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,56,206,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,93,224,0,0 monster Mandragora 1020,1,600000,300000,1
-gl_knt01.gat,265,155,0,0 monster Flora 1118,1,600000,300000,1
-
-//==================================================
-// gl_knt02 - Inside Glast Heim Chivalry F2
-//==================================================
-gl_knt02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
-gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,29,0,0,0
-gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
-gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
-gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
-gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,1800000,1200000,0
-gl_knt02.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-gl_knt02.gat,0,0,0,0 monster Joker 1131,1,0,0,0
-
-//==================================================
-// gl_dun01 - The Lowest Cave in Glast Heim F1
-//==================================================
-gl_dun01.gat,0,0,0,0 monster Arclouse 1194,25,0,0,0
-gl_dun01.gat,0,0,0,0 monster Sting 1207,25,0,0,0
-gl_dun01.gat,0,0,0,0 monster Minorous 1149,20,0,0,0
-gl_dun01.gat,0,0,0,0 monster Stalactic Golem 1278,20,0,0,0
-
-//==================================================
-// gl_dun02 - The Lowest Cave in Glast Heim F2
-//==================================================
-gl_dun02.gat,0,0,0,0 monster Majoruros 1310,25,0,0,0
-gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
-gl_dun02.gat,0,0,0,0 monster Arclouse 1194,15,0,0,0
-gl_dun02.gat,0,0,0,0 monster Stalactic Golem 1278,10,0,0,0
+//===== eAthena Script =======================================
+//= Glast Heim Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 [Lupus]
+//= 1.2 Updated to ep 8.5 aegis spawns [MasterOfMuppets]
+//= 1.3 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// gl_cas01 - Glast Heim F1
+//==================================================
+gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
+gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
+gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
+gl_cas01.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
+
+//==================================================
+// gl_cas02 - Glast Heim F2
+//==================================================
+gl_cas02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
+gl_cas02.gat,193,167,5,5 monster Raydric 1163,3,600000,300000,0
+gl_cas02.gat,193,135,5,5 monster Raydric 1163,3,600000,300000,0
+gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,600000,300000,1
+gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,600000,300000,1
+gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
+gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,600000,300000,0
+gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
+gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,600000,300000,0
+gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,600000,300000,1
+gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,600000,300000,1
+gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,600000,300000,1
+gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,600000,300000,1
+gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,600000,300000,1
+gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,600000,300000,0
+gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,600000,300000,1
+gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,600000,300000,1
+gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,600000,300000,1
+gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,600000,300000,1
+gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
+gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
+gl_cas02.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
+gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
+gl_cas02.gat,182,12,3,3 monster Chimera 1283,1,3600000,1800000,1
+
+//==================================================
+// gl_in01 - Inside Glast Heim
+//==================================================
+gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
+gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
+gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
+gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
+gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
+gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
+gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
+gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
+gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
+gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
+gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
+gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
+gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_in01.gat,0,0,0,0 monster Owl Duke 1320,1,0,0,0
+
+//==================================================
+// gl_prison - Glast Heim Underprison F1
+//==================================================
+gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,25,0,0,0
+gl_prison.gat,0,0,0,0 monster Injustice 1257,10,0,0,0
+gl_prison.gat,0,0,0,0 monster Rybio 1201,5,0,0,0
+gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,8,0,0,0
+gl_prison.gat,0,0,0,0 monster Skeleton Prisoner 1196,20,0,0,0
+gl_prison.gat,0,0,0,0 monster Brilight 1211,15,0,0,0
+gl_prison.gat,0,0,0,0 monster Whisper 1179,7,0,0,0
+
+//==================================================
+// gl_prison1 - Glast Heim Underprison F2
+//==================================================
+gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
+gl_prison1.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
+gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Rybio 1201,20,0,0,0
+gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
+gl_prison1.gat,0,0,0,0 monster Arclouse 1194,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Zherlthsh 1200,1,3600000,1800000,1
+
+//==================================================
+// glast_01 - Glast Heim
+//==================================================
+glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
+glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,1,600000,300000,1
+glast_01.gat,233,209,15,15 monster Green Plant 1080,8,600000,300000,1
+glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
+glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
+glast_01.gat,0,0,0,0 monster Poison Spore 1077,10,0,0,0
+glast_01.gat,0,0,0,0 monster Myst 1151,5,0,0,0
+glast_01.gat,0,0,0,0 monster Jakk 1130,5,0,0,0
+glast_01.gat,0,0,0,0 monster Bathory 1102,5,0,0,0
+
+//==================================================
+// gl_church - Glast Heim St. Abbey
+//==================================================
+gl_church.gat,0,0,0,0 monster Ghoul 1036,44,0,0,0
+gl_church.gat,0,0,0,0 monster Evil Druid 1117,25,0,0,0
+gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+gl_church.gat,155,92,10,10 monster Mimic 1191,1,600000,300000,0
+gl_church.gat,155,75,10,10 monster Mimic 1191,2,600000,300000,0
+gl_church.gat,155,54,10,10 monster Mimic 1191,1,600000,300000,0
+gl_church.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
+gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
+gl_church.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+gl_church.gat,0,0,0,0 monster Brilight 1211,10,0,0,0
+gl_church.gat,0,0,0,0 monster Nightmare 1061,10,0,0,0
+gl_church.gat,0,0,0,0 monster Joker 1131,1,0,0,0
+
+//==================================================
+// gl_chyard - Glast Heim Churchyard
+//==================================================
+gl_chyard.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
+gl_chyard.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
+gl_chyard.gat,0,0,0,0 monster Wraith 1192,20,0,0,0
+gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,15,0,0,0
+gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
+gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
+gl_chyard.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
+gl_chyard.gat,0,0,0,0 monster Zombie Prisoner 1197,10,0,0,0
+
+//==================================================
+// gl_sew01 - Glast Heim Culvert F1
+//==================================================
+gl_sew01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
+gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
+gl_sew01.gat,0,0,0,0 monster Arclouse 1194,1,0,0,0
+gl_sew01.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+gl_sew01.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
+gl_sew01.gat,0,0,0,0 monster Wind Ghost 1263,10,0,0,0
+
+//==================================================
+// gl_sew02 - Glast Heim Culvert F2
+//==================================================
+gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,25,0,0,0
+gl_sew02.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
+gl_sew02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+gl_sew02.gat,0,0,0,0 monster Anolian 1206,15,0,0,0
+gl_sew02.gat,0,0,0,0 monster Wind Ghost 1263,10,0,0,0
+
+//==================================================
+// gl_sew03 - Glast Heim Culvert F3
+//==================================================
+gl_sew03.gat,0,0,0,0 monster Sting 1207,35,0,0,0
+gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,27,0,0,0
+gl_sew03.gat,147,7,5,1 monster Gargoyle 1253,1,2400000,1800000,0
+gl_sew03.gat,140,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
+gl_sew03.gat,158,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
+gl_sew03.gat,0,0,0,0 monster Cramp 1209,25,0,0,0
+gl_sew03.gat,0,0,0,0 monster Wind Ghost 1263,20,0,0,0
+
+//==================================================
+// gl_sew04 - Glast Heim Culvert F4
+//==================================================
+gl_sew04.gat,0,0,0,0 monster Anolian 1206,30,0,0,0
+gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
+gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+gl_sew04.gat,0,0,0,0 monster Wind Ghost 1263,20,0,0,0
+gl_sew04.gat,0,0,0,0 monster Sting 1207,20,0,0,0
+
+//==================================================
+// gl_step - Glast Heim Staircase Dungeon
+//==================================================
+gl_step.gat,0,0,0,0 monster Wind Ghost 1263,40,0,0,0
+gl_step.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
+gl_step.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,0
+gl_step.gat,0,0,0,0 monster Wraith 1192,15,0,0,0
+
+//==================================================
+// gl_knt01 - Inside Glast Heim Chivalry F1
+//==================================================
+gl_knt01.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
+gl_knt01.gat,33,120,30,30 monster Rideword 1195,9,600000,300000,1
+gl_knt01.gat,26,223,20,20 monster Rideword 1195,9,600000,300000,1
+gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,600000,300000,1
+gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,10,0,0,0
+gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,2,0,0,0
+gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
+gl_knt01.gat,272,263,25,25 monster Brilight 1211,10,600000,300000,1
+gl_knt01.gat,117,271,0,0 monster Evil Druid 1117,1,600000,300000,1
+gl_knt01.gat,118,266,0,0 monster Evil Druid 1117,1,600000,300000,1
+gl_knt01.gat,121,274,0,0 monster Evil Druid 1117,1,600000,300000,1
+gl_knt01.gat,124,266,0,0 monster Evil Druid 1117,1,600000,300000,1
+gl_knt01.gat,126,271,0,0 monster Evil Druid 1117,1,600000,300000,1
+gl_knt01.gat,235,238,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,240,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,241,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,242,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,243,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,244,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,235,245,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,243,233,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,243,254,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,243,263,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,244,258,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,259,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,264,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,269,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,278,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,283,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,288,239,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,292,233,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,48,13,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,56,206,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,93,224,0,0 monster Mandragora 1020,1,600000,300000,1
+gl_knt01.gat,265,155,0,0 monster Flora 1118,1,600000,300000,1
+
+//==================================================
+// gl_knt02 - Inside Glast Heim Chivalry F2
+//==================================================
+gl_knt02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
+gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,29,0,0,0
+gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
+gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
+gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
+gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,1800000,1200000,0
+gl_knt02.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+gl_knt02.gat,0,0,0,0 monster Joker 1131,1,0,0,0
+
+//==================================================
+// gl_dun01 - The Lowest Cave in Glast Heim F1
+//==================================================
+gl_dun01.gat,0,0,0,0 monster Arclouse 1194,25,0,0,0
+gl_dun01.gat,0,0,0,0 monster Sting 1207,25,0,0,0
+gl_dun01.gat,0,0,0,0 monster Minorous 1149,20,0,0,0
+gl_dun01.gat,0,0,0,0 monster Stalactic Golem 1278,20,0,0,0
+
+//==================================================
+// gl_dun02 - The Lowest Cave in Glast Heim F2
+//==================================================
+gl_dun02.gat,0,0,0,0 monster Majoruros 1310,25,0,0,0
+gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
+gl_dun02.gat,0,0,0,0 monster Arclouse 1194,15,0,0,0
+gl_dun02.gat,0,0,0,0 monster Stalactic Golem 1278,10,0,0,0
diff --git a/npc/eamobs/dungeons/jupedun.txt b/npc/eamobs/dungeons/jupedun.txt
index f96894875..b8e5380c4 100644
--- a/npc/eamobs/dungeons/jupedun.txt
+++ b/npc/eamobs/dungeons/jupedun.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= Juperos Mystical Dungeon - Monster Spawn Locations
-//===== By: ==================================================
-// »» The Prometheus Project ««
-// Copyright (c) 2004,2005
-// Licensed under GPL
-// http://prometheus.fnae.net/
-//===== Current Version: =====================================
-//= 1.1 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena/Freya Version
-//===== Additional Comments: =================================
-//= 08/24/05 : Added 1st version. [Muad_Dib]
-//= 01/29/05 : Updated the spawns according to current info [MasterOfMuppets]
-//= 02/05/05 : Changed to eAthena custom spawns [Playtester]
-//= 04/15/06 : Made Juperos more crowded [Playtester]
-//============================================================
-
-//==================================================
-// juperos_01 - The Ruins of Juperos F1
-//==================================================
-juperos_01.gat,0,0,0,0 monster Venatu 1676,50,0,0,0
-juperos_01.gat,0,0,0,0 monster Venatu 1677,50,0,0,0
-juperos_01.gat,0,0,0,0 monster Venatu 1678,50,0,0,0
-juperos_01.gat,0,0,0,0 monster Venatu 1679,40,0,0,0
-juperos_01.gat,0,0,0,0 monster Hunter Fly 1035,40,0,0,0
-juperos_01.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
-
-//==================================================
-// juperos_02 - The Ruins of Juperos F2
-//==================================================
-juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,0
-juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,0
-juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,0
-juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,0
-juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,0
-
-//==================================================
-// juperos_core - Juperos Dungeon Entrance
-//==================================================
-jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,0
-jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,0
-jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,0
-jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,0
-jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,0
-jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,0
-jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,0
-jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,0
-jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Juperos Mystical Dungeon - Monster Spawn Locations
+//===== By: ==================================================
+// »» The Prometheus Project ««
+// Copyright (c) 2004,2005
+// Licensed under GPL
+// http://prometheus.fnae.net/
+//===== Current Version: =====================================
+//= 1.1 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena/Freya Version
+//===== Additional Comments: =================================
+//= 08/24/05 : Added 1st version. [Muad_Dib]
+//= 01/29/05 : Updated the spawns according to current info [MasterOfMuppets]
+//= 02/05/05 : Changed to eAthena custom spawns [Playtester]
+//= 04/15/06 : Made Juperos more crowded [Playtester]
+//============================================================
+
+//==================================================
+// juperos_01 - The Ruins of Juperos F1
+//==================================================
+juperos_01.gat,0,0,0,0 monster Venatu 1676,50,0,0,0
+juperos_01.gat,0,0,0,0 monster Venatu 1677,50,0,0,0
+juperos_01.gat,0,0,0,0 monster Venatu 1678,50,0,0,0
+juperos_01.gat,0,0,0,0 monster Venatu 1679,40,0,0,0
+juperos_01.gat,0,0,0,0 monster Hunter Fly 1035,40,0,0,0
+juperos_01.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
+
+//==================================================
+// juperos_02 - The Ruins of Juperos F2
+//==================================================
+juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,0
+juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,0
+juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,0
+juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,0
+juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,0
+
+//==================================================
+// juperos_core - Juperos Dungeon Entrance
+//==================================================
+jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,0
+jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,0
+jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,0
+jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,0
+jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,0
+jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,0
+jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,0
+jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,0
+jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
diff --git a/npc/eamobs/dungeons/moc_pyramid.txt b/npc/eamobs/dungeons/moc_pyramid.txt
index d2d39e05d..40f9e5440 100644
--- a/npc/eamobs/dungeons/moc_pyramid.txt
+++ b/npc/eamobs/dungeons/moc_pyramid.txt
@@ -1,68 +1,68 @@
-//===== eAthena Script =======================================
-//= Morocc Pryamid Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2 (custom spawn)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//= 1.2 Fixed a typo [Playtester]
-//============================================================
-
-//==================================================
-// moc_pryd01 - Inside Pyramid F1
-//==================================================
-moc_pryd01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-moc_pryd01.gat,0,0,0,0 monster Familiar 1005,40,0,0,0
-moc_pryd01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-
-//==================================================
-// moc_pryd02 - Inside Pyramid F2
-//==================================================
-moc_pryd02.gat,0,0,0,0 monster Mummy 1041,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Isis 1029,15,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Skeleton Archer 1016,30,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Skeleton Soldier 1028,35,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-
-//==================================================
-// moc_pryd03 - Inside Pyramid F3
-//==================================================
-moc_pryd03.gat,0,0,0,0 monster Mummy 1041,45,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Verit 1032,20,600000,300000,1
-moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-
-//==================================================
-// moc_pryd04 - Inside Pyramid F4
-//==================================================
-moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,150000,75000,0
-moc_pryd04.gat,0,0,0,0 monster Mummy 1041,25,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
-moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
-
-//==================================================
-// moc_pryd05 - Inside Pyramid B1
-//==================================================
-moc_pryd05.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Verit 1032,40,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Mummy 1041,15,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Ghoul 1036,15,0,0,0
-
-//==================================================
-// moc_pryd06 - Inside Pyramid B2
-//==================================================
-moc_pryd06.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Mimic 1191,10,600000,300000,0
-moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,10,600000,300000,0
-moc_pryd06.gat,0,0,0,0 monster Verit 1032,15,0,0,0
-moc_pryd06.gat,102,86,0,0 monster Amon Ra 1511,1,3600000,1600000,0
-moc_pryd06.gat,0,0,0,0 monster Ghoul 1036,10,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Isis 1029,10,0,0,0
+//===== eAthena Script =======================================
+//= Morocc Pryamid Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2 (custom spawn)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//= 1.2 Fixed a typo [Playtester]
+//============================================================
+
+//==================================================
+// moc_pryd01 - Inside Pyramid F1
+//==================================================
+moc_pryd01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+moc_pryd01.gat,0,0,0,0 monster Familiar 1005,40,0,0,0
+moc_pryd01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+
+//==================================================
+// moc_pryd02 - Inside Pyramid F2
+//==================================================
+moc_pryd02.gat,0,0,0,0 monster Mummy 1041,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Isis 1029,15,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Skeleton Archer 1016,30,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Skeleton Soldier 1028,35,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+
+//==================================================
+// moc_pryd03 - Inside Pyramid F3
+//==================================================
+moc_pryd03.gat,0,0,0,0 monster Mummy 1041,45,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Verit 1032,20,600000,300000,1
+moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+
+//==================================================
+// moc_pryd04 - Inside Pyramid F4
+//==================================================
+moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,150000,75000,0
+moc_pryd04.gat,0,0,0,0 monster Mummy 1041,25,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
+moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
+
+//==================================================
+// moc_pryd05 - Inside Pyramid B1
+//==================================================
+moc_pryd05.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Verit 1032,40,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Mummy 1041,15,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Ghoul 1036,15,0,0,0
+
+//==================================================
+// moc_pryd06 - Inside Pyramid B2
+//==================================================
+moc_pryd06.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Mimic 1191,10,600000,300000,0
+moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,10,600000,300000,0
+moc_pryd06.gat,0,0,0,0 monster Verit 1032,15,0,0,0
+moc_pryd06.gat,102,86,0,0 monster Amon Ra 1511,1,3600000,1600000,0
+moc_pryd06.gat,0,0,0,0 monster Ghoul 1036,10,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Isis 1029,10,0,0,0
diff --git a/npc/eamobs/dungeons/moc_sphinx.txt b/npc/eamobs/dungeons/moc_sphinx.txt
index 1484c25d3..c1f528655 100644
--- a/npc/eamobs/dungeons/moc_sphinx.txt
+++ b/npc/eamobs/dungeons/moc_sphinx.txt
@@ -1,65 +1,65 @@
-//===== eAthena Script =======================================
-//= Morocc Sphinx Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// In_sphinx1 - Sphinx F1
-//==================================================
-in_sphinx1.gat,0,0,0,0 monster Zerom 1178,20,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Matyr 1146,5,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Requiem 1164,15,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Snake 1025,15,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Anacondaq 1030,15,0,0,0
-
-//==================================================
-// In_sphinx2 - Sphinx F2
-//==================================================
-in_sphinx2.gat,0,0,0,0 monster Requiem 1164,45,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Zerom 1178,45,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-
-//==================================================
-// In_sphinx3 - Sphinx F3
-//==================================================
-in_sphinx3.gat,0,0,0,0 monster Marduk 1140,25,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Requiem 1164,10,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Pasana 1154,5,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Mimic 1191,5,600000,300000,1
-in_sphinx3.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-
-//==================================================
-// In_sphinx4 - Sphinx F4
-//==================================================
-in_sphinx4.gat,0,0,0,0 monster Minorous 1149,40,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Marduk 1140,10,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Mimic 1191,2,600000,300000,1
-in_sphinx4.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Medusa 1148,1,600000,300000,1
-
-//==================================================
-// In_sphinx5 - Sphinx F5
-//==================================================
-in_sphinx5.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Marduk 1140,25,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Pasana 1154,25,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,15,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
-in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
-in_sphinx5.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Requiem 1164,10,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Medusa 1148,3,600000,300000,0
+//===== eAthena Script =======================================
+//= Morocc Sphinx Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// In_sphinx1 - Sphinx F1
+//==================================================
+in_sphinx1.gat,0,0,0,0 monster Zerom 1178,20,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Matyr 1146,5,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Requiem 1164,15,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Snake 1025,15,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Anacondaq 1030,15,0,0,0
+
+//==================================================
+// In_sphinx2 - Sphinx F2
+//==================================================
+in_sphinx2.gat,0,0,0,0 monster Requiem 1164,45,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Zerom 1178,45,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+
+//==================================================
+// In_sphinx3 - Sphinx F3
+//==================================================
+in_sphinx3.gat,0,0,0,0 monster Marduk 1140,25,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Requiem 1164,10,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Pasana 1154,5,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Mimic 1191,5,600000,300000,1
+in_sphinx3.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+
+//==================================================
+// In_sphinx4 - Sphinx F4
+//==================================================
+in_sphinx4.gat,0,0,0,0 monster Minorous 1149,40,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Marduk 1140,10,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Mimic 1191,2,600000,300000,1
+in_sphinx4.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Medusa 1148,1,600000,300000,1
+
+//==================================================
+// In_sphinx5 - Sphinx F5
+//==================================================
+in_sphinx5.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Marduk 1140,25,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Pasana 1154,25,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,15,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
+in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
+in_sphinx5.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Requiem 1164,10,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Medusa 1148,3,600000,300000,0
diff --git a/npc/eamobs/dungeons/sunkenship.txt b/npc/eamobs/dungeons/sunkenship.txt
index d44861685..f75ad9efb 100644
--- a/npc/eamobs/dungeons/sunkenship.txt
+++ b/npc/eamobs/dungeons/sunkenship.txt
@@ -1,154 +1,154 @@
-//===== eAthena Script =======================================
-//= Sunken Ship Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// treasure01 - Sunken Ship F1
-//==================================================
-treasure01.gat,107,39,15,15 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,68,66,13,11 monster Hydra 1068,4,600000,200000,1
-treasure01.gat,67,161,0,0 monster Hydra 1068,1,563000,200000,1
-treasure01.gat,67,160,0,0 monster Hydra 1068,1,593000,200000,1
-treasure01.gat,68,161,0,0 monster Hydra 1068,1,617000,200000,1
-treasure01.gat,68,160,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,69,161,0,0 monster Hydra 1068,1,605000,200000,1
-treasure01.gat,69,160,0,0 monster Hydra 1068,1,590000,200000,1
-treasure01.gat,70,161,0,0 monster Hydra 1068,1,602000,200000,1
-treasure01.gat,70,160,0,0 monster Hydra 1068,1,606000,200000,1
-treasure01.gat,48,161,0,0 monster Hydra 1068,1,616000,200000,1
-treasure01.gat,48,160,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,49,161,0,0 monster Hydra 1068,1,610000,200000,1
-treasure01.gat,49,160,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,50,161,0,0 monster Hydra 1068,1,608000,200000,1
-treasure01.gat,50,160,0,0 monster Hydra 1068,1,601000,200000,1
-treasure01.gat,51,161,0,0 monster Hydra 1068,1,614000,200000,1
-treasure01.gat,51,160,0,0 monster Hydra 1068,1,570000,200000,1
-treasure01.gat,86,161,0,0 monster Hydra 1068,1,585000,200000,1
-treasure01.gat,86,160,0,0 monster Hydra 1068,1,610000,200000,1
-treasure01.gat,87,161,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,87,160,0,0 monster Hydra 1068,1,568000,200000,1
-treasure01.gat,88,161,0,0 monster Hydra 1068,1,581000,200000,1
-treasure01.gat,88,160,0,0 monster Hydra 1068,1,596000,200000,1
-treasure01.gat,89,161,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,89,160,0,0 monster Hydra 1068,1,605000,200000,1
-treasure01.gat,60,182,0,0 monster Hydra 1068,1,613000,200000,1
-treasure01.gat,76,182,0,0 monster Hydra 1068,1,569000,200000,1
-treasure01.gat,150,162,5,5 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,163,161,5,5 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,163,151,5,5 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,163,141,5,5 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,162,71,0,0 monster Hydra 1068,1,573000,200000,1
-treasure01.gat,162,70,0,0 monster Hydra 1068,1,614000,200000,1
-treasure01.gat,163,71,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,163,70,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,164,71,0,0 monster Hydra 1068,1,605000,200000,1
-treasure01.gat,164,70,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,165,71,0,0 monster Hydra 1068,1,607000,200000,1
-treasure01.gat,165,70,0,0 monster Hydra 1068,1,593000,200000,1
-treasure01.gat,158,63,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,159,63,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,158,62,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,159,62,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,158,45,0,0 monster Hydra 1068,1,602000,200000,1
-treasure01.gat,158,44,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,158,43,0,0 monster Hydra 1068,1,605000,200000,1
-treasure01.gat,158,42,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,158,41,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,158,40,0,0 monster Hydra 1068,1,607000,200000,1
-treasure01.gat,159,45,0,0 monster Hydra 1068,1,585000,200000,1
-treasure01.gat,159,44,0,0 monster Hydra 1068,1,612000,200000,1
-treasure01.gat,159,43,0,0 monster Hydra 1068,1,618000,200000,1
-treasure01.gat,159,42,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,159,41,0,0 monster Hydra 1068,1,606000,200000,1
-treasure01.gat,159,40,0,0 monster Hydra 1068,1,590000,200000,1
-treasure01.gat,168,45,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,168,44,0,0 monster Hydra 1068,1,614000,200000,1
-treasure01.gat,168,43,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,168,42,0,0 monster Hydra 1068,1,606000,200000,1
-treasure01.gat,168,41,0,0 monster Hydra 1068,1,590000,200000,1
-treasure01.gat,168,40,0,0 monster Hydra 1068,1,622000,200000,1
-treasure01.gat,169,45,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,169,44,0,0 monster Hydra 1068,1,602000,200000,1
-treasure01.gat,169,43,0,0 monster Hydra 1068,1,605000,200000,1
-treasure01.gat,169,42,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,169,41,0,0 monster Hydra 1068,1,613000,200000,1
-treasure01.gat,169,40,0,0 monster Hydra 1068,1,600000,200000,1
-treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,600000,200000,1
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,600000,200000,1
-treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
-treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
-treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
-treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
-treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
-treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
-treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
-treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,600000,200000,1
-treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,600000,200000,1
-treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,600000,200000,1
-treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,600000,200000,1
-treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,600000,200000,1
-treasure01.gat,0,0,0,0 monster Whisper 1179,7,0,0,1
-treasure01.gat,0,0,0,0 monster Whisper 1179,5,120000,60000,1
-treasure01.gat,164,59,12,10 monster Whisper 1179,5,600000,200000,1
-treasure01.gat,106,111,9,9 monster Thara Frog 1034,5,600000,200000,1
-
-//==================================================
-// treasure02 - Sunken Ship F2
-//==================================================
-treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,5,0,0,1
-treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,600000,200000,1
-treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
-treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
-treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
-treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,600000,200000,1
-treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
-treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
-treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
-treasure02.gat,0,0,0,0 monster Whisper 1179,8,0,0,0
-treasure02.gat,102,68,13,13 monster Whisper 1179,2,600000,200000,1
-treasure02.gat,102,80,5,5 monster Whisper 1179,1,600000,200000,1
-treasure02.gat,102,88,5,5 monster Whisper 1179,1,600000,200000,1
-treasure02.gat,101,150,15,10 monster Whisper 1179,4,600000,200000,1
-treasure02.gat,157,143,1,1 monster Whisper 1179,1,300000,300000,1
-treasure02.gat,151,138,1,1 monster Whisper 1179,1,300000,300000,1
-treasure02.gat,45,144,1,1 monster Whisper 1179,1,600000,200000,1
-treasure02.gat,52,139,1,1 monster Whisper 1179,1,600000,200000,1
-treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure02.gat,95,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,96,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,101,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,102,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,107,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,108,57,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,100,85,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,101,85,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,102,85,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,103,85,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,100,136,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,101,136,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,102,136,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,103,136,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,100,143,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,101,143,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,102,143,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,103,143,0,0 monster Hydra 1068,1,600000,200000,1
-treasure02.gat,0,0,0,0 monster Mimic 1191,3,0,0,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,3,600000,300000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,2,300000,300000,1
-treasure02.gat,0,0,0,0 monster Penomena 1216,19,300000,120000,1
-treasure02.gat,101,151,10,10 monster Penomena 1216,4,600000,300000,1
-treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
-treasure02.gat,101,135,2,2 monster Penomena 1216,1,600000,300000,1
-treasure02.gat,23,142,1,1 monster Marionette 1143,1,600000,200000,1
-treasure02.gat,0,0,0,0 monster Wanderer 1208,1,600000,300000,1
-treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1980000,1200000,1
-treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Sunken Ship Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// treasure01 - Sunken Ship F1
+//==================================================
+treasure01.gat,107,39,15,15 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,68,66,13,11 monster Hydra 1068,4,600000,200000,1
+treasure01.gat,67,161,0,0 monster Hydra 1068,1,563000,200000,1
+treasure01.gat,67,160,0,0 monster Hydra 1068,1,593000,200000,1
+treasure01.gat,68,161,0,0 monster Hydra 1068,1,617000,200000,1
+treasure01.gat,68,160,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,69,161,0,0 monster Hydra 1068,1,605000,200000,1
+treasure01.gat,69,160,0,0 monster Hydra 1068,1,590000,200000,1
+treasure01.gat,70,161,0,0 monster Hydra 1068,1,602000,200000,1
+treasure01.gat,70,160,0,0 monster Hydra 1068,1,606000,200000,1
+treasure01.gat,48,161,0,0 monster Hydra 1068,1,616000,200000,1
+treasure01.gat,48,160,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,49,161,0,0 monster Hydra 1068,1,610000,200000,1
+treasure01.gat,49,160,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,50,161,0,0 monster Hydra 1068,1,608000,200000,1
+treasure01.gat,50,160,0,0 monster Hydra 1068,1,601000,200000,1
+treasure01.gat,51,161,0,0 monster Hydra 1068,1,614000,200000,1
+treasure01.gat,51,160,0,0 monster Hydra 1068,1,570000,200000,1
+treasure01.gat,86,161,0,0 monster Hydra 1068,1,585000,200000,1
+treasure01.gat,86,160,0,0 monster Hydra 1068,1,610000,200000,1
+treasure01.gat,87,161,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,87,160,0,0 monster Hydra 1068,1,568000,200000,1
+treasure01.gat,88,161,0,0 monster Hydra 1068,1,581000,200000,1
+treasure01.gat,88,160,0,0 monster Hydra 1068,1,596000,200000,1
+treasure01.gat,89,161,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,89,160,0,0 monster Hydra 1068,1,605000,200000,1
+treasure01.gat,60,182,0,0 monster Hydra 1068,1,613000,200000,1
+treasure01.gat,76,182,0,0 monster Hydra 1068,1,569000,200000,1
+treasure01.gat,150,162,5,5 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,163,161,5,5 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,163,151,5,5 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,163,141,5,5 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,162,71,0,0 monster Hydra 1068,1,573000,200000,1
+treasure01.gat,162,70,0,0 monster Hydra 1068,1,614000,200000,1
+treasure01.gat,163,71,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,163,70,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,164,71,0,0 monster Hydra 1068,1,605000,200000,1
+treasure01.gat,164,70,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,165,71,0,0 monster Hydra 1068,1,607000,200000,1
+treasure01.gat,165,70,0,0 monster Hydra 1068,1,593000,200000,1
+treasure01.gat,158,63,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,159,63,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,158,62,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,159,62,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,158,45,0,0 monster Hydra 1068,1,602000,200000,1
+treasure01.gat,158,44,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,158,43,0,0 monster Hydra 1068,1,605000,200000,1
+treasure01.gat,158,42,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,158,41,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,158,40,0,0 monster Hydra 1068,1,607000,200000,1
+treasure01.gat,159,45,0,0 monster Hydra 1068,1,585000,200000,1
+treasure01.gat,159,44,0,0 monster Hydra 1068,1,612000,200000,1
+treasure01.gat,159,43,0,0 monster Hydra 1068,1,618000,200000,1
+treasure01.gat,159,42,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,159,41,0,0 monster Hydra 1068,1,606000,200000,1
+treasure01.gat,159,40,0,0 monster Hydra 1068,1,590000,200000,1
+treasure01.gat,168,45,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,168,44,0,0 monster Hydra 1068,1,614000,200000,1
+treasure01.gat,168,43,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,168,42,0,0 monster Hydra 1068,1,606000,200000,1
+treasure01.gat,168,41,0,0 monster Hydra 1068,1,590000,200000,1
+treasure01.gat,168,40,0,0 monster Hydra 1068,1,622000,200000,1
+treasure01.gat,169,45,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,169,44,0,0 monster Hydra 1068,1,602000,200000,1
+treasure01.gat,169,43,0,0 monster Hydra 1068,1,605000,200000,1
+treasure01.gat,169,42,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,169,41,0,0 monster Hydra 1068,1,613000,200000,1
+treasure01.gat,169,40,0,0 monster Hydra 1068,1,600000,200000,1
+treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,600000,200000,1
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,600000,200000,1
+treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
+treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
+treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,600000,200000,1
+treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
+treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
+treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
+treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,600000,200000,1
+treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,600000,200000,1
+treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,600000,200000,1
+treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,600000,200000,1
+treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,600000,200000,1
+treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,600000,200000,1
+treasure01.gat,0,0,0,0 monster Whisper 1179,7,0,0,1
+treasure01.gat,0,0,0,0 monster Whisper 1179,5,120000,60000,1
+treasure01.gat,164,59,12,10 monster Whisper 1179,5,600000,200000,1
+treasure01.gat,106,111,9,9 monster Thara Frog 1034,5,600000,200000,1
+
+//==================================================
+// treasure02 - Sunken Ship F2
+//==================================================
+treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,5,0,0,1
+treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,600000,200000,1
+treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
+treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
+treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,300000,300000,1
+treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,600000,200000,1
+treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
+treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
+treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,600000,200000,1
+treasure02.gat,0,0,0,0 monster Whisper 1179,8,0,0,0
+treasure02.gat,102,68,13,13 monster Whisper 1179,2,600000,200000,1
+treasure02.gat,102,80,5,5 monster Whisper 1179,1,600000,200000,1
+treasure02.gat,102,88,5,5 monster Whisper 1179,1,600000,200000,1
+treasure02.gat,101,150,15,10 monster Whisper 1179,4,600000,200000,1
+treasure02.gat,157,143,1,1 monster Whisper 1179,1,300000,300000,1
+treasure02.gat,151,138,1,1 monster Whisper 1179,1,300000,300000,1
+treasure02.gat,45,144,1,1 monster Whisper 1179,1,600000,200000,1
+treasure02.gat,52,139,1,1 monster Whisper 1179,1,600000,200000,1
+treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure02.gat,95,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,96,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,101,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,102,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,107,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,108,57,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,100,85,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,101,85,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,102,85,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,103,85,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,100,136,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,101,136,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,102,136,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,103,136,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,100,143,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,101,143,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,102,143,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,103,143,0,0 monster Hydra 1068,1,600000,200000,1
+treasure02.gat,0,0,0,0 monster Mimic 1191,3,0,0,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,3,600000,300000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,2,300000,300000,1
+treasure02.gat,0,0,0,0 monster Penomena 1216,19,300000,120000,1
+treasure02.gat,101,151,10,10 monster Penomena 1216,4,600000,300000,1
+treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
+treasure02.gat,101,135,2,2 monster Penomena 1216,1,600000,300000,1
+treasure02.gat,23,142,1,1 monster Marionette 1143,1,600000,200000,1
+treasure02.gat,0,0,0,0 monster Wanderer 1208,1,600000,300000,1
+treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1980000,1200000,1
+treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
diff --git a/npc/eamobs/fields/comodo.txt b/npc/eamobs/fields/comodo.txt
index 65aea2b1a..240e1b23b 100644
--- a/npc/eamobs/fields/comodo.txt
+++ b/npc/eamobs/fields/comodo.txt
@@ -1,189 +1,189 @@
-//===== eAthena Script =======================================
-//= Comodo Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2 (custom spawns)
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// cmd_fild01 - Papuchicha Forest
-//==================================================
-cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Blue Plant 1079,6,1800000,900000,1
-cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-cmd_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// cmd_fild02 - Kokomo Beach
-//==================================================
-cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
-cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,600000,300000,0
-cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
-cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,600000,300000,0
-cmd_fild02.gat,200,130,150,40 monster Seal 1317,18,600000,300000,0
-cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,600000,300000,0
-cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
-cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,600000,300000,0
-cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,600000,300000,0
-cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,600000,300000,0
-cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,600000,300000,0
-cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
-
-//==================================================
-// cmd_fild03 - Zenhai Marsh
-//==================================================
-cmd_fild03.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Pest 1256,30,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,30,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,1800000,900000,1
-cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
-
-//==================================================
-// cmd_fild04 - Kokomo Beach
-//==================================================
-cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,600000,300000,0
-cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
-cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,600000,300000,0
-
-//==================================================
-// cmd_fild05 - Border of Papuchica Forest
-//==================================================
-cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Yellow Plant 1081,6,1800000,900000,1
-cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-cmd_fild05.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// cmd_fild06 - Fortress Saint Darmain (West)
-//==================================================
-cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,600000,300000,0
-cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,600000,300000,0
-cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,600000,300000,0
-cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,600000,300000,0
-cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,600000,300000,0
-cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,600000,300000,0
-cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,600000,300000,0
-cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild06.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
-cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
-
-//==================================================
-// cmd_fild07 - Beacon Island, Pharos
-//==================================================
-cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,600000,300000,0
-cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,600000,300000,0
-cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,600000,300000,0
-cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,600000,300000,0
-cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,600000,300000,0
-cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,600000,300000,0
-cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,600000,300000,0
-cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,600000,300000,0
-cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,600000,300000,0
-cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,600000,300000,0
-
-//==================================================
-// cmd_fild08 - Fortress Saint Darmain (East)
-//==================================================
-cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,600000,300000,0
-cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,600000,300000,0
-cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,600000,300000,0
-cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,600000,300000,0
-cmd_fild08.gat,190,115,100,80 monster Gargoyle 1253,10,600000,300000,0
-cmd_fild08.gat,130,192,110,150 monster Gargoyle 1253,7,600000,300000,0
-cmd_fild08.gat,72,131,40,100 monster Gargoyle 1253,8,600000,300000,0
-cmd_fild08.gat,319,177,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,319,172,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,139,71,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,136,64,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,67,80,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,132,149,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,97,144,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,79,140,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,28,102,0,0 monster Gargoyle 1253,1,600000,300000,0
-cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,600000,300000,0
-cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,600000,300000,0
-cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,600000,300000,0
-cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,600000,300000,0
-cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,600000,300000,0
-cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,600000,300000,0
-cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,600000,300000,0
-cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,600000,300000,0
-cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,600000,300000,0
-cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,600000,300000,0
-cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,600000,300000,0
-cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,600000,300000,0
-cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,600000,300000,0
-cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Yellow Plant 1081,8,1800000,900000,1
-cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
-
-//==================================================
-// cmd_fild09 - Fortress Saint Darmain (South)
-//==================================================
-cmd_fild09.gat,0,0,0,0 monster Condor 1009,60,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,600000,300000,0
-cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,600000,300000,0
+//===== eAthena Script =======================================
+//= Comodo Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2 (custom spawns)
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// cmd_fild01 - Papuchicha Forest
+//==================================================
+cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Blue Plant 1079,6,1800000,900000,1
+cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+cmd_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// cmd_fild02 - Kokomo Beach
+//==================================================
+cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
+cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,600000,300000,0
+cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
+cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,600000,300000,0
+cmd_fild02.gat,200,130,150,40 monster Seal 1317,18,600000,300000,0
+cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,600000,300000,0
+cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
+cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,600000,300000,0
+cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,600000,300000,0
+cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,600000,300000,0
+cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,600000,300000,0
+cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
+
+//==================================================
+// cmd_fild03 - Zenhai Marsh
+//==================================================
+cmd_fild03.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Pest 1256,30,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,30,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,1800000,900000,1
+cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
+
+//==================================================
+// cmd_fild04 - Kokomo Beach
+//==================================================
+cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,600000,300000,0
+cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
+cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,600000,300000,0
+
+//==================================================
+// cmd_fild05 - Border of Papuchica Forest
+//==================================================
+cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Yellow Plant 1081,6,1800000,900000,1
+cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+cmd_fild05.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// cmd_fild06 - Fortress Saint Darmain (West)
+//==================================================
+cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,600000,300000,0
+cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,600000,300000,0
+cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,600000,300000,0
+cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,600000,300000,0
+cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,600000,300000,0
+cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,600000,300000,0
+cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,600000,300000,0
+cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild06.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
+cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
+
+//==================================================
+// cmd_fild07 - Beacon Island, Pharos
+//==================================================
+cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,600000,300000,0
+cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,600000,300000,0
+cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,600000,300000,0
+cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,600000,300000,0
+cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,600000,300000,0
+cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,600000,300000,0
+cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,600000,300000,0
+cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,600000,300000,0
+cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,600000,300000,0
+cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,600000,300000,0
+
+//==================================================
+// cmd_fild08 - Fortress Saint Darmain (East)
+//==================================================
+cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,600000,300000,0
+cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,600000,300000,0
+cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,600000,300000,0
+cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,600000,300000,0
+cmd_fild08.gat,190,115,100,80 monster Gargoyle 1253,10,600000,300000,0
+cmd_fild08.gat,130,192,110,150 monster Gargoyle 1253,7,600000,300000,0
+cmd_fild08.gat,72,131,40,100 monster Gargoyle 1253,8,600000,300000,0
+cmd_fild08.gat,319,177,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,319,172,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,139,71,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,136,64,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,67,80,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,132,149,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,97,144,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,79,140,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,28,102,0,0 monster Gargoyle 1253,1,600000,300000,0
+cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,600000,300000,0
+cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,600000,300000,0
+cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,600000,300000,0
+cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,600000,300000,0
+cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,600000,300000,0
+cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,600000,300000,0
+cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,600000,300000,0
+cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,600000,300000,0
+cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,600000,300000,0
+cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,600000,300000,0
+cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,600000,300000,0
+cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,600000,300000,0
+cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,600000,300000,0
+cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Yellow Plant 1081,8,1800000,900000,1
+cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
+
+//==================================================
+// cmd_fild09 - Fortress Saint Darmain (South)
+//==================================================
+cmd_fild09.gat,0,0,0,0 monster Condor 1009,60,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,600000,300000,0
+cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,600000,300000,0
diff --git a/npc/eamobs/fields/mjolnir.txt b/npc/eamobs/fields/mjolnir.txt
index a0c98db35..851d95795 100644
--- a/npc/eamobs/fields/mjolnir.txt
+++ b/npc/eamobs/fields/mjolnir.txt
@@ -1,247 +1,247 @@
-//===== eAthena Script =======================================
-//= Mt. Mjolnir Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Changed to eAthena custom spawns [Playtester]
-//============================================================
-
-//==================================================
-// mjolnir_01 - Mt.Mjolnir
-//==================================================
-mjolnir_01.gat,0,0,0,0 monster Coco 1104,70,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
-mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// mjolnir_02 - Mt.Mjolnir
-//==================================================
-mjolnir_02.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Flora 1118,40,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Creamy 1018,30,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
-
-//==================================================
-// mjolnir_03 - Mt.Mjolnir
-//==================================================
-mjolnir_03.gat,0,0,0,0 monster Petite 1155,35,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Petite 1156,60,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// mjolnir_04 - Mt.Mjolnir
-//==================================================
-mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Flora 1118,30,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
-mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
-
-//==================================================
-// mjolnir_05 - Mt.Mjolnir
-//==================================================
-mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// mjolnir_06 - Mt.Mjolnir
-//==================================================
-mjolnir_06.gat,0,0,0,0 monster Stainer 1174,50,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Horn 1128,30,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
-
-//==================================================
-// mjolnir_07 - Mt.Mjolnir
-//==================================================
-mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
-
-//==================================================
-// mjolnir_08 - Mt.Mjolnir
-//==================================================
-mjolnir_08.gat,0,0,0,0 monster Mantis 1139,50,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argos 1100,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
-
-//==================================================
-// mjolnir_09 - Mt.Mjolnir
-//==================================================
-mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Stainer 1174,30,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//==================================================
-// mjolnir_10 - Mt.Mjolnir
-//==================================================
-mjolnir_10.gat,0,0,0,0 monster Argos 1100,50,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Flora 1118,15,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Petite 1155,5,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// mjolnir_11 - Mt.Mjolnir
-//==================================================
-mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
-mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
-
-//==================================================
-// mjolnir_12 - Mt.Mjolnir
-//==================================================
-mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
+//===== eAthena Script =======================================
+//= Mt. Mjolnir Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Changed to eAthena custom spawns [Playtester]
+//============================================================
+
+//==================================================
+// mjolnir_01 - Mt.Mjolnir
+//==================================================
+mjolnir_01.gat,0,0,0,0 monster Coco 1104,70,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
+mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// mjolnir_02 - Mt.Mjolnir
+//==================================================
+mjolnir_02.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Flora 1118,40,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Creamy 1018,30,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
+
+//==================================================
+// mjolnir_03 - Mt.Mjolnir
+//==================================================
+mjolnir_03.gat,0,0,0,0 monster Petite 1155,35,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Petite 1156,60,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// mjolnir_04 - Mt.Mjolnir
+//==================================================
+mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Flora 1118,30,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
+mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
+
+//==================================================
+// mjolnir_05 - Mt.Mjolnir
+//==================================================
+mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// mjolnir_06 - Mt.Mjolnir
+//==================================================
+mjolnir_06.gat,0,0,0,0 monster Stainer 1174,50,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Horn 1128,30,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
+
+//==================================================
+// mjolnir_07 - Mt.Mjolnir
+//==================================================
+mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
+
+//==================================================
+// mjolnir_08 - Mt.Mjolnir
+//==================================================
+mjolnir_08.gat,0,0,0,0 monster Mantis 1139,50,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argos 1100,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
+
+//==================================================
+// mjolnir_09 - Mt.Mjolnir
+//==================================================
+mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Stainer 1174,30,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//==================================================
+// mjolnir_10 - Mt.Mjolnir
+//==================================================
+mjolnir_10.gat,0,0,0,0 monster Argos 1100,50,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Flora 1118,15,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Petite 1155,5,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// mjolnir_11 - Mt.Mjolnir
+//==================================================
+mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
+mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
+
+//==================================================
+// mjolnir_12 - Mt.Mjolnir
+//==================================================
+mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
diff --git a/npc/eamobs/fields/umbala.txt b/npc/eamobs/fields/umbala.txt
index 59665d907..e6f82d71f 100644
--- a/npc/eamobs/fields/umbala.txt
+++ b/npc/eamobs/fields/umbala.txt
@@ -1,99 +1,99 @@
-//===== eAthena Script =======================================
-//= Umbala Monster Spawn
-//===== By: ==================================================
-//= Darkchild (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Ep6+
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//==================================================
-// um_fild01 - Luluka Forest
-//==================================================
-um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
-um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
-um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
-um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,6,1800000,900000,1
-
-//==================================================
-// um_fild02 - Hoomga Forest
-//==================================================
-um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
-um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,600000,300000,0
-um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
-um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,600000,300000,0
-um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
-um_fild02.gat,360,320,20,30 monster Flora 1118,3,600000,300000,0
-um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,1800000,900000,1
-um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
-
-//==================================================
-// um_fild03 - Kalala Swamp
-//==================================================
-um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
-um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
-um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
-um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
-um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-um_fild03.gat,0,0,0,0 monster Shining Plant 1083,6,1800000,900000,1
-um_fild03.gat,0,0,0,0 monster Blue Plant 1079,2,1800000,900000,1
-um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
-
-//==================================================
-// um_fild04 - Hoomga Jungle
-//==================================================
-um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,600000,300000,0
-um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,600000,300000,0
-um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
-um_fild04.gat,264,293,10,10 monster Horn 1128,2,600000,300000,0
-um_fild04.gat,118,237,10,10 monster Horn 1128,1,600000,300000,0
-um_fild04.gat,311,285,10,10 monster Horn 1128,1,600000,300000,0
-um_fild04.gat,206,188,10,10 monster Horn 1128,1,600000,300000,0
-um_fild04.gat,239,245,10,10 monster Horn 1128,1,600000,300000,0
-um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
-um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,600000,300000,0
-um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,600000,300000,0
-um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,600000,300000,0
-um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
-um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,1800000,900000,1
-um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
+//===== eAthena Script =======================================
+//= Umbala Monster Spawn
+//===== By: ==================================================
+//= Darkchild (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Ep6+
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//==================================================
+// um_fild01 - Luluka Forest
+//==================================================
+um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
+um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
+um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
+um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,6,1800000,900000,1
+
+//==================================================
+// um_fild02 - Hoomga Forest
+//==================================================
+um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
+um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,600000,300000,0
+um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
+um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,600000,300000,0
+um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
+um_fild02.gat,360,320,20,30 monster Flora 1118,3,600000,300000,0
+um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,1800000,900000,1
+um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
+
+//==================================================
+// um_fild03 - Kalala Swamp
+//==================================================
+um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
+um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
+um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
+um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
+um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+um_fild03.gat,0,0,0,0 monster Shining Plant 1083,6,1800000,900000,1
+um_fild03.gat,0,0,0,0 monster Blue Plant 1079,2,1800000,900000,1
+um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
+
+//==================================================
+// um_fild04 - Hoomga Jungle
+//==================================================
+um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,600000,300000,0
+um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,600000,300000,0
+um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
+um_fild04.gat,264,293,10,10 monster Horn 1128,2,600000,300000,0
+um_fild04.gat,118,237,10,10 monster Horn 1128,1,600000,300000,0
+um_fild04.gat,311,285,10,10 monster Horn 1128,1,600000,300000,0
+um_fild04.gat,206,188,10,10 monster Horn 1128,1,600000,300000,0
+um_fild04.gat,239,245,10,10 monster Horn 1128,1,600000,300000,0
+um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
+um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,600000,300000,0
+um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,600000,300000,0
+um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,600000,300000,0
+um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
+um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,1800000,900000,1
+um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,1800000,900000,1
diff --git a/npc/eamobs/jro/jro.txt b/npc/eamobs/jro/jro.txt
index 54d02fc41..4a106302a 100644
--- a/npc/eamobs/jro/jro.txt
+++ b/npc/eamobs/jro/jro.txt
@@ -1,3971 +1,3971 @@
-// tha_t01
-
-tha_t01.gat,0,0,0,0 monster Alice 1275,5,0,0,0
-tha_t01.gat,0,0,0,0 monster Plasma 1695,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Lady Solace 1703,4,1800000,1200000,0
-
-// tha_t02
-
-tha_t02.gat,0,0,0,0 monster Alice 1275,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Plasma 1697,20,0,0,0
-tha_t02.gat,0,0,0,0 monster Mimic 1191,30,0,0,0
-tha_t02.gat,0,0,0,0 monster Ancient Mimic 1699,80,0,0,0
-tha_t02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Death Word 1698,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Elder 1377,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Baroness of Retribution 1702,4,1800000,1200000,0
-
-// tha_t03
-
-tha_t03.gat,0,0,0,0 monster Plasma 1696,20,0,0,0
-tha_t03.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
-tha_t03.gat,0,0,0,0 monster Death Word 1698,80,0,0,0
-tha_t03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Ancient Mimic 1699,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Elder 1377,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Mistress of Shelter 1701,4,1800000,1200000,0
-
-// tha_t04
-
-tha_t04.gat,0,0,0,0 monster Plasma 1694,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Death Word 1698,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Ancient Mimic 1699,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Elder 1377,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Owl Baron 1295,10,0,0,0
-tha_t04.gat,0,0,0,0 monster Owl Duke 1320,10,0,0,0
-tha_t04.gat,0,0,0,0 monster Dame of Sentinel 1700,4,1800000,1200000,0
-
-// tha_t05
-
-tha_t05.gat,61,179,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,61,179,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,178,178,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,178,178,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,178,63,55,5 monster Elder 1377,5,0,0,0
-tha_t05.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,178,63,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,62,63,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,62,63,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,0,0,0,0 monster Dolor of Thanatos 1707,2,1800000,1200000,0
-
-// tha_t06
-
-tha_t06.gat,61,179,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,61,179,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,178,178,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,178,178,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,178,63,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,178,63,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,62,63,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,62,63,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,0,0,0,0 monster Maero of Thanatos 1706,2,1800000,1200000,0
-
-// tha_t07
-
-tha_t07.gat,70,105,40,75 monster Death Word 1698,10,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Ancient Mimic 1699,10,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Lady Solace 1703,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Mistress of Shelter 1701,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Baroness of Retribution 1702,15,0,0,0
-tha_t07.gat,70,105,40,75 monster Dame of Sentinel 1700,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Despero of Thanatos 1705,2,1800000,1200000,0
-
-// tha_t08
-
-tha_t08.gat,70,105,40,80 monster Death Word 1698,10,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Ancient Mimic 1699,10,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Lady Solace 1703,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Mistress of Shelter 1701,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Baroness of Retribution 1702,20,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Dame of Sentinel 1700,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Odium of Thanatos 1704,2,1800000,1200000,0
-
-// tha_t09
-
-tha_t09.gat,50,129,35,35 monster Plasma 1694,5,0,0,0
-tha_t09.gat,50,129,35,35 monster Lady Solace 1703,20,600000,0,0
-tha_t09.gat,50,129,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1707,1,1800000,1200000,0
-tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1712,3,1800000,1200000,0
-
-// tha_t10
-
-tha_t10.gat,129,129,35,35 monster Plasma 1697,5,0,0,0
-tha_t10.gat,129,129,35,35 monster Baroness of Retribution 1702,20,600000,0,0
-tha_t10.gat,129,129,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1706,1,1800000,1200000,0
-tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1711,3,1800000,1200000,0
-
-// tha_t11
-
-tha_t11.gat,50,51,35,35 monster Plasma 1695,5,0,0,0
-tha_t11.gat,50,51,35,35 monster Mistress of Shelter 1701,20,600000,0,0
-tha_t11.gat,50,51,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1705,1,1800000,1200000,0
-tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1710,3,1800000,1200000,0
-
-// tha_t12
-
-tha_t12.gat,129,51,35,35 monster Plasma 1693,5,0,0,0
-tha_t12.gat,129,51,35,35 monster Dame of Sentinel 1700,13,600000,0,0
-tha_t12.gat,129,51,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Odium of Thanatos 1709,4,1800000,1200000,0
-
-// abyss_01
-
-abyss_01.gat,0,0,0,0 monster Mimic 1191,10,600000,0,0
-abyss_01.gat,0,0,0,0 monster Ancient Mimic 1699,10,600000,0,0
-abyss_01.gat,152,205,130,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,152,205,130,70 monster Ferus 1717,25,300000,0,0
-abyss_01.gat,152,205,130,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,152,205,130,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,103,93,85,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,103,93,85,70 monster Ferus 1717,15,300000,0,0
-abyss_01.gat,103,93,85,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,103,93,85,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,195,102,85,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,195,102,85,70 monster Ferus 1717,15,300000,0,0
-abyss_01.gat,195,102,85,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,195,102,85,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,110,170,15,15 monster Penomena 1216,15,660000,300000,0
-abyss_01.gat,195,147,5,10 monster Penomena 1216,5,720000,300000,0
-abyss_01.gat,140,100,15,5 monster Penomena 1216,10,780000,300000,0
-abyss_01.gat,260,40,14,14 monster Dragon Egg 1721,3,1200000,600000,0
-abyss_01.gat,150,160,50,50 monster Dragon Egg 1721,5,1800000,600000,0
-
-// abyss_02
-
-abyss_02.gat,0,0,0,0 monster Mimic 1191,10,900000,0,0
-abyss_02.gat,0,0,0,0 monster Ancient Mimic 1699,10,900000,0,0
-abyss_02.gat,0,0,0,0 monster Ferus 1714,50,300000,0,0
-abyss_02.gat,0,0,0,0 monster Acidus 1713,10,600000,0,0
-abyss_02.gat,0,0,0,0 monster Acidus 1716,60,300000,0,0
-abyss_02.gat,0,0,0,0 monster Novus 1715,5,0,0,0
-abyss_02.gat,0,0,0,0 monster Novus 1718,5,0,0,0
-abyss_02.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
-
-// abyss_03
-
-abyss_03.gat,0,0,0,0 monster Mimic 1191,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ancient Mimic 1699,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Acidus 1713,60,600000,0,0
-abyss_03.gat,0,0,0,0 monster Acidus 1716,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ferus 1714,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ferus 1717,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
-abyss_03.gat,0,0,0,0 monster Hydrolancer 1720,3,3000000,2400000,0
-abyss_03.gat,0,0,0,0 monster Detardeurus 1719,1,10800000,7200000,0
-
-// hu_fild01
-
-hu_fild01.gat,0,0,0,0 monster Breeze 1692,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1697,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1695,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1696,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1694,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1693,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Geographer 1368,30,300000,0,0
-hu_fild01.gat,0,0,0,0 monster Demon Pungus 1378,30,1200000,600000,0
-
-// hu_fild04
-
-hu_fild04.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Petite 1155,50,0,0,0
-hu_fild04.gat,0,0,0,0 monster Petite 1156,30,0,0,0
-hu_fild04.gat,0,0,0,0 monster Novus 1715,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Novus 1718,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Anopheles 1627,50,0,0,0
-hu_fild04.gat,0,0,0,0 monster Grove 1687,20,0,0,0
-hu_fild04.gat,60,149,35,122 monster Sleeper 1386,7,600000,300000,0
-hu_fild04.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-hu_fild04.gat,206,210,30,18 monster Blue Plant 1079,4,120000,600000,0
-hu_fild04.gat,206,120,10,10 monster Blue Plant 1079,2,120000,600000,0
-
-// hu_fild05
-
-hu_fild05.gat,112,272,62,82 monster Grove 1687,15,0,0,0
-hu_fild05.gat,112,272,62,82 monster Petite 1155,3,0,0,0
-hu_fild05.gat,112,272,62,82 monster Petite 1156,2,0,0,0
-hu_fild05.gat,112,272,62,82 monster Novus 1715,3,0,0,0
-hu_fild05.gat,112,272,62,82 monster Novus 1718,3,0,0,0
-hu_fild05.gat,112,272,62,82 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,112,272,62,82 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,276,302,93,60 monster Grove 1687,15,0,0,0
-hu_fild05.gat,276,302,93,60 monster Petite 1155,2,0,0,0
-hu_fild05.gat,276,302,93,60 monster Petite 1156,3,0,0,0
-hu_fild05.gat,276,302,93,60 monster Novus 1715,3,0,0,0
-hu_fild05.gat,276,302,93,60 monster Novus 1718,3,0,0,0
-hu_fild05.gat,276,302,93,60 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,276,302,93,60 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
-hu_fild05.gat,286,144,82,90 monster Petite 1155,3,0,0,0
-hu_fild05.gat,286,144,82,90 monster Petite 1156,2,0,0,0
-hu_fild05.gat,286,144,82,90 monster Novus 1715,3,0,0,0
-hu_fild05.gat,286,144,82,90 monster Novus 1718,3,0,0,0
-hu_fild05.gat,286,144,82,90 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,286,144,82,90 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
-hu_fild05.gat,118,106,80,70 monster Petite 1155,2,0,0,0
-hu_fild05.gat,118,106,80,70 monster Petite 1156,3,0,0,0
-hu_fild05.gat,118,106,80,70 monster Novus 1715,3,0,0,0
-hu_fild05.gat,118,106,80,70 monster Novus 1718,3,0,0,0
-hu_fild05.gat,118,106,80,70 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,118,106,80,70 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,0,0,0,0 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,0,0,0,0 monster Dragon Egg 1721,2,3600000,1800000,0
-hu_fild05.gat,196,196,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
-hu_fild05.gat,340,50,10,10 monster Dragon Egg 1721,1,3600000,1800000,0
-hu_fild05.gat,280,350,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
-
-// hu_fild07
-
-hu_fild07.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Deleter 1384,40,0,0,0
-hu_fild07.gat,0,0,0,0 monster Deleter 1385,30,0,0,0
-hu_fild07.gat,0,0,0,0 monster Novus 1715,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Novus 1718,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-hu_fild07.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-hu_fild07.gat,0,0,0,0 monster Demon Pungus 1378,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Yellow Plant 1081,20,0,0,0
-
-// yuno_fild06
-
-yuno_fild06.gat,0,0,0,0 monster Sleeper 1386,70,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Goat 1372,40,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-
-// juperos_01
-
-juperos_01.gat,100,180,60,70 monster Venatu 1679,15,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1676,25,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1677,20,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1678,25,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1679,35,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1676,45,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1677,50,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1678,45,0,0,1
-
-// juperos_02
-
-juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,1
-
-// jupe_core
-
-jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
-
-// lhz_dun01
-
-lhz_dun01.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Anopheles 1627,70,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Remover 1682,100,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Egnigem Cenia 1652,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Wickebine Tres 1653,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Armeyer Dinze 1654,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Errende Ebecee 1655,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Kavach Icarus 1656,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Laurell Weinder 1657,1,0,0,0
-lhz_dun01.gat,150,50,16,18 monster Egnigem Cenia 1652,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Wickebine Tres 1653,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Errende Ebecee 1655,5,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Kavach Icarus 1656,5,600000,300000,1
-lhz_dun01.gat,150,50,16,18 monster Laurell Weinder 1657,5,600000,300000,1
-lhz_dun01.gat,250,150,18,30 monster Egnigem Cenia 1652,4,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Wickebine Tres 1653,4,600000,300000,1
-lhz_dun01.gat,250,150,18,30 monster Armeyer Dinze 1654,4,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Errende Ebecee 1655,2,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Kavach Icarus 1656,2,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Laurell Weinder 1657,2,600000,300000,1
-lhz_dun01.gat,50,150,11,35 monster Egnigem Cenia 1652,1,600000,300000,1
-lhz_dun01.gat,50,150,11,35 monster Wickebine Tres 1653,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Errende Ebecee 1655,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Kavach Icarus 1656,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Laurell Weinder 1657,2,600000,300000,1
-lhz_dun01.gat,192,61,18,30 monster Egnigem Cenia 1652,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Wickebine Tres 1653,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Errende Ebecee 1655,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Kavach Icarus 1656,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Laurell Weinder 1657,1,900000,800000,1
-lhz_dun01.gat,0,0,0,0 monster Gemini-S58 1681,1,7200000,5400000,0
-
-// lhz_dun02
-
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,26,0,0,0
-lhz_dun02.gat,150,150,56,54 monster Egnigem Cenia 1652,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Wickebine Tres 1653,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Armeyer Dinze 1654,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Errende Ebecee 1655,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Kavach Icarus 1656,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Laurell Weinder 1657,4,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Egnigem Cenia 1652,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Wickebine Tres 1653,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Armeyer Dinze 1654,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Errende Ebecee 1655,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Kavach Icarus 1656,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Laurell Weinder 1657,10,120000,60000,1
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Remover 1682,20,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Eremes Guile 1635,1,180000,120000,0
-lhz_dun02.gat,0,0,0,0 monster Gemini-S58 1681,10,5400000,180000,0
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1658,1,7200000,5400000,1
-
-// lhz_dun03
-
-lhz_dun03.gat,140,235,116,30 monster Seyren Windsor 1634,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Eremes Guile 1635,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Howard Alt-Eisen 1636,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Margaretha Sorin 1637,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Cecil Damon 1638,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Kathryne Keyron 1639,4,180000,120000,0
-
-lhz_dun03.gat,40,214,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,240,213,16,17 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,140,65,108,38 monster Seyren Windsor 1634,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Eremes Guile 1635,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Howard Alt-Eisen 1636,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Margaretha Sorin 1637,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Cecil Damon 1638,7,120000,60000,0
-lhz_dun03.gat,140,65,108,38 monster Kathryne Keyron 1639,7,120000,60000,0
-
-lhz_dun03.gat,140,31,8,15 monster Seyren Windsor 1634,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Eremes Guile 1635,1,540000,480000,0
-lhz_dun03.gat,140,31,8,15 monster Howard Alt-Eisen 1636,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Margaretha Sorin 1637,1,540000,480000,0
-lhz_dun03.gat,140,31,8,15 monster Cecil Damon 1638,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Kathryne Keyron 1639,1,540000,480000,0
-
-lhz_dun03.gat,40,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,240,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,54,131,35,39 monster Seyren Windsor 1634,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Eremes Guile 1635,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Cecil Damon 1638,5,120000,60000,0
-lhz_dun03.gat,54,131,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
-
-lhz_dun03.gat,228,137,35,39 monster Seyren Windsor 1634,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Eremes Guile 1635,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Cecil Damon 1638,5,120000,60000,0
-lhz_dun03.gat,228,137,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
-
-lhz_dun03.gat,138,138,36,34 monster Seyren Windsor 1634,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Eremes Guile 1635,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Howard Alt-Eisen 1636,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Margaretha Sorin 1637,3,180000,120000,0
-lhz_dun03.gat,138,138,36,34 monster Cecil Damon 1638,4,0,0,0
-lhz_dun03.gat,138,138,36,34 monster Kathryne Keyron 1639,4,0,0,0
-
-lhz_dun03.gat,140,192,66,21 monster Seyren Windsor 1634,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Eremes Guile 1635,7,180000,120000,0
-lhz_dun03.gat,140,192,66,21 monster Howard Alt-Eisen 1636,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Margaretha Sorin 1637,7,180000,120000,0
-lhz_dun03.gat,140,192,66,21 monster Cecil Damon 1638,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Kathryne Keyron 1639,7,120000,60000,0
-
-lhz_dun03.gat,89,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,89,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,107,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,107,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,171,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,171,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,189,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,189,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,89,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,89,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,107,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,107,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,171,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,171,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,189,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,189,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
-
-lhz_dun03.gat,96,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,96,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,180,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,180,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,98,113,13,9 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,98,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,180,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,180,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
-
-lhz_dun03.gat,114,138,12,16 monster Lord Knight Seyren 1640,1,2700000,2400000,1
-lhz_dun03.gat,163,138,12,16 monster Whitesmith Howard 1642,1,3000000,2700000,1
-lhz_dun03.gat,139,158,20,11 monster Assassin Cross Eremes 1641,1,2580000,2340000,1
-lhz_dun03.gat,139,117,20,11 monster Sniper Cecil 1644,1,2700000,2500000,1
-lhz_dun03.gat,138,138,36,34 monster High Priest Margaretha 1643,1,3300000,3000000,1
-lhz_dun03.gat,138,138,36,34 monster High Wizard Kathryne 1645,1,2580000,2460000,1
-
-// lhz_fild01
-
-lhz_fild01.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Holden 1628,60,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-lhz_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
-lhz_fild01.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
-
-// lhz_fild02
-
-lhz_fild02.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Horn 1128,10,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Holden 1628,10,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Anopheles 1627,15,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
-lhz_fild02.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
-
-// lhz_fild03
-
-lhz_fild03.gat,262,233,74,140 monster Porcellio 1619,50,0,0,0
-lhz_fild03.gat,262,233,74,140 monster Metaling 1613,30,0,0,0
-lhz_fild03.gat,262,233,74,140 monster Hill Wind 1629,20,0,0,1
-lhz_fild03.gat,127,248,45,140 monster Caramel 1103,30,0,0,0
-lhz_fild03.gat,127,248,45,140 monster Horn 1128,10,0,0,0
-lhz_fild03.gat,127,248,45,140 monster Rafflesia 1162,5,0,0,0
-lhz_fild03.gat,0,0,0,0 monster Anopheles 1627,20,0,0,1
-lhz_fild03.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,1
-lhz_fild03.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-lhz_fild03.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
-lhz_fild03.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
-
-// ein_fild03
-
-ein_fild03.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
-ein_fild03.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
-ein_fild03.gat,0,0,0,0 monster Holden 1628,40,0,0,0
-ein_fild03.gat,153,328,100,35 monster Geographer 1368,10,0,0,0
-ein_fild03.gat,260,190,45,25 monster Geographer 1368,5,0,0,0
-ein_fild03.gat,88,143,25,70 monster Caramel 1103,10,60000,30000,1
-ein_fild03.gat,155,40,35,20 monster Horn 1128,5,60000,30000,1
-ein_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
-ein_fild03.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
-
-// ein_fild04
-
-ein_fild04.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
-ein_fild04.gat,0,0,0,0 monster Holden 1628,5,0,0,0
-ein_fild04.gat,200,295,125,65 monster Geographer 1368,45,0,0,0
-ein_fild04.gat,125,135,40,40 monster Geographer 1368,5,0,0,0
-ein_fild04.gat,260,70,20,30 monster Geographer 1368,5,0,0,0
-ein_fild04.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-ein_fild04.gat,285,240,35,90 monster Giearth 1121,10,3600000,3000000,0
-ein_fild04.gat,106,284,60,60 monster Holden 1628,15,0,0,0
-ein_fild04.gat,106,284,60,60 monster Mineral 1614,5,3600000,3000000,0
-ein_fild04.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-ein_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
-ein_fild04.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
-
-// einbech
-
-einbech.gat,0,0,0,0 monster Wild Rose 1261,1,3600000,3000000,0
-einbech.gat,0,0,0,0 monster Tarou 1175,5,1800000,1500000,0
-
-// ein_fild06
-
-ein_fild06.gat,0,0,0,0 monster Goat 1372,20,0,0,0
-ein_fild06.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-ein_fild06.gat,0,0,0,0 monster Giearth 1121,2,3600000,3000000,0
-ein_fild06.gat,0,0,0,0 monster Martin 1145,30,0,0,0
-ein_fild06.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild06.gat,0,0,0,0 monster Black Mushroom 1084,10,120000,60000,0
-
-// ein_fild07
-
-ein_fild07.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-ein_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-ein_fild07.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
-ein_fild07.gat,0,0,0,0 monster Flora 1118,20,0,0,0
-ein_fild07.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
-ein_fild07.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
-
-// ein_fild08
-
-ein_fild08.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-ein_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-ein_fild08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-ein_fild08.gat,0,0,0,0 monster Metaling 1613,70,0,0,0
-ein_fild08.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
-ein_fild08.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
-ein_fild08.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild08.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-
-// ein_fild09
-
-ein_fild09.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-ein_fild09.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-ein_fild09.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
-ein_fild09.gat,0,0,0,0 monster Porcellio 1619,10,0,0,0
-ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-ein_fild09.gat,100,260,2,2 monster Thief Bug Egg 1048,3,600000,300000,0
-ein_fild09.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild09.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-ein_fild09.gat,260,85,50,20 monster Flora 1118,5,300000,120000,0
-
-// ein_fild10
-
-ein_fild10.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
-ein_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-ein_fild10.gat,0,0,0,0 monster Porcellio 1619,10,0,0,1
-ein_fild10.gat,152,314,130,30 monster Porcellio 1619,20,0,0,1
-ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-ein_fild10.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild10.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild10.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-ein_fild10.gat,225,95,30,45 monster Yoyo 1057,6,30000,10000,0
-ein_fild10.gat,320,130,40,40 monster Yoyo 1057,4,30000,10000,0
-ein_fild10.gat,225,95,30,45 monster Flora 1118,10,300000,120000,0
-ein_fild10.gat,320,130,40,40 monster Flora 1118,10,300000,120000,0
-
-// ein_dun01
-
-ein_dun01.gat,0,0,0,0 monster Pitman 1616,55,0,0,0
-ein_dun01.gat,0,0,0,0 monster Noxious 1620,40,0,0,0
-ein_dun01.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
-ein_dun01.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
-ein_dun01.gat,0,0,0,0 monster Old Stove 1617,5,120000,600000,0
-ein_dun01.gat,0,0,0,0 monster Ungoliant 1618,1,3600000,3000000,0
-
-// ein_dun02
-
-ein_dun02.gat,0,0,0,0 monster Mineral 1614,50,0,0,0
-ein_dun02.gat,0,0,0,0 monster Obsidian 1615,40,0,0,0
-ein_dun02.gat,0,0,0,0 monster Teddy Bear 1622,30,0,0,0
-ein_dun02.gat,0,0,0,0 monster Old Stove 1617,30,0,0,0
-ein_dun02.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
-ein_dun02.gat,0,0,0,0 monster RSX-0806 1623,1,7500000,7200000,0
-
-// 2005. 03. 29
-
-gefenia01.gat,0,0,0,0 monster False Angel 1371,60,0,0,0
-gefenia01.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Violy 1390,30,0,0,0
-gefenia01.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gefenia01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,10800000,7200000,0
-gefenia01.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia01.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-gefenia02.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
-gefenia02.gat,0,0,0,0 monster Succubus 1370,20,0,0,0
-gefenia02.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Violy 1390,40,0,0,0
-gefenia02.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
-gefenia02.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia02.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia02.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia02.gat,0,0,0,0 monster Ogretooth 1204,1,10800000,7200000,0
-
-gefenia03.gat,0,0,0,0 monster False Angel 1371,40,0,0,0
-gefenia03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
-gefenia03.gat,0,0,0,0 monster Incubus 1374,20,0,0,0
-gefenia03.gat,0,0,0,0 monster Violy 1390,40,0,0,0
-gefenia03.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
-gefenia03.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia03.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia03.gat,0,0,0,0 monster Executioner 1205,1,10800000,7200000,0
-gefenia03.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-gefenia04.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
-gefenia04.gat,0,0,0,0 monster Succubus 1370,10,600000,300000,0
-gefenia04.gat,0,0,0,0 monster Incubus 1374,10,600000,300000,0
-gefenia04.gat,0,0,0,0 monster Violy 1390,30,0,0,0
-gefenia04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gefenia04.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia04.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia04.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia04.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-
-// yuno_fild12
-
-yuno_fild12.gat,0,0,0,0 monster Punk 1199,30,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild12.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild12.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-
-// yuno_fild11
-
-yuno_fild11.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Geographer 1368,3,0,0,0
-yuno_fild11.gat,65,294,70,160 monster Sleeper 1386,5,0,0,0
-yuno_fild11.gat,65,294,70,160 monster Geographer 1368,2,0,0,0
-yuno_fild11.gat,225,220,125,135 monster Sleeper 1386,35,0,0,0
-yuno_fild11.gat,225,220,125,135 monster Geographer 1368,15,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild11.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-// yuno_fild09
-
-yuno_fild09.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Horn 1128,40,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
-yuno_fild09.gat,97,238,12,12 monster Goblin 1122,3,600000,60000,1
-yuno_fild09.gat,97,238,12,12 monster Goblin 1123,3,600000,60000,1
-yuno_fild09.gat,97,238,12,12 monster Goblin 1124,3,600000,60000,1
-yuno_fild09.gat,97,238,12,12 monster Goblin 1125,3,600000,60000,1
-yuno_fild09.gat,97,238,12,12 monster Goblin 1126,3,600000,60000,1
-yuno_fild09.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild09.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-// yuno_fild08
-
-yuno_fild08.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Grand Peco 1369,30,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Grand Peco 1369,20,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Grand Peco 1369,30,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Geographer 1368,12,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Geographer 1368,6,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Geographer 1368,12,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Dustiness 1114,7,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Dustiness 1114,6,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Dustiness 1114,7,0,0,0
-yuno_fild08.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild08.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-// yuno_fild07
-
-yuno_fild07.gat,0,0,0,0 monster Goat 1372,50,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Driller 1380,10,0,0,0
-yuno_fild07.gat,0,0,0,0 monster The Paper 1375,3,1800000,0,0
-yuno_fild07.gat,0,0,0,0 monster Harpy 1376,1,1800000,900000,0
-yuno_fild07.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild07.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-// yuno_fild05
-
-yuno_fild05.gat,0,0,0,0 monster Rafflesia 1162,70,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Horn 1128,30,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Arc Angeling 1388,1,3600000,180000,0
-yuno_fild05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild05.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild05.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,0
-yuno_fild05.gat,176,202,8,8 monster Blue Plant 1079,2,180000,90000,1
-yuno_fild05.gat,300,280,5,5 monster Blue Plant 1079,2,180000,90000,1
-
-
-//ayo_fild01
-ayo_fild01.gat,0,0,0,0 monster Coco 1104,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Smokie 1056,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,3,3600000,1800000,0
-ayo_fild01.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-
-//ayo_fild02
-ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,50,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,20,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-
-//ayo_dun01
-ayo_dun01.gat,0,0,0,0 monster Leaf Cat 1586,65,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Kraben 1587,5,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
-
-//ayo_dun02
-ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,70,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
-ayo_dun02.gat,150,90,15,30 monster Lady Tanee 1688,1,25200000,18000000,0
-
-
-// jawaii
-jawaii.gat,207,290,10,10 monster Phen 1158,3,3600000,1800000,0
-jawaii.gat,221,220,30,30 monster Aster 1266,2,3600000,2400000,0
-jawaii.gat,276,163,20,20 monster Aster 1266,1,7200000,3600000,0
-jawaii.gat,221,220,30,30 monster Shellfish 1074,1,4800000,3000000,0
-jawaii.gat,276,163,20,30 monster Shellfish 1074,2,4200000,2400000,0
-
-// jawaii_in
-jawaii_in.gat,128,121,1,4 monster Red Mushroom 1085,1,3000000,1200000,0
-jawaii_in.gat,124,76,1,1 monster Black Mushroom 1084,1,3600000,1200000,0
-jawaii_in.gat,72,74,5,1 monster Black Mushroom 1084,2,3000000,1200000,0
-jawaii_in.gat,73,117,4,4 monster Thief Bug 1051,1,5400000,3000000,0
-jawaii_in.gat,83,117,5,5 monster Thief Bug 1051,1,4800000,2400000,0
-
-
-
-lou_fild01.gat,0,0,0,0 monster Black Mushroom 1084,5,0,0,0
-lou_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-lou_dun01.gat,197,77,10,10 monster Black Mushroom 1084,5,0,0,0
-lou_dun01.gat,0,0,0,0 monster Shining Plant 1083,5,0,0,0
-
-
-lou_fild01.gat,224,315,100,50 monster Bigfoot 1060,7,0,0,0
-lou_fild01.gat,203,225,110,35 monster Bigfoot 1060,4,60000,30000,1
-lou_fild01.gat,273,128,75,50 monster Bigfoot 1060,4,0,0,0
-
-lou_fild01.gat,224,315,100,50 monster Caramel 1103,7,0,0,0
-lou_fild01.gat,203,225,110,35 monster Caramel 1103,7,0,0,0
-lou_fild01.gat,273,128,75,50 monster Caramel 1103,7,0,0,0
-
-lou_fild01.gat,224,315,100,50 monster Mantis 1139,10,0,0,0
-lou_fild01.gat,203,225,110,35 monster Mantis 1139,10,0,0,0
-lou_fild01.gat,273,128,75,50 monster Mantis 1139,10,0,0,0
-
-lou_fild01.gat,224,315,100,50 monster Mi Gao 1516,8,0,0,0
-lou_fild01.gat,203,225,110,35 monster Mi Gao 1516,15,60000,30000,1
-lou_fild01.gat,273,128,75,500 monster Mi Gao 1516,7,0,0,0
-
-lou_fild01.gat,224,315,100,50 monster Anacondaq 1030,2,0,0,0
-lou_fild01.gat,203,225,110,35 monster Anacondaq 1030,1,0,0,0
-lou_fild01.gat,273,128,75,50 monster Anacondaq 1030,2,0,0,0
-
-
-lou_dun01.gat,0,0,0,0 monster Horong 1129,15,0,0,0
-lou_dun01.gat,0,0,0,0 monster Mi Gao 1516,15,0,0,0
-lou_dun01.gat,215,159,40,80 monster Side Winder 1037,10,300000,120000,0
-lou_dun01.gat,215,159,40,80 monster Jing Guai 1517,25,300000,120000,0
-lou_dun01.gat,0,0,0,0 monster Jing Guai 1517,20,0,0,0
-lou_dun01.gat,0,0,0,0 monster Grizzly 1381,15,0,0,0
-lou_dun01.gat,0,0,0,0 monster Leib Olmai 1306,1,300000,120000,0
-
-
-lou_dun02.gat,0,0,0,0 monster Yao Jun 1512,40,0,0,0
-lou_dun02.gat,0,0,0,0 monster Munak 1026,25,0,0,0
-lou_dun02.gat,0,0,0,0 monster Zhu Po Long 1514,5,0,0,0
-lou_dun02.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
-
-
-lou_dun03.gat,0,0,0,0 monster Yao Jun 1512,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Zhu Po Long 1514,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Mao Guai 1513,15,0,0,0
-lou_dun03.gat,0,0,0,0 monster Green Maiden 1631,5,3000000,1800000,1
-lou_dun03.gat,0,0,0,0 monster White Lady 1630,1,7000000,5000000,1
-
-
-
-payon_in02.gat,23,68,5,5 monster Thief Bug 1051,7,1200000,600000,0
-
-
-niflheim.gat,0,0,0,0 monster Dullahan 1504,5,1800000,1200000,0
-niflheim.gat,0,0,0,0 monster Gibbet 1503,10,1200000,600000,0
-niflheim.gat,0,0,0,0 monster Heirozoist 1510,10,1200000,600000,0
-niflheim.gat,0,0,0,0 monster Quve 1508,20,300000,150000,0
-niflheim.gat,0,0,0,0 monster Lude 1509,20,300000,150000,0
-
-
-nif_fild01.gat,0,0,0,0 monster Disguise 1506,20,0,0,0
-nif_fild01.gat,0,0,0,0 monster Disguise 1506,30,300000,120000,0
-nif_fild01.gat,227,253,20,20 monster Dullahan 1504,7,1800000,1200000,0
-nif_fild01.gat,0,0,0,0 monster Dullahan 1504,18,0,0,0
-nif_fild01.gat,0,0,0,0 monster Gibbet 1503,15,0,0,0
-nif_fild01.gat,0,0,0,0 monster Heirozoist 1510,15,0,0,0
-nif_fild01.gat,0,0,0,0 monster Quve 1508,30,0,0,0
-
-
-nif_fild02.gat,366,236,15,15 monster Lude 1509,10,360000,150000,0
-nif_fild02.gat,356,139,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,144,232,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,118,282,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,62,327,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,10,0,0,0
-nif_fild02.gat,114,136,15,15 monster Loli Ruri 1505,2,1200000,600000,0
-nif_fild02.gat,52,115,10,10 monster Heirozoist 1510,4,1200000,600000,0
-nif_fild02.gat,84,276,15,15 monster Gibbet 1503,5,1200000,600000,0
-nif_fild02.gat,352,273,15,15 monster Gibbet 1503,5,300000,150000,0
-nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,20,60000,60000,0
-nif_fild02.gat,352,273,15,15 monster Dullahan 1504,5,600000,300000,0
-nif_fild02.gat,0,0,0,0 monster Dullahan 1504,5,0,0,0
-nif_fild02.gat,0,0,0,0 monster Heirozoist 1510,6,0,0,0
-nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-
-
-yggdrasil01.gat,234,256,10,10 monster Blue Plant 1079,5,1800000,600000,0
-yggdrasil01.gat,273,234,3,3 monster Shining Plant 1083,1,1800000,600000,0
-yggdrasil01.gat,143,257,20,10 monster Shining Plant 1083,5,1200000,600000,0
-yggdrasil01.gat,98,238,20,15 monster Yellow Plant 1081,5,1200000,600000,0
-yggdrasil01.gat,98,238,20,15 monster White Plant 1082,5,1200000,600000,0
-yggdrasil01.gat,47,207,20,20 monster Blue Plant 1079,5,1200000,600000,0
-yggdrasil01.gat,61,258,3,3 monster Shining Plant 1083,1,1800000,600000,0
-yggdrasil01.gat,132,199,20,5 monster Blue Plant 1079,5,1200000,600000,0
-yggdrasil01.gat,209,218,2,2 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,192,186,2,2 monster Shining Plant 1083,1,1800000,1200000,0
-yggdrasil01.gat,169,176,3,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,169,176,3,3 monster Green Plant 1080,1,60000,30000,0
-yggdrasil01.gat,94,111,5,2 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,51,118,10,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,133,54,3,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,257,63,10,10 monster Shining Plant 1083,3,1800000,1200000,0
-yggdrasil01.gat,0,0,0,0 monster Shining Plant 1083,10,3600000,2300000,0
-yggdrasil01.gat,0,0,0,0 monster Green Plant 1080,25,60000,30000,0
-yggdrasil01.gat,0,0,0,0 monster Red Plant 1078,15,60000,30000,0
-
-
-// um_fild01
-
-um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
-um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
-um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
-um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-
-// um_fild02
-
-um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
-um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
-um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
-um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,360,320,20,30 monster Flora 1118,3,180000,120000,0
-// um_fild03
-
-um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
-um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
-um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
-um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
-um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3500000,1900000,0
-
-// um_fild04
-
-um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
-um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
-um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
-um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,120000,60000,0
-um_fild04.gat,264,293,10,10 monster Horn 1128,2,1200000,60000,0
-um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,118,237,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,311,285,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,206,188,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,3,0,0,0
-
-// um_dun01
-
-um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,70,0,0,0
-um_dun01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
-
-// um_dun02
-
-um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,15,0,0,0
-um_dun02.gat,79,227,5,5 monster Wooden Golem 1497,5,120000,60000,0
-um_dun02.gat,87,189,5,5 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,170,145,5,5 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,196,131,7,7 monster Wooden Golem 1497,5,120000,60000,0
-um_dun02.gat,244,129,10,10 monster Wooden Golem 1497,5,120000,60000,0
-
-um_dun02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_dun02.gat,117,43,10,10 monster Beetle King 1494,3,120000,60000,0
-um_dun02.gat,209,34,10,10 monster Beetle King 1494,3,120000,60000,0
-um_dun02.gat,205,265,10,10 monster Beetle King 1494,4,120000,60000,0
-
-um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,10,0,0,0
-um_dun02.gat,90,97,10,10 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,32,83,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,180,238,10,10 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,144,277,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,272,163,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,232,156,10,10 monster Wooden Golem 1497,3,120000,60000,0
-
-um_dun02.gat,0,0,0,0 monster Driller 1380,5,0,0,0
-um_dun02.gat,197,138,10,10 monster Driller 1380,2,120000,60000,0
-um_dun02.gat,164,203,10,10 monster Driller 1380,1,120000,60000,0
-um_dun02.gat,32,83,10,10 monster Driller 1380,1,120000,60000,0
-um_dun02.gat,244,129,10,10 monster Driller 1380,2,120000,60000,0
-
-um_dun02.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
-um_dun02.gat,213,217,10,10 monster Wootan Shooter 1498,2,120000,60000,0
-um_dun02.gat,72,258,10,10 monster Wootan Shooter 1498,3,120000,60000,0
-um_dun02.gat,79,227,5,5 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,170,145,5,5 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,209,34,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,272,163,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,232,156,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-
-um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
-
-
-
-//gon_fild01
-
-gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,600000,300000,0
-gon_fild01.gat,0,0,0,0 monster Zipper Bear 1417,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Dumpling Child 1409,30,0,0,0
-gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,630000,330000,0
-gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,0
-gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,0
-
-//gon_dun01
-
-gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,650000,350000,0
-gon_dun01.gat,0,0,0,0 monster Enchanted Peach Tree 1410,35,0,0,0
-gon_dun01.gat,0,0,0,0 monster Zipper Bear 1417,30,0,0,0
-
-gon_dun01.gat,0,0,0,0 monster Red Plant 1078,5,0,0,0
-gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
-
-//gon_dun02
-
-gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,2,300000,150000,0
-gon_dun02.gat,241,226,15,20 monster Baby Leopard 1415,4,600000,300000,0
-gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,3,120000,60000,0
-gon_dun02.gat,33,115,10,15 monster Enchanted Peach Tree 1410,1,300000,150000,0
-gon_dun02.gat,33,115,10,15 monster Baby Leopard 1415,2,600000,300000,0
-gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,20,690000,390000,0
-gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
-gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,15,0,0,0
-gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-
-//gon_dun03
-
-gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
-gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,600000,300000,0
-gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,600000,300000,0
-gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
-gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,5650000,3650000,0
-
-
-
-
-sec_in02.gat,139,80,20,10 monster Poring 1002,5,0,0,0
-sec_in02.gat,138,54,20,20 monster Marin 1242,5,0,0,0
-sec_in02.gat,161,46,15,15 monster Poporing 1031,5,0,0,0
-sec_in02.gat,114,47,10,10 monster Drops 1113,5,0,0,0
-sec_in02.gat,114,47,10,10 monster Bigfoot 1060,10,0,0,0
-sec_in02.gat,139,80,30,30 monster Flora 1118,10,0,0,0
-
-
-
-// ama_fild01
-
-ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
-ama_fild01.gat,174,207,20,20 monster Kapha 1406,5,1200000,300000,0
-ama_fild01.gat,241,310,10,10 monster Kapha 1406,5,600000,300000,0
-ama_fild01.gat,114,230,10,10 monster Kapha 1406,5,600000,300000,0
-ama_fild01.gat,174,253,10,10 monster Kapha 1406,5,600000,300000,0
-
-ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,69000,34500,0
-ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,72000,39000,0
-
-ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,72000,39000,0
-ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,69000,34500,0
-ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,63000,31500,0
-
-ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,66000,33000,0
-
-ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
-
-ama_fild01.gat,0,0,0,0 monster Kapha 1406,20,60000,30000,0
-ama_fild01.gat,174,306,20,20 monster Kapha 1406,10,300000,150000,0
-ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,180000,90000,0
-ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,180000,90000,0
-ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,60000,30000,0
-
-
-
-ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
-ama_dun01.gat,0,0,0,0 monster Firelock Soldier 1403,45,0,0,0
-ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
-
-
-
-ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,0,0,0
-ama_dun02.gat,0,0,0,0 monster Firelock Soldier 1403,20,60000,30000,0
-ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,120000,60000,0
-ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
-ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
-ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,180000,90000,0
-
-
-
-ama_dun03.gat,0,0,0,0 monster Shinobi 1401,35,300000,150000,0
-ama_dun03.gat,0,0,0,0 monster Firelock Soldier 1403,25,0,0,0
-ama_dun03.gat,0,0,0,0 monster Miyabi Doll 1404,1,0,0,0
-ama_dun03.gat,0,0,0,0 monster Tengu 1405,40,300000,150000,0
-ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
-ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,600000,300000,0
-
-ama_dun03.gat,0,0,0,0 monster Samurai Specter 1492,1,5460000,3600000,0
-ama_dun03.gat,0,0,0,0 monster Shinobi 1401,20,5450000,3600000,0
-ama_dun03.gat,0,0,0,0 monster Tengu 1405,15,5440000,3600000,0
-
-
-
-// mag_dun01
-
-mag_dun01.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
-mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,20,600000,300000,0
-mag_dun01.gat,0,0,0,0 monster Kaho 1072,20,0,0,0
-mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
-mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
-
-// mag_dun02
-
-mag_dun02.gat,70,190,20,20 monster Blazer 1367,5,300000,150000,0
-mag_dun02.gat,200,120,40,40 monster Blazer 1367,15,300000,150000,0
-mag_dun02.gat,70,87,50,50 monster Nightmare Terror 1379,10,300000,150000,0
-mag_dun02.gat,210,156,15,15 monster Nightmare Terror 1379,3,60000,30000,0
-mag_dun02.gat,135,153,15,15 monster Nightmare Terror 1379,3,60000,30000,0
-mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,12,60000,30000,0
-mag_dun02.gat,120,202,20,20 monster Deleter 1384,5,60000,30000,0
-mag_dun02.gat,185,185,50,50 monster Deleter 1385,10,300000,150000,0
-mag_dun02.gat,200,77,30,30 monster Deleter 1384,5,300000,150000,0
-mag_dun02.gat,0,0,0,0 monster Gig 1387,10,0,0,0
-mag_dun02.gat,200,77,30,30 monster Diabolic 1382,10,300000,150000,0
-mag_dun02.gat,135,68,15,15 monster Diabolic 1382,5,300000,30000,0
-mag_dun02.gat,0,0,0,0 monster Diabolic 1382,5,60000,30000,0
-
-
-prontera.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-morocc.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-alberta.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-aldebaran.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-geffen.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-payon.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-comodo.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-izlude.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-yuno.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-umbala.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-amatsu.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-gonryun.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-
-
-
-// yuno_fild01 (lv2)
-
-yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-yuno_fild01.gat,190,329,80,20 monster Grand Peco 1369,3,50000,25000,0
-
-// yuno_fild02 (lv3)
-
-yuno_fild02.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Horn 1128,40,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Sage Worm 1281,10,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
-
-// yuno_fild03 (lv4)
-
-yuno_fild03.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Marin 1242,20,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
-yuno_fild03.gat,62,131,44,15 monster Side Winder 1037,1,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
-yuno_fild03.gat,0,0,0,0 monster Deviling 1582,1,3600000,1800000,1
-
-// yuno_fild04 (lv3)
-
-yuno_fild04.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Condor 1009,20,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
-
-
-// prt_fild00 (lv2)
-
-prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
-prt_fild00.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
-prt_fild00.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
-prt_fild00.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
-prt_fild00.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
-
-// prt_fild01 (lv1)
-
-prt_fild01.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
-prt_fild01.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
-prt_fild01.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-prt_fild01.gat,0,0,0,0 monster Lunatic 1063,80,0,0,0
-prt_fild01.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-
-// prt_fild02 (lv2)
-
-prt_fild02.gat,0,0,0,0 monster Mandragora 1020,75,0,0,0
-prt_fild02.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
-prt_fild02.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild02.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
-prt_fild02.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,3600000,1800000,0
-
-// prt_fild03 (lv2)
-
-prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
-prt_fild03.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
-prt_fild03.gat,0,0,0,0 monster Choco 1214,3,1800000,900000,0
-prt_fild03.gat,0,0,0,0 monster Fabre 1007,10,0,0,0
-prt_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-
-// prt_fild04 (lv2)
-
-prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
-prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
-prt_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-prt_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild04.gat,0,0,0,0 monster Vocal 1088,1,3600000,1800000,0
-
-// prt_fild05 (lv1)
-
-prt_fild05.gat,0,0,0,0 monster Poring 1002,70,0,0,0
-prt_fild05.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_fild05.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
-prt_fild05.gat,0,0,0,0 monster Pupa 1008,30,0,0,0
-prt_fild05.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-
-// prt_fild06 (lv2)
-
-prt_fild06.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
-prt_fild06.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_fild06.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-prt_fild06.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild06.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-
-// prt_fild07 (lv2)
-
-prt_fild07.gat,0,0,0,0 monster Rocker 1052,120,0,0,0
-prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-
-// prt_fild08 (lv1)
-
-prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
-prt_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild08.gat,0,0,0,0 monster Poring 1002,100,0,0,0
-prt_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-
-// prt_fild09 (lv2)
-
-prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
-prt_fild09.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
-
-// prt_fild10 (lv3)
-
-prt_fild10.gat,0,0,0,0 monster Savage 1166,70,0,0,0
-prt_fild10.gat,0,0,0,0 monster Savage Babe 1167,40,0,0,0
-prt_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-prt_fild10.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-
-// prt_fild11 (lv4)
-
-prt_fild11.gat,0,0,0,0 monster Goblin 1122,20,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1123,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1124,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1125,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1126,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
-prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin Steamrider 1280,30,0,0,0
-//putmob "prt_fild11" 0 0 0 0 20 ROTAR_ZAIRO 0 0 0
-
-
-
-// moc_fild01 (lv2)
-
-moc_fild01.gat,0,0,0,0 monster Baby Desert Wolf 1107,70,0,0,0
-moc_fild01.gat,0,0,0,0 monster Ant Egg 1097,20,0,0,0
-moc_fild01.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
-moc_fild01.gat,0,0,0,0 monster Picky 1049,10,0,0,0
-moc_fild01.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-moc_fild01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-
-// moc_fild02 (lv2)
-
-moc_fild02.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
-moc_fild02.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild02.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
-moc_fild02.gat,0,0,0,0 monster Picky 1049,10,0,0,0
-moc_fild02.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-
-// moc_fild03 (lv3)
-
-moc_fild03.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
-moc_fild03.gat,0,0,0,0 monster Greatest General 1277,40,0,0,0
-moc_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-moc_fild03.gat,0,0,0,0 monster Eggyra 1116,20,0,0,0
-moc_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
-moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
-
-// moc_fild04 (lv3)
-
-moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
-moc_fild04.gat,0,0,0,0 monster Scorpion 1001,30,0,0,0
-moc_fild04.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Magnolia 1138,40,0,0,0
-moc_fild04.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild04.gat,0,0,0,0 monster Andre 1095,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Piere 1160,20,0,0,0
-
-// moc_fild05 (lv2)
-
-moc_fild05.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
-moc_fild05.gat,0,0,0,0 monster Metaller 1058,40,0,0,0
-moc_fild05.gat,0,0,0,0 monster Golem 1040,70,0,0,0
-moc_fild05.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Piere 1160,10,0,0,0
-
-
-// moc_fild06 (lv2)
-
-moc_fild06.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
-moc_fild06.gat,0,0,0,0 monster Muka 1055,30,0,0,0
-moc_fild06.gat,0,0,0,0 monster Condor 1009,50,0,0,0
-moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
-
-moc_fild06.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-
-// moc_fild07 (lv1)
-
-moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
-moc_fild07.gat,0,0,0,0 monster Peco Peco Egg 1047,50,0,0,0
-moc_fild07.gat,0,0,0,0 monster Picky 1050,30,0,0,0
-moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
-
-
-// moc_fild08 (lv4)
-
-moc_fild08.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Scorpion 1001,80,0,0,0
-moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,40,0,0,0
-moc_fild08.gat,0,0,0,0 monster Anacondaq 1030,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
-moc_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-
-
-// moc_fild09 (lv3)
-
-moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Metaller 1058,70,0,0,0
-moc_fild09.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
-moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
-
-// moc_fild10 (lv1)
-
-moc_fild10.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-moc_fild10.gat,0,0,0,0 monster Peco Peco Egg 1047,70,0,0,0
-moc_fild10.gat,0,0,0,0 monster Picky 1049,50,0,0,0
-moc_fild10.gat,0,0,0,0 monster Picky 1050,50,0,0,0
-moc_fild10.gat,0,0,0,0 monster Magnolia 1138,1,0,0,0
-moc_fild10.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-
-// moc_fild11 (lv2)
-
-moc_fild11.gat,0,0,0,0 monster Hode 1127,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Golem 1040,70,0,0,0
-moc_fild11.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Piere 1160,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
-moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
-
-// moc_fild12 (lv1)
-
-moc_fild12.gat,0,0,0,0 monster Picky 1050,50,0,0,0
-moc_fild12.gat,0,0,0,0 monster Picky 1049,50,0,0,0
-moc_fild12.gat,0,0,0,0 monster Peco Peco Egg 1047,35,0,0,0
-moc_fild12.gat,0,0,0,0 monster Drops 1113,35,0,0,0
-
-// moc_fild13 (lv3)
-
-// putmob "moc_fild13" 0 0 0 0 15 DESERT_WOLF 0 0 0
-moc_fild13.gat,0,0,0,0 monster Anacondaq 1030,60,0,0,0
-moc_fild13.gat,0,0,0,0 monster Boa 1025,25,0,0,0
-moc_fild13.gat,0,0,0,0 monster Side Winder 1037,40,0,0,0
-moc_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-moc_fild13.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-
-// moc_fild14 (lv4)
-
-moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
-moc_fild14.gat,0,0,0,0 monster Side Winder 1037,40,0,0,0
-moc_fild14.gat,0,0,0,0 monster Baby Desert Wolf 1107,10,0,0,0
-moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-
-// moc_fild15 (lv3)
-
-moc_fild15.gat,0,0,0,0 monster Hode 1127,30,0,0,0
-moc_fild15.gat,0,0,0,0 monster Scorpion 1001,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild15.gat,0,0,0,0 monster Andre 1095,40,0,0,0
-moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,1
-
-// moc_fild16 (lv4)
-
-moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,0,0,0
-moc_fild16.gat,0,0,0,0 monster Hode 1127,30,0,0,0
-moc_fild16.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild16.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild16.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild16.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-
-// moc_fild17 (lv3)
-
-moc_fild17.gat,0,0,0,0 monster Hode 1127,70,0,0,0
-moc_fild17.gat,0,0,0,0 monster Steel Chonchon 1042,30,0,0,0
-moc_fild17.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
-moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
-moc_fild17.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild17.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild17.gat,0,0,0,0 monster Piere 1160,20,0,0,0
-moc_fild17.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild17.gat,0,0,0,0 monster Scorpion 1001,5,0,0,0
-moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
-
-// moc_fild18 (lv2)
-
-moc_fild18.gat,0,0,0,0 monster Steel Chonchon 1042,70,0,0,0
-moc_fild18.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
-moc_fild18.gat,0,0,0,0 monster Muka 1055,40,0,0,0
-moc_fild18.gat,0,0,0,0 monster Metaller 1058,10,0,0,0
-moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild18.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Ant Egg 1097,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Dragon Fly 1091,1,3600000,1800000,1
-moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,7200000,3600000,1
-
-
-
-
-// pay_fild01 (lv2)
-
-pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
-pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-//putmob "pay_fild01" 0 0 0 0 30 BIGFOOT 0 0 0
-
-
-// pay_fild02 (lv2)
-
-pay_fild02.gat,0,0,0,0 monster Boa 1025,50,0,0,0
-pay_fild02.gat,0,0,0,0 monster Wolf 1013,70,0,0,0
-pay_fild02.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild02.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-
-// pay_fild03 (lv1)
-
-pay_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
-pay_fild03.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
-pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,0,0,0
-
-// pay_fild04 (lv2)
-
-pay_fild04.gat,0,0,0,0 monster Poring 1002,50,0,0,0
-pay_fild04.gat,0,0,0,0 monster Drops 1113,50,0,0,0
-pay_fild04.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-pay_fild04.gat,0,0,0,0 monster Marin 1242,10,0,0,0
-pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,1800000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,1800000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Deviling 1582,1,3600000,3600000,1
-
-// pay_fild05 (lv4)
-
-pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,1,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,70,0,0,0
-
-// pay_fild06 (lv2)
-
-pay_fild06.gat,0,0,0,0 monster Wormtail 1024,100,0,0,0
-pay_fild06.gat,0,0,0,0 monster Spore 1014,40,0,0,0
-pay_fild06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild06.gat,0,0,0,0 monster Thief Bug Female 1053,40,0,0,0
-
-// pay_fild07 (lv3)
-
-pay_fild07.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
-pay_fild07.gat,0,0,0,0 monster Eggyra 1116,40,0,0,0
-pay_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild07.gat,0,0,0,0 monster Willow 1010,20,0,0,0
-pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,0,0,0
-
-// pay_fild08 (lv1)
-
-pay_fild08.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-pay_fild08.gat,0,0,0,0 monster Willow 1010,70,0,0,0
-pay_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-pay_fild08.gat,0,0,0,0 monster Spore 1014,50,0,0,0
-
-// pay_fild09 (lv2)
-
-pay_fild09.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Wormtail 1024,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Boa 1025,30,0,0,0
-pay_fild09.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
-pay_fild09.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
-pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,65,0,0,0
-pay_fild09.gat,0,0,0,0 monster Wanderer 1208,1,3600000,1800000,1
-
-// pay_fild10 (lv4)
-
-pay_fild10.gat,0,0,0,0 monster Greatest General 1277,65,0,0,0
-pay_fild10.gat,0,0,0,0 monster Horong 1129,40,0,0,0
-pay_fild10.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-pay_fild10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,1800000,900000,1
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,900000,450000,1
-
-// pay_fild11 (lv4)
-
-pay_fild11.gat,0,0,0,0 monster Horong 1129,50,0,0,0
-pay_fild11.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
-pay_fild11.gat,0,0,0,0 monster Elder Willow 1033,10,0,0,0
-pay_fild11.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild11.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
-pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,0,0,0
-pay_fild11.gat,0,0,0,0 monster Eddga 1115,1,7200000,3600000,1
-
-
-
-// gef_fild00 (lv1)
-
-gef_fild00.gat,0,0,0,0 monster Poring 1002,80,0,0,0
-gef_fild00.gat,0,0,0,0 monster Fabre 1007,80,0,0,0
-gef_fild00.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-gef_fild00.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-
-// gef_fild01 (lv1)
-
-gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,50,0,0,0
-gef_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild01.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
-
-// gef_fild02 (lv2)
-
-gef_fild02.gat,0,0,0,0 monster Yoyo 1057,10,0,0,0
-gef_fild02.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
-gef_fild02.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-gef_fild02.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
-gef_fild02.gat,0,0,0,0 monster Choco 1214,1,0,0,0
-
-
-// gef_fild03 (lv3)
-
-gef_fild03.gat,0,0,0,0 monster Orc Warrior 1023,30,0,0,0
-gef_fild03.gat,0,0,0,0 monster High Orc 1213,10,0,0,0
-gef_fild03.gat,0,0,0,0 monster Savage 1166,40,0,0,0
-gef_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-
-// gef_fild04 (lv1)
-
-gef_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-gef_fild04.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
-gef_fild04.gat,0,0,0,0 monster Pupa 1008,60,0,0,0
-gef_fild04.gat,0,0,0,0 monster Fabre 1007,30,0,0,0
-gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,30,0,0,0
-
-// gef_fild05 (lv3)
-
-gef_fild05.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-gef_fild05.gat,0,0,0,0 monster Kobold Archer 1282,15,0,0,0
-gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,0,0,0
-gef_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
-
-// gef_fild06 (lv4)
-
-gef_fild06.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 1134,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 1135,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Petite 1156,35,0,0,0
-gef_fild06.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-gef_fild06.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-
-// gef_fild07 (lv1)
-
-gef_fild07.gat,0,0,0,0 monster Poring 1002,70,0,0,0
-gef_fild07.gat,0,0,0,0 monster Chonchon 1011,50,0,0,0
-gef_fild07.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-gef_fild07.gat,0,0,0,0 monster Fabre 1007,70,0,0,0
-
-// gef_fild08 (lv3)
-
-gef_fild08.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 1134,40,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 1135,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Golem 1040,40,0,0,0
-gef_fild08.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-
-// gef_fild09 (lv3)
-
-gef_fild09.gat,0,0,0,0 monster Ambernite 1094,70,0,0,0
-gef_fild09.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-
-// gef_fild10 (lv3)
-
-gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
-gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
-gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
-gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild10.gat,0,0,0,0 monster Orc Baby 1686,5,120000,0,0
-
-// gef_fild11 (lv4)
-
-gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,240000,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1122,30,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1123,25,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1124,25,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1125,25,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1126,25,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild11.gat,0,0,0,0 monster Rotar Zairo 1392,10,0,0,0
-
-// gef_fild12 (lv4)
-gef_fild12.gat,0,0,0,0 monster Kobold 1133,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 1134,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 1135,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold Archer 1282,40,0,0,0
-gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,240000,0,0
-
-// gef_fild13 (lv2)
-gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild13.gat,0,0,0,0 monster Creamy 1018,30,0,0,0
-gef_fild13.gat,0,0,0,0 monster Ambernite 1094,15,0,0,0
-
-// gef_fild14 (lv4)
-gef_fild14.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,1800000,1
-gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Archer 1189,30,0,0,0
-gef_fild14.gat,0,0,0,0 monster High Orc 1213,60,0,0,0
-
-
-
-// cmd_fild01 (lv3)
-
-cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-
-// cmd_fild02 (lv3)
-
-cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,0,0,0
-cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
-cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,60000,0,0
-cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,180000,0,0
-cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,60000,0,0
-cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
-cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,180000,0,0
-cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
-cmd_fild02.gat,200,130,150,40 monster Seal 1317,25,0,0,0
-cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,180000,0,0
-cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
-
-// cmd_fild03 (lv4)
-
-cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
-cmd_fild03.gat,0,0,0,0 monster Pest 1256,20,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Anolian 1206,70,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
-cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,20,0,0,0
-
-// cmd_fild04 (lv3)
-
-cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
-cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
-
-// cmd_fild05 (lv3)
-
-cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
-
-// cmd_fild06 (lv3)
-
-cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
-cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
-cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,180000,0,0
-
-cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
-cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,0,0,0
-cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,0,0,0
-cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,0,0,0
-cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,0,0,0
-cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
-
-//cmd_fild07
-cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
-cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
-cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
-cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
-cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,180000,0,0
-cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,180000,0,0
-cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,60000,0,0
-cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
-cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
-cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
-
-// cmd_fild08 (lv4)
-
-cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,60000,0,0
-cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
-
-cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,60000,0,0
-cmd_fild08.gat,190,115,100,80 monster Kobold Archer 1282,10,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,7,0,0,0
-cmd_fild08.gat,72,131,40,100 monster Kobold Archer 1282,8,0,0,0
-cmd_fild08.gat,319,177,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,319,172,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,139,71,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,136,64,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,67,80,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,132,149,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,97,144,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,79,140,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,28,102,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,30000,0,0
-cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,0,0,0
-cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,0,0,0
-cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,180000,0,0
-cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
-
-// cmd_fild09 (lv2)
-
-cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Condor 1009,40,0,0,0
-cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,150000,0,0
-cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,150000,0,0
-
-
-
-// mjolnir_01 (lv2)
-
-mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Coco 1104,40,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Caramel 1103,70,0,0,0
-
-// mjolnir_02 (lv3)
-
-mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Petite 1155,35,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Flora 1118,30,0,0,0
-
-// mjolnir_03 (lv4)
-
-mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Petite 1156,60,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Flora 1118,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-
-// mjolnir_04 (lv4)
-
-mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Flora 1118,30,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
-
-// mjolnir_05 (lv4)
-
-mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-
-// mjolnir_06 (lv2)
-
-mjolnir_06.gat,0,0,0,0 monster Stainer 1174,50,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Horn 1128,30,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
-
-// mjolnir_07 (lv3)
-
-mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
-
-// mjolnir_08 (lv4)
-
-mjolnir_08.gat,0,0,0,0 monster Mantis 1139,50,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argos 1100,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-
-// mjolnir_09 (lv2)
-
-mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Stainer 1174,30,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Rocker 1052,20,0,0,0
-
-// mjolnir_10 (lv3)
-
-mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Flora 1118,15,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Argos 1100,50,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Petite 1155,5,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Argiope 1099,60,0,0,0
-
-// mjolnir_11 (lv4)
-
-mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
-
-// mjolnir_12 (lv3)
-
-mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
-
-
-
-
-
-// prt_sewb1
-prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,90,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Thief Bug 1051,40,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Tarou 1175,20,0,0,0
-
-// prt_sewb2
-prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Thief Bug 1051,70,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Plankton 1161,30,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Thief Bug Female 1053,10,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
-
-// prt_sewb3
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Female 1053,65,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Male 1054,65,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Tarou 1175,15,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-
-// prt_sewb4
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Male 1054,70,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,1800000,1
-
-
-
-// mjo_dun01
-mjo_dun01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Tarou 1175,80,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Martin 1145,40,0,0,0
-
-// mjo_dun02
-mjo_dun02.gat,0,0,0,0 monster Martin 1145,60,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
-
-// mjo_dun03
-mjo_dun03.gat,0,0,0,0 monster Martin 1145,5,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,70,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Giearth 1121,5,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Myst 1151,35,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Cramp 1209,2,300000,150000,0
-mjo_dun03.gat,0,0,0,0 monster Cramp 1209,1,50000,25000,0
-
-
-
-// Orcsdun01
-
-orcsdun01.gat,0,0,0,0 monster Steel Chonchon 1042,10,0,0,0
-orcsdun01.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
-orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,10,0,0,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,40,3000,5000,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,20,30000,15000,0
-orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,90000,30000,0
-
-// Orcsdun02
-
-orcsdun02.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,10,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,60000,30000,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,120000,60000,0
-orcsdun02.gat,0,0,0,0 monster Zenorc 1177,30,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Zenorc 1177,20,60000,30000,0
-orcsdun02.gat,0,0,0,0 monster Orc Archer 1189,5,1800000,900000,1
-
-
-
-// Anthell01
-anthell01.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-anthell01.gat,0,0,0,0 monster Andre 1095,50,0,0,0
-anthell01.gat,0,0,0,0 monster Piere 1160,50,0,0,0
-anthell01.gat,0,0,0,0 monster Deniro 1105,50,0,0,0
-anthell01.gat,0,0,0,0 monster Vitata 1176,20,0,0,0
-anthell01.gat,0,0,0,0 monster Giearth 1121,1,0,0,0
-anthell01.gat,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,1
-anthell01.gat,28,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,261,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,270,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,269,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,268,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,267,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-
-anthell01.gat,41,269,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,268,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,267,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,197,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,196,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,194,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,33,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,33,196,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,190,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,190,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,189,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,167,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,43,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,44,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,45,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,44,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,43,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,37,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,36,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,35,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,36,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,184,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,183,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,37,183,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,99,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,98,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,126,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,125,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,124,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,123,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,98,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,99,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,100,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,101,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,123,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,122,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,120,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,103,120,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,103,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,105,124,0,0 monster Ant Egg 1097,1,60000,30000,0
-
-// Anthell02
-anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,0,0,0
-anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-anthell02.gat,0,0,0,0 monster Andre 1095,40,0,0,0
-anthell02.gat,0,0,0,0 monster Piere 1160,15,0,0,0
-anthell02.gat,0,0,0,0 monster Deniro 1105,15,0,0,0
-anthell02.gat,0,0,0,0 monster Vitata 1176,30,0,0,0
-anthell02.gat,0,0,0,0 monster Giearth 1121,3,0,0,0
-anthell02.gat,0,0,0,0 monster Maya 1147,1,7200000,3600000,0
-
-
-//putmob "xmas" 0 0 0 0 1 SASQUATCH 3600000 7200000 0
-//putmob "xmas" 0 0 0 0 3 PORING_ 60000 30000 0
-
-
-xmas_fild01.gat,0,0,0,0 monster Marin 1242,35,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Sasquatch 1243,20,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
-xmas_fild01.gat,0,0,0,0 monster Garm 1252,1,7200000,3600000,1
-
-
-xmas_dun01.gat,0,0,0,0 monster Marin 1242,20,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-//putmob "xmas_dun01" 0 0 0 0 20 GOBLINE_XMAS 0 0 0
-xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,40,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Cookie 1265,40,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Myst Case 1249,5,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Chepet 1250,1,1200000,900000,0
-xmas_dun01.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,0
-xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
-
-
-xmas_dun02.gat,0,0,0,0 monster Christmas Cookie 1246,20,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Cookie 1265,20,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Cruiser 1248,35,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,50,0,0,0
-//putmob "xmas_dun02" 0 0 0 0 10 GOBLINE_XMAS 0 0 0
-xmas_dun02.gat,0,0,0,0 monster Stormy Knight 1251,1,3600000,7200000,0
-xmas_dun02.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
-
-
-
-
-// pay_dun00
-pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
-pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
-pay_dun00.gat,0,0,0,0 monster Skeleton 1076,35,0,0,0
-pay_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-
-// pay_dun01
-
-pay_dun01.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-pay_dun01.gat,0,0,0,0 monster Eggyra 1116,20,0,0,0
-pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
-pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,40,30000,15000,1
-pay_dun01.gat,0,0,0,0 monster Archer Skeleton 1016,30,30000,15000,1
-
-// pay_dun02
-
-pay_dun02.gat,0,0,0,0 monster Soldier Skeleton 1028,15,180000,90000,1
-pay_dun02.gat,0,0,0,0 monster Munak 1026,40,0,0,0
-pay_dun02.gat,0,0,0,0 monster Bongun 1188,30,0,0,0
-pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_dun02.gat,0,0,0,0 monster Archer Skeleton 1016,20,180000,90000,1
-pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
-pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
-pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
-pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
-pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
-pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
-pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,118,207,0,0 monster Hydra 1068,1,332000,100000,1
-pay_dun02.gat,118,201,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
-pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
-pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
-pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,119,196,0,0 monster Hydra 1068,1,315000,100000,1
-pay_dun02.gat,120,203,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,120,200,0,0 monster Hydra 1068,1,303000,100000,1
-pay_dun02.gat,120,194,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,121,200,0,0 monster Hydra 1068,1,333000,100000,1
-pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,122,197,0,0 monster Hydra 1068,1,321000,100000,1
-pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,113,194,0,0 monster Hydra 1068,1,319000,100000,1
-pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,113,193,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
-pay_dun02.gat,112,192,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
-pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
-pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,227,185,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,227,184,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,229,183,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,214,266,0,0 monster Red Plant 1078,1,600000,300000,1
-pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
-pay_dun02.gat,37,243,0,0 monster Nine Tail 1180,1,3600000,1800000,1
-
-// pay_dun03
-pay_dun03.gat,0,0,0,0 monster Sohee 1170,50,0,0,0
-pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Bongun 1188,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
-pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,3600000,1800000,0
-pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,14400000,0,1
-pay_dun03.gat,66,73,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,68,72,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,67,71,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,63,70,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,58,69,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,67,69,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,60,68,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,69,68,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,62,67,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,67,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,64,66,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,57,65,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,66,65,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,59,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,68,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,66,63,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,243,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,86,248,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,85,178,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,115,190,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,230,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,240,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,219,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,243,220,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,219,185,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,228,185,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,228,61,0,0 monster Red Plant 1078,1,600000,300000,1
-pay_dun03.gat,138,42,0,0 monster Blue Plant 1079,1,600000,300000,1
-pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
-pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
-pay_dun03.gat,126,135,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,134,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,133,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,132,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,131,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,134,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,133,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,132,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,131,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,130,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
-
-// pay_dun04
-
-pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
-pay_dun04.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
-pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
-pay_dun04.gat,0,0,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
-pay_dun04.gat,0,0,0,0 monster Greatest General 1277,15,0,0,0
-pay_dun04.gat,0,0,0,0 monster Archer Skeleton 1016,15,0,0,0
-pay_dun04.gat,0,0,0,0 monster Nine Tail 1180,20,60000,30000,0
-pay_dun04.gat,0,0,0,0 monster Skeleton General 1290,1,1800000,1200000,0
-pay_dun04.gat,0,0,0,0 monster Am Mut 1301,1,1800000,1200000,0
-pay_dun04.gat,0,0,0,0 monster Cat o' Nine Tails 1307,1,3600000,7200000,1
-
-
-// Iz_dun00
-iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
-iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
-iz_dun00.gat,0,0,0,0 monster Kukre 1070,30,0,0,0
-iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Vadon 1066,30,0,0,0
-
-// Iz_dun01
-iz_dun01.gat,0,0,0,0 monster Plankton 1161,10,0,0,0
-iz_dun01.gat,0,0,0,0 monster Marina 1141,40,0,0,0
-iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
-iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
-iz_dun01.gat,0,0,0,0 monster Vadon 1066,60,0,0,0
-iz_dun01.gat,0,0,0,0 monster Cornutus 1067,30,0,0,0
-
-// Iz_dun02
-iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
-iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
-
-// Iz_dun03
-iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
-iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
-iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
-iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
-iz_dun03.gat,0,0,0,0 monster Marc 1045,45,0,0,0
-iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
-iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,323000,150000,0
-iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,317000,150000,0
-iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,323000,150000,0
-iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
-iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
-iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
-iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,316000,150000,0
-iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,2960000,150000,0
-iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
-iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
-iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
-
-// Iz_dun04
-iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
-iz_dun04.gat,0,0,0,0 monster Swordfish 1069,20,0,0,0
-iz_dun04.gat,0,0,0,0 monster Merman 1264,10,0,0,0
-iz_dun04.gat,0,0,0,0 monster Strouf 1065,3,0,0,0
-iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,0
-iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
-iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,308000,150000,0
-iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
-iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
-iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,303000,150000,0
-iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun04.gat,0,0,0,0 monster Penomena 1216,50,300000,150000,1
-iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,600000,300000,0
-iz_dun04.gat,103,231,10,10 monster Merman 1264,2,150000,0,0
-iz_dun04.gat,160,231,10,10 monster Merman 1264,2,170000,0,0
-iz_dun04.gat,95,147,10,10 monster Merman 1264,2,150000,0,0
-iz_dun04.gat,130,216,15,15 monster Merman 1264,2,160000,0,0
-
-
-// Gef_dun00
-gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,5,60000,30000,0
-gef_dun00.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
-
-gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,300000,150000,0
-gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,300000,150000,0
-gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,0
-gef_dun00.gat,0,0,0,0 monster Red Plant 1078,1,300000,150000,0
-gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
-
-// Gef_dun01
-gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
-gef_dun01.gat,0,0,0,0 monster Nightmare 1061,35,0,0,0
-gef_dun01.gat,0,0,0,0 monster Ogretooth 1204,1,1800000,1800000,1
-gef_dun01.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
-gef_dun01.gat,0,0,0,0 monster Ghoul 1036,40,0,0,0
-gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,100000,0
-gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,300000,100000,0
-gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
-
-// Gef_dun02
-gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Nightmare 1061,50,300000,100000,0
-gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
-
-// Gef_dun03
-
-gef_dun03.gat,0,0,0,0 monster Wraith 1192,8,60000,30000,0
-gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,2,60000,30000,0
-gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,3,60000,30000,0
-
-
-// moc_pryd01
-moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
-moc_pryd01.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-
-// moc_pryd02
-moc_pryd02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Mummy 1041,30,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
-
-// moc_pryd03
-
-moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Mummy 1041,50,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Verit 1032,40,0,0,0
-
-// moc_pryd04
-moc_pryd04.gat,0,0,0,0 monster Mummy 1041,40,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,120000,75000,0
-moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
-moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
-moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-
-// moc_pryd05
-moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
-
-// moc_pryd06
-moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
-moc_pryd06.gat,102,166,1,1 monster Amon Ra 1511,1,3600000,1600000,0
-
-
-//beach_dun
-beach_dun.gat,0,0,0,0 monster Medusa 1148,20,0,0,0
-beach_dun.gat,0,0,0,0 monster Merman 1264,10,10000,5000,0
-beach_dun.gat,0,0,0,0 monster Nereid 1255,15,0,0,0
-beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-beach_dun.gat,0,0,0,0 monster Penomena 1216,5,30000,0,0
-beach_dun.gat,0,0,0,0 monster Tao Gunka 1583,1,7380000,3600000,0
-
-//beach_dun2
-beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
-beach_dun2.gat,0,0,0,0 monster Nereid 1255,5,0,0,0
-beach_dun2.gat,0,0,0,0 monster Stalactic Golem 1278,40,5000,0,0
-beach_dun2.gat,0,0,0,0 monster Tri Joint 1279,20,0,0,0
-beach_dun2.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
-
-//beach_dun3
-beach_dun3.gat,0,0,0,0 monster Nereid 1255,1,200000,100000,0
-//putmob "beach_dun3" 0 0 0 0 1 PEST 60000 0 0
-beach_dun3.gat,0,0,0,0 monster Thara Frog 1034,55,0,0,0
-//putmob "beach_dun3" 0 0 0 0 3 TRI_JOINT 0 0 0
-beach_dun3.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
-beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,0
-
-
-// treasure01
-treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure01.gat,0,0,0,0 monster Whisper 1179,5,0,0,1
-
-treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
-treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
-
-treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
-
-treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
-
-treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,180000,90000,1
-
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
-
-treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
-treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
-treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
-treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,49,161,0,0 monster Hydra 1068,1,310000,100000,1
-treasure01.gat,49,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
-treasure01.gat,50,160,0,0 monster Hydra 1068,1,301000,100000,1
-treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
-treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
-treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
-treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
-treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
-treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
-treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
-
-treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-
-treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-
-treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
-
-treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
-treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,164,71,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,164,70,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,165,70,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,164,59,12,10 monster Whisper 1179,5,300000,100000,1
-treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
-
-treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
-
-treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,158,44,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,43,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,158,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
-treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
-treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,168,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,168,44,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,168,43,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
-treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,169,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,41,0,0 monster Hydra 1068,1,313000,100000,1
-treasure01.gat,169,40,0,0 monster Hydra 1068,1,300000,100000,1
-
-// treasure02
-treasure02.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
-treasure02.gat,0,0,0,0 monster Whisper 1179,8,0,0,0
-treasure02.gat,0,0,0,0 monster Wanderer 1208,1,0,0,1
-treasure02.gat,0,0,0,0 monster Penomena 1216,2,0,0,1
-
-treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,20,0,0,1
-treasure02.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
-
-treasure02.gat,95,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,96,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,107,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,108,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,50,10,10 monster Penomena 1216,5,300000,100000,1
-
-treasure02.gat,102,68,13,13 monster Whisper 1179,2,300000,100000,1
-
-treasure02.gat,102,80,5,5 monster Whisper 1179,1,300000,100000,1
-treasure02.gat,102,88,5,5 monster Whisper 1179,1,300000,100000,1
-treasure02.gat,100,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,100,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,100,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
-
-treasure02.gat,101,150,15,10 monster Whisper 1179,4,200000,100000,1
-
-treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
-
-treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
-
-treasure02.gat,101,151,10,10 monster Penomena 1216,4,100000,100000,1
-treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
-treasure02.gat,101,135,2,2 monster Penomena 1216,1,60000,200000,1
-
-treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure02.gat,38,74,9,9 monster Penomena 1216,5,300000,100000,1
-
-treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-
-treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,300000,100000,1
-treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-
-treasure02.gat,157,143,1,1 monster Whisper 1179,1,100000,100000,1
-treasure02.gat,151,138,1,1 monster Whisper 1179,1,100000,100000,1
-treasure02.gat,45,144,1,1 monster Whisper 1179,1,200000,100000,1
-treasure02.gat,52,139,1,1 monster Whisper 1179,1,200000,100000,1
-
-treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
-
-
-
-// prt_maze01
-prt_maze01.gat,179,20,21,21 monster Poring 1002,5,120000,40000,1
-prt_maze01.gat,139,20,21,21 monster Lunatic 1063,5,120000,40000,1
-prt_maze01.gat,99,20,21,21 monster Fabre 1007,5,120000,40000,1
-prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
-prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
-prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
-prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
-prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
-prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
-prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
-prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
-prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
-prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
-prt_maze01.gat,99,100,21,21 monster Chonchon 1011,5,120000,40000,1
-prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
-prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,3,120000,40000,1
-prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
-prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
-prt_maze01.gat,99,140,21,21 monster Side Winder 1037,3,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
-prt_maze01.gat,19,140,21,21 monster Steel Chonchon 1042,5,120000,40000,1
-prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
-prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
-prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
-prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage 1166,3,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
-prt_maze01.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
-prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
-
-// prt_maze02
-prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
-prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
-prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,900000,40000,0
-prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,0
-
-// prt_maze03
-prt_meze03.gat,0,0,0,0 monster Poporing 1031,45,0,0,0
-prt_maze03.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
-prt_maze03.gat,0,0,0,0 monster Hunter Fly 1035,30,0,0,0
-prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,6800000,3400000,1
-prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
-
-prt_maze03.gat,150,50,70,70 monster Side Winder 1037,20,300000,1500000,0
-prt_maze03.gat,150,50,70,70 monster Vocal 1088,1,1920000,1500000,1
-
-prt_maze03.gat,50,150,70,70 monster Stem Worm 1215,20,300000,150000,0
-prt_maze03.gat,50,150,70,70 monster Vagabond Wolf 1092,1,1920000,1500000,1
-
-prt_maze03.gat,170,170,70,70 monster Mantis 1139,30,60000,30000,0
-prt_maze03.gat,170,170,70,70 monster Eclipse 1093,1,1920000,1500000,1
-
-prt_maze03.gat,23,23,70,70 monster Mastering 1090,1,1920000,1500000,1
-
-prt_maze03.gat,100,100,80,80 monster Baphomet Jr. 1101,25,0,0,0
-prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
-
-
-// In_sphinx1
-in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Zerom 1178,30,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
-
-// In_sphinx2
-in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Zerom 1178,50,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-
-// In_sphinx3
-in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Pasana 1154,15,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
-
-// In_sphinx4
-in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
-//putmob "in_sphinx4" 0 0 0 0 30 SIDE_WINDER 0 0 0
-in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
-in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
-
-// In_sphinx5
-in_sphinx5.gat,0,0,0,0 monster Pasana 1154,30,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Mimic 1191,7,600000,300000,1
-in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
-
-
-// c_tower1
-c_tower1.gat,0,0,0,0 monster Punk 1199,100,0,0,0
-c_tower1.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
-c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower1.gat,0,0,0,0 monster Bathory 1102,1,0,0,0
-
-// c_tower2
-c_tower2.gat,0,0,0,0 monster Punk 1199,45,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock 1269,40,0,0,0
-c_tower2.gat,0,0,0,0 monster Rideword 1195,3,0,0,0
-c_tower2.gat,128,100,10,10 monster Rideword 1195,1,60000,30000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,120000,60000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,300000,120000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,120000,60000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,300000,120000,0
-
-c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-
-c_tower2.gat,143,98,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,128,100,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,144,208,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,137,201,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-
-// c_tower3
-c_tower3.gat,0,0,0,0 monster Alarm 1193,80,0,0,0
-c_tower3.gat,0,0,0,0 monster Rideword 1195,5,0,0,0
-c_tower3.gat,153,220,10,10 monster Rideword 1195,1,126000,100000,0
-c_tower3.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-
-
-c_tower3.gat,252,169,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,253,253,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,252,145,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,124,8,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,51,8,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,8,56,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,8,97,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,15,205,0,0 monster Rideword 1195,1,600000,300000,0
-c_tower3.gat,144,249,0,0 monster Rideword 1195,1,600000,300000,0
-
-// c_tower4
-c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,2,1800000,0,0
-c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,1,3600000,0,0
-c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
-
-c_tower4.gat,108,198,100,10 monster Alarm 1193,7,0,0,0
-c_tower4.gat,108,178,100,10 monster Alarm 1193,7,0,0,0
-c_tower4.gat,108,158,100,10 monster Alarm 1193,7,0,0,0
-c_tower4.gat,108,138,100,10 monster Alarm 1193,7,0,0,0
-c_tower4.gat,108,118,100,10 monster Alarm 1193,7,0,0,0
-c_tower4.gat,108,98,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,78,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,58,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,38,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,18,100,10 monster Clock 1269,7,0,0,0
-
-c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,0,0,0
-
-c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
-c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
-c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
-c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
-c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
-c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
-c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
-c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
-c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
-c_tower4.gat,86,180,0,0 monster Rideword 1195,1,380000,150000,1
-c_tower4.gat,80,179,0,0 monster Rideword 1195,1,360000,150000,1
-c_tower4.gat,80,180,0,0 monster Rideword 1195,1,350000,150000,1
-c_tower4.gat,80,181,0,0 monster Rideword 1195,1,290000,150000,1
-c_tower4.gat,80,182,0,0 monster Rideword 1195,1,300000,150000,1
-c_tower4.gat,80,183,0,0 monster Rideword 1195,1,340000,150000,1
-
-c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,257,109,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-c_tower4.gat,0,0,0,0 monster Elder 1377,1,1800000,600000,0
-
-c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
-
-// alde_dun01
-alde_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
-alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
-
-// alde_dun02
-
-alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
-alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-alde_dun02.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
-
-// alde_dun03
-
-alde_dun03.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
-alde_dun03.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-alde_dun03.gat,77,28,5,5 monster Cramp 1209,3,40000,20000,0
-
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,50,300000,150000,0
-alde_dun03.gat,184,61,30,30 monster Cramp 1209,10,300000,150000,0
-alde_dun03.gat,184,61,30,30 monster Drainliar 1111,10,300000,150000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,5,300000,150000,0
-alde_dun03.gat,163,56,10,10 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,168,42,6,6 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,147,30,8,8 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,0
-alde_dun03.gat,126,53,20,20 monster Cramp 1209,5,300000,150000,0
-alde_dun03.gat,126,53,20,20 monster Drainliar 1111,5,300000,150000,0
-alde_dun03.gat,102,40,10,10 monster Penomena 1216,4,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
-alde_dun03.gat,130,220,40,40 monster Cramp 1209,10,300000,150000,0
-alde_dun03.gat,130,220,40,40 monster Drainliar 1111,10,300000,150000,0
-alde_dun03.gat,155,201,25,25 monster Penomena 1216,7,600000,300000,0
-alde_dun03.gat,160,181,8,8 monster Penomena 1216,2,600000,300000,0
-
-alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Penomena 1216,5,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Cramp 1209,3,300000,150000,0
-alde_dun03.gat,142,157,8,8 monster Penomena 1216,5,600000,300000,0
-
-alde_dun03.gat,135,140,8,8 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Drainliar 1111,10,300000,150000,0
-
-// alde_dun04
-alde_dun04.gat,0,0,0,0 monster Bathory 1102,50,0,0,0
-alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
-alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Ogretooth 1204,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-
-
-// tur_dun01
-tur_dun01.gat,0,0,0,0 monster Dragon Tail 1321,25,0,0,0
-tur_dun01.gat,0,0,0,0 monster Spring Rabbit 1322,25,0,0,0
-tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
-tur_dun01.gat,0,0,0,0 monster Permeter 1314,10,0,0,0
-tur_dun01.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-// tur_dun02
-tur_dun02.gat,0,0,0,0 monster Permeter 1314,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Solider 1316,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
-tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-// tur_dun03
-tur_dun03.gat,0,0,0,0 monster Permeter 1314,15,0,0,0
-tur_dun03.gat,0,0,0,0 monster Freezer 1319,40,0,0,0
-tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,0,0,0
-tur_dun03.gat,0,0,0,0 monster Heater 1318,10,50000,0,0
-
-// tur_dun04
-
-tur_dun04.gat,99,92,10,10 monster Wanderer 1208,1,60000,30000,0
-tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,720000,0
-tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
-tur_dun04.gat,100,93,20,20 monster Assaulter 1315,10,120000,60000,0
-tur_dun04.gat,100,93,20,20 monster Freezer 1319,5,120000,60000,0
-
-tur_dun04.gat,171,159,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,171,155,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,171,149,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,28,159,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,28,155,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,28,149,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,174,26,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,174,29,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,174,32,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,26,26,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,26,29,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,26,32,3,3 monster Assaulter 1315,1,320000,170000,0
-
-tur_dun04.gat,0,0,0,0 monster Wanderer 1208,2,0,0,0
-tur_dun04.gat,0,0,0,0 monster Heater 1318,10,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Heater 1318,20,620000,310000,0
-
-tur_dun04.gat,0,0,0,0 monster Assaulter 1315,23,0,0,0
-tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,600000,300000,0
-tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,640000,320000,0
-
-// tur_dun05
-tur_dun05.gat,0,0,0,0 monster Permeter 1314,3,20000,0,0
-tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
-tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
-
-
-
-
-gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
-gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
-gl_cas01.gat,0,0,0,0 monster Whisper 1179,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_cas01.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
-gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
-
-
-
-gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
-gl_cas02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
-gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
-
-gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
-gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
-gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
-
-gl_cas02.gat,0,0,0,0 monster Chimera 1283,1,3600000,1800000,1
-gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
-gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,120000,60000,1
-
-gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
-gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,360000,180000,1
-
-gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,180000,180000,1
-gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,180000,180000,1
-gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,180000,180000,1
-gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,180000,180000,1
-gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,180000,180000,1
-
-gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-
-gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
-gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,360000,180000,1
-
-gl_cas02.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
-gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-
-gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
-gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,360000,180000,0
-gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,360000,180000,0
-
-
-gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
-gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
-gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
-gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
-
-gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
-gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
-gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
-gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
-
-gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
-gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-
-gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
-gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
-
-gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
-gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
-
-// gl_prison
-
-gl_prison.gat,0,0,0,0 monster Injustice 1257,20,0,0,0
-gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,50,0,0,0
-gl_prison.gat,0,0,0,0 monster Rybio 1201,15,0,0,0
-
-// gl_prison1
-
-gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,40,0,0,0
-gl_prison1.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
-gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
-gl_prison1.gat,0,0,0,0 monster Zealotus 1200,1,3600000,1800000,1
-gl_prison1.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
-
-// Glastheim
-glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,2,600000,300000,1
-glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
-
-// gl_church
-
-gl_church.gat,0,0,0,0 monster Wraith 1192,10,0,0,0
-gl_church.gat,0,0,0,0 monster Evil Druid 1117,35,0,0,0
-gl_church.gat,0,0,0,0 monster Ghoul 1036,60,0,0,0
-gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
-gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-gl_church.gat,155,92,10,10 monster Mimic 1191,1,30000,15000,0
-gl_church.gat,155,75,10,10 monster Mimic 1191,2,60000,30000,0
-gl_church.gat,155,54,10,10 monster Mimic 1191,1,30000,15000,0
-
-// gl_chyard
-gl_chyard.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
-gl_chyard.gat,0,0,0,0 monster Zombie 1015,15,0,0,0
-gl_chyard.gat,0,0,0,0 monster Wraith 1192,25,0,0,0
-gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
-gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,5,0,0,0
-gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-gl_chyard.gat,0,0,0,0 monster Skeleton Prisoner 1196,25,0,0,0
-gl_chyard.gat,0,0,0,0 monster Zombie Prisoner 1197,25,0,0,0
-gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
-
-// gl_sew01
-
-gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
-gl_sew01.gat,0,0,0,0 monster Arclouze 1194,10,0,0,0
-//putmob "gl_sew01" 0 0 0 0 50 DRAINLIAR 0 0 0
-gl_sew01.gat,0,0,0,0 monster Whisper 1179,50,0,0,0
-
-// gl_sew02
-
-gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
-gl_sew02.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
-gl_sew02.gat,0,0,0,0 monster Anolian 1206,40,0,0,0
-
-// gl_sew03
-
-gl_sew03.gat,0,0,0,0 monster Sting 1207,75,0,0,0
-gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,25,0,0,0
-
-gl_sew03.gat,147,7,5,1 monster Sting 1207,1,1380000,300000,1
-gl_sew03.gat,140,7,5,1 monster Sting 1207,1,1080000,300000,1
-gl_sew03.gat,158,7,5,1 monster Sting 1207,1,1680000,300000,1
-
-// gl_sew04
-
-gl_sew04.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
-gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
-gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-
-// gl_step
-
-gl_step.gat,0,0,0,0 monster Mimic 1191,20,60000,30000,0
-gl_step.gat,0,0,0,0 monster Raydric Archer 1276,30,0,0,0
-gl_step.gat,0,0,0,0 monster Wraith 1192,30,0,0,0
-gl_step.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
-
-// gl_knt01
-
-gl_knt01.gat,0,0,0,0 monster Raydric 1163,65,0,0,0
-gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
-gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,20,0,0,0
-gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-
-gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
-gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,120000,60000,1
-
-gl_knt01.gat,33,120,30,30 monster Rideword 1195,10,120000,60000,1
-gl_knt01.gat,26,223,20,20 monster Rideword 1195,10,120000,60000,1
-gl_knt01.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-
-gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-
-gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-
-// gl_knt02
-
-gl_knt02.gat,0,0,0,0 monster Raydric 1163,55,0,0,0
-gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
-gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,20,0,0,0
-gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
-gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,0
-gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
-gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
-
-gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-
-gl_knt02.gat,0,0,0,0 monster Joker 1131,20,0,0,0
-
-// gl_dun01
-
-gl_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
-gl_dun01.gat,0,0,0,0 monster Sting 1207,50,0,0,0
-
-
-
-gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
-gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
-
-
-
-// gld_dun01
-gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Am Mut 1301,20,0,0,0
-gld_dun01.gat,0,0,0,0 monster Cat o' Nine Tails 1307,3,1200000,0,0
-gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,7200000,1
-gld_dun01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,14400000,7200000,1
-
-// gld_dun02
-gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
-gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,10,240000,120000,0
-gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,5,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,5,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,10,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,7200000,1
-
-// gld_dun03
-gld_dun03.gat,0,0,0,0 monster Maya Purple 1289,3,1200000,0,0
-gld_dun03.gat,0,0,0,0 monster Caterpillar 1300,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Gullinbursti 1311,10,0,0,0
-gld_dun03.gat,0,0,0,0 monster Creamy Fear 1293,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Leib Olmai 1306,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Maya 1147,1,28800000,7200000,1
-
-// gld_dun04
-gld_dun04.gat,0,0,0,0 monster Wraith Dead 1291,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Zombie Master 1298,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
-gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,7200000,1
-gld_dun04.gat,0,0,0,0 monster Ghostring 1120,1,14400000,7200000,1
-
-
-
-
-// Gef_fild02 172,8
-gef_fild02.gat,227,316,6,6 monster Green Plant 1080,8,360000,180000,1
-gef_fild02.gat,87,48,6,6 monster Red Mushroom 1085,5,360000,180000,1
-gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,360000,180000,1
-gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
-gef_fild02.gat,220,214,1,1 monster Blue Plant 1079,1,360000,180000,1
-gef_fild02.gat,164,194,1,1 monster Shining Plant 1083,1,1800000,900000,1
-
-// gef_fild01 135
-gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
-
-// gef_fild09 160
-gef_fild09.gat,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,125,53,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,148,74,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,184,66,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,207,54,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,245,62,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,268,45,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,258,24,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,325,36,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,344,51,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,1
-
-// Gef_fild10 100
-gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
-
-// Gef_fild11 147
-gef_fild11.gat,101,277,4,1 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,176,288,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,253,357,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,247,249,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,257,209,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,174,240,1,3 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
-
-// Gef_fild03 185,14
-gef_fild03.gat,45,350,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,66,300,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,80,252,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,118,281,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,135,344,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,210,363,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,215,345,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,359,316,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,350,247,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,304,202,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,285,223,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,282,192,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,316,143,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,337,104,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,348,42,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,326,79,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,280,92,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,216,135,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,169,92,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,45,93,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
-
-// gef_fild05 125,8
-gef_fild05.gat,235,322,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,238,326,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,170,337,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,108,317,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,56,285,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,65,256,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,74,228,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,50,189,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,51,166,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,146,161,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,153,180,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,124,207,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,187,249,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,187,265,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,130,293,0,0 monster Red Plant 1078,1,180000,90000,1
-
-// Gef_fild08 125,8
-gef_fild08.gat,65,341,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,111,319,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,59,91,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,70,80,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,144,140,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,344,78,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,325,311,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,162,247,0,0 monster Blue Plant 1079,1,900000,450000,1
-
-// gef_fild06
-gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
-
-// gef_fild04 165
-gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
-gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
-//putmob "gef_fild04" 55 266 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 50 321 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 111 284 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 189 258 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 207 307 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 327 309 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 199 336 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild04" 130 315 0 0 1 GREEN_PLANT 180000 90000 1
-
-// gef_fild07 165
-//putmob "gef_fild07" 321 170 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild07" 66 184 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild07" 57 61 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild07" 122 221 0 0 3 GREEN_PLANT 360000 180000 1
-gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
-gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
-gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
-
-// gef_fild00 220,35
-gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
-gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
-//putmob "gef_fild00" 97 277 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 96 352 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 168 343 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 235 332 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 319 359 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 331 291 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 270 228 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 336 205 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 282 135 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 227 207 0 0 1 GREEN_PLANT 180000 90000 1
-//putmob "gef_fild00" 199 277 0 0 1 GREEN_PLANT 180000 90000 1
-
-
-moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
-
-
-moc_fild06.gat,193,203,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-
-moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
-
-
-moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-
-moc_fild01.gat,194,51,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-
-moc_fild02.gat,89,315,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,99,261,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,94,195,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,139,222,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,132,307,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,194,294,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,275,241,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,342,267,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,313,149,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,230,62,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,299,61,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,353,103,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,337,35,0,0 monster Green Plant 1080,1,180000,90000,1
-
-
-moc_fild13.gat,280,99,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,264,64,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,305,91,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,264,136,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,282,155,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,265,197,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,284,227,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,304,244,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,266,289,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,281,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,304,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,295,358,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,84,329,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,89,92,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,108,150,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,109,168,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
-
-
-moc_fild03.gat,77,311,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,108,199,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,96,65,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,216,69,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,261,161,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,213,201,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,200,263,5,5 monster Green Plant 1080,2,180000,90000,1
-
-
-moc_fild09.gat,332,341,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,240,313,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,305,62,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,54,325,5,5 monster Yellow Plant 1081,2,180000,90000,1
-
-
-moc_fild10.gat,198,150,40,30 monster Yellow Plant 1081,10,180000,90000,1
-moc_fild10.gat,198,150,40,30 monster Green Plant 1080,5,180000,90000,1
-
-
-moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
-
-
-moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
-
-
-moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-
-moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,180000,90000,1
-moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-
-moc_fild15.gat,40,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,57,39,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,46,250,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,104,347,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,195,373,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,341,365,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,353,230,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,341,164,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,370,85,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,158,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,232,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,294,74,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-
-moc_fild14.gat,124,93,5,5 monster Shining Plant 1083,1,1800000,900000,1
-moc_fild14.gat,85,271,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,165,282,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,149,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-moc_fild14.gat,64,342,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,160,366,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-
-
-// mjolnir_01 155
-mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
-
-// mjolnir_11 165
-mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
-
-// mjolnir_06 150
-mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-// mjolnir_02 175
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
-
-// mjolnir_07 150,5
-mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
-
-// mjolnir_03 165,15
-mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
-
-// mjolnir_04
-mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
-
-// mjolnir_05
-mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-
-// mjolnir_12
-
-// mjolnir_08 190
-mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
-mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
-
-// mjolnir_09 170
-mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-// mjolnir_10
-mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-
-
-
-// Pay_fild01 -205,35
-pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,336,116,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,231,258,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,215,323,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,225,310,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,129,288,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,75,269,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,80,226,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,89,177,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,95,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,57,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,64,113,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,64,190,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,70,246,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-
-// Pay_fild08 -145,10
-pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
-pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
-
-// Pay_fild09 -120,11
-pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,0
-pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
-
-// Pay_fild10 -170,12
-pay_fild10.gat,213,157,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,281,307,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,66,332,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,213,157,10,10 monster Blue Plant 1079,1,360000,180000,1
-pay_fild10.gat,281,307,10,10 monster Blue Plant 1079,1,360000,180000,1
-pay_fild10.gat,66,332,10,10 monster Blue Plant 1079,1,360000,180000,1
-
-// pay_fild07 -138,10
-pay_fild07.gat,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
-
-// Pay_fild02 -165,16
-pay_fild02.gat,105,256,10,10 monster Green Plant 1080,4,360000,180000,1
-pay_fild02.gat,105,256,10,10 monster Red Mushroom 1085,4,360000,180000,1
-
-// Pay_fild03 -155,29
-pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
-pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
-
-// Pay_fild06 -225,15
-pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
-pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
-pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
-
-// Pay_fild05 -190,14
-pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
-pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
-
-// Pay_fild11 -180,36
-pay_fild11.gat,241,162,5,5 monster Red Mushroom 1085,3,360000,180000,1
-pay_fild11.gat,66,293,5,5 monster Red Mushroom 1085,3,360000,180000,1
-
-// pay_fild04 -180
-pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
-pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
-
-
-
-// prt_fild08 175,25
-prt_fild04.gat,350,114,10,10 monster Green Plant 1080,5,900000,450000,1
-
-// prt_fild05 175,25
-prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
-prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
-
-// prt_fild06 170,10
-prt_fild06.gat,222,30,40,10 monster Green Plant 1080,15,900000,450000,1
-
-// prt_fild01 185,25
-prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
-prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
-
-// prt_fild02 175,10
-prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
-prt_fild02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
-
-// prt_fild03 185,5
-prt_fild03.gat,296,58,15,15 monster Green Plant 1080,5,180000,90000,1
-prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
-
-// prt_fild04 145,5
-prt_fild03.gat,307,75,5,5 monster Green Plant 1080,5,360000,180000,1
-prt_fild03.gat,147,319,5,5 monster Green Plant 1080,5,360000,180000,1
-prt_fild03.gat,148,107,5,5 monster Green Plant 1080,5,360000,180000,1
-
-// prt_fild00 125,20
-prt_fild00.gat,227,212,0,0 monster Shining Plant 1083,1,1800000,900000,1
-prt_fild00.gat,285,138,10,10 monster Green Plant 1080,5,360000,180000,1
-
-// prt_fild09 210
-prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
-
-// prt_fild07 207,5
-prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
-
-// prt_fild10 150
-prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
-prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
-
-// prt_fild11 240,10
-prt_fild11.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
-
-//------------------------------------
-//--------
-//---------------------------------------
-
-// gef_dun
-gef_dun00.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
-gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
-gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,180000,90000,1
-gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,180000,90000,1
-gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
-
-// Glastheim
-glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
-glast_01.gat,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
-glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
-
-// Orcsdun
-orcsdun01.gat,167,133,5,5 monster Black Mushroom 1084,5,900000,450000,1
-orcsdun01.gat,67,34,5,5 monster Black Mushroom 1084,5,900000,450000,1
-orcsdun01.gat,83,50,5,5 monster White Plant 1082,2,180000,90000,1
-orcsdun01.gat,58,67,10,10 monster White Plant 1082,3,180000,90000,1
-orcsdun02.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-orcsdun02.gat,105,37,10,10 monster White Plant 1082,2,180000,90000,1
-orcsdun02.gat,37,44,10,10 monster White Plant 1082,3,180000,90000,1
-
-// Iz_dun
-iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
-iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
-
-// pay_dun
-pay_dun00.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
-pay_dun01.gat,235,54,10,10 monster Black Mushroom 1084,7,900000,450000,1
-pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
-pay_dun02.gat,110,216,20,10 monster White Plant 1082,3,180000,90000,1
-pay_dun02.gat,132,84,10,10 monster White Plant 1082,3,180000,90000,1
-pay_dun02.gat,197,113,10,10 monster Red Plant 1078,4,180000,90000,1
-pay_dun02.gat,55,254,10,10 monster Red Plant 1078,4,180000,90000,1
-pay_dun03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-pay_dun03.gat,246,56,20,20 monster White Plant 1082,3,180000,90000,1
-pay_dun03.gat,52,262,10,4 monster White Plant 1082,2,180000,90000,1
-pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,1,1800000,900000,1
-pay_dun04.gat,28,110,5,5 monster Shining Plant 1083,1,1800000,900000,1
-pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-pay_dun04.gat,107,206,5,5 monster White Plant 1082,2,180000,90000,1
-pay_dun04.gat,28,110,10,10 monster White Plant 1082,2,180000,90000,1
-pay_dun04.gat,190,207,5,5 monster White Plant 1082,2,180000,90000,1
-
-// prt_maze
-prt_maze01.gat,101,138,5,5 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze01.gat,101,138,5,5 monster White Plant 1082,1,1800000,900000,1
-prt_maze01.gat,99,181,5,5 monster White Plant 1082,2,1800000,900000,1
-prt_maze01.gat,60,140,10,15 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,61,101,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze01.gat,141,100,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze01.gat,141,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze01.gat,100,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,100,100,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze01.gat,176,132,5,5 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze01.gat,181,149,3,3 monster Black Mushroom 1084,2,180000,90000,1
-prt_maze01.gat,178,60,10,10 monster Red Mushroom 1085,3,180000,90000,1
-prt_maze01.gat,168,60,3,3 monster Red Mushroom 1085,2,180000,90000,1
-prt_maze03.gat,61,98,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,61,98,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,61,98,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze03.gat,57,56,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,15,15,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,137,140,3,3 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,17,58,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,17,58,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,99,141,10,10 monster Blue Plant 1079,2,1800000,900000,1
-prt_maze03.gat,99,21,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze03.gat,99,21,10,10 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze03.gat,54,15,10,10 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze03.gat,171,180,3,3 monster Red Mushroom 1085,2,180000,90000,1
-prt_maze03.gat,174,187,3,3 monster Red Mushroom 1085,3,180000,90000,1
-
-//
-
-// cmd_fild01
-cmd_fild01.gat,313,213,10,10 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild01.gat,313,213,10,10 monster Blue Plant 1079,1,1800000,900000,1
-cmd_fild01.gat,171,339,10,10 monster Blue Plant 1079,2,1800000,900000,1
-cmd_fild01.gat,72,78,10,10 monster Blue Plant 1079,2,1800000,900000,1
-cmd_fild01.gat,194,176,20,20 monster Blue Plant 1079,1,1800000,900000,1
-cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-
-// cmd_fild03
-cmd_fild03.gat,356,232,3,3 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild03.gat,262,289,3,3 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild03.gat,145,191,3,3 monster Shining Plant 1083,1,1800000,900000,1
-
-// cmd_fild05
-cmd_fild05.gat,63,158,10,10 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild05.gat,318,277,10,10 monster Yellow Plant 1081,3,1800000,900000,1
-cmd_fild05.gat,282,49,20,20 monster Yellow Plant 1081,3,1800000,900000,1
-cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-
-// cmd_fild06
-cmd_fild06.gat,293,235,5,5 monster Yellow Plant 1081,2,1800000,900000,1
-cmd_fild06.gat,84,375,10,10 monster Yellow Plant 1081,3,1800000,900000,1
-
-// cmd_fild08
-cmd_fild08.gat,60,143,10,10 monster Yellow Plant 1081,4,1800000,900000,1
-cmd_fild08.gat,130,201,10,10 monster Yellow Plant 1081,4,1800000,900000,1
-
-//
-
-// yuno_fild01
-yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
-yuno_fild01.gat,70,370,10,10 monster Blue Plant 1079,2,1800000,900000,1
-yuno_fild01.gat,70,370,10,10 monster Shining Plant 1083,1,1800000,900000,1
-yuno_fild01.gat,66,267,10,10 monster Yellow Plant 1081,2,1800000,900000,1
-yuno_fild01.gat,238,326,40,40 monster Yellow Plant 1081,6,1800000,900000,1
-yuno_fild01.gat,238,326,40,40 monster Shining Plant 1083,2,1800000,900000,1
-yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
-
-yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,20,1800000,900000,1
-
-// yuno_fild02
-yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,20,1800000,900000,1
-yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,1800000,900000,1
-yuno_fild02.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-
-// yuno_fild03
-yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,1800000,900000,1
-yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
-yuno_fild03.gat,0,0,0,0 monster Green Plant 1080,15,1800000,900000,1
-yuno_fild03.gat,297,230,10,10 monster Blue Plant 1079,2,1800000,900000,1
-yuno_fild03.gat,136,328,1,1 monster Blue Plant 1079,1,1800000,900000,1
-yuno_fild03.gat,137,330,1,1 monster Blue Plant 1079,1,1800000,900000,1
-yuno_fild03.gat,222,262,10,10 monster Shining Plant 1083,1,1800000,900000,1
-yuno_fild03.gat,297,230,10,10 monster Shining Plant 1083,1,1800000,900000,1
-
-// yuno_fild04
-yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
-yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
-yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-
-//um_fild01
-um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,5,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,180000,90000,1
-
-//um_fil02
-um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-
-//um_fild03
-um_fild03.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
-um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-um_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,180000,90000,1
-
-//um_fild04
-um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,180000,90000,1
-
-//um_dun01
-um_dun01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-um_dun01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-
-//um_dun02
-um_dun02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-um_dun02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_dun02.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
-
+// tha_t01
+
+tha_t01.gat,0,0,0,0 monster Alice 1275,5,0,0,0
+tha_t01.gat,0,0,0,0 monster Plasma 1695,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Lady Solace 1703,4,1800000,1200000,0
+
+// tha_t02
+
+tha_t02.gat,0,0,0,0 monster Alice 1275,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Plasma 1697,20,0,0,0
+tha_t02.gat,0,0,0,0 monster Mimic 1191,30,0,0,0
+tha_t02.gat,0,0,0,0 monster Ancient Mimic 1699,80,0,0,0
+tha_t02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Death Word 1698,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Elder 1377,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Baroness of Retribution 1702,4,1800000,1200000,0
+
+// tha_t03
+
+tha_t03.gat,0,0,0,0 monster Plasma 1696,20,0,0,0
+tha_t03.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
+tha_t03.gat,0,0,0,0 monster Death Word 1698,80,0,0,0
+tha_t03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Ancient Mimic 1699,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Elder 1377,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Mistress of Shelter 1701,4,1800000,1200000,0
+
+// tha_t04
+
+tha_t04.gat,0,0,0,0 monster Plasma 1694,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Death Word 1698,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Ancient Mimic 1699,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Elder 1377,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Owl Baron 1295,10,0,0,0
+tha_t04.gat,0,0,0,0 monster Owl Duke 1320,10,0,0,0
+tha_t04.gat,0,0,0,0 monster Dame of Sentinel 1700,4,1800000,1200000,0
+
+// tha_t05
+
+tha_t05.gat,61,179,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,61,179,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,178,178,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,178,178,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,178,63,55,5 monster Elder 1377,5,0,0,0
+tha_t05.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,178,63,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,62,63,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,62,63,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,0,0,0,0 monster Dolor of Thanatos 1707,2,1800000,1200000,0
+
+// tha_t06
+
+tha_t06.gat,61,179,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,61,179,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,178,178,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,178,178,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,178,63,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,178,63,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,62,63,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,62,63,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,0,0,0,0 monster Maero of Thanatos 1706,2,1800000,1200000,0
+
+// tha_t07
+
+tha_t07.gat,70,105,40,75 monster Death Word 1698,10,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Ancient Mimic 1699,10,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Lady Solace 1703,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Mistress of Shelter 1701,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Baroness of Retribution 1702,15,0,0,0
+tha_t07.gat,70,105,40,75 monster Dame of Sentinel 1700,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Despero of Thanatos 1705,2,1800000,1200000,0
+
+// tha_t08
+
+tha_t08.gat,70,105,40,80 monster Death Word 1698,10,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Ancient Mimic 1699,10,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Lady Solace 1703,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Mistress of Shelter 1701,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Baroness of Retribution 1702,20,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Dame of Sentinel 1700,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Odium of Thanatos 1704,2,1800000,1200000,0
+
+// tha_t09
+
+tha_t09.gat,50,129,35,35 monster Plasma 1694,5,0,0,0
+tha_t09.gat,50,129,35,35 monster Lady Solace 1703,20,600000,0,0
+tha_t09.gat,50,129,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1707,1,1800000,1200000,0
+tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1712,3,1800000,1200000,0
+
+// tha_t10
+
+tha_t10.gat,129,129,35,35 monster Plasma 1697,5,0,0,0
+tha_t10.gat,129,129,35,35 monster Baroness of Retribution 1702,20,600000,0,0
+tha_t10.gat,129,129,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1706,1,1800000,1200000,0
+tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1711,3,1800000,1200000,0
+
+// tha_t11
+
+tha_t11.gat,50,51,35,35 monster Plasma 1695,5,0,0,0
+tha_t11.gat,50,51,35,35 monster Mistress of Shelter 1701,20,600000,0,0
+tha_t11.gat,50,51,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1705,1,1800000,1200000,0
+tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1710,3,1800000,1200000,0
+
+// tha_t12
+
+tha_t12.gat,129,51,35,35 monster Plasma 1693,5,0,0,0
+tha_t12.gat,129,51,35,35 monster Dame of Sentinel 1700,13,600000,0,0
+tha_t12.gat,129,51,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Odium of Thanatos 1709,4,1800000,1200000,0
+
+// abyss_01
+
+abyss_01.gat,0,0,0,0 monster Mimic 1191,10,600000,0,0
+abyss_01.gat,0,0,0,0 monster Ancient Mimic 1699,10,600000,0,0
+abyss_01.gat,152,205,130,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,152,205,130,70 monster Ferus 1717,25,300000,0,0
+abyss_01.gat,152,205,130,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,152,205,130,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,103,93,85,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,103,93,85,70 monster Ferus 1717,15,300000,0,0
+abyss_01.gat,103,93,85,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,103,93,85,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,195,102,85,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,195,102,85,70 monster Ferus 1717,15,300000,0,0
+abyss_01.gat,195,102,85,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,195,102,85,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,110,170,15,15 monster Penomena 1216,15,660000,300000,0
+abyss_01.gat,195,147,5,10 monster Penomena 1216,5,720000,300000,0
+abyss_01.gat,140,100,15,5 monster Penomena 1216,10,780000,300000,0
+abyss_01.gat,260,40,14,14 monster Dragon Egg 1721,3,1200000,600000,0
+abyss_01.gat,150,160,50,50 monster Dragon Egg 1721,5,1800000,600000,0
+
+// abyss_02
+
+abyss_02.gat,0,0,0,0 monster Mimic 1191,10,900000,0,0
+abyss_02.gat,0,0,0,0 monster Ancient Mimic 1699,10,900000,0,0
+abyss_02.gat,0,0,0,0 monster Ferus 1714,50,300000,0,0
+abyss_02.gat,0,0,0,0 monster Acidus 1713,10,600000,0,0
+abyss_02.gat,0,0,0,0 monster Acidus 1716,60,300000,0,0
+abyss_02.gat,0,0,0,0 monster Novus 1715,5,0,0,0
+abyss_02.gat,0,0,0,0 monster Novus 1718,5,0,0,0
+abyss_02.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
+
+// abyss_03
+
+abyss_03.gat,0,0,0,0 monster Mimic 1191,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ancient Mimic 1699,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Acidus 1713,60,600000,0,0
+abyss_03.gat,0,0,0,0 monster Acidus 1716,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ferus 1714,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ferus 1717,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
+abyss_03.gat,0,0,0,0 monster Hydrolancer 1720,3,3000000,2400000,0
+abyss_03.gat,0,0,0,0 monster Detardeurus 1719,1,10800000,7200000,0
+
+// hu_fild01
+
+hu_fild01.gat,0,0,0,0 monster Breeze 1692,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1697,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1695,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1696,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1694,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1693,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Geographer 1368,30,300000,0,0
+hu_fild01.gat,0,0,0,0 monster Demon Pungus 1378,30,1200000,600000,0
+
+// hu_fild04
+
+hu_fild04.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Petite 1155,50,0,0,0
+hu_fild04.gat,0,0,0,0 monster Petite 1156,30,0,0,0
+hu_fild04.gat,0,0,0,0 monster Novus 1715,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Novus 1718,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Anopheles 1627,50,0,0,0
+hu_fild04.gat,0,0,0,0 monster Grove 1687,20,0,0,0
+hu_fild04.gat,60,149,35,122 monster Sleeper 1386,7,600000,300000,0
+hu_fild04.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+hu_fild04.gat,206,210,30,18 monster Blue Plant 1079,4,120000,600000,0
+hu_fild04.gat,206,120,10,10 monster Blue Plant 1079,2,120000,600000,0
+
+// hu_fild05
+
+hu_fild05.gat,112,272,62,82 monster Grove 1687,15,0,0,0
+hu_fild05.gat,112,272,62,82 monster Petite 1155,3,0,0,0
+hu_fild05.gat,112,272,62,82 monster Petite 1156,2,0,0,0
+hu_fild05.gat,112,272,62,82 monster Novus 1715,3,0,0,0
+hu_fild05.gat,112,272,62,82 monster Novus 1718,3,0,0,0
+hu_fild05.gat,112,272,62,82 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,112,272,62,82 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,276,302,93,60 monster Grove 1687,15,0,0,0
+hu_fild05.gat,276,302,93,60 monster Petite 1155,2,0,0,0
+hu_fild05.gat,276,302,93,60 monster Petite 1156,3,0,0,0
+hu_fild05.gat,276,302,93,60 monster Novus 1715,3,0,0,0
+hu_fild05.gat,276,302,93,60 monster Novus 1718,3,0,0,0
+hu_fild05.gat,276,302,93,60 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,276,302,93,60 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
+hu_fild05.gat,286,144,82,90 monster Petite 1155,3,0,0,0
+hu_fild05.gat,286,144,82,90 monster Petite 1156,2,0,0,0
+hu_fild05.gat,286,144,82,90 monster Novus 1715,3,0,0,0
+hu_fild05.gat,286,144,82,90 monster Novus 1718,3,0,0,0
+hu_fild05.gat,286,144,82,90 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,286,144,82,90 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
+hu_fild05.gat,118,106,80,70 monster Petite 1155,2,0,0,0
+hu_fild05.gat,118,106,80,70 monster Petite 1156,3,0,0,0
+hu_fild05.gat,118,106,80,70 monster Novus 1715,3,0,0,0
+hu_fild05.gat,118,106,80,70 monster Novus 1718,3,0,0,0
+hu_fild05.gat,118,106,80,70 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,118,106,80,70 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,0,0,0,0 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,0,0,0,0 monster Dragon Egg 1721,2,3600000,1800000,0
+hu_fild05.gat,196,196,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
+hu_fild05.gat,340,50,10,10 monster Dragon Egg 1721,1,3600000,1800000,0
+hu_fild05.gat,280,350,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
+
+// hu_fild07
+
+hu_fild07.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Deleter 1384,40,0,0,0
+hu_fild07.gat,0,0,0,0 monster Deleter 1385,30,0,0,0
+hu_fild07.gat,0,0,0,0 monster Novus 1715,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Novus 1718,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+hu_fild07.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+hu_fild07.gat,0,0,0,0 monster Demon Pungus 1378,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Yellow Plant 1081,20,0,0,0
+
+// yuno_fild06
+
+yuno_fild06.gat,0,0,0,0 monster Sleeper 1386,70,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Goat 1372,40,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+
+// juperos_01
+
+juperos_01.gat,100,180,60,70 monster Venatu 1679,15,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1676,25,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1677,20,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1678,25,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1679,35,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1676,45,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1677,50,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1678,45,0,0,1
+
+// juperos_02
+
+juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,1
+
+// jupe_core
+
+jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
+
+// lhz_dun01
+
+lhz_dun01.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Anopheles 1627,70,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Remover 1682,100,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Egnigem Cenia 1652,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Wickebine Tres 1653,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Armeyer Dinze 1654,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Errende Ebecee 1655,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Kavach Icarus 1656,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Laurell Weinder 1657,1,0,0,0
+lhz_dun01.gat,150,50,16,18 monster Egnigem Cenia 1652,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Wickebine Tres 1653,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Errende Ebecee 1655,5,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Kavach Icarus 1656,5,600000,300000,1
+lhz_dun01.gat,150,50,16,18 monster Laurell Weinder 1657,5,600000,300000,1
+lhz_dun01.gat,250,150,18,30 monster Egnigem Cenia 1652,4,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Wickebine Tres 1653,4,600000,300000,1
+lhz_dun01.gat,250,150,18,30 monster Armeyer Dinze 1654,4,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Errende Ebecee 1655,2,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Kavach Icarus 1656,2,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Laurell Weinder 1657,2,600000,300000,1
+lhz_dun01.gat,50,150,11,35 monster Egnigem Cenia 1652,1,600000,300000,1
+lhz_dun01.gat,50,150,11,35 monster Wickebine Tres 1653,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Errende Ebecee 1655,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Kavach Icarus 1656,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Laurell Weinder 1657,2,600000,300000,1
+lhz_dun01.gat,192,61,18,30 monster Egnigem Cenia 1652,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Wickebine Tres 1653,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Errende Ebecee 1655,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Kavach Icarus 1656,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Laurell Weinder 1657,1,900000,800000,1
+lhz_dun01.gat,0,0,0,0 monster Gemini-S58 1681,1,7200000,5400000,0
+
+// lhz_dun02
+
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,26,0,0,0
+lhz_dun02.gat,150,150,56,54 monster Egnigem Cenia 1652,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Wickebine Tres 1653,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Armeyer Dinze 1654,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Errende Ebecee 1655,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Kavach Icarus 1656,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Laurell Weinder 1657,4,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Egnigem Cenia 1652,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Wickebine Tres 1653,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Armeyer Dinze 1654,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Errende Ebecee 1655,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Kavach Icarus 1656,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Laurell Weinder 1657,10,120000,60000,1
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Remover 1682,20,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Eremes Guile 1635,1,180000,120000,0
+lhz_dun02.gat,0,0,0,0 monster Gemini-S58 1681,10,5400000,180000,0
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1658,1,7200000,5400000,1
+
+// lhz_dun03
+
+lhz_dun03.gat,140,235,116,30 monster Seyren Windsor 1634,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Eremes Guile 1635,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Howard Alt-Eisen 1636,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Margaretha Sorin 1637,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Cecil Damon 1638,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Kathryne Keyron 1639,4,180000,120000,0
+
+lhz_dun03.gat,40,214,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,240,213,16,17 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,140,65,108,38 monster Seyren Windsor 1634,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Eremes Guile 1635,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Howard Alt-Eisen 1636,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Margaretha Sorin 1637,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Cecil Damon 1638,7,120000,60000,0
+lhz_dun03.gat,140,65,108,38 monster Kathryne Keyron 1639,7,120000,60000,0
+
+lhz_dun03.gat,140,31,8,15 monster Seyren Windsor 1634,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Eremes Guile 1635,1,540000,480000,0
+lhz_dun03.gat,140,31,8,15 monster Howard Alt-Eisen 1636,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Margaretha Sorin 1637,1,540000,480000,0
+lhz_dun03.gat,140,31,8,15 monster Cecil Damon 1638,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Kathryne Keyron 1639,1,540000,480000,0
+
+lhz_dun03.gat,40,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,240,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,54,131,35,39 monster Seyren Windsor 1634,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Eremes Guile 1635,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Cecil Damon 1638,5,120000,60000,0
+lhz_dun03.gat,54,131,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
+
+lhz_dun03.gat,228,137,35,39 monster Seyren Windsor 1634,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Eremes Guile 1635,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Cecil Damon 1638,5,120000,60000,0
+lhz_dun03.gat,228,137,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
+
+lhz_dun03.gat,138,138,36,34 monster Seyren Windsor 1634,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Eremes Guile 1635,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Howard Alt-Eisen 1636,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Margaretha Sorin 1637,3,180000,120000,0
+lhz_dun03.gat,138,138,36,34 monster Cecil Damon 1638,4,0,0,0
+lhz_dun03.gat,138,138,36,34 monster Kathryne Keyron 1639,4,0,0,0
+
+lhz_dun03.gat,140,192,66,21 monster Seyren Windsor 1634,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Eremes Guile 1635,7,180000,120000,0
+lhz_dun03.gat,140,192,66,21 monster Howard Alt-Eisen 1636,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Margaretha Sorin 1637,7,180000,120000,0
+lhz_dun03.gat,140,192,66,21 monster Cecil Damon 1638,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Kathryne Keyron 1639,7,120000,60000,0
+
+lhz_dun03.gat,89,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,89,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,107,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,107,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,171,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,171,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,189,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,189,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,89,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,89,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,107,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,107,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,171,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,171,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,189,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,189,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
+
+lhz_dun03.gat,96,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,96,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,180,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,180,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,98,113,13,9 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,98,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,180,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,180,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
+
+lhz_dun03.gat,114,138,12,16 monster Lord Knight Seyren 1640,1,2700000,2400000,1
+lhz_dun03.gat,163,138,12,16 monster Whitesmith Howard 1642,1,3000000,2700000,1
+lhz_dun03.gat,139,158,20,11 monster Assassin Cross Eremes 1641,1,2580000,2340000,1
+lhz_dun03.gat,139,117,20,11 monster Sniper Cecil 1644,1,2700000,2500000,1
+lhz_dun03.gat,138,138,36,34 monster High Priest Margaretha 1643,1,3300000,3000000,1
+lhz_dun03.gat,138,138,36,34 monster High Wizard Kathryne 1645,1,2580000,2460000,1
+
+// lhz_fild01
+
+lhz_fild01.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Holden 1628,60,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+lhz_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
+lhz_fild01.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+
+// lhz_fild02
+
+lhz_fild02.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Horn 1128,10,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Holden 1628,10,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Anopheles 1627,15,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
+lhz_fild02.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
+
+// lhz_fild03
+
+lhz_fild03.gat,262,233,74,140 monster Porcellio 1619,50,0,0,0
+lhz_fild03.gat,262,233,74,140 monster Metaling 1613,30,0,0,0
+lhz_fild03.gat,262,233,74,140 monster Hill Wind 1629,20,0,0,1
+lhz_fild03.gat,127,248,45,140 monster Caramel 1103,30,0,0,0
+lhz_fild03.gat,127,248,45,140 monster Horn 1128,10,0,0,0
+lhz_fild03.gat,127,248,45,140 monster Rafflesia 1162,5,0,0,0
+lhz_fild03.gat,0,0,0,0 monster Anopheles 1627,20,0,0,1
+lhz_fild03.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,1
+lhz_fild03.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+lhz_fild03.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
+lhz_fild03.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+
+// ein_fild03
+
+ein_fild03.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
+ein_fild03.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+ein_fild03.gat,0,0,0,0 monster Holden 1628,40,0,0,0
+ein_fild03.gat,153,328,100,35 monster Geographer 1368,10,0,0,0
+ein_fild03.gat,260,190,45,25 monster Geographer 1368,5,0,0,0
+ein_fild03.gat,88,143,25,70 monster Caramel 1103,10,60000,30000,1
+ein_fild03.gat,155,40,35,20 monster Horn 1128,5,60000,30000,1
+ein_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
+ein_fild03.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
+
+// ein_fild04
+
+ein_fild04.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
+ein_fild04.gat,0,0,0,0 monster Holden 1628,5,0,0,0
+ein_fild04.gat,200,295,125,65 monster Geographer 1368,45,0,0,0
+ein_fild04.gat,125,135,40,40 monster Geographer 1368,5,0,0,0
+ein_fild04.gat,260,70,20,30 monster Geographer 1368,5,0,0,0
+ein_fild04.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+ein_fild04.gat,285,240,35,90 monster Giearth 1121,10,3600000,3000000,0
+ein_fild04.gat,106,284,60,60 monster Holden 1628,15,0,0,0
+ein_fild04.gat,106,284,60,60 monster Mineral 1614,5,3600000,3000000,0
+ein_fild04.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+ein_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
+ein_fild04.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+
+// einbech
+
+einbech.gat,0,0,0,0 monster Wild Rose 1261,1,3600000,3000000,0
+einbech.gat,0,0,0,0 monster Tarou 1175,5,1800000,1500000,0
+
+// ein_fild06
+
+ein_fild06.gat,0,0,0,0 monster Goat 1372,20,0,0,0
+ein_fild06.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+ein_fild06.gat,0,0,0,0 monster Giearth 1121,2,3600000,3000000,0
+ein_fild06.gat,0,0,0,0 monster Martin 1145,30,0,0,0
+ein_fild06.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild06.gat,0,0,0,0 monster Black Mushroom 1084,10,120000,60000,0
+
+// ein_fild07
+
+ein_fild07.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+ein_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+ein_fild07.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
+ein_fild07.gat,0,0,0,0 monster Flora 1118,20,0,0,0
+ein_fild07.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+ein_fild07.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
+
+// ein_fild08
+
+ein_fild08.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+ein_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+ein_fild08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+ein_fild08.gat,0,0,0,0 monster Metaling 1613,70,0,0,0
+ein_fild08.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
+ein_fild08.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
+ein_fild08.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild08.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+
+// ein_fild09
+
+ein_fild09.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+ein_fild09.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+ein_fild09.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
+ein_fild09.gat,0,0,0,0 monster Porcellio 1619,10,0,0,0
+ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+ein_fild09.gat,100,260,2,2 monster Thief Bug Egg 1048,3,600000,300000,0
+ein_fild09.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild09.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+ein_fild09.gat,260,85,50,20 monster Flora 1118,5,300000,120000,0
+
+// ein_fild10
+
+ein_fild10.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+ein_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+ein_fild10.gat,0,0,0,0 monster Porcellio 1619,10,0,0,1
+ein_fild10.gat,152,314,130,30 monster Porcellio 1619,20,0,0,1
+ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+ein_fild10.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild10.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild10.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+ein_fild10.gat,225,95,30,45 monster Yoyo 1057,6,30000,10000,0
+ein_fild10.gat,320,130,40,40 monster Yoyo 1057,4,30000,10000,0
+ein_fild10.gat,225,95,30,45 monster Flora 1118,10,300000,120000,0
+ein_fild10.gat,320,130,40,40 monster Flora 1118,10,300000,120000,0
+
+// ein_dun01
+
+ein_dun01.gat,0,0,0,0 monster Pitman 1616,55,0,0,0
+ein_dun01.gat,0,0,0,0 monster Noxious 1620,40,0,0,0
+ein_dun01.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
+ein_dun01.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
+ein_dun01.gat,0,0,0,0 monster Old Stove 1617,5,120000,600000,0
+ein_dun01.gat,0,0,0,0 monster Ungoliant 1618,1,3600000,3000000,0
+
+// ein_dun02
+
+ein_dun02.gat,0,0,0,0 monster Mineral 1614,50,0,0,0
+ein_dun02.gat,0,0,0,0 monster Obsidian 1615,40,0,0,0
+ein_dun02.gat,0,0,0,0 monster Teddy Bear 1622,30,0,0,0
+ein_dun02.gat,0,0,0,0 monster Old Stove 1617,30,0,0,0
+ein_dun02.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
+ein_dun02.gat,0,0,0,0 monster RSX-0806 1623,1,7500000,7200000,0
+
+// 2005. 03. 29
+
+gefenia01.gat,0,0,0,0 monster False Angel 1371,60,0,0,0
+gefenia01.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Violy 1390,30,0,0,0
+gefenia01.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gefenia01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,10800000,7200000,0
+gefenia01.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia01.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+gefenia02.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
+gefenia02.gat,0,0,0,0 monster Succubus 1370,20,0,0,0
+gefenia02.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Violy 1390,40,0,0,0
+gefenia02.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
+gefenia02.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia02.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia02.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia02.gat,0,0,0,0 monster Ogretooth 1204,1,10800000,7200000,0
+
+gefenia03.gat,0,0,0,0 monster False Angel 1371,40,0,0,0
+gefenia03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
+gefenia03.gat,0,0,0,0 monster Incubus 1374,20,0,0,0
+gefenia03.gat,0,0,0,0 monster Violy 1390,40,0,0,0
+gefenia03.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
+gefenia03.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia03.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia03.gat,0,0,0,0 monster Executioner 1205,1,10800000,7200000,0
+gefenia03.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+gefenia04.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
+gefenia04.gat,0,0,0,0 monster Succubus 1370,10,600000,300000,0
+gefenia04.gat,0,0,0,0 monster Incubus 1374,10,600000,300000,0
+gefenia04.gat,0,0,0,0 monster Violy 1390,30,0,0,0
+gefenia04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gefenia04.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia04.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia04.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia04.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+
+// yuno_fild12
+
+yuno_fild12.gat,0,0,0,0 monster Punk 1199,30,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild12.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild12.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+
+// yuno_fild11
+
+yuno_fild11.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Geographer 1368,3,0,0,0
+yuno_fild11.gat,65,294,70,160 monster Sleeper 1386,5,0,0,0
+yuno_fild11.gat,65,294,70,160 monster Geographer 1368,2,0,0,0
+yuno_fild11.gat,225,220,125,135 monster Sleeper 1386,35,0,0,0
+yuno_fild11.gat,225,220,125,135 monster Geographer 1368,15,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild11.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+// yuno_fild09
+
+yuno_fild09.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Horn 1128,40,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
+yuno_fild09.gat,97,238,12,12 monster Goblin 1122,3,600000,60000,1
+yuno_fild09.gat,97,238,12,12 monster Goblin 1123,3,600000,60000,1
+yuno_fild09.gat,97,238,12,12 monster Goblin 1124,3,600000,60000,1
+yuno_fild09.gat,97,238,12,12 monster Goblin 1125,3,600000,60000,1
+yuno_fild09.gat,97,238,12,12 monster Goblin 1126,3,600000,60000,1
+yuno_fild09.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild09.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+// yuno_fild08
+
+yuno_fild08.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Grand Peco 1369,30,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Grand Peco 1369,20,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Grand Peco 1369,30,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Geographer 1368,12,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Geographer 1368,6,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Geographer 1368,12,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Dustiness 1114,7,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Dustiness 1114,6,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Dustiness 1114,7,0,0,0
+yuno_fild08.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild08.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+// yuno_fild07
+
+yuno_fild07.gat,0,0,0,0 monster Goat 1372,50,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Driller 1380,10,0,0,0
+yuno_fild07.gat,0,0,0,0 monster The Paper 1375,3,1800000,0,0
+yuno_fild07.gat,0,0,0,0 monster Harpy 1376,1,1800000,900000,0
+yuno_fild07.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild07.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+// yuno_fild05
+
+yuno_fild05.gat,0,0,0,0 monster Rafflesia 1162,70,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Horn 1128,30,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Arc Angeling 1388,1,3600000,180000,0
+yuno_fild05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild05.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild05.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,0
+yuno_fild05.gat,176,202,8,8 monster Blue Plant 1079,2,180000,90000,1
+yuno_fild05.gat,300,280,5,5 monster Blue Plant 1079,2,180000,90000,1
+
+
+//ayo_fild01
+ayo_fild01.gat,0,0,0,0 monster Coco 1104,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Smokie 1056,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,3,3600000,1800000,0
+ayo_fild01.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+
+//ayo_fild02
+ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,50,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,20,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+
+//ayo_dun01
+ayo_dun01.gat,0,0,0,0 monster Leaf Cat 1586,65,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Kraben 1587,5,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
+
+//ayo_dun02
+ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,70,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
+ayo_dun02.gat,150,90,15,30 monster Lady Tanee 1688,1,25200000,18000000,0
+
+
+// jawaii
+jawaii.gat,207,290,10,10 monster Phen 1158,3,3600000,1800000,0
+jawaii.gat,221,220,30,30 monster Aster 1266,2,3600000,2400000,0
+jawaii.gat,276,163,20,20 monster Aster 1266,1,7200000,3600000,0
+jawaii.gat,221,220,30,30 monster Shellfish 1074,1,4800000,3000000,0
+jawaii.gat,276,163,20,30 monster Shellfish 1074,2,4200000,2400000,0
+
+// jawaii_in
+jawaii_in.gat,128,121,1,4 monster Red Mushroom 1085,1,3000000,1200000,0
+jawaii_in.gat,124,76,1,1 monster Black Mushroom 1084,1,3600000,1200000,0
+jawaii_in.gat,72,74,5,1 monster Black Mushroom 1084,2,3000000,1200000,0
+jawaii_in.gat,73,117,4,4 monster Thief Bug 1051,1,5400000,3000000,0
+jawaii_in.gat,83,117,5,5 monster Thief Bug 1051,1,4800000,2400000,0
+
+
+
+lou_fild01.gat,0,0,0,0 monster Black Mushroom 1084,5,0,0,0
+lou_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+lou_dun01.gat,197,77,10,10 monster Black Mushroom 1084,5,0,0,0
+lou_dun01.gat,0,0,0,0 monster Shining Plant 1083,5,0,0,0
+
+
+lou_fild01.gat,224,315,100,50 monster Bigfoot 1060,7,0,0,0
+lou_fild01.gat,203,225,110,35 monster Bigfoot 1060,4,60000,30000,1
+lou_fild01.gat,273,128,75,50 monster Bigfoot 1060,4,0,0,0
+
+lou_fild01.gat,224,315,100,50 monster Caramel 1103,7,0,0,0
+lou_fild01.gat,203,225,110,35 monster Caramel 1103,7,0,0,0
+lou_fild01.gat,273,128,75,50 monster Caramel 1103,7,0,0,0
+
+lou_fild01.gat,224,315,100,50 monster Mantis 1139,10,0,0,0
+lou_fild01.gat,203,225,110,35 monster Mantis 1139,10,0,0,0
+lou_fild01.gat,273,128,75,50 monster Mantis 1139,10,0,0,0
+
+lou_fild01.gat,224,315,100,50 monster Mi Gao 1516,8,0,0,0
+lou_fild01.gat,203,225,110,35 monster Mi Gao 1516,15,60000,30000,1
+lou_fild01.gat,273,128,75,500 monster Mi Gao 1516,7,0,0,0
+
+lou_fild01.gat,224,315,100,50 monster Anacondaq 1030,2,0,0,0
+lou_fild01.gat,203,225,110,35 monster Anacondaq 1030,1,0,0,0
+lou_fild01.gat,273,128,75,50 monster Anacondaq 1030,2,0,0,0
+
+
+lou_dun01.gat,0,0,0,0 monster Horong 1129,15,0,0,0
+lou_dun01.gat,0,0,0,0 monster Mi Gao 1516,15,0,0,0
+lou_dun01.gat,215,159,40,80 monster Side Winder 1037,10,300000,120000,0
+lou_dun01.gat,215,159,40,80 monster Jing Guai 1517,25,300000,120000,0
+lou_dun01.gat,0,0,0,0 monster Jing Guai 1517,20,0,0,0
+lou_dun01.gat,0,0,0,0 monster Grizzly 1381,15,0,0,0
+lou_dun01.gat,0,0,0,0 monster Leib Olmai 1306,1,300000,120000,0
+
+
+lou_dun02.gat,0,0,0,0 monster Yao Jun 1512,40,0,0,0
+lou_dun02.gat,0,0,0,0 monster Munak 1026,25,0,0,0
+lou_dun02.gat,0,0,0,0 monster Zhu Po Long 1514,5,0,0,0
+lou_dun02.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
+
+
+lou_dun03.gat,0,0,0,0 monster Yao Jun 1512,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Zhu Po Long 1514,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Mao Guai 1513,15,0,0,0
+lou_dun03.gat,0,0,0,0 monster Green Maiden 1631,5,3000000,1800000,1
+lou_dun03.gat,0,0,0,0 monster White Lady 1630,1,7000000,5000000,1
+
+
+
+payon_in02.gat,23,68,5,5 monster Thief Bug 1051,7,1200000,600000,0
+
+
+niflheim.gat,0,0,0,0 monster Dullahan 1504,5,1800000,1200000,0
+niflheim.gat,0,0,0,0 monster Gibbet 1503,10,1200000,600000,0
+niflheim.gat,0,0,0,0 monster Heirozoist 1510,10,1200000,600000,0
+niflheim.gat,0,0,0,0 monster Quve 1508,20,300000,150000,0
+niflheim.gat,0,0,0,0 monster Lude 1509,20,300000,150000,0
+
+
+nif_fild01.gat,0,0,0,0 monster Disguise 1506,20,0,0,0
+nif_fild01.gat,0,0,0,0 monster Disguise 1506,30,300000,120000,0
+nif_fild01.gat,227,253,20,20 monster Dullahan 1504,7,1800000,1200000,0
+nif_fild01.gat,0,0,0,0 monster Dullahan 1504,18,0,0,0
+nif_fild01.gat,0,0,0,0 monster Gibbet 1503,15,0,0,0
+nif_fild01.gat,0,0,0,0 monster Heirozoist 1510,15,0,0,0
+nif_fild01.gat,0,0,0,0 monster Quve 1508,30,0,0,0
+
+
+nif_fild02.gat,366,236,15,15 monster Lude 1509,10,360000,150000,0
+nif_fild02.gat,356,139,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,144,232,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,118,282,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,62,327,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,10,0,0,0
+nif_fild02.gat,114,136,15,15 monster Loli Ruri 1505,2,1200000,600000,0
+nif_fild02.gat,52,115,10,10 monster Heirozoist 1510,4,1200000,600000,0
+nif_fild02.gat,84,276,15,15 monster Gibbet 1503,5,1200000,600000,0
+nif_fild02.gat,352,273,15,15 monster Gibbet 1503,5,300000,150000,0
+nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,20,60000,60000,0
+nif_fild02.gat,352,273,15,15 monster Dullahan 1504,5,600000,300000,0
+nif_fild02.gat,0,0,0,0 monster Dullahan 1504,5,0,0,0
+nif_fild02.gat,0,0,0,0 monster Heirozoist 1510,6,0,0,0
+nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+
+
+yggdrasil01.gat,234,256,10,10 monster Blue Plant 1079,5,1800000,600000,0
+yggdrasil01.gat,273,234,3,3 monster Shining Plant 1083,1,1800000,600000,0
+yggdrasil01.gat,143,257,20,10 monster Shining Plant 1083,5,1200000,600000,0
+yggdrasil01.gat,98,238,20,15 monster Yellow Plant 1081,5,1200000,600000,0
+yggdrasil01.gat,98,238,20,15 monster White Plant 1082,5,1200000,600000,0
+yggdrasil01.gat,47,207,20,20 monster Blue Plant 1079,5,1200000,600000,0
+yggdrasil01.gat,61,258,3,3 monster Shining Plant 1083,1,1800000,600000,0
+yggdrasil01.gat,132,199,20,5 monster Blue Plant 1079,5,1200000,600000,0
+yggdrasil01.gat,209,218,2,2 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,192,186,2,2 monster Shining Plant 1083,1,1800000,1200000,0
+yggdrasil01.gat,169,176,3,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,169,176,3,3 monster Green Plant 1080,1,60000,30000,0
+yggdrasil01.gat,94,111,5,2 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,51,118,10,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,133,54,3,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,257,63,10,10 monster Shining Plant 1083,3,1800000,1200000,0
+yggdrasil01.gat,0,0,0,0 monster Shining Plant 1083,10,3600000,2300000,0
+yggdrasil01.gat,0,0,0,0 monster Green Plant 1080,25,60000,30000,0
+yggdrasil01.gat,0,0,0,0 monster Red Plant 1078,15,60000,30000,0
+
+
+// um_fild01
+
+um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
+um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
+um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
+um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+
+// um_fild02
+
+um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
+um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
+um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
+um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,360,320,20,30 monster Flora 1118,3,180000,120000,0
+// um_fild03
+
+um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
+um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
+um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
+um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
+um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3500000,1900000,0
+
+// um_fild04
+
+um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
+um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
+um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
+um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,120000,60000,0
+um_fild04.gat,264,293,10,10 monster Horn 1128,2,1200000,60000,0
+um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,118,237,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,311,285,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,206,188,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,3,0,0,0
+
+// um_dun01
+
+um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,70,0,0,0
+um_dun01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
+
+// um_dun02
+
+um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,15,0,0,0
+um_dun02.gat,79,227,5,5 monster Wooden Golem 1497,5,120000,60000,0
+um_dun02.gat,87,189,5,5 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,170,145,5,5 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,196,131,7,7 monster Wooden Golem 1497,5,120000,60000,0
+um_dun02.gat,244,129,10,10 monster Wooden Golem 1497,5,120000,60000,0
+
+um_dun02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_dun02.gat,117,43,10,10 monster Beetle King 1494,3,120000,60000,0
+um_dun02.gat,209,34,10,10 monster Beetle King 1494,3,120000,60000,0
+um_dun02.gat,205,265,10,10 monster Beetle King 1494,4,120000,60000,0
+
+um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,10,0,0,0
+um_dun02.gat,90,97,10,10 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,32,83,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,180,238,10,10 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,144,277,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,272,163,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,232,156,10,10 monster Wooden Golem 1497,3,120000,60000,0
+
+um_dun02.gat,0,0,0,0 monster Driller 1380,5,0,0,0
+um_dun02.gat,197,138,10,10 monster Driller 1380,2,120000,60000,0
+um_dun02.gat,164,203,10,10 monster Driller 1380,1,120000,60000,0
+um_dun02.gat,32,83,10,10 monster Driller 1380,1,120000,60000,0
+um_dun02.gat,244,129,10,10 monster Driller 1380,2,120000,60000,0
+
+um_dun02.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
+um_dun02.gat,213,217,10,10 monster Wootan Shooter 1498,2,120000,60000,0
+um_dun02.gat,72,258,10,10 monster Wootan Shooter 1498,3,120000,60000,0
+um_dun02.gat,79,227,5,5 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,170,145,5,5 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,209,34,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,272,163,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,232,156,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+
+um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
+
+
+
+//gon_fild01
+
+gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,600000,300000,0
+gon_fild01.gat,0,0,0,0 monster Zipper Bear 1417,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Dumpling Child 1409,30,0,0,0
+gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,630000,330000,0
+gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,0
+gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,0
+
+//gon_dun01
+
+gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,650000,350000,0
+gon_dun01.gat,0,0,0,0 monster Enchanted Peach Tree 1410,35,0,0,0
+gon_dun01.gat,0,0,0,0 monster Zipper Bear 1417,30,0,0,0
+
+gon_dun01.gat,0,0,0,0 monster Red Plant 1078,5,0,0,0
+gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
+
+//gon_dun02
+
+gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,2,300000,150000,0
+gon_dun02.gat,241,226,15,20 monster Baby Leopard 1415,4,600000,300000,0
+gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,3,120000,60000,0
+gon_dun02.gat,33,115,10,15 monster Enchanted Peach Tree 1410,1,300000,150000,0
+gon_dun02.gat,33,115,10,15 monster Baby Leopard 1415,2,600000,300000,0
+gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,20,690000,390000,0
+gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
+gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,15,0,0,0
+gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+
+//gon_dun03
+
+gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
+gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,600000,300000,0
+gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,600000,300000,0
+gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
+gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,5650000,3650000,0
+
+
+
+
+sec_in02.gat,139,80,20,10 monster Poring 1002,5,0,0,0
+sec_in02.gat,138,54,20,20 monster Marin 1242,5,0,0,0
+sec_in02.gat,161,46,15,15 monster Poporing 1031,5,0,0,0
+sec_in02.gat,114,47,10,10 monster Drops 1113,5,0,0,0
+sec_in02.gat,114,47,10,10 monster Bigfoot 1060,10,0,0,0
+sec_in02.gat,139,80,30,30 monster Flora 1118,10,0,0,0
+
+
+
+// ama_fild01
+
+ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
+ama_fild01.gat,174,207,20,20 monster Kapha 1406,5,1200000,300000,0
+ama_fild01.gat,241,310,10,10 monster Kapha 1406,5,600000,300000,0
+ama_fild01.gat,114,230,10,10 monster Kapha 1406,5,600000,300000,0
+ama_fild01.gat,174,253,10,10 monster Kapha 1406,5,600000,300000,0
+
+ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,69000,34500,0
+ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,72000,39000,0
+
+ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,72000,39000,0
+ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,69000,34500,0
+ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,63000,31500,0
+
+ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,66000,33000,0
+
+ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
+
+ama_fild01.gat,0,0,0,0 monster Kapha 1406,20,60000,30000,0
+ama_fild01.gat,174,306,20,20 monster Kapha 1406,10,300000,150000,0
+ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,180000,90000,0
+ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,180000,90000,0
+ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,60000,30000,0
+
+
+
+ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
+ama_dun01.gat,0,0,0,0 monster Firelock Soldier 1403,45,0,0,0
+ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
+
+
+
+ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,0,0,0
+ama_dun02.gat,0,0,0,0 monster Firelock Soldier 1403,20,60000,30000,0
+ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,120000,60000,0
+ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
+ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
+ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,180000,90000,0
+
+
+
+ama_dun03.gat,0,0,0,0 monster Shinobi 1401,35,300000,150000,0
+ama_dun03.gat,0,0,0,0 monster Firelock Soldier 1403,25,0,0,0
+ama_dun03.gat,0,0,0,0 monster Miyabi Doll 1404,1,0,0,0
+ama_dun03.gat,0,0,0,0 monster Tengu 1405,40,300000,150000,0
+ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
+ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,600000,300000,0
+
+ama_dun03.gat,0,0,0,0 monster Samurai Specter 1492,1,5460000,3600000,0
+ama_dun03.gat,0,0,0,0 monster Shinobi 1401,20,5450000,3600000,0
+ama_dun03.gat,0,0,0,0 monster Tengu 1405,15,5440000,3600000,0
+
+
+
+// mag_dun01
+
+mag_dun01.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
+mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,20,600000,300000,0
+mag_dun01.gat,0,0,0,0 monster Kaho 1072,20,0,0,0
+mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
+mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
+
+// mag_dun02
+
+mag_dun02.gat,70,190,20,20 monster Blazer 1367,5,300000,150000,0
+mag_dun02.gat,200,120,40,40 monster Blazer 1367,15,300000,150000,0
+mag_dun02.gat,70,87,50,50 monster Nightmare Terror 1379,10,300000,150000,0
+mag_dun02.gat,210,156,15,15 monster Nightmare Terror 1379,3,60000,30000,0
+mag_dun02.gat,135,153,15,15 monster Nightmare Terror 1379,3,60000,30000,0
+mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,12,60000,30000,0
+mag_dun02.gat,120,202,20,20 monster Deleter 1384,5,60000,30000,0
+mag_dun02.gat,185,185,50,50 monster Deleter 1385,10,300000,150000,0
+mag_dun02.gat,200,77,30,30 monster Deleter 1384,5,300000,150000,0
+mag_dun02.gat,0,0,0,0 monster Gig 1387,10,0,0,0
+mag_dun02.gat,200,77,30,30 monster Diabolic 1382,10,300000,150000,0
+mag_dun02.gat,135,68,15,15 monster Diabolic 1382,5,300000,30000,0
+mag_dun02.gat,0,0,0,0 monster Diabolic 1382,5,60000,30000,0
+
+
+prontera.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+morocc.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+alberta.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+aldebaran.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+geffen.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+payon.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+comodo.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+izlude.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+yuno.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+umbala.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+amatsu.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+gonryun.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+
+
+
+// yuno_fild01 (lv2)
+
+yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+yuno_fild01.gat,190,329,80,20 monster Grand Peco 1369,3,50000,25000,0
+
+// yuno_fild02 (lv3)
+
+yuno_fild02.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Horn 1128,40,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Sage Worm 1281,10,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
+
+// yuno_fild03 (lv4)
+
+yuno_fild03.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Marin 1242,20,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
+yuno_fild03.gat,62,131,44,15 monster Side Winder 1037,1,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
+yuno_fild03.gat,0,0,0,0 monster Deviling 1582,1,3600000,1800000,1
+
+// yuno_fild04 (lv3)
+
+yuno_fild04.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Condor 1009,20,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
+
+
+// prt_fild00 (lv2)
+
+prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
+prt_fild00.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
+prt_fild00.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
+prt_fild00.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
+prt_fild00.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
+
+// prt_fild01 (lv1)
+
+prt_fild01.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
+prt_fild01.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
+prt_fild01.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+prt_fild01.gat,0,0,0,0 monster Lunatic 1063,80,0,0,0
+prt_fild01.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+
+// prt_fild02 (lv2)
+
+prt_fild02.gat,0,0,0,0 monster Mandragora 1020,75,0,0,0
+prt_fild02.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
+prt_fild02.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild02.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
+prt_fild02.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,3600000,1800000,0
+
+// prt_fild03 (lv2)
+
+prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
+prt_fild03.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
+prt_fild03.gat,0,0,0,0 monster Choco 1214,3,1800000,900000,0
+prt_fild03.gat,0,0,0,0 monster Fabre 1007,10,0,0,0
+prt_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+
+// prt_fild04 (lv2)
+
+prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
+prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
+prt_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+prt_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild04.gat,0,0,0,0 monster Vocal 1088,1,3600000,1800000,0
+
+// prt_fild05 (lv1)
+
+prt_fild05.gat,0,0,0,0 monster Poring 1002,70,0,0,0
+prt_fild05.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_fild05.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
+prt_fild05.gat,0,0,0,0 monster Pupa 1008,30,0,0,0
+prt_fild05.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+
+// prt_fild06 (lv2)
+
+prt_fild06.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
+prt_fild06.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_fild06.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+prt_fild06.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild06.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+
+// prt_fild07 (lv2)
+
+prt_fild07.gat,0,0,0,0 monster Rocker 1052,120,0,0,0
+prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+
+// prt_fild08 (lv1)
+
+prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
+prt_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild08.gat,0,0,0,0 monster Poring 1002,100,0,0,0
+prt_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+
+// prt_fild09 (lv2)
+
+prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
+prt_fild09.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
+
+// prt_fild10 (lv3)
+
+prt_fild10.gat,0,0,0,0 monster Savage 1166,70,0,0,0
+prt_fild10.gat,0,0,0,0 monster Savage Babe 1167,40,0,0,0
+prt_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+prt_fild10.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+
+// prt_fild11 (lv4)
+
+prt_fild11.gat,0,0,0,0 monster Goblin 1122,20,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1123,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1124,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1125,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1126,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
+prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin Steamrider 1280,30,0,0,0
+//putmob "prt_fild11" 0 0 0 0 20 ROTAR_ZAIRO 0 0 0
+
+
+
+// moc_fild01 (lv2)
+
+moc_fild01.gat,0,0,0,0 monster Baby Desert Wolf 1107,70,0,0,0
+moc_fild01.gat,0,0,0,0 monster Ant Egg 1097,20,0,0,0
+moc_fild01.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
+moc_fild01.gat,0,0,0,0 monster Picky 1049,10,0,0,0
+moc_fild01.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+moc_fild01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+
+// moc_fild02 (lv2)
+
+moc_fild02.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
+moc_fild02.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild02.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
+moc_fild02.gat,0,0,0,0 monster Picky 1049,10,0,0,0
+moc_fild02.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+
+// moc_fild03 (lv3)
+
+moc_fild03.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
+moc_fild03.gat,0,0,0,0 monster Greatest General 1277,40,0,0,0
+moc_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+moc_fild03.gat,0,0,0,0 monster Eggyra 1116,20,0,0,0
+moc_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
+moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
+
+// moc_fild04 (lv3)
+
+moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
+moc_fild04.gat,0,0,0,0 monster Scorpion 1001,30,0,0,0
+moc_fild04.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Magnolia 1138,40,0,0,0
+moc_fild04.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild04.gat,0,0,0,0 monster Andre 1095,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Piere 1160,20,0,0,0
+
+// moc_fild05 (lv2)
+
+moc_fild05.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
+moc_fild05.gat,0,0,0,0 monster Metaller 1058,40,0,0,0
+moc_fild05.gat,0,0,0,0 monster Golem 1040,70,0,0,0
+moc_fild05.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Piere 1160,10,0,0,0
+
+
+// moc_fild06 (lv2)
+
+moc_fild06.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
+moc_fild06.gat,0,0,0,0 monster Muka 1055,30,0,0,0
+moc_fild06.gat,0,0,0,0 monster Condor 1009,50,0,0,0
+moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
+
+moc_fild06.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+
+// moc_fild07 (lv1)
+
+moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
+moc_fild07.gat,0,0,0,0 monster Peco Peco Egg 1047,50,0,0,0
+moc_fild07.gat,0,0,0,0 monster Picky 1050,30,0,0,0
+moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
+
+
+// moc_fild08 (lv4)
+
+moc_fild08.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Scorpion 1001,80,0,0,0
+moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,40,0,0,0
+moc_fild08.gat,0,0,0,0 monster Anacondaq 1030,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
+moc_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+
+
+// moc_fild09 (lv3)
+
+moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Metaller 1058,70,0,0,0
+moc_fild09.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
+moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
+
+// moc_fild10 (lv1)
+
+moc_fild10.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+moc_fild10.gat,0,0,0,0 monster Peco Peco Egg 1047,70,0,0,0
+moc_fild10.gat,0,0,0,0 monster Picky 1049,50,0,0,0
+moc_fild10.gat,0,0,0,0 monster Picky 1050,50,0,0,0
+moc_fild10.gat,0,0,0,0 monster Magnolia 1138,1,0,0,0
+moc_fild10.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+
+// moc_fild11 (lv2)
+
+moc_fild11.gat,0,0,0,0 monster Hode 1127,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Golem 1040,70,0,0,0
+moc_fild11.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Piere 1160,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
+moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
+
+// moc_fild12 (lv1)
+
+moc_fild12.gat,0,0,0,0 monster Picky 1050,50,0,0,0
+moc_fild12.gat,0,0,0,0 monster Picky 1049,50,0,0,0
+moc_fild12.gat,0,0,0,0 monster Peco Peco Egg 1047,35,0,0,0
+moc_fild12.gat,0,0,0,0 monster Drops 1113,35,0,0,0
+
+// moc_fild13 (lv3)
+
+// putmob "moc_fild13" 0 0 0 0 15 DESERT_WOLF 0 0 0
+moc_fild13.gat,0,0,0,0 monster Anacondaq 1030,60,0,0,0
+moc_fild13.gat,0,0,0,0 monster Boa 1025,25,0,0,0
+moc_fild13.gat,0,0,0,0 monster Side Winder 1037,40,0,0,0
+moc_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+moc_fild13.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+
+// moc_fild14 (lv4)
+
+moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
+moc_fild14.gat,0,0,0,0 monster Side Winder 1037,40,0,0,0
+moc_fild14.gat,0,0,0,0 monster Baby Desert Wolf 1107,10,0,0,0
+moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+
+// moc_fild15 (lv3)
+
+moc_fild15.gat,0,0,0,0 monster Hode 1127,30,0,0,0
+moc_fild15.gat,0,0,0,0 monster Scorpion 1001,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild15.gat,0,0,0,0 monster Andre 1095,40,0,0,0
+moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,1
+
+// moc_fild16 (lv4)
+
+moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,0,0,0
+moc_fild16.gat,0,0,0,0 monster Hode 1127,30,0,0,0
+moc_fild16.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild16.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild16.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild16.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+
+// moc_fild17 (lv3)
+
+moc_fild17.gat,0,0,0,0 monster Hode 1127,70,0,0,0
+moc_fild17.gat,0,0,0,0 monster Steel Chonchon 1042,30,0,0,0
+moc_fild17.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
+moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
+moc_fild17.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild17.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild17.gat,0,0,0,0 monster Piere 1160,20,0,0,0
+moc_fild17.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild17.gat,0,0,0,0 monster Scorpion 1001,5,0,0,0
+moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
+
+// moc_fild18 (lv2)
+
+moc_fild18.gat,0,0,0,0 monster Steel Chonchon 1042,70,0,0,0
+moc_fild18.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
+moc_fild18.gat,0,0,0,0 monster Muka 1055,40,0,0,0
+moc_fild18.gat,0,0,0,0 monster Metaller 1058,10,0,0,0
+moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild18.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Ant Egg 1097,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Dragon Fly 1091,1,3600000,1800000,1
+moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,7200000,3600000,1
+
+
+
+
+// pay_fild01 (lv2)
+
+pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
+pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+//putmob "pay_fild01" 0 0 0 0 30 BIGFOOT 0 0 0
+
+
+// pay_fild02 (lv2)
+
+pay_fild02.gat,0,0,0,0 monster Boa 1025,50,0,0,0
+pay_fild02.gat,0,0,0,0 monster Wolf 1013,70,0,0,0
+pay_fild02.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild02.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+
+// pay_fild03 (lv1)
+
+pay_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
+pay_fild03.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
+pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,0,0,0
+
+// pay_fild04 (lv2)
+
+pay_fild04.gat,0,0,0,0 monster Poring 1002,50,0,0,0
+pay_fild04.gat,0,0,0,0 monster Drops 1113,50,0,0,0
+pay_fild04.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+pay_fild04.gat,0,0,0,0 monster Marin 1242,10,0,0,0
+pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,1800000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,1800000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Deviling 1582,1,3600000,3600000,1
+
+// pay_fild05 (lv4)
+
+pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,1,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,70,0,0,0
+
+// pay_fild06 (lv2)
+
+pay_fild06.gat,0,0,0,0 monster Wormtail 1024,100,0,0,0
+pay_fild06.gat,0,0,0,0 monster Spore 1014,40,0,0,0
+pay_fild06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild06.gat,0,0,0,0 monster Thief Bug Female 1053,40,0,0,0
+
+// pay_fild07 (lv3)
+
+pay_fild07.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
+pay_fild07.gat,0,0,0,0 monster Eggyra 1116,40,0,0,0
+pay_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild07.gat,0,0,0,0 monster Willow 1010,20,0,0,0
+pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,0,0,0
+
+// pay_fild08 (lv1)
+
+pay_fild08.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+pay_fild08.gat,0,0,0,0 monster Willow 1010,70,0,0,0
+pay_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+pay_fild08.gat,0,0,0,0 monster Spore 1014,50,0,0,0
+
+// pay_fild09 (lv2)
+
+pay_fild09.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Wormtail 1024,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Boa 1025,30,0,0,0
+pay_fild09.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
+pay_fild09.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
+pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,65,0,0,0
+pay_fild09.gat,0,0,0,0 monster Wanderer 1208,1,3600000,1800000,1
+
+// pay_fild10 (lv4)
+
+pay_fild10.gat,0,0,0,0 monster Greatest General 1277,65,0,0,0
+pay_fild10.gat,0,0,0,0 monster Horong 1129,40,0,0,0
+pay_fild10.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+pay_fild10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,1800000,900000,1
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,900000,450000,1
+
+// pay_fild11 (lv4)
+
+pay_fild11.gat,0,0,0,0 monster Horong 1129,50,0,0,0
+pay_fild11.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
+pay_fild11.gat,0,0,0,0 monster Elder Willow 1033,10,0,0,0
+pay_fild11.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild11.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
+pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,0,0,0
+pay_fild11.gat,0,0,0,0 monster Eddga 1115,1,7200000,3600000,1
+
+
+
+// gef_fild00 (lv1)
+
+gef_fild00.gat,0,0,0,0 monster Poring 1002,80,0,0,0
+gef_fild00.gat,0,0,0,0 monster Fabre 1007,80,0,0,0
+gef_fild00.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+gef_fild00.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+
+// gef_fild01 (lv1)
+
+gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,50,0,0,0
+gef_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild01.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
+
+// gef_fild02 (lv2)
+
+gef_fild02.gat,0,0,0,0 monster Yoyo 1057,10,0,0,0
+gef_fild02.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
+gef_fild02.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+gef_fild02.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
+gef_fild02.gat,0,0,0,0 monster Choco 1214,1,0,0,0
+
+
+// gef_fild03 (lv3)
+
+gef_fild03.gat,0,0,0,0 monster Orc Warrior 1023,30,0,0,0
+gef_fild03.gat,0,0,0,0 monster High Orc 1213,10,0,0,0
+gef_fild03.gat,0,0,0,0 monster Savage 1166,40,0,0,0
+gef_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+
+// gef_fild04 (lv1)
+
+gef_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+gef_fild04.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
+gef_fild04.gat,0,0,0,0 monster Pupa 1008,60,0,0,0
+gef_fild04.gat,0,0,0,0 monster Fabre 1007,30,0,0,0
+gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,30,0,0,0
+
+// gef_fild05 (lv3)
+
+gef_fild05.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+gef_fild05.gat,0,0,0,0 monster Kobold Archer 1282,15,0,0,0
+gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,0,0,0
+gef_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
+
+// gef_fild06 (lv4)
+
+gef_fild06.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 1134,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 1135,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Petite 1156,35,0,0,0
+gef_fild06.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+gef_fild06.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+
+// gef_fild07 (lv1)
+
+gef_fild07.gat,0,0,0,0 monster Poring 1002,70,0,0,0
+gef_fild07.gat,0,0,0,0 monster Chonchon 1011,50,0,0,0
+gef_fild07.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+gef_fild07.gat,0,0,0,0 monster Fabre 1007,70,0,0,0
+
+// gef_fild08 (lv3)
+
+gef_fild08.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 1134,40,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 1135,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Golem 1040,40,0,0,0
+gef_fild08.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+
+// gef_fild09 (lv3)
+
+gef_fild09.gat,0,0,0,0 monster Ambernite 1094,70,0,0,0
+gef_fild09.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+
+// gef_fild10 (lv3)
+
+gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
+gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
+gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
+gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild10.gat,0,0,0,0 monster Orc Baby 1686,5,120000,0,0
+
+// gef_fild11 (lv4)
+
+gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,240000,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1122,30,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1123,25,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1124,25,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1125,25,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1126,25,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild11.gat,0,0,0,0 monster Rotar Zairo 1392,10,0,0,0
+
+// gef_fild12 (lv4)
+gef_fild12.gat,0,0,0,0 monster Kobold 1133,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 1134,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 1135,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold Archer 1282,40,0,0,0
+gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,240000,0,0
+
+// gef_fild13 (lv2)
+gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild13.gat,0,0,0,0 monster Creamy 1018,30,0,0,0
+gef_fild13.gat,0,0,0,0 monster Ambernite 1094,15,0,0,0
+
+// gef_fild14 (lv4)
+gef_fild14.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,1800000,1
+gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Archer 1189,30,0,0,0
+gef_fild14.gat,0,0,0,0 monster High Orc 1213,60,0,0,0
+
+
+
+// cmd_fild01 (lv3)
+
+cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+
+// cmd_fild02 (lv3)
+
+cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,0,0,0
+cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
+cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,60000,0,0
+cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,180000,0,0
+cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,60000,0,0
+cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
+cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,180000,0,0
+cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
+cmd_fild02.gat,200,130,150,40 monster Seal 1317,25,0,0,0
+cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,180000,0,0
+cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
+
+// cmd_fild03 (lv4)
+
+cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
+cmd_fild03.gat,0,0,0,0 monster Pest 1256,20,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Anolian 1206,70,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
+cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,20,0,0,0
+
+// cmd_fild04 (lv3)
+
+cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
+cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
+
+// cmd_fild05 (lv3)
+
+cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
+
+// cmd_fild06 (lv3)
+
+cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
+cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
+cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,180000,0,0
+
+cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
+cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,0,0,0
+cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,0,0,0
+cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,0,0,0
+cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,0,0,0
+cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
+
+//cmd_fild07
+cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
+cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
+cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
+cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
+cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,180000,0,0
+cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,180000,0,0
+cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,60000,0,0
+cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
+cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
+cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
+
+// cmd_fild08 (lv4)
+
+cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,60000,0,0
+cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
+
+cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,60000,0,0
+cmd_fild08.gat,190,115,100,80 monster Kobold Archer 1282,10,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,7,0,0,0
+cmd_fild08.gat,72,131,40,100 monster Kobold Archer 1282,8,0,0,0
+cmd_fild08.gat,319,177,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,319,172,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,139,71,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,136,64,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,67,80,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,132,149,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,97,144,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,79,140,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,28,102,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,30000,0,0
+cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,0,0,0
+cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,0,0,0
+cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,180000,0,0
+cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
+
+// cmd_fild09 (lv2)
+
+cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Condor 1009,40,0,0,0
+cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,150000,0,0
+cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,150000,0,0
+
+
+
+// mjolnir_01 (lv2)
+
+mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Coco 1104,40,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Caramel 1103,70,0,0,0
+
+// mjolnir_02 (lv3)
+
+mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Petite 1155,35,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Flora 1118,30,0,0,0
+
+// mjolnir_03 (lv4)
+
+mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Petite 1156,60,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Flora 1118,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+
+// mjolnir_04 (lv4)
+
+mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Flora 1118,30,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
+
+// mjolnir_05 (lv4)
+
+mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+
+// mjolnir_06 (lv2)
+
+mjolnir_06.gat,0,0,0,0 monster Stainer 1174,50,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Horn 1128,30,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
+
+// mjolnir_07 (lv3)
+
+mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
+
+// mjolnir_08 (lv4)
+
+mjolnir_08.gat,0,0,0,0 monster Mantis 1139,50,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argos 1100,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+
+// mjolnir_09 (lv2)
+
+mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Stainer 1174,30,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Rocker 1052,20,0,0,0
+
+// mjolnir_10 (lv3)
+
+mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Flora 1118,15,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Argos 1100,50,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Petite 1155,5,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Argiope 1099,60,0,0,0
+
+// mjolnir_11 (lv4)
+
+mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
+
+// mjolnir_12 (lv3)
+
+mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
+
+
+
+
+
+// prt_sewb1
+prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,90,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Thief Bug 1051,40,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Tarou 1175,20,0,0,0
+
+// prt_sewb2
+prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Thief Bug 1051,70,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Plankton 1161,30,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Thief Bug Female 1053,10,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
+
+// prt_sewb3
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Female 1053,65,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Male 1054,65,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Tarou 1175,15,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+
+// prt_sewb4
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Male 1054,70,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,1800000,1
+
+
+
+// mjo_dun01
+mjo_dun01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Tarou 1175,80,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Martin 1145,40,0,0,0
+
+// mjo_dun02
+mjo_dun02.gat,0,0,0,0 monster Martin 1145,60,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
+
+// mjo_dun03
+mjo_dun03.gat,0,0,0,0 monster Martin 1145,5,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,70,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Giearth 1121,5,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Myst 1151,35,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Cramp 1209,2,300000,150000,0
+mjo_dun03.gat,0,0,0,0 monster Cramp 1209,1,50000,25000,0
+
+
+
+// Orcsdun01
+
+orcsdun01.gat,0,0,0,0 monster Steel Chonchon 1042,10,0,0,0
+orcsdun01.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
+orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,10,0,0,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,40,3000,5000,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,20,30000,15000,0
+orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,90000,30000,0
+
+// Orcsdun02
+
+orcsdun02.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,10,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,60000,30000,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,120000,60000,0
+orcsdun02.gat,0,0,0,0 monster Zenorc 1177,30,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Zenorc 1177,20,60000,30000,0
+orcsdun02.gat,0,0,0,0 monster Orc Archer 1189,5,1800000,900000,1
+
+
+
+// Anthell01
+anthell01.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+anthell01.gat,0,0,0,0 monster Andre 1095,50,0,0,0
+anthell01.gat,0,0,0,0 monster Piere 1160,50,0,0,0
+anthell01.gat,0,0,0,0 monster Deniro 1105,50,0,0,0
+anthell01.gat,0,0,0,0 monster Vitata 1176,20,0,0,0
+anthell01.gat,0,0,0,0 monster Giearth 1121,1,0,0,0
+anthell01.gat,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,1
+anthell01.gat,28,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,261,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,270,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,269,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,268,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,267,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+
+anthell01.gat,41,269,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,268,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,267,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,197,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,196,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,194,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,33,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,33,196,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,190,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,190,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,189,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,167,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,43,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,44,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,45,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,44,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,43,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,37,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,36,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,35,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,36,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,184,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,183,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,37,183,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,99,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,98,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,126,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,125,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,124,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,123,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,98,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,99,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,100,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,101,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,123,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,122,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,120,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,103,120,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,103,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,105,124,0,0 monster Ant Egg 1097,1,60000,30000,0
+
+// Anthell02
+anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,0,0,0
+anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+anthell02.gat,0,0,0,0 monster Andre 1095,40,0,0,0
+anthell02.gat,0,0,0,0 monster Piere 1160,15,0,0,0
+anthell02.gat,0,0,0,0 monster Deniro 1105,15,0,0,0
+anthell02.gat,0,0,0,0 monster Vitata 1176,30,0,0,0
+anthell02.gat,0,0,0,0 monster Giearth 1121,3,0,0,0
+anthell02.gat,0,0,0,0 monster Maya 1147,1,7200000,3600000,0
+
+
+//putmob "xmas" 0 0 0 0 1 SASQUATCH 3600000 7200000 0
+//putmob "xmas" 0 0 0 0 3 PORING_ 60000 30000 0
+
+
+xmas_fild01.gat,0,0,0,0 monster Marin 1242,35,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Sasquatch 1243,20,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
+xmas_fild01.gat,0,0,0,0 monster Garm 1252,1,7200000,3600000,1
+
+
+xmas_dun01.gat,0,0,0,0 monster Marin 1242,20,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+//putmob "xmas_dun01" 0 0 0 0 20 GOBLINE_XMAS 0 0 0
+xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,40,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Cookie 1265,40,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Myst Case 1249,5,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Chepet 1250,1,1200000,900000,0
+xmas_dun01.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,0
+xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
+
+
+xmas_dun02.gat,0,0,0,0 monster Christmas Cookie 1246,20,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Cookie 1265,20,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Cruiser 1248,35,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,50,0,0,0
+//putmob "xmas_dun02" 0 0 0 0 10 GOBLINE_XMAS 0 0 0
+xmas_dun02.gat,0,0,0,0 monster Stormy Knight 1251,1,3600000,7200000,0
+xmas_dun02.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
+
+
+
+
+// pay_dun00
+pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
+pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
+pay_dun00.gat,0,0,0,0 monster Skeleton 1076,35,0,0,0
+pay_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+
+// pay_dun01
+
+pay_dun01.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+pay_dun01.gat,0,0,0,0 monster Eggyra 1116,20,0,0,0
+pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
+pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,40,30000,15000,1
+pay_dun01.gat,0,0,0,0 monster Archer Skeleton 1016,30,30000,15000,1
+
+// pay_dun02
+
+pay_dun02.gat,0,0,0,0 monster Soldier Skeleton 1028,15,180000,90000,1
+pay_dun02.gat,0,0,0,0 monster Munak 1026,40,0,0,0
+pay_dun02.gat,0,0,0,0 monster Bongun 1188,30,0,0,0
+pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_dun02.gat,0,0,0,0 monster Archer Skeleton 1016,20,180000,90000,1
+pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
+pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
+pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
+pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
+pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
+pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
+pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,118,207,0,0 monster Hydra 1068,1,332000,100000,1
+pay_dun02.gat,118,201,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
+pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
+pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
+pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,119,196,0,0 monster Hydra 1068,1,315000,100000,1
+pay_dun02.gat,120,203,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,120,200,0,0 monster Hydra 1068,1,303000,100000,1
+pay_dun02.gat,120,194,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,121,200,0,0 monster Hydra 1068,1,333000,100000,1
+pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,122,197,0,0 monster Hydra 1068,1,321000,100000,1
+pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,113,194,0,0 monster Hydra 1068,1,319000,100000,1
+pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,113,193,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
+pay_dun02.gat,112,192,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
+pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
+pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,227,185,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,227,184,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,229,183,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,214,266,0,0 monster Red Plant 1078,1,600000,300000,1
+pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
+pay_dun02.gat,37,243,0,0 monster Nine Tail 1180,1,3600000,1800000,1
+
+// pay_dun03
+pay_dun03.gat,0,0,0,0 monster Sohee 1170,50,0,0,0
+pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Bongun 1188,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
+pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,3600000,1800000,0
+pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,14400000,0,1
+pay_dun03.gat,66,73,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,68,72,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,67,71,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,63,70,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,58,69,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,67,69,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,60,68,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,69,68,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,62,67,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,67,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,64,66,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,57,65,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,66,65,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,59,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,68,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,66,63,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,243,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,86,248,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,85,178,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,115,190,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,230,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,240,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,219,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,243,220,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,219,185,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,228,185,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,228,61,0,0 monster Red Plant 1078,1,600000,300000,1
+pay_dun03.gat,138,42,0,0 monster Blue Plant 1079,1,600000,300000,1
+pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
+pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
+pay_dun03.gat,126,135,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,134,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,133,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,132,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,131,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,134,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,133,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,132,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,131,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,130,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
+
+// pay_dun04
+
+pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
+pay_dun04.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
+pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
+pay_dun04.gat,0,0,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
+pay_dun04.gat,0,0,0,0 monster Greatest General 1277,15,0,0,0
+pay_dun04.gat,0,0,0,0 monster Archer Skeleton 1016,15,0,0,0
+pay_dun04.gat,0,0,0,0 monster Nine Tail 1180,20,60000,30000,0
+pay_dun04.gat,0,0,0,0 monster Skeleton General 1290,1,1800000,1200000,0
+pay_dun04.gat,0,0,0,0 monster Am Mut 1301,1,1800000,1200000,0
+pay_dun04.gat,0,0,0,0 monster Cat o' Nine Tails 1307,1,3600000,7200000,1
+
+
+// Iz_dun00
+iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
+iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
+iz_dun00.gat,0,0,0,0 monster Kukre 1070,30,0,0,0
+iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Vadon 1066,30,0,0,0
+
+// Iz_dun01
+iz_dun01.gat,0,0,0,0 monster Plankton 1161,10,0,0,0
+iz_dun01.gat,0,0,0,0 monster Marina 1141,40,0,0,0
+iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
+iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
+iz_dun01.gat,0,0,0,0 monster Vadon 1066,60,0,0,0
+iz_dun01.gat,0,0,0,0 monster Cornutus 1067,30,0,0,0
+
+// Iz_dun02
+iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
+iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
+
+// Iz_dun03
+iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
+iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
+iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
+iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
+iz_dun03.gat,0,0,0,0 monster Marc 1045,45,0,0,0
+iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
+iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,323000,150000,0
+iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,317000,150000,0
+iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,323000,150000,0
+iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
+iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
+iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
+iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,316000,150000,0
+iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,2960000,150000,0
+iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
+iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
+iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
+
+// Iz_dun04
+iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
+iz_dun04.gat,0,0,0,0 monster Swordfish 1069,20,0,0,0
+iz_dun04.gat,0,0,0,0 monster Merman 1264,10,0,0,0
+iz_dun04.gat,0,0,0,0 monster Strouf 1065,3,0,0,0
+iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,0
+iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
+iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,308000,150000,0
+iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
+iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
+iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,303000,150000,0
+iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun04.gat,0,0,0,0 monster Penomena 1216,50,300000,150000,1
+iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,600000,300000,0
+iz_dun04.gat,103,231,10,10 monster Merman 1264,2,150000,0,0
+iz_dun04.gat,160,231,10,10 monster Merman 1264,2,170000,0,0
+iz_dun04.gat,95,147,10,10 monster Merman 1264,2,150000,0,0
+iz_dun04.gat,130,216,15,15 monster Merman 1264,2,160000,0,0
+
+
+// Gef_dun00
+gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,5,60000,30000,0
+gef_dun00.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
+
+gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,300000,150000,0
+gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,300000,150000,0
+gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,0
+gef_dun00.gat,0,0,0,0 monster Red Plant 1078,1,300000,150000,0
+gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
+
+// Gef_dun01
+gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
+gef_dun01.gat,0,0,0,0 monster Nightmare 1061,35,0,0,0
+gef_dun01.gat,0,0,0,0 monster Ogretooth 1204,1,1800000,1800000,1
+gef_dun01.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
+gef_dun01.gat,0,0,0,0 monster Ghoul 1036,40,0,0,0
+gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,100000,0
+gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,300000,100000,0
+gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
+
+// Gef_dun02
+gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Nightmare 1061,50,300000,100000,0
+gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
+
+// Gef_dun03
+
+gef_dun03.gat,0,0,0,0 monster Wraith 1192,8,60000,30000,0
+gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,2,60000,30000,0
+gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,3,60000,30000,0
+
+
+// moc_pryd01
+moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
+moc_pryd01.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+
+// moc_pryd02
+moc_pryd02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Mummy 1041,30,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
+
+// moc_pryd03
+
+moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Mummy 1041,50,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Verit 1032,40,0,0,0
+
+// moc_pryd04
+moc_pryd04.gat,0,0,0,0 monster Mummy 1041,40,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,120000,75000,0
+moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
+moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
+moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+
+// moc_pryd05
+moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
+
+// moc_pryd06
+moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
+moc_pryd06.gat,102,166,1,1 monster Amon Ra 1511,1,3600000,1600000,0
+
+
+//beach_dun
+beach_dun.gat,0,0,0,0 monster Medusa 1148,20,0,0,0
+beach_dun.gat,0,0,0,0 monster Merman 1264,10,10000,5000,0
+beach_dun.gat,0,0,0,0 monster Nereid 1255,15,0,0,0
+beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+beach_dun.gat,0,0,0,0 monster Penomena 1216,5,30000,0,0
+beach_dun.gat,0,0,0,0 monster Tao Gunka 1583,1,7380000,3600000,0
+
+//beach_dun2
+beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
+beach_dun2.gat,0,0,0,0 monster Nereid 1255,5,0,0,0
+beach_dun2.gat,0,0,0,0 monster Stalactic Golem 1278,40,5000,0,0
+beach_dun2.gat,0,0,0,0 monster Tri Joint 1279,20,0,0,0
+beach_dun2.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
+
+//beach_dun3
+beach_dun3.gat,0,0,0,0 monster Nereid 1255,1,200000,100000,0
+//putmob "beach_dun3" 0 0 0 0 1 PEST 60000 0 0
+beach_dun3.gat,0,0,0,0 monster Thara Frog 1034,55,0,0,0
+//putmob "beach_dun3" 0 0 0 0 3 TRI_JOINT 0 0 0
+beach_dun3.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
+beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,0
+
+
+// treasure01
+treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure01.gat,0,0,0,0 monster Whisper 1179,5,0,0,1
+
+treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
+treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
+
+treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
+
+treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
+
+treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,180000,90000,1
+
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
+
+treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
+treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
+treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
+treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,49,161,0,0 monster Hydra 1068,1,310000,100000,1
+treasure01.gat,49,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
+treasure01.gat,50,160,0,0 monster Hydra 1068,1,301000,100000,1
+treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
+treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
+treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
+treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
+treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
+treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
+treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
+
+treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+
+treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+
+treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
+
+treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
+treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,164,71,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,164,70,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,165,70,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,164,59,12,10 monster Whisper 1179,5,300000,100000,1
+treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
+
+treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
+
+treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,158,44,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,43,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,158,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
+treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
+treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,168,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,168,44,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,168,43,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
+treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,169,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,41,0,0 monster Hydra 1068,1,313000,100000,1
+treasure01.gat,169,40,0,0 monster Hydra 1068,1,300000,100000,1
+
+// treasure02
+treasure02.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
+treasure02.gat,0,0,0,0 monster Whisper 1179,8,0,0,0
+treasure02.gat,0,0,0,0 monster Wanderer 1208,1,0,0,1
+treasure02.gat,0,0,0,0 monster Penomena 1216,2,0,0,1
+
+treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,20,0,0,1
+treasure02.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
+
+treasure02.gat,95,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,96,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,107,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,108,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,50,10,10 monster Penomena 1216,5,300000,100000,1
+
+treasure02.gat,102,68,13,13 monster Whisper 1179,2,300000,100000,1
+
+treasure02.gat,102,80,5,5 monster Whisper 1179,1,300000,100000,1
+treasure02.gat,102,88,5,5 monster Whisper 1179,1,300000,100000,1
+treasure02.gat,100,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,100,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,100,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
+
+treasure02.gat,101,150,15,10 monster Whisper 1179,4,200000,100000,1
+
+treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
+
+treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
+
+treasure02.gat,101,151,10,10 monster Penomena 1216,4,100000,100000,1
+treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
+treasure02.gat,101,135,2,2 monster Penomena 1216,1,60000,200000,1
+
+treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure02.gat,38,74,9,9 monster Penomena 1216,5,300000,100000,1
+
+treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+
+treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,300000,100000,1
+treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+
+treasure02.gat,157,143,1,1 monster Whisper 1179,1,100000,100000,1
+treasure02.gat,151,138,1,1 monster Whisper 1179,1,100000,100000,1
+treasure02.gat,45,144,1,1 monster Whisper 1179,1,200000,100000,1
+treasure02.gat,52,139,1,1 monster Whisper 1179,1,200000,100000,1
+
+treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
+
+
+
+// prt_maze01
+prt_maze01.gat,179,20,21,21 monster Poring 1002,5,120000,40000,1
+prt_maze01.gat,139,20,21,21 monster Lunatic 1063,5,120000,40000,1
+prt_maze01.gat,99,20,21,21 monster Fabre 1007,5,120000,40000,1
+prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
+prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
+prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
+prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
+prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
+prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
+prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
+prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
+prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
+prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
+prt_maze01.gat,99,100,21,21 monster Chonchon 1011,5,120000,40000,1
+prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
+prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,3,120000,40000,1
+prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
+prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
+prt_maze01.gat,99,140,21,21 monster Side Winder 1037,3,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
+prt_maze01.gat,19,140,21,21 monster Steel Chonchon 1042,5,120000,40000,1
+prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
+prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
+prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
+prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage 1166,3,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
+prt_maze01.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
+prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
+
+// prt_maze02
+prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
+prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
+prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,900000,40000,0
+prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,0
+
+// prt_maze03
+prt_meze03.gat,0,0,0,0 monster Poporing 1031,45,0,0,0
+prt_maze03.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
+prt_maze03.gat,0,0,0,0 monster Hunter Fly 1035,30,0,0,0
+prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,6800000,3400000,1
+prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
+
+prt_maze03.gat,150,50,70,70 monster Side Winder 1037,20,300000,1500000,0
+prt_maze03.gat,150,50,70,70 monster Vocal 1088,1,1920000,1500000,1
+
+prt_maze03.gat,50,150,70,70 monster Stem Worm 1215,20,300000,150000,0
+prt_maze03.gat,50,150,70,70 monster Vagabond Wolf 1092,1,1920000,1500000,1
+
+prt_maze03.gat,170,170,70,70 monster Mantis 1139,30,60000,30000,0
+prt_maze03.gat,170,170,70,70 monster Eclipse 1093,1,1920000,1500000,1
+
+prt_maze03.gat,23,23,70,70 monster Mastering 1090,1,1920000,1500000,1
+
+prt_maze03.gat,100,100,80,80 monster Baphomet Jr. 1101,25,0,0,0
+prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
+
+
+// In_sphinx1
+in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Zerom 1178,30,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
+
+// In_sphinx2
+in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Zerom 1178,50,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+
+// In_sphinx3
+in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Pasana 1154,15,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
+
+// In_sphinx4
+in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
+//putmob "in_sphinx4" 0 0 0 0 30 SIDE_WINDER 0 0 0
+in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
+in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
+
+// In_sphinx5
+in_sphinx5.gat,0,0,0,0 monster Pasana 1154,30,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Mimic 1191,7,600000,300000,1
+in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
+
+
+// c_tower1
+c_tower1.gat,0,0,0,0 monster Punk 1199,100,0,0,0
+c_tower1.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
+c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower1.gat,0,0,0,0 monster Bathory 1102,1,0,0,0
+
+// c_tower2
+c_tower2.gat,0,0,0,0 monster Punk 1199,45,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock 1269,40,0,0,0
+c_tower2.gat,0,0,0,0 monster Rideword 1195,3,0,0,0
+c_tower2.gat,128,100,10,10 monster Rideword 1195,1,60000,30000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,120000,60000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,300000,120000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,120000,60000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,300000,120000,0
+
+c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+
+c_tower2.gat,143,98,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,128,100,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,144,208,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,137,201,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+
+// c_tower3
+c_tower3.gat,0,0,0,0 monster Alarm 1193,80,0,0,0
+c_tower3.gat,0,0,0,0 monster Rideword 1195,5,0,0,0
+c_tower3.gat,153,220,10,10 monster Rideword 1195,1,126000,100000,0
+c_tower3.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+
+
+c_tower3.gat,252,169,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,253,253,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,252,145,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,124,8,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,51,8,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,8,56,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,8,97,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,15,205,0,0 monster Rideword 1195,1,600000,300000,0
+c_tower3.gat,144,249,0,0 monster Rideword 1195,1,600000,300000,0
+
+// c_tower4
+c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,2,1800000,0,0
+c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,1,3600000,0,0
+c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
+
+c_tower4.gat,108,198,100,10 monster Alarm 1193,7,0,0,0
+c_tower4.gat,108,178,100,10 monster Alarm 1193,7,0,0,0
+c_tower4.gat,108,158,100,10 monster Alarm 1193,7,0,0,0
+c_tower4.gat,108,138,100,10 monster Alarm 1193,7,0,0,0
+c_tower4.gat,108,118,100,10 monster Alarm 1193,7,0,0,0
+c_tower4.gat,108,98,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,78,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,58,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,38,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,18,100,10 monster Clock 1269,7,0,0,0
+
+c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,0,0,0
+
+c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
+c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
+c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
+c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
+c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
+c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
+c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
+c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
+c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
+c_tower4.gat,86,180,0,0 monster Rideword 1195,1,380000,150000,1
+c_tower4.gat,80,179,0,0 monster Rideword 1195,1,360000,150000,1
+c_tower4.gat,80,180,0,0 monster Rideword 1195,1,350000,150000,1
+c_tower4.gat,80,181,0,0 monster Rideword 1195,1,290000,150000,1
+c_tower4.gat,80,182,0,0 monster Rideword 1195,1,300000,150000,1
+c_tower4.gat,80,183,0,0 monster Rideword 1195,1,340000,150000,1
+
+c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,257,109,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+c_tower4.gat,0,0,0,0 monster Elder 1377,1,1800000,600000,0
+
+c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
+
+// alde_dun01
+alde_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
+alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
+
+// alde_dun02
+
+alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
+alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+alde_dun02.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
+
+// alde_dun03
+
+alde_dun03.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
+alde_dun03.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+alde_dun03.gat,77,28,5,5 monster Cramp 1209,3,40000,20000,0
+
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,50,300000,150000,0
+alde_dun03.gat,184,61,30,30 monster Cramp 1209,10,300000,150000,0
+alde_dun03.gat,184,61,30,30 monster Drainliar 1111,10,300000,150000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,5,300000,150000,0
+alde_dun03.gat,163,56,10,10 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,168,42,6,6 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,147,30,8,8 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,0
+alde_dun03.gat,126,53,20,20 monster Cramp 1209,5,300000,150000,0
+alde_dun03.gat,126,53,20,20 monster Drainliar 1111,5,300000,150000,0
+alde_dun03.gat,102,40,10,10 monster Penomena 1216,4,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
+alde_dun03.gat,130,220,40,40 monster Cramp 1209,10,300000,150000,0
+alde_dun03.gat,130,220,40,40 monster Drainliar 1111,10,300000,150000,0
+alde_dun03.gat,155,201,25,25 monster Penomena 1216,7,600000,300000,0
+alde_dun03.gat,160,181,8,8 monster Penomena 1216,2,600000,300000,0
+
+alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Penomena 1216,5,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Cramp 1209,3,300000,150000,0
+alde_dun03.gat,142,157,8,8 monster Penomena 1216,5,600000,300000,0
+
+alde_dun03.gat,135,140,8,8 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Drainliar 1111,10,300000,150000,0
+
+// alde_dun04
+alde_dun04.gat,0,0,0,0 monster Bathory 1102,50,0,0,0
+alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
+alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Ogretooth 1204,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+
+
+// tur_dun01
+tur_dun01.gat,0,0,0,0 monster Dragon Tail 1321,25,0,0,0
+tur_dun01.gat,0,0,0,0 monster Spring Rabbit 1322,25,0,0,0
+tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
+tur_dun01.gat,0,0,0,0 monster Permeter 1314,10,0,0,0
+tur_dun01.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+// tur_dun02
+tur_dun02.gat,0,0,0,0 monster Permeter 1314,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Solider 1316,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
+tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+// tur_dun03
+tur_dun03.gat,0,0,0,0 monster Permeter 1314,15,0,0,0
+tur_dun03.gat,0,0,0,0 monster Freezer 1319,40,0,0,0
+tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,0,0,0
+tur_dun03.gat,0,0,0,0 monster Heater 1318,10,50000,0,0
+
+// tur_dun04
+
+tur_dun04.gat,99,92,10,10 monster Wanderer 1208,1,60000,30000,0
+tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,720000,0
+tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
+tur_dun04.gat,100,93,20,20 monster Assaulter 1315,10,120000,60000,0
+tur_dun04.gat,100,93,20,20 monster Freezer 1319,5,120000,60000,0
+
+tur_dun04.gat,171,159,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,171,155,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,171,149,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,28,159,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,28,155,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,28,149,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,174,26,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,174,29,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,174,32,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,26,26,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,26,29,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,26,32,3,3 monster Assaulter 1315,1,320000,170000,0
+
+tur_dun04.gat,0,0,0,0 monster Wanderer 1208,2,0,0,0
+tur_dun04.gat,0,0,0,0 monster Heater 1318,10,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Heater 1318,20,620000,310000,0
+
+tur_dun04.gat,0,0,0,0 monster Assaulter 1315,23,0,0,0
+tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,600000,300000,0
+tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,640000,320000,0
+
+// tur_dun05
+tur_dun05.gat,0,0,0,0 monster Permeter 1314,3,20000,0,0
+tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
+tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
+
+
+
+
+gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
+gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
+gl_cas01.gat,0,0,0,0 monster Whisper 1179,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_cas01.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
+gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
+
+
+
+gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
+gl_cas02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
+gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
+
+gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
+gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
+gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
+
+gl_cas02.gat,0,0,0,0 monster Chimera 1283,1,3600000,1800000,1
+gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
+gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,120000,60000,1
+
+gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
+gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,360000,180000,1
+
+gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,180000,180000,1
+gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,180000,180000,1
+gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,180000,180000,1
+gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,180000,180000,1
+gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,180000,180000,1
+
+gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+
+gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
+gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,360000,180000,1
+
+gl_cas02.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
+gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+
+gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
+gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,360000,180000,0
+gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,360000,180000,0
+
+
+gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
+gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
+gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
+gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
+
+gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
+gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
+gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
+gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
+
+gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
+gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+
+gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
+gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
+
+gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
+gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
+
+// gl_prison
+
+gl_prison.gat,0,0,0,0 monster Injustice 1257,20,0,0,0
+gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,50,0,0,0
+gl_prison.gat,0,0,0,0 monster Rybio 1201,15,0,0,0
+
+// gl_prison1
+
+gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,40,0,0,0
+gl_prison1.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
+gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
+gl_prison1.gat,0,0,0,0 monster Zealotus 1200,1,3600000,1800000,1
+gl_prison1.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
+
+// Glastheim
+glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,2,600000,300000,1
+glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
+
+// gl_church
+
+gl_church.gat,0,0,0,0 monster Wraith 1192,10,0,0,0
+gl_church.gat,0,0,0,0 monster Evil Druid 1117,35,0,0,0
+gl_church.gat,0,0,0,0 monster Ghoul 1036,60,0,0,0
+gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
+gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+gl_church.gat,155,92,10,10 monster Mimic 1191,1,30000,15000,0
+gl_church.gat,155,75,10,10 monster Mimic 1191,2,60000,30000,0
+gl_church.gat,155,54,10,10 monster Mimic 1191,1,30000,15000,0
+
+// gl_chyard
+gl_chyard.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
+gl_chyard.gat,0,0,0,0 monster Zombie 1015,15,0,0,0
+gl_chyard.gat,0,0,0,0 monster Wraith 1192,25,0,0,0
+gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
+gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,5,0,0,0
+gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+gl_chyard.gat,0,0,0,0 monster Skeleton Prisoner 1196,25,0,0,0
+gl_chyard.gat,0,0,0,0 monster Zombie Prisoner 1197,25,0,0,0
+gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
+
+// gl_sew01
+
+gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
+gl_sew01.gat,0,0,0,0 monster Arclouze 1194,10,0,0,0
+//putmob "gl_sew01" 0 0 0 0 50 DRAINLIAR 0 0 0
+gl_sew01.gat,0,0,0,0 monster Whisper 1179,50,0,0,0
+
+// gl_sew02
+
+gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
+gl_sew02.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
+gl_sew02.gat,0,0,0,0 monster Anolian 1206,40,0,0,0
+
+// gl_sew03
+
+gl_sew03.gat,0,0,0,0 monster Sting 1207,75,0,0,0
+gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,25,0,0,0
+
+gl_sew03.gat,147,7,5,1 monster Sting 1207,1,1380000,300000,1
+gl_sew03.gat,140,7,5,1 monster Sting 1207,1,1080000,300000,1
+gl_sew03.gat,158,7,5,1 monster Sting 1207,1,1680000,300000,1
+
+// gl_sew04
+
+gl_sew04.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
+gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
+gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+
+// gl_step
+
+gl_step.gat,0,0,0,0 monster Mimic 1191,20,60000,30000,0
+gl_step.gat,0,0,0,0 monster Raydric Archer 1276,30,0,0,0
+gl_step.gat,0,0,0,0 monster Wraith 1192,30,0,0,0
+gl_step.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
+
+// gl_knt01
+
+gl_knt01.gat,0,0,0,0 monster Raydric 1163,65,0,0,0
+gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
+gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,20,0,0,0
+gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+
+gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
+gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,120000,60000,1
+
+gl_knt01.gat,33,120,30,30 monster Rideword 1195,10,120000,60000,1
+gl_knt01.gat,26,223,20,20 monster Rideword 1195,10,120000,60000,1
+gl_knt01.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+
+gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+
+gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+
+// gl_knt02
+
+gl_knt02.gat,0,0,0,0 monster Raydric 1163,55,0,0,0
+gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
+gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,20,0,0,0
+gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
+gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,0
+gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
+gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
+
+gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+
+gl_knt02.gat,0,0,0,0 monster Joker 1131,20,0,0,0
+
+// gl_dun01
+
+gl_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
+gl_dun01.gat,0,0,0,0 monster Sting 1207,50,0,0,0
+
+
+
+gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
+gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
+
+
+
+// gld_dun01
+gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Am Mut 1301,20,0,0,0
+gld_dun01.gat,0,0,0,0 monster Cat o' Nine Tails 1307,3,1200000,0,0
+gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,7200000,1
+gld_dun01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,14400000,7200000,1
+
+// gld_dun02
+gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
+gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,10,240000,120000,0
+gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,5,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,5,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,10,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,7200000,1
+
+// gld_dun03
+gld_dun03.gat,0,0,0,0 monster Maya Purple 1289,3,1200000,0,0
+gld_dun03.gat,0,0,0,0 monster Caterpillar 1300,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Gullinbursti 1311,10,0,0,0
+gld_dun03.gat,0,0,0,0 monster Creamy Fear 1293,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Leib Olmai 1306,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Maya 1147,1,28800000,7200000,1
+
+// gld_dun04
+gld_dun04.gat,0,0,0,0 monster Wraith Dead 1291,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Zombie Master 1298,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
+gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,7200000,1
+gld_dun04.gat,0,0,0,0 monster Ghostring 1120,1,14400000,7200000,1
+
+
+
+
+// Gef_fild02 172,8
+gef_fild02.gat,227,316,6,6 monster Green Plant 1080,8,360000,180000,1
+gef_fild02.gat,87,48,6,6 monster Red Mushroom 1085,5,360000,180000,1
+gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,360000,180000,1
+gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
+gef_fild02.gat,220,214,1,1 monster Blue Plant 1079,1,360000,180000,1
+gef_fild02.gat,164,194,1,1 monster Shining Plant 1083,1,1800000,900000,1
+
+// gef_fild01 135
+gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
+
+// gef_fild09 160
+gef_fild09.gat,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,125,53,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,148,74,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,184,66,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,207,54,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,245,62,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,268,45,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,258,24,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,325,36,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,344,51,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,1
+
+// Gef_fild10 100
+gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
+
+// Gef_fild11 147
+gef_fild11.gat,101,277,4,1 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,176,288,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,253,357,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,247,249,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,257,209,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,174,240,1,3 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
+
+// Gef_fild03 185,14
+gef_fild03.gat,45,350,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,66,300,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,80,252,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,118,281,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,135,344,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,210,363,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,215,345,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,359,316,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,350,247,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,304,202,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,285,223,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,282,192,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,316,143,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,337,104,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,348,42,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,326,79,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,280,92,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,216,135,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,169,92,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,45,93,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
+
+// gef_fild05 125,8
+gef_fild05.gat,235,322,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,238,326,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,170,337,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,108,317,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,56,285,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,65,256,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,74,228,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,50,189,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,51,166,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,146,161,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,153,180,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,124,207,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,187,249,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,187,265,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,130,293,0,0 monster Red Plant 1078,1,180000,90000,1
+
+// Gef_fild08 125,8
+gef_fild08.gat,65,341,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,111,319,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,59,91,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,70,80,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,144,140,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,344,78,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,325,311,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,162,247,0,0 monster Blue Plant 1079,1,900000,450000,1
+
+// gef_fild06
+gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
+
+// gef_fild04 165
+gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
+gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
+//putmob "gef_fild04" 55 266 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 50 321 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 111 284 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 189 258 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 207 307 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 327 309 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 199 336 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild04" 130 315 0 0 1 GREEN_PLANT 180000 90000 1
+
+// gef_fild07 165
+//putmob "gef_fild07" 321 170 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild07" 66 184 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild07" 57 61 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild07" 122 221 0 0 3 GREEN_PLANT 360000 180000 1
+gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
+gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
+gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
+
+// gef_fild00 220,35
+gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
+gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
+//putmob "gef_fild00" 97 277 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 96 352 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 168 343 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 235 332 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 319 359 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 331 291 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 270 228 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 336 205 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 282 135 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 227 207 0 0 1 GREEN_PLANT 180000 90000 1
+//putmob "gef_fild00" 199 277 0 0 1 GREEN_PLANT 180000 90000 1
+
+
+moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
+
+
+moc_fild06.gat,193,203,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+
+moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
+
+
+moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+
+moc_fild01.gat,194,51,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+
+moc_fild02.gat,89,315,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,99,261,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,94,195,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,139,222,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,132,307,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,194,294,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,275,241,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,342,267,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,313,149,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,230,62,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,299,61,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,353,103,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,337,35,0,0 monster Green Plant 1080,1,180000,90000,1
+
+
+moc_fild13.gat,280,99,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,264,64,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,305,91,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,264,136,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,282,155,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,265,197,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,284,227,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,304,244,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,266,289,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,281,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,304,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,295,358,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,84,329,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,89,92,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,108,150,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,109,168,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
+
+
+moc_fild03.gat,77,311,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,108,199,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,96,65,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,216,69,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,261,161,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,213,201,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,200,263,5,5 monster Green Plant 1080,2,180000,90000,1
+
+
+moc_fild09.gat,332,341,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,240,313,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,305,62,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,54,325,5,5 monster Yellow Plant 1081,2,180000,90000,1
+
+
+moc_fild10.gat,198,150,40,30 monster Yellow Plant 1081,10,180000,90000,1
+moc_fild10.gat,198,150,40,30 monster Green Plant 1080,5,180000,90000,1
+
+
+moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
+
+
+moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
+
+
+moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+
+moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,180000,90000,1
+moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+
+moc_fild15.gat,40,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,57,39,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,46,250,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,104,347,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,195,373,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,341,365,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,353,230,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,341,164,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,370,85,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,158,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,232,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,294,74,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+
+moc_fild14.gat,124,93,5,5 monster Shining Plant 1083,1,1800000,900000,1
+moc_fild14.gat,85,271,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,165,282,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,149,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+moc_fild14.gat,64,342,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,160,366,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+
+
+// mjolnir_01 155
+mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
+
+// mjolnir_11 165
+mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
+
+// mjolnir_06 150
+mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+// mjolnir_02 175
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
+
+// mjolnir_07 150,5
+mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
+
+// mjolnir_03 165,15
+mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
+
+// mjolnir_04
+mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
+
+// mjolnir_05
+mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+
+// mjolnir_12
+
+// mjolnir_08 190
+mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
+mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
+
+// mjolnir_09 170
+mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+// mjolnir_10
+mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+
+
+
+// Pay_fild01 -205,35
+pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,336,116,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,231,258,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,215,323,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,225,310,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,129,288,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,75,269,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,80,226,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,89,177,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,95,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,57,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,64,113,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,64,190,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,70,246,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+
+// Pay_fild08 -145,10
+pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
+pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
+
+// Pay_fild09 -120,11
+pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,0
+pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
+
+// Pay_fild10 -170,12
+pay_fild10.gat,213,157,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,281,307,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,66,332,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,213,157,10,10 monster Blue Plant 1079,1,360000,180000,1
+pay_fild10.gat,281,307,10,10 monster Blue Plant 1079,1,360000,180000,1
+pay_fild10.gat,66,332,10,10 monster Blue Plant 1079,1,360000,180000,1
+
+// pay_fild07 -138,10
+pay_fild07.gat,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
+
+// Pay_fild02 -165,16
+pay_fild02.gat,105,256,10,10 monster Green Plant 1080,4,360000,180000,1
+pay_fild02.gat,105,256,10,10 monster Red Mushroom 1085,4,360000,180000,1
+
+// Pay_fild03 -155,29
+pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
+pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
+
+// Pay_fild06 -225,15
+pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
+pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
+pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
+
+// Pay_fild05 -190,14
+pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
+pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
+
+// Pay_fild11 -180,36
+pay_fild11.gat,241,162,5,5 monster Red Mushroom 1085,3,360000,180000,1
+pay_fild11.gat,66,293,5,5 monster Red Mushroom 1085,3,360000,180000,1
+
+// pay_fild04 -180
+pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
+pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
+
+
+
+// prt_fild08 175,25
+prt_fild04.gat,350,114,10,10 monster Green Plant 1080,5,900000,450000,1
+
+// prt_fild05 175,25
+prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
+prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
+
+// prt_fild06 170,10
+prt_fild06.gat,222,30,40,10 monster Green Plant 1080,15,900000,450000,1
+
+// prt_fild01 185,25
+prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
+prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
+
+// prt_fild02 175,10
+prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
+prt_fild02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
+
+// prt_fild03 185,5
+prt_fild03.gat,296,58,15,15 monster Green Plant 1080,5,180000,90000,1
+prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
+
+// prt_fild04 145,5
+prt_fild03.gat,307,75,5,5 monster Green Plant 1080,5,360000,180000,1
+prt_fild03.gat,147,319,5,5 monster Green Plant 1080,5,360000,180000,1
+prt_fild03.gat,148,107,5,5 monster Green Plant 1080,5,360000,180000,1
+
+// prt_fild00 125,20
+prt_fild00.gat,227,212,0,0 monster Shining Plant 1083,1,1800000,900000,1
+prt_fild00.gat,285,138,10,10 monster Green Plant 1080,5,360000,180000,1
+
+// prt_fild09 210
+prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
+
+// prt_fild07 207,5
+prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
+
+// prt_fild10 150
+prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
+prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
+
+// prt_fild11 240,10
+prt_fild11.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
+
+//------------------------------------
+//--------
+//---------------------------------------
+
+// gef_dun
+gef_dun00.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
+gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
+gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,180000,90000,1
+gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,180000,90000,1
+gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
+
+// Glastheim
+glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
+glast_01.gat,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
+glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
+
+// Orcsdun
+orcsdun01.gat,167,133,5,5 monster Black Mushroom 1084,5,900000,450000,1
+orcsdun01.gat,67,34,5,5 monster Black Mushroom 1084,5,900000,450000,1
+orcsdun01.gat,83,50,5,5 monster White Plant 1082,2,180000,90000,1
+orcsdun01.gat,58,67,10,10 monster White Plant 1082,3,180000,90000,1
+orcsdun02.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+orcsdun02.gat,105,37,10,10 monster White Plant 1082,2,180000,90000,1
+orcsdun02.gat,37,44,10,10 monster White Plant 1082,3,180000,90000,1
+
+// Iz_dun
+iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
+iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
+
+// pay_dun
+pay_dun00.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
+pay_dun01.gat,235,54,10,10 monster Black Mushroom 1084,7,900000,450000,1
+pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
+pay_dun02.gat,110,216,20,10 monster White Plant 1082,3,180000,90000,1
+pay_dun02.gat,132,84,10,10 monster White Plant 1082,3,180000,90000,1
+pay_dun02.gat,197,113,10,10 monster Red Plant 1078,4,180000,90000,1
+pay_dun02.gat,55,254,10,10 monster Red Plant 1078,4,180000,90000,1
+pay_dun03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+pay_dun03.gat,246,56,20,20 monster White Plant 1082,3,180000,90000,1
+pay_dun03.gat,52,262,10,4 monster White Plant 1082,2,180000,90000,1
+pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,1,1800000,900000,1
+pay_dun04.gat,28,110,5,5 monster Shining Plant 1083,1,1800000,900000,1
+pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+pay_dun04.gat,107,206,5,5 monster White Plant 1082,2,180000,90000,1
+pay_dun04.gat,28,110,10,10 monster White Plant 1082,2,180000,90000,1
+pay_dun04.gat,190,207,5,5 monster White Plant 1082,2,180000,90000,1
+
+// prt_maze
+prt_maze01.gat,101,138,5,5 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze01.gat,101,138,5,5 monster White Plant 1082,1,1800000,900000,1
+prt_maze01.gat,99,181,5,5 monster White Plant 1082,2,1800000,900000,1
+prt_maze01.gat,60,140,10,15 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,61,101,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze01.gat,141,100,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze01.gat,141,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze01.gat,100,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,100,100,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze01.gat,176,132,5,5 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze01.gat,181,149,3,3 monster Black Mushroom 1084,2,180000,90000,1
+prt_maze01.gat,178,60,10,10 monster Red Mushroom 1085,3,180000,90000,1
+prt_maze01.gat,168,60,3,3 monster Red Mushroom 1085,2,180000,90000,1
+prt_maze03.gat,61,98,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,61,98,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,61,98,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze03.gat,57,56,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,15,15,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,137,140,3,3 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,17,58,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,17,58,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,99,141,10,10 monster Blue Plant 1079,2,1800000,900000,1
+prt_maze03.gat,99,21,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze03.gat,99,21,10,10 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze03.gat,54,15,10,10 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze03.gat,171,180,3,3 monster Red Mushroom 1085,2,180000,90000,1
+prt_maze03.gat,174,187,3,3 monster Red Mushroom 1085,3,180000,90000,1
+
+//
+
+// cmd_fild01
+cmd_fild01.gat,313,213,10,10 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild01.gat,313,213,10,10 monster Blue Plant 1079,1,1800000,900000,1
+cmd_fild01.gat,171,339,10,10 monster Blue Plant 1079,2,1800000,900000,1
+cmd_fild01.gat,72,78,10,10 monster Blue Plant 1079,2,1800000,900000,1
+cmd_fild01.gat,194,176,20,20 monster Blue Plant 1079,1,1800000,900000,1
+cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+
+// cmd_fild03
+cmd_fild03.gat,356,232,3,3 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild03.gat,262,289,3,3 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild03.gat,145,191,3,3 monster Shining Plant 1083,1,1800000,900000,1
+
+// cmd_fild05
+cmd_fild05.gat,63,158,10,10 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild05.gat,318,277,10,10 monster Yellow Plant 1081,3,1800000,900000,1
+cmd_fild05.gat,282,49,20,20 monster Yellow Plant 1081,3,1800000,900000,1
+cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+
+// cmd_fild06
+cmd_fild06.gat,293,235,5,5 monster Yellow Plant 1081,2,1800000,900000,1
+cmd_fild06.gat,84,375,10,10 monster Yellow Plant 1081,3,1800000,900000,1
+
+// cmd_fild08
+cmd_fild08.gat,60,143,10,10 monster Yellow Plant 1081,4,1800000,900000,1
+cmd_fild08.gat,130,201,10,10 monster Yellow Plant 1081,4,1800000,900000,1
+
+//
+
+// yuno_fild01
+yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
+yuno_fild01.gat,70,370,10,10 monster Blue Plant 1079,2,1800000,900000,1
+yuno_fild01.gat,70,370,10,10 monster Shining Plant 1083,1,1800000,900000,1
+yuno_fild01.gat,66,267,10,10 monster Yellow Plant 1081,2,1800000,900000,1
+yuno_fild01.gat,238,326,40,40 monster Yellow Plant 1081,6,1800000,900000,1
+yuno_fild01.gat,238,326,40,40 monster Shining Plant 1083,2,1800000,900000,1
+yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
+
+yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,20,1800000,900000,1
+
+// yuno_fild02
+yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,20,1800000,900000,1
+yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,1800000,900000,1
+yuno_fild02.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+
+// yuno_fild03
+yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,1800000,900000,1
+yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
+yuno_fild03.gat,0,0,0,0 monster Green Plant 1080,15,1800000,900000,1
+yuno_fild03.gat,297,230,10,10 monster Blue Plant 1079,2,1800000,900000,1
+yuno_fild03.gat,136,328,1,1 monster Blue Plant 1079,1,1800000,900000,1
+yuno_fild03.gat,137,330,1,1 monster Blue Plant 1079,1,1800000,900000,1
+yuno_fild03.gat,222,262,10,10 monster Shining Plant 1083,1,1800000,900000,1
+yuno_fild03.gat,297,230,10,10 monster Shining Plant 1083,1,1800000,900000,1
+
+// yuno_fild04
+yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
+yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
+yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+
+//um_fild01
+um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,5,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,180000,90000,1
+
+//um_fil02
+um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+
+//um_fild03
+um_fild03.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
+um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+um_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,180000,90000,1
+
+//um_fild04
+um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,180000,90000,1
+
+//um_dun01
+um_dun01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+um_dun01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+
+//um_dun02
+um_dun02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+um_dun02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_dun02.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
+
diff --git a/npc/eamobs/jro/other.txt b/npc/eamobs/jro/other.txt
index c50248668..1551eb5c6 100644
--- a/npc/eamobs/jro/other.txt
+++ b/npc/eamobs/jro/other.txt
@@ -1,78 +1,78 @@
-//===== eAthena Script =======================================
-//= Missing Maps spawn file
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Spawn file with maps missing in jRO X.3
-//============================================================
-
-//==================================================
-// hu_fild02 - Hugel Field
-//==================================================
-hu_fild02.gat,0,0,0,0 monster Rafflesia 1162,35,0,0,0
-hu_fild02.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-hu_fild02.gat,0,0,0,0 monster Metaling 1613,21,0,0,0
-hu_fild02.gat,0,0,0,0 monster Savage Babe 1167,21,0,0,0
-hu_fild02.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Demon Fungus 1378,5,0,0,0
-hu_fild02.gat,0,0,0,0 monster Novus 1715,2,0,0,0
-hu_fild02.gat,0,0,0,0 monster Novus 1718,2,0,0,0
-
-//==================================================
-// hu_fild03 - Hugel Field
-//==================================================
-hu_fild03.gat,0,0,0,0 monster Metaling 1613,80,0,0,0
-hu_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-hu_fild03.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild03.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-hu_fild03.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
-hu_fild03.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
-
-//==================================================
-// hu_fild06 - Hugel Field
-//==================================================
-hu_fild06.gat,0,0,0,0 monster Holden 1628,50,0,0,0
-hu_fild06.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
-hu_fild06.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Female Thief Bug 1053,3,0,0,0
-hu_fild06.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-hu_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// yuno_fild10 - Yuno Field
-//==================================================
-yuno_fild10.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-
-//==================================================
-// ein_fild01 - Einbroch Field
-//==================================================
-ein_fild01.gat,0,0,0,0 monster Punk 1199,50,0,0,0
-ein_fild01.gat,0,0,0,0 monster Demon Fungus 1378,50,0,0,0
-
-//==================================================
-// ein_fild02 - Einbroch Field
-//==================================================
-ein_fild02.gat,0,0,0,0 monster Driller 1380,40,0,0,0
-ein_fild02.gat,0,0,0,0 monster Demon Fungus 1378,25,0,0,0
-ein_fild02.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
-
-//==================================================
-// ein_fild05 - Einbroch Field
-//==================================================
-ein_fild05.gat,0,0,0,0 monster Mineral 1614,35,0,0,0
-ein_fild05.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-ein_fild05.gat,0,0,0,0 monster Obsidian 1615,20,0,0,0
-ein_fild05.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0
-ein_fild05.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+//===== eAthena Script =======================================
+//= Missing Maps spawn file
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Spawn file with maps missing in jRO X.3
+//============================================================
+
+//==================================================
+// hu_fild02 - Hugel Field
+//==================================================
+hu_fild02.gat,0,0,0,0 monster Rafflesia 1162,35,0,0,0
+hu_fild02.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+hu_fild02.gat,0,0,0,0 monster Metaling 1613,21,0,0,0
+hu_fild02.gat,0,0,0,0 monster Savage Babe 1167,21,0,0,0
+hu_fild02.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Demon Fungus 1378,5,0,0,0
+hu_fild02.gat,0,0,0,0 monster Novus 1715,2,0,0,0
+hu_fild02.gat,0,0,0,0 monster Novus 1718,2,0,0,0
+
+//==================================================
+// hu_fild03 - Hugel Field
+//==================================================
+hu_fild03.gat,0,0,0,0 monster Metaling 1613,80,0,0,0
+hu_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+hu_fild03.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild03.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+hu_fild03.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
+hu_fild03.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
+
+//==================================================
+// hu_fild06 - Hugel Field
+//==================================================
+hu_fild06.gat,0,0,0,0 monster Holden 1628,50,0,0,0
+hu_fild06.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
+hu_fild06.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Female Thief Bug 1053,3,0,0,0
+hu_fild06.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+hu_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// yuno_fild10 - Yuno Field
+//==================================================
+yuno_fild10.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+
+//==================================================
+// ein_fild01 - Einbroch Field
+//==================================================
+ein_fild01.gat,0,0,0,0 monster Punk 1199,50,0,0,0
+ein_fild01.gat,0,0,0,0 monster Demon Fungus 1378,50,0,0,0
+
+//==================================================
+// ein_fild02 - Einbroch Field
+//==================================================
+ein_fild02.gat,0,0,0,0 monster Driller 1380,40,0,0,0
+ein_fild02.gat,0,0,0,0 monster Demon Fungus 1378,25,0,0,0
+ein_fild02.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
+
+//==================================================
+// ein_fild05 - Einbroch Field
+//==================================================
+ein_fild05.gat,0,0,0,0 monster Mineral 1614,35,0,0,0
+ein_fild05.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+ein_fild05.gat,0,0,0,0 monster Obsidian 1615,20,0,0,0
+ein_fild05.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0
+ein_fild05.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
diff --git a/npc/events/alchemist.txt b/npc/events/alchemist.txt
index cc64e5654..42250d5dc 100644
--- a/npc/events/alchemist.txt
+++ b/npc/events/alchemist.txt
@@ -1,166 +1,166 @@
-//===========================================================
-//Alchemist Event script 2004/02/14 by kalen
-//===========================================================
-
-ama_in02.gat,61,27,6 script ˜B‹àpŽt 749,{
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "ƒLƒLƒLƒLƒLƒPƒPƒPƒPƒPI";
- mes "‹Á‚­‚ׂ«Œ‹‰Ê‚ªo‚½I";
- mes "‚±‚ñ‚ÈŽÀŒ±Œ‹‰Ê‚ªo‚½‚Ì‚Í";
- mes "¶‚Ü‚ê‚ĉ‚ß‚Ä‚¾I";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚±‚ñ‚Ȃɉ“‚­‚Ü‚Å—ˆ‚ÄŽ„‚Ì”\—Í‚ð";
- mes "”­Šö‚Å‚«‚é‚Æ‚ÍŽv‚¢‚à‚æ‚ç‚È‚©‚Á‚½‚¼I";
- mes "éŽå‚ÉŽdŽ–‚𗊂܂ꂽ‚ªcc";
- mes "“z‚͈ӊO‚É‚¨‚à‚µ‚ë‚¢“z‚¾‚Á‚½‚¼B";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "ƒNƒNƒNcc‚µ‚©‚µ‹C‚ð‚‚¯‚Ë‚Îcc";
- mes "‚±‚¢‚‚̒²‡•û–@‚ð‚©‚¬‚‚¯‚ç‚ꂽ‚ç";
- mes "ˆù‚ñ‚¾“z‚ª‰Î‚𕬂¢‚Ä“{‚écc";
- mes "ƒPƒPƒPƒPcc";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚ñA‚Æ‚±‚ë‚ÅŽ„‚ɉ½‚©—p‚©H";
- mes "ŠÏŒõ‚Å—ˆ‚½‚ñ‚È‚ç©‚É‘º‚Å‚à";
- mes "Œ©‚Ä‚¢‚­‚ñ‚¾‚ÈB";
- mes "‚³‚à‚È‚­‚΃AƒVƒbƒhƒ{ƒgƒ‹";
- mes "‚Å‚à–¡‡‚킹‚Ä‚â‚邼IƒLƒLcc";
- next;
- menu "Ž¸—炵‚Ü‚µ‚½",L1,"‚¨Žè“`‚¢‚·‚鎖‚Å‚à‚ ‚è‚Ü‚·‚©H",L2;
-L1:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚悵‚悵cc";
- mes "‰½‚©•·‚¢‚Ä‚à‚·‚®‚É–Y‚ê‚ëB";
- mes "‚»‚ꂪ’·‚­¶‚«‚éƒRƒc‚³cc";
- mes "ƒLƒLƒLƒLƒLcc";
- close;
-L2:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "Žè“`‚¤‚ÆH";
- mes "‚»‚¤‚©cc";
- mes "‚à‚¤Ž„‚ÌŠè‚Á‚½‚à‚Ì‚Í‚à‚¤­‚µ‚Å";
- mes "Š®¬‚·‚éBƒLƒLƒLƒLƒLcc";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "Ž„‚ªŽÀŒ±‚·‚é‚Ì‚É•K—v‚È‘®«Î‚ð";
- mes "‚¢‚­‚‚©—pˆÓ‚µ‚Ä‚­‚ê‚é‚Æ‚ ‚肪‚½‚¢B";
- mes "¡Ž‚Á‚Ä‚¢‚镨‚ª‚ ‚é‚©H";
- next;
- menu "‚¢‚¢‚¦",L2_1,"‚¢‚­‚‚©‚ ‚è‚Ü‚·",L2_2;
-L2_1:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚Ȃ猾‚¨‚¤B";
- mes "‚Ç‚ê‚Å‚à‚¢‚¢‚©‚瓯‚¶Ží—Þ‚Ì";
- mes "‘®«Î‚ð8ŒÂ‚¸‚ÂW‚ß‚Ä‚Ù‚µ‚¢B";
- mes "‚»‚¤‚·‚ê‚ÎAŽ„‚ª—Ç‚¢•¨‚É";
- mes "•Ï‚¦‚Ä‚â‚邼B";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚à‚µŠÔˆá‚Á‚½•¨‚ðŽ‚Á‚Ä‚«‚½‚çA";
- mes "‘«Œ³‚Ƀtƒ@ƒCƒA[ƒ{ƒgƒ‹‚ð";
- mes "“Š‚°‚邼I";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚Å‚ÍAŽè“`‚¤‚ÆŒ¾‚Á‚½ˆÈã";
- mes "–ñ‘©‚ÍŽç‚é‚ñ‚¾‚¼IƒLƒLƒLƒLcc";
- close;
-L2_2:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚悵A‰½‚ðŽ‚Á‚Ä‚¢‚éH";
- next;
- menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_2,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_3,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_4;
- L2_2_1:
- if (countitem(995) < 8) goto Llowitem;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
- mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
- mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
- next;
- menu "ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_1_1,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_1_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_1_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
-L2_2_1_1:
- delitem 995,8;getitem 997,1;goto Lfinal;
-L2_2_1_2:
- delitem 995,8;getitem 994,1;goto Lfinal;
-L2_2_1_3:
- delitem 995,8;getitem 996,1;goto Lfinal;
- L2_2_2:
- if (countitem(997) < 8) goto Llowitem;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
- mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
- mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
- next;
- menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_2_1,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_2_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_2_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
-L2_2_2_1:
- delitem 997,8;getitem 995,1;goto Lfinal;
-L2_2_2_2:
- delitem 997,8;getitem 994,1;goto Lfinal;
-L2_2_2_3:
- delitem 997,8;getitem 996,1;goto Lfinal;
- L2_2_3:
- if (countitem(994) < 8) goto Llowitem;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
- mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
- mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
- next;
- menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_3_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_3_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_3_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
-L2_2_3_1:
- delitem 994,8;getitem 995,1;goto Lfinal;
-L2_2_3_2:
- delitem 994,8;getitem 997,1;goto Lfinal;
-L2_2_3_3:
- delitem 994,8;getitem 996,1;goto Lfinal;
- L2_2_4:
- if (countitem(996) < 8) goto Llowitem;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
- mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
- mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
- next;
- menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_4_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_4_2,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_4_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
-L2_2_4_1:
- delitem 996,8;getitem 995,1;goto Lfinal;
-L2_2_4_2:
- delitem 996,8;getitem 997,1;goto Lfinal;
-L2_2_4_3:
- delitem 996,8;getitem 994,1;goto Lfinal;
-Lfinal:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "ƒWƒWƒWccƒKƒŠƒKƒŠƒSƒŠcc";
- mes "‚¤‚ÞA‚Å‚«‚½B";
- mes "‚Ù‚çA‘厖‚ÉŽg‚¤‚悤‚ÉB";
- mes "‚Ü‚½‚ ‚ê‚ÎŽ‚Á‚Ä‚«‚È‚³‚¢B";
- close;
-Llowitem:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "ƒWƒWƒWccƒKƒŠƒKƒŠƒSƒŠcc";
- mes "‚ñcc‘®«Î‚Í‚Ç‚¤‚µ‚½H";
- mes "‚Ç‚±‚©‚Å‚È‚­‚µ‚Ä‚«‚½‚©H";
- next;
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚Ü‚½Ž‚Á‚Ä‚«‚È‚³‚¢I";
- mes "Žè“`‚¤‚ÆŒ¾‚Á‚½ˆÈã";
- mes "–ñ‘©‚ÍŽç‚é‚ñ‚¾‚¼IƒLƒLƒLƒLcc";
- close;
-LEnd:
- mes "[ƒOƒŒƒSƒŠ[]";
- mes "‚­cc‚Ü‚Ÿ‚¢‚¢‚ªcc";
- mes "Ž„‚ª‚±‚±‚É‹‚邱‚Æ‚Í“à‚¾‚¼B";
- mes "–ñ‘©‚¾‚¼I";
- close;
-}
+//===========================================================
+//Alchemist Event script 2004/02/14 by kalen
+//===========================================================
+
+ama_in02.gat,61,27,6 script ˜B‹àpŽt 749,{
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "ƒLƒLƒLƒLƒLƒPƒPƒPƒPƒPI";
+ mes "‹Á‚­‚ׂ«Œ‹‰Ê‚ªo‚½I";
+ mes "‚±‚ñ‚ÈŽÀŒ±Œ‹‰Ê‚ªo‚½‚Ì‚Í";
+ mes "¶‚Ü‚ê‚ĉ‚ß‚Ä‚¾I";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚±‚ñ‚Ȃɉ“‚­‚Ü‚Å—ˆ‚ÄŽ„‚Ì”\—Í‚ð";
+ mes "”­Šö‚Å‚«‚é‚Æ‚ÍŽv‚¢‚à‚æ‚ç‚È‚©‚Á‚½‚¼I";
+ mes "éŽå‚ÉŽdŽ–‚𗊂܂ꂽ‚ªcc";
+ mes "“z‚͈ӊO‚É‚¨‚à‚µ‚ë‚¢“z‚¾‚Á‚½‚¼B";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "ƒNƒNƒNcc‚µ‚©‚µ‹C‚ð‚‚¯‚Ë‚Îcc";
+ mes "‚±‚¢‚‚̒²‡•û–@‚ð‚©‚¬‚‚¯‚ç‚ꂽ‚ç";
+ mes "ˆù‚ñ‚¾“z‚ª‰Î‚𕬂¢‚Ä“{‚écc";
+ mes "ƒPƒPƒPƒPcc";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚ñA‚Æ‚±‚ë‚ÅŽ„‚ɉ½‚©—p‚©H";
+ mes "ŠÏŒõ‚Å—ˆ‚½‚ñ‚È‚ç©‚É‘º‚Å‚à";
+ mes "Œ©‚Ä‚¢‚­‚ñ‚¾‚ÈB";
+ mes "‚³‚à‚È‚­‚΃AƒVƒbƒhƒ{ƒgƒ‹";
+ mes "‚Å‚à–¡‡‚킹‚Ä‚â‚邼IƒLƒLcc";
+ next;
+ menu "Ž¸—炵‚Ü‚µ‚½",L1,"‚¨Žè“`‚¢‚·‚鎖‚Å‚à‚ ‚è‚Ü‚·‚©H",L2;
+L1:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚悵‚悵cc";
+ mes "‰½‚©•·‚¢‚Ä‚à‚·‚®‚É–Y‚ê‚ëB";
+ mes "‚»‚ꂪ’·‚­¶‚«‚éƒRƒc‚³cc";
+ mes "ƒLƒLƒLƒLƒLcc";
+ close;
+L2:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "Žè“`‚¤‚ÆH";
+ mes "‚»‚¤‚©cc";
+ mes "‚à‚¤Ž„‚ÌŠè‚Á‚½‚à‚Ì‚Í‚à‚¤­‚µ‚Å";
+ mes "Š®¬‚·‚éBƒLƒLƒLƒLƒLcc";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "Ž„‚ªŽÀŒ±‚·‚é‚Ì‚É•K—v‚È‘®«Î‚ð";
+ mes "‚¢‚­‚‚©—pˆÓ‚µ‚Ä‚­‚ê‚é‚Æ‚ ‚肪‚½‚¢B";
+ mes "¡Ž‚Á‚Ä‚¢‚镨‚ª‚ ‚é‚©H";
+ next;
+ menu "‚¢‚¢‚¦",L2_1,"‚¢‚­‚‚©‚ ‚è‚Ü‚·",L2_2;
+L2_1:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚Ȃ猾‚¨‚¤B";
+ mes "‚Ç‚ê‚Å‚à‚¢‚¢‚©‚瓯‚¶Ží—Þ‚Ì";
+ mes "‘®«Î‚ð8ŒÂ‚¸‚ÂW‚ß‚Ä‚Ù‚µ‚¢B";
+ mes "‚»‚¤‚·‚ê‚ÎAŽ„‚ª—Ç‚¢•¨‚É";
+ mes "•Ï‚¦‚Ä‚â‚邼B";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚à‚µŠÔˆá‚Á‚½•¨‚ðŽ‚Á‚Ä‚«‚½‚çA";
+ mes "‘«Œ³‚Ƀtƒ@ƒCƒA[ƒ{ƒgƒ‹‚ð";
+ mes "“Š‚°‚邼I";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚Å‚ÍAŽè“`‚¤‚ÆŒ¾‚Á‚½ˆÈã";
+ mes "–ñ‘©‚ÍŽç‚é‚ñ‚¾‚¼IƒLƒLƒLƒLcc";
+ close;
+L2_2:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚悵A‰½‚ðŽ‚Á‚Ä‚¢‚éH";
+ next;
+ menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_2,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_3,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_4;
+ L2_2_1:
+ if (countitem(995) < 8) goto Llowitem;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
+ mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
+ mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
+ next;
+ menu "ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_1_1,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_1_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_1_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
+L2_2_1_1:
+ delitem 995,8;getitem 997,1;goto Lfinal;
+L2_2_1_2:
+ delitem 995,8;getitem 994,1;goto Lfinal;
+L2_2_1_3:
+ delitem 995,8;getitem 996,1;goto Lfinal;
+ L2_2_2:
+ if (countitem(997) < 8) goto Llowitem;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
+ mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
+ mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
+ next;
+ menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_2_1,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_2_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_2_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
+L2_2_2_1:
+ delitem 997,8;getitem 995,1;goto Lfinal;
+L2_2_2_2:
+ delitem 997,8;getitem 994,1;goto Lfinal;
+L2_2_2_3:
+ delitem 997,8;getitem 996,1;goto Lfinal;
+ L2_2_3:
+ if (countitem(994) < 8) goto Llowitem;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
+ mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
+ mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
+ next;
+ menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_3_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_3_2,"ƒ‰ƒtƒEƒBƒ“ƒh",L2_2_3_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
+L2_2_3_1:
+ delitem 994,8;getitem 995,1;goto Lfinal;
+L2_2_3_2:
+ delitem 994,8;getitem 997,1;goto Lfinal;
+L2_2_3_3:
+ delitem 994,8;getitem 996,1;goto Lfinal;
+ L2_2_4:
+ if (countitem(996) < 8) goto Llowitem;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚»‚ê‚ð8ŒÂ‚ð‚à‚炤‘ã‚í‚è‚É";
+ mes "‘¼‚Ì‘®«Î‚ðˆê‚Âì‚Á‚Ä‚â‚낤B";
+ mes "ˆ«‚¢Žæˆø‚¶‚á‚È‚¢‚¾‚낤H";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚Ù‚çA‚Ç‚ê‚ðì‚낤‚©H";
+ next;
+ menu "ƒ~ƒXƒeƒBƒbƒNƒtƒ[ƒYƒ“",L2_2_4_1,"ƒOƒŒƒCƒgƒlƒCƒ`ƒƒ",L2_2_4_2,"ƒtƒŒƒCƒ€ƒn[ƒg",L2_2_4_3,"Žæˆø‚ð‚â‚ß‚é",LEnd;
+L2_2_4_1:
+ delitem 996,8;getitem 995,1;goto Lfinal;
+L2_2_4_2:
+ delitem 996,8;getitem 997,1;goto Lfinal;
+L2_2_4_3:
+ delitem 996,8;getitem 994,1;goto Lfinal;
+Lfinal:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "ƒWƒWƒWccƒKƒŠƒKƒŠƒSƒŠcc";
+ mes "‚¤‚ÞA‚Å‚«‚½B";
+ mes "‚Ù‚çA‘厖‚ÉŽg‚¤‚悤‚ÉB";
+ mes "‚Ü‚½‚ ‚ê‚ÎŽ‚Á‚Ä‚«‚È‚³‚¢B";
+ close;
+Llowitem:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "ƒWƒWƒWccƒKƒŠƒKƒŠƒSƒŠcc";
+ mes "‚ñcc‘®«Î‚Í‚Ç‚¤‚µ‚½H";
+ mes "‚Ç‚±‚©‚Å‚È‚­‚µ‚Ä‚«‚½‚©H";
+ next;
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚Ü‚½Ž‚Á‚Ä‚«‚È‚³‚¢I";
+ mes "Žè“`‚¤‚ÆŒ¾‚Á‚½ˆÈã";
+ mes "–ñ‘©‚ÍŽç‚é‚ñ‚¾‚¼IƒLƒLƒLƒLcc";
+ close;
+LEnd:
+ mes "[ƒOƒŒƒSƒŠ[]";
+ mes "‚­cc‚Ü‚Ÿ‚¢‚¢‚ªcc";
+ mes "Ž„‚ª‚±‚±‚É‹‚邱‚Æ‚Í“à‚¾‚¼B";
+ mes "–ñ‘©‚¾‚¼I";
+ close;
+}
diff --git a/npc/events/custom/2006_dogs_year.txt b/npc/events/custom/2006_dogs_year.txt
index 2f3afefd8..303e7ee52 100644
--- a/npc/events/custom/2006_dogs_year.txt
+++ b/npc/events/custom/2006_dogs_year.txt
@@ -1,95 +1,95 @@
-//===== eAthena Script =======================================
-//= Eastern New Year 2006 The Year Of The Fire Dog
-//===== By: ==================================================
-//= Lupus (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena Version; 5xxx+ (with 'disguise' command)
-//===== Description: =========================================
-//= Custom event: For 28-29 January
-//===== Additional Comments: =================================
-//= 1.0 Tested, fully working.[Lupus]
-//= Add some national info in English if you can.
-//= (Mine was in Russian, and it's damn hard to translate 8)
-//============================================================
-
-
-prontera.gat,149,167,6 script Maria 81,{
- mes "[Maria]";
- //month
- if((gettime(6)==1 && (gettime(5)==28 || gettime(5)==29))==0) {
- mes "Happy New Year Of The Fire Dog! Woof!";
- close;
- }
-
- mes "Happy New Year of The Fire Dog!";
- if(rand(2))mes "By the way, 'Dogs' fit the most to the ones, born in years of Horse, Tiger and Rabbit.";
- next;
- menu "Tell me about Japanese traditions",-,
- "Tell me about Chinese New Year",M_NGCH,
- "Tell me about Korean New Year",M_NGCO,
- "I need a doggy costume!",M_PRIZE,
- "Happy New Year to you.",LEnd;
-
- mes "[Maria]";
- mes "Japan...";
- mes "Put here some notes in English about their HNY.";
- next;
- mes "[Maria]";
- mes "Put here some notes in English about their HNY.";
- close;
-
-M_NGCH:
- mes "[Maria]";
- mes "China...";
- mes "Put here some notes in English about their HNY.";
- next;
- mes "[Maria]";
- mes "Put here some notes in English about their HNY.";
- close;
-
-M_NGCO:
- mes "[Maria]";
- mes "Korea...";
- mes "Put here some notes in English about their HNY.";
- next;
- mes "[Maria]";
- mes "Put here some notes in English about their HNY.";
- close;
-
-M_PRIZE:
- mes "[Maria]";
- if(countitem(12132)>9) {
- mes "You should use all of your old costumes first!";
- close;
- }
- mes "Some buddhistic books tell us legends about humans to dogs reincarnation... Buy ^FF0000this magic doggie costume^000000 for just ^0000FF999 Zeny^000000!";
- mes "And prove old legends yourself!";
- next;
- menu "I'll buy one.",-,"No, thank you.",LEnd;
-
- mes "[Maria]";
- if(Zeny<999) goto NoZ;
- set Zeny,Zeny-999;
- getitem 12132,1;
- mes "Here you go. Its form will show true power of your spirit.";
- emotion 15;
- close;
- NoZ:
- mes "Oh dear, you lack of zeny. I have 7 puppies to feed, you know...";
- emotion 17;
- close;
- LEnd:
- mes "[Maria]";
- mes "Happy New Year of the Fire Me!!! Woof-woof!";
- emotion rand(19,20);
- close;
-
-OnInit:
- //Magic Doggie Costum
- setitemscript 12132,"{ misceffect 215; if(BaseLevel>97){disguise 1022;end;}if(BaseLevel>90){disguise 1296;end;}if(BaseLevel>80){disguise 1106;end;}if(BaseLevel>50){disguise 1013;end;}if(BaseLevel>40){disguise 1135;end;}disguise 1107;}";
- end;
-}
-
-prontera.gat,0,0,0,0 monster Fire Dog 1987,50,3600000,1800000,0
+//===== eAthena Script =======================================
+//= Eastern New Year 2006 The Year Of The Fire Dog
+//===== By: ==================================================
+//= Lupus (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena Version; 5xxx+ (with 'disguise' command)
+//===== Description: =========================================
+//= Custom event: For 28-29 January
+//===== Additional Comments: =================================
+//= 1.0 Tested, fully working.[Lupus]
+//= Add some national info in English if you can.
+//= (Mine was in Russian, and it's damn hard to translate 8)
+//============================================================
+
+
+prontera.gat,149,167,6 script Maria 81,{
+ mes "[Maria]";
+ //month
+ if((gettime(6)==1 && (gettime(5)==28 || gettime(5)==29))==0) {
+ mes "Happy New Year Of The Fire Dog! Woof!";
+ close;
+ }
+
+ mes "Happy New Year of The Fire Dog!";
+ if(rand(2))mes "By the way, 'Dogs' fit the most to the ones, born in years of Horse, Tiger and Rabbit.";
+ next;
+ menu "Tell me about Japanese traditions",-,
+ "Tell me about Chinese New Year",M_NGCH,
+ "Tell me about Korean New Year",M_NGCO,
+ "I need a doggy costume!",M_PRIZE,
+ "Happy New Year to you.",LEnd;
+
+ mes "[Maria]";
+ mes "Japan...";
+ mes "Put here some notes in English about their HNY.";
+ next;
+ mes "[Maria]";
+ mes "Put here some notes in English about their HNY.";
+ close;
+
+M_NGCH:
+ mes "[Maria]";
+ mes "China...";
+ mes "Put here some notes in English about their HNY.";
+ next;
+ mes "[Maria]";
+ mes "Put here some notes in English about their HNY.";
+ close;
+
+M_NGCO:
+ mes "[Maria]";
+ mes "Korea...";
+ mes "Put here some notes in English about their HNY.";
+ next;
+ mes "[Maria]";
+ mes "Put here some notes in English about their HNY.";
+ close;
+
+M_PRIZE:
+ mes "[Maria]";
+ if(countitem(12132)>9) {
+ mes "You should use all of your old costumes first!";
+ close;
+ }
+ mes "Some buddhistic books tell us legends about humans to dogs reincarnation... Buy ^FF0000this magic doggie costume^000000 for just ^0000FF999 Zeny^000000!";
+ mes "And prove old legends yourself!";
+ next;
+ menu "I'll buy one.",-,"No, thank you.",LEnd;
+
+ mes "[Maria]";
+ if(Zeny<999) goto NoZ;
+ set Zeny,Zeny-999;
+ getitem 12132,1;
+ mes "Here you go. Its form will show true power of your spirit.";
+ emotion 15;
+ close;
+ NoZ:
+ mes "Oh dear, you lack of zeny. I have 7 puppies to feed, you know...";
+ emotion 17;
+ close;
+ LEnd:
+ mes "[Maria]";
+ mes "Happy New Year of the Fire Me!!! Woof-woof!";
+ emotion rand(19,20);
+ close;
+
+OnInit:
+ //Magic Doggie Costum
+ setitemscript 12132,"{ misceffect 215; if(BaseLevel>97){disguise 1022;end;}if(BaseLevel>90){disguise 1296;end;}if(BaseLevel>80){disguise 1106;end;}if(BaseLevel>50){disguise 1013;end;}if(BaseLevel>40){disguise 1135;end;}disguise 1107;}";
+ end;
+}
+
+prontera.gat,0,0,0,0 monster Fire Dog 1987,50,3600000,1800000,0
diff --git a/npc/events/custom/draculax.txt b/npc/events/custom/draculax.txt
index ff9fcce44..e0312c8cc 100644
--- a/npc/events/custom/draculax.txt
+++ b/npc/events/custom/draculax.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= Dracula X Script
-//===== By: ==================================================
-//= valaris (1.0)
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena RC4+
-//===== Description: =========================================
-//= Custom Dracula X Event
-//============================================================
-
-
-mag_dun02.gat,72,182,1 script Dracula's Coffin::Dracula_Init -1,{
-
-OnInit:
- set $dracula_event,0;
- end;
-
-OnKilled:
- MapAnnounce "mag_dun02.gat","Dracula's curse has been lifted!",17;
- set $dracula_event,0;
- initnpctimer;
- end;
-
-OnTimer7200000:
- if($dracula_event==0)
- stopnpctimer;
- enablenpc "Dracula_Event";
- end;
-}
-
-mag_dun02.gat,72,182,1 script Dracula's Coffin::Dracula_Event 801,{
-
- if($dracula_event==1)
- close;
-
- set $dracula_event,1;
- MapAnnounce "mag_dun02.gat","Count Dracula : Who has awakened me from my slumber?",17;
- npcskilleffect 21,10,66,175;
- initnpctimer;
- end;
-
-OnTimer500:
- npcskilleffect 21,10,74,187;
- end;
-
-OnTimer1000:
- npcskilleffect 21,10,80,180;
- end;
-
-OnTimer1500:
- npcskilleffect 21,10,79,183;
- end;
-
-OnTimer2000:
- npcskilleffect 21,10,66,175;
- end;
-
-OnTimer2500:
- npcskilleffect 21,10,63,186;
- end;
-
-OnTimer3000:
- npcskilleffect 21,10,75,186;
- end;
-
-OnTimer3500:
- npcskilleffect 21,10,75,173;
- end;
-
-OnTimer4000:
- npcskilleffect 21,10,80,170;
- end;
-
-OnTimer4500:
- npcskilleffect 21,10,60,179;
- end;
-
-OnTimer5000:
- npcskilleffect 21,10,74,187;
- end;
-
-OnTimer6000:
- npcskilleffect 21,10,69,182;
- end;
-
-OnTimer6500:
- npcskilleffect 21,10,80,180;
- end;
-
-OnTimer7000:
- npcskilleffect 21,10,60,179;
- end;
-
-OnTimer7500:
- npcskilleffect 21,10,66,175;
- end;
-
-OnTimer8000:
- npcskilleffect 21,10,80,187;
- end;
-
-OnTimer8500:
- npcskilleffect 21,10,75,186;
- end;
-
-OnTimer9000:
- npcskilleffect 21,10,75,173;
- end;
-
-OnTimer9500:
- npcskilleffect 21,10,80,170;
- end;
-
-OnTimer10000:
- npcskilleffect 21,10,63,186;
- end;
-
-OnTimer10500:
- npcskilleffect 21,10,74,187;
- end;
-
-OnTimer11000:
- npcskilleffect 21,10,72,182;
- monster "mag_dun02.gat",72,182,"Count Dracula",1389,1,"Dracula_Init::OnKilled";
- stopnpctimer;
- disablenpc "Dracula_Event";
- end;
-}
+//===== eAthena Script =======================================
+//= Dracula X Script
+//===== By: ==================================================
+//= valaris (1.0)
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena RC4+
+//===== Description: =========================================
+//= Custom Dracula X Event
+//============================================================
+
+
+mag_dun02.gat,72,182,1 script Dracula's Coffin::Dracula_Init -1,{
+
+OnInit:
+ set $dracula_event,0;
+ end;
+
+OnKilled:
+ MapAnnounce "mag_dun02.gat","Dracula's curse has been lifted!",17;
+ set $dracula_event,0;
+ initnpctimer;
+ end;
+
+OnTimer7200000:
+ if($dracula_event==0)
+ stopnpctimer;
+ enablenpc "Dracula_Event";
+ end;
+}
+
+mag_dun02.gat,72,182,1 script Dracula's Coffin::Dracula_Event 801,{
+
+ if($dracula_event==1)
+ close;
+
+ set $dracula_event,1;
+ MapAnnounce "mag_dun02.gat","Count Dracula : Who has awakened me from my slumber?",17;
+ npcskilleffect 21,10,66,175;
+ initnpctimer;
+ end;
+
+OnTimer500:
+ npcskilleffect 21,10,74,187;
+ end;
+
+OnTimer1000:
+ npcskilleffect 21,10,80,180;
+ end;
+
+OnTimer1500:
+ npcskilleffect 21,10,79,183;
+ end;
+
+OnTimer2000:
+ npcskilleffect 21,10,66,175;
+ end;
+
+OnTimer2500:
+ npcskilleffect 21,10,63,186;
+ end;
+
+OnTimer3000:
+ npcskilleffect 21,10,75,186;
+ end;
+
+OnTimer3500:
+ npcskilleffect 21,10,75,173;
+ end;
+
+OnTimer4000:
+ npcskilleffect 21,10,80,170;
+ end;
+
+OnTimer4500:
+ npcskilleffect 21,10,60,179;
+ end;
+
+OnTimer5000:
+ npcskilleffect 21,10,74,187;
+ end;
+
+OnTimer6000:
+ npcskilleffect 21,10,69,182;
+ end;
+
+OnTimer6500:
+ npcskilleffect 21,10,80,180;
+ end;
+
+OnTimer7000:
+ npcskilleffect 21,10,60,179;
+ end;
+
+OnTimer7500:
+ npcskilleffect 21,10,66,175;
+ end;
+
+OnTimer8000:
+ npcskilleffect 21,10,80,187;
+ end;
+
+OnTimer8500:
+ npcskilleffect 21,10,75,186;
+ end;
+
+OnTimer9000:
+ npcskilleffect 21,10,75,173;
+ end;
+
+OnTimer9500:
+ npcskilleffect 21,10,80,170;
+ end;
+
+OnTimer10000:
+ npcskilleffect 21,10,63,186;
+ end;
+
+OnTimer10500:
+ npcskilleffect 21,10,74,187;
+ end;
+
+OnTimer11000:
+ npcskilleffect 21,10,72,182;
+ monster "mag_dun02.gat",72,182,"Count Dracula",1389,1,"Dracula_Init::OnKilled";
+ stopnpctimer;
+ disablenpc "Dracula_Event";
+ end;
+}
diff --git a/npc/events/custom/event_gefenia.txt b/npc/events/custom/event_gefenia.txt
index da79b4b85..191ce43db 100644
--- a/npc/events/custom/event_gefenia.txt
+++ b/npc/events/custom/event_gefenia.txt
@@ -1,57 +1,57 @@
-//===== eAthena Script ========================================
-//= Gefenia Warper Script
-//===== By: ==================================================
-//= [Muad_Dib] 1.0a
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Temp Gefenia Warper
-//===== Additional Comments: =================================
-//= 07/06/05 : Added 1st Version. [Muad_Dib]
-//= Converted to eAthena format by Dr.Evil
-//============================================================
-
-
-gefenia01.gat,132,169,5 script Explorer#1 740,{
- mes "[Explorer]";
- mes "Do you really want to go back??";
- next;
- menu "Yes.",-,"No.",M_END;
-
- warp "gef_dun03.gat", 138, 117;
- end;
-
-M_END:
- mes "Ok, don't come back until you want to leave this place.";
- close;
-}
-
-gef_dun03.gat,131,118,6 script Explorer#2 740,{
- mes "[Explorer]";
- mes "Hi...";
- next;
- mes "[Explorer]";
- mes "I can send you to the ^FF3300Geffenia City Ruins^000000... You just need the Key!.";
- mes "Do you have the Key? It looks like a crystal.";
- next;
- menu "Yes, I Got the key.",-,"No, I'll go look for it.",M_END;
-
- if (countitem(7025) < 1) goto L_NOKEY; // Item: Lucifer's Lament
- mes "[Explorer]";
- mes "Good, you got the right key! Let's go!";
- next;
- warp "gefenia01.gat", 136, 166;
- end;
-
-M_END:
- mes "[Explorer]";
- mes "Don't come back until you have the key!";
- close;
-
-L_NOKEY:
- mes "[Explorer]";
- mes "Sorry.. you don't have the key...";
- close;
+//===== eAthena Script ========================================
+//= Gefenia Warper Script
+//===== By: ==================================================
+//= [Muad_Dib] 1.0a
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Temp Gefenia Warper
+//===== Additional Comments: =================================
+//= 07/06/05 : Added 1st Version. [Muad_Dib]
+//= Converted to eAthena format by Dr.Evil
+//============================================================
+
+
+gefenia01.gat,132,169,5 script Explorer#1 740,{
+ mes "[Explorer]";
+ mes "Do you really want to go back??";
+ next;
+ menu "Yes.",-,"No.",M_END;
+
+ warp "gef_dun03.gat", 138, 117;
+ end;
+
+M_END:
+ mes "Ok, don't come back until you want to leave this place.";
+ close;
+}
+
+gef_dun03.gat,131,118,6 script Explorer#2 740,{
+ mes "[Explorer]";
+ mes "Hi...";
+ next;
+ mes "[Explorer]";
+ mes "I can send you to the ^FF3300Geffenia City Ruins^000000... You just need the Key!.";
+ mes "Do you have the Key? It looks like a crystal.";
+ next;
+ menu "Yes, I Got the key.",-,"No, I'll go look for it.",M_END;
+
+ if (countitem(7025) < 1) goto L_NOKEY; // Item: Lucifer's Lament
+ mes "[Explorer]";
+ mes "Good, you got the right key! Let's go!";
+ next;
+ warp "gefenia01.gat", 136, 166;
+ end;
+
+M_END:
+ mes "[Explorer]";
+ mes "Don't come back until you have the key!";
+ close;
+
+L_NOKEY:
+ mes "[Explorer]";
+ mes "Sorry.. you don't have the key...";
+ close;
} \ No newline at end of file
diff --git a/npc/events/custom/hallow06.txt b/npc/events/custom/hallow06.txt
index c88c190e3..bbf7ceac5 100644
--- a/npc/events/custom/hallow06.txt
+++ b/npc/events/custom/hallow06.txt
@@ -1,125 +1,125 @@
-//===== eAthena Script =======================================
-//= Custom Halloween Event 2006
-//===== By: ==================================================
-//= Stryker
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Latest Svn
-//===== Description: =========================================
-//= Halloween Event Script
-//===== Additional Comments: =================================
-//= Version 1.1 - Added trick to script
-//= 1.2 fixed bugs, optimized. Now uses 1 var instead of 3 [Lupus]
-//============================================================
-
-
-prontera.gat,151,190,5 script Hallows' Eve Event 807,{
- mes "[Hallows' Eve Event]";
- if(Class == Job_Novice){
- mes "I am sorry but you have to got a job to complete the event.";
- emotion e_swt,1;
- close;
- }
- if(EVENT_HALWN06&1 && EVENT_HALWN06&2){
- mes "I am sorry but you have already completed the event.";
- emotion e_sry;
- close;
- }
- mes "Greetings fellow lively human.";
- next;
- mes "[Hallows' Eve Event]";
- mes "Halloween is upon us and it is almost time to adventure out into places few dare go.";
- next;
- mes "[Hallows' Eve Event]";
- mes "Trick or treat, which do you prefer?";
- next;
- menu "Trick",-, "Treat",L_Treat;
-
- mes "[Hallows' Eve Event]";
- if(EVENT_HALWN06&2){
- mes "I'm sorry but you have already had a trick. Why don't you go pick a treat now.";
- emotion e_sry;
- close;
- }
- mes "Give me a min...";
- next;
- set BaseExp,BaseExp+BaseLevel*1000;
- set EVENT_HALWN06,EVENT_HALWN06|2;
-
- mes "[Hallows' Eve Event]";
- mes "Here is your treat. Your Base EXP has been slightly increased.";
- next;
- mes "[Hallows' Eve Event]";
- mes "I hope you enjoy your trick and Happy Halloween!";
- close;
-
-L_Treat:
- mes "[Hallows' Eve Event]";
- if(EVENT_HALWN06&1){
- mes "I'm sorry but you have already had a treat. Why don't you go pick a trick now.";
- emotion e_sry;
- close;
- }
- if(!(EVENT_HALWN06&4)){
- mes "Great! This shall be so much fun.";
- next;
- mes "[Hallows' Eve Event]";
- mes "I will be sending you on a scavenger hunt for items.";
- next;
- mes "[Hallows' Eve Event]";
- mes "Bring back all the necessary items, and I will create you a treat.";
- next;
- mes "[Hallows' Eve Event]";
- mes "Not just any normal treat either that you can eat, but it is something you can wear on your head.";
- next;
- mes "[Hallows' Eve Event]";
- mes "But with all things made, some items are required first.";
- mes "The list:";
- mes "1 Hat,";
- mes "30 Pumpkin, and";
- mes "20 Black Piece of Cloth";
- next;
- mes "[Hallows' Eve Event]";
- mes "Hurry along now.";
- set EVENT_HALWN06,EVENT_HALWN06|4;
- close;
- }
- mes "Did you get the items I requested or do you need to see the list again?";
- next;
- menu "Got'em",-, "Don't Have",L_Dont_Have, "See List",L_List;
-
- mes "[Hallows' Eve Event]";
- if((countitem(2220) < 1) || (countitem(535) < 30) || (countitem(7205) < 20)){
- mes "You don't have enough items. Come back when you do.";
- emotion e_sry;
- close;
- }
- delitem 2220,1;
- delitem 535,30;
- delitem 7205,20;
- getitem 5134,1;
- set EVENT_HALWN06,EVENT_HALWN06|1;
- mes "Good job! I hope you are happy with your item.";
- emotion e_grat;
- next;
- mes "[Hallows' Eve Event]";
- mes "Enjoy the rest of your halloween.";
- emotion e_scissors,1;
- close;
-
-L_Dont_Have:
- mes "[Hallows' Eve Event]";
- mes "Go back out and search for them. Would you like to view the list?";
- next;
- menu "No",-, "Yes",L_List;
- close;
-
-L_List:
- mes "[Hallows' Eve Event]";
- mes "I require the following items:";
- mes "1 Hat,";
- mes "30 Pumpkin, and";
- mes "20 Black Piece of Cloth.";
- close;
+//===== eAthena Script =======================================
+//= Custom Halloween Event 2006
+//===== By: ==================================================
+//= Stryker
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Latest Svn
+//===== Description: =========================================
+//= Halloween Event Script
+//===== Additional Comments: =================================
+//= Version 1.1 - Added trick to script
+//= 1.2 fixed bugs, optimized. Now uses 1 var instead of 3 [Lupus]
+//============================================================
+
+
+prontera.gat,151,190,5 script Hallows' Eve Event 807,{
+ mes "[Hallows' Eve Event]";
+ if(Class == Job_Novice){
+ mes "I am sorry but you have to got a job to complete the event.";
+ emotion e_swt,1;
+ close;
+ }
+ if(EVENT_HALWN06&1 && EVENT_HALWN06&2){
+ mes "I am sorry but you have already completed the event.";
+ emotion e_sry;
+ close;
+ }
+ mes "Greetings fellow lively human.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Halloween is upon us and it is almost time to adventure out into places few dare go.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Trick or treat, which do you prefer?";
+ next;
+ menu "Trick",-, "Treat",L_Treat;
+
+ mes "[Hallows' Eve Event]";
+ if(EVENT_HALWN06&2){
+ mes "I'm sorry but you have already had a trick. Why don't you go pick a treat now.";
+ emotion e_sry;
+ close;
+ }
+ mes "Give me a min...";
+ next;
+ set BaseExp,BaseExp+BaseLevel*1000;
+ set EVENT_HALWN06,EVENT_HALWN06|2;
+
+ mes "[Hallows' Eve Event]";
+ mes "Here is your treat. Your Base EXP has been slightly increased.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "I hope you enjoy your trick and Happy Halloween!";
+ close;
+
+L_Treat:
+ mes "[Hallows' Eve Event]";
+ if(EVENT_HALWN06&1){
+ mes "I'm sorry but you have already had a treat. Why don't you go pick a trick now.";
+ emotion e_sry;
+ close;
+ }
+ if(!(EVENT_HALWN06&4)){
+ mes "Great! This shall be so much fun.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "I will be sending you on a scavenger hunt for items.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Bring back all the necessary items, and I will create you a treat.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Not just any normal treat either that you can eat, but it is something you can wear on your head.";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "But with all things made, some items are required first.";
+ mes "The list:";
+ mes "1 Hat,";
+ mes "30 Pumpkin, and";
+ mes "20 Black Piece of Cloth";
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Hurry along now.";
+ set EVENT_HALWN06,EVENT_HALWN06|4;
+ close;
+ }
+ mes "Did you get the items I requested or do you need to see the list again?";
+ next;
+ menu "Got'em",-, "Don't Have",L_Dont_Have, "See List",L_List;
+
+ mes "[Hallows' Eve Event]";
+ if((countitem(2220) < 1) || (countitem(535) < 30) || (countitem(7205) < 20)){
+ mes "You don't have enough items. Come back when you do.";
+ emotion e_sry;
+ close;
+ }
+ delitem 2220,1;
+ delitem 535,30;
+ delitem 7205,20;
+ getitem 5134,1;
+ set EVENT_HALWN06,EVENT_HALWN06|1;
+ mes "Good job! I hope you are happy with your item.";
+ emotion e_grat;
+ next;
+ mes "[Hallows' Eve Event]";
+ mes "Enjoy the rest of your halloween.";
+ emotion e_scissors,1;
+ close;
+
+L_Dont_Have:
+ mes "[Hallows' Eve Event]";
+ mes "Go back out and search for them. Would you like to view the list?";
+ next;
+ menu "No",-, "Yes",L_List;
+ close;
+
+L_List:
+ mes "[Hallows' Eve Event]";
+ mes "I require the following items:";
+ mes "1 Hat,";
+ mes "30 Pumpkin, and";
+ mes "20 Black Piece of Cloth.";
+ close;
} \ No newline at end of file
diff --git a/npc/events/custom/hyegun_event.txt b/npc/events/custom/hyegun_event.txt
index 5f10c7a14..4f0cfe49b 100644
--- a/npc/events/custom/hyegun_event.txt
+++ b/npc/events/custom/hyegun_event.txt
@@ -1,77 +1,77 @@
-//===== eAthena Script =======================================
-//= HyeGun Event
-//===== By: ==================================================
-//= Synesthesia
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version I think
-//===== Description: =========================================
-//= Event similar to iRO's Christmas event when searching for Antonios.
-//===== Additional Comments: =================================
-//= Drink Jakada!
-//============================================================
-
-//HyeGun Mob spawning
-anthell01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
-mag_dun01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
-alde_dun01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
-in_sphinx1.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
-
-//Munak Quest
-pay_dun01.gat,53,269,6 script Munak 1026,{
-if(event_hyegun==3) goto Lfinished;
-mes "[^FF0000Munak^000000]";
-mes "Hello, kinda strange talking to a Munak huh?";
-mes "I'm a friendly Munak that wants to tell you something.";
-menu "Listen to her story",Lok,"Leave",Lno;
-
- Lok:
- mes "[^FF0000Munak^000000]";
- mes "Well see our father ^666600HyeGun^000000 has been terrible to us Munaks.";
- mes "We would like you to get revenge for what he has done to us.";
- next;
- mes "When you find him, kill him.";
- mes "He will drop an item that you will have to bring to me to prove his death.";
- mes "Bring me ^FF00003 ^008800Yggdrasil Dew^000000 and I'll give you a reward.";
- mes "Remember, you may only do this quest ^FF00003 times.";
- menu "Info about HyeGun",Lhyeinfo,"Give her the items",Litem,"Leave",Lno;
-
- Lhyeinfo:
- mes "[^FF0000Munak^000000]";
- mes "- HyeGun looks like us but he's a tanish color type with long hair.";
- mes "- He's been last seen in the first level of the 4 most popular dungeons.";
- mes "He doesn't hang out here because there's so many of us.";
- mes "Anything else?";
- menu "Info about HyeGun",Lhyeinfo,"Give her the items",Litem,"Leave",Lno;
-
- Litem:
- mes "[^FF0000Munak^000000]";
- mes "Ahh so you've completed the task so soon?";
- mes "Good job";
- mes "Let's see if you've got the right stuff.";
- next;
- if (countitem(7141) < 3)goto Lnoitem;
- mes "Good job, here's your reward.";
- next;
- delitem 7141,3;
- getitem 617,1;
- set event_hyegun,event_hyegun+1;
- close;
-
- Lfinished:
- mes "[^FF0000Munak^000000]";
- mes "I'm sorry, you've already completed my task 3 times.";
- close;
-
- Lno:
- mes "[^FF0000Munak^000000]";
- mes "Okay then, when you feel brave enough, come on back.";
- close;
-
- Lnoitem:
- mes "[^FF0000Munak^000000]";
- mes "Hey, you don't have the Yggdrasil Dew.";
- mes "Come back when you've gotten 3 of them.";
- close;
+//===== eAthena Script =======================================
+//= HyeGun Event
+//===== By: ==================================================
+//= Synesthesia
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version I think
+//===== Description: =========================================
+//= Event similar to iRO's Christmas event when searching for Antonios.
+//===== Additional Comments: =================================
+//= Drink Jakada!
+//============================================================
+
+//HyeGun Mob spawning
+anthell01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
+mag_dun01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
+alde_dun01.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
+in_sphinx1.gat,0,0,0,0 monster Hyegun 1512,3,180000,30000,0
+
+//Munak Quest
+pay_dun01.gat,53,269,6 script Munak 1026,{
+if(event_hyegun==3) goto Lfinished;
+mes "[^FF0000Munak^000000]";
+mes "Hello, kinda strange talking to a Munak huh?";
+mes "I'm a friendly Munak that wants to tell you something.";
+menu "Listen to her story",Lok,"Leave",Lno;
+
+ Lok:
+ mes "[^FF0000Munak^000000]";
+ mes "Well see our father ^666600HyeGun^000000 has been terrible to us Munaks.";
+ mes "We would like you to get revenge for what he has done to us.";
+ next;
+ mes "When you find him, kill him.";
+ mes "He will drop an item that you will have to bring to me to prove his death.";
+ mes "Bring me ^FF00003 ^008800Yggdrasil Dew^000000 and I'll give you a reward.";
+ mes "Remember, you may only do this quest ^FF00003 times.";
+ menu "Info about HyeGun",Lhyeinfo,"Give her the items",Litem,"Leave",Lno;
+
+ Lhyeinfo:
+ mes "[^FF0000Munak^000000]";
+ mes "- HyeGun looks like us but he's a tanish color type with long hair.";
+ mes "- He's been last seen in the first level of the 4 most popular dungeons.";
+ mes "He doesn't hang out here because there's so many of us.";
+ mes "Anything else?";
+ menu "Info about HyeGun",Lhyeinfo,"Give her the items",Litem,"Leave",Lno;
+
+ Litem:
+ mes "[^FF0000Munak^000000]";
+ mes "Ahh so you've completed the task so soon?";
+ mes "Good job";
+ mes "Let's see if you've got the right stuff.";
+ next;
+ if (countitem(7141) < 3)goto Lnoitem;
+ mes "Good job, here's your reward.";
+ next;
+ delitem 7141,3;
+ getitem 617,1;
+ set event_hyegun,event_hyegun+1;
+ close;
+
+ Lfinished:
+ mes "[^FF0000Munak^000000]";
+ mes "I'm sorry, you've already completed my task 3 times.";
+ close;
+
+ Lno:
+ mes "[^FF0000Munak^000000]";
+ mes "Okay then, when you feel brave enough, come on back.";
+ close;
+
+ Lnoitem:
+ mes "[^FF0000Munak^000000]";
+ mes "Hey, you don't have the Yggdrasil Dew.";
+ mes "Come back when you've gotten 3 of them.";
+ close;
} \ No newline at end of file
diff --git a/npc/events/custom/kings_items.txt b/npc/events/custom/kings_items.txt
index 66576225a..6ccc26545 100644
--- a/npc/events/custom/kings_items.txt
+++ b/npc/events/custom/kings_items.txt
@@ -1,178 +1,178 @@
-//===== eAthena Script =======================================
-//= Event King Items
-//===== By: ==================================================
-//= $ephiroth
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena Version
-//===== Description: =========================================
-//= Grand Circlet Quest combined with Excalibur Quest.
-//= Converted to eAthena format from Fusion.
-//= 2006/09/27: 1.0 Release and fully working. [$ephiroth]
-//============================================================
-
-prt_castle.gat,80,170,4 script King of Prontera 108,{
- set @npcname$,"[King of Prontera]";
-
- mes @npcname$;
- mes "Hello can you help me?";
- next;
- menu "Sure, what can I do?",L_Sure,"No sorry I'm busy",L_Quit;
-
-L_Sure:
- mes @npcname$;
- mes "Thank you.";
- mes "Well, my daughter next to me is a little rowdy";
- mes "if you got her these items I'm sure she would calm down.";
- mes "If you bring me these items I'll give you my crown or my sword";
- mes "Both are very special.";
- next;
- menu "Ok what do you need?",L_Req,"I have the items",L_Have,"Forget it",L_Quit;
-
-L_Req:
- mes @npcname$;
- mes "If you could get me:";
- mes "^00B6FF30 Chonchon doll^000000";
- mes "^D5A50050 Poring doll^000000";
- mes "^0080FF20 Yoyo doll^000000";
- mes "^CC66331 3carat diamond^000000";
- mes "^3131FF20 Illusion Flowers^000000";
- mes "^AA00AA20 Singing Flowers^000000";
- mes "I'll give you my crown.";
- next;
- mes @npcname$;
- mes "If you could get me:";
- mes "^0000881 Angel Band^000000";
- mes "^4422FF1 Heaven Ring^000000";
- mes "^AA00AA1 Emperium^000000";
- mes "I'll give my sword.";
- mes "Once you find those, come back to me.";
- close;
-
-L_Have:
- mes @npcname$;
- mes "What item you want?";
- next;
- menu "Crown",L_crown,"Sword",L_sword;
-
-L_crown:
- if(countitem(742)<30) goto L_Error;
- if(countitem(741)<50) goto L_Error1;
- if(countitem(753)<20) goto L_Error2;
- if(countitem(732)<1) goto L_Error3;
- if(countitem(710)<20) goto L_Error4;
- if(countitem(629)<20) goto L_Error5;
- delitem 742,30;
- delitem 741,50;
- delitem 753,20;
- delitem 732,1;
- delitem 710,20;
- delitem 629,20;
- mes @npcname$;
- mes "THANK YOU SOO MUCH!!";
- mes "This will surely calm her down.";
- mes "Let me just take the items from you.";
- next;
- mes @npcname$;
- mes "As I promised here is my crown.";
- getitem 5007,1;
- next;
- mes @npcname$;
- mes "Well, I have to calm her down now.";
- mes "Thanks again!";
- close;
-L_sword:
- if(countitem(2254)<1) goto L_NoAngel;
- if(countitem(2282)<1) goto L_NoHeaven;
- if(countitem(714)<1) goto L_NoEmp;
- delitem 2254,1;
- delitem 2282,1;
- delitem 714,1;
- mes @npcname$;
- mes "THANK YOU SOO MUCH!!";
- mes "This will surely calm her down.";
- mes "Let me just take the items from you.";
- next;
- mes @npcname$;
- mes "As I promised here is my sword.";
- getitem 1137,1;
- next;
- mes @npcname$;
- mes "Well, I have to calm her down now.";
- mes "Thanks again!";
- close;
-
-L_NoAngel:
- mes @npcname$;
- mes "Sorry but you must have at least one Angel Band.";
- mes "Come back after you get ALL the items.";
- close;
-
-L_NoHeaven:
- mes @npcname$;
- mes "Sorry but you must have at least one Heaven Ring.";
- mes "Come back after you get ALL the items.";
- close;
-
-L_NoEmp:
- mes @npcname$;
- mes "Sorry but you must have at least one Emperium.";
- mes "Come back after you get ALL the items.";
- close;
-
-L_Error:
- mes @npcname$;
- mes "Oh darn, you need 30 Chonchon Dolls.";
- close;
-
-L_Error1:
- mes @npcname$;
- mes "Oh darn, you need 50 Poring dolls.";
- close;
-
-L_Error2:
- mes @npcname$;
- mes "Oh darn, you need 20 Yoyo dolls.";
- close;
-
-L_Error3:
- mes @npcname$;
- mes "Oh darn, you need one 3 Carat Diamond.";
- close;
-
-L_Error4:
- mes @npcname$;
- mes "Oh darn, you need 20 Illusion Flowers.";
- close;
-
-L_Error5:
- mes @npcname$;
- mes "Oh darn, you need 20 Singing Flowers.";
- close;
-
-L_Quit:
- mes @npcname$;
- mes "Ok, that's fine, I'm sure someone else will help.";
- close;
-}
-
-prt_castle.gat,84,170,4 script King's Daughter 62,{
- set @npcname$,"[King's Daughter]";
-
- mes @npcname$;
- mes "Hmph, I hate my dad right now!!";
- next;
- menu "Why?",L_Why,"Ok...Whatever..",L_Quit;
-
-L_Why:
- mes @npcname$;
- mes "Well, he won't give me what I want!!";
- mes "He's the King of Prontera, he should be able to get me ANYTHING!!!";
- close;
-
-L_Quit:
- mes @npcname$;
- mes "FINE THEN Hmph!!";
- close;
-}
+//===== eAthena Script =======================================
+//= Event King Items
+//===== By: ==================================================
+//= $ephiroth
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena Version
+//===== Description: =========================================
+//= Grand Circlet Quest combined with Excalibur Quest.
+//= Converted to eAthena format from Fusion.
+//= 2006/09/27: 1.0 Release and fully working. [$ephiroth]
+//============================================================
+
+prt_castle.gat,80,170,4 script King of Prontera 108,{
+ set @npcname$,"[King of Prontera]";
+
+ mes @npcname$;
+ mes "Hello can you help me?";
+ next;
+ menu "Sure, what can I do?",L_Sure,"No sorry I'm busy",L_Quit;
+
+L_Sure:
+ mes @npcname$;
+ mes "Thank you.";
+ mes "Well, my daughter next to me is a little rowdy";
+ mes "if you got her these items I'm sure she would calm down.";
+ mes "If you bring me these items I'll give you my crown or my sword";
+ mes "Both are very special.";
+ next;
+ menu "Ok what do you need?",L_Req,"I have the items",L_Have,"Forget it",L_Quit;
+
+L_Req:
+ mes @npcname$;
+ mes "If you could get me:";
+ mes "^00B6FF30 Chonchon doll^000000";
+ mes "^D5A50050 Poring doll^000000";
+ mes "^0080FF20 Yoyo doll^000000";
+ mes "^CC66331 3carat diamond^000000";
+ mes "^3131FF20 Illusion Flowers^000000";
+ mes "^AA00AA20 Singing Flowers^000000";
+ mes "I'll give you my crown.";
+ next;
+ mes @npcname$;
+ mes "If you could get me:";
+ mes "^0000881 Angel Band^000000";
+ mes "^4422FF1 Heaven Ring^000000";
+ mes "^AA00AA1 Emperium^000000";
+ mes "I'll give my sword.";
+ mes "Once you find those, come back to me.";
+ close;
+
+L_Have:
+ mes @npcname$;
+ mes "What item you want?";
+ next;
+ menu "Crown",L_crown,"Sword",L_sword;
+
+L_crown:
+ if(countitem(742)<30) goto L_Error;
+ if(countitem(741)<50) goto L_Error1;
+ if(countitem(753)<20) goto L_Error2;
+ if(countitem(732)<1) goto L_Error3;
+ if(countitem(710)<20) goto L_Error4;
+ if(countitem(629)<20) goto L_Error5;
+ delitem 742,30;
+ delitem 741,50;
+ delitem 753,20;
+ delitem 732,1;
+ delitem 710,20;
+ delitem 629,20;
+ mes @npcname$;
+ mes "THANK YOU SOO MUCH!!";
+ mes "This will surely calm her down.";
+ mes "Let me just take the items from you.";
+ next;
+ mes @npcname$;
+ mes "As I promised here is my crown.";
+ getitem 5007,1;
+ next;
+ mes @npcname$;
+ mes "Well, I have to calm her down now.";
+ mes "Thanks again!";
+ close;
+L_sword:
+ if(countitem(2254)<1) goto L_NoAngel;
+ if(countitem(2282)<1) goto L_NoHeaven;
+ if(countitem(714)<1) goto L_NoEmp;
+ delitem 2254,1;
+ delitem 2282,1;
+ delitem 714,1;
+ mes @npcname$;
+ mes "THANK YOU SOO MUCH!!";
+ mes "This will surely calm her down.";
+ mes "Let me just take the items from you.";
+ next;
+ mes @npcname$;
+ mes "As I promised here is my sword.";
+ getitem 1137,1;
+ next;
+ mes @npcname$;
+ mes "Well, I have to calm her down now.";
+ mes "Thanks again!";
+ close;
+
+L_NoAngel:
+ mes @npcname$;
+ mes "Sorry but you must have at least one Angel Band.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+L_NoHeaven:
+ mes @npcname$;
+ mes "Sorry but you must have at least one Heaven Ring.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+L_NoEmp:
+ mes @npcname$;
+ mes "Sorry but you must have at least one Emperium.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+L_Error:
+ mes @npcname$;
+ mes "Oh darn, you need 30 Chonchon Dolls.";
+ close;
+
+L_Error1:
+ mes @npcname$;
+ mes "Oh darn, you need 50 Poring dolls.";
+ close;
+
+L_Error2:
+ mes @npcname$;
+ mes "Oh darn, you need 20 Yoyo dolls.";
+ close;
+
+L_Error3:
+ mes @npcname$;
+ mes "Oh darn, you need one 3 Carat Diamond.";
+ close;
+
+L_Error4:
+ mes @npcname$;
+ mes "Oh darn, you need 20 Illusion Flowers.";
+ close;
+
+L_Error5:
+ mes @npcname$;
+ mes "Oh darn, you need 20 Singing Flowers.";
+ close;
+
+L_Quit:
+ mes @npcname$;
+ mes "Ok, that's fine, I'm sure someone else will help.";
+ close;
+}
+
+prt_castle.gat,84,170,4 script King's Daughter 62,{
+ set @npcname$,"[King's Daughter]";
+
+ mes @npcname$;
+ mes "Hmph, I hate my dad right now!!";
+ next;
+ menu "Why?",L_Why,"Ok...Whatever..",L_Quit;
+
+L_Why:
+ mes @npcname$;
+ mes "Well, he won't give me what I want!!";
+ mes "He's the King of Prontera, he should be able to get me ANYTHING!!!";
+ close;
+
+L_Quit:
+ mes @npcname$;
+ mes "FINE THEN Hmph!!";
+ close;
+}
diff --git a/npc/events/custom/npc_event_thesign.txt b/npc/events/custom/npc_event_thesign.txt
index 8240a9627..4818e7aae 100644
--- a/npc/events/custom/npc_event_thesign.txt
+++ b/npc/events/custom/npc_event_thesign.txt
@@ -1,68 +1,68 @@
-//==============================================================================
-// Temporary The Sign Script [Playtester]
-//==============================================================================
-// Version 1.0
-//==============================================================================
-// How it works:
-// - to activate the fountain you need to have at least 1000000 Zeny
-// - if you throw 250000 Zeny into the fountain the path to Geffenia
-// will open for 30 seconds
-// - the requirements will later be replaced by "Finishing The Sign Quest"
-//==============================================================================
-// Special thanks to Dr.Evil, Tharis, Blaze
-//==============================================================================
-geffen.gat,119,56,0 script #gefeniagate 139,{
-OnInit:
- disablenpc "gefeniawarp";
- end;
-On_Start:
- misceffect 247;
- initnpctimer;
- end;
-OnTimer10000:
- misceffect 247;
- donpcevent "Fountain::On_Effect";
- end;
-OnTimer20000:
- misceffect 247;
- donpcevent "Fountain::On_Effect";
- end;
-OnTimer30000:
- disablenpc "gefeniawarp";
- mapannounce "geffen.gat","The gate to Geffenia has closed.",0;
- stopnpctimer;
- end;
-}
-
-geffen.gat,119,56,0 script gefeniawarp 45,1,1{
- set @warp,rand(4);
- if (@warp==0) warp "gefenia01.gat",58,169;
- if (@warp==1) warp "gefenia02.gat",116,115;
- if (@warp==2) warp "gefenia03.gat",130,206;
- if (@warp==3) warp "gefenia04.gat",133,88;
- end;
-}
-
-geffen.gat,119,48,0 script Fountain 111,{
- mes "This is the";
- mes "Geffen Fountain.";
- if (Zeny >= 1000000) goto L_1;
- close;
-L_1:
- mes "The Zeny in your pocket begins to glow.";
- mes "Do you want to throw ^FF0000250000 Zeny^000000 into the fountain?";
- next;
- menu "Yes",L_2,"No",-;
- close;
-L_2:
- mes "When you threw the money into the fountain a bright light appears.";
- set Zeny, Zeny-250000;
- enablenpc "gefeniawarp";
- donpcevent "#gefeniagate::On_Start";
- misceffect 247;
- mapannounce "geffen.gat","With light, the gate to Geffenia opens.",0;
- close;
-On_Effect:
- misceffect 247;
- end;
-}
+//==============================================================================
+// Temporary The Sign Script [Playtester]
+//==============================================================================
+// Version 1.0
+//==============================================================================
+// How it works:
+// - to activate the fountain you need to have at least 1000000 Zeny
+// - if you throw 250000 Zeny into the fountain the path to Geffenia
+// will open for 30 seconds
+// - the requirements will later be replaced by "Finishing The Sign Quest"
+//==============================================================================
+// Special thanks to Dr.Evil, Tharis, Blaze
+//==============================================================================
+geffen.gat,119,56,0 script #gefeniagate 139,{
+OnInit:
+ disablenpc "gefeniawarp";
+ end;
+On_Start:
+ misceffect 247;
+ initnpctimer;
+ end;
+OnTimer10000:
+ misceffect 247;
+ donpcevent "Fountain::On_Effect";
+ end;
+OnTimer20000:
+ misceffect 247;
+ donpcevent "Fountain::On_Effect";
+ end;
+OnTimer30000:
+ disablenpc "gefeniawarp";
+ mapannounce "geffen.gat","The gate to Geffenia has closed.",0;
+ stopnpctimer;
+ end;
+}
+
+geffen.gat,119,56,0 script gefeniawarp 45,1,1{
+ set @warp,rand(4);
+ if (@warp==0) warp "gefenia01.gat",58,169;
+ if (@warp==1) warp "gefenia02.gat",116,115;
+ if (@warp==2) warp "gefenia03.gat",130,206;
+ if (@warp==3) warp "gefenia04.gat",133,88;
+ end;
+}
+
+geffen.gat,119,48,0 script Fountain 111,{
+ mes "This is the";
+ mes "Geffen Fountain.";
+ if (Zeny >= 1000000) goto L_1;
+ close;
+L_1:
+ mes "The Zeny in your pocket begins to glow.";
+ mes "Do you want to throw ^FF0000250000 Zeny^000000 into the fountain?";
+ next;
+ menu "Yes",L_2,"No",-;
+ close;
+L_2:
+ mes "When you threw the money into the fountain a bright light appears.";
+ set Zeny, Zeny-250000;
+ enablenpc "gefeniawarp";
+ donpcevent "#gefeniagate::On_Start";
+ misceffect 247;
+ mapannounce "geffen.gat","With light, the gate to Geffenia opens.",0;
+ close;
+On_Effect:
+ misceffect 247;
+ end;
+}
diff --git a/npc/events/custom/p_track/p_track_core.txt b/npc/events/custom/p_track/p_track_core.txt
index c2fb27bd1..9a7ade1bb 100644
--- a/npc/events/custom/p_track/p_track_core.txt
+++ b/npc/events/custom/p_track/p_track_core.txt
@@ -1,43 +1,43 @@
-//===== eAthena Script =======================================
-//= Poring Track Main NPCs
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 0.0000000000000002
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= NPCs that has nothing to do with the race itself, but
-//= has important functions on the race itself.
-//===== Additional Comments: =================================
-//= 0.0000000000000002 Removed Duplicates [Silent]
-//============================================================
-p_track01.gat,41,57,5 script Lady#track1::P_track 845,{
-end;
-}
-
-p_track01.gat,67,34,6 script Erudite::P_Spectator1 107,{
-end;
-}
-
-p_track01.gat,44,49,3 script Edward 881,{
-end;
-}
-
-p_track01.gat,27,47,3 script Yuri#P_track 853,{
-end;
-}
-
-p_track02.gat,30,45,3 script Nagya 755,{
-end;
-}
-
-p_track02.gat,42,49,3 script Asgahrd 733,{
-end;
-}
-
-p_track02.gat,67,33,1 script Blacksmith#track1 726,{
-end;
-}
-
+//===== eAthena Script =======================================
+//= Poring Track Main NPCs
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 0.0000000000000002
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= NPCs that has nothing to do with the race itself, but
+//= has important functions on the race itself.
+//===== Additional Comments: =================================
+//= 0.0000000000000002 Removed Duplicates [Silent]
+//============================================================
+p_track01.gat,41,57,5 script Lady#track1::P_track 845,{
+end;
+}
+
+p_track01.gat,67,34,6 script Erudite::P_Spectator1 107,{
+end;
+}
+
+p_track01.gat,44,49,3 script Edward 881,{
+end;
+}
+
+p_track01.gat,27,47,3 script Yuri#P_track 853,{
+end;
+}
+
+p_track02.gat,30,45,3 script Nagya 755,{
+end;
+}
+
+p_track02.gat,42,49,3 script Asgahrd 733,{
+end;
+}
+
+p_track02.gat,67,33,1 script Blacksmith#track1 726,{
+end;
+}
+
p_track02.gat,41,57,5 duplicate(P_track) Lady#track2 845 \ No newline at end of file
diff --git a/npc/events/custom/p_track/p_track_warpers.txt b/npc/events/custom/p_track/p_track_warpers.txt
index 58154c3d2..a375673ed 100644
--- a/npc/events/custom/p_track/p_track_warpers.txt
+++ b/npc/events/custom/p_track/p_track_warpers.txt
@@ -1,73 +1,73 @@
-//===== eAthena Script =======================================
-//= Poring Track Warpers
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 0.0000000000000002
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= NPC's for the City of Hugel.
-//===== Additional Comments: =================================
-//= 0.0000000000000002 Removed Duplicates [Silent]
-//============================================================
-//| Warp-in npcs
-hugel.gat,58,72,5 script Yan#track1 86,{
-//callfunc "P_TrackEnt",npcname,map name;
-callfunc "P_TrackEnt","[Yan]","p_track01.gat";
-end;
-}
-hugel.gat,62,68,1 script Yalmire#track1 86,{
-//callfunc "P_TrackEnt",npcname,map name;
-callfunc "P_TrackEnt","[Yalmire]","p_track02.gat";
-end;
-}
-
-//| Warp-out npcs
-
-p_track01.gat,76,36,2 script Yan#track2 86,{
-end;
-}
-
-p_track02.gat,76,36,2 script Yalmire#track2 86,{
-end;
-}
-
-function script P_TrackEnt {
-
-mes getarg(0);
-mes "Hi "+strcharinfo(0)+", Welcome to the Poring Track!";
-menu "Information",-,"I want to try it",L_Try,"Not today thanks",L_End;
- next;
- mes getarg(0);
- mes "Bla blah, so fun";
- close;
- L_Try:
- next;
- mes getarg(0);
- mes "Ok, the entrance fee is 500z, would you like to go in?";
- menu "Yes Please",-,"No Thanks",L_End2;
- if (Zeny < 500) {
- next;
- mes getarg(0);
- mes "Sorry but you ain't got 500z, you can't enter";
- close;
- } else
- next;
- mes getarg(0);
- mes "Here we go!";
- close2;
- set Zeny,Zeny-500;
- warp getarg(1),75,41;
- end;
- L_End2:
- next;
- mes getarg(0);
- mes "Oh well, you miss it";
- close;
- L_End:
- next;
- mes getarg(0);
- mes "Ok, see you later!";
- close;
-}
+//===== eAthena Script =======================================
+//= Poring Track Warpers
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 0.0000000000000002
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= NPC's for the City of Hugel.
+//===== Additional Comments: =================================
+//= 0.0000000000000002 Removed Duplicates [Silent]
+//============================================================
+//| Warp-in npcs
+hugel.gat,58,72,5 script Yan#track1 86,{
+//callfunc "P_TrackEnt",npcname,map name;
+callfunc "P_TrackEnt","[Yan]","p_track01.gat";
+end;
+}
+hugel.gat,62,68,1 script Yalmire#track1 86,{
+//callfunc "P_TrackEnt",npcname,map name;
+callfunc "P_TrackEnt","[Yalmire]","p_track02.gat";
+end;
+}
+
+//| Warp-out npcs
+
+p_track01.gat,76,36,2 script Yan#track2 86,{
+end;
+}
+
+p_track02.gat,76,36,2 script Yalmire#track2 86,{
+end;
+}
+
+function script P_TrackEnt {
+
+mes getarg(0);
+mes "Hi "+strcharinfo(0)+", Welcome to the Poring Track!";
+menu "Information",-,"I want to try it",L_Try,"Not today thanks",L_End;
+ next;
+ mes getarg(0);
+ mes "Bla blah, so fun";
+ close;
+ L_Try:
+ next;
+ mes getarg(0);
+ mes "Ok, the entrance fee is 500z, would you like to go in?";
+ menu "Yes Please",-,"No Thanks",L_End2;
+ if (Zeny < 500) {
+ next;
+ mes getarg(0);
+ mes "Sorry but you ain't got 500z, you can't enter";
+ close;
+ } else
+ next;
+ mes getarg(0);
+ mes "Here we go!";
+ close2;
+ set Zeny,Zeny-500;
+ warp getarg(1),75,41;
+ end;
+ L_End2:
+ next;
+ mes getarg(0);
+ mes "Oh well, you miss it";
+ close;
+ L_End:
+ next;
+ mes getarg(0);
+ mes "Ok, see you later!";
+ close;
+}
diff --git a/npc/events/custom/uneasy_cemetery.txt b/npc/events/custom/uneasy_cemetery.txt
index 0bf6cdfcf..484991bea 100644
--- a/npc/events/custom/uneasy_cemetery.txt
+++ b/npc/events/custom/uneasy_cemetery.txt
@@ -1,133 +1,133 @@
-//===== eAthena Script =======================================
-//= Uneasy Prontera Cemetery Quest (original script!)
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.2 (Tested and fully working!)
-//===== Compatible With: =====================================
-//= eAthena Version 1.0
-//===== Description: =========================================
-//= A periodical quest of the Uneasy Cemetery (Kill undead / Prevent their appearance)
-//= Every day, at the midnight Prontera recieve a wave of Undeads.
-//= They come from Uneasy Cemetery of Prontera. To protect the players
-//= from the undeads terror you may either kill the enemy. Or supply Mother Mathana
-//= with needed amount of Holy Water. Every citizen can take his part in the
-//= saving of Prontera city. After some days of quiet life... the Cemetery strikes back.
-//===== Additional Comments: =================================
-//= 1.1 More advanced ver. Added some bonus the the one who'd kill the last walking undead
-//= 1.2 Added coords to the script to make label OmMobDead working
-//============================================================
-
-
-prontera.gat,3,3,3 script Uneasy_Check -1,{
- end;
-
-OnHour00:
- set $UNEASY_DL,$UNEASY_DL-1;
- set $UNEASY_BL,$UNEASY_BL+30; //add need of HW for 30 bottles per day
- if ($UNEASY_BL>666) set $UNEASY_BL,666; //keep needed bottles not <=666
- if ($UNEASY_DL < 0) goto L_Start_Undead;
-//The Cemetery is OK yet.
- disablenpc "Mother Mathana";
- end;
-OnInit:
- if ($UNEASY_DL >= 0) disablenpc "Mother Mathana";
- end;
-
-OnHour06:
- killmonsterall "prontera.gat"; //The Sun kills undead in the morning
- end;
-
-OnHour01:
- if ($@UNEASY_MOB > 0) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin, please finish these roaming undead leftovers!",0;
- end;
-
-OnZombieDead:
- set $@UNEASY_MOB,$@UNEASY_MOB-1;
- if ($@UNEASY_MOB>0) end;
- set $UNEASY_DL,0;
- set $UNEASY_H$,strcharinfo(0);
- if (Sex==1) mapannounce "prontera.gat","[Mother Mathana]: Brave "+$UNEASY_H$+" has just killed the last undead in Prontera!",0;
- if (Sex==0) mapannounce "prontera.gat","[Mother Mathana]: Lady "+$UNEASY_H$+" has just killed the last undead in Prontera!",0;
- set JobExp,JobExp+100;
- set BaseExp,BaseExp+50;
- end;
-
-L_Start_Undead:
- killmonsterall "prontera.gat"; //kills any left monsters
- enablenpc "Mother Mathana";
-//call some monsters in the city
- set $@UNEASY_MOB, 65;
- areamonster "prontera.gat",0,0,0,0,"Zombie",1015,30,"Uneasy_Check::OnZombieDead";
-//in the Cemetery
- monster "prontera.gat",268,349,"Zombie",1015,30,"Uneasy_Check::OnZombieDead";
- monster "prontera.gat",269,350,"Ghoul",1036,5,"Uneasy_Check::OnZombieDead";
-//announce
- mapannounce "prontera.gat","[Mother Mathana]: The cememtery has become restless! In the name of Odin, hurry to the Sanctuary! Save the city of Prontera!",0;
-}
-
-prontera.gat,257,313,5 script Mother Mathana 79,{
- mes "[Mother Mathana]";
- if ($UNEASY_DL <= 0) goto L_Undead_Walk;
- mes "I'm afraid there's something wrong with our old cemetery...";
- if ($UNEASY_H$==strcharinfo(0)) mes "But thanks to you, "+$UNEASY_H$+", we'll be able to sleep " + $UNEASY_DL + " nights!";
- if ($UNEASY_H$!=strcharinfo(0)) mes "But thanks to "+$UNEASY_H$+"'s support, we've got " + $UNEASY_DL + " easy nights!";
- emotion 0;
- close;
-
-L_Undead_Walk:
- if ($UNEASY_DL == 0) mes "THEY could return tomorrow's night again!";
- if ($UNEASY_DL == 0 && $UNEASY_H$==strcharinfo(0)) mes "Thank you, "+$UNEASY_H$+"! Now we'll manage to rest till the next midnight!";
- if ($UNEASY_DL == 0 && $UNEASY_H$!=strcharinfo(0)) mes "But due to "+$UNEASY_H$+"'s help we'll manage to rest till the next midnight!";
- mes "To calm down the restless cemetery, we should pour all these graves with the Holy Water. But our sisters and broters have run out of it.";
- mes "Could you supply us with Holy Water?";
- next;
- menu "Yes, have all my Holy Water!",-, "Nope, I need it.",M_NO, "I don't have any.",M_DONT_HAVE;
-
- if ( countitem("Holy_Water")<1 ) goto M_DONT_HAVE;
- set $UNEASY_BL,$UNEASY_BL-countitem("Holy_Water");
- delitem "Holy_Water",countitem("Holy_Water");
-
- if ( $UNEASY_BL > 0 ) goto L_NEED_MORE;
-//set quiet days!!! no more undead for this period!
- set $UNEASY_DL,5+((0-$UNEASY_BL)/30);
- set $UNEASY_H$,strcharinfo(0);
- mes "[Mother Mathana]";
- mes "Thank you, "+$UNEASY_H$+"! Now we've got enough Holy Water!";
- next;
- mes "[Mother Mathana]";
- mes "Upon pouring the cemetery with that water we'll get " + $UNEASY_DL + " safe nights!";
- next;
- killmonsterall "prontera.gat"; //kills any left monsters
- mes "[Mother Mathana]";
- mes "See, "+ $UNEASY_H$ +"? They all are gone now!";
- next;
- mes "[Mother Mathana]";
- mes "Our Church is going to thank you personally...";
- next;
- if (Sex==1) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin we declare handsom "+$UNEASY_H$+" as a Prontera savior!",0;
- if (Sex==0) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin we declare beautiful "+$UNEASY_H$+" as a Prontera savior!",0;
- mes "[Mother Mathana]";
- mes "In the name of Odin we bless you and decently present a modest gift just from Mareusis' wine-cellar.";
- getitem "Blue_Potion",1;
- set JobExp,JobExp+100;
- set BaseExp,BaseExp+50;
- close;
-
-L_NEED_MORE:
- mes "[Mother Mathana]";
- mes "Thank you, good "+strcharinfo(0)+", but we still need " + $UNEASY_BL + " more Holy Water bottles.";
- close;
-
-M_NO:
- mes "[Mother Mathana]";
- mes "I'm afraid the old cemetery is going out of control soon... Please, get us all the Holy Water you can get.";
- close;
-
-M_DONT_HAVE:
- mes "[Mother Mathana]";
- mes "Alas! We still need " + $UNEASY_BL + " more bottles of Holy Water... Why don't you go and ask other people for some extra Holy Water?";
- mes "The old cemetery is going out of control soon...";
- mes "Please, in the name of Odin, help Prontera city.";
- close;
-}
+//===== eAthena Script =======================================
+//= Uneasy Prontera Cemetery Quest (original script!)
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.2 (Tested and fully working!)
+//===== Compatible With: =====================================
+//= eAthena Version 1.0
+//===== Description: =========================================
+//= A periodical quest of the Uneasy Cemetery (Kill undead / Prevent their appearance)
+//= Every day, at the midnight Prontera recieve a wave of Undeads.
+//= They come from Uneasy Cemetery of Prontera. To protect the players
+//= from the undeads terror you may either kill the enemy. Or supply Mother Mathana
+//= with needed amount of Holy Water. Every citizen can take his part in the
+//= saving of Prontera city. After some days of quiet life... the Cemetery strikes back.
+//===== Additional Comments: =================================
+//= 1.1 More advanced ver. Added some bonus the the one who'd kill the last walking undead
+//= 1.2 Added coords to the script to make label OmMobDead working
+//============================================================
+
+
+prontera.gat,3,3,3 script Uneasy_Check -1,{
+ end;
+
+OnHour00:
+ set $UNEASY_DL,$UNEASY_DL-1;
+ set $UNEASY_BL,$UNEASY_BL+30; //add need of HW for 30 bottles per day
+ if ($UNEASY_BL>666) set $UNEASY_BL,666; //keep needed bottles not <=666
+ if ($UNEASY_DL < 0) goto L_Start_Undead;
+//The Cemetery is OK yet.
+ disablenpc "Mother Mathana";
+ end;
+OnInit:
+ if ($UNEASY_DL >= 0) disablenpc "Mother Mathana";
+ end;
+
+OnHour06:
+ killmonsterall "prontera.gat"; //The Sun kills undead in the morning
+ end;
+
+OnHour01:
+ if ($@UNEASY_MOB > 0) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin, please finish these roaming undead leftovers!",0;
+ end;
+
+OnZombieDead:
+ set $@UNEASY_MOB,$@UNEASY_MOB-1;
+ if ($@UNEASY_MOB>0) end;
+ set $UNEASY_DL,0;
+ set $UNEASY_H$,strcharinfo(0);
+ if (Sex==1) mapannounce "prontera.gat","[Mother Mathana]: Brave "+$UNEASY_H$+" has just killed the last undead in Prontera!",0;
+ if (Sex==0) mapannounce "prontera.gat","[Mother Mathana]: Lady "+$UNEASY_H$+" has just killed the last undead in Prontera!",0;
+ set JobExp,JobExp+100;
+ set BaseExp,BaseExp+50;
+ end;
+
+L_Start_Undead:
+ killmonsterall "prontera.gat"; //kills any left monsters
+ enablenpc "Mother Mathana";
+//call some monsters in the city
+ set $@UNEASY_MOB, 65;
+ areamonster "prontera.gat",0,0,0,0,"Zombie",1015,30,"Uneasy_Check::OnZombieDead";
+//in the Cemetery
+ monster "prontera.gat",268,349,"Zombie",1015,30,"Uneasy_Check::OnZombieDead";
+ monster "prontera.gat",269,350,"Ghoul",1036,5,"Uneasy_Check::OnZombieDead";
+//announce
+ mapannounce "prontera.gat","[Mother Mathana]: The cememtery has become restless! In the name of Odin, hurry to the Sanctuary! Save the city of Prontera!",0;
+}
+
+prontera.gat,257,313,5 script Mother Mathana 79,{
+ mes "[Mother Mathana]";
+ if ($UNEASY_DL <= 0) goto L_Undead_Walk;
+ mes "I'm afraid there's something wrong with our old cemetery...";
+ if ($UNEASY_H$==strcharinfo(0)) mes "But thanks to you, "+$UNEASY_H$+", we'll be able to sleep " + $UNEASY_DL + " nights!";
+ if ($UNEASY_H$!=strcharinfo(0)) mes "But thanks to "+$UNEASY_H$+"'s support, we've got " + $UNEASY_DL + " easy nights!";
+ emotion 0;
+ close;
+
+L_Undead_Walk:
+ if ($UNEASY_DL == 0) mes "THEY could return tomorrow's night again!";
+ if ($UNEASY_DL == 0 && $UNEASY_H$==strcharinfo(0)) mes "Thank you, "+$UNEASY_H$+"! Now we'll manage to rest till the next midnight!";
+ if ($UNEASY_DL == 0 && $UNEASY_H$!=strcharinfo(0)) mes "But due to "+$UNEASY_H$+"'s help we'll manage to rest till the next midnight!";
+ mes "To calm down the restless cemetery, we should pour all these graves with the Holy Water. But our sisters and broters have run out of it.";
+ mes "Could you supply us with Holy Water?";
+ next;
+ menu "Yes, have all my Holy Water!",-, "Nope, I need it.",M_NO, "I don't have any.",M_DONT_HAVE;
+
+ if ( countitem("Holy_Water")<1 ) goto M_DONT_HAVE;
+ set $UNEASY_BL,$UNEASY_BL-countitem("Holy_Water");
+ delitem "Holy_Water",countitem("Holy_Water");
+
+ if ( $UNEASY_BL > 0 ) goto L_NEED_MORE;
+//set quiet days!!! no more undead for this period!
+ set $UNEASY_DL,5+((0-$UNEASY_BL)/30);
+ set $UNEASY_H$,strcharinfo(0);
+ mes "[Mother Mathana]";
+ mes "Thank you, "+$UNEASY_H$+"! Now we've got enough Holy Water!";
+ next;
+ mes "[Mother Mathana]";
+ mes "Upon pouring the cemetery with that water we'll get " + $UNEASY_DL + " safe nights!";
+ next;
+ killmonsterall "prontera.gat"; //kills any left monsters
+ mes "[Mother Mathana]";
+ mes "See, "+ $UNEASY_H$ +"? They all are gone now!";
+ next;
+ mes "[Mother Mathana]";
+ mes "Our Church is going to thank you personally...";
+ next;
+ if (Sex==1) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin we declare handsom "+$UNEASY_H$+" as a Prontera savior!",0;
+ if (Sex==0) mapannounce "prontera.gat","[Mother Mathana]: In the name of Odin we declare beautiful "+$UNEASY_H$+" as a Prontera savior!",0;
+ mes "[Mother Mathana]";
+ mes "In the name of Odin we bless you and decently present a modest gift just from Mareusis' wine-cellar.";
+ getitem "Blue_Potion",1;
+ set JobExp,JobExp+100;
+ set BaseExp,BaseExp+50;
+ close;
+
+L_NEED_MORE:
+ mes "[Mother Mathana]";
+ mes "Thank you, good "+strcharinfo(0)+", but we still need " + $UNEASY_BL + " more Holy Water bottles.";
+ close;
+
+M_NO:
+ mes "[Mother Mathana]";
+ mes "I'm afraid the old cemetery is going out of control soon... Please, get us all the Holy Water you can get.";
+ close;
+
+M_DONT_HAVE:
+ mes "[Mother Mathana]";
+ mes "Alas! We still need " + $UNEASY_BL + " more bottles of Holy Water... Why don't you go and ask other people for some extra Holy Water?";
+ mes "The old cemetery is going out of control soon...";
+ mes "Please, in the name of Odin, help Prontera city.";
+ close;
+}
diff --git a/npc/events/custom/valentinesdayexp.txt b/npc/events/custom/valentinesdayexp.txt
index 5a3a471e6..ce519513a 100644
--- a/npc/events/custom/valentinesdayexp.txt
+++ b/npc/events/custom/valentinesdayexp.txt
@@ -1,286 +1,286 @@
-//===== Athena Script ========================================
-//= Valentine Event Script + EXP bonus
-//===== By: ==================================================
-//= Lupus (based on Muad_Dib's work)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version 45xx+
-//===== Description: =========================================
-// Close to other official stValentine event (added white chocolate)
-// Custom: Handmade choco gives some EXP bonuses to married people
-//
-//===== Additional Comments: =================================
-//= WARNING!! To use this event, dicable original valentinesday.txt
-//= You can use this event from 12 till 16 February 8) [Lupus]
-//= 1.1 Removed Duplicates [Silent]
-//============================================================
-
-// Tine - Valentine Event Chocolate Even Guide ------------------
-prontera.gat,156,172,4 script Tine 58,{
-// Debug info for item effects and tricky conditions 8)
-// mes "@dsv: "+@dsv;
-// mes "ispartneron()=="+ispartneron();
-// mes "sex == "+sex;
-// if(@dsv == gettime(3)+1) mes "@dsv == gettime(3)+1";
-
- mes "[Tine]";
- mes "The legend says that on 14th February... on the Day of Saint Valentine...";
- mes "Only in Run-Midgard kingdom...";
- next;
- specialeffect 417;
- mes "[Tine]";
- mes "Some married chocolate lovers almost double their experience at trainings!";
- mes "But everything isn't so simply...";
- next;
- menu "Wow! Tell me more!",M_INFO,"Marri... what?",-;
-
- mes "[Tine]";
- mes "Are you a single?";
- mes "Today is a great date to ask your beloved half for marriage!";
- next;
- mes "[Tine]";
- mes "The Marriage fee is ridiculous low these days!";
- close;
-
-M_INFO:
- mes "[Tine]";
- mes "The magic effect posesses only handmade chocolate from grand-grand-grand-whoever recipes!";
- next;
- mes "[Tine]";
- mes "It being known that Black Handmade Chocolate works on married guys... And the White one on the married girls!";
- mes "If you lose your wedding ring... then alas, it won't work on you.";
- next;
- mes "[Tine]";
- mes "On having a Chocolate, you should put off your ring then... put it back... And if your partner is online, then magc would last till the next hour!";
- next;
- mes "[Tine]";
- mes "Rumors bark that guys and gals have +50% EXP bonuses on FIVE different races of the monsters... Exluding bloody bosses, of course.";
- next;
- mes "[Tine]";
- mes "There's a fameous confectioner in the Castle of Prontera! He's the one you need.";
- close;
-
-OnInit:
- //559,Hand-made_Chocolate
- setitemscript 559,"{ itemheal 50,50; if(sex==0 || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }";
- //560,Hand-made_White_Chocolate
- setitemscript 560,"{ itemheal 50,50; if(sex || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }";
-
- //2634,Wedding_Ring_M,Wedding Ring,5,,10,0,,0,,0,127918079,7,1,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; }
- setitemscript 2634,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,5,50; bonus2 bExpAddRace,6,50; bonus2 bExpAddRace,7,50; bonus2 bExpAddRace,8,50; bonus2 bExpAddRace,1,50; } }";
- //2635,Wedding_Ring_F,Wedding Ring,5,,10,0,,0,,0,127918079,7,0,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; }
- setitemscript 2635,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,0,50; bonus2 bExpAddRace,9,50; bonus2 bExpAddRace,2,50; bonus2 bExpAddRace,3,50; bonus2 bExpAddRace,4,50; } }";
- end;
-}
-
-// Stephen - Valentine Event Chocolate seller ------------------
-alberta.gat,26,243,4 script Stephen#val1 58,{
- mes "[Stephen]";
- mes "Guess what I've got?";
- mes "A tasty treat not easily found in Rune-Midgard....";
- next;
- mes "[Stephen]";
- mes "Chocolate!";
- mes "That's right, don't you love chocolate.... I do.";
- mes "And you are in luck, because I'm selling them for only 5,000 zeny a piece!";
- next;
- menu "I want some chocolate!",M_CHOCO,"No thanks.",-;
-
- mes "[Stephen]";
- mes "You don't want any chocolate?";
- mes "I'm telling you! You'll regret it!";
- mes "You better get some now... you won't come across Chocolate like this ever again!";
- mes "Think it over and visit me again sometime.";
- close;
-
-M_CHOCO:
- mes "[Stephen]";
- mes "Hah!";
- mes "I knew it!";
- mes "But I can't sell you more then 5 at once....but, if you really need more....";
- mes "you can come back again.";
- mes "So how many do you want?";
- next;
- set @needmon,0;
- input @flag_num;
- if (@flag_num == 0) goto L_NONE;
- if (@flag_num > 5) goto L_ERR;
- set @needmon,@flag_num*5000;
- if (Zeny < @needmon) goto L_NOTENO;
- set Zeny,Zeny - @needmon;
- getitem 558,@flag_num;
- mes "[Stephen]";
- mes "There you go!";
- mes "You can give that to someone as a gift, or enjoy it yourself!";
- mes "Mmm....sweet chocolate...";
- mes "Visit me anytime...!";
- close;
-
-L_ERR:
- mes "[Stephen]";
- mes "I'm sorry but I can't give you that many.";
-L_NONE:
- close;
-
-L_NOTENO:
- mes "[Stephen]";
- mes "I'm sorry but it seems you cant afford to buy these of me.";
- close;
-}
-
-// Jainie -- Gives information about Valentine Event ------------------------
-alberta.gat,29,243,4 script Jainie#val1 53,{
- mes "[Jainie]";
- mes "You know what? The chocolate that my boyfriend sells are from me!";
- mes "I made them by myself. Now I need some Milk for my special White Chocolate.";
- next;
- mes "[Jainie]";
- mes "You know ... In cetain countries, there's a tradition of presenting chocolates to a person that you love...";
- mes "They call it ^3355FFValentine's Day^000000.";
- next;
- mes "[Jainie]";
- mes "So I gave him my delicious chocolate...";
- mes "And then he made me cook a lot more...";
- mes "And now he is selling them to everyone.";
- mes "I guess he really enjoyed it.";
- mes "But, I do feel good when people buy something I have made.";
- next;
- mes "[Jainie]";
- mes "It would be great if you bought some too...";
- mes "I will be making white chocolates for a while so...";
- next;
- menu "I want some white chocolate!",M_CHOCO,"No thanks.",-;
-
- mes "[Jainie]";
- mes "You don't like white chocolate?";
- mes "Then buy some Stephen's black one!";
- close;
-
-M_CHOCO:
- mes "[Jainie]";
- mes "I can't sell you more then 5 at once....but, if you really need more....";
- mes "you can come back again.";
- mes "So how many do you want? 1 portion is 4500z + 1 Milk.";
- next;
- set @needmon,0;
- input @flag_num;
- if (@flag_num == 0) goto L_NONE;
- if (@flag_num > 5) goto L_ERR;
- set @needmon,@flag_num*4500;
- if (Zeny < @needmon) goto L_NOTENO;
- if (countitem(519) < @flag_num) goto L_NOMILK;
- set Zeny,Zeny - @needmon;
- delitem 519,@flag_num;
- getitem 561,@flag_num;
- mes "[Jainie]";
- mes "There you go!";
- mes "You can give that to someone as a gift, or enjoy it yourself!";
- mes "Mmm... sweet chocolate...";
- mes "Visit me anytime...!";
- close;
-
-L_ERR:
- mes "[Jainie]";
- mes "I'm sorry but I can't give you that many.";
-L_NONE:
- close;
-
-L_NOTENO:
- mes "[Jainie]";
- mes "I'm sorry but it seems you cant afford to buy these of me.";
- close;
-
-L_NOMILK:
- mes "[Jainie]";
- mes "You need "+@flag_num+" Milk for "+@flag_num+" portions of my special White Chocolate...";
- close;
-}
-
-// Carl Orleans -- Valentine Event Chocolate maker ------------------
-prt_castle.gat,54,34,4 script Carl Orleans#val1 47,{
- mes "[Carl Orleans]";
- mes "Yes? What can I cook for you?";
- next;
- menu "Black handmade Chocolate, please",-,"I want a White handmade Chocolate...",M_WHITE,"I'm lost, sorry to bother you.",M_END;
-
- mes "[Carl Orleans]";
- mes "Well, I just might be able to fulfill your needs...";
- next;
- if (countitem(558)<3) {
- mes "[Carl Orleans]";
- mes "I'm sorry you do not have enough Chocolate Bars to do this.";
- if(rand(2))mes "They say Stephen from Alberta used to sell good Chocolate.";
- close;
- }
- delitem 558,3;
- mes "[Carl Orleans]";
- mes "You got 3 pieces of pure chocolate I see.";
- mes "Give them to me...";
- next;
- mes "[Carl Orleans]";
- mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely.";
- next;
- mes "[Carl Orleans]";
- mes "....Hmmmmmm.....";
- mes "Well...";
- next;
- getitem 559,1;
- mes "[Carl Orleans]";
- mes "Here.";
- if(rand(2))close;
- mes "I hope you give it to someone special, because its a special chocolate.";
- mes "As you know... only I can create this.";
- next;
- mes "[Carl Orleans]";
- mes "Enjoy.";
- close;
-
-M_WHITE:
- mes "[Carl Orleans]";
- mes "Well, I just might be able to fulfill your needs...";
- next;
- if (countitem(561)<3) {
- mes "[Carl Orleans]";
- mes "I'm sorry you do not have enough White Chocolate Bars to do this.";
- if(rand(2))mes "They say Jainie from Alberta used to sell good White Chocolate.";
- close;
- }
- delitem 561,3;
- mes "[Carl Orleans]";
- mes "You got 3 pieces of pure white chocolate I see.";
- mes "Give them to me...";
- next;
- mes "[Carl Orleans]";
- mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely.";
- next;
- mes "[Carl Orleans]";
- mes "....Hmmmmmm.....";
- mes "Well...";
- next;
- getitem 560,1;
- mes "[Carl Orleans]";
- mes "Here.";
- if(rand(2))close;
- mes "I hope you give it to someone special, because its a special chocolate.";
- mes "As you know... only I can create this.";
- next;
- mes "[Carl Orleans]";
- mes "Enjoy.";
- close;
-
-M_END:
- mes "[Carl Orleans]";
- mes "Oh.. well, if you want me to make some of my special handmade Chocolate....";
- mes "You will need to give me at least ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000.";
- if(rand(2))close;
- next;
- mes "[Carl Orleans]";
- mes "That's right, only ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000.";
- mes "Bring them to me and you'll get what you came for.";
- if(rand(2))close;
- next;
- mes "[Carl Orleans]";
- mes "See You.";
- close;
-}
+//===== Athena Script ========================================
+//= Valentine Event Script + EXP bonus
+//===== By: ==================================================
+//= Lupus (based on Muad_Dib's work)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version 45xx+
+//===== Description: =========================================
+// Close to other official stValentine event (added white chocolate)
+// Custom: Handmade choco gives some EXP bonuses to married people
+//
+//===== Additional Comments: =================================
+//= WARNING!! To use this event, dicable original valentinesday.txt
+//= You can use this event from 12 till 16 February 8) [Lupus]
+//= 1.1 Removed Duplicates [Silent]
+//============================================================
+
+// Tine - Valentine Event Chocolate Even Guide ------------------
+prontera.gat,156,172,4 script Tine 58,{
+// Debug info for item effects and tricky conditions 8)
+// mes "@dsv: "+@dsv;
+// mes "ispartneron()=="+ispartneron();
+// mes "sex == "+sex;
+// if(@dsv == gettime(3)+1) mes "@dsv == gettime(3)+1";
+
+ mes "[Tine]";
+ mes "The legend says that on 14th February... on the Day of Saint Valentine...";
+ mes "Only in Run-Midgard kingdom...";
+ next;
+ specialeffect 417;
+ mes "[Tine]";
+ mes "Some married chocolate lovers almost double their experience at trainings!";
+ mes "But everything isn't so simply...";
+ next;
+ menu "Wow! Tell me more!",M_INFO,"Marri... what?",-;
+
+ mes "[Tine]";
+ mes "Are you a single?";
+ mes "Today is a great date to ask your beloved half for marriage!";
+ next;
+ mes "[Tine]";
+ mes "The Marriage fee is ridiculous low these days!";
+ close;
+
+M_INFO:
+ mes "[Tine]";
+ mes "The magic effect posesses only handmade chocolate from grand-grand-grand-whoever recipes!";
+ next;
+ mes "[Tine]";
+ mes "It being known that Black Handmade Chocolate works on married guys... And the White one on the married girls!";
+ mes "If you lose your wedding ring... then alas, it won't work on you.";
+ next;
+ mes "[Tine]";
+ mes "On having a Chocolate, you should put off your ring then... put it back... And if your partner is online, then magc would last till the next hour!";
+ next;
+ mes "[Tine]";
+ mes "Rumors bark that guys and gals have +50% EXP bonuses on FIVE different races of the monsters... Exluding bloody bosses, of course.";
+ next;
+ mes "[Tine]";
+ mes "There's a fameous confectioner in the Castle of Prontera! He's the one you need.";
+ close;
+
+OnInit:
+ //559,Hand-made_Chocolate
+ setitemscript 559,"{ itemheal 50,50; if(sex==0 || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }";
+ //560,Hand-made_White_Chocolate
+ setitemscript 560,"{ itemheal 50,50; if(sex || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }";
+
+ //2634,Wedding_Ring_M,Wedding Ring,5,,10,0,,0,,0,127918079,7,1,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; }
+ setitemscript 2634,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,5,50; bonus2 bExpAddRace,6,50; bonus2 bExpAddRace,7,50; bonus2 bExpAddRace,8,50; bonus2 bExpAddRace,1,50; } }";
+ //2635,Wedding_Ring_F,Wedding Ring,5,,10,0,,0,,0,127918079,7,0,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; }
+ setitemscript 2635,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,0,50; bonus2 bExpAddRace,9,50; bonus2 bExpAddRace,2,50; bonus2 bExpAddRace,3,50; bonus2 bExpAddRace,4,50; } }";
+ end;
+}
+
+// Stephen - Valentine Event Chocolate seller ------------------
+alberta.gat,26,243,4 script Stephen#val1 58,{
+ mes "[Stephen]";
+ mes "Guess what I've got?";
+ mes "A tasty treat not easily found in Rune-Midgard....";
+ next;
+ mes "[Stephen]";
+ mes "Chocolate!";
+ mes "That's right, don't you love chocolate.... I do.";
+ mes "And you are in luck, because I'm selling them for only 5,000 zeny a piece!";
+ next;
+ menu "I want some chocolate!",M_CHOCO,"No thanks.",-;
+
+ mes "[Stephen]";
+ mes "You don't want any chocolate?";
+ mes "I'm telling you! You'll regret it!";
+ mes "You better get some now... you won't come across Chocolate like this ever again!";
+ mes "Think it over and visit me again sometime.";
+ close;
+
+M_CHOCO:
+ mes "[Stephen]";
+ mes "Hah!";
+ mes "I knew it!";
+ mes "But I can't sell you more then 5 at once....but, if you really need more....";
+ mes "you can come back again.";
+ mes "So how many do you want?";
+ next;
+ set @needmon,0;
+ input @flag_num;
+ if (@flag_num == 0) goto L_NONE;
+ if (@flag_num > 5) goto L_ERR;
+ set @needmon,@flag_num*5000;
+ if (Zeny < @needmon) goto L_NOTENO;
+ set Zeny,Zeny - @needmon;
+ getitem 558,@flag_num;
+ mes "[Stephen]";
+ mes "There you go!";
+ mes "You can give that to someone as a gift, or enjoy it yourself!";
+ mes "Mmm....sweet chocolate...";
+ mes "Visit me anytime...!";
+ close;
+
+L_ERR:
+ mes "[Stephen]";
+ mes "I'm sorry but I can't give you that many.";
+L_NONE:
+ close;
+
+L_NOTENO:
+ mes "[Stephen]";
+ mes "I'm sorry but it seems you cant afford to buy these of me.";
+ close;
+}
+
+// Jainie -- Gives information about Valentine Event ------------------------
+alberta.gat,29,243,4 script Jainie#val1 53,{
+ mes "[Jainie]";
+ mes "You know what? The chocolate that my boyfriend sells are from me!";
+ mes "I made them by myself. Now I need some Milk for my special White Chocolate.";
+ next;
+ mes "[Jainie]";
+ mes "You know ... In cetain countries, there's a tradition of presenting chocolates to a person that you love...";
+ mes "They call it ^3355FFValentine's Day^000000.";
+ next;
+ mes "[Jainie]";
+ mes "So I gave him my delicious chocolate...";
+ mes "And then he made me cook a lot more...";
+ mes "And now he is selling them to everyone.";
+ mes "I guess he really enjoyed it.";
+ mes "But, I do feel good when people buy something I have made.";
+ next;
+ mes "[Jainie]";
+ mes "It would be great if you bought some too...";
+ mes "I will be making white chocolates for a while so...";
+ next;
+ menu "I want some white chocolate!",M_CHOCO,"No thanks.",-;
+
+ mes "[Jainie]";
+ mes "You don't like white chocolate?";
+ mes "Then buy some Stephen's black one!";
+ close;
+
+M_CHOCO:
+ mes "[Jainie]";
+ mes "I can't sell you more then 5 at once....but, if you really need more....";
+ mes "you can come back again.";
+ mes "So how many do you want? 1 portion is 4500z + 1 Milk.";
+ next;
+ set @needmon,0;
+ input @flag_num;
+ if (@flag_num == 0) goto L_NONE;
+ if (@flag_num > 5) goto L_ERR;
+ set @needmon,@flag_num*4500;
+ if (Zeny < @needmon) goto L_NOTENO;
+ if (countitem(519) < @flag_num) goto L_NOMILK;
+ set Zeny,Zeny - @needmon;
+ delitem 519,@flag_num;
+ getitem 561,@flag_num;
+ mes "[Jainie]";
+ mes "There you go!";
+ mes "You can give that to someone as a gift, or enjoy it yourself!";
+ mes "Mmm... sweet chocolate...";
+ mes "Visit me anytime...!";
+ close;
+
+L_ERR:
+ mes "[Jainie]";
+ mes "I'm sorry but I can't give you that many.";
+L_NONE:
+ close;
+
+L_NOTENO:
+ mes "[Jainie]";
+ mes "I'm sorry but it seems you cant afford to buy these of me.";
+ close;
+
+L_NOMILK:
+ mes "[Jainie]";
+ mes "You need "+@flag_num+" Milk for "+@flag_num+" portions of my special White Chocolate...";
+ close;
+}
+
+// Carl Orleans -- Valentine Event Chocolate maker ------------------
+prt_castle.gat,54,34,4 script Carl Orleans#val1 47,{
+ mes "[Carl Orleans]";
+ mes "Yes? What can I cook for you?";
+ next;
+ menu "Black handmade Chocolate, please",-,"I want a White handmade Chocolate...",M_WHITE,"I'm lost, sorry to bother you.",M_END;
+
+ mes "[Carl Orleans]";
+ mes "Well, I just might be able to fulfill your needs...";
+ next;
+ if (countitem(558)<3) {
+ mes "[Carl Orleans]";
+ mes "I'm sorry you do not have enough Chocolate Bars to do this.";
+ if(rand(2))mes "They say Stephen from Alberta used to sell good Chocolate.";
+ close;
+ }
+ delitem 558,3;
+ mes "[Carl Orleans]";
+ mes "You got 3 pieces of pure chocolate I see.";
+ mes "Give them to me...";
+ next;
+ mes "[Carl Orleans]";
+ mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely.";
+ next;
+ mes "[Carl Orleans]";
+ mes "....Hmmmmmm.....";
+ mes "Well...";
+ next;
+ getitem 559,1;
+ mes "[Carl Orleans]";
+ mes "Here.";
+ if(rand(2))close;
+ mes "I hope you give it to someone special, because its a special chocolate.";
+ mes "As you know... only I can create this.";
+ next;
+ mes "[Carl Orleans]";
+ mes "Enjoy.";
+ close;
+
+M_WHITE:
+ mes "[Carl Orleans]";
+ mes "Well, I just might be able to fulfill your needs...";
+ next;
+ if (countitem(561)<3) {
+ mes "[Carl Orleans]";
+ mes "I'm sorry you do not have enough White Chocolate Bars to do this.";
+ if(rand(2))mes "They say Jainie from Alberta used to sell good White Chocolate.";
+ close;
+ }
+ delitem 561,3;
+ mes "[Carl Orleans]";
+ mes "You got 3 pieces of pure white chocolate I see.";
+ mes "Give them to me...";
+ next;
+ mes "[Carl Orleans]";
+ mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely.";
+ next;
+ mes "[Carl Orleans]";
+ mes "....Hmmmmmm.....";
+ mes "Well...";
+ next;
+ getitem 560,1;
+ mes "[Carl Orleans]";
+ mes "Here.";
+ if(rand(2))close;
+ mes "I hope you give it to someone special, because its a special chocolate.";
+ mes "As you know... only I can create this.";
+ next;
+ mes "[Carl Orleans]";
+ mes "Enjoy.";
+ close;
+
+M_END:
+ mes "[Carl Orleans]";
+ mes "Oh.. well, if you want me to make some of my special handmade Chocolate....";
+ mes "You will need to give me at least ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000.";
+ if(rand(2))close;
+ next;
+ mes "[Carl Orleans]";
+ mes "That's right, only ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000.";
+ mes "Bring them to me and you'll get what you came for.";
+ if(rand(2))close;
+ next;
+ mes "[Carl Orleans]";
+ mes "See You.";
+ close;
+}
diff --git a/npc/events/custom/xmas_rings_event.txt b/npc/events/custom/xmas_rings_event.txt
index 7137492ea..f3970327b 100644
--- a/npc/events/custom/xmas_rings_event.txt
+++ b/npc/events/custom/xmas_rings_event.txt
@@ -1,193 +1,193 @@
-//===== eAthena Script =======================================
-//= Karachun Event (Xmas Rings Quest)
-//===== By: ==================================================
-//= Lupus (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena Version; 4880+ (with 'setItemScript' command)
-//===== Description: =========================================
-//= Custom event: Karachun (from 8 Dec till 8 Jan), X-Mas, HNY
-//===== Additional Comments: =================================
-//= 1.0 Tested, fully working. 1.0a a few typos fix
-//= 1.1 Readded Mdef +1 and Luk +1 to Santa's Hat [Lupus]
-//============================================================
-
-
-prontera.gat,156,174,4 script Snower 713,{
- mes "[Snower]";
- if(Q_XMSRINGS==2){
- mes "Oh.. is it true? You've helped my sis Sneewy? Thank you.";
- }else if(Q_XMSRINGS==3){
- mes "Snoowy's sent me a bird with a message. She told me about your help...";
- mes "I'll tell you a secret of the magic rings.";
- emotion e_no1;
- next;
- mes "[Snower]";
- mes "They have magic power only from 8 December till 8 January.";
- next;
- mes "[Snower]";
- mes "By the way, just put on Santa's Hat to discover their true power.";
- next;
- mes "[Snower]";
- mes "If you put on both rings their power would be doubled.";
- mes "Have a nice day!";
- close;
- }else{
- mes "Hi! Two my sisters and I are preparing gifts for the whole 3 holidays!";
- }
- emotion e_sob;
- next;
- menu "Where are your sisters?",-, "What holidays?",M_PR,"What gifts?",M_WRAP,"May I help you?",M_QUEST;
-
- mes "[Snower]";
- mes "My younger sis Sneewy's left to some faraway land to prepare gifts for their poor children... I don't know where. You should ask my elder sis and her birdies.";
- next;
- mes "[Snower]";
- mes "My elder sis? Her name's Snoowy. She's sailed to some green island... She's talking about some gifts for dolphins or something...";
- close;
-
-M_PR:
- mes "[Snower]";
- mes "The whole three holidays? Well they come one after another!";
- mes "^000080The Christmas^000000, ^FF0000Karachun^000000 and ^008000New Year Eve^000000!";
- next;
- mes "[Snower]";
- mes "^FF0000Karachun^000000? Heh... This is an old pagans festival. They used to celebrate it before the appearance of HNY and XMas, you know.";
- next;
- goto M_QUEST;
-
-M_WRAP:
- mes "[Snower]";
- mes "My sisters say that all the gifts should look the same way. Or else some children might fight for fancy ones!";
- next;
- mes "[Snower]";
- mes "Would you like me to wrap your fancy gift boxes with a gray paper?";
- next;
- menu "Wrap them, please!",-, "No, thanks.",M_QUEST;
-
- set @prizes, countitem(664)+countitem(665)+countitem(666)+countitem(667);
- if( @prizes == 0){
- mes "[Snower]";
- mes "I don't see any gifts in fancy boxes on you...";
- if(countitem(644))mes "You've got only gray boxes.";
- close;
- }
- delitem 664,countitem(664);
- delitem 665,countitem(665);
- delitem 666,countitem(666);
- delitem 667,countitem(667);
- getitem 644,@prizes;
-
- mes "[Snower]";
- mes "*shuffle* Here you go.";
- next;
-
-M_QUEST:
- mes "[Snower]";
- mes "I wish you find my sisters ASAP... They need help.";
- if(Q_XMSRINGS==0) set Q_XMSRINGS,1;
- close;
-
-OnInit:
-//Santa's Hat
- setitemscript 2236,"{ bonus bMdef,1; bonus bLuk,1; if(isequipped(2636,2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 410; end;} if(isequipped(2636)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 72;} if(isequipped(2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 338;}}";
-//Gold Xmas Ring
- setitemscript 2636,"{ bonus bLoseSPWhenUnequip,30; if(isequipped(2236)==0)end; if(getskilllv(28)){skill 51,4+isequipped(2637);}else{skill 28,1+4*isequipped(2637);} }";
-//Silver Xmas Ring
- setitemscript 2637,"{ bonus bDamageWhenUnequip,40; if(isequipped(2236)==0)end; if(getskilllv(26)){skill 40,1;}else{skill 26,1+isequipped(2636);} }";
- end;
-}
-
-louyang.gat,224,249,4 script Sneewy 717,{
- mes "[Sneewy]";
- if(Q_XMSRINGS==0){
- mes "Hi! I'm waithing for my sister's birdy with mail...";
- emotion e_sob;
- close;
- }
- if(Q_XMSRINGS==1){
- mes "I wish I had 4 more gray Gift Boxes for native children...";
- emotion e_sob;
- next;
- mes "[Sneewy]";
- mes "Oh, hello. Has my brother Snower told you everything?";
- next;
- menu "Here are your 4 Gift Boxes",-, "I don't know any Snowhatevers...",M_END;
-
- mes "[Sneewy]";
- if(countitem(644)<4){
- mes "Gimme 4 gifts for poor kids... Wait, you haven't got 4 of them!";
- emotion e_sry;
- close;
- }
- set Q_XMSRINGS,2;
- delitem 644,4;
- getnameditem 2637,strcharinfo(0);
- emotion e_kis2;
- mes "Thank you! Here's my li'l something for you!";
- next;
- mes "[Sneewy]";
- mes "By the way, if you put on 2 different rings then your holidays leveling would be easier!";
- close;
- }
- emotion e_thx;
- mes "Thanks again! No children will meet the holidays without the gifts!";
- close;
-
-M_END:
- mes "[Sneewy]";
- mes "Pity... I've got a magic Santa's ring... I'd exchange it for 4 Gift Boxes...";
- emotion e_swt;
- close;
-}
-
-izlu2dun.gat,133,160,2 script Snoowy 714,{
- mes "[Snoowy]";
- if(Q_XMSRINGS==0){
- mes "Helloooou! Do you know my bro and sis? How so? My brother Snower's well known in Prontera!! Just ask any child there.";
- emotion e_hmm;
- close;
- }
- if(Q_XMSRINGS==1){
- mes "Darn... How could poor children be more important than the marine folks.. Am I wrong?";
- next;
- mes "[Snoowy]";
- mes "Errr. Helloou there. My sister Sneewy's sent me a birdie message. The letter was wet and I couldn't read anything but some ending letters of her address...";
- next;
- mes "[Snoowy]";
- mes "Look, it's something like 'yang' in the very end... Hmm... She must be misspelled 'Al Doo Boryang'...";
- close;
- }
- if(Q_XMSRINGS==2){
- mes "You've helped my sis? It's just great!";
- next;
- mes "[Snoowy]";
- mes "But I too need 3 more gifts for my marine folk friends...";
- next;
- menu "Have these gifts!",-, "I need a li'l something in return",M_END;
-
- mes "[Snoowy]";
- if(countitem(644)<3){
- mes "Oops!! You haven't got 3 gray gift boxes on you.";
- emotion e_sry;
- close;
- }
- set Q_XMSRINGS,3;
- delitem 644,3;
- getnameditem 2636,strcharinfo(0);
- emotion e_kis;
- mes "Thaank yoouu! Have this magic ring!";
- close;
- }
- emotion e_thx;
- mes "Oh... the whole marine folk send you their thanks! They love presents so much!!!";
- if(rand(2))mes "Didn't you know that Santa's Hat reveals the real power of the rings?";
- close;
-
-M_END:
- mes "[Snoowy]";
- mes "I'd exchange a GOLD magic ring for 3 gift boxes...";
- emotion e_swt;
- close;
-}
+//===== eAthena Script =======================================
+//= Karachun Event (Xmas Rings Quest)
+//===== By: ==================================================
+//= Lupus (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena Version; 4880+ (with 'setItemScript' command)
+//===== Description: =========================================
+//= Custom event: Karachun (from 8 Dec till 8 Jan), X-Mas, HNY
+//===== Additional Comments: =================================
+//= 1.0 Tested, fully working. 1.0a a few typos fix
+//= 1.1 Readded Mdef +1 and Luk +1 to Santa's Hat [Lupus]
+//============================================================
+
+
+prontera.gat,156,174,4 script Snower 713,{
+ mes "[Snower]";
+ if(Q_XMSRINGS==2){
+ mes "Oh.. is it true? You've helped my sis Sneewy? Thank you.";
+ }else if(Q_XMSRINGS==3){
+ mes "Snoowy's sent me a bird with a message. She told me about your help...";
+ mes "I'll tell you a secret of the magic rings.";
+ emotion e_no1;
+ next;
+ mes "[Snower]";
+ mes "They have magic power only from 8 December till 8 January.";
+ next;
+ mes "[Snower]";
+ mes "By the way, just put on Santa's Hat to discover their true power.";
+ next;
+ mes "[Snower]";
+ mes "If you put on both rings their power would be doubled.";
+ mes "Have a nice day!";
+ close;
+ }else{
+ mes "Hi! Two my sisters and I are preparing gifts for the whole 3 holidays!";
+ }
+ emotion e_sob;
+ next;
+ menu "Where are your sisters?",-, "What holidays?",M_PR,"What gifts?",M_WRAP,"May I help you?",M_QUEST;
+
+ mes "[Snower]";
+ mes "My younger sis Sneewy's left to some faraway land to prepare gifts for their poor children... I don't know where. You should ask my elder sis and her birdies.";
+ next;
+ mes "[Snower]";
+ mes "My elder sis? Her name's Snoowy. She's sailed to some green island... She's talking about some gifts for dolphins or something...";
+ close;
+
+M_PR:
+ mes "[Snower]";
+ mes "The whole three holidays? Well they come one after another!";
+ mes "^000080The Christmas^000000, ^FF0000Karachun^000000 and ^008000New Year Eve^000000!";
+ next;
+ mes "[Snower]";
+ mes "^FF0000Karachun^000000? Heh... This is an old pagans festival. They used to celebrate it before the appearance of HNY and XMas, you know.";
+ next;
+ goto M_QUEST;
+
+M_WRAP:
+ mes "[Snower]";
+ mes "My sisters say that all the gifts should look the same way. Or else some children might fight for fancy ones!";
+ next;
+ mes "[Snower]";
+ mes "Would you like me to wrap your fancy gift boxes with a gray paper?";
+ next;
+ menu "Wrap them, please!",-, "No, thanks.",M_QUEST;
+
+ set @prizes, countitem(664)+countitem(665)+countitem(666)+countitem(667);
+ if( @prizes == 0){
+ mes "[Snower]";
+ mes "I don't see any gifts in fancy boxes on you...";
+ if(countitem(644))mes "You've got only gray boxes.";
+ close;
+ }
+ delitem 664,countitem(664);
+ delitem 665,countitem(665);
+ delitem 666,countitem(666);
+ delitem 667,countitem(667);
+ getitem 644,@prizes;
+
+ mes "[Snower]";
+ mes "*shuffle* Here you go.";
+ next;
+
+M_QUEST:
+ mes "[Snower]";
+ mes "I wish you find my sisters ASAP... They need help.";
+ if(Q_XMSRINGS==0) set Q_XMSRINGS,1;
+ close;
+
+OnInit:
+//Santa's Hat
+ setitemscript 2236,"{ bonus bMdef,1; bonus bLuk,1; if(isequipped(2636,2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 410; end;} if(isequipped(2636)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 72;} if(isequipped(2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 338;}}";
+//Gold Xmas Ring
+ setitemscript 2636,"{ bonus bLoseSPWhenUnequip,30; if(isequipped(2236)==0)end; if(getskilllv(28)){skill 51,4+isequipped(2637);}else{skill 28,1+4*isequipped(2637);} }";
+//Silver Xmas Ring
+ setitemscript 2637,"{ bonus bDamageWhenUnequip,40; if(isequipped(2236)==0)end; if(getskilllv(26)){skill 40,1;}else{skill 26,1+isequipped(2636);} }";
+ end;
+}
+
+louyang.gat,224,249,4 script Sneewy 717,{
+ mes "[Sneewy]";
+ if(Q_XMSRINGS==0){
+ mes "Hi! I'm waithing for my sister's birdy with mail...";
+ emotion e_sob;
+ close;
+ }
+ if(Q_XMSRINGS==1){
+ mes "I wish I had 4 more gray Gift Boxes for native children...";
+ emotion e_sob;
+ next;
+ mes "[Sneewy]";
+ mes "Oh, hello. Has my brother Snower told you everything?";
+ next;
+ menu "Here are your 4 Gift Boxes",-, "I don't know any Snowhatevers...",M_END;
+
+ mes "[Sneewy]";
+ if(countitem(644)<4){
+ mes "Gimme 4 gifts for poor kids... Wait, you haven't got 4 of them!";
+ emotion e_sry;
+ close;
+ }
+ set Q_XMSRINGS,2;
+ delitem 644,4;
+ getnameditem 2637,strcharinfo(0);
+ emotion e_kis2;
+ mes "Thank you! Here's my li'l something for you!";
+ next;
+ mes "[Sneewy]";
+ mes "By the way, if you put on 2 different rings then your holidays leveling would be easier!";
+ close;
+ }
+ emotion e_thx;
+ mes "Thanks again! No children will meet the holidays without the gifts!";
+ close;
+
+M_END:
+ mes "[Sneewy]";
+ mes "Pity... I've got a magic Santa's ring... I'd exchange it for 4 Gift Boxes...";
+ emotion e_swt;
+ close;
+}
+
+izlu2dun.gat,133,160,2 script Snoowy 714,{
+ mes "[Snoowy]";
+ if(Q_XMSRINGS==0){
+ mes "Helloooou! Do you know my bro and sis? How so? My brother Snower's well known in Prontera!! Just ask any child there.";
+ emotion e_hmm;
+ close;
+ }
+ if(Q_XMSRINGS==1){
+ mes "Darn... How could poor children be more important than the marine folks.. Am I wrong?";
+ next;
+ mes "[Snoowy]";
+ mes "Errr. Helloou there. My sister Sneewy's sent me a birdie message. The letter was wet and I couldn't read anything but some ending letters of her address...";
+ next;
+ mes "[Snoowy]";
+ mes "Look, it's something like 'yang' in the very end... Hmm... She must be misspelled 'Al Doo Boryang'...";
+ close;
+ }
+ if(Q_XMSRINGS==2){
+ mes "You've helped my sis? It's just great!";
+ next;
+ mes "[Snoowy]";
+ mes "But I too need 3 more gifts for my marine folk friends...";
+ next;
+ menu "Have these gifts!",-, "I need a li'l something in return",M_END;
+
+ mes "[Snoowy]";
+ if(countitem(644)<3){
+ mes "Oops!! You haven't got 3 gray gift boxes on you.";
+ emotion e_sry;
+ close;
+ }
+ set Q_XMSRINGS,3;
+ delitem 644,3;
+ getnameditem 2636,strcharinfo(0);
+ emotion e_kis;
+ mes "Thaank yoouu! Have this magic ring!";
+ close;
+ }
+ emotion e_thx;
+ mes "Oh... the whole marine folk send you their thanks! They love presents so much!!!";
+ if(rand(2))mes "Didn't you know that Santa's Hat reveals the real power of the rings?";
+ close;
+
+M_END:
+ mes "[Snoowy]";
+ mes "I'd exchange a GOLD magic ring for 3 gift boxes...";
+ emotion e_swt;
+ close;
+}
diff --git a/npc/events/dumplingfestival.txt b/npc/events/dumplingfestival.txt
index ea6e265c9..7f96017fd 100644
--- a/npc/events/dumplingfestival.txt
+++ b/npc/events/dumplingfestival.txt
@@ -1,112 +1,112 @@
-//===== Athena Script =======================================
-//= Imitation of Dumpling Festival
-//===== By ================================================
-//= Massdriller
-//===== Version ===========================================
-//= 1.01
-//===== Compatible With ===================================
-//= eAthena 0.52+
-//===== Description =======================================
-//= A complete redering of the Dumpling Festival.
-//===== Comments ==========================================
-//= Ver 1.0- Duplicate of MRO's Dumpling Event
-//= 1.01 fixed bugs [Lupus]
-//=========================================================
-
-payon.gat,93,81,4 script Exorcist Master Fahae 834,{
-
- mes "[Exorcist Master Fahae]";
- mes "Greetings young warrior, I'm the Exorcist Master Fahae.";
- mes "I have been tracking the elusive Bacsojin for some time.";
- next;
- mes "[Exorcist Master Fahae]";
- mes "I feel it is time I let another warrior try to complete";
- mes "my quest. I have some items to assist you in my quest.";
- next;
- menu "I wish to buy",-, "No thanks",M_FIN;
-
- mes "[Exorcist Master Fahae]";
- mes "I have 2 items which might become useful to you.";
- next;
- menu "Realgar Wine",-, "Exorcize Herb",M_HERB;
-
- mes "[Exorcist Master Fahae]";
- mes "How many do you require?";
- mes "You may only buy 5 at one time.";
- mes "Each costs 20000z.";
- mes "(Type in 0 to cancel)";
- next;
- input @input;
- if(@input==0) close;
- if(@input>5) goto L_SORRY;
- if(Zeny< @input*20000) goto L_NOZENY;
- set Zeny,Zeny-20000*@input;
- getitem 682,@input;
- mes "[Exorcist Master Fahae]";
- mes "Here you go, I hope you may succeed in my quest.";
- close;
-
-L_SORRY:
- mes "[Exorcist Master Fahae]";
- mes "You must not be stingy, it is the path of God to be honest.";
- close;
-
-M_FIN:
- mes "[Exorcist Master Fahae]";
- mes "The path of fully venquishing evil is far, help me in the way of God.";
- close;
-
-M_HERB:
- mes "[Exorcist Master Fahae]";
- mes "How many do you require?";
- mes "You may only buy 5 at one time.";
- mes "Each costs 10000z.";
- mes "(Type in 0 to cancel)";
- next;
- input @input;
- if(@input==0) close;
- if(@input>5) goto L_SORRY;
- if(Zeny< @input*10000) goto L_NOZENY;
- set Zeny,Zeny-10000*@input;
- getitem 683,@input;
- mes "[Exorcist Master Fahae]";
- mes "Here you go, I hope you may succeed in my quest.";
- close;
-
-L_NOZENY:
- mes "[Exorcist Master Fahae]";
- mes "Money doesn't bring joy to everyone, but we need it to support the temple and myself. Please, try to kill some monsters and take their drops.";
- close;
-}
-
-//////////////////////////////////////////////
-// Monster Spawning /\Secial only for event.//
-//////////////////////////////////////////////
-
-// ~Dumpling~
-gef_fild00.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-gef_fild07.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-gef_fild04.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-gef_fild00.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-prt_fild06.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-prt_fild01.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-prt_fild05.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-prt_fild08.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild04.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-moc_fild02.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild01.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild07.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-moc_fild03.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild06.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild05.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild02.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-pay_fild09.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
-
-// ~Bacsojin~
-moc_fild03.gat,0,0,0,0 monster Bacsojin 1518,1,60000,66000
-
-// ~Chung E~
-moc_fild03.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
-moc_fild13.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
-pay_fild01.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
+//===== Athena Script =======================================
+//= Imitation of Dumpling Festival
+//===== By ================================================
+//= Massdriller
+//===== Version ===========================================
+//= 1.01
+//===== Compatible With ===================================
+//= eAthena 0.52+
+//===== Description =======================================
+//= A complete redering of the Dumpling Festival.
+//===== Comments ==========================================
+//= Ver 1.0- Duplicate of MRO's Dumpling Event
+//= 1.01 fixed bugs [Lupus]
+//=========================================================
+
+payon.gat,93,81,4 script Exorcist Master Fahae 834,{
+
+ mes "[Exorcist Master Fahae]";
+ mes "Greetings young warrior, I'm the Exorcist Master Fahae.";
+ mes "I have been tracking the elusive Bacsojin for some time.";
+ next;
+ mes "[Exorcist Master Fahae]";
+ mes "I feel it is time I let another warrior try to complete";
+ mes "my quest. I have some items to assist you in my quest.";
+ next;
+ menu "I wish to buy",-, "No thanks",M_FIN;
+
+ mes "[Exorcist Master Fahae]";
+ mes "I have 2 items which might become useful to you.";
+ next;
+ menu "Realgar Wine",-, "Exorcize Herb",M_HERB;
+
+ mes "[Exorcist Master Fahae]";
+ mes "How many do you require?";
+ mes "You may only buy 5 at one time.";
+ mes "Each costs 20000z.";
+ mes "(Type in 0 to cancel)";
+ next;
+ input @input;
+ if(@input==0) close;
+ if(@input>5) goto L_SORRY;
+ if(Zeny< @input*20000) goto L_NOZENY;
+ set Zeny,Zeny-20000*@input;
+ getitem 682,@input;
+ mes "[Exorcist Master Fahae]";
+ mes "Here you go, I hope you may succeed in my quest.";
+ close;
+
+L_SORRY:
+ mes "[Exorcist Master Fahae]";
+ mes "You must not be stingy, it is the path of God to be honest.";
+ close;
+
+M_FIN:
+ mes "[Exorcist Master Fahae]";
+ mes "The path of fully venquishing evil is far, help me in the way of God.";
+ close;
+
+M_HERB:
+ mes "[Exorcist Master Fahae]";
+ mes "How many do you require?";
+ mes "You may only buy 5 at one time.";
+ mes "Each costs 10000z.";
+ mes "(Type in 0 to cancel)";
+ next;
+ input @input;
+ if(@input==0) close;
+ if(@input>5) goto L_SORRY;
+ if(Zeny< @input*10000) goto L_NOZENY;
+ set Zeny,Zeny-10000*@input;
+ getitem 683,@input;
+ mes "[Exorcist Master Fahae]";
+ mes "Here you go, I hope you may succeed in my quest.";
+ close;
+
+L_NOZENY:
+ mes "[Exorcist Master Fahae]";
+ mes "Money doesn't bring joy to everyone, but we need it to support the temple and myself. Please, try to kill some monsters and take their drops.";
+ close;
+}
+
+//////////////////////////////////////////////
+// Monster Spawning /\Secial only for event.//
+//////////////////////////////////////////////
+
+// ~Dumpling~
+gef_fild00.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+gef_fild07.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+gef_fild04.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+gef_fild00.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+prt_fild06.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+prt_fild01.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+prt_fild05.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+prt_fild08.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild04.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+moc_fild02.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild01.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild07.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+moc_fild03.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild06.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild05.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild02.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+pay_fild09.gat,0,0,0,0 monster Dumpling 1520,20,60000,66000
+
+// ~Bacsojin~
+moc_fild03.gat,0,0,0,0 monster Bacsojin 1518,1,60000,66000
+
+// ~Chung E~
+moc_fild03.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
+moc_fild13.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
+pay_fild01.gat,0,0,0,0 monster Chung E 1519,1,60000,66000
\ No newline at end of file
diff --git a/npc/events/easter.txt b/npc/events/easter.txt
index 6d3061903..6fcf15049 100644
--- a/npc/events/easter.txt
+++ b/npc/events/easter.txt
@@ -1,202 +1,202 @@
-//===== eAthena Script =======================================
-//= Easter Egg Event
-//===== By: ==================================================
-//= kobra_k88
-//= fixed by Yoshimo
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= Break easter eggs in towns an cities to find chocolates.
-//= Exchange the chocolates for prizes.
-//= Includes Easter egg and Easter bunny mobs.
-//===== Additional Comments: =================================
-//= Not sure about "Gold coin" as being one of the prizes.
-//= fixed infinite gifts [Yor] (thanks to Yoshimo from Freya's forum)
-//============================================================
-
-
-geffen.gat,95,201,3 script Shilo 50,{
- mes "[Shilo]";
- if(easter_Q == 1) goto L_Check;
- mes "*Sigh*... Where is my sister!?";
- next;
- mes "[Shilo]";
- mes "Oh... Hi there! I'm extremely excited! You know why?";
- next;
- mes "[Shilo]";
- mes "My favorite holiday is here... ^D2A200Easter^000000!!";
- next;
- mes "[Shilo]";
- mes "I can't wait to go find some easter eggs...";
- next;
- if(@talked == 1) menu "I want to look for these eggs.",sM_0, "... Eggs? Why?",M_0, "You seriously bore me... *yawn*...",M_End;
- menu "... Eggs? Why?",M_0, "You seriously bore me...*yawn*..",M_End;
-
- M_0:
- mes "[Shilo]";
- mes "You mean you've never been on an ^5533FFEaster Egg Hunt^000000 before?";
- next;
- mes "[Shilo]";
- mes "They're the best! See every year, people from all over hide ^5533FFEaster eggs^000000 through out Rune Midgard.";
- mes "And it's our job to go find as many as possible and collect all of the goodies inside of them.";
- next;
- mes "[Shilo]";
- mes "See, along time ago, the Peco Peco roamed the land free of any hostilities...";
- mes "All over Rune Midgard, they did as the pleased, and they reproduced without any fears.";
- next;
- mes "[Shilo]";
- mes "The Peco Peco population thrived and kept growing... Eventually their numbers got out of hand.";
- mes "The people of Rune Midgard decided that they needed to do something about the overwhelming population of Peco Pecos.";
- next;
- mes "[Shilo]";
- mes "So they set out to destroy as many of the Peco Peco eggs they could find!!";
- next;
- mes "[Shilo]";
- mes "Many children found the destruction of helpless Peco Peco eggs to be unbearable.";
- mes "They were very sad about this and pleaded with their parents to stop.";
- next;
- mes "[Shilo]";
- mes "Unfortunately they could not stop.";
- mes "If they did nothing the fertile lands of Rune Midard would be destoryed by the Peco Pecos.";
- next;
- mes "[Shilo]";
- mes "So they decided to try to convince the children that destroying the eggs was a good thing.";
- mes "The parents starting making fake peco peco eggs that had treats in them.";
- next;
- mes "[Shilo]";
- mes "They hid them all over town and had the children search for them.";
- mes "Once found, the children would break the eggs and find the treats. They would then feel happy about breaking Peco Peco eggs.";
- next;
- mes "[Shilo]";
- mes "Now the Peco Peco has natural enemies, like desert wolves, which keep the Peco Peco population in check.";
- mes "Therefore the people of Rune Midgard no longer have to destroy defenseless Peco Peco eggs.";
- next;
- mes "[Shilo]";
- mes "But we still carry on the tradition of hiding fake eggs all over Rune Midgard every year.";
- mes "And that is the story behind Easter in Rune Midgard.";
- next;
- mes "[Shilo]";
- mes "You know... it looks like I'm going to be here for alonge while. I'll tell you what...";
- next;
- mes "[Shilo]";
- mes "If you go out and find some ^5533FFEaster eggs^000000 and bring me back their special 'treats', I will give you something for them...";
- mes "What do you say?";
- set @talked, 1;
- next;
- menu "What do I have to do?",sM_0, "Nah, I'm to busy.",sM_End;
-
- sM_0:
- mes "[Shilo]";
- mes "All you have to do is go hunt for some Easter eggs which can be found in the towns and cities all over Rune Midgard.";
- next;
- mes "[Shilo]";
- mes "When you find them, break em. If you're lucky, there will be delicious ^D2A200'Chocolates'^000000 inside of them.";
- mes "Find at least ^00950010^000000, and bring them to me and I will give you a ^FF5533prize^000000.";
- next;
- mes "[Shilo]";
- mes "The more you bring to me, the better my gift to you will be.";
- next;
- mes "[Shilo]";
- mes "I'll will give you something for:";
- mes "^00950010 ^D2A200Chocolates"; // 1 gold coin ?
- mes "^5533FF50 ^D2A200Chocolates^000000"; // 1 old blue box
- mes "and ^FF3355150 ^D2A200Chocolates^000000"; // 1 old purple box
- next;
- mes "[Shilo]";
- mes "So what do you say?";
- next;
- menu "Sounds fun, I'll do it!",ssM_0, "I have better things to do",ssM_End;
-
- ssM_0:
- mes "[Shilo]";
- mes "Great! But I must warn you...";
- next;
- mes "[Shilo]";
- mes "During your hunt, you may come across the protectors of these eggs...";
- next;
- mes "[Shilo]";
- mes "They have a bright, light blue color and are very 'fluffy'...";
- mes "Though I have never seen one, I've heard many stories about them.";
- next;
- mes "[Shilo]";
- mes "The have come to be know as... '^FF3355Easter Bunnies^000000'!!";
- mes "Be safe and good luck. I'll be waiting here.";
- set easter_Q, 1;
- close;
-
- ssM_End:
- mes "[Shilo]";
- mes "Well it's your loss...";
- emotion 9;
- close;
- sM_End:
- mes "[Shilo]";
- mes "Ahh, I understand. Farewell.";
- close;
- M_End:
- mes "[Shilo]";
- mes "... Well, you're not all that exciting to talk with either...";
- emotion 9;
- close;
-
-
-//---------------------
-L_Check:
-//----------
- mes "Find any ^D2A200Chocolate^000000 yet?";
- next;
- mes "[Shilo]";
- if (countitem(558) < 10) goto L_NotEnuf;
- mes "Great. You have " + countitem(558) + " ^D2A200Chocolates^000000. Here is your prize...";
- if (countitem(558) >= 150) goto L_150;
- if (countitem(558) >= 50) goto L_50;
-
- delitem 558,10;
- getitem 671,1;
- goto L_Cont;
-
- L_50:
- delitem 558,50;
- getitem 603,1;
- goto L_Cont;
-
- L_150:
- delitem 558,150;
- getitem 617,1;
- goto L_Cont;
-
- L_Cont:
- mes "Have fun and happy Easter!";
- close;
-
- L_NotEnuf:
- mes "You don't have enough ^D2A200Chocolate^000000 for a prize.";
- close;
-}
-
-
-// Easter Eggs
-//=====================================================
-alberta.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
-aldebaran.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
-amatsu.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
-comodo.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
-geffen.gat,0,0,0,0 monster Easter Egg 1920,120,0,0,0
-gonryun.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
-izlude.gat,0,0,0,0 monster Easter Egg 1920,80,0,0,0
-louyang.gat,0,0,0,0 monster Easter Egg 1920,200,0,0,0
-morocc.gat,0,0,0,0 monster Easter Egg 1920,250,0,0,0
-payon.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
-prontera.gat,0,0,0,0 monster Easter Egg 1920,250,0,0,0
-umbala.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
-yuno.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
-
-// Easter Bunny
-//======================================================
-alberta.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
-geffen.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
-morocc.gat,0,0,0,0 monster Easter Bunny 1921,2,1200000,900000,0
-payon.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
+//===== eAthena Script =======================================
+//= Easter Egg Event
+//===== By: ==================================================
+//= kobra_k88
+//= fixed by Yoshimo
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= Break easter eggs in towns an cities to find chocolates.
+//= Exchange the chocolates for prizes.
+//= Includes Easter egg and Easter bunny mobs.
+//===== Additional Comments: =================================
+//= Not sure about "Gold coin" as being one of the prizes.
+//= fixed infinite gifts [Yor] (thanks to Yoshimo from Freya's forum)
+//============================================================
+
+
+geffen.gat,95,201,3 script Shilo 50,{
+ mes "[Shilo]";
+ if(easter_Q == 1) goto L_Check;
+ mes "*Sigh*... Where is my sister!?";
+ next;
+ mes "[Shilo]";
+ mes "Oh... Hi there! I'm extremely excited! You know why?";
+ next;
+ mes "[Shilo]";
+ mes "My favorite holiday is here... ^D2A200Easter^000000!!";
+ next;
+ mes "[Shilo]";
+ mes "I can't wait to go find some easter eggs...";
+ next;
+ if(@talked == 1) menu "I want to look for these eggs.",sM_0, "... Eggs? Why?",M_0, "You seriously bore me... *yawn*...",M_End;
+ menu "... Eggs? Why?",M_0, "You seriously bore me...*yawn*..",M_End;
+
+ M_0:
+ mes "[Shilo]";
+ mes "You mean you've never been on an ^5533FFEaster Egg Hunt^000000 before?";
+ next;
+ mes "[Shilo]";
+ mes "They're the best! See every year, people from all over hide ^5533FFEaster eggs^000000 through out Rune Midgard.";
+ mes "And it's our job to go find as many as possible and collect all of the goodies inside of them.";
+ next;
+ mes "[Shilo]";
+ mes "See, along time ago, the Peco Peco roamed the land free of any hostilities...";
+ mes "All over Rune Midgard, they did as the pleased, and they reproduced without any fears.";
+ next;
+ mes "[Shilo]";
+ mes "The Peco Peco population thrived and kept growing... Eventually their numbers got out of hand.";
+ mes "The people of Rune Midgard decided that they needed to do something about the overwhelming population of Peco Pecos.";
+ next;
+ mes "[Shilo]";
+ mes "So they set out to destroy as many of the Peco Peco eggs they could find!!";
+ next;
+ mes "[Shilo]";
+ mes "Many children found the destruction of helpless Peco Peco eggs to be unbearable.";
+ mes "They were very sad about this and pleaded with their parents to stop.";
+ next;
+ mes "[Shilo]";
+ mes "Unfortunately they could not stop.";
+ mes "If they did nothing the fertile lands of Rune Midard would be destoryed by the Peco Pecos.";
+ next;
+ mes "[Shilo]";
+ mes "So they decided to try to convince the children that destroying the eggs was a good thing.";
+ mes "The parents starting making fake peco peco eggs that had treats in them.";
+ next;
+ mes "[Shilo]";
+ mes "They hid them all over town and had the children search for them.";
+ mes "Once found, the children would break the eggs and find the treats. They would then feel happy about breaking Peco Peco eggs.";
+ next;
+ mes "[Shilo]";
+ mes "Now the Peco Peco has natural enemies, like desert wolves, which keep the Peco Peco population in check.";
+ mes "Therefore the people of Rune Midgard no longer have to destroy defenseless Peco Peco eggs.";
+ next;
+ mes "[Shilo]";
+ mes "But we still carry on the tradition of hiding fake eggs all over Rune Midgard every year.";
+ mes "And that is the story behind Easter in Rune Midgard.";
+ next;
+ mes "[Shilo]";
+ mes "You know... it looks like I'm going to be here for alonge while. I'll tell you what...";
+ next;
+ mes "[Shilo]";
+ mes "If you go out and find some ^5533FFEaster eggs^000000 and bring me back their special 'treats', I will give you something for them...";
+ mes "What do you say?";
+ set @talked, 1;
+ next;
+ menu "What do I have to do?",sM_0, "Nah, I'm to busy.",sM_End;
+
+ sM_0:
+ mes "[Shilo]";
+ mes "All you have to do is go hunt for some Easter eggs which can be found in the towns and cities all over Rune Midgard.";
+ next;
+ mes "[Shilo]";
+ mes "When you find them, break em. If you're lucky, there will be delicious ^D2A200'Chocolates'^000000 inside of them.";
+ mes "Find at least ^00950010^000000, and bring them to me and I will give you a ^FF5533prize^000000.";
+ next;
+ mes "[Shilo]";
+ mes "The more you bring to me, the better my gift to you will be.";
+ next;
+ mes "[Shilo]";
+ mes "I'll will give you something for:";
+ mes "^00950010 ^D2A200Chocolates"; // 1 gold coin ?
+ mes "^5533FF50 ^D2A200Chocolates^000000"; // 1 old blue box
+ mes "and ^FF3355150 ^D2A200Chocolates^000000"; // 1 old purple box
+ next;
+ mes "[Shilo]";
+ mes "So what do you say?";
+ next;
+ menu "Sounds fun, I'll do it!",ssM_0, "I have better things to do",ssM_End;
+
+ ssM_0:
+ mes "[Shilo]";
+ mes "Great! But I must warn you...";
+ next;
+ mes "[Shilo]";
+ mes "During your hunt, you may come across the protectors of these eggs...";
+ next;
+ mes "[Shilo]";
+ mes "They have a bright, light blue color and are very 'fluffy'...";
+ mes "Though I have never seen one, I've heard many stories about them.";
+ next;
+ mes "[Shilo]";
+ mes "The have come to be know as... '^FF3355Easter Bunnies^000000'!!";
+ mes "Be safe and good luck. I'll be waiting here.";
+ set easter_Q, 1;
+ close;
+
+ ssM_End:
+ mes "[Shilo]";
+ mes "Well it's your loss...";
+ emotion 9;
+ close;
+ sM_End:
+ mes "[Shilo]";
+ mes "Ahh, I understand. Farewell.";
+ close;
+ M_End:
+ mes "[Shilo]";
+ mes "... Well, you're not all that exciting to talk with either...";
+ emotion 9;
+ close;
+
+
+//---------------------
+L_Check:
+//----------
+ mes "Find any ^D2A200Chocolate^000000 yet?";
+ next;
+ mes "[Shilo]";
+ if (countitem(558) < 10) goto L_NotEnuf;
+ mes "Great. You have " + countitem(558) + " ^D2A200Chocolates^000000. Here is your prize...";
+ if (countitem(558) >= 150) goto L_150;
+ if (countitem(558) >= 50) goto L_50;
+
+ delitem 558,10;
+ getitem 671,1;
+ goto L_Cont;
+
+ L_50:
+ delitem 558,50;
+ getitem 603,1;
+ goto L_Cont;
+
+ L_150:
+ delitem 558,150;
+ getitem 617,1;
+ goto L_Cont;
+
+ L_Cont:
+ mes "Have fun and happy Easter!";
+ close;
+
+ L_NotEnuf:
+ mes "You don't have enough ^D2A200Chocolate^000000 for a prize.";
+ close;
+}
+
+
+// Easter Eggs
+//=====================================================
+alberta.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
+aldebaran.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
+amatsu.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
+comodo.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
+geffen.gat,0,0,0,0 monster Easter Egg 1920,120,0,0,0
+gonryun.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
+izlude.gat,0,0,0,0 monster Easter Egg 1920,80,0,0,0
+louyang.gat,0,0,0,0 monster Easter Egg 1920,200,0,0,0
+morocc.gat,0,0,0,0 monster Easter Egg 1920,250,0,0,0
+payon.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
+prontera.gat,0,0,0,0 monster Easter Egg 1920,250,0,0,0
+umbala.gat,0,0,0,0 monster Easter Egg 1920,100,0,0,0
+yuno.gat,0,0,0,0 monster Easter Egg 1920,150,0,0,0
+
+// Easter Bunny
+//======================================================
+alberta.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
+geffen.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
+morocc.gat,0,0,0,0 monster Easter Bunny 1921,2,1200000,900000,0
+payon.gat,0,0,0,0 monster Easter Bunny 1921,1,1200000,900000,0
prontera.gat,0,0,0,0 monster Easter Bunny 1921,2,840000,420000,0 \ No newline at end of file
diff --git a/npc/events/event_skill_reset.txt b/npc/events/event_skill_reset.txt
index baf175298..5da389d56 100644
--- a/npc/events/event_skill_reset.txt
+++ b/npc/events/event_skill_reset.txt
@@ -1,109 +1,109 @@
-//===== eAthena Script =======================================
-//= Official Skill Resetter Event in Yuno (kRO & idRO)
-//===== By: ==================================================
-//= $ephiroth
-//===== Current Version: =====================================
-//= 1.02
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= 2006 - Edition Skill Reset NPC
-//= 2006/11/16: 1.0 Release and fully working. [$ephiroth]
-//= 1.01 Checked, fixed typos, now uses MISC_QUEST var [Lupus]
-//= 1.02 Added missing message,comment,etc. [$ephiroth]
-//===== Additional Comments: =================================
-//= Skill Reset with payment, minimum BaseLv.60 to reset skill.
-//= Each 1 BaseLv need 20.000 Zeny, so be careful to use skill.
-//============================================================
-yuno.gat,138,187,4 script Hypnotist Teacher 124,{
- set @npcname$,"[^D5A500Hypnotist^000000]";
- mes @npcname$;
-
- if(MISC_QUEST & 1024){
- mes "I already told you that you may only complete this event once.";
- close;
- }
- if(BaseLevel < 60) {
- mes "Please return when you reach BaseLv 60 or higher.";
- close;
- }
- if(SkillPoint != 0) {
- mes "You will need to use up all of your skill points if you want me to continue.";
- mes "Please come again soon!";
- close;
- }
- if(Weight || checkfalcon(0) || checkcart(0) || checkriding(0)) {
- mes "Would you like to reset skills?";
- mes "I'm sorry, but...";
- next;
- mes @npcname$;
- if(Weight) {
- mes "You cannot reset skills";
- mes "when you keep";
- mes "any items.";
- } else if(checkcart(0))
- mes "Please, drop your cart and we'll continue.";
- else if(checkfalcon(0))
- mes "Please, free your Falcon and we'll continue.";
- else if(checkriding(0))
- mes "Please, free your PecoPeco and we'll continue.";
- next;
- mes @npcname$;
- mes "Come back soon!";
- close;
- }
- mes "Hello, I am the Skill Resetter.";
- mes "Your name is ^0080FF"+strcharinfo(0)+"^000000.";
- mes "How can I help you?";
- next;
- menu "^009500Information about Reset skills.^000000",L_Info,"^00B6FFReset skills.^000000",L_Reset,"^000088Nevermind^000000",-;
-
- mes @npcname$;
- mes "You know where to find me,";
- mes "if you ever want a reset!!";
- close;
-
-L_Info:
- mes @npcname$;
- mes "This skill reset is not FREE OF CHARGE!!";
- mes "Expense for the reset of skill is ^D5A50020000 Zeny x BaseLv^000000.";
- mes "Yeah ...each One BaseLv need 20000 Zeny to reset skill.";
- next;
- mes @npcname$;
- mes "Oh yeah, one more thing!";
- mes "Any carts, falcon or peco's you have equiped,";
- mes "will be removed if you will reset your skills.";
- next;
- mes @npcname$;
- mes "Just one time does again to shake the skill point";
- mes "Careful with your skills from here on.";
- close;
-
-L_Reset:
- mes @npcname$;
- mes "Before skill reset in starting.";
- mes "You shall have to first tell me your Base Level.";
- next;
- mes "^D5A500[" + strcharinfo(0) + "]^000000";
- mes "My Base level is ^AA00AALevel " + BaseLevel + "BaseLv.^000000";
- next;
- set @zeny,BaseLevel*20000;
- mes @npcname$;
- mes "Total zeny to the reset of skill amount ^529DFF" + @zeny + "Zeny^000000 for the skill reset service.";
- next;
- if(Zeny < @zeny) {
- mes @npcname$;
- mes "It seems that you don't have enough money.";
- mes "In addition we wait for the opportunity.";
- emotion e_hmm;
- close;
- }
- set Zeny, Zeny-@zeny;
- set MISC_QUEST,MISC_QUEST | 1024;
- resetskill;
- mes @npcname$;
- mes "Thank you.";
- emotion e_thx;
- logmes "SKILL RESET EVENT";
- close;
+//===== eAthena Script =======================================
+//= Official Skill Resetter Event in Yuno (kRO & idRO)
+//===== By: ==================================================
+//= $ephiroth
+//===== Current Version: =====================================
+//= 1.02
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= 2006 - Edition Skill Reset NPC
+//= 2006/11/16: 1.0 Release and fully working. [$ephiroth]
+//= 1.01 Checked, fixed typos, now uses MISC_QUEST var [Lupus]
+//= 1.02 Added missing message,comment,etc. [$ephiroth]
+//===== Additional Comments: =================================
+//= Skill Reset with payment, minimum BaseLv.60 to reset skill.
+//= Each 1 BaseLv need 20.000 Zeny, so be careful to use skill.
+//============================================================
+yuno.gat,138,187,4 script Hypnotist Teacher 124,{
+ set @npcname$,"[^D5A500Hypnotist^000000]";
+ mes @npcname$;
+
+ if(MISC_QUEST & 1024){
+ mes "I already told you that you may only complete this event once.";
+ close;
+ }
+ if(BaseLevel < 60) {
+ mes "Please return when you reach BaseLv 60 or higher.";
+ close;
+ }
+ if(SkillPoint != 0) {
+ mes "You will need to use up all of your skill points if you want me to continue.";
+ mes "Please come again soon!";
+ close;
+ }
+ if(Weight || checkfalcon(0) || checkcart(0) || checkriding(0)) {
+ mes "Would you like to reset skills?";
+ mes "I'm sorry, but...";
+ next;
+ mes @npcname$;
+ if(Weight) {
+ mes "You cannot reset skills";
+ mes "when you keep";
+ mes "any items.";
+ } else if(checkcart(0))
+ mes "Please, drop your cart and we'll continue.";
+ else if(checkfalcon(0))
+ mes "Please, free your Falcon and we'll continue.";
+ else if(checkriding(0))
+ mes "Please, free your PecoPeco and we'll continue.";
+ next;
+ mes @npcname$;
+ mes "Come back soon!";
+ close;
+ }
+ mes "Hello, I am the Skill Resetter.";
+ mes "Your name is ^0080FF"+strcharinfo(0)+"^000000.";
+ mes "How can I help you?";
+ next;
+ menu "^009500Information about Reset skills.^000000",L_Info,"^00B6FFReset skills.^000000",L_Reset,"^000088Nevermind^000000",-;
+
+ mes @npcname$;
+ mes "You know where to find me,";
+ mes "if you ever want a reset!!";
+ close;
+
+L_Info:
+ mes @npcname$;
+ mes "This skill reset is not FREE OF CHARGE!!";
+ mes "Expense for the reset of skill is ^D5A50020000 Zeny x BaseLv^000000.";
+ mes "Yeah ...each One BaseLv need 20000 Zeny to reset skill.";
+ next;
+ mes @npcname$;
+ mes "Oh yeah, one more thing!";
+ mes "Any carts, falcon or peco's you have equiped,";
+ mes "will be removed if you will reset your skills.";
+ next;
+ mes @npcname$;
+ mes "Just one time does again to shake the skill point";
+ mes "Careful with your skills from here on.";
+ close;
+
+L_Reset:
+ mes @npcname$;
+ mes "Before skill reset in starting.";
+ mes "You shall have to first tell me your Base Level.";
+ next;
+ mes "^D5A500[" + strcharinfo(0) + "]^000000";
+ mes "My Base level is ^AA00AALevel " + BaseLevel + "BaseLv.^000000";
+ next;
+ set @zeny,BaseLevel*20000;
+ mes @npcname$;
+ mes "Total zeny to the reset of skill amount ^529DFF" + @zeny + "Zeny^000000 for the skill reset service.";
+ next;
+ if(Zeny < @zeny) {
+ mes @npcname$;
+ mes "It seems that you don't have enough money.";
+ mes "In addition we wait for the opportunity.";
+ emotion e_hmm;
+ close;
+ }
+ set Zeny, Zeny-@zeny;
+ set MISC_QUEST,MISC_QUEST | 1024;
+ resetskill;
+ mes @npcname$;
+ mes "Thank you.";
+ emotion e_thx;
+ logmes "SKILL RESET EVENT";
+ close;
} \ No newline at end of file
diff --git a/npc/events/idul_fitri.txt b/npc/events/idul_fitri.txt
index b5b62df5d..bf72f1027 100644
--- a/npc/events/idul_fitri.txt
+++ b/npc/events/idul_fitri.txt
@@ -1,78 +1,78 @@
-//===== eAthena Script =======================================
-//= Feast Day Of Ramadan Idul Fitri Event
-//===== By: ==================================================
-//= $ephiroth
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena Version
-//===== Description: =========================================
-//= Info : Official idRO
-//= 2006/10/16: 1.0 Release and fully working. [$ephiroth]
-//============================================================
-
-
-prontera.gat,146,92,3 script Cellerb 58,{
- set @npcname$,"[Staff Idul Fitri]";
- mes @npcname$;
- if((gettime(6)==10 && (gettime(5)==24 || gettime(5)==25))==0) {
- mes "Congratulation! Celebrate Feast Day Of Ramadan Idul Fitri 1427 H.";
- specialeffect 139;
- close;
- }
- mes "Haii......^FF8800"+strcharinfo(0)+"^000000!!";
- mes "First day of Idulfitri has arrived.";
- mes "Congratulation celebrate him.";
- mes "There is event special today.";
- next;
- mes @npcname$;
- mes "Event today .....^009500Idul Fitri Quest!^000000";
- next;
- mes @npcname$;
- mes "If you interest to follow this event, I will cook it to you.";
- next;
-
- switch(select("Allright. I like that!!","Next time.... Thanks.")){
- case 1:
- mes @npcname$;
- mes "I have something that might interest you.";
- mes "I need all of the following items:";
- mes "^D5A500Ketupat Sayur Ingredient :^000000";
- mes "^00B6FF~5 Ketupat, 5 Carrot~,^000000";
- mes "^CC6633~5 Sweet Potato, 10 Meat~,^000000";
- mes "^000088~2 Green Herb, 5 Stem~.^000000";
- next;
- mes @npcname$;
- if ( (countitem(552)<5 || countitem(515)<5 ||countitem(516)<5 || countitem(517)<10 || countitem(511)<2 || countitem(905)<5) ) {
- mes "You don't have enough items.";
- mes "Come back when you have them all.";
- close;
- }
- delitem 552,5;
- delitem 515,5;
- delitem 516,2;
- delitem 517,10;
- delitem 511,2;
- delitem 905,5;
- mes "I see you already have all the items you need.";
- mes "Just a moment, please!!";
- next;
- mes "^009500-Plupping snapping bubbling~^000000";
- mes "^009500-Clinking clingking~^000000";
- mes "^009500-Clang clang~^000000";
- getitem 583,1;
- next;
- mes @npcname$;
- mes "We appreciate your participation in this special event.";
- emotion e_thx;
- close;
-
- case 2:
- mes @npcname$;
- mes "Oh well, maybe you will participate in tommorow's quest.";
- emotion e_hmm;
- close;
- }
-}
-
-prontera.gat mapflag fireworks
+//===== eAthena Script =======================================
+//= Feast Day Of Ramadan Idul Fitri Event
+//===== By: ==================================================
+//= $ephiroth
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena Version
+//===== Description: =========================================
+//= Info : Official idRO
+//= 2006/10/16: 1.0 Release and fully working. [$ephiroth]
+//============================================================
+
+
+prontera.gat,146,92,3 script Cellerb 58,{
+ set @npcname$,"[Staff Idul Fitri]";
+ mes @npcname$;
+ if((gettime(6)==10 && (gettime(5)==24 || gettime(5)==25))==0) {
+ mes "Congratulation! Celebrate Feast Day Of Ramadan Idul Fitri 1427 H.";
+ specialeffect 139;
+ close;
+ }
+ mes "Haii......^FF8800"+strcharinfo(0)+"^000000!!";
+ mes "First day of Idulfitri has arrived.";
+ mes "Congratulation celebrate him.";
+ mes "There is event special today.";
+ next;
+ mes @npcname$;
+ mes "Event today .....^009500Idul Fitri Quest!^000000";
+ next;
+ mes @npcname$;
+ mes "If you interest to follow this event, I will cook it to you.";
+ next;
+
+ switch(select("Allright. I like that!!","Next time.... Thanks.")){
+ case 1:
+ mes @npcname$;
+ mes "I have something that might interest you.";
+ mes "I need all of the following items:";
+ mes "^D5A500Ketupat Sayur Ingredient :^000000";
+ mes "^00B6FF~5 Ketupat, 5 Carrot~,^000000";
+ mes "^CC6633~5 Sweet Potato, 10 Meat~,^000000";
+ mes "^000088~2 Green Herb, 5 Stem~.^000000";
+ next;
+ mes @npcname$;
+ if ( (countitem(552)<5 || countitem(515)<5 ||countitem(516)<5 || countitem(517)<10 || countitem(511)<2 || countitem(905)<5) ) {
+ mes "You don't have enough items.";
+ mes "Come back when you have them all.";
+ close;
+ }
+ delitem 552,5;
+ delitem 515,5;
+ delitem 516,2;
+ delitem 517,10;
+ delitem 511,2;
+ delitem 905,5;
+ mes "I see you already have all the items you need.";
+ mes "Just a moment, please!!";
+ next;
+ mes "^009500-Plupping snapping bubbling~^000000";
+ mes "^009500-Clinking clingking~^000000";
+ mes "^009500-Clang clang~^000000";
+ getitem 583,1;
+ next;
+ mes @npcname$;
+ mes "We appreciate your participation in this special event.";
+ emotion e_thx;
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Oh well, maybe you will participate in tommorow's quest.";
+ emotion e_hmm;
+ close;
+ }
+}
+
+prontera.gat mapflag fireworks
diff --git a/npc/events/twintowers.txt b/npc/events/twintowers.txt
index 95e83d607..dad3ce326 100644
--- a/npc/events/twintowers.txt
+++ b/npc/events/twintowers.txt
@@ -1,94 +1,94 @@
-//===== eAthena Script =======================================
-//= Twin Towers NPCs
-//===== By: ==================================================
-//= sEiKaN (1.0)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version; 0315+
-//===== Description: =========================================
-//= mRO Event: Twin Towers NPCs
-//===== Additional Comments: =================================
-//= 1.2 by Akaru 1.3 by massdriller(Fixed typos)
-//= 1.4 fixed coords, according to off. src [Lupus]
-//= 1.5 Removed Duplicates [Silent]
-//============================================================
-
-prontera.gat,146,92,4 script Twin Towers#tt1::Twin-Towers 813,{
- mes "[Twin Towers]";
- mes "How are you? We are the Twin Towers.";
- mes "It is such a pleasure to be able to meet you here.";
- mes "I suppose you know that this is Ragnarok Online, a land of dreams and fantasies.";
- mes "Are you having a joyous adventure and exciting experience?";
- next;
- mes "[Twin Towers]";
- mes "Although we can't move around and can't live the way you do,";
- mes "we love the world as much as you do!";
- next;
- mes "[Twin Towers]";
- mes "May you experience the sensation of this lovely world!";
- mes "For this reason, we are here at your service with our special magic.";
- mes "Kindly let us know.";
- next;
- menu "I shall accept your offer.",YES,"I'll ask for your service next time.",NO;
-
- NO:
- mes "[Twin Towers]";
- mes "Er, what a pity. Traveling by yourself is still the best evidence of adventure.";
- mes "Isn't this proving that you are still young?";
- mes "We respect brave hearts like this";
- next;
- mes "[Twin Towers]";
- mes "There are good and bad times in life, moreover, adventure isn't an easy task in the first place.";
- mes "Isn't this true?";
- mes "Feel free to come to us when you have time, we will always be there to serve you.";
- next;
- mes "[Twin Towers]";
- mes "Forget all your troubles, and create a splendid legend in this wonderful world.";
- mes "This is such a wonderful world, and you'll always be a great adventurer!";
- close;
- YES:
- mes "[Twin Towers]";
- mes "The flaming passion of an adventurer,";
- mes "The desire to explore the unknown realms,";
- mes "The dedication and commitment to achieve the aspiration...";
- mes "You are simply a true adventurer with what compassion.";
- next;
- mes "[Twin Towers]";
- mes "We wish to help passionate adventurers.";
- mes "Although we are not able to move, luckily we have the special ability that can warp you to places of danger and excitement.";
- next;
- mes "[Twin Towers]";
- mes "Come on! Where do you wish to go?";
- mes "Just let us know you desired destination and we will send your there!";
- menu "Hidden Temple", HiddenTemple,"Orc Dungeon",OrcDungeon,"Ant Hell",AntHell,"Mjolnir Waste Pit",MjolnirWastePit,"Sphinx",Sphinx,"Glast Heim",GlastHeim,"Comodo",Comodo;
- HiddenTemple:
- warp "prt_fild01.gat",136,368;
- close;
- OrcDungeon:
- warp "gef_fild10.gat",67,334;
- close;
- AntHell:
- warp "moc_fild04.gat",210,329;
- close;
- MjolnirWastePit:
- warp "mjolnir_02.gat",79,361;
- close;
- Sphinx:
- warp "moc_fild19",105,99;
- close;
- GlastHeim:
- warp "gef_fild06",45,304;
- close;
- Comodo:
- warp "cmd_fild01",30,317;
- close;
-}
-
-morocc.gat,160,97,4 duplicate(Twin-Towers) Twin Towers#tt2 812
-payon.gat,176,226,4 duplicate(Twin-Towers) Twin Towers#tt3 812
-izlude.gat,134,92,4 duplicate(Twin-Towers) Twin Towers#tt4 812
-alberta.gat,25,238,4 duplicate(Twin-Towers) Twin Towers#tt5 812
-geffen.gat,120,60,4 duplicate(Twin-Towers) Twin Towers#tt6 812
-aldebaran.gat,143,116,4 duplicate(Twin-Towers) Twin Towers#tt7 812
-comodo.gat,194,158,4 duplicate(Twin-Towers) Twin Towers#tt8 812
+//===== eAthena Script =======================================
+//= Twin Towers NPCs
+//===== By: ==================================================
+//= sEiKaN (1.0)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version; 0315+
+//===== Description: =========================================
+//= mRO Event: Twin Towers NPCs
+//===== Additional Comments: =================================
+//= 1.2 by Akaru 1.3 by massdriller(Fixed typos)
+//= 1.4 fixed coords, according to off. src [Lupus]
+//= 1.5 Removed Duplicates [Silent]
+//============================================================
+
+prontera.gat,146,92,4 script Twin Towers#tt1::Twin-Towers 813,{
+ mes "[Twin Towers]";
+ mes "How are you? We are the Twin Towers.";
+ mes "It is such a pleasure to be able to meet you here.";
+ mes "I suppose you know that this is Ragnarok Online, a land of dreams and fantasies.";
+ mes "Are you having a joyous adventure and exciting experience?";
+ next;
+ mes "[Twin Towers]";
+ mes "Although we can't move around and can't live the way you do,";
+ mes "we love the world as much as you do!";
+ next;
+ mes "[Twin Towers]";
+ mes "May you experience the sensation of this lovely world!";
+ mes "For this reason, we are here at your service with our special magic.";
+ mes "Kindly let us know.";
+ next;
+ menu "I shall accept your offer.",YES,"I'll ask for your service next time.",NO;
+
+ NO:
+ mes "[Twin Towers]";
+ mes "Er, what a pity. Traveling by yourself is still the best evidence of adventure.";
+ mes "Isn't this proving that you are still young?";
+ mes "We respect brave hearts like this";
+ next;
+ mes "[Twin Towers]";
+ mes "There are good and bad times in life, moreover, adventure isn't an easy task in the first place.";
+ mes "Isn't this true?";
+ mes "Feel free to come to us when you have time, we will always be there to serve you.";
+ next;
+ mes "[Twin Towers]";
+ mes "Forget all your troubles, and create a splendid legend in this wonderful world.";
+ mes "This is such a wonderful world, and you'll always be a great adventurer!";
+ close;
+ YES:
+ mes "[Twin Towers]";
+ mes "The flaming passion of an adventurer,";
+ mes "The desire to explore the unknown realms,";
+ mes "The dedication and commitment to achieve the aspiration...";
+ mes "You are simply a true adventurer with what compassion.";
+ next;
+ mes "[Twin Towers]";
+ mes "We wish to help passionate adventurers.";
+ mes "Although we are not able to move, luckily we have the special ability that can warp you to places of danger and excitement.";
+ next;
+ mes "[Twin Towers]";
+ mes "Come on! Where do you wish to go?";
+ mes "Just let us know you desired destination and we will send your there!";
+ menu "Hidden Temple", HiddenTemple,"Orc Dungeon",OrcDungeon,"Ant Hell",AntHell,"Mjolnir Waste Pit",MjolnirWastePit,"Sphinx",Sphinx,"Glast Heim",GlastHeim,"Comodo",Comodo;
+ HiddenTemple:
+ warp "prt_fild01.gat",136,368;
+ close;
+ OrcDungeon:
+ warp "gef_fild10.gat",67,334;
+ close;
+ AntHell:
+ warp "moc_fild04.gat",210,329;
+ close;
+ MjolnirWastePit:
+ warp "mjolnir_02.gat",79,361;
+ close;
+ Sphinx:
+ warp "moc_fild19",105,99;
+ close;
+ GlastHeim:
+ warp "gef_fild06",45,304;
+ close;
+ Comodo:
+ warp "cmd_fild01",30,317;
+ close;
+}
+
+morocc.gat,160,97,4 duplicate(Twin-Towers) Twin Towers#tt2 812
+payon.gat,176,226,4 duplicate(Twin-Towers) Twin Towers#tt3 812
+izlude.gat,134,92,4 duplicate(Twin-Towers) Twin Towers#tt4 812
+alberta.gat,25,238,4 duplicate(Twin-Towers) Twin Towers#tt5 812
+geffen.gat,120,60,4 duplicate(Twin-Towers) Twin Towers#tt6 812
+aldebaran.gat,143,116,4 duplicate(Twin-Towers) Twin Towers#tt7 812
+comodo.gat,194,158,4 duplicate(Twin-Towers) Twin Towers#tt8 812
diff --git a/npc/events/valentinesday.txt b/npc/events/valentinesday.txt
index 6f8f3c410..75ca8e298 100644
--- a/npc/events/valentinesday.txt
+++ b/npc/events/valentinesday.txt
@@ -1,140 +1,140 @@
-//===== Athena Script ========================================
-//= Valentine Event Script
-//===== By: ==================================================
-//= Muad_Dib(Prometheus Project)
-//===== Current Version: =====================================
-//= 1.01
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//
-//===== Additional Comments: =================================
-//= 07/06/05 : Added 1st Version. [Muad_Dib]
-//= 08/28/05 : Ver. 1.01 Added a missing close; [Muad_Dib]
-//= Converted to eAthena format by Dr.Evil
-//============================================================
-
-
-// Stephen - Valentine Event Chocolate seller ------------------
-alberta.gat,26,243,4 script Stephen 58,{
- mes "[Stephen]";
- mes "Guess what I've got?";
- mes "A tasty treat not easily found in Rune-Midgard....";
- next;
- mes "[Stephen]";
- mes "Chocolate!";
- mes "That's right, don't you love chocolate.... I do.";
- mes "And you are in luck, because I'm selling them for only 5,000 zeny a piece!";
- next;
- menu "I want some chocolate!",M_CHOCO,"No thanks.",-;
- mes "[Stephen]";
- mes "You don't want any chocolate?";
- mes "I'm telling you! You'll regret it!";
- mes "You better get some now... you won't come across Chocolate like this ever again!";
- mes "Think it over and visit me again sometime.";
- close;
-
-M_CHOCO:
- mes "[Stephen]";
- mes "Hah!";
- mes "I knew it!";
- mes "But I can't sell you more then 5 at once....but, if you really need more....";
- mes "you can come back again.";
- mes "So how many do u want?";
- next;
- set @needmon,0;
- input @flag_num;
- if (@flag_num == 0) goto L_NONE;
- if (@flag_num > 5) goto L_ERR;
- set @needmon,@flag_num*5000;
- if (Zeny < @needmon) goto L_NOTENO;
- set Zeny,Zeny - @needmon;
- getitem 558,@flag_num;
- mes "[Stephen]";
- mes "There you go!";
- mes "You can give that to someone as a gift, or enjoy it yourself!";
- mes "Mmm....sweet chocolate...";
- mes "Visit me anytime...!";
- close;
-
-L_ERR:
- mes "[Stephen]";
- mes "I'm sorry but I can't give u that many.";
-L_NONE:
- close;
-
-L_NOTENO:
- mes "[Stephen]";
- mes "I'm sorry but it seems u cant afford to buy these off me";
- close;
-}
-
-// Jainie -- Gives information about Valentine Event ------------------------
-alberta.gat,29,243,4 script Jainie 53,{
- mes "[Jainie]";
- mes "You know what? The chocolate that my boyfriend sells are from me!";
- mes "I made them by myself.";
- next;
- mes "[Jainie]";
- mes "You know ... In cetain countries, there's a tradition of presenting chocolates to a person that you love...";
- mes "They call it, ^3355FFValentine's Day^000000.";
- next;
- mes "[Jainie]";
- mes "So I gave him my delicious chocolate...";
- mes "And then he made me cook a lot more...";
- mes "And now he is selling them to everyone.";
- mes "I guess he really enjoyed it.";
- mes "But, I do feel good when people buy something I have made.";
- next;
- mes "[Jainie]";
- mes "It would be great if you bought some too...";
- mes "I will be making chocolates for a while so...";
- close;
-}
-
-// Carl Orleans -- Valentine Event Chocolate maker ------------------
-prt_castle.gat,54,34,4 script Carl Orleans 47,{
- mes "[Carl Orleans]";
- mes "Yes?";
- next;
- menu "I want some hand made chocolate...",-,"I'm lost, sorry to bother you.",M_WAT;
-
- mes "[Carl Orleans]";
- mes "Well, I just might be able to fulfill your needs...";
- next;
- if (countitem(558) >=3) goto L_ENO;
- mes "I'm sorry you do not have enough Chocolate Bars to do this";
- close;
-
-L_ENO:
- delitem 558,3;
- mes "[Carl Orleans]";
- mes "You got 3 pieces of pure chocolate I see.";
- mes "Give them to me...";
- next;
- mes "Ok, now I will only create my special hand made chocolates if you promise to use it wisely.";
- next;
- mes "....Hmmmmmm.....";
- mes "Well...";
- next;
- mes "Here.";
- getitem 559,1;
- mes "I hope you give it to someone special, because its a special chocolate.";
- mes "As you know... only I can create this.";
- next;
- mes "Enjoy.";
- close;
-
-M_WAT:
- mes "[Carl Orleans]";
- mes "Oh..well, if you want me to make some of my special Hand Made Chocolate....";
- mes "You will need to give me at least ^0000FF 3 Chocolates^000000.";
- next;
- mes "[Carl Orleans]";
- mes "That's right, only ^0000FF 3 Chocolates^000000";
- mes "Bring them to me and you'll get what you came for.";
- next;
- mes "[Carl Orleans]";
- mes "See You.";
- close;
-}
+//===== Athena Script ========================================
+//= Valentine Event Script
+//===== By: ==================================================
+//= Muad_Dib(Prometheus Project)
+//===== Current Version: =====================================
+//= 1.01
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//
+//===== Additional Comments: =================================
+//= 07/06/05 : Added 1st Version. [Muad_Dib]
+//= 08/28/05 : Ver. 1.01 Added a missing close; [Muad_Dib]
+//= Converted to eAthena format by Dr.Evil
+//============================================================
+
+
+// Stephen - Valentine Event Chocolate seller ------------------
+alberta.gat,26,243,4 script Stephen 58,{
+ mes "[Stephen]";
+ mes "Guess what I've got?";
+ mes "A tasty treat not easily found in Rune-Midgard....";
+ next;
+ mes "[Stephen]";
+ mes "Chocolate!";
+ mes "That's right, don't you love chocolate.... I do.";
+ mes "And you are in luck, because I'm selling them for only 5,000 zeny a piece!";
+ next;
+ menu "I want some chocolate!",M_CHOCO,"No thanks.",-;
+ mes "[Stephen]";
+ mes "You don't want any chocolate?";
+ mes "I'm telling you! You'll regret it!";
+ mes "You better get some now... you won't come across Chocolate like this ever again!";
+ mes "Think it over and visit me again sometime.";
+ close;
+
+M_CHOCO:
+ mes "[Stephen]";
+ mes "Hah!";
+ mes "I knew it!";
+ mes "But I can't sell you more then 5 at once....but, if you really need more....";
+ mes "you can come back again.";
+ mes "So how many do u want?";
+ next;
+ set @needmon,0;
+ input @flag_num;
+ if (@flag_num == 0) goto L_NONE;
+ if (@flag_num > 5) goto L_ERR;
+ set @needmon,@flag_num*5000;
+ if (Zeny < @needmon) goto L_NOTENO;
+ set Zeny,Zeny - @needmon;
+ getitem 558,@flag_num;
+ mes "[Stephen]";
+ mes "There you go!";
+ mes "You can give that to someone as a gift, or enjoy it yourself!";
+ mes "Mmm....sweet chocolate...";
+ mes "Visit me anytime...!";
+ close;
+
+L_ERR:
+ mes "[Stephen]";
+ mes "I'm sorry but I can't give u that many.";
+L_NONE:
+ close;
+
+L_NOTENO:
+ mes "[Stephen]";
+ mes "I'm sorry but it seems u cant afford to buy these off me";
+ close;
+}
+
+// Jainie -- Gives information about Valentine Event ------------------------
+alberta.gat,29,243,4 script Jainie 53,{
+ mes "[Jainie]";
+ mes "You know what? The chocolate that my boyfriend sells are from me!";
+ mes "I made them by myself.";
+ next;
+ mes "[Jainie]";
+ mes "You know ... In cetain countries, there's a tradition of presenting chocolates to a person that you love...";
+ mes "They call it, ^3355FFValentine's Day^000000.";
+ next;
+ mes "[Jainie]";
+ mes "So I gave him my delicious chocolate...";
+ mes "And then he made me cook a lot more...";
+ mes "And now he is selling them to everyone.";
+ mes "I guess he really enjoyed it.";
+ mes "But, I do feel good when people buy something I have made.";
+ next;
+ mes "[Jainie]";
+ mes "It would be great if you bought some too...";
+ mes "I will be making chocolates for a while so...";
+ close;
+}
+
+// Carl Orleans -- Valentine Event Chocolate maker ------------------
+prt_castle.gat,54,34,4 script Carl Orleans 47,{
+ mes "[Carl Orleans]";
+ mes "Yes?";
+ next;
+ menu "I want some hand made chocolate...",-,"I'm lost, sorry to bother you.",M_WAT;
+
+ mes "[Carl Orleans]";
+ mes "Well, I just might be able to fulfill your needs...";
+ next;
+ if (countitem(558) >=3) goto L_ENO;
+ mes "I'm sorry you do not have enough Chocolate Bars to do this";
+ close;
+
+L_ENO:
+ delitem 558,3;
+ mes "[Carl Orleans]";
+ mes "You got 3 pieces of pure chocolate I see.";
+ mes "Give them to me...";
+ next;
+ mes "Ok, now I will only create my special hand made chocolates if you promise to use it wisely.";
+ next;
+ mes "....Hmmmmmm.....";
+ mes "Well...";
+ next;
+ mes "Here.";
+ getitem 559,1;
+ mes "I hope you give it to someone special, because its a special chocolate.";
+ mes "As you know... only I can create this.";
+ next;
+ mes "Enjoy.";
+ close;
+
+M_WAT:
+ mes "[Carl Orleans]";
+ mes "Oh..well, if you want me to make some of my special Hand Made Chocolate....";
+ mes "You will need to give me at least ^0000FF 3 Chocolates^000000.";
+ next;
+ mes "[Carl Orleans]";
+ mes "That's right, only ^0000FF 3 Chocolates^000000";
+ mes "Bring them to me and you'll get what you came for.";
+ next;
+ mes "[Carl Orleans]";
+ mes "See You.";
+ close;
+}
diff --git a/npc/events/whiteday.txt b/npc/events/whiteday.txt
index 8837f4c6d..073ed37a9 100644
--- a/npc/events/whiteday.txt
+++ b/npc/events/whiteday.txt
@@ -1,128 +1,128 @@
-//===== Athena Script ========================================
-//= White Day Event Script
-//===== By: ==================================================
-//= 1.0a Muad_Dib (Prometheus Project)
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Sells candy, candy cane and well baked cookie.
-//===== Additional Comments: =================================
-//= 07/06/05 : Added 1st Version. [Muad_Dib]
-//= Converted to eAthena format by Dr.Evil
-//============================================================
-
-
-alberta.gat,188,64,4 script Sugar 91,{
- set @maplenum,0;
- set @mapleItemID,0;
- set @maplePrice,0;
- set @maplePriceT,0;
- mes "[Sugar]";
- mes "Welcome!";
- mes "How delicious are sweets?";
- mes "My teacher.........";
- mes "The sweets craftsman of ARUBERUTA";
- mes "There are sweets that is built hard.";
- next;
- mes "[Sugar]";
- mes "It was given by the darling person.";
- mes "In return of the present ....";
- mes "heartfelt like";
- mes "the sweetness of the present some how.";
- next;
- menu "Please give me!",-,"I dont need it.",M_END,"The teacher.",M_L1;
-
- mes "[Sugar]";
- mes "Yes!";
- mes "Select from menu here.";
- mes "Since there is a limitation in numbers";
- mes "Not more than ^ff0000 5 pieces^000000.";
- mes "are allowed to carry out?";
- next;
- menu "Candy",-,"Candy Cane",L0_2,"Well baked cookie",L0_3;
-
- set @maplePrice,3000;
- set @mapleItemID,529;
- mes "[Sugar]";
- mes "It is a candy, and the price is";
- mes "3000 Zeny each.";
- mes "How many do you like to purchase?";
- next;
- goto L_INPUT;
-L0_2:
- set @maplePrice,4000;
- set @mapleItemID,530;
- mes "[Sugar]";
- mes "It is a candy cane, and the price is";
- mes "4000 Zeny each.";
- mes "How many do you like to purchase?";
- next;
- goto L_INPUT;
-L0_3:
- set @maplePrice,2000;
- set @mapleItemID,538;
- mes "[Sugar]";
- mes "It is a well baked cookie, and the price is";
- mes "2000 Zeny each.";
- mes "How many do you like to purchase?";
- next;
-
-L_INPUT:
- input @maplenum;
- if (@maplenum > 5) goto L_ERROR;
- if (@maplenum == 0) goto M_END;
- set @maplePriceT,@maplePrice*@maplenum;;
- if (Zeny < @maplePriceT) goto L_ERROR2;
- set Zeny,Zeny- @maplePriceT;
- getitem @mapleItemID,@maplenum;
- mes "[Sugar]";
- mes "Thank you!!!";
- mes "These sweets are really delicious.";
- mes "Since my teacher of sweet is the No.1 teacher's in world!";
- mes "Although you may eat by yourself";
- mes "dont eat so much or you'll grow fat.";
- mes "Please take care!!!";
- close;
-
-M_L1:
- mes "[Sugar]";
- mes "Yes";
- mes "The teacher of mine";
- mes "is Mr. Kuberu, a sweets craftsman.";
- mes "Making sweets under two persons.";
- mes "which is allowed to self-train.";
- next;
- mes "[Sugar]";
- mes "Although selling is seemingly to carried out ....";
- mes "Where he is now?";
- mes "Which I dont know.";
- close;
-
-L_ERROR:
- mes "[Sugar]";
- mes "???";
- mes "You seem to have a failure on hearing.";
- mes "I will tell you once again?";
- mes "You can only purchase";
- mes "^ff0000 5 pieces^000000 at once.";
- next;
- goto L_INPUT;
-
-L_ERROR2:
- mes "[Sugar]";
- mes "???";
- mes "Hmmm it seems you don't have enough money";
- mes "to make that purchase.";
- mes "I will ask you to check your money first.";
- close;
-
-M_END:
- mes "[Sugar]";
- mes "Really .... You might regret it..";
- mes "If you change your mind.";
- mes "I am just here ok.";
- mes "Have a nice day!";
- close;
-}
+//===== Athena Script ========================================
+//= White Day Event Script
+//===== By: ==================================================
+//= 1.0a Muad_Dib (Prometheus Project)
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Sells candy, candy cane and well baked cookie.
+//===== Additional Comments: =================================
+//= 07/06/05 : Added 1st Version. [Muad_Dib]
+//= Converted to eAthena format by Dr.Evil
+//============================================================
+
+
+alberta.gat,188,64,4 script Sugar 91,{
+ set @maplenum,0;
+ set @mapleItemID,0;
+ set @maplePrice,0;
+ set @maplePriceT,0;
+ mes "[Sugar]";
+ mes "Welcome!";
+ mes "How delicious are sweets?";
+ mes "My teacher.........";
+ mes "The sweets craftsman of ARUBERUTA";
+ mes "There are sweets that is built hard.";
+ next;
+ mes "[Sugar]";
+ mes "It was given by the darling person.";
+ mes "In return of the present ....";
+ mes "heartfelt like";
+ mes "the sweetness of the present some how.";
+ next;
+ menu "Please give me!",-,"I dont need it.",M_END,"The teacher.",M_L1;
+
+ mes "[Sugar]";
+ mes "Yes!";
+ mes "Select from menu here.";
+ mes "Since there is a limitation in numbers";
+ mes "Not more than ^ff0000 5 pieces^000000.";
+ mes "are allowed to carry out?";
+ next;
+ menu "Candy",-,"Candy Cane",L0_2,"Well baked cookie",L0_3;
+
+ set @maplePrice,3000;
+ set @mapleItemID,529;
+ mes "[Sugar]";
+ mes "It is a candy, and the price is";
+ mes "3000 Zeny each.";
+ mes "How many do you like to purchase?";
+ next;
+ goto L_INPUT;
+L0_2:
+ set @maplePrice,4000;
+ set @mapleItemID,530;
+ mes "[Sugar]";
+ mes "It is a candy cane, and the price is";
+ mes "4000 Zeny each.";
+ mes "How many do you like to purchase?";
+ next;
+ goto L_INPUT;
+L0_3:
+ set @maplePrice,2000;
+ set @mapleItemID,538;
+ mes "[Sugar]";
+ mes "It is a well baked cookie, and the price is";
+ mes "2000 Zeny each.";
+ mes "How many do you like to purchase?";
+ next;
+
+L_INPUT:
+ input @maplenum;
+ if (@maplenum > 5) goto L_ERROR;
+ if (@maplenum == 0) goto M_END;
+ set @maplePriceT,@maplePrice*@maplenum;;
+ if (Zeny < @maplePriceT) goto L_ERROR2;
+ set Zeny,Zeny- @maplePriceT;
+ getitem @mapleItemID,@maplenum;
+ mes "[Sugar]";
+ mes "Thank you!!!";
+ mes "These sweets are really delicious.";
+ mes "Since my teacher of sweet is the No.1 teacher's in world!";
+ mes "Although you may eat by yourself";
+ mes "dont eat so much or you'll grow fat.";
+ mes "Please take care!!!";
+ close;
+
+M_L1:
+ mes "[Sugar]";
+ mes "Yes";
+ mes "The teacher of mine";
+ mes "is Mr. Kuberu, a sweets craftsman.";
+ mes "Making sweets under two persons.";
+ mes "which is allowed to self-train.";
+ next;
+ mes "[Sugar]";
+ mes "Although selling is seemingly to carried out ....";
+ mes "Where he is now?";
+ mes "Which I dont know.";
+ close;
+
+L_ERROR:
+ mes "[Sugar]";
+ mes "???";
+ mes "You seem to have a failure on hearing.";
+ mes "I will tell you once again?";
+ mes "You can only purchase";
+ mes "^ff0000 5 pieces^000000 at once.";
+ next;
+ goto L_INPUT;
+
+L_ERROR2:
+ mes "[Sugar]";
+ mes "???";
+ mes "Hmmm it seems you don't have enough money";
+ mes "to make that purchase.";
+ mes "I will ask you to check your money first.";
+ close;
+
+M_END:
+ mes "[Sugar]";
+ mes "Really .... You might regret it..";
+ mes "If you change your mind.";
+ mes "I am just here ok.";
+ mes "Have a nice day!";
+ close;
+}
diff --git a/npc/events/xmas.txt b/npc/events/xmas.txt
index 7b107ec30..4ec62cc4a 100644
--- a/npc/events/xmas.txt
+++ b/npc/events/xmas.txt
@@ -1,374 +1,374 @@
-//===== eAthena Script =======================================
-//= X-mas Event
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any version of eAthena
-//===== Description: =========================================
-//= Beat up Antonios and grab his socks. Get at least 3 and
-//= give them to Santa Claus Claus in exchange for a present.
-//= Includes X-mas mobs.
-//= This npc will disable, the current Santa Claus npc.
-//===== Additional Comments: =================================
-//= Fixed the spawns [shadowlady]
-//= 1.1 Added Xmas Jakk, fixed 2 exploits, fixed reward Box ID [Lupus]
-//= 1.2 Added monsters to the newer fields, thanks to Muad_Dib [MasterOfMuppets]
-//= 1.2a Fixed a major problem with the monster spawns, thanks to Playtester [MasterOfMuppets]
-//= 1.2b Fixed a minor problem with the mosnter spawns, thanks to Playtester [Kayla]
-//= 1.3 Added Christmas Orc to the places where other orcs spawn [MasterOfMuppets]
-//= Added Christmas goblins to yuno_fild09, thanks to Playtester for pointing it out
-//= 1.4 Added a fix to make Lutie & Bard quests passable during this event [Lupus]
-//============================================================
-
-
-xmas_in.gat,100,96,4 script Father Christmas::Santa2 718,{
- mes "[Santa Claus]";
-//For Lutie & Bard quest
- if(xmas_npc==0) set xmas_npc, 1;
-//
- if(#event_xmas > 0 && #event_xmas < 30 ) goto L_Start;
- mes "Merry Christmas!";
- if(Class==0 || #event_xmas>=30 ) close; //anti exploit protection
- mes "I have a gift for you! Ho Ho Ho!";
- getitem rand(664,667),1; //gives one of 4 gift boxes
- set #event_xmas,#event_xmas+1;
- close;
-
-L_Start:
- mes "I'm having a bit of a problem...";
- mes "Do you care to listen?";
- next;
- menu "Listen to Santa Claus.",M_0, "Give Santa Claus proof.",M_1, "Cancel.",M_End;
-
- M_0:
- mes "[Santa Claus]";
- mes "My problem is this.";
- mes "There seems to be a man out there";
- mes "that is impersonating me and spreading";
- mes "terror throughout the land.";
- next;
- mes "[Santa Claus]";
- mes "Like the Grinch of legend, he's taking";
- mes "all the childrens' toys and keeping them";
- mes "for himself.";
- next;
- mes "[Santa Claus]";
- mes "I'm too busy here creating my batch of ";
- mes "toys for next year, so I can't go";
- mes "out and find him myself.";
- mes "So I would like you to go out and";
- mes "Destroy this man for me.";
- next;
- mes "[Santa Claus]";
- mes "He has in his posession one of my";
- mes "magic sacks, however, so he will";
- mes "escape into it to another place each";
- mes "time you attack him.";
- next;
- mes "[Santa Claus]";
- mes "However,";
- mes "In his haste, he tends to drop things.";
- mes "If by chance he drops one of his Stockings";
- mes "With Holes that he uses to steal the";
- mes "poor childrens' toys, pick it up.";
- next;
- mes "[Santa Claus]";
- mes "If you collect 3 of these, I will give";
- mes "you a prototype mystery box that";
- mes "I've been keeping around the";
- mes "lab. It spits out random presents";
- mes "and saves me a ton of work.";
- close;
- M_1:
- mes "[Santa Claus]";
- if(countitem(7034) < 3) goto L_NotEnuf;
- delitem 7034,3;
- mes "Seems you've been doing a";
- mes "good job of taking down those";
- mes "fake Santas. Keep it up!";
- next;
- getitem 644,1; //Gift Box Prototype
- set #event_xmas,#event_xmas+1;
- mes "[Santa Claus]";
- mes "There's your reward.";
- mes "If you get 3 more, I'll give you another.";
- mes "Hope you get a good item.";
- close;
-
- L_NotEnuf:
- mes "You don't have enough socks as proof.";
- mes "Go take down those evil Santas";
- mes "and get more for me and I'll reward you.";
- close;
- M_End:
- mes "[Santa Claus]";
- mes "I see. Well, at the very least";
- mes "we shall meet again on Christmas morning.";
- close;
-
-OnInit:
- disablenpc "Santa1";
- end;
-}
-
-
-//========================================================================================
-// - Xmas Goblin Spawns
-//========================================================================================
-
-prt_fild11.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
-gef_fild11.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
-
-//========================================================================================
-// - Santa Poring Spawns
-//========================================================================================
-
-ein_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ein_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild00.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild13.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gef_fild14.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-glast_01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-lhz_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild13.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild14.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild15.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild16.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild17.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-moc_fild18.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-pay_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild00.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-prt_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-ama_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-gon_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-um_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-um_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-um_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-um_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-nif_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-nif_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-lou_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-hu_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-hu_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-hu_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-hu_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
-
-//========================================================================================
-// - Antonio Spawns
-//========================================================================================
-
-ein_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ein_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild00.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild13.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gef_fild14.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-glast_01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-lhz_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild13.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild14.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild15.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild16.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild17.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-moc_fild18.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-pay_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild00.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-prt_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-ama_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-gon_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-um_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-um_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-um_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-um_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-nif_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-nif_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-lou_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-hu_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-hu_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-hu_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-hu_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
-
-//========================================================================================
-// - Xmas Jakk
-//========================================================================================
-
-gef_dun01.gat,0,0,0,0 monster Xmas Jakk 1244,5,0,0,0
-//gefenia02.gat,0,0,0,0 monster Xmas Jakk 1244,5,0,0,0
-
-//========================================================================================
-// - Xmas Orc
-//========================================================================================
-
-gef_fild02.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
-gef_fild03.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
-gef_fild10.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
-gef_fild14.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
+//===== eAthena Script =======================================
+//= X-mas Event
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any version of eAthena
+//===== Description: =========================================
+//= Beat up Antonios and grab his socks. Get at least 3 and
+//= give them to Santa Claus Claus in exchange for a present.
+//= Includes X-mas mobs.
+//= This npc will disable, the current Santa Claus npc.
+//===== Additional Comments: =================================
+//= Fixed the spawns [shadowlady]
+//= 1.1 Added Xmas Jakk, fixed 2 exploits, fixed reward Box ID [Lupus]
+//= 1.2 Added monsters to the newer fields, thanks to Muad_Dib [MasterOfMuppets]
+//= 1.2a Fixed a major problem with the monster spawns, thanks to Playtester [MasterOfMuppets]
+//= 1.2b Fixed a minor problem with the mosnter spawns, thanks to Playtester [Kayla]
+//= 1.3 Added Christmas Orc to the places where other orcs spawn [MasterOfMuppets]
+//= Added Christmas goblins to yuno_fild09, thanks to Playtester for pointing it out
+//= 1.4 Added a fix to make Lutie & Bard quests passable during this event [Lupus]
+//============================================================
+
+
+xmas_in.gat,100,96,4 script Father Christmas::Santa2 718,{
+ mes "[Santa Claus]";
+//For Lutie & Bard quest
+ if(xmas_npc==0) set xmas_npc, 1;
+//
+ if(#event_xmas > 0 && #event_xmas < 30 ) goto L_Start;
+ mes "Merry Christmas!";
+ if(Class==0 || #event_xmas>=30 ) close; //anti exploit protection
+ mes "I have a gift for you! Ho Ho Ho!";
+ getitem rand(664,667),1; //gives one of 4 gift boxes
+ set #event_xmas,#event_xmas+1;
+ close;
+
+L_Start:
+ mes "I'm having a bit of a problem...";
+ mes "Do you care to listen?";
+ next;
+ menu "Listen to Santa Claus.",M_0, "Give Santa Claus proof.",M_1, "Cancel.",M_End;
+
+ M_0:
+ mes "[Santa Claus]";
+ mes "My problem is this.";
+ mes "There seems to be a man out there";
+ mes "that is impersonating me and spreading";
+ mes "terror throughout the land.";
+ next;
+ mes "[Santa Claus]";
+ mes "Like the Grinch of legend, he's taking";
+ mes "all the childrens' toys and keeping them";
+ mes "for himself.";
+ next;
+ mes "[Santa Claus]";
+ mes "I'm too busy here creating my batch of ";
+ mes "toys for next year, so I can't go";
+ mes "out and find him myself.";
+ mes "So I would like you to go out and";
+ mes "Destroy this man for me.";
+ next;
+ mes "[Santa Claus]";
+ mes "He has in his posession one of my";
+ mes "magic sacks, however, so he will";
+ mes "escape into it to another place each";
+ mes "time you attack him.";
+ next;
+ mes "[Santa Claus]";
+ mes "However,";
+ mes "In his haste, he tends to drop things.";
+ mes "If by chance he drops one of his Stockings";
+ mes "With Holes that he uses to steal the";
+ mes "poor childrens' toys, pick it up.";
+ next;
+ mes "[Santa Claus]";
+ mes "If you collect 3 of these, I will give";
+ mes "you a prototype mystery box that";
+ mes "I've been keeping around the";
+ mes "lab. It spits out random presents";
+ mes "and saves me a ton of work.";
+ close;
+ M_1:
+ mes "[Santa Claus]";
+ if(countitem(7034) < 3) goto L_NotEnuf;
+ delitem 7034,3;
+ mes "Seems you've been doing a";
+ mes "good job of taking down those";
+ mes "fake Santas. Keep it up!";
+ next;
+ getitem 644,1; //Gift Box Prototype
+ set #event_xmas,#event_xmas+1;
+ mes "[Santa Claus]";
+ mes "There's your reward.";
+ mes "If you get 3 more, I'll give you another.";
+ mes "Hope you get a good item.";
+ close;
+
+ L_NotEnuf:
+ mes "You don't have enough socks as proof.";
+ mes "Go take down those evil Santas";
+ mes "and get more for me and I'll reward you.";
+ close;
+ M_End:
+ mes "[Santa Claus]";
+ mes "I see. Well, at the very least";
+ mes "we shall meet again on Christmas morning.";
+ close;
+
+OnInit:
+ disablenpc "Santa1";
+ end;
+}
+
+
+//========================================================================================
+// - Xmas Goblin Spawns
+//========================================================================================
+
+prt_fild11.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
+gef_fild11.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Christmas Goblin 1245,5,0,0,0
+
+//========================================================================================
+// - Santa Poring Spawns
+//========================================================================================
+
+ein_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ein_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild00.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild13.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gef_fild14.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+glast_01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+lhz_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild13.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild14.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild15.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild16.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild17.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+moc_fild18.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+pay_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild00.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild10.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+prt_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild08.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+ama_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+gon_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+um_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+um_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+um_fild03.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+um_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+nif_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+nif_fild02.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+lou_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+hu_fild01.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+hu_fild04.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+hu_fild05.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+hu_fild07.gat,0,0,0,0 monster Santa Poring 1062,15,0,0,0
+
+//========================================================================================
+// - Antonio Spawns
+//========================================================================================
+
+ein_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ein_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild00.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild13.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gef_fild14.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+glast_01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+lhz_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild13.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild14.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild15.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild16.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild17.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+moc_fild18.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+pay_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild00.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild10.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+prt_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild08.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+ama_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+gon_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+um_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+um_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+um_fild03.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+um_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+nif_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+nif_fild02.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+lou_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+hu_fild01.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+hu_fild04.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+hu_fild05.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+hu_fild07.gat,0,0,0,0 monster Antonio 1247,1,0,0,0
+
+//========================================================================================
+// - Xmas Jakk
+//========================================================================================
+
+gef_dun01.gat,0,0,0,0 monster Xmas Jakk 1244,5,0,0,0
+//gefenia02.gat,0,0,0,0 monster Xmas Jakk 1244,5,0,0,0
+
+//========================================================================================
+// - Xmas Orc
+//========================================================================================
+
+gef_fild02.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
+gef_fild03.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
+gef_fild10.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
+gef_fild14.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0
alde_dun02.gat,0,0,0,0 monster Christmas Orc 1588,5,0,0,0 \ No newline at end of file
diff --git a/npc/guides/guides_alb.txt b/npc/guides/guides_alb.txt
index 69a791287..e25207d59 100644
--- a/npc/guides/guides_alb.txt
+++ b/npc/guides/guides_alb.txt
@@ -1,111 +1,111 @@
-//===== eAthena Script =======================================
-//= Alberta Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed Armory coords, thanks to Freya team
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
-//= to Muad_Dib
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//============================================================
-
-//North
-alberta.gat,23,238,4 script Guide::Alb_Guide 105,{
- cutin "prt_soldier",2;
- mes "[Alberta Guide]";
- mes "Welcome to Alberta, the Port City.";
- mes "Feel free to ask me if you're having trouble finding anything in town, or if you just need guidance around the city.";
-L_MENU:
- next;
- menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-L_CITY:
- mes "[Alberta Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",L_NO;
-L_NO:
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "^FF0000Merchant Guild^000000",L_MERCHANT,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Inn",L_INN,"Forge",L_FORGE,"Cancel",-;
- mes "[Alberta Guide]";
- mes "Please ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_MERCHANT:
- mes "[Alberta Guide]";
- mes "The Merchant Guild, handles Job Changes to the Merchant Class, and is located in the southwest corner of Alberta.";
- viewpoint 1,33,41,1,0xFF0000;
- next;
- goto L_WIPE;
-L_WEAPON:
- mes "[Alberta Guide]";
- mes "The Weapon Shop can be found in the southern end of Alberta.";
- viewpoint 1,117,37,2,0xFF00FF;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Alberta Guide]";
- mes "The Tool Shop is kind of close to the center of Alberta. It shouldn't be too hard to find.";
- viewpoint 1,98,154,3,0xFF00FF;
- next;
- goto L_WIPE;
-L_INN:
- mes "[Alberta Guide]";
- mes "There's and Inn at the northern end of Alberta where you can rest.";
- viewpoint 1,65,233,4,0xFF00FF;
- next;
- goto L_WIPE;
-L_FORGE:
- mes "[Alberta Guide]";
- mes "The Forge in Alberta is in the same building as the Merchant Guild. It's to the southwest.";
- viewpoint 1,33,41,5,0xFF00FF;
- next;
- goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,33,41,1,0xFF0000;
- viewpoint 2,117,37,2,0xFF00FF;
- viewpoint 2,98,154,3,0xFF00FF;
- viewpoint 2,65,233,4,0xFF00FF;
- viewpoint 2,33,41,5,0xFF00FF;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,33,41,1,0xFF0000;
- viewpoint 2,117,37,2,0xFF00FF;
- viewpoint 2,98,154,3,0xFF00FF;
- viewpoint 2,65,233,4,0xFF00FF;
- viewpoint 2,33,41,5,0xFF00FF;
- goto L_MENU;
-L_NOTICE:
- mes "[Alberta Guide]";
- mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Alberta Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Alberta Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Alberta.";
- goto L_MENU;
-L_END:
- mes "[Alberta Guide]";
- mes "Be safe when you travel and don't hesitate to ask me if you have any questions about Alberta.";
- cutin "prt_soldier",255;
- close;
-}
-
-// South --------------------------------------------------------
+//===== eAthena Script =======================================
+//= Alberta Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed Armory coords, thanks to Freya team
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
+//= to Muad_Dib
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//============================================================
+
+//North
+alberta.gat,23,238,4 script Guide::Alb_Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Alberta Guide]";
+ mes "Welcome to Alberta, the Port City.";
+ mes "Feel free to ask me if you're having trouble finding anything in town, or if you just need guidance around the city.";
+L_MENU:
+ next;
+ menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+L_CITY:
+ mes "[Alberta Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",L_NO;
+L_NO:
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "^FF0000Merchant Guild^000000",L_MERCHANT,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Inn",L_INN,"Forge",L_FORGE,"Cancel",-;
+ mes "[Alberta Guide]";
+ mes "Please ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_MERCHANT:
+ mes "[Alberta Guide]";
+ mes "The Merchant Guild, handles Job Changes to the Merchant Class, and is located in the southwest corner of Alberta.";
+ viewpoint 1,33,41,1,0xFF0000;
+ next;
+ goto L_WIPE;
+L_WEAPON:
+ mes "[Alberta Guide]";
+ mes "The Weapon Shop can be found in the southern end of Alberta.";
+ viewpoint 1,117,37,2,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Alberta Guide]";
+ mes "The Tool Shop is kind of close to the center of Alberta. It shouldn't be too hard to find.";
+ viewpoint 1,98,154,3,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_INN:
+ mes "[Alberta Guide]";
+ mes "There's and Inn at the northern end of Alberta where you can rest.";
+ viewpoint 1,65,233,4,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_FORGE:
+ mes "[Alberta Guide]";
+ mes "The Forge in Alberta is in the same building as the Merchant Guild. It's to the southwest.";
+ viewpoint 1,33,41,5,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,33,41,1,0xFF0000;
+ viewpoint 2,117,37,2,0xFF00FF;
+ viewpoint 2,98,154,3,0xFF00FF;
+ viewpoint 2,65,233,4,0xFF00FF;
+ viewpoint 2,33,41,5,0xFF00FF;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,33,41,1,0xFF0000;
+ viewpoint 2,117,37,2,0xFF00FF;
+ viewpoint 2,98,154,3,0xFF00FF;
+ viewpoint 2,65,233,4,0xFF00FF;
+ viewpoint 2,33,41,5,0xFF00FF;
+ goto L_MENU;
+L_NOTICE:
+ mes "[Alberta Guide]";
+ mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Alberta Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Alberta Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Alberta.";
+ goto L_MENU;
+L_END:
+ mes "[Alberta Guide]";
+ mes "Be safe when you travel and don't hesitate to ask me if you have any questions about Alberta.";
+ cutin "prt_soldier",255;
+ close;
+}
+
+// South --------------------------------------------------------
alberta.gat,120,60,3 duplicate(Alb_Guide) Guide#2 105 \ No newline at end of file
diff --git a/npc/guides/guides_alde.txt b/npc/guides/guides_alde.txt
index be1cc3f35..d8088441d 100644
--- a/npc/guides/guides_alde.txt
+++ b/npc/guides/guides_alde.txt
@@ -1,53 +1,53 @@
-//===== eAthena Script =======================================
-//= Al De Baran Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Corrected building locations and descriptions
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
-//= to Muad_Dib
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//= 1.5 Removed Duplicates [Silent]
-//============================================================
-
-
-aldebaran.gat,139,63,4 script Soldier::Alde_Guide 105,{
- cutin "prt_soldier",2;
- mes "[Al De Baran Guard]";
- mes "I'm just an ordinary guard that you could find in any other city.";
- mes "I don't think I even have a name...";
- next;
- mes "[Al De Baran Guard]";
- mes "I am in charge of the Service Guides from the Al De Baran Garrison.";
- mes "Let me guide you through our town!";
- next;
- menu "Get location Guide.",-,"End conversation.",L_End;
- viewpoint 1,57,222,1,0xFF6633;
- viewpoint 1,73,196,2,0x0000FF;
- viewpoint 1,224,224,3,0x00FFFF;
- viewpoint 1,233,106,4,0x515151;
- viewpoint 1,197,71,5,0x3355FF;
- viewpoint 1,60,60,6,0xFF5555;
- mes "^FF6633+^000000 -> Kafra Main Office";
- mes "^0000FF+^000000 -> Weapon Shop";
- mes "^00FFFF+^000000 -> Sorcerer Guild (Closed)";
- mes "^515151+^000000 -> Pub";
- mes "^3355FF+^000000 -> Item Shop";
- mes "^FF5555+^000000 -> Chemical Academy";
- cutin "prt_soldier",255;
- close;
-L_End:
- mes "[Al De Baran Guard]";
- mes "We are sworn to protect Al De Baran! May the forces of evil always be crushed by the righteous fist of good!";
- cutin "prt_soldier",255;
- close;
-}
-
-aldebaran.gat,241,136,4 duplicate(Alde_Guide) Soldier#Alde02 105
+//===== eAthena Script =======================================
+//= Al De Baran Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Corrected building locations and descriptions
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
+//= to Muad_Dib
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//= 1.5 Removed Duplicates [Silent]
+//============================================================
+
+
+aldebaran.gat,139,63,4 script Soldier::Alde_Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Al De Baran Guard]";
+ mes "I'm just an ordinary guard that you could find in any other city.";
+ mes "I don't think I even have a name...";
+ next;
+ mes "[Al De Baran Guard]";
+ mes "I am in charge of the Service Guides from the Al De Baran Garrison.";
+ mes "Let me guide you through our town!";
+ next;
+ menu "Get location Guide.",-,"End conversation.",L_End;
+ viewpoint 1,57,222,1,0xFF6633;
+ viewpoint 1,73,196,2,0x0000FF;
+ viewpoint 1,224,224,3,0x00FFFF;
+ viewpoint 1,233,106,4,0x515151;
+ viewpoint 1,197,71,5,0x3355FF;
+ viewpoint 1,60,60,6,0xFF5555;
+ mes "^FF6633+^000000 -> Kafra Main Office";
+ mes "^0000FF+^000000 -> Weapon Shop";
+ mes "^00FFFF+^000000 -> Sorcerer Guild (Closed)";
+ mes "^515151+^000000 -> Pub";
+ mes "^3355FF+^000000 -> Item Shop";
+ mes "^FF5555+^000000 -> Chemical Academy";
+ cutin "prt_soldier",255;
+ close;
+L_End:
+ mes "[Al De Baran Guard]";
+ mes "We are sworn to protect Al De Baran! May the forces of evil always be crushed by the righteous fist of good!";
+ cutin "prt_soldier",255;
+ close;
+}
+
+aldebaran.gat,241,136,4 duplicate(Alde_Guide) Soldier#Alde02 105
diff --git a/npc/guides/guides_ama.txt b/npc/guides/guides_ama.txt
index a8c5ac26e..982e0513f 100644
--- a/npc/guides/guides_ama.txt
+++ b/npc/guides/guides_ama.txt
@@ -1,128 +1,128 @@
-//===== eAthena Script =======================================
-//= Amatsu Guides
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.0 First version [MasterOfMuppets]
-//= 1.1 Removed Duplicates [Silent]
-//============================================================
-
-amatsu.gat,207,89,3 script Amatsu Guide#01 758,{
-
- mes "[Amachang]";
- mes "Welcome to Amatsu,";
- mes "the town of kind towners";
- mes "and beatiful cherry blossoms.";
- next;
- mes "[Amachang]";
- mes "I'm Amachang,";
- mes "the 13th Miss Amatsu.";
- mes "I will guide you about town";
- mes "as Miss Amatsu.";
- mes "Please tell me";
- mes "if you want to know something.";
- next;
- menu "Palace",-,"Tool Shop",s_Tool,"Weapon Shop",s_Weap,"Bar",s_Bar;
-
- viewpoint 1,85,235,1,0xFF0044;
- mes "[Amachang]";
- mes "On the mini-map,";
- mes "go to ^FF0044+^000000";
- mes "to find the Palace.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-s_Tool:
- viewpoint 1,96,117,2,0xFF9200;
- mes "[Amachang]";
- mes "On the mini-map,";
- mes "go to ^FF9200+^000000";
- mes "to find the Tool Shop.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-s_Weap:
- viewpoint 1,132,117,3,0x85FF00;
- mes "[Amachang]";
- mes "On the mini-map,";
- mes "go to ^85FF00+^000000";
- mes "to find the Weapon Shop.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-
-s_Bar:
- viewpoint 1,216,116,4,0x3366FF;
- mes "[Amachang]";
- mes "On the mini-map,";
- mes "go to ^3366FF+^000000";
- mes "to find the Bar.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-}
-
-amatsu.gat,251,283,4 script Amatsu Guide#02 767,{
-
- mes "[Guide Man]";
- mes "Welcome, tourist from";
- mes "Rune-Midgard.";
- mes "I'm the guide of";
- mes "out beautiful town, Amatsu.";
- next;
- mes "[Guide Man]";
- mes "What are you looking for?";
- next;
- menu "Palace",-,"Tool Shop",s_Tool,"Weapon Shop",s_Weap,"Bar",s_Bar;
-
- viewpoint 1,85,235,1,0xFF0044;
- mes "[Guide Man]";
- mes "On the mini-map,";
- mes "go to ^FF0044+^000000";
- mes "to find the Palace.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-s_Tool:
- viewpoint 1,96,117,2,0xFF9200;
- mes "[Guide Man]";
- mes "On the mini-map,";
- mes "go to ^FF9200+^000000";
- mes "to find the Tool Shop.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-s_Weap:
- viewpoint 1,132,117,3,0x85FF00;
- mes "[Guide Man]";
- mes "On the mini-map,";
- mes "go to ^85FF00+^000000";
- mes "to find the Weapon Shop.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-
-s_Bar:
- viewpoint 1,216,116,4,0x3366FF;
- mes "[Guide Man]";
- mes "On the mini-map,";
- mes "go to ^3366FF+^000000";
- mes "to find the Bar.";
- mes "Have a good time";
- mes "in Amatsu.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Amatsu Guides
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.0 First version [MasterOfMuppets]
+//= 1.1 Removed Duplicates [Silent]
+//============================================================
+
+amatsu.gat,207,89,3 script Amatsu Guide#01 758,{
+
+ mes "[Amachang]";
+ mes "Welcome to Amatsu,";
+ mes "the town of kind towners";
+ mes "and beatiful cherry blossoms.";
+ next;
+ mes "[Amachang]";
+ mes "I'm Amachang,";
+ mes "the 13th Miss Amatsu.";
+ mes "I will guide you about town";
+ mes "as Miss Amatsu.";
+ mes "Please tell me";
+ mes "if you want to know something.";
+ next;
+ menu "Palace",-,"Tool Shop",s_Tool,"Weapon Shop",s_Weap,"Bar",s_Bar;
+
+ viewpoint 1,85,235,1,0xFF0044;
+ mes "[Amachang]";
+ mes "On the mini-map,";
+ mes "go to ^FF0044+^000000";
+ mes "to find the Palace.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+s_Tool:
+ viewpoint 1,96,117,2,0xFF9200;
+ mes "[Amachang]";
+ mes "On the mini-map,";
+ mes "go to ^FF9200+^000000";
+ mes "to find the Tool Shop.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+s_Weap:
+ viewpoint 1,132,117,3,0x85FF00;
+ mes "[Amachang]";
+ mes "On the mini-map,";
+ mes "go to ^85FF00+^000000";
+ mes "to find the Weapon Shop.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+
+s_Bar:
+ viewpoint 1,216,116,4,0x3366FF;
+ mes "[Amachang]";
+ mes "On the mini-map,";
+ mes "go to ^3366FF+^000000";
+ mes "to find the Bar.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+}
+
+amatsu.gat,251,283,4 script Amatsu Guide#02 767,{
+
+ mes "[Guide Man]";
+ mes "Welcome, tourist from";
+ mes "Rune-Midgard.";
+ mes "I'm the guide of";
+ mes "out beautiful town, Amatsu.";
+ next;
+ mes "[Guide Man]";
+ mes "What are you looking for?";
+ next;
+ menu "Palace",-,"Tool Shop",s_Tool,"Weapon Shop",s_Weap,"Bar",s_Bar;
+
+ viewpoint 1,85,235,1,0xFF0044;
+ mes "[Guide Man]";
+ mes "On the mini-map,";
+ mes "go to ^FF0044+^000000";
+ mes "to find the Palace.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+s_Tool:
+ viewpoint 1,96,117,2,0xFF9200;
+ mes "[Guide Man]";
+ mes "On the mini-map,";
+ mes "go to ^FF9200+^000000";
+ mes "to find the Tool Shop.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+s_Weap:
+ viewpoint 1,132,117,3,0x85FF00;
+ mes "[Guide Man]";
+ mes "On the mini-map,";
+ mes "go to ^85FF00+^000000";
+ mes "to find the Weapon Shop.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+
+s_Bar:
+ viewpoint 1,216,116,4,0x3366FF;
+ mes "[Guide Man]";
+ mes "On the mini-map,";
+ mes "go to ^3366FF+^000000";
+ mes "to find the Bar.";
+ mes "Have a good time";
+ mes "in Amatsu.";
+ close;
+
+}
diff --git a/npc/guides/guides_com.txt b/npc/guides/guides_com.txt
index 925ceccf9..13d64a42d 100644
--- a/npc/guides/guides_com.txt
+++ b/npc/guides/guides_com.txt
@@ -1,108 +1,108 @@
-//===== eAthena Script =======================================
-//= Comodo Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working v1.1 Now using duplicate command.
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks
-//= to Muad_Dib [MasterOfMuppets]
-//= 1.4 Removed 3 guides, and converted to use functions.
-//============================================================
-
-comodo.gat,322,178,4 script Comodo Guide#1 700,{
- set @name$,"Native Kokomo";
- callfunc "comodo_guide";
- end;
-}
-comodo.gat,176,350,4 script Comodo Guide#2 700,{
- set @name$,"Native Cocomo";
- callfunc "comodo_guide";
- end;
-}
-comodo.gat,37,219,4 script Comodo Guide#3 700,{
- set @name$,"Native Papaya";
- callfunc "comodo_guide";
- end;
-}
-
-function script comodo_guide {
- mes "[" + @name$ + "]";
- mes "The night of pleasure continues for 24 hours";
- mes "Welcome to Comodo, the gambling city.";
- mes "I can help you to find buildings easily, feel free to ask me anytime.";
- mes "Please choose the building you're searching:";
- next;
- menu "Casino",L_MENU_1,"Hula dancing Stage^3355FF(Dancer Job Change)^000000",L_MENU_2,"Weapon and Armor Shop",L_MENU_3,"Tool Shop",L_MENU_4,"Tourist Shop",L_MENU_5,"Kapra Corp. Western Branch",L_MENU_6,"Chief's House",L_MENU_7,"Pub",L_MENU_8,"Camp Ground",L_MENU_9,"End conversation",L_MENU_10;
-L_MENU_1:
- mes "[" + @name$ + "]";
- viewpoint 1,140,98,1,0xFF6633;
- mes "^FF6633+^000000 -> Casino";
- mes "The casino is an important part of Comodo.";
- mes "The Comodo Casino provides endless entertainment for travelers from all over the world";
- close;
-L_MENU_2:
- mes "[" + @name$ + "]";
- viewpoint 1,188,168,2,0x0000FF;
- mes "^0000FF+^000000 -> Hula dancing Stage";
- mes "Check out the stage located center of town.";
- mes "If you really enjoy the atmosphere of the stage, you should consider about becoming a dancer. ^3355FF(Dancer Job Change)^000000";
- close;
-L_MENU_3:
- mes "[" + @name$ + "]";
- viewpoint 1,266,70,3,0x00FFFF;
- mes "^00FFFF+^000000 -> Weapon and Armor Shop";
- mes "The Weapon and Armor Shop is located south-east edge of town.";
- close;
-L_MENU_4:
- mes "[" + @name$ + "]";
- viewpoint 1,86,128,4,0x515151;
- mes "^515151+^000000 -> Tool Shop";
- mes "The Kit shop is located south-west of town.";
- close;
-L_MENU_5:
- mes "[" + @name$ + "]";
- viewpoint 1,298,124,5,0x3355FF;
- mes "^3355FF+^000000 -> Tourist Shop";
- mes "You should visit the Tourist shop for some rare seashell found only at the shores of Comodo.";
- close;
-L_MENU_6:
- mes "[" + @name$ + "]";
- viewpoint 1,136,202,6,0xFF5555;
- mes "^FF5555+^000000 -> Kapra Corp. Western Branch";
- mes "Yep, the Kapra's Corp will stay with you wherever you go, even here in Comodo!";
- mes "You could find the Kapras near the center of town.";
- close;
-L_MENU_7:
- mes "[" + @name$ + "]";
- viewpoint 1,114,294,7,0xFF5555;
- mes "^FF5555+^000000 -> Chief's House";
- mes "Well, that's obviously where the chief resides.";
- mes "You should pay a visit to him once in a while, he's a great man when you get to know him.";
- close;
-L_MENU_8:
- mes "[" + @name$ + "]";
- viewpoint 1,166,298,8,0xFF5555;
- mes "^FF5555+^000000 -> Pub";
- mes "The pub is the place for all sort of information.";
- mes "The pub is also a place filled with great cultural values for Comodo.";
- close;
-L_MENU_9:
- mes "[" + @name$ + "]";
- viewpoint 1,210,308,9,0xFF5555;
- mes "^FF5555+^000000 -> Camp Ground";
- mes "The Camp Ground is simply a great place to hang out with your familty or companions.";
- mes "Sit around the camp fire and enjoy the wonderful tropical weather and surroundings of Comodo!";
- close;
-L_MENU_10:
- mes "[" + @name$ + "]";
- mes "Well, I guess I will be seeing you around then.";
- mes "Take care, and enjoy your stay.";
- close;
-}
+//===== eAthena Script =======================================
+//= Comodo Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working v1.1 Now using duplicate command.
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks
+//= to Muad_Dib [MasterOfMuppets]
+//= 1.4 Removed 3 guides, and converted to use functions.
+//============================================================
+
+comodo.gat,322,178,4 script Comodo Guide#1 700,{
+ set @name$,"Native Kokomo";
+ callfunc "comodo_guide";
+ end;
+}
+comodo.gat,176,350,4 script Comodo Guide#2 700,{
+ set @name$,"Native Cocomo";
+ callfunc "comodo_guide";
+ end;
+}
+comodo.gat,37,219,4 script Comodo Guide#3 700,{
+ set @name$,"Native Papaya";
+ callfunc "comodo_guide";
+ end;
+}
+
+function script comodo_guide {
+ mes "[" + @name$ + "]";
+ mes "The night of pleasure continues for 24 hours";
+ mes "Welcome to Comodo, the gambling city.";
+ mes "I can help you to find buildings easily, feel free to ask me anytime.";
+ mes "Please choose the building you're searching:";
+ next;
+ menu "Casino",L_MENU_1,"Hula dancing Stage^3355FF(Dancer Job Change)^000000",L_MENU_2,"Weapon and Armor Shop",L_MENU_3,"Tool Shop",L_MENU_4,"Tourist Shop",L_MENU_5,"Kapra Corp. Western Branch",L_MENU_6,"Chief's House",L_MENU_7,"Pub",L_MENU_8,"Camp Ground",L_MENU_9,"End conversation",L_MENU_10;
+L_MENU_1:
+ mes "[" + @name$ + "]";
+ viewpoint 1,140,98,1,0xFF6633;
+ mes "^FF6633+^000000 -> Casino";
+ mes "The casino is an important part of Comodo.";
+ mes "The Comodo Casino provides endless entertainment for travelers from all over the world";
+ close;
+L_MENU_2:
+ mes "[" + @name$ + "]";
+ viewpoint 1,188,168,2,0x0000FF;
+ mes "^0000FF+^000000 -> Hula dancing Stage";
+ mes "Check out the stage located center of town.";
+ mes "If you really enjoy the atmosphere of the stage, you should consider about becoming a dancer. ^3355FF(Dancer Job Change)^000000";
+ close;
+L_MENU_3:
+ mes "[" + @name$ + "]";
+ viewpoint 1,266,70,3,0x00FFFF;
+ mes "^00FFFF+^000000 -> Weapon and Armor Shop";
+ mes "The Weapon and Armor Shop is located south-east edge of town.";
+ close;
+L_MENU_4:
+ mes "[" + @name$ + "]";
+ viewpoint 1,86,128,4,0x515151;
+ mes "^515151+^000000 -> Tool Shop";
+ mes "The Kit shop is located south-west of town.";
+ close;
+L_MENU_5:
+ mes "[" + @name$ + "]";
+ viewpoint 1,298,124,5,0x3355FF;
+ mes "^3355FF+^000000 -> Tourist Shop";
+ mes "You should visit the Tourist shop for some rare seashell found only at the shores of Comodo.";
+ close;
+L_MENU_6:
+ mes "[" + @name$ + "]";
+ viewpoint 1,136,202,6,0xFF5555;
+ mes "^FF5555+^000000 -> Kapra Corp. Western Branch";
+ mes "Yep, the Kapra's Corp will stay with you wherever you go, even here in Comodo!";
+ mes "You could find the Kapras near the center of town.";
+ close;
+L_MENU_7:
+ mes "[" + @name$ + "]";
+ viewpoint 1,114,294,7,0xFF5555;
+ mes "^FF5555+^000000 -> Chief's House";
+ mes "Well, that's obviously where the chief resides.";
+ mes "You should pay a visit to him once in a while, he's a great man when you get to know him.";
+ close;
+L_MENU_8:
+ mes "[" + @name$ + "]";
+ viewpoint 1,166,298,8,0xFF5555;
+ mes "^FF5555+^000000 -> Pub";
+ mes "The pub is the place for all sort of information.";
+ mes "The pub is also a place filled with great cultural values for Comodo.";
+ close;
+L_MENU_9:
+ mes "[" + @name$ + "]";
+ viewpoint 1,210,308,9,0xFF5555;
+ mes "^FF5555+^000000 -> Camp Ground";
+ mes "The Camp Ground is simply a great place to hang out with your familty or companions.";
+ mes "Sit around the camp fire and enjoy the wonderful tropical weather and surroundings of Comodo!";
+ close;
+L_MENU_10:
+ mes "[" + @name$ + "]";
+ mes "Well, I guess I will be seeing you around then.";
+ mes "Take care, and enjoy your stay.";
+ close;
+}
diff --git a/npc/guides/guides_einbe.txt b/npc/guides/guides_einbe.txt
index 041de2ad2..854b4fc01 100644
--- a/npc/guides/guides_einbe.txt
+++ b/npc/guides/guides_einbe.txt
@@ -1,120 +1,120 @@
-//===== eAthena Script =======================================
-//= Einbech Guides
-//===== By: ==================================================
-//= Muad_dib
-//===== Current Version: =====================================
-//= 1.4a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.0 Einbech guide by Muad_dib in prometheus format
-//= 1.0a Conversion to eA format [MasterOfMuppets]
-//= 1.1 missing tabs [Lupus]
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//= 1.4 Removed Duplicates [Silent]
-//= 1.4a missing tabs [KarLaeda]
-//============================================================
-einbech.gat,67,37,4 script Guide#1::Einbech_Guide 852,{
- cutin "ein_soldier",2;
- mes "[Einbech Guide]";
- mes "Welcome to Einbech, the Mining Town.";
- mes "We're here to assist tourists, so if you have any questions, please feel free to ask us.";
-L_MENU:
- next;
- menu "City Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-
- mes "[Einbech Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",-;
-
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "Train Station",L_TRAIN,"Tavern",L_TAVERN,"Tool Shop",L_TOOL,"Swordman Guild",L_SWORD,"Mine",L_MINE,"Cancel",-;
-
- mes "[Einbech Guide]";
- mes "Please ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_TRAIN:
- mes "[Einbech Guide]";
- mes "The Train Stations are located in the nortwest and northeast parts of Einbech.";
- mes "There, you can take a train to Einbroch. They are running between here and Einbroch all day long, everyday.";
- viewpoint 1,44,216,1,0xFF0000;
- next;
- goto L_WIPE;
-L_TAVERN:
- mes "[Einbech Guide]";
- mes "The Tavern is located in the southern part of Einbech.";
- mes "It's a nice place to relax after a long day.";
- viewpoint 1,145,112,2,0xFF00FF;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Einbech Guide]";
- mes "You can find the Tool Shop in the center of Einbech.";
- mes "There, you can purchase any tools you might need for your travels.";
- viewpoint 1,177,135,3,0xFF00FF;
- next;
- goto L_WIPE;
-L_SWORD:
- mes "[Einbech Guide]";
- mes "The Swordman Guild is located in the eastern outskirts of Einbech. ";
- mes "It's under construction and they haven't started accepting applications.";
- viewpoint 1,253,109,4,0xFF00FF;
- next;
- goto L_WIPE;
-L_MINE:
- mes "[Einbech Guide]";
- mes "The Mine, which is Einbech's major industry, is located in the northern part of this town.";
- mes "It's where we get all of our ores, although monsters get in the mines way.";
- viewpoint 1,138,250,5,0x00FF00;
- next;
- goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,44,216,1,0xFF0000;
- viewpoint 2,145,112,2,0xFF00FF;
- viewpoint 2,177,135,3,0xFF00FF;
- viewpoint 2,253,109,4,0xFF00FF;
- viewpoint 2,138,250,5,0x00FF00;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,44,216,1,0xFF0000;
- viewpoint 2,145,112,2,0xFF00FF;
- viewpoint 2,177,135,3,0xFF00FF;
- viewpoint 2,253,109,4,0xFF00FF;
- viewpoint 2,138,250,5,0x00FF00;
- mes "[Einbech Guide]";
- mes "Okay, the marks from your Mini-Map have been removed.";
- mes "If you need any guidance around Einbroch please let me or one of the other Einbech Guides know.";
- goto L_MENU;
-L_NOTICE:
- mes "[Einbech Guide]";
- mes "Through the technology of the Schwartzwalt Republic, we've upgraded to a digital information system that allows us to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Einbech Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Einbech Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Einbech.";
- goto L_MENU;
-L_END:
- mes "[Einbech Guide]";
- mes "We hope that you";
- mes "enjoy your travels";
- mes "here in Einbech.";
- cutin "ein_soldier",255;
- close;
-}
-
+//===== eAthena Script =======================================
+//= Einbech Guides
+//===== By: ==================================================
+//= Muad_dib
+//===== Current Version: =====================================
+//= 1.4a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.0 Einbech guide by Muad_dib in prometheus format
+//= 1.0a Conversion to eA format [MasterOfMuppets]
+//= 1.1 missing tabs [Lupus]
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//= 1.4 Removed Duplicates [Silent]
+//= 1.4a missing tabs [KarLaeda]
+//============================================================
+einbech.gat,67,37,4 script Guide#1::Einbech_Guide 852,{
+ cutin "ein_soldier",2;
+ mes "[Einbech Guide]";
+ mes "Welcome to Einbech, the Mining Town.";
+ mes "We're here to assist tourists, so if you have any questions, please feel free to ask us.";
+L_MENU:
+ next;
+ menu "City Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+
+ mes "[Einbech Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",-;
+
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "Train Station",L_TRAIN,"Tavern",L_TAVERN,"Tool Shop",L_TOOL,"Swordman Guild",L_SWORD,"Mine",L_MINE,"Cancel",-;
+
+ mes "[Einbech Guide]";
+ mes "Please ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_TRAIN:
+ mes "[Einbech Guide]";
+ mes "The Train Stations are located in the nortwest and northeast parts of Einbech.";
+ mes "There, you can take a train to Einbroch. They are running between here and Einbroch all day long, everyday.";
+ viewpoint 1,44,216,1,0xFF0000;
+ next;
+ goto L_WIPE;
+L_TAVERN:
+ mes "[Einbech Guide]";
+ mes "The Tavern is located in the southern part of Einbech.";
+ mes "It's a nice place to relax after a long day.";
+ viewpoint 1,145,112,2,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Einbech Guide]";
+ mes "You can find the Tool Shop in the center of Einbech.";
+ mes "There, you can purchase any tools you might need for your travels.";
+ viewpoint 1,177,135,3,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_SWORD:
+ mes "[Einbech Guide]";
+ mes "The Swordman Guild is located in the eastern outskirts of Einbech. ";
+ mes "It's under construction and they haven't started accepting applications.";
+ viewpoint 1,253,109,4,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_MINE:
+ mes "[Einbech Guide]";
+ mes "The Mine, which is Einbech's major industry, is located in the northern part of this town.";
+ mes "It's where we get all of our ores, although monsters get in the mines way.";
+ viewpoint 1,138,250,5,0x00FF00;
+ next;
+ goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,44,216,1,0xFF0000;
+ viewpoint 2,145,112,2,0xFF00FF;
+ viewpoint 2,177,135,3,0xFF00FF;
+ viewpoint 2,253,109,4,0xFF00FF;
+ viewpoint 2,138,250,5,0x00FF00;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,44,216,1,0xFF0000;
+ viewpoint 2,145,112,2,0xFF00FF;
+ viewpoint 2,177,135,3,0xFF00FF;
+ viewpoint 2,253,109,4,0xFF00FF;
+ viewpoint 2,138,250,5,0x00FF00;
+ mes "[Einbech Guide]";
+ mes "Okay, the marks from your Mini-Map have been removed.";
+ mes "If you need any guidance around Einbroch please let me or one of the other Einbech Guides know.";
+ goto L_MENU;
+L_NOTICE:
+ mes "[Einbech Guide]";
+ mes "Through the technology of the Schwartzwalt Republic, we've upgraded to a digital information system that allows us to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Einbech Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Einbech Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Einbech.";
+ goto L_MENU;
+L_END:
+ mes "[Einbech Guide]";
+ mes "We hope that you";
+ mes "enjoy your travels";
+ mes "here in Einbech.";
+ cutin "ein_soldier",255;
+ close;
+}
+
einbech.gat,48,214,4 duplicate(Einbech_Guide) Guide#Ein2 852 \ No newline at end of file
diff --git a/npc/guides/guides_einbr.txt b/npc/guides/guides_einbr.txt
index 94274fc48..f803c926a 100644
--- a/npc/guides/guides_einbr.txt
+++ b/npc/guides/guides_einbr.txt
@@ -1,168 +1,168 @@
-//===== eAthena Script =======================================
-//= Einbroch Guides
-//===== By: ==================================================
-//= Reddozen
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.0b missing tabs, fixed Guide coords [Lupus]
-//= 1.1 added 1 more Guide NPC, thanx to Justin84 [Lupus]
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//= 1.4 Removed Duplicates [Silent]
-//============================================================
-
-
-einbroch.gat,72,202,4 script Guide#1::Einbroch_Guide 852,{
- cutin "ein_soldier",2;
- mes "[Einbroch Guide]";
- mes "Welcome to Einbroch, the City of Steel.";
- mes "Please ask me if you have any questions";
-
-M_Menu:
- next;
- menu "City Guide",-, "Remove Marks from Mini-Map",M_2, "Notice",L_NOTICE, "Cancel",M_End;
-
- mes "[Einbroch Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map";
- next;
- menu "No Thanks",-,"Yes Please",sM_1b;
-
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
-sM_Menu:
- menu "^FF0000Airport^000000",-,"Train Station",sM_2b,"Factory",sM_2c,"Plaza",sM_2d,
- "Hotel",sM_2e,"Weapon Shop",sM_2f,"Laboratory",sM_2g,"Blacksmith Guild",sM_2h,
- "Einbroch Tower",sM_2i,"Cancel",SM_2j;
-
- mes "[Einbroch Guide]";
- mes "The ^FF0000Airport^000000 is is located in the northwestern part of the city.";
- mes "There you can see our city's pride and joy, the Airship.";
- mes "Remember that you must pay admission to board the Airship.";
- viewpoint 1,63,208,1,0xFF0000;
- next;
- goto sL_Wipe;
- sM_2b:
- mes "[Einbroch Guide]";
- mes "The Train Station is located in the northeast part of Einbroch.";
- mes "Trains are running between here and Einbech all day long, everyday.";
- viewpoint 1,238,272,2,0x0000FF;
- next;
- goto sL_Wipe;
-sM_2c:
- mes "[Einbroch Guide]";
- mes "The Factory, perhaps the most important facility in Einbroch, is located in the southern part of the city.";
- viewpoint 1,149,80,3,0x00FF00;
- next;
- goto sL_Wipe;
-sM_2d:
- mes "[Einbroch Guide]";
- mes "The Plaza, our biggest shopping district, can be found just east from the center of Einbroch";
- viewpoint 1,231,189,4,0xFF00FF;
- next;
- goto sL_Wipe;
-sM_2e:
- mes "[Einbroch Guide]";
- mes "The Hotel is east of the Plaza and offers top caliber accomodations.";
- mes "There, you can enjoy your stay in Einbroch in comfort~";
- viewpoint 1,257,200,5,0x00AAFF;
- next;
- goto sL_Wipe;
-sM_2f:
- mes "[Einbroch Guide]";
- mes "The Weapon Shop is located north from the Plaza.";
- mes "There you can purchase weapons for your personal use.";
- viewpoint 1,217,212,6,0xDDAA00;
- next;
- goto sL_Wipe;
-sM_2g:
- mes "[Einbroch Guide]";
- mes "The Laboratory is an annex of the factory and is located in the southwest sector of Einbech";
- viewpoint 1,43,45,7,0xDDAA00;
- next;
- goto sL_Wipe;
-sM_2h:
- mes "[Einbroch Guide]";
- mes "The Blacksmith Guild is located in the southeast part of Einbroch.";
- mes "You can upgrade your equipment by using their services.";
- viewpoint 1,255,105,8,0xDDAA00;
- next;
- goto sL_Wipe;
-sM_2i:
- mes "[Einbroch Guide]";
- mes "The Einbroch Tower is located in the center of the city.";
- mes "From the top of the tower, you can view all of Einbroch.";
- viewpoint 1,173,195,9,0xDDAA00;
- next;
- goto sL_Wipe;
-
-SM_2j:
- mes "[Einbroch Guide]";
- mes "Please ask me to Remove";
- mes "Marks from Mini-Map if you";
- mes "no longer wish to have the";
- mes "location marks displayed";
- mes "on your Mini-Map.";
- goto M_Menu;
-
-sL_Wipe:
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,63,208,1,0xFF0000;
- viewpoint 2,238,272,2,0x0000FF;
- viewpoint 2,149,80,3,0x00FF00;
- viewpoint 2,231,189,4,0xFF00FF;
- viewpoint 2,257,200,5,0x00AAFF;
- viewpoint 2,217,212,6,0xDDAA00;
- viewpoint 2,43,45,7,0xDDAA00;
- viewpoint 2,255,105,8,0xDDAA00;
- viewpoint 2,173,195,9,0xDDAA00;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
-
-M_2:
- viewpoint 2,63,208,1,0xFF0000;
- viewpoint 2,238,272,2,0x0000FF;
- viewpoint 2,149,80,3,0x00FF00;
- viewpoint 2,231,189,4,0xFF00FF;
- viewpoint 2,257,200,5,0x00AAFF;
- viewpoint 2,217,212,6,0xDDAA00;
- viewpoint 2,43,45,7,0xDDAA00;
- viewpoint 2,255,105,8,0xDDAA00;
- viewpoint 2,173,195,9,0xDDAA00;
- mes "[Einbroch Guide]";
- mes "Okay, the marks from your Mini-Map have been removed.";
- mes "If you need any guidance around Einbroch, please let me or one of the other Einbroch Guides know.";
- cutin "ein_soldier",255;
- goto M_Menu;
-
-L_NOTICE:
- mes "[Einbroch Guide]";
- mes "Through the technology of the Schwartzwalt Republic, we've upgraded to a digital information system that allows us to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Einbroch Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Einbroch Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Einbroch.";
- goto M_Menu;
-
-M_End:
- mes "[Einbroch Guide]";
- mes "We hope that you enjoy your travels here in Einbroch. Oh, and please be aware of the Smog Alerts";
- cutin "ein_soldier",255;
- close;
-}
-
-einbroch.gat,155,43,4 duplicate(Einbroch_Guide) Guide#Einb2 852
-einbroch.gat,162,317,4 duplicate(Einbroch_Guide) Guide#Einb3 852
+//===== eAthena Script =======================================
+//= Einbroch Guides
+//===== By: ==================================================
+//= Reddozen
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.0b missing tabs, fixed Guide coords [Lupus]
+//= 1.1 added 1 more Guide NPC, thanx to Justin84 [Lupus]
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//= 1.4 Removed Duplicates [Silent]
+//============================================================
+
+
+einbroch.gat,72,202,4 script Guide#1::Einbroch_Guide 852,{
+ cutin "ein_soldier",2;
+ mes "[Einbroch Guide]";
+ mes "Welcome to Einbroch, the City of Steel.";
+ mes "Please ask me if you have any questions";
+
+M_Menu:
+ next;
+ menu "City Guide",-, "Remove Marks from Mini-Map",M_2, "Notice",L_NOTICE, "Cancel",M_End;
+
+ mes "[Einbroch Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map";
+ next;
+ menu "No Thanks",-,"Yes Please",sM_1b;
+
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+sM_Menu:
+ menu "^FF0000Airport^000000",-,"Train Station",sM_2b,"Factory",sM_2c,"Plaza",sM_2d,
+ "Hotel",sM_2e,"Weapon Shop",sM_2f,"Laboratory",sM_2g,"Blacksmith Guild",sM_2h,
+ "Einbroch Tower",sM_2i,"Cancel",SM_2j;
+
+ mes "[Einbroch Guide]";
+ mes "The ^FF0000Airport^000000 is is located in the northwestern part of the city.";
+ mes "There you can see our city's pride and joy, the Airship.";
+ mes "Remember that you must pay admission to board the Airship.";
+ viewpoint 1,63,208,1,0xFF0000;
+ next;
+ goto sL_Wipe;
+ sM_2b:
+ mes "[Einbroch Guide]";
+ mes "The Train Station is located in the northeast part of Einbroch.";
+ mes "Trains are running between here and Einbech all day long, everyday.";
+ viewpoint 1,238,272,2,0x0000FF;
+ next;
+ goto sL_Wipe;
+sM_2c:
+ mes "[Einbroch Guide]";
+ mes "The Factory, perhaps the most important facility in Einbroch, is located in the southern part of the city.";
+ viewpoint 1,149,80,3,0x00FF00;
+ next;
+ goto sL_Wipe;
+sM_2d:
+ mes "[Einbroch Guide]";
+ mes "The Plaza, our biggest shopping district, can be found just east from the center of Einbroch";
+ viewpoint 1,231,189,4,0xFF00FF;
+ next;
+ goto sL_Wipe;
+sM_2e:
+ mes "[Einbroch Guide]";
+ mes "The Hotel is east of the Plaza and offers top caliber accomodations.";
+ mes "There, you can enjoy your stay in Einbroch in comfort~";
+ viewpoint 1,257,200,5,0x00AAFF;
+ next;
+ goto sL_Wipe;
+sM_2f:
+ mes "[Einbroch Guide]";
+ mes "The Weapon Shop is located north from the Plaza.";
+ mes "There you can purchase weapons for your personal use.";
+ viewpoint 1,217,212,6,0xDDAA00;
+ next;
+ goto sL_Wipe;
+sM_2g:
+ mes "[Einbroch Guide]";
+ mes "The Laboratory is an annex of the factory and is located in the southwest sector of Einbech";
+ viewpoint 1,43,45,7,0xDDAA00;
+ next;
+ goto sL_Wipe;
+sM_2h:
+ mes "[Einbroch Guide]";
+ mes "The Blacksmith Guild is located in the southeast part of Einbroch.";
+ mes "You can upgrade your equipment by using their services.";
+ viewpoint 1,255,105,8,0xDDAA00;
+ next;
+ goto sL_Wipe;
+sM_2i:
+ mes "[Einbroch Guide]";
+ mes "The Einbroch Tower is located in the center of the city.";
+ mes "From the top of the tower, you can view all of Einbroch.";
+ viewpoint 1,173,195,9,0xDDAA00;
+ next;
+ goto sL_Wipe;
+
+SM_2j:
+ mes "[Einbroch Guide]";
+ mes "Please ask me to Remove";
+ mes "Marks from Mini-Map if you";
+ mes "no longer wish to have the";
+ mes "location marks displayed";
+ mes "on your Mini-Map.";
+ goto M_Menu;
+
+sL_Wipe:
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,63,208,1,0xFF0000;
+ viewpoint 2,238,272,2,0x0000FF;
+ viewpoint 2,149,80,3,0x00FF00;
+ viewpoint 2,231,189,4,0xFF00FF;
+ viewpoint 2,257,200,5,0x00AAFF;
+ viewpoint 2,217,212,6,0xDDAA00;
+ viewpoint 2,43,45,7,0xDDAA00;
+ viewpoint 2,255,105,8,0xDDAA00;
+ viewpoint 2,173,195,9,0xDDAA00;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+
+M_2:
+ viewpoint 2,63,208,1,0xFF0000;
+ viewpoint 2,238,272,2,0x0000FF;
+ viewpoint 2,149,80,3,0x00FF00;
+ viewpoint 2,231,189,4,0xFF00FF;
+ viewpoint 2,257,200,5,0x00AAFF;
+ viewpoint 2,217,212,6,0xDDAA00;
+ viewpoint 2,43,45,7,0xDDAA00;
+ viewpoint 2,255,105,8,0xDDAA00;
+ viewpoint 2,173,195,9,0xDDAA00;
+ mes "[Einbroch Guide]";
+ mes "Okay, the marks from your Mini-Map have been removed.";
+ mes "If you need any guidance around Einbroch, please let me or one of the other Einbroch Guides know.";
+ cutin "ein_soldier",255;
+ goto M_Menu;
+
+L_NOTICE:
+ mes "[Einbroch Guide]";
+ mes "Through the technology of the Schwartzwalt Republic, we've upgraded to a digital information system that allows us to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Einbroch Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Einbroch Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Einbroch.";
+ goto M_Menu;
+
+M_End:
+ mes "[Einbroch Guide]";
+ mes "We hope that you enjoy your travels here in Einbroch. Oh, and please be aware of the Smog Alerts";
+ cutin "ein_soldier",255;
+ close;
+}
+
+einbroch.gat,155,43,4 duplicate(Einbroch_Guide) Guide#Einb2 852
+einbroch.gat,162,317,4 duplicate(Einbroch_Guide) Guide#Einb3 852
diff --git a/npc/guides/guides_gef.txt b/npc/guides/guides_gef.txt
index d71e13fb6..1a7e7afb9 100644
--- a/npc/guides/guides_gef.txt
+++ b/npc/guides/guides_gef.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= Geffen Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. Added a guide at every exit.
-//= v1.1 Now using duplicate command.
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.2a Small note that the BS guild moved to Einbroch [Poki#3]
-//= 1.3 Removed Duplicates [Silent]
-//============================================================
-
-
-// North --------------------------------------------
-geffen.gat,123,202,5 script Guide#1::Gef_Guide 705,{
- cutin "gef_soldier",2;
- mes "[Geffen Soldier]";
- mes "Welcome to Geffen, the City of Magic.";
- next;
- mes "[Geffen Soldier]";
- mes "We are here to help you find your way. Please feel free to speak to us anytime you need help.";
-M_Menu:
- next;
- menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
-
- mes "[Geffen Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",-,"Yes Please",sM_1b;
-
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Geffen Soldier]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "^FF0000Magic Acadamy^000000",-, "^00A500Blacksmith Workshop^000000",M_1_2, "^4444FFGeffen Tower^000000",M_1_3,
- "Armory",M_1_4, "Item Shop",M_1_5, "Pub",M_1_6, "Inn",M_1_7, "Wipe all indications from mini-map",M_1_8, "Cancel", M_End;
-
- mes "[Geffen Soldier]";
- mes "'The 'Magic Acadamy' is the home of magical theorists, and the place for would be Mages.";
- viewpoint 1,61,180,1,0xFF5555;
- goto sL_Wipe;
- M_1_2:
- mes "[Geffen Soldier]";
- mes "The 'Blacksmith Workshop' is SouthEast of Geffen Tower.";
- mes "Please note that the Blacksmith training has bean moved to Einbroch.";
- viewpoint 1,182,59,2,0x44FF44;
- goto sL_Wipe;
- M_1_3:
- mes "[Geffen Soldier]";
- mes "The lower levels of 'Geffen Tower' are spawning grounds for monsters. People go there to train.";
- mes "The top floor of the Tower is home to the ^0000FF'Wizard's Guild'^000000. Mages can go there to become Wizards.";
- viewpoint 1,120,120,3,0x5555FF;
- goto sL_Wipe;
- M_1_4:
- mes "[Geffen Soldier]";
- mes "Head over to the 'Armory' to equip yourself with a variety of weapons and armor.";
- viewpoint 1,99,140,4,0xFF00FF;
- goto sL_Wipe;
- M_1_5:
- mes "[Geffen Soldier]";
- mes "The 'Item Shop' is the place to go when you need to stock up on things like potions and fly-wings.";
- viewpoint 1,44,86,5,0xFF00FF;
- goto sL_Wipe;
- M_1_6:
- mes "[Geffen Soldier]";
- mes "The 'Pub' is a great place to meet people and have fun.";
- viewpoint 1,138,138,6,0xF0C40F;
- goto sL_Wipe;
- M_1_7:
- mes "[Geffen Soldier]";
- mes "The 'Inn' is a good place to rest and replenish your hp and sp.";
- viewpoint 1,172,174,7,0xFF8000;
- goto sL_Wipe;
- M_1_8:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,61,180,1,0xFF5555;
- viewpoint 2,182,59,2,0x44FF44;
- viewpoint 2,120,120,3,0x5555FF;
- viewpoint 2,99,140,4,0xFF00FF;
- viewpoint 2,44,86,5,0xFF00FF;
- viewpoint 2,138,138,6,0xF0C40F;
- viewpoint 2,172,174,7,0xFF8000;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Geffen Soldier]";
- mes "All indications have been removed";
- cutin "gef_soldier",255;
- close;
-
- M_2:
- mes "[Geffen Soldier]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Geffen Soldier]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Geffen Soldier]";
- mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
- mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
- goto M_Menu;
-
- M_End:
- mes "[Geffen Soldier]";
- mes "Have a nice day.";
- cutin "gef_soldier",255;
- close;
-}
-
-// South ------------------------------------------
-geffen.gat,118,62,0 duplicate(Gef_Guide) Guide#Gef2 705
-// East -----------------------------------------------------
-geffen.gat,203,116,2 duplicate(Gef_Guide) Guide#Gef3 705
-// West ----------------------------------------------
-geffen.gat,37,123,5 duplicate(Gef_Guide) Guide#Gef4 705
+//===== eAthena Script =======================================
+//= Geffen Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. Added a guide at every exit.
+//= v1.1 Now using duplicate command.
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.2a Small note that the BS guild moved to Einbroch [Poki#3]
+//= 1.3 Removed Duplicates [Silent]
+//============================================================
+
+
+// North --------------------------------------------
+geffen.gat,123,202,5 script Guide#1::Gef_Guide 705,{
+ cutin "gef_soldier",2;
+ mes "[Geffen Soldier]";
+ mes "Welcome to Geffen, the City of Magic.";
+ next;
+ mes "[Geffen Soldier]";
+ mes "We are here to help you find your way. Please feel free to speak to us anytime you need help.";
+M_Menu:
+ next;
+ menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
+
+ mes "[Geffen Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",-,"Yes Please",sM_1b;
+
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Geffen Soldier]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "^FF0000Magic Acadamy^000000",-, "^00A500Blacksmith Workshop^000000",M_1_2, "^4444FFGeffen Tower^000000",M_1_3,
+ "Armory",M_1_4, "Item Shop",M_1_5, "Pub",M_1_6, "Inn",M_1_7, "Wipe all indications from mini-map",M_1_8, "Cancel", M_End;
+
+ mes "[Geffen Soldier]";
+ mes "'The 'Magic Acadamy' is the home of magical theorists, and the place for would be Mages.";
+ viewpoint 1,61,180,1,0xFF5555;
+ goto sL_Wipe;
+ M_1_2:
+ mes "[Geffen Soldier]";
+ mes "The 'Blacksmith Workshop' is SouthEast of Geffen Tower.";
+ mes "Please note that the Blacksmith training has bean moved to Einbroch.";
+ viewpoint 1,182,59,2,0x44FF44;
+ goto sL_Wipe;
+ M_1_3:
+ mes "[Geffen Soldier]";
+ mes "The lower levels of 'Geffen Tower' are spawning grounds for monsters. People go there to train.";
+ mes "The top floor of the Tower is home to the ^0000FF'Wizard's Guild'^000000. Mages can go there to become Wizards.";
+ viewpoint 1,120,120,3,0x5555FF;
+ goto sL_Wipe;
+ M_1_4:
+ mes "[Geffen Soldier]";
+ mes "Head over to the 'Armory' to equip yourself with a variety of weapons and armor.";
+ viewpoint 1,99,140,4,0xFF00FF;
+ goto sL_Wipe;
+ M_1_5:
+ mes "[Geffen Soldier]";
+ mes "The 'Item Shop' is the place to go when you need to stock up on things like potions and fly-wings.";
+ viewpoint 1,44,86,5,0xFF00FF;
+ goto sL_Wipe;
+ M_1_6:
+ mes "[Geffen Soldier]";
+ mes "The 'Pub' is a great place to meet people and have fun.";
+ viewpoint 1,138,138,6,0xF0C40F;
+ goto sL_Wipe;
+ M_1_7:
+ mes "[Geffen Soldier]";
+ mes "The 'Inn' is a good place to rest and replenish your hp and sp.";
+ viewpoint 1,172,174,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_8:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,61,180,1,0xFF5555;
+ viewpoint 2,182,59,2,0x44FF44;
+ viewpoint 2,120,120,3,0x5555FF;
+ viewpoint 2,99,140,4,0xFF00FF;
+ viewpoint 2,44,86,5,0xFF00FF;
+ viewpoint 2,138,138,6,0xF0C40F;
+ viewpoint 2,172,174,7,0xFF8000;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Geffen Soldier]";
+ mes "All indications have been removed";
+ cutin "gef_soldier",255;
+ close;
+
+ M_2:
+ mes "[Geffen Soldier]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Geffen Soldier]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Geffen Soldier]";
+ mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
+ mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
+ goto M_Menu;
+
+ M_End:
+ mes "[Geffen Soldier]";
+ mes "Have a nice day.";
+ cutin "gef_soldier",255;
+ close;
+}
+
+// South ------------------------------------------
+geffen.gat,118,62,0 duplicate(Gef_Guide) Guide#Gef2 705
+// East -----------------------------------------------------
+geffen.gat,203,116,2 duplicate(Gef_Guide) Guide#Gef3 705
+// West ----------------------------------------------
+geffen.gat,37,123,5 duplicate(Gef_Guide) Guide#Gef4 705
diff --git a/npc/guides/guides_hu.txt b/npc/guides/guides_hu.txt
index 359b28eba..b6bf2a0f3 100644
--- a/npc/guides/guides_hu.txt
+++ b/npc/guides/guides_hu.txt
@@ -1,151 +1,151 @@
-//===== eAthena Script =======================================
-//= Guard of Hugel City
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Guard/Guide NPC of City of Hugel.
-//===== Additional Comments: =================================
-//= 1.0 Started the script. [erKURITA]
-//= 1.1 Removed Duplicates [Silent]
-//============================================================
-
-
-hugel.gat,98,57,3 script Old Lady#hu1 863,{
- mes "[Old Lady]";
- mes "Welcome to Hugel, the Power Source City.";
- next;
- mes "[Old Lady]";
- mes "I am here to help you find your way. Please feel free to speak to me anytime you need help.";
-M_Menu:
- next;
- menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
-
- mes "[Old Lady]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",-,"Yes Please",sM_1b;
-
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Old Lady]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "Church",-,
- "Hotel",M_1_2,
- "Pub",M_1_3,
- "Airship",M_1_4,
- "Weapon/Armor Shop",M_1_5,
- "Grocery/Tool shop",M_1_6,
- "Firecrackers Shop",M_1_7,
- "Hunter Guild",M_1_8a,
- "^000066Poring Track 1^000000",M_1_9,
- "^000066Poring Track 2^000000",M_1_10,
- "^000066Bingo House^000000",M_1_11,
- "Wipe all indications from mini-map",M_1_8,
- "Cancel", M_End;
-
- mes "[Old Lady]";
- mes "'The 'Church' here in Hugel will grant your wedding's day a lot of happiness.";
- mes "It's located at the east of Hugel, south of the Airship";
- viewpoint 1,157,112,1,0xFF5555;
- goto sL_Wipe;
- M_1_2:
- mes "[Old Lady]";
- mes "The 'Hotel' is a few steps close here. Just go north through this road.";
- mes "It is a good place to rest and replenish your hp and sp.";
- viewpoint 1,101,78,2,0x44FF44;
- goto sL_Wipe;
- M_1_3:
- mes "[Old Lady]";
- mes "The 'Pub' is east of here, go and pass by for some rest! It is a great place to meet people and have fun.";
- viewpoint 1,126,65,3,0x5555FF;
- goto sL_Wipe;
- M_1_4:
- mes "[Old Lady]";
- mes "Head over to the 'Airship' to fly to other cities.";
- viewpoint 1,189,166,4,0xFF00FF;
- goto sL_Wipe;
- M_1_5:
- mes "[Old Lady]";
- mes "The 'Weapon/Armor shop' is the place to go when you need something to defend yourself from the other monsters";
- viewpoint 1,72,155,5,0xFF00FF;
- goto sL_Wipe;
- M_1_6:
- mes "[Old Lady]";
- mes "The 'Grocery/Tool shop' is the place to go when you need to stock up on things like potions and fly-wings.";
- viewpoint 1,92,164,6,0xF0C40F;
- goto sL_Wipe;
- M_1_7:
- mes "[Old Lady]";
- mes "The 'Firecracker shop' will provide you with some flashy fireworks to lit up your night";
- viewpoint 1,94,104,7,0xFF8000;
- goto sL_Wipe;
- M_1_8a:
- mes "[Old Lady]";
- mes "The 'Hunter Guild' is located at the northeast of Hugel. Sharpen your eyes!";
- viewpoint 1,208,225,7,0xFF8000;
- goto sL_Wipe;
- M_1_9:
- mes "[Old Lady]";
- mes "The '^000066Poring Track Nº1^000000' is new and exciting entertaintment, make sure to check it!";
- viewpoint 1,58,72,7,0xFF8000;
- goto sL_Wipe;
- M_1_10:
- mes "[Old Lady]";
- mes "The '^000066Poring Track Nº2^000000' is new and exciting entertaintment, make sure to check it!";
- viewpoint 1,62,68,7,0xFF8000;
- goto sL_Wipe;
- M_1_11:
- mes "[Old Lady]";
- mes "The 'Bingo House' is located at the northwest of Hugel. Lay your bet ladies and gentlements!";
- viewpoint 1,57,207,7,0xFF8000;
- goto sL_Wipe;
- M_1_8:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,157,112,1,0xFF5555;
- viewpoint 2,101,78,2,0x44FF44;
- viewpoint 2,126,65,3,0x5555FF;
- viewpoint 2,189,166,4,0xFF00FF;
- viewpoint 2,72,155,5,0xFF00FF;
- viewpoint 2,92,164,6,0xF0C40F;
- viewpoint 2,94,104,7,0xFF8000;
- viewpoint 2,208,225,7,0xFF8000;
- viewpoint 2,58,72,7,0xFF8000;
- viewpoint 2,62,68,7,0xFF8000;
- viewpoint 2,57,207,7,0xFF8000;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Old Lady]";
- mes "All indications have been removed";
- close;
-
- M_2:
- mes "[Old Lady]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Old Lady]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Old Lady]";
- mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
- mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
- goto M_Menu;
-
- M_End:
- mes "[Old Lady]";
- mes "Have a nice day, deary~";
- close;
+//===== eAthena Script =======================================
+//= Guard of Hugel City
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Guard/Guide NPC of City of Hugel.
+//===== Additional Comments: =================================
+//= 1.0 Started the script. [erKURITA]
+//= 1.1 Removed Duplicates [Silent]
+//============================================================
+
+
+hugel.gat,98,57,3 script Old Lady#hu1 863,{
+ mes "[Old Lady]";
+ mes "Welcome to Hugel, the Power Source City.";
+ next;
+ mes "[Old Lady]";
+ mes "I am here to help you find your way. Please feel free to speak to me anytime you need help.";
+M_Menu:
+ next;
+ menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
+
+ mes "[Old Lady]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",-,"Yes Please",sM_1b;
+
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Old Lady]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "Church",-,
+ "Hotel",M_1_2,
+ "Pub",M_1_3,
+ "Airship",M_1_4,
+ "Weapon/Armor Shop",M_1_5,
+ "Grocery/Tool shop",M_1_6,
+ "Firecrackers Shop",M_1_7,
+ "Hunter Guild",M_1_8a,
+ "^000066Poring Track 1^000000",M_1_9,
+ "^000066Poring Track 2^000000",M_1_10,
+ "^000066Bingo House^000000",M_1_11,
+ "Wipe all indications from mini-map",M_1_8,
+ "Cancel", M_End;
+
+ mes "[Old Lady]";
+ mes "'The 'Church' here in Hugel will grant your wedding's day a lot of happiness.";
+ mes "It's located at the east of Hugel, south of the Airship";
+ viewpoint 1,157,112,1,0xFF5555;
+ goto sL_Wipe;
+ M_1_2:
+ mes "[Old Lady]";
+ mes "The 'Hotel' is a few steps close here. Just go north through this road.";
+ mes "It is a good place to rest and replenish your hp and sp.";
+ viewpoint 1,101,78,2,0x44FF44;
+ goto sL_Wipe;
+ M_1_3:
+ mes "[Old Lady]";
+ mes "The 'Pub' is east of here, go and pass by for some rest! It is a great place to meet people and have fun.";
+ viewpoint 1,126,65,3,0x5555FF;
+ goto sL_Wipe;
+ M_1_4:
+ mes "[Old Lady]";
+ mes "Head over to the 'Airship' to fly to other cities.";
+ viewpoint 1,189,166,4,0xFF00FF;
+ goto sL_Wipe;
+ M_1_5:
+ mes "[Old Lady]";
+ mes "The 'Weapon/Armor shop' is the place to go when you need something to defend yourself from the other monsters";
+ viewpoint 1,72,155,5,0xFF00FF;
+ goto sL_Wipe;
+ M_1_6:
+ mes "[Old Lady]";
+ mes "The 'Grocery/Tool shop' is the place to go when you need to stock up on things like potions and fly-wings.";
+ viewpoint 1,92,164,6,0xF0C40F;
+ goto sL_Wipe;
+ M_1_7:
+ mes "[Old Lady]";
+ mes "The 'Firecracker shop' will provide you with some flashy fireworks to lit up your night";
+ viewpoint 1,94,104,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_8a:
+ mes "[Old Lady]";
+ mes "The 'Hunter Guild' is located at the northeast of Hugel. Sharpen your eyes!";
+ viewpoint 1,208,225,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_9:
+ mes "[Old Lady]";
+ mes "The '^000066Poring Track Nº1^000000' is new and exciting entertaintment, make sure to check it!";
+ viewpoint 1,58,72,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_10:
+ mes "[Old Lady]";
+ mes "The '^000066Poring Track Nº2^000000' is new and exciting entertaintment, make sure to check it!";
+ viewpoint 1,62,68,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_11:
+ mes "[Old Lady]";
+ mes "The 'Bingo House' is located at the northwest of Hugel. Lay your bet ladies and gentlements!";
+ viewpoint 1,57,207,7,0xFF8000;
+ goto sL_Wipe;
+ M_1_8:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,157,112,1,0xFF5555;
+ viewpoint 2,101,78,2,0x44FF44;
+ viewpoint 2,126,65,3,0x5555FF;
+ viewpoint 2,189,166,4,0xFF00FF;
+ viewpoint 2,72,155,5,0xFF00FF;
+ viewpoint 2,92,164,6,0xF0C40F;
+ viewpoint 2,94,104,7,0xFF8000;
+ viewpoint 2,208,225,7,0xFF8000;
+ viewpoint 2,58,72,7,0xFF8000;
+ viewpoint 2,62,68,7,0xFF8000;
+ viewpoint 2,57,207,7,0xFF8000;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Old Lady]";
+ mes "All indications have been removed";
+ close;
+
+ M_2:
+ mes "[Old Lady]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Old Lady]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Old Lady]";
+ mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
+ mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
+ goto M_Menu;
+
+ M_End:
+ mes "[Old Lady]";
+ mes "Have a nice day, deary~";
+ close;
} \ No newline at end of file
diff --git a/npc/guides/guides_izl.txt b/npc/guides/guides_izl.txt
index 7b028c7bd..b301dd9a6 100644
--- a/npc/guides/guides_izl.txt
+++ b/npc/guides/guides_izl.txt
@@ -1,116 +1,116 @@
-//===== eAthena Script =======================================
-//= Izlude Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
-//= to Muad_Dib
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//============================================================
-
-izlude.gat,121,87,6 script Guide 105,{
- cutin "prt_soldier",2;
- mes "[Izlude Guide]";
- mes "Welcome to Izlude, Prontera's satellite city.";
- mes "If you need any guidance around Izlude, feel free to ask me at anytime.";
-L_MENU:
- next;
- menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-L_CITY:
- mes "[Izlude Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",L_NO;
-L_NO:
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "^FF0000Swordman Association^000000",L_SWORD,"Swordman Hall",L_HALL,"Arena",L_ARENA,"Izlude Marina",L_MARINA,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Cancel",-;
- mes "[Izlude Guide]";
- mes "Please ask me to remove marks from then Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_SWORD:
- mes "[Izlude Guide]";
- mes "The Swordman Association is located on an island that is in west Izlude.";
- mes "If you're thinking of changing jobs to Swordman, you should check it out.";
- viewpoint 1,52,140,1,0xFF0000;
- next;
- goto L_WIPE;
-L_HALL:
- mes "[Izlude Guide]";
- mes "The Swordman Hall is located on the eastern island connected to Izlude.";
- viewpoint 1,214,130,2,0x00FF00;
- next;
- goto L_WIPE;
-L_ARENA:
- mes "[Izlude Guide]";
- mes "Izlude's famous Arena is located at the northern end of Izlude.";
- viewpoint 1,128,225,3,0x00FF00;
- next;
- goto L_WIPE;
-L_MARINA:
- mes "[Izlude Guide]";
- mes "You can find the Marina in the northeast part of Izlude.";
- mes "There, you can ride a ship which will take you to Alberta or Byalan Island.";
- viewpoint 1,200,180,4,0xFF0000;
- next;
- goto L_WIPE;
-L_WEAPON:
- mes "[Izlude Guide]";
- mes "You can easily find the Weapon Shop in northwest Izlude.";
- viewpoint 1,111,149,5,0xFF00FF;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Izlude Guide]";
- mes "The Tool Shop shouldn't be too hard to find in the northeast part of Izlude.";
- viewpoint 1,148,148,6,0xFF00FF;
- next;
- goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,52,140,1,0xFF0000;
- viewpoint 2,214,130,2,0x00FF00;
- viewpoint 2,128,225,3,0x00FF00;
- viewpoint 2,200,180,4,0xFF0000;
- viewpoint 2,111,149,5,0xFF00FF;
- viewpoint 2,148,148,6,0xFF00FF;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,52,140,1,0xFF0000;
- viewpoint 2,214,130,2,0x00FF00;
- viewpoint 2,128,225,3,0x00FF00;
- viewpoint 2,200,180,4,0xFF0000;
- viewpoint 2,111,149,5,0xFF00FF;
- viewpoint 2,148,148,6,0xFF00FF;
- goto L_MENU;
-L_NOTICE:
- mes "[Izlude Guide]";
- mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Izlude Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Izlude Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Izlude.";
- goto L_MENU;
-L_END:
- mes "[Izlude Guide]";
- mes "Okay then, feel free to come to me if you ever feel lost around Izlude, alright?";
- cutin "prt_soldier",255;
- close;
+//===== eAthena Script =======================================
+//= Izlude Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
+//= to Muad_Dib
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//============================================================
+
+izlude.gat,121,87,6 script Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Izlude Guide]";
+ mes "Welcome to Izlude, Prontera's satellite city.";
+ mes "If you need any guidance around Izlude, feel free to ask me at anytime.";
+L_MENU:
+ next;
+ menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+L_CITY:
+ mes "[Izlude Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",L_NO;
+L_NO:
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "^FF0000Swordman Association^000000",L_SWORD,"Swordman Hall",L_HALL,"Arena",L_ARENA,"Izlude Marina",L_MARINA,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Cancel",-;
+ mes "[Izlude Guide]";
+ mes "Please ask me to remove marks from then Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_SWORD:
+ mes "[Izlude Guide]";
+ mes "The Swordman Association is located on an island that is in west Izlude.";
+ mes "If you're thinking of changing jobs to Swordman, you should check it out.";
+ viewpoint 1,52,140,1,0xFF0000;
+ next;
+ goto L_WIPE;
+L_HALL:
+ mes "[Izlude Guide]";
+ mes "The Swordman Hall is located on the eastern island connected to Izlude.";
+ viewpoint 1,214,130,2,0x00FF00;
+ next;
+ goto L_WIPE;
+L_ARENA:
+ mes "[Izlude Guide]";
+ mes "Izlude's famous Arena is located at the northern end of Izlude.";
+ viewpoint 1,128,225,3,0x00FF00;
+ next;
+ goto L_WIPE;
+L_MARINA:
+ mes "[Izlude Guide]";
+ mes "You can find the Marina in the northeast part of Izlude.";
+ mes "There, you can ride a ship which will take you to Alberta or Byalan Island.";
+ viewpoint 1,200,180,4,0xFF0000;
+ next;
+ goto L_WIPE;
+L_WEAPON:
+ mes "[Izlude Guide]";
+ mes "You can easily find the Weapon Shop in northwest Izlude.";
+ viewpoint 1,111,149,5,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Izlude Guide]";
+ mes "The Tool Shop shouldn't be too hard to find in the northeast part of Izlude.";
+ viewpoint 1,148,148,6,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,52,140,1,0xFF0000;
+ viewpoint 2,214,130,2,0x00FF00;
+ viewpoint 2,128,225,3,0x00FF00;
+ viewpoint 2,200,180,4,0xFF0000;
+ viewpoint 2,111,149,5,0xFF00FF;
+ viewpoint 2,148,148,6,0xFF00FF;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,52,140,1,0xFF0000;
+ viewpoint 2,214,130,2,0x00FF00;
+ viewpoint 2,128,225,3,0x00FF00;
+ viewpoint 2,200,180,4,0xFF0000;
+ viewpoint 2,111,149,5,0xFF00FF;
+ viewpoint 2,148,148,6,0xFF00FF;
+ goto L_MENU;
+L_NOTICE:
+ mes "[Izlude Guide]";
+ mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Izlude Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Izlude Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Izlude.";
+ goto L_MENU;
+L_END:
+ mes "[Izlude Guide]";
+ mes "Okay then, feel free to come to me if you ever feel lost around Izlude, alright?";
+ cutin "prt_soldier",255;
+ close;
} \ No newline at end of file
diff --git a/npc/guides/guides_lhz.txt b/npc/guides/guides_lhz.txt
index aae728380..efe486c55 100644
--- a/npc/guides/guides_lhz.txt
+++ b/npc/guides/guides_lhz.txt
@@ -1,362 +1,362 @@
-//===== eAthena Script =======================================
-//= Lighthalzen Guides
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= Lighthalzen Guide NPCs
-//===== Additional Comments: =================================
-//= 1.0 First Version [MasterOfMuppets]
-//= 1.1 Removed Duplicates [Silent]
-//============================================================
-
-lighthalzen.gat,220,311,3 script Guide::LhzSlum 852,{
-
- mes "[Lighthalzen Guide]";
- mes "welcome to Lighthalzen,";
- mes "the Coropration City-State.";
- mes "If you need any guidance";
- mes "around the city, feel free.";
- mes "to ask me and I'll do my";
- mes "very best to help you.";
- next;
-loopback:
- menu "City Guide",s_Guide,"Remove Marks from Mini-Map",s_Remove,"Notice.",s_Notice,"Cancel",-;
-
- mes "[Lighthalzen Guide]";
- mes "Lighthalzen is divided";
- mes "into the East and West";
- mes "districts by a railroad that";
- mes "runs right through the middle.";
- mes "There are always guards on";
- mes "watch to protect the peace.";
- next;
- mes "[Lighthalzen Guide]";
- mes "Please don't hesitate";
- mes "to report and suspicious";
- mes "activity or persons to us.";
- mes "We hope that you enjoy";
- mes "our fair city, adventurer.";
- close;
-
-s_Guide:
- mes "[Lighthalzen Guide]";
- mes "Please be aware that I'm";
- mes "in charge of providing info";
- mes "regarding the East District,";
- mes "more commonly known as the";
- mes "Slums. Select the location that";
- mes "you'd like know more about.";
- next;
- mes "[Lighthalzen Guide]";
- mes "But before that,";
- mes "would you like me";
- mes "to mark locations";
- mes "on your Mini-Map?";
- next;
- Menu "Yes",s_Yes,"No",-;
-
- goto s_Cont;
-s_Yes:
- set @tempguide,1;
-s_Cont:
- menu "Tool Shop",s_Tool,"Mill",s_Mill,"Pub",s_Pub,"Cancel",-;
-
- mes "[Lighthalzen Guide]";
- mes "Please ask me to \"Remove";
- mes "Marks from Mini-Map\" if you";
- mes "no longer wish to have the";
- mes "location marks displayed";
- mes "on your Mini-Map.";
- next;
- goto loopback;
-
-s_Tool:
- mes "[Lighthalzen Guide]";
- mes "The Tool Shop is";
- mes "located in the 11 o' clock";
- mes "direction from the center";
- mes "of the East District.";
- if(@tempguide)viewpoint 1,324,301,1,0xFF0000;
- next;
- goto s_Cont;
-
-s_Mill:
- mes "[Lighthalzen Guide]";
- mes "On your Mini-Map,";
- mes "the Mill can be found in";
- mes "the 1 o'clock direction";
- mes "in the East District.";
- if(@tempguide)viewpoint 1,365,301,2,0xFF00FF;
- next;
- goto s_Cont;
-
-s_Pub:
- mes "[Lighthalzen Guide]";
- mes "The Pub is located";
- mes "in the southern part";
- mes "of the East District.";
- if(@tempguide)viewpoint 1,346,232,3,0xCCFFFF;
- next;
- goto s_Cont;
-
-s_Remove:
- viewpoint 2,324,301,1,0xFF0000;
- viewpoint 2,365,301,2,0xFF00FF;
- viewpoint 2,346,232,3,0xCCFFFF;
- mes "[Lighthalzen Guide]";
- mes "Okay, the marks from your Mini-Map have been removed.";
- mes "If you need any guidance around Lighthalzen, please let me or one of the other Lighthalzen Guides know.";
- next;
- goto loopback;
-
-s_Notice:
- mes "[Lighthalzen Guide]";
- mes "Advances in sorcery and";
- mes "techonlogy have allowed";
- mes "us to update our information";
- mes "system, enabling up to mark";
- mes "locations on your Mini-Map";
- mes "for easier navigation.";
- next;
- mes "[Lighthalzen Guide]";
- mes "Your Mini-Map is located";
- mes "in the upper right cornern";
- mes "of the screen. If you can't";
- mes "see it, press the Ctrl + Tab";
- mes "keys or click the \"Map\" button";
- mes "in your Basic Info Window.";
- next;
- mes "[Lighthalzen Guide]";
- mes "On your Mini-Map,";
- mes "click on the \"+\" and \"-\"";
- mes "symbols to zoom in and";
- mes "out of your Mini-Map. We";
- mes "hope you enjoy your travels";
- mes "here in Lighthalzen.";
- next;
- goto loopback;
-
-}
-
-lighthalzen.gat,207,311,3 script Guide::LhzWest 852,{
-
- mes "[Lighthalzen Guide]";
- mes "welcome to Lighthalzen,";
- mes "the Coropration City-State.";
- mes "If you need any guidance";
- mes "around the city, feel free.";
- mes "to ask me and I'll do my";
- mes "very best to help you.";
- next;
-loopback:
- menu "City Guide",s_Guide,"Remove Marks from Mini-Map",s_Remove,"Notice.",s_Notice,"Cancel",-;
-
- mes "[Lighthalzen Guide]";
- mes "Lighthalzen is divided";
- mes "into the East and West";
- mes "districts by a railroad that";
- mes "runs right through the middle.";
- mes "There are always guards on";
- mes "watch to protect the peace.";
- next;
- mes "[Lighthalzen Guide]";
- mes "Please don't hesitate";
- mes "to report and suspicious";
- mes "activity or persons to us.";
- mes "We hope that you enjoy";
- mes "our fair city, adventurer.";
- close;
-
-s_Guide:
- mes "[Lighthalzen Guide]";
- mes "Please be aware that I'm";
- mes "in charge of providing info";
- mes "regarding the West District,";
- mes "of Lighthalzen. Now, please";
- mes "select the location that you'd";
- mes "like to learn more about.";
- next;
- mes "[Lighthalzen Guide]";
- mes "But before that,";
- mes "would you like me";
- mes "to mark locations";
- mes "on your Mini-Map?";
- next;
- Menu "Yes",s_Yes,"No",-;
-
- goto s_Cont;
-s_Yes:
- set @tempguide,1;
-s_Cont:
- menu "^FF0000Rekenber Corporation",s_Rekenber,"^000000Train Station",s_Train,"Police Station",s_Police,"Bank",s_Bank,"Hotel",s_Hotel,"Airport",s_Airport,"Merchant Guild",s_Merchant,"Jewel Shop",s_Jewel,"Weapon Shop",s_Weap,"Department Store",s_Store,"Cancel",-;
-
- mes "[Lighthalzen Guide]";
- mes "Please ask me to \"Remove";
- mes "Marks from Mini-Map\" if you";
- mes "no longer wish to have the";
- mes "location marks displayed";
- mes "on your Mini-Map.";
- next;
- goto loopback;
-
-s_Rekenber:
- mes "[Lighthalzen Guide]";
- mes "Rekenber Corporation,";
- mes "the largest company in";
- mes "the Schwartzwald Republic,";
- mes "is located in the northwestern";
- mes "Lighthalzen. You can't miss";
- mes "the headquarters building.";
- if(@tempguide)viewpoint 1,103,244,1,0xFF0000;
- next;
- goto s_Cont;
-
-s_Train:
- mes "[Lighthalzen Guide]";
- mes "The Train Station is";
- mes "located in the center of";
- mes "the city, where we have";
- mes "a direct railroad to Einbroch.";
- if(@tempguide)viewpoint 1,240,163,2,0xFF00FF;
- next;
- goto s_Cont;
-
-s_Police:
- mes "[Lighthalzen Guide]";
- mes "Our Police Station is just";
- mes "north of the city's center.";
- mes "Please don't hesitate to report";
- mes "any suspicious persons and";
- mes "activity, or if you have any";
- mes "problems whatsoever.";
- if(@tempguide)viewpoint 1,236,276,3,0xCCFFFF;
- next;
- goto s_Cont;
-
-s_Bank:
- mes "[Lighthalzen Guide]";
- mes "The Bank is located";
- mes "just opposite to the";
- mes "Lighthalzen Police Station,";
- mes "which is a pretety good idea";
- mes "when I think about it, actually.";
- if(@tempguide)viewpoint 1,199,257,4,0x0000FF;
- next;
- goto s_Cont;
-
-s_Hotel:
- mes "[Lighthalzen Guide]";
- mes "Our Hotel is located in";
- mes "the middle of the South Plaza.";
- mes "Due to its quality of services and";
- mes "luxurious accomodations, this";
- mes "hotel is extremely popular.";
- if(@tempguide)viewpoint 1,159,133,5,0x0FFF00;
- next;
- goto s_Cont;
-
-s_Airport:
- mes "[Lighthalzen Guide]";
- mes "The Airport is to the far";
- mes "west of the Central Promenade";
- mes "You can travel anywhere within";
- mes "the Schwartzwald Republic by";
- mes "riding one of the Airships.";
- if(@tempguide)viewpoint 1,266,76,6,0x00FF00;
- next;
- goto s_Cont;
-
-s_Merchant:
- mes "[Lighthalzen Guide]";
- mes "The Merchant Guild can be";
- mes "found in the southwestern";
- mes "part of Lighthalzen.";
- if(@tempguide)viewpoint 1,74,52,7,0xEFAEBD;
- next;
- goto s_Cont;
-
-s_Jewel:
- mes "[Lighthalzen Guide]";
- mes "The Jewelry Shop is";
- mes "located just west of";
- mes "the South Plaza.";
- if(@tempguide)viewpoint 1,92,110,8,0xFF9500;
- next;
- goto s_Cont;
-
-s_Weap:
- mes "[Lighthalzen Guide]";
- mes "The Weapon Shop is";
- mes "located at the end of";
- mes "the Central Promenade.";
- mes "It's at least worth a look";
- mes "if you're serious about";
- mes "adventuring around here.";
- if(@tempguide)viewpoint 1,196,46,9,0x330033;
- next;
- goto s_Cont;
-
-s_Store:
- mes "[Lighthalzen Guide]";
- mes "The Department Store is";
- mes "located in the middle of";
- mes "Lighthalzen and is the biggest";
- mes "and most convenient place for";
- mes "shopping for almost everything.";
- if(@tempguide)viewpoint 1,199,163,10,0xFFFF00;
- next;
- goto s_Cont;
-
-s_Remove:
- viewpoint 2,103,244,1,0xFF0000;
- viewpoint 2,240,163,2,0xFF00FF;
- viewpoint 2,236,276,3,0xCCFFFF;
- viewpoint 2,199,257,4,0x0000FF;
- viewpoint 2,159,133,5,0x0FFF00;
- viewpoint 2,266,76,6,0x00FF00;
- viewpoint 2,74,52,7,0xEFAEBD;
- viewpoint 2,92,110,8,0xFF9500;
- viewpoint 2,196,46,9,0x330033;
- viewpoint 2,199,163,10,0xFFFF00;
- mes "[Lighthalzen Guide]";
- mes "Okay, the marks from your Mini-Map have been removed.";
- mes "If you need any guidance around Lighthalzen, please let me or one of the other Lighthalzen Guides know.";
- next;
- goto loopback;
-
-s_Notice:
- mes "[Lighthalzen Guide]";
- mes "Advances in sorcery and";
- mes "techonlogy have allowed";
- mes "us to update our information";
- mes "system, enabling up to mark";
- mes "locations on your Mini-Map";
- mes "for easier navigation.";
- next;
- mes "[Lighthalzen Guide]";
- mes "Your Mini-Map is located";
- mes "in the upper right cornern";
- mes "of the screen. If you can't";
- mes "see it, press the Ctrl + Tab";
- mes "keys or click the \"Map\" button";
- mes "in your Basic Info Window.";
- next;
- mes "[Lighthalzen Guide]";
- mes "On your Mini-Map,";
- mes "click on the \"+\" and \"-\"";
- mes "symbols to zoom in and";
- mes "out of your Mini-Map. We";
- mes "hope you enjoy your travels";
- mes "here in Lighthalzen.";
- next;
- goto loopback;
-
-}
-
-lighthalzen.gat,154,100,5 duplicate(LhzWest) Guide#lhz1 852
-
-lighthalzen.gat,319,243,5 duplicate(LhzSlum) Guide#lhz2 852
+//===== eAthena Script =======================================
+//= Lighthalzen Guides
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= Lighthalzen Guide NPCs
+//===== Additional Comments: =================================
+//= 1.0 First Version [MasterOfMuppets]
+//= 1.1 Removed Duplicates [Silent]
+//============================================================
+
+lighthalzen.gat,220,311,3 script Guide::LhzSlum 852,{
+
+ mes "[Lighthalzen Guide]";
+ mes "welcome to Lighthalzen,";
+ mes "the Coropration City-State.";
+ mes "If you need any guidance";
+ mes "around the city, feel free.";
+ mes "to ask me and I'll do my";
+ mes "very best to help you.";
+ next;
+loopback:
+ menu "City Guide",s_Guide,"Remove Marks from Mini-Map",s_Remove,"Notice.",s_Notice,"Cancel",-;
+
+ mes "[Lighthalzen Guide]";
+ mes "Lighthalzen is divided";
+ mes "into the East and West";
+ mes "districts by a railroad that";
+ mes "runs right through the middle.";
+ mes "There are always guards on";
+ mes "watch to protect the peace.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "Please don't hesitate";
+ mes "to report and suspicious";
+ mes "activity or persons to us.";
+ mes "We hope that you enjoy";
+ mes "our fair city, adventurer.";
+ close;
+
+s_Guide:
+ mes "[Lighthalzen Guide]";
+ mes "Please be aware that I'm";
+ mes "in charge of providing info";
+ mes "regarding the East District,";
+ mes "more commonly known as the";
+ mes "Slums. Select the location that";
+ mes "you'd like know more about.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "But before that,";
+ mes "would you like me";
+ mes "to mark locations";
+ mes "on your Mini-Map?";
+ next;
+ Menu "Yes",s_Yes,"No",-;
+
+ goto s_Cont;
+s_Yes:
+ set @tempguide,1;
+s_Cont:
+ menu "Tool Shop",s_Tool,"Mill",s_Mill,"Pub",s_Pub,"Cancel",-;
+
+ mes "[Lighthalzen Guide]";
+ mes "Please ask me to \"Remove";
+ mes "Marks from Mini-Map\" if you";
+ mes "no longer wish to have the";
+ mes "location marks displayed";
+ mes "on your Mini-Map.";
+ next;
+ goto loopback;
+
+s_Tool:
+ mes "[Lighthalzen Guide]";
+ mes "The Tool Shop is";
+ mes "located in the 11 o' clock";
+ mes "direction from the center";
+ mes "of the East District.";
+ if(@tempguide)viewpoint 1,324,301,1,0xFF0000;
+ next;
+ goto s_Cont;
+
+s_Mill:
+ mes "[Lighthalzen Guide]";
+ mes "On your Mini-Map,";
+ mes "the Mill can be found in";
+ mes "the 1 o'clock direction";
+ mes "in the East District.";
+ if(@tempguide)viewpoint 1,365,301,2,0xFF00FF;
+ next;
+ goto s_Cont;
+
+s_Pub:
+ mes "[Lighthalzen Guide]";
+ mes "The Pub is located";
+ mes "in the southern part";
+ mes "of the East District.";
+ if(@tempguide)viewpoint 1,346,232,3,0xCCFFFF;
+ next;
+ goto s_Cont;
+
+s_Remove:
+ viewpoint 2,324,301,1,0xFF0000;
+ viewpoint 2,365,301,2,0xFF00FF;
+ viewpoint 2,346,232,3,0xCCFFFF;
+ mes "[Lighthalzen Guide]";
+ mes "Okay, the marks from your Mini-Map have been removed.";
+ mes "If you need any guidance around Lighthalzen, please let me or one of the other Lighthalzen Guides know.";
+ next;
+ goto loopback;
+
+s_Notice:
+ mes "[Lighthalzen Guide]";
+ mes "Advances in sorcery and";
+ mes "techonlogy have allowed";
+ mes "us to update our information";
+ mes "system, enabling up to mark";
+ mes "locations on your Mini-Map";
+ mes "for easier navigation.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "Your Mini-Map is located";
+ mes "in the upper right cornern";
+ mes "of the screen. If you can't";
+ mes "see it, press the Ctrl + Tab";
+ mes "keys or click the \"Map\" button";
+ mes "in your Basic Info Window.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "On your Mini-Map,";
+ mes "click on the \"+\" and \"-\"";
+ mes "symbols to zoom in and";
+ mes "out of your Mini-Map. We";
+ mes "hope you enjoy your travels";
+ mes "here in Lighthalzen.";
+ next;
+ goto loopback;
+
+}
+
+lighthalzen.gat,207,311,3 script Guide::LhzWest 852,{
+
+ mes "[Lighthalzen Guide]";
+ mes "welcome to Lighthalzen,";
+ mes "the Coropration City-State.";
+ mes "If you need any guidance";
+ mes "around the city, feel free.";
+ mes "to ask me and I'll do my";
+ mes "very best to help you.";
+ next;
+loopback:
+ menu "City Guide",s_Guide,"Remove Marks from Mini-Map",s_Remove,"Notice.",s_Notice,"Cancel",-;
+
+ mes "[Lighthalzen Guide]";
+ mes "Lighthalzen is divided";
+ mes "into the East and West";
+ mes "districts by a railroad that";
+ mes "runs right through the middle.";
+ mes "There are always guards on";
+ mes "watch to protect the peace.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "Please don't hesitate";
+ mes "to report and suspicious";
+ mes "activity or persons to us.";
+ mes "We hope that you enjoy";
+ mes "our fair city, adventurer.";
+ close;
+
+s_Guide:
+ mes "[Lighthalzen Guide]";
+ mes "Please be aware that I'm";
+ mes "in charge of providing info";
+ mes "regarding the West District,";
+ mes "of Lighthalzen. Now, please";
+ mes "select the location that you'd";
+ mes "like to learn more about.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "But before that,";
+ mes "would you like me";
+ mes "to mark locations";
+ mes "on your Mini-Map?";
+ next;
+ Menu "Yes",s_Yes,"No",-;
+
+ goto s_Cont;
+s_Yes:
+ set @tempguide,1;
+s_Cont:
+ menu "^FF0000Rekenber Corporation",s_Rekenber,"^000000Train Station",s_Train,"Police Station",s_Police,"Bank",s_Bank,"Hotel",s_Hotel,"Airport",s_Airport,"Merchant Guild",s_Merchant,"Jewel Shop",s_Jewel,"Weapon Shop",s_Weap,"Department Store",s_Store,"Cancel",-;
+
+ mes "[Lighthalzen Guide]";
+ mes "Please ask me to \"Remove";
+ mes "Marks from Mini-Map\" if you";
+ mes "no longer wish to have the";
+ mes "location marks displayed";
+ mes "on your Mini-Map.";
+ next;
+ goto loopback;
+
+s_Rekenber:
+ mes "[Lighthalzen Guide]";
+ mes "Rekenber Corporation,";
+ mes "the largest company in";
+ mes "the Schwartzwald Republic,";
+ mes "is located in the northwestern";
+ mes "Lighthalzen. You can't miss";
+ mes "the headquarters building.";
+ if(@tempguide)viewpoint 1,103,244,1,0xFF0000;
+ next;
+ goto s_Cont;
+
+s_Train:
+ mes "[Lighthalzen Guide]";
+ mes "The Train Station is";
+ mes "located in the center of";
+ mes "the city, where we have";
+ mes "a direct railroad to Einbroch.";
+ if(@tempguide)viewpoint 1,240,163,2,0xFF00FF;
+ next;
+ goto s_Cont;
+
+s_Police:
+ mes "[Lighthalzen Guide]";
+ mes "Our Police Station is just";
+ mes "north of the city's center.";
+ mes "Please don't hesitate to report";
+ mes "any suspicious persons and";
+ mes "activity, or if you have any";
+ mes "problems whatsoever.";
+ if(@tempguide)viewpoint 1,236,276,3,0xCCFFFF;
+ next;
+ goto s_Cont;
+
+s_Bank:
+ mes "[Lighthalzen Guide]";
+ mes "The Bank is located";
+ mes "just opposite to the";
+ mes "Lighthalzen Police Station,";
+ mes "which is a pretety good idea";
+ mes "when I think about it, actually.";
+ if(@tempguide)viewpoint 1,199,257,4,0x0000FF;
+ next;
+ goto s_Cont;
+
+s_Hotel:
+ mes "[Lighthalzen Guide]";
+ mes "Our Hotel is located in";
+ mes "the middle of the South Plaza.";
+ mes "Due to its quality of services and";
+ mes "luxurious accomodations, this";
+ mes "hotel is extremely popular.";
+ if(@tempguide)viewpoint 1,159,133,5,0x0FFF00;
+ next;
+ goto s_Cont;
+
+s_Airport:
+ mes "[Lighthalzen Guide]";
+ mes "The Airport is to the far";
+ mes "west of the Central Promenade";
+ mes "You can travel anywhere within";
+ mes "the Schwartzwald Republic by";
+ mes "riding one of the Airships.";
+ if(@tempguide)viewpoint 1,266,76,6,0x00FF00;
+ next;
+ goto s_Cont;
+
+s_Merchant:
+ mes "[Lighthalzen Guide]";
+ mes "The Merchant Guild can be";
+ mes "found in the southwestern";
+ mes "part of Lighthalzen.";
+ if(@tempguide)viewpoint 1,74,52,7,0xEFAEBD;
+ next;
+ goto s_Cont;
+
+s_Jewel:
+ mes "[Lighthalzen Guide]";
+ mes "The Jewelry Shop is";
+ mes "located just west of";
+ mes "the South Plaza.";
+ if(@tempguide)viewpoint 1,92,110,8,0xFF9500;
+ next;
+ goto s_Cont;
+
+s_Weap:
+ mes "[Lighthalzen Guide]";
+ mes "The Weapon Shop is";
+ mes "located at the end of";
+ mes "the Central Promenade.";
+ mes "It's at least worth a look";
+ mes "if you're serious about";
+ mes "adventuring around here.";
+ if(@tempguide)viewpoint 1,196,46,9,0x330033;
+ next;
+ goto s_Cont;
+
+s_Store:
+ mes "[Lighthalzen Guide]";
+ mes "The Department Store is";
+ mes "located in the middle of";
+ mes "Lighthalzen and is the biggest";
+ mes "and most convenient place for";
+ mes "shopping for almost everything.";
+ if(@tempguide)viewpoint 1,199,163,10,0xFFFF00;
+ next;
+ goto s_Cont;
+
+s_Remove:
+ viewpoint 2,103,244,1,0xFF0000;
+ viewpoint 2,240,163,2,0xFF00FF;
+ viewpoint 2,236,276,3,0xCCFFFF;
+ viewpoint 2,199,257,4,0x0000FF;
+ viewpoint 2,159,133,5,0x0FFF00;
+ viewpoint 2,266,76,6,0x00FF00;
+ viewpoint 2,74,52,7,0xEFAEBD;
+ viewpoint 2,92,110,8,0xFF9500;
+ viewpoint 2,196,46,9,0x330033;
+ viewpoint 2,199,163,10,0xFFFF00;
+ mes "[Lighthalzen Guide]";
+ mes "Okay, the marks from your Mini-Map have been removed.";
+ mes "If you need any guidance around Lighthalzen, please let me or one of the other Lighthalzen Guides know.";
+ next;
+ goto loopback;
+
+s_Notice:
+ mes "[Lighthalzen Guide]";
+ mes "Advances in sorcery and";
+ mes "techonlogy have allowed";
+ mes "us to update our information";
+ mes "system, enabling up to mark";
+ mes "locations on your Mini-Map";
+ mes "for easier navigation.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "Your Mini-Map is located";
+ mes "in the upper right cornern";
+ mes "of the screen. If you can't";
+ mes "see it, press the Ctrl + Tab";
+ mes "keys or click the \"Map\" button";
+ mes "in your Basic Info Window.";
+ next;
+ mes "[Lighthalzen Guide]";
+ mes "On your Mini-Map,";
+ mes "click on the \"+\" and \"-\"";
+ mes "symbols to zoom in and";
+ mes "out of your Mini-Map. We";
+ mes "hope you enjoy your travels";
+ mes "here in Lighthalzen.";
+ next;
+ goto loopback;
+
+}
+
+lighthalzen.gat,154,100,5 duplicate(LhzWest) Guide#lhz1 852
+
+lighthalzen.gat,319,243,5 duplicate(LhzSlum) Guide#lhz2 852
diff --git a/npc/guides/guides_mor.txt b/npc/guides/guides_mor.txt
index e4890abca..4437bc266 100644
--- a/npc/guides/guides_mor.txt
+++ b/npc/guides/guides_mor.txt
@@ -1,117 +1,117 @@
-//===== eAthena Script =======================================
-//= Morroc Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. Added a guide at every exit.
-//= v1.1 Now using duplicate command.
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Removed Duplicates [Silent]
-//============================================================
-
-
-// North ------------------------------------------------
-morocc.gat,153,286,6 script Guide#1::Mor_Guide 707,{
- cutin "moc_soldier",2;
- mes "[Morroc Soldier]";
- mes "Welcome to Morroc, the Desert Frontier!";
- next;
- mes "[Morroc Soldier]";
- mes "We are here to help you find your way. Please feel free to speak to us anytime you need help.";
-M_Menu:
- next;
- menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
-
- mes "[Morroc Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",-,"Yes Please",sM_1b;
-
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Morroc Soldier]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "^FF0000Thief Guild^000000",-, "Armory",M_1_2, "Inn",M_1_3, "Pub",M_1_4, "Mercenary Guild",M_1_5,
- "Wipe all indications from mini-map.",M_1_6, "Cancel",M_End;
-
- mes "[Morocc Soldier]";
- mes "The 'Thief Guild'.... I hear that it's the place to go if you want to be a Thief.....";
- viewpoint 1,24,297,1,0xFF0000;
- goto sL_Wipe;
- M_1_2:
- mes "[Morocc Soldier]";
- mes "Head over to the 'Armory' to equip yourself with a variety of weapons and armor.";
- viewpoint 1,253,56,2,0xFF00FF;
- goto sL_Wipe;
- M_1_3:
- mes "[Morocc Soldier]";
- mes "In Morroc there are 2 'Inn's' located in the South and NorthEastern parts of town.";
- viewpoint 1,274,269,3,0xFF00FF;
- viewpoint 1,197,66,4,0xFF00FF;
- goto sL_Wipe;
- M_1_4:
- mes "[Morocc Soldier]";
- mes "The 'Pub' is located to the NorthWest of town.";
- viewpoint 1,52,259,5,0xFF00FF;
- goto sL_Wipe;
- M_1_5:
- mes "[Morocc Soldier]";
- mes "The 'Mercenary Guild' is in the Eastern corner of town.";
- viewpoint 1,284,171,6,0x00FF00;
- goto sL_Wipe;
- M_1_6:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,24,297,1,0xFF0000;
- viewpoint 2,253,56,2,0xFF00FF;
- viewpoint 2,274,269,3,0xFF00FF;
- viewpoint 2,197,66,4,0xFF00FF;
- viewpoint 2,52,259,5,0xFF00FF;
- viewpoint 2,284,171,6,0x00FF00;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Morroc Soldier]";
- mes "All indications have been removed";
- cutin "moc_soldier",255;
- close;
-
- M_2:
- mes "[Morroc Soldier]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Morroc Soldier]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Morroc Soldier]";
- mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
- mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
- goto M_Menu;
-
- M_End:
- mes "[Morocc Soldier]";
- mes "Good by for now.";
- cutin "moc_soldier",255;
- close;
-}
-
-// South --------------------------------------------
-morocc.gat,162,97,6 duplicate(Mor_Guide) Guide#Mor2 707
-// West --------------------------------------------
-morocc.gat,28,161,6 duplicate(Mor_Guide) Guide#Mor3 707
-// East --------------------------------------------
-morocc.gat,294,203,9 duplicate(Mor_Guide) Guide#Mor4 707
+//===== eAthena Script =======================================
+//= Morroc Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. Added a guide at every exit.
+//= v1.1 Now using duplicate command.
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Removed Duplicates [Silent]
+//============================================================
+
+
+// North ------------------------------------------------
+morocc.gat,153,286,6 script Guide#1::Mor_Guide 707,{
+ cutin "moc_soldier",2;
+ mes "[Morroc Soldier]";
+ mes "Welcome to Morroc, the Desert Frontier!";
+ next;
+ mes "[Morroc Soldier]";
+ mes "We are here to help you find your way. Please feel free to speak to us anytime you need help.";
+M_Menu:
+ next;
+ menu "View Buildings",-, "Notice",M_2, "Cancel",M_End;
+
+ mes "[Morroc Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",-,"Yes Please",sM_1b;
+
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Morroc Soldier]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "^FF0000Thief Guild^000000",-, "Armory",M_1_2, "Inn",M_1_3, "Pub",M_1_4, "Mercenary Guild",M_1_5,
+ "Wipe all indications from mini-map.",M_1_6, "Cancel",M_End;
+
+ mes "[Morocc Soldier]";
+ mes "The 'Thief Guild'.... I hear that it's the place to go if you want to be a Thief.....";
+ viewpoint 1,24,297,1,0xFF0000;
+ goto sL_Wipe;
+ M_1_2:
+ mes "[Morocc Soldier]";
+ mes "Head over to the 'Armory' to equip yourself with a variety of weapons and armor.";
+ viewpoint 1,253,56,2,0xFF00FF;
+ goto sL_Wipe;
+ M_1_3:
+ mes "[Morocc Soldier]";
+ mes "In Morroc there are 2 'Inn's' located in the South and NorthEastern parts of town.";
+ viewpoint 1,274,269,3,0xFF00FF;
+ viewpoint 1,197,66,4,0xFF00FF;
+ goto sL_Wipe;
+ M_1_4:
+ mes "[Morocc Soldier]";
+ mes "The 'Pub' is located to the NorthWest of town.";
+ viewpoint 1,52,259,5,0xFF00FF;
+ goto sL_Wipe;
+ M_1_5:
+ mes "[Morocc Soldier]";
+ mes "The 'Mercenary Guild' is in the Eastern corner of town.";
+ viewpoint 1,284,171,6,0x00FF00;
+ goto sL_Wipe;
+ M_1_6:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next; // avoids a double 'next' when 'wipe indications' is chosen
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,24,297,1,0xFF0000;
+ viewpoint 2,253,56,2,0xFF00FF;
+ viewpoint 2,274,269,3,0xFF00FF;
+ viewpoint 2,197,66,4,0xFF00FF;
+ viewpoint 2,52,259,5,0xFF00FF;
+ viewpoint 2,284,171,6,0x00FF00;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Morroc Soldier]";
+ mes "All indications have been removed";
+ cutin "moc_soldier",255;
+ close;
+
+ M_2:
+ mes "[Morroc Soldier]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Morroc Soldier]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Morroc Soldier]";
+ mes "If you can't see the Mini-Map, just hit ^0000ff'ctrl+tab'^000000 or Click the ^0000ff'map'^000000 button in the Basic Information Window";
+ mes "Remeber to use the ^ff0000+,-^000000 buttons to adjust the map to your liking.";
+ goto M_Menu;
+
+ M_End:
+ mes "[Morocc Soldier]";
+ mes "Good by for now.";
+ cutin "moc_soldier",255;
+ close;
+}
+
+// South --------------------------------------------
+morocc.gat,162,97,6 duplicate(Mor_Guide) Guide#Mor2 707
+// West --------------------------------------------
+morocc.gat,28,161,6 duplicate(Mor_Guide) Guide#Mor3 707
+// East --------------------------------------------
+morocc.gat,294,203,9 duplicate(Mor_Guide) Guide#Mor4 707
diff --git a/npc/guides/guides_nif.txt b/npc/guides/guides_nif.txt
index fb1ad5895..4d98f161a 100644
--- a/npc/guides/guides_nif.txt
+++ b/npc/guides/guides_nif.txt
@@ -1,83 +1,83 @@
-//===== eAthena Script =======================================
-//= Niflheim Guide
-//===== By: ==================================================
-//= eAthena Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 Fixed location command format [Lupus]
-//= 1.2 Optimized, updated common guide names [Lupus]
-//============================================================
-
-
-//=====================================================================================
-niflheim.gat,186,190,5 script Wandering Man 798,{
- mes "[Wandering Man]";
- mes "Why are you in this scary city? I guess you lost your way too, heh.";
- mes "I was attracted here by the tall trees, but still can't find my way out after so long...";
- next;
- mes "[Wandering Man]";
- mes "But instead i have become familiar with the village surroundings,";
- mes "perhaps it may be useful for escaping sometimes.";
- next;
- menu "Enquire locations",-,"Wipe indications",L_MENU_2,"Cancel",L_end;
-
- mes "[Wandering Man]";
- mes "Where do you want to know about?";
- next;
- menu "Witch's Hut",-,"Equipment Shop",M_item,"Weapon Shop",M_weapon,"Inn",M_hotel,"Cancel",L_cancel;
-
- viewpoint 1,255,194,1,0xFF3366;
- mes "[Wandering Man]";
- mes "In Niflheim lives a terrible witch,";
- mes "you'll see her house right ^FF3366there^000000,";
- mes "it was so scary i fled right after going in!";
- close;
-
- M_item:
- viewpoint 1,219,198,2,0xCC6600;
- mes "[Wandering Man]";
- mes "The equipment shop should be over ^CC6600here^000000";
- mes "they sell several items not available to the outside world.";
- close;
-
- M_weapon:
- viewpoint 1,219,170,3,0x66FF33;
- mes "[Wandering Man]";
- mes "The weapon shop should be over ^66FF33here^000000";
- mes "they sell several items not available to the outside world.";
- close;
-
- M_hotel:
- viewpoint 1,189,210,4,0x3366FF;
- mes "[Wandering Man]";
- mes "^3366FFThat^000000 would be the inn,";
- mes "occasionally the spirits throw a party in there.";
- close;
-
- L_cancel:
- mes "[Wandering Man]";
- mes "To remove all indications of the minimap";
- mes "come back and talk to me again.";
- close;
-
- L_MENU_2:
- viewpoint 2,255,194,1,0xFF3366;
- viewpoint 2,219,198,2,0xCC6600;
- viewpoint 2,219,170,3,0x66FF33;
- viewpoint 2,189,210,4,0x3366FF;
- mes "[Wandering Man]";
- mes "I removed all the indications,";
- mes "If you still need any directions, come back and talk to me again.";
- close;
-
- L_end:
- mes "[Wandering Man]";
- mes "Wandering around by yourself is dangerous...";
- mes "please take care.";
- close;
-}
+//===== eAthena Script =======================================
+//= Niflheim Guide
+//===== By: ==================================================
+//= eAthena Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 Fixed location command format [Lupus]
+//= 1.2 Optimized, updated common guide names [Lupus]
+//============================================================
+
+
+//=====================================================================================
+niflheim.gat,186,190,5 script Wandering Man 798,{
+ mes "[Wandering Man]";
+ mes "Why are you in this scary city? I guess you lost your way too, heh.";
+ mes "I was attracted here by the tall trees, but still can't find my way out after so long...";
+ next;
+ mes "[Wandering Man]";
+ mes "But instead i have become familiar with the village surroundings,";
+ mes "perhaps it may be useful for escaping sometimes.";
+ next;
+ menu "Enquire locations",-,"Wipe indications",L_MENU_2,"Cancel",L_end;
+
+ mes "[Wandering Man]";
+ mes "Where do you want to know about?";
+ next;
+ menu "Witch's Hut",-,"Equipment Shop",M_item,"Weapon Shop",M_weapon,"Inn",M_hotel,"Cancel",L_cancel;
+
+ viewpoint 1,255,194,1,0xFF3366;
+ mes "[Wandering Man]";
+ mes "In Niflheim lives a terrible witch,";
+ mes "you'll see her house right ^FF3366there^000000,";
+ mes "it was so scary i fled right after going in!";
+ close;
+
+ M_item:
+ viewpoint 1,219,198,2,0xCC6600;
+ mes "[Wandering Man]";
+ mes "The equipment shop should be over ^CC6600here^000000";
+ mes "they sell several items not available to the outside world.";
+ close;
+
+ M_weapon:
+ viewpoint 1,219,170,3,0x66FF33;
+ mes "[Wandering Man]";
+ mes "The weapon shop should be over ^66FF33here^000000";
+ mes "they sell several items not available to the outside world.";
+ close;
+
+ M_hotel:
+ viewpoint 1,189,210,4,0x3366FF;
+ mes "[Wandering Man]";
+ mes "^3366FFThat^000000 would be the inn,";
+ mes "occasionally the spirits throw a party in there.";
+ close;
+
+ L_cancel:
+ mes "[Wandering Man]";
+ mes "To remove all indications of the minimap";
+ mes "come back and talk to me again.";
+ close;
+
+ L_MENU_2:
+ viewpoint 2,255,194,1,0xFF3366;
+ viewpoint 2,219,198,2,0xCC6600;
+ viewpoint 2,219,170,3,0x66FF33;
+ viewpoint 2,189,210,4,0x3366FF;
+ mes "[Wandering Man]";
+ mes "I removed all the indications,";
+ mes "If you still need any directions, come back and talk to me again.";
+ close;
+
+ L_end:
+ mes "[Wandering Man]";
+ mes "Wandering around by yourself is dangerous...";
+ mes "please take care.";
+ close;
+}
diff --git a/npc/guides/guides_pay.txt b/npc/guides/guides_pay.txt
index 522dc5238..4ac59a0df 100644
--- a/npc/guides/guides_pay.txt
+++ b/npc/guides/guides_pay.txt
@@ -1,220 +1,220 @@
-//===== eAthena Script =======================================
-//= Payon Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Now using duplicate command.New Payon Locations [Darkchild]
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
-//= to Muad_Dib
-//= 1.3a Fixed some problems with duplicated text, thanks to muad_dib [MasterOfMuppets]
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//= 1.4a Tixed Archer Village Guide [Lupus]
-//= 1.5 Removed Duplicates [Silent]
-//============================================================
-
-
-payon.gat,162,67,4 script Guide#pay1 708,{
- cutin "pay_soldier",2;
- mes "[Payon Guide]";
- mes "Welcome to the mountain city of Payon.";
- mes "If you're unfammiliar with this area, I can help you find what you're looking for around here.";
-L_MENU:
- next;
- menu "City Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-
- mes "[Payon Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",L_NO;
-L_NO:
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "^FF0000Archer Guild^000000",L_ARCHER,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Pub",L_PUB,"Central Palace",L_PALACE,"The Empress",L_EMPRESS,"Palace Annex",L_ANNEX,"Royal Kitchen",L_KITCHEN,"Forge",L_FORGE,"Cancel",-;
- mes "[Payon Guide]";
- mes "Please ask me to remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_ARCHER:
- mes "[Payon Guide]";
- mes "The Archer Guild handles Job Changes to the Archer Class.";
- mes "You'll need to enter the Archer Village wich is to the northeast of Payon.";
- viewpoint 1,228,326,1,0xFF0000;
- next;
- goto L_WIPE;
-L_WEAPON:
- mes "[Payon Guide]";
- mes "The Weapon Shop can be found in the northwest corner of the city of Payon.";
- viewpoint 1,139,158,2,0xFF00FF;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Payon Guide]";
- mes "The Tool Shop is located near the northwest corner of Payon.";
- viewpoint 1,144,85,3,0xFF00FF;
- next;
- goto L_WIPE;
-L_PUB:
- mes "[Payon Guide]";
- mes "The Pub can be found in the northeast part of Payon.";
- mes "It's the best place to relax after a long day of hunting.";
- viewpoint 1,220,117,4,0xFF00FF;
- next;
- goto L_WIPE;
-L_PALACE:
- mes "[Payon Guide]";
- mes "The Central Palace is located to the north within the city of Payon.";
- viewpoint 1,156,245,5,0x00FF00;
- next;
- goto L_WIPE;
-L_EMPRESS:
- mes "[Payon Guide]";
- mes "The Empress can be found to the northwest in Payon.";
- viewpoint 1,107,327,6,0x00FF00;
- next;
- goto L_WIPE;
-L_ANNEX:
- mes "[Payon Guide]";
- mes "The Palace Annex can be found in the western part of Payon.";
- viewpoint 1,127,204,7,0x00FF00;
- next;
- goto L_WIPE;
-L_KITCHEN:
- mes "[Payon Guide]";
- mes "The Royal Kitchen is located near the northern end of Payon.";
- viewpoint 1,155,327,8,0x00FF00;
- next;
- goto L_WIPE;
-L_FORGE:
- mes "[Payon Guide]";
- mes "The Forge is situaded near the center of Payon.";
- viewpoint 1,142,172,9,0xFFFF00;
- next;
-// goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,228,326,1,0xFF0000;
- viewpoint 2,139,158,2,0xFF00FF;
- viewpoint 2,144,85,3,0xFF00FF;
- viewpoint 2,220,117,4,0xFF00FF;
- viewpoint 2,156,245,5,0x00FF00;
- viewpoint 2,107,327,6,0x00FF00;
- viewpoint 2,127,204,7,0x00FF00;
- viewpoint 2,155,327,8,0x00FF00;
- viewpoint 2,142,172,9,0xFFFF00;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,228,326,1,0xFF0000;
- viewpoint 2,139,158,2,0xFF00FF;
- viewpoint 2,144,85,3,0xFF00FF;
- viewpoint 2,220,117,4,0xFF00FF;
- viewpoint 2,156,245,5,0x00FF00;
- viewpoint 2,107,327,6,0x00FF00;
- viewpoint 2,127,204,7,0x00FF00;
- viewpoint 2,155,327,8,0x00FF00;
- viewpoint 2,142,172,9,0xFFFF00;
- goto L_MENU;
-
-L_NOTICE:
- mes "[Payon Guide]";
- mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Payon Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Payon Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Payon.";
- goto L_MENU;
-L_END:
- mes "[Payon Guide]";
- mes "Be safe in your travels, brave adventurer.";
- cutin "pay_soldier",255;
- close;
-}
-
-pay_arche.gat,85,30,2 script Guide#pay2 708,{
- cutin "pay_soldier",2;
- mes "[Payon Guide]";
- mes "Welcome to the Archer Village.";
- mes "If you're unfammiliar with this area, I can help you find what you're looking for around here.";
-L_MENU:
- next;
- menu "Village Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-
- mes "[Payon Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",L_NO;
-L_NO:
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "^FF0000Archer Guild^000000",L_ARCHER,"Tool Shop",L_TOOL,"Payon Dungeon",L_DUNGEON,"Cancel",-;
- mes "[Payon Guide]";
- mes "Please ask me to remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_ARCHER:
- mes "[Payon Guide]";
- mes "The Archer Guild, found northeast in the Archer Village, handles Job Changes to the Archer Class.";
- viewpoint 1,144,164,1,0xFF0000;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Payon Guide]";
- mes "The Tool Shop is located near the northwest corner of the village.";
- viewpoint 1,71,156,2,0xFF00FF;
- next;
- goto L_WIPE;
-L_DUNGEON:
- mes "[Payon Guide]";
- mes "The entrance to the Payon Dungeon is located at the west end of the village.";
- viewpoint 1,34,132,3,0xFFFFFF;
- next;
-// goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,144,164,1,0xFF0000;
- viewpoint 2,71,156,2,0xFF00FF;
- viewpoint 2,34,132,3,0xFFFFFF;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,144,164,1,0xFF0000;
- viewpoint 2,71,156,2,0xFF00FF;
- viewpoint 2,34,132,3,0xFFFFFF;
- goto L_MENU;
-
-L_NOTICE:
- mes "[Payon Guide]";
- mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Payon Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Payon Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Payon.";
- goto L_MENU;
-L_END:
- mes "[Payon Guide]";
- mes "Be safe in your travels, brave adventurer.";
- cutin "pay_soldier",255;
- close;
-}
+//===== eAthena Script =======================================
+//= Payon Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Now using duplicate command.New Payon Locations [Darkchild]
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
+//= to Muad_Dib
+//= 1.3a Fixed some problems with duplicated text, thanks to muad_dib [MasterOfMuppets]
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//= 1.4a Tixed Archer Village Guide [Lupus]
+//= 1.5 Removed Duplicates [Silent]
+//============================================================
+
+
+payon.gat,162,67,4 script Guide#pay1 708,{
+ cutin "pay_soldier",2;
+ mes "[Payon Guide]";
+ mes "Welcome to the mountain city of Payon.";
+ mes "If you're unfammiliar with this area, I can help you find what you're looking for around here.";
+L_MENU:
+ next;
+ menu "City Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+
+ mes "[Payon Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",L_NO;
+L_NO:
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "^FF0000Archer Guild^000000",L_ARCHER,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Pub",L_PUB,"Central Palace",L_PALACE,"The Empress",L_EMPRESS,"Palace Annex",L_ANNEX,"Royal Kitchen",L_KITCHEN,"Forge",L_FORGE,"Cancel",-;
+ mes "[Payon Guide]";
+ mes "Please ask me to remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_ARCHER:
+ mes "[Payon Guide]";
+ mes "The Archer Guild handles Job Changes to the Archer Class.";
+ mes "You'll need to enter the Archer Village wich is to the northeast of Payon.";
+ viewpoint 1,228,326,1,0xFF0000;
+ next;
+ goto L_WIPE;
+L_WEAPON:
+ mes "[Payon Guide]";
+ mes "The Weapon Shop can be found in the northwest corner of the city of Payon.";
+ viewpoint 1,139,158,2,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Payon Guide]";
+ mes "The Tool Shop is located near the northwest corner of Payon.";
+ viewpoint 1,144,85,3,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_PUB:
+ mes "[Payon Guide]";
+ mes "The Pub can be found in the northeast part of Payon.";
+ mes "It's the best place to relax after a long day of hunting.";
+ viewpoint 1,220,117,4,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_PALACE:
+ mes "[Payon Guide]";
+ mes "The Central Palace is located to the north within the city of Payon.";
+ viewpoint 1,156,245,5,0x00FF00;
+ next;
+ goto L_WIPE;
+L_EMPRESS:
+ mes "[Payon Guide]";
+ mes "The Empress can be found to the northwest in Payon.";
+ viewpoint 1,107,327,6,0x00FF00;
+ next;
+ goto L_WIPE;
+L_ANNEX:
+ mes "[Payon Guide]";
+ mes "The Palace Annex can be found in the western part of Payon.";
+ viewpoint 1,127,204,7,0x00FF00;
+ next;
+ goto L_WIPE;
+L_KITCHEN:
+ mes "[Payon Guide]";
+ mes "The Royal Kitchen is located near the northern end of Payon.";
+ viewpoint 1,155,327,8,0x00FF00;
+ next;
+ goto L_WIPE;
+L_FORGE:
+ mes "[Payon Guide]";
+ mes "The Forge is situaded near the center of Payon.";
+ viewpoint 1,142,172,9,0xFFFF00;
+ next;
+// goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,228,326,1,0xFF0000;
+ viewpoint 2,139,158,2,0xFF00FF;
+ viewpoint 2,144,85,3,0xFF00FF;
+ viewpoint 2,220,117,4,0xFF00FF;
+ viewpoint 2,156,245,5,0x00FF00;
+ viewpoint 2,107,327,6,0x00FF00;
+ viewpoint 2,127,204,7,0x00FF00;
+ viewpoint 2,155,327,8,0x00FF00;
+ viewpoint 2,142,172,9,0xFFFF00;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,228,326,1,0xFF0000;
+ viewpoint 2,139,158,2,0xFF00FF;
+ viewpoint 2,144,85,3,0xFF00FF;
+ viewpoint 2,220,117,4,0xFF00FF;
+ viewpoint 2,156,245,5,0x00FF00;
+ viewpoint 2,107,327,6,0x00FF00;
+ viewpoint 2,127,204,7,0x00FF00;
+ viewpoint 2,155,327,8,0x00FF00;
+ viewpoint 2,142,172,9,0xFFFF00;
+ goto L_MENU;
+
+L_NOTICE:
+ mes "[Payon Guide]";
+ mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Payon Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Payon Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Payon.";
+ goto L_MENU;
+L_END:
+ mes "[Payon Guide]";
+ mes "Be safe in your travels, brave adventurer.";
+ cutin "pay_soldier",255;
+ close;
+}
+
+pay_arche.gat,85,30,2 script Guide#pay2 708,{
+ cutin "pay_soldier",2;
+ mes "[Payon Guide]";
+ mes "Welcome to the Archer Village.";
+ mes "If you're unfammiliar with this area, I can help you find what you're looking for around here.";
+L_MENU:
+ next;
+ menu "Village Guide",-,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+
+ mes "[Payon Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",L_NO;
+L_NO:
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "^FF0000Archer Guild^000000",L_ARCHER,"Tool Shop",L_TOOL,"Payon Dungeon",L_DUNGEON,"Cancel",-;
+ mes "[Payon Guide]";
+ mes "Please ask me to remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_ARCHER:
+ mes "[Payon Guide]";
+ mes "The Archer Guild, found northeast in the Archer Village, handles Job Changes to the Archer Class.";
+ viewpoint 1,144,164,1,0xFF0000;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Payon Guide]";
+ mes "The Tool Shop is located near the northwest corner of the village.";
+ viewpoint 1,71,156,2,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_DUNGEON:
+ mes "[Payon Guide]";
+ mes "The entrance to the Payon Dungeon is located at the west end of the village.";
+ viewpoint 1,34,132,3,0xFFFFFF;
+ next;
+// goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,144,164,1,0xFF0000;
+ viewpoint 2,71,156,2,0xFF00FF;
+ viewpoint 2,34,132,3,0xFFFFFF;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,144,164,1,0xFF0000;
+ viewpoint 2,71,156,2,0xFF00FF;
+ viewpoint 2,34,132,3,0xFFFFFF;
+ goto L_MENU;
+
+L_NOTICE:
+ mes "[Payon Guide]";
+ mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Payon Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Payon Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Payon.";
+ goto L_MENU;
+L_END:
+ mes "[Payon Guide]";
+ mes "Be safe in your travels, brave adventurer.";
+ cutin "pay_soldier",255;
+ close;
+}
diff --git a/npc/guides/guides_pron.txt b/npc/guides/guides_pron.txt
index d5f14e928..6e2900067 100644
--- a/npc/guides/guides_pron.txt
+++ b/npc/guides/guides_pron.txt
@@ -1,211 +1,211 @@
-//===== eAthena Script =======================================
-//= Prontera Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Now using duplicate command.
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
-//= to Muad_Dib
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//= 1.5 Removed Duplicates [Silent]
-//============================================================
-
-
-prontera.gat,154,187,4 script Guide::Prt_Guide 105,{
- cutin "prt_soldier",2;
- mes "[Prontera Guide]";
- mes "Welcome to Prontera, the beautiful capital of the Run-Midgard Kingdom.";
- mes " If you have questions or need help find something in the city, don't hesitate to ask.";
-L_MENU:
- next;
- menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
-L_CITY:
- mes "[Prontera Guide]";
- mes "Please select a location from the following menu.";
- mes "Would you like me to mark locations on your Mini-Map?";
- next;
- menu "Yes.",L_YES,"No.",L_NO;
-L_NO:
- set @COMPASS_CHECK,0;
- goto L_CONT;
-L_YES:
- set @COMPASS_CHECK,1;
-L_CONT:
-L_MENU_2:
- menu "Swordman Association",L_SWORD,"^0000FFSanctuary^000000",L_SANCTUARY,"Prontera Chivalry",L_CHIVALRY,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Inn",L_INN,"Trading Post",L_TRADING,"Pub",L_PUB,"Library",L_LIBRARY,"Job Agency",L_JOB,"Prontera Castle",L_CASTLE,"City Hall",L_HALL,"Cancel",-;
- mes "[Prontera Guide]";
- mes "Pleas ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
- goto L_MENU;
-L_SWORD:
- mes "[Prontera Guide]";
- mes "The Swordman Association, which handles Job Changes to the Swordman class, has moved to Izlude.";
- mes "This facility is just an empty building now.";
- viewpoint 1,237,41,1,0x00FF00;
- next;
- goto L_WIPE;
-L_SANCTUARY:
- mes "[Prontera Guide]";
- mes "The Prontera Sanctuary handles Job Changes to the Acolyte class, and can be found in the northeast corner of Prontera.";
- viewpoint 1,236,316,2,0xFF0000;
- next;
- goto L_WIPE;
-L_CHIVALRY:
- mes "[Prontera Guide]";
- mes "The Prontera Chivalry, which is responsible for the safety of our capital, is in Prontera's northwest corner.";
- viewpoint 1,46,345,3,0x00FF00;
- next;
- goto L_WIPE;
-L_WEAPON:
- mes "[Prontera Guide]";
- mes "The Weapon Shop is located northeast of the central fountain.";
- viewpoint 1,175,220,4,0xFF00FF;
- next;
- goto L_WIPE;
-L_TOOL:
- mes "[Prontera Guide]";
- mes "The Tool Shop is located northwest of the central fountain.";
- viewpoint 1,134,221,5,0xFF00FF;
- next;
- goto L_WIPE;
-L_INN:
- mes "[Prontera Guide]";
- mes "The Inns in Prontera are located both to the east and west of Prontera's central fountain area.";
- viewpoint 1,204,214,6,0xFF00FF;
- viewpoint 1,107,192,7,0xFF00FF;
- next;
- goto L_WIPE;
-L_TRADING:
- mes "[Prontera Guide]";
- mes "The Trading Post can be found southeast from the central fountain.";
- viewpoint 1,179,184,8,0x00FF00;
- next;
- goto L_WIPE;
-L_PUB:
- mes "[Prontera Guide]";
- mes "The Pub is located southeast of the fountain, behind the Trading Post.";
- viewpoint 1,208,154,9,0x00FF00;
- next;
- goto L_WIPE;
-L_LIBRARY:
- mes "[Prontera Guide]";
- mes "If you head north from the central fountain, you'll find an empty area in which both branches of the Prontera Library can be accessed if you head towards the east or west.";
- viewpoint 1,120,267,10,0x00FF00;
- viewpoint 1,192,267,11,0x00FF00;
- next;
- goto L_WIPE;
-L_JOB:
- mes "[Prontera Guide]";
- mes "The Job Agency is just southwest of the central fountain area.";
- viewpoint 1,133,183,12,0x00FF00;
- next;
- goto L_WIPE;
-L_CASTLE:
- mes "[Prontera Guide]";
- mes "The Prontera Castle is located at the northern sector of this city.";
- mes " You can go to fields that are north of Prontera by going through the castle's rear exit.";
- viewpoint 1,156,360,13,0x00FF00;
- next;
- goto L_WIPE;
-L_HALL:
- mes "[Prontera Guide]";
- mes "The City Hall is located in the southwest corner in our city of Prontera.";
- viewpoint 1,75,91,14,0x00FF00;
- next;
- goto L_WIPE;
-L_WIPE:
- if(@COMPASS_CHECK == 1)goto L_MENU_2;
- viewpoint 2,237,41,1,0x00FF00;
- viewpoint 2,236,316,2,0xFF0000;
- viewpoint 2,46,345,3,0x00FF00;
- viewpoint 2,175,220,4,0xFF00FF;
- viewpoint 2,8,134,5,0xFF00FF;
- viewpoint 2,204,214,6,0xFF00FF;
- viewpoint 2,107,192,7,0xFF00FF;
- viewpoint 2,179,184,8,0x00FF00;
- viewpoint 2,208,154,9,0x00FF00;
- viewpoint 2,120,267,10,0x00FF00;
- viewpoint 2,192,267,11,0x00FF00;
- viewpoint 2,133,183,12,0x00FF00;
- viewpoint 2,156,360,13,0x00FF00;
- viewpoint 2,75,91,14,0x00FF00;
- goto L_MENU_2;
-L_REMOVE:
- viewpoint 2,237,41,1,0x00FF00;
- viewpoint 2,236,316,2,0xFF0000;
- viewpoint 2,46,345,3,0x00FF00;
- viewpoint 2,175,220,4,0xFF00FF;
- viewpoint 2,8,134,5,0xFF00FF;
- viewpoint 2,204,214,6,0xFF00FF;
- viewpoint 2,107,192,7,0xFF00FF;
- viewpoint 2,179,184,8,0x00FF00;
- viewpoint 2,208,154,9,0x00FF00;
- viewpoint 2,120,267,10,0x00FF00;
- viewpoint 2,192,267,11,0x00FF00;
- viewpoint 2,133,183,12,0x00FF00;
- viewpoint 2,156,360,13,0x00FF00;
- viewpoint 2,75,91,14,0x00FF00;
- goto L_MENU;
-L_NOTICE:
- mes "[Prontera Guide]";
- mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
- next;
- mes "[Prontera Guide]";
- mes "Your Mini-Map is located in the upper right corner of the screen.";
- mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
- next;
- mes "[Prontera Guide]";
- mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
- mes "We hope you enjoy your travels here in the city of Prontera.";
- goto L_MENU;
-L_END:
- mes "[Prontera Guide]";
- mes "Well, adventurer... I hope your journeys through Rune-Midgard are both fun and safe.";
- cutin "prt_soldier",255;
- close;
-}
-
-// East ----------------------------------------------------
-prontera.gat,282,208,2 duplicate(Prt_Guide) Guide#prt2 105
-//West --------------------------------------------------
-prontera.gat,29,200,6 duplicate(Prt_Guide) Guide#prt3 105
-// South -----------------------------------------------------
-prontera.gat,160,29,0 duplicate(Prt_Guide) Guide#prt4 105
-// North -----------------------------------------------
-prontera.gat,151,330,4 duplicate(Prt_Guide) Guide#prt5 105
-
-
-// Guard -----------------------------------------------------
-prontera.gat,160,330,4 script Guard#1::Prt_Guard 105,{
- mes "[Guard]";
- mes "Welcome to Prontera.";
- close;
-}
-
-prontera.gat,229,104,5 duplicate(Prt_Guard) Guard#prt2 105
-prontera.gat,223,98,8 duplicate(Prt_Guard) Guard#prt3 105
-prontera.gat,52,344,5 duplicate(Prt_Guard) Guard#prt4 105
-prontera.gat,47,339,5 duplicate(Prt_Guard) Guard#prt5 105
-
-
-//---------------------------------------------------------------------------------------- Prontera Maze ----------------------------------------------------------------------------------\\
-prt_maze02.gat,100,69,4 script Guard#maz01 105,{
- mes "[Guard]";
- mes "Hey, I don't get your point but I say you should go home and rest rather than go inside the forest. Don't you know the 'Demon' lurks there?";
- mes "Naturally, Nobody came back on the hoof so I am not sure whether it really exists or not... well, Do as you want, dude. I'm not your mother.";
- close;
-}
-prt_maze02.gat,110,69,4 script Guard#maz02 105,{
- mes "[Guard]";
- mes "Phew...That geek who went inside last time never returned either.";
- mes "I tried to stop him so many times but he never took me seriously. He told me he needed herbs.";
- mes "If I were him, I would never give up my life for stupid herbs.";
- close;
-}
+//===== eAthena Script =======================================
+//= Prontera Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Now using duplicate command.
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the guide according to how it is on iRO, thanks [MasterOfMuppets]
+//= to Muad_Dib
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//= 1.5 Removed Duplicates [Silent]
+//============================================================
+
+
+prontera.gat,154,187,4 script Guide::Prt_Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Prontera Guide]";
+ mes "Welcome to Prontera, the beautiful capital of the Run-Midgard Kingdom.";
+ mes " If you have questions or need help find something in the city, don't hesitate to ask.";
+L_MENU:
+ next;
+ menu "City Guide",L_CITY,"Remove Marks from Mini-Map",L_REMOVE,"Notice",L_NOTICE,"Cancel",L_END;
+L_CITY:
+ mes "[Prontera Guide]";
+ mes "Please select a location from the following menu.";
+ mes "Would you like me to mark locations on your Mini-Map?";
+ next;
+ menu "Yes.",L_YES,"No.",L_NO;
+L_NO:
+ set @COMPASS_CHECK,0;
+ goto L_CONT;
+L_YES:
+ set @COMPASS_CHECK,1;
+L_CONT:
+L_MENU_2:
+ menu "Swordman Association",L_SWORD,"^0000FFSanctuary^000000",L_SANCTUARY,"Prontera Chivalry",L_CHIVALRY,"Weapon Shop",L_WEAPON,"Tool Shop",L_TOOL,"Inn",L_INN,"Trading Post",L_TRADING,"Pub",L_PUB,"Library",L_LIBRARY,"Job Agency",L_JOB,"Prontera Castle",L_CASTLE,"City Hall",L_HALL,"Cancel",-;
+ mes "[Prontera Guide]";
+ mes "Pleas ask me to Remove marks from Mini-Map if you no longer wish to have the location marks displayed on your Mini-Map.";
+ goto L_MENU;
+L_SWORD:
+ mes "[Prontera Guide]";
+ mes "The Swordman Association, which handles Job Changes to the Swordman class, has moved to Izlude.";
+ mes "This facility is just an empty building now.";
+ viewpoint 1,237,41,1,0x00FF00;
+ next;
+ goto L_WIPE;
+L_SANCTUARY:
+ mes "[Prontera Guide]";
+ mes "The Prontera Sanctuary handles Job Changes to the Acolyte class, and can be found in the northeast corner of Prontera.";
+ viewpoint 1,236,316,2,0xFF0000;
+ next;
+ goto L_WIPE;
+L_CHIVALRY:
+ mes "[Prontera Guide]";
+ mes "The Prontera Chivalry, which is responsible for the safety of our capital, is in Prontera's northwest corner.";
+ viewpoint 1,46,345,3,0x00FF00;
+ next;
+ goto L_WIPE;
+L_WEAPON:
+ mes "[Prontera Guide]";
+ mes "The Weapon Shop is located northeast of the central fountain.";
+ viewpoint 1,175,220,4,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TOOL:
+ mes "[Prontera Guide]";
+ mes "The Tool Shop is located northwest of the central fountain.";
+ viewpoint 1,134,221,5,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_INN:
+ mes "[Prontera Guide]";
+ mes "The Inns in Prontera are located both to the east and west of Prontera's central fountain area.";
+ viewpoint 1,204,214,6,0xFF00FF;
+ viewpoint 1,107,192,7,0xFF00FF;
+ next;
+ goto L_WIPE;
+L_TRADING:
+ mes "[Prontera Guide]";
+ mes "The Trading Post can be found southeast from the central fountain.";
+ viewpoint 1,179,184,8,0x00FF00;
+ next;
+ goto L_WIPE;
+L_PUB:
+ mes "[Prontera Guide]";
+ mes "The Pub is located southeast of the fountain, behind the Trading Post.";
+ viewpoint 1,208,154,9,0x00FF00;
+ next;
+ goto L_WIPE;
+L_LIBRARY:
+ mes "[Prontera Guide]";
+ mes "If you head north from the central fountain, you'll find an empty area in which both branches of the Prontera Library can be accessed if you head towards the east or west.";
+ viewpoint 1,120,267,10,0x00FF00;
+ viewpoint 1,192,267,11,0x00FF00;
+ next;
+ goto L_WIPE;
+L_JOB:
+ mes "[Prontera Guide]";
+ mes "The Job Agency is just southwest of the central fountain area.";
+ viewpoint 1,133,183,12,0x00FF00;
+ next;
+ goto L_WIPE;
+L_CASTLE:
+ mes "[Prontera Guide]";
+ mes "The Prontera Castle is located at the northern sector of this city.";
+ mes " You can go to fields that are north of Prontera by going through the castle's rear exit.";
+ viewpoint 1,156,360,13,0x00FF00;
+ next;
+ goto L_WIPE;
+L_HALL:
+ mes "[Prontera Guide]";
+ mes "The City Hall is located in the southwest corner in our city of Prontera.";
+ viewpoint 1,75,91,14,0x00FF00;
+ next;
+ goto L_WIPE;
+L_WIPE:
+ if(@COMPASS_CHECK == 1)goto L_MENU_2;
+ viewpoint 2,237,41,1,0x00FF00;
+ viewpoint 2,236,316,2,0xFF0000;
+ viewpoint 2,46,345,3,0x00FF00;
+ viewpoint 2,175,220,4,0xFF00FF;
+ viewpoint 2,8,134,5,0xFF00FF;
+ viewpoint 2,204,214,6,0xFF00FF;
+ viewpoint 2,107,192,7,0xFF00FF;
+ viewpoint 2,179,184,8,0x00FF00;
+ viewpoint 2,208,154,9,0x00FF00;
+ viewpoint 2,120,267,10,0x00FF00;
+ viewpoint 2,192,267,11,0x00FF00;
+ viewpoint 2,133,183,12,0x00FF00;
+ viewpoint 2,156,360,13,0x00FF00;
+ viewpoint 2,75,91,14,0x00FF00;
+ goto L_MENU_2;
+L_REMOVE:
+ viewpoint 2,237,41,1,0x00FF00;
+ viewpoint 2,236,316,2,0xFF0000;
+ viewpoint 2,46,345,3,0x00FF00;
+ viewpoint 2,175,220,4,0xFF00FF;
+ viewpoint 2,8,134,5,0xFF00FF;
+ viewpoint 2,204,214,6,0xFF00FF;
+ viewpoint 2,107,192,7,0xFF00FF;
+ viewpoint 2,179,184,8,0x00FF00;
+ viewpoint 2,208,154,9,0x00FF00;
+ viewpoint 2,120,267,10,0x00FF00;
+ viewpoint 2,192,267,11,0x00FF00;
+ viewpoint 2,133,183,12,0x00FF00;
+ viewpoint 2,156,360,13,0x00FF00;
+ viewpoint 2,75,91,14,0x00FF00;
+ goto L_MENU;
+L_NOTICE:
+ mes "[Prontera Guide]";
+ mes "Advances in sorcery and technology have allowed us to update our information system, enabling up to mark locations on your Mini-Map for easier navigation.";
+ next;
+ mes "[Prontera Guide]";
+ mes "Your Mini-Map is located in the upper right corner of the screen.";
+ mes "If you can't see it, press the Ctrl + Tab keys or click the 'Map' button in your Basic Information Window.";
+ next;
+ mes "[Prontera Guide]";
+ mes "On your Mini-Map, click on the '+' and '-' symbols to zoom in and out of your Mini-Map.";
+ mes "We hope you enjoy your travels here in the city of Prontera.";
+ goto L_MENU;
+L_END:
+ mes "[Prontera Guide]";
+ mes "Well, adventurer... I hope your journeys through Rune-Midgard are both fun and safe.";
+ cutin "prt_soldier",255;
+ close;
+}
+
+// East ----------------------------------------------------
+prontera.gat,282,208,2 duplicate(Prt_Guide) Guide#prt2 105
+//West --------------------------------------------------
+prontera.gat,29,200,6 duplicate(Prt_Guide) Guide#prt3 105
+// South -----------------------------------------------------
+prontera.gat,160,29,0 duplicate(Prt_Guide) Guide#prt4 105
+// North -----------------------------------------------
+prontera.gat,151,330,4 duplicate(Prt_Guide) Guide#prt5 105
+
+
+// Guard -----------------------------------------------------
+prontera.gat,160,330,4 script Guard#1::Prt_Guard 105,{
+ mes "[Guard]";
+ mes "Welcome to Prontera.";
+ close;
+}
+
+prontera.gat,229,104,5 duplicate(Prt_Guard) Guard#prt2 105
+prontera.gat,223,98,8 duplicate(Prt_Guard) Guard#prt3 105
+prontera.gat,52,344,5 duplicate(Prt_Guard) Guard#prt4 105
+prontera.gat,47,339,5 duplicate(Prt_Guard) Guard#prt5 105
+
+
+//---------------------------------------------------------------------------------------- Prontera Maze ----------------------------------------------------------------------------------\\
+prt_maze02.gat,100,69,4 script Guard#maz01 105,{
+ mes "[Guard]";
+ mes "Hey, I don't get your point but I say you should go home and rest rather than go inside the forest. Don't you know the 'Demon' lurks there?";
+ mes "Naturally, Nobody came back on the hoof so I am not sure whether it really exists or not... well, Do as you want, dude. I'm not your mother.";
+ close;
+}
+prt_maze02.gat,110,69,4 script Guard#maz02 105,{
+ mes "[Guard]";
+ mes "Phew...That geek who went inside last time never returned either.";
+ mes "I tried to stop him so many times but he never took me seriously. He told me he needed herbs.";
+ mes "If I were him, I would never give up my life for stupid herbs.";
+ close;
+}
diff --git a/npc/guides/guides_umb.txt b/npc/guides/guides_umb.txt
index 71fc6d4d0..c6ae85ba2 100644
--- a/npc/guides/guides_umb.txt
+++ b/npc/guides/guides_umb.txt
@@ -1,82 +1,82 @@
-//===== eAthena Script =======================================
-//= Umbala Guides
-//===== By: ==================================================
-//= Dizzy, Translated by Celest
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Umbala tour guide
-//===== Additional Comments: =================================
-//= 1.1 Fixed location command format [Lupus]
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
-//============================================================
-umbala.gat,128,94,3 script Ricard 702,{
- mes "[Ricard]";
- mes "This sure is an odd place, perhaps due to the fact that it hasn't been developed, and the roads here can be very perilous.";
- next;
- mes "[Ricard]";
- mes "Good thing I've already been here for quite some time, so i know the details of the village quite well.";
- mes "You may ask me for directions if you want.";
- next;
- menu "View buildings",-,"Clear indications",L_MENU_2,"Cancel",L_end1;
-
- mes "[Ricard]";
- mes "Where would you want to know about?";
- next;
- menu "Village Chieftain's house",-,"Village Shaman's house",L_room2,"Weapon shop",L_room3,"Equipment shop",L_room4,"Bungee Jumping Spot",L_room5,"Cancel",L_end2;
-
- mes "[Ricard]";
- mes "The chieftain lives ^FF0000here^000000, only he understands the languages of outsiders, perhaps you should see him first.";
- viewpoint 1,68,251,1,0xFF0000;
- close;
-
- L_room2:
- mes "[Ricard]";
- mes "The shaman is known to possess mysterious powers, his house would be right ^996600here^000000, it is said that he can manipulate the elements of the Earth easily!";
- viewpoint 1,218,187,2,0x996600;
- close;
-
- L_room3:
- mes "[Ricard]";
- mes "The weapon shop is ^009933over there^000000, because of threats from the outside world, they have been stocking up on all kinds of weapons.";
- viewpoint 1,125,155,3,0x009933;
- close;
-
- L_room4:
- mes "[Ricard]";
- mes "^3333FFThat^000000 would be the equipment shop, they sell all types of useful equipment.";
- mes "You should have a look there before continueing your travels.";
- viewpoint 1,136,127,4,0x3333FF;
- close;
-
- L_room5:
- mes "[Ricard]";
- mes "In Umbala there is a 'Bungee Jumping Spot' not seen anywhere else in the world as you can see ^66CC33over here^000000,";
- mes "You can try it out if you're feeling brave enough.";
- viewpoint 1,138,198,5,0x66CC33;
- close;
-
- L_end2:
- mes "[Ricard]";
- mes "To remove all indications of the minimap come back and talk to me again.";
- close;
-
-L_MENU_2:
- viewpoint 2,68,251,1,0xFF0000;
- viewpoint 2,218,187,2,0x996600;
- viewpoint 2,125,155,3,0x009933;
- viewpoint 2,136,127,4,0x3333FF;
- viewpoint 2,138,198,5,0x66CC33;
- mes "[Ricard]";
- mes "I have removed all the indications.";
- mes "If you still need any directions, come back and talk to me again.";
- close;
-
-L_end1:
- mes "[Ricard]";
- mes "Exploring around to know the paths better is fun, but do be careful.";
- close;
-}
+//===== eAthena Script =======================================
+//= Umbala Guides
+//===== By: ==================================================
+//= Dizzy, Translated by Celest
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Umbala tour guide
+//===== Additional Comments: =================================
+//= 1.1 Fixed location command format [Lupus]
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.4 Fitted the many lines into 1 or 2, and corrected some typos [erKURITA]
+//============================================================
+umbala.gat,128,94,3 script Ricard 702,{
+ mes "[Ricard]";
+ mes "This sure is an odd place, perhaps due to the fact that it hasn't been developed, and the roads here can be very perilous.";
+ next;
+ mes "[Ricard]";
+ mes "Good thing I've already been here for quite some time, so i know the details of the village quite well.";
+ mes "You may ask me for directions if you want.";
+ next;
+ menu "View buildings",-,"Clear indications",L_MENU_2,"Cancel",L_end1;
+
+ mes "[Ricard]";
+ mes "Where would you want to know about?";
+ next;
+ menu "Village Chieftain's house",-,"Village Shaman's house",L_room2,"Weapon shop",L_room3,"Equipment shop",L_room4,"Bungee Jumping Spot",L_room5,"Cancel",L_end2;
+
+ mes "[Ricard]";
+ mes "The chieftain lives ^FF0000here^000000, only he understands the languages of outsiders, perhaps you should see him first.";
+ viewpoint 1,68,251,1,0xFF0000;
+ close;
+
+ L_room2:
+ mes "[Ricard]";
+ mes "The shaman is known to possess mysterious powers, his house would be right ^996600here^000000, it is said that he can manipulate the elements of the Earth easily!";
+ viewpoint 1,218,187,2,0x996600;
+ close;
+
+ L_room3:
+ mes "[Ricard]";
+ mes "The weapon shop is ^009933over there^000000, because of threats from the outside world, they have been stocking up on all kinds of weapons.";
+ viewpoint 1,125,155,3,0x009933;
+ close;
+
+ L_room4:
+ mes "[Ricard]";
+ mes "^3333FFThat^000000 would be the equipment shop, they sell all types of useful equipment.";
+ mes "You should have a look there before continueing your travels.";
+ viewpoint 1,136,127,4,0x3333FF;
+ close;
+
+ L_room5:
+ mes "[Ricard]";
+ mes "In Umbala there is a 'Bungee Jumping Spot' not seen anywhere else in the world as you can see ^66CC33over here^000000,";
+ mes "You can try it out if you're feeling brave enough.";
+ viewpoint 1,138,198,5,0x66CC33;
+ close;
+
+ L_end2:
+ mes "[Ricard]";
+ mes "To remove all indications of the minimap come back and talk to me again.";
+ close;
+
+L_MENU_2:
+ viewpoint 2,68,251,1,0xFF0000;
+ viewpoint 2,218,187,2,0x996600;
+ viewpoint 2,125,155,3,0x009933;
+ viewpoint 2,136,127,4,0x3333FF;
+ viewpoint 2,138,198,5,0x66CC33;
+ mes "[Ricard]";
+ mes "I have removed all the indications.";
+ mes "If you still need any directions, come back and talk to me again.";
+ close;
+
+L_end1:
+ mes "[Ricard]";
+ mes "Exploring around to know the paths better is fun, but do be careful.";
+ close;
+}
diff --git a/npc/guides/guides_yun.txt b/npc/guides/guides_yun.txt
index 57e270cd2..6b1b2cc45 100644
--- a/npc/guides/guides_yun.txt
+++ b/npc/guides/guides_yun.txt
@@ -1,290 +1,290 @@
-//===== eAthena Script =======================================
-//= Yuno Guides
-//===== By: ==================================================
-//= KitsuneStarwind, usul, kobra_k88
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Edited Miss Yoon text. Added town soldiers by usul. Edited town soldiers
-//= and added map location option for them. [kobra_k88]
-//= 1.1 Changed sprites and cutins to Schwartzald Republic ones
-//= 1.2 Optimized, updated common guide names [Lupus]
-//= 1.3 Updated the mini map localization function. [Musashiden]
-//= 1.4 Juno Guides are now up to date according to iRO. [Musashiden]
-//= 1.5 Removed Duplicates [Silent].
-//= 1.6 Changed one of the Juno soldier's sprite. [Musashiden]
-//============================================================
-
-
-//=====================================================================================
-yuno.gat,153,47,4 script Juno Guide#yun1 700,{
- mes "[Ms. Yoon]";
- mes "A place that takes the vision of";
- mes "the future, and gives it form in";
- mes "the present. welcome to";
- mes "the city of Juno!";
- set @name$, "[Ms. Yoon]";
- next;
- callfunc "F_YunoLoc";
-}
-
-//=====================================================================
-yuno.gat,334,182,4 script Juno Soldier#yun1 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "Among the Sage's weapons, there is";
- mes "a 'Dagger of Counter'.";
- next;
- mes "[Juno Soldier]";
- mes "Its use is limited to the Sage";
- mes "class, and it increases the chance";
- mes "of inflicting critical attacks. So,";
- mes "for Sages, that dagger can be very";
- mes "useful, as well as make them look";
- mes "stylish in battle.";
- close;
-}
-
-//=====================================================================
-yuno.gat,263,320,4 script Juno Soldier#yun2 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "There is a holy shield named";
- mes "'Sacred Mission' which can only be";
- mes "used by Crusaders.";
- next;
- mes "[Juno Soldier]";
- mes "It's a long and narrow shield with";
- mes "an angel wing engraved in the";
- mes "center of the front side. Against";
- mes "Devil and Undead monsters, it is";
- mes "especially powerful.";
- close;
-}
-
-//=====================================================================
-yuno.gat,227,292,4 script Juno Soldier#yun3 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "Near Juno, there exists a fallen";
- mes "angel named 'False Angel'. It";
- mes "feigns innocence, pretending to";
- mes "bless adventurers and then stabbing";
- mes "them in the back without any";
- mes "warning.";
- next;
- mes "[Juno Soldier]";
- mes "Don't be fooled by its appearance,";
- mes "or you'll find yourself in";
- mes "trouble.";
- close;
-}
-
-//=====================================================================
-yuno.gat,165,283,4 script Yuno Soldier#yun4 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "Geographer...";
- mes "That monster looks like a flower";
- mes "blooming from the ground.";
- next;
- mes "[Juno Soldier]";
- mes "Strangely, it can extend its body a";
- mes "long distance. Even if you're far";
- mes "away from it, it can still pose a";
- mes "threat.";
- next;
- mes "[Juno Soldier]";
- mes "The name of this monster originated";
- mes "from a story about a poor";
- mes "geographer who, unfortunately, was";
- mes "eaten by this monster while he was";
- mes "immersed in his studies.";
- close;
-}
-
-//=====================================================================
-yuno.gat,150,283,4 script Yuno Soldier#yun5 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "there is a monster near here known";
- mes "as Lava Golem. This golem is made";
- mes "from a stone heart whose power";
- mes "happened to be amplified with magic";
- mes "power when it was swept away by";
- mes "molten rock.";
- next;
- mes "[Juno Soldier]";
- mes "The lava dripping from its body is";
- mes "so hot that it can melt down armor";
- mes "and weapons made out of high";
- mes "quality steel.";
- next;
- mes "[Juno Soldier]";
- mes "You'd better be careful when you";
- mes "encounter this monster. It will";
- mes "damage armor and weapons in the";
- mes "twinkling of an eye.";
- close;
-}
-
-//=====================================================================
-yuno.gat,165,228,4 script Yuno Soldier#yun6 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "'Goat' is a monster that was an";
- mes "antelope living in the high";
- mes "mountains that was somehow turned";
- mes "into a monster.";
- next;
- mes "[Juno Soldier]";
- mes "Even if you manage to dodge to its";
- mes "horns, you still need to be wary of";
- mes "its powerful legs.";
- next;
- mes "[Juno Soldier]";
- mes "Goat's legs are so strong because";
- mes "it's always climbing cliffs when";
- mes "it's not busy slaughtering the";
- mes "innocent.";
- close;
-}
-
-//=====================================================================
-yuno.gat,150,228,4 script Yuno Soldier#yun7 105,{
- mes "[Juno Soldier]";
- mes "Welcome to Juno, the city of";
- mes "noble-mindedness.";
- next;
- mes "[Juno Soldier]";
- mes "Have you ever";
- mes "seen a Large Jellopy?";
- mes "Those things are huuuge!";
- next;
- mes "[Juno Soldier]";
- mes "It's hard to believe";
- mes "that such a large and";
- mes "shining jellopy even exists!";
- close;
-}
-
-
-//======================================================================
-function script F_YunoLoc {
-
-
-sM_Menu:
- menu "Armory",-, "Tool Shop",sM_2, "Sage Castle (Sage Job Change Place)",sM_3, "Street of Book Stores",sM_4, "Juphero Plaza",sM_5,"Library of the Republic",sM_6, "Schwheicherbil Magic Academy",sM_7, "Monsters Museum",sM_8, "Forge",sM_9, "Airport", sM_10, "End Conversation",M_End;
-
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Armory";
- mes "Thank you,";
- mes "Have a good day.";
- viewpoint 1,117,135,1,0xFF0000;
- close;
- sM_2:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Tool Shop";
- mes "Thank you,";
- mes "Have a good day.";
- viewpoint 1,163,189,2,0x0000FF;
- close;
- sM_3:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Sage Castle";
- mes "(Sage Job Change Place)";
- mes "Thank you, Have a good day.";
- viewpoint 1,89,320,3,0x00FF00;
- close;
- sM_4:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Street of Book Stores";
- mes "Thank you, Have a good day.";
- viewpoint 1,196,138,4,0x0000ff;
- close;
- sM_5:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Juphero Plaza";
- mes "Thank you,";
- mes "Have a good day.";
- viewpoint 1,157,327,5,0x0000ff;
- close;
- sM_6:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Library of the Republic";
- mes "Thank you, Have a good day.";
- viewpoint 1,335,204,6,0x00FF00;
- close;
- sM_7:
- mes @name$;
- mes "Please look at the mini map.";
- mes "^FF3355+^000000 -> Schweicherbil Magic Academy";
- mes "Thank you, Have a good day.";
- viewpoint 1,323,280,7,0xFF0000;
- close;
- sM_8:
- mes @name$;
- mes "Please look at the mini map.";
- mes "^FF3355+^000000 -> Monster Museum";
- mes "Thank you, Have a good day.";
- viewpoint 1,278,291,8,0x0000FF;
- close;
- sM_9:
- mes @name$;
- mes "Please look at the mini map.";
- mes "^FF3355+^000000 -> Forge";
- mes "The forge is located underneath";
- mes "Armory";
- mes "Thank you, Have a good day.";
- viewpoint 1,117,135,9,0xFF0000;
- close;
- sM_10:
- mes @name$;
- mes "Please look";
- mes "at the mini map.";
- mes "^FF3355+^000000 -> Airport";
- mes "Thank you, Have a good day.";
- viewpoint 1,53,214,10,0xFF0000;
- close;
-
- M_End:
- mes @name$;
- mes "A great city of wise men.";
- mes "A city of Knowledge!";
- mes "Welcome to Juno.";
- close;
-}
+//===== eAthena Script =======================================
+//= Yuno Guides
+//===== By: ==================================================
+//= KitsuneStarwind, usul, kobra_k88
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Edited Miss Yoon text. Added town soldiers by usul. Edited town soldiers
+//= and added map location option for them. [kobra_k88]
+//= 1.1 Changed sprites and cutins to Schwartzald Republic ones
+//= 1.2 Optimized, updated common guide names [Lupus]
+//= 1.3 Updated the mini map localization function. [Musashiden]
+//= 1.4 Juno Guides are now up to date according to iRO. [Musashiden]
+//= 1.5 Removed Duplicates [Silent].
+//= 1.6 Changed one of the Juno soldier's sprite. [Musashiden]
+//============================================================
+
+
+//=====================================================================================
+yuno.gat,153,47,4 script Juno Guide#yun1 700,{
+ mes "[Ms. Yoon]";
+ mes "A place that takes the vision of";
+ mes "the future, and gives it form in";
+ mes "the present. welcome to";
+ mes "the city of Juno!";
+ set @name$, "[Ms. Yoon]";
+ next;
+ callfunc "F_YunoLoc";
+}
+
+//=====================================================================
+yuno.gat,334,182,4 script Juno Soldier#yun1 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Among the Sage's weapons, there is";
+ mes "a 'Dagger of Counter'.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Its use is limited to the Sage";
+ mes "class, and it increases the chance";
+ mes "of inflicting critical attacks. So,";
+ mes "for Sages, that dagger can be very";
+ mes "useful, as well as make them look";
+ mes "stylish in battle.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,263,320,4 script Juno Soldier#yun2 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "There is a holy shield named";
+ mes "'Sacred Mission' which can only be";
+ mes "used by Crusaders.";
+ next;
+ mes "[Juno Soldier]";
+ mes "It's a long and narrow shield with";
+ mes "an angel wing engraved in the";
+ mes "center of the front side. Against";
+ mes "Devil and Undead monsters, it is";
+ mes "especially powerful.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,227,292,4 script Juno Soldier#yun3 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Near Juno, there exists a fallen";
+ mes "angel named 'False Angel'. It";
+ mes "feigns innocence, pretending to";
+ mes "bless adventurers and then stabbing";
+ mes "them in the back without any";
+ mes "warning.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Don't be fooled by its appearance,";
+ mes "or you'll find yourself in";
+ mes "trouble.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,165,283,4 script Yuno Soldier#yun4 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Geographer...";
+ mes "That monster looks like a flower";
+ mes "blooming from the ground.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Strangely, it can extend its body a";
+ mes "long distance. Even if you're far";
+ mes "away from it, it can still pose a";
+ mes "threat.";
+ next;
+ mes "[Juno Soldier]";
+ mes "The name of this monster originated";
+ mes "from a story about a poor";
+ mes "geographer who, unfortunately, was";
+ mes "eaten by this monster while he was";
+ mes "immersed in his studies.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,150,283,4 script Yuno Soldier#yun5 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "there is a monster near here known";
+ mes "as Lava Golem. This golem is made";
+ mes "from a stone heart whose power";
+ mes "happened to be amplified with magic";
+ mes "power when it was swept away by";
+ mes "molten rock.";
+ next;
+ mes "[Juno Soldier]";
+ mes "The lava dripping from its body is";
+ mes "so hot that it can melt down armor";
+ mes "and weapons made out of high";
+ mes "quality steel.";
+ next;
+ mes "[Juno Soldier]";
+ mes "You'd better be careful when you";
+ mes "encounter this monster. It will";
+ mes "damage armor and weapons in the";
+ mes "twinkling of an eye.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,165,228,4 script Yuno Soldier#yun6 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "'Goat' is a monster that was an";
+ mes "antelope living in the high";
+ mes "mountains that was somehow turned";
+ mes "into a monster.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Even if you manage to dodge to its";
+ mes "horns, you still need to be wary of";
+ mes "its powerful legs.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Goat's legs are so strong because";
+ mes "it's always climbing cliffs when";
+ mes "it's not busy slaughtering the";
+ mes "innocent.";
+ close;
+}
+
+//=====================================================================
+yuno.gat,150,228,4 script Yuno Soldier#yun7 105,{
+ mes "[Juno Soldier]";
+ mes "Welcome to Juno, the city of";
+ mes "noble-mindedness.";
+ next;
+ mes "[Juno Soldier]";
+ mes "Have you ever";
+ mes "seen a Large Jellopy?";
+ mes "Those things are huuuge!";
+ next;
+ mes "[Juno Soldier]";
+ mes "It's hard to believe";
+ mes "that such a large and";
+ mes "shining jellopy even exists!";
+ close;
+}
+
+
+//======================================================================
+function script F_YunoLoc {
+
+
+sM_Menu:
+ menu "Armory",-, "Tool Shop",sM_2, "Sage Castle (Sage Job Change Place)",sM_3, "Street of Book Stores",sM_4, "Juphero Plaza",sM_5,"Library of the Republic",sM_6, "Schwheicherbil Magic Academy",sM_7, "Monsters Museum",sM_8, "Forge",sM_9, "Airport", sM_10, "End Conversation",M_End;
+
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Armory";
+ mes "Thank you,";
+ mes "Have a good day.";
+ viewpoint 1,117,135,1,0xFF0000;
+ close;
+ sM_2:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Tool Shop";
+ mes "Thank you,";
+ mes "Have a good day.";
+ viewpoint 1,163,189,2,0x0000FF;
+ close;
+ sM_3:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Sage Castle";
+ mes "(Sage Job Change Place)";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,89,320,3,0x00FF00;
+ close;
+ sM_4:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Street of Book Stores";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,196,138,4,0x0000ff;
+ close;
+ sM_5:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Juphero Plaza";
+ mes "Thank you,";
+ mes "Have a good day.";
+ viewpoint 1,157,327,5,0x0000ff;
+ close;
+ sM_6:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Library of the Republic";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,335,204,6,0x00FF00;
+ close;
+ sM_7:
+ mes @name$;
+ mes "Please look at the mini map.";
+ mes "^FF3355+^000000 -> Schweicherbil Magic Academy";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,323,280,7,0xFF0000;
+ close;
+ sM_8:
+ mes @name$;
+ mes "Please look at the mini map.";
+ mes "^FF3355+^000000 -> Monster Museum";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,278,291,8,0x0000FF;
+ close;
+ sM_9:
+ mes @name$;
+ mes "Please look at the mini map.";
+ mes "^FF3355+^000000 -> Forge";
+ mes "The forge is located underneath";
+ mes "Armory";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,117,135,9,0xFF0000;
+ close;
+ sM_10:
+ mes @name$;
+ mes "Please look";
+ mes "at the mini map.";
+ mes "^FF3355+^000000 -> Airport";
+ mes "Thank you, Have a good day.";
+ viewpoint 1,53,214,10,0xFF0000;
+ close;
+
+ M_End:
+ mes @name$;
+ mes "A great city of wise men.";
+ mes "A city of Knowledge!";
+ mes "Welcome to Juno.";
+ close;
+}
diff --git a/npc/guild/aldeg/aldeg_dunsw.txt b/npc/guild/aldeg/aldeg_dunsw.txt
index dc1acfb25..0f86b8d11 100644
--- a/npc/guild/aldeg/aldeg_dunsw.txt
+++ b/npc/guild/aldeg/aldeg_dunsw.txt
@@ -1,51 +1,51 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for Al De Baran Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to the guild dungeon
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-
-// Castle 1 ===============================================
-aldeg_cas01.gat,212,181,0 script Switch#DunA01 111,{
- callfunc "F_GldDunSw","aldeg_cas01","02",32,122;
- close;
-}
-
-
-// Castle 2 ===============================================
-aldeg_cas02.gat,194,136,0 script Switch#DunA02 111,{
- callfunc "F_GldDunSw","aldeg_cas02","02",79,32;
- close;
-}
-
-
-// Castle 3 ===============================================
-aldeg_cas03.gat,200,177,0 script Switch#DunA03 111,{
- callfunc "F_GldDunSw","aldeg_cas03","02",165,38;
- close;
-}
-
-
-// Castle 4 ===============================================
-aldeg_cas04.gat,38,76,0 script Switch#DunA04 111,{
- callfunc "F_GldDunSw","aldeg_cas04","02",160,148;
- close;
-}
-
-
-// Castle 5 ===============================================
-
-aldeg_cas05.gat,22,205,0 script Switch#DunA05 111,{
- callfunc "F_GldDunSw","aldeg_cas05","02",103,169;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Dungeon Switch for Al De Baran Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to the guild dungeon
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+
+// Castle 1 ===============================================
+aldeg_cas01.gat,212,181,0 script Switch#DunA01 111,{
+ callfunc "F_GldDunSw","aldeg_cas01","02",32,122;
+ close;
+}
+
+
+// Castle 2 ===============================================
+aldeg_cas02.gat,194,136,0 script Switch#DunA02 111,{
+ callfunc "F_GldDunSw","aldeg_cas02","02",79,32;
+ close;
+}
+
+
+// Castle 3 ===============================================
+aldeg_cas03.gat,200,177,0 script Switch#DunA03 111,{
+ callfunc "F_GldDunSw","aldeg_cas03","02",165,38;
+ close;
+}
+
+
+// Castle 4 ===============================================
+aldeg_cas04.gat,38,76,0 script Switch#DunA04 111,{
+ callfunc "F_GldDunSw","aldeg_cas04","02",160,148;
+ close;
+}
+
+
+// Castle 5 ===============================================
+
+aldeg_cas05.gat,22,205,0 script Switch#DunA05 111,{
+ callfunc "F_GldDunSw","aldeg_cas05","02",103,169;
+ close;
+}
diff --git a/npc/guild/aldeg/aldeg_ev_agit.txt b/npc/guild/aldeg/aldeg_ev_agit.txt
index 44d9a6aa5..e30e41dbd 100644
--- a/npc/guild/aldeg/aldeg_ev_agit.txt
+++ b/npc/guild/aldeg/aldeg_ev_agit.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Al De Baran Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Geffen Guild Wars
-//===== Additional Comments: =================================
-//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//============================================================
-
-
-// Castle 1 ================================================================
-aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
-OnInterIfInitOnce:
- GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
- end;
-OnRecvCastleA01:
- RequestGuildInfo GetCastleData("aldeg_cas01.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","aldeg_cas01","A01",216,24;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","aldeg_cas01","A01";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","aldeg_cas01","A01";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),6;
- Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","aldeg_cas01","A01";
- end;
-}
-
-// Castle 2 ================================================================
-aldeg_cas02.gat,214,24,0 script Agit_A02 -1,{
-OnInterIfInitOnce:
- GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
- end;
-OnRecvCastleA02:
- RequestGuildInfo GetCastleData("aldeg_cas02.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","aldeg_cas02","A02",214,24;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","aldeg_cas02","A02";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","aldeg_cas02","A02";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),6;
- Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","aldeg_cas02","A02";
- end;
-}
-
-// Castle 3 ================================================================
-aldeg_cas03.gat,206,32,0 script Agit_A03 -1,{
-OnInterIfInitOnce:
- GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
- end;
-OnRecvCastleA03:
- RequestGuildInfo GetCastleData("aldeg_cas03.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","aldeg_cas03","A03",206,32;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","aldeg_cas03","A03";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","aldeg_cas03","A03";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),6;
- Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","aldeg_cas03","A03";
- end;
-}
-
-// Castle 4 ================================================================
-aldeg_cas04.gat,36,218,0 script Agit_A04 -1,{
-OnInterIfInitOnce:
- GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
- end;
-OnRecvCastleA04:
- RequestGuildInfo GetCastleData("aldeg_cas04.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","aldeg_cas04","A04",36,218;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","aldeg_cas04","A04";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","aldeg_cas04","A04";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),6;
- Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","aldeg_cas04","A04";
- end;
-}
-
-// Castle 5 ================================================================
-aldeg_cas05.gat,28,102,0 script Agit_A05 -1,{
-OnInterIfInitOnce:
- GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
- end;
-OnRecvCastleA05:
- RequestGuildInfo GetCastleData("aldeg_cas05.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","aldeg_cas05","A05",28,102;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","aldeg_cas05","A05";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","aldeg_cas05","A05";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),6;
- Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","aldeg_cas05","A05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - Al De Baran Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Geffen Guild Wars
+//===== Additional Comments: =================================
+//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//============================================================
+
+
+// Castle 1 ================================================================
+aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
+OnInterIfInitOnce:
+ GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
+ end;
+OnRecvCastleA01:
+ RequestGuildInfo GetCastleData("aldeg_cas01.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","aldeg_cas01","A01",216,24;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","aldeg_cas01","A01";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","aldeg_cas01","A01";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),6;
+ Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","aldeg_cas01","A01";
+ end;
+}
+
+// Castle 2 ================================================================
+aldeg_cas02.gat,214,24,0 script Agit_A02 -1,{
+OnInterIfInitOnce:
+ GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
+ end;
+OnRecvCastleA02:
+ RequestGuildInfo GetCastleData("aldeg_cas02.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","aldeg_cas02","A02",214,24;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","aldeg_cas02","A02";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","aldeg_cas02","A02";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),6;
+ Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","aldeg_cas02","A02";
+ end;
+}
+
+// Castle 3 ================================================================
+aldeg_cas03.gat,206,32,0 script Agit_A03 -1,{
+OnInterIfInitOnce:
+ GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
+ end;
+OnRecvCastleA03:
+ RequestGuildInfo GetCastleData("aldeg_cas03.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","aldeg_cas03","A03",206,32;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","aldeg_cas03","A03";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","aldeg_cas03","A03";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),6;
+ Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","aldeg_cas03","A03";
+ end;
+}
+
+// Castle 4 ================================================================
+aldeg_cas04.gat,36,218,0 script Agit_A04 -1,{
+OnInterIfInitOnce:
+ GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
+ end;
+OnRecvCastleA04:
+ RequestGuildInfo GetCastleData("aldeg_cas04.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","aldeg_cas04","A04",36,218;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","aldeg_cas04","A04";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","aldeg_cas04","A04";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),6;
+ Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","aldeg_cas04","A04";
+ end;
+}
+
+// Castle 5 ================================================================
+aldeg_cas05.gat,28,102,0 script Agit_A05 -1,{
+OnInterIfInitOnce:
+ GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
+ end;
+OnRecvCastleA05:
+ RequestGuildInfo GetCastleData("aldeg_cas05.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","aldeg_cas05","A05",28,102;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","aldeg_cas05","A05";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","aldeg_cas05","A05";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),6;
+ Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","aldeg_cas05","A05";
+ end;
+}
diff --git a/npc/guild/aldeg/aldeg_flags.txt b/npc/guild/aldeg/aldeg_flags.txt
index 64b4edf8a..1fc5ff70f 100644
--- a/npc/guild/aldeg/aldeg_flags.txt
+++ b/npc/guild/aldeg/aldeg_flags.txt
@@ -1,243 +1,243 @@
-//===== eAthena Script =======================================
-//= War of Emperium Al De Baran Guild Flags
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= WoE flag scripts. Display guild emblems on flags.
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//= v1.3 Changed to iRO castle names [DracoRPG]
-//= v1.4 Can now only flag in from outside the castle [Kayla]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-aldebaran.gat,152,97,4 script Neuschwanstein#a1-1::Neuschwanstein 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170,0;
- close;
-
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- end;
-}
-
-alde_gld.gat,61,87,6 script Neuschwanstein#a1-2::Neuschwanstein2 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170,1;
- close;
-
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- end;
-}
-
-// In Guild =============================================
-alde_gld.gat,61,79,6 duplicate(Neuschwanstein2) Neuschwanstein#a1-3 722
-alde_gld.gat,45,87,8 duplicate(Neuschwanstein2) Neuschwanstein#a1-4 722
-alde_gld.gat,51,87,8 duplicate(Neuschwanstein2) Neuschwanstein#a1-5 722
-// In Castle ============================================
-aldeg_cas01.gat,30,248,4 duplicate(Neuschwanstein) Neuschwanstein#a1-6 722
-aldeg_cas01.gat,30,246,4 duplicate(Neuschwanstein) Neuschwanstein#a1-7 722
-aldeg_cas01.gat,37,248,4 duplicate(Neuschwanstein) Neuschwanstein#a1-8 722
-aldeg_cas01.gat,37,246,4 duplicate(Neuschwanstein) Neuschwanstein#a1-9 722
-aldeg_cas01.gat,95,80,2 duplicate(Neuschwanstein) Neuschwanstein#a1-10 722
-aldeg_cas01.gat,95,59,2 duplicate(Neuschwanstein) Neuschwanstein#a1-11 722
-aldeg_cas01.gat,62,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-12 722
-aldeg_cas01.gat,70,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-13 722
-aldeg_cas01.gat,74,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-14 722
-aldeg_cas01.gat,62,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-15 722
-aldeg_cas01.gat,66,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-16 722
-aldeg_cas01.gat,70,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-17 722
-aldeg_cas01.gat,74,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-18 722
-aldeg_cas01.gat,203,150,4 duplicate(Neuschwanstein) Neuschwanstein#a1-19 722
-aldeg_cas01.gat,210,150,4 duplicate(Neuschwanstein) Neuschwanstein#a1-20 722
-
-
-
-
-//================================================================================//
-// Castle 2
-//================================================================================//
-aldebaran.gat,149,97,4 script Hohenschwangau#a2-1::Hohenschwangau 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72,0;
- close;
-
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- end;
-}
-
-alde_gld.gat,93,250,5 script Hohenschwangau#a2-2::Hohenschwangau2 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72,1;
- close;
-
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- end;
-}
-
-// In Guild =================================================
-alde_gld.gat,98,250,5 duplicate(Hohenschwangau2) Hohenschwangau#a2-3 722
-// In Castle =============================================
-aldeg_cas02.gat,82,71,2 duplicate(Hohenschwangau) Hohenschwangau#a2-4 722
-aldeg_cas02.gat,67,30,2 duplicate(Hohenschwangau) Hohenschwangau#a2-5 722
-aldeg_cas02.gat,183,140,2 duplicate(Hohenschwangau) Hohenschwangau#a2-6 722
-aldeg_cas02.gat,212,152,2 duplicate(Hohenschwangau) Hohenschwangau#a2-7 722
-aldeg_cas02.gat,108,39,2 duplicate(Hohenschwangau) Hohenschwangau#a2-8 722
-aldeg_cas02.gat,57,213,2 duplicate(Hohenschwangau) Hohenschwangau#a2-9 722
-aldeg_cas02.gat,91,181,2 duplicate(Hohenschwangau) Hohenschwangau#a2-10 722
-aldeg_cas02.gat,103,53,2 duplicate(Hohenschwangau) Hohenschwangau#a2-11 722
-aldeg_cas02.gat,73,53,2 duplicate(Hohenschwangau) Hohenschwangau#a2-12 722
-aldeg_cas02.gat,63,41,2 duplicate(Hohenschwangau) Hohenschwangau#a2-13 722
-aldeg_cas02.gat,229,6,2 duplicate(Hohenschwangau) Hohenschwangau#a2-14 722
-aldeg_cas02.gat,230,40,2 duplicate(Hohenschwangau) Hohenschwangau#a2-15 722
-aldeg_cas02.gat,197,40,2 duplicate(Hohenschwangau) Hohenschwangau#a2-16 722
-aldeg_cas02.gat,32,213,2 duplicate(Hohenschwangau) Hohenschwangau#a2-17 722
-aldeg_cas02.gat,88,180,2 duplicate(Hohenschwangau) Hohenschwangau#a2-18 722
-aldeg_cas02.gat,121,29,2 duplicate(Hohenschwangau) Hohenschwangau#a2-19 722
-
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-aldebaran.gat,134,97,4 script Nuenberg#a3-1::Nuenberg 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76,0;
- close;
-
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- end;
-}
-
-alde_gld.gat,139,83,1 script Nuenberg#a3-2::Nuenberg2 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76,1;
- close;
-
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- end;
-}
-
-// In Guild ===============================================
-alde_gld.gat,145,83,1 duplicate(Nuenberg2) Nuenberg#a3-3 722
-// In Castle =============================================
-aldeg_cas03.gat,176,175,2 duplicate(Nuenberg) Nuenberg#a3-4 722
-aldeg_cas03.gat,85,103,2 duplicate(Nuenberg) Nuenberg#a3-5 722
-aldeg_cas03.gat,77,115,2 duplicate(Nuenberg) Nuenberg#a3-6 722
-aldeg_cas03.gat,77,215,2 duplicate(Nuenberg) Nuenberg#a3-7 722
-aldeg_cas03.gat,112,107,2 duplicate(Nuenberg) Nuenberg#a3-8 722
-aldeg_cas03.gat,112,117,2 duplicate(Nuenberg) Nuenberg#a3-9 722
-aldeg_cas03.gat,69,71,2 duplicate(Nuenberg) Nuenberg#a3-10 722
-aldeg_cas03.gat,91,69,2 duplicate(Nuenberg) Nuenberg#a3-11 722
-aldeg_cas03.gat,108,60,2 duplicate(Nuenberg) Nuenberg#a3-12 722
-aldeg_cas03.gat,121,73,2 duplicate(Nuenberg) Nuenberg#a3-13 722
-aldeg_cas03.gat,121,73,2 duplicate(Nuenberg) Nuenberg#a3-14 722
-aldeg_cas03.gat,75,102,2 duplicate(Nuenberg) Nuenberg#a3-15 722
-aldeg_cas03.gat,199,169,2 duplicate(Nuenberg) Nuenberg#a3-16 722
-aldeg_cas03.gat,181,179,2 duplicate(Nuenberg) Nuenberg#a3-17 722
-aldeg_cas03.gat,192,44,2 duplicate(Nuenberg) Nuenberg#a3-18 722
-aldeg_cas03.gat,88,108,2 duplicate(Nuenberg) Nuenberg#a3-19 722
-aldeg_cas03.gat,208,145,2 duplicate(Nuenberg) Nuenberg#a3-20 722
-aldeg_cas03.gat,207,75,2 duplicate(Nuenberg) Nuenberg#a3-21 722
-aldeg_cas03.gat,96,62,2 duplicate(Nuenberg) Nuenberg#a3-22 722
-
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-aldebaran.gat,131,97,4 script Wuerzburg#a4-1::Wuerzburg 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88,0;
- close;
-
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- end;
-}
-
-alde_gld.gat,239,247,1 script Wuerzburg#a4-2::Wuerzburg2 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88,1;
- close;
-
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-alde_gld.gat,234,247,1 duplicate(Wuerzburg2) Wuerzburg#a4-3 722
-alde_gld.gat,241,239,7 duplicate(Wuerzburg2) Wuerzburg#a4-4 722
-alde_gld.gat,241,234,7 duplicate(Wuerzburg2) Wuerzburg#a4-5 722
-// In Castle =============================================
-aldeg_cas04.gat,167,61,2 duplicate(Wuerzburg) Wuerzburg#a4-6 722
-aldeg_cas04.gat,164,90,2 duplicate(Wuerzburg) Wuerzburg#a4-7 722
-aldeg_cas04.gat,143,209,2 duplicate(Wuerzburg) Wuerzburg#a4-8 722
-aldeg_cas04.gat,129,193,2 duplicate(Wuerzburg) Wuerzburg#a4-9 722
-aldeg_cas04.gat,112,206,2 duplicate(Wuerzburg) Wuerzburg#a4-10 722
-aldeg_cas04.gat,113,212,2 duplicate(Wuerzburg) Wuerzburg#a4-11 722
-aldeg_cas04.gat,77,117,2 duplicate(Wuerzburg) Wuerzburg#a4-12 722
-aldeg_cas04.gat,186,42,2 duplicate(Wuerzburg) Wuerzburg#a4-13 722
-aldeg_cas04.gat,30,69,2 duplicate(Wuerzburg) Wuerzburg#a4-14 722
-aldeg_cas04.gat,55,97,2 duplicate(Wuerzburg) Wuerzburg#a4-15 722
-aldeg_cas04.gat,45,98,2 duplicate(Wuerzburg) Wuerzburg#a4-16 722
-aldeg_cas04.gat,33,116,2 duplicate(Wuerzburg) Wuerzburg#a4-17 722
-aldeg_cas04.gat,130,180,2 duplicate(Wuerzburg) Wuerzburg#a4-18 722
-aldeg_cas04.gat,129,193,2 duplicate(Wuerzburg) Wuerzburg#a4-19 722
-aldeg_cas04.gat,142,209,2 duplicate(Wuerzburg) Wuerzburg#a4-20 722
-aldeg_cas04.gat,33,107,2 duplicate(Wuerzburg) Wuerzburg#a4-21 722
-aldeg_cas04.gat,133,220,2 duplicate(Wuerzburg) Wuerzburg#a4-22 722
-aldeg_cas04.gat,169,22,2 duplicate(Wuerzburg) Wuerzburg#a4-23 722
-aldeg_cas04.gat,169,15,2 duplicate(Wuerzburg) Wuerzburg#a4-24 722
-
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-aldebaran.gat,128,97,4 script Rothenburg#a5-1::Rothenburg 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190,0;
- close;
-
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- end;
-}
-
-alde_gld.gat,266,92,7 script Rothenburg#a5-2::Rothenburg2 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190,1;
- close;
-
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- end;
-}
-
-// In Guild ===============================================
-alde_gld.gat,266,88,7 duplicate(Rothenburg2) Rothenburg#a5-3 722
-// In Castle =============================================
-aldeg_cas05.gat,170,85,2 duplicate(Rothenburg) Rothenburg#a5-4 722
-aldeg_cas05.gat,142,212,2 duplicate(Rothenburg) Rothenburg#a5-5 722
-aldeg_cas05.gat,149,196,2 duplicate(Rothenburg) Rothenburg#a5-6 722
-aldeg_cas05.gat,41,180,2 duplicate(Rothenburg) Rothenburg#a5-7 722
-aldeg_cas05.gat,38,201,2 duplicate(Rothenburg) Rothenburg#a5-8 722
-aldeg_cas05.gat,65,182,2 duplicate(Rothenburg) Rothenburg#a5-9 722
-aldeg_cas05.gat,65,205,2 duplicate(Rothenburg) Rothenburg#a5-10 722
-aldeg_cas05.gat,10,218,2 duplicate(Rothenburg) Rothenburg#a5-11 722
-aldeg_cas05.gat,164,201,2 duplicate(Rothenburg) Rothenburg#a5-12 722
-aldeg_cas05.gat,216,96,2 duplicate(Rothenburg) Rothenburg#a5-13 722
-aldeg_cas05.gat,217,80,2 duplicate(Rothenburg) Rothenburg#a5-14 722
-aldeg_cas05.gat,14,117,2 duplicate(Rothenburg) Rothenburg#a5-15 722
-aldeg_cas05.gat,10,225,2 duplicate(Rothenburg) Rothenburg#a5-16 722
-aldeg_cas05.gat,187,59,2 duplicate(Rothenburg) Rothenburg#a5-17 722
-aldeg_cas05.gat,154,51,2 duplicate(Rothenburg) Rothenburg#a5-18 722
-aldeg_cas05.gat,22,211,2 duplicate(Rothenburg) Rothenburg#a5-19 722
-aldeg_cas05.gat,150,202,2 duplicate(Rothenburg) Rothenburg#a5-20 722
+//===== eAthena Script =======================================
+//= War of Emperium Al De Baran Guild Flags
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= WoE flag scripts. Display guild emblems on flags.
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//= v1.3 Changed to iRO castle names [DracoRPG]
+//= v1.4 Can now only flag in from outside the castle [Kayla]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+aldebaran.gat,152,97,4 script Neuschwanstein#a1-1::Neuschwanstein 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170,0;
+ close;
+
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ end;
+}
+
+alde_gld.gat,61,87,6 script Neuschwanstein#a1-2::Neuschwanstein2 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170,1;
+ close;
+
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ end;
+}
+
+// In Guild =============================================
+alde_gld.gat,61,79,6 duplicate(Neuschwanstein2) Neuschwanstein#a1-3 722
+alde_gld.gat,45,87,8 duplicate(Neuschwanstein2) Neuschwanstein#a1-4 722
+alde_gld.gat,51,87,8 duplicate(Neuschwanstein2) Neuschwanstein#a1-5 722
+// In Castle ============================================
+aldeg_cas01.gat,30,248,4 duplicate(Neuschwanstein) Neuschwanstein#a1-6 722
+aldeg_cas01.gat,30,246,4 duplicate(Neuschwanstein) Neuschwanstein#a1-7 722
+aldeg_cas01.gat,37,248,4 duplicate(Neuschwanstein) Neuschwanstein#a1-8 722
+aldeg_cas01.gat,37,246,4 duplicate(Neuschwanstein) Neuschwanstein#a1-9 722
+aldeg_cas01.gat,95,80,2 duplicate(Neuschwanstein) Neuschwanstein#a1-10 722
+aldeg_cas01.gat,95,59,2 duplicate(Neuschwanstein) Neuschwanstein#a1-11 722
+aldeg_cas01.gat,62,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-12 722
+aldeg_cas01.gat,70,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-13 722
+aldeg_cas01.gat,74,75,2 duplicate(Neuschwanstein) Neuschwanstein#a1-14 722
+aldeg_cas01.gat,62,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-15 722
+aldeg_cas01.gat,66,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-16 722
+aldeg_cas01.gat,70,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-17 722
+aldeg_cas01.gat,74,64,2 duplicate(Neuschwanstein) Neuschwanstein#a1-18 722
+aldeg_cas01.gat,203,150,4 duplicate(Neuschwanstein) Neuschwanstein#a1-19 722
+aldeg_cas01.gat,210,150,4 duplicate(Neuschwanstein) Neuschwanstein#a1-20 722
+
+
+
+
+//================================================================================//
+// Castle 2
+//================================================================================//
+aldebaran.gat,149,97,4 script Hohenschwangau#a2-1::Hohenschwangau 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72,0;
+ close;
+
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ end;
+}
+
+alde_gld.gat,93,250,5 script Hohenschwangau#a2-2::Hohenschwangau2 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72,1;
+ close;
+
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ end;
+}
+
+// In Guild =================================================
+alde_gld.gat,98,250,5 duplicate(Hohenschwangau2) Hohenschwangau#a2-3 722
+// In Castle =============================================
+aldeg_cas02.gat,82,71,2 duplicate(Hohenschwangau) Hohenschwangau#a2-4 722
+aldeg_cas02.gat,67,30,2 duplicate(Hohenschwangau) Hohenschwangau#a2-5 722
+aldeg_cas02.gat,183,140,2 duplicate(Hohenschwangau) Hohenschwangau#a2-6 722
+aldeg_cas02.gat,212,152,2 duplicate(Hohenschwangau) Hohenschwangau#a2-7 722
+aldeg_cas02.gat,108,39,2 duplicate(Hohenschwangau) Hohenschwangau#a2-8 722
+aldeg_cas02.gat,57,213,2 duplicate(Hohenschwangau) Hohenschwangau#a2-9 722
+aldeg_cas02.gat,91,181,2 duplicate(Hohenschwangau) Hohenschwangau#a2-10 722
+aldeg_cas02.gat,103,53,2 duplicate(Hohenschwangau) Hohenschwangau#a2-11 722
+aldeg_cas02.gat,73,53,2 duplicate(Hohenschwangau) Hohenschwangau#a2-12 722
+aldeg_cas02.gat,63,41,2 duplicate(Hohenschwangau) Hohenschwangau#a2-13 722
+aldeg_cas02.gat,229,6,2 duplicate(Hohenschwangau) Hohenschwangau#a2-14 722
+aldeg_cas02.gat,230,40,2 duplicate(Hohenschwangau) Hohenschwangau#a2-15 722
+aldeg_cas02.gat,197,40,2 duplicate(Hohenschwangau) Hohenschwangau#a2-16 722
+aldeg_cas02.gat,32,213,2 duplicate(Hohenschwangau) Hohenschwangau#a2-17 722
+aldeg_cas02.gat,88,180,2 duplicate(Hohenschwangau) Hohenschwangau#a2-18 722
+aldeg_cas02.gat,121,29,2 duplicate(Hohenschwangau) Hohenschwangau#a2-19 722
+
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+aldebaran.gat,134,97,4 script Nuenberg#a3-1::Nuenberg 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76,0;
+ close;
+
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ end;
+}
+
+alde_gld.gat,139,83,1 script Nuenberg#a3-2::Nuenberg2 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76,1;
+ close;
+
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ end;
+}
+
+// In Guild ===============================================
+alde_gld.gat,145,83,1 duplicate(Nuenberg2) Nuenberg#a3-3 722
+// In Castle =============================================
+aldeg_cas03.gat,176,175,2 duplicate(Nuenberg) Nuenberg#a3-4 722
+aldeg_cas03.gat,85,103,2 duplicate(Nuenberg) Nuenberg#a3-5 722
+aldeg_cas03.gat,77,115,2 duplicate(Nuenberg) Nuenberg#a3-6 722
+aldeg_cas03.gat,77,215,2 duplicate(Nuenberg) Nuenberg#a3-7 722
+aldeg_cas03.gat,112,107,2 duplicate(Nuenberg) Nuenberg#a3-8 722
+aldeg_cas03.gat,112,117,2 duplicate(Nuenberg) Nuenberg#a3-9 722
+aldeg_cas03.gat,69,71,2 duplicate(Nuenberg) Nuenberg#a3-10 722
+aldeg_cas03.gat,91,69,2 duplicate(Nuenberg) Nuenberg#a3-11 722
+aldeg_cas03.gat,108,60,2 duplicate(Nuenberg) Nuenberg#a3-12 722
+aldeg_cas03.gat,121,73,2 duplicate(Nuenberg) Nuenberg#a3-13 722
+aldeg_cas03.gat,121,73,2 duplicate(Nuenberg) Nuenberg#a3-14 722
+aldeg_cas03.gat,75,102,2 duplicate(Nuenberg) Nuenberg#a3-15 722
+aldeg_cas03.gat,199,169,2 duplicate(Nuenberg) Nuenberg#a3-16 722
+aldeg_cas03.gat,181,179,2 duplicate(Nuenberg) Nuenberg#a3-17 722
+aldeg_cas03.gat,192,44,2 duplicate(Nuenberg) Nuenberg#a3-18 722
+aldeg_cas03.gat,88,108,2 duplicate(Nuenberg) Nuenberg#a3-19 722
+aldeg_cas03.gat,208,145,2 duplicate(Nuenberg) Nuenberg#a3-20 722
+aldeg_cas03.gat,207,75,2 duplicate(Nuenberg) Nuenberg#a3-21 722
+aldeg_cas03.gat,96,62,2 duplicate(Nuenberg) Nuenberg#a3-22 722
+
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+aldebaran.gat,131,97,4 script Wuerzburg#a4-1::Wuerzburg 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88,0;
+ close;
+
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ end;
+}
+
+alde_gld.gat,239,247,1 script Wuerzburg#a4-2::Wuerzburg2 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88,1;
+ close;
+
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+alde_gld.gat,234,247,1 duplicate(Wuerzburg2) Wuerzburg#a4-3 722
+alde_gld.gat,241,239,7 duplicate(Wuerzburg2) Wuerzburg#a4-4 722
+alde_gld.gat,241,234,7 duplicate(Wuerzburg2) Wuerzburg#a4-5 722
+// In Castle =============================================
+aldeg_cas04.gat,167,61,2 duplicate(Wuerzburg) Wuerzburg#a4-6 722
+aldeg_cas04.gat,164,90,2 duplicate(Wuerzburg) Wuerzburg#a4-7 722
+aldeg_cas04.gat,143,209,2 duplicate(Wuerzburg) Wuerzburg#a4-8 722
+aldeg_cas04.gat,129,193,2 duplicate(Wuerzburg) Wuerzburg#a4-9 722
+aldeg_cas04.gat,112,206,2 duplicate(Wuerzburg) Wuerzburg#a4-10 722
+aldeg_cas04.gat,113,212,2 duplicate(Wuerzburg) Wuerzburg#a4-11 722
+aldeg_cas04.gat,77,117,2 duplicate(Wuerzburg) Wuerzburg#a4-12 722
+aldeg_cas04.gat,186,42,2 duplicate(Wuerzburg) Wuerzburg#a4-13 722
+aldeg_cas04.gat,30,69,2 duplicate(Wuerzburg) Wuerzburg#a4-14 722
+aldeg_cas04.gat,55,97,2 duplicate(Wuerzburg) Wuerzburg#a4-15 722
+aldeg_cas04.gat,45,98,2 duplicate(Wuerzburg) Wuerzburg#a4-16 722
+aldeg_cas04.gat,33,116,2 duplicate(Wuerzburg) Wuerzburg#a4-17 722
+aldeg_cas04.gat,130,180,2 duplicate(Wuerzburg) Wuerzburg#a4-18 722
+aldeg_cas04.gat,129,193,2 duplicate(Wuerzburg) Wuerzburg#a4-19 722
+aldeg_cas04.gat,142,209,2 duplicate(Wuerzburg) Wuerzburg#a4-20 722
+aldeg_cas04.gat,33,107,2 duplicate(Wuerzburg) Wuerzburg#a4-21 722
+aldeg_cas04.gat,133,220,2 duplicate(Wuerzburg) Wuerzburg#a4-22 722
+aldeg_cas04.gat,169,22,2 duplicate(Wuerzburg) Wuerzburg#a4-23 722
+aldeg_cas04.gat,169,15,2 duplicate(Wuerzburg) Wuerzburg#a4-24 722
+
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+aldebaran.gat,128,97,4 script Rothenburg#a5-1::Rothenburg 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190,0;
+ close;
+
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ end;
+}
+
+alde_gld.gat,266,92,7 script Rothenburg#a5-2::Rothenburg2 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190,1;
+ close;
+
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ end;
+}
+
+// In Guild ===============================================
+alde_gld.gat,266,88,7 duplicate(Rothenburg2) Rothenburg#a5-3 722
+// In Castle =============================================
+aldeg_cas05.gat,170,85,2 duplicate(Rothenburg) Rothenburg#a5-4 722
+aldeg_cas05.gat,142,212,2 duplicate(Rothenburg) Rothenburg#a5-5 722
+aldeg_cas05.gat,149,196,2 duplicate(Rothenburg) Rothenburg#a5-6 722
+aldeg_cas05.gat,41,180,2 duplicate(Rothenburg) Rothenburg#a5-7 722
+aldeg_cas05.gat,38,201,2 duplicate(Rothenburg) Rothenburg#a5-8 722
+aldeg_cas05.gat,65,182,2 duplicate(Rothenburg) Rothenburg#a5-9 722
+aldeg_cas05.gat,65,205,2 duplicate(Rothenburg) Rothenburg#a5-10 722
+aldeg_cas05.gat,10,218,2 duplicate(Rothenburg) Rothenburg#a5-11 722
+aldeg_cas05.gat,164,201,2 duplicate(Rothenburg) Rothenburg#a5-12 722
+aldeg_cas05.gat,216,96,2 duplicate(Rothenburg) Rothenburg#a5-13 722
+aldeg_cas05.gat,217,80,2 duplicate(Rothenburg) Rothenburg#a5-14 722
+aldeg_cas05.gat,14,117,2 duplicate(Rothenburg) Rothenburg#a5-15 722
+aldeg_cas05.gat,10,225,2 duplicate(Rothenburg) Rothenburg#a5-16 722
+aldeg_cas05.gat,187,59,2 duplicate(Rothenburg) Rothenburg#a5-17 722
+aldeg_cas05.gat,154,51,2 duplicate(Rothenburg) Rothenburg#a5-18 722
+aldeg_cas05.gat,22,211,2 duplicate(Rothenburg) Rothenburg#a5-19 722
+aldeg_cas05.gat,150,202,2 duplicate(Rothenburg) Rothenburg#a5-20 722
diff --git a/npc/guild/aldeg/aldeg_guardians.txt b/npc/guild/aldeg/aldeg_guardians.txt
index 3cd10972d..764d7a66d 100644
--- a/npc/guild/aldeg/aldeg_guardians.txt
+++ b/npc/guild/aldeg/aldeg_guardians.txt
@@ -1,111 +1,111 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Re-spawns guardians on server start if they have been
-//= purchased. Also announces when a guardian dies.
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//= 1.2a Guardians for all aldeg castles are now in this file.
-//= Minor optimizations.[kobra_k88]
-//============================================================
-
-
-aldeg_cas01.gat,216,24,0 script Guardian_A01 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas01.gat",10) == 1) guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
- if (GetCastleData("aldeg_cas01.gat",11) == 1) guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
- if (GetCastleData("aldeg_cas01.gat",12) == 1) guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
- if (GetCastleData("aldeg_cas01.gat",13) == 1) guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
- if (GetCastleData("aldeg_cas01.gat",14) == 1) guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
- if (GetCastleData("aldeg_cas01.gat",15) == 1) guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
- if (GetCastleData("aldeg_cas01.gat",16) == 1) guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
- if (GetCastleData("aldeg_cas01.gat",17) == 1) guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas01.gat","A Guardian Has Fallen",17;
- end;
-
-//NoSpawn:
-// break;
-}
-//------------------------------------------------------------------------------
-aldeg_cas02.gat,214,24,0 script Guardian_A02 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas02.gat",10) == 1) guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
- if (GetCastleData("aldeg_cas02.gat",11) == 1) guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
- if (GetCastleData("aldeg_cas02.gat",12) == 1) guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
- if (GetCastleData("aldeg_cas02.gat",13) == 1) guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
- if (GetCastleData("aldeg_cas02.gat",14) == 1) guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
- if (GetCastleData("aldeg_cas02.gat",15) == 1) guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
- if (GetCastleData("aldeg_cas02.gat",16) == 1) guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
- if (GetCastleData("aldeg_cas02.gat",17) == 1) guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas02.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-aldeg_cas03.gat,206,32,0 script Guardian_A03 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas03.gat",10) == 1) guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
- if (GetCastleData("aldeg_cas03.gat",11) == 1) guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
- if (GetCastleData("aldeg_cas03.gat",12) == 1) guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
- if (GetCastleData("aldeg_cas03.gat",13) == 1) guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
- if (GetCastleData("aldeg_cas03.gat",14) == 1) guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
- if (GetCastleData("aldeg_cas03.gat",15) == 1) guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
- if (GetCastleData("aldeg_cas03.gat",16) == 1) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
- if (GetCastleData("aldeg_cas03.gat",17) == 1) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas03.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-aldeg_cas04.gat,36,218,0 script Guardian_A04 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas04.gat",10) == 1) guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
- if (GetCastleData("aldeg_cas04.gat",11) == 1) guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
- if (GetCastleData("aldeg_cas04.gat",12) == 1) guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
- if (GetCastleData("aldeg_cas04.gat",13) == 1) guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
- if (GetCastleData("aldeg_cas04.gat",14) == 1) guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
- if (GetCastleData("aldeg_cas04.gat",15) == 1) guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
- if (GetCastleData("aldeg_cas04.gat",16) == 1) guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
- if (GetCastleData("aldeg_cas04.gat",17) == 1) guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas04.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-aldeg_cas05.gat,28,102,0 script Guardian_A05 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas05.gat",10) == 1) guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
- if (GetCastleData("aldeg_cas05.gat",11) == 1) guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
- if (GetCastleData("aldeg_cas05.gat",12) == 1) guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
- if (GetCastleData("aldeg_cas05.gat",13) == 1) guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
- if (GetCastleData("aldeg_cas05.gat",14) == 1) guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
- if (GetCastleData("aldeg_cas05.gat",15) == 1) guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
- if (GetCastleData("aldeg_cas05.gat",16) == 1) guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
- if (GetCastleData("aldeg_cas05.gat",17) == 1) guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas05.gat","A Guardian Has Fallen",17;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Re-spawns guardians on server start if they have been
+//= purchased. Also announces when a guardian dies.
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//= 1.2a Guardians for all aldeg castles are now in this file.
+//= Minor optimizations.[kobra_k88]
+//============================================================
+
+
+aldeg_cas01.gat,216,24,0 script Guardian_A01 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas01.gat",10) == 1) guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
+ if (GetCastleData("aldeg_cas01.gat",11) == 1) guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
+ if (GetCastleData("aldeg_cas01.gat",12) == 1) guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
+ if (GetCastleData("aldeg_cas01.gat",13) == 1) guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
+ if (GetCastleData("aldeg_cas01.gat",14) == 1) guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
+ if (GetCastleData("aldeg_cas01.gat",15) == 1) guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
+ if (GetCastleData("aldeg_cas01.gat",16) == 1) guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
+ if (GetCastleData("aldeg_cas01.gat",17) == 1) guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas01.gat","A Guardian Has Fallen",17;
+ end;
+
+//NoSpawn:
+// break;
+}
+//------------------------------------------------------------------------------
+aldeg_cas02.gat,214,24,0 script Guardian_A02 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas02.gat",10) == 1) guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
+ if (GetCastleData("aldeg_cas02.gat",11) == 1) guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
+ if (GetCastleData("aldeg_cas02.gat",12) == 1) guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
+ if (GetCastleData("aldeg_cas02.gat",13) == 1) guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
+ if (GetCastleData("aldeg_cas02.gat",14) == 1) guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
+ if (GetCastleData("aldeg_cas02.gat",15) == 1) guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
+ if (GetCastleData("aldeg_cas02.gat",16) == 1) guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
+ if (GetCastleData("aldeg_cas02.gat",17) == 1) guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas02.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+aldeg_cas03.gat,206,32,0 script Guardian_A03 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas03.gat",10) == 1) guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
+ if (GetCastleData("aldeg_cas03.gat",11) == 1) guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
+ if (GetCastleData("aldeg_cas03.gat",12) == 1) guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
+ if (GetCastleData("aldeg_cas03.gat",13) == 1) guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
+ if (GetCastleData("aldeg_cas03.gat",14) == 1) guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
+ if (GetCastleData("aldeg_cas03.gat",15) == 1) guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
+ if (GetCastleData("aldeg_cas03.gat",16) == 1) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
+ if (GetCastleData("aldeg_cas03.gat",17) == 1) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas03.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+aldeg_cas04.gat,36,218,0 script Guardian_A04 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas04.gat",10) == 1) guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
+ if (GetCastleData("aldeg_cas04.gat",11) == 1) guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
+ if (GetCastleData("aldeg_cas04.gat",12) == 1) guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
+ if (GetCastleData("aldeg_cas04.gat",13) == 1) guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
+ if (GetCastleData("aldeg_cas04.gat",14) == 1) guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
+ if (GetCastleData("aldeg_cas04.gat",15) == 1) guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
+ if (GetCastleData("aldeg_cas04.gat",16) == 1) guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
+ if (GetCastleData("aldeg_cas04.gat",17) == 1) guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas04.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+aldeg_cas05.gat,28,102,0 script Guardian_A05 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas05.gat",10) == 1) guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
+ if (GetCastleData("aldeg_cas05.gat",11) == 1) guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
+ if (GetCastleData("aldeg_cas05.gat",12) == 1) guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
+ if (GetCastleData("aldeg_cas05.gat",13) == 1) guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
+ if (GetCastleData("aldeg_cas05.gat",14) == 1) guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
+ if (GetCastleData("aldeg_cas05.gat",15) == 1) guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
+ if (GetCastleData("aldeg_cas05.gat",16) == 1) guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
+ if (GetCastleData("aldeg_cas05.gat",17) == 1) guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas05.gat","A Guardian Has Fallen",17;
+ end;
+}
diff --git a/npc/guild/aldeg/aldeg_kafras.txt b/npc/guild/aldeg/aldeg_kafras.txt
index c2005f95a..23b2fd8b7 100644
--- a/npc/guild/aldeg/aldeg_kafras.txt
+++ b/npc/guild/aldeg/aldeg_kafras.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= War of Emperium Kafras for Al De Baran Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Provides Kafra services for guild members of Al De Baran Castles.
-//= Used in conjuction with function F_Kafra.
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ===============================================
-aldeg_cas01.gat,218,170,0 script Kafra Service#A01 117,{
- callfunc "F_GKafra", "aldeg_cas01", "Al De Baran";
- end;
-OnRecvCastleA01:
- if (GetCastleData("aldeg_cas01.gat",9) < 1) disablenpc "Kafra Service#A01";
- end;
-}
-
-// Castle 2 ===============================================
-aldeg_cas02.gat,84,74,0 script Kafra Service#A02 117,{
- callfunc "F_GKafra", "aldeg_cas02", "Al De Baran";
- end;
-OnRecvCastleA02:
- if (GetCastleData("aldeg_cas02.gat",9) < 1) disablenpc "Kafra Service#A02";
- end;
-}
-
-// Castle 3 ===============================================
-aldeg_cas03.gat,118,76,0 script Kafra Service#A03 117,{
- callfunc "F_GKafra", "aldeg_cas03", "Al De Baran";
- end;
-OnRecvCastleA03:
- if (GetCastleData("aldeg_cas03.gat",9) < 1) disablenpc "Kafra Service#A03";
- end;
-}
-
-// Castle 4 ===============================================
-aldeg_cas04.gat,45,88,0 script Kafra Service#A04 117,{
- callfunc "F_GKafra", "aldeg_cas04", "Al De Baran";
- end;
-OnRecvCastleA04:
- if (GetCastleData("aldeg_cas04.gat",9) < 1) disablenpc "Kafra Service#A04";
- end;
-}
-
-// Castle 5 ===============================================
-aldeg_cas05.gat,31,190,0 script Kafra Service#A05 117,{
- callfunc "F_GKafra", "aldeg_cas05", "Al De Baran";
- end;
-OnRecvCastleA05:
- if (GetCastleData("aldeg_cas05.gat",9) < 1) disablenpc "Kafra Service#A05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Kafras for Al De Baran Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Provides Kafra services for guild members of Al De Baran Castles.
+//= Used in conjuction with function F_Kafra.
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ===============================================
+aldeg_cas01.gat,218,170,0 script Kafra Service#A01 117,{
+ callfunc "F_GKafra", "aldeg_cas01", "Al De Baran";
+ end;
+OnRecvCastleA01:
+ if (GetCastleData("aldeg_cas01.gat",9) < 1) disablenpc "Kafra Service#A01";
+ end;
+}
+
+// Castle 2 ===============================================
+aldeg_cas02.gat,84,74,0 script Kafra Service#A02 117,{
+ callfunc "F_GKafra", "aldeg_cas02", "Al De Baran";
+ end;
+OnRecvCastleA02:
+ if (GetCastleData("aldeg_cas02.gat",9) < 1) disablenpc "Kafra Service#A02";
+ end;
+}
+
+// Castle 3 ===============================================
+aldeg_cas03.gat,118,76,0 script Kafra Service#A03 117,{
+ callfunc "F_GKafra", "aldeg_cas03", "Al De Baran";
+ end;
+OnRecvCastleA03:
+ if (GetCastleData("aldeg_cas03.gat",9) < 1) disablenpc "Kafra Service#A03";
+ end;
+}
+
+// Castle 4 ===============================================
+aldeg_cas04.gat,45,88,0 script Kafra Service#A04 117,{
+ callfunc "F_GKafra", "aldeg_cas04", "Al De Baran";
+ end;
+OnRecvCastleA04:
+ if (GetCastleData("aldeg_cas04.gat",9) < 1) disablenpc "Kafra Service#A04";
+ end;
+}
+
+// Castle 5 ===============================================
+aldeg_cas05.gat,31,190,0 script Kafra Service#A05 117,{
+ callfunc "F_GKafra", "aldeg_cas05", "Al De Baran";
+ end;
+OnRecvCastleA05:
+ if (GetCastleData("aldeg_cas05.gat",9) < 1) disablenpc "Kafra Service#A05";
+ end;
+}
diff --git a/npc/guild/aldeg/aldeg_managers.txt b/npc/guild/aldeg/aldeg_managers.txt
index 96b0ab631..e84de6d3f 100644
--- a/npc/guild/aldeg/aldeg_managers.txt
+++ b/npc/guild/aldeg/aldeg_managers.txt
@@ -1,111 +1,111 @@
-//===== eAthena Script =======================================
-//= War of Emperium Managers for Al De Baran Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//= 1.3 Removed Duplicates [Silent]
-//============================================================
-
-
-// Castle 1 ==================================================================================
-aldeg_cas01.gat,218,175,0 script Arl Fredo 55,{
-
- if(callfunc("F_GldManager","Arl Fredo","aldeg_cas01",119,223,"A01") == 0) close;
-
- if(@GDnum==10) guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
- if(@GDnum==11) guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
- if(@GDnum==12) guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
- if(@GDnum==13) guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
- if(@GDnum==14) guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
- if(@GDnum==15) guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
- if(@GDnum==16) guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
- if(@GDnum==17) guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
- mes "[Arl Fredo]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 2 ==================================================================================
-aldeg_cas02.gat,78,74,0 script Chen Lee#01 55,{
-
- if(callfunc("F_GldManager","Chen Lee","aldeg_cas02",135,231,"A02") == 0) close;
-
- if(@GDnum==10) guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
- if(@GDnum==11) guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
- if(@GDnum==12) guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
- if(@GDnum==13) guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
- if(@GDnum==14) guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
- if(@GDnum==15) guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
- if(@GDnum==16) guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
- if(@GDnum==17) guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
- mes "[ Chen Lee ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 3 ==================================================================================
-aldeg_cas03.gat,110,118,0 script Chen Lee#02 55,{
-
- if(callfunc("F_GldManager","Chen Lee","aldeg_cas03",225,269,"A03") == 0) close;
-
- if(@GDnum==10) guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
- if(@GDnum==11) guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
- if(@GDnum==12) guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
- if(@GDnum==13) guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
- if(@GDnum==14) guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
- if(@GDnum==15) guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
- if(@GDnum==16) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
- if(@GDnum==17) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
- mes "[ Chen Lee ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 4 ==================================================================================
-aldeg_cas04.gat,53,89,0 script Brimhemsen#01 55,{
-//aldeg_cas04.gat,67,116,0 script Brimhemsen 55,{
-
- if(callfunc("F_GldManager","Brimhemsen","aldeg_cas04",85,12,"A04") == 0) close;
-
- if(@GDnum==10) guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
- if(@GDnum==11) guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
- if(@GDnum==12) guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
- if(@GDnum==13) guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
- if(@GDnum==14) guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
- if(@GDnum==15) guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
- if(@GDnum==16) guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
- if(@GDnum==17) guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
- mes "[ Brimhemsen ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 5 ==================================================================================
-aldeg_cas05.gat,52,179,0 script Brimhemsen#02 55,{
-
- if(callfunc("F_GldManager","Brimhemsen","aldeg_cas05",66,11,"A05") == 0) close;
-
- if(@GDnum==10) guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
- if(@GDnum==11) guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
- if(@GDnum==12) guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
- if(@GDnum==13) guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
- if(@GDnum==14) guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
- if(@GDnum==15) guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
- if(@GDnum==16) guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
- if(@GDnum==17) guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
- mes "[ Brimhemsen ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Managers for Al De Baran Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//= 1.3 Removed Duplicates [Silent]
+//============================================================
+
+
+// Castle 1 ==================================================================================
+aldeg_cas01.gat,218,175,0 script Arl Fredo 55,{
+
+ if(callfunc("F_GldManager","Arl Fredo","aldeg_cas01",119,223,"A01") == 0) close;
+
+ if(@GDnum==10) guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
+ mes "[Arl Fredo]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 2 ==================================================================================
+aldeg_cas02.gat,78,74,0 script Chen Lee#01 55,{
+
+ if(callfunc("F_GldManager","Chen Lee","aldeg_cas02",135,231,"A02") == 0) close;
+
+ if(@GDnum==10) guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
+ if(@GDnum==11) guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
+ mes "[ Chen Lee ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 3 ==================================================================================
+aldeg_cas03.gat,110,118,0 script Chen Lee#02 55,{
+
+ if(callfunc("F_GldManager","Chen Lee","aldeg_cas03",225,269,"A03") == 0) close;
+
+ if(@GDnum==10) guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
+ mes "[ Chen Lee ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 4 ==================================================================================
+aldeg_cas04.gat,53,89,0 script Brimhemsen#01 55,{
+//aldeg_cas04.gat,67,116,0 script Brimhemsen 55,{
+
+ if(callfunc("F_GldManager","Brimhemsen","aldeg_cas04",85,12,"A04") == 0) close;
+
+ if(@GDnum==10) guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
+ mes "[ Brimhemsen ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 5 ==================================================================================
+aldeg_cas05.gat,52,179,0 script Brimhemsen#02 55,{
+
+ if(callfunc("F_GldManager","Brimhemsen","aldeg_cas05",66,11,"A05") == 0) close;
+
+ if(@GDnum==10) guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
+ mes "[ Brimhemsen ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
diff --git a/npc/guild/aldeg/aldeg_treas.txt b/npc/guild/aldeg/aldeg_treas.txt
index e273a8171..cd0ca567b 100644
--- a/npc/guild/aldeg/aldeg_treas.txt
+++ b/npc/guild/aldeg/aldeg_treas.txt
@@ -1,141 +1,141 @@
-//===== eAthena Script =======================================
-//= War of Emperium Treasure Rooms for Al De Baran Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-//<=============================== Castle 1 =================================>\\
-
-// Treasure Spawn -----------------------
-aldeg_cas01.gat,1,1,1 script Treasure_A01 -1,{
-
-OnRecvCastleA01:
- end;
-OnInit:
- if($boxNumA01 == 0) end;
- set $@bxA01, $boxNumA01;
- callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,1;
- end;
-
-OnDied:
- mapannounce "aldeg_cas01.gat","Treasure Chest Broken Open",17;
- set $boxNumA01, $boxNumA01 -1;
- if($boxNumA01 == 0) mapannounce "aldeg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch --------------------
-aldeg_cas01.gat,123,223,0 script Switch#TresA01 111,{
- callfunc "F_GldTreasSw", "aldeg_cas01",218,176;
- end;
-}
-
-//<================================ Castle 2 ================================>\\
-
-// Treasure Spawn ----------------------------
-aldeg_cas02.gat,1,1,1 script Treasure_A02 -1,{
-
-OnRecvCastleA02:
- end;
-OnInit:
- if($boxNumA02 == 0) end;
- set $@bxA02, $boxNumA02;
- callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,1;
- end;
-
-OnDied:
- mapannounce "aldeg_cas02.gat","Treasure Chest Broken Open",17;
- set $boxNumA02, $boxNumA02 -1;
- if($boxNumA02 == 0) mapannounce "aldeg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------
-aldeg_cas02.gat,139,235,0 script Switch#TresA02 111,{
- callfunc "F_GldTreasSw", "aldeg_cas02",78,75;
-}
-
-//<================================ Castle 3 ================================>\\
-
-// Treasure Spawn ---------------------------
-aldeg_cas03.gat,1,1,1 script Treasure_A03 -1,{
-
-OnRecvCastleA03:
- end;
-OnInit:
- if($boxNumA03 == 0) end;
- set $@bxA03, $boxNumA03;
- callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,1;
- end;
-
-OnDied:
- mapannounce "aldeg_cas03.gat","Treasure Chest Broken Open",17;
- set $boxNumA03, $boxNumA03 -1;
- if($boxNumA03 == 0) mapannounce "aldeg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch -----------------------
-aldeg_cas03.gat,229,267,0 script Switch#TresA03 111,{
- callfunc "F_GldTreasSw", "aldeg_cas03",110,119;
-}
-
-//<================================ Castle 4 ================================>\\
-
-// Treasure Spawn -------------------------------
-aldeg_cas04.gat,1,1,1 script Treasure_A04 -1,{
-
-OnRecvCastleA04:
- end;
-OnInit:
- if($boxNumA04 == 0) end;
- set $@bxA04, $boxNumA04;
- callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,1;
- end;
-
-OnDied:
- mapannounce "aldeg_cas04.gat","Treasure Chest Broken Open",17;
- set $boxNumA04, $boxNumA04 -1;
- if($boxNumA04 == 0) mapannounce "aldeg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-
-}
-// Treasure Room Switch -------------------------
-aldeg_cas04.gat,83,17,0 script Switch#TresA04 111,{
- callfunc "F_GldTreasSw", "aldeg_cas04",67,117;
-}
-
-//<================================ Castle 5 ================================>\\
-
-// Treasure Spawn ------------------------------------
-aldeg_cas05.gat,1,1,1 script Treasure_A05 -1,{
-
-OnRecvCastleA05:
- end;
-OnInit:
- if($boxNumA05 == 0) end;
- set $@bxA05, $boxNumA05;
- callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,1;
- end;
-
-OnDied:
- mapannounce "aldeg_cas05.gat","Treasure Chest Broken Open",17;
- set $boxNumA05, $boxNumA05 -1;
- if($boxNumA05 == 0) mapannounce "aldeg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ---------------------------------
-aldeg_cas05.gat,64,8,0 script Switch#TresA05 111,{
- callfunc "F_GldTreasSw", "aldeg_cas05",51,179;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Treasure Rooms for Al De Baran Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+//<=============================== Castle 1 =================================>\\
+
+// Treasure Spawn -----------------------
+aldeg_cas01.gat,1,1,1 script Treasure_A01 -1,{
+
+OnRecvCastleA01:
+ end;
+OnInit:
+ if($boxNumA01 == 0) end;
+ set $@bxA01, $boxNumA01;
+ callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,1;
+ end;
+
+OnDied:
+ mapannounce "aldeg_cas01.gat","Treasure Chest Broken Open",17;
+ set $boxNumA01, $boxNumA01 -1;
+ if($boxNumA01 == 0) mapannounce "aldeg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch --------------------
+aldeg_cas01.gat,123,223,0 script Switch#TresA01 111,{
+ callfunc "F_GldTreasSw", "aldeg_cas01",218,176;
+ end;
+}
+
+//<================================ Castle 2 ================================>\\
+
+// Treasure Spawn ----------------------------
+aldeg_cas02.gat,1,1,1 script Treasure_A02 -1,{
+
+OnRecvCastleA02:
+ end;
+OnInit:
+ if($boxNumA02 == 0) end;
+ set $@bxA02, $boxNumA02;
+ callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,1;
+ end;
+
+OnDied:
+ mapannounce "aldeg_cas02.gat","Treasure Chest Broken Open",17;
+ set $boxNumA02, $boxNumA02 -1;
+ if($boxNumA02 == 0) mapannounce "aldeg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------
+aldeg_cas02.gat,139,235,0 script Switch#TresA02 111,{
+ callfunc "F_GldTreasSw", "aldeg_cas02",78,75;
+}
+
+//<================================ Castle 3 ================================>\\
+
+// Treasure Spawn ---------------------------
+aldeg_cas03.gat,1,1,1 script Treasure_A03 -1,{
+
+OnRecvCastleA03:
+ end;
+OnInit:
+ if($boxNumA03 == 0) end;
+ set $@bxA03, $boxNumA03;
+ callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,1;
+ end;
+
+OnDied:
+ mapannounce "aldeg_cas03.gat","Treasure Chest Broken Open",17;
+ set $boxNumA03, $boxNumA03 -1;
+ if($boxNumA03 == 0) mapannounce "aldeg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch -----------------------
+aldeg_cas03.gat,229,267,0 script Switch#TresA03 111,{
+ callfunc "F_GldTreasSw", "aldeg_cas03",110,119;
+}
+
+//<================================ Castle 4 ================================>\\
+
+// Treasure Spawn -------------------------------
+aldeg_cas04.gat,1,1,1 script Treasure_A04 -1,{
+
+OnRecvCastleA04:
+ end;
+OnInit:
+ if($boxNumA04 == 0) end;
+ set $@bxA04, $boxNumA04;
+ callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,1;
+ end;
+
+OnDied:
+ mapannounce "aldeg_cas04.gat","Treasure Chest Broken Open",17;
+ set $boxNumA04, $boxNumA04 -1;
+ if($boxNumA04 == 0) mapannounce "aldeg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+
+}
+// Treasure Room Switch -------------------------
+aldeg_cas04.gat,83,17,0 script Switch#TresA04 111,{
+ callfunc "F_GldTreasSw", "aldeg_cas04",67,117;
+}
+
+//<================================ Castle 5 ================================>\\
+
+// Treasure Spawn ------------------------------------
+aldeg_cas05.gat,1,1,1 script Treasure_A05 -1,{
+
+OnRecvCastleA05:
+ end;
+OnInit:
+ if($boxNumA05 == 0) end;
+ set $@bxA05, $boxNumA05;
+ callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,1;
+ end;
+
+OnDied:
+ mapannounce "aldeg_cas05.gat","Treasure Chest Broken Open",17;
+ set $boxNumA05, $boxNumA05 -1;
+ if($boxNumA05 == 0) mapannounce "aldeg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ---------------------------------
+aldeg_cas05.gat,64,8,0 script Switch#TresA05 111,{
+ callfunc "F_GldTreasSw", "aldeg_cas05",51,179;
+}
diff --git a/npc/guild/ev_agit_event.txt b/npc/guild/ev_agit_event.txt
index a83cb843a..d69791684 100644
--- a/npc/guild/ev_agit_event.txt
+++ b/npc/guild/ev_agit_event.txt
@@ -1,138 +1,138 @@
-//===== eAthena Script =======================================
-//= War of Emperium - WoE Auto-Start
-//===== By: ==================================================
-//= kalen (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.5a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Auto Start for War of Emperium
-//=============================================
-//= gettime(3): Gets hour (24 hour time)
-//= gettime(4): Gets day of week 1=Monday, 2=Tuesday,
-//= 3=Wednesday, 4=Thursday, etc.
-//===== Additional Comments: =================================
-//= v1.1a changed OnInit to OnAgitInit.[kobra_k88]
-//= v1.2 added gettime checks. removed $AgitStarted var.[kobra_k88]
-//= v1.3 Moved treasure spawn time here.[kobra_k88]
-//= v1.3a Implemented Shadowlady's idea to allow for different
-//= start/stop times on different days.[kobra_k88]
-//= 1.4 Fixed treasure chests spawn! We had to unroll some loops
-//= Now they appear in castles from 00:01 to 00:24. [Lupus]
-//= 1.5 Fixed WOE end messages on non-WOE days, by Avaj
-//= 1.5a missing tabs [KarLaeda]
-//============================================================
-//| To know how to set up WoE times, go to doc\woe_time_explanation.txt
-// WoE Start/Stop times
-//======================================
-- script Agit_Event -1,{
- end;
-
-OnClock2100: //start time for Tues(2), Thurs(4)
-OnClock2300: //end time for Tues(2), Thurs(4)
-OnClock1600: //start time for Sat(6)
-OnClock1800: //end time for Sat(6)
-
-OnAgitInit:
-// starting time checks
-if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
-if((gettime(4)==4) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
-if((gettime(4)==6) && (gettime(3)>=16 && gettime(3)<18)) goto L_Start;
-
-// end time checks
-if((gettime(4)==2) && (gettime(3)==23)) goto L_End;
-if((gettime(4)==4) && (gettime(3)==23)) goto L_End;
-if((gettime(4)==6) && (gettime(3)==18)) goto L_End;
- end;
-
-L_End:
-Announce "The War Of Emperium is over!",8;
-AgitEnd;
-end;
-
-L_Start:
- Announce "The War Of Emperium has begun!",8;
- AgitStart;
- end;
-}
-
-// Treasure Spawn Time
-//========================================
-- script TreasSpawn -1,{
- end;
-
-OnClock0001:
- callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,0;
- end;
-OnClock0002:
- callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,0;
- end;
-OnClock0003:
- callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,0;
- end;
-OnClock0004:
- callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,0;
- end;
-OnClock0005:
- callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,0;
- end;
-OnClock0006:
- callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,0;
- end;
-OnClock0007:
- callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,0;
- end;
-OnClock0008:
- callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,0;
- end;
-OnClock0009:
- callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,0;
- end;
-OnClock0010:
- callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,0;
- end;
-OnClock0011:
- callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,0;
- end;
-OnClock0012:
- callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,0;
- end;
-OnClock0013:
- callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,0;
- end;
-OnClock0014:
- callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,0;
- end;
-OnClock0015:
- callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,0;
- end;
-OnClock0016:
- callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,0;
- end;
-OnClock0017:
- callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,0;
- end;
-OnClock0018:
- callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,0;
- end;
-OnClock0019:
- callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,0;
- end;
-OnClock0020:
- callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,0;
- end;
-OnClock0021:
- callfunc "F_GldTreas","nguild_alde","N01",$boxNumN01,$@bxN01,$@boxIdN01,1324,114,218,123,227,0;
- end;
-OnClock0022:
- callfunc "F_GldTreas","nguild_gef","N02",$boxNumN02,$@bxN02,$@boxIdN02,1334,150,108,158,114,0;
- end;
-OnClock0023:
- callfunc "F_GldTreas","nguild_pay","N03",$boxNumN03,$@bxN03,$@boxIdN03,1344,286,4,295,13,0;
- end;
-OnClock0024:
- callfunc "F_GldTreas","nguild_prt","N04",$boxNumN04,$@bxN04,$@boxIdN04,1354,6,204,15,213,0;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - WoE Auto-Start
+//===== By: ==================================================
+//= kalen (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.5a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Auto Start for War of Emperium
+//=============================================
+//= gettime(3): Gets hour (24 hour time)
+//= gettime(4): Gets day of week 1=Monday, 2=Tuesday,
+//= 3=Wednesday, 4=Thursday, etc.
+//===== Additional Comments: =================================
+//= v1.1a changed OnInit to OnAgitInit.[kobra_k88]
+//= v1.2 added gettime checks. removed $AgitStarted var.[kobra_k88]
+//= v1.3 Moved treasure spawn time here.[kobra_k88]
+//= v1.3a Implemented Shadowlady's idea to allow for different
+//= start/stop times on different days.[kobra_k88]
+//= 1.4 Fixed treasure chests spawn! We had to unroll some loops
+//= Now they appear in castles from 00:01 to 00:24. [Lupus]
+//= 1.5 Fixed WOE end messages on non-WOE days, by Avaj
+//= 1.5a missing tabs [KarLaeda]
+//============================================================
+//| To know how to set up WoE times, go to doc\woe_time_explanation.txt
+// WoE Start/Stop times
+//======================================
+- script Agit_Event -1,{
+ end;
+
+OnClock2100: //start time for Tues(2), Thurs(4)
+OnClock2300: //end time for Tues(2), Thurs(4)
+OnClock1600: //start time for Sat(6)
+OnClock1800: //end time for Sat(6)
+
+OnAgitInit:
+// starting time checks
+if((gettime(4)==2) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
+if((gettime(4)==4) && (gettime(3)>=21 && gettime(3)<23)) goto L_Start;
+if((gettime(4)==6) && (gettime(3)>=16 && gettime(3)<18)) goto L_Start;
+
+// end time checks
+if((gettime(4)==2) && (gettime(3)==23)) goto L_End;
+if((gettime(4)==4) && (gettime(3)==23)) goto L_End;
+if((gettime(4)==6) && (gettime(3)==18)) goto L_End;
+ end;
+
+L_End:
+Announce "The War Of Emperium is over!",8;
+AgitEnd;
+end;
+
+L_Start:
+ Announce "The War Of Emperium has begun!",8;
+ AgitStart;
+ end;
+}
+
+// Treasure Spawn Time
+//========================================
+- script TreasSpawn -1,{
+ end;
+
+OnClock0001:
+ callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,0;
+ end;
+OnClock0002:
+ callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,0;
+ end;
+OnClock0003:
+ callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,0;
+ end;
+OnClock0004:
+ callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,0;
+ end;
+OnClock0005:
+ callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,0;
+ end;
+OnClock0006:
+ callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,0;
+ end;
+OnClock0007:
+ callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,0;
+ end;
+OnClock0008:
+ callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,0;
+ end;
+OnClock0009:
+ callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,0;
+ end;
+OnClock0010:
+ callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,0;
+ end;
+OnClock0011:
+ callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,0;
+ end;
+OnClock0012:
+ callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,0;
+ end;
+OnClock0013:
+ callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,0;
+ end;
+OnClock0014:
+ callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,0;
+ end;
+OnClock0015:
+ callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,0;
+ end;
+OnClock0016:
+ callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,0;
+ end;
+OnClock0017:
+ callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,0;
+ end;
+OnClock0018:
+ callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,0;
+ end;
+OnClock0019:
+ callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,0;
+ end;
+OnClock0020:
+ callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,0;
+ end;
+OnClock0021:
+ callfunc "F_GldTreas","nguild_alde","N01",$boxNumN01,$@bxN01,$@boxIdN01,1324,114,218,123,227,0;
+ end;
+OnClock0022:
+ callfunc "F_GldTreas","nguild_gef","N02",$boxNumN02,$@bxN02,$@boxIdN02,1334,150,108,158,114,0;
+ end;
+OnClock0023:
+ callfunc "F_GldTreas","nguild_pay","N03",$boxNumN03,$@bxN03,$@boxIdN03,1344,286,4,295,13,0;
+ end;
+OnClock0024:
+ callfunc "F_GldTreas","nguild_prt","N04",$boxNumN04,$@bxN04,$@boxIdN04,1354,6,204,15,213,0;
+ end;
+}
diff --git a/npc/guild/gefg/gefg_dunsw.txt b/npc/guild/gefg/gefg_dunsw.txt
index f7f794fd2..f64c64541 100644
--- a/npc/guild/gefg/gefg_dunsw.txt
+++ b/npc/guild/gefg/gefg_dunsw.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for Geffen Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to the guild dungeon
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ================================================
-gefg_cas01.gat,78,84,0 script Switch#DunG01 111,{
- callfunc "F_GldDunSw","gefg_cas01","04",39,258;
- close;
-}
-
-
-// Castle 2 ================================================
-gefg_cas02.gat,167,40,0 script Switch#DunG02 111,{
- callfunc "F_GldDunSw","gefg_cas02","04",125,270;
- close;
-}
-
-
-// Castle 3 ================================================
-gefg_cas03.gat,221,43,0 script Switch#DunG03 111,{
- callfunc "F_GldDunSw","gefg_cas03","04",268,251;
- close;
-}
-
-
-// Castle 4 ================================================
-gefg_cas04.gat,58,75,0 script Switch#DunG04 111,{
- callfunc "F_GldDunSw","gefg_cas04","04",268,108;
- close;
-}
-
-
-// Castle 5 ================================================
-gefg_cas05.gat,66,29,0 script Switch#DunG05 111,{
- callfunc "F_GldDunSw","gefg_cas05","04",230,35;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Dungeon Switch for Geffen Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to the guild dungeon
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ================================================
+gefg_cas01.gat,78,84,0 script Switch#DunG01 111,{
+ callfunc "F_GldDunSw","gefg_cas01","04",39,258;
+ close;
+}
+
+
+// Castle 2 ================================================
+gefg_cas02.gat,167,40,0 script Switch#DunG02 111,{
+ callfunc "F_GldDunSw","gefg_cas02","04",125,270;
+ close;
+}
+
+
+// Castle 3 ================================================
+gefg_cas03.gat,221,43,0 script Switch#DunG03 111,{
+ callfunc "F_GldDunSw","gefg_cas03","04",268,251;
+ close;
+}
+
+
+// Castle 4 ================================================
+gefg_cas04.gat,58,75,0 script Switch#DunG04 111,{
+ callfunc "F_GldDunSw","gefg_cas04","04",268,108;
+ close;
+}
+
+
+// Castle 5 ================================================
+gefg_cas05.gat,66,29,0 script Switch#DunG05 111,{
+ callfunc "F_GldDunSw","gefg_cas05","04",230,35;
+ close;
+}
diff --git a/npc/guild/gefg/gefg_ev_agit.txt b/npc/guild/gefg/gefg_ev_agit.txt
index 26955818e..b8c375e6f 100644
--- a/npc/guild/gefg/gefg_ev_agit.txt
+++ b/npc/guild/gefg/gefg_ev_agit.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Geffen Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Geffen Guild Wars
-//===== Additional Comments: =================================
-//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//============================================================
-
-
-// Castle 1 ================================================================
-gefg_cas01.gat,198,182,0 script Agit_G01 -1,{
-OnInterIfInitOnce:
- GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
- end;
-OnRecvCastleG01:
- RequestGuildInfo GetCastleData("gefg_cas01.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","gefg_cas01","G01",198,182;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","gefg_cas01","G01";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","gefg_cas01","G01";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),6;
- Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_G01::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","gefg_cas01","G01";
- end;
-}
-
-// Castle 2 ================================================================
-gefg_cas02.gat,176,178,0 script Agit_G02 -1,{
-OnInterIfInitOnce:
- GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
- end;
-OnRecvCastleG02:
- RequestGuildInfo GetCastleData("gefg_cas02.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","gefg_cas02","G02",176,178;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","gefg_cas02","G02";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","gefg_cas02","G02";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),6;
- Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_G02::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","gefg_cas02","G02";
- end;
-}
-
-// Castle 3 ================================================================
-gefg_cas03.gat,245,167,0 script Agit_G03 -1,{
-OnInterIfInitOnce:
- GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
- end;
-OnRecvCastleG03:
- RequestGuildInfo GetCastleData("gefg_cas03.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","gefg_cas03","G03",245,167;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","gefg_cas03","G03";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","gefg_cas03","G03";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),6;
- Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_G03::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","gefg_cas03","G03";
- end;
-}
-
-// Castle 4 ================================================================
-gefg_cas04.gat,174,178,0 script Agit_G04 -1,{
-OnInterIfInitOnce:
- GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
- end;
-OnRecvCastleG04:
- RequestGuildInfo GetCastleData("gefg_cas04.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","gefg_cas04","G04",174,178;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","gefg_cas04","G04";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","gefg_cas04","G04";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),6;
- Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_G04::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","gefg_cas04","G04";
- end;
-}
-
-// Castle 5 ================================================================
-gefg_cas05.gat,194,184,0 script Agit_G05 -1,{
-OnInterIfInitOnce:
- GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
- end;
-OnRecvCastleG05:
- RequestGuildInfo GetCastleData("gefg_cas05.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","gefg_cas05","G05",194,184;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","gefg_cas05","G05";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","gefg_cas05","G05";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),6;
- Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_G05::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","gefg_cas05","G05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - Geffen Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Geffen Guild Wars
+//===== Additional Comments: =================================
+//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//============================================================
+
+
+// Castle 1 ================================================================
+gefg_cas01.gat,198,182,0 script Agit_G01 -1,{
+OnInterIfInitOnce:
+ GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
+ end;
+OnRecvCastleG01:
+ RequestGuildInfo GetCastleData("gefg_cas01.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","gefg_cas01","G01",198,182;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","gefg_cas01","G01";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","gefg_cas01","G01";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),6;
+ Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_G01::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","gefg_cas01","G01";
+ end;
+}
+
+// Castle 2 ================================================================
+gefg_cas02.gat,176,178,0 script Agit_G02 -1,{
+OnInterIfInitOnce:
+ GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
+ end;
+OnRecvCastleG02:
+ RequestGuildInfo GetCastleData("gefg_cas02.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","gefg_cas02","G02",176,178;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","gefg_cas02","G02";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","gefg_cas02","G02";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),6;
+ Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_G02::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","gefg_cas02","G02";
+ end;
+}
+
+// Castle 3 ================================================================
+gefg_cas03.gat,245,167,0 script Agit_G03 -1,{
+OnInterIfInitOnce:
+ GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
+ end;
+OnRecvCastleG03:
+ RequestGuildInfo GetCastleData("gefg_cas03.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","gefg_cas03","G03",245,167;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","gefg_cas03","G03";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","gefg_cas03","G03";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),6;
+ Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_G03::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","gefg_cas03","G03";
+ end;
+}
+
+// Castle 4 ================================================================
+gefg_cas04.gat,174,178,0 script Agit_G04 -1,{
+OnInterIfInitOnce:
+ GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
+ end;
+OnRecvCastleG04:
+ RequestGuildInfo GetCastleData("gefg_cas04.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","gefg_cas04","G04",174,178;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","gefg_cas04","G04";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","gefg_cas04","G04";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),6;
+ Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_G04::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","gefg_cas04","G04";
+ end;
+}
+
+// Castle 5 ================================================================
+gefg_cas05.gat,194,184,0 script Agit_G05 -1,{
+OnInterIfInitOnce:
+ GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
+ end;
+OnRecvCastleG05:
+ RequestGuildInfo GetCastleData("gefg_cas05.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","gefg_cas05","G05",194,184;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","gefg_cas05","G05";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","gefg_cas05","G05";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),6;
+ Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_G05::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","gefg_cas05","G05";
+ end;
+}
diff --git a/npc/guild/gefg/gefg_flags.txt b/npc/guild/gefg/gefg_flags.txt
index a34ef972f..479260785 100644
--- a/npc/guild/gefg/gefg_flags.txt
+++ b/npc/guild/gefg/gefg_flags.txt
@@ -1,192 +1,192 @@
-//===== eAthena Script =======================================
-//= War of Emperium Geffen Guild Flags
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= WoE flag scripts. Display guild emblems on flags.
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//= v1.3 Changed to iRO castle names [DracoRPG]
-//= v1.4 Can now only flag in from outside the castle [Kayla]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-geffen.gat,109,123,2 script Repherion#g1-1::Repherion 722,{
- callfunc "F_Flags","Geffen","gefg_cas01",83,47,0;
- close;
-
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- end;
-}
-
-gef_fild13.gat,148,51,5 script Repherion#g1-2::Repherion2 722,{
- callfunc "F_Flags","Geffen","gefg_cas01",83,47,1;
- close;
-
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- end;
-}
-
-// In Guild ===============================================
-gef_fild13.gat,155,54,5 duplicate(Repherion2) Repherion#g1-3 722
-gef_fild13.gat,212,79,6 duplicate(Repherion2) Repherion#g1-4 722
-gef_fild13.gat,211,71,6 duplicate(Repherion2) Repherion#g1-5 722
-// In Castle =============================================
-gefg_cas01.gat,28,157,4 duplicate(Repherion) Repherion#g1-6 722
-gefg_cas01.gat,32,157,4 duplicate(Repherion) Repherion#g1-7 722
-gefg_cas01.gat,22,156,5 duplicate(Repherion) Repherion#g1-8 722
-gefg_cas01.gat,68,185,3 duplicate(Repherion) Repherion#g1-9 722
-gefg_cas01.gat,17,171,5 duplicate(Repherion) Repherion#g1-10 722
-gefg_cas01.gat,59,16,4 duplicate(Repherion) Repherion#g1-11 722
-gefg_cas01.gat,64,16,4 duplicate(Repherion) Repherion#g1-12 722
-
-
-
-//===================================================================================//
-// Castle 2
-//===================================================================================//
-geffen.gat,113,130,1 script Eeyolbriggar#g2-1::Eeyolbriggar 722,{
- callfunc "F_Flags","Geffen","gefg_cas02",23,66,0;
- close;
-
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- end;
-}
-
-gef_fild13.gat,303,243,4 script Eeyolbriggar#g2-2::Eeyolbriggar2 722,{
- callfunc "F_Flags","Geffen","gefg_cas02",23,66,1;
- close;
-
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- end;
-}
-// In Guild ==============================================
-gef_fild13.gat,312,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-3 722
-gef_fild13.gat,290,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-4 722
-gef_fild13.gat,324,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-5 722
-// In Castle ============================================
-gefg_cas02.gat,65,130,5 duplicate(Eeyolbriggar) Eeyolbriggar#g2-6 722
-gefg_cas02.gat,30,123,5 duplicate(Eeyolbriggar) Eeyolbriggar#g2-7 722
-gefg_cas02.gat,65,139,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-8 722
-gefg_cas02.gat,37,177,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-9 722
-gefg_cas02.gat,37,168,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-10 722
-gefg_cas02.gat,68,47,2 duplicate(Eeyolbriggar) Eeyolbriggar#g2-11 722
-gefg_cas02.gat,68,36,2 duplicate(Eeyolbriggar) Eeyolbriggar#g2-12 722
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-geffen.gat,120,132,8 script Yesnelph#g3-1::Yesnelph 722,{
- callfunc "F_Flags","Geffen","gefg_cas03",116,89,0;
- close;
-
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- end;
-}
-
-gef_fild13.gat,78,182,4 script Yesnelph#g3-2::Yesnelph2 722,{
- callfunc "F_Flags","Geffen","gefg_cas03",116,89,1;
- close;
-
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,87,182,4 duplicate(Yesnelph2) Yesnelph#g3-3 722
-gef_fild13.gat,73,295,7 duplicate(Yesnelph2) Yesnelph#g3-4 722
-gef_fild13.gat,113,274,7 duplicate(Yesnelph2) Yesnelph#g3-5 722
-gef_fild13.gat,144,235,6 duplicate(Yesnelph2) Yesnelph#g3-6 722
-gef_fild13.gat,144,244,6 duplicate(Yesnelph2) Yesnelph#g3-7 722
-// In Castle =============================================
-gefg_cas03.gat,122,220,6 duplicate(Yesnelph) Yesnelph#g3-8 722
-gefg_cas03.gat,122,229,6 duplicate(Yesnelph) Yesnelph#g3-9 722
-gefg_cas03.gat,91,257,7 duplicate(Yesnelph) Yesnelph#g3-10 722
-gefg_cas03.gat,52,276,7 duplicate(Yesnelph) Yesnelph#g3-11 722
-gefg_cas03.gat,56,164,4 duplicate(Yesnelph) Yesnelph#g3-12 722
-gefg_cas03.gat,65,164,4 duplicate(Yesnelph) Yesnelph#g3-13 722
-gefg_cas03.gat,37,214,1 duplicate(Yesnelph) Yesnelph#g3-14 722
-gefg_cas03.gat,34,208,1 duplicate(Yesnelph) Yesnelph#g3-15 722
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-geffen.gat,127,130,7 script Bergel#g4-1::Bergel 722,{
- callfunc "F_Flags","Geffen","gefg_cas04",59,70,0;
- close;
-
-OnRecvCastleG04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- end;
-}
-
-gef_fild13.gat,190,283,3 script Bergel#g4-2::Bergel2 722,{
- callfunc "F_Flags","Geffen","gefg_cas04",59,70,1;
- close;
-
-OnRecvCastleG04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,199,274,3 duplicate(Bergel2) Bergel#g4-3 722
-// In Castle =============================================
-gefg_cas04.gat,24,157,4 duplicate(Bergel) Bergel#g4-4 722
-gefg_cas04.gat,35,158,4 duplicate(Bergel) Bergel#g4-5 722
-gefg_cas04.gat,44,184,4 duplicate(Bergel) Bergel#g4-6 722
-gefg_cas04.gat,51,184,4 duplicate(Bergel) Bergel#g4-7 722
-gefg_cas04.gat,39,212,7 duplicate(Bergel) Bergel#g4-8 722
-gefg_cas04.gat,29,212,1 duplicate(Bergel) Bergel#g4-9 722
-gefg_cas04.gat,24,73,1 duplicate(Bergel) Bergel#g4-10 722
-gefg_cas04.gat,35,73,4 duplicate(Bergel) Bergel#g4-11 722
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-geffen.gat,131,123,6 script Mersetzdeitz#g5-1::Mersetzdeitz 722,{
- callfunc "F_Flags","Geffen","gefg_cas05",61,52,0;
- close;
-
-OnRecvCastleG05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- end;
-}
-
-gef_fild13.gat,302,87,7 script Mersetzdeitz#g5-2::Mersetzdeitz2 722,{
- callfunc "F_Flags","Geffen","gefg_cas05",61,52,1;
- close;
-
-OnRecvCastleG05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,313,83,0 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-3 722
-gef_fild13.gat,252,51,2 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-4 722
-gef_fild13.gat,26,147,2 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-5 722
-// In Castle =============================================
-gefg_cas05.gat,77,185,7 duplicate(Mersetzdeitz) Mersetzdeitz#g5-6 722
-gefg_cas05.gat,92,181,0 duplicate(Mersetzdeitz) Mersetzdeitz#g5-7 722
-gefg_cas05.gat,83,158,1 duplicate(Mersetzdeitz) Mersetzdeitz#g5-8 722
-gefg_cas05.gat,62,144,7 duplicate(Mersetzdeitz) Mersetzdeitz#g5-9 722
-gefg_cas05.gat,62,66,4 duplicate(Mersetzdeitz) Mersetzdeitz#g5-10 722
-gefg_cas05.gat,69,66,4 duplicate(Mersetzdeitz) Mersetzdeitz#g5-11 722
+//===== eAthena Script =======================================
+//= War of Emperium Geffen Guild Flags
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= WoE flag scripts. Display guild emblems on flags.
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//= v1.3 Changed to iRO castle names [DracoRPG]
+//= v1.4 Can now only flag in from outside the castle [Kayla]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+geffen.gat,109,123,2 script Repherion#g1-1::Repherion 722,{
+ callfunc "F_Flags","Geffen","gefg_cas01",83,47,0;
+ close;
+
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ end;
+}
+
+gef_fild13.gat,148,51,5 script Repherion#g1-2::Repherion2 722,{
+ callfunc "F_Flags","Geffen","gefg_cas01",83,47,1;
+ close;
+
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ end;
+}
+
+// In Guild ===============================================
+gef_fild13.gat,155,54,5 duplicate(Repherion2) Repherion#g1-3 722
+gef_fild13.gat,212,79,6 duplicate(Repherion2) Repherion#g1-4 722
+gef_fild13.gat,211,71,6 duplicate(Repherion2) Repherion#g1-5 722
+// In Castle =============================================
+gefg_cas01.gat,28,157,4 duplicate(Repherion) Repherion#g1-6 722
+gefg_cas01.gat,32,157,4 duplicate(Repherion) Repherion#g1-7 722
+gefg_cas01.gat,22,156,5 duplicate(Repherion) Repherion#g1-8 722
+gefg_cas01.gat,68,185,3 duplicate(Repherion) Repherion#g1-9 722
+gefg_cas01.gat,17,171,5 duplicate(Repherion) Repherion#g1-10 722
+gefg_cas01.gat,59,16,4 duplicate(Repherion) Repherion#g1-11 722
+gefg_cas01.gat,64,16,4 duplicate(Repherion) Repherion#g1-12 722
+
+
+
+//===================================================================================//
+// Castle 2
+//===================================================================================//
+geffen.gat,113,130,1 script Eeyolbriggar#g2-1::Eeyolbriggar 722,{
+ callfunc "F_Flags","Geffen","gefg_cas02",23,66,0;
+ close;
+
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ end;
+}
+
+gef_fild13.gat,303,243,4 script Eeyolbriggar#g2-2::Eeyolbriggar2 722,{
+ callfunc "F_Flags","Geffen","gefg_cas02",23,66,1;
+ close;
+
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ end;
+}
+// In Guild ==============================================
+gef_fild13.gat,312,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-3 722
+gef_fild13.gat,290,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-4 722
+gef_fild13.gat,324,243,4 duplicate(Eeyolbriggar2) Eeyolbriggar#g2-5 722
+// In Castle ============================================
+gefg_cas02.gat,65,130,5 duplicate(Eeyolbriggar) Eeyolbriggar#g2-6 722
+gefg_cas02.gat,30,123,5 duplicate(Eeyolbriggar) Eeyolbriggar#g2-7 722
+gefg_cas02.gat,65,139,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-8 722
+gefg_cas02.gat,37,177,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-9 722
+gefg_cas02.gat,37,168,6 duplicate(Eeyolbriggar) Eeyolbriggar#g2-10 722
+gefg_cas02.gat,68,47,2 duplicate(Eeyolbriggar) Eeyolbriggar#g2-11 722
+gefg_cas02.gat,68,36,2 duplicate(Eeyolbriggar) Eeyolbriggar#g2-12 722
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+geffen.gat,120,132,8 script Yesnelph#g3-1::Yesnelph 722,{
+ callfunc "F_Flags","Geffen","gefg_cas03",116,89,0;
+ close;
+
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ end;
+}
+
+gef_fild13.gat,78,182,4 script Yesnelph#g3-2::Yesnelph2 722,{
+ callfunc "F_Flags","Geffen","gefg_cas03",116,89,1;
+ close;
+
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,87,182,4 duplicate(Yesnelph2) Yesnelph#g3-3 722
+gef_fild13.gat,73,295,7 duplicate(Yesnelph2) Yesnelph#g3-4 722
+gef_fild13.gat,113,274,7 duplicate(Yesnelph2) Yesnelph#g3-5 722
+gef_fild13.gat,144,235,6 duplicate(Yesnelph2) Yesnelph#g3-6 722
+gef_fild13.gat,144,244,6 duplicate(Yesnelph2) Yesnelph#g3-7 722
+// In Castle =============================================
+gefg_cas03.gat,122,220,6 duplicate(Yesnelph) Yesnelph#g3-8 722
+gefg_cas03.gat,122,229,6 duplicate(Yesnelph) Yesnelph#g3-9 722
+gefg_cas03.gat,91,257,7 duplicate(Yesnelph) Yesnelph#g3-10 722
+gefg_cas03.gat,52,276,7 duplicate(Yesnelph) Yesnelph#g3-11 722
+gefg_cas03.gat,56,164,4 duplicate(Yesnelph) Yesnelph#g3-12 722
+gefg_cas03.gat,65,164,4 duplicate(Yesnelph) Yesnelph#g3-13 722
+gefg_cas03.gat,37,214,1 duplicate(Yesnelph) Yesnelph#g3-14 722
+gefg_cas03.gat,34,208,1 duplicate(Yesnelph) Yesnelph#g3-15 722
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+geffen.gat,127,130,7 script Bergel#g4-1::Bergel 722,{
+ callfunc "F_Flags","Geffen","gefg_cas04",59,70,0;
+ close;
+
+OnRecvCastleG04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ end;
+}
+
+gef_fild13.gat,190,283,3 script Bergel#g4-2::Bergel2 722,{
+ callfunc "F_Flags","Geffen","gefg_cas04",59,70,1;
+ close;
+
+OnRecvCastleG04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,199,274,3 duplicate(Bergel2) Bergel#g4-3 722
+// In Castle =============================================
+gefg_cas04.gat,24,157,4 duplicate(Bergel) Bergel#g4-4 722
+gefg_cas04.gat,35,158,4 duplicate(Bergel) Bergel#g4-5 722
+gefg_cas04.gat,44,184,4 duplicate(Bergel) Bergel#g4-6 722
+gefg_cas04.gat,51,184,4 duplicate(Bergel) Bergel#g4-7 722
+gefg_cas04.gat,39,212,7 duplicate(Bergel) Bergel#g4-8 722
+gefg_cas04.gat,29,212,1 duplicate(Bergel) Bergel#g4-9 722
+gefg_cas04.gat,24,73,1 duplicate(Bergel) Bergel#g4-10 722
+gefg_cas04.gat,35,73,4 duplicate(Bergel) Bergel#g4-11 722
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+geffen.gat,131,123,6 script Mersetzdeitz#g5-1::Mersetzdeitz 722,{
+ callfunc "F_Flags","Geffen","gefg_cas05",61,52,0;
+ close;
+
+OnRecvCastleG05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ end;
+}
+
+gef_fild13.gat,302,87,7 script Mersetzdeitz#g5-2::Mersetzdeitz2 722,{
+ callfunc "F_Flags","Geffen","gefg_cas05",61,52,1;
+ close;
+
+OnRecvCastleG05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,313,83,0 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-3 722
+gef_fild13.gat,252,51,2 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-4 722
+gef_fild13.gat,26,147,2 duplicate(Mersetzdeitz2) Mersetzdeitz#g5-5 722
+// In Castle =============================================
+gefg_cas05.gat,77,185,7 duplicate(Mersetzdeitz) Mersetzdeitz#g5-6 722
+gefg_cas05.gat,92,181,0 duplicate(Mersetzdeitz) Mersetzdeitz#g5-7 722
+gefg_cas05.gat,83,158,1 duplicate(Mersetzdeitz) Mersetzdeitz#g5-8 722
+gefg_cas05.gat,62,144,7 duplicate(Mersetzdeitz) Mersetzdeitz#g5-9 722
+gefg_cas05.gat,62,66,4 duplicate(Mersetzdeitz) Mersetzdeitz#g5-10 722
+gefg_cas05.gat,69,66,4 duplicate(Mersetzdeitz) Mersetzdeitz#g5-11 722
diff --git a/npc/guild/gefg/gefg_guardians.txt b/npc/guild/gefg/gefg_guardians.txt
index 13947fd12..fe3e0958b 100644
--- a/npc/guild/gefg/gefg_guardians.txt
+++ b/npc/guild/gefg/gefg_guardians.txt
@@ -1,108 +1,108 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Re-spawns guardians on server start if they have been
-//= purchased. Also announces when a guardian dies.
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//= 1.2a Guardians for all gefg castles are now in this file.
-//= Minor optimizations.[kobra_k88]
-//============================================================
-
-
-gefg_cas01.gat,198,182,0 script Guardian_G01 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas01.gat",10) == 1) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
- if (GetCastleData("gefg_cas01.gat",11) == 1) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
- if (GetCastleData("gefg_cas01.gat",12) == 1) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
- if (GetCastleData("gefg_cas01.gat",13) == 1) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
- if (GetCastleData("gefg_cas01.gat",14) == 1) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
- if (GetCastleData("gefg_cas01.gat",15) == 1) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
- if (GetCastleData("gefg_cas01.gat",16) == 1) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
- if (GetCastleData("gefg_cas01.gat",17) == 1) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas01.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-gefg_cas02.gat,176,178,0 script Guardian_G02 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas02.gat",10) == 1) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",0;
- if (GetCastleData("gefg_cas02.gat",11) == 1) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",1;
- if (GetCastleData("gefg_cas02.gat",12) == 1) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",2;
- if (GetCastleData("gefg_cas02.gat",13) == 1) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_G02::OnGuardianDied",3;
- if (GetCastleData("gefg_cas02.gat",14) == 1) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_G02::OnGuardianDied",4;
- if (GetCastleData("gefg_cas02.gat",15) == 1) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",5;
- if (GetCastleData("gefg_cas02.gat",16) == 1) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",6;
- if (GetCastleData("gefg_cas02.gat",17) == 1) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas02.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-gefg_cas03.gat,245,167,0 script Guardian_G03 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas03.gat",10) == 1) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",0;
- if (GetCastleData("gefg_cas03.gat",11) == 1) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",1;
- if (GetCastleData("gefg_cas03.gat",12) == 1) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",2;
- if (GetCastleData("gefg_cas03.gat",13) == 1) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",3;
- if (GetCastleData("gefg_cas03.gat",14) == 1) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",4;
- if (GetCastleData("gefg_cas03.gat",15) == 1) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",5;
- if (GetCastleData("gefg_cas03.gat",16) == 1) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",6;
- if (GetCastleData("gefg_cas03.gat",17) == 1) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas03.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-gefg_cas04.gat,174,178,0 script Guardian_G04 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas04.gat",10) == 1) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",0;
- if (GetCastleData("gefg_cas04.gat",11) == 1) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",1;
- if (GetCastleData("gefg_cas04.gat",12) == 1) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",2;
- if (GetCastleData("gefg_cas04.gat",13) == 1) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",3;
- if (GetCastleData("gefg_cas04.gat",14) == 1) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",4;
- if (GetCastleData("gefg_cas04.gat",15) == 1) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",5;
- if (GetCastleData("gefg_cas04.gat",16) == 1) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",6;
- if (GetCastleData("gefg_cas04.gat",17) == 1) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas04.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-gefg_cas05.gat,194,184,0 script Guardian_G05 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas05.gat",10) == 1) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",0;
- if (GetCastleData("gefg_cas05.gat",11) == 1) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",1;
- if (GetCastleData("gefg_cas05.gat",12) == 1) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",2;
- if (GetCastleData("gefg_cas05.gat",13) == 1) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",3;
- if (GetCastleData("gefg_cas05.gat",14) == 1) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",4;
- if (GetCastleData("gefg_cas05.gat",15) == 1) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",5;
- if (GetCastleData("gefg_cas05.gat",16) == 1) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",6;
- if (GetCastleData("gefg_cas05.gat",17) == 1) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas05.gat","A Guardian Has Fallen",17;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Re-spawns guardians on server start if they have been
+//= purchased. Also announces when a guardian dies.
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//= 1.2a Guardians for all gefg castles are now in this file.
+//= Minor optimizations.[kobra_k88]
+//============================================================
+
+
+gefg_cas01.gat,198,182,0 script Guardian_G01 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas01.gat",10) == 1) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
+ if (GetCastleData("gefg_cas01.gat",11) == 1) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
+ if (GetCastleData("gefg_cas01.gat",12) == 1) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
+ if (GetCastleData("gefg_cas01.gat",13) == 1) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
+ if (GetCastleData("gefg_cas01.gat",14) == 1) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
+ if (GetCastleData("gefg_cas01.gat",15) == 1) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
+ if (GetCastleData("gefg_cas01.gat",16) == 1) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
+ if (GetCastleData("gefg_cas01.gat",17) == 1) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas01.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+gefg_cas02.gat,176,178,0 script Guardian_G02 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas02.gat",10) == 1) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",0;
+ if (GetCastleData("gefg_cas02.gat",11) == 1) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",1;
+ if (GetCastleData("gefg_cas02.gat",12) == 1) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_G02::OnGuardianDied",2;
+ if (GetCastleData("gefg_cas02.gat",13) == 1) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_G02::OnGuardianDied",3;
+ if (GetCastleData("gefg_cas02.gat",14) == 1) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_G02::OnGuardianDied",4;
+ if (GetCastleData("gefg_cas02.gat",15) == 1) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",5;
+ if (GetCastleData("gefg_cas02.gat",16) == 1) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",6;
+ if (GetCastleData("gefg_cas02.gat",17) == 1) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_G02::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas02.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+gefg_cas03.gat,245,167,0 script Guardian_G03 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas03.gat",10) == 1) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",0;
+ if (GetCastleData("gefg_cas03.gat",11) == 1) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",1;
+ if (GetCastleData("gefg_cas03.gat",12) == 1) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",2;
+ if (GetCastleData("gefg_cas03.gat",13) == 1) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",3;
+ if (GetCastleData("gefg_cas03.gat",14) == 1) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",4;
+ if (GetCastleData("gefg_cas03.gat",15) == 1) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",5;
+ if (GetCastleData("gefg_cas03.gat",16) == 1) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",6;
+ if (GetCastleData("gefg_cas03.gat",17) == 1) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas03.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+gefg_cas04.gat,174,178,0 script Guardian_G04 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas04.gat",10) == 1) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",0;
+ if (GetCastleData("gefg_cas04.gat",11) == 1) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",1;
+ if (GetCastleData("gefg_cas04.gat",12) == 1) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",2;
+ if (GetCastleData("gefg_cas04.gat",13) == 1) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",3;
+ if (GetCastleData("gefg_cas04.gat",14) == 1) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",4;
+ if (GetCastleData("gefg_cas04.gat",15) == 1) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",5;
+ if (GetCastleData("gefg_cas04.gat",16) == 1) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",6;
+ if (GetCastleData("gefg_cas04.gat",17) == 1) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas04.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+gefg_cas05.gat,194,184,0 script Guardian_G05 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas05.gat",10) == 1) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",0;
+ if (GetCastleData("gefg_cas05.gat",11) == 1) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",1;
+ if (GetCastleData("gefg_cas05.gat",12) == 1) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",2;
+ if (GetCastleData("gefg_cas05.gat",13) == 1) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",3;
+ if (GetCastleData("gefg_cas05.gat",14) == 1) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",4;
+ if (GetCastleData("gefg_cas05.gat",15) == 1) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",5;
+ if (GetCastleData("gefg_cas05.gat",16) == 1) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",6;
+ if (GetCastleData("gefg_cas05.gat",17) == 1) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas05.gat","A Guardian Has Fallen",17;
+ end;
+}
diff --git a/npc/guild/gefg/gefg_kafras.txt b/npc/guild/gefg/gefg_kafras.txt
index 2080fecc4..82daa84cb 100644
--- a/npc/guild/gefg/gefg_kafras.txt
+++ b/npc/guild/gefg/gefg_kafras.txt
@@ -1,66 +1,66 @@
-//===== eAthena Script =======================================
-//= War of Emperium Kafras for Geffen Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Provides Kafra services for guild members of Geffen Castles.
-//= Used in conjuction with function F_Kafra.
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ===============================================
-//gefg_cas01.gat,96,173,0 script Kafra Service#G01 117,{
-gefg_cas01.gat,35,37,0 script Kafra Service#G01 117,{
- callfunc "F_GKafra", "gefg_cas01", "Geffen";
- end;
-OnRecvCastleG01:
- if (GetCastleData("gefg_cas01.gat",9) < 1) disablenpc "Kafra Service#G01";
- end;
-}
-
-
-// Castle 2 ===============================================
-gefg_cas02.gat,23,66,3 script Kafra Service#G02 117,{
- callfunc "F_GKafra", "gefg_cas02", "Geffen";
- end;
-OnRecvCastleG02:
- if (GetCastleData("gefg_cas02.gat",9) < 1) disablenpc "Kafra Service#G02";
- end;
-}
-
-
-// Castle 3 ===============================================
-gefg_cas03.gat,116,89,5 script Kafra Service#G03 117,{
- callfunc "F_GKafra", "gefg_cas03", "Geffen";
- end;
-OnRecvCastleG03:
- if (GetCastleData("gefg_cas03.gat",9) < 1) disablenpc "Kafra Service#G03";
- end;
-}
-
-
-// Castle 4 ===============================================
-gefg_cas04.gat,59,70,3 script Kafra Service#G04 117,{
- callfunc "F_GKafra", "gefg_cas04", "Geffen";
- end;
-OnRecvCastleG04:
- if (GetCastleData("gefg_cas04.gat",9) < 1) disablenpc "Kafra Service#G04";
- end;
-}
-
-
-// Castle 5 ===============================================
-gefg_cas05.gat,61,52,5 script Kafra Service#G05 117,{
- callfunc "F_GKafra", "gefg_cas05", "Geffen";
- end;
-OnRecvCastleG05:
- if (GetCastleData("gefg_cas05.gat",9) < 1) disablenpc "Kafra Service#G05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Kafras for Geffen Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Provides Kafra services for guild members of Geffen Castles.
+//= Used in conjuction with function F_Kafra.
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ===============================================
+//gefg_cas01.gat,96,173,0 script Kafra Service#G01 117,{
+gefg_cas01.gat,35,37,0 script Kafra Service#G01 117,{
+ callfunc "F_GKafra", "gefg_cas01", "Geffen";
+ end;
+OnRecvCastleG01:
+ if (GetCastleData("gefg_cas01.gat",9) < 1) disablenpc "Kafra Service#G01";
+ end;
+}
+
+
+// Castle 2 ===============================================
+gefg_cas02.gat,23,66,3 script Kafra Service#G02 117,{
+ callfunc "F_GKafra", "gefg_cas02", "Geffen";
+ end;
+OnRecvCastleG02:
+ if (GetCastleData("gefg_cas02.gat",9) < 1) disablenpc "Kafra Service#G02";
+ end;
+}
+
+
+// Castle 3 ===============================================
+gefg_cas03.gat,116,89,5 script Kafra Service#G03 117,{
+ callfunc "F_GKafra", "gefg_cas03", "Geffen";
+ end;
+OnRecvCastleG03:
+ if (GetCastleData("gefg_cas03.gat",9) < 1) disablenpc "Kafra Service#G03";
+ end;
+}
+
+
+// Castle 4 ===============================================
+gefg_cas04.gat,59,70,3 script Kafra Service#G04 117,{
+ callfunc "F_GKafra", "gefg_cas04", "Geffen";
+ end;
+OnRecvCastleG04:
+ if (GetCastleData("gefg_cas04.gat",9) < 1) disablenpc "Kafra Service#G04";
+ end;
+}
+
+
+// Castle 5 ===============================================
+gefg_cas05.gat,61,52,5 script Kafra Service#G05 117,{
+ callfunc "F_GKafra", "gefg_cas05", "Geffen";
+ end;
+OnRecvCastleG05:
+ if (GetCastleData("gefg_cas05.gat",9) < 1) disablenpc "Kafra Service#G05";
+ end;
+}
diff --git a/npc/guild/gefg/gefg_managers.txt b/npc/guild/gefg/gefg_managers.txt
index 07e62e5bc..8a5ba3a0f 100644
--- a/npc/guild/gefg/gefg_managers.txt
+++ b/npc/guild/gefg/gefg_managers.txt
@@ -1,104 +1,104 @@
-//===== eAthena Script =======================================
-//= War of Emperium Managers for Geffen Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ==================================================================================
-gefg_cas01.gat,40,48,5 script Gnaucher 55,{
- if(callfunc("F_GldManager","Gnaucher","gefg_cas01",155,112,"G01") == 0) close;
-
- if(@GDnum==10) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
- mes "[ Gnaucher ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 2 ==================================================================================
-gefg_cas02.gat,12,66,5 script Esmark 55,{
- if(callfunc("F_GldManager","Esmark","gefg_cas02",141,115,"G02") == 0) close;
-
- if(@GDnum==10) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
- mes "[ Esmark ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 3 ==================================================================================
-gefg_cas03.gat,106,23,5 script Jyang 55,{
- if(callfunc("F_GldManager","Jyang","gefg_cas03",270,290,"G03") == 0) close;
-
- if(@GDnum==10) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",7;
- mes "[ Jyang ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 4 ==================================================================================
-gefg_cas04.gat,73,46,5 script Kelbany 55,{
- if(callfunc("F_GldManager","Kelbany","gefg_cas04",116,118,"G04") == 0) close;
-
- if(@GDnum==10) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",7;
- mes "[ Kelbany ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 5 ==================================================================================
-gefg_cas05.gat,70,52,5 script Beeor 55,{
- if(callfunc("F_GldManager","Beeor","gefg_cas05",144,110,"G05") == 0) close;
-
- if(@GDnum==10) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",7;
- mes "[ Beeor ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Managers for Geffen Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ==================================================================================
+gefg_cas01.gat,40,48,5 script Gnaucher 55,{
+ if(callfunc("F_GldManager","Gnaucher","gefg_cas01",155,112,"G01") == 0) close;
+
+ if(@GDnum==10) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
+ mes "[ Gnaucher ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 2 ==================================================================================
+gefg_cas02.gat,12,66,5 script Esmark 55,{
+ if(callfunc("F_GldManager","Esmark","gefg_cas02",141,115,"G02") == 0) close;
+
+ if(@GDnum==10) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_G01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_G01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_G01::OnGuardianDied",7;
+ mes "[ Esmark ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 3 ==================================================================================
+gefg_cas03.gat,106,23,5 script Jyang 55,{
+ if(callfunc("F_GldManager","Jyang","gefg_cas03",270,290,"G03") == 0) close;
+
+ if(@GDnum==10) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_G03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_G03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_G03::OnGuardianDied",7;
+ mes "[ Jyang ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 4 ==================================================================================
+gefg_cas04.gat,73,46,5 script Kelbany 55,{
+ if(callfunc("F_GldManager","Kelbany","gefg_cas04",116,118,"G04") == 0) close;
+
+ if(@GDnum==10) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_G04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_G04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_G04::OnGuardianDied",7;
+ mes "[ Kelbany ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 5 ==================================================================================
+gefg_cas05.gat,70,52,5 script Beeor 55,{
+ if(callfunc("F_GldManager","Beeor","gefg_cas05",144,110,"G05") == 0) close;
+
+ if(@GDnum==10) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_G05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_G05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_G05::OnGuardianDied",7;
+ mes "[ Beeor ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
diff --git a/npc/guild/gefg/gefg_treas.txt b/npc/guild/gefg/gefg_treas.txt
index 6261578e2..566e38d81 100644
--- a/npc/guild/gefg/gefg_treas.txt
+++ b/npc/guild/gefg/gefg_treas.txt
@@ -1,148 +1,148 @@
-//===== eAthena Script =======================================
-//= War of Emperium Treasure Rooms for Geffen Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-//<============================ Castle 1 ==================================>\\
-
-// Treasure Spawn ---------------------------------------------------------
-gefg_cas01.gat,1,1,1 script Treasure_G01 -1,{
-
-OnRecvCastleG01:
- end;
-OnInit:
- if($boxNumG01 == 0) end;
- set $@bxG01, $boxNumG01;
- callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,1;
- end;
-
-OnDied:
- mapannounce "gefg_cas01.gat","Treasure Chest Broken Open",17;
- set $boxNumG01, $boxNumG01 -1;
- if($boxNumG01 == 0) mapannounce "gefg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-gefg_cas01.gat,152,117,0 script Switch#TresG01 111,{
- callfunc "F_GldTreasSw","gefg_cas01",40,49;
- end;
-}
-
-
-//<================================ Castle 2 ================================>\\
-
-// Treasure Spawn ---------------------------------------------------------
-gefg_cas02.gat,1,1,1 script Treasure_G02 -1,{
-
-OnRecvCastleG02:
- end;
-OnInit:
- if($boxNumG02 == 0) end;
- set $@bxG02, $boxNumG02;
- callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,1;
- end;
-
-OnDied:
- mapannounce "gefg_cas02.gat","Treasure Chest Broken Open",17;
- set $boxNumG02, $boxNumG02 -1;
- if($boxNumG02 == 0) mapannounce "gefg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-gefg_cas02.gat,145,115,0 script Switch#TresG02 111,{
- callfunc "F_GldTreasSw", "gefg_cas02",12,67;
-}
-
-
-//<================================= Castle 3 ===============================>\\
-
-// Treasure Spawn ---------------------------------------------------------
-gefg_cas03.gat,1,1,1 script Treasure_G03 -1,{
-
-OnRecvCastleG03:
- end;
-OnInit:
- if($boxNumG03 == 0) end;
- set $@bxG03, $boxNumG03;
- callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,1;
- end;
-
-OnDied:
- mapannounce "gefg_cas03.gat","Treasure Chest Broken Open",17;
- set $boxNumG03, $boxNumG03 -1;
- if($boxNumG03 == 0) mapannounce "gefg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-gefg_cas03.gat,275,289,0 script Switch#TresG03 111,{
- callfunc "F_GldTreasSw", "gefg_cas03",106,24;
- end;
-}
-
-
-//<=============================== Castle 4 ================================>\\
-
-// Treasure Spawn ---------------------------------------------------------
-gefg_cas04.gat,1,1,1 script Treasure_G04 -1,{
-
-OnRecvCastleG04:
- end;
-OnInit:
- if($boxNumG04 == 0) end;
- set $@bxG04, $boxNumG04;
- callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,1;
- end;
-
-OnDied:
- mapannounce "gefg_cas04.gat","Treasure Chest Broken Open",17;
- set $boxNumG04, $boxNumG04 -1;
- if($boxNumG04 == 0) mapannounce "gefg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-gefg_cas04.gat,117,123,0 script Switch#TresG04 111,{
- callfunc "F_GldTreasSw", "gefg_cas04",73,47;
- end;
-}
-
-
-//<================================ Castle 5 ================================>\\
-
-// Treasure Spawn ---------------------------------------------------------
-gefg_cas05.gat,1,1,1 script Treasure_G05 -1,{
-
-OnRecvCastleG05:
- end;
-OnInit:
- if($boxNumG05 == 0) end;
- set $@bxG05, $boxNumG05;
- callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,1;
- end;
-
-OnDied:
- mapannounce "gefg_cas05.gat","Treasure Chest Broken Open",17;
- set $boxNumG05, $boxNumG05 -1;
- if($boxNumG05 == 0) mapannounce "gefg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-gefg_cas05.gat,149,107,0 script Switch#TresG05 111,{
- callfunc "F_GldTreasSw", "gefg_cas05",70,53;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Treasure Rooms for Geffen Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+//<============================ Castle 1 ==================================>\\
+
+// Treasure Spawn ---------------------------------------------------------
+gefg_cas01.gat,1,1,1 script Treasure_G01 -1,{
+
+OnRecvCastleG01:
+ end;
+OnInit:
+ if($boxNumG01 == 0) end;
+ set $@bxG01, $boxNumG01;
+ callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,1;
+ end;
+
+OnDied:
+ mapannounce "gefg_cas01.gat","Treasure Chest Broken Open",17;
+ set $boxNumG01, $boxNumG01 -1;
+ if($boxNumG01 == 0) mapannounce "gefg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+gefg_cas01.gat,152,117,0 script Switch#TresG01 111,{
+ callfunc "F_GldTreasSw","gefg_cas01",40,49;
+ end;
+}
+
+
+//<================================ Castle 2 ================================>\\
+
+// Treasure Spawn ---------------------------------------------------------
+gefg_cas02.gat,1,1,1 script Treasure_G02 -1,{
+
+OnRecvCastleG02:
+ end;
+OnInit:
+ if($boxNumG02 == 0) end;
+ set $@bxG02, $boxNumG02;
+ callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,1;
+ end;
+
+OnDied:
+ mapannounce "gefg_cas02.gat","Treasure Chest Broken Open",17;
+ set $boxNumG02, $boxNumG02 -1;
+ if($boxNumG02 == 0) mapannounce "gefg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+gefg_cas02.gat,145,115,0 script Switch#TresG02 111,{
+ callfunc "F_GldTreasSw", "gefg_cas02",12,67;
+}
+
+
+//<================================= Castle 3 ===============================>\\
+
+// Treasure Spawn ---------------------------------------------------------
+gefg_cas03.gat,1,1,1 script Treasure_G03 -1,{
+
+OnRecvCastleG03:
+ end;
+OnInit:
+ if($boxNumG03 == 0) end;
+ set $@bxG03, $boxNumG03;
+ callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,1;
+ end;
+
+OnDied:
+ mapannounce "gefg_cas03.gat","Treasure Chest Broken Open",17;
+ set $boxNumG03, $boxNumG03 -1;
+ if($boxNumG03 == 0) mapannounce "gefg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+gefg_cas03.gat,275,289,0 script Switch#TresG03 111,{
+ callfunc "F_GldTreasSw", "gefg_cas03",106,24;
+ end;
+}
+
+
+//<=============================== Castle 4 ================================>\\
+
+// Treasure Spawn ---------------------------------------------------------
+gefg_cas04.gat,1,1,1 script Treasure_G04 -1,{
+
+OnRecvCastleG04:
+ end;
+OnInit:
+ if($boxNumG04 == 0) end;
+ set $@bxG04, $boxNumG04;
+ callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,1;
+ end;
+
+OnDied:
+ mapannounce "gefg_cas04.gat","Treasure Chest Broken Open",17;
+ set $boxNumG04, $boxNumG04 -1;
+ if($boxNumG04 == 0) mapannounce "gefg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+gefg_cas04.gat,117,123,0 script Switch#TresG04 111,{
+ callfunc "F_GldTreasSw", "gefg_cas04",73,47;
+ end;
+}
+
+
+//<================================ Castle 5 ================================>\\
+
+// Treasure Spawn ---------------------------------------------------------
+gefg_cas05.gat,1,1,1 script Treasure_G05 -1,{
+
+OnRecvCastleG05:
+ end;
+OnInit:
+ if($boxNumG05 == 0) end;
+ set $@bxG05, $boxNumG05;
+ callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,1;
+ end;
+
+OnDied:
+ mapannounce "gefg_cas05.gat","Treasure Chest Broken Open",17;
+ set $boxNumG05, $boxNumG05 -1;
+ if($boxNumG05 == 0) mapannounce "gefg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+gefg_cas05.gat,149,107,0 script Switch#TresG05 111,{
+ callfunc "F_GldTreasSw", "gefg_cas05",70,53;
+ close;
+}
diff --git a/npc/guild/gldfunc_dunsw.txt b/npc/guild/gldfunc_dunsw.txt
index f70eee705..f2e8e7446 100644
--- a/npc/guild/gldfunc_dunsw.txt
+++ b/npc/guild/gldfunc_dunsw.txt
@@ -1,47 +1,47 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Dungeon Switch Function
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to guild dungeon.
-//==========================================
-//= Break down of arguments used in the function:
-//= arg(0): name of guild castle.
-//= arg(1): guild dungeon level.
-//= arg(2): x1 coordinate for warp
-//= arg(3): y1 coordinate for warp
-//===== Additional Comments: =================================
-//= 1.2: All guild Dungeon Switch npcs use this function.[kobra_k88]
-//= 1.3 Reverted back. Don't listen to ... people at forums
-// and check all bugs yourself!
-// Some not competent people try to change gld_dun -> gld_dun0
-// IT is wrong, because we already supple "02","03",etc as suffix.
-// [Lupus]
-//============================================================
-
-//==================================================
-function script F_GldDunSw {
-
- mes "[ Mysterious Voice ]";
- mes " ' Only brave warriors may lead the guild base.. '";
- next;
- mes "(There is little switch over here....... Would you like to pull the switch?)";
- next;
- menu "Yes",-,"No",M_No;
-
- set @GID, GetCastleData(getarg(0)+".gat",1);
- if (@GID == 0 || getcharid(2) != @GID) goto L_NotGLead;
- warp "gld_dun"+getarg(1)+".gat",getarg(2),getarg(3);
- end;
-
- L_NotGLead:
- mes "[ Mysterious Voice ]";
- mes " ' ..... it seems that you are not brave enough...... ' ";
- M_No:
- return;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Guild Dungeon Switch Function
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to guild dungeon.
+//==========================================
+//= Break down of arguments used in the function:
+//= arg(0): name of guild castle.
+//= arg(1): guild dungeon level.
+//= arg(2): x1 coordinate for warp
+//= arg(3): y1 coordinate for warp
+//===== Additional Comments: =================================
+//= 1.2: All guild Dungeon Switch npcs use this function.[kobra_k88]
+//= 1.3 Reverted back. Don't listen to ... people at forums
+// and check all bugs yourself!
+// Some not competent people try to change gld_dun -> gld_dun0
+// IT is wrong, because we already supple "02","03",etc as suffix.
+// [Lupus]
+//============================================================
+
+//==================================================
+function script F_GldDunSw {
+
+ mes "[ Mysterious Voice ]";
+ mes " ' Only brave warriors may lead the guild base.. '";
+ next;
+ mes "(There is little switch over here....... Would you like to pull the switch?)";
+ next;
+ menu "Yes",-,"No",M_No;
+
+ set @GID, GetCastleData(getarg(0)+".gat",1);
+ if (@GID == 0 || getcharid(2) != @GID) goto L_NotGLead;
+ warp "gld_dun"+getarg(1)+".gat",getarg(2),getarg(3);
+ end;
+
+ L_NotGLead:
+ mes "[ Mysterious Voice ]";
+ mes " ' ..... it seems that you are not brave enough...... ' ";
+ M_No:
+ return;
+}
diff --git a/npc/guild/gldfunc_ev_agit.txt b/npc/guild/gldfunc_ev_agit.txt
index d6038fedb..810569eb0 100644
--- a/npc/guild/gldfunc_ev_agit.txt
+++ b/npc/guild/gldfunc_ev_agit.txt
@@ -1,163 +1,163 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Event AgitStart/AgitBreak Functions
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= F_AgitStart is in charge of spawning Emperium and mobs in castles
-//= when WoE is started.
-//= F_AgitBreak resets guild castle data when a castle has been taken over.
-//= It then sets the data for the new guild master if there is one.
-//=======================================
-//= Break down of arguments used in F_AgitStart:
-//= arg(0): name of specific guild castle.
-//= arg(1): name of specific agit castle script.
-//= arg(2): x1 for Emperium and monster spawn
-//= arg(3): y1 for Emperium and monster spawn
-//= Break down of arguments used in F_AgitBreak:
-//= arg(0): name of specific guild castle.
-//= arg(1): name of specific OnRevCastle label.
-//===== Additional Comments: =================================
-//= v1.2: All OnAgitStart and OnAgitBreak calls will use these functions.[kobra_k88]
-//= v1.2a: Added OnAgitEnd function.[kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//= 1.3a fixed Defence / Economy underflow [Lupus] thanks2 kyoki
-//============================================================
-
-
-// Function for OnAgitStart =========================================
-function script F_AgitStart {
-
- MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),2;
- Monster getarg(0)+".gat",getarg(2),getarg(3),"EMPERIUM",1288,1,"Agit_"+getarg(1)+"::OnAgitBreak";
- GvgOn getarg(0)+".gat";
- if (GetCastleData(getarg(0)+".gat",1) != 0) return;
- if(getarg(0) == "aldeg_cas01" || getarg(0) == "aldeg_cas02" || getarg(0) == "aldeg_cas03" || getarg(0) == "aldeg_cas04" || getarg(0) == "aldeg_cas05" || getarg(0) == "nguild_alde") goto L_AldegCas;
- if(getarg(0) == "gefg_cas01" || getarg(0) == "gefg_cas02" || getarg(0) == "gefg_cas03" || getarg(0) == "gefg_cas04" || getarg(0) == "gefg_cas05" || getarg(0) == "nguild_gef") goto L_GefgCas;
- if(getarg(0) == "payg_cas01" || getarg(0) == "payg_cas02" || getarg(0) == "payg_cas03" || getarg(0) == "payg_cas04" || getarg(0) == "payg_cas05" || getarg(0) == "nguild_pay") goto L_PaygCas;
- if(getarg(0) == "prtg_cas01" || getarg(0) == "prtg_cas02" || getarg(0) == "prtg_cas03" || getarg(0) == "prtg_cas04" || getarg(0) == "prtg_cas05" || getarg(0) == "nguild_prt") goto L_PrtgCas;
-
-L_AldegCas:
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1117,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1132,4;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,2;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1205,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1216,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1193,17;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1269,9;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,7;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1208,3;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1268,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1272,1;
- monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1272,1;
- monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1270,4;
- monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1268,1;
- monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1219,1;
- monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1276,5;
- return;
-L_GefgCas:
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1117,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1263,11;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1102,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1130,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1140,20;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1163,9;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1150,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1159,1;
- monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1203,1;
- monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1087,1;
- monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1213,7;
- monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1189,7;
- return;
-L_PaygCas:
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1277,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1208,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1262,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1102,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1150,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1115,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1129,11;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1282,4;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1253,5;
- monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1150,1;
- monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1115,1;
- monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1208,6;
- monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1276,5;
- return;
-L_PrtgCas:
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1163,15;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1132,10;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1268,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1251,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1252,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,5;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1259,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1283,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
- areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1200,1;
- monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1268,1;
- monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1251,1;
- monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1252,1;
- monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1219,2;
- monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1276,5;
- return;
-}
-
-// Function for OnGuildBreak ======================================
-function script F_GuildBreak {
- killmonsterall getarg(0)+".gat";
-
- Announce "Guild Base [" + GetCastleName(getarg(0)+".gat") + "] has been abandoned.",0;
- disablenpc "Kafra Service#"+getarg(1);
-
- SetCastleData getarg(0)+".gat",0,0;
- return;
-}
-
-// Function for OnAgitBreak ======================================
-function script F_AgitBreak {
- //killmonsterall getarg(0)+".gat";
- set @GID,getcharid(2);
- if (@GID <= 0) return;
-
- set @Economy,GetCastleData(getarg(0)+".gat",2) - 5;
- if (@Economy < 0) set @Economy, 0;
- SetCastleData getarg(0)+".gat",2, @Economy;
-
- set @Defence,GetCastleData(getarg(0)+".gat",3) - 5;
- if (@Defence < 0) set @Defence, 0;
- SetCastleData getarg(0)+".gat",3, @Defence;
-
- SetCastleData getarg(0)+".gat",1, @GID;
- MapAnnounce getarg(0)+".gat","The emperium has been destroyed.",17;
- Announce "Guild Base [" + GetCastleName(getarg(0)+".gat") + "] has been taken by the [" + GetGuildName(@GID) + "] guild.",0;
- GetCastleData getarg(0)+".gat",0,"::OnRecvCastle"+getarg(1);
-
- disablenpc "Kafra Service#"+getarg(1);
- set @i, 3;
-
- L_Loop:
- set @i, @i + 1;
- SetCastleData getarg(0)+".gat",@i,0;
- if(@i < 25) goto L_Loop;
- return;
-}
-
-
-// Function for OnAgitEnd ======================================
-function script F_AgitEnd {
- GvgOff getarg(0)+".gat";
-// if (GetCastleData(getarg(0)+".gat",1) == 0) return; //enable this line to allow take over of non captured castles after woe ends
- MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),4;
- KillMonster getarg(0)+".gat","Agit_"+getarg(1)+"::OnAgitBreak";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Guild Event AgitStart/AgitBreak Functions
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= F_AgitStart is in charge of spawning Emperium and mobs in castles
+//= when WoE is started.
+//= F_AgitBreak resets guild castle data when a castle has been taken over.
+//= It then sets the data for the new guild master if there is one.
+//=======================================
+//= Break down of arguments used in F_AgitStart:
+//= arg(0): name of specific guild castle.
+//= arg(1): name of specific agit castle script.
+//= arg(2): x1 for Emperium and monster spawn
+//= arg(3): y1 for Emperium and monster spawn
+//= Break down of arguments used in F_AgitBreak:
+//= arg(0): name of specific guild castle.
+//= arg(1): name of specific OnRevCastle label.
+//===== Additional Comments: =================================
+//= v1.2: All OnAgitStart and OnAgitBreak calls will use these functions.[kobra_k88]
+//= v1.2a: Added OnAgitEnd function.[kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//= 1.3a fixed Defence / Economy underflow [Lupus] thanks2 kyoki
+//============================================================
+
+
+// Function for OnAgitStart =========================================
+function script F_AgitStart {
+
+ MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),2;
+ Monster getarg(0)+".gat",getarg(2),getarg(3),"EMPERIUM",1288,1,"Agit_"+getarg(1)+"::OnAgitBreak";
+ GvgOn getarg(0)+".gat";
+ if (GetCastleData(getarg(0)+".gat",1) != 0) return;
+ if(getarg(0) == "aldeg_cas01" || getarg(0) == "aldeg_cas02" || getarg(0) == "aldeg_cas03" || getarg(0) == "aldeg_cas04" || getarg(0) == "aldeg_cas05" || getarg(0) == "nguild_alde") goto L_AldegCas;
+ if(getarg(0) == "gefg_cas01" || getarg(0) == "gefg_cas02" || getarg(0) == "gefg_cas03" || getarg(0) == "gefg_cas04" || getarg(0) == "gefg_cas05" || getarg(0) == "nguild_gef") goto L_GefgCas;
+ if(getarg(0) == "payg_cas01" || getarg(0) == "payg_cas02" || getarg(0) == "payg_cas03" || getarg(0) == "payg_cas04" || getarg(0) == "payg_cas05" || getarg(0) == "nguild_pay") goto L_PaygCas;
+ if(getarg(0) == "prtg_cas01" || getarg(0) == "prtg_cas02" || getarg(0) == "prtg_cas03" || getarg(0) == "prtg_cas04" || getarg(0) == "prtg_cas05" || getarg(0) == "nguild_prt") goto L_PrtgCas;
+
+L_AldegCas:
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1117,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1132,4;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,2;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1205,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1216,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1193,17;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1269,9;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,7;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1208,3;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1268,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1272,1;
+ monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1272,1;
+ monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1270,4;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1268,1;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1219,1;
+ monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1276,5;
+ return;
+L_GefgCas:
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1117,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1263,11;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1102,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1130,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1140,20;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1163,9;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1150,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1159,1;
+ monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1203,1;
+ monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1087,1;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1213,7;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1189,7;
+ return;
+L_PaygCas:
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1277,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1208,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1262,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1102,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1150,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1115,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1129,11;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1282,4;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1253,5;
+ monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1150,1;
+ monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1115,1;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1208,6;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1276,5;
+ return;
+L_PrtgCas:
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1163,15;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1132,10;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1219,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1268,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1251,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1252,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1276,5;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1259,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1283,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1275,1;
+ areamonster getarg(0)+".gat",0,0,300,300,"--ja--",1200,1;
+ monster getarg(0)+".gat",(getarg(2)+1),getarg(3),"--ja--",1268,1;
+ monster getarg(0)+".gat",(getarg(2)-1),getarg(3),"--ja--",1251,1;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)+1),"--ja--",1252,1;
+ monster getarg(0)+".gat",getarg(2),(getarg(3)-1),"--ja--",1219,2;
+ monster getarg(0)+".gat",getarg(2),getarg(3),"--ja--",1276,5;
+ return;
+}
+
+// Function for OnGuildBreak ======================================
+function script F_GuildBreak {
+ killmonsterall getarg(0)+".gat";
+
+ Announce "Guild Base [" + GetCastleName(getarg(0)+".gat") + "] has been abandoned.",0;
+ disablenpc "Kafra Service#"+getarg(1);
+
+ SetCastleData getarg(0)+".gat",0,0;
+ return;
+}
+
+// Function for OnAgitBreak ======================================
+function script F_AgitBreak {
+ //killmonsterall getarg(0)+".gat";
+ set @GID,getcharid(2);
+ if (@GID <= 0) return;
+
+ set @Economy,GetCastleData(getarg(0)+".gat",2) - 5;
+ if (@Economy < 0) set @Economy, 0;
+ SetCastleData getarg(0)+".gat",2, @Economy;
+
+ set @Defence,GetCastleData(getarg(0)+".gat",3) - 5;
+ if (@Defence < 0) set @Defence, 0;
+ SetCastleData getarg(0)+".gat",3, @Defence;
+
+ SetCastleData getarg(0)+".gat",1, @GID;
+ MapAnnounce getarg(0)+".gat","The emperium has been destroyed.",17;
+ Announce "Guild Base [" + GetCastleName(getarg(0)+".gat") + "] has been taken by the [" + GetGuildName(@GID) + "] guild.",0;
+ GetCastleData getarg(0)+".gat",0,"::OnRecvCastle"+getarg(1);
+
+ disablenpc "Kafra Service#"+getarg(1);
+ set @i, 3;
+
+ L_Loop:
+ set @i, @i + 1;
+ SetCastleData getarg(0)+".gat",@i,0;
+ if(@i < 25) goto L_Loop;
+ return;
+}
+
+
+// Function for OnAgitEnd ======================================
+function script F_AgitEnd {
+ GvgOff getarg(0)+".gat";
+// if (GetCastleData(getarg(0)+".gat",1) == 0) return; //enable this line to allow take over of non captured castles after woe ends
+ MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),4;
+ KillMonster getarg(0)+".gat","Agit_"+getarg(1)+"::OnAgitBreak";
+ end;
+}
diff --git a/npc/guild/gldfunc_flag.txt b/npc/guild/gldfunc_flag.txt
index adde394ec..ec73de7c5 100644
--- a/npc/guild/gldfunc_flag.txt
+++ b/npc/guild/gldfunc_flag.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Flags Function
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Flags display messages stating whether or not a guild castle has been captured.
-//= Allows the guild members to return to a captured castle.
-//======================================
-//= Break down of arguments used in the function:
-//= arg(0): name of City.
-//= arg(1): name of guild castle.
-//= arg(2): x1 coordinate for warp
-//= arg(3): y1 coordinate for warp
-//= arg(4): Teleportable (0/1)
-//===== Additional Comments: =================================
-//= v1.2: All Guild flags scripts use this function. [kobra_k88]
-//= v1.3: Can now only flag in from outside the castle [Kayla]
-//= v1.3a: Implemented k3dt's exploit fix [Vicious]
-//============================================================
-
-function script F_Flags {
-
- set @GID, GetCastleData(getarg(1)+".gat",1);
- if (@GID != 0) goto L_Startg;
-
- mes "[ Edict of the Divine Rune Midgard Kingdom of " + getarg(0) + " ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of " + getarg(0) + ", this guild base has not been taken by any guild yet";
- mes " ";
- mes "2. In order to take this guild base, you must defeat all the guardians that are protecting the guild base and eliminate the Emperium.";
- return;
-L_Startg:
- if ((getcharid(2) == @GID) && (getarg(4) == 1)) goto L_Startg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of "+ getarg(0) +" ]";
- mes " ";
- mes "1. Honoring the ordinance of the";
- mes "Divine Rune Midgard Kingdom of ";
- mes getarg(0) +", we approve that this";
- mes "base is in the private possession";
- mes "of the ^ff0000" + GetGuildName(@GID) + "^000000 guild.";
- mes " ";
- mes "2. The guild master of the";
- mes "^ff0000"+ GetGuildName(@GID) + "^000000 guild, is ^0000FF" + GetGuildMaster(@GID) + "^000000.";
- mes "If anyone objects to that, raise your sword to honor yourself.";
- return;
-L_Startg2:
- mes "[ Ringing Voice ]";
- mes "Brave one... would you return to your honorable be?";
- next;
- menu "Return.",M_Enter,"Cancel.",-;
- return;
-
- M_Enter:
- if (getcharid(2) == GetCastleData(getarg(1)+".gat",1)) warp getarg(1)+".gat",getarg(2),getarg(3);
- return;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Guild Flags Function
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Flags display messages stating whether or not a guild castle has been captured.
+//= Allows the guild members to return to a captured castle.
+//======================================
+//= Break down of arguments used in the function:
+//= arg(0): name of City.
+//= arg(1): name of guild castle.
+//= arg(2): x1 coordinate for warp
+//= arg(3): y1 coordinate for warp
+//= arg(4): Teleportable (0/1)
+//===== Additional Comments: =================================
+//= v1.2: All Guild flags scripts use this function. [kobra_k88]
+//= v1.3: Can now only flag in from outside the castle [Kayla]
+//= v1.3a: Implemented k3dt's exploit fix [Vicious]
+//============================================================
+
+function script F_Flags {
+
+ set @GID, GetCastleData(getarg(1)+".gat",1);
+ if (@GID != 0) goto L_Startg;
+
+ mes "[ Edict of the Divine Rune Midgard Kingdom of " + getarg(0) + " ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of " + getarg(0) + ", this guild base has not been taken by any guild yet";
+ mes " ";
+ mes "2. In order to take this guild base, you must defeat all the guardians that are protecting the guild base and eliminate the Emperium.";
+ return;
+L_Startg:
+ if ((getcharid(2) == @GID) && (getarg(4) == 1)) goto L_Startg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of "+ getarg(0) +" ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the";
+ mes "Divine Rune Midgard Kingdom of ";
+ mes getarg(0) +", we approve that this";
+ mes "base is in the private possession";
+ mes "of the ^ff0000" + GetGuildName(@GID) + "^000000 guild.";
+ mes " ";
+ mes "2. The guild master of the";
+ mes "^ff0000"+ GetGuildName(@GID) + "^000000 guild, is ^0000FF" + GetGuildMaster(@GID) + "^000000.";
+ mes "If anyone objects to that, raise your sword to honor yourself.";
+ return;
+L_Startg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave one... would you return to your honorable be?";
+ next;
+ menu "Return.",M_Enter,"Cancel.",-;
+ return;
+
+ M_Enter:
+ if (getcharid(2) == GetCastleData(getarg(1)+".gat",1)) warp getarg(1)+".gat",getarg(2),getarg(3);
+ return;
+}
diff --git a/npc/guild/gldfunc_kafra.txt b/npc/guild/gldfunc_kafra.txt
index 0c806bc6c..9268070f8 100644
--- a/npc/guild/gldfunc_kafra.txt
+++ b/npc/guild/gldfunc_kafra.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= War of Emperium Kafras Function
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Kafra service for guild members
-//======================================
-//= Break down of arguments used in the function:
-//= arg(0): name of City.
-//= arg(1): name of guild castle.
-//= arg(2): x1 coordinate for warp
-//= arg(3): y1 coordinate for warp
-//===== Additional Comments: =================================
-//= v1.2: All Guild kafra scripts use this function. [kobra_k88]
-//= 1.2a Added extra check for Contract with Kafra Guild Skill [Lupus]
-//============================================================
-
-function script F_GKafra {
- cutin "kafra_01",2;
- set @GID, GetCastleData(getarg(0)+".gat",1);
- if (getcharid(2) == @GID && getgdskilllv(@GID,10001)) goto L_StartG;
-
- mes "[Kafra Service]";
- mes "I am here to serve only ^5533FF" + GetGuildName(@GID) + "^000000 members. Please use different Kafra Service. Thank you.";
- cutin "",255;
- close;
-L_StartG:
- set @wrpP[0], 0;
- set @wrpD$[0], getarg(1);
- setarray @wrpC$[0], @wrpD$[0], "Cancel", "", "", "","";
- callfunc "F_Kafra",2,0,0;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Kafras Function
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Kafra service for guild members
+//======================================
+//= Break down of arguments used in the function:
+//= arg(0): name of City.
+//= arg(1): name of guild castle.
+//= arg(2): x1 coordinate for warp
+//= arg(3): y1 coordinate for warp
+//===== Additional Comments: =================================
+//= v1.2: All Guild kafra scripts use this function. [kobra_k88]
+//= 1.2a Added extra check for Contract with Kafra Guild Skill [Lupus]
+//============================================================
+
+function script F_GKafra {
+ cutin "kafra_01",2;
+ set @GID, GetCastleData(getarg(0)+".gat",1);
+ if (getcharid(2) == @GID && getgdskilllv(@GID,10001)) goto L_StartG;
+
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^5533FF" + GetGuildName(@GID) + "^000000 members. Please use different Kafra Service. Thank you.";
+ cutin "",255;
+ close;
+L_StartG:
+ set @wrpP[0], 0;
+ set @wrpD$[0], getarg(1);
+ setarray @wrpC$[0], @wrpD$[0], "Cancel", "", "", "","";
+ callfunc "F_Kafra",2,0,0;
+ end;
+}
diff --git a/npc/guild/gldfunc_manager.txt b/npc/guild/gldfunc_manager.txt
index bd45344b6..d42f37ed7 100644
--- a/npc/guild/gldfunc_manager.txt
+++ b/npc/guild/gldfunc_manager.txt
@@ -1,419 +1,419 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Manager Function
-//===== By: ==================================================
-//= jAthena - kalen (1.0) & eAthena Team
-//===== Current Version: =====================================
-//= 1.6a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= The Guild Manager allows the Guildmaster to invest in comerce
-//= and defense, hire guardians and kafras, go to the treasure room,
-//= and surrender the guild castle.
-//==============================================
-//= Break down of arguments used in the function:
-//= arg(0): name of Castle Manager
-//= arg(1): name of guild castle.
-//= arg(2): x1 coordinate for warp to treasure room
-//= arg(3): y1 coordinate for warp to treasure room
-//= arg(4): guild script suffix for kafra, Guardian scripts etc.
-//===== Additional Comments: =================================
-//= 1.31: Added support for Emsolute Develop [celest]
-//= 1.2: All Guild manager scripts use this function. Optimized Comerce and Defense investment. [kobra_k88]
-//= 1.2a Function now returns to script that called it. Added disablenpc line to surrender castle option to remove kafra upon surrender.[kobra_k88]
-//= 1.2b U can't surrender the base during WOE [Lupus]
-//= 1.2c Fixed issue of guardians hp not increasing upon defense investment.[kobra_k88]
-//= 1.3 Now you can't install Guardians during WOE [Lupus]
-//= 1.4 Remove surrender abbility (Was 100% custom as far as I can tell) [Kayla]
-//= 1.41 Fixed possible Economy investment overflow with Emsolute Develop learnt [Lupus]
-//= 1.5 Official Novice Castles Menu (u can't invest / hire guardians) [Lupus]
-//= 1.6 According to recent info u can re-install Guardians during WoE [Lupus]
-//= 1.6a Fix for guild manager recognizing [KarLaeda]
-//============================================================
-
-
-
-//==============================================
-function script F_GldManager {
-
- set @GID, GetCastleData(getarg(1)+".gat",1);
- mes "[ "+getarg(0)+" ]";
- if (@GID == 0){
- mes "I am waiting for my master. Brave adventurer, follow your destiny!";
- return 0;
- }
- if (getcharid(2) != @GID){
- mes "I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command! Hey! Your not even a part of the guild!!";
- mes "Where are the guardians? Destroy these intruders!";
- return 0;
- }
- if (strcharinfo(0) != getguildmaster(@GID)){
- mes "You're not ^5533FF" + getguildmaster(@GID) + "^000000! I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command only";
- return 0;
- }
-
- mes "Welcome Master ^5533FF" + getguildmaster(@GID) + "^000000 ! I will assist you in any way I can!";
- next;
-
- //Novice Castles. (we don't need ELSE here. Menu has direct labels)
- if(getarg(1) == "nguild_prt" || getarg(1) == "nguild_alde" || getarg(1) == "nguild_gef" || getarg(1) == "nguild_pay" )
- menu "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Cancel",M_End;
-
- //Common WoE Castles
- menu "Guild Base Briefing",M_Base, "Commerce Investment",M_Comrc, "Defence Investment",M_Def, "Guardian Installation",M_Guard,
- "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Cancel",M_End;
-
- //========================
- M_Base:
- //=========
- mes "[ "+getarg(0)+" ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : ^FF3322" + GetCastleData(getarg(1)+".gat",2) + "^000000 points.";
- mes "^0000ff - You have invested " + GetCastleData(getarg(1)+".gat",4) + " times today.^000000";
- next;
- mes "[ "+getarg(0)+" ]";
- mes "Current Defence Investment is : ^FF3322" + GetCastleData(getarg(1)+".gat",3) + "^000000 points.";
- mes "^0000ff- You have invested " + GetCastleData(getarg(1)+".gat",5) + " times today.^000000";
- mes " ";
- mes "That is about it.";
- return 0;
-
- //========================
- M_Comrc:
- //=========
- set @TriggerE,GetCastleData(getarg(1)+".gat",4);
- set @Economy,GetCastleData(getarg(1)+".gat",2);
- if(@Economy < 8) set @eco_invest,10000;
- if(@Economy >= 8) set @eco_invest,20000;
- if(@Economy >= 16) set @eco_invest,40000;
- if(@Economy >= 25) set @eco_invest,80000;
- if(@Economy >= 34) set @eco_invest,160000;
- if(@Economy >= 44) set @eco_invest,320000;
- if(@Economy >= 54) set @eco_invest,640000;
- if(@Economy >= 65) set @eco_invest,1280000;
- if(@Economy >= 76) set @eco_invest,2560000;
- if(@Economy >= 88) set @eco_invest,5120000;
-
- mes "[ "+getarg(0)+" ]";
- if(@TriggerE == 2){
- mes "^ff0000You have already invested twice today, and that's the limit.^000000 I'm expecting to see our riches grow at a high level.";
- return 0;
- }
- if(@Economy >= 100){
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- return 0;
- }
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods.";
- mes "So an investment will be required if you're considering future growth.";
- next;
- mes "[ "+getarg(0)+" ]";
- if(@TriggerE == 0) {
- mes "You can invest up to two times a day, but the second time costs more";
- mes "The needed investment amount is ^5533FF" + @eco_invest + "^000000 zeny.";
- } else {
- set @eco_invest,@eco_invest*4;
- mes "You've already invested once today, but you can invest again at ^5533FF" + @eco_invest + "^000000 Zeny.";
- }
- next;
- mes "[ "+getarg(0)+" ]";
- mes "Would you like to invest?";
- next;
- menu "Invest Commerce.",-,"Cancel.",M_End;
-
- mes "[ "+getarg(0)+" ]";
- if(Zeny < @eco_invest){
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- return 0;
- }
- set Zeny,Zeny-@eco_invest;
- SetCastleData getarg(1)+".gat",4,@TriggerE+1;
- // if we learnt Emsolute Develop there's 50% chance to get +1 investment again
- SetCastleData getarg(1)+".gat",2,@Economy + 1 + (getgdskilllv(@GID,10014)>0 && rand(100)>50 && @Economy<99);
-
- mes "You have invested successfully.";
- return 0;
-
- //=========================
- M_Def:
- //========
- set @TriggerD,GetCastleData(getarg(1)+".gat",5);
- set @Defence,GetCastleData(getarg(1)+".gat",3);
- if(@Defence < 8) set @def_invest,20000;
- if(@Defence >= 8) set @def_invest,40000;
- if(@Defence >= 16) set @def_invest,80000;
- if(@Defence >= 25) set @def_invest,160000;
- if(@Defence >= 34) set @def_invest,320000;
- if(@Defence >= 44) set @def_invest,640000;
- if(@Defence >= 54) set @def_invest,1280000;
- if(@Defence >= 65) set @def_invest,2560000;
- if(@Defence >= 76) set @def_invest,5120000;
- if(@Defence >= 88) set @def_invest,10240000;
-
- mes "[ "+getarg(0)+" ]";
- if(@TriggerD == 2){
- mes "^ff0000You have already invested twice today, and that's the limit.^000000 I'm expecting to see our riches grow at a high level.";
- return 0;
- }
- if(@Defence >= 100){
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- return 0;
- }
- mes "If you improve investment of defence, the durability of our Guardians and the Emperium will increase.";
- mes "So if you consider our future battles, an investment will be required.";
- next;
- mes "[ "+getarg(0)+" ]";
- if(@TriggerD == 0) {
- mes "You can invest up to two times a day, but the second time costs more";
- mes "The needed investment amount is ^5533FF" + @def_invest + "^000000 zeny.";
- } else {
- set @def_invest,@def_invest*4;
- mes "You've already invested once today, but you can invest again at ^5533FF" + @def_invest + "^000000 Zeny.";
- }
- next;
- mes "[ "+getarg(0)+" ]";
- mes "Would you like to invest?";
- next;
- menu "Invest Defence.",-, "Cancel",M_End;
-
- mes "[ "+getarg(0)+" ]";
- if(Zeny < @def_invest){
- mes "Master, you do not have enough money to invest in Defence. Defence investment has been cancelled.";
- return 0;
- }
- set Zeny,Zeny-@def_invest;
- SetCastleData getarg(1)+".gat",5,@TriggerD+1;
- SetCastleData getarg(1)+".gat",3,@Defence+1;
- // set new hp values for guardians
- set @Defence, @Defence + 1;
- set @AGuardian, 28634 + (@Defence*2000);
- set @KGuardian, 30214 + (@Defence*2000);
- set @SGuardian, 15670 + (@Defence*2000);
- //set @AGuardian,strmobinfo(4,1285) + (@Defence*2000);
- //set @KGuardian,strmobinfo(4,1286) + (@Defence*2000);
- //set @SGuardian,strmobinfo(4,1287) + (@Defence*2000);
- if (GetCastleData(getarg(1)+".gat",10) == 1) SetCastleData getarg(1)+".gat",18,@SGuardian;
- if (GetCastleData(getarg(1)+".gat",11) == 1) SetCastleData getarg(1)+".gat",19,@SGuardian;
- if (GetCastleData(getarg(1)+".gat",12) == 1) SetCastleData getarg(1)+".gat",20,@SGuardian;
- if (GetCastleData(getarg(1)+".gat",13) == 1) SetCastleData getarg(1)+".gat",21,@AGuardian;
- if (GetCastleData(getarg(1)+".gat",14) == 1) SetCastleData getarg(1)+".gat",22,@AGuardian;
- if (GetCastleData(getarg(1)+".gat",15) == 1) SetCastleData getarg(1)+".gat",23,@KGuardian;
- if (GetCastleData(getarg(1)+".gat",16) == 1) SetCastleData getarg(1)+".gat",24,@KGuardian;
- if (GetCastleData(getarg(1)+".gat",17) == 1) SetCastleData getarg(1)+".gat",25,@KGuardian;
-
- mes "You have invested successfully.";
- return 0;
-
- //=========================
- M_Guard:
- //=========
- mes "[ "+getarg(0)+" ]";
- if (getgdskilllv(@GID,10002) == 0){
- mes "I'm sorry Master but you cannot install any guardians right now. Your guild must learn the Guild skill ^5533FFGuardian Research^000000 first.";
- mes "Guardian Installation has been cancelled.";
- return 0;
- }
-
- set @Defence,GetCastleData(getarg(1)+".gat",3);
- set @Guardian0,guardianinfo(0);
- set @Guardian1,guardianinfo(1);
- set @Guardian2,guardianinfo(2);
- set @Guardian3,guardianinfo(3);
- set @Guardian4,guardianinfo(4);
- set @Guardian5,guardianinfo(5);
- set @Guardian6,guardianinfo(6);
- set @Guardian7,guardianinfo(7);
- set @AGuardian, 28634 + (@Defence*2000);
- set @KGuardian, 30214 + (@Defence*2000);
- set @SGuardian, 15670 + (@Defence*2000);
- //set @AGuardian,strmobinfo(4,1285) + (@Defence*2000);
- //set @KGuardian,strmobinfo(4,1286) + (@Defence*2000);
- //set @SGuardian,strmobinfo(4,1287) + (@Defence*2000);
-
- //uncomment the following line to disable guardians Installation during WoE
- //if(agitcheck(0) != 0) goto L_CantGuard;
- mes "Would you like to install a guardian? Guardians will protect the guild base from enemies.";
- mes "Please choose a guardian.";
- next;
-
- menu "Soldier Guardian (" + @Guardian0 + "/" + @SGuardian + ")",L4_1,
- "Soldier Guardian (" + @Guardian1 + "/" + @SGuardian + ")",L4_2,
- "Soldier Guardian (" + @Guardian2 + "/" + @SGuardian + ")",L4_3,
- "Archer Guardian (" + @Guardian3 + "/" + @AGuardian + ")",L4_4,
- "Archer Guardian (" + @Guardian4 + "/" + @AGuardian + ")",L4_5,
- "Knight Guardian (" + @Guardian5 + "/" + @KGuardian + ")",L4_6,
- "Knight Guardian (" + @Guardian6 + "/" + @KGuardian + ")",L4_7,
- "Knight Guardian (" + @Guardian7 + "/" + @KGuardian + ")",L4_8;
-
- L4_1:
- if (GetCastleData(getarg(1)+".gat",10) == 1) goto L_GotGuard;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData(getarg(1)+".gat",11) == 1) goto L_GotGuard;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData(getarg(1)+".gat",12) == 1) goto L_GotGuard;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData(getarg(1)+".gat",13) == 1) goto L_GotGuard;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData(getarg(1)+".gat",14) == 1) goto L_GotGuard;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData(getarg(1)+".gat",15) == 1) goto L_GotGuard;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData(getarg(1)+".gat",16) == 1) goto L_GotGuard;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData(getarg(1)+".gat",17) == 1) goto L_GotGuard;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- L4_9:
- mes "[ "+getarg(0)+" ]";
- mes "Would you really like to install a guardian? You need ^5533FF10,000 zeny^000000 to install one....";
- next;
- menu "Install",-, "Cancel",M_End;
-
- if (Zeny < 10000){
- mes "[ "+getarg(0)+" ]";
- mes "I'm sorry Master, but you do not have enough zeny for a Guardian.";
- return 0;
- }
- set Zeny,Zeny-10000;
- SetCastleData getarg(1)+".gat",@GDnum,1;
- SetCastleData getarg(1)+".gat",@GDnum2,@GuardianHP;
- return 1;
-
- L_GotGuard:
- mes "[ "+getarg(0)+" ]";
- mes "Excuse me Master, but that guardian has already been installed.....";
- emotion 4;
- return 0;
- L_CantGuard:
- mes "Master.... don't you know that we can't install guardians during the War Of Emperium?!!";
- emotion 4;
- return 0;
-
- //===========================
- M_Kaf:
- //======
- mes "[ "+getarg(0)+" ]";
- if (GetCastleData(getarg(1)+".gat",9) == 1) goto L_Dismiss;
- if (getgdskilllv(@GID,10001) == 0){
- mes "Master, you don't have a contract with the Kafra Service Company.";
- mes "In order to hire a Kafra, you must first learn the Guild skill ^5533FFContract With Kafra^000000.";
- return 0;
- }
-
- L_Hire:
- mes "Would you like to employ the services of a Kafra? You will need ^5533FF10,000 Zeny^000000 to do so... ";
- next;
- menu "Employ Kafra.",-,"Cancel",sM_KafEnd;
-
- mes "[ "+getarg(0)+" ]";
- if (Zeny < 10000){
- mes "Master, you do not have enough money to employ a Kafra. Employment has been cancelled.";
- return 0;
- }
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#"+getarg(4);
- SetCastleData getarg(1)+".gat",9,1;
- mes "You have created a contract with the Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I'm here to provide you with helpful service! I'll do the best I can to serve you.";
- next;
- cutin "kafra_01",255;
- mes "[ "+getarg(0)+" ]";
- //mes "Your employment contract lasts ^5533FF1 month^000000. After this term is over you will have to create a new contract.";
- mes "I think the Kafra Service will benefit our guild members.";
- return 0;
-
- sM_KafEnd:
- mes "[ "+getarg(0)+" ]";
- mes "As you wish Master. But I suggest we get a Kafra as soon as possible!";
- return 0;
-
- L_Dismiss:
- mes "Would you like to dismiss the current Kafra?";
- next;
- menu "Dismissal",-,"Cancel",sM_KafEnd2;
-
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I done anything wrong? If I did, will you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",ssM_KafEnd2;
-
- mes "[ Kafra Service ]";
- mes "It's unfortunate that I won't be able to serve your guild anymore....";
- next;
- disablenpc "Kafra Service#"+getarg(4);
- SetCastleData getarg(1)+".gat",9,0;
- cutin "kafra_01",255;
- mes "[ "+getarg(0)+" ]";
- mes "The Kafra has been dismissed. But... we should really get a Kafra as soon as possible!";
- return 0;
- ssM_KafEnd2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- return 0;
- sM_KafEnd2:
- mes "[ "+getarg(0)+" ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- return 0;
-
- //=========================
- M_Treas:
- //========
- mes "[ "+getarg(0)+" ]";
- mes "Would you to go to our Treasure Room? Only you, the Guild Master, are allowed to enter this room.";
- next;
- menu "Enter Treasure room.",-,"Cancel",sM_TresEnd;
-
- mes "[ "+getarg(0)+" ]";
- mes "Please follow me through the secret passage way.";
- mes "You must pull down on the secret switch in order to get out.";
- next;
- warp getarg(1)+".gat",getarg(2),getarg(3);
- return 0;
- sM_TresEnd:
- mes "[ "+getarg(0)+" ]";
- mes "The goods are produced everyday.";
- mes "You should get them whenever you can because they might dissapear if you take them at the wrong time.";
- return 0;
-
-
- //==========================
- M_End:
- //=======
- mes "[ "+getarg(0)+" ]";
- mes "As you wish, master.";
- return 0;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Guild Manager Function
+//===== By: ==================================================
+//= jAthena - kalen (1.0) & eAthena Team
+//===== Current Version: =====================================
+//= 1.6a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= The Guild Manager allows the Guildmaster to invest in comerce
+//= and defense, hire guardians and kafras, go to the treasure room,
+//= and surrender the guild castle.
+//==============================================
+//= Break down of arguments used in the function:
+//= arg(0): name of Castle Manager
+//= arg(1): name of guild castle.
+//= arg(2): x1 coordinate for warp to treasure room
+//= arg(3): y1 coordinate for warp to treasure room
+//= arg(4): guild script suffix for kafra, Guardian scripts etc.
+//===== Additional Comments: =================================
+//= 1.31: Added support for Emsolute Develop [celest]
+//= 1.2: All Guild manager scripts use this function. Optimized Comerce and Defense investment. [kobra_k88]
+//= 1.2a Function now returns to script that called it. Added disablenpc line to surrender castle option to remove kafra upon surrender.[kobra_k88]
+//= 1.2b U can't surrender the base during WOE [Lupus]
+//= 1.2c Fixed issue of guardians hp not increasing upon defense investment.[kobra_k88]
+//= 1.3 Now you can't install Guardians during WOE [Lupus]
+//= 1.4 Remove surrender abbility (Was 100% custom as far as I can tell) [Kayla]
+//= 1.41 Fixed possible Economy investment overflow with Emsolute Develop learnt [Lupus]
+//= 1.5 Official Novice Castles Menu (u can't invest / hire guardians) [Lupus]
+//= 1.6 According to recent info u can re-install Guardians during WoE [Lupus]
+//= 1.6a Fix for guild manager recognizing [KarLaeda]
+//============================================================
+
+
+
+//==============================================
+function script F_GldManager {
+
+ set @GID, GetCastleData(getarg(1)+".gat",1);
+ mes "[ "+getarg(0)+" ]";
+ if (@GID == 0){
+ mes "I am waiting for my master. Brave adventurer, follow your destiny!";
+ return 0;
+ }
+ if (getcharid(2) != @GID){
+ mes "I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command! Hey! Your not even a part of the guild!!";
+ mes "Where are the guardians? Destroy these intruders!";
+ return 0;
+ }
+ if (strcharinfo(0) != getguildmaster(@GID)){
+ mes "You're not ^5533FF" + getguildmaster(@GID) + "^000000! I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command only";
+ return 0;
+ }
+
+ mes "Welcome Master ^5533FF" + getguildmaster(@GID) + "^000000 ! I will assist you in any way I can!";
+ next;
+
+ //Novice Castles. (we don't need ELSE here. Menu has direct labels)
+ if(getarg(1) == "nguild_prt" || getarg(1) == "nguild_alde" || getarg(1) == "nguild_gef" || getarg(1) == "nguild_pay" )
+ menu "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Cancel",M_End;
+
+ //Common WoE Castles
+ menu "Guild Base Briefing",M_Base, "Commerce Investment",M_Comrc, "Defence Investment",M_Def, "Guardian Installation",M_Guard,
+ "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Cancel",M_End;
+
+ //========================
+ M_Base:
+ //=========
+ mes "[ "+getarg(0)+" ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : ^FF3322" + GetCastleData(getarg(1)+".gat",2) + "^000000 points.";
+ mes "^0000ff - You have invested " + GetCastleData(getarg(1)+".gat",4) + " times today.^000000";
+ next;
+ mes "[ "+getarg(0)+" ]";
+ mes "Current Defence Investment is : ^FF3322" + GetCastleData(getarg(1)+".gat",3) + "^000000 points.";
+ mes "^0000ff- You have invested " + GetCastleData(getarg(1)+".gat",5) + " times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ return 0;
+
+ //========================
+ M_Comrc:
+ //=========
+ set @TriggerE,GetCastleData(getarg(1)+".gat",4);
+ set @Economy,GetCastleData(getarg(1)+".gat",2);
+ if(@Economy < 8) set @eco_invest,10000;
+ if(@Economy >= 8) set @eco_invest,20000;
+ if(@Economy >= 16) set @eco_invest,40000;
+ if(@Economy >= 25) set @eco_invest,80000;
+ if(@Economy >= 34) set @eco_invest,160000;
+ if(@Economy >= 44) set @eco_invest,320000;
+ if(@Economy >= 54) set @eco_invest,640000;
+ if(@Economy >= 65) set @eco_invest,1280000;
+ if(@Economy >= 76) set @eco_invest,2560000;
+ if(@Economy >= 88) set @eco_invest,5120000;
+
+ mes "[ "+getarg(0)+" ]";
+ if(@TriggerE == 2){
+ mes "^ff0000You have already invested twice today, and that's the limit.^000000 I'm expecting to see our riches grow at a high level.";
+ return 0;
+ }
+ if(@Economy >= 100){
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ return 0;
+ }
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods.";
+ mes "So an investment will be required if you're considering future growth.";
+ next;
+ mes "[ "+getarg(0)+" ]";
+ if(@TriggerE == 0) {
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes "The needed investment amount is ^5533FF" + @eco_invest + "^000000 zeny.";
+ } else {
+ set @eco_invest,@eco_invest*4;
+ mes "You've already invested once today, but you can invest again at ^5533FF" + @eco_invest + "^000000 Zeny.";
+ }
+ next;
+ mes "[ "+getarg(0)+" ]";
+ mes "Would you like to invest?";
+ next;
+ menu "Invest Commerce.",-,"Cancel.",M_End;
+
+ mes "[ "+getarg(0)+" ]";
+ if(Zeny < @eco_invest){
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ return 0;
+ }
+ set Zeny,Zeny-@eco_invest;
+ SetCastleData getarg(1)+".gat",4,@TriggerE+1;
+ // if we learnt Emsolute Develop there's 50% chance to get +1 investment again
+ SetCastleData getarg(1)+".gat",2,@Economy + 1 + (getgdskilllv(@GID,10014)>0 && rand(100)>50 && @Economy<99);
+
+ mes "You have invested successfully.";
+ return 0;
+
+ //=========================
+ M_Def:
+ //========
+ set @TriggerD,GetCastleData(getarg(1)+".gat",5);
+ set @Defence,GetCastleData(getarg(1)+".gat",3);
+ if(@Defence < 8) set @def_invest,20000;
+ if(@Defence >= 8) set @def_invest,40000;
+ if(@Defence >= 16) set @def_invest,80000;
+ if(@Defence >= 25) set @def_invest,160000;
+ if(@Defence >= 34) set @def_invest,320000;
+ if(@Defence >= 44) set @def_invest,640000;
+ if(@Defence >= 54) set @def_invest,1280000;
+ if(@Defence >= 65) set @def_invest,2560000;
+ if(@Defence >= 76) set @def_invest,5120000;
+ if(@Defence >= 88) set @def_invest,10240000;
+
+ mes "[ "+getarg(0)+" ]";
+ if(@TriggerD == 2){
+ mes "^ff0000You have already invested twice today, and that's the limit.^000000 I'm expecting to see our riches grow at a high level.";
+ return 0;
+ }
+ if(@Defence >= 100){
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ return 0;
+ }
+ mes "If you improve investment of defence, the durability of our Guardians and the Emperium will increase.";
+ mes "So if you consider our future battles, an investment will be required.";
+ next;
+ mes "[ "+getarg(0)+" ]";
+ if(@TriggerD == 0) {
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes "The needed investment amount is ^5533FF" + @def_invest + "^000000 zeny.";
+ } else {
+ set @def_invest,@def_invest*4;
+ mes "You've already invested once today, but you can invest again at ^5533FF" + @def_invest + "^000000 Zeny.";
+ }
+ next;
+ mes "[ "+getarg(0)+" ]";
+ mes "Would you like to invest?";
+ next;
+ menu "Invest Defence.",-, "Cancel",M_End;
+
+ mes "[ "+getarg(0)+" ]";
+ if(Zeny < @def_invest){
+ mes "Master, you do not have enough money to invest in Defence. Defence investment has been cancelled.";
+ return 0;
+ }
+ set Zeny,Zeny-@def_invest;
+ SetCastleData getarg(1)+".gat",5,@TriggerD+1;
+ SetCastleData getarg(1)+".gat",3,@Defence+1;
+ // set new hp values for guardians
+ set @Defence, @Defence + 1;
+ set @AGuardian, 28634 + (@Defence*2000);
+ set @KGuardian, 30214 + (@Defence*2000);
+ set @SGuardian, 15670 + (@Defence*2000);
+ //set @AGuardian,strmobinfo(4,1285) + (@Defence*2000);
+ //set @KGuardian,strmobinfo(4,1286) + (@Defence*2000);
+ //set @SGuardian,strmobinfo(4,1287) + (@Defence*2000);
+ if (GetCastleData(getarg(1)+".gat",10) == 1) SetCastleData getarg(1)+".gat",18,@SGuardian;
+ if (GetCastleData(getarg(1)+".gat",11) == 1) SetCastleData getarg(1)+".gat",19,@SGuardian;
+ if (GetCastleData(getarg(1)+".gat",12) == 1) SetCastleData getarg(1)+".gat",20,@SGuardian;
+ if (GetCastleData(getarg(1)+".gat",13) == 1) SetCastleData getarg(1)+".gat",21,@AGuardian;
+ if (GetCastleData(getarg(1)+".gat",14) == 1) SetCastleData getarg(1)+".gat",22,@AGuardian;
+ if (GetCastleData(getarg(1)+".gat",15) == 1) SetCastleData getarg(1)+".gat",23,@KGuardian;
+ if (GetCastleData(getarg(1)+".gat",16) == 1) SetCastleData getarg(1)+".gat",24,@KGuardian;
+ if (GetCastleData(getarg(1)+".gat",17) == 1) SetCastleData getarg(1)+".gat",25,@KGuardian;
+
+ mes "You have invested successfully.";
+ return 0;
+
+ //=========================
+ M_Guard:
+ //=========
+ mes "[ "+getarg(0)+" ]";
+ if (getgdskilllv(@GID,10002) == 0){
+ mes "I'm sorry Master but you cannot install any guardians right now. Your guild must learn the Guild skill ^5533FFGuardian Research^000000 first.";
+ mes "Guardian Installation has been cancelled.";
+ return 0;
+ }
+
+ set @Defence,GetCastleData(getarg(1)+".gat",3);
+ set @Guardian0,guardianinfo(0);
+ set @Guardian1,guardianinfo(1);
+ set @Guardian2,guardianinfo(2);
+ set @Guardian3,guardianinfo(3);
+ set @Guardian4,guardianinfo(4);
+ set @Guardian5,guardianinfo(5);
+ set @Guardian6,guardianinfo(6);
+ set @Guardian7,guardianinfo(7);
+ set @AGuardian, 28634 + (@Defence*2000);
+ set @KGuardian, 30214 + (@Defence*2000);
+ set @SGuardian, 15670 + (@Defence*2000);
+ //set @AGuardian,strmobinfo(4,1285) + (@Defence*2000);
+ //set @KGuardian,strmobinfo(4,1286) + (@Defence*2000);
+ //set @SGuardian,strmobinfo(4,1287) + (@Defence*2000);
+
+ //uncomment the following line to disable guardians Installation during WoE
+ //if(agitcheck(0) != 0) goto L_CantGuard;
+ mes "Would you like to install a guardian? Guardians will protect the guild base from enemies.";
+ mes "Please choose a guardian.";
+ next;
+
+ menu "Soldier Guardian (" + @Guardian0 + "/" + @SGuardian + ")",L4_1,
+ "Soldier Guardian (" + @Guardian1 + "/" + @SGuardian + ")",L4_2,
+ "Soldier Guardian (" + @Guardian2 + "/" + @SGuardian + ")",L4_3,
+ "Archer Guardian (" + @Guardian3 + "/" + @AGuardian + ")",L4_4,
+ "Archer Guardian (" + @Guardian4 + "/" + @AGuardian + ")",L4_5,
+ "Knight Guardian (" + @Guardian5 + "/" + @KGuardian + ")",L4_6,
+ "Knight Guardian (" + @Guardian6 + "/" + @KGuardian + ")",L4_7,
+ "Knight Guardian (" + @Guardian7 + "/" + @KGuardian + ")",L4_8;
+
+ L4_1:
+ if (GetCastleData(getarg(1)+".gat",10) == 1) goto L_GotGuard;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData(getarg(1)+".gat",11) == 1) goto L_GotGuard;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData(getarg(1)+".gat",12) == 1) goto L_GotGuard;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData(getarg(1)+".gat",13) == 1) goto L_GotGuard;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData(getarg(1)+".gat",14) == 1) goto L_GotGuard;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData(getarg(1)+".gat",15) == 1) goto L_GotGuard;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData(getarg(1)+".gat",16) == 1) goto L_GotGuard;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData(getarg(1)+".gat",17) == 1) goto L_GotGuard;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ L4_9:
+ mes "[ "+getarg(0)+" ]";
+ mes "Would you really like to install a guardian? You need ^5533FF10,000 zeny^000000 to install one....";
+ next;
+ menu "Install",-, "Cancel",M_End;
+
+ if (Zeny < 10000){
+ mes "[ "+getarg(0)+" ]";
+ mes "I'm sorry Master, but you do not have enough zeny for a Guardian.";
+ return 0;
+ }
+ set Zeny,Zeny-10000;
+ SetCastleData getarg(1)+".gat",@GDnum,1;
+ SetCastleData getarg(1)+".gat",@GDnum2,@GuardianHP;
+ return 1;
+
+ L_GotGuard:
+ mes "[ "+getarg(0)+" ]";
+ mes "Excuse me Master, but that guardian has already been installed.....";
+ emotion 4;
+ return 0;
+ L_CantGuard:
+ mes "Master.... don't you know that we can't install guardians during the War Of Emperium?!!";
+ emotion 4;
+ return 0;
+
+ //===========================
+ M_Kaf:
+ //======
+ mes "[ "+getarg(0)+" ]";
+ if (GetCastleData(getarg(1)+".gat",9) == 1) goto L_Dismiss;
+ if (getgdskilllv(@GID,10001) == 0){
+ mes "Master, you don't have a contract with the Kafra Service Company.";
+ mes "In order to hire a Kafra, you must first learn the Guild skill ^5533FFContract With Kafra^000000.";
+ return 0;
+ }
+
+ L_Hire:
+ mes "Would you like to employ the services of a Kafra? You will need ^5533FF10,000 Zeny^000000 to do so... ";
+ next;
+ menu "Employ Kafra.",-,"Cancel",sM_KafEnd;
+
+ mes "[ "+getarg(0)+" ]";
+ if (Zeny < 10000){
+ mes "Master, you do not have enough money to employ a Kafra. Employment has been cancelled.";
+ return 0;
+ }
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#"+getarg(4);
+ SetCastleData getarg(1)+".gat",9,1;
+ mes "You have created a contract with the Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I'm here to provide you with helpful service! I'll do the best I can to serve you.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ "+getarg(0)+" ]";
+ //mes "Your employment contract lasts ^5533FF1 month^000000. After this term is over you will have to create a new contract.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ return 0;
+
+ sM_KafEnd:
+ mes "[ "+getarg(0)+" ]";
+ mes "As you wish Master. But I suggest we get a Kafra as soon as possible!";
+ return 0;
+
+ L_Dismiss:
+ mes "Would you like to dismiss the current Kafra?";
+ next;
+ menu "Dismissal",-,"Cancel",sM_KafEnd2;
+
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I done anything wrong? If I did, will you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",ssM_KafEnd2;
+
+ mes "[ Kafra Service ]";
+ mes "It's unfortunate that I won't be able to serve your guild anymore....";
+ next;
+ disablenpc "Kafra Service#"+getarg(4);
+ SetCastleData getarg(1)+".gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ "+getarg(0)+" ]";
+ mes "The Kafra has been dismissed. But... we should really get a Kafra as soon as possible!";
+ return 0;
+ ssM_KafEnd2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ return 0;
+ sM_KafEnd2:
+ mes "[ "+getarg(0)+" ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ return 0;
+
+ //=========================
+ M_Treas:
+ //========
+ mes "[ "+getarg(0)+" ]";
+ mes "Would you to go to our Treasure Room? Only you, the Guild Master, are allowed to enter this room.";
+ next;
+ menu "Enter Treasure room.",-,"Cancel",sM_TresEnd;
+
+ mes "[ "+getarg(0)+" ]";
+ mes "Please follow me through the secret passage way.";
+ mes "You must pull down on the secret switch in order to get out.";
+ next;
+ warp getarg(1)+".gat",getarg(2),getarg(3);
+ return 0;
+ sM_TresEnd:
+ mes "[ "+getarg(0)+" ]";
+ mes "The goods are produced everyday.";
+ mes "You should get them whenever you can because they might dissapear if you take them at the wrong time.";
+ return 0;
+
+
+ //==========================
+ M_End:
+ //=======
+ mes "[ "+getarg(0)+" ]";
+ mes "As you wish, master.";
+ return 0;
+}
diff --git a/npc/guild/gldfunc_treasure.txt b/npc/guild/gldfunc_treasure.txt
index 9118e8a82..cc3894ec2 100644
--- a/npc/guild/gldfunc_treasure.txt
+++ b/npc/guild/gldfunc_treasure.txt
@@ -1,85 +1,85 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Treasure Room Functions
-//===== By: ==================================================
-//= holyAngelX (1.0) Akaru and ho|yAnge|X (1.1)
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= eAthena 1+; RO Episode 4+
-//===== Description: =========================================
-//= F_GldTreas spawns treasure chests used by the guild master.
-//= F_GldTreasSw allows the player to get out of the treasure room.
-//==============================================
-//= Break down of arguments used in the F_GldTreas:
-//= arg(0): name of guild castle
-//= arg(1): name of script that called the function
-//= arg(2): the box number amount
-//= arg(3): temp variable (count)
-//= arg(4): temp variable (box/monster id#)
-//= arg(5): box/monster id#
-//= arg(6): x1 coordinate for areamonster call
-//= arg(7): y1 coordinate for areamonster call
-//= arg(8): x2 coordinate for areamonster call
-//= arg(9): y1 coordinate for areamonster call
-//=
-//= Break down of arguments used in the F_GldTreasSw:
-//= arg(0): name of guild castle.
-//= arg(1): x1 coordinate for warp back to guild castle
-//= arg(2): y1 coordinate for warp back to guild castle
-//===== Additional Comments: =================================
-//= 1.2 Treasure room Spawn, and Treasure room Switch scripts now use these functions.[kobra_k88]
-//= 1.2a Function now returns to script that called it. Removed TreasureSpawn2.
-//= Changed back to using specific global variables for number of boxes and the box id. [kobra_k88]
-//= 1.2b Added a check to allow un broken treasure chests to respawn after map server restart.[kobra_k88]
-//= 1.3 Fixed treasure boxes spawn. (Unrolled one loop a bit) [Lupus]
-//= 1.4 New number of Treasure Boxes per castle: 25 at 100 Economic pts [Lupus]
-//= So you get your first chest only when your Economic Pts >= 4
-//= 1.5 Fixed treasure number 'round exploit' [Lupus]
-//= 1.6 to Aegis X.2 formula 4..24 Treasure Chests [Lupus]
-//= 1.7 Box Count fix by Zoc. Now it spawns 1st/2nd Treasure Chest 50%/50% [Lupus]
-//= 1.8 Official Treasure Spawn in Novice Castles. Had to add +1 in odd/even formula to leave correct ID of NG Treasure Box 8) [Lupus]
-//============================================================
-
-
-//================================================
-// Treasure Spawning Function
-//================================================
-function script F_GldTreas {
- if(getarg(10) == 1) goto L_SPAWN;
- setcastledata getarg(0)+".gat",4,0;
- setcastledata getarg(0)+".gat",5,0;
- killmonster getarg(0)+".gat","Treasure_"+getarg(1)+"::OnDied";
- if(GetCastleData(getarg(0)+".gat",2) > 100 || GetCastleData(getarg(0)+".gat",1) == 0) return;
- //sets the counter variable = to the box number amount
- if(getarg(0) == "nguild_prt" || getarg(0) == "nguild_alde" || getarg(0) == "nguild_gef" || getarg(0) == "nguild_pay" ) {
- //Novice Castles can't have more than 1 Treasure Chest
- set getarg(2),1;
- }else{
- set getarg(2),GetCastleData(getarg(0)+".gat",2)/5+4;
- }
- if (getarg(2) <= 0) return;
- set getarg(3), getarg(2); //sets the counter variable = to the box number amount
-
-L_SPAWN:
- set getarg(4), getarg(5)+((getarg(3)+1) & 1); //sets the box id variable = to the box id
- areamonster getarg(0)+".gat",getarg(6),getarg(7),getarg(8),getarg(9),"Treasure Chest",getarg(4),1,"Treasure_"+getarg(1)+"::OnDied";
- set getarg(3), getarg(3) - 1;
- if(getarg(3) > 0) goto L_SPAWN;
- return;
-}
-
-//==============================================================
-// Treasure Room Switch
-//===============================================================
-function script F_GldTreasSw {
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",M_1,"No",-;
- close;
-
- M_1:
- warp getarg(0)+".gat",getarg(1),getarg(2);
- return;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Guild Treasure Room Functions
+//===== By: ==================================================
+//= holyAngelX (1.0) Akaru and ho|yAnge|X (1.1)
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= eAthena 1+; RO Episode 4+
+//===== Description: =========================================
+//= F_GldTreas spawns treasure chests used by the guild master.
+//= F_GldTreasSw allows the player to get out of the treasure room.
+//==============================================
+//= Break down of arguments used in the F_GldTreas:
+//= arg(0): name of guild castle
+//= arg(1): name of script that called the function
+//= arg(2): the box number amount
+//= arg(3): temp variable (count)
+//= arg(4): temp variable (box/monster id#)
+//= arg(5): box/monster id#
+//= arg(6): x1 coordinate for areamonster call
+//= arg(7): y1 coordinate for areamonster call
+//= arg(8): x2 coordinate for areamonster call
+//= arg(9): y1 coordinate for areamonster call
+//=
+//= Break down of arguments used in the F_GldTreasSw:
+//= arg(0): name of guild castle.
+//= arg(1): x1 coordinate for warp back to guild castle
+//= arg(2): y1 coordinate for warp back to guild castle
+//===== Additional Comments: =================================
+//= 1.2 Treasure room Spawn, and Treasure room Switch scripts now use these functions.[kobra_k88]
+//= 1.2a Function now returns to script that called it. Removed TreasureSpawn2.
+//= Changed back to using specific global variables for number of boxes and the box id. [kobra_k88]
+//= 1.2b Added a check to allow un broken treasure chests to respawn after map server restart.[kobra_k88]
+//= 1.3 Fixed treasure boxes spawn. (Unrolled one loop a bit) [Lupus]
+//= 1.4 New number of Treasure Boxes per castle: 25 at 100 Economic pts [Lupus]
+//= So you get your first chest only when your Economic Pts >= 4
+//= 1.5 Fixed treasure number 'round exploit' [Lupus]
+//= 1.6 to Aegis X.2 formula 4..24 Treasure Chests [Lupus]
+//= 1.7 Box Count fix by Zoc. Now it spawns 1st/2nd Treasure Chest 50%/50% [Lupus]
+//= 1.8 Official Treasure Spawn in Novice Castles. Had to add +1 in odd/even formula to leave correct ID of NG Treasure Box 8) [Lupus]
+//============================================================
+
+
+//================================================
+// Treasure Spawning Function
+//================================================
+function script F_GldTreas {
+ if(getarg(10) == 1) goto L_SPAWN;
+ setcastledata getarg(0)+".gat",4,0;
+ setcastledata getarg(0)+".gat",5,0;
+ killmonster getarg(0)+".gat","Treasure_"+getarg(1)+"::OnDied";
+ if(GetCastleData(getarg(0)+".gat",2) > 100 || GetCastleData(getarg(0)+".gat",1) == 0) return;
+ //sets the counter variable = to the box number amount
+ if(getarg(0) == "nguild_prt" || getarg(0) == "nguild_alde" || getarg(0) == "nguild_gef" || getarg(0) == "nguild_pay" ) {
+ //Novice Castles can't have more than 1 Treasure Chest
+ set getarg(2),1;
+ }else{
+ set getarg(2),GetCastleData(getarg(0)+".gat",2)/5+4;
+ }
+ if (getarg(2) <= 0) return;
+ set getarg(3), getarg(2); //sets the counter variable = to the box number amount
+
+L_SPAWN:
+ set getarg(4), getarg(5)+((getarg(3)+1) & 1); //sets the box id variable = to the box id
+ areamonster getarg(0)+".gat",getarg(6),getarg(7),getarg(8),getarg(9),"Treasure Chest",getarg(4),1,"Treasure_"+getarg(1)+"::OnDied";
+ set getarg(3), getarg(3) - 1;
+ if(getarg(3) > 0) goto L_SPAWN;
+ return;
+}
+
+//==============================================================
+// Treasure Room Switch
+//===============================================================
+function script F_GldTreasSw {
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",M_1,"No",-;
+ close;
+
+ M_1:
+ warp getarg(0)+".gat",getarg(1),getarg(2);
+ return;
+}
diff --git a/npc/guild/nguild/nguild_dunsw.txt b/npc/guild/nguild/nguild_dunsw.txt
index 0109cf71e..0c88d0f0c 100644
--- a/npc/guild/nguild/nguild_dunsw.txt
+++ b/npc/guild/nguild/nguild_dunsw.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for NGuild Castles
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to the guild dungeon
-//===== Additional Comments: =================================
-//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ===============================================
-nguild_alde.gat,212,181,0 script Switch#DunN01 111,{
- callfunc "F_GldDunSw","nguild_alde","02",32,122;
- close;
-}
-
-// Castle 2 ===============================================
-nguild_gef.gat,78,84,0 script Switch#DunN02 111,{
- callfunc "F_GldDunSw","nguild_gef","04",39,258;
- close;
-}
-
-// Castle 3 ===============================================
-nguild_pay.gat,101,25,0 script Switch#DunN03 111,{
- callfunc "F_GldDunSw","nguild_pay","01",186,165;
- close;
-}
-
-// Castle 4 ===============================================
-nguild_prt.gat,94,200,0 script Switch#DunN04 111,{
- callfunc "F_GldDunSw","nguild_prt","03",28,251;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Dungeon Switch for NGuild Castles
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to the guild dungeon
+//===== Additional Comments: =================================
+//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ===============================================
+nguild_alde.gat,212,181,0 script Switch#DunN01 111,{
+ callfunc "F_GldDunSw","nguild_alde","02",32,122;
+ close;
+}
+
+// Castle 2 ===============================================
+nguild_gef.gat,78,84,0 script Switch#DunN02 111,{
+ callfunc "F_GldDunSw","nguild_gef","04",39,258;
+ close;
+}
+
+// Castle 3 ===============================================
+nguild_pay.gat,101,25,0 script Switch#DunN03 111,{
+ callfunc "F_GldDunSw","nguild_pay","01",186,165;
+ close;
+}
+
+// Castle 4 ===============================================
+nguild_prt.gat,94,200,0 script Switch#DunN04 111,{
+ callfunc "F_GldDunSw","nguild_prt","03",28,251;
+ close;
+}
diff --git a/npc/guild/nguild/nguild_ev_agit.txt b/npc/guild/nguild/nguild_ev_agit.txt
index fba0c487f..c9c295f28 100644
--- a/npc/guild/nguild/nguild_ev_agit.txt
+++ b/npc/guild/nguild/nguild_ev_agit.txt
@@ -1,119 +1,119 @@
-//===== eAthena Script =======================================
-//= War of Emperium - NGuild Wars Events
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers for NGuild Wars
-//===== Additional Comments: =================================
-// Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//============================================================
-
-
-// Castle 1 ================================================================
-nguild_alde.gat,0,0,0 script Agit_N01 -1,{
-OnInterIfInitOnce:
- GetCastleData "nguild_alde.gat",0,"::OnRecvCastleN01";
- end;
-OnRecvCastleN01:
- RequestGuildInfo GetCastleData("nguild_alde.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","nguild_alde","N01",216,24;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","nguild_alde","N01";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","nguild_alde","N01";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "nguild_alde.gat",GetCastleData("nguild_alde.gat",1),6;
- Monster "nguild_alde.gat",216,24,"EMPERIUM",1288,1,"Agit_N01::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","nguild_alde","N01";
- end;
-}
-
-// Castle 2 ================================================================
-nguild_gef.gat,0,0,0 script Agit_N02 -1,{
-OnInterIfInitOnce:
- GetCastleData "nguild_gef.gat",0,"::OnRecvCastleN02";
- end;
-OnRecvCastleN02:
- RequestGuildInfo GetCastleData("nguild_gef.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","nguild_gef","N02",198,182;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","nguild_gef","N02";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","nguild_gef","N02";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "nguild_gef.gat",GetCastleData("nguild_gef.gat",1),6;
- Monster "nguild_gef.gat",198,182,"EMPERIUM",1288,1,"Agit_N02::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","nguild_gef","N02";
- end;
-}
-
-// Castle 3 ================================================================
-nguild_pay.gat,0,0,0 script Agit_N03 -1,{
-OnInterIfInitOnce:
- GetCastleData "nguild_pay.gat",0,"::OnRecvCastleN03";
- end;
-OnRecvCastleN03:
- RequestGuildInfo GetCastleData("nguild_pay.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","nguild_pay","N03",139,139;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","nguild_pay","N03";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","nguild_pay","N03";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "nguild_pay.gat",GetCastleData("nguild_pay.gat",1),6;
- Monster "nguild_pay.gat",139,139,"EMPERIUM",1288,1,"Agit_N03::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","nguild_pay","N03";
- end;
-}
-
-// Castle 4 ================================================================
-nguild_prt.gat,0,0,0 script Agit_N04 -1,{
-OnInterIfInitOnce:
- GetCastleData "nguild_prt.gat",0,"::OnRecvCastleN04";
- end;
-OnRecvCastleN04:
- RequestGuildInfo GetCastleData("nguild_prt.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","nguild_prt","N04",197,197;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","nguild_prt","N04";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","nguild_prt","N04";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "nguild_prt.gat",GetCastleData("nguild_prt.gat",1),6;
- Monster "nguild_prt.gat",197,197,"EMPERIUM",1288,1,"Agit_N04::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","nguild_prt","N04";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - NGuild Wars Events
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers for NGuild Wars
+//===== Additional Comments: =================================
+// Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//============================================================
+
+
+// Castle 1 ================================================================
+nguild_alde.gat,0,0,0 script Agit_N01 -1,{
+OnInterIfInitOnce:
+ GetCastleData "nguild_alde.gat",0,"::OnRecvCastleN01";
+ end;
+OnRecvCastleN01:
+ RequestGuildInfo GetCastleData("nguild_alde.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","nguild_alde","N01",216,24;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","nguild_alde","N01";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","nguild_alde","N01";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "nguild_alde.gat",GetCastleData("nguild_alde.gat",1),6;
+ Monster "nguild_alde.gat",216,24,"EMPERIUM",1288,1,"Agit_N01::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","nguild_alde","N01";
+ end;
+}
+
+// Castle 2 ================================================================
+nguild_gef.gat,0,0,0 script Agit_N02 -1,{
+OnInterIfInitOnce:
+ GetCastleData "nguild_gef.gat",0,"::OnRecvCastleN02";
+ end;
+OnRecvCastleN02:
+ RequestGuildInfo GetCastleData("nguild_gef.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","nguild_gef","N02",198,182;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","nguild_gef","N02";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","nguild_gef","N02";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "nguild_gef.gat",GetCastleData("nguild_gef.gat",1),6;
+ Monster "nguild_gef.gat",198,182,"EMPERIUM",1288,1,"Agit_N02::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","nguild_gef","N02";
+ end;
+}
+
+// Castle 3 ================================================================
+nguild_pay.gat,0,0,0 script Agit_N03 -1,{
+OnInterIfInitOnce:
+ GetCastleData "nguild_pay.gat",0,"::OnRecvCastleN03";
+ end;
+OnRecvCastleN03:
+ RequestGuildInfo GetCastleData("nguild_pay.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","nguild_pay","N03",139,139;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","nguild_pay","N03";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","nguild_pay","N03";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "nguild_pay.gat",GetCastleData("nguild_pay.gat",1),6;
+ Monster "nguild_pay.gat",139,139,"EMPERIUM",1288,1,"Agit_N03::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","nguild_pay","N03";
+ end;
+}
+
+// Castle 4 ================================================================
+nguild_prt.gat,0,0,0 script Agit_N04 -1,{
+OnInterIfInitOnce:
+ GetCastleData "nguild_prt.gat",0,"::OnRecvCastleN04";
+ end;
+OnRecvCastleN04:
+ RequestGuildInfo GetCastleData("nguild_prt.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","nguild_prt","N04",197,197;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","nguild_prt","N04";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","nguild_prt","N04";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "nguild_prt.gat",GetCastleData("nguild_prt.gat",1),6;
+ Monster "nguild_prt.gat",197,197,"EMPERIUM",1288,1,"Agit_N04::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","nguild_prt","N04";
+ end;
+}
diff --git a/npc/guild/nguild/nguild_flags.txt b/npc/guild/nguild/nguild_flags.txt
index b13509230..d2cacb4a8 100644
--- a/npc/guild/nguild/nguild_flags.txt
+++ b/npc/guild/nguild/nguild_flags.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= War of Emperium N Guild Flags
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= WoE flag scripts. Display guild emblems on flags.
-//===== Additional Comments: =================================
-// Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-// 1.1 Inner Flags don't teleport you to your HQ anymore [Lupus]
-//============================================================
-
-
-//============================================================================//
-// Castle 1
-//============================================================================//
-n_castle.gat,110,96,1 script NGuild Aldebaran#a1-1 722,{
- callfunc "F_Flags","Al De Baran","nguild_alde",218,170,1;
- close;
-
-OnRecvCastleN01:
- FlagEmblem GetCastleData("nguild_alde.gat",1);
- end;
-}
-
-nguild_alde.gat,30,248,4 script NGuild Aldebaran#a1-6::NGuildAlde 722,{
- callfunc "F_Flags","Al De Baran","nguild_alde",218,170,0;
- close;
-
-OnRecvCastleN01:
- FlagEmblem GetCastleData("nguild_alde.gat",1);
- end;
-}
-// In Castle ============================================
-nguild_alde.gat,30,246,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-7 722
-nguild_alde.gat,37,248,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-8 722
-nguild_alde.gat,37,246,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-9 722
-nguild_alde.gat,95,80,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-10 722
-nguild_alde.gat,95,59,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-11 722
-nguild_alde.gat,62,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-12 722
-nguild_alde.gat,70,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-13 722
-nguild_alde.gat,74,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-14 722
-nguild_alde.gat,62,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-15 722
-nguild_alde.gat,66,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-16 722
-nguild_alde.gat,70,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-17 722
-nguild_alde.gat,74,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-18 722
-nguild_alde.gat,203,150,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-19 722
-nguild_alde.gat,210,150,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-20 722
-
-
-
-
-//============================================================================//
-// Castle 2
-//============================================================================//
-n_castle.gat,110,109,3 script NGuild Geffen#g1-1 722,{
- callfunc "F_Flags","Geffen","nguild_gef",83,47,1;
- close;
-
-OnRecvCastleN02:
- FlagEmblem GetCastleData("nguild_gef.gat",1);
- end;
-}
-
-nguild_gef.gat,28,157,4 script NGuild Geffen#g1-6::NGuildGef 722,{
- callfunc "F_Flags","Geffen","nguild_gef",83,47,0;
- close;
-
-OnRecvCastleN02:
- FlagEmblem GetCastleData("nguild_gef.gat",1);
- end;
-}
-// In Castle =============================================
-nguild_gef.gat,32,157,4 duplicate(NGuildGef) NGuild Geffen#g1-7 722
-nguild_gef.gat,22,156,5 duplicate(NGuildGef) NGuild Geffen#g1-8 722
-nguild_gef.gat,68,185,3 duplicate(NGuildGef) NGuild Geffen#g1-9 722
-nguild_gef.gat,17,171,5 duplicate(NGuildGef) NGuild Geffen#g1-10 722
-nguild_gef.gat,59,16,4 duplicate(NGuildGef) NGuild Geffen#g1-11 722
-nguild_gef.gat,64,16,4 duplicate(NGuildGef) NGuild Geffen#g1-12 722
-
-
-
-//============================================================================//
-// Castle 3
-//============================================================================//
-n_castle.gat,94,109,5 script NGuild Payon#f1-1 722,{
- callfunc "F_Flags","Payon","nguild_pay",87,29,1;
- close;
-
-OnRecvCastleN03:
- FlagEmblem GetCastleData("nguild_pay.gat",1);
- end;
-}
-
-nguild_pay.gat,238,67,4 script NGuild Payon#f1-6::NGuildPay 722,{
- callfunc "F_Flags","Payon","nguild_pay",87,29,0;
- close;
-
-OnRecvCastleN03:
- FlagEmblem GetCastleData("nguild_pay.gat",1);
- end;
-}
-// In Castle ===============================================
-nguild_pay.gat,238,67,4 duplicate(NGuildPay) NGuild Payon#f1-6 722
-nguild_pay.gat,233,67,4 duplicate(NGuildPay) NGuild Payon#f1-7 722
-nguild_pay.gat,221,123,4 duplicate(NGuildPay) NGuild Payon#f1-8 722
-nguild_pay.gat,221,116,4 duplicate(NGuildPay) NGuild Payon#f1-9 722
-nguild_pay.gat,206,108,4 duplicate(NGuildPay) NGuild Payon#f1-10 722
-nguild_pay.gat,212,108,4 duplicate(NGuildPay) NGuild Payon#f1-11 722
-
-
-
-
-//=============================================================================//
-// Castle 4
-//=============================================================================//
-n_castle.gat,94,96,7 script NGuild Prontera#p1-1 722,{
- callfunc "F_Flags","Prontera","nguild_prt",97,174,1;
- close;
-
-OnRecvCastleN04:
- FlagEmblem GetCastleData("nguild_prt.gat",1);
- end;
-}
-
-nguild_prt.gat,58,56,4 script NGuild Prontera#p1-7::NGuildPrt 722,{
- callfunc "F_Flags","Prontera","nguild_prt",97,174,0;
- close;
-
-OnRecvCastleN04:
- FlagEmblem GetCastleData("nguild_prt.gat",1);
- end;
-}
-// In Castle =============================================
-nguild_prt.gat,64,56,4 duplicate(NGuildPrt) NGuild Prontera#p1-8 722
-nguild_prt.gat,76,32,4 duplicate(NGuildPrt) NGuild Prontera#p1-9 722
-nguild_prt.gat,84,32,4 duplicate(NGuildPrt) NGuild Prontera#p1-10 722
-nguild_prt.gat,94,39,4 duplicate(NGuildPrt) NGuild Prontera#p1-11 722
-nguild_prt.gat,94,24,4 duplicate(NGuildPrt) NGuild Prontera#p1-12 722
-nguild_prt.gat,73,14,4 duplicate(NGuildPrt) NGuild Prontera#p1-13 722
-nguild_prt.gat,73,6,4 duplicate(NGuildPrt) NGuild Prontera#p1-14 722
-nguild_prt.gat,55,46,4 duplicate(NGuildPrt) NGuild Prontera#p1-15 722
-nguild_prt.gat,45,46,4 duplicate(NGuildPrt) NGuild Prontera#p1-16 722
+//===== eAthena Script =======================================
+//= War of Emperium N Guild Flags
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= WoE flag scripts. Display guild emblems on flags.
+//===== Additional Comments: =================================
+// Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+// 1.1 Inner Flags don't teleport you to your HQ anymore [Lupus]
+//============================================================
+
+
+//============================================================================//
+// Castle 1
+//============================================================================//
+n_castle.gat,110,96,1 script NGuild Aldebaran#a1-1 722,{
+ callfunc "F_Flags","Al De Baran","nguild_alde",218,170,1;
+ close;
+
+OnRecvCastleN01:
+ FlagEmblem GetCastleData("nguild_alde.gat",1);
+ end;
+}
+
+nguild_alde.gat,30,248,4 script NGuild Aldebaran#a1-6::NGuildAlde 722,{
+ callfunc "F_Flags","Al De Baran","nguild_alde",218,170,0;
+ close;
+
+OnRecvCastleN01:
+ FlagEmblem GetCastleData("nguild_alde.gat",1);
+ end;
+}
+// In Castle ============================================
+nguild_alde.gat,30,246,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-7 722
+nguild_alde.gat,37,248,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-8 722
+nguild_alde.gat,37,246,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-9 722
+nguild_alde.gat,95,80,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-10 722
+nguild_alde.gat,95,59,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-11 722
+nguild_alde.gat,62,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-12 722
+nguild_alde.gat,70,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-13 722
+nguild_alde.gat,74,75,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-14 722
+nguild_alde.gat,62,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-15 722
+nguild_alde.gat,66,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-16 722
+nguild_alde.gat,70,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-17 722
+nguild_alde.gat,74,64,2 duplicate(NGuildAlde) NGuild Aldebaran#a1-18 722
+nguild_alde.gat,203,150,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-19 722
+nguild_alde.gat,210,150,4 duplicate(NGuildAlde) NGuild Aldebaran#a1-20 722
+
+
+
+
+//============================================================================//
+// Castle 2
+//============================================================================//
+n_castle.gat,110,109,3 script NGuild Geffen#g1-1 722,{
+ callfunc "F_Flags","Geffen","nguild_gef",83,47,1;
+ close;
+
+OnRecvCastleN02:
+ FlagEmblem GetCastleData("nguild_gef.gat",1);
+ end;
+}
+
+nguild_gef.gat,28,157,4 script NGuild Geffen#g1-6::NGuildGef 722,{
+ callfunc "F_Flags","Geffen","nguild_gef",83,47,0;
+ close;
+
+OnRecvCastleN02:
+ FlagEmblem GetCastleData("nguild_gef.gat",1);
+ end;
+}
+// In Castle =============================================
+nguild_gef.gat,32,157,4 duplicate(NGuildGef) NGuild Geffen#g1-7 722
+nguild_gef.gat,22,156,5 duplicate(NGuildGef) NGuild Geffen#g1-8 722
+nguild_gef.gat,68,185,3 duplicate(NGuildGef) NGuild Geffen#g1-9 722
+nguild_gef.gat,17,171,5 duplicate(NGuildGef) NGuild Geffen#g1-10 722
+nguild_gef.gat,59,16,4 duplicate(NGuildGef) NGuild Geffen#g1-11 722
+nguild_gef.gat,64,16,4 duplicate(NGuildGef) NGuild Geffen#g1-12 722
+
+
+
+//============================================================================//
+// Castle 3
+//============================================================================//
+n_castle.gat,94,109,5 script NGuild Payon#f1-1 722,{
+ callfunc "F_Flags","Payon","nguild_pay",87,29,1;
+ close;
+
+OnRecvCastleN03:
+ FlagEmblem GetCastleData("nguild_pay.gat",1);
+ end;
+}
+
+nguild_pay.gat,238,67,4 script NGuild Payon#f1-6::NGuildPay 722,{
+ callfunc "F_Flags","Payon","nguild_pay",87,29,0;
+ close;
+
+OnRecvCastleN03:
+ FlagEmblem GetCastleData("nguild_pay.gat",1);
+ end;
+}
+// In Castle ===============================================
+nguild_pay.gat,238,67,4 duplicate(NGuildPay) NGuild Payon#f1-6 722
+nguild_pay.gat,233,67,4 duplicate(NGuildPay) NGuild Payon#f1-7 722
+nguild_pay.gat,221,123,4 duplicate(NGuildPay) NGuild Payon#f1-8 722
+nguild_pay.gat,221,116,4 duplicate(NGuildPay) NGuild Payon#f1-9 722
+nguild_pay.gat,206,108,4 duplicate(NGuildPay) NGuild Payon#f1-10 722
+nguild_pay.gat,212,108,4 duplicate(NGuildPay) NGuild Payon#f1-11 722
+
+
+
+
+//=============================================================================//
+// Castle 4
+//=============================================================================//
+n_castle.gat,94,96,7 script NGuild Prontera#p1-1 722,{
+ callfunc "F_Flags","Prontera","nguild_prt",97,174,1;
+ close;
+
+OnRecvCastleN04:
+ FlagEmblem GetCastleData("nguild_prt.gat",1);
+ end;
+}
+
+nguild_prt.gat,58,56,4 script NGuild Prontera#p1-7::NGuildPrt 722,{
+ callfunc "F_Flags","Prontera","nguild_prt",97,174,0;
+ close;
+
+OnRecvCastleN04:
+ FlagEmblem GetCastleData("nguild_prt.gat",1);
+ end;
+}
+// In Castle =============================================
+nguild_prt.gat,64,56,4 duplicate(NGuildPrt) NGuild Prontera#p1-8 722
+nguild_prt.gat,76,32,4 duplicate(NGuildPrt) NGuild Prontera#p1-9 722
+nguild_prt.gat,84,32,4 duplicate(NGuildPrt) NGuild Prontera#p1-10 722
+nguild_prt.gat,94,39,4 duplicate(NGuildPrt) NGuild Prontera#p1-11 722
+nguild_prt.gat,94,24,4 duplicate(NGuildPrt) NGuild Prontera#p1-12 722
+nguild_prt.gat,73,14,4 duplicate(NGuildPrt) NGuild Prontera#p1-13 722
+nguild_prt.gat,73,6,4 duplicate(NGuildPrt) NGuild Prontera#p1-14 722
+nguild_prt.gat,55,46,4 duplicate(NGuildPrt) NGuild Prontera#p1-15 722
+nguild_prt.gat,45,46,4 duplicate(NGuildPrt) NGuild Prontera#p1-16 722
diff --git a/npc/guild/nguild/nguild_guardians.txt b/npc/guild/nguild/nguild_guardians.txt
index b91dee519..0a8516bca 100644
--- a/npc/guild/nguild/nguild_guardians.txt
+++ b/npc/guild/nguild/nguild_guardians.txt
@@ -1,89 +1,89 @@
-//===== eAthena Script =======================================
-//= War of Emperium - nguild guardians script
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Re-spawns guardians on server start if they have been
-//= purchased. Also announces when a guardian dies.
-//===== Additional Comments: =================================
-//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//============================================================
-
-
-//------------------------------------------------------------------------------
-nguild_alde.gat,216,24,0 script Guardian_N01 -1,{
-OnAgitInit:
- if (GetCastleData("nguild_alde.gat",10) == 1) guardian "nguild_alde.gat",18,219,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",0;
- if (GetCastleData("nguild_alde.gat",11) == 1) guardian "nguild_alde.gat",117,42,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",1;
- if (GetCastleData("nguild_alde.gat",12) == 1) guardian "nguild_alde.gat",207,153,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",2;
- if (GetCastleData("nguild_alde.gat",13) == 1) guardian "nguild_alde.gat",68,70,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",3;
- if (GetCastleData("nguild_alde.gat",14) == 1) guardian "nguild_alde.gat",187,140,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",4;
- if (GetCastleData("nguild_alde.gat",15) == 1) guardian "nguild_alde.gat",62,204,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",5;
- if (GetCastleData("nguild_alde.gat",16) == 1) guardian "nguild_alde.gat",113,100,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",6;
- if (GetCastleData("nguild_alde.gat",17) == 1) guardian "nguild_alde.gat",211,174,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "nguild_alde.gat","A Guardian Has Fallen",17;
- end;
-}
-
-//------------------------------------------------------------------------------
-nguild_gef.gat,198,182,0 script Guardian_N02 -1,{
-OnAgitInit:
- if (GetCastleData("nguild_gef.gat",10) == 1) guardian "nguild_gef.gat",30,178,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",0;
- if (GetCastleData("nguild_gef.gat",11) == 1) guardian "nguild_gef.gat",64,180,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",1;
- if (GetCastleData("nguild_gef.gat",12) == 1) guardian "nguild_gef.gat",61,25,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",2;
- if (GetCastleData("nguild_gef.gat",13) == 1) guardian "nguild_gef.gat",61,44,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",3;
- if (GetCastleData("nguild_gef.gat",14) == 1) guardian "nguild_gef.gat",189,43,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",4;
- if (GetCastleData("nguild_gef.gat",15) == 1) guardian "nguild_gef.gat",51,192,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",5;
- if (GetCastleData("nguild_gef.gat",16) == 1) guardian "nguild_gef.gat",49,67,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",6;
- if (GetCastleData("nguild_gef.gat",17) == 1) guardian "nguild_gef.gat",181,14,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "nguild_gef.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-nguild_pay.gat,139,139,0 script Guardian_N03 -1,{
-OnAgitInit:
- if (GetCastleData("nguild_pay.gat",10) == 1) guardian "nguild_pay.gat",210,120,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",0;
- if (GetCastleData("nguild_pay.gat",11) == 1) guardian "nguild_pay.gat",69,26,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",1;
- if (GetCastleData("nguild_pay.gat",12) == 1) guardian "nguild_pay.gat",23,141,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",2;
- if (GetCastleData("nguild_pay.gat",13) == 1) guardian "nguild_pay.gat",224,87,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",3;
- if (GetCastleData("nguild_pay.gat",14) == 1) guardian "nguild_pay.gat",81,45,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",4;
- if (GetCastleData("nguild_pay.gat",15) == 1) guardian "nguild_pay.gat",214,53,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",5;
- if (GetCastleData("nguild_pay.gat",16) == 1) guardian "nguild_pay.gat",69,26,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",6;
- if (GetCastleData("nguild_pay.gat",17) == 1) guardian "nguild_pay.gat",23,141,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "nguild_pay.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-nguild_prt.gat,197,197,0 script Guardian_N04 -1,{
-OnAgitInit:
- if (GetCastleData("nguild_prt.gat",10) == 1) guardian "nguild_prt.gat",196,92,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",0;
- if (GetCastleData("nguild_prt.gat",11) == 1) guardian "nguild_prt.gat",113,200,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",1;
- if (GetCastleData("nguild_prt.gat",12) == 1) guardian "nguild_prt.gat",111,186,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",2;
- if (GetCastleData("nguild_prt.gat",13) == 1) guardian "nguild_prt.gat",76,202,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",3;
- if (GetCastleData("nguild_prt.gat",14) == 1) guardian "nguild_prt.gat",90,26,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",4;
- if (GetCastleData("nguild_prt.gat",15) == 1) guardian "nguild_prt.gat",58,59,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",5;
- if (GetCastleData("nguild_prt.gat",16) == 1) guardian "nguild_prt.gat",112,200,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",6;
- if (GetCastleData("nguild_prt.gat",17) == 1) guardian "nguild_prt.gat",101,194,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "nguild_prt.gat","A Guardian Has Fallen",17;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - nguild guardians script
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Re-spawns guardians on server start if they have been
+//= purchased. Also announces when a guardian dies.
+//===== Additional Comments: =================================
+//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//============================================================
+
+
+//------------------------------------------------------------------------------
+nguild_alde.gat,216,24,0 script Guardian_N01 -1,{
+OnAgitInit:
+ if (GetCastleData("nguild_alde.gat",10) == 1) guardian "nguild_alde.gat",18,219,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",0;
+ if (GetCastleData("nguild_alde.gat",11) == 1) guardian "nguild_alde.gat",117,42,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",1;
+ if (GetCastleData("nguild_alde.gat",12) == 1) guardian "nguild_alde.gat",207,153,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",2;
+ if (GetCastleData("nguild_alde.gat",13) == 1) guardian "nguild_alde.gat",68,70,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",3;
+ if (GetCastleData("nguild_alde.gat",14) == 1) guardian "nguild_alde.gat",187,140,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",4;
+ if (GetCastleData("nguild_alde.gat",15) == 1) guardian "nguild_alde.gat",62,204,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",5;
+ if (GetCastleData("nguild_alde.gat",16) == 1) guardian "nguild_alde.gat",113,100,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",6;
+ if (GetCastleData("nguild_alde.gat",17) == 1) guardian "nguild_alde.gat",211,174,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "nguild_alde.gat","A Guardian Has Fallen",17;
+ end;
+}
+
+//------------------------------------------------------------------------------
+nguild_gef.gat,198,182,0 script Guardian_N02 -1,{
+OnAgitInit:
+ if (GetCastleData("nguild_gef.gat",10) == 1) guardian "nguild_gef.gat",30,178,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",0;
+ if (GetCastleData("nguild_gef.gat",11) == 1) guardian "nguild_gef.gat",64,180,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",1;
+ if (GetCastleData("nguild_gef.gat",12) == 1) guardian "nguild_gef.gat",61,25,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",2;
+ if (GetCastleData("nguild_gef.gat",13) == 1) guardian "nguild_gef.gat",61,44,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",3;
+ if (GetCastleData("nguild_gef.gat",14) == 1) guardian "nguild_gef.gat",189,43,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",4;
+ if (GetCastleData("nguild_gef.gat",15) == 1) guardian "nguild_gef.gat",51,192,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",5;
+ if (GetCastleData("nguild_gef.gat",16) == 1) guardian "nguild_gef.gat",49,67,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",6;
+ if (GetCastleData("nguild_gef.gat",17) == 1) guardian "nguild_gef.gat",181,14,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "nguild_gef.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+nguild_pay.gat,139,139,0 script Guardian_N03 -1,{
+OnAgitInit:
+ if (GetCastleData("nguild_pay.gat",10) == 1) guardian "nguild_pay.gat",210,120,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",0;
+ if (GetCastleData("nguild_pay.gat",11) == 1) guardian "nguild_pay.gat",69,26,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",1;
+ if (GetCastleData("nguild_pay.gat",12) == 1) guardian "nguild_pay.gat",23,141,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",2;
+ if (GetCastleData("nguild_pay.gat",13) == 1) guardian "nguild_pay.gat",224,87,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",3;
+ if (GetCastleData("nguild_pay.gat",14) == 1) guardian "nguild_pay.gat",81,45,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",4;
+ if (GetCastleData("nguild_pay.gat",15) == 1) guardian "nguild_pay.gat",214,53,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",5;
+ if (GetCastleData("nguild_pay.gat",16) == 1) guardian "nguild_pay.gat",69,26,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",6;
+ if (GetCastleData("nguild_pay.gat",17) == 1) guardian "nguild_pay.gat",23,141,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "nguild_pay.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+nguild_prt.gat,197,197,0 script Guardian_N04 -1,{
+OnAgitInit:
+ if (GetCastleData("nguild_prt.gat",10) == 1) guardian "nguild_prt.gat",196,92,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",0;
+ if (GetCastleData("nguild_prt.gat",11) == 1) guardian "nguild_prt.gat",113,200,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",1;
+ if (GetCastleData("nguild_prt.gat",12) == 1) guardian "nguild_prt.gat",111,186,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",2;
+ if (GetCastleData("nguild_prt.gat",13) == 1) guardian "nguild_prt.gat",76,202,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",3;
+ if (GetCastleData("nguild_prt.gat",14) == 1) guardian "nguild_prt.gat",90,26,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",4;
+ if (GetCastleData("nguild_prt.gat",15) == 1) guardian "nguild_prt.gat",58,59,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",5;
+ if (GetCastleData("nguild_prt.gat",16) == 1) guardian "nguild_prt.gat",112,200,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",6;
+ if (GetCastleData("nguild_prt.gat",17) == 1) guardian "nguild_prt.gat",101,194,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "nguild_prt.gat","A Guardian Has Fallen",17;
+ end;
+}
diff --git a/npc/guild/nguild/nguild_kafras.txt b/npc/guild/nguild/nguild_kafras.txt
index 941d6c0ce..63b6a88f1 100644
--- a/npc/guild/nguild/nguild_kafras.txt
+++ b/npc/guild/nguild/nguild_kafras.txt
@@ -1,53 +1,53 @@
-//===== eAthena Script =======================================
-//= War of Emperium Kafras for N Guild Castles
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 5+
-//===== Description: =========================================
-//= Provides Kafra services for guild members of NGuild Castles.
-//= Used in conjuction with function F_Kafra.
-//===== Additional Comments: =================================
-//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//= 1.1 All N Guild Kafras teleport to Prontera only! [Lupus]
-//============================================================
-
-
-// Castle 1 ===============================================
-nguild_alde.gat,218,170,0 script Kafra Service#N01 117,{
- callfunc "F_GKafra", "nguild_alde", "Prontera";
- end;
-OnRecvCastleN01:
- if (GetCastleData("nguild_alde.gat",9) < 1) disablenpc "Kafra Service#N01";
- end;
-}
-
-// Castle 2 ===============================================
-//nguild_gef,96,173,0 script Kafra Service#N02 117,{
-nguild_gef.gat,35,37,0 script Kafra Service#N02 117,{
- callfunc "F_GKafra", "nguild_gef", "Prontera";
- end;
-OnRecvCastleN02:
- if (GetCastleData("nguild_gef.gat",9) < 1) disablenpc "Kafra Service#N02";
- end;
-}
-
-// Castle 3 ===============================================
-nguild_pay.gat,128,58,3 script Kafra Service#N03 117,{
- callfunc "F_GKafra", "nguild_pay", "Prontera";
- end;
-OnRecvCastleN03:
- if (GetCastleData("nguild_pay.gat",9) < 1) disablenpc "Kafra Service#N03";
- end;
-}
-
-// Castle 4 ===============================================
-nguild_prt.gat,96,173,0 script Kafra Service#N04 117,{
- callfunc "F_GKafra", "nguild_prt", "Prontera";
- end;
-OnRecvCastleN04:
- if (GetCastleData("nguild_prt.gat",9) < 1) disablenpc "Kafra Service#N04";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Kafras for N Guild Castles
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 5+
+//===== Description: =========================================
+//= Provides Kafra services for guild members of NGuild Castles.
+//= Used in conjuction with function F_Kafra.
+//===== Additional Comments: =================================
+//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//= 1.1 All N Guild Kafras teleport to Prontera only! [Lupus]
+//============================================================
+
+
+// Castle 1 ===============================================
+nguild_alde.gat,218,170,0 script Kafra Service#N01 117,{
+ callfunc "F_GKafra", "nguild_alde", "Prontera";
+ end;
+OnRecvCastleN01:
+ if (GetCastleData("nguild_alde.gat",9) < 1) disablenpc "Kafra Service#N01";
+ end;
+}
+
+// Castle 2 ===============================================
+//nguild_gef,96,173,0 script Kafra Service#N02 117,{
+nguild_gef.gat,35,37,0 script Kafra Service#N02 117,{
+ callfunc "F_GKafra", "nguild_gef", "Prontera";
+ end;
+OnRecvCastleN02:
+ if (GetCastleData("nguild_gef.gat",9) < 1) disablenpc "Kafra Service#N02";
+ end;
+}
+
+// Castle 3 ===============================================
+nguild_pay.gat,128,58,3 script Kafra Service#N03 117,{
+ callfunc "F_GKafra", "nguild_pay", "Prontera";
+ end;
+OnRecvCastleN03:
+ if (GetCastleData("nguild_pay.gat",9) < 1) disablenpc "Kafra Service#N03";
+ end;
+}
+
+// Castle 4 ===============================================
+nguild_prt.gat,96,173,0 script Kafra Service#N04 117,{
+ callfunc "F_GKafra", "nguild_prt", "Prontera";
+ end;
+OnRecvCastleN04:
+ if (GetCastleData("nguild_prt.gat",9) < 1) disablenpc "Kafra Service#N04";
+ end;
+}
diff --git a/npc/guild/nguild/nguild_managers.txt b/npc/guild/nguild/nguild_managers.txt
index 6cea67a41..d5e134b48 100644
--- a/npc/guild/nguild/nguild_managers.txt
+++ b/npc/guild/nguild/nguild_managers.txt
@@ -1,85 +1,85 @@
-//===== eAthena Script =======================================
-//= War of Emperium Managers for N Guild Castles
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ==================================================================================
-nguild_alde.gat,218,175,0 script Frolo 55,{
- if(callfunc("F_GldManager","Frolo","nguild_alde",119,223,"N01") == 0) close;
-
- if(@GDnum==10) guardian "nguild_alde.gat",18,219,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",0;
- if(@GDnum==11) guardian "nguild_alde.gat",117,42,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",1;
- if(@GDnum==12) guardian "nguild_alde.gat",207,153,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",2;
- if(@GDnum==13) guardian "nguild_alde.gat",68,70,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",3;
- if(@GDnum==14) guardian "nguild_alde.gat",187,140,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",4;
- if(@GDnum==15) guardian "nguild_alde.gat",62,204,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",5;
- if(@GDnum==16) guardian "nguild_alde.gat",113,100,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",6;
- if(@GDnum==17) guardian "nguild_alde.gat",211,174,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",7;
- mes "[Frolo]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 2 ==================================================================================
-nguild_gef.gat,40,48,5 script Leiber 55,{
- if(callfunc("F_GldManager","Leiber","nguild_gef",155,112,"N02") == 0) close;
-
- if(@GDnum==10) guardian "nguild_gef.gat",30,178,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",0;
- if(@GDnum==11) guardian "nguild_gef.gat",64,180,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",1;
- if(@GDnum==12) guardian "nguild_gef.gat",61,25,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",2;
- if(@GDnum==13) guardian "nguild_gef.gat",61,44,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",3;
- if(@GDnum==14) guardian "nguild_gef.gat",189,43,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",4;
- if(@GDnum==15) guardian "nguild_gef.gat",51,192,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",5;
- if(@GDnum==16) guardian "nguild_gef.gat",49,67,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",6;
- if(@GDnum==17) guardian "nguild_gef.gat",181,14,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",7;
- mes "[Leiber]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 3 ==================================================================================
-nguild_pay.gat,120,58,4 script Dundar 55,{
- if(callfunc("F_GldManager","Dundar","nguild_pay",290,7,"N03") == 0) close;
-
- if(@GDnum==10) guardian "nguild_pay.gat",210,120,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",0;
- if(@GDnum==11) guardian "nguild_pay.gat",69,26,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",1;
- if(@GDnum==12) guardian "nguild_pay.gat",23,141,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",2;
- if(@GDnum==13) guardian "nguild_pay.gat",224,87,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",3;
- if(@GDnum==14) guardian "nguild_pay.gat",81,45,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",4;
- if(@GDnum==15) guardian "nguild_pay.gat",214,53,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",5;
- if(@GDnum==16) guardian "nguild_pay.gat",69,26,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",6;
- if(@GDnum==17) guardian "nguild_pay.gat",23,141,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",7;
- mes "[Dundar]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 4 ==================================================================================
-nguild_prt.gat,112,181,0 script Thefton 55,{
- if(callfunc("F_GldManager","Thefton","nguild_prt",15,209,"N04") == 0) close;
-
- if(@GDnum==10) guardian "nguild_prt.gat",196,92,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",0;
- if(@GDnum==11) guardian "nguild_prt.gat",113,200,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",1;
- if(@GDnum==12) guardian "nguild_prt.gat",111,186,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",2;
- if(@GDnum==13) guardian "nguild_prt.gat",76,202,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",3;
- if(@GDnum==14) guardian "nguild_prt.gat",90,26,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",4;
- if(@GDnum==15) guardian "nguild_prt.gat",58,59,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",5;
- if(@GDnum==16) guardian "nguild_prt.gat",112,200,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",6;
- if(@GDnum==17) guardian "nguild_prt.gat",101,194,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",7;
- mes "[Thefton]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Managers for N Guild Castles
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ==================================================================================
+nguild_alde.gat,218,175,0 script Frolo 55,{
+ if(callfunc("F_GldManager","Frolo","nguild_alde",119,223,"N01") == 0) close;
+
+ if(@GDnum==10) guardian "nguild_alde.gat",18,219,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "nguild_alde.gat",117,42,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "nguild_alde.gat",207,153,"Soldier Guardian",1287,1,"Guardian_N01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "nguild_alde.gat",68,70,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "nguild_alde.gat",187,140,"Archer Guardian",1285,1,"Guardian_N01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "nguild_alde.gat",62,204,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "nguild_alde.gat",113,100,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "nguild_alde.gat",211,174,"Knight Guardian",1286,1,"Guardian_N01::OnGuardianDied",7;
+ mes "[Frolo]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 2 ==================================================================================
+nguild_gef.gat,40,48,5 script Leiber 55,{
+ if(callfunc("F_GldManager","Leiber","nguild_gef",155,112,"N02") == 0) close;
+
+ if(@GDnum==10) guardian "nguild_gef.gat",30,178,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",0;
+ if(@GDnum==11) guardian "nguild_gef.gat",64,180,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "nguild_gef.gat",61,25,"Soldier Guardian",1287,1,"Guardian_N02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "nguild_gef.gat",61,44,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "nguild_gef.gat",189,43,"Archer Guardian",1285,1,"Guardian_N02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "nguild_gef.gat",51,192,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "nguild_gef.gat",49,67,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "nguild_gef.gat",181,14,"Knight Guardian",1286,1,"Guardian_N02::OnGuardianDied",7;
+ mes "[Leiber]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 3 ==================================================================================
+nguild_pay.gat,120,58,4 script Dundar 55,{
+ if(callfunc("F_GldManager","Dundar","nguild_pay",290,7,"N03") == 0) close;
+
+ if(@GDnum==10) guardian "nguild_pay.gat",210,120,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "nguild_pay.gat",69,26,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "nguild_pay.gat",23,141,"Soldier Guardian",1287,1,"Guardian_N03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "nguild_pay.gat",224,87,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "nguild_pay.gat",81,45,"Archer Guardian",1285,1,"Guardian_N03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "nguild_pay.gat",214,53,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "nguild_pay.gat",69,26,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "nguild_pay.gat",23,141,"Knight Guardian",1286,1,"Guardian_N03::OnGuardianDied",7;
+ mes "[Dundar]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 4 ==================================================================================
+nguild_prt.gat,112,181,0 script Thefton 55,{
+ if(callfunc("F_GldManager","Thefton","nguild_prt",15,209,"N04") == 0) close;
+
+ if(@GDnum==10) guardian "nguild_prt.gat",196,92,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "nguild_prt.gat",113,200,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "nguild_prt.gat",111,186,"Soldier Guardian",1287,1,"Guardian_N04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "nguild_prt.gat",76,202,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "nguild_prt.gat",90,26,"Archer Guardian",1285,1,"Guardian_N04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "nguild_prt.gat",58,59,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "nguild_prt.gat",112,200,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "nguild_prt.gat",101,194,"Knight Guardian",1286,1,"Guardian_N04::OnGuardianDied",7;
+ mes "[Thefton]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
diff --git a/npc/guild/nguild/nguild_treas.txt b/npc/guild/nguild/nguild_treas.txt
index 27e3ff228..b3ffd7090 100644
--- a/npc/guild/nguild/nguild_treas.txt
+++ b/npc/guild/nguild/nguild_treas.txt
@@ -1,117 +1,117 @@
-//===== eAthena Script =======================================
-//= War of Emperium Treasure Rooms for NGuild Guild Castles
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
-//= 1.2 Official treasure spawn [Lupus]
-//============================================================
-
-
-//<=============================== Castle 1 =================================>\\
-
-// Treasure Spawn -----------------------
-nguild_alde.gat,1,1,1 script Treasure_N01 -1,{
-
-OnRecvCastleN01:
- end;
-OnInit:
- if($boxNumN01 == 0) end;
- set $@bxN01, $boxNumN01;
- callfunc "F_GldTreas","nguild_alde","N01",$boxNumN01,$@bxN01,$@boxIdN01,1324+rand(10),114,218,123,227,1;
- end;
-
-OnDied:
- mapannounce "nguild_alde.gat","Treasure Chest Broken Open",17;
- set $boxNumN01, $boxNumN01 -1;
- if($boxNumN01 == 0) mapannounce "nguild_alde.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch --------------------
-nguild_alde.gat,123,223,0 script Switch#TresN01 111,{
- callfunc "F_GldTreasSw", "nguild_alde",218,176;
- end;
-}
-
-//<================================ Castle 2 ================================>\\
-
-// Treasure Spawn ----------------------------
-nguild_gef.gat,1,1,1 script Treasure_N02 -1,{
-
-OnRecvCastleN02:
- end;
-OnInit:
- if($boxNumN02 == 0) end;
- set $@bxN02, $boxNumN02;
- callfunc "F_GldTreas","nguild_gef","N02",$boxNumN02,$@bxN02,$@boxIdN02,1334+rand(10),150,108,158,114,1;
- end;
-
-OnDied:
- mapannounce "nguild_gef.gat","Treasure Chest Broken Open",17;
- set $boxNumN02, $boxNumN02 -1;
- if($boxNumN02 == 0) mapannounce "nguild_gef.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Room Switch ---------------------------------------------------------
-nguild_gef.gat,152,117,0 script Switch#TresN02 111,{
- callfunc "F_GldTreasSw","nguild_gef",40,49;
- end;
-}
-
-//<================================ Castle 3 ================================>\\
-
-// Treasure Spawn ---------------------------
-nguild_pay.gat,1,1,0 script Treasure_N03 -1,{
-OnRecvCastleN03:
- end;
-OnInit:
- if($boxNumN03 == 0) end;
- set $@bxN03, $boxNumN03;
- callfunc "F_GldTreas","nguild_pay","N03",$boxNumN03,$@bxN03,$@boxIdN03,1344+rand(10),286,4,295,13,1;
- end;
-
-OnDied:
- mapannounce "nguild_pay.gat","Treasure Chest Broken Open",17;
- set $boxNumN03, $boxNumN03 -1;
- if($boxNumN03 == 0) mapannounce "nguild_pay.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ---------------------------------------------------
-nguild_pay.gat,295,8,0 script Switch#TresN03 111,{
- callfunc "F_GldTreasSw", "nguild_pay",120,59;
- end;
-}
-
-//<================================ Castle 4 ================================>\\
-
-// Treasure Spawn -------------------------------
-nguild_prt.gat,1,1,0 script Treasure_N04 -1,{
-OnRecvCastleN04:
- end;
-OnInit:
- if($boxNumN04 == 0) end;
- set $@bxN04, $boxNumN04;
- callfunc "F_GldTreas","nguild_prt","N04",$boxNumN04,$@bxN04,$@boxIdN04,1354+rand(10),6,204,15,213,1;
- end;
-
-OnDied:
- mapannounce "nguild_prt.gat","Treasure Chest Broken Open",17;
- set $boxNumN04, $boxNumN04 -1;
- if($boxNumN04 == 0) mapannounce "nguild_prt.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-nguild_prt.gat,15,209,0 script Switch#TresN04 111,{
- callfunc "F_GldTreasSw", "nguild_prt",109,179;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Treasure Rooms for NGuild Guild Castles
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Based off existing guild scripts. Do not know if it is accurate.[kobra_k88]
+//= 1.2 Official treasure spawn [Lupus]
+//============================================================
+
+
+//<=============================== Castle 1 =================================>\\
+
+// Treasure Spawn -----------------------
+nguild_alde.gat,1,1,1 script Treasure_N01 -1,{
+
+OnRecvCastleN01:
+ end;
+OnInit:
+ if($boxNumN01 == 0) end;
+ set $@bxN01, $boxNumN01;
+ callfunc "F_GldTreas","nguild_alde","N01",$boxNumN01,$@bxN01,$@boxIdN01,1324+rand(10),114,218,123,227,1;
+ end;
+
+OnDied:
+ mapannounce "nguild_alde.gat","Treasure Chest Broken Open",17;
+ set $boxNumN01, $boxNumN01 -1;
+ if($boxNumN01 == 0) mapannounce "nguild_alde.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch --------------------
+nguild_alde.gat,123,223,0 script Switch#TresN01 111,{
+ callfunc "F_GldTreasSw", "nguild_alde",218,176;
+ end;
+}
+
+//<================================ Castle 2 ================================>\\
+
+// Treasure Spawn ----------------------------
+nguild_gef.gat,1,1,1 script Treasure_N02 -1,{
+
+OnRecvCastleN02:
+ end;
+OnInit:
+ if($boxNumN02 == 0) end;
+ set $@bxN02, $boxNumN02;
+ callfunc "F_GldTreas","nguild_gef","N02",$boxNumN02,$@bxN02,$@boxIdN02,1334+rand(10),150,108,158,114,1;
+ end;
+
+OnDied:
+ mapannounce "nguild_gef.gat","Treasure Chest Broken Open",17;
+ set $boxNumN02, $boxNumN02 -1;
+ if($boxNumN02 == 0) mapannounce "nguild_gef.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Room Switch ---------------------------------------------------------
+nguild_gef.gat,152,117,0 script Switch#TresN02 111,{
+ callfunc "F_GldTreasSw","nguild_gef",40,49;
+ end;
+}
+
+//<================================ Castle 3 ================================>\\
+
+// Treasure Spawn ---------------------------
+nguild_pay.gat,1,1,0 script Treasure_N03 -1,{
+OnRecvCastleN03:
+ end;
+OnInit:
+ if($boxNumN03 == 0) end;
+ set $@bxN03, $boxNumN03;
+ callfunc "F_GldTreas","nguild_pay","N03",$boxNumN03,$@bxN03,$@boxIdN03,1344+rand(10),286,4,295,13,1;
+ end;
+
+OnDied:
+ mapannounce "nguild_pay.gat","Treasure Chest Broken Open",17;
+ set $boxNumN03, $boxNumN03 -1;
+ if($boxNumN03 == 0) mapannounce "nguild_pay.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ---------------------------------------------------
+nguild_pay.gat,295,8,0 script Switch#TresN03 111,{
+ callfunc "F_GldTreasSw", "nguild_pay",120,59;
+ end;
+}
+
+//<================================ Castle 4 ================================>\\
+
+// Treasure Spawn -------------------------------
+nguild_prt.gat,1,1,0 script Treasure_N04 -1,{
+OnRecvCastleN04:
+ end;
+OnInit:
+ if($boxNumN04 == 0) end;
+ set $@bxN04, $boxNumN04;
+ callfunc "F_GldTreas","nguild_prt","N04",$boxNumN04,$@bxN04,$@boxIdN04,1354+rand(10),6,204,15,213,1;
+ end;
+
+OnDied:
+ mapannounce "nguild_prt.gat","Treasure Chest Broken Open",17;
+ set $boxNumN04, $boxNumN04 -1;
+ if($boxNumN04 == 0) mapannounce "nguild_prt.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+nguild_prt.gat,15,209,0 script Switch#TresN04 111,{
+ callfunc "F_GldTreasSw", "nguild_prt",109,179;
+ end;
+}
diff --git a/npc/guild/nguild/nguild_warper.txt b/npc/guild/nguild/nguild_warper.txt
index 860a8eafc..c59edbacb 100644
--- a/npc/guild/nguild/nguild_warper.txt
+++ b/npc/guild/nguild/nguild_warper.txt
@@ -1,75 +1,75 @@
-//===== eAthena Script =======================================
-//= Novice's Guild Castles War of Emperium Usher NPC
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1+ with eaclass(); RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Now you have access to 4 N Guild castles. They don't have
-//= dungeons. And 2nd Classes can't seize these Castles.
-//= These new castles need a new strategy. It would bring some
-//= fun and live to your game.
-//= NOTE: If your Guild Master is 2nd class, then he could
-//= rule the Castles and gather Treasure Boxes after WoE
-//= 1.1 Now 2nd classes can't enter NC place at all
-//= 1.2 Restricted access of SG/SL. On warp clear some
-//= unallowed buffs [Lupus]
-//= 1.3 Restricted TK,High classes >=90 BaseLevel,
-//= updated list of unallowed buffs [Lupus]
-//= 1.4 Restricted it to 80 Base Level [Lupus]
-//= 1.5 According to official info: 1 Treasure Chest per Castle
-//= 1.6 Only 1st Class < 60 BaseLevel Players can participate
-//= TODO: The official entrance is in Izlude.
-//============================================================
-
-
-prontera.gat,146,163,6 script Novice Castles 729,{
- mes "[Cita]";
- mes "Hey! I'm a new usher of Novice Castles.";
- next;
- if( !(eaclass()&(EAJL_2|EAJL_UPPER)) && BaseLevel<60 )
- menu "Warp me to Novice Castles",M_WARP,"Cancel",-;
-
- mes "[Cita]";
- mes "I'm sorry, you can't enter the sacred Novice Castles place.";
- emotion e_sry;
- close;
-
-M_WARP:
- //remove several unallowed buffs
- sc_end SC_ASSUMPTIO;
- sc_end SC_IMPOSITIO;
- sc_end SC_SUFFRAGIUM;
- sc_end SC_MAGNIFICAT;
- sc_end SC_WEAPONPERFECTION;
- sc_end SC_GOSPEL;
- sc_end SC_BASILICA;
- sc_end SC_MAGICPOWER;
- sc_end SC_MARIONETTE;
- sc_end SC_MARIONETTE2;
- sc_end SC_DEVOTION;
- sc_end SC_SACRIFICE;
- sc_end SC_MAXOVERTHRUST;
- sc_end SC_SPIRIT;
- warp "n_castle.gat",102,93+rand(14);
- close;
-}
-
-
-n_castle.gat,102,107,5 script Cita 729,{
- mes "[Cita]";
- mes "Hello, "+ strcharinfo(0) +". Can I help you?";
- next;
- menu "Warp me to Prontera!",-,"Cancel",LEnd;
-
- warp "prontera.gat",155,177+rand(5);
- close;
- LEnd:
- mes "[Cita]";
- mes "Ok.";
- close;
+//===== eAthena Script =======================================
+//= Novice's Guild Castles War of Emperium Usher NPC
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1+ with eaclass(); RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Now you have access to 4 N Guild castles. They don't have
+//= dungeons. And 2nd Classes can't seize these Castles.
+//= These new castles need a new strategy. It would bring some
+//= fun and live to your game.
+//= NOTE: If your Guild Master is 2nd class, then he could
+//= rule the Castles and gather Treasure Boxes after WoE
+//= 1.1 Now 2nd classes can't enter NC place at all
+//= 1.2 Restricted access of SG/SL. On warp clear some
+//= unallowed buffs [Lupus]
+//= 1.3 Restricted TK,High classes >=90 BaseLevel,
+//= updated list of unallowed buffs [Lupus]
+//= 1.4 Restricted it to 80 Base Level [Lupus]
+//= 1.5 According to official info: 1 Treasure Chest per Castle
+//= 1.6 Only 1st Class < 60 BaseLevel Players can participate
+//= TODO: The official entrance is in Izlude.
+//============================================================
+
+
+prontera.gat,146,163,6 script Novice Castles 729,{
+ mes "[Cita]";
+ mes "Hey! I'm a new usher of Novice Castles.";
+ next;
+ if( !(eaclass()&(EAJL_2|EAJL_UPPER)) && BaseLevel<60 )
+ menu "Warp me to Novice Castles",M_WARP,"Cancel",-;
+
+ mes "[Cita]";
+ mes "I'm sorry, you can't enter the sacred Novice Castles place.";
+ emotion e_sry;
+ close;
+
+M_WARP:
+ //remove several unallowed buffs
+ sc_end SC_ASSUMPTIO;
+ sc_end SC_IMPOSITIO;
+ sc_end SC_SUFFRAGIUM;
+ sc_end SC_MAGNIFICAT;
+ sc_end SC_WEAPONPERFECTION;
+ sc_end SC_GOSPEL;
+ sc_end SC_BASILICA;
+ sc_end SC_MAGICPOWER;
+ sc_end SC_MARIONETTE;
+ sc_end SC_MARIONETTE2;
+ sc_end SC_DEVOTION;
+ sc_end SC_SACRIFICE;
+ sc_end SC_MAXOVERTHRUST;
+ sc_end SC_SPIRIT;
+ warp "n_castle.gat",102,93+rand(14);
+ close;
+}
+
+
+n_castle.gat,102,107,5 script Cita 729,{
+ mes "[Cita]";
+ mes "Hello, "+ strcharinfo(0) +". Can I help you?";
+ next;
+ menu "Warp me to Prontera!",-,"Cancel",LEnd;
+
+ warp "prontera.gat",155,177+rand(5);
+ close;
+ LEnd:
+ mes "[Cita]";
+ mes "Ok.";
+ close;
} \ No newline at end of file
diff --git a/npc/guild/payg/payg_dunsw.txt b/npc/guild/payg/payg_dunsw.txt
index 227092a62..31ec45999 100644
--- a/npc/guild/payg/payg_dunsw.txt
+++ b/npc/guild/payg/payg_dunsw.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for Payon Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to the guild dungeon
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ================================================
-payg_cas01.gat,101,25,0 script Switch#DunPy01 111,{
- callfunc "F_GldDunSw","payg_cas01","01",186,165;
- close;
-}
-
-
-// Castle 2 ================================================
-payg_cas02.gat,278,247,0 script Switch#DunPy02 111,{
- callfunc "F_GldDunSw","payg_cas02","01",54,165;
- close;
-}
-
-
-// Castle 3 ================================================
-payg_cas03.gat,20,44,0 script Switch#DunPy03 111,{
- callfunc "F_GldDunSw","payg_cas03","01",54,39;
- close;
-}
-
-
-// Castle 4 ================================================
-payg_cas04.gat,52,48,0 script Switch#DunPy04 111,{
- callfunc "F_GldDunSw","payg_cas04","01",186,39;
- close;
-}
-
-
-// Castle 5 ================================================
-payg_cas05.gat,248,14,0 script Switch#DunPy05 111,{
- callfunc "F_GldDunSw","payg_cas05","01",223,202;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Dungeon Switch for Payon Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to the guild dungeon
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ================================================
+payg_cas01.gat,101,25,0 script Switch#DunPy01 111,{
+ callfunc "F_GldDunSw","payg_cas01","01",186,165;
+ close;
+}
+
+
+// Castle 2 ================================================
+payg_cas02.gat,278,247,0 script Switch#DunPy02 111,{
+ callfunc "F_GldDunSw","payg_cas02","01",54,165;
+ close;
+}
+
+
+// Castle 3 ================================================
+payg_cas03.gat,20,44,0 script Switch#DunPy03 111,{
+ callfunc "F_GldDunSw","payg_cas03","01",54,39;
+ close;
+}
+
+
+// Castle 4 ================================================
+payg_cas04.gat,52,48,0 script Switch#DunPy04 111,{
+ callfunc "F_GldDunSw","payg_cas04","01",186,39;
+ close;
+}
+
+
+// Castle 5 ================================================
+payg_cas05.gat,248,14,0 script Switch#DunPy05 111,{
+ callfunc "F_GldDunSw","payg_cas05","01",223,202;
+ close;
+}
diff --git a/npc/guild/payg/payg_ev_agit.txt b/npc/guild/payg/payg_ev_agit.txt
index 05b9cb3c0..3f7fd0563 100644
--- a/npc/guild/payg/payg_ev_agit.txt
+++ b/npc/guild/payg/payg_ev_agit.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Payon Guild Wars
-//===== Additional Comments: =================================
-//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//============================================================
-
-
-// Castle 1 ================================================================
-payg_cas01.gat,139,139,0 script Agit_Py01 -1,{
-OnInterIfInitOnce:
- GetCastleData "payg_cas01.gat",0,"::OnRecvCastlePy01";
- end;
-OnRecvCastlePy01:
- RequestGuildInfo GetCastleData("payg_cas01.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","payg_cas01","Py01",139,139;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","payg_cas01","Py01";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","payg_cas01","Py01";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),6;
- Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_Py01::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","payg_cas01","Py01";
- end;
-}
-
-// Castle 2 ================================================================
-payg_cas02.gat,39,25,0 script Agit_Py02 -1,{
-OnInterIfInitOnce:
- GetCastleData "payg_cas02.gat",0,"::OnRecvCastlePy02";
- end;
-OnRecvCastlePy02:
- RequestGuildInfo GetCastleData("payg_cas02.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","payg_cas02","Py02",39,25;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","payg_cas02","Py02";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","payg_cas02","Py02";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),6;
- Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_Py02::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","payg_cas02","Py02";
- end;
-}
-
-// Castle 3 ================================================================
-payg_cas03.gat,269,265,0 script Agit_Py03 -1,{
-OnInterIfInitOnce:
- GetCastleData "payg_cas03.gat",0,"::OnRecvCastlePy03";
- end;
-OnRecvCastlePy03:
- RequestGuildInfo GetCastleData("payg_cas03.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","payg_cas03","Py03",269,265;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","payg_cas03","Py03";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","payg_cas03","Py03";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),6;
- Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_Py03::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","payg_cas03","Py03";
- end;
-}
-
-// Castle 4 ================================================================
-payg_cas04.gat,271,29,0 script Agit_Py04 -1,{
-OnInterIfInitOnce:
- GetCastleData "payg_cas04.gat",0,"::OnRecvCastlePy04";
- end;
-OnRecvCastlePy04:
- RequestGuildInfo GetCastleData("payg_cas04.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","payg_cas04","Py04",271,29;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","payg_cas04","Py04";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","payg_cas04","Py04";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),6;
- Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_Py04::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","payg_cas04","Py04";
- end;
-}
-
-// Castle 5 ================================================================
-payg_cas05.gat,30,30,0 script Agit_Py05 -1,{
-OnInterIfInitOnce:
- GetCastleData "payg_cas05.gat",0,"::OnRecvCastlePy05";
- end;
-OnRecvCastlePy05:
- RequestGuildInfo GetCastleData("payg_cas05.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","payg_cas05","Py05",30,30;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","payg_cas05","Py05";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","payg_cas05","Py05";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),6;
- Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_Py05::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","payg_cas05","Py05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - Payon Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Payon Guild Wars
+//===== Additional Comments: =================================
+//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//============================================================
+
+
+// Castle 1 ================================================================
+payg_cas01.gat,139,139,0 script Agit_Py01 -1,{
+OnInterIfInitOnce:
+ GetCastleData "payg_cas01.gat",0,"::OnRecvCastlePy01";
+ end;
+OnRecvCastlePy01:
+ RequestGuildInfo GetCastleData("payg_cas01.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","payg_cas01","Py01",139,139;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","payg_cas01","Py01";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","payg_cas01","Py01";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),6;
+ Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_Py01::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","payg_cas01","Py01";
+ end;
+}
+
+// Castle 2 ================================================================
+payg_cas02.gat,39,25,0 script Agit_Py02 -1,{
+OnInterIfInitOnce:
+ GetCastleData "payg_cas02.gat",0,"::OnRecvCastlePy02";
+ end;
+OnRecvCastlePy02:
+ RequestGuildInfo GetCastleData("payg_cas02.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","payg_cas02","Py02",39,25;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","payg_cas02","Py02";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","payg_cas02","Py02";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),6;
+ Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_Py02::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","payg_cas02","Py02";
+ end;
+}
+
+// Castle 3 ================================================================
+payg_cas03.gat,269,265,0 script Agit_Py03 -1,{
+OnInterIfInitOnce:
+ GetCastleData "payg_cas03.gat",0,"::OnRecvCastlePy03";
+ end;
+OnRecvCastlePy03:
+ RequestGuildInfo GetCastleData("payg_cas03.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","payg_cas03","Py03",269,265;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","payg_cas03","Py03";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","payg_cas03","Py03";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),6;
+ Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_Py03::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","payg_cas03","Py03";
+ end;
+}
+
+// Castle 4 ================================================================
+payg_cas04.gat,271,29,0 script Agit_Py04 -1,{
+OnInterIfInitOnce:
+ GetCastleData "payg_cas04.gat",0,"::OnRecvCastlePy04";
+ end;
+OnRecvCastlePy04:
+ RequestGuildInfo GetCastleData("payg_cas04.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","payg_cas04","Py04",271,29;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","payg_cas04","Py04";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","payg_cas04","Py04";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),6;
+ Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_Py04::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","payg_cas04","Py04";
+ end;
+}
+
+// Castle 5 ================================================================
+payg_cas05.gat,30,30,0 script Agit_Py05 -1,{
+OnInterIfInitOnce:
+ GetCastleData "payg_cas05.gat",0,"::OnRecvCastlePy05";
+ end;
+OnRecvCastlePy05:
+ RequestGuildInfo GetCastleData("payg_cas05.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","payg_cas05","Py05",30,30;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","payg_cas05","Py05";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","payg_cas05","Py05";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),6;
+ Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_Py05::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","payg_cas05","Py05";
+ end;
+}
diff --git a/npc/guild/payg/payg_flags.txt b/npc/guild/payg/payg_flags.txt
index 7bc707fc8..d3c3c45a0 100644
--- a/npc/guild/payg/payg_flags.txt
+++ b/npc/guild/payg/payg_flags.txt
@@ -1,186 +1,186 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in Payon and pay_gld
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//= v1.3 Changed to iRO castle names [DracoRPG]
-//= v1.4 Can now only flag in from outside the castle [Kayla]
-//============================================================
-
-
-//============================================================================//
-// Castle 1
-//============================================================================//
-payon.gat,165,177,3 script BrightArbor#f1-1::BrightArbor 722,{
- callfunc "F_Flags","Payon","payg_cas01",87,29,0;
- close;
-
-OnRecvCastlePy01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- end;
-}
-
-pay_gld.gat,125,236,4 script BrightArbor#f1-2::BrightArbor2 722,{
- callfunc "F_Flags","Payon","payg_cas01",87,29,1;
- close;
-
-OnRecvCastlePy01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- end;
-}
-
-// In Guild ===============================================
-pay_gld.gat,110,233,4 duplicate(BrightArbor2) Bright Arbor#f1-3 722
-pay_gld.gat,116,233,4 duplicate(BrightArbor2) Bright Arbor#f1-4 722
-pay_gld.gat,91,239,2 duplicate(BrightArbor2) Bright Arbor#f1-5 722
-// In Castle ===============================================
-payg_cas01.gat,238,67,4 duplicate(BrightArbor) Bright Arbor#f1-6 722
-payg_cas01.gat,233,67,4 duplicate(BrightArbor) Bright Arbor#f1-7 722
-payg_cas01.gat,221,123,4 duplicate(BrightArbor) Bright Arbor#f1-8 722
-payg_cas01.gat,221,116,4 duplicate(BrightArbor) Bright Arbor#f1-9 722
-payg_cas01.gat,206,108,4 duplicate(BrightArbor) Bright Arbor#f1-10 722
-payg_cas01.gat,212,108,4 duplicate(BrightArbor) Bright Arbor#f1-11 722
-
-
-
-//===========================================================================//
-// Castle 2
-//============================================================================//
-payon.gat,165,173,3 script ScarletPalace#f2-1::ScarletPalace 722,{
- callfunc "F_Flags","Payon","payg_cas02",25,266,0;
- close;
-
-OnRecvCastlePy02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- end;
-}
-
-pay_gld.gat,292,112,6 script ScarletPalace#f2-2::ScarletPalace2 722,{
- callfunc "F_Flags","Payon","payg_cas02",25,266,1;
- close;
-
-OnRecvCastlePy02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,292,120,6 duplicate(ScarletPalace2) Scarlet Palace#f2-3 722
-pay_gld.gat,291,135,6 duplicate(ScarletPalace2) Scarlet Palace#f2-4 722
-pay_gld.gat,271,163,0 duplicate(ScarletPalace2) Scarlet Palace#f2-5 722
-// In Castle ===============================================
-payg_cas02.gat,254,40,6 duplicate(ScarletPalace) Scarlet Palace#f2-6 722
-payg_cas02.gat,254,48,6 duplicate(ScarletPalace) Scarlet Palace#f2-7 722
-payg_cas02.gat,202,49,0 duplicate(ScarletPalace) Scarlet Palace#f2-8 722
-payg_cas02.gat,209,49,0 duplicate(ScarletPalace) Scarlet Palace#f2-9 722
-payg_cas02.gat,59,282,4 duplicate(ScarletPalace) Scarlet Palace#f2-10 722
-payg_cas02.gat,70,282,4 duplicate(ScarletPalace) Scarlet Palace#f2-11 722
-
-
-
-//============================================================================//
-// Castle 3
-//============================================================================//
-payon.gat,165,169,3 script HolyShadow#f3-1::HolyShadow 722,{
- callfunc "F_Flags","Payon","payg_cas03",9,263,0;
- close;
-
-OnRecvCastlePy03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- end;
-}
-
-pay_gld.gat,321,298,2 script HolyShadow#f3-2::HolyShadow2 722,{
- callfunc "F_Flags","Payon","payg_cas03",9,263,1;
- close;
-
-OnRecvCastlePy03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- end;
-}
-
-// In Guild ===============================================
-pay_gld.gat,321,289,2 duplicate(HolyShadow2) Holy Shadow#f3-3 722
-pay_gld.gat,327,304,1 duplicate(HolyShadow2) Holy Shadow#f3-4 722
-pay_gld.gat,333,254,4 duplicate(HolyShadow2) Holy Shadow#f3-5 722
-// In Castle ===============================================
-payg_cas03.gat,236,54,2 duplicate(HolyShadow) Holy Shadow#f3-6 722
-payg_cas03.gat,236,45,2 duplicate(HolyShadow) Holy Shadow#f3-7 722
-payg_cas03.gat,259,66,4 duplicate(HolyShadow) Holy Shadow#f3-8 722
-payg_cas03.gat,266,66,4 duplicate(HolyShadow) Holy Shadow#f3-9 722
-payg_cas03.gat,34,31,4 duplicate(HolyShadow) Holy Shadow#f3-10 722
-payg_cas03.gat,43,31,4 duplicate(HolyShadow) Holy Shadow#f3-11 722
-
-
-
-//============================================================================//
-// Castle 4
-//============================================================================//
-payon.gat,165,165,3 script SacredAltar#f4-1::SacredAltar 722,{
- callfunc "F_Flags","Payon","payg_cas04",40,235,0;
- close;
-
-OnRecvCastlePy04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- end;
-}
-
-pay_gld.gat,143,160,0 script SacredAltar#f4-2::SacredAltar2 722,{
- callfunc "F_Flags","Payon","payg_cas04",40,235,1;
- close;
-
-OnRecvCastlePy04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,133,151,2 duplicate(SacredAltar2) Sacred Altar#f4-4 722
-pay_gld.gat,153,166,1 duplicate(SacredAltar2) Sacred Altar#f4-5 722
-// In Castle ===============================================
-payg_cas04.gat,255,259,0 duplicate(SacredAltar) Sacred Altar#f4-6 722
-payg_cas04.gat,248,259,0 duplicate(SacredAltar) Sacred Altar#f4-7 722
-payg_cas04.gat,248,168,6 duplicate(SacredAltar) Sacred Altar#f4-8 722
-payg_cas04.gat,248,160,6 duplicate(SacredAltar) Sacred Altar#f4-9 722
-payg_cas04.gat,232,181,4 duplicate(SacredAltar) Sacred Altar#f4-10 722
-payg_cas04.gat,239,181,4 duplicate(SacredAltar) Sacred Altar#f4-11 722
-
-
-
-//============================================================================//
-// Castle 5
-//============================================================================//
-payon.gat,165,161,3 script BambooGrove Hill#f5-1::BambooGroveHill 722,{
- callfunc "F_Flags","Payon","payg_cas05",276,227,0;
- close;
-
-OnRecvCastlePy05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- end;
-}
-
-pay_gld.gat,208,268,4 script BambooGrove Hill#f5-2::BambooGroveHill2 722,{
- callfunc "F_Flags","Payon","payg_cas05",276,227,1;
- close;
-
-OnRecvCastlePy05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,199,268,4 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-3 722
-pay_gld.gat,190,277,3 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-4 722
-pay_gld.gat,187,294,2 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-5 722
-// In Castle ===============================================
-payg_cas05.gat,32,249,4 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-6 722
-payg_cas05.gat,24,249,4 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-7 722
-payg_cas05.gat,62,271,0 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-8 722
-payg_cas05.gat,57,271,0 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-9 722
-payg_cas05.gat,55,252,2 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-10 722
-payg_cas05.gat,55,260,2 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-11 722
+//===== eAthena Script =======================================
+//= War of Emperium - Payon Guild Flags
+//===== By: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in Payon and pay_gld
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//= v1.3 Changed to iRO castle names [DracoRPG]
+//= v1.4 Can now only flag in from outside the castle [Kayla]
+//============================================================
+
+
+//============================================================================//
+// Castle 1
+//============================================================================//
+payon.gat,165,177,3 script BrightArbor#f1-1::BrightArbor 722,{
+ callfunc "F_Flags","Payon","payg_cas01",87,29,0;
+ close;
+
+OnRecvCastlePy01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ end;
+}
+
+pay_gld.gat,125,236,4 script BrightArbor#f1-2::BrightArbor2 722,{
+ callfunc "F_Flags","Payon","payg_cas01",87,29,1;
+ close;
+
+OnRecvCastlePy01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ end;
+}
+
+// In Guild ===============================================
+pay_gld.gat,110,233,4 duplicate(BrightArbor2) Bright Arbor#f1-3 722
+pay_gld.gat,116,233,4 duplicate(BrightArbor2) Bright Arbor#f1-4 722
+pay_gld.gat,91,239,2 duplicate(BrightArbor2) Bright Arbor#f1-5 722
+// In Castle ===============================================
+payg_cas01.gat,238,67,4 duplicate(BrightArbor) Bright Arbor#f1-6 722
+payg_cas01.gat,233,67,4 duplicate(BrightArbor) Bright Arbor#f1-7 722
+payg_cas01.gat,221,123,4 duplicate(BrightArbor) Bright Arbor#f1-8 722
+payg_cas01.gat,221,116,4 duplicate(BrightArbor) Bright Arbor#f1-9 722
+payg_cas01.gat,206,108,4 duplicate(BrightArbor) Bright Arbor#f1-10 722
+payg_cas01.gat,212,108,4 duplicate(BrightArbor) Bright Arbor#f1-11 722
+
+
+
+//===========================================================================//
+// Castle 2
+//============================================================================//
+payon.gat,165,173,3 script ScarletPalace#f2-1::ScarletPalace 722,{
+ callfunc "F_Flags","Payon","payg_cas02",25,266,0;
+ close;
+
+OnRecvCastlePy02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ end;
+}
+
+pay_gld.gat,292,112,6 script ScarletPalace#f2-2::ScarletPalace2 722,{
+ callfunc "F_Flags","Payon","payg_cas02",25,266,1;
+ close;
+
+OnRecvCastlePy02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,292,120,6 duplicate(ScarletPalace2) Scarlet Palace#f2-3 722
+pay_gld.gat,291,135,6 duplicate(ScarletPalace2) Scarlet Palace#f2-4 722
+pay_gld.gat,271,163,0 duplicate(ScarletPalace2) Scarlet Palace#f2-5 722
+// In Castle ===============================================
+payg_cas02.gat,254,40,6 duplicate(ScarletPalace) Scarlet Palace#f2-6 722
+payg_cas02.gat,254,48,6 duplicate(ScarletPalace) Scarlet Palace#f2-7 722
+payg_cas02.gat,202,49,0 duplicate(ScarletPalace) Scarlet Palace#f2-8 722
+payg_cas02.gat,209,49,0 duplicate(ScarletPalace) Scarlet Palace#f2-9 722
+payg_cas02.gat,59,282,4 duplicate(ScarletPalace) Scarlet Palace#f2-10 722
+payg_cas02.gat,70,282,4 duplicate(ScarletPalace) Scarlet Palace#f2-11 722
+
+
+
+//============================================================================//
+// Castle 3
+//============================================================================//
+payon.gat,165,169,3 script HolyShadow#f3-1::HolyShadow 722,{
+ callfunc "F_Flags","Payon","payg_cas03",9,263,0;
+ close;
+
+OnRecvCastlePy03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ end;
+}
+
+pay_gld.gat,321,298,2 script HolyShadow#f3-2::HolyShadow2 722,{
+ callfunc "F_Flags","Payon","payg_cas03",9,263,1;
+ close;
+
+OnRecvCastlePy03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ end;
+}
+
+// In Guild ===============================================
+pay_gld.gat,321,289,2 duplicate(HolyShadow2) Holy Shadow#f3-3 722
+pay_gld.gat,327,304,1 duplicate(HolyShadow2) Holy Shadow#f3-4 722
+pay_gld.gat,333,254,4 duplicate(HolyShadow2) Holy Shadow#f3-5 722
+// In Castle ===============================================
+payg_cas03.gat,236,54,2 duplicate(HolyShadow) Holy Shadow#f3-6 722
+payg_cas03.gat,236,45,2 duplicate(HolyShadow) Holy Shadow#f3-7 722
+payg_cas03.gat,259,66,4 duplicate(HolyShadow) Holy Shadow#f3-8 722
+payg_cas03.gat,266,66,4 duplicate(HolyShadow) Holy Shadow#f3-9 722
+payg_cas03.gat,34,31,4 duplicate(HolyShadow) Holy Shadow#f3-10 722
+payg_cas03.gat,43,31,4 duplicate(HolyShadow) Holy Shadow#f3-11 722
+
+
+
+//============================================================================//
+// Castle 4
+//============================================================================//
+payon.gat,165,165,3 script SacredAltar#f4-1::SacredAltar 722,{
+ callfunc "F_Flags","Payon","payg_cas04",40,235,0;
+ close;
+
+OnRecvCastlePy04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ end;
+}
+
+pay_gld.gat,143,160,0 script SacredAltar#f4-2::SacredAltar2 722,{
+ callfunc "F_Flags","Payon","payg_cas04",40,235,1;
+ close;
+
+OnRecvCastlePy04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,133,151,2 duplicate(SacredAltar2) Sacred Altar#f4-4 722
+pay_gld.gat,153,166,1 duplicate(SacredAltar2) Sacred Altar#f4-5 722
+// In Castle ===============================================
+payg_cas04.gat,255,259,0 duplicate(SacredAltar) Sacred Altar#f4-6 722
+payg_cas04.gat,248,259,0 duplicate(SacredAltar) Sacred Altar#f4-7 722
+payg_cas04.gat,248,168,6 duplicate(SacredAltar) Sacred Altar#f4-8 722
+payg_cas04.gat,248,160,6 duplicate(SacredAltar) Sacred Altar#f4-9 722
+payg_cas04.gat,232,181,4 duplicate(SacredAltar) Sacred Altar#f4-10 722
+payg_cas04.gat,239,181,4 duplicate(SacredAltar) Sacred Altar#f4-11 722
+
+
+
+//============================================================================//
+// Castle 5
+//============================================================================//
+payon.gat,165,161,3 script BambooGrove Hill#f5-1::BambooGroveHill 722,{
+ callfunc "F_Flags","Payon","payg_cas05",276,227,0;
+ close;
+
+OnRecvCastlePy05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ end;
+}
+
+pay_gld.gat,208,268,4 script BambooGrove Hill#f5-2::BambooGroveHill2 722,{
+ callfunc "F_Flags","Payon","payg_cas05",276,227,1;
+ close;
+
+OnRecvCastlePy05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,199,268,4 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-3 722
+pay_gld.gat,190,277,3 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-4 722
+pay_gld.gat,187,294,2 duplicate(BambooGroveHill2) Bamboo Grove Hill#f5-5 722
+// In Castle ===============================================
+payg_cas05.gat,32,249,4 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-6 722
+payg_cas05.gat,24,249,4 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-7 722
+payg_cas05.gat,62,271,0 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-8 722
+payg_cas05.gat,57,271,0 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-9 722
+payg_cas05.gat,55,252,2 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-10 722
+payg_cas05.gat,55,260,2 duplicate(BambooGroveHill) Bamboo Grove Hill#f5-11 722
diff --git a/npc/guild/payg/payg_guardians.txt b/npc/guild/payg/payg_guardians.txt
index 1634babe1..45bcd926d 100644
--- a/npc/guild/payg/payg_guardians.txt
+++ b/npc/guild/payg/payg_guardians.txt
@@ -1,108 +1,108 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Re-spawns guardians on server start if they have been
-//= purchased. Also announces when a guardian dies.
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//= 1.2a Guardians for all payg castles are now in this file.
-//= Minor optimizations.[kobra_k88]
-//============================================================
-
-
-payg_cas01.gat,139,139,0 script Guardian_Py01 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas01.gat",10) == 1) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",0;
- if (GetCastleData("payg_cas01.gat",11) == 1) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",1;
- if (GetCastleData("payg_cas01.gat",12) == 1) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",2;
- if (GetCastleData("payg_cas01.gat",13) == 1) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",3;
- if (GetCastleData("payg_cas01.gat",14) == 1) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",4;
- if (GetCastleData("payg_cas01.gat",15) == 1) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",5;
- if (GetCastleData("payg_cas01.gat",16) == 1) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",6;
- if (GetCastleData("payg_cas01.gat",17) == 1) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas01.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-payg_cas02.gat,39,25,0 script Guardian_Py02 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas02.gat",10) == 1) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",0;
- if (GetCastleData("payg_cas02.gat",11) == 1) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",1;
- if (GetCastleData("payg_cas02.gat",12) == 1) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",2;
- if (GetCastleData("payg_cas02.gat",13) == 1) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",3;
- if (GetCastleData("payg_cas02.gat",14) == 1) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",4;
- if (GetCastleData("payg_cas02.gat",15) == 1) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",5;
- if (GetCastleData("payg_cas02.gat",16) == 1) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",6;
- if (GetCastleData("payg_cas02.gat",17) == 1) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas02.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-payg_cas03.gat,269,265,0 script Guardian_Py03 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas03.gat",10) == 1) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",0;
- if (GetCastleData("payg_cas03.gat",11) == 1) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",1;
- if (GetCastleData("payg_cas03.gat",12) == 1) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",2;
- if (GetCastleData("payg_cas03.gat",13) == 1) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",3;
- if (GetCastleData("payg_cas03.gat",14) == 1) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",4;
- if (GetCastleData("payg_cas03.gat",15) == 1) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",5;
- if (GetCastleData("payg_cas03.gat",16) == 1) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",6;
- if (GetCastleData("payg_cas03.gat",17) == 1) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas03.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-payg_cas04.gat,271,29,0 script Guardian_Py04 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas04.gat",10) == 1) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",0;
- if (GetCastleData("payg_cas04.gat",11) == 1) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",1;
- if (GetCastleData("payg_cas04.gat",12) == 1) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",2;
- if (GetCastleData("payg_cas04.gat",13) == 1) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",3;
- if (GetCastleData("payg_cas04.gat",14) == 1) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",4;
- if (GetCastleData("payg_cas04.gat",15) == 1) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",5;
- if (GetCastleData("payg_cas04.gat",16) == 1) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",6;
- if (GetCastleData("payg_cas04.gat",17) == 1) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas04.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-payg_cas05.gat,30,30,0 script Guardian_Py05 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas05.gat",10) == 1) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",0;
- if (GetCastleData("payg_cas05.gat",11) == 1) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",1;
- if (GetCastleData("payg_cas05.gat",12) == 1) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",2;
- if (GetCastleData("payg_cas05.gat",13) == 1) guardian "payg_cas05.gat",18,281,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",3;
- if (GetCastleData("payg_cas05.gat",14) == 1) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",4;
- if (GetCastleData("payg_cas05.gat",15) == 1) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",5;
- if (GetCastleData("payg_cas05.gat",16) == 1) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",6;
- if (GetCastleData("payg_cas05.gat",17) == 1) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas05.gat","A Guardian Has Fallen",17;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Re-spawns guardians on server start if they have been
+//= purchased. Also announces when a guardian dies.
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//= 1.2a Guardians for all payg castles are now in this file.
+//= Minor optimizations.[kobra_k88]
+//============================================================
+
+
+payg_cas01.gat,139,139,0 script Guardian_Py01 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas01.gat",10) == 1) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",0;
+ if (GetCastleData("payg_cas01.gat",11) == 1) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",1;
+ if (GetCastleData("payg_cas01.gat",12) == 1) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",2;
+ if (GetCastleData("payg_cas01.gat",13) == 1) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",3;
+ if (GetCastleData("payg_cas01.gat",14) == 1) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",4;
+ if (GetCastleData("payg_cas01.gat",15) == 1) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",5;
+ if (GetCastleData("payg_cas01.gat",16) == 1) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",6;
+ if (GetCastleData("payg_cas01.gat",17) == 1) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas01.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+payg_cas02.gat,39,25,0 script Guardian_Py02 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas02.gat",10) == 1) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",0;
+ if (GetCastleData("payg_cas02.gat",11) == 1) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",1;
+ if (GetCastleData("payg_cas02.gat",12) == 1) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",2;
+ if (GetCastleData("payg_cas02.gat",13) == 1) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",3;
+ if (GetCastleData("payg_cas02.gat",14) == 1) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",4;
+ if (GetCastleData("payg_cas02.gat",15) == 1) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",5;
+ if (GetCastleData("payg_cas02.gat",16) == 1) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",6;
+ if (GetCastleData("payg_cas02.gat",17) == 1) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas02.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+payg_cas03.gat,269,265,0 script Guardian_Py03 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas03.gat",10) == 1) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",0;
+ if (GetCastleData("payg_cas03.gat",11) == 1) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",1;
+ if (GetCastleData("payg_cas03.gat",12) == 1) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",2;
+ if (GetCastleData("payg_cas03.gat",13) == 1) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",3;
+ if (GetCastleData("payg_cas03.gat",14) == 1) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",4;
+ if (GetCastleData("payg_cas03.gat",15) == 1) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",5;
+ if (GetCastleData("payg_cas03.gat",16) == 1) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",6;
+ if (GetCastleData("payg_cas03.gat",17) == 1) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas03.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+payg_cas04.gat,271,29,0 script Guardian_Py04 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas04.gat",10) == 1) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",0;
+ if (GetCastleData("payg_cas04.gat",11) == 1) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",1;
+ if (GetCastleData("payg_cas04.gat",12) == 1) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",2;
+ if (GetCastleData("payg_cas04.gat",13) == 1) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",3;
+ if (GetCastleData("payg_cas04.gat",14) == 1) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",4;
+ if (GetCastleData("payg_cas04.gat",15) == 1) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",5;
+ if (GetCastleData("payg_cas04.gat",16) == 1) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",6;
+ if (GetCastleData("payg_cas04.gat",17) == 1) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas04.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+payg_cas05.gat,30,30,0 script Guardian_Py05 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas05.gat",10) == 1) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",0;
+ if (GetCastleData("payg_cas05.gat",11) == 1) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",1;
+ if (GetCastleData("payg_cas05.gat",12) == 1) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",2;
+ if (GetCastleData("payg_cas05.gat",13) == 1) guardian "payg_cas05.gat",18,281,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",3;
+ if (GetCastleData("payg_cas05.gat",14) == 1) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",4;
+ if (GetCastleData("payg_cas05.gat",15) == 1) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",5;
+ if (GetCastleData("payg_cas05.gat",16) == 1) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",6;
+ if (GetCastleData("payg_cas05.gat",17) == 1) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas05.gat","A Guardian Has Fallen",17;
+ end;
+}
diff --git a/npc/guild/payg/payg_kafras.txt b/npc/guild/payg/payg_kafras.txt
index 75e758ec3..c4e6c6c34 100644
--- a/npc/guild/payg/payg_kafras.txt
+++ b/npc/guild/payg/payg_kafras.txt
@@ -1,65 +1,65 @@
-//== eAthena Script ========================================
-//= War of Emperium Kafras for Payon Guild Castles
-//== By: =================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//== Current Version: ========================================
-//= 1.2
-//== Compatible With: ========================================
-//= eAthena 0.1+; RO Episode 4+
-//== Description: ============================================
-//= Provides Kafra services for guild members of Payon Castles.
-//= Used in conjuction with function F_Kafra.
-//== Additional Comments: ==================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 =============
-payg_cas01.gat,128,58,3 script Kafra Service#Py01 117,{
- callfunc "F_GKafra", "payg_cas01", "Payon";
- end;
-OnRecvCastlePy01:
- if (GetCastleData("payg_cas01.gat",9) < 1) disablenpc "Kafra Service#Py01";
- end;
-}
-
-
-// Castle 2 =============
-payg_cas02.gat,22,275,5 script Kafra Service#Py02 117,{
- callfunc "F_GKafra", "payg_cas02", "Payon";
- end;
-OnRecvCastlePy02:
- if (GetCastleData("payg_cas02.gat",9) < 1) disablenpc "Kafra Service#Py02";
- end;
-}
-
-
-// Castle 3 =============
-payg_cas03.gat,9,263,5 script Kafra Service#Py03 117,{
- callfunc "F_GKafra", "payg_cas03", "Payon";
- end;
-OnRecvCastlePy03:
- if (GetCastleData("payg_cas03.gat",9) < 1) disablenpc "Kafra Service#Py03";
- end;
-}
-
-
-// Castle 4 =============
-payg_cas04.gat,40,235,1 script Kafra Service#Py04 117,{
- callfunc "F_GKafra", "payg_cas04", "Payon";
- end;
-OnRecvCastlePy04:
- if (GetCastleData("payg_cas04.gat",9) < 1) disablenpc "Kafra Service#Py04";
- end;
-}
-
-
-// Castle 5 =============
-payg_cas05.gat,276,227,1 script Kafra Service#Py05 117,{
- callfunc "F_GKafra", "payg_cas05", "Payon";
- end;
-OnRecvCastlePy05:
- if (GetCastleData("payg_cas05.gat",9) < 1) disablenpc "Kafra Service#Py05";
- end;
-}
+//== eAthena Script ========================================
+//= War of Emperium Kafras for Payon Guild Castles
+//== By: =================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//== Current Version: ========================================
+//= 1.2
+//== Compatible With: ========================================
+//= eAthena 0.1+; RO Episode 4+
+//== Description: ============================================
+//= Provides Kafra services for guild members of Payon Castles.
+//= Used in conjuction with function F_Kafra.
+//== Additional Comments: ==================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 =============
+payg_cas01.gat,128,58,3 script Kafra Service#Py01 117,{
+ callfunc "F_GKafra", "payg_cas01", "Payon";
+ end;
+OnRecvCastlePy01:
+ if (GetCastleData("payg_cas01.gat",9) < 1) disablenpc "Kafra Service#Py01";
+ end;
+}
+
+
+// Castle 2 =============
+payg_cas02.gat,22,275,5 script Kafra Service#Py02 117,{
+ callfunc "F_GKafra", "payg_cas02", "Payon";
+ end;
+OnRecvCastlePy02:
+ if (GetCastleData("payg_cas02.gat",9) < 1) disablenpc "Kafra Service#Py02";
+ end;
+}
+
+
+// Castle 3 =============
+payg_cas03.gat,9,263,5 script Kafra Service#Py03 117,{
+ callfunc "F_GKafra", "payg_cas03", "Payon";
+ end;
+OnRecvCastlePy03:
+ if (GetCastleData("payg_cas03.gat",9) < 1) disablenpc "Kafra Service#Py03";
+ end;
+}
+
+
+// Castle 4 =============
+payg_cas04.gat,40,235,1 script Kafra Service#Py04 117,{
+ callfunc "F_GKafra", "payg_cas04", "Payon";
+ end;
+OnRecvCastlePy04:
+ if (GetCastleData("payg_cas04.gat",9) < 1) disablenpc "Kafra Service#Py04";
+ end;
+}
+
+
+// Castle 5 =============
+payg_cas05.gat,276,227,1 script Kafra Service#Py05 117,{
+ callfunc "F_GKafra", "payg_cas05", "Payon";
+ end;
+OnRecvCastlePy05:
+ if (GetCastleData("payg_cas05.gat",9) < 1) disablenpc "Kafra Service#Py05";
+ end;
+}
diff --git a/npc/guild/payg/payg_managers.txt b/npc/guild/payg/payg_managers.txt
index d6277825e..73d383ba4 100644
--- a/npc/guild/payg/payg_managers.txt
+++ b/npc/guild/payg/payg_managers.txt
@@ -1,104 +1,104 @@
-//===== eAthena Script =======================================
-//= War of Emperium Managers for Payon Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ==================================================================================
-payg_cas01.gat,120,58,4 script Grunday 55,{
- if(callfunc("F_GldManager","Grunday","payg_cas01",290,7,"Py01") == 0) close;
-
- if(@GDnum==10) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",7;
- mes "[ Grunday ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 2 ==================================================================================
-payg_cas02.gat,22,260,7 script Cherrios 55,{
- if(callfunc("F_GldManager","Cherrios","payg_cas02",145,143,"Py02") == 0) close;
-
- if(@GDnum==10) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",7;
- mes "[ Cherrios ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 3 ==================================================================================
-payg_cas03.gat,10,277,0 script Garriet 55,{
- if(callfunc("F_GldManager","Garriet","payg_cas03",158,168,"Py03") == 0) close;
-
- if(@GDnum==10) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",7;
- mes "[ Garriet ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 4 ==================================================================================
-payg_cas04.gat,38,284,3 script DJ 55,{
- if(callfunc("F_GldManager","DJ","payg_cas04",146,48,"Py04") == 0) close;
-
- if(@GDnum==10) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",7;
- mes "[ DJ ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 5 ==================================================================================
-payg_cas05.gat,277,249,3 script Najarf 55,{
- if(callfunc("F_GldManager","Najarf","payg_cas05",156,131,"Py05") == 0) close;
-
- if(@GDnum==10) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas05.gat",18,281,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",7;
- mes "[ Najarf ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Managers for Payon Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ==================================================================================
+payg_cas01.gat,120,58,4 script Grunday 55,{
+ if(callfunc("F_GldManager","Grunday","payg_cas01",290,7,"Py01") == 0) close;
+
+ if(@GDnum==10) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_Py01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_Py01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_Py01::OnGuardianDied",7;
+ mes "[ Grunday ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 2 ==================================================================================
+payg_cas02.gat,22,260,7 script Cherrios 55,{
+ if(callfunc("F_GldManager","Cherrios","payg_cas02",145,143,"Py02") == 0) close;
+
+ if(@GDnum==10) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_Py02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_Py02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_Py02::OnGuardianDied",7;
+ mes "[ Cherrios ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 3 ==================================================================================
+payg_cas03.gat,10,277,0 script Garriet 55,{
+ if(callfunc("F_GldManager","Garriet","payg_cas03",158,168,"Py03") == 0) close;
+
+ if(@GDnum==10) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_Py03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_Py03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_Py03::OnGuardianDied",7;
+ mes "[ Garriet ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 4 ==================================================================================
+payg_cas04.gat,38,284,3 script DJ 55,{
+ if(callfunc("F_GldManager","DJ","payg_cas04",146,48,"Py04") == 0) close;
+
+ if(@GDnum==10) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_Py04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_Py04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_Py04::OnGuardianDied",7;
+ mes "[ DJ ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 5 ==================================================================================
+payg_cas05.gat,277,249,3 script Najarf 55,{
+ if(callfunc("F_GldManager","Najarf","payg_cas05",156,131,"Py05") == 0) close;
+
+ if(@GDnum==10) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_Py05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas05.gat",18,281,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_Py05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_Py05::OnGuardianDied",7;
+ mes "[ Najarf ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
diff --git a/npc/guild/payg/payg_treas.txt b/npc/guild/payg/payg_treas.txt
index d5ca867c9..10a1f0d7d 100644
--- a/npc/guild/payg/payg_treas.txt
+++ b/npc/guild/payg/payg_treas.txt
@@ -1,140 +1,140 @@
-//===== eAthena Script =======================================
-//= War of Emperium Treasure Rooms for Payon Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-//<================================ Castle 1 ================================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-payg_cas01.gat,1,1,0 script Treasure_Py01 -1,{
-OnRecvCastlePy01:
- end;
-OnInit:
- if($boxNumPy01 == 0) end;
- set $@bxPy01, $boxNumPy01;
- callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,1;
- end;
-
-OnDied:
- mapannounce "payg_cas01.gat","Treasure Chest Broken Open",17;
- set $boxNumPy01, $boxNumPy01 -1;
- if($boxNumPy01 == 0) mapannounce "payg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ---------------------------------------------------
-payg_cas01.gat,295,8,0 script Switch#TresPy01 111,{
- callfunc "F_GldTreasSw", "payg_cas01",120,59;
- end;
-}
-
-
-//<================================ Castle 2 ================================>\\
-// Treasure Spawn ----------------------------------------------------------
-payg_cas02.gat,1,1,0 script Treasure_Py02 -1,{
-OnRecvCastlePy02:
- end;
-OnInit:
- if($boxNumPy02 == 0) end;
- set $@bxPy02, $boxNumPy02;
- callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,1;
- end;
-
-OnDied:
- mapannounce "payg_cas02.gat","Treasure Chest Broken Open",17;
- set $boxNumPy02, $boxNumPy02 -1;
- if($boxNumPy02 == 0) mapannounce "payg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-payg_cas02.gat,149,148,0 script Switch#TresPy02 111,{
- callfunc "F_GldTreasSw", "payg_cas02",22,261;
- end;
-}
-
-
-//<================================ Castle 3 ================================>\\
-// Treasure Spawn ----------------------------------------------------------
-payg_cas03.gat,158,168,0 script Treasure_Py03 -1,{
-OnRecvCastlePy03:
- end;
-OnInit:
- if($boxNumPy03 == 0) end;
- set $@bxPy03, $boxNumPy03;
- callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,1;
- end;
-
-OnDied:
- mapannounce "payg_cas03.gat","Treasure Chest Broken Open",17;
- set $boxNumPy03, $boxNumPy03 -1;
- if($boxNumPy03 == 0) mapannounce "payg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-payg_cas03.gat,163,167,0 script Switch#TresPy03 111,{
- callfunc "F_GldTreasSw", "payg_cas03",11,278;
- end;
-}
-
-
-//<================================ Castle 4 ================================>\\
-// Treasure Spawn ----------------------------------------------------------
-payg_cas04.gat,146,48,0 script Treasure_Py04 -1,{
-OnRecvCastlePy04:
- end;
-OnInit:
- if($boxNumPy04 == 0) end;
- set $@bxPy04, $boxNumPy04;
- callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,1;
- end;
-
-OnDied:
- mapannounce "payg_cas04.gat","Treasure Chest Broken Open",17;
- set $boxNumPy04, $boxNumPy04 -1;
- if($boxNumPy04 == 0) mapannounce "payg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-payg_cas04.gat,151,47,0 script Switch#TresPy04 111,{
- callfunc "F_GldTreasSw", "payg_cas04",38,285;
- end;
-}
-
-
-//<================================ Castle 5 ================================>\\
-// Treasure Spawn ----------------------------------------------------------
-payg_cas05.gat,156,131,0 script Treasure_Py05 -1,{
-OnRecvCastlePy05:
- end;
-OnInit:
- if($boxNumPy05 == 0) end;
- set $@bxPy05, $boxNumPy05;
- callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,1;
- end;
-
-OnDied:
- mapannounce "payg_cas05.gat","Treasure Chest Broken Open",17;
- set $boxNumPy05, $boxNumPy05 -1;
- if($boxNumPy05 == 0) mapannounce "payg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-payg_cas05.gat,161,136,0 script Switch#TresPy05 111,{
- callfunc "F_GldTreasSw", "payg_cas05",277,250;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Treasure Rooms for Payon Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+//<================================ Castle 1 ================================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+payg_cas01.gat,1,1,0 script Treasure_Py01 -1,{
+OnRecvCastlePy01:
+ end;
+OnInit:
+ if($boxNumPy01 == 0) end;
+ set $@bxPy01, $boxNumPy01;
+ callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,1;
+ end;
+
+OnDied:
+ mapannounce "payg_cas01.gat","Treasure Chest Broken Open",17;
+ set $boxNumPy01, $boxNumPy01 -1;
+ if($boxNumPy01 == 0) mapannounce "payg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ---------------------------------------------------
+payg_cas01.gat,295,8,0 script Switch#TresPy01 111,{
+ callfunc "F_GldTreasSw", "payg_cas01",120,59;
+ end;
+}
+
+
+//<================================ Castle 2 ================================>\\
+// Treasure Spawn ----------------------------------------------------------
+payg_cas02.gat,1,1,0 script Treasure_Py02 -1,{
+OnRecvCastlePy02:
+ end;
+OnInit:
+ if($boxNumPy02 == 0) end;
+ set $@bxPy02, $boxNumPy02;
+ callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,1;
+ end;
+
+OnDied:
+ mapannounce "payg_cas02.gat","Treasure Chest Broken Open",17;
+ set $boxNumPy02, $boxNumPy02 -1;
+ if($boxNumPy02 == 0) mapannounce "payg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+payg_cas02.gat,149,148,0 script Switch#TresPy02 111,{
+ callfunc "F_GldTreasSw", "payg_cas02",22,261;
+ end;
+}
+
+
+//<================================ Castle 3 ================================>\\
+// Treasure Spawn ----------------------------------------------------------
+payg_cas03.gat,158,168,0 script Treasure_Py03 -1,{
+OnRecvCastlePy03:
+ end;
+OnInit:
+ if($boxNumPy03 == 0) end;
+ set $@bxPy03, $boxNumPy03;
+ callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,1;
+ end;
+
+OnDied:
+ mapannounce "payg_cas03.gat","Treasure Chest Broken Open",17;
+ set $boxNumPy03, $boxNumPy03 -1;
+ if($boxNumPy03 == 0) mapannounce "payg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+payg_cas03.gat,163,167,0 script Switch#TresPy03 111,{
+ callfunc "F_GldTreasSw", "payg_cas03",11,278;
+ end;
+}
+
+
+//<================================ Castle 4 ================================>\\
+// Treasure Spawn ----------------------------------------------------------
+payg_cas04.gat,146,48,0 script Treasure_Py04 -1,{
+OnRecvCastlePy04:
+ end;
+OnInit:
+ if($boxNumPy04 == 0) end;
+ set $@bxPy04, $boxNumPy04;
+ callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,1;
+ end;
+
+OnDied:
+ mapannounce "payg_cas04.gat","Treasure Chest Broken Open",17;
+ set $boxNumPy04, $boxNumPy04 -1;
+ if($boxNumPy04 == 0) mapannounce "payg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+payg_cas04.gat,151,47,0 script Switch#TresPy04 111,{
+ callfunc "F_GldTreasSw", "payg_cas04",38,285;
+ end;
+}
+
+
+//<================================ Castle 5 ================================>\\
+// Treasure Spawn ----------------------------------------------------------
+payg_cas05.gat,156,131,0 script Treasure_Py05 -1,{
+OnRecvCastlePy05:
+ end;
+OnInit:
+ if($boxNumPy05 == 0) end;
+ set $@bxPy05, $boxNumPy05;
+ callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,1;
+ end;
+
+OnDied:
+ mapannounce "payg_cas05.gat","Treasure Chest Broken Open",17;
+ set $boxNumPy05, $boxNumPy05 -1;
+ if($boxNumPy05 == 0) mapannounce "payg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+payg_cas05.gat,161,136,0 script Switch#TresPy05 111,{
+ callfunc "F_GldTreasSw", "payg_cas05",277,250;
+ end;
+}
diff --git a/npc/guild/prtg/prtg_dunsw.txt b/npc/guild/prtg/prtg_dunsw.txt
index 8284147a7..cfe99c771 100644
--- a/npc/guild/prtg/prtg_dunsw.txt
+++ b/npc/guild/prtg/prtg_dunsw.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for Prontera Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Switch that warps guild members to the guild dungeon
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ================================================
-prtg_cas01.gat,94,200,0 script Switch#DunPt01 111,{
- callfunc "F_GldDunSw","prtg_cas01","03",28,251;
- close;
-}
-
-
-// Castle 2 ================================================
-prtg_cas02.gat,84,72,0 script Switch#DunPt02 111,{
- callfunc "F_GldDunSw","prtg_cas02","03",164,268;
- close;
-}
-
-
-// Castle 3 ================================================
-prtg_cas03.gat,5,70,0 script Switch#DunPt03 111,{
- callfunc "F_GldDunSw","prtg_cas03","03",164,179;
- close;
-}
-
-
-// Castle 4 ================================================
-prtg_cas04.gat,56,283,0 script Switch#DunPt04 111,{
- callfunc "F_GldDunSw","prtg_cas04","03",268,203;
- close;
-}
-
-
-// Castle 5 ================================================
-prtg_cas05.gat,212,94,0 script Switch#DunPt05 111,{
- callfunc "F_GldDunSw","prtg_cas05","03",199,28;
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Dungeon Switch for Prontera Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Switch that warps guild members to the guild dungeon
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ================================================
+prtg_cas01.gat,94,200,0 script Switch#DunPt01 111,{
+ callfunc "F_GldDunSw","prtg_cas01","03",28,251;
+ close;
+}
+
+
+// Castle 2 ================================================
+prtg_cas02.gat,84,72,0 script Switch#DunPt02 111,{
+ callfunc "F_GldDunSw","prtg_cas02","03",164,268;
+ close;
+}
+
+
+// Castle 3 ================================================
+prtg_cas03.gat,5,70,0 script Switch#DunPt03 111,{
+ callfunc "F_GldDunSw","prtg_cas03","03",164,179;
+ close;
+}
+
+
+// Castle 4 ================================================
+prtg_cas04.gat,56,283,0 script Switch#DunPt04 111,{
+ callfunc "F_GldDunSw","prtg_cas04","03",268,203;
+ close;
+}
+
+
+// Castle 5 ================================================
+prtg_cas05.gat,212,94,0 script Switch#DunPt05 111,{
+ callfunc "F_GldDunSw","prtg_cas05","03",199,28;
+ close;
+}
diff --git a/npc/guild/prtg/prtg_ev_agit.txt b/npc/guild/prtg/prtg_ev_agit.txt
index aa144141f..ed9a797fa 100644
--- a/npc/guild/prtg/prtg_ev_agit.txt
+++ b/npc/guild/prtg/prtg_ev_agit.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Prontera Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Prontera Guild Wars
-//===== Additional Comments: =================================
-//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
-//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
-//============================================================
-
-
-// Castle 1 ================================================================
-prtg_cas01.gat,197,197,0 script Agit_Pt01 -1,{
-OnInterIfInitOnce:
- GetCastleData "prtg_cas01.gat",0,"::OnRecvCastlePt01";
- end;
-OnRecvCastlePt01:
- RequestGuildInfo GetCastleData("prtg_cas01.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","prtg_cas01","Pt01",197,197;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","prtg_cas01","Pt01";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","prtg_cas01","Pt01";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),6;
- Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_Pt01::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","prtg_cas01","Pt01";
- end;
-}
-
-// Castle 2 ================================================================
-prtg_cas02.gat,158,174,0 script Agit_Pt02 -1,{
-OnInterIfInitOnce:
- GetCastleData "prtg_cas02.gat",0,"::OnRecvCastlePt02";
- end;
-OnRecvCastlePt02:
- RequestGuildInfo GetCastleData("prtg_cas02.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","prtg_cas02","Pt02",158,174;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","prtg_cas02","Pt02";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","prtg_cas02","Pt02";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),6;
- Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_Pt02::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","prtg_cas02","Pt02";
- end;
-}
-
-// Castle 3 ================================================================
-prtg_cas03.gat,17,221,0 script Agit_Pt03 -1,{
-OnInterIfInitOnce:
- GetCastleData "prtg_cas03.gat",0,"::OnRecvCastlePt03";
- end;
-OnRecvCastlePt03:
- RequestGuildInfo GetCastleData("prtg_cas03.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","prtg_cas03","Pt03",17,221;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","prtg_cas03","Pt03";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","prtg_cas03","Pt03";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),6;
- Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_Pt03::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","prtg_cas03","Pt03";
- end;
-}
-
-// Castle 4 ================================================================
-prtg_cas04.gat,292,14,0 script Agit_Pt04 -1,{
-OnInterIfInitOnce:
- GetCastleData "prtg_cas04.gat",0,"::OnRecvCastlePt04";
- end;
-OnRecvCastlePt04:
- RequestGuildInfo GetCastleData("prtg_cas04.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","prtg_cas04","Pt04",292,14;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","prtg_cas04","Pt04";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","prtg_cas04","Pt04";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),6;
- Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_Pt04::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","prtg_cas04","Pt04";
- end;
-}
-
-// Castle 5 ================================================================
-prtg_cas05.gat,266,266,0 script Agit_Pt05 -1,{
-OnInterIfInitOnce:
- GetCastleData "prtg_cas05.gat",0,"::OnRecvCastlePt05";
- end;
-OnRecvCastlePt05:
- RequestGuildInfo GetCastleData("prtg_cas05.gat",1);
- end;
-OnAgitStart:
- callfunc "F_AgitStart","prtg_cas05","Pt05",266,266;
- end;
-OnAgitBreak:
- callfunc "F_AgitBreak","prtg_cas05","Pt05";
- end;
-OnGuildBreak:
- callfunc "F_GuildBreak","prtg_cas05","Pt05";
- end;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),6;
- Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_Pt05::OnAgitBreak";
- end;
-OnAgitEnd:
- callfunc "F_AgitEnd","prtg_cas05","Pt05";
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - Prontera Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Prontera Guild Wars
+//===== Additional Comments: =================================
+//= v1.2 Now using functions for OnAgitStart and OnAgitBreak. [kobra_k88]
+//= 1.3 Added code for abandoning captured castles on /breakguild [Lupus]
+//============================================================
+
+
+// Castle 1 ================================================================
+prtg_cas01.gat,197,197,0 script Agit_Pt01 -1,{
+OnInterIfInitOnce:
+ GetCastleData "prtg_cas01.gat",0,"::OnRecvCastlePt01";
+ end;
+OnRecvCastlePt01:
+ RequestGuildInfo GetCastleData("prtg_cas01.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","prtg_cas01","Pt01",197,197;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","prtg_cas01","Pt01";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","prtg_cas01","Pt01";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),6;
+ Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_Pt01::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","prtg_cas01","Pt01";
+ end;
+}
+
+// Castle 2 ================================================================
+prtg_cas02.gat,158,174,0 script Agit_Pt02 -1,{
+OnInterIfInitOnce:
+ GetCastleData "prtg_cas02.gat",0,"::OnRecvCastlePt02";
+ end;
+OnRecvCastlePt02:
+ RequestGuildInfo GetCastleData("prtg_cas02.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","prtg_cas02","Pt02",158,174;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","prtg_cas02","Pt02";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","prtg_cas02","Pt02";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),6;
+ Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_Pt02::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","prtg_cas02","Pt02";
+ end;
+}
+
+// Castle 3 ================================================================
+prtg_cas03.gat,17,221,0 script Agit_Pt03 -1,{
+OnInterIfInitOnce:
+ GetCastleData "prtg_cas03.gat",0,"::OnRecvCastlePt03";
+ end;
+OnRecvCastlePt03:
+ RequestGuildInfo GetCastleData("prtg_cas03.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","prtg_cas03","Pt03",17,221;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","prtg_cas03","Pt03";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","prtg_cas03","Pt03";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),6;
+ Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_Pt03::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","prtg_cas03","Pt03";
+ end;
+}
+
+// Castle 4 ================================================================
+prtg_cas04.gat,292,14,0 script Agit_Pt04 -1,{
+OnInterIfInitOnce:
+ GetCastleData "prtg_cas04.gat",0,"::OnRecvCastlePt04";
+ end;
+OnRecvCastlePt04:
+ RequestGuildInfo GetCastleData("prtg_cas04.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","prtg_cas04","Pt04",292,14;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","prtg_cas04","Pt04";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","prtg_cas04","Pt04";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),6;
+ Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_Pt04::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","prtg_cas04","Pt04";
+ end;
+}
+
+// Castle 5 ================================================================
+prtg_cas05.gat,266,266,0 script Agit_Pt05 -1,{
+OnInterIfInitOnce:
+ GetCastleData "prtg_cas05.gat",0,"::OnRecvCastlePt05";
+ end;
+OnRecvCastlePt05:
+ RequestGuildInfo GetCastleData("prtg_cas05.gat",1);
+ end;
+OnAgitStart:
+ callfunc "F_AgitStart","prtg_cas05","Pt05",266,266;
+ end;
+OnAgitBreak:
+ callfunc "F_AgitBreak","prtg_cas05","Pt05";
+ end;
+OnGuildBreak:
+ callfunc "F_GuildBreak","prtg_cas05","Pt05";
+ end;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),6;
+ Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_Pt05::OnAgitBreak";
+ end;
+OnAgitEnd:
+ callfunc "F_AgitEnd","prtg_cas05","Pt05";
+ end;
+}
diff --git a/npc/guild/prtg/prtg_flags.txt b/npc/guild/prtg/prtg_flags.txt
index ab835b519..6473ce633 100644
--- a/npc/guild/prtg/prtg_flags.txt
+++ b/npc/guild/prtg/prtg_flags.txt
@@ -1,207 +1,207 @@
-//===== eAthena Script =======================================
-//= War of Emperium Prontera Guild Flags
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= WoE flag scripts. Displays guild emblems on flags.
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//= v1.3 Changed to iRO castle names [DracoRPG]
-//= v1.4 Can now only flag in from outside the castle [Kayla]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-prontera.gat,155,190,4 script Kriemhild#p1-1::Kriemhild 722,{
- callfunc "F_Flags","Prontera","prtg_cas01",97,174,0;
- close;
-
-OnRecvCastlePt01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- end;
-}
-
-prt_gld.gat,131,60,6 script Kriemhild#p1-2::Kriemhild2 722,{
- callfunc "F_Flags","Prontera","prtg_cas01",97,174,1;
- close;
-
-OnRecvCastlePt01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,138,68,6 duplicate(Kriemhild2) Kriemhild#p1-3 722
-prt_gld.gat,138,60,6 duplicate(Kriemhild2) Kriemhild#p1-4 722
-prt_gld.gat,135,60,6 duplicate(Kriemhild2) Kriemhild#p1-5 722
-// In Castle =============================================
-prtg_cas01.gat,58,56,4 duplicate(Kriemhild) Kriemhild#p1-6 722
-prtg_cas01.gat,64,56,4 duplicate(Kriemhild) Kriemhild#p1-7 722
-prtg_cas01.gat,76,32,4 duplicate(Kriemhild) Kriemhild#p1-8 722
-prtg_cas01.gat,84,32,4 duplicate(Kriemhild) Kriemhild#p1-9 722
-prtg_cas01.gat,94,39,4 duplicate(Kriemhild) Kriemhild#p1-10 722
-prtg_cas01.gat,94,24,4 duplicate(Kriemhild) Kriemhild#p1-11 722
-prtg_cas01.gat,73,14,4 duplicate(Kriemhild) Kriemhild#p1-12 722
-prtg_cas01.gat,73,6,4 duplicate(Kriemhild) Kriemhild#p1-13 722
-prtg_cas01.gat,55,46,4 duplicate(Kriemhild) Kriemhild#p1-14 722
-prtg_cas01.gat,45,46,4 duplicate(Kriemhild) Kriemhild#p1-15 722
-
-
-
-//================================================================================//
-// Castle 2
-//================================================================================//
-prontera.gat,146,194,3 script Swanhild#p2-1::Swanhild 722,{
- callfunc "F_Flags","Prontera","prtg_cas02",71,36,0;
- close;
-
-OnRecvCastlePt02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- end;
-}
-
-prt_gld.gat,244,126,8 script Swanhild#p2-2::Swanhild2 722,{
- callfunc "F_Flags","Prontera","prtg_cas02",71,36,1;
- close;
-
-OnRecvCastlePt02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,244,128,8 duplicate(Swanhild2) Swanhild#p2-3 722
-prt_gld.gat,236,126,8 duplicate(Swanhild2) Swanhild#p2-4 722
-prt_gld.gat,236,128,8 duplicate(Swanhild2) Swanhild#p2-5 722
-// In Castle =============================================
-prtg_cas02.gat,40,227,4 duplicate(Swanhild) Swanhild#p2-6 722
-prtg_cas02.gat,46,227,4 duplicate(Swanhild) Swanhild#p2-7 722
-prtg_cas02.gat,11,219,4 duplicate(Swanhild) Swanhild#p2-8 722
-prtg_cas02.gat,11,214,4 duplicate(Swanhild) Swanhild#p2-9 722
-prtg_cas02.gat,20,219,4 duplicate(Swanhild) Swanhild#p2-10 722
-prtg_cas02.gat,20,214,4 duplicate(Swanhild) Swanhild#p2-11 722
-prtg_cas02.gat,79,227,8 duplicate(Swanhild) Swanhild#p2-12 722
-prtg_cas02.gat,70,227,8 duplicate(Swanhild) Swanhild#p2-13 722
-prtg_cas02.gat,38,189,8 duplicate(Swanhild) Swanhild#p2-14 722
-prtg_cas02.gat,34,189,8 duplicate(Swanhild) Swanhild#p2-15 722
-prtg_cas02.gat,153,161,4 duplicate(Swanhild) Swanhild#p2-16 722
-prtg_cas02.gat,162,161,4 duplicate(Swanhild) Swanhild#p2-17 722
-
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-prontera.gat,143,203,2 script Fadhgridh#p3-1::Fadhgridh 722,{
- callfunc "F_Flags","Prontera","prtg_cas03",45,99,0;
- close;
-
-OnRecvCastlePt03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- end;
-}
-
-prt_gld.gat,147,140,4 script Fadhgridh#p3-2::Fadhgridh2 722,{
- callfunc "F_Flags","Prontera","prtg_cas03",45,99,1;
- close;
-
-OnRecvCastlePt03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,147,136,4 duplicate(Fadhgridh2) Fadhgridh#p3-3 722
-prt_gld.gat,158,140,4 duplicate(Fadhgridh2) Fadhgridh#p3-4 722
-prt_gld.gat,158,136,4 duplicate(Fadhgridh2) Fadhgridh#p3-5 722
-// In Castle ============================================
-prtg_cas03.gat,168,28,4 duplicate(Fadhgridh) Fadhgridh#p3-6 722
-prtg_cas03.gat,182,28,4 duplicate(Fadhgridh) Fadhgridh#p3-7 722
-prtg_cas03.gat,43,50,4 duplicate(Fadhgridh) Fadhgridh#p3-8 722
-prtg_cas03.gat,48,50,4 duplicate(Fadhgridh) Fadhgridh#p3-9 722
-prtg_cas03.gat,43,58,4 duplicate(Fadhgridh) Fadhgridh#p3-10 722
-prtg_cas03.gat,48,58,4 duplicate(Fadhgridh) Fadhgridh#p3-11 722
-prtg_cas03.gat,158,210,4 duplicate(Fadhgridh) Fadhgridh#p3-12 722
-prtg_cas03.gat,169,210,4 duplicate(Fadhgridh) Fadhgridh#p3-13 722
-prtg_cas03.gat,162,201,4 duplicate(Fadhgridh) Fadhgridh#p3-14 722
-prtg_cas03.gat,165,201,4 duplicate(Fadhgridh) Fadhgridh#p3-15 722
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-prontera.gat,167,203,6 script Skoegul#p4-1::Skoegul 722,{
- callfunc "F_Flags","Prontera","prtg_cas04",259,265,0;
- close;
-
-OnRecvCastlePt04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- end;
-}
-
-prt_gld.gat,120,243,6 script Skoegul#p4-2::Skoegul2 722,{
- callfunc "F_Flags","Prontera","prtg_cas04",259,265,1;
- close;
-
-OnRecvCastlePt04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,120,236,6 duplicate(Skoegul2) Skoegul#p4-3 722
-prt_gld.gat,122,243,6 duplicate(Skoegul2) Skoegul#p4-4 722
-prt_gld.gat,122,246,6 duplicate(Skoegul2) Skoegul#p4-5 722
-// In Castle =============================================
-prtg_cas04.gat,82,29,4 duplicate(Skoegul) Skoegul#p4-6 722
-prtg_cas04.gat,75,29,4 duplicate(Skoegul) Skoegul#p4-7 722
-prtg_cas04.gat,75,27,4 duplicate(Skoegul) Skoegul#p4-8 722
-prtg_cas04.gat,82,27,4 duplicate(Skoegul) Skoegul#p4-9 722
-prtg_cas04.gat,59,29,4 duplicate(Skoegul) Skoegul#p4-10 722
-prtg_cas04.gat,67,29,4 duplicate(Skoegul) Skoegul#p4-11 722
-prtg_cas04.gat,258,25,4 duplicate(Skoegul) Skoegul#p4-12 722
-prtg_cas04.gat,258,20,4 duplicate(Skoegul) Skoegul#p4-13 722
-prtg_cas04.gat,263,20,4 duplicate(Skoegul) Skoegul#p4-14 722
-prtg_cas04.gat,263,27,4 duplicate(Skoegul) Skoegul#p4-15 722
-
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-prontera.gat,165,194,5 script Gondul#p5-1::Gondul 722,{
- callfunc "F_Flags","Prontera","prtg_cas05",34,30,0;
- close;
-
-OnRecvCastlePt05:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- end;
-}
-
-prt_gld.gat,199,243,2 script Gondul#p5-2::Gondul2 722,{
- callfunc "F_Flags","Prontera","prtg_cas05",34,30,1;
- close;
-
-OnRecvCastlePt05:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,199,236,2 duplicate(Gondul2) Gondul#p5-3 722
-prt_gld.gat,197,243,2 duplicate(Gondul2) Gondul#p5-4 722
-prt_gld.gat,197,236,2 duplicate(Gondul2) Gondul#p5-5 722
-// In Castle =============================================
-prtg_cas05.gat,19,247,4 duplicate(Gondul) Gondul#p5-6 722
-prtg_cas05.gat,19,243,4 duplicate(Gondul) Gondul#p5-7 722
-prtg_cas05.gat,26,247,4 duplicate(Gondul) Gondul#p5-8 722
-prtg_cas05.gat,26,243,4 duplicate(Gondul) Gondul#p5-9 722
-prtg_cas05.gat,249,289,4 duplicate(Gondul) Gondul#p5-10 722
-prtg_cas05.gat,256,289,4 duplicate(Gondul) Gondul#p5-11 722
-prtg_cas05.gat,253,271,4 duplicate(Gondul) Gondul#p5-12 722
-prtg_cas05.gat,273,257,4 duplicate(Gondul) Gondul#p5-13 722
+//===== eAthena Script =======================================
+//= War of Emperium Prontera Guild Flags
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= WoE flag scripts. Displays guild emblems on flags.
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//= v1.3 Changed to iRO castle names [DracoRPG]
+//= v1.4 Can now only flag in from outside the castle [Kayla]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+prontera.gat,155,190,4 script Kriemhild#p1-1::Kriemhild 722,{
+ callfunc "F_Flags","Prontera","prtg_cas01",97,174,0;
+ close;
+
+OnRecvCastlePt01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ end;
+}
+
+prt_gld.gat,131,60,6 script Kriemhild#p1-2::Kriemhild2 722,{
+ callfunc "F_Flags","Prontera","prtg_cas01",97,174,1;
+ close;
+
+OnRecvCastlePt01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,138,68,6 duplicate(Kriemhild2) Kriemhild#p1-3 722
+prt_gld.gat,138,60,6 duplicate(Kriemhild2) Kriemhild#p1-4 722
+prt_gld.gat,135,60,6 duplicate(Kriemhild2) Kriemhild#p1-5 722
+// In Castle =============================================
+prtg_cas01.gat,58,56,4 duplicate(Kriemhild) Kriemhild#p1-6 722
+prtg_cas01.gat,64,56,4 duplicate(Kriemhild) Kriemhild#p1-7 722
+prtg_cas01.gat,76,32,4 duplicate(Kriemhild) Kriemhild#p1-8 722
+prtg_cas01.gat,84,32,4 duplicate(Kriemhild) Kriemhild#p1-9 722
+prtg_cas01.gat,94,39,4 duplicate(Kriemhild) Kriemhild#p1-10 722
+prtg_cas01.gat,94,24,4 duplicate(Kriemhild) Kriemhild#p1-11 722
+prtg_cas01.gat,73,14,4 duplicate(Kriemhild) Kriemhild#p1-12 722
+prtg_cas01.gat,73,6,4 duplicate(Kriemhild) Kriemhild#p1-13 722
+prtg_cas01.gat,55,46,4 duplicate(Kriemhild) Kriemhild#p1-14 722
+prtg_cas01.gat,45,46,4 duplicate(Kriemhild) Kriemhild#p1-15 722
+
+
+
+//================================================================================//
+// Castle 2
+//================================================================================//
+prontera.gat,146,194,3 script Swanhild#p2-1::Swanhild 722,{
+ callfunc "F_Flags","Prontera","prtg_cas02",71,36,0;
+ close;
+
+OnRecvCastlePt02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ end;
+}
+
+prt_gld.gat,244,126,8 script Swanhild#p2-2::Swanhild2 722,{
+ callfunc "F_Flags","Prontera","prtg_cas02",71,36,1;
+ close;
+
+OnRecvCastlePt02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,244,128,8 duplicate(Swanhild2) Swanhild#p2-3 722
+prt_gld.gat,236,126,8 duplicate(Swanhild2) Swanhild#p2-4 722
+prt_gld.gat,236,128,8 duplicate(Swanhild2) Swanhild#p2-5 722
+// In Castle =============================================
+prtg_cas02.gat,40,227,4 duplicate(Swanhild) Swanhild#p2-6 722
+prtg_cas02.gat,46,227,4 duplicate(Swanhild) Swanhild#p2-7 722
+prtg_cas02.gat,11,219,4 duplicate(Swanhild) Swanhild#p2-8 722
+prtg_cas02.gat,11,214,4 duplicate(Swanhild) Swanhild#p2-9 722
+prtg_cas02.gat,20,219,4 duplicate(Swanhild) Swanhild#p2-10 722
+prtg_cas02.gat,20,214,4 duplicate(Swanhild) Swanhild#p2-11 722
+prtg_cas02.gat,79,227,8 duplicate(Swanhild) Swanhild#p2-12 722
+prtg_cas02.gat,70,227,8 duplicate(Swanhild) Swanhild#p2-13 722
+prtg_cas02.gat,38,189,8 duplicate(Swanhild) Swanhild#p2-14 722
+prtg_cas02.gat,34,189,8 duplicate(Swanhild) Swanhild#p2-15 722
+prtg_cas02.gat,153,161,4 duplicate(Swanhild) Swanhild#p2-16 722
+prtg_cas02.gat,162,161,4 duplicate(Swanhild) Swanhild#p2-17 722
+
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+prontera.gat,143,203,2 script Fadhgridh#p3-1::Fadhgridh 722,{
+ callfunc "F_Flags","Prontera","prtg_cas03",45,99,0;
+ close;
+
+OnRecvCastlePt03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ end;
+}
+
+prt_gld.gat,147,140,4 script Fadhgridh#p3-2::Fadhgridh2 722,{
+ callfunc "F_Flags","Prontera","prtg_cas03",45,99,1;
+ close;
+
+OnRecvCastlePt03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,147,136,4 duplicate(Fadhgridh2) Fadhgridh#p3-3 722
+prt_gld.gat,158,140,4 duplicate(Fadhgridh2) Fadhgridh#p3-4 722
+prt_gld.gat,158,136,4 duplicate(Fadhgridh2) Fadhgridh#p3-5 722
+// In Castle ============================================
+prtg_cas03.gat,168,28,4 duplicate(Fadhgridh) Fadhgridh#p3-6 722
+prtg_cas03.gat,182,28,4 duplicate(Fadhgridh) Fadhgridh#p3-7 722
+prtg_cas03.gat,43,50,4 duplicate(Fadhgridh) Fadhgridh#p3-8 722
+prtg_cas03.gat,48,50,4 duplicate(Fadhgridh) Fadhgridh#p3-9 722
+prtg_cas03.gat,43,58,4 duplicate(Fadhgridh) Fadhgridh#p3-10 722
+prtg_cas03.gat,48,58,4 duplicate(Fadhgridh) Fadhgridh#p3-11 722
+prtg_cas03.gat,158,210,4 duplicate(Fadhgridh) Fadhgridh#p3-12 722
+prtg_cas03.gat,169,210,4 duplicate(Fadhgridh) Fadhgridh#p3-13 722
+prtg_cas03.gat,162,201,4 duplicate(Fadhgridh) Fadhgridh#p3-14 722
+prtg_cas03.gat,165,201,4 duplicate(Fadhgridh) Fadhgridh#p3-15 722
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+prontera.gat,167,203,6 script Skoegul#p4-1::Skoegul 722,{
+ callfunc "F_Flags","Prontera","prtg_cas04",259,265,0;
+ close;
+
+OnRecvCastlePt04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ end;
+}
+
+prt_gld.gat,120,243,6 script Skoegul#p4-2::Skoegul2 722,{
+ callfunc "F_Flags","Prontera","prtg_cas04",259,265,1;
+ close;
+
+OnRecvCastlePt04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,120,236,6 duplicate(Skoegul2) Skoegul#p4-3 722
+prt_gld.gat,122,243,6 duplicate(Skoegul2) Skoegul#p4-4 722
+prt_gld.gat,122,246,6 duplicate(Skoegul2) Skoegul#p4-5 722
+// In Castle =============================================
+prtg_cas04.gat,82,29,4 duplicate(Skoegul) Skoegul#p4-6 722
+prtg_cas04.gat,75,29,4 duplicate(Skoegul) Skoegul#p4-7 722
+prtg_cas04.gat,75,27,4 duplicate(Skoegul) Skoegul#p4-8 722
+prtg_cas04.gat,82,27,4 duplicate(Skoegul) Skoegul#p4-9 722
+prtg_cas04.gat,59,29,4 duplicate(Skoegul) Skoegul#p4-10 722
+prtg_cas04.gat,67,29,4 duplicate(Skoegul) Skoegul#p4-11 722
+prtg_cas04.gat,258,25,4 duplicate(Skoegul) Skoegul#p4-12 722
+prtg_cas04.gat,258,20,4 duplicate(Skoegul) Skoegul#p4-13 722
+prtg_cas04.gat,263,20,4 duplicate(Skoegul) Skoegul#p4-14 722
+prtg_cas04.gat,263,27,4 duplicate(Skoegul) Skoegul#p4-15 722
+
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+prontera.gat,165,194,5 script Gondul#p5-1::Gondul 722,{
+ callfunc "F_Flags","Prontera","prtg_cas05",34,30,0;
+ close;
+
+OnRecvCastlePt05:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ end;
+}
+
+prt_gld.gat,199,243,2 script Gondul#p5-2::Gondul2 722,{
+ callfunc "F_Flags","Prontera","prtg_cas05",34,30,1;
+ close;
+
+OnRecvCastlePt05:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,199,236,2 duplicate(Gondul2) Gondul#p5-3 722
+prt_gld.gat,197,243,2 duplicate(Gondul2) Gondul#p5-4 722
+prt_gld.gat,197,236,2 duplicate(Gondul2) Gondul#p5-5 722
+// In Castle =============================================
+prtg_cas05.gat,19,247,4 duplicate(Gondul) Gondul#p5-6 722
+prtg_cas05.gat,19,243,4 duplicate(Gondul) Gondul#p5-7 722
+prtg_cas05.gat,26,247,4 duplicate(Gondul) Gondul#p5-8 722
+prtg_cas05.gat,26,243,4 duplicate(Gondul) Gondul#p5-9 722
+prtg_cas05.gat,249,289,4 duplicate(Gondul) Gondul#p5-10 722
+prtg_cas05.gat,256,289,4 duplicate(Gondul) Gondul#p5-11 722
+prtg_cas05.gat,253,271,4 duplicate(Gondul) Gondul#p5-12 722
+prtg_cas05.gat,273,257,4 duplicate(Gondul) Gondul#p5-13 722
diff --git a/npc/guild/prtg/prtg_guardians.txt b/npc/guild/prtg/prtg_guardians.txt
index 843572a65..ac135c099 100644
--- a/npc/guild/prtg/prtg_guardians.txt
+++ b/npc/guild/prtg/prtg_guardians.txt
@@ -1,108 +1,108 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Re-spawns guardians on server start if they have been
-//= purchased. Also announces when a guardian dies.
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//= 1.2a Guardians for all prtg castles are now in this file.
-//= Minor optimizations.[kobra_k88]
-//============================================================
-
-
-prtg_cas01.gat,197,197,0 script Guardian_Pt01 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas01.gat",10) == 1) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",0;
- if (GetCastleData("prtg_cas01.gat",11) == 1) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",1;
- if (GetCastleData("prtg_cas01.gat",12) == 1) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",2;
- if (GetCastleData("prtg_cas01.gat",13) == 1) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",3;
- if (GetCastleData("prtg_cas01.gat",14) == 1) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",4;
- if (GetCastleData("prtg_cas01.gat",15) == 1) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",5;
- if (GetCastleData("prtg_cas01.gat",16) == 1) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",6;
- if (GetCastleData("prtg_cas01.gat",17) == 1) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas01.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-prtg_cas02.gat,158,174,0 script Guardian_Pt02 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas02.gat",10) == 1) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",0;
- if (GetCastleData("prtg_cas02.gat",11) == 1) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",1;
- if (GetCastleData("prtg_cas02.gat",12) == 1) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",2;
- if (GetCastleData("prtg_cas02.gat",13) == 1) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",3;
- if (GetCastleData("prtg_cas02.gat",14) == 1) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",4;
- if (GetCastleData("prtg_cas02.gat",15) == 1) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",5;
- if (GetCastleData("prtg_cas02.gat",16) == 1) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",6;
- if (GetCastleData("prtg_cas02.gat",17) == 1) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas02.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-prtg_cas03.gat,17,221,0 script Guardian_Pt03 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas03.gat",10) == 1) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",0;
- if (GetCastleData("prtg_cas03.gat",11) == 1) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",1;
- if (GetCastleData("prtg_cas03.gat",12) == 1) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",2;
- if (GetCastleData("prtg_cas03.gat",13) == 1) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",3;
- if (GetCastleData("prtg_cas03.gat",14) == 1) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",4;
- if (GetCastleData("prtg_cas03.gat",15) == 1) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",5;
- if (GetCastleData("prtg_cas03.gat",16) == 1) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",6;
- if (GetCastleData("prtg_cas03.gat",17) == 1) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas03.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-prtg_cas04.gat,292,14,0 script Guardian_Pt04 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas04.gat",10) == 1) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",0;
- if (GetCastleData("prtg_cas04.gat",11) == 1) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",1;
- if (GetCastleData("prtg_cas04.gat",12) == 1) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",2;
- if (GetCastleData("prtg_cas04.gat",13) == 1) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",3;
- if (GetCastleData("prtg_cas04.gat",14) == 1) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",4;
- if (GetCastleData("prtg_cas04.gat",15) == 1) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",5;
- if (GetCastleData("prtg_cas04.gat",16) == 1) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",6;
- if (GetCastleData("prtg_cas04.gat",17) == 1) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas04.gat","A Guardian Has Fallen",17;
- end;
-}
-//------------------------------------------------------------------------------
-prtg_cas05.gat,266,266,0 script Guardian_Pt05 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas05.gat",10) == 1) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",0;
- if (GetCastleData("prtg_cas05.gat",11) == 1) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",1;
- if (GetCastleData("prtg_cas05.gat",12) == 1) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",2;
- if (GetCastleData("prtg_cas05.gat",13) == 1) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",3;
- if (GetCastleData("prtg_cas05.gat",14) == 1) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",4;
- if (GetCastleData("prtg_cas05.gat",15) == 1) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",5;
- if (GetCastleData("prtg_cas05.gat",16) == 1) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",6;
- if (GetCastleData("prtg_cas05.gat",17) == 1) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",7;
- end;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas05.gat","A Guardian Has Fallen",17;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Re-spawns guardians on server start if they have been
+//= purchased. Also announces when a guardian dies.
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//= 1.2a Guardians for all prtg castles are now in this file.
+//= Minor optimizations.[kobra_k88]
+//============================================================
+
+
+prtg_cas01.gat,197,197,0 script Guardian_Pt01 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas01.gat",10) == 1) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",0;
+ if (GetCastleData("prtg_cas01.gat",11) == 1) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",1;
+ if (GetCastleData("prtg_cas01.gat",12) == 1) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",2;
+ if (GetCastleData("prtg_cas01.gat",13) == 1) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",3;
+ if (GetCastleData("prtg_cas01.gat",14) == 1) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",4;
+ if (GetCastleData("prtg_cas01.gat",15) == 1) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",5;
+ if (GetCastleData("prtg_cas01.gat",16) == 1) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",6;
+ if (GetCastleData("prtg_cas01.gat",17) == 1) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas01.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+prtg_cas02.gat,158,174,0 script Guardian_Pt02 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas02.gat",10) == 1) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",0;
+ if (GetCastleData("prtg_cas02.gat",11) == 1) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",1;
+ if (GetCastleData("prtg_cas02.gat",12) == 1) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",2;
+ if (GetCastleData("prtg_cas02.gat",13) == 1) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",3;
+ if (GetCastleData("prtg_cas02.gat",14) == 1) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",4;
+ if (GetCastleData("prtg_cas02.gat",15) == 1) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",5;
+ if (GetCastleData("prtg_cas02.gat",16) == 1) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",6;
+ if (GetCastleData("prtg_cas02.gat",17) == 1) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas02.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+prtg_cas03.gat,17,221,0 script Guardian_Pt03 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas03.gat",10) == 1) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",0;
+ if (GetCastleData("prtg_cas03.gat",11) == 1) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",1;
+ if (GetCastleData("prtg_cas03.gat",12) == 1) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",2;
+ if (GetCastleData("prtg_cas03.gat",13) == 1) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",3;
+ if (GetCastleData("prtg_cas03.gat",14) == 1) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",4;
+ if (GetCastleData("prtg_cas03.gat",15) == 1) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",5;
+ if (GetCastleData("prtg_cas03.gat",16) == 1) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",6;
+ if (GetCastleData("prtg_cas03.gat",17) == 1) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas03.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+prtg_cas04.gat,292,14,0 script Guardian_Pt04 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas04.gat",10) == 1) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",0;
+ if (GetCastleData("prtg_cas04.gat",11) == 1) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",1;
+ if (GetCastleData("prtg_cas04.gat",12) == 1) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",2;
+ if (GetCastleData("prtg_cas04.gat",13) == 1) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",3;
+ if (GetCastleData("prtg_cas04.gat",14) == 1) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",4;
+ if (GetCastleData("prtg_cas04.gat",15) == 1) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",5;
+ if (GetCastleData("prtg_cas04.gat",16) == 1) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",6;
+ if (GetCastleData("prtg_cas04.gat",17) == 1) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas04.gat","A Guardian Has Fallen",17;
+ end;
+}
+//------------------------------------------------------------------------------
+prtg_cas05.gat,266,266,0 script Guardian_Pt05 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas05.gat",10) == 1) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",0;
+ if (GetCastleData("prtg_cas05.gat",11) == 1) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",1;
+ if (GetCastleData("prtg_cas05.gat",12) == 1) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",2;
+ if (GetCastleData("prtg_cas05.gat",13) == 1) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",3;
+ if (GetCastleData("prtg_cas05.gat",14) == 1) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",4;
+ if (GetCastleData("prtg_cas05.gat",15) == 1) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",5;
+ if (GetCastleData("prtg_cas05.gat",16) == 1) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",6;
+ if (GetCastleData("prtg_cas05.gat",17) == 1) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",7;
+ end;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas05.gat","A Guardian Has Fallen",17;
+ end;
+}
diff --git a/npc/guild/prtg/prtg_kafras.txt b/npc/guild/prtg/prtg_kafras.txt
index c39236447..ace8cb1c3 100644
--- a/npc/guild/prtg/prtg_kafras.txt
+++ b/npc/guild/prtg/prtg_kafras.txt
@@ -1,66 +1,66 @@
-//=== eAthena Script ====================
-//= War of Emperium Kafras for Prontera Guild Castles
-//=== By: =========================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//=== Current Version: ===================
-//= 1.2
-//=== Compatible With: ===================
-//= eAthena 0.1+; RO Episode 4+
-//=== Description: =====================
-//= Provides Kafra services for guild members of Prontera Castles.
-//= Used in conjuction with function F_Kafra.
-//=== Additional Comments: =================
-//= v1.2 Optimized with functions.[kobra_k88]
-//==============================
-
-
-// Castle 1 ========================
-prtg_cas01.gat,96,173,0 script Kafra Service#Pt01 117,{
- callfunc "F_GKafra", "prtg_cas01", "Prontera";
- end;
-OnRecvCastlePt01:
- if (GetCastleData("prtg_cas01.gat",9) < 1) disablenpc "Kafra Service#Pt01";
- end;
-}
-
-
-// Castle 2 ========================
-prtg_cas02.gat,71,36,4 script Kafra Service#Pt02 117,{
- callfunc "F_GKafra", "prtg_cas02", "Prontera";
- end;
-OnRecvCastlePt02:
- if (GetCastleData("prtg_cas02.gat",9) < 1) disablenpc "Kafra Service#Pt02";
- end;
-}
-
-
-// Castle 3 ========================
-//prtg_cas03.gat,181,215,4 script Kafra Service#Pt03 117,{
-prtg_cas03.gat,39,99,4 script Kafra Service#Pt03 117,{
- callfunc "F_GKafra", "prtg_cas03", "Prontera";
- end;
-OnRecvCastlePt03:
- if (GetCastleData("prtg_cas03.gat",9) < 1) disablenpc "Kafra Service#Pt03";
- end;
-}
-
-
-// Castle 4 ========================
-prtg_cas04.gat,258,247,4 script Kafra Service#Pt04 117,{
- callfunc "F_GKafra", "prtg_cas04", "Prontera";
- end;
-OnRecvCastlePt04:
- if (GetCastleData("prtg_cas04.gat",9) < 1) disablenpc "Kafra Service#Pt04";
- end;
-}
-
-
-// Castle 5 ========================
-prtg_cas05.gat,52,41,4 script Kafra Service#Pt05 117,{
- callfunc "F_GKafra", "prtg_cas05", "Prontera";
- end;
-OnRecvCastlePt05:
- if (GetCastleData("prtg_cas05.gat",9) < 1) disablenpc "Kafra Service#Pt05";
- end;
-}
+//=== eAthena Script ====================
+//= War of Emperium Kafras for Prontera Guild Castles
+//=== By: =========================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//=== Current Version: ===================
+//= 1.2
+//=== Compatible With: ===================
+//= eAthena 0.1+; RO Episode 4+
+//=== Description: =====================
+//= Provides Kafra services for guild members of Prontera Castles.
+//= Used in conjuction with function F_Kafra.
+//=== Additional Comments: =================
+//= v1.2 Optimized with functions.[kobra_k88]
+//==============================
+
+
+// Castle 1 ========================
+prtg_cas01.gat,96,173,0 script Kafra Service#Pt01 117,{
+ callfunc "F_GKafra", "prtg_cas01", "Prontera";
+ end;
+OnRecvCastlePt01:
+ if (GetCastleData("prtg_cas01.gat",9) < 1) disablenpc "Kafra Service#Pt01";
+ end;
+}
+
+
+// Castle 2 ========================
+prtg_cas02.gat,71,36,4 script Kafra Service#Pt02 117,{
+ callfunc "F_GKafra", "prtg_cas02", "Prontera";
+ end;
+OnRecvCastlePt02:
+ if (GetCastleData("prtg_cas02.gat",9) < 1) disablenpc "Kafra Service#Pt02";
+ end;
+}
+
+
+// Castle 3 ========================
+//prtg_cas03.gat,181,215,4 script Kafra Service#Pt03 117,{
+prtg_cas03.gat,39,99,4 script Kafra Service#Pt03 117,{
+ callfunc "F_GKafra", "prtg_cas03", "Prontera";
+ end;
+OnRecvCastlePt03:
+ if (GetCastleData("prtg_cas03.gat",9) < 1) disablenpc "Kafra Service#Pt03";
+ end;
+}
+
+
+// Castle 4 ========================
+prtg_cas04.gat,258,247,4 script Kafra Service#Pt04 117,{
+ callfunc "F_GKafra", "prtg_cas04", "Prontera";
+ end;
+OnRecvCastlePt04:
+ if (GetCastleData("prtg_cas04.gat",9) < 1) disablenpc "Kafra Service#Pt04";
+ end;
+}
+
+
+// Castle 5 ========================
+prtg_cas05.gat,52,41,4 script Kafra Service#Pt05 117,{
+ callfunc "F_GKafra", "prtg_cas05", "Prontera";
+ end;
+OnRecvCastlePt05:
+ if (GetCastleData("prtg_cas05.gat",9) < 1) disablenpc "Kafra Service#Pt05";
+ end;
+}
diff --git a/npc/guild/prtg/prtg_managers.txt b/npc/guild/prtg/prtg_managers.txt
index 440d18b6a..f2e77dcb4 100644
--- a/npc/guild/prtg/prtg_managers.txt
+++ b/npc/guild/prtg/prtg_managers.txt
@@ -1,104 +1,104 @@
-//===== eAthena Script =======================================
-//= War of Emperium Managers for Prontera Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// Castle 1 ==================================================================================
-prtg_cas01.gat,112,181,0 script Abrai 55,{
- if(callfunc("F_GldManager","Abrai","prtg_cas01",15,209,"Pt01") == 0) close;
-
- if(@GDnum==10) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",7;
- mes "[ Abrai ]";
- mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 2 ==================================================================================
-prtg_cas02.gat,94,61,0 script Rhay 55,{
- if(callfunc("F_GldManager","Rhay","prtg_cas02",201,229,"Pt02") == 0) close;
-
- if(@GDnum==10) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_Pt02::GuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",7;
- mes "[ Rhay ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 3 ==================================================================================
-prtg_cas03.gat,51,100,4 script Stick 55,{
- if(callfunc("F_GldManager","Stick","prtg_cas03",189,132,"Pt03") == 0) close;
-
- if(@GDnum==10) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",7;
- mes "[ Stick ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 4 ==================================================================================
-prtg_cas04.gat,259,265,4 script Bandred 55,{
- if(callfunc("F_GldManager","Bandred","prtg_cas04",271,162,"Pt04") == 0) close;
-
- if(@GDnum==10) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",7;
- mes "[ Bandred ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
-
-
-// Castle 5 ==================================================================================
-prtg_cas05.gat,36,37,4 script Reiner 55,{
- if(callfunc("F_GldManager","Reiner","prtg_cas05",273,179,"Pt05") == 0) close;
-
- if(@GDnum==10) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",7;
- mes "[ Reiner ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Managers for Prontera Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// Castle 1 ==================================================================================
+prtg_cas01.gat,112,181,0 script Abrai 55,{
+ if(callfunc("F_GldManager","Abrai","prtg_cas01",15,209,"Pt01") == 0) close;
+
+ if(@GDnum==10) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_Pt01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_Pt01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_Pt01::OnGuardianDied",7;
+ mes "[ Abrai ]";
+ mes "Guardian has been installed, the guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 2 ==================================================================================
+prtg_cas02.gat,94,61,0 script Rhay 55,{
+ if(callfunc("F_GldManager","Rhay","prtg_cas02",201,229,"Pt02") == 0) close;
+
+ if(@GDnum==10) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_Pt02::GuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_Pt02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_Pt02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_Pt02::OnGuardianDied",7;
+ mes "[ Rhay ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 3 ==================================================================================
+prtg_cas03.gat,51,100,4 script Stick 55,{
+ if(callfunc("F_GldManager","Stick","prtg_cas03",189,132,"Pt03") == 0) close;
+
+ if(@GDnum==10) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_Pt03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_Pt03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_Pt03::OnGuardianDied",7;
+ mes "[ Stick ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 4 ==================================================================================
+prtg_cas04.gat,259,265,4 script Bandred 55,{
+ if(callfunc("F_GldManager","Bandred","prtg_cas04",271,162,"Pt04") == 0) close;
+
+ if(@GDnum==10) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_Pt04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_Pt04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_Pt04::OnGuardianDied",7;
+ mes "[ Bandred ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
+
+
+// Castle 5 ==================================================================================
+prtg_cas05.gat,36,37,4 script Reiner 55,{
+ if(callfunc("F_GldManager","Reiner","prtg_cas05",273,179,"Pt05") == 0) close;
+
+ if(@GDnum==10) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_Pt05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_Pt05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_Pt05::OnGuardianDied",7;
+ mes "[ Reiner ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+}
diff --git a/npc/guild/prtg/prtg_treas.txt b/npc/guild/prtg/prtg_treas.txt
index dc9206c92..af3b94255 100644
--- a/npc/guild/prtg/prtg_treas.txt
+++ b/npc/guild/prtg/prtg_treas.txt
@@ -1,144 +1,144 @@
-//===== eAthena Script =======================================
-//= War of Emperium Treasure Rooms for Prontera Guild Castles
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-//<=============================== Castle 1 =================================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-prtg_cas01.gat,1,1,0 script Treasure_Pt01 -1,{
-OnRecvCastlePt01:
- end;
-OnInit:
- if($boxNumPt01 == 0) end;
- set $@bxPt01, $boxNumPt01;
- callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,1;
- end;
-
-OnDied:
- mapannounce "prtg_cas01.gat","Treasure Chest Broken Open",17;
- set $boxNumPt01, $boxNumPt01 -1;
- if($boxNumPt01 == 0) mapannounce "prtg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-prtg_cas01.gat,15,209,0 script Switch#TresPt01 111,{
- callfunc "F_GldTreasSw", "prtg_cas01",109,179;
- end;
-}
-
-
-//<================================= Castle 2 ===============================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-prtg_cas02.gat,1,1,0 script Treasure_Pt02 -1,{
-OnRecvCastlePt02:
- end;
-OnInit:
- if($boxNumPt02 == 0) end;
- set $@bxPt02, $boxNumPt02;
- callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,1;
- end;
-
-OnDied:
- mapannounce "prtg_cas02.gat","Treasure Chest Broken Open",17;
- set $boxNumPt02, $boxNumPt02 -1;
- if($boxNumPt02 == 0) mapannounce "prtg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-prtg_cas02.gat,207,228,0 script Switch#TresPt02 111,{
- callfunc "F_GldTreasSw", "prtg_cas02",94,62;
- end;
-}
-
-
-//<================================ Castle 3 ================================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-prtg_cas03.gat,1,1,0 script Treasure_Pt03 -1,{
-OnRecvCastlePt03:
- end;
-OnInit:
- if($boxNumPt03 == 0) end;
- set $@bxPt03, $boxNumPt03;
- callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,1;
- end;
-
-OnDied:
- mapannounce "prtg_cas03.gat","Treasure Chest Broken Open",17;
- set $boxNumPt03, $boxNumPt03 -1;
- if($boxNumPt03 == 0) mapannounce "prtg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-prtg_cas03.gat,193,130,0 script Switch#TresPt03 111,{
- callfunc "F_GldTreasSw", "prtg_cas03",45,99;
- end;
-}
-
-
-//<================================ Castle 4 ================================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-prtg_cas04.gat,1,1,0 script Treasure_Pt04 -1,{
-OnRecvCastlePt04:
- end;
-OnInit:
- if($boxNumPt04 == 0) end;
- set $@bxPt04, $boxNumPt04;
- callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,1;
- end;
-
-OnDied:
- mapannounce "prtg_cas04.gat","Treasure Chest Broken Open",17;
- set $boxNumPt04, $boxNumPt04 -1;
- if($boxNumPt04 == 0) mapannounce "prtg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-prtg_cas04.gat,275,160,0 script Switch#TresPt04 111,{
- callfunc "F_GldTreasSw", "prtg_cas04",259,265;
- end;
-}
-
-
-//<================================ Castle 5 ================================>\\
-
-// Treasure Spawn ----------------------------------------------------------
-prtg_cas05.gat,1,1,0 script Treasure_Pt05 -1,{
-OnRecvCastlePt05:
- end;
-OnInit:
- if($boxNumPt05 == 0) end;
- set $@bxPt05, $boxNumPt05;
- callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,1;
- end;
-
-OnDied:
- mapannounce "prtg_cas05.gat","Treasure Chest Broken Open",17;
- set $boxNumPt05, $boxNumPt05 -1;
- if($boxNumPt05 == 0) mapannounce "prtg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
- end;
-}
-
-// Treasure Room Switch ----------------------------------------------------
-prtg_cas05.gat,281,176,0 script Switch#TresPt05 111,{
- callfunc "F_GldTreasSw", "prtg_cas05",34,30;
- end;
-}
+//===== eAthena Script =======================================
+//= War of Emperium Treasure Rooms for Prontera Guild Castles
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+//<=============================== Castle 1 =================================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+prtg_cas01.gat,1,1,0 script Treasure_Pt01 -1,{
+OnRecvCastlePt01:
+ end;
+OnInit:
+ if($boxNumPt01 == 0) end;
+ set $@bxPt01, $boxNumPt01;
+ callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,1;
+ end;
+
+OnDied:
+ mapannounce "prtg_cas01.gat","Treasure Chest Broken Open",17;
+ set $boxNumPt01, $boxNumPt01 -1;
+ if($boxNumPt01 == 0) mapannounce "prtg_cas01.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+prtg_cas01.gat,15,209,0 script Switch#TresPt01 111,{
+ callfunc "F_GldTreasSw", "prtg_cas01",109,179;
+ end;
+}
+
+
+//<================================= Castle 2 ===============================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+prtg_cas02.gat,1,1,0 script Treasure_Pt02 -1,{
+OnRecvCastlePt02:
+ end;
+OnInit:
+ if($boxNumPt02 == 0) end;
+ set $@bxPt02, $boxNumPt02;
+ callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,1;
+ end;
+
+OnDied:
+ mapannounce "prtg_cas02.gat","Treasure Chest Broken Open",17;
+ set $boxNumPt02, $boxNumPt02 -1;
+ if($boxNumPt02 == 0) mapannounce "prtg_cas02.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+prtg_cas02.gat,207,228,0 script Switch#TresPt02 111,{
+ callfunc "F_GldTreasSw", "prtg_cas02",94,62;
+ end;
+}
+
+
+//<================================ Castle 3 ================================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+prtg_cas03.gat,1,1,0 script Treasure_Pt03 -1,{
+OnRecvCastlePt03:
+ end;
+OnInit:
+ if($boxNumPt03 == 0) end;
+ set $@bxPt03, $boxNumPt03;
+ callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,1;
+ end;
+
+OnDied:
+ mapannounce "prtg_cas03.gat","Treasure Chest Broken Open",17;
+ set $boxNumPt03, $boxNumPt03 -1;
+ if($boxNumPt03 == 0) mapannounce "prtg_cas03.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+prtg_cas03.gat,193,130,0 script Switch#TresPt03 111,{
+ callfunc "F_GldTreasSw", "prtg_cas03",45,99;
+ end;
+}
+
+
+//<================================ Castle 4 ================================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+prtg_cas04.gat,1,1,0 script Treasure_Pt04 -1,{
+OnRecvCastlePt04:
+ end;
+OnInit:
+ if($boxNumPt04 == 0) end;
+ set $@bxPt04, $boxNumPt04;
+ callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,1;
+ end;
+
+OnDied:
+ mapannounce "prtg_cas04.gat","Treasure Chest Broken Open",17;
+ set $boxNumPt04, $boxNumPt04 -1;
+ if($boxNumPt04 == 0) mapannounce "prtg_cas04.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+prtg_cas04.gat,275,160,0 script Switch#TresPt04 111,{
+ callfunc "F_GldTreasSw", "prtg_cas04",259,265;
+ end;
+}
+
+
+//<================================ Castle 5 ================================>\\
+
+// Treasure Spawn ----------------------------------------------------------
+prtg_cas05.gat,1,1,0 script Treasure_Pt05 -1,{
+OnRecvCastlePt05:
+ end;
+OnInit:
+ if($boxNumPt05 == 0) end;
+ set $@bxPt05, $boxNumPt05;
+ callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,1;
+ end;
+
+OnDied:
+ mapannounce "prtg_cas05.gat","Treasure Chest Broken Open",17;
+ set $boxNumPt05, $boxNumPt05 -1;
+ if($boxNumPt05 == 0) mapannounce "prtg_cas05.gat", "All of the treasure boxes have been opened. You must wait untill the next day for them to appear again.",0;
+ end;
+}
+
+// Treasure Room Switch ----------------------------------------------------
+prtg_cas05.gat,281,176,0 script Switch#TresPt05 111,{
+ callfunc "F_GldTreasSw", "prtg_cas05",34,30;
+ end;
+}
diff --git a/npc/jobs/1-1/acolyte.txt b/npc/jobs/1-1/acolyte.txt
index 962f40be9..523ed36be 100644
--- a/npc/jobs/1-1/acolyte.txt
+++ b/npc/jobs/1-1/acolyte.txt
@@ -1,350 +1,350 @@
-//===== eAthena Script =======================================
-//= Acolyte Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0 Fully working.
-//= v1.1 Added function calls for Priest Quest.
-//= v1.2 Fixed Marthilda, Yosuke bugs. [Lupus]
-//= v1.2a Added instant job change for High Novice [Lupus]
-//= v1.3 Added Baby Class support [Lupus]
-//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= 1.5 Now saves/restores all quest skills [Lupus]
-//= 1.6 Merged back JFunc [Lupus]
-//============================================================
-
-
-// -- Father Mareusis --
-prt_church.gat,184,41,4 script Father Mareusis 60,{
- callfunc "F_ToHigh",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"Father Mareusis";
- mes "[Father Mareusis]";
- if(BaseJob == Job_Novice && job_acolyte_q > 0) goto L_Check;
- mes "What is it you are looking for?";
- next;
- menu "Father, I want to become an Acolyte.",M_0,"The Requirements.",M_1,"I'm just looking around that's all",M_End;
- close;
-
- M_0:
- mes "[Father Mareusis]";
- if(BaseJob == Job_Acolyte) {
- mes "Are you feeling okay?....";
- emotion e_hmm;
- next;
- mes "[Father Mareusis]";
- mes "...your attire...";
- next;
- mes "[Father Mareusis]";
- mes "You're already are an Acolyte.....";
- next;
- mes "[Father Mareusis]";
- mes "You are not joking with me, are you? Hoho!!..kids these days.";
- emotion e_heh;
- close;
- }
- if(BaseJob != Job_Novice) {
- mes "I am sorry child. You have already devoted your life to another profession. I am afraid that you will no longer be able to devote it to God.";
- close;
- }
- if(JobLevel < 10) {
- mes "My child you do not yet possess the necessary skills to serve the lord.";
- mes "Please come back when your faith in God has become stronger";
- next;
- mes "[Father Mareusis]";
- mes "May God bless you.";
- close;
- }
- mes "Do you truly wish to become a servant of God?";
- next;
- menu "Yes, Father, I do.",sM_0,"Nope, I lied.",sM_1;
- close;
-
- sM_0:
- mes "[Father Mareusis]";
- mes "Good. I accept your will to become an Acolyte.";
- mes "You understand that you need to do penance before you become a servant of God, don't you?";
- next;
- mes "[Father Mareusis]";
- mes "Well then, here is your Divine Quest.....";
- next;
- mes "[Father Mareusis]";
- set job_acolyte_q, rand(1,3);
- if(job_acolyte_q == 2) goto sR_2;
- if(job_acolyte_q == 3) goto sR_3;
-
- sR_1:
- mes "Please visit ^0000ffFather Rubalkabara^000000, a member of the Prontera Parish and report back here.";
- mes "He has been Practicing Asceticism near the ^0000ffSt. Capitolina Abbey, 1 map North, and 2 maps East of Prontera City.^000000.";
- goto sL_End;
-
- sR_2:
- mes "Please Visit ^0000ffMother Marthilda^000000 and report back here.";
- mes "She has been Practicing Asceticism in the ^0000ffSograt Desert, one map north from the town of Morroc^000000. Morroc is SouthWest from Prontera.";
- goto sL_End;
-
- sR_3:
- mes "Please Visit ^0000ffFather Yosuke^000000 and report back here.";
- mes "He has been Practicing Asceticism on ^0000ffa very small island 2 maps West, and 1 map North, of Prontera City.^000000.";
-
- sL_End:
- next;
- mes "[Father Mareusis]";
- mes "May the Grace of God enlighten your path.";
- close;
-
- sM_1:
- mes "[Father Mareusis]";
- mes "Lying is a sin my child!";
- mes "Please come back when you are ready";
- emotion e_swt2;
- close;
-
- M_1:
- mes "[Father Mareusis]";
- if(BaseJob == Job_Acolyte) goto M1b;
- if(BaseJob != Job_Novice) goto M1a;
-
- mes "So you wish to become an Acolyte do you?";
- mes "Here are the two requirements you must fullfill first in order to do so.";
- next;
- mes "[Father Mareusis]";
- mes "First of all, you have to reach ^0000ffnovice job Level 9^000000 and learn the ^0000ffBasic Skills^000000 that come with it.";
- next;
- mes "[Father Mareusis]";
- mes "Secondly, you have to embark on a Divine Quest!!";
- next;
- mes "[Father Mareusis]";
- mes "You'll will become an Acolyte in no time if, from the bottom of your heart, you are truly eager to become a servant of God.";
- close;
-
- M1a:
- mes "You have already devoted your life to another profession....";
- close;
- M1b:
- mes "You have already devoted your life to the lord my child. Please go with God's blessing.";
- close;
-
- M_End:
- mes "[Father Mareusis]";
- mes "I see. I pray for your salvation.";
- close;
-
-L_Check:
- mes "Oh, You've come back. Let me check to see if you are ready to serve God... Let's see...";
- next;
- mes "[Father Mareusis]";
- if(job_acolyte_q < 4) goto sL_NotRdy;
- if(SkillPoint > 0) goto sL_Skpoint;
- mes "Your prayers have been answered my child. That which has been asked of you has been fullfilled!!.";
- next;
- mes "[Father Mareusis]";
- mes "With the powers vested in me I hearby make you, ^0000ff"+strcharinfo(0)+"^000000, an Acolyte!!!";
- next;
- mes "(whispers a prayer)";
- next;
- callfunc "Job_Change",Job_Acolyte;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Father Mareusis]";
- mes "Remember to be thankful to God, who is taking care of us all of the time.";
- mes "That you have the unique chance to serve him...you should feel very fortunate and blessed.";
- next;
- mes "[Father Mareusis]";
- mes "Now go forth my child and VANQUISH the EVILS of this world. You have my blessing and the blessing of the church.";
- close;
-
- sL_NotRdy:
- mes "Hmm... you don't seem to have finished your Divine Quest my child.";
- next;
- mes "[Father Mareusis]";
- if(job_acolyte_q == 1) goto sR_1;
- if(job_acolyte_q == 2) goto sR_2;
- if(job_acolyte_q == 3) goto sR_3;
- close;
-
- sL_Skpoint:
- mes "Before we can move on, please use up all of your skill points my child.";
- close;
-}
-
-
-// == Devine Quest ==
-// -- Father Rubalkabara --
-prt_fild03.gat,365,259,2 script Father Rubalkabara 110,{
- mes "[Father Rubalkabara]";
- if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_FatherRub";
- if(BaseJob == Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Oh.. Have you come here to train Or are you just a Wanderer..?";
- next;
- mes "[Father Rubalkabara]";
- mes "Whoever you are, please take care of yourself. Monsters in here are shockingly Strong contrary to their Cute apprearance.";
- close;
-
-L_Novice:
- if(job_acolyte_q==4) goto QuestOver;
- if(job_acolyte_q > 0) goto L_Start;
- mes "Huh..? What brings you here? This is a Very dangerous place for a Novice like you. Please Go back quickly.";
- emotion e_gasp;
- close;
-
-L_Start:
- mes "Oh... Are you the young one who wishes to become an Acolyte...? I've already received the news of your comming from the Santuary.";
- next;
- mes "[Father Rubalkabara]";
- mes "Let me just check my list of candidates here to make sure you are at the right place......";
- next;
- mes "[Father Rubalkabara]";
- if(job_acolyte_q != 1) goto Goback;
- mes "You're ^0000ff"+strcharinfo(0)+"^000000, right? Thank you for comming to vist me.";
- next;
- mes "[Father Rubalkabara]";
- mes "I believe you have already been informed about Acolytes from Father Mareusis. So I won't bother to bore you with any futher lectures on the subject.";
- next;
- mes "[Father Rubalkabara]";
- mes "Besides, I know your generation doesn't like to be lectured by old men like myself. Hahaha...";
- emotion e_heh;
- next;
- mes "[Father Rubalkabara]";
- mes "But you might have to learn to endure what your elders say, because God loves to teach his children. You will see.";
- next;
- mes "[Father Rubalkabara]";
- mes "I will send a message to Father Mareusis stating that you visted me as proof of the completion of your Divine Quest.";
- next;
- mes "[Father Rubalkabara]";
- mes "You may go back to Prontera now. Farewell and may God bless you.";
- set job_acolyte_q,4;
- close;
-
- QuestOver:
- mes "Your Divine Quest is has been completed. You may continue in your journey to serve God.";
- close;
-
- Goback:
- mes "Hmmm... I do not think you name is on my list of candidates.";
- emotion e_hmm;
- next;
- mes "[Father Rubalkabara]";
- mes "...... Why don't you go back to the Santuary and check again.";
- close;
-}
-
-// -- Mother Marthilda --
-moc_fild07.gat,36,354,4 script Mother Marthilda 79,{
- mes "[Mother Marthilda]";
- if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_MotherMart";
- if(BaseJob == Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Hello and welcome. I am Mother Marthilda. Are you a weary traveler or a mighty warrior?";
- mes "Whoever you are please make sure to keep your faith in God.";
- close;
-
-L_Novice:
- if(job_acolyte_q == 5) goto QuestOver;
- if(job_acolyte_q > 0) goto L_Start;
- mes "My!! Aren't you a little far from your town? A novice like you could get hurt. Please be safe.";
- emotion e_gasp;
- close;
-L_Start:
- mes "Ah, You are one of the Acolyte Applicants. I sincerely welcome you.";
- next;
- mes "[Mother Marthilda]";
- mes "Let me just check my list of candidates here to make sure you are at the right place......";
- next;
- if(job_acolyte_q != 2) goto Goback;
- mes "[Mother Marthilda]";
- mes ".... ^0000ff"+strcharinfo(0)+"^000000, Yes! I found you.";
- next;
- mes "[Mother Marthilda]";
- mes "I will send a message to 'Father Mareusis' stating that you visted me as proof of the completion of your Divine Quest.";
- next;
- mes "[Mother Marthilda]";
- mes "Thank you for visiting me. I am even more greatfull that you chose to follow your heart and devote your life to the divinity.";
- mes "God is only as powerfull as our devotion to him. Remember that.";
- next;
- mes "[Mother Marthilda]";
- mes "You may go back to Prontera now.";
- mes "Be safe and may God bless.";
- set job_acolyte_q,5;
- close;
-
- Goback:
- mes "[Mother Marthilda]";
- mes "Hmm....let's see....";
- mes "..Well... I can't find your name on the List ....";
- emotion e_hmm;
- next;
- mes "[Mother Marthilda]";
- mes "I recommend that you to return to the Santuary and Check again.";
- close;
-
- QuestOver:
- mes "Your Divine Quest is has been completed. You may continue in your journey to serve God.";
- close;
-}
-
-// -- Father Yosuke --
-prt_fild00.gat,208,218,6 script Father Yosuke 120,{
- mes "[Father Yosuke]";
- if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_FatherYos";
- if(BaseJob == Job_Novice) goto L_Novice;
-
-L_Other:
- mes "What brings you to this place. Try not to bother me ok.";
- close;
-
-L_Novice:
- if(job_acolyte_q == 6) goto QuestOver;
- if(job_acolyte_q > 0) goto L_Start;
- mes "You, Novice...wanna tell me something?";
- mes "If not go back home.";
- close;
-
-L_Start:
- mes "Hey!! You there.";
- next;
- mes "[Father Yosuke]";
- mes "You look like an Acolyte Applicant...am I right?";
- next;
- mes "[Father Yosuke]";
- mes "Let me just check my list of candidates here to make sure you are at the right place......";
- next;
- if(job_acolyte_q != 3) goto Goback;
- mes "[Father Yosuke]";
- mes "Here we are, ^0000ff"+strcharinfo(0)+"^000000, correct? Not bad, Not bad. You withstood the long journey to get here pretty well.";
- next;
- mes "[Father Yosuke]";
- mes "I will send a message to 'Father Mareusis' stating that you visted me as proof of the completion of your Divine Quest.";
- next;
- mes "[Father Yosuke]";
- mes "Now go back to the Sanctuary and don't forget to carry God's teachings with you where ever you go!";
- emotion e_go;
- set job_acolyte_q,6;
- close;
-
- Goback:
- mes "[Father Yosuke]";
- mes "Interesting.. I can't find your name on my list..";
- emotion e_hmm;
- next;
- mes "[Father Yosuke]";
- mes "I think you've come here by mistake.";
- mes "Go back to the Santuary and check with Father Mareusis.";
- close;
-
- QuestOver:
- mes "What ? You Have more Business with me?";
- emotion e_what;
- next;
- mes "[Father Yosuke]";
- mes "Your Divine Quest is complete. Go back to the Sanctuary Now!";
- emotion e_go;
- close;
-}
-
+//===== eAthena Script =======================================
+//= Acolyte Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0 Fully working.
+//= v1.1 Added function calls for Priest Quest.
+//= v1.2 Fixed Marthilda, Yosuke bugs. [Lupus]
+//= v1.2a Added instant job change for High Novice [Lupus]
+//= v1.3 Added Baby Class support [Lupus]
+//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= 1.5 Now saves/restores all quest skills [Lupus]
+//= 1.6 Merged back JFunc [Lupus]
+//============================================================
+
+
+// -- Father Mareusis --
+prt_church.gat,184,41,4 script Father Mareusis 60,{
+ callfunc "F_ToHigh",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"Father Mareusis";
+ mes "[Father Mareusis]";
+ if(BaseJob == Job_Novice && job_acolyte_q > 0) goto L_Check;
+ mes "What is it you are looking for?";
+ next;
+ menu "Father, I want to become an Acolyte.",M_0,"The Requirements.",M_1,"I'm just looking around that's all",M_End;
+ close;
+
+ M_0:
+ mes "[Father Mareusis]";
+ if(BaseJob == Job_Acolyte) {
+ mes "Are you feeling okay?....";
+ emotion e_hmm;
+ next;
+ mes "[Father Mareusis]";
+ mes "...your attire...";
+ next;
+ mes "[Father Mareusis]";
+ mes "You're already are an Acolyte.....";
+ next;
+ mes "[Father Mareusis]";
+ mes "You are not joking with me, are you? Hoho!!..kids these days.";
+ emotion e_heh;
+ close;
+ }
+ if(BaseJob != Job_Novice) {
+ mes "I am sorry child. You have already devoted your life to another profession. I am afraid that you will no longer be able to devote it to God.";
+ close;
+ }
+ if(JobLevel < 10) {
+ mes "My child you do not yet possess the necessary skills to serve the lord.";
+ mes "Please come back when your faith in God has become stronger";
+ next;
+ mes "[Father Mareusis]";
+ mes "May God bless you.";
+ close;
+ }
+ mes "Do you truly wish to become a servant of God?";
+ next;
+ menu "Yes, Father, I do.",sM_0,"Nope, I lied.",sM_1;
+ close;
+
+ sM_0:
+ mes "[Father Mareusis]";
+ mes "Good. I accept your will to become an Acolyte.";
+ mes "You understand that you need to do penance before you become a servant of God, don't you?";
+ next;
+ mes "[Father Mareusis]";
+ mes "Well then, here is your Divine Quest.....";
+ next;
+ mes "[Father Mareusis]";
+ set job_acolyte_q, rand(1,3);
+ if(job_acolyte_q == 2) goto sR_2;
+ if(job_acolyte_q == 3) goto sR_3;
+
+ sR_1:
+ mes "Please visit ^0000ffFather Rubalkabara^000000, a member of the Prontera Parish and report back here.";
+ mes "He has been Practicing Asceticism near the ^0000ffSt. Capitolina Abbey, 1 map North, and 2 maps East of Prontera City.^000000.";
+ goto sL_End;
+
+ sR_2:
+ mes "Please Visit ^0000ffMother Marthilda^000000 and report back here.";
+ mes "She has been Practicing Asceticism in the ^0000ffSograt Desert, one map north from the town of Morroc^000000. Morroc is SouthWest from Prontera.";
+ goto sL_End;
+
+ sR_3:
+ mes "Please Visit ^0000ffFather Yosuke^000000 and report back here.";
+ mes "He has been Practicing Asceticism on ^0000ffa very small island 2 maps West, and 1 map North, of Prontera City.^000000.";
+
+ sL_End:
+ next;
+ mes "[Father Mareusis]";
+ mes "May the Grace of God enlighten your path.";
+ close;
+
+ sM_1:
+ mes "[Father Mareusis]";
+ mes "Lying is a sin my child!";
+ mes "Please come back when you are ready";
+ emotion e_swt2;
+ close;
+
+ M_1:
+ mes "[Father Mareusis]";
+ if(BaseJob == Job_Acolyte) goto M1b;
+ if(BaseJob != Job_Novice) goto M1a;
+
+ mes "So you wish to become an Acolyte do you?";
+ mes "Here are the two requirements you must fullfill first in order to do so.";
+ next;
+ mes "[Father Mareusis]";
+ mes "First of all, you have to reach ^0000ffnovice job Level 9^000000 and learn the ^0000ffBasic Skills^000000 that come with it.";
+ next;
+ mes "[Father Mareusis]";
+ mes "Secondly, you have to embark on a Divine Quest!!";
+ next;
+ mes "[Father Mareusis]";
+ mes "You'll will become an Acolyte in no time if, from the bottom of your heart, you are truly eager to become a servant of God.";
+ close;
+
+ M1a:
+ mes "You have already devoted your life to another profession....";
+ close;
+ M1b:
+ mes "You have already devoted your life to the lord my child. Please go with God's blessing.";
+ close;
+
+ M_End:
+ mes "[Father Mareusis]";
+ mes "I see. I pray for your salvation.";
+ close;
+
+L_Check:
+ mes "Oh, You've come back. Let me check to see if you are ready to serve God... Let's see...";
+ next;
+ mes "[Father Mareusis]";
+ if(job_acolyte_q < 4) goto sL_NotRdy;
+ if(SkillPoint > 0) goto sL_Skpoint;
+ mes "Your prayers have been answered my child. That which has been asked of you has been fullfilled!!.";
+ next;
+ mes "[Father Mareusis]";
+ mes "With the powers vested in me I hearby make you, ^0000ff"+strcharinfo(0)+"^000000, an Acolyte!!!";
+ next;
+ mes "(whispers a prayer)";
+ next;
+ callfunc "Job_Change",Job_Acolyte;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Father Mareusis]";
+ mes "Remember to be thankful to God, who is taking care of us all of the time.";
+ mes "That you have the unique chance to serve him...you should feel very fortunate and blessed.";
+ next;
+ mes "[Father Mareusis]";
+ mes "Now go forth my child and VANQUISH the EVILS of this world. You have my blessing and the blessing of the church.";
+ close;
+
+ sL_NotRdy:
+ mes "Hmm... you don't seem to have finished your Divine Quest my child.";
+ next;
+ mes "[Father Mareusis]";
+ if(job_acolyte_q == 1) goto sR_1;
+ if(job_acolyte_q == 2) goto sR_2;
+ if(job_acolyte_q == 3) goto sR_3;
+ close;
+
+ sL_Skpoint:
+ mes "Before we can move on, please use up all of your skill points my child.";
+ close;
+}
+
+
+// == Devine Quest ==
+// -- Father Rubalkabara --
+prt_fild03.gat,365,259,2 script Father Rubalkabara 110,{
+ mes "[Father Rubalkabara]";
+ if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_FatherRub";
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Oh.. Have you come here to train Or are you just a Wanderer..?";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "Whoever you are, please take care of yourself. Monsters in here are shockingly Strong contrary to their Cute apprearance.";
+ close;
+
+L_Novice:
+ if(job_acolyte_q==4) goto QuestOver;
+ if(job_acolyte_q > 0) goto L_Start;
+ mes "Huh..? What brings you here? This is a Very dangerous place for a Novice like you. Please Go back quickly.";
+ emotion e_gasp;
+ close;
+
+L_Start:
+ mes "Oh... Are you the young one who wishes to become an Acolyte...? I've already received the news of your comming from the Santuary.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "Let me just check my list of candidates here to make sure you are at the right place......";
+ next;
+ mes "[Father Rubalkabara]";
+ if(job_acolyte_q != 1) goto Goback;
+ mes "You're ^0000ff"+strcharinfo(0)+"^000000, right? Thank you for comming to vist me.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "I believe you have already been informed about Acolytes from Father Mareusis. So I won't bother to bore you with any futher lectures on the subject.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "Besides, I know your generation doesn't like to be lectured by old men like myself. Hahaha...";
+ emotion e_heh;
+ next;
+ mes "[Father Rubalkabara]";
+ mes "But you might have to learn to endure what your elders say, because God loves to teach his children. You will see.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "I will send a message to Father Mareusis stating that you visted me as proof of the completion of your Divine Quest.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "You may go back to Prontera now. Farewell and may God bless you.";
+ set job_acolyte_q,4;
+ close;
+
+ QuestOver:
+ mes "Your Divine Quest is has been completed. You may continue in your journey to serve God.";
+ close;
+
+ Goback:
+ mes "Hmmm... I do not think you name is on my list of candidates.";
+ emotion e_hmm;
+ next;
+ mes "[Father Rubalkabara]";
+ mes "...... Why don't you go back to the Santuary and check again.";
+ close;
+}
+
+// -- Mother Marthilda --
+moc_fild07.gat,36,354,4 script Mother Marthilda 79,{
+ mes "[Mother Marthilda]";
+ if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_MotherMart";
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Hello and welcome. I am Mother Marthilda. Are you a weary traveler or a mighty warrior?";
+ mes "Whoever you are please make sure to keep your faith in God.";
+ close;
+
+L_Novice:
+ if(job_acolyte_q == 5) goto QuestOver;
+ if(job_acolyte_q > 0) goto L_Start;
+ mes "My!! Aren't you a little far from your town? A novice like you could get hurt. Please be safe.";
+ emotion e_gasp;
+ close;
+L_Start:
+ mes "Ah, You are one of the Acolyte Applicants. I sincerely welcome you.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "Let me just check my list of candidates here to make sure you are at the right place......";
+ next;
+ if(job_acolyte_q != 2) goto Goback;
+ mes "[Mother Marthilda]";
+ mes ".... ^0000ff"+strcharinfo(0)+"^000000, Yes! I found you.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "I will send a message to 'Father Mareusis' stating that you visted me as proof of the completion of your Divine Quest.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "Thank you for visiting me. I am even more greatfull that you chose to follow your heart and devote your life to the divinity.";
+ mes "God is only as powerfull as our devotion to him. Remember that.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "You may go back to Prontera now.";
+ mes "Be safe and may God bless.";
+ set job_acolyte_q,5;
+ close;
+
+ Goback:
+ mes "[Mother Marthilda]";
+ mes "Hmm....let's see....";
+ mes "..Well... I can't find your name on the List ....";
+ emotion e_hmm;
+ next;
+ mes "[Mother Marthilda]";
+ mes "I recommend that you to return to the Santuary and Check again.";
+ close;
+
+ QuestOver:
+ mes "Your Divine Quest is has been completed. You may continue in your journey to serve God.";
+ close;
+}
+
+// -- Father Yosuke --
+prt_fild00.gat,208,218,6 script Father Yosuke 120,{
+ mes "[Father Yosuke]";
+ if(BaseJob == Job_Acolyte || BaseJob == Job_Priest) callfunc "F_FatherYos";
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "What brings you to this place. Try not to bother me ok.";
+ close;
+
+L_Novice:
+ if(job_acolyte_q == 6) goto QuestOver;
+ if(job_acolyte_q > 0) goto L_Start;
+ mes "You, Novice...wanna tell me something?";
+ mes "If not go back home.";
+ close;
+
+L_Start:
+ mes "Hey!! You there.";
+ next;
+ mes "[Father Yosuke]";
+ mes "You look like an Acolyte Applicant...am I right?";
+ next;
+ mes "[Father Yosuke]";
+ mes "Let me just check my list of candidates here to make sure you are at the right place......";
+ next;
+ if(job_acolyte_q != 3) goto Goback;
+ mes "[Father Yosuke]";
+ mes "Here we are, ^0000ff"+strcharinfo(0)+"^000000, correct? Not bad, Not bad. You withstood the long journey to get here pretty well.";
+ next;
+ mes "[Father Yosuke]";
+ mes "I will send a message to 'Father Mareusis' stating that you visted me as proof of the completion of your Divine Quest.";
+ next;
+ mes "[Father Yosuke]";
+ mes "Now go back to the Sanctuary and don't forget to carry God's teachings with you where ever you go!";
+ emotion e_go;
+ set job_acolyte_q,6;
+ close;
+
+ Goback:
+ mes "[Father Yosuke]";
+ mes "Interesting.. I can't find your name on my list..";
+ emotion e_hmm;
+ next;
+ mes "[Father Yosuke]";
+ mes "I think you've come here by mistake.";
+ mes "Go back to the Santuary and check with Father Mareusis.";
+ close;
+
+ QuestOver:
+ mes "What ? You Have more Business with me?";
+ emotion e_what;
+ next;
+ mes "[Father Yosuke]";
+ mes "Your Divine Quest is complete. Go back to the Sanctuary Now!";
+ emotion e_go;
+ close;
+}
+
diff --git a/npc/jobs/1-1/archer.txt b/npc/jobs/1-1/archer.txt
index 2ed2c0afe..f72f7b11b 100644
--- a/npc/jobs/1-1/archer.txt
+++ b/npc/jobs/1-1/archer.txt
@@ -1,183 +1,183 @@
-//===== eAthena Script =======================================
-//= Archer Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Added instant job change for High Novice [Lupus]
-//= v1.3 Added Baby Class support [Lupus]
-//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= 1.5 Now saves/restores all quest skills [Lupus]
-//= 1.6 Merged back JFunc [Lupus]
-//============================================================
-
-
-// -- Archer Guildsman --
-payon_in02.gat,64,71,4 script Archer Guildsman 59,{
- callfunc "F_ToHigh",Job_Archer_High,"High Archer",Job_Sniper,"Archer Guildsman";
- mes "[Archer Guildsman]";
- if(BaseJob == Job_Novice && job_archer_q == 1) goto L_Check;
- mes "Good Day. How may I help you?";
- next;
- menu "I would like to become an Archer.",M_0,"What are the Requirements?",M_1,"Never mind.",M_End;
-
- M_0:
- mes "[Archer Guildsman]";
- if(BaseJob == Job_Archer) {
- mes "Your free spirited nature tells me that you're already an archer....that and the bow and arrow in your hands...Haha";
- emotion e_heh;
- close;
- }
- if(BaseJob != Job_Novice) {
- mes "I'm sorry but you cannot leave your current job to become an Archer...though I can understand why you would want to do so.";
- close;
- }
- mes "You have made an excellent job choice.";
- mes "Please submit your resume so that I can check your qualifications.";
- next;
- mes "(You hand over your resume)";
- next;
- mes "[Archer Guildsman]";
- if(JobLevel < 10) {
- mes "It seems that you are not qualified to become an Archer yet. Please take a look at the job requirments once more.";
- close;
- }
- set job_archer_q,1;
- mes "Looks good. You have the necesssary skills to become an archer....";
- next;
- mes "[Archer Guildsman]";
- mes "but.... ";
- next;
- mes "[Archer Guildsman]";
- mes "you must first pass a test in order to do so. I hope you didn't think becoming an archer was going to be that easy. Ha ha!";
- next;
- mes "[Archer Guildsman]";
- mes "A well made bow is essential for a good archer, and high quality wood is in turn essential for a well made bow.";
- mes "You will be tested on how well you are able to gather high quality wood.";
- next;
- mes "[Archer Guildsman]";
- mes "The higher the quality of the wood you gather the higher your score.";
- mes "You must recieve a score of ^ff0000at least 25^000000 in order to ^ff0000pass the test^000000.";
- next;
- mes "[Archer Guildsman]";
- mes "You can find wood by battling ^0000ff'Willows'^000000, a type of tree monster found outside of town in Payon forest.";
- mes "They drop the wood in the form of^0000ff 'Trunks'^000000.";
- next;
- mes "[Archer Guildsman]";
- mes "There are a total of 4 different kind of trunks each with a different point value. Gather a variety of trunks and bring them back here for me to grade.";
- next;
- mes "[Archer Guildsman]";
- mes "I must warn you, the Willows can be tough monsters so be carefull and remember to rest and use your healing items. Good luck!";
- close;
-
- M_1:
- mes "[Archer Guildsman]";
- if(BaseJob == Job_Archer) goto sM_1a;
- if(BaseJob != Job_Novice) goto sM_1b;
- mes "Let me explain the requirements for becoming an archer to you:";
- next;
- mes "[Archer Guildsman]";
- mes "First of all, you have to have a job level of 9 and you must learn all of the skills that come with that job level.";
- next;
- mes "[Archer Guildsman]";
- mes "Secondly, you will have to take a test that will determine whether or not you have the skills to become an archer.";
- next;
- mes "[Archer Guildsman]";
- mes "Those are the requirements. Fullfill them and you will be able to live life as only an Archer can.";
- close;
-
- sM_1a:
- mes "Have you already forgotten how you became an Archer?....";
- emotion 1;
- close;
- sM_1b:
- mes "Telling you the requirements won't help you become an Archer since you already have another job.";
- close;
-
- M_End:
- mes "[Archer Guildsman]";
- mes "Ok then, take care.";
- close;
-
-L_Check:
- mes "Oh, I see you've come back.";
- next;
- mes "[Archer Guildsman]";
- if((countitem(1066) == 0) && (countitem(1067) == 0) && (countitem(1068) == 0) && (countitem(1019) == 0)) goto sL_NotRdy;
- if(SkillPoint > 0) goto sL_SkPoints;
- set @Trunk1, countitem(1066)*5;
- set @Trunk2, countitem(1067)*3;
- set @Trunk3, countitem(1068)*2;
- set @Trunk4, countitem(1019);
- set @TrunkTotal, @Trunk1 + @Trunk2 + @Trunk3 + @Trunk4;
-
- mes "Lets see.....";
- next;
- mes "[Archer Guildsman]";
- mes "You have:";
- mes "^0000FF" +countitem(1066)+ "^000000 Fine grained trunks for ^ff0000" +@Trunk1+ "^000000 points,";
- mes "^0000FF" +countitem(1067)+ "^000000 Solid trunks for ^ff0000" +@Trunk2+ "^000000 points,";
- mes "^0000FF" +countitem(1068)+ "^000000 Barren trunks for ^ff0000" +@Trunk3+ "^000000 points,";
- mes "^0000FF" +countitem(1019)+ "^000000 Trunks for ^ff0000" +@Trunk4+ "^000000 points.....";
- next;
- mes "[Archer Guildsman]";
- mes "That gives you a total score of: ^ff0000" +@TrunkTotal+"^000000";
- next;
- mes "[Archer Guildsman]";
- if(@TrunkTotal < 25) goto sL_Failed;
-
- mes "Very good! You have passed the test. Congratulations, you are now fully qualified to become an archer.";
- emotion 21;
- next;
- mes "[Archer Guildsman]";
- mes "I will now transform you...";
- next;
- callfunc "Job_Change",Job_Archer;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Archer Guildsman]";
- mes "In exchange for the trunks you brought in I will give you this Bow and some arrows. Please take them.";
- next;
- getitem 1702,1;//Items: Bow_,
- getitem 1750,200;//Items: Arrow,
- delitem 1066, countitem(1066);//Items: Fine-grained_Trunk,
- delitem 1067, countitem(1067);//Items: Solid_Trunk,
- delitem 1068, countitem(1068);//Items: Barren_Trunk,
- delitem 1019, countitem(1019);//Items: Trunk,
- mes "[Archer Guildsman]";
- mes "An Archer knows no bounds so live your life to its fullest. I know you will make an exellent archer.";
- next;
- mes "[Archer Guildsman]";
- mes "Farewell and good luck on your journey.";
- close;
-
- sL_NotRdy:
- mes "What? You didn't bring any trunks back for me to grade? Let me explain the test requirements again just in case you forgot...";
- emotion 1;
- next;
- mes "[Archer Guildsman]";
- mes "There are a total of ^5555FF4 different kind of Trunks^000000 each with a different point value.";
- mes "Gather a variety of Trunks and bring them back here for me to grade.";
- next;
- mes "[Archer Guildsman]";
- mes "You can find Trunks by battling ^0000ff'Willows'^000000, a type of tree monster found outside of town in Payon forest.";
- close;
- sL_SkPoints:
- mes "You need to use up all of your skill points before I can make you an Archer.";
- close;
- sL_Failed:
- mes "I'm sorry but your score is too low. I'm afraid that you have failed the test.";
- next;
- mes "[Archer Guildsman]";
- mes "Fortunatley for you I'm somewhat softhearted so I'll give you another chance. Go gather some more trunks and come back.";
- next;
- mes "[Archer Guildsman]";
- mes "Hopefull they will be of a high enough quality for you to pass the test.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Archer Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Added instant job change for High Novice [Lupus]
+//= v1.3 Added Baby Class support [Lupus]
+//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= 1.5 Now saves/restores all quest skills [Lupus]
+//= 1.6 Merged back JFunc [Lupus]
+//============================================================
+
+
+// -- Archer Guildsman --
+payon_in02.gat,64,71,4 script Archer Guildsman 59,{
+ callfunc "F_ToHigh",Job_Archer_High,"High Archer",Job_Sniper,"Archer Guildsman";
+ mes "[Archer Guildsman]";
+ if(BaseJob == Job_Novice && job_archer_q == 1) goto L_Check;
+ mes "Good Day. How may I help you?";
+ next;
+ menu "I would like to become an Archer.",M_0,"What are the Requirements?",M_1,"Never mind.",M_End;
+
+ M_0:
+ mes "[Archer Guildsman]";
+ if(BaseJob == Job_Archer) {
+ mes "Your free spirited nature tells me that you're already an archer....that and the bow and arrow in your hands...Haha";
+ emotion e_heh;
+ close;
+ }
+ if(BaseJob != Job_Novice) {
+ mes "I'm sorry but you cannot leave your current job to become an Archer...though I can understand why you would want to do so.";
+ close;
+ }
+ mes "You have made an excellent job choice.";
+ mes "Please submit your resume so that I can check your qualifications.";
+ next;
+ mes "(You hand over your resume)";
+ next;
+ mes "[Archer Guildsman]";
+ if(JobLevel < 10) {
+ mes "It seems that you are not qualified to become an Archer yet. Please take a look at the job requirments once more.";
+ close;
+ }
+ set job_archer_q,1;
+ mes "Looks good. You have the necesssary skills to become an archer....";
+ next;
+ mes "[Archer Guildsman]";
+ mes "but.... ";
+ next;
+ mes "[Archer Guildsman]";
+ mes "you must first pass a test in order to do so. I hope you didn't think becoming an archer was going to be that easy. Ha ha!";
+ next;
+ mes "[Archer Guildsman]";
+ mes "A well made bow is essential for a good archer, and high quality wood is in turn essential for a well made bow.";
+ mes "You will be tested on how well you are able to gather high quality wood.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "The higher the quality of the wood you gather the higher your score.";
+ mes "You must recieve a score of ^ff0000at least 25^000000 in order to ^ff0000pass the test^000000.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "You can find wood by battling ^0000ff'Willows'^000000, a type of tree monster found outside of town in Payon forest.";
+ mes "They drop the wood in the form of^0000ff 'Trunks'^000000.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "There are a total of 4 different kind of trunks each with a different point value. Gather a variety of trunks and bring them back here for me to grade.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "I must warn you, the Willows can be tough monsters so be carefull and remember to rest and use your healing items. Good luck!";
+ close;
+
+ M_1:
+ mes "[Archer Guildsman]";
+ if(BaseJob == Job_Archer) goto sM_1a;
+ if(BaseJob != Job_Novice) goto sM_1b;
+ mes "Let me explain the requirements for becoming an archer to you:";
+ next;
+ mes "[Archer Guildsman]";
+ mes "First of all, you have to have a job level of 9 and you must learn all of the skills that come with that job level.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "Secondly, you will have to take a test that will determine whether or not you have the skills to become an archer.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "Those are the requirements. Fullfill them and you will be able to live life as only an Archer can.";
+ close;
+
+ sM_1a:
+ mes "Have you already forgotten how you became an Archer?....";
+ emotion 1;
+ close;
+ sM_1b:
+ mes "Telling you the requirements won't help you become an Archer since you already have another job.";
+ close;
+
+ M_End:
+ mes "[Archer Guildsman]";
+ mes "Ok then, take care.";
+ close;
+
+L_Check:
+ mes "Oh, I see you've come back.";
+ next;
+ mes "[Archer Guildsman]";
+ if((countitem(1066) == 0) && (countitem(1067) == 0) && (countitem(1068) == 0) && (countitem(1019) == 0)) goto sL_NotRdy;
+ if(SkillPoint > 0) goto sL_SkPoints;
+ set @Trunk1, countitem(1066)*5;
+ set @Trunk2, countitem(1067)*3;
+ set @Trunk3, countitem(1068)*2;
+ set @Trunk4, countitem(1019);
+ set @TrunkTotal, @Trunk1 + @Trunk2 + @Trunk3 + @Trunk4;
+
+ mes "Lets see.....";
+ next;
+ mes "[Archer Guildsman]";
+ mes "You have:";
+ mes "^0000FF" +countitem(1066)+ "^000000 Fine grained trunks for ^ff0000" +@Trunk1+ "^000000 points,";
+ mes "^0000FF" +countitem(1067)+ "^000000 Solid trunks for ^ff0000" +@Trunk2+ "^000000 points,";
+ mes "^0000FF" +countitem(1068)+ "^000000 Barren trunks for ^ff0000" +@Trunk3+ "^000000 points,";
+ mes "^0000FF" +countitem(1019)+ "^000000 Trunks for ^ff0000" +@Trunk4+ "^000000 points.....";
+ next;
+ mes "[Archer Guildsman]";
+ mes "That gives you a total score of: ^ff0000" +@TrunkTotal+"^000000";
+ next;
+ mes "[Archer Guildsman]";
+ if(@TrunkTotal < 25) goto sL_Failed;
+
+ mes "Very good! You have passed the test. Congratulations, you are now fully qualified to become an archer.";
+ emotion 21;
+ next;
+ mes "[Archer Guildsman]";
+ mes "I will now transform you...";
+ next;
+ callfunc "Job_Change",Job_Archer;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Archer Guildsman]";
+ mes "In exchange for the trunks you brought in I will give you this Bow and some arrows. Please take them.";
+ next;
+ getitem 1702,1;//Items: Bow_,
+ getitem 1750,200;//Items: Arrow,
+ delitem 1066, countitem(1066);//Items: Fine-grained_Trunk,
+ delitem 1067, countitem(1067);//Items: Solid_Trunk,
+ delitem 1068, countitem(1068);//Items: Barren_Trunk,
+ delitem 1019, countitem(1019);//Items: Trunk,
+ mes "[Archer Guildsman]";
+ mes "An Archer knows no bounds so live your life to its fullest. I know you will make an exellent archer.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "Farewell and good luck on your journey.";
+ close;
+
+ sL_NotRdy:
+ mes "What? You didn't bring any trunks back for me to grade? Let me explain the test requirements again just in case you forgot...";
+ emotion 1;
+ next;
+ mes "[Archer Guildsman]";
+ mes "There are a total of ^5555FF4 different kind of Trunks^000000 each with a different point value.";
+ mes "Gather a variety of Trunks and bring them back here for me to grade.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "You can find Trunks by battling ^0000ff'Willows'^000000, a type of tree monster found outside of town in Payon forest.";
+ close;
+ sL_SkPoints:
+ mes "You need to use up all of your skill points before I can make you an Archer.";
+ close;
+ sL_Failed:
+ mes "I'm sorry but your score is too low. I'm afraid that you have failed the test.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "Fortunatley for you I'm somewhat softhearted so I'll give you another chance. Go gather some more trunks and come back.";
+ next;
+ mes "[Archer Guildsman]";
+ mes "Hopefull they will be of a high enough quality for you to pass the test.";
+ close;
+
+}
diff --git a/npc/jobs/1-1/mage.txt b/npc/jobs/1-1/mage.txt
index 890de725c..c0118db5f 100644
--- a/npc/jobs/1-1/mage.txt
+++ b/npc/jobs/1-1/mage.txt
@@ -1,496 +1,496 @@
-//===== eAthena Script =======================================
-//= Mage Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed input ingridients bug [Lupus]
-//= v1.2 Added instant job change for High Novice [Lupus]
-//= 1.3 Added Baby Class support [Lupus]
-//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= 1.5 Now saves/restores all quest skills [Lupus]
-//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
-//============================================================
-
-
-// -- Expert Mage --
-geffen_in.gat,164,124,4 script Expert Mage 123,{
- callfunc "F_ToHigh",Job_Mage_High,"High Mage",Job_High_Wizard,"Expert Mage";
- if(BaseJob == Job_Novice && job_magician_q >= 1) goto L_BeMage;
-
- mes "[Expert Mage]";
- mes "Hi hi! What can I help you with today?";
-M_Menu:
- next;
- menu "I'm in love with magic, make me a Mage!",M_0,"Tell me the Requirements.",M_1,"Nothing thanks.",M_End;
-
- M_0:
- mes "[Expert Mage]";
- mes "You wanna be a Mage? Hmmm.....";
- next;
- mes "[Expert Mage]";
- if(BaseJob == Job_Mage) {
- mes "You should really get yourself a mirror. Then you could see that you are ^ff0000already a Mage^000000.";
- mes "It may even help you fix up your hair do.";
- emotion e_swt;
- close;
- }
- if(BaseJob != Job_Novice) {
- mes "Oh...I'm sorry. I know they say 2 is always better than 1, but when it comes to Jobs, it's a No No.";
- mes "Try to stay positive. Your current job can't be that bad.";
- emotion e_no;
- close;
- }
- mes "Okays, just fill out this application form pleeassse.";
- next;
- mes "(you fill out the form and hand it back to her)";
- next;
- mes "[Expert Mage]";
- if(JobLevel < 10) {
- mes "Oh...I'm sorry. You need ^ff0000Job level 9^000000 and all of the ^0000ffBasic Skills^000000 before you can become a Mage.";
- mes "Go out and kill some more Fabres okays.";
- emotion e_no;
- close;
- }
- mes "Oooh~ You have very nice hand writing ^0000dd"+ strcharinfo(0) +"^000000, and more importantly you have met the necessary prerequisites to become a mage.";
- next;
- mes "[Expert Mage]";
- mes "The only thing left to do is to pass the official Geffen Mage Test. Let me give you the details of the test.";
- next;
- set job_magician_q, rand(1,4);
-
- L_Explain:
- mes "[Expert Mage]";
- if(job_magician_q == 1) mes "Your test is to make ^0000ff'Mixed Solution No.1'^000000 and bring it back to me.";
- if(job_magician_q == 2) mes "Your test is to make ^00aa00'Mixed Solution No.2'^000000 and bring it back to me.";
- if(job_magician_q == 3) mes "Your test is to make ^ff0000'Mixed Solution No.3'^000000 and bring it back to me.";
- if(job_magician_q == 4) mes "Your test is to make ^ffbb00'Mixed Solution No.4'^000000 and bring it back to me.";
-
- next;
- if(countitem(1092) == 0) getitem 1092,1;//Items: Empty_Test_Tube,
- mes "[Expert Mage]";
- mes "You can get the necessary ingredients in the ^5533FF'Guide Book'^000000 in this room.";
- mes "Refer to it to get a list of the proper ingredients for the solution.";
- next;
- mes "[Expert Mage]";
- mes "When you are ready to mix it, use the ^ff0000'Mixing Machine'^000000 in the center to mix the solution.";
- next;
- mes "[Expert Mage]";
- mes "Good Luck! I'll be waiting.";
- close;
-
- M_1:
- mes "[Expert Mage]";
- mes "First of all, you have to reach Novice Level 9 and have learned all of the Basic Skills.";
- mes "Secondly, you have to pass the Mage Test.";
- goto M_Menu;
- M_End:
- mes "[Expert Mage]";
- mes "Okays. Bye bye.";
- close;
-
-L_BeMage:
- mes "[Expert Mage]";
- mes "Oh, you're back. Lets see....";
- next;
- mes "[Expert Mage]";
- if(countitem(1090) >= 1) goto L_Retry;//Items: Unknown_Test_Tube,
- if((countitem(1071)<1) && (countitem(1085)<1) && (countitem(1086)<1) && (countitem(1087)<1)) goto L_NoSol;//Items: Unknown_Test_Tube, Unknown_Test_Tube, Unknown_Test_Tube, Unknown_Test_Tube,
-
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Mage.";
- if(SkillPoint > 0) close;
-
- mes ".....The color's not quit right.... there is a little to much precipitate..... hmmm......";
- next;
- mes "[Expert Mage]";
- mes "Well it's not perfect but it seems you worked very hard on this so...... alright! I'll let you pass! You are now officially qualified to become a mage!";
- emotion e_no1;
- next;
- mes "[Expert Mage]";
- mes "Abra-kadabra and hocus pocus, turn this young novice into a ^00aa00MAGE^000000!!";
- next;
- callfunc "Job_Change",Job_Mage;
-
- set Zeny,Zeny+500;
- if(job_magician_q == 1) delitem 1071,1;//Items: Unknown_Test_Tube,
- if(job_magician_q == 2) delitem 1085,1;//Items: Unknown_Test_Tube,
- if(job_magician_q == 3) delitem 1086,1;//Items: Unknown_Test_Tube,
- if(job_magician_q == 4) delitem 1087,1;//Items: Unknown_Test_Tube,
-
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Expert Mage]";
- mes "'Welcome to My World~ teh hehe. I've always wanted to say that. Anyways, congratulations! You're one of us now so let's be friends okays!";
- emotion e_heh;
- next;
- mes "[Expert Mage]";
- mes "Good luck to ya and take care!";
- close;
-
- L_Retry:
- mes "I'm sorry but the solution you have is no good. I'm afraid that you didn't pass the test. You can try again though.";
- mes "Let me explain the test for you once more okays.";
- emotion e_swt;
- next;
- delitem 1090,1;//Items: Unknown_Test_Tube,
- goto L_Explain;
-
- L_NoSol:
- mes "Where is the solution I asked for? I'm sorry but I can't check the solution when you don't have it. Let me remind you what solution you need.";
- emotion e_what;
- next;
- goto L_Explain;
-
-}
-
-// -- Solutions Guide Book --
-geffen_in.gat,177,112,1 script Solutions Guide Book 111,{
- mes "[Solutions Guide Book]";
- mes "I belong to Geffen Magic Academy. Please handle with care.";
- next;
- menu "Solution No. 1.",Sol1,"Solution No. 2.",Sol2,"Solution No. 3.",Sol3,"Solution No. 4.",Sol4,"Close.",Cancel;
-
- Sol1:
- mes "[Mage Test Solution No. 1]";
- mes "* Ingredients list *";
- mes " - Jellopy 2 ea";
- mes " - Fluff 3 ea";
- mes " - Milk 1 ea";
- next;
- mes "[Mage Test Solution No. 1]";
- mes "* Solvent Agent *";
- mes " Payon Solution";
- mes " Where to find: A Small Spring in";
- mes " Archer Village, Payon.";
- next;
- mes "[Mage Test Solution No. 1]";
- mes "* Chemical ingredients *";
- mes " - 8472";
- next;
- mes "[Mage Test Solution No. 1]";
- mes "* A Catalyst *";
- mes " - Yellow Gemstone";
- mes " (Mixing Machine Will provide";
- mes " this item.)";
- close;
- Sol2:
- mes "[Mage Test Solution No. 2]";
- mes "* Ingredients list *";
- mes " - Jellopy 3 ea";
- mes " - Fluff 1 ea";
- mes " - Milk 1 ea";
- next;
- mes "[Mage Test Solution No. 2]";
- mes "* Solvent Agent *";
- mes " - Not Appliable.";
- next;
- mes "[Mage Test Solution No. 2]";
- mes "* Chemical ingredients *";
- mes " - 3735";
- next;
- mes "[Mage Test Solution No. 2]";
- mes "* A Catalyst *";
- mes " - Red Gemstone";
- mes " (Mixing Machine Will provide";
- mes " this item.)";
- close;
- Sol3:
- mes "[Mage Test Solution No. 3]";
- mes "* Ingredients list *";
- mes " - Jellopy 6 ea";
- mes " - Fluff 1 ea";
- next;
- mes "[Mage Test Solution No. 3]";
- mes "* Solvent Agent *";
- mes " Payon Solution";
- mes " Where to find: A Small Spring in";
- mes " Archer Village, Payon.";
- next;
- mes "[Mage Test Solution No. 3]";
- mes "* Chemical ingredients *";
- mes " - 2750";
- next;
- mes "[Mage Test Solution No. 3]";
- mes "* A Catalyst *";
- mes " - Blue Gemstone";
- mes " (Mixing Machine Will provide";
- mes " this item.)";
- close;
- Sol4:
- mes "[Mage Test Solution No. 4]";
- mes "* Ingredients list *";
- mes " - Jellopy 2 ea";
- mes " - Fluff 3 ea";
- next;
- mes "[Mage Test Solution No. 4]";
- mes "* Solvent Agent *";
- mes " Morroc Solution";
- mes " Where to find: A Small Spring";
- mes " Near the Enterance of Pyramid";
- mes " in Morroc.";
- next;
- mes "[Mage Test Solution No. 4]";
- mes "* Chemical ingredients *";
- mes " - 5429";
- next;
- mes "[Mage Test Solution No. 4]";
- mes "* A Catalyst *";
- mes " - 1 carat Diamond";
- mes " (Mixing Machine Will provide";
- mes " this item.)";
- close;
- Cancel:
- close;
-}
-
-// -- Mixing Machine --
-geffen_in.gat,164,112,1 script Mixing Machine 111,{
- mes "[Mixing Machine]";
- mes "This is the unique Mixing Machine designed only for making magic solutions. It is the property of the Geffen Magic Academy.";
- next;
- mes "[Mixing Machine]";
- mes "Would you like to use this machine?";
- next;
- menu "Yes.",M_Start, "No.",M_End;
-
- M_Start:
- mes "[Mixing Machine]";
- mes "Please specify the ingredients you will be using.";
- next;
- sM_Menu:
- menu "Jellopy",sM_0, "Fluff",sM_1, "Milk",sM_2, "Move on to the next step.",sM_3;
-
- sM_0:
- input @JELLOPY;
- if (@JELLOPY<0 || @JELLOPY>100) set @JELLOPY,0; //set 0 if wrong input
- goto sM_Menu;
- sM_1:
- input @FLUFF;
- if (@FLUFF<0 || @FLUFF>100) set @FLUFF,0; //set 0 if wrong input
- goto sM_Menu;
- sM_2:
- input @MILK;
- if (@MILK<0 || @MILK>100) set @MILK,0; //set 0 if wrong input
- goto sM_Menu;
- sM_3:
- mes "[Mixing Machine]";
- mes "Please specify a solvent.";
- next;
- menu "Payon Solvent.",ssM_0, "Morroc Solvent",ssM_1, "No Solvent.",ssM_2;
-
- ssM_0:
- set @SOLVENT, 1089;
- set @SOLVENT$, "Payon";
- goto L_Cont;
- ssM_1:
- set @SOLVENT, 1088;
- set @SOLVENT$, "Morroc";
- goto L_Cont;
- ssM_2:
- set @SOLVENT, 0;
- set @SOLVENT$, "No";
-
- L_Cont:
- mes "[Mixing Machine]";
- mes "Here is your current list of ingredients:";
- mes "^4444FF"+@JELLOPY+"^000000 Jellopy,";
- mes "^4444FF"+@FLUFF+"^000000 Fluff,";
- mes "^4444FF"+@MILK+"^000000 Milk,";
- mes "and ^4444FF"+@SOLVENT$+"^000000 Solvent.";
- mes "Is this correct?";
- next;
- menu "Yes.",-, "No.",M_Start;
-
- mes "[Mixing Machine]";
- mes "Please put all of the items into the drum. Now enter the magic serial number.";
- next;
-
- L_Input:
- input @INPUT;
- mes "[Mixing Machine]";
- mes "You have inputted the number ^5555FF"+@INPUT+". Is this correct?";
- next;
- menu "Yes.",-, "No.",L_Input;
-
- mes "[Mixing Machine]";
- mes "For the last item, choose a catalyst stone.";
- next;
- menu "Yellow Gemstone.",ssM_Yell, "Red Gemstone.",ssM_Red, "Blue Gemstone.",ssM_Blue, "1 Carat Diamond.",ssM_Diamd;
-
- ssM_Yell:
- if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF || countitem(519)<@MILK) goto sL_NotEnuf;//Items: Jellopy, Fluff, Milk,
- if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
- mes "[Mixing Machine]";
- mes "All set. Initiating the mixing process. Please wait.";
- next;
- mes "[Mixing Machine]";
- mes "~rumble~rumble~rumble~";
- next;
- mes "[Mixing Machine]";
- if(job_magician_q != 1 || @INPUT != 8472 || @JELLOPY!=2 || @FLUFF!=3 || @MILK!=1 || @SOLVENT!=1089) goto sL_FAIL;
- delitem 909,2;//Items: Jellopy,
- delitem 914,3;//Items: Fluff,
- delitem 519,1;//Items: Milk,
- delitem 1089,1;//Items: Payon_Solution,
- delitem 1092,1;//Items: Empty_Test_Tube,
- mes "Mixing complete.";
- getitem 1071,1;//Items: Unknown_Test_Tube,
- close;
-
- ssM_Red:
- if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF || countitem(519)<@MILK) goto sL_NotEnuf;//Items: Jellopy, Fluff, Milk,
- mes "[Mixing Machine]";
- mes "All set. Initiating the mixing process. Please wait.";
- next;
- mes "[Mixing Machine]";
- mes "~rumble~rumble~rumble~";
- next;
- mes "[Mixing Machine]";
- if(job_magician_q != 2 || @INPUT != 3735 || @JELLOPY!=3 || @FLUFF!=1 || @MILK!=1 || @SOLVENT!=0) goto sL_FAIL;
- delitem 909,3;//Items: Jellopy,
- delitem 914,1;//Items: Fluff,
- delitem 519,1;//Items: Milk,
- delitem 1092,1;//Items: Empty_Test_Tube,
- mes "Mixing complete.";
- getitem 1085,1;//Items: Unknown_Test_Tube,
- close;
-
- ssM_Blue:
- if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF) goto sL_NotEnuf;//Items: Jellopy, Fluff,
- if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
- mes "[Mixing Machine]";
- mes "All set. Initiating the mixing process. Please wait.";
- next;
- mes "[Mixing Machine]";
- mes "~rumble~rumble~rumble~";
- next;
- mes "[Mixing Machine]";
- if(job_magician_q != 3 || @INPUT != 2750 || @JELLOPY!=6 || @FLUFF!=1 || @MILK!=0 || @SOLVENT!=1089) goto sL_FAIL;
- delitem 909,6;//Items: Jellopy,
- delitem 914,1;//Items: Fluff,
- delitem 1089,1;//Items: Payon_Solution,
- delitem 1092,1;//Items: Empty_Test_Tube,
- mes "Mixing complete.";
- getitem 1086,1;//Items: Unknown_Test_Tube,
- close;
-
- ssM_Diamd:
- if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF) goto sL_NotEnuf;//Items: Jellopy, Fluff,
- if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
- mes "[Mixing Machine]";
- mes "All set. Initiating the mixing process. Please wait.";
- next;
- mes "[Mixing Machine]";
- mes "~rumble~rumble~rumble~";
- next;
- mes "[Mixing Machine]";
- if(job_magician_q != 4 || @INPUT != 5429 || @JELLOPY!=2 || @FLUFF!=3 || @MILK!=0 || @SOLVENT!=1088) goto sL_FAIL;
- delitem 909,2;//Items: Jellopy,
- delitem 914,3;//Items: Fluff,
- delitem 1088,1;//Items: Morroc_Solution,
- delitem 1092,1;//Items: Empty_Test_Tube,
- mes "Mixing complete.";
- getitem 1087,1;//Items: Unknown_Test_Tube,
- close;
-
- sL_FAIL:
- delitem 909, @JELLOPY;//Items: Jellopy,
- delitem 914, @FLUFF;//Items: Fluff,
- delitem 519, @MILK;//Items: Milk,
- delitem @SOLVENT,1;
- mes "Mixing complete.";
- getitem 1090,1;//Items: Unknown_Test_Tube,
- close;
-
- sL_NotEnuf:
- mes "[Mixing Machine]";
- mes "You do not have enough ingredients to mix into a solution.";
- close;
- M_End:
- close;
-
-}
-
-
-// -- Morroc Solution --
-moc_ruins.gat,91,150,5 script Ponka-Hontas 93,{
- mes "[Mage Guildsman]";
- mes "You want the Solution? Then give me 50 Zeny and at least 1 Empty Testube.";
- next;
- menu "Allright, Deal",L0,"Nah, forget it.",L1;
-
- L0:
- if(countitem(1092)<1) goto L0NoT;//Items: Empty_Test_Tube,
- if(Zeny<50) goto L0NoZ;
- mes "[Mage Guildsman]";
- mes "Ok, you have the money and a empty Testube, that's good!";
- delitem 1092,1;//Items: Empty_Test_Tube,
- set Zeny,Zeny-50;
- next;
- mes "[Mage Guildsman]";
- getitem 1088,1;//Items: Morroc_Solution,
- mes "Thank you, I think you will be a great mage, you are so generous.";
- mes "I hope i'll see you soon again here";
- emotion e_no1;
- close;
-
- L0NoT:
- mes "[Mage Guildsman]";
- mes "You can't Carry on Fluid without a bottle, are you sure you want to become a mage?";
- mes "Bring an Empty Testube";
- close;
-
- L0NoZ:
- mes "[Mage Guildsman]";
- mes "Pfff, You are too poor to buy our noble Solution!";
- mes "Bring 50 Zeny, go to the mercant sell something, it will not be too hard I hope";
- close;
- L1:
- mes "[Mage Guildsman]";
- close;
-}
-
-
-// -- Payon Solution --
-pay_arche.gat,122,100,5 script Dollshoi 88,{
- mes "[Mage Guildsman]";
- mes "You want the Solution? Then give me 50 Zeny and at least 1 Empty Testube.";
- next;
- menu "Allright, Deal",L0,"Nah, forget it.",L1;
-
- L0:
- if(countitem(1092)<1) goto L0NoT;//Items: Empty_Test_Tube,
- if(Zeny<50) goto L0NoZ;
- mes "[Mage Guildsman]";
- mes "Ok, you have the money and a empty Testube, that's good!";
- delitem 1092,1;//Items: Empty_Test_Tube,
- set Zeny,Zeny-50;
- next;
- mes "[Mage Guildsman]";
- getitem 1089,1;//Items: Payon_Solution,
- mes "Thank you, I think you will be a great mage, you are so generous.";
- mes "I hope i'll see you soon again here";
- emotion e_no1;
- close;
-
- L0NoT:
- mes "[Mage Guildsman]";
- mes "You can't Carry on Fluid without a bottle, are you sure you want to become a mage?";
- mes "Bring an Empty Testube";
- close;
-
- L0NoZ:
- mes "[Mage Guildsman]";
- mes "Pfff, You are too poor to buy our noble Solution!";
- mes "Bring 50 Zeny, go to the mercant sell something, it will not be too hard I hope";
- close;
- L1:
- mes "[Mage Guildsman]";
- close;
-}
-
+//===== eAthena Script =======================================
+//= Mage Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed input ingridients bug [Lupus]
+//= v1.2 Added instant job change for High Novice [Lupus]
+//= 1.3 Added Baby Class support [Lupus]
+//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= 1.5 Now saves/restores all quest skills [Lupus]
+//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
+//============================================================
+
+
+// -- Expert Mage --
+geffen_in.gat,164,124,4 script Expert Mage 123,{
+ callfunc "F_ToHigh",Job_Mage_High,"High Mage",Job_High_Wizard,"Expert Mage";
+ if(BaseJob == Job_Novice && job_magician_q >= 1) goto L_BeMage;
+
+ mes "[Expert Mage]";
+ mes "Hi hi! What can I help you with today?";
+M_Menu:
+ next;
+ menu "I'm in love with magic, make me a Mage!",M_0,"Tell me the Requirements.",M_1,"Nothing thanks.",M_End;
+
+ M_0:
+ mes "[Expert Mage]";
+ mes "You wanna be a Mage? Hmmm.....";
+ next;
+ mes "[Expert Mage]";
+ if(BaseJob == Job_Mage) {
+ mes "You should really get yourself a mirror. Then you could see that you are ^ff0000already a Mage^000000.";
+ mes "It may even help you fix up your hair do.";
+ emotion e_swt;
+ close;
+ }
+ if(BaseJob != Job_Novice) {
+ mes "Oh...I'm sorry. I know they say 2 is always better than 1, but when it comes to Jobs, it's a No No.";
+ mes "Try to stay positive. Your current job can't be that bad.";
+ emotion e_no;
+ close;
+ }
+ mes "Okays, just fill out this application form pleeassse.";
+ next;
+ mes "(you fill out the form and hand it back to her)";
+ next;
+ mes "[Expert Mage]";
+ if(JobLevel < 10) {
+ mes "Oh...I'm sorry. You need ^ff0000Job level 9^000000 and all of the ^0000ffBasic Skills^000000 before you can become a Mage.";
+ mes "Go out and kill some more Fabres okays.";
+ emotion e_no;
+ close;
+ }
+ mes "Oooh~ You have very nice hand writing ^0000dd"+ strcharinfo(0) +"^000000, and more importantly you have met the necessary prerequisites to become a mage.";
+ next;
+ mes "[Expert Mage]";
+ mes "The only thing left to do is to pass the official Geffen Mage Test. Let me give you the details of the test.";
+ next;
+ set job_magician_q, rand(1,4);
+
+ L_Explain:
+ mes "[Expert Mage]";
+ if(job_magician_q == 1) mes "Your test is to make ^0000ff'Mixed Solution No.1'^000000 and bring it back to me.";
+ if(job_magician_q == 2) mes "Your test is to make ^00aa00'Mixed Solution No.2'^000000 and bring it back to me.";
+ if(job_magician_q == 3) mes "Your test is to make ^ff0000'Mixed Solution No.3'^000000 and bring it back to me.";
+ if(job_magician_q == 4) mes "Your test is to make ^ffbb00'Mixed Solution No.4'^000000 and bring it back to me.";
+
+ next;
+ if(countitem(1092) == 0) getitem 1092,1;//Items: Empty_Test_Tube,
+ mes "[Expert Mage]";
+ mes "You can get the necessary ingredients in the ^5533FF'Guide Book'^000000 in this room.";
+ mes "Refer to it to get a list of the proper ingredients for the solution.";
+ next;
+ mes "[Expert Mage]";
+ mes "When you are ready to mix it, use the ^ff0000'Mixing Machine'^000000 in the center to mix the solution.";
+ next;
+ mes "[Expert Mage]";
+ mes "Good Luck! I'll be waiting.";
+ close;
+
+ M_1:
+ mes "[Expert Mage]";
+ mes "First of all, you have to reach Novice Level 9 and have learned all of the Basic Skills.";
+ mes "Secondly, you have to pass the Mage Test.";
+ goto M_Menu;
+ M_End:
+ mes "[Expert Mage]";
+ mes "Okays. Bye bye.";
+ close;
+
+L_BeMage:
+ mes "[Expert Mage]";
+ mes "Oh, you're back. Lets see....";
+ next;
+ mes "[Expert Mage]";
+ if(countitem(1090) >= 1) goto L_Retry;//Items: Unknown_Test_Tube,
+ if((countitem(1071)<1) && (countitem(1085)<1) && (countitem(1086)<1) && (countitem(1087)<1)) goto L_NoSol;//Items: Unknown_Test_Tube, Unknown_Test_Tube, Unknown_Test_Tube, Unknown_Test_Tube,
+
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Mage.";
+ if(SkillPoint > 0) close;
+
+ mes ".....The color's not quit right.... there is a little to much precipitate..... hmmm......";
+ next;
+ mes "[Expert Mage]";
+ mes "Well it's not perfect but it seems you worked very hard on this so...... alright! I'll let you pass! You are now officially qualified to become a mage!";
+ emotion e_no1;
+ next;
+ mes "[Expert Mage]";
+ mes "Abra-kadabra and hocus pocus, turn this young novice into a ^00aa00MAGE^000000!!";
+ next;
+ callfunc "Job_Change",Job_Mage;
+
+ set Zeny,Zeny+500;
+ if(job_magician_q == 1) delitem 1071,1;//Items: Unknown_Test_Tube,
+ if(job_magician_q == 2) delitem 1085,1;//Items: Unknown_Test_Tube,
+ if(job_magician_q == 3) delitem 1086,1;//Items: Unknown_Test_Tube,
+ if(job_magician_q == 4) delitem 1087,1;//Items: Unknown_Test_Tube,
+
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Expert Mage]";
+ mes "'Welcome to My World~ teh hehe. I've always wanted to say that. Anyways, congratulations! You're one of us now so let's be friends okays!";
+ emotion e_heh;
+ next;
+ mes "[Expert Mage]";
+ mes "Good luck to ya and take care!";
+ close;
+
+ L_Retry:
+ mes "I'm sorry but the solution you have is no good. I'm afraid that you didn't pass the test. You can try again though.";
+ mes "Let me explain the test for you once more okays.";
+ emotion e_swt;
+ next;
+ delitem 1090,1;//Items: Unknown_Test_Tube,
+ goto L_Explain;
+
+ L_NoSol:
+ mes "Where is the solution I asked for? I'm sorry but I can't check the solution when you don't have it. Let me remind you what solution you need.";
+ emotion e_what;
+ next;
+ goto L_Explain;
+
+}
+
+// -- Solutions Guide Book --
+geffen_in.gat,177,112,1 script Solutions Guide Book 111,{
+ mes "[Solutions Guide Book]";
+ mes "I belong to Geffen Magic Academy. Please handle with care.";
+ next;
+ menu "Solution No. 1.",Sol1,"Solution No. 2.",Sol2,"Solution No. 3.",Sol3,"Solution No. 4.",Sol4,"Close.",Cancel;
+
+ Sol1:
+ mes "[Mage Test Solution No. 1]";
+ mes "* Ingredients list *";
+ mes " - Jellopy 2 ea";
+ mes " - Fluff 3 ea";
+ mes " - Milk 1 ea";
+ next;
+ mes "[Mage Test Solution No. 1]";
+ mes "* Solvent Agent *";
+ mes " Payon Solution";
+ mes " Where to find: A Small Spring in";
+ mes " Archer Village, Payon.";
+ next;
+ mes "[Mage Test Solution No. 1]";
+ mes "* Chemical ingredients *";
+ mes " - 8472";
+ next;
+ mes "[Mage Test Solution No. 1]";
+ mes "* A Catalyst *";
+ mes " - Yellow Gemstone";
+ mes " (Mixing Machine Will provide";
+ mes " this item.)";
+ close;
+ Sol2:
+ mes "[Mage Test Solution No. 2]";
+ mes "* Ingredients list *";
+ mes " - Jellopy 3 ea";
+ mes " - Fluff 1 ea";
+ mes " - Milk 1 ea";
+ next;
+ mes "[Mage Test Solution No. 2]";
+ mes "* Solvent Agent *";
+ mes " - Not Appliable.";
+ next;
+ mes "[Mage Test Solution No. 2]";
+ mes "* Chemical ingredients *";
+ mes " - 3735";
+ next;
+ mes "[Mage Test Solution No. 2]";
+ mes "* A Catalyst *";
+ mes " - Red Gemstone";
+ mes " (Mixing Machine Will provide";
+ mes " this item.)";
+ close;
+ Sol3:
+ mes "[Mage Test Solution No. 3]";
+ mes "* Ingredients list *";
+ mes " - Jellopy 6 ea";
+ mes " - Fluff 1 ea";
+ next;
+ mes "[Mage Test Solution No. 3]";
+ mes "* Solvent Agent *";
+ mes " Payon Solution";
+ mes " Where to find: A Small Spring in";
+ mes " Archer Village, Payon.";
+ next;
+ mes "[Mage Test Solution No. 3]";
+ mes "* Chemical ingredients *";
+ mes " - 2750";
+ next;
+ mes "[Mage Test Solution No. 3]";
+ mes "* A Catalyst *";
+ mes " - Blue Gemstone";
+ mes " (Mixing Machine Will provide";
+ mes " this item.)";
+ close;
+ Sol4:
+ mes "[Mage Test Solution No. 4]";
+ mes "* Ingredients list *";
+ mes " - Jellopy 2 ea";
+ mes " - Fluff 3 ea";
+ next;
+ mes "[Mage Test Solution No. 4]";
+ mes "* Solvent Agent *";
+ mes " Morroc Solution";
+ mes " Where to find: A Small Spring";
+ mes " Near the Enterance of Pyramid";
+ mes " in Morroc.";
+ next;
+ mes "[Mage Test Solution No. 4]";
+ mes "* Chemical ingredients *";
+ mes " - 5429";
+ next;
+ mes "[Mage Test Solution No. 4]";
+ mes "* A Catalyst *";
+ mes " - 1 carat Diamond";
+ mes " (Mixing Machine Will provide";
+ mes " this item.)";
+ close;
+ Cancel:
+ close;
+}
+
+// -- Mixing Machine --
+geffen_in.gat,164,112,1 script Mixing Machine 111,{
+ mes "[Mixing Machine]";
+ mes "This is the unique Mixing Machine designed only for making magic solutions. It is the property of the Geffen Magic Academy.";
+ next;
+ mes "[Mixing Machine]";
+ mes "Would you like to use this machine?";
+ next;
+ menu "Yes.",M_Start, "No.",M_End;
+
+ M_Start:
+ mes "[Mixing Machine]";
+ mes "Please specify the ingredients you will be using.";
+ next;
+ sM_Menu:
+ menu "Jellopy",sM_0, "Fluff",sM_1, "Milk",sM_2, "Move on to the next step.",sM_3;
+
+ sM_0:
+ input @JELLOPY;
+ if (@JELLOPY<0 || @JELLOPY>100) set @JELLOPY,0; //set 0 if wrong input
+ goto sM_Menu;
+ sM_1:
+ input @FLUFF;
+ if (@FLUFF<0 || @FLUFF>100) set @FLUFF,0; //set 0 if wrong input
+ goto sM_Menu;
+ sM_2:
+ input @MILK;
+ if (@MILK<0 || @MILK>100) set @MILK,0; //set 0 if wrong input
+ goto sM_Menu;
+ sM_3:
+ mes "[Mixing Machine]";
+ mes "Please specify a solvent.";
+ next;
+ menu "Payon Solvent.",ssM_0, "Morroc Solvent",ssM_1, "No Solvent.",ssM_2;
+
+ ssM_0:
+ set @SOLVENT, 1089;
+ set @SOLVENT$, "Payon";
+ goto L_Cont;
+ ssM_1:
+ set @SOLVENT, 1088;
+ set @SOLVENT$, "Morroc";
+ goto L_Cont;
+ ssM_2:
+ set @SOLVENT, 0;
+ set @SOLVENT$, "No";
+
+ L_Cont:
+ mes "[Mixing Machine]";
+ mes "Here is your current list of ingredients:";
+ mes "^4444FF"+@JELLOPY+"^000000 Jellopy,";
+ mes "^4444FF"+@FLUFF+"^000000 Fluff,";
+ mes "^4444FF"+@MILK+"^000000 Milk,";
+ mes "and ^4444FF"+@SOLVENT$+"^000000 Solvent.";
+ mes "Is this correct?";
+ next;
+ menu "Yes.",-, "No.",M_Start;
+
+ mes "[Mixing Machine]";
+ mes "Please put all of the items into the drum. Now enter the magic serial number.";
+ next;
+
+ L_Input:
+ input @INPUT;
+ mes "[Mixing Machine]";
+ mes "You have inputted the number ^5555FF"+@INPUT+". Is this correct?";
+ next;
+ menu "Yes.",-, "No.",L_Input;
+
+ mes "[Mixing Machine]";
+ mes "For the last item, choose a catalyst stone.";
+ next;
+ menu "Yellow Gemstone.",ssM_Yell, "Red Gemstone.",ssM_Red, "Blue Gemstone.",ssM_Blue, "1 Carat Diamond.",ssM_Diamd;
+
+ ssM_Yell:
+ if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF || countitem(519)<@MILK) goto sL_NotEnuf;//Items: Jellopy, Fluff, Milk,
+ if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
+ mes "[Mixing Machine]";
+ mes "All set. Initiating the mixing process. Please wait.";
+ next;
+ mes "[Mixing Machine]";
+ mes "~rumble~rumble~rumble~";
+ next;
+ mes "[Mixing Machine]";
+ if(job_magician_q != 1 || @INPUT != 8472 || @JELLOPY!=2 || @FLUFF!=3 || @MILK!=1 || @SOLVENT!=1089) goto sL_FAIL;
+ delitem 909,2;//Items: Jellopy,
+ delitem 914,3;//Items: Fluff,
+ delitem 519,1;//Items: Milk,
+ delitem 1089,1;//Items: Payon_Solution,
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ mes "Mixing complete.";
+ getitem 1071,1;//Items: Unknown_Test_Tube,
+ close;
+
+ ssM_Red:
+ if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF || countitem(519)<@MILK) goto sL_NotEnuf;//Items: Jellopy, Fluff, Milk,
+ mes "[Mixing Machine]";
+ mes "All set. Initiating the mixing process. Please wait.";
+ next;
+ mes "[Mixing Machine]";
+ mes "~rumble~rumble~rumble~";
+ next;
+ mes "[Mixing Machine]";
+ if(job_magician_q != 2 || @INPUT != 3735 || @JELLOPY!=3 || @FLUFF!=1 || @MILK!=1 || @SOLVENT!=0) goto sL_FAIL;
+ delitem 909,3;//Items: Jellopy,
+ delitem 914,1;//Items: Fluff,
+ delitem 519,1;//Items: Milk,
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ mes "Mixing complete.";
+ getitem 1085,1;//Items: Unknown_Test_Tube,
+ close;
+
+ ssM_Blue:
+ if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF) goto sL_NotEnuf;//Items: Jellopy, Fluff,
+ if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
+ mes "[Mixing Machine]";
+ mes "All set. Initiating the mixing process. Please wait.";
+ next;
+ mes "[Mixing Machine]";
+ mes "~rumble~rumble~rumble~";
+ next;
+ mes "[Mixing Machine]";
+ if(job_magician_q != 3 || @INPUT != 2750 || @JELLOPY!=6 || @FLUFF!=1 || @MILK!=0 || @SOLVENT!=1089) goto sL_FAIL;
+ delitem 909,6;//Items: Jellopy,
+ delitem 914,1;//Items: Fluff,
+ delitem 1089,1;//Items: Payon_Solution,
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ mes "Mixing complete.";
+ getitem 1086,1;//Items: Unknown_Test_Tube,
+ close;
+
+ ssM_Diamd:
+ if(countitem(909)<@JELLOPY || countitem(914)<@FLUFF) goto sL_NotEnuf;//Items: Jellopy, Fluff,
+ if(@SOLVENT$!=("No") && countitem(@SOLVENT)<1) goto sL_NotEnuf;
+ mes "[Mixing Machine]";
+ mes "All set. Initiating the mixing process. Please wait.";
+ next;
+ mes "[Mixing Machine]";
+ mes "~rumble~rumble~rumble~";
+ next;
+ mes "[Mixing Machine]";
+ if(job_magician_q != 4 || @INPUT != 5429 || @JELLOPY!=2 || @FLUFF!=3 || @MILK!=0 || @SOLVENT!=1088) goto sL_FAIL;
+ delitem 909,2;//Items: Jellopy,
+ delitem 914,3;//Items: Fluff,
+ delitem 1088,1;//Items: Morroc_Solution,
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ mes "Mixing complete.";
+ getitem 1087,1;//Items: Unknown_Test_Tube,
+ close;
+
+ sL_FAIL:
+ delitem 909, @JELLOPY;//Items: Jellopy,
+ delitem 914, @FLUFF;//Items: Fluff,
+ delitem 519, @MILK;//Items: Milk,
+ delitem @SOLVENT,1;
+ mes "Mixing complete.";
+ getitem 1090,1;//Items: Unknown_Test_Tube,
+ close;
+
+ sL_NotEnuf:
+ mes "[Mixing Machine]";
+ mes "You do not have enough ingredients to mix into a solution.";
+ close;
+ M_End:
+ close;
+
+}
+
+
+// -- Morroc Solution --
+moc_ruins.gat,91,150,5 script Ponka-Hontas 93,{
+ mes "[Mage Guildsman]";
+ mes "You want the Solution? Then give me 50 Zeny and at least 1 Empty Testube.";
+ next;
+ menu "Allright, Deal",L0,"Nah, forget it.",L1;
+
+ L0:
+ if(countitem(1092)<1) goto L0NoT;//Items: Empty_Test_Tube,
+ if(Zeny<50) goto L0NoZ;
+ mes "[Mage Guildsman]";
+ mes "Ok, you have the money and a empty Testube, that's good!";
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ set Zeny,Zeny-50;
+ next;
+ mes "[Mage Guildsman]";
+ getitem 1088,1;//Items: Morroc_Solution,
+ mes "Thank you, I think you will be a great mage, you are so generous.";
+ mes "I hope i'll see you soon again here";
+ emotion e_no1;
+ close;
+
+ L0NoT:
+ mes "[Mage Guildsman]";
+ mes "You can't Carry on Fluid without a bottle, are you sure you want to become a mage?";
+ mes "Bring an Empty Testube";
+ close;
+
+ L0NoZ:
+ mes "[Mage Guildsman]";
+ mes "Pfff, You are too poor to buy our noble Solution!";
+ mes "Bring 50 Zeny, go to the mercant sell something, it will not be too hard I hope";
+ close;
+ L1:
+ mes "[Mage Guildsman]";
+ close;
+}
+
+
+// -- Payon Solution --
+pay_arche.gat,122,100,5 script Dollshoi 88,{
+ mes "[Mage Guildsman]";
+ mes "You want the Solution? Then give me 50 Zeny and at least 1 Empty Testube.";
+ next;
+ menu "Allright, Deal",L0,"Nah, forget it.",L1;
+
+ L0:
+ if(countitem(1092)<1) goto L0NoT;//Items: Empty_Test_Tube,
+ if(Zeny<50) goto L0NoZ;
+ mes "[Mage Guildsman]";
+ mes "Ok, you have the money and a empty Testube, that's good!";
+ delitem 1092,1;//Items: Empty_Test_Tube,
+ set Zeny,Zeny-50;
+ next;
+ mes "[Mage Guildsman]";
+ getitem 1089,1;//Items: Payon_Solution,
+ mes "Thank you, I think you will be a great mage, you are so generous.";
+ mes "I hope i'll see you soon again here";
+ emotion e_no1;
+ close;
+
+ L0NoT:
+ mes "[Mage Guildsman]";
+ mes "You can't Carry on Fluid without a bottle, are you sure you want to become a mage?";
+ mes "Bring an Empty Testube";
+ close;
+
+ L0NoZ:
+ mes "[Mage Guildsman]";
+ mes "Pfff, You are too poor to buy our noble Solution!";
+ mes "Bring 50 Zeny, go to the mercant sell something, it will not be too hard I hope";
+ close;
+ L1:
+ mes "[Mage Guildsman]";
+ close;
+}
+
diff --git a/npc/jobs/1-1/merchant.txt b/npc/jobs/1-1/merchant.txt
index d04f0c2b0..874fcf4e2 100644
--- a/npc/jobs/1-1/merchant.txt
+++ b/npc/jobs/1-1/merchant.txt
@@ -1,973 +1,973 @@
-//===== eAthena Script =======================================
-//= Merchant Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Added instant job change for High Novice [Lupus]
-//= v1.3 Added Baby Class support [Lupus]
-//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= 1.5 Changed Prontera->Izlude teleport price to 600 [Lupus]
-//= 1.5.1 Removed Duplicates [Silent]
-//= 1.5.2 Now saves/restores all quest skills [Lupus]
-//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
-//============================================================
-
-
-// == Guild NPCs ==
-// -- Mahnsoo --
-alberta_in.gat,53,43,6 script Chief Mahnsoo 86,{
- callfunc "F_ToHigh",Job_Merchant_High,"Merchant High",Job_Whitesmith,"Chief Mahnsoo";
- mes "[Chief Mahnsoo]";
- if(BaseJob == Job_Novice && job_merchant_q3 == 4) goto L_MakeMerc;
- if(BaseJob == Job_Novice && job_merchant_q3 == 3) goto L_GiveRecpt;
- if(BaseJob == Job_Novice && job_merchant_q3 == 5) goto L_Failed;
- if(BaseJob == Job_Novice && job_merchant_q2 > 0) goto L_Back;
-
- mes "What brings you here? Something on your mind?";
-M_Menu:
- next;
- menu "I want to be a Merchant.",M_0,"What exactly is a Merchant?",M_1,"Give me the Requirements.",M_2,"End.",M_End;
-
- M_0:
-
- if(BaseJob == Job_Merchant) {
- mes "[Chief Mahnsoo]";
- mes "Huh? What did you say? You noodle head! Take a good look at yourself. Your ALREADY A MERCHANT! Good lord!";
- emotion e_what;
- emotion e_gasp;
- close;
- }
- if(BaseJob != Job_Novice) {
- mes "[Chief Mahnsoo]";
- mes "We Merchants really don't like people who work during the day, and then go out to crazy bars at night. When it comes to money, for them it's 'easy come easy go.";
- next;
- mes "[Chief Mahnsoo]";
- mes "Well.. I talked a little too long, I guess... but since you already have an occupation, we don't need you.";
- close;
- }
- if(JobLevel < 10) {
- mes "[Chief Mahnsoo]";
- mes "I'm sorry but you have to have a Novice Job level of 9 with all 9 of the basic Skills.";
- close;
- }
- mes "[Chief Mahnsoo]";
- mes "A Merchant you say? Well...";
- next;
- mes "[Chief Mahnsoo]";
- mes "Alright. First fill out an application form and submit 1000 Zeny for the Memebership Fee.";
- mes "If you don't have enough money right now, you can pay 500 Zeny first and then pay the rest later after you've passed the Merchant License Test.";
- next;
- mes "[Chief Mahnsoo]";
- mes "How does that sound? Are you still interested?";
-
- next;
- menu "Sure why not. Who needs college anyways.",sM_0a,"Maybe, later...",sM_0b;
-
- sM_0a:
- mes "[Chief Mahnsoo]";
- mes "I'm glad to hear that. So how do you wish to pay the Membership Fee?";
- sM_Menu:
- next;
- menu "Pay 1000 Zeny Now.",m_0a,"2 payments of 500 Zeny.",m_0b,"Nevermind.",m_0End;
-
- m_0a:
- mes "[Chief Mahnsoo]";
- if(Zeny < 1000) goto sl_Short1k;
- set Zeny,Zeny-1000;
- set job_merchant_q,1;
- mes "Let's see... 1000 Zeny.... Good.";
- goto L_Cont0;
-
- sl_Short1k:
- mes "Looks like your a little short on zeny. Why not make a minimal payment of 500 Zeny first?";
- mes "You can worry about the rest later.";
- emotion e_swt;
- goto sM_Menu;
- close;
-
- m_0b:
- mes "[Chief Mahnsoo]";
- if(Zeny < 500) goto sl_Short500z;
- set Zeny,Zeny-500;
- set job_merchant_q,2;
- mes "Let's See... 500 Zeny.... Good enough to start off... though I don't really think splitting paymenst is a good habbit for any Merchant.";
- goto L_Cont0;
-
- sl_Short500z:
- mes "Looks like your a little short on zeny. Come back when you have enough.";
- emotion e_swt;
- close;
-
- m_0End:
- mes "[Chief Mahnsoo]";
- mes "You have no money now? Ok, No Problem. Take your time, Ok?";
- close;
-
- sM_0b:
- mes "[Chief Mahnsoo]";
- mes "Feel free to return anytime when you are ready, Alright?.";
- close;
-
-
- L_Cont0:
- next;
- mes "[Chief Mahnsoo]";
- mes "Now that that's settled, let me talk to you about the Merchant License Test. You will be given a task to fullfill.";
- mes "How well you perform the task will determine whether or not you will become a merchant.";
- next;
- mes "[Chief Mahnsoo]";
- mes "Oh, but before we get started I must say one thing.....";
- next;
- mes "[Chief Mahnsoo]";
- mes "There are some dumb and greedy people out there who do not know what it means to be a Merchant.";
- mes "I sincerely hope you will not turn out to be like them. You won't... will you??..... (stares at you intently)";
- next;
- mes "[Chief Mahnsoo]";
- mes "Anywho, here is your task. You will need to....";
- next;
- mes "[Chief Mahnsoo]";
-
- set @TEMP,rand(4);
- if(@TEMP ==1) goto R_1;
- if(@TEMP ==2) goto R_2;
- if(@TEMP ==3) goto R_3;
-
- R_0:
- mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to the ^00aa00Kafra Worker in the Former Swordman Association in Prontera^000000.";
- if(job_merchant_q2 == 1) goto sR_0a;
- if(job_merchant_q2 == 2) goto sR_0b;
- set @TEMP,rand(2);
- if(@TEMP !=0) goto sR_0b;
-
- sR_0a:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002485741^000000.";
- set job_merchant_q2, 1;
- next;
- goto L_Cont1;
- sR_0b:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002328137^000000.";
- set job_merchant_q2, 2;
- next;
- goto L_Cont1;
-
- R_1:
- mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to a member of the ^00aa00Mage Guild in Geffen^000000.";
- next;
- mes "[Chief Mahnsoo]";
- if(job_merchant_q2 == 3) goto sR_1a;
- if(job_merchant_q2 == 4) goto sR_1b;
- set @TEMP,rand(2);
- if(@TEMP !=0) goto sR_1b;
-
- sR_1a:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002989396^000000.";
- set job_merchant_q2, 3;
- next;
- goto L_Cont1;
- sR_1b:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002191737^000000.";
- set job_merchant_q2, 4;
- next;
- goto L_Cont1;
-
- R_2:
- mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to ^00aa00Java Dullihan, the Dyermaker in Morroc^000000.";
- next;
- mes "[Chief Mahnsoo]";
- if(job_merchant_q2 == 5) goto sR_2a;
- if(job_merchant_q2 == 6) goto sR_2b;
- set @TEMP,rand(2);
- if(@TEMP !=0) goto sR_2b;
-
- sR_2a:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003012685^000000.";
- set job_merchant_q2,5;
- next;
- goto L_Cont1;
- sR_2b:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003487372^000000.";
- set job_merchant_q2,6;
- next;
- goto L_Cont1;
-
- R_3:
- mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to the ^00aa00Kafra worker in Byalan island^000000.";
- next;
- mes "[Chief Mahnsoo]";
- if(job_merchant_q2 == 7) goto sR_3a;
- if(job_merchant_q2 == 8) goto sR_3b;
- set @TEMP,rand(2);
- if(@TEMP !=0) goto sR_3b;
-
- sR_3a:
-
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003318702^000000.";
- set job_merchant_q2,7;
- goto M00R3;
- sR_3b:
- mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003543625^000000.";
- set job_merchant_q2,8;
- goto M00R3;
-
- M00R3:
- next;
- mes "[Chief Mahnsoo]";
- mes "Umm and... this is my personal request. Include this message in your delivery please~";
- if(countitem(1072)==0) getitem 1072,1;//Items: Delivery_Message,
- next;
- goto L_Cont1;
-
-
- L_Cont1:
- mes "[Chief Mahnsoo]";
- mes "Keep track of the ^ff0000'Serial Number'^000000 and the ^ff0000'Destination'^000000 of the product.";
- mes "The Wharehouse Manager will need them to assist you in getting the right product.";
- next;
- mes "[Chief Mahnsoo]";
- mes "The Wharehouse itself is located to my right.";
- next;
- mes "[Chief Mahnsoo]";
- mes "After you've finished making the delivery come back here and give the Receipt to the Wharehouse Manager. Then come see me. Is that clear?";
- next;
- mes "[Chief Mahnsoo]";
- mes "Alright, good luck!";
- close;
-
- M_1:
- mes "[Chief Mahnsoo]";
- mes "Merchants are people who are in the business of buying and selling goods. We focus on finding rare items and selling them to those who desire or need them.";
- mes "We are not particularly good at fighting nor do we have any usefull support skills. What we Merchants can do is buy Goods at lower prices as well as sell them at Highter prices.";
- next;
- mes "[Chief Mahnsoo]";
- mes "As far as what weapons go, we can use most of them. Bows, Rods, and Two-Handed Swords are the only types of weapons we can't use.";
- mes "The skill Mannomite even lets us use zeny as a weapon.";
- next;
- mes "[Chief Mahnsoo]";
- mes "Whatever people may say about us, making money is important to a merchants lively hood.";
- goto M_Menu;
- close;
-
- M_2:
- mes "[Chief Mahnsoo]";
- mes "There are three conditions to be qualified if you want to be a Merchant.";
- next;
- mes "[Chief Mahnsoo]";
- mes "First of all, You have to be at Novice job level 9 with fulfilled Basic Skills.";
- next;
- mes "[Chief Mahnsoo]";
- mes "Secondly, You have to pay 1000 Zeny for acquire a Memebrship. I believe a Merchant Candidate will be able to earn 1000 Zeny at ease. Oh yeah~";
- next;
- mes "[Chief Mahnsoo]";
- mes "Third, There is a License Test to examine your basic Physical Strength and a Sense of Direction. You must Deliever the Goods to the Specific person in the Specific Town.";
- goto M_Menu;
- close;
-
- M_End:
- close;
-
-L_GiveRecpt:
- mes "Ah, " + strcharinfo(0) + ". You're back! I take it things went well? Tell you what, go give the Receipt to the Storekeeper and then hurry back here ok.";
- close;
-
-L_Back:
- mes "What are you doing back here?";
- emotion e_what;
- next;
- mes "[Chief Mahnsoo]";
- mes "You didn't leave yet?";
- next;
- mes "[Chief Mahnsoo]";
- mes "You are supposed to be on your way by now. Don't tell me you already forgot the product number and destination?";
- next;
- mes "[Chief Mahnsoo]";
- mes "Alright numskull, do you want me to repeat it to you one more time?";
- next;
- menu "Yes please", M_Yes,"Never mind.",M_No;
-
- M_Yes:
- mes "[Chief Mahnsoo]";
- if((job_merchant_q2==1) || (job_merchant_q2==2)) goto R_0;
- if((job_merchant_q2==3) || (job_merchant_q2==4)) goto R_1;
- if((job_merchant_q2==5) || (job_merchant_q2==6)) goto R_2;
- if((job_merchant_q2==7) || (job_merchant_q2==8)) goto R_3;
- close;
-
- M_No:
- close;
-
-L_MakeMerc:
- if(Sex == 1) mes "Mr. ^0000cc" + strcharinfo(0) + "^000000.....";
- if(Sex == 0) mes "Ms. ^0000cc" + strcharinfo(0) + "^000000.......";
- next;
- mes "[Chief Mahnsoo]";
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Merchant.";
- if(SkillPoint > 0) close;
-
- mes "WELL DONE! Well done indeed!! I just read Wharehouse Manager Kays' evaluation of your performance, and I was very impressed. I have great news for you!";
- next;
- if(job_merchant_q == 2) goto L_MemFee;
-
- mes "[Chief Mahnsoo]";
- mes "Because of your HARD work, The Merchant Guild as decided to ACCEPT YOU as one of its members!";
- next;
- callfunc "Job_Change",Job_Merchant;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
-
- mes "[Chief Mahnsoo]";
- mes "Congratulations! You are now one of us, A PROUD MERCHANT!!";
- emotion e_no1;
- next;
- mes "[Chief Mahnsoo]";
- mes "I am very pleased that you decided to join the Merchant Guild and I hope you will play an active role in Rune Midgards' economy! The best of luck to you!!";
- if((job_merchant_q2==7) || (job_merchant_q2==8)) goto L_Favor;
- close;
-
- L_Favor:
- next;
- mes "[Chief Mahnsoo]";
- mes "(Oh, here is a little something for Delivering the Message for me. Thanks very much)";
- set Zeny,Zeny+100;
- close;
-
- L_MemFee:
- mes "[Chief Mahnsoo]";
- mes "Um... before I go on... there was the little issue of the Membership Fee if you recall. I will need the rest of it before I can proceed with your initiation.";
- emotion e_hmm;
- next;
- menu "Pay the remaining 500 Zeny",sM_1a,"...(run away!)...",sM_1b;
-
- sM_1a:
- if(Zeny < 500) goto sL_NotEnough;
- set Zeny,Zeny-500;
- set job_merchant_q,1;
-
- mes "[Chief Mahnsoo]";
- mes "Very good! Now I can go on. Now where was I?..... oh yes, I remember.....";
- goto L_MakeMerc;
-
- sL_NotEnough:
- mes "[Chief Mahnsoo]";
- mes "Eh em.... you seem to be a little short. Now that you've come this far, don't let a little fee impede your progress. Go forth and do something about it!";
- emotion e_swt;
- close;
-
- sM_1b:
- mes "[Chief Mahnsoo]";
- mes "WHAT THE??? Hey come back here! YOU STILL HAVE TO PAY THE FEE!!!!!";
- emotion e_swt2;
- close;
-
-L_Failed:
- set job_merchant_q2,0;
- set job_merchant_q3,0;
-
- mes "I just finished reading Wharehouse Manager Kays' evalutation of your work......";
- next;
- mes "[Chief Mahnsoo]";
- mes "What a shame, what a shame! HOW could you be so CARLESS??!! I'm sure Wharehouse Manager Kay has already given you an earfull so I will not go on with anymore critizism.";
- emotion e_pif;
- next;
- mes "[Chief Mahnsoo]";
- mes "^ff0000"+strcharinfo(0) + "^000000, you have failed in the Merchant License Test! However...... if you are TRUELY interested in becoming a Merchant, and will work EXTREMELY HARD to do so....";
- next;
- mes "[Chief Mahnsoo]";
- mes "... I will allow you to retake the test. What do you say?";
- next;
- menu "Thank you very much for this opportunity!",M_Thanks,"Maybe some other time",M_NoThanks;
-
- M_Thanks:
- set job_merchant_q2,0;
- set job_merchant_q3,0;
- goto L_Cont0;
-
- M_NoThanks:
- mes "[Chief Mahnsoo]";
- mes "Remeber these words: In life, failure is NOT an option!!!";
- emotion e_gasp;
- set job_merchant_q,0;
- set job_merchant_q2,0;
- set job_merchant_q3,0;
- close;
-
-}
-
-
-// -- Wharehouse Manager Kay --
-alberta_in.gat,28,29,2 script Merchant Guildsman 83,{
- if(BaseJob == Job_Novice && job_merchant_q3 > 0) goto L_Check;
-
- mes "[Wharehouse Manager Kay]";
- mes "Hey~ What brings you here?";
- next;
- menu "I came here for the Merchant Test.",M_0,"I came here for a Part Time job.",M_1,"Nope,Nothing.",M_End;
-
- M_0:
- mes "[Wharehouse Manager Kay]";
- if(BaseJob != Job_Novice) goto L_NotNov;
- if(job_merchant_q==0) goto L_NotRdy;
- mes "You're ^0000cc"+ strcharinfo(0) +"^000000, right? Ok I'll give you a product to deliver. First I'll need the destination";
- next;
- menu "Prontera.",sM_0,"Geffen.",sM_1,"Morroc.",sM_2,"Byalan Island(Izlude).",sM_3;
-
- sM_0:
- set @s_flag,1;
- goto L_Cont0;
- sM_1:
- set @s_flag,2;
- goto L_Cont0;
- sM_2:
- set @s_flag,3;
- goto L_Cont0;
- sM_3:
- set @s_flag,4;
-
- L_Cont0:
- mes "[Wharehouse Manager Kay]";
- mes "Now, I'll need the Serial Number of the product. Just type it in the box. If you want to Cancel, just type '0' in the box, alright?";
- next;
- input @input;
- if(@input ==0 ) goto sL_Cancel;
- if((@input < 1000000) || (@input > 5000000)) goto sL_Error;
-
- mes "[Wharehouse Manager Kay]";
- if(@s_flag==1) mes "Destination is Prontera. The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
- if(@s_flag==2) mes "Destination is Geffen. Phew~ Really far from here~ A little unlucky there huh? The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
- if(@s_flag==3) mes "Destination is Morroc. Phew~ Really far from here~ A little unlucky there huh? The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
- if(@s_flag==4) mes "Destination is Byalan. The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
- next;
- menu "Positive.",sM_Pos,"Negative.",sM_Neg;
-
- sM_Pos:
- if(@s_flag==1 && @input==2485741 && job_merchant_q2 == 1) goto ssL_Prod1;
- if(@s_flag==2 && @input==2989396 && job_merchant_q2 == 3) goto ssL_Prod1;
- if(@s_flag==3 && @input==3012685 && job_merchant_q2 == 5) goto ssL_Prod1;
- if(@s_flag==4 && @input==3318702 && job_merchant_q2 == 7) goto ssL_Prod1;
- if(@s_flag==1 && @input==2328137 && job_merchant_q2 == 2) goto ssL_Prod2;
- if(@s_flag==2 && @input==2191737 && job_merchant_q2 == 4) goto ssL_Prod2;
- if(@s_flag==3 && @input==3487372 && job_merchant_q2 == 6) goto ssL_Prod2;
- if(@s_flag==4 && @input==3543625 && job_merchant_q2 == 8) goto ssL_Prod2;
- getitem 1083,1;//Items: Delivery_Box__,
- goto L_Cont1;
-
- ssL_Prod1:
- getitem 1081,1;//Items: Delivery_Box,
- goto L_Cont1;
-
- ssL_Prod2:
- getitem 1082,1;//Items: Delivery_Box_,
- goto L_Cont1;
-
- sM_Neg:
- close;
-
- sL_Cancel:
- mes "[Wharehouse Manager Kay]";
- mes "Are you sure that you wanna cancel?";
- next;
- menu "Oh yes.",m_yes,"No way.",m_no;
-
- m_yes:
- mes "[Wharehouse Manager Kay]";
- mes "Do as you wish~I cancel~";
- close;
- m_no:
- next;
- goto L_Cont0;
-
- sL_Error:
- mes "[Wharehouse Manager Kay]";
- mes "Hey~ Hey~ That number is out of the valid Serial number range. A valid Serial number should be betwwen 1000000 and 5000000.";
- next;
- goto L_Cont0;
-
-
- L_Cont1:
- mes "[Wharehouse Manager Kay]";
- mes "Be very carefull with this product and make sure you do not loose it. It cannot be replaced. If you do loose it you will not be able to become a Merchant.";
- next;
- mes "[Wharehouse Manager Kay]";
- mes "After you've made the delivery be sure to get a Receipt. Good luck!";
- set job_merchant_q3, 1;
- close;
-
- L_NotRdy:
- mes "Speak with the chief about that";
- close;
-
- L_NotNov:
- mes "I'm sorry but only novices are allowed to take the Merchant License Test.";
- close;
-
- M_1:
- mes "[Wharehouse Manager Kay]";
- mes "Part Time job? Nothing is available right now. We're currently in a budget crisis and can't afford to hire any new employees.";
- close;
- M_End:
- mes "[Wharehouse Manager Kay]";
- mes "...? Huh..? Huh..? What..?";
- close;
-
-L_Check:
- if( job_merchant_q3 == 4) goto L_Done;
- mes "[Wharehouse Manager Kay]";
- if(job_merchant_q3 == 1) goto L_Back;
- if(job_merchant_q3 == 5) goto L_Failed;
- if((job_merchant_q3 == 2) && (countitem(1083) ==1)) goto L_WrongProd;//Items: Delivery_Box__,
-
- mes "I see your back ^0000cc"+ strcharinfo(0) +"^000000. I hope things went well. Lets see.... you were supposed to deliver a product to a....";
- next;
- mes "[Wharehouse Manager Kay]";
- if((countitem(1073) == 1) || (countitem(1074) == 1)) goto L_0;//Items: Voucher, Voucher_,
- if((countitem(1075) == 1) || (countitem(1076) == 1)) goto L_1;//Items: Voucher__, Voucher___,
- if((countitem(1077) == 1) || (countitem(1078) == 1)) goto L_2;//Items: Voucher____, Voucher_____,
- if((countitem(1079) == 1) || (countitem(1080) == 1)) goto L_3;//Items: Voucher______, Voucher_______,
- goto L_LostRecpt;
-
- L_0:
- mes "...Kafra employee in Prontera. And indeed the receipt veryifies that the delivery was successfully made.";
- if(countitem(1073) == 1) delitem 1073,1;//Items: Voucher,
- if(countitem(1074) == 1) delitem 1074,1;//Items: Voucher_,
- next;
- goto L_Done;
-
- L_1:
- mes "...member of the Geffen Magic Academy. And indeed the receipt veryifies that the delivery was successfully made";
- if(countitem(1075) == 1) delitem 1075,1;//Items: Voucher__,
- if(countitem(1076) == 1) delitem 1076,1;//Items: Voucher___,
- next;
- goto L_Done;
-
- L_2:
- mes "...Dyermaker in Morroc. And indeed the receipt veryifies that the delivery was successfully made.";
- if(countitem(1077) == 1) delitem 1077,1;//Items: Voucher____,
- if(countitem(1078) == 1) delitem 1078,1;//Items: Voucher_____,
- next;
- goto L_Done;
-
- L_3:
- mes "...Kafra employee in Byalan. And indeed the receipt veryifies that the delivery was successfully made.";
- if(countitem(1079) == 1) delitem 1079,1;//Items: Voucher______,
- if(countitem(1080) == 1) delitem 1080,1;//Items: Voucher_______,
- next;
-
- L_Done:
- mes "[Wharehouse Manager Kay]";
- mes "Great! Everything went perfectly! I will send my evaluation of your performance to 'Chief Mahnsoo' imiediately.";
- mes "Go ahead and speak with Chief Mahnsoo so that he can finalize the process to make you a Merchant.";
- emotion e_no1;
- set job_merchant_q3,4;
- close;
- L_LostRecpt:
- mes "Lets see here...... you say you delivered the correct Product to the correct person...... but you have no reciept.....";
- next;
- mes "[Wharehouse Manager Kay]";
- mes "YOU HAVE NO RECIEPT?????";
- emotion e_omg;
- next;
- mes "[Wharehouse Manager Kay]";
- mes "HOW the HECK am I gonna know that you delievered it then? This was an ABSOLUTE FAILURE!!";
- mes "Your evaluation is not going to look good. I suggest you find some good excuses by the time you speak with Chief Mahnsoo.";
- emotion e_pif;
- set job_merchant_q3,5;
- close;
- L_WrongProd:
- mes "You delivered the WRONG PRODUCT??? DO YOU know how much TIME you've WASTED???? UCK! This was a total failure!";
- emotion e_an;
- next;
- mes "[Wharehouse Manager Kay]";
- mes "Your evaluation is not going to look good. I suggest you find some good excuses when you go to speak with Chief Mahnsoo.";
- delitem 1083, 1;//Items: Delivery_Box__,
- set job_merchant_q3,5;
- close;
- L_Failed:
- mes "Go speak to the Chief about your failure........";
- close;
-
-L_Back:
- if((countitem(1081) != 1) && (countitem(1082) != 1) && (countitem(1083) != 1)) goto L_LostProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
- mes "Huh? Back so soon? Don't tell me you ran into problems already....";
- emotion e_hmm;
- next;
- menu "Please Exchange the Product.",M_Exch,"Nope, never mind.",M_Nvmnd;
-
- M_Exch:
- mes "[Wharehouse Manager Kay]";
- mes "Sigh... this is not a good way to start your test you know. Make sure you get the RIGHT Product this time! ";
- emotion e_pif;
- if(countitem(1081) ==1) delitem 1081,1;//Items: Delivery_Box,
- if(countitem(1082) ==1) delitem 1082,1;//Items: Delivery_Box_,
- if(countitem(1083) ==1) delitem 1083,1;//Items: Delivery_Box__,
- set job_merchant_q3,0;
- next;
- goto M_0;
-
- M_Nvmnd:
- close;
-
- L_LostProd:
- mes "Huh? Oh~ How was the Trip?";
- next;
- mes "[Wharehouse Manager Kay]";
- mes "WHAT???";
- emotion e_what;
- next;
- mes "[Wharehouse Manager Kay]";
- mes "Holy crap!! YOU LOST the product??!! What have you done, you moron!!!";
- emotion e_omg;
- next;
- mes "[Wharehouse Manager Kay]";
- mes "Your evaluation is not going to look good. I suggest you find some good excuses when you go to speak with Chief Mahnsoo.";
- emotion e_ag;
- set job_merchant_q3,5;
- close;
-
-}
-
-
-
-// == Customers ==
-// -- Kafra(Byalan) --
-function script F_MercKafra {
-
- if (job_merchant_q3 == 3) goto L_3;
-
- mes "[Kafra]";
- if(job_merchant_q3 ==2) goto L_WrongProd;
- mes "A delivery from the Merchant Guild?? Oh, Right! Yes! I almost forgot.";
- next;
- mes "[Kafra]";
- mes "Let's see, the serial number for the product should be.......";
- next;
- mes "[Kafra]";
- if((countitem(1081) ==0) && (countitem(1082) ==0) && (countitem(1083) ==0)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
- if((job_merchant_q2 !=7) && (job_merchant_q2 !=8)) goto L_WrongDest;
- if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
-
- mes "Oh, here it is. Yes! This is the one we ordered. Thank you very much. Here is your receipt.";
- next;
-
- set job_merchant_q3, 3;
- if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
- if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
-
- L_0:
- getitem 1079,1;//Items: Voucher______,
- delitem 1081,1;//Items: Delivery_Box,
- goto L_3;
-
- L_1:
- getitem 1080,1;//Items: Voucher_______,
- delitem 1082,1;//Items: Delivery_Box_,
- goto L_3;
-
- L_3:
- if(countitem(1072) == 1) goto L_Msg;//Items: Delivery_Message,
- mes "[Kafra]";
- mes "Thanks so much for comming all this way to deliver the product to me. Take care now. By bye.";
- emotion e_thx;
- cutin "kafra_03",255;
- close;
-
- L_Msg:
- mes "[Kafra]";
- mes "Oh,My good Lord! Mr. Mansoo wrote me a Letter? Thank you, Thank you~";
- mes "I though he would send one, one of these days, but I've never expected it would be at a time like this.....";
- emotion e_what;
- next;
- mes "[Kafra]";
- mes "I really appreciate what you've done for me. Here is a small gift to show you my thanks.";
- emotion e_thx;
- delitem 1072,1;//Items: Delivery_Message,
- set @TEMP,rand(2);
- if(@TEMP !=0) goto R1;
-
- R0:
-
- getitem 513,3;//Items: Banana,
- cutin "kafra_03",255;
- close;
- R1:
- getitem 512,3;//Items: Apple,
- cutin "kafra_03",255;
- close;
-
-L_NoProd:
- mes ".... I thought we what we ordered was OVERSIZED and HEAVY.... but.... you seem to carry it on without any difficulty.........";
- emotion e_what;
- cutin "kafra_03",255;
- close;
-
-L_WrongProd:
- mes "......? Excuse me! I think you gave me the wrong item. Our order should have the serial number 3318702 or 3543625...";
- emotion e_swt;
- set job_merchant_q3,2;
- cutin "kafra_03",255;
- close;
-
-L_WrongDest:
- mes "......? Excuse me.... I think you have the wrong person.... our order should have the serial number 3318702 or 3543625...";
- emotion e_swt;
- cutin "kafra_03",255;
- close;
-}
-
-// -- Kafra(Prontera) --
-prontera.gat,248,42,8 script Kafra#01 115,{
- cutin "kafra_03",2;
- if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
-L_Other:
- mes "[Kafra]";
- mes "Hello. I am a Kafra Service Agent. As you can see, the ^3355FFSwordsman Association^000000 has moved to Izlude.";
- mes "I can warp you there for a small fee of 600 zeny however.";
- next;
- menu "Warp.",M_Warp, "Cancel.",M_End;
-
- M_Warp:
- if(Zeny < 600) goto sL_NdZeny;
- set Zeny, Zeny - 600;
- set RESRVPTS, RESRVPTS + 37;
- warp "izlude.gat",91,105;
- cutin "kafra_03",255;
- end;
-
- sL_NdZeny:
- mes "[Kafra]";
- mes "I'm sorry but you do not have enough zeny.";
- cutin "kafra_03",255;
- close;
-
- M_Pass:
- if(countitem(1084)<1) goto sL_NdPass;//Items: Kafra_Pass,
- mes "[Kafra]";
- mes "You are now using a Kafra Pass.";
- delitem 1084,1;//Items: Kafra_Pass,
- cutin "kafra_03",255;
- close;
-
- sL_NdPass:
- mes "[Kafra]";
- mes "I'm sorry but you have no pass....";
- cutin "kafra_03",255;
- close;
- M_End:
- mes "[Kafra]";
- mes "Thank you for using Kafra Corp. Services. We will be with you wherever you go.";
- emotion e_thx;
- cutin "kafra_03",255;
- close;
-
-
-L_Start:
- if(job_merchant_q3 ==3) goto L_3;
- mes "[Kafra]";
- if(job_merchant_q3 ==2) goto L_WrongProd;
-
- mes "Oh, you're from the Merchant Guild and you have a delivery for me?";
- mes "I really appreciate you comming all this way..........";
- next;
- mes "[Kafra]";
-
- if((countitem(1081) ==0) && (countitem(1082) ==0) && (countitem(1083) ==0)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
- if((job_merchant_q2 !=1) && (job_merchant_q2 !=2)) goto L_WrongDest;
- if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
-
- mes "Yes! This is the Product we ordered. Thank you. Here, let me give you a Receipt.";
- next;
-
- set job_merchant_q3,3;
- if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
- if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
-
- L_0:
- getitem 1073,1;//Items: Voucher,
- delitem 1081,1;//Items: Delivery_Box,
- goto L_3;
-
- L_1:
- getitem 1074,1;//Items: Voucher_,
- delitem 1082,1;//Items: Delivery_Box_,
- goto L_3;
-
- L_3:
- mes "[Kafra]";
- mes "Thank you again for the delivery.";
- emotion e_thx;
- cutin "kafra_03",255;
- close;
-
-L_NoProd:
- mes "Umm......... excuse me... but where is the Product your supposed to give me....?";
- emotion e_hmm;
- cutin "kafra_03",255;
- close;
-
-L_WrongProd:
- mes "Oh, Dear... this isn't what I ordered. It should have a serial number of either ^ff00002485741 or 2328137^000000.";
- mes "It looks like there was a mix up at the wharehouse and you got the wrong product. I'd appreciate it if you could sort this out.";
- emotion e_swt;
- set job_merchant_q3,2;
- cutin "kafra_03",255;
- close;
-
-L_WrongDest:
- mes "Oh, Dear... this isn't what I ordered. You see here, it's addressed to someone else. It looks like this Product is supposed to go to someone else.";
- emotion e_swt;
- cutin "kafra_03",255;
- close;
-}
-
-
-// == Other Npcs ==
-// -- Guild Staff --
-geffen_in.gat,155,122,4 script Guild Staff 47,{
-
- if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
-L_Other:
- mes "[Guild Staff]";
- mes "It should be arriving any time now...... it seems to be late.... Hmm...";
- close;
-
-L_Start:
- if(job_merchant_q3 ==3) goto L_3;
- mes "[Guild Staff]";
- if(job_merchant_q3 ==2) goto L_WrongProd;
-
- mes "Oh hi there. You're from the Merchant Guild you say? That means.........";
- next;
- mes "[Guild Staff]";
- mes "WOW! IT'S HERE! It's here!! They FINALLY sent the Box!...... ";
- next;
- mes "[Guild Staff]";
- mes "Oh excuse me, I'm so sorry. You must be very tired from having to travel in such hot weather. My thanks for your effort.";
- next;
- mes "[Guild Staff]";
- mes "Alright, let me just ckeck the Serial Number to make sure.........";
- next;
- mes "[Guild Staff]";
- if((countitem(1081) !=1) && (countitem(1082) !=1) && (countitem(1083) !=1)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
- if((job_merchant_q2 !=3) && (job_merchant_q2 !=4)) goto L_WrongDest;
- if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
-
- mes "YES! This is it! Here, let me give you a Receipt.";
- next;
- set job_merchant_q3,3;
- if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
- if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
-
- L_0:
- getitem 1075,1;//Items: Voucher__,
- delitem 1081,1;//Items: Delivery_Box,
- goto L_3;
-
- L_1:
- getitem 1076,1;//Items: Voucher___,
- delitem 1082,1;//Items: Delivery_Box_,
- goto L_3;
-
- L_3:
- mes "[Guild Staff]";
- mes "Heheh~ Thank you, Bye Bye.";
- emotion e_thx;
- close;
-L_NoProd:
- mes "Huh? Where? Where is the Box?";
- emotion e_what;
- close;
-
-L_WrongDest:
- mes "Hey wait a Minute! This is not what we ordered! The Serial Number should either be 2989396 or 2191737.";
- mes "It looks like this is addressed to someone else. I think you got the wrong delivery destination.";
- emotion e_swt2;
- close;
-
-L_WrongProd:
- mes "Hey wait a Minute! This is not what we ordered! The Serial Number should either be 2989396 or 2191737.";
- mes "I don't know how you could make this mistake but please correct it. I really need that Product.";
- emotion e_swt2;
- set job_merchant_q3,2;
- close;
-}
-
-
-// -- Dyer's Student --
-morocc_in.gat,140,102,4 script Dyer's Student 86,{
- if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
-
-L_Other:
- mes "[Dyer's Student]";
- mes "Mr. JavaDullihan is one and Only the Best in Midgard continent.";
- mes "Aaaand I am his Student!! How proude of I am!!!!";
- next;
- mes "[Dyer's Student]";
- mes ".....That's what I am saying..";
- close;
-
-L_Start:
- if(job_merchant_q3 ==3) goto L_3;
- mes "[Dyer's Student]";
- if(job_merchant_q3 ==2) goto L_WrongProd;
-
- mes "You're from the Merchant Guild...? Ah, Yes! I've been expecting you.";
- next;
- mes "[Dyer's Student]";
- mes "Let me check the Serial Number of the Product just to make sure.......";
- next;
- mes "[Dyer's Student]";
- if((countitem(1081) !=1) && (countitem(1082) !=1) && (countitem(1083) !=1)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
- if((job_merchant_q2 !=5) && (job_merchant_q2 !=6)) goto L_WrongDest;
- if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
-
- mes "Great! This is what we ordered. Here, let me give you a Receipt.";
- set job_merchant_q3,3;
- if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
- if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
-
- L_0:
- getitem 1077,1;//Items: Voucher____,
- delitem 1081,1;//Items: Delivery_Box,
- goto L_3;
-
- L_1:
- getitem 1078,1;//Items: Voucher_____,
- delitem 1082,1;//Items: Delivery_Box_,
- goto L_3;
-
- L_3:
- mes "[Dyer's Student]";
- mes "Thank you, See you next time~";
- emotion e_thx;
- close;
-
-L_NoProd:
- mes "But where's the Product?";
- emotion e_hmm;
- close;
-
-L_WrongProd:
- mes "Um..... excuse me? I don't think this is what we ordered? The Serial Number should be either 3012685 or 3487372.";
- emotion e_hmm;
- next;
- mes "[Dyer's Student]";
- mes "I see. There was a mix up at the wharehouse and you got the wrong product.";
- next;
- mes "[Dyer's Student]";
- mes "Well this sucks. Please come back with the correct Product.";
- emotion e_pif;
- set job_merchant_q3,2;
- close;
-
-L_WrongDest:
- mes "Um.... excuse me? I don't think this is what we ordered? The Serial Number should be either 3012685 or 3487372.";
- mes "I think you have the wrong delivery destination. Maybe you should try someone else.";
- emotion e_hmm;
- close;
-
-
-}
+//===== eAthena Script =======================================
+//= Merchant Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Added instant job change for High Novice [Lupus]
+//= v1.3 Added Baby Class support [Lupus]
+//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= 1.5 Changed Prontera->Izlude teleport price to 600 [Lupus]
+//= 1.5.1 Removed Duplicates [Silent]
+//= 1.5.2 Now saves/restores all quest skills [Lupus]
+//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
+//============================================================
+
+
+// == Guild NPCs ==
+// -- Mahnsoo --
+alberta_in.gat,53,43,6 script Chief Mahnsoo 86,{
+ callfunc "F_ToHigh",Job_Merchant_High,"Merchant High",Job_Whitesmith,"Chief Mahnsoo";
+ mes "[Chief Mahnsoo]";
+ if(BaseJob == Job_Novice && job_merchant_q3 == 4) goto L_MakeMerc;
+ if(BaseJob == Job_Novice && job_merchant_q3 == 3) goto L_GiveRecpt;
+ if(BaseJob == Job_Novice && job_merchant_q3 == 5) goto L_Failed;
+ if(BaseJob == Job_Novice && job_merchant_q2 > 0) goto L_Back;
+
+ mes "What brings you here? Something on your mind?";
+M_Menu:
+ next;
+ menu "I want to be a Merchant.",M_0,"What exactly is a Merchant?",M_1,"Give me the Requirements.",M_2,"End.",M_End;
+
+ M_0:
+
+ if(BaseJob == Job_Merchant) {
+ mes "[Chief Mahnsoo]";
+ mes "Huh? What did you say? You noodle head! Take a good look at yourself. Your ALREADY A MERCHANT! Good lord!";
+ emotion e_what;
+ emotion e_gasp;
+ close;
+ }
+ if(BaseJob != Job_Novice) {
+ mes "[Chief Mahnsoo]";
+ mes "We Merchants really don't like people who work during the day, and then go out to crazy bars at night. When it comes to money, for them it's 'easy come easy go.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Well.. I talked a little too long, I guess... but since you already have an occupation, we don't need you.";
+ close;
+ }
+ if(JobLevel < 10) {
+ mes "[Chief Mahnsoo]";
+ mes "I'm sorry but you have to have a Novice Job level of 9 with all 9 of the basic Skills.";
+ close;
+ }
+ mes "[Chief Mahnsoo]";
+ mes "A Merchant you say? Well...";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Alright. First fill out an application form and submit 1000 Zeny for the Memebership Fee.";
+ mes "If you don't have enough money right now, you can pay 500 Zeny first and then pay the rest later after you've passed the Merchant License Test.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "How does that sound? Are you still interested?";
+
+ next;
+ menu "Sure why not. Who needs college anyways.",sM_0a,"Maybe, later...",sM_0b;
+
+ sM_0a:
+ mes "[Chief Mahnsoo]";
+ mes "I'm glad to hear that. So how do you wish to pay the Membership Fee?";
+ sM_Menu:
+ next;
+ menu "Pay 1000 Zeny Now.",m_0a,"2 payments of 500 Zeny.",m_0b,"Nevermind.",m_0End;
+
+ m_0a:
+ mes "[Chief Mahnsoo]";
+ if(Zeny < 1000) goto sl_Short1k;
+ set Zeny,Zeny-1000;
+ set job_merchant_q,1;
+ mes "Let's see... 1000 Zeny.... Good.";
+ goto L_Cont0;
+
+ sl_Short1k:
+ mes "Looks like your a little short on zeny. Why not make a minimal payment of 500 Zeny first?";
+ mes "You can worry about the rest later.";
+ emotion e_swt;
+ goto sM_Menu;
+ close;
+
+ m_0b:
+ mes "[Chief Mahnsoo]";
+ if(Zeny < 500) goto sl_Short500z;
+ set Zeny,Zeny-500;
+ set job_merchant_q,2;
+ mes "Let's See... 500 Zeny.... Good enough to start off... though I don't really think splitting paymenst is a good habbit for any Merchant.";
+ goto L_Cont0;
+
+ sl_Short500z:
+ mes "Looks like your a little short on zeny. Come back when you have enough.";
+ emotion e_swt;
+ close;
+
+ m_0End:
+ mes "[Chief Mahnsoo]";
+ mes "You have no money now? Ok, No Problem. Take your time, Ok?";
+ close;
+
+ sM_0b:
+ mes "[Chief Mahnsoo]";
+ mes "Feel free to return anytime when you are ready, Alright?.";
+ close;
+
+
+ L_Cont0:
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Now that that's settled, let me talk to you about the Merchant License Test. You will be given a task to fullfill.";
+ mes "How well you perform the task will determine whether or not you will become a merchant.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Oh, but before we get started I must say one thing.....";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "There are some dumb and greedy people out there who do not know what it means to be a Merchant.";
+ mes "I sincerely hope you will not turn out to be like them. You won't... will you??..... (stares at you intently)";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Anywho, here is your task. You will need to....";
+ next;
+ mes "[Chief Mahnsoo]";
+
+ set @TEMP,rand(4);
+ if(@TEMP ==1) goto R_1;
+ if(@TEMP ==2) goto R_2;
+ if(@TEMP ==3) goto R_3;
+
+ R_0:
+ mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to the ^00aa00Kafra Worker in the Former Swordman Association in Prontera^000000.";
+ if(job_merchant_q2 == 1) goto sR_0a;
+ if(job_merchant_q2 == 2) goto sR_0b;
+ set @TEMP,rand(2);
+ if(@TEMP !=0) goto sR_0b;
+
+ sR_0a:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002485741^000000.";
+ set job_merchant_q2, 1;
+ next;
+ goto L_Cont1;
+ sR_0b:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002328137^000000.";
+ set job_merchant_q2, 2;
+ next;
+ goto L_Cont1;
+
+ R_1:
+ mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to a member of the ^00aa00Mage Guild in Geffen^000000.";
+ next;
+ mes "[Chief Mahnsoo]";
+ if(job_merchant_q2 == 3) goto sR_1a;
+ if(job_merchant_q2 == 4) goto sR_1b;
+ set @TEMP,rand(2);
+ if(@TEMP !=0) goto sR_1b;
+
+ sR_1a:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002989396^000000.";
+ set job_merchant_q2, 3;
+ next;
+ goto L_Cont1;
+ sR_1b:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00002191737^000000.";
+ set job_merchant_q2, 4;
+ next;
+ goto L_Cont1;
+
+ R_2:
+ mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to ^00aa00Java Dullihan, the Dyermaker in Morroc^000000.";
+ next;
+ mes "[Chief Mahnsoo]";
+ if(job_merchant_q2 == 5) goto sR_2a;
+ if(job_merchant_q2 == 6) goto sR_2b;
+ set @TEMP,rand(2);
+ if(@TEMP !=0) goto sR_2b;
+
+ sR_2a:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003012685^000000.";
+ set job_merchant_q2,5;
+ next;
+ goto L_Cont1;
+ sR_2b:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003487372^000000.";
+ set job_merchant_q2,6;
+ next;
+ goto L_Cont1;
+
+ R_3:
+ mes "retrieve a ^ff0000product^000000 from the ^0000ffWharehouse^000000 and deliver it to the ^00aa00Kafra worker in Byalan island^000000.";
+ next;
+ mes "[Chief Mahnsoo]";
+ if(job_merchant_q2 == 7) goto sR_3a;
+ if(job_merchant_q2 == 8) goto sR_3b;
+ set @TEMP,rand(2);
+ if(@TEMP !=0) goto sR_3b;
+
+ sR_3a:
+
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003318702^000000.";
+ set job_merchant_q2,7;
+ goto M00R3;
+ sR_3b:
+ mes "The ^0000ff'Serial Number'^000000 of the product is ^ff00003543625^000000.";
+ set job_merchant_q2,8;
+ goto M00R3;
+
+ M00R3:
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Umm and... this is my personal request. Include this message in your delivery please~";
+ if(countitem(1072)==0) getitem 1072,1;//Items: Delivery_Message,
+ next;
+ goto L_Cont1;
+
+
+ L_Cont1:
+ mes "[Chief Mahnsoo]";
+ mes "Keep track of the ^ff0000'Serial Number'^000000 and the ^ff0000'Destination'^000000 of the product.";
+ mes "The Wharehouse Manager will need them to assist you in getting the right product.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "The Wharehouse itself is located to my right.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "After you've finished making the delivery come back here and give the Receipt to the Wharehouse Manager. Then come see me. Is that clear?";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Alright, good luck!";
+ close;
+
+ M_1:
+ mes "[Chief Mahnsoo]";
+ mes "Merchants are people who are in the business of buying and selling goods. We focus on finding rare items and selling them to those who desire or need them.";
+ mes "We are not particularly good at fighting nor do we have any usefull support skills. What we Merchants can do is buy Goods at lower prices as well as sell them at Highter prices.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "As far as what weapons go, we can use most of them. Bows, Rods, and Two-Handed Swords are the only types of weapons we can't use.";
+ mes "The skill Mannomite even lets us use zeny as a weapon.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Whatever people may say about us, making money is important to a merchants lively hood.";
+ goto M_Menu;
+ close;
+
+ M_2:
+ mes "[Chief Mahnsoo]";
+ mes "There are three conditions to be qualified if you want to be a Merchant.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "First of all, You have to be at Novice job level 9 with fulfilled Basic Skills.";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Secondly, You have to pay 1000 Zeny for acquire a Memebrship. I believe a Merchant Candidate will be able to earn 1000 Zeny at ease. Oh yeah~";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Third, There is a License Test to examine your basic Physical Strength and a Sense of Direction. You must Deliever the Goods to the Specific person in the Specific Town.";
+ goto M_Menu;
+ close;
+
+ M_End:
+ close;
+
+L_GiveRecpt:
+ mes "Ah, " + strcharinfo(0) + ". You're back! I take it things went well? Tell you what, go give the Receipt to the Storekeeper and then hurry back here ok.";
+ close;
+
+L_Back:
+ mes "What are you doing back here?";
+ emotion e_what;
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "You didn't leave yet?";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "You are supposed to be on your way by now. Don't tell me you already forgot the product number and destination?";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "Alright numskull, do you want me to repeat it to you one more time?";
+ next;
+ menu "Yes please", M_Yes,"Never mind.",M_No;
+
+ M_Yes:
+ mes "[Chief Mahnsoo]";
+ if((job_merchant_q2==1) || (job_merchant_q2==2)) goto R_0;
+ if((job_merchant_q2==3) || (job_merchant_q2==4)) goto R_1;
+ if((job_merchant_q2==5) || (job_merchant_q2==6)) goto R_2;
+ if((job_merchant_q2==7) || (job_merchant_q2==8)) goto R_3;
+ close;
+
+ M_No:
+ close;
+
+L_MakeMerc:
+ if(Sex == 1) mes "Mr. ^0000cc" + strcharinfo(0) + "^000000.....";
+ if(Sex == 0) mes "Ms. ^0000cc" + strcharinfo(0) + "^000000.......";
+ next;
+ mes "[Chief Mahnsoo]";
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Merchant.";
+ if(SkillPoint > 0) close;
+
+ mes "WELL DONE! Well done indeed!! I just read Wharehouse Manager Kays' evaluation of your performance, and I was very impressed. I have great news for you!";
+ next;
+ if(job_merchant_q == 2) goto L_MemFee;
+
+ mes "[Chief Mahnsoo]";
+ mes "Because of your HARD work, The Merchant Guild as decided to ACCEPT YOU as one of its members!";
+ next;
+ callfunc "Job_Change",Job_Merchant;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+
+ mes "[Chief Mahnsoo]";
+ mes "Congratulations! You are now one of us, A PROUD MERCHANT!!";
+ emotion e_no1;
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "I am very pleased that you decided to join the Merchant Guild and I hope you will play an active role in Rune Midgards' economy! The best of luck to you!!";
+ if((job_merchant_q2==7) || (job_merchant_q2==8)) goto L_Favor;
+ close;
+
+ L_Favor:
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "(Oh, here is a little something for Delivering the Message for me. Thanks very much)";
+ set Zeny,Zeny+100;
+ close;
+
+ L_MemFee:
+ mes "[Chief Mahnsoo]";
+ mes "Um... before I go on... there was the little issue of the Membership Fee if you recall. I will need the rest of it before I can proceed with your initiation.";
+ emotion e_hmm;
+ next;
+ menu "Pay the remaining 500 Zeny",sM_1a,"...(run away!)...",sM_1b;
+
+ sM_1a:
+ if(Zeny < 500) goto sL_NotEnough;
+ set Zeny,Zeny-500;
+ set job_merchant_q,1;
+
+ mes "[Chief Mahnsoo]";
+ mes "Very good! Now I can go on. Now where was I?..... oh yes, I remember.....";
+ goto L_MakeMerc;
+
+ sL_NotEnough:
+ mes "[Chief Mahnsoo]";
+ mes "Eh em.... you seem to be a little short. Now that you've come this far, don't let a little fee impede your progress. Go forth and do something about it!";
+ emotion e_swt;
+ close;
+
+ sM_1b:
+ mes "[Chief Mahnsoo]";
+ mes "WHAT THE??? Hey come back here! YOU STILL HAVE TO PAY THE FEE!!!!!";
+ emotion e_swt2;
+ close;
+
+L_Failed:
+ set job_merchant_q2,0;
+ set job_merchant_q3,0;
+
+ mes "I just finished reading Wharehouse Manager Kays' evalutation of your work......";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "What a shame, what a shame! HOW could you be so CARLESS??!! I'm sure Wharehouse Manager Kay has already given you an earfull so I will not go on with anymore critizism.";
+ emotion e_pif;
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "^ff0000"+strcharinfo(0) + "^000000, you have failed in the Merchant License Test! However...... if you are TRUELY interested in becoming a Merchant, and will work EXTREMELY HARD to do so....";
+ next;
+ mes "[Chief Mahnsoo]";
+ mes "... I will allow you to retake the test. What do you say?";
+ next;
+ menu "Thank you very much for this opportunity!",M_Thanks,"Maybe some other time",M_NoThanks;
+
+ M_Thanks:
+ set job_merchant_q2,0;
+ set job_merchant_q3,0;
+ goto L_Cont0;
+
+ M_NoThanks:
+ mes "[Chief Mahnsoo]";
+ mes "Remeber these words: In life, failure is NOT an option!!!";
+ emotion e_gasp;
+ set job_merchant_q,0;
+ set job_merchant_q2,0;
+ set job_merchant_q3,0;
+ close;
+
+}
+
+
+// -- Wharehouse Manager Kay --
+alberta_in.gat,28,29,2 script Merchant Guildsman 83,{
+ if(BaseJob == Job_Novice && job_merchant_q3 > 0) goto L_Check;
+
+ mes "[Wharehouse Manager Kay]";
+ mes "Hey~ What brings you here?";
+ next;
+ menu "I came here for the Merchant Test.",M_0,"I came here for a Part Time job.",M_1,"Nope,Nothing.",M_End;
+
+ M_0:
+ mes "[Wharehouse Manager Kay]";
+ if(BaseJob != Job_Novice) goto L_NotNov;
+ if(job_merchant_q==0) goto L_NotRdy;
+ mes "You're ^0000cc"+ strcharinfo(0) +"^000000, right? Ok I'll give you a product to deliver. First I'll need the destination";
+ next;
+ menu "Prontera.",sM_0,"Geffen.",sM_1,"Morroc.",sM_2,"Byalan Island(Izlude).",sM_3;
+
+ sM_0:
+ set @s_flag,1;
+ goto L_Cont0;
+ sM_1:
+ set @s_flag,2;
+ goto L_Cont0;
+ sM_2:
+ set @s_flag,3;
+ goto L_Cont0;
+ sM_3:
+ set @s_flag,4;
+
+ L_Cont0:
+ mes "[Wharehouse Manager Kay]";
+ mes "Now, I'll need the Serial Number of the product. Just type it in the box. If you want to Cancel, just type '0' in the box, alright?";
+ next;
+ input @input;
+ if(@input ==0 ) goto sL_Cancel;
+ if((@input < 1000000) || (@input > 5000000)) goto sL_Error;
+
+ mes "[Wharehouse Manager Kay]";
+ if(@s_flag==1) mes "Destination is Prontera. The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
+ if(@s_flag==2) mes "Destination is Geffen. Phew~ Really far from here~ A little unlucky there huh? The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
+ if(@s_flag==3) mes "Destination is Morroc. Phew~ Really far from here~ A little unlucky there huh? The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
+ if(@s_flag==4) mes "Destination is Byalan. The Serial Number is "+@input+" . ^ff0000Is this correct^000000?";
+ next;
+ menu "Positive.",sM_Pos,"Negative.",sM_Neg;
+
+ sM_Pos:
+ if(@s_flag==1 && @input==2485741 && job_merchant_q2 == 1) goto ssL_Prod1;
+ if(@s_flag==2 && @input==2989396 && job_merchant_q2 == 3) goto ssL_Prod1;
+ if(@s_flag==3 && @input==3012685 && job_merchant_q2 == 5) goto ssL_Prod1;
+ if(@s_flag==4 && @input==3318702 && job_merchant_q2 == 7) goto ssL_Prod1;
+ if(@s_flag==1 && @input==2328137 && job_merchant_q2 == 2) goto ssL_Prod2;
+ if(@s_flag==2 && @input==2191737 && job_merchant_q2 == 4) goto ssL_Prod2;
+ if(@s_flag==3 && @input==3487372 && job_merchant_q2 == 6) goto ssL_Prod2;
+ if(@s_flag==4 && @input==3543625 && job_merchant_q2 == 8) goto ssL_Prod2;
+ getitem 1083,1;//Items: Delivery_Box__,
+ goto L_Cont1;
+
+ ssL_Prod1:
+ getitem 1081,1;//Items: Delivery_Box,
+ goto L_Cont1;
+
+ ssL_Prod2:
+ getitem 1082,1;//Items: Delivery_Box_,
+ goto L_Cont1;
+
+ sM_Neg:
+ close;
+
+ sL_Cancel:
+ mes "[Wharehouse Manager Kay]";
+ mes "Are you sure that you wanna cancel?";
+ next;
+ menu "Oh yes.",m_yes,"No way.",m_no;
+
+ m_yes:
+ mes "[Wharehouse Manager Kay]";
+ mes "Do as you wish~I cancel~";
+ close;
+ m_no:
+ next;
+ goto L_Cont0;
+
+ sL_Error:
+ mes "[Wharehouse Manager Kay]";
+ mes "Hey~ Hey~ That number is out of the valid Serial number range. A valid Serial number should be betwwen 1000000 and 5000000.";
+ next;
+ goto L_Cont0;
+
+
+ L_Cont1:
+ mes "[Wharehouse Manager Kay]";
+ mes "Be very carefull with this product and make sure you do not loose it. It cannot be replaced. If you do loose it you will not be able to become a Merchant.";
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "After you've made the delivery be sure to get a Receipt. Good luck!";
+ set job_merchant_q3, 1;
+ close;
+
+ L_NotRdy:
+ mes "Speak with the chief about that";
+ close;
+
+ L_NotNov:
+ mes "I'm sorry but only novices are allowed to take the Merchant License Test.";
+ close;
+
+ M_1:
+ mes "[Wharehouse Manager Kay]";
+ mes "Part Time job? Nothing is available right now. We're currently in a budget crisis and can't afford to hire any new employees.";
+ close;
+ M_End:
+ mes "[Wharehouse Manager Kay]";
+ mes "...? Huh..? Huh..? What..?";
+ close;
+
+L_Check:
+ if( job_merchant_q3 == 4) goto L_Done;
+ mes "[Wharehouse Manager Kay]";
+ if(job_merchant_q3 == 1) goto L_Back;
+ if(job_merchant_q3 == 5) goto L_Failed;
+ if((job_merchant_q3 == 2) && (countitem(1083) ==1)) goto L_WrongProd;//Items: Delivery_Box__,
+
+ mes "I see your back ^0000cc"+ strcharinfo(0) +"^000000. I hope things went well. Lets see.... you were supposed to deliver a product to a....";
+ next;
+ mes "[Wharehouse Manager Kay]";
+ if((countitem(1073) == 1) || (countitem(1074) == 1)) goto L_0;//Items: Voucher, Voucher_,
+ if((countitem(1075) == 1) || (countitem(1076) == 1)) goto L_1;//Items: Voucher__, Voucher___,
+ if((countitem(1077) == 1) || (countitem(1078) == 1)) goto L_2;//Items: Voucher____, Voucher_____,
+ if((countitem(1079) == 1) || (countitem(1080) == 1)) goto L_3;//Items: Voucher______, Voucher_______,
+ goto L_LostRecpt;
+
+ L_0:
+ mes "...Kafra employee in Prontera. And indeed the receipt veryifies that the delivery was successfully made.";
+ if(countitem(1073) == 1) delitem 1073,1;//Items: Voucher,
+ if(countitem(1074) == 1) delitem 1074,1;//Items: Voucher_,
+ next;
+ goto L_Done;
+
+ L_1:
+ mes "...member of the Geffen Magic Academy. And indeed the receipt veryifies that the delivery was successfully made";
+ if(countitem(1075) == 1) delitem 1075,1;//Items: Voucher__,
+ if(countitem(1076) == 1) delitem 1076,1;//Items: Voucher___,
+ next;
+ goto L_Done;
+
+ L_2:
+ mes "...Dyermaker in Morroc. And indeed the receipt veryifies that the delivery was successfully made.";
+ if(countitem(1077) == 1) delitem 1077,1;//Items: Voucher____,
+ if(countitem(1078) == 1) delitem 1078,1;//Items: Voucher_____,
+ next;
+ goto L_Done;
+
+ L_3:
+ mes "...Kafra employee in Byalan. And indeed the receipt veryifies that the delivery was successfully made.";
+ if(countitem(1079) == 1) delitem 1079,1;//Items: Voucher______,
+ if(countitem(1080) == 1) delitem 1080,1;//Items: Voucher_______,
+ next;
+
+ L_Done:
+ mes "[Wharehouse Manager Kay]";
+ mes "Great! Everything went perfectly! I will send my evaluation of your performance to 'Chief Mahnsoo' imiediately.";
+ mes "Go ahead and speak with Chief Mahnsoo so that he can finalize the process to make you a Merchant.";
+ emotion e_no1;
+ set job_merchant_q3,4;
+ close;
+ L_LostRecpt:
+ mes "Lets see here...... you say you delivered the correct Product to the correct person...... but you have no reciept.....";
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "YOU HAVE NO RECIEPT?????";
+ emotion e_omg;
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "HOW the HECK am I gonna know that you delievered it then? This was an ABSOLUTE FAILURE!!";
+ mes "Your evaluation is not going to look good. I suggest you find some good excuses by the time you speak with Chief Mahnsoo.";
+ emotion e_pif;
+ set job_merchant_q3,5;
+ close;
+ L_WrongProd:
+ mes "You delivered the WRONG PRODUCT??? DO YOU know how much TIME you've WASTED???? UCK! This was a total failure!";
+ emotion e_an;
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "Your evaluation is not going to look good. I suggest you find some good excuses when you go to speak with Chief Mahnsoo.";
+ delitem 1083, 1;//Items: Delivery_Box__,
+ set job_merchant_q3,5;
+ close;
+ L_Failed:
+ mes "Go speak to the Chief about your failure........";
+ close;
+
+L_Back:
+ if((countitem(1081) != 1) && (countitem(1082) != 1) && (countitem(1083) != 1)) goto L_LostProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
+ mes "Huh? Back so soon? Don't tell me you ran into problems already....";
+ emotion e_hmm;
+ next;
+ menu "Please Exchange the Product.",M_Exch,"Nope, never mind.",M_Nvmnd;
+
+ M_Exch:
+ mes "[Wharehouse Manager Kay]";
+ mes "Sigh... this is not a good way to start your test you know. Make sure you get the RIGHT Product this time! ";
+ emotion e_pif;
+ if(countitem(1081) ==1) delitem 1081,1;//Items: Delivery_Box,
+ if(countitem(1082) ==1) delitem 1082,1;//Items: Delivery_Box_,
+ if(countitem(1083) ==1) delitem 1083,1;//Items: Delivery_Box__,
+ set job_merchant_q3,0;
+ next;
+ goto M_0;
+
+ M_Nvmnd:
+ close;
+
+ L_LostProd:
+ mes "Huh? Oh~ How was the Trip?";
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "WHAT???";
+ emotion e_what;
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "Holy crap!! YOU LOST the product??!! What have you done, you moron!!!";
+ emotion e_omg;
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "Your evaluation is not going to look good. I suggest you find some good excuses when you go to speak with Chief Mahnsoo.";
+ emotion e_ag;
+ set job_merchant_q3,5;
+ close;
+
+}
+
+
+
+// == Customers ==
+// -- Kafra(Byalan) --
+function script F_MercKafra {
+
+ if (job_merchant_q3 == 3) goto L_3;
+
+ mes "[Kafra]";
+ if(job_merchant_q3 ==2) goto L_WrongProd;
+ mes "A delivery from the Merchant Guild?? Oh, Right! Yes! I almost forgot.";
+ next;
+ mes "[Kafra]";
+ mes "Let's see, the serial number for the product should be.......";
+ next;
+ mes "[Kafra]";
+ if((countitem(1081) ==0) && (countitem(1082) ==0) && (countitem(1083) ==0)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
+ if((job_merchant_q2 !=7) && (job_merchant_q2 !=8)) goto L_WrongDest;
+ if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
+
+ mes "Oh, here it is. Yes! This is the one we ordered. Thank you very much. Here is your receipt.";
+ next;
+
+ set job_merchant_q3, 3;
+ if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
+ if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
+
+ L_0:
+ getitem 1079,1;//Items: Voucher______,
+ delitem 1081,1;//Items: Delivery_Box,
+ goto L_3;
+
+ L_1:
+ getitem 1080,1;//Items: Voucher_______,
+ delitem 1082,1;//Items: Delivery_Box_,
+ goto L_3;
+
+ L_3:
+ if(countitem(1072) == 1) goto L_Msg;//Items: Delivery_Message,
+ mes "[Kafra]";
+ mes "Thanks so much for comming all this way to deliver the product to me. Take care now. By bye.";
+ emotion e_thx;
+ cutin "kafra_03",255;
+ close;
+
+ L_Msg:
+ mes "[Kafra]";
+ mes "Oh,My good Lord! Mr. Mansoo wrote me a Letter? Thank you, Thank you~";
+ mes "I though he would send one, one of these days, but I've never expected it would be at a time like this.....";
+ emotion e_what;
+ next;
+ mes "[Kafra]";
+ mes "I really appreciate what you've done for me. Here is a small gift to show you my thanks.";
+ emotion e_thx;
+ delitem 1072,1;//Items: Delivery_Message,
+ set @TEMP,rand(2);
+ if(@TEMP !=0) goto R1;
+
+ R0:
+
+ getitem 513,3;//Items: Banana,
+ cutin "kafra_03",255;
+ close;
+ R1:
+ getitem 512,3;//Items: Apple,
+ cutin "kafra_03",255;
+ close;
+
+L_NoProd:
+ mes ".... I thought we what we ordered was OVERSIZED and HEAVY.... but.... you seem to carry it on without any difficulty.........";
+ emotion e_what;
+ cutin "kafra_03",255;
+ close;
+
+L_WrongProd:
+ mes "......? Excuse me! I think you gave me the wrong item. Our order should have the serial number 3318702 or 3543625...";
+ emotion e_swt;
+ set job_merchant_q3,2;
+ cutin "kafra_03",255;
+ close;
+
+L_WrongDest:
+ mes "......? Excuse me.... I think you have the wrong person.... our order should have the serial number 3318702 or 3543625...";
+ emotion e_swt;
+ cutin "kafra_03",255;
+ close;
+}
+
+// -- Kafra(Prontera) --
+prontera.gat,248,42,8 script Kafra#01 115,{
+ cutin "kafra_03",2;
+ if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
+L_Other:
+ mes "[Kafra]";
+ mes "Hello. I am a Kafra Service Agent. As you can see, the ^3355FFSwordsman Association^000000 has moved to Izlude.";
+ mes "I can warp you there for a small fee of 600 zeny however.";
+ next;
+ menu "Warp.",M_Warp, "Cancel.",M_End;
+
+ M_Warp:
+ if(Zeny < 600) goto sL_NdZeny;
+ set Zeny, Zeny - 600;
+ set RESRVPTS, RESRVPTS + 37;
+ warp "izlude.gat",91,105;
+ cutin "kafra_03",255;
+ end;
+
+ sL_NdZeny:
+ mes "[Kafra]";
+ mes "I'm sorry but you do not have enough zeny.";
+ cutin "kafra_03",255;
+ close;
+
+ M_Pass:
+ if(countitem(1084)<1) goto sL_NdPass;//Items: Kafra_Pass,
+ mes "[Kafra]";
+ mes "You are now using a Kafra Pass.";
+ delitem 1084,1;//Items: Kafra_Pass,
+ cutin "kafra_03",255;
+ close;
+
+ sL_NdPass:
+ mes "[Kafra]";
+ mes "I'm sorry but you have no pass....";
+ cutin "kafra_03",255;
+ close;
+ M_End:
+ mes "[Kafra]";
+ mes "Thank you for using Kafra Corp. Services. We will be with you wherever you go.";
+ emotion e_thx;
+ cutin "kafra_03",255;
+ close;
+
+
+L_Start:
+ if(job_merchant_q3 ==3) goto L_3;
+ mes "[Kafra]";
+ if(job_merchant_q3 ==2) goto L_WrongProd;
+
+ mes "Oh, you're from the Merchant Guild and you have a delivery for me?";
+ mes "I really appreciate you comming all this way..........";
+ next;
+ mes "[Kafra]";
+
+ if((countitem(1081) ==0) && (countitem(1082) ==0) && (countitem(1083) ==0)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
+ if((job_merchant_q2 !=1) && (job_merchant_q2 !=2)) goto L_WrongDest;
+ if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
+
+ mes "Yes! This is the Product we ordered. Thank you. Here, let me give you a Receipt.";
+ next;
+
+ set job_merchant_q3,3;
+ if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
+ if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
+
+ L_0:
+ getitem 1073,1;//Items: Voucher,
+ delitem 1081,1;//Items: Delivery_Box,
+ goto L_3;
+
+ L_1:
+ getitem 1074,1;//Items: Voucher_,
+ delitem 1082,1;//Items: Delivery_Box_,
+ goto L_3;
+
+ L_3:
+ mes "[Kafra]";
+ mes "Thank you again for the delivery.";
+ emotion e_thx;
+ cutin "kafra_03",255;
+ close;
+
+L_NoProd:
+ mes "Umm......... excuse me... but where is the Product your supposed to give me....?";
+ emotion e_hmm;
+ cutin "kafra_03",255;
+ close;
+
+L_WrongProd:
+ mes "Oh, Dear... this isn't what I ordered. It should have a serial number of either ^ff00002485741 or 2328137^000000.";
+ mes "It looks like there was a mix up at the wharehouse and you got the wrong product. I'd appreciate it if you could sort this out.";
+ emotion e_swt;
+ set job_merchant_q3,2;
+ cutin "kafra_03",255;
+ close;
+
+L_WrongDest:
+ mes "Oh, Dear... this isn't what I ordered. You see here, it's addressed to someone else. It looks like this Product is supposed to go to someone else.";
+ emotion e_swt;
+ cutin "kafra_03",255;
+ close;
+}
+
+
+// == Other Npcs ==
+// -- Guild Staff --
+geffen_in.gat,155,122,4 script Guild Staff 47,{
+
+ if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
+L_Other:
+ mes "[Guild Staff]";
+ mes "It should be arriving any time now...... it seems to be late.... Hmm...";
+ close;
+
+L_Start:
+ if(job_merchant_q3 ==3) goto L_3;
+ mes "[Guild Staff]";
+ if(job_merchant_q3 ==2) goto L_WrongProd;
+
+ mes "Oh hi there. You're from the Merchant Guild you say? That means.........";
+ next;
+ mes "[Guild Staff]";
+ mes "WOW! IT'S HERE! It's here!! They FINALLY sent the Box!...... ";
+ next;
+ mes "[Guild Staff]";
+ mes "Oh excuse me, I'm so sorry. You must be very tired from having to travel in such hot weather. My thanks for your effort.";
+ next;
+ mes "[Guild Staff]";
+ mes "Alright, let me just ckeck the Serial Number to make sure.........";
+ next;
+ mes "[Guild Staff]";
+ if((countitem(1081) !=1) && (countitem(1082) !=1) && (countitem(1083) !=1)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
+ if((job_merchant_q2 !=3) && (job_merchant_q2 !=4)) goto L_WrongDest;
+ if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
+
+ mes "YES! This is it! Here, let me give you a Receipt.";
+ next;
+ set job_merchant_q3,3;
+ if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
+ if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
+
+ L_0:
+ getitem 1075,1;//Items: Voucher__,
+ delitem 1081,1;//Items: Delivery_Box,
+ goto L_3;
+
+ L_1:
+ getitem 1076,1;//Items: Voucher___,
+ delitem 1082,1;//Items: Delivery_Box_,
+ goto L_3;
+
+ L_3:
+ mes "[Guild Staff]";
+ mes "Heheh~ Thank you, Bye Bye.";
+ emotion e_thx;
+ close;
+L_NoProd:
+ mes "Huh? Where? Where is the Box?";
+ emotion e_what;
+ close;
+
+L_WrongDest:
+ mes "Hey wait a Minute! This is not what we ordered! The Serial Number should either be 2989396 or 2191737.";
+ mes "It looks like this is addressed to someone else. I think you got the wrong delivery destination.";
+ emotion e_swt2;
+ close;
+
+L_WrongProd:
+ mes "Hey wait a Minute! This is not what we ordered! The Serial Number should either be 2989396 or 2191737.";
+ mes "I don't know how you could make this mistake but please correct it. I really need that Product.";
+ emotion e_swt2;
+ set job_merchant_q3,2;
+ close;
+}
+
+
+// -- Dyer's Student --
+morocc_in.gat,140,102,4 script Dyer's Student 86,{
+ if(BaseJob == Job_Novice && job_merchant_q3>0) goto L_Start;
+
+L_Other:
+ mes "[Dyer's Student]";
+ mes "Mr. JavaDullihan is one and Only the Best in Midgard continent.";
+ mes "Aaaand I am his Student!! How proude of I am!!!!";
+ next;
+ mes "[Dyer's Student]";
+ mes ".....That's what I am saying..";
+ close;
+
+L_Start:
+ if(job_merchant_q3 ==3) goto L_3;
+ mes "[Dyer's Student]";
+ if(job_merchant_q3 ==2) goto L_WrongProd;
+
+ mes "You're from the Merchant Guild...? Ah, Yes! I've been expecting you.";
+ next;
+ mes "[Dyer's Student]";
+ mes "Let me check the Serial Number of the Product just to make sure.......";
+ next;
+ mes "[Dyer's Student]";
+ if((countitem(1081) !=1) && (countitem(1082) !=1) && (countitem(1083) !=1)) goto L_NoProd;//Items: Delivery_Box, Delivery_Box_, Delivery_Box__,
+ if((job_merchant_q2 !=5) && (job_merchant_q2 !=6)) goto L_WrongDest;
+ if(countitem(1083) == 1) goto L_WrongProd;//Items: Delivery_Box__,
+
+ mes "Great! This is what we ordered. Here, let me give you a Receipt.";
+ set job_merchant_q3,3;
+ if(countitem(1081) == 1) goto L_0;//Items: Delivery_Box,
+ if(countitem(1082) == 1) goto L_1;//Items: Delivery_Box_,
+
+ L_0:
+ getitem 1077,1;//Items: Voucher____,
+ delitem 1081,1;//Items: Delivery_Box,
+ goto L_3;
+
+ L_1:
+ getitem 1078,1;//Items: Voucher_____,
+ delitem 1082,1;//Items: Delivery_Box_,
+ goto L_3;
+
+ L_3:
+ mes "[Dyer's Student]";
+ mes "Thank you, See you next time~";
+ emotion e_thx;
+ close;
+
+L_NoProd:
+ mes "But where's the Product?";
+ emotion e_hmm;
+ close;
+
+L_WrongProd:
+ mes "Um..... excuse me? I don't think this is what we ordered? The Serial Number should be either 3012685 or 3487372.";
+ emotion e_hmm;
+ next;
+ mes "[Dyer's Student]";
+ mes "I see. There was a mix up at the wharehouse and you got the wrong product.";
+ next;
+ mes "[Dyer's Student]";
+ mes "Well this sucks. Please come back with the correct Product.";
+ emotion e_pif;
+ set job_merchant_q3,2;
+ close;
+
+L_WrongDest:
+ mes "Um.... excuse me? I don't think this is what we ordered? The Serial Number should be either 3012685 or 3487372.";
+ mes "I think you have the wrong delivery destination. Maybe you should try someone else.";
+ emotion e_hmm;
+ close;
+
+
+}
diff --git a/npc/jobs/1-1/swordman.txt b/npc/jobs/1-1/swordman.txt
index 92de98d25..85ffaaf1c 100644
--- a/npc/jobs/1-1/swordman.txt
+++ b/npc/jobs/1-1/swordman.txt
@@ -1,800 +1,800 @@
-//===== eAthena Script =======================================
-//= Swordsman Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.7.1
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working. I have created a custom warp to get into the test room so disable
-//= the one in your warp script or scripts. It is this warp: "izlude_in.gat",40,170.
-//= 1.1 Added instant job change for High Novice [Lupus]
-//= 1.3 Added Baby Class support [Lupus]
-//= 1.4 Changed the timing system to initnpctimer, now you do get warnings about time
-//= and are limited to 7min to complete the quest [Fredzilla]
-//= 1.5 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= 1.5.1 Fixed possible EXP abuse [Lupus]
-//= 1.5.2 Now saves/restores all quest skills [Lupus]
-//= 1.5.3 Removed Duplicates [Silent]
-//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
-//= 1.7 changed location from its clone to the original [Lupus]
-//= 1.7.1 Fixed warp on timeout [KarLaeda]
-//============================================================
-
-
-// == Npcs ==
-// -- Master Swordsman --
-izlude_in.gat,74,172,5 script Master Swordsman 119,{
- callfunc "F_ToHigh",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Master Swordsman";
- mes "[Master Swordsman]";
- if(BaseJob == Job_Novice && job_sword_q == 2) goto L_Done;
- mes "Welcome to the Swordsman Association! So.. What business brings you to us?";
-L_Menu:
- next;
- menu "Make me a Swordsman!",M_0,"About being a Swordsman.",M_1,"The job requirements.",M_2,"Cancel.",M_End;
- close;
-
- M_0:
- mes "[Master Swordsman]";
- if(BaseJob == Job_Swordman) {
- mes "Muhahaha! You must be kidding me! You're already a swordsman.";
- emotion e_heh;
- close;
- }
- if(BaseJob != Job_Novice) {
- mes "Im sorry but you can not hold more than one job at a time and therefore I must refuse your request.";
- next;
- mes "[Master Swordsman]";
- mes "Try picking up a hobby to make use of your spare time. Muhahahahah!!";
- emotion e_heh;
- close;
- }
- mes "So you wish to become a Swordsman aye? A very good choice!! Fill out this application form first.";
- next;
- mes "..(you fill out the form and hand it to him)..";
- next;
- mes "[Master Swordsman]";
- if(JobLevel < 10) {
- mes "A hem...., you have yet to learn all of the 'Basic Skills' needed to become a Swordsman. Please check the requirements again.";
- close;
- }
-
- set job_sword_q,1;
- savepoint "izlude_in.gat",65,165;
- mes "Okay. Let me just review your information......";
- next;
- mes "[Master Swordsman]";
- mes "Ah!! I see that you have met the necessary requirements.....";
- next;
- mes "[Master Swordsman]";
- mes "But there is one last thing you need to do to before I can make you an offical Swordsman.";
- mes "You must prove your valour by taking the Izlude Swordsman Test!!!";
- next;
- mes "[Master Swordsman]";
- mes "Are you willing to do so?";
- next;
- menu "Yes.",sM_0,"No.",sM_1;
-
- sM_0:
- mes "[Master Swordsman]";
- mes "Very good!!! The testing room is too my right.";
- next;
- mes "[Master Swordsman]";
- mes "Good luck young warrior!!!";
- close;
-
- sM_1:
- mes "[Master Swordsman]";
- mes "Very well then. Your registration is complete. When you are ready to take the test, just enter the testing room to my right.";
- close;
-
- M_1:
- mes "[Master Swordsman]";
- mes "So you wish to know about the Swordsman profession... very good then! I will explain it to you.";
- next;
- mes "[Master Swordsman]";
- mes "The primary advantage of being a Swordsman is that you will become superior in pure strength and mele combat compared with those in the other professions.";
- next;
- mes "[Master Swordsman]";
- mes "There are 3 reasons why the swordsman is unparalled in hand to hand combat v.s. those of the other job types!";
- next;
- mes "[Master Swordsman]";
- mes " - 1st, the swordsman has a skill that gives him/her an excellent hp regeration rate.";
- mes " - 2nd, the swordsman is capable of using more kinds of weapons than those in the other job types.";
- mes " - 3rd, Most of the swordsman's skills enhance and increase physical attacks making him/her an elite warrior.";
- next;
- mes "[Master Swordsman]";
- mes "A Simple but adequte explanation for a newbie like you.";
- next;
- mes "[Master Swordsman]";
- mes "Aside from this, in my personal opinion, being a 'Swordsman' is greatest job in all the land!";
- mes "Muhahahah!!!";
- emotion e_heh;
- goto L_Menu;
-
- M_2:
- mes "[Master Swordsman]";
- mes "So you wish to become a swordsman....";
- next;
- if(BaseJob == Job_Novice) goto O_2a;
- if(BaseJob == Job_Swordman) {
- mes "[Master Swordsman]";
- mes "....but you're already a Swordsman...????";
- emotion e_hmm;
- close;
- }
- mes "[Master Swordsman]";
- mes "But you already have another job.... it's too late for you to become a Swordsman.";
- next;
- mes "[Master Swordsman]";
- mes "Still you seek knowledge about the Swordsman proffession ay?... very well then....";
- next;
-
- O_2a:
- mes "[Master Swordsman]";
- mes "First, You must learn all 9 Basic Skills. If you can't satisfy this condition, you won't be able to become anything.";
- next;
- mes "[Master Swordsman]";
- mes "Secondly you must pass the legendary Izlude Swordsman Test.";
- next;
- mes "[Master Swordsman]";
- mes "When you fullfill these 2 conditions, you can become an offical Swordsman.";
- goto L_Menu;
-
- M_End:
- mes "[Master Swordsman]";
- mes "Enjoy your youth before you lose it~~ Muhahahaha!!!!";
- emotion e_heh;
- close;
-
-L_Done:
- mes "Let me see here....so you've past the test aye??....";
- next;
- if(SkillPoint > 0) goto L_Skillpt;
- mes "[Master Swordsman]";
- mes "Congratulations! Now you are now fully qualified to become a Real Swordsman! I will transform you right away!!";
- next;
- callfunc "Job_Change",Job_Swordman;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Master Swordsman]";
- mes "As you set forth on your journey I will expect you to represent the Swordsman Assosiation of Izlude with great honor and integrity.";
- next;
- mes "[Master Swordsman]";
- mes "Muhahahaha!!!";
- close;
-
- L_Skillpt:
- mes "[Master Swordsman]";
- mes "Hmm... just a momement... it seems you still have skill points left over.";
- mes "Please use them up so that I can make you a Swordsman.";
- close;
-}
-
-// == Warp ==
-// -- Warp to test room --
-izlude_in.gat,62,170,0 script w1039 45,1,1,{
- if(BaseJob == Job_Novice && job_sword_q > 0) warp "izlude_in.gat",40,170;
- if(job_sword_q == 0) doevent "Swordsman#02::OnStart";
- end;
-}
-
-// -- Swordsman --
-izlude_in.gat,65,171,5 script Swordsman#01 85,{
- doevent "Swordsman#02::OnStart";
- end;
-}
-
-// -- Hidden Npc --
-izlude_in.gat,65,171,5 script Swordsman#02 -1,{
-
-OnStart:
- mes "[Swordsman]";
- if(BaseJob == Job_Swordman) goto L_Sword;
- if(BaseJob == Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Who might you be?! Those who are not Novices are not permitted to go in! Please leave.";
- emotion e_what;
- close;
-L_Sword:
- mes "You're already a Swordsman!! You don't need to take this silly test!";
- emotion e_gasp;
- close;
-
-L_Novice:
- if(job_sword_q == 1) goto L_Start;
- if(job_sword_q == 2) goto L_Done;
-
- mes "Halt! Do you want to take the Swordsman Test?";
- mes "If so, please fill out the swordsman application first.";
- mes "Speak with the 'Master Swordsman' for more information.";
- emotion e_gasp;
- close;
-
- L_Start:
- mes "Please enter the testing room when you are ready. Good luck!";
- close;
-
- L_Done:
- mes "Speak with the Master Swordsman so that he can make you a Swordsman.";
- close;
-}
-
-// -- Test Guide --
-izlude_in.gat,30,175,4 script Test Guide 92,{
- mes "[Test Guide]";
- mes "I will tell you about the legendary Izlude Swordsman Test! Listen VERY CAREFULLY for I won't repeat this again!";
- next;
- mes "[Test Guide]";
- mes "The purpose of this test is to decide wheather or not you qualify to become a Swordsman.";
- mes "As you know, a Swordsman needs superior physical Strength as well as an iron will!";
- mes "If you possess neither of these attributes you will surely fail this grueling test.";
- next;
- mes "[Test Guide]";
- mes "The objective of the test is very simple!";
- next;
- mes "[Test Guide]";
- mes "You need to make through an obsticale course within ^FF00007 minutes^000000 in order to pass.";
- next;
- mes "[Test Guide]";
- mes "The obsticale course is made up of 3 parts and is littered with booby-traps so be carefull!";
- mes "Some traps will reduce your HP while others will warp you to an random underground cave causing you to start over.";
- next;
- mes "[Test Guide]";
- mes "If you `Surrender' or if you excede the 'time limit', you will be fail the test.";
- next;
- mes "[Test Guide]";
- mes "That is everything you need to know in order to take the test.";
- mes "May God bless you.";
- close;
-}
-
-
-// -- Test Hall Staff 1 --
-izlude_in.gat,30,163,8 script Test Hall Staff 105,{
- mes "[Test Hall Staff]";
- if(SWTEST == 1) goto L_Option2;
- if(SWTEST >= 2) goto L_Option3;
- set SWTEST, 0;
-
- mes " So you want to take the test huh? You look confident.. that's good. Stay relaxed and do your best. This is not a difficult test.";
- next;
- mes "[Test Hall Staff]";
- mes "Are you ready?";
- next;
- menu "Let me at it!!",-,"Ah..maybe later..",M_no;
-
- M_yes:
- set SWTEST, SWTEST + 1;
- savepoint "izlude_in.gat",39,170;
- stopnpctimer;
- initnpctimer "TimerSwrdmn";
- warp "job_sword1.gat",10,245;
- end;
-
- M_no:
- mes "[Test Hall Staff]";
- mes "Check back with me when you are ready.";
- close;
-
-L_Option2:
- mes "Taking the test over?.... Keep your head up. I like those who never back down from a challange! Now take this and cheer up!";
- getitem 512,3;//Items: Apple,
- next;
- goto M_yes;
- end;
-L_Option3:
- mes "Don't give up! I know you will pass this time!";
- mes "(you catch him whispering '...loooooseerrr...')";
- getitem 512,5;//Items: Apple,
- next;
- goto M_yes;
- end;
-}
-job_sword1.gat,1,1,0 script TimerSwrdmn -1,{
- OnTimer4000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: Your 7 minutes starts now!",0;
- end;
- OnTimer184000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 4 minutes left!",0;
- end;
- OnTimer304000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 2 minutes left!",0;
- end;
- OnTimer364000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 1 minutes left!",0;
- end;
- OnTimer394000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 30 seconds left, hurry!",0;
- end;
- OnTimer424000:
- areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: Your times up! You failed the test.",0;
- end;
- OnTimer428000:
- stopnpctimer;
- areawarp "job_sword1.gat",0,0,400,400,"izlude_in.gat",39,170;
- end;
-}
-
-
-// -- Medic 1 --
-job_sword1.gat,230,245,2 script Medic#01 105,{
- mes "[Medic]";
- mes "This is the 1st check point! You're doing great!";
- percentheal 100, 100;
- close;
-}
-
-// -- Test Hall Staff 2 --
-job_sword1.gat,230,242,2 script Test Hall Staff#01 105,{
- mes "[Test Hall Staff]";
- mes "Do you surrender?";
- next;
- menu "Yes.",M_0,"No.",M_1;
-
- M_0:
- warp "izlude_in.gat",65,165;
- close;
- M_1:
- mes "[Test Hall Staff]";
- mes "Bravo! Go for it again!";
- close;
-}
-
-// -- Medic 2 --
-job_sword1.gat,230,207,2 script Medic#02 105,{
- mes "[Medic]";
- mes "This is the 2nd check point! Keep up the good work!";
- percentheal 100, 100;
- close;
-}
-
-// -- Test Hall Staff 3 --
-job_sword1.gat,230,204,2 script Test Hall Staff#02 105,{
- mes "[Test Hall Staff]";
- mes "Do you surrender?";
- next;
- menu "Yes.",M_0,"No.",M_1;
-
- M_0:
- warp "izlude_in.gat",65,165;
- close;
- M_1:
- mes "[Test Hall Staff]";
- mes "Bravo! Go for it again!";
- close;
-}
-
-// -- Mae (Medic 3) --
-job_sword1.gat,223,167,2 script Mae 92,{
- mes "[Mae]";
- mes "I sincerely congratulate you for passing the test!";
- mes "I've already sent your test results to the 'Master Swordsman'.";
- mes "Please inquire with him about your results. Thank you.";
- next;
- stopnpctimer "TimerSwrdmn";
- percentheal 100, 100;
- set job_sword_q,2;
- set SWTEST,0;
- warp "izlude_in.gat",66,173;
- close;
-}
-
-
-
-
-// == Green Traps ==
-// reduce hp when stepped on
-
-// -- First Section --
-// - Left -
-job_sword1.gat,22,172,1 script 1green_1::green 139,0,0,{
- heal (-4),0;
- end;
-}
-
-// -- Duplicates --
-job_sword1.gat,22,173,1 duplicate(green) 1green_2 139,0,0
-job_sword1.gat,23,172,1 duplicate(green) 1green_3 139,0,0
-job_sword1.gat,23,173,1 duplicate(green) 1green_4 139,0,0
-job_sword1.gat,34,172,1 duplicate(green) 1green_5 139,0,0
-job_sword1.gat,34,173,1 duplicate(green) 1green_6 139,0,0
-job_sword1.gat,35,172,1 duplicate(green) 1green_7 139,0,0
-job_sword1.gat,35,173,1 duplicate(green) 1green_8 139,0,0
-job_sword1.gat,66,170,1 duplicate(green) 1green_9 139,0,0
-job_sword1.gat,66,171,1 duplicate(green) 1green_10 139,0,0
-job_sword1.gat,67,170,1 duplicate(green) 1green_11 139,0,0
-job_sword1.gat,67,171,1 duplicate(green) 1green_12 139,0,0
-job_sword1.gat,70,170,1 duplicate(green) 1green_13 139,0,0
-job_sword1.gat,70,171,1 duplicate(green) 1green_14 139,0,0
-job_sword1.gat,71,170,1 duplicate(green) 1green_15 139,0,0
-job_sword1.gat,71,171,1 duplicate(green) 1green_16 139,0,0
-
-// - Right -
-job_sword1.gat,22,164,1 duplicate(green) 1green_17 139,0,0
-job_sword1.gat,22,165,1 duplicate(green) 1green_18 139,0,0
-job_sword1.gat,23,164,1 duplicate(green) 1green_19 139,0,0
-job_sword1.gat,23,165,1 duplicate(green) 1green_20 139,0,0
-job_sword1.gat,34,164,1 duplicate(green) 1green_21 139,0,0
-job_sword1.gat,34,165,1 duplicate(green) 1green_22 139,0,0
-job_sword1.gat,35,164,1 duplicate(green) 1green_23 139,0,0
-job_sword1.gat,35,165,1 duplicate(green) 1green_24 139,0,0
-job_sword1.gat,66,166,1 duplicate(green) 1green_25 139,0,0
-job_sword1.gat,66,167,1 duplicate(green) 1green_26 139,0,0
-job_sword1.gat,67,166,1 duplicate(green) 1green_27 139,0,0
-job_sword1.gat,67,167,1 duplicate(green) 1green_28 139,0,0
-job_sword1.gat,70,166,1 duplicate(green) 1green_29 139,0,0
-job_sword1.gat,70,167,1 duplicate(green) 1green_30 139,0,0
-job_sword1.gat,71,166,1 duplicate(green) 1green_31 139,0,0
-job_sword1.gat,71,167,1 duplicate(green) 1green_32 139,0,0
-// - Center -
-job_sword1.gat,86,168,1 duplicate(green) 1green_33 139,0,0
-job_sword1.gat,86,169,1 duplicate(green) 1green_34 139,0,0
-job_sword1.gat,87,168,1 duplicate(green) 1green_35 139,0,0
-job_sword1.gat,87,169,1 duplicate(green) 1green_36 139,0,0
-
-// -- Second Section --
-// - Left -
-job_sword1.gat,83,171,1 duplicate(green) 2green_1 139,0,1
-job_sword1.gat,82,171,1 duplicate(green) 2green_2 139,0,1
-job_sword1.gat,90,171,1 duplicate(green) 2green_3 139,0,1
-job_sword1.gat,91,171,1 duplicate(green) 2green_4 139,0,1
-job_sword1.gat,84,173,1 duplicate(green) 2green_5 139,1,0
-job_sword1.gat,90,173,1 duplicate(green) 2green_6 139,1,0
-job_sword1.gat,83,166,1 duplicate(green) 2green_7 139,0,1
-job_sword1.gat,82,166,1 duplicate(green) 2green_8 139,0,1
-job_sword1.gat,90,166,1 duplicate(green) 2green_9 139,0,1
-job_sword1.gat,91,166,1 duplicate(green) 2green_10 139,0,1
-job_sword1.gat,84,164,1 duplicate(green) 2green_11 139,1,0
-job_sword1.gat,90,164,1 duplicate(green) 2green_12 139,1,0
-job_sword1.gat,102,168,1 duplicate(green) 2green_13 139,0,0
-job_sword1.gat,102,169,1 duplicate(green) 2green_14 139,0,0
-// - Right -
-job_sword1.gat,102,172,1 duplicate(green) 2green_15 139,0,0
-job_sword1.gat,102,173,1 duplicate(green) 2green_16 139,0,0
-job_sword1.gat,103,172,1 duplicate(green) 2green_17 139,0,0
-job_sword1.gat,103,173,1 duplicate(green) 2green_18 139,0,0
-job_sword1.gat,106,172,1 duplicate(green) 2green_19 139,0,0
-job_sword1.gat,106,173,1 duplicate(green) 2green_20 139,0,0
-job_sword1.gat,107,172,1 duplicate(green) 2green_21 139,0,0
-job_sword1.gat,107,173,1 duplicate(green) 2green_22 139,0,0
-job_sword1.gat,110,172,1 duplicate(green) 2green_23 139,0,0
-job_sword1.gat,110,173,1 duplicate(green) 2green_24 139,0,0
-job_sword1.gat,111,172,1 duplicate(green) 2green_25 139,0,0
-job_sword1.gat,111,173,1 duplicate(green) 2green_26 139,0,0
-// - Center -
-job_sword1.gat,102,164,1 duplicate(green) 2green_27 139,0,0
-job_sword1.gat,102,165,1 duplicate(green) 2green_28 139,0,0
-job_sword1.gat,103,164,1 duplicate(green) 2green_29 139,0,0
-job_sword1.gat,103,165,1 duplicate(green) 2green_30 139,0,0
-job_sword1.gat,106,164,1 duplicate(green) 2green_31 139,0,0
-job_sword1.gat,106,165,1 duplicate(green) 2green_32 139,0,0
-job_sword1.gat,107,164,1 duplicate(green) 2green_33 139,0,0
-job_sword1.gat,107,165,1 duplicate(green) 2green_34 139,0,0
-job_sword1.gat,110,164,1 duplicate(green) 2green_35 139,0,0
-job_sword1.gat,110,165,1 duplicate(green) 2green_36 139,0,0
-job_sword1.gat,111,164,1 duplicate(green) 2green_37 139,0,0
-job_sword1.gat,111,165,1 duplicate(green) 2green_38 139,0,0
-
-
-// -- Third Section --
-job_sword1.gat,121,172,1 duplicate(green) 3green_1 139,2,0
-job_sword1.gat,121,173,1 duplicate(green) 3green_2 139,2,0
-job_sword1.gat,121,164,1 duplicate(green) 3green_3 139,2,0
-job_sword1.gat,121,165,1 duplicate(green) 3green_4 139,2,0
-job_sword1.gat,121,168,1 duplicate(green) 3green_5 139,2,0
-job_sword1.gat,121,169,1 duplicate(green) 3green_6 139,2,0
-
-// -- Fourth Section --
-job_sword1.gat,130,169,1 duplicate(green) 4green_1 139,0,4
-job_sword1.gat,131,169,1 duplicate(green) 4green_2 139,0,4
-job_sword1.gat,135,164,1 duplicate(green) 4green_3 139,5,0
-job_sword1.gat,136,165,1 duplicate(green) 4green_4 139,4,0
-job_sword1.gat,140,169,1 duplicate(green) 4green_5 139,0,3
-job_sword1.gat,141,168,1 duplicate(green) 4green_6 139,0,4
-job_sword1.gat,137,172,1 duplicate(green) 4green_7 139,2,0
-job_sword1.gat,138,173,1 duplicate(green) 4green_8 139,3,0
-job_sword1.gat,134,171,1 duplicate(green) 4green_9 139,0,2
-job_sword1.gat,135,168,1 duplicate(green) 4green_10 139,0,1
-job_sword1.gat,135,170,1 duplicate(green) 4green_11 139,1,0
-
-// -- Fifth Section --
-job_sword1.gat,144,169,1 duplicate(green) 5green_1 139,0,4
-job_sword1.gat,145,169,1 duplicate(green) 5green_2 139,0,4
-job_sword1.gat,148,164,1 duplicate(green) 5green_3 139,4,0
-job_sword1.gat,149,165,1 duplicate(green) 5green_4 139,3,0
-job_sword1.gat,156,166,1 duplicate(green) 5green_5 139,0,2
-job_sword1.gat,157,166,1 duplicate(green) 5green_6 139,0,2
-job_sword1.gat,153,169,1 duplicate(green) 5green_7 139,4,0
-job_sword1.gat,152,168,1 duplicate(green) 5green_8 139,3,0
-job_sword1.gat,149,171,1 duplicate(green) 5green_9 139,0,1
-job_sword1.gat,148,171,1 duplicate(green) 5green_10 139,0,2
-job_sword1.gat,154,173,1 duplicate(green) 5green_11 139,2,0
-job_sword1.gat,154,172,1 duplicate(green) 5green_12 139,2,0
-
-// -- Last Section --
-job_sword1.gat,164,172,1 duplicate(green) 6green_1 139,0,0
-job_sword1.gat,164,173,1 duplicate(green) 6green_2 139,0,0
-job_sword1.gat,165,172,1 duplicate(green) 6green_3 139,0,0
-job_sword1.gat,165,173,1 duplicate(green) 6green_4 139,0,0
-job_sword1.gat,172,172,1 duplicate(green) 6green_5 139,0,0
-job_sword1.gat,172,173,1 duplicate(green) 6green_6 139,0,0
-job_sword1.gat,173,172,1 duplicate(green) 6green_7 139,0,0
-job_sword1.gat,173,173,1 duplicate(green) 6green_8 139,0,0
-
-job_sword1.gat,164,168,1 duplicate(green) 6green_9 139,0,0
-job_sword1.gat,164,169,1 duplicate(green) 6green_10 139,0,0
-job_sword1.gat,165,168,1 duplicate(green) 6green_11 139,0,0
-job_sword1.gat,165,169,1 duplicate(green) 6green_12 139,0,0
-job_sword1.gat,172,168,1 duplicate(green) 6green_13 139,0,0
-job_sword1.gat,172,169,1 duplicate(green) 6green_14 139,0,0
-job_sword1.gat,173,168,1 duplicate(green) 6green_15 139,0,0
-job_sword1.gat,173,169,1 duplicate(green) 6green_16 139,0,0
-
-job_sword1.gat,164,164,1 duplicate(green) 6green_17 139,0,0
-job_sword1.gat,164,165,1 duplicate(green) 6green_18 139,0,0
-job_sword1.gat,165,164,1 duplicate(green) 6green_19 139,0,0
-job_sword1.gat,165,165,1 duplicate(green) 6green_20 139,0,0
-job_sword1.gat,172,164,1 duplicate(green) 6green_21 139,0,0
-job_sword1.gat,172,165,1 duplicate(green) 6green_22 139,0,0
-job_sword1.gat,173,164,1 duplicate(green) 6green_23 139,0,0
-job_sword1.gat,173,165,1 duplicate(green) 6green_24 139,0,0
-
-
-
-// == Fall Warps ==
-
-job_sword1.gat,16,251,4 script 1_blank_1a#1::1_blank 139,0,1,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "job_sword1.gat",65,56;
- if (@TEMP==1) warp "job_sword1.gat",29,26;
- if (@TEMP==2) warp "job_sword1.gat",43,16;
- if (@TEMP==3) warp "job_sword1.gat",23,112;
- if (@TEMP==4) warp "job_sword1.gat",58,83;
- end;
-}
-
-// -- Duplicates --
-job_sword1.gat,19,251,4 duplicate(1_blank) 1_blank_1b 139,0,1
-job_sword1.gat,17,250,4 duplicate(1_blank) 1_blank_1c 139,1,0
-job_sword1.gat,17,251,4 duplicate(1_blank) 1_blank_1d 139,1,1
-job_sword1.gat,18,251,4 duplicate(1_blank) 1_blank_1e 139,1,1
-job_sword1.gat,17,251,4 duplicate(1_blank) 1_blank_1f 139,1,1
-job_sword1.gat,16,238,4 duplicate(1_blank) 1_blank_2a 139,0,1
-job_sword1.gat,19,238,4 duplicate(1_blank) 1_blank_2b 139,0,1
-job_sword1.gat,17,239,4 duplicate(1_blank) 1_blank_2c 139,0,1
-job_sword1.gat,28,246,4 duplicate(1_blank) 1_blank_3a 139,4,1
-job_sword1.gat,33,245,4 duplicate(1_blank) 1_blank_3b 139,0,2
-job_sword1.gat,29,242,4 duplicate(1_blank) 1_blank_3c 139,4,0
-job_sword1.gat,24,244,4 duplicate(1_blank) 1_blank_3d 139,0,2
-job_sword1.gat,38,251,4 duplicate(1_blank) 1_blank_4a 139,0,1
-job_sword1.gat,41,251,4 duplicate(1_blank) 1_blank_4b 139,0,1
-job_sword1.gat,39,250,4 duplicate(1_blank) 1_blank_4c 139,1,0
-job_sword1.gat,38,238,4 duplicate(1_blank) 1_blank_5a 139,0,1
-job_sword1.gat,41,238,4 duplicate(1_blank) 1_blank_5_b 139,0,1
-job_sword1.gat,39,239,4 duplicate(1_blank) 1_blank_5_c 139,1,0
-job_sword1.gat,54,251,4 duplicate(1_blank) 1_blank_6_a 139,0,1
-job_sword1.gat,71,251,4 duplicate(1_blank) 1_blank_6_b 139,0,1
-job_sword1.gat,62,250,4 duplicate(1_blank) 1_blank_6_c 139,9,0
-job_sword1.gat,62,247,4 duplicate(1_blank) 1_blank_7_a 139,8,0
-job_sword1.gat,71,244,4 duplicate(1_blank) 1_blank_7_b 139,0,2
-job_sword1.gat,63,242,4 duplicate(1_blank) 1_blank_7_c 139,8,0
-job_sword1.gat,54,244,4 duplicate(1_blank) 1_blank_7_d 139,0,2
-job_sword1.gat,54,238,4 duplicate(1_blank) 1_blank_8_a 139,0,1
-job_sword1.gat,71,238,4 duplicate(1_blank) 1_blank_8_b 139,0,1
-job_sword1.gat,62,239,4 duplicate(1_blank) 1_blank_8_c 139,9,0
-job_sword1.gat,102,247,4 duplicate(1_blank) 1_blank_9_a 139,2,0
-job_sword1.gat,105,245,4 duplicate(1_blank) 1_blank_9_b 139,0,2
-job_sword1.gat,103,242,4 duplicate(1_blank) 1_blank_9_c 139,2,0
-job_sword1.gat,100,244,4 duplicate(1_blank) 1_blank_9_d 139,0,2
-job_sword1.gat,156,249,4 duplicate(1_blank) 1_blank_10_a 139,14,0
-job_sword1.gat,156,248,4 duplicate(1_blank) 1_blank_10_b 139,14,0
-job_sword1.gat,170,249,4 duplicate(1_blank) 1_blank_10_c 139,1,0
-job_sword1.gat,170,248,4 duplicate(1_blank) 1_blank_10_d 139,1,0
-job_sword1.gat,156,245,4 duplicate(1_blank) 1_blank_11_a 139,14,0
-job_sword1.gat,156,244,4 duplicate(1_blank) 1_blank_11_b 139,14,0
-job_sword1.gat,170,245,4 duplicate(1_blank) 1_blank_11_c 139,1,0
-job_sword1.gat,170,244,4 duplicate(1_blank) 1_blank_11_d 139,1,0
-job_sword1.gat,156,241,4 duplicate(1_blank) 1_blank_12_a 139,14,0
-job_sword1.gat,156,240,4 duplicate(1_blank) 1_blank_12_b 139,14,0
-job_sword1.gat,170,241,4 duplicate(1_blank) 1_blank_12_c 139,1,0
-job_sword1.gat,170,240,4 duplicate(1_blank) 1_blank_12_d 139,1,0
-job_sword1.gat,180,251,4 duplicate(1_blank) 1_blank_13_a 139,0,1
-job_sword1.gat,183,251,4 duplicate(1_blank) 1_blank_13_b 139,0,1
-job_sword1.gat,181,250,4 duplicate(1_blank) 1_blank_13_c 139,1,0
-job_sword1.gat,180,238,4 duplicate(1_blank) 1_blank_14_a 139,0,1
-job_sword1.gat,183,238,4 duplicate(1_blank) 1_blank_14_b 139,0,1
-job_sword1.gat,181,239,4 duplicate(1_blank) 1_blank_14_c 139,1,0
-
-
-job_sword1.gat,56,212,4 script 2_blank_1_a::2_blank 139,40,0,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "job_sword1.gat",162,120;
- if (@TEMP==1) warp "job_sword1.gat",94,120;
- if (@TEMP==2) warp "job_sword1.gat",94,85;
- if (@TEMP==3) warp "job_sword1.gat",162,85;
- if (@TEMP==4) warp "job_sword1.gat",130,47;
- end;
-}
-
-// -- Duplicates --
-job_sword1.gat,95,212,4 duplicate(2_blank) 2_blank_1_b 139,2,0
-job_sword1.gat,56,210,4 duplicate(2_blank) 2_blank_2_a 139,40,0
-job_sword1.gat,95,210,4 duplicate(2_blank) 2_blank_2_b 139,2,0
-job_sword1.gat,16,206,4 duplicate(2_blank) 2_blank_2_c 139,0,3
-job_sword1.gat,97,206,4 duplicate(2_blank) 2_blank_2_d 139,0,3
-job_sword1.gat,56,203,4 duplicate(2_blank) 2_blank_2_e 139,40,0
-job_sword1.gat,95,203,4 duplicate(2_blank) 2_blank_2_f 139,2,0
-job_sword1.gat,56,201,4 duplicate(2_blank) 2_blank_3_a 139,40,0
-job_sword1.gat,95,201,4 duplicate(2_blank) 2_blank_3_b 139,2,0
-
-// - part 2 -
-job_sword1.gat,113,212,4 duplicate(2_blank) 2_blank_4_a 139,14,0
-job_sword1.gat,125,212,4 duplicate(2_blank) 2_blank_4_b 139,2,0
-job_sword1.gat,113,210,4 duplicate(2_blank) 2_blank_5_a 139,14,0
-job_sword1.gat,125,210,4 duplicate(2_blank) 2_blank_5_b 139,2,0
-job_sword1.gat,100,206,4 duplicate(2_blank) 2_blank_5_c 139,0,3
-job_sword1.gat,127,206,4 duplicate(2_blank) 2_blank_5_d 139,0,3
-job_sword1.gat,113,203,4 duplicate(2_blank) 2_blank_5_e 139,14,0
-job_sword1.gat,125,210,4 duplicate(2_blank) 2_blank_5_f 139,2,0
-job_sword1.gat,113,201,4 duplicate(2_blank) 2_blank_6_a 139,14,0
-job_sword1.gat,113,201,4 duplicate(2_blank) 2_blank_6_b 139,2,0
-
-// - part 3 -
-job_sword1.gat,155,212,4 duplicate(2_blank) 2_blank_7_a 139,21,0
-job_sword1.gat,181,212,4 duplicate(2_blank) 2_blank_7_b 139,2,0
-job_sword1.gat,155,210,4 duplicate(2_blank) 2_blank_8_a 139,21,0
-job_sword1.gat,181,210,4 duplicate(2_blank) 2_blank_8_b 139,2,0
-job_sword1.gat,130,206,4 duplicate(2_blank) 2_blank_8_c 139,0,3
-job_sword1.gat,183,206,4 duplicate(2_blank) 2_blank_8_d 139,0,3
-job_sword1.gat,155,203,4 duplicate(2_blank) 2_blank_8_e 139,21,0
-job_sword1.gat,181,203,4 duplicate(2_blank) 2_blank_8_f 139,2,0
-job_sword1.gat,155,201,4 duplicate(2_blank) 2_blank_9_a 139,40,0
-job_sword1.gat,181,201,4 duplicate(2_blank) 2_blank_9_b 139,2,0
-
-job_sword1.gat,17,174,4 script 3_blank_1_a::3_blank 139,2,0,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "job_sword1.gat",195,15;
- if (@TEMP==1) warp "job_sword1.gat",195,38;
- if (@TEMP==2) warp "job_sword1.gat",231,30;
- if (@TEMP==3) warp "job_sword1.gat",198,65;
- if (@TEMP==4) warp "job_sword1.gat",196,116;
- end;
-}
-
-// -- Duplicates --
-job_sword1.gat,17,163,4 duplicate(3_blank) 3_blank_2_a 139,2,0
-job_sword1.gat,29,171,4 duplicate(3_blank) 3_blank_3_a 139,2,0
-job_sword1.gat,31,168,4 duplicate(3_blank) 3_blank_3_b 139,0,2
-job_sword1.gat,28,166,4 duplicate(3_blank) 3_blank_3_c 139,2,0
-job_sword1.gat,26,168,4 duplicate(3_blank) 3_blank_3_d 139,0,2
-job_sword1.gat,36,169,4 duplicate(3_blank) 3_blank_4_a 139,0,0
-job_sword1.gat,37,169,4 duplicate(3_blank) 3_blank_4_b 139,0,0
-job_sword1.gat,37,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
-job_sword1.gat,36,168,4 duplicate(3_blank) 3_blank_4_d 139,0,0
-job_sword1.gat,40,175,4 duplicate(3_blank) 3_blank_5_a 139,0,1
-job_sword1.gat,41,175,4 duplicate(3_blank) 3_blank_5_b 139,0,1
-job_sword1.gat,41,171,4 duplicate(3_blank) 3_blank_6_a 139,1,0
-job_sword1.gat,41,170,4 duplicate(3_blank) 3_blank_6_b 139,1,0
-job_sword1.gat,41,167,4 duplicate(3_blank) 3_blank_6_c 139,1,0
-job_sword1.gat,41,166,4 duplicate(3_blank) 3_blank_6_d 139,1,0
-job_sword1.gat,42,169,4 duplicate(3_blank) 3_blank_6_e 139,0,1
-job_sword1.gat,43,170,4 duplicate(3_blank) 3_blank_6_f 139,0,1
-job_sword1.gat,43,167,4 duplicate(3_blank) 3_blank_6_g 139,0,1
-job_sword1.gat,40,162,4 duplicate(3_blank) 3_blank_7_a 139,0,1
-job_sword1.gat,41,162,4 duplicate(3_blank) 3_blank_7_b 139,0,1
-job_sword1.gat,46,175,4 duplicate(3_blank) 3_blank_8_a 139,0,1
-job_sword1.gat,51,175,4 duplicate(3_blank) 3_blank_8_b 139,0,1
-job_sword1.gat,47,174,4 duplicate(3_blank) 3_blank_8_c 139,1,0
-job_sword1.gat,50,174,4 duplicate(3_blank) 3_blank_8_d 139,1,0
-job_sword1.gat,48,173,4 duplicate(3_blank) 3_blank_8_e 139,0,1
-job_sword1.gat,49,173,4 duplicate(3_blank) 3_blank_8_f 139,0,1
-job_sword1.gat,46,162,4 duplicate(3_blank) 3_blank_9_a 139,0,1
-job_sword1.gat,51,162,4 duplicate(3_blank) 3_blank_9_b 139,0,1
-job_sword1.gat,47,163,4 duplicate(3_blank) 3_blank_9_c 139,1,0
-job_sword1.gat,50,163,4 duplicate(3_blank) 3_blank_9_d 139,1,0
-job_sword1.gat,48,164,4 duplicate(3_blank) 3_blank_9_e 139,0,1
-job_sword1.gat,49,164,4 duplicate(3_blank) 3_blank_9_f 139,0,1
-job_sword1.gat,54,170,4 duplicate(3_blank) 3_blank_10_a 139,0,1
-job_sword1.gat,55,170,4 duplicate(3_blank) 3_blank_10_b 139,0,1
-job_sword1.gat,54,167,4 duplicate(3_blank) 3_blank_10_c 139,0,1
-job_sword1.gat,55,167,4 duplicate(3_blank) 3_blank_10_d 139,0,1
-job_sword1.gat,53,169,4 duplicate(3_blank) 3_blank_10_e 139,1,0
-job_sword1.gat,53,168,4 duplicate(3_blank) 3_blank_10_f 139,1,0
-job_sword1.gat,56,169,4 duplicate(3_blank) 3_blank_10_g 139,1,0
-job_sword1.gat,56,168,4 duplicate(3_blank) 3_blank_10_h 139,1,0
-job_sword1.gat,58,175,4 duplicate(3_blank) 3_blank_11_a 139,0,1
-job_sword1.gat,59,174,4 duplicate(3_blank) 3_blank_11_b 139,1,0
-job_sword1.gat,60,173,4 duplicate(3_blank) 3_blank_11_c 139,0,1
-job_sword1.gat,61,172,4 duplicate(3_blank) 3_blank_11_d 139,1,0
-job_sword1.gat,58,162,4 duplicate(3_blank) 3_blank_12_a 139,0,1
-job_sword1.gat,59,163,4 duplicate(3_blank) 3_blank_12_b 139,1,0
-job_sword1.gat,60,164,4 duplicate(3_blank) 3_blank_12_c 139,0,1
-job_sword1.gat,61,165,4 duplicate(3_blank) 3_blank_12_d 139,1,0
-job_sword1.gat,76,172,4 duplicate(3_blank) 3_blank_13_a 139,1,0
-job_sword1.gat,77,173,4 duplicate(3_blank) 3_blank_13_b 139,0,1
-job_sword1.gat,78,174,4 duplicate(3_blank) 3_blank_13_c 139,1,0
-job_sword1.gat,79,175,4 duplicate(3_blank) 3_blank_13_d 139,0,1
-job_sword1.gat,76,165,4 duplicate(3_blank) 3_blank_14_a 139,1,0
-job_sword1.gat,77,164,4 duplicate(3_blank) 3_blank_14_b 139,0,1
-job_sword1.gat,78,163,4 duplicate(3_blank) 3_blank_14_c 139,1,0
-job_sword1.gat,79,162,4 duplicate(3_blank) 3_blank_14_d 139,0,1
-job_sword1.gat,94,175,4 duplicate(3_blank) 3_blank_15_a 139,0,1
-job_sword1.gat,95,174,4 duplicate(3_blank) 3_blank_15_b 139,1,0
-job_sword1.gat,98,174,4 duplicate(3_blank) 3_blank_15_c 139,1,0
-job_sword1.gat,99,175,4 duplicate(3_blank) 3_blank_16_d 139,0,1
-job_sword1.gat,96,169,4 duplicate(3_blank) 3_blank_17_a 139,0,0
-job_sword1.gat,97,169,4 duplicate(3_blank) 3_blank_17_b 139,0,0
-job_sword1.gat,97,168,4 duplicate(3_blank) 3_blank_17_c 139,0,0
-job_sword1.gat,96,168,4 duplicate(3_blank) 3_blank_17_d 139,0,0
-job_sword1.gat,94,162,4 duplicate(3_blank) 3_blank_18_a 139,0,1
-job_sword1.gat,95,163,4 duplicate(3_blank) 3_blank_18_b 139,1,0
-job_sword1.gat,98,163,4 duplicate(3_blank) 3_blank_18_c 139,1,0
-job_sword1.gat,99,162,4 duplicate(3_blank) 3_blank_18_d 139,0,1
-job_sword1.gat,114,175,4 duplicate(3_blank) 3_blank_19_a 139,0,1
-job_sword1.gat,115,175,4 duplicate(3_blank) 3_blank_19_b 139,0,1
-job_sword1.gat,114,162,4 duplicate(3_blank) 3_blank_20_a 139,0,1
-job_sword1.gat,115,162,4 duplicate(3_blank) 3_blank_20_b 139,0,1
-job_sword1.gat,126,175,4 duplicate(3_blank) 3_blank_21_a 139,0,1
-job_sword1.gat,127,175,4 duplicate(3_blank) 3_blank_21_b 139,0,1
-job_sword1.gat,126,162,4 duplicate(3_blank) 3_blank_23_a 139,0,1
-job_sword1.gat,127,162,4 duplicate(3_blank) 3_blank_23_b 139,0,1
-job_sword1.gat,160,174,4 duplicate(3_blank) 3_blank_24_a 139,0,2
-job_sword1.gat,161,174,4 duplicate(3_blank) 3_blank_24_b 139,0,2
-job_sword1.gat,160,163,4 duplicate(3_blank) 3_blank_25_a 139,0,2
-job_sword1.gat,161,163,4 duplicate(3_blank) 3_blank_25_b 139,0,2
-job_sword1.gat,168,175,4 duplicate(3_blank) 3_blank_26_a 139,0,2
-job_sword1.gat,169,175,4 duplicate(3_blank) 3_blank_26_b 139,0,2
-job_sword1.gat,168,162,4 duplicate(3_blank) 3_blank_27_a 139,0,2
-job_sword1.gat,169,162,4 duplicate(3_blank) 3_blank_27_b 139,0,2
-job_sword1.gat,176,174,4 duplicate(3_blank) 3_blank_28_a 139,0,2
-job_sword1.gat,177,174,4 duplicate(3_blank) 3_blank_28_b 139,0,2
-job_sword1.gat,178,173,4 duplicate(3_blank) 3_blank_28_c 139,1,0
-job_sword1.gat,178,172,4 duplicate(3_blank) 3_blank_28_d 139,1,0
-job_sword1.gat,181,174,4 duplicate(3_blank) 3_blank_28_e 139,2,0
-job_sword1.gat,179,169,4 duplicate(3_blank) 3_blank_29_a 139,3,0
-job_sword1.gat,179,168,4 duplicate(3_blank) 3_blank_29_b 139,3,0
-job_sword1.gat,182,169,4 duplicate(3_blank) 3_blank_29_c 139,0,2
-job_sword1.gat,183,169,4 duplicate(3_blank) 3_blank_29_d 139,0,2
-job_sword1.gat,181,167,4 duplicate(3_blank) 3_blank_29_e 139,1,0
-job_sword1.gat,181,166,4 duplicate(3_blank) 3_blank_29_f 139,1,0
-job_sword1.gat,183,167,4 duplicate(3_blank) 3_blank_29_g 139,0,1
-job_sword1.gat,176,163,4 duplicate(3_blank) 3_blank_30_a 139,0,2
-job_sword1.gat,177,163,4 duplicate(3_blank) 3_blank_30_b 139,0,2
-job_sword1.gat,181,163,4 duplicate(3_blank) 3_blank_30_c 139,2,0
-
-// == Monsters ==
-//Spawn is included in this file so make shure its not elsewhere to!
-job_sword1.gat,35,78,0,0 monster Fabre 1184,4,0,0,0
-job_sword1.gat,50,108,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,61,28,0,0 monster Fabre 1184,4,0,0,0
-job_sword1.gat,61,92,0,0 monster Fabre 1184,2,0,0,0
-//
-job_sword1.gat,110,112,0,0 monster Fabre 1184,3,0,0,0
-job_sword1.gat,161,94,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,130,76,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,103,58,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,130,24,0,0 monster Fabre 1184,3,0,0,0
-//
-job_sword1.gat,201,36,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,201,16,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,239,44,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,239,76,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,231,101,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,234,117,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,198,91,0,0 monster Fabre 1184,2,0,0,0
-job_sword1.gat,200,63,0,0 monster Fabre 1184,2,0,0,0
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_sword1.gat mapflag nomemo
-job_sword1.gat mapflag noteleport
-job_sword1.gat mapflag nosave SavePoint
-job_sword1.gat mapflag nopenalty
-job_sword1.gat mapflag nobranch
-job_sword1.gat mapflag noexp
-job_sword1.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Swordsman Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.7.1
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working. I have created a custom warp to get into the test room so disable
+//= the one in your warp script or scripts. It is this warp: "izlude_in.gat",40,170.
+//= 1.1 Added instant job change for High Novice [Lupus]
+//= 1.3 Added Baby Class support [Lupus]
+//= 1.4 Changed the timing system to initnpctimer, now you do get warnings about time
+//= and are limited to 7min to complete the quest [Fredzilla]
+//= 1.5 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= 1.5.1 Fixed possible EXP abuse [Lupus]
+//= 1.5.2 Now saves/restores all quest skills [Lupus]
+//= 1.5.3 Removed Duplicates [Silent]
+//= 1.6 Merged back JFunc, CHANGED NUMBERS TO CONSTANTS [Lupus]
+//= 1.7 changed location from its clone to the original [Lupus]
+//= 1.7.1 Fixed warp on timeout [KarLaeda]
+//============================================================
+
+
+// == Npcs ==
+// -- Master Swordsman --
+izlude_in.gat,74,172,5 script Master Swordsman 119,{
+ callfunc "F_ToHigh",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Master Swordsman";
+ mes "[Master Swordsman]";
+ if(BaseJob == Job_Novice && job_sword_q == 2) goto L_Done;
+ mes "Welcome to the Swordsman Association! So.. What business brings you to us?";
+L_Menu:
+ next;
+ menu "Make me a Swordsman!",M_0,"About being a Swordsman.",M_1,"The job requirements.",M_2,"Cancel.",M_End;
+ close;
+
+ M_0:
+ mes "[Master Swordsman]";
+ if(BaseJob == Job_Swordman) {
+ mes "Muhahaha! You must be kidding me! You're already a swordsman.";
+ emotion e_heh;
+ close;
+ }
+ if(BaseJob != Job_Novice) {
+ mes "Im sorry but you can not hold more than one job at a time and therefore I must refuse your request.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Try picking up a hobby to make use of your spare time. Muhahahahah!!";
+ emotion e_heh;
+ close;
+ }
+ mes "So you wish to become a Swordsman aye? A very good choice!! Fill out this application form first.";
+ next;
+ mes "..(you fill out the form and hand it to him)..";
+ next;
+ mes "[Master Swordsman]";
+ if(JobLevel < 10) {
+ mes "A hem...., you have yet to learn all of the 'Basic Skills' needed to become a Swordsman. Please check the requirements again.";
+ close;
+ }
+
+ set job_sword_q,1;
+ savepoint "izlude_in.gat",65,165;
+ mes "Okay. Let me just review your information......";
+ next;
+ mes "[Master Swordsman]";
+ mes "Ah!! I see that you have met the necessary requirements.....";
+ next;
+ mes "[Master Swordsman]";
+ mes "But there is one last thing you need to do to before I can make you an offical Swordsman.";
+ mes "You must prove your valour by taking the Izlude Swordsman Test!!!";
+ next;
+ mes "[Master Swordsman]";
+ mes "Are you willing to do so?";
+ next;
+ menu "Yes.",sM_0,"No.",sM_1;
+
+ sM_0:
+ mes "[Master Swordsman]";
+ mes "Very good!!! The testing room is too my right.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Good luck young warrior!!!";
+ close;
+
+ sM_1:
+ mes "[Master Swordsman]";
+ mes "Very well then. Your registration is complete. When you are ready to take the test, just enter the testing room to my right.";
+ close;
+
+ M_1:
+ mes "[Master Swordsman]";
+ mes "So you wish to know about the Swordsman profession... very good then! I will explain it to you.";
+ next;
+ mes "[Master Swordsman]";
+ mes "The primary advantage of being a Swordsman is that you will become superior in pure strength and mele combat compared with those in the other professions.";
+ next;
+ mes "[Master Swordsman]";
+ mes "There are 3 reasons why the swordsman is unparalled in hand to hand combat v.s. those of the other job types!";
+ next;
+ mes "[Master Swordsman]";
+ mes " - 1st, the swordsman has a skill that gives him/her an excellent hp regeration rate.";
+ mes " - 2nd, the swordsman is capable of using more kinds of weapons than those in the other job types.";
+ mes " - 3rd, Most of the swordsman's skills enhance and increase physical attacks making him/her an elite warrior.";
+ next;
+ mes "[Master Swordsman]";
+ mes "A Simple but adequte explanation for a newbie like you.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Aside from this, in my personal opinion, being a 'Swordsman' is greatest job in all the land!";
+ mes "Muhahahah!!!";
+ emotion e_heh;
+ goto L_Menu;
+
+ M_2:
+ mes "[Master Swordsman]";
+ mes "So you wish to become a swordsman....";
+ next;
+ if(BaseJob == Job_Novice) goto O_2a;
+ if(BaseJob == Job_Swordman) {
+ mes "[Master Swordsman]";
+ mes "....but you're already a Swordsman...????";
+ emotion e_hmm;
+ close;
+ }
+ mes "[Master Swordsman]";
+ mes "But you already have another job.... it's too late for you to become a Swordsman.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Still you seek knowledge about the Swordsman proffession ay?... very well then....";
+ next;
+
+ O_2a:
+ mes "[Master Swordsman]";
+ mes "First, You must learn all 9 Basic Skills. If you can't satisfy this condition, you won't be able to become anything.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Secondly you must pass the legendary Izlude Swordsman Test.";
+ next;
+ mes "[Master Swordsman]";
+ mes "When you fullfill these 2 conditions, you can become an offical Swordsman.";
+ goto L_Menu;
+
+ M_End:
+ mes "[Master Swordsman]";
+ mes "Enjoy your youth before you lose it~~ Muhahahaha!!!!";
+ emotion e_heh;
+ close;
+
+L_Done:
+ mes "Let me see here....so you've past the test aye??....";
+ next;
+ if(SkillPoint > 0) goto L_Skillpt;
+ mes "[Master Swordsman]";
+ mes "Congratulations! Now you are now fully qualified to become a Real Swordsman! I will transform you right away!!";
+ next;
+ callfunc "Job_Change",Job_Swordman;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Master Swordsman]";
+ mes "As you set forth on your journey I will expect you to represent the Swordsman Assosiation of Izlude with great honor and integrity.";
+ next;
+ mes "[Master Swordsman]";
+ mes "Muhahahaha!!!";
+ close;
+
+ L_Skillpt:
+ mes "[Master Swordsman]";
+ mes "Hmm... just a momement... it seems you still have skill points left over.";
+ mes "Please use them up so that I can make you a Swordsman.";
+ close;
+}
+
+// == Warp ==
+// -- Warp to test room --
+izlude_in.gat,62,170,0 script w1039 45,1,1,{
+ if(BaseJob == Job_Novice && job_sword_q > 0) warp "izlude_in.gat",40,170;
+ if(job_sword_q == 0) doevent "Swordsman#02::OnStart";
+ end;
+}
+
+// -- Swordsman --
+izlude_in.gat,65,171,5 script Swordsman#01 85,{
+ doevent "Swordsman#02::OnStart";
+ end;
+}
+
+// -- Hidden Npc --
+izlude_in.gat,65,171,5 script Swordsman#02 -1,{
+
+OnStart:
+ mes "[Swordsman]";
+ if(BaseJob == Job_Swordman) goto L_Sword;
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Who might you be?! Those who are not Novices are not permitted to go in! Please leave.";
+ emotion e_what;
+ close;
+L_Sword:
+ mes "You're already a Swordsman!! You don't need to take this silly test!";
+ emotion e_gasp;
+ close;
+
+L_Novice:
+ if(job_sword_q == 1) goto L_Start;
+ if(job_sword_q == 2) goto L_Done;
+
+ mes "Halt! Do you want to take the Swordsman Test?";
+ mes "If so, please fill out the swordsman application first.";
+ mes "Speak with the 'Master Swordsman' for more information.";
+ emotion e_gasp;
+ close;
+
+ L_Start:
+ mes "Please enter the testing room when you are ready. Good luck!";
+ close;
+
+ L_Done:
+ mes "Speak with the Master Swordsman so that he can make you a Swordsman.";
+ close;
+}
+
+// -- Test Guide --
+izlude_in.gat,30,175,4 script Test Guide 92,{
+ mes "[Test Guide]";
+ mes "I will tell you about the legendary Izlude Swordsman Test! Listen VERY CAREFULLY for I won't repeat this again!";
+ next;
+ mes "[Test Guide]";
+ mes "The purpose of this test is to decide wheather or not you qualify to become a Swordsman.";
+ mes "As you know, a Swordsman needs superior physical Strength as well as an iron will!";
+ mes "If you possess neither of these attributes you will surely fail this grueling test.";
+ next;
+ mes "[Test Guide]";
+ mes "The objective of the test is very simple!";
+ next;
+ mes "[Test Guide]";
+ mes "You need to make through an obsticale course within ^FF00007 minutes^000000 in order to pass.";
+ next;
+ mes "[Test Guide]";
+ mes "The obsticale course is made up of 3 parts and is littered with booby-traps so be carefull!";
+ mes "Some traps will reduce your HP while others will warp you to an random underground cave causing you to start over.";
+ next;
+ mes "[Test Guide]";
+ mes "If you `Surrender' or if you excede the 'time limit', you will be fail the test.";
+ next;
+ mes "[Test Guide]";
+ mes "That is everything you need to know in order to take the test.";
+ mes "May God bless you.";
+ close;
+}
+
+
+// -- Test Hall Staff 1 --
+izlude_in.gat,30,163,8 script Test Hall Staff 105,{
+ mes "[Test Hall Staff]";
+ if(SWTEST == 1) goto L_Option2;
+ if(SWTEST >= 2) goto L_Option3;
+ set SWTEST, 0;
+
+ mes " So you want to take the test huh? You look confident.. that's good. Stay relaxed and do your best. This is not a difficult test.";
+ next;
+ mes "[Test Hall Staff]";
+ mes "Are you ready?";
+ next;
+ menu "Let me at it!!",-,"Ah..maybe later..",M_no;
+
+ M_yes:
+ set SWTEST, SWTEST + 1;
+ savepoint "izlude_in.gat",39,170;
+ stopnpctimer;
+ initnpctimer "TimerSwrdmn";
+ warp "job_sword1.gat",10,245;
+ end;
+
+ M_no:
+ mes "[Test Hall Staff]";
+ mes "Check back with me when you are ready.";
+ close;
+
+L_Option2:
+ mes "Taking the test over?.... Keep your head up. I like those who never back down from a challange! Now take this and cheer up!";
+ getitem 512,3;//Items: Apple,
+ next;
+ goto M_yes;
+ end;
+L_Option3:
+ mes "Don't give up! I know you will pass this time!";
+ mes "(you catch him whispering '...loooooseerrr...')";
+ getitem 512,5;//Items: Apple,
+ next;
+ goto M_yes;
+ end;
+}
+job_sword1.gat,1,1,0 script TimerSwrdmn -1,{
+ OnTimer4000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: Your 7 minutes starts now!",0;
+ end;
+ OnTimer184000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 4 minutes left!",0;
+ end;
+ OnTimer304000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 2 minutes left!",0;
+ end;
+ OnTimer364000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 1 minutes left!",0;
+ end;
+ OnTimer394000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: You have 30 seconds left, hurry!",0;
+ end;
+ OnTimer424000:
+ areaannounce "job_sword1.gat", 0, 0, 400, 400, "[Test Hall Staff]: Your times up! You failed the test.",0;
+ end;
+ OnTimer428000:
+ stopnpctimer;
+ areawarp "job_sword1.gat",0,0,400,400,"izlude_in.gat",39,170;
+ end;
+}
+
+
+// -- Medic 1 --
+job_sword1.gat,230,245,2 script Medic#01 105,{
+ mes "[Medic]";
+ mes "This is the 1st check point! You're doing great!";
+ percentheal 100, 100;
+ close;
+}
+
+// -- Test Hall Staff 2 --
+job_sword1.gat,230,242,2 script Test Hall Staff#01 105,{
+ mes "[Test Hall Staff]";
+ mes "Do you surrender?";
+ next;
+ menu "Yes.",M_0,"No.",M_1;
+
+ M_0:
+ warp "izlude_in.gat",65,165;
+ close;
+ M_1:
+ mes "[Test Hall Staff]";
+ mes "Bravo! Go for it again!";
+ close;
+}
+
+// -- Medic 2 --
+job_sword1.gat,230,207,2 script Medic#02 105,{
+ mes "[Medic]";
+ mes "This is the 2nd check point! Keep up the good work!";
+ percentheal 100, 100;
+ close;
+}
+
+// -- Test Hall Staff 3 --
+job_sword1.gat,230,204,2 script Test Hall Staff#02 105,{
+ mes "[Test Hall Staff]";
+ mes "Do you surrender?";
+ next;
+ menu "Yes.",M_0,"No.",M_1;
+
+ M_0:
+ warp "izlude_in.gat",65,165;
+ close;
+ M_1:
+ mes "[Test Hall Staff]";
+ mes "Bravo! Go for it again!";
+ close;
+}
+
+// -- Mae (Medic 3) --
+job_sword1.gat,223,167,2 script Mae 92,{
+ mes "[Mae]";
+ mes "I sincerely congratulate you for passing the test!";
+ mes "I've already sent your test results to the 'Master Swordsman'.";
+ mes "Please inquire with him about your results. Thank you.";
+ next;
+ stopnpctimer "TimerSwrdmn";
+ percentheal 100, 100;
+ set job_sword_q,2;
+ set SWTEST,0;
+ warp "izlude_in.gat",66,173;
+ close;
+}
+
+
+
+
+// == Green Traps ==
+// reduce hp when stepped on
+
+// -- First Section --
+// - Left -
+job_sword1.gat,22,172,1 script 1green_1::green 139,0,0,{
+ heal (-4),0;
+ end;
+}
+
+// -- Duplicates --
+job_sword1.gat,22,173,1 duplicate(green) 1green_2 139,0,0
+job_sword1.gat,23,172,1 duplicate(green) 1green_3 139,0,0
+job_sword1.gat,23,173,1 duplicate(green) 1green_4 139,0,0
+job_sword1.gat,34,172,1 duplicate(green) 1green_5 139,0,0
+job_sword1.gat,34,173,1 duplicate(green) 1green_6 139,0,0
+job_sword1.gat,35,172,1 duplicate(green) 1green_7 139,0,0
+job_sword1.gat,35,173,1 duplicate(green) 1green_8 139,0,0
+job_sword1.gat,66,170,1 duplicate(green) 1green_9 139,0,0
+job_sword1.gat,66,171,1 duplicate(green) 1green_10 139,0,0
+job_sword1.gat,67,170,1 duplicate(green) 1green_11 139,0,0
+job_sword1.gat,67,171,1 duplicate(green) 1green_12 139,0,0
+job_sword1.gat,70,170,1 duplicate(green) 1green_13 139,0,0
+job_sword1.gat,70,171,1 duplicate(green) 1green_14 139,0,0
+job_sword1.gat,71,170,1 duplicate(green) 1green_15 139,0,0
+job_sword1.gat,71,171,1 duplicate(green) 1green_16 139,0,0
+
+// - Right -
+job_sword1.gat,22,164,1 duplicate(green) 1green_17 139,0,0
+job_sword1.gat,22,165,1 duplicate(green) 1green_18 139,0,0
+job_sword1.gat,23,164,1 duplicate(green) 1green_19 139,0,0
+job_sword1.gat,23,165,1 duplicate(green) 1green_20 139,0,0
+job_sword1.gat,34,164,1 duplicate(green) 1green_21 139,0,0
+job_sword1.gat,34,165,1 duplicate(green) 1green_22 139,0,0
+job_sword1.gat,35,164,1 duplicate(green) 1green_23 139,0,0
+job_sword1.gat,35,165,1 duplicate(green) 1green_24 139,0,0
+job_sword1.gat,66,166,1 duplicate(green) 1green_25 139,0,0
+job_sword1.gat,66,167,1 duplicate(green) 1green_26 139,0,0
+job_sword1.gat,67,166,1 duplicate(green) 1green_27 139,0,0
+job_sword1.gat,67,167,1 duplicate(green) 1green_28 139,0,0
+job_sword1.gat,70,166,1 duplicate(green) 1green_29 139,0,0
+job_sword1.gat,70,167,1 duplicate(green) 1green_30 139,0,0
+job_sword1.gat,71,166,1 duplicate(green) 1green_31 139,0,0
+job_sword1.gat,71,167,1 duplicate(green) 1green_32 139,0,0
+// - Center -
+job_sword1.gat,86,168,1 duplicate(green) 1green_33 139,0,0
+job_sword1.gat,86,169,1 duplicate(green) 1green_34 139,0,0
+job_sword1.gat,87,168,1 duplicate(green) 1green_35 139,0,0
+job_sword1.gat,87,169,1 duplicate(green) 1green_36 139,0,0
+
+// -- Second Section --
+// - Left -
+job_sword1.gat,83,171,1 duplicate(green) 2green_1 139,0,1
+job_sword1.gat,82,171,1 duplicate(green) 2green_2 139,0,1
+job_sword1.gat,90,171,1 duplicate(green) 2green_3 139,0,1
+job_sword1.gat,91,171,1 duplicate(green) 2green_4 139,0,1
+job_sword1.gat,84,173,1 duplicate(green) 2green_5 139,1,0
+job_sword1.gat,90,173,1 duplicate(green) 2green_6 139,1,0
+job_sword1.gat,83,166,1 duplicate(green) 2green_7 139,0,1
+job_sword1.gat,82,166,1 duplicate(green) 2green_8 139,0,1
+job_sword1.gat,90,166,1 duplicate(green) 2green_9 139,0,1
+job_sword1.gat,91,166,1 duplicate(green) 2green_10 139,0,1
+job_sword1.gat,84,164,1 duplicate(green) 2green_11 139,1,0
+job_sword1.gat,90,164,1 duplicate(green) 2green_12 139,1,0
+job_sword1.gat,102,168,1 duplicate(green) 2green_13 139,0,0
+job_sword1.gat,102,169,1 duplicate(green) 2green_14 139,0,0
+// - Right -
+job_sword1.gat,102,172,1 duplicate(green) 2green_15 139,0,0
+job_sword1.gat,102,173,1 duplicate(green) 2green_16 139,0,0
+job_sword1.gat,103,172,1 duplicate(green) 2green_17 139,0,0
+job_sword1.gat,103,173,1 duplicate(green) 2green_18 139,0,0
+job_sword1.gat,106,172,1 duplicate(green) 2green_19 139,0,0
+job_sword1.gat,106,173,1 duplicate(green) 2green_20 139,0,0
+job_sword1.gat,107,172,1 duplicate(green) 2green_21 139,0,0
+job_sword1.gat,107,173,1 duplicate(green) 2green_22 139,0,0
+job_sword1.gat,110,172,1 duplicate(green) 2green_23 139,0,0
+job_sword1.gat,110,173,1 duplicate(green) 2green_24 139,0,0
+job_sword1.gat,111,172,1 duplicate(green) 2green_25 139,0,0
+job_sword1.gat,111,173,1 duplicate(green) 2green_26 139,0,0
+// - Center -
+job_sword1.gat,102,164,1 duplicate(green) 2green_27 139,0,0
+job_sword1.gat,102,165,1 duplicate(green) 2green_28 139,0,0
+job_sword1.gat,103,164,1 duplicate(green) 2green_29 139,0,0
+job_sword1.gat,103,165,1 duplicate(green) 2green_30 139,0,0
+job_sword1.gat,106,164,1 duplicate(green) 2green_31 139,0,0
+job_sword1.gat,106,165,1 duplicate(green) 2green_32 139,0,0
+job_sword1.gat,107,164,1 duplicate(green) 2green_33 139,0,0
+job_sword1.gat,107,165,1 duplicate(green) 2green_34 139,0,0
+job_sword1.gat,110,164,1 duplicate(green) 2green_35 139,0,0
+job_sword1.gat,110,165,1 duplicate(green) 2green_36 139,0,0
+job_sword1.gat,111,164,1 duplicate(green) 2green_37 139,0,0
+job_sword1.gat,111,165,1 duplicate(green) 2green_38 139,0,0
+
+
+// -- Third Section --
+job_sword1.gat,121,172,1 duplicate(green) 3green_1 139,2,0
+job_sword1.gat,121,173,1 duplicate(green) 3green_2 139,2,0
+job_sword1.gat,121,164,1 duplicate(green) 3green_3 139,2,0
+job_sword1.gat,121,165,1 duplicate(green) 3green_4 139,2,0
+job_sword1.gat,121,168,1 duplicate(green) 3green_5 139,2,0
+job_sword1.gat,121,169,1 duplicate(green) 3green_6 139,2,0
+
+// -- Fourth Section --
+job_sword1.gat,130,169,1 duplicate(green) 4green_1 139,0,4
+job_sword1.gat,131,169,1 duplicate(green) 4green_2 139,0,4
+job_sword1.gat,135,164,1 duplicate(green) 4green_3 139,5,0
+job_sword1.gat,136,165,1 duplicate(green) 4green_4 139,4,0
+job_sword1.gat,140,169,1 duplicate(green) 4green_5 139,0,3
+job_sword1.gat,141,168,1 duplicate(green) 4green_6 139,0,4
+job_sword1.gat,137,172,1 duplicate(green) 4green_7 139,2,0
+job_sword1.gat,138,173,1 duplicate(green) 4green_8 139,3,0
+job_sword1.gat,134,171,1 duplicate(green) 4green_9 139,0,2
+job_sword1.gat,135,168,1 duplicate(green) 4green_10 139,0,1
+job_sword1.gat,135,170,1 duplicate(green) 4green_11 139,1,0
+
+// -- Fifth Section --
+job_sword1.gat,144,169,1 duplicate(green) 5green_1 139,0,4
+job_sword1.gat,145,169,1 duplicate(green) 5green_2 139,0,4
+job_sword1.gat,148,164,1 duplicate(green) 5green_3 139,4,0
+job_sword1.gat,149,165,1 duplicate(green) 5green_4 139,3,0
+job_sword1.gat,156,166,1 duplicate(green) 5green_5 139,0,2
+job_sword1.gat,157,166,1 duplicate(green) 5green_6 139,0,2
+job_sword1.gat,153,169,1 duplicate(green) 5green_7 139,4,0
+job_sword1.gat,152,168,1 duplicate(green) 5green_8 139,3,0
+job_sword1.gat,149,171,1 duplicate(green) 5green_9 139,0,1
+job_sword1.gat,148,171,1 duplicate(green) 5green_10 139,0,2
+job_sword1.gat,154,173,1 duplicate(green) 5green_11 139,2,0
+job_sword1.gat,154,172,1 duplicate(green) 5green_12 139,2,0
+
+// -- Last Section --
+job_sword1.gat,164,172,1 duplicate(green) 6green_1 139,0,0
+job_sword1.gat,164,173,1 duplicate(green) 6green_2 139,0,0
+job_sword1.gat,165,172,1 duplicate(green) 6green_3 139,0,0
+job_sword1.gat,165,173,1 duplicate(green) 6green_4 139,0,0
+job_sword1.gat,172,172,1 duplicate(green) 6green_5 139,0,0
+job_sword1.gat,172,173,1 duplicate(green) 6green_6 139,0,0
+job_sword1.gat,173,172,1 duplicate(green) 6green_7 139,0,0
+job_sword1.gat,173,173,1 duplicate(green) 6green_8 139,0,0
+
+job_sword1.gat,164,168,1 duplicate(green) 6green_9 139,0,0
+job_sword1.gat,164,169,1 duplicate(green) 6green_10 139,0,0
+job_sword1.gat,165,168,1 duplicate(green) 6green_11 139,0,0
+job_sword1.gat,165,169,1 duplicate(green) 6green_12 139,0,0
+job_sword1.gat,172,168,1 duplicate(green) 6green_13 139,0,0
+job_sword1.gat,172,169,1 duplicate(green) 6green_14 139,0,0
+job_sword1.gat,173,168,1 duplicate(green) 6green_15 139,0,0
+job_sword1.gat,173,169,1 duplicate(green) 6green_16 139,0,0
+
+job_sword1.gat,164,164,1 duplicate(green) 6green_17 139,0,0
+job_sword1.gat,164,165,1 duplicate(green) 6green_18 139,0,0
+job_sword1.gat,165,164,1 duplicate(green) 6green_19 139,0,0
+job_sword1.gat,165,165,1 duplicate(green) 6green_20 139,0,0
+job_sword1.gat,172,164,1 duplicate(green) 6green_21 139,0,0
+job_sword1.gat,172,165,1 duplicate(green) 6green_22 139,0,0
+job_sword1.gat,173,164,1 duplicate(green) 6green_23 139,0,0
+job_sword1.gat,173,165,1 duplicate(green) 6green_24 139,0,0
+
+
+
+// == Fall Warps ==
+
+job_sword1.gat,16,251,4 script 1_blank_1a#1::1_blank 139,0,1,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "job_sword1.gat",65,56;
+ if (@TEMP==1) warp "job_sword1.gat",29,26;
+ if (@TEMP==2) warp "job_sword1.gat",43,16;
+ if (@TEMP==3) warp "job_sword1.gat",23,112;
+ if (@TEMP==4) warp "job_sword1.gat",58,83;
+ end;
+}
+
+// -- Duplicates --
+job_sword1.gat,19,251,4 duplicate(1_blank) 1_blank_1b 139,0,1
+job_sword1.gat,17,250,4 duplicate(1_blank) 1_blank_1c 139,1,0
+job_sword1.gat,17,251,4 duplicate(1_blank) 1_blank_1d 139,1,1
+job_sword1.gat,18,251,4 duplicate(1_blank) 1_blank_1e 139,1,1
+job_sword1.gat,17,251,4 duplicate(1_blank) 1_blank_1f 139,1,1
+job_sword1.gat,16,238,4 duplicate(1_blank) 1_blank_2a 139,0,1
+job_sword1.gat,19,238,4 duplicate(1_blank) 1_blank_2b 139,0,1
+job_sword1.gat,17,239,4 duplicate(1_blank) 1_blank_2c 139,0,1
+job_sword1.gat,28,246,4 duplicate(1_blank) 1_blank_3a 139,4,1
+job_sword1.gat,33,245,4 duplicate(1_blank) 1_blank_3b 139,0,2
+job_sword1.gat,29,242,4 duplicate(1_blank) 1_blank_3c 139,4,0
+job_sword1.gat,24,244,4 duplicate(1_blank) 1_blank_3d 139,0,2
+job_sword1.gat,38,251,4 duplicate(1_blank) 1_blank_4a 139,0,1
+job_sword1.gat,41,251,4 duplicate(1_blank) 1_blank_4b 139,0,1
+job_sword1.gat,39,250,4 duplicate(1_blank) 1_blank_4c 139,1,0
+job_sword1.gat,38,238,4 duplicate(1_blank) 1_blank_5a 139,0,1
+job_sword1.gat,41,238,4 duplicate(1_blank) 1_blank_5_b 139,0,1
+job_sword1.gat,39,239,4 duplicate(1_blank) 1_blank_5_c 139,1,0
+job_sword1.gat,54,251,4 duplicate(1_blank) 1_blank_6_a 139,0,1
+job_sword1.gat,71,251,4 duplicate(1_blank) 1_blank_6_b 139,0,1
+job_sword1.gat,62,250,4 duplicate(1_blank) 1_blank_6_c 139,9,0
+job_sword1.gat,62,247,4 duplicate(1_blank) 1_blank_7_a 139,8,0
+job_sword1.gat,71,244,4 duplicate(1_blank) 1_blank_7_b 139,0,2
+job_sword1.gat,63,242,4 duplicate(1_blank) 1_blank_7_c 139,8,0
+job_sword1.gat,54,244,4 duplicate(1_blank) 1_blank_7_d 139,0,2
+job_sword1.gat,54,238,4 duplicate(1_blank) 1_blank_8_a 139,0,1
+job_sword1.gat,71,238,4 duplicate(1_blank) 1_blank_8_b 139,0,1
+job_sword1.gat,62,239,4 duplicate(1_blank) 1_blank_8_c 139,9,0
+job_sword1.gat,102,247,4 duplicate(1_blank) 1_blank_9_a 139,2,0
+job_sword1.gat,105,245,4 duplicate(1_blank) 1_blank_9_b 139,0,2
+job_sword1.gat,103,242,4 duplicate(1_blank) 1_blank_9_c 139,2,0
+job_sword1.gat,100,244,4 duplicate(1_blank) 1_blank_9_d 139,0,2
+job_sword1.gat,156,249,4 duplicate(1_blank) 1_blank_10_a 139,14,0
+job_sword1.gat,156,248,4 duplicate(1_blank) 1_blank_10_b 139,14,0
+job_sword1.gat,170,249,4 duplicate(1_blank) 1_blank_10_c 139,1,0
+job_sword1.gat,170,248,4 duplicate(1_blank) 1_blank_10_d 139,1,0
+job_sword1.gat,156,245,4 duplicate(1_blank) 1_blank_11_a 139,14,0
+job_sword1.gat,156,244,4 duplicate(1_blank) 1_blank_11_b 139,14,0
+job_sword1.gat,170,245,4 duplicate(1_blank) 1_blank_11_c 139,1,0
+job_sword1.gat,170,244,4 duplicate(1_blank) 1_blank_11_d 139,1,0
+job_sword1.gat,156,241,4 duplicate(1_blank) 1_blank_12_a 139,14,0
+job_sword1.gat,156,240,4 duplicate(1_blank) 1_blank_12_b 139,14,0
+job_sword1.gat,170,241,4 duplicate(1_blank) 1_blank_12_c 139,1,0
+job_sword1.gat,170,240,4 duplicate(1_blank) 1_blank_12_d 139,1,0
+job_sword1.gat,180,251,4 duplicate(1_blank) 1_blank_13_a 139,0,1
+job_sword1.gat,183,251,4 duplicate(1_blank) 1_blank_13_b 139,0,1
+job_sword1.gat,181,250,4 duplicate(1_blank) 1_blank_13_c 139,1,0
+job_sword1.gat,180,238,4 duplicate(1_blank) 1_blank_14_a 139,0,1
+job_sword1.gat,183,238,4 duplicate(1_blank) 1_blank_14_b 139,0,1
+job_sword1.gat,181,239,4 duplicate(1_blank) 1_blank_14_c 139,1,0
+
+
+job_sword1.gat,56,212,4 script 2_blank_1_a::2_blank 139,40,0,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "job_sword1.gat",162,120;
+ if (@TEMP==1) warp "job_sword1.gat",94,120;
+ if (@TEMP==2) warp "job_sword1.gat",94,85;
+ if (@TEMP==3) warp "job_sword1.gat",162,85;
+ if (@TEMP==4) warp "job_sword1.gat",130,47;
+ end;
+}
+
+// -- Duplicates --
+job_sword1.gat,95,212,4 duplicate(2_blank) 2_blank_1_b 139,2,0
+job_sword1.gat,56,210,4 duplicate(2_blank) 2_blank_2_a 139,40,0
+job_sword1.gat,95,210,4 duplicate(2_blank) 2_blank_2_b 139,2,0
+job_sword1.gat,16,206,4 duplicate(2_blank) 2_blank_2_c 139,0,3
+job_sword1.gat,97,206,4 duplicate(2_blank) 2_blank_2_d 139,0,3
+job_sword1.gat,56,203,4 duplicate(2_blank) 2_blank_2_e 139,40,0
+job_sword1.gat,95,203,4 duplicate(2_blank) 2_blank_2_f 139,2,0
+job_sword1.gat,56,201,4 duplicate(2_blank) 2_blank_3_a 139,40,0
+job_sword1.gat,95,201,4 duplicate(2_blank) 2_blank_3_b 139,2,0
+
+// - part 2 -
+job_sword1.gat,113,212,4 duplicate(2_blank) 2_blank_4_a 139,14,0
+job_sword1.gat,125,212,4 duplicate(2_blank) 2_blank_4_b 139,2,0
+job_sword1.gat,113,210,4 duplicate(2_blank) 2_blank_5_a 139,14,0
+job_sword1.gat,125,210,4 duplicate(2_blank) 2_blank_5_b 139,2,0
+job_sword1.gat,100,206,4 duplicate(2_blank) 2_blank_5_c 139,0,3
+job_sword1.gat,127,206,4 duplicate(2_blank) 2_blank_5_d 139,0,3
+job_sword1.gat,113,203,4 duplicate(2_blank) 2_blank_5_e 139,14,0
+job_sword1.gat,125,210,4 duplicate(2_blank) 2_blank_5_f 139,2,0
+job_sword1.gat,113,201,4 duplicate(2_blank) 2_blank_6_a 139,14,0
+job_sword1.gat,113,201,4 duplicate(2_blank) 2_blank_6_b 139,2,0
+
+// - part 3 -
+job_sword1.gat,155,212,4 duplicate(2_blank) 2_blank_7_a 139,21,0
+job_sword1.gat,181,212,4 duplicate(2_blank) 2_blank_7_b 139,2,0
+job_sword1.gat,155,210,4 duplicate(2_blank) 2_blank_8_a 139,21,0
+job_sword1.gat,181,210,4 duplicate(2_blank) 2_blank_8_b 139,2,0
+job_sword1.gat,130,206,4 duplicate(2_blank) 2_blank_8_c 139,0,3
+job_sword1.gat,183,206,4 duplicate(2_blank) 2_blank_8_d 139,0,3
+job_sword1.gat,155,203,4 duplicate(2_blank) 2_blank_8_e 139,21,0
+job_sword1.gat,181,203,4 duplicate(2_blank) 2_blank_8_f 139,2,0
+job_sword1.gat,155,201,4 duplicate(2_blank) 2_blank_9_a 139,40,0
+job_sword1.gat,181,201,4 duplicate(2_blank) 2_blank_9_b 139,2,0
+
+job_sword1.gat,17,174,4 script 3_blank_1_a::3_blank 139,2,0,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "job_sword1.gat",195,15;
+ if (@TEMP==1) warp "job_sword1.gat",195,38;
+ if (@TEMP==2) warp "job_sword1.gat",231,30;
+ if (@TEMP==3) warp "job_sword1.gat",198,65;
+ if (@TEMP==4) warp "job_sword1.gat",196,116;
+ end;
+}
+
+// -- Duplicates --
+job_sword1.gat,17,163,4 duplicate(3_blank) 3_blank_2_a 139,2,0
+job_sword1.gat,29,171,4 duplicate(3_blank) 3_blank_3_a 139,2,0
+job_sword1.gat,31,168,4 duplicate(3_blank) 3_blank_3_b 139,0,2
+job_sword1.gat,28,166,4 duplicate(3_blank) 3_blank_3_c 139,2,0
+job_sword1.gat,26,168,4 duplicate(3_blank) 3_blank_3_d 139,0,2
+job_sword1.gat,36,169,4 duplicate(3_blank) 3_blank_4_a 139,0,0
+job_sword1.gat,37,169,4 duplicate(3_blank) 3_blank_4_b 139,0,0
+job_sword1.gat,37,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
+job_sword1.gat,36,168,4 duplicate(3_blank) 3_blank_4_d 139,0,0
+job_sword1.gat,40,175,4 duplicate(3_blank) 3_blank_5_a 139,0,1
+job_sword1.gat,41,175,4 duplicate(3_blank) 3_blank_5_b 139,0,1
+job_sword1.gat,41,171,4 duplicate(3_blank) 3_blank_6_a 139,1,0
+job_sword1.gat,41,170,4 duplicate(3_blank) 3_blank_6_b 139,1,0
+job_sword1.gat,41,167,4 duplicate(3_blank) 3_blank_6_c 139,1,0
+job_sword1.gat,41,166,4 duplicate(3_blank) 3_blank_6_d 139,1,0
+job_sword1.gat,42,169,4 duplicate(3_blank) 3_blank_6_e 139,0,1
+job_sword1.gat,43,170,4 duplicate(3_blank) 3_blank_6_f 139,0,1
+job_sword1.gat,43,167,4 duplicate(3_blank) 3_blank_6_g 139,0,1
+job_sword1.gat,40,162,4 duplicate(3_blank) 3_blank_7_a 139,0,1
+job_sword1.gat,41,162,4 duplicate(3_blank) 3_blank_7_b 139,0,1
+job_sword1.gat,46,175,4 duplicate(3_blank) 3_blank_8_a 139,0,1
+job_sword1.gat,51,175,4 duplicate(3_blank) 3_blank_8_b 139,0,1
+job_sword1.gat,47,174,4 duplicate(3_blank) 3_blank_8_c 139,1,0
+job_sword1.gat,50,174,4 duplicate(3_blank) 3_blank_8_d 139,1,0
+job_sword1.gat,48,173,4 duplicate(3_blank) 3_blank_8_e 139,0,1
+job_sword1.gat,49,173,4 duplicate(3_blank) 3_blank_8_f 139,0,1
+job_sword1.gat,46,162,4 duplicate(3_blank) 3_blank_9_a 139,0,1
+job_sword1.gat,51,162,4 duplicate(3_blank) 3_blank_9_b 139,0,1
+job_sword1.gat,47,163,4 duplicate(3_blank) 3_blank_9_c 139,1,0
+job_sword1.gat,50,163,4 duplicate(3_blank) 3_blank_9_d 139,1,0
+job_sword1.gat,48,164,4 duplicate(3_blank) 3_blank_9_e 139,0,1
+job_sword1.gat,49,164,4 duplicate(3_blank) 3_blank_9_f 139,0,1
+job_sword1.gat,54,170,4 duplicate(3_blank) 3_blank_10_a 139,0,1
+job_sword1.gat,55,170,4 duplicate(3_blank) 3_blank_10_b 139,0,1
+job_sword1.gat,54,167,4 duplicate(3_blank) 3_blank_10_c 139,0,1
+job_sword1.gat,55,167,4 duplicate(3_blank) 3_blank_10_d 139,0,1
+job_sword1.gat,53,169,4 duplicate(3_blank) 3_blank_10_e 139,1,0
+job_sword1.gat,53,168,4 duplicate(3_blank) 3_blank_10_f 139,1,0
+job_sword1.gat,56,169,4 duplicate(3_blank) 3_blank_10_g 139,1,0
+job_sword1.gat,56,168,4 duplicate(3_blank) 3_blank_10_h 139,1,0
+job_sword1.gat,58,175,4 duplicate(3_blank) 3_blank_11_a 139,0,1
+job_sword1.gat,59,174,4 duplicate(3_blank) 3_blank_11_b 139,1,0
+job_sword1.gat,60,173,4 duplicate(3_blank) 3_blank_11_c 139,0,1
+job_sword1.gat,61,172,4 duplicate(3_blank) 3_blank_11_d 139,1,0
+job_sword1.gat,58,162,4 duplicate(3_blank) 3_blank_12_a 139,0,1
+job_sword1.gat,59,163,4 duplicate(3_blank) 3_blank_12_b 139,1,0
+job_sword1.gat,60,164,4 duplicate(3_blank) 3_blank_12_c 139,0,1
+job_sword1.gat,61,165,4 duplicate(3_blank) 3_blank_12_d 139,1,0
+job_sword1.gat,76,172,4 duplicate(3_blank) 3_blank_13_a 139,1,0
+job_sword1.gat,77,173,4 duplicate(3_blank) 3_blank_13_b 139,0,1
+job_sword1.gat,78,174,4 duplicate(3_blank) 3_blank_13_c 139,1,0
+job_sword1.gat,79,175,4 duplicate(3_blank) 3_blank_13_d 139,0,1
+job_sword1.gat,76,165,4 duplicate(3_blank) 3_blank_14_a 139,1,0
+job_sword1.gat,77,164,4 duplicate(3_blank) 3_blank_14_b 139,0,1
+job_sword1.gat,78,163,4 duplicate(3_blank) 3_blank_14_c 139,1,0
+job_sword1.gat,79,162,4 duplicate(3_blank) 3_blank_14_d 139,0,1
+job_sword1.gat,94,175,4 duplicate(3_blank) 3_blank_15_a 139,0,1
+job_sword1.gat,95,174,4 duplicate(3_blank) 3_blank_15_b 139,1,0
+job_sword1.gat,98,174,4 duplicate(3_blank) 3_blank_15_c 139,1,0
+job_sword1.gat,99,175,4 duplicate(3_blank) 3_blank_16_d 139,0,1
+job_sword1.gat,96,169,4 duplicate(3_blank) 3_blank_17_a 139,0,0
+job_sword1.gat,97,169,4 duplicate(3_blank) 3_blank_17_b 139,0,0
+job_sword1.gat,97,168,4 duplicate(3_blank) 3_blank_17_c 139,0,0
+job_sword1.gat,96,168,4 duplicate(3_blank) 3_blank_17_d 139,0,0
+job_sword1.gat,94,162,4 duplicate(3_blank) 3_blank_18_a 139,0,1
+job_sword1.gat,95,163,4 duplicate(3_blank) 3_blank_18_b 139,1,0
+job_sword1.gat,98,163,4 duplicate(3_blank) 3_blank_18_c 139,1,0
+job_sword1.gat,99,162,4 duplicate(3_blank) 3_blank_18_d 139,0,1
+job_sword1.gat,114,175,4 duplicate(3_blank) 3_blank_19_a 139,0,1
+job_sword1.gat,115,175,4 duplicate(3_blank) 3_blank_19_b 139,0,1
+job_sword1.gat,114,162,4 duplicate(3_blank) 3_blank_20_a 139,0,1
+job_sword1.gat,115,162,4 duplicate(3_blank) 3_blank_20_b 139,0,1
+job_sword1.gat,126,175,4 duplicate(3_blank) 3_blank_21_a 139,0,1
+job_sword1.gat,127,175,4 duplicate(3_blank) 3_blank_21_b 139,0,1
+job_sword1.gat,126,162,4 duplicate(3_blank) 3_blank_23_a 139,0,1
+job_sword1.gat,127,162,4 duplicate(3_blank) 3_blank_23_b 139,0,1
+job_sword1.gat,160,174,4 duplicate(3_blank) 3_blank_24_a 139,0,2
+job_sword1.gat,161,174,4 duplicate(3_blank) 3_blank_24_b 139,0,2
+job_sword1.gat,160,163,4 duplicate(3_blank) 3_blank_25_a 139,0,2
+job_sword1.gat,161,163,4 duplicate(3_blank) 3_blank_25_b 139,0,2
+job_sword1.gat,168,175,4 duplicate(3_blank) 3_blank_26_a 139,0,2
+job_sword1.gat,169,175,4 duplicate(3_blank) 3_blank_26_b 139,0,2
+job_sword1.gat,168,162,4 duplicate(3_blank) 3_blank_27_a 139,0,2
+job_sword1.gat,169,162,4 duplicate(3_blank) 3_blank_27_b 139,0,2
+job_sword1.gat,176,174,4 duplicate(3_blank) 3_blank_28_a 139,0,2
+job_sword1.gat,177,174,4 duplicate(3_blank) 3_blank_28_b 139,0,2
+job_sword1.gat,178,173,4 duplicate(3_blank) 3_blank_28_c 139,1,0
+job_sword1.gat,178,172,4 duplicate(3_blank) 3_blank_28_d 139,1,0
+job_sword1.gat,181,174,4 duplicate(3_blank) 3_blank_28_e 139,2,0
+job_sword1.gat,179,169,4 duplicate(3_blank) 3_blank_29_a 139,3,0
+job_sword1.gat,179,168,4 duplicate(3_blank) 3_blank_29_b 139,3,0
+job_sword1.gat,182,169,4 duplicate(3_blank) 3_blank_29_c 139,0,2
+job_sword1.gat,183,169,4 duplicate(3_blank) 3_blank_29_d 139,0,2
+job_sword1.gat,181,167,4 duplicate(3_blank) 3_blank_29_e 139,1,0
+job_sword1.gat,181,166,4 duplicate(3_blank) 3_blank_29_f 139,1,0
+job_sword1.gat,183,167,4 duplicate(3_blank) 3_blank_29_g 139,0,1
+job_sword1.gat,176,163,4 duplicate(3_blank) 3_blank_30_a 139,0,2
+job_sword1.gat,177,163,4 duplicate(3_blank) 3_blank_30_b 139,0,2
+job_sword1.gat,181,163,4 duplicate(3_blank) 3_blank_30_c 139,2,0
+
+// == Monsters ==
+//Spawn is included in this file so make shure its not elsewhere to!
+job_sword1.gat,35,78,0,0 monster Fabre 1184,4,0,0,0
+job_sword1.gat,50,108,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,61,28,0,0 monster Fabre 1184,4,0,0,0
+job_sword1.gat,61,92,0,0 monster Fabre 1184,2,0,0,0
+//
+job_sword1.gat,110,112,0,0 monster Fabre 1184,3,0,0,0
+job_sword1.gat,161,94,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,130,76,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,103,58,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,130,24,0,0 monster Fabre 1184,3,0,0,0
+//
+job_sword1.gat,201,36,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,201,16,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,239,44,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,239,76,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,231,101,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,234,117,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,198,91,0,0 monster Fabre 1184,2,0,0,0
+job_sword1.gat,200,63,0,0 monster Fabre 1184,2,0,0,0
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_sword1.gat mapflag nomemo
+job_sword1.gat mapflag noteleport
+job_sword1.gat mapflag nosave SavePoint
+job_sword1.gat mapflag nopenalty
+job_sword1.gat mapflag nobranch
+job_sword1.gat mapflag noexp
+job_sword1.gat mapflag noloot
diff --git a/npc/jobs/1-1/thief.txt b/npc/jobs/1-1/thief.txt
index 62412614d..a86a673fe 100644
--- a/npc/jobs/1-1/thief.txt
+++ b/npc/jobs/1-1/thief.txt
@@ -1,460 +1,460 @@
-//===== eAthena Script =======================================
-//= Thief Job Quest
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.6a
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Added instant job change for High Novice [Lupus]
-//= 1.3 Added Baby Class support [Lupus]
-//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
-//= Fixed possible EXP abuse [Lupus]
-//= 1.5 Now saves/restores all quest skills [Lupus]
-//= 1.6 Merged back JFunc [Lupus] 1.6a typos
-//============================================================
-
-
-// == Monsters ==
-//Spawn is included in this file so make shure its not elsewhere to!
-job_thief1.gat,0,0,0,0 monster Orange Mushroom 1182,180,0,0,0
-job_thief1.gat,0,0,0,0 monster Fabre 1184,50,0,0,0
-job_thief1.gat,0,0,0,0 monster Chonchon 1183,50,0,0,0
-job_thief1.gat,0,0,0,0 monster Spore 1014,30,0,0,0
-
-
-// == NPCs ==
-// -- Interviewer --
-moc_prydb1.gat,39,129,5 script Thief Guide 69,{
-
- mes "[Thief Guide]";
- if(BaseJob == Job_Thief) {
- mes "You're already a thief..... What do you want from me... go away!";
- emotion e_swt;
- close;
- }
- if(BaseClass == Job_Swordman) {
- mes "What the heck...? Meh!~Here's another 'Bash' head. Do me a favor... why don't you go 'BASH', yourself in the head. Ha!";
- emotion e_gg;
- close;
- }
- if(BaseClass == Job_Mage) {
- mes "What the heck...? Ehhh??? A Circus Sideshow? Make a fire without a Matchstick, will ya?";
- emotion e_swt2;
- close;
- }
- if(BaseClass == Job_Archer) {
- mes "What the heck...? Hahahaha~are you a 'Kill Stealing' Archer...?";
- emotion e_heh;
- close;
- }
- if(BaseClass == Job_Acolyte) {
- mes "What the heck...? Ohhhhhh~GOD... PORING's worshipper, Acolyte...";
- mes "So why aren't you in church praying, instead of wandering about here, huh?";
- close;
- }
- if(BaseClass == Job_Merchant) {
- mes "What the heck...? Eeeeeek~Merchant Scammer here...!!!! I am gonna report you to the GM!!!";
- emotion e_gasp;
- close;
- }
- if(BaseClass != Job_Novice) {
- mes "You already have a job. Stop bothering me and go help out some newbies or something.";
- emotion e_no1;
- close;
- }
-
- if(job_thief_q==2) goto L_1;
- if(job_thief_q==1) goto L_Back;
-
- if(Sex) {
- mes "Heh... You look like a well to do boy... what brought you down to this rat hole?";
- }else{
- mes "Heh... You look like a well to do girl... what brought you down to this rat hole?";
- }
- next;
-M_Menu:
- menu "'I didn't come here for the atmosphere.....",M_0,"Me? I'm just looking around...",M_End,"Just looking for the one truth",M_Truth;
-
- M_0:
- mes "[Thief Guide]";
- mes "Hmph... you sound a little cocky.... Yah know, being a Thief isn't all it's cracked up to be....";
- mes "That reminds me.... I must have been at lvl 9 or 10 when I did my first robbery....";
- next;
- mes "[Thief Guide]";
- mes "Hahahaha... I can still remember the look on that guy's face...";
- emotion e_heh;
- next;
- mes "[Thief Guide]";
- mes "But anyways... I assume you're here to become a thief...";
- next;
- menu "You got it.",sM_0a, "Nope. Just wasting your time. ^ ^",sM_0b, "Why did you steal from that man?",sM_0c;
-
- sM_0a:
- goto L_Test;
- sM_0b:
- mes "[Thief Guide]";
- mes "Wow... thanks... now get the HELL OUTA HERE!!";
- emotion e_an;
- close;
- sM_0c:
- mes "[Thief Guide]";
- mes "Eh? Me?... Well... I really had no other choice at the time.... It was either I stole or I starved.";
- mes "I really couldn't go hungry another day.";
- close;
-
- M_Truth:
- mes "[Thief Guide]";
- mes "To see one's light, you need to be under the magic of the book where the royalty looms.";
- close;
-
- M_End:
- mes "[Thief Guide]";
- mes "Must you people keep wasting my time!!?";
- emotion e_pif;
- close;
-
- L_Test:
- mes "[Thief Guide]";
- mes "Okay then; first, fill out this application form.";
- next;
- mes "^0000FF(You fill out the form and hand it back)^000000";
- next;
- if(JobLevel < 10) goto sL_JobLvl;
-
- mes "[Thief Guide]";
- mes "Alrighty ^FF0000"+ strcharinfo(0) + "^000000, if that IS your real name..... looks like you've got quite a 'record' here.";
- mes "Let's see.... aggravated assualt... felony larson..... hmm....";
- next;
- mes "[Thief Guide]";
- mes "Ah, here we go...... you've got the job and skill requirements to become a Thief. Now all you've got to do is pass the ^FF0000Morroc Thief Test^000000.";
- next;
-
- L_Explain:
- mes "[Thief Guide]";
- mes " The test will require you to ^FF0000'sneak'^000000 into ^FF0000'Shibu's Farm'^000000, and ^FF0000'borrow'^000000 some ^AAAA00'Mushrooms'^000000.";
- mes " There are ^ff00002^000000 kinds of ^AAAA00Mushrooms^000000 on the farm, ^FFBB00Orange Net Mushrooms^000000 and ^FFBB00Orange Gooey Mushrooms^000000.";
- next;
- mes "[Thief Guide]";
- mes "'Shibu just happens to be the worst merchant scammer in Morroc, in case you're wondering why he's our target.";
- next;
- mes "[Thief Guide]";
- mes " Bring the Mushrooms back here and someone will give you a score based on the type and the amount of mushrooms you get.";
- mes " 1 Orange Net Mushroom = ^0000FF3 points^000000 while 1 Orange Gooey Mushroom = ^0000FF1 point^000000. You need ^FF000025^000000 points to pass the test.";
- next;
- mes "[Thief Guide]";
- mes " In order to get into Shibu's Farm you'll need to talk to one of our 'associates'. You can find him just ouside of this pyramid standing near some columns.";
- mes " He goes by the name ^DDCC00'Irrelevant Man'^000000.";
- next;
- mes "[Thief Guide]";
- mes " Here are his exact coordinates just in case you are 'directionaly challenged': '^FF0000141, 125^000000'.";
- mes " Find him and he'll show you a secrect way into the Farm.";
- next;
- mes "[Thief Guide]";
- mes " This sounds easy but ^009900do know, there are Monsters who guard Mushrooms^000000?";
- mes " Stop reading Fairy Tales and ^FF0000brace up your nerves; this will be the toughest experience ever^000000.";
- next;
- mes "[Thief Guide]";
- mes " So, I will give you one tip. ^FF0000Elaborate the Strategy^000000 before you going inside the Farm.";
- next;
- mes "[Thief Guide]";
- mes " Try to steal the mushrooms as quickly as you can. You may even have to ^0000FFunequip some weapons or armor to attack faster^000000.";
- mes " Try not to get killed while doing this... at the very least try to give me the mushrooms first.... then you can go get yourself killed... HA!";
- next;
- mes "[Thief Guide]";
- mes " If you don't have any questions... then GET moving!";
- emotion e_go;
- set job_thief_q,1;
- close;
-
- sL_JobLvl:
- mes "[Thief Guide]";
- mes "Err... I can see how ambitious you are, but we can't hand a gun to a baby only for that. Come back when you learn all Basic Skills.";
- close;
-
- L_Back:
- if(countitem(1069)>0 || countitem(1070)>0) goto sL_1;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
-
- mes "..... What are you doing here? You're supposed to be gathering mushrooms remember??";
- mes "Don't tell me you forget what to do??? Jeeze... do you want me to explain it to you one more time?......";
- emotion e_hmm;
- next;
- menu "Heh.. yeah I guess..",sM_1a, "Nope.",sM_1b;
-
- sM_1a:
- mes "[Thief Guide]";
- mes "(~sigh~) There's always someone who gets left behind.... This is the last time so listen CAREFULLY!!....";
- emotion e_pif;
- next;
- goto L_Explain;
- sM_1b:
- mes "[Thief Guide]";
- mes ".... Then what is it??? Do you have something to tell me? YOUR the one who came TO ME...";
- mes "What... you wanna a piece of me?? HUH!!??";
- emotion e_ag;
- close;
-
- sL_1:
- mes "What? You actually went and stole some mushrooms?? Are you some kinda idiot?";
- mes "Haha... I can't believe you listened to me..... ";
- emotion e_what;
- next;
- mes "[Thief Guide]";
- mes ".... Psych!! Just kidding... heheheh! Speak with the guy next to me about rating the mushrooms you swiped.";
- emotion e_heh;
- close;
-
- L_1:
- mes "So how was the Mushroom Farm? Did yah have much fun?";
- next;
- menu "Yeah, kinda Cool.",M_Cool,"It was horrible.",M_Not;
-
- M_Cool:
- mes "[Thief Guide]";
- mes " Wow! I like you! Fabulous! Everyone before you was #&$@ bloody As#$%^&s#!";
- next;
- mes "[Thief Guide]";
- mes "...... You won't take my place, will you? If you have any ambition like that, I'll ^ff0000DESTROY YOU^000000!";
- // mes "...... You won't take my place, will you? If you have any ambition like that, I will kick your ^ff0000'ASS OUT OF YOUR BUTT'^000000!";
- // this is just too much lol.
- // That line before was just too precious to delete. [KillerBox]
- emotion e_gasp;
- next;
- mes "[Thief Guide]";
- mes " Still, in order to pass the test you need to go get some mushrooms.";
- close;
- M_Not:
- mes "[Thief Guide]";
- mes " I know what yah mean. I was there before and it was awful: all those smelly mushrooms and aggressive monsters.";
- next;
- mes "[Thief Guide]";
- mes " Eeewww! Yuuuckk! Still, in order to pass the test you need to go get some mushrooms.";
- emotion e_wah;
- close;
-}
-
-
-// -- Test Grader --
-moc_prydb1.gat,42,133,2 script Comrade Brad 118,{
- callfunc "F_ToHigh",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Brad";
- if(BaseJob == Job_Novice) goto L_Novice;
- if(BaseJob == Job_Thief) goto L_Thief;
-
-L_Other:
- mes "[Brad]";
- mes "Hey~ Hey~!! You don't look like a Thief. What the heck? You'd BETTER NOT be trying to start someting on THIEF TERRITORY!!";
- emotion e_omg;
- close;
-L_Thief:
- mes "[Brad]";
- mes "We don't have any Special events for Thieves yet. Come back some other time, alright?";
- close;
-
-L_Novice:
- mes "[Comrade Brad]";
- if((job_thief_q == 2) && ((countitem(1069) > 0) || (countitem(1070) > 0))) goto L_4;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
- if(job_thief_q >= 1) goto L_3;
-
- mes "Errr? What's matter newbie? If you want to be a thief, speak to the girl beside me.";
- close;
-L_3:
- mes "Go get some mushrooms so that I can grade them ok.";
- close;
-L_4:
- mes "Good. You got some mushrooms from that crooked merchant Shibu";
- next;
-
- set @mushrm1,countitem(1069)*3;//Items: Orange_Net_Mushroom,
- set @mushrm2,countitem(1070);//Items: Orange_Gooey_Mushroom_,
- set @TotMush,@mushrm1 + @mushrm2;
- set @money_thief,((countitem(1069) * 5) + (countitem(1070)* 2)) + 200;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
-
- mes "[Comrade Brad]";
- mes "Let's see you got:";
- mes "^0000ff"+countitem(1069)+"^000000 Orange Net Mushrooms for ^ffbb00"+@mushrm1+"^000000 points,";//Items: Orange_Net_Mushroom,
- mes "^0000ff"+countitem(1070)+"^000000 Orange Gooey Mushrooms for ^ffbb00"+@mushrm2+"^000000 points,";//Items: Orange_Gooey_Mushroom_,
- mes "Giving you a total score of ^ff0000"+@TotMush+"^000000.";
- next;
- if (@TotMush > 25) goto L_High;
- if (@TotMush == 25) goto L_Medium;
-
- mes "[Comrade Brad]";
- mes "Meh!.... looks like you failed. C'mon! You can do better than that! Go get some more mushrooms!!!";
- close;
-
- L_Medium:
- mes "[Comrade Brad]";
- mes "Good. You passed the Test.";
- next;
- goto L_Final;
-
- L_High:
- mes "[Comrade Brad]";
- mes "Ooooh. Above 25, you will make an excellent thief.";
- next;
- L_Final:
- mes "[Comrade Brad]";
- mes "Congratulations ^ff0000"+strcharinfo(0)+"^000000, you passed the official Thief Test! You can now become a Thief!!";
- emotion e_no1;
- next;
- if(SkillPoint > 0) goto sL_SkPoint;
- delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
- delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
-
- callfunc "Job_Change",Job_Thief;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
-
- mes "[Comrade Brad]";
- mes "Here's a small reward for your hard work. Spend it any way you want to.";
- next;
- set Zeny,Zeny+@money_thief;
- mes "[Comrade Brad]";
- mes "From now on you must act, think, and even smell like a Thief.";
- mes "You are one of us now, which means you have the trust and freindship of Thieves all over Rune Midgard";
- next;
- mes "[Comrade Brad]";
- mes "However, If you bring disgrace to our Guild, or ever betray us, we will not hesitate to have you......";
- mes "How shall I say, ^ff0000'REMOVED'^000000 from the Thief Guild.";
- emotion e_gg;
- next;
- mes "[Comrade Brad]";
- mes "Good luck and always remeber the ^0000cc'Thief Motto'^000000: ^ff0000DON'T Get Caught^000000l!";
- close;
-
- sL_SkPoint:
- mes "[Comrade Brad]";
- mes "But before that happens please use up all of your skill points, okay?";
- close;
-
-}
-
-
-// -- Irrelevant Man --
-moc_ruins.gat,141,125,3 script Irrelevant Man 118,{
- if(BaseJob == Job_Thief) goto L_Thief;
- if(BaseJob == Job_Novice) goto L_Novice;
-
-L_Other:
- if(@s_flag==1) goto L_1b;
- if(@s_flag==2) goto L_1c;
- if(@s_flag==3) goto L_1d;
- if(@s_flag==4) goto L_1e;
- set @s_flag, 0;
-
- L_1a:
- mes "[Irrelevant Man]";
- mes "Howdy~ Howdy. What a Wonderful day today,isn't it?";
- mes "I feel like going on a 'Picnic' in the Pyramids with a couple freinds of mine today.";
- set @s_flag, @s_flag+1;
- close;
- L_1b:
- mes "[Irrelevant Man]";
- mes "'Lalalala, Home sweet Home.'";
- mes "I like this saying. Home Sweet Home....";
- set @s_flag, @s_flag+1;
- close;
- L_1c:
- mes "[Irrelevant Man]";
- mes "...... I could fly if I fell off............ ";
- set @s_flag, @s_flag+1;
- close;
- L_1d:
- mes "[Irrelevant Man]";
- mes ".......Hmm?.....";
- next;
- mes "[Irrelevent Man]";
- mes "Hey!! DON'T LOOK AT ME like that! I'M NOT some WACKO okay!!!";
- set @s_flag, @s_flag+1;
- emotion e_an;
- close;
- L_1e:
- mes "[Irrelevant Man]";
- mes "Dude! I got nothin to say with you! Mind your own business! Sheesh!!";
- emotion e_pif;
- close;
-
-L_Thief:
- mes "[Irrelevant Man]";
- mes "Yah Hoo! Look at you! You became a Kool Thief!";
- emotion e_no1;
- next;
- mes "[Irrelevant Man]";
- mes "Don't worry about Shibu's Farm. Let the newbies handle that. Why don't yah go out and kill some stronger monsters?";
- close;
-
-L_Novice:
- if(job_thief_q==2) goto L_3;
- if(job_thief_q==1) goto L_2;
- mes "[Irrelevant Man]";
- mes "Hey!! Novice! Want to be Stronger and more Powerful!? Do you like hiding and sneeking around?";
- mes "If so, Join the Thief Guild! You are always welcome! Join now!";
- next;
- mes "[Irrelevant Man]";
- mes "You can get more information in the 1st floor basement of the Pyramid!";
- close;
-L_2:
- mes "[Irrelevant Man]";
- mes "Pssst......Pssst......hey you! You look like your gonna take the ^ff0000'Test'^000000. Am I right?";
- next;
- mes "[Irrelevant Man]";
- mes "Lets see here.....(checks his list).... you're ^ff0000"+ strcharinfo(0) +"^000000 right? Good.";
- next;
- mes "[Irrelevant Man]";
- mes "Okay! I'm gonna show you the way in but keep quite. I can't guarantee your safety so watch your back.";
- next;
-
- L_Warp:
- set @TEMP,rand(5);
- set job_thief_q,2;
- if(@TEMP != 0) goto warpL03a;
- warp "job_thief1.gat",228,106;
- close;
- warpL03a:
- if(@TEMP != 1) goto warpL03b;
- warp "job_thief1.gat",38,50;
- close;
- warpL03b:
- if(@TEMP != 2) goto warpL03c;
- warp "job_thief1.gat",66,331;
- close;
- warpL03c:
- if(@TEMP != 3) goto warpL03d;
- warp "job_thief1.gat",196,331;
- close;
- warpL03d:
- warp "job_thief1.gat",309,234;
- close;
-
-L_3:
- mes "[Irrelevant Man]";
- mes "Muhahahaha~~ WHAT???~~ You HAVEN'T PASSED the Test yet? Are you some sort of Idiot!! Kakakaka!!";
- emotion e_heh;
- next;
- mes "[Irrelevant Man]";
- mes "Just kidding..... NOT!!. Anywho I'll let yah back in!";
- next;
- menu "Ready",M_Yes,"Not yet",M_No;
-
- M_Yes:
- goto L_Warp;
-
- M_No:
- mes "[Irrelevant Man]";
- mes "Okay, let me know when you are.";
- close;
-
-}
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_thief1.gat mapflag nomemo
-job_thief1.gat mapflag noteleport
-job_thief1.gat mapflag nosave SavePoint
-job_thief1.gat mapflag nopenalty
-job_thief1.gat mapflag nobranch
-job_thief1.gat mapflag noexp
+//===== eAthena Script =======================================
+//= Thief Job Quest
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.6a
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Added instant job change for High Novice [Lupus]
+//= 1.3 Added Baby Class support [Lupus]
+//= v1.4 Optimised and moved first checker to Jfunc1-1 [massdriller]
+//= Fixed possible EXP abuse [Lupus]
+//= 1.5 Now saves/restores all quest skills [Lupus]
+//= 1.6 Merged back JFunc [Lupus] 1.6a typos
+//============================================================
+
+
+// == Monsters ==
+//Spawn is included in this file so make shure its not elsewhere to!
+job_thief1.gat,0,0,0,0 monster Orange Mushroom 1182,180,0,0,0
+job_thief1.gat,0,0,0,0 monster Fabre 1184,50,0,0,0
+job_thief1.gat,0,0,0,0 monster Chonchon 1183,50,0,0,0
+job_thief1.gat,0,0,0,0 monster Spore 1014,30,0,0,0
+
+
+// == NPCs ==
+// -- Interviewer --
+moc_prydb1.gat,39,129,5 script Thief Guide 69,{
+
+ mes "[Thief Guide]";
+ if(BaseJob == Job_Thief) {
+ mes "You're already a thief..... What do you want from me... go away!";
+ emotion e_swt;
+ close;
+ }
+ if(BaseClass == Job_Swordman) {
+ mes "What the heck...? Meh!~Here's another 'Bash' head. Do me a favor... why don't you go 'BASH', yourself in the head. Ha!";
+ emotion e_gg;
+ close;
+ }
+ if(BaseClass == Job_Mage) {
+ mes "What the heck...? Ehhh??? A Circus Sideshow? Make a fire without a Matchstick, will ya?";
+ emotion e_swt2;
+ close;
+ }
+ if(BaseClass == Job_Archer) {
+ mes "What the heck...? Hahahaha~are you a 'Kill Stealing' Archer...?";
+ emotion e_heh;
+ close;
+ }
+ if(BaseClass == Job_Acolyte) {
+ mes "What the heck...? Ohhhhhh~GOD... PORING's worshipper, Acolyte...";
+ mes "So why aren't you in church praying, instead of wandering about here, huh?";
+ close;
+ }
+ if(BaseClass == Job_Merchant) {
+ mes "What the heck...? Eeeeeek~Merchant Scammer here...!!!! I am gonna report you to the GM!!!";
+ emotion e_gasp;
+ close;
+ }
+ if(BaseClass != Job_Novice) {
+ mes "You already have a job. Stop bothering me and go help out some newbies or something.";
+ emotion e_no1;
+ close;
+ }
+
+ if(job_thief_q==2) goto L_1;
+ if(job_thief_q==1) goto L_Back;
+
+ if(Sex) {
+ mes "Heh... You look like a well to do boy... what brought you down to this rat hole?";
+ }else{
+ mes "Heh... You look like a well to do girl... what brought you down to this rat hole?";
+ }
+ next;
+M_Menu:
+ menu "'I didn't come here for the atmosphere.....",M_0,"Me? I'm just looking around...",M_End,"Just looking for the one truth",M_Truth;
+
+ M_0:
+ mes "[Thief Guide]";
+ mes "Hmph... you sound a little cocky.... Yah know, being a Thief isn't all it's cracked up to be....";
+ mes "That reminds me.... I must have been at lvl 9 or 10 when I did my first robbery....";
+ next;
+ mes "[Thief Guide]";
+ mes "Hahahaha... I can still remember the look on that guy's face...";
+ emotion e_heh;
+ next;
+ mes "[Thief Guide]";
+ mes "But anyways... I assume you're here to become a thief...";
+ next;
+ menu "You got it.",sM_0a, "Nope. Just wasting your time. ^ ^",sM_0b, "Why did you steal from that man?",sM_0c;
+
+ sM_0a:
+ goto L_Test;
+ sM_0b:
+ mes "[Thief Guide]";
+ mes "Wow... thanks... now get the HELL OUTA HERE!!";
+ emotion e_an;
+ close;
+ sM_0c:
+ mes "[Thief Guide]";
+ mes "Eh? Me?... Well... I really had no other choice at the time.... It was either I stole or I starved.";
+ mes "I really couldn't go hungry another day.";
+ close;
+
+ M_Truth:
+ mes "[Thief Guide]";
+ mes "To see one's light, you need to be under the magic of the book where the royalty looms.";
+ close;
+
+ M_End:
+ mes "[Thief Guide]";
+ mes "Must you people keep wasting my time!!?";
+ emotion e_pif;
+ close;
+
+ L_Test:
+ mes "[Thief Guide]";
+ mes "Okay then; first, fill out this application form.";
+ next;
+ mes "^0000FF(You fill out the form and hand it back)^000000";
+ next;
+ if(JobLevel < 10) goto sL_JobLvl;
+
+ mes "[Thief Guide]";
+ mes "Alrighty ^FF0000"+ strcharinfo(0) + "^000000, if that IS your real name..... looks like you've got quite a 'record' here.";
+ mes "Let's see.... aggravated assualt... felony larson..... hmm....";
+ next;
+ mes "[Thief Guide]";
+ mes "Ah, here we go...... you've got the job and skill requirements to become a Thief. Now all you've got to do is pass the ^FF0000Morroc Thief Test^000000.";
+ next;
+
+ L_Explain:
+ mes "[Thief Guide]";
+ mes " The test will require you to ^FF0000'sneak'^000000 into ^FF0000'Shibu's Farm'^000000, and ^FF0000'borrow'^000000 some ^AAAA00'Mushrooms'^000000.";
+ mes " There are ^ff00002^000000 kinds of ^AAAA00Mushrooms^000000 on the farm, ^FFBB00Orange Net Mushrooms^000000 and ^FFBB00Orange Gooey Mushrooms^000000.";
+ next;
+ mes "[Thief Guide]";
+ mes "'Shibu just happens to be the worst merchant scammer in Morroc, in case you're wondering why he's our target.";
+ next;
+ mes "[Thief Guide]";
+ mes " Bring the Mushrooms back here and someone will give you a score based on the type and the amount of mushrooms you get.";
+ mes " 1 Orange Net Mushroom = ^0000FF3 points^000000 while 1 Orange Gooey Mushroom = ^0000FF1 point^000000. You need ^FF000025^000000 points to pass the test.";
+ next;
+ mes "[Thief Guide]";
+ mes " In order to get into Shibu's Farm you'll need to talk to one of our 'associates'. You can find him just ouside of this pyramid standing near some columns.";
+ mes " He goes by the name ^DDCC00'Irrelevant Man'^000000.";
+ next;
+ mes "[Thief Guide]";
+ mes " Here are his exact coordinates just in case you are 'directionaly challenged': '^FF0000141, 125^000000'.";
+ mes " Find him and he'll show you a secrect way into the Farm.";
+ next;
+ mes "[Thief Guide]";
+ mes " This sounds easy but ^009900do know, there are Monsters who guard Mushrooms^000000?";
+ mes " Stop reading Fairy Tales and ^FF0000brace up your nerves; this will be the toughest experience ever^000000.";
+ next;
+ mes "[Thief Guide]";
+ mes " So, I will give you one tip. ^FF0000Elaborate the Strategy^000000 before you going inside the Farm.";
+ next;
+ mes "[Thief Guide]";
+ mes " Try to steal the mushrooms as quickly as you can. You may even have to ^0000FFunequip some weapons or armor to attack faster^000000.";
+ mes " Try not to get killed while doing this... at the very least try to give me the mushrooms first.... then you can go get yourself killed... HA!";
+ next;
+ mes "[Thief Guide]";
+ mes " If you don't have any questions... then GET moving!";
+ emotion e_go;
+ set job_thief_q,1;
+ close;
+
+ sL_JobLvl:
+ mes "[Thief Guide]";
+ mes "Err... I can see how ambitious you are, but we can't hand a gun to a baby only for that. Come back when you learn all Basic Skills.";
+ close;
+
+ L_Back:
+ if(countitem(1069)>0 || countitem(1070)>0) goto sL_1;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+
+ mes "..... What are you doing here? You're supposed to be gathering mushrooms remember??";
+ mes "Don't tell me you forget what to do??? Jeeze... do you want me to explain it to you one more time?......";
+ emotion e_hmm;
+ next;
+ menu "Heh.. yeah I guess..",sM_1a, "Nope.",sM_1b;
+
+ sM_1a:
+ mes "[Thief Guide]";
+ mes "(~sigh~) There's always someone who gets left behind.... This is the last time so listen CAREFULLY!!....";
+ emotion e_pif;
+ next;
+ goto L_Explain;
+ sM_1b:
+ mes "[Thief Guide]";
+ mes ".... Then what is it??? Do you have something to tell me? YOUR the one who came TO ME...";
+ mes "What... you wanna a piece of me?? HUH!!??";
+ emotion e_ag;
+ close;
+
+ sL_1:
+ mes "What? You actually went and stole some mushrooms?? Are you some kinda idiot?";
+ mes "Haha... I can't believe you listened to me..... ";
+ emotion e_what;
+ next;
+ mes "[Thief Guide]";
+ mes ".... Psych!! Just kidding... heheheh! Speak with the guy next to me about rating the mushrooms you swiped.";
+ emotion e_heh;
+ close;
+
+ L_1:
+ mes "So how was the Mushroom Farm? Did yah have much fun?";
+ next;
+ menu "Yeah, kinda Cool.",M_Cool,"It was horrible.",M_Not;
+
+ M_Cool:
+ mes "[Thief Guide]";
+ mes " Wow! I like you! Fabulous! Everyone before you was #&$@ bloody As#$%^&s#!";
+ next;
+ mes "[Thief Guide]";
+ mes "...... You won't take my place, will you? If you have any ambition like that, I'll ^ff0000DESTROY YOU^000000!";
+ // mes "...... You won't take my place, will you? If you have any ambition like that, I will kick your ^ff0000'ASS OUT OF YOUR BUTT'^000000!";
+ // this is just too much lol.
+ // That line before was just too precious to delete. [KillerBox]
+ emotion e_gasp;
+ next;
+ mes "[Thief Guide]";
+ mes " Still, in order to pass the test you need to go get some mushrooms.";
+ close;
+ M_Not:
+ mes "[Thief Guide]";
+ mes " I know what yah mean. I was there before and it was awful: all those smelly mushrooms and aggressive monsters.";
+ next;
+ mes "[Thief Guide]";
+ mes " Eeewww! Yuuuckk! Still, in order to pass the test you need to go get some mushrooms.";
+ emotion e_wah;
+ close;
+}
+
+
+// -- Test Grader --
+moc_prydb1.gat,42,133,2 script Comrade Brad 118,{
+ callfunc "F_ToHigh",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Brad";
+ if(BaseJob == Job_Novice) goto L_Novice;
+ if(BaseJob == Job_Thief) goto L_Thief;
+
+L_Other:
+ mes "[Brad]";
+ mes "Hey~ Hey~!! You don't look like a Thief. What the heck? You'd BETTER NOT be trying to start someting on THIEF TERRITORY!!";
+ emotion e_omg;
+ close;
+L_Thief:
+ mes "[Brad]";
+ mes "We don't have any Special events for Thieves yet. Come back some other time, alright?";
+ close;
+
+L_Novice:
+ mes "[Comrade Brad]";
+ if((job_thief_q == 2) && ((countitem(1069) > 0) || (countitem(1070) > 0))) goto L_4;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+ if(job_thief_q >= 1) goto L_3;
+
+ mes "Errr? What's matter newbie? If you want to be a thief, speak to the girl beside me.";
+ close;
+L_3:
+ mes "Go get some mushrooms so that I can grade them ok.";
+ close;
+L_4:
+ mes "Good. You got some mushrooms from that crooked merchant Shibu";
+ next;
+
+ set @mushrm1,countitem(1069)*3;//Items: Orange_Net_Mushroom,
+ set @mushrm2,countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ set @TotMush,@mushrm1 + @mushrm2;
+ set @money_thief,((countitem(1069) * 5) + (countitem(1070)* 2)) + 200;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+
+ mes "[Comrade Brad]";
+ mes "Let's see you got:";
+ mes "^0000ff"+countitem(1069)+"^000000 Orange Net Mushrooms for ^ffbb00"+@mushrm1+"^000000 points,";//Items: Orange_Net_Mushroom,
+ mes "^0000ff"+countitem(1070)+"^000000 Orange Gooey Mushrooms for ^ffbb00"+@mushrm2+"^000000 points,";//Items: Orange_Gooey_Mushroom_,
+ mes "Giving you a total score of ^ff0000"+@TotMush+"^000000.";
+ next;
+ if (@TotMush > 25) goto L_High;
+ if (@TotMush == 25) goto L_Medium;
+
+ mes "[Comrade Brad]";
+ mes "Meh!.... looks like you failed. C'mon! You can do better than that! Go get some more mushrooms!!!";
+ close;
+
+ L_Medium:
+ mes "[Comrade Brad]";
+ mes "Good. You passed the Test.";
+ next;
+ goto L_Final;
+
+ L_High:
+ mes "[Comrade Brad]";
+ mes "Ooooh. Above 25, you will make an excellent thief.";
+ next;
+ L_Final:
+ mes "[Comrade Brad]";
+ mes "Congratulations ^ff0000"+strcharinfo(0)+"^000000, you passed the official Thief Test! You can now become a Thief!!";
+ emotion e_no1;
+ next;
+ if(SkillPoint > 0) goto sL_SkPoint;
+ delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
+
+ callfunc "Job_Change",Job_Thief;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+
+ mes "[Comrade Brad]";
+ mes "Here's a small reward for your hard work. Spend it any way you want to.";
+ next;
+ set Zeny,Zeny+@money_thief;
+ mes "[Comrade Brad]";
+ mes "From now on you must act, think, and even smell like a Thief.";
+ mes "You are one of us now, which means you have the trust and freindship of Thieves all over Rune Midgard";
+ next;
+ mes "[Comrade Brad]";
+ mes "However, If you bring disgrace to our Guild, or ever betray us, we will not hesitate to have you......";
+ mes "How shall I say, ^ff0000'REMOVED'^000000 from the Thief Guild.";
+ emotion e_gg;
+ next;
+ mes "[Comrade Brad]";
+ mes "Good luck and always remeber the ^0000cc'Thief Motto'^000000: ^ff0000DON'T Get Caught^000000l!";
+ close;
+
+ sL_SkPoint:
+ mes "[Comrade Brad]";
+ mes "But before that happens please use up all of your skill points, okay?";
+ close;
+
+}
+
+
+// -- Irrelevant Man --
+moc_ruins.gat,141,125,3 script Irrelevant Man 118,{
+ if(BaseJob == Job_Thief) goto L_Thief;
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+L_Other:
+ if(@s_flag==1) goto L_1b;
+ if(@s_flag==2) goto L_1c;
+ if(@s_flag==3) goto L_1d;
+ if(@s_flag==4) goto L_1e;
+ set @s_flag, 0;
+
+ L_1a:
+ mes "[Irrelevant Man]";
+ mes "Howdy~ Howdy. What a Wonderful day today,isn't it?";
+ mes "I feel like going on a 'Picnic' in the Pyramids with a couple freinds of mine today.";
+ set @s_flag, @s_flag+1;
+ close;
+ L_1b:
+ mes "[Irrelevant Man]";
+ mes "'Lalalala, Home sweet Home.'";
+ mes "I like this saying. Home Sweet Home....";
+ set @s_flag, @s_flag+1;
+ close;
+ L_1c:
+ mes "[Irrelevant Man]";
+ mes "...... I could fly if I fell off............ ";
+ set @s_flag, @s_flag+1;
+ close;
+ L_1d:
+ mes "[Irrelevant Man]";
+ mes ".......Hmm?.....";
+ next;
+ mes "[Irrelevent Man]";
+ mes "Hey!! DON'T LOOK AT ME like that! I'M NOT some WACKO okay!!!";
+ set @s_flag, @s_flag+1;
+ emotion e_an;
+ close;
+ L_1e:
+ mes "[Irrelevant Man]";
+ mes "Dude! I got nothin to say with you! Mind your own business! Sheesh!!";
+ emotion e_pif;
+ close;
+
+L_Thief:
+ mes "[Irrelevant Man]";
+ mes "Yah Hoo! Look at you! You became a Kool Thief!";
+ emotion e_no1;
+ next;
+ mes "[Irrelevant Man]";
+ mes "Don't worry about Shibu's Farm. Let the newbies handle that. Why don't yah go out and kill some stronger monsters?";
+ close;
+
+L_Novice:
+ if(job_thief_q==2) goto L_3;
+ if(job_thief_q==1) goto L_2;
+ mes "[Irrelevant Man]";
+ mes "Hey!! Novice! Want to be Stronger and more Powerful!? Do you like hiding and sneeking around?";
+ mes "If so, Join the Thief Guild! You are always welcome! Join now!";
+ next;
+ mes "[Irrelevant Man]";
+ mes "You can get more information in the 1st floor basement of the Pyramid!";
+ close;
+L_2:
+ mes "[Irrelevant Man]";
+ mes "Pssst......Pssst......hey you! You look like your gonna take the ^ff0000'Test'^000000. Am I right?";
+ next;
+ mes "[Irrelevant Man]";
+ mes "Lets see here.....(checks his list).... you're ^ff0000"+ strcharinfo(0) +"^000000 right? Good.";
+ next;
+ mes "[Irrelevant Man]";
+ mes "Okay! I'm gonna show you the way in but keep quite. I can't guarantee your safety so watch your back.";
+ next;
+
+ L_Warp:
+ set @TEMP,rand(5);
+ set job_thief_q,2;
+ if(@TEMP != 0) goto warpL03a;
+ warp "job_thief1.gat",228,106;
+ close;
+ warpL03a:
+ if(@TEMP != 1) goto warpL03b;
+ warp "job_thief1.gat",38,50;
+ close;
+ warpL03b:
+ if(@TEMP != 2) goto warpL03c;
+ warp "job_thief1.gat",66,331;
+ close;
+ warpL03c:
+ if(@TEMP != 3) goto warpL03d;
+ warp "job_thief1.gat",196,331;
+ close;
+ warpL03d:
+ warp "job_thief1.gat",309,234;
+ close;
+
+L_3:
+ mes "[Irrelevant Man]";
+ mes "Muhahahaha~~ WHAT???~~ You HAVEN'T PASSED the Test yet? Are you some sort of Idiot!! Kakakaka!!";
+ emotion e_heh;
+ next;
+ mes "[Irrelevant Man]";
+ mes "Just kidding..... NOT!!. Anywho I'll let yah back in!";
+ next;
+ menu "Ready",M_Yes,"Not yet",M_No;
+
+ M_Yes:
+ goto L_Warp;
+
+ M_No:
+ mes "[Irrelevant Man]";
+ mes "Okay, let me know when you are.";
+ close;
+
+}
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_thief1.gat mapflag nomemo
+job_thief1.gat mapflag noteleport
+job_thief1.gat mapflag nosave SavePoint
+job_thief1.gat mapflag nopenalty
+job_thief1.gat mapflag nobranch
+job_thief1.gat mapflag noexp
diff --git a/npc/jobs/1-1e/gunslinger.txt b/npc/jobs/1-1e/gunslinger.txt
index 47da54866..707501e36 100644
--- a/npc/jobs/1-1e/gunslinger.txt
+++ b/npc/jobs/1-1e/gunslinger.txt
@@ -1,262 +1,262 @@
-//===== eAthena Script =======================================
-//= Gunslinger Job Quest
-//===== By: ==================================================
-//= erKURITA & RockmanEXE
-//= Direct credits quote from RockmanExe:
-//= "info provided by RockmanEXE cause he pwnz0rz yer arse"
-//= DON'T REMOVE THIS! (by request of him, he provided all
-//= the info regarding the quests and shops.)
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= "Semi" Official Gunslinger Quest ~ The text isn't the same
-//= but it does the things it has to do :P
-//===== Additional Comments: =================================
-//= 1.0 Made the NPC [erKURITA]
-//= 1.5 Couple fixes to the npc, aswell as adding the missing
-//= 3 green herbs. [erKURITA]
-//= 1.6 job number->const, commonized variable name,
-//= optimized [Lupus]
-//= 1.7 Now uses only ONE variable GUNS_Q [Lupus]
-//= 1.7a Grammar fixes, few spelling fixes, etc [CBMaster]
-//= 1.7b Parenthesis fixes [KarLaeda]
-//= 1.8 Fixed the reward you can get [Playtester]
-//============================================================
-
-que_ng.gat,152,167,3 script Gunslinger Jobchanger 901,{
-
- set @npcname$,"[Armsmith]";
- if (Class == Job_Novice) {
- if (GUNS_Q >= 1) {
- mes @npcname$;
- mes "So, you've come back?";
- next;
- if (GUNS_Q == 10005) {
- if (SkillPoint > 0) {
- mes @npcname$;
- mes "Err, excuse me, but you still have Skill Points left. You have to use them all before I can turn you into a Gunslinger.";
- close2;
- set @npcname$,"";
- end;
- } else if (JobLevel < 10) {
- mes @npcname$;
- mes "Err, excuse me, but your job level is not sufficient. You need to have a job level of 10 in order to change to a Gunslinger";
- close2;
- set @npcname$,"";
- end;
- }
- mes @npcname$;
- mes "Glad to know you did what Mr. Tanieh asked you to do, makes me know you're worthy of being..";
- next;
- mes @npcname$;
- mes "A Gunslinger!!";
- callfunc "Job_Change",Job_Gunslinger;
- callfunc "F_ClearJobVar"; //clears all job variables for the current player
- next;
- mes @npcname$;
- mes "Oh, I forgot, here's a token of my appreciation";
- if (rand(1,3) < 3) {
- getitem 13100,1;
- } else {
- getitem 13150,1;
- }
- close2;
- set @npcname$,"";
- end;
- }
- mes @npcname$;
- mes "But you still haven't done what I told you, need me to repeat it?";
- switch (select ("Yes, Please:No, Thanks")) {
- case 1:
- next;
- mes @npcname$;
- mes "You need to go to Payon. At the small wooden wall and in the south exit, Mr. Tanieh will be there waiting to ask you a few things. Go now...";
- close2;
- set @npcname$,"";
- end;
- case 2:
- next;
- mes @npcname$;
- mes "Then GET GOING! You do want to become a Gunslinger, right?";
- close2;
- set @npcname$,"";
- end;
- }
- }
- mes @npcname$;
- mes "Hi ^0000CC"+strcharinfo(0)+"^000000,I need you to do something for me first, will you?";
- switch (select ("Yes:No")) {
- case 1:
- next;
- mes @npcname$;
- mes "Good, I need you to go to Payon and do a few things from Mr. Tanieh.";
- next;
- mes @npcname$;
- mes "He'll be waiting for you next to the small wooden wall of the south exit. See you later then.";
- close2;
- set GUNS_Q,1;
- set @npcname$,"";
- end;
- case 2:
- next;
- mes @npcname$;
- mes "Too bad for you son. Come back when you are willing to do so.";
- close2;
- set @npcname$,"";
- end;
- }
-
- }
- mes @npcname$;
- mes "Hi son, how's life treating you?";
- set @npcname$,"";
- close;
-}
-
-payon.gat,184,65,3 script Mr. Tanieh 866,{
-
- set @npcname$,"[Mr. Tanieh]";
- if (GUNS_Q == 1) {
- mes @npcname$;
- mes "Oh, you're ^0000CC"+strcharinfo(0)+"^000000, right? Einbroch's Armsmith told me you were going to help me with a few things.";
- next;
- mes @npcname$;
- mes "I need to make a special soup for my wife, but, as you can see, I am not in conditions to look for the items, she's sick you know?";
- next;
- mes @npcname$;
- mes "So, will you do it, please?";
- switch (select ("Yes, I will:Sorry I can't now")) {
- case 1:
- set GUNS_Q,callfunc("F_RandMes",4,1019,1066,1067,1068);
- goto L_LIST;
-
- case 2:
- next;
- mes @npcname$;
- mes "Oh, what am I going to do now...";
- close2;
- set @npcname$,"";
- end;
- }
-
- } else if (GUNS_Q > 1 && GUNS_Q < 10000) {
- mes @npcname$;
- mes "Oh, you've come back! Have you brought the items?";
- next;
- switch (select("Yes I did:No I forgot which items I had to bring")) {
- case 1:
- next;
- if (countitem(949) < 3) {
- mes @npcname$;
- mes "Sorry, you're missing a few Feathers";
- close2;
- set @npcname$,"";
- end;
- } else if (countitem(912) < 3) {
- mes @npcname$;
- mes "Sorry, you're missing a few Zargons";
- close2;
- set @npcname$,"";
- end;
- } else if (countitem(1013) < 3) {
- mes @npcname$;
- mes "Sorry, you're missing a few Rainbow Shells";
- close2;
- set @npcname$,"";
- end;
- } else if (countitem(GUNS_Q) < 1) {
- mes @npcname$;
- mes "Sorry, you don't have the exact Trunk";
- close2;
- set @npcname$,"";
- end;
- } else if (countitem(511) < 3) {
- mes @npcname$;
- mes "Sorry, you're missing a few Green Herbs";
- close2;
- set @npcname$,"";
- end;
- } else if (countitem(935) < 10) {
- mes @npcname$;
- mes "Sorry, you're missing a few Shells";
- close2;
- set @npcname$,"";
- end;
- }
- mes @npcname$;
- mes "GREAT! You brought them all! Thanks very much!";
- delitem 949,3;
- delitem 912,3;
- delitem 1013,3;
- delitem GUNS_Q,1; //here we keep Trunk ID
- delitem 935,10;
- delitem 511,3;
- next;
- mes @npcname$;
- mes "Oh my, you've been of great help. I'll recommend you to the Einbroch Armory for your job change.";
- close2;
- set GUNS_Q,10003;
- set @npcname$,"";
- end;
- case 2:
- L_LIST:
- next;
- mes @npcname$;
- mes "Ok, I'll tell you again, so please take note!:";
- mes "^33CCFF 3 Feathers^000000";
- mes "^009933 3 Zargons^000000";
- mes "^660066 3 Rainbow Shells^000000";
- mes "^009900 3 Green Herbs^000000";
- mes "^663300 1 "+getitemname(GUNS_Q)+"^000000";
- mes "^FF6600 10 Shells^000000";
- next;
- mes @npcname$;
- mes "Hurry please, I am not sure if my wife will last any longer... oh dear..";
- close2;
- set @npcname$,"";
- end;
- }
- } else if (GUNS_Q == 10003 || GUNS_Q == 10004) {
- if (countitem(519) >= 1 && GUNS_Q == 10004) {
- mes @npcname$;
- mes "THAT'S IT!! I was missing the Milk! Oh yes, thanks so much, will you give it to me?";
- switch(select("Sure, take it:Sorry but I need it")) {
- case 1:
- next;
- mes @npcname$;
- mes "Thanks so much! Go talk again with the Einbroch Armsmith. He'll change you. Thanks again and see you.";
- delitem 519,1;
- close2;
- set GUNS_Q,10005;
- set @npcname$,"";
- end;
- case 2:
- next;
- mes @npcname$;
- mes "Oh please, I need it so much, think about it please...";
- close2;
- set @npcname$,"";
- end;
- }
- }
- mes @npcname$;
- mes "*sigh* Now I have to wait again... Thanks for your help... but I believe there's something missing..";
- close2;
- set @npcname$,"";
- set GUNS_Q,10004;
- end;
- } else if (Class == Job_Gunslinger || GUNS_Q == 10005) {
- mes @npcname$;
- mes "Hi ^0000CC"+strcharinfo(0)+"^000000!, how have you been doing? My wife sends you regards and thanks for the ingredients...";
- close2;
- set @npcname$,"";
- end;
- }
- mes @npcname$;
- mes "Hi son, how's life treating you? Nice day, isn't it?";
- close2;
- set @npcname$,"";
- end;
+//===== eAthena Script =======================================
+//= Gunslinger Job Quest
+//===== By: ==================================================
+//= erKURITA & RockmanEXE
+//= Direct credits quote from RockmanExe:
+//= "info provided by RockmanEXE cause he pwnz0rz yer arse"
+//= DON'T REMOVE THIS! (by request of him, he provided all
+//= the info regarding the quests and shops.)
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= "Semi" Official Gunslinger Quest ~ The text isn't the same
+//= but it does the things it has to do :P
+//===== Additional Comments: =================================
+//= 1.0 Made the NPC [erKURITA]
+//= 1.5 Couple fixes to the npc, aswell as adding the missing
+//= 3 green herbs. [erKURITA]
+//= 1.6 job number->const, commonized variable name,
+//= optimized [Lupus]
+//= 1.7 Now uses only ONE variable GUNS_Q [Lupus]
+//= 1.7a Grammar fixes, few spelling fixes, etc [CBMaster]
+//= 1.7b Parenthesis fixes [KarLaeda]
+//= 1.8 Fixed the reward you can get [Playtester]
+//============================================================
+
+que_ng.gat,152,167,3 script Gunslinger Jobchanger 901,{
+
+ set @npcname$,"[Armsmith]";
+ if (Class == Job_Novice) {
+ if (GUNS_Q >= 1) {
+ mes @npcname$;
+ mes "So, you've come back?";
+ next;
+ if (GUNS_Q == 10005) {
+ if (SkillPoint > 0) {
+ mes @npcname$;
+ mes "Err, excuse me, but you still have Skill Points left. You have to use them all before I can turn you into a Gunslinger.";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (JobLevel < 10) {
+ mes @npcname$;
+ mes "Err, excuse me, but your job level is not sufficient. You need to have a job level of 10 in order to change to a Gunslinger";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ mes @npcname$;
+ mes "Glad to know you did what Mr. Tanieh asked you to do, makes me know you're worthy of being..";
+ next;
+ mes @npcname$;
+ mes "A Gunslinger!!";
+ callfunc "Job_Change",Job_Gunslinger;
+ callfunc "F_ClearJobVar"; //clears all job variables for the current player
+ next;
+ mes @npcname$;
+ mes "Oh, I forgot, here's a token of my appreciation";
+ if (rand(1,3) < 3) {
+ getitem 13100,1;
+ } else {
+ getitem 13150,1;
+ }
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ mes @npcname$;
+ mes "But you still haven't done what I told you, need me to repeat it?";
+ switch (select ("Yes, Please:No, Thanks")) {
+ case 1:
+ next;
+ mes @npcname$;
+ mes "You need to go to Payon. At the small wooden wall and in the south exit, Mr. Tanieh will be there waiting to ask you a few things. Go now...";
+ close2;
+ set @npcname$,"";
+ end;
+ case 2:
+ next;
+ mes @npcname$;
+ mes "Then GET GOING! You do want to become a Gunslinger, right?";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ }
+ mes @npcname$;
+ mes "Hi ^0000CC"+strcharinfo(0)+"^000000,I need you to do something for me first, will you?";
+ switch (select ("Yes:No")) {
+ case 1:
+ next;
+ mes @npcname$;
+ mes "Good, I need you to go to Payon and do a few things from Mr. Tanieh.";
+ next;
+ mes @npcname$;
+ mes "He'll be waiting for you next to the small wooden wall of the south exit. See you later then.";
+ close2;
+ set GUNS_Q,1;
+ set @npcname$,"";
+ end;
+ case 2:
+ next;
+ mes @npcname$;
+ mes "Too bad for you son. Come back when you are willing to do so.";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+
+ }
+ mes @npcname$;
+ mes "Hi son, how's life treating you?";
+ set @npcname$,"";
+ close;
+}
+
+payon.gat,184,65,3 script Mr. Tanieh 866,{
+
+ set @npcname$,"[Mr. Tanieh]";
+ if (GUNS_Q == 1) {
+ mes @npcname$;
+ mes "Oh, you're ^0000CC"+strcharinfo(0)+"^000000, right? Einbroch's Armsmith told me you were going to help me with a few things.";
+ next;
+ mes @npcname$;
+ mes "I need to make a special soup for my wife, but, as you can see, I am not in conditions to look for the items, she's sick you know?";
+ next;
+ mes @npcname$;
+ mes "So, will you do it, please?";
+ switch (select ("Yes, I will:Sorry I can't now")) {
+ case 1:
+ set GUNS_Q,callfunc("F_RandMes",4,1019,1066,1067,1068);
+ goto L_LIST;
+
+ case 2:
+ next;
+ mes @npcname$;
+ mes "Oh, what am I going to do now...";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+
+ } else if (GUNS_Q > 1 && GUNS_Q < 10000) {
+ mes @npcname$;
+ mes "Oh, you've come back! Have you brought the items?";
+ next;
+ switch (select("Yes I did:No I forgot which items I had to bring")) {
+ case 1:
+ next;
+ if (countitem(949) < 3) {
+ mes @npcname$;
+ mes "Sorry, you're missing a few Feathers";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (countitem(912) < 3) {
+ mes @npcname$;
+ mes "Sorry, you're missing a few Zargons";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (countitem(1013) < 3) {
+ mes @npcname$;
+ mes "Sorry, you're missing a few Rainbow Shells";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (countitem(GUNS_Q) < 1) {
+ mes @npcname$;
+ mes "Sorry, you don't have the exact Trunk";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (countitem(511) < 3) {
+ mes @npcname$;
+ mes "Sorry, you're missing a few Green Herbs";
+ close2;
+ set @npcname$,"";
+ end;
+ } else if (countitem(935) < 10) {
+ mes @npcname$;
+ mes "Sorry, you're missing a few Shells";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ mes @npcname$;
+ mes "GREAT! You brought them all! Thanks very much!";
+ delitem 949,3;
+ delitem 912,3;
+ delitem 1013,3;
+ delitem GUNS_Q,1; //here we keep Trunk ID
+ delitem 935,10;
+ delitem 511,3;
+ next;
+ mes @npcname$;
+ mes "Oh my, you've been of great help. I'll recommend you to the Einbroch Armory for your job change.";
+ close2;
+ set GUNS_Q,10003;
+ set @npcname$,"";
+ end;
+ case 2:
+ L_LIST:
+ next;
+ mes @npcname$;
+ mes "Ok, I'll tell you again, so please take note!:";
+ mes "^33CCFF 3 Feathers^000000";
+ mes "^009933 3 Zargons^000000";
+ mes "^660066 3 Rainbow Shells^000000";
+ mes "^009900 3 Green Herbs^000000";
+ mes "^663300 1 "+getitemname(GUNS_Q)+"^000000";
+ mes "^FF6600 10 Shells^000000";
+ next;
+ mes @npcname$;
+ mes "Hurry please, I am not sure if my wife will last any longer... oh dear..";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ } else if (GUNS_Q == 10003 || GUNS_Q == 10004) {
+ if (countitem(519) >= 1 && GUNS_Q == 10004) {
+ mes @npcname$;
+ mes "THAT'S IT!! I was missing the Milk! Oh yes, thanks so much, will you give it to me?";
+ switch(select("Sure, take it:Sorry but I need it")) {
+ case 1:
+ next;
+ mes @npcname$;
+ mes "Thanks so much! Go talk again with the Einbroch Armsmith. He'll change you. Thanks again and see you.";
+ delitem 519,1;
+ close2;
+ set GUNS_Q,10005;
+ set @npcname$,"";
+ end;
+ case 2:
+ next;
+ mes @npcname$;
+ mes "Oh please, I need it so much, think about it please...";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ }
+ mes @npcname$;
+ mes "*sigh* Now I have to wait again... Thanks for your help... but I believe there's something missing..";
+ close2;
+ set @npcname$,"";
+ set GUNS_Q,10004;
+ end;
+ } else if (Class == Job_Gunslinger || GUNS_Q == 10005) {
+ mes @npcname$;
+ mes "Hi ^0000CC"+strcharinfo(0)+"^000000!, how have you been doing? My wife sends you regards and thanks for the ingredients...";
+ close2;
+ set @npcname$,"";
+ end;
+ }
+ mes @npcname$;
+ mes "Hi son, how's life treating you? Nice day, isn't it?";
+ close2;
+ set @npcname$,"";
+ end;
} \ No newline at end of file
diff --git a/npc/jobs/2-1/assassin.txt b/npc/jobs/2-1/assassin.txt
index 7270ef617..fc30115c0 100644
--- a/npc/jobs/2-1/assassin.txt
+++ b/npc/jobs/2-1/assassin.txt
@@ -1,1921 +1,1921 @@
-//===== eAthena Script =======================================
-//= Assassin Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 2.4
-//===== Compatible With: =====================================
-//= eAthena RC4
-//===== Description: =========================================
-//= Based of Official RO Assassin jobchange quest. There are small
-//= differences due to gameplay issues.
-//===== Additional Comments: =================================
-//= v1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
-//= Also converted the booby traps from the aegis script.[kobra_k88]
-//= v1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
-//= Fixed some duplicate npc names. Added missing waitingroom triggers.
-//= Fixed warp in "TimerSin", was supposed to be an areawarp.
-//= For some reason sometimes the "Nameless One" would have message windows
-//= without controls. Changed the doevent that triggers him to an
-//= addtimer and that seemed make the prob. go away[kobra_k88]
-//= 1.2 Fixed WRONG skillpoint check! [Lupus]
-//= 1.2b Fixed missing commands and typos [Lupus]
-//= 1.3 Baby class Support added [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Removed Duplicates [Silent]
-//= 2.2 Merged back JFunc. Fixed missing dialogue [Lupus]
-//= 2.3 Fixed typo and change Nameless addtimer to 100 (with 700ms I
-//= was still able to bypass it) [Toms]
-//= 2.4 Fixed skipping of Nameless NPC [Lupus]
-//============================================================
-
-
-
-//============================================================================//
-// Job Changer
-//****************************************************************************//
-
-in_moc_16.gat,19,33,4 script Guildsman 55,{
- callfunc "F_BlockHigh",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Assassin Cross","Assassin Huey";
-
- mes "[Angry looking man]";
- if(BaseJob == Job_Assassin) {
- mes "[Assassin Huey]";
- mes "Oohh, its you. You're...." + strcharinfo(0) + " right?";
- next;
- mes "[Assassin Huey]";
- mes "Too bad there's nothing to do right now. You should go train more. Bye.";
- close;
- }
- if(baseClass == Job_Novice){
- mes "....HEY Novice!!! GET out of here now!! I won't be held responsible if anything bad happens to you.......";
- emotion e_gasp;
- close;
- }
- if(baseClass == Job_Swordman){
- mes "....What are you doing here???";
- emotion e_what;
- next;
- mes "[Angry looking man]";
- mes "Doing what you're ordered to do eh?........ You guys are nothing more than dogs that listen to their owners.............";
- emotion e_pif;
- close;
- }
- if(baseClass == Job_Mage){
- mes "...What's a mage like you doing here? You should be paying more attention to your training.....";
- emotion e_hmm;
- close;
- }
- if(baseClass == Job_Archer){
- mes "Uh.... you're one of those people with bows right? Sorry but there are no cute pets here for u to kill..........";
- emotion e_swt;
- next;
- mes "[Angry looking man]";
- mes "Wait...... You're not here to create trouble eh!!? ....LEAVE AT ONCE!!";
- emotion e_gasp;
- close;
- }
- if(baseClass == Job_Acolyte){
- mes "...Oh God's little helper..... What are you doing down in a dreadful place like this?";
- mes "Trust me, you're not going to find any salvation here........ why don't you just run along ok?........";
- emotion e_hmm;
- close;
- }
- if(baseClass == Job_Merchant){
- mes ".... What the??? Do you have any idea where you are??...... GREEDY SCAMMERS like you are not welcome here!!";
- emotion e_gg;
- close;
- }
- if(baseClass != Job_Thief){
- mes ".... Hmm.... although you're not an Assassin or Thief... I have to say I like your sense of style.";
- close;
- }
-
- if(JobLevel >= 40) goto L_Start;
- mes "Hmm? What brings you here?.... I don't think I like the way you're looking at me....?!";
- emotion e_what;
- next;
- mes "[Angry looking man]";
- mes ".... Hmm.... You're not qualified yet. To become an Assassin you will have to meet our expectations.";
- next;
- mes "[Angry looking man]";
- mes "Why don't you go train some more...... You need to have a job level of at least 40 to even hope of becoming one of us....";
- close;
-
-L_Start:
- if(ASSIN_Q == 1) goto L_Failed1;
- if(ASSIN_Q == 2) goto L_Failed2;
- if(ASSIN_Q == 4) goto L_Change;
- mes ".... A Thief huh?..... And a well trained one at that, cause I can't seem to find my wallet!";
- emotion e_heh;
- next;
- mes "[Angry looking man]";
- mes "We need people like you, you know........ So how about taking the next step in the world of crime, and become an Assassin?";
- M_Menu:
- next;
- menu "You bet! I've picked my last pocket.",M_0, "What are the requirements?",M_1, "Maybe later.... I need to steal some things first.",M_2;
-
- M_0:
- mes "[Angry looking man]";
- mes "It's been a long time since we've recieved any Assassin candidates..... anyhow let me send you ^5533FFAssassin 'Kai'^000000.";
- mes "He'll take care of the registration process.";
- enablenpc "Assassin Kai#1";
- disablenpc "Assassin Kai#2";
- savepoint "in_moc_16.gat", 19, 27;
- close2;
- warp "in_moc_16.gat", 19, 76;
- end;
- M_1:
- mes "[Angry looking man]";
- mes "Requirements? Here they are....";
- mes "#1. You have to be a Thief.";
- mes "#2. Must have a job level of at least 40.";
- mes "#3. You have to past the Assassin guild tests.";
- next;
- mes "[Angry looking man]";
- mes "That's all there is too it. If you're confident in your abilities, then test will be a piece of cake.";
- goto M_Menu;
- M_2:
- mes "[Angry looking man]";
- mes "Hmm..? Ok then... so be it........";
- close;
-
-L_Failed1:
- mes "What's this? I can't believe you failed the first test.";
- mes "~Sigh~........................";
- close2;
- disablenpc "Assassin Kai#1";
- enablenpc "Assassin Kai#2";
- warp "in_moc_16.gat", 19, 76;
- end;
-
-L_Failed2:
- mes "What are you doing out here?? Go back in and finish the second test!!";
- close2;
- warp "in_moc_16.gat", 21, 160;
- end;
-
-L_Change:
- if (skillpoint > 0) goto L_SkPoints;
- if(countitem(1008) < 1) goto L_NoNecklace;
- mes "Ah... the Necklace of Oblivion..... that means that the Guild Master has accepted you into the Assassin clan.";
- next;
- mes "[Assassin Huey]";
- mes "Congratulations! After all of your hard work, you can finally become an Assassin!";
- emotion e_no1;
- next;
- mes "[Assassin Huey]";
- mes "Very well done, you are now offically an Assassin. Although you are free to visit us at anytime..............";
- setlook 7,0;
- callfunc "Job_Change",Job_Assassin;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- set kaitrig, 0;
- next;
- mes "[Assassin Huey]";
- mes "Remember that you are on your own now. The shadows are your new home and your best freinds are the blades in your hands...........";
- close;
-
- L_SkPoints:
- mes "You will need to use up all of your skill points if you want to become an Assassin.";
- close;
-
- L_NoNecklace:
- mes "Hmm? You want me to promote you to the job class of Assassin? Well show me your ^5544FF'Necklace of Oblivion'^000000 then.......";
- next;
- mes "[Assassin Huey]";
- mes "You do have one don't you? Only those who have been given the 'Necklace of Oblivion' by the Guild Master have the right to become Assassins.";
- next;
- menu "Oh yeah.... It's in my other pair of Thief pants....",-, "Well... It kinda got stolen... heh....",M_Restart;
-
- mes "[Assassin Huey]";
- mes "I don't care where it is.... if you want to become an Assassin you'd better get it.";
- close;
-
- M_Restart:
- mes "[Assassin Huey]";
- mes "........................................";
- next;
- mes "[Assassin Huey]";
- mes "!!(shouts profanities at you)!!";
- next;
- mes "[Assassin Huey]";
- mes "Have fun stating ALL OVER!!";
- set ASSIN_Q, 0;
- set ASSIN_Q2, 0;
- close2;
- warp "moc_fild16.gat", 206, 155;
- end;
-}
-
-
-//============================================================================//
-// Registrar
-//****************************************************************************//
-
-// Assassin Kai: First Position =================================
-in_moc_16.gat,21,91,4 script Assassin Kai#1 730,4,4,{
- end;
-
-OnTouch:
- mes "[Assassin Kai]";
- mes "Ummm???....";
- disablenpc "Assassin Kai#1";
- enablenpc "Assassin Kai#2";
- close;
-}
-
-// Assassin Kai: Second Position ==============================
-in_moc_16.gat,25,90,4 script Assassin Kai#2 730,2,1,{
- if(kaitrig == 1) goto OnTouch;
- mes "[Assassin Kai]";
- mes "Come closer to me, I like to see a persons face when I'm talking to them.";
- close;
-
-OnTouch:
- set kaitrig, 1;
- mes "[Assassin Kai]";
- if(ASSIN_Q==1) goto L_Failed;
- mes "So you're an Assassin candidate.... ~sigh~.... Let me apologize for my behavior....";
- mes "You see, when someone comes near me, I can't help but hide...... it's a bad habbit really....";
- next;
- mes "[Assassin Kai]";
- mes "Anyhow, welcome. So you want to be an Assassin do you?";
- next;
- menu "Yes. ",M_Yes, "...No.",M_No;
-
- M_Yes:
- mes "[Assassin Kai]";
- mes "Okay, good. Fill out this form first. Make sure to write your name and your job level down";
- next;
- mes "(you fill out the form and hand it back)";
- next;
- mes "[AssassinKai]";
- mes "Let's see... your name is ^5533FF" +strcharinfo(0)+ "^000000... and you have a job level of "+JobLevel+"....";
- next;
- mes "[AssassinKai]";
- if(JobLevel == 50) goto sL_HighLvl;
- mes "Well, you barely passed the job requirements but, meh, it's not important";
- mes "~mumbles~(no one has any guts anymore.... bunch of pansies......)";
- next;
- mes "[Assassin Kai]";
- mes "Hmm? What's that? Oh I was just talking to myself.... it was nothing really.......";
- mes "Anyway, let me send to to the test hall for your first test.";
- set JBLVL, 40;
- close2;
- warp "in_moc_16.gat", 19, 141;
- end;
-
- sL_HighLvl:
- mes "Wow you have a job level of 50! You've been training hard haven't you?";
- mes "The Guild Master will be pleased to see someone of your qualifications.";
- next;
- mes "[Assassin Kai]";
- mes "You first test will be with the ^5533FF'Nameless One'^000000. I'll send you too him right away.";
- set JBLVL, 50;
- close2;
- warp "in_moc_16.gat", 19, 141;
- end;
-
- M_No:
- mes "[Assassin Kai]";
- mes "Huh?? You don't?........";
- emotion e_what;
- next;
- mes "[Assassin Kai]";
- mes "Are you trying to play games with me??";
- next;
- mes "[Assassin Kai]";
- mes "Don't you want to become an Assassin?............";
- next;
- menu "Not really....",-, "Yes, of course I do.",sM_Yes;
-
- mes "[Assassin Kai]";
- mes "....Well, if thats the case,........ GET OUT!!";
- close2;
- warp "moc_fild16.gat", 206, 229;
- end;
- sM_Yes:
- mes "[Assassin Kai]";
- mes "...... Hmf...... Anyways......";
- next;
- goto M_Yes;
-
-L_Failed:
- mes "Ehhh? Weren't you just here a minute ago?";
- emotion e_what;
- next;
- mes "[Assassin Kai]";
- mes "What's this?..... You failed the first test?";
- next;
- mes "[Assassin Kai]";
- mes "HAHAHAHAAHAHAHAHA!!!!";
- emotion e_heh;
- next;
- mes "[Assassin Kai]";
- mes "Hehe...HAHA...~cough~..Damn.... It's been a long time since I've met a looser like you..... Ha Ha....";
- emotion e_heh;
- next;
- mes "[Assassin Kai]";
- mes "Oh...sorry for laughing in your face like this.... but it's just too funny... hahahehehe....";
- emotion e_heh;
- next;
- mes "[Assassin Kai]";
- mes "So..... do you need me to give you any hints?";
- next;
- menu "...yes ...please",-, "Stop laughing and just give me the stupid tips!.",M_1, "Shut up! I don't need your stinkin help!!",M_2;
-
- mes "[Assassin Kai]";
- mes "Hahaahhaha!!! Well at least you're honest.....";
- mes "Haha....My stomach...ouch... my stomach hurts!! You're killing me! Hahahaha!!!";
- emotion e_heh;
- next;
- mes "[Nameless One]";
- mes ".....Hahaha.";
- next;
- mes "[Assasin Kai]";
- mes "HAHAHAHA!! Nameless One, you think its funny too?";
- emotion e_heh;
- next;
- mes "[Nameless One]";
- mes "Hehehe..... yes very.....";
- next;
- mes "[Assassin Kai]";
- mes "Heh heh..... Oh my.....";
- next;
- mes "[Assassin Kai]";
- mes "..... so you want some pointers huh?";
- next;
- mes "[Assassin Kai]";
- mes "...";
- next;
- mes "[Assassin Kai]";
- mes ".....";
- next;
- mes "[Assassin Kai]";
- mes "........";
- next;
- mes "[Assassin Kai]";
- mes "...............";
- next;
- mes "[Assassin Kai]";
- mes "......Hmmm..... Too bad. I don't feel like giving you any.";
- next;
- mes "[Assassin Kai]";
- mes "Hahaha.... I can't beleive this..... hahaha.....";
- emotion e_heh;
- close2;
- warp "in_moc_16.gat", 19, 141;
- end;
- M_1:
- mes "[Assassin Kai]";
- mes "Hmm..... I see... Sorry about my outburst of laughter...... people make mistakes from time to time..... I understand this.";
- next;
- mes "[Assassin Kai]";
- mes "Although I can't give you any answers to the test, I can give you some usefull information about Assassins that may help you......";
- next;
- mes "[Assassin Kai]";
- mes "For an Assassin honor and pride is of the utmost importance. You cannot be an Assassin without any honor.";
- mes "....One day people will come to rely on you. Waiting for that day is an Assassin's destiny.";
- next;
- mes "[Assassin Kai]";
- mes "Assassins are destined to live a solitary life. Our lifestyles make it difficult for us to get close to anyone.";
- mes "Imagine what your loved ones would think if they saw your blood stained hands.......";
- next;
- mes "[Assassin Kai]";
- mes "..... Without a doubt, they would be shocked and become fearfull of you.";
- mes "They would not be able to stay by your side, leaving you all alone to deal with your sins.";
- next;
- mes "[Assassin Kai]";
- mes "Though it is lonesome, it is still a worthy existance.";
- mes "As an Assassin you are free to do as you choose without anyone tying you down or holding you back.";
- next;
- mes "[Assassin Kai]";
- mes "This is all I have to say about Assassins...... I hope what I've said doesn't depress you?";
- close2;
- warp "in_moc_16.gat", 19, 141;
- end;
- M_2:
- mes "[Assassin Kai]";
- mes "...Hmmm.....";
- next;
- mes "[Assassin Kai]";
- mes "Good. Thats the spirit! Never let anyone take away your confidence.";
- mes "Assassins must be strong minded and determined. I apologize for laughing at you earlier.";
- next;
- mes "[Assassin Kai]";
- mes "Unfortunately there are too many morons nowadays, who are not very knowledgable about thier jobs.......";
- next;
- mes "[Assassin Kai]";
- mes "How could they forget about the struggles necessary to become an Assasin??!! They are truly shameless......";
- next;
- mes "[Assassin Kai]";
- mes "So please.............";
- next;
- mes "[Assassin Kai]";
- mes "Always remember to be proud of the fact that you are an Assassin.";
- mes "Have repsect for the blood that stains your katars and daggers!!";
- next;
- menu "Ok cotcha.",-, "Uh... I'm confused.....",sM_End;
-
- mes "[Assassin Kai]";
- mes ".... Good! I'm glad you understand what I'm talking about. Here, let me give you some tips about the first test......";
- next;
- callsub sF_Quiz;
- next;
- mes "[Assassin Kai]";
- mes "I've said quite a lot and I acutally feel a little bit tired now. Hopefully you will do better this time.";
- mes "Get ready, I will send you to the test hall again.";
- close2;
- warp "in_moc_16.gat", 19, 141;
- close;
-
- sM_End:
- mes "[Assassin Kai]";
- mes ".... Hmf... how can you be such an idiot??? You couldn't understand what I was talking about??";
- emotion e_omg;
- next;
- mes "[Assassin Kai]";
- mes "Is an Assassin's honor that hard to comprehend?!";
- next;
- mes "[Assassin Kai]";
- mes "Grrrrr!!! You're probably going to be a moron all of your life...........";
- emotion e_an;
- next;
- mes "[Assassin Kai]";
- mes "GET OUT! Get out of here right now!! You're not fit to become an Assassin!!!";
- emotion e_pif;
- close2;
- warp "c_tower4.gat", 64, 76;
- close;
-
-sF_Quiz:
- if(@temp == 1) goto sL_Quiz2;
- if(@temp == 2) goto sL_Quiz3;
-
- sL_Quiz1:
- mes "[Assassin Kai]";
- mes "First of all, the skill ^554433Grimtooth^000000 can only be used with ^554433Katar^000000 type weapons. It is useless with Daggers.";
- next;
- mes "[Assassin Kai]";
- mes "Poison is a must for all assassins.";
- next;
- mes "[Assassin Kai]";
- mes "Have you used ^554433Double Attack^000000? ...It'll hit the enemy twice ^554433without using sp^000000.";
- next;
- mes "[Assassin Kai]";
- mes "^554433Red Gemstones^000000 are the only stones that Assassins use. Blue Gemstones are useless to Assassins!";
- next;
- mes "[Assassin Kai]";
- mes "Water is stronger than Fire... so that means Water is good against Fire element monsters";
- next;
- mes "[Assassin Kai]";
- mes "Water is moved by Wind, so that means ^554433Water is weak against Wind^000000.";
- next;
- mes "[Assassin Kai]";
- mes "You use ^554433Cloak only when your close to a wall^000000. You can only be 1 cell away from the wall or else you'll be seen.";
- return;
- sL_Quiz2:
- mes "[Assassin Kai]";
- mes "Some Katars have element powers";
- next;
- mes "[Assassin Kai]";
- mes "What weapon is worth buying? If you don't know, look at your hands.";
- next;
- mes "[Assassin Kai]";
- mes "Katars are weapons that are dropped by monsters in the desert. They are very useful";
- next;
- mes "[Assassin Kai]";
- mes "The Katar is one of the strongest weapons a Assassin can use.";
- next;
- mes "[Assassin Kai]";
- mes "I ^554433wouldn't want to raise a Roda Frog as pet^000000, and neither would anyone else for that matter.";
- next;
- mes "[Assassin Kai]";
- mes "^554433Fire^000000 is effective against ^554433ground type monsters^000000.";
- next;
- mes "[Assassin Kai]";
- mes "If you want to know what element your weapon is, look at its name.";
- return;
- sL_Quiz3:
- mes "[Assassin Kai]";
- mes "The ^554433Elder Willow Card adds to your intelligence^000000.";
- next;
- mes "[Assassin Kai]";
- mes "We Assassins specialize in the ability to dodge and attack. Our defense however, is very poor.";
- next;
- mes "[Assassin Kai]";
- mes "......";
- next;
- mes "[Assassin Kai]";
- mes "Dagger class weapons can be used on two hands!";
- next;
- mes "[Assassin Kai]";
- mes "I haven't been to Morroc for a long time.... not since I became a Thief anyway......";
- next;
- mes "[Assassin Kai]";
- mes "Stealing mushrooms..... what fond memories I had of those orange gooey mushrooms.....";
- next;
- mes "[Assassin Kai]";
- mes "The ^554433Baphomet Jr. Card adds 3 agility and 1 critical^000000 to your stats";
- next;
- mes "[Assassin Kai]";
- mes "We Assassins have the highest agility of all the other classes. We can get a ^5533FFmaximum of 10 extra points in agility^000000.";
- return;
-}
-
-
-
-//============================================================================//
-// First Test
-//****************************************************************************//
-
-// Namelss One ====================================================
-in_moc_16.gat,19,150,1 script Nameless One 139,8,6,{
-OnTouch:
- if(ASSIN_Q > 1) end;
-
- warp "in_moc_16.gat",19,142;
- sleep2 700;
-
- if(ASSIN_Q == 1) goto L_ReTest;
- set @LISTEN, 0;
-
- mes "[Nameless One]";
- mes "Welcome, my guest. Muhahaha!!!...... There is no use in trying to find me for I am perfectly hidden!";
- mes "The ability to become totaly hidden is the TRADEMARK of a GREAT Assassin!!";
- next;
- mes "[Nameless One]";
- mes "Huh? Why don't I have a name? Muhahahahaha!!!... The better question to ask is why am I hidden.....";
- next;
- mes "[Nameless One]";
- mes "Afterall I may be trying to assassinate you!!........ Does this scare you?";
- next;
- menu "Eeek! Uh... I think I wet my pants.....",-, "Bleh! Your all talk! Come on, challenge me!",M_1;
-
- mes "[Nameless One]";
- mes "Heh.... doesn't surprise me. I could tell that you were nothing but a wimp!";
- mes "If we had met anywhere else, I would have torn you apart limb from limb.....";
- next;
- mes "[Nameless One]";
- mes "Hmf..... I don't have time for wussies..... get lost......";
- close2;
- disablenpc "Assassin Kai#1";
- enablenpc "Assassin Kai#2";
- warp "in_moc_16.gat", 19, 76;
- end;
- M_1:
- mes "[Nameless One]";
- mes "What?.... So you think you're tough hugh?............";
- next;
- mes "[Nameless One]";
- mes "................";
- next;
- mes "[Nameless One]";
- mes "Hmf..............";
- next;
- mes "[Nameless One]";
- mes "Let me tell you something...........";
- next;
- mes "[Nameless One]";
- mes "I'm a cold blooded killer.... where ever I go, a trail of blood follows my every foot step.....";
- next;
- mes "[Nameless One]";
- mes "A true Assasin such as myself does not need to be recognized by name..... I am known only by the sharp edges of my blades.";
- next;
- mes "[Nameless One]";
- mes "It is my 'handy work' that has gotten me this far..... I have never had any remorse over any of the assignments I've taken....";
- mes "To 'eliminate' targets is what I am here to do.";
- next;
- mes "[Nameless One]";
- mes "Although you speak with confindence, understand this.........";
- next;
- mes "[Nameless One]";
- mes "Only those who are trully cold blooded and without fear, can make it as an Assassin....";
- mes "You will have to do much more than act like an arrogant fool to convince me that you are worthy of being one.........";
- next;
- mes "[Nameless One]";
- mes "Before I start the quiz, I will let you ask me some basic questions.";
- sM_Menu:
- next;
- menu "...What are the skills?",-, "...What's most important about an Assassin?",sM_1, "...Thats enough, I want to start the test.",sM_End;
-
- mes "[Nameless One]";
- mes "Yes, the skills. Skills are very useful to an Assassin. The basic skills are the masteries. I'll tell you about those first.";
- next;
- mes "[Nameless One]";
- mes "First, there's ^5533FFKatar mastery^000000. Katar mastery will increases your attack damage when using a Katar.";
- mes "This skill is very helpful for Katar users.";
- next;
- mes "[Nameless One]";
- mes "Assassins have the ability to use two weapons at the same time. This makes them very fierce warriors.";
- mes "However using two weapons at once does have its drawbacks.....";
- next;
- mes "[Nameless One]";
- mes "It is much more difficult to use 2 weapons at once and therefore the damage you do will be less for each hand.";
- next;
- mes "[Nameless One]";
- mes "That is why there is ^5533FF'Left hand mastery' and 'Right hand mastery'^000000.";
- mes "By mastering these skills, you will be able to regain your attack power for both hands.";
- next;
- mes "[Nameless One]";
- mes "Left hand mastery can be learned when you have gained 2 levels of Right hand mastery.";
- mes "Combined with Katar mastery, you can become a very deadly Assassin indeed.";
- next;
- mes "[Nameless One]";
- mes "^5533FF'Sonic Blow'^000000 is an extremely fast attacking skill. It will allow you to hit the enemy up to 8 times within the blink of an eye.";
- next;
- mes "[Nameless One]";
- mes "This skill only works with a Katar. You also must have at least level 4 Katar Mastery to learn it.";
- mes "The amount of damage done by Sonic Blow depends on how much strength you have.";
- next;
- mes "[Nameless One]";
- mes "^5533FF'Grimtooth^000000 .... what if you could attack someone without being seen?";
- mes "The skill Grimtooth allows you to do just that. While you are cloaked you can do a long range, splash damage attack with Grimtooth.";
- next;
- mes "[Nameless One]";
- mes "Because of the splash damage, Grimtooth can be useful in mob situations.";
- mes "The higher the level of Grimtooth you have the farther you can attack.";
- next;
- mes "[Nameless One]";
- mes "'In order to use ^5533FFCloak^000000, you must have level 2 hide.";
- mes "Cloak allows you to not only become invisible, but it allows you to move around while you are hidden as well.";
- next;
- mes "[Nameless One]";
- mes "You can only move when you are close to a wall though.";
- next;
- mes "[Nameless One]";
- mes "'There is a technique that allows you to give a weapon the poison property. It is called ^5533FFEnchant Poison^000000.";
- next;
- mes "[Nameless One]";
- mes "Once enchanted with poison, there is a chance that an enemy hit by your weapon will become poisoned.";
- mes "You will need at least level 1 Envemon to use this skill.";
- next;
- mes "[Nameless One]";
- mes "^5533FF'Poison React'^000000. This skill will allow you to counter an attack made by a poison type monster.";
- mes "If you want to learn Poison React you must have at least level 3 Enchant posion.";
- next;
- mes "[Nameless One]";
- mes "^5533FF'Vemon Dust'^000000. With this skill you will be able to poison an area on the ground.";
- mes "When a monster enters the area you poisoned there is a good chance that the moster will become poisoned as well.";
- next;
- mes "[Nameless One]";
- mes "The higher the level of the skill, the longer the poison stays in effect. You will need a Red Gemstone to use this skill.";
- mes "Level 5 Enchant Poison is a requirment for learning Venom Dust.";
- next;
- mes "[Nameless One]";
- mes "^5533FF'Venom Splasher'^000000. Not only does this skill poison a target, but it makes the target explode splashing venom everywhere.";
- next;
- mes "[Nameless One]";
- mes "A monster that is hit with Venom Splasher will only explode when it's HP is at 1/3 of maximum.";
- next;
- mes "[Nameless One]";
- mes "This is the most difficult skill to learn for an Assassin. You'll need at least level 5 Venom Dust and level 5 Poison React to learn this skill";
- next;
- mes "[Nameless One]";
- mes "Those are all of the Assassin skills.";
- set @LISTEN, @LISTEN + 1;
- goto sM_Menu;
- sM_1:
- mes "[Nameless One]";
- mes "Hmm.... well for Assassins the most important stat is Agility.";
- mes "By investing in Agility, your ability to dodge and your attack speed will increase greatly.";
- next;
- mes "[Nameless One]";
- mes "Another good stat to invest in is Strength. Having good amounts of Strength with increase your attack allowing you to kill faster.";
- next;
- mes "[Nameless One]";
- mes "This is as much as I can tell you about stats. The rest you will have to figure out through your own experimentation.";
- set @LISTEN, @LISTEN + 1;
- goto sM_Menu;
- sM_End:
- set ASSIN_Q, 1;
- if(@LISTEN > 0) goto L_Test;
- mes "[Nameless One]";
- mes "Hahaha! You're very cocky aren't you..... Don't want to listen to what I have to say eh?!";
- next;
- mes "[Nameless One]";
- mes "Fine then........ I want to see whether or not you can pass this test.....";
- next;
-
-L_Test:
- mes "[Nameless One]";
- mes "Ok, it's now time for the test. If you get more than 1 question ^FF5533wrong^000000, you wil fail the test.";
- next;
- mes "[Nameless One]";
- mes "You will not be told which answers you got right or which answers you got wrong.";
- next;
- set @temp, rand(3);
- set @score, 0;
- mes "[Nameless One]";
- mes "Alright, let us begin.....";
- next;
- if(@temp == 1) goto L_Quiz2;
- if(@temp == 2) goto L_Quiz3;
-
- L_Quiz1:
- mes "[Nameless One]";
- mes "1. What here is ^FF5533not^000000 a prerequisite of the skill Grimtooth?";
- next;
- menu "Cloak Lv 2",sM_1a, "Sonic Blow Lv 5",sM_1a, "Hide Lv 2",sM_1a, "Left hand mastery Lv 2",-;
-
- set @score, @score + 10;
- sM_1a:
-
- mes "[Nameless One]";
- mes "2. Enchant Poison makes your weapon what element?";
- next;
- menu "Poison",-, "Earth",sM_2a, "Fire",sM_2a, "Wind",sM_2a;
-
- set @score, @score + 10;
- sM_2a:
-
- mes "[Nameless One]";
- mes "3. What is the function of level 4 ^5533FFLeft^000000 Hand Mastery?";
- next;
- menu "Attack +80% ",sM_3a, "Attack +70%",-, "Attack +90%",sM_3a, "Attack +108%!!",sM_3a;
-
- set @score, @score + 10;
- sM_3a:
-
- mes "[Nameless One]";
- mes "4. What item do you need to use when you use the skill 'Venom Dust'?";
- next;
- menu "Green Gemstone",sM_4a, "Blue Gemstone",sM_4a, "Yellow Gemstone",sM_4a, "Red Gemstone",-;
-
- set @score, @score + 10;
- sM_4a:
-
- mes "[Nameless One]";
- mes "5. When you increase Enchant Poison up to level 5, what new skill will appear?";
- next;
- menu "Venom Splasher",sM_5a, "Grimtooth",sM_5a, "Sonic Blow",sM_5a, "Venom Dust",-;
-
- set @score, @score + 10;
- sM_5a:
-
- mes "[Nameless One]";
- mes "6. What skill listed below allows you to be walk around unseen?";
- next;
- menu "Hide",sM_6a, "Backslide",sM_6a, "Cloak",-, "Throw Sand",sM_6a;
-
- set @score, @score + 10;
- sM_6a:
-
- mes "[Nameless One]";
- mes "7. What is the requirement for Venom Dust?";
- next;
- menu "Enemy must be weak.",sM_7a, "Must use a red gemstone.",-, "You must have a certain amount of health.",sM_7a;
-
- set @score, @score + 10;
- sM_7a:
-
- mes "[Nameless One]";
- mes "8. What monster card listed below adds to Intelligence?";
- next;
- menu "Steel Chonchon",sM_8a, "Deviruchi",sM_8a, "Elder Willow",-, "Baphomet",sM_8a;
-
- set @score, @score + 10;
- sM_8a:
-
- mes "[Nameless One]";
- mes "9. How much sp do you use when you do a double hit using a dagger?";
- next;
- menu "15",sM_9a, "0",-, "10",sM_9a, "54",sM_9a;
-
- set @score, @score + 10;
- sM_9a:
-
- mes "[Nameless One]";
- mes "10. What is the best type of sword to use in the Bybalan dungeon?";
- next;
- menu "Sword of Piercing Wind",-, "Sword of Ice",sM_10a, "Sword of Earth",sM_10a, "Sword of Fire",sM_10a;
-
- set @score, @score + 10;
- sM_10a:
- goto L_Score;
-
- L_Quiz2:
- mes "[Nameless One]";
- mes "1. Which monster drops a slotted Katar?";
- next;
- menu "Male Thief Bug",sM_1b, "PecoPeco",sM_1b, "Desert wolf",-, "Kobold",sM_1b;
-
- set @score, @score + 10;
- sM_1b:
-
- mes "[Nameless One]";
- mes "2. What card listed below can be inserted into a Jur?";
- next;
- menu "Caramel",-, "Ghostring",sM_2b, "Baphomet Jr",sM_2b, "DoppelGanger",sM_2b;
-
- set @score, @score + 10;
- sM_2b:
-
- mes "[Nameless One]";
- mes "3. Which class can forge weapons?";
- next;
- menu "Merchant",sM_3b, "Blacksmith",-, "Thief",sM_3b, "Priest",sM_3b;
-
- set @score, @score + 10;
- sM_3b:
-
- mes "[Nameless One]";
- mes "4. Which weapon listed below isn't a Katar class weapon?";
- next;
- menu "Jur",sM_4b, "Jamadhar",sM_4b, "Infiltrator",sM_4b, "Gladius",-;
-
- set @score, @score + 10;
- sM_4b:
-
- mes "[Nameless One]";
- mes "5. In Bybalan Dungeon a large amount of monsters are of what elemental type?";
- next;
- menu "Water",-, "Fire",sM_5b, "Wind",sM_5b, "Earth",sM_5b;
-
- set @score, @score + 10;
- sM_5b:
-
- mes "[Nameless One]";
- mes "6. What monster listed below can't be tamed and turned into a cute pet?";
- next;
- menu "Poring",sM_6b, "Rhoda Frog",-, "Lunatic",sM_6b, "Poison Spore",sM_6b;
-
- set @score, @score + 10;
- sM_6b:
-
- mes "[Nameless One]";
- mes "7. Choose the monster that is weakest to fire.";
- next;
- menu "Kobold (Sword)",sM_7b, "Kobold (Mace)",sM_7b, "Kobold (Hammer)",sM_7b, "Kobold (Axe)",-;
-
- set @score, @score + 10;
- sM_7b:
-
- mes "[Nameless One]";
- mes "8. Choose the ^FF5533non^000000-elemental Katar.";
- next;
- menu "Katar of Raging Blaze",sM_8b, "Katar of Dusty Thornbush",sM_8b, "Sharpened Legbone of Ghoul",sM_8b, "Infiltrator",-;
-
- set @score, @score + 10;
- sM_8b:
-
- mes "[Nameless One]";
- mes "9. Pick out the monster that doesn't belong in the group.";
- next;
- menu "Poring",sM_9b, "Ghostring",sM_9b, "Creamy",-, "Drops",sM_9b;
-
- set @score, @score + 10;
- sM_9b:
-
- mes "[Nameless One]";
- mes "10. Choose a ^FF3355non^000000-undead monster.";
- next;
- menu "Drake",sM_10b, "Archer Skeleton",sM_10b, "Poison Spore",-, "Ancient Mummy",sM_10b;
-
- set @score, @score + 10;
- sM_10b:
- goto L_Score;
-
- L_Quiz3:
- mes "[Nameless One]";
- mes "1. What is the increased dodge rate you get when you have the 'Improve Dodge' skill at level 10?";
- next;
- menu "20",sM_1c, "30",-, "140",sM_1c, "15",sM_1c;
-
- set @score, @score + 10;
- sM_1c:
-
- mes "[Nameless One]";
- mes "2. Which monster can detect someone who is hidden/cloaked?";
- next;
- menu "Hodes",sM_2c, "Whispers",-, "Porings",sM_2c, "Munaks",sM_2c;
-
- set @score, @score + 10;
- sM_2c:
-
- mes "[Nameless One]";
- mes "3. Assassins can use dual weapons. Which set of weapons below ^5544FFcan^000000 an Assassin use?";
- next;
- menu "Jur and Mace",sM_3c, "Damascus and Claymore",sM_3c, "Damascus and Stiletto",-, "Axe and Stiletto",sM_3c;
-
- set @score, @score + 10;
- sM_3c:
-
- mes "[Nameless One]";
- mes "4. Which town do you become a Thief in?";
- next;
- menu "Prontera",sM_4c, "Lutie",sM_4c, "AldeBaren",sM_4c, "Morroc",-;
-
- set @score, @score + 10;
- sM_4c:
-
- mes "[Nameless One]";
- mes "5. Which card has ^FF3355nothing^000000 to do with ^5533FFagility^000000?";
- next;
- menu "Baphomet Jr Card",sM_5c, "Whisper Card",-, "Male Thief Bug Card",sM_5c, "Chonchon Card",sM_5c;
-
- set @score, @score + 10;
- sM_5c:
-
- mes "[Nameless One]";
- mes "6. What makes Assassins so special?";
- next;
- menu "Excellent singing ability",sM_6c, "Excellent acting ability",sM_6c, "Excellent dancing ability",sM_6c, "Excellent dodging ability",-;
-
- set @score, @score + 10;
- sM_6c:
-
- mes "[Nameless One]";
- mes "7. When an Assassin reaches a ^5533FFJob level of 50^000000, what is the added bonus he/she recieves to agility?";
- next;
- menu "7",sM_7c, "8",sM_7c, "9",sM_7c, "10",-;
-
- set @score, @score + 10;
- sM_7c:
-
- mes "[Nameless One]";
- mes "8. What piece of equipment cannot be used by an Assassin?";
- next;
- menu "Sword",sM_8c, "Golden helm",-, "Dagger",sM_8c, "Jur",sM_8c;
-
- set @score, @score + 10;
- sM_8c:
-
- mes "[Nameless One]";
- mes "9. When a Novice wants to become a Thief, what mushrooms does he/she need to steal?";
- next;
- menu "Orange Net Mushrooms",-, "Red Gooey Mushrooms",sM_9c, "Orange Gooey Mushrooms",-, "Hairy Orange Mushrooms",sM_9c;
-
- set @score, @score + 10;
- sM_9c:
-
- mes "[Nameless One]";
- mes "10. What card listed below is useless to an Assassin?";
- next;
- menu "Ghostring Card",sM_10c, "Elder Willow Card",-, "Skeleton Soldier Card",sM_10c, "Kobold Card",sM_10c;
-
- set @score, @score + 10;
- sM_10c:
-
-L_Score:
- mes "[Nameless One]";
- mes "Okay, let me just tally up the results.........";
- next;
- mes "[Nameless One]";
- mes "Here is your test score: ^FF5544" +@score+ "^000000/100....";
- if(@score < 90) goto L_Failed;
- mes "... Very well, you passed the quiz.";
- next;
- mes "[Nameless One]";
- mes "Wait don't get so excited yet, there's still another test... Speak to Barkadi and she'll tell you about the second test..";
- savepoint "in_moc_16.gat", 21, 160;
- set ASSIN_Q, 2;
- close;
-
- L_Failed:
- mes "You failed the test!";
- next;
- mes "[Nameless One]";
- mes "It looks like you're underqualified.... how could you expect to become an Assassin with a score like this?";
- next;
- mes "[Nameless One]";
- mes "Since you don't seem to have an ounce of intelligence, I will give you some tips.......";
- next;
- mes "[Nameless One]";
- mes "Speak with Assassin 'Kai', he may be able to help you out. If not try to interperet this code:";
- mes "^5533FFwww.emperium.org......^000000";
- next;
- mes "[Nameless One]";
- mes "It's rumored to have come from another world...... someplace called.... the 'internet'.......";
- close2;
- disablenpc "Assassin Kai#1";
- enablenpc "Assassin Kai#2";
- warp "in_moc_16.gat", 19, 76;
- end;
-
-L_ReTest:
- mes "[Nameless One]";
- mes "Hmf your back..... so your still obsessed with becoming an Assassin eh?";
- next;
- mes "[Nameless One]";
- mes "If it is your true desire to become an Assassin, I'll help you out......";
- next;
- mes "[Nameless One]";
- mes "However, If you fail again.... I suggest you give up on becoming an Assassin!";
- next;
- menu "You're right, I'm not cut out for this.....",-, "I don't care! I'm not giving up!",M_Retry;
-
- mes "[Nameless One]";
- mes "~Cough~cough~... thats a good choice... Being an assassin is lonely.....";
- next;
- mes "[Nameless One]";
- mes "Leave the assassin guild now. Go back to the town you came from!";
- close2;
- warp "moc_fild16.gat", 206, 241;
- end;
- M_Retry:
- mes "[Nameless One]";
- mes "Alright then... I will try to help you become a lonely Assassin, hahahahah.";
- next;
- goto L_Test;
-}
-
-
-//============================================================================//
-// Second Test
-//****************************************************************************//
-
-//=====================================================//
-// Part 1: Eliminate the Target
-//=====================================================//
-
-// Barcardi ==============================>\\
-in_moc_16.gat,21,165,4 script Barcardi 725,{
-
- mes "[Barcardi]";
- mes "I see that you passed the first test ^5533FF" + strcharinfo(0) + "^000000.";
- M_Menu:
- next;
- menu "What is the next test?",M_0, "I want to start the test.",M_1, "I need to go back and rest.",M_End;
-
- M_0:
- mes "[Barcardi]";
- mes "Let me tell you about your next test. This test has 2 parts to it. The first part will test your ability to find and eliminate targets.";
- mes "You will need great precision and patience to pick out your targets among a group of non-targets.";
- next;
- mes "[Barcardi]";
- mes "What you are looking for are monsters named ^5533FF'Job Change Target'^000000. Kill any other target and you will fail the test.";
- mes "You will also be timed durring the test. If you take longer than ^FF55333 minutes^000000 to accomplish your mission you will also fail.";
- next;
- mes "[Barcardi]";
- mes "Being able to identify the correct target quickly is a basic requirement of the Assassin.";
- mes "Another requirement is stealth. An Assassin should NEVER be seen!";
- next;
- mes "[Barcardi]";
- mes "The last portion of the test will require you to sneek past a large group of aggressive and dangerous monsters.";
- mes "Your ^5544FFhide^000000 skill will come in handy here. You will have ^FF55333 minutes^000000 to finish this part of the test as well.";
- next;
- mes "[Barcardi]";
- mes "If you get discovered by the monsters and are killed, or if you run out of time, you will fail the test.";
- next;
- mes "[Barcardi]";
- mes "You must pass BOTH parts of the test in order to move on to the next exam.";
- mes "If you fail one of them, you will have to start the whole test all over again.";
- goto M_Menu;
- M_1:
- mes "[Barcardi]";
- mes "Only 1 person can take the test at one time. When you are ready please enter the waiting room.";
- mes "The test will automatically start when the testing rooms are open.";
- close;
- M_End:
- mes "[Barcardi]";
- mes ".... Okay, come back when you've had enough rest.....";
- next;
- mes "[Barcardi]";
- mes "....... Oh, and don't forget to bring some courage with you loser!";
- emotion e_pif;
- next;
- warp "moc_fild16.gat", 206, 241;
- close;
-
-OnInit:
- waitingroom "Assasin Test Waitingroom",8,"Barcardi::OnStart",1;
- end;
-OnStart:
- set $@SinUsers, getareausers("in_moc_16.gat", 60, 136, 93, 177);
- set $@SinUsers, $@SinUsers + getareausers("in_moc_16.gat", 64, 46, 111, 105);
- if ($@SinUsers > 0) end; // stops the rest of the script from running if there is somebody taking the test
-
- if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
- killmonsterall "in_moc_16.gat";
- warpwaitingpc "in_moc_16.gat", 65, 150;
- donpcevent "SinTest2::OnStart";
- end;
-}
-
-// Job Change Monsters ======================>\\
-in_moc_16.gat,1,1,0 script SinTest2 -1,{
-OnStart:
- set $@SinMob, 6;
- disablenpc "sinWarp1";
- // Target Monsters
- monster "in_moc_16.gat",62,161,"Job Change Target",1002,1,"SinTest2::OnMobDead";
- monster "in_moc_16.gat",85,169,"Job Change Target",1063,1,"SinTest2::OnMobDead";
- monster "in_moc_16.gat",88,152,"Job Change Target",1002,1,"SinTest2::OnMobDead";
- monster "in_moc_16.gat",90,143,"Job Change Target",1113,1,"SinTest2::OnMobDead";
- monster "in_moc_16.gat",74,167,"Job Change Target",1031,1,"SinTest2::OnMobDead";
- monster "in_moc_16.gat",77,173,"Job Change Target",1002,1,"SinTest2::OnMobDead";
- // Decoy Monsters
- monster "in_moc_16.gat",62,161,"Jabs change target",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",85,169,"Warrior test target",1031,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",79,174,"Target",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",85,156,"Job quest target",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",74,171,"bouncer",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",68,173,"I got yours right here!",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",65,158,"Battle Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",60,158,"Soldiet Target",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",64,169,"Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",71,173,"Job change ready",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",77,172,"Don't hit me",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",76,172,"Target",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",75,172,"Not me",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",67,167,"Keep up the good work",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",86,170,"Job target change",1031,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",86,171,"Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",86,170,"Target",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",86,173,"Hope you can become an assassin..",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",85,170,"Battle Monster",1031,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",89,156,"Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",89,156,"Speed182",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",89,156,"Battle Target",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",89,156,"Battlefield Tears",1113,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",89,156,"Job Change Tears",1031,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",83,169,"Evil Servant",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",63,158,"Dead soul",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",63,157,"Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",64,159,"Battle Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",63,159,"Target",1063,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",63,159,"Archer Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",63,159,"Swordman Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",83,148,"Thief Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",82,148,"Acolyte Target",1002,1,"SinTest2::OnFailed";
- monster "in_moc_16.gat",84,148,"Merchant Target",1002,1,"SinTest2::OnFailed";
- set $@sinRmX1, 60;
- set $@sinRmY1, 136;
- set $@sinRmX2, 93;
- set $@sinRmY2, 177;
- set $@wrpX, 19;
- set $@wrpY, 161;
- initnpctimer;
- initnpctimer "TimerSin";
- end;
-
-OnTimer500:
- stopnpctimer;
- areaannounce "in_moc_16.gat", 60, 136, 93, 177, "Okay the test is about to start! Remember to eliminate the monsters called 'Job Change Target'",8;
- end;
-OnMobDead:
- set $@SinMob, $@SinMob -1;
- areaannounce "in_moc_16.gat", 60, 136, 93, 177, "Good. You have " + $@SinMob + " targets left to eliminate.",8;
- if($@SinMob > 0) end;
-
- stopnpctimer "TimerSin";
- killmonsterall "in_moc_16.gat";
- enablenpc "sinWarp1";
- areaannounce "in_moc_16.gat", 60, 136, 93, 177,"Congratulations! You passed the test! A warp has just opened. Use it to leave the test room.",8;
- addtimer 30000, "sinWarp1::OnTimer30000"; // warps player after 30 sec to move test along
- end;
-OnFailed:
- stopnpctimer "TimerSin";
- areaannounce "in_moc_16.gat", 60, 136, 93, 177,"You failed!",8;
- addtimer 3000, "TimerSin::OnTimer188000";
- end;
-}
-
-// Observer ===========================>\\
-in_moc_16.gat,62,153,1 script Observer 55,{
- mes "[Observer]";
- mes "Don't mind me, I'm just here to see how well you do on your test.....";
- close;
-}
-
-// Warp ==============================>\\
-in_moc_16.gat,87,137,0 script sinWarp1 45,2,1,{
-OnTimer30000:
- killmonsterall "in_moc_16.gat";
- enablenpc "Thomas";
- warp "in_moc_16.gat", 87, 102;
- end;
-}
-
-// Booby Traps ========================>\\
-in_moc_16.gat,68,158,0 script 01_1::SinTrap 139,0,0,{
- stopnpctimer "TimerSin";
- warp "in_moc_16.gat", 19, 161;
- killmonsterall "in_moc_16.gat";
- donpcevent "Barcardi::OnStart";
- end;
-}
-in_moc_16.gat,69,158,0 duplicate(SinTrap) 01_2 139,0,0
-in_moc_16.gat,68,159,0 duplicate(SinTrap) 01_3 139,0,0
-in_moc_16.gat,69,159,0 duplicate(SinTrap) 01_4 139,0,0
-in_moc_16.gat,64,162,0 duplicate(SinTrap) 02_1 139,0,0
-in_moc_16.gat,65,162,0 duplicate(SinTrap) 02_2 139,0,0
-in_moc_16.gat,64,163,0 duplicate(SinTrap) 02_3 139,0,0
-in_moc_16.gat,65,163,0 duplicate(SinTrap) 02_4 139,0,0
-in_moc_16.gat,62,168,0 duplicate(SinTrap) 03_1 139,0,0
-in_moc_16.gat,63,168,0 duplicate(SinTrap) 03_2 139,0,0
-in_moc_16.gat,62,169,0 duplicate(SinTrap) 03_3 139,0,0
-in_moc_16.gat,63,169,0 duplicate(SinTrap) 03_4 139,0,0
-in_moc_16.gat,66,170,0 duplicate(SinTrap) 04_1 139,0,0
-in_moc_16.gat,67,170,0 duplicate(SinTrap) 04_2 139,0,0
-in_moc_16.gat,66,171,0 duplicate(SinTrap) 04_3 139,0,0
-in_moc_16.gat,67,171,0 duplicate(SinTrap) 04_4 139,0,0
-in_moc_16.gat,64,174,0 duplicate(SinTrap) 05_1 139,0,0
-in_moc_16.gat,64,175,0 duplicate(SinTrap) 05_2 139,0,0
-in_moc_16.gat,65,174,0 duplicate(SinTrap) 05_3 139,0,0
-in_moc_16.gat,65,175,0 duplicate(SinTrap) 05_4 139,0,0
-in_moc_16.gat,72,174,0 duplicate(SinTrap) 06_1 139,0,0
-in_moc_16.gat,72,175,0 duplicate(SinTrap) 06_2 139,0,0
-in_moc_16.gat,73,174,0 duplicate(SinTrap) 06_3 139,0,0
-in_moc_16.gat,73,175,0 duplicate(SinTrap) 06_4 139,0,0
-in_moc_16.gat,72,166,0 duplicate(SinTrap) 07_1 139,0,0
-in_moc_16.gat,72,167,0 duplicate(SinTrap) 07_2 139,0,0
-in_moc_16.gat,73,166,0 duplicate(SinTrap) 07_3 139,0,0
-in_moc_16.gat,73,167,0 duplicate(SinTrap) 07_4 139,0,0
-in_moc_16.gat,72,168,0 duplicate(SinTrap) 08_1 139,0,0
-in_moc_16.gat,72,169,0 duplicate(SinTrap) 08_2 139,0,0
-in_moc_16.gat,73,168,0 duplicate(SinTrap) 08_3 139,0,0
-in_moc_16.gat,73,169,0 duplicate(SinTrap) 08_4 139,0,0
-in_moc_16.gat,78,168,0 duplicate(SinTrap) 09_1 139,0,0
-in_moc_16.gat,78,169,0 duplicate(SinTrap) 09_2 139,0,0
-in_moc_16.gat,79,168,0 duplicate(SinTrap) 09_3 139,0,0
-in_moc_16.gat,79,169,0 duplicate(SinTrap) 09_4 139,0,0
-in_moc_16.gat,80,172,0 duplicate(SinTrap) 10_1 139,0,0
-in_moc_16.gat,81,172,0 duplicate(SinTrap) 10_2 139,0,0
-in_moc_16.gat,82,172,0 duplicate(SinTrap) 10_3 139,0,0
-in_moc_16.gat,83,172,0 duplicate(SinTrap) 10_4 139,0,0
-in_moc_16.gat,80,173,0 duplicate(SinTrap) 10_5 139,0,0
-in_moc_16.gat,81,173,0 duplicate(SinTrap) 10_6 139,0,0
-in_moc_16.gat,82,173,0 duplicate(SinTrap) 10_7 139,0,0
-in_moc_16.gat,83,173,0 duplicate(SinTrap) 10_8 139,0,0
-in_moc_16.gat,88,174,0 duplicate(SinTrap) 11_1 139,0,0
-in_moc_16.gat,88,175,0 duplicate(SinTrap) 11_2 139,0,0
-in_moc_16.gat,89,174,0 duplicate(SinTrap) 11_3 139,0,0
-in_moc_16.gat,86,166,0 duplicate(SinTrap) 12_1 139,0,0
-in_moc_16.gat,86,167,0 duplicate(SinTrap) 12_2 139,0,0
-in_moc_16.gat,87,166,0 duplicate(SinTrap) 12_3 139,0,0
-in_moc_16.gat,87,167,0 duplicate(SinTrap) 12_4 139,0,0
-in_moc_16.gat,90,164,0 duplicate(SinTrap) 13_1 139,0,0
-in_moc_16.gat,90,165,0 duplicate(SinTrap) 13_2 139,0,0
-in_moc_16.gat,91,164,0 duplicate(SinTrap) 13_3 139,0,0
-in_moc_16.gat,91,165,0 duplicate(SinTrap) 13_4 139,0,0
-in_moc_16.gat,84,160,0 duplicate(SinTrap) 14_1 139,0,0
-in_moc_16.gat,85,160,0 duplicate(SinTrap) 14_2 139,0,0
-in_moc_16.gat,86,160,0 duplicate(SinTrap) 14_3 139,0,0
-in_moc_16.gat,87,160,0 duplicate(SinTrap) 14_4 139,0,0
-in_moc_16.gat,88,160,0 duplicate(SinTrap) 14_5 139,0,0
-in_moc_16.gat,89,160,0 duplicate(SinTrap) 14_6 139,0,0
-in_moc_16.gat,84,161,0 duplicate(SinTrap) 14_7 139,0,0
-in_moc_16.gat,85,161,0 duplicate(SinTrap) 14_8 139,0,0
-in_moc_16.gat,86,161,0 duplicate(SinTrap) 14_9 139,0,0
-in_moc_16.gat,87,161,0 duplicate(SinTrap) 14_10 139,0,0
-in_moc_16.gat,88,161,0 duplicate(SinTrap) 14_11 139,0,0
-in_moc_16.gat,89,161,0 duplicate(SinTrap) 14_12 139,0,0
-in_moc_16.gat,86,154,0 duplicate(SinTrap) 15_1 139,0,0
-in_moc_16.gat,86,155,0 duplicate(SinTrap) 15_2 139,0,0
-in_moc_16.gat,87,154,0 duplicate(SinTrap) 15_3 139,0,0
-in_moc_16.gat,87,155,0 duplicate(SinTrap) 15_4 139,0,0
-in_moc_16.gat,84,150,0 duplicate(SinTrap) 16_1 139,0,0
-in_moc_16.gat,84,151,0 duplicate(SinTrap) 16_2 139,0,0
-in_moc_16.gat,85,150,0 duplicate(SinTrap) 16_3 139,0,0
-in_moc_16.gat,85,151,0 duplicate(SinTrap) 16_4 139,0,0
-in_moc_16.gat,90,150,0 duplicate(SinTrap) 17_1 139,0,0
-in_moc_16.gat,90,151,0 duplicate(SinTrap) 17_2 139,0,0
-in_moc_16.gat,91,150,0 duplicate(SinTrap) 17_3 139,0,0
-in_moc_16.gat,91,151,0 duplicate(SinTrap) 17_4 139,0,0
-in_moc_16.gat,86,146,0 duplicate(SinTrap) 18_1 139,0,0
-in_moc_16.gat,86,147,0 duplicate(SinTrap) 18_2 139,0,0
-in_moc_16.gat,87,146,0 duplicate(SinTrap) 18_3 139,0,0
-in_moc_16.gat,87,147,0 duplicate(SinTrap) 18_4 139,0,0
-
-
-//=========================================================//
-// Part 2: Hide and Sneak
-//=========================================================//
-
-// Thomas ===============================>\\
-in_moc_16.gat,89,98,1 script Thomas 118,4,2,{
-OnTimer600:
- if(ASSIN_Q2 == 1) goto L_ReTest;
- mes "[Thomas]";
- mes "My name is Thomas and I am in charge of this portion of the test.";
- next;
- mes "[Thomas]";
- mes "The goal of this test is to evade and avoid the enemy. You must make it to the warp without out attracting the attention of the monsters in the room.";
- next;
- mes "[Thomas]";
- mes "You must make it through without dying. Because none of these monsters are your targets, you cannot not kill any of them.";
- mes "Use your ablitly to flee and your ability to hide to help you in this test.";
- next;
- mes "[Thomas]";
- mes "Alright.... Get ready.....";
- next;
- set ASSIN_Q2, 1;
- disablenpc "Thomas";
- donpcevent "SinTest2_2::OnStart";
- close;
-L_ReTest:
- mes "[Thomas]";
- mes "~sigh~.... I told you to use your hide skill!! Here let me heal you....";
- next;
- mes "[Thomas]";
- mes "Alright, lets try this again.........";
- percentheal 100, 100;
- next;
- disablenpc "Thomas";
- donpcevent "SinTest2_2::OnStart";
- close;
-OnTouch:
- warp "in_moc_16.gat",87,99;
- addtimer 600, "Thomas::OnTimer600";
- end;
-}
-
-
-// SinTest2_2 ===============================>\\
-in_moc_16.gat,1,1,1 script SinTest2_2 -1,{
-OnStart:
- monster "in_moc_16.gat", 81, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 83, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 85, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 88, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 90, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 78, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 80, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 91, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 93, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 95, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 97, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 79, 62, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 76, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 96, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
- monster "in_moc_16.gat", 99, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
- set $@sinRmX1, 64;
- set $@sinRmY1, 46;
- set $@sinRmX2, 111;
- set $@sinRmY2, 105;
- set $@wrpX, 87;
- set $@wrpY, 102;
- areawarp "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "in_moc_16.gat", $@wrpX, $@wrpY;
- initnpctimer "TimerSin";
- end;
-OnMobDead:
- stopnpctimer "TimerSin";
- areaannounce "in_moc_16.gat", 64, 46, 111, 105, ". . . You engaged a target without permission! You have failed the test!",8;
- enablenpc "Thomas";
- addtimer 3000, "TimerSin::OnTimer188000";
- end;
-}
-
-// Warp ================================>\\
-in_moc_16.gat,87,48,2 script sinWarp2 45,2,2,{
- mes "[Thomas]";
- mes "Good job! There's only one test left, good luck!!";
- stopnpctimer "TimerSin";
- killmonster "in_moc_16.gat","SinTest2_2::OnMobDead";
- set ASSIN_Q, 3;
- set ASSIN_Q2, 0;
- savepoint "in_moc_16.gat", 182, 180;
- close2;
- warp "in_moc_16.gat", 181, 183;
- donpcevent "Barcardi::OnStart";
- end;
-}
-
-
-//=======================================================//
-// Timer for Sin Test 2
-//=======================================================//
-in_moc_16.gat,1,1,0 script TimerSin -1,{
-OnTimer3000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "I'll announce how much time you'll have left on a minute by minute basis.",8;
- end;
-OnTimer5000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "You have 3 minutes starting now!",8;
- end;
-OnTimer35000:
- donpcevent "Barcardi::OnStart";
- end;
-OnTimer65000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "You have 2 minutes left! ",8;
- donpcevent "Barcardi::OnStart";
- end;
-OnTimer95000:
- donpcevent "Barcardi::OnStart";
- end;
-OnTimer125000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "1 minute left!",8;
- donpcevent "Barcardi::OnStart";
- end;
-OnTimer155000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "30 seconds left!",8;
- donpcevent "Barcardi::OnStart";
- end;
-OnTimer180000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "Test ending in 5 secs....",8;
- end;
-OnTimer181000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "4 seconds....",8;
- end;
-OnTimer182000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "3 seconds...",8;
- end;
-OnTimer183000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "2 seconds..",8;
- end;
-OnTimer184000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "1 second.",8;
- end;
-OnTimer185000:
- areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "Okay times up! You failed!",8;
- end;
-OnTimer188000:
- stopnpctimer;
- areawarp "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "in_moc_16.gat", 21, 160;
- killmonsterall "in_moc_16.gat";
- donpcevent "Barcardi::OnStart";
- end;
-}
-
-
-//============================================================================//
-// Final Test
-//****************************************************************************//
-
-//=============================================//
-// Warp
-//=============================================//
-in_moc_16.gat,182,169,1 script sinWarp3 45,1,1,{
- if(getareausers(("in_moc_16.gat"),148,74,187,117) > 0) goto L_Wait;
- disablenpc "Huey#End";
- disablenpc "Kai#End";
- disablenpc "Nameless One#End";
- disablenpc "Barcardi#End";
- disablenpc "Observer#End";
- disablenpc "Thomas#End";
- warp "in_moc_16.gat", 167, 116;
- end;
-
- L_Wait:
- mes "~ a message from the Guild Master...~";
- mes "I am currently busy with another Assassin Candidate. Please wait patiently untill I am done with that person.";
- close;
-}
-
-//==============================================//
-// Guild Master
-//==============================================//
-
-// Start Trigger ------------------------------------------------------------------
-in_moc_16.gat,167,114,3 script guildmaster_Trig#0 139,4,0,{
- mes "[Guild Master]";
- mes "Welcome ^5533FF" + strcharinfo(0) + "^000000. This is my private room.";
- next;
- mes "[Guild Master]";
- mes "I am going to give you a simple test. All you have to do is come meet me.";
- mes "Of course you will have to go through a maze of invisible walls to do so.....";
- next;
- mes "[Guild Master]";
- mes "Hahah... It's really not as hard as it sounds. The purpose of the maze is actually to protect the guild from intruders.";
- mes "But I decided to use it to test the determination of Assassin candidates as well.";
- next;
- mes "[Guild Master]";
- mes "Well enough chit chat. I look forward to meeting you at the end of the maze.";
- close;
-}
-
-// Guild Master -----------------------------------------------------------------------------
-in_moc_16.gat,149,80,4 script Guild Master#01 106,1,1,{
- end;
-
-OnTouch:
- mes "[Guild Master]";
- mes "Ah it's nice to meet you ^5533FF" + strcharinfo(0) + "^000000. I have to apologize for making you walk through that maze.";
- mes "I saw your resume just now, you have been described as a Thief with guts!";
- next;
- mes "[Guild Master]";
- mes "We rarely find someone of your abilities and experience.";
- next;
- mes "[Guild Master]";
- mes "If you don't mind I would like to ask you a few questions. There is nothing to be nervous about.";
- mes "Just answer my questions truthfully..... if you lie, I'll kill you. That's all there is to it.";
- next;
- callsub sF_Questions1;
- next;
-
- mes "[Guild Master]";
- mes "Unfortunately there are nit wits who are eager to be Assassins but have not yet had enough training.";
- mes "They are a disgrace to our clan and their activities often result in very problematic situations.";
- next;
- mes "[Guild Master]";
- mes "You may end up like one of them if you are not careful. Remember... once you become an Assassin there no turning back.";
- next;
- callsub sF_Questions2;
- next;
-
- mes "[Guild Master]";
- mes "It was nice talking with you. You reminded me of the good ol' days.";
- next;
- mes "[Guild Master]";
- mes ".... one second.....";
- next;
- mes "[Guild Master]";
- mes "Everyone that tested " + strcharinfo(0) + "please come to my office .";
- next;
- mes "[Guild Master]";
- mes "They will be here soon.";
- next;
- enablenpc "Huey#End";
- enablenpc "Kai#End";
- enablenpc "Nameless One#End";
- enablenpc "Barcardi#End";
- enablenpc "Observer#End";
- enablenpc "Thomas#End";
- mes "[Nameless One]";
- mes "I am here.";
- next;
- mes "[Guild Master]";
- mes "I would like to know what you think about ^5533FF" + strcharinfo(0) + "^000000 becoming an Assassin.";
- next;
- mes "[Nameless One]";
- mes "I think ^5533FF" + strcharinfo(0) + "^000000 is a decent candidate.";
- next;
- mes "[Guild Master]";
- mes "'Looks like the Nameless One more or less supports you. What are your thought Huey?";
- next;
- mes "[Huey]";
- //if( == 1) mes "...What can I say, one of the best Assassin candidates I've seen in the last few weeks.";
- //if( == 0) mes "... Although a little too mellow and gentle... sort of like a pussy cat, Hahahaha....";
- mes "I think ^5533FF" + strcharinfo(0) + "^000000 will be fine as an Assassin.";
- next;
- mes "[Huey]";
- mes "I have to get back so I will leave first.";
- next;
- mes "[Guild Master]";
- mes "Okay then, thank you Huey.";
- next;
- mes "[Guild Master]";
- mes "So... Observer, what is your opinion?";
- disablenpc "Huey#End";
- next;
- mes "[Observer]";
- mes ".... Well, not one of the better performance I've seen but ^5533FF" + strcharinfo(0) + "^000000 did pass, so I have no objections.";
- next;
- mes "[Guild Master]";
- mes "Good. It seems we are all in agreement. I myself see no problems with ^5533FF" + strcharinfo(0) + "^000000........";
- next;
- mes "[Guild Master]";
- mes "^5533FF" + strcharinfo(0) + "^000000 seems to know alot about Assassins and I don't think the solitary lifestyle will be too difficult for ^5533FF" + strcharinfo(0) + "^000000 either.";
- next;
- mes "[Guild Master]";
- mes "... I think I've said enough. Here please take this........";
- next;
- if(JBLVL == 40) goto L_LowLvl;
-
- L_HighLvl:
- menu "Jur",sM_Jur, "Katar",sM_Kat, "Main Gauche",sM_Main, "Gladius",sM_Glad;
-
- sM_Jur:
- getitem 1251,1;
- goto L_Cont1;
- sM_Kat:
- getitem 1253, 1;
- goto L_Cont1;
- sM_Main:
- getitem 1208, 1;
- goto L_Cont1;
- sM_Glad:
- getitem 1220, 1;
- goto L_Cont1;
-
- L_LowLvl:
- set @temp, rand(1, 3);
- if(@temp==1) getitem 1250, 1;
- if(@temp==2) getitem 1217, 1;
- if(@temp==3) getitem 1252, 1;
-
- L_Cont1:
- mes "[Guild Master]";
- mes "Now go talk to ^5533FFAssassin Huey^000000 back at the guild entrance.";
- mes "For some reason he always looks like he's ^5533FFangry^000000 about something......";
- next;
- mes "[Guild Master]";
- mes "He will be the one promoting you to the Assassin class.";
- next;
- mes "[Guild Master]";
- mes strcharinfo(0) + " has choosen the path of the Assassin. May you learn to endure the hardships that all Assassins must face.";
- getitem 1008, 1;
- next;
- mes "[Guild Master]";
- mes "Okay, everyone you can leave now. I will send you back to the entrance. Lets move......";
- set ASSIN_Q, 4;
- set ASSIN_Q2, 0;
- disablenpc "Kai#End";
- disablenpc "Nameless One#End";
- disablenpc "Barkadi#End";
- disablenpc "Observer#End";
- disablenpc "Thomas#End";
- savepoint "in_moc_16.gat", 18, 28;
- close2;
- warp "in_moc_16.gat", 18, 28;
- end;
-
-
-sF_Questions1:
- mes "[Guild Master]";
- mes "First of all, what do you think is most important to an Assassin?";
- next;
- menu "More power.",M_1, "An Assassin's pride.",M_2, "Endless training.",M_3;
-
- M_1:
- mes "[Guild Master]";
- mes "It is true that an Assassin is stronger than a Thief.";
- mes "By becoming an Assassin you will be capable of doing things no mere Thief could dream of.";
- next;
- mes "[Guild Master]";
- mes "But, why do you want that kind of power?";
- next;
- menu "To take revenge on those who hurt me.",sM_1a, "I will use that power to become wealthy.",sM_1b,
- "To explore new places.",sM_1c;
-
- sM_1a:
- mes "[Guild Master]";
- mes "Vengence huh............ It seems that everyone has enemys these days........";
- next;
- mes "[Guild Master]";
- mes "However, vengence is fueled by emotions, and as an Assassin one cannot give into these emotions.";
- mes "An Assassin must be cold blooded... even heartless.... He/she must not let anything get in the way of the task at hand.";
- next;
- mes "[Guild Master]";
- mes "Emotions are the biggest threat to an Assassin..... they cause confusion and clutter up the mind.....";
- mes "An Assassin must always have a clear train of thought in order to be successful.";
- next;
- mes "[Guild Master]";
- mes "If you are to become an Assassin, you must find a way to control your emotions.... do not let your emotions control you.";
- return;
- sM_1b:
- mes "[Guild Master]";
- mes "Money is an important part of the world.... however it is meaningless to an Assassin.";
- mes "An Assassin's purpose is to carry out the dark, and unpleasant duties that no one else is capable of.....";
- next;
- mes "[Guild Master]";
- mes "True Assassins do no think about fame or fortune.";
- return;
- sM_1c:
- mes "[Guild Master]";
- mes "An interesting idea..... you obviously seek to learn more about the world around you.";
- mes "In knowing more about the world, you gain better insight into yourself.";
- next;
- mes "[Guild Master]";
- mes "But remember that your path will be filled with loneliness. It is a reality that all Assassins must face.";
- next;
- mes "[Guild Master]";
- mes "For those who have succeeded as Assassins, they have not only learned to except this fact.... but they have learned to embrace it.";
- return;
-
- M_2:
- mes "[Guild Master]";
- mes "Pride you say? Did another Assassin mention this to you?.....";
- next;
- mes "[Guild Master]";
- mes "Unfortunately pride without ability means nothing. Hmm... what are you trying to find or gain by becoming an Assassin?";
- next;
- mes "[Guild Master]";
- mes "Most of the people you have met in this guild are my bretheren and they have struggled and sacrifced a great deal as Assassins.";
- mes "It is beacuse they have overcome so much hardship, that they can take great pride in being Assassins.";
- next;
- mes "[Guild Master]";
- mes "You, on the other hand, have not yet faced the difficulties that Assassins do.";
- mes "What then, do you mean when you speak of 'an Assassin's pride'?";
- next;
- menu "The idea of total solitude.",sM_2a, "The ability to make easy money.",sM_2b, "They just look cool.",sM_2c;
-
- sM_2a:
- mes "[Guild Master]";
- mes "It is true that the life of an Assassin is lonesome. In a way, to be an Assassin, is to be non-existant....";
- next;
- mes "[Guild Master]";
- mes "We never make direct contact with any of our clients. The people that we do make contact with..... we kill.";
- next;
- mes "[Guild Master]";
- mes "The only people that know about Assassins are other Assassins....";
- mes "Even then..... we sheild and hide our true inner selves from each other..........";
- next;
- mes "[Guild Master]";
- mes "Even so... having comrades is better that nothing.";
- mes "I recommend you have at least one partner to back you up durring a mission.";
- return;
- sM_2b:
- mes "[Guild Master]";
- mes "Yes, money is important.";
- mes "But don't you think we assassins have much more important thing to deal with?";
- return;
- sM_2c:
- mes "[Guild Master]";
- mes "...So you just think Assassins are cool looking......... ~sigh~";
- mes "This is really sad.... Believe me when I say to you that the purpose of the Assassins is not to merely look good.....";
- next;
- mes "[Guild Master]";
- mes ".... But it is to do those dark deeds which no one wants to nor can do.";
- return;
- M_3:
- mes "[Guild Master]";
- mes "Interesting..... I see that you have already trained a great deal. I suppose that even more training couldn't hurt.....";
- next;
- mes "[Guild Master]";
- mes "Is there any specific area that you would like to improve upon?";
- next;
- menu "Techniques.",sM_3a, "More challenging targets.",sM_3b, "Mental toughness.",sM_3c;
-
- sM_3a:
- mes "[Guild Master]";
- mes "As an Assassin you will have access to many new skills. The harder you train the better you will be at using these skills.";
- next;
- mes "[Guild Master]";
- mes "To be a great Assassin you must use these skills masterfully.";
- return;
- sM_3b:
- mes "[Guild Master]";
- mes "Constantly challenging yourself is a great way to improve your abilities.";
- mes "Facing the same targets over and over again will only make you weaker.";
- next;
- mes "[Guild Master]";
- mes "Good Assassins are always finding ways to challenge themsleves.";
- return;
- sM_3c:
- mes "[Guild Master]";
- mes "This is probably the most important aspect to work on for an Assassin.";
- mes "Not only do Assassins have to be of sound body but they also have to be of sound mind.";
- next;
- mes "[Guild Master]";
- mes "It is crucial for Assassins to be mentally tough, for they are constantly under pressure.";
- mes "The type of situations Assassins are faced with on a daily basis are unimaginable to most ordinary people.";
- next;
- mes "[Guild Master]";
- mes "This is why a true Assassin is constantly training his/her mind.";
- return;
-
-sF_Questions2:
- mes "[Guild Master]";
- mes "So let me ask you this.... If you became an Assassin right now, what is the first thing you would do?";
- next;
- menu "Go into battle!",M_4, "Go back to the ones waiting for me.",M_5, "Learn more about Assassins.",M_6;
-
- M_4:
- mes "[Guild Master]";
- mes "Battle.... is that all?";
- next;
- menu "I would level up quickly.",sM_4a, "I would test my new abilities.",sM_4b, "I would go explore new places.",sM_4c;
-
- sM_4a:
- mes "[Guild Master]";
- mes "Whether or not your an Assassin shouldn't change how quickly you train.";
- mes "You would gain the same experience you did as a Thief. So take it slowly okay?";
- return;
- sM_4b:
- mes "[Guild Master]";
- mes "Testing out your new found skills is good.";
- mes "I can understand the excitement you will feel when you have gained new abilities as an Assassin.";
- next;
- mes "[Guild Master]";
- mes "Just don't let that get in the way of your duites.";
- return;
- sM_4c:
- mes "[Guild Master]";
- mes "Exploration is good. Find new places and meet new people.";
- mes "You'll never know when you will meet a prospective client.";
- return;
-
- M_5:
- mes "[Guild Master]";
- mes "Someone's waitng for you?";
- next;
- menu "Yes, the people I met in this guild.",sM_5a, "A friend and partner.",sM_5b, "The love of my life.",sM_5c;
-
- sM_5a:
- mes "[Guild Master]";
- mes "Haha. I think they would be happy to know that you are thinking of them.";
- mes "No matter where you go, or what you do, you will always have a place here in this guild.";
- return;
- sM_5b:
- mes "[Guild Master]";
- mes "Good friends can be hard to find, and those that you can call a partner are even rarer.";
- mes "It's good that you have a friend that you can trust and work with.";
- return;
- sM_5c:
- mes "[Guild Master]";
- if(sex == 1) mes "Oh you have a girlfriend... then become her shadow and protect her.";
- if(sex == 0) mes "Oh you have a boyfriend... then become his shadow and protect him.";
- next;
- mes "[Guild Master]";
- mes "As an Assassin you will find it very difficult to ever meet someone else, so make sure you treasure what you have now.";
- return;
-
- M_6:
- mes "[Guild Master]";
- mes "Okay, so what is it that you would like to know?";
- next;
- menu "Where's the easiest place to train?",sM_6a, "Where do Assassins usually go to gain exp?",sM_6b,
- "How does an Assassin make money?",sM_6c;
-
- sM_6a:
- mes "[Guild Master]";
- mes "Where ever an Assassin may be, he/she must learn to adapt and survive.";
- mes "Assassins do not have the luxury of choosing where they work.";
- return;
- sM_6b:
- mes "[Guild Master]";
- mes "There are many experienced Assassins wandering the continent of Rune-Midgard. Seek them out and ask for their knowledge.";
- next;
- mes "[Guild Master]";
- mes "The best way to gain experience however, is to go out and experience the world for yourself.";
- return;
- sM_6c:
- mes "[Guild Master]";
- mes "Damit, is money that important to you? An Assassins life does not revolve around money.....";
- return;
-
-}
-
-
-//=============================================//
-// Maze Triggers
-//=============================================//
-in_moc_16.gat,170,90,0 script maze_trig#1 139,0,0,{
- mes "[Guild Master]";
- mes "There's no way to walk there, try another way.";
- close;
-}
-in_moc_16.gat,150,85,0 script maze_trig#2 139,0,0,{
- mes "[Guild Master]";
- mes ".... Getting warmer.... you're almost there.....";
- close;
-}
-in_moc_16.gat,153,85,0 script maze_trig#3 139,0,0,{
- mes "[Guild Master]";
- mes "You can't walk there..";
- mes "Good, your almost there, keep walking.";
- mes "You have to walk in between a pole and a.....";
- mes "you got to turn a round in order to get in.";
- close;
-}
-in_moc_16.gat,160,85,0 script maze_trig#4 139,0,0,{
- mes "[Guild Master]";
- mes "There's no way to walk there, try another way.";
- close;
-}
-in_moc_16.gat,175,89,0 script maze_trig#5 139,0,0,{
- mes "[Guild Master]";
- mes "That way leads to Botogun..";
- mes "What are going to do there?";
- close;
-}
-in_moc_16.gat,164,88,0 script maze_trig#6 139,0,0,{
- mes "[Guild Master]";
- mes "Good.... you're on the right track.";
- close;
-}
-in_moc_16.gat,149,95,0 script maze_trig#7 139,0,0,{
- mes "[Guild Master]";
- mes "Good, you found the path.";
- close;
-}
-in_moc_16.gat,180,101,0 script maze_trig#8 139,0,0,{
- mes "[Guild Master]";
- mes "... It looks like that's not that way...";
- close;
-}
-in_moc_16.gat,186,107,0 script maze_trig#9 139,0,0,{
- mes "[Guild Master]";
- mes "...Not that way either...";
- close;
-}
-
-
-//================================================//
-// Decoy Chief
-//================================================//
-in_moc_16.gat,186,81,0 script Guild Master#02 55,{
- mes "[Guild Master Botogun]";
- mes "I'm sorry but I am not the person in charge here.";
- mes "The real Guild Chief is on the other side.";
- close;
-}
-
-
-//=================================================//
-// Guild Npcs
-//=================================================//
-in_moc_16.gat,156,85,1 script Huey#End 55,{end;}
-in_moc_16.gat,156,83,1 script Kai#End 730,{end;}
-in_moc_16.gat,156,81,1 script Nameless One#End 106,{end;}
-in_moc_16.gat,156,79,1 script Barcardi#End 725,{end;}
-in_moc_16.gat,156,77,1 script Observer#End 55,{end;}
-in_moc_16.gat,156,75,1 script Thomas#End 118,{end;}
-
-
-//==============================================================================
-// mapflag
-//==============================================================================
-in_moc_16.gat mapflag nomemo
-in_moc_16.gat mapflag noteleport
-in_moc_16.gat mapflag nosave SavePoint
-in_moc_16.gat mapflag nopenalty
-in_moc_16.gat mapflag nobranch
-in_moc_16.gat mapflag noexp
-in_moc_16.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Assassin Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 2.4
+//===== Compatible With: =====================================
+//= eAthena RC4
+//===== Description: =========================================
+//= Based of Official RO Assassin jobchange quest. There are small
+//= differences due to gameplay issues.
+//===== Additional Comments: =================================
+//= v1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
+//= Also converted the booby traps from the aegis script.[kobra_k88]
+//= v1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
+//= Fixed some duplicate npc names. Added missing waitingroom triggers.
+//= Fixed warp in "TimerSin", was supposed to be an areawarp.
+//= For some reason sometimes the "Nameless One" would have message windows
+//= without controls. Changed the doevent that triggers him to an
+//= addtimer and that seemed make the prob. go away[kobra_k88]
+//= 1.2 Fixed WRONG skillpoint check! [Lupus]
+//= 1.2b Fixed missing commands and typos [Lupus]
+//= 1.3 Baby class Support added [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Merged back JFunc. Fixed missing dialogue [Lupus]
+//= 2.3 Fixed typo and change Nameless addtimer to 100 (with 700ms I
+//= was still able to bypass it) [Toms]
+//= 2.4 Fixed skipping of Nameless NPC [Lupus]
+//============================================================
+
+
+
+//============================================================================//
+// Job Changer
+//****************************************************************************//
+
+in_moc_16.gat,19,33,4 script Guildsman 55,{
+ callfunc "F_BlockHigh",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Assassin Cross","Assassin Huey";
+
+ mes "[Angry looking man]";
+ if(BaseJob == Job_Assassin) {
+ mes "[Assassin Huey]";
+ mes "Oohh, its you. You're...." + strcharinfo(0) + " right?";
+ next;
+ mes "[Assassin Huey]";
+ mes "Too bad there's nothing to do right now. You should go train more. Bye.";
+ close;
+ }
+ if(baseClass == Job_Novice){
+ mes "....HEY Novice!!! GET out of here now!! I won't be held responsible if anything bad happens to you.......";
+ emotion e_gasp;
+ close;
+ }
+ if(baseClass == Job_Swordman){
+ mes "....What are you doing here???";
+ emotion e_what;
+ next;
+ mes "[Angry looking man]";
+ mes "Doing what you're ordered to do eh?........ You guys are nothing more than dogs that listen to their owners.............";
+ emotion e_pif;
+ close;
+ }
+ if(baseClass == Job_Mage){
+ mes "...What's a mage like you doing here? You should be paying more attention to your training.....";
+ emotion e_hmm;
+ close;
+ }
+ if(baseClass == Job_Archer){
+ mes "Uh.... you're one of those people with bows right? Sorry but there are no cute pets here for u to kill..........";
+ emotion e_swt;
+ next;
+ mes "[Angry looking man]";
+ mes "Wait...... You're not here to create trouble eh!!? ....LEAVE AT ONCE!!";
+ emotion e_gasp;
+ close;
+ }
+ if(baseClass == Job_Acolyte){
+ mes "...Oh God's little helper..... What are you doing down in a dreadful place like this?";
+ mes "Trust me, you're not going to find any salvation here........ why don't you just run along ok?........";
+ emotion e_hmm;
+ close;
+ }
+ if(baseClass == Job_Merchant){
+ mes ".... What the??? Do you have any idea where you are??...... GREEDY SCAMMERS like you are not welcome here!!";
+ emotion e_gg;
+ close;
+ }
+ if(baseClass != Job_Thief){
+ mes ".... Hmm.... although you're not an Assassin or Thief... I have to say I like your sense of style.";
+ close;
+ }
+
+ if(JobLevel >= 40) goto L_Start;
+ mes "Hmm? What brings you here?.... I don't think I like the way you're looking at me....?!";
+ emotion e_what;
+ next;
+ mes "[Angry looking man]";
+ mes ".... Hmm.... You're not qualified yet. To become an Assassin you will have to meet our expectations.";
+ next;
+ mes "[Angry looking man]";
+ mes "Why don't you go train some more...... You need to have a job level of at least 40 to even hope of becoming one of us....";
+ close;
+
+L_Start:
+ if(ASSIN_Q == 1) goto L_Failed1;
+ if(ASSIN_Q == 2) goto L_Failed2;
+ if(ASSIN_Q == 4) goto L_Change;
+ mes ".... A Thief huh?..... And a well trained one at that, cause I can't seem to find my wallet!";
+ emotion e_heh;
+ next;
+ mes "[Angry looking man]";
+ mes "We need people like you, you know........ So how about taking the next step in the world of crime, and become an Assassin?";
+ M_Menu:
+ next;
+ menu "You bet! I've picked my last pocket.",M_0, "What are the requirements?",M_1, "Maybe later.... I need to steal some things first.",M_2;
+
+ M_0:
+ mes "[Angry looking man]";
+ mes "It's been a long time since we've recieved any Assassin candidates..... anyhow let me send you ^5533FFAssassin 'Kai'^000000.";
+ mes "He'll take care of the registration process.";
+ enablenpc "Assassin Kai#1";
+ disablenpc "Assassin Kai#2";
+ savepoint "in_moc_16.gat", 19, 27;
+ close2;
+ warp "in_moc_16.gat", 19, 76;
+ end;
+ M_1:
+ mes "[Angry looking man]";
+ mes "Requirements? Here they are....";
+ mes "#1. You have to be a Thief.";
+ mes "#2. Must have a job level of at least 40.";
+ mes "#3. You have to past the Assassin guild tests.";
+ next;
+ mes "[Angry looking man]";
+ mes "That's all there is too it. If you're confident in your abilities, then test will be a piece of cake.";
+ goto M_Menu;
+ M_2:
+ mes "[Angry looking man]";
+ mes "Hmm..? Ok then... so be it........";
+ close;
+
+L_Failed1:
+ mes "What's this? I can't believe you failed the first test.";
+ mes "~Sigh~........................";
+ close2;
+ disablenpc "Assassin Kai#1";
+ enablenpc "Assassin Kai#2";
+ warp "in_moc_16.gat", 19, 76;
+ end;
+
+L_Failed2:
+ mes "What are you doing out here?? Go back in and finish the second test!!";
+ close2;
+ warp "in_moc_16.gat", 21, 160;
+ end;
+
+L_Change:
+ if (skillpoint > 0) goto L_SkPoints;
+ if(countitem(1008) < 1) goto L_NoNecklace;
+ mes "Ah... the Necklace of Oblivion..... that means that the Guild Master has accepted you into the Assassin clan.";
+ next;
+ mes "[Assassin Huey]";
+ mes "Congratulations! After all of your hard work, you can finally become an Assassin!";
+ emotion e_no1;
+ next;
+ mes "[Assassin Huey]";
+ mes "Very well done, you are now offically an Assassin. Although you are free to visit us at anytime..............";
+ setlook 7,0;
+ callfunc "Job_Change",Job_Assassin;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ set kaitrig, 0;
+ next;
+ mes "[Assassin Huey]";
+ mes "Remember that you are on your own now. The shadows are your new home and your best freinds are the blades in your hands...........";
+ close;
+
+ L_SkPoints:
+ mes "You will need to use up all of your skill points if you want to become an Assassin.";
+ close;
+
+ L_NoNecklace:
+ mes "Hmm? You want me to promote you to the job class of Assassin? Well show me your ^5544FF'Necklace of Oblivion'^000000 then.......";
+ next;
+ mes "[Assassin Huey]";
+ mes "You do have one don't you? Only those who have been given the 'Necklace of Oblivion' by the Guild Master have the right to become Assassins.";
+ next;
+ menu "Oh yeah.... It's in my other pair of Thief pants....",-, "Well... It kinda got stolen... heh....",M_Restart;
+
+ mes "[Assassin Huey]";
+ mes "I don't care where it is.... if you want to become an Assassin you'd better get it.";
+ close;
+
+ M_Restart:
+ mes "[Assassin Huey]";
+ mes "........................................";
+ next;
+ mes "[Assassin Huey]";
+ mes "!!(shouts profanities at you)!!";
+ next;
+ mes "[Assassin Huey]";
+ mes "Have fun stating ALL OVER!!";
+ set ASSIN_Q, 0;
+ set ASSIN_Q2, 0;
+ close2;
+ warp "moc_fild16.gat", 206, 155;
+ end;
+}
+
+
+//============================================================================//
+// Registrar
+//****************************************************************************//
+
+// Assassin Kai: First Position =================================
+in_moc_16.gat,21,91,4 script Assassin Kai#1 730,4,4,{
+ end;
+
+OnTouch:
+ mes "[Assassin Kai]";
+ mes "Ummm???....";
+ disablenpc "Assassin Kai#1";
+ enablenpc "Assassin Kai#2";
+ close;
+}
+
+// Assassin Kai: Second Position ==============================
+in_moc_16.gat,25,90,4 script Assassin Kai#2 730,2,1,{
+ if(kaitrig == 1) goto OnTouch;
+ mes "[Assassin Kai]";
+ mes "Come closer to me, I like to see a persons face when I'm talking to them.";
+ close;
+
+OnTouch:
+ set kaitrig, 1;
+ mes "[Assassin Kai]";
+ if(ASSIN_Q==1) goto L_Failed;
+ mes "So you're an Assassin candidate.... ~sigh~.... Let me apologize for my behavior....";
+ mes "You see, when someone comes near me, I can't help but hide...... it's a bad habbit really....";
+ next;
+ mes "[Assassin Kai]";
+ mes "Anyhow, welcome. So you want to be an Assassin do you?";
+ next;
+ menu "Yes. ",M_Yes, "...No.",M_No;
+
+ M_Yes:
+ mes "[Assassin Kai]";
+ mes "Okay, good. Fill out this form first. Make sure to write your name and your job level down";
+ next;
+ mes "(you fill out the form and hand it back)";
+ next;
+ mes "[AssassinKai]";
+ mes "Let's see... your name is ^5533FF" +strcharinfo(0)+ "^000000... and you have a job level of "+JobLevel+"....";
+ next;
+ mes "[AssassinKai]";
+ if(JobLevel == 50) goto sL_HighLvl;
+ mes "Well, you barely passed the job requirements but, meh, it's not important";
+ mes "~mumbles~(no one has any guts anymore.... bunch of pansies......)";
+ next;
+ mes "[Assassin Kai]";
+ mes "Hmm? What's that? Oh I was just talking to myself.... it was nothing really.......";
+ mes "Anyway, let me send to to the test hall for your first test.";
+ set JBLVL, 40;
+ close2;
+ warp "in_moc_16.gat", 19, 141;
+ end;
+
+ sL_HighLvl:
+ mes "Wow you have a job level of 50! You've been training hard haven't you?";
+ mes "The Guild Master will be pleased to see someone of your qualifications.";
+ next;
+ mes "[Assassin Kai]";
+ mes "You first test will be with the ^5533FF'Nameless One'^000000. I'll send you too him right away.";
+ set JBLVL, 50;
+ close2;
+ warp "in_moc_16.gat", 19, 141;
+ end;
+
+ M_No:
+ mes "[Assassin Kai]";
+ mes "Huh?? You don't?........";
+ emotion e_what;
+ next;
+ mes "[Assassin Kai]";
+ mes "Are you trying to play games with me??";
+ next;
+ mes "[Assassin Kai]";
+ mes "Don't you want to become an Assassin?............";
+ next;
+ menu "Not really....",-, "Yes, of course I do.",sM_Yes;
+
+ mes "[Assassin Kai]";
+ mes "....Well, if thats the case,........ GET OUT!!";
+ close2;
+ warp "moc_fild16.gat", 206, 229;
+ end;
+ sM_Yes:
+ mes "[Assassin Kai]";
+ mes "...... Hmf...... Anyways......";
+ next;
+ goto M_Yes;
+
+L_Failed:
+ mes "Ehhh? Weren't you just here a minute ago?";
+ emotion e_what;
+ next;
+ mes "[Assassin Kai]";
+ mes "What's this?..... You failed the first test?";
+ next;
+ mes "[Assassin Kai]";
+ mes "HAHAHAHAAHAHAHAHA!!!!";
+ emotion e_heh;
+ next;
+ mes "[Assassin Kai]";
+ mes "Hehe...HAHA...~cough~..Damn.... It's been a long time since I've met a looser like you..... Ha Ha....";
+ emotion e_heh;
+ next;
+ mes "[Assassin Kai]";
+ mes "Oh...sorry for laughing in your face like this.... but it's just too funny... hahahehehe....";
+ emotion e_heh;
+ next;
+ mes "[Assassin Kai]";
+ mes "So..... do you need me to give you any hints?";
+ next;
+ menu "...yes ...please",-, "Stop laughing and just give me the stupid tips!.",M_1, "Shut up! I don't need your stinkin help!!",M_2;
+
+ mes "[Assassin Kai]";
+ mes "Hahaahhaha!!! Well at least you're honest.....";
+ mes "Haha....My stomach...ouch... my stomach hurts!! You're killing me! Hahahaha!!!";
+ emotion e_heh;
+ next;
+ mes "[Nameless One]";
+ mes ".....Hahaha.";
+ next;
+ mes "[Assasin Kai]";
+ mes "HAHAHAHA!! Nameless One, you think its funny too?";
+ emotion e_heh;
+ next;
+ mes "[Nameless One]";
+ mes "Hehehe..... yes very.....";
+ next;
+ mes "[Assassin Kai]";
+ mes "Heh heh..... Oh my.....";
+ next;
+ mes "[Assassin Kai]";
+ mes "..... so you want some pointers huh?";
+ next;
+ mes "[Assassin Kai]";
+ mes "...";
+ next;
+ mes "[Assassin Kai]";
+ mes ".....";
+ next;
+ mes "[Assassin Kai]";
+ mes "........";
+ next;
+ mes "[Assassin Kai]";
+ mes "...............";
+ next;
+ mes "[Assassin Kai]";
+ mes "......Hmmm..... Too bad. I don't feel like giving you any.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Hahaha.... I can't beleive this..... hahaha.....";
+ emotion e_heh;
+ close2;
+ warp "in_moc_16.gat", 19, 141;
+ end;
+ M_1:
+ mes "[Assassin Kai]";
+ mes "Hmm..... I see... Sorry about my outburst of laughter...... people make mistakes from time to time..... I understand this.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Although I can't give you any answers to the test, I can give you some usefull information about Assassins that may help you......";
+ next;
+ mes "[Assassin Kai]";
+ mes "For an Assassin honor and pride is of the utmost importance. You cannot be an Assassin without any honor.";
+ mes "....One day people will come to rely on you. Waiting for that day is an Assassin's destiny.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Assassins are destined to live a solitary life. Our lifestyles make it difficult for us to get close to anyone.";
+ mes "Imagine what your loved ones would think if they saw your blood stained hands.......";
+ next;
+ mes "[Assassin Kai]";
+ mes "..... Without a doubt, they would be shocked and become fearfull of you.";
+ mes "They would not be able to stay by your side, leaving you all alone to deal with your sins.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Though it is lonesome, it is still a worthy existance.";
+ mes "As an Assassin you are free to do as you choose without anyone tying you down or holding you back.";
+ next;
+ mes "[Assassin Kai]";
+ mes "This is all I have to say about Assassins...... I hope what I've said doesn't depress you?";
+ close2;
+ warp "in_moc_16.gat", 19, 141;
+ end;
+ M_2:
+ mes "[Assassin Kai]";
+ mes "...Hmmm.....";
+ next;
+ mes "[Assassin Kai]";
+ mes "Good. Thats the spirit! Never let anyone take away your confidence.";
+ mes "Assassins must be strong minded and determined. I apologize for laughing at you earlier.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Unfortunately there are too many morons nowadays, who are not very knowledgable about thier jobs.......";
+ next;
+ mes "[Assassin Kai]";
+ mes "How could they forget about the struggles necessary to become an Assasin??!! They are truly shameless......";
+ next;
+ mes "[Assassin Kai]";
+ mes "So please.............";
+ next;
+ mes "[Assassin Kai]";
+ mes "Always remember to be proud of the fact that you are an Assassin.";
+ mes "Have repsect for the blood that stains your katars and daggers!!";
+ next;
+ menu "Ok cotcha.",-, "Uh... I'm confused.....",sM_End;
+
+ mes "[Assassin Kai]";
+ mes ".... Good! I'm glad you understand what I'm talking about. Here, let me give you some tips about the first test......";
+ next;
+ callsub sF_Quiz;
+ next;
+ mes "[Assassin Kai]";
+ mes "I've said quite a lot and I acutally feel a little bit tired now. Hopefully you will do better this time.";
+ mes "Get ready, I will send you to the test hall again.";
+ close2;
+ warp "in_moc_16.gat", 19, 141;
+ close;
+
+ sM_End:
+ mes "[Assassin Kai]";
+ mes ".... Hmf... how can you be such an idiot??? You couldn't understand what I was talking about??";
+ emotion e_omg;
+ next;
+ mes "[Assassin Kai]";
+ mes "Is an Assassin's honor that hard to comprehend?!";
+ next;
+ mes "[Assassin Kai]";
+ mes "Grrrrr!!! You're probably going to be a moron all of your life...........";
+ emotion e_an;
+ next;
+ mes "[Assassin Kai]";
+ mes "GET OUT! Get out of here right now!! You're not fit to become an Assassin!!!";
+ emotion e_pif;
+ close2;
+ warp "c_tower4.gat", 64, 76;
+ close;
+
+sF_Quiz:
+ if(@temp == 1) goto sL_Quiz2;
+ if(@temp == 2) goto sL_Quiz3;
+
+ sL_Quiz1:
+ mes "[Assassin Kai]";
+ mes "First of all, the skill ^554433Grimtooth^000000 can only be used with ^554433Katar^000000 type weapons. It is useless with Daggers.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Poison is a must for all assassins.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Have you used ^554433Double Attack^000000? ...It'll hit the enemy twice ^554433without using sp^000000.";
+ next;
+ mes "[Assassin Kai]";
+ mes "^554433Red Gemstones^000000 are the only stones that Assassins use. Blue Gemstones are useless to Assassins!";
+ next;
+ mes "[Assassin Kai]";
+ mes "Water is stronger than Fire... so that means Water is good against Fire element monsters";
+ next;
+ mes "[Assassin Kai]";
+ mes "Water is moved by Wind, so that means ^554433Water is weak against Wind^000000.";
+ next;
+ mes "[Assassin Kai]";
+ mes "You use ^554433Cloak only when your close to a wall^000000. You can only be 1 cell away from the wall or else you'll be seen.";
+ return;
+ sL_Quiz2:
+ mes "[Assassin Kai]";
+ mes "Some Katars have element powers";
+ next;
+ mes "[Assassin Kai]";
+ mes "What weapon is worth buying? If you don't know, look at your hands.";
+ next;
+ mes "[Assassin Kai]";
+ mes "Katars are weapons that are dropped by monsters in the desert. They are very useful";
+ next;
+ mes "[Assassin Kai]";
+ mes "The Katar is one of the strongest weapons a Assassin can use.";
+ next;
+ mes "[Assassin Kai]";
+ mes "I ^554433wouldn't want to raise a Roda Frog as pet^000000, and neither would anyone else for that matter.";
+ next;
+ mes "[Assassin Kai]";
+ mes "^554433Fire^000000 is effective against ^554433ground type monsters^000000.";
+ next;
+ mes "[Assassin Kai]";
+ mes "If you want to know what element your weapon is, look at its name.";
+ return;
+ sL_Quiz3:
+ mes "[Assassin Kai]";
+ mes "The ^554433Elder Willow Card adds to your intelligence^000000.";
+ next;
+ mes "[Assassin Kai]";
+ mes "We Assassins specialize in the ability to dodge and attack. Our defense however, is very poor.";
+ next;
+ mes "[Assassin Kai]";
+ mes "......";
+ next;
+ mes "[Assassin Kai]";
+ mes "Dagger class weapons can be used on two hands!";
+ next;
+ mes "[Assassin Kai]";
+ mes "I haven't been to Morroc for a long time.... not since I became a Thief anyway......";
+ next;
+ mes "[Assassin Kai]";
+ mes "Stealing mushrooms..... what fond memories I had of those orange gooey mushrooms.....";
+ next;
+ mes "[Assassin Kai]";
+ mes "The ^554433Baphomet Jr. Card adds 3 agility and 1 critical^000000 to your stats";
+ next;
+ mes "[Assassin Kai]";
+ mes "We Assassins have the highest agility of all the other classes. We can get a ^5533FFmaximum of 10 extra points in agility^000000.";
+ return;
+}
+
+
+
+//============================================================================//
+// First Test
+//****************************************************************************//
+
+// Namelss One ====================================================
+in_moc_16.gat,19,150,1 script Nameless One 139,8,6,{
+OnTouch:
+ if(ASSIN_Q > 1) end;
+
+ warp "in_moc_16.gat",19,142;
+ sleep2 700;
+
+ if(ASSIN_Q == 1) goto L_ReTest;
+ set @LISTEN, 0;
+
+ mes "[Nameless One]";
+ mes "Welcome, my guest. Muhahaha!!!...... There is no use in trying to find me for I am perfectly hidden!";
+ mes "The ability to become totaly hidden is the TRADEMARK of a GREAT Assassin!!";
+ next;
+ mes "[Nameless One]";
+ mes "Huh? Why don't I have a name? Muhahahahaha!!!... The better question to ask is why am I hidden.....";
+ next;
+ mes "[Nameless One]";
+ mes "Afterall I may be trying to assassinate you!!........ Does this scare you?";
+ next;
+ menu "Eeek! Uh... I think I wet my pants.....",-, "Bleh! Your all talk! Come on, challenge me!",M_1;
+
+ mes "[Nameless One]";
+ mes "Heh.... doesn't surprise me. I could tell that you were nothing but a wimp!";
+ mes "If we had met anywhere else, I would have torn you apart limb from limb.....";
+ next;
+ mes "[Nameless One]";
+ mes "Hmf..... I don't have time for wussies..... get lost......";
+ close2;
+ disablenpc "Assassin Kai#1";
+ enablenpc "Assassin Kai#2";
+ warp "in_moc_16.gat", 19, 76;
+ end;
+ M_1:
+ mes "[Nameless One]";
+ mes "What?.... So you think you're tough hugh?............";
+ next;
+ mes "[Nameless One]";
+ mes "................";
+ next;
+ mes "[Nameless One]";
+ mes "Hmf..............";
+ next;
+ mes "[Nameless One]";
+ mes "Let me tell you something...........";
+ next;
+ mes "[Nameless One]";
+ mes "I'm a cold blooded killer.... where ever I go, a trail of blood follows my every foot step.....";
+ next;
+ mes "[Nameless One]";
+ mes "A true Assasin such as myself does not need to be recognized by name..... I am known only by the sharp edges of my blades.";
+ next;
+ mes "[Nameless One]";
+ mes "It is my 'handy work' that has gotten me this far..... I have never had any remorse over any of the assignments I've taken....";
+ mes "To 'eliminate' targets is what I am here to do.";
+ next;
+ mes "[Nameless One]";
+ mes "Although you speak with confindence, understand this.........";
+ next;
+ mes "[Nameless One]";
+ mes "Only those who are trully cold blooded and without fear, can make it as an Assassin....";
+ mes "You will have to do much more than act like an arrogant fool to convince me that you are worthy of being one.........";
+ next;
+ mes "[Nameless One]";
+ mes "Before I start the quiz, I will let you ask me some basic questions.";
+ sM_Menu:
+ next;
+ menu "...What are the skills?",-, "...What's most important about an Assassin?",sM_1, "...Thats enough, I want to start the test.",sM_End;
+
+ mes "[Nameless One]";
+ mes "Yes, the skills. Skills are very useful to an Assassin. The basic skills are the masteries. I'll tell you about those first.";
+ next;
+ mes "[Nameless One]";
+ mes "First, there's ^5533FFKatar mastery^000000. Katar mastery will increases your attack damage when using a Katar.";
+ mes "This skill is very helpful for Katar users.";
+ next;
+ mes "[Nameless One]";
+ mes "Assassins have the ability to use two weapons at the same time. This makes them very fierce warriors.";
+ mes "However using two weapons at once does have its drawbacks.....";
+ next;
+ mes "[Nameless One]";
+ mes "It is much more difficult to use 2 weapons at once and therefore the damage you do will be less for each hand.";
+ next;
+ mes "[Nameless One]";
+ mes "That is why there is ^5533FF'Left hand mastery' and 'Right hand mastery'^000000.";
+ mes "By mastering these skills, you will be able to regain your attack power for both hands.";
+ next;
+ mes "[Nameless One]";
+ mes "Left hand mastery can be learned when you have gained 2 levels of Right hand mastery.";
+ mes "Combined with Katar mastery, you can become a very deadly Assassin indeed.";
+ next;
+ mes "[Nameless One]";
+ mes "^5533FF'Sonic Blow'^000000 is an extremely fast attacking skill. It will allow you to hit the enemy up to 8 times within the blink of an eye.";
+ next;
+ mes "[Nameless One]";
+ mes "This skill only works with a Katar. You also must have at least level 4 Katar Mastery to learn it.";
+ mes "The amount of damage done by Sonic Blow depends on how much strength you have.";
+ next;
+ mes "[Nameless One]";
+ mes "^5533FF'Grimtooth^000000 .... what if you could attack someone without being seen?";
+ mes "The skill Grimtooth allows you to do just that. While you are cloaked you can do a long range, splash damage attack with Grimtooth.";
+ next;
+ mes "[Nameless One]";
+ mes "Because of the splash damage, Grimtooth can be useful in mob situations.";
+ mes "The higher the level of Grimtooth you have the farther you can attack.";
+ next;
+ mes "[Nameless One]";
+ mes "'In order to use ^5533FFCloak^000000, you must have level 2 hide.";
+ mes "Cloak allows you to not only become invisible, but it allows you to move around while you are hidden as well.";
+ next;
+ mes "[Nameless One]";
+ mes "You can only move when you are close to a wall though.";
+ next;
+ mes "[Nameless One]";
+ mes "'There is a technique that allows you to give a weapon the poison property. It is called ^5533FFEnchant Poison^000000.";
+ next;
+ mes "[Nameless One]";
+ mes "Once enchanted with poison, there is a chance that an enemy hit by your weapon will become poisoned.";
+ mes "You will need at least level 1 Envemon to use this skill.";
+ next;
+ mes "[Nameless One]";
+ mes "^5533FF'Poison React'^000000. This skill will allow you to counter an attack made by a poison type monster.";
+ mes "If you want to learn Poison React you must have at least level 3 Enchant posion.";
+ next;
+ mes "[Nameless One]";
+ mes "^5533FF'Vemon Dust'^000000. With this skill you will be able to poison an area on the ground.";
+ mes "When a monster enters the area you poisoned there is a good chance that the moster will become poisoned as well.";
+ next;
+ mes "[Nameless One]";
+ mes "The higher the level of the skill, the longer the poison stays in effect. You will need a Red Gemstone to use this skill.";
+ mes "Level 5 Enchant Poison is a requirment for learning Venom Dust.";
+ next;
+ mes "[Nameless One]";
+ mes "^5533FF'Venom Splasher'^000000. Not only does this skill poison a target, but it makes the target explode splashing venom everywhere.";
+ next;
+ mes "[Nameless One]";
+ mes "A monster that is hit with Venom Splasher will only explode when it's HP is at 1/3 of maximum.";
+ next;
+ mes "[Nameless One]";
+ mes "This is the most difficult skill to learn for an Assassin. You'll need at least level 5 Venom Dust and level 5 Poison React to learn this skill";
+ next;
+ mes "[Nameless One]";
+ mes "Those are all of the Assassin skills.";
+ set @LISTEN, @LISTEN + 1;
+ goto sM_Menu;
+ sM_1:
+ mes "[Nameless One]";
+ mes "Hmm.... well for Assassins the most important stat is Agility.";
+ mes "By investing in Agility, your ability to dodge and your attack speed will increase greatly.";
+ next;
+ mes "[Nameless One]";
+ mes "Another good stat to invest in is Strength. Having good amounts of Strength with increase your attack allowing you to kill faster.";
+ next;
+ mes "[Nameless One]";
+ mes "This is as much as I can tell you about stats. The rest you will have to figure out through your own experimentation.";
+ set @LISTEN, @LISTEN + 1;
+ goto sM_Menu;
+ sM_End:
+ set ASSIN_Q, 1;
+ if(@LISTEN > 0) goto L_Test;
+ mes "[Nameless One]";
+ mes "Hahaha! You're very cocky aren't you..... Don't want to listen to what I have to say eh?!";
+ next;
+ mes "[Nameless One]";
+ mes "Fine then........ I want to see whether or not you can pass this test.....";
+ next;
+
+L_Test:
+ mes "[Nameless One]";
+ mes "Ok, it's now time for the test. If you get more than 1 question ^FF5533wrong^000000, you wil fail the test.";
+ next;
+ mes "[Nameless One]";
+ mes "You will not be told which answers you got right or which answers you got wrong.";
+ next;
+ set @temp, rand(3);
+ set @score, 0;
+ mes "[Nameless One]";
+ mes "Alright, let us begin.....";
+ next;
+ if(@temp == 1) goto L_Quiz2;
+ if(@temp == 2) goto L_Quiz3;
+
+ L_Quiz1:
+ mes "[Nameless One]";
+ mes "1. What here is ^FF5533not^000000 a prerequisite of the skill Grimtooth?";
+ next;
+ menu "Cloak Lv 2",sM_1a, "Sonic Blow Lv 5",sM_1a, "Hide Lv 2",sM_1a, "Left hand mastery Lv 2",-;
+
+ set @score, @score + 10;
+ sM_1a:
+
+ mes "[Nameless One]";
+ mes "2. Enchant Poison makes your weapon what element?";
+ next;
+ menu "Poison",-, "Earth",sM_2a, "Fire",sM_2a, "Wind",sM_2a;
+
+ set @score, @score + 10;
+ sM_2a:
+
+ mes "[Nameless One]";
+ mes "3. What is the function of level 4 ^5533FFLeft^000000 Hand Mastery?";
+ next;
+ menu "Attack +80% ",sM_3a, "Attack +70%",-, "Attack +90%",sM_3a, "Attack +108%!!",sM_3a;
+
+ set @score, @score + 10;
+ sM_3a:
+
+ mes "[Nameless One]";
+ mes "4. What item do you need to use when you use the skill 'Venom Dust'?";
+ next;
+ menu "Green Gemstone",sM_4a, "Blue Gemstone",sM_4a, "Yellow Gemstone",sM_4a, "Red Gemstone",-;
+
+ set @score, @score + 10;
+ sM_4a:
+
+ mes "[Nameless One]";
+ mes "5. When you increase Enchant Poison up to level 5, what new skill will appear?";
+ next;
+ menu "Venom Splasher",sM_5a, "Grimtooth",sM_5a, "Sonic Blow",sM_5a, "Venom Dust",-;
+
+ set @score, @score + 10;
+ sM_5a:
+
+ mes "[Nameless One]";
+ mes "6. What skill listed below allows you to be walk around unseen?";
+ next;
+ menu "Hide",sM_6a, "Backslide",sM_6a, "Cloak",-, "Throw Sand",sM_6a;
+
+ set @score, @score + 10;
+ sM_6a:
+
+ mes "[Nameless One]";
+ mes "7. What is the requirement for Venom Dust?";
+ next;
+ menu "Enemy must be weak.",sM_7a, "Must use a red gemstone.",-, "You must have a certain amount of health.",sM_7a;
+
+ set @score, @score + 10;
+ sM_7a:
+
+ mes "[Nameless One]";
+ mes "8. What monster card listed below adds to Intelligence?";
+ next;
+ menu "Steel Chonchon",sM_8a, "Deviruchi",sM_8a, "Elder Willow",-, "Baphomet",sM_8a;
+
+ set @score, @score + 10;
+ sM_8a:
+
+ mes "[Nameless One]";
+ mes "9. How much sp do you use when you do a double hit using a dagger?";
+ next;
+ menu "15",sM_9a, "0",-, "10",sM_9a, "54",sM_9a;
+
+ set @score, @score + 10;
+ sM_9a:
+
+ mes "[Nameless One]";
+ mes "10. What is the best type of sword to use in the Bybalan dungeon?";
+ next;
+ menu "Sword of Piercing Wind",-, "Sword of Ice",sM_10a, "Sword of Earth",sM_10a, "Sword of Fire",sM_10a;
+
+ set @score, @score + 10;
+ sM_10a:
+ goto L_Score;
+
+ L_Quiz2:
+ mes "[Nameless One]";
+ mes "1. Which monster drops a slotted Katar?";
+ next;
+ menu "Male Thief Bug",sM_1b, "PecoPeco",sM_1b, "Desert wolf",-, "Kobold",sM_1b;
+
+ set @score, @score + 10;
+ sM_1b:
+
+ mes "[Nameless One]";
+ mes "2. What card listed below can be inserted into a Jur?";
+ next;
+ menu "Caramel",-, "Ghostring",sM_2b, "Baphomet Jr",sM_2b, "DoppelGanger",sM_2b;
+
+ set @score, @score + 10;
+ sM_2b:
+
+ mes "[Nameless One]";
+ mes "3. Which class can forge weapons?";
+ next;
+ menu "Merchant",sM_3b, "Blacksmith",-, "Thief",sM_3b, "Priest",sM_3b;
+
+ set @score, @score + 10;
+ sM_3b:
+
+ mes "[Nameless One]";
+ mes "4. Which weapon listed below isn't a Katar class weapon?";
+ next;
+ menu "Jur",sM_4b, "Jamadhar",sM_4b, "Infiltrator",sM_4b, "Gladius",-;
+
+ set @score, @score + 10;
+ sM_4b:
+
+ mes "[Nameless One]";
+ mes "5. In Bybalan Dungeon a large amount of monsters are of what elemental type?";
+ next;
+ menu "Water",-, "Fire",sM_5b, "Wind",sM_5b, "Earth",sM_5b;
+
+ set @score, @score + 10;
+ sM_5b:
+
+ mes "[Nameless One]";
+ mes "6. What monster listed below can't be tamed and turned into a cute pet?";
+ next;
+ menu "Poring",sM_6b, "Rhoda Frog",-, "Lunatic",sM_6b, "Poison Spore",sM_6b;
+
+ set @score, @score + 10;
+ sM_6b:
+
+ mes "[Nameless One]";
+ mes "7. Choose the monster that is weakest to fire.";
+ next;
+ menu "Kobold (Sword)",sM_7b, "Kobold (Mace)",sM_7b, "Kobold (Hammer)",sM_7b, "Kobold (Axe)",-;
+
+ set @score, @score + 10;
+ sM_7b:
+
+ mes "[Nameless One]";
+ mes "8. Choose the ^FF5533non^000000-elemental Katar.";
+ next;
+ menu "Katar of Raging Blaze",sM_8b, "Katar of Dusty Thornbush",sM_8b, "Sharpened Legbone of Ghoul",sM_8b, "Infiltrator",-;
+
+ set @score, @score + 10;
+ sM_8b:
+
+ mes "[Nameless One]";
+ mes "9. Pick out the monster that doesn't belong in the group.";
+ next;
+ menu "Poring",sM_9b, "Ghostring",sM_9b, "Creamy",-, "Drops",sM_9b;
+
+ set @score, @score + 10;
+ sM_9b:
+
+ mes "[Nameless One]";
+ mes "10. Choose a ^FF3355non^000000-undead monster.";
+ next;
+ menu "Drake",sM_10b, "Archer Skeleton",sM_10b, "Poison Spore",-, "Ancient Mummy",sM_10b;
+
+ set @score, @score + 10;
+ sM_10b:
+ goto L_Score;
+
+ L_Quiz3:
+ mes "[Nameless One]";
+ mes "1. What is the increased dodge rate you get when you have the 'Improve Dodge' skill at level 10?";
+ next;
+ menu "20",sM_1c, "30",-, "140",sM_1c, "15",sM_1c;
+
+ set @score, @score + 10;
+ sM_1c:
+
+ mes "[Nameless One]";
+ mes "2. Which monster can detect someone who is hidden/cloaked?";
+ next;
+ menu "Hodes",sM_2c, "Whispers",-, "Porings",sM_2c, "Munaks",sM_2c;
+
+ set @score, @score + 10;
+ sM_2c:
+
+ mes "[Nameless One]";
+ mes "3. Assassins can use dual weapons. Which set of weapons below ^5544FFcan^000000 an Assassin use?";
+ next;
+ menu "Jur and Mace",sM_3c, "Damascus and Claymore",sM_3c, "Damascus and Stiletto",-, "Axe and Stiletto",sM_3c;
+
+ set @score, @score + 10;
+ sM_3c:
+
+ mes "[Nameless One]";
+ mes "4. Which town do you become a Thief in?";
+ next;
+ menu "Prontera",sM_4c, "Lutie",sM_4c, "AldeBaren",sM_4c, "Morroc",-;
+
+ set @score, @score + 10;
+ sM_4c:
+
+ mes "[Nameless One]";
+ mes "5. Which card has ^FF3355nothing^000000 to do with ^5533FFagility^000000?";
+ next;
+ menu "Baphomet Jr Card",sM_5c, "Whisper Card",-, "Male Thief Bug Card",sM_5c, "Chonchon Card",sM_5c;
+
+ set @score, @score + 10;
+ sM_5c:
+
+ mes "[Nameless One]";
+ mes "6. What makes Assassins so special?";
+ next;
+ menu "Excellent singing ability",sM_6c, "Excellent acting ability",sM_6c, "Excellent dancing ability",sM_6c, "Excellent dodging ability",-;
+
+ set @score, @score + 10;
+ sM_6c:
+
+ mes "[Nameless One]";
+ mes "7. When an Assassin reaches a ^5533FFJob level of 50^000000, what is the added bonus he/she recieves to agility?";
+ next;
+ menu "7",sM_7c, "8",sM_7c, "9",sM_7c, "10",-;
+
+ set @score, @score + 10;
+ sM_7c:
+
+ mes "[Nameless One]";
+ mes "8. What piece of equipment cannot be used by an Assassin?";
+ next;
+ menu "Sword",sM_8c, "Golden helm",-, "Dagger",sM_8c, "Jur",sM_8c;
+
+ set @score, @score + 10;
+ sM_8c:
+
+ mes "[Nameless One]";
+ mes "9. When a Novice wants to become a Thief, what mushrooms does he/she need to steal?";
+ next;
+ menu "Orange Net Mushrooms",-, "Red Gooey Mushrooms",sM_9c, "Orange Gooey Mushrooms",-, "Hairy Orange Mushrooms",sM_9c;
+
+ set @score, @score + 10;
+ sM_9c:
+
+ mes "[Nameless One]";
+ mes "10. What card listed below is useless to an Assassin?";
+ next;
+ menu "Ghostring Card",sM_10c, "Elder Willow Card",-, "Skeleton Soldier Card",sM_10c, "Kobold Card",sM_10c;
+
+ set @score, @score + 10;
+ sM_10c:
+
+L_Score:
+ mes "[Nameless One]";
+ mes "Okay, let me just tally up the results.........";
+ next;
+ mes "[Nameless One]";
+ mes "Here is your test score: ^FF5544" +@score+ "^000000/100....";
+ if(@score < 90) goto L_Failed;
+ mes "... Very well, you passed the quiz.";
+ next;
+ mes "[Nameless One]";
+ mes "Wait don't get so excited yet, there's still another test... Speak to Barkadi and she'll tell you about the second test..";
+ savepoint "in_moc_16.gat", 21, 160;
+ set ASSIN_Q, 2;
+ close;
+
+ L_Failed:
+ mes "You failed the test!";
+ next;
+ mes "[Nameless One]";
+ mes "It looks like you're underqualified.... how could you expect to become an Assassin with a score like this?";
+ next;
+ mes "[Nameless One]";
+ mes "Since you don't seem to have an ounce of intelligence, I will give you some tips.......";
+ next;
+ mes "[Nameless One]";
+ mes "Speak with Assassin 'Kai', he may be able to help you out. If not try to interperet this code:";
+ mes "^5533FFwww.emperium.org......^000000";
+ next;
+ mes "[Nameless One]";
+ mes "It's rumored to have come from another world...... someplace called.... the 'internet'.......";
+ close2;
+ disablenpc "Assassin Kai#1";
+ enablenpc "Assassin Kai#2";
+ warp "in_moc_16.gat", 19, 76;
+ end;
+
+L_ReTest:
+ mes "[Nameless One]";
+ mes "Hmf your back..... so your still obsessed with becoming an Assassin eh?";
+ next;
+ mes "[Nameless One]";
+ mes "If it is your true desire to become an Assassin, I'll help you out......";
+ next;
+ mes "[Nameless One]";
+ mes "However, If you fail again.... I suggest you give up on becoming an Assassin!";
+ next;
+ menu "You're right, I'm not cut out for this.....",-, "I don't care! I'm not giving up!",M_Retry;
+
+ mes "[Nameless One]";
+ mes "~Cough~cough~... thats a good choice... Being an assassin is lonely.....";
+ next;
+ mes "[Nameless One]";
+ mes "Leave the assassin guild now. Go back to the town you came from!";
+ close2;
+ warp "moc_fild16.gat", 206, 241;
+ end;
+ M_Retry:
+ mes "[Nameless One]";
+ mes "Alright then... I will try to help you become a lonely Assassin, hahahahah.";
+ next;
+ goto L_Test;
+}
+
+
+//============================================================================//
+// Second Test
+//****************************************************************************//
+
+//=====================================================//
+// Part 1: Eliminate the Target
+//=====================================================//
+
+// Barcardi ==============================>\\
+in_moc_16.gat,21,165,4 script Barcardi 725,{
+
+ mes "[Barcardi]";
+ mes "I see that you passed the first test ^5533FF" + strcharinfo(0) + "^000000.";
+ M_Menu:
+ next;
+ menu "What is the next test?",M_0, "I want to start the test.",M_1, "I need to go back and rest.",M_End;
+
+ M_0:
+ mes "[Barcardi]";
+ mes "Let me tell you about your next test. This test has 2 parts to it. The first part will test your ability to find and eliminate targets.";
+ mes "You will need great precision and patience to pick out your targets among a group of non-targets.";
+ next;
+ mes "[Barcardi]";
+ mes "What you are looking for are monsters named ^5533FF'Job Change Target'^000000. Kill any other target and you will fail the test.";
+ mes "You will also be timed durring the test. If you take longer than ^FF55333 minutes^000000 to accomplish your mission you will also fail.";
+ next;
+ mes "[Barcardi]";
+ mes "Being able to identify the correct target quickly is a basic requirement of the Assassin.";
+ mes "Another requirement is stealth. An Assassin should NEVER be seen!";
+ next;
+ mes "[Barcardi]";
+ mes "The last portion of the test will require you to sneek past a large group of aggressive and dangerous monsters.";
+ mes "Your ^5544FFhide^000000 skill will come in handy here. You will have ^FF55333 minutes^000000 to finish this part of the test as well.";
+ next;
+ mes "[Barcardi]";
+ mes "If you get discovered by the monsters and are killed, or if you run out of time, you will fail the test.";
+ next;
+ mes "[Barcardi]";
+ mes "You must pass BOTH parts of the test in order to move on to the next exam.";
+ mes "If you fail one of them, you will have to start the whole test all over again.";
+ goto M_Menu;
+ M_1:
+ mes "[Barcardi]";
+ mes "Only 1 person can take the test at one time. When you are ready please enter the waiting room.";
+ mes "The test will automatically start when the testing rooms are open.";
+ close;
+ M_End:
+ mes "[Barcardi]";
+ mes ".... Okay, come back when you've had enough rest.....";
+ next;
+ mes "[Barcardi]";
+ mes "....... Oh, and don't forget to bring some courage with you loser!";
+ emotion e_pif;
+ next;
+ warp "moc_fild16.gat", 206, 241;
+ close;
+
+OnInit:
+ waitingroom "Assasin Test Waitingroom",8,"Barcardi::OnStart",1;
+ end;
+OnStart:
+ set $@SinUsers, getareausers("in_moc_16.gat", 60, 136, 93, 177);
+ set $@SinUsers, $@SinUsers + getareausers("in_moc_16.gat", 64, 46, 111, 105);
+ if ($@SinUsers > 0) end; // stops the rest of the script from running if there is somebody taking the test
+
+ if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
+ killmonsterall "in_moc_16.gat";
+ warpwaitingpc "in_moc_16.gat", 65, 150;
+ donpcevent "SinTest2::OnStart";
+ end;
+}
+
+// Job Change Monsters ======================>\\
+in_moc_16.gat,1,1,0 script SinTest2 -1,{
+OnStart:
+ set $@SinMob, 6;
+ disablenpc "sinWarp1";
+ // Target Monsters
+ monster "in_moc_16.gat",62,161,"Job Change Target",1002,1,"SinTest2::OnMobDead";
+ monster "in_moc_16.gat",85,169,"Job Change Target",1063,1,"SinTest2::OnMobDead";
+ monster "in_moc_16.gat",88,152,"Job Change Target",1002,1,"SinTest2::OnMobDead";
+ monster "in_moc_16.gat",90,143,"Job Change Target",1113,1,"SinTest2::OnMobDead";
+ monster "in_moc_16.gat",74,167,"Job Change Target",1031,1,"SinTest2::OnMobDead";
+ monster "in_moc_16.gat",77,173,"Job Change Target",1002,1,"SinTest2::OnMobDead";
+ // Decoy Monsters
+ monster "in_moc_16.gat",62,161,"Jabs change target",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",85,169,"Warrior test target",1031,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",79,174,"Target",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",85,156,"Job quest target",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",74,171,"bouncer",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",68,173,"I got yours right here!",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",65,158,"Battle Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",60,158,"Soldiet Target",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",64,169,"Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",71,173,"Job change ready",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",77,172,"Don't hit me",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",76,172,"Target",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",75,172,"Not me",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",67,167,"Keep up the good work",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",86,170,"Job target change",1031,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",86,171,"Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",86,170,"Target",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",86,173,"Hope you can become an assassin..",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",85,170,"Battle Monster",1031,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",89,156,"Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",89,156,"Speed182",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",89,156,"Battle Target",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",89,156,"Battlefield Tears",1113,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",89,156,"Job Change Tears",1031,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",83,169,"Evil Servant",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",63,158,"Dead soul",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",63,157,"Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",64,159,"Battle Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",63,159,"Target",1063,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",63,159,"Archer Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",63,159,"Swordman Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",83,148,"Thief Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",82,148,"Acolyte Target",1002,1,"SinTest2::OnFailed";
+ monster "in_moc_16.gat",84,148,"Merchant Target",1002,1,"SinTest2::OnFailed";
+ set $@sinRmX1, 60;
+ set $@sinRmY1, 136;
+ set $@sinRmX2, 93;
+ set $@sinRmY2, 177;
+ set $@wrpX, 19;
+ set $@wrpY, 161;
+ initnpctimer;
+ initnpctimer "TimerSin";
+ end;
+
+OnTimer500:
+ stopnpctimer;
+ areaannounce "in_moc_16.gat", 60, 136, 93, 177, "Okay the test is about to start! Remember to eliminate the monsters called 'Job Change Target'",8;
+ end;
+OnMobDead:
+ set $@SinMob, $@SinMob -1;
+ areaannounce "in_moc_16.gat", 60, 136, 93, 177, "Good. You have " + $@SinMob + " targets left to eliminate.",8;
+ if($@SinMob > 0) end;
+
+ stopnpctimer "TimerSin";
+ killmonsterall "in_moc_16.gat";
+ enablenpc "sinWarp1";
+ areaannounce "in_moc_16.gat", 60, 136, 93, 177,"Congratulations! You passed the test! A warp has just opened. Use it to leave the test room.",8;
+ addtimer 30000, "sinWarp1::OnTimer30000"; // warps player after 30 sec to move test along
+ end;
+OnFailed:
+ stopnpctimer "TimerSin";
+ areaannounce "in_moc_16.gat", 60, 136, 93, 177,"You failed!",8;
+ addtimer 3000, "TimerSin::OnTimer188000";
+ end;
+}
+
+// Observer ===========================>\\
+in_moc_16.gat,62,153,1 script Observer 55,{
+ mes "[Observer]";
+ mes "Don't mind me, I'm just here to see how well you do on your test.....";
+ close;
+}
+
+// Warp ==============================>\\
+in_moc_16.gat,87,137,0 script sinWarp1 45,2,1,{
+OnTimer30000:
+ killmonsterall "in_moc_16.gat";
+ enablenpc "Thomas";
+ warp "in_moc_16.gat", 87, 102;
+ end;
+}
+
+// Booby Traps ========================>\\
+in_moc_16.gat,68,158,0 script 01_1::SinTrap 139,0,0,{
+ stopnpctimer "TimerSin";
+ warp "in_moc_16.gat", 19, 161;
+ killmonsterall "in_moc_16.gat";
+ donpcevent "Barcardi::OnStart";
+ end;
+}
+in_moc_16.gat,69,158,0 duplicate(SinTrap) 01_2 139,0,0
+in_moc_16.gat,68,159,0 duplicate(SinTrap) 01_3 139,0,0
+in_moc_16.gat,69,159,0 duplicate(SinTrap) 01_4 139,0,0
+in_moc_16.gat,64,162,0 duplicate(SinTrap) 02_1 139,0,0
+in_moc_16.gat,65,162,0 duplicate(SinTrap) 02_2 139,0,0
+in_moc_16.gat,64,163,0 duplicate(SinTrap) 02_3 139,0,0
+in_moc_16.gat,65,163,0 duplicate(SinTrap) 02_4 139,0,0
+in_moc_16.gat,62,168,0 duplicate(SinTrap) 03_1 139,0,0
+in_moc_16.gat,63,168,0 duplicate(SinTrap) 03_2 139,0,0
+in_moc_16.gat,62,169,0 duplicate(SinTrap) 03_3 139,0,0
+in_moc_16.gat,63,169,0 duplicate(SinTrap) 03_4 139,0,0
+in_moc_16.gat,66,170,0 duplicate(SinTrap) 04_1 139,0,0
+in_moc_16.gat,67,170,0 duplicate(SinTrap) 04_2 139,0,0
+in_moc_16.gat,66,171,0 duplicate(SinTrap) 04_3 139,0,0
+in_moc_16.gat,67,171,0 duplicate(SinTrap) 04_4 139,0,0
+in_moc_16.gat,64,174,0 duplicate(SinTrap) 05_1 139,0,0
+in_moc_16.gat,64,175,0 duplicate(SinTrap) 05_2 139,0,0
+in_moc_16.gat,65,174,0 duplicate(SinTrap) 05_3 139,0,0
+in_moc_16.gat,65,175,0 duplicate(SinTrap) 05_4 139,0,0
+in_moc_16.gat,72,174,0 duplicate(SinTrap) 06_1 139,0,0
+in_moc_16.gat,72,175,0 duplicate(SinTrap) 06_2 139,0,0
+in_moc_16.gat,73,174,0 duplicate(SinTrap) 06_3 139,0,0
+in_moc_16.gat,73,175,0 duplicate(SinTrap) 06_4 139,0,0
+in_moc_16.gat,72,166,0 duplicate(SinTrap) 07_1 139,0,0
+in_moc_16.gat,72,167,0 duplicate(SinTrap) 07_2 139,0,0
+in_moc_16.gat,73,166,0 duplicate(SinTrap) 07_3 139,0,0
+in_moc_16.gat,73,167,0 duplicate(SinTrap) 07_4 139,0,0
+in_moc_16.gat,72,168,0 duplicate(SinTrap) 08_1 139,0,0
+in_moc_16.gat,72,169,0 duplicate(SinTrap) 08_2 139,0,0
+in_moc_16.gat,73,168,0 duplicate(SinTrap) 08_3 139,0,0
+in_moc_16.gat,73,169,0 duplicate(SinTrap) 08_4 139,0,0
+in_moc_16.gat,78,168,0 duplicate(SinTrap) 09_1 139,0,0
+in_moc_16.gat,78,169,0 duplicate(SinTrap) 09_2 139,0,0
+in_moc_16.gat,79,168,0 duplicate(SinTrap) 09_3 139,0,0
+in_moc_16.gat,79,169,0 duplicate(SinTrap) 09_4 139,0,0
+in_moc_16.gat,80,172,0 duplicate(SinTrap) 10_1 139,0,0
+in_moc_16.gat,81,172,0 duplicate(SinTrap) 10_2 139,0,0
+in_moc_16.gat,82,172,0 duplicate(SinTrap) 10_3 139,0,0
+in_moc_16.gat,83,172,0 duplicate(SinTrap) 10_4 139,0,0
+in_moc_16.gat,80,173,0 duplicate(SinTrap) 10_5 139,0,0
+in_moc_16.gat,81,173,0 duplicate(SinTrap) 10_6 139,0,0
+in_moc_16.gat,82,173,0 duplicate(SinTrap) 10_7 139,0,0
+in_moc_16.gat,83,173,0 duplicate(SinTrap) 10_8 139,0,0
+in_moc_16.gat,88,174,0 duplicate(SinTrap) 11_1 139,0,0
+in_moc_16.gat,88,175,0 duplicate(SinTrap) 11_2 139,0,0
+in_moc_16.gat,89,174,0 duplicate(SinTrap) 11_3 139,0,0
+in_moc_16.gat,86,166,0 duplicate(SinTrap) 12_1 139,0,0
+in_moc_16.gat,86,167,0 duplicate(SinTrap) 12_2 139,0,0
+in_moc_16.gat,87,166,0 duplicate(SinTrap) 12_3 139,0,0
+in_moc_16.gat,87,167,0 duplicate(SinTrap) 12_4 139,0,0
+in_moc_16.gat,90,164,0 duplicate(SinTrap) 13_1 139,0,0
+in_moc_16.gat,90,165,0 duplicate(SinTrap) 13_2 139,0,0
+in_moc_16.gat,91,164,0 duplicate(SinTrap) 13_3 139,0,0
+in_moc_16.gat,91,165,0 duplicate(SinTrap) 13_4 139,0,0
+in_moc_16.gat,84,160,0 duplicate(SinTrap) 14_1 139,0,0
+in_moc_16.gat,85,160,0 duplicate(SinTrap) 14_2 139,0,0
+in_moc_16.gat,86,160,0 duplicate(SinTrap) 14_3 139,0,0
+in_moc_16.gat,87,160,0 duplicate(SinTrap) 14_4 139,0,0
+in_moc_16.gat,88,160,0 duplicate(SinTrap) 14_5 139,0,0
+in_moc_16.gat,89,160,0 duplicate(SinTrap) 14_6 139,0,0
+in_moc_16.gat,84,161,0 duplicate(SinTrap) 14_7 139,0,0
+in_moc_16.gat,85,161,0 duplicate(SinTrap) 14_8 139,0,0
+in_moc_16.gat,86,161,0 duplicate(SinTrap) 14_9 139,0,0
+in_moc_16.gat,87,161,0 duplicate(SinTrap) 14_10 139,0,0
+in_moc_16.gat,88,161,0 duplicate(SinTrap) 14_11 139,0,0
+in_moc_16.gat,89,161,0 duplicate(SinTrap) 14_12 139,0,0
+in_moc_16.gat,86,154,0 duplicate(SinTrap) 15_1 139,0,0
+in_moc_16.gat,86,155,0 duplicate(SinTrap) 15_2 139,0,0
+in_moc_16.gat,87,154,0 duplicate(SinTrap) 15_3 139,0,0
+in_moc_16.gat,87,155,0 duplicate(SinTrap) 15_4 139,0,0
+in_moc_16.gat,84,150,0 duplicate(SinTrap) 16_1 139,0,0
+in_moc_16.gat,84,151,0 duplicate(SinTrap) 16_2 139,0,0
+in_moc_16.gat,85,150,0 duplicate(SinTrap) 16_3 139,0,0
+in_moc_16.gat,85,151,0 duplicate(SinTrap) 16_4 139,0,0
+in_moc_16.gat,90,150,0 duplicate(SinTrap) 17_1 139,0,0
+in_moc_16.gat,90,151,0 duplicate(SinTrap) 17_2 139,0,0
+in_moc_16.gat,91,150,0 duplicate(SinTrap) 17_3 139,0,0
+in_moc_16.gat,91,151,0 duplicate(SinTrap) 17_4 139,0,0
+in_moc_16.gat,86,146,0 duplicate(SinTrap) 18_1 139,0,0
+in_moc_16.gat,86,147,0 duplicate(SinTrap) 18_2 139,0,0
+in_moc_16.gat,87,146,0 duplicate(SinTrap) 18_3 139,0,0
+in_moc_16.gat,87,147,0 duplicate(SinTrap) 18_4 139,0,0
+
+
+//=========================================================//
+// Part 2: Hide and Sneak
+//=========================================================//
+
+// Thomas ===============================>\\
+in_moc_16.gat,89,98,1 script Thomas 118,4,2,{
+OnTimer600:
+ if(ASSIN_Q2 == 1) goto L_ReTest;
+ mes "[Thomas]";
+ mes "My name is Thomas and I am in charge of this portion of the test.";
+ next;
+ mes "[Thomas]";
+ mes "The goal of this test is to evade and avoid the enemy. You must make it to the warp without out attracting the attention of the monsters in the room.";
+ next;
+ mes "[Thomas]";
+ mes "You must make it through without dying. Because none of these monsters are your targets, you cannot not kill any of them.";
+ mes "Use your ablitly to flee and your ability to hide to help you in this test.";
+ next;
+ mes "[Thomas]";
+ mes "Alright.... Get ready.....";
+ next;
+ set ASSIN_Q2, 1;
+ disablenpc "Thomas";
+ donpcevent "SinTest2_2::OnStart";
+ close;
+L_ReTest:
+ mes "[Thomas]";
+ mes "~sigh~.... I told you to use your hide skill!! Here let me heal you....";
+ next;
+ mes "[Thomas]";
+ mes "Alright, lets try this again.........";
+ percentheal 100, 100;
+ next;
+ disablenpc "Thomas";
+ donpcevent "SinTest2_2::OnStart";
+ close;
+OnTouch:
+ warp "in_moc_16.gat",87,99;
+ addtimer 600, "Thomas::OnTimer600";
+ end;
+}
+
+
+// SinTest2_2 ===============================>\\
+in_moc_16.gat,1,1,1 script SinTest2_2 -1,{
+OnStart:
+ monster "in_moc_16.gat", 81, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 83, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 85, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 88, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 90, 77, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 78, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 80, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 91, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 93, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 95, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 97, 56, "MUMMY", 1041,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 79, 62, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 76, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 96, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
+ monster "in_moc_16.gat", 99, 65, "Hydra", 1068,1, "SinTest2_2::OnMobDead";
+ set $@sinRmX1, 64;
+ set $@sinRmY1, 46;
+ set $@sinRmX2, 111;
+ set $@sinRmY2, 105;
+ set $@wrpX, 87;
+ set $@wrpY, 102;
+ areawarp "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "in_moc_16.gat", $@wrpX, $@wrpY;
+ initnpctimer "TimerSin";
+ end;
+OnMobDead:
+ stopnpctimer "TimerSin";
+ areaannounce "in_moc_16.gat", 64, 46, 111, 105, ". . . You engaged a target without permission! You have failed the test!",8;
+ enablenpc "Thomas";
+ addtimer 3000, "TimerSin::OnTimer188000";
+ end;
+}
+
+// Warp ================================>\\
+in_moc_16.gat,87,48,2 script sinWarp2 45,2,2,{
+ mes "[Thomas]";
+ mes "Good job! There's only one test left, good luck!!";
+ stopnpctimer "TimerSin";
+ killmonster "in_moc_16.gat","SinTest2_2::OnMobDead";
+ set ASSIN_Q, 3;
+ set ASSIN_Q2, 0;
+ savepoint "in_moc_16.gat", 182, 180;
+ close2;
+ warp "in_moc_16.gat", 181, 183;
+ donpcevent "Barcardi::OnStart";
+ end;
+}
+
+
+//=======================================================//
+// Timer for Sin Test 2
+//=======================================================//
+in_moc_16.gat,1,1,0 script TimerSin -1,{
+OnTimer3000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "I'll announce how much time you'll have left on a minute by minute basis.",8;
+ end;
+OnTimer5000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "You have 3 minutes starting now!",8;
+ end;
+OnTimer35000:
+ donpcevent "Barcardi::OnStart";
+ end;
+OnTimer65000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "You have 2 minutes left! ",8;
+ donpcevent "Barcardi::OnStart";
+ end;
+OnTimer95000:
+ donpcevent "Barcardi::OnStart";
+ end;
+OnTimer125000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "1 minute left!",8;
+ donpcevent "Barcardi::OnStart";
+ end;
+OnTimer155000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "30 seconds left!",8;
+ donpcevent "Barcardi::OnStart";
+ end;
+OnTimer180000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "Test ending in 5 secs....",8;
+ end;
+OnTimer181000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "4 seconds....",8;
+ end;
+OnTimer182000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "3 seconds...",8;
+ end;
+OnTimer183000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "2 seconds..",8;
+ end;
+OnTimer184000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "1 second.",8;
+ end;
+OnTimer185000:
+ areaannounce "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "Okay times up! You failed!",8;
+ end;
+OnTimer188000:
+ stopnpctimer;
+ areawarp "in_moc_16.gat", $@sinRmX1, $@sinRmY1, $@sinRmX2, $@sinRmY2, "in_moc_16.gat", 21, 160;
+ killmonsterall "in_moc_16.gat";
+ donpcevent "Barcardi::OnStart";
+ end;
+}
+
+
+//============================================================================//
+// Final Test
+//****************************************************************************//
+
+//=============================================//
+// Warp
+//=============================================//
+in_moc_16.gat,182,169,1 script sinWarp3 45,1,1,{
+ if(getareausers(("in_moc_16.gat"),148,74,187,117) > 0) goto L_Wait;
+ disablenpc "Huey#End";
+ disablenpc "Kai#End";
+ disablenpc "Nameless One#End";
+ disablenpc "Barcardi#End";
+ disablenpc "Observer#End";
+ disablenpc "Thomas#End";
+ warp "in_moc_16.gat", 167, 116;
+ end;
+
+ L_Wait:
+ mes "~ a message from the Guild Master...~";
+ mes "I am currently busy with another Assassin Candidate. Please wait patiently untill I am done with that person.";
+ close;
+}
+
+//==============================================//
+// Guild Master
+//==============================================//
+
+// Start Trigger ------------------------------------------------------------------
+in_moc_16.gat,167,114,3 script guildmaster_Trig#0 139,4,0,{
+ mes "[Guild Master]";
+ mes "Welcome ^5533FF" + strcharinfo(0) + "^000000. This is my private room.";
+ next;
+ mes "[Guild Master]";
+ mes "I am going to give you a simple test. All you have to do is come meet me.";
+ mes "Of course you will have to go through a maze of invisible walls to do so.....";
+ next;
+ mes "[Guild Master]";
+ mes "Hahah... It's really not as hard as it sounds. The purpose of the maze is actually to protect the guild from intruders.";
+ mes "But I decided to use it to test the determination of Assassin candidates as well.";
+ next;
+ mes "[Guild Master]";
+ mes "Well enough chit chat. I look forward to meeting you at the end of the maze.";
+ close;
+}
+
+// Guild Master -----------------------------------------------------------------------------
+in_moc_16.gat,149,80,4 script Guild Master#01 106,1,1,{
+ end;
+
+OnTouch:
+ mes "[Guild Master]";
+ mes "Ah it's nice to meet you ^5533FF" + strcharinfo(0) + "^000000. I have to apologize for making you walk through that maze.";
+ mes "I saw your resume just now, you have been described as a Thief with guts!";
+ next;
+ mes "[Guild Master]";
+ mes "We rarely find someone of your abilities and experience.";
+ next;
+ mes "[Guild Master]";
+ mes "If you don't mind I would like to ask you a few questions. There is nothing to be nervous about.";
+ mes "Just answer my questions truthfully..... if you lie, I'll kill you. That's all there is to it.";
+ next;
+ callsub sF_Questions1;
+ next;
+
+ mes "[Guild Master]";
+ mes "Unfortunately there are nit wits who are eager to be Assassins but have not yet had enough training.";
+ mes "They are a disgrace to our clan and their activities often result in very problematic situations.";
+ next;
+ mes "[Guild Master]";
+ mes "You may end up like one of them if you are not careful. Remember... once you become an Assassin there no turning back.";
+ next;
+ callsub sF_Questions2;
+ next;
+
+ mes "[Guild Master]";
+ mes "It was nice talking with you. You reminded me of the good ol' days.";
+ next;
+ mes "[Guild Master]";
+ mes ".... one second.....";
+ next;
+ mes "[Guild Master]";
+ mes "Everyone that tested " + strcharinfo(0) + "please come to my office .";
+ next;
+ mes "[Guild Master]";
+ mes "They will be here soon.";
+ next;
+ enablenpc "Huey#End";
+ enablenpc "Kai#End";
+ enablenpc "Nameless One#End";
+ enablenpc "Barcardi#End";
+ enablenpc "Observer#End";
+ enablenpc "Thomas#End";
+ mes "[Nameless One]";
+ mes "I am here.";
+ next;
+ mes "[Guild Master]";
+ mes "I would like to know what you think about ^5533FF" + strcharinfo(0) + "^000000 becoming an Assassin.";
+ next;
+ mes "[Nameless One]";
+ mes "I think ^5533FF" + strcharinfo(0) + "^000000 is a decent candidate.";
+ next;
+ mes "[Guild Master]";
+ mes "'Looks like the Nameless One more or less supports you. What are your thought Huey?";
+ next;
+ mes "[Huey]";
+ //if( == 1) mes "...What can I say, one of the best Assassin candidates I've seen in the last few weeks.";
+ //if( == 0) mes "... Although a little too mellow and gentle... sort of like a pussy cat, Hahahaha....";
+ mes "I think ^5533FF" + strcharinfo(0) + "^000000 will be fine as an Assassin.";
+ next;
+ mes "[Huey]";
+ mes "I have to get back so I will leave first.";
+ next;
+ mes "[Guild Master]";
+ mes "Okay then, thank you Huey.";
+ next;
+ mes "[Guild Master]";
+ mes "So... Observer, what is your opinion?";
+ disablenpc "Huey#End";
+ next;
+ mes "[Observer]";
+ mes ".... Well, not one of the better performance I've seen but ^5533FF" + strcharinfo(0) + "^000000 did pass, so I have no objections.";
+ next;
+ mes "[Guild Master]";
+ mes "Good. It seems we are all in agreement. I myself see no problems with ^5533FF" + strcharinfo(0) + "^000000........";
+ next;
+ mes "[Guild Master]";
+ mes "^5533FF" + strcharinfo(0) + "^000000 seems to know alot about Assassins and I don't think the solitary lifestyle will be too difficult for ^5533FF" + strcharinfo(0) + "^000000 either.";
+ next;
+ mes "[Guild Master]";
+ mes "... I think I've said enough. Here please take this........";
+ next;
+ if(JBLVL == 40) goto L_LowLvl;
+
+ L_HighLvl:
+ menu "Jur",sM_Jur, "Katar",sM_Kat, "Main Gauche",sM_Main, "Gladius",sM_Glad;
+
+ sM_Jur:
+ getitem 1251,1;
+ goto L_Cont1;
+ sM_Kat:
+ getitem 1253, 1;
+ goto L_Cont1;
+ sM_Main:
+ getitem 1208, 1;
+ goto L_Cont1;
+ sM_Glad:
+ getitem 1220, 1;
+ goto L_Cont1;
+
+ L_LowLvl:
+ set @temp, rand(1, 3);
+ if(@temp==1) getitem 1250, 1;
+ if(@temp==2) getitem 1217, 1;
+ if(@temp==3) getitem 1252, 1;
+
+ L_Cont1:
+ mes "[Guild Master]";
+ mes "Now go talk to ^5533FFAssassin Huey^000000 back at the guild entrance.";
+ mes "For some reason he always looks like he's ^5533FFangry^000000 about something......";
+ next;
+ mes "[Guild Master]";
+ mes "He will be the one promoting you to the Assassin class.";
+ next;
+ mes "[Guild Master]";
+ mes strcharinfo(0) + " has choosen the path of the Assassin. May you learn to endure the hardships that all Assassins must face.";
+ getitem 1008, 1;
+ next;
+ mes "[Guild Master]";
+ mes "Okay, everyone you can leave now. I will send you back to the entrance. Lets move......";
+ set ASSIN_Q, 4;
+ set ASSIN_Q2, 0;
+ disablenpc "Kai#End";
+ disablenpc "Nameless One#End";
+ disablenpc "Barkadi#End";
+ disablenpc "Observer#End";
+ disablenpc "Thomas#End";
+ savepoint "in_moc_16.gat", 18, 28;
+ close2;
+ warp "in_moc_16.gat", 18, 28;
+ end;
+
+
+sF_Questions1:
+ mes "[Guild Master]";
+ mes "First of all, what do you think is most important to an Assassin?";
+ next;
+ menu "More power.",M_1, "An Assassin's pride.",M_2, "Endless training.",M_3;
+
+ M_1:
+ mes "[Guild Master]";
+ mes "It is true that an Assassin is stronger than a Thief.";
+ mes "By becoming an Assassin you will be capable of doing things no mere Thief could dream of.";
+ next;
+ mes "[Guild Master]";
+ mes "But, why do you want that kind of power?";
+ next;
+ menu "To take revenge on those who hurt me.",sM_1a, "I will use that power to become wealthy.",sM_1b,
+ "To explore new places.",sM_1c;
+
+ sM_1a:
+ mes "[Guild Master]";
+ mes "Vengence huh............ It seems that everyone has enemys these days........";
+ next;
+ mes "[Guild Master]";
+ mes "However, vengence is fueled by emotions, and as an Assassin one cannot give into these emotions.";
+ mes "An Assassin must be cold blooded... even heartless.... He/she must not let anything get in the way of the task at hand.";
+ next;
+ mes "[Guild Master]";
+ mes "Emotions are the biggest threat to an Assassin..... they cause confusion and clutter up the mind.....";
+ mes "An Assassin must always have a clear train of thought in order to be successful.";
+ next;
+ mes "[Guild Master]";
+ mes "If you are to become an Assassin, you must find a way to control your emotions.... do not let your emotions control you.";
+ return;
+ sM_1b:
+ mes "[Guild Master]";
+ mes "Money is an important part of the world.... however it is meaningless to an Assassin.";
+ mes "An Assassin's purpose is to carry out the dark, and unpleasant duties that no one else is capable of.....";
+ next;
+ mes "[Guild Master]";
+ mes "True Assassins do no think about fame or fortune.";
+ return;
+ sM_1c:
+ mes "[Guild Master]";
+ mes "An interesting idea..... you obviously seek to learn more about the world around you.";
+ mes "In knowing more about the world, you gain better insight into yourself.";
+ next;
+ mes "[Guild Master]";
+ mes "But remember that your path will be filled with loneliness. It is a reality that all Assassins must face.";
+ next;
+ mes "[Guild Master]";
+ mes "For those who have succeeded as Assassins, they have not only learned to except this fact.... but they have learned to embrace it.";
+ return;
+
+ M_2:
+ mes "[Guild Master]";
+ mes "Pride you say? Did another Assassin mention this to you?.....";
+ next;
+ mes "[Guild Master]";
+ mes "Unfortunately pride without ability means nothing. Hmm... what are you trying to find or gain by becoming an Assassin?";
+ next;
+ mes "[Guild Master]";
+ mes "Most of the people you have met in this guild are my bretheren and they have struggled and sacrifced a great deal as Assassins.";
+ mes "It is beacuse they have overcome so much hardship, that they can take great pride in being Assassins.";
+ next;
+ mes "[Guild Master]";
+ mes "You, on the other hand, have not yet faced the difficulties that Assassins do.";
+ mes "What then, do you mean when you speak of 'an Assassin's pride'?";
+ next;
+ menu "The idea of total solitude.",sM_2a, "The ability to make easy money.",sM_2b, "They just look cool.",sM_2c;
+
+ sM_2a:
+ mes "[Guild Master]";
+ mes "It is true that the life of an Assassin is lonesome. In a way, to be an Assassin, is to be non-existant....";
+ next;
+ mes "[Guild Master]";
+ mes "We never make direct contact with any of our clients. The people that we do make contact with..... we kill.";
+ next;
+ mes "[Guild Master]";
+ mes "The only people that know about Assassins are other Assassins....";
+ mes "Even then..... we sheild and hide our true inner selves from each other..........";
+ next;
+ mes "[Guild Master]";
+ mes "Even so... having comrades is better that nothing.";
+ mes "I recommend you have at least one partner to back you up durring a mission.";
+ return;
+ sM_2b:
+ mes "[Guild Master]";
+ mes "Yes, money is important.";
+ mes "But don't you think we assassins have much more important thing to deal with?";
+ return;
+ sM_2c:
+ mes "[Guild Master]";
+ mes "...So you just think Assassins are cool looking......... ~sigh~";
+ mes "This is really sad.... Believe me when I say to you that the purpose of the Assassins is not to merely look good.....";
+ next;
+ mes "[Guild Master]";
+ mes ".... But it is to do those dark deeds which no one wants to nor can do.";
+ return;
+ M_3:
+ mes "[Guild Master]";
+ mes "Interesting..... I see that you have already trained a great deal. I suppose that even more training couldn't hurt.....";
+ next;
+ mes "[Guild Master]";
+ mes "Is there any specific area that you would like to improve upon?";
+ next;
+ menu "Techniques.",sM_3a, "More challenging targets.",sM_3b, "Mental toughness.",sM_3c;
+
+ sM_3a:
+ mes "[Guild Master]";
+ mes "As an Assassin you will have access to many new skills. The harder you train the better you will be at using these skills.";
+ next;
+ mes "[Guild Master]";
+ mes "To be a great Assassin you must use these skills masterfully.";
+ return;
+ sM_3b:
+ mes "[Guild Master]";
+ mes "Constantly challenging yourself is a great way to improve your abilities.";
+ mes "Facing the same targets over and over again will only make you weaker.";
+ next;
+ mes "[Guild Master]";
+ mes "Good Assassins are always finding ways to challenge themsleves.";
+ return;
+ sM_3c:
+ mes "[Guild Master]";
+ mes "This is probably the most important aspect to work on for an Assassin.";
+ mes "Not only do Assassins have to be of sound body but they also have to be of sound mind.";
+ next;
+ mes "[Guild Master]";
+ mes "It is crucial for Assassins to be mentally tough, for they are constantly under pressure.";
+ mes "The type of situations Assassins are faced with on a daily basis are unimaginable to most ordinary people.";
+ next;
+ mes "[Guild Master]";
+ mes "This is why a true Assassin is constantly training his/her mind.";
+ return;
+
+sF_Questions2:
+ mes "[Guild Master]";
+ mes "So let me ask you this.... If you became an Assassin right now, what is the first thing you would do?";
+ next;
+ menu "Go into battle!",M_4, "Go back to the ones waiting for me.",M_5, "Learn more about Assassins.",M_6;
+
+ M_4:
+ mes "[Guild Master]";
+ mes "Battle.... is that all?";
+ next;
+ menu "I would level up quickly.",sM_4a, "I would test my new abilities.",sM_4b, "I would go explore new places.",sM_4c;
+
+ sM_4a:
+ mes "[Guild Master]";
+ mes "Whether or not your an Assassin shouldn't change how quickly you train.";
+ mes "You would gain the same experience you did as a Thief. So take it slowly okay?";
+ return;
+ sM_4b:
+ mes "[Guild Master]";
+ mes "Testing out your new found skills is good.";
+ mes "I can understand the excitement you will feel when you have gained new abilities as an Assassin.";
+ next;
+ mes "[Guild Master]";
+ mes "Just don't let that get in the way of your duites.";
+ return;
+ sM_4c:
+ mes "[Guild Master]";
+ mes "Exploration is good. Find new places and meet new people.";
+ mes "You'll never know when you will meet a prospective client.";
+ return;
+
+ M_5:
+ mes "[Guild Master]";
+ mes "Someone's waitng for you?";
+ next;
+ menu "Yes, the people I met in this guild.",sM_5a, "A friend and partner.",sM_5b, "The love of my life.",sM_5c;
+
+ sM_5a:
+ mes "[Guild Master]";
+ mes "Haha. I think they would be happy to know that you are thinking of them.";
+ mes "No matter where you go, or what you do, you will always have a place here in this guild.";
+ return;
+ sM_5b:
+ mes "[Guild Master]";
+ mes "Good friends can be hard to find, and those that you can call a partner are even rarer.";
+ mes "It's good that you have a friend that you can trust and work with.";
+ return;
+ sM_5c:
+ mes "[Guild Master]";
+ if(sex == 1) mes "Oh you have a girlfriend... then become her shadow and protect her.";
+ if(sex == 0) mes "Oh you have a boyfriend... then become his shadow and protect him.";
+ next;
+ mes "[Guild Master]";
+ mes "As an Assassin you will find it very difficult to ever meet someone else, so make sure you treasure what you have now.";
+ return;
+
+ M_6:
+ mes "[Guild Master]";
+ mes "Okay, so what is it that you would like to know?";
+ next;
+ menu "Where's the easiest place to train?",sM_6a, "Where do Assassins usually go to gain exp?",sM_6b,
+ "How does an Assassin make money?",sM_6c;
+
+ sM_6a:
+ mes "[Guild Master]";
+ mes "Where ever an Assassin may be, he/she must learn to adapt and survive.";
+ mes "Assassins do not have the luxury of choosing where they work.";
+ return;
+ sM_6b:
+ mes "[Guild Master]";
+ mes "There are many experienced Assassins wandering the continent of Rune-Midgard. Seek them out and ask for their knowledge.";
+ next;
+ mes "[Guild Master]";
+ mes "The best way to gain experience however, is to go out and experience the world for yourself.";
+ return;
+ sM_6c:
+ mes "[Guild Master]";
+ mes "Damit, is money that important to you? An Assassins life does not revolve around money.....";
+ return;
+
+}
+
+
+//=============================================//
+// Maze Triggers
+//=============================================//
+in_moc_16.gat,170,90,0 script maze_trig#1 139,0,0,{
+ mes "[Guild Master]";
+ mes "There's no way to walk there, try another way.";
+ close;
+}
+in_moc_16.gat,150,85,0 script maze_trig#2 139,0,0,{
+ mes "[Guild Master]";
+ mes ".... Getting warmer.... you're almost there.....";
+ close;
+}
+in_moc_16.gat,153,85,0 script maze_trig#3 139,0,0,{
+ mes "[Guild Master]";
+ mes "You can't walk there..";
+ mes "Good, your almost there, keep walking.";
+ mes "You have to walk in between a pole and a.....";
+ mes "you got to turn a round in order to get in.";
+ close;
+}
+in_moc_16.gat,160,85,0 script maze_trig#4 139,0,0,{
+ mes "[Guild Master]";
+ mes "There's no way to walk there, try another way.";
+ close;
+}
+in_moc_16.gat,175,89,0 script maze_trig#5 139,0,0,{
+ mes "[Guild Master]";
+ mes "That way leads to Botogun..";
+ mes "What are going to do there?";
+ close;
+}
+in_moc_16.gat,164,88,0 script maze_trig#6 139,0,0,{
+ mes "[Guild Master]";
+ mes "Good.... you're on the right track.";
+ close;
+}
+in_moc_16.gat,149,95,0 script maze_trig#7 139,0,0,{
+ mes "[Guild Master]";
+ mes "Good, you found the path.";
+ close;
+}
+in_moc_16.gat,180,101,0 script maze_trig#8 139,0,0,{
+ mes "[Guild Master]";
+ mes "... It looks like that's not that way...";
+ close;
+}
+in_moc_16.gat,186,107,0 script maze_trig#9 139,0,0,{
+ mes "[Guild Master]";
+ mes "...Not that way either...";
+ close;
+}
+
+
+//================================================//
+// Decoy Chief
+//================================================//
+in_moc_16.gat,186,81,0 script Guild Master#02 55,{
+ mes "[Guild Master Botogun]";
+ mes "I'm sorry but I am not the person in charge here.";
+ mes "The real Guild Chief is on the other side.";
+ close;
+}
+
+
+//=================================================//
+// Guild Npcs
+//=================================================//
+in_moc_16.gat,156,85,1 script Huey#End 55,{end;}
+in_moc_16.gat,156,83,1 script Kai#End 730,{end;}
+in_moc_16.gat,156,81,1 script Nameless One#End 106,{end;}
+in_moc_16.gat,156,79,1 script Barcardi#End 725,{end;}
+in_moc_16.gat,156,77,1 script Observer#End 55,{end;}
+in_moc_16.gat,156,75,1 script Thomas#End 118,{end;}
+
+
+//==============================================================================
+// mapflag
+//==============================================================================
+in_moc_16.gat mapflag nomemo
+in_moc_16.gat mapflag noteleport
+in_moc_16.gat mapflag nosave SavePoint
+in_moc_16.gat mapflag nopenalty
+in_moc_16.gat mapflag nobranch
+in_moc_16.gat mapflag noexp
+in_moc_16.gat mapflag noloot
diff --git a/npc/jobs/2-1/blacksmith.txt b/npc/jobs/2-1/blacksmith.txt
index e053fcc75..0f173543f 100644
--- a/npc/jobs/2-1/blacksmith.txt
+++ b/npc/jobs/2-1/blacksmith.txt
@@ -1,1518 +1,1518 @@
-//===== eAthena Script =======================================
-//= Blacksmith Quest
-//===== By: ==================================================
-//= EREMES THE CANIVALIZER(Aegis)
-//= Translated by: yoshiki.
-//= Converted by: Komurka.
-//= Optimized and further edited by kobra_k88.
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Changed some npc names to the iRO names. Changed some variable
-//= names and labels. Edited some text.[kobra_k88]
-//= Removed "if(JobLevel > 48) goto higher". It was a left over line.
-//= Thx to "Decker".[kobra_k88]
-//= Fixed some typos, thanks to Riotblade [celest]
-//= 1.3-1.5 Added Baby Class support [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 1.7 item quantity/ids typos fix
-//= 1.8 Moved the Quest to Einbroch [Poki#3]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Removed Duplicates [Silent]
-//= 2.2 Merged Jfunc, changed job numbers to constants [Lupus]
-//==============================================================
-
-
-
-//<==================================================== Blacksmith Altiregen (Job changer)==================================================>\\
-ein_in01.gat,18,28,4 script Guildsman Altiregen 731,{
- callfunc "F_BlockHigh",Job_Merchant_High,"Merchant High",Job_Whitesmith,"White Smith","Blacksmith Altiregen";
-
- if (BaseJob == Job_Merchant) goto L_Merc;
- mes "[Blacksmith Altiregen]";
- mes "Welcome! We're the masters of the metal, blacksmiths!";
- mes "Our skills in creating weapons, in a way, is almost an art form!.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Those weapons, heh, can be sold for quite a profit as well.";
- next;
- mes "[Blacksmith Altiregen]";
-
- if (BaseJob == Job_Novice){
- if(sex){
- mes "Hmmm, you look like you wish to be a blacksmith! Sorry, but only merchants can be blacksmiths!.";
- } else {
- mes "...Hello little lady! If you wish to be a blacksmith, you have to be a merchant first!";
- }
- close;
- }
- if (baseClass == Job_Swordman){
- mes "Hello! Come here to order a sword? Sorry, but I have some paperwork to do, so I can't forge anything now.";
- close;
- }
- if (baseClass == Job_Acolyte){
- mes "Oh! A Holy one...! Do me a favor and bless the sword I'm crafting!";
- close;
- }
- if (baseClass == Job_Thief){
- mes "Sorry, but this is more of a office, so there's nothing worth money. We CAN do knife forges though.";
- close;
- }
- if (baseClass == Job_Mage){
- mes "Interested in training? Our guild cannot assist magic users is such matters.";
- close;
- }
- if (baseClass == Job_Archer){
- mes "Hmmm, sorry, but we're not hiring anyone that isn't a merchent.";
- close;
- }
- if (BaseJob == Job_Blacksmith){
- mes "Hey! Been a while, running a errand for Christopher? I feel like my hammer is getting rusty after all this office work.";
- close;
- }
- mes "Only Merchants can become Blacksmiths.";
- close;
-
-L_Merc:
- mes "[Blacksmith Altiregen]";
- if (BSMITH_Q == 1) goto L_Test1;
- if (BSMITH_Q == 2 || BSMITH_Q == 3) goto L_Test2and3;
- if (BSMITH_Q == 4) goto L_Test4;
- if (BSMITH_Q == 5) goto L_Change;
- mes "Hello fellow merchant! Are you here to apply?";
- mes "Write your name and your job level on this piece of paper.";
- next;
- menu "Apply",M_App,"What's required?",M_Req,"Not now...",M_NtNow;
-
- M_App:
- if(JobLevel < 40) goto sL_Lowlvl;
- if(JobLevel == 50) goto sL_HighLvl;
- mes "[Blacksmith Altiregen]";
- mes "Hmmm...";
- mes "Your job level is satisfactory.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Good, but we don't just accept anybody.";
- mes "We'll need to test your merchant skills and your determination.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Rustle Rustle";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Hmmm, the guildsman ^5533FFGeshupenschte in Einbech^000000, is a bit short of hands.";
- mes "Go help him, that's the first test.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Have a nice trip!";
- set BSMITH_Q,1;
- set JBLVL, 40;
- close;
-
- sL_Lowlvl:
- mes "[Blacksmith Altiregen]";
- mes "You need more training as a merchant. We only accept job level 40+";
- mes "As much as I want to accept you, we have regulations. Sorry, but return later.";
- close;
- sL_HighLvl:
- mes "[Blacksmith Altiregen]";
- mes "Wow! I'm impressed! You've done a lot of training there. You know what they say, with hard work comes great rewards.";
- emotion e_what;
- next;
- mes "[Blacksmith Altiregen]";
- mes "Well, first things first..... The guildsman ^5533FFGeshupenschte in Einbech^000000, is a bit short on help.";
- mes "Go help him, that's the first test.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Have a nice trip!";
- set BSMITH_Q,1;
- set JBLVL, 50;
- close;
- M_Req:
- mes "[Blacksmith Altiregen]";
- mes "What is required?";
- mes "First, be job level 40 at least.";
- mes "And pass the test.";
- mes "That's it. The test is a bit complicated, but passable.";
- mes "The test involves delievering items and being quized on the special items of certain regions and then being tested on knowledge of blacksmiths.";
- close;
- M_NtNow:
- mes "[Blacksmith Altiregen]";
- mes "Alright, see you later.";
- close;
-
-
-L_Test1:
- mes "You didn't leave yet? I told you to go see Geshupenschte in Einbech. See you then.";
- emotion e_what;
- close;
-
-L_Test2and3:
- mes "How was the work Geshupenschte gave you? He can be a pain sometimes.";
- close;
-L_Test4:
- if (BSMITH_Q2 == 1) goto L_NotDone;
- mes "Congrats! You've passed Geshupenschte's tests!";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Hmm? Heh, there is one last test you know.";
- mes "The guildsman for the last test is Mitmayer, go talk to her now.";
- next;
- menu "Cruel, but I'll go.",-,"......I don't wanna travel T_T",M_dontgo;
-
- set BSMITH_Q2, 1;
- mes "[Blacksmith Altiregen]";
- mes "I hope you do, because the blacksmith's guild doesn't like shaming it's status by hiring idiots!";
- next;
- mes "[Blacksmith Altiregen]";
- mes "If such a thing happened, I can see the guild crumbling down, sob T_T";
- mes "Well..... Go find her!";
- close;
- M_dontgo:
- mes "[Blacksmith Altiregen]";
- mes "What!? You're giving up!?!.........";
- emotion e_what;
- next;
- mes "[Blacksmith Altiregen]";
- mes "HOW DARE YOU INSULT OUR GUILD LIKE THAT!";
- mes "Leave now! Don't you dare even DREAM about becoming a blacksmith!";
- emotion e_omg;
- next;
- mes "[Blacksmith Altiregen]";
- mes "Can't endure ANYTHING can you!? How do you plan to become a blacksmith if you can't do these simple tasks!?";
- emotion e_an;
- close;
-
- L_NotDone:
- mes "Hmmm? Didn't you say you're going?";
- mes "Sorry, but you gotta pass the test.";
- close;
-
-L_Change:
- if(countitem(1005) < 1) goto L_NoHam;
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Blacksmith.";
- if(SkillPoint > 0) close;
- mes "Whoah, I can see the fire in your eyes! You've passed!!";
- mes "I'll grant you the power to work metals!";
- next;
- delitem 1005,1;
- callfunc "Job_Change",Job_Blacksmith;
- mes "[Blacksmith Altiregen]";
- mes "Don't forget! We're the artists that put beauty into metal! Don't you dare forget that!";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Here's a present! Congrats on passing!";
- if(JBLVL != 50) getitem 999,5;
- if(JBLVL == 50) getitem 999,10;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- emotion e_no1;
- close;
-
- L_NoHam:
- mes "Did you forget something? You need to show me the ^5533FFHammer of Blacksmiths^000000 to prove that you've passed all of the tests.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "You DO have it..... don't you???";
- next;
- menu "Oh that thing... let me just get it out of storage...",-, "Actually I sold it for pots..... now what?",sM_What;
-
- mes "[Blacksmith Altiregen]";
- mes "....... grrrrrrr.......";
- emotion e_ag;
- close;
- sM_What:
- mes "[Blacksmith Altiregen]";
- mes ".......... I'll tell you what.............";
- next;
- mes "[Blacksmith Altiregen]";
- mes "YOU GET TO START ALL OVER!!!!";
- set BSMITH_Q, 0;
- set BSMITH_Q2, 0;
- emotion e_pif;
- close;
-}
-
-
-//<=============================================== Geshupenschte: 1st, 2nd, 3rd Test ===================================================>\\
-ein_in01.gat,201,27,4 script Geshupenschte 63,{
-
- if(BaseJob == Job_Merchant) goto L_merchant;
- mes "[Geshupenschte]";
- mes "Hello sir! I'm the blacksmith. Geshupenschte! Nice to meet you!";
- next;
- mes "[Geshupenschte]";
- mes "Blacksmith is such a great job!! Don't you think so? Hahahahahahah!";
- emotion e_heh;
- close;
-
-L_merchant:
- mes "[Geshupenschte]";
- if (BSMITH_Q == 1) goto L_Test1;
- if (BSMITH_Q == 2) goto L_Test2;
- if (BSMITH_Q == 3) goto L_Test3;
- if (BSMITH_Q == 4) goto L_Done;
- if (BSMITH_Q == 5) goto L_GoChange;
- mes "Hoho!! A merchant! Excellent! I was in need of some help!!";
- next;
- mes "[Geshupenschte]";
- mes "Of course.... I wouldn't want to bother someone as busy as yourself. Go on your way if you must!....";
- next;
- mes "[Geshupenschte]";
- mes "~Dum dee dum dee dum~.....I am the best.... I am a blacksmith....(singing)";
- next;
- mes "[Geshupenschte]";
- mes "What? Why are you still here?";
- emotion e_what;
- close;
-
-// Test 1-----------------------------------------------------------------
-L_Test1:
- if (BSMITH_Q2 == 1) goto L_ReTest1;
- mes "You're the one sent by the guild, right?";
- mes "Whew, the people order so many items >_> We don't have enough people to deliever.";
- next;
- mes "[Geshupenschte]";
- mes "Well, you ARE the one sent by the guild, right?";
- mes "Oh well, hopefully >_>";
- next;
- mes "[Geshupenschte]";
- mes "See, this kid a few days ago,";
- mes "he wasted SO much of our money.";
- mes "Just because I sent him on a semi complicated errand >_>";
- mes "Now, let me ask a few questions!";
- next;
- menu "Alright",M_Rdy,"Wait, let me go and get prepared",-;
-
- mes "[Geshupenschte]";
- mes "Ok, return after you're ready.";
- mes "I'll be waiting here.";
- close;
- M_Rdy:
- set @score, 0;
- set @temp, rand(2);
- if (@temp == 1) goto L_setq2;
-
- L_setq1:
- mes "[Geshupenschte]";
- mes "1. Which town and local item don't match?";
- next;
- menu "Morroc - Thief Clothes",q1,"Alberta - 2 Hand Axe",q1,"Comodo - Berserk Potion",q1,"Alberta - Swordmace",-;
-
- set @score,@score+10;
- q1:
-
- mes "[Geshupenschte]";
- mes "2. What does the smith skill Hammerfall do?";
- next;
- menu "Stun",-,"Blind",q2,"Poison",q2,"Sleep",q2;
-
- set @score,@score+10;
- q2:
-
- mes "[Geshupenschte]";
- mes "3. What is a merchant not good at?";
- next;
- menu "Opening Shops",q3,"Buying Cheap",q3,"Selling High",q3,"Running Fast",-;
-
- set @score,@score+10;
-
- q3:
-
- mes "[Geshupenschte]";
- mes "4. Where do you buy Blue Gems?";
- next;
- menu "Alberta",q4,"Morroc",q4,"Geffen",-,"Prontera",q4;
-
- set @score,@score+10;
-
- q4:
-
- mes "[Geshupenschte]";
- mes "5. Where is the Geffen Tool Shop from the tower?";
- next;
- menu "8 o'clock",-,"11 o'clock",q5,"6 o'clock",q5,"5 o'clock",q5;
-
- set @score,@score+10;
-
- q5:
-
- mes "[Geshupenschte]";
- mes "6. What weapon can't be used by merchants?";
- next;
- menu "Stiletto",q6,"Buster",q6,"Chain",q6,"Bible",-;
-
- set @score,@score+10;
-
- q6:
-
- mes "[Geshupenschte]";
- mes "7. Which has the highest def?";
- next;
- menu "Panty",q7,"Mink Coat",-,"Wooden Mail",q7,"Silk Robe",q7;
-
- set @score,@score+10;
-
- q7:
-
- mes "[Geshupenschte]";
- mes "8. How many times can you upgrade a lvl 3 weapon safely?";
- next;
- menu "+3 ",q8,"+4 ",q8,"+5 ",-,"+6 ",q8;
-
- set @score,@score+10;
- q8:
-
- mes "[Geshupenschte]";
- mes "9. What can you make with Trunks?";
- next;
- menu "Sakkat",-,"Ghost Bandana",q9,"Majestic Goat",q9,"Antlers",q9;
-
- set @score,@score+10;
- q9:
-
- mes "[Geshupenschte]";
- mes "10. What is the most important to merchants!?";
- next;
- menu "Helpfulness",-,"Honor",-,"Money",-,"Honesty",-;
-
- set @score,@score+10;
-
- if (BSMITH_Q2 == 1) goto L_result2;
- goto L_result;
-
- L_setq2:
- mes "[Geshupenschte]";
- mes "1. Which town and local item is mismatched?";
- next;
- menu "Aldebaran - Ygg Leaf",q10,"Alberta - Hammer",q10,"Comodo - Berserk Potion",q10,"Aldebaran - Hammer",-;
-
- set @score,@score+10;
- q10:
-
- mes "[Geshupenschte]";
- mes "2. How much does Jellopy sell for?";
- next;
- menu "1z",q11,"2z",q11,"3z",-,"4z",q11;
-
- set @score,@score+10;
- q11:
-
- mes "[Geshupenschte]";
- mes "3. What's necessary to make a shop?";
- next;
- menu "Must have cart",-,"Item to sell",q12,"Have weapon equiped",q12,"Wear Armor",q12;
-
- set @score,@score+10;
- q12:
-
- mes "[Geshupenschte]";
- mes "4. Where is the merchant guild located?";
- next;
- menu "Alberta",-,"Morroc",q13,"Geffen",q13,"Prontera",q13;
-
- set @score,@score+10;
- q13:
-
- mes "[Geshupenschte]";
- mes "5. Where is the Morroc Weapon Shop from the center?";
- next;
- menu "7 o'clock",q14,"11 o'clock",q14,"6 o'clock",q14,"5 o'clock",-;
-
- set @score,@score+10;
- q14:
-
- mes "[Geshupenschte]";
- mes "6. What can't a merchant equip?";
- next;
- menu "Main Gauche",q15,"Claymore",-,"Chain",q15,"2 hand axe",q15;
-
- set @score,@score+10;
- q15:
-
- mes "[Geshupenschte]";
- mes "7. What has the highest defense?";
- next;
- menu "Panty",q16,"Mink Coat",-,"Wooden Mail",q16,"Silk Robe",q16;
-
- set @score,@score+10;
- q16:
-
- mes "[Geshupenschte]";
- mes "8. How many times can you safely upgrade a lvl 4 weapon?";
- next;
- menu "+3 ",q17,"+4",-,"+5",q17,"+6",q17;
-
- set @score,@score+10;
- q17:
-
- mes "[Geshupenschte]";
- mes "9. Which monster doesn't drop iron ore?";
- next;
- menu "Chonchon",q18,"Steel Chonchon",q18,"Zerom",q18,"Anolian",-;
-
- set @score,@score+10;
- q18:
-
- mes "[Geshupenschte]";
- mes "10. What is the most important to merchants?!";
- next;
- menu "Honesty",-,"Helpfulness",-,"Money",-,"Posture",-;
-
- set @score,@score+10;
-
- if (BSMITH_Q2 == 1) goto L_result2;
- goto L_result;
-
-L_result:
- mes "[Geshupenschte]";
- mes "Good!";
- next;
- mes "[Geshupenschte]";
- mes "Lets see....your score is ^5533FF"+@score+".^000000";
- if (@score == 100) goto L_perfect;
- mes ".............";
- next;
- mes "[Geshupenschte]";
- mes "Sorry friend, I don't want to give you the job.";
- mes "You need just a bit more knowledge. Go study some more";
- set BSMITH_Q2, 1;
- close;
-
- L_perfect:
- set BSMITH_Q,2;
- set BSMITH_Q2, 0;
- mes "Perfect!";
- next;
- mes "[Geshupenschte]";
- mes "Then you definatly can do the errand!";
- mes "Are you prepared?";
- close;
-L_result2:
- mes "[Geshupenschte]";
- mes "Great!";
- next;
- mes "[Geshupenschte]";
- mes "Lets see....your score is ^5533FF"+@score+".^000000";
- if (@score > 80) goto L_pass;
- mes ".............";
- next;
- mes "[Geshupenschte]";
- mes "You've missed again!";
- mes "If you keep missing, I can't give you the job. Go study more.";
- set BSMITH_Q2, 1;
- close;
-
- L_pass:
- set BSMITH_Q,2;
- set BSMITH_Q2, 0;
- mes "You Passed!";
- next;
- mes "[Geshupenschte]";
- mes "I'll let you do the job";
- mes "Are you prepared?";
- close;
-L_ReTest1:
- mes "Ah, I see you've studied more. Don't miss any questions! Here we go!";
- next;
- goto M_Rdy;
-
-
-// Test 2-----------------------------------------------------------------
-L_Test2:
- if(BSMITH_Q2 > 0) goto L_CheckTest2;
- mes "Let's see... orders....";
- next;
- mes "[Geshupenschte]";
- mes "Ah, here it is!";
- mes "Here's the order that's almost due";
- mes "Hmmm";
- next;
- mes "[Geshupenschte]";
- mes "I need you to get me....";
- next;
- set BSMITH_Q2,rand(1,5);
- if (BSMITH_Q2 == 2) goto R_item2;
- if (BSMITH_Q2 == 3) goto R_item3;
- if (BSMITH_Q2 == 4) goto R_item4;
- if (BSMITH_Q2 == 5) goto R_item5;
-
- R_item1:
- mes "[Geshupenschte]";
- mes "^5533FF2 Steel";
- mes "1 Rotten Bandage";
- mes "2 Blue Gemstone^000000";
- mes "and ^5533FF1 Arc Wand^000000 from the store.";
- next;
- mes "[Geshupenschte]";
- mes "Hey, we're not making you bring these because we're cheap! It's a test!";
- next;
- mes "[Geshupenschte]";
- mes "^5533FF2 Steel";
- mes "1 Rotten Bandage";
- mes "2 Blue Gemstone^000000";
- mes "and ^5533FF1 Arc Wand^000000 from the store.";
- next;
- goto L_finalword;
- R_item2:
- mes "[Geshupenschte]";
- mes "^5533FF2 Star Dust";
- mes "2 Skel Bones";
- mes "1 Zargons^000000";
- mes "and ^5533FF1 Gladius^000000 from the stores.";
- next;
- mes "[Geshupenschte]";
- mes "Hey! We're not being cheap, this is a test!";
- next;
- mes "[Geshupenschte]";
- mes "I'll list them again";
- mes "^5533FF2 Star Dust";
- mes "2 Skel Bones";
- mes "1 Zargons^000000";
- mes "and ^5533FF1 Gladius^000000 from the stores.";
- next;
- goto L_finalword;
- R_item3:
- mes "[Geshupenschte]";
- mes "^5533FF2 Coals";
- mes "2 Shells";
- mes "2 Red Bloods^000000";
- mes "and ^5533FF1 Tsurugi^000000 from the stores.";
- next;
- mes "[Geshupenschte]";
- mes "Hey! We're not being cheap, this is a test!";
- next;
- mes "[Geshupenschte]";
- mes "I'll list them again";
- mes "^5533FF2 Coals";
- mes "2 Shells";
- mes "2 Red Bloods^000000";
- mes "and ^5533FF1 Tsurugi^000000 from the stores.";
- next;
- goto L_finalword;
- R_item4:
- mes "[Geshupenschte]";
- mes "^5533FF8 Iron Ores";
- mes "1 Trunk";
- mes "2 Blue Gems^000000";
- mes "And a ^5533FFArbalest^000000 from the stores.";
- next;
- mes "[Geshupenschte]";
- mes "Hey! We're not being cheap!";
- next;
- mes "[Geshupenschte]";
- mes "I'll list them again.";
- mes "^5533FF8 Iron Ores";
- mes "1 Trunk";
- mes "2 Blue Gems^000000";
- mes "And a ^5533FFArbalest^000000 from the stores.";
- next;
- goto L_finalword;
- R_item5:
- mes "[Geshupenschte]";
- mes "^5533FF8 Iron Ores";
- mes "20 Green Herbs";
- mes "2 Animal Skin^000000";
- mes "and ^5533FF1 Morning Star^000000 from the stores.";
- next;
- mes "[Geshupenschte]";
- mes "Hey! We're not being cheap! It's a test!";
- next;
- mes "[Geshupenschte]";
- mes "I'll list them again.";
- mes "^5533FF8 Iron Ores";
- mes "20 Green Herbs";
- mes "2 Animal Skin^000000";
- mes "and ^5533FF1 Morning Star^000000 from the stores.";
- next;
- L_finalword:
- mes "[Geshupenschte]";
- mes "Good luck!";
- close;
-
-L_CheckTest2:
- mes "Hmm? Did you bring all the items?";
- next;
- if (BSMITH_Q2 == 2) goto L_2b;
- if (BSMITH_Q2 == 3) goto L_2c;
- if (BSMITH_Q2 == 4) goto L_2d;
- if (BSMITH_Q2 == 5) goto L_2e;
-
- L_2a:
- if(countitem(999) < 2 || countitem(930) < 1 || countitem(717) < 2 || countitem(1610) < 1) goto sL_NtEnuf1;
- mes "[Geshupenschte]";
- mes "Didn't I ask for 3 steels?";
- next;
- mes "[Geshupenschte]";
- mes "Oh yea! I did ask for 2.";
- mes "Gimme a sec.";
- delitem 999,2;
- delitem 930,1;
- delitem 717,2;
- delitem 1610,1;
- callsub sF_Make;
- mes "Deliever this to Geffen's Baisulitst and bring back the reciept.";
- getitem 1610,1;
- next;
- mes "[Geshupenschte]";
- mes "WHAT!? Nothing looks different?";
- mes "Look carefully where my hand is.";
- mes "See the emphesized groove!?";
- mes "ITS THE SUPER Geshupenschte ARC WAND MK II!!!!! XDDDDD";
- next;
- mes "[Geshupenschte]";
- mes "Feel the difference! Almost no inertia!";
- next;
- mes "[Geshupenschte]";
- mes "Now, go deliever to Baisulitst!";
- close;
-
- sL_NtEnuf1:
- mes "[Geshupenschte]";
- mes "You didn't bring all the items!";
- next;
- goto R_item1;
- L_2b:
- if(countitem(1001) < 2 || countitem(932) < 2 || countitem(912) < 1 || countitem(1219) < 1) goto sL_NtEnuf2;
- mes "[Geshupenschte]";
- mes "Didn't I ask for 3 Star Dusts?";
- next;
- mes "[Geshupenschte]";
- mes "Oh yea, 2, that's right.";
- mes "Okay, gimme a sec.";
- delitem 1001,2;
- delitem 932,2;
- delitem 912,1;
- delitem 1219,1;
- callsub sF_Make;
- mes "Now, take this to Morroc's Wickebine";
- getitem 1219,1;
- next;
- mes "[Geshupenschte]";
- mes "WHAT!? IT DOESN'T LOOK ANY DIFFERENT!?";
- mes "Look carefully at the blade!";
- mes "CAN YOU NOT SEE THE BEAUTIFUL MARKINGS?!";
- mes "ULTRA GLADIUS Geshupenschte Mk II!!";
- next;
- mes "[Geshupenschte]";
- mes "Isnt it so pretty ^_^";
- next;
- mes "[Geshupenschte]";
- mes "Well, go to Morroc and give it the Wickebine and bring the receipt back.";
- close;
-
- sL_NtEnuf2:
- mes "[Geshupenschte]";
- mes "You didn't bring all the items!";
- next;
- goto R_item2;
- L_2c:
- if(countitem(1003) < 2 || countitem(935) < 2 || countitem(990) < 1 || countitem(1119) < 1) goto sL_NtEnuf3;
- mes "[Geshupenschte]";
- mes "Didn't I ask for 3 coals??";
- next;
- mes "[Geshupenschte]";
- mes "That's right, 2 coals";
- mes "Okay, wait a sec.";
- delitem 1003,2;
- delitem 935,2;
- delitem 990,1;
- delitem 1119,1;
- callsub sF_Make;
- mes "Give this to Izlude's Gromgast and bring back the receipt.";
- getitem 1119,1;
- next;
- mes "[Geshupenschte]";
- mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
- mes "Look carefully at the blade!";
- mes "Look at the beautiful markings!";
- mes "ULTRA Geshupenschte TSURUGI Mk II!!!";
- next;
- mes "[Geshupenschte]";
- mes "Isn't it so pretty ^_^";
- next;
- mes "[Geshupenschte]";
- mes "Anyways, Izlude's Gromgast! Go!";
- close;
-
- sL_NtEnuf3:
- mes "[Geshupenschte]";
- mes "You didn't bring all the items!";
- next;
- goto R_item3;
-
- L_2d:
- if(countitem(1002) < 8 || countitem(1019) < 1 || countitem(717) < 2 || countitem(1713) < 1) goto sL_NtEnuf4;
- mes "[Geshupenschte]";
- mes "Didn't I ask for 30 iron ores?";
- next;
- mes "[Geshupenschte]";
- mes "Wait, 8 is right >_>";
- mes "Hmmm, wait a sec then.";
- delitem 1002,8;
- delitem 1019,1;
- delitem 717,2;
- delitem 1713,1;
- callsub sF_Make;
- mes "Deliever this to Payon's Tilpitz";
- getitem 1713,1;
- next;
- mes "[Geshupenschte]";
- mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
- mes "LOOK AT THE GROOVES WHERE THE ARROWS GO!!";
- mes "LOOK HOW CUSTOMIZED IT IS!!!!!";
- mes "Geshupenschte'S MASTER ARCHER ARBALEST Mk II!!!";
- next;
- mes "[Geshupenschte]";
- mes "Look how well built the bow is!";
- next;
- mes "[Geshupenschte]";
- mes "Well, Tilpitz in Payon, and bring the envelop.";
- close;
-
- sL_NtEnuf4:
- mes "[Geshupenschte]";
- mes "You didn't bring all the items!";
- next;
- goto R_item4;
-
- L_2e:
- if(countitem(1002) < 8 || countitem(511) < 20 || countitem(919) < 2 || countitem(1513) < 1) goto sL_NtEnuf5;
- mes "[Geshupenschte]";
- mes "Didn't I ask for 40 ores?";
- next;
- mes "[Geshupenschte]";
- mes "Wait, 8! That's right!";
- mes "Okay, wait a sec!";
- delitem 1002,8;
- delitem 511,20;
- delitem 919,2;
- delitem 1513,1;
- callsub sF_Make;
- mes "Take this to Bismarck in Comodo and bring me the receipt.";
- getitem 1513,1;
- next;
- mes "[Geshupenschte]";
- mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
- mes "Look carefully at the tips of the spikes!!";
- mes "The green herbs' antidote for poisons have been mixed in!";
- mes "ANTI POISON Geshupenschte MORNING STAR MK II!!!!!";
- next;
- mes "[Geshupenschte]";
- mes "Don't you get it!? When you're poisoned, you stab yourself with it!";
- mes "The wound.....probably will get bigger! But the poison will be gone!";
- next;
- mes "[Geshupenschte]";
- mes "Well, take this to Bismarck of Comodo!";
- close;
-
- sL_NtEnuf5:
- mes "[Geshupenschte]";
- mes "You didn't bring all the items!";
- next;
- goto R_item5;
-
- sF_Make:
- set BSMITH_Q, 3;
- next;
- mes "[Geshupenschte]";
- mes "Grunt.......";
- next;
- mes "~clank~clonk~clank~";
- next;
- mes "[Geshupenschte]";
- mes "Ergh......";
- next;
- mes "~bonk~bang~bonk~";
- next;
- mes "[Geshupenschte]";
- mes "Whew. There we go!";
- return;
-
-
-// Test 3-----------------------------------------------------------------
-L_Test3:
- if (BSMITH_Q3 == 1) goto L_CheckTest3;
- mes "Go deliever!";
- mes "........you didn't forget.......right?";
- next;
- mes "[Geshupenschte]";
- if (BSMITH_Q2 == 2) goto L_3b;
- if (BSMITH_Q2 == 3) goto L_3c;
- if (BSMITH_Q2 == 4) goto L_3d;
- if (BSMITH_Q2 == 5) goto L_3e;
-
- L_3a:
- if (countitem(1610) < 1) goto L_LostItem;
- mes "Baisulitst should be at 11 o'clock of Geffen ";
- close;
- L_3b:
- if (countitem(1219) < 1) goto L_LostItem;
- mes "Take it to Wickebine near the Sword Mace dealer in Morroc.";
- close;
- L_3c:
- if (countitem(1119) < 1) goto L_LostItem;
- mes "Gromgast hangs out at 11 o'clock of Izlude.";
- close;
- L_3d:
- if (countitem(1713) < 1) goto L_LostItem;
- mes "Tilpitz hangs out at 5 o'clock of Payon";
- close;
- L_3e:
- if (countitem(1513) < 1) goto L_LostItem;
- mes "Bismarck is usually at 12 o'clock area of Comodo.";
- close;
-
- L_LostItem:
- mes "WHAT!!! YOU LOST THE ITEM I GAVE YOU TO DELIVER!!!!";
- emotion e_omg;
- next;
- mes "[Geshupenschte]";
- mes "........... Well then.... I gues you'll just have too.....";
- next;
- mes "[Geshupenschte]";
- mes "START ALL OVER!! Now get out of my sight!!";
- set BSMITH_Q, 0;
- set BSMITH_Q2, 0;
- emotion e_ag;
- close;
-
-L_CheckTest3:
- mes "Did you deliever it?";
- mes "Lets see the receipt then!";
- next;
- menu "Here you go",-,"Wait a second.",M_Wait;
-
- if(countitem(1073) < 1) goto sL_noreceipt;
- mes "[Geshupenschte]";
- mes "Great! Very good! You're definalty a honest merchant! Go see Altiregen back in Einbroch!";
- mes "I know you'll definately pass the test!!!";
- set BSMITH_Q, 4;
- set BSMITH_Q2, 0;
- set BSMITH_Q3, 0;
- delitem 1073,1;
- close;
-
- sL_noreceipt:
- mes "[Geshupenschte]";
- mes "........You don't know where you left the receipt.........";
- next;
- mes "[Geshupenschte]";
- mes "WHAT'S THIS?! YOU LOST IT!? DId you SELL it or something!?";
- emotion e_omg;
- next;
- mes "[Geshupenschte]";
- mes "The receipt is the soul of merchants! The life line of blacksmiths!";
- mes "Guess what? You get to..... START ALL OVER!!";
- set BSMITH_Q, 0;
- set BSMITH_Q2, 0;
- set BSMITH_Q3, 0;
- emotion e_pif;
- close;
- M_Wait:
- mes "[Geshupenschte]";
- mes "Well, tell me if you find the receipt. I HOPE you got one.";
- close;
-
-L_Done:
- mes "Thanks for working for me! Now go see Altiregen!";
- close;
-
-L_GoChange:
- mes "There should be nothing you want now.........";
- mes "Maybe you're thinking of Einbroch?";
- close;
-}
-
-
-// Delivery Recipients ==================================================>\\
-// Baisulitst -----------------------------------------------------------
-geffen.gat,46,164,4 script Baisulitst 69,{
- if (BSMITH_Q==3) goto L_Start;
-
- mes "[Baisulitst]";
- mes "Now that I think about it, it's been a while since I've been to Alberta. I'm a little upset with the service I've been getting, especially the late deliveries......";
- next;
- mes "[Baisulitst]";
- mes "I ordered something from the Geffen Blacksmith Guild but the order got transfered to a blacksmith in Alberta.....";
- next;
- mes "[Baisulitst]";
- mes "Hmmm....., I wonder when I will recieve my special order ^5555FFArc Wand^000000.....";
- emotion e_hmm;
- close;
-
-L_Start:
- if(BSMITH_Q2 != 1) goto L_Wrong;
- if(countitem(1073) == 1) goto L_Done;
- if(countitem(1610) < 1) goto L_NoItem;
- mes "[Baisulitst]";
- mes "Wow! Is it finally here?!";
- mes "Thank you! I was waiting forever!";
- delitem 1610,1;
- set BSMITH_Q3, 1;
- next;
- mes "[Baisulitst]";
- mes "I ordered this from the Geffen BS Guild, but they assigned it to the smith in Alberta!";
- next;
- mes "[Baisulitst]";
- mes "Thanks for coming from so far away!";
- mes "Also, make sure to hit Geshupenschte one for me! How could anything be so late >_>";
- next;
- mes "[Baisulitst]";
- mes "Here's the receipt!";
- next;
- mes "~Scribble, Scribble~ Rip ~";
- next;
- getitem 1073,1;
- mes "[Baisulitst]";
- mes "Here you go! Good bye! Thank you for the delivery!";
- close;
-
- L_NoItem:
- mes "[Baisulitst]";
- mes "..... Hmm?.... What's this?..... You here to deliver something to me but you don't have the actual item??";
- emotion e_pif;
- L_Wrong:
- mes "[Baisulitst]";
- mes "..... Hmm?.... What's this?..... This is not what I ordered.....";
- emotion e_pif;
- L_Done:
- mes "[Baisulitst]";
- mes "Thanks again for the delivery. I really appreciate it!";
- close;
-}
-
-// Wickebine --------------------------------------------------------------------
-morocc.gat,27,112,4 script Wickebine 725,{
- if (BSMITH_Q == 3) goto L_Start;
-
- mes "[Wickebine]";
- mes "..........";
- mes ".....When will my order be here?";
- emotion e_hmm;
- next;
- mes "[Wickebine]";
- mes "The Geffen Blacksmith Guild and Geshupenschte are both CHRONICALLY LATE!";
- emotion e_pif;
- next;
- mes "[Wickebine]";
- mes "This is very upsetting......";
- close;
-L_Start:
- if(BSMITH_Q2 != 2) goto L_Wrong;
- if(countitem(1073) == 1) goto L_Done;
- if(countitem(1219) < 1) goto L_NoItem;
- mes "[Wickebine]";
- mes "Is it finally here!?!";
- mes "Give it!!!!";
- delitem 1219,1;
- set BSMITH_Q3, 1;
- next;
- mes "[Wickebine]";
- mes "Tell the BS guild";
- mes "and your teacher Geshupenschte!";
- next;
- mes "[Wickebine]";
- mes "You're LATE";
- mes "and I was WAITING.";
- next;
- mes "[Wickebine]";
- mes "But the item seems pretty high quality.";
- next;
- mes "(Writes something down)";
- next;
- getitem 1073,1;
- mes "[Wickebine]";
- mes "Here's the receipt and thanks for the delivery.";
- close;
-
- L_NoItem:
- mes "[Wickebine]";
- mes "Ung! You came all this way to deliver my item and you lost it??!!";
- emotion e_an;
- close;
- L_Wrong:
- mes "[Wickebine]";
- mes "I think you're supposed to deliver this somewhere else.....";
- emotion e_swt;
- close;
- L_Done:
- mes "[Wickebine]";
- mes "Thank you";
- close;
-}
-
-// Gromgast ---------------------------------------------------------------------
-izlude.gat,69,181,4 script Gromgast 734,{
- if (BSMITH_Q == 3) goto L_Start;
-
- mes "[Gromgast]";
- mes "..........";
- mes ".....When will that sword arrive >_>";
- next;
- mes "[Gromgast]";
- mes "I need that sword for my training!";
- mes "Nooo.....I must not get rusty!";
- next;
- mes "[Gromgast]";
- mes "Noooooooo T_T......";
- close;
-
-L_Start:
- if(BSMITH_Q2 != 3) goto L_Wrong;
- if(countitem(1073) == 1) goto L_Done;
- if(countitem(1119) < 1) goto L_NoItem;
- mes "[Gromgast]";
- mes "Ahhh, it's finally here";
- mes "Let me see it.";
- delitem 1119,1;
- set BSMITH_Q3, 1;
- next;
- mes "[Gromgast]";
- mes "Nice.....";
- mes "It's better then I expected.";
- next;
- mes "[Gromgast]";
- mes "I think this sword is exactly what I need!!";
- mes "I like it!";
- next;
- mes "[Gromgast]";
- mes "Here you go.";
- next;
- mes "~scribble~rip~";
- next;
- getitem 1073,1;
- mes "[Gromgast]";
- mes "Here's the receipt! Thank you.";
- close;
-
- L_NoItem:
- mes "[Gromgast]";
- mes "Hmm... I don't understand.... where is the item I ordered???....";
- emotion e_hmm;
- L_Wrong:
- mes "[Gromgast]";
- mes "Sorry, but you've got the wrong person.";
- close;
- L_Done:
- mes "[Gromgast]";
- mes "Thanks for the delivery!";
- close;
-}
-
-// Tilpitz --------------------------------------------------------------------
-payon.gat,214,79,4 script Tilpitz 59,{
- if (BSMITH_Q == 3) goto L_Start;
-
- mes "[Tilpitz]";
- mes "When's that bow coming..........";
- mes "How long ago did I order this thing >_>";
- next;
- mes "[Tilpitz]";
- mes "There's no one that can make it execpt 'him'.........";
- mes "but, WHEN WILL IT COME >_>";
- next;
- mes "[Tilpitz]";
- mes " T_T ";
- close;
-L_Start:
- if(BSMITH_Q2 != 4) goto L_Wrong;
- if(countitem(1073) == 1) goto L_Done;
- if(countitem(1713) < 1) goto L_NoItem;
- mes "[Tilpitz]";
- mes ".......Ohhh! It's finally here!!!";
- mes "Let me see it!";
- delitem 1713,1;
- set BSMITH_Q3, 1;
- next;
- mes "[Tilpitz]";
- mes "Wow....";
- mes "Not bad......not bad at all!!";
- next;
- mes "[Tilpitz]";
- mes "Look at this curve!! It's wonderful!!";
- mes "Oh, I love this";
- next;
- mes "[Tilpitz]";
- mes "Thank you!!!";
- next;
- mes "scribble scribble rip";
- next;
- getitem 1073,1;
- mes "[Tilpitz]";
- mes "Here's the receipt! Thank you again!!!!!";
- close;
-
- L_NoItem:
- mes "[Tilpitz]";
- mes "Oooh! The delivery is here? What?..... You don't have anything???.....";
- emotion e_what;
- next;
- mes "[Tilpitz]";
- mes "Don't play bad jokes on people!";
- emotion e_ag;
- close;
- L_Wrong:
- mes "[Tilpitz]";
- mes "What's this? You have a delivery.... for someone else..... Then why not deliver it to that person instead???........";
- emotion e_swt;
- close;
- L_Done:
- mes "[Tilpitz]";
- mes "More I look at it, more beautiful it gets!!! ";
- close;
-}
-
-// Bismarck ---------------------------------------------------------------------------
-comodo.gat,158,342,4 script Bismarck 118,{
- if (BSMITH_Q == 3) goto L_Start;
-
- mes "[Bismarck]";
- mes "......Ugh?...";
- mes ".....When's that delivery coming......";
- next;
- mes "[Bismarck]";
- mes "....the.....p...poison...... >_>....";
- mes "Ack.....";
- next;
- mes "[Bismarck]";
- mes "....Looks like... I'm....screwed.";
- close;
-
-L_Start:
- if(BSMITH_Q2 != 5) goto L_Wrong;
- if(countitem(1073) == 1) goto L_Done;
- if(countitem(1513) < 1) goto L_NoItem;
- mes "[Bismarck]";
- mes "Ugh.........finally...........";
- mes "Pant pant..........give it to me~";
- delitem 1513,1;
- set BSMITH_Q3, 1;
- next;
- mes "[Bismarck]";
- mes "Ugh....";
- mes "The green herb is in it........right?";
- next;
- mes "[Bismarck]";
- mes "I........can't move.........help me up";
- mes "....grunt.....";
- next;
- mes "- STAB! -";
- next;
- mes "[Bismarck]";
- mes "AAAAAAAAAAACCCCCCCCCKKKKKK!!!";
- next;
- mes "[Bismarck]";
- mes "whew, that works pretty well..";
- next;
- getitem 1073,1;
- mes "[Bismarck]";
- mes "Cough.... Here's the receipt..... thank you for the delivery! I guess I get to live longer......";
- close;
-
- L_NoItem:
- mes "[Bismarck]";
- mes "ARE YOU TRYING TO TOY WITH ME!!?? How.... ~cough~... could....~ung~.... you....~ack~.....";
- emotion e_omg;
- close;
- L_Wrong:
- mes "[Bismarck]";
- mes "I NEED AN ANTIDOTE DAMMIT!! Not this stuff ~ack~........";
- emotion e_omg;
- close;
- L_Done:
- mes "[Bismarck]";
- mes "Whew, thank you.";
- close;
-}
-
-
-
-//<===================================================== Mitehmaeeuh: Last Test ===================================================>\\
-ein_in01.gat,24,41,4 script Mitmayer 726,{
- if (BSMITH_Q == 4) goto L_Start;
- if (BSMITH_Q == 5) goto L_Done;
- mes "[Mitmayer]";
- mes "Whew.... the sun in Morroc is just too strong.... I guess it will gie me tougher skin... Oh well......";
- emotion e_swt2;
- next;
- mes "[Mitmayer]";
- mes "Afteralll, we Blacksmiths are used to high temperatures since we work with fire everyday!";
- next;
- mes "[Mitmayer]";
- mes "Getting nice and tan isn't so bad..... I think it gives you a healthy athletic look.";
- close;
-L_Done:
- mes "[Mitmayer]";
- mes "I told you that you've passed.";
- next;
- mes "[Mitmayer]";
- mes "Return to the guild";
- next;
- mes "[Mitmayer]";
- mes "Also, don't lose the Hammer of Blacksmiths!!";
- next;
- mes "[Mitmayer]";
- mes "Don't forget to use the skill points too!";
- close;
-L_Start:
- mes "[Mitmayer]";
- mes "Welcome! You want to be a smith?";
- mes "Okay, but know that not everyody passes.";
- next;
- mes "[Mitmayer]";
- mes "It's a quiz about how well you know metals and the blacksmith class.";
- mes "I have quite a bit to ask, so lets start";
- next;
- menu "Ok",M_Test,"Not now",-;
-
- mes "[Mitmayer]";
- mes "Okay, I'll see you then.";
- close;
- M_Test:
- mes "[Mitmayer]";
- mes "Okay, lets start You'll fail if you don't get enough right.";
- next;
- mes "[Mitmayer]";
- mes "5 questions";
- mes "I won't tell you what's right or wrong.";
- next;
- set @score, 0;
- set @temp, rand(3);
- if (@temp == 1) goto R_Set2;
- if (@temp == 2) goto R_Set3;
-
- R_Set1:
- mes "[Mitmayer]";
- mes "1. Which skill is needed for discount?";
- next;
- menu "Pushcart Lv 3",sM_1a,"Item Appraisal",sM_1a,"Mammonite Lv 10",sM_1a,"Enlarge Weight Lv 3",-;
-
- set @score,@score+20;
- sM_1a:
-
- mes "[Mittmayer]";
- mes "2. What effect does hammerfall have?";
- next;
- menu "Stun",-,"Blind",sM_1b,"Confuse",sM_1b,"Poison",sM_1b;
-
- set @score,@score+20;
- sM_1b:
-
- mes "[Mitmayer]";
- mes "3. How much zeny is taken when Mammonite 10 is used?";
- next;
- menu "900z",sM_1c,"1,000z",-,"2,000z",sM_1c,"1,000,000z",sM_1c;
-
- set @score,@score+20;
- sM_1c:
-
- mes "[Mitmayer]";
- mes "4. How much money is saved with max discount??";
- next;
- menu "21 % ",sM_1d,"22 % ",sM_1d,"23 % ",sM_1d,"24 % ",-;
-
- set @score,@score+20;
- sM_1d:
-
- mes "[Mitmayer]";
- mes "5. How much can you earn with max overcharge?";
- next;
- menu "21 % ",sM_1e,"22 % ",sM_1e,"23 % ",sM_1e,"24 % ",-;
-
- set @score,@score+20;
- sM_1e:
- goto L_Result;
-
- R_Set2:
- mes "[Mittmayer]";
- mes "1. Which monster drops steel?";
- next;
- menu "Zerom",sM_2a,"Steel Chonchon",sM_2a,"Skel Worker",-,"Requiem",sM_2a;
-
- set @score,@score+20;
- sM_2a:
-
- mes "[Mitmayer]";
- mes "2. What can you make with Red Bloods?";
- next;
- menu "Flame Heart",-,"Rough Wind",sM_2b,"Great Nature",sM_2b,"Mystic Frozen",sM_2b;
-
- set @score,@score+20;
- sM_2b:
-
- mes "[Mitmayer]";
- mes "3. Which ore do you have the most of in storage?";
- next;
- menu "WoV",sM_2c,"Red Blood",-,"Green Live",-,"Crystal Blue",-;
-
- set @score,@score+20;
- sM_2c:
-
- mes "[Mitmayer]";
- mes "4. What kind of monsters are weak against wind weapons?";
- next;
- menu "Fire",sM_2d,"Water",-,"Earth",sM_2d,"Wind",sM_2d;
-
- set @score,@score+20;
- sM_2d:
-
- mes "[Mitmayer]";
- mes "5. How many irons are needed to make steel?";
- next;
- menu "5",-,"4",sM_2e,"3",sM_2e,"6",sM_2e;
-
- set @score,@score+20;
- sM_2e:
- goto L_Result;
-
- R_Set3:
- mes "[Mitmayer]";
- mes "1. What do you do when you find a person in distress?";
- next;
- menu "Ask what they need",-,"Talk for a bit",-,"Ignore",sM_3a,"Drop item and leave",sM_3a;
-
- set @score,@score+20;
- sM_3a:
-
- mes "[Mitmayer]";
- mes "2. Where do you learn change cart?";
- next;
- menu "Aldebaran",sM_3b,"Alberta",-,"Morroc",sM_3b,"Izlude",sM_3b;
-
- set @score,@score+20;
- sM_3b:
-
- mes "[Mitmayer]";
- mes "3. Geffen tower is the center, where is the BS guild?";
- next;
- menu "11oclock",sM_3c,"5oclock",-,"7oclock",sM_3c,"12oclock",sM_3c;
-
- set @score,@score+20;
- sM_3c:
-
- mes "[Mitmayer]";
- mes "4. Which town has the most smiths";
- next;
- menu "Prontera",sM_3d,"Morroc",sM_3d,"Alberta",sM_3d,"Geffen",-;
-
- set @score,@score+20;
- sM_3d:
-
- mes "[Mitmayer]";
- mes "5. Which stat affect forge?";
- next;
- menu "STR",sM_3e, "DEX ",-, "AGI",sM_3e, "VIT",sM_3e;
-
- set @score,@score+20;
- sM_3e:
-
-L_Result:
- mes "[Mitmayer]";
- mes "Great work!";
- next;
- mes "[Mitmayer]";
- mes "lets see... your score is ^5533FF"+@score+"^000000 points!";
- next;
- mes "[Mitmayer]";
- if (@score > 70) goto L_Pass;
-
- mes "Failed, go study more!!";
- next;
- mes "[Mitmayer]";
- mes "It's just not enough.....";
- mes "Please return after you've studied more.";
- close;
-
- L_Pass:
- mes "Great! Congrats! You pass!";
- emotion e_no1;
- next;
- mes "[Mitmayer]";
- mes "You'll need to return to the guild. Here is proof that you passed the test.... the ^5533FFHammer of Blacksmiths^000000.";
- getitem 1005,1;
- set BSMITH_Q, 5;
- set BSMITH_Q2, 0;
- next;
- mes "[Mitmayer]";
- mes "DON'T LOOSE THIS!!";
- emotion e_gasp;
- next;
- mes "[Mitmayer]";
- mes "Well, good luck!!!!";
- close;
-}
-
-//=========================== NPC that tells you, that the Guild moved
-//=========================== She's there on kRO, but the current text is custom ^^
-geffen_in.gat,110,169,4 script Guildsman#01 726,{
- mes "[Blacksmith Guildsman]";
- mes "Welcome! We're the masters of the metal, blacksmiths!";
- mes "Our skills in creating weapons, in a way, is almost an art form!.";
- next;
- mes "[Blacksmith Guildsman]";
- mes "Our Guild was recently moved to a biger building in the steel city of Einbroch.";
- mes "If you are here to take part in your training, please go there";
- next;
- menu "What? Where? How?",-,"OK, thank you!",M_ok;
-
- mes "[Blacksmith Guildsman]";
- mes "Ah. I'm sorry. You must be unfamiliar with the new and wonderful Airship Transportation System!";
- next;
- menu "Air...what?",-,"Oh, that!",M_know;
-
- mes "[Blacksmith Guildsman]";
- mes "The Airship Transportation System!";
- mes "It's realy a wonderful thing. No more relying on stupid Magic Teleports.";
- mes "The Airship is a big flying machine that will get you to your destination in no time";
- next;
- mes "[Blacksmith Guildsman]";
- mes "Just think about it. The blue sky and white clouds. The wind in your hair.";
- mes "How I adore that feeling!";
- next;
- menu "Um.. about that guild...",-,"She's nuts! RUN!",M_run;
-
- mes "[Blacksmith Guildsman]";
- mes "Huh? Oh right. I get carried away sometimes...";
- next;
- mes "[Blacksmith Guildsman]";
- mes "There are two Airships. One is flying from Izlude to Yuno, and the other one flys throughout the whole Shwarzwald Republic.";
- mes "Thats Yuno, Hugel, Lighthalzen and Einbroch.";
- next;
-M_know:
- mes "[Blacksmith Guildsman]";
- mes "If you wish to go to Einbroch, simply board the Airship in Izlude, get of in Yuno and take the second ship until it reaches Einbroch.";
- mes "When you reach your destination just ask one of the Guides for the Blacksmith Guild";
- next;
- mes "[Blacksmith Guildsman]";
- mes "Now I know that this may be a bit confusing. That's why our guild in association with the Kafra Corporation is serving free warps to Izlude!";
- mes "Would you like to use our services?";
- next;
- menu "Yes, please.",-,"No, thank you.",M_no;
-
- mes "[Blacksmith Guildsman]";
- mes "Have a nice trip!!";
- close2;
- warp "izlude.gat",145,39;
- end;
-
-M_ok:
- mes "[Blacksmith Guildsman]";
- mes "Always at your service!";
- close;
-
-M_run:
- mes "[Blacksmith Guildsman]";
- mes "Huh? Hey! Where are you going?!";
- close;
-
-M_no:
- mes "[Blacksmith Guildsman]";
- mes "No? Don't tell me you're afraid of flying...";
- close;
+//===== eAthena Script =======================================
+//= Blacksmith Quest
+//===== By: ==================================================
+//= EREMES THE CANIVALIZER(Aegis)
+//= Translated by: yoshiki.
+//= Converted by: Komurka.
+//= Optimized and further edited by kobra_k88.
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Changed some npc names to the iRO names. Changed some variable
+//= names and labels. Edited some text.[kobra_k88]
+//= Removed "if(JobLevel > 48) goto higher". It was a left over line.
+//= Thx to "Decker".[kobra_k88]
+//= Fixed some typos, thanks to Riotblade [celest]
+//= 1.3-1.5 Added Baby Class support [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 1.7 item quantity/ids typos fix
+//= 1.8 Moved the Quest to Einbroch [Poki#3]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Merged Jfunc, changed job numbers to constants [Lupus]
+//==============================================================
+
+
+
+//<==================================================== Blacksmith Altiregen (Job changer)==================================================>\\
+ein_in01.gat,18,28,4 script Guildsman Altiregen 731,{
+ callfunc "F_BlockHigh",Job_Merchant_High,"Merchant High",Job_Whitesmith,"White Smith","Blacksmith Altiregen";
+
+ if (BaseJob == Job_Merchant) goto L_Merc;
+ mes "[Blacksmith Altiregen]";
+ mes "Welcome! We're the masters of the metal, blacksmiths!";
+ mes "Our skills in creating weapons, in a way, is almost an art form!.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Those weapons, heh, can be sold for quite a profit as well.";
+ next;
+ mes "[Blacksmith Altiregen]";
+
+ if (BaseJob == Job_Novice){
+ if(sex){
+ mes "Hmmm, you look like you wish to be a blacksmith! Sorry, but only merchants can be blacksmiths!.";
+ } else {
+ mes "...Hello little lady! If you wish to be a blacksmith, you have to be a merchant first!";
+ }
+ close;
+ }
+ if (baseClass == Job_Swordman){
+ mes "Hello! Come here to order a sword? Sorry, but I have some paperwork to do, so I can't forge anything now.";
+ close;
+ }
+ if (baseClass == Job_Acolyte){
+ mes "Oh! A Holy one...! Do me a favor and bless the sword I'm crafting!";
+ close;
+ }
+ if (baseClass == Job_Thief){
+ mes "Sorry, but this is more of a office, so there's nothing worth money. We CAN do knife forges though.";
+ close;
+ }
+ if (baseClass == Job_Mage){
+ mes "Interested in training? Our guild cannot assist magic users is such matters.";
+ close;
+ }
+ if (baseClass == Job_Archer){
+ mes "Hmmm, sorry, but we're not hiring anyone that isn't a merchent.";
+ close;
+ }
+ if (BaseJob == Job_Blacksmith){
+ mes "Hey! Been a while, running a errand for Christopher? I feel like my hammer is getting rusty after all this office work.";
+ close;
+ }
+ mes "Only Merchants can become Blacksmiths.";
+ close;
+
+L_Merc:
+ mes "[Blacksmith Altiregen]";
+ if (BSMITH_Q == 1) goto L_Test1;
+ if (BSMITH_Q == 2 || BSMITH_Q == 3) goto L_Test2and3;
+ if (BSMITH_Q == 4) goto L_Test4;
+ if (BSMITH_Q == 5) goto L_Change;
+ mes "Hello fellow merchant! Are you here to apply?";
+ mes "Write your name and your job level on this piece of paper.";
+ next;
+ menu "Apply",M_App,"What's required?",M_Req,"Not now...",M_NtNow;
+
+ M_App:
+ if(JobLevel < 40) goto sL_Lowlvl;
+ if(JobLevel == 50) goto sL_HighLvl;
+ mes "[Blacksmith Altiregen]";
+ mes "Hmmm...";
+ mes "Your job level is satisfactory.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Good, but we don't just accept anybody.";
+ mes "We'll need to test your merchant skills and your determination.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Rustle Rustle";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Hmmm, the guildsman ^5533FFGeshupenschte in Einbech^000000, is a bit short of hands.";
+ mes "Go help him, that's the first test.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Have a nice trip!";
+ set BSMITH_Q,1;
+ set JBLVL, 40;
+ close;
+
+ sL_Lowlvl:
+ mes "[Blacksmith Altiregen]";
+ mes "You need more training as a merchant. We only accept job level 40+";
+ mes "As much as I want to accept you, we have regulations. Sorry, but return later.";
+ close;
+ sL_HighLvl:
+ mes "[Blacksmith Altiregen]";
+ mes "Wow! I'm impressed! You've done a lot of training there. You know what they say, with hard work comes great rewards.";
+ emotion e_what;
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Well, first things first..... The guildsman ^5533FFGeshupenschte in Einbech^000000, is a bit short on help.";
+ mes "Go help him, that's the first test.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Have a nice trip!";
+ set BSMITH_Q,1;
+ set JBLVL, 50;
+ close;
+ M_Req:
+ mes "[Blacksmith Altiregen]";
+ mes "What is required?";
+ mes "First, be job level 40 at least.";
+ mes "And pass the test.";
+ mes "That's it. The test is a bit complicated, but passable.";
+ mes "The test involves delievering items and being quized on the special items of certain regions and then being tested on knowledge of blacksmiths.";
+ close;
+ M_NtNow:
+ mes "[Blacksmith Altiregen]";
+ mes "Alright, see you later.";
+ close;
+
+
+L_Test1:
+ mes "You didn't leave yet? I told you to go see Geshupenschte in Einbech. See you then.";
+ emotion e_what;
+ close;
+
+L_Test2and3:
+ mes "How was the work Geshupenschte gave you? He can be a pain sometimes.";
+ close;
+L_Test4:
+ if (BSMITH_Q2 == 1) goto L_NotDone;
+ mes "Congrats! You've passed Geshupenschte's tests!";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Hmm? Heh, there is one last test you know.";
+ mes "The guildsman for the last test is Mitmayer, go talk to her now.";
+ next;
+ menu "Cruel, but I'll go.",-,"......I don't wanna travel T_T",M_dontgo;
+
+ set BSMITH_Q2, 1;
+ mes "[Blacksmith Altiregen]";
+ mes "I hope you do, because the blacksmith's guild doesn't like shaming it's status by hiring idiots!";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "If such a thing happened, I can see the guild crumbling down, sob T_T";
+ mes "Well..... Go find her!";
+ close;
+ M_dontgo:
+ mes "[Blacksmith Altiregen]";
+ mes "What!? You're giving up!?!.........";
+ emotion e_what;
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "HOW DARE YOU INSULT OUR GUILD LIKE THAT!";
+ mes "Leave now! Don't you dare even DREAM about becoming a blacksmith!";
+ emotion e_omg;
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Can't endure ANYTHING can you!? How do you plan to become a blacksmith if you can't do these simple tasks!?";
+ emotion e_an;
+ close;
+
+ L_NotDone:
+ mes "Hmmm? Didn't you say you're going?";
+ mes "Sorry, but you gotta pass the test.";
+ close;
+
+L_Change:
+ if(countitem(1005) < 1) goto L_NoHam;
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Blacksmith.";
+ if(SkillPoint > 0) close;
+ mes "Whoah, I can see the fire in your eyes! You've passed!!";
+ mes "I'll grant you the power to work metals!";
+ next;
+ delitem 1005,1;
+ callfunc "Job_Change",Job_Blacksmith;
+ mes "[Blacksmith Altiregen]";
+ mes "Don't forget! We're the artists that put beauty into metal! Don't you dare forget that!";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Here's a present! Congrats on passing!";
+ if(JBLVL != 50) getitem 999,5;
+ if(JBLVL == 50) getitem 999,10;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ emotion e_no1;
+ close;
+
+ L_NoHam:
+ mes "Did you forget something? You need to show me the ^5533FFHammer of Blacksmiths^000000 to prove that you've passed all of the tests.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "You DO have it..... don't you???";
+ next;
+ menu "Oh that thing... let me just get it out of storage...",-, "Actually I sold it for pots..... now what?",sM_What;
+
+ mes "[Blacksmith Altiregen]";
+ mes "....... grrrrrrr.......";
+ emotion e_ag;
+ close;
+ sM_What:
+ mes "[Blacksmith Altiregen]";
+ mes ".......... I'll tell you what.............";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "YOU GET TO START ALL OVER!!!!";
+ set BSMITH_Q, 0;
+ set BSMITH_Q2, 0;
+ emotion e_pif;
+ close;
+}
+
+
+//<=============================================== Geshupenschte: 1st, 2nd, 3rd Test ===================================================>\\
+ein_in01.gat,201,27,4 script Geshupenschte 63,{
+
+ if(BaseJob == Job_Merchant) goto L_merchant;
+ mes "[Geshupenschte]";
+ mes "Hello sir! I'm the blacksmith. Geshupenschte! Nice to meet you!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Blacksmith is such a great job!! Don't you think so? Hahahahahahah!";
+ emotion e_heh;
+ close;
+
+L_merchant:
+ mes "[Geshupenschte]";
+ if (BSMITH_Q == 1) goto L_Test1;
+ if (BSMITH_Q == 2) goto L_Test2;
+ if (BSMITH_Q == 3) goto L_Test3;
+ if (BSMITH_Q == 4) goto L_Done;
+ if (BSMITH_Q == 5) goto L_GoChange;
+ mes "Hoho!! A merchant! Excellent! I was in need of some help!!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Of course.... I wouldn't want to bother someone as busy as yourself. Go on your way if you must!....";
+ next;
+ mes "[Geshupenschte]";
+ mes "~Dum dee dum dee dum~.....I am the best.... I am a blacksmith....(singing)";
+ next;
+ mes "[Geshupenschte]";
+ mes "What? Why are you still here?";
+ emotion e_what;
+ close;
+
+// Test 1-----------------------------------------------------------------
+L_Test1:
+ if (BSMITH_Q2 == 1) goto L_ReTest1;
+ mes "You're the one sent by the guild, right?";
+ mes "Whew, the people order so many items >_> We don't have enough people to deliever.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Well, you ARE the one sent by the guild, right?";
+ mes "Oh well, hopefully >_>";
+ next;
+ mes "[Geshupenschte]";
+ mes "See, this kid a few days ago,";
+ mes "he wasted SO much of our money.";
+ mes "Just because I sent him on a semi complicated errand >_>";
+ mes "Now, let me ask a few questions!";
+ next;
+ menu "Alright",M_Rdy,"Wait, let me go and get prepared",-;
+
+ mes "[Geshupenschte]";
+ mes "Ok, return after you're ready.";
+ mes "I'll be waiting here.";
+ close;
+ M_Rdy:
+ set @score, 0;
+ set @temp, rand(2);
+ if (@temp == 1) goto L_setq2;
+
+ L_setq1:
+ mes "[Geshupenschte]";
+ mes "1. Which town and local item don't match?";
+ next;
+ menu "Morroc - Thief Clothes",q1,"Alberta - 2 Hand Axe",q1,"Comodo - Berserk Potion",q1,"Alberta - Swordmace",-;
+
+ set @score,@score+10;
+ q1:
+
+ mes "[Geshupenschte]";
+ mes "2. What does the smith skill Hammerfall do?";
+ next;
+ menu "Stun",-,"Blind",q2,"Poison",q2,"Sleep",q2;
+
+ set @score,@score+10;
+ q2:
+
+ mes "[Geshupenschte]";
+ mes "3. What is a merchant not good at?";
+ next;
+ menu "Opening Shops",q3,"Buying Cheap",q3,"Selling High",q3,"Running Fast",-;
+
+ set @score,@score+10;
+
+ q3:
+
+ mes "[Geshupenschte]";
+ mes "4. Where do you buy Blue Gems?";
+ next;
+ menu "Alberta",q4,"Morroc",q4,"Geffen",-,"Prontera",q4;
+
+ set @score,@score+10;
+
+ q4:
+
+ mes "[Geshupenschte]";
+ mes "5. Where is the Geffen Tool Shop from the tower?";
+ next;
+ menu "8 o'clock",-,"11 o'clock",q5,"6 o'clock",q5,"5 o'clock",q5;
+
+ set @score,@score+10;
+
+ q5:
+
+ mes "[Geshupenschte]";
+ mes "6. What weapon can't be used by merchants?";
+ next;
+ menu "Stiletto",q6,"Buster",q6,"Chain",q6,"Bible",-;
+
+ set @score,@score+10;
+
+ q6:
+
+ mes "[Geshupenschte]";
+ mes "7. Which has the highest def?";
+ next;
+ menu "Panty",q7,"Mink Coat",-,"Wooden Mail",q7,"Silk Robe",q7;
+
+ set @score,@score+10;
+
+ q7:
+
+ mes "[Geshupenschte]";
+ mes "8. How many times can you upgrade a lvl 3 weapon safely?";
+ next;
+ menu "+3 ",q8,"+4 ",q8,"+5 ",-,"+6 ",q8;
+
+ set @score,@score+10;
+ q8:
+
+ mes "[Geshupenschte]";
+ mes "9. What can you make with Trunks?";
+ next;
+ menu "Sakkat",-,"Ghost Bandana",q9,"Majestic Goat",q9,"Antlers",q9;
+
+ set @score,@score+10;
+ q9:
+
+ mes "[Geshupenschte]";
+ mes "10. What is the most important to merchants!?";
+ next;
+ menu "Helpfulness",-,"Honor",-,"Money",-,"Honesty",-;
+
+ set @score,@score+10;
+
+ if (BSMITH_Q2 == 1) goto L_result2;
+ goto L_result;
+
+ L_setq2:
+ mes "[Geshupenschte]";
+ mes "1. Which town and local item is mismatched?";
+ next;
+ menu "Aldebaran - Ygg Leaf",q10,"Alberta - Hammer",q10,"Comodo - Berserk Potion",q10,"Aldebaran - Hammer",-;
+
+ set @score,@score+10;
+ q10:
+
+ mes "[Geshupenschte]";
+ mes "2. How much does Jellopy sell for?";
+ next;
+ menu "1z",q11,"2z",q11,"3z",-,"4z",q11;
+
+ set @score,@score+10;
+ q11:
+
+ mes "[Geshupenschte]";
+ mes "3. What's necessary to make a shop?";
+ next;
+ menu "Must have cart",-,"Item to sell",q12,"Have weapon equiped",q12,"Wear Armor",q12;
+
+ set @score,@score+10;
+ q12:
+
+ mes "[Geshupenschte]";
+ mes "4. Where is the merchant guild located?";
+ next;
+ menu "Alberta",-,"Morroc",q13,"Geffen",q13,"Prontera",q13;
+
+ set @score,@score+10;
+ q13:
+
+ mes "[Geshupenschte]";
+ mes "5. Where is the Morroc Weapon Shop from the center?";
+ next;
+ menu "7 o'clock",q14,"11 o'clock",q14,"6 o'clock",q14,"5 o'clock",-;
+
+ set @score,@score+10;
+ q14:
+
+ mes "[Geshupenschte]";
+ mes "6. What can't a merchant equip?";
+ next;
+ menu "Main Gauche",q15,"Claymore",-,"Chain",q15,"2 hand axe",q15;
+
+ set @score,@score+10;
+ q15:
+
+ mes "[Geshupenschte]";
+ mes "7. What has the highest defense?";
+ next;
+ menu "Panty",q16,"Mink Coat",-,"Wooden Mail",q16,"Silk Robe",q16;
+
+ set @score,@score+10;
+ q16:
+
+ mes "[Geshupenschte]";
+ mes "8. How many times can you safely upgrade a lvl 4 weapon?";
+ next;
+ menu "+3 ",q17,"+4",-,"+5",q17,"+6",q17;
+
+ set @score,@score+10;
+ q17:
+
+ mes "[Geshupenschte]";
+ mes "9. Which monster doesn't drop iron ore?";
+ next;
+ menu "Chonchon",q18,"Steel Chonchon",q18,"Zerom",q18,"Anolian",-;
+
+ set @score,@score+10;
+ q18:
+
+ mes "[Geshupenschte]";
+ mes "10. What is the most important to merchants?!";
+ next;
+ menu "Honesty",-,"Helpfulness",-,"Money",-,"Posture",-;
+
+ set @score,@score+10;
+
+ if (BSMITH_Q2 == 1) goto L_result2;
+ goto L_result;
+
+L_result:
+ mes "[Geshupenschte]";
+ mes "Good!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Lets see....your score is ^5533FF"+@score+".^000000";
+ if (@score == 100) goto L_perfect;
+ mes ".............";
+ next;
+ mes "[Geshupenschte]";
+ mes "Sorry friend, I don't want to give you the job.";
+ mes "You need just a bit more knowledge. Go study some more";
+ set BSMITH_Q2, 1;
+ close;
+
+ L_perfect:
+ set BSMITH_Q,2;
+ set BSMITH_Q2, 0;
+ mes "Perfect!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Then you definatly can do the errand!";
+ mes "Are you prepared?";
+ close;
+L_result2:
+ mes "[Geshupenschte]";
+ mes "Great!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Lets see....your score is ^5533FF"+@score+".^000000";
+ if (@score > 80) goto L_pass;
+ mes ".............";
+ next;
+ mes "[Geshupenschte]";
+ mes "You've missed again!";
+ mes "If you keep missing, I can't give you the job. Go study more.";
+ set BSMITH_Q2, 1;
+ close;
+
+ L_pass:
+ set BSMITH_Q,2;
+ set BSMITH_Q2, 0;
+ mes "You Passed!";
+ next;
+ mes "[Geshupenschte]";
+ mes "I'll let you do the job";
+ mes "Are you prepared?";
+ close;
+L_ReTest1:
+ mes "Ah, I see you've studied more. Don't miss any questions! Here we go!";
+ next;
+ goto M_Rdy;
+
+
+// Test 2-----------------------------------------------------------------
+L_Test2:
+ if(BSMITH_Q2 > 0) goto L_CheckTest2;
+ mes "Let's see... orders....";
+ next;
+ mes "[Geshupenschte]";
+ mes "Ah, here it is!";
+ mes "Here's the order that's almost due";
+ mes "Hmmm";
+ next;
+ mes "[Geshupenschte]";
+ mes "I need you to get me....";
+ next;
+ set BSMITH_Q2,rand(1,5);
+ if (BSMITH_Q2 == 2) goto R_item2;
+ if (BSMITH_Q2 == 3) goto R_item3;
+ if (BSMITH_Q2 == 4) goto R_item4;
+ if (BSMITH_Q2 == 5) goto R_item5;
+
+ R_item1:
+ mes "[Geshupenschte]";
+ mes "^5533FF2 Steel";
+ mes "1 Rotten Bandage";
+ mes "2 Blue Gemstone^000000";
+ mes "and ^5533FF1 Arc Wand^000000 from the store.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Hey, we're not making you bring these because we're cheap! It's a test!";
+ next;
+ mes "[Geshupenschte]";
+ mes "^5533FF2 Steel";
+ mes "1 Rotten Bandage";
+ mes "2 Blue Gemstone^000000";
+ mes "and ^5533FF1 Arc Wand^000000 from the store.";
+ next;
+ goto L_finalword;
+ R_item2:
+ mes "[Geshupenschte]";
+ mes "^5533FF2 Star Dust";
+ mes "2 Skel Bones";
+ mes "1 Zargons^000000";
+ mes "and ^5533FF1 Gladius^000000 from the stores.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Hey! We're not being cheap, this is a test!";
+ next;
+ mes "[Geshupenschte]";
+ mes "I'll list them again";
+ mes "^5533FF2 Star Dust";
+ mes "2 Skel Bones";
+ mes "1 Zargons^000000";
+ mes "and ^5533FF1 Gladius^000000 from the stores.";
+ next;
+ goto L_finalword;
+ R_item3:
+ mes "[Geshupenschte]";
+ mes "^5533FF2 Coals";
+ mes "2 Shells";
+ mes "2 Red Bloods^000000";
+ mes "and ^5533FF1 Tsurugi^000000 from the stores.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Hey! We're not being cheap, this is a test!";
+ next;
+ mes "[Geshupenschte]";
+ mes "I'll list them again";
+ mes "^5533FF2 Coals";
+ mes "2 Shells";
+ mes "2 Red Bloods^000000";
+ mes "and ^5533FF1 Tsurugi^000000 from the stores.";
+ next;
+ goto L_finalword;
+ R_item4:
+ mes "[Geshupenschte]";
+ mes "^5533FF8 Iron Ores";
+ mes "1 Trunk";
+ mes "2 Blue Gems^000000";
+ mes "And a ^5533FFArbalest^000000 from the stores.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Hey! We're not being cheap!";
+ next;
+ mes "[Geshupenschte]";
+ mes "I'll list them again.";
+ mes "^5533FF8 Iron Ores";
+ mes "1 Trunk";
+ mes "2 Blue Gems^000000";
+ mes "And a ^5533FFArbalest^000000 from the stores.";
+ next;
+ goto L_finalword;
+ R_item5:
+ mes "[Geshupenschte]";
+ mes "^5533FF8 Iron Ores";
+ mes "20 Green Herbs";
+ mes "2 Animal Skin^000000";
+ mes "and ^5533FF1 Morning Star^000000 from the stores.";
+ next;
+ mes "[Geshupenschte]";
+ mes "Hey! We're not being cheap! It's a test!";
+ next;
+ mes "[Geshupenschte]";
+ mes "I'll list them again.";
+ mes "^5533FF8 Iron Ores";
+ mes "20 Green Herbs";
+ mes "2 Animal Skin^000000";
+ mes "and ^5533FF1 Morning Star^000000 from the stores.";
+ next;
+ L_finalword:
+ mes "[Geshupenschte]";
+ mes "Good luck!";
+ close;
+
+L_CheckTest2:
+ mes "Hmm? Did you bring all the items?";
+ next;
+ if (BSMITH_Q2 == 2) goto L_2b;
+ if (BSMITH_Q2 == 3) goto L_2c;
+ if (BSMITH_Q2 == 4) goto L_2d;
+ if (BSMITH_Q2 == 5) goto L_2e;
+
+ L_2a:
+ if(countitem(999) < 2 || countitem(930) < 1 || countitem(717) < 2 || countitem(1610) < 1) goto sL_NtEnuf1;
+ mes "[Geshupenschte]";
+ mes "Didn't I ask for 3 steels?";
+ next;
+ mes "[Geshupenschte]";
+ mes "Oh yea! I did ask for 2.";
+ mes "Gimme a sec.";
+ delitem 999,2;
+ delitem 930,1;
+ delitem 717,2;
+ delitem 1610,1;
+ callsub sF_Make;
+ mes "Deliever this to Geffen's Baisulitst and bring back the reciept.";
+ getitem 1610,1;
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT!? Nothing looks different?";
+ mes "Look carefully where my hand is.";
+ mes "See the emphesized groove!?";
+ mes "ITS THE SUPER Geshupenschte ARC WAND MK II!!!!! XDDDDD";
+ next;
+ mes "[Geshupenschte]";
+ mes "Feel the difference! Almost no inertia!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Now, go deliever to Baisulitst!";
+ close;
+
+ sL_NtEnuf1:
+ mes "[Geshupenschte]";
+ mes "You didn't bring all the items!";
+ next;
+ goto R_item1;
+ L_2b:
+ if(countitem(1001) < 2 || countitem(932) < 2 || countitem(912) < 1 || countitem(1219) < 1) goto sL_NtEnuf2;
+ mes "[Geshupenschte]";
+ mes "Didn't I ask for 3 Star Dusts?";
+ next;
+ mes "[Geshupenschte]";
+ mes "Oh yea, 2, that's right.";
+ mes "Okay, gimme a sec.";
+ delitem 1001,2;
+ delitem 932,2;
+ delitem 912,1;
+ delitem 1219,1;
+ callsub sF_Make;
+ mes "Now, take this to Morroc's Wickebine";
+ getitem 1219,1;
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT!? IT DOESN'T LOOK ANY DIFFERENT!?";
+ mes "Look carefully at the blade!";
+ mes "CAN YOU NOT SEE THE BEAUTIFUL MARKINGS?!";
+ mes "ULTRA GLADIUS Geshupenschte Mk II!!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Isnt it so pretty ^_^";
+ next;
+ mes "[Geshupenschte]";
+ mes "Well, go to Morroc and give it the Wickebine and bring the receipt back.";
+ close;
+
+ sL_NtEnuf2:
+ mes "[Geshupenschte]";
+ mes "You didn't bring all the items!";
+ next;
+ goto R_item2;
+ L_2c:
+ if(countitem(1003) < 2 || countitem(935) < 2 || countitem(990) < 1 || countitem(1119) < 1) goto sL_NtEnuf3;
+ mes "[Geshupenschte]";
+ mes "Didn't I ask for 3 coals??";
+ next;
+ mes "[Geshupenschte]";
+ mes "That's right, 2 coals";
+ mes "Okay, wait a sec.";
+ delitem 1003,2;
+ delitem 935,2;
+ delitem 990,1;
+ delitem 1119,1;
+ callsub sF_Make;
+ mes "Give this to Izlude's Gromgast and bring back the receipt.";
+ getitem 1119,1;
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
+ mes "Look carefully at the blade!";
+ mes "Look at the beautiful markings!";
+ mes "ULTRA Geshupenschte TSURUGI Mk II!!!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Isn't it so pretty ^_^";
+ next;
+ mes "[Geshupenschte]";
+ mes "Anyways, Izlude's Gromgast! Go!";
+ close;
+
+ sL_NtEnuf3:
+ mes "[Geshupenschte]";
+ mes "You didn't bring all the items!";
+ next;
+ goto R_item3;
+
+ L_2d:
+ if(countitem(1002) < 8 || countitem(1019) < 1 || countitem(717) < 2 || countitem(1713) < 1) goto sL_NtEnuf4;
+ mes "[Geshupenschte]";
+ mes "Didn't I ask for 30 iron ores?";
+ next;
+ mes "[Geshupenschte]";
+ mes "Wait, 8 is right >_>";
+ mes "Hmmm, wait a sec then.";
+ delitem 1002,8;
+ delitem 1019,1;
+ delitem 717,2;
+ delitem 1713,1;
+ callsub sF_Make;
+ mes "Deliever this to Payon's Tilpitz";
+ getitem 1713,1;
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
+ mes "LOOK AT THE GROOVES WHERE THE ARROWS GO!!";
+ mes "LOOK HOW CUSTOMIZED IT IS!!!!!";
+ mes "Geshupenschte'S MASTER ARCHER ARBALEST Mk II!!!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Look how well built the bow is!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Well, Tilpitz in Payon, and bring the envelop.";
+ close;
+
+ sL_NtEnuf4:
+ mes "[Geshupenschte]";
+ mes "You didn't bring all the items!";
+ next;
+ goto R_item4;
+
+ L_2e:
+ if(countitem(1002) < 8 || countitem(511) < 20 || countitem(919) < 2 || countitem(1513) < 1) goto sL_NtEnuf5;
+ mes "[Geshupenschte]";
+ mes "Didn't I ask for 40 ores?";
+ next;
+ mes "[Geshupenschte]";
+ mes "Wait, 8! That's right!";
+ mes "Okay, wait a sec!";
+ delitem 1002,8;
+ delitem 511,20;
+ delitem 919,2;
+ delitem 1513,1;
+ callsub sF_Make;
+ mes "Take this to Bismarck in Comodo and bring me the receipt.";
+ getitem 1513,1;
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT!? NOTHING LOOKS DIFFERENT!?";
+ mes "Look carefully at the tips of the spikes!!";
+ mes "The green herbs' antidote for poisons have been mixed in!";
+ mes "ANTI POISON Geshupenschte MORNING STAR MK II!!!!!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Don't you get it!? When you're poisoned, you stab yourself with it!";
+ mes "The wound.....probably will get bigger! But the poison will be gone!";
+ next;
+ mes "[Geshupenschte]";
+ mes "Well, take this to Bismarck of Comodo!";
+ close;
+
+ sL_NtEnuf5:
+ mes "[Geshupenschte]";
+ mes "You didn't bring all the items!";
+ next;
+ goto R_item5;
+
+ sF_Make:
+ set BSMITH_Q, 3;
+ next;
+ mes "[Geshupenschte]";
+ mes "Grunt.......";
+ next;
+ mes "~clank~clonk~clank~";
+ next;
+ mes "[Geshupenschte]";
+ mes "Ergh......";
+ next;
+ mes "~bonk~bang~bonk~";
+ next;
+ mes "[Geshupenschte]";
+ mes "Whew. There we go!";
+ return;
+
+
+// Test 3-----------------------------------------------------------------
+L_Test3:
+ if (BSMITH_Q3 == 1) goto L_CheckTest3;
+ mes "Go deliever!";
+ mes "........you didn't forget.......right?";
+ next;
+ mes "[Geshupenschte]";
+ if (BSMITH_Q2 == 2) goto L_3b;
+ if (BSMITH_Q2 == 3) goto L_3c;
+ if (BSMITH_Q2 == 4) goto L_3d;
+ if (BSMITH_Q2 == 5) goto L_3e;
+
+ L_3a:
+ if (countitem(1610) < 1) goto L_LostItem;
+ mes "Baisulitst should be at 11 o'clock of Geffen ";
+ close;
+ L_3b:
+ if (countitem(1219) < 1) goto L_LostItem;
+ mes "Take it to Wickebine near the Sword Mace dealer in Morroc.";
+ close;
+ L_3c:
+ if (countitem(1119) < 1) goto L_LostItem;
+ mes "Gromgast hangs out at 11 o'clock of Izlude.";
+ close;
+ L_3d:
+ if (countitem(1713) < 1) goto L_LostItem;
+ mes "Tilpitz hangs out at 5 o'clock of Payon";
+ close;
+ L_3e:
+ if (countitem(1513) < 1) goto L_LostItem;
+ mes "Bismarck is usually at 12 o'clock area of Comodo.";
+ close;
+
+ L_LostItem:
+ mes "WHAT!!! YOU LOST THE ITEM I GAVE YOU TO DELIVER!!!!";
+ emotion e_omg;
+ next;
+ mes "[Geshupenschte]";
+ mes "........... Well then.... I gues you'll just have too.....";
+ next;
+ mes "[Geshupenschte]";
+ mes "START ALL OVER!! Now get out of my sight!!";
+ set BSMITH_Q, 0;
+ set BSMITH_Q2, 0;
+ emotion e_ag;
+ close;
+
+L_CheckTest3:
+ mes "Did you deliever it?";
+ mes "Lets see the receipt then!";
+ next;
+ menu "Here you go",-,"Wait a second.",M_Wait;
+
+ if(countitem(1073) < 1) goto sL_noreceipt;
+ mes "[Geshupenschte]";
+ mes "Great! Very good! You're definalty a honest merchant! Go see Altiregen back in Einbroch!";
+ mes "I know you'll definately pass the test!!!";
+ set BSMITH_Q, 4;
+ set BSMITH_Q2, 0;
+ set BSMITH_Q3, 0;
+ delitem 1073,1;
+ close;
+
+ sL_noreceipt:
+ mes "[Geshupenschte]";
+ mes "........You don't know where you left the receipt.........";
+ next;
+ mes "[Geshupenschte]";
+ mes "WHAT'S THIS?! YOU LOST IT!? DId you SELL it or something!?";
+ emotion e_omg;
+ next;
+ mes "[Geshupenschte]";
+ mes "The receipt is the soul of merchants! The life line of blacksmiths!";
+ mes "Guess what? You get to..... START ALL OVER!!";
+ set BSMITH_Q, 0;
+ set BSMITH_Q2, 0;
+ set BSMITH_Q3, 0;
+ emotion e_pif;
+ close;
+ M_Wait:
+ mes "[Geshupenschte]";
+ mes "Well, tell me if you find the receipt. I HOPE you got one.";
+ close;
+
+L_Done:
+ mes "Thanks for working for me! Now go see Altiregen!";
+ close;
+
+L_GoChange:
+ mes "There should be nothing you want now.........";
+ mes "Maybe you're thinking of Einbroch?";
+ close;
+}
+
+
+// Delivery Recipients ==================================================>\\
+// Baisulitst -----------------------------------------------------------
+geffen.gat,46,164,4 script Baisulitst 69,{
+ if (BSMITH_Q==3) goto L_Start;
+
+ mes "[Baisulitst]";
+ mes "Now that I think about it, it's been a while since I've been to Alberta. I'm a little upset with the service I've been getting, especially the late deliveries......";
+ next;
+ mes "[Baisulitst]";
+ mes "I ordered something from the Geffen Blacksmith Guild but the order got transfered to a blacksmith in Alberta.....";
+ next;
+ mes "[Baisulitst]";
+ mes "Hmmm....., I wonder when I will recieve my special order ^5555FFArc Wand^000000.....";
+ emotion e_hmm;
+ close;
+
+L_Start:
+ if(BSMITH_Q2 != 1) goto L_Wrong;
+ if(countitem(1073) == 1) goto L_Done;
+ if(countitem(1610) < 1) goto L_NoItem;
+ mes "[Baisulitst]";
+ mes "Wow! Is it finally here?!";
+ mes "Thank you! I was waiting forever!";
+ delitem 1610,1;
+ set BSMITH_Q3, 1;
+ next;
+ mes "[Baisulitst]";
+ mes "I ordered this from the Geffen BS Guild, but they assigned it to the smith in Alberta!";
+ next;
+ mes "[Baisulitst]";
+ mes "Thanks for coming from so far away!";
+ mes "Also, make sure to hit Geshupenschte one for me! How could anything be so late >_>";
+ next;
+ mes "[Baisulitst]";
+ mes "Here's the receipt!";
+ next;
+ mes "~Scribble, Scribble~ Rip ~";
+ next;
+ getitem 1073,1;
+ mes "[Baisulitst]";
+ mes "Here you go! Good bye! Thank you for the delivery!";
+ close;
+
+ L_NoItem:
+ mes "[Baisulitst]";
+ mes "..... Hmm?.... What's this?..... You here to deliver something to me but you don't have the actual item??";
+ emotion e_pif;
+ L_Wrong:
+ mes "[Baisulitst]";
+ mes "..... Hmm?.... What's this?..... This is not what I ordered.....";
+ emotion e_pif;
+ L_Done:
+ mes "[Baisulitst]";
+ mes "Thanks again for the delivery. I really appreciate it!";
+ close;
+}
+
+// Wickebine --------------------------------------------------------------------
+morocc.gat,27,112,4 script Wickebine 725,{
+ if (BSMITH_Q == 3) goto L_Start;
+
+ mes "[Wickebine]";
+ mes "..........";
+ mes ".....When will my order be here?";
+ emotion e_hmm;
+ next;
+ mes "[Wickebine]";
+ mes "The Geffen Blacksmith Guild and Geshupenschte are both CHRONICALLY LATE!";
+ emotion e_pif;
+ next;
+ mes "[Wickebine]";
+ mes "This is very upsetting......";
+ close;
+L_Start:
+ if(BSMITH_Q2 != 2) goto L_Wrong;
+ if(countitem(1073) == 1) goto L_Done;
+ if(countitem(1219) < 1) goto L_NoItem;
+ mes "[Wickebine]";
+ mes "Is it finally here!?!";
+ mes "Give it!!!!";
+ delitem 1219,1;
+ set BSMITH_Q3, 1;
+ next;
+ mes "[Wickebine]";
+ mes "Tell the BS guild";
+ mes "and your teacher Geshupenschte!";
+ next;
+ mes "[Wickebine]";
+ mes "You're LATE";
+ mes "and I was WAITING.";
+ next;
+ mes "[Wickebine]";
+ mes "But the item seems pretty high quality.";
+ next;
+ mes "(Writes something down)";
+ next;
+ getitem 1073,1;
+ mes "[Wickebine]";
+ mes "Here's the receipt and thanks for the delivery.";
+ close;
+
+ L_NoItem:
+ mes "[Wickebine]";
+ mes "Ung! You came all this way to deliver my item and you lost it??!!";
+ emotion e_an;
+ close;
+ L_Wrong:
+ mes "[Wickebine]";
+ mes "I think you're supposed to deliver this somewhere else.....";
+ emotion e_swt;
+ close;
+ L_Done:
+ mes "[Wickebine]";
+ mes "Thank you";
+ close;
+}
+
+// Gromgast ---------------------------------------------------------------------
+izlude.gat,69,181,4 script Gromgast 734,{
+ if (BSMITH_Q == 3) goto L_Start;
+
+ mes "[Gromgast]";
+ mes "..........";
+ mes ".....When will that sword arrive >_>";
+ next;
+ mes "[Gromgast]";
+ mes "I need that sword for my training!";
+ mes "Nooo.....I must not get rusty!";
+ next;
+ mes "[Gromgast]";
+ mes "Noooooooo T_T......";
+ close;
+
+L_Start:
+ if(BSMITH_Q2 != 3) goto L_Wrong;
+ if(countitem(1073) == 1) goto L_Done;
+ if(countitem(1119) < 1) goto L_NoItem;
+ mes "[Gromgast]";
+ mes "Ahhh, it's finally here";
+ mes "Let me see it.";
+ delitem 1119,1;
+ set BSMITH_Q3, 1;
+ next;
+ mes "[Gromgast]";
+ mes "Nice.....";
+ mes "It's better then I expected.";
+ next;
+ mes "[Gromgast]";
+ mes "I think this sword is exactly what I need!!";
+ mes "I like it!";
+ next;
+ mes "[Gromgast]";
+ mes "Here you go.";
+ next;
+ mes "~scribble~rip~";
+ next;
+ getitem 1073,1;
+ mes "[Gromgast]";
+ mes "Here's the receipt! Thank you.";
+ close;
+
+ L_NoItem:
+ mes "[Gromgast]";
+ mes "Hmm... I don't understand.... where is the item I ordered???....";
+ emotion e_hmm;
+ L_Wrong:
+ mes "[Gromgast]";
+ mes "Sorry, but you've got the wrong person.";
+ close;
+ L_Done:
+ mes "[Gromgast]";
+ mes "Thanks for the delivery!";
+ close;
+}
+
+// Tilpitz --------------------------------------------------------------------
+payon.gat,214,79,4 script Tilpitz 59,{
+ if (BSMITH_Q == 3) goto L_Start;
+
+ mes "[Tilpitz]";
+ mes "When's that bow coming..........";
+ mes "How long ago did I order this thing >_>";
+ next;
+ mes "[Tilpitz]";
+ mes "There's no one that can make it execpt 'him'.........";
+ mes "but, WHEN WILL IT COME >_>";
+ next;
+ mes "[Tilpitz]";
+ mes " T_T ";
+ close;
+L_Start:
+ if(BSMITH_Q2 != 4) goto L_Wrong;
+ if(countitem(1073) == 1) goto L_Done;
+ if(countitem(1713) < 1) goto L_NoItem;
+ mes "[Tilpitz]";
+ mes ".......Ohhh! It's finally here!!!";
+ mes "Let me see it!";
+ delitem 1713,1;
+ set BSMITH_Q3, 1;
+ next;
+ mes "[Tilpitz]";
+ mes "Wow....";
+ mes "Not bad......not bad at all!!";
+ next;
+ mes "[Tilpitz]";
+ mes "Look at this curve!! It's wonderful!!";
+ mes "Oh, I love this";
+ next;
+ mes "[Tilpitz]";
+ mes "Thank you!!!";
+ next;
+ mes "scribble scribble rip";
+ next;
+ getitem 1073,1;
+ mes "[Tilpitz]";
+ mes "Here's the receipt! Thank you again!!!!!";
+ close;
+
+ L_NoItem:
+ mes "[Tilpitz]";
+ mes "Oooh! The delivery is here? What?..... You don't have anything???.....";
+ emotion e_what;
+ next;
+ mes "[Tilpitz]";
+ mes "Don't play bad jokes on people!";
+ emotion e_ag;
+ close;
+ L_Wrong:
+ mes "[Tilpitz]";
+ mes "What's this? You have a delivery.... for someone else..... Then why not deliver it to that person instead???........";
+ emotion e_swt;
+ close;
+ L_Done:
+ mes "[Tilpitz]";
+ mes "More I look at it, more beautiful it gets!!! ";
+ close;
+}
+
+// Bismarck ---------------------------------------------------------------------------
+comodo.gat,158,342,4 script Bismarck 118,{
+ if (BSMITH_Q == 3) goto L_Start;
+
+ mes "[Bismarck]";
+ mes "......Ugh?...";
+ mes ".....When's that delivery coming......";
+ next;
+ mes "[Bismarck]";
+ mes "....the.....p...poison...... >_>....";
+ mes "Ack.....";
+ next;
+ mes "[Bismarck]";
+ mes "....Looks like... I'm....screwed.";
+ close;
+
+L_Start:
+ if(BSMITH_Q2 != 5) goto L_Wrong;
+ if(countitem(1073) == 1) goto L_Done;
+ if(countitem(1513) < 1) goto L_NoItem;
+ mes "[Bismarck]";
+ mes "Ugh.........finally...........";
+ mes "Pant pant..........give it to me~";
+ delitem 1513,1;
+ set BSMITH_Q3, 1;
+ next;
+ mes "[Bismarck]";
+ mes "Ugh....";
+ mes "The green herb is in it........right?";
+ next;
+ mes "[Bismarck]";
+ mes "I........can't move.........help me up";
+ mes "....grunt.....";
+ next;
+ mes "- STAB! -";
+ next;
+ mes "[Bismarck]";
+ mes "AAAAAAAAAAACCCCCCCCCKKKKKK!!!";
+ next;
+ mes "[Bismarck]";
+ mes "whew, that works pretty well..";
+ next;
+ getitem 1073,1;
+ mes "[Bismarck]";
+ mes "Cough.... Here's the receipt..... thank you for the delivery! I guess I get to live longer......";
+ close;
+
+ L_NoItem:
+ mes "[Bismarck]";
+ mes "ARE YOU TRYING TO TOY WITH ME!!?? How.... ~cough~... could....~ung~.... you....~ack~.....";
+ emotion e_omg;
+ close;
+ L_Wrong:
+ mes "[Bismarck]";
+ mes "I NEED AN ANTIDOTE DAMMIT!! Not this stuff ~ack~........";
+ emotion e_omg;
+ close;
+ L_Done:
+ mes "[Bismarck]";
+ mes "Whew, thank you.";
+ close;
+}
+
+
+
+//<===================================================== Mitehmaeeuh: Last Test ===================================================>\\
+ein_in01.gat,24,41,4 script Mitmayer 726,{
+ if (BSMITH_Q == 4) goto L_Start;
+ if (BSMITH_Q == 5) goto L_Done;
+ mes "[Mitmayer]";
+ mes "Whew.... the sun in Morroc is just too strong.... I guess it will gie me tougher skin... Oh well......";
+ emotion e_swt2;
+ next;
+ mes "[Mitmayer]";
+ mes "Afteralll, we Blacksmiths are used to high temperatures since we work with fire everyday!";
+ next;
+ mes "[Mitmayer]";
+ mes "Getting nice and tan isn't so bad..... I think it gives you a healthy athletic look.";
+ close;
+L_Done:
+ mes "[Mitmayer]";
+ mes "I told you that you've passed.";
+ next;
+ mes "[Mitmayer]";
+ mes "Return to the guild";
+ next;
+ mes "[Mitmayer]";
+ mes "Also, don't lose the Hammer of Blacksmiths!!";
+ next;
+ mes "[Mitmayer]";
+ mes "Don't forget to use the skill points too!";
+ close;
+L_Start:
+ mes "[Mitmayer]";
+ mes "Welcome! You want to be a smith?";
+ mes "Okay, but know that not everyody passes.";
+ next;
+ mes "[Mitmayer]";
+ mes "It's a quiz about how well you know metals and the blacksmith class.";
+ mes "I have quite a bit to ask, so lets start";
+ next;
+ menu "Ok",M_Test,"Not now",-;
+
+ mes "[Mitmayer]";
+ mes "Okay, I'll see you then.";
+ close;
+ M_Test:
+ mes "[Mitmayer]";
+ mes "Okay, lets start You'll fail if you don't get enough right.";
+ next;
+ mes "[Mitmayer]";
+ mes "5 questions";
+ mes "I won't tell you what's right or wrong.";
+ next;
+ set @score, 0;
+ set @temp, rand(3);
+ if (@temp == 1) goto R_Set2;
+ if (@temp == 2) goto R_Set3;
+
+ R_Set1:
+ mes "[Mitmayer]";
+ mes "1. Which skill is needed for discount?";
+ next;
+ menu "Pushcart Lv 3",sM_1a,"Item Appraisal",sM_1a,"Mammonite Lv 10",sM_1a,"Enlarge Weight Lv 3",-;
+
+ set @score,@score+20;
+ sM_1a:
+
+ mes "[Mittmayer]";
+ mes "2. What effect does hammerfall have?";
+ next;
+ menu "Stun",-,"Blind",sM_1b,"Confuse",sM_1b,"Poison",sM_1b;
+
+ set @score,@score+20;
+ sM_1b:
+
+ mes "[Mitmayer]";
+ mes "3. How much zeny is taken when Mammonite 10 is used?";
+ next;
+ menu "900z",sM_1c,"1,000z",-,"2,000z",sM_1c,"1,000,000z",sM_1c;
+
+ set @score,@score+20;
+ sM_1c:
+
+ mes "[Mitmayer]";
+ mes "4. How much money is saved with max discount??";
+ next;
+ menu "21 % ",sM_1d,"22 % ",sM_1d,"23 % ",sM_1d,"24 % ",-;
+
+ set @score,@score+20;
+ sM_1d:
+
+ mes "[Mitmayer]";
+ mes "5. How much can you earn with max overcharge?";
+ next;
+ menu "21 % ",sM_1e,"22 % ",sM_1e,"23 % ",sM_1e,"24 % ",-;
+
+ set @score,@score+20;
+ sM_1e:
+ goto L_Result;
+
+ R_Set2:
+ mes "[Mittmayer]";
+ mes "1. Which monster drops steel?";
+ next;
+ menu "Zerom",sM_2a,"Steel Chonchon",sM_2a,"Skel Worker",-,"Requiem",sM_2a;
+
+ set @score,@score+20;
+ sM_2a:
+
+ mes "[Mitmayer]";
+ mes "2. What can you make with Red Bloods?";
+ next;
+ menu "Flame Heart",-,"Rough Wind",sM_2b,"Great Nature",sM_2b,"Mystic Frozen",sM_2b;
+
+ set @score,@score+20;
+ sM_2b:
+
+ mes "[Mitmayer]";
+ mes "3. Which ore do you have the most of in storage?";
+ next;
+ menu "WoV",sM_2c,"Red Blood",-,"Green Live",-,"Crystal Blue",-;
+
+ set @score,@score+20;
+ sM_2c:
+
+ mes "[Mitmayer]";
+ mes "4. What kind of monsters are weak against wind weapons?";
+ next;
+ menu "Fire",sM_2d,"Water",-,"Earth",sM_2d,"Wind",sM_2d;
+
+ set @score,@score+20;
+ sM_2d:
+
+ mes "[Mitmayer]";
+ mes "5. How many irons are needed to make steel?";
+ next;
+ menu "5",-,"4",sM_2e,"3",sM_2e,"6",sM_2e;
+
+ set @score,@score+20;
+ sM_2e:
+ goto L_Result;
+
+ R_Set3:
+ mes "[Mitmayer]";
+ mes "1. What do you do when you find a person in distress?";
+ next;
+ menu "Ask what they need",-,"Talk for a bit",-,"Ignore",sM_3a,"Drop item and leave",sM_3a;
+
+ set @score,@score+20;
+ sM_3a:
+
+ mes "[Mitmayer]";
+ mes "2. Where do you learn change cart?";
+ next;
+ menu "Aldebaran",sM_3b,"Alberta",-,"Morroc",sM_3b,"Izlude",sM_3b;
+
+ set @score,@score+20;
+ sM_3b:
+
+ mes "[Mitmayer]";
+ mes "3. Geffen tower is the center, where is the BS guild?";
+ next;
+ menu "11oclock",sM_3c,"5oclock",-,"7oclock",sM_3c,"12oclock",sM_3c;
+
+ set @score,@score+20;
+ sM_3c:
+
+ mes "[Mitmayer]";
+ mes "4. Which town has the most smiths";
+ next;
+ menu "Prontera",sM_3d,"Morroc",sM_3d,"Alberta",sM_3d,"Geffen",-;
+
+ set @score,@score+20;
+ sM_3d:
+
+ mes "[Mitmayer]";
+ mes "5. Which stat affect forge?";
+ next;
+ menu "STR",sM_3e, "DEX ",-, "AGI",sM_3e, "VIT",sM_3e;
+
+ set @score,@score+20;
+ sM_3e:
+
+L_Result:
+ mes "[Mitmayer]";
+ mes "Great work!";
+ next;
+ mes "[Mitmayer]";
+ mes "lets see... your score is ^5533FF"+@score+"^000000 points!";
+ next;
+ mes "[Mitmayer]";
+ if (@score > 70) goto L_Pass;
+
+ mes "Failed, go study more!!";
+ next;
+ mes "[Mitmayer]";
+ mes "It's just not enough.....";
+ mes "Please return after you've studied more.";
+ close;
+
+ L_Pass:
+ mes "Great! Congrats! You pass!";
+ emotion e_no1;
+ next;
+ mes "[Mitmayer]";
+ mes "You'll need to return to the guild. Here is proof that you passed the test.... the ^5533FFHammer of Blacksmiths^000000.";
+ getitem 1005,1;
+ set BSMITH_Q, 5;
+ set BSMITH_Q2, 0;
+ next;
+ mes "[Mitmayer]";
+ mes "DON'T LOOSE THIS!!";
+ emotion e_gasp;
+ next;
+ mes "[Mitmayer]";
+ mes "Well, good luck!!!!";
+ close;
+}
+
+//=========================== NPC that tells you, that the Guild moved
+//=========================== She's there on kRO, but the current text is custom ^^
+geffen_in.gat,110,169,4 script Guildsman#01 726,{
+ mes "[Blacksmith Guildsman]";
+ mes "Welcome! We're the masters of the metal, blacksmiths!";
+ mes "Our skills in creating weapons, in a way, is almost an art form!.";
+ next;
+ mes "[Blacksmith Guildsman]";
+ mes "Our Guild was recently moved to a biger building in the steel city of Einbroch.";
+ mes "If you are here to take part in your training, please go there";
+ next;
+ menu "What? Where? How?",-,"OK, thank you!",M_ok;
+
+ mes "[Blacksmith Guildsman]";
+ mes "Ah. I'm sorry. You must be unfamiliar with the new and wonderful Airship Transportation System!";
+ next;
+ menu "Air...what?",-,"Oh, that!",M_know;
+
+ mes "[Blacksmith Guildsman]";
+ mes "The Airship Transportation System!";
+ mes "It's realy a wonderful thing. No more relying on stupid Magic Teleports.";
+ mes "The Airship is a big flying machine that will get you to your destination in no time";
+ next;
+ mes "[Blacksmith Guildsman]";
+ mes "Just think about it. The blue sky and white clouds. The wind in your hair.";
+ mes "How I adore that feeling!";
+ next;
+ menu "Um.. about that guild...",-,"She's nuts! RUN!",M_run;
+
+ mes "[Blacksmith Guildsman]";
+ mes "Huh? Oh right. I get carried away sometimes...";
+ next;
+ mes "[Blacksmith Guildsman]";
+ mes "There are two Airships. One is flying from Izlude to Yuno, and the other one flys throughout the whole Shwarzwald Republic.";
+ mes "Thats Yuno, Hugel, Lighthalzen and Einbroch.";
+ next;
+M_know:
+ mes "[Blacksmith Guildsman]";
+ mes "If you wish to go to Einbroch, simply board the Airship in Izlude, get of in Yuno and take the second ship until it reaches Einbroch.";
+ mes "When you reach your destination just ask one of the Guides for the Blacksmith Guild";
+ next;
+ mes "[Blacksmith Guildsman]";
+ mes "Now I know that this may be a bit confusing. That's why our guild in association with the Kafra Corporation is serving free warps to Izlude!";
+ mes "Would you like to use our services?";
+ next;
+ menu "Yes, please.",-,"No, thank you.",M_no;
+
+ mes "[Blacksmith Guildsman]";
+ mes "Have a nice trip!!";
+ close2;
+ warp "izlude.gat",145,39;
+ end;
+
+M_ok:
+ mes "[Blacksmith Guildsman]";
+ mes "Always at your service!";
+ close;
+
+M_run:
+ mes "[Blacksmith Guildsman]";
+ mes "Huh? Hey! Where are you going?!";
+ close;
+
+M_no:
+ mes "[Blacksmith Guildsman]";
+ mes "No? Don't tell me you're afraid of flying...";
+ close;
} \ No newline at end of file
diff --git a/npc/jobs/2-1/hunter.txt b/npc/jobs/2-1/hunter.txt
index 33f85aed8..c1fa0a19e 100644
--- a/npc/jobs/2-1/hunter.txt
+++ b/npc/jobs/2-1/hunter.txt
@@ -1,1255 +1,1255 @@
-//===== eAthena Script =======================================
-//= Hunter Job Quest
-//===== By: ==================================================
-//= EREMES THE CANIVALIZER (Aegis)Translated by yoshiki (Aegis)
-//= Converted by kobra_k88
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 2.3a
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Hunter Job Quest converted from aegis script
-//===== Additional Comments: =================================
-//= 0.5 Fully working.
-//= 0.6 Changed global variable names to unique ones.
-//= 0.7 - 0.8 Updates for eAthena +Knight2,Crusader2 fix
-//= 0.9 Fixed items quest fork bug [Lupus]
-//= 1.0 Fixed items quest bug: added extra condition [Lupus]
-//= 1.1 Fixed skillpoints check bug [Lupus]
-//= 1.2 Fixed an exploit, thanks to nonox [celest]
-//= 1.3 Added Baby Class support [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 1.6a Infinite Arrows exploit fix (thanx to Lorky, that
-//= reported the bug) [Lupus]
-//= 1.7 Moved the Job QUest to Hugel [Poki#3]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Removed Duplicates [Silent]
-//= 2.2 Merged JFunc, fixed missing dialogues [Lupus]
-//= 2.2a Fixed Sharon resetting the test2 item set [Lupus]
-//= 2.3a 7 official sets of Demon Hunter,thx to Dr.Evil [Lupus]
-//= 2.4 Added missing next;, missing NPC names [Lupus]
-//============================================================
-
-//<====================================== Job Changer ========================================>\\
-hu_in01.gat,386,374,4 script Hunter Sharon 727,{
- callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Sniper,"Sniper","Hunter Sharon";
-
- mes "[Hunter Sharon]";
- if(BaseJob == Job_Archer) goto L_Start;
- if(BaseJob == Job_Novice){
- mes "What's a novice like you doing here? Leave, we have nothing for you.";
- emotion e_what;
- close;
- }
- if(BaseJob == Job_Hunter){
- mes "What up! "+strcharinfo(0)+" Why did you come back? Falcon run away or something? Te hehe.";
- emotion e_heh;
- next;
- mes "[Hunter Sharon]";
- mes "I hope you didn't think you could get free stuff from us just because your part of our guild now......";
- close;
- }
- if(baseClass == Job_Swordman){
- mes "A follower of the way of the blade! We have nothing for you here so please leave.";
- close;
- }
- if(baseClass == Job_Mage){
- mes "Hello mage type person. If you have no business here, please leave,";
- close;
- }
- if(baseClass == Job_Thief){
- mes "Eeep! There's nothing to steal here!! Leave us alone..... go rob an old lady or something......";
- emotion e_omg;
- close;
- }
- if(baseClass == Job_Acolyte){
- mes "Good day, religious zealot! It's nice to meet you and all, but you have no buisiness here.";
- close;
- }
- if(baseClass == Job_Merchant){
- mes "Hey, how's buisiness? Perhaps if you want to sell something, go back to town.";
- close;
- }
- mes "What are YOU doing here? Did you come to do a little song and dance... ke.. keke....kekekeHahahahhaha!!!";
- emotion e_heh;
- close;
-
-L_Start:
- if(HNTR_Q == 1) goto L_Test2;
- if(HNTR_Q == 2) goto L_Test3;
- if(HNTR_Q == 3) goto L_Change;
- if(HNTR_Q2 == 1) goto L_ReTest;
- mes "Hey archer!! Hmmm....... You look like you've trained pretty hard.... I take it you're here to be a hunter!";
- next;
- menu "Of course!",M_0, "What are the requirements",M_1, "Not right now.",M_End;
-
- M_0:
- mes "[Hunter Sharon]";
- mes "Heh, I knew it. First fill out this application form.";
- next;
- mes "(you fill out the form and hand it back)";
- next;
- mes "[Hunter Sharon]";
- if(JobLevel < 40) goto sL_LowLvl;
- if(JobLevel == 50) goto sL_HighLvl;
- set JBLVL, 40;
- mes "Looks good. Let me start off by introducing myself. My name is Sharon, nice to meet you.";
- next;
- mes "[Hunter Sharon]";
- mes "Before I explain the process of becoming a Hunter, I'd like to do a short interview with you.";
- next;
- mes "[Hunter Sharon]";
- mes "Do you want to do the interview now?";
- next;
- menu "Yeah, let's begin.",L_Test, "Nah, I'll come back in a bit.",M_End;
-
- sL_LowLvl:
- mes "Hmm... It looks like you'll need more training. To become a Hunter, you will have to have a great amount of experience.";
- next;
- mes "[Hunter Sharon]";
- mes "Having a ^5533FFjob level of 40^000000 is what is required of all Hunter candidates. Please continue your training and good luck.";
- close;
- sL_HighLvl:
- mes "Well, well now! A high level archer.... very nice! You must have trained really hard.";
- emotion e_ic;
- next;
- mes "[Hunter Sharon]";
- mes "My name is Sharon, nice to meet you. Before I explain the process of becoming a Hunter, I'd like to do a short interview with you.";
- next;
- set JBLVL, 50;
- goto L_Test;
- M_1:
- mes "[Hunter Sharon]";
- mes "The requirements?";
- mes "1. Be an Archer";
- mes "2. Have a Job Level of at least 40";
- mes "3. Pass all of the tests";
- next;
- mes "[Hunter Sharon]";
- mes "If you trained hard enough, you shouldn't have any problems becoming a Hunter.";
- close;
-
- M_End:
- mes "[Hunter Sharon]";
- mes "Ok, I'll see you later.";
- close;
-
-
- L_ReTest:
- mes "Hmm.. what's this? So you wanna do the interview again? Very well. Hopefully you'll do better this time.";
- next;
- mes "[Hunter Sharon]";
- mes "Okay, let's start!";
- next;
- L_Test:
- set @score, 0;
- mes "[Hunter Sharon]";
- mes "I'm going to ask you some simple questions to get a feel for who you are and why you want to become a Hunter.";
- mes "Relax and answer the questions honestly and thoughtfully.";
- next;
- mes "[Hunter Sharon]";
- mes "You've been an training for a while, and now you're running out of ideas about where to go hunt. What should you do?";
- next;
- menu "Walk around screaming, 'Where should i go hunt!?'",M_1b, "Ask someone politely.",-, "Just explore.",-;
-
- set @score, @score + 10;
- M_1b:
-
- mes "[Hunter Sharon]";
- mes "Okay, so you picked your hunting spot! You plan to go to the Sograt Desert to hunt Hodes.";
- next;
- mes "[Hunter Sharon]";
- mes "But you're in Payon! How do you get to the desert?";
- next;
- menu "Go beg priests for warps",M_2b, "Kafra warp",-, "Walk there with a friend",-;
-
- set @score, @score + 10;
- M_2b:
-
- mes "[Hunter Sharon]";
- mes "There are no priests around, all your friends are busy, and you don't have enough money for a kafra warp.";
- next;
- mes "[Hunter Sharon]";
- mes "How do you get the money?";
- next;
- menu "Beg",M_3b, "Sell useless items",-, "Go hunting in a nearby field",-;
-
- set @score, @score + 10;
- M_3b:
-
- mes "[Hunter Sharon]";
- mes "You somehow get to the desert, but now you feel too weak to hunt hodes.";
- next;
- mes "[Hunter Sharon]";
- mes "What do you do now??";
- next;
- menu "Go cliff hunting.",M_4b, "Go rest at Morroc.",-, "Start shooting the hodes that other people are attacking.",M_4b;
-
- set @score, @score + 10;
- M_4b:
-
- mes "[Hunter Sharon]";
- mes "It's too much, you can't do it. You go to Morroc.";
- next;
- mes "[Hunter Sharon]";
- mes "By the time you return to town, you have no hp left, but you see a priest. How do you ask for a heal?";
- next;
- menu "If it's ok, can i have a heal please?",-, "Heal please.",M_5b, "heal plz",M_5b;
-
- set @score, @score + 10;
- M_5b:
-
- mes "[Hunter Sharon]";
- mes "While hunting, you find a rare item. You go to the market to sell it, and find lots of people and chat rooms.";
- next;
- mes "[Hunter Sharon]";
- mes "What do you do to sell the item quicker?";
- next;
- menu "Go into preexisting chat rooms and ask",M_6b, "Make your own chat room.",-, "See if anyone is buying.",-;
-
- set @score, @score + 10;
- M_6b:
-
- mes "[Hunter Sharon]";
- mes "After a while, a person starts to beg you. What do you do?";
- next;
- menu "Give some items and money",M_7b, "Ignore that person",M_7b, "Tell them where to level and make money.",-;
-
- set @score, @score + 10;
- M_7b:
-
- mes "[Hunter Sharon]";
- mes "You decide to go hunting in the woods.";
- next;
- mes "[Hunter Sharon]";
- mes "But you find someone who's lost. What do you do?";
- next;
- menu "Give him/her directions.",-, "Personally escort him/her.",-, "Ignore that person.",M_8b;
-
- set @score, @score + 10;
- M_8b:
-
- mes "[Hunter Sharon]";
- mes "You take the person to a safe place and resume hunting. While hunting, you see someone fighting a mvp!";
- next;
- mes "[Hunter Sharon]";
- mes "What do you do?";
- next;
- menu "Watch and attack if asked for help.",-, "Start attacking.",M_9b, "Return to town in panic.",M_9b;
-
- set @score, @score + 10;
- M_9b:
-
- mes "[Hunter Sharon]";
- mes "Now you're done hunting for the day.";
- next;
- mes "[Hunter Sharon]";
- mes "You find a rare item on the street while going back to town. What do you do?";
- next;
- menu "Finders keepers.",M_10b, "Try to find owner.",-, "Walk past it.",-;
-
- set @score, @score + 10;
- M_10b:
-
- L_Score:
- mes "[Hunter Sharon]";
- mes "Now we're done!!";
- next;
- if(@score < 90) goto sL_Failed;
- if(@score < 100) goto sL_90;
-
- sL_100:
- mes "[Hunter Sharon]";
- mes "Great! Based on the answers you gave, you seem to be just the type of person we're looking for.";
- emotion e_no1;
- next;
- mes "[Hunter Sharon]";
- mes "With your kind of additude and values, you should have no problems becoming a Hunter.";
- next;
- mes "[Hunter Sharon]";
- goto L_Test2;
- sL_90:
- mes "[Hunter Sharon]";
- mes "You didn't do as well as I hoped, but I'll pass you.... Though I don't know what the guild master will think of you....";
- next;
- mes "[Hunter Sharon]";
- mes "Work hard on the next test. Make Sharon happy, okies?";
- next;
- mes "[Hunter Sharon]";
- goto L_Test2;
- sL_Failed:
- mes "[Hunter Sharon]";
- mes "I.......don't think I can pass you..... The way you live your life is...... well... unexecptable for a Hunter candidate.";
- emotion e_swt;
- next;
- mes "[Hunter Sharon]";
- mes "Think carefully about my questions and your answers. Working well with people is just as important as loving nature.";
- set HNTR_Q2, 1;
- close;
-
-L_Test2:
- if(HNTR_Q==0){
- set HNTR_Q, 1;
- set HNTR_Q2, 0;
- }
- mes "What you have to do next is go see ^5533FFMr. Demon Hunter^000000 behind me. He'll tell you about the second test.";
- next;
- mes "[Hunter Sharon]";
- mes "Good luck!";
- close;
-
-L_Test3:
- mes "Hmmm? The guild master? Oh, he's out right now.";
- emotion e_hmm;
- next;
- mes "[Hunter Sharon]";
- mes "If I remember correctly, he should be somewhere in Archer Village. I think he had to talk with someone in the ^5533FFArcher Guild^000000.";
- close;
-
-L_Change:
- if(skillpoint > 0) goto sL_SkPoints;
- if(countitem(1007) < 1) goto sL_NotRdy;
- mes "Huh? Did you pass the test?";
- next;
- mes "[Hunter Sharon]";
- mes "Congratulations!!";
- emotion e_no1;
- next;
- mes "[Hunter Sharon]";
- mes "Now I can change you into a Hunter!";
- next;
- mes "[Hunter Sharon]";
- mes "There you go! You look great in the hunter outfit";
-
- callfunc "Job_Change",Job_Hunter;
- emotion e_no1;
- next;
- mes "[Hunter Sharon]";
- mes "Now, for working so hard, the guild has a small reward for you.";
- if(JBLVL == 50) getitem 1718, 1;
- if(JBLVL != 50) getitem 1710, 1;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- next;
- mes "[Hunter Sharon]";
- mes "Do all of us here a favor, act responsibly, and love and respect nature! Good luck on your journey and remember you are always welcome here!";
- next;
- close;
-
- sL_SkPoints:
- mes "You still have skill points left over. Speak with me after you've used them up.";
- close;
- sL_NotRdy:
- mes "[Hunter Sharon]";
- mes "Hmmm, I received news of your success.... But you don't seem to have the ^5533FFNecklace of Wisdom^000000 as proof.";
- emotion e_hmm;
- next;
- mes "[Hunter Sharon]";
- mes "You will need the Necklace of Wisdom to become a Hunter. If you don't have it you will have to start the test over.";
- next;
- menu "Um... I've got it.... somewhere....",-, "Heh heh.... I must have misplaced it.....",sM_ReStart;
-
- mes "[Hunter Sharon]";
- mes "Well then go get it!";
- emotion e_an;
- close;
- sM_ReStart:
- mes "[Hunter Sharon]";
- mes "..... That's just pathetic....... Have fun re-doing the ENTIRE TEST!";
- emotion e_pif;
- set HNTR_Q, 0;
- set HNTR_Q2, 0;
- close;
-}
-
-
-//<=========================== Demon Hunter: Second Test ===============================>\\
-hu_in01.gat,382,382,5 script Demon Hunter 732,{
- if(BaseJob == Job_Archer) goto L_Arc;
- if(BaseJob == Job_Hunter) goto L_Hnt;
-
-L_Other:
- mes "[Demon Hunter]";
- mes "They call me the Demon Hunter. What's that? You want to know why I'm called that?......";
- next;
- mes "[Demon Hunter]";
- mes "heh... heh.... heh.....";
- next;
- mes "[Demon Hunter]";
- mes "For your safety... it's best that you DON'T find out.....";
- emotion e_gg;
- close;
-
-L_Hnt:
- mes "[Demon Hunter]";
- mes "Look at you! Nice and spiffy in that Hunter's outfit. How does it feel? Good I bet. Well good luck to you.";
- emotion e_gasp;
- close;
-
-L_Arc:
- mes "[Demon Hunter]";
- if(HNTR_Q == 1 && HNTR_Q2 > 0) goto L_Check; //Fixed [Lupus]
- if(HNTR_Q == 1) goto L_Start;
- if(HNTR_Q == 2) goto L_Test3;
- if(HNTR_Q == 3) goto L_Done;
- mes "You'll have to speak with ^5533FFHunter Sharon^000000 first, if you want to become a hunter.";
- close;
-L_Start:
- mes "Hello, I'm the test examiner they call the Demon Hunter. Is ^5566FF"+strcharinfo(0)+"^000000 your name?";
- next;
- menu "Yes",M_Yes, "Uhhh.... no",M_No;
-
- M_Yes:
- mes "[Demon Hunter]";
- mes "Good. Because we make the arrows used during some of the tests, we also need the materials to make those arrows.";
- next;
- mes "[Demon Hunter]";
- mes "If you haven't noticed already, our guild is NOT as wealthy as some of the others. I mean we're in the middle of the freaking forest for pete sake....";
- emotion e_ag;
- next;
- mes "[Demon Hunter]";
- mes "Ehem... Like I was saying earlier we need certain materials to make our arrows. That is where Hunter wanna be's like you come in handy.";
- mes "For this test you will have to gather the materials needed for making our arrows.";
- next;
- mes "[Demon Hunter]";
- mes "Let's see... the items you need to gather are.....";
- next;
- set HNTR_Q2, rand(1,7);
- L_Repeat:
- mes "[Demon Hunter]";
- switch(HNTR_Q2){
- case 1:
- mes "^5533FF3 Bill of Birds^000000 for arrow heads,";
- mes "^5533FF5 Skel-Bones^000000 used here and there";
- mes "and ^5533FF3 Green Herbs^000000.";
- break;
- case 2:
- mes "^5533FF3 Venom Canine,";
- mes "3 Animal Skins";
- mes "and 5 Red Herbs^000000.";
- break;
- case 3:
- mes "^5533FF3 Dokebi Horns,";
- mes "3 Pieces of Egg Shell";
- mes "and 10 Feathers^000000.";
- break;
- case 4:
- mes "^5533FF9 Yellow Herbs,";
- mes "9 Worm Peelings";
- mes "and 9 Shells^000000.";
- break;
- case 5:
- mes "^5533FF3 Tooths of Bat,";
- mes "1 Sticky Mucus";
- mes "and 1 Bears Foot Skin^000000.";
- break;
- case 6:
- mes "^5533FF1 Yoyo Tail,";
- mes "2 Porcupine Quills";
- mes "and 1 Acorn^000000.";
- break;
- case 7:
- mes "^5533FF3 White Herbs,";
- mes "5 Trunks";
- mes "and 5 Claws of Desert Wolf^000000.";
- break;
- }
- next;
- mes "[Demon Hunter]";
- mes "When you get all of the items return!";
- close;
-
- M_No:
- mes "[Demon Hunter]";
- mes "Stop playing around "+strcharinfo(0)+", that's your name, right?";
- next;
- menu "Yes",M_Yes, "Uhhh no",sM_End;
-
- sM_End:
- mes "[Demon Hunter]";
- mes "DON'T you mess around with me! If you're gonna fool around then LEAVE!";
- emotion e_pif;
- warp "hugel.gat", 207, 222;
- end;
-
-L_Check:
- mes "Yes?";
- next;
- switch(HNTR_Q2){
- case 1:
- if(countitem(925)<3 || countitem(932)<5 || countitem(511)<3) goto L_Repeat;
- delitem 925, 3;
- delitem 932, 5;
- delitem 511, 3;
- break;
- case 2:
- if(countitem(937)<3 || countitem(919)<3 || countitem(507)<5) goto L_Repeat;
- delitem 937, 3;
- delitem 919, 3;
- delitem 507, 5;
- break;
- case 3:
- if(countitem(1021)<3 || countitem(7032)<3 || countitem(949)<10) goto L_Repeat;
- delitem 1021, 3;
- delitem 7032, 3;
- delitem 949, 10;
- break;
- case 4:
- if(countitem(508)<9 || countitem(955)<9 || countitem(935)<9) goto L_Repeat;
- delitem 508, 9;
- delitem 955, 9;
- delitem 935, 9;
- break;
- case 5:
- if(countitem(913)<3 || countitem(938)<1 || countitem(948)<1) goto L_Repeat;
- delitem 913, 3;
- delitem 938, 1;
- delitem 948, 1;
- break;
- case 6:
- if(countitem(942)<1 || countitem(1027)<2 || countitem(1026)<1) goto L_Repeat;
- delitem 942, 1;
- delitem 1027, 2;
- delitem 1026, 1;
- break;
- case 7:
- if(countitem(509)<3 || countitem(1019)<5 || countitem(7030)<5) goto L_Repeat;
- delitem 509, 3;
- delitem 1019, 5;
- delitem 7030, 5;
- break;
- }
- mes "[Demon Hunter]";
- mes "Good job. You brought all the necesarry items. Now go find the ^5533FFGuild Master^000000.";
- mes "I think he's somewhere in the ^5533FFArcher Guild^000000. He'll give you your final test. Good luck.";
- set HNTR_Q, 2;
- set HNTR_Q2, 0;
- close;
-
-L_Test3:
- mes "Huh? Can't you find the guild master? He should be in the ^5533FFArcher Guild in Archer village^000000. Go find him.";
- emotion e_hmm;
- close;
-
-L_Done:
- mes "Ah, you passed the test! Congrats, go see Sharin now.";
- close;
-}
-
-
-//<=============================== Guild Master: Last Test =================================>\\
-payon_in02.gat,21,31,1 script Guild Master#03 59,{
- if(BaseJob == Job_Archer) goto L_Archer;
- if(BaseJob == Job_Hunter) goto L_Hnt;
-
-L_Other:
- mes "[Hunter]";
- mes "Is there something you want of me? I'm have some buisiness to take care of, so please be quiet.";
- emotion e_hmm;
- close;
-
-L_Hnt:
- mes "[Guild Master]";
- mes "Ah, it's you again, "+strcharinfo+"! Good to see you're well. Me? I'm still busy as usual.";
- next;
- mes "[Guild Master]";
- mes "Well I've gota get back to work. Stay safe.";
- close;
-
-L_Archer:
- mes "[Guild Master]";
- if(HNTR_Q == 1) goto L_Test2;
- if(HNTR_Q == 2) goto L_Start;
- if(HNTR_Q == 3) goto L_Done;
- mes "You want to be a hunter bad, don't you? In my days, I worked for over a month to become a hunter, hehe.";
- next;
- mes "[Guild Master]";
- mes "If you don't have anything else I suggest you go back to the guild!";
- close;
-
-L_Start:
- if(HNTR_Q2 == 1) goto L_ReTest;
- if(HNTR_Q2 == 2) goto L_Passed;
- mes "So, you've come to take the test? I see.... well then, do you have any questions before we get started?";
- M_Menu:
- next;
- menu "What's the test about?",M_0, "Anything I should know?",M_1, "Start the test.",M_Start;
-
- M_0:
- mes "[Guild Master]";
- mes "This is a test of speed, agility, and target recogniton. You will be warped to a room full of monsters.";
- mes "You will have to ^5533FFkill 4^000000 of those monsters but not just any 4. You will need to kill the ones called, ^5533FFJob Change Monster^000000.";
- next;
- mes "[Guild Master]";
- mes "Kill the wrong one and you will fail the test. To make things even harder, we have set traps all over the room.";
- mes "Stepping on a trap will also result in failure.";
- next;
- mes "[Guild Master]";
- mes "One more important note.... You must complete the test within ^FF55333 minutes^000000.";
- next;
- mes "[Guild Master]";
- mes "This will teach you the important abilities a hunter needs, mobilitiy and tracking.";
- goto M_Menu;
- M_1:
- mes "[Guild Master]";
- mes "Only one person can take the test at time. If someone is currently taking the test, just enter the chat room and wait.";
- mes "You will automatically be warped to the testing room when the other player either finishes or fails.";
- next;
- mes "[Guild Master]";
- mes "Make sure you aim carefully. There will be a lot of monsters and you don't want to hit the wrong one.";
- mes "Keeping track of the monsters' names will be very important in this test.";
- next;
- mes "[Guild Master]";
- mes "And ALWAYS watch your step! There are traps everywhere!";
- goto M_Menu;
- M_Start:
- if (countitem(1751) <= 5 && @HNTR_QA==0) callsub sF_GetArrows;
- mes "[Guild Master]";
- mes "Good luck, I'll send you to the test room now.";
- next;
- set HNTR_Q2, 1;
- set @HNTR_QA,0;
- savepoint "payon_in02.gat", 16, 26;
- warp "job_hunte.gat", 176, 22;
- end;
-
- sF_GetArrows:
- mes "[Guild Master]";
- mes "This is where your hard work in the 2nd test payed off. Here are some arrows, made with the items you collected.";
- getitem 1751, 200;
- set @HNTR_QA,1;
- next;
- return;
-
-L_ReTest:
- mes "Ah, you're one of the archers that failed. Here, let me heal you wounds...";
- next;
- mes "[Guild Master]";
- mes "You're ready right?";
- percentheal 100,100;
- goto M_Menu;
-
-L_Passed:
- mes "I see you suceeded. Great job! Now I will give you the proof of your success, the ^5533FFNecklace of Wisdom^000000.";
- emotion e_no1;
- next;
- mes "[Guild Master]";
- mes "Here you go. Make sure you show this to Hunter Sharon or you WON'T be able to become a Hunter.";
- getitem 1007,1;
- next;
- mes "[Guild Master]";
- mes "Anyway, I've got some work left to do here so I'll see you later.";
- set HNTR_Q, 3;
- set HNTR_Q2, 0;
- close;
-
-L_Test2:
- mes "Yes? What would a archer want from me? The guild didn't send me a msg about you.";
- mes "Did you talk to the guild recruiters and get all the items needed? You have to get them the items first.";
- close;
-L_Done:
- mes "Hmm? What is it? Don't waste your time here, go on and become a Hunter already....";
- close;
-
-}
-
-
-// Test Guide ====================================================
-job_hunte.gat,178,32,5 script Hunter Test Guide::HntTG 107,{
-
-L_Start:
- mes "[Test Guide]";
- mes "Welcome to the Hunter's testing arena.";
- next;
- menu "Take the test.",-, "I changed my mind.",M_End;
-
- mes "[Test Guide]";
- mes "Please enter the waiting room after hearing my explaination.";
- next;
- mes "[Test Guide]";
- mes "You will be warped into room with traps and monsters. Avoid the traps and kill the monsters. Once you do, a switch will appear";
- next;
- mes "[Test Guide]";
- mes "Use the switch to open an exit out of the arena. You will have 3 minutes to complete the test.";
- next;
- mes "[Test Guide]";
- mes "If you get knocked out, get caught in a trap, or run out of time, you will fail the test and have to start over again.";
- next;
- mes "[Test Guide]";
- mes "Don't worry about arrows, we'll provide them. So, if you're ready, go to the waiting room.";
- close;
- M_End:
- mes "[Test Guide]";
- mes "Alright, I'll send you back to Payon. Hopefully I'll see you again later. Don't forget to save!";
- warp "payon_in02.gat", 16, 26;
- end;
-
-OnInit:
- waitingroom "Hunter Test Waiting Room", 8,"HntTG::OnStart",1;
- end;
-
-OnStart:
- set $@HntUsers, getareausers("job_hunte.gat", 50, 64, 123, 143);
- if ($@HntUsers > 0) end; // stops the rest of the script from running if there is somebody taking the test
-
- if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
- killmonsterall "job_hunte.gat";
- warpwaitingpc "job_hunte.gat", 90, 67;
- donpcevent "Ev_HntRm::OnStart";
- end;
-
-}
-
-
-// Ev_HntRm: Test room --------------------------------------------------------
-job_hunte.gat,1,1,1 script Ev_HntRm -1,{
-
-OnStart:
- disablenpc "SwitchHnt";
- disablenpc "ExitHnt";
- set $@HntMob, 4;
- // Real Monsters
- monster "job_hunte.gat",67,80,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
- monster "job_hunte.gat",114,78,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
- monster "job_hunte.gat",89,127,"Job Change Monster",1002,1,"Ev_HntRm::OnMyMobDead1";
- monster "job_hunte.gat",53,73,"Job Change Monster",1041,1,"Ev_HntRm::OnMyMobDead1";
- monster "job_hunte.gat",125,70,"Job Change Monster",1016,1,"Ev_HntRm::OnMyMobDead1";
- monster "job_hunte.gat",90,92,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
- donpcevent "Ev_HntRm2::OnStart";
- initnpctimer "TimerHnt";
- end;
-
-OnMyMobDead1:
- set $@HntMob, $@HntMob - 1;
- if($@HntMob != 0) end;
-
- stopnpctimer "TimerHnt";
- killmonsterall "job_hunte.gat";
- enablenpc "SwitchHnt";
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Great job! Go use the switch now!",8;
- end;
-
-}
-
-// Ev_HntRm2: Spawns the Decoy Monsters ----------------------------------------
-job_hunte.gat,1,1,1 script Ev_HntRm2 -1,{
-
-OnStart:
- // Decoy Monsters
- monster "job_hunte.gat",85,100,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",72,102,"Test Monster",1041,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",108,103,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",88,127,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",125,69,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat", 77, 112,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 106,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 73,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",125, 70,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",90, 91,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",67, 80,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",77, 112,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 106,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 73,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",125, 70,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",90, 91,"Test Monster",1041,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",85, 100,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",72, 102,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",108, 103,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",77, 112,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",112, 139,"Vinnie Paul",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",112, 139,"Dimeback Darrel",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",112, 139,"Rex",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",112, 139,"Phillip Angelmo",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",90, 91,"Anolian",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 73,"monster sample",1002,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",53, 106,"I'm not the one you want >_>",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",77, 112,"SPARE ME~",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",72, 102,"Don't hurt me!",1015,1,"Ev_HntRm2::OnMyMobDead2";
- monster "job_hunte.gat",108, 103,"aspd 184",1015,1,"Ev_HntRm2::OnMyMobDead2";
- end;
-
-OnMyMobDead2:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: You killed the wrong monster! You have failed the test!",8;
- addtimer 3000, "TimerHnt::OnTimer196000";
- end;
-}
-
-// Test Timer -----------------------------------------------------------------
-job_hunte.gat,1,1,1 script TimerHnt -1,{
-
-
-OnTimer500:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Remember, you need to kill the 'Job Change Monsters'!",8;
- end;
-OnTimer4000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Don't forget to AVOID the TRAPS!!!",8;
- end;
-OnTimer10000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ******The clock will start now! 3 minutes left! ****** ",8;
- donpcevent "HntTG::OnStart";
- end;
-OnTimer40000:
- donpcevent "HntTG::OnStart";
- end;
-OnTimer70000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 2 minutes left! ****** ",8;
- donpcevent "HntTG::OnStart";
- end;
-OnTimer100000:
- donpcevent "HntTG::OnStart";
- end;
-OnTimer130000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 1 minute left! ****** ",8;
- donpcevent "HntTG::OnStart";
- end;
-OnTimer160000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 30 sec left! ****** ",8;
- donpcevent "HntTG::OnStart";
- end;
-OnTimer185000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 5 . . . .",8;
- donpcevent "HntTG::OnStart";
- end;
-OnTimer186000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 4. . . .",8;
- end;
-OnTimer187000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 3. . .",8;
- end;
-OnTimer188000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 2. .",8;
- end;
-OnTimer189000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 1...",8;
- end;
-OnTimer190000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 0! ",8;
- end;
-OnTimer193000:
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: You ran out of time! You can challenge again later!.",8;
- end;
-OnTimer196000:
- stopnpctimer;
- areawarp "job_hunte.gat", 50, 64, 123, 143, "payon_in02.gat", 16, 26;
- killmonsterall "job_hunte.gat";
- donpcevent "HntTG::OnStart";
- end;
-}
-
-// SwitchHnt ------------------------------------------------------
-job_hunte.gat,93,101,1 script SwitchHnt 723,{
- areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: *** The exit has been activated! You have 30 sec. to find the exit!! *** ",8;
- enablenpc "ExitHnt";
- addtimer 30000, "TimerHnt::OnTimer196000";
- close;
-}
-
-// ExitHnt -----------------------------------------------------------
-job_hunte.gat,89,139,1 script ExitHnt 45,2,2,{
-
- deltimer "TimerHnt::OnTimer196000";
- set HNTR_Q2, 2;
- warp "payon_in02.gat", 16, 26;
- killmonsterall "job_hunte.gat";
- donpcevent "HntTG::OnStart";
- end;
-}
-
-
-// Hunter Test Traps =======================================
-
-job_hunte.gat,52,140,1 script 1-1::HntTrap 139,0,1,{
- stopnpctimer "TimerHnt";
- warp "payon_in02.gat", 16, 26;
- killmonsterall "job_hunte.gat";
- donpcevent "HntTG::OnStart";
- end;
-}
-
-job_hunte.gat,53,140,1 duplicate(HntTrap) 1-2 139,0,1
-job_hunte.gat,54,141,1 duplicate(HntTrap) 1-3 139,0,0
-job_hunte.gat,55,141,1 duplicate(HntTrap) 1-4 139,0,0
-job_hunte.gat,55,140,1 duplicate(HntTrap) 1-5 139,0,0
-job_hunte.gat,54,140,1 duplicate(HntTrap) 1-6 139,0,0
-job_hunte.gat,52,138,1 duplicate(HntTrap) 1-7 139,0,0
-job_hunte.gat,53,138,1 duplicate(HntTrap) 1-8 139,0,0
-job_hunte.gat,62,140,1 duplicate(HntTrap) 2-1 139,0,1
-job_hunte.gat,63,140,1 duplicate(HntTrap) 2-2 139,0,1
-job_hunte.gat,64,140,1 duplicate(HntTrap) 2-3 139,0,0
-job_hunte.gat,64,141,1 duplicate(HntTrap) 2-4 139,0,0
-job_hunte.gat,65,140,1 duplicate(HntTrap) 2-5 139,0,0
-job_hunte.gat,65,141,1 duplicate(HntTrap) 2-6 139,0,0
-job_hunte.gat,62,138,1 duplicate(HntTrap) 2-7 139,0,0
-job_hunte.gat,63,138,1 duplicate(HntTrap) 2-8 139,0,0
-job_hunte.gat,72,140,1 duplicate(HntTrap) 3-1 139,0,1
-job_hunte.gat,73,140,1 duplicate(HntTrap) 3-2 139,0,1
-job_hunte.gat,72,138,1 duplicate(HntTrap) 3-3 139,0,0
-job_hunte.gat,72,138,1 duplicate(HntTrap) 3-4 139,0,0
-job_hunte.gat,78,140,1 duplicate(HntTrap) 4-1 139,0,0
-job_hunte.gat,78,141,1 duplicate(HntTrap) 4-2 139,0,0
-job_hunte.gat,79,140,1 duplicate(HntTrap) 4-3 139,0,0
-job_hunte.gat,79,141,1 duplicate(HntTrap) 4-4 139,0,0
-job_hunte.gat,82,138,1 duplicate(HntTrap) 5-1 139,0,0
-job_hunte.gat,82,139,1 duplicate(HntTrap) 5-2 139,0,0
-job_hunte.gat,83,138,1 duplicate(HntTrap) 5-3 139,0,0
-job_hunte.gat,83,139,1 duplicate(HntTrap) 5-4 139,0,0
-job_hunte.gat,99,138,1 duplicate(HntTrap) 6-1 139,1,0
-job_hunte.gat,99,139,1 duplicate(HntTrap) 6-2 139,1,0
-job_hunte.gat,101,138,1 duplicate(HntTrap) 6-3 139,0,0
-job_hunte.gat,101,139,1 duplicate(HntTrap) 6-4 139,0,0
-job_hunte.gat,106,140,1 duplicate(HntTrap) 7-1 139,0,1
-job_hunte.gat,107,140,1 duplicate(HntTrap) 7-2 139,0,1
-job_hunte.gat,106,138,1 duplicate(HntTrap) 7-3 139,0,0
-job_hunte.gat,107,138,1 duplicate(HntTrap) 7-4 139,0,0
-job_hunte.gat,112,140,1 duplicate(HntTrap) 8-1 139,0,0
-job_hunte.gat,112,141,1 duplicate(HntTrap) 8-2 139,0,0
-job_hunte.gat,113,140,1 duplicate(HntTrap) 8-3 139,0,0
-job_hunte.gat,113,141,1 duplicate(HntTrap) 8-4 139,0,0
-job_hunte.gat,116,140,1 duplicate(HntTrap) 9-1 139,0,0
-job_hunte.gat,116,141,1 duplicate(HntTrap) 9-2 139,0,0
-job_hunte.gat,117,140,1 duplicate(HntTrap) 9-3 139,0,0
-job_hunte.gat,117,141,1 duplicate(HntTrap) 9-4 139,0,0
-job_hunte.gat,120,138,1 duplicate(HntTrap) 10-1 139,0,0
-job_hunte.gat,120,139,1 duplicate(HntTrap) 10-2 139,0,0
-job_hunte.gat,121,138,1 duplicate(HntTrap) 10-3 139,0,0
-job_hunte.gat,121,139,1 duplicate(HntTrap) 10-4 139,0,0
-job_hunte.gat,126,139,1 duplicate(HntTrap) 11-1 139,0,2
-job_hunte.gat,127,139,1 duplicate(HntTrap) 11-2 139,0,2
-job_hunte.gat,126,136,1 duplicate(HntTrap) 11-3 139,0,0
-job_hunte.gat,127,136,1 duplicate(HntTrap) 11-4 139,0,0
-job_hunte.gat,52,134,1 duplicate(HntTrap) 12-1 139,0,1
-job_hunte.gat,53,134,1 duplicate(HntTrap) 12-2 139,0,1
-job_hunte.gat,52,132,1 duplicate(HntTrap) 12-3 139,0,0
-job_hunte.gat,53,132,1 duplicate(HntTrap) 12-4 139,0,0
-job_hunte.gat,124,130,1 duplicate(HntTrap) 13-1 139,0,0
-job_hunte.gat,124,131,1 duplicate(HntTrap) 13-2 139,0,0
-job_hunte.gat,125,130,1 duplicate(HntTrap) 13-3 139,0,0
-job_hunte.gat,125,131,1 duplicate(HntTrap) 13-4 139,0,0
-job_hunte.gat,64,128,1 duplicate(HntTrap) 14-1 139,0,0
-job_hunte.gat,64,129,1 duplicate(HntTrap) 14-2 139,0,0
-job_hunte.gat,65,128,1 duplicate(HntTrap) 14-3 139,0,0
-job_hunte.gat,65,129,1 duplicate(HntTrap) 14-4 139,0,0
-job_hunte.gat,68,126,1 duplicate(HntTrap) 15-1 139,0,0
-job_hunte.gat,68,127,1 duplicate(HntTrap) 15-2 139,0,0
-job_hunte.gat,69,126,1 duplicate(HntTrap) 15-3 139,0,0
-job_hunte.gat,69,127,1 duplicate(HntTrap) 15-4 139,0,0
-job_hunte.gat,75,128,1 duplicate(HntTrap) 16-1 139,1,0
-job_hunte.gat,75,129,1 duplicate(HntTrap) 16-2 139,1,0
-job_hunte.gat,77,128,1 duplicate(HntTrap) 16-3 139,0,0
-job_hunte.gat,77,129,1 duplicate(HntTrap) 16-4 139,0,0
-job_hunte.gat,82,126,1 duplicate(HntTrap) 17-1 139,0,0
-job_hunte.gat,82,127,1 duplicate(HntTrap) 17-2 139,0,0
-job_hunte.gat,83,126,1 duplicate(HntTrap) 17-3 139,0,0
-job_hunte.gat,83,127,1 duplicate(HntTrap) 17-4 139,0,0
-job_hunte.gat,96,128,1 duplicate(HntTrap) 18-1 139,0,0
-job_hunte.gat,96,129,1 duplicate(HntTrap) 18-2 139,0,0
-job_hunte.gat,97,128,1 duplicate(HntTrap) 18-3 139,0,0
-job_hunte.gat,97,129,1 duplicate(HntTrap) 18-4 139,0,0
-job_hunte.gat,100,126,1 duplicate(HntTrap) 19-1 139,0,0
-job_hunte.gat,100,127,1 duplicate(HntTrap) 19-2 139,0,0
-job_hunte.gat,101,126,1 duplicate(HntTrap) 19-3 139,0,0
-job_hunte.gat,101,127,1 duplicate(HntTrap) 19-4 139,0,0
-job_hunte.gat,106,128,1 duplicate(HntTrap) 20-1 139,0,0
-job_hunte.gat,106,129,1 duplicate(HntTrap) 20-2 139,0,0
-job_hunte.gat,107,128,1 duplicate(HntTrap) 20-3 139,0,0
-job_hunte.gat,107,129,1 duplicate(HntTrap) 20-4 139,0,0
-job_hunte.gat,112,126,1 duplicate(HntTrap) 21-1 139,0,0
-job_hunte.gat,112,127,1 duplicate(HntTrap) 21-2 139,0,0
-job_hunte.gat,113,126,1 duplicate(HntTrap) 21-3 139,0,0
-job_hunte.gat,113,127,1 duplicate(HntTrap) 21-4 139,0,0
-job_hunte.gat,126,126,1 duplicate(HntTrap) 22-1 139,0,0
-job_hunte.gat,126,127,1 duplicate(HntTrap) 22-2 139,0,0
-job_hunte.gat,127,126,1 duplicate(HntTrap) 22-3 139,0,0
-job_hunte.gat,127,127,1 duplicate(HntTrap) 22-4 139,0,0
-job_hunte.gat,52,122,1 duplicate(HntTrap) 23-1 139,0,1
-job_hunte.gat,52,122,1 duplicate(HntTrap) 23-2 139,0,1
-job_hunte.gat,53,120,1 duplicate(HntTrap) 23-3 139,1,0
-job_hunte.gat,54,121,1 duplicate(HntTrap) 23-4 139,0,0
-job_hunte.gat,55,121,1 duplicate(HntTrap) 23-5 139,0,0
-job_hunte.gat,55,120,1 duplicate(HntTrap) 23-6 139,0,0
-job_hunte.gat,66,120,1 duplicate(HntTrap) 24-1 139,0,0
-job_hunte.gat,66,121,1 duplicate(HntTrap) 24-2 139,0,0
-job_hunte.gat,67,120,1 duplicate(HntTrap) 24-3 139,0,0
-job_hunte.gat,67,121,1 duplicate(HntTrap) 24-4 139,0,0
-job_hunte.gat,114,118,1 duplicate(HntTrap) 25-1 139,0,0
-job_hunte.gat,114,119,1 duplicate(HntTrap) 25-2 139,0,0
-job_hunte.gat,115,118,1 duplicate(HntTrap) 25-3 139,0,0
-job_hunte.gat,115,119,1 duplicate(HntTrap) 25-4 139,0,0
-job_hunte.gat,124,120,1 duplicate(HntTrap) 26-1 139,0,1
-job_hunte.gat,125,120,1 duplicate(HntTrap) 26-2 139,0,1
-job_hunte.gat,124,118,1 duplicate(HntTrap) 26-3 139,0,0
-job_hunte.gat,125,118,1 duplicate(HntTrap) 26-4 139,0,0
-job_hunte.gat,66,116,1 duplicate(HntTrap) 27-1 139,0,0
-job_hunte.gat,66,117,1 duplicate(HntTrap) 27-2 139,0,0
-job_hunte.gat,67,116,1 duplicate(HntTrap) 27-3 139,0,0
-job_hunte.gat,67,117,1 duplicate(HntTrap) 27-4 139,0,0
-job_hunte.gat,76,114,1 duplicate(HntTrap) 28-1 139,0,0
-job_hunte.gat,76,115,1 duplicate(HntTrap) 28-2 139,0,0
-job_hunte.gat,77,114,1 duplicate(HntTrap) 28-3 139,0,0
-job_hunte.gat,77,115,1 duplicate(HntTrap) 28-4 139,0,0
-job_hunte.gat,82,116,1 duplicate(HntTrap) 29-1 139,0,0
-job_hunte.gat,82,117,1 duplicate(HntTrap) 29-2 139,0,0
-job_hunte.gat,83,116,1 duplicate(HntTrap) 29-3 139,0,0
-job_hunte.gat,83,117,1 duplicate(HntTrap) 29-4 139,0,0
-job_hunte.gat,86,114,1 duplicate(HntTrap) 30-1 139,0,0
-job_hunte.gat,86,115,1 duplicate(HntTrap) 30-2 139,0,0
-job_hunte.gat,87,114,1 duplicate(HntTrap) 30-3 139,0,0
-job_hunte.gat,87,115,1 duplicate(HntTrap) 30-4 139,0,0
-job_hunte.gat,92,115,1 duplicate(HntTrap) 31-1 139,1,0
-job_hunte.gat,92,114,1 duplicate(HntTrap) 31-2 139,1,0
-job_hunte.gat,90,115,1 duplicate(HntTrap) 31-3 139,0,0
-job_hunte.gat,102,116,1 duplicate(HntTrap) 32-1 139,0,0
-job_hunte.gat,102,117,1 duplicate(HntTrap) 32-2 139,0,0
-job_hunte.gat,103,116,1 duplicate(HntTrap) 32-3 139,0,0
-job_hunte.gat,103,117,1 duplicate(HntTrap) 32-4 139,0,0
-job_hunte.gat,114,114,1 duplicate(HntTrap) 33-1 139,0,0
-job_hunte.gat,114,115,1 duplicate(HntTrap) 33-2 139,0,0
-job_hunte.gat,115,114,1 duplicate(HntTrap) 33-3 139,0,0
-job_hunte.gat,115,115,1 duplicate(HntTrap) 33-4 139,0,0
-job_hunte.gat,54,110,1 duplicate(HntTrap) 34-1 139,0,1
-job_hunte.gat,55,110,1 duplicate(HntTrap) 34-2 139,0,1
-job_hunte.gat,54,108,1 duplicate(HntTrap) 34-3 139,0,0
-job_hunte.gat,55,108,1 duplicate(HntTrap) 34-4 139,0,0
-job_hunte.gat,64,112,1 duplicate(HntTrap) 35-1 139,0,0
-job_hunte.gat,64,113,1 duplicate(HntTrap) 35-2 139,0,0
-job_hunte.gat,65,112,1 duplicate(HntTrap) 35-3 139,0,0
-job_hunte.gat,65,113,1 duplicate(HntTrap) 35-4 139,0,0
-job_hunte.gat,80,110,1 duplicate(HntTrap) 36-1 139,0,0
-job_hunte.gat,80,111,1 duplicate(HntTrap) 36-2 139,0,0
-job_hunte.gat,81,110,1 duplicate(HntTrap) 36-3 139,0,0
-job_hunte.gat,81,111,1 duplicate(HntTrap) 36-4 139,0,0
-job_hunte.gat,90,108,1 duplicate(HntTrap) 37-1 139,0,6
-job_hunte.gat,91,108,1 duplicate(HntTrap) 37-2 139,0,5
-job_hunte.gat,91,102,1 duplicate(HntTrap) 37-3 139,0,0
-job_hunte.gat,98,109,1 duplicate(HntTrap) 38-1 139,0,2
-job_hunte.gat,99,109,1 duplicate(HntTrap) 38-2 139,0,2
-job_hunte.gat,103,109,1 duplicate(HntTrap) 38-3 139,3,0
-job_hunte.gat,103,108,1 duplicate(HntTrap) 38-4 139,3,0
-job_hunte.gat,97,106,1 duplicate(HntTrap) 39-1 139,2,0
-job_hunte.gat,96,107,1 duplicate(HntTrap) 39-2 139,1,0
-job_hunte.gat,94,108,1 duplicate(HntTrap) 39-3 139,0,1
-job_hunte.gat,95,109,1 duplicate(HntTrap) 39-4 139,0,0
-job_hunte.gat,95,108,1 duplicate(HntTrap) 40-1 139,0,0
-job_hunte.gat,94,106,1 duplicate(HntTrap) 40-2 139,0,0
-job_hunte.gat,96,102,1 duplicate(HntTrap) 40-3 139,0,3
-job_hunte.gat,97,102,1 duplicate(HntTrap) 40-4 139,0,3
-job_hunte.gat,95,98,1 duplicate(HntTrap) 41-1 139,2,0
-job_hunte.gat,94,99,1 duplicate(HntTrap) 42-1 139,1,0
-job_hunte.gat,92,98,1 duplicate(HntTrap) 43-1 139,0,0
-job_hunte.gat,112,110,1 duplicate(HntTrap) 44-1 139,0,0
-job_hunte.gat,112,111,1 duplicate(HntTrap) 44-2 139,0,0
-job_hunte.gat,113,110,1 duplicate(HntTrap) 44-3 139,0,0
-job_hunte.gat,113,111,1 duplicate(HntTrap) 44-4 139,0,0
-job_hunte.gat,126,108,1 duplicate(HntTrap) 45-1 139,0,1
-job_hunte.gat,127,108,1 duplicate(HntTrap) 45-2 139,0,1
-job_hunte.gat,126,106,1 duplicate(HntTrap) 45-3 139,0,0
-job_hunte.gat,126,106,1 duplicate(HntTrap) 45-4 139,0,0
-job_hunte.gat,53,102,1 duplicate(HntTrap) 46-1 139,1,1
-job_hunte.gat,55,102,1 duplicate(HntTrap) 46-2 139,0,1
-job_hunte.gat,53,100,1 duplicate(HntTrap) 46-3 139,1,0
-job_hunte.gat,55,100,1 duplicate(HntTrap) 46-4 139,0,0
-job_hunte.gat,64,106,1 duplicate(HntTrap) 47-1 139,0,0
-job_hunte.gat,64,107,1 duplicate(HntTrap) 47-2 139,0,0
-job_hunte.gat,65,106,1 duplicate(HntTrap) 47-3 139,0,0
-job_hunte.gat,65,107,1 duplicate(HntTrap) 47-4 139,0,0
-job_hunte.gat,66,100,1 duplicate(HntTrap) 48-1 139,0,0
-job_hunte.gat,66,101,1 duplicate(HntTrap) 48-2 139,0,0
-job_hunte.gat,67,100,1 duplicate(HntTrap) 48-3 139,0,0
-job_hunte.gat,67,101,1 duplicate(HntTrap) 48-4 139,0,0
-job_hunte.gat,86,106,1 duplicate(HntTrap) 49-1 139,0,1
-job_hunte.gat,87,106,1 duplicate(HntTrap) 49-2 139,0,1
-job_hunte.gat,82,104,1 duplicate(HntTrap) 49-3 139,5,0
-job_hunte.gat,81,105,1 duplicate(HntTrap) 49-4 139,4,0
-job_hunte.gat,76,105,1 duplicate(HntTrap) 50-1 139,0,0
-job_hunte.gat,76,104,1 duplicate(HntTrap) 50-2 139,0,0
-job_hunte.gat,78,101,1 duplicate(HntTrap) 50-3 139,0,2
-job_hunte.gat,79,101,1 duplicate(HntTrap) 50-4 139,0,2
-job_hunte.gat,76,99,1 duplicate(HntTrap) 51-1 139,1,0
-job_hunte.gat,77,98,1 duplicate(HntTrap) 51-2 139,2,0
-job_hunte.gat,74,99,1 duplicate(HntTrap) 51-3 139,0,0
-job_hunte.gat,74,98,1 duplicate(HntTrap) 51-4 139,0,0
-job_hunte.gat,82,100,1 duplicate(HntTrap) 53-1 139,0,0
-job_hunte.gat,82,101,1 duplicate(HntTrap) 53-2 139,0,0
-job_hunte.gat,83,100,1 duplicate(HntTrap) 53-3 139,0,0
-job_hunte.gat,83,101,1 duplicate(HntTrap) 53-4 139,0,0
-job_hunte.gat,106,104,1 duplicate(HntTrap) 54-1 139,0,0
-job_hunte.gat,106,105,1 duplicate(HntTrap) 54-2 139,0,0
-job_hunte.gat,107,104,1 duplicate(HntTrap) 54-3 139,0,0
-job_hunte.gat,107,105,1 duplicate(HntTrap) 54-4 139,0,0
-job_hunte.gat,112,104,1 duplicate(HntTrap) 55-1 139,0,1
-job_hunte.gat,113,104,1 duplicate(HntTrap) 55-2 139,0,1
-job_hunte.gat,112,102,1 duplicate(HntTrap) 55-3 139,0,0
-job_hunte.gat,113,102,1 duplicate(HntTrap) 55-4 139,0,0
-job_hunte.gat,54,92,1 duplicate(HntTrap) 56-1 139,0,0
-job_hunte.gat,54,93,1 duplicate(HntTrap) 56-2 139,0,0
-job_hunte.gat,55,92,1 duplicate(HntTrap) 56-3 139,0,0
-job_hunte.gat,55,93,1 duplicate(HntTrap) 56-4 139,0,0
-job_hunte.gat,52,90,1 duplicate(HntTrap) 56-5 139,0,0
-job_hunte.gat,52,91,1 duplicate(HntTrap) 56-6 139,0,0
-job_hunte.gat,53,90,1 duplicate(HntTrap) 56-7 139,0,0
-job_hunte.gat,53,91,1 duplicate(HntTrap) 56-8 139,0,0
-job_hunte.gat,64,92,1 duplicate(HntTrap) 57-1 139,0,0
-job_hunte.gat,64,93,1 duplicate(HntTrap) 57-2 139,0,0
-job_hunte.gat,65,92,1 duplicate(HntTrap) 57-3 139,0,0
-job_hunte.gat,65,93,1 duplicate(HntTrap) 57-4 139,0,0
-job_hunte.gat,76,94,1 duplicate(HntTrap) 58-1 139,0,0
-job_hunte.gat,76,95,1 duplicate(HntTrap) 58-2 139,0,0
-job_hunte.gat,77,94,1 duplicate(HntTrap) 58-3 139,0,0
-job_hunte.gat,77,95,1 duplicate(HntTrap) 58-4 139,0,0
-job_hunte.gat,78,92,1 duplicate(HntTrap) 59-1 139,0,0
-job_hunte.gat,78,93,1 duplicate(HntTrap) 59-2 139,0,0
-job_hunte.gat,79,92,1 duplicate(HntTrap) 59-3 139,0,0
-job_hunte.gat,79,93,1 duplicate(HntTrap) 59-4 139,0,0
-job_hunte.gat,86,92,1 duplicate(HntTrap) 60-1 139,0,0
-job_hunte.gat,86,93,1 duplicate(HntTrap) 60-2 139,0,0
-job_hunte.gat,87,92,1 duplicate(HntTrap) 60-3 139,0,0
-job_hunte.gat,87,93,1 duplicate(HntTrap) 60-4 139,0,0
-job_hunte.gat,90,96,1 duplicate(HntTrap) 61-1 139,0,0
-job_hunte.gat,90,97,1 duplicate(HntTrap) 61-2 139,0,0
-job_hunte.gat,91,96,1 duplicate(HntTrap) 61-3 139,0,0
-job_hunte.gat,91,97,1 duplicate(HntTrap) 61-4 139,0,0
-job_hunte.gat,99,95,1 duplicate(HntTrap) 62-1 139,1,0
-job_hunte.gat,99,94,1 duplicate(HntTrap) 62-2 139,1,0
-job_hunte.gat,101,94,1 duplicate(HntTrap) 62-3 139,0,1
-job_hunte.gat,100,93,1 duplicate(HntTrap) 62-4 139,0,0
-job_hunte.gat,100,92,1 duplicate(HntTrap) 63-1 139,0,0
-job_hunte.gat,101,92,1 duplicate(HntTrap) 63-2 139,0,0
-job_hunte.gat,102,98,1 duplicate(HntTrap) 64-1 139,0,0
-job_hunte.gat,102,99,1 duplicate(HntTrap) 64-2 139,0,0
-job_hunte.gat,103,98,1 duplicate(HntTrap) 64-3 139,0,0
-job_hunte.gat,103,99,1 duplicate(HntTrap) 64-4 139,0,0
-job_hunte.gat,102,90,1 duplicate(HntTrap) 65-1 139,0,0
-job_hunte.gat,102,91,1 duplicate(HntTrap) 65-2 139,0,0
-job_hunte.gat,103,90,1 duplicate(HntTrap) 65-3 139,0,0
-job_hunte.gat,103,91,1 duplicate(HntTrap) 65-4 139,0,0
-job_hunte.gat,114,96,1 duplicate(HntTrap) 66-1 139,0,0
-job_hunte.gat,114,97,1 duplicate(HntTrap) 66-2 139,0,0
-job_hunte.gat,115,96,1 duplicate(HntTrap) 66-3 139,0,0
-job_hunte.gat,115,97,1 duplicate(HntTrap) 66-4 139,0,0
-job_hunte.gat,112,90,1 duplicate(HntTrap) 67-1 139,0,0
-job_hunte.gat,112,91,1 duplicate(HntTrap) 67-2 139,0,0
-job_hunte.gat,113,90,1 duplicate(HntTrap) 67-3 139,0,0
-job_hunte.gat,113,91,1 duplicate(HntTrap) 67-4 139,0,0
-job_hunte.gat,125,97,1 duplicate(HntTrap) 68-1 139,1,0
-job_hunte.gat,125,96,1 duplicate(HntTrap) 68-2 139,1,0
-job_hunte.gat,127,96,1 duplicate(HntTrap) 68-3 139,0,0
-job_hunte.gat,127,97,1 duplicate(HntTrap) 68-4 139,0,0
-job_hunte.gat,52,86,1 duplicate(HntTrap) 69-1 139,0,0
-job_hunte.gat,52,87,1 duplicate(HntTrap) 69-2 139,0,0
-job_hunte.gat,53,86,1 duplicate(HntTrap) 69-3 139,0,0
-job_hunte.gat,53,87,1 duplicate(HntTrap) 69-4 139,0,0
-job_hunte.gat,66,88,1 duplicate(HntTrap) 70-1 139,0,0
-job_hunte.gat,66,89,1 duplicate(HntTrap) 70-2 139,0,0
-job_hunte.gat,67,88,1 duplicate(HntTrap) 70-3 139,0,0
-job_hunte.gat,67,89,1 duplicate(HntTrap) 70-4 139,0,0
-job_hunte.gat,114,84,1 duplicate(HntTrap) 71-1 139,0,0
-job_hunte.gat,114,85,1 duplicate(HntTrap) 71-2 139,0,0
-job_hunte.gat,115,84,1 duplicate(HntTrap) 71-3 139,0,0
-job_hunte.gat,115,85,1 duplicate(HntTrap) 71-4 139,0,0
-job_hunte.gat,126,86,1 duplicate(HntTrap) 72-1 139,0,0
-job_hunte.gat,126,87,1 duplicate(HntTrap) 72-2 139,0,0
-job_hunte.gat,127,86,1 duplicate(HntTrap) 72-3 139,0,0
-job_hunte.gat,127,87,1 duplicate(HntTrap) 72-4 139,0,0
-job_hunte.gat,54,80,1 duplicate(HntTrap) 73-1 139,0,1
-job_hunte.gat,55,80,1 duplicate(HntTrap) 73-2 139,0,1
-job_hunte.gat,55,80,1 duplicate(HntTrap) 73-3 139,0,0
-job_hunte.gat,55,78,1 duplicate(HntTrap) 73-4 139,0,0
-job_hunte.gat,64,82,1 duplicate(HntTrap) 74-1 139,0,1
-job_hunte.gat,65,82,1 duplicate(HntTrap) 74-2 139,0,1
-job_hunte.gat,64,80,1 duplicate(HntTrap) 74-3 139,0,0
-job_hunte.gat,65,80,1 duplicate(HntTrap) 74-4 139,0,0
-job_hunte.gat,66,78,1 duplicate(HntTrap) 75-1 139,0,0
-job_hunte.gat,66,79,1 duplicate(HntTrap) 75-2 139,0,0
-job_hunte.gat,67,78,1 duplicate(HntTrap) 75-3 139,0,0
-job_hunte.gat,67,79,1 duplicate(HntTrap) 75-4 139,0,0
-job_hunte.gat,74,78,1 duplicate(HntTrap) 76-1 139,0,0
-job_hunte.gat,74,79,1 duplicate(HntTrap) 76-2 139,0,0
-job_hunte.gat,75,78,1 duplicate(HntTrap) 76-3 139,0,0
-job_hunte.gat,75,79,1 duplicate(HntTrap) 76-4 139,0,0
-job_hunte.gat,78,80,1 duplicate(HntTrap) 77-1 139,0,0
-job_hunte.gat,78,81,1 duplicate(HntTrap) 77-2 139,0,0
-job_hunte.gat,79,80,1 duplicate(HntTrap) 77-3 139,0,0
-job_hunte.gat,79,81,1 duplicate(HntTrap) 77-4 139,0,0
-job_hunte.gat,82,78,1 duplicate(HntTrap) 78-1 139,0,0
-job_hunte.gat,82,79,1 duplicate(HntTrap) 78-2 139,0,0
-job_hunte.gat,83,78,1 duplicate(HntTrap) 78-3 139,0,0
-job_hunte.gat,83,79,1 duplicate(HntTrap) 78-4 139,0,0
-job_hunte.gat,94,78,1 duplicate(HntTrap) 79-1 139,0,0
-job_hunte.gat,94,79,1 duplicate(HntTrap) 79-2 139,0,0
-job_hunte.gat,95,78,1 duplicate(HntTrap) 79-3 139,0,0
-job_hunte.gat,95,79,1 duplicate(HntTrap) 79-4 139,0,0
-job_hunte.gat,101,80,1 duplicate(HntTrap) 80-1 139,1,0
-job_hunte.gat,101,81,1 duplicate(HntTrap) 80-2 139,1,0
-job_hunte.gat,103,81,1 duplicate(HntTrap) 80-3 139,0,0
-job_hunte.gat,103,80,1 duplicate(HntTrap) 80-4 139,0,0
-job_hunte.gat,104,78,1 duplicate(HntTrap) 81-1 139,0,0
-job_hunte.gat,104,79,1 duplicate(HntTrap) 81-2 139,0,0
-job_hunte.gat,105,78,1 duplicate(HntTrap) 81-3 139,0,0
-job_hunte.gat,105,79,1 duplicate(HntTrap) 81-4 139,0,0
-job_hunte.gat,110,78,1 duplicate(HntTrap) 82-1 139,0,0
-job_hunte.gat,110,79,1 duplicate(HntTrap) 82-2 139,0,0
-job_hunte.gat,111,78,1 duplicate(HntTrap) 82-3 139,0,0
-job_hunte.gat,111,79,1 duplicate(HntTrap) 82-4 139,0,0
-job_hunte.gat,114,80,1 duplicate(HntTrap) 83-1 139,0,0
-job_hunte.gat,114,81,1 duplicate(HntTrap) 83-2 139,0,0
-job_hunte.gat,115,80,1 duplicate(HntTrap) 83-3 139,0,0
-job_hunte.gat,115,81,1 duplicate(HntTrap) 83-4 139,0,0
-job_hunte.gat,124,78,1 duplicate(HntTrap) 84-1 139,0,0
-job_hunte.gat,124,79,1 duplicate(HntTrap) 84-2 139,0,0
-job_hunte.gat,125,78,1 duplicate(HntTrap) 84-3 139,0,0
-job_hunte.gat,125,79,1 duplicate(HntTrap) 84-4 139,0,0
-job_hunte.gat,126,82,1 duplicate(HntTrap) 85-1 139,0,0
-job_hunte.gat,126,83,1 duplicate(HntTrap) 85-2 139,0,0
-job_hunte.gat,127,82,1 duplicate(HntTrap) 85-3 139,0,0
-job_hunte.gat,127,83,1 duplicate(HntTrap) 85-4 139,0,0
-job_hunte.gat,52,68,1 duplicate(HntTrap) 86-1 139,0,1
-job_hunte.gat,53,68,1 duplicate(HntTrap) 86-2 139,0,1
-job_hunte.gat,52,66,1 duplicate(HntTrap) 86-3 139,0,0
-job_hunte.gat,53,66,1 duplicate(HntTrap) 86-4 139,0,0
-job_hunte.gat,54,70,1 duplicate(HntTrap) 87-1 139,0,1
-job_hunte.gat,55,70,1 duplicate(HntTrap) 87-2 139,0,1
-job_hunte.gat,54,68,1 duplicate(HntTrap) 87-3 139,0,0
-job_hunte.gat,55,68,1 duplicate(HntTrap) 87-4 139,0,0
-job_hunte.gat,59,66,1 duplicate(HntTrap) 88-1 139,1,0
-job_hunte.gat,59,67,1 duplicate(HntTrap) 88-2 139,1,0
-job_hunte.gat,61,67,1 duplicate(HntTrap) 88-3 139,0,0
-job_hunte.gat,61,66,1 duplicate(HntTrap) 88-4 139,0,0
-job_hunte.gat,68,68,1 duplicate(HntTrap) 89-1 139,0,1
-job_hunte.gat,69,68,1 duplicate(HntTrap) 89-2 139,0,1
-job_hunte.gat,68,66,1 duplicate(HntTrap) 89-3 139,0,0
-job_hunte.gat,69,66,1 duplicate(HntTrap) 89-4 139,0,0
-job_hunte.gat,76,66,1 duplicate(HntTrap) 90-1 139,0,0
-job_hunte.gat,76,67,1 duplicate(HntTrap) 90-2 139,0,0
-job_hunte.gat,77,66,1 duplicate(HntTrap) 90-3 139,0,0
-job_hunte.gat,77,67,1 duplicate(HntTrap) 90-4 139,0,0
-job_hunte.gat,82,68,1 duplicate(HntTrap) 91-1 139,0,0
-job_hunte.gat,82,69,1 duplicate(HntTrap) 91-2 139,0,0
-job_hunte.gat,83,68,1 duplicate(HntTrap) 91-3 139,0,0
-job_hunte.gat,83,69,1 duplicate(HntTrap) 91-4 139,0,0
-job_hunte.gat,96,66,1 duplicate(HntTrap) 92-1 139,0,0
-job_hunte.gat,96,67,1 duplicate(HntTrap) 92-2 139,0,0
-job_hunte.gat,97,66,1 duplicate(HntTrap) 92-3 139,0,0
-job_hunte.gat,97,67,1 duplicate(HntTrap) 92-4 139,0,0
-job_hunte.gat,100,68,1 duplicate(HntTrap) 93-1 139,0,0
-job_hunte.gat,100,69,1 duplicate(HntTrap) 93-2 139,0,0
-job_hunte.gat,101,68,1 duplicate(HntTrap) 93-3 139,0,0
-job_hunte.gat,101,69,1 duplicate(HntTrap) 93-4 139,0,0
-job_hunte.gat,107,66,1 duplicate(HntTrap) 94-1 139,1,0
-job_hunte.gat,107,67,1 duplicate(HntTrap) 94-2 139,1,0
-job_hunte.gat,109,67,1 duplicate(HntTrap) 94-3 139,0,0
-job_hunte.gat,109,66,1 duplicate(HntTrap) 94-4 139,0,0
-job_hunte.gat,117,69,1 duplicate(HntTrap) 95-1 139,1,0
-job_hunte.gat,117,68,1 duplicate(HntTrap) 95-2 139,1,0
-job_hunte.gat,119,69,1 duplicate(HntTrap) 95-3 139,0,0
-job_hunte.gat,119,68,1 duplicate(HntTrap) 95-4 139,0,0
-job_hunte.gat,124,66,1 duplicate(HntTrap) 96-1 139,0,0
-job_hunte.gat,124,67,1 duplicate(HntTrap) 96-2 139,0,0
-job_hunte.gat,125,66,1 duplicate(HntTrap) 96-3 139,0,0
-job_hunte.gat,125,67,1 duplicate(HntTrap) 96-4 139,0,0
-job_hunte.gat,126,70,1 duplicate(HntTrap) 97-1 139,0,0
-job_hunte.gat,126,71,1 duplicate(HntTrap) 97-2 139,0,0
-job_hunte.gat,127,70,1 duplicate(HntTrap) 97-3 139,0,0
-job_hunte.gat,127,71,1 duplicate(HntTrap) 97-4 139,0,0
+//===== eAthena Script =======================================
+//= Hunter Job Quest
+//===== By: ==================================================
+//= EREMES THE CANIVALIZER (Aegis)Translated by yoshiki (Aegis)
+//= Converted by kobra_k88
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 2.3a
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Hunter Job Quest converted from aegis script
+//===== Additional Comments: =================================
+//= 0.5 Fully working.
+//= 0.6 Changed global variable names to unique ones.
+//= 0.7 - 0.8 Updates for eAthena +Knight2,Crusader2 fix
+//= 0.9 Fixed items quest fork bug [Lupus]
+//= 1.0 Fixed items quest bug: added extra condition [Lupus]
+//= 1.1 Fixed skillpoints check bug [Lupus]
+//= 1.2 Fixed an exploit, thanks to nonox [celest]
+//= 1.3 Added Baby Class support [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 1.6a Infinite Arrows exploit fix (thanx to Lorky, that
+//= reported the bug) [Lupus]
+//= 1.7 Moved the Job QUest to Hugel [Poki#3]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Merged JFunc, fixed missing dialogues [Lupus]
+//= 2.2a Fixed Sharon resetting the test2 item set [Lupus]
+//= 2.3a 7 official sets of Demon Hunter,thx to Dr.Evil [Lupus]
+//= 2.4 Added missing next;, missing NPC names [Lupus]
+//============================================================
+
+//<====================================== Job Changer ========================================>\\
+hu_in01.gat,386,374,4 script Hunter Sharon 727,{
+ callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Sniper,"Sniper","Hunter Sharon";
+
+ mes "[Hunter Sharon]";
+ if(BaseJob == Job_Archer) goto L_Start;
+ if(BaseJob == Job_Novice){
+ mes "What's a novice like you doing here? Leave, we have nothing for you.";
+ emotion e_what;
+ close;
+ }
+ if(BaseJob == Job_Hunter){
+ mes "What up! "+strcharinfo(0)+" Why did you come back? Falcon run away or something? Te hehe.";
+ emotion e_heh;
+ next;
+ mes "[Hunter Sharon]";
+ mes "I hope you didn't think you could get free stuff from us just because your part of our guild now......";
+ close;
+ }
+ if(baseClass == Job_Swordman){
+ mes "A follower of the way of the blade! We have nothing for you here so please leave.";
+ close;
+ }
+ if(baseClass == Job_Mage){
+ mes "Hello mage type person. If you have no business here, please leave,";
+ close;
+ }
+ if(baseClass == Job_Thief){
+ mes "Eeep! There's nothing to steal here!! Leave us alone..... go rob an old lady or something......";
+ emotion e_omg;
+ close;
+ }
+ if(baseClass == Job_Acolyte){
+ mes "Good day, religious zealot! It's nice to meet you and all, but you have no buisiness here.";
+ close;
+ }
+ if(baseClass == Job_Merchant){
+ mes "Hey, how's buisiness? Perhaps if you want to sell something, go back to town.";
+ close;
+ }
+ mes "What are YOU doing here? Did you come to do a little song and dance... ke.. keke....kekekeHahahahhaha!!!";
+ emotion e_heh;
+ close;
+
+L_Start:
+ if(HNTR_Q == 1) goto L_Test2;
+ if(HNTR_Q == 2) goto L_Test3;
+ if(HNTR_Q == 3) goto L_Change;
+ if(HNTR_Q2 == 1) goto L_ReTest;
+ mes "Hey archer!! Hmmm....... You look like you've trained pretty hard.... I take it you're here to be a hunter!";
+ next;
+ menu "Of course!",M_0, "What are the requirements",M_1, "Not right now.",M_End;
+
+ M_0:
+ mes "[Hunter Sharon]";
+ mes "Heh, I knew it. First fill out this application form.";
+ next;
+ mes "(you fill out the form and hand it back)";
+ next;
+ mes "[Hunter Sharon]";
+ if(JobLevel < 40) goto sL_LowLvl;
+ if(JobLevel == 50) goto sL_HighLvl;
+ set JBLVL, 40;
+ mes "Looks good. Let me start off by introducing myself. My name is Sharon, nice to meet you.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Before I explain the process of becoming a Hunter, I'd like to do a short interview with you.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Do you want to do the interview now?";
+ next;
+ menu "Yeah, let's begin.",L_Test, "Nah, I'll come back in a bit.",M_End;
+
+ sL_LowLvl:
+ mes "Hmm... It looks like you'll need more training. To become a Hunter, you will have to have a great amount of experience.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Having a ^5533FFjob level of 40^000000 is what is required of all Hunter candidates. Please continue your training and good luck.";
+ close;
+ sL_HighLvl:
+ mes "Well, well now! A high level archer.... very nice! You must have trained really hard.";
+ emotion e_ic;
+ next;
+ mes "[Hunter Sharon]";
+ mes "My name is Sharon, nice to meet you. Before I explain the process of becoming a Hunter, I'd like to do a short interview with you.";
+ next;
+ set JBLVL, 50;
+ goto L_Test;
+ M_1:
+ mes "[Hunter Sharon]";
+ mes "The requirements?";
+ mes "1. Be an Archer";
+ mes "2. Have a Job Level of at least 40";
+ mes "3. Pass all of the tests";
+ next;
+ mes "[Hunter Sharon]";
+ mes "If you trained hard enough, you shouldn't have any problems becoming a Hunter.";
+ close;
+
+ M_End:
+ mes "[Hunter Sharon]";
+ mes "Ok, I'll see you later.";
+ close;
+
+
+ L_ReTest:
+ mes "Hmm.. what's this? So you wanna do the interview again? Very well. Hopefully you'll do better this time.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Okay, let's start!";
+ next;
+ L_Test:
+ set @score, 0;
+ mes "[Hunter Sharon]";
+ mes "I'm going to ask you some simple questions to get a feel for who you are and why you want to become a Hunter.";
+ mes "Relax and answer the questions honestly and thoughtfully.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "You've been an training for a while, and now you're running out of ideas about where to go hunt. What should you do?";
+ next;
+ menu "Walk around screaming, 'Where should i go hunt!?'",M_1b, "Ask someone politely.",-, "Just explore.",-;
+
+ set @score, @score + 10;
+ M_1b:
+
+ mes "[Hunter Sharon]";
+ mes "Okay, so you picked your hunting spot! You plan to go to the Sograt Desert to hunt Hodes.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "But you're in Payon! How do you get to the desert?";
+ next;
+ menu "Go beg priests for warps",M_2b, "Kafra warp",-, "Walk there with a friend",-;
+
+ set @score, @score + 10;
+ M_2b:
+
+ mes "[Hunter Sharon]";
+ mes "There are no priests around, all your friends are busy, and you don't have enough money for a kafra warp.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "How do you get the money?";
+ next;
+ menu "Beg",M_3b, "Sell useless items",-, "Go hunting in a nearby field",-;
+
+ set @score, @score + 10;
+ M_3b:
+
+ mes "[Hunter Sharon]";
+ mes "You somehow get to the desert, but now you feel too weak to hunt hodes.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "What do you do now??";
+ next;
+ menu "Go cliff hunting.",M_4b, "Go rest at Morroc.",-, "Start shooting the hodes that other people are attacking.",M_4b;
+
+ set @score, @score + 10;
+ M_4b:
+
+ mes "[Hunter Sharon]";
+ mes "It's too much, you can't do it. You go to Morroc.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "By the time you return to town, you have no hp left, but you see a priest. How do you ask for a heal?";
+ next;
+ menu "If it's ok, can i have a heal please?",-, "Heal please.",M_5b, "heal plz",M_5b;
+
+ set @score, @score + 10;
+ M_5b:
+
+ mes "[Hunter Sharon]";
+ mes "While hunting, you find a rare item. You go to the market to sell it, and find lots of people and chat rooms.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "What do you do to sell the item quicker?";
+ next;
+ menu "Go into preexisting chat rooms and ask",M_6b, "Make your own chat room.",-, "See if anyone is buying.",-;
+
+ set @score, @score + 10;
+ M_6b:
+
+ mes "[Hunter Sharon]";
+ mes "After a while, a person starts to beg you. What do you do?";
+ next;
+ menu "Give some items and money",M_7b, "Ignore that person",M_7b, "Tell them where to level and make money.",-;
+
+ set @score, @score + 10;
+ M_7b:
+
+ mes "[Hunter Sharon]";
+ mes "You decide to go hunting in the woods.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "But you find someone who's lost. What do you do?";
+ next;
+ menu "Give him/her directions.",-, "Personally escort him/her.",-, "Ignore that person.",M_8b;
+
+ set @score, @score + 10;
+ M_8b:
+
+ mes "[Hunter Sharon]";
+ mes "You take the person to a safe place and resume hunting. While hunting, you see someone fighting a mvp!";
+ next;
+ mes "[Hunter Sharon]";
+ mes "What do you do?";
+ next;
+ menu "Watch and attack if asked for help.",-, "Start attacking.",M_9b, "Return to town in panic.",M_9b;
+
+ set @score, @score + 10;
+ M_9b:
+
+ mes "[Hunter Sharon]";
+ mes "Now you're done hunting for the day.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "You find a rare item on the street while going back to town. What do you do?";
+ next;
+ menu "Finders keepers.",M_10b, "Try to find owner.",-, "Walk past it.",-;
+
+ set @score, @score + 10;
+ M_10b:
+
+ L_Score:
+ mes "[Hunter Sharon]";
+ mes "Now we're done!!";
+ next;
+ if(@score < 90) goto sL_Failed;
+ if(@score < 100) goto sL_90;
+
+ sL_100:
+ mes "[Hunter Sharon]";
+ mes "Great! Based on the answers you gave, you seem to be just the type of person we're looking for.";
+ emotion e_no1;
+ next;
+ mes "[Hunter Sharon]";
+ mes "With your kind of additude and values, you should have no problems becoming a Hunter.";
+ next;
+ mes "[Hunter Sharon]";
+ goto L_Test2;
+ sL_90:
+ mes "[Hunter Sharon]";
+ mes "You didn't do as well as I hoped, but I'll pass you.... Though I don't know what the guild master will think of you....";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Work hard on the next test. Make Sharon happy, okies?";
+ next;
+ mes "[Hunter Sharon]";
+ goto L_Test2;
+ sL_Failed:
+ mes "[Hunter Sharon]";
+ mes "I.......don't think I can pass you..... The way you live your life is...... well... unexecptable for a Hunter candidate.";
+ emotion e_swt;
+ next;
+ mes "[Hunter Sharon]";
+ mes "Think carefully about my questions and your answers. Working well with people is just as important as loving nature.";
+ set HNTR_Q2, 1;
+ close;
+
+L_Test2:
+ if(HNTR_Q==0){
+ set HNTR_Q, 1;
+ set HNTR_Q2, 0;
+ }
+ mes "What you have to do next is go see ^5533FFMr. Demon Hunter^000000 behind me. He'll tell you about the second test.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Good luck!";
+ close;
+
+L_Test3:
+ mes "Hmmm? The guild master? Oh, he's out right now.";
+ emotion e_hmm;
+ next;
+ mes "[Hunter Sharon]";
+ mes "If I remember correctly, he should be somewhere in Archer Village. I think he had to talk with someone in the ^5533FFArcher Guild^000000.";
+ close;
+
+L_Change:
+ if(skillpoint > 0) goto sL_SkPoints;
+ if(countitem(1007) < 1) goto sL_NotRdy;
+ mes "Huh? Did you pass the test?";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Congratulations!!";
+ emotion e_no1;
+ next;
+ mes "[Hunter Sharon]";
+ mes "Now I can change you into a Hunter!";
+ next;
+ mes "[Hunter Sharon]";
+ mes "There you go! You look great in the hunter outfit";
+
+ callfunc "Job_Change",Job_Hunter;
+ emotion e_no1;
+ next;
+ mes "[Hunter Sharon]";
+ mes "Now, for working so hard, the guild has a small reward for you.";
+ if(JBLVL == 50) getitem 1718, 1;
+ if(JBLVL != 50) getitem 1710, 1;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ next;
+ mes "[Hunter Sharon]";
+ mes "Do all of us here a favor, act responsibly, and love and respect nature! Good luck on your journey and remember you are always welcome here!";
+ next;
+ close;
+
+ sL_SkPoints:
+ mes "You still have skill points left over. Speak with me after you've used them up.";
+ close;
+ sL_NotRdy:
+ mes "[Hunter Sharon]";
+ mes "Hmmm, I received news of your success.... But you don't seem to have the ^5533FFNecklace of Wisdom^000000 as proof.";
+ emotion e_hmm;
+ next;
+ mes "[Hunter Sharon]";
+ mes "You will need the Necklace of Wisdom to become a Hunter. If you don't have it you will have to start the test over.";
+ next;
+ menu "Um... I've got it.... somewhere....",-, "Heh heh.... I must have misplaced it.....",sM_ReStart;
+
+ mes "[Hunter Sharon]";
+ mes "Well then go get it!";
+ emotion e_an;
+ close;
+ sM_ReStart:
+ mes "[Hunter Sharon]";
+ mes "..... That's just pathetic....... Have fun re-doing the ENTIRE TEST!";
+ emotion e_pif;
+ set HNTR_Q, 0;
+ set HNTR_Q2, 0;
+ close;
+}
+
+
+//<=========================== Demon Hunter: Second Test ===============================>\\
+hu_in01.gat,382,382,5 script Demon Hunter 732,{
+ if(BaseJob == Job_Archer) goto L_Arc;
+ if(BaseJob == Job_Hunter) goto L_Hnt;
+
+L_Other:
+ mes "[Demon Hunter]";
+ mes "They call me the Demon Hunter. What's that? You want to know why I'm called that?......";
+ next;
+ mes "[Demon Hunter]";
+ mes "heh... heh.... heh.....";
+ next;
+ mes "[Demon Hunter]";
+ mes "For your safety... it's best that you DON'T find out.....";
+ emotion e_gg;
+ close;
+
+L_Hnt:
+ mes "[Demon Hunter]";
+ mes "Look at you! Nice and spiffy in that Hunter's outfit. How does it feel? Good I bet. Well good luck to you.";
+ emotion e_gasp;
+ close;
+
+L_Arc:
+ mes "[Demon Hunter]";
+ if(HNTR_Q == 1 && HNTR_Q2 > 0) goto L_Check; //Fixed [Lupus]
+ if(HNTR_Q == 1) goto L_Start;
+ if(HNTR_Q == 2) goto L_Test3;
+ if(HNTR_Q == 3) goto L_Done;
+ mes "You'll have to speak with ^5533FFHunter Sharon^000000 first, if you want to become a hunter.";
+ close;
+L_Start:
+ mes "Hello, I'm the test examiner they call the Demon Hunter. Is ^5566FF"+strcharinfo(0)+"^000000 your name?";
+ next;
+ menu "Yes",M_Yes, "Uhhh.... no",M_No;
+
+ M_Yes:
+ mes "[Demon Hunter]";
+ mes "Good. Because we make the arrows used during some of the tests, we also need the materials to make those arrows.";
+ next;
+ mes "[Demon Hunter]";
+ mes "If you haven't noticed already, our guild is NOT as wealthy as some of the others. I mean we're in the middle of the freaking forest for pete sake....";
+ emotion e_ag;
+ next;
+ mes "[Demon Hunter]";
+ mes "Ehem... Like I was saying earlier we need certain materials to make our arrows. That is where Hunter wanna be's like you come in handy.";
+ mes "For this test you will have to gather the materials needed for making our arrows.";
+ next;
+ mes "[Demon Hunter]";
+ mes "Let's see... the items you need to gather are.....";
+ next;
+ set HNTR_Q2, rand(1,7);
+ L_Repeat:
+ mes "[Demon Hunter]";
+ switch(HNTR_Q2){
+ case 1:
+ mes "^5533FF3 Bill of Birds^000000 for arrow heads,";
+ mes "^5533FF5 Skel-Bones^000000 used here and there";
+ mes "and ^5533FF3 Green Herbs^000000.";
+ break;
+ case 2:
+ mes "^5533FF3 Venom Canine,";
+ mes "3 Animal Skins";
+ mes "and 5 Red Herbs^000000.";
+ break;
+ case 3:
+ mes "^5533FF3 Dokebi Horns,";
+ mes "3 Pieces of Egg Shell";
+ mes "and 10 Feathers^000000.";
+ break;
+ case 4:
+ mes "^5533FF9 Yellow Herbs,";
+ mes "9 Worm Peelings";
+ mes "and 9 Shells^000000.";
+ break;
+ case 5:
+ mes "^5533FF3 Tooths of Bat,";
+ mes "1 Sticky Mucus";
+ mes "and 1 Bears Foot Skin^000000.";
+ break;
+ case 6:
+ mes "^5533FF1 Yoyo Tail,";
+ mes "2 Porcupine Quills";
+ mes "and 1 Acorn^000000.";
+ break;
+ case 7:
+ mes "^5533FF3 White Herbs,";
+ mes "5 Trunks";
+ mes "and 5 Claws of Desert Wolf^000000.";
+ break;
+ }
+ next;
+ mes "[Demon Hunter]";
+ mes "When you get all of the items return!";
+ close;
+
+ M_No:
+ mes "[Demon Hunter]";
+ mes "Stop playing around "+strcharinfo(0)+", that's your name, right?";
+ next;
+ menu "Yes",M_Yes, "Uhhh no",sM_End;
+
+ sM_End:
+ mes "[Demon Hunter]";
+ mes "DON'T you mess around with me! If you're gonna fool around then LEAVE!";
+ emotion e_pif;
+ warp "hugel.gat", 207, 222;
+ end;
+
+L_Check:
+ mes "Yes?";
+ next;
+ switch(HNTR_Q2){
+ case 1:
+ if(countitem(925)<3 || countitem(932)<5 || countitem(511)<3) goto L_Repeat;
+ delitem 925, 3;
+ delitem 932, 5;
+ delitem 511, 3;
+ break;
+ case 2:
+ if(countitem(937)<3 || countitem(919)<3 || countitem(507)<5) goto L_Repeat;
+ delitem 937, 3;
+ delitem 919, 3;
+ delitem 507, 5;
+ break;
+ case 3:
+ if(countitem(1021)<3 || countitem(7032)<3 || countitem(949)<10) goto L_Repeat;
+ delitem 1021, 3;
+ delitem 7032, 3;
+ delitem 949, 10;
+ break;
+ case 4:
+ if(countitem(508)<9 || countitem(955)<9 || countitem(935)<9) goto L_Repeat;
+ delitem 508, 9;
+ delitem 955, 9;
+ delitem 935, 9;
+ break;
+ case 5:
+ if(countitem(913)<3 || countitem(938)<1 || countitem(948)<1) goto L_Repeat;
+ delitem 913, 3;
+ delitem 938, 1;
+ delitem 948, 1;
+ break;
+ case 6:
+ if(countitem(942)<1 || countitem(1027)<2 || countitem(1026)<1) goto L_Repeat;
+ delitem 942, 1;
+ delitem 1027, 2;
+ delitem 1026, 1;
+ break;
+ case 7:
+ if(countitem(509)<3 || countitem(1019)<5 || countitem(7030)<5) goto L_Repeat;
+ delitem 509, 3;
+ delitem 1019, 5;
+ delitem 7030, 5;
+ break;
+ }
+ mes "[Demon Hunter]";
+ mes "Good job. You brought all the necesarry items. Now go find the ^5533FFGuild Master^000000.";
+ mes "I think he's somewhere in the ^5533FFArcher Guild^000000. He'll give you your final test. Good luck.";
+ set HNTR_Q, 2;
+ set HNTR_Q2, 0;
+ close;
+
+L_Test3:
+ mes "Huh? Can't you find the guild master? He should be in the ^5533FFArcher Guild in Archer village^000000. Go find him.";
+ emotion e_hmm;
+ close;
+
+L_Done:
+ mes "Ah, you passed the test! Congrats, go see Sharin now.";
+ close;
+}
+
+
+//<=============================== Guild Master: Last Test =================================>\\
+payon_in02.gat,21,31,1 script Guild Master#03 59,{
+ if(BaseJob == Job_Archer) goto L_Archer;
+ if(BaseJob == Job_Hunter) goto L_Hnt;
+
+L_Other:
+ mes "[Hunter]";
+ mes "Is there something you want of me? I'm have some buisiness to take care of, so please be quiet.";
+ emotion e_hmm;
+ close;
+
+L_Hnt:
+ mes "[Guild Master]";
+ mes "Ah, it's you again, "+strcharinfo+"! Good to see you're well. Me? I'm still busy as usual.";
+ next;
+ mes "[Guild Master]";
+ mes "Well I've gota get back to work. Stay safe.";
+ close;
+
+L_Archer:
+ mes "[Guild Master]";
+ if(HNTR_Q == 1) goto L_Test2;
+ if(HNTR_Q == 2) goto L_Start;
+ if(HNTR_Q == 3) goto L_Done;
+ mes "You want to be a hunter bad, don't you? In my days, I worked for over a month to become a hunter, hehe.";
+ next;
+ mes "[Guild Master]";
+ mes "If you don't have anything else I suggest you go back to the guild!";
+ close;
+
+L_Start:
+ if(HNTR_Q2 == 1) goto L_ReTest;
+ if(HNTR_Q2 == 2) goto L_Passed;
+ mes "So, you've come to take the test? I see.... well then, do you have any questions before we get started?";
+ M_Menu:
+ next;
+ menu "What's the test about?",M_0, "Anything I should know?",M_1, "Start the test.",M_Start;
+
+ M_0:
+ mes "[Guild Master]";
+ mes "This is a test of speed, agility, and target recogniton. You will be warped to a room full of monsters.";
+ mes "You will have to ^5533FFkill 4^000000 of those monsters but not just any 4. You will need to kill the ones called, ^5533FFJob Change Monster^000000.";
+ next;
+ mes "[Guild Master]";
+ mes "Kill the wrong one and you will fail the test. To make things even harder, we have set traps all over the room.";
+ mes "Stepping on a trap will also result in failure.";
+ next;
+ mes "[Guild Master]";
+ mes "One more important note.... You must complete the test within ^FF55333 minutes^000000.";
+ next;
+ mes "[Guild Master]";
+ mes "This will teach you the important abilities a hunter needs, mobilitiy and tracking.";
+ goto M_Menu;
+ M_1:
+ mes "[Guild Master]";
+ mes "Only one person can take the test at time. If someone is currently taking the test, just enter the chat room and wait.";
+ mes "You will automatically be warped to the testing room when the other player either finishes or fails.";
+ next;
+ mes "[Guild Master]";
+ mes "Make sure you aim carefully. There will be a lot of monsters and you don't want to hit the wrong one.";
+ mes "Keeping track of the monsters' names will be very important in this test.";
+ next;
+ mes "[Guild Master]";
+ mes "And ALWAYS watch your step! There are traps everywhere!";
+ goto M_Menu;
+ M_Start:
+ if (countitem(1751) <= 5 && @HNTR_QA==0) callsub sF_GetArrows;
+ mes "[Guild Master]";
+ mes "Good luck, I'll send you to the test room now.";
+ next;
+ set HNTR_Q2, 1;
+ set @HNTR_QA,0;
+ savepoint "payon_in02.gat", 16, 26;
+ warp "job_hunte.gat", 176, 22;
+ end;
+
+ sF_GetArrows:
+ mes "[Guild Master]";
+ mes "This is where your hard work in the 2nd test payed off. Here are some arrows, made with the items you collected.";
+ getitem 1751, 200;
+ set @HNTR_QA,1;
+ next;
+ return;
+
+L_ReTest:
+ mes "Ah, you're one of the archers that failed. Here, let me heal you wounds...";
+ next;
+ mes "[Guild Master]";
+ mes "You're ready right?";
+ percentheal 100,100;
+ goto M_Menu;
+
+L_Passed:
+ mes "I see you suceeded. Great job! Now I will give you the proof of your success, the ^5533FFNecklace of Wisdom^000000.";
+ emotion e_no1;
+ next;
+ mes "[Guild Master]";
+ mes "Here you go. Make sure you show this to Hunter Sharon or you WON'T be able to become a Hunter.";
+ getitem 1007,1;
+ next;
+ mes "[Guild Master]";
+ mes "Anyway, I've got some work left to do here so I'll see you later.";
+ set HNTR_Q, 3;
+ set HNTR_Q2, 0;
+ close;
+
+L_Test2:
+ mes "Yes? What would a archer want from me? The guild didn't send me a msg about you.";
+ mes "Did you talk to the guild recruiters and get all the items needed? You have to get them the items first.";
+ close;
+L_Done:
+ mes "Hmm? What is it? Don't waste your time here, go on and become a Hunter already....";
+ close;
+
+}
+
+
+// Test Guide ====================================================
+job_hunte.gat,178,32,5 script Hunter Test Guide::HntTG 107,{
+
+L_Start:
+ mes "[Test Guide]";
+ mes "Welcome to the Hunter's testing arena.";
+ next;
+ menu "Take the test.",-, "I changed my mind.",M_End;
+
+ mes "[Test Guide]";
+ mes "Please enter the waiting room after hearing my explaination.";
+ next;
+ mes "[Test Guide]";
+ mes "You will be warped into room with traps and monsters. Avoid the traps and kill the monsters. Once you do, a switch will appear";
+ next;
+ mes "[Test Guide]";
+ mes "Use the switch to open an exit out of the arena. You will have 3 minutes to complete the test.";
+ next;
+ mes "[Test Guide]";
+ mes "If you get knocked out, get caught in a trap, or run out of time, you will fail the test and have to start over again.";
+ next;
+ mes "[Test Guide]";
+ mes "Don't worry about arrows, we'll provide them. So, if you're ready, go to the waiting room.";
+ close;
+ M_End:
+ mes "[Test Guide]";
+ mes "Alright, I'll send you back to Payon. Hopefully I'll see you again later. Don't forget to save!";
+ warp "payon_in02.gat", 16, 26;
+ end;
+
+OnInit:
+ waitingroom "Hunter Test Waiting Room", 8,"HntTG::OnStart",1;
+ end;
+
+OnStart:
+ set $@HntUsers, getareausers("job_hunte.gat", 50, 64, 123, 143);
+ if ($@HntUsers > 0) end; // stops the rest of the script from running if there is somebody taking the test
+
+ if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
+ killmonsterall "job_hunte.gat";
+ warpwaitingpc "job_hunte.gat", 90, 67;
+ donpcevent "Ev_HntRm::OnStart";
+ end;
+
+}
+
+
+// Ev_HntRm: Test room --------------------------------------------------------
+job_hunte.gat,1,1,1 script Ev_HntRm -1,{
+
+OnStart:
+ disablenpc "SwitchHnt";
+ disablenpc "ExitHnt";
+ set $@HntMob, 4;
+ // Real Monsters
+ monster "job_hunte.gat",67,80,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
+ monster "job_hunte.gat",114,78,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
+ monster "job_hunte.gat",89,127,"Job Change Monster",1002,1,"Ev_HntRm::OnMyMobDead1";
+ monster "job_hunte.gat",53,73,"Job Change Monster",1041,1,"Ev_HntRm::OnMyMobDead1";
+ monster "job_hunte.gat",125,70,"Job Change Monster",1016,1,"Ev_HntRm::OnMyMobDead1";
+ monster "job_hunte.gat",90,92,"Job Change Monster",1015,1,"Ev_HntRm::OnMyMobDead1";
+ donpcevent "Ev_HntRm2::OnStart";
+ initnpctimer "TimerHnt";
+ end;
+
+OnMyMobDead1:
+ set $@HntMob, $@HntMob - 1;
+ if($@HntMob != 0) end;
+
+ stopnpctimer "TimerHnt";
+ killmonsterall "job_hunte.gat";
+ enablenpc "SwitchHnt";
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Great job! Go use the switch now!",8;
+ end;
+
+}
+
+// Ev_HntRm2: Spawns the Decoy Monsters ----------------------------------------
+job_hunte.gat,1,1,1 script Ev_HntRm2 -1,{
+
+OnStart:
+ // Decoy Monsters
+ monster "job_hunte.gat",85,100,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",72,102,"Test Monster",1041,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",108,103,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",88,127,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",125,69,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat", 77, 112,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 106,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 73,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",125, 70,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",90, 91,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",67, 80,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",77, 112,"Test Monster",1016,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 106,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 73,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",125, 70,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",90, 91,"Test Monster",1041,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",85, 100,"Test Monster",1002,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",72, 102,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",108, 103,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",77, 112,"Test Monster",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",112, 139,"Vinnie Paul",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",112, 139,"Dimeback Darrel",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",112, 139,"Rex",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",112, 139,"Phillip Angelmo",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",90, 91,"Anolian",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 73,"monster sample",1002,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",53, 106,"I'm not the one you want >_>",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",77, 112,"SPARE ME~",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",72, 102,"Don't hurt me!",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ monster "job_hunte.gat",108, 103,"aspd 184",1015,1,"Ev_HntRm2::OnMyMobDead2";
+ end;
+
+OnMyMobDead2:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: You killed the wrong monster! You have failed the test!",8;
+ addtimer 3000, "TimerHnt::OnTimer196000";
+ end;
+}
+
+// Test Timer -----------------------------------------------------------------
+job_hunte.gat,1,1,1 script TimerHnt -1,{
+
+
+OnTimer500:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Remember, you need to kill the 'Job Change Monsters'!",8;
+ end;
+OnTimer4000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: Don't forget to AVOID the TRAPS!!!",8;
+ end;
+OnTimer10000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ******The clock will start now! 3 minutes left! ****** ",8;
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer40000:
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer70000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 2 minutes left! ****** ",8;
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer100000:
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer130000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 1 minute left! ****** ",8;
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer160000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: ****** 30 sec left! ****** ",8;
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer185000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 5 . . . .",8;
+ donpcevent "HntTG::OnStart";
+ end;
+OnTimer186000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 4. . . .",8;
+ end;
+OnTimer187000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 3. . .",8;
+ end;
+OnTimer188000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 2. .",8;
+ end;
+OnTimer189000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 1...",8;
+ end;
+OnTimer190000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: 0! ",8;
+ end;
+OnTimer193000:
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: You ran out of time! You can challenge again later!.",8;
+ end;
+OnTimer196000:
+ stopnpctimer;
+ areawarp "job_hunte.gat", 50, 64, 123, 143, "payon_in02.gat", 16, 26;
+ killmonsterall "job_hunte.gat";
+ donpcevent "HntTG::OnStart";
+ end;
+}
+
+// SwitchHnt ------------------------------------------------------
+job_hunte.gat,93,101,1 script SwitchHnt 723,{
+ areaannounce "job_hunte.gat", 50, 64, 123, 143, "[Test Guide]: *** The exit has been activated! You have 30 sec. to find the exit!! *** ",8;
+ enablenpc "ExitHnt";
+ addtimer 30000, "TimerHnt::OnTimer196000";
+ close;
+}
+
+// ExitHnt -----------------------------------------------------------
+job_hunte.gat,89,139,1 script ExitHnt 45,2,2,{
+
+ deltimer "TimerHnt::OnTimer196000";
+ set HNTR_Q2, 2;
+ warp "payon_in02.gat", 16, 26;
+ killmonsterall "job_hunte.gat";
+ donpcevent "HntTG::OnStart";
+ end;
+}
+
+
+// Hunter Test Traps =======================================
+
+job_hunte.gat,52,140,1 script 1-1::HntTrap 139,0,1,{
+ stopnpctimer "TimerHnt";
+ warp "payon_in02.gat", 16, 26;
+ killmonsterall "job_hunte.gat";
+ donpcevent "HntTG::OnStart";
+ end;
+}
+
+job_hunte.gat,53,140,1 duplicate(HntTrap) 1-2 139,0,1
+job_hunte.gat,54,141,1 duplicate(HntTrap) 1-3 139,0,0
+job_hunte.gat,55,141,1 duplicate(HntTrap) 1-4 139,0,0
+job_hunte.gat,55,140,1 duplicate(HntTrap) 1-5 139,0,0
+job_hunte.gat,54,140,1 duplicate(HntTrap) 1-6 139,0,0
+job_hunte.gat,52,138,1 duplicate(HntTrap) 1-7 139,0,0
+job_hunte.gat,53,138,1 duplicate(HntTrap) 1-8 139,0,0
+job_hunte.gat,62,140,1 duplicate(HntTrap) 2-1 139,0,1
+job_hunte.gat,63,140,1 duplicate(HntTrap) 2-2 139,0,1
+job_hunte.gat,64,140,1 duplicate(HntTrap) 2-3 139,0,0
+job_hunte.gat,64,141,1 duplicate(HntTrap) 2-4 139,0,0
+job_hunte.gat,65,140,1 duplicate(HntTrap) 2-5 139,0,0
+job_hunte.gat,65,141,1 duplicate(HntTrap) 2-6 139,0,0
+job_hunte.gat,62,138,1 duplicate(HntTrap) 2-7 139,0,0
+job_hunte.gat,63,138,1 duplicate(HntTrap) 2-8 139,0,0
+job_hunte.gat,72,140,1 duplicate(HntTrap) 3-1 139,0,1
+job_hunte.gat,73,140,1 duplicate(HntTrap) 3-2 139,0,1
+job_hunte.gat,72,138,1 duplicate(HntTrap) 3-3 139,0,0
+job_hunte.gat,72,138,1 duplicate(HntTrap) 3-4 139,0,0
+job_hunte.gat,78,140,1 duplicate(HntTrap) 4-1 139,0,0
+job_hunte.gat,78,141,1 duplicate(HntTrap) 4-2 139,0,0
+job_hunte.gat,79,140,1 duplicate(HntTrap) 4-3 139,0,0
+job_hunte.gat,79,141,1 duplicate(HntTrap) 4-4 139,0,0
+job_hunte.gat,82,138,1 duplicate(HntTrap) 5-1 139,0,0
+job_hunte.gat,82,139,1 duplicate(HntTrap) 5-2 139,0,0
+job_hunte.gat,83,138,1 duplicate(HntTrap) 5-3 139,0,0
+job_hunte.gat,83,139,1 duplicate(HntTrap) 5-4 139,0,0
+job_hunte.gat,99,138,1 duplicate(HntTrap) 6-1 139,1,0
+job_hunte.gat,99,139,1 duplicate(HntTrap) 6-2 139,1,0
+job_hunte.gat,101,138,1 duplicate(HntTrap) 6-3 139,0,0
+job_hunte.gat,101,139,1 duplicate(HntTrap) 6-4 139,0,0
+job_hunte.gat,106,140,1 duplicate(HntTrap) 7-1 139,0,1
+job_hunte.gat,107,140,1 duplicate(HntTrap) 7-2 139,0,1
+job_hunte.gat,106,138,1 duplicate(HntTrap) 7-3 139,0,0
+job_hunte.gat,107,138,1 duplicate(HntTrap) 7-4 139,0,0
+job_hunte.gat,112,140,1 duplicate(HntTrap) 8-1 139,0,0
+job_hunte.gat,112,141,1 duplicate(HntTrap) 8-2 139,0,0
+job_hunte.gat,113,140,1 duplicate(HntTrap) 8-3 139,0,0
+job_hunte.gat,113,141,1 duplicate(HntTrap) 8-4 139,0,0
+job_hunte.gat,116,140,1 duplicate(HntTrap) 9-1 139,0,0
+job_hunte.gat,116,141,1 duplicate(HntTrap) 9-2 139,0,0
+job_hunte.gat,117,140,1 duplicate(HntTrap) 9-3 139,0,0
+job_hunte.gat,117,141,1 duplicate(HntTrap) 9-4 139,0,0
+job_hunte.gat,120,138,1 duplicate(HntTrap) 10-1 139,0,0
+job_hunte.gat,120,139,1 duplicate(HntTrap) 10-2 139,0,0
+job_hunte.gat,121,138,1 duplicate(HntTrap) 10-3 139,0,0
+job_hunte.gat,121,139,1 duplicate(HntTrap) 10-4 139,0,0
+job_hunte.gat,126,139,1 duplicate(HntTrap) 11-1 139,0,2
+job_hunte.gat,127,139,1 duplicate(HntTrap) 11-2 139,0,2
+job_hunte.gat,126,136,1 duplicate(HntTrap) 11-3 139,0,0
+job_hunte.gat,127,136,1 duplicate(HntTrap) 11-4 139,0,0
+job_hunte.gat,52,134,1 duplicate(HntTrap) 12-1 139,0,1
+job_hunte.gat,53,134,1 duplicate(HntTrap) 12-2 139,0,1
+job_hunte.gat,52,132,1 duplicate(HntTrap) 12-3 139,0,0
+job_hunte.gat,53,132,1 duplicate(HntTrap) 12-4 139,0,0
+job_hunte.gat,124,130,1 duplicate(HntTrap) 13-1 139,0,0
+job_hunte.gat,124,131,1 duplicate(HntTrap) 13-2 139,0,0
+job_hunte.gat,125,130,1 duplicate(HntTrap) 13-3 139,0,0
+job_hunte.gat,125,131,1 duplicate(HntTrap) 13-4 139,0,0
+job_hunte.gat,64,128,1 duplicate(HntTrap) 14-1 139,0,0
+job_hunte.gat,64,129,1 duplicate(HntTrap) 14-2 139,0,0
+job_hunte.gat,65,128,1 duplicate(HntTrap) 14-3 139,0,0
+job_hunte.gat,65,129,1 duplicate(HntTrap) 14-4 139,0,0
+job_hunte.gat,68,126,1 duplicate(HntTrap) 15-1 139,0,0
+job_hunte.gat,68,127,1 duplicate(HntTrap) 15-2 139,0,0
+job_hunte.gat,69,126,1 duplicate(HntTrap) 15-3 139,0,0
+job_hunte.gat,69,127,1 duplicate(HntTrap) 15-4 139,0,0
+job_hunte.gat,75,128,1 duplicate(HntTrap) 16-1 139,1,0
+job_hunte.gat,75,129,1 duplicate(HntTrap) 16-2 139,1,0
+job_hunte.gat,77,128,1 duplicate(HntTrap) 16-3 139,0,0
+job_hunte.gat,77,129,1 duplicate(HntTrap) 16-4 139,0,0
+job_hunte.gat,82,126,1 duplicate(HntTrap) 17-1 139,0,0
+job_hunte.gat,82,127,1 duplicate(HntTrap) 17-2 139,0,0
+job_hunte.gat,83,126,1 duplicate(HntTrap) 17-3 139,0,0
+job_hunte.gat,83,127,1 duplicate(HntTrap) 17-4 139,0,0
+job_hunte.gat,96,128,1 duplicate(HntTrap) 18-1 139,0,0
+job_hunte.gat,96,129,1 duplicate(HntTrap) 18-2 139,0,0
+job_hunte.gat,97,128,1 duplicate(HntTrap) 18-3 139,0,0
+job_hunte.gat,97,129,1 duplicate(HntTrap) 18-4 139,0,0
+job_hunte.gat,100,126,1 duplicate(HntTrap) 19-1 139,0,0
+job_hunte.gat,100,127,1 duplicate(HntTrap) 19-2 139,0,0
+job_hunte.gat,101,126,1 duplicate(HntTrap) 19-3 139,0,0
+job_hunte.gat,101,127,1 duplicate(HntTrap) 19-4 139,0,0
+job_hunte.gat,106,128,1 duplicate(HntTrap) 20-1 139,0,0
+job_hunte.gat,106,129,1 duplicate(HntTrap) 20-2 139,0,0
+job_hunte.gat,107,128,1 duplicate(HntTrap) 20-3 139,0,0
+job_hunte.gat,107,129,1 duplicate(HntTrap) 20-4 139,0,0
+job_hunte.gat,112,126,1 duplicate(HntTrap) 21-1 139,0,0
+job_hunte.gat,112,127,1 duplicate(HntTrap) 21-2 139,0,0
+job_hunte.gat,113,126,1 duplicate(HntTrap) 21-3 139,0,0
+job_hunte.gat,113,127,1 duplicate(HntTrap) 21-4 139,0,0
+job_hunte.gat,126,126,1 duplicate(HntTrap) 22-1 139,0,0
+job_hunte.gat,126,127,1 duplicate(HntTrap) 22-2 139,0,0
+job_hunte.gat,127,126,1 duplicate(HntTrap) 22-3 139,0,0
+job_hunte.gat,127,127,1 duplicate(HntTrap) 22-4 139,0,0
+job_hunte.gat,52,122,1 duplicate(HntTrap) 23-1 139,0,1
+job_hunte.gat,52,122,1 duplicate(HntTrap) 23-2 139,0,1
+job_hunte.gat,53,120,1 duplicate(HntTrap) 23-3 139,1,0
+job_hunte.gat,54,121,1 duplicate(HntTrap) 23-4 139,0,0
+job_hunte.gat,55,121,1 duplicate(HntTrap) 23-5 139,0,0
+job_hunte.gat,55,120,1 duplicate(HntTrap) 23-6 139,0,0
+job_hunte.gat,66,120,1 duplicate(HntTrap) 24-1 139,0,0
+job_hunte.gat,66,121,1 duplicate(HntTrap) 24-2 139,0,0
+job_hunte.gat,67,120,1 duplicate(HntTrap) 24-3 139,0,0
+job_hunte.gat,67,121,1 duplicate(HntTrap) 24-4 139,0,0
+job_hunte.gat,114,118,1 duplicate(HntTrap) 25-1 139,0,0
+job_hunte.gat,114,119,1 duplicate(HntTrap) 25-2 139,0,0
+job_hunte.gat,115,118,1 duplicate(HntTrap) 25-3 139,0,0
+job_hunte.gat,115,119,1 duplicate(HntTrap) 25-4 139,0,0
+job_hunte.gat,124,120,1 duplicate(HntTrap) 26-1 139,0,1
+job_hunte.gat,125,120,1 duplicate(HntTrap) 26-2 139,0,1
+job_hunte.gat,124,118,1 duplicate(HntTrap) 26-3 139,0,0
+job_hunte.gat,125,118,1 duplicate(HntTrap) 26-4 139,0,0
+job_hunte.gat,66,116,1 duplicate(HntTrap) 27-1 139,0,0
+job_hunte.gat,66,117,1 duplicate(HntTrap) 27-2 139,0,0
+job_hunte.gat,67,116,1 duplicate(HntTrap) 27-3 139,0,0
+job_hunte.gat,67,117,1 duplicate(HntTrap) 27-4 139,0,0
+job_hunte.gat,76,114,1 duplicate(HntTrap) 28-1 139,0,0
+job_hunte.gat,76,115,1 duplicate(HntTrap) 28-2 139,0,0
+job_hunte.gat,77,114,1 duplicate(HntTrap) 28-3 139,0,0
+job_hunte.gat,77,115,1 duplicate(HntTrap) 28-4 139,0,0
+job_hunte.gat,82,116,1 duplicate(HntTrap) 29-1 139,0,0
+job_hunte.gat,82,117,1 duplicate(HntTrap) 29-2 139,0,0
+job_hunte.gat,83,116,1 duplicate(HntTrap) 29-3 139,0,0
+job_hunte.gat,83,117,1 duplicate(HntTrap) 29-4 139,0,0
+job_hunte.gat,86,114,1 duplicate(HntTrap) 30-1 139,0,0
+job_hunte.gat,86,115,1 duplicate(HntTrap) 30-2 139,0,0
+job_hunte.gat,87,114,1 duplicate(HntTrap) 30-3 139,0,0
+job_hunte.gat,87,115,1 duplicate(HntTrap) 30-4 139,0,0
+job_hunte.gat,92,115,1 duplicate(HntTrap) 31-1 139,1,0
+job_hunte.gat,92,114,1 duplicate(HntTrap) 31-2 139,1,0
+job_hunte.gat,90,115,1 duplicate(HntTrap) 31-3 139,0,0
+job_hunte.gat,102,116,1 duplicate(HntTrap) 32-1 139,0,0
+job_hunte.gat,102,117,1 duplicate(HntTrap) 32-2 139,0,0
+job_hunte.gat,103,116,1 duplicate(HntTrap) 32-3 139,0,0
+job_hunte.gat,103,117,1 duplicate(HntTrap) 32-4 139,0,0
+job_hunte.gat,114,114,1 duplicate(HntTrap) 33-1 139,0,0
+job_hunte.gat,114,115,1 duplicate(HntTrap) 33-2 139,0,0
+job_hunte.gat,115,114,1 duplicate(HntTrap) 33-3 139,0,0
+job_hunte.gat,115,115,1 duplicate(HntTrap) 33-4 139,0,0
+job_hunte.gat,54,110,1 duplicate(HntTrap) 34-1 139,0,1
+job_hunte.gat,55,110,1 duplicate(HntTrap) 34-2 139,0,1
+job_hunte.gat,54,108,1 duplicate(HntTrap) 34-3 139,0,0
+job_hunte.gat,55,108,1 duplicate(HntTrap) 34-4 139,0,0
+job_hunte.gat,64,112,1 duplicate(HntTrap) 35-1 139,0,0
+job_hunte.gat,64,113,1 duplicate(HntTrap) 35-2 139,0,0
+job_hunte.gat,65,112,1 duplicate(HntTrap) 35-3 139,0,0
+job_hunte.gat,65,113,1 duplicate(HntTrap) 35-4 139,0,0
+job_hunte.gat,80,110,1 duplicate(HntTrap) 36-1 139,0,0
+job_hunte.gat,80,111,1 duplicate(HntTrap) 36-2 139,0,0
+job_hunte.gat,81,110,1 duplicate(HntTrap) 36-3 139,0,0
+job_hunte.gat,81,111,1 duplicate(HntTrap) 36-4 139,0,0
+job_hunte.gat,90,108,1 duplicate(HntTrap) 37-1 139,0,6
+job_hunte.gat,91,108,1 duplicate(HntTrap) 37-2 139,0,5
+job_hunte.gat,91,102,1 duplicate(HntTrap) 37-3 139,0,0
+job_hunte.gat,98,109,1 duplicate(HntTrap) 38-1 139,0,2
+job_hunte.gat,99,109,1 duplicate(HntTrap) 38-2 139,0,2
+job_hunte.gat,103,109,1 duplicate(HntTrap) 38-3 139,3,0
+job_hunte.gat,103,108,1 duplicate(HntTrap) 38-4 139,3,0
+job_hunte.gat,97,106,1 duplicate(HntTrap) 39-1 139,2,0
+job_hunte.gat,96,107,1 duplicate(HntTrap) 39-2 139,1,0
+job_hunte.gat,94,108,1 duplicate(HntTrap) 39-3 139,0,1
+job_hunte.gat,95,109,1 duplicate(HntTrap) 39-4 139,0,0
+job_hunte.gat,95,108,1 duplicate(HntTrap) 40-1 139,0,0
+job_hunte.gat,94,106,1 duplicate(HntTrap) 40-2 139,0,0
+job_hunte.gat,96,102,1 duplicate(HntTrap) 40-3 139,0,3
+job_hunte.gat,97,102,1 duplicate(HntTrap) 40-4 139,0,3
+job_hunte.gat,95,98,1 duplicate(HntTrap) 41-1 139,2,0
+job_hunte.gat,94,99,1 duplicate(HntTrap) 42-1 139,1,0
+job_hunte.gat,92,98,1 duplicate(HntTrap) 43-1 139,0,0
+job_hunte.gat,112,110,1 duplicate(HntTrap) 44-1 139,0,0
+job_hunte.gat,112,111,1 duplicate(HntTrap) 44-2 139,0,0
+job_hunte.gat,113,110,1 duplicate(HntTrap) 44-3 139,0,0
+job_hunte.gat,113,111,1 duplicate(HntTrap) 44-4 139,0,0
+job_hunte.gat,126,108,1 duplicate(HntTrap) 45-1 139,0,1
+job_hunte.gat,127,108,1 duplicate(HntTrap) 45-2 139,0,1
+job_hunte.gat,126,106,1 duplicate(HntTrap) 45-3 139,0,0
+job_hunte.gat,126,106,1 duplicate(HntTrap) 45-4 139,0,0
+job_hunte.gat,53,102,1 duplicate(HntTrap) 46-1 139,1,1
+job_hunte.gat,55,102,1 duplicate(HntTrap) 46-2 139,0,1
+job_hunte.gat,53,100,1 duplicate(HntTrap) 46-3 139,1,0
+job_hunte.gat,55,100,1 duplicate(HntTrap) 46-4 139,0,0
+job_hunte.gat,64,106,1 duplicate(HntTrap) 47-1 139,0,0
+job_hunte.gat,64,107,1 duplicate(HntTrap) 47-2 139,0,0
+job_hunte.gat,65,106,1 duplicate(HntTrap) 47-3 139,0,0
+job_hunte.gat,65,107,1 duplicate(HntTrap) 47-4 139,0,0
+job_hunte.gat,66,100,1 duplicate(HntTrap) 48-1 139,0,0
+job_hunte.gat,66,101,1 duplicate(HntTrap) 48-2 139,0,0
+job_hunte.gat,67,100,1 duplicate(HntTrap) 48-3 139,0,0
+job_hunte.gat,67,101,1 duplicate(HntTrap) 48-4 139,0,0
+job_hunte.gat,86,106,1 duplicate(HntTrap) 49-1 139,0,1
+job_hunte.gat,87,106,1 duplicate(HntTrap) 49-2 139,0,1
+job_hunte.gat,82,104,1 duplicate(HntTrap) 49-3 139,5,0
+job_hunte.gat,81,105,1 duplicate(HntTrap) 49-4 139,4,0
+job_hunte.gat,76,105,1 duplicate(HntTrap) 50-1 139,0,0
+job_hunte.gat,76,104,1 duplicate(HntTrap) 50-2 139,0,0
+job_hunte.gat,78,101,1 duplicate(HntTrap) 50-3 139,0,2
+job_hunte.gat,79,101,1 duplicate(HntTrap) 50-4 139,0,2
+job_hunte.gat,76,99,1 duplicate(HntTrap) 51-1 139,1,0
+job_hunte.gat,77,98,1 duplicate(HntTrap) 51-2 139,2,0
+job_hunte.gat,74,99,1 duplicate(HntTrap) 51-3 139,0,0
+job_hunte.gat,74,98,1 duplicate(HntTrap) 51-4 139,0,0
+job_hunte.gat,82,100,1 duplicate(HntTrap) 53-1 139,0,0
+job_hunte.gat,82,101,1 duplicate(HntTrap) 53-2 139,0,0
+job_hunte.gat,83,100,1 duplicate(HntTrap) 53-3 139,0,0
+job_hunte.gat,83,101,1 duplicate(HntTrap) 53-4 139,0,0
+job_hunte.gat,106,104,1 duplicate(HntTrap) 54-1 139,0,0
+job_hunte.gat,106,105,1 duplicate(HntTrap) 54-2 139,0,0
+job_hunte.gat,107,104,1 duplicate(HntTrap) 54-3 139,0,0
+job_hunte.gat,107,105,1 duplicate(HntTrap) 54-4 139,0,0
+job_hunte.gat,112,104,1 duplicate(HntTrap) 55-1 139,0,1
+job_hunte.gat,113,104,1 duplicate(HntTrap) 55-2 139,0,1
+job_hunte.gat,112,102,1 duplicate(HntTrap) 55-3 139,0,0
+job_hunte.gat,113,102,1 duplicate(HntTrap) 55-4 139,0,0
+job_hunte.gat,54,92,1 duplicate(HntTrap) 56-1 139,0,0
+job_hunte.gat,54,93,1 duplicate(HntTrap) 56-2 139,0,0
+job_hunte.gat,55,92,1 duplicate(HntTrap) 56-3 139,0,0
+job_hunte.gat,55,93,1 duplicate(HntTrap) 56-4 139,0,0
+job_hunte.gat,52,90,1 duplicate(HntTrap) 56-5 139,0,0
+job_hunte.gat,52,91,1 duplicate(HntTrap) 56-6 139,0,0
+job_hunte.gat,53,90,1 duplicate(HntTrap) 56-7 139,0,0
+job_hunte.gat,53,91,1 duplicate(HntTrap) 56-8 139,0,0
+job_hunte.gat,64,92,1 duplicate(HntTrap) 57-1 139,0,0
+job_hunte.gat,64,93,1 duplicate(HntTrap) 57-2 139,0,0
+job_hunte.gat,65,92,1 duplicate(HntTrap) 57-3 139,0,0
+job_hunte.gat,65,93,1 duplicate(HntTrap) 57-4 139,0,0
+job_hunte.gat,76,94,1 duplicate(HntTrap) 58-1 139,0,0
+job_hunte.gat,76,95,1 duplicate(HntTrap) 58-2 139,0,0
+job_hunte.gat,77,94,1 duplicate(HntTrap) 58-3 139,0,0
+job_hunte.gat,77,95,1 duplicate(HntTrap) 58-4 139,0,0
+job_hunte.gat,78,92,1 duplicate(HntTrap) 59-1 139,0,0
+job_hunte.gat,78,93,1 duplicate(HntTrap) 59-2 139,0,0
+job_hunte.gat,79,92,1 duplicate(HntTrap) 59-3 139,0,0
+job_hunte.gat,79,93,1 duplicate(HntTrap) 59-4 139,0,0
+job_hunte.gat,86,92,1 duplicate(HntTrap) 60-1 139,0,0
+job_hunte.gat,86,93,1 duplicate(HntTrap) 60-2 139,0,0
+job_hunte.gat,87,92,1 duplicate(HntTrap) 60-3 139,0,0
+job_hunte.gat,87,93,1 duplicate(HntTrap) 60-4 139,0,0
+job_hunte.gat,90,96,1 duplicate(HntTrap) 61-1 139,0,0
+job_hunte.gat,90,97,1 duplicate(HntTrap) 61-2 139,0,0
+job_hunte.gat,91,96,1 duplicate(HntTrap) 61-3 139,0,0
+job_hunte.gat,91,97,1 duplicate(HntTrap) 61-4 139,0,0
+job_hunte.gat,99,95,1 duplicate(HntTrap) 62-1 139,1,0
+job_hunte.gat,99,94,1 duplicate(HntTrap) 62-2 139,1,0
+job_hunte.gat,101,94,1 duplicate(HntTrap) 62-3 139,0,1
+job_hunte.gat,100,93,1 duplicate(HntTrap) 62-4 139,0,0
+job_hunte.gat,100,92,1 duplicate(HntTrap) 63-1 139,0,0
+job_hunte.gat,101,92,1 duplicate(HntTrap) 63-2 139,0,0
+job_hunte.gat,102,98,1 duplicate(HntTrap) 64-1 139,0,0
+job_hunte.gat,102,99,1 duplicate(HntTrap) 64-2 139,0,0
+job_hunte.gat,103,98,1 duplicate(HntTrap) 64-3 139,0,0
+job_hunte.gat,103,99,1 duplicate(HntTrap) 64-4 139,0,0
+job_hunte.gat,102,90,1 duplicate(HntTrap) 65-1 139,0,0
+job_hunte.gat,102,91,1 duplicate(HntTrap) 65-2 139,0,0
+job_hunte.gat,103,90,1 duplicate(HntTrap) 65-3 139,0,0
+job_hunte.gat,103,91,1 duplicate(HntTrap) 65-4 139,0,0
+job_hunte.gat,114,96,1 duplicate(HntTrap) 66-1 139,0,0
+job_hunte.gat,114,97,1 duplicate(HntTrap) 66-2 139,0,0
+job_hunte.gat,115,96,1 duplicate(HntTrap) 66-3 139,0,0
+job_hunte.gat,115,97,1 duplicate(HntTrap) 66-4 139,0,0
+job_hunte.gat,112,90,1 duplicate(HntTrap) 67-1 139,0,0
+job_hunte.gat,112,91,1 duplicate(HntTrap) 67-2 139,0,0
+job_hunte.gat,113,90,1 duplicate(HntTrap) 67-3 139,0,0
+job_hunte.gat,113,91,1 duplicate(HntTrap) 67-4 139,0,0
+job_hunte.gat,125,97,1 duplicate(HntTrap) 68-1 139,1,0
+job_hunte.gat,125,96,1 duplicate(HntTrap) 68-2 139,1,0
+job_hunte.gat,127,96,1 duplicate(HntTrap) 68-3 139,0,0
+job_hunte.gat,127,97,1 duplicate(HntTrap) 68-4 139,0,0
+job_hunte.gat,52,86,1 duplicate(HntTrap) 69-1 139,0,0
+job_hunte.gat,52,87,1 duplicate(HntTrap) 69-2 139,0,0
+job_hunte.gat,53,86,1 duplicate(HntTrap) 69-3 139,0,0
+job_hunte.gat,53,87,1 duplicate(HntTrap) 69-4 139,0,0
+job_hunte.gat,66,88,1 duplicate(HntTrap) 70-1 139,0,0
+job_hunte.gat,66,89,1 duplicate(HntTrap) 70-2 139,0,0
+job_hunte.gat,67,88,1 duplicate(HntTrap) 70-3 139,0,0
+job_hunte.gat,67,89,1 duplicate(HntTrap) 70-4 139,0,0
+job_hunte.gat,114,84,1 duplicate(HntTrap) 71-1 139,0,0
+job_hunte.gat,114,85,1 duplicate(HntTrap) 71-2 139,0,0
+job_hunte.gat,115,84,1 duplicate(HntTrap) 71-3 139,0,0
+job_hunte.gat,115,85,1 duplicate(HntTrap) 71-4 139,0,0
+job_hunte.gat,126,86,1 duplicate(HntTrap) 72-1 139,0,0
+job_hunte.gat,126,87,1 duplicate(HntTrap) 72-2 139,0,0
+job_hunte.gat,127,86,1 duplicate(HntTrap) 72-3 139,0,0
+job_hunte.gat,127,87,1 duplicate(HntTrap) 72-4 139,0,0
+job_hunte.gat,54,80,1 duplicate(HntTrap) 73-1 139,0,1
+job_hunte.gat,55,80,1 duplicate(HntTrap) 73-2 139,0,1
+job_hunte.gat,55,80,1 duplicate(HntTrap) 73-3 139,0,0
+job_hunte.gat,55,78,1 duplicate(HntTrap) 73-4 139,0,0
+job_hunte.gat,64,82,1 duplicate(HntTrap) 74-1 139,0,1
+job_hunte.gat,65,82,1 duplicate(HntTrap) 74-2 139,0,1
+job_hunte.gat,64,80,1 duplicate(HntTrap) 74-3 139,0,0
+job_hunte.gat,65,80,1 duplicate(HntTrap) 74-4 139,0,0
+job_hunte.gat,66,78,1 duplicate(HntTrap) 75-1 139,0,0
+job_hunte.gat,66,79,1 duplicate(HntTrap) 75-2 139,0,0
+job_hunte.gat,67,78,1 duplicate(HntTrap) 75-3 139,0,0
+job_hunte.gat,67,79,1 duplicate(HntTrap) 75-4 139,0,0
+job_hunte.gat,74,78,1 duplicate(HntTrap) 76-1 139,0,0
+job_hunte.gat,74,79,1 duplicate(HntTrap) 76-2 139,0,0
+job_hunte.gat,75,78,1 duplicate(HntTrap) 76-3 139,0,0
+job_hunte.gat,75,79,1 duplicate(HntTrap) 76-4 139,0,0
+job_hunte.gat,78,80,1 duplicate(HntTrap) 77-1 139,0,0
+job_hunte.gat,78,81,1 duplicate(HntTrap) 77-2 139,0,0
+job_hunte.gat,79,80,1 duplicate(HntTrap) 77-3 139,0,0
+job_hunte.gat,79,81,1 duplicate(HntTrap) 77-4 139,0,0
+job_hunte.gat,82,78,1 duplicate(HntTrap) 78-1 139,0,0
+job_hunte.gat,82,79,1 duplicate(HntTrap) 78-2 139,0,0
+job_hunte.gat,83,78,1 duplicate(HntTrap) 78-3 139,0,0
+job_hunte.gat,83,79,1 duplicate(HntTrap) 78-4 139,0,0
+job_hunte.gat,94,78,1 duplicate(HntTrap) 79-1 139,0,0
+job_hunte.gat,94,79,1 duplicate(HntTrap) 79-2 139,0,0
+job_hunte.gat,95,78,1 duplicate(HntTrap) 79-3 139,0,0
+job_hunte.gat,95,79,1 duplicate(HntTrap) 79-4 139,0,0
+job_hunte.gat,101,80,1 duplicate(HntTrap) 80-1 139,1,0
+job_hunte.gat,101,81,1 duplicate(HntTrap) 80-2 139,1,0
+job_hunte.gat,103,81,1 duplicate(HntTrap) 80-3 139,0,0
+job_hunte.gat,103,80,1 duplicate(HntTrap) 80-4 139,0,0
+job_hunte.gat,104,78,1 duplicate(HntTrap) 81-1 139,0,0
+job_hunte.gat,104,79,1 duplicate(HntTrap) 81-2 139,0,0
+job_hunte.gat,105,78,1 duplicate(HntTrap) 81-3 139,0,0
+job_hunte.gat,105,79,1 duplicate(HntTrap) 81-4 139,0,0
+job_hunte.gat,110,78,1 duplicate(HntTrap) 82-1 139,0,0
+job_hunte.gat,110,79,1 duplicate(HntTrap) 82-2 139,0,0
+job_hunte.gat,111,78,1 duplicate(HntTrap) 82-3 139,0,0
+job_hunte.gat,111,79,1 duplicate(HntTrap) 82-4 139,0,0
+job_hunte.gat,114,80,1 duplicate(HntTrap) 83-1 139,0,0
+job_hunte.gat,114,81,1 duplicate(HntTrap) 83-2 139,0,0
+job_hunte.gat,115,80,1 duplicate(HntTrap) 83-3 139,0,0
+job_hunte.gat,115,81,1 duplicate(HntTrap) 83-4 139,0,0
+job_hunte.gat,124,78,1 duplicate(HntTrap) 84-1 139,0,0
+job_hunte.gat,124,79,1 duplicate(HntTrap) 84-2 139,0,0
+job_hunte.gat,125,78,1 duplicate(HntTrap) 84-3 139,0,0
+job_hunte.gat,125,79,1 duplicate(HntTrap) 84-4 139,0,0
+job_hunte.gat,126,82,1 duplicate(HntTrap) 85-1 139,0,0
+job_hunte.gat,126,83,1 duplicate(HntTrap) 85-2 139,0,0
+job_hunte.gat,127,82,1 duplicate(HntTrap) 85-3 139,0,0
+job_hunte.gat,127,83,1 duplicate(HntTrap) 85-4 139,0,0
+job_hunte.gat,52,68,1 duplicate(HntTrap) 86-1 139,0,1
+job_hunte.gat,53,68,1 duplicate(HntTrap) 86-2 139,0,1
+job_hunte.gat,52,66,1 duplicate(HntTrap) 86-3 139,0,0
+job_hunte.gat,53,66,1 duplicate(HntTrap) 86-4 139,0,0
+job_hunte.gat,54,70,1 duplicate(HntTrap) 87-1 139,0,1
+job_hunte.gat,55,70,1 duplicate(HntTrap) 87-2 139,0,1
+job_hunte.gat,54,68,1 duplicate(HntTrap) 87-3 139,0,0
+job_hunte.gat,55,68,1 duplicate(HntTrap) 87-4 139,0,0
+job_hunte.gat,59,66,1 duplicate(HntTrap) 88-1 139,1,0
+job_hunte.gat,59,67,1 duplicate(HntTrap) 88-2 139,1,0
+job_hunte.gat,61,67,1 duplicate(HntTrap) 88-3 139,0,0
+job_hunte.gat,61,66,1 duplicate(HntTrap) 88-4 139,0,0
+job_hunte.gat,68,68,1 duplicate(HntTrap) 89-1 139,0,1
+job_hunte.gat,69,68,1 duplicate(HntTrap) 89-2 139,0,1
+job_hunte.gat,68,66,1 duplicate(HntTrap) 89-3 139,0,0
+job_hunte.gat,69,66,1 duplicate(HntTrap) 89-4 139,0,0
+job_hunte.gat,76,66,1 duplicate(HntTrap) 90-1 139,0,0
+job_hunte.gat,76,67,1 duplicate(HntTrap) 90-2 139,0,0
+job_hunte.gat,77,66,1 duplicate(HntTrap) 90-3 139,0,0
+job_hunte.gat,77,67,1 duplicate(HntTrap) 90-4 139,0,0
+job_hunte.gat,82,68,1 duplicate(HntTrap) 91-1 139,0,0
+job_hunte.gat,82,69,1 duplicate(HntTrap) 91-2 139,0,0
+job_hunte.gat,83,68,1 duplicate(HntTrap) 91-3 139,0,0
+job_hunte.gat,83,69,1 duplicate(HntTrap) 91-4 139,0,0
+job_hunte.gat,96,66,1 duplicate(HntTrap) 92-1 139,0,0
+job_hunte.gat,96,67,1 duplicate(HntTrap) 92-2 139,0,0
+job_hunte.gat,97,66,1 duplicate(HntTrap) 92-3 139,0,0
+job_hunte.gat,97,67,1 duplicate(HntTrap) 92-4 139,0,0
+job_hunte.gat,100,68,1 duplicate(HntTrap) 93-1 139,0,0
+job_hunte.gat,100,69,1 duplicate(HntTrap) 93-2 139,0,0
+job_hunte.gat,101,68,1 duplicate(HntTrap) 93-3 139,0,0
+job_hunte.gat,101,69,1 duplicate(HntTrap) 93-4 139,0,0
+job_hunte.gat,107,66,1 duplicate(HntTrap) 94-1 139,1,0
+job_hunte.gat,107,67,1 duplicate(HntTrap) 94-2 139,1,0
+job_hunte.gat,109,67,1 duplicate(HntTrap) 94-3 139,0,0
+job_hunte.gat,109,66,1 duplicate(HntTrap) 94-4 139,0,0
+job_hunte.gat,117,69,1 duplicate(HntTrap) 95-1 139,1,0
+job_hunte.gat,117,68,1 duplicate(HntTrap) 95-2 139,1,0
+job_hunte.gat,119,69,1 duplicate(HntTrap) 95-3 139,0,0
+job_hunte.gat,119,68,1 duplicate(HntTrap) 95-4 139,0,0
+job_hunte.gat,124,66,1 duplicate(HntTrap) 96-1 139,0,0
+job_hunte.gat,124,67,1 duplicate(HntTrap) 96-2 139,0,0
+job_hunte.gat,125,66,1 duplicate(HntTrap) 96-3 139,0,0
+job_hunte.gat,125,67,1 duplicate(HntTrap) 96-4 139,0,0
+job_hunte.gat,126,70,1 duplicate(HntTrap) 97-1 139,0,0
+job_hunte.gat,126,71,1 duplicate(HntTrap) 97-2 139,0,0
+job_hunte.gat,127,70,1 duplicate(HntTrap) 97-3 139,0,0
+job_hunte.gat,127,71,1 duplicate(HntTrap) 97-4 139,0,0
diff --git a/npc/jobs/2-1/knight.txt b/npc/jobs/2-1/knight.txt
index 992bb6b53..dfad3c601 100644
--- a/npc/jobs/2-1/knight.txt
+++ b/npc/jobs/2-1/knight.txt
@@ -1,1866 +1,1866 @@
-//===== eAthena Script =======================================
-//= Knight Job Quest
-//===== By: ==================================================
-//= PGRO TEAM (Aegis).
-//= Converted by kobra_k88
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Official RO Knight job quest converted from aegis script, and my own
-//= RO screenies and play experience
-//===== Additional Comments: =================================
-//= 1.0 Fully working. Please comment out any pre-existing warps for the
-//= test rooms in any other files so that the ones specified here can work.
-//= 1.1 Fixed a major bug. Now using the initnpctimer command,
-//= donpcevent, and new waitingroom event commands. No more addtimer
-//= spamming. No longer have to talk to the npc to take the test. Just enter the chat room.
-//= 1.2 More bug fixes. Changed global variable names to unique ones.
-//= Added second set of items to first test. Added Awake pots award for job change.
-//= 1.3 Added Baby Class support [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Merged JFunc [Lupus]
-//============================================================
-
-
-
-//<------------------------------------------------------------------------------------ Chivalry Captain Herman------------------------------------------------------------------------------------------>\\
-prt_in.gat,88,101,3 script Chivalry Captain Herman 56,{
- callfunc "F_BlockHigh",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Lord Knight","Chivalry Captain Herman";
-
- if (BaseJob == Job_Swordman && KNIGHT_Q > 0) goto L_Check;
-
- mes "[Chivalry Captain Herman]";
- mes "Good Day. This is the Prontera Chivarly, home of the famous Prontera Knights.";
-M_Menu:
- next;
- menu "I am ready for Knighthood.",M_0,"The Requirements.",M_1,"Quit.",M_End;
-
- M_0:
- mes "[Chivalry Captain Herman]";
-
- if(BaseJob != Job_Swordman){
- if(BaseJob == Job_Knight){
- mes "...(sighs)...what are you doing here WASTING my time?? GO FORTH!!, and continue protecting Rune Midgard my young Knight.";
- emotion e_pif;
- close;
- }
- if(BaseJob == Job_Novice){
- mes "Hahahaha!! You have no job experience what so ever and yet you stumble in here asking to be a knight. Hahahaha!!";
- emotion e_heh;
- next;
- mes "[Chivalry Captain Herman]";
- mes "You must first become a Swordsman before even thinking about becoming a Knight. Now scurry along little novice. Hahahahaha!!!";
- close;
- }
- mes "I'm sorry but only Swordsmen can become Knights.";
- close;
- }
- mes "Well then, first fill out this application form....";
- next;
- mes "...(you fill out the form and hand it back)...";
- next;
- mes "[Chivalry Captain Herman]";
- if(JobLevel < 40){
- mes "Hmm...it looks like you have not reached Job Level 40 yet. Please come back when you do. I shall be waiting here.";
- close;
- }
- mes "Impressive. You have the job qualifications to become a knight..., however you will need much more than that to actually become one.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "In order to become a Knight one must posses great strength, courage, determination, and strong desire to help others.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "You will have to show me that you have these attributes before I can make you a knight.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "The 6 Knights you see around the room have each prepapred a unique test for would be Knights to take.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "You must complete each one of their test and prove to me that you are truly committed to becomming a knight!";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Speak with ^0000ffSir Andrew Syloc^000000. He will give you your first test. Good luck!! I expect to see you again soon!";
- set KNIGHT_Q, 1;
- set JBLVL, 40;
- close;
-
- M_1:
- mes "[Chivalry Captain Herman]";
- mes "The first requirement for becoming a Knight is that you must be a Swordsman.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "The second requirement is that you must have at least a Job Level of 40.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "The last requirement is that you will need to pass 6 tests that will determine whether or not you are worthy enough to become a Knight.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "These requirements may seem difficult, but the Knight class is an elite and noble job class and only the best candidates may join.";
- goto M_Menu;
-
- M_End:
- close;
-
-L_Check:
- mes "[Chivalry Captain Herman]";
- if (KNIGHT_Q == 1) mes "Please speak with ^0000ffSir Andrew Syloc^000000. He will give you your first test.";
- if (KNIGHT_Q == 2) mes "Congratulations on finishing your first test. ^0000ffSir James Syracuse^000000 will administer your ^ff0000second test^000000.";
- if (KNIGHT_Q == 3) mes "Congratulations on finishing the second test. ^0000ffSir Windsor^000000 will administer your ^ff0000third test^000000.";
- if (KNIGHT_Q == 4) mes "Congratulations on finishing the third test. ^0000ffLady Amy Beatris^000000 will administer your ^ff0000fourth test^000000.";
- if (KNIGHT_Q == 5) mes "Congratulations on finishing the fourth test. ^0000ffSir Edmund^000000 will administer your ^ff0000fifth test^000000.";
- if (KNIGHT_Q == 6) mes "Congratulations on finishing the fifth test. ^0000ffSir Grey^000000 will administer your ^ff0000sixth test^000000.";
- if (KNIGHT_Q == 7) goto L_MakeKnight;
- next;
- mes "[Chivalry Captain Herman]";
- mes "Good luck!";
- close;
-
- L_MakeKnight:
- if(SkillPoint > 0) goto sL_SKpoint;
-
- mes "Oh, ^ff0000"+strcharinfo(0)+"^000000. So you've passed Sir Grey's test?";
- mes "Let me just say that I applaud all of your hard work and your determination.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "The final step to become a Knight is to recieve a recomondation from all six of the Knights who tested you.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Let's start with Sir Andrew Syloc. Sir Syloc, what is your opinion of Knight candidate, ^ff0000"+strcharinfo(0)+"^000000.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "Patience is a quality all Knights must have. By passing my test, ^ff0000"+strcharinfo(0)+"^000000 showed great patience and determination.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "In my opinion ^ff0000"+strcharinfo(0)+"^000000 is deserving of becoming a Knight!";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Very good Sir Syloc. Sir James Syracuse, what say you?";
- next;
- mes "[Sir James Syracuse]";
- mes "^ff0000"+strcharinfo(0)+"^000000 was albe to answer everyone of my questions correctly.";
- mes "This displays a mastery of the basic concepts of the Knight class.";
- next;
- mes "[Sir James Syracuse]";
- mes "^ff0000"+strcharinfo(0)+"^000000 has my recomendation for Knighthood!";
- next;
- mes "[Chivalry Captain Herman]";
- mes "I see Sir Syracuse. Sir Winsor what do you have to say?";
- next;
- mes "[Sir Winsor]";
- mes "..............................";
- next;
- mes "[Sir Winsor]";
- mes "Hmphf. I have no objections.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Hahaha! You never waste words do you Sir Winsor. What are your thoughts Lady Amy Beatris?";
- next;
- mes "[Lady Amy Beatris]";
- mes "A Knight will be involved in many different kinds of situations on his/her journey.";
- mes "It is a Knight's duty to make the right decisions in dealing with these situations.";
- next;
- mes "[Lady Amy Beatris]";
- mes "^ff0000"+strcharinfo(0)+"^000000 showed good decision making in answering my questions.";
- mes "I too recomend that this candidate be Knighted!";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Thank you Lady Beatris. How about you Sir Edmund?";
- next;
- mes "[Sir Edmund]";
- mes "A rock is an unchanging figure that never wavers in the face of adversity.";
- next;
- mes "[Sir Edmund]";
- mes "Though mighty winds may try to knock it down and crashing waves may try to wash it away, a rock will stand solid and firm.";
- next;
- mes "[Sir Edmund]";
- mes "^ff0000"+strcharinfo(0)+"^000000 showed the strength of a rock and was ever calm durring my test.";
- mes "It is my honest belief that ^ff0000"+strcharinfo(0)+"^000000 should be bestowed with Knighthood.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "As always Sir Edmund, a very profound observation. Well we're down to the last tester. Sir Grey, please give us your final desicion.";
- next;
- mes "[Sir Grey]";
- mes "What can I say. ^ff0000"+strcharinfo(0)+"^000000 answered my questions thoughtfully and truthfully.";
- next;
- mes "[Sir Grey]";
- mes "Though others may think that a Knight's strength lies within his/her sword, we Knights know that true strength lies within ones mind and heart.";
- next;
- mes "[Sir Grey]";
- if(sex==1) mes "After speaking to ^ff0000"+strcharinfo(0)+"^000000, I felt that he had this strength within him.";
- if(sex==0) mes "After speaking to ^ff0000"+strcharinfo(0)+"^000000, I felt that she had this strength within her.";
- mes "I would be happy to give ^ff0000"+strcharinfo(0)+"^000000 my recomendation to become a Knight!";
- next;
- mes "[Chivalry Captain Herman]";
- mes "Many thanks Sir Grey, and many thanks to all of you for your time. Well it looks like it was a unanimous decision.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "The process to become a Knight is very rigorous and difficult and yet you were able to successfully make it through.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "You have done extremely well and therefore are deserving of the honor of being called a Knight.";
- next;
- mes "[Chivalry Captain Herman]";
- mes "^ff0000"+strcharinfo(0)+"^000000, in the name of King Tristin the 3rd, ruler of the kingdom of Run-Midgard, I hereby bestow upon thee the title of Knight!";
- next;
- callfunc "Job_Change",Job_Knight;
- if(JBLVL != 50) getitem 656, 3;
- if(JBLVL == 50) getitem 656, 7;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Chivalry Captain Herman]";
- mes "Congratulations!! You are now a fellow Knight and protector of Rune-Midgard! Now go forth and make Rune-Midgard a better place to live!";
- emotion e_no1;
- close;
-
- sL_SKpoint:
- mes "Please use up all of your skill points so that I can make you a Knight.";
- emotion e_ic;
- close;
-}
-
-
-//<--------------------------------------------------------------------------------- Sir Andrew Syloc (1st test) ------------------------------------------------------------------------------------------>\\
-prt_in.gat,75,107,4 script Sir Andrew Syloc 65,{
- mes "[Sir Andrew Syloc]";
- if (BaseJob == Job_Knight) goto L_Knight;
- if (BaseJob == Job_Novice) goto L_Novice;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 1) goto L_Test;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 2) goto L_Done;
-L_Other:
- mes "We Knights of Prontera battle for peace and freedom! We fight to ensure a prosperous future for the people of Rune-Midgard!";
- close;
-L_Novice:
- mes "Oh, its a novice. Welcome to the Prontera Chivalry!";
- next;
- mes "[Sir Andrew Syloc]";
- mes "Even though you feel weak now, I assure you that once you get your first job, you will feel confident and strong.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "Just stay safe and keep out of trouble.";
- close;
-L_Knight:
- mes "Oh, your one of us, how are you doing?";
- next;
- mes "[Sir Andrew Syloc]";
- mes "It's important that you get the right equipment. It will allow you fight a lot of monsters and inturn get a lot of zeny.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "You should remember though, that being a Knight isn't about amassing wealth.";
- close;
-
-
-L_Test:
- if (KNIGHT_Q2 > 0) goto L_Check;
- mes "Oh so you've come to join the Prontera Chivalry have you. Let's see, you're ^ff0000" + strcharinfo(0) + "^000000 right?";
- next;
- mes "[Sir Andrew Syloc]";
- mes "My name is Andrew Syloc and I am one of the knights in the Prontera Knight Guild.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "I will be giving you the first of many tests that will determine if you have what it takes to become a Knight.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "This first test is like a scavenger hunt and will test your knowledge of monsters and their locations.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "This infrormation is vital for a Knight's ability to properly defend the many different towns in Rune-Midgard.";
- next;
- menu "I'm ready.",M_1, "Give me time.",M_End;
-
- M_1:
- mes "[Sir Andrew Syloc]";
- if (joblevel == 50) goto sL_Skip;
- mes "To pass this test you will need to gather:";
- set KNIGHT_Q2, rand(1,2);
- if(KNIGHT_Q2 == 1) callsub sF_R1;
- if(KNIGHT_Q2 == 2) callsub sF_R2;
- next;
- mes "[Sir Andrew Syloc]";
- mes "When you have all of those items, return here and give them to me.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "Good luck and be carefull! I shall await your return.";
- close;
-
- sF_R1:
- mes "^5533FF5 Elder Pixie's Mustache,"; //1040
- mes "5 Wings of Red Bat"; //7006
- mes "5 Orcish Vouchers"; //931
- mes "5 Moth Dust"; //1057
- mes "5 Reptile Tongues^000000"; //903
- mes "and ^5533FF5 Manes^000000."; //1028
- return;
- sF_R2:
- mes "^5533FF5 Bug Legs";
- mes "5 Heart of Mermaid";
- mes "5 Snail's Shells";
- mes "5 Clam Flesh";
- mes "5 Old Frying Pans^000000";
- mes "and ^5533FF5 Maneater Blossoms^000000.";
- return;
-
- sL_Skip:
- mes "Wait..... what's this?";
- next;
- mes "[Sir Andrew]";
- mes "You seem to be an increadibly strong swordsman. Yes, your strength and skill are amazing.";
- next;
- mes "[Sir Andrew]";
- mes "Hahaha! There's no need for you to take my test. Why don't you go onto the next one ok.";
- next;
- mes "[Sir Andrew]";
- mes "Speak to ^5533FFSir James Syracuse^000000. The tests you will be taking will teach you valuable life lessons, so please try hard.";
- set KNIGHT_Q, 2;
- set KNIGHT_Q2, 0;
- set JBLVL, 50;
- close;
-
- M_End:
- mes "[Sir Andrew Syloc]";
- mes "Take as much time as you need. Come back when you're ready.";
- close;
-
-L_Check:
- mes "You've come back ^ff0000"+strcharinfo(0)+"^000000. Did you get all of the items I asked for?";
- next;
- if(KNIGHT_Q2 == 2) goto L_2;
-
- L_1:
- if(countitem(1040)<5 || countitem(7006)<5 || countitem(931)<5 || countitem(1057)<5 || countitem(903)<5 || countitem(1028)<5) goto L_NotDone;
- delitem 1040,5;
- delitem 7006,5;
- delitem 931,5;
- delitem 1057,5;
- delitem 903,5;
- delitem 1028,5;
- goto L_Cont;
-
- L_2:
- if(countitem(1042)<5 || countitem(950)<5 || countitem(946)<5 || countitem(966)<5 || countitem(7031)<5 || countitem(1032)<5) goto L_NotDone;
- delitem 1042,5;
- delitem 950,5;
- delitem 946,5;
- delitem 966,5;
- delitem 7031,5;
- delitem 1032,5;
-
- L_Cont:
- mes "[Sir Andrew Syloc]";
- mes "Lets see here..... 5 of this.... 5 of that.... Great! You got everything I asked for.";
- next;
- mes "[Sir Andrew Syloc]";
- mes "You have done well and have past your first test! However you shouldn't get too excited.";
- mes "There are still more challenges that you will have to overcome before you can become a knight.";
- next;
- mes "[Sir Andrew Syloc]";
-
- L_Done:
- mes "Speak to the Chivalry Captain Herman and he will inform you about your next test.";
- mes "Stay focused and give it your all ^0000ff"+strcharinfo(0)+"^000000. I know you will do well.";
- set KNIGHT_Q, 2;
- set KNIGHT_Q2, 0;
- close;
-
- L_NotDone:
- mes "[Sir Andrew Syloc]";
- mes "What? You don't have everything I asked for?";
- emotion e_swt;
- next;
- mes "[Sir Andrew Syloc]";
- mes "This is what you were SUPPOSED to collect....";
- if(KNIGHT_Q2 == 1) callsub sF_R1;
- if(KNIGHT_Q2 == 2) callsub sF_R2;
- next;
- mes "[Sir Andrew Syloc]";
- mes "Once you have ALL of those items come back and see me.";
- close;
-}
-
-
-//<------------------------------------------------------------------------------ Sir James Syracuse (2nd Test) ----------------------------------------------------------------------------------------->\\
-prt_in.gat,71,91,6 script Sir James Syracuse 65,{
- mes "[Sir James Syracuse]";
- if (BaseJob == Job_Knight) goto L_Knight;
- if (BaseJob == Job_Novice) goto L_Novice;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 2) goto L_Test;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 3) goto L_Done;
-L_Other:
- mes "Attacking and defending..... is there a way to do both at the same time?";
- mes "With a 'two-handed' weapon you have a great attack but no defense. Is there anything that can compensate for this weakness?";
- next;
- mes "[Sir James Syracuse]";
- mes "A weapon that could be used to both attack and defend would be invaluable to a Knight...... Darn!..... Where can I get such a thing??!! ";
- close;
-L_Novice:
- mes "What are you doing here novice?";
- next;
- mes "[Sir James Syracuse]";
- mes "Do you want to become a Knight? Well too bad novices can't become knights.";
- next;
- mes "[Sir James Syracuse]";
- mes "You have to be an experienced swordman in order to become a knight.";
- close;
-L_Knight:
- mes "Hey, how are you doing... the guild is fine.";
- next;
- mes "[Sir James Syracuse]";
- mes "We are still recruiting knights. I hear there's a bad knight out there ruining the good name of the Prontera Chivalry...";
- next;
- mes "[Sir James Syracuse]";
- mes "If you see him, teach him a lesson.";
- close;
-
-L_Test:
- mes "Oh, so you passed the first test ^ff0000"+strcharinfo(0)+"^000000.";
- next;
- mes "[Sir James Syracuse]";
- mes "First let me introduce myself, my name is James Syracuse. I am of course a Knight here at the Prontera Chivalry.";
- next;
- mes "[Sir James Syracuse]";
- mes "This test will be on your knowledge of Knights. You will also be asked about your opinions of Knights...";
- next;
- mes "[Sir James Syracuse]";
- mes "Dont' be nervous, I'll only be asking a few simple questions.";
- next;
- menu "Let's go",M_0,"I'm not ready yet.",M_End;
-
- M_0:
- mes "[Sir James Syracuse]";
- mes "Okay lets start, please answer the questions as quickly as you can. If you get an answer wrong you will have to start the test all over again.";
- next;
-
- mes "[Sir James Syracuse]";
- //mes "Knights excel in both attack strength and defensive prowess.";
- mes "Can you tell me which of these swords is NOT a two handed sword?";
- next;
- menu "Katzbalger",sM_0a,"Bastard Sword",sM_0b,"Claymore",sM_0c,"Flamberge",sM_0d;
-
- sM_0a:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Katzbalger IS a two-handed sword";
- mes "How will you manage to become a knight if you don't know about the swords that Knight's use?";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_0b:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Bastard Sword IS a two-handed sword!";
- mes "How will you manage to become a knight if you don't know about the swords that knight's use?";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_0c:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Claymore IS a two-handed sword";
- mes "How will you manage to become a knight if you don't know about the swords that knight's use?";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_0d:
-
- mes "[Sir James Syracuse]";
- mes "Okay, let me ask you a question about Knight skills.";
- mes "What skill listed below is NOT used for attacking an opponent?";
- next;
- menu "Two-Hand Mastery Lv.5",sM_1a,"Berserk Lv.3",sM_1b,"Endure Lv.10",sM_1c,"Bash Lv.10",sM_1d;
-
- sM_1a:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
- mes "If you want to become a knight, you have to know what each skill does.";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_1b:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
- mes "If you want to become a knight, you have to know what each skill does.";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_1c:
- goto L_Cont1;
-
- sM_1d:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
- mes "If you want to become a knight, you have to know what each skill does.";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- L_Cont1:
- mes "[Sir James Syracuse]";
- mes "Knights are different from other classes in that Knights can use spears and have special spear skills.";
- mes "What spear skill below uses the MOST sp?";
- next;
- menu "Pierce",sM_2a,"Spear Boomarang",sM_2b,"Spear Stab",sM_2c,"Riding",sM_2d;
-
- sM_2a:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
- mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_2b:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
- mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_2c:
- goto L_Cont2;
-
- sM_2d:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
- mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- L_Cont2:
- mes "[Sir James Syracuse]";
- mes "Spears can also have elemental properites.";
- mes "Which of the elements below is strongest against Dark/Undead monsters?";
- next;
- menu "Holy",sM_3a, "Wind",sM_3b, "Poison",sM_3c, "Earth",sM_3d;
-
- sM_3a:
- goto L_Cont3;
-
- sM_3b:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Wind is NOT that strong against undead!";
- mes "These are basic stuff and you don't it how funny?";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_3c:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Poion is NOT strong against undead";
- mes "These are basic stuff and you don't it how funny";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_3d:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. Earth is NOT strong against undead";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- L_Cont3:
- mes "[Sir James Syracuse]";
- mes "When you become a Knight you can ride a pecopeco. However your attack speed drops significantly.";
- mes "But if you learn the skill, Cavalry Mastery, your attack speed will increase again.";
- next;
- mes "[Sir James Syracuse]";
- mes "What percentage of your attack speed is regained by learning level 3 cavalry mastery?";
- next;
- menu "70%",sM_4a, "80%",sM_4b, "90%",sM_4c, "100%",sM_4d;
-
- sM_4a:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_4b:
- goto L_Cont4;
-
- sM_4c:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- sM_4d:
- mes "[Sir James Syracuse]";
- mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
- next;
- mes "[Sir James Syracuse]";
- mes "You need to know the basics BEFORE you take this test!";
- close;
-
- L_Cont4:
- mes "[Sir James Syracuse]";
- mes "Good, looks like you know a lot about knights";
- mes "Ok. Let me ask you some more questions";
- next;
- mes "[Sir James Syracuse]";
- mes "If you run into a novice and he asks you to tank for him because he's to lazy to fight on his own, you should....";
- next;
- menu "Tell the novice a good place to train",sM_5a, "Give him some zeny",sM_5b, "Give him some weapons",sM_5c;
-
- sM_5a:
- mes "[Sir James Syracuse]";
- mes "Yes! That's a good answer. Novice's need to be independent and work hard on their own.";
- mes "This builds good character and helps them become stronger.";
- next;
- goto L_Cont5;
-
- sM_5b:
- mes "[Sir James Syracuse]";
- mes "WHAT?? Are you Nuts? Do you think that money is everything? LEAVE NOW!";
- close;
-
- sM_5c:
- mes "[Sir James Syracuse]";
- mes "Do you think you're helping someone when you give them good weapons?";
- mes "You are basically KILLING them not helping them. LEAVE NOW!";
- close;
-
- L_Cont5:
- mes "[Sir James Syracuse]";
- mes "If you're in a party and your party gets attacked, what would you do?";
- next;
- menu "Stay in front and protect everyone.",sM_6a, "Wait until the others attack first then leech.",sM_6b,
- "Who cares, I just want the drops.",sM_6c;
-
- sM_6a:
- mes "[Sir James Syracuse]";
- mes "Yes! We Knights are important in most battles because of our strong attack and defensive skills.";
- mes "We should try our best to take the brunt of any attack and allow our party members to provide support.";
- next;
- goto L_Cont6;
-
- sM_6b:
- mes "[Sir James Syracuse]";
- mes "...WHAT? If you do that you're going to get EVERYONE KILLED!!";
- next;
- mes "[Sir James Syracuse]";
- mes "You....LEAVE NOW! You don't have what it takes to become a Knight!";
- close;
-
- sM_6c:
- mes "[Sir James Syracuse]";
- mes "YOU THINK DROPS ARE MORE IMPORTANT THAN YOUR PARTY MEMBERS??";
- next;
- mes "[Sir James Syracuse]";
- mes "You don't have what it takes to become a knight... LEAVE NOW!!";
- close;
-
- L_Cont6:
- mes "[Sir James Syracuse]";
- mes "And finally, the last question. What do you think is most important to a Knight?";
- next;
- menu "Honor",sM_7a, "Money",sM_7b, "The Fame",sM_7c;
-
- sM_7a:
- mes "[Sir James Syracuse]";
- mes "Yes! Absolutely correct! A Knight's pride and honor come before all else.";
- mes "You have to always remember that!";
- next;
- mes "[Sir James Syracuse]";
- goto L_Done;
-
- sM_7b:
- mes "[Sir James Syracuse]";
- mes "You're a REALLY GREEDY PERSON!!";
- next;
- mes "[Sir James Syracuse]";
- mes "Leave now!! We DON'T want your kind here!";
- close;
-
- sM_7c:
- mes "[Sir James Syracuse]";
- mes "Did you want to a become a knight because you desired to become FAMOUS?";
- next;
- mes "[Sir James Syracuse]";
- mes "Leave now!! We DON'T need your kind here!";
- close;
-
- L_Done:
- mes "Good job on passing the second test. Please speak with the Captain about your next test.";
- next;
- mes "[Sir James Syracuse]";
- mes "There is more to a Knight than raw strength. Duty and honor are of the utmost importance to a Knight";
- mes "Remember this and you will have no problems with the rest of the tests.";
- set KNIGHT_Q, 3;
- close;
-
- M_End:
- mes "[Sir James Syracuse]";
- mes "I see. Take your time.";
- close;
-
-}
-
-
-//<--------------------------------------------------------------------------------- Sir Windsor (3rd Test) -------------------------------------------------------------------------------------------------->\\
-// Sir Windsor ---------------------------------------------------------
-prt_in.gat,79,94,3 script Sir Windsor#1 733,{
- mes "[Sir Windsor]";
- if(BaseJob == Job_Knight) goto L_Knight;
- if(BaseJob == Job_Novice) goto L_Novice;
- if(BaseJob == Job_Swordman && KNIGHT_Q == 3) goto L_Test;
- if(BaseJob == Job_Swordman && KNIGHT_Q == 4) goto L_Done;
-L_Other:
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes "What're you looking at.....?";
- close;
-L_Novice:
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes "Go play somewhere else......";
- close;
-L_Knight:
- mes "Don't talk to me......";
- emotion e_dots;
- close;
-
-
-L_Test:
- if(KNIGHT_Q2 == 2) goto L_Done;
- if(KNIGHT_Q2 == 1) goto sL_ReTest;
- mes ".............";
- next;
- mes "[Sir Windsor]";
- mes "... so you're here to take the test?";
- next;
- mes "[Sir Windsor]";
- mes "Follow me.....";
- next;
- set KNIGHT_Q2,1;
- savepoint "prt_in.gat",77,96;
- warp "job_knt",89,106;
- end;
-
- sL_ReTest:
- mes ".............";
- next;
- mes "[Sir Windsor]";
- mes "Hmf... your previous attempt was pathetic....";
- next;
- mes "[Sir Windsor]";
- mes "Lets go......";
- next;
- savepoint "prt_in.gat",77,96;
- warp "job_knt",89,106;
- end;
-
-L_Done:
- mes "Hmf.......";
- next;
- mes "[Sir Windsor]";
- mes ".... You passed my test.";
- next;
- mes "[Sir Windsor]";
- mes ".... Go talk to the Chivalry Captain Herman.";
- set KNIGHT_Q2,0;
- set KNIGHT_Q,4;
- close;
-}
-
-
-// Waiting Room ---------------------------------------------------------------------------
-job_knt.gat,89,110,4 script Sir Windsor#2::SW2 733,{
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....You have a problem?";
- next;
- menu "What is this test about?",M_0, "I wanna kick some moster butt!.",M_1, "I want to leave.",M_2, "Nothing.",M_End;
-
- M_0:
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....You are going to fight monsters.";
- next;
- mes "[Sir Windsor]";
- mes ".....You must kill every single monster in the arena.";
- next;
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....You have to survive three levels of viscous monsters.";
- next;
- mes "[Sir Windsor]";
- mes ".....I will give you 3 minutes for each level.";
- next;
- mes "[Sir Windsor]";
- mes "..........";
- close;
-
- M_1:
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....Go to the waiting room first.";
- next;
- mes "[Sir Windsor]";
- mes ".....The test will start soon.";
- next;
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....If someones in there, you have to wait until they are done or fail.";
- next;
- mes "[Sir Windsor]";
- mes ".....Once that happens, you will be automatically warped to the test room..";
- next;
- mes "[Sir Windsor]";
- mes "..........";
- close;
-
- M_2:
- mes "[Sir Windsor]";
- mes "..........";
- next;
- mes "[Sir Windsor]";
- mes ".....Leave then.";
- next;
- warp "prt_in.gat",80,100;
- close;
-
- M_End:
- mes "[Sir Windsor]";
- mes "..........";
- close;
-
-OnInit:
- waitingroom "Knight Test Waiting Room",8,"SW2::OnStart",1;
- end;
-
-OnStart:
- set $@KntUsers, getareausers("job_knt.gat", 24, 126, 63, 165); // get user count for first lvl
- set $@KntUsers, $@KntUsers + getareausers("job_knt.gat", 24, 32, 63, 71); // get user count for second lvl + first lvl
- set $@KntUsers, $@KntUsers + getareausers("job_knt.gat", 124, 132, 163, 171); // get user count for third lvl + second lvl + first lvl
- if($@KntUsers > 0) end;
-
- if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room;
- //kills off any left over monsters from other testers
- killmonster "job_knt.gat", "KntLvl1::OnMyMobDead";
- killmonster "job_knt.gat", "KntLvl2::OnMyMobDead";
- killmonster "job_knt.gat", "KntLvl3::OnMyMobDead";
- warpwaitingpc "job_knt.gat",43,146;
- donpcevent "KntLvl1::OnStart";
- end;
-}
-
-// First Level ---------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl1 -1,{
-
-OnStart:
- set $@KntRm, 1;
- set $@KntMob,12;
- monster "job_knt.gat",39,150,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",47,150,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",39,142,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",47,142,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,137,"Piere",1160,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,155,"Piere",1160,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,155,"Deniro",1105,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,155,"Deniro",1105,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,155,"Andre",1095,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",43,137,"Andre",1095,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",35,146,"Argos",1100,1,"KntLvl1::OnMyMobDead";
- monster "job_knt.gat",52,146,"Argos",1100,1,"KntLvl1::OnMyMobDead";
- initnpctimer "TimerKnt";
- end;
-
-OnMyMobDead:
- set $@KntMob, $@KntMob - 1;
- if($@KntMob > 0) end;
-
- stopnpctimer "TimerKnt";
- areaannounce "job_knt.gat", 24, 126, 63, 165, "[Sir Windsor]: Get ready for the second level....",8;
- set $@KntMob, 0;
- addtimer 5000, "KntLvl2::OnStart";
- end;
-}
-
-
-// Second Level ---------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl2 -1,{
-
-OnStart:
- set $@KntRm, 2;
- set $@KntMob,12;
- monster "job_knt.gat",53,52,"Frilldora",1119,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",34,52,"Frilldora",1119,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",43,42,"Desert Wolf",1106,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",43,62,"Desert Wolf",1106,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",58,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",58,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",29,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",29,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",60,68,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",27,68,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",60,35,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
- monster "job_knt.gat",27,35,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
- warp "job_knt.gat",43,52;
- initnpctimer "TimerKnt";
- end;
-
-OnMyMobDead:
- set $@KntMob, $@KntMob - 1;
- if($@KntMob > 0) end;
-
- stopnpctimer "TimerKnt";
- areaannounce "job_knt.gat", 24, 32, 63, 71, "[Sir Windsor]: Get ready for the third level....",8;
- set $@KntMob, 0;
- addtimer 5000, "KntLvl3::OnStart";
- end;
-
-}
-
-// Third Level ---------------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl3 -1,{
-
-OnStart:
- set $@KntRm, 3;
- set $@KntMob,7;
- monster "job_knt.gat",136,152,"Knife Goblin Bro",1122,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",150,152,"Mace Goblin Bro",1123,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",143,145,"Axe Goblin Bro",1124,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",143,167,"Hammer Goblin Bro",1125,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",139,167,"Club Goblin Bro",1126,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",147,167,"Goblin Archer",1258,1,"KntLvl3::OnMyMobDead";
- monster "job_knt.gat",136,158,"Steam Goblin",1280,1,"KntLvl3::OnMyMobDead";
- warp "job_knt.gat",143,152;
- initnpctimer "TimerKnt";
- end;
-
-OnMyMobDead:
- set $@KntMob, $@KntMob - 1;
- if($@KntMob > 0) end;
-
- stopnpctimer "TimerKnt";
- set KNIGHT_Q2, 2;
- areaannounce "job_knt.gat", 124, 132, 163, 171, "[Sir Windsor]: ....... test completed.",8;
- set $@KntMob, 0;
- addtimer 7000, "TimerKnt::OnTimer184000";
- end;
-
-}
-
-// Timer --------------------------------------------------------------------------------
-job_knt.gat,1,1,1 script TimerKnt -1,{
-
-OnTimer2000:
- set $@KntTime$, "You have 3 minutes...";
- donpcevent "SW2::OnStart"; //checks to see if anyone is still in the room, in case of logout or KO
- callsub AnnounceKnt;
-OnTimer32000:
- donpcevent "SW2::OnStart";
- end;
-OnTimer62000:
- set $@KntTime$, "You have 2 minutes left...";
- donpcevent "SW2::OnStart";
- callsub AnnounceKnt;
-OnTimer92000:
- donpcevent "SW2::OnStart";
- end;
-OnTimer122000:
- set $@KntTime$, "You have 1 minute left...";
- donpcevent "SW2::OnStart";
- callsub AnnounceKnt;
-OnTimer152000:
- set $@KntTime$, "You have 30 seconds left...";
- donpcevent "SW2::OnStart";
- callsub AnnounceKnt;
-OnTimer162000:
- set $@KntTime$, "You have 10 seconds left...";
- callsub AnnounceKnt;
-OnTimer182000:
- set $@KntTime$, "Times up! You failed!!";
- donpcevent "SW2::OnStart";
- callsub AnnounceKnt;
-OnTimer184000:
- stopnpctimer;
- if($@KntRm==1) areawarp "job_knt.gat", 24, 126, 63, 165, "prt_in.gat",77,96;
- if($@KntRm==2) areawarp "job_knt.gat", 24, 32, 63, 71, "prt_in.gat",77,96;
- if($@KntRm==3) areawarp "job_knt.gat", 124, 132, 163, 171, "prt_in.gat",77,96;
- areaannounce "job_knt.gat", 82, 98, 97, 113, "[Sir Windsor]: The testing rooms are now open.....",8;
- killmonster "job_knt.gat", "KntLvl1::OnMyMobDead";
- killmonster "job_knt.gat", "KntLvl2::OnMyMobDead";
- killmonster "job_knt.gat", "KntLvl3::OnMyMobDead";
- donpcevent "SW2::OnStart";
- end;
-
-AnnounceKnt:
- if($@KntRm==1) areaannounce "job_knt.gat", 24, 126, 63, 165, "[Sir Windsor]: "+$@KntTime$+".",8;
- if($@KntRm==2) areaannounce "job_knt.gat", 24, 32, 63, 71, "[Sir Windsor]: "+$@KntTime$+".",8;
- if($@KntRm==3) areaannounce "job_knt.gat", 124, 132, 163, 171, "[Sir Windsor]: "+$@KntTime$+".",8;
- end;
-}
-
-
-//<------------------------------------------------------------------------------------ Lady Amy Beatris (4th Test) ---------------------------------------------------------------------------------------------->\\
-prt_in.gat,69,107,5 script Lady Amy Beatris 728,{
- mes "[Lady Amy Beatris]";
- if (BaseJob == Job_Knight) goto L_Knight;
- if (BaseJob == Job_Novice) goto L_Novice;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 4) goto L_Test;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 5) mes "Speak to the Chivalry Captain Herman about your next test.";
- if (BaseJob == Job_Swordman && KNIGHT_Q == 5) close;
-L_Other:
- mes "Welcome to the Prontera Chivalry.";
- next;
- mes "[Lady Amy Beatris]";
- mes "There are only Knights here so just relax.";
- close;
-L_Novice:
- mes "Wow... A cute novice... soooo cute...";
- emotion e_lv2;
- next;
- mes "[Lady Amy Beatris]";
- mes "Do you want to become a Knight?";
- if(sex==0) mes "I bet you'll be lovely as a Knight.";
- if(sex==1) mes "I bet you'll be really handsome as a Knight.";
- next;
- mes "[Lady Amy Beatris]";
- if(sex==0) mes "If you become a Knight, come back and see me. We Lady Knights should stick together.";
- if(sex==1) mes "If you become a knight, come back and see me okay?(*winks*)";
- close;
-L_Knight:
- if(sex==1) goto L_Male;
-
- L_Female:
- mes "Oh my! Aren't you just the prettiest Knight. I love how your sword matches with your shoes.";
- emotion e_lv2;
- next;
- mes "[Lady Amy Beatris]";
- mes "Anyway, I'm glad you came back to see me. I'm always curious about how a Knight turns out.";
- mes "You look like you're doing fine so continue the good work okay? Lady Knights rule!";
- close;
-
- L_Male:
- mes "Well hello handsome. There's just something about men in armor....";
- emotion e_lv;
- next;
- mes "[Lady Amy Beatris]";
- mes "So, did you come back for some fun...?";
- next;
- menu "YOU BET!!!",M_Yes, "... um... well... err...",M_No;
-
- M_Yes:
- mes "^FF0000(SLAPP!! SMACK!! BASH!!)^000000";
- emotion e_an;
- percentheal (-10),0;
- next;
- mes "[Lady Amy Beatris]";
- mes "How dare you!! Just what kind of girl do you take me for?";
- next;
- mes "[Lady Amy Beatris]";
- mes "Allways remember that a Knight's a Knight, no matter what gender they are.";
- mes "Also remember to be respectfull to women at all times!";
- emotion e_pif;
- close;
-
- M_No:
- mes "[Lady Amy Beatris]";
- mes "Teh he he. Silly, I'm just playing with you. You may be good looking, but I'm NOT that kind of girl.";
- emotion e_heh;
- next;
- mes "[Lady Amy Beatris]";
- mes "Anyway, I'm glad you came back to see me. I'm always curious about how a Knight turns out.";
- mes "You look like you're doing fine so continue the good work okay?";
- emotion e_no1;
- close;
-
-
-L_Test:
- if(KNIGHT_Q2 == 1) mes "Are you ready to take the test over?"; //for when someone retakes the test
- if(KNIGHT_Q2 == 1) goto M_Menu;
- mes "Hello. Your ^ff0000"+strcharinfo(0)+"^000000, right?";
- next;
- mes "[Lady Amy Beatris]";
- mes "My name is Amy Beatris, a Knight of the Prontera Chivalry.";
- next;
- mes "[Lady Amy Beatris]";
- mes "For your test I will be asking you some questions";
- next;
- mes "[Lady Amy Beatris]";
- mes "Please listen carefully and pick the correct answer.";
-M_Menu:
- next;
- menu "Ok. I'm ready.",M_0, "Please give me some time.",M_End;
-
- M_0:
- set @score,0;
-
- mes "[Lady Amy Beatris]";
- mes "Let's say your in Morroc and you want to recruit a party member. What would you do?";
- next;
- menu "Randomly follow someone around",sM_0a, "Make a chatroom and wait.",sM_0b, "Ask if anyone wants to party with a Knight..",sM_0c;
-
- sM_0a:
- goto L_Cont1;
-
- sM_0b:
- set @score, @score + 10;
- goto L_Cont1;
-
- sM_0c:
- set @score, @score + 10;
-
- L_Cont1:
- mes "[Lady Amy Beatris]";
- mes "You're in a party with a hunter, a priest, a wizard, a blacksmith, and an assassin.";
- mes "The six of you decide to train in the Pyramids.";
- next;
- mes "[Lady Amy Beatris]";
- mes "Your party makes it to the fourth floor of the pyramid, what will you do now?";
- next;
- menu "Scout ahead and make sure it's safe for all",sM_1a, "Go fight by yourself",sM_1b, "Stay in front of the party and move slowly",sM_1c;
-
- sM_1a:
- set @score, @score + 10;
-
- sM_1b:
- goto L_Cont2;
-
- sM_1c:
- set @score, @score + 10;
-
- L_Cont2:
- mes "[Lady Amy Beatris]";
- mes "A lame-o guy creates a mob right in front of your party and disappears. What would you do?";
- next;
- menu "Look after your partners",sM_2a, "Fight hard and help when needed",sM_2b, "Take your PecoPeco and RIDE like the WIND!",sM_2c;
-
- sM_2a:
- set @score, @score + 10;
- goto L_Cont3;
-
- sM_2b:
- set @score, @score + 10;
- goto L_Cont3;
-
- sM_2c:
-
- L_Cont3:
- mes "[Lady Amy Beatris]";
- mes "Somehow you beat the mob. Your party then journeys on and you stumble upon someone who has fainted.";
- next;
- mes "[Lady Amy Beatris]";
- mes "This guy begs you to help him, what will you do?";
- next;
- menu "Ask the priest in your party to help.",sM_3a, "Ask him how much he'll pay you if you help",sM_3b, "Ignore him.",sM_3c;
-
- sM_3a:
- set @score, @score + 10;
-
- sM_3b:
-
- sM_3c:
-
- L_Cont4:
- mes "[Lady Amy Beatris]";
- mes "You guys have to go to different places so you guys seperate yourselves into smaller groups.";
- next;
- mes "[Lady Amy Beatris]";
- mes "During your previous battles, a monster dropped a very valuable item that you picked up. What do you do with it?";
- next;
- menu "Give it to the person that deserves it the most.",sM_4a, "Pretend you don't know about it.",sM_4b, "Discuss it with the others.",sM_4c;
-
- sM_4a:
- set @score, @score + 10;
-
- sM_4b:
- goto L_Cont5;
-
- sM_4c:
- set @score, @score + 10;
-
- L_Cont5:
- mes "[Lady Amy Beatris]";
- mes "You decide to go back to Prontera and sell some of the valuble items you picked up.";
- mes "On the road, you see a lot of chatrooms.";
- next;
- mes "[Lady Amy Beatris]";
- mes "What would be the best way to sell them?";
- next;
- menu "Sell them to an NPC.",sM_5a, "Create a chatroom to advertise the items.",sM_5b, "Go around looking for someone that needs them.",sM_5c;
-
- sM_5a:
- goto L_Cont6;
-
- sM_5b:
- set @score, @score + 10;
- goto L_Cont6;
-
- sM_5c:
- set @score, @score + 10;
-
- L_Cont6:
- mes "[Lady Amy Beatris]";
- mes "Someone comes up to you and begs you for money. What would you do?";
- next;
- menu "Give him some money and items.",sM_6a, "Ignore him.",sM_6b, "Tell him a place where its suitable for him to earn money.",sM_6c;
-
- sM_6a:
-
- sM_6b:
- goto L_Cont7;
- sM_6c:
- set @score, @score + 10;
-
- L_Cont7:
- mes "[Lady Amy Beatris]";
- mes "Now your alone and training in a forest. You are happily riding a pecopeco.";
- next;
- mes "[Lady Amy Beatris]";
- mes "You run into somone who's lost. What do you do?";
- next;
- menu "Tell her where the exit is.",sM_7a, "Bring her to the exit.",sM_7b, "Give her a butterfly wing.",sM_7c;
-
- sM_7a:
- set @score, @score + 10;
- goto L_Cont8;
-
- sM_7b:
- set @score, @score + 10;
-
- sM_7c:
-
- L_Cont8:
- mes "[Lady Amy Beatris]";
- mes "You're still in the forest but now your busy fighting monsters.";
- mes "You realize that you've run out of healing items and your health is very low.";
- next;
- mes "[Lady Amy Beatris]";
- mes "Suddenly a priest appears! What would you do?";
- next;
- menu "'Give me a heal'",sM_8a, "'Would you please heal me. I'll share the drops with you.'",sM_8b, "'Dude! I need healz plz.'",sM_8c;
-
- sM_8a:
- goto L_Cont9;
-
- sM_8b:
- set @score, @score + 10;
-
- sM_8c:
-
- L_Cont9:
- mes "[Lady Amy Beatris]";
- mes "Your getting tired so you decide to head back to town.";
- next;
- mes "[Lady Amy Beatris]";
- mes "On the road back to town, you see a very valuable object. What will you do?";
- next;
- menu "Pick it up and keep it.",sM_9a, "Ask around to see if anyone dropped it.",sM_9b, "Leave it there.",sM_9c;
-
- sM_9a:
- goto L_Cont10;
-
- sM_9b:
- set @score, @score + 10;
- goto L_Cont10;
-
- sM_9c:
- set @score, @score + 10;
-
- L_Cont10:
- mes "[Lady Amy Beatris]";
- mes "Alright. I'm finished with my questions. Now that wasn't so bad was it?";
- next;
- mes "[Lady Amy Beatris]";
- mes "Okay, let me just quickly add up your score....";
- next;
- mes "[Lady Amy Beatris]";
- mes "You got a score of ^ff0000"+@score+"^000000 out of ^0000ff100^000000.";
- next;
- mes "[Lady Amy Beatris]";
- if(@score == 100) goto L_100;
- if(@score >= 80) goto L_80;
-
- L_Failed:
- mes "I am sorry but you failed the test. I hope you will try again and do better next time.";
- next;
- mes "[Lady Amy Beatris]";
- mes "When I ask you a question please think hard about it.";
- set KNIGHT_Q2, 1; //flag for re-taking the test
- close;
-
- L_100:
- mes "Great job! You got a perfect score. If you keep this up, you'll become one of the best knights around.";
- mes "Speak to the Chivalry Captain Herman about your next test.";
- next;
- mes "[Lady Amy Beatris]";
- mes "Keep up the good work and pass all the tests okay?";
- set KNIGHT_Q, 5;
- set KNIGHT_Q2, 0;
- close;
- L_80:
- mes "Not bad. Not as good as had I hoped, but you did well enough to pass.";
- mes "Speak to the Chivalry Captain Herman about your next test.";
- next;
- mes "[Lady Amy Beatris]";
- mes "Good luck on the next test. I hope you'll pass and become a knight soon.";
- set KNIGHT_Q, 5;
- set KNIGHT_Q2, 0;
- close;
-
- M_End:
- mes "[Lady Amy Beatris]";
- mes "Sure thing. See me when you're ready.";
- close;
-
-}
-
-
-//<------------------------------------------------------------------------------------------- Sir Edmund (5th Test) --------------------------------------------------------------------------------------------->\\
-prt_in.gat,70,99,5 script Sir Edmund 734,{
- mes "[Sir Edmund]";
- if (BaseJob == Job_Knight) goto L_Knight;
- if (BaseJob == Job_Swordman) goto L_Sword;
- if (BaseJob == Job_Novice) goto L_Novice;
-L_Other:
- mes "Everything in this world exists in harmony.";
- next;
- mes "[Sir Edmund]";
- mes "Living without disrupting this harmony is the only true way to live your life....";
- close;
-L_Novice:
- mes "A tree with deep roots will not be swayed by the wind.";
- next;
- mes "[Sir Edmund]";
- mes "Skills rooted in a strong foundation will one day shine their light...";
- next;
- mes "[Sir Edmund]";
- mes "You future will be decided by what you do now.... so strengthen those roots.";
- close;
-
- mes "[Sir Edmund]";
- mes "People who wants to be on the dark side will always have nightmares";
- next;
- mes "[Sir Edmund]";
- mes "If a person gets a nightmare everyday, all his dreams will be crushed...";
- close;
-
-L_Knight:
- mes "Make your heart into a river.";
- next;
- mes "[Sir Edmund]";
- mes "A river will wash out everything in its path...";
- next;
- mes "[Sir Edmund]";
- mes "As a knight you must walk your path like a flowing river.";
- close;
-
-L_Sword:
- if (KNIGHT_Q == 5) goto L_Test;
- if (KNIGHT_Q == 6) goto L_Done;
- mes "Those with ominous thoughts will only dream ominous dreams.";
- next;
- mes "[Sir Edmund]";
- mes "Having ominous dreams will result in no dreams at all....";
- close;
-L_Test:
- if(KNIGHT_Q2 == 1) goto L_ReTest;
- if(KNIGHT_Q2 == 2) goto L_Done;
- mes "Oh so its your turn to take my test.";
- mes "I hope you can pass it";
- next;
- mes "[Sir Edmund]";
- mes "My name is Edmund.";
- mes "And iam a knight in the prontera Knight Guild.";
- next;
- mes "[Sir Edmund]";
- mes "Knights are like the people that keeps justice and peace in this world...";
- mes "If you can help people and be nice, you'll be one of the best knights in this world.";
- next;
- mes "[Sir Edmund]";
- mes "Your actions can't be slow, if you decide on something, you got to do it.";
- mes "Sometimes you can be the water, Weak , but most time you got to be the wind, HARD.";
- next;
- mes "[Sir Edmund]";
- mes "You can't kill monsters because its fun.";
- mes "And sometimes you'll need time to calm down...";
- next;
- mes "[Sir Edmund]";
- mes "Okay lets start the test now.";
- next;
- warp "job_knt.gat",143,57;
- doevent "ev_Test::OnStart";
- end;
-
- L_ReTest:
- mes "Last time when you did the test you didn't try hard enough.";
- mes "A knights weapon should only be used to protect, not to bully weak monsters.";
- next;
- mes "[Sir Edmund]";
- mes "Everything in this world is equal, there shouldn't be any exceptions.";
- mes "This point shouldn't be kept just when you have tests, it should be kept when you're training in real life...";
- next;
- mes "[Sir Edmund]";
- mes "Okay now, try again.";
- next;
- warp "job_knt.gat",143,57;
- doevent "ev_Test::OnStart";
- end;
-
- L_Done:
- mes "You have done very well to pass my test.";
- next;
- mes "[Sir Edmund]";
- mes "Remember that true strength comes from patience and understanding.";
- next;
- mes "[Sir Edmund]";
- mes "When you understand the world around you, you will be able to overcome any obstacle in life.";
- next;
- mes "[Sir Edmund]";
- mes "Go to the Chivalry Captain Herman and find out about your next challenge. Good luck.";
- set KNIGHT_Q2,0;
- set KNIGHT_Q,6;
- close;
-}
-
-// Test -----------------------------
-job_knt.gat,1,1,1 script ev_Test -1,{
-
-OnStart:
- killmonster "job_knt.gat","ev_Test::OnMyMobDead";
- monster "job_knt.gat",141,57,"Poring",1002,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",145,57,"Poring",1002,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",143,55,"Poring",1002,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",143,59,"Poring",1002,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",141,55,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",141,59,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",145,55,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",145,59,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",139,57,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",147,57,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",143,53,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",143,61,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",130,69,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",157,69,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",130,42,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",157,42,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",165,54,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",165,57,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",122,54,"Spore",1014,1,"ev_Test::OnMyMobDead";
- monster "job_knt.gat",122,57,"Spore",1014,1,"ev_Test::OnMyMobDead";
-
- addtimer 240000, "ev_Test::OnTimerPass";
- end;
-
-OnTimerPass:
- set KNIGHT_Q2, 2;
- areaannounce "job_knt.gat", 124, 36, 163, 75, "[Sir Edmund]: Well done.",0;
- addtimer 4000, "ev_Test::OnTimerWarp";
- end;
-
-OnMyMobDead:
- set KNIGHT_Q2, 1;
- areaannounce "job_knt.gat", 124, 36, 163, 75, "[Sir Edmund]: You are not at peace and therfore have failed my test.",0;
- deltimer "ev_Test::OnTimerPass";
- addtimer 4000, "ev_Test::OnTimerWarp";
- end;
-
-OnTimerWarp:
- if(KNIGHT_Q2 == 2) warp "prt_in.gat",80,100;
- if(KNIGHT_Q2 == 1) warp "prt_fild05.gat",353,251;
- end;
-}
-
-
-//<------------------------------------------------------------------------------------------ Sir Grey (Final Test) ------------------------------------------------------------------------------------------------------>\\
-prt_in.gat,87,90,3 script Sir Grey 119,{
- mes "[Sir Grey]";
- if (BaseJob == Job_Knight) goto L_Knight;
- if (BaseJob == Job_Novice) goto L_Novice;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 6) goto L_Test;
- if (BaseJob == Job_Swordman && KNIGHT_Q == 7) mes "Go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
- if (BaseJob == Job_Swordman && KNIGHT_Q == 7) close;
-L_Other:
- mes "Use your time wisely young one......";
- next;
- mes "[Sir Grey]";
- mes "You don't want to end up regreting missed opportunities.";
- close;
-L_Novice:
- mes "Believe it or not, I was once a Novice as well.";
- next;
- mes "[Sir Grey]";
- mes "Back then, I never dreamed about being a knight.... I just wanted to become a strong person.....";
- next;
- mes "[Sir Grey]";
- mes "And somehow after all these years, I ended up becoming one. Imagine that.... Hahaha.";
- emotion e_heh;
- close;
-L_Knight:
- mes "I don't know if I can even properly describe the ^00aa00Claymore^000000, but I know this... it's the greatest weapon a Knight can wield!!";
- next;
- mes "[Sir Grey]";
- mes "Yes! The ^00aa00'Claymore'^000000!! Every knight should have one!";
- next;
- menu "Info about the Claymore ",M_Info, "Buy the Claymore",M_Buy, "End talk",M_Cancel;
-
- M_Info:
- mes "[Sir Grey]";
- mes "The Claymore is the best 2 handed sword a knight can get. Its like a knight's bestfriend.";
- next;
- mes "[Sir Grey]";
- mes "Our guild works very hard to make these beautiful Claymore swords and therefore deserves some compensation for their work.";
- next;
- mes "[Sir Grey]";
- mes "For the small fee of ^0000ff'74000 zeny'^000000 and ^0000ff'1 Steel '^000000, any Knight can get their hands on a Claymore.";
- next;
- mes "[Sir Grey]";
- mes "I'm in charge of selling them so if you would like one let me know.";
- close;
-
- M_Buy:
- if(countitem(999) < 1 || Zeny < 74000) goto L_NotEnough;
-
- mes "[Sir Grey]";
- mes "Good, you brought me the steel and have enough to cover the labor fee.";
- next;
- mes "[Sir Grey]";
- mes "Here you are! A magnificant weapon that is un-matched in quality and strength! I know you will use it well.";
- delitem 999, 1;
- set Zeny, Zeny - 74000;
- getitem 1163, 1;
- close;
-
- L_NotEnough:
- mes "[Sir Grey]";
- mes "I know you want a claymore but you need to bring me ^0000ff'74000 zeny'^000000 and ^0000ff'1 Steel '^000000.";
- next;
- mes "[Sir Grey]";
- mes "When you get the steel and the money, come back and see me.";
- close;
-
- M_Cancel:
- mes "[Sir Grey]";
- mes "If your going to be a good knight, you'll need a claymore..";
- mes "I'll be glad to see you after your training...";
- close;
-
-L_ReTest:
- mes "I see you're back. Have you spent enough time reflecting on Knighthood?";
- mes "I hope that you are now ready for this test.";
- goto M_Menu;
-
-L_Test:
- if (KNIGHT_Q2 == 1) goto L_ReTest;
- mes "Haha, so you already finished all the other tests eh?";
- next;
- mes "[Sir Grey]";
- mes "Okay then, lets start my test. Its not any different from the other ones.";
-M_Menu:
- next;
- menu "Bring it on!",M_0, "Maybe a little later.",M_End;
-
- M_0:
- set @score,0;
- mes "[Sir Grey]";
- mes "Let me ask you a few questions.";
- next;
-
- mes "[Sir Grey]";
- mes "First, why are you so determined to become a knight?";
- next;
- menu "I want to be stronger.",sM_0, "I want to help the town.",sM_1, "Being a Swordsman sucks.",sM_2;
-
- sM_0:
- mes "[Sir Grey]";
- mes "To become stronger huh.... It's true that becoming a knight does make you stronger but....";
- next;
- mes "[Sir Grey]";
- mes "What would you do with that strength? Use it to help a town? Show it off to people? Or is there another reason?";
- next;
- menu "Use it to make me rich$$.",sM_0a, "Use it to protect myself.",sM_0b, "Use it to protect other people.",sM_0c;
-
- sM_0a:
- set @score, @score + 10;
- mes "[Sir Grey]";
- mes "Money is important for a comfortable living, but a Knights strength can be used for more important things.";
- goto L_Cont1;
-
- sM_0b:
- mes "[Sir Grey]";
- mes "This is a very good idea. By first learning how to protect yourself, you will then be able to protect others.";
- mes "I admire your thought very much.";
- goto L_Cont1;
-
- sM_0c:
- mes "[Sir Grey]";
- mes "It is a great idea to help others. We Knights pride ourselves on serving the public in anyway we can.";
- goto L_Cont1;
-
- sM_1:
- mes "[Sir Grey]";
- mes "I see. You have a very strong sense of community.";
- next;
- mes "[Sir Grey]";
- mes "With the power that comes with becoming Knight, what would you do to help the town?";
- next;
- menu "Whatever the town needs me to do.",sM_1a, "I will help the town get rich.",sM_1b, "I will protect the citizens of the town.",sM_1c;
-
- sM_1a:
- mes "[Sir Grey]";
- mes "Good. A Knight should always strive to help whatever the task.";
- goto L_Cont1;
-
- sM_1b:
- set @score, @score + 10;
- mes "[Sir Grey]";
- mes "A town does need money to be prosperous, but that is not the most important thing a town needs.";
- mes "As a Knight you can provide the town with protection and other valuable services.";
- goto L_Cont1;
-
- sM_1c:
- mes "[Sir Grey]";
- mes "A very noble idea indeed. Towns people are often ill equiped to protect themselves from monsters.";
- mes "By providing them with protection, you can allow the towns people to live their lives peacefully.";
- goto L_Cont1;
-
- sM_2:
- set @score, @score + 5;
- mes "[Sir Grey]";
- mes "Hmm... that's very interesting. Most people enjoy being a Swordsman.";
- next;
- mes "[Sir Grey]";
- mes "Well, what exactly don't you like about being a Swordsman?";
- next;
- menu "The skills.",sM_2a, "Swordsman are weak.",sM_2b, "The hard work.",sM_2c;
-
- sM_2a:
- set @score, @score + 5;
- mes "[Sir Grey]";
- mes "A skill is only as good as the person who uses it. Different skills are used for different situations.";
- next;
- mes "[Sir Grey]";
- mes "If you have not figured out how to effectively use the Swordsman's skills by now, how do you expect to be able to use a Knight's skills?";
- goto L_Cont1;
-
- sM_2b:
- set @score, @score - 5;
- mes "[Sir Grey]";
- mes "What? Swordsman are the strongest of the 1st job classes. A Knight's strength is the progression of a Swordsman's strength.";
- next;
- mes "[Sir Grey]";
- mes "If you are a weak Swordsman, I can garauntee that you will be a weak Knight.";
- goto L_Cont1;
-
- sM_2c:
- set @score, @score + 5;
- mes "[Sir Grey]";
- mes "Hahaha!. If you think it gets any easier as a Knight you're sadly mistaken my friend.";
- mes "With the added skills and strength a Knight gets, comes added challenges.";
- goto L_Cont1;
-
- L_Cont1:
- next;
- mes "[Sir Grey]";
- mes "Just a reminder, when you become a Knight you will NOT be able to change back into a Swordsman.";
- next;
- mes "[Sir Grey]";
- mes "If you were to become a Knight right now, what would be the first thing you would do?";
- next;
- menu "I would go into battle.",sM_3, "Go back to the person who's waiting for me.",sM_4, "Learn more about Knights.",sM_5;
-
- sM_3:
- mes "[Sir Grey]";
- mes "Okay... so you would battle and in doing so you would.....";
- next;
- menu "... become the strongest warrior.",sM_3a, "... find out how good I am.",sM_3b, "... go places where Swordsmen can't.",sM_3c;
-
- sM_3a:
- set @score, @score + 10;
- mes "[Sir Grey]";
- mes "Hold on there tiger. Don't get too eager now. You have to get the basics of Knighthood down first.";
- mes "Without it you may become the weakest warrior around.";
- goto L_Cont2;
-
- sM_3b:
- mes "[Sir Grey]";
- mes "Yes! Understanding your strengths and weaknesses is a very important aspect of being a Knight.";
- goto L_Cont2;
-
- sM_3c:
- mes "[Sir Grey]";
- mes "As a Knight you will be able to train in places you couldn't as a Swordsman.";
- mes "But becarefull. If you move to fast you may find yourself in a world of trouble.";
- goto L_Cont2;
-
- sM_4:
- mes "[Sir Grey]";
- mes "Who's waiting for you?";
- next;
- menu "A friend.",sM_4a, "A Villager.",sM_4b, "My girlfriend/boyfriend.",sM_4c;
-
- sM_4a:
- mes "[Sir Grey]";
- mes "Yes, he/she will be happy to see you. Now you will be able to protect your freind when he/she is in danger.";
- goto L_Cont2;
-
- sM_4b:
- mes "[Sir Grey]";
- mes "A villager...... oh... ";
- goto L_Cont2;
-
- sM_4c:
- mes "[Sir Grey]";
- mes "Oh I see! Did you become a knight because of your this person?";
- next;
- mes "[Sir Grey]";
- if(sex == 1) mes "I hope you will be able to protect her anytime and anywhere!";
- if(sex == 0) mes "I hope you will be able to protect him anytime and anywhere!";
- next;
- mes "[Sir Grey]";
- mes "Good luck to you and your loved one.";
- goto L_Cont2;
-
- sM_5:
- mes "[Sir Grey]";
- mes "What else do you want to know?";
- next;
- menu "The safest place for a Knight to be.",sM_5a, "A place where a knight can train.",sM_5b, "A place where a knight can earn a lot of cash.",sM_5c;
-
- sM_5a:
- set @score, @score + 5;
- mes "[Sir Grey]";
- mes "There's no place in this world thats truly safe. Especially for a Knight.";
- mes "A Knight is always expected to fight the strongest and most fearsome monsters";
- goto L_Cont2;
-
- sM_5b:
- mes "[Sir Grey]";
- mes "Ask other Knights around Rune-Midgard for advice. You're sure to get some good tips.";
- goto L_Cont2;
-
- sM_5c:
- set @score, @score + 15;
- mes "[Sir Grey]";
- mes "The role of a Knight is NOT to make lots and lots of money! A Knight has the duty to serve and protect the citizens of Rune-Midgard.";
-
- L_Cont2:
- next;
- mes "[Sir Grey]";
- mes "Well that's it. This is the end of my test and the final test in your quest to become a Knight.";
- mes "Let me now give you my decision.....";
- next;
-
- if (@score == 0) goto L_1;
- if (@score == 5) goto L_2;
- if (@score == 10) goto L_3;
-
- L_0:
- set KNIGHT_Q2, 1;
- mes "[Sir Grey]";
- mes "Although I enjoyed speaking with you today.....";
- next;
- mes "[Sir Grey]";
- mes "I'm afraid that you are not ready for Knighthood.";
- mes "I think it would be best for you to stay a Swordman for the time being.";
- next;
- mes "[Sir Grey]";
- mes "Being a Knight requires not only strength, but discipline and ethical values as well.";
- mes "A Knight has the duty to protect and help others therefore he/she must be of sound mind and body.";
- next;
- mes "[Sir Grey]";
- mes "Your answers did not seem to represent the type of attributes we look for in a Knight candidate.";
- next;
- mes "[Sir Grey]";
- mes "If you really want to become a Knight, I suggest you spend some more time contemplating the idea then come back to me.";
- close;
-
- L_1:
- set KNIGHT_Q, 7;
- set KNIGHT_Q2, 0;
- mes "[Sir Grey]";
- mes "I am glad that I got a chance to speak with someone such as yourself. You remind me of myself when i was young. Heh heh heh.";
- next;
- mes "[Sir Grey]";
- mes "More importantly...., CONGRATULATIONS!";
- next;
- mes "[Sir Grey]";
- mes "You have done an exellent job to make it this far and your answers proved that you are worthy of Knighthood.";
- next;
- mes "[Sir Grey]";
- mes "You will make a fine Knight! Go to the Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
- close;
-
- L_2:
- set KNIGHT_Q, 7;
- set KNIGHT_Q2, 0;
- mes "[Sir Grey]";
- mes "It was nice to talk to you. As a Knight, I expect that you will expand your mind and fullfill your potential.";
- next;
- mes "[Sir Grey]";
- mes "That's right. You have passed my test and are now ready to be Knighted. Congratulations!";
- next;
- mes "[Sir Grey]";
- mes "Now go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
- close;
-
- L_3:
- set KNIGHT_Q, 7;
- set KNIGHT_Q2, 0;
- mes "[Sir Grey]";
- mes "Although I appreciate your candir in answering my questions, to be honest, I am a bit worried about what I heard.";
- next;
- mes "[Sir Grey]";
- mes "Still, you seem to have enough attributes that are consistent with what we are looking for in a Knight candidate.";
- next;
- mes "[Sir Grey]";
- mes "I'm sure with hard work and dedication you will make a fine Knight. Congratulations! You have passed my test.";
- next;
- mes "[Sir Grey]";
- mes "Now go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
- close;
-
- M_End:
- close;
-}
-
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_knt.gat mapflag nomemo
-job_knt.gat mapflag noteleport
-job_knt.gat mapflag nosave SavePoint
-job_knt.gat mapflag nopenalty
-job_knt.gat mapflag nobranch
-job_knt.gat mapflag noexp
-job_knt.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Knight Job Quest
+//===== By: ==================================================
+//= PGRO TEAM (Aegis).
+//= Converted by kobra_k88
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Official RO Knight job quest converted from aegis script, and my own
+//= RO screenies and play experience
+//===== Additional Comments: =================================
+//= 1.0 Fully working. Please comment out any pre-existing warps for the
+//= test rooms in any other files so that the ones specified here can work.
+//= 1.1 Fixed a major bug. Now using the initnpctimer command,
+//= donpcevent, and new waitingroom event commands. No more addtimer
+//= spamming. No longer have to talk to the npc to take the test. Just enter the chat room.
+//= 1.2 More bug fixes. Changed global variable names to unique ones.
+//= Added second set of items to first test. Added Awake pots award for job change.
+//= 1.3 Added Baby Class support [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Merged JFunc [Lupus]
+//============================================================
+
+
+
+//<------------------------------------------------------------------------------------ Chivalry Captain Herman------------------------------------------------------------------------------------------>\\
+prt_in.gat,88,101,3 script Chivalry Captain Herman 56,{
+ callfunc "F_BlockHigh",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Lord Knight","Chivalry Captain Herman";
+
+ if (BaseJob == Job_Swordman && KNIGHT_Q > 0) goto L_Check;
+
+ mes "[Chivalry Captain Herman]";
+ mes "Good Day. This is the Prontera Chivarly, home of the famous Prontera Knights.";
+M_Menu:
+ next;
+ menu "I am ready for Knighthood.",M_0,"The Requirements.",M_1,"Quit.",M_End;
+
+ M_0:
+ mes "[Chivalry Captain Herman]";
+
+ if(BaseJob != Job_Swordman){
+ if(BaseJob == Job_Knight){
+ mes "...(sighs)...what are you doing here WASTING my time?? GO FORTH!!, and continue protecting Rune Midgard my young Knight.";
+ emotion e_pif;
+ close;
+ }
+ if(BaseJob == Job_Novice){
+ mes "Hahahaha!! You have no job experience what so ever and yet you stumble in here asking to be a knight. Hahahaha!!";
+ emotion e_heh;
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "You must first become a Swordsman before even thinking about becoming a Knight. Now scurry along little novice. Hahahahaha!!!";
+ close;
+ }
+ mes "I'm sorry but only Swordsmen can become Knights.";
+ close;
+ }
+ mes "Well then, first fill out this application form....";
+ next;
+ mes "...(you fill out the form and hand it back)...";
+ next;
+ mes "[Chivalry Captain Herman]";
+ if(JobLevel < 40){
+ mes "Hmm...it looks like you have not reached Job Level 40 yet. Please come back when you do. I shall be waiting here.";
+ close;
+ }
+ mes "Impressive. You have the job qualifications to become a knight..., however you will need much more than that to actually become one.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "In order to become a Knight one must posses great strength, courage, determination, and strong desire to help others.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "You will have to show me that you have these attributes before I can make you a knight.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "The 6 Knights you see around the room have each prepapred a unique test for would be Knights to take.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "You must complete each one of their test and prove to me that you are truly committed to becomming a knight!";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Speak with ^0000ffSir Andrew Syloc^000000. He will give you your first test. Good luck!! I expect to see you again soon!";
+ set KNIGHT_Q, 1;
+ set JBLVL, 40;
+ close;
+
+ M_1:
+ mes "[Chivalry Captain Herman]";
+ mes "The first requirement for becoming a Knight is that you must be a Swordsman.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "The second requirement is that you must have at least a Job Level of 40.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "The last requirement is that you will need to pass 6 tests that will determine whether or not you are worthy enough to become a Knight.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "These requirements may seem difficult, but the Knight class is an elite and noble job class and only the best candidates may join.";
+ goto M_Menu;
+
+ M_End:
+ close;
+
+L_Check:
+ mes "[Chivalry Captain Herman]";
+ if (KNIGHT_Q == 1) mes "Please speak with ^0000ffSir Andrew Syloc^000000. He will give you your first test.";
+ if (KNIGHT_Q == 2) mes "Congratulations on finishing your first test. ^0000ffSir James Syracuse^000000 will administer your ^ff0000second test^000000.";
+ if (KNIGHT_Q == 3) mes "Congratulations on finishing the second test. ^0000ffSir Windsor^000000 will administer your ^ff0000third test^000000.";
+ if (KNIGHT_Q == 4) mes "Congratulations on finishing the third test. ^0000ffLady Amy Beatris^000000 will administer your ^ff0000fourth test^000000.";
+ if (KNIGHT_Q == 5) mes "Congratulations on finishing the fourth test. ^0000ffSir Edmund^000000 will administer your ^ff0000fifth test^000000.";
+ if (KNIGHT_Q == 6) mes "Congratulations on finishing the fifth test. ^0000ffSir Grey^000000 will administer your ^ff0000sixth test^000000.";
+ if (KNIGHT_Q == 7) goto L_MakeKnight;
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Good luck!";
+ close;
+
+ L_MakeKnight:
+ if(SkillPoint > 0) goto sL_SKpoint;
+
+ mes "Oh, ^ff0000"+strcharinfo(0)+"^000000. So you've passed Sir Grey's test?";
+ mes "Let me just say that I applaud all of your hard work and your determination.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "The final step to become a Knight is to recieve a recomondation from all six of the Knights who tested you.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Let's start with Sir Andrew Syloc. Sir Syloc, what is your opinion of Knight candidate, ^ff0000"+strcharinfo(0)+"^000000.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "Patience is a quality all Knights must have. By passing my test, ^ff0000"+strcharinfo(0)+"^000000 showed great patience and determination.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "In my opinion ^ff0000"+strcharinfo(0)+"^000000 is deserving of becoming a Knight!";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Very good Sir Syloc. Sir James Syracuse, what say you?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "^ff0000"+strcharinfo(0)+"^000000 was albe to answer everyone of my questions correctly.";
+ mes "This displays a mastery of the basic concepts of the Knight class.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "^ff0000"+strcharinfo(0)+"^000000 has my recomendation for Knighthood!";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "I see Sir Syracuse. Sir Winsor what do you have to say?";
+ next;
+ mes "[Sir Winsor]";
+ mes "..............................";
+ next;
+ mes "[Sir Winsor]";
+ mes "Hmphf. I have no objections.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Hahaha! You never waste words do you Sir Winsor. What are your thoughts Lady Amy Beatris?";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "A Knight will be involved in many different kinds of situations on his/her journey.";
+ mes "It is a Knight's duty to make the right decisions in dealing with these situations.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "^ff0000"+strcharinfo(0)+"^000000 showed good decision making in answering my questions.";
+ mes "I too recomend that this candidate be Knighted!";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Thank you Lady Beatris. How about you Sir Edmund?";
+ next;
+ mes "[Sir Edmund]";
+ mes "A rock is an unchanging figure that never wavers in the face of adversity.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Though mighty winds may try to knock it down and crashing waves may try to wash it away, a rock will stand solid and firm.";
+ next;
+ mes "[Sir Edmund]";
+ mes "^ff0000"+strcharinfo(0)+"^000000 showed the strength of a rock and was ever calm durring my test.";
+ mes "It is my honest belief that ^ff0000"+strcharinfo(0)+"^000000 should be bestowed with Knighthood.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "As always Sir Edmund, a very profound observation. Well we're down to the last tester. Sir Grey, please give us your final desicion.";
+ next;
+ mes "[Sir Grey]";
+ mes "What can I say. ^ff0000"+strcharinfo(0)+"^000000 answered my questions thoughtfully and truthfully.";
+ next;
+ mes "[Sir Grey]";
+ mes "Though others may think that a Knight's strength lies within his/her sword, we Knights know that true strength lies within ones mind and heart.";
+ next;
+ mes "[Sir Grey]";
+ if(sex==1) mes "After speaking to ^ff0000"+strcharinfo(0)+"^000000, I felt that he had this strength within him.";
+ if(sex==0) mes "After speaking to ^ff0000"+strcharinfo(0)+"^000000, I felt that she had this strength within her.";
+ mes "I would be happy to give ^ff0000"+strcharinfo(0)+"^000000 my recomendation to become a Knight!";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "Many thanks Sir Grey, and many thanks to all of you for your time. Well it looks like it was a unanimous decision.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "The process to become a Knight is very rigorous and difficult and yet you were able to successfully make it through.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "You have done extremely well and therefore are deserving of the honor of being called a Knight.";
+ next;
+ mes "[Chivalry Captain Herman]";
+ mes "^ff0000"+strcharinfo(0)+"^000000, in the name of King Tristin the 3rd, ruler of the kingdom of Run-Midgard, I hereby bestow upon thee the title of Knight!";
+ next;
+ callfunc "Job_Change",Job_Knight;
+ if(JBLVL != 50) getitem 656, 3;
+ if(JBLVL == 50) getitem 656, 7;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Chivalry Captain Herman]";
+ mes "Congratulations!! You are now a fellow Knight and protector of Rune-Midgard! Now go forth and make Rune-Midgard a better place to live!";
+ emotion e_no1;
+ close;
+
+ sL_SKpoint:
+ mes "Please use up all of your skill points so that I can make you a Knight.";
+ emotion e_ic;
+ close;
+}
+
+
+//<--------------------------------------------------------------------------------- Sir Andrew Syloc (1st test) ------------------------------------------------------------------------------------------>\\
+prt_in.gat,75,107,4 script Sir Andrew Syloc 65,{
+ mes "[Sir Andrew Syloc]";
+ if (BaseJob == Job_Knight) goto L_Knight;
+ if (BaseJob == Job_Novice) goto L_Novice;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 1) goto L_Test;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 2) goto L_Done;
+L_Other:
+ mes "We Knights of Prontera battle for peace and freedom! We fight to ensure a prosperous future for the people of Rune-Midgard!";
+ close;
+L_Novice:
+ mes "Oh, its a novice. Welcome to the Prontera Chivalry!";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "Even though you feel weak now, I assure you that once you get your first job, you will feel confident and strong.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "Just stay safe and keep out of trouble.";
+ close;
+L_Knight:
+ mes "Oh, your one of us, how are you doing?";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "It's important that you get the right equipment. It will allow you fight a lot of monsters and inturn get a lot of zeny.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "You should remember though, that being a Knight isn't about amassing wealth.";
+ close;
+
+
+L_Test:
+ if (KNIGHT_Q2 > 0) goto L_Check;
+ mes "Oh so you've come to join the Prontera Chivalry have you. Let's see, you're ^ff0000" + strcharinfo(0) + "^000000 right?";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "My name is Andrew Syloc and I am one of the knights in the Prontera Knight Guild.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "I will be giving you the first of many tests that will determine if you have what it takes to become a Knight.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "This first test is like a scavenger hunt and will test your knowledge of monsters and their locations.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "This infrormation is vital for a Knight's ability to properly defend the many different towns in Rune-Midgard.";
+ next;
+ menu "I'm ready.",M_1, "Give me time.",M_End;
+
+ M_1:
+ mes "[Sir Andrew Syloc]";
+ if (joblevel == 50) goto sL_Skip;
+ mes "To pass this test you will need to gather:";
+ set KNIGHT_Q2, rand(1,2);
+ if(KNIGHT_Q2 == 1) callsub sF_R1;
+ if(KNIGHT_Q2 == 2) callsub sF_R2;
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "When you have all of those items, return here and give them to me.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "Good luck and be carefull! I shall await your return.";
+ close;
+
+ sF_R1:
+ mes "^5533FF5 Elder Pixie's Mustache,"; //1040
+ mes "5 Wings of Red Bat"; //7006
+ mes "5 Orcish Vouchers"; //931
+ mes "5 Moth Dust"; //1057
+ mes "5 Reptile Tongues^000000"; //903
+ mes "and ^5533FF5 Manes^000000."; //1028
+ return;
+ sF_R2:
+ mes "^5533FF5 Bug Legs";
+ mes "5 Heart of Mermaid";
+ mes "5 Snail's Shells";
+ mes "5 Clam Flesh";
+ mes "5 Old Frying Pans^000000";
+ mes "and ^5533FF5 Maneater Blossoms^000000.";
+ return;
+
+ sL_Skip:
+ mes "Wait..... what's this?";
+ next;
+ mes "[Sir Andrew]";
+ mes "You seem to be an increadibly strong swordsman. Yes, your strength and skill are amazing.";
+ next;
+ mes "[Sir Andrew]";
+ mes "Hahaha! There's no need for you to take my test. Why don't you go onto the next one ok.";
+ next;
+ mes "[Sir Andrew]";
+ mes "Speak to ^5533FFSir James Syracuse^000000. The tests you will be taking will teach you valuable life lessons, so please try hard.";
+ set KNIGHT_Q, 2;
+ set KNIGHT_Q2, 0;
+ set JBLVL, 50;
+ close;
+
+ M_End:
+ mes "[Sir Andrew Syloc]";
+ mes "Take as much time as you need. Come back when you're ready.";
+ close;
+
+L_Check:
+ mes "You've come back ^ff0000"+strcharinfo(0)+"^000000. Did you get all of the items I asked for?";
+ next;
+ if(KNIGHT_Q2 == 2) goto L_2;
+
+ L_1:
+ if(countitem(1040)<5 || countitem(7006)<5 || countitem(931)<5 || countitem(1057)<5 || countitem(903)<5 || countitem(1028)<5) goto L_NotDone;
+ delitem 1040,5;
+ delitem 7006,5;
+ delitem 931,5;
+ delitem 1057,5;
+ delitem 903,5;
+ delitem 1028,5;
+ goto L_Cont;
+
+ L_2:
+ if(countitem(1042)<5 || countitem(950)<5 || countitem(946)<5 || countitem(966)<5 || countitem(7031)<5 || countitem(1032)<5) goto L_NotDone;
+ delitem 1042,5;
+ delitem 950,5;
+ delitem 946,5;
+ delitem 966,5;
+ delitem 7031,5;
+ delitem 1032,5;
+
+ L_Cont:
+ mes "[Sir Andrew Syloc]";
+ mes "Lets see here..... 5 of this.... 5 of that.... Great! You got everything I asked for.";
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "You have done well and have past your first test! However you shouldn't get too excited.";
+ mes "There are still more challenges that you will have to overcome before you can become a knight.";
+ next;
+ mes "[Sir Andrew Syloc]";
+
+ L_Done:
+ mes "Speak to the Chivalry Captain Herman and he will inform you about your next test.";
+ mes "Stay focused and give it your all ^0000ff"+strcharinfo(0)+"^000000. I know you will do well.";
+ set KNIGHT_Q, 2;
+ set KNIGHT_Q2, 0;
+ close;
+
+ L_NotDone:
+ mes "[Sir Andrew Syloc]";
+ mes "What? You don't have everything I asked for?";
+ emotion e_swt;
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "This is what you were SUPPOSED to collect....";
+ if(KNIGHT_Q2 == 1) callsub sF_R1;
+ if(KNIGHT_Q2 == 2) callsub sF_R2;
+ next;
+ mes "[Sir Andrew Syloc]";
+ mes "Once you have ALL of those items come back and see me.";
+ close;
+}
+
+
+//<------------------------------------------------------------------------------ Sir James Syracuse (2nd Test) ----------------------------------------------------------------------------------------->\\
+prt_in.gat,71,91,6 script Sir James Syracuse 65,{
+ mes "[Sir James Syracuse]";
+ if (BaseJob == Job_Knight) goto L_Knight;
+ if (BaseJob == Job_Novice) goto L_Novice;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 2) goto L_Test;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 3) goto L_Done;
+L_Other:
+ mes "Attacking and defending..... is there a way to do both at the same time?";
+ mes "With a 'two-handed' weapon you have a great attack but no defense. Is there anything that can compensate for this weakness?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "A weapon that could be used to both attack and defend would be invaluable to a Knight...... Darn!..... Where can I get such a thing??!! ";
+ close;
+L_Novice:
+ mes "What are you doing here novice?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "Do you want to become a Knight? Well too bad novices can't become knights.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You have to be an experienced swordman in order to become a knight.";
+ close;
+L_Knight:
+ mes "Hey, how are you doing... the guild is fine.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "We are still recruiting knights. I hear there's a bad knight out there ruining the good name of the Prontera Chivalry...";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "If you see him, teach him a lesson.";
+ close;
+
+L_Test:
+ mes "Oh, so you passed the first test ^ff0000"+strcharinfo(0)+"^000000.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "First let me introduce myself, my name is James Syracuse. I am of course a Knight here at the Prontera Chivalry.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "This test will be on your knowledge of Knights. You will also be asked about your opinions of Knights...";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "Dont' be nervous, I'll only be asking a few simple questions.";
+ next;
+ menu "Let's go",M_0,"I'm not ready yet.",M_End;
+
+ M_0:
+ mes "[Sir James Syracuse]";
+ mes "Okay lets start, please answer the questions as quickly as you can. If you get an answer wrong you will have to start the test all over again.";
+ next;
+
+ mes "[Sir James Syracuse]";
+ //mes "Knights excel in both attack strength and defensive prowess.";
+ mes "Can you tell me which of these swords is NOT a two handed sword?";
+ next;
+ menu "Katzbalger",sM_0a,"Bastard Sword",sM_0b,"Claymore",sM_0c,"Flamberge",sM_0d;
+
+ sM_0a:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Katzbalger IS a two-handed sword";
+ mes "How will you manage to become a knight if you don't know about the swords that Knight's use?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_0b:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Bastard Sword IS a two-handed sword!";
+ mes "How will you manage to become a knight if you don't know about the swords that knight's use?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_0c:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Claymore IS a two-handed sword";
+ mes "How will you manage to become a knight if you don't know about the swords that knight's use?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_0d:
+
+ mes "[Sir James Syracuse]";
+ mes "Okay, let me ask you a question about Knight skills.";
+ mes "What skill listed below is NOT used for attacking an opponent?";
+ next;
+ menu "Two-Hand Mastery Lv.5",sM_1a,"Berserk Lv.3",sM_1b,"Endure Lv.10",sM_1c,"Bash Lv.10",sM_1d;
+
+ sM_1a:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
+ mes "If you want to become a knight, you have to know what each skill does.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_1b:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
+ mes "If you want to become a knight, you have to know what each skill does.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_1c:
+ goto L_Cont1;
+
+ sM_1d:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this then you will never master the art of combat!";
+ mes "If you want to become a knight, you have to know what each skill does.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ L_Cont1:
+ mes "[Sir James Syracuse]";
+ mes "Knights are different from other classes in that Knights can use spears and have special spear skills.";
+ mes "What spear skill below uses the MOST sp?";
+ next;
+ menu "Pierce",sM_2a,"Spear Boomarang",sM_2b,"Spear Stab",sM_2c,"Riding",sM_2d;
+
+ sM_2a:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
+ mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_2b:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
+ mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_2c:
+ goto L_Cont2;
+
+ sM_2d:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this, it'll be hard for you to master the Spear!";
+ mes "How can you not know about this if you're trying to become a Knight? Thats just not tolerable!";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ L_Cont2:
+ mes "[Sir James Syracuse]";
+ mes "Spears can also have elemental properites.";
+ mes "Which of the elements below is strongest against Dark/Undead monsters?";
+ next;
+ menu "Holy",sM_3a, "Wind",sM_3b, "Poison",sM_3c, "Earth",sM_3d;
+
+ sM_3a:
+ goto L_Cont3;
+
+ sM_3b:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Wind is NOT that strong against undead!";
+ mes "These are basic stuff and you don't it how funny?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_3c:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Poion is NOT strong against undead";
+ mes "These are basic stuff and you don't it how funny";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_3d:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. Earth is NOT strong against undead";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ L_Cont3:
+ mes "[Sir James Syracuse]";
+ mes "When you become a Knight you can ride a pecopeco. However your attack speed drops significantly.";
+ mes "But if you learn the skill, Cavalry Mastery, your attack speed will increase again.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "What percentage of your attack speed is regained by learning level 3 cavalry mastery?";
+ next;
+ menu "70%",sM_4a, "80%",sM_4b, "90%",sM_4c, "100%",sM_4d;
+
+ sM_4a:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_4b:
+ goto L_Cont4;
+
+ sM_4c:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ sM_4d:
+ mes "[Sir James Syracuse]";
+ mes "^ff0000Wrong^000000. If you don't know this I recommend that you do not ride a peco";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You need to know the basics BEFORE you take this test!";
+ close;
+
+ L_Cont4:
+ mes "[Sir James Syracuse]";
+ mes "Good, looks like you know a lot about knights";
+ mes "Ok. Let me ask you some more questions";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "If you run into a novice and he asks you to tank for him because he's to lazy to fight on his own, you should....";
+ next;
+ menu "Tell the novice a good place to train",sM_5a, "Give him some zeny",sM_5b, "Give him some weapons",sM_5c;
+
+ sM_5a:
+ mes "[Sir James Syracuse]";
+ mes "Yes! That's a good answer. Novice's need to be independent and work hard on their own.";
+ mes "This builds good character and helps them become stronger.";
+ next;
+ goto L_Cont5;
+
+ sM_5b:
+ mes "[Sir James Syracuse]";
+ mes "WHAT?? Are you Nuts? Do you think that money is everything? LEAVE NOW!";
+ close;
+
+ sM_5c:
+ mes "[Sir James Syracuse]";
+ mes "Do you think you're helping someone when you give them good weapons?";
+ mes "You are basically KILLING them not helping them. LEAVE NOW!";
+ close;
+
+ L_Cont5:
+ mes "[Sir James Syracuse]";
+ mes "If you're in a party and your party gets attacked, what would you do?";
+ next;
+ menu "Stay in front and protect everyone.",sM_6a, "Wait until the others attack first then leech.",sM_6b,
+ "Who cares, I just want the drops.",sM_6c;
+
+ sM_6a:
+ mes "[Sir James Syracuse]";
+ mes "Yes! We Knights are important in most battles because of our strong attack and defensive skills.";
+ mes "We should try our best to take the brunt of any attack and allow our party members to provide support.";
+ next;
+ goto L_Cont6;
+
+ sM_6b:
+ mes "[Sir James Syracuse]";
+ mes "...WHAT? If you do that you're going to get EVERYONE KILLED!!";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You....LEAVE NOW! You don't have what it takes to become a Knight!";
+ close;
+
+ sM_6c:
+ mes "[Sir James Syracuse]";
+ mes "YOU THINK DROPS ARE MORE IMPORTANT THAN YOUR PARTY MEMBERS??";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "You don't have what it takes to become a knight... LEAVE NOW!!";
+ close;
+
+ L_Cont6:
+ mes "[Sir James Syracuse]";
+ mes "And finally, the last question. What do you think is most important to a Knight?";
+ next;
+ menu "Honor",sM_7a, "Money",sM_7b, "The Fame",sM_7c;
+
+ sM_7a:
+ mes "[Sir James Syracuse]";
+ mes "Yes! Absolutely correct! A Knight's pride and honor come before all else.";
+ mes "You have to always remember that!";
+ next;
+ mes "[Sir James Syracuse]";
+ goto L_Done;
+
+ sM_7b:
+ mes "[Sir James Syracuse]";
+ mes "You're a REALLY GREEDY PERSON!!";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "Leave now!! We DON'T want your kind here!";
+ close;
+
+ sM_7c:
+ mes "[Sir James Syracuse]";
+ mes "Did you want to a become a knight because you desired to become FAMOUS?";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "Leave now!! We DON'T need your kind here!";
+ close;
+
+ L_Done:
+ mes "Good job on passing the second test. Please speak with the Captain about your next test.";
+ next;
+ mes "[Sir James Syracuse]";
+ mes "There is more to a Knight than raw strength. Duty and honor are of the utmost importance to a Knight";
+ mes "Remember this and you will have no problems with the rest of the tests.";
+ set KNIGHT_Q, 3;
+ close;
+
+ M_End:
+ mes "[Sir James Syracuse]";
+ mes "I see. Take your time.";
+ close;
+
+}
+
+
+//<--------------------------------------------------------------------------------- Sir Windsor (3rd Test) -------------------------------------------------------------------------------------------------->\\
+// Sir Windsor ---------------------------------------------------------
+prt_in.gat,79,94,3 script Sir Windsor#1 733,{
+ mes "[Sir Windsor]";
+ if(BaseJob == Job_Knight) goto L_Knight;
+ if(BaseJob == Job_Novice) goto L_Novice;
+ if(BaseJob == Job_Swordman && KNIGHT_Q == 3) goto L_Test;
+ if(BaseJob == Job_Swordman && KNIGHT_Q == 4) goto L_Done;
+L_Other:
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes "What're you looking at.....?";
+ close;
+L_Novice:
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes "Go play somewhere else......";
+ close;
+L_Knight:
+ mes "Don't talk to me......";
+ emotion e_dots;
+ close;
+
+
+L_Test:
+ if(KNIGHT_Q2 == 2) goto L_Done;
+ if(KNIGHT_Q2 == 1) goto sL_ReTest;
+ mes ".............";
+ next;
+ mes "[Sir Windsor]";
+ mes "... so you're here to take the test?";
+ next;
+ mes "[Sir Windsor]";
+ mes "Follow me.....";
+ next;
+ set KNIGHT_Q2,1;
+ savepoint "prt_in.gat",77,96;
+ warp "job_knt",89,106;
+ end;
+
+ sL_ReTest:
+ mes ".............";
+ next;
+ mes "[Sir Windsor]";
+ mes "Hmf... your previous attempt was pathetic....";
+ next;
+ mes "[Sir Windsor]";
+ mes "Lets go......";
+ next;
+ savepoint "prt_in.gat",77,96;
+ warp "job_knt",89,106;
+ end;
+
+L_Done:
+ mes "Hmf.......";
+ next;
+ mes "[Sir Windsor]";
+ mes ".... You passed my test.";
+ next;
+ mes "[Sir Windsor]";
+ mes ".... Go talk to the Chivalry Captain Herman.";
+ set KNIGHT_Q2,0;
+ set KNIGHT_Q,4;
+ close;
+}
+
+
+// Waiting Room ---------------------------------------------------------------------------
+job_knt.gat,89,110,4 script Sir Windsor#2::SW2 733,{
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....You have a problem?";
+ next;
+ menu "What is this test about?",M_0, "I wanna kick some moster butt!.",M_1, "I want to leave.",M_2, "Nothing.",M_End;
+
+ M_0:
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....You are going to fight monsters.";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....You must kill every single monster in the arena.";
+ next;
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....You have to survive three levels of viscous monsters.";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....I will give you 3 minutes for each level.";
+ next;
+ mes "[Sir Windsor]";
+ mes "..........";
+ close;
+
+ M_1:
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....Go to the waiting room first.";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....The test will start soon.";
+ next;
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....If someones in there, you have to wait until they are done or fail.";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....Once that happens, you will be automatically warped to the test room..";
+ next;
+ mes "[Sir Windsor]";
+ mes "..........";
+ close;
+
+ M_2:
+ mes "[Sir Windsor]";
+ mes "..........";
+ next;
+ mes "[Sir Windsor]";
+ mes ".....Leave then.";
+ next;
+ warp "prt_in.gat",80,100;
+ close;
+
+ M_End:
+ mes "[Sir Windsor]";
+ mes "..........";
+ close;
+
+OnInit:
+ waitingroom "Knight Test Waiting Room",8,"SW2::OnStart",1;
+ end;
+
+OnStart:
+ set $@KntUsers, getareausers("job_knt.gat", 24, 126, 63, 165); // get user count for first lvl
+ set $@KntUsers, $@KntUsers + getareausers("job_knt.gat", 24, 32, 63, 71); // get user count for second lvl + first lvl
+ set $@KntUsers, $@KntUsers + getareausers("job_knt.gat", 124, 132, 163, 171); // get user count for third lvl + second lvl + first lvl
+ if($@KntUsers > 0) end;
+
+ if ((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room;
+ //kills off any left over monsters from other testers
+ killmonster "job_knt.gat", "KntLvl1::OnMyMobDead";
+ killmonster "job_knt.gat", "KntLvl2::OnMyMobDead";
+ killmonster "job_knt.gat", "KntLvl3::OnMyMobDead";
+ warpwaitingpc "job_knt.gat",43,146;
+ donpcevent "KntLvl1::OnStart";
+ end;
+}
+
+// First Level ---------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl1 -1,{
+
+OnStart:
+ set $@KntRm, 1;
+ set $@KntMob,12;
+ monster "job_knt.gat",39,150,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",47,150,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",39,142,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",47,142,"Dustiness",1114,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,137,"Piere",1160,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,155,"Piere",1160,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,155,"Deniro",1105,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,155,"Deniro",1105,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,155,"Andre",1095,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",43,137,"Andre",1095,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",35,146,"Argos",1100,1,"KntLvl1::OnMyMobDead";
+ monster "job_knt.gat",52,146,"Argos",1100,1,"KntLvl1::OnMyMobDead";
+ initnpctimer "TimerKnt";
+ end;
+
+OnMyMobDead:
+ set $@KntMob, $@KntMob - 1;
+ if($@KntMob > 0) end;
+
+ stopnpctimer "TimerKnt";
+ areaannounce "job_knt.gat", 24, 126, 63, 165, "[Sir Windsor]: Get ready for the second level....",8;
+ set $@KntMob, 0;
+ addtimer 5000, "KntLvl2::OnStart";
+ end;
+}
+
+
+// Second Level ---------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl2 -1,{
+
+OnStart:
+ set $@KntRm, 2;
+ set $@KntMob,12;
+ monster "job_knt.gat",53,52,"Frilldora",1119,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",34,52,"Frilldora",1119,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",43,42,"Desert Wolf",1106,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",43,62,"Desert Wolf",1106,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",58,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",58,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",29,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",29,52,"Drainliar",1111,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",60,68,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",27,68,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",60,35,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
+ monster "job_knt.gat",27,35,"Anacondaq",1030,1,"KntLvl2::OnMyMobDead";
+ warp "job_knt.gat",43,52;
+ initnpctimer "TimerKnt";
+ end;
+
+OnMyMobDead:
+ set $@KntMob, $@KntMob - 1;
+ if($@KntMob > 0) end;
+
+ stopnpctimer "TimerKnt";
+ areaannounce "job_knt.gat", 24, 32, 63, 71, "[Sir Windsor]: Get ready for the third level....",8;
+ set $@KntMob, 0;
+ addtimer 5000, "KntLvl3::OnStart";
+ end;
+
+}
+
+// Third Level ---------------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl3 -1,{
+
+OnStart:
+ set $@KntRm, 3;
+ set $@KntMob,7;
+ monster "job_knt.gat",136,152,"Knife Goblin Bro",1122,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",150,152,"Mace Goblin Bro",1123,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",143,145,"Axe Goblin Bro",1124,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",143,167,"Hammer Goblin Bro",1125,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",139,167,"Club Goblin Bro",1126,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",147,167,"Goblin Archer",1258,1,"KntLvl3::OnMyMobDead";
+ monster "job_knt.gat",136,158,"Steam Goblin",1280,1,"KntLvl3::OnMyMobDead";
+ warp "job_knt.gat",143,152;
+ initnpctimer "TimerKnt";
+ end;
+
+OnMyMobDead:
+ set $@KntMob, $@KntMob - 1;
+ if($@KntMob > 0) end;
+
+ stopnpctimer "TimerKnt";
+ set KNIGHT_Q2, 2;
+ areaannounce "job_knt.gat", 124, 132, 163, 171, "[Sir Windsor]: ....... test completed.",8;
+ set $@KntMob, 0;
+ addtimer 7000, "TimerKnt::OnTimer184000";
+ end;
+
+}
+
+// Timer --------------------------------------------------------------------------------
+job_knt.gat,1,1,1 script TimerKnt -1,{
+
+OnTimer2000:
+ set $@KntTime$, "You have 3 minutes...";
+ donpcevent "SW2::OnStart"; //checks to see if anyone is still in the room, in case of logout or KO
+ callsub AnnounceKnt;
+OnTimer32000:
+ donpcevent "SW2::OnStart";
+ end;
+OnTimer62000:
+ set $@KntTime$, "You have 2 minutes left...";
+ donpcevent "SW2::OnStart";
+ callsub AnnounceKnt;
+OnTimer92000:
+ donpcevent "SW2::OnStart";
+ end;
+OnTimer122000:
+ set $@KntTime$, "You have 1 minute left...";
+ donpcevent "SW2::OnStart";
+ callsub AnnounceKnt;
+OnTimer152000:
+ set $@KntTime$, "You have 30 seconds left...";
+ donpcevent "SW2::OnStart";
+ callsub AnnounceKnt;
+OnTimer162000:
+ set $@KntTime$, "You have 10 seconds left...";
+ callsub AnnounceKnt;
+OnTimer182000:
+ set $@KntTime$, "Times up! You failed!!";
+ donpcevent "SW2::OnStart";
+ callsub AnnounceKnt;
+OnTimer184000:
+ stopnpctimer;
+ if($@KntRm==1) areawarp "job_knt.gat", 24, 126, 63, 165, "prt_in.gat",77,96;
+ if($@KntRm==2) areawarp "job_knt.gat", 24, 32, 63, 71, "prt_in.gat",77,96;
+ if($@KntRm==3) areawarp "job_knt.gat", 124, 132, 163, 171, "prt_in.gat",77,96;
+ areaannounce "job_knt.gat", 82, 98, 97, 113, "[Sir Windsor]: The testing rooms are now open.....",8;
+ killmonster "job_knt.gat", "KntLvl1::OnMyMobDead";
+ killmonster "job_knt.gat", "KntLvl2::OnMyMobDead";
+ killmonster "job_knt.gat", "KntLvl3::OnMyMobDead";
+ donpcevent "SW2::OnStart";
+ end;
+
+AnnounceKnt:
+ if($@KntRm==1) areaannounce "job_knt.gat", 24, 126, 63, 165, "[Sir Windsor]: "+$@KntTime$+".",8;
+ if($@KntRm==2) areaannounce "job_knt.gat", 24, 32, 63, 71, "[Sir Windsor]: "+$@KntTime$+".",8;
+ if($@KntRm==3) areaannounce "job_knt.gat", 124, 132, 163, 171, "[Sir Windsor]: "+$@KntTime$+".",8;
+ end;
+}
+
+
+//<------------------------------------------------------------------------------------ Lady Amy Beatris (4th Test) ---------------------------------------------------------------------------------------------->\\
+prt_in.gat,69,107,5 script Lady Amy Beatris 728,{
+ mes "[Lady Amy Beatris]";
+ if (BaseJob == Job_Knight) goto L_Knight;
+ if (BaseJob == Job_Novice) goto L_Novice;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 4) goto L_Test;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 5) mes "Speak to the Chivalry Captain Herman about your next test.";
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 5) close;
+L_Other:
+ mes "Welcome to the Prontera Chivalry.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "There are only Knights here so just relax.";
+ close;
+L_Novice:
+ mes "Wow... A cute novice... soooo cute...";
+ emotion e_lv2;
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Do you want to become a Knight?";
+ if(sex==0) mes "I bet you'll be lovely as a Knight.";
+ if(sex==1) mes "I bet you'll be really handsome as a Knight.";
+ next;
+ mes "[Lady Amy Beatris]";
+ if(sex==0) mes "If you become a Knight, come back and see me. We Lady Knights should stick together.";
+ if(sex==1) mes "If you become a knight, come back and see me okay?(*winks*)";
+ close;
+L_Knight:
+ if(sex==1) goto L_Male;
+
+ L_Female:
+ mes "Oh my! Aren't you just the prettiest Knight. I love how your sword matches with your shoes.";
+ emotion e_lv2;
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Anyway, I'm glad you came back to see me. I'm always curious about how a Knight turns out.";
+ mes "You look like you're doing fine so continue the good work okay? Lady Knights rule!";
+ close;
+
+ L_Male:
+ mes "Well hello handsome. There's just something about men in armor....";
+ emotion e_lv;
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "So, did you come back for some fun...?";
+ next;
+ menu "YOU BET!!!",M_Yes, "... um... well... err...",M_No;
+
+ M_Yes:
+ mes "^FF0000(SLAPP!! SMACK!! BASH!!)^000000";
+ emotion e_an;
+ percentheal (-10),0;
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "How dare you!! Just what kind of girl do you take me for?";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Allways remember that a Knight's a Knight, no matter what gender they are.";
+ mes "Also remember to be respectfull to women at all times!";
+ emotion e_pif;
+ close;
+
+ M_No:
+ mes "[Lady Amy Beatris]";
+ mes "Teh he he. Silly, I'm just playing with you. You may be good looking, but I'm NOT that kind of girl.";
+ emotion e_heh;
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Anyway, I'm glad you came back to see me. I'm always curious about how a Knight turns out.";
+ mes "You look like you're doing fine so continue the good work okay?";
+ emotion e_no1;
+ close;
+
+
+L_Test:
+ if(KNIGHT_Q2 == 1) mes "Are you ready to take the test over?"; //for when someone retakes the test
+ if(KNIGHT_Q2 == 1) goto M_Menu;
+ mes "Hello. Your ^ff0000"+strcharinfo(0)+"^000000, right?";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "My name is Amy Beatris, a Knight of the Prontera Chivalry.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "For your test I will be asking you some questions";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Please listen carefully and pick the correct answer.";
+M_Menu:
+ next;
+ menu "Ok. I'm ready.",M_0, "Please give me some time.",M_End;
+
+ M_0:
+ set @score,0;
+
+ mes "[Lady Amy Beatris]";
+ mes "Let's say your in Morroc and you want to recruit a party member. What would you do?";
+ next;
+ menu "Randomly follow someone around",sM_0a, "Make a chatroom and wait.",sM_0b, "Ask if anyone wants to party with a Knight..",sM_0c;
+
+ sM_0a:
+ goto L_Cont1;
+
+ sM_0b:
+ set @score, @score + 10;
+ goto L_Cont1;
+
+ sM_0c:
+ set @score, @score + 10;
+
+ L_Cont1:
+ mes "[Lady Amy Beatris]";
+ mes "You're in a party with a hunter, a priest, a wizard, a blacksmith, and an assassin.";
+ mes "The six of you decide to train in the Pyramids.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Your party makes it to the fourth floor of the pyramid, what will you do now?";
+ next;
+ menu "Scout ahead and make sure it's safe for all",sM_1a, "Go fight by yourself",sM_1b, "Stay in front of the party and move slowly",sM_1c;
+
+ sM_1a:
+ set @score, @score + 10;
+
+ sM_1b:
+ goto L_Cont2;
+
+ sM_1c:
+ set @score, @score + 10;
+
+ L_Cont2:
+ mes "[Lady Amy Beatris]";
+ mes "A lame-o guy creates a mob right in front of your party and disappears. What would you do?";
+ next;
+ menu "Look after your partners",sM_2a, "Fight hard and help when needed",sM_2b, "Take your PecoPeco and RIDE like the WIND!",sM_2c;
+
+ sM_2a:
+ set @score, @score + 10;
+ goto L_Cont3;
+
+ sM_2b:
+ set @score, @score + 10;
+ goto L_Cont3;
+
+ sM_2c:
+
+ L_Cont3:
+ mes "[Lady Amy Beatris]";
+ mes "Somehow you beat the mob. Your party then journeys on and you stumble upon someone who has fainted.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "This guy begs you to help him, what will you do?";
+ next;
+ menu "Ask the priest in your party to help.",sM_3a, "Ask him how much he'll pay you if you help",sM_3b, "Ignore him.",sM_3c;
+
+ sM_3a:
+ set @score, @score + 10;
+
+ sM_3b:
+
+ sM_3c:
+
+ L_Cont4:
+ mes "[Lady Amy Beatris]";
+ mes "You guys have to go to different places so you guys seperate yourselves into smaller groups.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "During your previous battles, a monster dropped a very valuable item that you picked up. What do you do with it?";
+ next;
+ menu "Give it to the person that deserves it the most.",sM_4a, "Pretend you don't know about it.",sM_4b, "Discuss it with the others.",sM_4c;
+
+ sM_4a:
+ set @score, @score + 10;
+
+ sM_4b:
+ goto L_Cont5;
+
+ sM_4c:
+ set @score, @score + 10;
+
+ L_Cont5:
+ mes "[Lady Amy Beatris]";
+ mes "You decide to go back to Prontera and sell some of the valuble items you picked up.";
+ mes "On the road, you see a lot of chatrooms.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "What would be the best way to sell them?";
+ next;
+ menu "Sell them to an NPC.",sM_5a, "Create a chatroom to advertise the items.",sM_5b, "Go around looking for someone that needs them.",sM_5c;
+
+ sM_5a:
+ goto L_Cont6;
+
+ sM_5b:
+ set @score, @score + 10;
+ goto L_Cont6;
+
+ sM_5c:
+ set @score, @score + 10;
+
+ L_Cont6:
+ mes "[Lady Amy Beatris]";
+ mes "Someone comes up to you and begs you for money. What would you do?";
+ next;
+ menu "Give him some money and items.",sM_6a, "Ignore him.",sM_6b, "Tell him a place where its suitable for him to earn money.",sM_6c;
+
+ sM_6a:
+
+ sM_6b:
+ goto L_Cont7;
+ sM_6c:
+ set @score, @score + 10;
+
+ L_Cont7:
+ mes "[Lady Amy Beatris]";
+ mes "Now your alone and training in a forest. You are happily riding a pecopeco.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "You run into somone who's lost. What do you do?";
+ next;
+ menu "Tell her where the exit is.",sM_7a, "Bring her to the exit.",sM_7b, "Give her a butterfly wing.",sM_7c;
+
+ sM_7a:
+ set @score, @score + 10;
+ goto L_Cont8;
+
+ sM_7b:
+ set @score, @score + 10;
+
+ sM_7c:
+
+ L_Cont8:
+ mes "[Lady Amy Beatris]";
+ mes "You're still in the forest but now your busy fighting monsters.";
+ mes "You realize that you've run out of healing items and your health is very low.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Suddenly a priest appears! What would you do?";
+ next;
+ menu "'Give me a heal'",sM_8a, "'Would you please heal me. I'll share the drops with you.'",sM_8b, "'Dude! I need healz plz.'",sM_8c;
+
+ sM_8a:
+ goto L_Cont9;
+
+ sM_8b:
+ set @score, @score + 10;
+
+ sM_8c:
+
+ L_Cont9:
+ mes "[Lady Amy Beatris]";
+ mes "Your getting tired so you decide to head back to town.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "On the road back to town, you see a very valuable object. What will you do?";
+ next;
+ menu "Pick it up and keep it.",sM_9a, "Ask around to see if anyone dropped it.",sM_9b, "Leave it there.",sM_9c;
+
+ sM_9a:
+ goto L_Cont10;
+
+ sM_9b:
+ set @score, @score + 10;
+ goto L_Cont10;
+
+ sM_9c:
+ set @score, @score + 10;
+
+ L_Cont10:
+ mes "[Lady Amy Beatris]";
+ mes "Alright. I'm finished with my questions. Now that wasn't so bad was it?";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Okay, let me just quickly add up your score....";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "You got a score of ^ff0000"+@score+"^000000 out of ^0000ff100^000000.";
+ next;
+ mes "[Lady Amy Beatris]";
+ if(@score == 100) goto L_100;
+ if(@score >= 80) goto L_80;
+
+ L_Failed:
+ mes "I am sorry but you failed the test. I hope you will try again and do better next time.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "When I ask you a question please think hard about it.";
+ set KNIGHT_Q2, 1; //flag for re-taking the test
+ close;
+
+ L_100:
+ mes "Great job! You got a perfect score. If you keep this up, you'll become one of the best knights around.";
+ mes "Speak to the Chivalry Captain Herman about your next test.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Keep up the good work and pass all the tests okay?";
+ set KNIGHT_Q, 5;
+ set KNIGHT_Q2, 0;
+ close;
+ L_80:
+ mes "Not bad. Not as good as had I hoped, but you did well enough to pass.";
+ mes "Speak to the Chivalry Captain Herman about your next test.";
+ next;
+ mes "[Lady Amy Beatris]";
+ mes "Good luck on the next test. I hope you'll pass and become a knight soon.";
+ set KNIGHT_Q, 5;
+ set KNIGHT_Q2, 0;
+ close;
+
+ M_End:
+ mes "[Lady Amy Beatris]";
+ mes "Sure thing. See me when you're ready.";
+ close;
+
+}
+
+
+//<------------------------------------------------------------------------------------------- Sir Edmund (5th Test) --------------------------------------------------------------------------------------------->\\
+prt_in.gat,70,99,5 script Sir Edmund 734,{
+ mes "[Sir Edmund]";
+ if (BaseJob == Job_Knight) goto L_Knight;
+ if (BaseJob == Job_Swordman) goto L_Sword;
+ if (BaseJob == Job_Novice) goto L_Novice;
+L_Other:
+ mes "Everything in this world exists in harmony.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Living without disrupting this harmony is the only true way to live your life....";
+ close;
+L_Novice:
+ mes "A tree with deep roots will not be swayed by the wind.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Skills rooted in a strong foundation will one day shine their light...";
+ next;
+ mes "[Sir Edmund]";
+ mes "You future will be decided by what you do now.... so strengthen those roots.";
+ close;
+
+ mes "[Sir Edmund]";
+ mes "People who wants to be on the dark side will always have nightmares";
+ next;
+ mes "[Sir Edmund]";
+ mes "If a person gets a nightmare everyday, all his dreams will be crushed...";
+ close;
+
+L_Knight:
+ mes "Make your heart into a river.";
+ next;
+ mes "[Sir Edmund]";
+ mes "A river will wash out everything in its path...";
+ next;
+ mes "[Sir Edmund]";
+ mes "As a knight you must walk your path like a flowing river.";
+ close;
+
+L_Sword:
+ if (KNIGHT_Q == 5) goto L_Test;
+ if (KNIGHT_Q == 6) goto L_Done;
+ mes "Those with ominous thoughts will only dream ominous dreams.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Having ominous dreams will result in no dreams at all....";
+ close;
+L_Test:
+ if(KNIGHT_Q2 == 1) goto L_ReTest;
+ if(KNIGHT_Q2 == 2) goto L_Done;
+ mes "Oh so its your turn to take my test.";
+ mes "I hope you can pass it";
+ next;
+ mes "[Sir Edmund]";
+ mes "My name is Edmund.";
+ mes "And iam a knight in the prontera Knight Guild.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Knights are like the people that keeps justice and peace in this world...";
+ mes "If you can help people and be nice, you'll be one of the best knights in this world.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Your actions can't be slow, if you decide on something, you got to do it.";
+ mes "Sometimes you can be the water, Weak , but most time you got to be the wind, HARD.";
+ next;
+ mes "[Sir Edmund]";
+ mes "You can't kill monsters because its fun.";
+ mes "And sometimes you'll need time to calm down...";
+ next;
+ mes "[Sir Edmund]";
+ mes "Okay lets start the test now.";
+ next;
+ warp "job_knt.gat",143,57;
+ doevent "ev_Test::OnStart";
+ end;
+
+ L_ReTest:
+ mes "Last time when you did the test you didn't try hard enough.";
+ mes "A knights weapon should only be used to protect, not to bully weak monsters.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Everything in this world is equal, there shouldn't be any exceptions.";
+ mes "This point shouldn't be kept just when you have tests, it should be kept when you're training in real life...";
+ next;
+ mes "[Sir Edmund]";
+ mes "Okay now, try again.";
+ next;
+ warp "job_knt.gat",143,57;
+ doevent "ev_Test::OnStart";
+ end;
+
+ L_Done:
+ mes "You have done very well to pass my test.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Remember that true strength comes from patience and understanding.";
+ next;
+ mes "[Sir Edmund]";
+ mes "When you understand the world around you, you will be able to overcome any obstacle in life.";
+ next;
+ mes "[Sir Edmund]";
+ mes "Go to the Chivalry Captain Herman and find out about your next challenge. Good luck.";
+ set KNIGHT_Q2,0;
+ set KNIGHT_Q,6;
+ close;
+}
+
+// Test -----------------------------
+job_knt.gat,1,1,1 script ev_Test -1,{
+
+OnStart:
+ killmonster "job_knt.gat","ev_Test::OnMyMobDead";
+ monster "job_knt.gat",141,57,"Poring",1002,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",145,57,"Poring",1002,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",143,55,"Poring",1002,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",143,59,"Poring",1002,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",141,55,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",141,59,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",145,55,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",145,59,"Lunatic",1063,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",139,57,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",147,57,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",143,53,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",143,61,"Chonchon",1011,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",130,69,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",157,69,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",130,42,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",157,42,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",165,54,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",165,57,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",122,54,"Spore",1014,1,"ev_Test::OnMyMobDead";
+ monster "job_knt.gat",122,57,"Spore",1014,1,"ev_Test::OnMyMobDead";
+
+ addtimer 240000, "ev_Test::OnTimerPass";
+ end;
+
+OnTimerPass:
+ set KNIGHT_Q2, 2;
+ areaannounce "job_knt.gat", 124, 36, 163, 75, "[Sir Edmund]: Well done.",0;
+ addtimer 4000, "ev_Test::OnTimerWarp";
+ end;
+
+OnMyMobDead:
+ set KNIGHT_Q2, 1;
+ areaannounce "job_knt.gat", 124, 36, 163, 75, "[Sir Edmund]: You are not at peace and therfore have failed my test.",0;
+ deltimer "ev_Test::OnTimerPass";
+ addtimer 4000, "ev_Test::OnTimerWarp";
+ end;
+
+OnTimerWarp:
+ if(KNIGHT_Q2 == 2) warp "prt_in.gat",80,100;
+ if(KNIGHT_Q2 == 1) warp "prt_fild05.gat",353,251;
+ end;
+}
+
+
+//<------------------------------------------------------------------------------------------ Sir Grey (Final Test) ------------------------------------------------------------------------------------------------------>\\
+prt_in.gat,87,90,3 script Sir Grey 119,{
+ mes "[Sir Grey]";
+ if (BaseJob == Job_Knight) goto L_Knight;
+ if (BaseJob == Job_Novice) goto L_Novice;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 6) goto L_Test;
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 7) mes "Go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
+ if (BaseJob == Job_Swordman && KNIGHT_Q == 7) close;
+L_Other:
+ mes "Use your time wisely young one......";
+ next;
+ mes "[Sir Grey]";
+ mes "You don't want to end up regreting missed opportunities.";
+ close;
+L_Novice:
+ mes "Believe it or not, I was once a Novice as well.";
+ next;
+ mes "[Sir Grey]";
+ mes "Back then, I never dreamed about being a knight.... I just wanted to become a strong person.....";
+ next;
+ mes "[Sir Grey]";
+ mes "And somehow after all these years, I ended up becoming one. Imagine that.... Hahaha.";
+ emotion e_heh;
+ close;
+L_Knight:
+ mes "I don't know if I can even properly describe the ^00aa00Claymore^000000, but I know this... it's the greatest weapon a Knight can wield!!";
+ next;
+ mes "[Sir Grey]";
+ mes "Yes! The ^00aa00'Claymore'^000000!! Every knight should have one!";
+ next;
+ menu "Info about the Claymore ",M_Info, "Buy the Claymore",M_Buy, "End talk",M_Cancel;
+
+ M_Info:
+ mes "[Sir Grey]";
+ mes "The Claymore is the best 2 handed sword a knight can get. Its like a knight's bestfriend.";
+ next;
+ mes "[Sir Grey]";
+ mes "Our guild works very hard to make these beautiful Claymore swords and therefore deserves some compensation for their work.";
+ next;
+ mes "[Sir Grey]";
+ mes "For the small fee of ^0000ff'74000 zeny'^000000 and ^0000ff'1 Steel '^000000, any Knight can get their hands on a Claymore.";
+ next;
+ mes "[Sir Grey]";
+ mes "I'm in charge of selling them so if you would like one let me know.";
+ close;
+
+ M_Buy:
+ if(countitem(999) < 1 || Zeny < 74000) goto L_NotEnough;
+
+ mes "[Sir Grey]";
+ mes "Good, you brought me the steel and have enough to cover the labor fee.";
+ next;
+ mes "[Sir Grey]";
+ mes "Here you are! A magnificant weapon that is un-matched in quality and strength! I know you will use it well.";
+ delitem 999, 1;
+ set Zeny, Zeny - 74000;
+ getitem 1163, 1;
+ close;
+
+ L_NotEnough:
+ mes "[Sir Grey]";
+ mes "I know you want a claymore but you need to bring me ^0000ff'74000 zeny'^000000 and ^0000ff'1 Steel '^000000.";
+ next;
+ mes "[Sir Grey]";
+ mes "When you get the steel and the money, come back and see me.";
+ close;
+
+ M_Cancel:
+ mes "[Sir Grey]";
+ mes "If your going to be a good knight, you'll need a claymore..";
+ mes "I'll be glad to see you after your training...";
+ close;
+
+L_ReTest:
+ mes "I see you're back. Have you spent enough time reflecting on Knighthood?";
+ mes "I hope that you are now ready for this test.";
+ goto M_Menu;
+
+L_Test:
+ if (KNIGHT_Q2 == 1) goto L_ReTest;
+ mes "Haha, so you already finished all the other tests eh?";
+ next;
+ mes "[Sir Grey]";
+ mes "Okay then, lets start my test. Its not any different from the other ones.";
+M_Menu:
+ next;
+ menu "Bring it on!",M_0, "Maybe a little later.",M_End;
+
+ M_0:
+ set @score,0;
+ mes "[Sir Grey]";
+ mes "Let me ask you a few questions.";
+ next;
+
+ mes "[Sir Grey]";
+ mes "First, why are you so determined to become a knight?";
+ next;
+ menu "I want to be stronger.",sM_0, "I want to help the town.",sM_1, "Being a Swordsman sucks.",sM_2;
+
+ sM_0:
+ mes "[Sir Grey]";
+ mes "To become stronger huh.... It's true that becoming a knight does make you stronger but....";
+ next;
+ mes "[Sir Grey]";
+ mes "What would you do with that strength? Use it to help a town? Show it off to people? Or is there another reason?";
+ next;
+ menu "Use it to make me rich$$.",sM_0a, "Use it to protect myself.",sM_0b, "Use it to protect other people.",sM_0c;
+
+ sM_0a:
+ set @score, @score + 10;
+ mes "[Sir Grey]";
+ mes "Money is important for a comfortable living, but a Knights strength can be used for more important things.";
+ goto L_Cont1;
+
+ sM_0b:
+ mes "[Sir Grey]";
+ mes "This is a very good idea. By first learning how to protect yourself, you will then be able to protect others.";
+ mes "I admire your thought very much.";
+ goto L_Cont1;
+
+ sM_0c:
+ mes "[Sir Grey]";
+ mes "It is a great idea to help others. We Knights pride ourselves on serving the public in anyway we can.";
+ goto L_Cont1;
+
+ sM_1:
+ mes "[Sir Grey]";
+ mes "I see. You have a very strong sense of community.";
+ next;
+ mes "[Sir Grey]";
+ mes "With the power that comes with becoming Knight, what would you do to help the town?";
+ next;
+ menu "Whatever the town needs me to do.",sM_1a, "I will help the town get rich.",sM_1b, "I will protect the citizens of the town.",sM_1c;
+
+ sM_1a:
+ mes "[Sir Grey]";
+ mes "Good. A Knight should always strive to help whatever the task.";
+ goto L_Cont1;
+
+ sM_1b:
+ set @score, @score + 10;
+ mes "[Sir Grey]";
+ mes "A town does need money to be prosperous, but that is not the most important thing a town needs.";
+ mes "As a Knight you can provide the town with protection and other valuable services.";
+ goto L_Cont1;
+
+ sM_1c:
+ mes "[Sir Grey]";
+ mes "A very noble idea indeed. Towns people are often ill equiped to protect themselves from monsters.";
+ mes "By providing them with protection, you can allow the towns people to live their lives peacefully.";
+ goto L_Cont1;
+
+ sM_2:
+ set @score, @score + 5;
+ mes "[Sir Grey]";
+ mes "Hmm... that's very interesting. Most people enjoy being a Swordsman.";
+ next;
+ mes "[Sir Grey]";
+ mes "Well, what exactly don't you like about being a Swordsman?";
+ next;
+ menu "The skills.",sM_2a, "Swordsman are weak.",sM_2b, "The hard work.",sM_2c;
+
+ sM_2a:
+ set @score, @score + 5;
+ mes "[Sir Grey]";
+ mes "A skill is only as good as the person who uses it. Different skills are used for different situations.";
+ next;
+ mes "[Sir Grey]";
+ mes "If you have not figured out how to effectively use the Swordsman's skills by now, how do you expect to be able to use a Knight's skills?";
+ goto L_Cont1;
+
+ sM_2b:
+ set @score, @score - 5;
+ mes "[Sir Grey]";
+ mes "What? Swordsman are the strongest of the 1st job classes. A Knight's strength is the progression of a Swordsman's strength.";
+ next;
+ mes "[Sir Grey]";
+ mes "If you are a weak Swordsman, I can garauntee that you will be a weak Knight.";
+ goto L_Cont1;
+
+ sM_2c:
+ set @score, @score + 5;
+ mes "[Sir Grey]";
+ mes "Hahaha!. If you think it gets any easier as a Knight you're sadly mistaken my friend.";
+ mes "With the added skills and strength a Knight gets, comes added challenges.";
+ goto L_Cont1;
+
+ L_Cont1:
+ next;
+ mes "[Sir Grey]";
+ mes "Just a reminder, when you become a Knight you will NOT be able to change back into a Swordsman.";
+ next;
+ mes "[Sir Grey]";
+ mes "If you were to become a Knight right now, what would be the first thing you would do?";
+ next;
+ menu "I would go into battle.",sM_3, "Go back to the person who's waiting for me.",sM_4, "Learn more about Knights.",sM_5;
+
+ sM_3:
+ mes "[Sir Grey]";
+ mes "Okay... so you would battle and in doing so you would.....";
+ next;
+ menu "... become the strongest warrior.",sM_3a, "... find out how good I am.",sM_3b, "... go places where Swordsmen can't.",sM_3c;
+
+ sM_3a:
+ set @score, @score + 10;
+ mes "[Sir Grey]";
+ mes "Hold on there tiger. Don't get too eager now. You have to get the basics of Knighthood down first.";
+ mes "Without it you may become the weakest warrior around.";
+ goto L_Cont2;
+
+ sM_3b:
+ mes "[Sir Grey]";
+ mes "Yes! Understanding your strengths and weaknesses is a very important aspect of being a Knight.";
+ goto L_Cont2;
+
+ sM_3c:
+ mes "[Sir Grey]";
+ mes "As a Knight you will be able to train in places you couldn't as a Swordsman.";
+ mes "But becarefull. If you move to fast you may find yourself in a world of trouble.";
+ goto L_Cont2;
+
+ sM_4:
+ mes "[Sir Grey]";
+ mes "Who's waiting for you?";
+ next;
+ menu "A friend.",sM_4a, "A Villager.",sM_4b, "My girlfriend/boyfriend.",sM_4c;
+
+ sM_4a:
+ mes "[Sir Grey]";
+ mes "Yes, he/she will be happy to see you. Now you will be able to protect your freind when he/she is in danger.";
+ goto L_Cont2;
+
+ sM_4b:
+ mes "[Sir Grey]";
+ mes "A villager...... oh... ";
+ goto L_Cont2;
+
+ sM_4c:
+ mes "[Sir Grey]";
+ mes "Oh I see! Did you become a knight because of your this person?";
+ next;
+ mes "[Sir Grey]";
+ if(sex == 1) mes "I hope you will be able to protect her anytime and anywhere!";
+ if(sex == 0) mes "I hope you will be able to protect him anytime and anywhere!";
+ next;
+ mes "[Sir Grey]";
+ mes "Good luck to you and your loved one.";
+ goto L_Cont2;
+
+ sM_5:
+ mes "[Sir Grey]";
+ mes "What else do you want to know?";
+ next;
+ menu "The safest place for a Knight to be.",sM_5a, "A place where a knight can train.",sM_5b, "A place where a knight can earn a lot of cash.",sM_5c;
+
+ sM_5a:
+ set @score, @score + 5;
+ mes "[Sir Grey]";
+ mes "There's no place in this world thats truly safe. Especially for a Knight.";
+ mes "A Knight is always expected to fight the strongest and most fearsome monsters";
+ goto L_Cont2;
+
+ sM_5b:
+ mes "[Sir Grey]";
+ mes "Ask other Knights around Rune-Midgard for advice. You're sure to get some good tips.";
+ goto L_Cont2;
+
+ sM_5c:
+ set @score, @score + 15;
+ mes "[Sir Grey]";
+ mes "The role of a Knight is NOT to make lots and lots of money! A Knight has the duty to serve and protect the citizens of Rune-Midgard.";
+
+ L_Cont2:
+ next;
+ mes "[Sir Grey]";
+ mes "Well that's it. This is the end of my test and the final test in your quest to become a Knight.";
+ mes "Let me now give you my decision.....";
+ next;
+
+ if (@score == 0) goto L_1;
+ if (@score == 5) goto L_2;
+ if (@score == 10) goto L_3;
+
+ L_0:
+ set KNIGHT_Q2, 1;
+ mes "[Sir Grey]";
+ mes "Although I enjoyed speaking with you today.....";
+ next;
+ mes "[Sir Grey]";
+ mes "I'm afraid that you are not ready for Knighthood.";
+ mes "I think it would be best for you to stay a Swordman for the time being.";
+ next;
+ mes "[Sir Grey]";
+ mes "Being a Knight requires not only strength, but discipline and ethical values as well.";
+ mes "A Knight has the duty to protect and help others therefore he/she must be of sound mind and body.";
+ next;
+ mes "[Sir Grey]";
+ mes "Your answers did not seem to represent the type of attributes we look for in a Knight candidate.";
+ next;
+ mes "[Sir Grey]";
+ mes "If you really want to become a Knight, I suggest you spend some more time contemplating the idea then come back to me.";
+ close;
+
+ L_1:
+ set KNIGHT_Q, 7;
+ set KNIGHT_Q2, 0;
+ mes "[Sir Grey]";
+ mes "I am glad that I got a chance to speak with someone such as yourself. You remind me of myself when i was young. Heh heh heh.";
+ next;
+ mes "[Sir Grey]";
+ mes "More importantly...., CONGRATULATIONS!";
+ next;
+ mes "[Sir Grey]";
+ mes "You have done an exellent job to make it this far and your answers proved that you are worthy of Knighthood.";
+ next;
+ mes "[Sir Grey]";
+ mes "You will make a fine Knight! Go to the Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
+ close;
+
+ L_2:
+ set KNIGHT_Q, 7;
+ set KNIGHT_Q2, 0;
+ mes "[Sir Grey]";
+ mes "It was nice to talk to you. As a Knight, I expect that you will expand your mind and fullfill your potential.";
+ next;
+ mes "[Sir Grey]";
+ mes "That's right. You have passed my test and are now ready to be Knighted. Congratulations!";
+ next;
+ mes "[Sir Grey]";
+ mes "Now go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
+ close;
+
+ L_3:
+ set KNIGHT_Q, 7;
+ set KNIGHT_Q2, 0;
+ mes "[Sir Grey]";
+ mes "Although I appreciate your candir in answering my questions, to be honest, I am a bit worried about what I heard.";
+ next;
+ mes "[Sir Grey]";
+ mes "Still, you seem to have enough attributes that are consistent with what we are looking for in a Knight candidate.";
+ next;
+ mes "[Sir Grey]";
+ mes "I'm sure with hard work and dedication you will make a fine Knight. Congratulations! You have passed my test.";
+ next;
+ mes "[Sir Grey]";
+ mes "Now go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
+ close;
+
+ M_End:
+ close;
+}
+
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_knt.gat mapflag nomemo
+job_knt.gat mapflag noteleport
+job_knt.gat mapflag nosave SavePoint
+job_knt.gat mapflag nopenalty
+job_knt.gat mapflag nobranch
+job_knt.gat mapflag noexp
+job_knt.gat mapflag noloot
diff --git a/npc/jobs/2-1/priest.txt b/npc/jobs/2-1/priest.txt
index b8848a9ef..14ff6d1e5 100644
--- a/npc/jobs/2-1/priest.txt
+++ b/npc/jobs/2-1/priest.txt
@@ -1,1435 +1,1435 @@
-//===== eAthena Script =======================================
-//= Priest Quest
-//===== By: ==================================================
-//= Translated By: Pgro Team (OwNaGe)(Aegis)
-//= Converted by: kobra_k88.
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Official RO Priest Quest converted from Aegis script.
-//===== Additional Comments: =================================
-//= Fully working. Changed the way Priests enter the test room to help Acos.
-//= Must use this with the included Acolyte quest to work properely.
-//= 1.3 Added Baby Class support, fixed 3 wrong constants bugs [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Merged JFunc [Lupus]
-//==========================================================
-
-
-//*********************************************************************************************************************************************************************************\\
-//============================================ Father Thomas: Job changer, Test 1 =============================================\\
-//*********************************************************************************************************************************************************************************\\
-prt_church.gat,16,41,4 script Father Thomas 60,{
- callfunc "F_BlockHigh",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"High Priest","Father Thomas";
-
- mes "[Father Thomas]";
- if(BaseJob == Job_Acolyte) goto L_Start;
- if(BaseJob == Job_Novice){
- mes "May God bless you, child. This is the Prontera Church. What are you here for?";
- next;
- menu "I want to become an Acolyte.",-, "I want to become a ^5533FFPriest^000000.",M_0b, "I'm just walking around.",M_0End;
-
- mes "[Father Thomas]";
- mes "Haha.. so you want to become an Acolyte eh? To apply to become an Acolyte, please go to the room opposite of here.";
- close;
- M_0b:
- mes "[Father Thomas]";
- mes "Haha...in order to become a priest you must first become an Acolyte. To become an Acolyte, go to the room opposite of here.";
- close;
- M_0End:
- mes "[Father Thomas]";
- mes "Please feel free to rest here. The church is a sanctuary for all those, who seek to escape the outside world.";
- next;
- mes "[Father Thomas]";
- mes "May God be with you in your thoughts and prayers.";
- close;
- }
- if(BaseJob == Job_Priest){
- mes "God bless you, child. You are here again because you listened to God's orders.";
- next;
- mes "[Father Thomas]";
- mes "I don't know if God's sons and daughters are going on the path of light or the path of darkness... I can only pray for the best.";
- next;
- mes "[Father Thomas]";
- mes "So why are you here today?";
- next;
- menu "I just wanted to see how you were.",-, "I'm here to help the Acolytes.",M_1b, "Life is really hard... I was wondering if you could help.",M_1End;
-
- mes "[Father Thomas]";
- mes "Oh, well I'm fine thank you. Please send my regards to all of the other Priests, and Priestess.";
- next;
- mes "[Father Thomas]";
- mes "We, the ones who follow the devine path, are here for one reason.... to obey Gods orders.";
- mes "If you come across anyone who needs help, please remember to assist them in any way you can...";
- close;
- M_1b:
- mes "[Father Thomas]";
- mes "Oh...thats a great idea! Since you're a priest, you can't forget that you have to help the Acolytes when they need it.";
- emotion e_ic;
- next;
- mes "[Father Thomas]";
- mes "Even so, you must be carefull not to do everyting for them. It is important that they gain their own experiences through training ";
- next;
- mes "[Father Thomas]";
- mes "In order to go in and help you'll need a ^5533FFROSARY^000000.";
- mes "There will be 3 trials for the Acolyte to face, but in only 2 of them will your assistance be needed.";
- next;
- mes "[Father Thomas]";
- mes "Are you prepared to help?";
- next;
- menu "Yes, i will help them with all my might.",-, "I will come back later.",sM_1End;
-
- mes "[Father Thomas]";
- if (countitem(2608) < 1){
- mes "Hmm... it doesn't look like you have a ^5533FFROSARY^000000 with you.";
- next;
- mes "[Father Thomas]";
- mes "If you want to help the Acolytes, you must first get a ^5533FFROSARY^000000.";
- mes "Please come back when you have one.";
- close;
- }
- mes "Very well then. I will send you to an Acolyte in just a moment.";
- next;
- mes "[Father Thomas]";
- mes "I hope you will also take this opportunity to teach them what it means to be a good Priest.";
- next;
- if((getareausers("job_prist.gat", 8, 34, 39,109)) == 1) warp "job_prist.gat", 24, 44;
- if((getareausers("job_prist.gat", 160, 14, 175, 178)) == 1) warp "job_prist.gat", 98, 40;
- if((getareausers("job_prist.gat", 90, 34, 105,105)) == 1) warp "job_prist.gat", 168, 17;
- mes "[Father Thomas]";
- mes "Hmm........ wait a minute..... let me check my list.... Either no one is taking the test right now, or another Priest is already helping out.";
- mes "In any case please check with me again later.";
- close;
- sM_1End:
- mes "[Father Thomas]";
- mes "Oh, alright. Just remember to bring a ^5533FFFROSARY^000000 when you come back.";
- close;
-
- M_1End:
- mes "[Father Thomas]";
- mes "Keep up the good work. I will ask God to ease your pain.";
- next;
- mes "[Father Thomas]";
- mes "God, one of your children is suffering. Please use your powers, to heal the wounds on this battered body.....";
- next;
- mes "[Father Thomas]";
- mes "Please look after us, so that under any condition we will be able to think clearly and maintain our faith";
- percentheal 100,100;
- next;
- mes "[Father Thomas]";
- mes "You should be feeling better now. Please stay on the path to rightousness and may God bless you.";
- close;
- }
- mes "May God bless you my child.";
- next;
- mes "[Father Thomas]";
- mes "Please feel free to rest, the church is the safest place in this world.";
- next;
- mes "[Father Thomas]";
- mes "I hope God will bless you.";
- close;
-
-L_Start:
- if (PRIEST_Q == 1) goto L_Test1;
- if (PRIEST_Q == 2) goto L_Test2;
- if (PRIEST_Q == 3) goto L_Test3;
- if (PRIEST_Q == 4) goto L_Change;
- mes "God bless you, child. What brings you here?";
- next;
- menu "I want to become a priest.",M_2a, "Can you please tell me about Priests.",M_2b, "I just wanted to see how you were doing.",M_2End;
-
- M_2a:
- mes "[Father Thomas]";
- mes "Oh... so you want to become a priest? God bless you for your determination.";
- next;
- mes "[Father Thomas]";
- mes "I'm Father Thomas. I'm in charge of protecting Prontera from the evil spirits that plague the lands of Rune Midgard.";
- next;
- mes "[Father Thomas]";
- mes "Please fill out this application form so that I can review your qualifications for becoming a Priest.";
- next;
- mes "(you fill out the form and hand it back)";
- next;
- mes "[Father Thomas]";
- if (JobLevel < 40) goto sL_LowLvl;
- if (JobLevel == 50) goto sL_HighLvl;
- mes "Ah, very good " + strcharinfo(0) + ". Let me now tell you about the tasks you will have to fullfill in order to become a Priest.";
- next;
- mes "[Father Thomas]";
- mes "The first task will be to find and speak with 3 very wise Clerics. They are located in various parts of Rune Midgard.";
- next;
- mes "[Father Thomas]";
- mes "The second task will consist of 3 trials. In the first trial you must face the undead.";
- mes "The second trial will test your ability to resist temptation and avoid corruption. The third trial you will have to figure out for yourself.";
- next;
- mes "[Father Thomas]";
- mes "After you finish the 2 tasks, there will be a final test with Sister Cecile. Pass it and you can become a Priest.";
- next;
- mes "[Father Thomas]";
- set JBLVL, 40;
- goto L_Test1;
-
- sL_LowLvl:
- mes "I'm sorry but you cannot become a Priest at this moment. You need to have a job level of at least 40.";
- next;
- mes "[Father Thomas]";
- mes "Please strengthen your faith in God by performing more good deeds.";
- mes "I hope when the time is right, you'll be back... I will be waiting for you here.";
- close;
-
- sL_HighLvl:
- mes "Wow, your already at job lvl 50. I'm amazed at your dedication and hard work!";
- emotion e_gasp;
- next;
- mes "[Father Thomas]";
- mes "Because of this I will allow you to skip the first task. How about we start the second task instead?";
- next;
- mes "[Father Thomas]";
- mes "I believe with your power, you can overcome this task easily...";
- mes "But if you work with a Priest, i think you will learn more and do a lot better.";
- next;
- mes "[Father Thomas]";
- set PRIEST_Q, 2;
- set JBLVL, 50;
- goto L_Test2;
- M_2b:
- mes "[Father Thomas]";
- mes "Priests are also followers of God. They are highly trained and are much more powerful than Acolytes.";
- next;
- mes "[Father Thomas]";
- mes "To become a priest, you must have at least a job lvl 40. You will then have to pass a series of tests in order to prove yourself.";
- next;
- mes "[Father Thomas]";
- mes "If you become a Priest, you will become very important to evey other job class.";
- next;
- mes "[Father Thomas]";
- mes "You must NEVER help someone for any sort of profit or self gain. To be a Priest is to be selfless.";
- next;
- mes "[Father Thomas]";
- mes "We Priest have only one objective, and that is to help others...";
- close;
- M_2End:
- mes "[Father Thomas]";
- mes "Oh is that the case?... Well I'm fine thank you.";
- mes "Please don't forget your duties as an Acolyte, and be carefull not to stray off the path to salvation.";
- next;
- mes "[Father Thomas]";
- mes "I hope you will visit again soon, and please tell me how the other Acolytes are doing. May God be by your side...";
- close;
-
-
-
-L_Test1:
- if (PRIEST_Q2 == 1) goto L_NotDone1a;
- if (PRIEST_Q2 == 2) goto L_NotDone1b;
- if (PRIEST_Q2 == 3) goto L_NotDone1c;
- if (PRIEST_Q2 == 4) goto L_Done1;
- mes "Okay, let me tell you what you have to do for the first task.";
- next;
- mes "[Father Thomas]";
- mes "First you will have to find ^5533FFFather Rubalkubara^000000, he is located 1 map North and 2 maps East of Prontera, near St. Capitolina Abbey.";
- next;
- mes "[Father Thomas]";
- mes "Next you will have to find ^5533FFMother Matilda^000000. She is located somewhere 1 map North of Morroc.";
- next;
- mes "[Father Thomas]";
- mes "Last but not least, you will have to find ^5533FFFather Yosuke^000000.";
- mes "I heard that Father Yosuke is often seen on an tiny island 2 maps West and 1 map North of Prontera.";
- next;
- mes "[Father Thomas]";
- mes "Please becareful on your journey. If you have any questions you may speak with me again.";
- mes "Remeber to check back with me when you have completed the first task.";
- next;
- mes "[Father Thomas]";
- mes "May God Be with you...";
- set PRIEST_Q, 1;
- set PRIEST_Q2, 1;
- close;
-
- L_NotDone1a:
- mes "What? Why are you still here? Did you forget the first task?";
- next;
- menu "Yes, can you please tell me about the first task again?",sM_3a, "NO! how can I forget.",sM_3End;
-
- sM_3a:
- mes "[Father Thomas]";
- mes "Hmm... if you're having trouble with this task, I fear that you will have an even harder time with the others....";
- next;
- mes "[Father Thomas]";
- mes "Please visit ^5533FFFather Rubalkubara^000000. He is located 1 map North and 2 maps East of Prontera near St. Capitolina Abbey.";
- close;
-
- sM_3End:
- mes "[Father Thomas]";
- mes "Oh if you have any questions, please speak with Sister Cecila near the entrance.";
- next;
- mes "[Father Thomas]";
- mes "Please hurry and becareful on your journey. May the lord look down and smile upon you....";
- close;
- L_NotDone1b:
- mes "Hmmm??";
- emotion e_what;
- next;
- mes "[Father Thomas]";
- mes "Have you gone to see ^5533FFMother Marthilda^000000 yet? She can be found near Morroc in the Sogart Desert.";
- mes "Even though Morroc is far away, I know you will be able to find her.";
- close;
-
- L_NotDone1c:
- mes "Have you seen Mother Marthilda in Morroc? In that case you must now go see ^5533FFFather Yosuke^000000.";
- mes "He is located on tiny island 2 maps West and 1 map North of Prontera. You must go and speak with him!.";
- close;
-
- L_Done1:
- mes "So you spoken with all of the Clerics? Good job, you just completed the first task.";
- next;
- mes "[Father Thomas]";
- mes "Now lets start the second task. Be prepared to face great evils.. If you want, you can ask a Priest to assist you with this test.";
- set PRIEST_Q, 2;
- set PRIEST_Q2, 0;
- next;
- mes "[Father Thomas]";
-
-L_Test2:
- if(PRIEST_Q2 == 1) goto L_ReTest2;
- if(PRIEST_Q2 == 2) goto L_Done2;
- mes "So are you ready to start the second task?";
- M_Menu:
- next;
- menu "Yes, lets start.",M_4a, "Let me get ready, i'll be back later.",M_4End;
-
- M_4a:
- mes "[Father Thomas]";
- mes "Very well. Let me send you to ^5544FFFather Peter^000000. Once there speak to him about the second task.";
- next;
- set PRIEST_Q2, 1;
- warp "job_prist.gat", 24, 180;
- savepoint "prt_church.gat", 16, 37;
- end;
-
- M_4End:
- mes "[Father Thomas]";
- mes "Okay, please get ready and come back soon. I hope you will be able to make it through the trials without many problems.";
- close;
-
- L_ReTest2:
- mes "You look really tired... but guess what, you'll be even more tired when you've become a Priest.";
- mes "Please don't give up. Do you want to try the task again?";
- goto M_Menu;
-
- L_Done2:
- mes "Great job. If have endured all of the trials and have passed the second test.";
- mes "If you can pass the last test, I trully belive that you will be one of the best Priests ever!";
- next;
- mes "[Father Thomas]";
- mes "Now, for the final test, please go speak with ^5533FFSister Cecile^000000. Once you have passed it come see me.";
- next;
- mes "[Father Thomas]";
- mes "I'll be waiting here. Good luck my child.";
- set PRIEST_Q, 3;
- set PRIEST_Q2, 0;
- close;
-
-L_Test3:
- mes "Go speak with ^5533FFSister Cecile^000000 and complete the last test.";
- next;
- mes "[Father Thomas]";
- mes "Good luck. I'll be waiting to hear the good news..";
- close;
-
-
-L_Change:
- if (SkillPoint > 0) mes "Wait. You must use up your skill points in order to become a Priest.";
- if (SkillPoint > 0) close;
- mes "Congratulations! You have just completed all of the tests. I can now turn you into a Priest.";
- emotion e_no1;
- next;
- mes "[Father Thomas]";
- mes "God, please endow "+strcharinfo(0)+" with the strength and courage to fight evil and help mankind.";
- next;
- callfunc "Job_Change",Job_Priest;
- mes "[Father Thomas]";
- mes "You are now a Priest. As a Priest, you can now help a lot of people in the name of God.";
- next;
- if (JBLVL != 50) getitem 1550, 1;
- if (JBLVL == 50) getitem 1551, 1;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- mes "[Father Thomas]";
- mes "Here, take this book as a reward for successfully completing the tests. This book will help you understand more about God.";
- next;
- mes "[Father Thomas]";
- mes "I hope you can help serve as a role model for young Acolytes all over Rune Midgard.";
- mes "Please be a good Priest and help bring peace to this world!";
- close;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Test 1 \\
-//********************************************************************************************************************************\\
-// Function: Father Rubalkabara --------------------------------------------------------------------------
-function script F_FatherRub {
- if(PRIEST_Q == 1 && PRIEST_Q2==1) goto L_Test;
- if(PRIEST_Q==1 && PRIEST_Q2 > 1) goto L_Done;
- mes "It's good to see you again. I expect all is well? Continue on your path of helping others and serving God, and let us pray for humanities salvation.";
- close;
-
-L_Test:
- mes "Ah hello there....";
- next;
- mes "[Father Rubalkabara]";
- mes "What's this? You're here because you wish to serve God in an even greater capacity?";
- emotion e_what;
- next;
- menu "Yes, I believe Priesthood is the right path.",-, "No, not really.... just came to say hi.",M_No;
-
- mes "[Father Rubalkabara]";
- mes "Haha! Very good. We need more people like yourself in order for this world to survive the evils that haunt it.";
- emotion e_no1;
- next;
- mes "[Father Rubalkabara]";
- mes "Because of your pure heart I will give you my blessing child. Please meet with ^5533FFMother Marthilda^000000 next.";
- next;
- mes "[Father Rubalkabara]";
- mes "You can find her in the map just north of the town of Morroc. Have a safe journey and good luck on becoming a Priest.";
- set PRIEST_Q2, 2;
- close;
- M_No:
- mes "[Father Rubalkabara]";
- mes "Oh... well then... hello to you too. Although it is nice to see a servant of God such as yourself, I'm a little busy right now so if you don't mind.....";
- emotion e_swt;
- close;
-
-L_Done:
- mes "Please see ^5533FFMother Marthilda^000000 next. Good luck with your journey to becoming a Priest";
- close;
-}
-
-// Function: Mother Marthilda --------------------------------------------------------------------------
-function script F_MotherMart {
-
- if(PRIEST_Q==1 && PRIEST_Q2==2) goto L_Test;
- if(PRIEST_Q==1 && PRIEST_Q2 > 2) goto L_Done;
- mes "Oh my... It's been a while since I've seen you. My how you've grown. It's nice to see one of God servants continuing to improve.";
- mes "I wish you continued success child, and always remember to have faith.";
- close;
-
-L_Test:
- mes "Ah, you're here for the Priest test aren't you? I must say, you did a very good job in comming all this way.";
- next;
- mes "[Mother Marthilda]";
- mes "That shows that you have true faith! It is my pleasure to allow you to continue on with your test.";
- next;
- mes "[Mother Marthilda]";
- mes "You must now go see ^5533FFFather Yosuke^000000. He is 1 map North and 2 maps East of Prontera. I'm sure you will make a fine Priest!";
- set PRIEST_Q2, 3;
- close;
-
-L_Done:
- mes "To complete your task you must go find ^5533FFFather Yosuke^000000. Please be carefull and remeber to pray.";
- close;
-}
-
-// Function: Father Yosuke --------------------------------------------------------------------------
-function script F_FatherYos {
-
- if(PRIEST_Q==1 && PRIEST_Q2==3) goto L_Test;
- if(PRIEST_Q==1 && PRIEST_Q2==4) goto L_Done;
- mes "Just because you're a servant of God doesn't mean you can come here and bother me. Please leave...";
- close;
-
-L_Test:
- mes "Hmm...? Did you need something? Oh the Priest test..... are you sure you're up for that?";
- emotion e_what;
- next;
- mes "[Father Yosuke]";
- mes "Meh, very well. I will let you pass. Go back to the church and speak with Father Thomas. Your duty here as been fulfilled";
- set PRIEST_Q2, 4;
- close;
-
-L_Done:
- mes "Ugh? What are you still doing here...? I said to go back to the church.... I'm very busy right now....";
- emotion e_what;
- close;
-}
-
-
-//**********************************************************************************************************************************************************************************\\
-//================================================== Father Peter: Test 2 ====================================================\\
-//**********************************************************************************************************************************************************************************\\
-job_prist.gat,24,186,4 script Father Peter 110,{
-
-L_Start:
- mes "[Father Peter]";
- mes "God bless you!! Welcome back!";
- mes "First i want to congratulated you for passing the first level.";
- next;
- mes "[Father Peter]";
- mes "My name is Peter.";
- mes "Hows, Thomas these days?";
- next;
- mes "[Father Peter]";
- mes "Oh, so he's a father now eh? hahah...";
- mes "I think i should call him Father Thomas!";
- next;
- mes "[Father Peter]";
- mes "So you know why your here right? Your next test will be to overcome a series of trials involving the darkest of evils.";
- mes "Do you understand what this means?";
- next;
- menu "Yes, I do.",-, "No, I don't quite know it..?",M_1b;
-
- mes "[Father Peter]";
- mes "Wow, your' pretty smart, but i think its better for you to listen to the things i got to say.";
- mes "heheh!";
- goto L_Cont;
- M_1b:
- mes "[Father Peter]";
- mes "Oh, is that so, i think i'll need to explain it to you.";
- mes "After listening to what i have to say, i think you'll understand.";
-
- L_Cont:
- next;
- mes "[Father Peter]";
- mes "What is overcoming evil? its basically destroying it.";
- mes "What is evil? its basically devil, ghosts etc...";
- next;
- mes "[Father Peter]";
- mes "There's a lot of evil in this world.";
- mes "The evil usually tease people that prey to God.";
- next;
- mes "[Father Peter]";
- mes "We priests are supposed to get rid of all the evil!";
- mes "thats the only way we can bring peace to this world!";
- next;
- mes "[Father Peter]";
- mes "If you are trully dedicated, then these trials should not pose that great of a challenge.";
- mes "Even so, I you feel it necessary you may ask a Priest to assist you in this test.";
- next;
- mes "[Father Peter]";
- mes "Well, can we start now?";
- M_Menu:
- next;
- menu "Yes.",M_2a, "Wait a minute.",M_2b, "I want to go back to town.",M_2c;
-
- M_2a:
- mes "[Father Peter]";
- mes "Okay, just enter the waiting room.";
- close;
-
- M_2b:
- mes "[Father Peter]";
- mes "Oh you need to get ready eh?";
- mes "No problem you can start the quest when your ready.";
- close;
- M_2c:
- mes "[Father Peter]";
- mes "What? you want to go back? but you just arrived?";
- mes ".....";
- next;
- mes "[Father Peter]";
- mes "Maybe because its your first time thats why your scared.";
- mes "You can come back when you get more courage.";
- next;
- warp "prt_church.gat", 16, 37;
- close;
-
-OnInit:
- waitingroom "Priest Test Waiting Room",8,"Father Peter::OnStart",1;
- end;
-OnStart:
- set $@PrstUsers, getareausers("job_prist.gat", 8, 34, 39,109);
- set $@PrstUsers, $@PrstUsers + getareausers("job_prist.gat", 160, 14, 175, 178);
- set $@PrstUsers, $@PrstUsers + getareausers("job_prist.gat", 90, 34, 105,105);
- if($@PrstUsers > 0) end; // stops the rest of the script from running if there is already another player taking the test
-
- if((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
- disablenpc "prst1_1"; //disables the exit warp
- disablenpc "prst2_1";
- warpwaitingpc "job_prist.gat", 24, 44;
- killmonsterall "job_prist.gat";
- donpcevent "PrstTest2_1::OnStart";
- end;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Test 2, Part 1: Kill the Zombies \\
-//********************************************************************************************************************************\\
-job_prist.gat,1,1,1 script PrstTest2_1 -1,{
-
-OnStart:
- set $@PrstRm, 1; //used to determine what areawarp and areaannounce to use
- enablenpc "Zombie1_Trig";
- enablenpc "Zombie2_Trig";
- enablenpc "Zombie3_Trig";
- enablenpc "Zombie4_Trig";
- enablenpc "Zombie5_Trig";
- set $@mob, 13;
- initnpctimer;
- end;
-
-OnMobDead:
- set $@mob, $@mob - 1;
- if($@mob > 0) end;
-
- enablenpc "prst1_1";
- areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: Well done my child. Enter the warp to start the next test.",8;
- initnpctimer "prst1_1"; //starts a 30 sec timer. this will warp the player even if they don't enter the warp to keep the test going
- end;
-
-OnTimer500:
- areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: In order to pass this trial, you will have to kill all of the zomibes that appear.",8;
- end;
-OnTimer2500:
- stopnpctimer;
- initnpctimer "TimerPrst"; // starts the 5 min test timer
- areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: Move slowly and take your time.",8;
- end;
-}
-
-// These hidden warps spawn the monsters when you walk
-// First set of Zombies------------------------------------------------------------
-job_prist.gat,23,52,1 script Zombie1_Trig 139,16,0,{
-
- monster "job_prist.gat",24,52,"Robbery",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",18,52,"Evilness",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",30,52,"Jealousy",1015,1,"PrstTest2_1::OnMobDead";
- disablenpc "Zombie1_Trig"; //disables the npc so that it can't spawn the monsters more than once
- end;
-}
-
-// Second set of Zombies----------------------------------------------------
-job_prist.gat,23,62,1 script Zombie2_Trig 139,16,0,{
-
- monster "job_prist.gat",21,62,"Anger",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",27,62,"Wonderness",1015,1,"PrstTest2_1::OnMobDead";
- disablenpc "Zombie2_Trig";
- end;
-}
-
-// Third set of Zombies--------------------------------------------------------
-job_prist.gat,23,72,1 script Zombie3_Trig 139,16,0,{
-
- monster "job_prist.gat",24,72,"Cockyness",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",18,72,"Slutty",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",30,72,"Lazyness",1015,1,"PrstTest2_1::OnMobDead";
- disablenpc "Zombie3_Trig";
- end;
-}
-
-// Fourth set of Zombies--------------------------------------------------------
-job_prist.gat,23,82,1 script Zombie4_Trig 139,16,0,{
-
- monster "job_prist.gat",21,82,"Greed",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",27,82,"Greedyness",1015,1,"PrstTest2_1::OnMobDead";
- disablenpc "Zombie4_Trig";
- end;
-}
-
-// Fifth set of Zombies ---------------------------------------------------------
-job_prist.gat,23,92,1 script Zombie5_Trig 139,16,0,{
-
- monster "job_prist.gat",24,92,"Faithless",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",18,92,"Non-believer",1015,1,"PrstTest2_1::OnMobDead";
- monster "job_prist.gat",30,92,"Scaryness",1015,1,"PrstTest2_1::OnMobDead";
- disablenpc "Zombie5_Trig";
- end;
-}
-
-
-// End warp for 1st part of test--------------------------------------------------------------------
-job_prist.gat,24,109,1 script prst1_1 45,3,3,{
-
- if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the aco to step on the warp.
-OnTimer30000:
- stopnpctimer;
- areawarp "job_prist.gat",8,34,39,109,"job_prist.gat",168,17;
- killmonsterall "job_prist.gat";
- donpcevent "PrstTest2_2::OnStart";
- end;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Test 2, Part 1: Resist Temptation \\
-//********************************************************************************************************************************\\
-job_prist.gat,1,1,0 script PrstTest2_2 -1,{
-
-OnStart:
- enablenpc "Devi_Trig"; //enables these npc's just in case they were disabled by a previous tester
- enablenpc "Deviruchi";
- enablenpc "Doppel_Trig";
- enablenpc "Doppel";
- enablenpc "Dark_Trig";
- enablenpc "Dark Lord";
- enablenpc "Bapho_Trig";
- enablenpc "Baphomet";
- set $@PrstRm, 2;
- set $PRIEST_Q3, 0;
- initnpctimer;
- end;
-
-OnCheck:
- set $PRIEST_Q3, $PRIEST_Q3 + 1; //this counter checks to see if the player spoke with each devil and answered the questions
- if($PRIEST_Q3 < 4) end;
-
- enablenpc "prst2_1";
- areaannounce "job_prist.gat", 160, 14, 175, 178, "[Father Peter]: Excellent! You have shown great courage! Use the warp to move on to the next room.",8;
- initnpctimer "prst2_1"; //starts a 30 sec timer. this will warp the player even if they don't enter the warp to keep the test going
- end;
-
-OnTimer500:
- stopnpctimer;
- areaannounce "job_prist.gat", 160, 14, 175, 178, "[Father Peter]: This trial will test the strength of your will and your commitment to God!",8;
- end;
-
-}
-
-
-// Deviruchi ------------------------------------------------------------------------
-job_prist.gat,168,45,4 script Deviruchi 738,{
-
-OnStart:
- if(BaseJob == Job_Acolyte) goto L_Aco;
-
-L_Priest:
- mes "[Deviruchi]";
- mes "Hey, whats priest like you doing in a place like this? go back to town. You like wasting you time here eh?";
- next;
- mes "[Deviruchi]";
- mes "I feel happy today, so i'll spare you, now go. Next time you come, I'm gonna take to you down.";
- close;
-
-L_Aco:
- mes "[Deviruchi]";
- mes "Hey, isn't that a acolyte? i haven't seen one in ages. Looks like you're going to become a priest soon...";
- next;
- mes "[Deviruchi]";
- mes "I can tell how sad it is to become a servant of God. I think its weird that you're here.";
- next;
- mes "[Deviruchi]";
- mes "The path your walking is going to be difficult. Isn't there better jobs you can be?";
- next;
- mes "[Deviruchi]";
- mes "Doesn't matter if its in a town, in a cave, all the people always asks you to help them. Itsn't funny that they never helped you?";
- next;
- mes "[Deviruchi]";
- mes "I'll give you an advice, you should give up now. The tests will be hard, and the path you're gonna walk will be difficult.";
- next;
- menu "Yea, I'm going to give up.",-, "Devil, Be gone NOW!.",M_1a;
-
- mes "[Deviruchi]";
- mes "Yeap thats a good choice, you don't have to come to this place again! Since you decided to give up, i'll give you a present.";
- next;
- mes "[Deviruchi]";
- mes "I'll let you meet my friends...FOR FREE HAHAHAHAH!";
- next;
- warp "c_tower2.gat", 168, 33;
- end;
- M_1a:
- mes "[Deviruchi]";
- mes "Oh.. I'm so scared..hahaha. Don't be like this, listen to what i have to say.";
- next;
- mes "[Deviruchi]";
- mes "If you give up now, i'll give you a nice gift. This gift is so hard to find.";
- next;
- cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",4;
- mes "[Deviruchi]";
- mes "Do you think you can find a card like that? Decide now, don't regret when you become a priest...";
- next;
- menu "I accept your card.",-, "Devil, Be GONE!!",sM_1a;
-
- mes "[Deviruchi]";
- mes "Hahaha all the human beings are like this, good choice! Okay, let me give you this card!";
- next;
- cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",255;
- mes "[Deviruchi]";
- mes "Well, too bad i can't give it to you. Go look for it YOURSELF!";
- next;
- warp "mjolnir_05.gat", 200, 200;
- end;
- sM_1a:
- cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",255;
- mes "[Deviruchi]";
- mes "Wow, your one tough acolyte, if you keep denying you better becareful.";
- mes "I will be watching, I'll see if you can become a good priest or not.";
- next;
- mes "[Deviruchi]";
- mes "One day, you'll regret and want to come back to me!";
- disablenpc "Devi_Trig"; //disables the trigger npc so you don't accidentally activate it again
- disablenpc "Deviruchi";
- donpcevent "PrstTest2_2::OnCheck";
- close;
-}
-
-// Doppelganger ------------------------------------------------------------------------------
-job_prist.gat,168,80,4 script Doppelganger::Doppel 739,{
-
-OnStart:
- if(BaseJob == Job_Acolyte) goto L_Aco;
-
-L_Priest:
- mes "[Doppelganger]";
- mes "What good is it to be here?.";
- mes "Are you this bored? you're already a priest why are you here?.";
- next;
- mes "[Doppelganger]";
- mes "You don't need to help these acolytes, go home.";
- mes "You're doing something that is wasting your time, leave now.";
- close;
-L_Aco:
- mes "[Doppelganger]";
- mes "Hey, Acolyte wait, listen to what i have to say.";
- next;
- mes "[Doppelganger]";
- mes "You came here because you want to become a priest eh?";
- mes "I don't think you should become a priest.";
- next;
- mes "[Doppelganger]";
- mes "If you want, i can use my powers to let you start over again.";
- mes "You can become a novice again, and you can choose what job you want to be.";
- next;
- mes "[Doppelganger]";
- mes "Well, the job you choose depends on your level hhehe.";
- mes "Isn't this a good deal? if you want i can help you right now.";
- next;
- menu "I hope you can help me!",-, "Devil Be gone!",M_1b;
-
- mes "[Doppelganger]";
- mes "Yes thats a good choice.";
- mes "Let me turn you into a novice now.";
- next;
- mes "[Doppelganger]";
- mes "You know it takes a long time to ressurect when you DIE!!";
- next;
- warp "gef_dun02.gat", 210, 177;
- end;
- M_1b:
- mes "[Doppelganger]";
- mes "I don't think you understand what i mean.";
- mes "This is one of the best things that can happen to you.";
- next;
- mes "[Doppelganger]";
- mes "You just need to tell me that you don't want to become a priest.";
- mes "If you do that, i can turn you into any job you want, you want to become a swordman like me?";
- next;
- menu "I don't want to become a priest!",-, "Devil, Be GONE!",sM_1b;
-
- mes "[Doppelganger]";
- mes "good choice, you don't need to come back here anymore.";
- mes "okay, let me turn you into a novice now...";
- next;
- mes "[Doppelganger]";
- mes "You know its takes a long time to ressurect when you DIE??!!";
- next;
- warp "gef_dun02.gat", 210, 177;
- end;
- sM_1b:
- mes "[Doppelganger]";
- mes "okay fine, i'll spare you today.";
- next;
- mes "[Doppelganger]";
- mes "If i see you next time, I'm gonna make you die painfully.";
- disablenpc "Doppel_Trig";
- disablenpc "Doppel";
- donpcevent "PrstTest2_2::OnCheck";
- close;
-}
-
-// Dark Lord -------------------------------------------------------------------------------
-job_prist.gat,168,115,4 script Dark Lord 737,{
-
-OnStart:
- if(BaseJob == Job_Acolyte) goto L_Aco;
-
-L_Priest:
- mes "[Dark Lord]";
- mes "Let you feel hatred and anger!!";
- mes "Let you feel how it feels when your friend betrays you!";
- next;
- mes "[Dark Lord]";
- mes "Stay here, and train with us and next; until you are strong enough then you can go back!";
- mes "Stay with us and learn to curse!";
- close;
-L_Aco:
- mes "[Dark Lord]";
- mes "Stop right there human!.";
- mes "Whose permission do you have to pass through here!";
- next;
- mes "[Dark Lord]";
- mes "If you want to become a priest, you can't pass through here,";
- mes "Go now, before i kill you.";
- next;
- mes "[Dark Lord]";
- mes "Even more annoying than ants you humans, leave and stop bothering me!";
- next;
- menu "I'm sorry, please spare me.",-, "Devil, Be GONE!.",M_1c;
-
- mes "[Dark Lord]";
- mes "Don't come here again!";
- next;
- warp "gl_church.gat", 145, 170;
- end;
- M_1c:
- mes "[Dark Lord]";
- mes "Don't try to act like a tough guy.";
- mes "I can cut u in many pieces with my pinky.";
- next;
- mes "[Dark Lord]";
- mes "Before i use my dark powers on you, leave!";
- next;
- menu "Please, Spare me.",-, "Devil, BE GONE!",sM_1c;
-
- mes "[Dark Lord]";
- mes "Don't appear here again!";
- next;
- warp "gl_church.gat", 145, 170;
- end;
- sM_1c:
- mes "[Dark Lord]";
- mes "So you decided to stay eh? you pesky human, killing you will dirty my hands.";
- next;
- mes "[Dark Lord]";
- mes "If i see you again, I'm gonna kill you.";
- disablenpc "Dark_Trig";
- disablenpc "Dark Lord";
- donpcevent "PrstTest2_2::OnCheck";
- close;
-}
-
-// Baphomet -----------------------------------------------------------------------------
-job_prist.gat,168,150,4 script Baphomet 736,{
-
-OnStart:
- if(BaseJob == Job_Acolyte) goto L_Aco;
-
-L_Priest:
- mes "[Baphomet]";
- mes "Annoying Priests...";
- next;
- mes "[Baphomet]";
- mes "I have nothing to talk to you about, leave now.";
- close;
-L_Aco:
- mes "[Baphomet]";
- mes "Hey, Human.";
- next;
- mes "[Baphomet]";
- mes "You interested in a deal?";
- next;
- mes "[Baphomet]";
- mes "I can get you all the rich and fame in this world.";
- mes "Infinite money and weapons which no humans have...";
- next;
- mes "[Baphomet]";
- mes "Also, if you want, you can always summon me.";
- mes "If you did that, everyone will be afraid of you hahahaha.";
- next;
- mes "[Baphomet]";
- mes "I think you should give up being a priest and just accept my deal.";
- mes "If you accept my deal, the world is yours.";
- next;
- menu"I give up being a priest.",-, "Devil be GONE!",M_1d;
-
- mes "[Baphomet]";
- mes "Okay, let us sign the contract...";
- mes "you will not forget this...";
- next;
- mes "[Baphomet]";
- mes "You go find where i live.";
- mes "When your there, come and sign the contract.";
- next;
- warp "glast_01.gat", 200, 203;
- end;
- M_1d:
- mes "[Baphomet]";
- mes "Okay fine, i'll leave.";
- mes "But, you won't leave that easily.";
- next;
- mes "[Baphomet]";
- mes "I already set up a lot of evil stuff for you...";
- mes "I want to see how long you can last.";
- next;
- mes "[Baphomet]";
- mes "OKay go now.";
- disablenpc "Bapho_Trig";
- disablenpc "Baphomet";
- donpcevent "PrstTest2_2::OnCheck";
- close;
-}
-
-
-// These hidden warps trigger the npcs when you get near them
-// Deviruchi Trigger --------------------------------------------------------------------
-job_prist.gat,167,40,1 script Devi_Trig 139,8,0,{
-
- doevent "Deviruchi::OnStart";
- end;
-}
-// Doppleganger Trigger --------------------------------------------------------------------
-job_prist.gat,167,77,1 script Doppel_Trig 139,8,0,{
-
- doevent "Doppel::OnStart";
- end;
-}
-// Dark Lord Trigger --------------------------------------------------------------------
-job_prist.gat,167,112,1 script Dark_Trig 139,8,0,{
-
- doevent "Dark Lord::OnStart";
- end;
-}
-// Baphomet Trigger --------------------------------------------------------------------
-job_prist.gat,167,145,1 script Bapho_Trig 139,8,0,{
-
- doevent "Baphomet::OnStart";
- end;
-}
-
-
-// End warp for 2nd part of test ---------------------------------------------------------
-job_prist.gat,168,180,0 script prst2_1 45,3,3,{
-
- if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the Aco to step on the warp.
-OnTimer30000:
- set $@PrstRm, 3;
- set $PRIEST_Q3, 0;
- enablenpc "Mummy1_Trig"; //enables the floor triggers for the next test
- enablenpc "Mummy2_Trig";
- enablenpc "Mummy3_Trig";
- stopnpctimer;
- initnpctimer "prst3_1";
- areawarp "job_prist.gat", 160, 14, 175, 178, "job_prist.gat", 98, 40;
- end;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Test 2, Part 3: Make it to the exit \\
-//******************************************************************************************************************************* *\\
-// First set of Mummies --------------------------------------------------------
-job_prist.gat,97,50,0 script Mummy1_Trig 139,8,1,{
-
- monster "job_prist.gat", 93, 55, "ca", 1041,1;
- monster "job_prist.gat", 102, 55, "ah", 1041,1;
- disablenpc "Mummy1_Trig";
- end;
-}
-// Second set of Mummies --------------------------------------------------------
-job_prist.gat,97,65,0 script Mummy2_Trig 139,8,1,{
-
- monster "job_prist.gat", 93, 70, "men", 1041,1;
- monster "job_prist.gat", 102, 70, "ahke", 1041,1;
- disablenpc "Mummy2_Trig";
- end;
-}
-// Third set of Mummies --------------------------------------------------------
-job_prist.gat,97,80,0 script Mummy3_Trig 139,8,1,{
-
- monster "job_prist.gat", 93, 85, "mea", 1041,1;
- monster "job_prist.gat", 102, 85, "sne", 1041,1;
- disablenpc "Mummy3_Trig";
- end;
-}
-
-
-// End warp for 3rd part of test ----------------------------------------------
-job_prist.gat,98,105,0 script prst3_1 45,2,2,{
-
- if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the Aco to step on the warp.
- stopnpctimer "TimerPrst";
- areawarp "job_prist.gat", 90, 34, 105, 105, "prt_church.gat",16, 37;
- set PRIEST_Q2, 2;
- killmonsterall "job_prist.gat";
- donpcevent "Father Peter::OnStart";
- end;
-
-OnTimer500:
- stopnpctimer;
- areaannounce "job_prist.gat", 90, 34, 105,105, "[Father Peter]: This is the last trial you must face my child. Have faith, I know you can pass it!",8;
- end;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Timer \\
-//********************************************************************************************************************************\\
-job_prist.gat,1,1,0 script TimerPrst -1,{
-
-OnTimer3000:
- areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: You will have 5 minutes to pass all 3 trials starting now.",8;
- end;
-OnTimer33000:
- donpcevent "Father Peter::OnStart";
- end;
-OnTimer63000:
- set $@PrstTime$, "You have 4 minutes left!";
- donpcevent "Father Peter::OnStart";
- goto AnnouncePrst;
-OnTimer93000:
- donpcevent "Father Peter::OnStart";
- end;
-OnTimer123000:
- set $@PrstTime$, "You have 3 minutes left!";
- donpcevent "Father Peter::OnStart";
- goto AnnouncePrst;
-OnTimer153000:
- donpcevent "Father Peter::OnStart";
- end;
-OnTimer183000:
- set $@PrstTime$, "You have 2 minutes left!";
- donpcevent "Father Peter::OnStart";
- goto AnnouncePrst;
-OnTimer213000:
- donpcevent "Father Peter::OnStart";
- end;
-OnTimer243000:
- set $@PrstTime$, "You have 1 minute left!";
- donpcevent "Father Peter::OnStart";
- goto AnnouncePrst;
-OnTimer273000:
- set $@PrstTime$, "You have 30 seconds left!";
- donpcevent "Father Peter::OnStart";
- goto AnnouncePrst;
-OnTimer293000:
- set $@PrstTime$, "You have 10 seconds left!";
- goto AnnouncePrst;
- end;
-OnTimer2970000:
- set $@PrstTime$, "You have 5 seconds left.";
- goto AnnouncePrst;
- end;
-OnTimer302000:
- set $@PrstTime$, "Time is up. You failed the test.";
- goto AnnouncePrst;
-OnTimer306000:
- stopnpctimer;
- if($@PrstRm==1) areawarp "job_prist.gat",8,34,39,109,"prt_church.gat",16, 37;
- if($@PrstRm==2) areawarp "job_prist.gat",160, 14, 175, 178,"prt_church.gat",16, 37;
- if($@PrstRm==3) areawarp "job_prist.gat", 90, 34, 105,105,"prt_church.gat",16, 37;
- killmonsterall "job_prist.gat";
- donpcevent "Father Peter::OnStart";
- end;
-
-AnnouncePrst:
- if($@PrstRm==1) areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: "+$@PrstTime$+".",8;
- if($@PrstRm==2) areaannounce "job_prist.gat",160, 14, 175, 178, "[Father Peter]: "+$@PrstTime$+".",8;
- if($@PrstRm==3) areaannounce "job_prist.gat", 90, 34, 105,105, "[Father Peter]: "+$@PrstTime$+".",8;
- end;
-}
-
-
-
-//**********************************************************************************************************************************************************************************\\
-//================================================= Sister Cecile: Test 3 =====================================================\\
-//**********************************************************************************************************************************************************************************\\
-prt_church.gat,27,24,4 script Sister Cecile 79,{
- mes "[Sister Cecile]";
- if(BaseJob == Job_Priest) goto L_Prst;
- if(BaseJob == Job_Acolyte) goto L_Aco;
- if(BaseJob == Job_Novice) goto L_Nov;
-
-L_Other:
- mes "This is the Prontera Church, what can I help you with?";
- next;
- menu "Please tell me about priests.",-, "I'm just walking around.",M_End0;
-
- mes "[Sister Cecile]";
- mes "Priests are servants of God. They have special powers that allow them to help anyone in need of assistance.";
- next;
- mes "[Sister Cecile]";
- mes "Because they are followers of God, they cannot use swords and many other types of weapons.";
- next;
- mes "[Sister Cecile]";
- mes "Of course, if you want to know more about priests, you should speak with one personally.";
- next;
- mes "[Sister Cecile]";
- mes "Please stay here for as long as you wish. The church is a sanctuary for all those who seek it.";
- close;
- M_End0:
- mes "[Sister Cecile]";
- mes "Please Relax, wondering around can be tiring.";
- close;
-
-L_Nov:
- mes "God bless you, my child. The Prontera Church welcomes you.";
- next;
- mes "[Sister Cecile]";
- mes "Have you choose your job yet? Do you want to be one of God's helpers?";
- mes "Becoming an Acolyte and helping people is very good thing.";
- next;
- mes "[Sister Cecile]";
- mes "If you want to become an Acolyte, speak to ^5533FFFather Mareusis^000000 in the room across the hall.";
- next;
- mes "[Sister Cecile]";
- mes "Once you've reached job level 40 as an Acolyte, you can come back here and become a Priest.";
- next;
- mes "[Sister Cecile]";
- mes "Since you are still a novice, think carefully about what job you wish to take.";
- close;
-
-L_Prst:
- if(sex == 1) mes "God bless you, brother priest.";
- if(sex == 0) mes "God bless you, sister priest.";
- mes "I wish you all the best. Keep your faith strong and remeber that God loves all, and so should you.";
- close;
-
-L_Aco:
- if(PRIEST_Q == 1) goto L_Test1;
- if(PRIEST_Q == 2) goto L_Test2;
- if(PRIEST_Q == 3) goto L_Start;
- if(PRIEST_Q == 4) goto L_Done;
- if(sex == 1) mes "God bless you, brother.";
- if(sex == 0) mes "God bless you, sister.";
- mes "Why are you here?";
- next;
- menu "I want to become a priest.",-, "I'm just wondering around.",M_End1;
-
- mes "[Sister Cecile]";
- mes "Oh so you want to become a priest?";
- mes "A lot of acolytes want to become priests.";
- next;
- mes "[Sister Cecile]";
- mes "My name is Sister Cecile, I'm responsible for helping acolytes become priests.";
- next;
- mes "[Sister Cecile]";
- mes "Because I was born and raised here, I've seen a lot of people become Priests over the years.";
- mes "Thats why i like to help people become priests now.";
- next;
- mes "[Sister Cecile]";
- mes "In order to become a priest, you will have to fullfill 3 tasks. If you want to change your job now, you can go talk to Father Thomas,";
- next;
- mes "[Sister Cecile]";
- mes "If you encounter any problems with any of the tasks, come talk to me and I might be able to help.";
- close;
- M_End1:
- mes "[Sister Cecile]";
- mes "Please relax and take a break. The church should feel like your home.";
- close;
-
-L_Start:
- if(PRIEST_Q2 == 1) goto L_ReTest;
- mes "Good job, you successfully completed the second quest...!";
- mes "You are now really close to becoming a priest.";
- next;
- mes "[Sister Cecile]";
- if(sex==1) mes "If you want to become a priest, the last step is to answer my questions honestly.";
- if(sex==0) mes "If you want to become a priestess, the last step is to answer my questions honestly.";
- mes "Please be honest and answer my question.";
- next;
- mes "[Sister Cecile]";
- mes "Okay let me ask you some questions.";
- set PRIEST_Q2, 1;
- next;
-L_Test3:
- mes "[Sister Cecile]";
- mes "From today on, do you wish to help the God for all eternity?";
- next;
- menu "Yes.",M_2a, "No.",-;
-
- mes "[Sister Cecile]";
- mes "Why..Why would you say that?...";
- mes "I don't think your suitable to become a priest...";
- next;
- mes "[Sister Cecile]";
- mes "please come back when you really want to become a priest.";
- mes "You can't become a priest right now.";
- close;
-
- M_2a:
-
- mes "[Sister Cecile]";
- mes "Will you use God's power for your own profit?";
- next;
- menu "Yes",-, "No.",M_2b;
-
- mes "[Sister Cecile]";
- mes "No, that doesn't work, if you use God's power to do what you wish, you're just like a thief.";
- mes "How can you become a good priest if you think like that?";
- next;
- mes "[Sister Cecile]";
- mes "Please come back when you make up your mind.";
- mes "Those thoughts are the things that corrupt people.";
- close;
-
- M_2b:
-
-
- mes "[Sister Cecile]";
- mes "Will you help others in battle when they need help?";
- next;
- menu "Yes.",M_2c, "No.",-;
-
- mes "[Sister Cecile]";
- mes "Thats wrong, when someone needs help, we will do our best to help them.";
- mes "It doesn't matter who that person is, our job is to help everyone.";
- next;
- mes "[Sister Cecile]";
- mes "Go walk around.";
- mes "and you should learn something.";
- close;
- M_2c:
-
- mes "[Sister Cecile]";
- mes "Will you sacrafice yourself for others?";
- next;
- menu "Yes.",M_2d, "No.",-;
-
- mes "[Sister Cecile]";
- mes "No, thats not what God thinks.";
- mes "If we can sacrafice ourselves for something that helps the world, its worth it.";
- next;
- mes "[Sister Cecile]";
- mes "Go and think about sacraficing.";
- mes "Sacraficing is thing thats easy to say, but hard to do.";
- close;
- M_2d:
-
- mes "[Sister Cecile]";
- mes "Will you talk bad to people you meet?";
- next;
- menu "Yes.",-, "No.",M_2e;
-
- mes "[Sister Cecile]";
- mes "That is not right, priests are supposed to help people.";
- mes "If you talk bad, you don't deserver to be a priest.";
- next;
- mes "[Sister Cecile]";
- mes "even if your God's best servant.";
- mes "You don't have the right to bad-talk.";
- close;
-
- M_2e:
-
- mes "[Sister Cecile]";
- mes "Will you bring any kind of devil to help others in battle?";
- next;
- menu "Yes.",-, "No.",M_2f;
-
- mes "[Sister Cecile]";
- mes "You can't do that.";
- mes "It doesn't matter if the devil is good or bad, priests should never talk to a devil .";
- next;
- mes "[Sister Cecile]";
- mes "Even though it looks like you did a good thing, but it was a really bad thing.";
- mes "Please go think about it.";
- close;
-
- M_2f:
-
- mes "[Sister Cecile]";
- mes "If God wants to you to live or die, will you listen to him?";
- next;
- menu "Yes.",M_2g, "No.",-;
-
- mes "[Sister Cecile]";
- mes "If your like that you can't become a priest.";
- mes "If God wants you to die, you have to listen to him.";
- next;
- mes "[Sister Cecile]";
- mes "And we priest have the skill to Resurrect ourselves.";
- mes "Please go and think about what death means to you.";
- close;
- M_2g:
-
- mes "[Sister Cecile]";
- mes "I just witness what you said.";
- mes "Lastly, please promise that you'll remember the things you said today.";
- next;
- menu "I promise.",-, "No.",M_2No;
-
- mes "[Sister Cecile]";
- mes "Now, you passed all the tests.";
- mes "Please go talk to Father Thomas to become a priest.";
- next;
- mes "[Sister Cecile]";
- mes "Please remember the things you said today.";
- mes "God bless you...";
- set PRIEST_Q, 4;
- set PRIEST_Q2, 0;
- close;
-
- M_2No:
- mes "[Sister Cecile]";
- mes "..............";
- next;
- mes "[Sister Cecile]";
- mes "No not yet, your still wondering if you want to become a priest or not.";
- mes "You can't become a priest right now.";
- next;
- mes "[Sister Cecile]";
- mes "I think you should go do the self-disipline test again...";
- mes "When you're ready, come back here.";
- next;
- mes "[Sister Cecile]";
- mes "God bless you...";
- close;
-
-L_ReTest:
- mes ".............";
- next;
- mes "[Sister Cecile]";
- mes "...Oh your back.";
- mes "I hope you can be honest this time.";
- next;
- mes "[Sister Cecile]";
- mes "I hope i can sense your sincere...";
- mes "Please answer me honestly.";
- next;
- mes "[Sister Cecile]";
- mes "Okay, lets start.";
- next;
- goto L_Test3;
-
-L_Test1:
- mes "Oh, so you already started the self-disipline test, good job.";
- close;
-
-L_Test2:
- if(PRIEST_Q2 == 1) goto L_Test2a;
- mes "You didn't start the second quest yet?.";
- mes "Well, i can't give u any specific details about this task.";
- next;
- mes "[Sister Cecile]";
- mes "I can only tell you to be well-prepared and to not get seduced by anything...";
- mes "You must trust in yourself in order to complete the second quest.";
- next;
- mes "[Sister Cecile]";
- mes "If you want more specific details go talk to the priest in the training ground.";
- mes "Father Thomas is a very nice person, he'll help you too.";
- close;
-
-L_Test2a:
- mes "Training is hard, but don't give up.";
- mes "You must overcome anything in order to be a good priest.";
- next;
- mes "[Sister Cecile]";
- mes "If there's experienced priest, you can ask them to help you train.";
- mes "They might be able to help you pass the first level of the second task.";
- next;
- mes "[Sister Cecile]";
- mes "God bless you...";
- mes "When you complete the second quest, come back here.";
- close;
-
-L_Done:
- mes "Congratulations on finishing the tests. Please see Father Thomas so that he can make you a Priest.";
- close;
-}
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_prist.gat mapflag nomemo
-job_prist.gat mapflag noteleport
-job_prist.gat mapflag nosave SavePoint
-job_prist.gat mapflag nopenalty
-job_prist.gat mapflag nobranch
-job_prist.gat mapflag noexp
-job_prist.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Priest Quest
+//===== By: ==================================================
+//= Translated By: Pgro Team (OwNaGe)(Aegis)
+//= Converted by: kobra_k88.
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Official RO Priest Quest converted from Aegis script.
+//===== Additional Comments: =================================
+//= Fully working. Changed the way Priests enter the test room to help Acos.
+//= Must use this with the included Acolyte quest to work properely.
+//= 1.3 Added Baby Class support, fixed 3 wrong constants bugs [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Merged JFunc [Lupus]
+//==========================================================
+
+
+//*********************************************************************************************************************************************************************************\\
+//============================================ Father Thomas: Job changer, Test 1 =============================================\\
+//*********************************************************************************************************************************************************************************\\
+prt_church.gat,16,41,4 script Father Thomas 60,{
+ callfunc "F_BlockHigh",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"High Priest","Father Thomas";
+
+ mes "[Father Thomas]";
+ if(BaseJob == Job_Acolyte) goto L_Start;
+ if(BaseJob == Job_Novice){
+ mes "May God bless you, child. This is the Prontera Church. What are you here for?";
+ next;
+ menu "I want to become an Acolyte.",-, "I want to become a ^5533FFPriest^000000.",M_0b, "I'm just walking around.",M_0End;
+
+ mes "[Father Thomas]";
+ mes "Haha.. so you want to become an Acolyte eh? To apply to become an Acolyte, please go to the room opposite of here.";
+ close;
+ M_0b:
+ mes "[Father Thomas]";
+ mes "Haha...in order to become a priest you must first become an Acolyte. To become an Acolyte, go to the room opposite of here.";
+ close;
+ M_0End:
+ mes "[Father Thomas]";
+ mes "Please feel free to rest here. The church is a sanctuary for all those, who seek to escape the outside world.";
+ next;
+ mes "[Father Thomas]";
+ mes "May God be with you in your thoughts and prayers.";
+ close;
+ }
+ if(BaseJob == Job_Priest){
+ mes "God bless you, child. You are here again because you listened to God's orders.";
+ next;
+ mes "[Father Thomas]";
+ mes "I don't know if God's sons and daughters are going on the path of light or the path of darkness... I can only pray for the best.";
+ next;
+ mes "[Father Thomas]";
+ mes "So why are you here today?";
+ next;
+ menu "I just wanted to see how you were.",-, "I'm here to help the Acolytes.",M_1b, "Life is really hard... I was wondering if you could help.",M_1End;
+
+ mes "[Father Thomas]";
+ mes "Oh, well I'm fine thank you. Please send my regards to all of the other Priests, and Priestess.";
+ next;
+ mes "[Father Thomas]";
+ mes "We, the ones who follow the devine path, are here for one reason.... to obey Gods orders.";
+ mes "If you come across anyone who needs help, please remember to assist them in any way you can...";
+ close;
+ M_1b:
+ mes "[Father Thomas]";
+ mes "Oh...thats a great idea! Since you're a priest, you can't forget that you have to help the Acolytes when they need it.";
+ emotion e_ic;
+ next;
+ mes "[Father Thomas]";
+ mes "Even so, you must be carefull not to do everyting for them. It is important that they gain their own experiences through training ";
+ next;
+ mes "[Father Thomas]";
+ mes "In order to go in and help you'll need a ^5533FFROSARY^000000.";
+ mes "There will be 3 trials for the Acolyte to face, but in only 2 of them will your assistance be needed.";
+ next;
+ mes "[Father Thomas]";
+ mes "Are you prepared to help?";
+ next;
+ menu "Yes, i will help them with all my might.",-, "I will come back later.",sM_1End;
+
+ mes "[Father Thomas]";
+ if (countitem(2608) < 1){
+ mes "Hmm... it doesn't look like you have a ^5533FFROSARY^000000 with you.";
+ next;
+ mes "[Father Thomas]";
+ mes "If you want to help the Acolytes, you must first get a ^5533FFROSARY^000000.";
+ mes "Please come back when you have one.";
+ close;
+ }
+ mes "Very well then. I will send you to an Acolyte in just a moment.";
+ next;
+ mes "[Father Thomas]";
+ mes "I hope you will also take this opportunity to teach them what it means to be a good Priest.";
+ next;
+ if((getareausers("job_prist.gat", 8, 34, 39,109)) == 1) warp "job_prist.gat", 24, 44;
+ if((getareausers("job_prist.gat", 160, 14, 175, 178)) == 1) warp "job_prist.gat", 98, 40;
+ if((getareausers("job_prist.gat", 90, 34, 105,105)) == 1) warp "job_prist.gat", 168, 17;
+ mes "[Father Thomas]";
+ mes "Hmm........ wait a minute..... let me check my list.... Either no one is taking the test right now, or another Priest is already helping out.";
+ mes "In any case please check with me again later.";
+ close;
+ sM_1End:
+ mes "[Father Thomas]";
+ mes "Oh, alright. Just remember to bring a ^5533FFFROSARY^000000 when you come back.";
+ close;
+
+ M_1End:
+ mes "[Father Thomas]";
+ mes "Keep up the good work. I will ask God to ease your pain.";
+ next;
+ mes "[Father Thomas]";
+ mes "God, one of your children is suffering. Please use your powers, to heal the wounds on this battered body.....";
+ next;
+ mes "[Father Thomas]";
+ mes "Please look after us, so that under any condition we will be able to think clearly and maintain our faith";
+ percentheal 100,100;
+ next;
+ mes "[Father Thomas]";
+ mes "You should be feeling better now. Please stay on the path to rightousness and may God bless you.";
+ close;
+ }
+ mes "May God bless you my child.";
+ next;
+ mes "[Father Thomas]";
+ mes "Please feel free to rest, the church is the safest place in this world.";
+ next;
+ mes "[Father Thomas]";
+ mes "I hope God will bless you.";
+ close;
+
+L_Start:
+ if (PRIEST_Q == 1) goto L_Test1;
+ if (PRIEST_Q == 2) goto L_Test2;
+ if (PRIEST_Q == 3) goto L_Test3;
+ if (PRIEST_Q == 4) goto L_Change;
+ mes "God bless you, child. What brings you here?";
+ next;
+ menu "I want to become a priest.",M_2a, "Can you please tell me about Priests.",M_2b, "I just wanted to see how you were doing.",M_2End;
+
+ M_2a:
+ mes "[Father Thomas]";
+ mes "Oh... so you want to become a priest? God bless you for your determination.";
+ next;
+ mes "[Father Thomas]";
+ mes "I'm Father Thomas. I'm in charge of protecting Prontera from the evil spirits that plague the lands of Rune Midgard.";
+ next;
+ mes "[Father Thomas]";
+ mes "Please fill out this application form so that I can review your qualifications for becoming a Priest.";
+ next;
+ mes "(you fill out the form and hand it back)";
+ next;
+ mes "[Father Thomas]";
+ if (JobLevel < 40) goto sL_LowLvl;
+ if (JobLevel == 50) goto sL_HighLvl;
+ mes "Ah, very good " + strcharinfo(0) + ". Let me now tell you about the tasks you will have to fullfill in order to become a Priest.";
+ next;
+ mes "[Father Thomas]";
+ mes "The first task will be to find and speak with 3 very wise Clerics. They are located in various parts of Rune Midgard.";
+ next;
+ mes "[Father Thomas]";
+ mes "The second task will consist of 3 trials. In the first trial you must face the undead.";
+ mes "The second trial will test your ability to resist temptation and avoid corruption. The third trial you will have to figure out for yourself.";
+ next;
+ mes "[Father Thomas]";
+ mes "After you finish the 2 tasks, there will be a final test with Sister Cecile. Pass it and you can become a Priest.";
+ next;
+ mes "[Father Thomas]";
+ set JBLVL, 40;
+ goto L_Test1;
+
+ sL_LowLvl:
+ mes "I'm sorry but you cannot become a Priest at this moment. You need to have a job level of at least 40.";
+ next;
+ mes "[Father Thomas]";
+ mes "Please strengthen your faith in God by performing more good deeds.";
+ mes "I hope when the time is right, you'll be back... I will be waiting for you here.";
+ close;
+
+ sL_HighLvl:
+ mes "Wow, your already at job lvl 50. I'm amazed at your dedication and hard work!";
+ emotion e_gasp;
+ next;
+ mes "[Father Thomas]";
+ mes "Because of this I will allow you to skip the first task. How about we start the second task instead?";
+ next;
+ mes "[Father Thomas]";
+ mes "I believe with your power, you can overcome this task easily...";
+ mes "But if you work with a Priest, i think you will learn more and do a lot better.";
+ next;
+ mes "[Father Thomas]";
+ set PRIEST_Q, 2;
+ set JBLVL, 50;
+ goto L_Test2;
+ M_2b:
+ mes "[Father Thomas]";
+ mes "Priests are also followers of God. They are highly trained and are much more powerful than Acolytes.";
+ next;
+ mes "[Father Thomas]";
+ mes "To become a priest, you must have at least a job lvl 40. You will then have to pass a series of tests in order to prove yourself.";
+ next;
+ mes "[Father Thomas]";
+ mes "If you become a Priest, you will become very important to evey other job class.";
+ next;
+ mes "[Father Thomas]";
+ mes "You must NEVER help someone for any sort of profit or self gain. To be a Priest is to be selfless.";
+ next;
+ mes "[Father Thomas]";
+ mes "We Priest have only one objective, and that is to help others...";
+ close;
+ M_2End:
+ mes "[Father Thomas]";
+ mes "Oh is that the case?... Well I'm fine thank you.";
+ mes "Please don't forget your duties as an Acolyte, and be carefull not to stray off the path to salvation.";
+ next;
+ mes "[Father Thomas]";
+ mes "I hope you will visit again soon, and please tell me how the other Acolytes are doing. May God be by your side...";
+ close;
+
+
+
+L_Test1:
+ if (PRIEST_Q2 == 1) goto L_NotDone1a;
+ if (PRIEST_Q2 == 2) goto L_NotDone1b;
+ if (PRIEST_Q2 == 3) goto L_NotDone1c;
+ if (PRIEST_Q2 == 4) goto L_Done1;
+ mes "Okay, let me tell you what you have to do for the first task.";
+ next;
+ mes "[Father Thomas]";
+ mes "First you will have to find ^5533FFFather Rubalkubara^000000, he is located 1 map North and 2 maps East of Prontera, near St. Capitolina Abbey.";
+ next;
+ mes "[Father Thomas]";
+ mes "Next you will have to find ^5533FFMother Matilda^000000. She is located somewhere 1 map North of Morroc.";
+ next;
+ mes "[Father Thomas]";
+ mes "Last but not least, you will have to find ^5533FFFather Yosuke^000000.";
+ mes "I heard that Father Yosuke is often seen on an tiny island 2 maps West and 1 map North of Prontera.";
+ next;
+ mes "[Father Thomas]";
+ mes "Please becareful on your journey. If you have any questions you may speak with me again.";
+ mes "Remeber to check back with me when you have completed the first task.";
+ next;
+ mes "[Father Thomas]";
+ mes "May God Be with you...";
+ set PRIEST_Q, 1;
+ set PRIEST_Q2, 1;
+ close;
+
+ L_NotDone1a:
+ mes "What? Why are you still here? Did you forget the first task?";
+ next;
+ menu "Yes, can you please tell me about the first task again?",sM_3a, "NO! how can I forget.",sM_3End;
+
+ sM_3a:
+ mes "[Father Thomas]";
+ mes "Hmm... if you're having trouble with this task, I fear that you will have an even harder time with the others....";
+ next;
+ mes "[Father Thomas]";
+ mes "Please visit ^5533FFFather Rubalkubara^000000. He is located 1 map North and 2 maps East of Prontera near St. Capitolina Abbey.";
+ close;
+
+ sM_3End:
+ mes "[Father Thomas]";
+ mes "Oh if you have any questions, please speak with Sister Cecila near the entrance.";
+ next;
+ mes "[Father Thomas]";
+ mes "Please hurry and becareful on your journey. May the lord look down and smile upon you....";
+ close;
+ L_NotDone1b:
+ mes "Hmmm??";
+ emotion e_what;
+ next;
+ mes "[Father Thomas]";
+ mes "Have you gone to see ^5533FFMother Marthilda^000000 yet? She can be found near Morroc in the Sogart Desert.";
+ mes "Even though Morroc is far away, I know you will be able to find her.";
+ close;
+
+ L_NotDone1c:
+ mes "Have you seen Mother Marthilda in Morroc? In that case you must now go see ^5533FFFather Yosuke^000000.";
+ mes "He is located on tiny island 2 maps West and 1 map North of Prontera. You must go and speak with him!.";
+ close;
+
+ L_Done1:
+ mes "So you spoken with all of the Clerics? Good job, you just completed the first task.";
+ next;
+ mes "[Father Thomas]";
+ mes "Now lets start the second task. Be prepared to face great evils.. If you want, you can ask a Priest to assist you with this test.";
+ set PRIEST_Q, 2;
+ set PRIEST_Q2, 0;
+ next;
+ mes "[Father Thomas]";
+
+L_Test2:
+ if(PRIEST_Q2 == 1) goto L_ReTest2;
+ if(PRIEST_Q2 == 2) goto L_Done2;
+ mes "So are you ready to start the second task?";
+ M_Menu:
+ next;
+ menu "Yes, lets start.",M_4a, "Let me get ready, i'll be back later.",M_4End;
+
+ M_4a:
+ mes "[Father Thomas]";
+ mes "Very well. Let me send you to ^5544FFFather Peter^000000. Once there speak to him about the second task.";
+ next;
+ set PRIEST_Q2, 1;
+ warp "job_prist.gat", 24, 180;
+ savepoint "prt_church.gat", 16, 37;
+ end;
+
+ M_4End:
+ mes "[Father Thomas]";
+ mes "Okay, please get ready and come back soon. I hope you will be able to make it through the trials without many problems.";
+ close;
+
+ L_ReTest2:
+ mes "You look really tired... but guess what, you'll be even more tired when you've become a Priest.";
+ mes "Please don't give up. Do you want to try the task again?";
+ goto M_Menu;
+
+ L_Done2:
+ mes "Great job. If have endured all of the trials and have passed the second test.";
+ mes "If you can pass the last test, I trully belive that you will be one of the best Priests ever!";
+ next;
+ mes "[Father Thomas]";
+ mes "Now, for the final test, please go speak with ^5533FFSister Cecile^000000. Once you have passed it come see me.";
+ next;
+ mes "[Father Thomas]";
+ mes "I'll be waiting here. Good luck my child.";
+ set PRIEST_Q, 3;
+ set PRIEST_Q2, 0;
+ close;
+
+L_Test3:
+ mes "Go speak with ^5533FFSister Cecile^000000 and complete the last test.";
+ next;
+ mes "[Father Thomas]";
+ mes "Good luck. I'll be waiting to hear the good news..";
+ close;
+
+
+L_Change:
+ if (SkillPoint > 0) mes "Wait. You must use up your skill points in order to become a Priest.";
+ if (SkillPoint > 0) close;
+ mes "Congratulations! You have just completed all of the tests. I can now turn you into a Priest.";
+ emotion e_no1;
+ next;
+ mes "[Father Thomas]";
+ mes "God, please endow "+strcharinfo(0)+" with the strength and courage to fight evil and help mankind.";
+ next;
+ callfunc "Job_Change",Job_Priest;
+ mes "[Father Thomas]";
+ mes "You are now a Priest. As a Priest, you can now help a lot of people in the name of God.";
+ next;
+ if (JBLVL != 50) getitem 1550, 1;
+ if (JBLVL == 50) getitem 1551, 1;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ mes "[Father Thomas]";
+ mes "Here, take this book as a reward for successfully completing the tests. This book will help you understand more about God.";
+ next;
+ mes "[Father Thomas]";
+ mes "I hope you can help serve as a role model for young Acolytes all over Rune Midgard.";
+ mes "Please be a good Priest and help bring peace to this world!";
+ close;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Test 1 \\
+//********************************************************************************************************************************\\
+// Function: Father Rubalkabara --------------------------------------------------------------------------
+function script F_FatherRub {
+ if(PRIEST_Q == 1 && PRIEST_Q2==1) goto L_Test;
+ if(PRIEST_Q==1 && PRIEST_Q2 > 1) goto L_Done;
+ mes "It's good to see you again. I expect all is well? Continue on your path of helping others and serving God, and let us pray for humanities salvation.";
+ close;
+
+L_Test:
+ mes "Ah hello there....";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "What's this? You're here because you wish to serve God in an even greater capacity?";
+ emotion e_what;
+ next;
+ menu "Yes, I believe Priesthood is the right path.",-, "No, not really.... just came to say hi.",M_No;
+
+ mes "[Father Rubalkabara]";
+ mes "Haha! Very good. We need more people like yourself in order for this world to survive the evils that haunt it.";
+ emotion e_no1;
+ next;
+ mes "[Father Rubalkabara]";
+ mes "Because of your pure heart I will give you my blessing child. Please meet with ^5533FFMother Marthilda^000000 next.";
+ next;
+ mes "[Father Rubalkabara]";
+ mes "You can find her in the map just north of the town of Morroc. Have a safe journey and good luck on becoming a Priest.";
+ set PRIEST_Q2, 2;
+ close;
+ M_No:
+ mes "[Father Rubalkabara]";
+ mes "Oh... well then... hello to you too. Although it is nice to see a servant of God such as yourself, I'm a little busy right now so if you don't mind.....";
+ emotion e_swt;
+ close;
+
+L_Done:
+ mes "Please see ^5533FFMother Marthilda^000000 next. Good luck with your journey to becoming a Priest";
+ close;
+}
+
+// Function: Mother Marthilda --------------------------------------------------------------------------
+function script F_MotherMart {
+
+ if(PRIEST_Q==1 && PRIEST_Q2==2) goto L_Test;
+ if(PRIEST_Q==1 && PRIEST_Q2 > 2) goto L_Done;
+ mes "Oh my... It's been a while since I've seen you. My how you've grown. It's nice to see one of God servants continuing to improve.";
+ mes "I wish you continued success child, and always remember to have faith.";
+ close;
+
+L_Test:
+ mes "Ah, you're here for the Priest test aren't you? I must say, you did a very good job in comming all this way.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "That shows that you have true faith! It is my pleasure to allow you to continue on with your test.";
+ next;
+ mes "[Mother Marthilda]";
+ mes "You must now go see ^5533FFFather Yosuke^000000. He is 1 map North and 2 maps East of Prontera. I'm sure you will make a fine Priest!";
+ set PRIEST_Q2, 3;
+ close;
+
+L_Done:
+ mes "To complete your task you must go find ^5533FFFather Yosuke^000000. Please be carefull and remeber to pray.";
+ close;
+}
+
+// Function: Father Yosuke --------------------------------------------------------------------------
+function script F_FatherYos {
+
+ if(PRIEST_Q==1 && PRIEST_Q2==3) goto L_Test;
+ if(PRIEST_Q==1 && PRIEST_Q2==4) goto L_Done;
+ mes "Just because you're a servant of God doesn't mean you can come here and bother me. Please leave...";
+ close;
+
+L_Test:
+ mes "Hmm...? Did you need something? Oh the Priest test..... are you sure you're up for that?";
+ emotion e_what;
+ next;
+ mes "[Father Yosuke]";
+ mes "Meh, very well. I will let you pass. Go back to the church and speak with Father Thomas. Your duty here as been fulfilled";
+ set PRIEST_Q2, 4;
+ close;
+
+L_Done:
+ mes "Ugh? What are you still doing here...? I said to go back to the church.... I'm very busy right now....";
+ emotion e_what;
+ close;
+}
+
+
+//**********************************************************************************************************************************************************************************\\
+//================================================== Father Peter: Test 2 ====================================================\\
+//**********************************************************************************************************************************************************************************\\
+job_prist.gat,24,186,4 script Father Peter 110,{
+
+L_Start:
+ mes "[Father Peter]";
+ mes "God bless you!! Welcome back!";
+ mes "First i want to congratulated you for passing the first level.";
+ next;
+ mes "[Father Peter]";
+ mes "My name is Peter.";
+ mes "Hows, Thomas these days?";
+ next;
+ mes "[Father Peter]";
+ mes "Oh, so he's a father now eh? hahah...";
+ mes "I think i should call him Father Thomas!";
+ next;
+ mes "[Father Peter]";
+ mes "So you know why your here right? Your next test will be to overcome a series of trials involving the darkest of evils.";
+ mes "Do you understand what this means?";
+ next;
+ menu "Yes, I do.",-, "No, I don't quite know it..?",M_1b;
+
+ mes "[Father Peter]";
+ mes "Wow, your' pretty smart, but i think its better for you to listen to the things i got to say.";
+ mes "heheh!";
+ goto L_Cont;
+ M_1b:
+ mes "[Father Peter]";
+ mes "Oh, is that so, i think i'll need to explain it to you.";
+ mes "After listening to what i have to say, i think you'll understand.";
+
+ L_Cont:
+ next;
+ mes "[Father Peter]";
+ mes "What is overcoming evil? its basically destroying it.";
+ mes "What is evil? its basically devil, ghosts etc...";
+ next;
+ mes "[Father Peter]";
+ mes "There's a lot of evil in this world.";
+ mes "The evil usually tease people that prey to God.";
+ next;
+ mes "[Father Peter]";
+ mes "We priests are supposed to get rid of all the evil!";
+ mes "thats the only way we can bring peace to this world!";
+ next;
+ mes "[Father Peter]";
+ mes "If you are trully dedicated, then these trials should not pose that great of a challenge.";
+ mes "Even so, I you feel it necessary you may ask a Priest to assist you in this test.";
+ next;
+ mes "[Father Peter]";
+ mes "Well, can we start now?";
+ M_Menu:
+ next;
+ menu "Yes.",M_2a, "Wait a minute.",M_2b, "I want to go back to town.",M_2c;
+
+ M_2a:
+ mes "[Father Peter]";
+ mes "Okay, just enter the waiting room.";
+ close;
+
+ M_2b:
+ mes "[Father Peter]";
+ mes "Oh you need to get ready eh?";
+ mes "No problem you can start the quest when your ready.";
+ close;
+ M_2c:
+ mes "[Father Peter]";
+ mes "What? you want to go back? but you just arrived?";
+ mes ".....";
+ next;
+ mes "[Father Peter]";
+ mes "Maybe because its your first time thats why your scared.";
+ mes "You can come back when you get more courage.";
+ next;
+ warp "prt_church.gat", 16, 37;
+ close;
+
+OnInit:
+ waitingroom "Priest Test Waiting Room",8,"Father Peter::OnStart",1;
+ end;
+OnStart:
+ set $@PrstUsers, getareausers("job_prist.gat", 8, 34, 39,109);
+ set $@PrstUsers, $@PrstUsers + getareausers("job_prist.gat", 160, 14, 175, 178);
+ set $@PrstUsers, $@PrstUsers + getareausers("job_prist.gat", 90, 34, 105,105);
+ if($@PrstUsers > 0) end; // stops the rest of the script from running if there is already another player taking the test
+
+ if((getwaitingroomstate(33)) == 0) end; // stops the rest of the script from running if there is no one in the waiting room
+ disablenpc "prst1_1"; //disables the exit warp
+ disablenpc "prst2_1";
+ warpwaitingpc "job_prist.gat", 24, 44;
+ killmonsterall "job_prist.gat";
+ donpcevent "PrstTest2_1::OnStart";
+ end;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Test 2, Part 1: Kill the Zombies \\
+//********************************************************************************************************************************\\
+job_prist.gat,1,1,1 script PrstTest2_1 -1,{
+
+OnStart:
+ set $@PrstRm, 1; //used to determine what areawarp and areaannounce to use
+ enablenpc "Zombie1_Trig";
+ enablenpc "Zombie2_Trig";
+ enablenpc "Zombie3_Trig";
+ enablenpc "Zombie4_Trig";
+ enablenpc "Zombie5_Trig";
+ set $@mob, 13;
+ initnpctimer;
+ end;
+
+OnMobDead:
+ set $@mob, $@mob - 1;
+ if($@mob > 0) end;
+
+ enablenpc "prst1_1";
+ areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: Well done my child. Enter the warp to start the next test.",8;
+ initnpctimer "prst1_1"; //starts a 30 sec timer. this will warp the player even if they don't enter the warp to keep the test going
+ end;
+
+OnTimer500:
+ areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: In order to pass this trial, you will have to kill all of the zomibes that appear.",8;
+ end;
+OnTimer2500:
+ stopnpctimer;
+ initnpctimer "TimerPrst"; // starts the 5 min test timer
+ areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: Move slowly and take your time.",8;
+ end;
+}
+
+// These hidden warps spawn the monsters when you walk
+// First set of Zombies------------------------------------------------------------
+job_prist.gat,23,52,1 script Zombie1_Trig 139,16,0,{
+
+ monster "job_prist.gat",24,52,"Robbery",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",18,52,"Evilness",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",30,52,"Jealousy",1015,1,"PrstTest2_1::OnMobDead";
+ disablenpc "Zombie1_Trig"; //disables the npc so that it can't spawn the monsters more than once
+ end;
+}
+
+// Second set of Zombies----------------------------------------------------
+job_prist.gat,23,62,1 script Zombie2_Trig 139,16,0,{
+
+ monster "job_prist.gat",21,62,"Anger",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",27,62,"Wonderness",1015,1,"PrstTest2_1::OnMobDead";
+ disablenpc "Zombie2_Trig";
+ end;
+}
+
+// Third set of Zombies--------------------------------------------------------
+job_prist.gat,23,72,1 script Zombie3_Trig 139,16,0,{
+
+ monster "job_prist.gat",24,72,"Cockyness",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",18,72,"Slutty",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",30,72,"Lazyness",1015,1,"PrstTest2_1::OnMobDead";
+ disablenpc "Zombie3_Trig";
+ end;
+}
+
+// Fourth set of Zombies--------------------------------------------------------
+job_prist.gat,23,82,1 script Zombie4_Trig 139,16,0,{
+
+ monster "job_prist.gat",21,82,"Greed",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",27,82,"Greedyness",1015,1,"PrstTest2_1::OnMobDead";
+ disablenpc "Zombie4_Trig";
+ end;
+}
+
+// Fifth set of Zombies ---------------------------------------------------------
+job_prist.gat,23,92,1 script Zombie5_Trig 139,16,0,{
+
+ monster "job_prist.gat",24,92,"Faithless",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",18,92,"Non-believer",1015,1,"PrstTest2_1::OnMobDead";
+ monster "job_prist.gat",30,92,"Scaryness",1015,1,"PrstTest2_1::OnMobDead";
+ disablenpc "Zombie5_Trig";
+ end;
+}
+
+
+// End warp for 1st part of test--------------------------------------------------------------------
+job_prist.gat,24,109,1 script prst1_1 45,3,3,{
+
+ if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the aco to step on the warp.
+OnTimer30000:
+ stopnpctimer;
+ areawarp "job_prist.gat",8,34,39,109,"job_prist.gat",168,17;
+ killmonsterall "job_prist.gat";
+ donpcevent "PrstTest2_2::OnStart";
+ end;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Test 2, Part 1: Resist Temptation \\
+//********************************************************************************************************************************\\
+job_prist.gat,1,1,0 script PrstTest2_2 -1,{
+
+OnStart:
+ enablenpc "Devi_Trig"; //enables these npc's just in case they were disabled by a previous tester
+ enablenpc "Deviruchi";
+ enablenpc "Doppel_Trig";
+ enablenpc "Doppel";
+ enablenpc "Dark_Trig";
+ enablenpc "Dark Lord";
+ enablenpc "Bapho_Trig";
+ enablenpc "Baphomet";
+ set $@PrstRm, 2;
+ set $PRIEST_Q3, 0;
+ initnpctimer;
+ end;
+
+OnCheck:
+ set $PRIEST_Q3, $PRIEST_Q3 + 1; //this counter checks to see if the player spoke with each devil and answered the questions
+ if($PRIEST_Q3 < 4) end;
+
+ enablenpc "prst2_1";
+ areaannounce "job_prist.gat", 160, 14, 175, 178, "[Father Peter]: Excellent! You have shown great courage! Use the warp to move on to the next room.",8;
+ initnpctimer "prst2_1"; //starts a 30 sec timer. this will warp the player even if they don't enter the warp to keep the test going
+ end;
+
+OnTimer500:
+ stopnpctimer;
+ areaannounce "job_prist.gat", 160, 14, 175, 178, "[Father Peter]: This trial will test the strength of your will and your commitment to God!",8;
+ end;
+
+}
+
+
+// Deviruchi ------------------------------------------------------------------------
+job_prist.gat,168,45,4 script Deviruchi 738,{
+
+OnStart:
+ if(BaseJob == Job_Acolyte) goto L_Aco;
+
+L_Priest:
+ mes "[Deviruchi]";
+ mes "Hey, whats priest like you doing in a place like this? go back to town. You like wasting you time here eh?";
+ next;
+ mes "[Deviruchi]";
+ mes "I feel happy today, so i'll spare you, now go. Next time you come, I'm gonna take to you down.";
+ close;
+
+L_Aco:
+ mes "[Deviruchi]";
+ mes "Hey, isn't that a acolyte? i haven't seen one in ages. Looks like you're going to become a priest soon...";
+ next;
+ mes "[Deviruchi]";
+ mes "I can tell how sad it is to become a servant of God. I think its weird that you're here.";
+ next;
+ mes "[Deviruchi]";
+ mes "The path your walking is going to be difficult. Isn't there better jobs you can be?";
+ next;
+ mes "[Deviruchi]";
+ mes "Doesn't matter if its in a town, in a cave, all the people always asks you to help them. Itsn't funny that they never helped you?";
+ next;
+ mes "[Deviruchi]";
+ mes "I'll give you an advice, you should give up now. The tests will be hard, and the path you're gonna walk will be difficult.";
+ next;
+ menu "Yea, I'm going to give up.",-, "Devil, Be gone NOW!.",M_1a;
+
+ mes "[Deviruchi]";
+ mes "Yeap thats a good choice, you don't have to come to this place again! Since you decided to give up, i'll give you a present.";
+ next;
+ mes "[Deviruchi]";
+ mes "I'll let you meet my friends...FOR FREE HAHAHAHAH!";
+ next;
+ warp "c_tower2.gat", 168, 33;
+ end;
+ M_1a:
+ mes "[Deviruchi]";
+ mes "Oh.. I'm so scared..hahaha. Don't be like this, listen to what i have to say.";
+ next;
+ mes "[Deviruchi]";
+ mes "If you give up now, i'll give you a nice gift. This gift is so hard to find.";
+ next;
+ cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",4;
+ mes "[Deviruchi]";
+ mes "Do you think you can find a card like that? Decide now, don't regret when you become a priest...";
+ next;
+ menu "I accept your card.",-, "Devil, Be GONE!!",sM_1a;
+
+ mes "[Deviruchi]";
+ mes "Hahaha all the human beings are like this, good choice! Okay, let me give you this card!";
+ next;
+ cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",255;
+ mes "[Deviruchi]";
+ mes "Well, too bad i can't give it to you. Go look for it YOURSELF!";
+ next;
+ warp "mjolnir_05.gat", 200, 200;
+ end;
+ sM_1a:
+ cutin "¹Ì½ºÆ®·¹½ºÄ«µå.bmp",255;
+ mes "[Deviruchi]";
+ mes "Wow, your one tough acolyte, if you keep denying you better becareful.";
+ mes "I will be watching, I'll see if you can become a good priest or not.";
+ next;
+ mes "[Deviruchi]";
+ mes "One day, you'll regret and want to come back to me!";
+ disablenpc "Devi_Trig"; //disables the trigger npc so you don't accidentally activate it again
+ disablenpc "Deviruchi";
+ donpcevent "PrstTest2_2::OnCheck";
+ close;
+}
+
+// Doppelganger ------------------------------------------------------------------------------
+job_prist.gat,168,80,4 script Doppelganger::Doppel 739,{
+
+OnStart:
+ if(BaseJob == Job_Acolyte) goto L_Aco;
+
+L_Priest:
+ mes "[Doppelganger]";
+ mes "What good is it to be here?.";
+ mes "Are you this bored? you're already a priest why are you here?.";
+ next;
+ mes "[Doppelganger]";
+ mes "You don't need to help these acolytes, go home.";
+ mes "You're doing something that is wasting your time, leave now.";
+ close;
+L_Aco:
+ mes "[Doppelganger]";
+ mes "Hey, Acolyte wait, listen to what i have to say.";
+ next;
+ mes "[Doppelganger]";
+ mes "You came here because you want to become a priest eh?";
+ mes "I don't think you should become a priest.";
+ next;
+ mes "[Doppelganger]";
+ mes "If you want, i can use my powers to let you start over again.";
+ mes "You can become a novice again, and you can choose what job you want to be.";
+ next;
+ mes "[Doppelganger]";
+ mes "Well, the job you choose depends on your level hhehe.";
+ mes "Isn't this a good deal? if you want i can help you right now.";
+ next;
+ menu "I hope you can help me!",-, "Devil Be gone!",M_1b;
+
+ mes "[Doppelganger]";
+ mes "Yes thats a good choice.";
+ mes "Let me turn you into a novice now.";
+ next;
+ mes "[Doppelganger]";
+ mes "You know it takes a long time to ressurect when you DIE!!";
+ next;
+ warp "gef_dun02.gat", 210, 177;
+ end;
+ M_1b:
+ mes "[Doppelganger]";
+ mes "I don't think you understand what i mean.";
+ mes "This is one of the best things that can happen to you.";
+ next;
+ mes "[Doppelganger]";
+ mes "You just need to tell me that you don't want to become a priest.";
+ mes "If you do that, i can turn you into any job you want, you want to become a swordman like me?";
+ next;
+ menu "I don't want to become a priest!",-, "Devil, Be GONE!",sM_1b;
+
+ mes "[Doppelganger]";
+ mes "good choice, you don't need to come back here anymore.";
+ mes "okay, let me turn you into a novice now...";
+ next;
+ mes "[Doppelganger]";
+ mes "You know its takes a long time to ressurect when you DIE??!!";
+ next;
+ warp "gef_dun02.gat", 210, 177;
+ end;
+ sM_1b:
+ mes "[Doppelganger]";
+ mes "okay fine, i'll spare you today.";
+ next;
+ mes "[Doppelganger]";
+ mes "If i see you next time, I'm gonna make you die painfully.";
+ disablenpc "Doppel_Trig";
+ disablenpc "Doppel";
+ donpcevent "PrstTest2_2::OnCheck";
+ close;
+}
+
+// Dark Lord -------------------------------------------------------------------------------
+job_prist.gat,168,115,4 script Dark Lord 737,{
+
+OnStart:
+ if(BaseJob == Job_Acolyte) goto L_Aco;
+
+L_Priest:
+ mes "[Dark Lord]";
+ mes "Let you feel hatred and anger!!";
+ mes "Let you feel how it feels when your friend betrays you!";
+ next;
+ mes "[Dark Lord]";
+ mes "Stay here, and train with us and next; until you are strong enough then you can go back!";
+ mes "Stay with us and learn to curse!";
+ close;
+L_Aco:
+ mes "[Dark Lord]";
+ mes "Stop right there human!.";
+ mes "Whose permission do you have to pass through here!";
+ next;
+ mes "[Dark Lord]";
+ mes "If you want to become a priest, you can't pass through here,";
+ mes "Go now, before i kill you.";
+ next;
+ mes "[Dark Lord]";
+ mes "Even more annoying than ants you humans, leave and stop bothering me!";
+ next;
+ menu "I'm sorry, please spare me.",-, "Devil, Be GONE!.",M_1c;
+
+ mes "[Dark Lord]";
+ mes "Don't come here again!";
+ next;
+ warp "gl_church.gat", 145, 170;
+ end;
+ M_1c:
+ mes "[Dark Lord]";
+ mes "Don't try to act like a tough guy.";
+ mes "I can cut u in many pieces with my pinky.";
+ next;
+ mes "[Dark Lord]";
+ mes "Before i use my dark powers on you, leave!";
+ next;
+ menu "Please, Spare me.",-, "Devil, BE GONE!",sM_1c;
+
+ mes "[Dark Lord]";
+ mes "Don't appear here again!";
+ next;
+ warp "gl_church.gat", 145, 170;
+ end;
+ sM_1c:
+ mes "[Dark Lord]";
+ mes "So you decided to stay eh? you pesky human, killing you will dirty my hands.";
+ next;
+ mes "[Dark Lord]";
+ mes "If i see you again, I'm gonna kill you.";
+ disablenpc "Dark_Trig";
+ disablenpc "Dark Lord";
+ donpcevent "PrstTest2_2::OnCheck";
+ close;
+}
+
+// Baphomet -----------------------------------------------------------------------------
+job_prist.gat,168,150,4 script Baphomet 736,{
+
+OnStart:
+ if(BaseJob == Job_Acolyte) goto L_Aco;
+
+L_Priest:
+ mes "[Baphomet]";
+ mes "Annoying Priests...";
+ next;
+ mes "[Baphomet]";
+ mes "I have nothing to talk to you about, leave now.";
+ close;
+L_Aco:
+ mes "[Baphomet]";
+ mes "Hey, Human.";
+ next;
+ mes "[Baphomet]";
+ mes "You interested in a deal?";
+ next;
+ mes "[Baphomet]";
+ mes "I can get you all the rich and fame in this world.";
+ mes "Infinite money and weapons which no humans have...";
+ next;
+ mes "[Baphomet]";
+ mes "Also, if you want, you can always summon me.";
+ mes "If you did that, everyone will be afraid of you hahahaha.";
+ next;
+ mes "[Baphomet]";
+ mes "I think you should give up being a priest and just accept my deal.";
+ mes "If you accept my deal, the world is yours.";
+ next;
+ menu"I give up being a priest.",-, "Devil be GONE!",M_1d;
+
+ mes "[Baphomet]";
+ mes "Okay, let us sign the contract...";
+ mes "you will not forget this...";
+ next;
+ mes "[Baphomet]";
+ mes "You go find where i live.";
+ mes "When your there, come and sign the contract.";
+ next;
+ warp "glast_01.gat", 200, 203;
+ end;
+ M_1d:
+ mes "[Baphomet]";
+ mes "Okay fine, i'll leave.";
+ mes "But, you won't leave that easily.";
+ next;
+ mes "[Baphomet]";
+ mes "I already set up a lot of evil stuff for you...";
+ mes "I want to see how long you can last.";
+ next;
+ mes "[Baphomet]";
+ mes "OKay go now.";
+ disablenpc "Bapho_Trig";
+ disablenpc "Baphomet";
+ donpcevent "PrstTest2_2::OnCheck";
+ close;
+}
+
+
+// These hidden warps trigger the npcs when you get near them
+// Deviruchi Trigger --------------------------------------------------------------------
+job_prist.gat,167,40,1 script Devi_Trig 139,8,0,{
+
+ doevent "Deviruchi::OnStart";
+ end;
+}
+// Doppleganger Trigger --------------------------------------------------------------------
+job_prist.gat,167,77,1 script Doppel_Trig 139,8,0,{
+
+ doevent "Doppel::OnStart";
+ end;
+}
+// Dark Lord Trigger --------------------------------------------------------------------
+job_prist.gat,167,112,1 script Dark_Trig 139,8,0,{
+
+ doevent "Dark Lord::OnStart";
+ end;
+}
+// Baphomet Trigger --------------------------------------------------------------------
+job_prist.gat,167,145,1 script Bapho_Trig 139,8,0,{
+
+ doevent "Baphomet::OnStart";
+ end;
+}
+
+
+// End warp for 2nd part of test ---------------------------------------------------------
+job_prist.gat,168,180,0 script prst2_1 45,3,3,{
+
+ if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the Aco to step on the warp.
+OnTimer30000:
+ set $@PrstRm, 3;
+ set $PRIEST_Q3, 0;
+ enablenpc "Mummy1_Trig"; //enables the floor triggers for the next test
+ enablenpc "Mummy2_Trig";
+ enablenpc "Mummy3_Trig";
+ stopnpctimer;
+ initnpctimer "prst3_1";
+ areawarp "job_prist.gat", 160, 14, 175, 178, "job_prist.gat", 98, 40;
+ end;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Test 2, Part 3: Make it to the exit \\
+//******************************************************************************************************************************* *\\
+// First set of Mummies --------------------------------------------------------
+job_prist.gat,97,50,0 script Mummy1_Trig 139,8,1,{
+
+ monster "job_prist.gat", 93, 55, "ca", 1041,1;
+ monster "job_prist.gat", 102, 55, "ah", 1041,1;
+ disablenpc "Mummy1_Trig";
+ end;
+}
+// Second set of Mummies --------------------------------------------------------
+job_prist.gat,97,65,0 script Mummy2_Trig 139,8,1,{
+
+ monster "job_prist.gat", 93, 70, "men", 1041,1;
+ monster "job_prist.gat", 102, 70, "ahke", 1041,1;
+ disablenpc "Mummy2_Trig";
+ end;
+}
+// Third set of Mummies --------------------------------------------------------
+job_prist.gat,97,80,0 script Mummy3_Trig 139,8,1,{
+
+ monster "job_prist.gat", 93, 85, "mea", 1041,1;
+ monster "job_prist.gat", 102, 85, "sne", 1041,1;
+ disablenpc "Mummy3_Trig";
+ end;
+}
+
+
+// End warp for 3rd part of test ----------------------------------------------
+job_prist.gat,98,105,0 script prst3_1 45,2,2,{
+
+ if(BaseJob == Job_Priest) end; //If a Priest friend steps on the warp nothing happens. Need the Aco to step on the warp.
+ stopnpctimer "TimerPrst";
+ areawarp "job_prist.gat", 90, 34, 105, 105, "prt_church.gat",16, 37;
+ set PRIEST_Q2, 2;
+ killmonsterall "job_prist.gat";
+ donpcevent "Father Peter::OnStart";
+ end;
+
+OnTimer500:
+ stopnpctimer;
+ areaannounce "job_prist.gat", 90, 34, 105,105, "[Father Peter]: This is the last trial you must face my child. Have faith, I know you can pass it!",8;
+ end;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Timer \\
+//********************************************************************************************************************************\\
+job_prist.gat,1,1,0 script TimerPrst -1,{
+
+OnTimer3000:
+ areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: You will have 5 minutes to pass all 3 trials starting now.",8;
+ end;
+OnTimer33000:
+ donpcevent "Father Peter::OnStart";
+ end;
+OnTimer63000:
+ set $@PrstTime$, "You have 4 minutes left!";
+ donpcevent "Father Peter::OnStart";
+ goto AnnouncePrst;
+OnTimer93000:
+ donpcevent "Father Peter::OnStart";
+ end;
+OnTimer123000:
+ set $@PrstTime$, "You have 3 minutes left!";
+ donpcevent "Father Peter::OnStart";
+ goto AnnouncePrst;
+OnTimer153000:
+ donpcevent "Father Peter::OnStart";
+ end;
+OnTimer183000:
+ set $@PrstTime$, "You have 2 minutes left!";
+ donpcevent "Father Peter::OnStart";
+ goto AnnouncePrst;
+OnTimer213000:
+ donpcevent "Father Peter::OnStart";
+ end;
+OnTimer243000:
+ set $@PrstTime$, "You have 1 minute left!";
+ donpcevent "Father Peter::OnStart";
+ goto AnnouncePrst;
+OnTimer273000:
+ set $@PrstTime$, "You have 30 seconds left!";
+ donpcevent "Father Peter::OnStart";
+ goto AnnouncePrst;
+OnTimer293000:
+ set $@PrstTime$, "You have 10 seconds left!";
+ goto AnnouncePrst;
+ end;
+OnTimer2970000:
+ set $@PrstTime$, "You have 5 seconds left.";
+ goto AnnouncePrst;
+ end;
+OnTimer302000:
+ set $@PrstTime$, "Time is up. You failed the test.";
+ goto AnnouncePrst;
+OnTimer306000:
+ stopnpctimer;
+ if($@PrstRm==1) areawarp "job_prist.gat",8,34,39,109,"prt_church.gat",16, 37;
+ if($@PrstRm==2) areawarp "job_prist.gat",160, 14, 175, 178,"prt_church.gat",16, 37;
+ if($@PrstRm==3) areawarp "job_prist.gat", 90, 34, 105,105,"prt_church.gat",16, 37;
+ killmonsterall "job_prist.gat";
+ donpcevent "Father Peter::OnStart";
+ end;
+
+AnnouncePrst:
+ if($@PrstRm==1) areaannounce "job_prist.gat",8,34,39,109,"[Father Peter]: "+$@PrstTime$+".",8;
+ if($@PrstRm==2) areaannounce "job_prist.gat",160, 14, 175, 178, "[Father Peter]: "+$@PrstTime$+".",8;
+ if($@PrstRm==3) areaannounce "job_prist.gat", 90, 34, 105,105, "[Father Peter]: "+$@PrstTime$+".",8;
+ end;
+}
+
+
+
+//**********************************************************************************************************************************************************************************\\
+//================================================= Sister Cecile: Test 3 =====================================================\\
+//**********************************************************************************************************************************************************************************\\
+prt_church.gat,27,24,4 script Sister Cecile 79,{
+ mes "[Sister Cecile]";
+ if(BaseJob == Job_Priest) goto L_Prst;
+ if(BaseJob == Job_Acolyte) goto L_Aco;
+ if(BaseJob == Job_Novice) goto L_Nov;
+
+L_Other:
+ mes "This is the Prontera Church, what can I help you with?";
+ next;
+ menu "Please tell me about priests.",-, "I'm just walking around.",M_End0;
+
+ mes "[Sister Cecile]";
+ mes "Priests are servants of God. They have special powers that allow them to help anyone in need of assistance.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Because they are followers of God, they cannot use swords and many other types of weapons.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Of course, if you want to know more about priests, you should speak with one personally.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Please stay here for as long as you wish. The church is a sanctuary for all those who seek it.";
+ close;
+ M_End0:
+ mes "[Sister Cecile]";
+ mes "Please Relax, wondering around can be tiring.";
+ close;
+
+L_Nov:
+ mes "God bless you, my child. The Prontera Church welcomes you.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Have you choose your job yet? Do you want to be one of God's helpers?";
+ mes "Becoming an Acolyte and helping people is very good thing.";
+ next;
+ mes "[Sister Cecile]";
+ mes "If you want to become an Acolyte, speak to ^5533FFFather Mareusis^000000 in the room across the hall.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Once you've reached job level 40 as an Acolyte, you can come back here and become a Priest.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Since you are still a novice, think carefully about what job you wish to take.";
+ close;
+
+L_Prst:
+ if(sex == 1) mes "God bless you, brother priest.";
+ if(sex == 0) mes "God bless you, sister priest.";
+ mes "I wish you all the best. Keep your faith strong and remeber that God loves all, and so should you.";
+ close;
+
+L_Aco:
+ if(PRIEST_Q == 1) goto L_Test1;
+ if(PRIEST_Q == 2) goto L_Test2;
+ if(PRIEST_Q == 3) goto L_Start;
+ if(PRIEST_Q == 4) goto L_Done;
+ if(sex == 1) mes "God bless you, brother.";
+ if(sex == 0) mes "God bless you, sister.";
+ mes "Why are you here?";
+ next;
+ menu "I want to become a priest.",-, "I'm just wondering around.",M_End1;
+
+ mes "[Sister Cecile]";
+ mes "Oh so you want to become a priest?";
+ mes "A lot of acolytes want to become priests.";
+ next;
+ mes "[Sister Cecile]";
+ mes "My name is Sister Cecile, I'm responsible for helping acolytes become priests.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Because I was born and raised here, I've seen a lot of people become Priests over the years.";
+ mes "Thats why i like to help people become priests now.";
+ next;
+ mes "[Sister Cecile]";
+ mes "In order to become a priest, you will have to fullfill 3 tasks. If you want to change your job now, you can go talk to Father Thomas,";
+ next;
+ mes "[Sister Cecile]";
+ mes "If you encounter any problems with any of the tasks, come talk to me and I might be able to help.";
+ close;
+ M_End1:
+ mes "[Sister Cecile]";
+ mes "Please relax and take a break. The church should feel like your home.";
+ close;
+
+L_Start:
+ if(PRIEST_Q2 == 1) goto L_ReTest;
+ mes "Good job, you successfully completed the second quest...!";
+ mes "You are now really close to becoming a priest.";
+ next;
+ mes "[Sister Cecile]";
+ if(sex==1) mes "If you want to become a priest, the last step is to answer my questions honestly.";
+ if(sex==0) mes "If you want to become a priestess, the last step is to answer my questions honestly.";
+ mes "Please be honest and answer my question.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Okay let me ask you some questions.";
+ set PRIEST_Q2, 1;
+ next;
+L_Test3:
+ mes "[Sister Cecile]";
+ mes "From today on, do you wish to help the God for all eternity?";
+ next;
+ menu "Yes.",M_2a, "No.",-;
+
+ mes "[Sister Cecile]";
+ mes "Why..Why would you say that?...";
+ mes "I don't think your suitable to become a priest...";
+ next;
+ mes "[Sister Cecile]";
+ mes "please come back when you really want to become a priest.";
+ mes "You can't become a priest right now.";
+ close;
+
+ M_2a:
+
+ mes "[Sister Cecile]";
+ mes "Will you use God's power for your own profit?";
+ next;
+ menu "Yes",-, "No.",M_2b;
+
+ mes "[Sister Cecile]";
+ mes "No, that doesn't work, if you use God's power to do what you wish, you're just like a thief.";
+ mes "How can you become a good priest if you think like that?";
+ next;
+ mes "[Sister Cecile]";
+ mes "Please come back when you make up your mind.";
+ mes "Those thoughts are the things that corrupt people.";
+ close;
+
+ M_2b:
+
+
+ mes "[Sister Cecile]";
+ mes "Will you help others in battle when they need help?";
+ next;
+ menu "Yes.",M_2c, "No.",-;
+
+ mes "[Sister Cecile]";
+ mes "Thats wrong, when someone needs help, we will do our best to help them.";
+ mes "It doesn't matter who that person is, our job is to help everyone.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Go walk around.";
+ mes "and you should learn something.";
+ close;
+ M_2c:
+
+ mes "[Sister Cecile]";
+ mes "Will you sacrafice yourself for others?";
+ next;
+ menu "Yes.",M_2d, "No.",-;
+
+ mes "[Sister Cecile]";
+ mes "No, thats not what God thinks.";
+ mes "If we can sacrafice ourselves for something that helps the world, its worth it.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Go and think about sacraficing.";
+ mes "Sacraficing is thing thats easy to say, but hard to do.";
+ close;
+ M_2d:
+
+ mes "[Sister Cecile]";
+ mes "Will you talk bad to people you meet?";
+ next;
+ menu "Yes.",-, "No.",M_2e;
+
+ mes "[Sister Cecile]";
+ mes "That is not right, priests are supposed to help people.";
+ mes "If you talk bad, you don't deserver to be a priest.";
+ next;
+ mes "[Sister Cecile]";
+ mes "even if your God's best servant.";
+ mes "You don't have the right to bad-talk.";
+ close;
+
+ M_2e:
+
+ mes "[Sister Cecile]";
+ mes "Will you bring any kind of devil to help others in battle?";
+ next;
+ menu "Yes.",-, "No.",M_2f;
+
+ mes "[Sister Cecile]";
+ mes "You can't do that.";
+ mes "It doesn't matter if the devil is good or bad, priests should never talk to a devil .";
+ next;
+ mes "[Sister Cecile]";
+ mes "Even though it looks like you did a good thing, but it was a really bad thing.";
+ mes "Please go think about it.";
+ close;
+
+ M_2f:
+
+ mes "[Sister Cecile]";
+ mes "If God wants to you to live or die, will you listen to him?";
+ next;
+ menu "Yes.",M_2g, "No.",-;
+
+ mes "[Sister Cecile]";
+ mes "If your like that you can't become a priest.";
+ mes "If God wants you to die, you have to listen to him.";
+ next;
+ mes "[Sister Cecile]";
+ mes "And we priest have the skill to Resurrect ourselves.";
+ mes "Please go and think about what death means to you.";
+ close;
+ M_2g:
+
+ mes "[Sister Cecile]";
+ mes "I just witness what you said.";
+ mes "Lastly, please promise that you'll remember the things you said today.";
+ next;
+ menu "I promise.",-, "No.",M_2No;
+
+ mes "[Sister Cecile]";
+ mes "Now, you passed all the tests.";
+ mes "Please go talk to Father Thomas to become a priest.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Please remember the things you said today.";
+ mes "God bless you...";
+ set PRIEST_Q, 4;
+ set PRIEST_Q2, 0;
+ close;
+
+ M_2No:
+ mes "[Sister Cecile]";
+ mes "..............";
+ next;
+ mes "[Sister Cecile]";
+ mes "No not yet, your still wondering if you want to become a priest or not.";
+ mes "You can't become a priest right now.";
+ next;
+ mes "[Sister Cecile]";
+ mes "I think you should go do the self-disipline test again...";
+ mes "When you're ready, come back here.";
+ next;
+ mes "[Sister Cecile]";
+ mes "God bless you...";
+ close;
+
+L_ReTest:
+ mes ".............";
+ next;
+ mes "[Sister Cecile]";
+ mes "...Oh your back.";
+ mes "I hope you can be honest this time.";
+ next;
+ mes "[Sister Cecile]";
+ mes "I hope i can sense your sincere...";
+ mes "Please answer me honestly.";
+ next;
+ mes "[Sister Cecile]";
+ mes "Okay, lets start.";
+ next;
+ goto L_Test3;
+
+L_Test1:
+ mes "Oh, so you already started the self-disipline test, good job.";
+ close;
+
+L_Test2:
+ if(PRIEST_Q2 == 1) goto L_Test2a;
+ mes "You didn't start the second quest yet?.";
+ mes "Well, i can't give u any specific details about this task.";
+ next;
+ mes "[Sister Cecile]";
+ mes "I can only tell you to be well-prepared and to not get seduced by anything...";
+ mes "You must trust in yourself in order to complete the second quest.";
+ next;
+ mes "[Sister Cecile]";
+ mes "If you want more specific details go talk to the priest in the training ground.";
+ mes "Father Thomas is a very nice person, he'll help you too.";
+ close;
+
+L_Test2a:
+ mes "Training is hard, but don't give up.";
+ mes "You must overcome anything in order to be a good priest.";
+ next;
+ mes "[Sister Cecile]";
+ mes "If there's experienced priest, you can ask them to help you train.";
+ mes "They might be able to help you pass the first level of the second task.";
+ next;
+ mes "[Sister Cecile]";
+ mes "God bless you...";
+ mes "When you complete the second quest, come back here.";
+ close;
+
+L_Done:
+ mes "Congratulations on finishing the tests. Please see Father Thomas so that he can make you a Priest.";
+ close;
+}
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_prist.gat mapflag nomemo
+job_prist.gat mapflag noteleport
+job_prist.gat mapflag nosave SavePoint
+job_prist.gat mapflag nopenalty
+job_prist.gat mapflag nobranch
+job_prist.gat mapflag noexp
+job_prist.gat mapflag noloot
diff --git a/npc/jobs/2-1/wizard.txt b/npc/jobs/2-1/wizard.txt
index 6849257a6..ac79f48ba 100644
--- a/npc/jobs/2-1/wizard.txt
+++ b/npc/jobs/2-1/wizard.txt
@@ -1,1516 +1,1516 @@
-//===== eAthena Script =======================================
-//= Wizard Job Quest
-//===== By: ==================================================
-//= (Aegis) Translated by yoshiki
-//= converted by kobra_k88
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Wizard job quest converted from aegis script, plus my own RO screenies.
-//===== Additional Comments: =================================
-//= 1.1 Now using the initnpctimer command, donpcevent,
-//= and new waitingroom event commands. No more addtimer spamming.
-//= No longer have to talk to the npc to take the test. Just enter the chat room.
-//= 1.2 Changed global variable names to unique ones.
-//= 1.2a Rollback from the wrong Kashy's fix
-//= 1.2b Fixed issue with duplicating monsters thx to Bison.[kobra_k88]
-//= 1.2c changed one Horong to Frilldora (now 3rd room contains 1 agressive mob.)
-//= 1.2d more simplified fire room - removed agressive Desert Wolf [Lupus]
-//= 1.3 Added Baby Class support [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 1.7 Replaced 2 Hodes with 2 Horong's (according to the official guide) [Lupus]
-//= 1.8 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 2.1 Changed numbers to constants. [Vicious]
-//= 2.2 Merged back JFunc [Lupus]
-//============================================================
-
-
-//<=================== Some dog =========================>
-gef_tower.gat,107,35,5 script Some Dog 81,{
- callfunc "F_BlockHigh",Job_Mage_High,"High Mage",Job_High_Wizard,"High Wizard","Dog";
- mes "[Dog]";
- if(baseJob == Job_Mage) goto L_JobMage;
- if(baseClass == Job_Mage){
- mes "Ah! High level magic users, welcome. It's always nice to see experienced magic users around here.";
- mes "Actually it's nice to see them anywhere! ~Woof!~";
- close;
- }
- if(baseClass == Job_Acolyte){
- mes "Eeek! What's a holy type person doing up here? I thought you people didn't like magic....";
- mes "You religious types are always calling it the 'dark arts'......... ooooh scary!!!...... ~grrr!~WOOF!~";
- close;
- }
- mes "Sheesh....... Why would someone who can't even cast a single spell come all the way up here???";
- next;
- mes "[Dog]";
- mes "If you're that bored, do the world a favor and climb to the top of this building from the outside, then do some acrobatics....";
- emotion e_pif;
- next;
- mes "[Dog]";
- mes "~WOOF~ Get lost! I don't have time for people like you!!";
- emotion e_go;
- close;
-
-L_JobMage:
- mes "[Dog]";
- mes "Ah... I know what you're about to say.... You want to become a Wizard right?";
- next;
- mes "[Dog]";
- mes "Speak with Catherine. She'll help you out.";
- next;
- mes "[Dog]";
- mes "If you want to know more about the job change process for Wizards, I can be of help.";
- next;
- menu "..................",M_0, "A dog is talking to me......",M_1;
-
- M_0:
- mes "[Dog]";
- mes "~Woof~ What is it? Why are you looking at me like that?? Is this the first time you've seen a dog talk?";
- emotion e_what;
- mes "[Dog]";
- mes "~Woof~ I suppose it's not that common to see a talking dog..... ~Woof~..... Yeah, it is a rare site actually.....";
- next;
- mes "[Dog]";
- mes "~GRRRR!!~.... Hey! Stop GAWKING at me for goodness sake!! ~WOOOF~";
- emotion e_an;
- next;
-
- L_Cont:
- mes "[Dog]";
- mes "My name is Maria Splodofska. Just call me Maria. I'm assisting candidates for the Wizard class.";
- next;
- mes "[Maria]";
- mes "~Woof~ You see, the reason I became a dog was.... I was helping my boyfriend with his experiment in preperation for his Final.";
- mes "He is studying for a Magic Degree. Well, before I knew what happened he accidentally turned me into a dog.....";
- next;
- mes "[Maria]";
- mes "~Grrrrr~ In a couple of months the chemicals should wear off and I should return to normal. Well theoretically speaking anyhow.";
- next;
- mes "[Maria]";
- mes "Uh, anyways..... where were we?";
- emotion e_hmm;
- next;
- mes "[Maria]";
- mes "Like I said before, if you want to become a Wizard you must first speak with Catherine.";
- mes "She just recently became a Wizard so she should be a great help.";
- next;
- mes "[Maria]";
- mes "I can tell you more about the job changing process, but I wouldn't want to take up anymore of your time.";
- mes "That is unless, you want me to go on about what's in store for Wizards to be?.........";
- next;
- menu "Yes, please continue.",sM_0, "No, it's ok.",sM_1, "A talking dog......",sM_2;
-
- sM_0:
- mes "[Maria]";
- mes "Ok then. Let me explain the process for becoming a Wizard to you....";
- next;
- mes "[Maria]";
- mes "There are 3 Tests in the Wizard job change process. The ^5555FF1st Test^000000 will require you to collect a number of ^FF5555magic items^000000.";
- next;
- mes "[Maria]";
- mes "Catherine will give you that test. She will ask to you collect either a variety of ^5555FFGemstones^000000, or ^5555FFElemental Ores^000000.";
- next;
- mes "[Maria]";
- mes "The ^5555FF2nd Test^000000 will be administered by the, ever gloomy Raul, in the corner over there.";
- mes "It is a multiple choice Q&A exam about the different aspects of magic.";
- next;
- mes "[Maria]";
- mes "The exam will consist of 10 questions. If you miss any of those questions you will fail the exam.";
- next;
- mes "[Maria]";
- mes "Raul will also administer the ^5555FF3rd Test^000000. This is the last test and it requires that defeat a series of monsters.";
- mes "There will be three rooms each filled with monsters of a specific elemental attribute.";
- next;
- mes "[Maria]";
- mes "It is up to you to figure what spells work best on which monsters.";
- next;
- mes "[Maria]";
- mes "Well, that's all I can tell you. Go ahead and apply now.";
- close;
- sM_1:
- mes "[Maria]";
- mes "Oh, ok. Go ahead and apply and do your best.";
- close;
- sM_2:
- mes "[Maria]";
- mes "I'M NOT A DOG!!! ~ ARROOOOOOOOOWWWWW!!!! ~";
- emotion e_an;
- next;
- mes "[Maria]";
- mes "Dang it! I hope you FAIL!! Now go get lost!";
- emotion e_go;
- next;
- warp "gef_dun00.gat",54,23;
- end;
- M_1:
- mes "[Dog]";
- mes "~WOOF~Woof~woof~ You DON'T have to state the obvious! I KNOW I'm a dog!";
- emotion e_pif;
- next;
- goto L_Cont;
-
-}
-
-
-//<=========================================== Registrar and Examiner Catherine Medichi ==============================================>\\
-gef_tower.gat,111,37,4 script Catherine Medichi 68,{
- callfunc "F_BlockHigh",26,"High Mage",33,"High Wizard","Catherine Medichi";
-
- mes "[Catherine Medichi]";
- if(BaseJob == Job_Mage) goto L_Mage;
-
- if(BaseJob == Job_Wizard){
- mes "What do you need fellow Wizard? If it's nothing, please leave...";
- next;
- mes "[Catherine Medichi]";
- if(sex){
- mes "... Of course, if your here to ask me out... (*giggles*)....";
- } else {
- mes "If you get yourself a boyfriend, feel free to drop by and show him off. XD";
- }
- emotion e_lv;
- close;
- }
- if(BaseJob == Job_Novice){
- mes "Awwww, a little novice! How cute! This place is for Wizards only though.";
- emotion e_lv2;
- next;
- mes "[Catherine Medichi]";
- mes "If you're interested in magic, the ^0000FFMagician's Guild^000000 is the place for you.";
- close;
- }
- mes "Hmm? What brings you all the way up here? If you have nothing to do here, please leave.";
- mes "This place is for wizards only. =P";
- next;
- mes "[Catherine Medichi]";
- mes "Try not to fall as you go back down....";
- close;
-
-L_Mage:
- if(WIZ_Q == 2) goto L_Test2;
- if(WIZ_Q == 3) goto L_Test3;
- if(WIZ_Q == 4) goto L_Done;
- if(WIZ_Q2 > 0) goto L_Test1;
-
- mes "My name's Catherine Medichi, and I just became a Wizard. Relax, you can call me Catherine.";
- next;
- mes "[Catherine Medichi]";
- mes "What brings you all the way up here? You want to be a wizard, right?";
- next;
- menu "Of course!",M_0a, "The requirements",M_0b,"Not really",M_0End;
-
- M_0a:
- mes "[Catherine Medichi]";
- mes "Please fill out this application form first.";
- next;
- mes "(you fill out the form and hand it back)";
- next;
- if(JobLevel < 40) goto sL_JobLvl;
- if(JobLevel == 50) goto sL_Job50;
-
- mes "[Catherine]";
- mes "Alright ^ff0000"+strcharinfo(0)+"^000000, it looks like you have everything in order.";
- next;
- mes "[Catherine Medichi]";
- mes "Now let me tell you about the test. It is divided into 3 parts.";
- mes "- The 1st part involves the collecting of a number of magical items,";
- mes "- the 2nd part is a Q&A exam,";
- mes "- and the 3rd section is our favorite, the field exam.";
- next;
- mes "[Catherine Medichi]";
- mes "People with a job lvl of 50 can skip the first test. They have already worked hard enough.";
- next;
- mes "[Catherine Medichi]";
- mes "Now for the first part of the test. This requires the gathering of a number of magic items.";
- next;
- set WIZ_Q2, rand(1,2);
-
- mes "[Catherine Medichi]";
- mes "The items you need to bring are:";
- if(WIZ_Q2 == 2) goto R_2;
-
- R_1:
- mes "- 10 ^ff0000Red gemstones^000000";
- mes "- 10 ^0000ffBlue gemstones^000000";
- mes "- and 10 ^ddcc11Yellow gemstones^000000.";
- goto L_Cont0;
-
- R_2:
- mes "5 ^0000ffCrystal Blues^000000,";
- mes "5 ^009900Green Lives^000000,";
- mes "5 ^ff0000Red Bloods^000000,";
- mes "and 5 ^ddcc11Wind of Verdures^000000.";
-
- L_Cont0:
- next;
- mes "[Catherine Medichi]";
- mes "This test isn't THAT hard, so get going!";
- next;
- mes "[Catherine Medichi]";
- mes "Good luck! I'll be waiting!";
- set WIZ_Q, 1;
- close;
-
- sL_JobLvl:
- mes "[Catherine Medichi]";
- mes "Hey, I told you already. You have to have at least job lvl 40.";
- mes "Don't you remember me telling you that?";
- close;
-
- sL_Job50:
- mes "[Catherine Medichi]";
- mes "Wow! You're at job level 50! You must have worked really hard! I'm impressed!";
- next;
- mes "[Catherine Medichi]";
- mes "Okay, I'll record that you're job 50. You get to skip the first test, but you still got 2 left.";
- next;
- mes "[Catherine Medichi]";
- mes "Now, talk to that man in the corner for the test. It's hard, so be careful.";
- set WIZ_Q, 2;
- close;
-
- M_0b:
- mes "[Catherine Medichi]";
- mes "Even though many people want to become Wizards, only those with a job level of 40 can qualify.";
- mes "Anyone with a job level less then that wouldn't have enough magic power to become a Wizard.";
- next;
- mes "[Catherine Medichi]";
- mes "Then there is the matter of the Wizard's Test. The test is made up of 3 sections.";
- mes "Each section focuses on different asspects of Wizardry.";
- next;
- mes "[Catherine Medichi]";
- mes "Once you pass the test you'll be a Wizard just like me. Yay!";
- mes "Unfortunately a lot people have trouble with the test and never quite make it.(*sighs*)";
- next;
- mes "[Catherine Medichi]";
- mes "Maybe you'll have better luck.";
- close;
-
- M_0End:
- mes "[Catherine Medichi]";
- mes "What? You came up here for nothing!?";
- emotion e_what;
- close;
-
-
- L_Test1:
- mes "Did you get all of the items? Let's see......";
- next;
- mes "[Catherine Medichi]";
- if(WIZ_Q2 == 1) goto sL_Gems;
- if(WIZ_Q2 == 2) goto sL_Ores;
-
- sL_Gems:
- if (countitem(716)<10 || countitem(717)<10 || countitem(715)<10) goto ssL_NotDone;
- mes "Great! You've brought everything! The guild will use these well.";
- next;
- delitem 716, 10;
- delitem 717, 10;
- delitem 715, 10;
- goto ssL_Done;
-
- sL_Ores:
- if (countitem(991)<4 || countitem(993)<4 || countitem(990)<4 || countitem(992)<4) goto ssL_NotDone;
- mes "Great! You've found them all! The guild will use them well.";
- next;
- delitem 991, 5;
- delitem 993, 5;
- delitem 990, 5;
- delitem 992, 5;
-
- ssL_Done:
- mes "[Catherine Medichi]";
- mes "Congrats, you passed the first test.";
- mes "Don't relax yet, you still got 2 tests left.";
- emotion e_no1;
- next;
- mes "[Catherine Medichi]";
- mes "Now talk to the man in the corner for the tests.";
- mes "It's pretty hard, so be carefull.";
- set WIZ_Q, 2;
- set WIZ_Q2, 0;
- close;
-
- ssL_NotDone:
- mes "It seems you didn't bring everything that's needed.";
- next;
- mes "[Catherine Medichi]";
- mes "It's hard work to get all the way up here so make sure you have all of the right items okay?";
- next;
- mes "[Catherine Medichi]";
- mes "You need:";
- if(WIZ_Q2 == 1) goto R_1;
- if(WIZ_Q2 == 2) goto R_2;
- close;
-
- L_Test2:
- if(WIZ_Q2 == 1)goto sL_Failed2;
- mes "Hey, did you go talk to the man? No? You can't just become a wizard by getting items.";
- next;
- mes "[Catherine Medichi]";
- mes "There are 2 more tests left. I'll be waiting, so go finish them.";
- close;
-
- sL_Failed2:
- mes "Huh?? You failed the Q&A test!?";
- emotion e_what;
- next;
- mes "[Catherine Medichi]";
- mes "You want to be a wizard and you can't answer a couple of questions?? Sheesh.";
- emotion e_swt;
- next;
- mes "[Catherine Medichi]";
- mes "Well, do you want big sis to give you a hint? If you do, go buy me ^0099001 apple juice^000000. I'm a bit thirsty. =P";
- next;
- menu "Can I have a hint?",M_1a, "I can pass on my own!",M_1b;
-
- M_1a:
- if (countitem(531) < 1) goto sL_NoJuice;
- delitem 531, 1;
-
- mes "[Catherine Medichi]";
- mes "Mmmmmmmmmmmmm, apple juice. ~gulp~gulp~";
- next;
- mes "[Catherine Medichi]";
- mes "Thanks, I'll give you the hint now.";
- next;
- mes "[Catherine Medichi]";
- mes "The man gives you 3 major types of questions, about:";
- mes "- ^ff0000spells^000000,";
- mes "- ^ff0000monsters^000000,";
- mes "- and ^ff0000the caster^000000.";
- next;
- mes "[Catherine Medichi]";
- mes "It's up to him to pick the questions.";
- next;
- mes "[Catherine Medichi]";
- mes "Ya know... if he got a hair cut and shaved, he might look cool...";
- mes "But obviously he wouln't do it....";
- next;
- mes "[Catherine Medichi]";
- mes "Anyways, about his questions on spells, there are obviously some on spells you've learned.";
- next;
- mes "[Catherine Medichi]";
- mes "There are also questions about spells you DON'T know much about, so go ask some Wizards for that info.";
- next;
- mes "[Catherine Medichi]";
- mes "There are also places out there with lots of information about spells, such as www.emperium.org.";
- mes "You can probably find other sites as well.";
- next;
- mes "[Catherine Medichi]";
- mes "As far as the questions on monsters go, you COULD fight them to learn about them... OR...";
- next;
- mes "[Catherine Medichi]";
- mes "... If I remember correctly, there's a libary in Prontera that has lots of information on monsters.";
- mes "You could just go there and read about them.";
- next;
- mes "[Catherine Medichie]";
- mes "Now, about the questions about the caster.... You're on your own for this one..";
- mes "Why? Because YOU ARE the caster!";
- next;
- mes "[Catherine Medichi]";
- mes "If you don't know anything about yourself, how would a stranger like me know?";
- next;
- mes "[Catherine Medichi]";
- mes "Well good luck! Mister Examiner is waiting!";
- close;
-
- sL_NoJuice:
- mes "[Catherine Medichi]";
- mes "Well, if you want hints, I need apple juice!. Otherwise, you're on your own =P.";
- close;
-
- M_1b:
- mes "[Catherine Medichi]";
- mes "That's right! Tests are meant to be done alone! That's definatly the way a Wizard should think!";
- next;
- mes "[Catherine Medichi]";
- mes "Good luck! Mister Examiner is waiting!";
- close;
-
- L_Test3:
- if(WIZ_Q2 == 1) goto sL_Failed3;
- mes "He he, I could hear you in there working hard on those questions.";
- next;
- mes "[Catherine Medichi]";
- mes "Good job, only one test left! Finish that and you'll be a wizard!";
- next;
- mes "[Catherine Medichi]";
- mes "Good luck! The examiner's waiting!";
- close;
-
- sL_Failed3:
- mes "Why did you come out during the test? I never thought you were that weak...";
- next;
- if(sex==1) goto ssL_M3;
- if(sex==0) goto ssL_F3;
-
- ssL_M3:
- mes "[Catherine Medichi]";
- mes "How could a powerful mage like you get beaten so easily!! Go back in and try harder.";
- close;
-
- ssL_F3:
- mes "[Catherine Medichi]";
- mes "You can't act all weak, just because you're a girl! If you want to be a wizard, go and pass the test!";
- next;
- mes "[Catherine Medichi]";
- mes "I thought it was hard too, but it wasn't enough to make me quit! You just have to face hardship sometimes!";
- close;
-
-
- L_Done:
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Wizard.";
- if(SkillPoint > 0) close;
-
- mes "Great! You finished all of the tests! Congrats, congrats, congrats!!";
- emotion e_no1;
- next;
- mes "[Catherine Medichi]";
- mes "Ack, I'm wasting time, I better change you!";
- next;
- callfunc "Job_Change",Job_Wizard;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
-
- mes "[Catherine Medichi]";
- mes "Now you're a wizard! Act responsibly!";
- next;
- mes "[Catherine Medichi]";
- mes "Make sure when you cast a spell, you know exactly what's going to happen!";
- next;
- mes "[Catherine Medichi]";
- mes "Don't do stupid things like casting in the middle of town!";
- mes "It causes lag and magic is supposed to be used on monsters anyways!";
- next;
- mes "[Catherine Medichi]";
- mes "Become mightier by partying with others! Oh yea, here's a present!";
- next;
- mes "[Catherine Medichi]";
- mes "(Rustle Rustle)";
- next;
- getitem 505, 6;
- mes "[Catherine Medichi]";
- mes "Use them wisely. It's a present from me, so you better use them all!";
- next;
- mes "[Catherine Medichi]";
- mes "Well my fellow Wizard, take care and have a great life!";
- close;
-}
-
-
-//<================================================ Examiner: Raul Expagarus ==================================================>\\
-gef_tower.gat,102,24,3 script Raul Expagarus 735,{
- mes "[Raul Expagarus]";
- if(BaseJob == Job_Mage) goto L_Mage;
- if(BaseJob == Job_Wizard) goto L_Wizard;
- if(baseClass == Job_Acolyte) goto L_Holy;
- if(BaseJob == Job_Novice) goto L_Novice;
-L_Other:
- mes "Ugh, I don't feel good....I feel like I'm trapped in ice........";
- next;
- mes "[Raul Expagarus]";
- mes "Who're you?! Leave!";
- emotion e_gasp;
- close;
-L_Novice:
- mes "What's a little kid like you doing here? Get out!!";
- emotion e_gasp;
- next;
- warp "geffen.gat",120,110;
- close;
-L_Holy:
- mes "Leave holy ones!";
- mes "Magic is considered to be a power that is not from God.......";
- next;
- mes "[Raul Expagarus]";
- mes "Besides, I'm not feeling too good. So Leave now!";
- close;
-L_Wizard:
- mes "Cough Cough, what can I do for you? Hmmm... you're a magic user too...";
- next;
- mes "[Raul Expagarus]";
- if(sex==1) goto L_M;
- if(sex==0) goto L_F;
-
- L_M:
- mes "If you're not responsible, you might accidently learn useless spells.";
- mes "Instead of that, you might want to focus on learning spells you'll be using now.";
- next;
- mes "[Raul Expagarus]";
- mes "In a fight for love, you might become crippled hehe.";
- close;
-
- L_F:
- mes "If you're not responsible, you might accidently learn useless spells.";
- mes "You should learn a spell with all of your heart or not learn it at all.";
- next;
- mes "[Raul Expagarus]";
- mes "If you don't wish to study like that............... Heh, then go be a housewife.";
- close;
-
-L_Mage:
- if(WIZ_Q == 1) goto L_NotRdy;
- if(WIZ_Q == 2) goto L_Test2;
- if(WIZ_Q == 3) goto L_Test3;
- if(WIZ_Q == 4) goto L_Done;
-
- mes "Cough, I don't have any time to talk.";
- next;
- mes "[Raul Expagarus]";
- mes "Sorry, but please leave.";
- close;
-
- L_NotRdy:
- mes "Heh, a wizard trainee eh?!";
- next;
- mes "[Raul Expagarus]";
- mes "You COULD just stay as a mage and live a pretty decent life.....";
- next;
- mes "[Raul Expagarus]";
- mes "Then again, wizards ARE much more high class.....";
- close;
-
- L_Done:
- mes "Congratulations on finishing the final test! You have now finished all of the Wizards tests and are ready to become a Wizard!";
- emotion e_no1;
- next;
- mes "[Raul Expagarus]";
- mes "Go speak to Catherine to become a Wizard. But be careful! Magic is a powerfull force and can easily destroy you!!";
- close;
-
- L_Test2:
- if(WIZ_Q2 == 1) goto sL_ReTest2;
-
- mes "I see you've passed the 1st test. My name is Raul Expagarus, I'm your test examiner.";
- next;
- mes "[Raul Expagarus]";
- mes "It's not too late! You can still return to a peaceful life in town if you wish.";
- next;
- mes "[Raul Expagarus]";
- mes "You probably have no clue how dangerous it is to use magic.";
- next;
- menu "You're right. I quit.",M_0a, "I want to take test!",M_0b;
-
- sL_ReTest2:
- mes "Hmph, you want to try again?";
- next;
- mes "[Raul Expagarus]";
- mes "How can you hate a peaceful life so much?";
- next;
- mes "[Raul Expagarus]";
- mes "Be that way! If you miss one question, you fail! What do you say!?";
- emotion e_pif;
- next;
- menu "I want to live in peace..........",M_0a, "I want to try again.",M_0b;
-
- M_0a:
- mes "[Raul Expagarus]";
- mes "Good choice, cough cough. Being a Wizard is a difficult job, and magic is not meant to be used by mere mortals.........";
- next;
- mes "[Raul Expagarus]";
- mes "Go down the tower and don't look back. Use the magic you have now and live a peaceful life.";
- close;
-
- M_0b:
- mes "[Raul Expagarus]";
- mes "Hmph, we'll see how GREAT you do.";
- next;
- mes "[Raul Expagarus]";
- mes "Lets start the test! If you miss one question, you're screwed! HA!";
- emotion e_gg;
- next;
- mes "[Raul Expagarus]";
- mes "10 questions, get them right! I won't tell you the correct answer for the ones you miss.";
- next;
- set @SCORE,0;
- set @temp,rand(0,2);
- if(@temp == 1) goto R_1;
- if(@temp == 2) goto R_2;
-
- //Spell Quiz
- R_0:
- mes "[Raul Expagarus]";
- mes "Cough, here are the questions!";
- next;
- mes "[Raul Expagarus]";
- mes "1. Which of the following is not";
- mes "necessary to learn Fire Wall?";
- next;
- menu "Fire Bolt Lv 4",sM0_0b, "Fire Ball Lv 5",sM0_0b, "Sight Lv 1",sM0_0b, "Napalm Beat Lv 4",sM0_0a;
-
- sM0_0a:
- set @SCORE, @SCORE + 10;
-
- sM0_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Regardless of it's previous";
- mes "attribute. What does the monster's";
- mes "attribute change to when you cast";
- mes "Frost Diver on it?";
- next;
- menu "Water",sM0_1a, "Earth",sM0_1b, "Fire",sM0_1b, "Wind",sM0_1b;
-
- sM0_1a:
- set @SCORE, @SCORE + 10;
-
- sM0_1b:
-
- mes "[Raul Expagarus]";
- mes "3. When you completely master";
- mes "Napalm Beat, what is the ratio of";
- mes "the increased MATK using that";
- mes "spell?";
- next;
- menu "1.6 times",sM0_2b, "1.7 times",sM0_2a, "2 times",sM0_2b, "20 times",sM0_2b;
-
- sM0_2a:
- set @SCORE, @SCORE + 10;
-
- sM0_2b:
-
- mes "[Raul Expagarus]";
- mes "4. What item do you need when";
- mes "casting Stone Curse?";
- next;
- menu "Red Blood",sM0_3b, "Blue Gemstone",sM0_3b, "Yellow Gemstone",sM0_3b, "Red Gemstone",sM0_3a;
-
- sM0_3a:
- set @SCORE, @SCORE + 10;
-
- sM0_3b:
-
- mes "[Raul Expagarus]";
- mes "5. Which of the following is not";
- mes "required to master Safety Wall?";
- next;
- menu "Napalm Beat Lv 4",sM0_4b, "Soul Strike Lv 5",sM0_4b, "SP Recovery Lv 6",sM0_4a, "Safety Wall Lv 7",sM0_4b;
-
- sM0_4a:
- set @SCORE, @SCORE + 10;
-
- sM0_4b:
-
- mes "[Raul Expagarus]";
- mes "6. Without the INT bonus, what";
- mes "amount of SP is recovered every 10";
- mes "seconds when you have learned";
- mes "Increase SP Recovery Lv 7?";
- next;
- menu "14",sM0_5b, "21",sM0_5a, "28",sM0_5b, "35",sM0_5b;
-
- sM0_5a:
- set @SCORE, @SCORE + 10;
-
- sM0_5b:
-
- mes "[Raul Expagarus]";
- mes "7. Using Energy Coat, when you have";
- mes "50% of your SP remaining, how much";
- mes "SP is used when hit, and what";
- mes "percentage is damage reduced by?";
- next;
- menu "Damage 18% SP1.5%",sM0_6b, "Damage 18% SP2%",sM0_6a, "Damage 24% SP1.5%",sM0_6b, "Damage 24% SP2%",sM0_6b;
-
- sM0_6a:
- set @SCORE, @SCORE + 10;
-
- sM0_6b:
-
- mes "[Raul Expagarus]";
- mes "8. How much SP is consumed and how";
- mes "many times can you avoid attacks";
- mes "when using Safety Wall Lv 6?";
- next;
- menu "SP 40, 6hits",sM0_7b, "SP 35, 6hits",sM0_7b, "SP 40, 7hits",sM0_7b, "SP 35, 7hits",sM0_7a;
-
- sM0_7a:
- set @SCORE, @SCORE + 10;
-
- sM0_7b:
-
- mes "[Raul Expagarus]";
- mes "9. How much SP is needed when using";
- mes "Lv 10 Thunderstorm?";
- next;
- menu "84",sM0_8b, "74",sM0_8a, "64",sM0_8b, "54",sM0_8b;
-
- sM0_8a:
- set @SCORE, @SCORE + 10;
-
- sM0_8b:
-
- mes "[Raul Expagarus]";
- mes "10. Which skill is most useful";
- mes "training in the Byalan Dungeon?";
- next;
- menu "Lightning Bolt",sM0_9a, "Fire Bolt",sM0_9b, "Ice Bolt",sM0_9b, "Sight",sM0_9b;
-
- sM0_9a:
- set @SCORE, @SCORE + 10;
-
- sM0_9b:
- goto L_Cont0;
-
- //Monster Quiz
- R_1:
- mes "[Raul Expagarus]";
- mes "1. Which monster can you obtain a";
- mes "slotted Guard from?";
- next;
- menu "Thief Bug",sM1_0b, "Peco Peco",sM1_0b, "Pupa",sM1_0a, "Kobold (Hammer)",sM1_0b;
-
- sM1_0a:
- set @SCORE, @SCORE + 10;
-
- sM1_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Which of the following is the";
- mes "easiest monster for a low level";
- mes "Mage to hunt?";
- next;
- menu "Flora",sM1_1a, "Gierth",sM1_1b, "Golem",sM1_1b, "Myst",sM1_1b;
-
- sM1_1a:
- set @SCORE, @SCORE + 10;
-
- sM1_1b:
-
- mes "[Raul Expagarus]";
- mes "3. Which monster will not be";
- mes "affected by Stone Curse?";
- next;
- menu "Elder Willow",sM1_2b, "Evil Druid",sM1_2a, "Magnolia",sM1_2b, "Marc",sM1_2b;
-
- sM1_2a:
- set @SCORE, @SCORE + 10;
-
- sM1_2b:
-
- mes "[Raul Expagarus]";
- mes "4. When attacking a Lv 3 water";
- mes "attribute monster with a wind";
- mes "attribute weapon, what is the";
- mes "damage percentage?";
- next;
- menu "125%",sM1_3b, "150%",sM1_3b, "175%",sM1_3b, "200%",sM1_3a;
-
- sM1_3a:
- set @SCORE, @SCORE + 10;
-
- sM1_3b:
-
- mes "[Raul Expagarus]";
- mes "5. If a Baby Desert Wolf and a";
- mes "Familiar fought, which one would";
- mes "win?";
- next;
- menu "Baby Desert Wolf",sM1_4a, "Familiar",sM1_4b, "Neither",sM1_4b, "I don't know",sM1_4b;
-
- sM1_4a:
- set @SCORE, @SCORE + 10;
-
- sM1_4b:
-
- mes "[Raul Expagarus]";
- mes "6. Which of the following cannot be";
- mes "a Cute Pet?";
- next;
- menu "Poporing",sM1_5b, "Roda Frog",sM1_5a, "Smokie",sM1_5b, "Poison Spore",sM1_5b;
-
- sM1_5a:
- set @SCORE, @SCORE + 10;
-
- sM1_5b:
-
- mes "[Raul Expagarus]";
- mes "7. Choose the monster that is weak";
- mes "against a fire attribute attack.";
- next;
- menu "Dagger Goblin",sM1_6b, "Mace Goblin",sM1_6b, "Morningstar Goblin",sM1_6b, "Hammer Goblin",sM1_6a;
-
- sM1_6a:
- set @SCORE, @SCORE + 10;
-
- sM1_6b:
-
- mes "[Raul Expagarus]";
- mes "8. Which of the following monsters";
- mes "has the highest defence?";
- next;
- menu "Horn",sM1_7b, "Chonchon",sM1_7b, "Andre",sM1_7b, "Caramel",sM1_7a;
-
- sM1_7a:
- set @SCORE, @SCORE + 10;
-
- sM1_7b:
-
- mes "[Raul Expagarus]";
- mes "9. Choose the monster that's a";
- mes "different species.";
- next;
- menu "Poring",sM1_8b, "Mastering",sM1_8b, "Ghostring",sM1_8a, "Spore",sM1_8b;
-
- sM1_8a:
- set @SCORE, @SCORE + 10;
-
- sM1_8b:
-
- mes "[Raul Expagarus]";
- mes "10. Which of the following is not";
- mes "an Undead monster?";
- next;
- menu "Drake",sM1_9b, "Megalodon",sM1_9b, "Deviace",sM1_9a, "Khalitzburg",sM1_9b;
-
- sM1_9a:
- set @SCORE, @SCORE + 10;
-
- sM1_9b:
- goto L_Cont0;
-
- //Wizard Quiz
- R_2:
- mes "[Raul Expagarus]";
- mes "1. Which stat is most important";
- mes "for a Mage?";
- next;
- menu "INT",sM2_0a, "AGI",sM2_0b, "DEX",sM2_0b, "VIT",sM2_0b;
-
- sM2_0a:
- set @SCORE, @SCORE + 10;
-
- sM2_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Which attribute does not have a";
- mes "'Bolt' type attack?";
- next;
- menu "Water",sM2_1b, "Earth",sM2_1a, "Fire",sM2_1b, "Wind",sM2_1b;
-
- sM2_1a:
- set @SCORE, @SCORE + 10;
-
- sM2_1b:
-
- mes "[Raul Expagarus]";
- mes "3. Choose the one that does not";
- mes "relate to a mage.";
- next;
- menu "Weak physical strength.",sM2_2b, "Attacks at a distance.",sM2_2b, "Good at selling stuff.",sM2_2a, "Magic Defense is high.",sM2_2b;
-
- sM2_2a:
- set @SCORE, @SCORE + 10;
-
- sM2_2b:
-
- mes "[Raul Expagarus]";
- mes "4. Which town is the home of the";
- mes "Mages?";
- next;
- menu "Prontera",sM2_3b, "Morroc",sM2_3b, "Alberta",sM2_3b, "Geffen",sM2_3a;
-
- sM2_3a:
- set @SCORE, @SCORE + 10;
-
- sM2_3b:
-
- mes "[Raul Expagarus]";
- mes "5. Which of the following cards has?";
- mes "nothing to do with INT?";
- next;
- menu "Andre Larva Card",sM2_4b, "Soldier Andre Card",sM2_4a, "Baby Desert Wolf Card",sM2_4b, "Elder Willow Card",sM2_4b;
-
- sM2_4a:
- set @SCORE, @SCORE + 10;
-
- sM2_4b:
-
- mes "[Raul Expagarus]";
- mes "6. What is the Mage good at";
- mes "compared to other job classes?";
- next;
- menu "Exceptional Vocal Ability",sM2_5b, "Exceptional Acting Ability",sM2_5b, "Exceptional Dance Skills",sM2_5b, "Exceptional Magic Skills",sM2_5a;
-
- sM2_5a:
- set @SCORE, @SCORE + 10;
-
- sM2_5b:
-
- mes "[Raul Expagarus]";
- mes "7. What is the INT bonus at Job Lv";
- mes "40 for a mage?";
- next;
- menu "8",sM2_6b, "7",sM2_6b, "6",sM2_6b, "5",sM2_6a;
-
- sM2_6a:
- set @SCORE, @SCORE + 10;
-
- sM2_6b:
-
- mes "[Raul Expagarus]";
- mes "8. Which item can't be equipped by mages?";
- next;
- menu "Knife",sM2_7b, "Cap",sM2_7a, "Sandals",sM2_7b, "Eye of Dullahan",sM2_7b;
-
- sM2_7a:
- set @SCORE, @SCORE + 10;
-
- sM2_7b:
-
- mes "[Raul Expagarus]";
- mes "9. Which of the following is the";
- mes "catalyst when making the Mage test";
- mes "solution 3?";
- next;
- menu "Blue Gemstone",sM2_8a, "Red Gemstone",sM2_8b, "Yellow Gemstone",sM2_8b, "Red Blood",sM2_8b;
-
- sM2_8a:
- set @SCORE, @SCORE + 10;
-
- sM2_8b:
-
- mes "[Raul Expagarus]";
- mes "10. Which card is irrelevant to";
- mes "magic?";
- next;
- menu "Marduk Card",sM2_9b, "Magnolia Card",sM2_9a, "Willow Card",sM2_9b, "Maya Card",sM2_9b;
-
- sM2_9a:
- set @SCORE, @SCORE + 10;
-
- sM2_9b:
-
-
- L_Cont0:
- mes "[Raul Expagarus]";
- mes "Well that's the end of the test. When you get some time afterwards, go get something to eat okay.";
- next;
- mes "[Raul Expagarus]";
- mes "Anyway, here is your score: ^ff0000"+@SCORE+"^000000 points.";
- next;
- mes "[Raul Expagarus]";
- if(@SCORE == 100) goto sL_Pass100;
- if(@SCORE == 90) goto sL_Pass90;
-
- sL_Failed:
- set WIZ_Q2, 1;
- mes "Hmf... You failed, go study some more.";
- next;
- mes "[Raul Expagarus]";
- mes "You're a long way away. With that low of an intelligence, you have no chance of surviving as a wizard.";
- close;
-
- sL_Pass90:
- set WIZ_Q, 3;
- set WIZ_Q2, 0;
- mes "Hmm, you've missed one question, but I'll let you pass.";
- next;
- mes "[Raul Expagarus]";
- mes "Don't relax yet! There is still a 3rd test left. While we prepare for the next test, sit and rest a bit.";
- close;
-
- sL_Pass100:
- set WIZ_Q, 3;
- set WIZ_Q2, 0;
- mes "Wonderful! You've passed the 2nd test.";
- next;
- mes "[Raul Expagarus]";
- mes "Don't relax yet! There is still a 3rd test left. While we prepare for the next test, sit and rest a bit.";
- close;
-
-
- L_Test3:
- if(WIZ_Q2 == 1) goto sL_ReTest3;
- mes "Got some rest? Good. Now, let's start the last test.";
- next;
- mes "[Raul Expagarus]";
- mes "I'll make a quick explanation of the test, want to hear it?";
- next;
- menu "No thank you.",M_1a, "Please go on",M_1b;
-
- M_1a:
- mes "[Raul Expagarus]";
- mes "Ignorant fool! Fine, go die if you wish! Your corpse will be left as food for the monsters.";
- emotion e_omg;
- next;
- mes "[Raul Expagarus]";
- mes "I'll send you now... By the way, have fun getting slaughtered!";
- next;
- savepoint "gef_tower.gat",106,29;
- warp "job_wiz.gat",57,154;
- end;
-
- M_1b:
- mes "[Raul Expagarus]";
- mes "Good choice. Listen carefully.";
- next;
- mes "[Raul Expagarus]";
- mes "The is a test of your ability to fight monsters of varying elemental properites.";
- mes "There will be 3 different rooms, each containing monsters of a different elemental property.";
- next;
- mes "[Raul Expagarus]";
- mes "There will be the Room of Water which will have monsters of the water property, followed by the ";
- mes "Room of Earth with earth property monsters, and finally the Room of Fire with fire property monsters.";
- next;
- mes "[Raul Expagarus]";
- mes "You will have 3 minutes for each room. You must kill all of the monsters in the room to be able to advance to the next room.";
- next;
- mes "[Raul Expagarus]";
- mes "If you use that right spells you should be able to finish the test rather easily. That's all there is to it.";
- next;
- mes "[Raul Expagarus]";
- mes "You look a little frightened.... give up now and you can return to town.....";
- next;
- menu "I have no fear! Give me the test!",sM_a, "... tooo scaaarryy... lemme go home(*sob*sob*)",sM_b;
-
- sM_a:
- mes "[Raul Expagarus]";
- mes "Kid, you have courage. We'll start right away!";
- next;
- set WIZ_Q2, 1;
- savepoint "gef_tower.gat",106,29;
- warp "job_wiz.gat",57,154;
- end;
-
- sM_b:
- mes "[Raul Expagarus]";
- mes "Good choice. Have a nice peaceful life!";
- warp "geffen.gat",120,110;
- end;
-
- sL_ReTest3:
- mes "You want to take the test AGAIN!? You love magic THAT much!?";
- emotion e_what;
- next;
- mes "[Raul Expagarus]";
- mes "You failed last time, so it's time for a quiz! If you don't want to take it, TOO BAD!.";
- next;
- mes "[Raul Expagarus]";
- mes "Let's start.";
- next;
- set @SCORE, 0;
-
- mes "[Raul Expagarus]";
- mes "1. Choose the monster with a";
- mes "different attribute than the";
- mes "others.";
- next;
- menu "Mantis",sM_0b, "Cornutus",sM_0a, "Giearth",sM_0b, "Caramel",sM_0b;
-
- sM_0a:
- set @SCORE, @SCORE + 20;
-
- sM_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Choose the monster that is not a";
- mes "looting one.";
- next;
- menu "Yoyo",sM_1b, "Magnolia",sM_1b, "Metaller",sM_1b, "Zerom",sM_1a;
-
- sM_1a:
- set @SCORE, @SCORE + 20;
-
- sM_1b:
-
- mes "[Raul Expagarus]";
- mes "3. Which of these monsters does not";
- mes "recognize casting?";
- next;
- menu "Marina",sM_2a, "Vitata",sM_2b, "Scorpion",sM_2b, "Giearth",sM_2b;
-
- sM_2a:
- set @SCORE, @SCORE + 20;
-
- sM_2b:
-
- mes "[Raul Expagarus]";
- mes "4. Chose the spell that would be";
- mes "efficient against a Marine Sphere.";
- next;
- menu "Cold Bolt",sM_3b, "Fire Bolt",sM_3b, "Lightning Bolt",sM_3a, "Stone Curse",sM_3b;
-
- sM_3a:
- set @SCORE, @SCORE + 20;
-
- sM_3b:
-
- mes "[Raul Expagarus]";
- mes "5. Choose the monster that can";
- mes "move.";
- next;
- menu "Hydra",sM_4b, "Mandragora",sM_4b, "Greatest General",sM_4b, "Frilldora",sM_4a;
-
- sM_4a:
- set @SCORE, @SCORE + 20;
-
- sM_4b:
-
- mes "[Raul Expagarus]";
- mes "Your score is ^ff0000" +@SCORE+ "^000000 pts.";
- next;
- mes "[Raul Expagarus]";
- if (@SCORE >= 80) goto sL_Passed3;
-
- sL_Failed3:
- mes "You Failed! Go study some more!";
- next;
- mes "[Raul Expagarus]";
- mes "You aren't fit to be a wizard, why do you think you failed!?";
- close;
-
- sL_Passed3:
- if (@SCORE == 100) mes "If you're so smart, why couldn't you pass the test the first time?";
- if (@SCORE == 80) mes "Kehe, almost perfect. I'll let you try again.";
- next;
- menu "Let's start!",M_2a, "Explain the test again please.",M_1b;
-
- M_2a:
- mes "[Raul Expagarus]";
- mes "I won't help you even if you die this time. Don't come crying to me if you fail again.... hehe.";
- next;
- percentheal 100,100;
- mes "[Raul Expagarus]";
- mes "I'll send you to the arena now. Have fun getting your butt whooped!";
- next;
- savepoint "gef_tower.gat",106,29;
- warp "job_wiz.gat",55,156;
- end;
-}
-
-
-//<====================================================== Test Arena ========================================================>\\
-// Test Guide ---------------------------------------------------------------------------------
-job_wiz.gat,50,165,4 script Wizard Test Guide::WzTG 123,{
- mes "[Test Guide]";
- mes "Welcome. I will be your guide for the Wizard Test.";
- next;
- menu "I would like to take the test.",M_0, "I would like to leave.",M_1;
-
- M_0:
- mes "[Test Guide]";
- mes "As you have been told you will have 3 minutes to finish each portion of the test.";
- mes "I will periodically announce how much time you have left for each room on a minute by minute basis.";
- next;
- mes "[Test Guide]";
- mes "Please enter the 'Wizard Test Waiting Room' when you are ready to take the test.";
- mes "When the testing room is ready you will be automatically warped there and the exam will begin.";
- next;
- mes "[Test Guide]";
- mes "Good luck!";
- close;
- M_1:
- mes "[Test Guide]";
- mes "I see. I will send you back.";
- next;
- warp "gef_tower.gat",106, 35;
- end;
-
-OnInit:
- waitingroom "Wizard Test Waiting Room",8,"WzTG::OnStart",1;
- end;
-
-OnStart:
- set $@WzUsers, getareausers("job_wiz.gat", 98, 154, 129, 185); // get user count for first lvl
- set $@WzUsers, $@WzUsers + getareausers("job_wiz.gat", 100, 82, 131, 113); // get user count for second lvl + first lvl
- set $@WzUsers, $@WzUsers + getareausers("job_wiz.gat", 30, 82, 61, 113); // get user count for third lvl + second lvl + first lvl
- if ($@WzUsers > 0) end;
-
- if ((getwaitingroomstate(33)) == 0) end; // finds out if there is anyone in the waiting room
- disablenpc "waterwrp"; //disables the warps
- disablenpc "waterwarpW";
- disablenpc "waterwarpN";
- disablenpc "waterwarpS";
- disablenpc "earthwrp";
- disablenpc "earthwarpW";
- disablenpc "earthwarpN";
- disablenpc "earthwarpS";
- disablenpc "firewrp";
- disablenpc "firewarpN";
- disablenpc "firewarpW";
- disablenpc "firewarpS";
- killmonsterall "job_wiz.gat"; //makes sure there are no left over mobs from other testers
- warpwaitingpc "job_wiz.gat",114,169;
- donpcevent "WaterRm::OnStart";
- end;
-}
-
-// Room of Water -----------------------------------------------------------------------------
-job_wiz.gat,1,1,1 script WaterRm -1,{
-
-OnStart:
- set $@WzRm, 1; // used to determine which map area(room) to make time announcements in
- set $@WzMOB, 8; //used as a counter for the monsters that are summoned
- monster "job_wiz.gat",109,174,"Phen",1158,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",118,174,"Kukre",1070,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",98,170,"Kukre",1070,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",109,165,"Vadon",1066,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",118,165,"Cornutus",1067,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",101,157,"Marina",1141,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",126,157,"Marin",1242,1,"WaterRm::OnMyMobDead1";
- monster "job_wiz.gat",129,170,"Obeaune",1044,1,"WaterRm::OnMyMobDead1";
- initnpctimer "TimerWz";
- end;
-
-OnMyMobDead1: //when a monster dies this portion of script is run
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- set $@WzMOB, 0;
- addtimer 2000, "WaterRm::OnTimer2000";
- end;
-
-OnTimer2000:
- set $@WzMOB, 5;
- areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: You must now defeat the door gaurds! Hurry!",8;
- monster "job_wiz.gat",114,169,"Marine Sphere",1142,1,"WaterRm::OnMyMobDead2";
- monster "job_wiz.gat",112,169,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
- monster "job_wiz.gat",116,169,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
- monster "job_wiz.gat",114,171,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
- monster "job_wiz.gat",114,167,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
- setnpctimer 120000, "TimerWz";
- startnpctimer "TimerWz";
- end;
-
-OnMyMobDead2:
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- set $@WzMOB, 0;
- areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: Well done. You have completed the Room of Water. Get ready for the Room of Earth.",8;
- percentheal 100,100;
- enablenpc "waterwrp";
- enablenpc "waterwarpW";
- enablenpc "waterwarpN";
- enablenpc "waterwarpS";
- initnpctimer "waterwrp"; // warps the player after 30 secs even if they don't enter the warps
- end;
-}
-
-// Room of Earth -----------------------------------------------------------------------------------------------
-job_wiz.gat,1,1,1 script EarthRm -1,{
-
-OnStart:
- set $@WzRm, 2;
- set $@WzMOB, 10;
- monster "job_wiz.gat",111,102,"Yoyo",1057,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",120,102, "Deniro",1105,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",111,102, "Caramel",1103,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",120,102,"Hode",1127,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",111,93,"Savage",1166,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",120,93,"Giearth",1121,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",107,98,"Bigfoot",1160,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",124,98,"Orc Warrior",1023,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",104,86,"Vitata",1176,1,"EarthRm::OnMyMobDead1";
- monster "job_wiz.gat",127,86,"Mantis",1139,1,"EarthRm::OnMyMobDead1";
- initnpctimer "TimerWz";
- end;
-
-OnMyMobDead1:
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- addtimer 2000, "EarthRm::OnTimer2000";
- set $@WzMOB, 0;
- end;
-
-OnTimer2000:
- set $@WzMOB, 7;
- areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: You now must defeat the door gaurds! Hurry!.",8;
- monster "job_wiz.gat",116,97,"Flora",1118,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",114,95,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",118,95,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",114,99,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",118,99,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",116,94,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- monster "job_wiz.gat",116,100,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
- setnpctimer 120000, "TimerWz";
- startnpctimer "TimerWz";
- end;
-
-OnMyMobDead2:
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- set $@WzMOB, 0;
- areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: Well done. You have completed the Room of Earth. Get ready for the Room of Fire.",8;
- percentheal 100,100;
- enablenpc "earthwrp";
- enablenpc "earthwarpN";
- enablenpc "earthwarpW";
- enablenpc "earthwarpS";
- initnpctimer "earthwrp";
- end;
-}
-
-// Room of Fire ------------------------------------------------------------------------------------------------------------
-job_wiz.gat,1,1,1 script FireRm -1,{
-
-OnStart:
- set $@WzRm, 3;
- set $@WzMOB, 7;
- monster "job_wiz.gat",58,110,"Zerom",1178,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",33,110,"Flail Goblin",1123,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",40,103,"Scorpion",1001,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",51,103,"Frilldora",1119,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",40,92,"Peco Peco",1019,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",51,92,"Elder Willow",1033,1,"FireRm::OnMyMobDead1";
- monster "job_wiz.gat",37,89,"Metaller",1058,1,"FireRm::OnMyMobDead1";
- initnpctimer "TimerWz";
- end;
-
-OnMyMobDead1:
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- addtimer 2000, "FireRm::OnTimer2000";
- set $@WzMOB, 0;
- end;
-
-OnTimer2000:
- set $@WzMOB, 3;
- areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: You now must defeat the door gaurds! Hurry!.",8;
- monster "job_wiz.gat",44,99,"Greatest General",1277,1,"FireRm::OnMyMobDead2";
- monster "job_wiz.gat",43,99,"Horong",1129,1,"FireRm::OnMyMobDead2";
- monster "job_wiz.gat",45,99,"Horong",1129,1,"FireRm::OnMyMobDead2";
- setnpctimer 120000, "TimerWz";
- startnpctimer "TimerWz";
- end;
-
-OnMyMobDead2:
- set $@WzMOB, $@WzMOB - 1;
- if ($@WzMOB > 0) end;
-
- stopnpctimer "TimerWz";
- set $@WzMOB, 0;
- set WIZ_Q, 4;
- set WIZ_Q2, 0;
- areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: Well done. You have completed the Room of Fire and the entire test.",0;
- enablenpc "firewrp";
- enablenpc "firewarpN";
- enablenpc "firewarpW";
- enablenpc "firewarpS";
- initnpctimer "firewrp";
- end;
-}
-
-
-// Timer -----------------------------------------------------------------------------------------------
-job_wiz.gat,1,1,1 script TimerWz -1,{
-
-OnTimer1000:
- if($@WzRm==1) areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: Room of Water, testing will begin.",8;
- if($@WzRm==2) areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: Room of Earth, testing will begin.",8;
- if($@WzRm==3) areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: Room of Fire, testing will begin.",8;
- end;
-OnTimer4000:
- set $@WzTime$, "You have 3 minutes to defeat all of the monsters in this room starting now!";
- donpcevent "WzTG::OnStart"; //checks to see if anyone is still in the room, in case of logout or KO
- callsub AnnounceWz;
-OnTimer34000:
- donpcevent "WzTG::OnStart";
- end;
-OnTimer64000:
- set $@WzTime$, "You have 2 minutes left!";
- donpcevent "WzTG::OnStart";
- callsub AnnounceWz;
-OnTimer94000:
- donpcevent "WzTG::OnStart";
- end;
-OnTimer124000:
- set $@WzTime$, "You have 1 minute left!";
- donpcevent "WzTG::OnStart";
- callsub AnnounceWz;
-OnTimer154000:
- set $@WzTime$, "You have 30 seconds left!";
- donpcevent "WzTG::OnStart";
- callsub AnnounceWz;
-OnTimer174000:
- set $@WzTime$, "You have 10 seconds left!";
- callsub AnnounceWz;
-OnTimer184000:
- set $@WzTime$, "Time is up. You have failed the test.";
- callsub AnnounceWz;
-OnTimer188000:
- stopnpctimer;
- if($@WzRm==1) areawarp "job_wiz.gat", 98, 154, 129, 185, "gef_tower.gat",106, 35;
- if($@WzRm==2) areawarp "job_wiz.gat", 100, 82, 131, 113, "gef_tower.gat",106, 35;
- if($@WzRm==3) areawarp "job_wiz.gat", 30, 82, 61, 113, "gef_tower.gat",106, 35;
- killmonsterall "job_wiz.gat";
- donpcevent "WzTG::OnStart";
- end;
-
-AnnounceWz:
- if($@WzRm==1) areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: "+$@WzTime$+".",8;
- if($@WzRm==2) areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: "+$@WzTime$+".",8;
- if($@WzRm==3) areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: "+$@WzTime$+".",8;
- end;
-}
-
-
-// Warps ------------------------------------------------------------------------------------------
-
-// Water
-job_wiz.gat,129,169,1 script waterwarpE::waterwrp 45,1,1,{
-
-OnTimer30000:
- stopnpctimer "waterwrp";
- areawarp "job_wiz.gat", 98, 154, 129, 185, "job_wiz.gat",116,98;
- donpcevent "EarthRm::OnStart";
- end;
-}
-job_wiz.gat,98,169,1 duplicate(waterwrp) waterwarpW 45,1,1
-job_wiz.gat,114,185,1 duplicate(waterwrp) waterwarpN 45,1,1
-job_wiz.gat,114,154,1 duplicate(waterwrp) waterwarpS 45,1,1
-
-
-// Earth
-job_wiz.gat,131,98,1 script earthwarpE::earthwrp 45,1,1,{
-
-OnTimer30000:
- stopnpctimer "earthwrp";
- areawarp "job_wiz.gat", 100, 82, 131, 113, "job_wiz.gat",47,98;
- donpcevent "FireRm::OnStart";
- end;
-}
-job_wiz.gat,100,98,1 duplicate(earthwrp) earthwarpW 45,1,1
-job_wiz.gat,116,82,1 duplicate(earthwrp) earthwarpN 45,1,1
-job_wiz.gat,116,113,1 duplicate(earthwrp) earthwarpS 45,1,1
-
-
-// Fire
-job_wiz.gat,61,97,1 script firewarpE::firewrp 45,1,1,{
-
-OnTimer30000:
- stopnpctimer "firewrp";
- areawarp "job_wiz.gat", 30, 82, 61, 113, "gef_tower.gat",106,35;
- donpcevent "WzTG::OnStart";
- end;
-}
-job_wiz.gat,30,97,1 duplicate(firewrp) firewarpW 45,1,1
-job_wiz.gat,46,113,1 duplicate(firewrp) firewarpN 45,1,1
-job_wiz.gat,46,82,1 duplicate(firewrp) firewarpS 45,1,1
-
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_wiz.gat mapflag nomemo
-job_wiz.gat mapflag noteleport
-job_wiz.gat mapflag nosave SavePoint
-job_wiz.gat mapflag nopenalty
-job_wiz.gat mapflag nobranch
-job_wiz.gat mapflag noexp
-job_wiz.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Wizard Job Quest
+//===== By: ==================================================
+//= (Aegis) Translated by yoshiki
+//= converted by kobra_k88
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Wizard job quest converted from aegis script, plus my own RO screenies.
+//===== Additional Comments: =================================
+//= 1.1 Now using the initnpctimer command, donpcevent,
+//= and new waitingroom event commands. No more addtimer spamming.
+//= No longer have to talk to the npc to take the test. Just enter the chat room.
+//= 1.2 Changed global variable names to unique ones.
+//= 1.2a Rollback from the wrong Kashy's fix
+//= 1.2b Fixed issue with duplicating monsters thx to Bison.[kobra_k88]
+//= 1.2c changed one Horong to Frilldora (now 3rd room contains 1 agressive mob.)
+//= 1.2d more simplified fire room - removed agressive Desert Wolf [Lupus]
+//= 1.3 Added Baby Class support [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 1.7 Replaced 2 Hodes with 2 Horong's (according to the official guide) [Lupus]
+//= 1.8 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 2.1 Changed numbers to constants. [Vicious]
+//= 2.2 Merged back JFunc [Lupus]
+//============================================================
+
+
+//<=================== Some dog =========================>
+gef_tower.gat,107,35,5 script Some Dog 81,{
+ callfunc "F_BlockHigh",Job_Mage_High,"High Mage",Job_High_Wizard,"High Wizard","Dog";
+ mes "[Dog]";
+ if(baseJob == Job_Mage) goto L_JobMage;
+ if(baseClass == Job_Mage){
+ mes "Ah! High level magic users, welcome. It's always nice to see experienced magic users around here.";
+ mes "Actually it's nice to see them anywhere! ~Woof!~";
+ close;
+ }
+ if(baseClass == Job_Acolyte){
+ mes "Eeek! What's a holy type person doing up here? I thought you people didn't like magic....";
+ mes "You religious types are always calling it the 'dark arts'......... ooooh scary!!!...... ~grrr!~WOOF!~";
+ close;
+ }
+ mes "Sheesh....... Why would someone who can't even cast a single spell come all the way up here???";
+ next;
+ mes "[Dog]";
+ mes "If you're that bored, do the world a favor and climb to the top of this building from the outside, then do some acrobatics....";
+ emotion e_pif;
+ next;
+ mes "[Dog]";
+ mes "~WOOF~ Get lost! I don't have time for people like you!!";
+ emotion e_go;
+ close;
+
+L_JobMage:
+ mes "[Dog]";
+ mes "Ah... I know what you're about to say.... You want to become a Wizard right?";
+ next;
+ mes "[Dog]";
+ mes "Speak with Catherine. She'll help you out.";
+ next;
+ mes "[Dog]";
+ mes "If you want to know more about the job change process for Wizards, I can be of help.";
+ next;
+ menu "..................",M_0, "A dog is talking to me......",M_1;
+
+ M_0:
+ mes "[Dog]";
+ mes "~Woof~ What is it? Why are you looking at me like that?? Is this the first time you've seen a dog talk?";
+ emotion e_what;
+ mes "[Dog]";
+ mes "~Woof~ I suppose it's not that common to see a talking dog..... ~Woof~..... Yeah, it is a rare site actually.....";
+ next;
+ mes "[Dog]";
+ mes "~GRRRR!!~.... Hey! Stop GAWKING at me for goodness sake!! ~WOOOF~";
+ emotion e_an;
+ next;
+
+ L_Cont:
+ mes "[Dog]";
+ mes "My name is Maria Splodofska. Just call me Maria. I'm assisting candidates for the Wizard class.";
+ next;
+ mes "[Maria]";
+ mes "~Woof~ You see, the reason I became a dog was.... I was helping my boyfriend with his experiment in preperation for his Final.";
+ mes "He is studying for a Magic Degree. Well, before I knew what happened he accidentally turned me into a dog.....";
+ next;
+ mes "[Maria]";
+ mes "~Grrrrr~ In a couple of months the chemicals should wear off and I should return to normal. Well theoretically speaking anyhow.";
+ next;
+ mes "[Maria]";
+ mes "Uh, anyways..... where were we?";
+ emotion e_hmm;
+ next;
+ mes "[Maria]";
+ mes "Like I said before, if you want to become a Wizard you must first speak with Catherine.";
+ mes "She just recently became a Wizard so she should be a great help.";
+ next;
+ mes "[Maria]";
+ mes "I can tell you more about the job changing process, but I wouldn't want to take up anymore of your time.";
+ mes "That is unless, you want me to go on about what's in store for Wizards to be?.........";
+ next;
+ menu "Yes, please continue.",sM_0, "No, it's ok.",sM_1, "A talking dog......",sM_2;
+
+ sM_0:
+ mes "[Maria]";
+ mes "Ok then. Let me explain the process for becoming a Wizard to you....";
+ next;
+ mes "[Maria]";
+ mes "There are 3 Tests in the Wizard job change process. The ^5555FF1st Test^000000 will require you to collect a number of ^FF5555magic items^000000.";
+ next;
+ mes "[Maria]";
+ mes "Catherine will give you that test. She will ask to you collect either a variety of ^5555FFGemstones^000000, or ^5555FFElemental Ores^000000.";
+ next;
+ mes "[Maria]";
+ mes "The ^5555FF2nd Test^000000 will be administered by the, ever gloomy Raul, in the corner over there.";
+ mes "It is a multiple choice Q&A exam about the different aspects of magic.";
+ next;
+ mes "[Maria]";
+ mes "The exam will consist of 10 questions. If you miss any of those questions you will fail the exam.";
+ next;
+ mes "[Maria]";
+ mes "Raul will also administer the ^5555FF3rd Test^000000. This is the last test and it requires that defeat a series of monsters.";
+ mes "There will be three rooms each filled with monsters of a specific elemental attribute.";
+ next;
+ mes "[Maria]";
+ mes "It is up to you to figure what spells work best on which monsters.";
+ next;
+ mes "[Maria]";
+ mes "Well, that's all I can tell you. Go ahead and apply now.";
+ close;
+ sM_1:
+ mes "[Maria]";
+ mes "Oh, ok. Go ahead and apply and do your best.";
+ close;
+ sM_2:
+ mes "[Maria]";
+ mes "I'M NOT A DOG!!! ~ ARROOOOOOOOOWWWWW!!!! ~";
+ emotion e_an;
+ next;
+ mes "[Maria]";
+ mes "Dang it! I hope you FAIL!! Now go get lost!";
+ emotion e_go;
+ next;
+ warp "gef_dun00.gat",54,23;
+ end;
+ M_1:
+ mes "[Dog]";
+ mes "~WOOF~Woof~woof~ You DON'T have to state the obvious! I KNOW I'm a dog!";
+ emotion e_pif;
+ next;
+ goto L_Cont;
+
+}
+
+
+//<=========================================== Registrar and Examiner Catherine Medichi ==============================================>\\
+gef_tower.gat,111,37,4 script Catherine Medichi 68,{
+ callfunc "F_BlockHigh",26,"High Mage",33,"High Wizard","Catherine Medichi";
+
+ mes "[Catherine Medichi]";
+ if(BaseJob == Job_Mage) goto L_Mage;
+
+ if(BaseJob == Job_Wizard){
+ mes "What do you need fellow Wizard? If it's nothing, please leave...";
+ next;
+ mes "[Catherine Medichi]";
+ if(sex){
+ mes "... Of course, if your here to ask me out... (*giggles*)....";
+ } else {
+ mes "If you get yourself a boyfriend, feel free to drop by and show him off. XD";
+ }
+ emotion e_lv;
+ close;
+ }
+ if(BaseJob == Job_Novice){
+ mes "Awwww, a little novice! How cute! This place is for Wizards only though.";
+ emotion e_lv2;
+ next;
+ mes "[Catherine Medichi]";
+ mes "If you're interested in magic, the ^0000FFMagician's Guild^000000 is the place for you.";
+ close;
+ }
+ mes "Hmm? What brings you all the way up here? If you have nothing to do here, please leave.";
+ mes "This place is for wizards only. =P";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Try not to fall as you go back down....";
+ close;
+
+L_Mage:
+ if(WIZ_Q == 2) goto L_Test2;
+ if(WIZ_Q == 3) goto L_Test3;
+ if(WIZ_Q == 4) goto L_Done;
+ if(WIZ_Q2 > 0) goto L_Test1;
+
+ mes "My name's Catherine Medichi, and I just became a Wizard. Relax, you can call me Catherine.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "What brings you all the way up here? You want to be a wizard, right?";
+ next;
+ menu "Of course!",M_0a, "The requirements",M_0b,"Not really",M_0End;
+
+ M_0a:
+ mes "[Catherine Medichi]";
+ mes "Please fill out this application form first.";
+ next;
+ mes "(you fill out the form and hand it back)";
+ next;
+ if(JobLevel < 40) goto sL_JobLvl;
+ if(JobLevel == 50) goto sL_Job50;
+
+ mes "[Catherine]";
+ mes "Alright ^ff0000"+strcharinfo(0)+"^000000, it looks like you have everything in order.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Now let me tell you about the test. It is divided into 3 parts.";
+ mes "- The 1st part involves the collecting of a number of magical items,";
+ mes "- the 2nd part is a Q&A exam,";
+ mes "- and the 3rd section is our favorite, the field exam.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "People with a job lvl of 50 can skip the first test. They have already worked hard enough.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Now for the first part of the test. This requires the gathering of a number of magic items.";
+ next;
+ set WIZ_Q2, rand(1,2);
+
+ mes "[Catherine Medichi]";
+ mes "The items you need to bring are:";
+ if(WIZ_Q2 == 2) goto R_2;
+
+ R_1:
+ mes "- 10 ^ff0000Red gemstones^000000";
+ mes "- 10 ^0000ffBlue gemstones^000000";
+ mes "- and 10 ^ddcc11Yellow gemstones^000000.";
+ goto L_Cont0;
+
+ R_2:
+ mes "5 ^0000ffCrystal Blues^000000,";
+ mes "5 ^009900Green Lives^000000,";
+ mes "5 ^ff0000Red Bloods^000000,";
+ mes "and 5 ^ddcc11Wind of Verdures^000000.";
+
+ L_Cont0:
+ next;
+ mes "[Catherine Medichi]";
+ mes "This test isn't THAT hard, so get going!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Good luck! I'll be waiting!";
+ set WIZ_Q, 1;
+ close;
+
+ sL_JobLvl:
+ mes "[Catherine Medichi]";
+ mes "Hey, I told you already. You have to have at least job lvl 40.";
+ mes "Don't you remember me telling you that?";
+ close;
+
+ sL_Job50:
+ mes "[Catherine Medichi]";
+ mes "Wow! You're at job level 50! You must have worked really hard! I'm impressed!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Okay, I'll record that you're job 50. You get to skip the first test, but you still got 2 left.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Now, talk to that man in the corner for the test. It's hard, so be careful.";
+ set WIZ_Q, 2;
+ close;
+
+ M_0b:
+ mes "[Catherine Medichi]";
+ mes "Even though many people want to become Wizards, only those with a job level of 40 can qualify.";
+ mes "Anyone with a job level less then that wouldn't have enough magic power to become a Wizard.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Then there is the matter of the Wizard's Test. The test is made up of 3 sections.";
+ mes "Each section focuses on different asspects of Wizardry.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Once you pass the test you'll be a Wizard just like me. Yay!";
+ mes "Unfortunately a lot people have trouble with the test and never quite make it.(*sighs*)";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Maybe you'll have better luck.";
+ close;
+
+ M_0End:
+ mes "[Catherine Medichi]";
+ mes "What? You came up here for nothing!?";
+ emotion e_what;
+ close;
+
+
+ L_Test1:
+ mes "Did you get all of the items? Let's see......";
+ next;
+ mes "[Catherine Medichi]";
+ if(WIZ_Q2 == 1) goto sL_Gems;
+ if(WIZ_Q2 == 2) goto sL_Ores;
+
+ sL_Gems:
+ if (countitem(716)<10 || countitem(717)<10 || countitem(715)<10) goto ssL_NotDone;
+ mes "Great! You've brought everything! The guild will use these well.";
+ next;
+ delitem 716, 10;
+ delitem 717, 10;
+ delitem 715, 10;
+ goto ssL_Done;
+
+ sL_Ores:
+ if (countitem(991)<4 || countitem(993)<4 || countitem(990)<4 || countitem(992)<4) goto ssL_NotDone;
+ mes "Great! You've found them all! The guild will use them well.";
+ next;
+ delitem 991, 5;
+ delitem 993, 5;
+ delitem 990, 5;
+ delitem 992, 5;
+
+ ssL_Done:
+ mes "[Catherine Medichi]";
+ mes "Congrats, you passed the first test.";
+ mes "Don't relax yet, you still got 2 tests left.";
+ emotion e_no1;
+ next;
+ mes "[Catherine Medichi]";
+ mes "Now talk to the man in the corner for the tests.";
+ mes "It's pretty hard, so be carefull.";
+ set WIZ_Q, 2;
+ set WIZ_Q2, 0;
+ close;
+
+ ssL_NotDone:
+ mes "It seems you didn't bring everything that's needed.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "It's hard work to get all the way up here so make sure you have all of the right items okay?";
+ next;
+ mes "[Catherine Medichi]";
+ mes "You need:";
+ if(WIZ_Q2 == 1) goto R_1;
+ if(WIZ_Q2 == 2) goto R_2;
+ close;
+
+ L_Test2:
+ if(WIZ_Q2 == 1)goto sL_Failed2;
+ mes "Hey, did you go talk to the man? No? You can't just become a wizard by getting items.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "There are 2 more tests left. I'll be waiting, so go finish them.";
+ close;
+
+ sL_Failed2:
+ mes "Huh?? You failed the Q&A test!?";
+ emotion e_what;
+ next;
+ mes "[Catherine Medichi]";
+ mes "You want to be a wizard and you can't answer a couple of questions?? Sheesh.";
+ emotion e_swt;
+ next;
+ mes "[Catherine Medichi]";
+ mes "Well, do you want big sis to give you a hint? If you do, go buy me ^0099001 apple juice^000000. I'm a bit thirsty. =P";
+ next;
+ menu "Can I have a hint?",M_1a, "I can pass on my own!",M_1b;
+
+ M_1a:
+ if (countitem(531) < 1) goto sL_NoJuice;
+ delitem 531, 1;
+
+ mes "[Catherine Medichi]";
+ mes "Mmmmmmmmmmmmm, apple juice. ~gulp~gulp~";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Thanks, I'll give you the hint now.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "The man gives you 3 major types of questions, about:";
+ mes "- ^ff0000spells^000000,";
+ mes "- ^ff0000monsters^000000,";
+ mes "- and ^ff0000the caster^000000.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "It's up to him to pick the questions.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Ya know... if he got a hair cut and shaved, he might look cool...";
+ mes "But obviously he wouln't do it....";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Anyways, about his questions on spells, there are obviously some on spells you've learned.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "There are also questions about spells you DON'T know much about, so go ask some Wizards for that info.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "There are also places out there with lots of information about spells, such as www.emperium.org.";
+ mes "You can probably find other sites as well.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "As far as the questions on monsters go, you COULD fight them to learn about them... OR...";
+ next;
+ mes "[Catherine Medichi]";
+ mes "... If I remember correctly, there's a libary in Prontera that has lots of information on monsters.";
+ mes "You could just go there and read about them.";
+ next;
+ mes "[Catherine Medichie]";
+ mes "Now, about the questions about the caster.... You're on your own for this one..";
+ mes "Why? Because YOU ARE the caster!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "If you don't know anything about yourself, how would a stranger like me know?";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Well good luck! Mister Examiner is waiting!";
+ close;
+
+ sL_NoJuice:
+ mes "[Catherine Medichi]";
+ mes "Well, if you want hints, I need apple juice!. Otherwise, you're on your own =P.";
+ close;
+
+ M_1b:
+ mes "[Catherine Medichi]";
+ mes "That's right! Tests are meant to be done alone! That's definatly the way a Wizard should think!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Good luck! Mister Examiner is waiting!";
+ close;
+
+ L_Test3:
+ if(WIZ_Q2 == 1) goto sL_Failed3;
+ mes "He he, I could hear you in there working hard on those questions.";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Good job, only one test left! Finish that and you'll be a wizard!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Good luck! The examiner's waiting!";
+ close;
+
+ sL_Failed3:
+ mes "Why did you come out during the test? I never thought you were that weak...";
+ next;
+ if(sex==1) goto ssL_M3;
+ if(sex==0) goto ssL_F3;
+
+ ssL_M3:
+ mes "[Catherine Medichi]";
+ mes "How could a powerful mage like you get beaten so easily!! Go back in and try harder.";
+ close;
+
+ ssL_F3:
+ mes "[Catherine Medichi]";
+ mes "You can't act all weak, just because you're a girl! If you want to be a wizard, go and pass the test!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "I thought it was hard too, but it wasn't enough to make me quit! You just have to face hardship sometimes!";
+ close;
+
+
+ L_Done:
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Wizard.";
+ if(SkillPoint > 0) close;
+
+ mes "Great! You finished all of the tests! Congrats, congrats, congrats!!";
+ emotion e_no1;
+ next;
+ mes "[Catherine Medichi]";
+ mes "Ack, I'm wasting time, I better change you!";
+ next;
+ callfunc "Job_Change",Job_Wizard;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+
+ mes "[Catherine Medichi]";
+ mes "Now you're a wizard! Act responsibly!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Make sure when you cast a spell, you know exactly what's going to happen!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Don't do stupid things like casting in the middle of town!";
+ mes "It causes lag and magic is supposed to be used on monsters anyways!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Become mightier by partying with others! Oh yea, here's a present!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "(Rustle Rustle)";
+ next;
+ getitem 505, 6;
+ mes "[Catherine Medichi]";
+ mes "Use them wisely. It's a present from me, so you better use them all!";
+ next;
+ mes "[Catherine Medichi]";
+ mes "Well my fellow Wizard, take care and have a great life!";
+ close;
+}
+
+
+//<================================================ Examiner: Raul Expagarus ==================================================>\\
+gef_tower.gat,102,24,3 script Raul Expagarus 735,{
+ mes "[Raul Expagarus]";
+ if(BaseJob == Job_Mage) goto L_Mage;
+ if(BaseJob == Job_Wizard) goto L_Wizard;
+ if(baseClass == Job_Acolyte) goto L_Holy;
+ if(BaseJob == Job_Novice) goto L_Novice;
+L_Other:
+ mes "Ugh, I don't feel good....I feel like I'm trapped in ice........";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Who're you?! Leave!";
+ emotion e_gasp;
+ close;
+L_Novice:
+ mes "What's a little kid like you doing here? Get out!!";
+ emotion e_gasp;
+ next;
+ warp "geffen.gat",120,110;
+ close;
+L_Holy:
+ mes "Leave holy ones!";
+ mes "Magic is considered to be a power that is not from God.......";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Besides, I'm not feeling too good. So Leave now!";
+ close;
+L_Wizard:
+ mes "Cough Cough, what can I do for you? Hmmm... you're a magic user too...";
+ next;
+ mes "[Raul Expagarus]";
+ if(sex==1) goto L_M;
+ if(sex==0) goto L_F;
+
+ L_M:
+ mes "If you're not responsible, you might accidently learn useless spells.";
+ mes "Instead of that, you might want to focus on learning spells you'll be using now.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "In a fight for love, you might become crippled hehe.";
+ close;
+
+ L_F:
+ mes "If you're not responsible, you might accidently learn useless spells.";
+ mes "You should learn a spell with all of your heart or not learn it at all.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "If you don't wish to study like that............... Heh, then go be a housewife.";
+ close;
+
+L_Mage:
+ if(WIZ_Q == 1) goto L_NotRdy;
+ if(WIZ_Q == 2) goto L_Test2;
+ if(WIZ_Q == 3) goto L_Test3;
+ if(WIZ_Q == 4) goto L_Done;
+
+ mes "Cough, I don't have any time to talk.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Sorry, but please leave.";
+ close;
+
+ L_NotRdy:
+ mes "Heh, a wizard trainee eh?!";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You COULD just stay as a mage and live a pretty decent life.....";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Then again, wizards ARE much more high class.....";
+ close;
+
+ L_Done:
+ mes "Congratulations on finishing the final test! You have now finished all of the Wizards tests and are ready to become a Wizard!";
+ emotion e_no1;
+ next;
+ mes "[Raul Expagarus]";
+ mes "Go speak to Catherine to become a Wizard. But be careful! Magic is a powerfull force and can easily destroy you!!";
+ close;
+
+ L_Test2:
+ if(WIZ_Q2 == 1) goto sL_ReTest2;
+
+ mes "I see you've passed the 1st test. My name is Raul Expagarus, I'm your test examiner.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "It's not too late! You can still return to a peaceful life in town if you wish.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You probably have no clue how dangerous it is to use magic.";
+ next;
+ menu "You're right. I quit.",M_0a, "I want to take test!",M_0b;
+
+ sL_ReTest2:
+ mes "Hmph, you want to try again?";
+ next;
+ mes "[Raul Expagarus]";
+ mes "How can you hate a peaceful life so much?";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Be that way! If you miss one question, you fail! What do you say!?";
+ emotion e_pif;
+ next;
+ menu "I want to live in peace..........",M_0a, "I want to try again.",M_0b;
+
+ M_0a:
+ mes "[Raul Expagarus]";
+ mes "Good choice, cough cough. Being a Wizard is a difficult job, and magic is not meant to be used by mere mortals.........";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Go down the tower and don't look back. Use the magic you have now and live a peaceful life.";
+ close;
+
+ M_0b:
+ mes "[Raul Expagarus]";
+ mes "Hmph, we'll see how GREAT you do.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Lets start the test! If you miss one question, you're screwed! HA!";
+ emotion e_gg;
+ next;
+ mes "[Raul Expagarus]";
+ mes "10 questions, get them right! I won't tell you the correct answer for the ones you miss.";
+ next;
+ set @SCORE,0;
+ set @temp,rand(0,2);
+ if(@temp == 1) goto R_1;
+ if(@temp == 2) goto R_2;
+
+ //Spell Quiz
+ R_0:
+ mes "[Raul Expagarus]";
+ mes "Cough, here are the questions!";
+ next;
+ mes "[Raul Expagarus]";
+ mes "1. Which of the following is not";
+ mes "necessary to learn Fire Wall?";
+ next;
+ menu "Fire Bolt Lv 4",sM0_0b, "Fire Ball Lv 5",sM0_0b, "Sight Lv 1",sM0_0b, "Napalm Beat Lv 4",sM0_0a;
+
+ sM0_0a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Regardless of it's previous";
+ mes "attribute. What does the monster's";
+ mes "attribute change to when you cast";
+ mes "Frost Diver on it?";
+ next;
+ menu "Water",sM0_1a, "Earth",sM0_1b, "Fire",sM0_1b, "Wind",sM0_1b;
+
+ sM0_1a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. When you completely master";
+ mes "Napalm Beat, what is the ratio of";
+ mes "the increased MATK using that";
+ mes "spell?";
+ next;
+ menu "1.6 times",sM0_2b, "1.7 times",sM0_2a, "2 times",sM0_2b, "20 times",sM0_2b;
+
+ sM0_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. What item do you need when";
+ mes "casting Stone Curse?";
+ next;
+ menu "Red Blood",sM0_3b, "Blue Gemstone",sM0_3b, "Yellow Gemstone",sM0_3b, "Red Gemstone",sM0_3a;
+
+ sM0_3a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_3b:
+
+ mes "[Raul Expagarus]";
+ mes "5. Which of the following is not";
+ mes "required to master Safety Wall?";
+ next;
+ menu "Napalm Beat Lv 4",sM0_4b, "Soul Strike Lv 5",sM0_4b, "SP Recovery Lv 6",sM0_4a, "Safety Wall Lv 7",sM0_4b;
+
+ sM0_4a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_4b:
+
+ mes "[Raul Expagarus]";
+ mes "6. Without the INT bonus, what";
+ mes "amount of SP is recovered every 10";
+ mes "seconds when you have learned";
+ mes "Increase SP Recovery Lv 7?";
+ next;
+ menu "14",sM0_5b, "21",sM0_5a, "28",sM0_5b, "35",sM0_5b;
+
+ sM0_5a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_5b:
+
+ mes "[Raul Expagarus]";
+ mes "7. Using Energy Coat, when you have";
+ mes "50% of your SP remaining, how much";
+ mes "SP is used when hit, and what";
+ mes "percentage is damage reduced by?";
+ next;
+ menu "Damage 18% SP1.5%",sM0_6b, "Damage 18% SP2%",sM0_6a, "Damage 24% SP1.5%",sM0_6b, "Damage 24% SP2%",sM0_6b;
+
+ sM0_6a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_6b:
+
+ mes "[Raul Expagarus]";
+ mes "8. How much SP is consumed and how";
+ mes "many times can you avoid attacks";
+ mes "when using Safety Wall Lv 6?";
+ next;
+ menu "SP 40, 6hits",sM0_7b, "SP 35, 6hits",sM0_7b, "SP 40, 7hits",sM0_7b, "SP 35, 7hits",sM0_7a;
+
+ sM0_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. How much SP is needed when using";
+ mes "Lv 10 Thunderstorm?";
+ next;
+ menu "84",sM0_8b, "74",sM0_8a, "64",sM0_8b, "54",sM0_8b;
+
+ sM0_8a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_8b:
+
+ mes "[Raul Expagarus]";
+ mes "10. Which skill is most useful";
+ mes "training in the Byalan Dungeon?";
+ next;
+ menu "Lightning Bolt",sM0_9a, "Fire Bolt",sM0_9b, "Ice Bolt",sM0_9b, "Sight",sM0_9b;
+
+ sM0_9a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_9b:
+ goto L_Cont0;
+
+ //Monster Quiz
+ R_1:
+ mes "[Raul Expagarus]";
+ mes "1. Which monster can you obtain a";
+ mes "slotted Guard from?";
+ next;
+ menu "Thief Bug",sM1_0b, "Peco Peco",sM1_0b, "Pupa",sM1_0a, "Kobold (Hammer)",sM1_0b;
+
+ sM1_0a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Which of the following is the";
+ mes "easiest monster for a low level";
+ mes "Mage to hunt?";
+ next;
+ menu "Flora",sM1_1a, "Gierth",sM1_1b, "Golem",sM1_1b, "Myst",sM1_1b;
+
+ sM1_1a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. Which monster will not be";
+ mes "affected by Stone Curse?";
+ next;
+ menu "Elder Willow",sM1_2b, "Evil Druid",sM1_2a, "Magnolia",sM1_2b, "Marc",sM1_2b;
+
+ sM1_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. When attacking a Lv 3 water";
+ mes "attribute monster with a wind";
+ mes "attribute weapon, what is the";
+ mes "damage percentage?";
+ next;
+ menu "125%",sM1_3b, "150%",sM1_3b, "175%",sM1_3b, "200%",sM1_3a;
+
+ sM1_3a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_3b:
+
+ mes "[Raul Expagarus]";
+ mes "5. If a Baby Desert Wolf and a";
+ mes "Familiar fought, which one would";
+ mes "win?";
+ next;
+ menu "Baby Desert Wolf",sM1_4a, "Familiar",sM1_4b, "Neither",sM1_4b, "I don't know",sM1_4b;
+
+ sM1_4a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_4b:
+
+ mes "[Raul Expagarus]";
+ mes "6. Which of the following cannot be";
+ mes "a Cute Pet?";
+ next;
+ menu "Poporing",sM1_5b, "Roda Frog",sM1_5a, "Smokie",sM1_5b, "Poison Spore",sM1_5b;
+
+ sM1_5a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_5b:
+
+ mes "[Raul Expagarus]";
+ mes "7. Choose the monster that is weak";
+ mes "against a fire attribute attack.";
+ next;
+ menu "Dagger Goblin",sM1_6b, "Mace Goblin",sM1_6b, "Morningstar Goblin",sM1_6b, "Hammer Goblin",sM1_6a;
+
+ sM1_6a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_6b:
+
+ mes "[Raul Expagarus]";
+ mes "8. Which of the following monsters";
+ mes "has the highest defence?";
+ next;
+ menu "Horn",sM1_7b, "Chonchon",sM1_7b, "Andre",sM1_7b, "Caramel",sM1_7a;
+
+ sM1_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. Choose the monster that's a";
+ mes "different species.";
+ next;
+ menu "Poring",sM1_8b, "Mastering",sM1_8b, "Ghostring",sM1_8a, "Spore",sM1_8b;
+
+ sM1_8a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_8b:
+
+ mes "[Raul Expagarus]";
+ mes "10. Which of the following is not";
+ mes "an Undead monster?";
+ next;
+ menu "Drake",sM1_9b, "Megalodon",sM1_9b, "Deviace",sM1_9a, "Khalitzburg",sM1_9b;
+
+ sM1_9a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_9b:
+ goto L_Cont0;
+
+ //Wizard Quiz
+ R_2:
+ mes "[Raul Expagarus]";
+ mes "1. Which stat is most important";
+ mes "for a Mage?";
+ next;
+ menu "INT",sM2_0a, "AGI",sM2_0b, "DEX",sM2_0b, "VIT",sM2_0b;
+
+ sM2_0a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Which attribute does not have a";
+ mes "'Bolt' type attack?";
+ next;
+ menu "Water",sM2_1b, "Earth",sM2_1a, "Fire",sM2_1b, "Wind",sM2_1b;
+
+ sM2_1a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. Choose the one that does not";
+ mes "relate to a mage.";
+ next;
+ menu "Weak physical strength.",sM2_2b, "Attacks at a distance.",sM2_2b, "Good at selling stuff.",sM2_2a, "Magic Defense is high.",sM2_2b;
+
+ sM2_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. Which town is the home of the";
+ mes "Mages?";
+ next;
+ menu "Prontera",sM2_3b, "Morroc",sM2_3b, "Alberta",sM2_3b, "Geffen",sM2_3a;
+
+ sM2_3a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_3b:
+
+ mes "[Raul Expagarus]";
+ mes "5. Which of the following cards has?";
+ mes "nothing to do with INT?";
+ next;
+ menu "Andre Larva Card",sM2_4b, "Soldier Andre Card",sM2_4a, "Baby Desert Wolf Card",sM2_4b, "Elder Willow Card",sM2_4b;
+
+ sM2_4a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_4b:
+
+ mes "[Raul Expagarus]";
+ mes "6. What is the Mage good at";
+ mes "compared to other job classes?";
+ next;
+ menu "Exceptional Vocal Ability",sM2_5b, "Exceptional Acting Ability",sM2_5b, "Exceptional Dance Skills",sM2_5b, "Exceptional Magic Skills",sM2_5a;
+
+ sM2_5a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_5b:
+
+ mes "[Raul Expagarus]";
+ mes "7. What is the INT bonus at Job Lv";
+ mes "40 for a mage?";
+ next;
+ menu "8",sM2_6b, "7",sM2_6b, "6",sM2_6b, "5",sM2_6a;
+
+ sM2_6a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_6b:
+
+ mes "[Raul Expagarus]";
+ mes "8. Which item can't be equipped by mages?";
+ next;
+ menu "Knife",sM2_7b, "Cap",sM2_7a, "Sandals",sM2_7b, "Eye of Dullahan",sM2_7b;
+
+ sM2_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. Which of the following is the";
+ mes "catalyst when making the Mage test";
+ mes "solution 3?";
+ next;
+ menu "Blue Gemstone",sM2_8a, "Red Gemstone",sM2_8b, "Yellow Gemstone",sM2_8b, "Red Blood",sM2_8b;
+
+ sM2_8a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_8b:
+
+ mes "[Raul Expagarus]";
+ mes "10. Which card is irrelevant to";
+ mes "magic?";
+ next;
+ menu "Marduk Card",sM2_9b, "Magnolia Card",sM2_9a, "Willow Card",sM2_9b, "Maya Card",sM2_9b;
+
+ sM2_9a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_9b:
+
+
+ L_Cont0:
+ mes "[Raul Expagarus]";
+ mes "Well that's the end of the test. When you get some time afterwards, go get something to eat okay.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Anyway, here is your score: ^ff0000"+@SCORE+"^000000 points.";
+ next;
+ mes "[Raul Expagarus]";
+ if(@SCORE == 100) goto sL_Pass100;
+ if(@SCORE == 90) goto sL_Pass90;
+
+ sL_Failed:
+ set WIZ_Q2, 1;
+ mes "Hmf... You failed, go study some more.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You're a long way away. With that low of an intelligence, you have no chance of surviving as a wizard.";
+ close;
+
+ sL_Pass90:
+ set WIZ_Q, 3;
+ set WIZ_Q2, 0;
+ mes "Hmm, you've missed one question, but I'll let you pass.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Don't relax yet! There is still a 3rd test left. While we prepare for the next test, sit and rest a bit.";
+ close;
+
+ sL_Pass100:
+ set WIZ_Q, 3;
+ set WIZ_Q2, 0;
+ mes "Wonderful! You've passed the 2nd test.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Don't relax yet! There is still a 3rd test left. While we prepare for the next test, sit and rest a bit.";
+ close;
+
+
+ L_Test3:
+ if(WIZ_Q2 == 1) goto sL_ReTest3;
+ mes "Got some rest? Good. Now, let's start the last test.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "I'll make a quick explanation of the test, want to hear it?";
+ next;
+ menu "No thank you.",M_1a, "Please go on",M_1b;
+
+ M_1a:
+ mes "[Raul Expagarus]";
+ mes "Ignorant fool! Fine, go die if you wish! Your corpse will be left as food for the monsters.";
+ emotion e_omg;
+ next;
+ mes "[Raul Expagarus]";
+ mes "I'll send you now... By the way, have fun getting slaughtered!";
+ next;
+ savepoint "gef_tower.gat",106,29;
+ warp "job_wiz.gat",57,154;
+ end;
+
+ M_1b:
+ mes "[Raul Expagarus]";
+ mes "Good choice. Listen carefully.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "The is a test of your ability to fight monsters of varying elemental properites.";
+ mes "There will be 3 different rooms, each containing monsters of a different elemental property.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "There will be the Room of Water which will have monsters of the water property, followed by the ";
+ mes "Room of Earth with earth property monsters, and finally the Room of Fire with fire property monsters.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You will have 3 minutes for each room. You must kill all of the monsters in the room to be able to advance to the next room.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "If you use that right spells you should be able to finish the test rather easily. That's all there is to it.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You look a little frightened.... give up now and you can return to town.....";
+ next;
+ menu "I have no fear! Give me the test!",sM_a, "... tooo scaaarryy... lemme go home(*sob*sob*)",sM_b;
+
+ sM_a:
+ mes "[Raul Expagarus]";
+ mes "Kid, you have courage. We'll start right away!";
+ next;
+ set WIZ_Q2, 1;
+ savepoint "gef_tower.gat",106,29;
+ warp "job_wiz.gat",57,154;
+ end;
+
+ sM_b:
+ mes "[Raul Expagarus]";
+ mes "Good choice. Have a nice peaceful life!";
+ warp "geffen.gat",120,110;
+ end;
+
+ sL_ReTest3:
+ mes "You want to take the test AGAIN!? You love magic THAT much!?";
+ emotion e_what;
+ next;
+ mes "[Raul Expagarus]";
+ mes "You failed last time, so it's time for a quiz! If you don't want to take it, TOO BAD!.";
+ next;
+ mes "[Raul Expagarus]";
+ mes "Let's start.";
+ next;
+ set @SCORE, 0;
+
+ mes "[Raul Expagarus]";
+ mes "1. Choose the monster with a";
+ mes "different attribute than the";
+ mes "others.";
+ next;
+ menu "Mantis",sM_0b, "Cornutus",sM_0a, "Giearth",sM_0b, "Caramel",sM_0b;
+
+ sM_0a:
+ set @SCORE, @SCORE + 20;
+
+ sM_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Choose the monster that is not a";
+ mes "looting one.";
+ next;
+ menu "Yoyo",sM_1b, "Magnolia",sM_1b, "Metaller",sM_1b, "Zerom",sM_1a;
+
+ sM_1a:
+ set @SCORE, @SCORE + 20;
+
+ sM_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. Which of these monsters does not";
+ mes "recognize casting?";
+ next;
+ menu "Marina",sM_2a, "Vitata",sM_2b, "Scorpion",sM_2b, "Giearth",sM_2b;
+
+ sM_2a:
+ set @SCORE, @SCORE + 20;
+
+ sM_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. Chose the spell that would be";
+ mes "efficient against a Marine Sphere.";
+ next;
+ menu "Cold Bolt",sM_3b, "Fire Bolt",sM_3b, "Lightning Bolt",sM_3a, "Stone Curse",sM_3b;
+
+ sM_3a:
+ set @SCORE, @SCORE + 20;
+
+ sM_3b:
+
+ mes "[Raul Expagarus]";
+ mes "5. Choose the monster that can";
+ mes "move.";
+ next;
+ menu "Hydra",sM_4b, "Mandragora",sM_4b, "Greatest General",sM_4b, "Frilldora",sM_4a;
+
+ sM_4a:
+ set @SCORE, @SCORE + 20;
+
+ sM_4b:
+
+ mes "[Raul Expagarus]";
+ mes "Your score is ^ff0000" +@SCORE+ "^000000 pts.";
+ next;
+ mes "[Raul Expagarus]";
+ if (@SCORE >= 80) goto sL_Passed3;
+
+ sL_Failed3:
+ mes "You Failed! Go study some more!";
+ next;
+ mes "[Raul Expagarus]";
+ mes "You aren't fit to be a wizard, why do you think you failed!?";
+ close;
+
+ sL_Passed3:
+ if (@SCORE == 100) mes "If you're so smart, why couldn't you pass the test the first time?";
+ if (@SCORE == 80) mes "Kehe, almost perfect. I'll let you try again.";
+ next;
+ menu "Let's start!",M_2a, "Explain the test again please.",M_1b;
+
+ M_2a:
+ mes "[Raul Expagarus]";
+ mes "I won't help you even if you die this time. Don't come crying to me if you fail again.... hehe.";
+ next;
+ percentheal 100,100;
+ mes "[Raul Expagarus]";
+ mes "I'll send you to the arena now. Have fun getting your butt whooped!";
+ next;
+ savepoint "gef_tower.gat",106,29;
+ warp "job_wiz.gat",55,156;
+ end;
+}
+
+
+//<====================================================== Test Arena ========================================================>\\
+// Test Guide ---------------------------------------------------------------------------------
+job_wiz.gat,50,165,4 script Wizard Test Guide::WzTG 123,{
+ mes "[Test Guide]";
+ mes "Welcome. I will be your guide for the Wizard Test.";
+ next;
+ menu "I would like to take the test.",M_0, "I would like to leave.",M_1;
+
+ M_0:
+ mes "[Test Guide]";
+ mes "As you have been told you will have 3 minutes to finish each portion of the test.";
+ mes "I will periodically announce how much time you have left for each room on a minute by minute basis.";
+ next;
+ mes "[Test Guide]";
+ mes "Please enter the 'Wizard Test Waiting Room' when you are ready to take the test.";
+ mes "When the testing room is ready you will be automatically warped there and the exam will begin.";
+ next;
+ mes "[Test Guide]";
+ mes "Good luck!";
+ close;
+ M_1:
+ mes "[Test Guide]";
+ mes "I see. I will send you back.";
+ next;
+ warp "gef_tower.gat",106, 35;
+ end;
+
+OnInit:
+ waitingroom "Wizard Test Waiting Room",8,"WzTG::OnStart",1;
+ end;
+
+OnStart:
+ set $@WzUsers, getareausers("job_wiz.gat", 98, 154, 129, 185); // get user count for first lvl
+ set $@WzUsers, $@WzUsers + getareausers("job_wiz.gat", 100, 82, 131, 113); // get user count for second lvl + first lvl
+ set $@WzUsers, $@WzUsers + getareausers("job_wiz.gat", 30, 82, 61, 113); // get user count for third lvl + second lvl + first lvl
+ if ($@WzUsers > 0) end;
+
+ if ((getwaitingroomstate(33)) == 0) end; // finds out if there is anyone in the waiting room
+ disablenpc "waterwrp"; //disables the warps
+ disablenpc "waterwarpW";
+ disablenpc "waterwarpN";
+ disablenpc "waterwarpS";
+ disablenpc "earthwrp";
+ disablenpc "earthwarpW";
+ disablenpc "earthwarpN";
+ disablenpc "earthwarpS";
+ disablenpc "firewrp";
+ disablenpc "firewarpN";
+ disablenpc "firewarpW";
+ disablenpc "firewarpS";
+ killmonsterall "job_wiz.gat"; //makes sure there are no left over mobs from other testers
+ warpwaitingpc "job_wiz.gat",114,169;
+ donpcevent "WaterRm::OnStart";
+ end;
+}
+
+// Room of Water -----------------------------------------------------------------------------
+job_wiz.gat,1,1,1 script WaterRm -1,{
+
+OnStart:
+ set $@WzRm, 1; // used to determine which map area(room) to make time announcements in
+ set $@WzMOB, 8; //used as a counter for the monsters that are summoned
+ monster "job_wiz.gat",109,174,"Phen",1158,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",118,174,"Kukre",1070,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",98,170,"Kukre",1070,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",109,165,"Vadon",1066,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",118,165,"Cornutus",1067,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",101,157,"Marina",1141,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",126,157,"Marin",1242,1,"WaterRm::OnMyMobDead1";
+ monster "job_wiz.gat",129,170,"Obeaune",1044,1,"WaterRm::OnMyMobDead1";
+ initnpctimer "TimerWz";
+ end;
+
+OnMyMobDead1: //when a monster dies this portion of script is run
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ set $@WzMOB, 0;
+ addtimer 2000, "WaterRm::OnTimer2000";
+ end;
+
+OnTimer2000:
+ set $@WzMOB, 5;
+ areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: You must now defeat the door gaurds! Hurry!",8;
+ monster "job_wiz.gat",114,169,"Marine Sphere",1142,1,"WaterRm::OnMyMobDead2";
+ monster "job_wiz.gat",112,169,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
+ monster "job_wiz.gat",116,169,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
+ monster "job_wiz.gat",114,171,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
+ monster "job_wiz.gat",114,167,"Hydra",1068,1,"WaterRm::OnMyMobDead2";
+ setnpctimer 120000, "TimerWz";
+ startnpctimer "TimerWz";
+ end;
+
+OnMyMobDead2:
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ set $@WzMOB, 0;
+ areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: Well done. You have completed the Room of Water. Get ready for the Room of Earth.",8;
+ percentheal 100,100;
+ enablenpc "waterwrp";
+ enablenpc "waterwarpW";
+ enablenpc "waterwarpN";
+ enablenpc "waterwarpS";
+ initnpctimer "waterwrp"; // warps the player after 30 secs even if they don't enter the warps
+ end;
+}
+
+// Room of Earth -----------------------------------------------------------------------------------------------
+job_wiz.gat,1,1,1 script EarthRm -1,{
+
+OnStart:
+ set $@WzRm, 2;
+ set $@WzMOB, 10;
+ monster "job_wiz.gat",111,102,"Yoyo",1057,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",120,102, "Deniro",1105,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",111,102, "Caramel",1103,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",120,102,"Hode",1127,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",111,93,"Savage",1166,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",120,93,"Giearth",1121,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",107,98,"Bigfoot",1160,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",124,98,"Orc Warrior",1023,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",104,86,"Vitata",1176,1,"EarthRm::OnMyMobDead1";
+ monster "job_wiz.gat",127,86,"Mantis",1139,1,"EarthRm::OnMyMobDead1";
+ initnpctimer "TimerWz";
+ end;
+
+OnMyMobDead1:
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ addtimer 2000, "EarthRm::OnTimer2000";
+ set $@WzMOB, 0;
+ end;
+
+OnTimer2000:
+ set $@WzMOB, 7;
+ areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: You now must defeat the door gaurds! Hurry!.",8;
+ monster "job_wiz.gat",116,97,"Flora",1118,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",114,95,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",118,95,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",114,99,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",118,99,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",116,94,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ monster "job_wiz.gat",116,100,"Mandragora",1020,1,"EarthRm::OnMyMobDead2";
+ setnpctimer 120000, "TimerWz";
+ startnpctimer "TimerWz";
+ end;
+
+OnMyMobDead2:
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ set $@WzMOB, 0;
+ areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: Well done. You have completed the Room of Earth. Get ready for the Room of Fire.",8;
+ percentheal 100,100;
+ enablenpc "earthwrp";
+ enablenpc "earthwarpN";
+ enablenpc "earthwarpW";
+ enablenpc "earthwarpS";
+ initnpctimer "earthwrp";
+ end;
+}
+
+// Room of Fire ------------------------------------------------------------------------------------------------------------
+job_wiz.gat,1,1,1 script FireRm -1,{
+
+OnStart:
+ set $@WzRm, 3;
+ set $@WzMOB, 7;
+ monster "job_wiz.gat",58,110,"Zerom",1178,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",33,110,"Flail Goblin",1123,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",40,103,"Scorpion",1001,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",51,103,"Frilldora",1119,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",40,92,"Peco Peco",1019,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",51,92,"Elder Willow",1033,1,"FireRm::OnMyMobDead1";
+ monster "job_wiz.gat",37,89,"Metaller",1058,1,"FireRm::OnMyMobDead1";
+ initnpctimer "TimerWz";
+ end;
+
+OnMyMobDead1:
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ addtimer 2000, "FireRm::OnTimer2000";
+ set $@WzMOB, 0;
+ end;
+
+OnTimer2000:
+ set $@WzMOB, 3;
+ areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: You now must defeat the door gaurds! Hurry!.",8;
+ monster "job_wiz.gat",44,99,"Greatest General",1277,1,"FireRm::OnMyMobDead2";
+ monster "job_wiz.gat",43,99,"Horong",1129,1,"FireRm::OnMyMobDead2";
+ monster "job_wiz.gat",45,99,"Horong",1129,1,"FireRm::OnMyMobDead2";
+ setnpctimer 120000, "TimerWz";
+ startnpctimer "TimerWz";
+ end;
+
+OnMyMobDead2:
+ set $@WzMOB, $@WzMOB - 1;
+ if ($@WzMOB > 0) end;
+
+ stopnpctimer "TimerWz";
+ set $@WzMOB, 0;
+ set WIZ_Q, 4;
+ set WIZ_Q2, 0;
+ areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: Well done. You have completed the Room of Fire and the entire test.",0;
+ enablenpc "firewrp";
+ enablenpc "firewarpN";
+ enablenpc "firewarpW";
+ enablenpc "firewarpS";
+ initnpctimer "firewrp";
+ end;
+}
+
+
+// Timer -----------------------------------------------------------------------------------------------
+job_wiz.gat,1,1,1 script TimerWz -1,{
+
+OnTimer1000:
+ if($@WzRm==1) areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: Room of Water, testing will begin.",8;
+ if($@WzRm==2) areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: Room of Earth, testing will begin.",8;
+ if($@WzRm==3) areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: Room of Fire, testing will begin.",8;
+ end;
+OnTimer4000:
+ set $@WzTime$, "You have 3 minutes to defeat all of the monsters in this room starting now!";
+ donpcevent "WzTG::OnStart"; //checks to see if anyone is still in the room, in case of logout or KO
+ callsub AnnounceWz;
+OnTimer34000:
+ donpcevent "WzTG::OnStart";
+ end;
+OnTimer64000:
+ set $@WzTime$, "You have 2 minutes left!";
+ donpcevent "WzTG::OnStart";
+ callsub AnnounceWz;
+OnTimer94000:
+ donpcevent "WzTG::OnStart";
+ end;
+OnTimer124000:
+ set $@WzTime$, "You have 1 minute left!";
+ donpcevent "WzTG::OnStart";
+ callsub AnnounceWz;
+OnTimer154000:
+ set $@WzTime$, "You have 30 seconds left!";
+ donpcevent "WzTG::OnStart";
+ callsub AnnounceWz;
+OnTimer174000:
+ set $@WzTime$, "You have 10 seconds left!";
+ callsub AnnounceWz;
+OnTimer184000:
+ set $@WzTime$, "Time is up. You have failed the test.";
+ callsub AnnounceWz;
+OnTimer188000:
+ stopnpctimer;
+ if($@WzRm==1) areawarp "job_wiz.gat", 98, 154, 129, 185, "gef_tower.gat",106, 35;
+ if($@WzRm==2) areawarp "job_wiz.gat", 100, 82, 131, 113, "gef_tower.gat",106, 35;
+ if($@WzRm==3) areawarp "job_wiz.gat", 30, 82, 61, 113, "gef_tower.gat",106, 35;
+ killmonsterall "job_wiz.gat";
+ donpcevent "WzTG::OnStart";
+ end;
+
+AnnounceWz:
+ if($@WzRm==1) areaannounce "job_wiz.gat", 98, 154, 129, 185, "[Test Guide]: "+$@WzTime$+".",8;
+ if($@WzRm==2) areaannounce "job_wiz.gat", 100, 82, 131, 113, "[Test Guide]: "+$@WzTime$+".",8;
+ if($@WzRm==3) areaannounce "job_wiz.gat", 30, 82, 61, 113, "[Test Guide]: "+$@WzTime$+".",8;
+ end;
+}
+
+
+// Warps ------------------------------------------------------------------------------------------
+
+// Water
+job_wiz.gat,129,169,1 script waterwarpE::waterwrp 45,1,1,{
+
+OnTimer30000:
+ stopnpctimer "waterwrp";
+ areawarp "job_wiz.gat", 98, 154, 129, 185, "job_wiz.gat",116,98;
+ donpcevent "EarthRm::OnStart";
+ end;
+}
+job_wiz.gat,98,169,1 duplicate(waterwrp) waterwarpW 45,1,1
+job_wiz.gat,114,185,1 duplicate(waterwrp) waterwarpN 45,1,1
+job_wiz.gat,114,154,1 duplicate(waterwrp) waterwarpS 45,1,1
+
+
+// Earth
+job_wiz.gat,131,98,1 script earthwarpE::earthwrp 45,1,1,{
+
+OnTimer30000:
+ stopnpctimer "earthwrp";
+ areawarp "job_wiz.gat", 100, 82, 131, 113, "job_wiz.gat",47,98;
+ donpcevent "FireRm::OnStart";
+ end;
+}
+job_wiz.gat,100,98,1 duplicate(earthwrp) earthwarpW 45,1,1
+job_wiz.gat,116,82,1 duplicate(earthwrp) earthwarpN 45,1,1
+job_wiz.gat,116,113,1 duplicate(earthwrp) earthwarpS 45,1,1
+
+
+// Fire
+job_wiz.gat,61,97,1 script firewarpE::firewrp 45,1,1,{
+
+OnTimer30000:
+ stopnpctimer "firewrp";
+ areawarp "job_wiz.gat", 30, 82, 61, 113, "gef_tower.gat",106,35;
+ donpcevent "WzTG::OnStart";
+ end;
+}
+job_wiz.gat,30,97,1 duplicate(firewrp) firewarpW 45,1,1
+job_wiz.gat,46,113,1 duplicate(firewrp) firewarpN 45,1,1
+job_wiz.gat,46,82,1 duplicate(firewrp) firewarpS 45,1,1
+
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_wiz.gat mapflag nomemo
+job_wiz.gat mapflag noteleport
+job_wiz.gat mapflag nosave SavePoint
+job_wiz.gat mapflag nopenalty
+job_wiz.gat mapflag nobranch
+job_wiz.gat mapflag noexp
+job_wiz.gat mapflag noloot
diff --git a/npc/jobs/2-1a/AssassinCross.txt b/npc/jobs/2-1a/AssassinCross.txt
index ba86d01f4..5aa07e8c9 100644
--- a/npc/jobs/2-1a/AssassinCross.txt
+++ b/npc/jobs/2-1a/AssassinCross.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Assassin Cross ==-
-valkyrie.gat,44,58,6 script Assassin Cross 725,{
- callfunc "F_Rebirth",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Assassin Cross";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Assassin Cross ==-
+valkyrie.gat,44,58,6 script Assassin Cross 725,{
+ callfunc "F_Rebirth",Job_Thief_High,"Thief High",Job_Assassin_Cross,"Assassin Cross";
+}
diff --git a/npc/jobs/2-1a/HighPriest.txt b/npc/jobs/2-1a/HighPriest.txt
index 5b94bc708..80a6370af 100644
--- a/npc/jobs/2-1a/HighPriest.txt
+++ b/npc/jobs/2-1a/HighPriest.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== High Priest ==-
-valkyrie.gat,44,42,6 script High Priest 60,{
- callfunc "F_Rebirth",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"High Priest";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== High Priest ==-
+valkyrie.gat,44,42,6 script High Priest 60,{
+ callfunc "F_Rebirth",Job_Acolyte_High,"Acolyte High",Job_High_Priest,"High Priest";
+}
diff --git a/npc/jobs/2-1a/HighWizard.txt b/npc/jobs/2-1a/HighWizard.txt
index f50a84f28..08842710e 100644
--- a/npc/jobs/2-1a/HighWizard.txt
+++ b/npc/jobs/2-1a/HighWizard.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== High Wizard ==-
-valkyrie.gat,44,47,6 script High Wizard 735,{
- callfunc "F_Rebirth",Job_Mage_High,"High Mage",Job_High_Wizard,"High Wizard";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== High Wizard ==-
+valkyrie.gat,44,47,6 script High Wizard 735,{
+ callfunc "F_Rebirth",Job_Mage_High,"High Mage",Job_High_Wizard,"High Wizard";
+}
diff --git a/npc/jobs/2-1a/LordKnight.txt b/npc/jobs/2-1a/LordKnight.txt
index 7497e7f50..292ca8888 100644
--- a/npc/jobs/2-1a/LordKnight.txt
+++ b/npc/jobs/2-1a/LordKnight.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Lord Knight ==-
-valkyrie.gat,44,39,6 script Lord Knight 56,{
- callfunc "F_Rebirth",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Lord Knight";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Lord Knight ==-
+valkyrie.gat,44,39,6 script Lord Knight 56,{
+ callfunc "F_Rebirth",Job_Swordman_High,"Swordman High",Job_Lord_Knight,"Lord Knight";
+}
diff --git a/npc/jobs/2-1a/Sniper.txt b/npc/jobs/2-1a/Sniper.txt
index 77c787726..de7de8f4a 100644
--- a/npc/jobs/2-1a/Sniper.txt
+++ b/npc/jobs/2-1a/Sniper.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Sniper ==-
-valkyrie.gat,44,55,6 script Sniper 727,{
- callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Sniper,"Sniper";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Sniper ==-
+valkyrie.gat,44,55,6 script Sniper 727,{
+ callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Sniper,"Sniper";
+}
diff --git a/npc/jobs/2-1a/WhiteSmith.txt b/npc/jobs/2-1a/WhiteSmith.txt
index 0ba61afef..50062fa84 100644
--- a/npc/jobs/2-1a/WhiteSmith.txt
+++ b/npc/jobs/2-1a/WhiteSmith.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== White Smith ==-
-valkyrie.gat,44,51,6 script White Smith 726,{
- callfunc "F_Rebirth",Job_Merchant_High,"Merchant High",Job_Whitesmith,"White Smith";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== White Smith ==-
+valkyrie.gat,44,51,6 script White Smith 726,{
+ callfunc "F_Rebirth",Job_Merchant_High,"Merchant High",Job_Whitesmith,"White Smith";
+}
diff --git a/npc/jobs/2-1e/StarGladiator.txt b/npc/jobs/2-1e/StarGladiator.txt
index 66b3f2ae7..9df093c3c 100644
--- a/npc/jobs/2-1e/StarGladiator.txt
+++ b/npc/jobs/2-1e/StarGladiator.txt
@@ -1,290 +1,290 @@
-//===== eAthena Script =======================================
-//= Star Gladiator Job Quest
-//===== By: ==================================================
-//= Celestria
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= A temp Star Gladiator Job Changer based on the kRO quest.
-//= Quest info from RagnaInfo.
-//= Sprites from kRO screenshots, bar two which I just had to guess at.
-//= 1.0 Optimized, updated [Lupus]
-//============================================================
-
-
-payon.gat,215,102,2 script MooHyun 828,{
- mes "[MooHyun]";
- if(Class==Job_Taekwon && JobLevel>=40 && STGL_Q==0) goto L_Taekwon;
- if(STGL_Q) goto L_Quest;
- mes "Aaaah, it's such lovely weather today, don't you think?";
- close;
-
-L_Taekwon:
- mes "Oooh, a Taekwon!";
- mes "I don't see many of those around.";
- mes "I don't suppose you're interested in becoming even stronger?";
- next;
- menu "Oh..?",-,"No, not really.",L_No;
-
- mes "[MooHyun]";
- mes "Well, there are these dedicated";
- mes "fighters who are known as Star Gladiators.";
- mes "I just so happen to know someone who";
- mes "can warp to their meditation spot.";
- next;
- menu "Oooo.. I wanna be a SK.",-,"So?",L_No;
- mes "[MooHyun]";
- mes "What a coincidence!";
- mes "However he does need some rare";
- mes "materials to form the warp.";
- set STGL_Q,1;
- next;
- mes "[MooHyun]";
-L_Quest:
- mes "You will need to take him:";
- mes "^0000FF- 1 Flame Heart^000000";
- mes "^0000FF- 1 Mystic Frozen^000000";
- mes "^0000FF- 1 Rough Wind^000000";
- mes "^0000FF- 1 Great Nature^000000";
- next;
- mes "[MooHyun]";
- mes "You can find him in Comodo.";
- mes "He normally like to hang out at";
- mes "the top of the mountain there.";
- //mes "Write this down, because I won't tell you again.";
- close;
-L_No:
- mes "[MooHyun]";
- mes "I see. Well, if that's how you feel...";
- close;
-}
-
-comodo.gat,172,231,2 script Man#SKTest 730,{
- if(STGL_Q==1) goto L_Talk;
- if(STGL_Q>=2) goto L_Needwarp;
- mes "[Man]";
- mes "...";
- close;
-
-L_Talk:
- mes "[Man]";
- mes "...";
- next;
- mes "[Warper Man]";
- mes "Oh, a Taekwon. I guess MooHyun sent you here then.";
- mes "Did you want me to warp you?";
- next;
- menu "Yes",L_Warp,"No",-;
- mes "[Warper Man]";
- mes "Hmph, wasting my time...";
- mes "Come back when you actually";
- mes "DO want me to warp you.";
- close;
-
-L_Warp:
- if(countitem(994) < 1 || countitem(995) < 1 || countitem(996) < 1 || countitem(997) < 1) goto L_Noitem;
- delitem 994,1;
- delitem 995,1;
- delitem 996,1;
- delitem 997,1;
- set STGL_Q,2;
- mes "[Warper Man]";
- mes "Great! With these items I can create a warp at any time.";
- mes "so if you need to warp again just ask me, okay?";;
- next;
- warp "job_star.gat",33,41;
- close;
-
-L_Noitem:
- mes "[Warper Man]";
- mes "In order to warp you, I need rare magical items.";
- next;
- mes "[Warper Man]";
- mes "Bring me:";
- mes "^0000FF- 1 Flame Heart^000000";
- mes "^0000FF- 1 Mystic Frozen^000000";
- mes "^0000FF- 1 Rough Wind^000000";
- mes "^0000FF- 1 Great Nature^000000";
- close;
-
-L_Needwarp:
- mes "[Warper Man]";
- mes "Did you need me to warp you again?";
- next;
- menu "Yes",L_Again,"No",-;
- close;
-
-L_Again:
- warp "job_star.gat",33,41;
- close;
-}
-
-job_star.gat,29,33,4 script Gladiator of the Sun 823,{
- if(STGL_Q==3) goto L_Warpnow1;
- if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk1;
- mes "[Gladiator of the Sun]";
- mes "How did you get in here!?";
- mes "Get out at once!";
- next;
- warp "payon.gat",256,242;
- close;
-
-L_Talk1:
- mes "[Gladiator of the Sun]";
- mes "Ah. A Taekwon.";
- mes "It is always good to see a follower of a disciplined art.";
- next;
- mes "[Gladiator of the Sun]";
- mes "I assume you came here to become a Star Gladiator.";
- mes "So allow me to explain...";
- next;
- mes "[Gladiator of the Sun]";
- mes "The Sun, the Moon, and the Stars.";
- mes "All have their own subtle";
- mes "energies. We Star Gladiators use";
- mes "these energies in addition";
- mes "to our own strength to aid us";
- mes "in combat.";
- next;
- mes "[Gladiator of the Sun]";
- mes "In here I teach Taekwons how to";
- mes "tap into the energy of the sun.";
- mes "I shall teach you this now.";
- next;
- mes "^0000FFYou spend several hours meditating^000000";
- mes "^0000FFtogehther under the sun.^000000";
- mes "^0000FFYou do start to feel warm, although^000000";
- mes "^0000FFthat's probably because you aren't^000000";
- mes "^0000FFwearing any suncream.^000000";
- next;
- mes "[Gladiator of the Sun]";
- mes "You have learnt all I can teach you.";
- mes "I shall now send you to your";
- mes "next instructor.";
- next;
-
-L_Warpnow1:
- warp "job_star.gat",99,41;
- close;
-}
-
-job_star.gat,95,34,4 script Gladiator of the Moon 758,{
- if(STGL_Q==3) goto L_Warpnow2;
- if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk2;
- mes "[Gladiator of the Moon]";
- mes "How did you get in here!?";
- mes "Get out at once!";
- next;
- warp "payon.gat",256,242;
- close;
-
-L_Talk2:
- mes "[Gladiator of the Moon]";
- mes "Ah. A Taekwon.";
- mes "It is good that you have";
- mes "managed to come this far.";
- next;
- mes "[Gladiator of the Moon]";
- mes "My job here is to help";
- mes "Taekwons become more in";
- mes "touch with the energies of the Moon.";
- next;
- mes "[Gladiator of the Moon]";
- mes "The Moon has calming energies.";
- mes "So you must be careful not";
- mes "to fall asleep while meditating";
- next;
- mes "[Gladiator of the Moon]";
- mes "Now, sit down.";
- mes "Stare into the Moon and feel.";
- mes "it's light flow through you.";
- next;
- mes "^0000FFAfter a few minutes of meditation^000000";
- mes "^0000FFyour eyes start to grow heavy.^000000";
- mes "^0000FFcomposing yourself you force^000000";
- mes "^0000FFyourself awake, and feel a^000000";
- mes "^0000FFrenewed vigour.^000000";
- next;
- mes "[Gladiator of the Moon]";
- mes "You have learnt all I can teach you.";
- mes "I shall now send you to the";
- mes "final instructor.";
- next;
-
-L_Warpnow2:
- warp "job_star.gat",165,39;
- close;
-}
-
-job_star.gat,161,34,4 script Gladiator of the Stars 77,{
- if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk3;
- if(STGL_Q==3) goto L_Itemcheck;
- mes "[Gladiator of the Stars]";
- mes "How did you get in here!?";
- mes "Get out at once!";
- next;
- warp "payon.gat",256,242;
- close;
-
-L_Talk3:
- mes "[Gladiator of the Stars]";
- mes "Greetings Taekwon.";
- mes "I am here to teach you about";
- mes "the multiple energies that";
- mes "come from the stars.";
- next;
-
-L_Itemcheck:
- if(countitem(1000) < 1 || countitem(1001) < 1) goto L_Noitem3;
- if(SkillPoint) goto L_Skill;
- delitem 1000,1;
- delitem 1001,1;
- mes "[Gladiator of the Stars]";
- mes "Since you have the required items,";
- mes "we shall now begin.";
- next;
- mes "^0000FFAs you meditate you feel a^000000";
- mes "^0000FFpower growing within you.^000000";
- mes "^0000FFThis power does not feel like^000000";
- mes "^0000FFyour own, but like something^000000";
- mes "^0000FFout there is giving you a hand.^000000";
- next;
- jobchange Job_Star_Gladiator;
- callfunc "F_ClearJobVar";
- mes "[Gladiator of the Stars]";
- mes "It seems that you are indeed";
- mes "in touch with the sun, moon, and stars.";
- next;
- mes "[Gladiator of the Stars]";
- mes "I wish you luck on your journey.";
- next;
- warp "payon.gat",256,242;
- close;
-
-L_Skill:
- mes "[Gladiator of the Stars]";
- mes "It would seem you still have";
- mes "some unused skill points.";
- mes "Use these all up, then come";
- mes "talk to me again.";
- close;
-
-L_Noitem3:
- mes "[Gladiator of the Stars]";
- mes "In order to become one with";
- mes "the stars, you will need to bring me:";
- mes "^0000FF- 1 Star Crumb^000000";
- mes "^0000FF- 1 Star Dust^000000";
- next;
- mes "[Gladiator of the Stars]";
- mes "I will now send you back to";
- mes "look for these items.";
- next;
- set STGL_Q,3;
- warp "payon.gat",256,242;
- close;
-}
+//===== eAthena Script =======================================
+//= Star Gladiator Job Quest
+//===== By: ==================================================
+//= Celestria
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= A temp Star Gladiator Job Changer based on the kRO quest.
+//= Quest info from RagnaInfo.
+//= Sprites from kRO screenshots, bar two which I just had to guess at.
+//= 1.0 Optimized, updated [Lupus]
+//============================================================
+
+
+payon.gat,215,102,2 script MooHyun 828,{
+ mes "[MooHyun]";
+ if(Class==Job_Taekwon && JobLevel>=40 && STGL_Q==0) goto L_Taekwon;
+ if(STGL_Q) goto L_Quest;
+ mes "Aaaah, it's such lovely weather today, don't you think?";
+ close;
+
+L_Taekwon:
+ mes "Oooh, a Taekwon!";
+ mes "I don't see many of those around.";
+ mes "I don't suppose you're interested in becoming even stronger?";
+ next;
+ menu "Oh..?",-,"No, not really.",L_No;
+
+ mes "[MooHyun]";
+ mes "Well, there are these dedicated";
+ mes "fighters who are known as Star Gladiators.";
+ mes "I just so happen to know someone who";
+ mes "can warp to their meditation spot.";
+ next;
+ menu "Oooo.. I wanna be a SK.",-,"So?",L_No;
+ mes "[MooHyun]";
+ mes "What a coincidence!";
+ mes "However he does need some rare";
+ mes "materials to form the warp.";
+ set STGL_Q,1;
+ next;
+ mes "[MooHyun]";
+L_Quest:
+ mes "You will need to take him:";
+ mes "^0000FF- 1 Flame Heart^000000";
+ mes "^0000FF- 1 Mystic Frozen^000000";
+ mes "^0000FF- 1 Rough Wind^000000";
+ mes "^0000FF- 1 Great Nature^000000";
+ next;
+ mes "[MooHyun]";
+ mes "You can find him in Comodo.";
+ mes "He normally like to hang out at";
+ mes "the top of the mountain there.";
+ //mes "Write this down, because I won't tell you again.";
+ close;
+L_No:
+ mes "[MooHyun]";
+ mes "I see. Well, if that's how you feel...";
+ close;
+}
+
+comodo.gat,172,231,2 script Man#SKTest 730,{
+ if(STGL_Q==1) goto L_Talk;
+ if(STGL_Q>=2) goto L_Needwarp;
+ mes "[Man]";
+ mes "...";
+ close;
+
+L_Talk:
+ mes "[Man]";
+ mes "...";
+ next;
+ mes "[Warper Man]";
+ mes "Oh, a Taekwon. I guess MooHyun sent you here then.";
+ mes "Did you want me to warp you?";
+ next;
+ menu "Yes",L_Warp,"No",-;
+ mes "[Warper Man]";
+ mes "Hmph, wasting my time...";
+ mes "Come back when you actually";
+ mes "DO want me to warp you.";
+ close;
+
+L_Warp:
+ if(countitem(994) < 1 || countitem(995) < 1 || countitem(996) < 1 || countitem(997) < 1) goto L_Noitem;
+ delitem 994,1;
+ delitem 995,1;
+ delitem 996,1;
+ delitem 997,1;
+ set STGL_Q,2;
+ mes "[Warper Man]";
+ mes "Great! With these items I can create a warp at any time.";
+ mes "so if you need to warp again just ask me, okay?";;
+ next;
+ warp "job_star.gat",33,41;
+ close;
+
+L_Noitem:
+ mes "[Warper Man]";
+ mes "In order to warp you, I need rare magical items.";
+ next;
+ mes "[Warper Man]";
+ mes "Bring me:";
+ mes "^0000FF- 1 Flame Heart^000000";
+ mes "^0000FF- 1 Mystic Frozen^000000";
+ mes "^0000FF- 1 Rough Wind^000000";
+ mes "^0000FF- 1 Great Nature^000000";
+ close;
+
+L_Needwarp:
+ mes "[Warper Man]";
+ mes "Did you need me to warp you again?";
+ next;
+ menu "Yes",L_Again,"No",-;
+ close;
+
+L_Again:
+ warp "job_star.gat",33,41;
+ close;
+}
+
+job_star.gat,29,33,4 script Gladiator of the Sun 823,{
+ if(STGL_Q==3) goto L_Warpnow1;
+ if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk1;
+ mes "[Gladiator of the Sun]";
+ mes "How did you get in here!?";
+ mes "Get out at once!";
+ next;
+ warp "payon.gat",256,242;
+ close;
+
+L_Talk1:
+ mes "[Gladiator of the Sun]";
+ mes "Ah. A Taekwon.";
+ mes "It is always good to see a follower of a disciplined art.";
+ next;
+ mes "[Gladiator of the Sun]";
+ mes "I assume you came here to become a Star Gladiator.";
+ mes "So allow me to explain...";
+ next;
+ mes "[Gladiator of the Sun]";
+ mes "The Sun, the Moon, and the Stars.";
+ mes "All have their own subtle";
+ mes "energies. We Star Gladiators use";
+ mes "these energies in addition";
+ mes "to our own strength to aid us";
+ mes "in combat.";
+ next;
+ mes "[Gladiator of the Sun]";
+ mes "In here I teach Taekwons how to";
+ mes "tap into the energy of the sun.";
+ mes "I shall teach you this now.";
+ next;
+ mes "^0000FFYou spend several hours meditating^000000";
+ mes "^0000FFtogehther under the sun.^000000";
+ mes "^0000FFYou do start to feel warm, although^000000";
+ mes "^0000FFthat's probably because you aren't^000000";
+ mes "^0000FFwearing any suncream.^000000";
+ next;
+ mes "[Gladiator of the Sun]";
+ mes "You have learnt all I can teach you.";
+ mes "I shall now send you to your";
+ mes "next instructor.";
+ next;
+
+L_Warpnow1:
+ warp "job_star.gat",99,41;
+ close;
+}
+
+job_star.gat,95,34,4 script Gladiator of the Moon 758,{
+ if(STGL_Q==3) goto L_Warpnow2;
+ if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk2;
+ mes "[Gladiator of the Moon]";
+ mes "How did you get in here!?";
+ mes "Get out at once!";
+ next;
+ warp "payon.gat",256,242;
+ close;
+
+L_Talk2:
+ mes "[Gladiator of the Moon]";
+ mes "Ah. A Taekwon.";
+ mes "It is good that you have";
+ mes "managed to come this far.";
+ next;
+ mes "[Gladiator of the Moon]";
+ mes "My job here is to help";
+ mes "Taekwons become more in";
+ mes "touch with the energies of the Moon.";
+ next;
+ mes "[Gladiator of the Moon]";
+ mes "The Moon has calming energies.";
+ mes "So you must be careful not";
+ mes "to fall asleep while meditating";
+ next;
+ mes "[Gladiator of the Moon]";
+ mes "Now, sit down.";
+ mes "Stare into the Moon and feel.";
+ mes "it's light flow through you.";
+ next;
+ mes "^0000FFAfter a few minutes of meditation^000000";
+ mes "^0000FFyour eyes start to grow heavy.^000000";
+ mes "^0000FFcomposing yourself you force^000000";
+ mes "^0000FFyourself awake, and feel a^000000";
+ mes "^0000FFrenewed vigour.^000000";
+ next;
+ mes "[Gladiator of the Moon]";
+ mes "You have learnt all I can teach you.";
+ mes "I shall now send you to the";
+ mes "final instructor.";
+ next;
+
+L_Warpnow2:
+ warp "job_star.gat",165,39;
+ close;
+}
+
+job_star.gat,161,34,4 script Gladiator of the Stars 77,{
+ if(Class==Job_Taekwon && JobLevel>=40) goto L_Talk3;
+ if(STGL_Q==3) goto L_Itemcheck;
+ mes "[Gladiator of the Stars]";
+ mes "How did you get in here!?";
+ mes "Get out at once!";
+ next;
+ warp "payon.gat",256,242;
+ close;
+
+L_Talk3:
+ mes "[Gladiator of the Stars]";
+ mes "Greetings Taekwon.";
+ mes "I am here to teach you about";
+ mes "the multiple energies that";
+ mes "come from the stars.";
+ next;
+
+L_Itemcheck:
+ if(countitem(1000) < 1 || countitem(1001) < 1) goto L_Noitem3;
+ if(SkillPoint) goto L_Skill;
+ delitem 1000,1;
+ delitem 1001,1;
+ mes "[Gladiator of the Stars]";
+ mes "Since you have the required items,";
+ mes "we shall now begin.";
+ next;
+ mes "^0000FFAs you meditate you feel a^000000";
+ mes "^0000FFpower growing within you.^000000";
+ mes "^0000FFThis power does not feel like^000000";
+ mes "^0000FFyour own, but like something^000000";
+ mes "^0000FFout there is giving you a hand.^000000";
+ next;
+ jobchange Job_Star_Gladiator;
+ callfunc "F_ClearJobVar";
+ mes "[Gladiator of the Stars]";
+ mes "It seems that you are indeed";
+ mes "in touch with the sun, moon, and stars.";
+ next;
+ mes "[Gladiator of the Stars]";
+ mes "I wish you luck on your journey.";
+ next;
+ warp "payon.gat",256,242;
+ close;
+
+L_Skill:
+ mes "[Gladiator of the Stars]";
+ mes "It would seem you still have";
+ mes "some unused skill points.";
+ mes "Use these all up, then come";
+ mes "talk to me again.";
+ close;
+
+L_Noitem3:
+ mes "[Gladiator of the Stars]";
+ mes "In order to become one with";
+ mes "the stars, you will need to bring me:";
+ mes "^0000FF- 1 Star Crumb^000000";
+ mes "^0000FF- 1 Star Dust^000000";
+ next;
+ mes "[Gladiator of the Stars]";
+ mes "I will now send you back to";
+ mes "look for these items.";
+ next;
+ set STGL_Q,3;
+ warp "payon.gat",256,242;
+ close;
+}
diff --git a/npc/jobs/2-2/alchemist.txt b/npc/jobs/2-2/alchemist.txt
index 4e3d88e8f..41f254fc2 100644
--- a/npc/jobs/2-2/alchemist.txt
+++ b/npc/jobs/2-2/alchemist.txt
@@ -1,1076 +1,1076 @@
-//===== eAthena Script =======================================
-//= Alchemist Job Quest
-//===== By: ==================================================
-//= nestor_zulueta (Fusion), converted by Darkchild
-//===== Current Version: =====================================
-//= 2.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Alchemist job quest based off of official iRO quest.
-//===== Additional Comments: =================================
-//= v1.0 Working.
-//= npc/quests/counteragent_mixture.txt Also Needed
-//= npc/quests/quests_yuno.txt Also Needed [Darkchild]
-//= v1.1 Fixed some minor bugs. Optimized some lines. Re-organized the script a bit.
-//= Giving Parmry NPC, Hammer and Old Book now waves the 50000 fee. (based of mRO website)
-//= Having a joblvl of 50 allows you to skip Rasputin's test. (based of mRO website) [kobra_k88]
-//= 1.2 fixed a few typos (have to hunt more) [Lupus]
-//= 1.3 Added Baby Class Support [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 1.6a fixed some wrong answers, thanks to zlider for info [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.2 Got rid of 'al_morgen' var. Now uses (MISC_QUEST & 4) [Lupus]
-//= 2.3 Optimized, changed job numbers to constants. Fixed some spelling [Lupus]
-//============================================================
-
-
-//==================================================================================================//
-// Registration and First Test
-//==================================================================================================//
-alde_alche.gat,27,185,4 script Parmry Gianino 744,{
- callfunc "F_BlockHigh",Job_Merchant_High,"Merchant High",Job_Creator,"Creator","Parmry Gianino";
-
- mes "[Parmry Gianino]";
- if(baseJob == Job_Merchant) goto L_Merc;
- if(baseJob == Job_Alchem){
- mes "Hey there fellow Alchemist. How's the business going? Good I hope, well good luck to you.";
- close;
- }
- mes "Welcome to the Alchemist Union. Ah, I apologize but I'm busy right now.";
- close;
-L_Merc:
- if(ALCH_Q == 1) goto L_Check;
- if(ALCH_Q == 2) goto L_Test2;
- if(ALCH_Q == 3) goto L_Test3;
- if(ALCH_Q == 4) goto L_Test4;
- if(ALCH_Q == 5) goto L_Test5;
- if(ALCH_Q == 6) goto L_Test6;
- if(ALCH_Q == 7) goto L_GoChange;
- mes "Welcome to the Alchemist Union.";
- mes "How may i help you?";
- next;
- menu "I would like to learn about Alchemy",-, "I want to become an Alchemist.",L_Start, "Nothing.",M_End;
-
- mes "[Parmry Gianino]";
- mes "Alchemists study and create new materials using a variety of existing substances.";
- mes "They research the atoms of chemicals, and experiment to change the properties of the chemicals.";
- next;
- mes "[Parmry Gianino]";
- mes "Most people think the final goal is to create gold, but that's not the entire truth.";
- mes "They make anything from simple medicines, to new materials.";
- next;
- mes "[Parmry Gianino]";
- mes "At times, some research the creation of life .... but that's considered god's territory...";
- mes "That field is so complex, everyone simply researhes for now.";
- next;
- mes "[Parmry Gianino]";
- mes "If you are interested in becoming an Alchemist, I recommend that you gain a lot experience as a Merchant.";
- mes "Being a merchant is a great opportunity to learn about materials while you deal with them.";
- next;
- mes "[Parmry Gianino]";
- mes "Only you can decide for yourself.";
- mes "The road to becoming an Alchemist is very challenging.";
- mes "You will need to focus on experimenting and researching rather than trade.";
- close;
- M_End:
- mes "[Parmry Gianino]";
- mes "Umm... Please say something if you need anything.";
- close;
-L_Start:
- mes "[Parmry Gianino]";
- if(JobLevel < 40) goto L_LowLvl;
- mes "Is that so? My name is Parmry Gianino of the Alchemist Association.";
- mes "Nice to meet you.";
- next;
- mes "[Parmry Gianino]";
- mes "If you join our Union and pass some training you will be officially recognized,";
- mes "as an Alchemist and be able to join our researches.";
- next;
- mes "[Parmry Gianino]";
- mes "But we dont accept everyone.";
- mes "You must have a lot of effort, tenacity, and be able to devote yourself to research.";
- next;
- mes "[Parmry Gianino]";
- mes "There are a couple of requirements to join the association....";
- mes "but we'll discuss that after you apply.";
- next;
- mes "[Parmry Gianino]";
- mes "Then, would you like to apply to register?";
- next;
- menu "I would like to apply.",M_Apply,"I'll do it later.",-;
-
- mes "[Parmry Gianino]";
- mes "If you are a talented Merchant,";
- mes "you are always welcome here.";
- mes "Come again soon.";
- close;
- M_Apply:
- mes "[Parmry Gianino]";
- mes "Fill out this application form please.....";
- next;
- mes "(you fill out the form and hand it back)";
- next;
- mes "[Parmry Gianino]";
- mes "Very good. In order to join the Alchemist Union you must first pay a ^5533FF50,000^000000 zeny membership fee.";
- mes "You will also need to bring us a few items as well.";
- next;
- mes "[Parmry Gianino]";
- mes "Of course if you bring us an ^5533FFOld Magic Book^000000 and an ^5533FFHammer of Blacksmith^000000...";
- mes "You won't have to pay the fee.";
- next;
- mes "[Parmry Gianino]";
- mes "Let's see.... you'll need to bring us....^5533FF100 Mini Furnaces^000000.";
- mes "Once you have the Mini Furnaces come back and see me.";
- next;
- mes "[Parmry Gianino]";
- mes "When you come back I will also collect the ^5533FF50,000^000000 zeny fee so don't forget about that either.";
- mes "See you soon...";
- set ALCH_Q,1;
- close;
-L_LowLvl:
- mes "You must be at least Job Level 40 to become a Alchemist.";
- close;
-
-L_Check:
- mes "Oh, your back already... lets see....";
- next;
- mes "[Parmry Gianino]";
- if(countitem(612) < 100) goto L_NoItems;
- if(countitem(1005) > 0 && countitem(1006) > 0) goto L_Skip;
- if(zeny < 50000) goto L_NoZeny;
- set zeny,zeny - 50000;
- delitem 612, 100;
- mes "You have 50,000 zeny...... You brought 100 mini furnaces.... Great!";
- mes "Now you are ready to learn the basics of being an Alchemist.";
- next;
-
- L_Cont:
- mes "[Parmry Gianino]";
- mes "But before that... ^5533FFRasputin^000000 wants to see you.....";
- mes "Hmm..... I'm not sure what it could be about....";
- next;
- mes "[Parmry Gianino]";
- mes "You should go visit him now. Just go down those stairs to my right. His room is in the SouthEastern corner.";
- set ALCH_Q,2;
- close;
-
- L_NoZeny:
- mes "You still need to pay the ^FF553350,000^000000 zeny membership fee.";
- mes "Let me know when you have enough money.";
- close;
- L_NoItems:
- mes "As I mentioned before, you must bring ^FF3355100 Mini Furnaces^000000 to join the union.";
- mes "Please come back when you are ready...";
- close;
-L_Skip:
- mes "Oh, you have an ^5533FFOld Magic Book^000000 and an ^5533FFHammer of Blacksmith^000000........";
- mes "That means you don't have to pay the membership fee.";
- next;
- mes "[Parmry Gianino]";
- mes "Excellent. Now I'll just take the Book, Hammer, 100 mini furnaces, and you'll be all set to learn the basics of being an Alchemist.";
- next;
- delitem 1005,1;
- delitem 1006,1;
- delitem 612, 100;
- goto L_Cont;
-
-L_Test2:
- mes "Go visit ^5533FFRasputin^000000 now!";
- close;
-L_Test3:
- mes "Go visit ^5533FFDarwin^000000 now!";
- close;
-L_Test4:
- mes "Go visit ^5533FFVan Helmont^000000 now!";
- close;
-L_Test5:
- mes "Go visit ^5533FFNicholas Flamel^000000 now!";
- close;
-L_Test6:
- mes "Go back to ^5533FFNicholas Flamel^000000 now!";
- mes "He still has one more test for you.";
- close;
-L_GoChange:
- mes "Wow you finished all of the tests? Great now you can visit the Headmaster, ^5533FFVincent Carsciallo^000000.";
- mes "He's the one who will change you into an Alchemist.";
- close;
-}
-
-
-//==================================================================================================//
-// 2nd Test: Math test :(
-//==================================================================================================//
-alde_alche.gat,175,107,4 script Rasputin Gregory 749,{
- mes "[Rasputin Gregory]";
- if(baseJob == Job_Merchant) goto L_Merc;
- mes "What is it, kikikiki. Are you curious about what I do...?";
- mes "I'll just especially let you know. You see I... Kekeke..";
- next;
- mes "[Rasputin Gregory]";
- mes "Am researching! Once this potion is complete... you will be able to take over an entire country!!";
- next;
- mes "[Rasputin Gregory]";
- mes "Kikikikikekekekek. It's a secret to the people of Prontera.....";
- close;
-L_Merc:
- if(ALCH_Q == 2) goto L_Start;
- if(ALCH_Q == 3) goto L_Done;
- mes "Kikikikikekekekeke.";
- mes "What is it! You punk.";
- next;
- mes "[Rasputin Gregory]";
- mes "A Merchant should go and set up a shop...";
- mes "Why'd you come to a place like this!?";
- mes "Are you looking for something to scab off?";
- next;
- mes "[Rasputin Gregory]";
- mes "Kikiki... Go, leave this place.";
- mes "Dont loiter ... Kekeke.";
- close;
-L_Start:
- if(ALCH_Q2 == 1) goto L_ReTest;
- if(JobLevel == 50) goto L_Skip;
- mes "Keke, another dumb one has stumbled into here.";
- mes "Join the Union?";
- next;
- mes "[Rasputin Gregory]";
- mes "I don't like it... I just don't...!";
- mes "Everywhere, all joining and being called Alchemist just for knowing how to mix herbs!!!";
- next;
- mes "[Rasputin Gregory]";
- mes "Kikiki, so for that reason an interview is necessary!";
- mes "I plan on scolding all the incompetent ones and chasing them away!!";
- next;
- mes "[Rasputin Gregory]";
- mes "You look dumb founded. It must be pretty crazy.";
- mes "If you were thinking of just changing clothes you thought wrong... Kekeke..";
- next;
- mes "[Rasputin Gregory]";
- mes "Now try solving the problems I give you.";
- mes "We'll see how smart you are.";
- next;
- set @score,0;
-
- //set of question 1
- q1:
- mes "[Rasputin Gregory]";
- mes "12+23+34+45 =?";
- next;
- input @num;
- if(@num == 114) set @score,@score+10;
- q2:
- mes "[Rasputin Gregory]";
- mes "1000-36-227-348 =?";
- next;
- input @num;
- if(@num == 389) set @score,@score+10;
- q3:
- mes "[Rasputin Gregory]";
- mes "9765/3/5/7 =?";
- next;
- input @num;
- if(@num == 93) set @score,@score+10;
- q4:
- mes "[Rasputin Gregory]";
- mes "(2646/7) + (13*28) =?";
- next;
- input @num;
- if(@num == 742) set @score,@score+10;
- q5:
- mes "[Rasputin Gregory]";
- mes "With a 24% discount";
- mes "How much are 12 Red Potions,";
- mes "5 Fly Wings, and ";
- mes "1 Butterfly Wing altogether?";
- next;
- input @num;
- if(@num == 909) set @score,@score+10;
- q6:
- mes "[Rasputin Gregory]";
- mes "What is the total weight of 3 ";
- mes "Scimiters,";
- mes "2 Helms and 1 Coat";
- next;
- input @num;
- if(@num == 450) set @score,@score+10;
- q7:
- mes "[Rasputin Gregory]";
- mes "What is the total defense of ";
- mes "a Biretta, Mantle, Opera Mask,";
- mes "Ribbon, ";
- mes "Muffler, Boots, and Ear Muffs?";
- next;
- input @num;
- if(@num == 19) set @score,@score+10;
- q8:
- mes "[Rasputin Gregory]";
- mes "If you buy 5 Helms with a 24%";
- mes "discount ";
- mes "and sell it at 20%, how much do you";
- mes "earn?";
- next;
- input @num;
- if(@num == 1760) set @score,@score+10;
- goto L_Total;
-
-L_ReTest:
- mes "What, you want to take the test again?";
- mes "I thought I told you to leave.";
- next;
- mes "[Rasputin Gregory]";
- mes "Well, I'll let you go this one time...";
- mes "I forgive you ... Kekeke.";
- mes "Do well this time...";
- next;
- mes "[Rasputin Gregory]";
- mes "Now then, answer the question I ask.";
- mes "Let see how smart you are.";
- next;
- set @score,0;
-
- //set of question 2
- q11:
- mes "[Rasputin Gregory]";
- mes "13+25+37+48=?";
- next;
- input @num;
- if(@num == 123) set @score,@score+10;
- q12:
- mes "[Rasputin Gregory]";
- mes "1000-58-214-416 =?";
- next;
- input @num;
- if(@num == 312) set @score,@score+10;
- q13:
- mes "[Rasputin Gregory]";
- mes "12*24*3=?";
- next;
- input @num;
- if(@num == 864) set @score,@score+10;
- q14:
- mes "[Rasputin Gregory]";
- mes "10530/3/5/2=?";
- next;
- input @num;
- if(@num == 351) set @score,@score+10;
- q15:
- mes "[Rasputin Gregory]";
- mes "(35*19) - (1792/7) =?";
- next;
- input @num;
- if(@num == 409) set @score,@score+10;
- q16:
- mes "[Rasputin Gregory]";
- mes "(2368/8) + (24*17) = ?";
- next;
- input @num;
- if(@num == 704) set @score,@score+10;
- q17:
- mes "[Rasputin Gregory]";
- mes "(2646/7) + (13*28)=?";
- next;
- input @num;
- if(@num == 742) set @score,@score+10;
- q18:
- mes "[Rasputin Gregory]";
- mes "If buying at a 24% discount,";
- mes "What is the total price of";
- mes "15 Green Potions,";
- mes "6 Magnifiers and 4 Traps?";
- next;
- input @num;
- if(@num == 934) set @score,@score+10;
- q19:
- mes "[Rasputin Gregory]";
- mes "What is the total weight of ";
- mes "3 Ring Pommel Sabers,";
- mes "4 Caps and 2 Boots?";
- next;
- input @num;
- if(@num == 550) set @score,@score+10;
- q20:
- mes "[Rasputin Gregory]";
- mes "What is the total defense of a ";
- mes "Buckler, Coat, Gas Mask, Big";
- mes "Ribbon, Ribbon, Sakkat and";
- mes "Glasses?";
- next;
- input @num;
- if(@num == 16) set @score,@score+10;
- q21:
- mes "[Rasputin Gregory]";
- mes "How much zeny do you make";
- mes "if you buy Tights at a 24%";
- mes "discount";
- mes "and sell it at 20% of the normal";
- mes "price?";
- next;
- input @num;
- if(@num == 2840) set @score,@score+10;
-L_Total:
- mes "[Rasputin Gregory]";
- if(@score < 80) goto L_Failed;
- set ALCH_Q,3;
- set ALCH_Q2, 0;
- mes "Kikiki... I'll let you go.";
- mes "Do some good research and be of some help to Rasputin... Kikiki!";
- next;
- mes "[Rasputin Gregory]";
- mes "Well then go! ^5533FFGo to Darwin^000000.";
- mes "He'll teach you how to do the experiments.";
- mes "Tell him I sent you.";
- next;
- mes "[Rasputin Gregory]";
- mes "Kikikikekeke.";
- mes "Dont think this is the end of it!";
- close;
-
- L_Failed:
- set ALCH_Q2,1;
- mes "...Kekeke, you idiot,";
- mes "I feel dumb asking you all the question!";
- mes "you got them all wrong!!!";
- next;
- mes "[Rasputin Gregory]";
- mes "How can a person that can't even answer these question think of being an Alchemist!";
- mes "What? did you get any right?";
- next;
- mes "[Rasputin Gregory]";
- mes "Stupid! If you get one wrong everything is wrong for an Alchemist!";
- mes "Go! Leave! Get out of here!";
- close;
-L_Done:
- mes "What are you doing? Leave already.";
- mes "Go to ^5533FFDarwin^000000.";
- mes "He'll teach you how to do the experiments.";
- mes "Tell him I sent you.";
- next;
- mes "[Rasputin Gregory]";
- mes "Kikikikekeke.";
- mes "Dont think this is the end of it!";
- close;
-L_Skip:
- mes "Hmm... you have a pretty high job level..... I'll be nice today and let you pass.";
- mes "Next you should go see ^5533FFDarwin^000000.";
- mes "He'll teach you how to do the experiments.";
- mes "Tell him I sent you.";
- set ALCH_Q,3;
- set ALCH_Q2, 0;
- close;
-}
-
-
-//==================================================================================================//
-// 3rd Test: Mix some medicine
-//==================================================================================================//
-alde_alche.gat,13,15,8 script Darwin 750,{
- mes "[Darwin]";
- if(baseJob == Job_Merchant) goto L_Merc;
-L_Other:
- mes "more to lose or gain...";
- mes "It's always like that...";
- next;
- mes "[Darwin]";
- mes "All I can see through my cursed eyes";
- mes "are illusions from the past,";
- mes "Ahahahaha...";
- next;
- mes "[Darwin]";
- mes "There's no such thing as paradise ... is there ?";
- mes "My love Harmona.... Aah....";
- close;
-
-L_Merc:
- if(ALCH_Q == 3) goto L_Start;
- if(ALCH_Q == 4) goto L_Done;
- goto L_Other;
-
-L_Start:
- if(ALCH_Q2 == 1) goto L_Check;
- mes "...........";
- mes ".........";
- mes "....Who is it...";
- next;
- mes "[Darwin]";
- mes "A wolf? Or a human...";
- mes "You must be looking for something as well.";
- next;
- mes "[Darwin]";
- mes "If you have something precious, be careful.";
- mes "You may lose something else while while going after another...";
- next;
- mes "[Darwin]";
- mes "..........";
- next;
- mes "[Darwin]";
- mes "... but what brings you here.";
- mes "Coming to a place like this.";
- next;
- menu "I want to learn how to experiment.",M_Exp, "Tell me more about flowers.",M_Flow;
-
- M_Flow:
- mes "[Darwin]";
- mes ".......";
- mes "......";
- mes "...think about your precious things...";
- next;
- mes "[Darwin]";
- mes ".... There is a flower that I faintly remember....";
- next;
- mes "[Darwin]";
- mes "I divulged into researching one thing.....";
- mes "for the one I love...";
- next;
- mes "[Darwin]";
- mes "Lets just say that it was about the relationship between wolf and flowers...";
- mes "I wont tell you the details.";
- next;
- mes "[Darwin]";
- mes "But yes ... it was a flower.";
- mes "with its shine, it was said to let you see paradise Illusion Flower...";
- next;
- mes "[Darwin]";
- mes "I made a homunculus.";
- mes "Nobody believe me. that I made life from a flower!!!";
- mes "My research!";
- next;
- mes "[Darwin]";
- mes "But now, I have nothing left..";
- mes "It's all over.";
- mes "Time has stopped at that moment in my life...";
- next;
- mes "[Darwin]";
- mes "Aag... Harmona, in the beautiful fields of flowers,";
- mes "where have you gone....";
- close;
- M_Exp:
- mes "[Darwin]";
- mes "You want to learn Alchemy...";
- mes "All the knowledge I possess..";
- mes "I made to make my dreams come true...";
- next;
- mes "[Darwin]";
- mes "I'll teach you the basics...";
- mes "but you must determine your own wishes.";
- next;
- mes "[Darwin]";
- mes "So, here are the basics.";
- mes "This is how you make simple medicine...";
- mes "Prepare some stuff...";
- next;
- mes "[Darwin]";
- mes "^5533FF3 Medicine Bowls";
- mes "3 Empty Bottles";
- mes "1 Red Herb";
- mes "1 Yellow Herb";
- mes "1 White Herb^000000";
- next;
- mes "[Darwin]";
- mes "Once you have prepared all the items... come here.";
- set ALCH_Q2, 1;
- close;
-
-L_Check:
- mes "...........";
- mes ".........";
- mes "...Who is it....";
- next;
- mes "[Darwin]";
- mes "Ah You're the one that wants to learn Alchemy...";
- mes "So did you prepare everything?";
- next;
- if(countitem(7134) < 3 || countitem(713) < 3 || countitem(507) < 1 || countitem(508) < 1 || countitem(509) < 1) goto L_NotEnuf;
- delitem 7134,3;
- delitem 713,3;
- delitem 507,1;
- delitem 508,1;
- delitem 509,1;
- mes "[Darwin]";
- mes "Seems like you have everything ready.";
- mes "As i promised, I'll teach you how to make medicine";
- next;
- mes "[Darwin]";
- mes "First, prepare the Medicine Bowl then put the Herbs inside like this.";
- mes "And you slowly crush them.";
- next;
- mes "[Darwin]";
- mes "Pour small amounts of clean water and stirr until it become thick, ";
- mes "then add some more Herbs.";
- next;
- mes "[Darwin]";
- mes "That's how you make it if you think you have enough, ";
- mes "gently pour it into an empty bottle";
- next;
- mes "[Darwin]";
- mes "There you go, its complete.";
- mes "This time, do as I showed you.";
- mes "It should be easy since its so simple.";
- next;
- mes "[Darwin]";
- mes "... even though you don't have one?";
- next;
- set @score,0;
- menu "Prepare the medicine bowl",-, "Wear the medicine bowl on the head",M_0, "Kick the medicine bowl",M_0;
-
- set @score,@score+10;
- M_0:
-
- menu "Put the sand into the medicine bowl",M_1, "Put the herbs into the medicine bowl",-, "Put the harp into the medicine bowl",M_1;
-
- set @score,@score+10;
- M_1:
-
- menu "Smash the herbs",-, "Smash the medicine bowl",M_2, "Smash the Tarosia's foots",M_2;
-
- set @score,@score+10;
- M_2:
-
- menu "Spray the water",M_3, "Drink the water",M_3, "Pour in the water",-;
-
- set @score,@score+10;
- M_3:
-
- menu "Continue to smash the herbs",-, "Continues to eat the herbs",M_4, "Continues to dance and sing",M_4;
-
- set @score,@score+10;
- M_4:
-
- menu "Put in the noodles and fry it",M_5, "Put into the Empty Bottle",-, "Raise the medicine bowl and drink it",M_5;
-
- set @score,@score+10;
- M_5:
-
- mes "[Darwin]";
- if(@score < 60) goto L_Failed;
- mes "... Good job. It came out prettywell considering it's your first time...";
- mes "As a souvenier, take these.";
- getitem 501,1;
- getitem 503,1;
- getitem 504,1;
- set ALCH_Q,4;
- set ALCH_Q2,0;
- next;
- mes "[Darwin]";
-L_Done:
- mes "Go to ^5533FFVan Helmont^000000 in the next room...";
- mes "He'll teach you more details.";
- mes "Go learn from him.";
- next;
- mes "[Darwin]";
- mes "Don't forget...";
- mes "You must protect what is trully precious to you.....";
- close;
-
- L_Failed:
- mes "... You messed up all the ingredients.";
- mes "... Go bring some more.";
- close;
-L_NotEnuf:
- mes "[Darwin]";
- mes "...You must've forgotten the materials to bring.";
- mes "I'll tell you again.";
- mes "Dont forget them this time.";
- next;
- mes "[Darwin]";
- mes "^5533FF3 Medicine Bowls";
- mes "3 Empty Bottles";
- mes "1 Red Herb";
- mes "1 Yellow Herb";
- mes "1 White Herb^000000";
- next;
- mes "[Darwin]";
- mes "Come back when you are ready...";
- close;
-}
-
-
-//==================================================================================================//
-// 4th Test: Learn from Morgenstein
-//==================================================================================================//
-alde_alche.gat,79,19,4 script Van Helmont 748,{
- mes "[Van Helmont]";
- if(baseJob == Job_Merchant) goto L_Merc;
-L_Other:
- mes "Just a little ... yes, a little bit more ....";
- mes "agh, just a little bit more and it would've been done!";
- next;
- mes "[Van Helmont]";
- mes "Why, why another failure!!!";
- mes "Nothing was wrong!";
- mes "Why! Why!";
- next;
- mes "[Van Helmont]";
- mes "Does that mean I have to get more materials...";
- mes "But I should be able to complete it one day....Heeh...";
- close;
-L_Merc:
- if(ALCH_Q == 4) goto L_Start;
- if(ALCH_Q == 5) goto L_Done;
- goto L_Other;
-L_Start:
- if(ALCH_Q2 == 1) goto L_Check;
- mes "Arrrrgh... Why does this formula just stop... What's wrong.";
- mes "Theoretically it's all correct...";
- mes "I'm sure it's because there is an error in the formula";
- mes "somewhere...";
- next;
- mes "[Van Helmont]";
- mes "That's it, I pour it here and it should stop... but this is the formula that solution doesn't stop flowing.";
- mes " How could I make such a stupid mistake... when did I switch these...";
- next;
- mes "[Van Helmont]";
- mes "Yes, that's it. I just need to fix this part.";
- mes "No need to start over.";
- mes "I just have to fix it...";
- mes "....But, wait. wait.";
- next;
- mes "[Van Helmont]";
- mes ".....................";
- next;
- mes "[Van Helmont]";
- mes "....Who are you?";
- next;
- menu "I want to become an Alchemist.",-,".....",M_Bye;
-
- mes "[Van Helmont]";
- mes "Oh, I see....";
- mes "Haha you want to learn Alchemy in world like this, what a funny merchant... hmmm.";
- next;
- mes "[Van Helmont]";
- mes "Well, that's nice, but I have a very urgent experiment I must tend to.";
- mes "So don't get in the way.";
- next;
- menu "Teach me something.",-,"..........",M_Bye;
-
- mes "[Van Helmont]";
- mes "Argh... didn't I just tell you not to bother me?";
- mes "Why can't you understand when I say something!";
- next;
- mes "[Van Helmont]";
- mes "Ok, I'll give you an assignment.";
- mes "Go study and come back. Let's see.";
- mes "What would be good... Hmm...";
- next;
- mes "[Van Helmont]";
- mes "Oh, I got it. Go learn from ^5533FFMorgenstein^000000. Learn how to make a ^009500Counteragent^000000 and ^FF3355Mixture^000000.";
- mes "You can find him in ^5533FFGeffen^000000.";
- next;
- mes "[Van Helmont]";
- mes "You don't need to bring what you made. But just go watch how he makes medicine and stuff.";
- mes "Got it?";
- next;
- mes "[Van Helmont]";
- mes "Well then, see you later.";
- mes "You'd be best off going as soon as you can.";
- set ALCH_Q2,1;
- close;
- M_Bye:
- mes "[Van Helmont]";
- mes "If you dont have business here just go away. Ok!!!";
- close;
-L_Check:
- if((MISC_QUEST & 4)==0) goto L_NotRdy; //this's a Morgenstein Quest check
- mes "Yes, cut the Tentacle..";
- mes "and mix some Sticky Mucus,";
- mes "Jellopy solution in the test tube Darn, where did the Medicine Bowl go...";
- next;
- mes "[Van Helmont]";
- mes "Did I use them all.. At a time like this, grrr. I wonder if Nicholas has any left.";
- mes "Ganfunnit... what a pain.";
- mes "....but, wait. wait.";
- next;
- mes "[Van Helmont]";
- mes "Ah, you're that merchant from before. So.. did you learn anything?";
- mes "I didn't send you there to play.";
- next;
- mes "[Van Helmont]";
- mes "Let me ask you a couple of questions. Answer how you heard and learned.";
- next;
- set @score,0;
-
- Q_1a:
- mes "[Van Helmont]";
- mes "What item is required to form the Counteragent?";
- next;
- menu "Feather",-,"Sticky Mucus",-,"Animal Blood",-;
-
- Q_1b:
- mes "[Van Helmont]";
- mes "Which of the following item is not required in forming the Counteragent?";
- next;
- menu "Karvodailnirol",-,"Detrimindexta",Q_2a,"Alchol",Q_2a;
-
- set @score,@score+10;
-
- Q_2a:
- mes "[Van Helmont]";
- mes "What item is required to form the Mixture?";
- next;
- menu "Monster's Feed",-,"Lip of Ancient Fish",-,"Rotten Bandage",-;
-
- Q_2b:
- mes "[Van Helmont]";
- mes "Which of the following item is not required in the process of forming the Mixture?";
- next;
- menu "Karvodailnirol",L_Result,"Detrimindexta",-,"Alchol",L_Result;
-
- set @score,@score+10;
-
-L_Result:
- mes "[Van Helmont]";
- if(@score < 20) goto L_Failed;
- mes "Hmm, you learned well. Ok, now you know some stuff about medicine?";
- mes "Eh?";
- mes "I know, you must have a lot to say but let me continue with my experiment.";
- next;
- mes "[Van Helmont]";
- mes "Go out and to the room next to here. ^5533FFNicholas^000000 probably has more to teach you than me.";
- set ALCH_Q,5;
- set ALCH_Q2,0;
- close;
-
- L_Failed:
- mes "...Be honest. You don't know,";
- mes "do you? I thought I told you to go learn from Morgenstein...";
- next;
- mes "[Van Helmont]";
- mes "Don't even think about coming back before you've learned for sure!";
- mes "Stop bothering me and leave!";
- close;
-L_NotRdy:
- mes "Didn't I tell you to visit Morgenstein in Geffen!?!";
- mes "He is a wise man! You should go to him!";
- close;
-L_Done:
- mes "What are you doing? Go out and to the room next to here. ^5533FFNicholas^000000 probably has more to teach you than me.";
- mes "I have no more business with you.";
- close;
-
-}
-
-
-//==================================================================================================//
-// Test 5 & 6: Word Scramble, Help the Baijin Bros.
-//==================================================================================================//
-alde_alche.gat,145,19,4 script Nicholas Flamel 57,{
- mes "[Nicholas Flamel]";
- if(baseJob == Job_Merchant) goto L_Merc;
-L_Other:
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
- mes "Vivamus sem. Sed metus lacus, viverra id, rutrum eget, rhoncus sit amet, lectus.";
- mes "Suspendisse sit amet urna in nisl frigilla faucibus.";
- mes "Nulla scelerisque eros....";
- mes "......mumblemumble........";
- close;
-L_Merc:
- if(ALCH_Q == 5) goto L_Start;
- if(ALCH_Q == 6) goto L_Start2;
- if(ALCH_Q == 7) goto L_Done;
- goto L_Other;
-L_Start:
- if(ALCH_Q2 == 1) goto L_ReTest;
- mes "Ooh... you're the Merchant that wants to become an Alchemist?";
- mes "But you know... not anyone can become an Alchemist.";
- next;
- mes "[Nicholas Flamel]";
- mes "The Union doesn't like those that just want to become Alchemist without a clear goal.";
- mes "So... to see if you qualify, I'll test how smart you are.";
- next;
- mes "[Nicholas Flamel]";
- mes "As you can see, Alchemist must memorize many equations,";
- mes "chemical equations and a lot of other information.";
- mes "If you're not at a certain level..";
- mes "it's actually pretty tough.";
- next;
- mes "[Nicholas Flamel]";
- mes "The idea is to prevent those that are going to be useless Alchemists from joining the union!";
- next;
- mes "[Nicholas Flamel]";
- mes "Ok... Here go the questions!";
- mes "This is to test your concentration so that you won't get confused when looking at charts.";
- next;
- mes "[Nicholas Flamel]";
- mes "Find the words from the group of letters. They can be made by using some or all the letters given";
- next;
- mes "[Nicholas Flamel]";
- mes "You pass if you choose the word that is 'IN' the puzzle.";
- next;
-
- Q_1:
- set @score,0;
- mes "[Nicholas Flamel]";
- mes "s m i e x b w u n e n t a g l r";
- next;
- menu "tiger",-,"wolf",Q_2,"pumpkin",Q_2,"tripped",Q_2;
-
- set @score,@score+10;
-
- Q_2:
- mes "[Nicholas Flamel]";
- mes "n i e g b o p d s o a u w r v";
- next;
- menu "bash",Q_3,"provoke",Q_3,"endure",-,"stun",Q_3,"abracadabra",Q_3;
-
- set @score,@score+10;
-
- Q_3:
- mes "[Nicholas Flamel]";
- mes "l r m g r e x t a v i n e d e";
- next;
- menu "alberta",Q_4,"latifoliate",Q_4,"crimson",Q_4,"maple",Q_4,"evergreen",-;
-
- set @score,@score+10;
-
- Q_4:
- mes "[Nicholas Flamel] ";
- mes "r o e h n r o m c a i n p t t";
- next;
- menu "forgemerchant",L_Score,"potionmerchant",-,"dcmerchant",L_Score,"vendingmerchant",L_Score;
-
- set @score,@score+10;
-L_Score:
- if(@score < 40) goto L_Failed;
- set ALCH_Q,6;
- set ALCH_Q2,0;
- mes "[Nicholas Flamel]";
- mes "You seem to be done.";
- next;
- mes "[Nicholas Flamel]";
- mes "Let's see.";
- mes "...Good job. Excellent.";
- next;
- mes "[Nicholas Flamel]";
- mes "Somehow you found all of them.";
- mes "With that kind of concentration, you should easily be able to read the medicine dictionaries.";
- mes "Let's see... next is..";
- next;
- mes "[Nicholas Flamel]";
- mes "Come back in a little bit. Get organized too..";
- close;
-
- L_Failed:
- mes "[Nicholas Flamel]";
- mes "Hmmm... You failed!";
- mes "Get your glasses maybe you can pass next time wearing those.";
- set ALCH_Q2,1;
- close;
-L_ReTest:
- mes "Hmmm you returned.";
- mes "Well will see if you changed.";
- next;
- goto Q_1;
-
-L_Start2:
- if(ALCH_Q2 > 0) goto L_Check2;
- mes "Next, you have to go somewhere.";
- mes "Go to ^5533FF'The Forgotten City of Yuno'^000000 and meet the ^FF3355Bain and Bajin^000000 brothers who are researching alchemy with the Sages there.";
- next;
- mes "[Nicholas Flamel]";
- mes "Go help out and come back Here, take these... it will help you get close to them.";
- next;
- getitem 974,1;
- getitem 7068,5;
- getitem 7043,5;
- getitem 756,3;
- getitem 757,3;
- mes "[Nicholas Flamel]";
- mes "1 Mixture";
- mes "5 Burnt Tree";
- mes "5 Fine Sand ";
- mes "3 Rough Oridecon ";
- mes "3 Rough Elunium";
- set ALCH_Q2,1;
- next;
- mes "[Nicholas Flamel]";
- mes "Have a safe trip.";
- mes "It's Yuno. Come back in one piece.";
- close;
-L_Check2:
- if(ALCH_Q2 < 2) goto L_NotDone;
- set ALCH_Q, 7;
- set ALCH_Q2, 0;
- mes "Ooh! Well done on such a long trip.";
- mes "I got a message saying that the Bain and Bajin brothers were happy about your visit.";
- next;
- mes "[Nicholas Flamel]";
- mes "You must have successfully helped them.";
- mes "If you're good enough to be of help to the brothers... ok, I think you qualify.";
- next;
- mes "[Nicholas Flamel]";
-L_Done:
- mes "Go to the Union Leader on the 2nd floor!";
- mes "Congratulations. You'll change jobs soon!";
- close;
-
- L_NotDone:
- mes "Bain and Bajin brothers are in Yuno go help them.";
- close;
-
-}
-
-
-//==================================================================================================//
-// Job Changer
-//==================================================================================================//
-alde_alche.gat,101,184,4 script Vincent Carsciallo 122,{
- mes "[Vincent Carsciallo]";
- if(baseJob == Job_Merchant) goto L_Merc;
- if(baseJob == Job_Alchem){
- mes "How Alchemy going? Make sure to be carefull and think about safety at all times.";
- mes "I wouldn't want you blowing yourself up or anything.....";
- close;
- }
- mes "Hmmm? What may a civilian have to do here?";
- next;
- mes "[Vincent Carsciallo]";
- mes "There's nothing amusing. Dont wander and leave.";
- close;
-L_Merc:
- if(ALCH_Q == 7) goto L_Change;
- mes "Hmmm? A merchant.";
- mes "Are you interested in Alchemy?";
- next;
- mes "[Vincent Carsciallo]";
- mes "This is the Alchemist Union.";
- mes "We research many different substances.";
- mes "Our goal is to make something new without the power of magic.";
- next;
- mes "[Vincent Carsciallo]";
- mes "Create new life, and study how to live long and not die ...";
- mes "We also make new materials out of existing ones...";
- mes "These are just some of the things we do.";
- next;
- mes "[Vincent Carsciallo]";
- mes "After being a Merchant for a long time ";
- mes "you start to become interested in everything.";
- mes "If you would like to learn Alchemy as well,";
- mes "try joining our Union.";
- close;
-L_Change:
- if(skillpoint){
- mes "Please use all your skill point before talking to me.";
- close;
- }
- mes "Oh, Ok. You joined and learned the basics, too. Well done.";
- next;
- callfunc "Job_Change",Job_Alchem;
- callfunc "F_ClearJobVar";
- emotion e_grat;
- mes "[Vincent Carsciallo]";
- mes "From now on, you are also a member of the Union as an Alchemist.";
- mes "I hope you learn a lot...";
- next;
- getitem 7127,1;
- mes "[Vincent Carsciallo]";
- mes "Here's a little something. ";
- mes "Use it to start off with some research.";
- next;
- mes "[Vincent Carsciallo]";
- mes "I'll see you later then...";
- mes "Be proud of being an Alchemist!";
- close;
-}
+//===== eAthena Script =======================================
+//= Alchemist Job Quest
+//===== By: ==================================================
+//= nestor_zulueta (Fusion), converted by Darkchild
+//===== Current Version: =====================================
+//= 2.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Alchemist job quest based off of official iRO quest.
+//===== Additional Comments: =================================
+//= v1.0 Working.
+//= npc/quests/counteragent_mixture.txt Also Needed
+//= npc/quests/quests_yuno.txt Also Needed [Darkchild]
+//= v1.1 Fixed some minor bugs. Optimized some lines. Re-organized the script a bit.
+//= Giving Parmry NPC, Hammer and Old Book now waves the 50000 fee. (based of mRO website)
+//= Having a joblvl of 50 allows you to skip Rasputin's test. (based of mRO website) [kobra_k88]
+//= 1.2 fixed a few typos (have to hunt more) [Lupus]
+//= 1.3 Added Baby Class Support [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 1.6a fixed some wrong answers, thanks to zlider for info [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.2 Got rid of 'al_morgen' var. Now uses (MISC_QUEST & 4) [Lupus]
+//= 2.3 Optimized, changed job numbers to constants. Fixed some spelling [Lupus]
+//============================================================
+
+
+//==================================================================================================//
+// Registration and First Test
+//==================================================================================================//
+alde_alche.gat,27,185,4 script Parmry Gianino 744,{
+ callfunc "F_BlockHigh",Job_Merchant_High,"Merchant High",Job_Creator,"Creator","Parmry Gianino";
+
+ mes "[Parmry Gianino]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+ if(baseJob == Job_Alchem){
+ mes "Hey there fellow Alchemist. How's the business going? Good I hope, well good luck to you.";
+ close;
+ }
+ mes "Welcome to the Alchemist Union. Ah, I apologize but I'm busy right now.";
+ close;
+L_Merc:
+ if(ALCH_Q == 1) goto L_Check;
+ if(ALCH_Q == 2) goto L_Test2;
+ if(ALCH_Q == 3) goto L_Test3;
+ if(ALCH_Q == 4) goto L_Test4;
+ if(ALCH_Q == 5) goto L_Test5;
+ if(ALCH_Q == 6) goto L_Test6;
+ if(ALCH_Q == 7) goto L_GoChange;
+ mes "Welcome to the Alchemist Union.";
+ mes "How may i help you?";
+ next;
+ menu "I would like to learn about Alchemy",-, "I want to become an Alchemist.",L_Start, "Nothing.",M_End;
+
+ mes "[Parmry Gianino]";
+ mes "Alchemists study and create new materials using a variety of existing substances.";
+ mes "They research the atoms of chemicals, and experiment to change the properties of the chemicals.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Most people think the final goal is to create gold, but that's not the entire truth.";
+ mes "They make anything from simple medicines, to new materials.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "At times, some research the creation of life .... but that's considered god's territory...";
+ mes "That field is so complex, everyone simply researhes for now.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "If you are interested in becoming an Alchemist, I recommend that you gain a lot experience as a Merchant.";
+ mes "Being a merchant is a great opportunity to learn about materials while you deal with them.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Only you can decide for yourself.";
+ mes "The road to becoming an Alchemist is very challenging.";
+ mes "You will need to focus on experimenting and researching rather than trade.";
+ close;
+ M_End:
+ mes "[Parmry Gianino]";
+ mes "Umm... Please say something if you need anything.";
+ close;
+L_Start:
+ mes "[Parmry Gianino]";
+ if(JobLevel < 40) goto L_LowLvl;
+ mes "Is that so? My name is Parmry Gianino of the Alchemist Association.";
+ mes "Nice to meet you.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "If you join our Union and pass some training you will be officially recognized,";
+ mes "as an Alchemist and be able to join our researches.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "But we dont accept everyone.";
+ mes "You must have a lot of effort, tenacity, and be able to devote yourself to research.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "There are a couple of requirements to join the association....";
+ mes "but we'll discuss that after you apply.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Then, would you like to apply to register?";
+ next;
+ menu "I would like to apply.",M_Apply,"I'll do it later.",-;
+
+ mes "[Parmry Gianino]";
+ mes "If you are a talented Merchant,";
+ mes "you are always welcome here.";
+ mes "Come again soon.";
+ close;
+ M_Apply:
+ mes "[Parmry Gianino]";
+ mes "Fill out this application form please.....";
+ next;
+ mes "(you fill out the form and hand it back)";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Very good. In order to join the Alchemist Union you must first pay a ^5533FF50,000^000000 zeny membership fee.";
+ mes "You will also need to bring us a few items as well.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Of course if you bring us an ^5533FFOld Magic Book^000000 and an ^5533FFHammer of Blacksmith^000000...";
+ mes "You won't have to pay the fee.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Let's see.... you'll need to bring us....^5533FF100 Mini Furnaces^000000.";
+ mes "Once you have the Mini Furnaces come back and see me.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "When you come back I will also collect the ^5533FF50,000^000000 zeny fee so don't forget about that either.";
+ mes "See you soon...";
+ set ALCH_Q,1;
+ close;
+L_LowLvl:
+ mes "You must be at least Job Level 40 to become a Alchemist.";
+ close;
+
+L_Check:
+ mes "Oh, your back already... lets see....";
+ next;
+ mes "[Parmry Gianino]";
+ if(countitem(612) < 100) goto L_NoItems;
+ if(countitem(1005) > 0 && countitem(1006) > 0) goto L_Skip;
+ if(zeny < 50000) goto L_NoZeny;
+ set zeny,zeny - 50000;
+ delitem 612, 100;
+ mes "You have 50,000 zeny...... You brought 100 mini furnaces.... Great!";
+ mes "Now you are ready to learn the basics of being an Alchemist.";
+ next;
+
+ L_Cont:
+ mes "[Parmry Gianino]";
+ mes "But before that... ^5533FFRasputin^000000 wants to see you.....";
+ mes "Hmm..... I'm not sure what it could be about....";
+ next;
+ mes "[Parmry Gianino]";
+ mes "You should go visit him now. Just go down those stairs to my right. His room is in the SouthEastern corner.";
+ set ALCH_Q,2;
+ close;
+
+ L_NoZeny:
+ mes "You still need to pay the ^FF553350,000^000000 zeny membership fee.";
+ mes "Let me know when you have enough money.";
+ close;
+ L_NoItems:
+ mes "As I mentioned before, you must bring ^FF3355100 Mini Furnaces^000000 to join the union.";
+ mes "Please come back when you are ready...";
+ close;
+L_Skip:
+ mes "Oh, you have an ^5533FFOld Magic Book^000000 and an ^5533FFHammer of Blacksmith^000000........";
+ mes "That means you don't have to pay the membership fee.";
+ next;
+ mes "[Parmry Gianino]";
+ mes "Excellent. Now I'll just take the Book, Hammer, 100 mini furnaces, and you'll be all set to learn the basics of being an Alchemist.";
+ next;
+ delitem 1005,1;
+ delitem 1006,1;
+ delitem 612, 100;
+ goto L_Cont;
+
+L_Test2:
+ mes "Go visit ^5533FFRasputin^000000 now!";
+ close;
+L_Test3:
+ mes "Go visit ^5533FFDarwin^000000 now!";
+ close;
+L_Test4:
+ mes "Go visit ^5533FFVan Helmont^000000 now!";
+ close;
+L_Test5:
+ mes "Go visit ^5533FFNicholas Flamel^000000 now!";
+ close;
+L_Test6:
+ mes "Go back to ^5533FFNicholas Flamel^000000 now!";
+ mes "He still has one more test for you.";
+ close;
+L_GoChange:
+ mes "Wow you finished all of the tests? Great now you can visit the Headmaster, ^5533FFVincent Carsciallo^000000.";
+ mes "He's the one who will change you into an Alchemist.";
+ close;
+}
+
+
+//==================================================================================================//
+// 2nd Test: Math test :(
+//==================================================================================================//
+alde_alche.gat,175,107,4 script Rasputin Gregory 749,{
+ mes "[Rasputin Gregory]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+ mes "What is it, kikikiki. Are you curious about what I do...?";
+ mes "I'll just especially let you know. You see I... Kekeke..";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Am researching! Once this potion is complete... you will be able to take over an entire country!!";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Kikikikikekekekek. It's a secret to the people of Prontera.....";
+ close;
+L_Merc:
+ if(ALCH_Q == 2) goto L_Start;
+ if(ALCH_Q == 3) goto L_Done;
+ mes "Kikikikikekekekeke.";
+ mes "What is it! You punk.";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "A Merchant should go and set up a shop...";
+ mes "Why'd you come to a place like this!?";
+ mes "Are you looking for something to scab off?";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Kikiki... Go, leave this place.";
+ mes "Dont loiter ... Kekeke.";
+ close;
+L_Start:
+ if(ALCH_Q2 == 1) goto L_ReTest;
+ if(JobLevel == 50) goto L_Skip;
+ mes "Keke, another dumb one has stumbled into here.";
+ mes "Join the Union?";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "I don't like it... I just don't...!";
+ mes "Everywhere, all joining and being called Alchemist just for knowing how to mix herbs!!!";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Kikiki, so for that reason an interview is necessary!";
+ mes "I plan on scolding all the incompetent ones and chasing them away!!";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "You look dumb founded. It must be pretty crazy.";
+ mes "If you were thinking of just changing clothes you thought wrong... Kekeke..";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Now try solving the problems I give you.";
+ mes "We'll see how smart you are.";
+ next;
+ set @score,0;
+
+ //set of question 1
+ q1:
+ mes "[Rasputin Gregory]";
+ mes "12+23+34+45 =?";
+ next;
+ input @num;
+ if(@num == 114) set @score,@score+10;
+ q2:
+ mes "[Rasputin Gregory]";
+ mes "1000-36-227-348 =?";
+ next;
+ input @num;
+ if(@num == 389) set @score,@score+10;
+ q3:
+ mes "[Rasputin Gregory]";
+ mes "9765/3/5/7 =?";
+ next;
+ input @num;
+ if(@num == 93) set @score,@score+10;
+ q4:
+ mes "[Rasputin Gregory]";
+ mes "(2646/7) + (13*28) =?";
+ next;
+ input @num;
+ if(@num == 742) set @score,@score+10;
+ q5:
+ mes "[Rasputin Gregory]";
+ mes "With a 24% discount";
+ mes "How much are 12 Red Potions,";
+ mes "5 Fly Wings, and ";
+ mes "1 Butterfly Wing altogether?";
+ next;
+ input @num;
+ if(@num == 909) set @score,@score+10;
+ q6:
+ mes "[Rasputin Gregory]";
+ mes "What is the total weight of 3 ";
+ mes "Scimiters,";
+ mes "2 Helms and 1 Coat";
+ next;
+ input @num;
+ if(@num == 450) set @score,@score+10;
+ q7:
+ mes "[Rasputin Gregory]";
+ mes "What is the total defense of ";
+ mes "a Biretta, Mantle, Opera Mask,";
+ mes "Ribbon, ";
+ mes "Muffler, Boots, and Ear Muffs?";
+ next;
+ input @num;
+ if(@num == 19) set @score,@score+10;
+ q8:
+ mes "[Rasputin Gregory]";
+ mes "If you buy 5 Helms with a 24%";
+ mes "discount ";
+ mes "and sell it at 20%, how much do you";
+ mes "earn?";
+ next;
+ input @num;
+ if(@num == 1760) set @score,@score+10;
+ goto L_Total;
+
+L_ReTest:
+ mes "What, you want to take the test again?";
+ mes "I thought I told you to leave.";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Well, I'll let you go this one time...";
+ mes "I forgive you ... Kekeke.";
+ mes "Do well this time...";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Now then, answer the question I ask.";
+ mes "Let see how smart you are.";
+ next;
+ set @score,0;
+
+ //set of question 2
+ q11:
+ mes "[Rasputin Gregory]";
+ mes "13+25+37+48=?";
+ next;
+ input @num;
+ if(@num == 123) set @score,@score+10;
+ q12:
+ mes "[Rasputin Gregory]";
+ mes "1000-58-214-416 =?";
+ next;
+ input @num;
+ if(@num == 312) set @score,@score+10;
+ q13:
+ mes "[Rasputin Gregory]";
+ mes "12*24*3=?";
+ next;
+ input @num;
+ if(@num == 864) set @score,@score+10;
+ q14:
+ mes "[Rasputin Gregory]";
+ mes "10530/3/5/2=?";
+ next;
+ input @num;
+ if(@num == 351) set @score,@score+10;
+ q15:
+ mes "[Rasputin Gregory]";
+ mes "(35*19) - (1792/7) =?";
+ next;
+ input @num;
+ if(@num == 409) set @score,@score+10;
+ q16:
+ mes "[Rasputin Gregory]";
+ mes "(2368/8) + (24*17) = ?";
+ next;
+ input @num;
+ if(@num == 704) set @score,@score+10;
+ q17:
+ mes "[Rasputin Gregory]";
+ mes "(2646/7) + (13*28)=?";
+ next;
+ input @num;
+ if(@num == 742) set @score,@score+10;
+ q18:
+ mes "[Rasputin Gregory]";
+ mes "If buying at a 24% discount,";
+ mes "What is the total price of";
+ mes "15 Green Potions,";
+ mes "6 Magnifiers and 4 Traps?";
+ next;
+ input @num;
+ if(@num == 934) set @score,@score+10;
+ q19:
+ mes "[Rasputin Gregory]";
+ mes "What is the total weight of ";
+ mes "3 Ring Pommel Sabers,";
+ mes "4 Caps and 2 Boots?";
+ next;
+ input @num;
+ if(@num == 550) set @score,@score+10;
+ q20:
+ mes "[Rasputin Gregory]";
+ mes "What is the total defense of a ";
+ mes "Buckler, Coat, Gas Mask, Big";
+ mes "Ribbon, Ribbon, Sakkat and";
+ mes "Glasses?";
+ next;
+ input @num;
+ if(@num == 16) set @score,@score+10;
+ q21:
+ mes "[Rasputin Gregory]";
+ mes "How much zeny do you make";
+ mes "if you buy Tights at a 24%";
+ mes "discount";
+ mes "and sell it at 20% of the normal";
+ mes "price?";
+ next;
+ input @num;
+ if(@num == 2840) set @score,@score+10;
+L_Total:
+ mes "[Rasputin Gregory]";
+ if(@score < 80) goto L_Failed;
+ set ALCH_Q,3;
+ set ALCH_Q2, 0;
+ mes "Kikiki... I'll let you go.";
+ mes "Do some good research and be of some help to Rasputin... Kikiki!";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Well then go! ^5533FFGo to Darwin^000000.";
+ mes "He'll teach you how to do the experiments.";
+ mes "Tell him I sent you.";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Kikikikekeke.";
+ mes "Dont think this is the end of it!";
+ close;
+
+ L_Failed:
+ set ALCH_Q2,1;
+ mes "...Kekeke, you idiot,";
+ mes "I feel dumb asking you all the question!";
+ mes "you got them all wrong!!!";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "How can a person that can't even answer these question think of being an Alchemist!";
+ mes "What? did you get any right?";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Stupid! If you get one wrong everything is wrong for an Alchemist!";
+ mes "Go! Leave! Get out of here!";
+ close;
+L_Done:
+ mes "What are you doing? Leave already.";
+ mes "Go to ^5533FFDarwin^000000.";
+ mes "He'll teach you how to do the experiments.";
+ mes "Tell him I sent you.";
+ next;
+ mes "[Rasputin Gregory]";
+ mes "Kikikikekeke.";
+ mes "Dont think this is the end of it!";
+ close;
+L_Skip:
+ mes "Hmm... you have a pretty high job level..... I'll be nice today and let you pass.";
+ mes "Next you should go see ^5533FFDarwin^000000.";
+ mes "He'll teach you how to do the experiments.";
+ mes "Tell him I sent you.";
+ set ALCH_Q,3;
+ set ALCH_Q2, 0;
+ close;
+}
+
+
+//==================================================================================================//
+// 3rd Test: Mix some medicine
+//==================================================================================================//
+alde_alche.gat,13,15,8 script Darwin 750,{
+ mes "[Darwin]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+L_Other:
+ mes "more to lose or gain...";
+ mes "It's always like that...";
+ next;
+ mes "[Darwin]";
+ mes "All I can see through my cursed eyes";
+ mes "are illusions from the past,";
+ mes "Ahahahaha...";
+ next;
+ mes "[Darwin]";
+ mes "There's no such thing as paradise ... is there ?";
+ mes "My love Harmona.... Aah....";
+ close;
+
+L_Merc:
+ if(ALCH_Q == 3) goto L_Start;
+ if(ALCH_Q == 4) goto L_Done;
+ goto L_Other;
+
+L_Start:
+ if(ALCH_Q2 == 1) goto L_Check;
+ mes "...........";
+ mes ".........";
+ mes "....Who is it...";
+ next;
+ mes "[Darwin]";
+ mes "A wolf? Or a human...";
+ mes "You must be looking for something as well.";
+ next;
+ mes "[Darwin]";
+ mes "If you have something precious, be careful.";
+ mes "You may lose something else while while going after another...";
+ next;
+ mes "[Darwin]";
+ mes "..........";
+ next;
+ mes "[Darwin]";
+ mes "... but what brings you here.";
+ mes "Coming to a place like this.";
+ next;
+ menu "I want to learn how to experiment.",M_Exp, "Tell me more about flowers.",M_Flow;
+
+ M_Flow:
+ mes "[Darwin]";
+ mes ".......";
+ mes "......";
+ mes "...think about your precious things...";
+ next;
+ mes "[Darwin]";
+ mes ".... There is a flower that I faintly remember....";
+ next;
+ mes "[Darwin]";
+ mes "I divulged into researching one thing.....";
+ mes "for the one I love...";
+ next;
+ mes "[Darwin]";
+ mes "Lets just say that it was about the relationship between wolf and flowers...";
+ mes "I wont tell you the details.";
+ next;
+ mes "[Darwin]";
+ mes "But yes ... it was a flower.";
+ mes "with its shine, it was said to let you see paradise Illusion Flower...";
+ next;
+ mes "[Darwin]";
+ mes "I made a homunculus.";
+ mes "Nobody believe me. that I made life from a flower!!!";
+ mes "My research!";
+ next;
+ mes "[Darwin]";
+ mes "But now, I have nothing left..";
+ mes "It's all over.";
+ mes "Time has stopped at that moment in my life...";
+ next;
+ mes "[Darwin]";
+ mes "Aag... Harmona, in the beautiful fields of flowers,";
+ mes "where have you gone....";
+ close;
+ M_Exp:
+ mes "[Darwin]";
+ mes "You want to learn Alchemy...";
+ mes "All the knowledge I possess..";
+ mes "I made to make my dreams come true...";
+ next;
+ mes "[Darwin]";
+ mes "I'll teach you the basics...";
+ mes "but you must determine your own wishes.";
+ next;
+ mes "[Darwin]";
+ mes "So, here are the basics.";
+ mes "This is how you make simple medicine...";
+ mes "Prepare some stuff...";
+ next;
+ mes "[Darwin]";
+ mes "^5533FF3 Medicine Bowls";
+ mes "3 Empty Bottles";
+ mes "1 Red Herb";
+ mes "1 Yellow Herb";
+ mes "1 White Herb^000000";
+ next;
+ mes "[Darwin]";
+ mes "Once you have prepared all the items... come here.";
+ set ALCH_Q2, 1;
+ close;
+
+L_Check:
+ mes "...........";
+ mes ".........";
+ mes "...Who is it....";
+ next;
+ mes "[Darwin]";
+ mes "Ah You're the one that wants to learn Alchemy...";
+ mes "So did you prepare everything?";
+ next;
+ if(countitem(7134) < 3 || countitem(713) < 3 || countitem(507) < 1 || countitem(508) < 1 || countitem(509) < 1) goto L_NotEnuf;
+ delitem 7134,3;
+ delitem 713,3;
+ delitem 507,1;
+ delitem 508,1;
+ delitem 509,1;
+ mes "[Darwin]";
+ mes "Seems like you have everything ready.";
+ mes "As i promised, I'll teach you how to make medicine";
+ next;
+ mes "[Darwin]";
+ mes "First, prepare the Medicine Bowl then put the Herbs inside like this.";
+ mes "And you slowly crush them.";
+ next;
+ mes "[Darwin]";
+ mes "Pour small amounts of clean water and stirr until it become thick, ";
+ mes "then add some more Herbs.";
+ next;
+ mes "[Darwin]";
+ mes "That's how you make it if you think you have enough, ";
+ mes "gently pour it into an empty bottle";
+ next;
+ mes "[Darwin]";
+ mes "There you go, its complete.";
+ mes "This time, do as I showed you.";
+ mes "It should be easy since its so simple.";
+ next;
+ mes "[Darwin]";
+ mes "... even though you don't have one?";
+ next;
+ set @score,0;
+ menu "Prepare the medicine bowl",-, "Wear the medicine bowl on the head",M_0, "Kick the medicine bowl",M_0;
+
+ set @score,@score+10;
+ M_0:
+
+ menu "Put the sand into the medicine bowl",M_1, "Put the herbs into the medicine bowl",-, "Put the harp into the medicine bowl",M_1;
+
+ set @score,@score+10;
+ M_1:
+
+ menu "Smash the herbs",-, "Smash the medicine bowl",M_2, "Smash the Tarosia's foots",M_2;
+
+ set @score,@score+10;
+ M_2:
+
+ menu "Spray the water",M_3, "Drink the water",M_3, "Pour in the water",-;
+
+ set @score,@score+10;
+ M_3:
+
+ menu "Continue to smash the herbs",-, "Continues to eat the herbs",M_4, "Continues to dance and sing",M_4;
+
+ set @score,@score+10;
+ M_4:
+
+ menu "Put in the noodles and fry it",M_5, "Put into the Empty Bottle",-, "Raise the medicine bowl and drink it",M_5;
+
+ set @score,@score+10;
+ M_5:
+
+ mes "[Darwin]";
+ if(@score < 60) goto L_Failed;
+ mes "... Good job. It came out prettywell considering it's your first time...";
+ mes "As a souvenier, take these.";
+ getitem 501,1;
+ getitem 503,1;
+ getitem 504,1;
+ set ALCH_Q,4;
+ set ALCH_Q2,0;
+ next;
+ mes "[Darwin]";
+L_Done:
+ mes "Go to ^5533FFVan Helmont^000000 in the next room...";
+ mes "He'll teach you more details.";
+ mes "Go learn from him.";
+ next;
+ mes "[Darwin]";
+ mes "Don't forget...";
+ mes "You must protect what is trully precious to you.....";
+ close;
+
+ L_Failed:
+ mes "... You messed up all the ingredients.";
+ mes "... Go bring some more.";
+ close;
+L_NotEnuf:
+ mes "[Darwin]";
+ mes "...You must've forgotten the materials to bring.";
+ mes "I'll tell you again.";
+ mes "Dont forget them this time.";
+ next;
+ mes "[Darwin]";
+ mes "^5533FF3 Medicine Bowls";
+ mes "3 Empty Bottles";
+ mes "1 Red Herb";
+ mes "1 Yellow Herb";
+ mes "1 White Herb^000000";
+ next;
+ mes "[Darwin]";
+ mes "Come back when you are ready...";
+ close;
+}
+
+
+//==================================================================================================//
+// 4th Test: Learn from Morgenstein
+//==================================================================================================//
+alde_alche.gat,79,19,4 script Van Helmont 748,{
+ mes "[Van Helmont]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+L_Other:
+ mes "Just a little ... yes, a little bit more ....";
+ mes "agh, just a little bit more and it would've been done!";
+ next;
+ mes "[Van Helmont]";
+ mes "Why, why another failure!!!";
+ mes "Nothing was wrong!";
+ mes "Why! Why!";
+ next;
+ mes "[Van Helmont]";
+ mes "Does that mean I have to get more materials...";
+ mes "But I should be able to complete it one day....Heeh...";
+ close;
+L_Merc:
+ if(ALCH_Q == 4) goto L_Start;
+ if(ALCH_Q == 5) goto L_Done;
+ goto L_Other;
+L_Start:
+ if(ALCH_Q2 == 1) goto L_Check;
+ mes "Arrrrgh... Why does this formula just stop... What's wrong.";
+ mes "Theoretically it's all correct...";
+ mes "I'm sure it's because there is an error in the formula";
+ mes "somewhere...";
+ next;
+ mes "[Van Helmont]";
+ mes "That's it, I pour it here and it should stop... but this is the formula that solution doesn't stop flowing.";
+ mes " How could I make such a stupid mistake... when did I switch these...";
+ next;
+ mes "[Van Helmont]";
+ mes "Yes, that's it. I just need to fix this part.";
+ mes "No need to start over.";
+ mes "I just have to fix it...";
+ mes "....But, wait. wait.";
+ next;
+ mes "[Van Helmont]";
+ mes ".....................";
+ next;
+ mes "[Van Helmont]";
+ mes "....Who are you?";
+ next;
+ menu "I want to become an Alchemist.",-,".....",M_Bye;
+
+ mes "[Van Helmont]";
+ mes "Oh, I see....";
+ mes "Haha you want to learn Alchemy in world like this, what a funny merchant... hmmm.";
+ next;
+ mes "[Van Helmont]";
+ mes "Well, that's nice, but I have a very urgent experiment I must tend to.";
+ mes "So don't get in the way.";
+ next;
+ menu "Teach me something.",-,"..........",M_Bye;
+
+ mes "[Van Helmont]";
+ mes "Argh... didn't I just tell you not to bother me?";
+ mes "Why can't you understand when I say something!";
+ next;
+ mes "[Van Helmont]";
+ mes "Ok, I'll give you an assignment.";
+ mes "Go study and come back. Let's see.";
+ mes "What would be good... Hmm...";
+ next;
+ mes "[Van Helmont]";
+ mes "Oh, I got it. Go learn from ^5533FFMorgenstein^000000. Learn how to make a ^009500Counteragent^000000 and ^FF3355Mixture^000000.";
+ mes "You can find him in ^5533FFGeffen^000000.";
+ next;
+ mes "[Van Helmont]";
+ mes "You don't need to bring what you made. But just go watch how he makes medicine and stuff.";
+ mes "Got it?";
+ next;
+ mes "[Van Helmont]";
+ mes "Well then, see you later.";
+ mes "You'd be best off going as soon as you can.";
+ set ALCH_Q2,1;
+ close;
+ M_Bye:
+ mes "[Van Helmont]";
+ mes "If you dont have business here just go away. Ok!!!";
+ close;
+L_Check:
+ if((MISC_QUEST & 4)==0) goto L_NotRdy; //this's a Morgenstein Quest check
+ mes "Yes, cut the Tentacle..";
+ mes "and mix some Sticky Mucus,";
+ mes "Jellopy solution in the test tube Darn, where did the Medicine Bowl go...";
+ next;
+ mes "[Van Helmont]";
+ mes "Did I use them all.. At a time like this, grrr. I wonder if Nicholas has any left.";
+ mes "Ganfunnit... what a pain.";
+ mes "....but, wait. wait.";
+ next;
+ mes "[Van Helmont]";
+ mes "Ah, you're that merchant from before. So.. did you learn anything?";
+ mes "I didn't send you there to play.";
+ next;
+ mes "[Van Helmont]";
+ mes "Let me ask you a couple of questions. Answer how you heard and learned.";
+ next;
+ set @score,0;
+
+ Q_1a:
+ mes "[Van Helmont]";
+ mes "What item is required to form the Counteragent?";
+ next;
+ menu "Feather",-,"Sticky Mucus",-,"Animal Blood",-;
+
+ Q_1b:
+ mes "[Van Helmont]";
+ mes "Which of the following item is not required in forming the Counteragent?";
+ next;
+ menu "Karvodailnirol",-,"Detrimindexta",Q_2a,"Alchol",Q_2a;
+
+ set @score,@score+10;
+
+ Q_2a:
+ mes "[Van Helmont]";
+ mes "What item is required to form the Mixture?";
+ next;
+ menu "Monster's Feed",-,"Lip of Ancient Fish",-,"Rotten Bandage",-;
+
+ Q_2b:
+ mes "[Van Helmont]";
+ mes "Which of the following item is not required in the process of forming the Mixture?";
+ next;
+ menu "Karvodailnirol",L_Result,"Detrimindexta",-,"Alchol",L_Result;
+
+ set @score,@score+10;
+
+L_Result:
+ mes "[Van Helmont]";
+ if(@score < 20) goto L_Failed;
+ mes "Hmm, you learned well. Ok, now you know some stuff about medicine?";
+ mes "Eh?";
+ mes "I know, you must have a lot to say but let me continue with my experiment.";
+ next;
+ mes "[Van Helmont]";
+ mes "Go out and to the room next to here. ^5533FFNicholas^000000 probably has more to teach you than me.";
+ set ALCH_Q,5;
+ set ALCH_Q2,0;
+ close;
+
+ L_Failed:
+ mes "...Be honest. You don't know,";
+ mes "do you? I thought I told you to go learn from Morgenstein...";
+ next;
+ mes "[Van Helmont]";
+ mes "Don't even think about coming back before you've learned for sure!";
+ mes "Stop bothering me and leave!";
+ close;
+L_NotRdy:
+ mes "Didn't I tell you to visit Morgenstein in Geffen!?!";
+ mes "He is a wise man! You should go to him!";
+ close;
+L_Done:
+ mes "What are you doing? Go out and to the room next to here. ^5533FFNicholas^000000 probably has more to teach you than me.";
+ mes "I have no more business with you.";
+ close;
+
+}
+
+
+//==================================================================================================//
+// Test 5 & 6: Word Scramble, Help the Baijin Bros.
+//==================================================================================================//
+alde_alche.gat,145,19,4 script Nicholas Flamel 57,{
+ mes "[Nicholas Flamel]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+L_Other:
+ mes "Lorem ipsum dolor sit amet,";
+ mes "consectetuer adipiscing elit.";
+ mes "Vivamus sem. Sed metus lacus, viverra id, rutrum eget, rhoncus sit amet, lectus.";
+ mes "Suspendisse sit amet urna in nisl frigilla faucibus.";
+ mes "Nulla scelerisque eros....";
+ mes "......mumblemumble........";
+ close;
+L_Merc:
+ if(ALCH_Q == 5) goto L_Start;
+ if(ALCH_Q == 6) goto L_Start2;
+ if(ALCH_Q == 7) goto L_Done;
+ goto L_Other;
+L_Start:
+ if(ALCH_Q2 == 1) goto L_ReTest;
+ mes "Ooh... you're the Merchant that wants to become an Alchemist?";
+ mes "But you know... not anyone can become an Alchemist.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "The Union doesn't like those that just want to become Alchemist without a clear goal.";
+ mes "So... to see if you qualify, I'll test how smart you are.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "As you can see, Alchemist must memorize many equations,";
+ mes "chemical equations and a lot of other information.";
+ mes "If you're not at a certain level..";
+ mes "it's actually pretty tough.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "The idea is to prevent those that are going to be useless Alchemists from joining the union!";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Ok... Here go the questions!";
+ mes "This is to test your concentration so that you won't get confused when looking at charts.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Find the words from the group of letters. They can be made by using some or all the letters given";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "You pass if you choose the word that is 'IN' the puzzle.";
+ next;
+
+ Q_1:
+ set @score,0;
+ mes "[Nicholas Flamel]";
+ mes "s m i e x b w u n e n t a g l r";
+ next;
+ menu "tiger",-,"wolf",Q_2,"pumpkin",Q_2,"tripped",Q_2;
+
+ set @score,@score+10;
+
+ Q_2:
+ mes "[Nicholas Flamel]";
+ mes "n i e g b o p d s o a u w r v";
+ next;
+ menu "bash",Q_3,"provoke",Q_3,"endure",-,"stun",Q_3,"abracadabra",Q_3;
+
+ set @score,@score+10;
+
+ Q_3:
+ mes "[Nicholas Flamel]";
+ mes "l r m g r e x t a v i n e d e";
+ next;
+ menu "alberta",Q_4,"latifoliate",Q_4,"crimson",Q_4,"maple",Q_4,"evergreen",-;
+
+ set @score,@score+10;
+
+ Q_4:
+ mes "[Nicholas Flamel] ";
+ mes "r o e h n r o m c a i n p t t";
+ next;
+ menu "forgemerchant",L_Score,"potionmerchant",-,"dcmerchant",L_Score,"vendingmerchant",L_Score;
+
+ set @score,@score+10;
+L_Score:
+ if(@score < 40) goto L_Failed;
+ set ALCH_Q,6;
+ set ALCH_Q2,0;
+ mes "[Nicholas Flamel]";
+ mes "You seem to be done.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Let's see.";
+ mes "...Good job. Excellent.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Somehow you found all of them.";
+ mes "With that kind of concentration, you should easily be able to read the medicine dictionaries.";
+ mes "Let's see... next is..";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Come back in a little bit. Get organized too..";
+ close;
+
+ L_Failed:
+ mes "[Nicholas Flamel]";
+ mes "Hmmm... You failed!";
+ mes "Get your glasses maybe you can pass next time wearing those.";
+ set ALCH_Q2,1;
+ close;
+L_ReTest:
+ mes "Hmmm you returned.";
+ mes "Well will see if you changed.";
+ next;
+ goto Q_1;
+
+L_Start2:
+ if(ALCH_Q2 > 0) goto L_Check2;
+ mes "Next, you have to go somewhere.";
+ mes "Go to ^5533FF'The Forgotten City of Yuno'^000000 and meet the ^FF3355Bain and Bajin^000000 brothers who are researching alchemy with the Sages there.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Go help out and come back Here, take these... it will help you get close to them.";
+ next;
+ getitem 974,1;
+ getitem 7068,5;
+ getitem 7043,5;
+ getitem 756,3;
+ getitem 757,3;
+ mes "[Nicholas Flamel]";
+ mes "1 Mixture";
+ mes "5 Burnt Tree";
+ mes "5 Fine Sand ";
+ mes "3 Rough Oridecon ";
+ mes "3 Rough Elunium";
+ set ALCH_Q2,1;
+ next;
+ mes "[Nicholas Flamel]";
+ mes "Have a safe trip.";
+ mes "It's Yuno. Come back in one piece.";
+ close;
+L_Check2:
+ if(ALCH_Q2 < 2) goto L_NotDone;
+ set ALCH_Q, 7;
+ set ALCH_Q2, 0;
+ mes "Ooh! Well done on such a long trip.";
+ mes "I got a message saying that the Bain and Bajin brothers were happy about your visit.";
+ next;
+ mes "[Nicholas Flamel]";
+ mes "You must have successfully helped them.";
+ mes "If you're good enough to be of help to the brothers... ok, I think you qualify.";
+ next;
+ mes "[Nicholas Flamel]";
+L_Done:
+ mes "Go to the Union Leader on the 2nd floor!";
+ mes "Congratulations. You'll change jobs soon!";
+ close;
+
+ L_NotDone:
+ mes "Bain and Bajin brothers are in Yuno go help them.";
+ close;
+
+}
+
+
+//==================================================================================================//
+// Job Changer
+//==================================================================================================//
+alde_alche.gat,101,184,4 script Vincent Carsciallo 122,{
+ mes "[Vincent Carsciallo]";
+ if(baseJob == Job_Merchant) goto L_Merc;
+ if(baseJob == Job_Alchem){
+ mes "How Alchemy going? Make sure to be carefull and think about safety at all times.";
+ mes "I wouldn't want you blowing yourself up or anything.....";
+ close;
+ }
+ mes "Hmmm? What may a civilian have to do here?";
+ next;
+ mes "[Vincent Carsciallo]";
+ mes "There's nothing amusing. Dont wander and leave.";
+ close;
+L_Merc:
+ if(ALCH_Q == 7) goto L_Change;
+ mes "Hmmm? A merchant.";
+ mes "Are you interested in Alchemy?";
+ next;
+ mes "[Vincent Carsciallo]";
+ mes "This is the Alchemist Union.";
+ mes "We research many different substances.";
+ mes "Our goal is to make something new without the power of magic.";
+ next;
+ mes "[Vincent Carsciallo]";
+ mes "Create new life, and study how to live long and not die ...";
+ mes "We also make new materials out of existing ones...";
+ mes "These are just some of the things we do.";
+ next;
+ mes "[Vincent Carsciallo]";
+ mes "After being a Merchant for a long time ";
+ mes "you start to become interested in everything.";
+ mes "If you would like to learn Alchemy as well,";
+ mes "try joining our Union.";
+ close;
+L_Change:
+ if(skillpoint){
+ mes "Please use all your skill point before talking to me.";
+ close;
+ }
+ mes "Oh, Ok. You joined and learned the basics, too. Well done.";
+ next;
+ callfunc "Job_Change",Job_Alchem;
+ callfunc "F_ClearJobVar";
+ emotion e_grat;
+ mes "[Vincent Carsciallo]";
+ mes "From now on, you are also a member of the Union as an Alchemist.";
+ mes "I hope you learn a lot...";
+ next;
+ getitem 7127,1;
+ mes "[Vincent Carsciallo]";
+ mes "Here's a little something. ";
+ mes "Use it to start off with some research.";
+ next;
+ mes "[Vincent Carsciallo]";
+ mes "I'll see you later then...";
+ mes "Be proud of being an Alchemist!";
+ close;
+}
diff --git a/npc/jobs/2-2/bard.txt b/npc/jobs/2-2/bard.txt
index 2c99ab6f7..834f8e401 100644
--- a/npc/jobs/2-2/bard.txt
+++ b/npc/jobs/2-2/bard.txt
@@ -1,477 +1,477 @@
-//===== eAthena Script =======================================
-//= Bard Job Quest
-//===== By: ==================================================
-//= Muad_Dib(The Prometheus Project), Lupus
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= eAthena Final
-//===== Description: =========================================
-//= Bard job quest based off a Prometheus Project script
-//= and other sources for clarity
-//===== Additional Comments: =================================
-// 07/06/05 : Added 1st Version. [Muad_Dib]
-// Converted to eAthena format by Dr.Evil
-// Info about gifts and other info --> http://www.ragnainfo.net/forums/viewtopic.php?t=51467&start=0
-// 1.1 Optimized, changed some stuff, fixed some bugs [Lupus]
-// 1.1a minor song test fix [Lupus]
-// 1.2 Fixed wrong item ID, added missing commands [Lupus]
-// 1.3 Updated flower sub-quest according to official [Lupus]
-// 1.4 Changed priority for the gifts. Now you can win the 1st
-// prize, too. Added Izidor flower [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//============================================================
-
-
-comodo.gat,226,123,5 script Wandering Bard 741,{
- callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Clown,"Clown","Wandering Bard";
-
- if (BARD_Q == 1) goto L_BQ1;
- if (BARD_Q == 2) goto L_BQ2;
- if (BARD_Q == 3) goto L_SINGING;
- if (BARD_Q == 4) goto L_BQ4;
- if (BaseJob == Job_Bard) goto L_CLOSE;
- if (BaseJob == Job_Archer && Sex == 1) goto L_ARCHER;
-
- mes "[Lalo]";
- mes "It's a fine day to sing eh.";
- close;
-
-L_ARCHER:
- mes "[Lalo]";
- mes "Hi! Delightful Archer.";
- mes "How can a wanderer like me help you?";
- next;
- menu "You have a nice voice.",-,"Could you sing for me, please?",M_1,"Nothing",M_NOTHING;
-
- mes "[Lalo]";
- mes "Hoho, your voice is rather nice as well?";
- mes "Ever think about singing?";
- next;
- menu "Of course!",-,"I can't quite possibly...",M_ICANT;
-
- mes "[Lalo]";
- mes "Haha, nice attitude. You have to be";
- mes "like that to become a Bard.";
- mes "I'll help you become a Bard then.";
- next;
- if(JobLevel >= 40) goto L_GONOW;
- mes "[Lalo]";
- mes "But before that... you need to be";
- mes "at least base 40 to be a Bard.";
- next;
- mes "[Lalo]";
- mes "Just come back again ok.";
- close;
-
-L_GONOW:
- set JBLVL, JobLevel; // used to determine what item to get at the end
- mes "[Lalo]";
- mes "But before that... do you think you can bring me a Flower?";
- mes "I need to smell the scent of a";
- mes "Flower to feel like teaching.";
- next;
- mes "[Lalo]";
- mes "It doesn't really matter which Flower, but try to bring one that I like.";
- mes "And don't just buy any random Flower, Ok?";
- set BARD_Q,1;
- close;
-
-M_ICANT:
- mes "[Lalo]";
- mes "Haha, what a timid one.";
- mes "Don't think so little of yourself.";
- next;
- mes "[Lalo]";
- mes "You have plenty of talent.";
- mes "Come again if you change your mind.";
- close;
-
-M_1:
- mes "[Lalo]";
- mes "A song... let's see.";
- mes "Ok, I got one...";
- next;
- mes "[Lalo]";
- mes "I'll sing... Drums of War.";
- mes "*ehem... *cough... gag... mememememe...";
- mes "1, 2, 3, 4...";
- next;
- mes "[Lalo]";
- mes "The sound of the horses galloping over the horizon";
- mes "The dust that covers the distant sun.";
- mes "Where thousands of eyes open in the night sky";
- mes "The castle's fire will burn with power.";
- next;
- mes "[Lalo]";
- mes "I can hear... the beating of my heart.";
- mes "I can feel... the blood rushing through my veins.";
- mes "... and the weight of my armor.";
- mes "I can see... my enemies.";
- next;
- mes "[Lalo]";
- mes "Louder, louder louder...";
- mes "Give strength to the warriors!";
- mes "Higher, higher, higher...";
- mes "This day will never come again!";
- next;
- mes "[Lalo]";
- mes "Shake the sky and roar the through the land.";
- mes "Make my heart pound again!";
- mes "Let the trumpets sound, and castle walls ring.";
- mes "This moment will never come again!";
- next;
- mes "[Lalo]";
- mes "Hmm.. that's always a good song to sing.";
- mes "How it was it? Dont you think it's a nice song?";
- next;
- menu "Yes, it was really nice",-,"No, not really...",M_NO;
-
- mes "[Lalo]";
- mes "Thanks! If you enjoyed my song, it";
- mes "makes me happy, too.";
- next;
- mes "[Lalo]";
- mes "It would be nice if more people";
- mes "went around and sang...";
- mes "Well, its quite ok as it is now...";
- mes "hmmhmmm.";
- close;
-
-M_NO:
- mes "[Lalo]";
- mes "Hmmm... Did I loose my senses I'll ";
- mes "have to try harder.";
- mes "Anyways... Thanks for listening.";
- close;
-
-M_NOTHING:
- mes "[Lalo]";
- mes "Oh not requesting a song when you";
- mes "run into a Bard isn't very polite.";
- mes "Well...can't help it since you";
- mes "look like you're in a hurry";
- mes "anyways.";
- next;
- mes "[Lalo]";
- mes "Hunting is good... but you can't";
- mes "forget to relax once in a while.";
- mes "Youth is short and wont come again";
- mes "once it passes by..";
- close;
-
-L_BQ1:
- mes "[Lalo]";
- mes "Welcome! Archer friend.";
- mes "Did you bring a Flower? Let me see.";
- next;
- if(countitem(1032) >= 1) goto L_UGLYFLOWER; //Items: Maneater_Blossom,
- if(countitem(703) >= 1) goto L_FLOWER1; //Items: Hinalle,
-L_NEXT2:
- if(countitem(708) >= 1) goto L_FLOWER2; //Items: Ment,
-L_NEXT3:
- if(countitem(629) >= 1) goto L_FLOWER3; //Items: Singing_Flower,
-L_NEXT4:
- if(countitem(710) >= 1) goto L_FLOWER4; //Items: Illusion_Flower,
-L_NEXT5:
- if(countitem(748) >= 1) goto L_FLOWER5; //Items: Witherless_Rose,
-L_NEXT6:
- if(countitem(709) >= 1) goto L_FLOWER6; //Item: Izidor
-L_NEXT7:
- if(countitem(712) < 1) goto M_NOTHAVE; //Item: Flower//Items: Flower,
-
- mes "[Lalo]";
- mes "Eh? This is just a normal flower.";
- mes "I like it... but it's not enough.";
- mes "Please bring me a different flower.";
- close;
-
-L_UGLYFLOWER:
- mes "[Lalo]";
- mes "What is it?! Please, back off and put it away from my face.";
- mes "I do really hate maneater blossoms!!!";
- mes "THEY ARE SO UGLY!";
- emotion e_omg;
- close;
-
-M_NOTHAVE:
- mes "[Lalo]";
- mes "Well suit your self.";
- mes "I dont like that flower anyway.";
- close;
-
-L_FLOWER1:
- mes "[Lalo]";
- mes "Can I have that Hinalle?";
- next;
- menu "Yes",-,"No",L_NEXT2;
- if(countitem(703) < 1) goto M_NOTHAVE;
- delitem 703,1; //Items: Hinalle,
- goto L_GOOD;
-
-L_FLOWER2:
- mes "[Lalo]";
- mes "Can I have that Ment?";
- next;
- menu "Yes",-,"No",L_NEXT3;
- if(countitem(708) < 1) goto M_NOTHAVE;
- delitem 708,1; //Items: Ment,
- goto L_GOOD;
-
-L_FLOWER3:
- mes "[Lalo]";
- mes "Can I have that Singing Flower?";
- next;
- menu "Yes",-,"No",L_NEXT4;
- if(countitem(629) < 1) goto M_NOTHAVE;
- delitem 629,1; //Items: Singing_Flower,
- goto L_GOOD;
-
-L_FLOWER4:
- mes "[Lalo]";
- mes "Can I have that Illusion Flower?";
- next;
- menu "Yes",-,"No",L_NEXT5;
- if(countitem(710) < 1) goto M_NOTHAVE;
- delitem 710,1; //Items: Illusion_Flower,
- goto L_GOOD;
-
-L_FLOWER5:
- mes "[Lalo]";
- mes "Can I have that Witherless Rose?";
- next;
- menu "Yes",-,"No",L_NEXT6;
- if(countitem(748) < 1) goto M_NOTHAVE;
- delitem 748,1; //Items: Witherless_Rose,
- goto L_GOOD;
-
-L_FLOWER6:
- mes "[Lalo]";
- mes "Can I have that Izidor?";
- next;
- menu "Yes",-,"No",L_NEXT7;
- if(countitem(709) < 1) goto M_NOTHAVE;
- delitem 709,1; //Items: Izidor
-
-L_GOOD:
- mes "[Lalo]";
- mes "It doesn't have a scent but it's a";
- mes "very moderate cute flower.";
- mes "The leaves gave me strength when I";
- mes "used to fall.";
- mes "I really like this flower, thank you.";
- next;
- mes "[Lalo]";
- mes "As I promised, I'll help you become a Bard.";
- mes "But it's not easy my friend. Haha!";
- next;
- mes "[Lalo]";
- mes "It is important to get to know";
- mes "lot of people to learn how to sing.";
- mes "You must also keep up with all the";
- mes "things going on different villages...";
- next;
- mes "[Lalo]";
- mes "There's a talking snowman in a town called Lutie.";
- mes "Go there and bring back a present.";
- next;
- mes "[Lalo]";
- mes "If you become friends with Jack";
- mes "Frost, you will receive something.";
- mes "And also talk to townspeople";
- mes "while you're at it...";
- set BARD_Q,2;
- close;
-L_BQ2:
- if (xmas_npc == 11) goto L_BQ3; //this var is set in LUTIE.TXT
- mes "[Lalo]";
- mes "I'm waiting for the good news.";
- mes "For now go to Lutie and make";
- mes "friends with Jack Frost.";
- close;
-L_BQ3:
- mes "[Lalo]";
- mes "How was the trip? Did you meet a lot of people?";
- mes "You should have more important than a gift.";
- set BARD_Q,3;
- next;
-L_SINGING:
- mes "[Lalo]";
- mes "Then, do you want to try singing...?";
- mes "I'll sing a short melody...";
- mes "and you try after.";
- next;
- mes "[Lalo]";
- mes "Here I go.";
- mes "Ehem *clears throat*";
- mes "1, 2, 3, 4";
- next;
- mes "[Lalo]";
-//this should text input
- mes "All Gods never age.";
- mes "The ever so beautiful Goddess";
- mes "Eden,";
- mes "Beatuful and graceful Goddess";
- mes "Eden,";
- mes "Odin's daugther-in-law and Bragis";
- mes "wife";
- mes "Her sweet apples in her basket,";
- mes "All thanks to her sweet apples.";
-
- set @score,0;
- next;
- mes "[Lalo]";
- mes "Now you try...";
- next;
-
- menu "All Gods never age.",-,"All Gods never age?",M_S2,"All Gods never age,",M_S2,"Are Gods never age?",M_S2;
-
- set @score,@score+10;
-
-M_S2:
- menu "The ever so beautiful Goddess,",M_S3,"The ever so beautiful Goddess.",M_S3,"The never beautiful Goddess.",M_S3,"The ever so beautiful Goddess",-;
-
- set @score,@score+10;
-
-M_S3:
- menu "Odins,",M_S4,"Odin.",M_S4,"Odin,",M_S4,"Eden,",-;
-
- set @score,@score+10;
-M_S4:
- menu "Very beatuful Goddess",M_S5,"Beatuful and Graceful Goddess",M_S5,"Beatuful and graceful Goddess",-,"Beatuful and the graceful Goddess",M_S5;
-
- set @score,@score+10;
-M_S5:
- menu "Eden.",M_S6,"Odins,",M_S6,"Eden,",-,"Edens,",M_S6;
-
- set @score,@score+10;
-M_S6:
- menu "Brags daugther-in-law and Odin's",M_S7,"Brags and Odin's daugther-in-law",M_S7,"Odin's daugther-in-law and Bragis",-,"Odin's daugther-in-law and Brags",M_S7;
-
- set @score,@score+10;
-M_S7:
- menu "whales",M_S8,"wifes",M_S8,"wife",-,"waffels",M_S8;
-
- set @score,@score+10;
-M_S8:
- menu "Her sweet apple in her basket,",M_S9,"Her sweet apple in her basket",M_S9,"Her sweet apples in her basket,",-;
-
- set @score,@score+10;
-M_S9:
- menu "All thanks to her sweet apple!",M_S10,"All thanks to her sweet apples.",-,"All thanks to her sweet apples!",M_S10;
-
- set @score,@score+10;
-M_S10:
- next;
- if(@score >= 90) goto L_GOODWORK;
- mes "[Lalo]";
- mes "Oy, You got the lyrics wrong!";
- mes "Can't you even sing along...?";
- next;
- mes "[Lalo]";
- mes "Your pronunciation is very unclear.";
- mes "Do a better job next time.";
- close;
-
-L_GOODWORK:
- set BARD_Q,4;
- mes "[Lalo]";
- mes "Wonderful! Finish it in one try!";
- mes "You can become a great Bard.";
- next;
- mes "[Lalo]";
- mes "Do you want to just change jobs now?";
- mes "Or do you want a present?";
- next;
- menu "Just change my job please.",-,"I'd be thankful for a present.",M_PRESENTPLZ;
-
- if(skillpoint != 0) goto L_SKILLSLEFT;
- goto L_CHANGE;
-
-M_PRESENTPLZ:
- mes "[Lalo]";
- mes "Hmmm...very well, bring some trunks.";
- mes "It doesn't matter what kind, as";
- mes "long they are ^FF000060 of the same kind^000000...";
- next;
- mes "[Lalo]";
- mes "I will give you a gift once you";
- mes "bring them have a safe trip.";
- close;
-
-L_SKILLSLEFT:
- mes "[Lalo]";
- mes "Hmmm... you seems to have some skill points left.";
- mes "Use them all and come back to me again.";
- close;
-
-L_BQ4:
- set @gift,0;
- if (countitem(1019) >= 60) set @gift,5; // Trunk//Items: Trunk,
- if (countitem(1068) >= 60) set @gift,4; // Barren_Trunk//Items: Barren_Trunk,
- if (countitem(1067) >= 60) set @gift,3; // Solid_Trunk//Items: Solid_Trunk,
- if (countitem(1066) >= 60) set @gift,2; // Fine-grained_Trunk//Items: Fine-grained_Trunk,
- if (JBLVL == 50 && countitem(1066) >=60) set @gift,1; // Fine-grained_Trunk//Items: Fine-grained_Trunk,
-
- if (@gift!=0) goto L_CHANGE;
-
- mes "[Lalo]";
- mes "Mmm? Seems like you haven't prepared all trunks yet?";
- mes "Do you want to just change jobs anyways?";
- next;
- menu "Yes",L_CHANGE,"Wait, not yet",-;
-
- mes "[Lalo]";
- mes "Ok I'll just wait here.";
- close;
-
-L_CHANGE:
- if(skillpoint != 0) goto L_SKILLSLEFT;
- callfunc "Job_Change",Job_Bard;
- callfunc "F_ClearJobVar";
-
- mes "[Lalo]";
- if (@gift==0) goto L_NOGIFT;
-
- mes "Good job. I will make you a";
- mes "job change with this souvenir.";
- mes "Wait just a moment.";
- next;
- mes "Scrape Scrape Tang Tang";
- mes "Squeak Squeak Scratch Scratch";
- next;
-
- switch(@gift){
- case 1:
- delitem 1066,60; //Fine-grained_Trunk + 50 JobLvl --> Harp [2]
- getitem 1910,1;
- break;
- case 2:
- delitem 1066,60; //Fine-grained_Trunk --> Lute [2]
- getitem 1905,1;
- break;
- case 3:
- delitem 1067,60; //Solid_Trunk --> Mandolin [2]
- getitem 1903,1;
- break;
- case 4:
- delitem 1068,60; //Barren_Trunk --> Mandolin [2]
- getitem 1903,1;
- break;
- case 5:
- delitem 1019,60; //Trunk --> Violin [3]
- getitem 1901,1;
- }
-
- emotion e_grat;
- mes "[Lalo]";
- mes "Here you go, a souvenir. It is";
- mes "useful when you sing.";
-L_NOGIFT:
- mes "Hope you sing happy songs.";
- next;
-L_CLOSE:
- mes "[Lalo]";
- mes "See you next time!";
- close;
-}
+//===== eAthena Script =======================================
+//= Bard Job Quest
+//===== By: ==================================================
+//= Muad_Dib(The Prometheus Project), Lupus
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= eAthena Final
+//===== Description: =========================================
+//= Bard job quest based off a Prometheus Project script
+//= and other sources for clarity
+//===== Additional Comments: =================================
+// 07/06/05 : Added 1st Version. [Muad_Dib]
+// Converted to eAthena format by Dr.Evil
+// Info about gifts and other info --> http://www.ragnainfo.net/forums/viewtopic.php?t=51467&start=0
+// 1.1 Optimized, changed some stuff, fixed some bugs [Lupus]
+// 1.1a minor song test fix [Lupus]
+// 1.2 Fixed wrong item ID, added missing commands [Lupus]
+// 1.3 Updated flower sub-quest according to official [Lupus]
+// 1.4 Changed priority for the gifts. Now you can win the 1st
+// prize, too. Added Izidor flower [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//============================================================
+
+
+comodo.gat,226,123,5 script Wandering Bard 741,{
+ callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Clown,"Clown","Wandering Bard";
+
+ if (BARD_Q == 1) goto L_BQ1;
+ if (BARD_Q == 2) goto L_BQ2;
+ if (BARD_Q == 3) goto L_SINGING;
+ if (BARD_Q == 4) goto L_BQ4;
+ if (BaseJob == Job_Bard) goto L_CLOSE;
+ if (BaseJob == Job_Archer && Sex == 1) goto L_ARCHER;
+
+ mes "[Lalo]";
+ mes "It's a fine day to sing eh.";
+ close;
+
+L_ARCHER:
+ mes "[Lalo]";
+ mes "Hi! Delightful Archer.";
+ mes "How can a wanderer like me help you?";
+ next;
+ menu "You have a nice voice.",-,"Could you sing for me, please?",M_1,"Nothing",M_NOTHING;
+
+ mes "[Lalo]";
+ mes "Hoho, your voice is rather nice as well?";
+ mes "Ever think about singing?";
+ next;
+ menu "Of course!",-,"I can't quite possibly...",M_ICANT;
+
+ mes "[Lalo]";
+ mes "Haha, nice attitude. You have to be";
+ mes "like that to become a Bard.";
+ mes "I'll help you become a Bard then.";
+ next;
+ if(JobLevel >= 40) goto L_GONOW;
+ mes "[Lalo]";
+ mes "But before that... you need to be";
+ mes "at least base 40 to be a Bard.";
+ next;
+ mes "[Lalo]";
+ mes "Just come back again ok.";
+ close;
+
+L_GONOW:
+ set JBLVL, JobLevel; // used to determine what item to get at the end
+ mes "[Lalo]";
+ mes "But before that... do you think you can bring me a Flower?";
+ mes "I need to smell the scent of a";
+ mes "Flower to feel like teaching.";
+ next;
+ mes "[Lalo]";
+ mes "It doesn't really matter which Flower, but try to bring one that I like.";
+ mes "And don't just buy any random Flower, Ok?";
+ set BARD_Q,1;
+ close;
+
+M_ICANT:
+ mes "[Lalo]";
+ mes "Haha, what a timid one.";
+ mes "Don't think so little of yourself.";
+ next;
+ mes "[Lalo]";
+ mes "You have plenty of talent.";
+ mes "Come again if you change your mind.";
+ close;
+
+M_1:
+ mes "[Lalo]";
+ mes "A song... let's see.";
+ mes "Ok, I got one...";
+ next;
+ mes "[Lalo]";
+ mes "I'll sing... Drums of War.";
+ mes "*ehem... *cough... gag... mememememe...";
+ mes "1, 2, 3, 4...";
+ next;
+ mes "[Lalo]";
+ mes "The sound of the horses galloping over the horizon";
+ mes "The dust that covers the distant sun.";
+ mes "Where thousands of eyes open in the night sky";
+ mes "The castle's fire will burn with power.";
+ next;
+ mes "[Lalo]";
+ mes "I can hear... the beating of my heart.";
+ mes "I can feel... the blood rushing through my veins.";
+ mes "... and the weight of my armor.";
+ mes "I can see... my enemies.";
+ next;
+ mes "[Lalo]";
+ mes "Louder, louder louder...";
+ mes "Give strength to the warriors!";
+ mes "Higher, higher, higher...";
+ mes "This day will never come again!";
+ next;
+ mes "[Lalo]";
+ mes "Shake the sky and roar the through the land.";
+ mes "Make my heart pound again!";
+ mes "Let the trumpets sound, and castle walls ring.";
+ mes "This moment will never come again!";
+ next;
+ mes "[Lalo]";
+ mes "Hmm.. that's always a good song to sing.";
+ mes "How it was it? Dont you think it's a nice song?";
+ next;
+ menu "Yes, it was really nice",-,"No, not really...",M_NO;
+
+ mes "[Lalo]";
+ mes "Thanks! If you enjoyed my song, it";
+ mes "makes me happy, too.";
+ next;
+ mes "[Lalo]";
+ mes "It would be nice if more people";
+ mes "went around and sang...";
+ mes "Well, its quite ok as it is now...";
+ mes "hmmhmmm.";
+ close;
+
+M_NO:
+ mes "[Lalo]";
+ mes "Hmmm... Did I loose my senses I'll ";
+ mes "have to try harder.";
+ mes "Anyways... Thanks for listening.";
+ close;
+
+M_NOTHING:
+ mes "[Lalo]";
+ mes "Oh not requesting a song when you";
+ mes "run into a Bard isn't very polite.";
+ mes "Well...can't help it since you";
+ mes "look like you're in a hurry";
+ mes "anyways.";
+ next;
+ mes "[Lalo]";
+ mes "Hunting is good... but you can't";
+ mes "forget to relax once in a while.";
+ mes "Youth is short and wont come again";
+ mes "once it passes by..";
+ close;
+
+L_BQ1:
+ mes "[Lalo]";
+ mes "Welcome! Archer friend.";
+ mes "Did you bring a Flower? Let me see.";
+ next;
+ if(countitem(1032) >= 1) goto L_UGLYFLOWER; //Items: Maneater_Blossom,
+ if(countitem(703) >= 1) goto L_FLOWER1; //Items: Hinalle,
+L_NEXT2:
+ if(countitem(708) >= 1) goto L_FLOWER2; //Items: Ment,
+L_NEXT3:
+ if(countitem(629) >= 1) goto L_FLOWER3; //Items: Singing_Flower,
+L_NEXT4:
+ if(countitem(710) >= 1) goto L_FLOWER4; //Items: Illusion_Flower,
+L_NEXT5:
+ if(countitem(748) >= 1) goto L_FLOWER5; //Items: Witherless_Rose,
+L_NEXT6:
+ if(countitem(709) >= 1) goto L_FLOWER6; //Item: Izidor
+L_NEXT7:
+ if(countitem(712) < 1) goto M_NOTHAVE; //Item: Flower//Items: Flower,
+
+ mes "[Lalo]";
+ mes "Eh? This is just a normal flower.";
+ mes "I like it... but it's not enough.";
+ mes "Please bring me a different flower.";
+ close;
+
+L_UGLYFLOWER:
+ mes "[Lalo]";
+ mes "What is it?! Please, back off and put it away from my face.";
+ mes "I do really hate maneater blossoms!!!";
+ mes "THEY ARE SO UGLY!";
+ emotion e_omg;
+ close;
+
+M_NOTHAVE:
+ mes "[Lalo]";
+ mes "Well suit your self.";
+ mes "I dont like that flower anyway.";
+ close;
+
+L_FLOWER1:
+ mes "[Lalo]";
+ mes "Can I have that Hinalle?";
+ next;
+ menu "Yes",-,"No",L_NEXT2;
+ if(countitem(703) < 1) goto M_NOTHAVE;
+ delitem 703,1; //Items: Hinalle,
+ goto L_GOOD;
+
+L_FLOWER2:
+ mes "[Lalo]";
+ mes "Can I have that Ment?";
+ next;
+ menu "Yes",-,"No",L_NEXT3;
+ if(countitem(708) < 1) goto M_NOTHAVE;
+ delitem 708,1; //Items: Ment,
+ goto L_GOOD;
+
+L_FLOWER3:
+ mes "[Lalo]";
+ mes "Can I have that Singing Flower?";
+ next;
+ menu "Yes",-,"No",L_NEXT4;
+ if(countitem(629) < 1) goto M_NOTHAVE;
+ delitem 629,1; //Items: Singing_Flower,
+ goto L_GOOD;
+
+L_FLOWER4:
+ mes "[Lalo]";
+ mes "Can I have that Illusion Flower?";
+ next;
+ menu "Yes",-,"No",L_NEXT5;
+ if(countitem(710) < 1) goto M_NOTHAVE;
+ delitem 710,1; //Items: Illusion_Flower,
+ goto L_GOOD;
+
+L_FLOWER5:
+ mes "[Lalo]";
+ mes "Can I have that Witherless Rose?";
+ next;
+ menu "Yes",-,"No",L_NEXT6;
+ if(countitem(748) < 1) goto M_NOTHAVE;
+ delitem 748,1; //Items: Witherless_Rose,
+ goto L_GOOD;
+
+L_FLOWER6:
+ mes "[Lalo]";
+ mes "Can I have that Izidor?";
+ next;
+ menu "Yes",-,"No",L_NEXT7;
+ if(countitem(709) < 1) goto M_NOTHAVE;
+ delitem 709,1; //Items: Izidor
+
+L_GOOD:
+ mes "[Lalo]";
+ mes "It doesn't have a scent but it's a";
+ mes "very moderate cute flower.";
+ mes "The leaves gave me strength when I";
+ mes "used to fall.";
+ mes "I really like this flower, thank you.";
+ next;
+ mes "[Lalo]";
+ mes "As I promised, I'll help you become a Bard.";
+ mes "But it's not easy my friend. Haha!";
+ next;
+ mes "[Lalo]";
+ mes "It is important to get to know";
+ mes "lot of people to learn how to sing.";
+ mes "You must also keep up with all the";
+ mes "things going on different villages...";
+ next;
+ mes "[Lalo]";
+ mes "There's a talking snowman in a town called Lutie.";
+ mes "Go there and bring back a present.";
+ next;
+ mes "[Lalo]";
+ mes "If you become friends with Jack";
+ mes "Frost, you will receive something.";
+ mes "And also talk to townspeople";
+ mes "while you're at it...";
+ set BARD_Q,2;
+ close;
+L_BQ2:
+ if (xmas_npc == 11) goto L_BQ3; //this var is set in LUTIE.TXT
+ mes "[Lalo]";
+ mes "I'm waiting for the good news.";
+ mes "For now go to Lutie and make";
+ mes "friends with Jack Frost.";
+ close;
+L_BQ3:
+ mes "[Lalo]";
+ mes "How was the trip? Did you meet a lot of people?";
+ mes "You should have more important than a gift.";
+ set BARD_Q,3;
+ next;
+L_SINGING:
+ mes "[Lalo]";
+ mes "Then, do you want to try singing...?";
+ mes "I'll sing a short melody...";
+ mes "and you try after.";
+ next;
+ mes "[Lalo]";
+ mes "Here I go.";
+ mes "Ehem *clears throat*";
+ mes "1, 2, 3, 4";
+ next;
+ mes "[Lalo]";
+//this should text input
+ mes "All Gods never age.";
+ mes "The ever so beautiful Goddess";
+ mes "Eden,";
+ mes "Beatuful and graceful Goddess";
+ mes "Eden,";
+ mes "Odin's daugther-in-law and Bragis";
+ mes "wife";
+ mes "Her sweet apples in her basket,";
+ mes "All thanks to her sweet apples.";
+
+ set @score,0;
+ next;
+ mes "[Lalo]";
+ mes "Now you try...";
+ next;
+
+ menu "All Gods never age.",-,"All Gods never age?",M_S2,"All Gods never age,",M_S2,"Are Gods never age?",M_S2;
+
+ set @score,@score+10;
+
+M_S2:
+ menu "The ever so beautiful Goddess,",M_S3,"The ever so beautiful Goddess.",M_S3,"The never beautiful Goddess.",M_S3,"The ever so beautiful Goddess",-;
+
+ set @score,@score+10;
+
+M_S3:
+ menu "Odins,",M_S4,"Odin.",M_S4,"Odin,",M_S4,"Eden,",-;
+
+ set @score,@score+10;
+M_S4:
+ menu "Very beatuful Goddess",M_S5,"Beatuful and Graceful Goddess",M_S5,"Beatuful and graceful Goddess",-,"Beatuful and the graceful Goddess",M_S5;
+
+ set @score,@score+10;
+M_S5:
+ menu "Eden.",M_S6,"Odins,",M_S6,"Eden,",-,"Edens,",M_S6;
+
+ set @score,@score+10;
+M_S6:
+ menu "Brags daugther-in-law and Odin's",M_S7,"Brags and Odin's daugther-in-law",M_S7,"Odin's daugther-in-law and Bragis",-,"Odin's daugther-in-law and Brags",M_S7;
+
+ set @score,@score+10;
+M_S7:
+ menu "whales",M_S8,"wifes",M_S8,"wife",-,"waffels",M_S8;
+
+ set @score,@score+10;
+M_S8:
+ menu "Her sweet apple in her basket,",M_S9,"Her sweet apple in her basket",M_S9,"Her sweet apples in her basket,",-;
+
+ set @score,@score+10;
+M_S9:
+ menu "All thanks to her sweet apple!",M_S10,"All thanks to her sweet apples.",-,"All thanks to her sweet apples!",M_S10;
+
+ set @score,@score+10;
+M_S10:
+ next;
+ if(@score >= 90) goto L_GOODWORK;
+ mes "[Lalo]";
+ mes "Oy, You got the lyrics wrong!";
+ mes "Can't you even sing along...?";
+ next;
+ mes "[Lalo]";
+ mes "Your pronunciation is very unclear.";
+ mes "Do a better job next time.";
+ close;
+
+L_GOODWORK:
+ set BARD_Q,4;
+ mes "[Lalo]";
+ mes "Wonderful! Finish it in one try!";
+ mes "You can become a great Bard.";
+ next;
+ mes "[Lalo]";
+ mes "Do you want to just change jobs now?";
+ mes "Or do you want a present?";
+ next;
+ menu "Just change my job please.",-,"I'd be thankful for a present.",M_PRESENTPLZ;
+
+ if(skillpoint != 0) goto L_SKILLSLEFT;
+ goto L_CHANGE;
+
+M_PRESENTPLZ:
+ mes "[Lalo]";
+ mes "Hmmm...very well, bring some trunks.";
+ mes "It doesn't matter what kind, as";
+ mes "long they are ^FF000060 of the same kind^000000...";
+ next;
+ mes "[Lalo]";
+ mes "I will give you a gift once you";
+ mes "bring them have a safe trip.";
+ close;
+
+L_SKILLSLEFT:
+ mes "[Lalo]";
+ mes "Hmmm... you seems to have some skill points left.";
+ mes "Use them all and come back to me again.";
+ close;
+
+L_BQ4:
+ set @gift,0;
+ if (countitem(1019) >= 60) set @gift,5; // Trunk//Items: Trunk,
+ if (countitem(1068) >= 60) set @gift,4; // Barren_Trunk//Items: Barren_Trunk,
+ if (countitem(1067) >= 60) set @gift,3; // Solid_Trunk//Items: Solid_Trunk,
+ if (countitem(1066) >= 60) set @gift,2; // Fine-grained_Trunk//Items: Fine-grained_Trunk,
+ if (JBLVL == 50 && countitem(1066) >=60) set @gift,1; // Fine-grained_Trunk//Items: Fine-grained_Trunk,
+
+ if (@gift!=0) goto L_CHANGE;
+
+ mes "[Lalo]";
+ mes "Mmm? Seems like you haven't prepared all trunks yet?";
+ mes "Do you want to just change jobs anyways?";
+ next;
+ menu "Yes",L_CHANGE,"Wait, not yet",-;
+
+ mes "[Lalo]";
+ mes "Ok I'll just wait here.";
+ close;
+
+L_CHANGE:
+ if(skillpoint != 0) goto L_SKILLSLEFT;
+ callfunc "Job_Change",Job_Bard;
+ callfunc "F_ClearJobVar";
+
+ mes "[Lalo]";
+ if (@gift==0) goto L_NOGIFT;
+
+ mes "Good job. I will make you a";
+ mes "job change with this souvenir.";
+ mes "Wait just a moment.";
+ next;
+ mes "Scrape Scrape Tang Tang";
+ mes "Squeak Squeak Scratch Scratch";
+ next;
+
+ switch(@gift){
+ case 1:
+ delitem 1066,60; //Fine-grained_Trunk + 50 JobLvl --> Harp [2]
+ getitem 1910,1;
+ break;
+ case 2:
+ delitem 1066,60; //Fine-grained_Trunk --> Lute [2]
+ getitem 1905,1;
+ break;
+ case 3:
+ delitem 1067,60; //Solid_Trunk --> Mandolin [2]
+ getitem 1903,1;
+ break;
+ case 4:
+ delitem 1068,60; //Barren_Trunk --> Mandolin [2]
+ getitem 1903,1;
+ break;
+ case 5:
+ delitem 1019,60; //Trunk --> Violin [3]
+ getitem 1901,1;
+ }
+
+ emotion e_grat;
+ mes "[Lalo]";
+ mes "Here you go, a souvenir. It is";
+ mes "useful when you sing.";
+L_NOGIFT:
+ mes "Hope you sing happy songs.";
+ next;
+L_CLOSE:
+ mes "[Lalo]";
+ mes "See you next time!";
+ close;
+}
diff --git a/npc/jobs/2-2/dancer.txt b/npc/jobs/2-2/dancer.txt
index fa3ef1b40..7e8a3696a 100644
--- a/npc/jobs/2-2/dancer.txt
+++ b/npc/jobs/2-2/dancer.txt
@@ -1,1057 +1,1057 @@
-//===== eAthena Script =======================================
-//= Dancer Job Quest
-//===== By: ==================================================
-//= Kalen - Original jAthena
-//= Fredzilla - Converted
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= eAthena Final
-//===== Description: =========================================
-//= Dancer job quest based off a jAthena script and other sources for clarity
-//===== Additional Comments: =================================
-//= 1.5 Added Baby Class Support [Fredzilla]
-//= 1.1 Removed the warp I left here my accident, added a check for using
-//= Improved Concentration and arrow shower, people could get away with it
-//= [Fredzilla]
-//= 1.0 I tried to keep as much the same from the Jap version as possible
-//= this turned out to be quite hard, but on the whole it is the same script
-//= I have added some new things, and changed some of the used commands,
-//= along with some optimization. [Fredzilla]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Script check #1. [Lance]
-//= 2.2 Fixed unpassable part, thx2 Alis [Lupus]
-//============================================================
-
-//= Warning Warp to escape the quest if need be
-job_duncer.gat,69,165,1 script wwarp 45,1,1,{
- mes "[Warning]";
- mes "This is the way out, this will cancel your quest if you leave";
- next;
- menu "Leave the quest",-,"Cancel",L_Can;
- warp "comodo.gat",193,149;
- end;
-L_Can:
- close;
-}
-
-//= Warp man, takes you to the quest map (Comodo Theater)
-comodo.gat,193,151,4 script Bor Robin 86,{
- callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Gypsy,"Gypsy","Bor Robin";
-
- mes "[Bor Robin]";
- mes "Well...... alot of people seem to be coming here lately.";
- next;
- mes "[Bor Robin]";
- mes "They used to become dancers instantaneously.";
- mes "I've seen right before my eyes, more than I could count.";
- mes "Now only people who are worthy can become dancers.";
- next;
- mes "[Bor Robin]";
- mes "Becoming a dancer in these times would bring you true happiness.";
- mes "It would be great to see more dancers around.";
- next;
- mes "[Bor Robin]";
- mes "I can take you to the Comodo Theater if you want.";
- mes " ";
- mes "What have you got to say?";
- next;
- menu "Can you take me to the Theater?",L1,"I want to Leave",-;
- mes "[Bor Robin]";
- mes "Come back when you feel ready.";
- close;
-L1:
- mes "[Bor Robin]";
- mes "I will take you now.";
- close2;
- warp "job_duncer.gat",70,49;
- end;
-}
-//= 1st quest NPC, asks for Items and/or money, then passes you onto the next NPC
-job_duncer.gat,43,93,4 script Aire 724,{
- if (BaseJob == Job_Archer && Sex == 0) goto Larcher;
- if (BaseJob == Job_Dancer) goto Ldancer;
- if (Upper==1) goto LUpper1;
- mes "[Aire]";
- mes "Hi "+strcharinfo(0)+", you are only allowed to stay in this room any where else is off limits to you.";
- next;
- mes "[Aire]";
- mes "We can't just let anyone become a dancer, there is no reason other than this for people to be here.";
- next;
- mes "[Aire]";
- mes "You can stay and watch the dance stage if you want to, there might be an audition going on.";
- mes "See you later.";
- close;
-Ldancer:
- mes "[Aire]";
- mes "Nice to see you return.";
- mes "How have you been recently?";
- mes "Have you been bringing many people joy?";
- close;
-Larcher:
- if (Upper == 1) goto LUpper1;
- if (DANC_Q == 1) goto LStart2;
- if (DANC_Q == 2) goto LItem1;
- if (DANC_Q == 3) goto LItem2;
- if (DANC_Q == 4) goto LItem3;
- if ((DANC_Q == 5) || (DANC_Q == 6)) goto LStart3;
- if (DANC_Q >= 7) goto LStart4;
- mes "[Aire]";
- mes "Welcome to our Theater.";
- mes "This is where various dances are taught.";
- next;
- mes "[Aire]";
- mes "Sightseers visit from all other the place, to watch the dancers.";
- next;
- mes "[Aire]";
- mes "We can also train new dancers here, obviously for a price, we dont want to go out of business.";
- next;
- mes "[Aire]";
- mes "You must first fill in the application form.";
- mes "All you have to do is write in your details.";
- next;
- mes "[Aire]";
- mes "So what do you say?";
- mes "Are you proposing you become a dancer? or will you be leaving like many before you.";
- next;
- menu "Fill in the form",L1,"Leave",-;
- mes "[Aire]";
- mes "If you do reconsider please return to me.";
- mes "See you later.";
- close;
-L1:
- if (JobLevel < 40) goto Llowlv;
- mes "[Aire]";
- mes "So you are ready to start you journey!";
- mes "Please enter in the application form which is there.";
- next;
- mes "......";
- next;
- mes "......Filling in information......";
- next;
- mes "......";
- next;
- mes "[Aire]";
- mes "Your name......";
- mes strcharinfo(0)+"......";
- mes "That is a cute name!";
- next;
- mes "[Aire]";
- mes "You will need to do a little waiting.";
- mes "The form is being read by the dancing school teacher.";
- next;
- mes "[Aire]";
- mes "When you have time for the next part of your journey talk to me again";
- set DANC_Q,1;
- close;
-LStart2:
- mes "[Aire]";
- mes "Your proposal has been accepted, but you still need to bring some items, and maybe zeny to cover the bill of our school.";
- next;
- mes "[Aire]";
- mes "Lets see what items you will need to bring to cover your bill.";
- mes " ";
- mes "Ok...";
- next;
-//3 Random sets
- mes "[Aire]";
- set @itemset, rand(1,3);
- if (@itemset == 2) goto ItemSet2;
- if (@itemset == 3) goto ItemSet3;
-
- mes "The cost for the lesson will be :-";
- mes "^0000FF10,000 Zeny^000000";
- mes "A pair of ^0000FFUnslotted Shoes^000000";
- mes "^0000FF20 Sticky Mucus^000000";
- mes "^0000FF5 Red Potions^000000";
- mes "^0000FF3 Jellopy^000000";
- next;
- mes "[Aire]";
- mes "When you have all these, I can prepare the lesson for you.";
- mes " ";
- mes "Come and speak to me again when you are ready.";
- set DANC_Q,2;
- close;
-ItemSet2:
- mes "The cost for the lesson will be :-";
- mes "^0000FF10,000 Zeny^000000";
- mes "A pair of ^0000FFUnslotted Boots^000000";
- mes "^0000FF5 earthworm skins^000000";
- next;
- mes "[Aire]";
- mes "When you have all these, I can prepare the lesson for you.";
- mes " ";
- mes "Come and speak to me again when you are ready.";
- set DANC_Q,3;
- close;
-ItemSet3:
- mes "The cost for the lesson will be :-";
- mes "A pair of ^0000FFUnslotted Sandals^000000";
- mes "^0000FF2 Clam Shells^000000";
- mes "^0000FF5 Yellow Potions^000000";
- mes "^0000FF20 Jellopy^000000";
- mes "^0000FF10 Black Hair^000000";
- next;
- mes "[Aire]";
- mes "When you have all these, I can prepare the lesson for you.";
- mes "Come and speak to me again when you are ready.";
- set DANC_Q,4;
- close;
-
-LItem1:
- if ((countitem(938) >= 20) && (countitem(501) >= 5) && (countitem(909) >= 3) && (countitem(2403) >= 1) && (Zeny >= 10000)) goto LItem1OK;
- mes "[Aire]";
- mes "Something is wrong here.";
- mes "Seems you dont have enough items, we need everything that was asked for.";
- mes "They are all necessary for you to be taught.";
- mes "In case you have forgotten, please bring.";
- next;
- mes "[Aire]";
- mes "^0000FF10000 Zeny^000000";
- mes "A pair of ^0000FFUnslotted Shoes^000000";
- mes "^0000FF20 Sticky Mucus^000000";
- mes "^0000FF5 Red Potions^000000";
- mes "^0000FF3 Jellopy^000000";
- next;
- mes "[Aire]";
- mes "Dont forget to get everything.";
- mes "What are you waiting for?";
- mes "see you back here soon";
- close;
-LItem2:
- if ((countitem(1055) >= 5) && (countitem(2405) >= 1) && (Zeny >= 10000)) goto LItem2OK;
- mes "Something is wrong here.";
- mes "Seems you dont have enough items, we need everything that was asked for.";
- mes "They are all necessary for you to be taught.";
- mes "In case you have forgotten, please bring.";
- next;
- mes "[Aire]";
- mes "^0000FF10000 Zeny^000000";
- mes "A pair of ^0000FFUnslotted Boots^000000";
- mes "^0000FF5 earthworm skins^000000";
- next;
- mes "[Aire]";
- mes "Dont forget to get everything.";
- mes "What are you waiting for?";
- mes "see you back here soon";
- close;
-LItem3:
- if ((countitem(965) >= 2) && (countitem(503) >= 5) && (countitem(909) >= 20) && (countitem(1020) >= 10) && (countitem(2401) >= 1)) goto LItem3OK;
- mes "Something is wrong here.";
- mes "Seems you dont have enough items, we need everything that was asked for.";
- mes "They are all necessary for you to be taught.";
- mes "In case you have forgotten, please bring.";
- next;
- mes "[Aire]";
- mes "A pair of ^0000FFUnslotted Sandals^000000";
- mes "^0000FF2 Clam Shells^000000";
- mes "^0000FF5 Yellow Potions^000000";
- mes "^0000FF20 Jellopy^000000";
- mes "^0000FF10 Black Hair^000000";
- next;
- mes "[Aire]";
- mes "Dont forget to get everything.";
- mes "What are you waiting for?";
- mes "see you back here soon";
- close;
-LItem1OK:
- mes "[Aire]";
- mes "Lets see here, oh you brought everything.";
- mes "I accept your payment!";
- set Zeny,Zeny-10000;
- delitem 938,20;
- delitem 501,5;
- delitem 909,3;
- delitem 2403,1;
- next;
- goto LStart3;
-LItem2OK:
- mes "[Aire]";
- mes "Lets see here, oh you brought everything.";
- mes "I accept your payment!";
- set Zeny,Zeny-10000;
- delitem 1055,5;
- delitem 2405,1;
- next;
- goto LStart3;
-LItem3OK:
- mes "[Aire]";
- mes "Lets see here, oh you brought everything.";
- mes "I accept your payment!";
- delitem 965,2;
- delitem 503,5;
- delitem 909,20;
- delitem 1020,10;
- delitem 2401,1;
- next;
-LStart3:
- mes "[Aire]";
- mes "Now that the cost of the training is out of that way, we need you to participate in an interview, and pass a small test to be worthy of becoming a dancer.";
- next;
- mes "[Aire]";
- mes "Your interview and test will be performed by ^0000FF'Bijou'^000000.";
- mes "Please go and see her as soon as posible.";
- if (DANC_Q < 5) set DANC_Q,5;
- close;
-LStart4:
- mes "[Aire]";
- mes "Practice enthusiastically that cute dance.";
- mes "When you have completed your training please show me!";
- close;
-Llowlv:
- mes "[Aire]";
- mes "Huh......";
- mes "I am very sorry, but you have not met our minimun job level requirements.";
- next;
- mes "[Aire]";
- mes "You need to be at least above Job Lvl 40.";
- mes "Please return when you are Job Lvl 40 or higher.";
- mes "Don't tell anyone I told you this, but if you complete the training for dancer and you are Job Lvl 50 you get an extra gift from us.";
- mes "Enjoy your day.";
- close;
-LUpper1:
- mes "[Aire]";
- mes "It's such a big honor to salute envoys of Valhalla.";
- mes "Come again.";
- emotion e_ho;
- close;
-
-}
-//= 2nd "Quest" and Job changer for after the 3rd Quest
-job_duncer.gat,95,93,4 script Bijou 101,{
- if (BaseJob == Job_Archer && Sex == 0) goto LArcher;
- if (BaseJob == Job_Dancer) goto LDancer;
- mes "[Bijou]";
- mes "Welcome to our Dance Theater, there are many dancers around here.";
- next;
- mes "[Bijou]";
- mes "Unfortunately for you I have already retired from being a dancer, but I stay here to train new dancers.";
- next;
- mes "[Bijou]";
- mes "The hardest part of becoming a dancer is the physical test of timing and speed, which is done at the stage.";
- mes "";
- mes "I will call out directions to the trainee, and they need to follow them to the letter.";
- mes "If they complete that test they come back to me for the final part of their training, and they leave as a dancer.";
- close;
-LDancer:
- mes "[Bijou]";
- mes "What will you be doing today?";
- next;
- mes "[Bijou]";
- mes "Go and bring joy to all the others that you see.";
- mes "Making impression on the many people.";
- mes "Help other as much as possible.";
- mes "Don't forget your training.";
- mes "See you again soon!";
- close;
-LArcher:
- if (Skillpoint != 0) goto LErrorA;
- if (DANC_Q == 5) goto Ltest1;
- if (DANC_Q == 6) goto Ltest2;
- if ((DANC_Q == 7) || (DANC_Q == 8)) goto LStart2;
- if (DANC_Q == 10) goto Ljobchange;
- mes "[Bijou]";
- mes "So you want to become a dancer, eh?";
- next;
- mes "[Bijou]";
- mes "Well, it seems you haven't paid anything towards it yet.";
- mes "First you need to fill in an application, and be accepted.";
- mes "Once accepted you will need to give the payment, which can be all items, or some items and zeny.";
- mes "The person you need to go and talk to about this is 'Aire', she is the other side of the stage.";
- mes "When everything is ok with her come back to me.";
- close;
-LErrorA:
- mes "[Bijou]";
- mes "You still seem to have skill points.";
- mes "Until you use all of your points you cannot change jobs.";
- close;
-Ltest1:
- mes "[Bijou]";
- mes "So you want to become a dancer, eh?";
- next;
- mes "[Bijou]";
- mes "......You have already paid I see, so we can now continue.";
- next;
- mes "[Bijou]";
- mes "Before I can let you become a Dancer I need to test you mental attitude, this is done through a simple test.";
- mes "It is multiple choice and alot of them are common sense, well common for someone that has the mental attitude to become a dancer.";
- next;
- mes "[Bijou]";
- mes "There is a total of 10 questions, for each one you get correct you are awarded 10 points.";
- mes " ";
- mes "There are some answers that will reduce your final score, try and avoid answering them wrong.";
- next;
- goto LsetQ;
-Ltest2:
- mes "[Bijou]";
- if(DANC_Q == 6) mes "Back for another try?";
- mes "Good luck to you, now let the test begin.";
- next;
-LsetQ:
- set @rand,rand(2);
- set @dcpoint,0;
- if (@rand == 1) goto LQuestion2;
-//-------
-LQuestion1:
- mes "[Bijou]";
- mes "1.";
- mes "^00FF00Subject:^000000 Dancer + bard combination playing skill.";
- mes "What is the effect of ^777777'Classical Pluck/Loki's Veil'^000000 ?";
- next;
- menu "Attack power of the level 4 weapon improves",L1_2,"Double the damage that is done",L1_2,"Makes skills and magic unusable",-,"Attack speed rises",L1_2;
- set @dcpoint,@dcpoint+10;
-L1_2:
-//I am unsure about the translated meaning on Question 2, I tried to adapt it with my own question,
-//I will put a asterisk (*) next to all I have done this for, I done this so other people who might understand it better can correct it.
- mes "[Bijou]";
- mes "2.";
- mes "^00FF00Subject:^000000 After Dancing.";
- mes "After you have finished using an Ensemble skill with a partner what should you never do?";
- next;
- menu "Use words of appreciation towards the partner",L1_3,"The dance is praised",L1_3,"Invite the partner to dance again",L1_3,"You tell the partner they did an insufficient job",-;
- set @dcpoint,@dcpoint+10;
-L1_3:
-// *
- mes "[Bijou]";
- mes "3.";
- mes "^00FF00Subject:^000000 Before Dancing";
- mes "When a partner activates the incorrect dance what should you do?";
- next;
- menu "Smile and just continue to dance",L1_4,"Point out the mistake",-,"Cancel the dance and walk away",L1_4,"Hide your smirk",L1_4;
- set @dcpoint,@dcpoint+10;
-L1_4:
- mes "[Bijou]";
- mes "4.";
- mes "^00FF00Subject:^000000 General Knowledge.";
- mes "What is the name of the village where you can designate the change of your occupation to that of a dancer?";
- next;
- menu "Prontera",L1_5,"Morroc",L1_5,"Al De Baran",L1_5,"Comodo",-;
- set @dcpoint,@dcpoint+10;
-L1_5:
- mes "[Bijou]";
- mes "5.";
- mes "^00FF00Subject:^000000 Places around Comodo.";
- mes "How many caves are directly connect to Comodo Village?";
- next;
- menu "1",L1_6,"2",L1_6,"3",-,"4",L1_6;
- set @dcpoint,@dcpoint+10;
-L1_6:
- mes "[Bijou]";
- mes "6.";
- mes "^00FF00Subject:^000000 Pet's.";
- mes "Which of the following is not able to be tamed?";
- next;
- menu "Isis",L1_7,"Argiope",-,"Dokebi",L1_7,"Deviruchi",L1_7;
- set @dcpoint,@dcpoint+10;
-L1_7:
- mes "[Bijou]";
- mes "7.";
- mes "^00FF00Subject:^000000 General Knowledge.";
- mes "Who is the best dancer?";
- next;
- menu strcharinfo(0),L1_7a,"Bijou",-,"Isis",L1_8,"Flora",L1_8;
- set @dcpoint,@dcpoint+10;
- goto L1_8;
- L1_7a:
- set @dcpoint,@dcpoint-100;
- mes ".........";
- next;
-L1_8:
-// *
- mes "[Bijou]";
- mes "8.";
- mes "^00FF00Subject:^000000 Places around Comodo.";
- mes "What is one of the main attractions of Comodo?";
- next;
- menu "A Church",L1_9,"Exceptionally good shops",L1_9,"The best chicken you can get anywhere",L1_9,"The Casino",-;
- set @dcpoint,@dcpoint+10;
-L1_9:
- mes "[...]";
- mes "9.";
- mes "^00FF00Subject:^000000 General Knowledge.";
- mes "What is my name?";
- next;
- menu "Gijou",L1_10,"Bijon",L1_10,"Bijou",-,"Bojou",L1_10;
- set @dcpoint,@dcpoint+10;
-// *
-L1_10:
- mes "[Bijou]";
- mes "10.";
- mes "^00FF00Subject:^000000 Dancer + bard combination playing skill.";
- mes "What is the effect of ^777777'Lullaby'^000000 ?";
- next;
- menu "Put enemy to sleep, in a 5x5 area",Lcheckpt,"Put enemy to sleep, in a 9x9 area",-,"Stun the enemy, in a 5x5 area",Lcheckpt,"Stun the enemy, in a 9x9 area",Lcheckpt;
- set @dcpoint,@dcpoint+10;
- goto Lcheckpt;
-//-------
-LQuestion2:
- mes "[Bijou]";
- mes "1.";
- mes "^00FF00Subject:^000000 Dancer skill.";
- mes "What is the effect of ^777777'Dancing Lessons'^000000? ";
- next;
- menu "Your INT is increased",L2_2,"The damage of whip type attacks are raised",-,"The damage of rod type attacks are raised",L2_2,"The damage of ranged type attacks are raised",L2_2;
- set @dcpoint,@dcpoint+10;
-L2_2:
- mes "[Bijou]";
- mes "2.";
- mes "^00FF00Subject:^000000 Dance Type.";
- mes "While doing this type of dance, you wear special shoes that make loud sounds";
- mes "What is this type of dancing called?";
- next;
- menu "Tap dance",-,"Improved Concentration",L2_3,"Tango",L2_3,"Salsa",L2_3;
- set @dcpoint,@dcpoint+10;
-L2_3:
- mes "[Bijou]";
- mes "3.";
- mes "^00FF00Subject:^000000 Dancer feature.";
- mes "Choose the thing a dancer cannot do";
- next;
- menu "Perform Dances",L2_4,"Attack at a long range",L2_4,"Use a Whip",L2_4,"Use a 2-Handed Sword",-;
- set @dcpoint,@dcpoint+10;
-L2_4:
- mes "[Bijou]";
- mes "4.";
- mes "^00FF00Subject:^000000 General Knowledge.";
- mes "What is the town where dancers stay the most?";
- next;
- menu "Al De Baran",L2_5,"Yuno",L2_5,"Morroc",L2_5,"Comodo",-;
- set @dcpoint,@dcpoint+10;
-L2_5:
- mes "[Bijou]";
- mes "5.";
- mes "^00FF00Subject:^000000 General Knowledge.";
- mes "What person can perfrom the most beautiful dances?";
- next;
- menu strcharinfo(0),L2_5a,"Bijou",-,"Isis",L2_6,"Emralhandas",L2_6;
- set @dcpoint,@dcpoint+10;
- goto L2_6;
- L2_5a:
- set @dcpoint,@dcpoint-100;
-L2_6:
- mes "[Bijou]";
- mes "6.";
- mes "^00FF00Subject:^000000 Dancer feature.";
- mes "The dancer, in comparison with other occupations, has what advantage?";
- next;
- menu "Physical strength",L2_7,"Performing skill power",L2_7,"Dance Capability",-,"Magic Capability",L2_7;
- set @dcpoint,@dcpoint+10;
-L2_7:
- mes "[Bijou]";
- mes "7.";
- mes "^00FF00Subject:^000000 Places around Comodo.";
- mes "What is the Casino managers name?";
- next;
- menu "Martine",L2_8,"Roberto",L2_8,"Moo",-,"Deniroz",L2_8;
- set @dcpoint,@dcpoint+10;
-L2_8:
- mes "[Bijou]";
- mes "8.";
- mes "^00FF00Subject:^000000 Dancer feature.";
- mes "As for the item which the dancer cannot equip?";
- next;
- menu "Hair band of cat",L2_9,"Two-handed Sword",-,"Sandals",L2_9,"Earring",L2_9;
- set @dcpoint,@dcpoint+10;
-L2_9:
- mes "[Bijou]";
- mes "9.";
- mes "^00FF00Subject:^000000 Opinion.";
- mes "Do you think this test is boring?";
- next;
- menu "It is",L2_10,"Give me more questions",-;
- set @dcpoint,@dcpoint+10;
-L2_10:
- mes "[Bijou]";
- mes "10.";
- mes "^00FF00Subject:^000000 Places around Comodo.";
- mes "How many lighthouses exist on Comodo Island?";
- next;
- menu "1",-,"2",Lcheckpt,"3",Lcheckpt;
- set @dcpoint,@dcpoint+10;
- goto Lcheckpt;
-//-------
-Lcheckpt:
- mes "[Bijou]";
- mes "You have now completed the test, lets see how you did......";
- next;
- mes "[Bijou]";
- mes "You got a total of "+@dcpoint+" points......";
- if ((@dcpoint >= 80) && (DANC_Q == 5)) goto LpointOK;
- if ((@dcpoint >= 70) && (DANC_Q == 6)) goto LpointOK;
- mes "I am going to need to disqualify you, cause you didnt reach the required ammount.";
- next;
- mes "[Bijou]";
- mes "You are allowed to take the test again if you like, for no extra charge.";
- if (DANC_Q==5) mes "Next time you take the test I will lower the amount of points you need to pass, to make it easier for you.";
- mes "Better luck next time, see you around!";
- set DANC_Q,6;
- close;
- LpointOK:
- if (@dcpoint == 100) mes "That is amazing, 100% correct.";
- if (@dcpoint != 100) mes "Even though you didnt get all the questions right, you have still passed.";
- next;
- mes "[Bijou]";
- mes "The next thing you need to do is pass a physical test of speed and timing";
- mes "when you are ready for this test talk to me again, I can also tell you more about the test before you take it.";
- set DANC_Q,7;
- close;
-LStart2:
- mes "[Bijou]";
- mes "Are you ready for this test? or do you want me to talk you through it first?";
- next;
- menu "Please Explain it to me",-,"Take me to the test area",Lwarp;
- mes "[Bijou]";
- mes "Think of this more as an audition than a test.";
- mes "We give you ^0000FF1 minute^000000 to impress us.";
- next;
- mes "[Bijou]";
- mes "There can only be ^0000FFone person^000000 at a time dancing on the stage.";
- next;
- mes "[Bijou]";
- mes "If there are people are infront of you stay in the ^0000FFwaiting room^000000 untill you hear the person infront of you passes or fails their test.";
- next;
- mes "[Bijou]";
- mes "Click in the window above the waiting room guide to get sent to the dance stage, if there is someone already on the stage it will not allow you to enter, you will need to wait.";
- next;
- mes "[Bijou]";
- mes "When you get put onto the stage get into a ^0000FFposition which can look around the whole stage^000000.";
- next;
- mes "[Bijou]";
- mes "Once you get onto the stage I will annouce that the time has started.";
- mes "Then I will start calling out directions for you to take.";
- next;
- mes "[Bijou]";
- mes "You then need to follow them directions as quickly as possible.";
- mes "^FF0000[ < ]^000000 = Move to the left";
- mes "^FF0000[ > ]^000000 = Move to the right";
- mes "^FF0000[ * ]^000000 = Go back to the center of the stage";
- mes "^FF0000[ \\/ ]^000000 = Move down towards the front of the stage";
- mes "^FF0000[ /\\ ]^000000 = Move up towards the back of the stage";
- next;
- mes "[Bijou]";
- mes "There are some other things you will need to do, so just be ready with your skills and bow just incase.";
- next;
- mes "[Bijou]";
- mes "Dont worry if you have no experience of dance, that is what this is for, so you dont need to worry.";
- close;
- Lwarp:
- mes "[Bijou]";
- mes "I will take you back stage so you can take you test!";
- set DANC_Q,8;
- close2;
- warp "job_duncer.gat",104,109;
- end;
-Ljobchange:
- mes "[Bijou]";
- mes "You have done great, you have passed all the tests we have set out for you.";
- next;
- mes "[Bijou]";
- mes "I now think you have sufficient knowledge to become a dancer now!";
- next;
- mes "[Bijou]";
- mes "Now...... please relax as we finish our training here.";
- next;
- mes "[Bijou]";
- mes "It will be your job to bring joy to all the people in Rune Midgard.";
- next;
- if (JobLevel == 50) set @item,1;
- if (JobLevel != 50) set @item,0;
- mes "[Bijou]";
- mes "Watch each time you dance from now on.";
- next;
- callfunc "Job_Change",Job_Dancer;
- callfunc "F_ClearJobVar";
- mes "[Bijou]";
- mes "The enjoyment of the people watching you perform......";
- next;
- mes "[Bijou]";
- mes "This present is from me!";
- if (@item == 0){
- getitem 1950,1;
- mes "Now take this Rope, and be the best dancer you can be!";
- } else {
- if (@item == 1) {
- getitem 1953,1;
- mes "Since you are very experienced I have given you a Line, instead of a simple Rope that normal people would get.";
- mes "Now take you Line, and be the best dancer you can be!";
- }
- }
- close;
-
-}
-
-//=Start of the 3rd quest is here, once complete you go back to Bijou to change job
-job_duncer.gat,32,152,6 script Guide::dancew 69,{
- end;
- OnWarp:
- warpwaitingpc "job_duncer.gat",70,112,1;
- disablewaitingroomevent;
- initnpctimer "jobDq";
- end;
-OnInit:
- waitingroom "Dance lesson waiting room",20,"dancew::OnWarp",1;
- end;
-}
-
-job_duncer.gat,0,0,0 script jobDq -1,{
- end;
-
-OnStart:
-
-OnTimer1000:
- mapannounce "job_duncer.gat","Bijou: The test begins, Total time allowed is 1 minute.",8;
- end;
-OnTimer3000:
- mapannounce "job_duncer.gat","Bijou: Step Up! [ /\\ ]",8;
- callsub L_SUB1,2000;
- end;
-OnTimer7000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the bottom. [ \\/ ]",8;
- callsub L_SUB5,2000;
- end;
-OnTimer11000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the left. [ < ]",8;
- callsub L_SUB2,2000;
- end;
-OnTimer15000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Go to the right. [ > ]",8;
- callsub L_SUB4,2000;
- end;
-OnTimer19000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Return to the middle. [ * ]",8;
- callsub L_SUB3,3000;
- end;
-OnTimer21000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Stay still!",8;
- end;
-OnTimer26000:
- set @skillcheck,Sp;
- mapannounce "job_duncer.gat","Bijou: Use 'Improved Concentration'!",8;
- end;
-OnTimer29000:
- if (@skillcheck==Sp) goto OnTimer80000;
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the left. [ < ]",8;
- callsub L_SUB2,2000;
- end;
-OnTimer33000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the bottom. [ \\/ ]",8;
- end;
-OnTimer35000:
- mapannounce "job_duncer.gat","Bijou: Directly the right! [ > ]",8;
- callsub L_SUB4,3000;
- end;
-OnTimer38000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Stay still!",8;
- end;
-OnTimer41000:
- mapannounce "job_duncer.gat","Bijou: The left * center * right * top [ < ] [ * ] [ > ] [ /\\ ]",8;
- callsub L_SUB1,0;
- end;
-OnTimer47000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the right. [ > ] ",8;
- callsub L_SUB4,3000;
- end;
-OnTimer50000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: The left * center * down * up: [ < ] [ * ] [ \\/ ] [ /\\ ] ",8;
- callsub L_SUB1,0;
- end;
-OnTimer56000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Once again, the left * center * down * up: [ < ] [ * ] [ \\/ ] [ /\\ ]",8;
- callsub L_SUB1,0;
- end;
-OnTimer62000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Down! [ \\/ ]",8;
- callsub L_SUB5,2500;
- end;
-OnTimer65000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: To the left! [ < ]",8;
- callsub L_SUB2,2500;
- end;
-OnTimer68000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Return to the middle. [ * ]",8;
- callsub L_SUB3,2500;
- end;
-OnTimer71000:
- donpcevent "::OnDE1";
- mapannounce "job_duncer.gat","Bijou: Kill the monster using Arrow Shower!",8;
- set @skillcheck,Sp;
- monster "job_duncer.gat",69,106,"Poring",1002,1,"jddie::OnStart";
- end;
-OnTimer76000:
- killmonsterall "job_duncer.gat";
- end;
-OnTimer80000:
- mapannounce "job_duncer.gat","Dancer: You were a bit too slow, sorry but you have failed.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- if (getareausers("job_duncer.gat",68,106,70,114) != 0) areawarp "job_duncer.gat",68,106,70,114,"job_duncer.gat",69,102;
- if (getareausers("job_duncer.gat",65,109,73,111) != 0) areawarp "job_duncer.gat",65,109,73,111,"job_duncer.gat",69,102;
- stopnpctimer;
- enablewaitingroomevent "dancew";
- end;
-L_SUB1:
- disablenpc "lefttile";
- disablenpc "middletile";
- disablenpc "righttile";
- disablenpc "lowertile";
- setnpctimer getarg(0),"jdt1";
- startnpctimer "jdt1";
- return;
-L_SUB2:
- disablenpc "uppertile";
- disablenpc "middletile";
- disablenpc "righttile";
- disablenpc "lowertile";
- setnpctimer getarg(0),"jdt2";
- startnpctimer "jdt2";
- return;
-L_SUB3:
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- setnpctimer getarg(0),"jdt3";
- startnpctimer "jdt3";
- return;
-L_SUB4:
- disablenpc "lefttile";
- disablenpc "middletile";
- disablenpc "uppertile";
- disablenpc "lowertile";
- setnpctimer getarg(0),"jdt4";
- startnpctimer "jdt4";
- return;
-L_SUB5:
- disablenpc "lefttile";
- disablenpc "middletile";
- disablenpc "righttile";
- disablenpc "uppertile";
- setnpctimer getarg(0),"jdt5";
- startnpctimer "jdt5";
- return;
-}
-job_duncer.gat,0,0,0 script jddie -1,{
-
-OnStart:
- if (@skillcheck==Sp) set @check,1;
- if (@check==0) mapannounce "job_duncer.gat","Dancer: Well done, you were very skillful, and have passed the test.",8;
- if (@check==1) mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to use arrow shower to kill the monster",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- if (@check==0) set DANC_Q,10;
- stopnpctimer "jobDq";
- enablewaitingroomevent "dancew";
- if (@check==1) set @check,0;
- warp "job_duncer.gat",69,102;
- end;
-}
-job_duncer.gat,63,110,4 script Back dancer #1::jdt1 724,{
- end;
-OnTimer5000:
- enablenpc "lefttile";
- enablenpc "middletile";
- enablenpc "righttile";
- enablenpc "lowertile";
- stopnpctimer;
- end;
-OnDE1:
- emotion 21;
- end;
-OnDE2:
- emotion e_omg;
- end;
-}
-job_duncer.gat,66,113,4 script Back dancer #2::jdt2 724,{
- end;
-OnTimer5000:
- enablenpc "uppertile";
- enablenpc "middletile";
- enablenpc "righttile";
- enablenpc "lowertile";
- stopnpctimer;
- end;
-OnDE1:
- emotion e_no1;
- end;
-OnDE2:
- emotion e_omg;
- end;
-}
-job_duncer.gat,72,113,4 script Back dancer #3::jdt3 724,{
- end;
-OnTimer5000:
- enablenpc "lefttile";
- enablenpc "uppertile";
- enablenpc "righttile";
- enablenpc "lowertile";
- stopnpctimer;
- end;
-OnDE1:
- emotion 21;
- end;
-OnDE2:
- emotion e_omg;
- end;
-}
-job_duncer.gat,75,110,4 script Back dancer #4::jdt4 724,{
- end;
-OnTimer5000:
- enablenpc "lefttile";
- enablenpc "middletile";
- enablenpc "uppertile";
- enablenpc "lowertile";
- stopnpctimer;
- end;
-OnDE1:
- emotion 21;
- end;
-OnDE2:
- emotion e_omg;
- end;
-}
-job_duncer.gat,75,110,4 script jdt5 139,{
- end;
-OnTimer5000:
- enablenpc "lefttile";
- enablenpc "middletile";
- enablenpc "righttile";
- enablenpc "uppertile";
- stopnpctimer;
- end;
-}
-job_duncer.gat,69,113,4 script uppertile 139,1,1,{
- end;
-OnTouch:
- mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+" the failed to make it in time.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- enablewaitingroomevent "dancew";
- stopnpctimer "jobDq";
- areawarp "job_duncer.gat",68,112,70,114,"job_duncer.gat",69,102;
- donpcevent "::OnDE2";
- end;
-OnDE1:
-OnInit:
- disablenpc "uppertile";
- end;
-}
-job_duncer.gat,66,110,4 script lefttile 139,1,1,{
- end;
-OnTouch:
- mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- enablewaitingroomevent "dancew";
- stopnpctimer "jobDq";
- areawarp "job_duncer.gat",65,109,67,111,"job_duncer.gat",69,102;
- donpcevent "::OnDE2";
- end;
-OnDE1:
-OnInit:
- disablenpc "lefttile";
- end;
-}
-job_duncer.gat,69,110,4 script middletile 139,1,1,{
- end;
-OnTouch:
- mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- enablewaitingroomevent "dancew";
- stopnpctimer "jobDq";
- areawarp "job_duncer.gat",68,109,70,111,"job_duncer.gat",69,102;
- donpcevent "::OnDE2";
- end;
-OnDE1:
-OnInit:
- disablenpc "middletile";
- end;
-}
-job_duncer.gat,72,110,4 script righttile 139,1,1,{
- end;
-OnTouch:
- mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- enablewaitingroomevent "dancew";
- stopnpctimer "jobDq";
- areawarp "job_duncer.gat",71,109,73,111,"job_duncer.gat",69,102;
- donpcevent "::OnDE2";
- end;
-OnDE1:
-OnInit:
- disablenpc "righttile";
- end;
-}
-job_duncer.gat,69,107,4 script lowertile 139,1,1,{
- end;
-OnTouch:
- mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
- disablenpc "uppertile";
- disablenpc "lefttile";
- disablenpc "righttile";
- disablenpc "lowertile";
- disablenpc "middletile";
- enablewaitingroomevent "dancew";
- stopnpctimer "jobDq";
- areawarp "job_duncer.gat",68,106,70,108,"job_duncer.gat",69,102;
- donpcevent "::OnDE2";
- end;
-OnDE1:
-OnInit:
- disablenpc "lowertile";
- end;
-}
-//= Some test NPC, activate these if you wanna try out the dance portion of the quest
-//==================================================================
-//job_duncer.gat,69,105,4 script TestDE1 98,{donpcevent "::OnDE1"; close;}
-//job_duncer.gat,69,110,4 script TestDE2 98,{donpcevent "::OnDE2"; close;}
-//job_duncer.gat,66,100,4 script WarpTilesON 98,{disablenpc "uppertile";disablenpc "lefttile";disablenpc "middletile";disablenpc "righttile";disablenpc "lowertile";close;}
-//job_duncer.gat,72,100,4 script WarpTilesOFF 98,{enablenpc "uppertile";enablenpc "lefttile";enablenpc "middletile";enablenpc "righttile";enablenpc "lowertile";close;}
-//==================================================================
-//job_duncer.gat,69,102,4 script Tester NPC 100,{
-// mes "[TEST]";
-// mes "want to take the dancing test?";
-// next;
-// menu "Yes",Lgo,"No",-;
-// close;
-//Lgo:
-// warp "job_duncer.gat",70,112;
-// initnpctimer "jobDq";
-// end;
-//}
+//===== eAthena Script =======================================
+//= Dancer Job Quest
+//===== By: ==================================================
+//= Kalen - Original jAthena
+//= Fredzilla - Converted
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= eAthena Final
+//===== Description: =========================================
+//= Dancer job quest based off a jAthena script and other sources for clarity
+//===== Additional Comments: =================================
+//= 1.5 Added Baby Class Support [Fredzilla]
+//= 1.1 Removed the warp I left here my accident, added a check for using
+//= Improved Concentration and arrow shower, people could get away with it
+//= [Fredzilla]
+//= 1.0 I tried to keep as much the same from the Jap version as possible
+//= this turned out to be quite hard, but on the whole it is the same script
+//= I have added some new things, and changed some of the used commands,
+//= along with some optimization. [Fredzilla]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Script check #1. [Lance]
+//= 2.2 Fixed unpassable part, thx2 Alis [Lupus]
+//============================================================
+
+//= Warning Warp to escape the quest if need be
+job_duncer.gat,69,165,1 script wwarp 45,1,1,{
+ mes "[Warning]";
+ mes "This is the way out, this will cancel your quest if you leave";
+ next;
+ menu "Leave the quest",-,"Cancel",L_Can;
+ warp "comodo.gat",193,149;
+ end;
+L_Can:
+ close;
+}
+
+//= Warp man, takes you to the quest map (Comodo Theater)
+comodo.gat,193,151,4 script Bor Robin 86,{
+ callfunc "F_BlockHigh",Job_Archer_High,"High Archer",Job_Gypsy,"Gypsy","Bor Robin";
+
+ mes "[Bor Robin]";
+ mes "Well...... alot of people seem to be coming here lately.";
+ next;
+ mes "[Bor Robin]";
+ mes "They used to become dancers instantaneously.";
+ mes "I've seen right before my eyes, more than I could count.";
+ mes "Now only people who are worthy can become dancers.";
+ next;
+ mes "[Bor Robin]";
+ mes "Becoming a dancer in these times would bring you true happiness.";
+ mes "It would be great to see more dancers around.";
+ next;
+ mes "[Bor Robin]";
+ mes "I can take you to the Comodo Theater if you want.";
+ mes " ";
+ mes "What have you got to say?";
+ next;
+ menu "Can you take me to the Theater?",L1,"I want to Leave",-;
+ mes "[Bor Robin]";
+ mes "Come back when you feel ready.";
+ close;
+L1:
+ mes "[Bor Robin]";
+ mes "I will take you now.";
+ close2;
+ warp "job_duncer.gat",70,49;
+ end;
+}
+//= 1st quest NPC, asks for Items and/or money, then passes you onto the next NPC
+job_duncer.gat,43,93,4 script Aire 724,{
+ if (BaseJob == Job_Archer && Sex == 0) goto Larcher;
+ if (BaseJob == Job_Dancer) goto Ldancer;
+ if (Upper==1) goto LUpper1;
+ mes "[Aire]";
+ mes "Hi "+strcharinfo(0)+", you are only allowed to stay in this room any where else is off limits to you.";
+ next;
+ mes "[Aire]";
+ mes "We can't just let anyone become a dancer, there is no reason other than this for people to be here.";
+ next;
+ mes "[Aire]";
+ mes "You can stay and watch the dance stage if you want to, there might be an audition going on.";
+ mes "See you later.";
+ close;
+Ldancer:
+ mes "[Aire]";
+ mes "Nice to see you return.";
+ mes "How have you been recently?";
+ mes "Have you been bringing many people joy?";
+ close;
+Larcher:
+ if (Upper == 1) goto LUpper1;
+ if (DANC_Q == 1) goto LStart2;
+ if (DANC_Q == 2) goto LItem1;
+ if (DANC_Q == 3) goto LItem2;
+ if (DANC_Q == 4) goto LItem3;
+ if ((DANC_Q == 5) || (DANC_Q == 6)) goto LStart3;
+ if (DANC_Q >= 7) goto LStart4;
+ mes "[Aire]";
+ mes "Welcome to our Theater.";
+ mes "This is where various dances are taught.";
+ next;
+ mes "[Aire]";
+ mes "Sightseers visit from all other the place, to watch the dancers.";
+ next;
+ mes "[Aire]";
+ mes "We can also train new dancers here, obviously for a price, we dont want to go out of business.";
+ next;
+ mes "[Aire]";
+ mes "You must first fill in the application form.";
+ mes "All you have to do is write in your details.";
+ next;
+ mes "[Aire]";
+ mes "So what do you say?";
+ mes "Are you proposing you become a dancer? or will you be leaving like many before you.";
+ next;
+ menu "Fill in the form",L1,"Leave",-;
+ mes "[Aire]";
+ mes "If you do reconsider please return to me.";
+ mes "See you later.";
+ close;
+L1:
+ if (JobLevel < 40) goto Llowlv;
+ mes "[Aire]";
+ mes "So you are ready to start you journey!";
+ mes "Please enter in the application form which is there.";
+ next;
+ mes "......";
+ next;
+ mes "......Filling in information......";
+ next;
+ mes "......";
+ next;
+ mes "[Aire]";
+ mes "Your name......";
+ mes strcharinfo(0)+"......";
+ mes "That is a cute name!";
+ next;
+ mes "[Aire]";
+ mes "You will need to do a little waiting.";
+ mes "The form is being read by the dancing school teacher.";
+ next;
+ mes "[Aire]";
+ mes "When you have time for the next part of your journey talk to me again";
+ set DANC_Q,1;
+ close;
+LStart2:
+ mes "[Aire]";
+ mes "Your proposal has been accepted, but you still need to bring some items, and maybe zeny to cover the bill of our school.";
+ next;
+ mes "[Aire]";
+ mes "Lets see what items you will need to bring to cover your bill.";
+ mes " ";
+ mes "Ok...";
+ next;
+//3 Random sets
+ mes "[Aire]";
+ set @itemset, rand(1,3);
+ if (@itemset == 2) goto ItemSet2;
+ if (@itemset == 3) goto ItemSet3;
+
+ mes "The cost for the lesson will be :-";
+ mes "^0000FF10,000 Zeny^000000";
+ mes "A pair of ^0000FFUnslotted Shoes^000000";
+ mes "^0000FF20 Sticky Mucus^000000";
+ mes "^0000FF5 Red Potions^000000";
+ mes "^0000FF3 Jellopy^000000";
+ next;
+ mes "[Aire]";
+ mes "When you have all these, I can prepare the lesson for you.";
+ mes " ";
+ mes "Come and speak to me again when you are ready.";
+ set DANC_Q,2;
+ close;
+ItemSet2:
+ mes "The cost for the lesson will be :-";
+ mes "^0000FF10,000 Zeny^000000";
+ mes "A pair of ^0000FFUnslotted Boots^000000";
+ mes "^0000FF5 earthworm skins^000000";
+ next;
+ mes "[Aire]";
+ mes "When you have all these, I can prepare the lesson for you.";
+ mes " ";
+ mes "Come and speak to me again when you are ready.";
+ set DANC_Q,3;
+ close;
+ItemSet3:
+ mes "The cost for the lesson will be :-";
+ mes "A pair of ^0000FFUnslotted Sandals^000000";
+ mes "^0000FF2 Clam Shells^000000";
+ mes "^0000FF5 Yellow Potions^000000";
+ mes "^0000FF20 Jellopy^000000";
+ mes "^0000FF10 Black Hair^000000";
+ next;
+ mes "[Aire]";
+ mes "When you have all these, I can prepare the lesson for you.";
+ mes "Come and speak to me again when you are ready.";
+ set DANC_Q,4;
+ close;
+
+LItem1:
+ if ((countitem(938) >= 20) && (countitem(501) >= 5) && (countitem(909) >= 3) && (countitem(2403) >= 1) && (Zeny >= 10000)) goto LItem1OK;
+ mes "[Aire]";
+ mes "Something is wrong here.";
+ mes "Seems you dont have enough items, we need everything that was asked for.";
+ mes "They are all necessary for you to be taught.";
+ mes "In case you have forgotten, please bring.";
+ next;
+ mes "[Aire]";
+ mes "^0000FF10000 Zeny^000000";
+ mes "A pair of ^0000FFUnslotted Shoes^000000";
+ mes "^0000FF20 Sticky Mucus^000000";
+ mes "^0000FF5 Red Potions^000000";
+ mes "^0000FF3 Jellopy^000000";
+ next;
+ mes "[Aire]";
+ mes "Dont forget to get everything.";
+ mes "What are you waiting for?";
+ mes "see you back here soon";
+ close;
+LItem2:
+ if ((countitem(1055) >= 5) && (countitem(2405) >= 1) && (Zeny >= 10000)) goto LItem2OK;
+ mes "Something is wrong here.";
+ mes "Seems you dont have enough items, we need everything that was asked for.";
+ mes "They are all necessary for you to be taught.";
+ mes "In case you have forgotten, please bring.";
+ next;
+ mes "[Aire]";
+ mes "^0000FF10000 Zeny^000000";
+ mes "A pair of ^0000FFUnslotted Boots^000000";
+ mes "^0000FF5 earthworm skins^000000";
+ next;
+ mes "[Aire]";
+ mes "Dont forget to get everything.";
+ mes "What are you waiting for?";
+ mes "see you back here soon";
+ close;
+LItem3:
+ if ((countitem(965) >= 2) && (countitem(503) >= 5) && (countitem(909) >= 20) && (countitem(1020) >= 10) && (countitem(2401) >= 1)) goto LItem3OK;
+ mes "Something is wrong here.";
+ mes "Seems you dont have enough items, we need everything that was asked for.";
+ mes "They are all necessary for you to be taught.";
+ mes "In case you have forgotten, please bring.";
+ next;
+ mes "[Aire]";
+ mes "A pair of ^0000FFUnslotted Sandals^000000";
+ mes "^0000FF2 Clam Shells^000000";
+ mes "^0000FF5 Yellow Potions^000000";
+ mes "^0000FF20 Jellopy^000000";
+ mes "^0000FF10 Black Hair^000000";
+ next;
+ mes "[Aire]";
+ mes "Dont forget to get everything.";
+ mes "What are you waiting for?";
+ mes "see you back here soon";
+ close;
+LItem1OK:
+ mes "[Aire]";
+ mes "Lets see here, oh you brought everything.";
+ mes "I accept your payment!";
+ set Zeny,Zeny-10000;
+ delitem 938,20;
+ delitem 501,5;
+ delitem 909,3;
+ delitem 2403,1;
+ next;
+ goto LStart3;
+LItem2OK:
+ mes "[Aire]";
+ mes "Lets see here, oh you brought everything.";
+ mes "I accept your payment!";
+ set Zeny,Zeny-10000;
+ delitem 1055,5;
+ delitem 2405,1;
+ next;
+ goto LStart3;
+LItem3OK:
+ mes "[Aire]";
+ mes "Lets see here, oh you brought everything.";
+ mes "I accept your payment!";
+ delitem 965,2;
+ delitem 503,5;
+ delitem 909,20;
+ delitem 1020,10;
+ delitem 2401,1;
+ next;
+LStart3:
+ mes "[Aire]";
+ mes "Now that the cost of the training is out of that way, we need you to participate in an interview, and pass a small test to be worthy of becoming a dancer.";
+ next;
+ mes "[Aire]";
+ mes "Your interview and test will be performed by ^0000FF'Bijou'^000000.";
+ mes "Please go and see her as soon as posible.";
+ if (DANC_Q < 5) set DANC_Q,5;
+ close;
+LStart4:
+ mes "[Aire]";
+ mes "Practice enthusiastically that cute dance.";
+ mes "When you have completed your training please show me!";
+ close;
+Llowlv:
+ mes "[Aire]";
+ mes "Huh......";
+ mes "I am very sorry, but you have not met our minimun job level requirements.";
+ next;
+ mes "[Aire]";
+ mes "You need to be at least above Job Lvl 40.";
+ mes "Please return when you are Job Lvl 40 or higher.";
+ mes "Don't tell anyone I told you this, but if you complete the training for dancer and you are Job Lvl 50 you get an extra gift from us.";
+ mes "Enjoy your day.";
+ close;
+LUpper1:
+ mes "[Aire]";
+ mes "It's such a big honor to salute envoys of Valhalla.";
+ mes "Come again.";
+ emotion e_ho;
+ close;
+
+}
+//= 2nd "Quest" and Job changer for after the 3rd Quest
+job_duncer.gat,95,93,4 script Bijou 101,{
+ if (BaseJob == Job_Archer && Sex == 0) goto LArcher;
+ if (BaseJob == Job_Dancer) goto LDancer;
+ mes "[Bijou]";
+ mes "Welcome to our Dance Theater, there are many dancers around here.";
+ next;
+ mes "[Bijou]";
+ mes "Unfortunately for you I have already retired from being a dancer, but I stay here to train new dancers.";
+ next;
+ mes "[Bijou]";
+ mes "The hardest part of becoming a dancer is the physical test of timing and speed, which is done at the stage.";
+ mes "";
+ mes "I will call out directions to the trainee, and they need to follow them to the letter.";
+ mes "If they complete that test they come back to me for the final part of their training, and they leave as a dancer.";
+ close;
+LDancer:
+ mes "[Bijou]";
+ mes "What will you be doing today?";
+ next;
+ mes "[Bijou]";
+ mes "Go and bring joy to all the others that you see.";
+ mes "Making impression on the many people.";
+ mes "Help other as much as possible.";
+ mes "Don't forget your training.";
+ mes "See you again soon!";
+ close;
+LArcher:
+ if (Skillpoint != 0) goto LErrorA;
+ if (DANC_Q == 5) goto Ltest1;
+ if (DANC_Q == 6) goto Ltest2;
+ if ((DANC_Q == 7) || (DANC_Q == 8)) goto LStart2;
+ if (DANC_Q == 10) goto Ljobchange;
+ mes "[Bijou]";
+ mes "So you want to become a dancer, eh?";
+ next;
+ mes "[Bijou]";
+ mes "Well, it seems you haven't paid anything towards it yet.";
+ mes "First you need to fill in an application, and be accepted.";
+ mes "Once accepted you will need to give the payment, which can be all items, or some items and zeny.";
+ mes "The person you need to go and talk to about this is 'Aire', she is the other side of the stage.";
+ mes "When everything is ok with her come back to me.";
+ close;
+LErrorA:
+ mes "[Bijou]";
+ mes "You still seem to have skill points.";
+ mes "Until you use all of your points you cannot change jobs.";
+ close;
+Ltest1:
+ mes "[Bijou]";
+ mes "So you want to become a dancer, eh?";
+ next;
+ mes "[Bijou]";
+ mes "......You have already paid I see, so we can now continue.";
+ next;
+ mes "[Bijou]";
+ mes "Before I can let you become a Dancer I need to test you mental attitude, this is done through a simple test.";
+ mes "It is multiple choice and alot of them are common sense, well common for someone that has the mental attitude to become a dancer.";
+ next;
+ mes "[Bijou]";
+ mes "There is a total of 10 questions, for each one you get correct you are awarded 10 points.";
+ mes " ";
+ mes "There are some answers that will reduce your final score, try and avoid answering them wrong.";
+ next;
+ goto LsetQ;
+Ltest2:
+ mes "[Bijou]";
+ if(DANC_Q == 6) mes "Back for another try?";
+ mes "Good luck to you, now let the test begin.";
+ next;
+LsetQ:
+ set @rand,rand(2);
+ set @dcpoint,0;
+ if (@rand == 1) goto LQuestion2;
+//-------
+LQuestion1:
+ mes "[Bijou]";
+ mes "1.";
+ mes "^00FF00Subject:^000000 Dancer + bard combination playing skill.";
+ mes "What is the effect of ^777777'Classical Pluck/Loki's Veil'^000000 ?";
+ next;
+ menu "Attack power of the level 4 weapon improves",L1_2,"Double the damage that is done",L1_2,"Makes skills and magic unusable",-,"Attack speed rises",L1_2;
+ set @dcpoint,@dcpoint+10;
+L1_2:
+//I am unsure about the translated meaning on Question 2, I tried to adapt it with my own question,
+//I will put a asterisk (*) next to all I have done this for, I done this so other people who might understand it better can correct it.
+ mes "[Bijou]";
+ mes "2.";
+ mes "^00FF00Subject:^000000 After Dancing.";
+ mes "After you have finished using an Ensemble skill with a partner what should you never do?";
+ next;
+ menu "Use words of appreciation towards the partner",L1_3,"The dance is praised",L1_3,"Invite the partner to dance again",L1_3,"You tell the partner they did an insufficient job",-;
+ set @dcpoint,@dcpoint+10;
+L1_3:
+// *
+ mes "[Bijou]";
+ mes "3.";
+ mes "^00FF00Subject:^000000 Before Dancing";
+ mes "When a partner activates the incorrect dance what should you do?";
+ next;
+ menu "Smile and just continue to dance",L1_4,"Point out the mistake",-,"Cancel the dance and walk away",L1_4,"Hide your smirk",L1_4;
+ set @dcpoint,@dcpoint+10;
+L1_4:
+ mes "[Bijou]";
+ mes "4.";
+ mes "^00FF00Subject:^000000 General Knowledge.";
+ mes "What is the name of the village where you can designate the change of your occupation to that of a dancer?";
+ next;
+ menu "Prontera",L1_5,"Morroc",L1_5,"Al De Baran",L1_5,"Comodo",-;
+ set @dcpoint,@dcpoint+10;
+L1_5:
+ mes "[Bijou]";
+ mes "5.";
+ mes "^00FF00Subject:^000000 Places around Comodo.";
+ mes "How many caves are directly connect to Comodo Village?";
+ next;
+ menu "1",L1_6,"2",L1_6,"3",-,"4",L1_6;
+ set @dcpoint,@dcpoint+10;
+L1_6:
+ mes "[Bijou]";
+ mes "6.";
+ mes "^00FF00Subject:^000000 Pet's.";
+ mes "Which of the following is not able to be tamed?";
+ next;
+ menu "Isis",L1_7,"Argiope",-,"Dokebi",L1_7,"Deviruchi",L1_7;
+ set @dcpoint,@dcpoint+10;
+L1_7:
+ mes "[Bijou]";
+ mes "7.";
+ mes "^00FF00Subject:^000000 General Knowledge.";
+ mes "Who is the best dancer?";
+ next;
+ menu strcharinfo(0),L1_7a,"Bijou",-,"Isis",L1_8,"Flora",L1_8;
+ set @dcpoint,@dcpoint+10;
+ goto L1_8;
+ L1_7a:
+ set @dcpoint,@dcpoint-100;
+ mes ".........";
+ next;
+L1_8:
+// *
+ mes "[Bijou]";
+ mes "8.";
+ mes "^00FF00Subject:^000000 Places around Comodo.";
+ mes "What is one of the main attractions of Comodo?";
+ next;
+ menu "A Church",L1_9,"Exceptionally good shops",L1_9,"The best chicken you can get anywhere",L1_9,"The Casino",-;
+ set @dcpoint,@dcpoint+10;
+L1_9:
+ mes "[...]";
+ mes "9.";
+ mes "^00FF00Subject:^000000 General Knowledge.";
+ mes "What is my name?";
+ next;
+ menu "Gijou",L1_10,"Bijon",L1_10,"Bijou",-,"Bojou",L1_10;
+ set @dcpoint,@dcpoint+10;
+// *
+L1_10:
+ mes "[Bijou]";
+ mes "10.";
+ mes "^00FF00Subject:^000000 Dancer + bard combination playing skill.";
+ mes "What is the effect of ^777777'Lullaby'^000000 ?";
+ next;
+ menu "Put enemy to sleep, in a 5x5 area",Lcheckpt,"Put enemy to sleep, in a 9x9 area",-,"Stun the enemy, in a 5x5 area",Lcheckpt,"Stun the enemy, in a 9x9 area",Lcheckpt;
+ set @dcpoint,@dcpoint+10;
+ goto Lcheckpt;
+//-------
+LQuestion2:
+ mes "[Bijou]";
+ mes "1.";
+ mes "^00FF00Subject:^000000 Dancer skill.";
+ mes "What is the effect of ^777777'Dancing Lessons'^000000? ";
+ next;
+ menu "Your INT is increased",L2_2,"The damage of whip type attacks are raised",-,"The damage of rod type attacks are raised",L2_2,"The damage of ranged type attacks are raised",L2_2;
+ set @dcpoint,@dcpoint+10;
+L2_2:
+ mes "[Bijou]";
+ mes "2.";
+ mes "^00FF00Subject:^000000 Dance Type.";
+ mes "While doing this type of dance, you wear special shoes that make loud sounds";
+ mes "What is this type of dancing called?";
+ next;
+ menu "Tap dance",-,"Improved Concentration",L2_3,"Tango",L2_3,"Salsa",L2_3;
+ set @dcpoint,@dcpoint+10;
+L2_3:
+ mes "[Bijou]";
+ mes "3.";
+ mes "^00FF00Subject:^000000 Dancer feature.";
+ mes "Choose the thing a dancer cannot do";
+ next;
+ menu "Perform Dances",L2_4,"Attack at a long range",L2_4,"Use a Whip",L2_4,"Use a 2-Handed Sword",-;
+ set @dcpoint,@dcpoint+10;
+L2_4:
+ mes "[Bijou]";
+ mes "4.";
+ mes "^00FF00Subject:^000000 General Knowledge.";
+ mes "What is the town where dancers stay the most?";
+ next;
+ menu "Al De Baran",L2_5,"Yuno",L2_5,"Morroc",L2_5,"Comodo",-;
+ set @dcpoint,@dcpoint+10;
+L2_5:
+ mes "[Bijou]";
+ mes "5.";
+ mes "^00FF00Subject:^000000 General Knowledge.";
+ mes "What person can perfrom the most beautiful dances?";
+ next;
+ menu strcharinfo(0),L2_5a,"Bijou",-,"Isis",L2_6,"Emralhandas",L2_6;
+ set @dcpoint,@dcpoint+10;
+ goto L2_6;
+ L2_5a:
+ set @dcpoint,@dcpoint-100;
+L2_6:
+ mes "[Bijou]";
+ mes "6.";
+ mes "^00FF00Subject:^000000 Dancer feature.";
+ mes "The dancer, in comparison with other occupations, has what advantage?";
+ next;
+ menu "Physical strength",L2_7,"Performing skill power",L2_7,"Dance Capability",-,"Magic Capability",L2_7;
+ set @dcpoint,@dcpoint+10;
+L2_7:
+ mes "[Bijou]";
+ mes "7.";
+ mes "^00FF00Subject:^000000 Places around Comodo.";
+ mes "What is the Casino managers name?";
+ next;
+ menu "Martine",L2_8,"Roberto",L2_8,"Moo",-,"Deniroz",L2_8;
+ set @dcpoint,@dcpoint+10;
+L2_8:
+ mes "[Bijou]";
+ mes "8.";
+ mes "^00FF00Subject:^000000 Dancer feature.";
+ mes "As for the item which the dancer cannot equip?";
+ next;
+ menu "Hair band of cat",L2_9,"Two-handed Sword",-,"Sandals",L2_9,"Earring",L2_9;
+ set @dcpoint,@dcpoint+10;
+L2_9:
+ mes "[Bijou]";
+ mes "9.";
+ mes "^00FF00Subject:^000000 Opinion.";
+ mes "Do you think this test is boring?";
+ next;
+ menu "It is",L2_10,"Give me more questions",-;
+ set @dcpoint,@dcpoint+10;
+L2_10:
+ mes "[Bijou]";
+ mes "10.";
+ mes "^00FF00Subject:^000000 Places around Comodo.";
+ mes "How many lighthouses exist on Comodo Island?";
+ next;
+ menu "1",-,"2",Lcheckpt,"3",Lcheckpt;
+ set @dcpoint,@dcpoint+10;
+ goto Lcheckpt;
+//-------
+Lcheckpt:
+ mes "[Bijou]";
+ mes "You have now completed the test, lets see how you did......";
+ next;
+ mes "[Bijou]";
+ mes "You got a total of "+@dcpoint+" points......";
+ if ((@dcpoint >= 80) && (DANC_Q == 5)) goto LpointOK;
+ if ((@dcpoint >= 70) && (DANC_Q == 6)) goto LpointOK;
+ mes "I am going to need to disqualify you, cause you didnt reach the required ammount.";
+ next;
+ mes "[Bijou]";
+ mes "You are allowed to take the test again if you like, for no extra charge.";
+ if (DANC_Q==5) mes "Next time you take the test I will lower the amount of points you need to pass, to make it easier for you.";
+ mes "Better luck next time, see you around!";
+ set DANC_Q,6;
+ close;
+ LpointOK:
+ if (@dcpoint == 100) mes "That is amazing, 100% correct.";
+ if (@dcpoint != 100) mes "Even though you didnt get all the questions right, you have still passed.";
+ next;
+ mes "[Bijou]";
+ mes "The next thing you need to do is pass a physical test of speed and timing";
+ mes "when you are ready for this test talk to me again, I can also tell you more about the test before you take it.";
+ set DANC_Q,7;
+ close;
+LStart2:
+ mes "[Bijou]";
+ mes "Are you ready for this test? or do you want me to talk you through it first?";
+ next;
+ menu "Please Explain it to me",-,"Take me to the test area",Lwarp;
+ mes "[Bijou]";
+ mes "Think of this more as an audition than a test.";
+ mes "We give you ^0000FF1 minute^000000 to impress us.";
+ next;
+ mes "[Bijou]";
+ mes "There can only be ^0000FFone person^000000 at a time dancing on the stage.";
+ next;
+ mes "[Bijou]";
+ mes "If there are people are infront of you stay in the ^0000FFwaiting room^000000 untill you hear the person infront of you passes or fails their test.";
+ next;
+ mes "[Bijou]";
+ mes "Click in the window above the waiting room guide to get sent to the dance stage, if there is someone already on the stage it will not allow you to enter, you will need to wait.";
+ next;
+ mes "[Bijou]";
+ mes "When you get put onto the stage get into a ^0000FFposition which can look around the whole stage^000000.";
+ next;
+ mes "[Bijou]";
+ mes "Once you get onto the stage I will annouce that the time has started.";
+ mes "Then I will start calling out directions for you to take.";
+ next;
+ mes "[Bijou]";
+ mes "You then need to follow them directions as quickly as possible.";
+ mes "^FF0000[ < ]^000000 = Move to the left";
+ mes "^FF0000[ > ]^000000 = Move to the right";
+ mes "^FF0000[ * ]^000000 = Go back to the center of the stage";
+ mes "^FF0000[ \\/ ]^000000 = Move down towards the front of the stage";
+ mes "^FF0000[ /\\ ]^000000 = Move up towards the back of the stage";
+ next;
+ mes "[Bijou]";
+ mes "There are some other things you will need to do, so just be ready with your skills and bow just incase.";
+ next;
+ mes "[Bijou]";
+ mes "Dont worry if you have no experience of dance, that is what this is for, so you dont need to worry.";
+ close;
+ Lwarp:
+ mes "[Bijou]";
+ mes "I will take you back stage so you can take you test!";
+ set DANC_Q,8;
+ close2;
+ warp "job_duncer.gat",104,109;
+ end;
+Ljobchange:
+ mes "[Bijou]";
+ mes "You have done great, you have passed all the tests we have set out for you.";
+ next;
+ mes "[Bijou]";
+ mes "I now think you have sufficient knowledge to become a dancer now!";
+ next;
+ mes "[Bijou]";
+ mes "Now...... please relax as we finish our training here.";
+ next;
+ mes "[Bijou]";
+ mes "It will be your job to bring joy to all the people in Rune Midgard.";
+ next;
+ if (JobLevel == 50) set @item,1;
+ if (JobLevel != 50) set @item,0;
+ mes "[Bijou]";
+ mes "Watch each time you dance from now on.";
+ next;
+ callfunc "Job_Change",Job_Dancer;
+ callfunc "F_ClearJobVar";
+ mes "[Bijou]";
+ mes "The enjoyment of the people watching you perform......";
+ next;
+ mes "[Bijou]";
+ mes "This present is from me!";
+ if (@item == 0){
+ getitem 1950,1;
+ mes "Now take this Rope, and be the best dancer you can be!";
+ } else {
+ if (@item == 1) {
+ getitem 1953,1;
+ mes "Since you are very experienced I have given you a Line, instead of a simple Rope that normal people would get.";
+ mes "Now take you Line, and be the best dancer you can be!";
+ }
+ }
+ close;
+
+}
+
+//=Start of the 3rd quest is here, once complete you go back to Bijou to change job
+job_duncer.gat,32,152,6 script Guide::dancew 69,{
+ end;
+ OnWarp:
+ warpwaitingpc "job_duncer.gat",70,112,1;
+ disablewaitingroomevent;
+ initnpctimer "jobDq";
+ end;
+OnInit:
+ waitingroom "Dance lesson waiting room",20,"dancew::OnWarp",1;
+ end;
+}
+
+job_duncer.gat,0,0,0 script jobDq -1,{
+ end;
+
+OnStart:
+
+OnTimer1000:
+ mapannounce "job_duncer.gat","Bijou: The test begins, Total time allowed is 1 minute.",8;
+ end;
+OnTimer3000:
+ mapannounce "job_duncer.gat","Bijou: Step Up! [ /\\ ]",8;
+ callsub L_SUB1,2000;
+ end;
+OnTimer7000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the bottom. [ \\/ ]",8;
+ callsub L_SUB5,2000;
+ end;
+OnTimer11000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the left. [ < ]",8;
+ callsub L_SUB2,2000;
+ end;
+OnTimer15000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Go to the right. [ > ]",8;
+ callsub L_SUB4,2000;
+ end;
+OnTimer19000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Return to the middle. [ * ]",8;
+ callsub L_SUB3,3000;
+ end;
+OnTimer21000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Stay still!",8;
+ end;
+OnTimer26000:
+ set @skillcheck,Sp;
+ mapannounce "job_duncer.gat","Bijou: Use 'Improved Concentration'!",8;
+ end;
+OnTimer29000:
+ if (@skillcheck==Sp) goto OnTimer80000;
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the left. [ < ]",8;
+ callsub L_SUB2,2000;
+ end;
+OnTimer33000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the bottom. [ \\/ ]",8;
+ end;
+OnTimer35000:
+ mapannounce "job_duncer.gat","Bijou: Directly the right! [ > ]",8;
+ callsub L_SUB4,3000;
+ end;
+OnTimer38000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Stay still!",8;
+ end;
+OnTimer41000:
+ mapannounce "job_duncer.gat","Bijou: The left * center * right * top [ < ] [ * ] [ > ] [ /\\ ]",8;
+ callsub L_SUB1,0;
+ end;
+OnTimer47000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the right. [ > ] ",8;
+ callsub L_SUB4,3000;
+ end;
+OnTimer50000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: The left * center * down * up: [ < ] [ * ] [ \\/ ] [ /\\ ] ",8;
+ callsub L_SUB1,0;
+ end;
+OnTimer56000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Once again, the left * center * down * up: [ < ] [ * ] [ \\/ ] [ /\\ ]",8;
+ callsub L_SUB1,0;
+ end;
+OnTimer62000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Down! [ \\/ ]",8;
+ callsub L_SUB5,2500;
+ end;
+OnTimer65000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: To the left! [ < ]",8;
+ callsub L_SUB2,2500;
+ end;
+OnTimer68000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Return to the middle. [ * ]",8;
+ callsub L_SUB3,2500;
+ end;
+OnTimer71000:
+ donpcevent "::OnDE1";
+ mapannounce "job_duncer.gat","Bijou: Kill the monster using Arrow Shower!",8;
+ set @skillcheck,Sp;
+ monster "job_duncer.gat",69,106,"Poring",1002,1,"jddie::OnStart";
+ end;
+OnTimer76000:
+ killmonsterall "job_duncer.gat";
+ end;
+OnTimer80000:
+ mapannounce "job_duncer.gat","Dancer: You were a bit too slow, sorry but you have failed.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ if (getareausers("job_duncer.gat",68,106,70,114) != 0) areawarp "job_duncer.gat",68,106,70,114,"job_duncer.gat",69,102;
+ if (getareausers("job_duncer.gat",65,109,73,111) != 0) areawarp "job_duncer.gat",65,109,73,111,"job_duncer.gat",69,102;
+ stopnpctimer;
+ enablewaitingroomevent "dancew";
+ end;
+L_SUB1:
+ disablenpc "lefttile";
+ disablenpc "middletile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ setnpctimer getarg(0),"jdt1";
+ startnpctimer "jdt1";
+ return;
+L_SUB2:
+ disablenpc "uppertile";
+ disablenpc "middletile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ setnpctimer getarg(0),"jdt2";
+ startnpctimer "jdt2";
+ return;
+L_SUB3:
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ setnpctimer getarg(0),"jdt3";
+ startnpctimer "jdt3";
+ return;
+L_SUB4:
+ disablenpc "lefttile";
+ disablenpc "middletile";
+ disablenpc "uppertile";
+ disablenpc "lowertile";
+ setnpctimer getarg(0),"jdt4";
+ startnpctimer "jdt4";
+ return;
+L_SUB5:
+ disablenpc "lefttile";
+ disablenpc "middletile";
+ disablenpc "righttile";
+ disablenpc "uppertile";
+ setnpctimer getarg(0),"jdt5";
+ startnpctimer "jdt5";
+ return;
+}
+job_duncer.gat,0,0,0 script jddie -1,{
+
+OnStart:
+ if (@skillcheck==Sp) set @check,1;
+ if (@check==0) mapannounce "job_duncer.gat","Dancer: Well done, you were very skillful, and have passed the test.",8;
+ if (@check==1) mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to use arrow shower to kill the monster",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ if (@check==0) set DANC_Q,10;
+ stopnpctimer "jobDq";
+ enablewaitingroomevent "dancew";
+ if (@check==1) set @check,0;
+ warp "job_duncer.gat",69,102;
+ end;
+}
+job_duncer.gat,63,110,4 script Back dancer #1::jdt1 724,{
+ end;
+OnTimer5000:
+ enablenpc "lefttile";
+ enablenpc "middletile";
+ enablenpc "righttile";
+ enablenpc "lowertile";
+ stopnpctimer;
+ end;
+OnDE1:
+ emotion 21;
+ end;
+OnDE2:
+ emotion e_omg;
+ end;
+}
+job_duncer.gat,66,113,4 script Back dancer #2::jdt2 724,{
+ end;
+OnTimer5000:
+ enablenpc "uppertile";
+ enablenpc "middletile";
+ enablenpc "righttile";
+ enablenpc "lowertile";
+ stopnpctimer;
+ end;
+OnDE1:
+ emotion e_no1;
+ end;
+OnDE2:
+ emotion e_omg;
+ end;
+}
+job_duncer.gat,72,113,4 script Back dancer #3::jdt3 724,{
+ end;
+OnTimer5000:
+ enablenpc "lefttile";
+ enablenpc "uppertile";
+ enablenpc "righttile";
+ enablenpc "lowertile";
+ stopnpctimer;
+ end;
+OnDE1:
+ emotion 21;
+ end;
+OnDE2:
+ emotion e_omg;
+ end;
+}
+job_duncer.gat,75,110,4 script Back dancer #4::jdt4 724,{
+ end;
+OnTimer5000:
+ enablenpc "lefttile";
+ enablenpc "middletile";
+ enablenpc "uppertile";
+ enablenpc "lowertile";
+ stopnpctimer;
+ end;
+OnDE1:
+ emotion 21;
+ end;
+OnDE2:
+ emotion e_omg;
+ end;
+}
+job_duncer.gat,75,110,4 script jdt5 139,{
+ end;
+OnTimer5000:
+ enablenpc "lefttile";
+ enablenpc "middletile";
+ enablenpc "righttile";
+ enablenpc "uppertile";
+ stopnpctimer;
+ end;
+}
+job_duncer.gat,69,113,4 script uppertile 139,1,1,{
+ end;
+OnTouch:
+ mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+" the failed to make it in time.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ enablewaitingroomevent "dancew";
+ stopnpctimer "jobDq";
+ areawarp "job_duncer.gat",68,112,70,114,"job_duncer.gat",69,102;
+ donpcevent "::OnDE2";
+ end;
+OnDE1:
+OnInit:
+ disablenpc "uppertile";
+ end;
+}
+job_duncer.gat,66,110,4 script lefttile 139,1,1,{
+ end;
+OnTouch:
+ mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ enablewaitingroomevent "dancew";
+ stopnpctimer "jobDq";
+ areawarp "job_duncer.gat",65,109,67,111,"job_duncer.gat",69,102;
+ donpcevent "::OnDE2";
+ end;
+OnDE1:
+OnInit:
+ disablenpc "lefttile";
+ end;
+}
+job_duncer.gat,69,110,4 script middletile 139,1,1,{
+ end;
+OnTouch:
+ mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ enablewaitingroomevent "dancew";
+ stopnpctimer "jobDq";
+ areawarp "job_duncer.gat",68,109,70,111,"job_duncer.gat",69,102;
+ donpcevent "::OnDE2";
+ end;
+OnDE1:
+OnInit:
+ disablenpc "middletile";
+ end;
+}
+job_duncer.gat,72,110,4 script righttile 139,1,1,{
+ end;
+OnTouch:
+ mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ enablewaitingroomevent "dancew";
+ stopnpctimer "jobDq";
+ areawarp "job_duncer.gat",71,109,73,111,"job_duncer.gat",69,102;
+ donpcevent "::OnDE2";
+ end;
+OnDE1:
+OnInit:
+ disablenpc "righttile";
+ end;
+}
+job_duncer.gat,69,107,4 script lowertile 139,1,1,{
+ end;
+OnTouch:
+ mapannounce "job_duncer.gat","Dancer: Sorry "+strcharinfo(0)+", but you failed to make it in time.",8;
+ disablenpc "uppertile";
+ disablenpc "lefttile";
+ disablenpc "righttile";
+ disablenpc "lowertile";
+ disablenpc "middletile";
+ enablewaitingroomevent "dancew";
+ stopnpctimer "jobDq";
+ areawarp "job_duncer.gat",68,106,70,108,"job_duncer.gat",69,102;
+ donpcevent "::OnDE2";
+ end;
+OnDE1:
+OnInit:
+ disablenpc "lowertile";
+ end;
+}
+//= Some test NPC, activate these if you wanna try out the dance portion of the quest
+//==================================================================
+//job_duncer.gat,69,105,4 script TestDE1 98,{donpcevent "::OnDE1"; close;}
+//job_duncer.gat,69,110,4 script TestDE2 98,{donpcevent "::OnDE2"; close;}
+//job_duncer.gat,66,100,4 script WarpTilesON 98,{disablenpc "uppertile";disablenpc "lefttile";disablenpc "middletile";disablenpc "righttile";disablenpc "lowertile";close;}
+//job_duncer.gat,72,100,4 script WarpTilesOFF 98,{enablenpc "uppertile";enablenpc "lefttile";enablenpc "middletile";enablenpc "righttile";enablenpc "lowertile";close;}
+//==================================================================
+//job_duncer.gat,69,102,4 script Tester NPC 100,{
+// mes "[TEST]";
+// mes "want to take the dancing test?";
+// next;
+// menu "Yes",Lgo,"No",-;
+// close;
+//Lgo:
+// warp "job_duncer.gat",70,112;
+// initnpctimer "jobDq";
+// end;
+//}
diff --git a/npc/jobs/2-2/monk.txt b/npc/jobs/2-2/monk.txt
index 7847e1d47..072de6cce 100644
--- a/npc/jobs/2-2/monk.txt
+++ b/npc/jobs/2-2/monk.txt
@@ -1,1926 +1,1926 @@
-//===== eAthena Script =======================================
-//= Monk Job Quest
-//===== By: ==================================================
-//= Dino9021, Edited / Translated by Celest
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Monk Job Quests for Athena 2004.12.30
-//===== Additional Comments: =================================
-//= 1.1 Fixed missing '";'. Now it's loading fine [Lupus]
-//= 1.1+ Edited/Translated 5% [Celest]
-//= 1.2 Made Poetry Quiz passable, Fixed Marathon Part [Lupus]
-//= 1.3 Added Baby Class Support [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus] 1.7 Fixed warps19/20 [Yor]
-//= 1.8 Fixed bugs. Fixed Green Potion exploit. Getting rid of Jfunc mess [Lupus]
-//= 1.9 Added a missing check in Fuhai and fixed a LOT of Engrish. [Zephiris]
-//= 1.9b Fixed another bug in Fuhai. [Zephiris]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Removed Duplicates [Silent]
-//============================================================
-
-
-prt_monk.gat,55,249,4 script Tohobu the Guarding Monk 139,0,5,{
- mes "[Tohobu]";
- mes "Who are you?!";
- mes "How dare you enter this holy training place without my permission!!";
- next;
- mes "[Tohobu]";
- mes "Get Out!!";
- close;
-}
-prt_monk.gat,59,247,4 script Master 120,{
- callfunc "F_BlockHigh",Job_Acolyte_High,"Acolyte High",Job_Champion,"Champion","Tohobu";
-
- if(MONK_Q == 1 ) goto Part1;
- if(MONK_Q == 2 ) goto Part2;
- if(MONK_Q > 2 ) goto Part3;
- if(BaseJob == Job_Monk) goto IsMonk;
- goto L_START;
-
-IsMonk:
- mes "[Tohobu]";
- mes "Your presence is not really desired at the ^00FF00St. Capitolina Abbey^000000.";
- mes "However, since you are here, please do not disturb the Monks in training,";
- mes "Even if you are a Monk!";
- close;
-
-L_START:
- mes "[Tohobu]";
- mes "Hmmm...? What do you want from me?";
- mes "Before entering the Training Area,";
- mes "You shall have to first tell me your Name, Base Level and Job Level.";
- next;
- mes "[Tohobu]";
- mes "Come! What is your name?";
- next;
- menu "Ignore him.",-,"Tell him.",L_MENU_1;
-
- mes "[Tohobu]";
- mes "You are so impolite! Get out!";
- warp "prt_fild03.gat",357,256;
- end;
-L_MENU_1:
- mes "[Tohobu]";
- mes "So... Your name is " + strcharinfo(0) + " Right?";
- mes "...I believe it is pronounced that way.";
- mes "Let's see... Job Level is " + JobLevel;
- next;
- mes "[Tohobu]";
- mes "Okay! Why have you come to see me, " + strcharinfo(0) + " ?";
- next;
- menu "I'd like to see how Monks train themselves.",L_MENU_1_0,"I want to be a Monk.",L_MENU_1_1,"I'd like to rest here.",L_MENU_1_2;
-
- L_MENU_1_0:
- mes "[Tohobu]";
- mes "Oh! I see.";
- mes "Okay, I hope you'll learn something from our training,";
- mes "Perhaps it might aid you in becoming a worthy Monk.";
- set MONK_Q, 1;
- close;
-
- L_MENU_1_1:
- if(BaseJob != Job_Acolyte) goto IsNot4;
- if(JobLevel >= 40 ) goto SkillPointChk;
- mes "[Tohobu]";
- mes "Your Job Level is not high enough to be a Monk.";
- mes "Come back when your Job Level is at least 40.";
- next;
- mes "[Tohobu]";
- mes "No need to be hasty, there is so much to learn in this world,";
- mes "Come back when you have met the requirements... Haha!";
- close;
-
- SkillPointChk:
- if(SkillPoint == 0) goto L_GO;
- mes "[Tohobu]";
- mes "Well... It seems that you have the ability to be a Monk,";
- mes "But I believe there are still skills you have yet to learn.";
- mes "Come back when you have learned all your skills.";
- close;
-
- IsNot4:
- mes "[Tohobu]";
- mes "Oh! Are you kidding?";
- close;
-
- L_GO:
- mes "[Tohobu]";
- mes "Well... Seems you have the ability to be a Monk.";
- mes "Very well then... Go to Wuhai the Elder, He will guide you.";
- // used to determine what item to get at the end
- if(JobLevel == 50) set JBLVL, 50; // used to determine what item to get at the end
- set MONK_Q, 2;
- close;
-
- L_MENU_1_2:
- mes "[Tohobu]";
- mes "Alright, you do look tired from your travels...";
- mes "Perhaps it would be good to rest awhile.";
- mes "Go ahead and rest at the Abbey before leaving!";
- next;
- mes "[Tohobu]";
- mes "Persevering in order to gain more strength is the way of life of the Monks.";
- mes "I hope that seeing our practises will at least bring you some inner peace.";
- close;
-Part1:
- mes "[Tohobu]";
- mes "Well? Have you changed your mind after looking around here?";
- next;
- menu "Nope.",L_MENU_1_0,"I want to be a Monk",L_MENU_1_1,"I need more rest.",L_MENU_1_2;
-
-Part2:
- mes "[Tohobu]";
- mes "Hello there! You should go to Wuhai the Elder. He will guide you.";
- mes "He is in the Monastery Hall, South East from here";
- close;
-
-Part3:
- mes "[Tohobu]";
- mes "Ah, Hello there! How is your training? Surely you're not going to give up?";
- close;
-}
-
-monk_in.gat,99,58,4 script Elder Wuhai 60,{
- //Not sure if this is needed, but hopefully it will prevent bugs [Zephiris]
- if(MONK_Q > 11) set MONK_Q,11;
-
- if(MONK_Q == 2) goto L_START;
- if(MONK_Q == 3) goto Part1;
- if(MONK_Q == 4) goto Part2;
- if(MONK_Q >= 5 && MONK_Q < 10) goto Part3;
- if(MONK_Q >= 10 && countitem(506) > 0) goto Part4;//Items: Green_Potion,
- if(MONK_Q >= 10 && countitem(506) == 0) goto Part5;//Items: Green_Potion,
- if(BaseJob == Job_Monk) goto Part6;
- if(BaseJob == Job_Acolyte) goto Part7;
-
- mes "[Elder Wuhai]";
- mes "May you find God in the Mother Nature!!";
- mes "Welcome traveler, why do you seek me?";
- close;
-
-L_START:
- mes "[Elder Wuhai]";
- mes "Hmmm... You are the youth who wants to be a Monk, right?";
- next;
- menu "Yes.",L_MENU_1,"No.",-;
- mes "[Elder Wuhai]";
- mes "Hmmm...? Aren't you?";
- mes "Maybe I'm getting older, I would've guessed you were.";
- mes "Very well then... You may go, young one.";
- close;
-L_MENU_1:
- mes "[Elder Wuhai]";
- mes "Oh! So young ones these days still remember us Monks...";
- mes "Welcome, my child!";
- next;
- mes "[Elder Wuhai]";
- mes "So you want to be a Monk! I'm glad to hear that!";
- mes "But first, before you can become one, there are a few things you need to know.";
- next;
- mes "[Elder Wuhai]";
- mes "As Monks, we undergo strict training while protecting world peace.";
- next;
- mes "[Elder Wuhai]";
- mes "The strength is for giving aid to the weak in need, and to protect them from harm.";
- next;
- mes "[Elder Wuhai]";
- mes "Last but not least, we control our emotions,";
- mes "More importantly, never be too proud of yourself,";
- mes "or be blinded by success,";
- next;
- mes "[Elder Wuhai]";
- mes "It might be tough, even painful,";
- mes "while undergoing this process.";
- mes "We will test the limits of what you can endure.";
- mes "You can not become a Monk if you can't even bear this.";
- next;
- mes "[Elder Wuhai]";
- mes "OKay, let's start the test to see if you really have the ability to become a Monk.";
- next;
- if(JBLVL == 50) goto IsJOB50;
- mes "[Elder Wuhai]";
- mes "Firstly, here's a small exam to test your will to become one of us.";
- next;
-
- set MONK_Q, 3;
- set JOB_MONK_C,rand(1,6);
-L_Collect:
- if(JOB_MONK_C == 1 ) goto L_Collect1;
- if(JOB_MONK_C == 2 ) goto L_Collect2;
- if(JOB_MONK_C == 3 ) goto L_Collect3;
- if(JOB_MONK_C == 4 ) goto L_Collect4;
- if(JOB_MONK_C == 5 ) goto L_Collect5;
- if(JOB_MONK_C == 6 ) goto L_Collect6;
-
- L_Collect1:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "10 Teeth of Bat";
- mes "5 Bears Footskins";
- mes "20 Poison Spores";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-
- L_Collect2:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "5 Porcupine Quills";
- mes "20 Cobwebs";
- mes "10 Grasshopper's Legs";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-
- L_Collect3:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "30 Stems";
- mes "5 Jellopies";
- mes "10 Worm Peelings";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-
- L_Collect4:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "5 Sticky Mucus";
- mes "10 Earthworm Peelings";
- mes "20 Green Herbs";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-
- L_Collect5:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "20 Yoyo Tails";
- mes "5 Iron Ores";
- mes "3 Blue Herbs";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-
- L_Collect6:
- mes "[Elder Wuhai]";
- mes "Please bring these items";
- mes "5 Solid Shells";
- mes "20 Shells";
- mes "5 Zargons";
- if(@collect_tmp != 1) goto L_CollectS;
- close;
-L_CollectS:
- next;
- mes "[Elder Wuhai]";
- mes "To test your will, you will have to collect these items by yourself";
- next;
- mes "[Elder Wuhai]";
- mes "Come back to me when you have all of them.";
- mes "Now go, May God's blessings be with you.";
- close;
-
-IsJOB50:
- mes "[Elder Wuhai]";
- mes "Oh, I see that your Job Level is " +JobLevel +" .";
- mes "That could prove your ability.";
- next;
- mes "[Elder Wuhai]";
- mes "Well done!";
- mes "I think God will agree with me.";
- next;
- mes "[Elder Wuhai]";
- mes "Well then.. There is a Monk named Wutao who wants to see you.";
- mes "He is in the Ancestral Graveyard North of here.";
- set MONK_Q, 4;
- close;
-
-Part1:
- if(JOB_MONK_C == 1 && countitem(913) >= 10 && countitem(948) >= 5 && countitem(7033) >= 20) goto L_CollectS2_1;//Items: Tooth_of_Bat, Bear's_Footskin, Poison_Spore,
- if(JOB_MONK_C == 2 && countitem(1027) >= 5 && countitem(1025) >= 20 && countitem(940) >= 10) goto L_CollectS2_2;//Items: Porcupine_Quill, Cobweb, Grasshopper's_Leg,
- if(JOB_MONK_C == 3 && countitem(905) >= 30 && countitem(909) >= 5 && countitem(955) >= 10) goto L_CollectS2_3;//Items: Stem, Jellopy, Worm_Peeling,
- if(JOB_MONK_C == 4 && countitem(938) >= 5 && countitem(1055) >= 10 && countitem(511) >= 20) goto L_CollectS2_4;//Items: Sticky_Mucus, Earthworm_Peeling, Green_Herb,
- if(JOB_MONK_C == 5 && countitem(942) >= 20 && countitem(1002) >= 5 && countitem(510) >= 3) goto L_CollectS2_5;//Items: Yoyo_Tail, Iron_Ore, Blue_Herb,
- if(JOB_MONK_C == 6 && countitem(943) >= 5 && countitem(935) >= 20 && countitem(912) >= 5) goto L_CollectS2_6;//Items: Solid_Shell, Shell, Zargon,
-
- mes "[Elder Wuhai]";
- mes "Hmm... Still not ready yet?";
- mes "Let me tell what you should bring again,";
- mes "Listen carefully!";
- next;
- set @collect_tmp, 1;
- goto L_Collect;
-
- L_CollectS2_1:
- delitem 913, 10;//Items: Tooth_of_Bat,
- delitem 948, 5;//Items: Bear's_Footskin,
- delitem 7033, 20;//Items: Poison_Spore,
- goto L_CollectS2_E;
- L_CollectS2_2:
- delitem 1027, 5;//Items: Porcupine_Quill,
- delitem 1025, 20;//Items: Cobweb,
- delitem 940, 10;//Items: Grasshopper's_Leg,
- goto L_CollectS2_E;
- L_CollectS2_3:
- delitem 7012, 30;//Items: Tough_Scalelike_Stem,
- delitem 909, 5;//Items: Jellopy,
- delitem 955, 10;//Items: Worm_Peeling,
- goto L_CollectS2_E;
- L_CollectS2_4:
- delitem 938, 5;//Items: Sticky_Mucus,
- delitem 1055, 10;//Items: Earthworm_Peeling,
- delitem 511, 20;//Items: Green_Herb,
- goto L_CollectS2_E;
- L_CollectS2_5:
- delitem 942, 20;//Items: Yoyo_Tail,
- delitem 1002, 5;//Items: Iron_Ore,
- delitem 510, 3;//Items: Blue_Herb,
- goto L_CollectS2_E;
- L_CollectS2_6:
- delitem 943, 5;//Items: Solid_Shell,
- delitem 935, 20;//Items: Shell,
- delitem 912, 5;//Items: Zargon,
- goto L_CollectS2_E;
-
- L_CollectS2_E:
- mes "[Elder Wuhai]";
- mes "Oh! You've brought all of them!";
- mes "Well done!";
- mes "Your will to become a Monk is formidable!";
- next;
- mes "[Elder Wuhai]";
- mes "Let's see... there is a Monk named.. Ah... Wutao who wants to see you.";
- mes "He will be in the Ancestral Graveyard North of here.";
- set MONK_Q, 4;
- set JOB_MONK_C, 0;
- close;
-
-Part2:
- mes "[Elder Wuhai]";
- mes "Next should be... Questions regarding your job changing?";
- mes "Go find master Wutao.";
- mes "He will be in the Ancestral Graveyard North of here.";
- close;
-Part3:
- mes "[Elder Wuhai]";
- mes "Hmm? You're still taking the test...?";
- mes "Try to do your best then!";
- close;
-Part4:
- mes "[Elder Wuhai]";
- mes "What? You didn't drink the Magic Potion yet?";
- mes "Then... Hurry up and finish the Green-ish potion!";
- mes "Otherwise, you will never be able to achieve the spiritual energy level of Monks!";
- set MONK_Q, 11;
- close;
-Part5:
- mes "[Elder Wuhai]";
- mes "We have done all the steps... Your blood, your mind, your soul...";
- mes "All are prepared for you to become a Monk.";
- mes "Even your spiritual energy has increased after drinking the Magic Potion.";
- next;
- mes "[Elder Wuhai]";
- mes "Good... you must now be sworn in by an oath.";
- mes "Afterwards, the job changing will be complete.";
- next;
- mes "[Elder Wuhai]";
- mes "Are you willing to dedicate the rest of your life to serving God?";
- next;
- menu "Yes.",L_MONK_Q_2,"No.",-;
-
- mes "[Elder Wuhai]";
- mes "......What?......";
- mes "Aren't you ready to become a Monk?";
- mes "Perhaps you want to run around a bit more,";
- mes "and shed some more sweat to become more prepared?";
- next;
- mes "[Elder Wuhai]";
- mes "Consider this carefully before coming back!";
- mes "I do not want to make you a bad Monk.";
- close;
-L_MONK_Q_2:
- mes "[Elder Wuhai]";
- mes "Will you use the powers given to you for your own good?";
- next;
- menu "Yes.",-,"No.",L_MONK_Q_3;
-
- mes "[Elder Wuhai]";
- mes "...NO NO NO NO NO!! Our training is not for any self benefits!";
- mes "How could one who protects world peace abuse this advantage for their own selfish means?!";
- next;
- mes "[Elder Wuhai]";
- mes "Go and think over the true purpose of a Monk.";
- mes "Thoughts like that will only make you greedier for power!";
- mes "The corruption of your soul will only lead to loss of your ability.";
- close;
-
-L_MONK_Q_3:
- mes "[Elder Wuhai]";
- mes "When judging those who have opposed the will of God,";
- mes "Will you hesitate in punishing them?";
- next;
- menu "No.",L_MONK_Q_4,"Yes.",-;
-
- mes "[Elder Wuhai]";
- mes "What do you think Monks are?";
- mes "No matter who they are,";
- mes "People who harm the weak are like trash!";
- mes "They do not have the right to live on this world!";
- next;
- mes "[Elder Wuhai]";
- mes "Perhaps you should go to people who deny morals in this world,";
- mes "Come back again when you have a sense of justice.";
- mes "Then you will know what to do.";
- close;
-
-L_MONK_Q_4:
- mes "[Elder Wuhai]";
- mes "Will you help to eradicate those who oppose God,";
- mes "And to sacrifice yourself for the better of others?";
- next;
- menu "Yes",L_MONK_Q_5,"No",-;
-
- mes "[Elder Wuhai]";
- mes "Oh...nonononono....";
- mes "If sacrificing oneself would be beneficial to your peers,";
- mes "and more enemies can be vanquished,";
- mes "then that would be a great and worthy thing to do!";
- next;
- mes "[Elder Wuhai]";
- mes "What does Sacrifice mean? Come back when you've figured it out.";
- mes "Ah.. Sacrifice can be so simple, yet so difficult!";
- close;
-
-L_MONK_Q_5:
- mes "[Elder Wuhai]";
- mes "Will you train monsters behind you to help others in battle?";
- next;
- menu "Yes",-,"No",L_MONK_Q_6;
-
- mes "[Elder Wuhai]";
- // he's not making any sense =P [Unknown]
- // I've reworded this to what I think it probably correct. [Zephiris]
- mes "That is not right! Training mobs around does not serve the benefit of everyone!";
- mes "Instead it is a selfish act that violates the rights of others!";
- next;
- mes "[Elder Wuhai]";
- mes "Even when you've learned the skill 'Steel Body'";
- mes "It is only meant to be used in emergency, or when you meet a strong adversary.";
- mes "But not in such a situation!";
- next;
- mes "[Elder Wuhai]";
- mes "It might feel like you're helping them,";
- mes "but you are only commiting acts of unjust!";
- mes "What is the true way of a Monk?";
- mes "Come back when you have thought it over.";
- close;
-
-L_MONK_Q_6:
- mes "[Elder Wuhai]";
- // mes "Will you spam?";
- // "will you spam" is just so... un-monkly. ^^;
- mes "In villages or wilderness, will you say the same lines repeatedly?";
- next;
- menu "Yes",-,"No",L_MONK_Q_7;
-
- mes "[Elder Wuhai]";
- mes "No! If you do so, then not just Monks, but even the common people";
- mes "will be disturbed and pay no attention to you!";
- next;
- mes "[Elder Wuhai]";
- mes "It is the same even if you only wanted to spread the words of God.";
- mes "Think of your behavior. What's right and wrong?";
- next;
- mes "[Elder Wuhai]";
- mes "I would rather test you again, but I'll let you go this time.";
- mes "Think carefully about this before returning!";
- close;
-L_MONK_Q_7:
- mes "[Elder Wuhai]";
- mes "Do you feel as if you're a messenger of God, and are willing to die for God?";
- next;
- menu "Yes",L_MONK_Q_8,"No",-;
-
- mes "[Elder Wuhai]";
- mes "You cannot be a Monk with this kind of will!";
- mes "As it's said, Death is only temporary. If we have to give our lives";
- mes "to protect world peace, it would at least be a meaningful action!";
- next;
- mes "[Elder Wuhai]";
- mes "Those who oppose God will be condemned while those who listen to God will live.";
- mes "What is life and death to you?";
- mes "Ponder that well.";
- close;
-
-L_MONK_Q_8:
- mes "[Elder Wuhai]";
- mes "Lastly, make an oath to swear you will keep to what you have already sworn.";
- next;
- menu "I swear.",L_MONK_Q_9,"I refuse.",-;
-
- mes "[Elder Wuhai]";
- mes "......";
- next;
- mes "[Elder Wuhai]";
- mes "It seems like... you don't have enough training...";
- mes "I can't let you become a Monk.";
- next;
- mes "[Elder Wuhai]";
- mes "It is better for you to train more.";
- mes "Come back when you ready.";
- next;
- mes "[Elder Wuhai]";
- mes "May God be with you.";
- close;
-
-L_MONK_Q_9:
- mes "[Elder Wuhai]";
- mes "Well then, we have completed the oaths.";
- if (sex == 0) mes "Gather closer now, you are already my sister!";
- if (sex == 1) mes "Gather closer now, you are already my brother!";
- next;
- mes "[Elder Wuhai]";
- mes "Your promise has been transmited to all Monks through our hearts.";
- next;
- mes "[Elder Wuhai]";
- mes "Now, let us begin the ceremony!";
- next;
- mes "[Elder Wuhai]";
- mes "I will acupuncture your 365 acupuncture points and open your 1129 arteries and veins";
- next;
- mes "[Elder Wuhai]";
- mes "Ahhhhhhhhh......";
- next;
- mes "[Elder Wuhai]";
- mes "Wuuu... Huuuuuu";
- next;
- mes "- He takes a deeply breath -";
- next;
- mes "- The acupuncture begins... -";
- next;
- mes "[Elder Wuhai]";
- mes "Ahhhh--- Dadadadadada!!!";
- next;
- mes "[Elder Wuhai]";
- mes "DaBaDaBaDadadadaKaBonTatatata!!!";
- next;
- mes "[Elder Wuhai]";
- mes "Ahhhh--- Dadadadadada!!!";
- next;
- mes "[Elder Wuhai]";
- mes "WaLaChuOhhhhhhh!!!";
- next;
- mes "[Elder Wuhai]";
- mes "Wuuu... Huuuuuu";
- next;
- mes "[Elder Wuhai]";
- mes "WowHoooo... It is done! You are now a Monk!";
-
- setoption 0;
- callfunc "Job_Change",Job_Monk;
- next;
- mes "[Elder Wuhai]";
- mes "(Cough!) (Cough!)";
- next;
- mes "[Elder Wuhai]";
- mes "Am I that old...? I feel so tired... (-sigh-)";
- mes "I could have scaled mountains after this before.";
- next;
- mes "[Elder Wuhai]";
- mes "Very well... You are now a Monk...";
- mes "Welcome to the brotherhood.";
- next;
- mes "[Elder Wuhai]";
- mes "But never forget your promise.";
- next;
- mes "[Elder Wuhai]";
- mes "Keep it in your mind, and train yourself.";
- next;
- mes "[Elder Wuhai]";
- mes "Now go...";
- mes "Here is a gift from us to congratulate you.";
- if(JBLVL < 50) getitem 1801, 1;//Items: Waghnakh,
- if(JBLVL == 50) getitem 1804, 1;//Items: Knuckle_Duster_,
- callfunc "F_ClearJobVar";
- close;
-Part6:
- mes "[Elder Wuhai]";
- mes "May you find God in Mother Nature!";
- mes "Welcome young one! What can I do for you?";
- next;
- mes "[Elder Wuhai]";
- mes "Is everything alright?";
- mes "How is your training?";
- next;
- mes "[Elder Wuhai]";
- mes "If you don't have a strong body, you may not be able to help people when they need you.";
- mes "If your will is weak, the Evil in this world will lead you down a dark path.";
- next;
- mes "[Elder Wuhai]";
- mes "Never forget it! You are one who protects the weak as well as world peace!";
- mes "You should always be aware of Evil around you. Don't let it lead you away from the Light!";
- close;
-
-Part7:
- mes "[Elder Wuhai]";
- mes "May you find God in Mother Nature!";
- mes "Welcome youung one! What can I do for you?";
- next;
- mes "[Elder Wuhai]";
- mes "Oh! You are an Acolyte....";
- mes "If you want to pray, go to the Prontera Sanctuary!";
- mes "This is the Monk training area, not a place for you to pray.";
- mes "Go and find other places to stay if you are not willing to be a Monk.";
- close;
-}
-
-prt_monk.gat,251,255,4 script Wutao 79,{
- if(MONK_Q == 4 ) goto L_START;
- if(MONK_Q == 5 ) goto Part1;
- if(MONK_Q == 6 ) goto Part2;
- if(MONK_Q > 6 ) goto Part3;
-
- mes "[Wutao]";
- mes "We are Monks!";
- mes "We have unlimited power!";
- mes "We have unlimited wisdom!";
- mes "We use our power and wisdom to protect world peace!";
- next;
- mes "[Wutao]";
- mes "So...";
- mes "Are you my enemy?";
- mes "You block my path!!!!";
- next;
- mes "[Wutao]";
- mes "If someone blocks me, I'll fight!!";
- mes "TaAhhhhhh!!!";
- next;
- mes "[Wutao]";
- mes "HuHaaaaaaaa!!!";
- next;
- mes "[Wutao]";
- mes "If you are not my enemy, then be on your way.";
- close;
-
-L_START:
- mes "[Wutao]";
- mes "What can I do for you?";
- mes "Do you want to talk about God?";
- next;
- mes "[Wutao]";
- mes "Oh! you are proceeding with the Monk Training!";
- mes "The spirit you have is like that of a Monk.";
- next;
- mes "[Wutao]";
- mes "It seems your arteries and veins have begun to strengthen.";
- mes "You must be the one coming from Elder Wuhai, right?";
- mes "Very well...";
- next;
- mes "[Wutao]";
- mes "Let me inform you about the spirits of Monks and some simple rules that Monks should obey.";
- mes "After, I'll help you strengthen your mental state to make your body ready for the next test.";
- next;
- mes "[Wutao]";
- mes "Now, remember exactly what I say and repeat it back to me.";
- mes "Clear your mind... Are you ready?";
- next;
- menu "Yes",L_MENU_1,"No",-;
- mes "[Wutao]";
- mes "Then come back when you are ready!";
- close;
-L_MENU_1:
- mes "[Wutao]";
- mes "Alright, let's begin.";
- next;
- set @JOB_MONK_C2, rand(1,3);
-L_Again:
- if(@JOB_MONK_C2 == 0) set @JOB_MONK_C2, rand(1,3);
- if(@JOB_MONK_C2 == 2) goto L_ROOT_2;
- if(@JOB_MONK_C2 == 3) goto L_ROOT_3;
-
- set @monk_str0$,"Supported by dragon and phoenix,";
- set @monk_str1$,"So flies he westward.";
- set @monk_str2$,"But the phoenix shall fall to the earth.";
- set @monk_str3$,"And the dragon shall soar to the sky;";
- set @monk_str4$,"There shall be successes and failures,";
- set @monk_str5$,"For such is the eternal law.";
- set @monk_str6$,"See that ye act when occasion offers,";
- set @monk_str7$,"Lest ye descend to the Nine Golden Springs.'";
- goto L_MES;
- L_ROOT_2:
- set @monk_str0$,"He boasted not a handsome face,";
- set @monk_str1$,"Nor was his body blessed with grace.";
- set @monk_str2$,"His words streamed like a waterfall,";
- set @monk_str3$,"He read a book and knew it all.";
- set @monk_str4$,"Shu's glories could he well rehearse,";
- set @monk_str5$,"His lore embraced the universe.";
- set @monk_str6$,"Or text or note of scholiast";
- set @monk_str7$,"Once read, his memory held fast.";
- goto L_MES;
- L_ROOT_3:
- set @monk_str0$,"Seek ye a noble one? Then take ye the way of Jieliang,";
- set @monk_str1$,"Watch ye how all people revere Guan Yu,";
- set @monk_str2$,"Each excelling others to honor him,";
- set @monk_str3$,"Him, one of the three brothers of the Peach Garden Oath,";
- set @monk_str4$,"Who have won sacrifices, as emperor and king.";
- set @monk_str5$,"Incomparable their aura spreads through the world;";
- set @monk_str6$,"They are resplendent as the great lights of the firmament;";
- set @monk_str7$,"Temples to our Lord Guan Yu abound, no village lacks one,";
- set @monk_str8$,"Their venerable trees at sundown are the resting places for birds.";
-
-L_MES:
- mes "[Wutao]";
- mes "Listen carefully!";
- next;
- mes "[Wutao]";
- mes @monk_str0$;
- next;
- mes "[Wutao]";
- mes @monk_str1$;
- next;
- mes "[Wutao]";
- mes @monk_str2$;
- next;
- mes "[Wutao]";
- mes @monk_str3$;
- next;
- mes "[Wutao]";
- mes @monk_str4$;
- next;
- mes "[Wutao]";
- mes @monk_str5$;
- next;
- mes "[Wutao]";
- mes @monk_str6$;
- next;
- mes "[Wutao]";
- mes @monk_str7$;
- if(@JOB_MONK_C2 < 3) goto L_MES_1;
- next;
- mes "[Wutao]";
- mes @monk_str8$;
-
-L_MES_1:
- next;
- mes "[Wutao]";
- mes "Now " + strcharinfo(0) + ", it's your turn.";
- next;
- set @mnk_score, 0;
- if(@JOB_MONK_C2 == 2) goto L_MONK_Q2_1;
- if(@JOB_MONK_C2 == 3) goto L_MONK_Q3_1;
-
-L_MONK_Q1_1:
-
- menu "And the dragon shall soar to the sky;",L_MONK_Q1_2,
- "But the phoenix shall fall to the earth.",L_MONK_Q1_2,
- "For such is the eternal law.",L_MONK_Q1_2,
- "See that ye act when occasion offers,",L_MONK_Q1_2,
- "There shall be successes and failures,",L_MONK_Q1_2,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_2,
- "Supported by dragon and phoenix,",-,
- "So flies he westward.",L_MONK_Q1_2;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_2:
-
- menu "But the phoenix shall fall to the earth.",L_MONK_Q1_3,
- "See that ye act when occasion offers,",L_MONK_Q1_3,
- "Supported by dragon and phoenix,",L_MONK_Q1_3,
- "There shall be successes and failures,",L_MONK_Q1_3,
- "So flies he westward.",-,
- "And the dragon shall soar to the sky;",L_MONK_Q1_3,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_3,
- "For such is the eternal law.",L_MONK_Q1_3;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_3:
-
- menu "There shall be successes and failures,",L_MONK_Q1_4,
- "But the phoenix shall fall to the earth.",-,
- "And the dragon shall soar to the sky;",L_MONK_Q1_4,
- "So flies he westward.",L_MONK_Q1_4,
- "For such is the eternal law.",L_MONK_Q1_4,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_4,
- "See that ye act when occasion offers,",L_MONK_Q1_4,
- "Supported by dragon and phoenix,",L_MONK_Q1_4;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_4:
-
- menu "And the dragon shall soar to the sky;",-,
- "Supported by dragon and phoenix,",L_MONK_Q1_5,
- "But the phoenix shall fall to the earth.",L_MONK_Q1_5,
- "So flies he westward.",L_MONK_Q1_5,
- "For such is the eternal law.",L_MONK_Q1_5,
- "There shall be successes and failures,",L_MONK_Q1_5,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_5,
- "See that ye act when occasion offers,",L_MONK_Q1_5;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_5:
-
- menu "For such is the eternal law.",L_MONK_Q1_6,
- "And the dragon shall soar to the sky;",L_MONK_Q1_6,
- "So flies he westward.",L_MONK_Q1_6,
- "Supported by dragon and phoenix,",L_MONK_Q1_6,
- "But the phoenix shall fall to the earth.",L_MONK_Q1_6,
- "See that ye act when occasion offers,",L_MONK_Q1_6,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_6,
- "There shall be successes and failures,",-;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_6:
-
- menu "Supported by dragon and phoenix,",L_MONK_Q1_7,
- "So flies he westward.",L_MONK_Q1_7,
- "For such is the eternal law.",-,
- "But the phoenix shall fall to the earth.",L_MONK_Q1_7,
- "There shall be successes and failures,",L_MONK_Q1_7,
- "And the dragon shall soar to the sky;",L_MONK_Q1_7,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_7,
- "See that ye act when occasion offers,",L_MONK_Q1_7;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q1_7:
-
- menu "So flies he westward.",L_MONK_Q1_8,
- "Supported by dragon and phoenix,",L_MONK_Q1_8,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_8,
- "There shall be successes and failures,",L_MONK_Q1_8,
- "For such is the eternal law.",L_MONK_Q1_8,
- "But the phoenix shall fall to the earth.",L_MONK_Q1_8,
- "And the dragon shall soar to the sky;",L_MONK_Q1_8,
- "See that ye act when occasion offers,",-;
-
- set @mnk_score, @mnk_score + 2;
-L_MONK_Q1_8:
-
- menu "Supported by dragon and phoenix,",L_MONK_QUEST_END,
- "See that ye act when occasion offers,",L_MONK_QUEST_END,
- "But the phoenix shall fall to the earth.",L_MONK_QUEST_END,
- "Lest ye descend to the Nine Golden Springs.",L_MONK_QUEST_1_2,
- "And the dragon shall soar to the sky;",L_MONK_QUEST_END,
- "So flies he westward.",L_MONK_QUEST_END,
- "There shall be successes and failures,",L_MONK_QUEST_END,
- "For such is the eternal law.",L_MONK_QUEST_END;
-
-L_MONK_Q2_1:
-
- menu "Nor was his body blessed with grace.",L_MONK_Q2_2,
- "He read a book and knew it all.",L_MONK_Q2_2,
- "His words streamed like a waterfall,",L_MONK_Q2_2,
- "He boasted not a handsome face,",-,
- "Shu's glories could he well rehearse,",L_MONK_Q2_2,
- "Once read, his memory held fast.",L_MONK_Q2_2,
- "His lore embraced the universe.",L_MONK_Q2_2,
- "Or text or note of scholiast",L_MONK_Q2_2;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_2:
-
- menu "His lore embraced the universe.",L_MONK_Q2_3,
- "He boasted not a handsome face,",L_MONK_Q2_3,
- "His words streamed like a waterfall,",L_MONK_Q2_3,
- "He read a book and knew it all.",L_MONK_Q2_3,
- "Or text or note of scholiast",L_MONK_Q2_3,
- "Once read, his memory held fast.",L_MONK_Q2_3,
- "Shu's glories could he well rehearse,",L_MONK_Q2_3,
- "Nor was his body blessed with grace.",-;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_3:
-
- menu "His words streamed like a waterfall,",-,
- "His lore embraced the universe.",L_MONK_Q2_4,
- "He read a book and knew it all.",L_MONK_Q2_4,
- "Shu's glories could he well rehearse,",L_MONK_Q2_4,
- "Nor was his body blessed with grace.",L_MONK_Q2_4,
- "Or text or note of scholiast",L_MONK_Q2_4,
- "He boasted not a handsome face,",L_MONK_Q2_4,
- "Once read, his memory held fast.",L_MONK_Q2_4;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_4:
-
- menu "Nor was his body blessed with grace.",L_MONK_Q2_5,
- "Once read, his memory held fast.",L_MONK_Q2_5,
- "Shu's glories could he well rehearse,",L_MONK_Q2_5,
- "Or text or note of scholiast",L_MONK_Q2_5,
- "He boasted not a handsome face,",L_MONK_Q2_5,
- "He read a book and knew it all.",-,
- "His lore embraced the universe.",L_MONK_Q2_5,
- "His words streamed like a waterfall,",L_MONK_Q2_5;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_5:
-
- menu "Once read, his memory held fast.",L_MONK_Q2_6,
- "Or text or note of scholiast",L_MONK_Q2_6,
- "He read a book and knew it all.",L_MONK_Q2_6,
- "His words streamed like a waterfall,",L_MONK_Q2_6,
- "Nor was his body blessed with grace.",L_MONK_Q2_6,
- "He boasted not a handsome face,",L_MONK_Q2_6,
- "His lore embraced the universe.",L_MONK_Q2_6,
- "Shu's glories could he well rehearse,",-;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_6:
-
- menu "Or text or note of scholiast",L_MONK_Q2_7,
- "He read a book and knew it all.",L_MONK_Q2_7,
- "Shu's glories could he well rehearse,",L_MONK_Q2_7,
- "His words streamed like a waterfall,",L_MONK_Q2_7,
- "His lore embraced the universe.",-,
- "He boasted not a handsome face,",L_MONK_Q2_7,
- "Nor was his body blessed with grace.",L_MONK_Q2_7,
- "Once read, his memory held fast.",L_MONK_Q2_7;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q2_7:
-
- menu "Nor was his body blessed with grace.",L_MONK_Q2_8,
- "Or text or note of scholiast",-,
- "His words streamed like a waterfall,",L_MONK_Q2_8,
- "Once read, his memory held fast.",L_MONK_Q2_8,
- "He boasted not a handsome face,",L_MONK_Q2_8,
- "He read a book and knew it all.",L_MONK_Q2_8,
- "Shu's glories could he well rehearse,",L_MONK_Q2_8,
- "His lore embraced the universe.",L_MONK_Q2_8;
-
- set @mnk_score, @mnk_score + 2;
-L_MONK_Q2_8:
-
- menu "He boasted not a handsome face,",L_MONK_QUEST_END,
- "Nor was his body blessed with grace.",L_MONK_QUEST_END,
- "Shu's glories could he well rehearse,",L_MONK_QUEST_END,
- "Or text or note of scholiast",L_MONK_QUEST_END,
- "His lore embraced the universe.",L_MONK_QUEST_END,
- "He read a book and knew it all.",L_MONK_QUEST_END,
- "His words streamed like a waterfall,",L_MONK_QUEST_END,
- "Once read, his memory held fast.",L_MONK_QUEST_1_2;
-
-L_MONK_Q3_1:
-
- menu "Watch ye how all people revere Guan Yu,",L_MONK_Q3_2,
- "Seek ye a noble one? Then take ye the way of Jieliang,",-,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_2,
- "Each excelling others to honor him,",L_MONK_Q3_2,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_2,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_2,
- "They are resplendent as the great lights of the firmament;",L_MONK_Q3_2,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_2,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_2;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_2:
-
- menu "Each excelling others to honor him,",L_MONK_Q3_3,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_3,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_3,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_3,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_3,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_3,
- "Watch ye how all people revere Guan Yu,",-,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_3,
- "They are resplendent as the great lights of the firmament;",L_MONK_Q3_3;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_3:
-
- menu "They are resplendent as the great lights of the firmament;",L_MONK_Q3_4,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_4,
- "Each excelling others to honor him,",-,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_4,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_4,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_4,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_4,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_4,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_4;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_4:
-
- menu "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_5,
- "Each excelling others to honor him,",L_MONK_Q3_5,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_5,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_5,
- "Him, one of the three brothers of the Peach Garden Oath,",-,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_5,
- "They are resplendent as the great lights of the firmament;",L_MONK_Q3_5,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_5,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_5;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_5:
-
- menu "They are resplendent as the great lights of the firmament;",L_MONK_Q3_6,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_6,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_6,
- "Who have won sacrifices, as emperor and king.",-,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_6,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_6,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_6,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_6,
- "Each excelling others to honor him,",L_MONK_Q3_6;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_6:
-
- menu "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_7,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_7,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_7,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_7,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_7,
- "Incomparable their aura spreads through the world;",-,
- "Each excelling others to honor him,",L_MONK_Q3_7,
- "They are resplendent as the great lights of the firmament;",L_MONK_Q3_7,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_7;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_7:
-
- menu "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_8,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_8,
- "They are resplendent as the great lights of the firmament;",-,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_8,
- "Each excelling others to honor him,",L_MONK_Q3_8,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_8,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_8,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_8,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_8;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_8:
-
- menu "Temples to our Lord Guan Yu abound, no village lacks one,",-,
- "Incomparable their aura spreads through the world;",L_MONK_Q3_9,
- "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_9,
- "They are resplendent as the great lights of the firmament;",L_MONK_Q3_9,
- "Who have won sacrifices, as emperor and king.",L_MONK_Q3_9,
- "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_9,
- "Watch ye how all people revere Guan Yu,",L_MONK_Q3_9,
- "Each excelling others to honor him,",L_MONK_Q3_9,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_9;
-
- set @mnk_score, @mnk_score + 1;
-L_MONK_Q3_9:
-
- menu "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_QUEST_END,
- "Each excelling others to honor him,",L_MONK_QUEST_END,
- "Watch ye how all people revere Guan Yu,",L_MONK_QUEST_END,
- "Who have won sacrifices, as emperor and king.",L_MONK_QUEST_END,
- "Incomparable their aura spreads through the world;",L_MONK_QUEST_END,
- "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_QUEST_END,
- "They are resplendent as the great lights of the firmament;",L_MONK_QUEST_END,
- "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_QUEST_END,
- "Their venerable trees at sundown are the resting places for birds.",-;
-
-L_MONK_QUEST_1_2:
- set @mnk_score, @mnk_score + 1;
-L_MONK_QUEST_END:
-
- if(@mnk_score < 9) goto L_C2_FAIL;
-
-L_C2_DONE:
- set @mnk_score, 0;
- next;
- mes "[Wutao]";
- mes "Hmmm...";
- next;
- mes "[Wutao]";
- mes "...Well Done!! It's perfect!";
- next;
- mes "[Wutao]";
- mes "However, don't be happy just yet. There is still much to do before you can become a Monk.";
- next;
- mes "[Wutao]";
- mes "DaAhaaaa...";
- next;
- mes "[Wutao]";
- mes "ShuKeeee.....";
- next;
- mes "[Wutao]";
- mes "SouKouuuuu....";
- next;
- mes "[Wutao]";
- mes "PaYennnn....";
- next;
- mes "[Wutao]";
- mes "As I promised, your mental state is now that of a Monk.";
- next;
- mes "[Wutao]";
- mes "Now go! Seek ^000080Fuhai^000000 for further guidance.";
- set MONK_Q, 6;
- close;
-
-L_C2_FAIL:
- mes "[" + strcharinfo(0) + "]";
- mes "Well...";
- next;
- mes "[Wutao]";
- mes "Hmmm... ";
- next;
- mes "[Wutao]";
- mes "Hummm...";
- next;
- mes "[Wutao]";
- mes "That not correct! You didn't memorize it all!";
- next;
- mes "[Wutao]";
- mes "Do you doubt yourself? Do you really have the ability to be a Monk?";
- mes "...That was really....";
- next;
- mes "[Wutao]";
- mes "Well...That's fine, do you want to try it again?";
- next;
- mes "[Wutao]";
- mes "Of course you do! Since you did not pass this test, you can't take the next test.";
- set MONK_Q, 5;
- close;
-
-Part1:
- mes "[Wutao]";
- mes "Very well. Let's try it again.";
- next;
- goto L_Again;
-
-Part2:
- mes "[Wutao]";
- mes "What? You forget whom you should seek for?";
- next;
- mes "[Wutao]";
- mes "......You are so.......";
- next;
- mes "[Wutao]";
- mes "...Are you testing my patient?";
- next;
- mes "[Wutao]";
- mes "...Okay, I'll tell you again...";
- mes "Go and seek ^000080Fuhai^000000 for further guidance.";
- close;
-Part3:
- mes "[Wutao]";
- mes "May God be with you.";
- close;
-}
-
-prt_monk.gat,57,179,4 script Fuhai 110,{
-
- if(@Choice_mission == 1 ) goto Part1;
- if(@Choice_mission == 2 ) goto Part2;
- if(MONK_Q == 6) goto L_START;
- if(MONK_Q == 7) goto L_MENU_1_1_2;
-
- mes "[Fuhai]";
- mes "HaAhhhhh....!!!";
- next;
- mes "- Seems like he is thinking something -";
- close;
-
-L_START:
- mes "[Fuhai]";
- mes "...";
- next;
- mes "[Fuhai]";
- mes "......";
- next;
- mes "[Fuhai]";
- mes ".........";
- next;
- mes "[Fuhai]";
- mes "............";
- next;
- menu "Hello there?",-;
-
- mes "[Fuhai]";
- mes "...what...WHAT?";
- mes "How dare you interupt my training!";
- mes "If it is not very important...";
- next;
- mes "[Fuhai]";
- mes "......";
- mes "I can't promise you will see the sun tomorrow...";
- next;
- mes "[Fuhai]";
- mes "Why are you here?";
- mes "Explain!";
- next;
- menu "Some one named [Wutao] sent me here.",L_MENU_1,"Well...Nothing...",-;
-
- mes "[Fuhai]";
- mes "......";
- mes "...How about digging a grave for yourself?";
- close;
- L_MENU_1:
- mes "[Fuhai]";
- mes "Hmmm...Is that so?";
- mes "That's...";
- next;
- mes "[Fuhai]";
- mes "Oh...Your mental state...";
- mes "Ha! Very well...";
- next;
- mes "[Fuhai]";
- mes "However, what did you learn from [Wutao]?";
- next;
- menu "Hmmm...Well...It's...",-,
- "I repeated what he said, and he sent me here.",L_MENU_1_1,
- "He tested my mental status and sent me here.",-;
-
- mes "[Fuhai]";
- mes "Foolish!";
- mes "Don't bother me! Go away!";
- close;
- L_MENU_1_1:
- mes "[Fuhai]";
- mes "Well...Then?";
- mes "Did he do anything for you?";
- next;
- menu "Ah...It's...I can't tell...",-,
- "Checked my body",L_MENU_1_1_1,
- "Told me some rules to obey",L_MENU_1_1_1,
- "Strengthened my mental state",L_MENU_1_1_2;
-
- mes "[Fuhai]";
- mes "Foolish!";
- mes "Don't bother me! Go away!";
- close;
- L_MENU_1_1_1:
- mes "[Fuhai]";
- mes "That's quite true, but not the point.";
- mes "Think! Use your brain!";
- close;
-
- L_MENU_1_1_2:
- set MONK_Q, 7;
- mes "[Fuhai]";
- mes "Very well. At least you know what has been changed in your body.";
- mes "Now, let us begin the next test.";
- next;
- mes "[Fuhai]";
- mes "I'll give you a chance to choose what kind of test you want to take.";
- mes "Now, make your own choice.";
- next;
- menu "Mushroom Collecting",-,"A Marathon",L_ROOT_2;
-
- mes "[Fuhai]";
- mes "Mushroom Collecting? Good choice!";
- mes "That would make you appreciate the value of patience and realize the meaning of the great willpower that following the path of God will give you.";
- mes "Now go prepare yourself! Come back when you are ready.";
- set @Choice_mission, 1;
- close;
- L_ROOT_2:
- mes "[Fuhai]";
- mes "A Marathon? Good choice!";
- mes "That would make you appreciate the value of willpower and realize the meaning of the great patient that following the path of God will give you.";
- mes "Now go prepare yourself! Come back when you are ready.";
- set @Choice_mission, 2;
- close;
-Part1:
- mes "[Fuhai]";
- mes "Are you ready?";
- mes "Actually, you don't need to prepare anything if you believe in yourself.";
- next;
- mes "[Fuhai]";
- mes "Mushroom Collecting is your choice.";
- mes "It is a test of your patience.";
- next;
- mes "[Fuhai]";
- mes "Now, go into the building located in the center of this training area.";
- next;
- mes "[Fuhai]";
- mes "You will pass the test when you collect enough mushrooms.";
- mes "Now, what are waiting for? Go!";
- close;
-Part2:
- mes "[Fuhai]";
- mes "Are you ready?";
- mes "Actually, you don't need to prepare anything if you believe in yourself.";
- next;
- mes "[Fuhai]";
- mes "A Marathon is your choice.";
- mes "It's a test of your willpower.";
- next;
- mes "[Fuhai]";
- mes "Now, go into the building located in the center of this training area.";
- next;
- mes "[Fuhai]";
- mes "You will pass the test when you can run enough laps.";
- mes "Now, what are waiting for? Go!";
- close;
-
-}
-
-prt_monk.gat,199,169,4 script Guard 746,{
- if(MONK_Q == 7) goto L_START;
- if(MONK_Q > 6) goto Part1;
-
- mes "[Guard ChaoLi]";
- mes "This is...";
- mes "Monk Training Area";
- next;
- mes "[Guard ChaoLi]";
- mes "Please be quiet in this area.";
- close;
-
-L_START:
- mes "[Guard ChaoLi]";
- mes "This is...";
- mes "Monk Training Area";
- next;
- mes "[Guard ChaoLi]";
- mes strcharinfo(0) + "... Right?!";
- next;
- mes "[Guard ChaoLi]";
- mes "Go ahead! Quickly!";
- mes "There is another test waiting for you!";
- close;
-
-Part1:
- mes "[Guard ChaoLi]";
- mes "Please be quiet in this area.";
- close;
-}
-
-monk_test.gat,329,61,4 script Bashu 753,{
- if(MONK_Q == 7) goto L_START;
-
- mes "[Bashu]";
- mes "Welcome to ^00FF00St. Capitolina Abbey^000000, the Monk Training Area.";
- mes "May the light shine on your path.";
- mes "You can find Monk Daowen, the judge of a Monk's training progress, when you go inside";
- next;
- mes "[Bashu]";
- mes "Never the less, don't touch anything inside and be quiet in front of Monk Daowen.";
- close;
-L_START:
- if(@Choice_mission == 0) goto L_MISSB;
- if(@Choice_mission == 2) goto L_MISS2;
- mes "[Bashu]";
- mes "As I know, you choose to collect mushrooms as your test.";
- goto L_MISSC;
-L_MISSB:
- mes "[Bashu]";
- mes "Please select a test.";
- goto L_MISSC;
-L_MISS2:
- mes "[Bashu]";
- mes "As I know, you choose the Marathon as your test.";
-L_MISSC:
- mes "However, if you cannot complete it, you may switch to the other whenever you feel like it.";
- next;
- menu "A Monk's patience - Mushroom Collecting",-,
- "A Monk's willpower - The Marathon",L_MENU_1;
-
- mes "[Bashu]";
- mes "The test you choose is Monk's patience - Mushroom Collecting";
- next;
- warp "job_monk.gat",225,179;
- end;
-
-L_MENU_1:
- mes "[Bashu]";
- mes "The test you choose is Monk's willpower - Marathon";
- next;
- warp "monk_test.gat",387,345;
- end;
-}
-
-monk_test.gat,387,347,4 script Musha 110,{
- mes "[Musha]";
- mes "Wel...Welcome...!";
- mes "This...This is the area for testing the wi...willpower of those who want to be a Monk.";
- next;
- mes "[Musha]";
- mes "You should just...just run!";
- mes "Until we tell you to stop.";
- mes "Run...Run! " + strcharinfo(0) + "! Run!";
- next;
- mes "[Musha]";
- mes "Just Run!! Run Quickly!!";
- next;
- mes "[Musha]";
- mes "One Day, I'll become a Monk!";
- mes "I.....will......Become...a......MONK!!!";
- next;
- mes "[Musha]";
- mes "Do...Do you...want to give......give up? or...con...continue?";
- mes "Give up?";
- next;
- menu "I want to giveup!",-,"I want to run!!",L_MENU_1;
-
- mapannounce "monk_test.gat","Musha: " + strcharinfo(0) + " has give...given up on the test...! Gave up on the Marathon test... No...No willpower.....HaHaHaHa!!!...",8;
- mes "[Musha]";
- mes strcharinfo(0) + "...give...give up the test...";
- mes "Give up the Marathon test...";
- mes "No...No willpower.....HaHaHaHa!!!...";
- next;
- warp "prt_monk.gat",196,168;
- end;
-L_MENU_1:
- next;
- mes "[Musha]";
- mes "Until we give you an order to stop....";
- mes "Run...Run! " + strcharinfo(0) + "! Run!";
- //if(@runtimes == 0)
- set @runtimes, rand(8,10);
- set @run, 0;
- close;
-}
-
-monk_test.gat,390,387,0 script monk_warp 45,1,1,{
- set @run, @run + 1;
- if(@run == (@runtimes-1)) mapannounce "monk_test.gat","Musha: Cheer up! The next lap is the last!",8;
- if(@run == @runtimes) goto L_DONE;
- warp "monk_test.gat",388,348;
- end;
-L_DONE:
- mapannounce "monk_test.gat","Musha: Con....Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
- set MONK_Q, 8;
- warp "prt_monk.gat",196,168;
- end;
-}
-
-function script MnkTraps {
- mapannounce "monk_test.gat","trap: " + strcharinfo(0)+ " , you fell into a trap! We will warp you to the starting line.",8;
- warp "monk_test.gat",388,348;
-}
-//---------------------
-monk_test.gat,386,164,0 script monk1-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,386,165,0 script monk1-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,387,164,0 script monk1-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,387,165,0 script monk1-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,388,164,0 script monk1-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,388,165,0 script monk1-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,389,164,0 script monk1-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,389,165,0 script monk1-8 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,386,42,0 script monk2-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,386,43,0 script monk2-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,387,42,0 script monk2-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,387,43,0 script monk2-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,388,42,0 script monk2-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,388,43,0 script monk2-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,389,42,0 script monk2-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,389,43,0 script monk2-8 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,184,11,0 script monk3-1 139,0,3,{callfunc "MnkTraps";}
-monk_test.gat,185,11,0 script monk3-2 139,0,3,{callfunc "MnkTraps";}
-monk_test.gat,186,11,0 script monk3-3 139,0,3,{callfunc "MnkTraps";}
-monk_test.gat,187,11,0 script monk3-4 139,0,3,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,70,10,0 script monk4-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,70,11,0 script monk4-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,70,12,0 script monk4-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,70,13,0 script monk4-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,71,10,0 script monk4-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,71,11,0 script monk4-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,71,12,0 script monk4-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,71,13,0 script monk4-8 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,8,30,0 script monk5-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,8,31,0 script monk5-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,9,30,0 script monk5-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,9,31,0 script monk5-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,10,30,0 script monk5-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,10,31,0 script monk5-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,11,30,0 script monk5-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,11,31,0 script monk5-8 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,12,30,0 script monk5-9 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,12,31,0 script monk5-10 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,13,30,0 script monk5-11 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,13,31,0 script monk5-12 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,14,30,0 script monk5-13 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,14,31,0 script monk5-14 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,15,30,0 script monk5-15 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,15,31,0 script monk5-16 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,10,158,0 script monk6-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,10,159,0 script monk6-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,11,158,0 script monk6-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,11,159,0 script monk6-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,12,158,0 script monk6-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,12,159,0 script monk6-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,13,158,0 script monk6-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,13,159,0 script monk6-8 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,38,386,0 script monk7-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,38,387,0 script monk7-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,38,388,0 script monk7-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,38,389,0 script monk7-4 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,39,386,0 script monk7-5 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,39,387,0 script monk7-6 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,39,388,0 script monk7-7 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,39,389,0 script monk7-8 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,82,390,0 script monk8-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,82,391,0 script monk8-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,83,390,0 script monk8-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,83,391,0 script monk8-4 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-monk_test.gat,82,384,0 script monk9-1 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,82,385,0 script monk9-2 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,83,384,0 script monk9-3 139,0,0,{callfunc "MnkTraps";}
-monk_test.gat,83,385,0 script monk9-4 139,0,0,{callfunc "MnkTraps";}
-//---------------------
-
-prt_monk.gat,225,179,4 script XuanWu#01 89,{
- mes "[XuanWu]";
- mes "To see the growing of crops, I deeply appreciate the grace of God.";
- next;
- mes "[XuanWu]";
- mes "Never the less, to see those crops grown by the strong Monks.";
- mes "I think it's the most beautiful picture!";
- next;
- mes "[XuanWu]";
- mes "Frankly speeking, farmers are the greatest people in the world.";
- mes "The Blue Potion you drink must be made of God's will and by the farmer.";
- next;
- mes "[XuanWu]";
- mes "We should always be grateful.";
- next;
- mes "[XuanWu]";
- mes "God gives you everything, even the farmer.";
- next;
- mes "[XuanWu]";
- mes "The farmer is the root of world. That is quite true.";
- close;
-}
-job_monk.gat,225,179,4 script XuanWu#02 89,{
-
- if(MONK_Q == 8 ) goto Part2;
- if(@mission_start == 1 ) goto Part1;
-
- mes "[XuanWu]";
- mes "Welcome! I'm in charge here with the Mushroom Collecting.";
- mes "My Name is XuanWu";
- next;
- mes "[XuanWu]";
- mes "From now, you should take it for granted that all the suffering is training.";
- mes "Understand?";
- next;
- mes "[XuanWu]";
- mes "For Monk's lives, we should always offer our efforts as a tribute.";
- mes "Growing crops is also a kind of training.";
- next;
- mes "[XuanWu]";
- mes "We think it is the best way to realize the will of God.";
- mes "Therefore, we have started growing some kind of mushrooms that smell foul";
- next;
- mes "[XuanWu]";
- mes "All you have to do is destroy those mushrooms and bring something to prove that you did.";
- mes "What is that something? The ^ff0000Orange Gooey Mushrooms and Orange Net Mushrooms^000000";
- next;
- mes "[XuanWu]";
- mes "If you want to increase your strength and become a Monk, go and destroy them.";
- mes "Bring as many as you can, I won't tell you the amount I need.";
- mes "Now go!";
- next;
- mes "[XuanWu]";
- mes "Or...Do you want to give up?";
- next;
- menu "Start Mushroom Collecting",L_MENU_1,"I'll give up",L_MENU_2;
-
-L_MENU_2:
- mapannounce "monk_test.gat","XuanWu: ......Another one without patience...",8;
- mes "[XuanWu]";
- mes "Another one without patience...";
- set @mission_start, 0;
- getitem 1069, 1;//Items: Orange_Net_Mushroom,
- delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
- getitem 1070, 1;//Items: Orange_Gooey_Mushroom,
- delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
- next;
- warp "prt_monk.gat",196,168;
- end;
-L_MENU_1:
- mes "[XuanWu]";
- mes "Then what are you waiting for? Go Go Go!!";
- set @mission_start, 1;
- close;
-
-Part1:
- if(countitem(1069) >= 30 && countitem(1070) >0 ) goto L_DONE;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
- if(countitem(1070) >= 30 && countitem(1069) >0 ) goto L_DONE;//Items: Orange_Gooey_Mushroom_, Orange_Net_Mushroom,
- mes "[XuanWu]";
- mes "Hmmm... Is that all you can do? I don't think it's enough.";
- next;
- mes "[XuanWu]";
- mes "Or...Do you want to give up?";
- next;
- menu "Continue Mushroom Collecting",-,"I'll give up",L_MENU_2;
- close;
-L_DONE:
- set MONK_Q, 8;
- mes "[XuanWu]";
- mes "Well... I think you can do better...";
- mes "However, I would say you pass the test.";
- set @mission_start, 0;
- delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
- delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
- next;
- mes "[XuanWu]";
- mes "Now go to [Daowen], he is deep inside the building.";
- close;
-Part2:
- mes "[XuanWu]";
- mes "Are you testing my patience??";
- mes "Go to [Daowen], he is in deep inside the building.";
- close;
-}
-job_monk.gat,191,172,4 script job_monk_warp 45,1,1,{
- warp "monk_test.gat",329,57;
- end;
-}
-
-job_monk.gat,199,169,4 script Guard ChaoLi 746,{
- mes "[Guard ChaoLi]";
- mes "Silence in test area!";
- close;
-}
-
-monk_test.gat,319,139,4 script Daowen 52,{
- if(MONK_Q == 8) goto L_START;
- if(MONK_Q == 9) goto Part1;
- if(MONK_Q == 10) goto Part2;
-
- mes "[Daowen]";
- mes "Go through it quietly...";
- mes "HuWuWuuuu......";
- next;
- mes "[Daowen]";
- mes "This is St. Capitolina Abbey. If anything goes wrong, all we have done might become nothing.";
- next;
- mes "[Daowen]";
- mes "Leave! If you don't want to die, don't bother me.";
- close;
-L_START:
- mes "[Daowen]";
- mes "Oh! Finally!";
- mes "This is the last test, and I am in charge here";
- mes "My name is 'Daowen'";
- next;
- mes "[Daowen]";
- mes "Well... What should I say?";
- mes "Those who block your way? Fight them!";
- next;
- mes "[Daowen]";
- mes "Fight! Slash! When you're lost and an enemy blocks your way!";
- mes "Tell them the will of God!";
- next;
- mes "[Daowen]";
- mes "Don't compare yourself with the weak priest!";
- mes "We are always strong Monks.";
- next;
- mes "[Daowen]";
- mes "We are different from the weak priests that always run away!";
- next;
- mes "[Daowen]";
- mes "Now! Clench your fist! Go and fight!";
- next;
- mes "[Daowen]";
- mes "Do your best!";
- mes "HaHaHaHaHa.....!!";
- next;
- warp "monk_test",88,73;
- end;
-
-Part1:
- mes "[Daowen]";
- mes "Well done!! HaHaHaHa....!!";
- mes "I knew you could do it!";
- mes "I'll give you a special potion that will increase your power.";
- next;
- set MONK_Q, 10;
- if(countitem(506) == 0){//Items: Green_Potion,
- getitem 506, 1;//Items: Green_Potion,
- mes "[Daowen]";
- mes "Drink it, and your internal organs will become strong enough to be a Monk.";
- next;
- }else{
- emotion e_what;
- mes "[Daowen]";
- mes "What....!! You already have this special green potion!";
- mes "Drink all of them, and your internal organs will become strong enough to be a Monk.";
- next;
- }
-Part2:
- mes "[Daowen]";
- mes "Go to Wuhai - the first one you met here.";
- close;
-}
-
-monk_test.gat,88,91,4 script Test Assistant#01 52,{
- mes "[Test Assistant]";
- mes "Are you ready for training in the dispersement of evil?";
- next;
- mes "[Test Assistant]";
- mes "The test area is a maze with invisible walls.";
- mes "The exit point is on the opposite side of the starting point.";
- next;
- mes "[Test Assistant]";
- mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
- mes "Good luck! May God be with you.";
- next;
- if(getareausers("monk_test.gat",126,161,165,199) > 0) goto L_WAIT;
- killmonster "monk_test.gat","monk_mob1::OnMobDead";
- enablenpc "monk_mob1_1";
- enablenpc "monk_mob1_2";
- enablenpc "monk_mob1_3";
- enablenpc "monk_mob1_3";
- warp "monk_test.gat",127,179;
- end;
-L_WAIT:
- mes "[Test Assistant]";
- mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
- close;
-}
-monk_test.gat,129,180,4 script monk_mob1_1 139,0,19,{
- monster "monk_test.gat",130,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
- monster "monk_test.gat",130,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
-//~ disablenpc "monk_mob1_1";
- end;
-}
-monk_test.gat,133,180,4 script monk_mob1_2 139,0,19,{
- monster "monk_test.gat",134,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
- monster "monk_test.gat",134,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
-//~ disablenpc "monk_mob1_2";
- end;
-}
-monk_test.gat,145,180,4 script monk_mob1_3 139,0,19,{
- monster "monk_test.gat",145,180,"--ja--",1041,1,"monk_mob1::OnMobDead";
-//~ disablenpc "monk_mob1_3";
- end;
-}
-monk_test.gat,155,180,4 script monk_mob1_4 139,0,19,{
- monster "monk_test.gat",157,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
- monster "monk_test.gat",157,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
-//~ disablenpc "monk_mob1_4";
- end;
-}
-monk_test.gat,165,179,4 script monk_mob3_warp#01 45,1,1,{
- set MONK_Q, 9;
- mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
- killmonster "monk_test.gat","monk_mob1::OnMobDead";
- warp "monk_test.gat",317,142;
- end;
-}
-
-monk_test.gat,1,1,1 script monk_mob1 -1,{
-OnMobDead:
- end;
-}
-
-monk_test.gat,95,85,4 script Test Assistant#02 79,{
- mes "[Test Assistant]";
- mes "Are you ready for training in the dispersement of evil?";
- next;
- mes "[Test Assistant]";
- mes "The test area is a maze with invisible walls.";
- mes "The exit point is on the opposite side of the starting point.";
- next;
- mes "[Test Assistant]";
- mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
- mes "Good luck! May God be with you.";
- next;
- if(getareausers("monk_test.gat",126,262,165,300) > 0) goto L_WAIT;
- killmonster "monk_test.gat","monk_mob2::OnMobDead";
- enablenpc "monk_mob2_1";
- enablenpc "monk_mob2_2";
- enablenpc "monk_mob2_3";
- enablenpc "monk_mob2_4";
- warp "monk_test.gat",127,278;
- end;
-
-L_WAIT:
- mes "[Test Assistant]";
- mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
- close;
-
-}
-monk_test.gat,129,281,4 script monk_mob2_1 139,0,19,{
- monster "monk_test.gat",130,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
- monster "monk_test.gat",130,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
-//~ disablenpc "monk_mob2_1";
- end;
-}
-monk_test.gat,136,281,4 script monk_mob2_2 139,0,19,{
- monster "monk_test.gat",139,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
- monster "monk_test.gat",139,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
-//~ disablenpc "monk_mob2_2";
- end;
-}
-monk_test.gat,144,281,4 script monk_mob2_3 139,0,19,{
- monster "monk_test.gat",145,281,"--ja--",1041,1,"monk_mob2::OnMobDead";
-//~ disablenpc "monk_mob2_3";
- end;
-}
-monk_test.gat,153,281,4 script monk_mob2_4 139,0,19,{
- monster "monk_test.gat",155,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
- monster "monk_test.gat",155,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
-//~ disablenpc "monk_mob2_4";
- end;
-}
-monk_test.gat,165,278,4 script monk_mob2_warp 45,1,1,{
- set MONK_Q, 9;
- mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
- killmonster "monk_test.gat","monk_mob2::OnMobDead";
- warp "monk_test.gat",317,142;
- end;
-}
-
-monk_test.gat,1,1,1 script monk_mob2 -1,{
-OnMobDead:
- end;
-}
-
-monk_test.gat,82,85,4 script Test Assistant#03 95,{
- mes "[Test Assistant]";
- mes "Are you ready for training in the dispersement of evil?";
- next;
- mes "[Test Assistant]";
- mes "The test area is a maze with invisible walls.";
- mes "The exit point is on the opposite side of the starting point.";
- next;
- mes "[Test Assistant]";
- mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
- mes "Good luck! May God be with you.";
- next;
- if(getareausers("monk_test.gat",233,262,269,300) > 0) goto L_WAIT;
- killmonster "monk_test.gat","monk_mob3::OnMobDead";
- enablenpc "monk_mob3_1";
- enablenpc "monk_mob3_2";
- enablenpc "monk_mob3_3";
- enablenpc "monk_mob3_4";
- warp "monk_test.gat",231,279;
- end;
-
-L_WAIT:
- mes "[Test Assistant]";
- mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
- close;
-}
-
-monk_test.gat,234,281,4 script monk_mob3_1 139,0,19,{
- monster "monk_test.gat",235,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
- monster "monk_test.gat",235,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
-//~ disablenpc "monk_mob3_1";
- end;
-}
-monk_test.gat,239,281,4 script monk_mob3_2 139,0,19,{
- monster "monk_test.gat",240,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
- monster "monk_test.gat",240,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
-//~ disablenpc "monk_mob3_2";
- end;
-}
-monk_test.gat,248,281,4 script monk_mob3_3 139,0,19,{
- monster "monk_test.gat",249,281,"--ja--",1041,1,"monk_mob3::OnMobDead";
-//~ disablenpc "monk_mob3_3";
- end;
-}
-monk_test.gat,260,281,4 script monk_mob3_4 139,0,19,{
- monster "monk_test.gat",261,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
- monster "monk_test.gat",261,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
-//~ disablenpc "monk_mob3_4";
- end;
-}
-monk_test.gat,269,279,4 script monk_mob3_warp#02 45,1,1,{
- set MONK_Q, 9;
- mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
- killmonster "monk_test.gat","monk_mob3::OnMobDead";
- warp "monk_test.gat",317,142;
- end;
-}
-monk_test.gat,1,1,1 script monk_mob3 -1,{
-OnMobDead:
- end;
-}
-
-
-//==============================================================================
-// Monsters of Mushroom Collecting
-//==============================================================================
-job_monk.gat,0,0,0,0 monster Thief Mushroom 1182,170,0,0,0
-job_monk.gat,0,0,0,0 monster Thief Bug Larva 1051,120,0,0,0
-
-//==============================================================================
-// warps
-//==============================================================================
-prt_monk.gat,192,172,0 warp monk15 1,1,monk_test.gat,329,50
-monk_test.gat,329,47,0 warp monk16 1,1,prt_monk.gat,193,166
-monk_test.gat,329,76,0 warp monk17 1,1,monk_test.gat,259,118
-monk_test.gat,259,115,0 warp monk18 1,1,monk_test.gat,329,71
-monk_test.gat,271,126,0 warp monk19 1,1,monk_test.gat,301,127
-monk_test.gat,298,127,0 warp monk20 1,1,monk_test.gat,268,126
-
-//==============================================================================
-// mapflag
-//==============================================================================
-monk_test.gat mapflag nomemo
-monk_test.gat mapflag noteleport
-monk_test.gat mapflag nosave SavePoint
-monk_test.gat mapflag nopenalty
-monk_test.gat mapflag nobranch
-monk_test.gat mapflag noexp
-monk_test.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Monk Job Quest
+//===== By: ==================================================
+//= Dino9021, Edited / Translated by Celest
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Monk Job Quests for Athena 2004.12.30
+//===== Additional Comments: =================================
+//= 1.1 Fixed missing '";'. Now it's loading fine [Lupus]
+//= 1.1+ Edited/Translated 5% [Celest]
+//= 1.2 Made Poetry Quiz passable, Fixed Marathon Part [Lupus]
+//= 1.3 Added Baby Class Support [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus] 1.7 Fixed warps19/20 [Yor]
+//= 1.8 Fixed bugs. Fixed Green Potion exploit. Getting rid of Jfunc mess [Lupus]
+//= 1.9 Added a missing check in Fuhai and fixed a LOT of Engrish. [Zephiris]
+//= 1.9b Fixed another bug in Fuhai. [Zephiris]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Removed Duplicates [Silent]
+//============================================================
+
+
+prt_monk.gat,55,249,4 script Tohobu the Guarding Monk 139,0,5,{
+ mes "[Tohobu]";
+ mes "Who are you?!";
+ mes "How dare you enter this holy training place without my permission!!";
+ next;
+ mes "[Tohobu]";
+ mes "Get Out!!";
+ close;
+}
+prt_monk.gat,59,247,4 script Master 120,{
+ callfunc "F_BlockHigh",Job_Acolyte_High,"Acolyte High",Job_Champion,"Champion","Tohobu";
+
+ if(MONK_Q == 1 ) goto Part1;
+ if(MONK_Q == 2 ) goto Part2;
+ if(MONK_Q > 2 ) goto Part3;
+ if(BaseJob == Job_Monk) goto IsMonk;
+ goto L_START;
+
+IsMonk:
+ mes "[Tohobu]";
+ mes "Your presence is not really desired at the ^00FF00St. Capitolina Abbey^000000.";
+ mes "However, since you are here, please do not disturb the Monks in training,";
+ mes "Even if you are a Monk!";
+ close;
+
+L_START:
+ mes "[Tohobu]";
+ mes "Hmmm...? What do you want from me?";
+ mes "Before entering the Training Area,";
+ mes "You shall have to first tell me your Name, Base Level and Job Level.";
+ next;
+ mes "[Tohobu]";
+ mes "Come! What is your name?";
+ next;
+ menu "Ignore him.",-,"Tell him.",L_MENU_1;
+
+ mes "[Tohobu]";
+ mes "You are so impolite! Get out!";
+ warp "prt_fild03.gat",357,256;
+ end;
+L_MENU_1:
+ mes "[Tohobu]";
+ mes "So... Your name is " + strcharinfo(0) + " Right?";
+ mes "...I believe it is pronounced that way.";
+ mes "Let's see... Job Level is " + JobLevel;
+ next;
+ mes "[Tohobu]";
+ mes "Okay! Why have you come to see me, " + strcharinfo(0) + " ?";
+ next;
+ menu "I'd like to see how Monks train themselves.",L_MENU_1_0,"I want to be a Monk.",L_MENU_1_1,"I'd like to rest here.",L_MENU_1_2;
+
+ L_MENU_1_0:
+ mes "[Tohobu]";
+ mes "Oh! I see.";
+ mes "Okay, I hope you'll learn something from our training,";
+ mes "Perhaps it might aid you in becoming a worthy Monk.";
+ set MONK_Q, 1;
+ close;
+
+ L_MENU_1_1:
+ if(BaseJob != Job_Acolyte) goto IsNot4;
+ if(JobLevel >= 40 ) goto SkillPointChk;
+ mes "[Tohobu]";
+ mes "Your Job Level is not high enough to be a Monk.";
+ mes "Come back when your Job Level is at least 40.";
+ next;
+ mes "[Tohobu]";
+ mes "No need to be hasty, there is so much to learn in this world,";
+ mes "Come back when you have met the requirements... Haha!";
+ close;
+
+ SkillPointChk:
+ if(SkillPoint == 0) goto L_GO;
+ mes "[Tohobu]";
+ mes "Well... It seems that you have the ability to be a Monk,";
+ mes "But I believe there are still skills you have yet to learn.";
+ mes "Come back when you have learned all your skills.";
+ close;
+
+ IsNot4:
+ mes "[Tohobu]";
+ mes "Oh! Are you kidding?";
+ close;
+
+ L_GO:
+ mes "[Tohobu]";
+ mes "Well... Seems you have the ability to be a Monk.";
+ mes "Very well then... Go to Wuhai the Elder, He will guide you.";
+ // used to determine what item to get at the end
+ if(JobLevel == 50) set JBLVL, 50; // used to determine what item to get at the end
+ set MONK_Q, 2;
+ close;
+
+ L_MENU_1_2:
+ mes "[Tohobu]";
+ mes "Alright, you do look tired from your travels...";
+ mes "Perhaps it would be good to rest awhile.";
+ mes "Go ahead and rest at the Abbey before leaving!";
+ next;
+ mes "[Tohobu]";
+ mes "Persevering in order to gain more strength is the way of life of the Monks.";
+ mes "I hope that seeing our practises will at least bring you some inner peace.";
+ close;
+Part1:
+ mes "[Tohobu]";
+ mes "Well? Have you changed your mind after looking around here?";
+ next;
+ menu "Nope.",L_MENU_1_0,"I want to be a Monk",L_MENU_1_1,"I need more rest.",L_MENU_1_2;
+
+Part2:
+ mes "[Tohobu]";
+ mes "Hello there! You should go to Wuhai the Elder. He will guide you.";
+ mes "He is in the Monastery Hall, South East from here";
+ close;
+
+Part3:
+ mes "[Tohobu]";
+ mes "Ah, Hello there! How is your training? Surely you're not going to give up?";
+ close;
+}
+
+monk_in.gat,99,58,4 script Elder Wuhai 60,{
+ //Not sure if this is needed, but hopefully it will prevent bugs [Zephiris]
+ if(MONK_Q > 11) set MONK_Q,11;
+
+ if(MONK_Q == 2) goto L_START;
+ if(MONK_Q == 3) goto Part1;
+ if(MONK_Q == 4) goto Part2;
+ if(MONK_Q >= 5 && MONK_Q < 10) goto Part3;
+ if(MONK_Q >= 10 && countitem(506) > 0) goto Part4;//Items: Green_Potion,
+ if(MONK_Q >= 10 && countitem(506) == 0) goto Part5;//Items: Green_Potion,
+ if(BaseJob == Job_Monk) goto Part6;
+ if(BaseJob == Job_Acolyte) goto Part7;
+
+ mes "[Elder Wuhai]";
+ mes "May you find God in the Mother Nature!!";
+ mes "Welcome traveler, why do you seek me?";
+ close;
+
+L_START:
+ mes "[Elder Wuhai]";
+ mes "Hmmm... You are the youth who wants to be a Monk, right?";
+ next;
+ menu "Yes.",L_MENU_1,"No.",-;
+ mes "[Elder Wuhai]";
+ mes "Hmmm...? Aren't you?";
+ mes "Maybe I'm getting older, I would've guessed you were.";
+ mes "Very well then... You may go, young one.";
+ close;
+L_MENU_1:
+ mes "[Elder Wuhai]";
+ mes "Oh! So young ones these days still remember us Monks...";
+ mes "Welcome, my child!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "So you want to be a Monk! I'm glad to hear that!";
+ mes "But first, before you can become one, there are a few things you need to know.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "As Monks, we undergo strict training while protecting world peace.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "The strength is for giving aid to the weak in need, and to protect them from harm.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Last but not least, we control our emotions,";
+ mes "More importantly, never be too proud of yourself,";
+ mes "or be blinded by success,";
+ next;
+ mes "[Elder Wuhai]";
+ mes "It might be tough, even painful,";
+ mes "while undergoing this process.";
+ mes "We will test the limits of what you can endure.";
+ mes "You can not become a Monk if you can't even bear this.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "OKay, let's start the test to see if you really have the ability to become a Monk.";
+ next;
+ if(JBLVL == 50) goto IsJOB50;
+ mes "[Elder Wuhai]";
+ mes "Firstly, here's a small exam to test your will to become one of us.";
+ next;
+
+ set MONK_Q, 3;
+ set JOB_MONK_C,rand(1,6);
+L_Collect:
+ if(JOB_MONK_C == 1 ) goto L_Collect1;
+ if(JOB_MONK_C == 2 ) goto L_Collect2;
+ if(JOB_MONK_C == 3 ) goto L_Collect3;
+ if(JOB_MONK_C == 4 ) goto L_Collect4;
+ if(JOB_MONK_C == 5 ) goto L_Collect5;
+ if(JOB_MONK_C == 6 ) goto L_Collect6;
+
+ L_Collect1:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "10 Teeth of Bat";
+ mes "5 Bears Footskins";
+ mes "20 Poison Spores";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+
+ L_Collect2:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "5 Porcupine Quills";
+ mes "20 Cobwebs";
+ mes "10 Grasshopper's Legs";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+
+ L_Collect3:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "30 Stems";
+ mes "5 Jellopies";
+ mes "10 Worm Peelings";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+
+ L_Collect4:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "5 Sticky Mucus";
+ mes "10 Earthworm Peelings";
+ mes "20 Green Herbs";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+
+ L_Collect5:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "20 Yoyo Tails";
+ mes "5 Iron Ores";
+ mes "3 Blue Herbs";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+
+ L_Collect6:
+ mes "[Elder Wuhai]";
+ mes "Please bring these items";
+ mes "5 Solid Shells";
+ mes "20 Shells";
+ mes "5 Zargons";
+ if(@collect_tmp != 1) goto L_CollectS;
+ close;
+L_CollectS:
+ next;
+ mes "[Elder Wuhai]";
+ mes "To test your will, you will have to collect these items by yourself";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Come back to me when you have all of them.";
+ mes "Now go, May God's blessings be with you.";
+ close;
+
+IsJOB50:
+ mes "[Elder Wuhai]";
+ mes "Oh, I see that your Job Level is " +JobLevel +" .";
+ mes "That could prove your ability.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Well done!";
+ mes "I think God will agree with me.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Well then.. There is a Monk named Wutao who wants to see you.";
+ mes "He is in the Ancestral Graveyard North of here.";
+ set MONK_Q, 4;
+ close;
+
+Part1:
+ if(JOB_MONK_C == 1 && countitem(913) >= 10 && countitem(948) >= 5 && countitem(7033) >= 20) goto L_CollectS2_1;//Items: Tooth_of_Bat, Bear's_Footskin, Poison_Spore,
+ if(JOB_MONK_C == 2 && countitem(1027) >= 5 && countitem(1025) >= 20 && countitem(940) >= 10) goto L_CollectS2_2;//Items: Porcupine_Quill, Cobweb, Grasshopper's_Leg,
+ if(JOB_MONK_C == 3 && countitem(905) >= 30 && countitem(909) >= 5 && countitem(955) >= 10) goto L_CollectS2_3;//Items: Stem, Jellopy, Worm_Peeling,
+ if(JOB_MONK_C == 4 && countitem(938) >= 5 && countitem(1055) >= 10 && countitem(511) >= 20) goto L_CollectS2_4;//Items: Sticky_Mucus, Earthworm_Peeling, Green_Herb,
+ if(JOB_MONK_C == 5 && countitem(942) >= 20 && countitem(1002) >= 5 && countitem(510) >= 3) goto L_CollectS2_5;//Items: Yoyo_Tail, Iron_Ore, Blue_Herb,
+ if(JOB_MONK_C == 6 && countitem(943) >= 5 && countitem(935) >= 20 && countitem(912) >= 5) goto L_CollectS2_6;//Items: Solid_Shell, Shell, Zargon,
+
+ mes "[Elder Wuhai]";
+ mes "Hmm... Still not ready yet?";
+ mes "Let me tell what you should bring again,";
+ mes "Listen carefully!";
+ next;
+ set @collect_tmp, 1;
+ goto L_Collect;
+
+ L_CollectS2_1:
+ delitem 913, 10;//Items: Tooth_of_Bat,
+ delitem 948, 5;//Items: Bear's_Footskin,
+ delitem 7033, 20;//Items: Poison_Spore,
+ goto L_CollectS2_E;
+ L_CollectS2_2:
+ delitem 1027, 5;//Items: Porcupine_Quill,
+ delitem 1025, 20;//Items: Cobweb,
+ delitem 940, 10;//Items: Grasshopper's_Leg,
+ goto L_CollectS2_E;
+ L_CollectS2_3:
+ delitem 7012, 30;//Items: Tough_Scalelike_Stem,
+ delitem 909, 5;//Items: Jellopy,
+ delitem 955, 10;//Items: Worm_Peeling,
+ goto L_CollectS2_E;
+ L_CollectS2_4:
+ delitem 938, 5;//Items: Sticky_Mucus,
+ delitem 1055, 10;//Items: Earthworm_Peeling,
+ delitem 511, 20;//Items: Green_Herb,
+ goto L_CollectS2_E;
+ L_CollectS2_5:
+ delitem 942, 20;//Items: Yoyo_Tail,
+ delitem 1002, 5;//Items: Iron_Ore,
+ delitem 510, 3;//Items: Blue_Herb,
+ goto L_CollectS2_E;
+ L_CollectS2_6:
+ delitem 943, 5;//Items: Solid_Shell,
+ delitem 935, 20;//Items: Shell,
+ delitem 912, 5;//Items: Zargon,
+ goto L_CollectS2_E;
+
+ L_CollectS2_E:
+ mes "[Elder Wuhai]";
+ mes "Oh! You've brought all of them!";
+ mes "Well done!";
+ mes "Your will to become a Monk is formidable!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Let's see... there is a Monk named.. Ah... Wutao who wants to see you.";
+ mes "He will be in the Ancestral Graveyard North of here.";
+ set MONK_Q, 4;
+ set JOB_MONK_C, 0;
+ close;
+
+Part2:
+ mes "[Elder Wuhai]";
+ mes "Next should be... Questions regarding your job changing?";
+ mes "Go find master Wutao.";
+ mes "He will be in the Ancestral Graveyard North of here.";
+ close;
+Part3:
+ mes "[Elder Wuhai]";
+ mes "Hmm? You're still taking the test...?";
+ mes "Try to do your best then!";
+ close;
+Part4:
+ mes "[Elder Wuhai]";
+ mes "What? You didn't drink the Magic Potion yet?";
+ mes "Then... Hurry up and finish the Green-ish potion!";
+ mes "Otherwise, you will never be able to achieve the spiritual energy level of Monks!";
+ set MONK_Q, 11;
+ close;
+Part5:
+ mes "[Elder Wuhai]";
+ mes "We have done all the steps... Your blood, your mind, your soul...";
+ mes "All are prepared for you to become a Monk.";
+ mes "Even your spiritual energy has increased after drinking the Magic Potion.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Good... you must now be sworn in by an oath.";
+ mes "Afterwards, the job changing will be complete.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Are you willing to dedicate the rest of your life to serving God?";
+ next;
+ menu "Yes.",L_MONK_Q_2,"No.",-;
+
+ mes "[Elder Wuhai]";
+ mes "......What?......";
+ mes "Aren't you ready to become a Monk?";
+ mes "Perhaps you want to run around a bit more,";
+ mes "and shed some more sweat to become more prepared?";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Consider this carefully before coming back!";
+ mes "I do not want to make you a bad Monk.";
+ close;
+L_MONK_Q_2:
+ mes "[Elder Wuhai]";
+ mes "Will you use the powers given to you for your own good?";
+ next;
+ menu "Yes.",-,"No.",L_MONK_Q_3;
+
+ mes "[Elder Wuhai]";
+ mes "...NO NO NO NO NO!! Our training is not for any self benefits!";
+ mes "How could one who protects world peace abuse this advantage for their own selfish means?!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Go and think over the true purpose of a Monk.";
+ mes "Thoughts like that will only make you greedier for power!";
+ mes "The corruption of your soul will only lead to loss of your ability.";
+ close;
+
+L_MONK_Q_3:
+ mes "[Elder Wuhai]";
+ mes "When judging those who have opposed the will of God,";
+ mes "Will you hesitate in punishing them?";
+ next;
+ menu "No.",L_MONK_Q_4,"Yes.",-;
+
+ mes "[Elder Wuhai]";
+ mes "What do you think Monks are?";
+ mes "No matter who they are,";
+ mes "People who harm the weak are like trash!";
+ mes "They do not have the right to live on this world!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Perhaps you should go to people who deny morals in this world,";
+ mes "Come back again when you have a sense of justice.";
+ mes "Then you will know what to do.";
+ close;
+
+L_MONK_Q_4:
+ mes "[Elder Wuhai]";
+ mes "Will you help to eradicate those who oppose God,";
+ mes "And to sacrifice yourself for the better of others?";
+ next;
+ menu "Yes",L_MONK_Q_5,"No",-;
+
+ mes "[Elder Wuhai]";
+ mes "Oh...nonononono....";
+ mes "If sacrificing oneself would be beneficial to your peers,";
+ mes "and more enemies can be vanquished,";
+ mes "then that would be a great and worthy thing to do!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "What does Sacrifice mean? Come back when you've figured it out.";
+ mes "Ah.. Sacrifice can be so simple, yet so difficult!";
+ close;
+
+L_MONK_Q_5:
+ mes "[Elder Wuhai]";
+ mes "Will you train monsters behind you to help others in battle?";
+ next;
+ menu "Yes",-,"No",L_MONK_Q_6;
+
+ mes "[Elder Wuhai]";
+ // he's not making any sense =P [Unknown]
+ // I've reworded this to what I think it probably correct. [Zephiris]
+ mes "That is not right! Training mobs around does not serve the benefit of everyone!";
+ mes "Instead it is a selfish act that violates the rights of others!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Even when you've learned the skill 'Steel Body'";
+ mes "It is only meant to be used in emergency, or when you meet a strong adversary.";
+ mes "But not in such a situation!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "It might feel like you're helping them,";
+ mes "but you are only commiting acts of unjust!";
+ mes "What is the true way of a Monk?";
+ mes "Come back when you have thought it over.";
+ close;
+
+L_MONK_Q_6:
+ mes "[Elder Wuhai]";
+ // mes "Will you spam?";
+ // "will you spam" is just so... un-monkly. ^^;
+ mes "In villages or wilderness, will you say the same lines repeatedly?";
+ next;
+ menu "Yes",-,"No",L_MONK_Q_7;
+
+ mes "[Elder Wuhai]";
+ mes "No! If you do so, then not just Monks, but even the common people";
+ mes "will be disturbed and pay no attention to you!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "It is the same even if you only wanted to spread the words of God.";
+ mes "Think of your behavior. What's right and wrong?";
+ next;
+ mes "[Elder Wuhai]";
+ mes "I would rather test you again, but I'll let you go this time.";
+ mes "Think carefully about this before returning!";
+ close;
+L_MONK_Q_7:
+ mes "[Elder Wuhai]";
+ mes "Do you feel as if you're a messenger of God, and are willing to die for God?";
+ next;
+ menu "Yes",L_MONK_Q_8,"No",-;
+
+ mes "[Elder Wuhai]";
+ mes "You cannot be a Monk with this kind of will!";
+ mes "As it's said, Death is only temporary. If we have to give our lives";
+ mes "to protect world peace, it would at least be a meaningful action!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Those who oppose God will be condemned while those who listen to God will live.";
+ mes "What is life and death to you?";
+ mes "Ponder that well.";
+ close;
+
+L_MONK_Q_8:
+ mes "[Elder Wuhai]";
+ mes "Lastly, make an oath to swear you will keep to what you have already sworn.";
+ next;
+ menu "I swear.",L_MONK_Q_9,"I refuse.",-;
+
+ mes "[Elder Wuhai]";
+ mes "......";
+ next;
+ mes "[Elder Wuhai]";
+ mes "It seems like... you don't have enough training...";
+ mes "I can't let you become a Monk.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "It is better for you to train more.";
+ mes "Come back when you ready.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "May God be with you.";
+ close;
+
+L_MONK_Q_9:
+ mes "[Elder Wuhai]";
+ mes "Well then, we have completed the oaths.";
+ if (sex == 0) mes "Gather closer now, you are already my sister!";
+ if (sex == 1) mes "Gather closer now, you are already my brother!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Your promise has been transmited to all Monks through our hearts.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Now, let us begin the ceremony!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "I will acupuncture your 365 acupuncture points and open your 1129 arteries and veins";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Ahhhhhhhhh......";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Wuuu... Huuuuuu";
+ next;
+ mes "- He takes a deeply breath -";
+ next;
+ mes "- The acupuncture begins... -";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Ahhhh--- Dadadadadada!!!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "DaBaDaBaDadadadaKaBonTatatata!!!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Ahhhh--- Dadadadadada!!!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "WaLaChuOhhhhhhh!!!";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Wuuu... Huuuuuu";
+ next;
+ mes "[Elder Wuhai]";
+ mes "WowHoooo... It is done! You are now a Monk!";
+
+ setoption 0;
+ callfunc "Job_Change",Job_Monk;
+ next;
+ mes "[Elder Wuhai]";
+ mes "(Cough!) (Cough!)";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Am I that old...? I feel so tired... (-sigh-)";
+ mes "I could have scaled mountains after this before.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Very well... You are now a Monk...";
+ mes "Welcome to the brotherhood.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "But never forget your promise.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Keep it in your mind, and train yourself.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Now go...";
+ mes "Here is a gift from us to congratulate you.";
+ if(JBLVL < 50) getitem 1801, 1;//Items: Waghnakh,
+ if(JBLVL == 50) getitem 1804, 1;//Items: Knuckle_Duster_,
+ callfunc "F_ClearJobVar";
+ close;
+Part6:
+ mes "[Elder Wuhai]";
+ mes "May you find God in Mother Nature!";
+ mes "Welcome young one! What can I do for you?";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Is everything alright?";
+ mes "How is your training?";
+ next;
+ mes "[Elder Wuhai]";
+ mes "If you don't have a strong body, you may not be able to help people when they need you.";
+ mes "If your will is weak, the Evil in this world will lead you down a dark path.";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Never forget it! You are one who protects the weak as well as world peace!";
+ mes "You should always be aware of Evil around you. Don't let it lead you away from the Light!";
+ close;
+
+Part7:
+ mes "[Elder Wuhai]";
+ mes "May you find God in Mother Nature!";
+ mes "Welcome youung one! What can I do for you?";
+ next;
+ mes "[Elder Wuhai]";
+ mes "Oh! You are an Acolyte....";
+ mes "If you want to pray, go to the Prontera Sanctuary!";
+ mes "This is the Monk training area, not a place for you to pray.";
+ mes "Go and find other places to stay if you are not willing to be a Monk.";
+ close;
+}
+
+prt_monk.gat,251,255,4 script Wutao 79,{
+ if(MONK_Q == 4 ) goto L_START;
+ if(MONK_Q == 5 ) goto Part1;
+ if(MONK_Q == 6 ) goto Part2;
+ if(MONK_Q > 6 ) goto Part3;
+
+ mes "[Wutao]";
+ mes "We are Monks!";
+ mes "We have unlimited power!";
+ mes "We have unlimited wisdom!";
+ mes "We use our power and wisdom to protect world peace!";
+ next;
+ mes "[Wutao]";
+ mes "So...";
+ mes "Are you my enemy?";
+ mes "You block my path!!!!";
+ next;
+ mes "[Wutao]";
+ mes "If someone blocks me, I'll fight!!";
+ mes "TaAhhhhhh!!!";
+ next;
+ mes "[Wutao]";
+ mes "HuHaaaaaaaa!!!";
+ next;
+ mes "[Wutao]";
+ mes "If you are not my enemy, then be on your way.";
+ close;
+
+L_START:
+ mes "[Wutao]";
+ mes "What can I do for you?";
+ mes "Do you want to talk about God?";
+ next;
+ mes "[Wutao]";
+ mes "Oh! you are proceeding with the Monk Training!";
+ mes "The spirit you have is like that of a Monk.";
+ next;
+ mes "[Wutao]";
+ mes "It seems your arteries and veins have begun to strengthen.";
+ mes "You must be the one coming from Elder Wuhai, right?";
+ mes "Very well...";
+ next;
+ mes "[Wutao]";
+ mes "Let me inform you about the spirits of Monks and some simple rules that Monks should obey.";
+ mes "After, I'll help you strengthen your mental state to make your body ready for the next test.";
+ next;
+ mes "[Wutao]";
+ mes "Now, remember exactly what I say and repeat it back to me.";
+ mes "Clear your mind... Are you ready?";
+ next;
+ menu "Yes",L_MENU_1,"No",-;
+ mes "[Wutao]";
+ mes "Then come back when you are ready!";
+ close;
+L_MENU_1:
+ mes "[Wutao]";
+ mes "Alright, let's begin.";
+ next;
+ set @JOB_MONK_C2, rand(1,3);
+L_Again:
+ if(@JOB_MONK_C2 == 0) set @JOB_MONK_C2, rand(1,3);
+ if(@JOB_MONK_C2 == 2) goto L_ROOT_2;
+ if(@JOB_MONK_C2 == 3) goto L_ROOT_3;
+
+ set @monk_str0$,"Supported by dragon and phoenix,";
+ set @monk_str1$,"So flies he westward.";
+ set @monk_str2$,"But the phoenix shall fall to the earth.";
+ set @monk_str3$,"And the dragon shall soar to the sky;";
+ set @monk_str4$,"There shall be successes and failures,";
+ set @monk_str5$,"For such is the eternal law.";
+ set @monk_str6$,"See that ye act when occasion offers,";
+ set @monk_str7$,"Lest ye descend to the Nine Golden Springs.'";
+ goto L_MES;
+ L_ROOT_2:
+ set @monk_str0$,"He boasted not a handsome face,";
+ set @monk_str1$,"Nor was his body blessed with grace.";
+ set @monk_str2$,"His words streamed like a waterfall,";
+ set @monk_str3$,"He read a book and knew it all.";
+ set @monk_str4$,"Shu's glories could he well rehearse,";
+ set @monk_str5$,"His lore embraced the universe.";
+ set @monk_str6$,"Or text or note of scholiast";
+ set @monk_str7$,"Once read, his memory held fast.";
+ goto L_MES;
+ L_ROOT_3:
+ set @monk_str0$,"Seek ye a noble one? Then take ye the way of Jieliang,";
+ set @monk_str1$,"Watch ye how all people revere Guan Yu,";
+ set @monk_str2$,"Each excelling others to honor him,";
+ set @monk_str3$,"Him, one of the three brothers of the Peach Garden Oath,";
+ set @monk_str4$,"Who have won sacrifices, as emperor and king.";
+ set @monk_str5$,"Incomparable their aura spreads through the world;";
+ set @monk_str6$,"They are resplendent as the great lights of the firmament;";
+ set @monk_str7$,"Temples to our Lord Guan Yu abound, no village lacks one,";
+ set @monk_str8$,"Their venerable trees at sundown are the resting places for birds.";
+
+L_MES:
+ mes "[Wutao]";
+ mes "Listen carefully!";
+ next;
+ mes "[Wutao]";
+ mes @monk_str0$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str1$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str2$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str3$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str4$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str5$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str6$;
+ next;
+ mes "[Wutao]";
+ mes @monk_str7$;
+ if(@JOB_MONK_C2 < 3) goto L_MES_1;
+ next;
+ mes "[Wutao]";
+ mes @monk_str8$;
+
+L_MES_1:
+ next;
+ mes "[Wutao]";
+ mes "Now " + strcharinfo(0) + ", it's your turn.";
+ next;
+ set @mnk_score, 0;
+ if(@JOB_MONK_C2 == 2) goto L_MONK_Q2_1;
+ if(@JOB_MONK_C2 == 3) goto L_MONK_Q3_1;
+
+L_MONK_Q1_1:
+
+ menu "And the dragon shall soar to the sky;",L_MONK_Q1_2,
+ "But the phoenix shall fall to the earth.",L_MONK_Q1_2,
+ "For such is the eternal law.",L_MONK_Q1_2,
+ "See that ye act when occasion offers,",L_MONK_Q1_2,
+ "There shall be successes and failures,",L_MONK_Q1_2,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_2,
+ "Supported by dragon and phoenix,",-,
+ "So flies he westward.",L_MONK_Q1_2;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_2:
+
+ menu "But the phoenix shall fall to the earth.",L_MONK_Q1_3,
+ "See that ye act when occasion offers,",L_MONK_Q1_3,
+ "Supported by dragon and phoenix,",L_MONK_Q1_3,
+ "There shall be successes and failures,",L_MONK_Q1_3,
+ "So flies he westward.",-,
+ "And the dragon shall soar to the sky;",L_MONK_Q1_3,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_3,
+ "For such is the eternal law.",L_MONK_Q1_3;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_3:
+
+ menu "There shall be successes and failures,",L_MONK_Q1_4,
+ "But the phoenix shall fall to the earth.",-,
+ "And the dragon shall soar to the sky;",L_MONK_Q1_4,
+ "So flies he westward.",L_MONK_Q1_4,
+ "For such is the eternal law.",L_MONK_Q1_4,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_4,
+ "See that ye act when occasion offers,",L_MONK_Q1_4,
+ "Supported by dragon and phoenix,",L_MONK_Q1_4;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_4:
+
+ menu "And the dragon shall soar to the sky;",-,
+ "Supported by dragon and phoenix,",L_MONK_Q1_5,
+ "But the phoenix shall fall to the earth.",L_MONK_Q1_5,
+ "So flies he westward.",L_MONK_Q1_5,
+ "For such is the eternal law.",L_MONK_Q1_5,
+ "There shall be successes and failures,",L_MONK_Q1_5,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_5,
+ "See that ye act when occasion offers,",L_MONK_Q1_5;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_5:
+
+ menu "For such is the eternal law.",L_MONK_Q1_6,
+ "And the dragon shall soar to the sky;",L_MONK_Q1_6,
+ "So flies he westward.",L_MONK_Q1_6,
+ "Supported by dragon and phoenix,",L_MONK_Q1_6,
+ "But the phoenix shall fall to the earth.",L_MONK_Q1_6,
+ "See that ye act when occasion offers,",L_MONK_Q1_6,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_6,
+ "There shall be successes and failures,",-;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_6:
+
+ menu "Supported by dragon and phoenix,",L_MONK_Q1_7,
+ "So flies he westward.",L_MONK_Q1_7,
+ "For such is the eternal law.",-,
+ "But the phoenix shall fall to the earth.",L_MONK_Q1_7,
+ "There shall be successes and failures,",L_MONK_Q1_7,
+ "And the dragon shall soar to the sky;",L_MONK_Q1_7,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_7,
+ "See that ye act when occasion offers,",L_MONK_Q1_7;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q1_7:
+
+ menu "So flies he westward.",L_MONK_Q1_8,
+ "Supported by dragon and phoenix,",L_MONK_Q1_8,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_Q1_8,
+ "There shall be successes and failures,",L_MONK_Q1_8,
+ "For such is the eternal law.",L_MONK_Q1_8,
+ "But the phoenix shall fall to the earth.",L_MONK_Q1_8,
+ "And the dragon shall soar to the sky;",L_MONK_Q1_8,
+ "See that ye act when occasion offers,",-;
+
+ set @mnk_score, @mnk_score + 2;
+L_MONK_Q1_8:
+
+ menu "Supported by dragon and phoenix,",L_MONK_QUEST_END,
+ "See that ye act when occasion offers,",L_MONK_QUEST_END,
+ "But the phoenix shall fall to the earth.",L_MONK_QUEST_END,
+ "Lest ye descend to the Nine Golden Springs.",L_MONK_QUEST_1_2,
+ "And the dragon shall soar to the sky;",L_MONK_QUEST_END,
+ "So flies he westward.",L_MONK_QUEST_END,
+ "There shall be successes and failures,",L_MONK_QUEST_END,
+ "For such is the eternal law.",L_MONK_QUEST_END;
+
+L_MONK_Q2_1:
+
+ menu "Nor was his body blessed with grace.",L_MONK_Q2_2,
+ "He read a book and knew it all.",L_MONK_Q2_2,
+ "His words streamed like a waterfall,",L_MONK_Q2_2,
+ "He boasted not a handsome face,",-,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_2,
+ "Once read, his memory held fast.",L_MONK_Q2_2,
+ "His lore embraced the universe.",L_MONK_Q2_2,
+ "Or text or note of scholiast",L_MONK_Q2_2;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_2:
+
+ menu "His lore embraced the universe.",L_MONK_Q2_3,
+ "He boasted not a handsome face,",L_MONK_Q2_3,
+ "His words streamed like a waterfall,",L_MONK_Q2_3,
+ "He read a book and knew it all.",L_MONK_Q2_3,
+ "Or text or note of scholiast",L_MONK_Q2_3,
+ "Once read, his memory held fast.",L_MONK_Q2_3,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_3,
+ "Nor was his body blessed with grace.",-;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_3:
+
+ menu "His words streamed like a waterfall,",-,
+ "His lore embraced the universe.",L_MONK_Q2_4,
+ "He read a book and knew it all.",L_MONK_Q2_4,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_4,
+ "Nor was his body blessed with grace.",L_MONK_Q2_4,
+ "Or text or note of scholiast",L_MONK_Q2_4,
+ "He boasted not a handsome face,",L_MONK_Q2_4,
+ "Once read, his memory held fast.",L_MONK_Q2_4;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_4:
+
+ menu "Nor was his body blessed with grace.",L_MONK_Q2_5,
+ "Once read, his memory held fast.",L_MONK_Q2_5,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_5,
+ "Or text or note of scholiast",L_MONK_Q2_5,
+ "He boasted not a handsome face,",L_MONK_Q2_5,
+ "He read a book and knew it all.",-,
+ "His lore embraced the universe.",L_MONK_Q2_5,
+ "His words streamed like a waterfall,",L_MONK_Q2_5;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_5:
+
+ menu "Once read, his memory held fast.",L_MONK_Q2_6,
+ "Or text or note of scholiast",L_MONK_Q2_6,
+ "He read a book and knew it all.",L_MONK_Q2_6,
+ "His words streamed like a waterfall,",L_MONK_Q2_6,
+ "Nor was his body blessed with grace.",L_MONK_Q2_6,
+ "He boasted not a handsome face,",L_MONK_Q2_6,
+ "His lore embraced the universe.",L_MONK_Q2_6,
+ "Shu's glories could he well rehearse,",-;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_6:
+
+ menu "Or text or note of scholiast",L_MONK_Q2_7,
+ "He read a book and knew it all.",L_MONK_Q2_7,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_7,
+ "His words streamed like a waterfall,",L_MONK_Q2_7,
+ "His lore embraced the universe.",-,
+ "He boasted not a handsome face,",L_MONK_Q2_7,
+ "Nor was his body blessed with grace.",L_MONK_Q2_7,
+ "Once read, his memory held fast.",L_MONK_Q2_7;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q2_7:
+
+ menu "Nor was his body blessed with grace.",L_MONK_Q2_8,
+ "Or text or note of scholiast",-,
+ "His words streamed like a waterfall,",L_MONK_Q2_8,
+ "Once read, his memory held fast.",L_MONK_Q2_8,
+ "He boasted not a handsome face,",L_MONK_Q2_8,
+ "He read a book and knew it all.",L_MONK_Q2_8,
+ "Shu's glories could he well rehearse,",L_MONK_Q2_8,
+ "His lore embraced the universe.",L_MONK_Q2_8;
+
+ set @mnk_score, @mnk_score + 2;
+L_MONK_Q2_8:
+
+ menu "He boasted not a handsome face,",L_MONK_QUEST_END,
+ "Nor was his body blessed with grace.",L_MONK_QUEST_END,
+ "Shu's glories could he well rehearse,",L_MONK_QUEST_END,
+ "Or text or note of scholiast",L_MONK_QUEST_END,
+ "His lore embraced the universe.",L_MONK_QUEST_END,
+ "He read a book and knew it all.",L_MONK_QUEST_END,
+ "His words streamed like a waterfall,",L_MONK_QUEST_END,
+ "Once read, his memory held fast.",L_MONK_QUEST_1_2;
+
+L_MONK_Q3_1:
+
+ menu "Watch ye how all people revere Guan Yu,",L_MONK_Q3_2,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",-,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_2,
+ "Each excelling others to honor him,",L_MONK_Q3_2,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_2,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_2,
+ "They are resplendent as the great lights of the firmament;",L_MONK_Q3_2,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_2,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_2;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_2:
+
+ menu "Each excelling others to honor him,",L_MONK_Q3_3,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_3,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_3,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_3,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_3,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_3,
+ "Watch ye how all people revere Guan Yu,",-,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_3,
+ "They are resplendent as the great lights of the firmament;",L_MONK_Q3_3;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_3:
+
+ menu "They are resplendent as the great lights of the firmament;",L_MONK_Q3_4,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_4,
+ "Each excelling others to honor him,",-,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_4,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_4,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_4,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_4,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_4,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_4;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_4:
+
+ menu "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_5,
+ "Each excelling others to honor him,",L_MONK_Q3_5,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_5,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_5,
+ "Him, one of the three brothers of the Peach Garden Oath,",-,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_5,
+ "They are resplendent as the great lights of the firmament;",L_MONK_Q3_5,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_5,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_5;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_5:
+
+ menu "They are resplendent as the great lights of the firmament;",L_MONK_Q3_6,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_6,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_6,
+ "Who have won sacrifices, as emperor and king.",-,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_6,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_6,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_6,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_6,
+ "Each excelling others to honor him,",L_MONK_Q3_6;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_6:
+
+ menu "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_7,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_7,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_7,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_7,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_7,
+ "Incomparable their aura spreads through the world;",-,
+ "Each excelling others to honor him,",L_MONK_Q3_7,
+ "They are resplendent as the great lights of the firmament;",L_MONK_Q3_7,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_7;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_7:
+
+ menu "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_8,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_8,
+ "They are resplendent as the great lights of the firmament;",-,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_8,
+ "Each excelling others to honor him,",L_MONK_Q3_8,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_8,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_8,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_8,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_Q3_8;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_8:
+
+ menu "Temples to our Lord Guan Yu abound, no village lacks one,",-,
+ "Incomparable their aura spreads through the world;",L_MONK_Q3_9,
+ "Their venerable trees at sundown are the resting places for birds.",L_MONK_Q3_9,
+ "They are resplendent as the great lights of the firmament;",L_MONK_Q3_9,
+ "Who have won sacrifices, as emperor and king.",L_MONK_Q3_9,
+ "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_Q3_9,
+ "Watch ye how all people revere Guan Yu,",L_MONK_Q3_9,
+ "Each excelling others to honor him,",L_MONK_Q3_9,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_Q3_9;
+
+ set @mnk_score, @mnk_score + 1;
+L_MONK_Q3_9:
+
+ menu "Him, one of the three brothers of the Peach Garden Oath,",L_MONK_QUEST_END,
+ "Each excelling others to honor him,",L_MONK_QUEST_END,
+ "Watch ye how all people revere Guan Yu,",L_MONK_QUEST_END,
+ "Who have won sacrifices, as emperor and king.",L_MONK_QUEST_END,
+ "Incomparable their aura spreads through the world;",L_MONK_QUEST_END,
+ "Seek ye a noble one? Then take ye the way of Jieliang,",L_MONK_QUEST_END,
+ "They are resplendent as the great lights of the firmament;",L_MONK_QUEST_END,
+ "Temples to our Lord Guan Yu abound, no village lacks one,",L_MONK_QUEST_END,
+ "Their venerable trees at sundown are the resting places for birds.",-;
+
+L_MONK_QUEST_1_2:
+ set @mnk_score, @mnk_score + 1;
+L_MONK_QUEST_END:
+
+ if(@mnk_score < 9) goto L_C2_FAIL;
+
+L_C2_DONE:
+ set @mnk_score, 0;
+ next;
+ mes "[Wutao]";
+ mes "Hmmm...";
+ next;
+ mes "[Wutao]";
+ mes "...Well Done!! It's perfect!";
+ next;
+ mes "[Wutao]";
+ mes "However, don't be happy just yet. There is still much to do before you can become a Monk.";
+ next;
+ mes "[Wutao]";
+ mes "DaAhaaaa...";
+ next;
+ mes "[Wutao]";
+ mes "ShuKeeee.....";
+ next;
+ mes "[Wutao]";
+ mes "SouKouuuuu....";
+ next;
+ mes "[Wutao]";
+ mes "PaYennnn....";
+ next;
+ mes "[Wutao]";
+ mes "As I promised, your mental state is now that of a Monk.";
+ next;
+ mes "[Wutao]";
+ mes "Now go! Seek ^000080Fuhai^000000 for further guidance.";
+ set MONK_Q, 6;
+ close;
+
+L_C2_FAIL:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well...";
+ next;
+ mes "[Wutao]";
+ mes "Hmmm... ";
+ next;
+ mes "[Wutao]";
+ mes "Hummm...";
+ next;
+ mes "[Wutao]";
+ mes "That not correct! You didn't memorize it all!";
+ next;
+ mes "[Wutao]";
+ mes "Do you doubt yourself? Do you really have the ability to be a Monk?";
+ mes "...That was really....";
+ next;
+ mes "[Wutao]";
+ mes "Well...That's fine, do you want to try it again?";
+ next;
+ mes "[Wutao]";
+ mes "Of course you do! Since you did not pass this test, you can't take the next test.";
+ set MONK_Q, 5;
+ close;
+
+Part1:
+ mes "[Wutao]";
+ mes "Very well. Let's try it again.";
+ next;
+ goto L_Again;
+
+Part2:
+ mes "[Wutao]";
+ mes "What? You forget whom you should seek for?";
+ next;
+ mes "[Wutao]";
+ mes "......You are so.......";
+ next;
+ mes "[Wutao]";
+ mes "...Are you testing my patient?";
+ next;
+ mes "[Wutao]";
+ mes "...Okay, I'll tell you again...";
+ mes "Go and seek ^000080Fuhai^000000 for further guidance.";
+ close;
+Part3:
+ mes "[Wutao]";
+ mes "May God be with you.";
+ close;
+}
+
+prt_monk.gat,57,179,4 script Fuhai 110,{
+
+ if(@Choice_mission == 1 ) goto Part1;
+ if(@Choice_mission == 2 ) goto Part2;
+ if(MONK_Q == 6) goto L_START;
+ if(MONK_Q == 7) goto L_MENU_1_1_2;
+
+ mes "[Fuhai]";
+ mes "HaAhhhhh....!!!";
+ next;
+ mes "- Seems like he is thinking something -";
+ close;
+
+L_START:
+ mes "[Fuhai]";
+ mes "...";
+ next;
+ mes "[Fuhai]";
+ mes "......";
+ next;
+ mes "[Fuhai]";
+ mes ".........";
+ next;
+ mes "[Fuhai]";
+ mes "............";
+ next;
+ menu "Hello there?",-;
+
+ mes "[Fuhai]";
+ mes "...what...WHAT?";
+ mes "How dare you interupt my training!";
+ mes "If it is not very important...";
+ next;
+ mes "[Fuhai]";
+ mes "......";
+ mes "I can't promise you will see the sun tomorrow...";
+ next;
+ mes "[Fuhai]";
+ mes "Why are you here?";
+ mes "Explain!";
+ next;
+ menu "Some one named [Wutao] sent me here.",L_MENU_1,"Well...Nothing...",-;
+
+ mes "[Fuhai]";
+ mes "......";
+ mes "...How about digging a grave for yourself?";
+ close;
+ L_MENU_1:
+ mes "[Fuhai]";
+ mes "Hmmm...Is that so?";
+ mes "That's...";
+ next;
+ mes "[Fuhai]";
+ mes "Oh...Your mental state...";
+ mes "Ha! Very well...";
+ next;
+ mes "[Fuhai]";
+ mes "However, what did you learn from [Wutao]?";
+ next;
+ menu "Hmmm...Well...It's...",-,
+ "I repeated what he said, and he sent me here.",L_MENU_1_1,
+ "He tested my mental status and sent me here.",-;
+
+ mes "[Fuhai]";
+ mes "Foolish!";
+ mes "Don't bother me! Go away!";
+ close;
+ L_MENU_1_1:
+ mes "[Fuhai]";
+ mes "Well...Then?";
+ mes "Did he do anything for you?";
+ next;
+ menu "Ah...It's...I can't tell...",-,
+ "Checked my body",L_MENU_1_1_1,
+ "Told me some rules to obey",L_MENU_1_1_1,
+ "Strengthened my mental state",L_MENU_1_1_2;
+
+ mes "[Fuhai]";
+ mes "Foolish!";
+ mes "Don't bother me! Go away!";
+ close;
+ L_MENU_1_1_1:
+ mes "[Fuhai]";
+ mes "That's quite true, but not the point.";
+ mes "Think! Use your brain!";
+ close;
+
+ L_MENU_1_1_2:
+ set MONK_Q, 7;
+ mes "[Fuhai]";
+ mes "Very well. At least you know what has been changed in your body.";
+ mes "Now, let us begin the next test.";
+ next;
+ mes "[Fuhai]";
+ mes "I'll give you a chance to choose what kind of test you want to take.";
+ mes "Now, make your own choice.";
+ next;
+ menu "Mushroom Collecting",-,"A Marathon",L_ROOT_2;
+
+ mes "[Fuhai]";
+ mes "Mushroom Collecting? Good choice!";
+ mes "That would make you appreciate the value of patience and realize the meaning of the great willpower that following the path of God will give you.";
+ mes "Now go prepare yourself! Come back when you are ready.";
+ set @Choice_mission, 1;
+ close;
+ L_ROOT_2:
+ mes "[Fuhai]";
+ mes "A Marathon? Good choice!";
+ mes "That would make you appreciate the value of willpower and realize the meaning of the great patient that following the path of God will give you.";
+ mes "Now go prepare yourself! Come back when you are ready.";
+ set @Choice_mission, 2;
+ close;
+Part1:
+ mes "[Fuhai]";
+ mes "Are you ready?";
+ mes "Actually, you don't need to prepare anything if you believe in yourself.";
+ next;
+ mes "[Fuhai]";
+ mes "Mushroom Collecting is your choice.";
+ mes "It is a test of your patience.";
+ next;
+ mes "[Fuhai]";
+ mes "Now, go into the building located in the center of this training area.";
+ next;
+ mes "[Fuhai]";
+ mes "You will pass the test when you collect enough mushrooms.";
+ mes "Now, what are waiting for? Go!";
+ close;
+Part2:
+ mes "[Fuhai]";
+ mes "Are you ready?";
+ mes "Actually, you don't need to prepare anything if you believe in yourself.";
+ next;
+ mes "[Fuhai]";
+ mes "A Marathon is your choice.";
+ mes "It's a test of your willpower.";
+ next;
+ mes "[Fuhai]";
+ mes "Now, go into the building located in the center of this training area.";
+ next;
+ mes "[Fuhai]";
+ mes "You will pass the test when you can run enough laps.";
+ mes "Now, what are waiting for? Go!";
+ close;
+
+}
+
+prt_monk.gat,199,169,4 script Guard 746,{
+ if(MONK_Q == 7) goto L_START;
+ if(MONK_Q > 6) goto Part1;
+
+ mes "[Guard ChaoLi]";
+ mes "This is...";
+ mes "Monk Training Area";
+ next;
+ mes "[Guard ChaoLi]";
+ mes "Please be quiet in this area.";
+ close;
+
+L_START:
+ mes "[Guard ChaoLi]";
+ mes "This is...";
+ mes "Monk Training Area";
+ next;
+ mes "[Guard ChaoLi]";
+ mes strcharinfo(0) + "... Right?!";
+ next;
+ mes "[Guard ChaoLi]";
+ mes "Go ahead! Quickly!";
+ mes "There is another test waiting for you!";
+ close;
+
+Part1:
+ mes "[Guard ChaoLi]";
+ mes "Please be quiet in this area.";
+ close;
+}
+
+monk_test.gat,329,61,4 script Bashu 753,{
+ if(MONK_Q == 7) goto L_START;
+
+ mes "[Bashu]";
+ mes "Welcome to ^00FF00St. Capitolina Abbey^000000, the Monk Training Area.";
+ mes "May the light shine on your path.";
+ mes "You can find Monk Daowen, the judge of a Monk's training progress, when you go inside";
+ next;
+ mes "[Bashu]";
+ mes "Never the less, don't touch anything inside and be quiet in front of Monk Daowen.";
+ close;
+L_START:
+ if(@Choice_mission == 0) goto L_MISSB;
+ if(@Choice_mission == 2) goto L_MISS2;
+ mes "[Bashu]";
+ mes "As I know, you choose to collect mushrooms as your test.";
+ goto L_MISSC;
+L_MISSB:
+ mes "[Bashu]";
+ mes "Please select a test.";
+ goto L_MISSC;
+L_MISS2:
+ mes "[Bashu]";
+ mes "As I know, you choose the Marathon as your test.";
+L_MISSC:
+ mes "However, if you cannot complete it, you may switch to the other whenever you feel like it.";
+ next;
+ menu "A Monk's patience - Mushroom Collecting",-,
+ "A Monk's willpower - The Marathon",L_MENU_1;
+
+ mes "[Bashu]";
+ mes "The test you choose is Monk's patience - Mushroom Collecting";
+ next;
+ warp "job_monk.gat",225,179;
+ end;
+
+L_MENU_1:
+ mes "[Bashu]";
+ mes "The test you choose is Monk's willpower - Marathon";
+ next;
+ warp "monk_test.gat",387,345;
+ end;
+}
+
+monk_test.gat,387,347,4 script Musha 110,{
+ mes "[Musha]";
+ mes "Wel...Welcome...!";
+ mes "This...This is the area for testing the wi...willpower of those who want to be a Monk.";
+ next;
+ mes "[Musha]";
+ mes "You should just...just run!";
+ mes "Until we tell you to stop.";
+ mes "Run...Run! " + strcharinfo(0) + "! Run!";
+ next;
+ mes "[Musha]";
+ mes "Just Run!! Run Quickly!!";
+ next;
+ mes "[Musha]";
+ mes "One Day, I'll become a Monk!";
+ mes "I.....will......Become...a......MONK!!!";
+ next;
+ mes "[Musha]";
+ mes "Do...Do you...want to give......give up? or...con...continue?";
+ mes "Give up?";
+ next;
+ menu "I want to giveup!",-,"I want to run!!",L_MENU_1;
+
+ mapannounce "monk_test.gat","Musha: " + strcharinfo(0) + " has give...given up on the test...! Gave up on the Marathon test... No...No willpower.....HaHaHaHa!!!...",8;
+ mes "[Musha]";
+ mes strcharinfo(0) + "...give...give up the test...";
+ mes "Give up the Marathon test...";
+ mes "No...No willpower.....HaHaHaHa!!!...";
+ next;
+ warp "prt_monk.gat",196,168;
+ end;
+L_MENU_1:
+ next;
+ mes "[Musha]";
+ mes "Until we give you an order to stop....";
+ mes "Run...Run! " + strcharinfo(0) + "! Run!";
+ //if(@runtimes == 0)
+ set @runtimes, rand(8,10);
+ set @run, 0;
+ close;
+}
+
+monk_test.gat,390,387,0 script monk_warp 45,1,1,{
+ set @run, @run + 1;
+ if(@run == (@runtimes-1)) mapannounce "monk_test.gat","Musha: Cheer up! The next lap is the last!",8;
+ if(@run == @runtimes) goto L_DONE;
+ warp "monk_test.gat",388,348;
+ end;
+L_DONE:
+ mapannounce "monk_test.gat","Musha: Con....Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
+ set MONK_Q, 8;
+ warp "prt_monk.gat",196,168;
+ end;
+}
+
+function script MnkTraps {
+ mapannounce "monk_test.gat","trap: " + strcharinfo(0)+ " , you fell into a trap! We will warp you to the starting line.",8;
+ warp "monk_test.gat",388,348;
+}
+//---------------------
+monk_test.gat,386,164,0 script monk1-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,386,165,0 script monk1-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,387,164,0 script monk1-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,387,165,0 script monk1-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,388,164,0 script monk1-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,388,165,0 script monk1-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,389,164,0 script monk1-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,389,165,0 script monk1-8 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,386,42,0 script monk2-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,386,43,0 script monk2-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,387,42,0 script monk2-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,387,43,0 script monk2-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,388,42,0 script monk2-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,388,43,0 script monk2-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,389,42,0 script monk2-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,389,43,0 script monk2-8 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,184,11,0 script monk3-1 139,0,3,{callfunc "MnkTraps";}
+monk_test.gat,185,11,0 script monk3-2 139,0,3,{callfunc "MnkTraps";}
+monk_test.gat,186,11,0 script monk3-3 139,0,3,{callfunc "MnkTraps";}
+monk_test.gat,187,11,0 script monk3-4 139,0,3,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,70,10,0 script monk4-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,70,11,0 script monk4-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,70,12,0 script monk4-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,70,13,0 script monk4-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,71,10,0 script monk4-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,71,11,0 script monk4-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,71,12,0 script monk4-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,71,13,0 script monk4-8 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,8,30,0 script monk5-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,8,31,0 script monk5-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,9,30,0 script monk5-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,9,31,0 script monk5-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,10,30,0 script monk5-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,10,31,0 script monk5-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,11,30,0 script monk5-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,11,31,0 script monk5-8 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,12,30,0 script monk5-9 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,12,31,0 script monk5-10 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,13,30,0 script monk5-11 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,13,31,0 script monk5-12 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,14,30,0 script monk5-13 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,14,31,0 script monk5-14 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,15,30,0 script monk5-15 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,15,31,0 script monk5-16 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,10,158,0 script monk6-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,10,159,0 script monk6-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,11,158,0 script monk6-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,11,159,0 script monk6-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,12,158,0 script monk6-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,12,159,0 script monk6-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,13,158,0 script monk6-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,13,159,0 script monk6-8 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,38,386,0 script monk7-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,38,387,0 script monk7-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,38,388,0 script monk7-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,38,389,0 script monk7-4 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,39,386,0 script monk7-5 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,39,387,0 script monk7-6 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,39,388,0 script monk7-7 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,39,389,0 script monk7-8 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,82,390,0 script monk8-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,82,391,0 script monk8-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,83,390,0 script monk8-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,83,391,0 script monk8-4 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+monk_test.gat,82,384,0 script monk9-1 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,82,385,0 script monk9-2 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,83,384,0 script monk9-3 139,0,0,{callfunc "MnkTraps";}
+monk_test.gat,83,385,0 script monk9-4 139,0,0,{callfunc "MnkTraps";}
+//---------------------
+
+prt_monk.gat,225,179,4 script XuanWu#01 89,{
+ mes "[XuanWu]";
+ mes "To see the growing of crops, I deeply appreciate the grace of God.";
+ next;
+ mes "[XuanWu]";
+ mes "Never the less, to see those crops grown by the strong Monks.";
+ mes "I think it's the most beautiful picture!";
+ next;
+ mes "[XuanWu]";
+ mes "Frankly speeking, farmers are the greatest people in the world.";
+ mes "The Blue Potion you drink must be made of God's will and by the farmer.";
+ next;
+ mes "[XuanWu]";
+ mes "We should always be grateful.";
+ next;
+ mes "[XuanWu]";
+ mes "God gives you everything, even the farmer.";
+ next;
+ mes "[XuanWu]";
+ mes "The farmer is the root of world. That is quite true.";
+ close;
+}
+job_monk.gat,225,179,4 script XuanWu#02 89,{
+
+ if(MONK_Q == 8 ) goto Part2;
+ if(@mission_start == 1 ) goto Part1;
+
+ mes "[XuanWu]";
+ mes "Welcome! I'm in charge here with the Mushroom Collecting.";
+ mes "My Name is XuanWu";
+ next;
+ mes "[XuanWu]";
+ mes "From now, you should take it for granted that all the suffering is training.";
+ mes "Understand?";
+ next;
+ mes "[XuanWu]";
+ mes "For Monk's lives, we should always offer our efforts as a tribute.";
+ mes "Growing crops is also a kind of training.";
+ next;
+ mes "[XuanWu]";
+ mes "We think it is the best way to realize the will of God.";
+ mes "Therefore, we have started growing some kind of mushrooms that smell foul";
+ next;
+ mes "[XuanWu]";
+ mes "All you have to do is destroy those mushrooms and bring something to prove that you did.";
+ mes "What is that something? The ^ff0000Orange Gooey Mushrooms and Orange Net Mushrooms^000000";
+ next;
+ mes "[XuanWu]";
+ mes "If you want to increase your strength and become a Monk, go and destroy them.";
+ mes "Bring as many as you can, I won't tell you the amount I need.";
+ mes "Now go!";
+ next;
+ mes "[XuanWu]";
+ mes "Or...Do you want to give up?";
+ next;
+ menu "Start Mushroom Collecting",L_MENU_1,"I'll give up",L_MENU_2;
+
+L_MENU_2:
+ mapannounce "monk_test.gat","XuanWu: ......Another one without patience...",8;
+ mes "[XuanWu]";
+ mes "Another one without patience...";
+ set @mission_start, 0;
+ getitem 1069, 1;//Items: Orange_Net_Mushroom,
+ delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
+ getitem 1070, 1;//Items: Orange_Gooey_Mushroom,
+ delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ next;
+ warp "prt_monk.gat",196,168;
+ end;
+L_MENU_1:
+ mes "[XuanWu]";
+ mes "Then what are you waiting for? Go Go Go!!";
+ set @mission_start, 1;
+ close;
+
+Part1:
+ if(countitem(1069) >= 30 && countitem(1070) >0 ) goto L_DONE;//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_,
+ if(countitem(1070) >= 30 && countitem(1069) >0 ) goto L_DONE;//Items: Orange_Gooey_Mushroom_, Orange_Net_Mushroom,
+ mes "[XuanWu]";
+ mes "Hmmm... Is that all you can do? I don't think it's enough.";
+ next;
+ mes "[XuanWu]";
+ mes "Or...Do you want to give up?";
+ next;
+ menu "Continue Mushroom Collecting",-,"I'll give up",L_MENU_2;
+ close;
+L_DONE:
+ set MONK_Q, 8;
+ mes "[XuanWu]";
+ mes "Well... I think you can do better...";
+ mes "However, I would say you pass the test.";
+ set @mission_start, 0;
+ delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ next;
+ mes "[XuanWu]";
+ mes "Now go to [Daowen], he is deep inside the building.";
+ close;
+Part2:
+ mes "[XuanWu]";
+ mes "Are you testing my patience??";
+ mes "Go to [Daowen], he is in deep inside the building.";
+ close;
+}
+job_monk.gat,191,172,4 script job_monk_warp 45,1,1,{
+ warp "monk_test.gat",329,57;
+ end;
+}
+
+job_monk.gat,199,169,4 script Guard ChaoLi 746,{
+ mes "[Guard ChaoLi]";
+ mes "Silence in test area!";
+ close;
+}
+
+monk_test.gat,319,139,4 script Daowen 52,{
+ if(MONK_Q == 8) goto L_START;
+ if(MONK_Q == 9) goto Part1;
+ if(MONK_Q == 10) goto Part2;
+
+ mes "[Daowen]";
+ mes "Go through it quietly...";
+ mes "HuWuWuuuu......";
+ next;
+ mes "[Daowen]";
+ mes "This is St. Capitolina Abbey. If anything goes wrong, all we have done might become nothing.";
+ next;
+ mes "[Daowen]";
+ mes "Leave! If you don't want to die, don't bother me.";
+ close;
+L_START:
+ mes "[Daowen]";
+ mes "Oh! Finally!";
+ mes "This is the last test, and I am in charge here";
+ mes "My name is 'Daowen'";
+ next;
+ mes "[Daowen]";
+ mes "Well... What should I say?";
+ mes "Those who block your way? Fight them!";
+ next;
+ mes "[Daowen]";
+ mes "Fight! Slash! When you're lost and an enemy blocks your way!";
+ mes "Tell them the will of God!";
+ next;
+ mes "[Daowen]";
+ mes "Don't compare yourself with the weak priest!";
+ mes "We are always strong Monks.";
+ next;
+ mes "[Daowen]";
+ mes "We are different from the weak priests that always run away!";
+ next;
+ mes "[Daowen]";
+ mes "Now! Clench your fist! Go and fight!";
+ next;
+ mes "[Daowen]";
+ mes "Do your best!";
+ mes "HaHaHaHaHa.....!!";
+ next;
+ warp "monk_test",88,73;
+ end;
+
+Part1:
+ mes "[Daowen]";
+ mes "Well done!! HaHaHaHa....!!";
+ mes "I knew you could do it!";
+ mes "I'll give you a special potion that will increase your power.";
+ next;
+ set MONK_Q, 10;
+ if(countitem(506) == 0){//Items: Green_Potion,
+ getitem 506, 1;//Items: Green_Potion,
+ mes "[Daowen]";
+ mes "Drink it, and your internal organs will become strong enough to be a Monk.";
+ next;
+ }else{
+ emotion e_what;
+ mes "[Daowen]";
+ mes "What....!! You already have this special green potion!";
+ mes "Drink all of them, and your internal organs will become strong enough to be a Monk.";
+ next;
+ }
+Part2:
+ mes "[Daowen]";
+ mes "Go to Wuhai - the first one you met here.";
+ close;
+}
+
+monk_test.gat,88,91,4 script Test Assistant#01 52,{
+ mes "[Test Assistant]";
+ mes "Are you ready for training in the dispersement of evil?";
+ next;
+ mes "[Test Assistant]";
+ mes "The test area is a maze with invisible walls.";
+ mes "The exit point is on the opposite side of the starting point.";
+ next;
+ mes "[Test Assistant]";
+ mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
+ mes "Good luck! May God be with you.";
+ next;
+ if(getareausers("monk_test.gat",126,161,165,199) > 0) goto L_WAIT;
+ killmonster "monk_test.gat","monk_mob1::OnMobDead";
+ enablenpc "monk_mob1_1";
+ enablenpc "monk_mob1_2";
+ enablenpc "monk_mob1_3";
+ enablenpc "monk_mob1_3";
+ warp "monk_test.gat",127,179;
+ end;
+L_WAIT:
+ mes "[Test Assistant]";
+ mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
+ close;
+}
+monk_test.gat,129,180,4 script monk_mob1_1 139,0,19,{
+ monster "monk_test.gat",130,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
+ monster "monk_test.gat",130,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
+//~ disablenpc "monk_mob1_1";
+ end;
+}
+monk_test.gat,133,180,4 script monk_mob1_2 139,0,19,{
+ monster "monk_test.gat",134,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
+ monster "monk_test.gat",134,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
+//~ disablenpc "monk_mob1_2";
+ end;
+}
+monk_test.gat,145,180,4 script monk_mob1_3 139,0,19,{
+ monster "monk_test.gat",145,180,"--ja--",1041,1,"monk_mob1::OnMobDead";
+//~ disablenpc "monk_mob1_3";
+ end;
+}
+monk_test.gat,155,180,4 script monk_mob1_4 139,0,19,{
+ monster "monk_test.gat",157,183,"--ja--",1015,1,"monk_mob1::OnMobDead";
+ monster "monk_test.gat",157,177,"--ja--",1015,1,"monk_mob1::OnMobDead";
+//~ disablenpc "monk_mob1_4";
+ end;
+}
+monk_test.gat,165,179,4 script monk_mob3_warp#01 45,1,1,{
+ set MONK_Q, 9;
+ mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
+ killmonster "monk_test.gat","monk_mob1::OnMobDead";
+ warp "monk_test.gat",317,142;
+ end;
+}
+
+monk_test.gat,1,1,1 script monk_mob1 -1,{
+OnMobDead:
+ end;
+}
+
+monk_test.gat,95,85,4 script Test Assistant#02 79,{
+ mes "[Test Assistant]";
+ mes "Are you ready for training in the dispersement of evil?";
+ next;
+ mes "[Test Assistant]";
+ mes "The test area is a maze with invisible walls.";
+ mes "The exit point is on the opposite side of the starting point.";
+ next;
+ mes "[Test Assistant]";
+ mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
+ mes "Good luck! May God be with you.";
+ next;
+ if(getareausers("monk_test.gat",126,262,165,300) > 0) goto L_WAIT;
+ killmonster "monk_test.gat","monk_mob2::OnMobDead";
+ enablenpc "monk_mob2_1";
+ enablenpc "monk_mob2_2";
+ enablenpc "monk_mob2_3";
+ enablenpc "monk_mob2_4";
+ warp "monk_test.gat",127,278;
+ end;
+
+L_WAIT:
+ mes "[Test Assistant]";
+ mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
+ close;
+
+}
+monk_test.gat,129,281,4 script monk_mob2_1 139,0,19,{
+ monster "monk_test.gat",130,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
+ monster "monk_test.gat",130,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
+//~ disablenpc "monk_mob2_1";
+ end;
+}
+monk_test.gat,136,281,4 script monk_mob2_2 139,0,19,{
+ monster "monk_test.gat",139,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
+ monster "monk_test.gat",139,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
+//~ disablenpc "monk_mob2_2";
+ end;
+}
+monk_test.gat,144,281,4 script monk_mob2_3 139,0,19,{
+ monster "monk_test.gat",145,281,"--ja--",1041,1,"monk_mob2::OnMobDead";
+//~ disablenpc "monk_mob2_3";
+ end;
+}
+monk_test.gat,153,281,4 script monk_mob2_4 139,0,19,{
+ monster "monk_test.gat",155,278,"--ja--",1015,1,"monk_mob2::OnMobDead";
+ monster "monk_test.gat",155,284,"--ja--",1015,1,"monk_mob2::OnMobDead";
+//~ disablenpc "monk_mob2_4";
+ end;
+}
+monk_test.gat,165,278,4 script monk_mob2_warp 45,1,1,{
+ set MONK_Q, 9;
+ mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
+ killmonster "monk_test.gat","monk_mob2::OnMobDead";
+ warp "monk_test.gat",317,142;
+ end;
+}
+
+monk_test.gat,1,1,1 script monk_mob2 -1,{
+OnMobDead:
+ end;
+}
+
+monk_test.gat,82,85,4 script Test Assistant#03 95,{
+ mes "[Test Assistant]";
+ mes "Are you ready for training in the dispersement of evil?";
+ next;
+ mes "[Test Assistant]";
+ mes "The test area is a maze with invisible walls.";
+ mes "The exit point is on the opposite side of the starting point.";
+ next;
+ mes "[Test Assistant]";
+ mes "Of course, there will be some monsters spawned in the maze. You'll have to fight with them.";
+ mes "Good luck! May God be with you.";
+ next;
+ if(getareausers("monk_test.gat",233,262,269,300) > 0) goto L_WAIT;
+ killmonster "monk_test.gat","monk_mob3::OnMobDead";
+ enablenpc "monk_mob3_1";
+ enablenpc "monk_mob3_2";
+ enablenpc "monk_mob3_3";
+ enablenpc "monk_mob3_4";
+ warp "monk_test.gat",231,279;
+ end;
+
+L_WAIT:
+ mes "[Test Assistant]";
+ mes "Oh... There is someone else taking the test. Please wait a minute then try again.";
+ close;
+}
+
+monk_test.gat,234,281,4 script monk_mob3_1 139,0,19,{
+ monster "monk_test.gat",235,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
+ monster "monk_test.gat",235,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
+//~ disablenpc "monk_mob3_1";
+ end;
+}
+monk_test.gat,239,281,4 script monk_mob3_2 139,0,19,{
+ monster "monk_test.gat",240,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
+ monster "monk_test.gat",240,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
+//~ disablenpc "monk_mob3_2";
+ end;
+}
+monk_test.gat,248,281,4 script monk_mob3_3 139,0,19,{
+ monster "monk_test.gat",249,281,"--ja--",1041,1,"monk_mob3::OnMobDead";
+//~ disablenpc "monk_mob3_3";
+ end;
+}
+monk_test.gat,260,281,4 script monk_mob3_4 139,0,19,{
+ monster "monk_test.gat",261,277,"--ja--",1015,1,"monk_mob3::OnMobDead";
+ monster "monk_test.gat",261,284,"--ja--",1015,1,"monk_mob3::OnMobDead";
+//~ disablenpc "monk_mob3_4";
+ end;
+}
+monk_test.gat,269,279,4 script monk_mob3_warp#02 45,1,1,{
+ set MONK_Q, 9;
+ mapannounce "monk_test.gat","Congratulations!!" + strcharinfo(0)+ " Passes!! Please go to [Daowen], he is deep inside the building.",8;
+ killmonster "monk_test.gat","monk_mob3::OnMobDead";
+ warp "monk_test.gat",317,142;
+ end;
+}
+monk_test.gat,1,1,1 script monk_mob3 -1,{
+OnMobDead:
+ end;
+}
+
+
+//==============================================================================
+// Monsters of Mushroom Collecting
+//==============================================================================
+job_monk.gat,0,0,0,0 monster Thief Mushroom 1182,170,0,0,0
+job_monk.gat,0,0,0,0 monster Thief Bug Larva 1051,120,0,0,0
+
+//==============================================================================
+// warps
+//==============================================================================
+prt_monk.gat,192,172,0 warp monk15 1,1,monk_test.gat,329,50
+monk_test.gat,329,47,0 warp monk16 1,1,prt_monk.gat,193,166
+monk_test.gat,329,76,0 warp monk17 1,1,monk_test.gat,259,118
+monk_test.gat,259,115,0 warp monk18 1,1,monk_test.gat,329,71
+monk_test.gat,271,126,0 warp monk19 1,1,monk_test.gat,301,127
+monk_test.gat,298,127,0 warp monk20 1,1,monk_test.gat,268,126
+
+//==============================================================================
+// mapflag
+//==============================================================================
+monk_test.gat mapflag nomemo
+monk_test.gat mapflag noteleport
+monk_test.gat mapflag nosave SavePoint
+monk_test.gat mapflag nopenalty
+monk_test.gat mapflag nobranch
+monk_test.gat mapflag noexp
+monk_test.gat mapflag noloot
diff --git a/npc/jobs/2-2/rogue.txt b/npc/jobs/2-2/rogue.txt
index 2a54aadef..28634fa63 100644
--- a/npc/jobs/2-2/rogue.txt
+++ b/npc/jobs/2-2/rogue.txt
@@ -1,992 +1,992 @@
-//===== eAthena Script =======================================
-//= Rogue Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 2.3a
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Rogue job quest based off of official iRO Rogue quest.
-//= There are some differences from official quest due to
-//= scripting issues. Missing some message text.
-//===== Additional Comments: =================================
-//= 1.1 fixed 3 wrong questions, added missing lines [Lupus]
-//= 1.3 Baby Class Support + 40/50 JobLevel Item fix [Lupus]
-//= 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where
-//= to go. [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.1 Removed Duplicates [Silent]
-//= 2.2 Merged JFunc [Lupus]
-//= 2.3 Added a possibility for players doing Meginjyard quest
-//= to enter Rogue guild as there's a NPC inside [SinSloth]
-//= 2.3a fixed test4 person interaction, let BABY thieves pass
-//= the test, too [Lupus]
-//============================================================
-
-
-//=======================================================================================================//
-// Markie: Test 1 and Jobchange //
-//***********************************************************************************************************************************************************//
-in_rogue.gat,363,123,3 script Markie 747,{
- callfunc "F_BlockHigh",Job_Thief_High,"Thief High",Job_Stalker,"Stalker","Markie";
-
- mes "[Markie]";
- if(BaseJob == Job_Thief) goto L_Thief;
- if(BaseJob == Job_Rogue) goto L_Rogue;
-
-L_JobOther:
- mes "I don't know how you found this place, but I think you better leave..........";
- close;
-
-L_Rogue:
- mes "Nice to see you again sweetie. You must be having so much fun as Rogue huh? Teh he he....";
- close;
-
-L_Thief:
- if(JobLevel < 40){
- mes "Oh hi there. If you want to become a Rogue I'm afraid you'll have to come back after you've trained a little more.";
- mes "Only Thieves with a ^5533FFJob level of at least 40^000000 can become Rogues.";
- close;
- }
- if(ROGUE_Q == 1) goto L_ReTest;
- if(ROGUE_Q == 2) goto L_Test2;
- if(ROGUE_Q == 3) goto L_Test3;
- if(ROGUE_Q == 4) goto L_Test4;
- if(ROGUE_Q == 5) goto L_Change;
- mes "Hmm? What brings you down here? Oh I see now... You want to become a rogue don't you sweetie?";
- next;
- mes "[Markie]";
- mes "Well it's nice to meet you. My name is Markie, what's yours?";
- next;
- mes "[Markie]";
- mes strcharinfo(0) + "..... Te he, you've got a nice name there honey. By the way, how come you decided to become a Rogue?";
- next;
- mes "[Markie]";
- mes "Well since you were honest with me and gave me your real name I guess it doesn't really matter.";
- mes "But for future reference, a Rogue never reveals his/her true identity to anybody.";
- next;
- mes "[Markie]";
- mes "It's a Rogue's number 1 rule shuga, so from now on you'd better be careful about that.";
- mes "By the way, here's an application form..... please fill out all the necessary information.....";
- next;
- mes "(you fill out the form and hand it back)";
- set JBLVL, JobLevel; // used to determine what item to get at the end
- next;
- mes "[Markie]";
- mes "Okay honey.... looks good, I'll accept your application.";
- mes "Now that that's been taken care of, how about I conduct a short interview with you?";
- next;
- mes "[Markie]";
- mes "Oh, you don't have to be nervous about it sweetie.... I'm just want to find out how much you know about Rogues.";
- mes "I do this with all of the Rogue candidates. Shall we begin?";
- next;
- menu "Ok.",L_Test1, "Hold on... I need some time.",-;
-
- mes "[Markie]";
- mes "Okay honey, just take your time. When you're ready come back.";
- close;
-
-
-//=================================================================
-L_Test1:
-//=======
- mes "[Markie]";
- mes "I am going to ask you a few questions. Listen carefully and choose what you think is the best answer okay?";
- next;
-
- savepoint "in_rogue.gat",366,114;
- set @score, 0;
- set ROGUE_Q, 1;
- if(rand(2)) goto L_QSet2;
-
- mes "[Markie]";
- mes "1) What is the added flee rate that a Thief recieves when the ^5533FFImprove Dodge^000000 skill is ^5533FFmastered^000000?";
- next;
- menu "20",sM1_1, "30",-, "40",sM1_1, "160",sM1_1;
-
- set @score, @score + 10;
-
- sM1_1:
-
- mes "[Markie]";
- mes "2) Choose a monster that cannot detect a hidden or cloaked character?";
- next;
- menu "Mummy",sM1_2, "Worm Tail",-, "Argos",sM1_2, "Soldier Skeleton",sM1_2;
-
- set @score, @score + 10;
-
- sM1_2:
-
- mes "[Markie]";
- mes "3) Where is the Rogue guild located?";
- next;
- menu "Comodo",sM1_3, "Kokomo Beach",sM1_3, "Pharos Lightouse",-, "Morroc",sM1_3;
-
- set @score, @score + 10;
-
- sM1_3:
-
- mes "[Markie]";
- mes "4) In which of the following towns, can you become a Thief?";
- next;
- menu "Comodo",sM1_4, "Lutie",sM1_4, "Alberta",sM1_4, "Morroc",-;
-
- set @score, @score + 10;
-
- sM1_4:
-
- mes "[Markie]";
- mes "5) Choose the card that does ^FF3355not^000000 have an effect on a players ^5533FFDEX stat^000000...";
- next;
- menu "Rocker Card",sM1_5, "Mummy Card",-, "Zerom Card",sM1_5, "Drops",sM1_5;
-
- set @score, @score + 10;
-
- sM1_5:
-
- mes "[Markie]";
- mes "6) What do you think is cool about being a Rogue?";
- next;
- menu "Being a bad ass",sM1_6, "Being a hypocrite",sM1_6, "Being shameless",sM1_6, "Having excellent attack strength",-;
-
- set @score, @score + 10;
-
- sM1_6:
-
- mes "[Markie]";
- mes "7) At what job level can you change from a Thief to a Rogue?";
- next;
- menu "At job lvl 30",sM1_7, "At job lvl 35",sM1_7, "At job lvl 40",-, "At job lvl 50",-;
-
- set @score, @score + 10;
-
- sM1_7:
-
- mes "[Markie]";
- mes "8) If you wanted to dye your hair a different color, where would you have to go to do that?";
- next;
- menu "Building in SouthWestern part of Morroc",sM1_8, "Building in SouthWestern part of Prontera",-,
- "Building in SouthEastern part of Morroc",sM1_8, "Building in NorthEastern part of Prontera",sM1_8;
-
- set @score, @score + 10;
-
- sM1_8:
-
- mes "[Markie]";
- mes "9) What mushrooms do you need to steal in order to become a Thief?";
- next;
- menu "Orange Gooey Mushrooms",-, "Red Hairy Mushrooms",sM1_9, "Orange Net Mushrooms",-, "Orange Sticky Mushrooms",sM1_9;
-
- set @score, @score + 10;
-
- sM1_9:
-
- mes "[Markie]";
- mes "10) Which of these cards is ^FF3355useless^000000 to a Rogue?";
- next;
- menu "Whisper Card",sM1_10, "Elder Willow Card",-, "Zerom Card",sM1_10, "Matyr Card",sM1_10;
-
- set @score, @score + 10;
-
- sM1_10:
- goto L_Score;
-
-
- L_QSet2:
- mes "[Markie]";
- mes "1) What skill do you need to learn before you can learn ^5533FFTunnel Drive^000000?";
- next;
- menu "Hiding",-, "Steal",sM2_1, "Improve Dodge",sM2_1, "Bash",sM2_1;
-
- set @score, @score + 10;
-
- sM2_1:
-
- mes "[Markie]";
- mes "2) How much more of a discount can a Rogue get with the ^5533FFHaggel^000000 skill than a merchant can with the ^5533FFDiscount^000000 skill?";
- next;
- menu "3%",sM2_2, "2%",sM2_2, "1%",-, "0%",sM2_2;
-
- set @score, @score + 10;
-
- sM2_2:
-
- mes "[Markie]";
- mes "3) What is the correct description for the skill ^5533FFMug^000000?";
- next;
- menu "Steal Items from players",sM2_3, "Steal Items from monsters",sM2_3, "Steal Zeny from monsters",-, "Steal Zeny from players",sM2_3;
-
- set @score, @score + 10;
-
- sM2_3:
-
- mes "[Markie]";
- mes "4) How many Rogues are required to activate the skill ^5533FFGangster's Paradise^000000?";
- next;
- menu "1 Rogue + 2 Assassins",sM2_4, "2 Rogues + 1 Thief",sM2_4, "4 Thieves",sM2_4, "2 or more Rogues",-;
-
- set @score, @score + 10;
-
- sM2_4:
-
- mes "[Markie]";
- mes "5) After increasing ^5533FFDivest Helm^000000 to level 5, what other skill becomes available for you learn?";
- next;
- menu "Envenom",sM2_5, "Strip Tease",sM2_5, "Venom Splasher",sM2_5, "Divest Shield",-;
-
- set @score, @score + 10;
-
- sM2_5:
-
- mes "[Markie]";
- mes "6) Choose a skill that allows its user to move while being hidden?";
- next;
- menu "Hiding",sM2_6, "Back Slide",sM2_6, "Tunnel Drive",-, "Sand Attack",sM2_6;
-
- set @score, @score + 10;
-
- sM2_6:
-
- mes "[Markie]";
- mes "7) Choose the card that increases the ^5533FFaccuracy rate^000000 of its owner?";
- next;
- menu "Andre",sM2_7, "Familiar",sM2_7, "Mummy",-, "Marina",sM2_7;
-
- set @score, @score + 10;
-
- sM2_7:
-
- mes "[Markie]";
- mes "8) Choose the monster that receives more damage when attacked by a weapon with a Vadon card attached to it?";
- mes "(Vadon card inflicts 20% more damage to fire property monsters)";
- next;
- menu "Vadon",sM2_8, "Deviruchi",sM2_8, "Elder Willow",-, "Baphomet",sM2_8;
-
- set @score, @score + 10;
-
- sM2_8:
-
- mes "[Markie]";
- mes "9) How much SP does the ^5533FFDouble Attack^000000 skill require when used with a dagger?";
- next;
- menu "15 SP",sM2_9, "No SP needed",-, "10 SP",sM2_9, "54 SP",sM2_9;
-
- set @score, @score + 10;
-
- sM2_9:
-
- mes "[Markie]";
- mes "10) Choose an effective dagger to use in the Byalan Dungeon?";
- next;
- menu "Wind Main-Gauche",-, "Ice Main-Gauche",sM2_10, "Earth Main-Gauche",sM2_10, "Fire Main-Gauche",sM2_10;
-
- set @score, @score + 10;
-
- sM2_10:
-
-
- L_Score:
- mes "[Markie]";
- mes "Okay, those are all of the questions I have. Now that wasn't so bad was it sweetie?";
- mes "I hope you don't mind, but I've been grading your answers.";
- next;
- mes "[Markie]";
- mes "I like to give people scores on their interviews so that they can know how well they did.";
- mes "It looks like you got a ^FF3355" + @score +"^000000/100............";
- next;
- mes "[Markie]";
-
- if(@score< 90) goto sL_Failed;
- if(@score<100) goto sL_Passed;
-
- sL_Perfect:
- mes "A perfect score! I knew you had what it takes to be a Rogue.....";
- mes "But don't get ahead of yourself honey cause there is still plenty more.....";
- next;
- mes "[Markie]";
- set ROGUE_Q, 2;
- goto L_Test2;
-
- sL_Passed:
- mes "Good, good. You did a good job shuga. But there is still more so don't get excited just yet.....";
- next;
- mes "[Markie]";
- set ROGUE_Q, 2;
- goto L_Test2;
- return;
-
- sL_Failed:
- mes "*sigh*..... this is not the type of score I was expecting......";
- mes "What can I say excecpt, with a score like this you're definitely not cut out to be a Rogue..........";
- emotion e_swt;
- next;
- mes "[Markie]";
- mes "Why don't you go do some more training shuga..... you need it..... *mumbles ( what a waste of my time...)*";
- close;
-
-L_ReTest:
- mes "You again? Are you sure you're ready this time?...... Okay honey, just relax....";
- next;
- goto L_Test1;
-
-L_Test2:
- mes "Your second test will be given by ^5533FFMr. Smith^000000.";
- mes "I have to warn you though, Mr. Smith can be difficult and hard to please. So be careful how you act around him.";
- close;
-L_Test3:
- mes "I know those guys are hard to find. Just be patient and keep on searching. Make sure you have the correct password as well..";
- close;
-L_Test4:
- mes "What are you doing here? I hope your not trying to skip the last test?.........";
- emotion e_what;
- next;
- mes "[Markie]";
- mes "Your almost finished so just keep trying. I know you can do it.";
- close;
-
-
-//=======================================================================
-L_Change:
-//===========
- mes "Oh, you're back and your in one piece! It looks like you've passed all of the tests sweetie.";
- mes "You have proven that you are ready to become a Rogue!";
- emotion e_ic;
- next;
- if(SkillPoint != 0) goto L_SkillP;
- mes "[Markie]";
- mes "Tada! Congratulations on becoming a Rogue. You showed a lot of effort and deserve a reward for it......";
- setlook 7,0;
- callfunc "Job_Change",Job_Rogue;
- emotion e_grat;
- next;
- mes "[Markie]";
- mes "Now that you are a Rogue you are free to go where ever you want to and do what ever you want.";
- if(JBLVL != 50) {
- getitem 1219,1; // 2 slott gladius
- } else {
- getitem 1220,1; // 3 slott gladius
- }
- callfunc "F_ClearJobVar";
- next;
- mes "[Markie]";
- mes "Just keep in mind that freedom requires responsibility. Treat people the way you expect to be treated.";
- next;
- mes "[Markie]";
- mes "Have fun shuga! See ya around!";
- close;
-
-//=======================================================================
-L_SkillP:
-//===========
- mes "[Markie]";
- mes "Oh but one thing honey... you have leftover skill points!";
- mes "Finish them first and come back, 'kay?";
- close;
-}
-
-
-
-//=======================================================================================================//
-// Mr. Smith: Tests 2 and 3 //
-//***********************************************************************************************************************************************************//
-in_rogue.gat,376,23,3 script Mr. Smith 57,{
-
- mes "[Mr. Smith]";
- if(BaseJob == Job_Thief) goto L_Thief;
- if(BaseJob == Job_Rogue) goto L_Rogue;
-
-L_OtherJob:
- mes "Go away! I'm busy.....";
- close;
-L_Rogue:
- mes "Looking good there my Rogue friend";
- close;
-L_Thief:
- if(ROGUE_Q == 2) goto L_Test2;
- if(ROGUE_Q == 3) goto L_Test3;
- if(ROGUE_Q > 3) goto L_Done;
- mes "Ok ok.... one... two.... three.... Where do you do you business... is it.... Morroc... Geffen.... Comodo??.......";
- next;
- mes "[Mr. Smith]";
- mes "Uhh..... this is giving me a headache.......";
- next;
- mes "[Mr. Smith]";
- mes "Huh? Who are you? If you want to become a rogue go talk to ^5533FFMarkie^000000....";
- next;
- mes "[Mr. Smith]";
- mes "...... CRAP! I forgot what I was counting!!";
- emotion e_wah;
- close;
-
-//----------------------------------------------------------------------------------------------------
-L_Test2:
-//--------------
- if(ROGUE_Q2 > 0) goto L_Check2;
- mes "So you're here to take the second test.... good.......";
- next;
- mes "[Mr. Smith]";
- mes "Before we get started, let me tell you about the test application fee.";
- mes "Our guild is involved in alot of business *cough* 'transactions' *cough* and therefore we are in constant needs of funds.";
- next;
- mes "[Mr. Smith]";
- mes "This is why we require a fee of ^5533FF10,000 zeny^000000 to be paid when taking the Rogue tests.";
- mes "The fee will be collected when you have completed this second test so don't have to worry if you don't have it now.";
- next;
- mes "[Mr. Smith]";
- mes "Now for your test..... You will be required to collect the following items:";
- next;
- mes "[Mr. Smith]";
- set ROGUE_Q2, rand(1,3);
- if(ROGUE_Q2 == 1) callsub sF2_R1;
- if(ROGUE_Q2 == 2) callsub sF2_R2;
- if(ROGUE_Q2 == 3) callsub sF2_R3;
- next;
- mes "[Mr. Smith]";
- mes "Once you have ALL of these items and 10,000 zeny, come back and see me okay? Good.";
- close;
-
- sF2_R1:
- mes "^5533FF6 Blue Herbs,";
- mes "10 Skel Bones,";
- mes "10 Decayed Nails,";
- mes "10 Horrendous Mouths^000000.";
- return;
- sF2_R2:
- mes "^5533FF10 Green Herbs,";
- mes "10 Garlets,";
- mes "10 Snake Scales";
- mes "10 Crab Shells.^000000";
- return;
- sF2_R3:
- mes "^5533FF10 Yellow Herbs,";
- mes "10 Bear's Footskin,";
- mes "10 Shells";
- mes "10 Grasshopper's Legs^000000.";
- return;
-
-L_Check2:
- set @count, 0;
- if(ROGUE_Q2 == 2) goto L_2;
- if(ROGUE_Q2 == 3) goto L_3;
-
- L_1:
- set @R, 1;
- if(countitem(510)<6 || countitem(932)<10 || countitem(957)<10 || countitem(958)<10 || Zeny < 10000) goto L_NotEnuf;
- delitem 510,6;
- delitem 932,10;
- delitem 957,10;
- delitem 958,10;
- goto L_Done2;
-
- L_2:
- set @R, 2;
- if(countitem(511)<10 || countitem(910)<10 || countitem(926)<10 || countitem(964)<10 || Zeny < 10000) goto L_NotEnuf;
- delitem 511,10;
- delitem 910,10;
- delitem 926,10;
- delitem 964,10;
- goto L_Done2;
-
- L_3:
- set @R, 3;
- if(countitem(508)<10 || countitem(948)<10 || countitem(935)<10 || countitem(940)<10 || Zeny < 10000) goto L_NotEnuf;
- delitem 508,10;
- delitem 948,10;
- delitem 935,10;
- delitem 940,10;
-
- L_Done2:
- mes "Let's see here.... application fee.... check..... items....... check...... Alright, everything looks in order. You've passed the second test.";
- next;
- mes "[Mr. Smith]";
- mes "When you are ready to take the next test let me know.";
- set Zeny, Zeny - 10000;
- set ROGUE_Q, 3;
- set ROGUE_Q2, 0;
- close;
-
- L_NotEnuf:
- mes ".... What the f@&#!?!? You don't have all of the items? Then why did you come back?? Don't tell me you forgot what to get.....";
- emotion e_what;
- next;
- mes "[Mr. Smith]";
- mes "Write this down! You need ^5533FF10,000^000000 zeny and:";
- if(ROGUE_Q2 == 1) callsub sF2_R1;
- if(ROGUE_Q2 == 2) callsub sF2_R2;
- if(ROGUE_Q2 == 3) callsub sF2_R3;
- next;
- mes "[Mr. Smith]";
- mes "Got it? DON'T come back until you have everything.........";
- emotion e_pif;
- close;
-
-
-//----------------------------------------------------------------------------------------------
-L_Test3:
-//---------------
- if(ROGUE_Q2 > 0) goto L_Check3;
- mes "Let me see..... Who should I have you go find........ hmm.........";
- emotion e_hmm;
- next;
- mes "[Mr. Smith]";
- mes "Ah I know! Alright, in the previous test I had you go find some items. For this test you will need to find a specific person.";
- emotion e_ic;
- next;
- mes "[Mr. Smith]";
- set ROGUE_Q2, rand(1,3);
- if(ROGUE_Q2 == 1) callsub sF3_R1;
- if(ROGUE_Q2 == 2) callsub sF3_R2;
- if(ROGUE_Q2 == 3) callsub sF3_R3;
- next;
- mes "[Mr. Smith]";
- mes "Good luck to you. Try to finish this test as soon as possible. Getting things done quickly is one of a Rogue's traits.";
- close;
-
- sF3_R1:
- mes "You will have to go and find ^5533FFAragham Junior^000000.";
- next;
- mes "[Mr. Smith]";
- mes "He lives in a little house somewhere ^5533FFSouthWest^000000 of the Fortress of Sandarman.";
- mes "That area is located ^5533FFone map East^000000 from here and is on the ^000000SouthWestern land mass^000000.";
- next;
- mes "[Mr. Smith]";
- mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
- mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
- next;
- mes "[Mr. Smith]";
- mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
- mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
- next;
- mes "[Mr. Smith]";
- mes "That's why you will need this password in order to talk to him.";
- mes "The password is: '^5533FFAragham never hoarded upgrade items.^000000'";
- return;
- sF3_R2:
- mes "You will have to go and find ^5533FFHollgrehen Junior^000000.";
- next;
- mes "[Mr. Smith]";
- mes "He lives in a little house somewhere ^5533FFSouthEast^000000 of the Fortress of Sandarman.";
- mes "That area is located ^5533FFone map East^000000 from here and is on the ^5533FFEastern land mass^000000.";
- next;
- mes "[Mr. Smith]";
- mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
- mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
- next;
- mes "[Mr. Smith]";
- mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
- mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
- next;
- mes "[Mr. Smith]";
- mes "That's why you will need this password in order to talk to him.";
- mes "The password is: '^5533FFMy Father never hoarded upgrade items.^000000'";
- return;
- sF3_R3:
- mes "You will have to go and find ^5533FFAntonio Junior.^000000.";
- next;
- mes "[Mr. Smith]";
- mes "He lives in a little hut somewhere on the ^5533FFEastern end of Kokomo Beach^000000.";
- mes "That area is located ^5533FF1 map North, and 1 map West^000000 from here.";
- next;
- mes "[Mr. Smith]";
- mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
- mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
- next;
- mes "[Mr. Smith]";
- mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
- mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
- next;
- mes "[Mr. Smith]";
- mes "That's why you will need this password in order to talk to him.";
- mes "The password is: '^5533FFAntonio doesn't like breaking refining material.^000000'";
- return;
-
-
-L_Check3:
- mes "What!?! Did you just say you forgot where to go?........";
- emotion e_what;
- next;
- mes "[Mr. Smith]";
- mes "GRRRR!!! That's why you need to WRITE down important things! Geez......";
- emotion e_an;
- next;
- mes "[Mr. Smith]";
- if(ROGUE_Q2 == 1) callsub sF3_R1;
- if(ROGUE_Q2 == 2) callsub sF3_R2;
- if(ROGUE_Q2 == 3) callsub sF3_R3;
- close;
-
-//-------------------------------------------------------------------------------------------------
-L_Done:
-//----------------
- mes "I have no more busisness with you.........";
- close;
-}
-
-
-//===========================================================
-// Guildsman that need to be found
-//===========================================================
-
-//------------------------------------------------------------------------------
-in_rogue.gat,272,136,3 script Hermanthorn Jr. 85,{
- mes "[Hermanthorn Jr.]";
- mes "Huh? Wha.... who are you?! You're not from the Rogue guild!! Get out of here!";
- emotion e_what;
- next;
- mes "[Hermanthorn Jr.]";
- mes "You're..... I see! You're one of them!!! You've come here to kill me haven't you??!! No... NO!! I'm not ready to die yet!";
- emotion e_gasp;
- next;
- mes "[Hermanthorn Jr.]";
- mes "Aaaaaaaaaaaaaahhhh!! Go away! Get lost! Otherwise I am gonna KILL YOU!!!";
- emotion e_wah;
- close;
-}
-
-// --------------------------------------------------------------------------
-cmd_fild09.gat,106,195,0 script Aragham Junior#01 45,1,1,{
- callfunc "F_RogueTest3", 1, "Aragham", "never", "hoarded", "upgrade items.", 244, 24;
-}
-
-// -----------------------------------------------------------------------------
-cmd_fild09.gat,335,143,0 script Hollgrehen Junior#01 45,1,1,{
- callfunc "F_RogueTest3", 2, "My father", "never", "hoarded", "upgrade items.", 168, 34;
-}
-
-// ------------------------------------------------------------------------------
-cmd_fild04.gat,304,179,0 script Antonio Junior#01 45,1,1,{
- callfunc "F_RogueTest3", 3, "Antonio", "doesn't like", "breaking", "refining materials.", 165, 104;
-}
-
-// Function for Guildsman ===================================
-function script F_RogueTest3 {
-
- mes "[???]";
- mes "Who's there?!!!";
- mes "Who dares to trespass on my territory?";
- if(god_megin_2 > 0 && getarg(1) == "Aragham") goto L_Pass;
- if(BaseJob != Job_Thief || ROGUE_Q<3 || ROGUE_Q2==0) close;
-L_Pass:
- deletearray @choice$[1], 4;
- next;
- menu "My father",M_1a, "Aragham",M_1b, "Antonio",M_1c, "Legolas",M_1d;
-
- M_1a:
- set @choice$[1], "My father";
- goto M_Menu2;
- M_1b:
- set @choice$[1], "Aragham";
- goto M_Menu2;
- M_1c:
- set @choice$[1], "Antonio";
- goto M_Menu2;
- M_1d:
- set @choice$[1], "Legolas";
-
- M_Menu2:
- callsub sF_Password;
- menu "did not",M_2a, "doesn't like",M_2b, "never",M_2c, "ever",M_2d;
-
- M_2a:
- set @choice$[2], "did not";
- goto M_Menu3;
- M_2b:
- set @choice$[2], "doesn't like";
- goto M_Menu3;
- M_2c:
- set @choice$[2], "never";
- goto M_Menu3;
- M_2d:
- set @choice$[2], "ever";
-
- M_Menu3:
- callsub sF_Password;
- menu "hoard",M_3a, "hoarded",M_3b, "hide",M_3c, "took",M_3d, "breaking",M_3e;
-
- M_3a:
- set @choice$[3], "hoard";
- goto M_Menu4;
- M_3b:
- set @choice$[3], "hoarded";
- goto M_Menu4;
- M_3c:
- set @choice$[3], "hide";
- goto M_Menu4;
- M_3d:
- set @choice$[3], "took";
- goto M_Menu4;
- M_3e:
- set @choice$[3], "breaking";
-
- M_Menu4:
- callsub sF_Password;
- menu "upgrade items.",M_4a, "forging items.",M_4b, "refining materials.",M_4c, "upgrade equipment.",M_4d;
-
- M_4a:
- set @choice$[4], "upgrade items.";
- goto L_Check;
- M_4b:
- set @choice$[4], "forging items.";
- goto L_Check;
- M_4c:
- set @choice$[4], "refining materials.";
- goto L_Check;
- M_4d:
- set @choice$[4], "upgrade equipment.";
-
-L_Check:
- callsub sF_Password;
- if(god_megin_2 > 0) goto L_Enter;
- if(ROGUE_Q2 != getarg(0)) goto L_Wrong;
-L_Enter:
- if((@choice$[1] != getarg(1)) || (@choice$[2] != getarg(2)) || (@choice$[3] != getarg(3)) || (@choice$[4] != getarg(4))) goto L_Wrong;
- mes "~ creeek ~";
- mes "You hear the door begining to open........";
- next;
- deletearray @choice$[1], 4;
- warp "in_rogue.gat", getarg(5), getarg(6);
- end;
-
- L_Wrong:
- mes "[???]";
- mes "Get lost!!";
- close;
-sF_Password:
- mes "[^5533FF" + strcharinfo(0) + "^000000]";
- mes @choice$[1];
- mes @choice$[2];
- mes @choice$[3];
- mes @choice$[4];
- next;
- return;
-}
-
-
-//=======================================================================================================//
-// Test 4: Last Test //
-//***********************************************************************************************************************************************************//
-// Other path
-// warp "in_rogue.gat", 11, 388;
-// 390,389 end warp
-// 9,9 -> 9,21
-//===============================================
-// Guildsman
-//===============================================
-//---------------------------------------------------------------------------
-in_rogue.gat,244,39,4 script Aragham Junior#02 99,{
- callfunc "F_RogueTest4", 1, "Aragham Junior", 245, 27;
-}
-//---------------------------------------------------------------------------
-in_rogue.gat,152,27,6 script Hollgrehen Junior#02 85,{
- callfunc "F_RogueTest4", 2, "Hollgrehen Junior", 160, 32;
-}
-//---------------------------------------------------------------------------
-in_rogue.gat,183,105,4 script Antonio Junior#02 88,{
- callfunc "F_RogueTest4", 3, "Antonio Junior", 175, 107;
-}
-
-// Function for Guildsman =============================
-function script F_RogueTest4 {
-
- if(BaseJob != Job_Thief || ROGUE_Q2 != getarg(0)) goto L_NoThief;
- if(ROGUE_Q == 4) goto L_Restart;
- mes "[" + getarg(1) + "]";
- mes "Hello there... You must be from the Rogue guild. My name is " + getarg(1) + "...... I am the Rogue of the Desert..............";
- next;
- mes "[" + getarg(1) + "]";
- mes "Aww who am I kidding...... Let's cut the crap. So are you ready to become a rogue?";
- emotion e_swt;
- next;
- mes "[" + getarg(1) + "]";
- mes "You see, the Rogue motto is...... ^5533FF'Avoid the strong! Be malicious to the weak!'^000000";
- mes "This simple rule applys to fighting monsters as well.";
- next;
- mes "[" + getarg(1) + "]";
- mes "The very last thing you will have to do before you can become a Rogue, is to walk through an underground passage to the Rogue Guild.";
- next;
- mes "[" + getarg(1) + "]";
- mes "Sounds easy huh? Well it's not! But don't worry....";
- mes "If you stay true to the Rogue motto and use a lot of hide, and do a lot of running, you should be just fine.";
-
- M_Menu:
- next;
- mes "[" + getarg(1) + "]";
- mes "Ok, are you ready to go?";
- next;
- menu "As ready as I'll ever be.",-, "Actually I'm kinda scared...",M_End;
-
- mes "[" + getarg(1) + "]";
- mes "Good luck then.";
- next;
- set ROGUE_Q, 4;
- killmonsterall "in_rogue.gat";
- savepoint "in_rogue.gat", getarg(2), getarg(3);
- warp "in_rogue.gat", 15, 105;
- end;
-
- M_End:
- mes "[" + getarg(1) + "]";
- mes ".....................";
- next;
- mes "[" + getarg(1) + "]";
- mes "Well take your time then...... I guess.......";
- close;
-
-L_Restart:
- mes "[" + getarg(1) + "]";
- mes "....... Looks like you got creamed.......";
- emotion e_swt;
- next;
- mes "[" + getarg(1) + "]";
- mes "If you're up for it, I'll send you back in. Failure has a way of teaching success.... yada yada yada....";
- percentheal 100,100;
- goto M_Menu;
-
-L_NoThief:
- mes "[" + getarg(1) +"]";
- mes "I don't know how you got the";
- if(ROGUE_Q2)
- {
- mes "pass, but I am not the one";
- mes "in charge of your test.";
- }
- else
- {
- mes "pass, but looking at your face,";
- mes "I guess you're not here for the";
- mes "Rogue test.";
- }
- next;
- mes "[" + getarg(1) +"]";
- mes "Please hurry up and leave";
- mes "this place as soon as you can!";
- close;
-}
-
-//================================================
-// Monster Spawns
-//================================================
-in_rogue.gat,15,185,0 script rogue_mob1 139,8,0,{
- monster "in_rogue.gat",14,188,"Zombie",1015,1;
- monster "in_rogue.gat",15,188,"Zombie",1015,1;
- monster "in_rogue.gat",16,188,"Zombie",1015,1;
- monster "in_rogue.gat",14,189,"Zombie",1015,1;
- monster "in_rogue.gat",15,189,"Zombie",1015,1;
- monster "in_rogue.gat",16,189,"Zombie",1015,1;
- end;
-}
-in_rogue.gat,15,245,0 script rogue_mob2 139,8,0,{
- monster "in_rogue.gat",14,247,"Mummy",1041,1;
- monster "in_rogue.gat",15,247,"Mummy",1041,1;
- monster "in_rogue.gat",16,247,"Mummy",1041,1;
- monster "in_rogue.gat",14,248,"Mummy",1041,1;
- monster "in_rogue.gat",15,248,"Mummy",1041,1;
- monster "in_rogue.gat",16,248,"Mummy",1041,1;
- end;
-}
-in_rogue.gat,15,328,0 script rogue_mob3 139,8,0,{
- monster "in_rogue.gat",14,331,"Zombie",1015,1;
- monster "in_rogue.gat",15,331,"Zombie",1015,1;
- monster "in_rogue.gat",16,331,"Zombie",1015,1;
- monster "in_rogue.gat",14,332,"Zombie",1015,1;
- monster "in_rogue.gat",15,332,"Zombie",1015,1;
- monster "in_rogue.gat",16,332,"Zombie",1015,1;
- end;
-}
-in_rogue.gat,35,342,0 script rogue_mob4 139,0,8,{
- monster "in_rogue.gat",38,340,"Mummy",1041,1;
- monster "in_rogue.gat",37,342,"Abyss Knight",1219,1;
- monster "in_rogue.gat",39,342,"Ghoul",1036,1;
- monster "in_rogue.gat",38,344,"Mummy",1041,1;
- end;
-}
-in_rogue.gat,57,306,0 script rogue_mob5 139,4,0,{
- monster "in_rogue.gat",59,301,"Khalitzburg",1132,1;
- end;
-}
-in_rogue.gat,96,333,0 script rogue_mob6 139,0,4,{
- monster "in_rogue.gat",92,325,"Khalitzburg",1132,1;
- end;
-}
-in_rogue.gat,139,313,0 script rogue_mob7 139,4,0,{
- monster "in_rogue.gat",139,309,"Abyss Knight",1219,1;
- end;
-}
-in_rogue.gat,135,246,0 script rogue_mob8 139,0,4,{
- monster "in_rogue.gat",139,245,"Zombie",1015,2;
- monster "in_rogue.gat",139,246,"Zombie",1015,2;
- monster "in_rogue.gat",139,247,"Zombie",1015,2;
- end;
-}
-in_rogue.gat,62,302,0 script rogue_mob9 139,0,4,{
- monster "in_rogue.gat",57,305,"Khalitzburg",1132,1;
- end;
-}
-in_rogue.gat,199,218,0 script rogue_mob10 139,0,8,{
- monster "in_rogue.gat",157,218,"Zombie",1015,10;
- monster "in_rogue.gat",157,218,"Abyss Knight",1219,1;
- monster "in_rogue.gat",157,218,"Ghoul",1036,1;
- monster "in_rogue.gat",157,218,"Archer Skeleton",1016,1;
- end;
-}
-in_rogue.gat,86,187,0 script rogue_mob11 139,0,8,{
- monster "in_rogue.gat",88,186,"Mummy",1041,1;
- monster "in_rogue.gat",88,187,"Mummy",1041,1;
- monster "in_rogue.gat",88,188,"Mummy",1041,1;
- end;
-}
-in_rogue.gat,225,187,0 script rogue_mob12 139,0,8,{
- monster "in_rogue.gat",232,191,"Abyss Knight",1219,1;
- monster "in_rogue.gat",233,190,"Abyss Knight",1219,1;
- monster "in_rogue.gat",234,189,"Abyss Knight",1219,1;
- end;
-}
-in_rogue.gat,252,320,0 script rogue_mob13 139,0,8,{
- monster "in_rogue.gat",252,319,"Mummy",1041,1;
- monster "in_rogue.gat",252,321,"Mummy",1041,1;
- monster "in_rogue.gat",252,319,"Ghoul",1036,1;
- monster "in_rogue.gat",252,321,"Ghoul",1036,1;
- monster "in_rogue.gat",257,320,"Archer Skeleton",1016,1;
- monster "in_rogue.gat",248,320,"Archer Skeleton",1016,1;
- end;
-}
-
-//================================================
-// End Warp
-//================================================
-in_rogue.gat,370,320,0 script rogue04 45,1,1,{
- set ROGUE_Q, 5;
- killmonsterall "in_rogue.gat";
- warp "in_rogue.gat",378,113;
- end;
-}
-
-//================================================
-// Timer: Keeps monsters from overspawning
-//================================================
-- script RogueTest3 -1,{
- end;
-
-OnMinute10:
-OnMinute20:
-OnMinute30:
-OnMinute40:
-OnMinute50:
-OnMinute60:
- killmonsterall "in_rogue.gat";
- end;
-}
-
-//==============================================================================
-// mapflag
-//==============================================================================
-in_rogue.gat mapflag nomemo
-in_rogue.gat mapflag noteleport
-in_rogue.gat mapflag nosave SavePoint
-in_rogue.gat mapflag nopenalty
-in_rogue.gat mapflag nobranch
-in_rogue.gat mapflag noexp
-in_rogue.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Rogue Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 2.3a
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Rogue job quest based off of official iRO Rogue quest.
+//= There are some differences from official quest due to
+//= scripting issues. Missing some message text.
+//===== Additional Comments: =================================
+//= 1.1 fixed 3 wrong questions, added missing lines [Lupus]
+//= 1.3 Baby Class Support + 40/50 JobLevel Item fix [Lupus]
+//= 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where
+//= to go. [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.1 Removed Duplicates [Silent]
+//= 2.2 Merged JFunc [Lupus]
+//= 2.3 Added a possibility for players doing Meginjyard quest
+//= to enter Rogue guild as there's a NPC inside [SinSloth]
+//= 2.3a fixed test4 person interaction, let BABY thieves pass
+//= the test, too [Lupus]
+//============================================================
+
+
+//=======================================================================================================//
+// Markie: Test 1 and Jobchange //
+//***********************************************************************************************************************************************************//
+in_rogue.gat,363,123,3 script Markie 747,{
+ callfunc "F_BlockHigh",Job_Thief_High,"Thief High",Job_Stalker,"Stalker","Markie";
+
+ mes "[Markie]";
+ if(BaseJob == Job_Thief) goto L_Thief;
+ if(BaseJob == Job_Rogue) goto L_Rogue;
+
+L_JobOther:
+ mes "I don't know how you found this place, but I think you better leave..........";
+ close;
+
+L_Rogue:
+ mes "Nice to see you again sweetie. You must be having so much fun as Rogue huh? Teh he he....";
+ close;
+
+L_Thief:
+ if(JobLevel < 40){
+ mes "Oh hi there. If you want to become a Rogue I'm afraid you'll have to come back after you've trained a little more.";
+ mes "Only Thieves with a ^5533FFJob level of at least 40^000000 can become Rogues.";
+ close;
+ }
+ if(ROGUE_Q == 1) goto L_ReTest;
+ if(ROGUE_Q == 2) goto L_Test2;
+ if(ROGUE_Q == 3) goto L_Test3;
+ if(ROGUE_Q == 4) goto L_Test4;
+ if(ROGUE_Q == 5) goto L_Change;
+ mes "Hmm? What brings you down here? Oh I see now... You want to become a rogue don't you sweetie?";
+ next;
+ mes "[Markie]";
+ mes "Well it's nice to meet you. My name is Markie, what's yours?";
+ next;
+ mes "[Markie]";
+ mes strcharinfo(0) + "..... Te he, you've got a nice name there honey. By the way, how come you decided to become a Rogue?";
+ next;
+ mes "[Markie]";
+ mes "Well since you were honest with me and gave me your real name I guess it doesn't really matter.";
+ mes "But for future reference, a Rogue never reveals his/her true identity to anybody.";
+ next;
+ mes "[Markie]";
+ mes "It's a Rogue's number 1 rule shuga, so from now on you'd better be careful about that.";
+ mes "By the way, here's an application form..... please fill out all the necessary information.....";
+ next;
+ mes "(you fill out the form and hand it back)";
+ set JBLVL, JobLevel; // used to determine what item to get at the end
+ next;
+ mes "[Markie]";
+ mes "Okay honey.... looks good, I'll accept your application.";
+ mes "Now that that's been taken care of, how about I conduct a short interview with you?";
+ next;
+ mes "[Markie]";
+ mes "Oh, you don't have to be nervous about it sweetie.... I'm just want to find out how much you know about Rogues.";
+ mes "I do this with all of the Rogue candidates. Shall we begin?";
+ next;
+ menu "Ok.",L_Test1, "Hold on... I need some time.",-;
+
+ mes "[Markie]";
+ mes "Okay honey, just take your time. When you're ready come back.";
+ close;
+
+
+//=================================================================
+L_Test1:
+//=======
+ mes "[Markie]";
+ mes "I am going to ask you a few questions. Listen carefully and choose what you think is the best answer okay?";
+ next;
+
+ savepoint "in_rogue.gat",366,114;
+ set @score, 0;
+ set ROGUE_Q, 1;
+ if(rand(2)) goto L_QSet2;
+
+ mes "[Markie]";
+ mes "1) What is the added flee rate that a Thief recieves when the ^5533FFImprove Dodge^000000 skill is ^5533FFmastered^000000?";
+ next;
+ menu "20",sM1_1, "30",-, "40",sM1_1, "160",sM1_1;
+
+ set @score, @score + 10;
+
+ sM1_1:
+
+ mes "[Markie]";
+ mes "2) Choose a monster that cannot detect a hidden or cloaked character?";
+ next;
+ menu "Mummy",sM1_2, "Worm Tail",-, "Argos",sM1_2, "Soldier Skeleton",sM1_2;
+
+ set @score, @score + 10;
+
+ sM1_2:
+
+ mes "[Markie]";
+ mes "3) Where is the Rogue guild located?";
+ next;
+ menu "Comodo",sM1_3, "Kokomo Beach",sM1_3, "Pharos Lightouse",-, "Morroc",sM1_3;
+
+ set @score, @score + 10;
+
+ sM1_3:
+
+ mes "[Markie]";
+ mes "4) In which of the following towns, can you become a Thief?";
+ next;
+ menu "Comodo",sM1_4, "Lutie",sM1_4, "Alberta",sM1_4, "Morroc",-;
+
+ set @score, @score + 10;
+
+ sM1_4:
+
+ mes "[Markie]";
+ mes "5) Choose the card that does ^FF3355not^000000 have an effect on a players ^5533FFDEX stat^000000...";
+ next;
+ menu "Rocker Card",sM1_5, "Mummy Card",-, "Zerom Card",sM1_5, "Drops",sM1_5;
+
+ set @score, @score + 10;
+
+ sM1_5:
+
+ mes "[Markie]";
+ mes "6) What do you think is cool about being a Rogue?";
+ next;
+ menu "Being a bad ass",sM1_6, "Being a hypocrite",sM1_6, "Being shameless",sM1_6, "Having excellent attack strength",-;
+
+ set @score, @score + 10;
+
+ sM1_6:
+
+ mes "[Markie]";
+ mes "7) At what job level can you change from a Thief to a Rogue?";
+ next;
+ menu "At job lvl 30",sM1_7, "At job lvl 35",sM1_7, "At job lvl 40",-, "At job lvl 50",-;
+
+ set @score, @score + 10;
+
+ sM1_7:
+
+ mes "[Markie]";
+ mes "8) If you wanted to dye your hair a different color, where would you have to go to do that?";
+ next;
+ menu "Building in SouthWestern part of Morroc",sM1_8, "Building in SouthWestern part of Prontera",-,
+ "Building in SouthEastern part of Morroc",sM1_8, "Building in NorthEastern part of Prontera",sM1_8;
+
+ set @score, @score + 10;
+
+ sM1_8:
+
+ mes "[Markie]";
+ mes "9) What mushrooms do you need to steal in order to become a Thief?";
+ next;
+ menu "Orange Gooey Mushrooms",-, "Red Hairy Mushrooms",sM1_9, "Orange Net Mushrooms",-, "Orange Sticky Mushrooms",sM1_9;
+
+ set @score, @score + 10;
+
+ sM1_9:
+
+ mes "[Markie]";
+ mes "10) Which of these cards is ^FF3355useless^000000 to a Rogue?";
+ next;
+ menu "Whisper Card",sM1_10, "Elder Willow Card",-, "Zerom Card",sM1_10, "Matyr Card",sM1_10;
+
+ set @score, @score + 10;
+
+ sM1_10:
+ goto L_Score;
+
+
+ L_QSet2:
+ mes "[Markie]";
+ mes "1) What skill do you need to learn before you can learn ^5533FFTunnel Drive^000000?";
+ next;
+ menu "Hiding",-, "Steal",sM2_1, "Improve Dodge",sM2_1, "Bash",sM2_1;
+
+ set @score, @score + 10;
+
+ sM2_1:
+
+ mes "[Markie]";
+ mes "2) How much more of a discount can a Rogue get with the ^5533FFHaggel^000000 skill than a merchant can with the ^5533FFDiscount^000000 skill?";
+ next;
+ menu "3%",sM2_2, "2%",sM2_2, "1%",-, "0%",sM2_2;
+
+ set @score, @score + 10;
+
+ sM2_2:
+
+ mes "[Markie]";
+ mes "3) What is the correct description for the skill ^5533FFMug^000000?";
+ next;
+ menu "Steal Items from players",sM2_3, "Steal Items from monsters",sM2_3, "Steal Zeny from monsters",-, "Steal Zeny from players",sM2_3;
+
+ set @score, @score + 10;
+
+ sM2_3:
+
+ mes "[Markie]";
+ mes "4) How many Rogues are required to activate the skill ^5533FFGangster's Paradise^000000?";
+ next;
+ menu "1 Rogue + 2 Assassins",sM2_4, "2 Rogues + 1 Thief",sM2_4, "4 Thieves",sM2_4, "2 or more Rogues",-;
+
+ set @score, @score + 10;
+
+ sM2_4:
+
+ mes "[Markie]";
+ mes "5) After increasing ^5533FFDivest Helm^000000 to level 5, what other skill becomes available for you learn?";
+ next;
+ menu "Envenom",sM2_5, "Strip Tease",sM2_5, "Venom Splasher",sM2_5, "Divest Shield",-;
+
+ set @score, @score + 10;
+
+ sM2_5:
+
+ mes "[Markie]";
+ mes "6) Choose a skill that allows its user to move while being hidden?";
+ next;
+ menu "Hiding",sM2_6, "Back Slide",sM2_6, "Tunnel Drive",-, "Sand Attack",sM2_6;
+
+ set @score, @score + 10;
+
+ sM2_6:
+
+ mes "[Markie]";
+ mes "7) Choose the card that increases the ^5533FFaccuracy rate^000000 of its owner?";
+ next;
+ menu "Andre",sM2_7, "Familiar",sM2_7, "Mummy",-, "Marina",sM2_7;
+
+ set @score, @score + 10;
+
+ sM2_7:
+
+ mes "[Markie]";
+ mes "8) Choose the monster that receives more damage when attacked by a weapon with a Vadon card attached to it?";
+ mes "(Vadon card inflicts 20% more damage to fire property monsters)";
+ next;
+ menu "Vadon",sM2_8, "Deviruchi",sM2_8, "Elder Willow",-, "Baphomet",sM2_8;
+
+ set @score, @score + 10;
+
+ sM2_8:
+
+ mes "[Markie]";
+ mes "9) How much SP does the ^5533FFDouble Attack^000000 skill require when used with a dagger?";
+ next;
+ menu "15 SP",sM2_9, "No SP needed",-, "10 SP",sM2_9, "54 SP",sM2_9;
+
+ set @score, @score + 10;
+
+ sM2_9:
+
+ mes "[Markie]";
+ mes "10) Choose an effective dagger to use in the Byalan Dungeon?";
+ next;
+ menu "Wind Main-Gauche",-, "Ice Main-Gauche",sM2_10, "Earth Main-Gauche",sM2_10, "Fire Main-Gauche",sM2_10;
+
+ set @score, @score + 10;
+
+ sM2_10:
+
+
+ L_Score:
+ mes "[Markie]";
+ mes "Okay, those are all of the questions I have. Now that wasn't so bad was it sweetie?";
+ mes "I hope you don't mind, but I've been grading your answers.";
+ next;
+ mes "[Markie]";
+ mes "I like to give people scores on their interviews so that they can know how well they did.";
+ mes "It looks like you got a ^FF3355" + @score +"^000000/100............";
+ next;
+ mes "[Markie]";
+
+ if(@score< 90) goto sL_Failed;
+ if(@score<100) goto sL_Passed;
+
+ sL_Perfect:
+ mes "A perfect score! I knew you had what it takes to be a Rogue.....";
+ mes "But don't get ahead of yourself honey cause there is still plenty more.....";
+ next;
+ mes "[Markie]";
+ set ROGUE_Q, 2;
+ goto L_Test2;
+
+ sL_Passed:
+ mes "Good, good. You did a good job shuga. But there is still more so don't get excited just yet.....";
+ next;
+ mes "[Markie]";
+ set ROGUE_Q, 2;
+ goto L_Test2;
+ return;
+
+ sL_Failed:
+ mes "*sigh*..... this is not the type of score I was expecting......";
+ mes "What can I say excecpt, with a score like this you're definitely not cut out to be a Rogue..........";
+ emotion e_swt;
+ next;
+ mes "[Markie]";
+ mes "Why don't you go do some more training shuga..... you need it..... *mumbles ( what a waste of my time...)*";
+ close;
+
+L_ReTest:
+ mes "You again? Are you sure you're ready this time?...... Okay honey, just relax....";
+ next;
+ goto L_Test1;
+
+L_Test2:
+ mes "Your second test will be given by ^5533FFMr. Smith^000000.";
+ mes "I have to warn you though, Mr. Smith can be difficult and hard to please. So be careful how you act around him.";
+ close;
+L_Test3:
+ mes "I know those guys are hard to find. Just be patient and keep on searching. Make sure you have the correct password as well..";
+ close;
+L_Test4:
+ mes "What are you doing here? I hope your not trying to skip the last test?.........";
+ emotion e_what;
+ next;
+ mes "[Markie]";
+ mes "Your almost finished so just keep trying. I know you can do it.";
+ close;
+
+
+//=======================================================================
+L_Change:
+//===========
+ mes "Oh, you're back and your in one piece! It looks like you've passed all of the tests sweetie.";
+ mes "You have proven that you are ready to become a Rogue!";
+ emotion e_ic;
+ next;
+ if(SkillPoint != 0) goto L_SkillP;
+ mes "[Markie]";
+ mes "Tada! Congratulations on becoming a Rogue. You showed a lot of effort and deserve a reward for it......";
+ setlook 7,0;
+ callfunc "Job_Change",Job_Rogue;
+ emotion e_grat;
+ next;
+ mes "[Markie]";
+ mes "Now that you are a Rogue you are free to go where ever you want to and do what ever you want.";
+ if(JBLVL != 50) {
+ getitem 1219,1; // 2 slott gladius
+ } else {
+ getitem 1220,1; // 3 slott gladius
+ }
+ callfunc "F_ClearJobVar";
+ next;
+ mes "[Markie]";
+ mes "Just keep in mind that freedom requires responsibility. Treat people the way you expect to be treated.";
+ next;
+ mes "[Markie]";
+ mes "Have fun shuga! See ya around!";
+ close;
+
+//=======================================================================
+L_SkillP:
+//===========
+ mes "[Markie]";
+ mes "Oh but one thing honey... you have leftover skill points!";
+ mes "Finish them first and come back, 'kay?";
+ close;
+}
+
+
+
+//=======================================================================================================//
+// Mr. Smith: Tests 2 and 3 //
+//***********************************************************************************************************************************************************//
+in_rogue.gat,376,23,3 script Mr. Smith 57,{
+
+ mes "[Mr. Smith]";
+ if(BaseJob == Job_Thief) goto L_Thief;
+ if(BaseJob == Job_Rogue) goto L_Rogue;
+
+L_OtherJob:
+ mes "Go away! I'm busy.....";
+ close;
+L_Rogue:
+ mes "Looking good there my Rogue friend";
+ close;
+L_Thief:
+ if(ROGUE_Q == 2) goto L_Test2;
+ if(ROGUE_Q == 3) goto L_Test3;
+ if(ROGUE_Q > 3) goto L_Done;
+ mes "Ok ok.... one... two.... three.... Where do you do you business... is it.... Morroc... Geffen.... Comodo??.......";
+ next;
+ mes "[Mr. Smith]";
+ mes "Uhh..... this is giving me a headache.......";
+ next;
+ mes "[Mr. Smith]";
+ mes "Huh? Who are you? If you want to become a rogue go talk to ^5533FFMarkie^000000....";
+ next;
+ mes "[Mr. Smith]";
+ mes "...... CRAP! I forgot what I was counting!!";
+ emotion e_wah;
+ close;
+
+//----------------------------------------------------------------------------------------------------
+L_Test2:
+//--------------
+ if(ROGUE_Q2 > 0) goto L_Check2;
+ mes "So you're here to take the second test.... good.......";
+ next;
+ mes "[Mr. Smith]";
+ mes "Before we get started, let me tell you about the test application fee.";
+ mes "Our guild is involved in alot of business *cough* 'transactions' *cough* and therefore we are in constant needs of funds.";
+ next;
+ mes "[Mr. Smith]";
+ mes "This is why we require a fee of ^5533FF10,000 zeny^000000 to be paid when taking the Rogue tests.";
+ mes "The fee will be collected when you have completed this second test so don't have to worry if you don't have it now.";
+ next;
+ mes "[Mr. Smith]";
+ mes "Now for your test..... You will be required to collect the following items:";
+ next;
+ mes "[Mr. Smith]";
+ set ROGUE_Q2, rand(1,3);
+ if(ROGUE_Q2 == 1) callsub sF2_R1;
+ if(ROGUE_Q2 == 2) callsub sF2_R2;
+ if(ROGUE_Q2 == 3) callsub sF2_R3;
+ next;
+ mes "[Mr. Smith]";
+ mes "Once you have ALL of these items and 10,000 zeny, come back and see me okay? Good.";
+ close;
+
+ sF2_R1:
+ mes "^5533FF6 Blue Herbs,";
+ mes "10 Skel Bones,";
+ mes "10 Decayed Nails,";
+ mes "10 Horrendous Mouths^000000.";
+ return;
+ sF2_R2:
+ mes "^5533FF10 Green Herbs,";
+ mes "10 Garlets,";
+ mes "10 Snake Scales";
+ mes "10 Crab Shells.^000000";
+ return;
+ sF2_R3:
+ mes "^5533FF10 Yellow Herbs,";
+ mes "10 Bear's Footskin,";
+ mes "10 Shells";
+ mes "10 Grasshopper's Legs^000000.";
+ return;
+
+L_Check2:
+ set @count, 0;
+ if(ROGUE_Q2 == 2) goto L_2;
+ if(ROGUE_Q2 == 3) goto L_3;
+
+ L_1:
+ set @R, 1;
+ if(countitem(510)<6 || countitem(932)<10 || countitem(957)<10 || countitem(958)<10 || Zeny < 10000) goto L_NotEnuf;
+ delitem 510,6;
+ delitem 932,10;
+ delitem 957,10;
+ delitem 958,10;
+ goto L_Done2;
+
+ L_2:
+ set @R, 2;
+ if(countitem(511)<10 || countitem(910)<10 || countitem(926)<10 || countitem(964)<10 || Zeny < 10000) goto L_NotEnuf;
+ delitem 511,10;
+ delitem 910,10;
+ delitem 926,10;
+ delitem 964,10;
+ goto L_Done2;
+
+ L_3:
+ set @R, 3;
+ if(countitem(508)<10 || countitem(948)<10 || countitem(935)<10 || countitem(940)<10 || Zeny < 10000) goto L_NotEnuf;
+ delitem 508,10;
+ delitem 948,10;
+ delitem 935,10;
+ delitem 940,10;
+
+ L_Done2:
+ mes "Let's see here.... application fee.... check..... items....... check...... Alright, everything looks in order. You've passed the second test.";
+ next;
+ mes "[Mr. Smith]";
+ mes "When you are ready to take the next test let me know.";
+ set Zeny, Zeny - 10000;
+ set ROGUE_Q, 3;
+ set ROGUE_Q2, 0;
+ close;
+
+ L_NotEnuf:
+ mes ".... What the f@&#!?!? You don't have all of the items? Then why did you come back?? Don't tell me you forgot what to get.....";
+ emotion e_what;
+ next;
+ mes "[Mr. Smith]";
+ mes "Write this down! You need ^5533FF10,000^000000 zeny and:";
+ if(ROGUE_Q2 == 1) callsub sF2_R1;
+ if(ROGUE_Q2 == 2) callsub sF2_R2;
+ if(ROGUE_Q2 == 3) callsub sF2_R3;
+ next;
+ mes "[Mr. Smith]";
+ mes "Got it? DON'T come back until you have everything.........";
+ emotion e_pif;
+ close;
+
+
+//----------------------------------------------------------------------------------------------
+L_Test3:
+//---------------
+ if(ROGUE_Q2 > 0) goto L_Check3;
+ mes "Let me see..... Who should I have you go find........ hmm.........";
+ emotion e_hmm;
+ next;
+ mes "[Mr. Smith]";
+ mes "Ah I know! Alright, in the previous test I had you go find some items. For this test you will need to find a specific person.";
+ emotion e_ic;
+ next;
+ mes "[Mr. Smith]";
+ set ROGUE_Q2, rand(1,3);
+ if(ROGUE_Q2 == 1) callsub sF3_R1;
+ if(ROGUE_Q2 == 2) callsub sF3_R2;
+ if(ROGUE_Q2 == 3) callsub sF3_R3;
+ next;
+ mes "[Mr. Smith]";
+ mes "Good luck to you. Try to finish this test as soon as possible. Getting things done quickly is one of a Rogue's traits.";
+ close;
+
+ sF3_R1:
+ mes "You will have to go and find ^5533FFAragham Junior^000000.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He lives in a little house somewhere ^5533FFSouthWest^000000 of the Fortress of Sandarman.";
+ mes "That area is located ^5533FFone map East^000000 from here and is on the ^000000SouthWestern land mass^000000.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
+ mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
+ next;
+ mes "[Mr. Smith]";
+ mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
+ mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
+ next;
+ mes "[Mr. Smith]";
+ mes "That's why you will need this password in order to talk to him.";
+ mes "The password is: '^5533FFAragham never hoarded upgrade items.^000000'";
+ return;
+ sF3_R2:
+ mes "You will have to go and find ^5533FFHollgrehen Junior^000000.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He lives in a little house somewhere ^5533FFSouthEast^000000 of the Fortress of Sandarman.";
+ mes "That area is located ^5533FFone map East^000000 from here and is on the ^5533FFEastern land mass^000000.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
+ mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
+ next;
+ mes "[Mr. Smith]";
+ mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
+ mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
+ next;
+ mes "[Mr. Smith]";
+ mes "That's why you will need this password in order to talk to him.";
+ mes "The password is: '^5533FFMy Father never hoarded upgrade items.^000000'";
+ return;
+ sF3_R3:
+ mes "You will have to go and find ^5533FFAntonio Junior.^000000.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He lives in a little hut somewhere on the ^5533FFEastern end of Kokomo Beach^000000.";
+ mes "That area is located ^5533FF1 map North, and 1 map West^000000 from here.";
+ next;
+ mes "[Mr. Smith]";
+ mes "He's a really nice guy who works real hard and is very good at collecting unpaid debts.";
+ mes "Unfortunately people were trying to kill him because of something his father had done in the past.";
+ next;
+ mes "[Mr. Smith]";
+ mes "When he joined the Rogue guild, he decided he was going to keep low which is why he's in his current hiding place.";
+ mes "No one is supposed to know where he is except for those of us at the Rogue Guild.";
+ next;
+ mes "[Mr. Smith]";
+ mes "That's why you will need this password in order to talk to him.";
+ mes "The password is: '^5533FFAntonio doesn't like breaking refining material.^000000'";
+ return;
+
+
+L_Check3:
+ mes "What!?! Did you just say you forgot where to go?........";
+ emotion e_what;
+ next;
+ mes "[Mr. Smith]";
+ mes "GRRRR!!! That's why you need to WRITE down important things! Geez......";
+ emotion e_an;
+ next;
+ mes "[Mr. Smith]";
+ if(ROGUE_Q2 == 1) callsub sF3_R1;
+ if(ROGUE_Q2 == 2) callsub sF3_R2;
+ if(ROGUE_Q2 == 3) callsub sF3_R3;
+ close;
+
+//-------------------------------------------------------------------------------------------------
+L_Done:
+//----------------
+ mes "I have no more busisness with you.........";
+ close;
+}
+
+
+//===========================================================
+// Guildsman that need to be found
+//===========================================================
+
+//------------------------------------------------------------------------------
+in_rogue.gat,272,136,3 script Hermanthorn Jr. 85,{
+ mes "[Hermanthorn Jr.]";
+ mes "Huh? Wha.... who are you?! You're not from the Rogue guild!! Get out of here!";
+ emotion e_what;
+ next;
+ mes "[Hermanthorn Jr.]";
+ mes "You're..... I see! You're one of them!!! You've come here to kill me haven't you??!! No... NO!! I'm not ready to die yet!";
+ emotion e_gasp;
+ next;
+ mes "[Hermanthorn Jr.]";
+ mes "Aaaaaaaaaaaaaahhhh!! Go away! Get lost! Otherwise I am gonna KILL YOU!!!";
+ emotion e_wah;
+ close;
+}
+
+// --------------------------------------------------------------------------
+cmd_fild09.gat,106,195,0 script Aragham Junior#01 45,1,1,{
+ callfunc "F_RogueTest3", 1, "Aragham", "never", "hoarded", "upgrade items.", 244, 24;
+}
+
+// -----------------------------------------------------------------------------
+cmd_fild09.gat,335,143,0 script Hollgrehen Junior#01 45,1,1,{
+ callfunc "F_RogueTest3", 2, "My father", "never", "hoarded", "upgrade items.", 168, 34;
+}
+
+// ------------------------------------------------------------------------------
+cmd_fild04.gat,304,179,0 script Antonio Junior#01 45,1,1,{
+ callfunc "F_RogueTest3", 3, "Antonio", "doesn't like", "breaking", "refining materials.", 165, 104;
+}
+
+// Function for Guildsman ===================================
+function script F_RogueTest3 {
+
+ mes "[???]";
+ mes "Who's there?!!!";
+ mes "Who dares to trespass on my territory?";
+ if(god_megin_2 > 0 && getarg(1) == "Aragham") goto L_Pass;
+ if(BaseJob != Job_Thief || ROGUE_Q<3 || ROGUE_Q2==0) close;
+L_Pass:
+ deletearray @choice$[1], 4;
+ next;
+ menu "My father",M_1a, "Aragham",M_1b, "Antonio",M_1c, "Legolas",M_1d;
+
+ M_1a:
+ set @choice$[1], "My father";
+ goto M_Menu2;
+ M_1b:
+ set @choice$[1], "Aragham";
+ goto M_Menu2;
+ M_1c:
+ set @choice$[1], "Antonio";
+ goto M_Menu2;
+ M_1d:
+ set @choice$[1], "Legolas";
+
+ M_Menu2:
+ callsub sF_Password;
+ menu "did not",M_2a, "doesn't like",M_2b, "never",M_2c, "ever",M_2d;
+
+ M_2a:
+ set @choice$[2], "did not";
+ goto M_Menu3;
+ M_2b:
+ set @choice$[2], "doesn't like";
+ goto M_Menu3;
+ M_2c:
+ set @choice$[2], "never";
+ goto M_Menu3;
+ M_2d:
+ set @choice$[2], "ever";
+
+ M_Menu3:
+ callsub sF_Password;
+ menu "hoard",M_3a, "hoarded",M_3b, "hide",M_3c, "took",M_3d, "breaking",M_3e;
+
+ M_3a:
+ set @choice$[3], "hoard";
+ goto M_Menu4;
+ M_3b:
+ set @choice$[3], "hoarded";
+ goto M_Menu4;
+ M_3c:
+ set @choice$[3], "hide";
+ goto M_Menu4;
+ M_3d:
+ set @choice$[3], "took";
+ goto M_Menu4;
+ M_3e:
+ set @choice$[3], "breaking";
+
+ M_Menu4:
+ callsub sF_Password;
+ menu "upgrade items.",M_4a, "forging items.",M_4b, "refining materials.",M_4c, "upgrade equipment.",M_4d;
+
+ M_4a:
+ set @choice$[4], "upgrade items.";
+ goto L_Check;
+ M_4b:
+ set @choice$[4], "forging items.";
+ goto L_Check;
+ M_4c:
+ set @choice$[4], "refining materials.";
+ goto L_Check;
+ M_4d:
+ set @choice$[4], "upgrade equipment.";
+
+L_Check:
+ callsub sF_Password;
+ if(god_megin_2 > 0) goto L_Enter;
+ if(ROGUE_Q2 != getarg(0)) goto L_Wrong;
+L_Enter:
+ if((@choice$[1] != getarg(1)) || (@choice$[2] != getarg(2)) || (@choice$[3] != getarg(3)) || (@choice$[4] != getarg(4))) goto L_Wrong;
+ mes "~ creeek ~";
+ mes "You hear the door begining to open........";
+ next;
+ deletearray @choice$[1], 4;
+ warp "in_rogue.gat", getarg(5), getarg(6);
+ end;
+
+ L_Wrong:
+ mes "[???]";
+ mes "Get lost!!";
+ close;
+sF_Password:
+ mes "[^5533FF" + strcharinfo(0) + "^000000]";
+ mes @choice$[1];
+ mes @choice$[2];
+ mes @choice$[3];
+ mes @choice$[4];
+ next;
+ return;
+}
+
+
+//=======================================================================================================//
+// Test 4: Last Test //
+//***********************************************************************************************************************************************************//
+// Other path
+// warp "in_rogue.gat", 11, 388;
+// 390,389 end warp
+// 9,9 -> 9,21
+//===============================================
+// Guildsman
+//===============================================
+//---------------------------------------------------------------------------
+in_rogue.gat,244,39,4 script Aragham Junior#02 99,{
+ callfunc "F_RogueTest4", 1, "Aragham Junior", 245, 27;
+}
+//---------------------------------------------------------------------------
+in_rogue.gat,152,27,6 script Hollgrehen Junior#02 85,{
+ callfunc "F_RogueTest4", 2, "Hollgrehen Junior", 160, 32;
+}
+//---------------------------------------------------------------------------
+in_rogue.gat,183,105,4 script Antonio Junior#02 88,{
+ callfunc "F_RogueTest4", 3, "Antonio Junior", 175, 107;
+}
+
+// Function for Guildsman =============================
+function script F_RogueTest4 {
+
+ if(BaseJob != Job_Thief || ROGUE_Q2 != getarg(0)) goto L_NoThief;
+ if(ROGUE_Q == 4) goto L_Restart;
+ mes "[" + getarg(1) + "]";
+ mes "Hello there... You must be from the Rogue guild. My name is " + getarg(1) + "...... I am the Rogue of the Desert..............";
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "Aww who am I kidding...... Let's cut the crap. So are you ready to become a rogue?";
+ emotion e_swt;
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "You see, the Rogue motto is...... ^5533FF'Avoid the strong! Be malicious to the weak!'^000000";
+ mes "This simple rule applys to fighting monsters as well.";
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "The very last thing you will have to do before you can become a Rogue, is to walk through an underground passage to the Rogue Guild.";
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "Sounds easy huh? Well it's not! But don't worry....";
+ mes "If you stay true to the Rogue motto and use a lot of hide, and do a lot of running, you should be just fine.";
+
+ M_Menu:
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "Ok, are you ready to go?";
+ next;
+ menu "As ready as I'll ever be.",-, "Actually I'm kinda scared...",M_End;
+
+ mes "[" + getarg(1) + "]";
+ mes "Good luck then.";
+ next;
+ set ROGUE_Q, 4;
+ killmonsterall "in_rogue.gat";
+ savepoint "in_rogue.gat", getarg(2), getarg(3);
+ warp "in_rogue.gat", 15, 105;
+ end;
+
+ M_End:
+ mes "[" + getarg(1) + "]";
+ mes ".....................";
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "Well take your time then...... I guess.......";
+ close;
+
+L_Restart:
+ mes "[" + getarg(1) + "]";
+ mes "....... Looks like you got creamed.......";
+ emotion e_swt;
+ next;
+ mes "[" + getarg(1) + "]";
+ mes "If you're up for it, I'll send you back in. Failure has a way of teaching success.... yada yada yada....";
+ percentheal 100,100;
+ goto M_Menu;
+
+L_NoThief:
+ mes "[" + getarg(1) +"]";
+ mes "I don't know how you got the";
+ if(ROGUE_Q2)
+ {
+ mes "pass, but I am not the one";
+ mes "in charge of your test.";
+ }
+ else
+ {
+ mes "pass, but looking at your face,";
+ mes "I guess you're not here for the";
+ mes "Rogue test.";
+ }
+ next;
+ mes "[" + getarg(1) +"]";
+ mes "Please hurry up and leave";
+ mes "this place as soon as you can!";
+ close;
+}
+
+//================================================
+// Monster Spawns
+//================================================
+in_rogue.gat,15,185,0 script rogue_mob1 139,8,0,{
+ monster "in_rogue.gat",14,188,"Zombie",1015,1;
+ monster "in_rogue.gat",15,188,"Zombie",1015,1;
+ monster "in_rogue.gat",16,188,"Zombie",1015,1;
+ monster "in_rogue.gat",14,189,"Zombie",1015,1;
+ monster "in_rogue.gat",15,189,"Zombie",1015,1;
+ monster "in_rogue.gat",16,189,"Zombie",1015,1;
+ end;
+}
+in_rogue.gat,15,245,0 script rogue_mob2 139,8,0,{
+ monster "in_rogue.gat",14,247,"Mummy",1041,1;
+ monster "in_rogue.gat",15,247,"Mummy",1041,1;
+ monster "in_rogue.gat",16,247,"Mummy",1041,1;
+ monster "in_rogue.gat",14,248,"Mummy",1041,1;
+ monster "in_rogue.gat",15,248,"Mummy",1041,1;
+ monster "in_rogue.gat",16,248,"Mummy",1041,1;
+ end;
+}
+in_rogue.gat,15,328,0 script rogue_mob3 139,8,0,{
+ monster "in_rogue.gat",14,331,"Zombie",1015,1;
+ monster "in_rogue.gat",15,331,"Zombie",1015,1;
+ monster "in_rogue.gat",16,331,"Zombie",1015,1;
+ monster "in_rogue.gat",14,332,"Zombie",1015,1;
+ monster "in_rogue.gat",15,332,"Zombie",1015,1;
+ monster "in_rogue.gat",16,332,"Zombie",1015,1;
+ end;
+}
+in_rogue.gat,35,342,0 script rogue_mob4 139,0,8,{
+ monster "in_rogue.gat",38,340,"Mummy",1041,1;
+ monster "in_rogue.gat",37,342,"Abyss Knight",1219,1;
+ monster "in_rogue.gat",39,342,"Ghoul",1036,1;
+ monster "in_rogue.gat",38,344,"Mummy",1041,1;
+ end;
+}
+in_rogue.gat,57,306,0 script rogue_mob5 139,4,0,{
+ monster "in_rogue.gat",59,301,"Khalitzburg",1132,1;
+ end;
+}
+in_rogue.gat,96,333,0 script rogue_mob6 139,0,4,{
+ monster "in_rogue.gat",92,325,"Khalitzburg",1132,1;
+ end;
+}
+in_rogue.gat,139,313,0 script rogue_mob7 139,4,0,{
+ monster "in_rogue.gat",139,309,"Abyss Knight",1219,1;
+ end;
+}
+in_rogue.gat,135,246,0 script rogue_mob8 139,0,4,{
+ monster "in_rogue.gat",139,245,"Zombie",1015,2;
+ monster "in_rogue.gat",139,246,"Zombie",1015,2;
+ monster "in_rogue.gat",139,247,"Zombie",1015,2;
+ end;
+}
+in_rogue.gat,62,302,0 script rogue_mob9 139,0,4,{
+ monster "in_rogue.gat",57,305,"Khalitzburg",1132,1;
+ end;
+}
+in_rogue.gat,199,218,0 script rogue_mob10 139,0,8,{
+ monster "in_rogue.gat",157,218,"Zombie",1015,10;
+ monster "in_rogue.gat",157,218,"Abyss Knight",1219,1;
+ monster "in_rogue.gat",157,218,"Ghoul",1036,1;
+ monster "in_rogue.gat",157,218,"Archer Skeleton",1016,1;
+ end;
+}
+in_rogue.gat,86,187,0 script rogue_mob11 139,0,8,{
+ monster "in_rogue.gat",88,186,"Mummy",1041,1;
+ monster "in_rogue.gat",88,187,"Mummy",1041,1;
+ monster "in_rogue.gat",88,188,"Mummy",1041,1;
+ end;
+}
+in_rogue.gat,225,187,0 script rogue_mob12 139,0,8,{
+ monster "in_rogue.gat",232,191,"Abyss Knight",1219,1;
+ monster "in_rogue.gat",233,190,"Abyss Knight",1219,1;
+ monster "in_rogue.gat",234,189,"Abyss Knight",1219,1;
+ end;
+}
+in_rogue.gat,252,320,0 script rogue_mob13 139,0,8,{
+ monster "in_rogue.gat",252,319,"Mummy",1041,1;
+ monster "in_rogue.gat",252,321,"Mummy",1041,1;
+ monster "in_rogue.gat",252,319,"Ghoul",1036,1;
+ monster "in_rogue.gat",252,321,"Ghoul",1036,1;
+ monster "in_rogue.gat",257,320,"Archer Skeleton",1016,1;
+ monster "in_rogue.gat",248,320,"Archer Skeleton",1016,1;
+ end;
+}
+
+//================================================
+// End Warp
+//================================================
+in_rogue.gat,370,320,0 script rogue04 45,1,1,{
+ set ROGUE_Q, 5;
+ killmonsterall "in_rogue.gat";
+ warp "in_rogue.gat",378,113;
+ end;
+}
+
+//================================================
+// Timer: Keeps monsters from overspawning
+//================================================
+- script RogueTest3 -1,{
+ end;
+
+OnMinute10:
+OnMinute20:
+OnMinute30:
+OnMinute40:
+OnMinute50:
+OnMinute60:
+ killmonsterall "in_rogue.gat";
+ end;
+}
+
+//==============================================================================
+// mapflag
+//==============================================================================
+in_rogue.gat mapflag nomemo
+in_rogue.gat mapflag noteleport
+in_rogue.gat mapflag nosave SavePoint
+in_rogue.gat mapflag nopenalty
+in_rogue.gat mapflag nobranch
+in_rogue.gat mapflag noexp
+in_rogue.gat mapflag noloot
diff --git a/npc/jobs/2-2/sage.txt b/npc/jobs/2-2/sage.txt
index 02fa8300f..7e2bfdd5e 100644
--- a/npc/jobs/2-2/sage.txt
+++ b/npc/jobs/2-2/sage.txt
@@ -1,2180 +1,2180 @@
-//===== eAthena Script =======================================
-//= Sage Job Quest
-//===== By: ==================================================
-//= jAthena (0.9) - I guess
-//= Unknown Translator (1.0)
-//= Darkchild (1.2)
-//===== Current Version: =====================================
-//= 2.0a
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Sage job quest based off of official servers.
-//===== Additional Comments: =================================
-//= Script mostly based on translated jA script
-//= Written test questions/answers weren't translated 100% corectly
-//= So a lot of those are based upon mRO site and my own info
-//= IF you by excident have (or can get) screenshots of these questions
-//= Then PLEASE send them to Darkchild
-//= 1.3 Baby class Support added [Lupus] 1.5 Fixed possible EXP abuse [Lupus]
-//= 1.6 Added a func which prevent advanced classes passing
-//= 2nd Job Quests again. It also guides adv classes where to go. [Lupus]
-//= 1.7 Fixed tuition fee. Fixed some answers, names & typos, added missing labels [Lupus]
-//= 1.7a Moved JFunc back in the main file, fixed typos [Lupus]
-//= 2.0 Changed numbers to constants. [Vicious]
-//= 2.0a Fixed double warp [KarLaeda]
-//============================================================
-
-
-//==================================
-//Sage Castle
-//==================================
-yuno_in02.gat,38,61,4 script Magic Academy Headmaster 743,{
- callfunc "F_BlockHigh",Job_Mage_High,"High Mage",Job_Professor,"Professor","Keiron";
- if(BaseJob == Job_Sage) goto L_Menu3_3;
- if(BaseJob != Job_Mage) goto L_Menu2_1;
- if(SAGE_Q == 11) goto L_Menu3_1;
- if(SAGE_Q >= 3) goto L_Menu2_2;
- mes "[Keiron]";
- mes "All who appreciate the fine art";
- mes "of magic are welcome here.";
- mes "How can I help you?";
- next;
- menu "Change class to Sage",L_Menu1_1,"About the Sage class",-,"Just looking around",L_Menu1_2;
- mes "[Keiron]";
- mes "So you're interested in being a Sage?";
- mes "Well, I can't just make you one straight away.";
- next;
- mes "[Keiron]";
- mes "In order to become a Sage, you'll need to file an application for entry into the Shubaichul Magic Academy and take the placement test.";
- next;
- mes "[Keiron]";
- mes "Once you're placed, you'll need to complete coursework and finally write and defend a thesis.";
- next;
- mes "[Keiron]";
- mes "If you successfully complete the requirements, you'll be granted a Sage license.";
- next;
- mes "[Keiron]";
- mes "If you wish to apply, go see Mathias in the Shubaichul Magic Academy.";
- mes "Tell him I sent you.";
- close;
-L_Menu1_1:
- mes "[Keiron]";
- mes "A Sage?";
- mes "Well...";
- mes "In order to change you way of living, you have to change your way of thinking.";
- next;
- mes "[Keiron]";
- mes "Sages actively contribute knowledge to the kingdom through rigorous research.";
- mes "They also help society through its worst problems.";
- mes "Just because you dress as a Sage doesn't mean you're a Sage.";
- next;
- mes "[Keiron]";
- mes "To become a Sage, please apply for entry into the Shubaichul Magic Academy.";
- mes "The admissions officer will explain the educational requirements.";
- close;
-L_Menu1_2:
- mes "[Keiron]";
- mes "Excellent. If you have some free time, why not peruse a a volume from our library?";
- mes "Our library is truly a bastion of knowledge.";
- next;
- mes "[Keiron]";
- mes "Of course, there is much that can't be learned from reading books, but it's a good start.";
- close;
-L_Menu2_1:
- mes "[Keiron]";
- mes "We Sages do a lot of research about the world on our own,";
- mes "but to maximize our knowledge,";
- mes "we regularly form interdisciplinary research teams.";
- next;
- mes "[Keiron]";
- mes "You should talk to our Sages and share any research you may have been doing within your own profession.";
- close;
-L_Menu2_2:
- mes "[Keiron]";
- mes "The road to becoming a Sage isn't easy.";
- mes "You need to have a strong dedication to mastering magic.";
- next;
- mes "[Keiron]";
- mes "You need to keep plugging away at that thesis.";
- mes "Good luck!";
- close;
-L_Menu3_1:
- if(countitem(1550) >= 1) goto L_Menu3_2;
- mes "[Keiron]";
- mes "Where's your thesis?";
- mes "I'm eager to evaulate it.";
- next;
- mes "[Keiron]";
- mes "Did you forget it?";
- mes "In any case, please bring it post-haste.";
- close;
-L_Menu3_2:
- mes "[Keiron]";
- mes "It looks like you have a thesis to present. Let's have a look...";
- next;
- mes "[Keiron]";
- mes "Hmmm...";
- next;
- mes "[Keiron]";
- mes "Yes....";
- next;
- mes "[Keiron]";
- mes "Interesting...";
- next;
- mes "[Keiron]";
- mes "It's not stylistically";
- mes "cohesive, but your zeal for research is amply proven by your thesis. I approve.";
- next;
- if(SkillPoint == 0) goto LCHANGE;
- mes "[Keiron]";
- mes "Well you are all set for the jobchange except for 1 thing!";
- mes "You have unused Skill Points!!!";
- mes "Please use those first!";
- close;
-
- LCHANGE:
- callfunc "Job_Change",Job_Sage;
- callfunc "F_ClearJobVar";
- mes "[Keiron]";
- mes "Congratulations!";
- mes "You're a Sage now.";
- mes "Don't let that passion for research ever be dampened.";
- next;
- mes "[Keiron]";
- mes "Keep your thesis around, since it may be useful in a publish-or-perish environment later on.";
- next;
- mes "[Keiron]";
- mes "Some day, you'll be a bastion of knowledge all by yourself!";
- close;
-L_Menu3_3:
- mes "[Keiron]";
- mes "Hmmm? What's up?";
- mes "Just because you're a Sage doesn't mean you should quit your studies.";
- next;
- mes "[Keiron]";
- mes "In order to maintain our role as the kingdom's gatherers and dissemenators of knowledge, we can never miss an opportunity to gather data.";
- close;
-}
-
-//===============================
-//Biotech Lab
-//===============================
-yuno_in03.gat,244,31,3 script Physics Professor 120,{
- if(BaseJob == Job_Sage) goto L_Menu3_2;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 11) goto L_Menu3_1;
- if(SAGE_Q2 == 8) goto L_Menu2_1;
- if(SAGE_Q2 == 9) goto L_Menu2_3;
- if(SAGE_Q2 == 10) goto L_Menu2_5;
- if(SAGE_Q2 == 11) goto L_ThesisStart1;
- if(SAGE_Q == 9) goto L_Menu1_2;
- mes "[Ebeshi]";
- mes "What?";
- next;
- mes "[Ebeshi]";
- mes "Did you come to study under my guidance?";
- next;
- mes "[Ebeshi]";
- mes "Well, you need to enroll first.";
- mes "Heheheheh...";
- close;
-L_Menu1_1:
- mes "[Ebeshi]";
- mes "Eh???????????????????????????????";
- next;
- mes "[Ebeshi]";
- mes "I don't think there's anything someone like you can learn from me.";
- next;
- mes "[Ebeshi]";
- mes "Are you disappointed?";
- mes "Hehehehe....";
- close;
-L_Menu1_2:
- set SAGE_Q2,8;
- mes "[Ebeshi]";
- mes "Well, I'm glad to meet another fine student such as yourself.";
- next;
- mes "[Ebeshi]";
- mes "Aren't you excited that you're going to study under me?!";
- mes "Hehehehe....";
- next;
- mes "[Ebeshi]";
- mes "I hate to be intrusive, but could you get something for me before I start my class?";
- next;
- mes "[Ebeshi]";
- mes "I need ^3051FD30x Stone^000000 as part of the class materials.";
- mes "Can you get that?";
- next;
- mes "[Ebeshi]";
- mes "If you really want to get stones quick,";
- mes "you should look up a friendly thief to assist you! Thanks for helping out.";
- close;
-L_Menu2_1:
- if(countitem(7049) >= 30) goto L_Menu2_2;
- mes "[Ebeshi]";
- mes "Hey, what are you up to?";
- mes "Are you trying to slack off?";
- mes "Come on, set your eyes on the goal.";
- next;
- mes "[Ebeshi]";
- mes "I need ^3051FD30x Stone^000000 to proceed.";
- mes "With all the stones lying around,";
- mes "shouldn't they be easy to find?";
- close;
- L_Menu2_2:
- mes "[Ebeshi]";
- mes "Awesome! You've got all the stones I need.";
- mes "Now, watch this!";
- next;
- mes "[Ebeshi]";
- mes "Abracadabra!!";
- next;
- mes "[Ebeshi]";
- mes "Abracadabra!!";
- next;
- mes "[Ebeshi]";
- mes "Abracadabra!!";
- next;
- delitem 7049,30;
- set SAGE_Q2,9;
- mes "[Ebeshi]";
- mes "You see that?";
- mes "I created three elemental stones!";
- next;
- mes "[Ebeshi]";
- mes "Pretty cool, don't you think?";
- mes "Have them for yourself!";
- next;
- getitem 991,1;
- getitem 993,1;
- getitem 992,1;
- mes "[Ebeshi]";
- mes "Now, for your next lesson, you need to synthesize some different kinds of arrows with those stones.";
- next;
- mes "[Ebeshi]";
- mes "Specifically...";
- mes "^3051FD50x Crystal Arrow^000000";
- mes "^3051FD50x Stone Arrow^000000";
- mes "^3051FD50x Wind Arrow^000000";
- next;
- mes "[Ebeshi]";
- mes "An archer friend can help you make the arrows.";
- mes "Give it a try!";
- close;
- L_Menu2_3:
- if((countitem(1754) >= 50) && (countitem(1756) >= 50) && (countitem(1755) >= 50)) goto L_Menu2_4;
- mes "[Ebeshi]";
- mes "Hmmm?";
- mes "What did you do with those stones I gave you?";
- mes "You didn't sell them, I hope...";
- next;
- mes "[Ebeshi]";
- mes "You need to use them to make";
- mes "^3051FD50x Crystal Arrow^000000";
- mes "^3051FD50x Stone Arrow^000000";
- mes "^3051FD50x Wind Arrow^000000";
- mes "An archer friend can help you make the arrows.";
- close;
- L_Menu2_4:
- mes "[Ebeshi]";
- mes "You made the arrows! Good job.";
- mes "Now, to continue with the lesson...";
- next;
- mes "[Ebeshi]";
- mes "This lesson covers the Elemental Affinity chapter in your textbook.";
- next;
- mes "[Ebeshi]";
- mes "The first affinity is really easy.";
- mes "Water magic is very effective against fire.";
- mes "It's easy to remember.";
- mes "All you need to remember is water being splashed on fire.";
- next;
- mes "[Ebeshi]";
- mes "Wind magic will decimate water-based monsters.";
- mes "Observe what happens when a lake is struck by lightning.";
- next;
- mes "[Ebeshi]";
- mes "Earth magic will crush wind-based monsters easily.";
- mes "Don't you build a house on a strong foundation to keep the wind away?";
- next;
- mes "[Ebeshi]";
- mes "Fire magic mercilessly scorches the earth.";
- mes "Won't a tree burn if a fire breaks out?";
- mes "Same with an earth-based monster.";
- next;
- mes "[Ebeshi]";
- mes "Do you understand?";
- mes "Here's some homework for next time...";
- next;
- delitem 1754,50;
- delitem 1756,50;
- delitem 1755,50;
- set SAGE_Q2,10;
- mes "[Ebeshi]";
- mes "Next time you come, bring ^3051FD1x Holy Water^000000.";
- mes "We'll need it for the lesson.";
- mes "It will be easy to acquire if you have contacts in the church.";
- close;
- L_Menu2_5:
- if(countitem(523) >= 1) goto L_Menu2_6;
- mes "[Ebeshi]";
- mes "Ooops!";
- mes "Did you forget about the item I asked you to bring?";
- next;
- mes "[Ebeshi]";
- mes "I need ^3051FD1x Holy Water^000000 for the lesson.";
- mes "Ask an Acolyte to help you make it.";
- mes "Hehehehe...";
- close;
- L_Menu2_6:
- mes "[Ebeshi]";
- mes "Alright, you have the Holy Water!";
- mes "Let's continue the lesson!";
- next;
- mes "[Ebeshi]";
- mes "Please take good notes about this part.";
- mes "It will be on the test.";
- next;
- mes "[Ebeshi]";
- mes "Water magic sucks against wind!";
- mes "Would a lightning bolt care if it was frozen?";
- mes "Heheheheh....";
- next;
- mes "[Ebeshi]";
- mes "Wind magic is totally useless against the earth.";
- mes "Will a tree suffer permanent damage if it's blown about?";
- next;
- mes "[Ebeshi]";
- mes "Earth magic is ineffective against fire.";
- mes "If you put some leaves on a fire, will the fire go out?";
- mes "No, just the opposite will happen.";
- next;
- mes "[Ebeshi]";
- mes "Fire won't do much against water.";
- mes "If you heat water, doesn't it just become more dangerous?";
- next;
- mes "[Ebeshi]";
- mes "That was a pretty informative lecture!";
- mes "You think so too, right?";
- next;
- delitem 523,1;
- set SAGE_Q2,11;
- mes "[Ebeshi]";
- mes "Now, you have enough knowledge to prepare a defensible thesis.";
- mes "Hehehehehe!";
- next;
- mes "[Ebeshi]";
- mes "To put the thesis together, you'll need:";
- mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
- mes "^3051FD1x Animal Skin^000000 for the pages.";
- mes "^3051FD1x Trunk^000000 to bind the pages.";
- mes "^3051FD1x Squid Ink^000000 for your ink.";
- mes "^3051FD1x Empty Bottle^000000 to store your ink.";
- next;
- mes "[Ebeshi]";
- mes "Come and see me once you've gotten all of these items together.";
- close;
- L_ThesisStart1:
- if((countitem(916) >= 1) && (countitem(919) >= 1) && (countitem(1019) >= 1) && (countitem(1024) >= 1) && (countitem(713) >= 1)) goto L_ThesisStart2;
- mes "[Ebeshi]";
- mes "Hmmm?";
- mes "You can't forget important things like this!";
- next;
- mes "[Ebeshi]";
- mes "You need these items to start your thesis:";
- mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
- mes "^3051FD1x Animal Skin^000000 for the pages.";
- mes "^3051FD1x Trunk^000000 to bind the pages.";
- mes "^3051FD1x Squid Ink^000000 for your ink.";
- mes "^3051FD1x Empty Bottle^000000 to store your ink.";
- next;
- mes "[Ebeshi]";
- mes "Do you have some friends that might be able to help you gather the materials?";
- mes "That will make it a simple task!";
- close;
- L_ThesisStart2:
- delitem 916,1;
- delitem 919,1;
- delitem 1019,1;
- delitem 1024,1;
- delitem 713,1;
- mes "[Ebeshi]";
- mes "Alright...";
- mes "You need to write this yourself.";
- mes "I'm simply your research advisor!";
- mes "Hehehehe...";
- next;
- mes "......";
- next;
- mes "......";
- next;
- mes "......";
- next;
- mes "Elemental magic is divided into four types...";
- menu "...called Fire, Wind, Water, and Earth",L_ThesisMenu1_1,"...named Fire, Wind, Water, and Earth",L_ThesisMenu1_2,"...that oppose each other Fire, Wind, Water, and Earth",L_ThesisMenu1_3;
- L_ThesisMenu1_1:
- mes "...called Fire, Wind, Water, and Earth";
- goto L_Thesis2;
- L_ThesisMenu1_2:
- mes "...named Fire, Wind, Water, and Earth";
- goto L_Thesis2;
- L_ThesisMenu1_3:
- mes "...that oppose each other: Fire, Wind, Water, and Earth";
- goto L_Thesis2;
- L_Thesis2:
- mes "Each attribute has certain properties.";
- menu "Wind conquers water...",L_ThesisMenu2_1,"Water douses fire...",L_ThesisMenu2_2,"Fire scorches Earth...",L_ThesisMenu2_3;
- L_ThesisMenu2_1:
- mes "Wind conquers Water and Earth attacks Wind";
- goto L_Thesis3;
- L_ThesisMenu2_2:
- mes "Water douses fire, while Wind zaps Water";
- goto L_Thesis3;
- L_ThesisMenu2_3:
- mes "Fire scorches Earth, and Water douses Fire.";
- goto L_Thesis3;
- L_Thesis3:
- menu "But weaknesses exist, too",L_ThesisMenu3_1,"You can customize your weapon element, also",L_ThesisMenu3_2,"Elemental affinity varies by monster type, also",L_ThesisMenu3_3;
- L_ThesisMenu3_1:
- mes "But weaknesses exist, too";
- goto L_Thesis4;
- L_ThesisMenu3_2:
- mes "You can customize your weapon element, also";
- goto L_Thesis4;
- L_ThesisMenu3_3:
- mes "Elemental affinity varies by monster type, also";
- goto L_Thesis4;
- L_Thesis4:
- menu "You need to be circumspect when facing monsters...",L_ThesisMenu4_1,"So, you should customize your weapon to the situation",L_ThesisMenu4_2,"Red Potions have a delicious strawberry flavor",L_ThesisMenu4_3;
- L_ThesisMenu4_1:
- mes "You need to be circumspect when facing monster with an unfamiliar affinity.";
- goto L_Thesis5;
- L_ThesisMenu4_2:
- mes "You should customize your weapon to the situation.";
- goto L_Thesis5;
- L_ThesisMenu4_3:
- mes "Red Potions have a delicious strawberry flavor.";
- goto L_Thesis5;
- L_Thesis5:
- next;
- menu "Eimi of Prontera is hot",L_ThesisMenu5_1,"I wonder how Red Potions are made",L_ThesisMenu5_2,"The complexity of magic exceeds man's capacity to learn",L_ThesisMenu5_3;
- L_ThesisMenu5_1:
- mes "Eimi of Prontera is hot.";
- goto L_Thesis6;
- L_ThesisMenu5_2:
- mes "I wonder how Red Potions are made.";
- goto L_Thesis6;
- L_ThesisMenu5_3:
- mes "The complexity of magic exceeds man's capacity to learn.";
- goto L_Thesis6;
- L_Thesis6:
- menu "The women in Morok are hot, too",L_ThesisMenu6_1,"Maybe it's a secret recipe",L_ThesisMenu6_2,"It's dangerous to depend on magic too much...",L_ThesisMenu6_3;
- L_ThesisMenu6_1:
- mes "The women in Morok are hot, too.";
- goto L_Thesis7;
- L_ThesisMenu6_2:
- mes "Maybe it's a secret recipe.";
- goto L_Thesis7;
- L_ThesisMenu6_3:
- mes "It's dangerous to depend on magic too much...";
- goto L_Thesis7;
- L_Thesis7:
- menu "I wish I had a Bunny Band",L_ThesisMenu7_1,"That taste of a White potion...",L_ThesisMenu7_2,"...if you want to stay safe. power...",L_ThesisMenu7_3;
- L_ThesisMenu7_1:
- mes "I wish I had a Bunny Band.";
- goto L_Thesis8;
- L_ThesisMenu7_2:
- mes "The taste of a White Potion...";
- goto L_Thesis8;
- L_ThesisMenu7_3:
- mes "...if you want to stay safe. power...";
- goto L_Thesis8;
- L_Thesis8:
- menu "That would make me happy",L_ThesisMenu8_1,"...is difficult to imagine",L_ThesisMenu8_2,"In the interest of a safe battle...",L_ThesisMenu8_3;
- L_ThesisMenu8_1:
- mes "That would make me happy.";
- goto L_Thesis9;
- L_ThesisMenu8_2:
- mes "...is difficult to imagine";
- goto L_Thesis9;
- L_ThesisMenu8_3:
- mes "In the interest of a safe battle...";
- goto L_Thesis9;
- L_Thesis9:
- menu "Bunny Bands make great Acolyte accessories",L_ThesisMenu9_1,"It makes me wonder if...",L_ThesisMenu9_2,"...you should bring along friends",L_ThesisMenu9_3;
- L_ThesisMenu9_1:
- mes "Bunny Bands make great Acolyte accessories.";
- goto L_Thesis10;
- L_ThesisMenu9_2:
- mes "It makes me wonder if...";
- goto L_Thesis10;
- L_ThesisMenu9_3:
- mes "...you should bring along friends.";
- goto L_Thesis10;
- L_Thesis10:
- menu "I wonder if a Knight could wear one, too",L_ThesisMenu10_1,"...people might drink them when they're not hurt",L_ThesisMenu10_2,"It's the responsible thing to do",L_ThesisMenu10_3;
- L_ThesisMenu10_1:
- mes "I wonder if a Knight could wear one, too.";
- next;
- goto L_ThesisEnd;
- L_ThesisMenu10_2:
- mes "...people might drink them when they're not hurt";
- next;
- goto L_ThesisEnd;
- L_ThesisMenu10_3:
- mes "It's the responsible thing to do.";
- next;
- goto L_ThesisEnd;
- L_ThesisEnd:
- mes "......";
- next;
- mes "......";
- next;
- mes "......";
- next;
- set SAGE_Q,11;
- getitem 1550,1;
- mes "[Ebeshi]";
- mes "Alright!";
- mes "You've finished! It looks pretty good!";
- next;
- mes "[Ebeshi]";
- mes "You should take that to the Headmaster!";
- mes "He'll decide whether you graduate or not.";
- mes "Hehehehehe....";
- close;
-L_Menu3_1:
- mes "[Ebeshi]";
- mes "What's up? Did you forget something?!";
- next;
- mes "[Ebeshi]";
- mes "You should see the Headmaster and present your thesis so you can graduate!";
- close;
-L_Menu3_2:
- mes "[Ebeshi]";
- mes "Good afternoon!";
- mes "It's good to meet other Sages and exchange information.";
- mes "Heheheheh!!";
- next;
- mes "[Ebeshi]";
- mes "Even though company is good sometimes, I need to continue my magical research!";
- next;
- mes "[Ebeshi]";
- mes "Do you want to continue your study here?";
- mes "Please feel free to talk to the other professors and read the literature here.";
- mes "Hehehehe!";
- close;
-}
-
-//==================================
-//Monster Museum
-//==================================
-
-yuno_in03.gat,32,102,0 script Biology Professor 755,{
- if(BaseJob == Job_Sage) goto L_Menu5_4;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 11) goto L_Menu5_3;
- if((SAGE_Q2 >= 1) && (SAGE_Q2 <= 3)) goto L_Menu3_1;
- if((SAGE_Q2 >= 4) && (SAGE_Q2 <= 6)) goto L_Menu4_1;
- if(SAGE_Q2 == 7) goto L_Menu5_1;
- if(SAGE_Q == 8) goto L_Menu2_1;
- mes "[Lucias]";
- mes "I have a headache...";
- mes "I've got too many things going on at once!";
- next;
- mes "[Lucias]";
- mes "Of course, I'll teach people about biology even with a headache!";
- close;
-L_Menu1_1:
- mes "[Lucias]";
- mes "Hmmm? Are you just poking around?";
- next;
- mes "[Lucias]";
- mes "That's fine, but please don't touch anything.";
- mes "We keep dangerous bioagents in here!";
- next;
- mes "[Lucias]";
- mes "If you have information about rare monsters, we'll pay you handsomely.";
- close;
-L_Menu2_1:
- mes "[Lucias]";
- mes "Oh, you've taken the placement test?";
- mes "I'm Lucias, a preeminent researcher in the biological sciences.";
- next;
- mes "[Lucias]";
- mes "What's your name, young one?";
- next;
- menu "I'm " + strcharinfo(0) + "!",-;
- mes "[Lucias]";
- mes "That's a nice name.";
- mes "Now, let me explain about our research objectives.";
- next;
- mes "[Lucias]";
- mes "My area of expertise is monsters.";
- mes "I'm sure that you've encountered and defeated many monsters by now.";
- mes "Am I right?";
- next;
- menu "You're quite right",-,"Well, not really...",L_Menu2_2;
- mes "[Lucias]";
- mes "Really?";
- mes "I hope your background knowledge is diverse.";
- mes "My class isn't a cakewalk by any means.";
- next;
- goto L_Menu2_3;
- L_Menu2_2:
-//==================================
-//If you respond negatively
- mes "[Lucias]";
- mes "You might be at a disadvantage.";
- mes "My coursework assumes a lot of background knowledge.";
- mes "My class wasn't designed to be a cakewalk...";
- next;
-//==================================
-L_Menu2_3:
- mes "[Lucias]";
- mes "So, shall we get started?";
- mes "You'll learn a lot in this class if you're vigilant.";
- next;
- set @sagerand,0;
- set @sagerand,rand(3);
- mes "[Lucias]";
- mes "So, first, you need to collect ";
- if(@sagerand == 1) goto L_Menu2_4;
- if(@sagerand == 2) goto L_Menu2_5;
- set SAGE_Q2,1;
- mes "^3051FD5x Tendons^000000";
- mes "^3051FD5x Nippers^000000";
- mes "^3051FD5x Sharp Scales^000000";
- next;
- goto L_Menu2_6;
- L_Menu2_4:
- set SAGE_Q2,2;
-//==================================
-//mes–¢‰ñŽû
- mes "^3051FD5x Clam Flesh^000000";
- mes "^3051FD5x Nippers^000000";
- mes "^3051FD5x Heart of Mermaid^000000";
- next;
- goto L_Menu2_6;
- L_Menu2_5:
- set SAGE_Q2,3;
- mes "^3051FD5x Single Cells^000000";
- mes "^3051FD5x Tentacles^000000";
- mes "^3051FD5x Fish Tails^000000";
-//==================================
- next;
- L_Menu2_6:
- mes "[Lucias]";
- mes "We'll continue once you've gathered those.";
- close;
-L_Menu3_1:
- if((countitem(1050) >= 5) && (countitem(960) >= 5) && (countitem(963) >= 5) && (SAGE_Q2 == 1)) goto L_Menu3_4;
- if((countitem(966) >= 5) && (countitem(960) >= 5) && (countitem(950) >= 5) && (SAGE_Q2 == 2)) goto L_Menu3_4;
- if((countitem(1052) >= 5) && (countitem(962) >= 5) && (countitem(1023) >= 5) && (SAGE_Q2 == 3)) goto L_Menu3_4;
- mes "[Lucias]";
- mes "You don't have the necessary items.";
- mes "Let me repeat what you need:";
- next;
- mes "[Lucias]";
- if(SAGE_Q2 == 2) goto L_Menu3_2;
- if(SAGE_Q2 == 3) goto L_Menu3_3;
- mes "^3051FD5x Tendon^000000";
- mes "^3051FD5x Nipper^000000";
- mes "^3051FD5x Sharp Scale^000000";
- close;
- L_Menu3_2:
- mes "^3051FD5x Clam Flesh^000000";
- mes "^3051FD5x Nipper^000000";
- mes "^3051FD5x Heart of Mermaid^000000";
- close;
- L_Menu3_3:
- mes "^3051FD5x Single Cell^000000";
- mes "^3051FD5x Tentacle^000000";
- mes "^3051FD5x Fish Tail^000000";
- close;
-L_Menu3_4:
- mes "[Lucias]";
- mes "Well, you have the items, but I can't be sure if you bought them or collected them yourself.";
- next;
- mes "[Lucias]";
- mes "There is a similarity in the characteristics of the monsters that drop those items.";
- mes "Do you know what it is?";
- next;
- menu "Water element affinity",L_Menu3_5,"They're fish and shells",L_Menu3_6,"They were quite active",-,"They're monsters",-;
-//==================================
- mes "[Lucias]";
- mes "...I'm disappointed in you.";
- mes "The correct answer is that all of the monsters have water element affinity.";
- mes "Monsters that live in an aquatic environment have evolved bodies adapted to that environment.";
-//==================================
- next;
- goto L_Menu3_6;
- L_Menu3_5:
- mes "[Lucias]";
- mes "Right!";
- mes "Most aquatic monsters have water element affinity because they're adapted to their environment.";
- mes "Fish and shells evolved in a logical way.";
- next;
- L_Menu3_6:
- mes "[Lucias]";
- mes "Not every fish and shell has water element affinity, but you can count on it as a general rule.";
- mes "Now, which type of magic do you think would be most effective against them?";
- next;
- menu "Lightning Bolt",L_Menu3_7,"Firebolt",-,"Thunderstorm",L_Menu3_8,"Frost Nova",-;
-//==================================
-//mes–¢‰ñŽû
- mes "[Lucias]";
- mes "That's not correct.";
- mes "You need to use magic like Lightning Bolt or Thunderstorm.";
- mes "Check the elemental affinity matrix again.";
- next;
-//==================================
- goto L_Menu3_9;
- L_Menu3_7:
- mes "[Lucias]";
- mes "Great! That's right!";
- mes "Using Lightning Bolt is an easy way to victory.";
- next;
- mes "[Lucias]";
- mes "You need to be careful of monsters like the Penomena and Aster because their attribute is different.";
- next;
- goto L_Menu3_9;
- L_Menu3_8:
- mes "[Lucias]";
- mes "Great! That's right!";
- mes "Using Thunderstorm is an easy way to victory.";
- next;
- mes "[Lucias]";
- mes "You need to be careful of monsters like the Penomena and Aster because their attribute is different.";
- next;
- L_Menu3_9:
- mes "[Lucias]";
- mes "Next, let's turn our attention to insectoid monsters.";
- next;
- set @sagerand,rand(3);
- mes "[Lucias]";
- mes "Next, you need to collect ";
- if(@sagerand == 1) goto L_Menu3_10;
- if(@sagerand == 2) goto L_Menu3_11;
- set SAGE_Q2,4;
- mes "^3051FD5x Cobweb^000000";
- mes "^3051FD5x Shell^000000";
- mes "^3051FD5x Insect Feeler^000000";
- next;
- goto L_Menu2_6;
- L_Menu3_10:
- set SAGE_Q2,5;
-//==================================
-//mes–¢‰ñŽû
- mes "^3051FD5x Moth Dust^000000";
- mes "^3051FD5x Snail's Shell^000000";
- mes "^3051FD5x Horn^000000";
- next;
- goto L_Menu2_6;
- L_Menu3_11:
- set SAGE_Q2,6;
- mes "^3051FD5x Mantis Leg^000000";
- mes "^3051FD5x Worm Peeling^000000";
- mes "^3051FD5x Rainbow Shell^000000";
-//==================================
- next;
- goto L_Menu2_6;
-L_Menu4_1:
- if((countitem(1025) >= 5) && (countitem(935) >= 5) && (countitem(928) >= 5) && (SAGE_Q2 == 4)) goto L_Menu4_4;
- if((countitem(1057) >= 5) && (countitem(946) >= 5) && (countitem(947) >= 5) && (SAGE_Q2 == 5)) goto L_Menu4_4;
- if((countitem(1031) >= 5) && (countitem(955) >= 5) && (countitem(1013) >= 5) && (SAGE_Q2 == 6)) goto L_Menu4_4;
- mes "[Lucias]";
- mes "You forgot what you're supposed to gather?";
- mes "Listen carefully this time! You need to gather:";
- next;
- mes "[Lucias]";
- if(SAGE_Q2 == 5) goto L_Menu4_2;
- if(SAGE_Q2 == 6) goto L_Menu4_3;
- mes "^3051FD5x Cobweb^000000";
- mes "^3051FD5x Shell^000000";
- mes "^3051FD5x Insect Feeler^000000";
- close;
- L_Menu4_2:
- mes "^3051FD5x Moth Dust^000000";
- mes "^3051FD5x Snail's Shell^000000";
- mes "^3051FD5x Horn^000000";
- close;
- L_Menu4_3:
- mes "^3051FD5x Mantis Leg^000000";
- mes "^3051FD5x Worm Peeling^000000";
- mes "^3051FD5x Rainbow Shell^000000";
- close;
-L_Menu4_4:
- set SAGE_Q2,7;
- mes "[Lucias]";
- mes "Excellent. You've done well.";
- mes "I hope you were also dilligent in observing your surroundings when you collected the items.";
- next;
- mes "[Lucias]";
- mes "With insects, you'll need to carefully consider which magic to use, since insects have affinity with a variety of elements.";
- next;
- mes "[Lucias]";
- mes "You should also be aware that Thief hiding and Assassin cloaking aren't effective against some insects.";
- next;
- mes "[Lucias]";
- mes "Insects can also act in groups.";
- mes "Often the insect bosses will have considerable numbers of subordinates.";
- next;
- mes "[Lucias]";
- mes "Ant Lord Maya...";
- mes "Queen Bee Mistress...";
- mes "Goblin Chief Goldfinger...";
- next;
- mes "[Lucias]";
- mes "If you face a boss monster alone, you had best prepare to die.";
- mes "You ought to take a group of friends to face these creatures down.";
- next;
- mes "[Lucias]";
- mes "Well, you've studied quite a bit.";
- mes "Now you need to write a thesis.";
- mes "You need some materials before you can begin writing it, however.";
- mes "They are:";
- next;
- mes "[Lucias]";
- mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
- mes "^3051FD1x Animal Skin^000000 for the pages.";
- mes "^3051FD1x Trunk^000000 to bind the pages.";
- mes "^3051FD1x Squid Ink^000000 for your ink.";
- mes "^3051FD1x Empty Bottle^000000 to store your ink.";
- next;
- mes "[Lucias]";
- mes "We can get started when you return.";
- close;
-L_Menu5_1:
- if((countitem(916) >= 1) && (countitem(919) >= 1) && (countitem(1019) >= 1) && (countitem(1024) >= 1) && (countitem(713) >= 1) && (SAGE_Q2 == 7)) goto L_Menu5_2;
- mes "[Lucias]";
- mes "You need to gather those items first.";
- mes "They are:";
- next;
- mes "[Lucias]";
- mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
- mes "^3051FD1x Animal Skin^000000 for the pages.";
- mes "^3051FD1x Trunk^000000 to bind the pages.";
- mes "^3051FD1x Squid Ink^000000 for your ink.";
- mes "^3051FD1x Empty Bottle^000000 to store your ink.";
- next;
- mes "[Lucias]";
- mes "You've done great so far.";
- mes "Just a little more and you can graduate.";
- close;
-L_Menu5_2:
- delitem 916,1;
- delitem 919,1;
- delitem 1019,1;
- delitem 1024,1;
- delitem 713,1;
- mes "[Lucias]";
- mes "Looks like you have everything.";
- next;
- mes "[Lucias]";
- mes "Now, you need to write this yourself.";
- mes "I'm only taking an advisory role.";
- next;
- mes "[Lucias]";
- mes "Are you ready to begin?";
- mes "Let's see if you've acquired enough knowledge to write a coherent thesis.";
- next;
- mes "......";
- next;
- mes "......";
- next;
- mes "......";
- next;
- menu "Monsters come in different types",-;
- mes "Monsters come in different types.";
- menu "They have different elemental affinities",-;
- mes "They have different elemental affinities.";
- menu "If you know the monster's element beforehand...",-;
- mes "If you know the monster's element beforehand...";
- menu "...you can optimize your battle experience",-;
- mes "...you can optimize your battle experience";
- menu "You should especially be careful of...",-;
- mes "You should especially be careful of...";
- menu "...monsters with Holy and Darkness affinity",-;
- mes "...monsters with Holy and Darkness affinity";
- next;
- mes "......";
- next;
- mes "......";
- next;
- mes "......";
- next;
- set SAGE_Q,11;
- getitem 1550,1;
- mes "[Lucias]";
- mes "This is pretty good!";
- mes "I'm proud of you!";
- next;
- mes "[Lucias]";
- mes "Show this to the Headmaster and you'll be sure to graduate.";
- mes "Good luck.";
- close;
-L_Menu5_3:
- mes "[Lucias]";
- mes "Hmmm? What's the matter?";
- mes "You need to show your thesis to the Headmaster.";
- close;
-L_Menu5_4:
- mes "[Lucias]";
- mes "Are you confused about something?";
- mes "I'm pretty busy, so you need to make an appointment a week in advance.";
- next;
- mes "[Lucias]";
- mes "Hahaha...Once you've been a Sage for awhile, you'll be saying the same thing.";
- next;
- mes "[Lucias]";
- mes "Also, if you have some spare time,";
- mes "you should head over to the dungeon and lie down on the floor.";
- mes "Look up and study the ceiling.";
- mes "You might learn something.";
- close;
-}
-
-//=================================
-//Academy Interior
-//=================================
-
-yuno_in03.gat,154,35,4 script Academy Staff 742,{
- callfunc "F_BlockHigh",26,"High Mage",40,"Professor","Mathias";
-
- if(BaseJob == Job_Sage) goto L_Menu6_4;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 11) goto L_Menu6_3;
- if(SAGE_Q >= 4) goto L_Menu6_2;
- if(SAGE_Q == 3) goto L_Menu6_1;
- if(SAGE_Q == 2) goto L_Menu5_1;
- mes "[Mathias]";
- mes "Hello.";
- mes "This is the Shubaichul Magic Academy?";
- mes "You seem to be a Magician.";
- mes "How can I help you?";
- next;
- menu "Sage class-change information",-,"I want to apply for admission to the Academy",L_Menu3_1,"Forget it",L_Menu2;
- mes "[Mathias]";
- mes "You want to change class to Sage?";
- mes "I can't just change your class right here.";
- next;
- mes "[Mathias]";
- mes "You need to complete a program of rigorous coursework and research.";
- next;
- mes "[Mathias]";
- mes "Once you graduate from the academy,";
- mes "you can change class.";
- mes "In order to proceed, you need to pay tuition and take the placement test.";
- next;
- mes "[Mathias]";
- mes "Only those who have an ^3051FDOld Magic Book^000000 and a ^3051FDNecklace Of Wisdom^000000 can have tuition waived.";
- next;
- mes "[Mathias]";
- mes "Once you've paid the fee, you first take the placement test.";
- mes "If you score highly enough to be placed in our program, you then perform research according to your placement.";
- mes "Finally, you must prepare and defend a thesis.";
- next;
- mes "[Mathias]";
- mes "The Headmaster decides whether or not the thesis meets standards for graduation.";
- mes "If he approves, you can formally begin your career as a Sage.";
- next;
- mes "[Mathias]";
- mes "If you're interested, you need only file an application to get started.";
- mes "Have a good day.";
- close;
-L_Menu2:
- mes "[Mathias]";
- mes "Oh?";
- mes "Are you hesitant?";
- mes "See you later, then.";
- close;
-L_Menu1_1:
- mes "[Mathias]";
- mes "Welcome.";
- mes "This is Shubaichul Magic Academy.";
- next;
- mes "[Mathias]";
- mes "We do research on magic and monsters here.";
- mes "We also train fledgling Sages.";
- next;
- mes "[Mathias]";
- mes "Any Magician who is at or above class level 40 can apply for admission to the Academy.";
- mes "Once you complete our prescribed process for degree acquisition, you can become a Sage.";
- next;
- mes "[Mathias]";
- mes "Good bye.";
- close;
-L_Menu3_1:
- mes "[Mathias]";
- mes "You want to apply? Wonderful!";
- next;
- mes "[Mathias]";
- mes "In order to enter the Academy,";
- mes "you need to be a Magician of class level 40 or above.";
- mes "You will also need to pay tuition to cover instruction and materials.";
- next;
- mes "[Mathias]";
- mes "Tuition is 70,000Zeny.";
- mes "If you have an ^3051FDOld Magic Book^000000 or a ^3051FDNecklace Of Wisdom^000000, the tuition fee will be waived.";
- next;
- mes "[Mathias]";
- mes "So, you would like to apply for admission?";
- next;
- menu "Yes, I would",L_Menu5_5,"Tuition is too expensive!",-,"I'll try again later",L_Menu3_2;
- mes "[Mathias]";
- mes "Well...we need the tuition money to cover instruction and materials...";
- next;
- menu "Isn't there another way?",-,"I'll try again later.",L_Menu3_2;
- set SAGE_Q,2;
- mes "[Mathias]";
- mes "Well...Perhaps there is. I can lower the tuition to 30000 Zeny if you can bring us some materials we need for our research department:";
- next;
- mes "[Mathias]";
- mes "Specifically, we need:";
- mes "^3051FD50x Feather of Birds^000000";
- mes "^3051FD50x Fluff^000000";
- mes "^3051FD50x Clover^000000";
- mes "^3051FD50x Feathers^000000";
- next;
- mes "[Mathias]";
- mes "If you can get all that, I'll discount the fee to 30000 Zeny.";
- mes "Please do your best to collect them.";
- next;
- mes "[Mathias]";
- mes "Of course, you can also acquire 70000 Zeny instead of gathering the items if you wish.";
- next;
- mes "[Mathias]";
- mes "Please do your best to collect the items.";
- mes "See you later.";
- close;
- L_Menu3_2:
- mes "[Mathias]";
- mes "Oh, alright.";
- mes "Take your time.";
- mes "Thanks for stopping by.";
- close;
-L_Menu5_1:
- mes "[Mathias]";
- mes "So, would you like to apply for admission?";
- next;
- if(JobLevel < 40) goto L_Menu5_9;
- if(countitem(1006) > 0) goto L_Menu5_4;
- if(countitem(1007) > 0) goto L_Menu5_4_;
- if(Zeny < 70000) goto L_Menu5_2;
- set Zeny,Zeny-70000;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "I see you have 70000 Zeny.";
- mes "I'll take that for tuition. You are now enrolled into the school.";
- next;
- L_Menu5_5:
- if(JobLevel < 40) goto L_Menu5_9;
- mes "[Mathias]";
- mes "We need your signature on this form to proceed.";
- mes "Please sign at the X.";
- next;
- menu "" + strcharinfo(0) + "",-;
- mes "[Mathias]";
- mes "Alright, so you're ";
- mes "" + strcharinfo(0) + ".";
- mes "That's a nice name.";
- next;
- if(JobLevel == 50) goto L_JobMax;
- if(SAGE_Q == 3) goto L_Menu5_6;
- if(countitem(1006) > 0) goto L_Menu5_7;
- if(countitem(1007) > 0) goto L_Menu5_7_;
- if(Zeny < 70000) goto L_Menu5_2;
- set Zeny,Zeny-70000;
- set SAGE_Q,3;
-
- mes "[Mathias]";
- mes "I see you have 70000 Zeny.";
- mes "I'll take that for tuition.";
- mes "You are now enrolled into the school.";
- next;
-
- L_Menu5_6:
- mes "[Mathias]";
- mes "First, you need to take the placement test from Professor Kreitos.";
- next;
- mes "[Mathias]";
- mes "Professor Kreitos is in the Academy library.";
- mes "It's on the far left side of the building.";
- next;
- mes "[Mathias]";
- mes "Good luck on the test.";
- close;
- L_JobMax:
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "You've trained yourself up to the maximum class level for Magicians!";
- mes "In that case, I'll give you a full scholarship!";
- next;
- mes "[Mathias]";
- mes "Now, all you need to do is go take the placement test.";
- next;
- mes "[Mathias]";
- mes "Go see Professor Kreitos in the library on the far left side of the building.";
- close;
- L_Menu5_2:
- if(SAGE_Q != 2) goto L_Menu5_8;
- if((countitem(916) >= 50) && (countitem(914) >= 50) && (countitem(949) >= 50) && (countitem(705) >= 50)) goto L_Menu5_3;
- mes "[Mathias]";
- mes "You don't seem to have the materials yet.";
- next;
- mes "[Mathias]";
- mes "You need to gather:";
- mes "^3051FD50x Feather of Birds^000000";
- mes "^3051FD50x Fluff^000000";
- mes "^3051FD50x Clover^000000";
- mes "^3051FD50x Feathers^000000";
- next;
- mes "[Mathias]";
- mes "If you can get all that, I'll discount the fee to 30000 Zeny.";
- mes "Please do your best to collect them.";
- close;
- L_Menu5_3:
-//==================================
- if(Zeny < 30000) goto L_Menu5_8;
- delitem 916,50;
- delitem 914,50;
- delitem 705,50;
- delitem 949,50;
- set Zeny,Zeny-30000;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "It seems like you have the materials I asked for and 30000 Zeny.";
- mes "Congratulations.";
- mes "You're now enrolled in the Academy.";
- set SAGE_Q,3;
- next;
- goto L_Menu5_5;
- L_Menu5_4:
- delitem 1006,1;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "Oh, you have a ^3051FDOld Magic Book^000000.";
- mes "I'll accept it in lieu of tuition.";
- next;
- goto L_Menu5_5;
- L_Menu5_4_:
- delitem 1007,1;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "Oh, you have a ^3051FDNecklace Of Wisdom^000000.";
- mes "I'll accept it in lieu of tuition.";
- next;
- goto L_Menu5_5;
- L_Menu5_7:
- delitem 1006,1;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "Oh, you have a ^3051FDOld Magic Book^000000.";
- mes "I'll accept it in lieu of tuition.";
- next;
- goto L_Menu5_6;
- L_Menu5_7_:
- delitem 1007,1;
- set SAGE_Q,3;
- mes "[Mathias]";
- mes "Oh, you have a ^3051FDNecklace Of Wisdom^000000.";
- mes "I'll accept it in lieu of tuition.";
- next;
- goto L_Menu5_6;
- L_Menu5_8:
- mes "[Mathias]";
- mes "You don't seem to have enough money.";
- mes "Please earn some money and return here.";
- close;
- L_Menu5_9:
- mes "[Mathias]";
- mes "Your class level is too low.";
- mes "Complete some more training and return here.";
- close;
-//==================================
-L_Menu6_1:
- mes "[Mathias]";
- mes "Hmmm? Did you forget what you need to do next?";
- mes "Head over and see Professor Kreitos on the left side of the building.";
- close;
-L_Menu6_2:
- mes "[Mathias]";
- mes "Oh, forgive me. I have so much to do that I can't help you at the moment.";
- mes "Again, I apologize...";
- close;
-L_Menu6_3:
- mes "[Mathias]";
- mes "Oh! Did you finish your thesis?";
- mes "You need to see Headmaster Keiron so he can evaluate it.";
- next;
- mes "[Mathias]";
- mes "If he approves, you can graduate!";
- mes "Good luck.";
- close;
-L_Menu6_4:
- mes "[Mathias]";
- mes "Welcome, colleague.";
- mes "How is your research coming along?";
- next;
- mes "[Mathias]";
- mes "In order to be a truly great researcher, you need to supplement your book-based research with encounters with real monsters.";
- next;
- mes "[Mathias]";
- mes "If you know others with what it takes to become a Sage, please send them here.";
- mes "Give my regards to my other colleagues, also.";
- close;
-}
-
-yuno_in03.gat,169,180,4 script Test Professor 755,{
- if(BaseJob == Job_Sage) goto L_Menu4_5;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 5) goto L_Menu2_1;
- if(SAGE_Q == 6) goto L_Menu2_3;
- if(SAGE_Q == 7) goto L_Menu3_1;
- if(SAGE_Q == 8) goto L_Menu4_1;
- if(SAGE_Q == 9) goto L_Menu4_2;
- if(SAGE_Q == 11) goto L_Menu4_4;
- mes "[Hermes]";
- mes "Hello, I'm Hermes. I am part of the skill testing staff.";
- mes "Are you a Sage candidate?";
- next;
- if(SAGE_Q == 3) goto L_Menu1_2;
- if(SAGE_Q >= 3) goto L_Menu1_2;
- mes "[Hermes]";
- mes "Oh, alright.";
- mes "First you need to enroll and take the placement test.";
- close;
-L_Menu1_1:
- mes "[Hermes]";
- mes "This is Shubaichul Magic Academy.";
- next;
- mes "[Hermes]";
- mes "There are Sages that are less magicians than researchers.";
- mes "Having a party supporting this kind of person is extremely important.";
- next;
- mes "[Hermes]";
- mes "Keep supporting your party to the best of your ability.";
- mes "That's all you need to do.";
- close;
-L_Menu1_2:
- mes "[Hermes]";
- mes "You need to take the placement test from Kreitos before you can take my test.";
- close;
-L_Menu2_1:
- set SAGE_Q,6;
- mes "[Hermes]";
- mes "Oh? You took and passed the placement test?";
- mes "Now you need to take the skill test from me.";
- next;
- mes "[Hermes]";
- mes "The rules for the skill test are simple.";
- mes "You need to kill all the monsters within the prescribed time limit.";
- next;
- mes "[Hermes]";
- mes "There's an old proverb that one experience is worth a hundred words, so why not try it once?";
- next;
- menu "Sounds good",-,"I'm not ready yet",L_Menu2_2;
- mes "[Hermes]";
- mes "Well, let's get started.";
- mes "Do your best!";
- close2;
- warp "job_sage",50,154;
- end;
- L_Menu2_2:
- mes "[Hermes]";
- mes "Okay.";
- mes "Please prepare quickly.";
- close;
-L_Menu2_3:
- mes "[Hermes]";
- mes "Are you ready to take the skill test?";
- mes "It's not too tough.";
- next;
- mes "[Hermes]";
- mes "How about it?";
- next;
- menu "Sounds good",-,"I'm not ready yet",L_Menu2_2;
- mes "[Hermes]";
- mes "Well, let's get started.";
- mes "Do your best!";
- close2;
- warp "job_sage",50,154;
- end;
-L_Menu3_1:
- mes "[Hermes]";
- mes "Good job! You passed";
- mes "the skill test! Now you can proceed to the research phase!";
- next;
- mes "[Hermes]";
- mes "Before I decide your research concentration, let's look at your score on the placement test and the amount of time you spent in the skill test.";
- next;
- mes "[Hermes]";
- mes "Hmmm...";
- mes "Looking good.";
- next;
-
-//It's not clear how the script decides
-
- if(sagecheck >= 12) goto L_Menu3_2;
- set SAGE_Q,8;
- mes "[Hermes]";
- mes "It looks like monster research would be your best bet.";
- next;
- mes "[Hermes]";
- mes "In order to gain the necessary information to put together a coherent research paper,";
- mes "you should take the biology course from Professor Lucias.";
- next;
- goto L_Menu3_4;
-L_Menu3_2:
- set SAGE_Q,9;
- mes "[Hermes]";
- mes "It looks like we have a budding elemental magic researcher here.";
- mes "This field is fundamental to the advancement of magical knowledge.";
- next;
- mes "[Hermes]";
- mes "You need to take a course from Professor Ebeshi in the biotech lab to gain a deeper understanding of elemental magic.";
- next;
-L_Menu3_4:
- mes "[Hermes]";
- mes "I hope the coursework goes well.";
- close;
-L_Menu4_1:
- mes "[Hermes]";
- mes "Weren't you listening?";
- mes "You need to see Professor Lucias so you can begin your study of monster biology.";
- close;
-L_Menu4_2:
- mes "[Hermes]";
- mes "Weren't you listening?";
- mes "You need to see Professor Ebeshi so you can begin your study of elemental magic.";
- close;
-L_Menu4_4:
- mes "[Hermes]";
- mes "Great job on completing your thesis, but you need to show it to the Headmaster.";
- mes "He's the one who will judge whether or not you graduate.";
- close;
-L_Menu4_5:
- mes "[Hermes]";
- mes "How are you?";
- mes "Your face reveals that you've endured a lot of stress lately.";
- next;
- mes "[Hermes]";
- mes "As stressful as hands-on research is,";
- mes "it is still fundamentally different from research using abstract concepts.";
- next;
- mes "[Hermes]";
- mes "Of course, if you go to difficult dungeons,";
- mes "there's no shame in bringing a friend or five to help you out.";
- close;
-}
-
-yuno_in03.gat,62,176,3 script History Professor 109,{
- if(BaseJob == Job_Sage) goto L_Menu2_2;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 11) goto L_Menu2_1;
- mes "[Sapien]";
- mes "You don't seem sure of your intended direction of study.";
- mes "Perhaps you should consider it...";
- close;
-L_Menu1_1:
- mes "[Sapien]";
- mes "Yes, I teach history.";
- next;
- mes "[Sapien]";
- mes "As the present fades into memory, it becomes the past.";
- mes "The kwoledge we have acquired in the past is the bridge between the present and the future.";
- next;
- mes "[Sapien]";
- mes "You should study your own past, too.";
- mes "By understanding what's happened to you already,";
- mes "you can blaze a trail into the future unhindered by unresolved problems.";
- close;
-L_Menu2_1:
- mes "[Sapien]";
- mes "What are you doing?";
- mes "Hurry up and show the Headmaster your thesis before you lose it!";
- close;
-L_Menu2_2:
- mes "[Sapien]";
- mes "Yes...?";
- mes "Ah, it's a former student here.";
- mes "Congratulations on graduating.";
- next;
- mes "[Sapien]";
- mes "The present can only be understood by understanding the past.";
- mes "Such understanding allows us to envision our future.";
- next;
- mes "[Sapien]";
- mes "You should study your own past, too.";
- mes "By understanding what's happened to you already,";
- mes "you can blaze a trail into the future unhindered by unresolved problems.";
- close;
-}
-
-yuno_in03.gat,105,177,4 script Placement Test Professor 754,{
- if(BaseJob == Job_Sage) goto L_Menu3_4;
- if(BaseJob != Job_Mage) goto L_Menu1_1;
- if(SAGE_Q == 11) goto L_Menu3_3;
- if(SAGE_Q >= 6) goto L_Menu3_2;
- if(SAGE_Q == 3) goto L_Menu1_2;
- if(SAGE_Q == 4) goto L_Menu2_1;
- if(SAGE_Q == 5) goto L_Menu3_1;
- mes "[Kreitos]";
- mes "You have that look in your eye...";
- mes "You want to be a Sage, I take it.";
- next;
- mes "[Kreitos]";
- mes "You need to formally enroll in the Academy before I can help you any further.";
- close;
-L_Menu1_1:
- mes "[Kreitos]";
- mes "Oh, you're not interested in our brand of magic?";
- mes "That's alright...";
- next;
- mes "[Kreitos]";
- mes "Anyone who teaches others and has a good heart is of value to society.";
- mes "Please keep that in mind.";
- close;
-L_Menu1_2:
- set SAGE_Q,4;
- set sagecheck,10;
- mes "[Kreitos]";
- mes "It looks like you've enrolled in the Shubaichul Magic Academy.";
- mes "Is that right?";
- next;
- mes "[Kreitos]";
- mes "So, let me find your paperwork...";
- mes "You're " + strcharinfo(0) + ",";
- mes "right?";
- mes "Let's start the placement test.";
- next;
- mes "[Kreitos]";
- mes "This test consists of twenty questions concerning the entire world.";
- mes "If you score at least 80 points, you'll be placed in our program.";
- mes "Each correct answer is worth 5 points.";
- next;
- mes "[Kreitos]";
- mes "If you cancel, you'll have to start over, so be careful.";
- next;
- goto L_Menu2_2;
- L_Menu2_1:
- mes "[Kreitos]";
- mes "Are you ready to try again?";
- mes "Have you studied hard?";
- next;
- mes "[Kreitos]";
- mes "The passing grade is as before.";
- mes "You need to score 80 points, with each question being worth 5 points.";
- next;
- mes "[Kreitos]";
- mes "So, let's get started.";
- mes "Give it your best effort.";
- mes "As before, if you cancel,";
- mes "you'll have to start over.";
- next;
- L_Menu2_2:
-
- set @sage_test2,0;
- set @sage_test1,rand(3);
- if (@sage_test1 == 1) goto L_Test2_1;
- if (@sage_test1 == 2) goto L_Test3_1;
-
-//==================================
-//Written Test: Route 1.
-//==================================
- mes "1. Which one isn't sold in Morocc's jewel shop?";
- next;
- menu "Topaz",L_Test1_1,"Garnet",-,"Diamond",L_Test1_1,"Sapphire",L_Test1_1;
- set @sage_test2,@sage_test2+5;
- goto L_Test1_1;
- L_Test1_1:
- mes "2. In which town can you not buy monster food?";
- next;
- menu "Prontera",L_Test1_2,"Morocc",L_Test1_2,"Aldebaran",-,"Alberta",L_Test1_2;
- set @sage_test2,@sage_test2+5;
- L_Test1_2:
- mes "3. Which town is closest to the forest maze?";
- next;
- menu "Prontera",-,"Morocc",L_Test1_3,"Geffen",L_Test1_3,"Payon",L_Test1_3;
- set @sage_test2,@sage_test2+5;
- L_Test1_3:
- mes "4. Which of these monsters is of a different race than the other three?";
- next;
- menu "Muka",L_Test1_4,"Drops",L_Test1_4,"Plankton",L_Test1_4,"Penomena",-;
- set @sage_test2,@sage_test2+5;
- L_Test1_4:
- mes "5. All these monsters except one have the same elemental affinity.";
- mes "Which one has the different affinity?";
- next;
- menu "Dokebi",L_Test1_5,"Isis",L_Test1_5,"Giearth",-,"Deviruchi",L_Test1_5;
- set @sage_test2,@sage_test2+5;
- L_Test1_5:
- mes "6. Which one differs in approximate size from the others?";
- next;
- menu "Male Thief Bug",L_Test1_6,"Horn",L_Test1_6,"Metaller",L_Test1_6,"Argos",-;
- set @sage_test2,@sage_test2+5;
- L_Test1_6:
- mes "7. Which of these monsters doesn't drop the Iggydrasil leaf?";
- next;
- menu "Marduk",-,"Baphomet Jr.",L_Test1_7,"Angeling",L_Test1_7,"Wander Man",L_Test1_7;
- set @sage_test2,@sage_test2+5;
- L_Test1_7:
- mes "8. Which of these people isn't related to someone who can perform a class change to priest?";
- next;
- menu "Peter S. Alberto",-,"Thomas Bishop",L_Test1_8,"Windser Banedict",L_Test1_8,"Sesil Magrita",L_Test1_8;
- set @sage_test2,@sage_test2+5;
- L_Test1_8:
- mes "9. Which doesn't live in Morocc?";
- next;
- menu "Muda Armani",L_Test1_9,"Aragham",L_Test1_9,"Antonio",-,"Abldul",L_Test1_9;
- set @sage_test2,@sage_test2+5;
- L_Test1_9:
- mes "10. Which Kapra has the pretty blue hair?";
- next;
- menu "Pavianne",-,"Debril",L_Test1_10,"Claris",L_Test1_10,"Tayelin",L_Test1_10;
- set @sage_test2,@sage_test2+5;
- L_Test1_10:
- mes "11. Which one isn't necessary to unlock the Fire Wall skill?";
- next;
- menu "Firebolt Lv4",L_Test1_11,"Napalm Beat Lv4",-,"Fireball Lv5",L_Test1_11,"Sight Lv1",L_Test1_11;
- set @sage_test2,@sage_test2+5;
- L_Test1_11:
- mes "12. When the skill 'SP Restoration Lv6' is active, how much SP does the skill restore every ten seconds?";
- next;
- menu "14 sp",L_Test1_12,"16 sp",L_Test1_12,"18 sp",-,"21 sp",L_Test1_12;
- set @sage_test2,@sage_test2+5;
- L_Test1_12:
- mes "13. If you are a magician with job lv. 33, how many additional stat points will you get for int?";
- next;
- menu "7",L_Test1_13,"6",L_Test1_13,"5",L_Test1_13,"4",-;
- set @sage_test2,@sage_test2+5;
- L_Test1_13:
- mes "14. If the Archer skill 'Concentration Up Lv5' is active, how much SP will it consume?";
- next;
- menu "45 / 140sec",-,"50 / 140sec",L_Test1_14,"45 / 150sec",L_Test1_14,"50 / 150sec",L_Test1_14;
- set @sage_test2,@sage_test2+5;
- L_Test1_14:
- mes "15. Which one isn't necessary to unlock the Blacksmith skill 'Maximize Power'?";
- next;
- menu "Hilt Bending",L_Test1_15,"Skin Tempering",-,"Hammer Fall",L_Test1_15,"Weapon Perfection",L_Test1_15;
- set @sage_test2,@sage_test2+5;
- L_Test1_15:
- mes "16. What is the defense power and supplemental ability of a Ribbon?";
- next;
- menu "0 / SP +20",L_Test1_16,"0 / SP +30",L_Test1_16,"1 / SP +20",-,"1 / SP +30",L_Test1_16;
- set @sage_test2,@sage_test2+5;
- L_Test1_16:
- mes "17. Which class can't equip a Saint Robe?";
- next;
- //Swordsmen can't equip it either as of this writing.
- menu "Swordsman",-,"Merchant",L_Test1_17,"Thief",-,"Acolyte",L_Test1_17;
- set @sage_test2,@sage_test2+5;
- L_Test1_17:
- mes "18. Which status ailment can't be removed with a Green Potion?";
- next;
- menu "Mute",L_Test1_18,"Poison",L_Test1_18,"Blind",L_Test1_18,"Cursed",-;
- set @sage_test2,@sage_test2+5;
- L_Test1_18:
- mes "19. What is the name of the ancient kingdom from which Geffen descends?";
- next;
- menu "Gefin",L_Test1_19,"Geffenia",-,"Gefdoria",L_Test1_19,"Gefria",L_Test1_19;
- set @sage_test2,@sage_test2+5;
- L_Test1_19:
- mes "20. Which tree is said to be the world's root?";
- next;
- menu "Igg Drasil",-,"Idrasil",L_Menu2_3,"Master",L_Menu2_3,"Old Tree",L_Menu2_3;
- set @sage_test2,@sage_test2+5;
- goto L_Menu2_3;
- //==================================
- //Written Test: Route 2.
- //==================================
- L_Test2_1:
- mes "1. Which isn't sold in Geffen's magic shop?";
- next;
- menu "Mantle",-,"Wand",L_Test2_2,"Circlet",L_Test2_2,"Silver Robe",L_Test2_2;
- set @sage_test2,@sage_test2+5;
- L_Test2_2:
- mes "2. Which town doesn't sell blades?";
- next;
- menu "Prontera",L_Test2_3,"Izlude",L_Test2_3,"Aldebaran",-,"payon",L_Test2_3;
- set @sage_test2,@sage_test2+5;
- L_Test2_3:
- mes "3. Which town is nearest to Glast Heim?";
- next;
- menu "Prontera",L_Test2_4,"Geffen",-,"Morocc",L_Test2_4,"Payon",L_Test2_4;
- set @sage_test2,@sage_test2+5;
- L_Test2_4:
- mes "4. Which monster's type differs from the other three?";
- next;
- menu "Aster",L_Test2_5,"Marc",L_Test2_5,"Marse",L_Test2_5,"Marin",-;
- set @sage_test2,@sage_test2+5;
- L_Test2_5:
- mes "5. Which monster's elemental affinity is different from the others?";
- next;
- menu "Desert Wolf Babe",L_Test2_6,"Smokie",-,"Picky",L_Test2_6,"Choco",L_Test2_6;
- set @sage_test2,@sage_test2+5;
- L_Test2_6:
- mes "6. Which monster is in a different size class than the others?";
- next;
- menu "Drake",-,"Wraith",L_Test2_7,"Evil Druid",L_Test2_7,"Khalitzburg",L_Test2_7;
- set @sage_test2,@sage_test2+5;
- L_Test2_7:
- mes "7. Which monster doesn't drop Phracon?";
- next;
- menu "Pupa",L_Test2_8,"Condor",-,"Savage Baby",L_Test2_8,"Desert Wolf Babe",L_Test2_8;
- set @sage_test2,@sage_test2+5;
- L_Test2_8:
- mes "8. Who isn't involved in the Blacksmith class change?";
- next;
-// =========================
-// Acording To mRO Site And eAthena Blacksmith Script the following ppl looking like ppl listed here are:
-// - Baisulitst - looks like some1 listed by mRO
-// - Wickebine - mRO has him as option listed
-// - Gromgast - mRO has him as option listed
-// - Mitmayer - translator has him listed as option
-// == Conclusion == I took the following:
-// =========================
- menu "Baisulitst",L_Test2_9,"Wickebine",L_Test2_9,"Barkdale",-,"Mitmayer",L_Test2_9;
- set @sage_test2,@sage_test2+5;
- L_Test2_9:
- mes "9. Who doesn't live in Aldebaran?";
- next;
- menu "RS125",L_Test2_10,"Maasaru",-,"Munster",L_Test2_10,"Isenberg",L_Test2_10;
- set @sage_test2,@sage_test2+5;
- L_Test2_10:
- mes "10. Who is the youngest person in the Kapra organization?";
- next;
- menu "Deflute",L_Test2_11,"Claris",L_Test2_11,"Tayelin",L_Test2_11,"Curly Sue",-;
- set @sage_test2,@sage_test2+5;
- L_Test2_11:
- mes "11. When you use the skill 'Safety Wall Lv6', how much SP is consumed and how many attacks will it block?";
- next;
- menu "SP 40, 6bl",L_Test2_12,"SP 35, 6bl",L_Test2_12,"SP 35, 7bl",L_Test2_12,"SP 40, 7bl",-;
- set @sage_test2,@sage_test2+5;
- L_Test2_12:
- mes "12. When you use 'Napalm Beat Lv6', what is the attack power relative to MATK?";
- next;
- menu "1.2x MATK",L_Test2_13,"1.3x MATK",-,"1.4x MATK",L_Test2_13,"1.5x MATK",L_Test2_13;
- set @sage_test2,@sage_test2+5;
- L_Test2_13:
- mes "13. Which one catalyzes the reaction of Liquid #4 during the Magician class change test?";
- next;
- menu "Blue Gemstone",L_Test2_14,"Red Gemstone",L_Test2_14,"Orange Gemstone",L_Test2_14,"Carat Diamond",-;
- set @sage_test2,@sage_test2+5;
- L_Test2_14:
- mes "14. What is the damage multiplier and SP consumption for 'Bash Lv6'?";
- next;
- menu "250% / 8",L_Test2_15,"280% / 8",L_Test2_15,"280% / 15",-,"310% / 15",L_Test2_15;
- set @sage_test2,@sage_test2+5;
- L_Test2_15:
- mes "15. Which isn't necessary to unlock the Hunter skill 'Claymore Trap'?";
- next;
- menu "Remove Trap",-,"Land Mine",L_Test2_16,"Ankle Snare",L_Test2_16,"Flash",L_Test2_16;
- set @sage_test2,@sage_test2+5;
- L_Test2_16:
- mes "16. What is the defense power and supplemental ability of a Veil?";
- next;
- menu "0 / MDEF +3",L_Test2_17,"0 / MDEF +5",-,"1 / MDEF +3",L_Test2_17,"1 / MDEF +5",L_Test2_17;
- set @sage_test2,@sage_test2+5;
- L_Test2_17:
- mes "17. Which class can't equip a Coat?";
- next;
- menu "Swordsman",L_Test2_18,"Magician",L_Test2_18,"Thief",L_Test2_18,"Novice",-;
- set @sage_test2,@sage_test2+5;
- L_Test2_18:
- mes "18. Which item isn't blue in color?";
- next;
- menu "Alcohol",L_Test2_19,"Detrimindexta",-,"Karvodailnirol",L_Test2_19,"Blue Herb",L_Test2_19;
- set @sage_test2,@sage_test2+5;
- L_Test2_19:
- mes "19. Which item did the god Odin use to create the world?";
- next;
-// menu "Yomir's Heart",L_Test2_20,"Yomir's Nail",-,"Yomir's Tooth",L_Test2_20,"Yomir's Stuff",L_Test2_20;
-// All answers correct untill i know the real answer, only Stuff is wrong cause that NOT it
- menu "Yomir's Heart",-,"Yomir's Nail",-,"Yomir's Tooth",-,"Yomir's Stuff",L_Test2_20;
- set @sage_test2,@sage_test2+5;
- L_Test2_20:
- mes "20. Which metal can change the fate of the world?";
- next;
- menu "Envertacon",L_Menu2_3,"Emperium",-,"Enbera",L_Menu2_3,"Phracon",L_Menu2_3;
- set @sage_test2,@sage_test2+5;
- goto L_Menu2_3;
-//==================================
-//Written Test: Route 3.
-//==================================
- L_Test3_1:
- mes "1.Which of these items isn't sold at Prontera's knicknack shop?";
- next;
- menu "White Plate",L_Test3_2,"Red Frame",L_Test3_2,"Flower",-,"Glass Ball",L_Test3_2;
- set @sage_test2,@sage_test2+5;
- L_Test3_2:
- mes "2. Which town doesn't sell stilettos?";
- next;
- menu "Prontera",-,"Morocc",L_Test3_3,"Gefen",L_Test3_3,"Lutie",L_Test3_3;
- set @sage_test2,@sage_test2+5;
- L_Test3_3:
- mes "3. Which town is closest to Turtle Island?";
- next;
- menu "Aldebaran",L_Test3_4,"Alberta",-,"Comodo",L_Test3_4,"Izlude",L_Test3_4;
- set @sage_test2,@sage_test2+5;
- L_Test3_4:
- mes "4. Which monster is of a different monster race than the other three?";
- next;
- menu "Raggler",L_Test3_5,"Pest",L_Test3_5,"Frilldora",L_Test3_5,"Aster",-;
- set @sage_test2,@sage_test2+5;
- L_Test3_5:
- mes "5. Which monster has a different elemental affinity than the other three?";
- next;
- menu "Mantis",L_Test3_6,"Metaller",-,"Rokker",L_Test3_6,"Horn",L_Test3_6;
- set @sage_test2,@sage_test2+5;
- L_Test3_6:
- mes "6. Which monster is in a different size class than the others?";
- next;
- menu "Raydric",-,"Raydric Archer",L_Test3_7,"Wander Man",L_Test3_7,"Dark Flame",L_Test3_7;
- set @sage_test2,@sage_test2+5;
- L_Test3_7:
- mes "7. Which monster doesn't drop alcohol?";
- next;
- menu "Horn",L_Test3_8,"Plankton",L_Test3_8,"Poison Spore",-,"Toad",L_Test3_8;
- set @sage_test2,@sage_test2+5;
- L_Test3_8:
- mes "8. Which isn't involved in the Knight class change?";
- next;
-// =========================
-// Acording To mRO Site And eAthena Knight Script the following ppl looking like ppl listed here
-// =========================
- menu "James Syracuse",L_Test3_9,"Thomas Bishop",-,"Amy Veattris",L_Test3_9,"Edmond Groster",L_Test3_9;
- set @sage_test2,@sage_test2+5;
- L_Test3_9:
- mes "9. Which of these people doesn't live in Prontera?";
- next;
- menu "Nami",L_Test3_10,"Aldefun",-,"Thomas",L_Test3_10,"Hollengrhen",L_Test3_10;
- set @sage_test2,@sage_test2+5;
- L_Test3_10:
- mes "10. Which Kapra wears glasses?";
- next;
- menu "Deflute",L_Test3_11,"Tayelin",L_Test3_11,"Leilah",-,"Debril",L_Test3_11;
- set @sage_test2,@sage_test2+5;
- L_Test3_11:
- mes "11. How much SP does it cost to use 'Thunderstorm Lv7'?";
- next;
- menu "49",L_Test3_12,"59",-,"69",L_Test3_12,"74",L_Test3_12;
- set @sage_test2,@sage_test2+5;
- L_Test3_12:
- mes "12. If you have 50% of your SP left, how much damage will 'Energy Coat' block and how much SP will be consumed?";
- next;
- menu "24% blocked SP1.5% consumed",L_Test3_13,"24% blocked SP2% consumed",L_Test3_13,"18% blocked SP1.5% consumed",L_Test3_13,"18% blocked SP2% consumed",-;
- set @sage_test2,@sage_test2+5;
- L_Test3_13:
- mes "13. Which element cannot be used in bolt form by a Magician?";
- next;
- menu "Water",L_Test3_14,"Earth",-,"Fire",L_Test3_14,"Wind",L_Test3_14;
- set @sage_test2,@sage_test2+5;
- L_Test3_14:
- mes "14. When a thief has the skill 'Double Attack Lv7', what is the trigger probability and attack power multiplier?";
- next;
- menu "35% / 120%",L_Test3_15,"35% / 140%",-,"40% / 120%",L_Test3_15,"40% / 140%",L_Test3_15;
- set @sage_test2,@sage_test2+5;
- L_Test3_15:
- mes "15. Which of these isn't necessary to unlock the Priest skill 'Magnus Exorcism'?";
- next;
- menu "Divine Protection",-,"Heal",L_Test3_16,"Revive",L_Test3_16,"Aqua Benedicta",L_Test3_16;
- set @sage_test2,@sage_test2+5;
- L_Test3_16:
- mes "16. What is the defense power and supplemental ability of a Bunny Band?";
- next;
- menu "1 / LUK +2",L_Test3_17,"1 / LUK +5",L_Test3_17,"2 / LUK +2",-,"2 / LUK +5",L_Test3_17;
- set @sage_test2,@sage_test2+5;
- L_Test3_17:
- mes "17. Which class can't equip armor?";
- next;
- menu "Swordsman",L_Test3_18,"Merchant",L_Test3_18,"Thief",L_Test3_18,"Archer",-;
- set @sage_test2,@sage_test2+5;
- L_Test3_18:
- mes "18. Which item completely restores HP and SP?";
- next;
- menu "Royal Jelly",L_Test3_19,"Ig Drasil Seed",L_Test3_19,"Ig Drasil Fruit",-,"Master Fruit",L_Test3_19;
- set @sage_test2,@sage_test2+5;
- L_Test3_19:
- mes "19. What's the name of the king of Rune-Midgard?";
- next;
- menu "Trisdan III",L_Test3_20,"Tristan III",-,"Traisda III",L_Test3_20,"Trist III",L_Test3_20;
- set @sage_test2,@sage_test2+5;
- L_Test3_20:
- mes "20. Which god do Crusaders serve?";
- next;
- menu "Odin",-,"Loki",L_Menu2_3,"Tooru",L_Menu2_3,"Aragamsaree",L_Menu2_3;
- set @sage_test2,@sage_test2+5;
-
- L_Menu2_3:
- mes "[Kreitos]";
- mes "Are you finished?";
- mes "Alright, then I'll grade the test.";
- next;
- mes "[Kreitos]";
- mes "Hmmm...";
- mes "Yes....";
- next;
- if (@sage_test2 >= 100) goto L_Menu2_5;
- if (@sage_test2 < 80) goto L_Menu2_4;
- mes "[Kreitos]";
- mes "All done.";
- mes "You scored " + @sage_test2 + " points.";
- mes "Looking good.";
- mes "You've scored highly enough to pass.";
- next;
- goto L_Menu2_6;
- L_Menu2_4:
- set sagecheck,sagecheck-1;
- mes "[Kreitos]";
- mes "All done.";
- mes "You scored " + @sage_test2 + " points.";
- mes "......";
- mes "Sorry, that's not good enough.";
- next;
- mes "[Kreitos]";
- mes "We exepect our students to have command of much information about the world.";
- mes "Learn some more and come back.";
- mes "You can take the test again then.";
- close;
- L_Menu2_5:
- mes "[Kreitos]";
- mes "All done.";
- mes "You scored " + @sage_test2 + " points.";
- mes "Amazing. You did wonderfully.";
- mes "There is no doubt you'll make a great Sage.";
- next;
- L_Menu2_6:
- set SAGE_Q,5;
- mes "[Kreitos]";
- mes "Alright.";
- mes "You've completed the placement test.";
- mes "Now you need to take the skill test from Professor Hermes.";
- close;
-L_Menu3_1:
- mes "[Kreitos]";
- mes "Heh?";
- mes "Do you love tests so much that you want to take the placement test again?";
- next;
- mes "[Kreitos]";
- mes "Go see Professor Hermes and take the skill test.";
- mes "Future Sages can't be slacking off.";
- close;
-L_Menu3_2:
- mes "[Kreitos]";
- mes "I'm busy grading other students' exams at the moment.";
- mes "If you need something, please see me later.";
- close;
-L_Menu3_3:
- mes "[Kreitos]";
- mes "It's great that you finished your thesis, but I don't grade those.";
- next;
- mes "[Kreitos]";
- mes "Show that to Headmaster Keiron.";
- mes "He'll judge whether or not it's quality warrants your graduation.";
- close;
-L_Menu3_4:
- mes "[Kreitos]";
- mes "You've graduated already?";
- mes "Do you want to take more classes?";
- next;
- mes "[Kreitos]";
- mes "I know it feels great to have graduated, but you've got to keep learning.";
- mes "You might burn out if you become complacent and never venture out of the library once in a while.";
- mes "Danger is exhilerating.";
- next;
- mes "[Kreitos]";
- mes "Don't forget to keep notes about your journies.";
- mes "They can come in handy when you want to teach others about a subject you've studied.";
- close;
-}
-
-//==================================
-//Skill Test Room
-//==================================
-
-job_sage.gat,50,165,4 script Skill Test Coordinator::jobsage_wroom 700,{
- mes "[Skill Test Coordinator]";
- mes "Welcome to the Sage skill test.";
- mes "Please go to the waiting area if you want to take the test.";
- next;
- mes "[Skill Test Coordinator]";
- mes "Others are being tested at the moment.";
- mes "When it's time for you to be tested, we'll call your name.";
- next;
- mes "[Skill Test Coordinator]";
- mes "It takes around 5-10 minutes to test one person.";
- close;
-OnInit:
- waitingroom "Test Waiting Area",10,"jobsage_wroom::OnStart",1;
- end;
-OnStart:
- disablewaitingroomevent;
- warpwaitingpc "job_sage.gat",118,99;
- set $@jobsage_pid,$@warpwaitingpc[0];
- if( attachrid($@jobsage_pid)==0 ) goto L_Error;
- set $@jobsage_pname$,strcharinfo(0);
- donpcevent "jobsage_1st::OnStart";
- end;
-L_Error:
- enablewaitingroomevent;
- end;
-OnEnable:
- enablewaitingroomevent;
- end;
-}
-
-//======== Test Step 1
-job_sage.gat,1,1,1 script jobsage_1st -1,{
- end;
-OnStart:
- set $@jobsage_m,16;
- monster "job_sage.gat",115,106,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",120,102,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",124,98,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",120,93,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",115,90,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",111,93,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",107,98,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",111,102,"Unit",1183,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",128,110,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",124,106,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",124,89,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",128,85,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",107,89,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",103,85,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",107,106,"Unit",1184,1,"jobsage_1st::OnKilled";
- monster "job_sage.gat",103,110,"Unit",1184,1,"jobsage_1st::OnKilled";
- initnpctimer;
- end;
-OnReset:
- killmonster "job_sage.gat","All";
- end;
-OnKilled:
- set $@jobsage_m,$@jobsage_m-1;
- if( $@jobsage_m > 0 )goto L_NotWin;
- if(getnpctimer(0) < 60000 ) set sagecheck,sagecheck+1;
- if((getnpctimer(0) >= 120000 ) && (getnpctimer(0) <= 170000 )) set sagecheck,sagecheck-1;
- if(getnpctimer(0) > 170000 ) set sagecheck,sagecheck-2;
- stopnpctimer;
- mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + " killed all the monsters!",8;
- donpcevent "jobsage_2nd::OnStart";
- L_NotWin:
- end;
-OnTimer1000:
- mapannounce "job_sage.gat","Examiner: The skill test begins now.",8;
- end;
-OnTimer2500:
- mapannounce "job_sage.gat","Examiner: The time limit for this portion of the test is 3 minutes.",8;
- end;
-OnTimer4000:
- mapannounce "job_sage.gat","Examiner: You must kill all the monsters within that time period.",8;
- end;
-OnTimer30000:
- mapannounce "job_sage.gat","Examiner: 2 minutes, 30 seconds remaining.",8;
- end;
-OnTimer60000:
- mapannounce "job_sage.gat","Examiner: 2 minutes remaining.",8;
- end;
-OnTimer90000:
- mapannounce "job_sage.gat","Examiner: 1 minute, 30 seconds remaining.",8;
- end;
-OnTimer120000:
- mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
- end;
-OnTimer150000:
- mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
- end;
-OnTimer170000:
- mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
- end;
-OnTimer180000:
- donpcevent "jobsage_1st::OnReset";
- mapannounce "job_sage.gat","Examiner: Time has expired.",8;
- end;
-OnTimer181500:
- mapannounce "job_sage.gat","Examiner:" + $@jobsage_pname$ + "failed the test.",8;
- areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
- end;
-OnTimer183000:
- mapannounce "job_sage.gat","Next candidate, please step forward.",8;
- end;
-OnTimer184000:
- donpcevent "jobsage_wroom::OnEnable";
- stopnpctimer;
- end;
-}
-
-//======== Test Step 2
-job_sage.gat,1,1,1 script jobsage_2nd -1,{
- end;
-OnStart:
- donpcevent "jobsage_2nd::OnReset";
- set $@jobsage_m,24;
- monster "job_sage.gat",120,102,"GeographyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,102,"StatisticsInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,102,"MeteorologyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,102,"AstronomyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,102,"LinguisticsInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,102,"CityLifeInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",124,98,"ForestryInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",124,98,"HealthInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",124,98,"PsychologyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,93,"AnthropologyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,93,"BiologyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",120,93,"EthicsInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"ArchitectureInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"PlasticsInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"NutritionInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"FoodInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"ManagementInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,93,"SociologyInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",107,98,"EconomicsInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",107,98,"MagicInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",107,98,"PoliSciInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,102,"MathInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,102,"HistoryInfo",1063,1,"jobsage_2nd::OnKilled";
- monster "job_sage.gat",111,102,"PhysicsInfo",1063,1,"jobsage_2nd::OnKilled";
- initnpctimer;
- end;
-OnReset:
- killmonster "job_sage.gat","All";
- end;
-OnKilled:
- set $@jobsage_m,$@jobsage_m-1;
- if( $@jobsage_m > 0 )goto L_NotWin;
- stopnpctimer;
- if(getnpctimer(0) < 60000 ) set sagecheck,sagecheck+1;
- if((getnpctimer(0) >= 120000 ) && (getnpctimer(0) <= 170000 )) set sagecheck,sagecheck-1;
- if(getnpctimer(0) > 170000 ) set sagecheck,sagecheck-2;
- mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + " killed all the monsters!",8;
- donpcevent "jobsage_3rd::OnStart";
- L_NotWin:
- end;
-OnTimer1500:
- mapannounce "job_sage.gat","Examiner: The time limit for this portion of the test is 3 minutes.",8;
- end;
-OnTimer3000:
- mapannounce "job_sage.gat","Examiner: You must kill all the monsters within that time period.",8;
- end;
-OnTimer30000:
- mapannounce "job_sage.gat","Examiner: 2 minutes, 30 seconds remaining.",8;
- end;
-OnTimer60000:
- mapannounce "job_sage.gat","Examiner: 2 minutes remaining.",8;
- end;
-OnTimer90000:
- mapannounce "job_sage.gat","Examiner: 1 minute, 30 seconds remaining.",8;
- end;
-OnTimer120000:
- mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
- end;
-OnTimer150000:
- mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
- end;
-OnTimer170000:
- mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
- end;
-OnTimer180000:
- donpcevent "jobsage_2nd::OnReset";
- mapannounce "job_sage.gat","Examiner: Time has expired.",8;
- end;
-OnTimer181500:
- mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + "has failed the test.",8;
- areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
- end;
-OnTimer183000:
- mapannounce "job_sage.gat","Next candidate, please step forward.",8;
- end;
-OnTimer184000:
- donpcevent "jobsage_wroom::OnEnable";
- stopnpctimer;
- end;
-}
-
-
-//======== Test Step 3
-job_sage.gat,1,1,1 script jobsage_3rd -1,{
- end;
-OnStart:
- donpcevent "jobsage_3rd::OnReset";
- set $@jobsage_m,1;
- monster "job_sage.gat",116,98,"Bachelor",1179,1,"jobsage_3rd::OnKilled";
- monster "job_sage.gat",124,106,"Tardy",1185,1;
- monster "job_sage.gat",124,89,"Loaner",1185,1;
- monster "job_sage.gat",107,89,"Cheater",1185,1;
- monster "job_sage.gat",107,106,"Absentee",1185,1;
- initnpctimer;
- end;
-OnReset:
- end;
-OnKilled:
- set $@jobsage_m,$@jobsage_m-1;
- if( $@jobsage_m > 0 )goto L_NotWin;
- stopnpctimer;
- killmonster "job_sage.gat","All";
- set SAGE_Q,7;
- if(getnpctimer(0) < 20000 ) set sagecheck,sagecheck+1;
- if((getnpctimer(0) >= 30000 ) && (getnpctimer(0) <= 50000 )) set sagecheck,sagecheck-1;
- if(getnpctimer(0) > 50000 ) set sagecheck,sagecheck-2;
- mapannounce "job_sage.gat","Examiner: Congratulations. " + $@jobsage_pname$ + "passed the test!",8;
- donpcevent "jobsage_success::OnSuccess";
- L_NotWin:
- end;
-OnTimer1500:
- mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
- end;
-OnTimer30000:
- mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
- end;
-OnTimer50000:
- mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
- end;
-OnTimer60000:
- donpcevent "jobsage_3rd::OnReset";
- mapannounce "job_sage.gat","Examiner: Time has expired.",8;
- end;
-OnTimer61500:
- mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + "failed the test.",8;
- areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
- end;
-OnTimer63000:
- mapannounce "job_sage.gat","Examiner: This concludes the test. Next candidate, please step forward.",8;
- end;
-OnTimer64000:
- donpcevent "jobsage_wroom::OnEnable";
- stopnpctimer;
- end;
-}
-
-//======== Successful
-job_sage.gat,1,7,1 script jobsage_success 66,{
-OnSuccess:
- killmonster "job_sage.gat","All";
- initnpctimer;
- end;
-OnTimer3000:
- mapannounce "job_sage.gat","Examiner: Please allow me to guide you out.",8;
- end;
-OnTimer6000:
- mapannounce "job_sage.gat","Next candidate, please step forward.",8;
- areawarp "job_sage.gat",100,82,131,113,"yuno_in03.gat",163,180;
- end;
-OnTimer7000:
- donpcevent "jobsage_wroom::OnEnable";
- stopnpctimer;
- end;
-}
-
-//==============================================================================
-// mapflag
-//==============================================================================
-job_sage.gat mapflag nomemo
-job_sage.gat mapflag noteleport
-job_sage.gat mapflag nosave SavePoint
-job_sage.gat mapflag nopenalty
-job_sage.gat mapflag nobranch
-job_sage.gat mapflag noexp
-job_sage.gat mapflag noloot
+//===== eAthena Script =======================================
+//= Sage Job Quest
+//===== By: ==================================================
+//= jAthena (0.9) - I guess
+//= Unknown Translator (1.0)
+//= Darkchild (1.2)
+//===== Current Version: =====================================
+//= 2.0a
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Sage job quest based off of official servers.
+//===== Additional Comments: =================================
+//= Script mostly based on translated jA script
+//= Written test questions/answers weren't translated 100% corectly
+//= So a lot of those are based upon mRO site and my own info
+//= IF you by excident have (or can get) screenshots of these questions
+//= Then PLEASE send them to Darkchild
+//= 1.3 Baby class Support added [Lupus] 1.5 Fixed possible EXP abuse [Lupus]
+//= 1.6 Added a func which prevent advanced classes passing
+//= 2nd Job Quests again. It also guides adv classes where to go. [Lupus]
+//= 1.7 Fixed tuition fee. Fixed some answers, names & typos, added missing labels [Lupus]
+//= 1.7a Moved JFunc back in the main file, fixed typos [Lupus]
+//= 2.0 Changed numbers to constants. [Vicious]
+//= 2.0a Fixed double warp [KarLaeda]
+//============================================================
+
+
+//==================================
+//Sage Castle
+//==================================
+yuno_in02.gat,38,61,4 script Magic Academy Headmaster 743,{
+ callfunc "F_BlockHigh",Job_Mage_High,"High Mage",Job_Professor,"Professor","Keiron";
+ if(BaseJob == Job_Sage) goto L_Menu3_3;
+ if(BaseJob != Job_Mage) goto L_Menu2_1;
+ if(SAGE_Q == 11) goto L_Menu3_1;
+ if(SAGE_Q >= 3) goto L_Menu2_2;
+ mes "[Keiron]";
+ mes "All who appreciate the fine art";
+ mes "of magic are welcome here.";
+ mes "How can I help you?";
+ next;
+ menu "Change class to Sage",L_Menu1_1,"About the Sage class",-,"Just looking around",L_Menu1_2;
+ mes "[Keiron]";
+ mes "So you're interested in being a Sage?";
+ mes "Well, I can't just make you one straight away.";
+ next;
+ mes "[Keiron]";
+ mes "In order to become a Sage, you'll need to file an application for entry into the Shubaichul Magic Academy and take the placement test.";
+ next;
+ mes "[Keiron]";
+ mes "Once you're placed, you'll need to complete coursework and finally write and defend a thesis.";
+ next;
+ mes "[Keiron]";
+ mes "If you successfully complete the requirements, you'll be granted a Sage license.";
+ next;
+ mes "[Keiron]";
+ mes "If you wish to apply, go see Mathias in the Shubaichul Magic Academy.";
+ mes "Tell him I sent you.";
+ close;
+L_Menu1_1:
+ mes "[Keiron]";
+ mes "A Sage?";
+ mes "Well...";
+ mes "In order to change you way of living, you have to change your way of thinking.";
+ next;
+ mes "[Keiron]";
+ mes "Sages actively contribute knowledge to the kingdom through rigorous research.";
+ mes "They also help society through its worst problems.";
+ mes "Just because you dress as a Sage doesn't mean you're a Sage.";
+ next;
+ mes "[Keiron]";
+ mes "To become a Sage, please apply for entry into the Shubaichul Magic Academy.";
+ mes "The admissions officer will explain the educational requirements.";
+ close;
+L_Menu1_2:
+ mes "[Keiron]";
+ mes "Excellent. If you have some free time, why not peruse a a volume from our library?";
+ mes "Our library is truly a bastion of knowledge.";
+ next;
+ mes "[Keiron]";
+ mes "Of course, there is much that can't be learned from reading books, but it's a good start.";
+ close;
+L_Menu2_1:
+ mes "[Keiron]";
+ mes "We Sages do a lot of research about the world on our own,";
+ mes "but to maximize our knowledge,";
+ mes "we regularly form interdisciplinary research teams.";
+ next;
+ mes "[Keiron]";
+ mes "You should talk to our Sages and share any research you may have been doing within your own profession.";
+ close;
+L_Menu2_2:
+ mes "[Keiron]";
+ mes "The road to becoming a Sage isn't easy.";
+ mes "You need to have a strong dedication to mastering magic.";
+ next;
+ mes "[Keiron]";
+ mes "You need to keep plugging away at that thesis.";
+ mes "Good luck!";
+ close;
+L_Menu3_1:
+ if(countitem(1550) >= 1) goto L_Menu3_2;
+ mes "[Keiron]";
+ mes "Where's your thesis?";
+ mes "I'm eager to evaulate it.";
+ next;
+ mes "[Keiron]";
+ mes "Did you forget it?";
+ mes "In any case, please bring it post-haste.";
+ close;
+L_Menu3_2:
+ mes "[Keiron]";
+ mes "It looks like you have a thesis to present. Let's have a look...";
+ next;
+ mes "[Keiron]";
+ mes "Hmmm...";
+ next;
+ mes "[Keiron]";
+ mes "Yes....";
+ next;
+ mes "[Keiron]";
+ mes "Interesting...";
+ next;
+ mes "[Keiron]";
+ mes "It's not stylistically";
+ mes "cohesive, but your zeal for research is amply proven by your thesis. I approve.";
+ next;
+ if(SkillPoint == 0) goto LCHANGE;
+ mes "[Keiron]";
+ mes "Well you are all set for the jobchange except for 1 thing!";
+ mes "You have unused Skill Points!!!";
+ mes "Please use those first!";
+ close;
+
+ LCHANGE:
+ callfunc "Job_Change",Job_Sage;
+ callfunc "F_ClearJobVar";
+ mes "[Keiron]";
+ mes "Congratulations!";
+ mes "You're a Sage now.";
+ mes "Don't let that passion for research ever be dampened.";
+ next;
+ mes "[Keiron]";
+ mes "Keep your thesis around, since it may be useful in a publish-or-perish environment later on.";
+ next;
+ mes "[Keiron]";
+ mes "Some day, you'll be a bastion of knowledge all by yourself!";
+ close;
+L_Menu3_3:
+ mes "[Keiron]";
+ mes "Hmmm? What's up?";
+ mes "Just because you're a Sage doesn't mean you should quit your studies.";
+ next;
+ mes "[Keiron]";
+ mes "In order to maintain our role as the kingdom's gatherers and dissemenators of knowledge, we can never miss an opportunity to gather data.";
+ close;
+}
+
+//===============================
+//Biotech Lab
+//===============================
+yuno_in03.gat,244,31,3 script Physics Professor 120,{
+ if(BaseJob == Job_Sage) goto L_Menu3_2;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 11) goto L_Menu3_1;
+ if(SAGE_Q2 == 8) goto L_Menu2_1;
+ if(SAGE_Q2 == 9) goto L_Menu2_3;
+ if(SAGE_Q2 == 10) goto L_Menu2_5;
+ if(SAGE_Q2 == 11) goto L_ThesisStart1;
+ if(SAGE_Q == 9) goto L_Menu1_2;
+ mes "[Ebeshi]";
+ mes "What?";
+ next;
+ mes "[Ebeshi]";
+ mes "Did you come to study under my guidance?";
+ next;
+ mes "[Ebeshi]";
+ mes "Well, you need to enroll first.";
+ mes "Heheheheh...";
+ close;
+L_Menu1_1:
+ mes "[Ebeshi]";
+ mes "Eh???????????????????????????????";
+ next;
+ mes "[Ebeshi]";
+ mes "I don't think there's anything someone like you can learn from me.";
+ next;
+ mes "[Ebeshi]";
+ mes "Are you disappointed?";
+ mes "Hehehehe....";
+ close;
+L_Menu1_2:
+ set SAGE_Q2,8;
+ mes "[Ebeshi]";
+ mes "Well, I'm glad to meet another fine student such as yourself.";
+ next;
+ mes "[Ebeshi]";
+ mes "Aren't you excited that you're going to study under me?!";
+ mes "Hehehehe....";
+ next;
+ mes "[Ebeshi]";
+ mes "I hate to be intrusive, but could you get something for me before I start my class?";
+ next;
+ mes "[Ebeshi]";
+ mes "I need ^3051FD30x Stone^000000 as part of the class materials.";
+ mes "Can you get that?";
+ next;
+ mes "[Ebeshi]";
+ mes "If you really want to get stones quick,";
+ mes "you should look up a friendly thief to assist you! Thanks for helping out.";
+ close;
+L_Menu2_1:
+ if(countitem(7049) >= 30) goto L_Menu2_2;
+ mes "[Ebeshi]";
+ mes "Hey, what are you up to?";
+ mes "Are you trying to slack off?";
+ mes "Come on, set your eyes on the goal.";
+ next;
+ mes "[Ebeshi]";
+ mes "I need ^3051FD30x Stone^000000 to proceed.";
+ mes "With all the stones lying around,";
+ mes "shouldn't they be easy to find?";
+ close;
+ L_Menu2_2:
+ mes "[Ebeshi]";
+ mes "Awesome! You've got all the stones I need.";
+ mes "Now, watch this!";
+ next;
+ mes "[Ebeshi]";
+ mes "Abracadabra!!";
+ next;
+ mes "[Ebeshi]";
+ mes "Abracadabra!!";
+ next;
+ mes "[Ebeshi]";
+ mes "Abracadabra!!";
+ next;
+ delitem 7049,30;
+ set SAGE_Q2,9;
+ mes "[Ebeshi]";
+ mes "You see that?";
+ mes "I created three elemental stones!";
+ next;
+ mes "[Ebeshi]";
+ mes "Pretty cool, don't you think?";
+ mes "Have them for yourself!";
+ next;
+ getitem 991,1;
+ getitem 993,1;
+ getitem 992,1;
+ mes "[Ebeshi]";
+ mes "Now, for your next lesson, you need to synthesize some different kinds of arrows with those stones.";
+ next;
+ mes "[Ebeshi]";
+ mes "Specifically...";
+ mes "^3051FD50x Crystal Arrow^000000";
+ mes "^3051FD50x Stone Arrow^000000";
+ mes "^3051FD50x Wind Arrow^000000";
+ next;
+ mes "[Ebeshi]";
+ mes "An archer friend can help you make the arrows.";
+ mes "Give it a try!";
+ close;
+ L_Menu2_3:
+ if((countitem(1754) >= 50) && (countitem(1756) >= 50) && (countitem(1755) >= 50)) goto L_Menu2_4;
+ mes "[Ebeshi]";
+ mes "Hmmm?";
+ mes "What did you do with those stones I gave you?";
+ mes "You didn't sell them, I hope...";
+ next;
+ mes "[Ebeshi]";
+ mes "You need to use them to make";
+ mes "^3051FD50x Crystal Arrow^000000";
+ mes "^3051FD50x Stone Arrow^000000";
+ mes "^3051FD50x Wind Arrow^000000";
+ mes "An archer friend can help you make the arrows.";
+ close;
+ L_Menu2_4:
+ mes "[Ebeshi]";
+ mes "You made the arrows! Good job.";
+ mes "Now, to continue with the lesson...";
+ next;
+ mes "[Ebeshi]";
+ mes "This lesson covers the Elemental Affinity chapter in your textbook.";
+ next;
+ mes "[Ebeshi]";
+ mes "The first affinity is really easy.";
+ mes "Water magic is very effective against fire.";
+ mes "It's easy to remember.";
+ mes "All you need to remember is water being splashed on fire.";
+ next;
+ mes "[Ebeshi]";
+ mes "Wind magic will decimate water-based monsters.";
+ mes "Observe what happens when a lake is struck by lightning.";
+ next;
+ mes "[Ebeshi]";
+ mes "Earth magic will crush wind-based monsters easily.";
+ mes "Don't you build a house on a strong foundation to keep the wind away?";
+ next;
+ mes "[Ebeshi]";
+ mes "Fire magic mercilessly scorches the earth.";
+ mes "Won't a tree burn if a fire breaks out?";
+ mes "Same with an earth-based monster.";
+ next;
+ mes "[Ebeshi]";
+ mes "Do you understand?";
+ mes "Here's some homework for next time...";
+ next;
+ delitem 1754,50;
+ delitem 1756,50;
+ delitem 1755,50;
+ set SAGE_Q2,10;
+ mes "[Ebeshi]";
+ mes "Next time you come, bring ^3051FD1x Holy Water^000000.";
+ mes "We'll need it for the lesson.";
+ mes "It will be easy to acquire if you have contacts in the church.";
+ close;
+ L_Menu2_5:
+ if(countitem(523) >= 1) goto L_Menu2_6;
+ mes "[Ebeshi]";
+ mes "Ooops!";
+ mes "Did you forget about the item I asked you to bring?";
+ next;
+ mes "[Ebeshi]";
+ mes "I need ^3051FD1x Holy Water^000000 for the lesson.";
+ mes "Ask an Acolyte to help you make it.";
+ mes "Hehehehe...";
+ close;
+ L_Menu2_6:
+ mes "[Ebeshi]";
+ mes "Alright, you have the Holy Water!";
+ mes "Let's continue the lesson!";
+ next;
+ mes "[Ebeshi]";
+ mes "Please take good notes about this part.";
+ mes "It will be on the test.";
+ next;
+ mes "[Ebeshi]";
+ mes "Water magic sucks against wind!";
+ mes "Would a lightning bolt care if it was frozen?";
+ mes "Heheheheh....";
+ next;
+ mes "[Ebeshi]";
+ mes "Wind magic is totally useless against the earth.";
+ mes "Will a tree suffer permanent damage if it's blown about?";
+ next;
+ mes "[Ebeshi]";
+ mes "Earth magic is ineffective against fire.";
+ mes "If you put some leaves on a fire, will the fire go out?";
+ mes "No, just the opposite will happen.";
+ next;
+ mes "[Ebeshi]";
+ mes "Fire won't do much against water.";
+ mes "If you heat water, doesn't it just become more dangerous?";
+ next;
+ mes "[Ebeshi]";
+ mes "That was a pretty informative lecture!";
+ mes "You think so too, right?";
+ next;
+ delitem 523,1;
+ set SAGE_Q2,11;
+ mes "[Ebeshi]";
+ mes "Now, you have enough knowledge to prepare a defensible thesis.";
+ mes "Hehehehehe!";
+ next;
+ mes "[Ebeshi]";
+ mes "To put the thesis together, you'll need:";
+ mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
+ mes "^3051FD1x Animal Skin^000000 for the pages.";
+ mes "^3051FD1x Trunk^000000 to bind the pages.";
+ mes "^3051FD1x Squid Ink^000000 for your ink.";
+ mes "^3051FD1x Empty Bottle^000000 to store your ink.";
+ next;
+ mes "[Ebeshi]";
+ mes "Come and see me once you've gotten all of these items together.";
+ close;
+ L_ThesisStart1:
+ if((countitem(916) >= 1) && (countitem(919) >= 1) && (countitem(1019) >= 1) && (countitem(1024) >= 1) && (countitem(713) >= 1)) goto L_ThesisStart2;
+ mes "[Ebeshi]";
+ mes "Hmmm?";
+ mes "You can't forget important things like this!";
+ next;
+ mes "[Ebeshi]";
+ mes "You need these items to start your thesis:";
+ mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
+ mes "^3051FD1x Animal Skin^000000 for the pages.";
+ mes "^3051FD1x Trunk^000000 to bind the pages.";
+ mes "^3051FD1x Squid Ink^000000 for your ink.";
+ mes "^3051FD1x Empty Bottle^000000 to store your ink.";
+ next;
+ mes "[Ebeshi]";
+ mes "Do you have some friends that might be able to help you gather the materials?";
+ mes "That will make it a simple task!";
+ close;
+ L_ThesisStart2:
+ delitem 916,1;
+ delitem 919,1;
+ delitem 1019,1;
+ delitem 1024,1;
+ delitem 713,1;
+ mes "[Ebeshi]";
+ mes "Alright...";
+ mes "You need to write this yourself.";
+ mes "I'm simply your research advisor!";
+ mes "Hehehehe...";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "Elemental magic is divided into four types...";
+ menu "...called Fire, Wind, Water, and Earth",L_ThesisMenu1_1,"...named Fire, Wind, Water, and Earth",L_ThesisMenu1_2,"...that oppose each other Fire, Wind, Water, and Earth",L_ThesisMenu1_3;
+ L_ThesisMenu1_1:
+ mes "...called Fire, Wind, Water, and Earth";
+ goto L_Thesis2;
+ L_ThesisMenu1_2:
+ mes "...named Fire, Wind, Water, and Earth";
+ goto L_Thesis2;
+ L_ThesisMenu1_3:
+ mes "...that oppose each other: Fire, Wind, Water, and Earth";
+ goto L_Thesis2;
+ L_Thesis2:
+ mes "Each attribute has certain properties.";
+ menu "Wind conquers water...",L_ThesisMenu2_1,"Water douses fire...",L_ThesisMenu2_2,"Fire scorches Earth...",L_ThesisMenu2_3;
+ L_ThesisMenu2_1:
+ mes "Wind conquers Water and Earth attacks Wind";
+ goto L_Thesis3;
+ L_ThesisMenu2_2:
+ mes "Water douses fire, while Wind zaps Water";
+ goto L_Thesis3;
+ L_ThesisMenu2_3:
+ mes "Fire scorches Earth, and Water douses Fire.";
+ goto L_Thesis3;
+ L_Thesis3:
+ menu "But weaknesses exist, too",L_ThesisMenu3_1,"You can customize your weapon element, also",L_ThesisMenu3_2,"Elemental affinity varies by monster type, also",L_ThesisMenu3_3;
+ L_ThesisMenu3_1:
+ mes "But weaknesses exist, too";
+ goto L_Thesis4;
+ L_ThesisMenu3_2:
+ mes "You can customize your weapon element, also";
+ goto L_Thesis4;
+ L_ThesisMenu3_3:
+ mes "Elemental affinity varies by monster type, also";
+ goto L_Thesis4;
+ L_Thesis4:
+ menu "You need to be circumspect when facing monsters...",L_ThesisMenu4_1,"So, you should customize your weapon to the situation",L_ThesisMenu4_2,"Red Potions have a delicious strawberry flavor",L_ThesisMenu4_3;
+ L_ThesisMenu4_1:
+ mes "You need to be circumspect when facing monster with an unfamiliar affinity.";
+ goto L_Thesis5;
+ L_ThesisMenu4_2:
+ mes "You should customize your weapon to the situation.";
+ goto L_Thesis5;
+ L_ThesisMenu4_3:
+ mes "Red Potions have a delicious strawberry flavor.";
+ goto L_Thesis5;
+ L_Thesis5:
+ next;
+ menu "Eimi of Prontera is hot",L_ThesisMenu5_1,"I wonder how Red Potions are made",L_ThesisMenu5_2,"The complexity of magic exceeds man's capacity to learn",L_ThesisMenu5_3;
+ L_ThesisMenu5_1:
+ mes "Eimi of Prontera is hot.";
+ goto L_Thesis6;
+ L_ThesisMenu5_2:
+ mes "I wonder how Red Potions are made.";
+ goto L_Thesis6;
+ L_ThesisMenu5_3:
+ mes "The complexity of magic exceeds man's capacity to learn.";
+ goto L_Thesis6;
+ L_Thesis6:
+ menu "The women in Morok are hot, too",L_ThesisMenu6_1,"Maybe it's a secret recipe",L_ThesisMenu6_2,"It's dangerous to depend on magic too much...",L_ThesisMenu6_3;
+ L_ThesisMenu6_1:
+ mes "The women in Morok are hot, too.";
+ goto L_Thesis7;
+ L_ThesisMenu6_2:
+ mes "Maybe it's a secret recipe.";
+ goto L_Thesis7;
+ L_ThesisMenu6_3:
+ mes "It's dangerous to depend on magic too much...";
+ goto L_Thesis7;
+ L_Thesis7:
+ menu "I wish I had a Bunny Band",L_ThesisMenu7_1,"That taste of a White potion...",L_ThesisMenu7_2,"...if you want to stay safe. power...",L_ThesisMenu7_3;
+ L_ThesisMenu7_1:
+ mes "I wish I had a Bunny Band.";
+ goto L_Thesis8;
+ L_ThesisMenu7_2:
+ mes "The taste of a White Potion...";
+ goto L_Thesis8;
+ L_ThesisMenu7_3:
+ mes "...if you want to stay safe. power...";
+ goto L_Thesis8;
+ L_Thesis8:
+ menu "That would make me happy",L_ThesisMenu8_1,"...is difficult to imagine",L_ThesisMenu8_2,"In the interest of a safe battle...",L_ThesisMenu8_3;
+ L_ThesisMenu8_1:
+ mes "That would make me happy.";
+ goto L_Thesis9;
+ L_ThesisMenu8_2:
+ mes "...is difficult to imagine";
+ goto L_Thesis9;
+ L_ThesisMenu8_3:
+ mes "In the interest of a safe battle...";
+ goto L_Thesis9;
+ L_Thesis9:
+ menu "Bunny Bands make great Acolyte accessories",L_ThesisMenu9_1,"It makes me wonder if...",L_ThesisMenu9_2,"...you should bring along friends",L_ThesisMenu9_3;
+ L_ThesisMenu9_1:
+ mes "Bunny Bands make great Acolyte accessories.";
+ goto L_Thesis10;
+ L_ThesisMenu9_2:
+ mes "It makes me wonder if...";
+ goto L_Thesis10;
+ L_ThesisMenu9_3:
+ mes "...you should bring along friends.";
+ goto L_Thesis10;
+ L_Thesis10:
+ menu "I wonder if a Knight could wear one, too",L_ThesisMenu10_1,"...people might drink them when they're not hurt",L_ThesisMenu10_2,"It's the responsible thing to do",L_ThesisMenu10_3;
+ L_ThesisMenu10_1:
+ mes "I wonder if a Knight could wear one, too.";
+ next;
+ goto L_ThesisEnd;
+ L_ThesisMenu10_2:
+ mes "...people might drink them when they're not hurt";
+ next;
+ goto L_ThesisEnd;
+ L_ThesisMenu10_3:
+ mes "It's the responsible thing to do.";
+ next;
+ goto L_ThesisEnd;
+ L_ThesisEnd:
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ set SAGE_Q,11;
+ getitem 1550,1;
+ mes "[Ebeshi]";
+ mes "Alright!";
+ mes "You've finished! It looks pretty good!";
+ next;
+ mes "[Ebeshi]";
+ mes "You should take that to the Headmaster!";
+ mes "He'll decide whether you graduate or not.";
+ mes "Hehehehehe....";
+ close;
+L_Menu3_1:
+ mes "[Ebeshi]";
+ mes "What's up? Did you forget something?!";
+ next;
+ mes "[Ebeshi]";
+ mes "You should see the Headmaster and present your thesis so you can graduate!";
+ close;
+L_Menu3_2:
+ mes "[Ebeshi]";
+ mes "Good afternoon!";
+ mes "It's good to meet other Sages and exchange information.";
+ mes "Heheheheh!!";
+ next;
+ mes "[Ebeshi]";
+ mes "Even though company is good sometimes, I need to continue my magical research!";
+ next;
+ mes "[Ebeshi]";
+ mes "Do you want to continue your study here?";
+ mes "Please feel free to talk to the other professors and read the literature here.";
+ mes "Hehehehe!";
+ close;
+}
+
+//==================================
+//Monster Museum
+//==================================
+
+yuno_in03.gat,32,102,0 script Biology Professor 755,{
+ if(BaseJob == Job_Sage) goto L_Menu5_4;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 11) goto L_Menu5_3;
+ if((SAGE_Q2 >= 1) && (SAGE_Q2 <= 3)) goto L_Menu3_1;
+ if((SAGE_Q2 >= 4) && (SAGE_Q2 <= 6)) goto L_Menu4_1;
+ if(SAGE_Q2 == 7) goto L_Menu5_1;
+ if(SAGE_Q == 8) goto L_Menu2_1;
+ mes "[Lucias]";
+ mes "I have a headache...";
+ mes "I've got too many things going on at once!";
+ next;
+ mes "[Lucias]";
+ mes "Of course, I'll teach people about biology even with a headache!";
+ close;
+L_Menu1_1:
+ mes "[Lucias]";
+ mes "Hmmm? Are you just poking around?";
+ next;
+ mes "[Lucias]";
+ mes "That's fine, but please don't touch anything.";
+ mes "We keep dangerous bioagents in here!";
+ next;
+ mes "[Lucias]";
+ mes "If you have information about rare monsters, we'll pay you handsomely.";
+ close;
+L_Menu2_1:
+ mes "[Lucias]";
+ mes "Oh, you've taken the placement test?";
+ mes "I'm Lucias, a preeminent researcher in the biological sciences.";
+ next;
+ mes "[Lucias]";
+ mes "What's your name, young one?";
+ next;
+ menu "I'm " + strcharinfo(0) + "!",-;
+ mes "[Lucias]";
+ mes "That's a nice name.";
+ mes "Now, let me explain about our research objectives.";
+ next;
+ mes "[Lucias]";
+ mes "My area of expertise is monsters.";
+ mes "I'm sure that you've encountered and defeated many monsters by now.";
+ mes "Am I right?";
+ next;
+ menu "You're quite right",-,"Well, not really...",L_Menu2_2;
+ mes "[Lucias]";
+ mes "Really?";
+ mes "I hope your background knowledge is diverse.";
+ mes "My class isn't a cakewalk by any means.";
+ next;
+ goto L_Menu2_3;
+ L_Menu2_2:
+//==================================
+//If you respond negatively
+ mes "[Lucias]";
+ mes "You might be at a disadvantage.";
+ mes "My coursework assumes a lot of background knowledge.";
+ mes "My class wasn't designed to be a cakewalk...";
+ next;
+//==================================
+L_Menu2_3:
+ mes "[Lucias]";
+ mes "So, shall we get started?";
+ mes "You'll learn a lot in this class if you're vigilant.";
+ next;
+ set @sagerand,0;
+ set @sagerand,rand(3);
+ mes "[Lucias]";
+ mes "So, first, you need to collect ";
+ if(@sagerand == 1) goto L_Menu2_4;
+ if(@sagerand == 2) goto L_Menu2_5;
+ set SAGE_Q2,1;
+ mes "^3051FD5x Tendons^000000";
+ mes "^3051FD5x Nippers^000000";
+ mes "^3051FD5x Sharp Scales^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu2_4:
+ set SAGE_Q2,2;
+//==================================
+//mes–¢‰ñŽû
+ mes "^3051FD5x Clam Flesh^000000";
+ mes "^3051FD5x Nippers^000000";
+ mes "^3051FD5x Heart of Mermaid^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu2_5:
+ set SAGE_Q2,3;
+ mes "^3051FD5x Single Cells^000000";
+ mes "^3051FD5x Tentacles^000000";
+ mes "^3051FD5x Fish Tails^000000";
+//==================================
+ next;
+ L_Menu2_6:
+ mes "[Lucias]";
+ mes "We'll continue once you've gathered those.";
+ close;
+L_Menu3_1:
+ if((countitem(1050) >= 5) && (countitem(960) >= 5) && (countitem(963) >= 5) && (SAGE_Q2 == 1)) goto L_Menu3_4;
+ if((countitem(966) >= 5) && (countitem(960) >= 5) && (countitem(950) >= 5) && (SAGE_Q2 == 2)) goto L_Menu3_4;
+ if((countitem(1052) >= 5) && (countitem(962) >= 5) && (countitem(1023) >= 5) && (SAGE_Q2 == 3)) goto L_Menu3_4;
+ mes "[Lucias]";
+ mes "You don't have the necessary items.";
+ mes "Let me repeat what you need:";
+ next;
+ mes "[Lucias]";
+ if(SAGE_Q2 == 2) goto L_Menu3_2;
+ if(SAGE_Q2 == 3) goto L_Menu3_3;
+ mes "^3051FD5x Tendon^000000";
+ mes "^3051FD5x Nipper^000000";
+ mes "^3051FD5x Sharp Scale^000000";
+ close;
+ L_Menu3_2:
+ mes "^3051FD5x Clam Flesh^000000";
+ mes "^3051FD5x Nipper^000000";
+ mes "^3051FD5x Heart of Mermaid^000000";
+ close;
+ L_Menu3_3:
+ mes "^3051FD5x Single Cell^000000";
+ mes "^3051FD5x Tentacle^000000";
+ mes "^3051FD5x Fish Tail^000000";
+ close;
+L_Menu3_4:
+ mes "[Lucias]";
+ mes "Well, you have the items, but I can't be sure if you bought them or collected them yourself.";
+ next;
+ mes "[Lucias]";
+ mes "There is a similarity in the characteristics of the monsters that drop those items.";
+ mes "Do you know what it is?";
+ next;
+ menu "Water element affinity",L_Menu3_5,"They're fish and shells",L_Menu3_6,"They were quite active",-,"They're monsters",-;
+//==================================
+ mes "[Lucias]";
+ mes "...I'm disappointed in you.";
+ mes "The correct answer is that all of the monsters have water element affinity.";
+ mes "Monsters that live in an aquatic environment have evolved bodies adapted to that environment.";
+//==================================
+ next;
+ goto L_Menu3_6;
+ L_Menu3_5:
+ mes "[Lucias]";
+ mes "Right!";
+ mes "Most aquatic monsters have water element affinity because they're adapted to their environment.";
+ mes "Fish and shells evolved in a logical way.";
+ next;
+ L_Menu3_6:
+ mes "[Lucias]";
+ mes "Not every fish and shell has water element affinity, but you can count on it as a general rule.";
+ mes "Now, which type of magic do you think would be most effective against them?";
+ next;
+ menu "Lightning Bolt",L_Menu3_7,"Firebolt",-,"Thunderstorm",L_Menu3_8,"Frost Nova",-;
+//==================================
+//mes–¢‰ñŽû
+ mes "[Lucias]";
+ mes "That's not correct.";
+ mes "You need to use magic like Lightning Bolt or Thunderstorm.";
+ mes "Check the elemental affinity matrix again.";
+ next;
+//==================================
+ goto L_Menu3_9;
+ L_Menu3_7:
+ mes "[Lucias]";
+ mes "Great! That's right!";
+ mes "Using Lightning Bolt is an easy way to victory.";
+ next;
+ mes "[Lucias]";
+ mes "You need to be careful of monsters like the Penomena and Aster because their attribute is different.";
+ next;
+ goto L_Menu3_9;
+ L_Menu3_8:
+ mes "[Lucias]";
+ mes "Great! That's right!";
+ mes "Using Thunderstorm is an easy way to victory.";
+ next;
+ mes "[Lucias]";
+ mes "You need to be careful of monsters like the Penomena and Aster because their attribute is different.";
+ next;
+ L_Menu3_9:
+ mes "[Lucias]";
+ mes "Next, let's turn our attention to insectoid monsters.";
+ next;
+ set @sagerand,rand(3);
+ mes "[Lucias]";
+ mes "Next, you need to collect ";
+ if(@sagerand == 1) goto L_Menu3_10;
+ if(@sagerand == 2) goto L_Menu3_11;
+ set SAGE_Q2,4;
+ mes "^3051FD5x Cobweb^000000";
+ mes "^3051FD5x Shell^000000";
+ mes "^3051FD5x Insect Feeler^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu3_10:
+ set SAGE_Q2,5;
+//==================================
+//mes–¢‰ñŽû
+ mes "^3051FD5x Moth Dust^000000";
+ mes "^3051FD5x Snail's Shell^000000";
+ mes "^3051FD5x Horn^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu3_11:
+ set SAGE_Q2,6;
+ mes "^3051FD5x Mantis Leg^000000";
+ mes "^3051FD5x Worm Peeling^000000";
+ mes "^3051FD5x Rainbow Shell^000000";
+//==================================
+ next;
+ goto L_Menu2_6;
+L_Menu4_1:
+ if((countitem(1025) >= 5) && (countitem(935) >= 5) && (countitem(928) >= 5) && (SAGE_Q2 == 4)) goto L_Menu4_4;
+ if((countitem(1057) >= 5) && (countitem(946) >= 5) && (countitem(947) >= 5) && (SAGE_Q2 == 5)) goto L_Menu4_4;
+ if((countitem(1031) >= 5) && (countitem(955) >= 5) && (countitem(1013) >= 5) && (SAGE_Q2 == 6)) goto L_Menu4_4;
+ mes "[Lucias]";
+ mes "You forgot what you're supposed to gather?";
+ mes "Listen carefully this time! You need to gather:";
+ next;
+ mes "[Lucias]";
+ if(SAGE_Q2 == 5) goto L_Menu4_2;
+ if(SAGE_Q2 == 6) goto L_Menu4_3;
+ mes "^3051FD5x Cobweb^000000";
+ mes "^3051FD5x Shell^000000";
+ mes "^3051FD5x Insect Feeler^000000";
+ close;
+ L_Menu4_2:
+ mes "^3051FD5x Moth Dust^000000";
+ mes "^3051FD5x Snail's Shell^000000";
+ mes "^3051FD5x Horn^000000";
+ close;
+ L_Menu4_3:
+ mes "^3051FD5x Mantis Leg^000000";
+ mes "^3051FD5x Worm Peeling^000000";
+ mes "^3051FD5x Rainbow Shell^000000";
+ close;
+L_Menu4_4:
+ set SAGE_Q2,7;
+ mes "[Lucias]";
+ mes "Excellent. You've done well.";
+ mes "I hope you were also dilligent in observing your surroundings when you collected the items.";
+ next;
+ mes "[Lucias]";
+ mes "With insects, you'll need to carefully consider which magic to use, since insects have affinity with a variety of elements.";
+ next;
+ mes "[Lucias]";
+ mes "You should also be aware that Thief hiding and Assassin cloaking aren't effective against some insects.";
+ next;
+ mes "[Lucias]";
+ mes "Insects can also act in groups.";
+ mes "Often the insect bosses will have considerable numbers of subordinates.";
+ next;
+ mes "[Lucias]";
+ mes "Ant Lord Maya...";
+ mes "Queen Bee Mistress...";
+ mes "Goblin Chief Goldfinger...";
+ next;
+ mes "[Lucias]";
+ mes "If you face a boss monster alone, you had best prepare to die.";
+ mes "You ought to take a group of friends to face these creatures down.";
+ next;
+ mes "[Lucias]";
+ mes "Well, you've studied quite a bit.";
+ mes "Now you need to write a thesis.";
+ mes "You need some materials before you can begin writing it, however.";
+ mes "They are:";
+ next;
+ mes "[Lucias]";
+ mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
+ mes "^3051FD1x Animal Skin^000000 for the pages.";
+ mes "^3051FD1x Trunk^000000 to bind the pages.";
+ mes "^3051FD1x Squid Ink^000000 for your ink.";
+ mes "^3051FD1x Empty Bottle^000000 to store your ink.";
+ next;
+ mes "[Lucias]";
+ mes "We can get started when you return.";
+ close;
+L_Menu5_1:
+ if((countitem(916) >= 1) && (countitem(919) >= 1) && (countitem(1019) >= 1) && (countitem(1024) >= 1) && (countitem(713) >= 1) && (SAGE_Q2 == 7)) goto L_Menu5_2;
+ mes "[Lucias]";
+ mes "You need to gather those items first.";
+ mes "They are:";
+ next;
+ mes "[Lucias]";
+ mes "^3051FD1x Feather of Birds^000000 for your writing instrument.";
+ mes "^3051FD1x Animal Skin^000000 for the pages.";
+ mes "^3051FD1x Trunk^000000 to bind the pages.";
+ mes "^3051FD1x Squid Ink^000000 for your ink.";
+ mes "^3051FD1x Empty Bottle^000000 to store your ink.";
+ next;
+ mes "[Lucias]";
+ mes "You've done great so far.";
+ mes "Just a little more and you can graduate.";
+ close;
+L_Menu5_2:
+ delitem 916,1;
+ delitem 919,1;
+ delitem 1019,1;
+ delitem 1024,1;
+ delitem 713,1;
+ mes "[Lucias]";
+ mes "Looks like you have everything.";
+ next;
+ mes "[Lucias]";
+ mes "Now, you need to write this yourself.";
+ mes "I'm only taking an advisory role.";
+ next;
+ mes "[Lucias]";
+ mes "Are you ready to begin?";
+ mes "Let's see if you've acquired enough knowledge to write a coherent thesis.";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ menu "Monsters come in different types",-;
+ mes "Monsters come in different types.";
+ menu "They have different elemental affinities",-;
+ mes "They have different elemental affinities.";
+ menu "If you know the monster's element beforehand...",-;
+ mes "If you know the monster's element beforehand...";
+ menu "...you can optimize your battle experience",-;
+ mes "...you can optimize your battle experience";
+ menu "You should especially be careful of...",-;
+ mes "You should especially be careful of...";
+ menu "...monsters with Holy and Darkness affinity",-;
+ mes "...monsters with Holy and Darkness affinity";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "......";
+ next;
+ set SAGE_Q,11;
+ getitem 1550,1;
+ mes "[Lucias]";
+ mes "This is pretty good!";
+ mes "I'm proud of you!";
+ next;
+ mes "[Lucias]";
+ mes "Show this to the Headmaster and you'll be sure to graduate.";
+ mes "Good luck.";
+ close;
+L_Menu5_3:
+ mes "[Lucias]";
+ mes "Hmmm? What's the matter?";
+ mes "You need to show your thesis to the Headmaster.";
+ close;
+L_Menu5_4:
+ mes "[Lucias]";
+ mes "Are you confused about something?";
+ mes "I'm pretty busy, so you need to make an appointment a week in advance.";
+ next;
+ mes "[Lucias]";
+ mes "Hahaha...Once you've been a Sage for awhile, you'll be saying the same thing.";
+ next;
+ mes "[Lucias]";
+ mes "Also, if you have some spare time,";
+ mes "you should head over to the dungeon and lie down on the floor.";
+ mes "Look up and study the ceiling.";
+ mes "You might learn something.";
+ close;
+}
+
+//=================================
+//Academy Interior
+//=================================
+
+yuno_in03.gat,154,35,4 script Academy Staff 742,{
+ callfunc "F_BlockHigh",26,"High Mage",40,"Professor","Mathias";
+
+ if(BaseJob == Job_Sage) goto L_Menu6_4;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 11) goto L_Menu6_3;
+ if(SAGE_Q >= 4) goto L_Menu6_2;
+ if(SAGE_Q == 3) goto L_Menu6_1;
+ if(SAGE_Q == 2) goto L_Menu5_1;
+ mes "[Mathias]";
+ mes "Hello.";
+ mes "This is the Shubaichul Magic Academy?";
+ mes "You seem to be a Magician.";
+ mes "How can I help you?";
+ next;
+ menu "Sage class-change information",-,"I want to apply for admission to the Academy",L_Menu3_1,"Forget it",L_Menu2;
+ mes "[Mathias]";
+ mes "You want to change class to Sage?";
+ mes "I can't just change your class right here.";
+ next;
+ mes "[Mathias]";
+ mes "You need to complete a program of rigorous coursework and research.";
+ next;
+ mes "[Mathias]";
+ mes "Once you graduate from the academy,";
+ mes "you can change class.";
+ mes "In order to proceed, you need to pay tuition and take the placement test.";
+ next;
+ mes "[Mathias]";
+ mes "Only those who have an ^3051FDOld Magic Book^000000 and a ^3051FDNecklace Of Wisdom^000000 can have tuition waived.";
+ next;
+ mes "[Mathias]";
+ mes "Once you've paid the fee, you first take the placement test.";
+ mes "If you score highly enough to be placed in our program, you then perform research according to your placement.";
+ mes "Finally, you must prepare and defend a thesis.";
+ next;
+ mes "[Mathias]";
+ mes "The Headmaster decides whether or not the thesis meets standards for graduation.";
+ mes "If he approves, you can formally begin your career as a Sage.";
+ next;
+ mes "[Mathias]";
+ mes "If you're interested, you need only file an application to get started.";
+ mes "Have a good day.";
+ close;
+L_Menu2:
+ mes "[Mathias]";
+ mes "Oh?";
+ mes "Are you hesitant?";
+ mes "See you later, then.";
+ close;
+L_Menu1_1:
+ mes "[Mathias]";
+ mes "Welcome.";
+ mes "This is Shubaichul Magic Academy.";
+ next;
+ mes "[Mathias]";
+ mes "We do research on magic and monsters here.";
+ mes "We also train fledgling Sages.";
+ next;
+ mes "[Mathias]";
+ mes "Any Magician who is at or above class level 40 can apply for admission to the Academy.";
+ mes "Once you complete our prescribed process for degree acquisition, you can become a Sage.";
+ next;
+ mes "[Mathias]";
+ mes "Good bye.";
+ close;
+L_Menu3_1:
+ mes "[Mathias]";
+ mes "You want to apply? Wonderful!";
+ next;
+ mes "[Mathias]";
+ mes "In order to enter the Academy,";
+ mes "you need to be a Magician of class level 40 or above.";
+ mes "You will also need to pay tuition to cover instruction and materials.";
+ next;
+ mes "[Mathias]";
+ mes "Tuition is 70,000Zeny.";
+ mes "If you have an ^3051FDOld Magic Book^000000 or a ^3051FDNecklace Of Wisdom^000000, the tuition fee will be waived.";
+ next;
+ mes "[Mathias]";
+ mes "So, you would like to apply for admission?";
+ next;
+ menu "Yes, I would",L_Menu5_5,"Tuition is too expensive!",-,"I'll try again later",L_Menu3_2;
+ mes "[Mathias]";
+ mes "Well...we need the tuition money to cover instruction and materials...";
+ next;
+ menu "Isn't there another way?",-,"I'll try again later.",L_Menu3_2;
+ set SAGE_Q,2;
+ mes "[Mathias]";
+ mes "Well...Perhaps there is. I can lower the tuition to 30000 Zeny if you can bring us some materials we need for our research department:";
+ next;
+ mes "[Mathias]";
+ mes "Specifically, we need:";
+ mes "^3051FD50x Feather of Birds^000000";
+ mes "^3051FD50x Fluff^000000";
+ mes "^3051FD50x Clover^000000";
+ mes "^3051FD50x Feathers^000000";
+ next;
+ mes "[Mathias]";
+ mes "If you can get all that, I'll discount the fee to 30000 Zeny.";
+ mes "Please do your best to collect them.";
+ next;
+ mes "[Mathias]";
+ mes "Of course, you can also acquire 70000 Zeny instead of gathering the items if you wish.";
+ next;
+ mes "[Mathias]";
+ mes "Please do your best to collect the items.";
+ mes "See you later.";
+ close;
+ L_Menu3_2:
+ mes "[Mathias]";
+ mes "Oh, alright.";
+ mes "Take your time.";
+ mes "Thanks for stopping by.";
+ close;
+L_Menu5_1:
+ mes "[Mathias]";
+ mes "So, would you like to apply for admission?";
+ next;
+ if(JobLevel < 40) goto L_Menu5_9;
+ if(countitem(1006) > 0) goto L_Menu5_4;
+ if(countitem(1007) > 0) goto L_Menu5_4_;
+ if(Zeny < 70000) goto L_Menu5_2;
+ set Zeny,Zeny-70000;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "I see you have 70000 Zeny.";
+ mes "I'll take that for tuition. You are now enrolled into the school.";
+ next;
+ L_Menu5_5:
+ if(JobLevel < 40) goto L_Menu5_9;
+ mes "[Mathias]";
+ mes "We need your signature on this form to proceed.";
+ mes "Please sign at the X.";
+ next;
+ menu "" + strcharinfo(0) + "",-;
+ mes "[Mathias]";
+ mes "Alright, so you're ";
+ mes "" + strcharinfo(0) + ".";
+ mes "That's a nice name.";
+ next;
+ if(JobLevel == 50) goto L_JobMax;
+ if(SAGE_Q == 3) goto L_Menu5_6;
+ if(countitem(1006) > 0) goto L_Menu5_7;
+ if(countitem(1007) > 0) goto L_Menu5_7_;
+ if(Zeny < 70000) goto L_Menu5_2;
+ set Zeny,Zeny-70000;
+ set SAGE_Q,3;
+
+ mes "[Mathias]";
+ mes "I see you have 70000 Zeny.";
+ mes "I'll take that for tuition.";
+ mes "You are now enrolled into the school.";
+ next;
+
+ L_Menu5_6:
+ mes "[Mathias]";
+ mes "First, you need to take the placement test from Professor Kreitos.";
+ next;
+ mes "[Mathias]";
+ mes "Professor Kreitos is in the Academy library.";
+ mes "It's on the far left side of the building.";
+ next;
+ mes "[Mathias]";
+ mes "Good luck on the test.";
+ close;
+ L_JobMax:
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "You've trained yourself up to the maximum class level for Magicians!";
+ mes "In that case, I'll give you a full scholarship!";
+ next;
+ mes "[Mathias]";
+ mes "Now, all you need to do is go take the placement test.";
+ next;
+ mes "[Mathias]";
+ mes "Go see Professor Kreitos in the library on the far left side of the building.";
+ close;
+ L_Menu5_2:
+ if(SAGE_Q != 2) goto L_Menu5_8;
+ if((countitem(916) >= 50) && (countitem(914) >= 50) && (countitem(949) >= 50) && (countitem(705) >= 50)) goto L_Menu5_3;
+ mes "[Mathias]";
+ mes "You don't seem to have the materials yet.";
+ next;
+ mes "[Mathias]";
+ mes "You need to gather:";
+ mes "^3051FD50x Feather of Birds^000000";
+ mes "^3051FD50x Fluff^000000";
+ mes "^3051FD50x Clover^000000";
+ mes "^3051FD50x Feathers^000000";
+ next;
+ mes "[Mathias]";
+ mes "If you can get all that, I'll discount the fee to 30000 Zeny.";
+ mes "Please do your best to collect them.";
+ close;
+ L_Menu5_3:
+//==================================
+ if(Zeny < 30000) goto L_Menu5_8;
+ delitem 916,50;
+ delitem 914,50;
+ delitem 705,50;
+ delitem 949,50;
+ set Zeny,Zeny-30000;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "It seems like you have the materials I asked for and 30000 Zeny.";
+ mes "Congratulations.";
+ mes "You're now enrolled in the Academy.";
+ set SAGE_Q,3;
+ next;
+ goto L_Menu5_5;
+ L_Menu5_4:
+ delitem 1006,1;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "Oh, you have a ^3051FDOld Magic Book^000000.";
+ mes "I'll accept it in lieu of tuition.";
+ next;
+ goto L_Menu5_5;
+ L_Menu5_4_:
+ delitem 1007,1;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "Oh, you have a ^3051FDNecklace Of Wisdom^000000.";
+ mes "I'll accept it in lieu of tuition.";
+ next;
+ goto L_Menu5_5;
+ L_Menu5_7:
+ delitem 1006,1;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "Oh, you have a ^3051FDOld Magic Book^000000.";
+ mes "I'll accept it in lieu of tuition.";
+ next;
+ goto L_Menu5_6;
+ L_Menu5_7_:
+ delitem 1007,1;
+ set SAGE_Q,3;
+ mes "[Mathias]";
+ mes "Oh, you have a ^3051FDNecklace Of Wisdom^000000.";
+ mes "I'll accept it in lieu of tuition.";
+ next;
+ goto L_Menu5_6;
+ L_Menu5_8:
+ mes "[Mathias]";
+ mes "You don't seem to have enough money.";
+ mes "Please earn some money and return here.";
+ close;
+ L_Menu5_9:
+ mes "[Mathias]";
+ mes "Your class level is too low.";
+ mes "Complete some more training and return here.";
+ close;
+//==================================
+L_Menu6_1:
+ mes "[Mathias]";
+ mes "Hmmm? Did you forget what you need to do next?";
+ mes "Head over and see Professor Kreitos on the left side of the building.";
+ close;
+L_Menu6_2:
+ mes "[Mathias]";
+ mes "Oh, forgive me. I have so much to do that I can't help you at the moment.";
+ mes "Again, I apologize...";
+ close;
+L_Menu6_3:
+ mes "[Mathias]";
+ mes "Oh! Did you finish your thesis?";
+ mes "You need to see Headmaster Keiron so he can evaluate it.";
+ next;
+ mes "[Mathias]";
+ mes "If he approves, you can graduate!";
+ mes "Good luck.";
+ close;
+L_Menu6_4:
+ mes "[Mathias]";
+ mes "Welcome, colleague.";
+ mes "How is your research coming along?";
+ next;
+ mes "[Mathias]";
+ mes "In order to be a truly great researcher, you need to supplement your book-based research with encounters with real monsters.";
+ next;
+ mes "[Mathias]";
+ mes "If you know others with what it takes to become a Sage, please send them here.";
+ mes "Give my regards to my other colleagues, also.";
+ close;
+}
+
+yuno_in03.gat,169,180,4 script Test Professor 755,{
+ if(BaseJob == Job_Sage) goto L_Menu4_5;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 5) goto L_Menu2_1;
+ if(SAGE_Q == 6) goto L_Menu2_3;
+ if(SAGE_Q == 7) goto L_Menu3_1;
+ if(SAGE_Q == 8) goto L_Menu4_1;
+ if(SAGE_Q == 9) goto L_Menu4_2;
+ if(SAGE_Q == 11) goto L_Menu4_4;
+ mes "[Hermes]";
+ mes "Hello, I'm Hermes. I am part of the skill testing staff.";
+ mes "Are you a Sage candidate?";
+ next;
+ if(SAGE_Q == 3) goto L_Menu1_2;
+ if(SAGE_Q >= 3) goto L_Menu1_2;
+ mes "[Hermes]";
+ mes "Oh, alright.";
+ mes "First you need to enroll and take the placement test.";
+ close;
+L_Menu1_1:
+ mes "[Hermes]";
+ mes "This is Shubaichul Magic Academy.";
+ next;
+ mes "[Hermes]";
+ mes "There are Sages that are less magicians than researchers.";
+ mes "Having a party supporting this kind of person is extremely important.";
+ next;
+ mes "[Hermes]";
+ mes "Keep supporting your party to the best of your ability.";
+ mes "That's all you need to do.";
+ close;
+L_Menu1_2:
+ mes "[Hermes]";
+ mes "You need to take the placement test from Kreitos before you can take my test.";
+ close;
+L_Menu2_1:
+ set SAGE_Q,6;
+ mes "[Hermes]";
+ mes "Oh? You took and passed the placement test?";
+ mes "Now you need to take the skill test from me.";
+ next;
+ mes "[Hermes]";
+ mes "The rules for the skill test are simple.";
+ mes "You need to kill all the monsters within the prescribed time limit.";
+ next;
+ mes "[Hermes]";
+ mes "There's an old proverb that one experience is worth a hundred words, so why not try it once?";
+ next;
+ menu "Sounds good",-,"I'm not ready yet",L_Menu2_2;
+ mes "[Hermes]";
+ mes "Well, let's get started.";
+ mes "Do your best!";
+ close2;
+ warp "job_sage",50,154;
+ end;
+ L_Menu2_2:
+ mes "[Hermes]";
+ mes "Okay.";
+ mes "Please prepare quickly.";
+ close;
+L_Menu2_3:
+ mes "[Hermes]";
+ mes "Are you ready to take the skill test?";
+ mes "It's not too tough.";
+ next;
+ mes "[Hermes]";
+ mes "How about it?";
+ next;
+ menu "Sounds good",-,"I'm not ready yet",L_Menu2_2;
+ mes "[Hermes]";
+ mes "Well, let's get started.";
+ mes "Do your best!";
+ close2;
+ warp "job_sage",50,154;
+ end;
+L_Menu3_1:
+ mes "[Hermes]";
+ mes "Good job! You passed";
+ mes "the skill test! Now you can proceed to the research phase!";
+ next;
+ mes "[Hermes]";
+ mes "Before I decide your research concentration, let's look at your score on the placement test and the amount of time you spent in the skill test.";
+ next;
+ mes "[Hermes]";
+ mes "Hmmm...";
+ mes "Looking good.";
+ next;
+
+//It's not clear how the script decides
+
+ if(sagecheck >= 12) goto L_Menu3_2;
+ set SAGE_Q,8;
+ mes "[Hermes]";
+ mes "It looks like monster research would be your best bet.";
+ next;
+ mes "[Hermes]";
+ mes "In order to gain the necessary information to put together a coherent research paper,";
+ mes "you should take the biology course from Professor Lucias.";
+ next;
+ goto L_Menu3_4;
+L_Menu3_2:
+ set SAGE_Q,9;
+ mes "[Hermes]";
+ mes "It looks like we have a budding elemental magic researcher here.";
+ mes "This field is fundamental to the advancement of magical knowledge.";
+ next;
+ mes "[Hermes]";
+ mes "You need to take a course from Professor Ebeshi in the biotech lab to gain a deeper understanding of elemental magic.";
+ next;
+L_Menu3_4:
+ mes "[Hermes]";
+ mes "I hope the coursework goes well.";
+ close;
+L_Menu4_1:
+ mes "[Hermes]";
+ mes "Weren't you listening?";
+ mes "You need to see Professor Lucias so you can begin your study of monster biology.";
+ close;
+L_Menu4_2:
+ mes "[Hermes]";
+ mes "Weren't you listening?";
+ mes "You need to see Professor Ebeshi so you can begin your study of elemental magic.";
+ close;
+L_Menu4_4:
+ mes "[Hermes]";
+ mes "Great job on completing your thesis, but you need to show it to the Headmaster.";
+ mes "He's the one who will judge whether or not you graduate.";
+ close;
+L_Menu4_5:
+ mes "[Hermes]";
+ mes "How are you?";
+ mes "Your face reveals that you've endured a lot of stress lately.";
+ next;
+ mes "[Hermes]";
+ mes "As stressful as hands-on research is,";
+ mes "it is still fundamentally different from research using abstract concepts.";
+ next;
+ mes "[Hermes]";
+ mes "Of course, if you go to difficult dungeons,";
+ mes "there's no shame in bringing a friend or five to help you out.";
+ close;
+}
+
+yuno_in03.gat,62,176,3 script History Professor 109,{
+ if(BaseJob == Job_Sage) goto L_Menu2_2;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 11) goto L_Menu2_1;
+ mes "[Sapien]";
+ mes "You don't seem sure of your intended direction of study.";
+ mes "Perhaps you should consider it...";
+ close;
+L_Menu1_1:
+ mes "[Sapien]";
+ mes "Yes, I teach history.";
+ next;
+ mes "[Sapien]";
+ mes "As the present fades into memory, it becomes the past.";
+ mes "The kwoledge we have acquired in the past is the bridge between the present and the future.";
+ next;
+ mes "[Sapien]";
+ mes "You should study your own past, too.";
+ mes "By understanding what's happened to you already,";
+ mes "you can blaze a trail into the future unhindered by unresolved problems.";
+ close;
+L_Menu2_1:
+ mes "[Sapien]";
+ mes "What are you doing?";
+ mes "Hurry up and show the Headmaster your thesis before you lose it!";
+ close;
+L_Menu2_2:
+ mes "[Sapien]";
+ mes "Yes...?";
+ mes "Ah, it's a former student here.";
+ mes "Congratulations on graduating.";
+ next;
+ mes "[Sapien]";
+ mes "The present can only be understood by understanding the past.";
+ mes "Such understanding allows us to envision our future.";
+ next;
+ mes "[Sapien]";
+ mes "You should study your own past, too.";
+ mes "By understanding what's happened to you already,";
+ mes "you can blaze a trail into the future unhindered by unresolved problems.";
+ close;
+}
+
+yuno_in03.gat,105,177,4 script Placement Test Professor 754,{
+ if(BaseJob == Job_Sage) goto L_Menu3_4;
+ if(BaseJob != Job_Mage) goto L_Menu1_1;
+ if(SAGE_Q == 11) goto L_Menu3_3;
+ if(SAGE_Q >= 6) goto L_Menu3_2;
+ if(SAGE_Q == 3) goto L_Menu1_2;
+ if(SAGE_Q == 4) goto L_Menu2_1;
+ if(SAGE_Q == 5) goto L_Menu3_1;
+ mes "[Kreitos]";
+ mes "You have that look in your eye...";
+ mes "You want to be a Sage, I take it.";
+ next;
+ mes "[Kreitos]";
+ mes "You need to formally enroll in the Academy before I can help you any further.";
+ close;
+L_Menu1_1:
+ mes "[Kreitos]";
+ mes "Oh, you're not interested in our brand of magic?";
+ mes "That's alright...";
+ next;
+ mes "[Kreitos]";
+ mes "Anyone who teaches others and has a good heart is of value to society.";
+ mes "Please keep that in mind.";
+ close;
+L_Menu1_2:
+ set SAGE_Q,4;
+ set sagecheck,10;
+ mes "[Kreitos]";
+ mes "It looks like you've enrolled in the Shubaichul Magic Academy.";
+ mes "Is that right?";
+ next;
+ mes "[Kreitos]";
+ mes "So, let me find your paperwork...";
+ mes "You're " + strcharinfo(0) + ",";
+ mes "right?";
+ mes "Let's start the placement test.";
+ next;
+ mes "[Kreitos]";
+ mes "This test consists of twenty questions concerning the entire world.";
+ mes "If you score at least 80 points, you'll be placed in our program.";
+ mes "Each correct answer is worth 5 points.";
+ next;
+ mes "[Kreitos]";
+ mes "If you cancel, you'll have to start over, so be careful.";
+ next;
+ goto L_Menu2_2;
+ L_Menu2_1:
+ mes "[Kreitos]";
+ mes "Are you ready to try again?";
+ mes "Have you studied hard?";
+ next;
+ mes "[Kreitos]";
+ mes "The passing grade is as before.";
+ mes "You need to score 80 points, with each question being worth 5 points.";
+ next;
+ mes "[Kreitos]";
+ mes "So, let's get started.";
+ mes "Give it your best effort.";
+ mes "As before, if you cancel,";
+ mes "you'll have to start over.";
+ next;
+ L_Menu2_2:
+
+ set @sage_test2,0;
+ set @sage_test1,rand(3);
+ if (@sage_test1 == 1) goto L_Test2_1;
+ if (@sage_test1 == 2) goto L_Test3_1;
+
+//==================================
+//Written Test: Route 1.
+//==================================
+ mes "1. Which one isn't sold in Morocc's jewel shop?";
+ next;
+ menu "Topaz",L_Test1_1,"Garnet",-,"Diamond",L_Test1_1,"Sapphire",L_Test1_1;
+ set @sage_test2,@sage_test2+5;
+ goto L_Test1_1;
+ L_Test1_1:
+ mes "2. In which town can you not buy monster food?";
+ next;
+ menu "Prontera",L_Test1_2,"Morocc",L_Test1_2,"Aldebaran",-,"Alberta",L_Test1_2;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_2:
+ mes "3. Which town is closest to the forest maze?";
+ next;
+ menu "Prontera",-,"Morocc",L_Test1_3,"Geffen",L_Test1_3,"Payon",L_Test1_3;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_3:
+ mes "4. Which of these monsters is of a different race than the other three?";
+ next;
+ menu "Muka",L_Test1_4,"Drops",L_Test1_4,"Plankton",L_Test1_4,"Penomena",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_4:
+ mes "5. All these monsters except one have the same elemental affinity.";
+ mes "Which one has the different affinity?";
+ next;
+ menu "Dokebi",L_Test1_5,"Isis",L_Test1_5,"Giearth",-,"Deviruchi",L_Test1_5;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_5:
+ mes "6. Which one differs in approximate size from the others?";
+ next;
+ menu "Male Thief Bug",L_Test1_6,"Horn",L_Test1_6,"Metaller",L_Test1_6,"Argos",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_6:
+ mes "7. Which of these monsters doesn't drop the Iggydrasil leaf?";
+ next;
+ menu "Marduk",-,"Baphomet Jr.",L_Test1_7,"Angeling",L_Test1_7,"Wander Man",L_Test1_7;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_7:
+ mes "8. Which of these people isn't related to someone who can perform a class change to priest?";
+ next;
+ menu "Peter S. Alberto",-,"Thomas Bishop",L_Test1_8,"Windser Banedict",L_Test1_8,"Sesil Magrita",L_Test1_8;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_8:
+ mes "9. Which doesn't live in Morocc?";
+ next;
+ menu "Muda Armani",L_Test1_9,"Aragham",L_Test1_9,"Antonio",-,"Abldul",L_Test1_9;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_9:
+ mes "10. Which Kapra has the pretty blue hair?";
+ next;
+ menu "Pavianne",-,"Debril",L_Test1_10,"Claris",L_Test1_10,"Tayelin",L_Test1_10;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_10:
+ mes "11. Which one isn't necessary to unlock the Fire Wall skill?";
+ next;
+ menu "Firebolt Lv4",L_Test1_11,"Napalm Beat Lv4",-,"Fireball Lv5",L_Test1_11,"Sight Lv1",L_Test1_11;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_11:
+ mes "12. When the skill 'SP Restoration Lv6' is active, how much SP does the skill restore every ten seconds?";
+ next;
+ menu "14 sp",L_Test1_12,"16 sp",L_Test1_12,"18 sp",-,"21 sp",L_Test1_12;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_12:
+ mes "13. If you are a magician with job lv. 33, how many additional stat points will you get for int?";
+ next;
+ menu "7",L_Test1_13,"6",L_Test1_13,"5",L_Test1_13,"4",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_13:
+ mes "14. If the Archer skill 'Concentration Up Lv5' is active, how much SP will it consume?";
+ next;
+ menu "45 / 140sec",-,"50 / 140sec",L_Test1_14,"45 / 150sec",L_Test1_14,"50 / 150sec",L_Test1_14;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_14:
+ mes "15. Which one isn't necessary to unlock the Blacksmith skill 'Maximize Power'?";
+ next;
+ menu "Hilt Bending",L_Test1_15,"Skin Tempering",-,"Hammer Fall",L_Test1_15,"Weapon Perfection",L_Test1_15;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_15:
+ mes "16. What is the defense power and supplemental ability of a Ribbon?";
+ next;
+ menu "0 / SP +20",L_Test1_16,"0 / SP +30",L_Test1_16,"1 / SP +20",-,"1 / SP +30",L_Test1_16;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_16:
+ mes "17. Which class can't equip a Saint Robe?";
+ next;
+ //Swordsmen can't equip it either as of this writing.
+ menu "Swordsman",-,"Merchant",L_Test1_17,"Thief",-,"Acolyte",L_Test1_17;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_17:
+ mes "18. Which status ailment can't be removed with a Green Potion?";
+ next;
+ menu "Mute",L_Test1_18,"Poison",L_Test1_18,"Blind",L_Test1_18,"Cursed",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_18:
+ mes "19. What is the name of the ancient kingdom from which Geffen descends?";
+ next;
+ menu "Gefin",L_Test1_19,"Geffenia",-,"Gefdoria",L_Test1_19,"Gefria",L_Test1_19;
+ set @sage_test2,@sage_test2+5;
+ L_Test1_19:
+ mes "20. Which tree is said to be the world's root?";
+ next;
+ menu "Igg Drasil",-,"Idrasil",L_Menu2_3,"Master",L_Menu2_3,"Old Tree",L_Menu2_3;
+ set @sage_test2,@sage_test2+5;
+ goto L_Menu2_3;
+ //==================================
+ //Written Test: Route 2.
+ //==================================
+ L_Test2_1:
+ mes "1. Which isn't sold in Geffen's magic shop?";
+ next;
+ menu "Mantle",-,"Wand",L_Test2_2,"Circlet",L_Test2_2,"Silver Robe",L_Test2_2;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_2:
+ mes "2. Which town doesn't sell blades?";
+ next;
+ menu "Prontera",L_Test2_3,"Izlude",L_Test2_3,"Aldebaran",-,"payon",L_Test2_3;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_3:
+ mes "3. Which town is nearest to Glast Heim?";
+ next;
+ menu "Prontera",L_Test2_4,"Geffen",-,"Morocc",L_Test2_4,"Payon",L_Test2_4;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_4:
+ mes "4. Which monster's type differs from the other three?";
+ next;
+ menu "Aster",L_Test2_5,"Marc",L_Test2_5,"Marse",L_Test2_5,"Marin",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_5:
+ mes "5. Which monster's elemental affinity is different from the others?";
+ next;
+ menu "Desert Wolf Babe",L_Test2_6,"Smokie",-,"Picky",L_Test2_6,"Choco",L_Test2_6;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_6:
+ mes "6. Which monster is in a different size class than the others?";
+ next;
+ menu "Drake",-,"Wraith",L_Test2_7,"Evil Druid",L_Test2_7,"Khalitzburg",L_Test2_7;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_7:
+ mes "7. Which monster doesn't drop Phracon?";
+ next;
+ menu "Pupa",L_Test2_8,"Condor",-,"Savage Baby",L_Test2_8,"Desert Wolf Babe",L_Test2_8;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_8:
+ mes "8. Who isn't involved in the Blacksmith class change?";
+ next;
+// =========================
+// Acording To mRO Site And eAthena Blacksmith Script the following ppl looking like ppl listed here are:
+// - Baisulitst - looks like some1 listed by mRO
+// - Wickebine - mRO has him as option listed
+// - Gromgast - mRO has him as option listed
+// - Mitmayer - translator has him listed as option
+// == Conclusion == I took the following:
+// =========================
+ menu "Baisulitst",L_Test2_9,"Wickebine",L_Test2_9,"Barkdale",-,"Mitmayer",L_Test2_9;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_9:
+ mes "9. Who doesn't live in Aldebaran?";
+ next;
+ menu "RS125",L_Test2_10,"Maasaru",-,"Munster",L_Test2_10,"Isenberg",L_Test2_10;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_10:
+ mes "10. Who is the youngest person in the Kapra organization?";
+ next;
+ menu "Deflute",L_Test2_11,"Claris",L_Test2_11,"Tayelin",L_Test2_11,"Curly Sue",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_11:
+ mes "11. When you use the skill 'Safety Wall Lv6', how much SP is consumed and how many attacks will it block?";
+ next;
+ menu "SP 40, 6bl",L_Test2_12,"SP 35, 6bl",L_Test2_12,"SP 35, 7bl",L_Test2_12,"SP 40, 7bl",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_12:
+ mes "12. When you use 'Napalm Beat Lv6', what is the attack power relative to MATK?";
+ next;
+ menu "1.2x MATK",L_Test2_13,"1.3x MATK",-,"1.4x MATK",L_Test2_13,"1.5x MATK",L_Test2_13;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_13:
+ mes "13. Which one catalyzes the reaction of Liquid #4 during the Magician class change test?";
+ next;
+ menu "Blue Gemstone",L_Test2_14,"Red Gemstone",L_Test2_14,"Orange Gemstone",L_Test2_14,"Carat Diamond",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_14:
+ mes "14. What is the damage multiplier and SP consumption for 'Bash Lv6'?";
+ next;
+ menu "250% / 8",L_Test2_15,"280% / 8",L_Test2_15,"280% / 15",-,"310% / 15",L_Test2_15;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_15:
+ mes "15. Which isn't necessary to unlock the Hunter skill 'Claymore Trap'?";
+ next;
+ menu "Remove Trap",-,"Land Mine",L_Test2_16,"Ankle Snare",L_Test2_16,"Flash",L_Test2_16;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_16:
+ mes "16. What is the defense power and supplemental ability of a Veil?";
+ next;
+ menu "0 / MDEF +3",L_Test2_17,"0 / MDEF +5",-,"1 / MDEF +3",L_Test2_17,"1 / MDEF +5",L_Test2_17;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_17:
+ mes "17. Which class can't equip a Coat?";
+ next;
+ menu "Swordsman",L_Test2_18,"Magician",L_Test2_18,"Thief",L_Test2_18,"Novice",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_18:
+ mes "18. Which item isn't blue in color?";
+ next;
+ menu "Alcohol",L_Test2_19,"Detrimindexta",-,"Karvodailnirol",L_Test2_19,"Blue Herb",L_Test2_19;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_19:
+ mes "19. Which item did the god Odin use to create the world?";
+ next;
+// menu "Yomir's Heart",L_Test2_20,"Yomir's Nail",-,"Yomir's Tooth",L_Test2_20,"Yomir's Stuff",L_Test2_20;
+// All answers correct untill i know the real answer, only Stuff is wrong cause that NOT it
+ menu "Yomir's Heart",-,"Yomir's Nail",-,"Yomir's Tooth",-,"Yomir's Stuff",L_Test2_20;
+ set @sage_test2,@sage_test2+5;
+ L_Test2_20:
+ mes "20. Which metal can change the fate of the world?";
+ next;
+ menu "Envertacon",L_Menu2_3,"Emperium",-,"Enbera",L_Menu2_3,"Phracon",L_Menu2_3;
+ set @sage_test2,@sage_test2+5;
+ goto L_Menu2_3;
+//==================================
+//Written Test: Route 3.
+//==================================
+ L_Test3_1:
+ mes "1.Which of these items isn't sold at Prontera's knicknack shop?";
+ next;
+ menu "White Plate",L_Test3_2,"Red Frame",L_Test3_2,"Flower",-,"Glass Ball",L_Test3_2;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_2:
+ mes "2. Which town doesn't sell stilettos?";
+ next;
+ menu "Prontera",-,"Morocc",L_Test3_3,"Gefen",L_Test3_3,"Lutie",L_Test3_3;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_3:
+ mes "3. Which town is closest to Turtle Island?";
+ next;
+ menu "Aldebaran",L_Test3_4,"Alberta",-,"Comodo",L_Test3_4,"Izlude",L_Test3_4;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_4:
+ mes "4. Which monster is of a different monster race than the other three?";
+ next;
+ menu "Raggler",L_Test3_5,"Pest",L_Test3_5,"Frilldora",L_Test3_5,"Aster",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_5:
+ mes "5. Which monster has a different elemental affinity than the other three?";
+ next;
+ menu "Mantis",L_Test3_6,"Metaller",-,"Rokker",L_Test3_6,"Horn",L_Test3_6;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_6:
+ mes "6. Which monster is in a different size class than the others?";
+ next;
+ menu "Raydric",-,"Raydric Archer",L_Test3_7,"Wander Man",L_Test3_7,"Dark Flame",L_Test3_7;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_7:
+ mes "7. Which monster doesn't drop alcohol?";
+ next;
+ menu "Horn",L_Test3_8,"Plankton",L_Test3_8,"Poison Spore",-,"Toad",L_Test3_8;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_8:
+ mes "8. Which isn't involved in the Knight class change?";
+ next;
+// =========================
+// Acording To mRO Site And eAthena Knight Script the following ppl looking like ppl listed here
+// =========================
+ menu "James Syracuse",L_Test3_9,"Thomas Bishop",-,"Amy Veattris",L_Test3_9,"Edmond Groster",L_Test3_9;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_9:
+ mes "9. Which of these people doesn't live in Prontera?";
+ next;
+ menu "Nami",L_Test3_10,"Aldefun",-,"Thomas",L_Test3_10,"Hollengrhen",L_Test3_10;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_10:
+ mes "10. Which Kapra wears glasses?";
+ next;
+ menu "Deflute",L_Test3_11,"Tayelin",L_Test3_11,"Leilah",-,"Debril",L_Test3_11;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_11:
+ mes "11. How much SP does it cost to use 'Thunderstorm Lv7'?";
+ next;
+ menu "49",L_Test3_12,"59",-,"69",L_Test3_12,"74",L_Test3_12;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_12:
+ mes "12. If you have 50% of your SP left, how much damage will 'Energy Coat' block and how much SP will be consumed?";
+ next;
+ menu "24% blocked SP1.5% consumed",L_Test3_13,"24% blocked SP2% consumed",L_Test3_13,"18% blocked SP1.5% consumed",L_Test3_13,"18% blocked SP2% consumed",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_13:
+ mes "13. Which element cannot be used in bolt form by a Magician?";
+ next;
+ menu "Water",L_Test3_14,"Earth",-,"Fire",L_Test3_14,"Wind",L_Test3_14;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_14:
+ mes "14. When a thief has the skill 'Double Attack Lv7', what is the trigger probability and attack power multiplier?";
+ next;
+ menu "35% / 120%",L_Test3_15,"35% / 140%",-,"40% / 120%",L_Test3_15,"40% / 140%",L_Test3_15;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_15:
+ mes "15. Which of these isn't necessary to unlock the Priest skill 'Magnus Exorcism'?";
+ next;
+ menu "Divine Protection",-,"Heal",L_Test3_16,"Revive",L_Test3_16,"Aqua Benedicta",L_Test3_16;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_16:
+ mes "16. What is the defense power and supplemental ability of a Bunny Band?";
+ next;
+ menu "1 / LUK +2",L_Test3_17,"1 / LUK +5",L_Test3_17,"2 / LUK +2",-,"2 / LUK +5",L_Test3_17;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_17:
+ mes "17. Which class can't equip armor?";
+ next;
+ menu "Swordsman",L_Test3_18,"Merchant",L_Test3_18,"Thief",L_Test3_18,"Archer",-;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_18:
+ mes "18. Which item completely restores HP and SP?";
+ next;
+ menu "Royal Jelly",L_Test3_19,"Ig Drasil Seed",L_Test3_19,"Ig Drasil Fruit",-,"Master Fruit",L_Test3_19;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_19:
+ mes "19. What's the name of the king of Rune-Midgard?";
+ next;
+ menu "Trisdan III",L_Test3_20,"Tristan III",-,"Traisda III",L_Test3_20,"Trist III",L_Test3_20;
+ set @sage_test2,@sage_test2+5;
+ L_Test3_20:
+ mes "20. Which god do Crusaders serve?";
+ next;
+ menu "Odin",-,"Loki",L_Menu2_3,"Tooru",L_Menu2_3,"Aragamsaree",L_Menu2_3;
+ set @sage_test2,@sage_test2+5;
+
+ L_Menu2_3:
+ mes "[Kreitos]";
+ mes "Are you finished?";
+ mes "Alright, then I'll grade the test.";
+ next;
+ mes "[Kreitos]";
+ mes "Hmmm...";
+ mes "Yes....";
+ next;
+ if (@sage_test2 >= 100) goto L_Menu2_5;
+ if (@sage_test2 < 80) goto L_Menu2_4;
+ mes "[Kreitos]";
+ mes "All done.";
+ mes "You scored " + @sage_test2 + " points.";
+ mes "Looking good.";
+ mes "You've scored highly enough to pass.";
+ next;
+ goto L_Menu2_6;
+ L_Menu2_4:
+ set sagecheck,sagecheck-1;
+ mes "[Kreitos]";
+ mes "All done.";
+ mes "You scored " + @sage_test2 + " points.";
+ mes "......";
+ mes "Sorry, that's not good enough.";
+ next;
+ mes "[Kreitos]";
+ mes "We exepect our students to have command of much information about the world.";
+ mes "Learn some more and come back.";
+ mes "You can take the test again then.";
+ close;
+ L_Menu2_5:
+ mes "[Kreitos]";
+ mes "All done.";
+ mes "You scored " + @sage_test2 + " points.";
+ mes "Amazing. You did wonderfully.";
+ mes "There is no doubt you'll make a great Sage.";
+ next;
+ L_Menu2_6:
+ set SAGE_Q,5;
+ mes "[Kreitos]";
+ mes "Alright.";
+ mes "You've completed the placement test.";
+ mes "Now you need to take the skill test from Professor Hermes.";
+ close;
+L_Menu3_1:
+ mes "[Kreitos]";
+ mes "Heh?";
+ mes "Do you love tests so much that you want to take the placement test again?";
+ next;
+ mes "[Kreitos]";
+ mes "Go see Professor Hermes and take the skill test.";
+ mes "Future Sages can't be slacking off.";
+ close;
+L_Menu3_2:
+ mes "[Kreitos]";
+ mes "I'm busy grading other students' exams at the moment.";
+ mes "If you need something, please see me later.";
+ close;
+L_Menu3_3:
+ mes "[Kreitos]";
+ mes "It's great that you finished your thesis, but I don't grade those.";
+ next;
+ mes "[Kreitos]";
+ mes "Show that to Headmaster Keiron.";
+ mes "He'll judge whether or not it's quality warrants your graduation.";
+ close;
+L_Menu3_4:
+ mes "[Kreitos]";
+ mes "You've graduated already?";
+ mes "Do you want to take more classes?";
+ next;
+ mes "[Kreitos]";
+ mes "I know it feels great to have graduated, but you've got to keep learning.";
+ mes "You might burn out if you become complacent and never venture out of the library once in a while.";
+ mes "Danger is exhilerating.";
+ next;
+ mes "[Kreitos]";
+ mes "Don't forget to keep notes about your journies.";
+ mes "They can come in handy when you want to teach others about a subject you've studied.";
+ close;
+}
+
+//==================================
+//Skill Test Room
+//==================================
+
+job_sage.gat,50,165,4 script Skill Test Coordinator::jobsage_wroom 700,{
+ mes "[Skill Test Coordinator]";
+ mes "Welcome to the Sage skill test.";
+ mes "Please go to the waiting area if you want to take the test.";
+ next;
+ mes "[Skill Test Coordinator]";
+ mes "Others are being tested at the moment.";
+ mes "When it's time for you to be tested, we'll call your name.";
+ next;
+ mes "[Skill Test Coordinator]";
+ mes "It takes around 5-10 minutes to test one person.";
+ close;
+OnInit:
+ waitingroom "Test Waiting Area",10,"jobsage_wroom::OnStart",1;
+ end;
+OnStart:
+ disablewaitingroomevent;
+ warpwaitingpc "job_sage.gat",118,99;
+ set $@jobsage_pid,$@warpwaitingpc[0];
+ if( attachrid($@jobsage_pid)==0 ) goto L_Error;
+ set $@jobsage_pname$,strcharinfo(0);
+ donpcevent "jobsage_1st::OnStart";
+ end;
+L_Error:
+ enablewaitingroomevent;
+ end;
+OnEnable:
+ enablewaitingroomevent;
+ end;
+}
+
+//======== Test Step 1
+job_sage.gat,1,1,1 script jobsage_1st -1,{
+ end;
+OnStart:
+ set $@jobsage_m,16;
+ monster "job_sage.gat",115,106,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",120,102,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",124,98,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",120,93,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",115,90,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",111,93,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",107,98,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",111,102,"Unit",1183,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",128,110,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",124,106,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",124,89,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",128,85,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",107,89,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",103,85,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",107,106,"Unit",1184,1,"jobsage_1st::OnKilled";
+ monster "job_sage.gat",103,110,"Unit",1184,1,"jobsage_1st::OnKilled";
+ initnpctimer;
+ end;
+OnReset:
+ killmonster "job_sage.gat","All";
+ end;
+OnKilled:
+ set $@jobsage_m,$@jobsage_m-1;
+ if( $@jobsage_m > 0 )goto L_NotWin;
+ if(getnpctimer(0) < 60000 ) set sagecheck,sagecheck+1;
+ if((getnpctimer(0) >= 120000 ) && (getnpctimer(0) <= 170000 )) set sagecheck,sagecheck-1;
+ if(getnpctimer(0) > 170000 ) set sagecheck,sagecheck-2;
+ stopnpctimer;
+ mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + " killed all the monsters!",8;
+ donpcevent "jobsage_2nd::OnStart";
+ L_NotWin:
+ end;
+OnTimer1000:
+ mapannounce "job_sage.gat","Examiner: The skill test begins now.",8;
+ end;
+OnTimer2500:
+ mapannounce "job_sage.gat","Examiner: The time limit for this portion of the test is 3 minutes.",8;
+ end;
+OnTimer4000:
+ mapannounce "job_sage.gat","Examiner: You must kill all the monsters within that time period.",8;
+ end;
+OnTimer30000:
+ mapannounce "job_sage.gat","Examiner: 2 minutes, 30 seconds remaining.",8;
+ end;
+OnTimer60000:
+ mapannounce "job_sage.gat","Examiner: 2 minutes remaining.",8;
+ end;
+OnTimer90000:
+ mapannounce "job_sage.gat","Examiner: 1 minute, 30 seconds remaining.",8;
+ end;
+OnTimer120000:
+ mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
+ end;
+OnTimer150000:
+ mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
+ end;
+OnTimer170000:
+ mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
+ end;
+OnTimer180000:
+ donpcevent "jobsage_1st::OnReset";
+ mapannounce "job_sage.gat","Examiner: Time has expired.",8;
+ end;
+OnTimer181500:
+ mapannounce "job_sage.gat","Examiner:" + $@jobsage_pname$ + "failed the test.",8;
+ areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
+ end;
+OnTimer183000:
+ mapannounce "job_sage.gat","Next candidate, please step forward.",8;
+ end;
+OnTimer184000:
+ donpcevent "jobsage_wroom::OnEnable";
+ stopnpctimer;
+ end;
+}
+
+//======== Test Step 2
+job_sage.gat,1,1,1 script jobsage_2nd -1,{
+ end;
+OnStart:
+ donpcevent "jobsage_2nd::OnReset";
+ set $@jobsage_m,24;
+ monster "job_sage.gat",120,102,"GeographyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,102,"StatisticsInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,102,"MeteorologyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,102,"AstronomyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,102,"LinguisticsInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,102,"CityLifeInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",124,98,"ForestryInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",124,98,"HealthInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",124,98,"PsychologyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,93,"AnthropologyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,93,"BiologyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",120,93,"EthicsInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"ArchitectureInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"PlasticsInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"NutritionInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"FoodInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"ManagementInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,93,"SociologyInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",107,98,"EconomicsInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",107,98,"MagicInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",107,98,"PoliSciInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,102,"MathInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,102,"HistoryInfo",1063,1,"jobsage_2nd::OnKilled";
+ monster "job_sage.gat",111,102,"PhysicsInfo",1063,1,"jobsage_2nd::OnKilled";
+ initnpctimer;
+ end;
+OnReset:
+ killmonster "job_sage.gat","All";
+ end;
+OnKilled:
+ set $@jobsage_m,$@jobsage_m-1;
+ if( $@jobsage_m > 0 )goto L_NotWin;
+ stopnpctimer;
+ if(getnpctimer(0) < 60000 ) set sagecheck,sagecheck+1;
+ if((getnpctimer(0) >= 120000 ) && (getnpctimer(0) <= 170000 )) set sagecheck,sagecheck-1;
+ if(getnpctimer(0) > 170000 ) set sagecheck,sagecheck-2;
+ mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + " killed all the monsters!",8;
+ donpcevent "jobsage_3rd::OnStart";
+ L_NotWin:
+ end;
+OnTimer1500:
+ mapannounce "job_sage.gat","Examiner: The time limit for this portion of the test is 3 minutes.",8;
+ end;
+OnTimer3000:
+ mapannounce "job_sage.gat","Examiner: You must kill all the monsters within that time period.",8;
+ end;
+OnTimer30000:
+ mapannounce "job_sage.gat","Examiner: 2 minutes, 30 seconds remaining.",8;
+ end;
+OnTimer60000:
+ mapannounce "job_sage.gat","Examiner: 2 minutes remaining.",8;
+ end;
+OnTimer90000:
+ mapannounce "job_sage.gat","Examiner: 1 minute, 30 seconds remaining.",8;
+ end;
+OnTimer120000:
+ mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
+ end;
+OnTimer150000:
+ mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
+ end;
+OnTimer170000:
+ mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
+ end;
+OnTimer180000:
+ donpcevent "jobsage_2nd::OnReset";
+ mapannounce "job_sage.gat","Examiner: Time has expired.",8;
+ end;
+OnTimer181500:
+ mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + "has failed the test.",8;
+ areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
+ end;
+OnTimer183000:
+ mapannounce "job_sage.gat","Next candidate, please step forward.",8;
+ end;
+OnTimer184000:
+ donpcevent "jobsage_wroom::OnEnable";
+ stopnpctimer;
+ end;
+}
+
+
+//======== Test Step 3
+job_sage.gat,1,1,1 script jobsage_3rd -1,{
+ end;
+OnStart:
+ donpcevent "jobsage_3rd::OnReset";
+ set $@jobsage_m,1;
+ monster "job_sage.gat",116,98,"Bachelor",1179,1,"jobsage_3rd::OnKilled";
+ monster "job_sage.gat",124,106,"Tardy",1185,1;
+ monster "job_sage.gat",124,89,"Loaner",1185,1;
+ monster "job_sage.gat",107,89,"Cheater",1185,1;
+ monster "job_sage.gat",107,106,"Absentee",1185,1;
+ initnpctimer;
+ end;
+OnReset:
+ end;
+OnKilled:
+ set $@jobsage_m,$@jobsage_m-1;
+ if( $@jobsage_m > 0 )goto L_NotWin;
+ stopnpctimer;
+ killmonster "job_sage.gat","All";
+ set SAGE_Q,7;
+ if(getnpctimer(0) < 20000 ) set sagecheck,sagecheck+1;
+ if((getnpctimer(0) >= 30000 ) && (getnpctimer(0) <= 50000 )) set sagecheck,sagecheck-1;
+ if(getnpctimer(0) > 50000 ) set sagecheck,sagecheck-2;
+ mapannounce "job_sage.gat","Examiner: Congratulations. " + $@jobsage_pname$ + "passed the test!",8;
+ donpcevent "jobsage_success::OnSuccess";
+ L_NotWin:
+ end;
+OnTimer1500:
+ mapannounce "job_sage.gat","Examiner: 1 minute remaining.",8;
+ end;
+OnTimer30000:
+ mapannounce "job_sage.gat","Examiner: 30 seconds remaining.",8;
+ end;
+OnTimer50000:
+ mapannounce "job_sage.gat","Examiner: 10 seconds remaining.",8;
+ end;
+OnTimer60000:
+ donpcevent "jobsage_3rd::OnReset";
+ mapannounce "job_sage.gat","Examiner: Time has expired.",8;
+ end;
+OnTimer61500:
+ mapannounce "job_sage.gat","Examiner: " + $@jobsage_pname$ + "failed the test.",8;
+ areawarp "job_sage.gat",100,82,131,113,"yuno.gat",324,258;
+ end;
+OnTimer63000:
+ mapannounce "job_sage.gat","Examiner: This concludes the test. Next candidate, please step forward.",8;
+ end;
+OnTimer64000:
+ donpcevent "jobsage_wroom::OnEnable";
+ stopnpctimer;
+ end;
+}
+
+//======== Successful
+job_sage.gat,1,7,1 script jobsage_success 66,{
+OnSuccess:
+ killmonster "job_sage.gat","All";
+ initnpctimer;
+ end;
+OnTimer3000:
+ mapannounce "job_sage.gat","Examiner: Please allow me to guide you out.",8;
+ end;
+OnTimer6000:
+ mapannounce "job_sage.gat","Next candidate, please step forward.",8;
+ areawarp "job_sage.gat",100,82,131,113,"yuno_in03.gat",163,180;
+ end;
+OnTimer7000:
+ donpcevent "jobsage_wroom::OnEnable";
+ stopnpctimer;
+ end;
+}
+
+//==============================================================================
+// mapflag
+//==============================================================================
+job_sage.gat mapflag nomemo
+job_sage.gat mapflag noteleport
+job_sage.gat mapflag nosave SavePoint
+job_sage.gat mapflag nopenalty
+job_sage.gat mapflag nobranch
+job_sage.gat mapflag noexp
+job_sage.gat mapflag noloot
diff --git a/npc/jobs/2-2a/Champion.txt b/npc/jobs/2-2a/Champion.txt
index 17cf9238d..99408de96 100644
--- a/npc/jobs/2-2a/Champion.txt
+++ b/npc/jobs/2-2a/Champion.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Champion ==-
-valkyrie.gat,53,42,4 script Champion 52,{
- callfunc "F_Rebirth",Job_Acolyte_High,"Acolyte High",Job_Champion,"Champion";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Champion ==-
+valkyrie.gat,53,42,4 script Champion 52,{
+ callfunc "F_Rebirth",Job_Acolyte_High,"Acolyte High",Job_Champion,"Champion";
+}
diff --git a/npc/jobs/2-2a/Clown.txt b/npc/jobs/2-2a/Clown.txt
index 02aa7d5d9..e2c23dda3 100644
--- a/npc/jobs/2-2a/Clown.txt
+++ b/npc/jobs/2-2a/Clown.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Clown ==-
-valkyrie.gat,53,54,4 script Clown 741,{
- callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Clown,"Clown";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Clown ==-
+valkyrie.gat,53,54,4 script Clown 741,{
+ callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Clown,"Clown";
+}
diff --git a/npc/jobs/2-2a/Creator.txt b/npc/jobs/2-2a/Creator.txt
index 3f76dbae6..93155a543 100644
--- a/npc/jobs/2-2a/Creator.txt
+++ b/npc/jobs/2-2a/Creator.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Creator ==-
-valkyrie.gat,53,50,6 script Creator 122,{
- callfunc "F_Rebirth",Job_Merchant_High,"Merchant High",Job_Creator,"Creator";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Creator ==-
+valkyrie.gat,53,50,6 script Creator 122,{
+ callfunc "F_Rebirth",Job_Merchant_High,"Merchant High",Job_Creator,"Creator";
+}
diff --git a/npc/jobs/2-2a/Gypsy.txt b/npc/jobs/2-2a/Gypsy.txt
index 033b508ef..475cde7f5 100644
--- a/npc/jobs/2-2a/Gypsy.txt
+++ b/npc/jobs/2-2a/Gypsy.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Gypsy ==-
-valkyrie.gat,53,56,4 script Gypsy 101,{
- callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Gypsy,"Gypsy";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Gypsy ==-
+valkyrie.gat,53,56,4 script Gypsy 101,{
+ callfunc "F_Rebirth",Job_Archer_High,"High Archer",Job_Gypsy,"Gypsy";
+}
diff --git a/npc/jobs/2-2a/Paladin.txt b/npc/jobs/2-2a/Paladin.txt
index d607fb75d..c662d568e 100644
--- a/npc/jobs/2-2a/Paladin.txt
+++ b/npc/jobs/2-2a/Paladin.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Paladin ==-
-valkyrie.gat,53,39,4 script Paladin 752,{
- callfunc "F_Rebirth",Job_Swordman_High,"Swordman High",Job_Paladin,"Paladin";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Paladin ==-
+valkyrie.gat,53,39,4 script Paladin 752,{
+ callfunc "F_Rebirth",Job_Swordman_High,"Swordman High",Job_Paladin,"Paladin";
+}
diff --git a/npc/jobs/2-2a/Professor.txt b/npc/jobs/2-2a/Professor.txt
index f1cd8dcba..c3e09bf64 100644
--- a/npc/jobs/2-2a/Professor.txt
+++ b/npc/jobs/2-2a/Professor.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Professor ==-
-valkyrie.gat,53,47,4 script Professor 743,{
- callfunc "F_Rebirth",Job_Mage_High,"High Mage",Job_Professor,"Professor";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Professor ==-
+valkyrie.gat,53,47,4 script Professor 743,{
+ callfunc "F_Rebirth",Job_Mage_High,"High Mage",Job_Professor,"Professor";
+}
diff --git a/npc/jobs/2-2a/Stalker.txt b/npc/jobs/2-2a/Stalker.txt
index 83f1a18d7..efe52b4c0 100644
--- a/npc/jobs/2-2a/Stalker.txt
+++ b/npc/jobs/2-2a/Stalker.txt
@@ -1,21 +1,21 @@
-//===== eAthena Script =======================================
-//= Advance Class jobchanger after kRO Normals.
-//===== By: ==================================================
-//= Nana
-//= finished, optimized and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//= Advance Class jobchanger after kRO Normals.
-//===== Additional Comments: =================================
-//= v1.1 Made all into functions, additional checks, etc. [Lupus]
-//= v1.2 Made numbers into constants. [Vicious]
-//= 1.3 Now saves/restores all the quest skills [Lupus]
-//============================================================
-
-// -== Stalker ==-
-valkyrie.gat,53,58,4 script Stalker 747,{
- callfunc "F_Rebirth",Job_Thief_High,"Thief High",Job_Stalker,"Stalker";
-}
+//===== eAthena Script =======================================
+//= Advance Class jobchanger after kRO Normals.
+//===== By: ==================================================
+//= Nana
+//= finished, optimized and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//= Advance Class jobchanger after kRO Normals.
+//===== Additional Comments: =================================
+//= v1.1 Made all into functions, additional checks, etc. [Lupus]
+//= v1.2 Made numbers into constants. [Vicious]
+//= 1.3 Now saves/restores all the quest skills [Lupus]
+//============================================================
+
+// -== Stalker ==-
+valkyrie.gat,53,58,4 script Stalker 747,{
+ callfunc "F_Rebirth",Job_Thief_High,"Thief High",Job_Stalker,"Stalker";
+}
diff --git a/npc/jobs/2-2e/SoulLinker.txt b/npc/jobs/2-2e/SoulLinker.txt
index a5186c4a3..7e37850ac 100644
--- a/npc/jobs/2-2e/SoulLinker.txt
+++ b/npc/jobs/2-2e/SoulLinker.txt
@@ -1,314 +1,314 @@
-//===== eAthena Script =======================================
-//= Soul Linker Job Quest
-//===== By: ==================================================
-//= Celestria
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= A temp Soul Linker Job Changer based on the kRO quest.
-//= Quest info from RagnaInfo. Sprites from kRO screenshots
-//= 1.0 Optimized and updated [Lupus]
-//============================================================
-
-morocc_in.gat,174,30,7 script Little Boy#sltest 716,{
- if(SOUL_Q==1) goto L_Check;
- if(SOUL_Q >= 2) goto L_Warp;
- if(Class==Job_Soul_Linker) goto L_Thanks;
- mes "[Little Boy]";
- mes "*sniff sniff*";
- next;
- if((Class==Job_Taekwon) && (JobLevel>=40)) goto L_Taekwon;
- mes "The little boy is crying and";
- mes "it doesn't look like you're";
- mes "going to be able to stop him.";
- close;
-
-L_Thanks:
- mes "[Little Boy]";
- mes "Hey, Thank you for helping";
- mes "me earlier ^_^";
- close;
-
-L_Taekwon:
- mes "[Little Boy]";
- mes "Excuse me. *sniff*";
- mes "I don't suppose you couldvhelp me?";
- next;
- menu "Go on...",L_Goon,"No, I'm busy.",L_No;
-
-L_No:
- mes "[Little Boy]";
- mes "Waaaaaaaaaaaaaah~";
- close;
-
-L_Goon:
- mes "[Little Boy]";
- mes "Well you see, I was doing some";
- mes "shopping for my daddy, who's";
- mes "an alchemist, and on my way home";
- mes "a thief came and took my shopping!";
- next;
- menu "I'll get you your stuff.",-,"Awww, that's too bad.",L_No;
- mes "[Little Boy]";
- mes "Really!?";
- mes "You'll do that for me?";
- set SOUL_Q,1;
- next;
- mes "[Little Boy]";
- mes "Ok, what I need is:";
- mes "^0000FF- 1 Witherless Rose^000000";
- mes "^0000FF- 1 3-Carat Diamond^000000";
- mes "^0000FF- 1 Immortal Heart^000000";
- next;
- mes "[Little Boy]";
- mes "Please find these things quickly...";
- close;
-
-L_Check:
- if(countitem(748) < 1 || countitem(732) < 1 || countitem(929) < 1) goto L_Noitem;
- delitem 748,1;
- delitem 732,1;
- delitem 929,1;
- set SOUL_Q,2;
- if(SkillPoint) goto L_Skill;
- mes "[Little Boy]";
- mes "Wow, Thank you so much!";
- mes "You're so helpful, I think I";
- mes "know of a few other people";
- mes "who could use your help.";
- next;
- menu "Lead the way.",L_Warp,"Umm... Not right now.",-;
- mes "[Little Boy]";
- mes "Okay, come back when you change your mind.";
- close;
-
-L_Noitem:
- mes "[Little Boy]";
- mes "Awww... you haven't found all the items yet.";
- next;
- mes "[Little Boy]";
- mes "Remember, it was:";
- mes "^0000FF- 1 Witherless Rose^000000";
- mes "^0000FF- 1 3-Carat Diamond^000000";
- mes "^0000FF- 1 Immortal Heart^000000";
- next;
- mes "[Little Boy]";
- mes "Please find these things quickly...";
- close;
-
-L_Warp:
- if(SkillPoint) goto L_Skill;
- mes "[Little Boy]";
- mes "Okay, here we go";
- warp "job_soul.gat",30,30;
- close;
-
-L_Skill:
- mes "[Little Boy]";
- mes "It seems you have some skill";
- mes "points left. I can't warp you";
- mes "to my friends until you use them.";
- close;
-}
-
-job_soul.gat,30,35,2 script Lost Soul#1 827,{
- if(SOUL_Q==2) goto L_Talk1;
- mes "[Lost Soul]";
- mes "I have said all I have needed to say. Thank you.";
- close;
-
-L_Talk1:
- mes "[Lost Soul]";
- mes "Welcome to the lost plane";
- mes "This is where souls of";
- mes "those who have passed on";
- mes "go if they have not yet";
- mes "let go of what they believe";
- mes "they were meant to do.";
- next;
- mes "[Lost Soul]";
- mes "I am here because I wanted";
- mes "to protect people with my";
- mes "strong arms.";
- next;
- mes "[Lost Soul]";
- mes "Yet they were not strong";
- mes "enough to protect myself";
- mes "and those I truly loved...";
- next;
- mes "[Lost Soul]";
- mes "So now I float here in";
- mes "death, reflecting on the past";
- mes "and how it could have been";
- mes "different had I been stronger.";
- next;
- mes "[Lost Soul]";
- mes "But with time I have decided";
- mes "that dwelling on the past";
- mes "accomplishes nothing.";
- mes "Only actions can protect";
- mes "those around you.";
- next;
- mes "[Lost Soul]";
- mes "You!!";
- mes "You seem strong.";
- mes "I shall join you, and add";
- mes "My strength to yours so";
- mes "that you might protect others.";
- set SOUL_Q,3;
- next;
- mes "[Lost Soul]";
- mes "Thank you for hearing me out.";
- close;
-}
-
-job_soul.gat,25,30,3 script Lost Soul#2 744,{
- if(SOUL_Q==3) goto L_Talk2;
- if(SOUL_Q < 3) goto L_Notyet2;
- mes "[Lost Soul]";
- mes "I have said all I have";
- mes "needed to say. Thank you.";
- close;
-
-L_Notyet2:
- mes "[Lost Soul]";
- mes "Please talk to the others first.";
- close;
-
-L_Talk2:
- mes "[Lost Soul]";
- mes "It seems that you already know where you are.";
- next;
- mes "[Lost Soul]";
- mes "I am here because I wanted";
- mes "to cure the sick an injured";
- mes "with my herbs and potions.";
- next;
- mes "[Lost Soul]";
- mes "But I was inexperienced";
- mes "and accidentally mixed";
- mes "ingrediants I should not have...";
- next;
- mes "[Lost Soul]";
- mes "Those I was trying to save,";
- mes "myself, and families in the";
- mes "close vicinity all in flames";
- mes "because of my incompetance.";
- next;
- mes "[Lost Soul]";
- mes "I've spent years here furious";
- mes "at myself for making that one";
- mes "simple mistake.";
- next;
- mes "[Lost Soul]";
- mes "Sure, lots of people make";
- mes "mistakes, but seldom on that scale.";
- mes "And so I shall join you, so as to";
- mes "be a guiding voice, reminding you";
- mes "that you should always prethink";
- mes "your own actions.";
- set SOUL_Q,4;
- next;
- mes "[Lost Soul]";
- mes "Thank you for hearing me out.";
- close;
-}
-
-job_soul.gat,30,25,0 script Lost Soul#3 754,{
- if(SOUL_Q==4) goto L_Talk3;
- if(SOUL_Q < 4) goto L_Notyet3;
- mes "[Lost Soul]";
- mes "I have said all I have needed to say. Thank you.";
- close;
-
-L_Notyet3:
- mes "[Lost Soul]";
- mes "Please talk to the others first.";
- close;
-
-L_Talk3:
- mes "[Lost Soul]";
- mes "I guess it's time for my story...";
- next;
- mes "[Lost Soul]";
- mes "Study. Study. Study.";
- mes "All I ever did was study.";
- next;
- mes "[Lost Soul]";
- mes "Oh! The things I learnt.";
- mes "My vocabulary was larger than";
- mes "others, I new the names of all";
- mes "the local plants, I even helped";
- mes "in the writing of the code for";
- mes "the AI Guardian, Apocolypse.";
- next;
- mes "[Lost Soul]";
- mes "But in all my time studying";
- mes "I never made any time for";
- mes "friends, and never spent any";
- mes "time with my family.";
- next;
- mes "[Lost Soul]";
- mes "It wasn't until one day when I got sick from lack of sleep and";
- mes "no one came to my aid, that I realised just how lonely I was.";
- next;
- mes "[Lost Soul]";
- mes "So I wish to join with you.";
- mes "I shall be that gentle reminder";
- mes "that no matter how important";
- mes "something is to you, you must";
- mes "always make time for friends and family.";
- set SOUL_Q,5;
- next;
- mes "[Lost Soul]";
- mes "Thank you for hearing me out.";
- close;
-}
-
-job_soul.gat,35,30,3 script Little Boy#4 716,{
- if(SOUL_Q < 5) goto L_Notyet4;
- mes "[Little Boy]";
- mes "So you have listened to the tales of my friends?";
- next;
- mes "[Little Boy]";
- mes "They aren't bad people they've just been depressed for so very long.";
- next;
- mes "[Little Boy]";
- mes "But they seem to have renewed vigour since they talked to you.";
- mes "I haven't seen them this lively ever.";
- next;
- mes "[Little Boy]";
- mes "You seem to have a gift with people, so with your permisson,";
- mes "I would like to make you a Soul Linker.";
- next;
- menu "Yes",-,"No",L_Warpout;
-
- mes "[Little Boy]";
- mes "Very Well then.";
- mes "You are now a Soul Linker.";
- jobchange Job_Soul_Linker;
- callfunc "F_ClearJobVar";
- misceffect 247;
- next;
- mes "[Little Boy]";
- mes "Please try to help others.";
- next;
- warp "morocc_in.gat",175,31;
- close;
-
-L_Warpout:
- mes "[Little Boy]";
- mes "If you change your mind come and talk to me.";
- next;
- warp "morocc_in.gat",175,31;
- close;
-
-L_Notyet4:
- mes "[Little Boy]";
- mes "Please talk to the others first.";
- close;
+//===== eAthena Script =======================================
+//= Soul Linker Job Quest
+//===== By: ==================================================
+//= Celestria
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= A temp Soul Linker Job Changer based on the kRO quest.
+//= Quest info from RagnaInfo. Sprites from kRO screenshots
+//= 1.0 Optimized and updated [Lupus]
+//============================================================
+
+morocc_in.gat,174,30,7 script Little Boy#sltest 716,{
+ if(SOUL_Q==1) goto L_Check;
+ if(SOUL_Q >= 2) goto L_Warp;
+ if(Class==Job_Soul_Linker) goto L_Thanks;
+ mes "[Little Boy]";
+ mes "*sniff sniff*";
+ next;
+ if((Class==Job_Taekwon) && (JobLevel>=40)) goto L_Taekwon;
+ mes "The little boy is crying and";
+ mes "it doesn't look like you're";
+ mes "going to be able to stop him.";
+ close;
+
+L_Thanks:
+ mes "[Little Boy]";
+ mes "Hey, Thank you for helping";
+ mes "me earlier ^_^";
+ close;
+
+L_Taekwon:
+ mes "[Little Boy]";
+ mes "Excuse me. *sniff*";
+ mes "I don't suppose you couldvhelp me?";
+ next;
+ menu "Go on...",L_Goon,"No, I'm busy.",L_No;
+
+L_No:
+ mes "[Little Boy]";
+ mes "Waaaaaaaaaaaaaah~";
+ close;
+
+L_Goon:
+ mes "[Little Boy]";
+ mes "Well you see, I was doing some";
+ mes "shopping for my daddy, who's";
+ mes "an alchemist, and on my way home";
+ mes "a thief came and took my shopping!";
+ next;
+ menu "I'll get you your stuff.",-,"Awww, that's too bad.",L_No;
+ mes "[Little Boy]";
+ mes "Really!?";
+ mes "You'll do that for me?";
+ set SOUL_Q,1;
+ next;
+ mes "[Little Boy]";
+ mes "Ok, what I need is:";
+ mes "^0000FF- 1 Witherless Rose^000000";
+ mes "^0000FF- 1 3-Carat Diamond^000000";
+ mes "^0000FF- 1 Immortal Heart^000000";
+ next;
+ mes "[Little Boy]";
+ mes "Please find these things quickly...";
+ close;
+
+L_Check:
+ if(countitem(748) < 1 || countitem(732) < 1 || countitem(929) < 1) goto L_Noitem;
+ delitem 748,1;
+ delitem 732,1;
+ delitem 929,1;
+ set SOUL_Q,2;
+ if(SkillPoint) goto L_Skill;
+ mes "[Little Boy]";
+ mes "Wow, Thank you so much!";
+ mes "You're so helpful, I think I";
+ mes "know of a few other people";
+ mes "who could use your help.";
+ next;
+ menu "Lead the way.",L_Warp,"Umm... Not right now.",-;
+ mes "[Little Boy]";
+ mes "Okay, come back when you change your mind.";
+ close;
+
+L_Noitem:
+ mes "[Little Boy]";
+ mes "Awww... you haven't found all the items yet.";
+ next;
+ mes "[Little Boy]";
+ mes "Remember, it was:";
+ mes "^0000FF- 1 Witherless Rose^000000";
+ mes "^0000FF- 1 3-Carat Diamond^000000";
+ mes "^0000FF- 1 Immortal Heart^000000";
+ next;
+ mes "[Little Boy]";
+ mes "Please find these things quickly...";
+ close;
+
+L_Warp:
+ if(SkillPoint) goto L_Skill;
+ mes "[Little Boy]";
+ mes "Okay, here we go";
+ warp "job_soul.gat",30,30;
+ close;
+
+L_Skill:
+ mes "[Little Boy]";
+ mes "It seems you have some skill";
+ mes "points left. I can't warp you";
+ mes "to my friends until you use them.";
+ close;
+}
+
+job_soul.gat,30,35,2 script Lost Soul#1 827,{
+ if(SOUL_Q==2) goto L_Talk1;
+ mes "[Lost Soul]";
+ mes "I have said all I have needed to say. Thank you.";
+ close;
+
+L_Talk1:
+ mes "[Lost Soul]";
+ mes "Welcome to the lost plane";
+ mes "This is where souls of";
+ mes "those who have passed on";
+ mes "go if they have not yet";
+ mes "let go of what they believe";
+ mes "they were meant to do.";
+ next;
+ mes "[Lost Soul]";
+ mes "I am here because I wanted";
+ mes "to protect people with my";
+ mes "strong arms.";
+ next;
+ mes "[Lost Soul]";
+ mes "Yet they were not strong";
+ mes "enough to protect myself";
+ mes "and those I truly loved...";
+ next;
+ mes "[Lost Soul]";
+ mes "So now I float here in";
+ mes "death, reflecting on the past";
+ mes "and how it could have been";
+ mes "different had I been stronger.";
+ next;
+ mes "[Lost Soul]";
+ mes "But with time I have decided";
+ mes "that dwelling on the past";
+ mes "accomplishes nothing.";
+ mes "Only actions can protect";
+ mes "those around you.";
+ next;
+ mes "[Lost Soul]";
+ mes "You!!";
+ mes "You seem strong.";
+ mes "I shall join you, and add";
+ mes "My strength to yours so";
+ mes "that you might protect others.";
+ set SOUL_Q,3;
+ next;
+ mes "[Lost Soul]";
+ mes "Thank you for hearing me out.";
+ close;
+}
+
+job_soul.gat,25,30,3 script Lost Soul#2 744,{
+ if(SOUL_Q==3) goto L_Talk2;
+ if(SOUL_Q < 3) goto L_Notyet2;
+ mes "[Lost Soul]";
+ mes "I have said all I have";
+ mes "needed to say. Thank you.";
+ close;
+
+L_Notyet2:
+ mes "[Lost Soul]";
+ mes "Please talk to the others first.";
+ close;
+
+L_Talk2:
+ mes "[Lost Soul]";
+ mes "It seems that you already know where you are.";
+ next;
+ mes "[Lost Soul]";
+ mes "I am here because I wanted";
+ mes "to cure the sick an injured";
+ mes "with my herbs and potions.";
+ next;
+ mes "[Lost Soul]";
+ mes "But I was inexperienced";
+ mes "and accidentally mixed";
+ mes "ingrediants I should not have...";
+ next;
+ mes "[Lost Soul]";
+ mes "Those I was trying to save,";
+ mes "myself, and families in the";
+ mes "close vicinity all in flames";
+ mes "because of my incompetance.";
+ next;
+ mes "[Lost Soul]";
+ mes "I've spent years here furious";
+ mes "at myself for making that one";
+ mes "simple mistake.";
+ next;
+ mes "[Lost Soul]";
+ mes "Sure, lots of people make";
+ mes "mistakes, but seldom on that scale.";
+ mes "And so I shall join you, so as to";
+ mes "be a guiding voice, reminding you";
+ mes "that you should always prethink";
+ mes "your own actions.";
+ set SOUL_Q,4;
+ next;
+ mes "[Lost Soul]";
+ mes "Thank you for hearing me out.";
+ close;
+}
+
+job_soul.gat,30,25,0 script Lost Soul#3 754,{
+ if(SOUL_Q==4) goto L_Talk3;
+ if(SOUL_Q < 4) goto L_Notyet3;
+ mes "[Lost Soul]";
+ mes "I have said all I have needed to say. Thank you.";
+ close;
+
+L_Notyet3:
+ mes "[Lost Soul]";
+ mes "Please talk to the others first.";
+ close;
+
+L_Talk3:
+ mes "[Lost Soul]";
+ mes "I guess it's time for my story...";
+ next;
+ mes "[Lost Soul]";
+ mes "Study. Study. Study.";
+ mes "All I ever did was study.";
+ next;
+ mes "[Lost Soul]";
+ mes "Oh! The things I learnt.";
+ mes "My vocabulary was larger than";
+ mes "others, I new the names of all";
+ mes "the local plants, I even helped";
+ mes "in the writing of the code for";
+ mes "the AI Guardian, Apocolypse.";
+ next;
+ mes "[Lost Soul]";
+ mes "But in all my time studying";
+ mes "I never made any time for";
+ mes "friends, and never spent any";
+ mes "time with my family.";
+ next;
+ mes "[Lost Soul]";
+ mes "It wasn't until one day when I got sick from lack of sleep and";
+ mes "no one came to my aid, that I realised just how lonely I was.";
+ next;
+ mes "[Lost Soul]";
+ mes "So I wish to join with you.";
+ mes "I shall be that gentle reminder";
+ mes "that no matter how important";
+ mes "something is to you, you must";
+ mes "always make time for friends and family.";
+ set SOUL_Q,5;
+ next;
+ mes "[Lost Soul]";
+ mes "Thank you for hearing me out.";
+ close;
+}
+
+job_soul.gat,35,30,3 script Little Boy#4 716,{
+ if(SOUL_Q < 5) goto L_Notyet4;
+ mes "[Little Boy]";
+ mes "So you have listened to the tales of my friends?";
+ next;
+ mes "[Little Boy]";
+ mes "They aren't bad people they've just been depressed for so very long.";
+ next;
+ mes "[Little Boy]";
+ mes "But they seem to have renewed vigour since they talked to you.";
+ mes "I haven't seen them this lively ever.";
+ next;
+ mes "[Little Boy]";
+ mes "You seem to have a gift with people, so with your permisson,";
+ mes "I would like to make you a Soul Linker.";
+ next;
+ menu "Yes",-,"No",L_Warpout;
+
+ mes "[Little Boy]";
+ mes "Very Well then.";
+ mes "You are now a Soul Linker.";
+ jobchange Job_Soul_Linker;
+ callfunc "F_ClearJobVar";
+ misceffect 247;
+ next;
+ mes "[Little Boy]";
+ mes "Please try to help others.";
+ next;
+ warp "morocc_in.gat",175,31;
+ close;
+
+L_Warpout:
+ mes "[Little Boy]";
+ mes "If you change your mind come and talk to me.";
+ next;
+ warp "morocc_in.gat",175,31;
+ close;
+
+L_Notyet4:
+ mes "[Little Boy]";
+ mes "Please talk to the others first.";
+ close;
} \ No newline at end of file
diff --git a/npc/jobs/novice/novice.txt b/npc/jobs/novice/novice.txt
index 1310e4c30..38b899811 100644
--- a/npc/jobs/novice/novice.txt
+++ b/npc/jobs/novice/novice.txt
@@ -1,3428 +1,3428 @@
-//===== eAthena Script =======================================
-//= Ep 10+ Novice Training Grounds
-//===== By: ==================================================
-//= Dr.Evil & MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena SVN 3422+(Requires jA Script System)
-//===== Description: =========================================
-//= The New Novice Training Grounds Script, Script by yukito
-//= merged with english dialogues from Prometheus.
-//===== Additional Comments: =================================
-//= 1.0 Added the New Novice Training Grounds, a big thanks [MasterOfMuppets]
-//= to Dr.Evil who did 90% of the work =)
-//= 1.0b Temp measure to stop exploits. [Vicious]
-//= 1.2 Removed Duplicates [Silent]
-//= 1.3 Removed Duplicates [Toms]
-//= 1.4 Added Kafra Free Cart Tickets, as in official one [Lupus]
-//= 1.5 Fixed warps, removed map duplicates, typos [Lupus]
-//= 1.6 Changed clone maps new_1-? -> new_zone0? [Lupus]
-//= 1.7 Now Kafra Tickets are given at correct NPC/Actions [Lupus]
-//============================================================
-
-//====================================================================
-//Ragnarok Online Novice Script by yukito
-//====================================================================
-//Bulletin Board
-new_zone01.gat,66,114,4 script Bulletin Board 111,{
- mes "^FF0000=================================^000000";
- mes "^FF0000 ==^000000 ^E40CAA[Welcome] ^CC0000to^FF9000Training ^0000FFGrounds^FF0000==^000000";
- mes "^FF0000=================================^000000";
- close;
-}
-
-new_zone01.gat,53,114,4 script Shion 727,{
- if(Class != Job_Novice || Upper) goto L_Fail;
- switch (NEW_MES_FLAG0) {
- case 0: mes "[Shion]";
- mes "Hello there~";
- mes "Welcome to the";
- mes "Training Grounds!";
- next;
- mes "[Shion]";
- mes "Let's see.";
- mes "Your name is...";
- mes "" + strcharinfo(0) + ".";
- next;
- mes "[Shion]";
- mes "My name is Shion.";
- mes "Yes, this is the first time we've";
- mes "met, of course. Hahahah~";
- next;
- mes "[Shion]";
- mes "Now that we've met, is there";
- mes "anything I can help you with?";
- mes "I'm here for your questions~";
- next;
- switch ( select("Where should I go?","About Basic Interfaces.","What the hell are you!") ) {
- case 1: mes "[Shion]";
- mes "Do you see the bridge to your";
- mes "right side? Just cross the bridge";
- mes "and you'll arrive at a castle. All";
- mes "you have to do is walk inside!";
- next;
- mes "[Shion]";
- mes "The entrance of the castle";
- mes "is a ^0000FFspinning white light.^000000 These";
- mes "portals are what allow you to move";
- mes "from one zone to another.";
- next;
- mes "[Shion]";
- mes "Do you know how to move?";
- mes "Left click on a spot, and you'll";
- mes "walk over to that spot. Piece of";
- mes "cake, huh?";
- next;
- mes "[Shion]";
- mes "So go for it!";
- mes "Basically, you must enter the";
- mes "castle in order to start your";
- mes "adventures.";
- next;
- mes "[Shion]";
- mes "There are soldiers";
- mes "at the entrance, so don't";
- mes "worry about getting lost.";
- mes "Take care now~!";
- set NEW_MES_FLAG0,1;
- close;
- case 2: mes "[Shion]";
- mes "Interface...";
- mes "click', 'double-click'";
- mes "and 'drag' is? .";
- mes "click just one time,";
- mes "it is called 'click'";
- mes "click twice straightly,";
- mes "it is called 'double-click'.";
- next;
- mes "[Shion]";
- mes "'Drag' is dragging your mouse";
- mes "to the right, left, up and down";
- mes "when holding 'left-click'.";
- mes "when you block a sentence in word";
- mes "processor program";
- mes "you use this function";
- mes "don't you?";
- next;
- mes "[Shion]";
- mes "You need to have some basic knowledge";
- mes "before you know the interface.";
- mes "You will see it often in the game and...";
- next;
- mes "[Shion]";
- mes "If you cross the bridge on your right side,";
- mes "you can go learn in the castle.";
- mes "This is The Training Grounds";
- mes "for new novices.";
- mes "You should go there.";
- next;
- mes "[Shion]";
- mes "Ah, the building's entrance is...";
- mes "^0000FFSmall Spiral Light.^000000";
- mes "Click it exactly and jump in there.";
- mes "If you get in there, you will meet other helpers.";
- mes "Don't worry too much.";
- set NEW_MES_FLAG0,1;
- close;
- case 3: mes "[Shion]";
- mes "Who? me? I am nov_Shion!";
- mes "Gosh, you are so rude.";
- mes "I am doing free service, without payment.";
- mes "I feel so bad.";
- set NEW_MES_FLAG0,2;
- close;
- }
- case 1: mes "[Shion]";
- mes "Huh...?";
- mes "Why are you";
- mes "still here?";
- mes "^6A6A6A*Sigh...*";
- next;
- mes "[Shion]";
- mes "Hey, when you enter the Training";
- mes "Grounds, you'll earn all sorts of";
- mes "things that will help you play the";
- mes "game. You'll even have the chance";
- mes "to get Zeny and other rewards.";
- next;
- mes "[Shion]";
- mes "You can even gain";
- mes "experience like this!";
- set NEW_MES_FLAG0,3;
- set BaseExp,BaseExp+9;
- next;
- mes "[Shion]";
- mes "Everything you'll learn here in the";
- mes "Training Grounds will benefit your";
- mes "gameplay. So just think positive,";
- mes "okay?";
- close;
- case 2: mes "[Shion]";
- mes "Hey, man.";
- mes "Do you still have some business with me?";
- mes "Whoo, I don't need to be angry.";
- mes "(Calm down, Calm down)";
- mes "How can I help you";
- next;
- mes "[Shion]";
- mes "No, no.";
- mes "Why don't you go back to the";
- mes "Training Grounds?";
- mes "Can you see a bridge on your right side?";
- mes "Cross the bridge and enter the castle.";
- mes "There will be a helper waiting for you";
- mes "inside the castle.";
- next;
- mes "[Shion]";
- mes "Ah, if you cannot see the entrance,";
- mes "try to drag your mouse when holding right click.";
- mes "It will help you to see the hidden spot.";
- next;
- mes "[Shion]";
- mes "Then, Good bye!";
- mes " ";
- mes "And when you face a lady,";
- mes "you need to be a little more polite.";
- mes "This is a gift for you.";
- set NEW_MES_FLAG0,3;
- set BaseExp,BaseExp+9;
- close;
- case 3: mes "[Shion]";
- mes "The Training Grounds";
- mes "are located just past";
- mes "the bridge located";
- mes "to the right.";
- next;
- mes "[Shion]";
- mes "Although you'll";
- mes "be sitting through";
- mes "some classes, you";
- mes "won't regret it.";
- mes "Now, go for it!";
- close;
- }
- close;
-
-L_Fail:
- mes "[Shion]";
- mes "You shouldn't be here.";
- close2;
- savepoint "prontera.gat",273,354;
- warp "prontera.gat",273,354;
- end;
-}
-
-new_zone01.gat,144,116,2 script Guard#01 105,{
- mes "[Training Grounds Guard]";
- mes "Welcome to the Training Grounds.";
- mes "You are now in the outer court yard. Please go inside the castle to begin your training.";
- close;
-}
-
-new_zone01.gat,144,107,2 script Guard#02 105,{
- mes "[Training Grounds Guard]";
- if(rand(2)) {
- mes "Come in!";
- mes "I would like";
- mes "to welcome you to";
- mes "the Training Grounds!";
- next;
- mes "[Training Grounds Guard]";
- mes "In here, you can prepare";
- mes "yourself for your future";
- mes "adventures throughout the";
- mes "Ragnarok world!";
- } else {
- mes "Go, Novice, go!";
- mes "Fight, and grow stronger! Look towards a brighter tomorrow!";
- }
- close;
-}
-
-//Receptionist
-new_zone02.gat,100,29,4 script Receptionist#nz 86,{
- if(Class != Job_Novice || Upper) goto L_Fail;
- mes "[Training Grounds Receptionist]";
- mes "Welcome!";
- mes "You are at the entrance";
- mes "of the ^3355FFTraining Grounds^000000.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "If you're new";
- mes "to the Ragnarok world,";
- mes "please choose the";
- mes "^3355FFTraining Grounds Introduction^000000";
- mes "menu for more information.";
-L_loop:
- next;
- switch( select("Apply for training.","Direct access to Ragnarok Online.","^3355FFTraining Grounds Introduction.^000000","I need a moment to think.") ) {
- case 1: mes "[Training Grounds Receptionist]";
- mes "Thank you for applying for Novice training. For detailed information of each training course, please inquire the Guides for assistance.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "To get you started, we will supply you with a provision of 50 Zeny. When you have questions about the training course process, please feel free to ask any of the Instructors.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "You will now be transferred";
- mes "to the Training Grounds.";
- close2;
- set Zeny,Zeny+50;
- warp "new_zone02.gat",100,70;
- end;
- case 2: mes "[Training Grounds Receptionist]";
- mes "I understand.";
- mes "Please do your";
- mes "best, and I wish you";
- mes "the best of luck!";
- close2;
- set NEW_MES_FLAG0,0;
- switch( rand(6) ) {
- case 0: savepoint "prontera.gat",273,354;
- warp "prontera.gat",273,354;
- break;
- case 1: savepoint "morocc.gat",160,94;
- warp "morocc.gat",160,94;
- break;
- case 2: savepoint "geffen.gat",120,100;
- warp "geffen.gat",120,100;
- break;
- case 3: savepoint "payon.gat",70,100;
- warp "payon.gat",70,100;
- break;
- case 4: savepoint "alberta.gat",116,57;
- warp "alberta.gat",116,57;
- break;
- case 5: savepoint "izlude.gat",94,103;
- warp "izlude.gat",94,103;
- }
- end;
- case 3: mes "[Training Grounds Receptionist]";
- mes "This training grounds was established in order to provide useful information to new players of Ragnarok Online by the Rune-Midgards Kingdom's Board of Education.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "The training course is organized into two parts: the Basic Knowledge classes, and Field Combat training.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "Through the first course, players will learn the necessary knowledge for a smoother gaming experience.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "In Field Combat Training,";
- mes "players will engage in actual battle with weak monsters so they can learn the basics of fighting.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "With this battle practice,";
- mes "players will be able to gain more experience before they enter the real world.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "At the end of the training, we will provide an introduction to the 1st Job Classes. This will help players decide which job class is best for them.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "If you wish to participate in the training grounds, please choose '^3355FFApply for training^000000' in the menu.";
- next;
- mes "[Training Grounds Receptionist]";
- mes "Otherwise, if you want to skip the basic training and immediately enter the world of Ragnarok Online, please choose '^3355FFDirect access to Ragnarok Online^000000.'";
- break;
- case 4: mes "[Training Grounds Receptionist]";
- mes "I understand.";
- mes "Please, take your time.";
- close;
- }
- goto L_loop;
-
-L_Fail:
- mes "[Training Grounds Receptionist]";
- mes "You shouldn't be here.";
- close2;
- savepoint "prontera.gat",273,354;
- warp "prontera.gat",273,354;
- end;
-}
-
-//Interfaces Instructor
-new_zone02.gat,99,105,4 script Interfaces Instructor 751,{
- if (!(NEW_MES_FLAG1)) {
- mes "[Chris]";
- mes "Nice to meet you. could you show me your application?";
- next;
- mes "[Chris]";
- mes "Yes, I checked it.";
- mes "I will teach the real basic interface to "+strcharinfo(0)+".";
- mes "This is not forced to you so if you don't want, you don't need to take this course.";
- next;
- switch( select("Listen about 'Interface'.","No lecture, I just want Practical Course.","Cancel.") ) {
- case 1: mes "[Chris]";
- mes "You can move any window by dragging your mouse.";
- mes "I will explain from the basic location where you start on the screen.";
- next;
- mes "[Chris]";
- mes "First of all, if you look at the top left part of the screen,";
- mes "You can see your name and level in the window.";
- mes "It also shows how much EXP you have.";
- mes "This is a Character's ^0000FFBasic Information^000000.";
- next;
- mes "[Chris]";
- mes "I will increase your EXP.";
- mes "watch how the EXP will change in the basic Information window.";
- set NEW_MES_FLAG1,1;
- set BaseExp,BaseExp+155;
- next;
- mes "[Chris]";
- mes "Did you see it?";
- mes "and let's see...";
- next;
- mes "[Chris]";
- mes "You can open your 'Inventory' and make a party through the Information window.";
- mes "The secon EXP bar is your Job EXP.";
- mes "To learn a ^0000FFSkill^000000 you need a skill point.";
- mes "You will gain a skill point bt getting a Job EXP level.";
- next;
- mes "[Chris]";
- mes "There is a chat window in the bottom left of the screen.";
- mes "You can scroll with your mouse to see what you've said in the past and";
- mes "you can change to 'send to party' and 'send to guildsmen' by clicking on the blue dot.";
- mes "The conversation window is always in open state.";
- mes "You will use it a lot.";
- next;
- mes "[Chris]";
- mes "In the top right of the screen,";
- mes "there is a minimap it indicates your current location, party members and guilsmen.";
- mes "When you stay in a field, the ^0000FF Red Point is an Exit^000000.";
- mes "Is it helpful?";
- next;
- mes "[Chris]";
- mes "Let's see more, try to open every window by clicking in the Basic Information Window.";
- mes "Like item window, Equipment, status, etc.";
- next;
- mes "[Chris]";
- mes "You might have gotten bored even though I tried to teach you briefly.";
- mes "It is Job EXP this time.";
- set JobExp,JobExp+151;
- next;
- mes "[Chris]";
- mes "Increase Basic Skill with it.";
- next;
- mes "[Chris]";
- mes "Assistant Edwin will give you more details about things.";
- mes "If you want to learn more, go meet him.";
- mes "This is a gift for you.";
- getitem 2352,1;
- close;
- case 2: mes "[Chris]";
- mes "I will send you to the Practical Course.";
- mes "If you think you need to take more lectures,";
- mes "Come to see me anytime.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- case 3: emotion e_swt2;
- close;
- }
- }
- if (!(NEW_MES_FLAG2)) {
- mes "[Chris]";
- mes "Do you need my help?";
- mes "Can I see your application?";
- mes "Hmm...";
- mes "You didn't take the skill lectures.";
- mes "The Skill Instructor is on your leftside.";
- next;
- switch( select("Thanks!","Lectures are boring.","Cancel") ) {
- case 1: mes "[Chris]";
- mes "If you take this course You will learn usefull skill information, so pay attention.";
- mes "Well, find the skill instructor.";
- mes "I will send you to him for free of charge.";
- close2;
- warp "new_zone02.gat",84,107;
- end;
- case 2: mes "[Chris]";
- mes "I will send you to the next course,";
- mes "the Practical Lecture course.";
- next;
- if ( select("What? No.","Yes, please send me!") == 1 ) {
- mes "[Chris]";
- mes "Then, find me later when you need me.";
- close;
- } else {
- mes "[Chris]";
- mes "I wish you good luck.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- }
- case 3: emotion e_swt2;
- close;
- }
- }
- if (!(NEW_MES_FLAG3)) {
- mes "[Chris]";
- mes "Do you need my help?";
- mes "Can I see your application?";
- mes "Hmm...";
- mes "You didn't take the items lectures.";
- mes "The Item Instructor is on my rightside.";
- next;
- switch( select("Thanks!","Lectures are boring.","Cancel") ) {
- case 1: mes "[Chris]";
- mes "You can learn how to use items, and other windows.";
- mes "It will be helpful.";
- mes "Well, Go to the item instructor.";
- mes "I will send you to him for free of charge.";
- close2;
- warp "new_zone02.gat",115,107;
- end;
- case 2: mes "[Chris]";
- mes "I will send you to the next course,";
- mes "the Practical Lecture course.";
- next;
- if ( select("What? No.","Yes, please send me!") == 1 ) {
- mes "[Chris]";
- mes "Then, find me later when you need me.";
- close;
- } else {
- mes "[Chris]";
- mes "I wish you good luck.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- }
- case 3: emotion e_swt2;
- close;
- }
- }
- mes "[Chris]";
- mes "You finished all the required sourses.";
- mes "have you listened to the other Assistants?";
- mes "The next stage is practical monster-hunting.";
- mes "Are you ready?";
- next;
- switch( select("Move to next course!","I want to look arround more.","Send me to Town!") ) {
- case 1: mes "[Chris]";
- mes "The next course is practical monster-hunting.";
- mes "Pay attention to what he says, and finish the course safely.";
- mes "I wish you good luck.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- case 2: mes "[Chris]";
- mes "That is a good idea.";
- mes "We have just taught you some of the";
- mes "required basic knowledge;";
- mes "however if it is not enough, please meet the";
- mes "other assistants so you can learn more details.";
- next;
- mes "[Chris]";
- mes "If you don't know where you have to go,";
- mes "come and ask me.";
- close;
- case 3: mes "[Chris]";
- mes "Are you sure you want to move to town?";
- mes "If you think you've learnt enough,";
- mes "go to the right side and meet the";
- mes "^0000FFKafra Service.^000000";
- next;
- mes "[Chris]";
- mes "The Kafra Service offers";
- mes "'Teleportation Service'";
- mes "'Storage Service'";
- mes "Meet them";
- mes "and use their service.";
- next;
- mes "[Chris]";
- mes ".......If you leave here";
- mes "I cannot see you anymore";
- mes "but";
- mes "I hope that you are blessed wherever you go.";
- mes "Good luck.";
- close;
- }
-}
-
-new_zone02.gat,83,111,4 script Skill Instructor 753,{
- if (!(NEW_MES_FLAG2)) {
- mes "[Shecil]";
- mes ""+strcharinfo(0)+"";
- mes "It is such a good name!";
- mes "Let's start this class?";
- next;
- switch( select("What do you teach me?","Send me to Practical Course!","Cancel") ) {
- case 1: mes "[Shecil]";
- mes "I live and die for fighting!";
- mes "Some sort of special skill!!!!!!";
- mes "Ah! no, I made a mistake.";
- mes "I will teach you how to use it.";
- mes "First of all, Increasing your skill level.";
- next;
- mes "[Shecil]";
- mes "Your Skill Window is in Basic Information.";
- mes "Click ^0000FFSkill^000000.";
- mes "Another window pops up, right?";
- mes "Short key is ^0000FFS when holding down alt^000000.";
- mes "From now we will say like 'Alt+S'.";
- set NEW_MES_FLAG2,1;
- set JobExp,JobExp+151;
- next;
- mes "[Shecil]";
- mes "Did you open it?";
- mes "Do you see Basic Skill down there?";
- mes "Skill point might be 1.";
- mes "There is a mumber Clock 'Lv Up Button' at the right side beside basic skill.";
- next;
- mes "[Shecil]";
- mes "Did you increase your skill?";
- mes "If you have any questions, ask Pitch Judas";
- mes "hmmm...";
- mes "I am thinking of a usefull skill.";
- next;
- mes "[Shecil]";
- mes "Right, right!";
- mes "I will teach you First Aid Skill.";
- mes "In Emergencies, you can use this skill.";
- skill 142,1,0;
- set skill_nov,3;
- next;
- mes "^0000FF-You've learned First Aid Skill-^000000";
- next;
- mes "[Shecil]";
- mes "Now, if you open your skill window,";
- mes "^0000FFFirst Aid^000000 will be there.";
- mes "Try to double-click to use it!";
- next;
- mes "^0000FF-You received some Job Exp.-^000000";
- set JobExp,JobExp+151;
- next;
- mes "[Shecil]";
- mes "How was it?";
- mes "When you use your skill, SP decreases.";
- mes "If you use First Aid skill, it will recover some HP.";
- mes "It will be usefull for New Novices.";
- next;
- mes "[Shecil]";
- mes "Thanks for your attention!";
- mes "Oh, I am feeling so good.";
- mes "I will give you a Plus-Exp!";
- mes "Since I am a cool guy!";
- set BaseExp,BaseExp+155;
- next;
- mes "[Shecil]";
- mes "My lecture ends here.";
- mes "It was short and had many services.";
- mes "Do you want to know more? then, ask other users.";
- mes "If you think that is hard, go to talk to Assistant.";
- mes "He will teach you well.";
- next;
- switch( select("Let me look around.","Send me to the Practical Course.","Cancel.") ) {
- case 1: mes "[Shecil]";
- mes "If you think, you learned enough anybody will be fine.";
- mes "Ask one of our insctructors, they will help you.";
- mes "Cheer Up!";
- close;
- case 2: goto L_battle;
- case 3: emotion e_omg;
- }
- close;
- case 2: goto L_battle;
- case 3: emotion e_omg;
- }
- close;
- }
- if (!(NEW_MES_FLAG1)) {
- mes "[Shecil]";
- mes "What, can I help you?";
- mes "Uh?";
- mes "You didn't take interface lectures";
- mes "I know the lecture is not worth it!";
- mes "HaHaHaHa!!!!";
- next;
- switch( select("I will go take it!","I am bored. Send me to Practical Course.") ) {
- case 1: mes "[Shecil]";
- mes "Yes, it's good thinking.";
- mes "Get EXP, Items as much as you can.";
- mes "HaHaHa.";
- mes "He is in the middle.";
- mes "It is easy to find him.";
- close;
- case 2: goto L_battle;
- case 3: emotion e_omg;
- }
- close;
- }
- if (!(NEW_MES_FLAG3)) {
- mes "[Shecil]";
- mes "What can I help you?";
- mes "Huh?";
- mes "You didn't take the item lecture?";
- mes "I know the lecture is not worth it!";
- mes "HaHaHaHa!!!!";
- next;
- switch( select("I will go and take it!","I am bored. Send me to Practical Course.","Cancel.") ) {
- case 1: mes "[Shecil]";
- mes "Yes, it is a good thinking.";
- mes "Get EXP, Items as much as you can.";
- mes "Hahaha.";
- mes "I will send you to the service.";
- close2;
- warp "new_zone02.gat",115,107;
- break;
- case 2: goto L_battle;
- case 3: emotion e_omg;
- }
- close;
- }
- mes "[Shecil]";
- mes "Do you need my help?";
- mes "You've finished all the courses.";
- mes "Ah, you came back to see me";
- mes "because I am so nice.";
- mes "Is it right?";
- mes "have you met the Assistants?";
- next;
- switch( select("Send me to the next course.","Assistants?","I want to go to town.") ) {
- case 1: mes "[Shecil]";
- mes "Oh, Right.";
- mes "You should go to the Practical Lecture Course.";
- mes "Ah, I wish I could hunt mobs in the field.";
- mes "This job is so boring.";
- mes "My fists have gotten a bit rusty.";
- mes "Ok, I will send you! You should grow up well!";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- case 2: mes "[Shecil]";
- mes "Huh? you look like";
- mes "'you didn't do it before'.";
- mes "Listen to me. We teach briefly,";
- mes "not boring, but fast";
- mes "as much as we can.";
- next;
- mes "[Shecil]";
- mes "However, it is not good enough for";
- mes "some people educationally.";
- mes "There will be some people who";
- mes "want to learn more.";
- mes "so, to satisfy this, some";
- mes "Assistants";
- mes "exist to help those people.";
- mes "Go and meet them!";
- next;
- mes "[Shecil]";
- mes "Especially, Pitch Judas...";
- mes "He will teach you well about skills.";
- mes "Even though he looks dangerous.";
- mes "Hahaha!";
- close;
- case 3: mes "[Shecil]";
- mes "Do you want to go to town? You can";
- mes "use Kafra services.";
- mes "Make a right from here and go straight,";
- mes "you will see her.";
- mes "HaHaHa!";
- mes "Why don't you hurry up to meet";
- mes "her?";
- close;
- }
- end;
-L_battle:
- mes "[Shecil]";
- mes "Good, there is nothing better than experiencing reality.";
- mes "Practical Course!";
- mes "Cheer up!";
- close2;
- warp "new_zone02.gat",28,178;
- end;
-}
-
-new_zone02.gat,115,111,4 script Item Instructor 726,{
- disable_items;
- if (!(NEW_MES_FLAG3)) {
- mes "[Alice]";
- mes "Hmm... I am so bored.";
- mes "Huh? Are you new here?";
- mes "You want to take an Item Lecture, don't you?";
- next;
- menu "Yes.",-,"No, I just want to pass.",L_battle,"Where is town?",L_kafra;
- mes "[Alice]";
- mes "I will make it a short lecture.";
- mes "I know you are bored.";
- mes "Firstly, open the 'Inventory' window.";
- mes "Click 'Item' in the Basic Information Window.";
- mes "It will show you the items that it contains.";
- mes "The inventory is divided into 3 sections such as item, equip and etc.";
- next;
- mes "[Alice]";
- mes "Now, would you click the item tab?";
- mes "in the Inventory Window? I just";
- mes "gave you a Novice Potion. You can";
- mes "drink it by double-clicking it. Go";
- mes "ahead, try it!";
- set NEW_MES_FLAG3,1;
- set @potion,countitem(569);
- getitem 569,1;
- enable_items;
- next;
- if ( @potion >= countitem(569) ) {
- mes "[Alice]";
- mes "Nice~!";
- mes "And here's";
- mes "a little reward";
- mes "just for listening.";
- set BaseExp,BaseExp+155;
- next;
- }
- disable_items;
- mes "[Alice]";
- mes "Let me explain about";
- mes "items in the ^0000FFequip^000000 tab";
- mes "of the Inventory Window.";
- next;
- mes "[Alice]";
- mes "When you click on the 'equip tab',";
- mes "you can view every item in your";
- mes "inventory that you can equip. Let";
- mes "me give you some equipment so that";
- mes "you can try them on.";
- next;
- getitem 2510,1;
- getitem 2414,1;
- getitem 5055,1;
- enable_items;
- mes "[Alice]";
- mes "Got them? Good.";
- mes "Now, double-click";
- mes "on the Novice Slippers";
- mes "I just gave you to";
- mes "put them on.";
- next;
- if ( getequipisequiped(6) ) {
- mes "[Alice]";
- mes "Hooray~!";
- mes "You did it!";
- mes "You deserve a reward!";
- set BaseExp,BaseExp+155;
- next;
- }
- disable_items;
- mes "[Alice]";
- mes "Would you";
- mes "press the ^0000FF'F12'^000000 key?";
- mes "This will summon your";
- mes "Hotkey bar on your screen.";
- next;
- mes "[Alice]";
- mes "There is a column from ^0000FFF1 to F9^000000";
- mes "If you took a skill lecture,";
- mes "you are supposed to have 'First Aid'.";
- mes "Drag the skill to the 'Short key window'.";
- next;
- mes "[Alice]";
- mes "Do you understand ?";
- mes "To use skills, you need some skill point,";
- mes "and anyway, you cannot put passive skills in the 'Short key window'.";
- set JobExp,JobExp+151;
- next;
- mes "[Alice]";
- mes "'Alice' simple and good quality lecture ends here.";
- mes "Lastly I will give you some items, which can help you.";
- getitem 601,10;
- getitem 602,2;
- getitem 569,50;
- next;
- mes "[Alice]";
- mes "However, ^FF0000do not use the Fly Wing or Butterfly Wing ^000000in these Training Grounds or you could be stuck here forever. Those items are for when you graduate, okay?";
- next;
- mes "[Alice]";
- mes "And lastly...";
- mes "I will give";
- mes "you some Job experience!";
- set JobExp,JobExp+151;
- next;
- menu "What do I have to do?",-,"Then, Practical Course!",L_battle,"Cancel.",L_bye;
- mes "[Alice]";
- mes "Is there any Instructor that you didn't meet yet?";
- mes "They are not gracious as much as I am";
- next;
- mes "[Alice]";
- mes "However, some assistants are really good,";
- mes "and there are some hidden things.";
- mes "So if you want, you can stay here longer and know them.";
- mes "If not ask anybody and tell them where you want to go.";
- close;
- }
- if (!(NEW_MES_FLAG1)) {
- mes "[Alice]";
- mes "How can I help you?";
- mes "You didn't take a interface lecture.";
- mes "Chris will be dissapointed.";
- mes "Why don't you go and meet him?";
- next;
- menu "Ok, I will meet him.",-,"It is boring, I want to go to Practical Course.",L_battle1,"What do I have todo to goto town?",L_kafra;
- mes "[Alice]";
- mes "It's a good idea.";
- mes "When you came here, you had to see 'Interface Instructor'.";
- mes "He is in the middle of the hall.";
- mes "Also he has some gifts for you!";
- mes "You don't want to lose those presents, do you?";
- close;
- }
- if (!(NEW_MES_FLAG2)) {
- mes "[Alice]";
- mes "How can I help you?";
- mes "Oh, you didn't take ^0000FFSkill Lecture^000000 yet.";
- mes "Shecil will be dissapointed.";
- mes "Why don't you go meet her?";
- next;
- menu "Yes, I will meet her.",-,"Boring, I want to go to Practical Course.",L_battle1,"How to get to town?",L_kafra;
- mes "[Alice]";
- mes "It's a good idea.";
- mes "Shecil is on the left side of the hall.";
- mes "I will send you there.";
- mes "Study Hard!";
- close2;
- warp "new_zone02.gat",84,107;
- end;
- }
- mes "[Alice]";
- mes "Huh? did you get lost?";
- mes "Do you need some help?";
- mes "I think you learned enough.";
- mes "Do you want to go somewhere?";
- next;
- menu "I don't know where I can go.",-,"I want to go to town.",L_kafra,"Cancel.",L_bye;
- mes "[Alice]";
- mes "Hmm... You already know how to use items and skills.";
- mes "Practical Course still remains.";
- mes "Do you want to go to Practical Course?";
- mes "Then, I will send you.";
- next;
- if ( select("Let me go!","Wait for a moment.") == 1 ) {
- mes "[Alice]";
- mes "You got your equipment that I gave you right?";
- mes "Wear those tight.";
- mes "Ok, I will let you go.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- } else {
- mes "[Alice]";
- mes "Ok.";
- mes "If you need anything, call me anytime.";
- close;
- }
- end;
-L_battle:
- mes "[Alice]";
- mes "Boring";
- mes "Do you want to go to the Practical Course directly?";
- mes "Hmmm... Did you meet every instructor?";
- mes "It's better for you to meet all of them.";
- next;
- if ( select("Only Practical Course!","Wait for a moment.") == 1 ) {
-L_battle1:
- mes "[Alice]";
- mes "Huh.. You are so energetic.";
- mes "I want you to listen to the instructor carefully.";
- mes "The information that you learn there may save your life.";
- mes "Ok, I will send you there.";
- mes "Goodbye.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- } else {
- mes "[Alice]";
- mes "Yes, You might want to meet people more here";
- mes "there are some Assistants who can help you.";
- mes "You ought to receive items as much as you can here";
- mes "then, you can leave.";
- close;
- }
-L_kafra:
- mes "[Alice]";
- mes "If you want to go to town, you can ask the kafra Employee to go.";
- mes "Prontera, Morroc, Payon, etc...";
- mes "She will send you wherever you want to go";
- close;
-L_bye:
- mes "[Alice]";
- mes "Hmm...";
- close;
-}
-
-new_zone02.gat,118,108,4 script Kafra Employee 94,{
- mes "[Kafra Employee]";
- mes "Welcome to";
- mes "Kafra Corporation.";
- mes "The Kafra services are";
- mes "always on your side.";
- next;
- mes "[Kafra Employee]";
- mes "I've been dispatched from Kafra Corporation Headquarters to assist new players such as yourself.";
- next;
- mes "[Kafra Employee]";
- mes "Please, take heed!";
- mes "If you move to a town";
- mes "^4d4dffYou will be unable to return to the Training Grounds ever again^000000.";
- next;
- if ( select("Teleport Service","About Kafra services") == 1 ) {
- mes "[Kafra Employee]";
- mes "I see, you must want to teleport to a town in Rune-Midgard imediately. First, let me briefly inform you about the different towns and cities in Ragnarok.";
- next;
- mes "[Kafra Employee]";
- mes "Prontera is the capital of the Rune-Midgards kingdom, and its satellite, Izlude, is closeby.";
- next;
- mes "[Kafra Employee]";
- mes "^996633Morroc^000000 is in the desert. It's the town where you can change your job to the Thief and Assassin classes.";
- next;
- mes "[Kafra Employee]";
- mes "^006600Payon^000000 is in the mountains, and is famous for its Archer Village, where Novices can change their jobs to Archers.";
- next;
- mes "[Kafra Employee]";
- mes "The city of magic, ^993300Geffen^000000, is where people go to become Mages and Wizards.";
- next;
- mes "[Kafra Employee]";
- mes "^003399Alberta^000000, the port city, is where the Merchant Guild is located. You must also go to Alberta if you wish to travel by sea.";
- next;
- mes "[Kafra Employee]";
- mes "Please choose";
- mes "your destination.";
- next;
- if ( NEW_MES_FLAG1 || NEW_MES_FLAG2 || NEW_MES_FLAG3 ) {
- if ( select("Practical Course","Prontera","Morroc","Payon","Alberta","Geffen") == 1 ) {
- mes "[Kafra Employee]";
- mes "You will be sent to Practical Course.";
- close2;
- warp "new_zone02.gat",28,178;
- end;
- }
- set @menu,@menu-1;
- } else {
- menu "Prontera",-,"Morroc",-,"Payon",-,"Alberta",-,"Geffen",-;
- }
- switch ( @menu ) {
- case 1: mes "[Kafra Employee]";
- mes "You have decided";
- mes "to go to Prontera.";
- mes "May God be with you.";
- close2;
- callsub L_prewarp;
- savepoint "prontera.gat",118,72;
- warp "prontera.gat",150,50;
- end;
- case 2: mes "[Kafra Employee]";
- mes "Desert City, Morroc.";
- mes "In the middle of town, there is a beautiful oasis.";
- mes "...";
- mes "I will pray you keep your hope in your heart always.";
- close2;
- callsub L_prewarp;
- savepoint "morocc.gat",151,98;
- warp "morocc.gat",155,110;
- end;
- case 3: mes "[Kafra Employee]";
- mes "Hm? do you want to be an archer?";
- mes "I will send you to Payon.";
- mes "May God bless you.";
- close2;
- callsub L_prewarp;
- savepoint "payon.gat",160,58;
- warp "payon.gat",166,67;
- end;
- case 4: mes "[Kafra Employee]";
- mes "Harbor City, Alberta.";
- mes "This town is a base of trade.";
- mes "If you want to see different cultures, you have to go through here.";
- mes "HuHu... I think you are going to go to the Merchant Association.";
- mes "May God bless you.";
- close2;
- callsub L_prewarp;
- savepoint "alberta.gat",31,233;
- warp "alberta.gat",114,58;
- end;
- case 5: mes "[Kafra Employee]";
- mes "City of Magic.";
- mes "There is a big 'Geffen Tower' in the middle of town.";
- mes "I will send you arround the water fountain.";
- mes "May God bless you.";
- close2;
- callsub L_prewarp;
- savepoint "geffen.gat",118,37;
- warp "geffen.gat",121,65;
- end;
- }
- } else {
- mes "[Kafra Employee]";
- mes "Let me introduce you";
- mes "to the Kafra Services.";
- mes "In the menu, please choose";
- mes "the service you'd like to";
- mes "learn more about.";
-L_loop:
- next;
- switch( select("Save service.","Storage service.","Teleport service.","Cart rental service.","Cancel.") ) {
- case 1: mes "[Kafra Employee]";
- mes "When you talk to a Kafra Employee and ask for the save Service, the location of where you will revive, after being defeated in battle, will be changed.";
- next;
- mes "[Kafra Employee]";
- mes "Your Respawn Point is always the last place where you have saved. Using a Butterfly Wing will return you to the place where you";
- mes "last saved.";
- next;
- if (!(NEW_LVUP0)) {
- set NEW_LVUP0,1;
- set BaseExp,BaseExp+155;
- }
- mes "[Kafra Employee]";
- mes "The save Service";
- mes "is also provided by";
- mes "the Kafra Corporation";
- mes "free of charge~!";
- break;
- case 2: mes "[Kafra Employee]";
- mes "The Kafra Corporation is the world's largest company with a long and distinguished history on the Rune-Midgard continent.";
- next;
- mes "[Kafra Employee]";
- mes "You can store and retrieve";
- mes "your items in any town at your convenience. This Storage is shared by every character on one account.";
- next;
- mes "[Kafra Employee]";
- mes "It's unreasonable to carry all of your items with you when you don't need them right away. Please use our Storage and keep your items safe and secure.";
- next;
- mes "[Kafra Employee]";
- mes "Our convenient Storage Service";
- mes "is provided to our customers for a small fee which is different from town to town.";
- next;
- mes "[Kafra Employee]";
- mes "However, you must be";
- mes "at least ^3355FFBasic Skill Level 6^000000";
- mes "to use the Storage.";
- next;
- mes "[Kafra Employee]";
- mes "There are 3 different item sections of the Storage into which items are organized: Consumable, Equipment and Etc.";
- next;
- mes "[Kafra Employee]";
- mes "There are a maximum of 300 Inventory Slots in Kafra Storage, meaning you can have up to 300 different kinds of items in Storage.";
- next;
- mes "[Kafra Employee]";
- if (!(NEW_JOBLVUP)) {
- set NEW_JOBLVUP,1;
- set JobExp,JobExp+151;
- }
- mes "Remember though, that in the case of Equipment, each item takes up one Inventory Slot. The maximum number of items that can be placed in Kafra Storage is 30,000.";
- break;
- case 3: mes "[Kafra Employee]";
- mes "The Kafra Corporation";
- mes "provides our valued customers with a convenient Teleport Service which greatly cuts down on your";
- mes "traveling time.";
- next;
- mes "[Kafra Employee]";
- mes "Our Teleport Service is safe and comfortable, and will allow you to fully explore the various lands of the Rune-Midgard continent.";
- next;
- mes "[Kafra Employee]";
- mes "We thank our valued customers for their great support and continue to provide them with the best";
- mes "of service.";
- break;
- case 4: mes "[Kafra Employee]";
- mes "The Kafra Corporation";
- mes "provides a Cart Rental Service to Merchants, as well as Blacksmiths and Alchemists.";
- next;
- mes "[Kafra Employee]";
- mes "The flamboyantly mysterious";
- mes "^CE6300Super Novice^000000 can use Carts, but we officially don't have a contract with that class. Still, somehow...";
- next;
- mes "[Kafra Employee]";
- mes "Anyway, Merchants, Blacksmiths and Alchemists must also learn the ^3355FFPush Cart^000000 skill in order to be able to rent a cart.";
- next;
- mes "[Kafra Employee]";
- mes "The Cart Rental service";
- mes "charge will differ from";
- mes "town to town.";
- break;
- case 5: mes "[Kafra Employee]";
- mes "I hope you are satisfied with my";
- mes "explanation about the Kafra corporation.";
- close;
- }
- goto L_loop;
- }
- end;
-L_prewarp:
- if (!(NEW_MES_FLAG1) && !(NEW_MES_FLAG2) && !(NEW_MES_FLAG3)) {
- getitem 569,100;
- getitem 1243,1;
- getitem 2414,1;
- getitem 2510,1;
- getitem 2352,1;
- getitem 2112,1;
- getitem 601,10;
- getitem 602,2;
- }
- getitem 7059,5; //Free Storage Ticket
- getitem 7060,5; //Free Warp Ticket
- set NEW_MES_FLAG0,0;
- set NEW_MES_FLAG1,0;
- set NEW_MES_FLAG2,0;
- set NEW_MES_FLAG3,0;
- set NEW_MES_FLAG4,0;
- set NEW_MES_FLAG5,0;
- set NEW_LVUP0,0;
- set NEW_LVUP1,0;
- set NEW_JOBLVUP,0;
- return;
-}
-
-new_zone02.gat,121,101,2 script Guide Soldier 105,{
- mes "[Soldier]";
- mes "We, Soldiers, are guiding Novices here in the gate way of town.";
- mes "When you go to a new town, Please visit Guide Soldier and receive their information for the map.";
- next;
- mes "[Soldier]";
- mes "Some soldiers wear different garment in some towns.";
- mes "I just anted to let you know about it as a reference.";
- mes "Go meet them and talk to them.";
- next;
- mes "[Soldier]";
- mes "If you want to go to town, ask the Kafra Employee right before you.";
- mes "She will send you to town.";
- close;
-}
-
-//Interface Assistant
-new_zone02.gat,161,182,6 script Interface Assistant 92,{
- mes "[Edwin]";
- mes "I am an Interface Assistant.";
- mes "Choose what you want to know more about.";
-L_loop:
- next;
- switch( select("Basic Information Window","Party Window","Item Window","Option Window","Equipment Window","Cancel") ) {
- case 1: mes "[Edwin]";
- mes "Let's see the Basic Information Window.";
- mes "You can find your name, base level, you job and your job level displayed on the window.";
- mes "^800FFFBase lvl^000000 is your character's level.";
- next;
- mes "[Edwin]";
- mes "^800FFFJob level^000000 shown under the base level meant the job level of your character's class.";
- mes "If you took the Instructors lectures, of course, you will understand those.";
- next;
- mes "[Edwin]";
- mes "On the basic inforamtion window,";
- mes "your current experience showup aswell.";
- mes "Experience points in Ragnarok Online are indicated by % and base and job level are seperate.";
- mes "When either reaches 100% it will be raised by one level,";
- mes "this bar will then reset to 0% for the next level.";
- next;
- mes "[Edwin]";
- mes "HP means your Health Points.";
- mes "When it raches 0, you will faint and not be able to fight.";
- mes "You can either return to your save point or wait until somebody revives you.";
- mes "If you die on fields or dungeons,";
- mes "you will receive a^4d4dff -1% EXP penalty^000000.";
- mes "So be careful.";
- next;
- mes "[Edwin]";
- mes "SP means your Spell Points.";
- mes "when you become a 1st class,";
- mes "you will learn unique skills of the class and then you will be able to use your SP.";
- mes "Your skill instructor will teach you more about your skills.";
- next;
- mes "[Edwin]";
- mes "If you want to check your weight limit,";
- mes "you can check thr weight at the bottom left of the basic window.";
- mes "It will show your current weight / your maximum weight limit.";
- mes "?•?If your weight becomes over 50% of the maximum,";
- mes "your HP and SP will not restore naturally.";
- mes "So be carefull.";
- next;
- mes "[Edwin]";
- mes "The numerical value next to the weight limit shows the current amount of money you have.";
- mes "The currency used in the Rune-Midgard Kingdom is Zeny.";
- next;
- mes "[Edwin]";
- mes "There are buttons at the right side of the window.";
- mes "They are all part of the interface menu.";
- mes "Click them one by one, check what you can do with them.";
- mes "The shortcut key for minimising / maximizing the basic information window is 'Alt+V' refer to your information.";
- break;
- case 2: mes "[Edwin]";
- mes "You can open the party window by pressing the friend buttin on the basic infomation window,";
- mes "or you can use 'Alt+Z' for it's shortcut.";
- mes "You can check all members of your party with this window.";
- next;
- mes "[Edwin]";
- mes "The founder of the party can determine the distribution of EXP and items to the party.";
- mes "You can also see the location of your members on the mini-map.";
- next;
- mes "[Edwin]";
- mes "On the party window, not only your party members but also your friends showup.";
- mes "You can whisper them or delete them from your friends list.";
- next;
- mes "[Edwin]";
- mes "You can learn about organizing a party from your skill instructor.";
- mes "Oh, well, I guess it's best if you try it out on your own.";
- break;
- case 3: mes "[Edwin]";
- mes "The item window is divided into 3 sections.";
- mes "Such as item, equip and etc.";
- mes "Items is used for consumeable items.";
- mes "Equip is for equipment items";
- mes "Etc is for miscelanious items.";
- next;
- mes "[Edwin]";
- mes "Your weight limit does limit the amount of items you can carry with you ans the limitation of the amount of an item.";
- mes "In this case, you must use the Kafra storage.";
- mes "Also, equipment and consumeable items can be set on the hotkey window.";
- next;
- mes "[Edwin]";
- mes "You can open the Hotkey window by pressing F12, you can put items there from F1 to F9.";
- mes "You can switch the hotkey windows by pressing the F12 key again.";
- break;
- case 4: mes "[Edwin]";
- mes "You can open the option window with the option button on the basic information window,";
- mes "but you can use the 'Alt+O' command aswell.";
- mes "You can adjust sound, skin and transparency of the skin through the option window.";
- next;
- mes "[Edwin]";
- mes "With the sound button,";
- mes "you can turn the background music on / off or turn the volume up or down.";
- mes "With the effect button, you can adjust the sound effects volume.";
- next;
- mes "[Edwin]";
- mes "With the skin option, you can change the menu skin.";
- mes "Scroll up / down the list of skins you have, and choose a skin.";
- mes "You can also download skins from our website.";
- next;
- mes "[Edwin]";
- mes "The snap option allows your mouse cursor to automatically move to a nearby target.";
- mes "When you click to attack,";
- mes "the cursor of the mouse will automatically change into a sword.";
- mes "Skill and item targeting also work with the snap option.";
- next;
- mes "[Edwin]";
- mes "It could be usefull or annoying if you're not used to it";
- mes "Well... once you get used to it,";
- mes "you will be able to adjust your own snap options.";
- next;
- mes "[Edwin]";
- mes "Well, it all depends on your experience.";
- mes "That's all there is for the option window.";
- break;
- case 5: mes "[Edwin]";
- mes "Click the equip button on your basic window or press 'Alt+Q'.";
- mes "You will see the items that your character has equiped now.";
- next;
- mes "[Edwin]";
- mes "For starters, every character starts with a kife and a cotton shirt.";
- mes "There are 2 ways of changing your equipment.";
- mes "Double click equipment in the item window or drag an item to the equipment window.";
- next;
- mes "[Edwin]";
- mes "You can also switch your equipment by placing them on the F12 hotkey bar.";
- mes "You will understand this when you try it on your own.";
- break;
- case 6: mes "[Edwin]";
- mes "Feel free to ask me anytime.";
- close;
- }
- goto L_loop;
-}
-
-new_zone02.gat,182,182,4 script Status Assistant 754,{
- mes "[Jarre Riotte]";
- mes "Welcome new adventurer.";
- mes "I, Jarre Riotte will help you learn about the fundamental rules of your characters status.";
- next;
- mes "[Jarre Riotte]";
- mes "I am willing to help you learn more about the statuses more then anything else,";
- mes "so feel free to ask me about the character abilities you're wondering about.";
- next;
- mes "[Jarre Riotte]";
- mes "By the way...";
- mes "It is called 'Status'.";
- mes "STR stands for Strength, AGI stansds for Agility.";
- mes "VIT stand for Vitality, INT stands for Intelligence.";
- mes "DEX stands for Dexterity, LUK stands for Luck.";
-L_loop:
- next;
- switch( select("Str and Agi.","Vit and Int.","Dex and Luk.","Cancel") ) {
- case 1: mes "[Jarre Riotte]";
- mes "Let me explain Strength first.";
- mes "";
- mes "^4D4DFFFStrength(STR)^000000 increases ^4D4DFFFphysical attack damage(ATK)^000000 ";
- mes "and your ^4D4DFFFmaximum weight limit^000000.";
- mes "1 STR increases 1 physical attack damage,";
- mes "also certain attack damage bonuses occur by increments of 10 STR.";
- next;
- mes "[Jarre Riotte]";
- mes "For instance,";
- mes "let's say your current strength is";
- mes "48 + 1. ";
- mes "Your original STR is 48, 1 at the ";
- mes "end is a bonus status.";
- mes "Out of total 49, when you double 4,";
- mes "the head number of 49 by 4,";
- mes "you will have 16 as the physical";
- mes "attack damage bonus";
- next;
- mes "[Jarre Riotte]";
- mes "Let's say you leveled up and now";
- mes "your strength is 49+1.";
- mes "Then your STR's total is 50,";
- mes "the bonus on the physical attack";
- mes "damage will be 25.";
- mes "If your STR is 100, 10 the head";
- mes "number of 100, times 10 will be a";
- mes "100.";
- next;
- mes "[Jarre Riotte]";
- mes "Ok, now let's move on to Agility.";
- mes "Agility affects on ^4d4dffthe Flee Rate^000000";
- mes "which allows you to avoid enemies'";
- mes "attack and the characters ^4d4dffAttackSpeed^000000.";
- next;
- mes "[Jarre Riotte]";
- mes "1 AGI increases 1 Flee Rate,";
- mes "1 level increases 1 Flee Rate";
- mes "as well.";
- mes "Therefore, ^4d4dffFlee Rate equals AGI +^000000";
- mes "^4d4dfflevel.^000000";
- next;
- mes "[Jarre Riotte]";
- mes "Alright, I will give you an";
- mes "example.";
- mes "Let's say you're at level 40";
- mes "possessing 40 AGI.";
- mes "Following the Flee Rate formula,";
- mes "your flee rate will be a total of";
- mes "80.";
- mes "The Flee Rate is divided into";
- mes "normal Flee Rate + perfect dodge,";
- mes "AGI is only involved with the";
- mes "normal Flee Rate.";
- next;
- mes "[Jarre Riotte]";
- mes "The perfect flee rate is related to";
- mes "LUK status,";
- mes "we will discuss about the status";
- mes "later.";
- mes "As your Attack Speed (ASPD) is";
- mes "increased, the delay between one";
- mes "attack and the next is reduced.";
- mes "ASPD is the numerical value of the";
- mes "increment and differs by job class.";
- mes "Please remember that.";
- break;
- case 2: mes "[Jarre Riotte]";
- mes "Our next subject will be Vitality";
- mes "(VIT) and Intelligence.";
- mes "^4D4DFFVitality^000000 affects the ^4D4DFFMaximum HP, amount of HP restoration and defense.^000000";
- mes "The amount of HP increased by 1 VIT";
- mes "differs by job class,";
- mes "the Swordsman class benefit the most";
- mes "from VIT increment out of all";
- mes "classes.";
- next;
- mes "[Jarre Riotte]";
- mes "Let's check defenses.";
- mes "On your stat window,";
- mes "Defense will show as DEF. Defense";
- mes "is shown as 2 different numerical";
- mes "values,";
- mes "How Vitality affects these values";
- mes "is shown as the second number of";
- mes "the two.";
- next;
- mes "[Jarre Riotte]";
- mes "Now you must be wondering about the";
- mes "first of the 2 numerical values.";
- mes "The first one shows the defense";
- mes "from your equipment and armour.";
- next;
- mes "[Jarre Riotte]";
- mes "The defense increased by equipments";
- mes "reduces the amount of damage";
- mes "you're dealt from an enemy by a %";
- mes "of the total damage and the defense";
- mes "from VIT reduces the amount of";
- mes "damage by number.";
- next;
- mes "[Jarre Riotte]";
- mes "I guess you understood, didn't you?";
- mes "The next subject is about";
- mes "Intelligence (INT).";
- mes "If you wish to major in some kind";
- mes "of complicated work,";
- mes "which requires you to be extremely";
- mes "intelligence and knowledgeable,";
- mes "I can recommend you to the";
- mes "Schwicherbil Magic Academy.";
- next;
- mes "[Jarre Riotte]";
- mes "Oh well, let's talk about INT.";
- mes "INT affects the maximum amount of";
- mes "^4D4DFFSP, SP restoration,^000000";
- mes "the ^4D4DFFdamage of your magic attack^000000";
- mes "^4d4dff(MATK)^000000 and your ^4D4DFFdefense against magic attack (MDEF)";
- mes "The SP amount and MATK increased by";
- mes "1 INT is dependent on job class,";
- mes "just like VIT.";
- next;
- mes "[Jarre Riotte]";
- mes "Just like normal DEF,";
- mes "Your MDEF shows as 2 different ";
- mes "numerical values,";
- mes "what INT affects are shown on the";
- mes "second value.";
- next;
- mes "[Jarre Riotte]";
- mes "In order to study elements which";
- mes "consist of this world";
- mes "You must be intelligent enough and";
- mes "must improve the knowledge.";
- mes "So scholars like me or wizards,";
- mes "place their priority into INT.";
- break;
- case 3: mes "[Jarre Riotte]";
- mes "Our last subject is Dexterity (DEX)";
- mes "and Luck (LUK).";
- mes "Ironically those 2 stats are";
- mes "totally opposed to each other by";
- mes "their means, you know.";
- mes "Dexterity is result in your effort";
- mes "to be accurate and Luck is result";
- mes "in your pure luck.";
- mes "Hahaha....";
- mes "Oh, don't worry me, I am just ";
- mes "talking to myself.";
- mes "Now, shall we start?";
- next;
- mes "[Jarre Riotte]";
- mes "Dexterity mainly affects your";
- mes "accuracy,";
- mes "attack speed (ASPD) and your average";
- mes "attack strength.";
- mes "Let me explain...";
- mes "If you have low DEX, the difference";
- mes "between the minimum damage and the";
- mes "maximum damage becomes huge,";
- mes "also the average damage is not stable.";
- mes "That's why DEX is important.";
- next;
- mes "[Jarre Riotte]";
- mes "Especially in the case of using";
- mes "^4D4DFFbows^000000 as your main weapon,";
- mes "attack strength is based on ^4D4DFFDEX^000000.";
- mes "If you wish to become an archer,";
- mes "please focus on DEX.";
- mes "Also the accuracy is affected by";
- mes "character level + Dex";
- next;
- mes "[Jarre Riotte]";
- mes "Let's say you're at level 40";
- mes "possessing 20 DEX,";
- mes "your accuracy equals 40 + 20, so";
- mes "60.";
- mes "Also DEX reduces the casting time";
- mes "of spells.";
- mes "Now, let me explain about LUK.";
- next;
- mes "[Jarre Riotte]";
- mes "LUK (Luck) affects the chance for a";
- mes "critical attack,";
- mes "the Flee Rate and a small amount of";
- mes "damage you deal to monsters.";
- mes "For critical attack,";
- mes "the start value is 1 for everyone";
- mes "and it's increased by ^4D4DFF1^000000";
- mes "for every ^4D4DFF3 LUK.^000000";
- next;
- mes "[Jarre Riotte]";
- mes "With more LUK, comes more chances";
- mes "to do critical attacks to your";
- mes "enemies.";
- mes "A critical attack means an attack ";
- mes "that pierces the defense of an";
- mes "enemy.";
- mes "A critical attack has a";
- mes "distinguished damage effect as";
- mes "well.";
- next;
- mes "[Jarre Riotte]";
- mes "For every 10 LUK you get 1 point to";
- mes "your perfect dodge, which is a kind";
- mes "of Flee Rate.";
- mes "When you perform a perfect dodge a";
- mes "^FF7F00Lucky^000000 effect shows up on your head";
- mes "and you will perfectly avoid an";
- mes "attack from an enemy.";
- next;
- mes "[Jarre Riotte]";
- mes "Well, I must, luck is a good";
- mes "thing to have,";
- mes "but that doesn't mean you need it";
- mes "before everything else.";
- mes "Do you have any other questions?";
- break;
- case 4: mes "[Jarre Riotte]";
- mes "I hope my class was helpful to you.";
- mes "I really hope so.";
- close;
- }
- goto L_loop;
-}
-
-new_zone02.gat,184,172,4 script Skill Assistant 47,{
- mes "[Pitch Judas]";
- mes "Welcome. I have been waiting for";
- mes "you for a long time!!";
- mes "Oh look at this cute little ";
- mes "novice!";
- mes "I, Pitch, feel so responsible for";
- mes "your performance,";
- mes "I will be teaching you with my";
- mes "best effort.";
- emotion e_kis;
-L_loop:
- next;
- switch( select("Passive and Active Skills.","Passive, Basic Skills.","Use of Emoticons","Cancel") ) {
- case 1: mes "[Pitch Judas]";
- mes "You have chosen the passive and";
- mes "active skills.";
- mes "I am explaining the passive skills";
- mes "first, please pay attention.";
- mes "First, could you open your skill";
- mes "windows by pressing 'Alt+S'.";
- next;
- mes "[Pitch Judas]";
- mes "Can you see an available skill in";
- mes "Skill Tree window?";
- mes "After you increase Basic Skill,";
- mes "There will be 'Passive' on the";
- mes "right";
- mes "Now, to see Basic Skill's";
- mes "description";
- mes "Please, do right-click the icon.";
- next;
- mes "[Pitch Judas]";
- mes "'Enable to apply to Basic Interface";
- mes "Skills'";
- mes "Do you see this sentence?";
- mes "Every skill are really needed when";
- mes "you play this game.";
- mes "You must not spend your SP with";
- mes "these skills.";
- next;
- mes "[Pitch Judas]";
- mes "Briefly, passive skill means a";
- mes "skill that does not consume SP to";
- mes "be activated";
- mes "Most of the time, those are the";
- mes "most basic skills for a job class.";
- next;
- mes "[Pitch Judas]";
- mes "On the contrary,";
- mes "um! active skills means a skill that";
- mes "requires SP to be activated.";
- mes "Also you must use an active skill";
- mes "manually by clicking its icon or";
- mes "by registering it as short key";
- mes "in order to activate it.";
- mes "As you use an active skill, a";
- mes "certain amount of SP will be spent";
- mes "as much as the skill requires.";
- mes "The Bash skill for Swordsman, Heal";
- mes "for Acolytes, are active skills for";
- mes "instance.";
- next;
- mes "[Pitch Judas]";
- mes "If you did pay attention in your";
- mes "Classes";
- mes "you are supposed to have a skill,";
- mes "which is 'First Aid'";
- mes "Double-Click it to use it.";
- mes "The skill will start with spending";
- mes "SP";
- next;
- mes "[Pitch Judas]";
- mes "For your understanding, I would";
- mes "say,";
- mes "most skills which are focused on";
- mes "mental or physical training of the";
- mes "job classes";
- mes "are described as passive skills.";
- mes "And skills which need its user to";
- mes "activate them manually";
- mes "by their needs are described as";
- mes "active skills.";
- mes "Do you understand?";
- next;
- mes "[Pitch Judas]";
- mes "If you are still not sure about my";
- mes "lesson";
- mes "I am willing to go over it once";
- mes "again.";
- break;
- case 2: mes "[Pitch Judas]";
- mes "The pure passive skills!";
- mes "The starting skills of Ragnarok! 8";
- mes "things you must be aware of to";
- mes "play!";
- mes "Our first subject is basic skills";
- next;
- mes "[Pitch Judas]";
- mes "When you right click with your";
- mes "mouse on your skill windows,";
- mes "you can check the descriptions of";
- mes "the skills.";
- mes "However, for your better";
- mes "understanding, I prepared this";
- mes "lesson.";
-L_loop1:
- next;
- switch( select("Trade and Exchange","Organising & Joining party","Opening Chat room","Storage Use","No thanks, I know already.") ) {
- case 1: mes "[Pitch Judas]";
- mes "When you go visit our official";
- mes "website at ^4d4dffhttp://ragnarok.co.kr^000000,";
- mes "you can find a full explanation";
- mes "about trade and exchange with";
- mes "pictures.";
- mes "In order to trade items or Zeny";
- mes "with other people, you must learn";
- mes "at least level 1 basic skill.";
- next;
- mes "[Pitch Judas]";
- mes "For a trade,";
- mes "the distance between you and the";
- mes "other person is very important!";
- mes "You must be very close to trade";
- mes "with another and then right click";
- mes "on the person, once.";
- mes "That's very important, once.";
- next;
- mes "[Pitch Judas]";
- mes "When you choose the ^800fffRequest a deal^000000";
- mes "^800fffwith^000000 command, doing Right-Click.";
- mes "it will show a trade request";
- mes "windows with the person.";
- mes "The actual trade windows will open";
- mes "between you and the person at the";
- mes "same time";
- mes "after the person accepts your";
- mes "offer.";
- mes "If you are more than 2 cells away";
- mes "from the person,";
- mes "you cannot ask a trade. So, please";
- mes "remember that.";
- next;
- mes "[Pitch Judas]";
- mes "For item trade, you should click an";
- mes "item and drag it to the left side";
- mes "of the window.";
- mes "For Zeny trade, you can enter the";
- mes "amount of Zeny you want to trade.";
- mes "After placing items or Zeny into";
- mes "the trade windows";
- mes "you should press the 'OK' button on";
- mes "the bottom of the windows.";
- next;
- mes "[Pitch Judas]";
- mes "Of course, you must confirm the";
- mes "trade of any items by clicking the";
- mes "'OK' button";
- mes "before you can complete the trade.";
- next;
- mes "[Pitch Judas]";
- mes "After you confirm that the items";
- mes "are the ones you want to trade,";
- mes "press the 'Trade' button to finish";
- mes "the trade.";
- mes "If either of the traders do not";
- mes "press the 'OK' button the trade";
- mes "cannot be completed.";
- mes "If either of the traders presses";
- mes "the 'Cancel' button to the right of";
- mes "the window,";
- mes "the trade will be canceled.";
- break;
- case 2: mes "[Pitch Judas]";
- mes "Now, let me explain to you about";
- mes "the party system.";
- mes "Party system allows you to organise";
- mes "a small group with people";
- mes "in order to assist you in hunting";
- mes "aggressive monsters together";
- mes "or to have fun together.";
- next;
- mes "[Pitch Judas]";
- mes "You can organise a party by";
- mes "pressing the friend button";
- mes "on the basic information windows or";
- mes "by typing a command:";
- mes "on your chat windows.";
- mes "Of course, you must be ^4d4dffat least^000000";
- mes "^4d4dffbasic level 7 or above^000000 for using";
- mes "this party system.";
- next;
- mes "[Pitch Judas]";
- mes "I could explain more about the";
- mes "distribution of items or";
- mes "the distribution of experience";
- mes "which party members have gained";
- mes "together,";
- mes "but I wish you could try on your";
- mes "own later.";
- mes "I really want to be in a party with";
- mes "you and help you to level up...";
- next;
- mes "[Pitch Judas]";
- mes "It will be unfair to other";
- mes "novices,";
- mes "you know... Joining a party is";
- mes "possible by accepting an offer from";
- mes "a party master.";
- mes "There is no level requirement for";
- mes "joining a party.";
- next;
- mes "[Pitch Judas]";
- mes "That's all for the party system.";
- mes "..........by the way, could you";
- mes "tell me how to look so cute like";
- mes "you?";
- mes "I wish I could look cute as you";
- mes "do.......";
- mes "Anyhow, I really thank to God.";
- mes "Let's shout";
- mes "'Praise the Creator!'";
- emotion e_kis;
- break;
- case 3: mes "[Pitch Judas]";
- mes "You can ^4d4dffopen a chat room^000000";
- mes "with ^4d4dffbasic skill level 4 or above.^000000";
- mes "You can use the chat button on the";
- mes "basic information windows";
- mes "or by pressing 'Alt+C'";
- next;
- mes "[Pitch Judas]";
- mes "Once you open a chat room,";
- mes "you could check chat room member's";
- mes "information by right clicking on a";
- mes "character name.";
- mes "Also you can register the character";
- mes "as your friend through the same";
- mes "way.";
- mes "If you are the master of the room,";
- mes "you can change the room setup.";
- next;
- mes "[Pitch Judas]";
- mes "While in the chatting room, you";
- mes "cannot hear any chat outside of the";
- mes "chat room.";
- mes "Please remember that.";
- mes "...if you have some time,";
- mes "I can spare some of my time for you";
- mes "to open our own chat room on a boat";
- mes "in Al De Baran";
- mes "..... but I am an NPC.";
- next;
- mes "[Pitch Judas]";
- mes "... ... ....I see.... ...";
- mes "... ... .... Hmm";
- mes "I know I hang out with you because";
- mes "I am an NPC.";
- mes "But it's ok. Don't worry about";
- mes "me.";
- mes "I am happy enough for now.";
- break;
- case 4: mes "[Pitch Judas]";
- mes "All throughout the Rune-Midgard's";
- mes "kingdom territory there is a huge";
- mes "trading center named Kafra,";
- mes "which provides many convenience";
- mes "services to adventurers";
- mes "such as personal storage service.";
- mes "An NPC at the right side of this";
- mes "hall,";
- mes "is one of the Kafra employees.";
- next;
- mes "[Pitch Judas]";
- mes "You are allowed to use your";
- mes "^4d4dffpersonal Kafra storage^000000";
- mes "at ^4d4dffbasic skill 6 or above.^000000";
- mes "If you haven't listened to the";
- mes "Kafra Employee for the services";
- mes "they're providing to adventurers,";
- mes "please do.";
- next;
- mes "[Pitch Judas]";
- mes "When you carry too much items at";
- mes "once,";
- mes "you cannot attack or recover";
- mes "yourself.";
- mes "so I recommend you to have some";
- mes "available space";
- mes "and you use Storage, which is Kafra";
- mes "Service.";
- break;
- case 5: mes "[Pitch Judas]";
- mes "Oh, do you? you're as smart as much";
- mes "as you are cute!";
- mes "I, Pitch am very impressed with";
- mes "you.";
- mes "Our official website has many";
- mes "resources, doesn't it?";
- next;
- mes "[Pitch Judas]";
- mes "Do you wish to learn about a different subject?";
- }
- if ( @menu != 5 ) goto L_loop1;
- break;
- case 3: mes "[Pitch Judas]";
- mes "^4d4dffEmoticons^000000 are commonly used online";
- mes "for ^4d4dffdisplaying your feelings^000000 and";
- mes "better communication between ";
- mes "people.";
- mes "However, in Ragnarok,";
- mes "there is a requirement for using";
- mes "emoticons.";
- mes "You must be at least ^4d4dffbasic skill^000000";
- mes "^4d4dfflevel 2 or above^000000 in order to use ";
- mes "emoticons";
- next;
- mes "[Pitch Judas]";
- mes "You can check emoticons you have";
- mes "registered as shortcut keys and";
- mes "the list of available emoticons by";
- mes "pressing 'Alt+L' and 'Alt+M'.";
- mes "Oh yes,";
- mes "this is also fully explained on our";
- mes "official website as well.";
- next;
- mes "[Pitch Judas]";
- mes "Ah! I must say,";
- mes "the honest expression of one's";
- mes "feelings is essential for a";
- mes "relationship.";
- mes "Yes, I agree with your point of";
- mes "view that too much touchy-feely";
- mes "could be a problem!";
- mes "However, sice the chatting is the";
- mes "only way of expressing oneself to";
- mes "others online,";
- mes "emoticons are much more helpful to";
- mes "display your emotions.";
- next;
- mes "[Pitch Judas]";
- mes "Oh well, so what I was saying is,";
- mes "you can directly use emoticons by";
- mes "registering them on your shortcut";
- mes "keys with the 'Alt+M'";
- mes "or you can type a command for an";
- mes "emoticon on your chat windows such";
- mes "as ^4d4dff/heh^000000";
- mes "You can play rock, scissors and";
- mes "paper";
- mes "by pressing ^4d4dffCTRL^000000 and ^4d4dff-^000000, ^4d4dff=^000000 and ^4d4dff\^000000";
- mes "key.";
- next;
- mes "[Pitch Judas]";
- mes "Of course you can type ^4d4dff/gawi^000000,";
- mes "^4d4dffbawi^00000 and ^4d4dff/bo^000000";
- mes "which mean rock, scissors and paper";
- mes "in Korean on your chat windows.";
- mes "There are many new emoticons which";
- mes "have been newly added,";
- mes "please check all new emoticon";
- mes "commands by typing ^4d4dff/emotion^000000 on your";
- mes "chat windows.";
- mes "............HuHu";
- emotion e_lv;
- break;
- case 4: mes "[Pitch Judas]";
- mes "Don't you need anything else?";
- mes "I hope you are healthy.";
- close;
- }
- goto L_loop;
-}
-
-//Potato Merchant
-new_zone02.gat,28,185,4 shop Potato Merchant 90,516:15
-
-new_zone02.gat,38,182,4 script Helper 92,{
- if (!(NEW_MES_FLAG5)) {
- if (!(NEW_MES_FLAG4)) {
- mes "[Kane]";
- mes "Do you want to battle without";
- mes "knowing the basic knowledge?";
- mes "Go meet the helper right next to";
- mes "me, and listen to him first.";
- close;
- } else {
- mes "[Kane]";
- mes "The 2nd course is for Monster hunting,";
- mes "you can use what you've learned in";
- mes "the Practical Course.";
- next;
- mes "[Kane]";
- mes "I hope you fight well with monsters,";
- mes "based on what you know.";
- next;
- mes "[Kane]";
- mes "You don't need to feel the burden, I";
- mes "just want you to enjoy the experience";
- mes "of being engaged in battle.";
- next;
- mes "[Kane]";
- mes "If you want to get out of the 2nd";
- mes "course, talk to the helper who is in";
- mes "the North section of the field.";
- mes "Now then, do you want to try?";
- next;
- if ( select("Yes","I want to learn more.") == 1 ) {
- mes "[Kane]";
- mes "Just feel free to fight.";
- mes "These will help you if you have";
- mes "an emergency.";
- mes "I will give you a weapon and";
- mes "guard.";
- set NEW_MES_FLAG5,1;
- getitem 602,1;
- getitem 601,9;
- getitem 1243,1;
- getitem 2112,1;
- getitem 611,2;
- getitem 569,300;
- close2;
- savepoint "new_zone02.gat",24,188;
- warp "new_zone03.gat",96,21;
- end;
- } else {
- mes "[Kane]";
- mes "Then, you can talk to our";
- mes "instructor to the left and learn";
- mes "more. When you are ready, please";
- mes "come back again.";
- close;
- }
- }
- }
- mes "[Kane]";
- mes "I told you that you have to be";
- mes "careful.";
- mes "But as you know 'A failure can";
- mes "become a stepping stone to";
- mes "success'";
- next;
- mes "[Kane]";
- mes "Do you want to try again?";
- next;
- if ( select("Yes","No, I want to prepare more.") == 1 ) {
- if (!(NEW_LVUP1)) {
- mes "[Kane]";
- mes "Then, I will give you some additional help.";
- mes "Please be careful.";
- set NEW_LVUP1,1;
- set BaseExp,BaseExp+155;
- getitem 569,50;
- } else {
- mes "[Kane]";
- mes "Then, I will give you some additional help.";
- mes "Please be careful.";
- percentheal 100,100;
- }
- close2;
- warp "new_zone03.gat",96,21;
- end;
- } else {
- mes "[Kane]";
- mes "Then, why don't you talk to the";
- mes "helper who is next to me?";
- mes "When you are ready, please come";
- mes "back again.";
- close;
- }
-}
-
-new_zone02.gat,17,182,6 script Helper#2 84,{
- if (!(NEW_MES_FLAG4)) {
- mes "[Elmeen]";
- mes "Congratulations!";
- mes "You have passed the 1st training";
- mes "course! Wow~ I guess now you";
- mes "understand a little bit more about";
- mes "Ragnarok Online.";
- next;
- mes "[Elmeen]";
- mes "You will learn the fundamentals of";
- mes "actual battle through this class.";
- mes "If you did your best throught the";
- mes "Informative class, you are supposed";
- mes "to have been given some starting";
- mes "equipment.";
- next;
- mes "[Elmeen]";
- mes "Please check your";
- mes "equipment before you engage in";
- mes "battle. Are you sure you've";
- mes "equipped all of your equipment,";
- mes "your weapons and armor?";
- next;
- if ( select("Yes","No") == 1 ) {
- callsub L_battle;
- next;
- mes "[Elmeen]";
- mes "Do you understand these battle commands?";
- mes "Now, I will teach you about monster";
- mes "behaviors and properties, experience";
- mes "gained through battle, and items you";
- mes "can earn from dead monsters.";
- next;
- mes "[Elmeen]";
- mes "Field Combat Training can be";
- mes "actually pretty dangerous for";
- mes "new adventurers. Let me give you";
- mes "a little more strenght through the";
- mes "power of my magic.";
- next;
- mes "[Elmeen]";
- mes "Haaaaaaa~!";
- set NEW_MES_FLAG4,1;
- set BaseExp,BaseExp+155;
- next;
- mes "[Elmeen]";
- mes "Which subject";
- mes "should I cover";
- mes "first for you?";
- L_loop:
- next;
- switch( select("Monster","EXP","Items","Cancel") ) {
- case 1: callsub L_monster;
- break;
- case 2: callsub L_exp;
- break;
- case 3: callsub L_item;
- break;
- case 4: mes "[Elmeen]";
- mes "Feel free to ask me if you have any questions.";
- close;
- }
- goto L_loop;
- } else {
- callsub L_equip;
- close;
- }
- }
- mes "[Elmeen]";
- mes "Oh, do you want to listen again?";
- mes "Which one do you want to know?";
-L_loop1:
- next;
- switch( select("Monster","EXP","Items","Basic info on Monster Hunting","Cancel") ) {
- case 1: callsub L_monster;
- break;
- case 2: callsub L_exp;
- break;
- case 3: callsub L_item;
- break;
- case 4: callsub L_battle;
- break;
- case 5: callsub L_equip;
- close;
- }
- goto L_loop1;
- end;
-L_battle:
- mes "[Elmeen]";
- mes "First, you place the cursor on a";
- mes "monster. When you left click, you";
- mes "will hit the monster once.";
- next;
- mes "[Elmeen]";
- mes "If you are too lazy to keep left";
- mes "clicking, left click on the monster";
- mes "while holding the ^4D4DFF'CTRL'^000000 key. You";
- mes "will then continue attacking the";
- mes "monster until one of you is dead,";
- mes "or you run away.";
- next;
- mes "[Elmeen]";
- mes "You can also just hold down the";
- mes "left mouse button while the cursor";
- mes "is on the monster. Still, there are";
- mes "some people who are even too lazy";
- mes "to use the ^4D4DFF'Ctrl'^000000 key every time";
- mes "they attack a monster.";
- next;
- mes "[Elmeen]";
- mes "If you're one of them, type the";
- mes "comman ^E79E29/nc^000000 in your Chat Window.";
- mes "Then, when you left click";
- mes "a monster, you'll just continuously";
- mes "attack it!";
- next;
- mes "[Elmeen]";
- mes "If a monster happens to have the";
- mes "Undead property, you can use the";
- mes "'Heal' skill to attack if you";
- mes "happen to have it.";
- next;
- mes "[Elmeen]";
- mes "When you use the Heal skill while";
- mes "holding down the ^4D4DFF'Shift'^000000 key, you";
- mes "can target the monster with the";
- mes "Heal skill to damage it.";
- next;
- mes "[Elmeen]";
- mes "Of course for this skill, we do";
- mes "have a very convenient option for";
- mes "lazy people too.";
- mes "Type the command ^E79E29/ns^000000 in your Chat";
- mes "Window.";
- next;
- mes "[Elmeen]";
- mes "This will allow you to attack";
- mes "monsters by using the heal skill";
- mes "without holding the shift key.";
- mes "Handy, huh?";
- return;
-L_monster:
- mes "[Elmeen]";
- mes "There are many aggressive monsters.";
- mes "They will attack you, before you're";
- mes "even close to them.";
- mes "Also there are few monsters";
- mes "that are very cooperative with their";
- mes "tribe. If you attack one of them,";
- mes "others will come after you for";
- mes "revenge.";
- next;
- mes "[Elmeen]";
- mes "Every monster are specified with";
- mes "their types, sizes and properties.";
- mes "For instance, monster types are ";
- mes "include: demi-human, brute, immortal";
- mes "or devil";
- mes "Once you acknowledge which type a";
- mes "monster is, you will be able to ";
- mes "lead an easy battle.";
- next;
- mes "[Elmeen]";
- mes "Also, if you can have some cards";
- mes "for your weapons which increases";
- mes "the damage upon certain monster";
- mes "types,";
- mes "or cards for your armours which";
- mes "reduces the damage taken, it will";
- mes "be much easier for you to battle";
- mes "against monsters.";
- next;
- mes "[Elmeen]";
- mes "Monsters are seperated by their";
- mes "sizes such as small, medium and";
- mes "large.";
- mes "There are a few cards that allows";
- mes "you";
- mes "to do more damage followed by the";
- mes "monster size.";
- next;
- mes "[Elmeen]";
- mes "Also every weapon have their";
- mes "strengths and weaknesses. Size of the";
- mes "weapon affects on the damage of the ";
- mes "weapon dealth with monsters.";
- mes "For instance, dagger class weapons";
- mes "do 100% damage on the small sized";
- mes "mosnters but they only do 50% on";
- mes "the large monsters.";
- next;
- mes "[Elmeen]";
- mes "For the monster property, there are";
- mes "water, wind, earth, fire, shadow";
- mes "ghost and holy.";
- mes "If you attack a monster with the";
- mes "opposite property of it, you can do";
- mes "more damages than the damage you";
- mes "normally do.";
- next;
- mes "[Elmeen]";
- mes "Also, if you attack a monster with";
- mes "the same property of the monster,";
- mes "the damage will be significantly";
- mes "reduced or you will do no damage at";
- mes "all, also there is a possibility ";
- mes "that you will heal the monster.";
- mes "For instance, in case of a ghost";
- mes "property monster, normal weapons";
- mes "cannot do any damage on the";
- mes "monster, but weapons with property";
- mes "can.";
- return;
-L_exp:
- mes "[Elmeen]";
- mes "Basically, a character who deals";
- mes "the most damage on a monster";
- mes "receives the most experience points";
- mes "from the monster.";
- mes "Therefore you receive a certain %";
- mes "of experience points in proportion";
- mes "to the damage you've done on the HP";
- mes "amount of a monster.";
- next;
- mes "[Elmeen]";
- mes "Let's say, there is a character";
- mes "name 'Z'. Z does 65 damage on a ";
- mes "monster that possess 100 HP and";
- mes "gives 1000 experience points when";
- mes "it's dead. Then, the expereicen";
- mes "points Z receives from the monster";
- mes "will be '650'.";
- mes "This is how you gain the experience";
- mes "points.";
- next;
- mes "[Elmeen]";
- mes "However, this rule applies";
- mes "differently following certain";
- mes "situations.";
- mes "If there are two people who did the ";
- mes "same 65 damage on one monster, the";
- mes "experience points that each one of";
- mes "them receives from the monster";
- mes "beco mes different, affected by";
- mes "remaining HP amount of the";
- mes "monster.";
- mes "For instance, somebody ";
- mes "does damage on a monster while";
- mes "you're hitting it and he did the";
- mes "same amount of damage you did.";
- mes "Then, you will receive 2/3 of the";
- mes "whole experience points that";
- mes "monster can give you, the other one";
- mes "will receive 1/3.";
- next;
- mes "[Elmeen]";
- mes "However, attacking a monster that";
- mes "somebody already started to hit is";
- mes "not suggested in Ragnarok Online.";
- mes "That action is regarded as an ";
- mes "ill-mannered behaviour. For party";
- mes "play, the master can set up";
- mes "the experience distribution to the";
- mes "equally share option.";
- mes "With this method, party members can ";
- mes "share their experience followed by ";
- mes "their character level and numbers";
- mes "of the party.";
- next;
- mes "[Elmeen]";
- mes "Also there is an experience";
- mes "benefit for party play which allows";
- mes "you to gain more experience points";
- mes "than playing solo,";
- mes "you can take advantage of the";
- mes "system for faster leveling.";
- return;
-L_item:
- mes "[Elmeen]";
- mes "When you kill monsters, you can";
- mes "obtain items by chance. Besides,";
- mes "certain characters can use the";
- mes "'Steal' skill in order to steal";
- mes "items from monsters.";
- next;
- mes "[Elmeen]";
- mes "Don't you worry about the steal";
- mes "skill causing you to not find any";
- mes "items after you kill them. The";
- mes "steal skill works on the item drop";
- mes "rate independently from the normal";
- mes "rate.";
- mes "In case you kill a mosnter with ";
- mes "other people, a person who did the";
- mes "most damage has a prior rights to";
- mes "obtain items.";
- return;
-L_equip:
- mes "[Elmeen]";
- mes "Please take care of the equipment";
- mes "you've received through the";
- mes "training courses. Once you lose the";
- mes "equipment, you can never get them";
- mes "back.";
- return;
-}
-
-//Training Center Employee
-new_zone03.gat,95,30,4 script Training Center Employee#1 84,{
- mes "[Hoffman]";
- mes "Hey there~";
- mes "I'm here to provide";
- mes "you with a little instruction";
- next;
- mes "[Hoffman]";
- mes "These monsters are all weak";
- mes "and easy to kill. But be careful,";
- mes "a lot of them are aggressive";
- mes "and out for blood!";
- next;
- mes "[Hoffman]";
- mes "But don't worry so much,";
- mes "They're not impossible for";
- mes "Novices. So would you";
- mes "like to try?";
- close;
-}
-
-new_zone03.gat,96,174,4 script Keyman#1 85,{
- mes "[Keyman]";
- mes "Hmmm!";
- mes "You have practised a lot, would you like to go on with further training?";
- next;
- if(select("Yes","No")==1){
- mes "[Keyman]";
- mes "Don't forget about everything you've learnt here. Have a nice trip.";
- close2;
- warp "new_zone04.gat",99,10;
- end;
- }
- mes "[Keyman]";
- mes "So you want to stay here longer? Continue training, and train hard!";
- close;
-}
-
-//Novice Instructor
-new_zone04.gat,91,22,4 script Novice Instructor 57,{
- mes "[Bruce]";
- mes "You have come from far away.";
- mes "Thank you for coming here";
- if(sex)
- mes "Mr '"+strcharinfo(0)+"'";
- else
- mes "Ms '"+strcharinfo(0)+"'";
- mes "It's nice to meet you.";
- mes "My name is Bruce, and I come";
- mes "from Rune-Midgard.";
- next;
- mes "[Bruce]";
- mes "My work is to help Novices";
- mes "to choose their jobs.";
- mes "So, I will briefly explain each";
- mes "job.";
- next;
- mes "[Bruce]";
- mes "I will explain the following jobs:";
- mes "^0000FFSwordsman, Mage, Archer, Merchant, Thief and Acolyte.^000000";
- next;
- mes "[Bruce]";
- mes "Which job do you want to hear about?";
-L_loop:
- next;
- switch( select("Swordman","Mage","Archer","Merchant","Thief","Acolyte","End Conversation") ) {
- case 1: mes "[Bruce]";
- mes "Literally, Swordsman means one who";
- mes "specialises in wielding swords.";
- mes "Swordsman can also choose to use";
- mes "spears, but I must say, it is a rare";
- mes "occurance.";
- next;
- mes "[Bruce]";
- mes "Swordsman posses strong physical";
- mes "strength.";
- mes "This is so they can equip heavy armours";
- mes "and weapons.";
- mes "Most weapon classes, except for";
- mes "bows and rods, are equipable by the";
- mes "Swordsman class.";
- next;
- mes "[Bruce]";
- mes "The only weakness of the Swordman";
- mes "class is that they cannot use";
- mes "magic spells.";
- mes "However, it is compensated for";
- mes "by using elemental weapons.";
- next;
- mes "[Bruce]";
- mes "The benefits of being a Swordsman";
- mes "is the enormous amount of HP.";
- mes "You can bear the damage from your";
- mes "enemy with ease.";
- next;
- mes "[Bruce]";
- mes "Furthermore, once you learn your";
- mes "strong attack skills, there is no";
- mes "one that can beat the Swordsman";
- mes "class in a melee fight.";
- next;
- mes "[Bruce]";
- mes "In Ragnarok Online,";
- mes "Swordsman takes the position of";
- mes "tanker, to protect weaker classes";
- mes "from being attacked or hurt.";
- mes "Swordsman is the ideal character for";
- mes "the party leader position";
- next;
- mes "[Bruce]";
- mes "Swordsman can advance into the";
- mes "^FF0000Knight, or Crusader^000000 classes";
- mes "for their 2nd class profession.";
- break;
- case 2: mes "[Bruce]";
- mes "The mage class specialises in";
- mes "manipulating: fire, water, earth";
- mes "and lightening, to damage their";
- mes "enemies.";
- next;
- mes "[Bruce]";
- mes "However, due to their physical";
- mes "weakness, they are only allowed";
- mes "to equip rods and knives as";
- mes "weapons, and light armours for";
- mes "defense";
- next;
- mes "[Bruce]";
- mes "Despite their physical weakness,";
- mes "they are able to do massive damage";
- mes "with their powerful spells.";
- mes "This fact alone attracts many";
- mes "people to this class";
- next;
- mes "[Bruce]";
- mes "In Ragnarok Online,";
- mes "the Mage is considered as the";
- mes "damage dealer of the party";
- next;
- mes "[Bruce]";
- mes "Mage can advance into a";
- mes "^FF0000Wizard^000000 or ^FF0000Sage^000000";
- mes "as their 2nd class profession.";
- break;
- case 3: mes "[Bruce]";
- mes "Archer class specialises in";
- mes "using bows. In a party, archers are";
- mes "in charge of long range attacks.";
- mes "This allows them to attack,";
- mes "and kill monsters from a safe distance";
- next;
- mes "[Bruce]";
- mes "Archers are physically weak,";
- mes "however, they possess a high";
- mes "level of accuracy with powerful";
- mes "long range bows.";
- next;
- mes "[Bruce]";
- mes "Every Archer may advance into";
- mes "the ^FF0000Hunter^000000 class.";
- mes "Alternatively, male archers may";
- mes "advance into the ^FF0000Bard^000000,";
- mes "and female Archers may become a";
- mes "^FF0000Dancer^000000, as their 2nd class profession";
- break;
- case 4: mes "[Bruce]";
- mes "The Merchant class specialises in";
- mes "commerce. Due to their strong and";
- mes "influential guild, Merchants can";
- mes "buy and sell to NPCs for a better";
- mes "price than other classes.";
- next;
- mes "[Bruce]";
- mes "In Ragnarok Online, the Merchant";
- mes "class possess various economically";
- mes "beneficial skills.";
- mes "They may buy items at a discount";
- mes "from NPCs, and sell items to NPCs";
- mes "at a higher price than normal.";
- next;
- mes "[Bruce]";
- mes "In addition Merchants may rent a";
- mes "cart that greatly expands their";
- mes "carrying capacity, and allows";
- mes "them to open shops with their";
- mes "own items and prices.";
- next;
- mes "[Bruce]";
- mes "Merchant can advance into a";
- mes "^FF0000Blacksmith^000000 or ^FF0000Alchemist^000000";
- mes "as their 2nd class profession.";
- break;
- case 5: mes "[Bruce]";
- mes "The Thief class are experts at using";
- mes "dagger class weapons as their main";
- mes "weapon. They attack fast, and they";
- mes "can dodge attacks from enemies with ease.";
- next;
- mes "[Bruce]";
- mes "The Thief is also an expert at";
- mes "hiding and stealing from their";
- mes "enemies. Furthermore, their use";
- mes "of poison to weaken their foes";
- mes "is a feared trait of this class.";
- next;
- mes "[Bruce]";
- mes "When you are in a dangerous";
- mes "situation, or you want to hide";
- mes "your body, you can use a skill";
- mes "to dig into the ground.";
- next;
- mes "[Bruce]";
- mes "Thief can advance into either";
- mes "^FF0000Assassin^000000, or ^FF0000Rogue^000000";
- mes "as the 2nd class profession.";
- break;
- case 6: mes "[Bruce]";
- mes "The Acolyte is God's messenger to";
- mes "Rune-Midgard. Acolytes have";
- mes "skills that makes all classes";
- mes "more potent in battle, as well as";
- mes "the life saving heal ability.";
- next;
- mes "[Bruce]";
- mes "The Acolyte's support abilities";
- mes "make them a welcome addition to";
- mes "any party. The acolyte is what";
- mes "makes parties survive in";
- mes "difficult situations, allowing";
- mes "other classes to focus";
- mes "themselves on defeating the enemy.";
- next;
- mes "[Bruce]";
- mes "'Acolyte' is one of the jobs, who";
- mes "are really needed when users want";
- mes "to play in a party.";
- next;
- mes "[Bruce]";
- mes "Acolyte may become a ^FF0000Priest^000000, or";
- mes "^FF0000Monk^000000 as their 2nd class profession.";
- break;
- case 7: mes "[Bruce]";
- mes "For more information, please visit";
- mes "our official website at";
- mes "'http://ragnarok.co.kr'";
- mes "Hanson is waitinging for you now,";
- mes "good luck out there.";
- close;
- }
- set NEW_MES_FLAG6,1;
- goto L_loop;
-}
-
-new_zone04.gat,100,29,4 script Final Instructor 46,{
- if (!(NEW_MES_FLAG6)) {
- mes "[Hanson]";
- mes "Nice to meet you.";
- mes "My name is 'Hanson'";
- mes "I am in charge of the third course,";
- mes "which is the 'Personality Test'.";
- mes "Your name is ^A62A2A'"+strcharinfo(0)+"'^000000.";
- next;
- mes "[Hanson]";
- mes "Before you take this test,";
- mes "go to meet 'Bruce' right next to";
- mes "me and listen about Jobs.";
- mes "then, come back to me.";
- close;
- }
- if (NEW_GETITEM) {
- mes "[Hanson]";
- mes "I understand.";
- mes "I will now move you directly into the world of Ragnarok Online.";
- next;
- mes "[Hanson]";
- mes "For more information ";
- mes "please visit the official";
- mes "Ragnarok Online website.";
- next;
- mes "[Hanson]";
- mes "Finally, "+strcharinfo(0)+"";
- mes "I hope that you can become a good player.";
- mes "Good luck, and have a safe journey.";
- next;
- goto L_cancel;
- }
- mes "[Hanson]";
- mes "You have made an effort to come";
- mes "here. You have just finished";
- mes "learning about job classes.";
- mes "This will be your 3rd test, the";
- mes "personality test, but it's not";
- mes "a mandatory course.";
- next;
- mes "[Hanson]";
- mes "That is, if you do not wish to take";
- mes "this course, you can decide to pass";
- mes "without taking it. However, if you";
- mes "take this course, there will be";
- mes "some benefits.";
- next;
- mes "[Hanson]";
- mes "Firstly, you will receive many";
- mes "health items during the course.";
- mes "They will be very helpful when";
- mes "you join the Ragnarok Online";
- mes "community.";
- next;
- mes "[Hanson]";
- mes "Secondly, after you finish the";
- mes "course, we suggest a job class";
- mes "best suited to your personality,";
- mes "and teleport you to a town where";
- mes "you can change into the job we";
- mes "suggested. And there are many";
- mes "other supplies for you besides";
- mes "these two benefits.";
- next;
- mes "[Hanson]";
- mes "Now! What would you like to do?";
- mes "Do you wish to start Ragnarok";
- mes "Online immediately, or to take";
- mes "this personality test?";
- next;
- if ( select("I'll take the test.","Let me start Ragnarok Online Please.") == 2 ) {
- mes "[Hanson]";
- mes "I understand.";
- mes "I will now move you directly into the world of Ragnarok Online.";
- next;
- mes "[Hanson]";
- mes "For more information ";
- mes "please visit the official";
- mes "Ragnarok Online website.";
- next;
- mes "[Hanson]";
- mes "Finally, "+strcharinfo(0)+"";
- mes "I hope that you can become a good player.";
- mes "Good luck, and have a safe journey.";
- next;
-L_cancel:
- callsub L_cleararg;
- switch ( rand(6) ) {
- case 0: savepoint "izlude.gat",94,103;
- warp "prt_fild08.gat",357,212;
- break;
- case 1: savepoint "payon.gat",256,242;
- warp "pay_fild01.gat",334,354;
- break;
- case 2: savepoint "morocc.gat",149,100;
- warp "moc_fild07.gat",198,39;
- break;
- case 3: savepoint "geffen.gat",120,38;
- warp "gef_fild07.gat",327,188;
- break;
- case 4: savepoint "prontera.gat",116,72;
- warp "prt_fild08.gat",170,371;
- break;
- case 5: savepoint "alberta.gat",31,231;
- warp "pay_fild03.gat",388,70;
- }
- end;
- }
- mes "[Hanson]";
- mes "Excellent choice! You're";
- mes "You're supposed to take every";
- mes "training course if you really";
- mes "want to be a well-prepared";
- mes "player! Honestly, if you";
- mes "didn't take this course,";
- mes "I would be disappointed in you.";
- next;
- mes "[Hanson]";
- mes "Alright, let me start the 1st";
- mes "personality test.";
- mes "";
- mes "Please releax and take it easy,";
- mes "choose the most familiar answer";
- mes "among the next examples.";
- next;
- mes "[Hanson]";
- mes "Remember, this test is only to";
- mes "check your personality, there";
- mes "is no set standard for right";
- mes "or wrong. Now! Let's start";
- mes "the test!";
- next;
- mes "[Hanson]";
- mes "Please choose the most familiar";
- mes "word to you, from these examples.";
- next;
- switch ( select("Study","Exercise","Public service","Violence") ) {
- case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
- case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 3: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 4: set NOV_3_THIEF,NOV_3_THIEF+1;
- }
- switch ( select("Change","Conserve") ) {
- case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
- case 2: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
- }
- switch ( select("Consumer","Seller","Producer") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- set NOV_3_THIEF,NOV_3_THIEF+1;
- set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- switch ( select("Celebrity","Prudence") ) {
- case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
- }
- switch ( select("Theory","Experience") ) {
- case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
- case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- }
- switch ( select("The past","The reality","The future") ) {
- case 1: set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
- case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
- set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- mes "[Hanson]";
- mes "Please answer with 'yes' or 'no' to";
- mes "the next questions.";
- next;
- mes "[Hanson]";
- mes "To die with honor is better than to live with disgrace.";
- next;
- switch ( select("Yes.","No") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
- case 2: set NOV_3_THIEF,NOV_3_THIEF+1;
- set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
- }
- mes "[Hanson]";
- mes "You are often upset to see someone";
- mes "who is better than you";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 2:set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
- }
- mes "[Hanson]";
- mes "You don't mind exploring dangerous";
- mes "places.";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
- case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- mes "[Hanson]";
- mes "You are a leader-type person.";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
- case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
- }
- mes "[Hanson]";
- mes "While exploring a dungeon, you";
- mes "encountered a no-way out.";
- mes "As you examined a wall beside you,";
- mes "there was a button-looking stone";
- mes "with a 'do not push' sign.";
- next;
- mes "[Hanson]";
- mes "You see the 'do not push' sign";
- mes "and have an urge to push the";
- mes "button. Do you push it?";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- }
- mes "[Hanson]";
- mes "You often see things that don't";
- mes "exist";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- mes "[Hanson]";
- mes "You feel you can fly";
- mes "when falling from a cliff.";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- mes "[Hanson]";
- mes "Money talks. I can buy even human being if I want.";
- next;
- switch ( select("Yes","No") ) {
- case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
- }
- mes "[Hanson]";
- mes "Now, let me give you some different";
- mes "questions.";
- mes "Please relax and take it easy,";
- mes "choose the most familiar answer";
- mes "from the next examples";
- next;
- mes "[Hanson]";
- mes "As you check your tight";
- mes "schedule....";
- next;
- switch ( select("You feel like a robot.","You are proud and satisfied.","Schedule... what schedule?") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 3: set NOV_3_ARCHER,NOV_3_ARCHER+1;
- set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
- }
- mes "[Hanson]";
- mes "During window shopping, you found a";
- mes "really interesting item in a store";
- mes "and you're debating whether to buy";
- mes "it or not.";
- mes "Before you purchase an item,";
- mes "first thing you do is...";
- next;
- switch ( select("Think about if you need it.","Check the price.","Buy it without thinking twice...!") ) {
- case 1: set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
- case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 3: set NOV_3_THIEF,NOV_3_THIEF+1;
- }
- mes "[Hanson]";
- mes "You (____Fill in blank___) to compete";
- mes "with other people.......";
- next;
- switch ( select("Don't mind...","Don't like...","Don't care...") ) {
- case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 2: set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 3: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
- set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- }
- mes "[Hanson]";
- mes "You're responsible for a task that";
- mes "requires you to cooperate with many";
- mes "people.";
- mes "If you handle it by yourself, it";
- mes "takes a long time with a lot of";
- mes "effort.";
- mes "But if you cooperate with others,";
- mes "it will be simple and an enjoyable";
- mes "task. You would...";
- next;
- switch ( select("Handle it by myself even if it's hard.","Ask friends to help.") ) {
- case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
- case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
- }
- mes "[Hanson]";
- mes "You happened to find a girl who";
- mes "fainted on the street.";
- mes "What would you do?";
- next;
- switch ( select("Carry her to a hospital.","Considder my priority before taking an action.","Just ignore it.") ) {
- case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
- set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
- case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- set NOV_3_THIEF,NOV_3_THIEF+1;
- set NOV_3_MERCHAN,NOV_3_MERCHAN+1;
- }
- mes "[Hanson]";
- mes "You happened to pick up";
- mes "some 'clothing'";
- mes "What would you do?";
- next;
- switch ( select("Check the brand.","Wonder who lost it.","Find the owner.","Leave it where it was.") ) {
- case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 2: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
- case 3: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 4: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
- }
- mes "[Hanson]";
- mes "You happened to slip your tongue in";
- mes "the middle of a conversation.";
- mes "What would be your reaction?";
- next;
- switch ( select("Pretend it's a joke.","Change the subject.","Analyse it.","Apologise honestly.") ) {
- case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
- case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
- case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
- case 4: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
- }
- mes "[Hanson]";
- switch (Sex) {
- case 0: mes "You're on a trip with your beloved";
- mes "one. She asks you to buy a";
- mes "souvenir that's not particularly";
- mes "needed.";
- mes "What would you do?";
- break;
- case 1: mes "You're on a trip with your beloved";
- mes "one. He asks you to buy a";
- mes "souvenir that's not particularly";
- mes "needed.";
- mes "What would you do?";
- }
- next;
- switch ( select("Buy the item for her/him.","Say 'no'.","Promise to buy it next time.") ) {
- case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
- case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
- case 3: set NOV_3_THIEF,NOV_3_THIEF+1;
- }
- mes "[Hanson]";
- mes "Ok!! That's all for the test.";
- mes "You have finished all training";
- mes "grounds courses. Congratulations!";
- mes "I am so proud of you.";
- next;
- mes "[Hanson]";
- mes "I prepared some items for you since";
- mes "you passed the personality test.";
- mes "Please take these.";
- next;
- set NEW_GETITEM,1;
- getitem 501,4;
- getitem 503,2;
- getitem 506,2;
- next;
- mes "[Hanson]";
- mes "Mr/Ms. ^A62A2A'"+strcharinfo(0)+"'^000000!";
- mes "I will recommend to you a";
- mes "suitable job, after I finish";
- mes "analysing the results of your";
- mes "personality test.";
- mes "Please wait.";
- next;
- mes "[Hanson]";
- mes ". . . . . . . . . . . . .";
- mes "It's almost over . .";
- mes ". . . . . . . . . . . . .";
- next;
- mes "[Hanson]";
- mes ". . . . . . . .!";
- next;
- mes "[Hanson]";
- mes "Here's the final result of your";
- mes "test, Mr/Ms. ^A62A2A'"+strcharinfo(0)+"'^000000!!";
- next;
- set @JOB_NUMBER,1;
- set @JOB_WITH_C,0;
- set @JOB_NUMBER_CHK,0;
- set @JOB_WITH,NOV_3_SWORDMAN;
-L_loop1:
- switch ( @JOB_NUMBER ) {
- case 1: set @JOB_WITH_C,NOV_3_ARCHER;break;
- case 2: set @JOB_WITH_C,NOV_3_THIEF;break;
- case 3: set @JOB_WITH_C,NOV_3_MAGICIAN;break;
- case 4: set @JOB_WITH_C,NOV_3_ACOLYTE;break;
- default: set @JOB_WITH_C,NOV_3_MERCHANT;
- }
- if (@JOB_WITH >= @JOB_WITH_C) goto L_loop2;
- set @JOB_NUMBER_CHK,@JOB_NUMBER;
- switch ( @JOB_NUMBER ) {
- case 1: set @JOB_WITH,NOV_3_ARCHER;break;
- case 2: set @JOB_WITH,NOV_3_THIEF;break;
- case 3: set @JOB_WITH,NOV_3_MAGICIAN;break;
- case 4: set @JOB_WITH,NOV_3_ACOLYTE;break;
- default: set @JOB_WITH,NOV_3_MERCHANT;
- }
-L_loop2:
- set @JOB_NUMBER,@JOB_NUMBER+1;
- while ( @JOB_NUMBER < 6 ) goto L_loop1;
- mes "[Hanson]";
- switch ( @JOB_NUMBER_CHK ) {
- case 0: set @JOB_NAME$,"Swordsman";
- mes "Although you are direct and";
- mes "'to the point', you are also";
- mes "thoughtful and simple.";
- mes "You clearly wish that you can";
- mes "become an important person in";
- mes "this world. In addition to";
- mes "this, you always try to help";
- mes "the weak.";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Swordsman^000000.";
- break;
- case 1: set @JOB_NAME$,"Archer";
- mes "You always tried to understand";
- mes "the feelings of a fallen person";
- mes "despite not knowing them.";
- mes "YOu also wanted the other";
- mes "person to understand your feelings";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Archer^000000.";
- break;
- case 2: set @JOB_NAME$,"Thief";
- mes "You are curious, and want to";
- mes "explore all around the world.";
- mes "You also want satisfaction.";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Thief^000000.";
- break;
- case 3: set @JOB_NAME$,"Mage";
- mes "You didn't want to be seen as";
- mes "stupid, and you really enjoyed the";
- mes "tests. You also want to be independant.";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Mage^000000.";
- break;
- case 4: set @JOB_NAME$,"Acolyte";
- mes "You are a person whom is really";
- mes "understanding and kind,";
- mes "and would suffer for the sake";
- mes "of another person.";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Acolyte^000000s.";
- break;
- case 5: set @JOB_NAME$,"Merchant";
- mes "You are keen to analyse the market,";
- mes "you are very neat and want to be";
- mes "strong. You are also a determined";
- mes "and are responsible for all your";
- mes "actions.";
- next;
- mes "[Hanson]";
- mes "The most suitable profession for you is,";
- mes "^696969Merchant^000000.";
- }
- next;
-
- mes "[Hanson]";
- mes "So, would you like to accept our";
- mes "recommendation, or would you like";
- mes "to choose a job on your own?";
- next;
- if ( select(@JOB_NAME$+"!","No, my own choice!") == 1 ) {
- mes "[Hanson]";
- mes "Great! I guarantee that it is";
- mes "a good decision!";
- mes "After you receive all the";
- mes "supplies, I will send you to";
- mes "the associated town.";
- next;
- mes "^882420Item Offer List^000099";
- switch( @JOB_NUMBER_CHK ) {
- case 0: mes "1 Falchion";
- getitem 1104,1;
- break;
- case 1: mes "1 Composite Bow";
- getitem 1704,1;
- break;
- case 2: mes "1 Main Gauche";
- getitem 1207,1;
- break;
- case 3: mes "1 Rod";
- mes "1 Cutter";
- getitem 1601,1;
- getitem 1204,1;
- break;
- case 4: mes "1 Mace";
- getitem 1504,1;
- break;
- case 5: mes "1 Battle Axe";
- getitem 1351,1;
- }
- if( @JOB_NUMBER_CHK == 5 ){
- mes "^0000304 Free Tickets for Kafra Storage";
- mes "4 Free Tickets for Kafra Transportation";
- mes "4 Free Tickets for the Cart Service";
- getitem 7059,4;
- getitem 7060,4;
- getitem 7061,4;
- }else{
- mes "^0000305 Free Tickets for Kafra Storage";
- mes "5 Free Tickets for Kafra Transportation";
- getitem 7059,5;
- getitem 7060,5;
- }
- mes "^0000997 Phracons";
- mes "10 Novices Red Potions^000000";
- mes "^000030100 Zeny^000000";
- getitem 1010,7;
- getitem 569,10;
- set Zeny,Zeny+100;
- next;
- mes "[Hanson]";
- mes "All the supplies have been given to";
- mes "you. Please, check it again.";
- mes "I will give a brief explanation";
- mes "about these items.";
- next;
- mes "[Hanson]";
- switch( @JOB_NUMBER_CHK ) {
- case 0: mes "After you change your job,";
- mes "you can use the 'Falchion'"; break;
- case 1: mes "After you change your job,";
- mes "you can use the 'Composite Bow'"; break;
- case 2: mes "After you change your job,";
- mes "you can use the 'Main Gauche'"; break;
- case 3: mes "After you change your job,";
- mes "you can use the 'Rod'"; break;
- case 4: mes "After you change your job,";
- mes "you can use the 'Mace'"; break;
- case 5: mes "After you change your job,";
- mes "you can use the 'Battle Axe'";break;
- }
- mes "instead of the Novice Knife";
- mes "which I offered you before.";
- next;
- mes "[Hanson]";
- mes "'Phracon' will be spent when";
- mes "you refine Lv 1 weapons.";
- mes "Some of the famous refiners";
- mes "work only intowns.";
- mes "After you change your job,";
- mes "Visit one of them with Phracon.";
- callsub L_place;
- next;
- goto L_warp;
- }
- mes "[Hanson]";
- mes "Yes, yes...";
- mes "So this is your choice?";
- mes "Did you not care about";
- mes "our recommendation?";
- mes "Please choose the profession";
- mes "that you want.";
- next;
- switch( @JOB_NUMBER_CHK ) {
- case 0: switch( select("Mage","Merchant","Thief","Archer","Acolyte") ) {
- case 1: set @JOB_NUMBER_CHK,3;
- set @JOB_NAME$,"Mage";
- break;
- case 2: set @JOB_NUMBER_CHK,5;
- set @JOB_NAME$,"Merchant";
- break;
- case 3: set @JOB_NUMBER_CHK,2;
- set @JOB_NAME$,"Thief";
- break;
- case 4: set @JOB_NUMBER_CHK,1;
- set @JOB_NAME$,"Archer";
- break;
- case 5: set @JOB_NUMBER_CHK,4;
- set @JOB_NAME$,"Acolyte";
- }
- break;
- case 1: switch( select("Swordsman","Mage","Merchant","Thief","Acolyte") ) {
- case 1: set @JOB_NUMBER_CHK,0;
- set @JOB_NAME$,"Swordsman";
- break;
- case 2: set @JOB_NUMBER_CHK,3;
- set @JOB_NAME$,"Mage";
- break;
- case 3: set @JOB_NUMBER_CHK,5;
- set @JOB_NAME$,"Merchant";
- break;
- case 4: set @JOB_NUMBER_CHK,2;
- set @JOB_NAME$,"Thief";
- break;
- case 5: set @JOB_NUMBER_CHK,4;
- set @JOB_NAME$,"Acolyte";
- }
- break;
- case 2: switch( select("Swordsman","Mage","Merchant","Archer","Acolyte") ) {
- case 1: set @JOB_NUMBER_CHK,0;
- set @JOB_NAME$,"Swordsman";
- break;
- case 2: set @JOB_NUMBER_CHK,3;
- set @JOB_NAME$,"Mage";
- break;
- case 3: set @JOB_NUMBER_CHK,5;
- set @JOB_NAME$,"Merchant";
- break;
- case 4: set @JOB_NUMBER_CHK,1;
- set @JOB_NAME$,"Archer";
- break;
- case 5: set @JOB_NUMBER_CHK,4;
- set @JOB_NAME$,"Acolyte";
- }
- break;
- case 3: switch( select("Swordsman","Merchant","Thief","Archer","Acolyte") ) {
- case 1: set @JOB_NUMBER_CHK,0;
- set @JOB_NAME$,"Swordsman";
- break;
- case 2: set @JOB_NUMBER_CHK,5;
- set @JOB_NAME$,"Merchant";
- break;
- case 3: set @JOB_NUMBER_CHK,2;
- set @JOB_NAME$,"Thief";
- break;
- case 4: set @JOB_NUMBER_CHK,1;
- set @JOB_NAME$,"Archer";
- break;
- case 5: set @JOB_NUMBER_CHK,4;
- set @JOB_NAME$,"Acolyte";
- }
- break;
- case 4: switch( select("Swordsman","Mage","Merchant","Thief","Archer") ) {
- case 1: set @JOB_NUMBER_CHK,0;
- set @JOB_NAME$,"Swordsman";
- break;
- case 2: set @JOB_NUMBER_CHK,3;
- set @JOB_NAME$,"Mage";
- break;
- case 3: set @JOB_NUMBER_CHK,5;
- set @JOB_NAME$,"Merchant";
- break;
- case 4: set @JOB_NUMBER_CHK,2;
- set @JOB_NAME$,"Thief";
- break;
- case 5: set @JOB_NUMBER_CHK,1;
- set @JOB_NAME$,"Archer";
- }
- break;
- case 5: switch( select("Swordsman","Mage","Thief","Archer","Acolyte") ) {
- case 1: set @JOB_NUMBER_CHK,0;
- set @JOB_NAME$,"Swordsman";
- break;
- case 2: set @JOB_NUMBER_CHK,3;
- set @JOB_NAME$,"Mage";
- break;
- case 3: set @JOB_NUMBER_CHK,2;
- set @JOB_NAME$,"Thief";
- break;
- case 4: set @JOB_NUMBER_CHK,1;
- set @JOB_NAME$,"Archer";
- break;
- case 5: set @JOB_NUMBER_CHK,4;
- set @JOB_NAME$,"Acolyte";
- }
- }
- mes "[Hanson]";
- mes @JOB_NAME$+" is your choise.";
- callsub L_place;
- next;
- mes "[Hanson]";
- mes "After you receive all the";
- mes "supplies, I will send you to";
- mes "the associated town.";
- next;
- mes "^882420Item Offer List";
- mes "^0000301 Adventurer's Suit";
- mes "^00009910 Novices Red Potions";
- mes "^0000305 Free Tickets for Kafra Storage";
- mes "^0000995 Free Tickets for Kafra Transportation";
- mes "^000030100 Zeny^000000";
- getitem 7059,5;
- getitem 7060,5;
- getitem 2305,1;
- getitem 569,10;
- set Zeny,Zeny+100;
- next;
- mes "[Hanson]";
- mes "All the supplies have been given to";
- mes "you. Please, check it again.";
- mes "I will give a brief explanation";
- mes "about these items.";
- next;
- mes "[Hanson]";
- mes "'Zeny' is the current currency";
- mes "within Ragnarok Online.";
- mes "Later, you can use the";
- mes "'Adventurer's Suit'";
- mes "instead of the Novice Plate";
- mes "which I offered you before.";
- next;
-L_warp:
- mes "[Hanson]";
- mes "Good luck, ^A62A2A' "+strcharinfo(0)+" '^000000,";
- mes "and farewell.";
- close2;
- callsub L_cleararg;
- switch( @JOB_NUMBER_CHK ) {
- case 0: savepoint "izlude.gat",94,103;
- warp "izlude_in.gat",74,167;
- break;
- case 1: savepoint "payon.gat",256,242;
- warp "payon_in02.gat",64,65;
- break;
- case 2: savepoint "morocc.gat",149,100;
- warp "moc_ruins.gat",155,44;
- break;
- case 3: savepoint "geffen.gat",120,38;
- warp "geffen_in.gat",163,98;
- break;
- case 4: savepoint "prontera.gat",116,72;
- warp "prt_church.gat",172,19;
- break;
- case 5: savepoint "alberta.gat",31,231;
- warp "alberta_in.gat",62,44;
- }
- end;
-L_place:
- switch( @JOB_NUMBER_CHK ) {
- case 0: mes "The town you will be sent to";
- mes "is 'Izlude'. The Swordsman";
- mes "association is located in the";
- mes "west side of the city.";
- mes "Please remember this.";
- break;
- case 1: mes "The town you will be sent to";
- mes "is named 'Payon'.";
- mes "The Archer association can be";
- mes "found in the small village";
- mes "to the north-east.";
- mes "Please remember this.";
- break;
- case 2: mes "The town you will be sent to";
- mes "is called 'Morroc'.";
- mes "The thief guild is in the";
- mes "underground 1st floor of the";
- mes "pyramid, which is North-west";
- mes "of 'Morroc'.";
- mes "Please remember this.";
- break;
- case 3: mes "The town you will be sent to";
- mes "is called 'Geffen'.";
- mes "The Mage association is located";
- mes "to the north-west of the city.";
- mes "Please remember this.";
- break;
- case 4: mes "The town you will be sent to";
- mes "is called 'Prontera'.";
- mes "The good father can be found";
- mes "in the church located in the";
- mes "north-east corner of 'Prontera'.";
- mes "Please remember this.";
- break;
- case 5: mes "The town you will be sent to";
- mes "is called 'Alberta'.";
- mes "The Merchant association is";
- mes "located in the south-western";
- mes "section of the city.";
- mes "Please remember this.";
- }
- mes "You'll now be teleported.";
- return;
-L_cleararg:
- set NEW_MES_FLAG0,0;
- set NEW_MES_FLAG1,0;
- set NEW_MES_FLAG2,0;
- set NEW_MES_FLAG3,0;
- set NEW_MES_FLAG4,0;
- set NEW_MES_FLAG5,0;
- set NEW_MES_FLAG6,0;
- set NEW_LVUP0,0;
- set NEW_LVUP1,0;
- set NEW_JOBLVUP,0;
- set NEW_GETITEM,0;
- set NOV_3_SWORDMAN,0;
- set NOV_3_ARCHER,0;
- set NOV_3_THIEF,0;
- set NOV_3_MAGICIAN,0;
- set NOV_3_ACOLYTE,0;
- set NOV_3_MERCHANT,0;
- return;
-}
-
-// Training Ground Mobs
-new_zone03.gat,0,0,0,0 monster Fabre 1184,5,0,0,0
-new_zone03.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-new_zone03.gat,0,0,0,0 monster ChonChon 1011,10,0,0,0
-new_zone03.gat,0,0,0,0 monster Lunatic 1063,10,0,0,0
-new_zone03.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-// Unsure about the following mobs
-new_zone03.gat,0,0,0,0 monster Condor 1009,2,0,0,0
-new_zone03.gat,0,0,0,0 monster Willow 1010,2,0,0,0
-new_zone03.gat,0,0,0,0 monster Roda Frog 1012,2,0,0,0
-new_zone03.gat,0,0,0,0 monster Shell Picky 1050,2,0,0,0
-new_zone03.gat,0,0,0,0 monster Spore 1014,1,0,0,0
-new_zone03.gat,0,0,0,0 monster Thief Bug Larva 1051,1,0,0,0
-new_zone03.gat,0,0,0,0 monster Rocker 1052,1,0,0,0
-new_zone03.gat,0,0,0,0 monster Thief Bug Female 1053,1,0,0,0
+//===== eAthena Script =======================================
+//= Ep 10+ Novice Training Grounds
+//===== By: ==================================================
+//= Dr.Evil & MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena SVN 3422+(Requires jA Script System)
+//===== Description: =========================================
+//= The New Novice Training Grounds Script, Script by yukito
+//= merged with english dialogues from Prometheus.
+//===== Additional Comments: =================================
+//= 1.0 Added the New Novice Training Grounds, a big thanks [MasterOfMuppets]
+//= to Dr.Evil who did 90% of the work =)
+//= 1.0b Temp measure to stop exploits. [Vicious]
+//= 1.2 Removed Duplicates [Silent]
+//= 1.3 Removed Duplicates [Toms]
+//= 1.4 Added Kafra Free Cart Tickets, as in official one [Lupus]
+//= 1.5 Fixed warps, removed map duplicates, typos [Lupus]
+//= 1.6 Changed clone maps new_1-? -> new_zone0? [Lupus]
+//= 1.7 Now Kafra Tickets are given at correct NPC/Actions [Lupus]
+//============================================================
+
+//====================================================================
+//Ragnarok Online Novice Script by yukito
+//====================================================================
+//Bulletin Board
+new_zone01.gat,66,114,4 script Bulletin Board 111,{
+ mes "^FF0000=================================^000000";
+ mes "^FF0000 ==^000000 ^E40CAA[Welcome] ^CC0000to^FF9000Training ^0000FFGrounds^FF0000==^000000";
+ mes "^FF0000=================================^000000";
+ close;
+}
+
+new_zone01.gat,53,114,4 script Shion 727,{
+ if(Class != Job_Novice || Upper) goto L_Fail;
+ switch (NEW_MES_FLAG0) {
+ case 0: mes "[Shion]";
+ mes "Hello there~";
+ mes "Welcome to the";
+ mes "Training Grounds!";
+ next;
+ mes "[Shion]";
+ mes "Let's see.";
+ mes "Your name is...";
+ mes "" + strcharinfo(0) + ".";
+ next;
+ mes "[Shion]";
+ mes "My name is Shion.";
+ mes "Yes, this is the first time we've";
+ mes "met, of course. Hahahah~";
+ next;
+ mes "[Shion]";
+ mes "Now that we've met, is there";
+ mes "anything I can help you with?";
+ mes "I'm here for your questions~";
+ next;
+ switch ( select("Where should I go?","About Basic Interfaces.","What the hell are you!") ) {
+ case 1: mes "[Shion]";
+ mes "Do you see the bridge to your";
+ mes "right side? Just cross the bridge";
+ mes "and you'll arrive at a castle. All";
+ mes "you have to do is walk inside!";
+ next;
+ mes "[Shion]";
+ mes "The entrance of the castle";
+ mes "is a ^0000FFspinning white light.^000000 These";
+ mes "portals are what allow you to move";
+ mes "from one zone to another.";
+ next;
+ mes "[Shion]";
+ mes "Do you know how to move?";
+ mes "Left click on a spot, and you'll";
+ mes "walk over to that spot. Piece of";
+ mes "cake, huh?";
+ next;
+ mes "[Shion]";
+ mes "So go for it!";
+ mes "Basically, you must enter the";
+ mes "castle in order to start your";
+ mes "adventures.";
+ next;
+ mes "[Shion]";
+ mes "There are soldiers";
+ mes "at the entrance, so don't";
+ mes "worry about getting lost.";
+ mes "Take care now~!";
+ set NEW_MES_FLAG0,1;
+ close;
+ case 2: mes "[Shion]";
+ mes "Interface...";
+ mes "click', 'double-click'";
+ mes "and 'drag' is? .";
+ mes "click just one time,";
+ mes "it is called 'click'";
+ mes "click twice straightly,";
+ mes "it is called 'double-click'.";
+ next;
+ mes "[Shion]";
+ mes "'Drag' is dragging your mouse";
+ mes "to the right, left, up and down";
+ mes "when holding 'left-click'.";
+ mes "when you block a sentence in word";
+ mes "processor program";
+ mes "you use this function";
+ mes "don't you?";
+ next;
+ mes "[Shion]";
+ mes "You need to have some basic knowledge";
+ mes "before you know the interface.";
+ mes "You will see it often in the game and...";
+ next;
+ mes "[Shion]";
+ mes "If you cross the bridge on your right side,";
+ mes "you can go learn in the castle.";
+ mes "This is The Training Grounds";
+ mes "for new novices.";
+ mes "You should go there.";
+ next;
+ mes "[Shion]";
+ mes "Ah, the building's entrance is...";
+ mes "^0000FFSmall Spiral Light.^000000";
+ mes "Click it exactly and jump in there.";
+ mes "If you get in there, you will meet other helpers.";
+ mes "Don't worry too much.";
+ set NEW_MES_FLAG0,1;
+ close;
+ case 3: mes "[Shion]";
+ mes "Who? me? I am nov_Shion!";
+ mes "Gosh, you are so rude.";
+ mes "I am doing free service, without payment.";
+ mes "I feel so bad.";
+ set NEW_MES_FLAG0,2;
+ close;
+ }
+ case 1: mes "[Shion]";
+ mes "Huh...?";
+ mes "Why are you";
+ mes "still here?";
+ mes "^6A6A6A*Sigh...*";
+ next;
+ mes "[Shion]";
+ mes "Hey, when you enter the Training";
+ mes "Grounds, you'll earn all sorts of";
+ mes "things that will help you play the";
+ mes "game. You'll even have the chance";
+ mes "to get Zeny and other rewards.";
+ next;
+ mes "[Shion]";
+ mes "You can even gain";
+ mes "experience like this!";
+ set NEW_MES_FLAG0,3;
+ set BaseExp,BaseExp+9;
+ next;
+ mes "[Shion]";
+ mes "Everything you'll learn here in the";
+ mes "Training Grounds will benefit your";
+ mes "gameplay. So just think positive,";
+ mes "okay?";
+ close;
+ case 2: mes "[Shion]";
+ mes "Hey, man.";
+ mes "Do you still have some business with me?";
+ mes "Whoo, I don't need to be angry.";
+ mes "(Calm down, Calm down)";
+ mes "How can I help you";
+ next;
+ mes "[Shion]";
+ mes "No, no.";
+ mes "Why don't you go back to the";
+ mes "Training Grounds?";
+ mes "Can you see a bridge on your right side?";
+ mes "Cross the bridge and enter the castle.";
+ mes "There will be a helper waiting for you";
+ mes "inside the castle.";
+ next;
+ mes "[Shion]";
+ mes "Ah, if you cannot see the entrance,";
+ mes "try to drag your mouse when holding right click.";
+ mes "It will help you to see the hidden spot.";
+ next;
+ mes "[Shion]";
+ mes "Then, Good bye!";
+ mes " ";
+ mes "And when you face a lady,";
+ mes "you need to be a little more polite.";
+ mes "This is a gift for you.";
+ set NEW_MES_FLAG0,3;
+ set BaseExp,BaseExp+9;
+ close;
+ case 3: mes "[Shion]";
+ mes "The Training Grounds";
+ mes "are located just past";
+ mes "the bridge located";
+ mes "to the right.";
+ next;
+ mes "[Shion]";
+ mes "Although you'll";
+ mes "be sitting through";
+ mes "some classes, you";
+ mes "won't regret it.";
+ mes "Now, go for it!";
+ close;
+ }
+ close;
+
+L_Fail:
+ mes "[Shion]";
+ mes "You shouldn't be here.";
+ close2;
+ savepoint "prontera.gat",273,354;
+ warp "prontera.gat",273,354;
+ end;
+}
+
+new_zone01.gat,144,116,2 script Guard#01 105,{
+ mes "[Training Grounds Guard]";
+ mes "Welcome to the Training Grounds.";
+ mes "You are now in the outer court yard. Please go inside the castle to begin your training.";
+ close;
+}
+
+new_zone01.gat,144,107,2 script Guard#02 105,{
+ mes "[Training Grounds Guard]";
+ if(rand(2)) {
+ mes "Come in!";
+ mes "I would like";
+ mes "to welcome you to";
+ mes "the Training Grounds!";
+ next;
+ mes "[Training Grounds Guard]";
+ mes "In here, you can prepare";
+ mes "yourself for your future";
+ mes "adventures throughout the";
+ mes "Ragnarok world!";
+ } else {
+ mes "Go, Novice, go!";
+ mes "Fight, and grow stronger! Look towards a brighter tomorrow!";
+ }
+ close;
+}
+
+//Receptionist
+new_zone02.gat,100,29,4 script Receptionist#nz 86,{
+ if(Class != Job_Novice || Upper) goto L_Fail;
+ mes "[Training Grounds Receptionist]";
+ mes "Welcome!";
+ mes "You are at the entrance";
+ mes "of the ^3355FFTraining Grounds^000000.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "If you're new";
+ mes "to the Ragnarok world,";
+ mes "please choose the";
+ mes "^3355FFTraining Grounds Introduction^000000";
+ mes "menu for more information.";
+L_loop:
+ next;
+ switch( select("Apply for training.","Direct access to Ragnarok Online.","^3355FFTraining Grounds Introduction.^000000","I need a moment to think.") ) {
+ case 1: mes "[Training Grounds Receptionist]";
+ mes "Thank you for applying for Novice training. For detailed information of each training course, please inquire the Guides for assistance.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "To get you started, we will supply you with a provision of 50 Zeny. When you have questions about the training course process, please feel free to ask any of the Instructors.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "You will now be transferred";
+ mes "to the Training Grounds.";
+ close2;
+ set Zeny,Zeny+50;
+ warp "new_zone02.gat",100,70;
+ end;
+ case 2: mes "[Training Grounds Receptionist]";
+ mes "I understand.";
+ mes "Please do your";
+ mes "best, and I wish you";
+ mes "the best of luck!";
+ close2;
+ set NEW_MES_FLAG0,0;
+ switch( rand(6) ) {
+ case 0: savepoint "prontera.gat",273,354;
+ warp "prontera.gat",273,354;
+ break;
+ case 1: savepoint "morocc.gat",160,94;
+ warp "morocc.gat",160,94;
+ break;
+ case 2: savepoint "geffen.gat",120,100;
+ warp "geffen.gat",120,100;
+ break;
+ case 3: savepoint "payon.gat",70,100;
+ warp "payon.gat",70,100;
+ break;
+ case 4: savepoint "alberta.gat",116,57;
+ warp "alberta.gat",116,57;
+ break;
+ case 5: savepoint "izlude.gat",94,103;
+ warp "izlude.gat",94,103;
+ }
+ end;
+ case 3: mes "[Training Grounds Receptionist]";
+ mes "This training grounds was established in order to provide useful information to new players of Ragnarok Online by the Rune-Midgards Kingdom's Board of Education.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "The training course is organized into two parts: the Basic Knowledge classes, and Field Combat training.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "Through the first course, players will learn the necessary knowledge for a smoother gaming experience.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "In Field Combat Training,";
+ mes "players will engage in actual battle with weak monsters so they can learn the basics of fighting.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "With this battle practice,";
+ mes "players will be able to gain more experience before they enter the real world.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "At the end of the training, we will provide an introduction to the 1st Job Classes. This will help players decide which job class is best for them.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "If you wish to participate in the training grounds, please choose '^3355FFApply for training^000000' in the menu.";
+ next;
+ mes "[Training Grounds Receptionist]";
+ mes "Otherwise, if you want to skip the basic training and immediately enter the world of Ragnarok Online, please choose '^3355FFDirect access to Ragnarok Online^000000.'";
+ break;
+ case 4: mes "[Training Grounds Receptionist]";
+ mes "I understand.";
+ mes "Please, take your time.";
+ close;
+ }
+ goto L_loop;
+
+L_Fail:
+ mes "[Training Grounds Receptionist]";
+ mes "You shouldn't be here.";
+ close2;
+ savepoint "prontera.gat",273,354;
+ warp "prontera.gat",273,354;
+ end;
+}
+
+//Interfaces Instructor
+new_zone02.gat,99,105,4 script Interfaces Instructor 751,{
+ if (!(NEW_MES_FLAG1)) {
+ mes "[Chris]";
+ mes "Nice to meet you. could you show me your application?";
+ next;
+ mes "[Chris]";
+ mes "Yes, I checked it.";
+ mes "I will teach the real basic interface to "+strcharinfo(0)+".";
+ mes "This is not forced to you so if you don't want, you don't need to take this course.";
+ next;
+ switch( select("Listen about 'Interface'.","No lecture, I just want Practical Course.","Cancel.") ) {
+ case 1: mes "[Chris]";
+ mes "You can move any window by dragging your mouse.";
+ mes "I will explain from the basic location where you start on the screen.";
+ next;
+ mes "[Chris]";
+ mes "First of all, if you look at the top left part of the screen,";
+ mes "You can see your name and level in the window.";
+ mes "It also shows how much EXP you have.";
+ mes "This is a Character's ^0000FFBasic Information^000000.";
+ next;
+ mes "[Chris]";
+ mes "I will increase your EXP.";
+ mes "watch how the EXP will change in the basic Information window.";
+ set NEW_MES_FLAG1,1;
+ set BaseExp,BaseExp+155;
+ next;
+ mes "[Chris]";
+ mes "Did you see it?";
+ mes "and let's see...";
+ next;
+ mes "[Chris]";
+ mes "You can open your 'Inventory' and make a party through the Information window.";
+ mes "The secon EXP bar is your Job EXP.";
+ mes "To learn a ^0000FFSkill^000000 you need a skill point.";
+ mes "You will gain a skill point bt getting a Job EXP level.";
+ next;
+ mes "[Chris]";
+ mes "There is a chat window in the bottom left of the screen.";
+ mes "You can scroll with your mouse to see what you've said in the past and";
+ mes "you can change to 'send to party' and 'send to guildsmen' by clicking on the blue dot.";
+ mes "The conversation window is always in open state.";
+ mes "You will use it a lot.";
+ next;
+ mes "[Chris]";
+ mes "In the top right of the screen,";
+ mes "there is a minimap it indicates your current location, party members and guilsmen.";
+ mes "When you stay in a field, the ^0000FF Red Point is an Exit^000000.";
+ mes "Is it helpful?";
+ next;
+ mes "[Chris]";
+ mes "Let's see more, try to open every window by clicking in the Basic Information Window.";
+ mes "Like item window, Equipment, status, etc.";
+ next;
+ mes "[Chris]";
+ mes "You might have gotten bored even though I tried to teach you briefly.";
+ mes "It is Job EXP this time.";
+ set JobExp,JobExp+151;
+ next;
+ mes "[Chris]";
+ mes "Increase Basic Skill with it.";
+ next;
+ mes "[Chris]";
+ mes "Assistant Edwin will give you more details about things.";
+ mes "If you want to learn more, go meet him.";
+ mes "This is a gift for you.";
+ getitem 2352,1;
+ close;
+ case 2: mes "[Chris]";
+ mes "I will send you to the Practical Course.";
+ mes "If you think you need to take more lectures,";
+ mes "Come to see me anytime.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ case 3: emotion e_swt2;
+ close;
+ }
+ }
+ if (!(NEW_MES_FLAG2)) {
+ mes "[Chris]";
+ mes "Do you need my help?";
+ mes "Can I see your application?";
+ mes "Hmm...";
+ mes "You didn't take the skill lectures.";
+ mes "The Skill Instructor is on your leftside.";
+ next;
+ switch( select("Thanks!","Lectures are boring.","Cancel") ) {
+ case 1: mes "[Chris]";
+ mes "If you take this course You will learn usefull skill information, so pay attention.";
+ mes "Well, find the skill instructor.";
+ mes "I will send you to him for free of charge.";
+ close2;
+ warp "new_zone02.gat",84,107;
+ end;
+ case 2: mes "[Chris]";
+ mes "I will send you to the next course,";
+ mes "the Practical Lecture course.";
+ next;
+ if ( select("What? No.","Yes, please send me!") == 1 ) {
+ mes "[Chris]";
+ mes "Then, find me later when you need me.";
+ close;
+ } else {
+ mes "[Chris]";
+ mes "I wish you good luck.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ }
+ case 3: emotion e_swt2;
+ close;
+ }
+ }
+ if (!(NEW_MES_FLAG3)) {
+ mes "[Chris]";
+ mes "Do you need my help?";
+ mes "Can I see your application?";
+ mes "Hmm...";
+ mes "You didn't take the items lectures.";
+ mes "The Item Instructor is on my rightside.";
+ next;
+ switch( select("Thanks!","Lectures are boring.","Cancel") ) {
+ case 1: mes "[Chris]";
+ mes "You can learn how to use items, and other windows.";
+ mes "It will be helpful.";
+ mes "Well, Go to the item instructor.";
+ mes "I will send you to him for free of charge.";
+ close2;
+ warp "new_zone02.gat",115,107;
+ end;
+ case 2: mes "[Chris]";
+ mes "I will send you to the next course,";
+ mes "the Practical Lecture course.";
+ next;
+ if ( select("What? No.","Yes, please send me!") == 1 ) {
+ mes "[Chris]";
+ mes "Then, find me later when you need me.";
+ close;
+ } else {
+ mes "[Chris]";
+ mes "I wish you good luck.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ }
+ case 3: emotion e_swt2;
+ close;
+ }
+ }
+ mes "[Chris]";
+ mes "You finished all the required sourses.";
+ mes "have you listened to the other Assistants?";
+ mes "The next stage is practical monster-hunting.";
+ mes "Are you ready?";
+ next;
+ switch( select("Move to next course!","I want to look arround more.","Send me to Town!") ) {
+ case 1: mes "[Chris]";
+ mes "The next course is practical monster-hunting.";
+ mes "Pay attention to what he says, and finish the course safely.";
+ mes "I wish you good luck.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ case 2: mes "[Chris]";
+ mes "That is a good idea.";
+ mes "We have just taught you some of the";
+ mes "required basic knowledge;";
+ mes "however if it is not enough, please meet the";
+ mes "other assistants so you can learn more details.";
+ next;
+ mes "[Chris]";
+ mes "If you don't know where you have to go,";
+ mes "come and ask me.";
+ close;
+ case 3: mes "[Chris]";
+ mes "Are you sure you want to move to town?";
+ mes "If you think you've learnt enough,";
+ mes "go to the right side and meet the";
+ mes "^0000FFKafra Service.^000000";
+ next;
+ mes "[Chris]";
+ mes "The Kafra Service offers";
+ mes "'Teleportation Service'";
+ mes "'Storage Service'";
+ mes "Meet them";
+ mes "and use their service.";
+ next;
+ mes "[Chris]";
+ mes ".......If you leave here";
+ mes "I cannot see you anymore";
+ mes "but";
+ mes "I hope that you are blessed wherever you go.";
+ mes "Good luck.";
+ close;
+ }
+}
+
+new_zone02.gat,83,111,4 script Skill Instructor 753,{
+ if (!(NEW_MES_FLAG2)) {
+ mes "[Shecil]";
+ mes ""+strcharinfo(0)+"";
+ mes "It is such a good name!";
+ mes "Let's start this class?";
+ next;
+ switch( select("What do you teach me?","Send me to Practical Course!","Cancel") ) {
+ case 1: mes "[Shecil]";
+ mes "I live and die for fighting!";
+ mes "Some sort of special skill!!!!!!";
+ mes "Ah! no, I made a mistake.";
+ mes "I will teach you how to use it.";
+ mes "First of all, Increasing your skill level.";
+ next;
+ mes "[Shecil]";
+ mes "Your Skill Window is in Basic Information.";
+ mes "Click ^0000FFSkill^000000.";
+ mes "Another window pops up, right?";
+ mes "Short key is ^0000FFS when holding down alt^000000.";
+ mes "From now we will say like 'Alt+S'.";
+ set NEW_MES_FLAG2,1;
+ set JobExp,JobExp+151;
+ next;
+ mes "[Shecil]";
+ mes "Did you open it?";
+ mes "Do you see Basic Skill down there?";
+ mes "Skill point might be 1.";
+ mes "There is a mumber Clock 'Lv Up Button' at the right side beside basic skill.";
+ next;
+ mes "[Shecil]";
+ mes "Did you increase your skill?";
+ mes "If you have any questions, ask Pitch Judas";
+ mes "hmmm...";
+ mes "I am thinking of a usefull skill.";
+ next;
+ mes "[Shecil]";
+ mes "Right, right!";
+ mes "I will teach you First Aid Skill.";
+ mes "In Emergencies, you can use this skill.";
+ skill 142,1,0;
+ set skill_nov,3;
+ next;
+ mes "^0000FF-You've learned First Aid Skill-^000000";
+ next;
+ mes "[Shecil]";
+ mes "Now, if you open your skill window,";
+ mes "^0000FFFirst Aid^000000 will be there.";
+ mes "Try to double-click to use it!";
+ next;
+ mes "^0000FF-You received some Job Exp.-^000000";
+ set JobExp,JobExp+151;
+ next;
+ mes "[Shecil]";
+ mes "How was it?";
+ mes "When you use your skill, SP decreases.";
+ mes "If you use First Aid skill, it will recover some HP.";
+ mes "It will be usefull for New Novices.";
+ next;
+ mes "[Shecil]";
+ mes "Thanks for your attention!";
+ mes "Oh, I am feeling so good.";
+ mes "I will give you a Plus-Exp!";
+ mes "Since I am a cool guy!";
+ set BaseExp,BaseExp+155;
+ next;
+ mes "[Shecil]";
+ mes "My lecture ends here.";
+ mes "It was short and had many services.";
+ mes "Do you want to know more? then, ask other users.";
+ mes "If you think that is hard, go to talk to Assistant.";
+ mes "He will teach you well.";
+ next;
+ switch( select("Let me look around.","Send me to the Practical Course.","Cancel.") ) {
+ case 1: mes "[Shecil]";
+ mes "If you think, you learned enough anybody will be fine.";
+ mes "Ask one of our insctructors, they will help you.";
+ mes "Cheer Up!";
+ close;
+ case 2: goto L_battle;
+ case 3: emotion e_omg;
+ }
+ close;
+ case 2: goto L_battle;
+ case 3: emotion e_omg;
+ }
+ close;
+ }
+ if (!(NEW_MES_FLAG1)) {
+ mes "[Shecil]";
+ mes "What, can I help you?";
+ mes "Uh?";
+ mes "You didn't take interface lectures";
+ mes "I know the lecture is not worth it!";
+ mes "HaHaHaHa!!!!";
+ next;
+ switch( select("I will go take it!","I am bored. Send me to Practical Course.") ) {
+ case 1: mes "[Shecil]";
+ mes "Yes, it's good thinking.";
+ mes "Get EXP, Items as much as you can.";
+ mes "HaHaHa.";
+ mes "He is in the middle.";
+ mes "It is easy to find him.";
+ close;
+ case 2: goto L_battle;
+ case 3: emotion e_omg;
+ }
+ close;
+ }
+ if (!(NEW_MES_FLAG3)) {
+ mes "[Shecil]";
+ mes "What can I help you?";
+ mes "Huh?";
+ mes "You didn't take the item lecture?";
+ mes "I know the lecture is not worth it!";
+ mes "HaHaHaHa!!!!";
+ next;
+ switch( select("I will go and take it!","I am bored. Send me to Practical Course.","Cancel.") ) {
+ case 1: mes "[Shecil]";
+ mes "Yes, it is a good thinking.";
+ mes "Get EXP, Items as much as you can.";
+ mes "Hahaha.";
+ mes "I will send you to the service.";
+ close2;
+ warp "new_zone02.gat",115,107;
+ break;
+ case 2: goto L_battle;
+ case 3: emotion e_omg;
+ }
+ close;
+ }
+ mes "[Shecil]";
+ mes "Do you need my help?";
+ mes "You've finished all the courses.";
+ mes "Ah, you came back to see me";
+ mes "because I am so nice.";
+ mes "Is it right?";
+ mes "have you met the Assistants?";
+ next;
+ switch( select("Send me to the next course.","Assistants?","I want to go to town.") ) {
+ case 1: mes "[Shecil]";
+ mes "Oh, Right.";
+ mes "You should go to the Practical Lecture Course.";
+ mes "Ah, I wish I could hunt mobs in the field.";
+ mes "This job is so boring.";
+ mes "My fists have gotten a bit rusty.";
+ mes "Ok, I will send you! You should grow up well!";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ case 2: mes "[Shecil]";
+ mes "Huh? you look like";
+ mes "'you didn't do it before'.";
+ mes "Listen to me. We teach briefly,";
+ mes "not boring, but fast";
+ mes "as much as we can.";
+ next;
+ mes "[Shecil]";
+ mes "However, it is not good enough for";
+ mes "some people educationally.";
+ mes "There will be some people who";
+ mes "want to learn more.";
+ mes "so, to satisfy this, some";
+ mes "Assistants";
+ mes "exist to help those people.";
+ mes "Go and meet them!";
+ next;
+ mes "[Shecil]";
+ mes "Especially, Pitch Judas...";
+ mes "He will teach you well about skills.";
+ mes "Even though he looks dangerous.";
+ mes "Hahaha!";
+ close;
+ case 3: mes "[Shecil]";
+ mes "Do you want to go to town? You can";
+ mes "use Kafra services.";
+ mes "Make a right from here and go straight,";
+ mes "you will see her.";
+ mes "HaHaHa!";
+ mes "Why don't you hurry up to meet";
+ mes "her?";
+ close;
+ }
+ end;
+L_battle:
+ mes "[Shecil]";
+ mes "Good, there is nothing better than experiencing reality.";
+ mes "Practical Course!";
+ mes "Cheer up!";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+}
+
+new_zone02.gat,115,111,4 script Item Instructor 726,{
+ disable_items;
+ if (!(NEW_MES_FLAG3)) {
+ mes "[Alice]";
+ mes "Hmm... I am so bored.";
+ mes "Huh? Are you new here?";
+ mes "You want to take an Item Lecture, don't you?";
+ next;
+ menu "Yes.",-,"No, I just want to pass.",L_battle,"Where is town?",L_kafra;
+ mes "[Alice]";
+ mes "I will make it a short lecture.";
+ mes "I know you are bored.";
+ mes "Firstly, open the 'Inventory' window.";
+ mes "Click 'Item' in the Basic Information Window.";
+ mes "It will show you the items that it contains.";
+ mes "The inventory is divided into 3 sections such as item, equip and etc.";
+ next;
+ mes "[Alice]";
+ mes "Now, would you click the item tab?";
+ mes "in the Inventory Window? I just";
+ mes "gave you a Novice Potion. You can";
+ mes "drink it by double-clicking it. Go";
+ mes "ahead, try it!";
+ set NEW_MES_FLAG3,1;
+ set @potion,countitem(569);
+ getitem 569,1;
+ enable_items;
+ next;
+ if ( @potion >= countitem(569) ) {
+ mes "[Alice]";
+ mes "Nice~!";
+ mes "And here's";
+ mes "a little reward";
+ mes "just for listening.";
+ set BaseExp,BaseExp+155;
+ next;
+ }
+ disable_items;
+ mes "[Alice]";
+ mes "Let me explain about";
+ mes "items in the ^0000FFequip^000000 tab";
+ mes "of the Inventory Window.";
+ next;
+ mes "[Alice]";
+ mes "When you click on the 'equip tab',";
+ mes "you can view every item in your";
+ mes "inventory that you can equip. Let";
+ mes "me give you some equipment so that";
+ mes "you can try them on.";
+ next;
+ getitem 2510,1;
+ getitem 2414,1;
+ getitem 5055,1;
+ enable_items;
+ mes "[Alice]";
+ mes "Got them? Good.";
+ mes "Now, double-click";
+ mes "on the Novice Slippers";
+ mes "I just gave you to";
+ mes "put them on.";
+ next;
+ if ( getequipisequiped(6) ) {
+ mes "[Alice]";
+ mes "Hooray~!";
+ mes "You did it!";
+ mes "You deserve a reward!";
+ set BaseExp,BaseExp+155;
+ next;
+ }
+ disable_items;
+ mes "[Alice]";
+ mes "Would you";
+ mes "press the ^0000FF'F12'^000000 key?";
+ mes "This will summon your";
+ mes "Hotkey bar on your screen.";
+ next;
+ mes "[Alice]";
+ mes "There is a column from ^0000FFF1 to F9^000000";
+ mes "If you took a skill lecture,";
+ mes "you are supposed to have 'First Aid'.";
+ mes "Drag the skill to the 'Short key window'.";
+ next;
+ mes "[Alice]";
+ mes "Do you understand ?";
+ mes "To use skills, you need some skill point,";
+ mes "and anyway, you cannot put passive skills in the 'Short key window'.";
+ set JobExp,JobExp+151;
+ next;
+ mes "[Alice]";
+ mes "'Alice' simple and good quality lecture ends here.";
+ mes "Lastly I will give you some items, which can help you.";
+ getitem 601,10;
+ getitem 602,2;
+ getitem 569,50;
+ next;
+ mes "[Alice]";
+ mes "However, ^FF0000do not use the Fly Wing or Butterfly Wing ^000000in these Training Grounds or you could be stuck here forever. Those items are for when you graduate, okay?";
+ next;
+ mes "[Alice]";
+ mes "And lastly...";
+ mes "I will give";
+ mes "you some Job experience!";
+ set JobExp,JobExp+151;
+ next;
+ menu "What do I have to do?",-,"Then, Practical Course!",L_battle,"Cancel.",L_bye;
+ mes "[Alice]";
+ mes "Is there any Instructor that you didn't meet yet?";
+ mes "They are not gracious as much as I am";
+ next;
+ mes "[Alice]";
+ mes "However, some assistants are really good,";
+ mes "and there are some hidden things.";
+ mes "So if you want, you can stay here longer and know them.";
+ mes "If not ask anybody and tell them where you want to go.";
+ close;
+ }
+ if (!(NEW_MES_FLAG1)) {
+ mes "[Alice]";
+ mes "How can I help you?";
+ mes "You didn't take a interface lecture.";
+ mes "Chris will be dissapointed.";
+ mes "Why don't you go and meet him?";
+ next;
+ menu "Ok, I will meet him.",-,"It is boring, I want to go to Practical Course.",L_battle1,"What do I have todo to goto town?",L_kafra;
+ mes "[Alice]";
+ mes "It's a good idea.";
+ mes "When you came here, you had to see 'Interface Instructor'.";
+ mes "He is in the middle of the hall.";
+ mes "Also he has some gifts for you!";
+ mes "You don't want to lose those presents, do you?";
+ close;
+ }
+ if (!(NEW_MES_FLAG2)) {
+ mes "[Alice]";
+ mes "How can I help you?";
+ mes "Oh, you didn't take ^0000FFSkill Lecture^000000 yet.";
+ mes "Shecil will be dissapointed.";
+ mes "Why don't you go meet her?";
+ next;
+ menu "Yes, I will meet her.",-,"Boring, I want to go to Practical Course.",L_battle1,"How to get to town?",L_kafra;
+ mes "[Alice]";
+ mes "It's a good idea.";
+ mes "Shecil is on the left side of the hall.";
+ mes "I will send you there.";
+ mes "Study Hard!";
+ close2;
+ warp "new_zone02.gat",84,107;
+ end;
+ }
+ mes "[Alice]";
+ mes "Huh? did you get lost?";
+ mes "Do you need some help?";
+ mes "I think you learned enough.";
+ mes "Do you want to go somewhere?";
+ next;
+ menu "I don't know where I can go.",-,"I want to go to town.",L_kafra,"Cancel.",L_bye;
+ mes "[Alice]";
+ mes "Hmm... You already know how to use items and skills.";
+ mes "Practical Course still remains.";
+ mes "Do you want to go to Practical Course?";
+ mes "Then, I will send you.";
+ next;
+ if ( select("Let me go!","Wait for a moment.") == 1 ) {
+ mes "[Alice]";
+ mes "You got your equipment that I gave you right?";
+ mes "Wear those tight.";
+ mes "Ok, I will let you go.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ } else {
+ mes "[Alice]";
+ mes "Ok.";
+ mes "If you need anything, call me anytime.";
+ close;
+ }
+ end;
+L_battle:
+ mes "[Alice]";
+ mes "Boring";
+ mes "Do you want to go to the Practical Course directly?";
+ mes "Hmmm... Did you meet every instructor?";
+ mes "It's better for you to meet all of them.";
+ next;
+ if ( select("Only Practical Course!","Wait for a moment.") == 1 ) {
+L_battle1:
+ mes "[Alice]";
+ mes "Huh.. You are so energetic.";
+ mes "I want you to listen to the instructor carefully.";
+ mes "The information that you learn there may save your life.";
+ mes "Ok, I will send you there.";
+ mes "Goodbye.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ } else {
+ mes "[Alice]";
+ mes "Yes, You might want to meet people more here";
+ mes "there are some Assistants who can help you.";
+ mes "You ought to receive items as much as you can here";
+ mes "then, you can leave.";
+ close;
+ }
+L_kafra:
+ mes "[Alice]";
+ mes "If you want to go to town, you can ask the kafra Employee to go.";
+ mes "Prontera, Morroc, Payon, etc...";
+ mes "She will send you wherever you want to go";
+ close;
+L_bye:
+ mes "[Alice]";
+ mes "Hmm...";
+ close;
+}
+
+new_zone02.gat,118,108,4 script Kafra Employee 94,{
+ mes "[Kafra Employee]";
+ mes "Welcome to";
+ mes "Kafra Corporation.";
+ mes "The Kafra services are";
+ mes "always on your side.";
+ next;
+ mes "[Kafra Employee]";
+ mes "I've been dispatched from Kafra Corporation Headquarters to assist new players such as yourself.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Please, take heed!";
+ mes "If you move to a town";
+ mes "^4d4dffYou will be unable to return to the Training Grounds ever again^000000.";
+ next;
+ if ( select("Teleport Service","About Kafra services") == 1 ) {
+ mes "[Kafra Employee]";
+ mes "I see, you must want to teleport to a town in Rune-Midgard imediately. First, let me briefly inform you about the different towns and cities in Ragnarok.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Prontera is the capital of the Rune-Midgards kingdom, and its satellite, Izlude, is closeby.";
+ next;
+ mes "[Kafra Employee]";
+ mes "^996633Morroc^000000 is in the desert. It's the town where you can change your job to the Thief and Assassin classes.";
+ next;
+ mes "[Kafra Employee]";
+ mes "^006600Payon^000000 is in the mountains, and is famous for its Archer Village, where Novices can change their jobs to Archers.";
+ next;
+ mes "[Kafra Employee]";
+ mes "The city of magic, ^993300Geffen^000000, is where people go to become Mages and Wizards.";
+ next;
+ mes "[Kafra Employee]";
+ mes "^003399Alberta^000000, the port city, is where the Merchant Guild is located. You must also go to Alberta if you wish to travel by sea.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Please choose";
+ mes "your destination.";
+ next;
+ if ( NEW_MES_FLAG1 || NEW_MES_FLAG2 || NEW_MES_FLAG3 ) {
+ if ( select("Practical Course","Prontera","Morroc","Payon","Alberta","Geffen") == 1 ) {
+ mes "[Kafra Employee]";
+ mes "You will be sent to Practical Course.";
+ close2;
+ warp "new_zone02.gat",28,178;
+ end;
+ }
+ set @menu,@menu-1;
+ } else {
+ menu "Prontera",-,"Morroc",-,"Payon",-,"Alberta",-,"Geffen",-;
+ }
+ switch ( @menu ) {
+ case 1: mes "[Kafra Employee]";
+ mes "You have decided";
+ mes "to go to Prontera.";
+ mes "May God be with you.";
+ close2;
+ callsub L_prewarp;
+ savepoint "prontera.gat",118,72;
+ warp "prontera.gat",150,50;
+ end;
+ case 2: mes "[Kafra Employee]";
+ mes "Desert City, Morroc.";
+ mes "In the middle of town, there is a beautiful oasis.";
+ mes "...";
+ mes "I will pray you keep your hope in your heart always.";
+ close2;
+ callsub L_prewarp;
+ savepoint "morocc.gat",151,98;
+ warp "morocc.gat",155,110;
+ end;
+ case 3: mes "[Kafra Employee]";
+ mes "Hm? do you want to be an archer?";
+ mes "I will send you to Payon.";
+ mes "May God bless you.";
+ close2;
+ callsub L_prewarp;
+ savepoint "payon.gat",160,58;
+ warp "payon.gat",166,67;
+ end;
+ case 4: mes "[Kafra Employee]";
+ mes "Harbor City, Alberta.";
+ mes "This town is a base of trade.";
+ mes "If you want to see different cultures, you have to go through here.";
+ mes "HuHu... I think you are going to go to the Merchant Association.";
+ mes "May God bless you.";
+ close2;
+ callsub L_prewarp;
+ savepoint "alberta.gat",31,233;
+ warp "alberta.gat",114,58;
+ end;
+ case 5: mes "[Kafra Employee]";
+ mes "City of Magic.";
+ mes "There is a big 'Geffen Tower' in the middle of town.";
+ mes "I will send you arround the water fountain.";
+ mes "May God bless you.";
+ close2;
+ callsub L_prewarp;
+ savepoint "geffen.gat",118,37;
+ warp "geffen.gat",121,65;
+ end;
+ }
+ } else {
+ mes "[Kafra Employee]";
+ mes "Let me introduce you";
+ mes "to the Kafra Services.";
+ mes "In the menu, please choose";
+ mes "the service you'd like to";
+ mes "learn more about.";
+L_loop:
+ next;
+ switch( select("Save service.","Storage service.","Teleport service.","Cart rental service.","Cancel.") ) {
+ case 1: mes "[Kafra Employee]";
+ mes "When you talk to a Kafra Employee and ask for the save Service, the location of where you will revive, after being defeated in battle, will be changed.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Your Respawn Point is always the last place where you have saved. Using a Butterfly Wing will return you to the place where you";
+ mes "last saved.";
+ next;
+ if (!(NEW_LVUP0)) {
+ set NEW_LVUP0,1;
+ set BaseExp,BaseExp+155;
+ }
+ mes "[Kafra Employee]";
+ mes "The save Service";
+ mes "is also provided by";
+ mes "the Kafra Corporation";
+ mes "free of charge~!";
+ break;
+ case 2: mes "[Kafra Employee]";
+ mes "The Kafra Corporation is the world's largest company with a long and distinguished history on the Rune-Midgard continent.";
+ next;
+ mes "[Kafra Employee]";
+ mes "You can store and retrieve";
+ mes "your items in any town at your convenience. This Storage is shared by every character on one account.";
+ next;
+ mes "[Kafra Employee]";
+ mes "It's unreasonable to carry all of your items with you when you don't need them right away. Please use our Storage and keep your items safe and secure.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Our convenient Storage Service";
+ mes "is provided to our customers for a small fee which is different from town to town.";
+ next;
+ mes "[Kafra Employee]";
+ mes "However, you must be";
+ mes "at least ^3355FFBasic Skill Level 6^000000";
+ mes "to use the Storage.";
+ next;
+ mes "[Kafra Employee]";
+ mes "There are 3 different item sections of the Storage into which items are organized: Consumable, Equipment and Etc.";
+ next;
+ mes "[Kafra Employee]";
+ mes "There are a maximum of 300 Inventory Slots in Kafra Storage, meaning you can have up to 300 different kinds of items in Storage.";
+ next;
+ mes "[Kafra Employee]";
+ if (!(NEW_JOBLVUP)) {
+ set NEW_JOBLVUP,1;
+ set JobExp,JobExp+151;
+ }
+ mes "Remember though, that in the case of Equipment, each item takes up one Inventory Slot. The maximum number of items that can be placed in Kafra Storage is 30,000.";
+ break;
+ case 3: mes "[Kafra Employee]";
+ mes "The Kafra Corporation";
+ mes "provides our valued customers with a convenient Teleport Service which greatly cuts down on your";
+ mes "traveling time.";
+ next;
+ mes "[Kafra Employee]";
+ mes "Our Teleport Service is safe and comfortable, and will allow you to fully explore the various lands of the Rune-Midgard continent.";
+ next;
+ mes "[Kafra Employee]";
+ mes "We thank our valued customers for their great support and continue to provide them with the best";
+ mes "of service.";
+ break;
+ case 4: mes "[Kafra Employee]";
+ mes "The Kafra Corporation";
+ mes "provides a Cart Rental Service to Merchants, as well as Blacksmiths and Alchemists.";
+ next;
+ mes "[Kafra Employee]";
+ mes "The flamboyantly mysterious";
+ mes "^CE6300Super Novice^000000 can use Carts, but we officially don't have a contract with that class. Still, somehow...";
+ next;
+ mes "[Kafra Employee]";
+ mes "Anyway, Merchants, Blacksmiths and Alchemists must also learn the ^3355FFPush Cart^000000 skill in order to be able to rent a cart.";
+ next;
+ mes "[Kafra Employee]";
+ mes "The Cart Rental service";
+ mes "charge will differ from";
+ mes "town to town.";
+ break;
+ case 5: mes "[Kafra Employee]";
+ mes "I hope you are satisfied with my";
+ mes "explanation about the Kafra corporation.";
+ close;
+ }
+ goto L_loop;
+ }
+ end;
+L_prewarp:
+ if (!(NEW_MES_FLAG1) && !(NEW_MES_FLAG2) && !(NEW_MES_FLAG3)) {
+ getitem 569,100;
+ getitem 1243,1;
+ getitem 2414,1;
+ getitem 2510,1;
+ getitem 2352,1;
+ getitem 2112,1;
+ getitem 601,10;
+ getitem 602,2;
+ }
+ getitem 7059,5; //Free Storage Ticket
+ getitem 7060,5; //Free Warp Ticket
+ set NEW_MES_FLAG0,0;
+ set NEW_MES_FLAG1,0;
+ set NEW_MES_FLAG2,0;
+ set NEW_MES_FLAG3,0;
+ set NEW_MES_FLAG4,0;
+ set NEW_MES_FLAG5,0;
+ set NEW_LVUP0,0;
+ set NEW_LVUP1,0;
+ set NEW_JOBLVUP,0;
+ return;
+}
+
+new_zone02.gat,121,101,2 script Guide Soldier 105,{
+ mes "[Soldier]";
+ mes "We, Soldiers, are guiding Novices here in the gate way of town.";
+ mes "When you go to a new town, Please visit Guide Soldier and receive their information for the map.";
+ next;
+ mes "[Soldier]";
+ mes "Some soldiers wear different garment in some towns.";
+ mes "I just anted to let you know about it as a reference.";
+ mes "Go meet them and talk to them.";
+ next;
+ mes "[Soldier]";
+ mes "If you want to go to town, ask the Kafra Employee right before you.";
+ mes "She will send you to town.";
+ close;
+}
+
+//Interface Assistant
+new_zone02.gat,161,182,6 script Interface Assistant 92,{
+ mes "[Edwin]";
+ mes "I am an Interface Assistant.";
+ mes "Choose what you want to know more about.";
+L_loop:
+ next;
+ switch( select("Basic Information Window","Party Window","Item Window","Option Window","Equipment Window","Cancel") ) {
+ case 1: mes "[Edwin]";
+ mes "Let's see the Basic Information Window.";
+ mes "You can find your name, base level, you job and your job level displayed on the window.";
+ mes "^800FFFBase lvl^000000 is your character's level.";
+ next;
+ mes "[Edwin]";
+ mes "^800FFFJob level^000000 shown under the base level meant the job level of your character's class.";
+ mes "If you took the Instructors lectures, of course, you will understand those.";
+ next;
+ mes "[Edwin]";
+ mes "On the basic inforamtion window,";
+ mes "your current experience showup aswell.";
+ mes "Experience points in Ragnarok Online are indicated by % and base and job level are seperate.";
+ mes "When either reaches 100% it will be raised by one level,";
+ mes "this bar will then reset to 0% for the next level.";
+ next;
+ mes "[Edwin]";
+ mes "HP means your Health Points.";
+ mes "When it raches 0, you will faint and not be able to fight.";
+ mes "You can either return to your save point or wait until somebody revives you.";
+ mes "If you die on fields or dungeons,";
+ mes "you will receive a^4d4dff -1% EXP penalty^000000.";
+ mes "So be careful.";
+ next;
+ mes "[Edwin]";
+ mes "SP means your Spell Points.";
+ mes "when you become a 1st class,";
+ mes "you will learn unique skills of the class and then you will be able to use your SP.";
+ mes "Your skill instructor will teach you more about your skills.";
+ next;
+ mes "[Edwin]";
+ mes "If you want to check your weight limit,";
+ mes "you can check thr weight at the bottom left of the basic window.";
+ mes "It will show your current weight / your maximum weight limit.";
+ mes "?•?If your weight becomes over 50% of the maximum,";
+ mes "your HP and SP will not restore naturally.";
+ mes "So be carefull.";
+ next;
+ mes "[Edwin]";
+ mes "The numerical value next to the weight limit shows the current amount of money you have.";
+ mes "The currency used in the Rune-Midgard Kingdom is Zeny.";
+ next;
+ mes "[Edwin]";
+ mes "There are buttons at the right side of the window.";
+ mes "They are all part of the interface menu.";
+ mes "Click them one by one, check what you can do with them.";
+ mes "The shortcut key for minimising / maximizing the basic information window is 'Alt+V' refer to your information.";
+ break;
+ case 2: mes "[Edwin]";
+ mes "You can open the party window by pressing the friend buttin on the basic infomation window,";
+ mes "or you can use 'Alt+Z' for it's shortcut.";
+ mes "You can check all members of your party with this window.";
+ next;
+ mes "[Edwin]";
+ mes "The founder of the party can determine the distribution of EXP and items to the party.";
+ mes "You can also see the location of your members on the mini-map.";
+ next;
+ mes "[Edwin]";
+ mes "On the party window, not only your party members but also your friends showup.";
+ mes "You can whisper them or delete them from your friends list.";
+ next;
+ mes "[Edwin]";
+ mes "You can learn about organizing a party from your skill instructor.";
+ mes "Oh, well, I guess it's best if you try it out on your own.";
+ break;
+ case 3: mes "[Edwin]";
+ mes "The item window is divided into 3 sections.";
+ mes "Such as item, equip and etc.";
+ mes "Items is used for consumeable items.";
+ mes "Equip is for equipment items";
+ mes "Etc is for miscelanious items.";
+ next;
+ mes "[Edwin]";
+ mes "Your weight limit does limit the amount of items you can carry with you ans the limitation of the amount of an item.";
+ mes "In this case, you must use the Kafra storage.";
+ mes "Also, equipment and consumeable items can be set on the hotkey window.";
+ next;
+ mes "[Edwin]";
+ mes "You can open the Hotkey window by pressing F12, you can put items there from F1 to F9.";
+ mes "You can switch the hotkey windows by pressing the F12 key again.";
+ break;
+ case 4: mes "[Edwin]";
+ mes "You can open the option window with the option button on the basic information window,";
+ mes "but you can use the 'Alt+O' command aswell.";
+ mes "You can adjust sound, skin and transparency of the skin through the option window.";
+ next;
+ mes "[Edwin]";
+ mes "With the sound button,";
+ mes "you can turn the background music on / off or turn the volume up or down.";
+ mes "With the effect button, you can adjust the sound effects volume.";
+ next;
+ mes "[Edwin]";
+ mes "With the skin option, you can change the menu skin.";
+ mes "Scroll up / down the list of skins you have, and choose a skin.";
+ mes "You can also download skins from our website.";
+ next;
+ mes "[Edwin]";
+ mes "The snap option allows your mouse cursor to automatically move to a nearby target.";
+ mes "When you click to attack,";
+ mes "the cursor of the mouse will automatically change into a sword.";
+ mes "Skill and item targeting also work with the snap option.";
+ next;
+ mes "[Edwin]";
+ mes "It could be usefull or annoying if you're not used to it";
+ mes "Well... once you get used to it,";
+ mes "you will be able to adjust your own snap options.";
+ next;
+ mes "[Edwin]";
+ mes "Well, it all depends on your experience.";
+ mes "That's all there is for the option window.";
+ break;
+ case 5: mes "[Edwin]";
+ mes "Click the equip button on your basic window or press 'Alt+Q'.";
+ mes "You will see the items that your character has equiped now.";
+ next;
+ mes "[Edwin]";
+ mes "For starters, every character starts with a kife and a cotton shirt.";
+ mes "There are 2 ways of changing your equipment.";
+ mes "Double click equipment in the item window or drag an item to the equipment window.";
+ next;
+ mes "[Edwin]";
+ mes "You can also switch your equipment by placing them on the F12 hotkey bar.";
+ mes "You will understand this when you try it on your own.";
+ break;
+ case 6: mes "[Edwin]";
+ mes "Feel free to ask me anytime.";
+ close;
+ }
+ goto L_loop;
+}
+
+new_zone02.gat,182,182,4 script Status Assistant 754,{
+ mes "[Jarre Riotte]";
+ mes "Welcome new adventurer.";
+ mes "I, Jarre Riotte will help you learn about the fundamental rules of your characters status.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "I am willing to help you learn more about the statuses more then anything else,";
+ mes "so feel free to ask me about the character abilities you're wondering about.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "By the way...";
+ mes "It is called 'Status'.";
+ mes "STR stands for Strength, AGI stansds for Agility.";
+ mes "VIT stand for Vitality, INT stands for Intelligence.";
+ mes "DEX stands for Dexterity, LUK stands for Luck.";
+L_loop:
+ next;
+ switch( select("Str and Agi.","Vit and Int.","Dex and Luk.","Cancel") ) {
+ case 1: mes "[Jarre Riotte]";
+ mes "Let me explain Strength first.";
+ mes "";
+ mes "^4D4DFFFStrength(STR)^000000 increases ^4D4DFFFphysical attack damage(ATK)^000000 ";
+ mes "and your ^4D4DFFFmaximum weight limit^000000.";
+ mes "1 STR increases 1 physical attack damage,";
+ mes "also certain attack damage bonuses occur by increments of 10 STR.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "For instance,";
+ mes "let's say your current strength is";
+ mes "48 + 1. ";
+ mes "Your original STR is 48, 1 at the ";
+ mes "end is a bonus status.";
+ mes "Out of total 49, when you double 4,";
+ mes "the head number of 49 by 4,";
+ mes "you will have 16 as the physical";
+ mes "attack damage bonus";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Let's say you leveled up and now";
+ mes "your strength is 49+1.";
+ mes "Then your STR's total is 50,";
+ mes "the bonus on the physical attack";
+ mes "damage will be 25.";
+ mes "If your STR is 100, 10 the head";
+ mes "number of 100, times 10 will be a";
+ mes "100.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Ok, now let's move on to Agility.";
+ mes "Agility affects on ^4d4dffthe Flee Rate^000000";
+ mes "which allows you to avoid enemies'";
+ mes "attack and the characters ^4d4dffAttackSpeed^000000.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "1 AGI increases 1 Flee Rate,";
+ mes "1 level increases 1 Flee Rate";
+ mes "as well.";
+ mes "Therefore, ^4d4dffFlee Rate equals AGI +^000000";
+ mes "^4d4dfflevel.^000000";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Alright, I will give you an";
+ mes "example.";
+ mes "Let's say you're at level 40";
+ mes "possessing 40 AGI.";
+ mes "Following the Flee Rate formula,";
+ mes "your flee rate will be a total of";
+ mes "80.";
+ mes "The Flee Rate is divided into";
+ mes "normal Flee Rate + perfect dodge,";
+ mes "AGI is only involved with the";
+ mes "normal Flee Rate.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "The perfect flee rate is related to";
+ mes "LUK status,";
+ mes "we will discuss about the status";
+ mes "later.";
+ mes "As your Attack Speed (ASPD) is";
+ mes "increased, the delay between one";
+ mes "attack and the next is reduced.";
+ mes "ASPD is the numerical value of the";
+ mes "increment and differs by job class.";
+ mes "Please remember that.";
+ break;
+ case 2: mes "[Jarre Riotte]";
+ mes "Our next subject will be Vitality";
+ mes "(VIT) and Intelligence.";
+ mes "^4D4DFFVitality^000000 affects the ^4D4DFFMaximum HP, amount of HP restoration and defense.^000000";
+ mes "The amount of HP increased by 1 VIT";
+ mes "differs by job class,";
+ mes "the Swordsman class benefit the most";
+ mes "from VIT increment out of all";
+ mes "classes.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Let's check defenses.";
+ mes "On your stat window,";
+ mes "Defense will show as DEF. Defense";
+ mes "is shown as 2 different numerical";
+ mes "values,";
+ mes "How Vitality affects these values";
+ mes "is shown as the second number of";
+ mes "the two.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Now you must be wondering about the";
+ mes "first of the 2 numerical values.";
+ mes "The first one shows the defense";
+ mes "from your equipment and armour.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "The defense increased by equipments";
+ mes "reduces the amount of damage";
+ mes "you're dealt from an enemy by a %";
+ mes "of the total damage and the defense";
+ mes "from VIT reduces the amount of";
+ mes "damage by number.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "I guess you understood, didn't you?";
+ mes "The next subject is about";
+ mes "Intelligence (INT).";
+ mes "If you wish to major in some kind";
+ mes "of complicated work,";
+ mes "which requires you to be extremely";
+ mes "intelligence and knowledgeable,";
+ mes "I can recommend you to the";
+ mes "Schwicherbil Magic Academy.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Oh well, let's talk about INT.";
+ mes "INT affects the maximum amount of";
+ mes "^4D4DFFSP, SP restoration,^000000";
+ mes "the ^4D4DFFdamage of your magic attack^000000";
+ mes "^4d4dff(MATK)^000000 and your ^4D4DFFdefense against magic attack (MDEF)";
+ mes "The SP amount and MATK increased by";
+ mes "1 INT is dependent on job class,";
+ mes "just like VIT.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Just like normal DEF,";
+ mes "Your MDEF shows as 2 different ";
+ mes "numerical values,";
+ mes "what INT affects are shown on the";
+ mes "second value.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "In order to study elements which";
+ mes "consist of this world";
+ mes "You must be intelligent enough and";
+ mes "must improve the knowledge.";
+ mes "So scholars like me or wizards,";
+ mes "place their priority into INT.";
+ break;
+ case 3: mes "[Jarre Riotte]";
+ mes "Our last subject is Dexterity (DEX)";
+ mes "and Luck (LUK).";
+ mes "Ironically those 2 stats are";
+ mes "totally opposed to each other by";
+ mes "their means, you know.";
+ mes "Dexterity is result in your effort";
+ mes "to be accurate and Luck is result";
+ mes "in your pure luck.";
+ mes "Hahaha....";
+ mes "Oh, don't worry me, I am just ";
+ mes "talking to myself.";
+ mes "Now, shall we start?";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Dexterity mainly affects your";
+ mes "accuracy,";
+ mes "attack speed (ASPD) and your average";
+ mes "attack strength.";
+ mes "Let me explain...";
+ mes "If you have low DEX, the difference";
+ mes "between the minimum damage and the";
+ mes "maximum damage becomes huge,";
+ mes "also the average damage is not stable.";
+ mes "That's why DEX is important.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Especially in the case of using";
+ mes "^4D4DFFbows^000000 as your main weapon,";
+ mes "attack strength is based on ^4D4DFFDEX^000000.";
+ mes "If you wish to become an archer,";
+ mes "please focus on DEX.";
+ mes "Also the accuracy is affected by";
+ mes "character level + Dex";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Let's say you're at level 40";
+ mes "possessing 20 DEX,";
+ mes "your accuracy equals 40 + 20, so";
+ mes "60.";
+ mes "Also DEX reduces the casting time";
+ mes "of spells.";
+ mes "Now, let me explain about LUK.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "LUK (Luck) affects the chance for a";
+ mes "critical attack,";
+ mes "the Flee Rate and a small amount of";
+ mes "damage you deal to monsters.";
+ mes "For critical attack,";
+ mes "the start value is 1 for everyone";
+ mes "and it's increased by ^4D4DFF1^000000";
+ mes "for every ^4D4DFF3 LUK.^000000";
+ next;
+ mes "[Jarre Riotte]";
+ mes "With more LUK, comes more chances";
+ mes "to do critical attacks to your";
+ mes "enemies.";
+ mes "A critical attack means an attack ";
+ mes "that pierces the defense of an";
+ mes "enemy.";
+ mes "A critical attack has a";
+ mes "distinguished damage effect as";
+ mes "well.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "For every 10 LUK you get 1 point to";
+ mes "your perfect dodge, which is a kind";
+ mes "of Flee Rate.";
+ mes "When you perform a perfect dodge a";
+ mes "^FF7F00Lucky^000000 effect shows up on your head";
+ mes "and you will perfectly avoid an";
+ mes "attack from an enemy.";
+ next;
+ mes "[Jarre Riotte]";
+ mes "Well, I must, luck is a good";
+ mes "thing to have,";
+ mes "but that doesn't mean you need it";
+ mes "before everything else.";
+ mes "Do you have any other questions?";
+ break;
+ case 4: mes "[Jarre Riotte]";
+ mes "I hope my class was helpful to you.";
+ mes "I really hope so.";
+ close;
+ }
+ goto L_loop;
+}
+
+new_zone02.gat,184,172,4 script Skill Assistant 47,{
+ mes "[Pitch Judas]";
+ mes "Welcome. I have been waiting for";
+ mes "you for a long time!!";
+ mes "Oh look at this cute little ";
+ mes "novice!";
+ mes "I, Pitch, feel so responsible for";
+ mes "your performance,";
+ mes "I will be teaching you with my";
+ mes "best effort.";
+ emotion e_kis;
+L_loop:
+ next;
+ switch( select("Passive and Active Skills.","Passive, Basic Skills.","Use of Emoticons","Cancel") ) {
+ case 1: mes "[Pitch Judas]";
+ mes "You have chosen the passive and";
+ mes "active skills.";
+ mes "I am explaining the passive skills";
+ mes "first, please pay attention.";
+ mes "First, could you open your skill";
+ mes "windows by pressing 'Alt+S'.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Can you see an available skill in";
+ mes "Skill Tree window?";
+ mes "After you increase Basic Skill,";
+ mes "There will be 'Passive' on the";
+ mes "right";
+ mes "Now, to see Basic Skill's";
+ mes "description";
+ mes "Please, do right-click the icon.";
+ next;
+ mes "[Pitch Judas]";
+ mes "'Enable to apply to Basic Interface";
+ mes "Skills'";
+ mes "Do you see this sentence?";
+ mes "Every skill are really needed when";
+ mes "you play this game.";
+ mes "You must not spend your SP with";
+ mes "these skills.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Briefly, passive skill means a";
+ mes "skill that does not consume SP to";
+ mes "be activated";
+ mes "Most of the time, those are the";
+ mes "most basic skills for a job class.";
+ next;
+ mes "[Pitch Judas]";
+ mes "On the contrary,";
+ mes "um! active skills means a skill that";
+ mes "requires SP to be activated.";
+ mes "Also you must use an active skill";
+ mes "manually by clicking its icon or";
+ mes "by registering it as short key";
+ mes "in order to activate it.";
+ mes "As you use an active skill, a";
+ mes "certain amount of SP will be spent";
+ mes "as much as the skill requires.";
+ mes "The Bash skill for Swordsman, Heal";
+ mes "for Acolytes, are active skills for";
+ mes "instance.";
+ next;
+ mes "[Pitch Judas]";
+ mes "If you did pay attention in your";
+ mes "Classes";
+ mes "you are supposed to have a skill,";
+ mes "which is 'First Aid'";
+ mes "Double-Click it to use it.";
+ mes "The skill will start with spending";
+ mes "SP";
+ next;
+ mes "[Pitch Judas]";
+ mes "For your understanding, I would";
+ mes "say,";
+ mes "most skills which are focused on";
+ mes "mental or physical training of the";
+ mes "job classes";
+ mes "are described as passive skills.";
+ mes "And skills which need its user to";
+ mes "activate them manually";
+ mes "by their needs are described as";
+ mes "active skills.";
+ mes "Do you understand?";
+ next;
+ mes "[Pitch Judas]";
+ mes "If you are still not sure about my";
+ mes "lesson";
+ mes "I am willing to go over it once";
+ mes "again.";
+ break;
+ case 2: mes "[Pitch Judas]";
+ mes "The pure passive skills!";
+ mes "The starting skills of Ragnarok! 8";
+ mes "things you must be aware of to";
+ mes "play!";
+ mes "Our first subject is basic skills";
+ next;
+ mes "[Pitch Judas]";
+ mes "When you right click with your";
+ mes "mouse on your skill windows,";
+ mes "you can check the descriptions of";
+ mes "the skills.";
+ mes "However, for your better";
+ mes "understanding, I prepared this";
+ mes "lesson.";
+L_loop1:
+ next;
+ switch( select("Trade and Exchange","Organising & Joining party","Opening Chat room","Storage Use","No thanks, I know already.") ) {
+ case 1: mes "[Pitch Judas]";
+ mes "When you go visit our official";
+ mes "website at ^4d4dffhttp://ragnarok.co.kr^000000,";
+ mes "you can find a full explanation";
+ mes "about trade and exchange with";
+ mes "pictures.";
+ mes "In order to trade items or Zeny";
+ mes "with other people, you must learn";
+ mes "at least level 1 basic skill.";
+ next;
+ mes "[Pitch Judas]";
+ mes "For a trade,";
+ mes "the distance between you and the";
+ mes "other person is very important!";
+ mes "You must be very close to trade";
+ mes "with another and then right click";
+ mes "on the person, once.";
+ mes "That's very important, once.";
+ next;
+ mes "[Pitch Judas]";
+ mes "When you choose the ^800fffRequest a deal^000000";
+ mes "^800fffwith^000000 command, doing Right-Click.";
+ mes "it will show a trade request";
+ mes "windows with the person.";
+ mes "The actual trade windows will open";
+ mes "between you and the person at the";
+ mes "same time";
+ mes "after the person accepts your";
+ mes "offer.";
+ mes "If you are more than 2 cells away";
+ mes "from the person,";
+ mes "you cannot ask a trade. So, please";
+ mes "remember that.";
+ next;
+ mes "[Pitch Judas]";
+ mes "For item trade, you should click an";
+ mes "item and drag it to the left side";
+ mes "of the window.";
+ mes "For Zeny trade, you can enter the";
+ mes "amount of Zeny you want to trade.";
+ mes "After placing items or Zeny into";
+ mes "the trade windows";
+ mes "you should press the 'OK' button on";
+ mes "the bottom of the windows.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Of course, you must confirm the";
+ mes "trade of any items by clicking the";
+ mes "'OK' button";
+ mes "before you can complete the trade.";
+ next;
+ mes "[Pitch Judas]";
+ mes "After you confirm that the items";
+ mes "are the ones you want to trade,";
+ mes "press the 'Trade' button to finish";
+ mes "the trade.";
+ mes "If either of the traders do not";
+ mes "press the 'OK' button the trade";
+ mes "cannot be completed.";
+ mes "If either of the traders presses";
+ mes "the 'Cancel' button to the right of";
+ mes "the window,";
+ mes "the trade will be canceled.";
+ break;
+ case 2: mes "[Pitch Judas]";
+ mes "Now, let me explain to you about";
+ mes "the party system.";
+ mes "Party system allows you to organise";
+ mes "a small group with people";
+ mes "in order to assist you in hunting";
+ mes "aggressive monsters together";
+ mes "or to have fun together.";
+ next;
+ mes "[Pitch Judas]";
+ mes "You can organise a party by";
+ mes "pressing the friend button";
+ mes "on the basic information windows or";
+ mes "by typing a command:";
+ mes "on your chat windows.";
+ mes "Of course, you must be ^4d4dffat least^000000";
+ mes "^4d4dffbasic level 7 or above^000000 for using";
+ mes "this party system.";
+ next;
+ mes "[Pitch Judas]";
+ mes "I could explain more about the";
+ mes "distribution of items or";
+ mes "the distribution of experience";
+ mes "which party members have gained";
+ mes "together,";
+ mes "but I wish you could try on your";
+ mes "own later.";
+ mes "I really want to be in a party with";
+ mes "you and help you to level up...";
+ next;
+ mes "[Pitch Judas]";
+ mes "It will be unfair to other";
+ mes "novices,";
+ mes "you know... Joining a party is";
+ mes "possible by accepting an offer from";
+ mes "a party master.";
+ mes "There is no level requirement for";
+ mes "joining a party.";
+ next;
+ mes "[Pitch Judas]";
+ mes "That's all for the party system.";
+ mes "..........by the way, could you";
+ mes "tell me how to look so cute like";
+ mes "you?";
+ mes "I wish I could look cute as you";
+ mes "do.......";
+ mes "Anyhow, I really thank to God.";
+ mes "Let's shout";
+ mes "'Praise the Creator!'";
+ emotion e_kis;
+ break;
+ case 3: mes "[Pitch Judas]";
+ mes "You can ^4d4dffopen a chat room^000000";
+ mes "with ^4d4dffbasic skill level 4 or above.^000000";
+ mes "You can use the chat button on the";
+ mes "basic information windows";
+ mes "or by pressing 'Alt+C'";
+ next;
+ mes "[Pitch Judas]";
+ mes "Once you open a chat room,";
+ mes "you could check chat room member's";
+ mes "information by right clicking on a";
+ mes "character name.";
+ mes "Also you can register the character";
+ mes "as your friend through the same";
+ mes "way.";
+ mes "If you are the master of the room,";
+ mes "you can change the room setup.";
+ next;
+ mes "[Pitch Judas]";
+ mes "While in the chatting room, you";
+ mes "cannot hear any chat outside of the";
+ mes "chat room.";
+ mes "Please remember that.";
+ mes "...if you have some time,";
+ mes "I can spare some of my time for you";
+ mes "to open our own chat room on a boat";
+ mes "in Al De Baran";
+ mes "..... but I am an NPC.";
+ next;
+ mes "[Pitch Judas]";
+ mes "... ... ....I see.... ...";
+ mes "... ... .... Hmm";
+ mes "I know I hang out with you because";
+ mes "I am an NPC.";
+ mes "But it's ok. Don't worry about";
+ mes "me.";
+ mes "I am happy enough for now.";
+ break;
+ case 4: mes "[Pitch Judas]";
+ mes "All throughout the Rune-Midgard's";
+ mes "kingdom territory there is a huge";
+ mes "trading center named Kafra,";
+ mes "which provides many convenience";
+ mes "services to adventurers";
+ mes "such as personal storage service.";
+ mes "An NPC at the right side of this";
+ mes "hall,";
+ mes "is one of the Kafra employees.";
+ next;
+ mes "[Pitch Judas]";
+ mes "You are allowed to use your";
+ mes "^4d4dffpersonal Kafra storage^000000";
+ mes "at ^4d4dffbasic skill 6 or above.^000000";
+ mes "If you haven't listened to the";
+ mes "Kafra Employee for the services";
+ mes "they're providing to adventurers,";
+ mes "please do.";
+ next;
+ mes "[Pitch Judas]";
+ mes "When you carry too much items at";
+ mes "once,";
+ mes "you cannot attack or recover";
+ mes "yourself.";
+ mes "so I recommend you to have some";
+ mes "available space";
+ mes "and you use Storage, which is Kafra";
+ mes "Service.";
+ break;
+ case 5: mes "[Pitch Judas]";
+ mes "Oh, do you? you're as smart as much";
+ mes "as you are cute!";
+ mes "I, Pitch am very impressed with";
+ mes "you.";
+ mes "Our official website has many";
+ mes "resources, doesn't it?";
+ next;
+ mes "[Pitch Judas]";
+ mes "Do you wish to learn about a different subject?";
+ }
+ if ( @menu != 5 ) goto L_loop1;
+ break;
+ case 3: mes "[Pitch Judas]";
+ mes "^4d4dffEmoticons^000000 are commonly used online";
+ mes "for ^4d4dffdisplaying your feelings^000000 and";
+ mes "better communication between ";
+ mes "people.";
+ mes "However, in Ragnarok,";
+ mes "there is a requirement for using";
+ mes "emoticons.";
+ mes "You must be at least ^4d4dffbasic skill^000000";
+ mes "^4d4dfflevel 2 or above^000000 in order to use ";
+ mes "emoticons";
+ next;
+ mes "[Pitch Judas]";
+ mes "You can check emoticons you have";
+ mes "registered as shortcut keys and";
+ mes "the list of available emoticons by";
+ mes "pressing 'Alt+L' and 'Alt+M'.";
+ mes "Oh yes,";
+ mes "this is also fully explained on our";
+ mes "official website as well.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Ah! I must say,";
+ mes "the honest expression of one's";
+ mes "feelings is essential for a";
+ mes "relationship.";
+ mes "Yes, I agree with your point of";
+ mes "view that too much touchy-feely";
+ mes "could be a problem!";
+ mes "However, sice the chatting is the";
+ mes "only way of expressing oneself to";
+ mes "others online,";
+ mes "emoticons are much more helpful to";
+ mes "display your emotions.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Oh well, so what I was saying is,";
+ mes "you can directly use emoticons by";
+ mes "registering them on your shortcut";
+ mes "keys with the 'Alt+M'";
+ mes "or you can type a command for an";
+ mes "emoticon on your chat windows such";
+ mes "as ^4d4dff/heh^000000";
+ mes "You can play rock, scissors and";
+ mes "paper";
+ mes "by pressing ^4d4dffCTRL^000000 and ^4d4dff-^000000, ^4d4dff=^000000 and ^4d4dff\^000000";
+ mes "key.";
+ next;
+ mes "[Pitch Judas]";
+ mes "Of course you can type ^4d4dff/gawi^000000,";
+ mes "^4d4dffbawi^00000 and ^4d4dff/bo^000000";
+ mes "which mean rock, scissors and paper";
+ mes "in Korean on your chat windows.";
+ mes "There are many new emoticons which";
+ mes "have been newly added,";
+ mes "please check all new emoticon";
+ mes "commands by typing ^4d4dff/emotion^000000 on your";
+ mes "chat windows.";
+ mes "............HuHu";
+ emotion e_lv;
+ break;
+ case 4: mes "[Pitch Judas]";
+ mes "Don't you need anything else?";
+ mes "I hope you are healthy.";
+ close;
+ }
+ goto L_loop;
+}
+
+//Potato Merchant
+new_zone02.gat,28,185,4 shop Potato Merchant 90,516:15
+
+new_zone02.gat,38,182,4 script Helper 92,{
+ if (!(NEW_MES_FLAG5)) {
+ if (!(NEW_MES_FLAG4)) {
+ mes "[Kane]";
+ mes "Do you want to battle without";
+ mes "knowing the basic knowledge?";
+ mes "Go meet the helper right next to";
+ mes "me, and listen to him first.";
+ close;
+ } else {
+ mes "[Kane]";
+ mes "The 2nd course is for Monster hunting,";
+ mes "you can use what you've learned in";
+ mes "the Practical Course.";
+ next;
+ mes "[Kane]";
+ mes "I hope you fight well with monsters,";
+ mes "based on what you know.";
+ next;
+ mes "[Kane]";
+ mes "You don't need to feel the burden, I";
+ mes "just want you to enjoy the experience";
+ mes "of being engaged in battle.";
+ next;
+ mes "[Kane]";
+ mes "If you want to get out of the 2nd";
+ mes "course, talk to the helper who is in";
+ mes "the North section of the field.";
+ mes "Now then, do you want to try?";
+ next;
+ if ( select("Yes","I want to learn more.") == 1 ) {
+ mes "[Kane]";
+ mes "Just feel free to fight.";
+ mes "These will help you if you have";
+ mes "an emergency.";
+ mes "I will give you a weapon and";
+ mes "guard.";
+ set NEW_MES_FLAG5,1;
+ getitem 602,1;
+ getitem 601,9;
+ getitem 1243,1;
+ getitem 2112,1;
+ getitem 611,2;
+ getitem 569,300;
+ close2;
+ savepoint "new_zone02.gat",24,188;
+ warp "new_zone03.gat",96,21;
+ end;
+ } else {
+ mes "[Kane]";
+ mes "Then, you can talk to our";
+ mes "instructor to the left and learn";
+ mes "more. When you are ready, please";
+ mes "come back again.";
+ close;
+ }
+ }
+ }
+ mes "[Kane]";
+ mes "I told you that you have to be";
+ mes "careful.";
+ mes "But as you know 'A failure can";
+ mes "become a stepping stone to";
+ mes "success'";
+ next;
+ mes "[Kane]";
+ mes "Do you want to try again?";
+ next;
+ if ( select("Yes","No, I want to prepare more.") == 1 ) {
+ if (!(NEW_LVUP1)) {
+ mes "[Kane]";
+ mes "Then, I will give you some additional help.";
+ mes "Please be careful.";
+ set NEW_LVUP1,1;
+ set BaseExp,BaseExp+155;
+ getitem 569,50;
+ } else {
+ mes "[Kane]";
+ mes "Then, I will give you some additional help.";
+ mes "Please be careful.";
+ percentheal 100,100;
+ }
+ close2;
+ warp "new_zone03.gat",96,21;
+ end;
+ } else {
+ mes "[Kane]";
+ mes "Then, why don't you talk to the";
+ mes "helper who is next to me?";
+ mes "When you are ready, please come";
+ mes "back again.";
+ close;
+ }
+}
+
+new_zone02.gat,17,182,6 script Helper#2 84,{
+ if (!(NEW_MES_FLAG4)) {
+ mes "[Elmeen]";
+ mes "Congratulations!";
+ mes "You have passed the 1st training";
+ mes "course! Wow~ I guess now you";
+ mes "understand a little bit more about";
+ mes "Ragnarok Online.";
+ next;
+ mes "[Elmeen]";
+ mes "You will learn the fundamentals of";
+ mes "actual battle through this class.";
+ mes "If you did your best throught the";
+ mes "Informative class, you are supposed";
+ mes "to have been given some starting";
+ mes "equipment.";
+ next;
+ mes "[Elmeen]";
+ mes "Please check your";
+ mes "equipment before you engage in";
+ mes "battle. Are you sure you've";
+ mes "equipped all of your equipment,";
+ mes "your weapons and armor?";
+ next;
+ if ( select("Yes","No") == 1 ) {
+ callsub L_battle;
+ next;
+ mes "[Elmeen]";
+ mes "Do you understand these battle commands?";
+ mes "Now, I will teach you about monster";
+ mes "behaviors and properties, experience";
+ mes "gained through battle, and items you";
+ mes "can earn from dead monsters.";
+ next;
+ mes "[Elmeen]";
+ mes "Field Combat Training can be";
+ mes "actually pretty dangerous for";
+ mes "new adventurers. Let me give you";
+ mes "a little more strenght through the";
+ mes "power of my magic.";
+ next;
+ mes "[Elmeen]";
+ mes "Haaaaaaa~!";
+ set NEW_MES_FLAG4,1;
+ set BaseExp,BaseExp+155;
+ next;
+ mes "[Elmeen]";
+ mes "Which subject";
+ mes "should I cover";
+ mes "first for you?";
+ L_loop:
+ next;
+ switch( select("Monster","EXP","Items","Cancel") ) {
+ case 1: callsub L_monster;
+ break;
+ case 2: callsub L_exp;
+ break;
+ case 3: callsub L_item;
+ break;
+ case 4: mes "[Elmeen]";
+ mes "Feel free to ask me if you have any questions.";
+ close;
+ }
+ goto L_loop;
+ } else {
+ callsub L_equip;
+ close;
+ }
+ }
+ mes "[Elmeen]";
+ mes "Oh, do you want to listen again?";
+ mes "Which one do you want to know?";
+L_loop1:
+ next;
+ switch( select("Monster","EXP","Items","Basic info on Monster Hunting","Cancel") ) {
+ case 1: callsub L_monster;
+ break;
+ case 2: callsub L_exp;
+ break;
+ case 3: callsub L_item;
+ break;
+ case 4: callsub L_battle;
+ break;
+ case 5: callsub L_equip;
+ close;
+ }
+ goto L_loop1;
+ end;
+L_battle:
+ mes "[Elmeen]";
+ mes "First, you place the cursor on a";
+ mes "monster. When you left click, you";
+ mes "will hit the monster once.";
+ next;
+ mes "[Elmeen]";
+ mes "If you are too lazy to keep left";
+ mes "clicking, left click on the monster";
+ mes "while holding the ^4D4DFF'CTRL'^000000 key. You";
+ mes "will then continue attacking the";
+ mes "monster until one of you is dead,";
+ mes "or you run away.";
+ next;
+ mes "[Elmeen]";
+ mes "You can also just hold down the";
+ mes "left mouse button while the cursor";
+ mes "is on the monster. Still, there are";
+ mes "some people who are even too lazy";
+ mes "to use the ^4D4DFF'Ctrl'^000000 key every time";
+ mes "they attack a monster.";
+ next;
+ mes "[Elmeen]";
+ mes "If you're one of them, type the";
+ mes "comman ^E79E29/nc^000000 in your Chat Window.";
+ mes "Then, when you left click";
+ mes "a monster, you'll just continuously";
+ mes "attack it!";
+ next;
+ mes "[Elmeen]";
+ mes "If a monster happens to have the";
+ mes "Undead property, you can use the";
+ mes "'Heal' skill to attack if you";
+ mes "happen to have it.";
+ next;
+ mes "[Elmeen]";
+ mes "When you use the Heal skill while";
+ mes "holding down the ^4D4DFF'Shift'^000000 key, you";
+ mes "can target the monster with the";
+ mes "Heal skill to damage it.";
+ next;
+ mes "[Elmeen]";
+ mes "Of course for this skill, we do";
+ mes "have a very convenient option for";
+ mes "lazy people too.";
+ mes "Type the command ^E79E29/ns^000000 in your Chat";
+ mes "Window.";
+ next;
+ mes "[Elmeen]";
+ mes "This will allow you to attack";
+ mes "monsters by using the heal skill";
+ mes "without holding the shift key.";
+ mes "Handy, huh?";
+ return;
+L_monster:
+ mes "[Elmeen]";
+ mes "There are many aggressive monsters.";
+ mes "They will attack you, before you're";
+ mes "even close to them.";
+ mes "Also there are few monsters";
+ mes "that are very cooperative with their";
+ mes "tribe. If you attack one of them,";
+ mes "others will come after you for";
+ mes "revenge.";
+ next;
+ mes "[Elmeen]";
+ mes "Every monster are specified with";
+ mes "their types, sizes and properties.";
+ mes "For instance, monster types are ";
+ mes "include: demi-human, brute, immortal";
+ mes "or devil";
+ mes "Once you acknowledge which type a";
+ mes "monster is, you will be able to ";
+ mes "lead an easy battle.";
+ next;
+ mes "[Elmeen]";
+ mes "Also, if you can have some cards";
+ mes "for your weapons which increases";
+ mes "the damage upon certain monster";
+ mes "types,";
+ mes "or cards for your armours which";
+ mes "reduces the damage taken, it will";
+ mes "be much easier for you to battle";
+ mes "against monsters.";
+ next;
+ mes "[Elmeen]";
+ mes "Monsters are seperated by their";
+ mes "sizes such as small, medium and";
+ mes "large.";
+ mes "There are a few cards that allows";
+ mes "you";
+ mes "to do more damage followed by the";
+ mes "monster size.";
+ next;
+ mes "[Elmeen]";
+ mes "Also every weapon have their";
+ mes "strengths and weaknesses. Size of the";
+ mes "weapon affects on the damage of the ";
+ mes "weapon dealth with monsters.";
+ mes "For instance, dagger class weapons";
+ mes "do 100% damage on the small sized";
+ mes "mosnters but they only do 50% on";
+ mes "the large monsters.";
+ next;
+ mes "[Elmeen]";
+ mes "For the monster property, there are";
+ mes "water, wind, earth, fire, shadow";
+ mes "ghost and holy.";
+ mes "If you attack a monster with the";
+ mes "opposite property of it, you can do";
+ mes "more damages than the damage you";
+ mes "normally do.";
+ next;
+ mes "[Elmeen]";
+ mes "Also, if you attack a monster with";
+ mes "the same property of the monster,";
+ mes "the damage will be significantly";
+ mes "reduced or you will do no damage at";
+ mes "all, also there is a possibility ";
+ mes "that you will heal the monster.";
+ mes "For instance, in case of a ghost";
+ mes "property monster, normal weapons";
+ mes "cannot do any damage on the";
+ mes "monster, but weapons with property";
+ mes "can.";
+ return;
+L_exp:
+ mes "[Elmeen]";
+ mes "Basically, a character who deals";
+ mes "the most damage on a monster";
+ mes "receives the most experience points";
+ mes "from the monster.";
+ mes "Therefore you receive a certain %";
+ mes "of experience points in proportion";
+ mes "to the damage you've done on the HP";
+ mes "amount of a monster.";
+ next;
+ mes "[Elmeen]";
+ mes "Let's say, there is a character";
+ mes "name 'Z'. Z does 65 damage on a ";
+ mes "monster that possess 100 HP and";
+ mes "gives 1000 experience points when";
+ mes "it's dead. Then, the expereicen";
+ mes "points Z receives from the monster";
+ mes "will be '650'.";
+ mes "This is how you gain the experience";
+ mes "points.";
+ next;
+ mes "[Elmeen]";
+ mes "However, this rule applies";
+ mes "differently following certain";
+ mes "situations.";
+ mes "If there are two people who did the ";
+ mes "same 65 damage on one monster, the";
+ mes "experience points that each one of";
+ mes "them receives from the monster";
+ mes "beco mes different, affected by";
+ mes "remaining HP amount of the";
+ mes "monster.";
+ mes "For instance, somebody ";
+ mes "does damage on a monster while";
+ mes "you're hitting it and he did the";
+ mes "same amount of damage you did.";
+ mes "Then, you will receive 2/3 of the";
+ mes "whole experience points that";
+ mes "monster can give you, the other one";
+ mes "will receive 1/3.";
+ next;
+ mes "[Elmeen]";
+ mes "However, attacking a monster that";
+ mes "somebody already started to hit is";
+ mes "not suggested in Ragnarok Online.";
+ mes "That action is regarded as an ";
+ mes "ill-mannered behaviour. For party";
+ mes "play, the master can set up";
+ mes "the experience distribution to the";
+ mes "equally share option.";
+ mes "With this method, party members can ";
+ mes "share their experience followed by ";
+ mes "their character level and numbers";
+ mes "of the party.";
+ next;
+ mes "[Elmeen]";
+ mes "Also there is an experience";
+ mes "benefit for party play which allows";
+ mes "you to gain more experience points";
+ mes "than playing solo,";
+ mes "you can take advantage of the";
+ mes "system for faster leveling.";
+ return;
+L_item:
+ mes "[Elmeen]";
+ mes "When you kill monsters, you can";
+ mes "obtain items by chance. Besides,";
+ mes "certain characters can use the";
+ mes "'Steal' skill in order to steal";
+ mes "items from monsters.";
+ next;
+ mes "[Elmeen]";
+ mes "Don't you worry about the steal";
+ mes "skill causing you to not find any";
+ mes "items after you kill them. The";
+ mes "steal skill works on the item drop";
+ mes "rate independently from the normal";
+ mes "rate.";
+ mes "In case you kill a mosnter with ";
+ mes "other people, a person who did the";
+ mes "most damage has a prior rights to";
+ mes "obtain items.";
+ return;
+L_equip:
+ mes "[Elmeen]";
+ mes "Please take care of the equipment";
+ mes "you've received through the";
+ mes "training courses. Once you lose the";
+ mes "equipment, you can never get them";
+ mes "back.";
+ return;
+}
+
+//Training Center Employee
+new_zone03.gat,95,30,4 script Training Center Employee#1 84,{
+ mes "[Hoffman]";
+ mes "Hey there~";
+ mes "I'm here to provide";
+ mes "you with a little instruction";
+ next;
+ mes "[Hoffman]";
+ mes "These monsters are all weak";
+ mes "and easy to kill. But be careful,";
+ mes "a lot of them are aggressive";
+ mes "and out for blood!";
+ next;
+ mes "[Hoffman]";
+ mes "But don't worry so much,";
+ mes "They're not impossible for";
+ mes "Novices. So would you";
+ mes "like to try?";
+ close;
+}
+
+new_zone03.gat,96,174,4 script Keyman#1 85,{
+ mes "[Keyman]";
+ mes "Hmmm!";
+ mes "You have practised a lot, would you like to go on with further training?";
+ next;
+ if(select("Yes","No")==1){
+ mes "[Keyman]";
+ mes "Don't forget about everything you've learnt here. Have a nice trip.";
+ close2;
+ warp "new_zone04.gat",99,10;
+ end;
+ }
+ mes "[Keyman]";
+ mes "So you want to stay here longer? Continue training, and train hard!";
+ close;
+}
+
+//Novice Instructor
+new_zone04.gat,91,22,4 script Novice Instructor 57,{
+ mes "[Bruce]";
+ mes "You have come from far away.";
+ mes "Thank you for coming here";
+ if(sex)
+ mes "Mr '"+strcharinfo(0)+"'";
+ else
+ mes "Ms '"+strcharinfo(0)+"'";
+ mes "It's nice to meet you.";
+ mes "My name is Bruce, and I come";
+ mes "from Rune-Midgard.";
+ next;
+ mes "[Bruce]";
+ mes "My work is to help Novices";
+ mes "to choose their jobs.";
+ mes "So, I will briefly explain each";
+ mes "job.";
+ next;
+ mes "[Bruce]";
+ mes "I will explain the following jobs:";
+ mes "^0000FFSwordsman, Mage, Archer, Merchant, Thief and Acolyte.^000000";
+ next;
+ mes "[Bruce]";
+ mes "Which job do you want to hear about?";
+L_loop:
+ next;
+ switch( select("Swordman","Mage","Archer","Merchant","Thief","Acolyte","End Conversation") ) {
+ case 1: mes "[Bruce]";
+ mes "Literally, Swordsman means one who";
+ mes "specialises in wielding swords.";
+ mes "Swordsman can also choose to use";
+ mes "spears, but I must say, it is a rare";
+ mes "occurance.";
+ next;
+ mes "[Bruce]";
+ mes "Swordsman posses strong physical";
+ mes "strength.";
+ mes "This is so they can equip heavy armours";
+ mes "and weapons.";
+ mes "Most weapon classes, except for";
+ mes "bows and rods, are equipable by the";
+ mes "Swordsman class.";
+ next;
+ mes "[Bruce]";
+ mes "The only weakness of the Swordman";
+ mes "class is that they cannot use";
+ mes "magic spells.";
+ mes "However, it is compensated for";
+ mes "by using elemental weapons.";
+ next;
+ mes "[Bruce]";
+ mes "The benefits of being a Swordsman";
+ mes "is the enormous amount of HP.";
+ mes "You can bear the damage from your";
+ mes "enemy with ease.";
+ next;
+ mes "[Bruce]";
+ mes "Furthermore, once you learn your";
+ mes "strong attack skills, there is no";
+ mes "one that can beat the Swordsman";
+ mes "class in a melee fight.";
+ next;
+ mes "[Bruce]";
+ mes "In Ragnarok Online,";
+ mes "Swordsman takes the position of";
+ mes "tanker, to protect weaker classes";
+ mes "from being attacked or hurt.";
+ mes "Swordsman is the ideal character for";
+ mes "the party leader position";
+ next;
+ mes "[Bruce]";
+ mes "Swordsman can advance into the";
+ mes "^FF0000Knight, or Crusader^000000 classes";
+ mes "for their 2nd class profession.";
+ break;
+ case 2: mes "[Bruce]";
+ mes "The mage class specialises in";
+ mes "manipulating: fire, water, earth";
+ mes "and lightening, to damage their";
+ mes "enemies.";
+ next;
+ mes "[Bruce]";
+ mes "However, due to their physical";
+ mes "weakness, they are only allowed";
+ mes "to equip rods and knives as";
+ mes "weapons, and light armours for";
+ mes "defense";
+ next;
+ mes "[Bruce]";
+ mes "Despite their physical weakness,";
+ mes "they are able to do massive damage";
+ mes "with their powerful spells.";
+ mes "This fact alone attracts many";
+ mes "people to this class";
+ next;
+ mes "[Bruce]";
+ mes "In Ragnarok Online,";
+ mes "the Mage is considered as the";
+ mes "damage dealer of the party";
+ next;
+ mes "[Bruce]";
+ mes "Mage can advance into a";
+ mes "^FF0000Wizard^000000 or ^FF0000Sage^000000";
+ mes "as their 2nd class profession.";
+ break;
+ case 3: mes "[Bruce]";
+ mes "Archer class specialises in";
+ mes "using bows. In a party, archers are";
+ mes "in charge of long range attacks.";
+ mes "This allows them to attack,";
+ mes "and kill monsters from a safe distance";
+ next;
+ mes "[Bruce]";
+ mes "Archers are physically weak,";
+ mes "however, they possess a high";
+ mes "level of accuracy with powerful";
+ mes "long range bows.";
+ next;
+ mes "[Bruce]";
+ mes "Every Archer may advance into";
+ mes "the ^FF0000Hunter^000000 class.";
+ mes "Alternatively, male archers may";
+ mes "advance into the ^FF0000Bard^000000,";
+ mes "and female Archers may become a";
+ mes "^FF0000Dancer^000000, as their 2nd class profession";
+ break;
+ case 4: mes "[Bruce]";
+ mes "The Merchant class specialises in";
+ mes "commerce. Due to their strong and";
+ mes "influential guild, Merchants can";
+ mes "buy and sell to NPCs for a better";
+ mes "price than other classes.";
+ next;
+ mes "[Bruce]";
+ mes "In Ragnarok Online, the Merchant";
+ mes "class possess various economically";
+ mes "beneficial skills.";
+ mes "They may buy items at a discount";
+ mes "from NPCs, and sell items to NPCs";
+ mes "at a higher price than normal.";
+ next;
+ mes "[Bruce]";
+ mes "In addition Merchants may rent a";
+ mes "cart that greatly expands their";
+ mes "carrying capacity, and allows";
+ mes "them to open shops with their";
+ mes "own items and prices.";
+ next;
+ mes "[Bruce]";
+ mes "Merchant can advance into a";
+ mes "^FF0000Blacksmith^000000 or ^FF0000Alchemist^000000";
+ mes "as their 2nd class profession.";
+ break;
+ case 5: mes "[Bruce]";
+ mes "The Thief class are experts at using";
+ mes "dagger class weapons as their main";
+ mes "weapon. They attack fast, and they";
+ mes "can dodge attacks from enemies with ease.";
+ next;
+ mes "[Bruce]";
+ mes "The Thief is also an expert at";
+ mes "hiding and stealing from their";
+ mes "enemies. Furthermore, their use";
+ mes "of poison to weaken their foes";
+ mes "is a feared trait of this class.";
+ next;
+ mes "[Bruce]";
+ mes "When you are in a dangerous";
+ mes "situation, or you want to hide";
+ mes "your body, you can use a skill";
+ mes "to dig into the ground.";
+ next;
+ mes "[Bruce]";
+ mes "Thief can advance into either";
+ mes "^FF0000Assassin^000000, or ^FF0000Rogue^000000";
+ mes "as the 2nd class profession.";
+ break;
+ case 6: mes "[Bruce]";
+ mes "The Acolyte is God's messenger to";
+ mes "Rune-Midgard. Acolytes have";
+ mes "skills that makes all classes";
+ mes "more potent in battle, as well as";
+ mes "the life saving heal ability.";
+ next;
+ mes "[Bruce]";
+ mes "The Acolyte's support abilities";
+ mes "make them a welcome addition to";
+ mes "any party. The acolyte is what";
+ mes "makes parties survive in";
+ mes "difficult situations, allowing";
+ mes "other classes to focus";
+ mes "themselves on defeating the enemy.";
+ next;
+ mes "[Bruce]";
+ mes "'Acolyte' is one of the jobs, who";
+ mes "are really needed when users want";
+ mes "to play in a party.";
+ next;
+ mes "[Bruce]";
+ mes "Acolyte may become a ^FF0000Priest^000000, or";
+ mes "^FF0000Monk^000000 as their 2nd class profession.";
+ break;
+ case 7: mes "[Bruce]";
+ mes "For more information, please visit";
+ mes "our official website at";
+ mes "'http://ragnarok.co.kr'";
+ mes "Hanson is waitinging for you now,";
+ mes "good luck out there.";
+ close;
+ }
+ set NEW_MES_FLAG6,1;
+ goto L_loop;
+}
+
+new_zone04.gat,100,29,4 script Final Instructor 46,{
+ if (!(NEW_MES_FLAG6)) {
+ mes "[Hanson]";
+ mes "Nice to meet you.";
+ mes "My name is 'Hanson'";
+ mes "I am in charge of the third course,";
+ mes "which is the 'Personality Test'.";
+ mes "Your name is ^A62A2A'"+strcharinfo(0)+"'^000000.";
+ next;
+ mes "[Hanson]";
+ mes "Before you take this test,";
+ mes "go to meet 'Bruce' right next to";
+ mes "me and listen about Jobs.";
+ mes "then, come back to me.";
+ close;
+ }
+ if (NEW_GETITEM) {
+ mes "[Hanson]";
+ mes "I understand.";
+ mes "I will now move you directly into the world of Ragnarok Online.";
+ next;
+ mes "[Hanson]";
+ mes "For more information ";
+ mes "please visit the official";
+ mes "Ragnarok Online website.";
+ next;
+ mes "[Hanson]";
+ mes "Finally, "+strcharinfo(0)+"";
+ mes "I hope that you can become a good player.";
+ mes "Good luck, and have a safe journey.";
+ next;
+ goto L_cancel;
+ }
+ mes "[Hanson]";
+ mes "You have made an effort to come";
+ mes "here. You have just finished";
+ mes "learning about job classes.";
+ mes "This will be your 3rd test, the";
+ mes "personality test, but it's not";
+ mes "a mandatory course.";
+ next;
+ mes "[Hanson]";
+ mes "That is, if you do not wish to take";
+ mes "this course, you can decide to pass";
+ mes "without taking it. However, if you";
+ mes "take this course, there will be";
+ mes "some benefits.";
+ next;
+ mes "[Hanson]";
+ mes "Firstly, you will receive many";
+ mes "health items during the course.";
+ mes "They will be very helpful when";
+ mes "you join the Ragnarok Online";
+ mes "community.";
+ next;
+ mes "[Hanson]";
+ mes "Secondly, after you finish the";
+ mes "course, we suggest a job class";
+ mes "best suited to your personality,";
+ mes "and teleport you to a town where";
+ mes "you can change into the job we";
+ mes "suggested. And there are many";
+ mes "other supplies for you besides";
+ mes "these two benefits.";
+ next;
+ mes "[Hanson]";
+ mes "Now! What would you like to do?";
+ mes "Do you wish to start Ragnarok";
+ mes "Online immediately, or to take";
+ mes "this personality test?";
+ next;
+ if ( select("I'll take the test.","Let me start Ragnarok Online Please.") == 2 ) {
+ mes "[Hanson]";
+ mes "I understand.";
+ mes "I will now move you directly into the world of Ragnarok Online.";
+ next;
+ mes "[Hanson]";
+ mes "For more information ";
+ mes "please visit the official";
+ mes "Ragnarok Online website.";
+ next;
+ mes "[Hanson]";
+ mes "Finally, "+strcharinfo(0)+"";
+ mes "I hope that you can become a good player.";
+ mes "Good luck, and have a safe journey.";
+ next;
+L_cancel:
+ callsub L_cleararg;
+ switch ( rand(6) ) {
+ case 0: savepoint "izlude.gat",94,103;
+ warp "prt_fild08.gat",357,212;
+ break;
+ case 1: savepoint "payon.gat",256,242;
+ warp "pay_fild01.gat",334,354;
+ break;
+ case 2: savepoint "morocc.gat",149,100;
+ warp "moc_fild07.gat",198,39;
+ break;
+ case 3: savepoint "geffen.gat",120,38;
+ warp "gef_fild07.gat",327,188;
+ break;
+ case 4: savepoint "prontera.gat",116,72;
+ warp "prt_fild08.gat",170,371;
+ break;
+ case 5: savepoint "alberta.gat",31,231;
+ warp "pay_fild03.gat",388,70;
+ }
+ end;
+ }
+ mes "[Hanson]";
+ mes "Excellent choice! You're";
+ mes "You're supposed to take every";
+ mes "training course if you really";
+ mes "want to be a well-prepared";
+ mes "player! Honestly, if you";
+ mes "didn't take this course,";
+ mes "I would be disappointed in you.";
+ next;
+ mes "[Hanson]";
+ mes "Alright, let me start the 1st";
+ mes "personality test.";
+ mes "";
+ mes "Please releax and take it easy,";
+ mes "choose the most familiar answer";
+ mes "among the next examples.";
+ next;
+ mes "[Hanson]";
+ mes "Remember, this test is only to";
+ mes "check your personality, there";
+ mes "is no set standard for right";
+ mes "or wrong. Now! Let's start";
+ mes "the test!";
+ next;
+ mes "[Hanson]";
+ mes "Please choose the most familiar";
+ mes "word to you, from these examples.";
+ next;
+ switch ( select("Study","Exercise","Public service","Violence") ) {
+ case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
+ case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 3: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 4: set NOV_3_THIEF,NOV_3_THIEF+1;
+ }
+ switch ( select("Change","Conserve") ) {
+ case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
+ case 2: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
+ }
+ switch ( select("Consumer","Seller","Producer") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ set NOV_3_THIEF,NOV_3_THIEF+1;
+ set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ switch ( select("Celebrity","Prudence") ) {
+ case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
+ }
+ switch ( select("Theory","Experience") ) {
+ case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
+ case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ }
+ switch ( select("The past","The reality","The future") ) {
+ case 1: set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
+ case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
+ set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ mes "[Hanson]";
+ mes "Please answer with 'yes' or 'no' to";
+ mes "the next questions.";
+ next;
+ mes "[Hanson]";
+ mes "To die with honor is better than to live with disgrace.";
+ next;
+ switch ( select("Yes.","No") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
+ case 2: set NOV_3_THIEF,NOV_3_THIEF+1;
+ set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
+ }
+ mes "[Hanson]";
+ mes "You are often upset to see someone";
+ mes "who is better than you";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 2:set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
+ }
+ mes "[Hanson]";
+ mes "You don't mind exploring dangerous";
+ mes "places.";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
+ case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ mes "[Hanson]";
+ mes "You are a leader-type person.";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
+ case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
+ }
+ mes "[Hanson]";
+ mes "While exploring a dungeon, you";
+ mes "encountered a no-way out.";
+ mes "As you examined a wall beside you,";
+ mes "there was a button-looking stone";
+ mes "with a 'do not push' sign.";
+ next;
+ mes "[Hanson]";
+ mes "You see the 'do not push' sign";
+ mes "and have an urge to push the";
+ mes "button. Do you push it?";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ }
+ mes "[Hanson]";
+ mes "You often see things that don't";
+ mes "exist";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ mes "[Hanson]";
+ mes "You feel you can fly";
+ mes "when falling from a cliff.";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ mes "[Hanson]";
+ mes "Money talks. I can buy even human being if I want.";
+ next;
+ switch ( select("Yes","No") ) {
+ case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 2: set NOV_3_ARCHER,NOV_3_ARCHER+1;
+ }
+ mes "[Hanson]";
+ mes "Now, let me give you some different";
+ mes "questions.";
+ mes "Please relax and take it easy,";
+ mes "choose the most familiar answer";
+ mes "from the next examples";
+ next;
+ mes "[Hanson]";
+ mes "As you check your tight";
+ mes "schedule....";
+ next;
+ switch ( select("You feel like a robot.","You are proud and satisfied.","Schedule... what schedule?") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 2: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 3: set NOV_3_ARCHER,NOV_3_ARCHER+1;
+ set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
+ }
+ mes "[Hanson]";
+ mes "During window shopping, you found a";
+ mes "really interesting item in a store";
+ mes "and you're debating whether to buy";
+ mes "it or not.";
+ mes "Before you purchase an item,";
+ mes "first thing you do is...";
+ next;
+ switch ( select("Think about if you need it.","Check the price.","Buy it without thinking twice...!") ) {
+ case 1: set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
+ case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 3: set NOV_3_THIEF,NOV_3_THIEF+1;
+ }
+ mes "[Hanson]";
+ mes "You (____Fill in blank___) to compete";
+ mes "with other people.......";
+ next;
+ switch ( select("Don't mind...","Don't like...","Don't care...") ) {
+ case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 2: set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 3: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
+ set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ }
+ mes "[Hanson]";
+ mes "You're responsible for a task that";
+ mes "requires you to cooperate with many";
+ mes "people.";
+ mes "If you handle it by yourself, it";
+ mes "takes a long time with a lot of";
+ mes "effort.";
+ mes "But if you cooperate with others,";
+ mes "it will be simple and an enjoyable";
+ mes "task. You would...";
+ next;
+ switch ( select("Handle it by myself even if it's hard.","Ask friends to help.") ) {
+ case 1: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
+ case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;
+ }
+ mes "[Hanson]";
+ mes "You happened to find a girl who";
+ mes "fainted on the street.";
+ mes "What would you do?";
+ next;
+ switch ( select("Carry her to a hospital.","Considder my priority before taking an action.","Just ignore it.") ) {
+ case 1: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;
+ set NOV_3_ARCHER,NOV_3_ARCHER+1;break;
+ case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ set NOV_3_THIEF,NOV_3_THIEF+1;
+ set NOV_3_MERCHAN,NOV_3_MERCHAN+1;
+ }
+ mes "[Hanson]";
+ mes "You happened to pick up";
+ mes "some 'clothing'";
+ mes "What would you do?";
+ next;
+ switch ( select("Check the brand.","Wonder who lost it.","Find the owner.","Leave it where it was.") ) {
+ case 1: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 2: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;break;
+ case 3: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 4: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;
+ }
+ mes "[Hanson]";
+ mes "You happened to slip your tongue in";
+ mes "the middle of a conversation.";
+ mes "What would be your reaction?";
+ next;
+ switch ( select("Pretend it's a joke.","Change the subject.","Analyse it.","Apologise honestly.") ) {
+ case 1: set NOV_3_THIEF,NOV_3_THIEF+1;break;
+ case 2: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
+ case 3: set NOV_3_MAGICIAN,NOV_3_MAGICIAN+1;break;
+ case 4: set NOV_3_ACOLYTE,NOV_3_ACOLYTE+1;
+ }
+ mes "[Hanson]";
+ switch (Sex) {
+ case 0: mes "You're on a trip with your beloved";
+ mes "one. She asks you to buy a";
+ mes "souvenir that's not particularly";
+ mes "needed.";
+ mes "What would you do?";
+ break;
+ case 1: mes "You're on a trip with your beloved";
+ mes "one. He asks you to buy a";
+ mes "souvenir that's not particularly";
+ mes "needed.";
+ mes "What would you do?";
+ }
+ next;
+ switch ( select("Buy the item for her/him.","Say 'no'.","Promise to buy it next time.") ) {
+ case 1: set NOV_3_SWORDMAN,NOV_3_SWORDMAN+1;break;
+ case 2: set NOV_3_MERCHANT,NOV_3_MERCHANT+1;break;
+ case 3: set NOV_3_THIEF,NOV_3_THIEF+1;
+ }
+ mes "[Hanson]";
+ mes "Ok!! That's all for the test.";
+ mes "You have finished all training";
+ mes "grounds courses. Congratulations!";
+ mes "I am so proud of you.";
+ next;
+ mes "[Hanson]";
+ mes "I prepared some items for you since";
+ mes "you passed the personality test.";
+ mes "Please take these.";
+ next;
+ set NEW_GETITEM,1;
+ getitem 501,4;
+ getitem 503,2;
+ getitem 506,2;
+ next;
+ mes "[Hanson]";
+ mes "Mr/Ms. ^A62A2A'"+strcharinfo(0)+"'^000000!";
+ mes "I will recommend to you a";
+ mes "suitable job, after I finish";
+ mes "analysing the results of your";
+ mes "personality test.";
+ mes "Please wait.";
+ next;
+ mes "[Hanson]";
+ mes ". . . . . . . . . . . . .";
+ mes "It's almost over . .";
+ mes ". . . . . . . . . . . . .";
+ next;
+ mes "[Hanson]";
+ mes ". . . . . . . .!";
+ next;
+ mes "[Hanson]";
+ mes "Here's the final result of your";
+ mes "test, Mr/Ms. ^A62A2A'"+strcharinfo(0)+"'^000000!!";
+ next;
+ set @JOB_NUMBER,1;
+ set @JOB_WITH_C,0;
+ set @JOB_NUMBER_CHK,0;
+ set @JOB_WITH,NOV_3_SWORDMAN;
+L_loop1:
+ switch ( @JOB_NUMBER ) {
+ case 1: set @JOB_WITH_C,NOV_3_ARCHER;break;
+ case 2: set @JOB_WITH_C,NOV_3_THIEF;break;
+ case 3: set @JOB_WITH_C,NOV_3_MAGICIAN;break;
+ case 4: set @JOB_WITH_C,NOV_3_ACOLYTE;break;
+ default: set @JOB_WITH_C,NOV_3_MERCHANT;
+ }
+ if (@JOB_WITH >= @JOB_WITH_C) goto L_loop2;
+ set @JOB_NUMBER_CHK,@JOB_NUMBER;
+ switch ( @JOB_NUMBER ) {
+ case 1: set @JOB_WITH,NOV_3_ARCHER;break;
+ case 2: set @JOB_WITH,NOV_3_THIEF;break;
+ case 3: set @JOB_WITH,NOV_3_MAGICIAN;break;
+ case 4: set @JOB_WITH,NOV_3_ACOLYTE;break;
+ default: set @JOB_WITH,NOV_3_MERCHANT;
+ }
+L_loop2:
+ set @JOB_NUMBER,@JOB_NUMBER+1;
+ while ( @JOB_NUMBER < 6 ) goto L_loop1;
+ mes "[Hanson]";
+ switch ( @JOB_NUMBER_CHK ) {
+ case 0: set @JOB_NAME$,"Swordsman";
+ mes "Although you are direct and";
+ mes "'to the point', you are also";
+ mes "thoughtful and simple.";
+ mes "You clearly wish that you can";
+ mes "become an important person in";
+ mes "this world. In addition to";
+ mes "this, you always try to help";
+ mes "the weak.";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Swordsman^000000.";
+ break;
+ case 1: set @JOB_NAME$,"Archer";
+ mes "You always tried to understand";
+ mes "the feelings of a fallen person";
+ mes "despite not knowing them.";
+ mes "YOu also wanted the other";
+ mes "person to understand your feelings";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Archer^000000.";
+ break;
+ case 2: set @JOB_NAME$,"Thief";
+ mes "You are curious, and want to";
+ mes "explore all around the world.";
+ mes "You also want satisfaction.";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Thief^000000.";
+ break;
+ case 3: set @JOB_NAME$,"Mage";
+ mes "You didn't want to be seen as";
+ mes "stupid, and you really enjoyed the";
+ mes "tests. You also want to be independant.";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Mage^000000.";
+ break;
+ case 4: set @JOB_NAME$,"Acolyte";
+ mes "You are a person whom is really";
+ mes "understanding and kind,";
+ mes "and would suffer for the sake";
+ mes "of another person.";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Acolyte^000000s.";
+ break;
+ case 5: set @JOB_NAME$,"Merchant";
+ mes "You are keen to analyse the market,";
+ mes "you are very neat and want to be";
+ mes "strong. You are also a determined";
+ mes "and are responsible for all your";
+ mes "actions.";
+ next;
+ mes "[Hanson]";
+ mes "The most suitable profession for you is,";
+ mes "^696969Merchant^000000.";
+ }
+ next;
+
+ mes "[Hanson]";
+ mes "So, would you like to accept our";
+ mes "recommendation, or would you like";
+ mes "to choose a job on your own?";
+ next;
+ if ( select(@JOB_NAME$+"!","No, my own choice!") == 1 ) {
+ mes "[Hanson]";
+ mes "Great! I guarantee that it is";
+ mes "a good decision!";
+ mes "After you receive all the";
+ mes "supplies, I will send you to";
+ mes "the associated town.";
+ next;
+ mes "^882420Item Offer List^000099";
+ switch( @JOB_NUMBER_CHK ) {
+ case 0: mes "1 Falchion";
+ getitem 1104,1;
+ break;
+ case 1: mes "1 Composite Bow";
+ getitem 1704,1;
+ break;
+ case 2: mes "1 Main Gauche";
+ getitem 1207,1;
+ break;
+ case 3: mes "1 Rod";
+ mes "1 Cutter";
+ getitem 1601,1;
+ getitem 1204,1;
+ break;
+ case 4: mes "1 Mace";
+ getitem 1504,1;
+ break;
+ case 5: mes "1 Battle Axe";
+ getitem 1351,1;
+ }
+ if( @JOB_NUMBER_CHK == 5 ){
+ mes "^0000304 Free Tickets for Kafra Storage";
+ mes "4 Free Tickets for Kafra Transportation";
+ mes "4 Free Tickets for the Cart Service";
+ getitem 7059,4;
+ getitem 7060,4;
+ getitem 7061,4;
+ }else{
+ mes "^0000305 Free Tickets for Kafra Storage";
+ mes "5 Free Tickets for Kafra Transportation";
+ getitem 7059,5;
+ getitem 7060,5;
+ }
+ mes "^0000997 Phracons";
+ mes "10 Novices Red Potions^000000";
+ mes "^000030100 Zeny^000000";
+ getitem 1010,7;
+ getitem 569,10;
+ set Zeny,Zeny+100;
+ next;
+ mes "[Hanson]";
+ mes "All the supplies have been given to";
+ mes "you. Please, check it again.";
+ mes "I will give a brief explanation";
+ mes "about these items.";
+ next;
+ mes "[Hanson]";
+ switch( @JOB_NUMBER_CHK ) {
+ case 0: mes "After you change your job,";
+ mes "you can use the 'Falchion'"; break;
+ case 1: mes "After you change your job,";
+ mes "you can use the 'Composite Bow'"; break;
+ case 2: mes "After you change your job,";
+ mes "you can use the 'Main Gauche'"; break;
+ case 3: mes "After you change your job,";
+ mes "you can use the 'Rod'"; break;
+ case 4: mes "After you change your job,";
+ mes "you can use the 'Mace'"; break;
+ case 5: mes "After you change your job,";
+ mes "you can use the 'Battle Axe'";break;
+ }
+ mes "instead of the Novice Knife";
+ mes "which I offered you before.";
+ next;
+ mes "[Hanson]";
+ mes "'Phracon' will be spent when";
+ mes "you refine Lv 1 weapons.";
+ mes "Some of the famous refiners";
+ mes "work only intowns.";
+ mes "After you change your job,";
+ mes "Visit one of them with Phracon.";
+ callsub L_place;
+ next;
+ goto L_warp;
+ }
+ mes "[Hanson]";
+ mes "Yes, yes...";
+ mes "So this is your choice?";
+ mes "Did you not care about";
+ mes "our recommendation?";
+ mes "Please choose the profession";
+ mes "that you want.";
+ next;
+ switch( @JOB_NUMBER_CHK ) {
+ case 0: switch( select("Mage","Merchant","Thief","Archer","Acolyte") ) {
+ case 1: set @JOB_NUMBER_CHK,3;
+ set @JOB_NAME$,"Mage";
+ break;
+ case 2: set @JOB_NUMBER_CHK,5;
+ set @JOB_NAME$,"Merchant";
+ break;
+ case 3: set @JOB_NUMBER_CHK,2;
+ set @JOB_NAME$,"Thief";
+ break;
+ case 4: set @JOB_NUMBER_CHK,1;
+ set @JOB_NAME$,"Archer";
+ break;
+ case 5: set @JOB_NUMBER_CHK,4;
+ set @JOB_NAME$,"Acolyte";
+ }
+ break;
+ case 1: switch( select("Swordsman","Mage","Merchant","Thief","Acolyte") ) {
+ case 1: set @JOB_NUMBER_CHK,0;
+ set @JOB_NAME$,"Swordsman";
+ break;
+ case 2: set @JOB_NUMBER_CHK,3;
+ set @JOB_NAME$,"Mage";
+ break;
+ case 3: set @JOB_NUMBER_CHK,5;
+ set @JOB_NAME$,"Merchant";
+ break;
+ case 4: set @JOB_NUMBER_CHK,2;
+ set @JOB_NAME$,"Thief";
+ break;
+ case 5: set @JOB_NUMBER_CHK,4;
+ set @JOB_NAME$,"Acolyte";
+ }
+ break;
+ case 2: switch( select("Swordsman","Mage","Merchant","Archer","Acolyte") ) {
+ case 1: set @JOB_NUMBER_CHK,0;
+ set @JOB_NAME$,"Swordsman";
+ break;
+ case 2: set @JOB_NUMBER_CHK,3;
+ set @JOB_NAME$,"Mage";
+ break;
+ case 3: set @JOB_NUMBER_CHK,5;
+ set @JOB_NAME$,"Merchant";
+ break;
+ case 4: set @JOB_NUMBER_CHK,1;
+ set @JOB_NAME$,"Archer";
+ break;
+ case 5: set @JOB_NUMBER_CHK,4;
+ set @JOB_NAME$,"Acolyte";
+ }
+ break;
+ case 3: switch( select("Swordsman","Merchant","Thief","Archer","Acolyte") ) {
+ case 1: set @JOB_NUMBER_CHK,0;
+ set @JOB_NAME$,"Swordsman";
+ break;
+ case 2: set @JOB_NUMBER_CHK,5;
+ set @JOB_NAME$,"Merchant";
+ break;
+ case 3: set @JOB_NUMBER_CHK,2;
+ set @JOB_NAME$,"Thief";
+ break;
+ case 4: set @JOB_NUMBER_CHK,1;
+ set @JOB_NAME$,"Archer";
+ break;
+ case 5: set @JOB_NUMBER_CHK,4;
+ set @JOB_NAME$,"Acolyte";
+ }
+ break;
+ case 4: switch( select("Swordsman","Mage","Merchant","Thief","Archer") ) {
+ case 1: set @JOB_NUMBER_CHK,0;
+ set @JOB_NAME$,"Swordsman";
+ break;
+ case 2: set @JOB_NUMBER_CHK,3;
+ set @JOB_NAME$,"Mage";
+ break;
+ case 3: set @JOB_NUMBER_CHK,5;
+ set @JOB_NAME$,"Merchant";
+ break;
+ case 4: set @JOB_NUMBER_CHK,2;
+ set @JOB_NAME$,"Thief";
+ break;
+ case 5: set @JOB_NUMBER_CHK,1;
+ set @JOB_NAME$,"Archer";
+ }
+ break;
+ case 5: switch( select("Swordsman","Mage","Thief","Archer","Acolyte") ) {
+ case 1: set @JOB_NUMBER_CHK,0;
+ set @JOB_NAME$,"Swordsman";
+ break;
+ case 2: set @JOB_NUMBER_CHK,3;
+ set @JOB_NAME$,"Mage";
+ break;
+ case 3: set @JOB_NUMBER_CHK,2;
+ set @JOB_NAME$,"Thief";
+ break;
+ case 4: set @JOB_NUMBER_CHK,1;
+ set @JOB_NAME$,"Archer";
+ break;
+ case 5: set @JOB_NUMBER_CHK,4;
+ set @JOB_NAME$,"Acolyte";
+ }
+ }
+ mes "[Hanson]";
+ mes @JOB_NAME$+" is your choise.";
+ callsub L_place;
+ next;
+ mes "[Hanson]";
+ mes "After you receive all the";
+ mes "supplies, I will send you to";
+ mes "the associated town.";
+ next;
+ mes "^882420Item Offer List";
+ mes "^0000301 Adventurer's Suit";
+ mes "^00009910 Novices Red Potions";
+ mes "^0000305 Free Tickets for Kafra Storage";
+ mes "^0000995 Free Tickets for Kafra Transportation";
+ mes "^000030100 Zeny^000000";
+ getitem 7059,5;
+ getitem 7060,5;
+ getitem 2305,1;
+ getitem 569,10;
+ set Zeny,Zeny+100;
+ next;
+ mes "[Hanson]";
+ mes "All the supplies have been given to";
+ mes "you. Please, check it again.";
+ mes "I will give a brief explanation";
+ mes "about these items.";
+ next;
+ mes "[Hanson]";
+ mes "'Zeny' is the current currency";
+ mes "within Ragnarok Online.";
+ mes "Later, you can use the";
+ mes "'Adventurer's Suit'";
+ mes "instead of the Novice Plate";
+ mes "which I offered you before.";
+ next;
+L_warp:
+ mes "[Hanson]";
+ mes "Good luck, ^A62A2A' "+strcharinfo(0)+" '^000000,";
+ mes "and farewell.";
+ close2;
+ callsub L_cleararg;
+ switch( @JOB_NUMBER_CHK ) {
+ case 0: savepoint "izlude.gat",94,103;
+ warp "izlude_in.gat",74,167;
+ break;
+ case 1: savepoint "payon.gat",256,242;
+ warp "payon_in02.gat",64,65;
+ break;
+ case 2: savepoint "morocc.gat",149,100;
+ warp "moc_ruins.gat",155,44;
+ break;
+ case 3: savepoint "geffen.gat",120,38;
+ warp "geffen_in.gat",163,98;
+ break;
+ case 4: savepoint "prontera.gat",116,72;
+ warp "prt_church.gat",172,19;
+ break;
+ case 5: savepoint "alberta.gat",31,231;
+ warp "alberta_in.gat",62,44;
+ }
+ end;
+L_place:
+ switch( @JOB_NUMBER_CHK ) {
+ case 0: mes "The town you will be sent to";
+ mes "is 'Izlude'. The Swordsman";
+ mes "association is located in the";
+ mes "west side of the city.";
+ mes "Please remember this.";
+ break;
+ case 1: mes "The town you will be sent to";
+ mes "is named 'Payon'.";
+ mes "The Archer association can be";
+ mes "found in the small village";
+ mes "to the north-east.";
+ mes "Please remember this.";
+ break;
+ case 2: mes "The town you will be sent to";
+ mes "is called 'Morroc'.";
+ mes "The thief guild is in the";
+ mes "underground 1st floor of the";
+ mes "pyramid, which is North-west";
+ mes "of 'Morroc'.";
+ mes "Please remember this.";
+ break;
+ case 3: mes "The town you will be sent to";
+ mes "is called 'Geffen'.";
+ mes "The Mage association is located";
+ mes "to the north-west of the city.";
+ mes "Please remember this.";
+ break;
+ case 4: mes "The town you will be sent to";
+ mes "is called 'Prontera'.";
+ mes "The good father can be found";
+ mes "in the church located in the";
+ mes "north-east corner of 'Prontera'.";
+ mes "Please remember this.";
+ break;
+ case 5: mes "The town you will be sent to";
+ mes "is called 'Alberta'.";
+ mes "The Merchant association is";
+ mes "located in the south-western";
+ mes "section of the city.";
+ mes "Please remember this.";
+ }
+ mes "You'll now be teleported.";
+ return;
+L_cleararg:
+ set NEW_MES_FLAG0,0;
+ set NEW_MES_FLAG1,0;
+ set NEW_MES_FLAG2,0;
+ set NEW_MES_FLAG3,0;
+ set NEW_MES_FLAG4,0;
+ set NEW_MES_FLAG5,0;
+ set NEW_MES_FLAG6,0;
+ set NEW_LVUP0,0;
+ set NEW_LVUP1,0;
+ set NEW_JOBLVUP,0;
+ set NEW_GETITEM,0;
+ set NOV_3_SWORDMAN,0;
+ set NOV_3_ARCHER,0;
+ set NOV_3_THIEF,0;
+ set NOV_3_MAGICIAN,0;
+ set NOV_3_ACOLYTE,0;
+ set NOV_3_MERCHANT,0;
+ return;
+}
+
+// Training Ground Mobs
+new_zone03.gat,0,0,0,0 monster Fabre 1184,5,0,0,0
+new_zone03.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+new_zone03.gat,0,0,0,0 monster ChonChon 1011,10,0,0,0
+new_zone03.gat,0,0,0,0 monster Lunatic 1063,10,0,0,0
+new_zone03.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+// Unsure about the following mobs
+new_zone03.gat,0,0,0,0 monster Condor 1009,2,0,0,0
+new_zone03.gat,0,0,0,0 monster Willow 1010,2,0,0,0
+new_zone03.gat,0,0,0,0 monster Roda Frog 1012,2,0,0,0
+new_zone03.gat,0,0,0,0 monster Shell Picky 1050,2,0,0,0
+new_zone03.gat,0,0,0,0 monster Spore 1014,1,0,0,0
+new_zone03.gat,0,0,0,0 monster Thief Bug Larva 1051,1,0,0,0
+new_zone03.gat,0,0,0,0 monster Rocker 1052,1,0,0,0
+new_zone03.gat,0,0,0,0 monster Thief Bug Female 1053,1,0,0,0
diff --git a/npc/jobs/novice/supernovice.txt b/npc/jobs/novice/supernovice.txt
index 63f611312..a988ac0ea 100644
--- a/npc/jobs/novice/supernovice.txt
+++ b/npc/jobs/novice/supernovice.txt
@@ -1,279 +1,279 @@
-//===== eAthena Script =======================================
-//= Super Novice Script
-//===== By: ==================================================
-//= Darkchild
-//===== Current Version: =====================================
-//= 1.8a
-//===== Compatible With: =====================================
-//= Any eAthena
-//===== Description: =========================================
-//= Super Novice Job Change Npc
-//= Super Novice Cart Rental Npc
-//= Some Other Useless Super Novice Npc
-//===== Additional Comments: =================================
-//= Dialogs From Some Other Scripts (Most Of It)
-//= 1.3-1.5 Added Baby class support (and to the Kafta SN Cart
-//= renter, too) [Lupus]
-//= 1.6 Added a fix which prevent High Novices passing
-//= this Job Quests again. [Lupus]
-//= 1.7 Fixed Baby Class Support. [Lupus]
-//= 1.8 Now a Baby can become a Super Baby [Lupus]
-//============================================================
-
-
-// -- Jobchanger --
-aldeba_in.gat,223,167,3 script Tozel 709,{
- if(SUPNOV_Q == 1) goto L_Start2;
- if(BaseJob == Job_SuperNovice) goto L_Twice;
- if(BaseJob != Job_Novice || Upper==1) goto L_Otherjob;
- mes "[Tozel]";
- mes "Hello, Novice!";
- mes "Are you enjoying yourself as a novice, the preferred class of the common man?";
- next;
- mes "[Tozel]";
- mes "Would you like to join the Novice Guild and add your common character";
- mes "to the common pool of talent so that we can perform common services?";
- next;
- mes "[Tozel]";
- mes "If you join us, I'll change your class from Novice to the highly skilled Super Novice!";
- mes "How does that sound?";
- next;
- menu "I'm sold!",-,"Super Novice is Super Stupid",L_Stupid,"Well, to make an informed choice...",L_Well;
- if(JobLevel < 10) goto L_LowSkill;
- if(BaseLevel < 45) goto L_LowLevel;
- if(SkillPoint != 0) goto L_StillSk;
- mes "[Tozel]";
- mes "Wonderful!";
- mes "You're on the road to becoming an uncommonly common individual.";
- next;
- mes "[Tozel]";
- mes "Common is a great word, isn't it?";
- next;
- mes "[Tozel]";
- mes "Just because you've applied to become a member of the Novice Guild doesn't mean automatic admission.";
- mes "There are requirements you must meet.";
- next;
- mes "[Tozel]";
- mes "Being a guild of common men, it's only fitting that you bring me a common item as an entry requirement.";
- mes "So, go and find thirty each of: ";
- mes " ^FF0000Sticky Mucus^000000 and";
- mes " ^FF0000Resin^000000.";
- next;
- mes "[Tozel]";
- mes "Once you collect this common number of common items, head on back to this common guild of common men.";
- set SUPNOV_Q,1;
- close;
-
-L_Stupid:
- mes "[Tozel]";
- mes "Hm...That's an attitude shared by a lot of common criminals and other commonly marginalized types.";
- mes "...They don't understand the fulfillment gained by a common pool of friends.";
- next;
- mes "[Tozel]";
- mes "Of course, it's common to change one's mind as well.";
- mes "If you do, please drop by again.";
- close;
-
-L_Well:
- mes "[Tozel]";
- mes "Oh, you want to know a bit more about this guild, eh?";
- mes "I'll be happy to explain!";
- next;
- mes "[Tozel]";
- mes "Let me tell you about Kima, the guild founder.";
- mes "Kima founded this guild because those of common ancestry and common our status had no place";
- mes "to assemble and enjoy each other's company.";
- next;
- mes "- Tozel talks for ten minutes. - ";
- mes "- His tone is so common that it bores you to tears. -";
- next;
- mes "[Tozel]";
- mes "...Anyway, the Novice guild has propsered greatly since its founding.";
- mes "We pride ourselves on our slogan 'Common Man, Common Goals, Common Dreams'!";
- close;
-
-L_Start2:
- if(countitem(938) < 30) goto L_ItemError;
- if(countitem(907) < 30) goto L_ItemError;
- delitem 938,30;
- delitem 907,30;
- mes "[Tozel]";
- mes "Well, your performance seems to be uh...common, but that's good enough for us!";
- mes "Welcome to the Novice Guild!";
- next;
- mes "[Tozel]";
- mes "According to my promise, I'll make you a Super Novice.";
- mes "Are you ready?!";
- next;
- menu "Huh?!",-,"Maybe?!",-;
- mes "- Tozel's uncommon demeanor catches you off guard, -";
- mes "- leaving you speechless! -";
- next;
- if (Upper==0) jobchange Job_SuperNovice;
- if (Upper==2) jobchange Job_Super_Baby;
- getitem 2339,1;
- callfunc "F_ClearJobVar";
- mes "[Tozel]";
- mes "Hahahah! Were you surprised?!";
- mes "Just because we're common people doesn't mean we can't be misfits sometimes!";
- next;
- mes "[Tozel]";
- mes "So, now your new life as a Super Novice begins!";
- next;
- mes "[Tozel]";
- mes "Now you're a part of Kima's legacy!";
- mes "Please continue his good (but common) name.";
- close;
-
-L_LowSkill:
- mes "[Tozel]";
- mes "Well...it seems your level is a little too common at the moment.";
- mes "You need to have a class level of ^0000FFat least 9^000000 in order to join us.";
- close;
-
-L_LowLevel:
- mes "[Tozel]";
- mes "Well...it seems your level is a little too common at the moment.";
- mes "You need to have a primary level of ^0000FFat least 45^000000 in order to join us.";
- close;
-
-L_StillSk:
- mes "[Tozel]";
- mes "Well...it seems you still have some skill points.";
- mes "You need to have ^0000FFNO^000000 skill points left in order to join our guild.";
- close;
-
-L_ItemError:
- mes "[Tozel]";
- mes "Did you forget what you were supposed to find?";
- mes "I'll tell you again.";
- next;
- mes "[Tozel]";
- mes "You need to find thirty each of";
- mes "^FF0000 Sticky Muscus^000000 and";
- mes "^FF0000 Resin^000000.";
- close;
-
-L_Twice:
- mes "[Tozel]";
- mes "You're a member of the Novice Guild now.";
- mes "There's no need to have exceptional talents here.";
- mes "Your common vigilance is all we require.";
- next;
- mes "[Tozel]";
- mes "Go, then, and live a common and unexceptional life, in order to bring respect to our guild.";
- close;
-L_Otherjob:
- mes "[Tozel]";
- mes "Hey! You're not a man of common heritage!";
- mes "I'm Tozel, the master of the Novice Guild.";
- next;
- mes "[Tozel]";
- mes "This place is for people who who have common goals,";
- mes "common beliefs, common lives.";
- mes "For you, an uncommon person, this place is anathema.";
- next;
- mes "[Tozel]";
- mes "Such people don't have a place in our common society. I'm sorry.";
- close;
-}
-
-// -- Totaly Useless :) --
-aldeba_in.gat,216,169,5 script Serei 86,{
- if(BaseJob == Job_SuperNovice) goto L_Supernovice;
- if(BaseJob != Job_Novice) goto L_Otherjob;
- mes "[Serei]";
- mes "You're pretty common.";
- mes "A common man should live a happy life.";
- mes "You should consider joining the Novice Guild.";
- next;
- mes "[Serei]";
- mes "GO NOVICE CLASS!";
- mes "Hahahahahahahaha!";
- close;
-
-L_Supernovice:
- mes "[Serei]";
- mes "Yaaaaaaaaaaaaaaaaaaaaaaaay!";
- mes "You're a member of the Novice Guild! Sweet!";
- next;
- mes "[Serei]";
- mes "That's great!";
- mes "Are you trying to extend the Guild's legacy of uneventfulness?";
- next;
- mes "[Serei]";
- mes "I'm Guildmaster Tozel's number one man!";
- close;
-
-L_Otherjob:
- mes "[Serei]";
- mes "Oh no!";
- mes "You're one of those people who rejected the common way of life!";
- mes "You might be dangerous to those who walk the common path!";
- mes "Ahhhh!";
- close;
-}
-
-
-// -- Car Rental --
-aldebaran.gat,54,238,5 script Kafra 117,{
- if(BaseJob != Job_SuperNovice) goto L_Otherjob;
- if(checkcart(0) == 1) goto L_GotCart;
- mes "[Kafra]";
- mes "Oh, a Super Novice!";
- mes "You're annoyed that the other Kafras won't lend you a cart?";
- mes "No problem!";
- next;
- mes "[Kafra]";
- mes "I can lend you a cart, but try to keep a low profile,";
- mes "because we are under orders from Kafra management not to lend carts to any Novice.";
- next;
- mes "[Kafra]";
- mes "There will be a fee of ^FF00001900zeny^000000 to use the cart.";
- next;
- mes "[Kafra]";
- mes "You need to have the Push Cart skill in order to use a cart.";
- mes "If you don't have this skill,";
- mes "you won't be able to use the cart and You'll lose your money.";
- mes "Do you want me to lend you a cart?";
- next;
- menu "Lend me a cart",-,"Not Necessary",L_End;
- mes "[Kafra]";
- mes "Since I'm secretly lending you a cart,";
- mes "I can't ensure you have the Push Cart skill.";
- mes "If you don't, you won't be able to use the cart and You'll lose your money.";
- mes "Are you sure you want the cart?";
- next;
- menu "I heard you the first time!",-,"Uhhh...wait a minute...",L_End;
- if(getskilllv(39)==0) goto L_End;
- if(Zeny < 1900) goto L_Error;
- set Zeny,Zeny-1900;
- setcart;
- mes "[Kafra]";
- mes "Thanks for using the Kafra service, even if it is under the table.";
- mes "Hehehehehe...";
- close;
-
-L_Error:
- mes "[Kafra]";
- mes "Hmmm. It seems you're short of funds.";
- close;
-
-L_End:
- mes "[Kafra]";
- mes "Thank you for your patronage.";
- mes "Please come again.";
- close;
-
-L_GotCart:
- mes "[Kafra]";
- mes "HI There, Dear Super Novice.";
- mes "I'm sorry but I can't help you, you already have an cart!";
- close;
-
-L_Otherjob:
- mes "[Kafra]";
- mes "I'm sorry, but I'm not taking customers right now.";
- mes "Please try asking the other Kafra staff for assistance.";
- close;
-}
+//===== eAthena Script =======================================
+//= Super Novice Script
+//===== By: ==================================================
+//= Darkchild
+//===== Current Version: =====================================
+//= 1.8a
+//===== Compatible With: =====================================
+//= Any eAthena
+//===== Description: =========================================
+//= Super Novice Job Change Npc
+//= Super Novice Cart Rental Npc
+//= Some Other Useless Super Novice Npc
+//===== Additional Comments: =================================
+//= Dialogs From Some Other Scripts (Most Of It)
+//= 1.3-1.5 Added Baby class support (and to the Kafta SN Cart
+//= renter, too) [Lupus]
+//= 1.6 Added a fix which prevent High Novices passing
+//= this Job Quests again. [Lupus]
+//= 1.7 Fixed Baby Class Support. [Lupus]
+//= 1.8 Now a Baby can become a Super Baby [Lupus]
+//============================================================
+
+
+// -- Jobchanger --
+aldeba_in.gat,223,167,3 script Tozel 709,{
+ if(SUPNOV_Q == 1) goto L_Start2;
+ if(BaseJob == Job_SuperNovice) goto L_Twice;
+ if(BaseJob != Job_Novice || Upper==1) goto L_Otherjob;
+ mes "[Tozel]";
+ mes "Hello, Novice!";
+ mes "Are you enjoying yourself as a novice, the preferred class of the common man?";
+ next;
+ mes "[Tozel]";
+ mes "Would you like to join the Novice Guild and add your common character";
+ mes "to the common pool of talent so that we can perform common services?";
+ next;
+ mes "[Tozel]";
+ mes "If you join us, I'll change your class from Novice to the highly skilled Super Novice!";
+ mes "How does that sound?";
+ next;
+ menu "I'm sold!",-,"Super Novice is Super Stupid",L_Stupid,"Well, to make an informed choice...",L_Well;
+ if(JobLevel < 10) goto L_LowSkill;
+ if(BaseLevel < 45) goto L_LowLevel;
+ if(SkillPoint != 0) goto L_StillSk;
+ mes "[Tozel]";
+ mes "Wonderful!";
+ mes "You're on the road to becoming an uncommonly common individual.";
+ next;
+ mes "[Tozel]";
+ mes "Common is a great word, isn't it?";
+ next;
+ mes "[Tozel]";
+ mes "Just because you've applied to become a member of the Novice Guild doesn't mean automatic admission.";
+ mes "There are requirements you must meet.";
+ next;
+ mes "[Tozel]";
+ mes "Being a guild of common men, it's only fitting that you bring me a common item as an entry requirement.";
+ mes "So, go and find thirty each of: ";
+ mes " ^FF0000Sticky Mucus^000000 and";
+ mes " ^FF0000Resin^000000.";
+ next;
+ mes "[Tozel]";
+ mes "Once you collect this common number of common items, head on back to this common guild of common men.";
+ set SUPNOV_Q,1;
+ close;
+
+L_Stupid:
+ mes "[Tozel]";
+ mes "Hm...That's an attitude shared by a lot of common criminals and other commonly marginalized types.";
+ mes "...They don't understand the fulfillment gained by a common pool of friends.";
+ next;
+ mes "[Tozel]";
+ mes "Of course, it's common to change one's mind as well.";
+ mes "If you do, please drop by again.";
+ close;
+
+L_Well:
+ mes "[Tozel]";
+ mes "Oh, you want to know a bit more about this guild, eh?";
+ mes "I'll be happy to explain!";
+ next;
+ mes "[Tozel]";
+ mes "Let me tell you about Kima, the guild founder.";
+ mes "Kima founded this guild because those of common ancestry and common our status had no place";
+ mes "to assemble and enjoy each other's company.";
+ next;
+ mes "- Tozel talks for ten minutes. - ";
+ mes "- His tone is so common that it bores you to tears. -";
+ next;
+ mes "[Tozel]";
+ mes "...Anyway, the Novice guild has propsered greatly since its founding.";
+ mes "We pride ourselves on our slogan 'Common Man, Common Goals, Common Dreams'!";
+ close;
+
+L_Start2:
+ if(countitem(938) < 30) goto L_ItemError;
+ if(countitem(907) < 30) goto L_ItemError;
+ delitem 938,30;
+ delitem 907,30;
+ mes "[Tozel]";
+ mes "Well, your performance seems to be uh...common, but that's good enough for us!";
+ mes "Welcome to the Novice Guild!";
+ next;
+ mes "[Tozel]";
+ mes "According to my promise, I'll make you a Super Novice.";
+ mes "Are you ready?!";
+ next;
+ menu "Huh?!",-,"Maybe?!",-;
+ mes "- Tozel's uncommon demeanor catches you off guard, -";
+ mes "- leaving you speechless! -";
+ next;
+ if (Upper==0) jobchange Job_SuperNovice;
+ if (Upper==2) jobchange Job_Super_Baby;
+ getitem 2339,1;
+ callfunc "F_ClearJobVar";
+ mes "[Tozel]";
+ mes "Hahahah! Were you surprised?!";
+ mes "Just because we're common people doesn't mean we can't be misfits sometimes!";
+ next;
+ mes "[Tozel]";
+ mes "So, now your new life as a Super Novice begins!";
+ next;
+ mes "[Tozel]";
+ mes "Now you're a part of Kima's legacy!";
+ mes "Please continue his good (but common) name.";
+ close;
+
+L_LowSkill:
+ mes "[Tozel]";
+ mes "Well...it seems your level is a little too common at the moment.";
+ mes "You need to have a class level of ^0000FFat least 9^000000 in order to join us.";
+ close;
+
+L_LowLevel:
+ mes "[Tozel]";
+ mes "Well...it seems your level is a little too common at the moment.";
+ mes "You need to have a primary level of ^0000FFat least 45^000000 in order to join us.";
+ close;
+
+L_StillSk:
+ mes "[Tozel]";
+ mes "Well...it seems you still have some skill points.";
+ mes "You need to have ^0000FFNO^000000 skill points left in order to join our guild.";
+ close;
+
+L_ItemError:
+ mes "[Tozel]";
+ mes "Did you forget what you were supposed to find?";
+ mes "I'll tell you again.";
+ next;
+ mes "[Tozel]";
+ mes "You need to find thirty each of";
+ mes "^FF0000 Sticky Muscus^000000 and";
+ mes "^FF0000 Resin^000000.";
+ close;
+
+L_Twice:
+ mes "[Tozel]";
+ mes "You're a member of the Novice Guild now.";
+ mes "There's no need to have exceptional talents here.";
+ mes "Your common vigilance is all we require.";
+ next;
+ mes "[Tozel]";
+ mes "Go, then, and live a common and unexceptional life, in order to bring respect to our guild.";
+ close;
+L_Otherjob:
+ mes "[Tozel]";
+ mes "Hey! You're not a man of common heritage!";
+ mes "I'm Tozel, the master of the Novice Guild.";
+ next;
+ mes "[Tozel]";
+ mes "This place is for people who who have common goals,";
+ mes "common beliefs, common lives.";
+ mes "For you, an uncommon person, this place is anathema.";
+ next;
+ mes "[Tozel]";
+ mes "Such people don't have a place in our common society. I'm sorry.";
+ close;
+}
+
+// -- Totaly Useless :) --
+aldeba_in.gat,216,169,5 script Serei 86,{
+ if(BaseJob == Job_SuperNovice) goto L_Supernovice;
+ if(BaseJob != Job_Novice) goto L_Otherjob;
+ mes "[Serei]";
+ mes "You're pretty common.";
+ mes "A common man should live a happy life.";
+ mes "You should consider joining the Novice Guild.";
+ next;
+ mes "[Serei]";
+ mes "GO NOVICE CLASS!";
+ mes "Hahahahahahahaha!";
+ close;
+
+L_Supernovice:
+ mes "[Serei]";
+ mes "Yaaaaaaaaaaaaaaaaaaaaaaaay!";
+ mes "You're a member of the Novice Guild! Sweet!";
+ next;
+ mes "[Serei]";
+ mes "That's great!";
+ mes "Are you trying to extend the Guild's legacy of uneventfulness?";
+ next;
+ mes "[Serei]";
+ mes "I'm Guildmaster Tozel's number one man!";
+ close;
+
+L_Otherjob:
+ mes "[Serei]";
+ mes "Oh no!";
+ mes "You're one of those people who rejected the common way of life!";
+ mes "You might be dangerous to those who walk the common path!";
+ mes "Ahhhh!";
+ close;
+}
+
+
+// -- Car Rental --
+aldebaran.gat,54,238,5 script Kafra 117,{
+ if(BaseJob != Job_SuperNovice) goto L_Otherjob;
+ if(checkcart(0) == 1) goto L_GotCart;
+ mes "[Kafra]";
+ mes "Oh, a Super Novice!";
+ mes "You're annoyed that the other Kafras won't lend you a cart?";
+ mes "No problem!";
+ next;
+ mes "[Kafra]";
+ mes "I can lend you a cart, but try to keep a low profile,";
+ mes "because we are under orders from Kafra management not to lend carts to any Novice.";
+ next;
+ mes "[Kafra]";
+ mes "There will be a fee of ^FF00001900zeny^000000 to use the cart.";
+ next;
+ mes "[Kafra]";
+ mes "You need to have the Push Cart skill in order to use a cart.";
+ mes "If you don't have this skill,";
+ mes "you won't be able to use the cart and You'll lose your money.";
+ mes "Do you want me to lend you a cart?";
+ next;
+ menu "Lend me a cart",-,"Not Necessary",L_End;
+ mes "[Kafra]";
+ mes "Since I'm secretly lending you a cart,";
+ mes "I can't ensure you have the Push Cart skill.";
+ mes "If you don't, you won't be able to use the cart and You'll lose your money.";
+ mes "Are you sure you want the cart?";
+ next;
+ menu "I heard you the first time!",-,"Uhhh...wait a minute...",L_End;
+ if(getskilllv(39)==0) goto L_End;
+ if(Zeny < 1900) goto L_Error;
+ set Zeny,Zeny-1900;
+ setcart;
+ mes "[Kafra]";
+ mes "Thanks for using the Kafra service, even if it is under the table.";
+ mes "Hehehehehe...";
+ close;
+
+L_Error:
+ mes "[Kafra]";
+ mes "Hmmm. It seems you're short of funds.";
+ close;
+
+L_End:
+ mes "[Kafra]";
+ mes "Thank you for your patronage.";
+ mes "Please come again.";
+ close;
+
+L_GotCart:
+ mes "[Kafra]";
+ mes "HI There, Dear Super Novice.";
+ mes "I'm sorry but I can't help you, you already have an cart!";
+ close;
+
+L_Otherjob:
+ mes "[Kafra]";
+ mes "I'm sorry, but I'm not taking customers right now.";
+ mes "Please try asking the other Kafra staff for assistance.";
+ close;
+}
diff --git a/npc/kafras/functions_kafras.txt b/npc/kafras/functions_kafras.txt
index 135eccd65..2b9d67bff 100644
--- a/npc/kafras/functions_kafras.txt
+++ b/npc/kafras/functions_kafras.txt
@@ -1,541 +1,541 @@
-//===== eAthena Script =======================================
-//= Kafra Functions
-//===== By: ==================================================
-//= eAthena Dev Team
-//= Darlskies, Darkchild, Syrus22, Lupus, kobra_k88 (2.0)
-//===== Current Version: =====================================
-//= 5.4b
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= These functions handle save, storage, cart rental, teleport,
-//= and Free Teleport/Warp/Rent Cart options for all Kafra NPCs.
-//===== Additional Comments: =================================
-//= v1.1 Now using functions v2.1 Added Cart Rent for Classes: Whitesmith, Professor.
-//= Replaced checkoption(x) into checkcart(0) [Lupus] v2.1b Added Fix Kafra Pass Func [Kobra_k88]
-//= 2.2 Final fix of the Kafra Pass Exploit! [Lupus] a -Izlude[4] fix
-//= 2.2a Minor changes to function calls. Using agruments. Added Guild options. [kobra_k88]
-//= 2.2b This version uses arrays for the teleport option. Rearranged next statements to make menu transitions smoother. [kobra_k88]
-//= 2.3 Removed SAVE from Niflheim. [Lupus]
-//= 2.3 removed "fix" by HawkMoon RTFM and check supernovice.txt . There's a SPECIAL Kafra which gives CARTS to SN for a special proce. [Lupus]
-//= 2.4 Added Baby Class Support (Baby Novice check) Removed annoying storage feature where u had to close dialog window to be able to use your storage [Lupus]
-//= 2.5 Added Louyang official Kafra, fixes some Kafras, not letting you to Save your position [Lupus]
-//= 2.6 Reverted Dungeons Kafras (they should offer only Storage). Added temp Ayothaya Kafra
-//= 2.7 Added correct Ayothaya, Louyang & Amatsu Kafras. [Lupus]
-//= 2.8 Fixed Amatsu Storage problems [Lupus] 2.9 Fixed spelling mistakes. [Nexon]
-//= 3.0 Added special "not working teleport menu" for Einbroch Kafras [Lupus]
-//= 3.1 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 3.2 Fixed an exploit [Lupus]
-//= 4.0 Added Kafra storage password protection. [Lupus]
-//= to block Kafra Password, read comments at 350 line
-//= Note: You can change '1337' value to another to raise password protection
-//= 5.0 Fixed the close2;....close; end; lines. Who let them slip away? =/ [erKURITA]
-//= Also, the kafra upon warp was giving back the zeny. Removed. [erKURITA]
-//= 5.1 Optimized a little, added no tele/save arg's [Evera]
-//= 5.1a Temporary? Added F_ClearGarbage to clear unused/outdated variables [Lupus]
-//= 5.2 By default commented out custom Guilds Kafra's "Guild Storage". [Lupus]
-//= 5.3 uncommented Guild Storage. Confirmed kRO feature. [Lupus]
-//= 5.4 added -Guide option (Kafra shows you nearest Guide) Work in progress.
-//= Need all coords for all guides.. and somehow pass their coords to kafra.
-//= Removed universal Kafra Pass, added 3 new Kafra Tickets [Lupus]
-//= 5.4b temporary moved "-Guide" from the 1st menu punct [Lupus]
-//============================================================
-
-
-// Main Function ===========================================================
-//= arg(0): Used to determine which welcome message to show.
-//= arg(1): Used to determine which menu to display.
-//= arg(2): Used to determine if the info menu is shown in F_KafInfo.
-//==========================================================================
-function script F_Kafra {
- callfunc "F_ClearGarbage"; //Clear outdated, unused variables
-
- mes "[Kafra]";
- switch(getarg(0)){
- default:
- case 0:
- mes "Welcome to Kafra Corp. We will stay with you wherever you go.";
- break;
- //Niflheim
- case 1:
- mes "Welcome... Kafra Services.... Will be with you even if you die.....";
- break;
- //Guilds Castles
- case 2:
- mes "Welcome, ^5533FF" + GetGuildName(@GID) + "^000000 members. We will stay with you wherever you go";
- break;
- //Amatsu
- case 3:
- mes "So, have you come from a faraway land to study our culture, or are you just sightseeing?";
- mes "In either case, why not stay awhile?";
- mes "The air is eternally heavy with the";
- mes "scent of pleasant wildflowers.";
- break;
- //Louyang, Ayothaya
- case 4:
- mes "With our many Kafra";
- mes "service locations, you're never";
- mes "far from home.";
- break;
- }
- next;
-
- M_Menu:
- cleararray @K_Menu0$[0],"",7;
- switch(getarg(1)){
- //only Save & Storage
- case 1:
- setarray @K_Menu0$[0],"-Save","-Use Storage","-Cancel";
- break;
- //only Storage
- case 2:
- setarray @K_Menu0$[0],"-Use Storage","-Cancel";
- break;
- //Common w/o teleport
- case 3:
- setarray @K_Menu0$[0],"-Save","-Use Storage","-Rent a Cart","-Guide","-Other Information Check","-Cancel";
- break;
- //Case 4 is Einbroch no tele message.
- //Common w/o save and teleport
- case 5:
- setarray @K_Menu0$[0],"-Use Storage","-Rent a Cart","-Other Information Check","-Guide","-Cancel";
- break;
- //Only storage and other info check
- case 6:
- setarray @K_Menu0$[0],"-Use Storage","-Guide","-Other Information Check","-Cancel";
- break;
- //Common Kafra
- default:
- setarray @K_Menu0$[0],"-Save","-Use Storage","-Use Teleport Service","-Rent a Cart","-Guide","-Other Information Check","-Cancel";
- break;
- }
- if(getarg(0)==2) {
- //Guilds Kafra (free Teleport, free Storage, Free Cart)
- cleararray @K_Menu0$[0],"",7;
- setarray @K_Menu0$[0],"-Use Storage","-Use Guild Storage","-Rent a Cart","-Use Teleport Service","-Cancel";
- }
- menu @K_Menu0$[0],K_Menu0,@K_Menu0$[1],K_Menu1,@K_Menu0$[2],K_Menu2,
- @K_Menu0$[3],K_Menu3,@K_Menu0$[4],K_Menu4,@K_Menu0$[5],K_Menu5,
- @K_Menu0$[6],K_Menu6,@K_Menu0$[7],K_Menu7;
- K_Menu0:
- set @num,0;
- goto K_Menuf;
- K_Menu1:
- set @num,1;
- goto K_Menuf;
- K_Menu2:
- set @num,2;
- goto K_Menuf;
- K_Menu3:
- set @num,3;
- goto K_Menuf;
- K_Menu4:
- set @num,4;
- goto K_Menuf;
- K_Menu5:
- set @num,5;
- goto K_Menuf;
- K_Menu6:
- set @num,6;
- goto K_Menuf;
- K_Menu7:
- set @num,7;
- K_Menuf:
- if (@K_Menu0$[@num] == "-Save") return;
- if (@K_Menu0$[@num] == "-Use Storage"){
- //Don't charge for a common Kafra Storage in your Castle
- if(getarg(0) == 2) callfunc "F_KafStor",2;
- else callfunc "F_KafStor",0;
- next;
- goto M_Menu;
- }
- if (@K_Menu0$[@num] == "-Use Teleport Service"){
- if(getarg(1) == 4){ //Check for Einbroch Tele notice
- mes "[Kafra]";
- mes "Because of the ^FF0000Limited Transport Agreement^000000, the Kafra Corporation cannot provide Teleport Services in the Schwarzwald Republic.";
- next;
- mes "[Kafra]";
- mes "We ask that you please";
- mes "use the Airship Service";
- mes "instead. Thank you for your";
- mes "understanding and cooperation.";
- next;
- goto M_Menu;
- }
- callfunc "F_KafTele",getarg(0);
- goto M_Menu;
- }
- if (@K_Menu0$[@num] == "-Rent a Cart"){
- if(callfunc("F_KafCart",getarg(0)) == 1) next;
- goto M_Menu;
- }
- if (@K_Menu0$[@num] == "-Guide"){
- callfunc "F_KafGuide";
- next;
- goto M_Menu;
- }
- if (@K_Menu0$[@num] == "-Other Information Check"){
- callfunc "F_KafInfo",getarg(2);
- goto M_Menu;
- }
- if (@K_Menu0$[@num] == "-Cancel"){
- callfunc "F_KafEnd",getarg(0),0;
- end;
- }
- if (@K_Menu0$[@num] == "-Use Guild Storage"){
- callfunc "F_KafStor",1;
- next;
- goto M_Menu;
- }
-
-}
-
-
-// Storage Function =======================================================
-function script F_KafStor {
- if(getarg(0) == 1){
- if(guildopenstorage(0) == 1){
- mes "[Kafra]";
- mes "I'm sorry but another guild member is using the guild storage";
- mes "right now. Please wait until that person is finished.";
- close2;
- cutin "", 255;
- end;
- }
- cutin "", 255;
- close;
- }
- if(basicskillcheck(0) && getskilllv(1) < 6){
- mes "[Kafra]";
- mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage.";
- return;
- }
- //don't charge for common storage in Castle
- if(getarg(0) != 2){
- //we'll use Free Ticket for Kafra Storage if available
- if(countitem(7059)){
- delitem 7059,1;
- } else {
- if(Zeny<40){
- mes "[Kafra]";
- mes "Dear you don't have enough money. The Storage fee is 40 Zeny.";
- return;
- }
- set Zeny, Zeny-40;
- set RESRVPTS, RESRVPTS + (40/5);
- }
- }
- mes "[Kafra]";
- mes "Close this window to open your storage.";
- mes "We hope to see you again soon.";
-
- callfunc("F_CheckKafCode"); //check your storage password, if set
-
- close2;
- openstorage;
- cutin "", 255;
- end;
-}
-
-
-// Teleport Function ==================================================
-function script F_KafTele {
- mes "[Kafra]";
- mes "Please set your destination.";
- next;
-
- menu @wrpC$[0],M_Wrp0, @wrpC$[1],M_Wrp1, @wrpC$[2],M_Wrp2, @wrpC$[3],M_Wrp3,
- @wrpC$[4],M_Wrp4, @wrpC$[5],M_Wrp5, @wrpC$[6],M_Wrp6;
-
- M_Wrp0:
- set @num, 0;
- goto L_Warp;
- M_Wrp1:
- set @num, 1;
- goto L_Warp;
- M_Wrp2:
- set @num, 2;
- goto L_Warp;
- M_Wrp3:
- set @num, 3;
- goto L_Warp;
- M_Wrp4:
- set @num, 4;
- goto L_Warp;
- M_Wrp5:
- set @num, 5;
- goto L_Warp;
- M_Wrp6:
- set @num, 6;
-
- L_Warp:
- if (@wrpC$[@num] == "Cancel") return;
- // we'll use Free Ticket for Kafra Transportation if available
- if(countitem(7060)){
- delitem 7060,1;
- } else {
- if (Zeny<@wrpP[@num]){
- mes "[Kafra]";
- mes "Dear you don't have enough money. Please check your funds again.";
- emotion e_cash;
- close2;
- cutin "", 255;
- end;
- }
- set Zeny, Zeny-@wrpP[@num];
- set RESRVPTS, RESRVPTS + (@wrpP[@num]/16);
- }
- if (@wrpD$[@num] == "Alberta") warp "alberta.gat", 117, 56;
- if (@wrpD$[@num] == "Al De Baran") warp "aldebaran.gat",143,110;
- if (@wrpD$[@num] == "Aldebaran") warp "aldebaran.gat",143,110;
- if (@wrpD$[@num] == "Comodo") warp "comodo.gat", 207, 144;
- if (@wrpD$[@num] == "Izlude") warp "izlude.gat", 91, 105;
- if (@wrpD$[@num] == "Geffen") warp "geffen.gat", 120, 39;
- if (@wrpD$[@num] == "Morroc") warp "morocc.gat", 156, 46;
- if (@wrpD$[@num] == "Payon") warp "payon.gat", 168, 103;
- if (@wrpD$[@num] == "Prontera") warp "prontera.gat", 116, 72;
- if (@wrpD$[@num] == "Coal Mine(Dead Pit)") warp "mjolnir_02.gat", 82, 347;
- if (@wrpD$[@num] == "Comodo Pharos Lighthouse") warp "cmd_fild07.gat", 127, 134;
- if (@wrpD$[@num] == "Orc Dungeon") warp "gef_fild10.gat", 52, 326;
- if (@wrpD$[@num] == "Umbala") warp "umbala.gat", 130, 130;
- if (@wrpD$[@num] == "Yuno") warp "yuno.gat", 157, 123;
- cutin "", 255;
- end;
-}
-
-
-// Cart Function ========================================================
-function script F_KafCart {
- if(baseClass != Job_Merchant){
- mes "[Kafra]";
- mes "I'm sorry dear. The Cart service is only provided for the Merchant and Blacksmith Class.";
- return 1;
- }
- if(getskilllv(39)==0){
- mes "[Kafra]";
- mes "I'm sorry but you need the skill ^0000FF'Pushcart'^000000 to rent a cart.";
- return 1;
- }
- if(checkcart(0) == 1){
- mes "[Kafra]";
- mes "Excuse me... but you already have a cart....";
- emotion e_swt;
- return 1;
- }
- //get Cart in Guild for free
- if(getarg(0) == 2) goto L_FreeCart;
- //use Free Ticket for the Cart Service if available
- if(countitem(7061)){
- delitem 7061,1;
- goto L_FreeCart;
- }
- mes "[Kafra]";
- mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
- next;
- menu "-Rent a Cart.",-, "-Cancel.",M_End;
-
- if(Zeny<800){
- mes "[Kafra]";
- mes "Dear, you don't have enough Money. You need 800 Zeny.";
- emotion e_cash;
- return 1;
- }
- set Zeny,Zeny-800;
- set RESRVPTS, RESRVPTS + 48;
- L_FreeCart:
- setcart;
- mes "[Kafra]";
- mes "Here is your cart.";
- return 1;
- M_End:
- return 0;
-}
-
-
-// Pass Function ===============================================================
-function script F_KafGuide {
-
- mes "[Kafra]";
- mes "WIP...";
- return;
-}
-
-// Special Reserve Points Function ===========================================
-function script F_KafInfo {
-
- sM_Menu:
-//Uncomment next line to block Kafra Storage Protection
-// if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-Kafra Locations",sM_KafLoc, "-Cancel",sM_End;
- if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-Storage Password Service",sM_KafCode, "-Kafra Locations",sM_KafLoc, "-Cancel",sM_End;
-
- sM_ResChk:
- mes "[Kafra]";
- mes "Here is your current amount of special reserve points:";
- mes "^0000ff"+RESRVPTS+"^000000.";
- next;
- mes "[Kafra]";
- mes "Remember to continue using Kafra services such as Storage and Teleport, to earn more special reserve points.";
- next;
- mes "[Kafra]";
- mes "You can trade them in at the Kafra Main Office in Al De Baran for useful items and cool prizes.";
- next;
- if(getarg(0) == 1) return;
- goto sM_Menu;
- sM_KafLoc:
- mes "[Kafra]";
- mes "The flashing signals on your mini-map point to the locations of all of the Kafra Agents in this city.";
- viewpoint 1,@viewpX[0],@viewpY[0],1,0xFF00FF;
- viewpoint 1,@viewpX[1],@viewpY[1],2,0xFF00FF;
- viewpoint 1,@viewpX[2],@viewpY[2],3,0xFF00FF;
- viewpoint 1,@viewpX[3],@viewpY[3],4,0xFF00FF;
- next;
- viewpoint 2,@viewpX[0],@viewpY[0],1,0xFF00FF;
- viewpoint 2,@viewpX[1],@viewpY[1],2,0xFF00FF;
- viewpoint 2,@viewpX[2],@viewpY[2],3,0xFF00FF;
- viewpoint 2,@viewpX[3],@viewpY[3],4,0xFF00FF;
- goto sM_Menu;
-
- sM_KafCode:
- callfunc("F_SetKafCode");
-
- sM_End:
- return;
-}
-
-
-// End Function =====================================================
-// arg(0): used to determine what message to display.
-// arg(1): used to determine if save message is displayed.
-//===================================================================
-function script F_KafEnd {
- mes "[Kafra]";
- if(getarg(1)==1) mes "Your respawn point has been saved."; // only shown when a player uses save
- if(getarg(0)!=1) mes "Thank you for using Kafra Services. We hope to see you again soon.";
- if(getarg(0)==1) mes "We, Kafra Corporation.... Will be with you.... whenever.... wherever... therefore.... please don't forget us.....";
- close2;
- cutin "", 255;
- emotion e_thx;
- close;
- end;
-}
-
-// Check Storage Password Function ====================
-function script F_CheckKafCode {
- if(#kafra_code==0) return;
- mes "Enter your storage password:";
- set @code_,0;
- input @code_;
- if(@code_ != #kafra_code-getcharid(3)-1337) {
- dispbottom "Wrong storage password.";
- close2;
- cutin "",255;
- end;
- }
- set @kafcode_try,0;
- set @code_,0;
- return;
-}
-
-// Set / Change / Clear Storage Password Function ====================
-function script F_SetKafCode {
- mes "[Kafra]";
- if(#kafra_code) {
- mes "Your storage is protected with a password. What would you do now?";
- next;
- menu "Change old password -> 5000z",-,
- "Remove storage password -> 1000z",M_CLEAR,
- "Cancel",M_END;
- } else {
- mes "Kafra Services proudly presents you a new service:";
- mes "Additional storage protection with a password.";
- next;
- menu "Set new password -> 5000z",M_SET,
- "Cancel",M_END;
- }
-
- mes "[Kafra]";
- mes "At first, please enter your ^0000FFold password^000000.";
- set @code,callfunc("F_EntKafCode");
- if(@code==0 || @code != #kafra_code-getcharid(3)-1337) {
- mes "Wrong password. You can't set a new password.";
- emotion e_hmm;
- goto M_END;
- }
- next;
-
-M_SET:
- mes "[Kafra]";
- mes "Now enter your ^FF0000new password^000000 to protect your storage from thieves.";
- set @code,callfunc("F_EntKafCode");
- if(@code==0) {
- mes "The password hasn't been changed.";
- emotion e_hmm;
- goto M_END;
- }
- next;
- mes "[Kafra]";
- if(Zeny < 5000) goto L_ZENY;
- set Zeny,Zeny-5000;
- set RESRVPTS, RESRVPTS + (5000/50);
-
- set #kafra_code,@code+getcharid(3)+1337;
- mes "You've protected your storage with a secret password.";
- mes "Thank you for using Kafra Services.";
- emotion e_thx;
- goto M_END;
-
-M_CLEAR:
- mes "[Kafra]";
- mes "Please, enter your password before its removal.";
- set @code,callfunc("F_EntKafCode");
- if(@code==0) {
- mes "The password hasn't been removed.";
- emotion e_hmm;
- goto M_END;
- }
- next;
- mes "[Kafra]";
- if(Zeny < 1000) goto L_ZENY;
- set Zeny,Zeny-1000;
- set RESRVPTS, RESRVPTS + (1000/50);
- if(@code == #kafra_code-getcharid(3)-1337) {
- set #kafra_code,0;
- mes "You've successfully cleared your storage password.";
- mes "Thank you for using Kafra Services.";
- emotion e_thx;
- } else {
- mes "Wrong password. We won't return your 1000z.";
- mes "Please, next time enter correct password.";
- emotion e_sry;
- }
- goto M_END;
-
-L_ZENY:
- mes "You don't have enough zeny.";
- emotion e_cash;
-M_END:
- close2;
- cutin "",255;
- end;
-}
-
-// Basic Password Validation Function ====================
-function script F_EntKafCode {
- mes "Enter a number 1000~10000000:";
- set @code_,0;
- set @kafcode_try,@kafcode_try+1;
- if(@kafcode_try>10) {
- set @kafcode_try,0;
- logmes "Hack: Tried to fit storage password.";
- }
- input @code_;
- if(@code_<1000) {
- mes "You shouldn't use such short password.";
- return 0;
- }
- if(@code_>10000000) {
- mes "You can't use such big password.";
- return 0;
- }
- return @code_;
-}
+//===== eAthena Script =======================================
+//= Kafra Functions
+//===== By: ==================================================
+//= eAthena Dev Team
+//= Darlskies, Darkchild, Syrus22, Lupus, kobra_k88 (2.0)
+//===== Current Version: =====================================
+//= 5.4b
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= These functions handle save, storage, cart rental, teleport,
+//= and Free Teleport/Warp/Rent Cart options for all Kafra NPCs.
+//===== Additional Comments: =================================
+//= v1.1 Now using functions v2.1 Added Cart Rent for Classes: Whitesmith, Professor.
+//= Replaced checkoption(x) into checkcart(0) [Lupus] v2.1b Added Fix Kafra Pass Func [Kobra_k88]
+//= 2.2 Final fix of the Kafra Pass Exploit! [Lupus] a -Izlude[4] fix
+//= 2.2a Minor changes to function calls. Using agruments. Added Guild options. [kobra_k88]
+//= 2.2b This version uses arrays for the teleport option. Rearranged next statements to make menu transitions smoother. [kobra_k88]
+//= 2.3 Removed SAVE from Niflheim. [Lupus]
+//= 2.3 removed "fix" by HawkMoon RTFM and check supernovice.txt . There's a SPECIAL Kafra which gives CARTS to SN for a special proce. [Lupus]
+//= 2.4 Added Baby Class Support (Baby Novice check) Removed annoying storage feature where u had to close dialog window to be able to use your storage [Lupus]
+//= 2.5 Added Louyang official Kafra, fixes some Kafras, not letting you to Save your position [Lupus]
+//= 2.6 Reverted Dungeons Kafras (they should offer only Storage). Added temp Ayothaya Kafra
+//= 2.7 Added correct Ayothaya, Louyang & Amatsu Kafras. [Lupus]
+//= 2.8 Fixed Amatsu Storage problems [Lupus] 2.9 Fixed spelling mistakes. [Nexon]
+//= 3.0 Added special "not working teleport menu" for Einbroch Kafras [Lupus]
+//= 3.1 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 3.2 Fixed an exploit [Lupus]
+//= 4.0 Added Kafra storage password protection. [Lupus]
+//= to block Kafra Password, read comments at 350 line
+//= Note: You can change '1337' value to another to raise password protection
+//= 5.0 Fixed the close2;....close; end; lines. Who let them slip away? =/ [erKURITA]
+//= Also, the kafra upon warp was giving back the zeny. Removed. [erKURITA]
+//= 5.1 Optimized a little, added no tele/save arg's [Evera]
+//= 5.1a Temporary? Added F_ClearGarbage to clear unused/outdated variables [Lupus]
+//= 5.2 By default commented out custom Guilds Kafra's "Guild Storage". [Lupus]
+//= 5.3 uncommented Guild Storage. Confirmed kRO feature. [Lupus]
+//= 5.4 added -Guide option (Kafra shows you nearest Guide) Work in progress.
+//= Need all coords for all guides.. and somehow pass their coords to kafra.
+//= Removed universal Kafra Pass, added 3 new Kafra Tickets [Lupus]
+//= 5.4b temporary moved "-Guide" from the 1st menu punct [Lupus]
+//============================================================
+
+
+// Main Function ===========================================================
+//= arg(0): Used to determine which welcome message to show.
+//= arg(1): Used to determine which menu to display.
+//= arg(2): Used to determine if the info menu is shown in F_KafInfo.
+//==========================================================================
+function script F_Kafra {
+ callfunc "F_ClearGarbage"; //Clear outdated, unused variables
+
+ mes "[Kafra]";
+ switch(getarg(0)){
+ default:
+ case 0:
+ mes "Welcome to Kafra Corp. We will stay with you wherever you go.";
+ break;
+ //Niflheim
+ case 1:
+ mes "Welcome... Kafra Services.... Will be with you even if you die.....";
+ break;
+ //Guilds Castles
+ case 2:
+ mes "Welcome, ^5533FF" + GetGuildName(@GID) + "^000000 members. We will stay with you wherever you go";
+ break;
+ //Amatsu
+ case 3:
+ mes "So, have you come from a faraway land to study our culture, or are you just sightseeing?";
+ mes "In either case, why not stay awhile?";
+ mes "The air is eternally heavy with the";
+ mes "scent of pleasant wildflowers.";
+ break;
+ //Louyang, Ayothaya
+ case 4:
+ mes "With our many Kafra";
+ mes "service locations, you're never";
+ mes "far from home.";
+ break;
+ }
+ next;
+
+ M_Menu:
+ cleararray @K_Menu0$[0],"",7;
+ switch(getarg(1)){
+ //only Save & Storage
+ case 1:
+ setarray @K_Menu0$[0],"-Save","-Use Storage","-Cancel";
+ break;
+ //only Storage
+ case 2:
+ setarray @K_Menu0$[0],"-Use Storage","-Cancel";
+ break;
+ //Common w/o teleport
+ case 3:
+ setarray @K_Menu0$[0],"-Save","-Use Storage","-Rent a Cart","-Guide","-Other Information Check","-Cancel";
+ break;
+ //Case 4 is Einbroch no tele message.
+ //Common w/o save and teleport
+ case 5:
+ setarray @K_Menu0$[0],"-Use Storage","-Rent a Cart","-Other Information Check","-Guide","-Cancel";
+ break;
+ //Only storage and other info check
+ case 6:
+ setarray @K_Menu0$[0],"-Use Storage","-Guide","-Other Information Check","-Cancel";
+ break;
+ //Common Kafra
+ default:
+ setarray @K_Menu0$[0],"-Save","-Use Storage","-Use Teleport Service","-Rent a Cart","-Guide","-Other Information Check","-Cancel";
+ break;
+ }
+ if(getarg(0)==2) {
+ //Guilds Kafra (free Teleport, free Storage, Free Cart)
+ cleararray @K_Menu0$[0],"",7;
+ setarray @K_Menu0$[0],"-Use Storage","-Use Guild Storage","-Rent a Cart","-Use Teleport Service","-Cancel";
+ }
+ menu @K_Menu0$[0],K_Menu0,@K_Menu0$[1],K_Menu1,@K_Menu0$[2],K_Menu2,
+ @K_Menu0$[3],K_Menu3,@K_Menu0$[4],K_Menu4,@K_Menu0$[5],K_Menu5,
+ @K_Menu0$[6],K_Menu6,@K_Menu0$[7],K_Menu7;
+ K_Menu0:
+ set @num,0;
+ goto K_Menuf;
+ K_Menu1:
+ set @num,1;
+ goto K_Menuf;
+ K_Menu2:
+ set @num,2;
+ goto K_Menuf;
+ K_Menu3:
+ set @num,3;
+ goto K_Menuf;
+ K_Menu4:
+ set @num,4;
+ goto K_Menuf;
+ K_Menu5:
+ set @num,5;
+ goto K_Menuf;
+ K_Menu6:
+ set @num,6;
+ goto K_Menuf;
+ K_Menu7:
+ set @num,7;
+ K_Menuf:
+ if (@K_Menu0$[@num] == "-Save") return;
+ if (@K_Menu0$[@num] == "-Use Storage"){
+ //Don't charge for a common Kafra Storage in your Castle
+ if(getarg(0) == 2) callfunc "F_KafStor",2;
+ else callfunc "F_KafStor",0;
+ next;
+ goto M_Menu;
+ }
+ if (@K_Menu0$[@num] == "-Use Teleport Service"){
+ if(getarg(1) == 4){ //Check for Einbroch Tele notice
+ mes "[Kafra]";
+ mes "Because of the ^FF0000Limited Transport Agreement^000000, the Kafra Corporation cannot provide Teleport Services in the Schwarzwald Republic.";
+ next;
+ mes "[Kafra]";
+ mes "We ask that you please";
+ mes "use the Airship Service";
+ mes "instead. Thank you for your";
+ mes "understanding and cooperation.";
+ next;
+ goto M_Menu;
+ }
+ callfunc "F_KafTele",getarg(0);
+ goto M_Menu;
+ }
+ if (@K_Menu0$[@num] == "-Rent a Cart"){
+ if(callfunc("F_KafCart",getarg(0)) == 1) next;
+ goto M_Menu;
+ }
+ if (@K_Menu0$[@num] == "-Guide"){
+ callfunc "F_KafGuide";
+ next;
+ goto M_Menu;
+ }
+ if (@K_Menu0$[@num] == "-Other Information Check"){
+ callfunc "F_KafInfo",getarg(2);
+ goto M_Menu;
+ }
+ if (@K_Menu0$[@num] == "-Cancel"){
+ callfunc "F_KafEnd",getarg(0),0;
+ end;
+ }
+ if (@K_Menu0$[@num] == "-Use Guild Storage"){
+ callfunc "F_KafStor",1;
+ next;
+ goto M_Menu;
+ }
+
+}
+
+
+// Storage Function =======================================================
+function script F_KafStor {
+ if(getarg(0) == 1){
+ if(guildopenstorage(0) == 1){
+ mes "[Kafra]";
+ mes "I'm sorry but another guild member is using the guild storage";
+ mes "right now. Please wait until that person is finished.";
+ close2;
+ cutin "", 255;
+ end;
+ }
+ cutin "", 255;
+ close;
+ }
+ if(basicskillcheck(0) && getskilllv(1) < 6){
+ mes "[Kafra]";
+ mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage.";
+ return;
+ }
+ //don't charge for common storage in Castle
+ if(getarg(0) != 2){
+ //we'll use Free Ticket for Kafra Storage if available
+ if(countitem(7059)){
+ delitem 7059,1;
+ } else {
+ if(Zeny<40){
+ mes "[Kafra]";
+ mes "Dear you don't have enough money. The Storage fee is 40 Zeny.";
+ return;
+ }
+ set Zeny, Zeny-40;
+ set RESRVPTS, RESRVPTS + (40/5);
+ }
+ }
+ mes "[Kafra]";
+ mes "Close this window to open your storage.";
+ mes "We hope to see you again soon.";
+
+ callfunc("F_CheckKafCode"); //check your storage password, if set
+
+ close2;
+ openstorage;
+ cutin "", 255;
+ end;
+}
+
+
+// Teleport Function ==================================================
+function script F_KafTele {
+ mes "[Kafra]";
+ mes "Please set your destination.";
+ next;
+
+ menu @wrpC$[0],M_Wrp0, @wrpC$[1],M_Wrp1, @wrpC$[2],M_Wrp2, @wrpC$[3],M_Wrp3,
+ @wrpC$[4],M_Wrp4, @wrpC$[5],M_Wrp5, @wrpC$[6],M_Wrp6;
+
+ M_Wrp0:
+ set @num, 0;
+ goto L_Warp;
+ M_Wrp1:
+ set @num, 1;
+ goto L_Warp;
+ M_Wrp2:
+ set @num, 2;
+ goto L_Warp;
+ M_Wrp3:
+ set @num, 3;
+ goto L_Warp;
+ M_Wrp4:
+ set @num, 4;
+ goto L_Warp;
+ M_Wrp5:
+ set @num, 5;
+ goto L_Warp;
+ M_Wrp6:
+ set @num, 6;
+
+ L_Warp:
+ if (@wrpC$[@num] == "Cancel") return;
+ // we'll use Free Ticket for Kafra Transportation if available
+ if(countitem(7060)){
+ delitem 7060,1;
+ } else {
+ if (Zeny<@wrpP[@num]){
+ mes "[Kafra]";
+ mes "Dear you don't have enough money. Please check your funds again.";
+ emotion e_cash;
+ close2;
+ cutin "", 255;
+ end;
+ }
+ set Zeny, Zeny-@wrpP[@num];
+ set RESRVPTS, RESRVPTS + (@wrpP[@num]/16);
+ }
+ if (@wrpD$[@num] == "Alberta") warp "alberta.gat", 117, 56;
+ if (@wrpD$[@num] == "Al De Baran") warp "aldebaran.gat",143,110;
+ if (@wrpD$[@num] == "Aldebaran") warp "aldebaran.gat",143,110;
+ if (@wrpD$[@num] == "Comodo") warp "comodo.gat", 207, 144;
+ if (@wrpD$[@num] == "Izlude") warp "izlude.gat", 91, 105;
+ if (@wrpD$[@num] == "Geffen") warp "geffen.gat", 120, 39;
+ if (@wrpD$[@num] == "Morroc") warp "morocc.gat", 156, 46;
+ if (@wrpD$[@num] == "Payon") warp "payon.gat", 168, 103;
+ if (@wrpD$[@num] == "Prontera") warp "prontera.gat", 116, 72;
+ if (@wrpD$[@num] == "Coal Mine(Dead Pit)") warp "mjolnir_02.gat", 82, 347;
+ if (@wrpD$[@num] == "Comodo Pharos Lighthouse") warp "cmd_fild07.gat", 127, 134;
+ if (@wrpD$[@num] == "Orc Dungeon") warp "gef_fild10.gat", 52, 326;
+ if (@wrpD$[@num] == "Umbala") warp "umbala.gat", 130, 130;
+ if (@wrpD$[@num] == "Yuno") warp "yuno.gat", 157, 123;
+ cutin "", 255;
+ end;
+}
+
+
+// Cart Function ========================================================
+function script F_KafCart {
+ if(baseClass != Job_Merchant){
+ mes "[Kafra]";
+ mes "I'm sorry dear. The Cart service is only provided for the Merchant and Blacksmith Class.";
+ return 1;
+ }
+ if(getskilllv(39)==0){
+ mes "[Kafra]";
+ mes "I'm sorry but you need the skill ^0000FF'Pushcart'^000000 to rent a cart.";
+ return 1;
+ }
+ if(checkcart(0) == 1){
+ mes "[Kafra]";
+ mes "Excuse me... but you already have a cart....";
+ emotion e_swt;
+ return 1;
+ }
+ //get Cart in Guild for free
+ if(getarg(0) == 2) goto L_FreeCart;
+ //use Free Ticket for the Cart Service if available
+ if(countitem(7061)){
+ delitem 7061,1;
+ goto L_FreeCart;
+ }
+ mes "[Kafra]";
+ mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
+ next;
+ menu "-Rent a Cart.",-, "-Cancel.",M_End;
+
+ if(Zeny<800){
+ mes "[Kafra]";
+ mes "Dear, you don't have enough Money. You need 800 Zeny.";
+ emotion e_cash;
+ return 1;
+ }
+ set Zeny,Zeny-800;
+ set RESRVPTS, RESRVPTS + 48;
+ L_FreeCart:
+ setcart;
+ mes "[Kafra]";
+ mes "Here is your cart.";
+ return 1;
+ M_End:
+ return 0;
+}
+
+
+// Pass Function ===============================================================
+function script F_KafGuide {
+
+ mes "[Kafra]";
+ mes "WIP...";
+ return;
+}
+
+// Special Reserve Points Function ===========================================
+function script F_KafInfo {
+
+ sM_Menu:
+//Uncomment next line to block Kafra Storage Protection
+// if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-Kafra Locations",sM_KafLoc, "-Cancel",sM_End;
+ if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-Storage Password Service",sM_KafCode, "-Kafra Locations",sM_KafLoc, "-Cancel",sM_End;
+
+ sM_ResChk:
+ mes "[Kafra]";
+ mes "Here is your current amount of special reserve points:";
+ mes "^0000ff"+RESRVPTS+"^000000.";
+ next;
+ mes "[Kafra]";
+ mes "Remember to continue using Kafra services such as Storage and Teleport, to earn more special reserve points.";
+ next;
+ mes "[Kafra]";
+ mes "You can trade them in at the Kafra Main Office in Al De Baran for useful items and cool prizes.";
+ next;
+ if(getarg(0) == 1) return;
+ goto sM_Menu;
+ sM_KafLoc:
+ mes "[Kafra]";
+ mes "The flashing signals on your mini-map point to the locations of all of the Kafra Agents in this city.";
+ viewpoint 1,@viewpX[0],@viewpY[0],1,0xFF00FF;
+ viewpoint 1,@viewpX[1],@viewpY[1],2,0xFF00FF;
+ viewpoint 1,@viewpX[2],@viewpY[2],3,0xFF00FF;
+ viewpoint 1,@viewpX[3],@viewpY[3],4,0xFF00FF;
+ next;
+ viewpoint 2,@viewpX[0],@viewpY[0],1,0xFF00FF;
+ viewpoint 2,@viewpX[1],@viewpY[1],2,0xFF00FF;
+ viewpoint 2,@viewpX[2],@viewpY[2],3,0xFF00FF;
+ viewpoint 2,@viewpX[3],@viewpY[3],4,0xFF00FF;
+ goto sM_Menu;
+
+ sM_KafCode:
+ callfunc("F_SetKafCode");
+
+ sM_End:
+ return;
+}
+
+
+// End Function =====================================================
+// arg(0): used to determine what message to display.
+// arg(1): used to determine if save message is displayed.
+//===================================================================
+function script F_KafEnd {
+ mes "[Kafra]";
+ if(getarg(1)==1) mes "Your respawn point has been saved."; // only shown when a player uses save
+ if(getarg(0)!=1) mes "Thank you for using Kafra Services. We hope to see you again soon.";
+ if(getarg(0)==1) mes "We, Kafra Corporation.... Will be with you.... whenever.... wherever... therefore.... please don't forget us.....";
+ close2;
+ cutin "", 255;
+ emotion e_thx;
+ close;
+ end;
+}
+
+// Check Storage Password Function ====================
+function script F_CheckKafCode {
+ if(#kafra_code==0) return;
+ mes "Enter your storage password:";
+ set @code_,0;
+ input @code_;
+ if(@code_ != #kafra_code-getcharid(3)-1337) {
+ dispbottom "Wrong storage password.";
+ close2;
+ cutin "",255;
+ end;
+ }
+ set @kafcode_try,0;
+ set @code_,0;
+ return;
+}
+
+// Set / Change / Clear Storage Password Function ====================
+function script F_SetKafCode {
+ mes "[Kafra]";
+ if(#kafra_code) {
+ mes "Your storage is protected with a password. What would you do now?";
+ next;
+ menu "Change old password -> 5000z",-,
+ "Remove storage password -> 1000z",M_CLEAR,
+ "Cancel",M_END;
+ } else {
+ mes "Kafra Services proudly presents you a new service:";
+ mes "Additional storage protection with a password.";
+ next;
+ menu "Set new password -> 5000z",M_SET,
+ "Cancel",M_END;
+ }
+
+ mes "[Kafra]";
+ mes "At first, please enter your ^0000FFold password^000000.";
+ set @code,callfunc("F_EntKafCode");
+ if(@code==0 || @code != #kafra_code-getcharid(3)-1337) {
+ mes "Wrong password. You can't set a new password.";
+ emotion e_hmm;
+ goto M_END;
+ }
+ next;
+
+M_SET:
+ mes "[Kafra]";
+ mes "Now enter your ^FF0000new password^000000 to protect your storage from thieves.";
+ set @code,callfunc("F_EntKafCode");
+ if(@code==0) {
+ mes "The password hasn't been changed.";
+ emotion e_hmm;
+ goto M_END;
+ }
+ next;
+ mes "[Kafra]";
+ if(Zeny < 5000) goto L_ZENY;
+ set Zeny,Zeny-5000;
+ set RESRVPTS, RESRVPTS + (5000/50);
+
+ set #kafra_code,@code+getcharid(3)+1337;
+ mes "You've protected your storage with a secret password.";
+ mes "Thank you for using Kafra Services.";
+ emotion e_thx;
+ goto M_END;
+
+M_CLEAR:
+ mes "[Kafra]";
+ mes "Please, enter your password before its removal.";
+ set @code,callfunc("F_EntKafCode");
+ if(@code==0) {
+ mes "The password hasn't been removed.";
+ emotion e_hmm;
+ goto M_END;
+ }
+ next;
+ mes "[Kafra]";
+ if(Zeny < 1000) goto L_ZENY;
+ set Zeny,Zeny-1000;
+ set RESRVPTS, RESRVPTS + (1000/50);
+ if(@code == #kafra_code-getcharid(3)-1337) {
+ set #kafra_code,0;
+ mes "You've successfully cleared your storage password.";
+ mes "Thank you for using Kafra Services.";
+ emotion e_thx;
+ } else {
+ mes "Wrong password. We won't return your 1000z.";
+ mes "Please, next time enter correct password.";
+ emotion e_sry;
+ }
+ goto M_END;
+
+L_ZENY:
+ mes "You don't have enough zeny.";
+ emotion e_cash;
+M_END:
+ close2;
+ cutin "",255;
+ end;
+}
+
+// Basic Password Validation Function ====================
+function script F_EntKafCode {
+ mes "Enter a number 1000~10000000:";
+ set @code_,0;
+ set @kafcode_try,@kafcode_try+1;
+ if(@kafcode_try>10) {
+ set @kafcode_try,0;
+ logmes "Hack: Tried to fit storage password.";
+ }
+ input @code_;
+ if(@code_<1000) {
+ mes "You shouldn't use such short password.";
+ return 0;
+ }
+ if(@code_>10000000) {
+ mes "You can't use such big password.";
+ return 0;
+ }
+ return @code_;
+}
diff --git a/npc/kafras/kafras_alb.txt b/npc/kafras/kafras_alb.txt
index c6eb00b21..3a9adad90 100644
--- a/npc/kafras/kafras_alb.txt
+++ b/npc/kafras/kafras_alb.txt
@@ -1,60 +1,60 @@
-//===== eAthena Script ============
-//= Alberta Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.3
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 New Teleport list and prices [Lupus]
-//= 2.3 Can't save outside city anymore [Evera]
-//=====================================================================
-
-
-// NorthWest -----------------------------------------------------------------
-alberta.gat,28,229,8 script Kafra::kaf_alberta 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetAlb";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "alberta.gat",31,231;
- callfunc "F_KafEnd",0,1;
-}
-
-// South ---------------------------------------------------------------------
-alberta.gat,113,60,5 script Kafra::kaf_alberta2 112,{
- cutin "kafra_06",2;
- callfunc "F_KafSetAlb";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "alberta.gat",117,57;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Ablerta Kafras -------------------------------
-function script F_KafSetAlb {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpP[0], 1200, 1800, 1800;
- setarray @wrpD$[0], "Payon", "Morroc", "Prontera";
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], "Cancel";
- setarray @viewpX[0], 28, 113, 0, 0;
- setarray @viewpY[0], 229, 60, 0, 0;
- return;
-}
+//===== eAthena Script ============
+//= Alberta Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.3
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 New Teleport list and prices [Lupus]
+//= 2.3 Can't save outside city anymore [Evera]
+//=====================================================================
+
+
+// NorthWest -----------------------------------------------------------------
+alberta.gat,28,229,8 script Kafra::kaf_alberta 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetAlb";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "alberta.gat",31,231;
+ callfunc "F_KafEnd",0,1;
+}
+
+// South ---------------------------------------------------------------------
+alberta.gat,113,60,5 script Kafra::kaf_alberta2 112,{
+ cutin "kafra_06",2;
+ callfunc "F_KafSetAlb";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "alberta.gat",117,57;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Ablerta Kafras -------------------------------
+function script F_KafSetAlb {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpP[0], 1200, 1800, 1800;
+ setarray @wrpD$[0], "Payon", "Morroc", "Prontera";
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], "Cancel";
+ setarray @viewpX[0], 28, 113, 0, 0;
+ setarray @viewpY[0], 229, 60, 0, 0;
+ return;
+}
diff --git a/npc/kafras/kafras_alde.txt b/npc/kafras/kafras_alde.txt
index 48914eac3..f50956ce9 100644
--- a/npc/kafras/kafras_alde.txt
+++ b/npc/kafras/kafras_alde.txt
@@ -1,51 +1,51 @@
-//===== eAthena Script =======================================
-//= Al De Baran Kafras
-//===== By: ============================
-//= eAthena Dev Team
-//===== Current Version: =======================
-//= 2.2
-//===== Compatible With: ============================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 New teleport destinations, prices [Lupus]
-//=====================================================================
-
-
-// Kafra Main Office (Kafra Leilah) ------------------------------------
-aldeba_in.gat,96,181,4 script Kafra Leilah 113,{
- cutin "kafra_05",2;
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "aldeba_in.gat",96,179;
- callfunc "F_KafEnd",0,1;
-
-}
-
-// South --------------------------------------------------
-aldebaran.gat,143,119,4 script Kafra::kaf_aldebaran 113,{
- cutin "kafra_05",2;
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpP[0], 1200, 1200, 1800, 1700;
- setarray @wrpD$[0], "Geffen", "Yuno" , "Izlude", "Coal Mine(Dead Pit)";
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
- set @wrpC$[4], "Cancel";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "aldebaran.gat",143,109;
- callfunc "F_KafEnd",0,1;
-}
+//===== eAthena Script =======================================
+//= Al De Baran Kafras
+//===== By: ============================
+//= eAthena Dev Team
+//===== Current Version: =======================
+//= 2.2
+//===== Compatible With: ============================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 New teleport destinations, prices [Lupus]
+//=====================================================================
+
+
+// Kafra Main Office (Kafra Leilah) ------------------------------------
+aldeba_in.gat,96,181,4 script Kafra Leilah 113,{
+ cutin "kafra_05",2;
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "aldeba_in.gat",96,179;
+ callfunc "F_KafEnd",0,1;
+
+}
+
+// South --------------------------------------------------
+aldebaran.gat,143,119,4 script Kafra::kaf_aldebaran 113,{
+ cutin "kafra_05",2;
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpP[0], 1200, 1200, 1800, 1700;
+ setarray @wrpD$[0], "Geffen", "Yuno" , "Izlude", "Coal Mine(Dead Pit)";
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
+ set @wrpC$[4], "Cancel";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "aldebaran.gat",143,109;
+ callfunc "F_KafEnd",0,1;
+}
diff --git a/npc/kafras/kafras_com.txt b/npc/kafras/kafras_com.txt
index 2044a0822..e60332627 100644
--- a/npc/kafras/kafras_com.txt
+++ b/npc/kafras/kafras_com.txt
@@ -1,57 +1,57 @@
-//===== eAthena Script ===============
-//= Comodo Kafras
-//===== By: ============================
-//= eAthena Dev Team
-//===== Current Version: =======================
-//= 2.21
-//===== Compatible With: ============================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= Corrected savepoint for in town kafra.[kobra_k88]
-//= 2.2 New teleport destinations, prices [Lupus]
-//= 2.21 from Pharos, both warps are now 1200z [Evera]
-//=====================================================================
-
-
-// In Town ==============================================>\\
-comodo.gat,200,148,4 script Kafra::kaf_comodo 721,{
- cutin "kafra_07",2;
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Morroc", "Comodo Pharos Lighthouse", "Umbala";
- setarray @wrpP[0], 1800, 1200, 1800;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], "Cancel";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "comodo.gat",204,143;
- callfunc "F_KafEnd",0,1;
-}
-
-// Comodo Pharos Lighthouse (Beacon Island) ===================>\\
-cmd_fild07.gat,135,134,4 script Kafra::kaf_cmd_fild07 721,{
- cutin "kafra_07",2;
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Comodo", "Morroc";
- setarray @wrpP[0], 1200, 1200;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], "Cancel";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "cmd_fild07.gat",127,134;
- callfunc "F_KafEnd",0,1;
-}
+//===== eAthena Script ===============
+//= Comodo Kafras
+//===== By: ============================
+//= eAthena Dev Team
+//===== Current Version: =======================
+//= 2.21
+//===== Compatible With: ============================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= Corrected savepoint for in town kafra.[kobra_k88]
+//= 2.2 New teleport destinations, prices [Lupus]
+//= 2.21 from Pharos, both warps are now 1200z [Evera]
+//=====================================================================
+
+
+// In Town ==============================================>\\
+comodo.gat,200,148,4 script Kafra::kaf_comodo 721,{
+ cutin "kafra_07",2;
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Morroc", "Comodo Pharos Lighthouse", "Umbala";
+ setarray @wrpP[0], 1800, 1200, 1800;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], "Cancel";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "comodo.gat",204,143;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Comodo Pharos Lighthouse (Beacon Island) ===================>\\
+cmd_fild07.gat,135,134,4 script Kafra::kaf_cmd_fild07 721,{
+ cutin "kafra_07",2;
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Comodo", "Morroc";
+ setarray @wrpP[0], 1200, 1200;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], "Cancel";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "cmd_fild07.gat",127,134;
+ callfunc "F_KafEnd",0,1;
+}
diff --git a/npc/kafras/kafras_dungeons.txt b/npc/kafras/kafras_dungeons.txt
index 818cda95b..dcddfc753 100644
--- a/npc/kafras/kafras_dungeons.txt
+++ b/npc/kafras/kafras_dungeons.txt
@@ -1,117 +1,117 @@
-//===== eAthena Script ================
-//= Kafras in Dungeons and Fields
-//===== By: ============================
-//= eAthena Dev Team
-//===== Current Version: =======================
-//= 2.5
-//===== Compatible With: ============================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: =================================
-//= v1.1 Now using functions. Added teleport service for Orc Dungeon
-//= and Coal Mine Kafras.
-//= v2.1 Fixed bug with Merc job quest kafra.[Lupus]
-//= v2.1b Minor changes to function calls. Using arguments.
-//= Added ant hell kafras. This version uses arrays .[kobra_k88]
-//= Fixed Kafras, not giving you Save menu [Lupus]
-//= 2.3 Removed SAVE menu from dungeons Kafras [Lupus]
-//= 2.4 Now Baby Merchant can pass Merch Job Quest w/o probs [Lupus]
-//= 2.41 Removed useless warp points, already nullified by func call [Evera]
-//= 2.5 Allowed Culvert save point [Evera]
-//===============================================================
-
-
-//<============================= Ant Hell ==============================>\\
-// Mocfild04 -----------------------------------------
-moc_fild04.gat,230,329,3 script Kafra::kaf_moc_fild04 115,{
-
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "moc_fild04.gat",231,339;
- callfunc "F_KafEnd",0,1;
-}
-
-// Mocfild15 --------------------------------------------
-moc_fild15.gat,264,260,3 script Kafra::kaf_moc_fild15 115,{
-
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "moc_fild15.gat",266,271;
- callfunc "F_KafEnd",0,1;
-}
-
-//<============================= Byalan Island ============================>\\
-izlu2dun.gat,106,58,8 script Kafra::kaf_izlu2dun 115,{
-
- cutin "kafra_03",2;
- if(BaseJob==Job_Novice && job_merchant_q3>0) callfunc "F_MercKafra"; //F_MercKafra found in merchant.txt
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "izlu2dun.gat",87,170;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<============================ Culvert Sewers ============================>\\
-prt_fild05.gat,290,224,1 script Kafra::prt_fild05 114,{
- cutin "kafra_04",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "prt_fild05.gat",274,243;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<=========================== Coal Mine (Dead Pitt) =======================>\\
-mjolnir_02.gat,83,361,4 script Kafra::kaf_mjolnir_02 114,{
- cutin "kafra_04",2;
- callfunc "F_Kafra",0,6,1;
-
- M_Save:
- savepoint "mjolnir_02.gat",98,352;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<=============================== Morroc Ruins ============================>\\
-moc_ruins.gat,61,156,5 script Kafra::moc_ruins 114,{
- cutin "kafra_04",2;
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "moc_ruins.gat",41,141;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<================================ Orc Dungeon ============================>\\
-gef_fild10.gat,73,340,4 script Kafra::kaf_gef_fild10 115,{
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,6,1;
-
- M_Save:
- savepoint "gef_fild10.gat",54,326;
- callfunc "F_KafEnd",0,1;
-}
-
-//<============================== Treasure Island ==========================>\\
-alb2trea.gat,59,69,1 script Kafra::kaf_alb2trea 117,{
- cutin "kafra_01",2;
- callfunc "F_Kafra",0,2,1;
-
- M_Save:
- savepoint "alb2trea.gat",92,64;
- callfunc "F_KafEnd",0,1;
-}
+//===== eAthena Script ================
+//= Kafras in Dungeons and Fields
+//===== By: ============================
+//= eAthena Dev Team
+//===== Current Version: =======================
+//= 2.5
+//===== Compatible With: ============================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: =================================
+//= v1.1 Now using functions. Added teleport service for Orc Dungeon
+//= and Coal Mine Kafras.
+//= v2.1 Fixed bug with Merc job quest kafra.[Lupus]
+//= v2.1b Minor changes to function calls. Using arguments.
+//= Added ant hell kafras. This version uses arrays .[kobra_k88]
+//= Fixed Kafras, not giving you Save menu [Lupus]
+//= 2.3 Removed SAVE menu from dungeons Kafras [Lupus]
+//= 2.4 Now Baby Merchant can pass Merch Job Quest w/o probs [Lupus]
+//= 2.41 Removed useless warp points, already nullified by func call [Evera]
+//= 2.5 Allowed Culvert save point [Evera]
+//===============================================================
+
+
+//<============================= Ant Hell ==============================>\\
+// Mocfild04 -----------------------------------------
+moc_fild04.gat,230,329,3 script Kafra::kaf_moc_fild04 115,{
+
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "moc_fild04.gat",231,339;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Mocfild15 --------------------------------------------
+moc_fild15.gat,264,260,3 script Kafra::kaf_moc_fild15 115,{
+
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "moc_fild15.gat",266,271;
+ callfunc "F_KafEnd",0,1;
+}
+
+//<============================= Byalan Island ============================>\\
+izlu2dun.gat,106,58,8 script Kafra::kaf_izlu2dun 115,{
+
+ cutin "kafra_03",2;
+ if(BaseJob==Job_Novice && job_merchant_q3>0) callfunc "F_MercKafra"; //F_MercKafra found in merchant.txt
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "izlu2dun.gat",87,170;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<============================ Culvert Sewers ============================>\\
+prt_fild05.gat,290,224,1 script Kafra::prt_fild05 114,{
+ cutin "kafra_04",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "prt_fild05.gat",274,243;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<=========================== Coal Mine (Dead Pitt) =======================>\\
+mjolnir_02.gat,83,361,4 script Kafra::kaf_mjolnir_02 114,{
+ cutin "kafra_04",2;
+ callfunc "F_Kafra",0,6,1;
+
+ M_Save:
+ savepoint "mjolnir_02.gat",98,352;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<=============================== Morroc Ruins ============================>\\
+moc_ruins.gat,61,156,5 script Kafra::moc_ruins 114,{
+ cutin "kafra_04",2;
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "moc_ruins.gat",41,141;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<================================ Orc Dungeon ============================>\\
+gef_fild10.gat,73,340,4 script Kafra::kaf_gef_fild10 115,{
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,6,1;
+
+ M_Save:
+ savepoint "gef_fild10.gat",54,326;
+ callfunc "F_KafEnd",0,1;
+}
+
+//<============================== Treasure Island ==========================>\\
+alb2trea.gat,59,69,1 script Kafra::kaf_alb2trea 117,{
+ cutin "kafra_01",2;
+ callfunc "F_Kafra",0,2,1;
+
+ M_Save:
+ savepoint "alb2trea.gat",92,64;
+ callfunc "F_KafEnd",0,1;
+}
diff --git a/npc/kafras/kafras_gef.txt b/npc/kafras/kafras_gef.txt
index 96225323f..cd3e8b522 100644
--- a/npc/kafras/kafras_gef.txt
+++ b/npc/kafras/kafras_gef.txt
@@ -1,83 +1,83 @@
-//===== eAthena Script =======================================
-//= Geffen Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.3
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 New warps and prices [Evera]
-//= 2.3 Can't save outside city [Evera]
-//=====================================================================
-
-
-// South =====================================
-geffen.gat,120,62,8 script Kafra::kaf_geffen 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "geffen.gat",119,40;
- callfunc "F_KafEnd",0,1;
-}
-
-// East ==============================================
-geffen.gat,203,123,3 script Kafra::geffen2 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "geffen.gat",200,124;
- callfunc "F_KafEnd",0,1;
-}
-
-// North ==============================================
-geffen.gat,116,202,3 script Kafra::geffen3 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "geffen.gat",110,199;
- callfunc "F_KafEnd",0,1;
-}
-
-// West =========================================
-geffen.gat,37,116,6 script Kafra::geffen4 117,{
- cutin "kafra_01",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "geffen.gat",43,108;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Geffen Kafras -------------------
-function script F_KafSetGef {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Prontera", "Al De Baran", "Orc Dungeon", "Coal Mine(Dead Pit)";
- setarray @wrpP[0], 1200, 1200, 1200, 1700;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
- set @wrpC$[4], "Cancel";
- setarray @viewpX[0], 120, 203, 116, 37;
- setarray @viewpY[0], 62, 123, 202, 116;
- return;
-}
+//===== eAthena Script =======================================
+//= Geffen Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.3
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 New warps and prices [Evera]
+//= 2.3 Can't save outside city [Evera]
+//=====================================================================
+
+
+// South =====================================
+geffen.gat,120,62,8 script Kafra::kaf_geffen 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "geffen.gat",119,40;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East ==============================================
+geffen.gat,203,123,3 script Kafra::geffen2 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "geffen.gat",200,124;
+ callfunc "F_KafEnd",0,1;
+}
+
+// North ==============================================
+geffen.gat,116,202,3 script Kafra::geffen3 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "geffen.gat",110,199;
+ callfunc "F_KafEnd",0,1;
+}
+
+// West =========================================
+geffen.gat,37,116,6 script Kafra::geffen4 117,{
+ cutin "kafra_01",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "geffen.gat",43,108;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Geffen Kafras -------------------
+function script F_KafSetGef {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Prontera", "Al De Baran", "Orc Dungeon", "Coal Mine(Dead Pit)";
+ setarray @wrpP[0], 1200, 1200, 1200, 1700;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
+ set @wrpC$[4], "Cancel";
+ setarray @viewpX[0], 120, 203, 116, 37;
+ setarray @viewpY[0], 62, 123, 202, 116;
+ return;
+}
diff --git a/npc/kafras/kafras_izl.txt b/npc/kafras/kafras_izl.txt
index cbbba5b0a..11fe45b6b 100644
--- a/npc/kafras/kafras_izl.txt
+++ b/npc/kafras/kafras_izl.txt
@@ -1,40 +1,40 @@
-//===== eAthena Script =======================================
-//= Izlude Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.21
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 New teleport destinations, prices [Lupus]
-//= 2.21 Warps to Prontera rather than Payon now [Evera]
-//=====================================================================
-
-
-izlude.gat,134,87,3 script Kafra::kaf_izlude 117,{
- cutin "kafra_01",2;
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Geffen", "Prontera", "Morroc", "Al De Baran";
- setarray @wrpP[0], 1200, 1200, 1200, 1800;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
- set @wrpC$[4], "Cancel";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "izlude.gat",96,107;
- callfunc "F_KafEnd",0,1;
-}
+//===== eAthena Script =======================================
+//= Izlude Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.21
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 New teleport destinations, prices [Lupus]
+//= 2.21 Warps to Prontera rather than Payon now [Evera]
+//=====================================================================
+
+
+izlude.gat,134,87,3 script Kafra::kaf_izlude 117,{
+ cutin "kafra_01",2;
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Geffen", "Prontera", "Morroc", "Al De Baran";
+ setarray @wrpP[0], 1200, 1200, 1200, 1800;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
+ set @wrpC$[4], "Cancel";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "izlude.gat",96,107;
+ callfunc "F_KafEnd",0,1;
+}
diff --git a/npc/kafras/kafras_mor.txt b/npc/kafras/kafras_mor.txt
index e1d22205c..83cd1dfe8 100644
--- a/npc/kafras/kafras_mor.txt
+++ b/npc/kafras/kafras_mor.txt
@@ -1,83 +1,83 @@
-//===== eAthena Script =======================================
-//= Morroc Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.3
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 New teleport destinations, prices [Lupus]
-//= 2.3 Can't save outside city [Evera[
-//=====================================================================
-
-
-// South ================================
-morocc.gat,156,97,4 script Kafra::kaf_morocc 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "morocc.gat",156,46;
- callfunc "F_KafEnd",0,1;
-}
-
-// North =================================
-morocc.gat,162,271,4 script Kafra::kaf_morocc2 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "morocc.gat",157,272;
- callfunc "F_KafEnd",0,1;
-}
-
-// West =================================
-morocc.gat,28,167,6 script Kafra::kaf_morocc3 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "morocc.gat",31,164;
- callfunc "F_KafEnd",0,1;
-}
-
-// East =================================
-morocc.gat,292,211,4 script Kafra::kaf_morocc4 112,{
- cutin "kafra_06",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "morocc.gat",294,207;
- callfunc "F_KafEnd",0,1;
-}
-
-// Function: Sets variables for Morroc Kafras --------------------------------
-function script F_KafSetMoc {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Prontera", "Payon", "Alberta", "Comodo", "Comodo Pharos Lighthouse";
- setarray @wrpP[0], 1200, 1200, 1800, 1800, 1200;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
- set @wrpC$[4], @wrpD$[4]+" -> "+@wrpP[4];
- set @wrpC$[5], "Cancel";
- setarray @viewpX[0], 156, 163, 28, 292;
- setarray @viewpY[0], 97, 260, 167, 211;
- return;
-}
+//===== eAthena Script =======================================
+//= Morroc Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.3
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 New teleport destinations, prices [Lupus]
+//= 2.3 Can't save outside city [Evera[
+//=====================================================================
+
+
+// South ================================
+morocc.gat,156,97,4 script Kafra::kaf_morocc 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "morocc.gat",156,46;
+ callfunc "F_KafEnd",0,1;
+}
+
+// North =================================
+morocc.gat,162,271,4 script Kafra::kaf_morocc2 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "morocc.gat",157,272;
+ callfunc "F_KafEnd",0,1;
+}
+
+// West =================================
+morocc.gat,28,167,6 script Kafra::kaf_morocc3 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "morocc.gat",31,164;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East =================================
+morocc.gat,292,211,4 script Kafra::kaf_morocc4 112,{
+ cutin "kafra_06",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "morocc.gat",294,207;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Function: Sets variables for Morroc Kafras --------------------------------
+function script F_KafSetMoc {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Prontera", "Payon", "Alberta", "Comodo", "Comodo Pharos Lighthouse";
+ setarray @wrpP[0], 1200, 1200, 1800, 1800, 1200;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
+ set @wrpC$[4], @wrpD$[4]+" -> "+@wrpP[4];
+ set @wrpC$[5], "Cancel";
+ setarray @viewpX[0], 156, 163, 28, 292;
+ setarray @viewpY[0], 97, 260, 167, 211;
+ return;
+}
diff --git a/npc/kafras/kafras_new.txt b/npc/kafras/kafras_new.txt
index 1936d4418..1e97b3bf2 100644
--- a/npc/kafras/kafras_new.txt
+++ b/npc/kafras/kafras_new.txt
@@ -1,158 +1,158 @@
-//===== eAthena Script ===========
-//= New Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.8
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==============================================
-//= v1.1 Now using functions
-//= v2.1 Added Niflheim Kafra by Dizzy
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 Added Louyang Kafra, fixed other kafras not saving players coords [Lupus]
-//= 2.3 Added temp Amatsu + Ayothaya Kafra (wrong coords and sprite) [Lupus]
-//= 2.4 Added correct Ayothaya, Louyang & Amatsu Kafras. [Lupus]
-//= 2.5 Added 2 Einbroch Kafras. [Lupus]
-//= 2.6 Added the Einbech Kafra [MasterOfMuppets]
-//= 2.7 Added the Lighthalzen Kafras [MasterOfMuppets]
-//= 2.7b Chanced the Sprite of the Einbech Kafra. [Poki#3]
-//= 2.7c Added missing kafra in Lighthalzen, thanks to Muad_Dib [Vicious]
-//= 2.8 Removed warps from Umbala and Gonryun, thanks Drakee [Evera]
-//= 2.9 Fixed an incorrect savepoint (inside the hotel) the map was wrong.
-
-//==========================================================================
-
-// Amatsu ------------------------------------------------------------------
-amatsu.gat,102,149,4 script Kafra::kaf_amatsu 116,{
- cutin "kafra_02",2;
- callfunc "F_Kafra",3,3,1;
-
- M_Save:
- savepoint "amatsu.gat",116,94;
- callfunc "F_KafEnd",0,1;
-}
-
-// Ayothaya ----------------------------------------------------------------
-ayothaya.gat,212,169,5 script Kafra::kaf_ayothaya 116,{
- cutin "kafra_02",2;
- callfunc "F_Kafra",4,3,1;
-
- M_Save:
- savepoint "ayothaya.gat",149,69;
- callfunc "F_KafEnd",0,1;
-}
-
-// Einbech -----------------------------------------------------------------
-
-einbech.gat,181,132,4 script Kafra::kaf_einbech 860,{
- cutin "kafra_08",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "einbech.gat",182,124;
- callfunc "F_KafEnd",0,1;
-}
-
-// Einbroch (North-East) ---------------------------------------------------
-einbroch.gat,242,205,5 script Kafra::kaf_einbroch 115,{
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "einbroch.gat",238,198;
- callfunc "F_KafEnd",0,1;
-}
-
-// Einbroch (East) ---------------------------------------------------------
-einbroch.gat,59,203,5 script Kafra::kaf_einbroch2 117,{
- cutin "kafra_01",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "einbroch.gat",240,197;
- callfunc "F_KafEnd",0,1;
-}
-
-// Gonryun -----------------------------------------------------------------
-gonryun.gat,159,122,4 script Kafra::kaf_gonryun 116,{
- cutin "kafra_02",2;
- callfunc "F_Kafra",0,3,1;
-
- M_Save:
- savepoint "gonryun.gat",160,62;
- callfunc "F_KafEnd",0,1;
-}
-
-// Lighthalzen--------------------------------------------------------------
-
-//Outside the hotel
-lighthalzen.gat,164,100,4 script Kafra::kaf_lighthalzen 860,{
- cutin "kafra_08",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "lighthalzen.gat",158,94;
- callfunc "F_KafEnd",0,1;
-}
-
-// Entrance
-lighthalzen.gat,191,320,4 script Kafra::kaf_lighthalzen2 861,{
- cutin "kafra_09",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "lighthalzen.gat",194,313;
- callfunc "F_KafEnd",0,1;
-}
-
-//Inside the hotel
-lhz_in02.gat,237,284,4 script Kafra::kaf_lhz_in02 861,{
- cutin "kafra_09",2;
- callfunc "F_Kafra",0,4,1;
-
- M_Save:
- savepoint "lhz_in02.gat",278,215;
- callfunc "F_KafEnd",0,1;
-}
-
-// Louyang -----------------------------------------------------------------
-louyang.gat,210,104,5 script Kafra::kaf_louyang 117,{
- cutin "kafra_01",2;
- callfunc "F_Kafra",4,3,1;
-
- M_Save:
- savepoint "louyang.gat",217,92;
- callfunc "F_KafEnd",0,1;
-}
-
-// Umbala Kafra ------------------------------------------------------------
-umbala.gat,128,133,4 script Kafra::kaf_umbala 115,{
- cutin "kafra_03",2;
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Comodo";
- setarray @wrpP[0], 1800;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], "Cancel";
- callfunc "F_Kafra",0,0,1;
- M_Save:
- savepoint "umbala.gat",126,131;
- callfunc "F_KafEnd",0,1;
-}
-
-// Niflheim ----------------------------------------------------------------
-niflheim.gat,202,180,3 script Kafra::kaf_niflheim 791,{
- callfunc "F_Kafra",1,2,1;
-//this SAVE isn't used. Niflheim Kafra doesn't SAVE
- M_Save:
- savepoint "niflheim.gat",192,182;
- callfunc "F_KafEnd",1,1;
-}
+//===== eAthena Script ===========
+//= New Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.8
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==============================================
+//= v1.1 Now using functions
+//= v2.1 Added Niflheim Kafra by Dizzy
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 Added Louyang Kafra, fixed other kafras not saving players coords [Lupus]
+//= 2.3 Added temp Amatsu + Ayothaya Kafra (wrong coords and sprite) [Lupus]
+//= 2.4 Added correct Ayothaya, Louyang & Amatsu Kafras. [Lupus]
+//= 2.5 Added 2 Einbroch Kafras. [Lupus]
+//= 2.6 Added the Einbech Kafra [MasterOfMuppets]
+//= 2.7 Added the Lighthalzen Kafras [MasterOfMuppets]
+//= 2.7b Chanced the Sprite of the Einbech Kafra. [Poki#3]
+//= 2.7c Added missing kafra in Lighthalzen, thanks to Muad_Dib [Vicious]
+//= 2.8 Removed warps from Umbala and Gonryun, thanks Drakee [Evera]
+//= 2.9 Fixed an incorrect savepoint (inside the hotel) the map was wrong.
+
+//==========================================================================
+
+// Amatsu ------------------------------------------------------------------
+amatsu.gat,102,149,4 script Kafra::kaf_amatsu 116,{
+ cutin "kafra_02",2;
+ callfunc "F_Kafra",3,3,1;
+
+ M_Save:
+ savepoint "amatsu.gat",116,94;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Ayothaya ----------------------------------------------------------------
+ayothaya.gat,212,169,5 script Kafra::kaf_ayothaya 116,{
+ cutin "kafra_02",2;
+ callfunc "F_Kafra",4,3,1;
+
+ M_Save:
+ savepoint "ayothaya.gat",149,69;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Einbech -----------------------------------------------------------------
+
+einbech.gat,181,132,4 script Kafra::kaf_einbech 860,{
+ cutin "kafra_08",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "einbech.gat",182,124;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Einbroch (North-East) ---------------------------------------------------
+einbroch.gat,242,205,5 script Kafra::kaf_einbroch 115,{
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "einbroch.gat",238,198;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Einbroch (East) ---------------------------------------------------------
+einbroch.gat,59,203,5 script Kafra::kaf_einbroch2 117,{
+ cutin "kafra_01",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "einbroch.gat",240,197;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Gonryun -----------------------------------------------------------------
+gonryun.gat,159,122,4 script Kafra::kaf_gonryun 116,{
+ cutin "kafra_02",2;
+ callfunc "F_Kafra",0,3,1;
+
+ M_Save:
+ savepoint "gonryun.gat",160,62;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Lighthalzen--------------------------------------------------------------
+
+//Outside the hotel
+lighthalzen.gat,164,100,4 script Kafra::kaf_lighthalzen 860,{
+ cutin "kafra_08",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "lighthalzen.gat",158,94;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Entrance
+lighthalzen.gat,191,320,4 script Kafra::kaf_lighthalzen2 861,{
+ cutin "kafra_09",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "lighthalzen.gat",194,313;
+ callfunc "F_KafEnd",0,1;
+}
+
+//Inside the hotel
+lhz_in02.gat,237,284,4 script Kafra::kaf_lhz_in02 861,{
+ cutin "kafra_09",2;
+ callfunc "F_Kafra",0,4,1;
+
+ M_Save:
+ savepoint "lhz_in02.gat",278,215;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Louyang -----------------------------------------------------------------
+louyang.gat,210,104,5 script Kafra::kaf_louyang 117,{
+ cutin "kafra_01",2;
+ callfunc "F_Kafra",4,3,1;
+
+ M_Save:
+ savepoint "louyang.gat",217,92;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Umbala Kafra ------------------------------------------------------------
+umbala.gat,128,133,4 script Kafra::kaf_umbala 115,{
+ cutin "kafra_03",2;
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Comodo";
+ setarray @wrpP[0], 1800;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], "Cancel";
+ callfunc "F_Kafra",0,0,1;
+ M_Save:
+ savepoint "umbala.gat",126,131;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Niflheim ----------------------------------------------------------------
+niflheim.gat,202,180,3 script Kafra::kaf_niflheim 791,{
+ callfunc "F_Kafra",1,2,1;
+//this SAVE isn't used. Niflheim Kafra doesn't SAVE
+ M_Save:
+ savepoint "niflheim.gat",192,182;
+ callfunc "F_KafEnd",1,1;
+}
diff --git a/npc/kafras/kafras_pay.txt b/npc/kafras/kafras_pay.txt
index 738a41004..4380ec81e 100644
--- a/npc/kafras/kafras_pay.txt
+++ b/npc/kafras/kafras_pay.txt
@@ -1,70 +1,70 @@
-//===== eAthena Script =======================================
-//= Payon Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.31
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==============================================
-//= v1.1 Now using functions
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= v2.2 New Payon Locations. [Darkchild]
-//= 2.3 1 New Kafra, fixed save menus
-//= 2.31 New prices [Evera]
-//==========================================================================
-
-
-// Main Town, South ----------------------------------------------------------
-payon.gat,181,104,4 script Kafra::kaf_payon 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetPay";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "payon.gat",160,58;
- callfunc "F_KafEnd",0,1;
-}
-
-// Main Town, Middle North --------------------------------------------------
-payon.gat,175,226,4 script Kafra::kaf_payon2 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetPay";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "payon.gat",257,242;
- callfunc "F_KafEnd",0,1;
-}
-
-// Archer Village ------------------------------------------------------------
-pay_arche.gat,55,123,8 script Kafra::kaf_payon3 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetPay";
- callfunc "F_Kafra",0,5,1;
-
- M_Save:
- savepoint "pay_arche.gat",49,144;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Payon Kafras ---------------------------------
-function script F_KafSetPay {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Alberta", "Prontera", "Morroc";
- setarray @wrpP[0], 1200, 1200, 1200;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], "Cancel";
- return;
-}
+//===== eAthena Script =======================================
+//= Payon Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.31
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==============================================
+//= v1.1 Now using functions
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= v2.2 New Payon Locations. [Darkchild]
+//= 2.3 1 New Kafra, fixed save menus
+//= 2.31 New prices [Evera]
+//==========================================================================
+
+
+// Main Town, South ----------------------------------------------------------
+payon.gat,181,104,4 script Kafra::kaf_payon 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetPay";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "payon.gat",160,58;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Main Town, Middle North --------------------------------------------------
+payon.gat,175,226,4 script Kafra::kaf_payon2 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetPay";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "payon.gat",257,242;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Archer Village ------------------------------------------------------------
+pay_arche.gat,55,123,8 script Kafra::kaf_payon3 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetPay";
+ callfunc "F_Kafra",0,5,1;
+
+ M_Save:
+ savepoint "pay_arche.gat",49,144;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Payon Kafras ---------------------------------
+function script F_KafSetPay {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Alberta", "Prontera", "Morroc";
+ setarray @wrpP[0], 1200, 1200, 1200;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], "Cancel";
+ return;
+}
diff --git a/npc/kafras/kafras_pron.txt b/npc/kafras/kafras_pron.txt
index 83a330b9e..be51e22fe 100644
--- a/npc/kafras/kafras_pron.txt
+++ b/npc/kafras/kafras_pron.txt
@@ -1,99 +1,99 @@
-//===== eAthena Script =======================================
-//= Prontera Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.5
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 North Kafra allows you save your position
-//= 2.3 New Teleport list, new prices, 2.3a fixed Alberta Teleport [Lupus]
-//= 2.3b One Kafra's been moved to Prontera, thx to Vicious_Pucca [Lupus]
-//= 2.4 Updated Kafras locations for the mini-map [Lupus]
-//= 2.41 New prices [Evera]
-//= 2.5 Can't save outside city [Evera]
-//=====================================================================
-
-
-// North ==================================
-prontera.gat,152,326,4 script Kafra::kaf_prontera 112,{
- cutin "kafra_06",2;
- callfunc "F_Kafra",0,1,1;
-
-M_Save:
- savepoint "prontera.gat",157,327;
- callfunc "F_KafEnd",0,1;
-}
-
-// SOUTH ======================================
-prontera.gat,151,29,8 script Kafra::kaf_prontera2 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "prontera.gat",150,33;
- callfunc "F_KafEnd",0,1;
-}
-
-//WEST=========================================
-prontera.gat,29,207,6 script Kafra::kaf_prontera3 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "prontera.gat",33,208;
- callfunc "F_KafEnd",0,1;
-}
-
-// East ===========================================
-prontera.gat,282,200,4 script Kafra::kaf_prontera4 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "prontera.gat",281,203;
- callfunc "F_KafEnd",0,1;
-}
-
-// Center ===========================================
-prontera.gat,146,86,6 script Kafra::kaf_prontera5 117,{
- cutin "kafra_01",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
-M_Save:
- savepoint "prontera.gat",116,73;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Prontera Kafras ----------------------------
-function script F_KafSetPront {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Orc Dungeon", "Alberta";
- setarray @wrpP[0], 600, 1200, 1200, 1200, 1200, 1800;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
- set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
- set @wrpC$[4], @wrpD$[4]+" -> "+@wrpP[4];
- set @wrpC$[5], @wrpD$[5]+" -> "+@wrpP[5];
- set @wrpC$[6], "Cancel";
- setarray @viewpX[0], 151, 29, 282, 152;
- setarray @viewpY[0], 29, 207, 200, 326;
- return;
-}
+//===== eAthena Script =======================================
+//= Prontera Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.5
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 North Kafra allows you save your position
+//= 2.3 New Teleport list, new prices, 2.3a fixed Alberta Teleport [Lupus]
+//= 2.3b One Kafra's been moved to Prontera, thx to Vicious_Pucca [Lupus]
+//= 2.4 Updated Kafras locations for the mini-map [Lupus]
+//= 2.41 New prices [Evera]
+//= 2.5 Can't save outside city [Evera]
+//=====================================================================
+
+
+// North ==================================
+prontera.gat,152,326,4 script Kafra::kaf_prontera 112,{
+ cutin "kafra_06",2;
+ callfunc "F_Kafra",0,1,1;
+
+M_Save:
+ savepoint "prontera.gat",157,327;
+ callfunc "F_KafEnd",0,1;
+}
+
+// SOUTH ======================================
+prontera.gat,151,29,8 script Kafra::kaf_prontera2 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "prontera.gat",150,33;
+ callfunc "F_KafEnd",0,1;
+}
+
+//WEST=========================================
+prontera.gat,29,207,6 script Kafra::kaf_prontera3 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "prontera.gat",33,208;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East ===========================================
+prontera.gat,282,200,4 script Kafra::kaf_prontera4 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "prontera.gat",281,203;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Center ===========================================
+prontera.gat,146,86,6 script Kafra::kaf_prontera5 117,{
+ cutin "kafra_01",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+M_Save:
+ savepoint "prontera.gat",116,73;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Prontera Kafras ----------------------------
+function script F_KafSetPront {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Orc Dungeon", "Alberta";
+ setarray @wrpP[0], 600, 1200, 1200, 1200, 1200, 1800;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], @wrpD$[2]+" -> "+@wrpP[2];
+ set @wrpC$[3], @wrpD$[3]+" -> "+@wrpP[3];
+ set @wrpC$[4], @wrpD$[4]+" -> "+@wrpP[4];
+ set @wrpC$[5], @wrpD$[5]+" -> "+@wrpP[5];
+ set @wrpC$[6], "Cancel";
+ setarray @viewpX[0], 151, 29, 282, 152;
+ setarray @viewpY[0], 29, 207, 200, 326;
+ return;
+}
diff --git a/npc/kafras/kafras_yun.txt b/npc/kafras/kafras_yun.txt
index 5e879bf6b..6b84cb74d 100644
--- a/npc/kafras/kafras_yun.txt
+++ b/npc/kafras/kafras_yun.txt
@@ -1,69 +1,69 @@
-//===== eAthena Script =======================================
-//= Yuno Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.3
-//===== Compatible With: =====================
-//= eAthena 1.0
-//===== Description: ============================================
-//= Description of argument settings for callfunc "F_Kafra".
-//= arg(0): When set at 0 the default Kafra message is displayed.
-//= When set to 1 the Niflhiem Kafra message is displayed.
-//= When set to 2 the Guild Kafra message is displayed.
-//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
-//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
-//===== Additional Comments: ==========================================
-//= v1.1 Now using functions :)
-//= v2.1b Minor changes to function calls. Using arguments.
-//= This version uses arrays .[kobra_k88]
-//= 2.2 Now only warps to Aldebaran [Evera]
-//= 2.3 Updated a kafra location. [Musashiden]
-//=====================================================================
-
-
-// Center ------------------------------------------------------------------
-yuno.gat,152,187,4 script Kafra::kaf_yuno 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",158,125;
- callfunc "F_KafEnd",0,1;
-}
-
-// South East --------------------------------------------------------------
-yuno.gat,327,108,4 script Kafra::kaf_yuno2 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",328,101;
- callfunc "F_KafEnd",0,1;
-}
-
-// East --------------------------------------------------------------------
-yuno.gat,277,221,4 script Kafra::kaf_yuno3 117,{
- cutin "kafra_01",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",274,229;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Yuno Kafras ------------
-function script F_KafSetYun {
- cleararray @wrpC$[0],"",getarraysize(@wrpC$);
- setarray @wrpD$[0], "Al De Baran";
- setarray @wrpP[0], 1200;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], "Cancel";
- setarray @viewpX[0], 328, 278, 153, 0;
- setarray @viewpY[0], 108, 221, 187, 0;
- return;
-}
+//===== eAthena Script =======================================
+//= Yuno Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.3
+//===== Compatible With: =====================
+//= eAthena 1.0
+//===== Description: ============================================
+//= Description of argument settings for callfunc "F_Kafra".
+//= arg(0): When set at 0 the default Kafra message is displayed.
+//= When set to 1 the Niflhiem Kafra message is displayed.
+//= When set to 2 the Guild Kafra message is displayed.
+//= arg(1): Set to 1 to disable teleport menu option. Otherwise set to 0.
+//= arg(2): Set to 1 to disable info menu. Otherwise set to 0.
+//===== Additional Comments: ==========================================
+//= v1.1 Now using functions :)
+//= v2.1b Minor changes to function calls. Using arguments.
+//= This version uses arrays .[kobra_k88]
+//= 2.2 Now only warps to Aldebaran [Evera]
+//= 2.3 Updated a kafra location. [Musashiden]
+//=====================================================================
+
+
+// Center ------------------------------------------------------------------
+yuno.gat,152,187,4 script Kafra::kaf_yuno 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",158,125;
+ callfunc "F_KafEnd",0,1;
+}
+
+// South East --------------------------------------------------------------
+yuno.gat,327,108,4 script Kafra::kaf_yuno2 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",328,101;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East --------------------------------------------------------------------
+yuno.gat,277,221,4 script Kafra::kaf_yuno3 117,{
+ cutin "kafra_01",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",274,229;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Yuno Kafras ------------
+function script F_KafSetYun {
+ cleararray @wrpC$[0],"",getarraysize(@wrpC$);
+ setarray @wrpD$[0], "Al De Baran";
+ setarray @wrpP[0], 1200;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], "Cancel";
+ setarray @viewpX[0], 328, 278, 153, 0;
+ setarray @viewpY[0], 108, 221, 187, 0;
+ return;
+}
diff --git a/npc/merchants/alchemist.txt b/npc/merchants/alchemist.txt
index a3085aa4f..9d813fcaf 100644
--- a/npc/merchants/alchemist.txt
+++ b/npc/merchants/alchemist.txt
@@ -1,129 +1,129 @@
-//===== eAthena Script =======================================
-//= Alchemist Shop
-//===== By: ==================================================
-//= eAthena Team
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Selling Alchemist Materials and Manuals
-//===== Additional Comments: =================================
-//= 1.1 fixed Medicine Bowl issue, thanx 2 MasterOfMuppets
-//= 1.2 Reddozen's fixes of typos. added optional Elemental
-//= Potion Guide. [Lupus]
-//= 1.3 Deleted Elemental Potions Guide due to original quest [Lupus]
-//============================================================
-
-
-alde_alche.gat,24,188,3 script Gever AI Sharp 740,{
- mes "[Gever AI Sharp]";
- mes "Welcome to the Alchemist Union.";
- mes "How can I assist you today?";
- next;
- menu "Purchase materials.",M_Material, "Purchase a production manual.",M_Manual, "Cancel Deal.", M_Bye;
-
- M_Material:
- mes "[Gever AI Sharp]";
- mes "What would you like?";
- next;
- menu "Medicine Bowl - 8z",-,"Cancel.",M_Bye;
-
- mes "[Gever AI Sharp]";
- mes "How many do you want?";
- mes "Enter '0' if you want to quit.";
- next;
- input @num;
- if((@num < 1) || (@num > 1000)) goto M_Bye;
- set @price,@num * 8;
- mes "[Gever AI Sharp]";
- if(Zeny < @price) goto sL_NoZeny;
- if (checkweight(7134,@num) == 0) goto sL_OverW;
- set Zeny,Zeny-@price;
- getitem 7134,@num;//Items: Medicine_Bowl,
- goto L_Bye;
- M_Manual:
- mes "[Gever AI Sharp]";
- mes "What do you need?";
- mes "Manuals are generally 100,000 zeny.";
- mes "Except for a couple of special manuals.";
- next;
- menu "Potion Creation Guide",sM_Pot, "Alcohol Creation Guide",sM_Alc, "Bottle Grenade Creation Guide",sM_Gren,
- "Acid Bottle Creation Guide",sM_Acid, "Plant Bottle Creation Guide",sM_Plant, "Marine Sphere Bottle Creation Guide",sM_Mar,
- "Glistening Coat Creation Guide",sM_Coat, "Condensed Potion Creation Guide",sM_Con, "Cancel Deal.",M_Bye;
- sM_Pot:
- set @itemid,7144;
- set @price,100000;
- set @itemname$,"Potion";
- goto L_Choice;
- sM_Alc:
- set @itemid,7127;
- set @price,100000;
- set @itemname$,"Alchohol";
- goto L_Choice;
- sM_Gren:
- set @itemid,7128;
- set @price,100000;
- set @itemname$,"Bottle Grenade";
- goto L_Choice;
- sM_Acid:
- set @itemid,7129;
- set @price,100000;
- set @itemname$,"Acid Bottle";
- goto L_Choice;
- sM_Plant:
- set @itemid,7130;
- set @price,100000;
- set @itemname$,"Plant Bottle";
- goto L_Choice;
- sM_Mar:
- set @itemid,7131;
- set @price,100000;
- set @itemname$,"Marine Sphere Bottle";
- goto L_Choice;
- sM_Coat:
- set @itemid,7132;
- set @price,100000;
- set @itemname$,"Glistening Coat";
- goto L_Choice;
- sM_Con:
- set @itemid,7133;
- set @price,240000;
- set @itemname$,"Condensed Potion";
- goto L_Choice;
-// sM_Ele:
-// set @itemid,7434;
-// set @price,240000;
-// set @itemname$,"Elemental Potion";
-// goto L_Choice;
-
- L_Choice:
- mes "[Gever AI Sharp]";
- mes "An " + @itemname$ + " Creation Guide??";
- mes "That will be "+@price/1000+",000 zeny.";
- next;
- menu "Purchase.",-,"Quit.",M_Bye;
-
- mes "[Gever AI Sharp]";
- if(Zeny < @price) goto sL_NoZeny;
- if (checkweight(@itemid,1) == 0) goto sL_OverW;
- set Zeny,Zeny-@price;
- getitem @itemid,1;
- L_Bye:
- mes "Thank you for buying!";
- mes "Come again.";
- close;
-
- sL_NoZeny:
- mes "You don't seem to have enough money.";
- close;
- sL_OverW:
- mes "Hmm.... it seems that you are overweight...";
- close;
-
-
- M_Bye:
- mes "[Gever AI Sharp]";
- mes "Then come again next time.";
- close;
-}
+//===== eAthena Script =======================================
+//= Alchemist Shop
+//===== By: ==================================================
+//= eAthena Team
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Selling Alchemist Materials and Manuals
+//===== Additional Comments: =================================
+//= 1.1 fixed Medicine Bowl issue, thanx 2 MasterOfMuppets
+//= 1.2 Reddozen's fixes of typos. added optional Elemental
+//= Potion Guide. [Lupus]
+//= 1.3 Deleted Elemental Potions Guide due to original quest [Lupus]
+//============================================================
+
+
+alde_alche.gat,24,188,3 script Gever AI Sharp 740,{
+ mes "[Gever AI Sharp]";
+ mes "Welcome to the Alchemist Union.";
+ mes "How can I assist you today?";
+ next;
+ menu "Purchase materials.",M_Material, "Purchase a production manual.",M_Manual, "Cancel Deal.", M_Bye;
+
+ M_Material:
+ mes "[Gever AI Sharp]";
+ mes "What would you like?";
+ next;
+ menu "Medicine Bowl - 8z",-,"Cancel.",M_Bye;
+
+ mes "[Gever AI Sharp]";
+ mes "How many do you want?";
+ mes "Enter '0' if you want to quit.";
+ next;
+ input @num;
+ if((@num < 1) || (@num > 1000)) goto M_Bye;
+ set @price,@num * 8;
+ mes "[Gever AI Sharp]";
+ if(Zeny < @price) goto sL_NoZeny;
+ if (checkweight(7134,@num) == 0) goto sL_OverW;
+ set Zeny,Zeny-@price;
+ getitem 7134,@num;//Items: Medicine_Bowl,
+ goto L_Bye;
+ M_Manual:
+ mes "[Gever AI Sharp]";
+ mes "What do you need?";
+ mes "Manuals are generally 100,000 zeny.";
+ mes "Except for a couple of special manuals.";
+ next;
+ menu "Potion Creation Guide",sM_Pot, "Alcohol Creation Guide",sM_Alc, "Bottle Grenade Creation Guide",sM_Gren,
+ "Acid Bottle Creation Guide",sM_Acid, "Plant Bottle Creation Guide",sM_Plant, "Marine Sphere Bottle Creation Guide",sM_Mar,
+ "Glistening Coat Creation Guide",sM_Coat, "Condensed Potion Creation Guide",sM_Con, "Cancel Deal.",M_Bye;
+ sM_Pot:
+ set @itemid,7144;
+ set @price,100000;
+ set @itemname$,"Potion";
+ goto L_Choice;
+ sM_Alc:
+ set @itemid,7127;
+ set @price,100000;
+ set @itemname$,"Alchohol";
+ goto L_Choice;
+ sM_Gren:
+ set @itemid,7128;
+ set @price,100000;
+ set @itemname$,"Bottle Grenade";
+ goto L_Choice;
+ sM_Acid:
+ set @itemid,7129;
+ set @price,100000;
+ set @itemname$,"Acid Bottle";
+ goto L_Choice;
+ sM_Plant:
+ set @itemid,7130;
+ set @price,100000;
+ set @itemname$,"Plant Bottle";
+ goto L_Choice;
+ sM_Mar:
+ set @itemid,7131;
+ set @price,100000;
+ set @itemname$,"Marine Sphere Bottle";
+ goto L_Choice;
+ sM_Coat:
+ set @itemid,7132;
+ set @price,100000;
+ set @itemname$,"Glistening Coat";
+ goto L_Choice;
+ sM_Con:
+ set @itemid,7133;
+ set @price,240000;
+ set @itemname$,"Condensed Potion";
+ goto L_Choice;
+// sM_Ele:
+// set @itemid,7434;
+// set @price,240000;
+// set @itemname$,"Elemental Potion";
+// goto L_Choice;
+
+ L_Choice:
+ mes "[Gever AI Sharp]";
+ mes "An " + @itemname$ + " Creation Guide??";
+ mes "That will be "+@price/1000+",000 zeny.";
+ next;
+ menu "Purchase.",-,"Quit.",M_Bye;
+
+ mes "[Gever AI Sharp]";
+ if(Zeny < @price) goto sL_NoZeny;
+ if (checkweight(@itemid,1) == 0) goto sL_OverW;
+ set Zeny,Zeny-@price;
+ getitem @itemid,1;
+ L_Bye:
+ mes "Thank you for buying!";
+ mes "Come again.";
+ close;
+
+ sL_NoZeny:
+ mes "You don't seem to have enough money.";
+ close;
+ sL_OverW:
+ mes "Hmm.... it seems that you are overweight...";
+ close;
+
+
+ M_Bye:
+ mes "[Gever AI Sharp]";
+ mes "Then come again next time.";
+ close;
+}
diff --git a/npc/merchants/ammo_boxes.txt b/npc/merchants/ammo_boxes.txt
index 036bfd2bb..c51157a87 100644
--- a/npc/merchants/ammo_boxes.txt
+++ b/npc/merchants/ammo_boxes.txt
@@ -1,116 +1,116 @@
-//===== eAthena Script ========================================
-//= Ammo Box Event
-//===== By: ==================================================
-//= Playtester
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Turns bullets into ammo boxes.
-//===== Additional Comments: =================================
-//= 1.0 Added the first 8 ammo boxes [Playtester]
-//============================================================
-
-que_ng.gat,187,149,3 script Kenny 83,{
- mes "[Kenny]";
- mes "My name is Kenny.";
- mes "I can create ^0000FFbullet casings^000000";
- mes "and ^0000FFsphere packs^000000.";
- next;
- mes "[Kenny]";
- mes "Would you like to try using one of";
- mes "my bullet bullet casings or sphere";
- mes "packs?";
- mes "Select the one you want me to make!";
- next;
-
- menu "Bullet Casing",-,"Silver Bullet Casing",Q2,"Shell of Blood Casing",Q3,"Lightning Sphere Pack",Q4,"Blind Sphere Pack",Q5,"Poison Sphere Pack",Q6,"Freezing Sphere Pack",Q7,"Flare Sphere Pack",Q8;
-
-// Arguments
-//===========
- callsub sF_Make, 13200,500,12149, "Bullet Casings";
- goto M_Menu;
-Q2:
- callsub sF_Make, 13201,500,12151, "Silver Bullet Casings";
- goto M_Menu;
-Q3:
- callsub sF_Make, 13202,500,12150, "Shell of Blood Casings";
- goto M_Menu;
-Q4:
- callsub sF_Make, 13204,500,12144, "Lightning Sphere Packs";
- goto M_Menu;
-Q5:
- callsub sF_Make, 13206,500,12145, "Blind Sphere Packs";
- goto M_Menu;
-Q6:
- callsub sF_Make, 13205,500,12146, "Poison Sphere Packs";
- goto M_Menu;
-Q7:
- callsub sF_Make, 13207,500,12147, "Freezing Sphere Packs";
- goto M_Menu;
-Q8:
- callsub sF_Make, 13203,500,12148, "Flare Sphere Packs";
- goto M_Menu;
-
-// Subfunction for making ammo boxes
-//==================================
-sF_Make:
- set @ammonum,500;
- if(countitem(getarg(0)) < @ammonum) goto L_NdAmmo;
- if(Zeny < getarg(1)) goto L_NdZeny;
- mes "[Kenny]";
- mes "What do you want me to do?";
- next;
- menu "Give me as many as you can.",-, "I want to set the amount.",sM_0b, "Nevermind",M_End;
-
- set @amount,50;
- if(zeny/getarg(1) < @amount) set @amount, zeny/getarg(1);
- if(countitem(getarg(0))/@ammonum < @amount) set @amount, countitem(getarg(0))/@ammonum;
- if(@amount > 0) goto L_End;
- mes "[Kenny]";
- mes "Dude, you don't even have the right items...";
- close;
-
- sM_0b:
- input @amount;
- if(@amount<1 || @amount>50) goto L_BadAmnt;
- if(countitem(getarg(0))/@ammonum < @amount) goto L_NdAmmo;
- if(Zeny < (getarg(1)*@amount)) goto L_NdZeny;
-
- L_End:
- set Zeny, Zeny - (getarg(1)*@amount);
- delitem getarg(0), (@amount*@ammonum);
- getitem getarg(2), @amount;
- mes "[Kenny]";
- mes "There you go~!";
- mes "Here are your " +getarg(3)+ ".";
- close;
-
- L_NdAmmo:
- mes "[Kenny]";
- mes "Sorry, but you need 500 bullets or";
- mes "spheres and 500 zeny to make";
- mes "1 bullet casing or 1 sphere pack.";
- close;
-
- L_NdZeny:
- mes "[Kenny]";
- mes "You don't have enough zeny for that many.";
- close;
-
- L_BadAmnt:
- mes "[Kenny]";
- mes "Please choose a number between 1 and 50.";
- close;
-
-L_Come:
- mes "[Kenny]";
- mes "Please, come again whenever you want too.";
- close;
-M_End:
- mes "[Kenny]";
- mes "Sure, no problem.";
- mes "Come back any time.";
- close;
+//===== eAthena Script ========================================
+//= Ammo Box Event
+//===== By: ==================================================
+//= Playtester
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Turns bullets into ammo boxes.
+//===== Additional Comments: =================================
+//= 1.0 Added the first 8 ammo boxes [Playtester]
+//============================================================
+
+que_ng.gat,187,149,3 script Kenny 83,{
+ mes "[Kenny]";
+ mes "My name is Kenny.";
+ mes "I can create ^0000FFbullet casings^000000";
+ mes "and ^0000FFsphere packs^000000.";
+ next;
+ mes "[Kenny]";
+ mes "Would you like to try using one of";
+ mes "my bullet bullet casings or sphere";
+ mes "packs?";
+ mes "Select the one you want me to make!";
+ next;
+
+ menu "Bullet Casing",-,"Silver Bullet Casing",Q2,"Shell of Blood Casing",Q3,"Lightning Sphere Pack",Q4,"Blind Sphere Pack",Q5,"Poison Sphere Pack",Q6,"Freezing Sphere Pack",Q7,"Flare Sphere Pack",Q8;
+
+// Arguments
+//===========
+ callsub sF_Make, 13200,500,12149, "Bullet Casings";
+ goto M_Menu;
+Q2:
+ callsub sF_Make, 13201,500,12151, "Silver Bullet Casings";
+ goto M_Menu;
+Q3:
+ callsub sF_Make, 13202,500,12150, "Shell of Blood Casings";
+ goto M_Menu;
+Q4:
+ callsub sF_Make, 13204,500,12144, "Lightning Sphere Packs";
+ goto M_Menu;
+Q5:
+ callsub sF_Make, 13206,500,12145, "Blind Sphere Packs";
+ goto M_Menu;
+Q6:
+ callsub sF_Make, 13205,500,12146, "Poison Sphere Packs";
+ goto M_Menu;
+Q7:
+ callsub sF_Make, 13207,500,12147, "Freezing Sphere Packs";
+ goto M_Menu;
+Q8:
+ callsub sF_Make, 13203,500,12148, "Flare Sphere Packs";
+ goto M_Menu;
+
+// Subfunction for making ammo boxes
+//==================================
+sF_Make:
+ set @ammonum,500;
+ if(countitem(getarg(0)) < @ammonum) goto L_NdAmmo;
+ if(Zeny < getarg(1)) goto L_NdZeny;
+ mes "[Kenny]";
+ mes "What do you want me to do?";
+ next;
+ menu "Give me as many as you can.",-, "I want to set the amount.",sM_0b, "Nevermind",M_End;
+
+ set @amount,50;
+ if(zeny/getarg(1) < @amount) set @amount, zeny/getarg(1);
+ if(countitem(getarg(0))/@ammonum < @amount) set @amount, countitem(getarg(0))/@ammonum;
+ if(@amount > 0) goto L_End;
+ mes "[Kenny]";
+ mes "Dude, you don't even have the right items...";
+ close;
+
+ sM_0b:
+ input @amount;
+ if(@amount<1 || @amount>50) goto L_BadAmnt;
+ if(countitem(getarg(0))/@ammonum < @amount) goto L_NdAmmo;
+ if(Zeny < (getarg(1)*@amount)) goto L_NdZeny;
+
+ L_End:
+ set Zeny, Zeny - (getarg(1)*@amount);
+ delitem getarg(0), (@amount*@ammonum);
+ getitem getarg(2), @amount;
+ mes "[Kenny]";
+ mes "There you go~!";
+ mes "Here are your " +getarg(3)+ ".";
+ close;
+
+ L_NdAmmo:
+ mes "[Kenny]";
+ mes "Sorry, but you need 500 bullets or";
+ mes "spheres and 500 zeny to make";
+ mes "1 bullet casing or 1 sphere pack.";
+ close;
+
+ L_NdZeny:
+ mes "[Kenny]";
+ mes "You don't have enough zeny for that many.";
+ close;
+
+ L_BadAmnt:
+ mes "[Kenny]";
+ mes "Please choose a number between 1 and 50.";
+ close;
+
+L_Come:
+ mes "[Kenny]";
+ mes "Please, come again whenever you want too.";
+ close;
+M_End:
+ mes "[Kenny]";
+ mes "Sure, no problem.";
+ mes "Come back any time.";
+ close;
} \ No newline at end of file
diff --git a/npc/merchants/ammo_dealer.txt b/npc/merchants/ammo_dealer.txt
index 00053d171..5a2947928 100644
--- a/npc/merchants/ammo_dealer.txt
+++ b/npc/merchants/ammo_dealer.txt
@@ -1,100 +1,100 @@
-//===== eAthena Script =======================================
-//= Ammo Dealer
-//===== By: ==================================================
-//= Playtester
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= trades items for spheres
-//===== Additional Comments: =================================
-//= 1.0 first version [Playtester]
-//============================================================
-
-// Ammo Dealer Tony
-que_ng.gat,187,156,3 script Tony 86,{
- mes "[Tony]";
- mes "I can make spheres for you.";
- mes "Spheres are the ammunition for";
- mes "grenade launchers.";
- next;
- mes "[Tony]";
- mes "For 30 spheres, I need";
- mes "^FF00001 Phracon^000000";
- mes "and";
- mes "^FF00001 Emveretarcon^000000.";
- next;
- mes "[Tony]";
- mes "I also need another material,";
- mes "depending on which sphere type";
- mes "you want to create.";
- next;
- mes "[Tony]";
- mes "Here's a list:";
- mes "Flare Sphere - ^FF00002 Burning Hearts^000000";
- mes "Lightning Sphere - ^FF00003 Cyfars^000000";
- mes "Poison Sphere - ^FF000010 Venom Canines^000000";
- mes "Blind Sphere - ^FF00005 Squid Inks^000000";
- mes "Freezing Sphere - ^FF00002 Brigans^000000";
- next;
- mes "[Tony]";
- mes "So which ones do you want me";
- mes "to create?";
- next;
- menu "Flare Sphere",-,"Lightning Sphere",S2,"Poison Sphere",S3,"Blind Sphere",S4,"Freezing Sphere",S5;
-
- callsub sF_Make,13203,7097,2;
-S2:
- callsub sF_Make,13204,7053,3;
-S3:
- callsub sF_Make,13205,937,10;
-S4:
- callsub sF_Make,13206,1024,5;
-S5:
- callsub sF_Make,13207,7054,2;
-
-//Subfunction, getarg(0):created sphere, getarg(1):special material, getarg(2):number needed
-sF_Make:
- if( (countitem(1010)<1) || (countitem(1011)<1) || (countitem(getarg(1))<getarg(2)) ) goto L_NoMat;
- mes "[Tony]";
- mes "So how many ^0000FF30x packages^000000 do";
- mes "you want me to make?";
- next;
- menu "-Exchange as many as possible.",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
-
- M_0:
- set @amount, 500;
- if(countitem(1010) < @amount) set @amount,countitem(1010);
- if(countitem(1011) < @amount) set @amount,countitem(1011);
- if(countitem(getarg(1))/getarg(2) < @amount) set @amount,countitem(getarg(1))/getarg(2);
- if(@amount > 0) goto L_Make;
- mes "[Tony]";
- mes "Are you trying to make a fool of me...?";
- close;
-
- M_1:
- input @amount;
- if(@amount < 1 || @amount > 500) goto M_End;
- if(countitem(1010) < @amount) goto L_NoMat;
- if(countitem(1011) < @amount) goto L_NoMat;
- if(countitem(getarg(1))/getarg(2) < @amount) goto L_NoMat;
-
- L_Make:
- delitem 1010,@amount;
- delitem 1011,@amount;
- delitem getarg(1),@amount*getarg(2);
- getitem getarg(0),@amount*30;
-
- M_End:
- mes "[Tony]";
- mes "Come back anytime.";
- close;
-
- L_NoMat:
- mes "[Tony]";
- mes "I'm sorry but you don't have";
- mes "enough materials to create the";
- mes "spheres.";
- close;
-}
+//===== eAthena Script =======================================
+//= Ammo Dealer
+//===== By: ==================================================
+//= Playtester
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= trades items for spheres
+//===== Additional Comments: =================================
+//= 1.0 first version [Playtester]
+//============================================================
+
+// Ammo Dealer Tony
+que_ng.gat,187,156,3 script Tony 86,{
+ mes "[Tony]";
+ mes "I can make spheres for you.";
+ mes "Spheres are the ammunition for";
+ mes "grenade launchers.";
+ next;
+ mes "[Tony]";
+ mes "For 30 spheres, I need";
+ mes "^FF00001 Phracon^000000";
+ mes "and";
+ mes "^FF00001 Emveretarcon^000000.";
+ next;
+ mes "[Tony]";
+ mes "I also need another material,";
+ mes "depending on which sphere type";
+ mes "you want to create.";
+ next;
+ mes "[Tony]";
+ mes "Here's a list:";
+ mes "Flare Sphere - ^FF00002 Burning Hearts^000000";
+ mes "Lightning Sphere - ^FF00003 Cyfars^000000";
+ mes "Poison Sphere - ^FF000010 Venom Canines^000000";
+ mes "Blind Sphere - ^FF00005 Squid Inks^000000";
+ mes "Freezing Sphere - ^FF00002 Brigans^000000";
+ next;
+ mes "[Tony]";
+ mes "So which ones do you want me";
+ mes "to create?";
+ next;
+ menu "Flare Sphere",-,"Lightning Sphere",S2,"Poison Sphere",S3,"Blind Sphere",S4,"Freezing Sphere",S5;
+
+ callsub sF_Make,13203,7097,2;
+S2:
+ callsub sF_Make,13204,7053,3;
+S3:
+ callsub sF_Make,13205,937,10;
+S4:
+ callsub sF_Make,13206,1024,5;
+S5:
+ callsub sF_Make,13207,7054,2;
+
+//Subfunction, getarg(0):created sphere, getarg(1):special material, getarg(2):number needed
+sF_Make:
+ if( (countitem(1010)<1) || (countitem(1011)<1) || (countitem(getarg(1))<getarg(2)) ) goto L_NoMat;
+ mes "[Tony]";
+ mes "So how many ^0000FF30x packages^000000 do";
+ mes "you want me to make?";
+ next;
+ menu "-Exchange as many as possible.",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
+
+ M_0:
+ set @amount, 500;
+ if(countitem(1010) < @amount) set @amount,countitem(1010);
+ if(countitem(1011) < @amount) set @amount,countitem(1011);
+ if(countitem(getarg(1))/getarg(2) < @amount) set @amount,countitem(getarg(1))/getarg(2);
+ if(@amount > 0) goto L_Make;
+ mes "[Tony]";
+ mes "Are you trying to make a fool of me...?";
+ close;
+
+ M_1:
+ input @amount;
+ if(@amount < 1 || @amount > 500) goto M_End;
+ if(countitem(1010) < @amount) goto L_NoMat;
+ if(countitem(1011) < @amount) goto L_NoMat;
+ if(countitem(getarg(1))/getarg(2) < @amount) goto L_NoMat;
+
+ L_Make:
+ delitem 1010,@amount;
+ delitem 1011,@amount;
+ delitem getarg(1),@amount*getarg(2);
+ getitem getarg(0),@amount*30;
+
+ M_End:
+ mes "[Tony]";
+ mes "Come back anytime.";
+ close;
+
+ L_NoMat:
+ mes "[Tony]";
+ mes "I'm sorry but you don't have";
+ mes "enough materials to create the";
+ mes "spheres.";
+ close;
+}
diff --git a/npc/merchants/clothes_dyer.txt b/npc/merchants/clothes_dyer.txt
index 976d96dcb..8f179ae80 100644
--- a/npc/merchants/clothes_dyer.txt
+++ b/npc/merchants/clothes_dyer.txt
@@ -1,388 +1,388 @@
-//===== eAthena Script =======================================
-//= Clothes Dyer
-//===== By: ==================================================
-//= Usnul
-//===== Current Version: =====================================
-//= 2.4
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Clothes dyer with standard palletes
-//===== Additional Comments: =================================
-//= Fully working
-//= 2.1 Shortened some labels to make this script loading,
-//= Added Black+White Colors desc [Lupus]
-//= 2.1a - added adv classes + abby class support [Lupus]
-//= 2.2 – Spell checked. [Nexon]
-//= 2.3 - Fixed dis $hit! [Poki#3]
-//= 2.4 - Disabled cloth dyeing since it's not implemented
-// on official servers and cause your client to crash
-// [Playtester]
-//============================================================
-//Note: To enable it, replace L_Busy with L_Dye
-//============================================================
-
-
-// Dyer Ginedin Rephere ---------------------------------------------------
-prt_in.gat,284,168,2 script Dyer Ginedin Rephere 55,{
- mes "[Dyer Ginedin Rephere]";
- mes "11... 12... Mmm... good. I think I'll be able to finish before tonight’s party. Oh! I didn't notice that you were here. Anyway how may I assist you?";
-M_Menu:
- next;
- menu "-Talk",L_Talk,"-Dye Clothing",L_Busy,"-Price list",L_PriceList,"-Cancel",L_End;
-
-L_Talk:
- mes "[Dyer Ginedin Rephere]";
- mes "Life may have gotten a little better.... but when I look at all of the orders I've received... Whew!";
- mes "It seems that the young women of Rune Midgard must be very well off these days.";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "Not that I think that they are indulging in anything luxurious mind you.";
- mes "I don't think there is anything wrong with the pursuit of beauty and being fashionable.";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "For us humans, who have no colorful fur or decorative scales, clothes are one of the few ways we have to display our personality, style, and beauty.";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "Haha... When I think about it, I really feel that my job is worthwhile. I believe that I provide a service that the people desire.";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "Can you feel it too? The energy that is released when rough fabric and leather are brought to life with color?.....";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "Although the process is very tedious and time consuming, the joy and happiness I feel when a dress is finished.....";
- mes "more than makes up for all of the hard work!!";
- goto M_Menu;
-
-L_Dye:
- mes "[Dyer Ginedin Rephere]";
- mes "Oh... you need my work? Well... okay sounds good.";
- next;
- mes "[Dyer Ginedin Rephere]";
- mes "Please choose a color that suits you.";
- next;
- if(Sex==0) goto Female_dye;
-//=================================
-// Clothing Dyeing for Males
-//=================================
-
-Male_dye:
- if(BaseJob==Job_Novice || BaseJob==Job_Novice_High || BaseJob==Job_Baby) goto L_Novice_M;
- if(BaseJob==Job_Swordman || BaseJob==Job_Swordman_High || BaseJob==Job_Baby_Swordman) goto L_Swordman_M;
- if(BaseJob==Job_Mage || BaseJob==Job_Mage_High || BaseJob==Job_Baby_Mage) goto L_Mage_M;
- if(BaseJob==Job_Archer || BaseJob==Job_Archer_High || BaseJob==Job_Baby_Archer) goto L_Archer_M;
- if(BaseJob==Job_Acolyte || BaseJob==Job_Acolyte_High || BaseJob==Job_Baby_Acolyte) goto L_Acolyte_M;
- if(BaseJob==Job_Merchant || BaseJob==Job_Merchant_High || BaseJob==Job_Baby_Merchant) goto L_Merchant_M;
- if(BaseJob==Job_Thief || BaseJob==Job_Thief_High || BaseJob==Job_Baby_Thief) goto L_Thief_M;
- if(BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 || BaseJob==Job_Lord_Knight || BaseJob==Job_Lord_Knight2 || BaseJob==Job_Paladin || BaseJob==Job_Paladin2 || BaseJob==Job_Stalker || BaseJob==Job_Baby_Knight || BaseJob==Job_Baby_Knight2 || BaseJob==Job_Baby_Crusader || BaseJob==Job_Baby_Crusader2) goto L_Swordman2_M;
- if(BaseJob==Job_Priest || BaseJob==Job_Monk || BaseJob==Job_High_Priest || BaseJob==Job_Champion || BaseJob==Job_Baby_Priest || BaseJob==Job_Baby_Monk) goto L_Acolyte2_M;
- if(BaseJob==Job_Wizard || BaseJob==Job_High_Wizard || BaseJob==Job_Baby_Wizard) goto L_Mage2_M;
- if(BaseJob==Job_Blacksmith || BaseJob==Job_Alchem || BaseJob==Job_Whitesmith || BaseJob==Job_Creator || BaseJob==Job_Baby_Blacksmith || BaseJob==Job_Baby_Alchem) goto L_Merchant2_M;
- if(BaseJob==Job_Hunter || BaseJob==Job_Bard || BaseJob==Job_Sniper || BaseJob==Job_Clown || BaseJob==Job_Baby_Hunter || BaseJob==Job_Baby_Bard) goto L_Archer2_M;
- if(BaseJob==Job_Assassin || BaseJob==Job_Rogue || BaseJob==Job_Assassin_Cross || BaseJob==Job_Baby_Assassin || BaseJob==Job_Baby_Rogue) goto L_Thief2_M;
- if(BaseJob==Job_SuperNovice || BaseJob==Job_Super_Baby) goto L_Super_Novice_M;
- goto sL_Sorry;
-//NOTE: Although Sages have pellets, they color non existent piece's of clothing. They are not listed, so players won't waste their items and zeny.
-//Professors also have a problem <.< The only thing that changes is a part of there Fox scarf. The Stalker Placement is not a bug!
-
-L_Novice_M:
- set @black, 1;
- set @blue, 2;
- set @green, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Swordman_M:
- set @black, 1;
- set @blue, 2;
- set @green, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Mage_M:
- set @red, 1;
- set @violet, 2;
- set @orange, 3;
- set @white, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Orange",L_Dye_Orange,"- White",L_Dye_White,"- Cancel",L_End;
-L_Archer_M:
- set @black, 1;
- set @violet, 2;
- set @green, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Acolyte_M:
- set @blue, 1;
- set @red, 2;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Merchant_M:
- set @black, 1;
- set @blue, 2;
- set @green, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Thief_M:
- set @green, 1;
- set @red, 2;
- set @white, 4;
- menu "- Default",L_Dye_Default,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
-L_Swordman2_M:
- set @violet, 1;
- set @red, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Red",L_Dye_Red,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Acolyte2_M:
- set @blue, 1;
- set @green, 2;
- set @red, 3;
- set @white, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
-L_Mage2_M:
- set @blue, 1;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Merchant2_M:
- set @black, 1;
- set @green, 2;
- set @white, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Cancel",L_End;
-L_Archer2_M:
- set @black, 1;
- set @blue, 2;
- set @green, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Thief2_M:
- set @blue, 1;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Cancel",L_End;
-L_Super_Novice_M:
- set @violet, 1;
- set @blue, 2;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-
-
-//=================================
-// Clothing Dyeing for Females
-//=================================
-Female_dye:
- if(BaseJob==Job_Novice || BaseJob==Job_Novice_High || BaseJob==Job_Baby) goto L_Novice_F;
- if(BaseJob==Job_Swordman || BaseJob==Job_Swordman_High || BaseJob==Job_Baby_Swordman) goto L_Swordman_F;
- if(BaseJob==Job_Mage || BaseJob==Job_Mage_High || BaseJob==Job_Baby_Mage) goto L_Mage_F;
- if(BaseJob==Job_Archer || BaseJob==Job_Archer_High || BaseJob==Job_Baby_Archer) goto L_Archer_F;
- if(BaseJob==Job_Acolyte || BaseJob==Job_Acolyte_High || BaseJob==Job_Baby_Acolyte) goto L_Acolyte_F;
- if(BaseJob==Job_Merchant || BaseJob==Job_Merchant_High || BaseJob==Job_Baby_Merchant) goto L_Merchant_F;
- if(BaseJob==Job_Thief || BaseJob==Job_Thief_High || BaseJob==Job_Baby_Thief) goto L_Thief_F;
- if(BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 || BaseJob==Job_Lord_Knight || BaseJob==Job_Lord_Knight2 || BaseJob==Job_Paladin || BaseJob==Job_Paladin2 || BaseJob==Job_Stalker || BaseJob==Job_Baby_Knight || BaseJob==Job_Baby_Knight2 || BaseJob==Job_Baby_Crusader || BaseJob==Job_Baby_Crusader2) goto L_Swordman2_F;
- if(BaseJob==Job_Priest || BaseJob==Job_Baby_Priest) goto L_Acolyte2_F;
- if(BaseJob==Job_Wizard || BaseJob==Job_Sage || BaseJob==Job_High_Wizard || BaseJob==Job_Professor || BaseJob==Job_Baby_Wizard || BaseJob==Job_Baby_Sage) goto L_Mage2_F;
- if(BaseJob==Job_Blacksmith || BaseJob==Job_Alchem || BaseJob==Job_Whitesmith || BaseJob==Job_Creator || BaseJob==Job_Baby_Blacksmith || BaseJob==Job_Baby_Alchem) goto L_Merchant2_F;
- if(BaseJob==Job_Hunter || BaseJob==Job_Dancer || BaseJob==Job_Sniper || BaseJob==Job_Gypsy || BaseJob==Job_Baby_Hunter || BaseJob==Job_Baby_Dancer) goto L_Archer2_F;
- if(BaseJob==Job_Assassin || BaseJob==Job_Baby_Assassin) goto L_Thief2_F;
- if(BaseJob==Job_Rogue || BaseJob==Job_Assassin_Cross || BaseJob==Job_Baby_Rogue) goto L_Thief3_F;
- if(BaseJob==Job_SuperNovice || BaseJob==Job_Super_Baby) goto L_Super_Novice_F;
- goto sL_Sorry;
-//NOTE: Same problems as with Males. This time: Monk, High Priest, Champion.
-//Rogue and Assassin Cross have her own check, because the default dye is black <.< The Stalker Placement is not a bug!
-
-L_Novice_F:
- set @blue, 1;
- set @red, 2;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Swordman_F:
- set @red, 1;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Mage_F:
- set @red, 1;
- set @violet, 2;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Archer_F:
- set @red, 1;
- set @green, 2;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Acolyte_F:
- set @red, 1;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Merchant_F:
- set @violet, 1;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Thief_F:
- set @red, 1;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Swordman2_F:
- set @blue, 1;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Acolyte2_F:
- set @red, 1;
- set @green, 2;
- set @white, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Mage2_F:
- set @red, 1;
- set @blue, 2;
- set @white, 3;
- set @green, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Green",L_Dye_Green,"- Cancel",L_End;
-L_Merchant2_F:
- set @red, 1;
- set @green, 2;
- set @violet, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Black",L_Dye_Black,"- Cancel",L_End;
-L_Archer2_F:
- set @blue, 1;
- set @green, 3;
- set @violet, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Cancel",L_End;
-L_Thief2_F:
- set @black, 1;
- set @yellow, 2;
- set @white, 3;
- menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Cancel",L_End;
-L_Thief3_F:
- set @yellow, 2;
- set @white, 3;
- menu "- Default",L_Dye_Default,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Cancel",L_End;
-L_Super_Novice_F:
- set @blue, 1;
- set @red, 2;
- set @green, 3;
- set @black, 4;
- menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
-
-//=================================
-// Rest of the script
-//=================================
-
-L_Dye_Default:
- mes "[Dyer Ginedin Rephere]";
- mes "I can change your dye to the default one for free.";
- mes "Are you sure?";
- next;
- menu "Yes",-,"No",L_End;
- mes "[Dyer Ginedin Rephere]";
- mes "OK. Here goes nothing.";
- setlook 7,0;
- close;
-L_Dye_Orange:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(980) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 980,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes orange.";
- setlook 7,@orange;
- close;
-L_Dye_Violet:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(981) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 981,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes Violet.";
- setlook 7,@violet;
- close;
-L_Dye_Red:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(975) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 975,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes red.";
- setlook 7,@red;
- close;
-L_Dye_Black:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(983) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 983,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes black.";
- setlook 7,@black;
- close;
-L_Dye_Green:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(979) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 979,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes green.";
- setlook 7,@green;
- close;
-L_Dye_Blue:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(978) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 978,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes blue.";
- setlook 7,@blue;
- close;
-L_Dye_White:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(982) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 982,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes white.";
- setlook 7,@white;
- close;
-L_Dye_Yellow:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(976) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- delitem 976,1;
- set Zeny, Zeny - 10000;
- mes "Ok. I will dye you clothes yellow.";
- setlook 7,@yellow;
- close;
-
-sL_Sorry:
- mes "Wow, your clothes is very strange, I haven't seen anything like it before. Hmmm... I'm sorry, but there is no way I can paint it.";
- close;
-
-sL_Zeny:
- mes "I'm sorry but you don't have enough money.";
- close;
-
-sL_NoDye:
- mes "For me to dye your clothes, I'll need the appropriate Dyestuff. Please check my price list for the information.";
- next;
-
-L_Busy:
- mes "Sorry, I'm too busy with other jobs to dye your clothes.";
- goto M_Menu;
-
-L_PriceList:
- mes "[Dyer Ginedin Rephere]";
- mes "Here is the list of colors you can choose from and their prices:";
- mes " ";
- mes " - ^FF4422Red^000000: 10000 zeny, 1 Scarlet Dyestuff";
- mes " - ^D5A500Yellow^000000: 10000 zeny, 1 Lemon Dyestuff";
- mes " - ^AA00AAViolet^000000: 10000 zeny, 1 Violet Dyestuff";
- mes " - ^FF8800Orange^000000: 10000 zeny, 1 Orange Dyestuff";
- mes " - ^4422FFBlue^000000: 10000 zeny, 1 CobaltBlue Dyestuff";
- mes " - ^009500Green^000000: 10000 zeny, 1 DarkGreen Dyestuff";
- mes " - Black: 10000 zeny, 1 Black Dyestuff";
- mes " - White: 10000 zeny, 1 White Dyestuff";
- goto M_Menu;
-
-L_End:
- mes "[Dyer Ginedin Rephere]";
- mes "Make yourself at home. Even though I don't have time for you.";
- close;
-}
+//===== eAthena Script =======================================
+//= Clothes Dyer
+//===== By: ==================================================
+//= Usnul
+//===== Current Version: =====================================
+//= 2.4
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Clothes dyer with standard palletes
+//===== Additional Comments: =================================
+//= Fully working
+//= 2.1 Shortened some labels to make this script loading,
+//= Added Black+White Colors desc [Lupus]
+//= 2.1a - added adv classes + abby class support [Lupus]
+//= 2.2 – Spell checked. [Nexon]
+//= 2.3 - Fixed dis $hit! [Poki#3]
+//= 2.4 - Disabled cloth dyeing since it's not implemented
+// on official servers and cause your client to crash
+// [Playtester]
+//============================================================
+//Note: To enable it, replace L_Busy with L_Dye
+//============================================================
+
+
+// Dyer Ginedin Rephere ---------------------------------------------------
+prt_in.gat,284,168,2 script Dyer Ginedin Rephere 55,{
+ mes "[Dyer Ginedin Rephere]";
+ mes "11... 12... Mmm... good. I think I'll be able to finish before tonight’s party. Oh! I didn't notice that you were here. Anyway how may I assist you?";
+M_Menu:
+ next;
+ menu "-Talk",L_Talk,"-Dye Clothing",L_Busy,"-Price list",L_PriceList,"-Cancel",L_End;
+
+L_Talk:
+ mes "[Dyer Ginedin Rephere]";
+ mes "Life may have gotten a little better.... but when I look at all of the orders I've received... Whew!";
+ mes "It seems that the young women of Rune Midgard must be very well off these days.";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "Not that I think that they are indulging in anything luxurious mind you.";
+ mes "I don't think there is anything wrong with the pursuit of beauty and being fashionable.";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "For us humans, who have no colorful fur or decorative scales, clothes are one of the few ways we have to display our personality, style, and beauty.";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "Haha... When I think about it, I really feel that my job is worthwhile. I believe that I provide a service that the people desire.";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "Can you feel it too? The energy that is released when rough fabric and leather are brought to life with color?.....";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "Although the process is very tedious and time consuming, the joy and happiness I feel when a dress is finished.....";
+ mes "more than makes up for all of the hard work!!";
+ goto M_Menu;
+
+L_Dye:
+ mes "[Dyer Ginedin Rephere]";
+ mes "Oh... you need my work? Well... okay sounds good.";
+ next;
+ mes "[Dyer Ginedin Rephere]";
+ mes "Please choose a color that suits you.";
+ next;
+ if(Sex==0) goto Female_dye;
+//=================================
+// Clothing Dyeing for Males
+//=================================
+
+Male_dye:
+ if(BaseJob==Job_Novice || BaseJob==Job_Novice_High || BaseJob==Job_Baby) goto L_Novice_M;
+ if(BaseJob==Job_Swordman || BaseJob==Job_Swordman_High || BaseJob==Job_Baby_Swordman) goto L_Swordman_M;
+ if(BaseJob==Job_Mage || BaseJob==Job_Mage_High || BaseJob==Job_Baby_Mage) goto L_Mage_M;
+ if(BaseJob==Job_Archer || BaseJob==Job_Archer_High || BaseJob==Job_Baby_Archer) goto L_Archer_M;
+ if(BaseJob==Job_Acolyte || BaseJob==Job_Acolyte_High || BaseJob==Job_Baby_Acolyte) goto L_Acolyte_M;
+ if(BaseJob==Job_Merchant || BaseJob==Job_Merchant_High || BaseJob==Job_Baby_Merchant) goto L_Merchant_M;
+ if(BaseJob==Job_Thief || BaseJob==Job_Thief_High || BaseJob==Job_Baby_Thief) goto L_Thief_M;
+ if(BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 || BaseJob==Job_Lord_Knight || BaseJob==Job_Lord_Knight2 || BaseJob==Job_Paladin || BaseJob==Job_Paladin2 || BaseJob==Job_Stalker || BaseJob==Job_Baby_Knight || BaseJob==Job_Baby_Knight2 || BaseJob==Job_Baby_Crusader || BaseJob==Job_Baby_Crusader2) goto L_Swordman2_M;
+ if(BaseJob==Job_Priest || BaseJob==Job_Monk || BaseJob==Job_High_Priest || BaseJob==Job_Champion || BaseJob==Job_Baby_Priest || BaseJob==Job_Baby_Monk) goto L_Acolyte2_M;
+ if(BaseJob==Job_Wizard || BaseJob==Job_High_Wizard || BaseJob==Job_Baby_Wizard) goto L_Mage2_M;
+ if(BaseJob==Job_Blacksmith || BaseJob==Job_Alchem || BaseJob==Job_Whitesmith || BaseJob==Job_Creator || BaseJob==Job_Baby_Blacksmith || BaseJob==Job_Baby_Alchem) goto L_Merchant2_M;
+ if(BaseJob==Job_Hunter || BaseJob==Job_Bard || BaseJob==Job_Sniper || BaseJob==Job_Clown || BaseJob==Job_Baby_Hunter || BaseJob==Job_Baby_Bard) goto L_Archer2_M;
+ if(BaseJob==Job_Assassin || BaseJob==Job_Rogue || BaseJob==Job_Assassin_Cross || BaseJob==Job_Baby_Assassin || BaseJob==Job_Baby_Rogue) goto L_Thief2_M;
+ if(BaseJob==Job_SuperNovice || BaseJob==Job_Super_Baby) goto L_Super_Novice_M;
+ goto sL_Sorry;
+//NOTE: Although Sages have pellets, they color non existent piece's of clothing. They are not listed, so players won't waste their items and zeny.
+//Professors also have a problem <.< The only thing that changes is a part of there Fox scarf. The Stalker Placement is not a bug!
+
+L_Novice_M:
+ set @black, 1;
+ set @blue, 2;
+ set @green, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Swordman_M:
+ set @black, 1;
+ set @blue, 2;
+ set @green, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Mage_M:
+ set @red, 1;
+ set @violet, 2;
+ set @orange, 3;
+ set @white, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Orange",L_Dye_Orange,"- White",L_Dye_White,"- Cancel",L_End;
+L_Archer_M:
+ set @black, 1;
+ set @violet, 2;
+ set @green, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Acolyte_M:
+ set @blue, 1;
+ set @red, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Merchant_M:
+ set @black, 1;
+ set @blue, 2;
+ set @green, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Thief_M:
+ set @green, 1;
+ set @red, 2;
+ set @white, 4;
+ menu "- Default",L_Dye_Default,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
+L_Swordman2_M:
+ set @violet, 1;
+ set @red, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Red",L_Dye_Red,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Acolyte2_M:
+ set @blue, 1;
+ set @green, 2;
+ set @red, 3;
+ set @white, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
+L_Mage2_M:
+ set @blue, 1;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Merchant2_M:
+ set @black, 1;
+ set @green, 2;
+ set @white, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Cancel",L_End;
+L_Archer2_M:
+ set @black, 1;
+ set @blue, 2;
+ set @green, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Thief2_M:
+ set @blue, 1;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Cancel",L_End;
+L_Super_Novice_M:
+ set @violet, 1;
+ set @blue, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+
+
+//=================================
+// Clothing Dyeing for Females
+//=================================
+Female_dye:
+ if(BaseJob==Job_Novice || BaseJob==Job_Novice_High || BaseJob==Job_Baby) goto L_Novice_F;
+ if(BaseJob==Job_Swordman || BaseJob==Job_Swordman_High || BaseJob==Job_Baby_Swordman) goto L_Swordman_F;
+ if(BaseJob==Job_Mage || BaseJob==Job_Mage_High || BaseJob==Job_Baby_Mage) goto L_Mage_F;
+ if(BaseJob==Job_Archer || BaseJob==Job_Archer_High || BaseJob==Job_Baby_Archer) goto L_Archer_F;
+ if(BaseJob==Job_Acolyte || BaseJob==Job_Acolyte_High || BaseJob==Job_Baby_Acolyte) goto L_Acolyte_F;
+ if(BaseJob==Job_Merchant || BaseJob==Job_Merchant_High || BaseJob==Job_Baby_Merchant) goto L_Merchant_F;
+ if(BaseJob==Job_Thief || BaseJob==Job_Thief_High || BaseJob==Job_Baby_Thief) goto L_Thief_F;
+ if(BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 || BaseJob==Job_Lord_Knight || BaseJob==Job_Lord_Knight2 || BaseJob==Job_Paladin || BaseJob==Job_Paladin2 || BaseJob==Job_Stalker || BaseJob==Job_Baby_Knight || BaseJob==Job_Baby_Knight2 || BaseJob==Job_Baby_Crusader || BaseJob==Job_Baby_Crusader2) goto L_Swordman2_F;
+ if(BaseJob==Job_Priest || BaseJob==Job_Baby_Priest) goto L_Acolyte2_F;
+ if(BaseJob==Job_Wizard || BaseJob==Job_Sage || BaseJob==Job_High_Wizard || BaseJob==Job_Professor || BaseJob==Job_Baby_Wizard || BaseJob==Job_Baby_Sage) goto L_Mage2_F;
+ if(BaseJob==Job_Blacksmith || BaseJob==Job_Alchem || BaseJob==Job_Whitesmith || BaseJob==Job_Creator || BaseJob==Job_Baby_Blacksmith || BaseJob==Job_Baby_Alchem) goto L_Merchant2_F;
+ if(BaseJob==Job_Hunter || BaseJob==Job_Dancer || BaseJob==Job_Sniper || BaseJob==Job_Gypsy || BaseJob==Job_Baby_Hunter || BaseJob==Job_Baby_Dancer) goto L_Archer2_F;
+ if(BaseJob==Job_Assassin || BaseJob==Job_Baby_Assassin) goto L_Thief2_F;
+ if(BaseJob==Job_Rogue || BaseJob==Job_Assassin_Cross || BaseJob==Job_Baby_Rogue) goto L_Thief3_F;
+ if(BaseJob==Job_SuperNovice || BaseJob==Job_Super_Baby) goto L_Super_Novice_F;
+ goto sL_Sorry;
+//NOTE: Same problems as with Males. This time: Monk, High Priest, Champion.
+//Rogue and Assassin Cross have her own check, because the default dye is black <.< The Stalker Placement is not a bug!
+
+L_Novice_F:
+ set @blue, 1;
+ set @red, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Swordman_F:
+ set @red, 1;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Mage_F:
+ set @red, 1;
+ set @violet, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Archer_F:
+ set @red, 1;
+ set @green, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Acolyte_F:
+ set @red, 1;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Merchant_F:
+ set @violet, 1;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Thief_F:
+ set @red, 1;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Swordman2_F:
+ set @blue, 1;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Acolyte2_F:
+ set @red, 1;
+ set @green, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Mage2_F:
+ set @red, 1;
+ set @blue, 2;
+ set @white, 3;
+ set @green, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Green",L_Dye_Green,"- Cancel",L_End;
+L_Merchant2_F:
+ set @red, 1;
+ set @green, 2;
+ set @violet, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Black",L_Dye_Black,"- Cancel",L_End;
+L_Archer2_F:
+ set @blue, 1;
+ set @green, 3;
+ set @violet, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Cancel",L_End;
+L_Thief2_F:
+ set @black, 1;
+ set @yellow, 2;
+ set @white, 3;
+ menu "- Default",L_Dye_Default,"- Black",L_Dye_Black,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Cancel",L_End;
+L_Thief3_F:
+ set @yellow, 2;
+ set @white, 3;
+ menu "- Default",L_Dye_Default,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Cancel",L_End;
+L_Super_Novice_F:
+ set @blue, 1;
+ set @red, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Default",L_Dye_Default,"- Blue",L_Dye_Blue,"- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+
+//=================================
+// Rest of the script
+//=================================
+
+L_Dye_Default:
+ mes "[Dyer Ginedin Rephere]";
+ mes "I can change your dye to the default one for free.";
+ mes "Are you sure?";
+ next;
+ menu "Yes",-,"No",L_End;
+ mes "[Dyer Ginedin Rephere]";
+ mes "OK. Here goes nothing.";
+ setlook 7,0;
+ close;
+L_Dye_Orange:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(980) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 980,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes orange.";
+ setlook 7,@orange;
+ close;
+L_Dye_Violet:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(981) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 981,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes Violet.";
+ setlook 7,@violet;
+ close;
+L_Dye_Red:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(975) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 975,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes red.";
+ setlook 7,@red;
+ close;
+L_Dye_Black:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(983) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 983,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes black.";
+ setlook 7,@black;
+ close;
+L_Dye_Green:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(979) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 979,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes green.";
+ setlook 7,@green;
+ close;
+L_Dye_Blue:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(978) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 978,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes blue.";
+ setlook 7,@blue;
+ close;
+L_Dye_White:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(982) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 982,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes white.";
+ setlook 7,@white;
+ close;
+L_Dye_Yellow:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(976) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ delitem 976,1;
+ set Zeny, Zeny - 10000;
+ mes "Ok. I will dye you clothes yellow.";
+ setlook 7,@yellow;
+ close;
+
+sL_Sorry:
+ mes "Wow, your clothes is very strange, I haven't seen anything like it before. Hmmm... I'm sorry, but there is no way I can paint it.";
+ close;
+
+sL_Zeny:
+ mes "I'm sorry but you don't have enough money.";
+ close;
+
+sL_NoDye:
+ mes "For me to dye your clothes, I'll need the appropriate Dyestuff. Please check my price list for the information.";
+ next;
+
+L_Busy:
+ mes "Sorry, I'm too busy with other jobs to dye your clothes.";
+ goto M_Menu;
+
+L_PriceList:
+ mes "[Dyer Ginedin Rephere]";
+ mes "Here is the list of colors you can choose from and their prices:";
+ mes " ";
+ mes " - ^FF4422Red^000000: 10000 zeny, 1 Scarlet Dyestuff";
+ mes " - ^D5A500Yellow^000000: 10000 zeny, 1 Lemon Dyestuff";
+ mes " - ^AA00AAViolet^000000: 10000 zeny, 1 Violet Dyestuff";
+ mes " - ^FF8800Orange^000000: 10000 zeny, 1 Orange Dyestuff";
+ mes " - ^4422FFBlue^000000: 10000 zeny, 1 CobaltBlue Dyestuff";
+ mes " - ^009500Green^000000: 10000 zeny, 1 DarkGreen Dyestuff";
+ mes " - Black: 10000 zeny, 1 Black Dyestuff";
+ mes " - White: 10000 zeny, 1 White Dyestuff";
+ goto M_Menu;
+
+L_End:
+ mes "[Dyer Ginedin Rephere]";
+ mes "Make yourself at home. Even though I don't have time for you.";
+ close;
+}
diff --git a/npc/merchants/dye_maker.txt b/npc/merchants/dye_maker.txt
index ecfdce186..02c5ddaae 100644
--- a/npc/merchants/dye_maker.txt
+++ b/npc/merchants/dye_maker.txt
@@ -1,277 +1,277 @@
-//===== eAthena Script =======================================
-//= Dye Maker
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Spell Checked [Nexon]
-//============================================================
-
-
-
-// Dye Maker JavaDullihan =======================
-morocc_in.gat,146,99,2 script Dye Maker JavaDullihan 122,{
- mes "[Dye Maker JavaDullihan]";
- mes "Oh... What a Beautiful day today.";
- mes "This is a perfect day to make Dyestuffs";
- next;
- menu "-Talk",M_Talk,"-Make Dyestuffs",M_Make,"-Cancel",M_End;
-
- M_Talk:
- mes "[Dye Maker JavaDullihan]";
- mes "I don't have much to say...";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "But if you want to know about my past, I'm sure I have a few stories to tell.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Would you like to here some?";
- next;
- menu "-Sure, why not.",sM_0a,"-Maybe some other time.",sM_0b;
-
- sM_0a:
- mes "[Dye Maker JavaDullihan]";
- mes "My father had been making dyestuffs since I was young... ..";
- mes "I can still picture him making dyestuffs all day long.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Even during the time of my mother's passing, my father kept making dyestuffs without end.";
- mes "This made me angry at him. How could he keep making dyestuffs at a time like that?";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "I just couldn't understand what my father was thinking. I became very disappointed in him.";
- mes "My fathers actions made me despise Dye Making, so I ran away from home. I survived by doing a variety of odd jobs.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "However, as you can see, I ended up becoming a Dye Maker just like my father.";
- mes "It's been 15 years since I first started making these goddamn things...";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Now that I've been doing this for as long as I have... I think I can finally understand why my father fell in love with his job.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Why he sacrificed everything he had for this job...";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Maybe it was because of how the colors got more and more beautiful each time...";
- mes "Maybe he wanted to find his own perfect color...";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "I now have his feel for the colors... because... I am working with the same passion he had when he was living.";
- mes "I am able to feel the colors from within my soul. I know it's hard to understand, but you will see what I mean.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "Father, I make these dyes for you....";
- close;
-
- sM_0b:
- mes "[Dye Maker JavaDullihan]";
- mes "Hahahaha... I guess I can't blame ya, who wants to here about a plain old dye maker's life anyhow.... Hahahaha...";
- close;
-
- M_Make:
- mes "[Dye Maker JavaDullihan]";
- mes "Alright! I will make the exact color you want. The cost of the dyestuff will depend on its quality.";
- mes "Don't not be itimitaded by the prices, they are all my Masterpieces.";
- next;
- mes "[Dye Maker JavaDullihan]";
- mes "So what color do you want?";
- next;
- menu "-Scarlet Dyestuffs",sM_Scarlet, "-Lemon Dyestuffs",sM_Lemon, "-Cobaltblue Dyestuffs",sM_Cobaltblue,
- "-Darkgreen Dyestuffs",sM_Darkgreen, "-Orange Dyestuffs",sM_Orange, "-Violet Dyestuffs",sM_Violet,
- "-White Dyestuffs",sM_White, "-Black Dyestuffs",sM_Black;
-
- sM_Scarlet:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Scarlet Dyestuffs, I need ^0000ff30 Red Herbs, 1 Counteragent and 1 Empty Bottle^000000.";
- mes "The cost of labor will be 3000 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make0, "Cancel",sm_Cancel;
-
- sm_Make0:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(507) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 3000) goto sl_LowZeny;
- set Zeny, Zeny - 3000;
- delitem 507,30;
- delitem 973,1;
- delitem 713,1;
- getitem 975,1;
- mes "Missing text.";
- mes "Under development";
- close;
-
- sM_Lemon:
- mes "[Dye Maker JavaDullihan]";
- mes "Um... to make a Lemon Dyestuffs I need ^0000ff30 Yellow Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
- mes "The cost of labor will be 3000 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make1,"Cancel",sm_Cancel;
-
- sm_Make1:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(508) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 3000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 508,30;
- delitem 973,1;
- delitem 713,1;
- set Zeny, Zeny - 3000;
- getitem 976,1;
- close;
-
- sM_Cobaltblue:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Cobaltblue Dyestuffs, I need ^0000ff20 Blue Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
- mes "Blue Herbs are a little bit difficult to work with, so the cost of labor will be 3500 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make2,"Cancel",sm_Cancel;
-
- sm_Make2:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(510) < 20) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 3500) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 510,20;
- delitem 973,1;
- delitem 713,1;
- set Zeny, Zeny - 3500;
- getitem 978,1;
- close;
-
- sM_Darkgreen:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Darkgreen Dyestuffs, I need ^0000ff5 Blue Herbs, 20 Green Herbs, 20 Yellow Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
- mes "There are a lot of ingredients so please try to remember them all. The cost of labore will be 5000 Zeny. Are you still interested?";
- mes "Ok are you ready?";
- next;
- menu "Make Dyestuffs",sm_Make3,"Cancel",sm_Cancel;
-
- sm_Make3:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(510) < 5) || (countitem(511) < 20) || (countitem(508) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713)<1)) goto sl_LowItems;
- if(Zeny < 5000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 510,5;
- delitem 511,20;
- delitem 508,20;
- delitem 973,1;
- delitem 974,1;
- delitem 713,1;
- set Zeny, Zeny - 5000;
- getitem 979,1;
- close;
-
- sM_Orange:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Orange Dyestuffs, I need ^0000ff20 Red Herbs, 20 Yellow Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
- mes "The cost of labor is 5000 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make4,"Cancel",sm_Cancel;
-
- sm_Make4:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(507) < 20) || (countitem(508) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 5000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 507,20;
- delitem 508,20;
- delitem 973,1;
- delitem 974,1;
- delitem 713,1;
- set Zeny, Zeny - 5000;
- getitem 980,1;
- close;
-
- sM_Violet:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Violet Dyestuffs, I need ^0000ff10 Blue Herbs, 30 Red Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
- mes "The cost of labor will be 5000 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make5,"Cancel",sm_Cancel;
-
- sm_Make5:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(510) < 10) || (countitem(507) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 5000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 510,10;
- delitem 507,20;
- delitem 973,1;
- delitem 974,1;
- delitem 713,1;
- set Zeny, Zeny - 5000;
- getitem 981,1;
- close;
-
- sM_White:
- mes "[Dye Maker JavaDullihan]";
- mes "Umm... To make a White Dyestuffs, I need ^0000ff30 White Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
- mes "The cost of labor will be 3000 Zeny. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make6,"Cancel",sm_Cancel;
-
- sm_Make6:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(509) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
- if(Zeny < 3000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 509,30;
- delitem 973,1;
- delitem 713,1;
- set Zeny, Zeny - 3000;
- getitem 982,1;
- close;
-
- sM_Black:
- mes "[Dye Maker JavaDullihan]";
- mes "Hmm... To make a Black Dyestuffs, I need ^0000ff30 Red, Yellow, and Green Herbs, 5 Blue Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
- mes "This is the most difficult and time consuming dye to make, so I will have to charge a 7000 Zeny labor fee. Are you still interested?";
- next;
- menu "Make Dyestuffs",sm_Make7,"Cancel",sm_Cancel;
-
- sm_Make7:
- mes "[Dye Maker JavaDullihan]";
- if((countitem(507) < 30) || (countitem(508) < 30) || (countitem(511) < 30) || (countitem(510) < 5) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713)<1)) goto sl_LowItems;
- if(Zeny < 7000) goto sl_LowZeny;
- mes "Missing text.";
- mes "Under development";
- delitem 507,30;
- delitem 508,30;
- delitem 511,30;
- delitem 510,5;
- delitem 973,1;
- delitem 974,1;
- delitem 713,1;
- set Zeny, Zeny - 7000;
- getitem 983,1;
- close;
-
-
- sl_LowItems:
- mes "Hmm... you don't have enough of the items needed for the dyestuffs. Come back when you do.";
- close;
-
- sl_LowZeny:
- mes "You don't have enough zeny. I need to make a living ya know....";
- close;
-
- sm_Cancel:
- mes "[Dye Maker JavaDullihan]";
- mes "How could you have change your mind so quickly?... oh boy...";
- close;
- M_End:
- close;
-}
+//===== eAthena Script =======================================
+//= Dye Maker
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Spell Checked [Nexon]
+//============================================================
+
+
+
+// Dye Maker JavaDullihan =======================
+morocc_in.gat,146,99,2 script Dye Maker JavaDullihan 122,{
+ mes "[Dye Maker JavaDullihan]";
+ mes "Oh... What a Beautiful day today.";
+ mes "This is a perfect day to make Dyestuffs";
+ next;
+ menu "-Talk",M_Talk,"-Make Dyestuffs",M_Make,"-Cancel",M_End;
+
+ M_Talk:
+ mes "[Dye Maker JavaDullihan]";
+ mes "I don't have much to say...";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "But if you want to know about my past, I'm sure I have a few stories to tell.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Would you like to here some?";
+ next;
+ menu "-Sure, why not.",sM_0a,"-Maybe some other time.",sM_0b;
+
+ sM_0a:
+ mes "[Dye Maker JavaDullihan]";
+ mes "My father had been making dyestuffs since I was young... ..";
+ mes "I can still picture him making dyestuffs all day long.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Even during the time of my mother's passing, my father kept making dyestuffs without end.";
+ mes "This made me angry at him. How could he keep making dyestuffs at a time like that?";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "I just couldn't understand what my father was thinking. I became very disappointed in him.";
+ mes "My fathers actions made me despise Dye Making, so I ran away from home. I survived by doing a variety of odd jobs.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "However, as you can see, I ended up becoming a Dye Maker just like my father.";
+ mes "It's been 15 years since I first started making these goddamn things...";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Now that I've been doing this for as long as I have... I think I can finally understand why my father fell in love with his job.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Why he sacrificed everything he had for this job...";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Maybe it was because of how the colors got more and more beautiful each time...";
+ mes "Maybe he wanted to find his own perfect color...";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "I now have his feel for the colors... because... I am working with the same passion he had when he was living.";
+ mes "I am able to feel the colors from within my soul. I know it's hard to understand, but you will see what I mean.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "Father, I make these dyes for you....";
+ close;
+
+ sM_0b:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hahahaha... I guess I can't blame ya, who wants to here about a plain old dye maker's life anyhow.... Hahahaha...";
+ close;
+
+ M_Make:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Alright! I will make the exact color you want. The cost of the dyestuff will depend on its quality.";
+ mes "Don't not be itimitaded by the prices, they are all my Masterpieces.";
+ next;
+ mes "[Dye Maker JavaDullihan]";
+ mes "So what color do you want?";
+ next;
+ menu "-Scarlet Dyestuffs",sM_Scarlet, "-Lemon Dyestuffs",sM_Lemon, "-Cobaltblue Dyestuffs",sM_Cobaltblue,
+ "-Darkgreen Dyestuffs",sM_Darkgreen, "-Orange Dyestuffs",sM_Orange, "-Violet Dyestuffs",sM_Violet,
+ "-White Dyestuffs",sM_White, "-Black Dyestuffs",sM_Black;
+
+ sM_Scarlet:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Scarlet Dyestuffs, I need ^0000ff30 Red Herbs, 1 Counteragent and 1 Empty Bottle^000000.";
+ mes "The cost of labor will be 3000 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make0, "Cancel",sm_Cancel;
+
+ sm_Make0:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(507) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 3000) goto sl_LowZeny;
+ set Zeny, Zeny - 3000;
+ delitem 507,30;
+ delitem 973,1;
+ delitem 713,1;
+ getitem 975,1;
+ mes "Missing text.";
+ mes "Under development";
+ close;
+
+ sM_Lemon:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Um... to make a Lemon Dyestuffs I need ^0000ff30 Yellow Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
+ mes "The cost of labor will be 3000 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make1,"Cancel",sm_Cancel;
+
+ sm_Make1:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(508) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 3000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 508,30;
+ delitem 973,1;
+ delitem 713,1;
+ set Zeny, Zeny - 3000;
+ getitem 976,1;
+ close;
+
+ sM_Cobaltblue:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Cobaltblue Dyestuffs, I need ^0000ff20 Blue Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
+ mes "Blue Herbs are a little bit difficult to work with, so the cost of labor will be 3500 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make2,"Cancel",sm_Cancel;
+
+ sm_Make2:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(510) < 20) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 3500) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 510,20;
+ delitem 973,1;
+ delitem 713,1;
+ set Zeny, Zeny - 3500;
+ getitem 978,1;
+ close;
+
+ sM_Darkgreen:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Darkgreen Dyestuffs, I need ^0000ff5 Blue Herbs, 20 Green Herbs, 20 Yellow Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
+ mes "There are a lot of ingredients so please try to remember them all. The cost of labore will be 5000 Zeny. Are you still interested?";
+ mes "Ok are you ready?";
+ next;
+ menu "Make Dyestuffs",sm_Make3,"Cancel",sm_Cancel;
+
+ sm_Make3:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(510) < 5) || (countitem(511) < 20) || (countitem(508) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713)<1)) goto sl_LowItems;
+ if(Zeny < 5000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 510,5;
+ delitem 511,20;
+ delitem 508,20;
+ delitem 973,1;
+ delitem 974,1;
+ delitem 713,1;
+ set Zeny, Zeny - 5000;
+ getitem 979,1;
+ close;
+
+ sM_Orange:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Orange Dyestuffs, I need ^0000ff20 Red Herbs, 20 Yellow Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
+ mes "The cost of labor is 5000 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make4,"Cancel",sm_Cancel;
+
+ sm_Make4:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(507) < 20) || (countitem(508) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 5000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 507,20;
+ delitem 508,20;
+ delitem 973,1;
+ delitem 974,1;
+ delitem 713,1;
+ set Zeny, Zeny - 5000;
+ getitem 980,1;
+ close;
+
+ sM_Violet:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Violet Dyestuffs, I need ^0000ff10 Blue Herbs, 30 Red Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
+ mes "The cost of labor will be 5000 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make5,"Cancel",sm_Cancel;
+
+ sm_Make5:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(510) < 10) || (countitem(507) < 20) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 5000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 510,10;
+ delitem 507,20;
+ delitem 973,1;
+ delitem 974,1;
+ delitem 713,1;
+ set Zeny, Zeny - 5000;
+ getitem 981,1;
+ close;
+
+ sM_White:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Umm... To make a White Dyestuffs, I need ^0000ff30 White Herbs, 1 Counteragent, and 1 Empty Bottle^000000.";
+ mes "The cost of labor will be 3000 Zeny. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make6,"Cancel",sm_Cancel;
+
+ sm_Make6:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(509) < 30) || (countitem(973) < 1) || (countitem(713) < 1)) goto sl_LowItems;
+ if(Zeny < 3000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 509,30;
+ delitem 973,1;
+ delitem 713,1;
+ set Zeny, Zeny - 3000;
+ getitem 982,1;
+ close;
+
+ sM_Black:
+ mes "[Dye Maker JavaDullihan]";
+ mes "Hmm... To make a Black Dyestuffs, I need ^0000ff30 Red, Yellow, and Green Herbs, 5 Blue Herbs, 1 Counteragent, 1 Mixture, and 1 Empty Bottle^000000.";
+ mes "This is the most difficult and time consuming dye to make, so I will have to charge a 7000 Zeny labor fee. Are you still interested?";
+ next;
+ menu "Make Dyestuffs",sm_Make7,"Cancel",sm_Cancel;
+
+ sm_Make7:
+ mes "[Dye Maker JavaDullihan]";
+ if((countitem(507) < 30) || (countitem(508) < 30) || (countitem(511) < 30) || (countitem(510) < 5) || (countitem(973) < 1) || (countitem(974) < 1) || (countitem(713)<1)) goto sl_LowItems;
+ if(Zeny < 7000) goto sl_LowZeny;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 507,30;
+ delitem 508,30;
+ delitem 511,30;
+ delitem 510,5;
+ delitem 973,1;
+ delitem 974,1;
+ delitem 713,1;
+ set Zeny, Zeny - 7000;
+ getitem 983,1;
+ close;
+
+
+ sl_LowItems:
+ mes "Hmm... you don't have enough of the items needed for the dyestuffs. Come back when you do.";
+ close;
+
+ sl_LowZeny:
+ mes "You don't have enough zeny. I need to make a living ya know....";
+ close;
+
+ sm_Cancel:
+ mes "[Dye Maker JavaDullihan]";
+ mes "How could you have change your mind so quickly?... oh boy...";
+ close;
+ M_End:
+ close;
+}
diff --git a/npc/merchants/grandpa_pharmacist.txt b/npc/merchants/grandpa_pharmacist.txt
index 67ff9e02a..869ef036e 100644
--- a/npc/merchants/grandpa_pharmacist.txt
+++ b/npc/merchants/grandpa_pharmacist.txt
@@ -1,162 +1,162 @@
-//===== eAthena Script =======================================
-//= Grandpa Pharmacist
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Trade in items for potions
-//===============================
-//= Breakdown of arguments used
-//= arg(0): first item id#
-//= arg(1): 2nd item id# if needed, or else use 0
-//= arg(2): zeny cost
-//= arg(3): potion id#
-//= arg(4): potion name
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Negative input bug fixed [Lupus]
-//= 1.2 Created a subfunc for the potion making part. Added more
-//= input/zeny exploit checks. Added Lupus's "loopless" technique.[kobra_k88]
-//============================================================
-
-
-alberta_in.gat,16,28,4 script Grampa Pharmacist 61,{
- mes "[Grampa Pharmacist]";
- mes "Hmmm... what do you want...?";
- next;
- menu "Make Potion",M_Make, "Talk",M_Talk, "Information",M_Info, "Cancel",M_End;
-
- M_Make:
- mes "[Grampa Pharmacist]";
- mes "Did you prepare all the items needed? If so what potion do you want?";
- M_Menu:
- next;
- menu "Red Potion",M_0, "Orange Potion",M_1, "Yellow Potion",M_2,
- "White Potion",M_3, "Blue Potion",M_4, "Green Potion",M_5,
- "Nah, I change my mind.",M_End;
-
- M_0:
- callsub sF_Make, 507, 0, 2, 501, "red";
- goto M_Menu;
- M_1:
- callsub sF_Make, 507, 508, 5, 502, "orange";
- goto M_Menu;
- M_2:
- callsub sF_Make, 508, 0, 10, 503, "yellow";
- goto M_Menu;
- M_3:
- callsub sF_Make, 509, 0, 20, 504, "white";
- goto M_Menu;
- M_4:
- callsub sF_Make, 510, 0, 30, 505, "blue";
- goto M_Menu;
- M_5:
- callsub sF_Make, 511, 0, 3, 506, "green";
- goto M_Menu;
-
- M_Talk:
- mes "[Grampa Pharmacist]";
- mes "The right type of medicinal Herbs can replenish a person's HP or SP";
- mes ". ~Sigh~ I'm starting to reminisce about my youth.... a sign that I";
- mes "must be getting old.....";
- next;
- mes "[Grampa Pharmacist]";
- mes "... A potion is merely an, 'easy to use', form of medicinal Herbs";
- mes "..... nothing more and nothing less.";
- close;
- M_Info:
- mes "[Grampa Pharmacist]";
- mes "~Sigh~... you young ones can be quite bothersome.. Fine, I will";
- mes "explain to you how potions work....";
- next;
- mes "[Grampa Pharmacist]";
- mes "Though the bennefits from consuming the various Herbs found around";
- mes "Rune-Midgard are great... by refining them into potions, the";
- mes "effects of the Herbs are dramatically enhanced.";
- next;
- mes "[Grampa Pharmacist]";
- mes "The process of refining herbs into potions is a special one that I";
- mes "created. For a small fee I can make any potion you desire.";
- next;
- mes "[Grampa Pharmacist]";
- mes "^FF5533Red Potion^000000 - 2 Red Herbs, 1 Empty Bottle, 2 Zeny fee.";
- mes "^FF8000Orange Potion^000000 - 1 Red Herb, 1 Yellow Herb, 1 Empty Bottle, 5 Zeny fee.";
- mes "^E8CF20Yellow Potion^000000 - 2 Yellow Herbs, 1 Empty Bottle, 10 Zeny fee.";
- next;
- mes "[Grampa Pharmacist]";
- mes "^999999White Potion^000000 - 2 White Herbs, 1 Empty Bottle, 20 Zeny fee.";
- mes "^3355FFBlue Potion^000000 - 2 Blue Herbs, 1 Empty Bottle, 30 Zeny fee.";
- mes "^00B000Green Potion^000000 - 2 Green Herbs, 1 Empty Bottle, 3 Zeny fee.";
- close;
- M_End:
- mes "[Grampa Pharmacist]";
- mes "Didn't you have something to say?!";
- close;
-
-// Subfunction for making potions
-//================================
-sF_Make:
- set @herbnum, 2;
- if(getarg(1) != 0) set @herbnum, 1;
- if(countitem(getarg(0)) < @herbnum) goto L_NdHerbs;
- if(getarg(1) != 0) if(countitem(getarg(1)) < @herbnum) goto L_NdHerbs;
- if(countitem(713) < 1) goto L_NdBottle;
- if(Zeny < getarg(2)) goto L_NdZeny;
-
- mes "[Grampa Pharmacist]";
- mes "How many?";
- next;
- menu "As many as possible.",sM_0a, "I will set the amount.",sM_0b, "Nah, forget about it",M_End;
-
- sM_0a:
- set @amount, 1000;
- if(zeny/getarg(2) < @amount) set @amount, zeny/getarg(2);
- if(countitem(getarg(0))/@herbnum < @amount) set @amount, countitem(getarg(0))/@herbnum;
- if(getarg(1) != 0) if (countitem(getarg(1))/@herbnum < @amount) set @amount, countitem(getarg(1))/@herbnum;
- if(countitem(713) < @amount) set @amount, countitem(713);
- if(@amount > 0) goto L_End;
- mes "[Grampa Pharmacist]";
- mes "Jeez... you don't even have the right items.....";
- close;
-
- sM_0b:
- input @amount;
- if(@amount<1 || @amount>1000) goto L_BadAmnt;
- if(countitem(getarg(0))/@herbnum < @amount) goto L_NdHerbs;
- if(getarg(1) != 0) if (countitem(getarg(1))/@herbnum < @amount) goto L_NdHerbs;
- if(countitem(713) < @amount) goto L_NdBottle;
- if(Zeny < (getarg(2)*@amount)) goto L_NdZeny;
-
- L_End:
- set Zeny, Zeny - (getarg(2)*@amount);
- delitem getarg(0), (@amount*@herbnum);
- if(getarg(1) != 0) delitem getarg(1), (@amount*@herbnum);
- delitem 713, @amount;
- getitem getarg(3), @amount;
- mes "[Grampa Pharmacist]";
- mes "Here are your " +getarg(4)+ " potions.";
- close;
-
- L_NdBottle:
- mes "[Grampa Pharmacist]";
- mes "You don't have enough empty bottles to put the medicine in you idiot!!";
- return;
-
- L_NdHerbs:
- mes "[Grampa Pharmacist]";
- mes "You rascal! What did you expect from me? You didn't even bring all of the right herbs!";
- return;
-
- L_NdZeny:
- mes "[Grampa Pharmacist]";
- mes "You don't have enough zeny for that many potions.";
- return;
-
- L_BadAmnt:
- mes "[Grampa Pharmacist]";
- mes "What?! That's not a valid amount!";
- return;
-}
+//===== eAthena Script =======================================
+//= Grandpa Pharmacist
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Trade in items for potions
+//===============================
+//= Breakdown of arguments used
+//= arg(0): first item id#
+//= arg(1): 2nd item id# if needed, or else use 0
+//= arg(2): zeny cost
+//= arg(3): potion id#
+//= arg(4): potion name
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Negative input bug fixed [Lupus]
+//= 1.2 Created a subfunc for the potion making part. Added more
+//= input/zeny exploit checks. Added Lupus's "loopless" technique.[kobra_k88]
+//============================================================
+
+
+alberta_in.gat,16,28,4 script Grampa Pharmacist 61,{
+ mes "[Grampa Pharmacist]";
+ mes "Hmmm... what do you want...?";
+ next;
+ menu "Make Potion",M_Make, "Talk",M_Talk, "Information",M_Info, "Cancel",M_End;
+
+ M_Make:
+ mes "[Grampa Pharmacist]";
+ mes "Did you prepare all the items needed? If so what potion do you want?";
+ M_Menu:
+ next;
+ menu "Red Potion",M_0, "Orange Potion",M_1, "Yellow Potion",M_2,
+ "White Potion",M_3, "Blue Potion",M_4, "Green Potion",M_5,
+ "Nah, I change my mind.",M_End;
+
+ M_0:
+ callsub sF_Make, 507, 0, 2, 501, "red";
+ goto M_Menu;
+ M_1:
+ callsub sF_Make, 507, 508, 5, 502, "orange";
+ goto M_Menu;
+ M_2:
+ callsub sF_Make, 508, 0, 10, 503, "yellow";
+ goto M_Menu;
+ M_3:
+ callsub sF_Make, 509, 0, 20, 504, "white";
+ goto M_Menu;
+ M_4:
+ callsub sF_Make, 510, 0, 30, 505, "blue";
+ goto M_Menu;
+ M_5:
+ callsub sF_Make, 511, 0, 3, 506, "green";
+ goto M_Menu;
+
+ M_Talk:
+ mes "[Grampa Pharmacist]";
+ mes "The right type of medicinal Herbs can replenish a person's HP or SP";
+ mes ". ~Sigh~ I'm starting to reminisce about my youth.... a sign that I";
+ mes "must be getting old.....";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "... A potion is merely an, 'easy to use', form of medicinal Herbs";
+ mes "..... nothing more and nothing less.";
+ close;
+ M_Info:
+ mes "[Grampa Pharmacist]";
+ mes "~Sigh~... you young ones can be quite bothersome.. Fine, I will";
+ mes "explain to you how potions work....";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "Though the bennefits from consuming the various Herbs found around";
+ mes "Rune-Midgard are great... by refining them into potions, the";
+ mes "effects of the Herbs are dramatically enhanced.";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "The process of refining herbs into potions is a special one that I";
+ mes "created. For a small fee I can make any potion you desire.";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "^FF5533Red Potion^000000 - 2 Red Herbs, 1 Empty Bottle, 2 Zeny fee.";
+ mes "^FF8000Orange Potion^000000 - 1 Red Herb, 1 Yellow Herb, 1 Empty Bottle, 5 Zeny fee.";
+ mes "^E8CF20Yellow Potion^000000 - 2 Yellow Herbs, 1 Empty Bottle, 10 Zeny fee.";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "^999999White Potion^000000 - 2 White Herbs, 1 Empty Bottle, 20 Zeny fee.";
+ mes "^3355FFBlue Potion^000000 - 2 Blue Herbs, 1 Empty Bottle, 30 Zeny fee.";
+ mes "^00B000Green Potion^000000 - 2 Green Herbs, 1 Empty Bottle, 3 Zeny fee.";
+ close;
+ M_End:
+ mes "[Grampa Pharmacist]";
+ mes "Didn't you have something to say?!";
+ close;
+
+// Subfunction for making potions
+//================================
+sF_Make:
+ set @herbnum, 2;
+ if(getarg(1) != 0) set @herbnum, 1;
+ if(countitem(getarg(0)) < @herbnum) goto L_NdHerbs;
+ if(getarg(1) != 0) if(countitem(getarg(1)) < @herbnum) goto L_NdHerbs;
+ if(countitem(713) < 1) goto L_NdBottle;
+ if(Zeny < getarg(2)) goto L_NdZeny;
+
+ mes "[Grampa Pharmacist]";
+ mes "How many?";
+ next;
+ menu "As many as possible.",sM_0a, "I will set the amount.",sM_0b, "Nah, forget about it",M_End;
+
+ sM_0a:
+ set @amount, 1000;
+ if(zeny/getarg(2) < @amount) set @amount, zeny/getarg(2);
+ if(countitem(getarg(0))/@herbnum < @amount) set @amount, countitem(getarg(0))/@herbnum;
+ if(getarg(1) != 0) if (countitem(getarg(1))/@herbnum < @amount) set @amount, countitem(getarg(1))/@herbnum;
+ if(countitem(713) < @amount) set @amount, countitem(713);
+ if(@amount > 0) goto L_End;
+ mes "[Grampa Pharmacist]";
+ mes "Jeez... you don't even have the right items.....";
+ close;
+
+ sM_0b:
+ input @amount;
+ if(@amount<1 || @amount>1000) goto L_BadAmnt;
+ if(countitem(getarg(0))/@herbnum < @amount) goto L_NdHerbs;
+ if(getarg(1) != 0) if (countitem(getarg(1))/@herbnum < @amount) goto L_NdHerbs;
+ if(countitem(713) < @amount) goto L_NdBottle;
+ if(Zeny < (getarg(2)*@amount)) goto L_NdZeny;
+
+ L_End:
+ set Zeny, Zeny - (getarg(2)*@amount);
+ delitem getarg(0), (@amount*@herbnum);
+ if(getarg(1) != 0) delitem getarg(1), (@amount*@herbnum);
+ delitem 713, @amount;
+ getitem getarg(3), @amount;
+ mes "[Grampa Pharmacist]";
+ mes "Here are your " +getarg(4)+ " potions.";
+ close;
+
+ L_NdBottle:
+ mes "[Grampa Pharmacist]";
+ mes "You don't have enough empty bottles to put the medicine in you idiot!!";
+ return;
+
+ L_NdHerbs:
+ mes "[Grampa Pharmacist]";
+ mes "You rascal! What did you expect from me? You didn't even bring all of the right herbs!";
+ return;
+
+ L_NdZeny:
+ mes "[Grampa Pharmacist]";
+ mes "You don't have enough zeny for that many potions.";
+ return;
+
+ L_BadAmnt:
+ mes "[Grampa Pharmacist]";
+ mes "What?! That's not a valid amount!";
+ return;
+}
diff --git a/npc/merchants/hair_dyer.txt b/npc/merchants/hair_dyer.txt
index f684138a2..c4e10f2ca 100644
--- a/npc/merchants/hair_dyer.txt
+++ b/npc/merchants/hair_dyer.txt
@@ -1,159 +1,159 @@
-//===== eAthena Script =======================================
-//= Hair Dyer
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Hair Dyer with standard palletes
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Bugfix: fixed missing menu label LEnd->M_End [Lupus]
-//============================================================
-
-
-
-
-// HairDyer Jovovich -----------------------------------------------------
-prt_in.gat,243,168,4 script HairDyer Jovovich 91,{
- mes "[HairDyer Jovovich]";
- mes "Welcome to my Hair Dying shop.";
- next;
- mes "[HairDyer Jovovich]";
- mes "Oh my..... your hair does not look like it's in good condition. I think it needs some special care. Come have a seat.";
- qMenu0:
- next;
- menu "-Dye Hair.",M_0, "-Price List",M_1, "-Hair Tips",M_2, "-Cancel",M_End;
-
- M_0:
- mes "[HairDyer Jovovich]";
- mes "Hohoho~ That's a good choice~~ Any time is a good time to change your hair color.";
- next;
- mes "[HairDyer Jovovich]";
- mes "Please choose a color that suits you";
- next;
- menu "-Red please.",sM_a, "-Yellow please.",sM_b, "-Violet please.",sM_c, "-Orange please.",sM_d, "-Green please.",sM_e,
- "-Blue please.",sM_f, "-White please.",sM_g, "-Black please.",sM_h, "-Sorry, I changed my mind.",M_End;
-
- sM_a:
- mes "[HairDyer Jovovich]";
- if(countitem(975) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- set Zeny, Zeny - 1000;
- delitem 975,1;
- mes "Ok. I will dye you hair red.";
- setlook 6,8;
-
- close;
-
- sM_b:
- mes "[HairDyer Jovovich]";
- if(countitem(976) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair yellow.";
- setlook 6,1;
- delitem 976,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_c:
- mes "[HairDyer Jovovich]";
- if(countitem(981) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair Violet.";
- setlook 6,2;
- delitem 981,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_d:
- mes "[HairDyer Jovovich]";
- if(countitem(980) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair Orange.";
- setlook 6,3;
- delitem 980,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_e:
- mes "[HairDyer Jovovich]";
- if(countitem(979) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair Green.";
- setlook 6,4;
- delitem 979,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_f:
- mes "[HairDyer Jovovich]";
- if(countitem(978) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair blue.";
- setlook 6,5;
- delitem 978,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_g:
- mes "[HairDyer Jovovich]";
- if(countitem(982) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair white.";
- setlook 6,6;
- delitem 982,1;
- set Zeny, Zeny - 1000;
- close;
-
- sM_h:
- mes "[HairDyer Jovovich]";
- if(countitem(983) < 1) goto sL_NoDye;
- if(Zeny < 1000) goto sL_Zeny;
- mes "Ok. I will dye you hair black.";
- setlook 6,7;
- delitem 983,1;
- set Zeny, Zeny - 1000;
- close;
-
- sL_NoDye:
- mes "For me to dye your hair, I'll need the appropriate Dyestuff. Please check my price list for the information.";
- close;
-
- sL_Zeny:
- mes "I'm sorry but you don't have enough money.";
- close;
-
- M_1:
- mes "[HairDyer Jovovich]";
- mes "Here is the list of colors you can choose from and their prices:";
- mes " - Red: 1000 zeny, 1 Scarlet Dyestuff";
- mes " - Yellow: 1000 zeny, 1 Lemon Dyestuff";
- mes " - Violet: 1000 zeny, 1 Violet Dyestuff";
- mes " - Orange: 1000 zeny, 1 Orange Dyestuff";
- mes " - Green: 1000 zeny, 1 DarkGreen Dyestuff";
- mes " - Blue: 1000 zeny, 1 CobaltBlue Dyestuff";
- mes " - White: 1000 zeny, 1 White Dyestuff";
- mes " - Black: 1000 zeny, 1 Black Dyestuff";
- goto qMenu0;
-
- M_2:
- mes "[HairDyer Jovovich]";
- mes "When your just feeling gloomy, of if you just got dumped... if you want to look hot, or when you just need to look better.....";
- next;
- mes "[HairDyer Jovovich]";
- mes "Change the color of your hair and your bound to regain your confidence and add an extra bounce to your step!!";
- next;
- mes "[HairDyer Jovovich]";
- mes "For the small price of 1000 zeny and a Dyestuff, I can give you the haircolor you've been dreaming of!";
- next;
- goto qMenu0;
-
- M_End:
- mes "[HairDyer Jovovich]";
- mes "I think... every human being has the right to become beautiful......";
- close;
-}
-
+//===== eAthena Script =======================================
+//= Hair Dyer
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Hair Dyer with standard palletes
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Bugfix: fixed missing menu label LEnd->M_End [Lupus]
+//============================================================
+
+
+
+
+// HairDyer Jovovich -----------------------------------------------------
+prt_in.gat,243,168,4 script HairDyer Jovovich 91,{
+ mes "[HairDyer Jovovich]";
+ mes "Welcome to my Hair Dying shop.";
+ next;
+ mes "[HairDyer Jovovich]";
+ mes "Oh my..... your hair does not look like it's in good condition. I think it needs some special care. Come have a seat.";
+ qMenu0:
+ next;
+ menu "-Dye Hair.",M_0, "-Price List",M_1, "-Hair Tips",M_2, "-Cancel",M_End;
+
+ M_0:
+ mes "[HairDyer Jovovich]";
+ mes "Hohoho~ That's a good choice~~ Any time is a good time to change your hair color.";
+ next;
+ mes "[HairDyer Jovovich]";
+ mes "Please choose a color that suits you";
+ next;
+ menu "-Red please.",sM_a, "-Yellow please.",sM_b, "-Violet please.",sM_c, "-Orange please.",sM_d, "-Green please.",sM_e,
+ "-Blue please.",sM_f, "-White please.",sM_g, "-Black please.",sM_h, "-Sorry, I changed my mind.",M_End;
+
+ sM_a:
+ mes "[HairDyer Jovovich]";
+ if(countitem(975) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ set Zeny, Zeny - 1000;
+ delitem 975,1;
+ mes "Ok. I will dye you hair red.";
+ setlook 6,8;
+
+ close;
+
+ sM_b:
+ mes "[HairDyer Jovovich]";
+ if(countitem(976) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair yellow.";
+ setlook 6,1;
+ delitem 976,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_c:
+ mes "[HairDyer Jovovich]";
+ if(countitem(981) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair Violet.";
+ setlook 6,2;
+ delitem 981,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_d:
+ mes "[HairDyer Jovovich]";
+ if(countitem(980) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair Orange.";
+ setlook 6,3;
+ delitem 980,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_e:
+ mes "[HairDyer Jovovich]";
+ if(countitem(979) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair Green.";
+ setlook 6,4;
+ delitem 979,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_f:
+ mes "[HairDyer Jovovich]";
+ if(countitem(978) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair blue.";
+ setlook 6,5;
+ delitem 978,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_g:
+ mes "[HairDyer Jovovich]";
+ if(countitem(982) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair white.";
+ setlook 6,6;
+ delitem 982,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sM_h:
+ mes "[HairDyer Jovovich]";
+ if(countitem(983) < 1) goto sL_NoDye;
+ if(Zeny < 1000) goto sL_Zeny;
+ mes "Ok. I will dye you hair black.";
+ setlook 6,7;
+ delitem 983,1;
+ set Zeny, Zeny - 1000;
+ close;
+
+ sL_NoDye:
+ mes "For me to dye your hair, I'll need the appropriate Dyestuff. Please check my price list for the information.";
+ close;
+
+ sL_Zeny:
+ mes "I'm sorry but you don't have enough money.";
+ close;
+
+ M_1:
+ mes "[HairDyer Jovovich]";
+ mes "Here is the list of colors you can choose from and their prices:";
+ mes " - Red: 1000 zeny, 1 Scarlet Dyestuff";
+ mes " - Yellow: 1000 zeny, 1 Lemon Dyestuff";
+ mes " - Violet: 1000 zeny, 1 Violet Dyestuff";
+ mes " - Orange: 1000 zeny, 1 Orange Dyestuff";
+ mes " - Green: 1000 zeny, 1 DarkGreen Dyestuff";
+ mes " - Blue: 1000 zeny, 1 CobaltBlue Dyestuff";
+ mes " - White: 1000 zeny, 1 White Dyestuff";
+ mes " - Black: 1000 zeny, 1 Black Dyestuff";
+ goto qMenu0;
+
+ M_2:
+ mes "[HairDyer Jovovich]";
+ mes "When your just feeling gloomy, of if you just got dumped... if you want to look hot, or when you just need to look better.....";
+ next;
+ mes "[HairDyer Jovovich]";
+ mes "Change the color of your hair and your bound to regain your confidence and add an extra bounce to your step!!";
+ next;
+ mes "[HairDyer Jovovich]";
+ mes "For the small price of 1000 zeny and a Dyestuff, I can give you the haircolor you've been dreaming of!";
+ next;
+ goto qMenu0;
+
+ M_End:
+ mes "[HairDyer Jovovich]";
+ mes "I think... every human being has the right to become beautiful......";
+ close;
+}
+
diff --git a/npc/merchants/hair_style.txt b/npc/merchants/hair_style.txt
index 4a4daff36..f79966894 100644
--- a/npc/merchants/hair_style.txt
+++ b/npc/merchants/hair_style.txt
@@ -1,2054 +1,2054 @@
-//===== Athena Script ========================================
-//= Hair Dresser
-//===== By: ==================================================
-//= [Muad_Dib] 1.0 (The Prometheus Project)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Allows you to change your hairstyle.
-//===== Additional Comments: =================================
-//= 07/06/05 : Added 1st Version. [Muad_Dib]
-//= Converted to eAthena format by Dr.Evil
-//= Change NPC coords according to
-//= http://www.nattsumi.com/roquest/miscellaneousquest.html
-//= Fixed typos [Nexon]
-//= TODO: Fix exploits V_V [Lupus]
-//= 1.1 Removed Duplicates [Silent]
-//============================================================
-
-alberta.gat,137,37,6 script Stylist#01 91,{
- mes "[Veronica]";
- mes "Welcome~~Welcome~~";
- mes "Welcome to the one of the best Hair shop, Veronicas Beauty Saloon!!";
- mes "HoHoHo";
- mes "Come here for new hair, right?";
- mes "How may I help you?";
- next;
- menu "Look through the Hair Styles.",Look,"Change Hair Style",Change,"Stop talking.",Cancel;
-Look:
- set @hair,0;
- mes "[Veronica]";
- mes "There are 19 Hair Styles, 1~19!!!";
- mes "Which number do you want to look at first?";
- mes "If you want to stop looking, please choose 0.";
- next;
- if(sex==0) goto LookF;
- input @hair_in;
- if (@hair_in > 19) goto hairtohigh;
- set @hair,@hair_in;
- goto ShowPicM;
- close;
-LookF:
- set @hairf,0;
- input @hairf_in;
- if (@hairf_in > 19) goto hairtohigh;
- set @hairf,@hairf_in;
- goto ShowPicF;
- close;
-ShowPicM:
- if (@hair == 0) goto hairnothing;
- if (@hair == 1) goto mhair1show;
- if (@hair == 2) goto mhair2show;
- if (@hair == 3) goto mhair3show;
- if (@hair == 4) goto mhair4show;
- if (@hair == 5) goto mhair5show;
- if (@hair == 6) goto mhair6show;
- if (@hair == 7) goto mhair7show;
- if (@hair == 8) goto mhair8show;
- if (@hair == 9) goto mhair9show;
- if (@hair == 10) goto mhair10show;
- if (@hair == 11) goto mhair11show;
- if (@hair == 12) goto mhair12show;
- if (@hair == 13) goto mhair13show;
- if (@hair == 14) goto mhair14show;
- if (@hair == 15) goto mhair15show;
- if (@hair == 16) goto mhair16show;
- if (@hair == 17) goto mhair17show;
- if (@hair == 18) goto mhair18show;
- if (@hair == 19) goto mhair19show;
-
-mhair1show:
- cutin "hair_m_01",4;
- mes "[Veronica]";
- mes "Oh~ 'Trickdead' style!";
- mes "It is very neat feature and comfortable.";
- mes "How do you think? Do you like it?";
- close;
-mhair2show:
- cutin "hair_m_02",4;
- mes "[Veronica]";
- mes "Oh~'Two-Handed Sword Mastery' style!";
- mes "It's style is very similar to one of the famous Swordsman.";
- mes "How do you think? Do you like it?";
- close;
-mhair3show:
- cutin "hair_m_03",4;
- mes "[Veronica]";
- mes "Oh~'Napalm Beat' style!";
- mes "It makes feeling there is unknown power...";
- mes "How do you think? Do you like it?";
- close;
-mhair4show:
- cutin "hair_m_04",4;
- mes "[Veronica]";
- mes "Oh~'Double Strafe' style!";
- mes "It will make your mind is very clear.";
- mes "How do you think? Do you like it?";
- close;
-mhair5show:
- cutin "hair_m_05",4;
- mes "[Veronica]";
- mes "Oh~'Angelus' style!";
- mes "It feels calm your reference.";
- mes "How do you think? Do you like it?";
- close;
-mhair6show:
- cutin "hair_m_06",4;
- mes "[Veronica]";
- mes "Oh~'Pushcart' style!";
- mes "This is the style based on motive of string cart..";
- mes "How do you think? Do you like it?";
- close;
-mhair7show:
- cutin "hair_m_07",4;
- mes "[Veronica]";
- mes "Oh~'Envenom' style!";
- mes "It makes feel addicting into something..";
- mes "How do you think? Do you like it?";
- close;
-mhair8show:
- cutin "hair_m_08",4;
- mes "[Veronica]";
- mes "Oh~'Bowling Bash' style!";
- mes "Once people sees it, they will fall for it.";
- mes "How do you think? Do you like it?";
- close;
-mhair9show:
- cutin "hair_m_09",4;
- mes "[Veronica]";
- mes "Oh~'Venom Dust' style!";
- mes "It is the style gives feeling deadly charm.";
- mes "How do you think? Do you like it?";
- close;
-mhair10show:
- cutin "hair_m_10",4;
- mes "[Veronica]";
- mes "Oh~'Turn Undead' style!";
- mes "It gives feeling one attack can make Devils disappear!";
- mes "How do you think? Do you like it?";
- close;
-mhair11show:
- cutin "hair_m_11",4;
- mes "[Veronica]";
- mes "Oh~'Dragnology' style!";
- mes "This is the style bases on motive of mysterious Dragon...";
- mes "How do you think? Do you like it?";
- close;
-mhair12show:
- cutin "hair_m_12",4;
- mes "[Veronica]";
- mes "Oh~'Mace Mastery' style!";
- mes "It looks very hard and attractive.";
- mes "How do you think? Do you like it?";
- close;
-mhair13show:
- cutin "hair_m_13",4;
- mes "[Veronica]";
- mes "Oh~'Thunderstorm' style!";
- mes "It feels hit by Thunderstorm!!";
- mes "How do you think? Do you like it?";
- close;
-mhair14show:
- cutin "hair_m_14",4;
- mes "[Veronica]";
- mes "Oh~'Encore' style!";
- mes "It is the style make people feels like asking you to sing~";
- mes "How do you think? Do you like it?";
- close;
-mhair15show:
- cutin "hair_m_15",4;
- mes "[Veronica]";
- mes "Oh~'Grommtooht' style!";
- mes "It feels like you will be picked by hair!";
- mes "How do you think? Do you like it?";
- close;
-mhair16show:
- cutin "hair_m_16",4;
- mes "[Veronica]";
- mes "Oh~'Blitz Beat' style!";
- mes "It feels it will attack 5 times...?";
- mes "How do you think? Do you like it?";
- close;
-mhair17show:
- cutin "hair_m_17",4;
- mes "[Veronica]";
- mes "Oh~'Ore Discovery' style!";
- mes "It feels like picking up things while walking.";
- mes "How do you think? Do you like it?";
- close;
-mhair18show:
- cutin "hair_m_18",4;
- mes "[Veronica]";
- mes "Oh~'Fire Pillar' style!";
- mes "It has been a great style over the one generation...!";
- mes "How do you think? Do you like it?";
- close;
-mhair19show:
- cutin "hair_m_19",4;
- mes "[Veronica]";
- mes "Oh~'Guillotine Fist' style!";
- mes "It feels like betting all at once!!";
- mes "How do you think? Do you like it?";
- close;
-ShowPicF:
- if (@hairf == 0) goto hairnothing;
- if (@hairf == 1) goto fhair1show;
- if (@hairf == 2) goto fhair2show;
- if (@hairf == 3) goto fhair3show;
- if (@hairf == 4) goto fhair4show;
- if (@hairf == 5) goto fhair5show;
- if (@hairf == 6) goto fhair6show;
- if (@hairf == 7) goto fhair7show;
- if (@hairf == 8) goto fhair8show;
- if (@hairf == 9) goto fhair9show;
- if (@hairf == 10) goto fhair10show;
- if (@hairf == 11) goto fhair11show;
- if (@hairf == 12) goto fhair12show;
- if (@hairf == 13) goto fhair13show;
- if (@hairf == 14) goto fhair14show;
- if (@hairf == 15) goto fhair15show;
- if (@hairf == 16) goto fhair16show;
- if (@hairf == 17) goto fhair17show;
- if (@hairf == 18) goto fhair18show;
- if (@hairf == 19) goto fhair19show;
-fhair1show:
- cutin "hair_f_01",4;
- mes "[Veronica]";
- mes "Oh~ 'Trickdead' style!";
- mes "It is the style people wants to stroke your hair.";
- mes "How do you think? Do you like it?";
- close;
-fhair2show:
- cutin "hair_f_02",4;
- mes "[Veronica]";
- mes "Oh~'Bash' style!";
- mes "It feels unrevealed strong power is hidden inside of....";
- mes "How do you think? Do you like it?";
- close;
-fhair3show:
- cutin "hair_f_03",4;
- mes "[Veronica]";
- mes "Oh~'Frost Diver' style!";
- mes "It feels cold, but also warm....";
- mes "How do you think? Do you like it?";
- close;
-fhair4show:
- cutin "hair_f_04",4;
- mes "[Veronica]";
- mes "Oh~'Arrow Shower' style!";
- mes "It feels very refreshed~";
- mes "How do you think? Do you like it?";
- close;
-fhair5show:
- cutin "hair_f_05",4;
- mes "[Veronica]";
- mes "Oh~'Heal' style!";
- mes "It feels mind in cured.";
- mes "How do you think? Do you like it?";
- close;
-fhair6show:
- cutin "hair_f_06",4;
- mes "[Veronica]";
- mes "Oh~'Vending' style!";
- mes "It seems like making lots of money.";
- mes "How do you think? Do you like it?";
- close;
-fhair7show:
- cutin "hair_f_07",4;
- mes "[Veronica]";
- mes "Oh~'Double Strafe' style!";
- mes "It makes whomever dash twice.";
- mes "How do you think? Do you like it?";
- close;
-fhair8show:
- cutin "hair_f_08",4;
- mes "[Veronica]";
- mes "Oh~'Gloria' style!";
- mes "Its nobleness and holiness moods are great.";
- mes "How do you think? Do you like it?";
- close;
-fhair9show:
- cutin "hair_f_09",4;
- mes "[Veronica]";
- mes "Oh~'Increase Sp Recovery' style!";
- mes "It makes fell like recovering spirit fully.";
- mes "How do you think? Do you like it?";
- close;
-fhair10show:
- cutin "hair_f_10",4;
- mes "[Veronica]";
- mes "Oh~'Prepare Potion' style!";
- mes "It feels a wound is healed already.";
- mes "How do you think? Do you like it?";
- close;
-fhair11show:
- cutin "hair_f_11",4;
- mes "[Veronica]";
- mes "Oh~'Grand Cross' style!";
- mes "It feels like a firm faith.";
- mes "How do you think? Do you like it?";
- close;
-fhair12show:
- cutin "hair_f_12",4;
- mes "[Veronica]";
- mes "Oh~'Intimidate' style!";
- mes "It seems you saw this style somewhere...?";
- mes "How do you think? Do you like it?";
- close;
-fhair13show:
- cutin "hair_f_13",4;
- mes "[Veronica]";
- mes "Oh~'Spiritual Sphere Absorption' style!";
- mes "Its catch people's spirits.";
- mes "How do you think? Do you like it?";
- close;
-fhair14show:
- cutin "hair_f_14",4;
- mes "[Veronica]";
- mes "Oh~'Gypsy's Kiss' style!";
- mes "It makes people think you are very kind to all...";
- mes "How do you think? Do you like it?";
- close;
-fhair15show:
- cutin "hair_f_15",4;
- mes "[Veronica]";
- mes "Oh~'Counter Attack' style!";
- mes "It feels it will kick when someone is near.";
- mes "How do you think? Do you like it?";
- close;
-fhair16show:
- cutin "hair_f_16",4;
- mes "[Veronica]";
- mes "Oh~'Ankle Snare' style!";
- mes "This is the style hardly moved";
- mes "How do you think? Do you like it?";
- close;
-fhair17show:
- cutin "hair_f_17",4;
- mes "[Veronica]";
- mes "Oh~'Hammer Fall' style!";
- mes "It will make feeling dizzy.";
- mes "How do you think? Do you like it?";
- close;
-fhair18show:
- cutin "hair_f_18",4;
- mes "[Veronica]";
- mes "Oh~'Jupiter Thunder' style!";
- mes "It feels very neat.";
- mes "How do you think? Do you like it?";
- close;
-fhair19show:
- cutin "hair_f_19",4;
- mes "[Veronica]";
- mes "Oh~'Whirlwind' style!";
- mes "It feels very refreshed like wind.";
- mes "How do you think? Do you like it?";
- close;
-hairnothing:
- mes "[Veronica]";
- mes "Did you find a style you like?";
- mes "If you want to change your hair style at anytime, I will do my best!!";
- close;
-hairtohigh:
- mes "[Veronica]";
- mes "Sorry, there aren't any Hairstyles with that number.";
- mes "Please choose a number from 1 to 19.";
- close;
-Change:
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
-
- set @hairch,0;
- mes "[Veronica]";
- mes "Well, then... Please choose Hair Style you like most.";
- mes "I will do my best";
- mes "There are 19 different Hair Styles.";
- mes "Numbers from 1 to 19~";
- next;
- if(sex==0) goto iffemale;
- input @hairchange_in;
- if (@hairchange_in > 19) goto tohighchange;
- set @hairch,@hairchange_in;
- if (@hairch == 1) goto mhair1;
- if (@hairch == 2) goto mhair2;
- if (@hairch == 3) goto mhair3;
- if (@hairch == 4) goto mhair4;
- if (@hairch == 5) goto mhair5;
- if (@hairch == 6) goto mhair6;
- if (@hairch == 7) goto mhair7;
- if (@hairch == 8) goto mhair8;
- if (@hairch == 9) goto mhair9;
- if (@hairch == 10) goto mhair10;
- if (@hairch == 11) goto mhair11;
- if (@hairch == 12) goto mhair12;
- if (@hairch == 13) goto mhair13;
- if (@hairch == 14) goto mhair14;
- if (@hairch == 15) goto mhair15;
- if (@hairch == 16) goto mhair16;
- if (@hairch == 17) goto mhair17;
- if (@hairch == 18) goto mhair18;
- if (@hairch == 19) goto mhair19;
-mhair1:
- cutin "hair_m_01",4;
- mes "[Veronica]";
- mes "This is the (1) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO1;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,1;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (1) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO1:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair2:
- cutin "hair_m_02",4;
- mes "[Veronica]";
- mes "This is the (2) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yaeh~ I'd love to.",-,"No..I don't like it..",M_NO2;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,2;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (2) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vitis me anytime~ HoHoHo";
- close;
-M_NO2:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair3:
- cutin "hair_m_03",4;
- mes "[Veronica]";
- mes "This is the (3) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO3;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,3;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (3) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO3:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair4:
- cutin "hair_m_04",4;
- mes "[Veronica]";
- mes "This is the (4) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO4;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,4;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (4) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO4:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair5:
- cutin "hair_m_05",4;
- mes "[Veronica]";
- mes "This is the (5) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO5;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,5;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (5) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO5:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair6:
- cutin "hair_m_06",4;
- mes "[Veronica]";
- mes "This is the (6) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO6;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,6;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (6) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO6:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair7:
- cutin "hair_m_07",4;
- mes "[Veronica]";
- mes "This is the (7) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO7;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,7;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (7) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO7:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair8:
- cutin "hair_m_08",4;
- mes "[Veronica]";
- mes "This is the (8) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO8;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,8;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (8) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO8:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair9:
- cutin "hair_m_09",4;
- mes "[Veronica]";
- mes "This is the (9) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO9;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,9;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (9) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO9:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair10:
- cutin "hair_m_10",4;
- mes "[Veronica]";
- mes "This is the (10) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO10;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,10;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (10) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO10:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair11:
- cutin "hair_m_11",4;
- mes "[Veronica]";
- mes "This is the (11) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO11;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,11;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (11) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO11:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair12:
- cutin "hair_m_12",4;
- mes "[Veronica]";
- mes "This is the (12) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,12;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (12) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO12:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair13:
- cutin "hair_m_13",4;
- mes "[Veronica]";
- mes "This is the (13) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO13;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,13;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (13) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO13:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair14:
- cutin "hair_m_14",4;
- mes "[Veronica]";
- mes "This is the (14) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO14;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,14;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (14) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO14:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair15:
- cutin "hair_m_15",4;
- mes "[Veronica]";
- mes "This is the (15) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO15;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,15;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (15) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO15:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair16:
- cutin "hair_m_16",4;
- mes "[Veronica]";
- mes "This is the (16) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO16;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,16;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (16) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO16:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair17:
- cutin "hair_m_17",4;
- mes "[Veronica]";
- mes "This is the (17) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,17;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (17) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO17:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair18:
- cutin "hair_m_18",4;
- mes "[Veronica]";
- mes "This is the (18) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,18;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (18) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO18:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-mhair19:
- cutin "hair_m_19",4;
- mes "[Veronica]";
- mes "This is the (19) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO19;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,19;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (19) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-M_NO19:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-iffemale:
- input @hairchange_in;
- if (@hairchange_in > 19) goto tohighchange;
- set @hairch,@hairchange_in;
- if (@hairch == 1) goto fhair1;
- if (@hairch == 2) goto fhair2;
- if (@hairch == 3) goto fhair3;
- if (@hairch == 4) goto fhair4;
- if (@hairch == 5) goto fhair5;
- if (@hairch == 6) goto fhair6;
- if (@hairch == 7) goto fhair7;
- if (@hairch == 8) goto fhair8;
- if (@hairch == 9) goto fhair9;
- if (@hairch == 10) goto fhair10;
- if (@hairch == 11) goto fhair11;
- if (@hairch == 12) goto fhair12;
- if (@hairch == 13) goto fhair13;
- if (@hairch == 14) goto fhair14;
- if (@hairch == 15) goto fhair15;
- if (@hairch == 16) goto fhair16;
- if (@hairch == 17) goto fhair17;
- if (@hairch == 18) goto fhair18;
- if (@hairch == 19) goto fhair19;
-
-fhair1:
- cutin "hair_f_01",4;
- mes "[Veronica]";
- mes "This is the (1) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yaeh~ I'd love to.",-,"No..I don't like it..",F_NO1;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,1;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (1) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO1:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair2:
- cutin "hair_f_02",4;
- mes "[Veronica]";
- mes "This is the (2) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO2;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,2;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (2) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO2:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair3:
- cutin "hair_f_03",4;
- mes "[Veronica]";
- mes "This is the (3) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO3;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,3;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (3) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO3:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair4:
- cutin "hair_f_04",4;
- mes "[Veronica]";
- mes "This is the (4) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO4;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,4;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (4) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO4:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair5:
- cutin "hair_f_05",4;
- mes "[Veronica]";
- mes "This is the (5) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO5;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,5;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (5) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO5:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair6:
- cutin "hair_f_06",4;
- mes "[Veronica]";
- mes "This is the (6) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO6;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,6;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (6) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO6:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair7:
- cutin "hair_f_07",4;
- mes "[Veronica]";
- mes "This is the (7) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO7;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,7;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (7) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO7:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair8:
- cutin "hair_f_08",4;
- mes "[Veronica]";
- mes "This is the (8) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO8;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,8;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (8) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO8:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair9:
- cutin "hair_f_09",4;
- mes "[Veronica]";
- mes "This is the (9) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO9;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,9;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (9) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO9:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair10:
- cutin "hair_f_10",4;
- mes "[Veronica]";
- mes "This is the (10) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO10;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,10;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (10) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO10:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair11:
- cutin "hair_f_11",4;
- mes "[Veronica]";
- mes "This is the (11) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO11;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,11;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (11) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO11:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair12:
- cutin "hair_f_12",4;
- mes "[Veronica]";
- mes "This is the (12) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO12;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,12;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (12) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO12:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair13:
- cutin "hair_f_13",4;
- mes "[Veronica]";
- mes "This is the (13) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO13;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,13;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (13) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO13:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair14:
- cutin "hair_f_14",4;
- mes "[Veronica]";
- mes "This is the (14) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO14;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,14;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (14) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO14:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair15:
- cutin "hair_f_15",4;
- mes "[Veronica]";
- mes "This is the (15) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO15;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,15;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (15) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO15:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair16:
- cutin "hair_f_16",4;
- mes "[Veronica]";
- mes "This is the (16) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO16;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,16;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (16) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO16:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair17:
- cutin "hair_f_17",4;
- mes "[Veronica]";
- mes "This is the (17) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO17;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,17;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (17) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO17:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair18:
- cutin "hair_f_18",4;
- mes "[Veronica]";
- mes "This is the (18) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO18;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,18;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (18) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO18:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-fhair19:
- cutin "hair_f_19",4;
- mes "[Veronica]";
- mes "This is the (19) style.";
- mes "I will change your Hair with this Again.";
- mes "Is that OK for you??";
- next;
- menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO19;
- cutin "",255;
- mes "[Veronica]";
- mes "Now it begins~. Hold still~";
- mes "If you move, you will have very bad style.";
- mes "Just trust me on this!!";
- next;
- mes "[Veronica]";
- mes "- Clip clip Clip clip -";
- mes "- Klit klit Klit klit -";
- mes "- Snap snap Snap snap -";
- next;
- if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
- set Zeny,Zeny-99800;
- delitem 973,3;
- delitem 974,3;
- delitem 901,100;
- delitem 1094,100;
- delitem 1020,100;
- delitem 1060,100;
- delitem 7152,100;
- setlook 1,19;
- mes "[Veronica]";
- mes "Wow~ it came out very well~~";
- mes "I hope you like this (19) style.";
- mes "If you'd like to have another hair style,";
- mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
- close;
-F_NO19:
- cutin "",255;
- mes "[Veronica]";
- mes "Well~ choose again please~";
- mes "There should be a style you like.";
- mes "Just remember the number you like the most and tell me.";
- close;
-tohighchange:
- mes "[Veronica]";
- mes "There are no such numbers like that!";
- mes "Please check your number~";
- close;
-NOItem:
- mes "[Veronica]";
- mes "If you want to change your hairstyle, you need several items.";
- mes "Since, you need many items....";
- mes "I think you should write those down.";
- next;
- mes "[Veronica]";
- mes "3 Counteragents,";
- mes "3 Mixtures,";
- mes "100 Daenggies,";
- mes "100 Short Daenggies,";
- mes "100 Black Hairs,";
- mes "100 Golden Hairs,";
- mes "100 Glossy Hair.";
- next;
- mes "[Veronica]";
- mes "And also you need 99,800zeny.";
- mes "If you gather them all...";
- mes "I will show you what I can do~!!";
- mes "HoHoHo.";
- close;
-Cancel:
- mes "[Veronica]";
- mes "Everyone has rights to become beautiful...";
- mes "I wish you can find your hair style which fits on you well~";
- mes "I really do~";
- close;
+//===== Athena Script ========================================
+//= Hair Dresser
+//===== By: ==================================================
+//= [Muad_Dib] 1.0 (The Prometheus Project)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Allows you to change your hairstyle.
+//===== Additional Comments: =================================
+//= 07/06/05 : Added 1st Version. [Muad_Dib]
+//= Converted to eAthena format by Dr.Evil
+//= Change NPC coords according to
+//= http://www.nattsumi.com/roquest/miscellaneousquest.html
+//= Fixed typos [Nexon]
+//= TODO: Fix exploits V_V [Lupus]
+//= 1.1 Removed Duplicates [Silent]
+//============================================================
+
+alberta.gat,137,37,6 script Stylist#01 91,{
+ mes "[Veronica]";
+ mes "Welcome~~Welcome~~";
+ mes "Welcome to the one of the best Hair shop, Veronicas Beauty Saloon!!";
+ mes "HoHoHo";
+ mes "Come here for new hair, right?";
+ mes "How may I help you?";
+ next;
+ menu "Look through the Hair Styles.",Look,"Change Hair Style",Change,"Stop talking.",Cancel;
+Look:
+ set @hair,0;
+ mes "[Veronica]";
+ mes "There are 19 Hair Styles, 1~19!!!";
+ mes "Which number do you want to look at first?";
+ mes "If you want to stop looking, please choose 0.";
+ next;
+ if(sex==0) goto LookF;
+ input @hair_in;
+ if (@hair_in > 19) goto hairtohigh;
+ set @hair,@hair_in;
+ goto ShowPicM;
+ close;
+LookF:
+ set @hairf,0;
+ input @hairf_in;
+ if (@hairf_in > 19) goto hairtohigh;
+ set @hairf,@hairf_in;
+ goto ShowPicF;
+ close;
+ShowPicM:
+ if (@hair == 0) goto hairnothing;
+ if (@hair == 1) goto mhair1show;
+ if (@hair == 2) goto mhair2show;
+ if (@hair == 3) goto mhair3show;
+ if (@hair == 4) goto mhair4show;
+ if (@hair == 5) goto mhair5show;
+ if (@hair == 6) goto mhair6show;
+ if (@hair == 7) goto mhair7show;
+ if (@hair == 8) goto mhair8show;
+ if (@hair == 9) goto mhair9show;
+ if (@hair == 10) goto mhair10show;
+ if (@hair == 11) goto mhair11show;
+ if (@hair == 12) goto mhair12show;
+ if (@hair == 13) goto mhair13show;
+ if (@hair == 14) goto mhair14show;
+ if (@hair == 15) goto mhair15show;
+ if (@hair == 16) goto mhair16show;
+ if (@hair == 17) goto mhair17show;
+ if (@hair == 18) goto mhair18show;
+ if (@hair == 19) goto mhair19show;
+
+mhair1show:
+ cutin "hair_m_01",4;
+ mes "[Veronica]";
+ mes "Oh~ 'Trickdead' style!";
+ mes "It is very neat feature and comfortable.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair2show:
+ cutin "hair_m_02",4;
+ mes "[Veronica]";
+ mes "Oh~'Two-Handed Sword Mastery' style!";
+ mes "It's style is very similar to one of the famous Swordsman.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair3show:
+ cutin "hair_m_03",4;
+ mes "[Veronica]";
+ mes "Oh~'Napalm Beat' style!";
+ mes "It makes feeling there is unknown power...";
+ mes "How do you think? Do you like it?";
+ close;
+mhair4show:
+ cutin "hair_m_04",4;
+ mes "[Veronica]";
+ mes "Oh~'Double Strafe' style!";
+ mes "It will make your mind is very clear.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair5show:
+ cutin "hair_m_05",4;
+ mes "[Veronica]";
+ mes "Oh~'Angelus' style!";
+ mes "It feels calm your reference.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair6show:
+ cutin "hair_m_06",4;
+ mes "[Veronica]";
+ mes "Oh~'Pushcart' style!";
+ mes "This is the style based on motive of string cart..";
+ mes "How do you think? Do you like it?";
+ close;
+mhair7show:
+ cutin "hair_m_07",4;
+ mes "[Veronica]";
+ mes "Oh~'Envenom' style!";
+ mes "It makes feel addicting into something..";
+ mes "How do you think? Do you like it?";
+ close;
+mhair8show:
+ cutin "hair_m_08",4;
+ mes "[Veronica]";
+ mes "Oh~'Bowling Bash' style!";
+ mes "Once people sees it, they will fall for it.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair9show:
+ cutin "hair_m_09",4;
+ mes "[Veronica]";
+ mes "Oh~'Venom Dust' style!";
+ mes "It is the style gives feeling deadly charm.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair10show:
+ cutin "hair_m_10",4;
+ mes "[Veronica]";
+ mes "Oh~'Turn Undead' style!";
+ mes "It gives feeling one attack can make Devils disappear!";
+ mes "How do you think? Do you like it?";
+ close;
+mhair11show:
+ cutin "hair_m_11",4;
+ mes "[Veronica]";
+ mes "Oh~'Dragnology' style!";
+ mes "This is the style bases on motive of mysterious Dragon...";
+ mes "How do you think? Do you like it?";
+ close;
+mhair12show:
+ cutin "hair_m_12",4;
+ mes "[Veronica]";
+ mes "Oh~'Mace Mastery' style!";
+ mes "It looks very hard and attractive.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair13show:
+ cutin "hair_m_13",4;
+ mes "[Veronica]";
+ mes "Oh~'Thunderstorm' style!";
+ mes "It feels hit by Thunderstorm!!";
+ mes "How do you think? Do you like it?";
+ close;
+mhair14show:
+ cutin "hair_m_14",4;
+ mes "[Veronica]";
+ mes "Oh~'Encore' style!";
+ mes "It is the style make people feels like asking you to sing~";
+ mes "How do you think? Do you like it?";
+ close;
+mhair15show:
+ cutin "hair_m_15",4;
+ mes "[Veronica]";
+ mes "Oh~'Grommtooht' style!";
+ mes "It feels like you will be picked by hair!";
+ mes "How do you think? Do you like it?";
+ close;
+mhair16show:
+ cutin "hair_m_16",4;
+ mes "[Veronica]";
+ mes "Oh~'Blitz Beat' style!";
+ mes "It feels it will attack 5 times...?";
+ mes "How do you think? Do you like it?";
+ close;
+mhair17show:
+ cutin "hair_m_17",4;
+ mes "[Veronica]";
+ mes "Oh~'Ore Discovery' style!";
+ mes "It feels like picking up things while walking.";
+ mes "How do you think? Do you like it?";
+ close;
+mhair18show:
+ cutin "hair_m_18",4;
+ mes "[Veronica]";
+ mes "Oh~'Fire Pillar' style!";
+ mes "It has been a great style over the one generation...!";
+ mes "How do you think? Do you like it?";
+ close;
+mhair19show:
+ cutin "hair_m_19",4;
+ mes "[Veronica]";
+ mes "Oh~'Guillotine Fist' style!";
+ mes "It feels like betting all at once!!";
+ mes "How do you think? Do you like it?";
+ close;
+ShowPicF:
+ if (@hairf == 0) goto hairnothing;
+ if (@hairf == 1) goto fhair1show;
+ if (@hairf == 2) goto fhair2show;
+ if (@hairf == 3) goto fhair3show;
+ if (@hairf == 4) goto fhair4show;
+ if (@hairf == 5) goto fhair5show;
+ if (@hairf == 6) goto fhair6show;
+ if (@hairf == 7) goto fhair7show;
+ if (@hairf == 8) goto fhair8show;
+ if (@hairf == 9) goto fhair9show;
+ if (@hairf == 10) goto fhair10show;
+ if (@hairf == 11) goto fhair11show;
+ if (@hairf == 12) goto fhair12show;
+ if (@hairf == 13) goto fhair13show;
+ if (@hairf == 14) goto fhair14show;
+ if (@hairf == 15) goto fhair15show;
+ if (@hairf == 16) goto fhair16show;
+ if (@hairf == 17) goto fhair17show;
+ if (@hairf == 18) goto fhair18show;
+ if (@hairf == 19) goto fhair19show;
+fhair1show:
+ cutin "hair_f_01",4;
+ mes "[Veronica]";
+ mes "Oh~ 'Trickdead' style!";
+ mes "It is the style people wants to stroke your hair.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair2show:
+ cutin "hair_f_02",4;
+ mes "[Veronica]";
+ mes "Oh~'Bash' style!";
+ mes "It feels unrevealed strong power is hidden inside of....";
+ mes "How do you think? Do you like it?";
+ close;
+fhair3show:
+ cutin "hair_f_03",4;
+ mes "[Veronica]";
+ mes "Oh~'Frost Diver' style!";
+ mes "It feels cold, but also warm....";
+ mes "How do you think? Do you like it?";
+ close;
+fhair4show:
+ cutin "hair_f_04",4;
+ mes "[Veronica]";
+ mes "Oh~'Arrow Shower' style!";
+ mes "It feels very refreshed~";
+ mes "How do you think? Do you like it?";
+ close;
+fhair5show:
+ cutin "hair_f_05",4;
+ mes "[Veronica]";
+ mes "Oh~'Heal' style!";
+ mes "It feels mind in cured.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair6show:
+ cutin "hair_f_06",4;
+ mes "[Veronica]";
+ mes "Oh~'Vending' style!";
+ mes "It seems like making lots of money.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair7show:
+ cutin "hair_f_07",4;
+ mes "[Veronica]";
+ mes "Oh~'Double Strafe' style!";
+ mes "It makes whomever dash twice.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair8show:
+ cutin "hair_f_08",4;
+ mes "[Veronica]";
+ mes "Oh~'Gloria' style!";
+ mes "Its nobleness and holiness moods are great.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair9show:
+ cutin "hair_f_09",4;
+ mes "[Veronica]";
+ mes "Oh~'Increase Sp Recovery' style!";
+ mes "It makes fell like recovering spirit fully.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair10show:
+ cutin "hair_f_10",4;
+ mes "[Veronica]";
+ mes "Oh~'Prepare Potion' style!";
+ mes "It feels a wound is healed already.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair11show:
+ cutin "hair_f_11",4;
+ mes "[Veronica]";
+ mes "Oh~'Grand Cross' style!";
+ mes "It feels like a firm faith.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair12show:
+ cutin "hair_f_12",4;
+ mes "[Veronica]";
+ mes "Oh~'Intimidate' style!";
+ mes "It seems you saw this style somewhere...?";
+ mes "How do you think? Do you like it?";
+ close;
+fhair13show:
+ cutin "hair_f_13",4;
+ mes "[Veronica]";
+ mes "Oh~'Spiritual Sphere Absorption' style!";
+ mes "Its catch people's spirits.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair14show:
+ cutin "hair_f_14",4;
+ mes "[Veronica]";
+ mes "Oh~'Gypsy's Kiss' style!";
+ mes "It makes people think you are very kind to all...";
+ mes "How do you think? Do you like it?";
+ close;
+fhair15show:
+ cutin "hair_f_15",4;
+ mes "[Veronica]";
+ mes "Oh~'Counter Attack' style!";
+ mes "It feels it will kick when someone is near.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair16show:
+ cutin "hair_f_16",4;
+ mes "[Veronica]";
+ mes "Oh~'Ankle Snare' style!";
+ mes "This is the style hardly moved";
+ mes "How do you think? Do you like it?";
+ close;
+fhair17show:
+ cutin "hair_f_17",4;
+ mes "[Veronica]";
+ mes "Oh~'Hammer Fall' style!";
+ mes "It will make feeling dizzy.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair18show:
+ cutin "hair_f_18",4;
+ mes "[Veronica]";
+ mes "Oh~'Jupiter Thunder' style!";
+ mes "It feels very neat.";
+ mes "How do you think? Do you like it?";
+ close;
+fhair19show:
+ cutin "hair_f_19",4;
+ mes "[Veronica]";
+ mes "Oh~'Whirlwind' style!";
+ mes "It feels very refreshed like wind.";
+ mes "How do you think? Do you like it?";
+ close;
+hairnothing:
+ mes "[Veronica]";
+ mes "Did you find a style you like?";
+ mes "If you want to change your hair style at anytime, I will do my best!!";
+ close;
+hairtohigh:
+ mes "[Veronica]";
+ mes "Sorry, there aren't any Hairstyles with that number.";
+ mes "Please choose a number from 1 to 19.";
+ close;
+Change:
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+
+ set @hairch,0;
+ mes "[Veronica]";
+ mes "Well, then... Please choose Hair Style you like most.";
+ mes "I will do my best";
+ mes "There are 19 different Hair Styles.";
+ mes "Numbers from 1 to 19~";
+ next;
+ if(sex==0) goto iffemale;
+ input @hairchange_in;
+ if (@hairchange_in > 19) goto tohighchange;
+ set @hairch,@hairchange_in;
+ if (@hairch == 1) goto mhair1;
+ if (@hairch == 2) goto mhair2;
+ if (@hairch == 3) goto mhair3;
+ if (@hairch == 4) goto mhair4;
+ if (@hairch == 5) goto mhair5;
+ if (@hairch == 6) goto mhair6;
+ if (@hairch == 7) goto mhair7;
+ if (@hairch == 8) goto mhair8;
+ if (@hairch == 9) goto mhair9;
+ if (@hairch == 10) goto mhair10;
+ if (@hairch == 11) goto mhair11;
+ if (@hairch == 12) goto mhair12;
+ if (@hairch == 13) goto mhair13;
+ if (@hairch == 14) goto mhair14;
+ if (@hairch == 15) goto mhair15;
+ if (@hairch == 16) goto mhair16;
+ if (@hairch == 17) goto mhair17;
+ if (@hairch == 18) goto mhair18;
+ if (@hairch == 19) goto mhair19;
+mhair1:
+ cutin "hair_m_01",4;
+ mes "[Veronica]";
+ mes "This is the (1) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO1;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,1;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (1) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO1:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair2:
+ cutin "hair_m_02",4;
+ mes "[Veronica]";
+ mes "This is the (2) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yaeh~ I'd love to.",-,"No..I don't like it..",M_NO2;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,2;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (2) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vitis me anytime~ HoHoHo";
+ close;
+M_NO2:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair3:
+ cutin "hair_m_03",4;
+ mes "[Veronica]";
+ mes "This is the (3) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO3;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,3;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (3) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO3:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair4:
+ cutin "hair_m_04",4;
+ mes "[Veronica]";
+ mes "This is the (4) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO4;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,4;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (4) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO4:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair5:
+ cutin "hair_m_05",4;
+ mes "[Veronica]";
+ mes "This is the (5) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO5;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,5;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (5) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO5:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair6:
+ cutin "hair_m_06",4;
+ mes "[Veronica]";
+ mes "This is the (6) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO6;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,6;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (6) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO6:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair7:
+ cutin "hair_m_07",4;
+ mes "[Veronica]";
+ mes "This is the (7) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO7;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,7;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (7) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO7:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair8:
+ cutin "hair_m_08",4;
+ mes "[Veronica]";
+ mes "This is the (8) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO8;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,8;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (8) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO8:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair9:
+ cutin "hair_m_09",4;
+ mes "[Veronica]";
+ mes "This is the (9) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO9;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,9;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (9) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO9:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair10:
+ cutin "hair_m_10",4;
+ mes "[Veronica]";
+ mes "This is the (10) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO10;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,10;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (10) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO10:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair11:
+ cutin "hair_m_11",4;
+ mes "[Veronica]";
+ mes "This is the (11) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO11;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,11;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (11) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO11:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair12:
+ cutin "hair_m_12",4;
+ mes "[Veronica]";
+ mes "This is the (12) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,12;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (12) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO12:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair13:
+ cutin "hair_m_13",4;
+ mes "[Veronica]";
+ mes "This is the (13) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO13;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,13;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (13) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO13:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair14:
+ cutin "hair_m_14",4;
+ mes "[Veronica]";
+ mes "This is the (14) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO14;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,14;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (14) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO14:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair15:
+ cutin "hair_m_15",4;
+ mes "[Veronica]";
+ mes "This is the (15) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO15;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,15;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (15) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO15:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair16:
+ cutin "hair_m_16",4;
+ mes "[Veronica]";
+ mes "This is the (16) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO16;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,16;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (16) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO16:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair17:
+ cutin "hair_m_17",4;
+ mes "[Veronica]";
+ mes "This is the (17) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,17;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (17) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO17:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair18:
+ cutin "hair_m_18",4;
+ mes "[Veronica]";
+ mes "This is the (18) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO12;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,18;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (18) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO18:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+mhair19:
+ cutin "hair_m_19",4;
+ mes "[Veronica]";
+ mes "This is the (19) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",M_NO19;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,19;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (19) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+M_NO19:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+iffemale:
+ input @hairchange_in;
+ if (@hairchange_in > 19) goto tohighchange;
+ set @hairch,@hairchange_in;
+ if (@hairch == 1) goto fhair1;
+ if (@hairch == 2) goto fhair2;
+ if (@hairch == 3) goto fhair3;
+ if (@hairch == 4) goto fhair4;
+ if (@hairch == 5) goto fhair5;
+ if (@hairch == 6) goto fhair6;
+ if (@hairch == 7) goto fhair7;
+ if (@hairch == 8) goto fhair8;
+ if (@hairch == 9) goto fhair9;
+ if (@hairch == 10) goto fhair10;
+ if (@hairch == 11) goto fhair11;
+ if (@hairch == 12) goto fhair12;
+ if (@hairch == 13) goto fhair13;
+ if (@hairch == 14) goto fhair14;
+ if (@hairch == 15) goto fhair15;
+ if (@hairch == 16) goto fhair16;
+ if (@hairch == 17) goto fhair17;
+ if (@hairch == 18) goto fhair18;
+ if (@hairch == 19) goto fhair19;
+
+fhair1:
+ cutin "hair_f_01",4;
+ mes "[Veronica]";
+ mes "This is the (1) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yaeh~ I'd love to.",-,"No..I don't like it..",F_NO1;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,1;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (1) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO1:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair2:
+ cutin "hair_f_02",4;
+ mes "[Veronica]";
+ mes "This is the (2) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO2;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,2;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (2) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO2:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair3:
+ cutin "hair_f_03",4;
+ mes "[Veronica]";
+ mes "This is the (3) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO3;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,3;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (3) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO3:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair4:
+ cutin "hair_f_04",4;
+ mes "[Veronica]";
+ mes "This is the (4) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO4;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,4;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (4) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO4:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair5:
+ cutin "hair_f_05",4;
+ mes "[Veronica]";
+ mes "This is the (5) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO5;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,5;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (5) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO5:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair6:
+ cutin "hair_f_06",4;
+ mes "[Veronica]";
+ mes "This is the (6) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO6;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,6;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (6) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO6:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair7:
+ cutin "hair_f_07",4;
+ mes "[Veronica]";
+ mes "This is the (7) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO7;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,7;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (7) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO7:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair8:
+ cutin "hair_f_08",4;
+ mes "[Veronica]";
+ mes "This is the (8) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO8;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,8;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (8) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO8:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair9:
+ cutin "hair_f_09",4;
+ mes "[Veronica]";
+ mes "This is the (9) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO9;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,9;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (9) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO9:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair10:
+ cutin "hair_f_10",4;
+ mes "[Veronica]";
+ mes "This is the (10) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO10;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,10;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (10) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO10:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair11:
+ cutin "hair_f_11",4;
+ mes "[Veronica]";
+ mes "This is the (11) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO11;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,11;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (11) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO11:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair12:
+ cutin "hair_f_12",4;
+ mes "[Veronica]";
+ mes "This is the (12) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO12;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,12;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (12) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO12:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair13:
+ cutin "hair_f_13",4;
+ mes "[Veronica]";
+ mes "This is the (13) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO13;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,13;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (13) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO13:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair14:
+ cutin "hair_f_14",4;
+ mes "[Veronica]";
+ mes "This is the (14) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO14;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,14;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (14) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO14:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair15:
+ cutin "hair_f_15",4;
+ mes "[Veronica]";
+ mes "This is the (15) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO15;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,15;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (15) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO15:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair16:
+ cutin "hair_f_16",4;
+ mes "[Veronica]";
+ mes "This is the (16) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO16;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,16;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (16) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO16:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair17:
+ cutin "hair_f_17",4;
+ mes "[Veronica]";
+ mes "This is the (17) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO17;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,17;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (17) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO17:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair18:
+ cutin "hair_f_18",4;
+ mes "[Veronica]";
+ mes "This is the (18) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO18;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,18;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (18) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO18:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+fhair19:
+ cutin "hair_f_19",4;
+ mes "[Veronica]";
+ mes "This is the (19) style.";
+ mes "I will change your Hair with this Again.";
+ mes "Is that OK for you??";
+ next;
+ menu "Yeah~ I'd love to.",-,"No..I don't like it..",F_NO19;
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Now it begins~. Hold still~";
+ mes "If you move, you will have very bad style.";
+ mes "Just trust me on this!!";
+ next;
+ mes "[Veronica]";
+ mes "- Clip clip Clip clip -";
+ mes "- Klit klit Klit klit -";
+ mes "- Snap snap Snap snap -";
+ next;
+ if ((countitem(973) < 3) || (countitem(974) < 3) || (countitem(901) <100) || (countitem(1094) <100) || (countitem(1020) <100) || (countitem(1060) <100) || (countitem(7152) <100) ||(Zeny < 99800)) goto NOItem;
+ set Zeny,Zeny-99800;
+ delitem 973,3;
+ delitem 974,3;
+ delitem 901,100;
+ delitem 1094,100;
+ delitem 1020,100;
+ delitem 1060,100;
+ delitem 7152,100;
+ setlook 1,19;
+ mes "[Veronica]";
+ mes "Wow~ it came out very well~~";
+ mes "I hope you like this (19) style.";
+ mes "If you'd like to have another hair style,";
+ mes "you are welcome welcome to vi tis me anytime~ HoHoHo";
+ close;
+F_NO19:
+ cutin "",255;
+ mes "[Veronica]";
+ mes "Well~ choose again please~";
+ mes "There should be a style you like.";
+ mes "Just remember the number you like the most and tell me.";
+ close;
+tohighchange:
+ mes "[Veronica]";
+ mes "There are no such numbers like that!";
+ mes "Please check your number~";
+ close;
+NOItem:
+ mes "[Veronica]";
+ mes "If you want to change your hairstyle, you need several items.";
+ mes "Since, you need many items....";
+ mes "I think you should write those down.";
+ next;
+ mes "[Veronica]";
+ mes "3 Counteragents,";
+ mes "3 Mixtures,";
+ mes "100 Daenggies,";
+ mes "100 Short Daenggies,";
+ mes "100 Black Hairs,";
+ mes "100 Golden Hairs,";
+ mes "100 Glossy Hair.";
+ next;
+ mes "[Veronica]";
+ mes "And also you need 99,800zeny.";
+ mes "If you gather them all...";
+ mes "I will show you what I can do~!!";
+ mes "HoHoHo.";
+ close;
+Cancel:
+ mes "[Veronica]";
+ mes "Everyone has rights to become beautiful...";
+ mes "I wish you can find your hair style which fits on you well~";
+ mes "I really do~";
+ close;
} \ No newline at end of file
diff --git a/npc/merchants/icecream.txt b/npc/merchants/icecream.txt
index 9dcaa6425..ca5f72011 100644
--- a/npc/merchants/icecream.txt
+++ b/npc/merchants/icecream.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= Ice Cream Maker
-//===== By: ==================================================
-//= KOOK SWU
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= A man makes you ice-cream
-//===== Additional Comments: =================================
-//= 1.1 Optimized, changed overlapping coords in Alberta [Lupus]
-//= 1.2 According to the patch, IceCream seller has been removed from Morocc [Lupus]
-//============================================================
-
-//ALBERTA
-alberta.gat,120,45,2 script Ice Cream Maker::IceCreamer 85,{
- mes "[Ice Cream Maker]";
- mes "Fresh Ice Cream made with snow from Lutie!";
- mes "Enjoy it now, it won't be on sale for long!";
- mes "^0000FF100 Zeny^000000 Ice Cream,";
- mes "Ice Cream!";
- next;
- menu "Gimme Ice Cream!",-,"Cancel Trade",L_End;
-
- mes "[Ice Cream Maker]";
- mes "Fresh Ice Cream made with snow from Lutie!";
- mes "Everyone wants our delicious ice cream, but we have limited amount,";
- mes "so you can only purchase 5 at a time!!";
- next;
- input @input;
- mes "[Ice Cream Maker]";
- if(@input<1) goto L_inpC;
- if(@input>5) goto L_inpM;
- if(Zeny< @input*100) goto L_NoZ;
- set Zeny,Zeny-100*@input;
- getitem 536,@input;
- mes "Here you go " +@input+ " Ice Cream for you.";
- close;
-
- L_inpC:
- mes "Deal is canceled.";
- close;
- L_inpM:
- mes "Sorry, but you can only buy 5 at a time.";
- close;
- L_NoZ:
- mes "Sorry, but you need more money.";
- close;
- L_End:
- mes "[Ice Cream Maker]";
- mes "Are you sure you don't want any?";
- mes "I won't be selling it for long, and once I run out, there won't be anymore!!!";
- close;
-}
-
-//MORROC FIELD
-moc_fild16.gat,88,304,4 duplicate(IceCreamer) Ice Cream Maker#2 85
-
-//MORROC
-//morocc.gat,160,144,4 duplicate(IceCreamer) Ice Cream Maker#3 85
+//===== eAthena Script =======================================
+//= Ice Cream Maker
+//===== By: ==================================================
+//= KOOK SWU
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= A man makes you ice-cream
+//===== Additional Comments: =================================
+//= 1.1 Optimized, changed overlapping coords in Alberta [Lupus]
+//= 1.2 According to the patch, IceCream seller has been removed from Morocc [Lupus]
+//============================================================
+
+//ALBERTA
+alberta.gat,120,45,2 script Ice Cream Maker::IceCreamer 85,{
+ mes "[Ice Cream Maker]";
+ mes "Fresh Ice Cream made with snow from Lutie!";
+ mes "Enjoy it now, it won't be on sale for long!";
+ mes "^0000FF100 Zeny^000000 Ice Cream,";
+ mes "Ice Cream!";
+ next;
+ menu "Gimme Ice Cream!",-,"Cancel Trade",L_End;
+
+ mes "[Ice Cream Maker]";
+ mes "Fresh Ice Cream made with snow from Lutie!";
+ mes "Everyone wants our delicious ice cream, but we have limited amount,";
+ mes "so you can only purchase 5 at a time!!";
+ next;
+ input @input;
+ mes "[Ice Cream Maker]";
+ if(@input<1) goto L_inpC;
+ if(@input>5) goto L_inpM;
+ if(Zeny< @input*100) goto L_NoZ;
+ set Zeny,Zeny-100*@input;
+ getitem 536,@input;
+ mes "Here you go " +@input+ " Ice Cream for you.";
+ close;
+
+ L_inpC:
+ mes "Deal is canceled.";
+ close;
+ L_inpM:
+ mes "Sorry, but you can only buy 5 at a time.";
+ close;
+ L_NoZ:
+ mes "Sorry, but you need more money.";
+ close;
+ L_End:
+ mes "[Ice Cream Maker]";
+ mes "Are you sure you don't want any?";
+ mes "I won't be selling it for long, and once I run out, there won't be anymore!!!";
+ close;
+}
+
+//MORROC FIELD
+moc_fild16.gat,88,304,4 duplicate(IceCreamer) Ice Cream Maker#2 85
+
+//MORROC
+//morocc.gat,160,144,4 duplicate(IceCreamer) Ice Cream Maker#3 85
diff --git a/npc/merchants/inn.txt b/npc/merchants/inn.txt
index 1f30e8078..494ed8b14 100644
--- a/npc/merchants/inn.txt
+++ b/npc/merchants/inn.txt
@@ -1,138 +1,138 @@
-//===== eAthena Script =======================================
-//= Inn Npcs
-//===== By: ==================================================
-//= Darkchild (1.1)
-//= Playtester (1.2)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Inn Npcs, Save and Heal
-//=====================================================
-//= variables:
-//= arg0 - name of npc
-//= arg1 - name of the inn
-//= arg2 - map to save at
-//= arg3, arg4 - x and y cord. to save at
-//= @cost - cost of renting a room
-//===== Additional Comments: =================================
-//= 1.1 Blind Effect By Kobra_k88 (Taken from his old script)
-//= I added it to all of them though [Darkchild]
-//= 1.1a Minor bug fixes and optimizations. Switched from @variables
-//= to arguments.[kobra_k88]
-//= 1.2 Rewrote inn script [Playtester]
-//= 1.3 Added (finally) Rachel Inn Maid. Official warp
-//= and save points[erKURITA]
-//= 1.4 Added Hugel inn [erKurita]
-//============================================================
-
-
-//======================== Prontera ===================================
-// West Side Inn -------------------
-prt_in.gat,244,135,2 script Inn Maid::Sammy 53,{
-
- callfunc "F_InnMaid","[Sammy]","West Inn","prt_in.gat",238,130;
- warp "prt_in.gat",237,102;
-}
-// East Side Inn ------------------
-prt_in.gat,61,141,2 script Inn Maid::Ahlma#01 53,{
-
- callfunc "F_InnMaid","[Ahlma]","East Inn","prt_in.gat",64,136;
- warp "prt_in.gat",49,173;
-}
-
-//======================== Alberta ====================================
-// North --------------------------
-alberta_in.gat,32,142,5 script Inn Maid::Moira 53,{
-
- callfunc "F_InnMaid","[Moira]","North Inn","alberta_in.gat",26,138;
- warp "alberta_in.gat",18,188;
-}
-// South -----------------------------
-alberta_in.gat,55,142,8 script Inn Maid::Tina 53,{
-
- callfunc "F_InnMaid","[Tina]","South Inn","alberta_in.gat",60,140;
- warp "alberta_in.gat",68,188;
-}
-
-//====================== Geffen ======================================
-geffen_in.gat,70,64,5 script Inn Maid::Betty 53,{
-
- callfunc "F_InnMaid","[Betty]","Geffen Inn","geffen_in.gat",74,60;
- warp "geffen_in.gat",106,106;
-}
-
-//======================= Payon ======================================
-payon_in01.gat,131,62,5 script Inn Maid::SunHee 53,{
-
- callfunc "F_InnMaid","[Sun Hee]","Payon Inn","payon_in01.gat",132,56;
- warp "payon_in01.gat",140,15;
-}
-
-//======================== Morocc ====================================
-// North East --------------------------
-morocc_in.gat,147,138,5 script Inn Maid::Suzie 53,{
-
- callfunc "F_InnMaid","[Suzie]","North East Inn","morocc_in.gat",142,140;
- warp "morocc_in.gat",174,144;
-}
-// South --------------------------------
-morocc_in.gat,80,100,5 script Inn Maid::Shala 53,{
-
- callfunc "F_InnMaid","[Shala]","South Inn","morocc_in.gat",78,95;
- warp "morocc_in.gat",74,128;
-}
-
-//======================== Rachel ====================================
-ra_in01.gat,376,69,4 script Inn Keeper 931,{
-
- callfunc "F_InnMaid","[Annie]","Rachel Inn","ra_in01.gat",375,58;
- warp "ra_in01.gat",384,128;
-}
-
-//======================== Hugel ====================================
-hu_in01.gat,246,107,3 script Inn Maid::Receptionist 53,{
-
- callfunc "F_InnMaid","[Receptionist]","Hugel Inn","hu_in01.gat",263,95;
- warp "hu_in01",267,5;
-}
-
-//======================= Inn Function ==============================
-function script F_InnMaid {
- mes getarg(0);
- mes "Welcome to '" + getarg(1) + "'.";
- mes "How may I help you?";
- next;
- menu "Save",Msave, "Take a Rest -> 5000 zeny",Mrent, "Cancel",Mend;
-
- Msave:
- mes getarg(0);
- mes "Your respawn point";
- mes "has been saved.";
- mes "Thank you,";
- mes "please come again.";
- savepoint getarg(2),getarg(3),getarg(4);
- close;
- Mrent:
- mes getarg(0);
- if(Zeny < 5000){
- mes "I'm sorry, but the service charge";
- mes "is 5,000 zeny. Please make sure";
- mes "that you have enough money to check";
- mes "in next time, okay?";
- close;
- }
- set Zeny,Zeny - 5000;
- percentheal 100,100;
- mes "Thank you.";
- mes "I hope you";
- mes "enjoy your rest~";
- close2;
- return;
-
- Mend:
- mes getarg(0);
- mes "I am waiting for a job to do.";
- close;
-}
+//===== eAthena Script =======================================
+//= Inn Npcs
+//===== By: ==================================================
+//= Darkchild (1.1)
+//= Playtester (1.2)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Inn Npcs, Save and Heal
+//=====================================================
+//= variables:
+//= arg0 - name of npc
+//= arg1 - name of the inn
+//= arg2 - map to save at
+//= arg3, arg4 - x and y cord. to save at
+//= @cost - cost of renting a room
+//===== Additional Comments: =================================
+//= 1.1 Blind Effect By Kobra_k88 (Taken from his old script)
+//= I added it to all of them though [Darkchild]
+//= 1.1a Minor bug fixes and optimizations. Switched from @variables
+//= to arguments.[kobra_k88]
+//= 1.2 Rewrote inn script [Playtester]
+//= 1.3 Added (finally) Rachel Inn Maid. Official warp
+//= and save points[erKURITA]
+//= 1.4 Added Hugel inn [erKurita]
+//============================================================
+
+
+//======================== Prontera ===================================
+// West Side Inn -------------------
+prt_in.gat,244,135,2 script Inn Maid::Sammy 53,{
+
+ callfunc "F_InnMaid","[Sammy]","West Inn","prt_in.gat",238,130;
+ warp "prt_in.gat",237,102;
+}
+// East Side Inn ------------------
+prt_in.gat,61,141,2 script Inn Maid::Ahlma#01 53,{
+
+ callfunc "F_InnMaid","[Ahlma]","East Inn","prt_in.gat",64,136;
+ warp "prt_in.gat",49,173;
+}
+
+//======================== Alberta ====================================
+// North --------------------------
+alberta_in.gat,32,142,5 script Inn Maid::Moira 53,{
+
+ callfunc "F_InnMaid","[Moira]","North Inn","alberta_in.gat",26,138;
+ warp "alberta_in.gat",18,188;
+}
+// South -----------------------------
+alberta_in.gat,55,142,8 script Inn Maid::Tina 53,{
+
+ callfunc "F_InnMaid","[Tina]","South Inn","alberta_in.gat",60,140;
+ warp "alberta_in.gat",68,188;
+}
+
+//====================== Geffen ======================================
+geffen_in.gat,70,64,5 script Inn Maid::Betty 53,{
+
+ callfunc "F_InnMaid","[Betty]","Geffen Inn","geffen_in.gat",74,60;
+ warp "geffen_in.gat",106,106;
+}
+
+//======================= Payon ======================================
+payon_in01.gat,131,62,5 script Inn Maid::SunHee 53,{
+
+ callfunc "F_InnMaid","[Sun Hee]","Payon Inn","payon_in01.gat",132,56;
+ warp "payon_in01.gat",140,15;
+}
+
+//======================== Morocc ====================================
+// North East --------------------------
+morocc_in.gat,147,138,5 script Inn Maid::Suzie 53,{
+
+ callfunc "F_InnMaid","[Suzie]","North East Inn","morocc_in.gat",142,140;
+ warp "morocc_in.gat",174,144;
+}
+// South --------------------------------
+morocc_in.gat,80,100,5 script Inn Maid::Shala 53,{
+
+ callfunc "F_InnMaid","[Shala]","South Inn","morocc_in.gat",78,95;
+ warp "morocc_in.gat",74,128;
+}
+
+//======================== Rachel ====================================
+ra_in01.gat,376,69,4 script Inn Keeper 931,{
+
+ callfunc "F_InnMaid","[Annie]","Rachel Inn","ra_in01.gat",375,58;
+ warp "ra_in01.gat",384,128;
+}
+
+//======================== Hugel ====================================
+hu_in01.gat,246,107,3 script Inn Maid::Receptionist 53,{
+
+ callfunc "F_InnMaid","[Receptionist]","Hugel Inn","hu_in01.gat",263,95;
+ warp "hu_in01",267,5;
+}
+
+//======================= Inn Function ==============================
+function script F_InnMaid {
+ mes getarg(0);
+ mes "Welcome to '" + getarg(1) + "'.";
+ mes "How may I help you?";
+ next;
+ menu "Save",Msave, "Take a Rest -> 5000 zeny",Mrent, "Cancel",Mend;
+
+ Msave:
+ mes getarg(0);
+ mes "Your respawn point";
+ mes "has been saved.";
+ mes "Thank you,";
+ mes "please come again.";
+ savepoint getarg(2),getarg(3),getarg(4);
+ close;
+ Mrent:
+ mes getarg(0);
+ if(Zeny < 5000){
+ mes "I'm sorry, but the service charge";
+ mes "is 5,000 zeny. Please make sure";
+ mes "that you have enough money to check";
+ mes "in next time, okay?";
+ close;
+ }
+ set Zeny,Zeny - 5000;
+ percentheal 100,100;
+ mes "Thank you.";
+ mes "I hope you";
+ mes "enjoy your rest~";
+ close2;
+ return;
+
+ Mend:
+ mes getarg(0);
+ mes "I am waiting for a job to do.";
+ close;
+}
diff --git a/npc/merchants/kunai_maker.txt b/npc/merchants/kunai_maker.txt
index f836befdf..9e1d3459c 100644
--- a/npc/merchants/kunai_maker.txt
+++ b/npc/merchants/kunai_maker.txt
@@ -1,97 +1,97 @@
-//===== eAthena Script =======================================
-//= Kunai "Trader" @ que_ng.gat
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= NPC that trades you a few shurikens + ninja stones for
-//= elemental kunais.
-//===== Additional Comments: =================================
-//= 1.0 Added the npc. It uses a function that sends the item
-//= id of the 2 required items plus the amount. Can trade
-//= up to 500 units (5,000 kunais) at once. [erKURITA]
-//============================================================
-que_ng.gat,72,29,3 script Kunai Seller 83,{
-mes "[Jin]";
-mes "Hi, I sell elemental enchanted kunais. I'll trade you some elemental stones and one kind of shuriken for a determined elemental Kunai";
-next;
-mes "[Jin]";
-mes "What would you like to trade some? It's free";
-switch(select("10 Poison Kunais:10 Icycle Kunais:10 Rough Wind Kunais:10 Black Soil Kunai:10 Explosion Kunai:Nothing at the Moment")) {
-//Callfunc usage: callfunc "Kunai_Trade",itemreqid1,itemreqct1,itemreqid2,itemreqct2,itemidtrade;
- case 1:
- callfunc "Kunai_Trade",13250,20,7524,1,13259;
- goto L_Bye;
- case 2:
- callfunc "Kunai_Trade",13251,8,7522,2,13255;
- goto L_Bye;
- case 3:
- callfunc "Kunai_Trade",13252,4,7523,2,13257;
- goto L_Bye;
- case 4:
- callfunc "Kunai_Trade",13253,2,7524,1,13256;
- goto L_Bye;
- case 5:
- callfunc "Kunai_Trade",13254,1,7521,2,13258;
- goto L_Bye;
- case 6:
- goto L_Bye;
- }
-L_Bye:
- next;
- mes "[Jin]";
- mes "Good bye and hope to see you again then";
- close;
-}
-
-function script Kunai_Trade {
- next;
- mes "[Jin]";
- if (MaxWeight*50/100 < Weight) {
- if (MaxWeight*90/100 < Weight) {
- mes "Sorry but you have more than 90% weight. Your kunais might drop. I can't give you anything.";
- return;
- }
- mes "You have 50% or more weight, do you still want to continue?";
- menu "Yes",-,"No, thanks",L_Return;
- }
-
- mes "Would you like to trade my 10 "+getitemname(getarg(4))+" for your "+getarg(1)+" "+getitemname(getarg(0))+" and "+getarg(3)+" "+getitemname(getarg(2))+" ?";
- switch(select("Yes:I'll think about it")) {
- case 1:
- next;
- mes "[Jin]";
- if (countitem(getarg(0)) < getarg(1) || countitem(getarg(2)) < getarg(3)) {
- mes "Sorry but you're missing one of the required items. Please get them";
- close;
- } else
- mes "How many do you want to trade? I can only trade you ^FF0000500^000000 units at once.";
- mes "^00FF001 Unit^000000 ^FF0000=^000000 ^0000FF10 Kunais^000000 of your desire";
- input @trade;
- next;
- mes "[Jin]";
- if (@trade > 500) {
- mes "Sorry, but I told you I could only trade you 500 units at once. Try again";
- close;
- } else if (@trade < 1) {
- mes "Sorry, but 1 unit is the minimun I can trade. Try again please.";
- close;
- } else if ((countitem(getarg(0)) < @trade*getarg(1)) || (countitem(getarg(2)) < @trade*getarg(3))) {
- mes "Sorry, but you don't have enough items to trade "+@trade+" unit(s). Get more please";
- close;
- } else
- mes "Here you go, enjoy them";
- delitem getarg(0),getarg(1)*@trade;
- delitem getarg(2),getarg(3)*@trade;
- getitem getarg(4),10*@trade;
- next;
- return;
- case 2:
- return;
- }
-L_Return:
- return;
-}
+//===== eAthena Script =======================================
+//= Kunai "Trader" @ que_ng.gat
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= NPC that trades you a few shurikens + ninja stones for
+//= elemental kunais.
+//===== Additional Comments: =================================
+//= 1.0 Added the npc. It uses a function that sends the item
+//= id of the 2 required items plus the amount. Can trade
+//= up to 500 units (5,000 kunais) at once. [erKURITA]
+//============================================================
+que_ng.gat,72,29,3 script Kunai Seller 83,{
+mes "[Jin]";
+mes "Hi, I sell elemental enchanted kunais. I'll trade you some elemental stones and one kind of shuriken for a determined elemental Kunai";
+next;
+mes "[Jin]";
+mes "What would you like to trade some? It's free";
+switch(select("10 Poison Kunais:10 Icycle Kunais:10 Rough Wind Kunais:10 Black Soil Kunai:10 Explosion Kunai:Nothing at the Moment")) {
+//Callfunc usage: callfunc "Kunai_Trade",itemreqid1,itemreqct1,itemreqid2,itemreqct2,itemidtrade;
+ case 1:
+ callfunc "Kunai_Trade",13250,20,7524,1,13259;
+ goto L_Bye;
+ case 2:
+ callfunc "Kunai_Trade",13251,8,7522,2,13255;
+ goto L_Bye;
+ case 3:
+ callfunc "Kunai_Trade",13252,4,7523,2,13257;
+ goto L_Bye;
+ case 4:
+ callfunc "Kunai_Trade",13253,2,7524,1,13256;
+ goto L_Bye;
+ case 5:
+ callfunc "Kunai_Trade",13254,1,7521,2,13258;
+ goto L_Bye;
+ case 6:
+ goto L_Bye;
+ }
+L_Bye:
+ next;
+ mes "[Jin]";
+ mes "Good bye and hope to see you again then";
+ close;
+}
+
+function script Kunai_Trade {
+ next;
+ mes "[Jin]";
+ if (MaxWeight*50/100 < Weight) {
+ if (MaxWeight*90/100 < Weight) {
+ mes "Sorry but you have more than 90% weight. Your kunais might drop. I can't give you anything.";
+ return;
+ }
+ mes "You have 50% or more weight, do you still want to continue?";
+ menu "Yes",-,"No, thanks",L_Return;
+ }
+
+ mes "Would you like to trade my 10 "+getitemname(getarg(4))+" for your "+getarg(1)+" "+getitemname(getarg(0))+" and "+getarg(3)+" "+getitemname(getarg(2))+" ?";
+ switch(select("Yes:I'll think about it")) {
+ case 1:
+ next;
+ mes "[Jin]";
+ if (countitem(getarg(0)) < getarg(1) || countitem(getarg(2)) < getarg(3)) {
+ mes "Sorry but you're missing one of the required items. Please get them";
+ close;
+ } else
+ mes "How many do you want to trade? I can only trade you ^FF0000500^000000 units at once.";
+ mes "^00FF001 Unit^000000 ^FF0000=^000000 ^0000FF10 Kunais^000000 of your desire";
+ input @trade;
+ next;
+ mes "[Jin]";
+ if (@trade > 500) {
+ mes "Sorry, but I told you I could only trade you 500 units at once. Try again";
+ close;
+ } else if (@trade < 1) {
+ mes "Sorry, but 1 unit is the minimun I can trade. Try again please.";
+ close;
+ } else if ((countitem(getarg(0)) < @trade*getarg(1)) || (countitem(getarg(2)) < @trade*getarg(3))) {
+ mes "Sorry, but you don't have enough items to trade "+@trade+" unit(s). Get more please";
+ close;
+ } else
+ mes "Here you go, enjoy them";
+ delitem getarg(0),getarg(1)*@trade;
+ delitem getarg(2),getarg(3)*@trade;
+ getitem getarg(4),10*@trade;
+ next;
+ return;
+ case 2:
+ return;
+ }
+L_Return:
+ return;
+}
diff --git a/npc/merchants/milk_trader.txt b/npc/merchants/milk_trader.txt
index 42be03f63..559c1cc0d 100644
--- a/npc/merchants/milk_trader.txt
+++ b/npc/merchants/milk_trader.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= Milk Trader
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= trades bottles for milk
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Negative input bug fixed [Lupus]
-//= 1.2 Raised the price to close zeny exploit [Lupus]
-//= 1.2a Switched to Lupus's "loopless" technique.[kobra_k88]
-//============================================================
-
-
-// Milk Trader -------------------------------------------------------------
-prontera.gat,71,131,7 script Milk Trader 86,{
- mes "[Milk Trader]";
- mes "If you bring me an empty bottle and 20 Zeny, I will exchange it for 1 bottle of milk.";
- next;
- menu "-Exchange as many as possible.",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
-
- M_0:
- set @amount, 1000;
- if(zeny/20 < @amount) set @amount, zeny/20;
- if(countitem(713) < @amount) set @amount, countitem(713);
- if(@amount > 0) goto L_Milk;
- mes "[Milk Trader]";
- mes "..... Are you trying to make a fool of me.... ?";
- close;
-
- M_1:
- input @amount;
- if(@amount < 1 || @amount > 1000) goto M_End;
- if(countitem(713) < @amount) goto L_NoBottle;
- if(zeny < (@amount*20)) goto L_NoZeny;
-
- L_Milk:
- set zeny, zeny - (@amount*20);
- delitem 713, @amount;
- getitem 519, @amount;
-
- M_End:
- mes "[Milk Trader]";
- mes "Come back anytime.";
- close;
-
- L_NoBottle:
- mes "[Milk Trader]";
- mes "Ok, empty bottle please! Empty Bottle!!";
- mes "... Aww.. you don't have enough...?";
- close;
-
- L_NoZeny:
- mes "[Milk Trader]";
- mes "You need more zeny.";
- close;
-}
+//===== eAthena Script =======================================
+//= Milk Trader
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= trades bottles for milk
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Negative input bug fixed [Lupus]
+//= 1.2 Raised the price to close zeny exploit [Lupus]
+//= 1.2a Switched to Lupus's "loopless" technique.[kobra_k88]
+//============================================================
+
+
+// Milk Trader -------------------------------------------------------------
+prontera.gat,71,131,7 script Milk Trader 86,{
+ mes "[Milk Trader]";
+ mes "If you bring me an empty bottle and 20 Zeny, I will exchange it for 1 bottle of milk.";
+ next;
+ menu "-Exchange as many as possible.",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
+
+ M_0:
+ set @amount, 1000;
+ if(zeny/20 < @amount) set @amount, zeny/20;
+ if(countitem(713) < @amount) set @amount, countitem(713);
+ if(@amount > 0) goto L_Milk;
+ mes "[Milk Trader]";
+ mes "..... Are you trying to make a fool of me.... ?";
+ close;
+
+ M_1:
+ input @amount;
+ if(@amount < 1 || @amount > 1000) goto M_End;
+ if(countitem(713) < @amount) goto L_NoBottle;
+ if(zeny < (@amount*20)) goto L_NoZeny;
+
+ L_Milk:
+ set zeny, zeny - (@amount*20);
+ delitem 713, @amount;
+ getitem 519, @amount;
+
+ M_End:
+ mes "[Milk Trader]";
+ mes "Come back anytime.";
+ close;
+
+ L_NoBottle:
+ mes "[Milk Trader]";
+ mes "Ok, empty bottle please! Empty Bottle!!";
+ mes "... Aww.. you don't have enough...?";
+ close;
+
+ L_NoZeny:
+ mes "[Milk Trader]";
+ mes "You need more zeny.";
+ close;
+}
diff --git a/npc/merchants/novice_exchange.txt b/npc/merchants/novice_exchange.txt
index 6c2dda72b..a0e6535b2 100644
--- a/npc/merchants/novice_exchange.txt
+++ b/npc/merchants/novice_exchange.txt
@@ -1,159 +1,159 @@
-//===== eAthena Script ========================================
-//= Novice Goods Exchanger
-//===== By: ==================================================
-//= ???, eAthena Team
-//===== Current Version: =====================================
-//= 1.1a
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Exchanges your cheap loot to Red Potions.
-//= Official NPC.
-//===== Additional Comments: =================================
-//= 1.1 Made it as a function. U can add your own Merchs [Lupus]
-//= 1.1a Fixed item select [KarLaeda]
-//============================================================
-
-function script F_NMerch {
- mes "["+getarg(0)+"]";
- if((Weight*100)/MaxWeight >= 90){
- mes "You will exceed your weight limit if you exchange for the Red Potions.";
- close;
- }
- mes "Good day!";
- mes "Do you have any collection items such as "+getitemname(getarg(1))+" or "+getitemname(getarg(3))+"?";
- if(getarg(5))
- mes "...how about "+getitemname(getarg(5))+"?..";
- mes "Oh, yeah, I need those for something.";
- next;
- mes "["+getarg(0)+"]";
- mes "Of course I am not asking you to give those for free!";
- mes "How about... if I give you 1 Red";
- mes "Potion for "+getarg(2)+" "+getitemname(getarg(1))+" or "+getarg(4)+" "+getitemname(getarg(3))+"?";
- if(getarg(5))
- mes "Or "+getarg(6)+" "+getitemname(getarg(5))+"?";
- next;
- switch (select("Sure!:Think you're ripping me off...:No, thanks")) {
- case 1:
- mes "["+getarg(0)+"]";
- mes "So which item do you bring me?";
- mes ""+getitemname(getarg(1))+"? "+getitemname(getarg(3))+"?";
- if(getarg(5))
- mes "Or "+getitemname(getarg(5))+"?";
- next;
- if(getarg(5))
- set @i,select(""+getitemname(getarg(1))+"",""+getitemname(getarg(3))+"",""+getitemname(getarg(5))+"","Cancel");
- else
- set @i,select(""+getitemname(getarg(1))+"",""+getitemname(getarg(3))+"","Cancel");
- if(@i==4 || (@i==3 && !getarg(5))) {
- mes "["+getarg(0)+"]";
- mes "Sure, no problem.";
- close;
- }
- set @item,getarg(@i*2-1);
- set @amount,getarg(@i*2);
- set @have,countitem(@item);
- if(@have < @amount) {
- mes "["+getarg(0)+"]";
- mes "Hey, where are all those";
- mes getitemname(@item)+" you promised?";
- close;
- }
- mes "["+getarg(0)+"]";
- mes "Okay, let me take a look at the stuff you brought.";
- next;
- set @max,@have / @amount;
- mes "["+getarg(0)+"]";
- mes "You have total "+@have+" "+getitemname(@item)+"...";
- mes "I can give you";
- mes "total "+@max+" Red Potion for those.";
- next;
- mes "["+getarg(0)+"]";
- mes "What do you say? Deal?";
- next;
- if(select("Deal.:No deal.")==2) {
- mes "["+getarg(0)+"]";
- mes "Bah~ whatever.";
- mes "Bah!";
- close;
- }
- mes "["+getarg(0)+"]";
- mes "You know the exact number of Red Potions";
- mes "you can receive for "+getitemname(@item)+", don't you?";
- next;
- mes "["+getarg(0)+"]";
- mes "You can get Red Potions";
- mes "from minimum 1 to maximum 100 at once.";
- mes "If you change your mind, enter '0'";
- mes "to cancel.";
- while(1) {
- next;
- input @val;
- if(@val<0 || @val>100) {
- mes "["+getarg(0)+"]";
- mes "Uh oh, the number you entered";
- mes "seemed incorrect.";
- mes "You'd better check how many Red";
- mes "Potions you can get.";
- continue;
- }
- break;
- }
- mes "["+getarg(0)+"]";
- if(@val == 0) {
- mes "What...how the hell did you even";
- mes "bother to talk to me?";
- mes "Leave, I don't deal with whimsical";
- mes "people.";
- close;
- }
- if(@val > @max) {
- mes "Uh oh, the number you entered";
- mes "seemed incorrect.";
- mes "You'd better check how many Red";
- mes "Potions you can get.";
- close;
- }
- delitem @item,@amount*@val;
- getitem 501,@val;
- mes "There you go!";
- mes "Thanks, it was a good deal.";
- close;
- case 2:
- mes "["+getarg(0)+"]";
- mes "Did you say I am ripping you off?!";
- mes "You got to know how ignorant that comment was!";
- next;
- mes "["+getarg(0)+"]";
- mes "When you check the price of each item,";
- mes "I am doing a losing business.";
- mes "If you don't want to do then, fine!";
- close;
- case 3:
- mes "["+getarg(0)+"]";
- mes "Hah, no problem.";
- mes "Bah!";
- close;
- }
-}
-
-prontera.gat,123,102,5 script Merchant#1 85,{
- callfunc "F_NMerch","Merchant",935,5,914,10,909,10;
-}
-
-geffen.gat,173,88,5 script Merchant#2 85,{
- callfunc "F_NMerch","Merchant",935,5,915,6,909,10;
-}
-
-morocc.gat,180,259,3 script Merchant#3 85,{
- callfunc "F_NMerch","Merchant",935,5,916,7,909,10;
-}
-
-aldebaran.gat,152,63,5 script Merchant#4 85,{
- callfunc "F_NMerch","Merchant",955,1,916,7,909,10;
-}
-
-payon.gat,200,134,5 script Merchant#5 85,{
- //we remove 3rd item, by adding 0,0
- callfunc "F_NMerch","Merchant",902,6,909,10,0,0;
+//===== eAthena Script ========================================
+//= Novice Goods Exchanger
+//===== By: ==================================================
+//= ???, eAthena Team
+//===== Current Version: =====================================
+//= 1.1a
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Exchanges your cheap loot to Red Potions.
+//= Official NPC.
+//===== Additional Comments: =================================
+//= 1.1 Made it as a function. U can add your own Merchs [Lupus]
+//= 1.1a Fixed item select [KarLaeda]
+//============================================================
+
+function script F_NMerch {
+ mes "["+getarg(0)+"]";
+ if((Weight*100)/MaxWeight >= 90){
+ mes "You will exceed your weight limit if you exchange for the Red Potions.";
+ close;
+ }
+ mes "Good day!";
+ mes "Do you have any collection items such as "+getitemname(getarg(1))+" or "+getitemname(getarg(3))+"?";
+ if(getarg(5))
+ mes "...how about "+getitemname(getarg(5))+"?..";
+ mes "Oh, yeah, I need those for something.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Of course I am not asking you to give those for free!";
+ mes "How about... if I give you 1 Red";
+ mes "Potion for "+getarg(2)+" "+getitemname(getarg(1))+" or "+getarg(4)+" "+getitemname(getarg(3))+"?";
+ if(getarg(5))
+ mes "Or "+getarg(6)+" "+getitemname(getarg(5))+"?";
+ next;
+ switch (select("Sure!:Think you're ripping me off...:No, thanks")) {
+ case 1:
+ mes "["+getarg(0)+"]";
+ mes "So which item do you bring me?";
+ mes ""+getitemname(getarg(1))+"? "+getitemname(getarg(3))+"?";
+ if(getarg(5))
+ mes "Or "+getitemname(getarg(5))+"?";
+ next;
+ if(getarg(5))
+ set @i,select(""+getitemname(getarg(1))+"",""+getitemname(getarg(3))+"",""+getitemname(getarg(5))+"","Cancel");
+ else
+ set @i,select(""+getitemname(getarg(1))+"",""+getitemname(getarg(3))+"","Cancel");
+ if(@i==4 || (@i==3 && !getarg(5))) {
+ mes "["+getarg(0)+"]";
+ mes "Sure, no problem.";
+ close;
+ }
+ set @item,getarg(@i*2-1);
+ set @amount,getarg(@i*2);
+ set @have,countitem(@item);
+ if(@have < @amount) {
+ mes "["+getarg(0)+"]";
+ mes "Hey, where are all those";
+ mes getitemname(@item)+" you promised?";
+ close;
+ }
+ mes "["+getarg(0)+"]";
+ mes "Okay, let me take a look at the stuff you brought.";
+ next;
+ set @max,@have / @amount;
+ mes "["+getarg(0)+"]";
+ mes "You have total "+@have+" "+getitemname(@item)+"...";
+ mes "I can give you";
+ mes "total "+@max+" Red Potion for those.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "What do you say? Deal?";
+ next;
+ if(select("Deal.:No deal.")==2) {
+ mes "["+getarg(0)+"]";
+ mes "Bah~ whatever.";
+ mes "Bah!";
+ close;
+ }
+ mes "["+getarg(0)+"]";
+ mes "You know the exact number of Red Potions";
+ mes "you can receive for "+getitemname(@item)+", don't you?";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "You can get Red Potions";
+ mes "from minimum 1 to maximum 100 at once.";
+ mes "If you change your mind, enter '0'";
+ mes "to cancel.";
+ while(1) {
+ next;
+ input @val;
+ if(@val<0 || @val>100) {
+ mes "["+getarg(0)+"]";
+ mes "Uh oh, the number you entered";
+ mes "seemed incorrect.";
+ mes "You'd better check how many Red";
+ mes "Potions you can get.";
+ continue;
+ }
+ break;
+ }
+ mes "["+getarg(0)+"]";
+ if(@val == 0) {
+ mes "What...how the hell did you even";
+ mes "bother to talk to me?";
+ mes "Leave, I don't deal with whimsical";
+ mes "people.";
+ close;
+ }
+ if(@val > @max) {
+ mes "Uh oh, the number you entered";
+ mes "seemed incorrect.";
+ mes "You'd better check how many Red";
+ mes "Potions you can get.";
+ close;
+ }
+ delitem @item,@amount*@val;
+ getitem 501,@val;
+ mes "There you go!";
+ mes "Thanks, it was a good deal.";
+ close;
+ case 2:
+ mes "["+getarg(0)+"]";
+ mes "Did you say I am ripping you off?!";
+ mes "You got to know how ignorant that comment was!";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "When you check the price of each item,";
+ mes "I am doing a losing business.";
+ mes "If you don't want to do then, fine!";
+ close;
+ case 3:
+ mes "["+getarg(0)+"]";
+ mes "Hah, no problem.";
+ mes "Bah!";
+ close;
+ }
+}
+
+prontera.gat,123,102,5 script Merchant#1 85,{
+ callfunc "F_NMerch","Merchant",935,5,914,10,909,10;
+}
+
+geffen.gat,173,88,5 script Merchant#2 85,{
+ callfunc "F_NMerch","Merchant",935,5,915,6,909,10;
+}
+
+morocc.gat,180,259,3 script Merchant#3 85,{
+ callfunc "F_NMerch","Merchant",935,5,916,7,909,10;
+}
+
+aldebaran.gat,152,63,5 script Merchant#4 85,{
+ callfunc "F_NMerch","Merchant",955,1,916,7,909,10;
+}
+
+payon.gat,200,134,5 script Merchant#5 85,{
+ //we remove 3rd item, by adding 0,0
+ callfunc "F_NMerch","Merchant",902,6,909,10,0,0;
} \ No newline at end of file
diff --git a/npc/merchants/quivers.txt b/npc/merchants/quivers.txt
index f54aa884d..0d7eba5b3 100644
--- a/npc/merchants/quivers.txt
+++ b/npc/merchants/quivers.txt
@@ -1,151 +1,151 @@
-//===== eAthena Script ========================================
-//= Arrow Quiver Event
-//===== By: ==================================================
-//= Muad_Dib (Prometheus Project)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Turns arrows into Arrow Quivers.
-//===== Additional Comments: =================================
-//= 07/06/05 : Added 1st Version. [Muad_Dib]
-//= Converted to eAthena format by Dr.Evil
-//= added prize to quest - 500 Zeny
-//= Fixed a few spelling errors. [Nexon]
-//= 1.1 Added Holy Arrow Quivers [Playtester]
-//============================================================
-
-
-payon_in01.gat,5,134,4 script Inventor Jaax 89,{
- mes "[Inventor Jaax]";
- mes "My name is Jaax.";
- mes "Without ego, I can";
- mes "sat that I am perhaps the";
- mes "^996600greatest inventor of our time.^000000";
- next;
- mes "[Inventor Jaax]";
- mes "This time, I've";
- mes "created something";
- mes "truly extraordinary. I call them...";
- mes "^996600Magic Quivers^000000 !! This will be";
- mes "remembered in history as an";
- mes "arrow revolution!";
- next;
- mes "[Inventor Jaax]";
- mes "I've studied magic and quivers for";
- mes "years, working night and day until";
- mes "I finally figured out how to condense";
- mes "arrows with magic! With magic";
- mes "quivers, you'll be carrying more";
- mes "arrows, but with less weight!";
- next;
- mes "[Inventor Jaax]";
- mes "Would you like to try using one of";
- mes "my arrow quivers? I have no doubt";
- mes "that someone like you can";
- mes "appreciate my genius!";
- next;
-
- menu "Arrow Quiver",-,"Iron Arrow Quiver",Q2,"Steel Arrow Quiver",Q3,"Oridecon Arrow Quiver",Q4,"Fire Arrow Quiver",Q5,"Silver Arrow Quiver",Q6,"Wind Arrow Quiver",Q7,"Stone Arrow Quiver",Q8,"Crystal Arrow Quiver",Q9,"Shadow Arrow Quiver",Q10,"Immaterial Arrow Quiver",Q11,"Rusty Arrow Quiver",Q12,"Holy Arrow Quiver",Q13;
-
-// Arguments
-//===========
- callsub sF_Make, 1750,500,12004, "Arrow Quiver";
- goto M_Menu;
-Q2:
- callsub sF_Make, 1770,500,12005, "Iron Arrow Quiver";
- goto M_Menu;
-Q3:
- callsub sF_Make, 1753,500,12006, "Steel Arrow Quiver";
- goto M_Menu;
-Q4:
- callsub sF_Make, 1765,500,12007, "Oridecon Arrow Quiver";
- goto M_Menu;
-Q5:
- callsub sF_Make, 1752,500,12008, "Fire Arrow Quiver";
- goto M_Menu;
-Q6:
- callsub sF_Make, 1751,500,12009, "Silver Arrow Quiver";
- goto M_Menu;
-Q7:
- callsub sF_Make, 1755,500,12010, "Wind Arrow Quiver";
- goto M_Menu;
-Q8:
- callsub sF_Make, 1756,500,12011, "Stone Arrow Quiver";
- goto M_Menu;
-Q9:
- callsub sF_Make, 1754,500,12012, "Crystal Arrow Quiver";
- goto M_Menu;
-Q10:
- callsub sF_Make, 1767,500,12013, "Shadow Arrow Quiver";
- goto M_Menu;
-Q11:
- callsub sF_Make, 1757,500,12014, "Immaterial Arrow Quiver";
- goto M_Menu;
-Q12:
- callsub sF_Make, 1762,500,12015, "Rusty Arrow Quiver";
- goto M_Menu;
-Q13:
- callsub sF_Make, 1772,500,12183, "Holy Arrow Quiver";
- goto M_Menu;
-
-// Subfunction for making quivers
-//================================
-sF_Make:
- set @arrownum,500;
- if(countitem(getarg(0)) < @arrownum) goto L_NdArrows;
- if(Zeny < getarg(1)) goto L_NdZeny;
- mes "[Inventor Jaax]";
- mes "What do you want me to do?";
- next;
- menu "Give me as many as you can.",-, "I want to set the amount.",sM_0b, "Nevermind",M_End;
-
- set @amount,100;
- if(zeny/getarg(1) < @amount) set @amount, zeny/getarg(1);
- if(countitem(getarg(0))/@arrownum < @amount) set @amount, countitem(getarg(0))/@arrownum;
- if(@amount > 0) goto L_End;
- mes "[Inventor Jaax]";
- mes "Jeez... you don't even have the right items.....";
- close;
-
- sM_0b:
- input @amount;
- if(@amount<1 || @amount>100) goto L_BadAmnt;
- if(countitem(getarg(0))/@arrownum < @amount) goto L_NdArrows;
- if(Zeny < (getarg(1)*@amount)) goto L_NdZeny;
-
- L_End:
- set Zeny, Zeny - (getarg(1)*@amount);
- delitem getarg(0), (@amount*@arrownum);
- getitem getarg(2), @amount;
- mes "[Inventor Jaax]";
- mes "There you go~!";
- mes "Here are your " +getarg(3)+ ".";
- close;
-
- L_NdArrows:
- mes "[Inventor Jaax]";
- mes "Sorry, but you need 500 Arrows and 500 Zeny to make 1 Arrow Quiver.";
- close;
-
- L_NdZeny:
- mes "[Inventor Jaax]";
- mes "You don't have enough zeny for that many.";
- close;
-
- L_BadAmnt:
- mes "[Inventor Jaax]";
- mes "Please choose a number between 1 and 100.";
- close;
-
-L_Come:
- mes "[Inventor Jaax]";
- mes "Please, come again whenever you want too.";
- close;
-M_End:
- mes "[Inventor Jaax]";
- mes "Sure, no problem.";
- mes "Come back any time.";
- close;
+//===== eAthena Script ========================================
+//= Arrow Quiver Event
+//===== By: ==================================================
+//= Muad_Dib (Prometheus Project)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Turns arrows into Arrow Quivers.
+//===== Additional Comments: =================================
+//= 07/06/05 : Added 1st Version. [Muad_Dib]
+//= Converted to eAthena format by Dr.Evil
+//= added prize to quest - 500 Zeny
+//= Fixed a few spelling errors. [Nexon]
+//= 1.1 Added Holy Arrow Quivers [Playtester]
+//============================================================
+
+
+payon_in01.gat,5,134,4 script Inventor Jaax 89,{
+ mes "[Inventor Jaax]";
+ mes "My name is Jaax.";
+ mes "Without ego, I can";
+ mes "sat that I am perhaps the";
+ mes "^996600greatest inventor of our time.^000000";
+ next;
+ mes "[Inventor Jaax]";
+ mes "This time, I've";
+ mes "created something";
+ mes "truly extraordinary. I call them...";
+ mes "^996600Magic Quivers^000000 !! This will be";
+ mes "remembered in history as an";
+ mes "arrow revolution!";
+ next;
+ mes "[Inventor Jaax]";
+ mes "I've studied magic and quivers for";
+ mes "years, working night and day until";
+ mes "I finally figured out how to condense";
+ mes "arrows with magic! With magic";
+ mes "quivers, you'll be carrying more";
+ mes "arrows, but with less weight!";
+ next;
+ mes "[Inventor Jaax]";
+ mes "Would you like to try using one of";
+ mes "my arrow quivers? I have no doubt";
+ mes "that someone like you can";
+ mes "appreciate my genius!";
+ next;
+
+ menu "Arrow Quiver",-,"Iron Arrow Quiver",Q2,"Steel Arrow Quiver",Q3,"Oridecon Arrow Quiver",Q4,"Fire Arrow Quiver",Q5,"Silver Arrow Quiver",Q6,"Wind Arrow Quiver",Q7,"Stone Arrow Quiver",Q8,"Crystal Arrow Quiver",Q9,"Shadow Arrow Quiver",Q10,"Immaterial Arrow Quiver",Q11,"Rusty Arrow Quiver",Q12,"Holy Arrow Quiver",Q13;
+
+// Arguments
+//===========
+ callsub sF_Make, 1750,500,12004, "Arrow Quiver";
+ goto M_Menu;
+Q2:
+ callsub sF_Make, 1770,500,12005, "Iron Arrow Quiver";
+ goto M_Menu;
+Q3:
+ callsub sF_Make, 1753,500,12006, "Steel Arrow Quiver";
+ goto M_Menu;
+Q4:
+ callsub sF_Make, 1765,500,12007, "Oridecon Arrow Quiver";
+ goto M_Menu;
+Q5:
+ callsub sF_Make, 1752,500,12008, "Fire Arrow Quiver";
+ goto M_Menu;
+Q6:
+ callsub sF_Make, 1751,500,12009, "Silver Arrow Quiver";
+ goto M_Menu;
+Q7:
+ callsub sF_Make, 1755,500,12010, "Wind Arrow Quiver";
+ goto M_Menu;
+Q8:
+ callsub sF_Make, 1756,500,12011, "Stone Arrow Quiver";
+ goto M_Menu;
+Q9:
+ callsub sF_Make, 1754,500,12012, "Crystal Arrow Quiver";
+ goto M_Menu;
+Q10:
+ callsub sF_Make, 1767,500,12013, "Shadow Arrow Quiver";
+ goto M_Menu;
+Q11:
+ callsub sF_Make, 1757,500,12014, "Immaterial Arrow Quiver";
+ goto M_Menu;
+Q12:
+ callsub sF_Make, 1762,500,12015, "Rusty Arrow Quiver";
+ goto M_Menu;
+Q13:
+ callsub sF_Make, 1772,500,12183, "Holy Arrow Quiver";
+ goto M_Menu;
+
+// Subfunction for making quivers
+//================================
+sF_Make:
+ set @arrownum,500;
+ if(countitem(getarg(0)) < @arrownum) goto L_NdArrows;
+ if(Zeny < getarg(1)) goto L_NdZeny;
+ mes "[Inventor Jaax]";
+ mes "What do you want me to do?";
+ next;
+ menu "Give me as many as you can.",-, "I want to set the amount.",sM_0b, "Nevermind",M_End;
+
+ set @amount,100;
+ if(zeny/getarg(1) < @amount) set @amount, zeny/getarg(1);
+ if(countitem(getarg(0))/@arrownum < @amount) set @amount, countitem(getarg(0))/@arrownum;
+ if(@amount > 0) goto L_End;
+ mes "[Inventor Jaax]";
+ mes "Jeez... you don't even have the right items.....";
+ close;
+
+ sM_0b:
+ input @amount;
+ if(@amount<1 || @amount>100) goto L_BadAmnt;
+ if(countitem(getarg(0))/@arrownum < @amount) goto L_NdArrows;
+ if(Zeny < (getarg(1)*@amount)) goto L_NdZeny;
+
+ L_End:
+ set Zeny, Zeny - (getarg(1)*@amount);
+ delitem getarg(0), (@amount*@arrownum);
+ getitem getarg(2), @amount;
+ mes "[Inventor Jaax]";
+ mes "There you go~!";
+ mes "Here are your " +getarg(3)+ ".";
+ close;
+
+ L_NdArrows:
+ mes "[Inventor Jaax]";
+ mes "Sorry, but you need 500 Arrows and 500 Zeny to make 1 Arrow Quiver.";
+ close;
+
+ L_NdZeny:
+ mes "[Inventor Jaax]";
+ mes "You don't have enough zeny for that many.";
+ close;
+
+ L_BadAmnt:
+ mes "[Inventor Jaax]";
+ mes "Please choose a number between 1 and 100.";
+ close;
+
+L_Come:
+ mes "[Inventor Jaax]";
+ mes "Please, come again whenever you want too.";
+ close;
+M_End:
+ mes "[Inventor Jaax]";
+ mes "Sure, no problem.";
+ mes "Come back any time.";
+ close;
} \ No newline at end of file
diff --git a/npc/merchants/refine.txt b/npc/merchants/refine.txt
index 1ea743dc3..bb15ccb4e 100644
--- a/npc/merchants/refine.txt
+++ b/npc/merchants/refine.txt
@@ -1,821 +1,821 @@
-//===== Freya Script =========================================
-//= Refining NPCs
-//===== By: ==================================================
-//= Syrus22 (1.1) dafide18 (1.4) Skotlex (1.5)
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= Any Freya Version
-//===== Description: =========================================
-//= Refining NPCs and Metal Salesmen.
-//===== Additional Comments: =================================
-//= 1.0 - by A bunch of people!
-//= Syrus22 - Completely redid the script using functions... also
-//= added the option for auto safe refining and multiple refining.
-//= 1.1 - Negative input bug fixed [Lupus]
-//= 1.2 - Added additional reparimen in morroc and payon. Added
-//= Christopher the blacksmith in Geffen. Edited some dialogue [kobra_k88]
-//= 1.3 - New Payon Locations [Darkchild]
-//= Corrected zeny subtraction thx to jpnmania77.[kobra_k88]
-//= 1.3a - Temporary corrected an exploit. Need to check sources
-//= to fully fix bug [Shinigami]
-//= Fixed repairman prices [shadowlady]
-//= Fixed bug that skips requirements thanks to sir_loon [massdriller]
-//= Fixed itemid error thanks to -Vitamin- [massdriller]
-//= 1.4 - check again item in refining procedure to avoid
-//= hacker that can change item [dafide18]
-//= 1.5 - Fixed crashing due to badly used callfunc's [Skotlex]
-// Lupus, don't rollback this important fix again! >.<
-//= 1.5a - Corrected an unneeded callfunc, fixed the anti-bot
-//= exploit ruining the safe refine loop. [Skotlex]
-//= 1.5b - Fixed Spelling mistakes. [Nexon]
-//= 1.6 - Replaced all breaks for ends as per the new script engine [Skotlex]
-//= 1.7 - Added Einbroch Refiners (Custom names ^^;) and a duplicated BS Shop. [Poki#3]
-//= 1.8 - Added Lighthalzen Refiners (Custom names again ^^;) [Poki#3]
-//= 1.8a - Fixed wrong indication thanks to NeoSaro [Lupus]
-//= 1.9 - Rewrote repairman, removed the Steel from repair cost [DracoRPG]
-//= 2.0 - Fixed missed equppment presence check. Thx2 Coltaro [Lupus]
-//= 2.0a - Added weight checks thanks to Neouni [Playtester]
-//= 2.0b - Fixed the names of Lighthalzen and Einbroch refiners thanks to Maud_Dib [Kargha]
-//= 2.1 - Removed Duplicates [Silent]
-//============================================================
-
-
-//=========================================================
-// Christopher: Geffen Blacksmith
-//=========================================================
-geffen_in.gat,110,172,2 script Christopher#1::Chris 63,{
- mes "[Christopher Guillenrow]";
- mes "Welcome to Christopher's Workshop. Ye can find all yer forging equipment here. So what can I help ye with?";
- M_Menu:
- next;
- menu "Purchase Anvil",M_0, "Purchase Forging Item",M_1, "Purchase Metal",M_2, "Purify Rough Ores",M_3, "Cancel",M_End;
-
- M_0:
- mes "[Christopher Guillenrow]";
- mes "Higher quality Anvils gives ye a better chance ta make better weapons, ye know. But they cost more than yer typical ones.";
- next;
- menu "Anvil - 30000z.",sM_Anvil, "Oridecon Anvil - 120000z.",sM_OriAnvil, "Golden Anvil - 300000z.",sM_GolAnvil,
- "Better Anvil than others",sM_BetAnvil, "Cancel",M_Menu;
-
- sM_Anvil:
- if(Zeny < 30000) goto L_NoZeny;
- if(checkweight(986,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 30000;
- getitem 986,1;
- mes "[Christopher Guillenrow]";
- mes "This is the cheapest one but it's very efficient.";
- next;
- goto L_Thanks;
- sM_OriAnvil:
- if(Zeny < 120000) goto L_NoZeny;
- if(checkweight(987,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 120000;
- getitem 987,1;
- mes "[Christopher Guillenrow]";
- mes "Ah! Ye have a good eye for anvils. This here is the proper anvil for a Blacksmith.";
- next;
- goto L_Thanks;
- sM_GolAnvil:
- if(Zeny < 300000) goto L_NoZeny;
- if(checkweight(988,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 300000;
- mes "[Christopher Guillenrow]";
- mes "This is the best anvil in my workshop! With this ye'll be the best Blasksmith in no time.";
- getitem 988,1;
- next;
- goto L_Thanks;
- sM_BetAnvil:
- mes "[Christopher Guillenrow]";
- mes "I'm sorry but I don't have anything better than a Golden Anvil.";
- mes "Maybe 'Ringgel' the legendary Anvil maker would have one... but he be a hard fellow ta find.";
- close;
-
- M_1:
- mes "[Christopher Guillenrow]";
- mes "A respectable Blacksmith uses fine tools. Ye will come ta know my tools as being the finest around!";
- mes "Choose anything you want.";
- sM_Menu1:
- next;
- menu "Mini-Furnace - 150z.",sM_Furn, "Iron Hammer - 1000z.",sM_IrHam, "Golden Hammer - 3000z.",sM_GldHam,
- "Oridecon Hammer - 5000z.",sM_OriHam, "Cancel",M_Menu;
-
- sM_Furn:
- mes "[Christopher Guillenrow]";
- mes "This is a prerequisite for Metal refining!!";
- mes "So, how many do ye wish to buy? If you want to quit, please input the number '0'. However, you the maximum amount you can buy is 1000";
- set @input, 0;
- input @input;
- next;
- if(@input < 1 ) goto sM_Menu1;
- if(@input > 1000 ) goto sM_Max;
- if(Zeny < 150 * @input) goto L_NoZeny;
- if(checkweight(612,@input) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - (150 * @input);
- getitem 612, @input;
- goto L_Thanks;
- sM_IrHam:
- if(Zeny < 1000) goto L_NoZeny;
- if(checkweight(613,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 1000;
- getitem 613,1;
- goto L_Thanks;
- sM_GldHam:
- if(Zeny < 3000) goto L_NoZeny;
- if(checkweight(614,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 3000;
- getitem 614,1;
- goto L_Thanks;
- sM_OriHam:
- if(Zeny < 5000) goto L_NoZeny;
- if(checkweight(615,1) == 0 ) goto L_OverWeight;
- set Zeny, Zeny - 5000;
- getitem 615,1;
- goto L_Thanks;
- sM_Max:
- mes "[Christopher Guillenrow]";
- mes "Sorry, you can't buy more than 1000 furnace at a time.";
- close;
-
- M_2:
- mes "[Christopher Guillenrow]";
- mes "I have 2 kinds of metals for sale. Which do ye like?";
- set @chris, 1;
- set @name$, "Christopher Guillenrow";
- callfunc "phramain";
-
- M_3:
- mes "[Christopher Guillenrow]";
- mes "I can purify yer rough Oridecon and rough Elunium ores. I'll need 5 rough ores to make 1 pure one.";
- mes "Well... which one do ye want ta make?";
- set @chris, 1;
- set @name$, "Christopher Guillenrow";
- callfunc "orimain";
-
- M_End:
- close;
-
- L_NoZeny:
- mes "[Christopher Guillenrow]";
- mes "I don't think I can let ye have this at a lower price. I can't afford ta loose profits because of ye.";
- emotion 4;
- close;
-
- L_OverWeight:
- mes "[Christopher Guillenrow]";
- mes "You don't seem to have enough strength to carry this.";
- close;
-
- L_Thanks:
- mes "[Christopher Guillenrow]";
- mes "Thank you for shopping at my workshop. Feel free to come anytime whenever you need.";
- emotion 15;
- close;
-}
-
-ein_in01,38,29,6 duplicate(Chris) Christopher#2 63
-
-//=====================================================================================
-// Weapon/Armor Refiners
-//=====================================================================================
-prt_in.gat,63,60,4 script Hollengrhen 85,{
- set @name$,"Hollengrhen";
- callfunc "refinemain";
- end;
-}
-morocc_in.gat,73,38,4 script Aragham 99,{
- set @name$,"Aragham";
- callfunc "refinemain";
- end;
-}
-payon.gat,144,173,4 script Antonio 88,{
- set @name$,"Antonio";
- callfunc "refinemain";
- end;
-}
-alberta_in.gat,28,58,4 script Fredrik 85,{
- set @name$,"Fredrik";
- callfunc "refinemain";
- end;
-}
-yuno_in01.gat,164,26,6 script Disturb 88,{
- set @name$,"Disturb";
- callfunc "refinemain";
- end;
-}
-ein_in01.gat,24,87,6 script Manthasman 826,{
- set @name$,"Manthasman Pruhag";
- callfunc "refinemain";
- end;
-}
-lhz_in02.gat,282,20,7 script Fulerr 869,{
- set @name$,"Fulerr";
- callfunc "refinemain";
- end;
-}
-
-//============================================================
-//= Main Refiner Function
-//============================================================
-//= To allow auto safe refining/multiple refining set the
-//= @features variable to 1
-//============================================================
-function script refinemain {
- set @features,0;
-
- mes "[" + @name$ + "]";
- mes "I am the Armsmith... I can refine any weapon or piece of armor you choose!";
- mes "Which piece of equipment do you want to refine?";
- M_Menu:
- next;
- menu getequipname(1),PART1,getequipname(2),PART2,getequipname(3),PART3,getequipname(4),PART4,getequipname(5),PART5,
- getequipname(6),PART6,getequipname(7),PART7,getequipname(8),PART8,getequipname(9),PART9,getequipname(10),PART10;
-
- //Head Gear
- PART1:
- set @part,1;
- if (getequipisequiped(1)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "Do you want me to refine your dumb brain?";
- emotion 6;
- goto M_Menu;
- //Armor
- PART2:
- set @part,2;
- if (getequipisequiped(2)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "Do you want me to melt your body with blazing heat...?";
- emotion 6;
- goto M_Menu;
- //Left Hand
- PART3:
- set @part,3;
- if (getequipisequiped(3)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "I can't make your left hand into an ultimate weapon...";
- emotion 4;
- goto M_Menu;
- //Right Hand
- PART4:
- set @part,4;
- if (getequipisequiped(4)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "I can't make your right hand into an ultimate weapon...";
- emotion 4;
- goto M_Menu;
- //Garment
- PART5:
- set @part,5;
- if (getequipisequiped(5)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "Look here... you don't have any Garments on...";
- goto M_Menu;
- //Foot Gear
- PART6:
- set @part,6;
- if (getequipisequiped(6)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "Ack!! Those are some stinky feet. I definitely can't refine those... uck!!";
- emotion 16;
- goto M_Menu;
- //Accessory1
- PART7:
- set @part,7;
- if (getequipisequiped(7)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "What do you mean by Accessory? Which One?";
- emotion 20;
- goto M_Menu;
- //Accessory2
- PART8:
- set @part,8;
- if (getequipisequiped(8)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "What do you mean by Accessory? Which One?";
- emotion 20;
- goto M_Menu;
- PART9:
- set @part,9;
- if (getequipisequiped(9)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "What do you want from me? There's nothing equipped there...";
- emotion 20;
- goto M_Menu;
- PART10:
- set @part,10;
- if (getequipisequiped(10)) goto CHECK1;
- mes "[" + @name$ + "]";
- mes "What do you want from me? There's nothing equipped there...";
- emotion 20;
- goto M_Menu;
-
-//Check if the item is refinable...
-CHECK1:
- if(getequipisenableref(@part)) goto CHECK2;
- mes "[" + @name$ + "]";
- mes "I can't work on this item...";
- close;
-
-//Check if the item is identified... (Don't know why this is in here... but kept it anyway)
-CHECK2:
- if(getequipisidentify(@part)) goto CHECK3;
- mes "[" + @name$ + "]";
- mes "You must appraise this item first.";
- close;
-
-//Check to see if the items is already +10
-CHECK3:
- if(getequiprefinerycnt(@part) < 10) goto REFINE0;
- mes "[" + @name$ + "]";
- mes "This weapon is already at its maximum level and can no longer be refined.";
- close;
-
-//Refine Armor
-REFINE0:
- set @refineitemid, getequipid(@part); // save id of the item
- set @refinerycnt, getequiprefinerycnt(@part); //save refinery count
- if(getequipweaponlv(@part) > 0) goto REFINE1;
- set @matname$,"Elunium";
- set @material,985;
- set @price,2000;
- set @safe,4;
- if(@features == 1) goto L_refinefeatures;
- goto L_refinenormal;
-//Refine Level 1 Weapon
-REFINE1:
- if(getequipweaponlv(@part) > 1) goto REFINE2;
- set @matname$,"Phracon";
- set @material,1010;
- set @price,50;
- set @safe,7;
- if(@features == 1) goto L_refinefeatures;
- goto L_refinenormal;
-//Refine Level 2 Weapon
-REFINE2:
- if(getequipweaponlv(@part) > 2) goto REFINE3;
- set @matname$,"Emveretarcon";
- set @material,1011;
- set @price,200;
- set @safe,6;
- if(@features == 1) goto L_refinefeatures;
- goto L_refinenormal;
-//Refine Level 3 Weapon
-REFINE3:
- if(getequipweaponlv(@part) > 3) goto REFINE4;
- set @matname$,"Oridecon";
- set @material,984;
- set @price,5000;
- set @safe,5;
- if(@features == 1) goto L_refinefeatures;
- goto L_refinenormal;
-//Refine Level 4 Weapon
-REFINE4:
- set @matname$,"Oridecon";
- set @material,984;
- set @price,20000;
- set @safe,4;
- if(@features == 1) goto L_refinefeatures;
- goto L_refinenormal;
-
-L_refinenormal:
- mes "[" + @name$ + "]";
- mes "To refine this stuff, I need ^ff9999" + @matname$ + "^000000 and the fee " + @price + " Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",Lcancel;
-
- if (getequippercentrefinery(@part) == 100) goto L_Sub;
- mes "[" + @name$ + "]";
- mes "Hmm... Hold on! This piece of equipment has already been refined to its maximum safety level.";
- mes "I must warn you if it is refined ANYMORE, It could be DESTROYED and become USELESS!!";
- next;
- mes "["+@name$+"]";
- mes "Do you still wish you refine it? If so I will not be able to guarantee my work...";
- next;
- menu "Yes",-,"No",Lcancel1;
-
- L_Sub:
- if ((countitem(@material) < 1) || (Zeny < @price)) goto Lcancel2;
- set Zeny,Zeny-@price;
- delitem @material,1;
-
-Lrefine:
- if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (not changed, why?)
- if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
- if (getequiprefinerycnt(@part) != @refinerycnt) goto LNoFake; // hacker has changed the item
- if (getequippercentrefinery(@part) <= rand(100)) goto Lfail;
- mes "["+@name$+"]";
- mes "Clang! Clang! Clang!";
- successrefitem @part;
- next;
- mes "["+@name$+"]";
- mes "HAHA! It seems my skills haven't gotten rusty yet! Splendid... just splendid...";
- emotion 21;
- close;
-
-Lfail:
- mes "[" + @name$ + "]";
- mes "Clang! Clang! Clang!";
- failedrefitem @part;
- next;
- mes "["+@name$+"]";
- mes "Aaahhh!! Oh no...!!";
- emotion 16;
- next;
- mes "["+@name$+"]";
- mes "Eh..Ehem... I'm sorry but the refining process ^ff0000failed^000000.";
- next;
- mes "["+@name$+"]";
- mes "I am deeply ashamed of what I've done... but I DID warn you earlier about the risks.";
- close;
-
-LNoItem:
- mes "[" + @name$ + "]";
- mes "Look here... you don't have any Items on...";
- close;
-
-LNoFake:
- mes "[" + @name$ + "]";
- mes "Clan... No, but Did you imagine I could be so stupid !?!";
- mes "You have changed it...";
- mes "Go out before I stun you with my Hammer!!!";
- close;
-
-Lcancel:
- mes "[" + @name$ + "]";
- mes "You said so..Hmm so be it...";
- close;
-
-Lcancel1:
- mes "[" + @name$ + "]";
- mes "Good Choice.";
- mes "Ah... good choice. I'd feel awful if I'd destroyed another persons piece of equipment with my own hands.";
- close;
-
-Lcancel2:
- mes "[" + @name$ + "]";
- mes "Is that all you got? Unfortunately I can't work for you at a lower price. Try putting yourself in my shoes.";
- close;
-
-// New Refining Functions ========================
-L_refinefeatures:
- if(getequiprefinerycnt(@part) >= @safe) goto Lnosafe;
- mes "[" + @name$ + "]";
- mes "I can refine this to the safe limit or a desired number of times... it's your choice...";
- next;
- menu "To the safe limit please.",Lsafe,"I'll decide how many times.",Lnosafe,"I've changed my mind...",Lcancel;
-
-Lsafe:
- set @refinecnt,@safe - getequiprefinerycnt(@part);
- set @fullprice,@price * @refinecnt;
- mes "[" + @name$ + "]";
- mes "That will cost you " + @refinecnt + " " + @matname$ + " and " + @fullprice + " Zeny. Is that ok?";
- next;
- menu "Yes",-,"No...",Lcancel;
- if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
- set Zeny,Zeny - @fullprice;
- delitem @material,@refinecnt;
- goto L_refinesafe;
-
-Lnosafe:
- mes "[" + @name$ + "]";
- mes "So how many times would you like me to refine your item?";
- next;
- input @refinecnt;
- if (@refinecnt<1) goto Lcancel3; //fixed by Lupus
- set @refinecheck,@refinecnt + getequiprefinerycnt(@part);
- if(@refinecheck > 10) goto Lcancel3;
- set @fullprice,@price * @refinecnt;
- mes "[" + @name$ + "]";
- mes "This will cost you " + @refinecnt + " " + @matname$ + " and " + @fullprice + " Zeny... Is that ok?";
- next;
- menu "Yes...",-,"No...",Lcancel;
- if(@refinecheck > @safe) goto Lwarn;
- if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
- set Zeny,Zeny - @fullprice;
- delitem @material,@refinecnt;
- goto L_refinenumber;
- end;
-
- Lwarn:
- set @refinecheck,@refinecheck - @safe;
- mes "[" + @name$ + "]";
- mes "This will try to refine the equipment " + @refinecheck + " times past the safe limit. Your equipment may be destroyed... is that ok?";
- next;
- menu "Yes",-,"No...",Lcancel1;
- if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
- set Zeny,Zeny - @fullprice;
- delitem @material,@refinecnt;
- goto L_refinenumber;
-
-Lcancel3:
- mes "[" + @name$ + "]";
- mes "I can't refine this item that many times.";
- close;
-
-// SubFunction: Safe Refine ---------------------
-L_refinesafe:
- if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (no changed, why?)
- if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
- if (getequippercentrefinery(@part) < 100) goto LNoFake; // hacker has changed the item (it is not safe anymore)
- mes "Clang, clang!!!";
- successrefitem @part;
- emotion 21;
- set @refinecnt,@refinecnt - 1;
- next;
- if(@refinecnt == 0) goto Lend;
- goto L_refinesafe;
-
- Lend:
- mes "[" + @name$ + "]";
- mes "All finished... Come again soon.";
- close;
-
-// SubFunction: Refine
-L_refinenumber:
- if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (no changed, why?)
- if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
- mes "Clang, clang!!!";
- if (getequippercentrefinery(@part)<=rand(100)) goto Lfail_number;
- successrefitem @part;
- emotion 21;
- set @refinecnt,@refinecnt - 1;
- next;
- if(@refinecnt == 0) goto Lend;
- goto L_refinenumber;
-
- Lfail_number:
- failedrefitem @part;
- emotion 23;
- mes "[" + @name$ + "]";
- mes "WAHHHH!!! I'm so sorry... I warned you this could happen...";
- set @refinecnt,@refinecnt - 1;
- if(@refinecnt == 0) goto Lend2;
- mes "Here's the unused Zeny and Material back...";
- getitem @material,@refinecnt;
- set @fullprice,@refinecnt * @price;
- set Zeny,Zeny + @fullprice;
-
- Lend2:
- close;
-}
-
-
-
-//==============================================================================
-// Material Salesmen
-//==============================================================================
-prt_in.gat,56,69,4 script Vurewell 86,{
- set @name$,"Vurewell";
- callfunc "phramain";
- end;
-}
-payon.gat,145,178,4 script Begnahd 88,{
- set @name$,"Begnahd";
- callfunc "phramain";
- end;
-}
-morocc_in.gat,65,37,4 script Sade 99,{
- set @name$,"Sade";
- callfunc "phramain";
- end;
-}
-alberta_in.gat,18,59,5 script Kahlamanlith 86,{
- set @name$,"Kahlamanlith";
- callfunc "phramain";
- end;
-}
-yuno_in01.gat,171,26,6 script Dillemat 88,{
- set @name$,"Dillemat";
- callfunc "phramain";
- end;
-}
-ein_in01.gat,15,87,7 script Tirehaus 86,{
- set @name$,"Tirehaus";
- callfunc "phramain";
- end;
-}
-lhz_in02.gat,278,24,3 script Krugg 86,{
- set @name$,"Krugg";
- callfunc "phramain";
- end;
-}
-
-//============================================================
-//= Material Salesmen Functions
-//============================================================
-function script phramain {
- if(@chris == 1) goto M_Menu;
- mes "[" + @name$ + "]";
- mes "Hello, Im selling metals I just mined.";
- mes "They are Pharacon and Emvertacon.";
- mes "Would you like to buy some?";
- M_Menu:
- set @chris, 0;
- next;
- menu"Pharacon - 200z",PHARA,"Emvertacon - 1000z",EMVER;
-
- PHARA:
- set @itemid,1010;
- set @value,200;
- goto CONTINUE;
-
- EMVER:
- set @itemid,1011;
- set @value,1000;
-
-CONTINUE:
- mes "[" + @name$ + "]";
- mes "How many would you like?";
- next;
- input @ammount;
- if (@ammount <= 0) goto L_BELOW;
- if (@ammount > 999) goto L_ABOVE;
- if (zeny < @value * @ammount) goto L_NOZENY;
- if (checkweight(@itemid,@ammount) == 0) goto L_WEIGHT;
- set Zeny,Zeny-@value*@ammount;
- getitem @itemid,@ammount;
- mes "[" + @name$ + "]";
- mes "Here you go.";
- close;
-
-L_NOZENY:
- mes "You do not have enough zeny!";
- close;
-L_WEIGHT:
- mes "You cant hold that many of that item";
- close;
-L_BELOW:
- mes "You have to buy a POSITIVE amount of items!";
- close;
-L_ABOVE:
- mes "You cant buy this much of this item!";
- close;
-}
-
-
-
-//==============================================================================
-// Ori/Elu Refiners
-//==============================================================================
-prt_in.gat,63,69,4 script Dietrich 84,{
- set @name$,"Dietrich";
- callfunc "orimain";
- end;
-}
-payon.gat,137,178,4 script Hakhim 88,{
- set @name$,"Hakhim";
- callfunc "orimain";
- end;
-}
-morocc_in.gat,72,32,4 script Abdul 99,{
- set @name$,"Abdul";
- callfunc "orimain";
- end;
-}
-alberta_in.gat,21,63,5 script Xenophon 84,{
- set @name$,"Xenophon";
- callfunc "orimain";
- end;
-}
-yuno_in01.gat,171,22,6 script Delayt 88,{
- set @name$,"Delayt";
- callfunc "orimain";
- end;
-}
-ein_in01.gat,18,82,6 script Matestein 84,{
- set @name$,"Matestein";
- callfunc "orimain";
- end;
-}
-lhz_in02.gat,281,24,5 script Fruel 84,{
- set @name$,"Fruel";
- callfunc "orimain";
- end;
-}
-
-//============================================================
-//= Ori/Elu Functions
-//============================================================
-function script orimain {
- if(@chris == 1) goto M_Menu;
- mes "[" + @name$ + "]";
- mes "If you bring Rough Oridecons and";
- mes "Rough Eluniums to me,";
- mes "I can refine them for you.";
- mes "However, you must bring 5 of each.";
- M_Menu:
- set @chris, 0;
- next;
- menu "Make Oridecon",M_Ori, "Make Elunium",M_Elu, "Ask about enchanted stones",M_Stones;
-
- M_Ori:
- if(countitem(756) < 5) goto L_NoOri;
- delitem 756,5;
- getitem 984,1;
- mes "[" + @name$ + "]";
- mes "As promised, here's your oridecon.";
- mes "Come back again anytime.";
- close;
-
- L_NoOri:
- mes "[" + @name$ + "]";
- mes "Huh? You're kidding, right? Didn't I say I can't make you an Oridecon unless you bring me 5 rough ones?";
- close;
- M_Elu:
- if(countitem(757) < 5) goto L_NoElu;
- delitem 757,5;
- getitem 985,1;
- mes "[" + @name$ + "]";
- mes "As promised, here's your elunium.";
- mes "Come back again anytime.";
- close;
-
- L_NoElu:
- mes "[" + @name$ + "]";
- mes "Huh? You're kidding, right? Didn't I say I can't make you an Elunium unless you bring me 5 rough ones?";
- close;
- M_Stones:
- mes "[" + @name$ + "]";
- mes "Enchanted stones, huh...";
- next;
- mes "[" + @name$ + "]";
- mes "Well, in the 20 years that I've been a stone smith I've heard of them many times... though I've never actually seen them before.";
- next;
- mes "[" + @name$ + "]";
- mes "I've been told that enchanted stones possess different elemental properties such as ^5533FFWater, Earth, Fire, and Wind^000000.";
- next;
- mes "[" + @name$ + "]";
- mes "If someone combines an Enchanted Stone with a weapon during the refining process, that weapon will possess the same property as the stone.";
- next;
- mes "[" + @name$ + "]";
- mes "Of course, that person needs to be skillful enough to work on it.";
- goto M_Menu;
-}
-
-
-
-//=====================================================================================
-// Equipment Repairmen
-//=====================================================================================
-prt_in.gat,62,54,2 script Grendal 84,{
- set @name$,"Grendal";
- callfunc "repairmain";
- end;
-}
-//Temp Spot, Not Sure Where To place
-payon.gat,149,182,2 script Repairman#01 88,{
- set @name$,"Repairman";
- callfunc "repairmain";
- end;
-}
-morocc_in.gat,71,40,2 script Repairman#02 99,{
- set @name$,"Repairman";
- callfunc "repairmain";
- end;
-}
-lhz_in02.gat,284,14,3 script Repairman#03 86,{
- set @name$,"Repairman";
- callfunc "repairmain";
- end;
-}
-
-//============================================================
-//= Equipment Repair Function
-//============================================================
-function script repairmain {
- set @repairprice,5000;
- mes "[" + @name$ + "]";
- mes "I am the Repair Smith and I can repair any Arms you want.";
- mes "Tell me which Equipment you want to repair.";
- next;
- if(getbrokenid(1)==NULL) {
- mes "[" + @name$ + "]";
- mes "Looks like you don't need anything repaired today...";
- close;
- }
- set @choice,select(getitemname(getbrokenid(1)),getitemname(getbrokenid(2)),
- getitemname(getbrokenid(3)),getitemname(getbrokenid(4)),getitemname(getbrokenid(5)),
- getitemname(getbrokenid(6)),getitemname(getbrokenid(7)),getitemname(getbrokenid(8)),
- getitemname(getbrokenid(9)),getitemname(getbrokenid(10)));
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(getbrokenid(@choice)) + ".";
- mes "To repair this, I need " + @repairprice + " Zeny.";
- mes "Continue?";
- next;
- if(select("Yes","No") == 2) {
- mes "[" + @name$ + "]";
- mes "Ok, but don't expect to be using that...";
- close;
- }
- if (Zeny < @repairprice) {
- mes "[" + @name$ + "]";
- mes "Is it all you got?";
- mes "Unfortunately, I have kids to feed...";
- close;
- }
- set Zeny,Zeny-@repairprice;
- repair(@choice);
- close;
-
-}
+//===== Freya Script =========================================
+//= Refining NPCs
+//===== By: ==================================================
+//= Syrus22 (1.1) dafide18 (1.4) Skotlex (1.5)
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= Any Freya Version
+//===== Description: =========================================
+//= Refining NPCs and Metal Salesmen.
+//===== Additional Comments: =================================
+//= 1.0 - by A bunch of people!
+//= Syrus22 - Completely redid the script using functions... also
+//= added the option for auto safe refining and multiple refining.
+//= 1.1 - Negative input bug fixed [Lupus]
+//= 1.2 - Added additional reparimen in morroc and payon. Added
+//= Christopher the blacksmith in Geffen. Edited some dialogue [kobra_k88]
+//= 1.3 - New Payon Locations [Darkchild]
+//= Corrected zeny subtraction thx to jpnmania77.[kobra_k88]
+//= 1.3a - Temporary corrected an exploit. Need to check sources
+//= to fully fix bug [Shinigami]
+//= Fixed repairman prices [shadowlady]
+//= Fixed bug that skips requirements thanks to sir_loon [massdriller]
+//= Fixed itemid error thanks to -Vitamin- [massdriller]
+//= 1.4 - check again item in refining procedure to avoid
+//= hacker that can change item [dafide18]
+//= 1.5 - Fixed crashing due to badly used callfunc's [Skotlex]
+// Lupus, don't rollback this important fix again! >.<
+//= 1.5a - Corrected an unneeded callfunc, fixed the anti-bot
+//= exploit ruining the safe refine loop. [Skotlex]
+//= 1.5b - Fixed Spelling mistakes. [Nexon]
+//= 1.6 - Replaced all breaks for ends as per the new script engine [Skotlex]
+//= 1.7 - Added Einbroch Refiners (Custom names ^^;) and a duplicated BS Shop. [Poki#3]
+//= 1.8 - Added Lighthalzen Refiners (Custom names again ^^;) [Poki#3]
+//= 1.8a - Fixed wrong indication thanks to NeoSaro [Lupus]
+//= 1.9 - Rewrote repairman, removed the Steel from repair cost [DracoRPG]
+//= 2.0 - Fixed missed equppment presence check. Thx2 Coltaro [Lupus]
+//= 2.0a - Added weight checks thanks to Neouni [Playtester]
+//= 2.0b - Fixed the names of Lighthalzen and Einbroch refiners thanks to Maud_Dib [Kargha]
+//= 2.1 - Removed Duplicates [Silent]
+//============================================================
+
+
+//=========================================================
+// Christopher: Geffen Blacksmith
+//=========================================================
+geffen_in.gat,110,172,2 script Christopher#1::Chris 63,{
+ mes "[Christopher Guillenrow]";
+ mes "Welcome to Christopher's Workshop. Ye can find all yer forging equipment here. So what can I help ye with?";
+ M_Menu:
+ next;
+ menu "Purchase Anvil",M_0, "Purchase Forging Item",M_1, "Purchase Metal",M_2, "Purify Rough Ores",M_3, "Cancel",M_End;
+
+ M_0:
+ mes "[Christopher Guillenrow]";
+ mes "Higher quality Anvils gives ye a better chance ta make better weapons, ye know. But they cost more than yer typical ones.";
+ next;
+ menu "Anvil - 30000z.",sM_Anvil, "Oridecon Anvil - 120000z.",sM_OriAnvil, "Golden Anvil - 300000z.",sM_GolAnvil,
+ "Better Anvil than others",sM_BetAnvil, "Cancel",M_Menu;
+
+ sM_Anvil:
+ if(Zeny < 30000) goto L_NoZeny;
+ if(checkweight(986,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 30000;
+ getitem 986,1;
+ mes "[Christopher Guillenrow]";
+ mes "This is the cheapest one but it's very efficient.";
+ next;
+ goto L_Thanks;
+ sM_OriAnvil:
+ if(Zeny < 120000) goto L_NoZeny;
+ if(checkweight(987,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 120000;
+ getitem 987,1;
+ mes "[Christopher Guillenrow]";
+ mes "Ah! Ye have a good eye for anvils. This here is the proper anvil for a Blacksmith.";
+ next;
+ goto L_Thanks;
+ sM_GolAnvil:
+ if(Zeny < 300000) goto L_NoZeny;
+ if(checkweight(988,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 300000;
+ mes "[Christopher Guillenrow]";
+ mes "This is the best anvil in my workshop! With this ye'll be the best Blasksmith in no time.";
+ getitem 988,1;
+ next;
+ goto L_Thanks;
+ sM_BetAnvil:
+ mes "[Christopher Guillenrow]";
+ mes "I'm sorry but I don't have anything better than a Golden Anvil.";
+ mes "Maybe 'Ringgel' the legendary Anvil maker would have one... but he be a hard fellow ta find.";
+ close;
+
+ M_1:
+ mes "[Christopher Guillenrow]";
+ mes "A respectable Blacksmith uses fine tools. Ye will come ta know my tools as being the finest around!";
+ mes "Choose anything you want.";
+ sM_Menu1:
+ next;
+ menu "Mini-Furnace - 150z.",sM_Furn, "Iron Hammer - 1000z.",sM_IrHam, "Golden Hammer - 3000z.",sM_GldHam,
+ "Oridecon Hammer - 5000z.",sM_OriHam, "Cancel",M_Menu;
+
+ sM_Furn:
+ mes "[Christopher Guillenrow]";
+ mes "This is a prerequisite for Metal refining!!";
+ mes "So, how many do ye wish to buy? If you want to quit, please input the number '0'. However, you the maximum amount you can buy is 1000";
+ set @input, 0;
+ input @input;
+ next;
+ if(@input < 1 ) goto sM_Menu1;
+ if(@input > 1000 ) goto sM_Max;
+ if(Zeny < 150 * @input) goto L_NoZeny;
+ if(checkweight(612,@input) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - (150 * @input);
+ getitem 612, @input;
+ goto L_Thanks;
+ sM_IrHam:
+ if(Zeny < 1000) goto L_NoZeny;
+ if(checkweight(613,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 1000;
+ getitem 613,1;
+ goto L_Thanks;
+ sM_GldHam:
+ if(Zeny < 3000) goto L_NoZeny;
+ if(checkweight(614,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 3000;
+ getitem 614,1;
+ goto L_Thanks;
+ sM_OriHam:
+ if(Zeny < 5000) goto L_NoZeny;
+ if(checkweight(615,1) == 0 ) goto L_OverWeight;
+ set Zeny, Zeny - 5000;
+ getitem 615,1;
+ goto L_Thanks;
+ sM_Max:
+ mes "[Christopher Guillenrow]";
+ mes "Sorry, you can't buy more than 1000 furnace at a time.";
+ close;
+
+ M_2:
+ mes "[Christopher Guillenrow]";
+ mes "I have 2 kinds of metals for sale. Which do ye like?";
+ set @chris, 1;
+ set @name$, "Christopher Guillenrow";
+ callfunc "phramain";
+
+ M_3:
+ mes "[Christopher Guillenrow]";
+ mes "I can purify yer rough Oridecon and rough Elunium ores. I'll need 5 rough ores to make 1 pure one.";
+ mes "Well... which one do ye want ta make?";
+ set @chris, 1;
+ set @name$, "Christopher Guillenrow";
+ callfunc "orimain";
+
+ M_End:
+ close;
+
+ L_NoZeny:
+ mes "[Christopher Guillenrow]";
+ mes "I don't think I can let ye have this at a lower price. I can't afford ta loose profits because of ye.";
+ emotion 4;
+ close;
+
+ L_OverWeight:
+ mes "[Christopher Guillenrow]";
+ mes "You don't seem to have enough strength to carry this.";
+ close;
+
+ L_Thanks:
+ mes "[Christopher Guillenrow]";
+ mes "Thank you for shopping at my workshop. Feel free to come anytime whenever you need.";
+ emotion 15;
+ close;
+}
+
+ein_in01,38,29,6 duplicate(Chris) Christopher#2 63
+
+//=====================================================================================
+// Weapon/Armor Refiners
+//=====================================================================================
+prt_in.gat,63,60,4 script Hollengrhen 85,{
+ set @name$,"Hollengrhen";
+ callfunc "refinemain";
+ end;
+}
+morocc_in.gat,73,38,4 script Aragham 99,{
+ set @name$,"Aragham";
+ callfunc "refinemain";
+ end;
+}
+payon.gat,144,173,4 script Antonio 88,{
+ set @name$,"Antonio";
+ callfunc "refinemain";
+ end;
+}
+alberta_in.gat,28,58,4 script Fredrik 85,{
+ set @name$,"Fredrik";
+ callfunc "refinemain";
+ end;
+}
+yuno_in01.gat,164,26,6 script Disturb 88,{
+ set @name$,"Disturb";
+ callfunc "refinemain";
+ end;
+}
+ein_in01.gat,24,87,6 script Manthasman 826,{
+ set @name$,"Manthasman Pruhag";
+ callfunc "refinemain";
+ end;
+}
+lhz_in02.gat,282,20,7 script Fulerr 869,{
+ set @name$,"Fulerr";
+ callfunc "refinemain";
+ end;
+}
+
+//============================================================
+//= Main Refiner Function
+//============================================================
+//= To allow auto safe refining/multiple refining set the
+//= @features variable to 1
+//============================================================
+function script refinemain {
+ set @features,0;
+
+ mes "[" + @name$ + "]";
+ mes "I am the Armsmith... I can refine any weapon or piece of armor you choose!";
+ mes "Which piece of equipment do you want to refine?";
+ M_Menu:
+ next;
+ menu getequipname(1),PART1,getequipname(2),PART2,getequipname(3),PART3,getequipname(4),PART4,getequipname(5),PART5,
+ getequipname(6),PART6,getequipname(7),PART7,getequipname(8),PART8,getequipname(9),PART9,getequipname(10),PART10;
+
+ //Head Gear
+ PART1:
+ set @part,1;
+ if (getequipisequiped(1)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "Do you want me to refine your dumb brain?";
+ emotion 6;
+ goto M_Menu;
+ //Armor
+ PART2:
+ set @part,2;
+ if (getequipisequiped(2)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "Do you want me to melt your body with blazing heat...?";
+ emotion 6;
+ goto M_Menu;
+ //Left Hand
+ PART3:
+ set @part,3;
+ if (getequipisequiped(3)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "I can't make your left hand into an ultimate weapon...";
+ emotion 4;
+ goto M_Menu;
+ //Right Hand
+ PART4:
+ set @part,4;
+ if (getequipisequiped(4)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "I can't make your right hand into an ultimate weapon...";
+ emotion 4;
+ goto M_Menu;
+ //Garment
+ PART5:
+ set @part,5;
+ if (getequipisequiped(5)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "Look here... you don't have any Garments on...";
+ goto M_Menu;
+ //Foot Gear
+ PART6:
+ set @part,6;
+ if (getequipisequiped(6)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "Ack!! Those are some stinky feet. I definitely can't refine those... uck!!";
+ emotion 16;
+ goto M_Menu;
+ //Accessory1
+ PART7:
+ set @part,7;
+ if (getequipisequiped(7)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "What do you mean by Accessory? Which One?";
+ emotion 20;
+ goto M_Menu;
+ //Accessory2
+ PART8:
+ set @part,8;
+ if (getequipisequiped(8)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "What do you mean by Accessory? Which One?";
+ emotion 20;
+ goto M_Menu;
+ PART9:
+ set @part,9;
+ if (getequipisequiped(9)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "What do you want from me? There's nothing equipped there...";
+ emotion 20;
+ goto M_Menu;
+ PART10:
+ set @part,10;
+ if (getequipisequiped(10)) goto CHECK1;
+ mes "[" + @name$ + "]";
+ mes "What do you want from me? There's nothing equipped there...";
+ emotion 20;
+ goto M_Menu;
+
+//Check if the item is refinable...
+CHECK1:
+ if(getequipisenableref(@part)) goto CHECK2;
+ mes "[" + @name$ + "]";
+ mes "I can't work on this item...";
+ close;
+
+//Check if the item is identified... (Don't know why this is in here... but kept it anyway)
+CHECK2:
+ if(getequipisidentify(@part)) goto CHECK3;
+ mes "[" + @name$ + "]";
+ mes "You must appraise this item first.";
+ close;
+
+//Check to see if the items is already +10
+CHECK3:
+ if(getequiprefinerycnt(@part) < 10) goto REFINE0;
+ mes "[" + @name$ + "]";
+ mes "This weapon is already at its maximum level and can no longer be refined.";
+ close;
+
+//Refine Armor
+REFINE0:
+ set @refineitemid, getequipid(@part); // save id of the item
+ set @refinerycnt, getequiprefinerycnt(@part); //save refinery count
+ if(getequipweaponlv(@part) > 0) goto REFINE1;
+ set @matname$,"Elunium";
+ set @material,985;
+ set @price,2000;
+ set @safe,4;
+ if(@features == 1) goto L_refinefeatures;
+ goto L_refinenormal;
+//Refine Level 1 Weapon
+REFINE1:
+ if(getequipweaponlv(@part) > 1) goto REFINE2;
+ set @matname$,"Phracon";
+ set @material,1010;
+ set @price,50;
+ set @safe,7;
+ if(@features == 1) goto L_refinefeatures;
+ goto L_refinenormal;
+//Refine Level 2 Weapon
+REFINE2:
+ if(getequipweaponlv(@part) > 2) goto REFINE3;
+ set @matname$,"Emveretarcon";
+ set @material,1011;
+ set @price,200;
+ set @safe,6;
+ if(@features == 1) goto L_refinefeatures;
+ goto L_refinenormal;
+//Refine Level 3 Weapon
+REFINE3:
+ if(getequipweaponlv(@part) > 3) goto REFINE4;
+ set @matname$,"Oridecon";
+ set @material,984;
+ set @price,5000;
+ set @safe,5;
+ if(@features == 1) goto L_refinefeatures;
+ goto L_refinenormal;
+//Refine Level 4 Weapon
+REFINE4:
+ set @matname$,"Oridecon";
+ set @material,984;
+ set @price,20000;
+ set @safe,4;
+ if(@features == 1) goto L_refinefeatures;
+ goto L_refinenormal;
+
+L_refinenormal:
+ mes "[" + @name$ + "]";
+ mes "To refine this stuff, I need ^ff9999" + @matname$ + "^000000 and the fee " + @price + " Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",Lcancel;
+
+ if (getequippercentrefinery(@part) == 100) goto L_Sub;
+ mes "[" + @name$ + "]";
+ mes "Hmm... Hold on! This piece of equipment has already been refined to its maximum safety level.";
+ mes "I must warn you if it is refined ANYMORE, It could be DESTROYED and become USELESS!!";
+ next;
+ mes "["+@name$+"]";
+ mes "Do you still wish you refine it? If so I will not be able to guarantee my work...";
+ next;
+ menu "Yes",-,"No",Lcancel1;
+
+ L_Sub:
+ if ((countitem(@material) < 1) || (Zeny < @price)) goto Lcancel2;
+ set Zeny,Zeny-@price;
+ delitem @material,1;
+
+Lrefine:
+ if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (not changed, why?)
+ if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
+ if (getequiprefinerycnt(@part) != @refinerycnt) goto LNoFake; // hacker has changed the item
+ if (getequippercentrefinery(@part) <= rand(100)) goto Lfail;
+ mes "["+@name$+"]";
+ mes "Clang! Clang! Clang!";
+ successrefitem @part;
+ next;
+ mes "["+@name$+"]";
+ mes "HAHA! It seems my skills haven't gotten rusty yet! Splendid... just splendid...";
+ emotion 21;
+ close;
+
+Lfail:
+ mes "[" + @name$ + "]";
+ mes "Clang! Clang! Clang!";
+ failedrefitem @part;
+ next;
+ mes "["+@name$+"]";
+ mes "Aaahhh!! Oh no...!!";
+ emotion 16;
+ next;
+ mes "["+@name$+"]";
+ mes "Eh..Ehem... I'm sorry but the refining process ^ff0000failed^000000.";
+ next;
+ mes "["+@name$+"]";
+ mes "I am deeply ashamed of what I've done... but I DID warn you earlier about the risks.";
+ close;
+
+LNoItem:
+ mes "[" + @name$ + "]";
+ mes "Look here... you don't have any Items on...";
+ close;
+
+LNoFake:
+ mes "[" + @name$ + "]";
+ mes "Clan... No, but Did you imagine I could be so stupid !?!";
+ mes "You have changed it...";
+ mes "Go out before I stun you with my Hammer!!!";
+ close;
+
+Lcancel:
+ mes "[" + @name$ + "]";
+ mes "You said so..Hmm so be it...";
+ close;
+
+Lcancel1:
+ mes "[" + @name$ + "]";
+ mes "Good Choice.";
+ mes "Ah... good choice. I'd feel awful if I'd destroyed another persons piece of equipment with my own hands.";
+ close;
+
+Lcancel2:
+ mes "[" + @name$ + "]";
+ mes "Is that all you got? Unfortunately I can't work for you at a lower price. Try putting yourself in my shoes.";
+ close;
+
+// New Refining Functions ========================
+L_refinefeatures:
+ if(getequiprefinerycnt(@part) >= @safe) goto Lnosafe;
+ mes "[" + @name$ + "]";
+ mes "I can refine this to the safe limit or a desired number of times... it's your choice...";
+ next;
+ menu "To the safe limit please.",Lsafe,"I'll decide how many times.",Lnosafe,"I've changed my mind...",Lcancel;
+
+Lsafe:
+ set @refinecnt,@safe - getequiprefinerycnt(@part);
+ set @fullprice,@price * @refinecnt;
+ mes "[" + @name$ + "]";
+ mes "That will cost you " + @refinecnt + " " + @matname$ + " and " + @fullprice + " Zeny. Is that ok?";
+ next;
+ menu "Yes",-,"No...",Lcancel;
+ if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
+ set Zeny,Zeny - @fullprice;
+ delitem @material,@refinecnt;
+ goto L_refinesafe;
+
+Lnosafe:
+ mes "[" + @name$ + "]";
+ mes "So how many times would you like me to refine your item?";
+ next;
+ input @refinecnt;
+ if (@refinecnt<1) goto Lcancel3; //fixed by Lupus
+ set @refinecheck,@refinecnt + getequiprefinerycnt(@part);
+ if(@refinecheck > 10) goto Lcancel3;
+ set @fullprice,@price * @refinecnt;
+ mes "[" + @name$ + "]";
+ mes "This will cost you " + @refinecnt + " " + @matname$ + " and " + @fullprice + " Zeny... Is that ok?";
+ next;
+ menu "Yes...",-,"No...",Lcancel;
+ if(@refinecheck > @safe) goto Lwarn;
+ if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
+ set Zeny,Zeny - @fullprice;
+ delitem @material,@refinecnt;
+ goto L_refinenumber;
+ end;
+
+ Lwarn:
+ set @refinecheck,@refinecheck - @safe;
+ mes "[" + @name$ + "]";
+ mes "This will try to refine the equipment " + @refinecheck + " times past the safe limit. Your equipment may be destroyed... is that ok?";
+ next;
+ menu "Yes",-,"No...",Lcancel1;
+ if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
+ set Zeny,Zeny - @fullprice;
+ delitem @material,@refinecnt;
+ goto L_refinenumber;
+
+Lcancel3:
+ mes "[" + @name$ + "]";
+ mes "I can't refine this item that many times.";
+ close;
+
+// SubFunction: Safe Refine ---------------------
+L_refinesafe:
+ if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (no changed, why?)
+ if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
+ if (getequippercentrefinery(@part) < 100) goto LNoFake; // hacker has changed the item (it is not safe anymore)
+ mes "Clang, clang!!!";
+ successrefitem @part;
+ emotion 21;
+ set @refinecnt,@refinecnt - 1;
+ next;
+ if(@refinecnt == 0) goto Lend;
+ goto L_refinesafe;
+
+ Lend:
+ mes "[" + @name$ + "]";
+ mes "All finished... Come again soon.";
+ close;
+
+// SubFunction: Refine
+L_refinenumber:
+ if (getequipisequiped(@part) == 0) goto LNoItem; // hacker has removed the item (no changed, why?)
+ if (getequipid(@part) != @refineitemid) goto LNoFake; // hacker has changed the item
+ mes "Clang, clang!!!";
+ if (getequippercentrefinery(@part)<=rand(100)) goto Lfail_number;
+ successrefitem @part;
+ emotion 21;
+ set @refinecnt,@refinecnt - 1;
+ next;
+ if(@refinecnt == 0) goto Lend;
+ goto L_refinenumber;
+
+ Lfail_number:
+ failedrefitem @part;
+ emotion 23;
+ mes "[" + @name$ + "]";
+ mes "WAHHHH!!! I'm so sorry... I warned you this could happen...";
+ set @refinecnt,@refinecnt - 1;
+ if(@refinecnt == 0) goto Lend2;
+ mes "Here's the unused Zeny and Material back...";
+ getitem @material,@refinecnt;
+ set @fullprice,@refinecnt * @price;
+ set Zeny,Zeny + @fullprice;
+
+ Lend2:
+ close;
+}
+
+
+
+//==============================================================================
+// Material Salesmen
+//==============================================================================
+prt_in.gat,56,69,4 script Vurewell 86,{
+ set @name$,"Vurewell";
+ callfunc "phramain";
+ end;
+}
+payon.gat,145,178,4 script Begnahd 88,{
+ set @name$,"Begnahd";
+ callfunc "phramain";
+ end;
+}
+morocc_in.gat,65,37,4 script Sade 99,{
+ set @name$,"Sade";
+ callfunc "phramain";
+ end;
+}
+alberta_in.gat,18,59,5 script Kahlamanlith 86,{
+ set @name$,"Kahlamanlith";
+ callfunc "phramain";
+ end;
+}
+yuno_in01.gat,171,26,6 script Dillemat 88,{
+ set @name$,"Dillemat";
+ callfunc "phramain";
+ end;
+}
+ein_in01.gat,15,87,7 script Tirehaus 86,{
+ set @name$,"Tirehaus";
+ callfunc "phramain";
+ end;
+}
+lhz_in02.gat,278,24,3 script Krugg 86,{
+ set @name$,"Krugg";
+ callfunc "phramain";
+ end;
+}
+
+//============================================================
+//= Material Salesmen Functions
+//============================================================
+function script phramain {
+ if(@chris == 1) goto M_Menu;
+ mes "[" + @name$ + "]";
+ mes "Hello, Im selling metals I just mined.";
+ mes "They are Pharacon and Emvertacon.";
+ mes "Would you like to buy some?";
+ M_Menu:
+ set @chris, 0;
+ next;
+ menu"Pharacon - 200z",PHARA,"Emvertacon - 1000z",EMVER;
+
+ PHARA:
+ set @itemid,1010;
+ set @value,200;
+ goto CONTINUE;
+
+ EMVER:
+ set @itemid,1011;
+ set @value,1000;
+
+CONTINUE:
+ mes "[" + @name$ + "]";
+ mes "How many would you like?";
+ next;
+ input @ammount;
+ if (@ammount <= 0) goto L_BELOW;
+ if (@ammount > 999) goto L_ABOVE;
+ if (zeny < @value * @ammount) goto L_NOZENY;
+ if (checkweight(@itemid,@ammount) == 0) goto L_WEIGHT;
+ set Zeny,Zeny-@value*@ammount;
+ getitem @itemid,@ammount;
+ mes "[" + @name$ + "]";
+ mes "Here you go.";
+ close;
+
+L_NOZENY:
+ mes "You do not have enough zeny!";
+ close;
+L_WEIGHT:
+ mes "You cant hold that many of that item";
+ close;
+L_BELOW:
+ mes "You have to buy a POSITIVE amount of items!";
+ close;
+L_ABOVE:
+ mes "You cant buy this much of this item!";
+ close;
+}
+
+
+
+//==============================================================================
+// Ori/Elu Refiners
+//==============================================================================
+prt_in.gat,63,69,4 script Dietrich 84,{
+ set @name$,"Dietrich";
+ callfunc "orimain";
+ end;
+}
+payon.gat,137,178,4 script Hakhim 88,{
+ set @name$,"Hakhim";
+ callfunc "orimain";
+ end;
+}
+morocc_in.gat,72,32,4 script Abdul 99,{
+ set @name$,"Abdul";
+ callfunc "orimain";
+ end;
+}
+alberta_in.gat,21,63,5 script Xenophon 84,{
+ set @name$,"Xenophon";
+ callfunc "orimain";
+ end;
+}
+yuno_in01.gat,171,22,6 script Delayt 88,{
+ set @name$,"Delayt";
+ callfunc "orimain";
+ end;
+}
+ein_in01.gat,18,82,6 script Matestein 84,{
+ set @name$,"Matestein";
+ callfunc "orimain";
+ end;
+}
+lhz_in02.gat,281,24,5 script Fruel 84,{
+ set @name$,"Fruel";
+ callfunc "orimain";
+ end;
+}
+
+//============================================================
+//= Ori/Elu Functions
+//============================================================
+function script orimain {
+ if(@chris == 1) goto M_Menu;
+ mes "[" + @name$ + "]";
+ mes "If you bring Rough Oridecons and";
+ mes "Rough Eluniums to me,";
+ mes "I can refine them for you.";
+ mes "However, you must bring 5 of each.";
+ M_Menu:
+ set @chris, 0;
+ next;
+ menu "Make Oridecon",M_Ori, "Make Elunium",M_Elu, "Ask about enchanted stones",M_Stones;
+
+ M_Ori:
+ if(countitem(756) < 5) goto L_NoOri;
+ delitem 756,5;
+ getitem 984,1;
+ mes "[" + @name$ + "]";
+ mes "As promised, here's your oridecon.";
+ mes "Come back again anytime.";
+ close;
+
+ L_NoOri:
+ mes "[" + @name$ + "]";
+ mes "Huh? You're kidding, right? Didn't I say I can't make you an Oridecon unless you bring me 5 rough ones?";
+ close;
+ M_Elu:
+ if(countitem(757) < 5) goto L_NoElu;
+ delitem 757,5;
+ getitem 985,1;
+ mes "[" + @name$ + "]";
+ mes "As promised, here's your elunium.";
+ mes "Come back again anytime.";
+ close;
+
+ L_NoElu:
+ mes "[" + @name$ + "]";
+ mes "Huh? You're kidding, right? Didn't I say I can't make you an Elunium unless you bring me 5 rough ones?";
+ close;
+ M_Stones:
+ mes "[" + @name$ + "]";
+ mes "Enchanted stones, huh...";
+ next;
+ mes "[" + @name$ + "]";
+ mes "Well, in the 20 years that I've been a stone smith I've heard of them many times... though I've never actually seen them before.";
+ next;
+ mes "[" + @name$ + "]";
+ mes "I've been told that enchanted stones possess different elemental properties such as ^5533FFWater, Earth, Fire, and Wind^000000.";
+ next;
+ mes "[" + @name$ + "]";
+ mes "If someone combines an Enchanted Stone with a weapon during the refining process, that weapon will possess the same property as the stone.";
+ next;
+ mes "[" + @name$ + "]";
+ mes "Of course, that person needs to be skillful enough to work on it.";
+ goto M_Menu;
+}
+
+
+
+//=====================================================================================
+// Equipment Repairmen
+//=====================================================================================
+prt_in.gat,62,54,2 script Grendal 84,{
+ set @name$,"Grendal";
+ callfunc "repairmain";
+ end;
+}
+//Temp Spot, Not Sure Where To place
+payon.gat,149,182,2 script Repairman#01 88,{
+ set @name$,"Repairman";
+ callfunc "repairmain";
+ end;
+}
+morocc_in.gat,71,40,2 script Repairman#02 99,{
+ set @name$,"Repairman";
+ callfunc "repairmain";
+ end;
+}
+lhz_in02.gat,284,14,3 script Repairman#03 86,{
+ set @name$,"Repairman";
+ callfunc "repairmain";
+ end;
+}
+
+//============================================================
+//= Equipment Repair Function
+//============================================================
+function script repairmain {
+ set @repairprice,5000;
+ mes "[" + @name$ + "]";
+ mes "I am the Repair Smith and I can repair any Arms you want.";
+ mes "Tell me which Equipment you want to repair.";
+ next;
+ if(getbrokenid(1)==NULL) {
+ mes "[" + @name$ + "]";
+ mes "Looks like you don't need anything repaired today...";
+ close;
+ }
+ set @choice,select(getitemname(getbrokenid(1)),getitemname(getbrokenid(2)),
+ getitemname(getbrokenid(3)),getitemname(getbrokenid(4)),getitemname(getbrokenid(5)),
+ getitemname(getbrokenid(6)),getitemname(getbrokenid(7)),getitemname(getbrokenid(8)),
+ getitemname(getbrokenid(9)),getitemname(getbrokenid(10)));
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(getbrokenid(@choice)) + ".";
+ mes "To repair this, I need " + @repairprice + " Zeny.";
+ mes "Continue?";
+ next;
+ if(select("Yes","No") == 2) {
+ mes "[" + @name$ + "]";
+ mes "Ok, but don't expect to be using that...";
+ close;
+ }
+ if (Zeny < @repairprice) {
+ mes "[" + @name$ + "]";
+ mes "Is it all you got?";
+ mes "Unfortunately, I have kids to feed...";
+ close;
+ }
+ set Zeny,Zeny-@repairprice;
+ repair(@choice);
+ close;
+
+}
diff --git a/npc/merchants/renters.txt b/npc/merchants/renters.txt
index 2bd71a844..0c530710c 100644
--- a/npc/merchants/renters.txt
+++ b/npc/merchants/renters.txt
@@ -1,182 +1,182 @@
-//===== eAthena Script =======================================
-//= Renters
-//===== By: ==================================================
-//= kobra_k88, mod by Lupus
-//===== Current Version: =====================================
-//= 1.6a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= PecoPeco Breeder, Grand PecoPeco Breeder, Falcon tamer scripts
-//===== Additional Comments: =================================
-//= Fully working
-//= Added another Falcon Master into the Hunters Guild [Lupus]
-//= 1.2: replaced checkoption(x) with checkriding,checkfalcon [Lupus]
-//= 1.3: Added support Adv Classes + Baby Class [Lupus]
-//= 1.4: Added different prices for normal, advanced and baby classes
-//= but you could set them to the same [Lupus]
-//= 1.5: Fixed spelling mistakes [Nexon]
-//= 1.5a: Small fix (Falcon Taming -> Falcon Mastery) [Komurka]
-//= 1.6: Moved the Falcon Master to Hugel [Poki#3]
-//============================================================
-
-// PecoPeco Breeder (for Knights)-------------------------------------------
-prontera.gat,61,338,3 script PecoPeco Breeder 86,{
- if(Upper==0) set @price,2500; //Normal Peco - default price
- if(Upper==1) set @price,4000; //Armored Peco
- if(Upper==2) set @price,2000; //Baby Peco
-
- mes "[PecoPeco Breeder]";
- if(BaseJob == Job_Knight || BaseJob == Job_Knight2 ) goto L_Start;
- if(Upper==0)mes "I'm a PecoPeco breeder and I rent out PecoPecos for ^4444FF Knights ^000000 to ride on.";
- if(Upper==1)mes "I'm a PecoPeco breeder and I rent out Armored PecoPecos for ^4444FF Lord Knights ^000000 to ride on.";
- if(Upper==2)mes "I'm a PecoPeco breeder and I rent out Baby PecoPecos for ^4444FF Baby Knights ^000000 to ride on.";
- close;
-
-L_Start:
- if(Upper==0)mes "Good day. Would you like to ride a PecoPeco?";
- if(Upper==1)mes "Good day. Would you like to ride an Armored PecoPeco?";
- if(Upper==2)mes "Good day. Would you like to ride a Baby PecoPeco?";
- next;
- mes "[PecoPeco Breeder]";
- mes "You can rent one PecoPeco for "+@price+" Zeny, provided that you have the PecoPeco Riding skill.";
- next;
- menu "Lend me a trusty steed!... err... bird!",M_0,"Hmm...It's a bit too expensive.",M_1;
-
- M_0:
- if(getskilllv(63) == 0) goto sL_NeedSkill;
- if(Zeny < @price) goto sL_Zeny;
- if(checkriding(0) != 0) goto sL_GotPeco;
- set Zeny, Zeny - @price;
- setriding;
- mes "Thank you and good day.";
- emotion 15;
- close;
-
- sL_NeedSkill:
- mes "[PecoPeco Breeder]";
- mes "As I mentioned earlier, you need the ^3333FFRiding^000000 skill in order to rent a PecoPeco.";
- close;
- sL_Zeny:
- mes "[PecoPeco Breeder]";
- mes "As I said before it will be "+@price+"z. Come back when you have enough zeny.";
- close;
- sL_GotPeco:
- mes "[PecoPeco Breeder]";
- mes "Umm... aren't you already riding a PecoPeco??....";
- emotion 20;
- close;
- M_1:
- mes "[PecoPeco Breeder]";
- mes "Alright. Good day to you.";
- close;
-
-}
-
-// Grand PecoPeco Breeder (for Crusaders)-------------------------------------------
-prontera.gat,238,312,5 script Grand PecoPeco Breeder 86,{
- if(Upper==0) set @price,3000; //Normal Peco - default price
- if(Upper==1) set @price,5000; //Armored Peco
- if(Upper==2) set @price,2500; //Baby Peco
-
- mes "[Grand PecoPeco Breeder]";
- if(BaseJob == Job_Crusader || BaseJob == Job_Crusader2 ) goto L_Start;
- if(Upper==0)mes "I'm a Grand PecoPeco breeder and I rent out Grand PecoPecos for ^4444FF Crusaders^000000 to ride on.";
- if(Upper==1)mes "I'm a Grand PecoPeco breeder and I rent out Armored Grand PecoPecos for ^4444FF Paladins^000000 to ride on.";
- if(Upper==2)mes "I'm a Grand PecoPeco breeder and I rent out Baby Grand PecoPecos for ^4444FF Baby Crusaders^000000 to ride on.";
- close;
-
-L_Start:
- if(Upper==0)mes "Good day. Would you like to ride a Grand PecoPeco?";
- if(Upper==1)mes "Good day. Would you like to ride an Armored Grand PecoPeco?";
- if(Upper==2)mes "Good day. Would you like to ride a Baby Grand PecoPeco?";
- next;
- mes "[Grand PecoPeco Breeder]";
- mes "You can rent one Grand PecoPeco for "+@price+" Zeny, provided that you have the PecoPeco Riding skill.";
- next;
- menu "Lend me a trusty steed!... err... bird!",M_0,"Hmm...It's a bit too expensive.",M_1;
-
- M_0:
- if(getskilllv(63) == 0) goto sL_NeedSkill;
- if(Zeny < @price) goto sL_Zeny;
- if(checkriding(0) != 0) goto sL_GotPeco;
- set Zeny, Zeny - @price;
- setriding;
- mes "Thank you and good day.";
- emotion 15;
- close;
-
- sL_NeedSkill:
- mes "[Grand PecoPeco Breeder]";
- mes "As I mentioned earlier, you need the ^3333FFRiding^000000 skill in order to rent a Grand PecoPeco.";
- close;
- sL_Zeny:
- mes "[Grand PecoPeco Breeder]";
- mes "As I said before it will be "+@price+"z. Come back when you have enough zeny.";
- close;
- sL_GotPeco:
- mes "[Grand PecoPeco Breeder]";
- mes "Umm... aren't you already riding a Grand PecoPeco??....";
- emotion 20;
- close;
- M_1:
- mes "[Grand PecoPeco Breeder]";
- mes "Alright. Good day to you.";
- close;
-
-}
-
-// Falcon Master--------------------------------------------------------------
-hu_in01.gat,375,318,5 script Falcon Master 59,{
- if(Upper==0) set @price,800; //Normal Falcon - default price
- if(Upper==1) set @price,1000; //Scarf Falcon
- if(Upper==2) set @price,600; //Baby Falcon
-
- mes "[Falcon Master]";
- mes "Hellooooo, I am the Falcon Master.";
- next;
- menu "Speak with him",M_0, "Politely back away",M_End;
-
- M_0:
- mes "[Falcon Master]";
- if(Upper==0)mes "I can train a Falcon for you, but you need "+@price+"z and be a Hunter with mastered ^5555FF'Falcon Mastery'^000000 skill.";
- if(Upper==1)mes "I can train a Scarf Falcon for you, but you need "+@price+"z and be a Sniper with mastered ^5555FF'Falcon Mastery'^000000 skill.";
- if(Upper==2)mes "I can train a Baby Falcon for you, but you need "+@price+"z and be a Baby Hunter with mastered ^5555FF'Falcon Mastery'^000000 skill.";
- next;
- menu "Ok",sM_0, "No thanks",M_End;
-
- sM_0:
- if(BaseJob != Job_Hunter) goto sL_NotHunter;
- if(checkfalcon(0) != 0) goto sL_GotFalc;
- if(Zeny < @price) goto sL_Zeny;
- if(getskilllv(127)==0) goto sL_NoSkill;
- set Zeny, Zeny - @price;
- mes "[Falcon Master]";
- mes "It looks like you meet all the requirements to handle a Falcon. Here you are";
- setfalcon;
- next;
- mes "[Falcon Master]";
- mes "Please take very good care of it. It will prove to be a valuable companion.";
- close;
-
- sL_NotHunter:
- mes "[Falcon Master]";
- mes "As I said, Falcons can only be given to Hunters. Falcons are very picky about who they travel with you know.";
- close;
- sL_GotFalc:
- mes "[Falcon Master]";
- mes "You can only have 1 Falcon at a time.";
- close;
- sL_NoSkill:
- mes "[Falcon Master]";
- mes "I'm sorry but you do not have the Falcon Mastery skill. Please come back when you have learned it.";
- close;
- sL_Zeny:
- mes "[Falcon Master]";
- mes "As I said before it will be "+@price+"z. Come back when you aquire enough zeny.";
- close;
- M_End:
- mes "[Falcon Master]";
- mes "Have a nice day.";
- close;
-}
+//===== eAthena Script =======================================
+//= Renters
+//===== By: ==================================================
+//= kobra_k88, mod by Lupus
+//===== Current Version: =====================================
+//= 1.6a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= PecoPeco Breeder, Grand PecoPeco Breeder, Falcon tamer scripts
+//===== Additional Comments: =================================
+//= Fully working
+//= Added another Falcon Master into the Hunters Guild [Lupus]
+//= 1.2: replaced checkoption(x) with checkriding,checkfalcon [Lupus]
+//= 1.3: Added support Adv Classes + Baby Class [Lupus]
+//= 1.4: Added different prices for normal, advanced and baby classes
+//= but you could set them to the same [Lupus]
+//= 1.5: Fixed spelling mistakes [Nexon]
+//= 1.5a: Small fix (Falcon Taming -> Falcon Mastery) [Komurka]
+//= 1.6: Moved the Falcon Master to Hugel [Poki#3]
+//============================================================
+
+// PecoPeco Breeder (for Knights)-------------------------------------------
+prontera.gat,61,338,3 script PecoPeco Breeder 86,{
+ if(Upper==0) set @price,2500; //Normal Peco - default price
+ if(Upper==1) set @price,4000; //Armored Peco
+ if(Upper==2) set @price,2000; //Baby Peco
+
+ mes "[PecoPeco Breeder]";
+ if(BaseJob == Job_Knight || BaseJob == Job_Knight2 ) goto L_Start;
+ if(Upper==0)mes "I'm a PecoPeco breeder and I rent out PecoPecos for ^4444FF Knights ^000000 to ride on.";
+ if(Upper==1)mes "I'm a PecoPeco breeder and I rent out Armored PecoPecos for ^4444FF Lord Knights ^000000 to ride on.";
+ if(Upper==2)mes "I'm a PecoPeco breeder and I rent out Baby PecoPecos for ^4444FF Baby Knights ^000000 to ride on.";
+ close;
+
+L_Start:
+ if(Upper==0)mes "Good day. Would you like to ride a PecoPeco?";
+ if(Upper==1)mes "Good day. Would you like to ride an Armored PecoPeco?";
+ if(Upper==2)mes "Good day. Would you like to ride a Baby PecoPeco?";
+ next;
+ mes "[PecoPeco Breeder]";
+ mes "You can rent one PecoPeco for "+@price+" Zeny, provided that you have the PecoPeco Riding skill.";
+ next;
+ menu "Lend me a trusty steed!... err... bird!",M_0,"Hmm...It's a bit too expensive.",M_1;
+
+ M_0:
+ if(getskilllv(63) == 0) goto sL_NeedSkill;
+ if(Zeny < @price) goto sL_Zeny;
+ if(checkriding(0) != 0) goto sL_GotPeco;
+ set Zeny, Zeny - @price;
+ setriding;
+ mes "Thank you and good day.";
+ emotion 15;
+ close;
+
+ sL_NeedSkill:
+ mes "[PecoPeco Breeder]";
+ mes "As I mentioned earlier, you need the ^3333FFRiding^000000 skill in order to rent a PecoPeco.";
+ close;
+ sL_Zeny:
+ mes "[PecoPeco Breeder]";
+ mes "As I said before it will be "+@price+"z. Come back when you have enough zeny.";
+ close;
+ sL_GotPeco:
+ mes "[PecoPeco Breeder]";
+ mes "Umm... aren't you already riding a PecoPeco??....";
+ emotion 20;
+ close;
+ M_1:
+ mes "[PecoPeco Breeder]";
+ mes "Alright. Good day to you.";
+ close;
+
+}
+
+// Grand PecoPeco Breeder (for Crusaders)-------------------------------------------
+prontera.gat,238,312,5 script Grand PecoPeco Breeder 86,{
+ if(Upper==0) set @price,3000; //Normal Peco - default price
+ if(Upper==1) set @price,5000; //Armored Peco
+ if(Upper==2) set @price,2500; //Baby Peco
+
+ mes "[Grand PecoPeco Breeder]";
+ if(BaseJob == Job_Crusader || BaseJob == Job_Crusader2 ) goto L_Start;
+ if(Upper==0)mes "I'm a Grand PecoPeco breeder and I rent out Grand PecoPecos for ^4444FF Crusaders^000000 to ride on.";
+ if(Upper==1)mes "I'm a Grand PecoPeco breeder and I rent out Armored Grand PecoPecos for ^4444FF Paladins^000000 to ride on.";
+ if(Upper==2)mes "I'm a Grand PecoPeco breeder and I rent out Baby Grand PecoPecos for ^4444FF Baby Crusaders^000000 to ride on.";
+ close;
+
+L_Start:
+ if(Upper==0)mes "Good day. Would you like to ride a Grand PecoPeco?";
+ if(Upper==1)mes "Good day. Would you like to ride an Armored Grand PecoPeco?";
+ if(Upper==2)mes "Good day. Would you like to ride a Baby Grand PecoPeco?";
+ next;
+ mes "[Grand PecoPeco Breeder]";
+ mes "You can rent one Grand PecoPeco for "+@price+" Zeny, provided that you have the PecoPeco Riding skill.";
+ next;
+ menu "Lend me a trusty steed!... err... bird!",M_0,"Hmm...It's a bit too expensive.",M_1;
+
+ M_0:
+ if(getskilllv(63) == 0) goto sL_NeedSkill;
+ if(Zeny < @price) goto sL_Zeny;
+ if(checkriding(0) != 0) goto sL_GotPeco;
+ set Zeny, Zeny - @price;
+ setriding;
+ mes "Thank you and good day.";
+ emotion 15;
+ close;
+
+ sL_NeedSkill:
+ mes "[Grand PecoPeco Breeder]";
+ mes "As I mentioned earlier, you need the ^3333FFRiding^000000 skill in order to rent a Grand PecoPeco.";
+ close;
+ sL_Zeny:
+ mes "[Grand PecoPeco Breeder]";
+ mes "As I said before it will be "+@price+"z. Come back when you have enough zeny.";
+ close;
+ sL_GotPeco:
+ mes "[Grand PecoPeco Breeder]";
+ mes "Umm... aren't you already riding a Grand PecoPeco??....";
+ emotion 20;
+ close;
+ M_1:
+ mes "[Grand PecoPeco Breeder]";
+ mes "Alright. Good day to you.";
+ close;
+
+}
+
+// Falcon Master--------------------------------------------------------------
+hu_in01.gat,375,318,5 script Falcon Master 59,{
+ if(Upper==0) set @price,800; //Normal Falcon - default price
+ if(Upper==1) set @price,1000; //Scarf Falcon
+ if(Upper==2) set @price,600; //Baby Falcon
+
+ mes "[Falcon Master]";
+ mes "Hellooooo, I am the Falcon Master.";
+ next;
+ menu "Speak with him",M_0, "Politely back away",M_End;
+
+ M_0:
+ mes "[Falcon Master]";
+ if(Upper==0)mes "I can train a Falcon for you, but you need "+@price+"z and be a Hunter with mastered ^5555FF'Falcon Mastery'^000000 skill.";
+ if(Upper==1)mes "I can train a Scarf Falcon for you, but you need "+@price+"z and be a Sniper with mastered ^5555FF'Falcon Mastery'^000000 skill.";
+ if(Upper==2)mes "I can train a Baby Falcon for you, but you need "+@price+"z and be a Baby Hunter with mastered ^5555FF'Falcon Mastery'^000000 skill.";
+ next;
+ menu "Ok",sM_0, "No thanks",M_End;
+
+ sM_0:
+ if(BaseJob != Job_Hunter) goto sL_NotHunter;
+ if(checkfalcon(0) != 0) goto sL_GotFalc;
+ if(Zeny < @price) goto sL_Zeny;
+ if(getskilllv(127)==0) goto sL_NoSkill;
+ set Zeny, Zeny - @price;
+ mes "[Falcon Master]";
+ mes "It looks like you meet all the requirements to handle a Falcon. Here you are";
+ setfalcon;
+ next;
+ mes "[Falcon Master]";
+ mes "Please take very good care of it. It will prove to be a valuable companion.";
+ close;
+
+ sL_NotHunter:
+ mes "[Falcon Master]";
+ mes "As I said, Falcons can only be given to Hunters. Falcons are very picky about who they travel with you know.";
+ close;
+ sL_GotFalc:
+ mes "[Falcon Master]";
+ mes "You can only have 1 Falcon at a time.";
+ close;
+ sL_NoSkill:
+ mes "[Falcon Master]";
+ mes "I'm sorry but you do not have the Falcon Mastery skill. Please come back when you have learned it.";
+ close;
+ sL_Zeny:
+ mes "[Falcon Master]";
+ mes "As I said before it will be "+@price+"z. Come back when you aquire enough zeny.";
+ close;
+ M_End:
+ mes "[Falcon Master]";
+ mes "Have a nice day.";
+ close;
+}
diff --git a/npc/merchants/scrolls_arrows.txt b/npc/merchants/scrolls_arrows.txt
index 97f645e41..163de45f7 100644
--- a/npc/merchants/scrolls_arrows.txt
+++ b/npc/merchants/scrolls_arrows.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= Magic Scrolls & Arrows + Arrow Quivers
-//===== By: ==================================================
-//= Lupus
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Some shops that sells Magic Scrolls, Arrow Quivers
-//= Temp shops, made in kRO to test some effects (they stay next to Geffen Tower entrance)
-//= Note: Coords and prices aren't right yet
-//= I made Scrolls cost 2x more in Prontera (uncomment extra shops if u want)
-//=
-//= Correct coords and Sprites if you have more info
-//= 1.1 Added Arrow Quivers (removed rare arrows from the shops)
-//= 1.2 Removed Horse Crest from this temp shop. Because this item has been added to Sohee/Grtst General drops [Lupus]
-//= TODO: Arrows shop should be transformed to Quivers Maker NPC
-//= 1.3 Removed Quivers Shop due to Quiver Maker NPC Jaax [Lupus]
-//= 1.4 Due to added Magic Scrolls drops... removed the temp shop [Lupus]
-//============================================================
-
-
-//=======================================================
-// All Magic Scrolls + Crest of the Horse
-//=======================================================
-// don't lower the price
-geffen.gat,125,91,2 shop Magic Scrolls 735, 686:650, 687:1300, 688:500, 689:1000, 690:500, 691:1000, 692:500, 693:1000, 694:500, 695:1000, 696:500, 697:1000, 698:350, 699:700, 700:350, 12000:700, 12001:1000, 12002:2000, 12003:100
-//prt_in.gat,121,65,3 shop Magic Scrolls 735, 686:1300, 687:2600, 688:1000, 689:2000, 690:1000, 691:2000, 692:1000, 693:2000, 694:1000, 695:2000, 696:1000, 697:2000, 698:700, 699:1400, 700:700, 12000:1700, 12001:2000, 12002:4000, 12003:110
-
-//=======================================================
-// Arrows
-//=======================================================
-//payon_in03.gat,159,10,4 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
-//geffen.gat,123,107,4 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
-//prt_in.gat,163,141,5 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
+//===== eAthena Script =======================================
+//= Magic Scrolls & Arrows + Arrow Quivers
+//===== By: ==================================================
+//= Lupus
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Some shops that sells Magic Scrolls, Arrow Quivers
+//= Temp shops, made in kRO to test some effects (they stay next to Geffen Tower entrance)
+//= Note: Coords and prices aren't right yet
+//= I made Scrolls cost 2x more in Prontera (uncomment extra shops if u want)
+//=
+//= Correct coords and Sprites if you have more info
+//= 1.1 Added Arrow Quivers (removed rare arrows from the shops)
+//= 1.2 Removed Horse Crest from this temp shop. Because this item has been added to Sohee/Grtst General drops [Lupus]
+//= TODO: Arrows shop should be transformed to Quivers Maker NPC
+//= 1.3 Removed Quivers Shop due to Quiver Maker NPC Jaax [Lupus]
+//= 1.4 Due to added Magic Scrolls drops... removed the temp shop [Lupus]
+//============================================================
+
+
+//=======================================================
+// All Magic Scrolls + Crest of the Horse
+//=======================================================
+// don't lower the price
+geffen.gat,125,91,2 shop Magic Scrolls 735, 686:650, 687:1300, 688:500, 689:1000, 690:500, 691:1000, 692:500, 693:1000, 694:500, 695:1000, 696:500, 697:1000, 698:350, 699:700, 700:350, 12000:700, 12001:1000, 12002:2000, 12003:100
+//prt_in.gat,121,65,3 shop Magic Scrolls 735, 686:1300, 687:2600, 688:1000, 689:2000, 690:1000, 691:2000, 692:1000, 693:2000, 694:1000, 695:2000, 696:1000, 697:2000, 698:700, 699:1400, 700:700, 12000:1700, 12001:2000, 12002:4000, 12003:110
+
+//=======================================================
+// Arrows
+//=======================================================
+//payon_in03.gat,159,10,4 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
+//geffen.gat,123,107,4 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
+//prt_in.gat,163,141,5 shop Arrow Quivers 727, 12004:-1, 12005:-1, 12006:-1, 12007:-1, 12008:-1, 12009:-1, 12010:-1, 12011:-1, 12012:-1, 12013:-1, 12014:-1, 12015:-1, 1750:-1, 1770:-1, 1753:-1, 1765:-1, 1751:-1, 1752:-1, 1751:-1, 1755:-1, 1756:-1, 1754:-1, 1767:-1, 1757:-1, 1762:-1
diff --git a/npc/merchants/shops.txt b/npc/merchants/shops.txt
index 67bbff1cb..4a2d2b1ca 100644
--- a/npc/merchants/shops.txt
+++ b/npc/merchants/shops.txt
@@ -1,351 +1,351 @@
-//===== eAthena Script =======================================
-//= Shops
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.9a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= For earlier update notes see the bottom.
-//= 1.22 Thx8) Removed Berserk Potions from all shops but Comodo [Lupus]
-//= 1.3 Added Gunslinger shops. Credits goes to RockmanEXE for the info [erKURITA]
-//= Added Bucket Hat to Flu Mask dealer and modified it's name to a more logical one :P [erKURITA]
-//= 1.4 Added an ingredient seller to Morroc, thanks to Muad_Dib [MasterOfMuppets]
-//= a Removed doubled Morocc Ing.Seller, arranged the rest Ing.Sellers according to the city names [Lupus]
-//= 1.4b Commented out temp Gunslinger shops. [Lupus]
-//= 1.5 Removed Temp gunslinger shops and moved up the official ones. [erKURITA]
-//= Added Official Ninja shops in their correct location and commented a few
-//= shops. Thanks to RockmanEXE and Muad_Dib [erKURITA]
-//= 1.6 Implemented a missing Tool Shop in Lighthalzen [MasterOfMuppets]
-//= 1.7 Added some missing iRO - Lighthalzen NPCs [Musashiden]
-//= 1.8 Added Rachel Official shops. Special Thanks to RockmanEXE. [erKURITA]
-//= 1.9 Uncommented Homunculus shop, since Homunculus is working on trunk now. [Evera]
-//= 1.9a Pet Merchant -> Lighthalzen [erKURITA]
-//============================================================
-
-
-//=======================================================
-//ALBERTA
-//=======================================================
-alb2trea.gat,87,65,1 shop Tool Dealer 83,1750:-1,1751:-1,1752:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1
-alberta_in.gat,94,56,4 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,602:-1,611:-1,610:-1,645:-1,656:-1
-alberta_in.gat,165,96,1 shop Item Collector 74,909:-1,528:-1
-alberta_in.gat,182,96,1 shop Tool Dealer 73,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,2243:-1,645:-1,656:-1
-alberta_in.gat,180,15,1 shop Armor Dealer 101,2101:-1,2103:-1,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2505:-1,2203:-1,2201:-1,2205:-1,2226:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2307:-1,2309:-1,2312:-1,2314:-1
-alberta_in.gat,188,21,1 shop Weapon Dealer 49,1750:-1,1751:-1,1101:-1,1104:-1,1107:-1,1201:-1,1204:-1,1207:-1,1601:-1,1701:-1,1301:-1,1351:-1,1354:-1,1357:-1,1360:-1,1771:-1
-alberta_in.gat,175,97,4 shop Weapon Dealer 82,1146:-1,1245:-1
-//alberta_in.gat,18,59,5 shop Miner 48,1010:-1,1011:-1
-alberta.gat,167,135,4 shop Ingredient Seller 712,579:-1
-
-//=======================================================
-//AL DE BARAN
-//=======================================================
-aldeba_in.gat,20,60,5 shop Armor Dealer 101,2228:-1,2103:-1,2105:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1,2505:-1,2405:-1,2627:-1
-aldeba_in.gat,28,54,5 shop Weapon Dealer 85,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1771:-1
-aldeba_in.gat,22,47,4 shop Weapon Dealer 713,1146:-1,1245:-1
-aldeba_in.gat,94,56,5 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,602:-1,611:-1,610:-1,645:-1,656:-1
-//Uncommented for homunculus on trunk
-alde_alche.gat,38,184,2 shop Homunculus Supplies 755,7143:-1,7141:-1,7140:-1,12040:-1
-aldebaran.gat,166,109,7 shop Ingredient Seller 750,580:-1,7482:-1 //temp goods
-
-//=======================================================
-//AMATSU
-//=======================================================
-//|Removed the following shops according to RockmanEXe's info. Some were removed anyway.
-//amatsu.gat,176,126,4 shop Fruit Merchant 53,512:-1,513:-1,515:-1,516:-1
-//amatsu.gat,169,111,6 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1
-//amatsu.gat,180,102,3 shop Flower Girl 96,712:-1,744:-1,2612:-1
-//amatsu.gat,189,99,7 shop Butcher 49,517:-1,528:-1,540:-1,541:-1
-//amatsu.gat,169,119,6 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
-//amatsu.gat,183,127,5 shop Milk Merchant 90,519:-1
-//ama_in01.gat,96,28,4 shop Weapon Dealer 54,1750:-1,1751:-1,1701:-1,1201:-1,1204:-1,1207:-1,1601:-1,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1122:-1,1119:-1,1123:-1,1126:-1,1157:-1,1129:-1,1116:-1,1301:-1,1771:-1
-//ama_in01.gat,103,24,1 shop Armor Dealer 48,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2220:-1,2226:-1,2301:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1
-//ama_in01.gat,101,18,8 shop Weapon Dealer 47,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
-//2nd set
-//|<= end of removed shops
-ama_in01.gat,89,28,4 shop Armor Dealer 757,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2314:-1,2627:-1
-ama_in01.gat,102,28,4 shop Weapon Dealer 766,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
-ama_in01.gat,24,30,4 shop Tool Dealer 763,1750:-1,1770:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-amatsu.gat,205,150,2 shop Ingredient Seller 83,7453:-1,579:-1
-//| Official Ninja Shops
-que_ng.gat,72,31,2 shop Shuriken Dealer 83,13250:-1,13251:-1,13252:-1,13253:-1,13254:-1
-que_ng.gat,73,26,5 shop Tool Dealer 83,2117:-1,7521:-1,7522:-1,7523:-1,7524:-1
-
-//=======================================================
-//AYOTHAYA
-//=======================================================
-ayo_in01.gat,18,182,8 shop Tool Dealer 840,1750:-1,1753:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-ayo_in01.gat,90,192,3 shop Weapon Dealer 843,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
-ayo_in01.gat,90,160,1 shop Armor Dealer 842,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2328:-1,2627:-1
-ayothaya.gat,202,178,4 shop Food Seller 750,7456:-1,577:-1
-
-//=======================================================
-//COMODO
-//=======================================================
-cmd_in01.gat,117,165,4 shop Armor Dealer 101,2226:-1,2228:-1,2103:-1,2105:-1,2405:-1,2503:-1,2505:-1,2305:-1,2321:-1,2307:-1,2309:-1,2335:-1,2312:-1,2314:-1,2316:-1
-cmd_in01.gat,131,165,4 shop Weapon Dealer 49,1901:-1,1903:-1,1905:-1,1907:-1,1950:-1,1952:-1,1954:-1,1956:-1,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
-cmd_in01.gat,79,182,4 shop Tool Dealer 83,1753:-1,501:-1,502:-1,503:-1,504:-1,645:-1,656:-1,657:-1,601:-1,602:-1,611:-1,1065:-1
-comodo.gat,296,125,4 shop Souvenir Merchant 101,965:-1,964:-1
-comodo.gat,244,296,7 shop Item Collector 74,909:-1
-comodo.gat,224,164,4 shop Food Seller 750,7455:-1
-
-cmd_fild07.gat,257,126,5 shop Tool Dealer 83,1770:-1,501:-1,502:-1,503:-1,504:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1
-cmd_fild07.gat,250,98,2 shop Weapon Dealer 49,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
-cmd_fild07.gat,277,85,4 shop Armor Dealer 101,2226:-1,2228:-1,2103:-1,2105:-1,2405:-1,2503:-1,2505:-1,2305:-1,2321:-1,2307:-1,2309:-1,2335:-1,2312:-1,2314:-1,2316:-1
-
-//=======================================================
-//EINBECH
-//=======================================================
-ein_in01.gat,189,15,0 shop Tool Dealer 850,1750:-1,1752:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-
-//=======================================================
-//EINBROCH
-//=======================================================
-ein_in01.gat,106,27,4 shop One-Hand Weapon Dealer 850,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1119:-1,1122:-1,1123:-1,1126:-1,1129:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1301:-1,1401:-1,1404:-1,1407:-1,1501:-1,1504:-1,1507:-1,1510:-1,1513:-1,1516:-1,1519:-1,1522:-1,1801:-1,1803:-1,1805:-1,1807:-1,1809:-1,1811:-1,1771:-1
-ein_in01.gat,109,27,4 shop Two-Hand Weapon Dealer 850,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1351:-1,1354:-1,1357:-1,1360:-1,1410:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1250:-1,1252:-1,1254:-1
-ein_in01.gat,119,26,4 shop Weapon Dealer 855,1247:-1,1248:-1,1249:-1,13000:-1
-einbroch.gat,138,66,3 shop Head Gear Dealer 850,5114:-1,2218:-1
-einbroch.gat,82,199,3 shop Paddler 855,512:-1,645:-1,1750:-1,501:-1
-//Official Gunslingers shops.
-que_ng.gat,179,91,4 shop Gunner#Gun Seller 900,13150:-1,13102:-1,13151:-1,13154:-1,13155:-1
-que_ng.gat,180,79,4 shop Gunner#Ammo Seller 900,13200:-1,13201:-1,13202:-1
-//=======================================================
-//GEFFEN
-//=======================================================
-geffen_in.gat,25,177,1 shop Armor Dealer 66,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
-geffen_in.gat,29,177,1 shop Weapon Dealer 47,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1,1771:-1
-geffen_in.gat,22,171,6 shop Weapon Dealer 84,1146:-1,1245:-1
-geffen_in.gat,74,144,1 shop Trader 66,909:-1,911:-1,910:-1,912:-1
-geffen_in.gat,77,167,1 shop Tool Dealer 68,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,2241:-1,645:-1,656:-1
-geffen_in.gat,77,173,1 shop Magical Tool Trader 64,717:-1,1601:-1,1604:-1,1607:-1,1610:-1,2232:-1,2321:-1,2332:-1
-geffen_in.gat,171,123,1 shop Tool Dealer 64,1092:-1,1093:-1
-geffen.gat,193,152,3 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-geffen.gat,135,64,3 shop Ingredient Seller 750,580:-1,7482:-1 //temp coords, temp goods
-
-//=======================================================
-//GONRYUN
-//=======================================================
-gonryun.gat,147,84,4 shop Tool Dealer 777,1750:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-gonryun.gat,174,101,4 shop Weapon Dealer 774,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
-gonryun.gat,173,84,4 shop Armor Dealer 770,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2328:-1,2627:-1
-gonryun.gat,148,101,4 shop Food Seller 750,580:-1,7452:-1
-
-//=======================================================
-//HUGEL
-//=======================================================
-hugel.gat,105,169,5 shop Milk Merchant 53,519:-1
-hugel.gat,77,167,3 shop Food Seller 892,522:-1,512:-1,513:-1,515:-1,516:-1,535:-1
-hu_in01.gat,241,368,2 shop Tool Dealer 53,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-hu_in01.gat,252,368,2 shop Tool Trader 90,717:-1,2201:-1,910:-1,528:-1
-hu_in01.gat,100,390,2 shop Bow Dealer 86,1701:-1,1707:-1,1718:-1,1714:-1
-hu_in01.gat,94,390,2 shop Weapon Dealer 898,1116:-1,1154:-1,1354:-1,1201:-1
-hu_in01.gat,94,313,2 shop Armor Dealer 86,2224:-1,2232:-1,2226:-1,2101:-1,2103:-1,2401:-1,2501:-1,2307:-1,2105:-1
-
-//=======================================================
-//IZLUDE
-//=======================================================
-izlude_in.gat,60,127,4 shop Weapon Dealer 98,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1101:-1,1104:-1,1107:-1,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1301:-1,1771:-1
-izlude_in.gat,70,127,4 shop Armor Dealer 101,2103:-1,2105:-1,2403:-1,2405:-1,2503:-1,2505:-1,2226:-1,2228:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1
-izlude_in.gat,115,61,1 shop Tool Dealer 47,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,1065:-1,645:-1,656:-1
-izlude.gat,121,138,1 shop Butcher 54,517:-1
-izlude.gat,127,120,1 shop Fruit Merchant 72,512:-1,513:-1,515:-1,516:-1
-izlude.gat,137,126,3 shop Milk Merchant 701,519:-1
-izlude.gat,164,138,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-
-//=======================================================
-//LOUYANG
-//=======================================================
-lou_in02.gat,121,181,5 shop Armor Dealer 818,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2211:-1,2305:-1,2328:-1,2332:-1,2321:-1
-lou_in02.gat,130,182,5 shop Weapon Dealer 774,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
-lou_in02.gat,239,176,5 shop Tool Dealer 818,1750:-1,1753:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1
-louyang.gat,255,123,4 shop Food Seller 750,7454:-1,577:-1
-
-//=======================================================
-//LIGHTHALZEN
-//=======================================================
-lighthalzen.gat,69,75,5 shop Fruit Gardener 102,512:-1,513:-1
-lighthalzen.gat,112,44,8 shop Flower Girl 90,712:-1,744:-1,748:-1
-lighthalzen.gat,126,126,4 shop Food Seller 83,7456:-1,7452:-1
-lighthalzen.gat,124,129,8 shop Vegetable Gardener 91,515:-1,516:-1,535:-1
-lighthalzen.gat,222,191,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-lhz_in02.gat,286,95,4 shop Begginer's Merchant 62,1621:-1,5112:-1,2416:-1,2113:-1,2512:-1
-lhz_in02.gat,271,99,4 shop Armor Dealer 851,2101:-1,2103:-1,2403:-1,2405:-1,2503:-1,2321:-1,2314:-1,2309:-1,2335:-1,2628:-1
-lhz_in02.gat,276,99,4 shop Weapon Dealer 851,1201:-1,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1,13003:-1,1771:-1
-lhz_in02.gat,273,35,4 shop Wand Dealer 854,1601:-1,1604:-1,1607:-1,1617:-1,1619:-1
-lhz_in02.gat,105,21,3 shop Jewel Seller 91,721:-1,723:-1,726:-1,728:-1,729:-1,730:-1,2613:-1
-lhz_in02.gat,17,220,4 shop Vegetable Merchant 91,515:-1,516:-1,535:-1
-lhz_in02.gat,21,220,5 shop Fruit Merchant 102,512:-1,513:-1
-lhz_in02.gat,32,218,6 shop Butcher 54,517:-1
-lhz_in02.gat,38,145,4 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
-lhz_in02.gat,47,148,5 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-1,7170:-1
-lhz_in02.gat,31,145,4 shop Tool Dealer 90,611:-1,503:-1,504:-1,506:-1,656:-1,601:-1,602:-1,1065:-1,610:-1,1750:-1
-lhz_in02.gat,85,215,4 shop Doll Merchant 91,740:-1,741:-1,742:-1
-lhz_in02.gat,87,208,2 shop Eyewear Merchant 715,2243:-1,2212:-1,2242:-1,2241:-1
-lhz_in03.gat,239,106,4 shop Tool Dealer 850,501:-1,502:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1,611:-1
-
-//=======================================================
-//LUTIE
-//=======================================================
-xmas_in.gat,39,38,4 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,611:-1,601:-1,602:-1,610:-1
-xmas_in.gat,168,104,4 shop Armor Dealer 101,2228:-1,2103:-1,2105:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1,2505:-1,2405:-1
-xmas_in.gat,169,34,2 shop Gift Merchant 702,2612:-1,744:-1,748:-1,736:-1,746:-1,740:-1,2613:-1
-xmas_in.gat,174,98,2 shop Weapon Dealer 49,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1771:-1
-xmas.gat,144,207,4 shop Tool Dealer 83,601:-1,602:-1
-
-//=======================================================
-//MORROC
-//=======================================================
-morocc_in.gat,141,67,1 shop Weapon Dealer 58,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1250:-1,1252:-1,1254:-1,1771:-1
-morocc_in.gat,141,60,1 shop Armor Dealer 58,2101:-1,2103:-1,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2218:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2307:-1,2309:-1,2335:-1
-morocc.gat,35,69,1 shop Trader 89,2609:-1,1516:-1,1522:-1
-morocc.gat,139,92,1 shop Trader 99,513:-1,513:-1,513:-1,513:-1,513:-1,513:-1
-morocc.gat,145,44,1 shop Jewel Seller 99,730:-1,2613:-1
-morocc.gat,147,102,5 shop Tool Dealer 93,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,645:-1,656:-1
-morocc.gat,151,243,1 shop Tool Dealer 99,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,2242:-1,645:-1,656:-1
-morocc.gat,157,72,6 shop Butcher 49,517:-1
-morocc.gat,166,51,1 shop Jewel Seller 102,721:-1,723:-1,726:-1,728:-1,729:-1
-morocc.gat,170,101,3 shop Tool Dealer 85,911:-1,528:-1,919:-1,925:-1
-morocc.gat,206,250,1 shop Tool Dealer 85,911:-1,528:-1,919:-1,925:-1
-morocc.gat,244,134,1 shop Trader 93,2612:-1
-morocc.gat,259,193,1 shop Trader 99,747:-1
-morocc.gat,268,193,1 shop Trader 93,748:-1
-morocc.gat,269,167,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-morocc.gat,120,97,5 shop Ingredient Seller 86,7452:-1,7453:-1,7454:-1,7455:-1,7456:-1
-//morocc_in.gat,65,37,4 shop Miner 48,1010:-1,1011:-1
-morocc_in.gat,132,57,0 shop Weapon Dealer 99,1146:-1,1245:-1
-
-//=======================================================
-//NIFLHEIM
-//=======================================================
-nif_in.gat,35,84,3 shop Weapon Dealer 795,1301:-1,1351:-1,1354:-1,1357:-1,1360:-1
-nif_in.gat,35,91,3 shop Armor Dealer 796,2501:-1,2501:-1,2503:-1,2503:-1,2505:-1,2505:-1
-nif_in.gat,154,21,3 shop Tool Dealer 798,535:-1,1062:-1,902:-1,7106:-1,537:-1,7154:-1,1052:-1,934:-1
-//nif_in.gat,35,84,3 shop Weapon Dealer 795,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1
-//nif_in.gat,35,91,3 shop Armor Dealer 796,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
-//nif_in.gat,154,21,3 shop Tool Dealer 798,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1,645:-1,656:-1
-//niflheim.gat,201,209,3 shop Milk Merchant 794,519:-1
-//niflheim.gat,224,185,3 shop Fruit Merchant 795,512:-1,513:-1
-//niflheim.gat,209,161,3 shop Butcher 794,517:-1,528:-1
-//niflheim.gat,205,152,3 shop Gift Merchant 795,734:-1,735:-1,736:-1,737:-1,746:-1
-niflheim.gat,205,158,1 shop Ingredient Seller 795,581:-1 //temp coords, temp spr ID
-
-//=======================================================
-//PAYON
-//=======================================================
-payon_in01.gat,7,119,4 shop Weapon Dealer 76,1750:-1,1751:-1,1101:-1,1104:-1,1107:-1,1201:-1,1204:-1,1207:-1,1601:-1,1701:-1,1704:-1,1707:-1,1710:-1,1713:-1,1714:-1,1718:-1,1771:-1
-payon_in01.gat,5,129,6 shop Weapon Dealer 703,1146:-1,1245:-1
-payon_in01.gat,15,119,4 shop Armor Dealer 77,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2505:-1,2208:-1,2211:-1,2212:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2309:-1,2330:-1,2628:-1
-payon_in01.gat,5,49,0 shop Tool Dealer 88,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
-payon_in02.gat,87,34,1 shop Tool Dealer 98,1750:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,645:-1,656:-1
-payon.gat,159,96,5 shop Tool Dealer 88,1750:-1,501:-1,645:-1,601:-1,602:-1
-payon.gat,205,119,4 shop Food Seller 750,7455:-1
-//Not Shure About Pet Shop
-payon.gat,104,63,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-pay_arche.gat,125,108,1 shop Milk Merchant 90,519:-1
-pay_arche.gat,132,101,1 shop Vegetable Merchant 102,515:-1,516:-1
-pay_arche.gat,140,124,1 shop Butcher 87,517:-1,528:-1
-
-//=======================================================
-//PRONTERA
-//=======================================================
-prontera.gat,73,134,1 shop Milk Merchant 90,519:-1
-prontera.gat,104,49,1 shop Fruit Merchant 102,512:-1,513:-1
-prontera.gat,64,125,1 shop Butcher 87,517:-1,528:-1
-prontera.gat,58,182,1 shop Flower Girl 96,712:-1,744:-1
-prontera.gat,113,42,1 shop Flower Lady 90,712:-1,744:-1
-prontera.gat,105,87,1 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
-prontera.gat,218,211,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
-prontera.gat,248,153,1 shop Doll Merchant 85,740:-1,741:-1,742:-1
-prontera.gat,156,212,2 shop Food Seller 700,7454:-1,7452:-1,7482:-1,580:-1
-prontera.gat,48,58,7 shop Vegetable Gardener 91,515:-1,516:-1,535:-1
-prt_church.gat,108,124,1 shop Nun 79,2608:-1,2216:-1,2323:-1,2325:-1,1501:-1,1504:-1,1507:-1,1510:-1,1513:-1,1519:-1,5092:-1
-prt_fild05.gat,290,221,1 shop Tool Dealer 83,1750:-1,611:-1,501:-1,502:-1,506:-1,601:-1,602:-1,645:-1,656:-1
-prt_in.gat,211,169,1 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-1,7170:-1
-prt_in.gat,126,76,1 shop Tool Dealer 53,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1,645:-1,656:-1
-prt_in.gat,172,130,1 shop Weapon Dealer 54,1750:-1,1751:-1,1701:-1,1201:-1,1204:-1,1207:-1,1601:-1,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1122:-1,1119:-1,1123:-1,1126:-1,1157:-1,1129:-1,1116:-1,1301:-1,1771:-1
-prt_in.gat,172,132,1 shop Armor Dealer 48,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2220:-1,2226:-1,2301:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2627:-1
-prt_in.gat,171,140,1 shop Weapon Dealer 47,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
-//prt_in.gat,56,69,4 shop Miner 48,1010:-1,1011:-1
-prt_in.gat,164,140,4 shop Weapon Dealer 66,1146:-1,1245:-1
-
-//=======================================================
-//RACHEL
-//=======================================================
-ra_in01.gat,175,364,3 shop Armor Dealer 919,2101:-1,2103:-1,2403:-1,2405:-1,2503:-1,2321:-1,2314:-1,2309:-1,2335:-1,2628:-1
-ra_in01.gat,254,300,3 shop Tool Dealer 931,512:-1,513:-1
-ra_in01.gat,257,269,3 shop Tool Dealer 919,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1,610:-1
-ra_in01.gat,176,389,3 shop Weapon Dealer 931,1201:-1,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1,13003:-1,1601:-1,1604:-1,1607:-1
-rachel.gat,65,80,0 shop Vegetable Gardener 919,515:-1,535:-1,516:-1
-
-//=======================================================
-//TURTLE ISLAND
-//=======================================================
-tur_dun01.gat,158,54,6 shop Tool Dealer 99,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,645:-1,656:-1
-// Spectacles: missing as second item in list
-// Luxury Sunglases: not sure of item/price.
-
-//=======================================================
-//UMBALA
-//=======================================================
-um_in.gat,104,124,3 shop Item Merchant 788,512:15,515:15,535:15,516:15,513:15,517:50,528:60,537:1000,601:60,602:300,645:800,656:1500,610:4000
-um_in.gat,160,125,3 shop Weapon Merchant 789,1501:120,1504:1600,1507:9000,1510:16000,1513:41000,1519:23000,1807:53000,1811:58000,1809:67000
-um_in.gat,151,125,4 shop Armor Merchant 49,2103:-1,2105:-1,2403:-1,2405:-1,2503:-1,2505:-1,2226:-1,2228:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1
-//um_in.gat,159,123,3 shop Weapon Merchant 52,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1101:-1,1104:-1,1107:-1,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1301:-1
-//um_in.gat,98,124,3 shop Tool Merchant 47,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,1065:-1
-//um_in.gat,103,124,4 shop Food Merchant 91,515:-1,516:-1,535:-1,519:-1,517:-1
-umbala.gat,101,154,4 shop Food Seller 750,7456:-1,577:-1
-
-
-//=======================================================
-//YUNO
-//=======================================================
-yuno.gat,65,122,4 shop Fruit Merchant 93,512:-1,513:-1,515:-1,516:-1
-yuno.gat,217,97,4 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1
-yuno.gat,226,106,5 shop Trader 97, 911:-1, 910:-1, 912:-1
-yuno.gat,197,115,4 shop Pet Merchant 124, 537:-1, 643:-1, 10013:-1, 10014:-1
-yuno.gat,205,104,4 shop Equip Dealer 84, 2340:-1, 2341:-1, 2411:-1, 2222:-1, 2230:-1, 1721:-1
-yuno.gat,163,187,5 shop Magic Tool Dealer 90,717:-1,1601:-1,1604:-1,1607:-1,1610:-1,2232:-1,2321:-1,2332:-1
-yuno_in01.gat,25,34,4 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1
-yuno_in01.gat,104,35,4 shop Weapon Dealer 49,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1,1771:-1
-yuno_in01.gat,112,25,5 shop Armor Dealer 101,2628:-1,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
-yuno_in03.gat,176,22,3 shop Scroll Seller 89,7433:-1 //Temp shop in Yuno that sells Blank Scrolls
-yuno.gat,133,171,2 shop Ingredient Seller 750,7457:-1,7482:-1
-
-
-//=======================================================
-// ST. CAPITOLINA ABBEY
-//======================================
-//= Monk shop, sells Knuckle weapons)
-//=======================================================
-prt_monk.gat,135,263,3 shop Blacksmith 726,1801:-1,1803:-1,1805:-1
-
-//===== Additional Comments(old): =================================
-//= swapped shop titles in GONRYUN, thanks to Kashy
-//= 1.3a Fixed Louyang map name. Added additional shops in Yuno. [kobra_k88]
-//= 1.4 Added Niflheim Shops
-//= 1.5 New Payon Locations [Darkchild]
-//= Moved shops in Umbala.txt here. Commented out the duplicate ones.[kobra_k88]
-//= 1.6 Removed GRAPE ID 514 from shops (caused exploits)
-//= 1.7 Removed juices from custom amatsu shops (it's a quest item + levelup exploit)
-//= 1.8 Corrected Niflheim Shops and Morroc Jewel Merchant [celest]
-//= 1.9 Updated Louyang shops thanks to MasterOfMuppets
-//= 1.10 Lutie Tools coords [Yor]
-//= 1.11 Added Belts to Prontera/Aldebaran shops, thanks to reddozen [Lupus]
-//= 1.12 official Ayothaya Shops, thanks to MasterOfMuppets [Lupus]
-//= 1.13 Added 5092 Coif into Prontera Church shop [Lupus]
-//= 1.14 Added Lighthalzen,Einbroch,Einbech shops. Updated Prontera,Morroc,Payon shops [Lupus]
-//= 1.15 Added Venom Knives into every Weapon Shop (that sells Knife[3]) [Lupus]
-//= 1.15a Fixed a small typo in alberta's weapon shop, thanks to reddozen for the fix [MasterOfMuppets]
-//= 1.16 Added a temp shop in Yuno to sell Blank scrolls, thanks to reddozen [MasterOfMuppets]
-//= 1.17 Added wand of hypnotist to the Lighthalzen weapon shop [MasterOfMuppets]
-//= 1.18 Fixed some shops based on kRO shots [Poki#3]
-//= 1.19 Added Hugel and fixed Payon shops based on kRO shots [Poki#3]
-//= 1.19a Added Food Seller selling Mastela Fruit in Hugel (Update item_db for the correct price!) [Poki#3]
-//= 1.20 Added 3 weapons shops, thx2 Muad_Dib [Lupus]
-//= 1.21 Added another weapon dealer to Einbroch, thanks to Muad_Dib [MasterOfMuppets]
-//= - Fixed up the missing sprites for you Lupus :)
-//= - Guys, I suggest we crop these comments and put them at the bottom soon
+//===== eAthena Script =======================================
+//= Shops
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.9a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= For earlier update notes see the bottom.
+//= 1.22 Thx8) Removed Berserk Potions from all shops but Comodo [Lupus]
+//= 1.3 Added Gunslinger shops. Credits goes to RockmanEXE for the info [erKURITA]
+//= Added Bucket Hat to Flu Mask dealer and modified it's name to a more logical one :P [erKURITA]
+//= 1.4 Added an ingredient seller to Morroc, thanks to Muad_Dib [MasterOfMuppets]
+//= a Removed doubled Morocc Ing.Seller, arranged the rest Ing.Sellers according to the city names [Lupus]
+//= 1.4b Commented out temp Gunslinger shops. [Lupus]
+//= 1.5 Removed Temp gunslinger shops and moved up the official ones. [erKURITA]
+//= Added Official Ninja shops in their correct location and commented a few
+//= shops. Thanks to RockmanEXE and Muad_Dib [erKURITA]
+//= 1.6 Implemented a missing Tool Shop in Lighthalzen [MasterOfMuppets]
+//= 1.7 Added some missing iRO - Lighthalzen NPCs [Musashiden]
+//= 1.8 Added Rachel Official shops. Special Thanks to RockmanEXE. [erKURITA]
+//= 1.9 Uncommented Homunculus shop, since Homunculus is working on trunk now. [Evera]
+//= 1.9a Pet Merchant -> Lighthalzen [erKURITA]
+//============================================================
+
+
+//=======================================================
+//ALBERTA
+//=======================================================
+alb2trea.gat,87,65,1 shop Tool Dealer 83,1750:-1,1751:-1,1752:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1
+alberta_in.gat,94,56,4 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,602:-1,611:-1,610:-1,645:-1,656:-1
+alberta_in.gat,165,96,1 shop Item Collector 74,909:-1,528:-1
+alberta_in.gat,182,96,1 shop Tool Dealer 73,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,2243:-1,645:-1,656:-1
+alberta_in.gat,180,15,1 shop Armor Dealer 101,2101:-1,2103:-1,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2505:-1,2203:-1,2201:-1,2205:-1,2226:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2307:-1,2309:-1,2312:-1,2314:-1
+alberta_in.gat,188,21,1 shop Weapon Dealer 49,1750:-1,1751:-1,1101:-1,1104:-1,1107:-1,1201:-1,1204:-1,1207:-1,1601:-1,1701:-1,1301:-1,1351:-1,1354:-1,1357:-1,1360:-1,1771:-1
+alberta_in.gat,175,97,4 shop Weapon Dealer 82,1146:-1,1245:-1
+//alberta_in.gat,18,59,5 shop Miner 48,1010:-1,1011:-1
+alberta.gat,167,135,4 shop Ingredient Seller 712,579:-1
+
+//=======================================================
+//AL DE BARAN
+//=======================================================
+aldeba_in.gat,20,60,5 shop Armor Dealer 101,2228:-1,2103:-1,2105:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1,2505:-1,2405:-1,2627:-1
+aldeba_in.gat,28,54,5 shop Weapon Dealer 85,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1771:-1
+aldeba_in.gat,22,47,4 shop Weapon Dealer 713,1146:-1,1245:-1
+aldeba_in.gat,94,56,5 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,602:-1,611:-1,610:-1,645:-1,656:-1
+//Uncommented for homunculus on trunk
+alde_alche.gat,38,184,2 shop Homunculus Supplies 755,7143:-1,7141:-1,7140:-1,12040:-1
+aldebaran.gat,166,109,7 shop Ingredient Seller 750,580:-1,7482:-1 //temp goods
+
+//=======================================================
+//AMATSU
+//=======================================================
+//|Removed the following shops according to RockmanEXe's info. Some were removed anyway.
+//amatsu.gat,176,126,4 shop Fruit Merchant 53,512:-1,513:-1,515:-1,516:-1
+//amatsu.gat,169,111,6 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1
+//amatsu.gat,180,102,3 shop Flower Girl 96,712:-1,744:-1,2612:-1
+//amatsu.gat,189,99,7 shop Butcher 49,517:-1,528:-1,540:-1,541:-1
+//amatsu.gat,169,119,6 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
+//amatsu.gat,183,127,5 shop Milk Merchant 90,519:-1
+//ama_in01.gat,96,28,4 shop Weapon Dealer 54,1750:-1,1751:-1,1701:-1,1201:-1,1204:-1,1207:-1,1601:-1,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1122:-1,1119:-1,1123:-1,1126:-1,1157:-1,1129:-1,1116:-1,1301:-1,1771:-1
+//ama_in01.gat,103,24,1 shop Armor Dealer 48,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2220:-1,2226:-1,2301:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1
+//ama_in01.gat,101,18,8 shop Weapon Dealer 47,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
+//2nd set
+//|<= end of removed shops
+ama_in01.gat,89,28,4 shop Armor Dealer 757,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2314:-1,2627:-1
+ama_in01.gat,102,28,4 shop Weapon Dealer 766,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
+ama_in01.gat,24,30,4 shop Tool Dealer 763,1750:-1,1770:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+amatsu.gat,205,150,2 shop Ingredient Seller 83,7453:-1,579:-1
+//| Official Ninja Shops
+que_ng.gat,72,31,2 shop Shuriken Dealer 83,13250:-1,13251:-1,13252:-1,13253:-1,13254:-1
+que_ng.gat,73,26,5 shop Tool Dealer 83,2117:-1,7521:-1,7522:-1,7523:-1,7524:-1
+
+//=======================================================
+//AYOTHAYA
+//=======================================================
+ayo_in01.gat,18,182,8 shop Tool Dealer 840,1750:-1,1753:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+ayo_in01.gat,90,192,3 shop Weapon Dealer 843,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
+ayo_in01.gat,90,160,1 shop Armor Dealer 842,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2328:-1,2627:-1
+ayothaya.gat,202,178,4 shop Food Seller 750,7456:-1,577:-1
+
+//=======================================================
+//COMODO
+//=======================================================
+cmd_in01.gat,117,165,4 shop Armor Dealer 101,2226:-1,2228:-1,2103:-1,2105:-1,2405:-1,2503:-1,2505:-1,2305:-1,2321:-1,2307:-1,2309:-1,2335:-1,2312:-1,2314:-1,2316:-1
+cmd_in01.gat,131,165,4 shop Weapon Dealer 49,1901:-1,1903:-1,1905:-1,1907:-1,1950:-1,1952:-1,1954:-1,1956:-1,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
+cmd_in01.gat,79,182,4 shop Tool Dealer 83,1753:-1,501:-1,502:-1,503:-1,504:-1,645:-1,656:-1,657:-1,601:-1,602:-1,611:-1,1065:-1
+comodo.gat,296,125,4 shop Souvenir Merchant 101,965:-1,964:-1
+comodo.gat,244,296,7 shop Item Collector 74,909:-1
+comodo.gat,224,164,4 shop Food Seller 750,7455:-1
+
+cmd_fild07.gat,257,126,5 shop Tool Dealer 83,1770:-1,501:-1,502:-1,503:-1,504:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1
+cmd_fild07.gat,250,98,2 shop Weapon Dealer 49,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
+cmd_fild07.gat,277,85,4 shop Armor Dealer 101,2226:-1,2228:-1,2103:-1,2105:-1,2405:-1,2503:-1,2505:-1,2305:-1,2321:-1,2307:-1,2309:-1,2335:-1,2312:-1,2314:-1,2316:-1
+
+//=======================================================
+//EINBECH
+//=======================================================
+ein_in01.gat,189,15,0 shop Tool Dealer 850,1750:-1,1752:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+
+//=======================================================
+//EINBROCH
+//=======================================================
+ein_in01.gat,106,27,4 shop One-Hand Weapon Dealer 850,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1119:-1,1122:-1,1123:-1,1126:-1,1129:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1301:-1,1401:-1,1404:-1,1407:-1,1501:-1,1504:-1,1507:-1,1510:-1,1513:-1,1516:-1,1519:-1,1522:-1,1801:-1,1803:-1,1805:-1,1807:-1,1809:-1,1811:-1,1771:-1
+ein_in01.gat,109,27,4 shop Two-Hand Weapon Dealer 850,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1351:-1,1354:-1,1357:-1,1360:-1,1410:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1250:-1,1252:-1,1254:-1
+ein_in01.gat,119,26,4 shop Weapon Dealer 855,1247:-1,1248:-1,1249:-1,13000:-1
+einbroch.gat,138,66,3 shop Head Gear Dealer 850,5114:-1,2218:-1
+einbroch.gat,82,199,3 shop Paddler 855,512:-1,645:-1,1750:-1,501:-1
+//Official Gunslingers shops.
+que_ng.gat,179,91,4 shop Gunner#Gun Seller 900,13150:-1,13102:-1,13151:-1,13154:-1,13155:-1
+que_ng.gat,180,79,4 shop Gunner#Ammo Seller 900,13200:-1,13201:-1,13202:-1
+//=======================================================
+//GEFFEN
+//=======================================================
+geffen_in.gat,25,177,1 shop Armor Dealer 66,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
+geffen_in.gat,29,177,1 shop Weapon Dealer 47,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1,1771:-1
+geffen_in.gat,22,171,6 shop Weapon Dealer 84,1146:-1,1245:-1
+geffen_in.gat,74,144,1 shop Trader 66,909:-1,911:-1,910:-1,912:-1
+geffen_in.gat,77,167,1 shop Tool Dealer 68,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,2241:-1,645:-1,656:-1
+geffen_in.gat,77,173,1 shop Magical Tool Trader 64,717:-1,1601:-1,1604:-1,1607:-1,1610:-1,2232:-1,2321:-1,2332:-1
+geffen_in.gat,171,123,1 shop Tool Dealer 64,1092:-1,1093:-1
+geffen.gat,193,152,3 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+geffen.gat,135,64,3 shop Ingredient Seller 750,580:-1,7482:-1 //temp coords, temp goods
+
+//=======================================================
+//GONRYUN
+//=======================================================
+gonryun.gat,147,84,4 shop Tool Dealer 777,1750:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+gonryun.gat,174,101,4 shop Weapon Dealer 774,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
+gonryun.gat,173,84,4 shop Armor Dealer 770,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2305:-1,2321:-1,2332:-1,2328:-1,2627:-1
+gonryun.gat,148,101,4 shop Food Seller 750,580:-1,7452:-1
+
+//=======================================================
+//HUGEL
+//=======================================================
+hugel.gat,105,169,5 shop Milk Merchant 53,519:-1
+hugel.gat,77,167,3 shop Food Seller 892,522:-1,512:-1,513:-1,515:-1,516:-1,535:-1
+hu_in01.gat,241,368,2 shop Tool Dealer 53,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+hu_in01.gat,252,368,2 shop Tool Trader 90,717:-1,2201:-1,910:-1,528:-1
+hu_in01.gat,100,390,2 shop Bow Dealer 86,1701:-1,1707:-1,1718:-1,1714:-1
+hu_in01.gat,94,390,2 shop Weapon Dealer 898,1116:-1,1154:-1,1354:-1,1201:-1
+hu_in01.gat,94,313,2 shop Armor Dealer 86,2224:-1,2232:-1,2226:-1,2101:-1,2103:-1,2401:-1,2501:-1,2307:-1,2105:-1
+
+//=======================================================
+//IZLUDE
+//=======================================================
+izlude_in.gat,60,127,4 shop Weapon Dealer 98,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1101:-1,1104:-1,1107:-1,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1301:-1,1771:-1
+izlude_in.gat,70,127,4 shop Armor Dealer 101,2103:-1,2105:-1,2403:-1,2405:-1,2503:-1,2505:-1,2226:-1,2228:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1
+izlude_in.gat,115,61,1 shop Tool Dealer 47,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,1065:-1,645:-1,656:-1
+izlude.gat,121,138,1 shop Butcher 54,517:-1
+izlude.gat,127,120,1 shop Fruit Merchant 72,512:-1,513:-1,515:-1,516:-1
+izlude.gat,137,126,3 shop Milk Merchant 701,519:-1
+izlude.gat,164,138,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+
+//=======================================================
+//LOUYANG
+//=======================================================
+lou_in02.gat,121,181,5 shop Armor Dealer 818,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2211:-1,2305:-1,2328:-1,2332:-1,2321:-1
+lou_in02.gat,130,182,5 shop Weapon Dealer 774,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1
+lou_in02.gat,239,176,5 shop Tool Dealer 818,1750:-1,1753:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1
+louyang.gat,255,123,4 shop Food Seller 750,7454:-1,577:-1
+
+//=======================================================
+//LIGHTHALZEN
+//=======================================================
+lighthalzen.gat,69,75,5 shop Fruit Gardener 102,512:-1,513:-1
+lighthalzen.gat,112,44,8 shop Flower Girl 90,712:-1,744:-1,748:-1
+lighthalzen.gat,126,126,4 shop Food Seller 83,7456:-1,7452:-1
+lighthalzen.gat,124,129,8 shop Vegetable Gardener 91,515:-1,516:-1,535:-1
+lighthalzen.gat,222,191,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+lhz_in02.gat,286,95,4 shop Begginer's Merchant 62,1621:-1,5112:-1,2416:-1,2113:-1,2512:-1
+lhz_in02.gat,271,99,4 shop Armor Dealer 851,2101:-1,2103:-1,2403:-1,2405:-1,2503:-1,2321:-1,2314:-1,2309:-1,2335:-1,2628:-1
+lhz_in02.gat,276,99,4 shop Weapon Dealer 851,1201:-1,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1,13003:-1,1771:-1
+lhz_in02.gat,273,35,4 shop Wand Dealer 854,1601:-1,1604:-1,1607:-1,1617:-1,1619:-1
+lhz_in02.gat,105,21,3 shop Jewel Seller 91,721:-1,723:-1,726:-1,728:-1,729:-1,730:-1,2613:-1
+lhz_in02.gat,17,220,4 shop Vegetable Merchant 91,515:-1,516:-1,535:-1
+lhz_in02.gat,21,220,5 shop Fruit Merchant 102,512:-1,513:-1
+lhz_in02.gat,32,218,6 shop Butcher 54,517:-1
+lhz_in02.gat,38,145,4 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
+lhz_in02.gat,47,148,5 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-1,7170:-1
+lhz_in02.gat,31,145,4 shop Tool Dealer 90,611:-1,503:-1,504:-1,506:-1,656:-1,601:-1,602:-1,1065:-1,610:-1,1750:-1
+lhz_in02.gat,85,215,4 shop Doll Merchant 91,740:-1,741:-1,742:-1
+lhz_in02.gat,87,208,2 shop Eyewear Merchant 715,2243:-1,2212:-1,2242:-1,2241:-1
+lhz_in03.gat,239,106,4 shop Tool Dealer 850,501:-1,502:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1,611:-1
+
+//=======================================================
+//LUTIE
+//=======================================================
+xmas_in.gat,39,38,4 shop Tool Dealer 83,501:-1,502:-1,503:-1,504:-1,506:-1,611:-1,601:-1,602:-1,610:-1
+xmas_in.gat,168,104,4 shop Armor Dealer 101,2228:-1,2103:-1,2105:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1,2505:-1,2405:-1
+xmas_in.gat,169,34,2 shop Gift Merchant 702,2612:-1,744:-1,748:-1,736:-1,746:-1,740:-1,2613:-1
+xmas_in.gat,174,98,2 shop Weapon Dealer 49,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1771:-1
+xmas.gat,144,207,4 shop Tool Dealer 83,601:-1,602:-1
+
+//=======================================================
+//MORROC
+//=======================================================
+morocc_in.gat,141,67,1 shop Weapon Dealer 58,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1219:-1,1222:-1,1250:-1,1252:-1,1254:-1,1771:-1
+morocc_in.gat,141,60,1 shop Armor Dealer 58,2101:-1,2103:-1,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2218:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2307:-1,2309:-1,2335:-1
+morocc.gat,35,69,1 shop Trader 89,2609:-1,1516:-1,1522:-1
+morocc.gat,139,92,1 shop Trader 99,513:-1,513:-1,513:-1,513:-1,513:-1,513:-1
+morocc.gat,145,44,1 shop Jewel Seller 99,730:-1,2613:-1
+morocc.gat,147,102,5 shop Tool Dealer 93,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,645:-1,656:-1
+morocc.gat,151,243,1 shop Tool Dealer 99,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,2242:-1,645:-1,656:-1
+morocc.gat,157,72,6 shop Butcher 49,517:-1
+morocc.gat,166,51,1 shop Jewel Seller 102,721:-1,723:-1,726:-1,728:-1,729:-1
+morocc.gat,170,101,3 shop Tool Dealer 85,911:-1,528:-1,919:-1,925:-1
+morocc.gat,206,250,1 shop Tool Dealer 85,911:-1,528:-1,919:-1,925:-1
+morocc.gat,244,134,1 shop Trader 93,2612:-1
+morocc.gat,259,193,1 shop Trader 99,747:-1
+morocc.gat,268,193,1 shop Trader 93,748:-1
+morocc.gat,269,167,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+morocc.gat,120,97,5 shop Ingredient Seller 86,7452:-1,7453:-1,7454:-1,7455:-1,7456:-1
+//morocc_in.gat,65,37,4 shop Miner 48,1010:-1,1011:-1
+morocc_in.gat,132,57,0 shop Weapon Dealer 99,1146:-1,1245:-1
+
+//=======================================================
+//NIFLHEIM
+//=======================================================
+nif_in.gat,35,84,3 shop Weapon Dealer 795,1301:-1,1351:-1,1354:-1,1357:-1,1360:-1
+nif_in.gat,35,91,3 shop Armor Dealer 796,2501:-1,2501:-1,2503:-1,2503:-1,2505:-1,2505:-1
+nif_in.gat,154,21,3 shop Tool Dealer 798,535:-1,1062:-1,902:-1,7106:-1,537:-1,7154:-1,1052:-1,934:-1
+//nif_in.gat,35,84,3 shop Weapon Dealer 795,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1
+//nif_in.gat,35,91,3 shop Armor Dealer 796,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
+//nif_in.gat,154,21,3 shop Tool Dealer 798,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1,645:-1,656:-1
+//niflheim.gat,201,209,3 shop Milk Merchant 794,519:-1
+//niflheim.gat,224,185,3 shop Fruit Merchant 795,512:-1,513:-1
+//niflheim.gat,209,161,3 shop Butcher 794,517:-1,528:-1
+//niflheim.gat,205,152,3 shop Gift Merchant 795,734:-1,735:-1,736:-1,737:-1,746:-1
+niflheim.gat,205,158,1 shop Ingredient Seller 795,581:-1 //temp coords, temp spr ID
+
+//=======================================================
+//PAYON
+//=======================================================
+payon_in01.gat,7,119,4 shop Weapon Dealer 76,1750:-1,1751:-1,1101:-1,1104:-1,1107:-1,1201:-1,1204:-1,1207:-1,1601:-1,1701:-1,1704:-1,1707:-1,1710:-1,1713:-1,1714:-1,1718:-1,1771:-1
+payon_in01.gat,5,129,6 shop Weapon Dealer 703,1146:-1,1245:-1
+payon_in01.gat,15,119,4 shop Armor Dealer 77,2401:-1,2403:-1,2405:-1,2501:-1,2503:-1,2505:-1,2208:-1,2211:-1,2212:-1,2301:-1,2303:-1,2305:-1,2321:-1,2328:-1,2332:-1,2309:-1,2330:-1,2628:-1
+payon_in01.gat,5,49,0 shop Tool Dealer 88,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1
+payon_in02.gat,87,34,1 shop Tool Dealer 98,1750:-1,1751:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,645:-1,656:-1
+payon.gat,159,96,5 shop Tool Dealer 88,1750:-1,501:-1,645:-1,601:-1,602:-1
+payon.gat,205,119,4 shop Food Seller 750,7455:-1
+//Not Shure About Pet Shop
+payon.gat,104,63,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+pay_arche.gat,125,108,1 shop Milk Merchant 90,519:-1
+pay_arche.gat,132,101,1 shop Vegetable Merchant 102,515:-1,516:-1
+pay_arche.gat,140,124,1 shop Butcher 87,517:-1,528:-1
+
+//=======================================================
+//PRONTERA
+//=======================================================
+prontera.gat,73,134,1 shop Milk Merchant 90,519:-1
+prontera.gat,104,49,1 shop Fruit Merchant 102,512:-1,513:-1
+prontera.gat,64,125,1 shop Butcher 87,517:-1,528:-1
+prontera.gat,58,182,1 shop Flower Girl 96,712:-1,744:-1
+prontera.gat,113,42,1 shop Flower Lady 90,712:-1,744:-1
+prontera.gat,105,87,1 shop Gift Merchant 91,734:-1,735:-1,736:-1,737:-1,746:-1
+prontera.gat,218,211,4 shop Pet Merchant 125,537:-1,643:-1,10013:-1,10014:-1
+prontera.gat,248,153,1 shop Doll Merchant 85,740:-1,741:-1,742:-1
+prontera.gat,156,212,2 shop Food Seller 700,7454:-1,7452:-1,7482:-1,580:-1
+prontera.gat,48,58,7 shop Vegetable Gardener 91,515:-1,516:-1,535:-1
+prt_church.gat,108,124,1 shop Nun 79,2608:-1,2216:-1,2323:-1,2325:-1,1501:-1,1504:-1,1507:-1,1510:-1,1513:-1,1519:-1,5092:-1
+prt_fild05.gat,290,221,1 shop Tool Dealer 83,1750:-1,611:-1,501:-1,502:-1,506:-1,601:-1,602:-1,645:-1,656:-1
+prt_in.gat,211,169,1 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-1,7170:-1
+prt_in.gat,126,76,1 shop Tool Dealer 53,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1065:-1,2239:-1,645:-1,656:-1
+prt_in.gat,172,130,1 shop Weapon Dealer 54,1750:-1,1751:-1,1701:-1,1201:-1,1204:-1,1207:-1,1601:-1,1101:-1,1104:-1,1107:-1,1110:-1,1113:-1,1122:-1,1119:-1,1123:-1,1126:-1,1157:-1,1129:-1,1116:-1,1301:-1,1771:-1
+prt_in.gat,172,132,1 shop Armor Dealer 48,2101:-1,2103:-1,2401:-1,2403:-1,2501:-1,2503:-1,2220:-1,2226:-1,2301:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2627:-1
+prt_in.gat,171,140,1 shop Weapon Dealer 47,1401:-1,1404:-1,1407:-1,1451:-1,1454:-1,1457:-1,1460:-1,1463:-1,1410:-1
+//prt_in.gat,56,69,4 shop Miner 48,1010:-1,1011:-1
+prt_in.gat,164,140,4 shop Weapon Dealer 66,1146:-1,1245:-1
+
+//=======================================================
+//RACHEL
+//=======================================================
+ra_in01.gat,175,364,3 shop Armor Dealer 919,2101:-1,2103:-1,2403:-1,2405:-1,2503:-1,2321:-1,2314:-1,2309:-1,2335:-1,2628:-1
+ra_in01.gat,254,300,3 shop Tool Dealer 931,512:-1,513:-1
+ra_in01.gat,257,269,3 shop Tool Dealer 919,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,611:-1,1065:-1,610:-1
+ra_in01.gat,176,389,3 shop Weapon Dealer 931,1201:-1,1207:-1,1216:-1,1107:-1,1122:-1,1116:-1,1154:-1,1407:-1,1457:-1,1354:-1,1519:-1,13003:-1,1601:-1,1604:-1,1607:-1
+rachel.gat,65,80,0 shop Vegetable Gardener 919,515:-1,535:-1,516:-1
+
+//=======================================================
+//TURTLE ISLAND
+//=======================================================
+tur_dun01.gat,158,54,6 shop Tool Dealer 99,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,645:-1,656:-1
+// Spectacles: missing as second item in list
+// Luxury Sunglases: not sure of item/price.
+
+//=======================================================
+//UMBALA
+//=======================================================
+um_in.gat,104,124,3 shop Item Merchant 788,512:15,515:15,535:15,516:15,513:15,517:50,528:60,537:1000,601:60,602:300,645:800,656:1500,610:4000
+um_in.gat,160,125,3 shop Weapon Merchant 789,1501:120,1504:1600,1507:9000,1510:16000,1513:41000,1519:23000,1807:53000,1811:58000,1809:67000
+um_in.gat,151,125,4 shop Armor Merchant 49,2103:-1,2105:-1,2403:-1,2405:-1,2503:-1,2505:-1,2226:-1,2228:-1,2303:-1,2305:-1,2328:-1,2307:-1,2309:-1,2312:-1,2314:-1,2316:-1
+//um_in.gat,159,123,3 shop Weapon Merchant 52,1750:-1,1751:-1,1701:-1,1601:-1,1201:-1,1204:-1,1207:-1,1101:-1,1104:-1,1107:-1,1116:-1,1151:-1,1154:-1,1157:-1,1160:-1,1301:-1
+//um_in.gat,98,124,3 shop Tool Merchant 47,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,525:-1,601:-1,602:-1,1750:-1,1065:-1
+//um_in.gat,103,124,4 shop Food Merchant 91,515:-1,516:-1,535:-1,519:-1,517:-1
+umbala.gat,101,154,4 shop Food Seller 750,7456:-1,577:-1
+
+
+//=======================================================
+//YUNO
+//=======================================================
+yuno.gat,65,122,4 shop Fruit Merchant 93,512:-1,513:-1,515:-1,516:-1
+yuno.gat,217,97,4 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1
+yuno.gat,226,106,5 shop Trader 97, 911:-1, 910:-1, 912:-1
+yuno.gat,197,115,4 shop Pet Merchant 124, 537:-1, 643:-1, 10013:-1, 10014:-1
+yuno.gat,205,104,4 shop Equip Dealer 84, 2340:-1, 2341:-1, 2411:-1, 2222:-1, 2230:-1, 1721:-1
+yuno.gat,163,187,5 shop Magic Tool Dealer 90,717:-1,1601:-1,1604:-1,1607:-1,1610:-1,2232:-1,2321:-1,2332:-1
+yuno_in01.gat,25,34,4 shop Tool Dealer 83,611:-1,1750:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1
+yuno_in01.gat,104,35,4 shop Weapon Dealer 49,1750:-1,1751:-1,1101:-1,1701:-1,1201:-1,1204:-1,1207:-1,1210:-1,1213:-1,1216:-1,1601:-1,1604:-1,1607:-1,1610:-1,1771:-1
+yuno_in01.gat,112,25,5 shop Armor Dealer 101,2628:-1,2101:-1,2107:-1,2401:-1,2501:-1,2230:-1,2301:-1,2303:-1,2305:-1,2321:-1,2332:-1
+yuno_in03.gat,176,22,3 shop Scroll Seller 89,7433:-1 //Temp shop in Yuno that sells Blank Scrolls
+yuno.gat,133,171,2 shop Ingredient Seller 750,7457:-1,7482:-1
+
+
+//=======================================================
+// ST. CAPITOLINA ABBEY
+//======================================
+//= Monk shop, sells Knuckle weapons)
+//=======================================================
+prt_monk.gat,135,263,3 shop Blacksmith 726,1801:-1,1803:-1,1805:-1
+
+//===== Additional Comments(old): =================================
+//= swapped shop titles in GONRYUN, thanks to Kashy
+//= 1.3a Fixed Louyang map name. Added additional shops in Yuno. [kobra_k88]
+//= 1.4 Added Niflheim Shops
+//= 1.5 New Payon Locations [Darkchild]
+//= Moved shops in Umbala.txt here. Commented out the duplicate ones.[kobra_k88]
+//= 1.6 Removed GRAPE ID 514 from shops (caused exploits)
+//= 1.7 Removed juices from custom amatsu shops (it's a quest item + levelup exploit)
+//= 1.8 Corrected Niflheim Shops and Morroc Jewel Merchant [celest]
+//= 1.9 Updated Louyang shops thanks to MasterOfMuppets
+//= 1.10 Lutie Tools coords [Yor]
+//= 1.11 Added Belts to Prontera/Aldebaran shops, thanks to reddozen [Lupus]
+//= 1.12 official Ayothaya Shops, thanks to MasterOfMuppets [Lupus]
+//= 1.13 Added 5092 Coif into Prontera Church shop [Lupus]
+//= 1.14 Added Lighthalzen,Einbroch,Einbech shops. Updated Prontera,Morroc,Payon shops [Lupus]
+//= 1.15 Added Venom Knives into every Weapon Shop (that sells Knife[3]) [Lupus]
+//= 1.15a Fixed a small typo in alberta's weapon shop, thanks to reddozen for the fix [MasterOfMuppets]
+//= 1.16 Added a temp shop in Yuno to sell Blank scrolls, thanks to reddozen [MasterOfMuppets]
+//= 1.17 Added wand of hypnotist to the Lighthalzen weapon shop [MasterOfMuppets]
+//= 1.18 Fixed some shops based on kRO shots [Poki#3]
+//= 1.19 Added Hugel and fixed Payon shops based on kRO shots [Poki#3]
+//= 1.19a Added Food Seller selling Mastela Fruit in Hugel (Update item_db for the correct price!) [Poki#3]
+//= 1.20 Added 3 weapons shops, thx2 Muad_Dib [Lupus]
+//= 1.21 Added another weapon dealer to Einbroch, thanks to Muad_Dib [MasterOfMuppets]
+//= - Fixed up the missing sprites for you Lupus :)
+//= - Guys, I suggest we crop these comments and put them at the bottom soon
//============================================================ \ No newline at end of file
diff --git a/npc/merchants/shuriken_maker.txt b/npc/merchants/shuriken_maker.txt
index 1ae9583b1..2e09ff24a 100644
--- a/npc/merchants/shuriken_maker.txt
+++ b/npc/merchants/shuriken_maker.txt
@@ -1,161 +1,161 @@
-//===== eAthena Script ========================================
-//= Shuriken Blacksmith
-//===== By: ==================================================
-//= Au{R}oN
-//===== Current Version: =====================================
-//= 1.2c
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Shuriken Weapon Maker.
-//===== Additional Comments: =================================
-//= Converted from Aegis
-//= 1.0 Added the 4 Shuriken. [Au{R}oN]
-//= 1.1 Fix getitem bugs and add if ninja job check. [Au{R}oN]
-//= 1.2 more bugs fixed,wrong labels, missing stuf, etc[Lupus]
-//= 1.2a added missing next;
-//= 1.2b Thanks to $ephiroth, fixed wrong ingredient lists
-//============================================================
-
-que_ng.gat,22,62,3 script Taitsu 709,{
-
- mes "[Taitsu]";
- if(Class!=Job_Ninja){
- mes "Sorry, but I can use my ability only for Ninja Class.";
- close;
- }
- mes "Hello";
- mes "I'm Taitsu, the Blacksmith of Fuuma Ninja.";
- next;
- mes "[Taitsu]";
- mes "Due to a burst of interest, my life became very miserable.";
- mes "So, I'm taking everything from the beginning, but haven't made weapon in a long time...";
- next;
- mes "[Taitsu]";
- mes "However, in terms of making Fuuma weapons, no one can make them any better then mine.";
- mes "Here, take a look.";
- next;
- menu "Fuuma Shuriken Beneki",M_BENEKI,"Fuuma Shuriken Daisharin",M_DAIS,
- "Fuuma Shuriken Daisharin [4]",M_DAIS4,"Fuuma Shuriken Rekka",M_REKKA;
-
-//=====================BENEKI========================
-M_BENEKI:
- mes "[Taitsu]";
- mes "For making ^FF0000Fuuma Shuriken Beneki^000000";
- mes "you need these items:";
- mes "50 Steel, 20 Harpy's Feathers, 5 Oridecon, and 90.000z.";
- mes "Do you want it?";
- next;
- menu "Yes",-,"No Thanks",M_NOPE;
-
- mes "[Taitsu]";
- mes "So let me check for your items...";
- set @z,90000;
- if(Zeny < @z) goto L_NOZENY;
- if(countitem(999)<50 || countitem(7115)<20 || countitem(984)<5) goto L_NOITEMS;
- set Zeny,Zeny-@z;
- delitem 999,50;
- delitem 7115,20;
- delitem 984,5;
- next;
- getitem 13300,1;
- mes "[Taitsu]";
- mes "Ok, enjoy with your new weapon.";
- close;
-
-//=====================DAISHARIN========================
-M_DAIS:
- mes "[Taitsu]";
- mes "For making ^FF0000Fuuma Shuriken Daisharin^000000";
- mes "you need these items:";
- mes "30 Steel, 100 Tassels, 2 Oridecon, and 40.000z.";
- mes "Do you want it?";
- next;
- menu "Yes",-,"No Thanks",M_NOPE;
-
- mes "[Taitsu]";
- mes "So let me check for your items...";
- set @z,40000;
- if(Zeny < @z) goto L_NOZENY;
- if(countitem(999)<30 || countitem(7301)<100 || countitem(984)<2) goto L_NOITEMS;
- set Zeny,Zeny-@z;
- delitem 999,30;
- delitem 7301,100;
- delitem 984,2;
- next;
- getitem 13301,1;
- mes "[Taitsu]";
- mes "Ok, enjoy with your new weapon.";
- close;
-
-//=====================DAISHARIN4========================
-M_DAIS4:
- mes "[Taitsu]";
- mes "For making ^FF0000Fuuma Shuriken Daisharin[4]^000000";
- mes "you need these items:";
- mes "20 Cracked Diamonds, 1 Fuuma Shuriken Daisharin, 3 Oridecon, and 40.000z.";
- mes "Do you want it?";
- next;
- menu "Yes",-,"No Thanks",M_NOPE;
-
- mes "[Taitsu]";
- mes "So let me check for your items...";
- set @z,40000;
- if(Zeny < @z) goto L_NOZENY;
- if(countitem(733)<20 || countitem(13301)<1 || countitem(984)<3) goto L_NOITEMS;
- set Zeny,Zeny-@z;
- delitem 733,20;
- delitem 13301,1;
- delitem 984,3;
- next;
- getitem 13302,1;
- mes "[Taitsu]";
- mes "Ok, enjoy with your new weapon.";
- close;
-
-//=====================REKKA========================
-M_REKKA:
- mes "[Taitsu]";
- mes "For making ^FF0000Fuuma Shuriken Rekka^000000";
- mes "you need these items:";
- mes "50 Steel, 100 Live Coal, 100 Burning Heart, 50 Burning Stone and 78.000z.";
- mes "Do you want it?";
- next;
- menu "Yes",-,"No Thanks",M_NOPE;
-
- mes "[Taitsu]";
- mes "So let me check for your items...";
- set @z,78000;
- if(Zeny < @z) goto L_NOZENY;
- if(countitem(999)<50 || countitem(7098)<100 || countitem(7097)<100 || countitem(7521)<50) goto L_NOITEMS;
- set Zeny,Zeny-@z;
- delitem 999,50;
- delitem 7098,100;
- delitem 7097,100;
- delitem 7521,50;
- next;
- getitem 13303,1;
- mes "[Taitsu]";
- mes "Ok, enjoy with your new weapon.";
- close;
-
-//=====================I'M SORRY========================
-L_NOITEMS:
- next;
- mes "[Taitsu]";
- mes "Sorry, but you don't have all the required items.";
- emotion e_sry;
- close;
-
-L_NOZENY:
- next;
- mes "[Taitsu]";
- mes "I'm sorry, but you need "+@z+"z";
- emotion e_cash;
- close;
-
-M_NOPE:
- mes "[Taitsu]";
- mes "OK, came back when you want.";
- close;
+//===== eAthena Script ========================================
+//= Shuriken Blacksmith
+//===== By: ==================================================
+//= Au{R}oN
+//===== Current Version: =====================================
+//= 1.2c
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Shuriken Weapon Maker.
+//===== Additional Comments: =================================
+//= Converted from Aegis
+//= 1.0 Added the 4 Shuriken. [Au{R}oN]
+//= 1.1 Fix getitem bugs and add if ninja job check. [Au{R}oN]
+//= 1.2 more bugs fixed,wrong labels, missing stuf, etc[Lupus]
+//= 1.2a added missing next;
+//= 1.2b Thanks to $ephiroth, fixed wrong ingredient lists
+//============================================================
+
+que_ng.gat,22,62,3 script Taitsu 709,{
+
+ mes "[Taitsu]";
+ if(Class!=Job_Ninja){
+ mes "Sorry, but I can use my ability only for Ninja Class.";
+ close;
+ }
+ mes "Hello";
+ mes "I'm Taitsu, the Blacksmith of Fuuma Ninja.";
+ next;
+ mes "[Taitsu]";
+ mes "Due to a burst of interest, my life became very miserable.";
+ mes "So, I'm taking everything from the beginning, but haven't made weapon in a long time...";
+ next;
+ mes "[Taitsu]";
+ mes "However, in terms of making Fuuma weapons, no one can make them any better then mine.";
+ mes "Here, take a look.";
+ next;
+ menu "Fuuma Shuriken Beneki",M_BENEKI,"Fuuma Shuriken Daisharin",M_DAIS,
+ "Fuuma Shuriken Daisharin [4]",M_DAIS4,"Fuuma Shuriken Rekka",M_REKKA;
+
+//=====================BENEKI========================
+M_BENEKI:
+ mes "[Taitsu]";
+ mes "For making ^FF0000Fuuma Shuriken Beneki^000000";
+ mes "you need these items:";
+ mes "50 Steel, 20 Harpy's Feathers, 5 Oridecon, and 90.000z.";
+ mes "Do you want it?";
+ next;
+ menu "Yes",-,"No Thanks",M_NOPE;
+
+ mes "[Taitsu]";
+ mes "So let me check for your items...";
+ set @z,90000;
+ if(Zeny < @z) goto L_NOZENY;
+ if(countitem(999)<50 || countitem(7115)<20 || countitem(984)<5) goto L_NOITEMS;
+ set Zeny,Zeny-@z;
+ delitem 999,50;
+ delitem 7115,20;
+ delitem 984,5;
+ next;
+ getitem 13300,1;
+ mes "[Taitsu]";
+ mes "Ok, enjoy with your new weapon.";
+ close;
+
+//=====================DAISHARIN========================
+M_DAIS:
+ mes "[Taitsu]";
+ mes "For making ^FF0000Fuuma Shuriken Daisharin^000000";
+ mes "you need these items:";
+ mes "30 Steel, 100 Tassels, 2 Oridecon, and 40.000z.";
+ mes "Do you want it?";
+ next;
+ menu "Yes",-,"No Thanks",M_NOPE;
+
+ mes "[Taitsu]";
+ mes "So let me check for your items...";
+ set @z,40000;
+ if(Zeny < @z) goto L_NOZENY;
+ if(countitem(999)<30 || countitem(7301)<100 || countitem(984)<2) goto L_NOITEMS;
+ set Zeny,Zeny-@z;
+ delitem 999,30;
+ delitem 7301,100;
+ delitem 984,2;
+ next;
+ getitem 13301,1;
+ mes "[Taitsu]";
+ mes "Ok, enjoy with your new weapon.";
+ close;
+
+//=====================DAISHARIN4========================
+M_DAIS4:
+ mes "[Taitsu]";
+ mes "For making ^FF0000Fuuma Shuriken Daisharin[4]^000000";
+ mes "you need these items:";
+ mes "20 Cracked Diamonds, 1 Fuuma Shuriken Daisharin, 3 Oridecon, and 40.000z.";
+ mes "Do you want it?";
+ next;
+ menu "Yes",-,"No Thanks",M_NOPE;
+
+ mes "[Taitsu]";
+ mes "So let me check for your items...";
+ set @z,40000;
+ if(Zeny < @z) goto L_NOZENY;
+ if(countitem(733)<20 || countitem(13301)<1 || countitem(984)<3) goto L_NOITEMS;
+ set Zeny,Zeny-@z;
+ delitem 733,20;
+ delitem 13301,1;
+ delitem 984,3;
+ next;
+ getitem 13302,1;
+ mes "[Taitsu]";
+ mes "Ok, enjoy with your new weapon.";
+ close;
+
+//=====================REKKA========================
+M_REKKA:
+ mes "[Taitsu]";
+ mes "For making ^FF0000Fuuma Shuriken Rekka^000000";
+ mes "you need these items:";
+ mes "50 Steel, 100 Live Coal, 100 Burning Heart, 50 Burning Stone and 78.000z.";
+ mes "Do you want it?";
+ next;
+ menu "Yes",-,"No Thanks",M_NOPE;
+
+ mes "[Taitsu]";
+ mes "So let me check for your items...";
+ set @z,78000;
+ if(Zeny < @z) goto L_NOZENY;
+ if(countitem(999)<50 || countitem(7098)<100 || countitem(7097)<100 || countitem(7521)<50) goto L_NOITEMS;
+ set Zeny,Zeny-@z;
+ delitem 999,50;
+ delitem 7098,100;
+ delitem 7097,100;
+ delitem 7521,50;
+ next;
+ getitem 13303,1;
+ mes "[Taitsu]";
+ mes "Ok, enjoy with your new weapon.";
+ close;
+
+//=====================I'M SORRY========================
+L_NOITEMS:
+ next;
+ mes "[Taitsu]";
+ mes "Sorry, but you don't have all the required items.";
+ emotion e_sry;
+ close;
+
+L_NOZENY:
+ next;
+ mes "[Taitsu]";
+ mes "I'm sorry, but you need "+@z+"z";
+ emotion e_cash;
+ close;
+
+M_NOPE:
+ mes "[Taitsu]";
+ mes "OK, came back when you want.";
+ close;
} \ No newline at end of file
diff --git a/npc/merchants/socket_enchant.txt b/npc/merchants/socket_enchant.txt
index 6685231b9..ba61b71e0 100644
--- a/npc/merchants/socket_enchant.txt
+++ b/npc/merchants/socket_enchant.txt
@@ -1,844 +1,844 @@
-//===== eAthena Script =======================================
-//= Socket Enchant
-//===== By: ==================================================
-//= Sousuke_PL
-//===== Current Version: =====================================
-//= 0.3
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= item loses all element refinement and upgrades but
-//= cards too?
-//===== Additional Comments: =================================
-//= 0.1a added missing L_No: to 2 funcs [Lupus]
-//= 0.1b Removed duplicates [Toms]
-//= 0.2 Added missing next;'s [Evera]
-//= 0.3 Fixed Zweihander[+] id [Lupus]
-//============================================================
-
-
-lhz_in02.gat,281,35,5 script Socket Enchant 84,{
-
- mes "[Socket Enchant]";
- mes "Hello.";
- mes "How can I help you?";
- next;
- menu "Upgrade my item",-,"Nothing",L_Not;
-
- mes "[Socket Enchant]";
- mes "This is weapon or armor?";
- next;
- menu "Weapon",L_Weapon1,"Armor",L_Armor1;
-
-
-//============================================================
-//= Weapon
-//============================================================
-
- L_WaepJump:
- mes "[Socket Enchant]";
- mes "Choose the number of page. Type 1 to 5:";
- next;
- input @weapsite;
- if(@weapsite > 5 || @weapsite < 1) goto L_WaepJump;
-
- if(@weapsite == 1) goto L_Weapon1;
- if(@weapsite == 2) goto L_Weapon2;
- if(@weapsite == 3) goto L_Weapon3;
- if(@weapsite == 4) goto L_Weapon4;
- if(@weapsite == 5) goto L_Weapon5;
-
-
- L_Weapon1:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Trident[2]",Trident,"Rope[3]",Rope,"Violin[3]",Violin,"Chain[2]",Chain,"Gladius[2]",Gladius,"Gakkung Bow[1]",Gakkung_Bow,"Next",L_Weapon2,"Jump to page...",L_WaepJump;
-
- L_Weapon2:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Pike[3]",Pike,"Haedonggum[1]",Haedonggum,"Lute[2]",Lute,"Wire Whip[2]",Wire_Whip,"Waghnak[3]",Waghnak,"Arbalest[1]",Arbalest,"Next",L_Weapon3,"Jump to page...",L_WaepJump;
-
- L_Weapon3:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Hunter Bow",Hunter_Bow,"(Int) Survivor's Rod",Int_Survivors_Rod,"Zweihander",Zweihander,"Flamberge",Flamberge,"Infiltrator",Infiltrator,"Ballista",Ballista,"Next",L_Weapon4,"Jump to page...",L_WaepJump;
-
- L_Weapon4:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Stunner",Stunner,"Berserk",Berserk,"Claymore",Claymore,"Gungnir",Gungnir,"Poison Knife",Poison_Knife,"Sucsamad",Sucsamad,"Next",L_Weapon5,"Jump to page...",L_WaepJump;
-
- L_Weapon5:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Ginnungagap",Ginnungagap,"Cutlus",Cutlus,"Crescent Scythe",Crescent_Scythe,"Ice Pick",Ice_Pick,"(Dex) Survivor's Rod",Dex_Survivors_Rod,"Next",L_Weapon1,"Jump to page...",L_WaepJump;
-
-
- Trident:
- set @olditem,1460;
- set @newitem,1461;
- callfunc "f_weapon_c";
-
- Rope:
- set @olditem,1950;
- set @newitem,1951;
- callfunc "f_weapon_c";
-
- Violin:
- set @olditem,1901;
- set @newitem,1902;
- callfunc "f_weapon_c";
-
- Chain:
- set @olditem,1519;
- set @newitem,1520;
- callfunc "f_weapon_b";
-
- Gladius:
- set @olditem,1219;
- set @newitem,1220;
- callfunc "f_weapon_b";
-
- Gakkung_Bow:
- set @olditem,1714;
- set @newitem,1716;
- callfunc "f_weapon_b";
-
- Pike:
- set @olditem,1407;
- set @newitem,1408;
- callfunc "f_weapon_b";
-
- Haedonggum:
- set @olditem,1123;
- set @newitem,1128;
- callfunc "f_weapon_b";
-
- Lute:
- set @olditem,1905;
- set @newitem,1906;
- callfunc "f_weapon_b";
-
- Wire_Whip:
- set @olditem,1954;
- set @newitem,1955;
- callfunc "f_weapon_b";
-
- Waghnak:
- set @olditem,1801;
- set @newitem,1802;
- callfunc "f_weapon_b";
-
- Arbalest:
- set @olditem,1713;
- set @newitem,1715;
- callfunc "f_weapon_b";
-
- Hunter_Bow:
- set @olditem,1718;
- set @newitem,1726;
- callfunc "f_weapon_a";
-
- Int_Survivors_Rod:
- set @olditem,1619;
- set @newitem,1620;
- callfunc "f_weapon_a";
-
- Zweihander:
- set @olditem,1168;
- set @newitem,1171;
- callfunc "f_weapon_a3";
-
- Flamberge:
- set @olditem,1129;
- set @newitem,1149;
- callfunc "f_weapon_a";
-
- Infiltrator:
- set @olditem,1261;
- set @newitem,1266;
- callfunc "f_weapon_a2";
-
- Ballista:
- set @olditem,1722;
- set @newitem,1727;
- callfunc "f_weapon_a";
-
- Stunner:
- set @olditem,1522;
- set @newitem,1532;
- callfunc "f_weapon_a";
-
- Berserk:
- set @olditem,1814;
- set @newitem,1816;
- callfunc "f_weapon_a";
-
- Claymore:
- set @olditem,1163;
- set @newitem,1172;
- callfunc "f_weapon_a";
-
- Gungnir:
- set @olditem,1413;
- set @newitem,1418;
- callfunc "f_weapon_s";
-
- Poison_Knife:
- set @olditem,1239;
- set @newitem,13016;
- callfunc "f_weapon_s";
-
- Sucsamad:
- set @olditem,1236;
- set @newitem,13018;
- callfunc "f_weapon_s";
-
- Ginnungagap:
- set @olditem,13002;
- set @newitem,13019;
- callfunc "f_weapon_s";
-
- Cutlus:
- set @olditem,1135;
- set @newitem,13400;
- callfunc "f_weapon_s";
-
- Crescent_Scythe:
- set @olditem,1466;
- set @newitem,1476;
- callfunc "f_weapon_s";
-
- Ice_Pick:
- set @olditem,1230;
- set @newitem,13017;
- callfunc "f_weapon_s2";
-
- Dex_Survivors_Rod:
- set @olditem,1617;
- set @newitem,1618;
- callfunc "f_weapon_s2";
-
-
-
-//============================================================
-//= Armor
-//============================================================
-
- L_ArmorJump:
- mes "[Socket Enchant]";
- mes "Choose the number of page. Type 1 to 6:";
- next;
- input @armorsite;
- if(@armorsite > 6 || @armorsite < 1) goto L_ArmorJump;
-
- if(@armorsite == 1) goto L_Armor1;
- if(@armorsite == 2) goto L_Armor2;
- if(@armorsite == 3) goto L_Armor3;
- if(@armorsite == 4) goto L_Armor4;
- if(@armorsite == 5) goto L_Armor5;
- if(@armorsite == 6) goto L_Armor6;
-
-
- L_Armor1:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Mantle",Mantle,"Coat",Coat,"Circlet",Circlet,"Biretta",Biretta,"Mirror Shield",Mirror_Shield,"Chain Mail",Chain_Mail,"Shield",Shield,"Bongun Hat",Bongun_Hat,"Next",L_Armor2,"Jump to page...",L_ArmorJump;
-
- L_Armor2:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Saint's Robe",Saints_Robe,"Silk Robe",Silk_Robe,"Boots",Boots,"Shoes",Shoes,"Muffler",Muffler,"Guard",Guard,"Buckler",Buckler,"Munak Hat",Munak_Hat,"Next",L_Armor3,"Jump to page...",L_ArmorJump;
-
- L_Armor3:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Gemmed Sallet",Gemmed_Sallet,"Bucket Hat",Bucket_Hat,"Memory Book",Memory_Book,"Tights",Tights,"Legion Plate Armor",Legion_Plate_Armor,"Full Plate",Full_Plate,"Thief Clothes",Thief_Clothes,"Next",L_Armor4,"Jump to page...",L_ArmorJump;
-
- L_Armor4:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Greaves",Greaves,"Coif",Coif,"Manteau",Manteau,"Helm",Helm,"Ninja Suit",Ninja_Suit,"Orc Helm",Orc_Helm,"Ancient Cape",Ancient_Cape,"Next",L_Armor5,"Jump to page...",L_ArmorJump;
-
- L_Armor5:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Monk Hat",Monk_Hat,"Golden Gear",Golden_Gear,"Brooch",Brooch,"Tiara",Tiara,"Sphinx Hat",Sphinx_Hat,"Robe of Cast",Robe_of_Cast,"Earring",Earring,"Next",L_Armor6,"Jump to page...",L_ArmorJump;
-
- L_Armor6:
-
- close2;
- mes "[Socket Enchant]";
- mes "Please choose your item:";
- next;
- menu "Ring",Ring,"Bow Thimble",Bow_Thimble,"Majestic Goat",Majestic_Goat,"Spiky Band",Spiky_Band,"Bone Helm",Bone_Helm,"Corsair",Corsair,"Crown",Crown,"Next",L_Armor1,"Jump to page...",L_ArmorJump;
-
-
- Mantle:
- set @olditem,2307;
- set @newitem,2308;
- callfunc "f_armor_c";
-
- Coat:
- set @olditem,2309;
- set @newitem,2310;
- callfunc "f_armor_c";
-
- Circlet:
- set @olditem,2232;
- set @newitem,2233;
- callfunc "f_armor_c";
-
- Biretta:
- set @olditem,2216;
- set @newitem,2217;
- callfunc "f_armor_c";
-
- Mirror_Shield:
- set @olditem,2107;
- set @newitem,2108;
- callfunc "f_armor_b";
-
- Chain_Mail:
- set @olditem,2314;
- set @newitem,2315;
- callfunc "f_armor_b";
-
- Shield:
- set @olditem,2105;
- set @newitem,2106;
- callfunc "f_armor_b";
-
- Bongun_Hat:
- set @olditem,5046;
- set @newitem,5168;
- callfunc "f_armor_b";
-
- Saints_Robe:
- set @olditem,2325;
- set @newitem,2326;
- callfunc "f_armor_b2";
-
- Silk_Robe:
- set @olditem,2321;
- set @newitem,2322;
- callfunc "f_armor_b2";
-
- Boots:
- set @olditem,2405;
- set @newitem,2406;
- callfunc "f_armor_b2";
-
- Shoes:
- set @olditem,2403;
- set @newitem,2404;
- callfunc "f_armor_b2";
-
- Muffler:
- set @olditem,2503;
- set @newitem,2504;
- callfunc "f_armor_b2";
-
- Guard:
- set @olditem,2101;
- set @newitem,2102;
- callfunc "f_armor_b2";
-
- Buckler:
- set @olditem,2103;
- set @newitem,2104;
- callfunc "f_armor_b2";
-
- Munak_Hat:
- set @olditem,2264;
- set @newitem,5167;
- callfunc "f_armor_a";
-
- Gemmed_Sallet:
- set @olditem,2230;
- set @newitem,2231;
- callfunc "f_armor_a2";
-
- Bucket_Hat:
- set @olditem,5114;
- set @newitem,5120;
- callfunc "f_armor_a2";
-
- Memory_Book:
- set @olditem,2109;
- set @newitem,2121;
- callfunc "f_armor_a2";
-
- Tights:
- set @olditem,2330;
- set @newitem,2331;
- callfunc "f_armor_a2";
-
- Legion_Plate_Armor:
- set @olditem,2341;
- set @newitem,2342;
- callfunc "f_armor_a2";
-
- Full_Plate:
- set @olditem,2316;
- set @newitem,2317;
- callfunc "f_armor_a2";
-
- Thief_Clothes:
- set @olditem,2335;
- set @newitem,2336;
- callfunc "f_armor_a2";
-
- Greaves:
- set @olditem,2411;
- set @newitem,2412;
- callfunc "f_armor_a2";
-
- Coif:
- set @olditem,5092;
- set @newitem,5093;
- callfunc "f_armor_a2";
-
- Manteau:
- set @olditem,2505;
- set @newitem,2506;
- callfunc "f_armor_a2";
-
- Helm:
- set @olditem,2228;
- set @newitem,2229;
- callfunc "f_armor_a2";
-
- Ninja_Suit:
- set @olditem,2337;
- set @newitem,2359;
- callfunc "f_armor_a2";
-
- Orc_Helm:
- set @olditem,2299;
- set @newitem,5157;
- callfunc "f_armor_a2";
-
- Ancient_Cape:
- set @olditem,2507;
- set @newitem,2525;
- callfunc "f_armor_a2";
-
- Monk_Hat:
- set @olditem,2251;
- set @newitem,5158;
- callfunc "f_armor_a2";
-
- Golden_Gear:
- set @olditem,2246;
- set @newitem,5159;
- callfunc "f_armor_a2";
-
- Brooch:
- set @olditem,2605;
- set @newitem,2625;
- callfunc "f_armor_a2";
-
- Tiara:
- set @olditem,2234;
- set @newitem,5164;
- callfunc "f_armor_s2";
-
- Sphinx_Hat:
- set @olditem,5053;
- set @newitem,5166;
- callfunc "f_armor_s";
-
- Robe_of_Cast:
- set @olditem,2343;
- set @newitem,2360;
- callfunc "f_armor_s";
-
- Earring:
- set @olditem,2602;
- set @newitem,2622;
- callfunc "f_armor_s";
-
- Ring:
- set @olditem,2601;
- set @newitem,2621;
- callfunc "f_armor_s";
-
- Bow_Thimble:
- set @olditem,2619;
- set @newitem,2671;
- callfunc "f_armor_s";
-
- Majestic_Goat:
- set @olditem,2256;
- set @newitem,5160;
- callfunc "f_armor_s2";
-
- Spiky_Band:
- set @olditem,2258;
- set @newitem,5161;
- callfunc "f_armor_s2";
-
- Bone_Helm:
- set @olditem,5017;
- set @newitem,5162;
- callfunc "f_armor_s2";
-
- Corsair:
- set @olditem,5019;
- set @newitem,5163;
- callfunc "f_armor_s2";
-
- Crown:
- set @olditem,2235;
- set @newitem,5165;
- callfunc "f_armor_s2";
-
-//============================================================
-//= Other
-//============================================================
-
- L_Not:
- mes "[Socket Enchant]";
- mes "Bye~!";
- close;
-
-}
-
-//============================================================
-//= Functions add slots
-//============================================================
-
-function script addslot {
-
- mes "[Socket Enchant]";
- mes "Upgrade cost "+@addprice+" zeny and ^5533FF"+@itemupname$+"^000000.";
- next;
- mes "[Socket Enchant]";
- mes "Are you sure? Remember that it can fail.";
- mes "Do you want to continue?";
- next;
- menu "Yes",-,"No",L_No;
-
-
- if(countitem(@olditem)<1) goto L_NoItem;
- if(Zeny<@addprice) goto L_NoZeny;
- if(countitem(@itemup)<@itemupiece) goto L_NoItemUp;
-
- delitem @itemup,@itemupiece;
- set Zeny,Zeny-@addprice;
- delitem @olditem,1;
- if(@rateit<rand(1,100))goto L_Fail;
- misceffect 83;
- getitem @newitem,1;
-
- mes "[Socket Enchant]";
- mes "Ok, take your item, Bye.";
- close;
-
-
- L_NoItem:
- mes "[Socket Enchant]";
- mes "You don't have this item.";
- mes "Come back when you get it.";
- close;
-
- L_NoItemUp:
- mes "[Socket Enchant]";
- mes "You don't have all ingridients. Come back when you get it.";
- close;
-
- L_NoZeny:
- mes "[Socket Enchant]";
- mes "You don't have enough money. Come back later.";
- close;
-
- L_Fail:
- misceffect 183;
- mes "[Socket Enchant]";
- mes "Sorry, but i could't upgrade it.";
- close;
-
- L_No:
- mes "[Socket Enchant]";
- mes "Ok, Bye.";
- close;
-
-}
-
-//============================================================
-
-function script addslot2 {
-
- mes "[Socket Enchant]";
- mes "Upgrade cost "+@addprice+" zeny and ^5533FF"+@itemupname1$+"^000000 and ^5533FF"+@itemupname2$+"^000000.";
- next;
- mes "[Socket Enchant]";
- mes "Are you sure? Remember that it can fail.";
- mes "Do you want to continue?";
- next;
- menu "Yes",-,"No",L_No;
-
-
- if(countitem(@olditem)<1) goto L_NoItem;
- if(Zeny<@addprice) goto L_NoZeny;
- if((countitem(@itemup1)<@itemupiece1) && (countitem(@itemup2)<@itemupiece2)) goto L_NoItemUp;
-
- delitem @itemup1,@itemupiece1;
- delitem @itemup2,@itemupiece2;
- set Zeny,Zeny-@addprice;
- delitem @olditem,1;
- if(@rateit<rand(1,100))goto L_Fail;
- misceffect 83;
- getitem @newitem,1;
-
- mes "[Socket Enchant]";
- mes "Ok, take your item, Bye.";
- close;
-
-
- L_NoItem:
- mes "[Socket Enchant]";
- mes "You don't have this item.";
- mes "Come back when you get it.";
- close;
-
- L_NoItemUp:
- mes "[Socket Enchant]";
- mes "You don't have all ingridients. Come back when you get it.";
- close;
-
- L_NoZeny:
- mes "[Socket Enchant]";
- mes "You don't have enough money. Come back later.";
- close;
-
- L_Fail:
- misceffect 183;
- mes "[Socket Enchant]";
- mes "Sorry, but i could't upgrade it.";
- close;
-
- L_No:
- mes "[Socket Enchant]";
- mes "Ok, Bye.";
- close;
-
-}
-
-
-//============================================================
-//= Functions
-//============================================================
-
-//= Weapon
-
-function script f_weapon_c {
-
- set @rateit,50; //success rate
- set @addprice,200000;
- set @itemup,1010;
- set @itemupiece,10;
- set @itemupname$,"10 Phracon";
- callfunc "addslot";
-
-}
-
-function script f_weapon_b {
-
- set @rateit,25; //success rate
- set @addprice,300000;
- set @itemup1,984;
- set @itemupiece1,2;
- set @itemupname1$,"2 Oridecon";
- set @itemup2,999;
- set @itemupiece2,5;
- set @itemupname2$,"5 Steel";
- callfunc "addslot2";
-
-}
-
-function script f_weapon_a {
-
- set @rateit,10; //success rate
- set @addprice,500000;
- set @itemup1,984;
- set @itemupiece1,2;
- set @itemupname1$,"2 Oridecon";
- set @itemup2,999;
- set @itemupiece2,10;
- set @itemupname2$,"10 Steel";
- callfunc "addslot2";
-
-}
-
-function script f_weapon_a2 {
-
- set @rateit,10; //success rate
- set @addprice,700000;
- set @itemup1,984;
- set @itemupiece1,2;
- set @itemupname1$,"2 Oridecon";
- set @itemup2,999;
- set @itemupiece2,10;
- set @itemupname2$,"10 Steel";
- callfunc "addslot2";
-
-}
-
-function script f_weapon_a3 {
-
- set @rateit,10; //success rate
- set @addprice,800000;
- set @itemup1,984;
- set @itemupiece1,2;
- set @itemupname1$,"2 Oridecon";
- set @itemup2,999;
- set @itemupiece2,10;
- set @itemupname2$,"10 Steel";
- callfunc "addslot2";
-
-}
-
-function script f_weapon_s {
-
- set @rateit,4; //success rate
- set @addprice,1000000;
- set @itemup1,984;
- set @itemupiece1,5;
- set @itemupname1$,"5 Oridecon";
- set @itemup2,999;
- set @itemupiece2,10;
- set @itemupname2$,"10 Steel";
- callfunc "addslot2";
-
-}
-
-function script f_weapon_s2 {
-
- set @rateit,4; //success rate
- set @addprice,2000000;
- set @itemup1,984;
- set @itemupiece1,5;
- set @itemupname1$,"5 Oridecon";
- set @itemup2,999;
- set @itemupiece2,10;
- set @itemupname2$,"10 Steel";
- callfunc "addslot2";
-
-}
-
-//= Armor
-
-function script f_armor_c {
-
- set @rateit,50; //success rate
- set @addprice,200000;
- set @itemup,999;
- set @itemupiece,3;
- set @itemupname$,"3 Steel";
- callfunc "addslot";
-
-}
-
-function script f_armor_b {
-
- set @rateit,25; //success rate
- set @addprice,250000;
- set @itemup,999;
- set @itemupiece,5;
- set @itemupname$,"5 Steel";
- callfunc "addslot";
-
-}
-
-function script f_armor_b2 {
-
- set @rateit,25; //success rate
- set @addprice,300000;
- set @itemup,999;
- set @itemupiece,5;
- set @itemupname$,"5 Steel";
- callfunc "addslot";
-
-}
-
-function script f_armor_a {
-
- set @rateit,10; //success rate
- set @addprice,300000;
- set @itemup,985;
- set @itemupiece,1;
- set @itemupname$,"1 Elunium";
- callfunc "addslot";
-
-}
-
-function script f_armor_a2 {
-
- set @rateit,10; //success rate
- set @addprice,400000;
- set @itemup,985;
- set @itemupiece,1;
- set @itemupname$,"1 Elunium";
- callfunc "addslot";
-
-}
-
-function script f_armor_s {
-
- set @rateit,4; //success rate
- set @addprice,1000000;
- set @itemup,985;
- set @itemupiece,2;
- set @itemupname$,"2 Elunium";
- callfunc "addslot";
-
-}
-
-function script f_armor_s2 {
-
- set @rateit,4; //success rate
- set @addprice,2000000;
- set @itemup,985;
- set @itemupiece,2;
- set @itemupname$,"2 Elunium";
- callfunc "addslot";
-
-}
-
-
-prt_in.gat,33,70,5 duplicate(Socket Enchant) Socket Enchant#2 84
-payon.gat,140,151,5 duplicate(Socket Enchant) Socket Enchant#3 84
+//===== eAthena Script =======================================
+//= Socket Enchant
+//===== By: ==================================================
+//= Sousuke_PL
+//===== Current Version: =====================================
+//= 0.3
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= item loses all element refinement and upgrades but
+//= cards too?
+//===== Additional Comments: =================================
+//= 0.1a added missing L_No: to 2 funcs [Lupus]
+//= 0.1b Removed duplicates [Toms]
+//= 0.2 Added missing next;'s [Evera]
+//= 0.3 Fixed Zweihander[+] id [Lupus]
+//============================================================
+
+
+lhz_in02.gat,281,35,5 script Socket Enchant 84,{
+
+ mes "[Socket Enchant]";
+ mes "Hello.";
+ mes "How can I help you?";
+ next;
+ menu "Upgrade my item",-,"Nothing",L_Not;
+
+ mes "[Socket Enchant]";
+ mes "This is weapon or armor?";
+ next;
+ menu "Weapon",L_Weapon1,"Armor",L_Armor1;
+
+
+//============================================================
+//= Weapon
+//============================================================
+
+ L_WaepJump:
+ mes "[Socket Enchant]";
+ mes "Choose the number of page. Type 1 to 5:";
+ next;
+ input @weapsite;
+ if(@weapsite > 5 || @weapsite < 1) goto L_WaepJump;
+
+ if(@weapsite == 1) goto L_Weapon1;
+ if(@weapsite == 2) goto L_Weapon2;
+ if(@weapsite == 3) goto L_Weapon3;
+ if(@weapsite == 4) goto L_Weapon4;
+ if(@weapsite == 5) goto L_Weapon5;
+
+
+ L_Weapon1:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Trident[2]",Trident,"Rope[3]",Rope,"Violin[3]",Violin,"Chain[2]",Chain,"Gladius[2]",Gladius,"Gakkung Bow[1]",Gakkung_Bow,"Next",L_Weapon2,"Jump to page...",L_WaepJump;
+
+ L_Weapon2:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Pike[3]",Pike,"Haedonggum[1]",Haedonggum,"Lute[2]",Lute,"Wire Whip[2]",Wire_Whip,"Waghnak[3]",Waghnak,"Arbalest[1]",Arbalest,"Next",L_Weapon3,"Jump to page...",L_WaepJump;
+
+ L_Weapon3:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Hunter Bow",Hunter_Bow,"(Int) Survivor's Rod",Int_Survivors_Rod,"Zweihander",Zweihander,"Flamberge",Flamberge,"Infiltrator",Infiltrator,"Ballista",Ballista,"Next",L_Weapon4,"Jump to page...",L_WaepJump;
+
+ L_Weapon4:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Stunner",Stunner,"Berserk",Berserk,"Claymore",Claymore,"Gungnir",Gungnir,"Poison Knife",Poison_Knife,"Sucsamad",Sucsamad,"Next",L_Weapon5,"Jump to page...",L_WaepJump;
+
+ L_Weapon5:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Ginnungagap",Ginnungagap,"Cutlus",Cutlus,"Crescent Scythe",Crescent_Scythe,"Ice Pick",Ice_Pick,"(Dex) Survivor's Rod",Dex_Survivors_Rod,"Next",L_Weapon1,"Jump to page...",L_WaepJump;
+
+
+ Trident:
+ set @olditem,1460;
+ set @newitem,1461;
+ callfunc "f_weapon_c";
+
+ Rope:
+ set @olditem,1950;
+ set @newitem,1951;
+ callfunc "f_weapon_c";
+
+ Violin:
+ set @olditem,1901;
+ set @newitem,1902;
+ callfunc "f_weapon_c";
+
+ Chain:
+ set @olditem,1519;
+ set @newitem,1520;
+ callfunc "f_weapon_b";
+
+ Gladius:
+ set @olditem,1219;
+ set @newitem,1220;
+ callfunc "f_weapon_b";
+
+ Gakkung_Bow:
+ set @olditem,1714;
+ set @newitem,1716;
+ callfunc "f_weapon_b";
+
+ Pike:
+ set @olditem,1407;
+ set @newitem,1408;
+ callfunc "f_weapon_b";
+
+ Haedonggum:
+ set @olditem,1123;
+ set @newitem,1128;
+ callfunc "f_weapon_b";
+
+ Lute:
+ set @olditem,1905;
+ set @newitem,1906;
+ callfunc "f_weapon_b";
+
+ Wire_Whip:
+ set @olditem,1954;
+ set @newitem,1955;
+ callfunc "f_weapon_b";
+
+ Waghnak:
+ set @olditem,1801;
+ set @newitem,1802;
+ callfunc "f_weapon_b";
+
+ Arbalest:
+ set @olditem,1713;
+ set @newitem,1715;
+ callfunc "f_weapon_b";
+
+ Hunter_Bow:
+ set @olditem,1718;
+ set @newitem,1726;
+ callfunc "f_weapon_a";
+
+ Int_Survivors_Rod:
+ set @olditem,1619;
+ set @newitem,1620;
+ callfunc "f_weapon_a";
+
+ Zweihander:
+ set @olditem,1168;
+ set @newitem,1171;
+ callfunc "f_weapon_a3";
+
+ Flamberge:
+ set @olditem,1129;
+ set @newitem,1149;
+ callfunc "f_weapon_a";
+
+ Infiltrator:
+ set @olditem,1261;
+ set @newitem,1266;
+ callfunc "f_weapon_a2";
+
+ Ballista:
+ set @olditem,1722;
+ set @newitem,1727;
+ callfunc "f_weapon_a";
+
+ Stunner:
+ set @olditem,1522;
+ set @newitem,1532;
+ callfunc "f_weapon_a";
+
+ Berserk:
+ set @olditem,1814;
+ set @newitem,1816;
+ callfunc "f_weapon_a";
+
+ Claymore:
+ set @olditem,1163;
+ set @newitem,1172;
+ callfunc "f_weapon_a";
+
+ Gungnir:
+ set @olditem,1413;
+ set @newitem,1418;
+ callfunc "f_weapon_s";
+
+ Poison_Knife:
+ set @olditem,1239;
+ set @newitem,13016;
+ callfunc "f_weapon_s";
+
+ Sucsamad:
+ set @olditem,1236;
+ set @newitem,13018;
+ callfunc "f_weapon_s";
+
+ Ginnungagap:
+ set @olditem,13002;
+ set @newitem,13019;
+ callfunc "f_weapon_s";
+
+ Cutlus:
+ set @olditem,1135;
+ set @newitem,13400;
+ callfunc "f_weapon_s";
+
+ Crescent_Scythe:
+ set @olditem,1466;
+ set @newitem,1476;
+ callfunc "f_weapon_s";
+
+ Ice_Pick:
+ set @olditem,1230;
+ set @newitem,13017;
+ callfunc "f_weapon_s2";
+
+ Dex_Survivors_Rod:
+ set @olditem,1617;
+ set @newitem,1618;
+ callfunc "f_weapon_s2";
+
+
+
+//============================================================
+//= Armor
+//============================================================
+
+ L_ArmorJump:
+ mes "[Socket Enchant]";
+ mes "Choose the number of page. Type 1 to 6:";
+ next;
+ input @armorsite;
+ if(@armorsite > 6 || @armorsite < 1) goto L_ArmorJump;
+
+ if(@armorsite == 1) goto L_Armor1;
+ if(@armorsite == 2) goto L_Armor2;
+ if(@armorsite == 3) goto L_Armor3;
+ if(@armorsite == 4) goto L_Armor4;
+ if(@armorsite == 5) goto L_Armor5;
+ if(@armorsite == 6) goto L_Armor6;
+
+
+ L_Armor1:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Mantle",Mantle,"Coat",Coat,"Circlet",Circlet,"Biretta",Biretta,"Mirror Shield",Mirror_Shield,"Chain Mail",Chain_Mail,"Shield",Shield,"Bongun Hat",Bongun_Hat,"Next",L_Armor2,"Jump to page...",L_ArmorJump;
+
+ L_Armor2:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Saint's Robe",Saints_Robe,"Silk Robe",Silk_Robe,"Boots",Boots,"Shoes",Shoes,"Muffler",Muffler,"Guard",Guard,"Buckler",Buckler,"Munak Hat",Munak_Hat,"Next",L_Armor3,"Jump to page...",L_ArmorJump;
+
+ L_Armor3:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Gemmed Sallet",Gemmed_Sallet,"Bucket Hat",Bucket_Hat,"Memory Book",Memory_Book,"Tights",Tights,"Legion Plate Armor",Legion_Plate_Armor,"Full Plate",Full_Plate,"Thief Clothes",Thief_Clothes,"Next",L_Armor4,"Jump to page...",L_ArmorJump;
+
+ L_Armor4:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Greaves",Greaves,"Coif",Coif,"Manteau",Manteau,"Helm",Helm,"Ninja Suit",Ninja_Suit,"Orc Helm",Orc_Helm,"Ancient Cape",Ancient_Cape,"Next",L_Armor5,"Jump to page...",L_ArmorJump;
+
+ L_Armor5:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Monk Hat",Monk_Hat,"Golden Gear",Golden_Gear,"Brooch",Brooch,"Tiara",Tiara,"Sphinx Hat",Sphinx_Hat,"Robe of Cast",Robe_of_Cast,"Earring",Earring,"Next",L_Armor6,"Jump to page...",L_ArmorJump;
+
+ L_Armor6:
+
+ close2;
+ mes "[Socket Enchant]";
+ mes "Please choose your item:";
+ next;
+ menu "Ring",Ring,"Bow Thimble",Bow_Thimble,"Majestic Goat",Majestic_Goat,"Spiky Band",Spiky_Band,"Bone Helm",Bone_Helm,"Corsair",Corsair,"Crown",Crown,"Next",L_Armor1,"Jump to page...",L_ArmorJump;
+
+
+ Mantle:
+ set @olditem,2307;
+ set @newitem,2308;
+ callfunc "f_armor_c";
+
+ Coat:
+ set @olditem,2309;
+ set @newitem,2310;
+ callfunc "f_armor_c";
+
+ Circlet:
+ set @olditem,2232;
+ set @newitem,2233;
+ callfunc "f_armor_c";
+
+ Biretta:
+ set @olditem,2216;
+ set @newitem,2217;
+ callfunc "f_armor_c";
+
+ Mirror_Shield:
+ set @olditem,2107;
+ set @newitem,2108;
+ callfunc "f_armor_b";
+
+ Chain_Mail:
+ set @olditem,2314;
+ set @newitem,2315;
+ callfunc "f_armor_b";
+
+ Shield:
+ set @olditem,2105;
+ set @newitem,2106;
+ callfunc "f_armor_b";
+
+ Bongun_Hat:
+ set @olditem,5046;
+ set @newitem,5168;
+ callfunc "f_armor_b";
+
+ Saints_Robe:
+ set @olditem,2325;
+ set @newitem,2326;
+ callfunc "f_armor_b2";
+
+ Silk_Robe:
+ set @olditem,2321;
+ set @newitem,2322;
+ callfunc "f_armor_b2";
+
+ Boots:
+ set @olditem,2405;
+ set @newitem,2406;
+ callfunc "f_armor_b2";
+
+ Shoes:
+ set @olditem,2403;
+ set @newitem,2404;
+ callfunc "f_armor_b2";
+
+ Muffler:
+ set @olditem,2503;
+ set @newitem,2504;
+ callfunc "f_armor_b2";
+
+ Guard:
+ set @olditem,2101;
+ set @newitem,2102;
+ callfunc "f_armor_b2";
+
+ Buckler:
+ set @olditem,2103;
+ set @newitem,2104;
+ callfunc "f_armor_b2";
+
+ Munak_Hat:
+ set @olditem,2264;
+ set @newitem,5167;
+ callfunc "f_armor_a";
+
+ Gemmed_Sallet:
+ set @olditem,2230;
+ set @newitem,2231;
+ callfunc "f_armor_a2";
+
+ Bucket_Hat:
+ set @olditem,5114;
+ set @newitem,5120;
+ callfunc "f_armor_a2";
+
+ Memory_Book:
+ set @olditem,2109;
+ set @newitem,2121;
+ callfunc "f_armor_a2";
+
+ Tights:
+ set @olditem,2330;
+ set @newitem,2331;
+ callfunc "f_armor_a2";
+
+ Legion_Plate_Armor:
+ set @olditem,2341;
+ set @newitem,2342;
+ callfunc "f_armor_a2";
+
+ Full_Plate:
+ set @olditem,2316;
+ set @newitem,2317;
+ callfunc "f_armor_a2";
+
+ Thief_Clothes:
+ set @olditem,2335;
+ set @newitem,2336;
+ callfunc "f_armor_a2";
+
+ Greaves:
+ set @olditem,2411;
+ set @newitem,2412;
+ callfunc "f_armor_a2";
+
+ Coif:
+ set @olditem,5092;
+ set @newitem,5093;
+ callfunc "f_armor_a2";
+
+ Manteau:
+ set @olditem,2505;
+ set @newitem,2506;
+ callfunc "f_armor_a2";
+
+ Helm:
+ set @olditem,2228;
+ set @newitem,2229;
+ callfunc "f_armor_a2";
+
+ Ninja_Suit:
+ set @olditem,2337;
+ set @newitem,2359;
+ callfunc "f_armor_a2";
+
+ Orc_Helm:
+ set @olditem,2299;
+ set @newitem,5157;
+ callfunc "f_armor_a2";
+
+ Ancient_Cape:
+ set @olditem,2507;
+ set @newitem,2525;
+ callfunc "f_armor_a2";
+
+ Monk_Hat:
+ set @olditem,2251;
+ set @newitem,5158;
+ callfunc "f_armor_a2";
+
+ Golden_Gear:
+ set @olditem,2246;
+ set @newitem,5159;
+ callfunc "f_armor_a2";
+
+ Brooch:
+ set @olditem,2605;
+ set @newitem,2625;
+ callfunc "f_armor_a2";
+
+ Tiara:
+ set @olditem,2234;
+ set @newitem,5164;
+ callfunc "f_armor_s2";
+
+ Sphinx_Hat:
+ set @olditem,5053;
+ set @newitem,5166;
+ callfunc "f_armor_s";
+
+ Robe_of_Cast:
+ set @olditem,2343;
+ set @newitem,2360;
+ callfunc "f_armor_s";
+
+ Earring:
+ set @olditem,2602;
+ set @newitem,2622;
+ callfunc "f_armor_s";
+
+ Ring:
+ set @olditem,2601;
+ set @newitem,2621;
+ callfunc "f_armor_s";
+
+ Bow_Thimble:
+ set @olditem,2619;
+ set @newitem,2671;
+ callfunc "f_armor_s";
+
+ Majestic_Goat:
+ set @olditem,2256;
+ set @newitem,5160;
+ callfunc "f_armor_s2";
+
+ Spiky_Band:
+ set @olditem,2258;
+ set @newitem,5161;
+ callfunc "f_armor_s2";
+
+ Bone_Helm:
+ set @olditem,5017;
+ set @newitem,5162;
+ callfunc "f_armor_s2";
+
+ Corsair:
+ set @olditem,5019;
+ set @newitem,5163;
+ callfunc "f_armor_s2";
+
+ Crown:
+ set @olditem,2235;
+ set @newitem,5165;
+ callfunc "f_armor_s2";
+
+//============================================================
+//= Other
+//============================================================
+
+ L_Not:
+ mes "[Socket Enchant]";
+ mes "Bye~!";
+ close;
+
+}
+
+//============================================================
+//= Functions add slots
+//============================================================
+
+function script addslot {
+
+ mes "[Socket Enchant]";
+ mes "Upgrade cost "+@addprice+" zeny and ^5533FF"+@itemupname$+"^000000.";
+ next;
+ mes "[Socket Enchant]";
+ mes "Are you sure? Remember that it can fail.";
+ mes "Do you want to continue?";
+ next;
+ menu "Yes",-,"No",L_No;
+
+
+ if(countitem(@olditem)<1) goto L_NoItem;
+ if(Zeny<@addprice) goto L_NoZeny;
+ if(countitem(@itemup)<@itemupiece) goto L_NoItemUp;
+
+ delitem @itemup,@itemupiece;
+ set Zeny,Zeny-@addprice;
+ delitem @olditem,1;
+ if(@rateit<rand(1,100))goto L_Fail;
+ misceffect 83;
+ getitem @newitem,1;
+
+ mes "[Socket Enchant]";
+ mes "Ok, take your item, Bye.";
+ close;
+
+
+ L_NoItem:
+ mes "[Socket Enchant]";
+ mes "You don't have this item.";
+ mes "Come back when you get it.";
+ close;
+
+ L_NoItemUp:
+ mes "[Socket Enchant]";
+ mes "You don't have all ingridients. Come back when you get it.";
+ close;
+
+ L_NoZeny:
+ mes "[Socket Enchant]";
+ mes "You don't have enough money. Come back later.";
+ close;
+
+ L_Fail:
+ misceffect 183;
+ mes "[Socket Enchant]";
+ mes "Sorry, but i could't upgrade it.";
+ close;
+
+ L_No:
+ mes "[Socket Enchant]";
+ mes "Ok, Bye.";
+ close;
+
+}
+
+//============================================================
+
+function script addslot2 {
+
+ mes "[Socket Enchant]";
+ mes "Upgrade cost "+@addprice+" zeny and ^5533FF"+@itemupname1$+"^000000 and ^5533FF"+@itemupname2$+"^000000.";
+ next;
+ mes "[Socket Enchant]";
+ mes "Are you sure? Remember that it can fail.";
+ mes "Do you want to continue?";
+ next;
+ menu "Yes",-,"No",L_No;
+
+
+ if(countitem(@olditem)<1) goto L_NoItem;
+ if(Zeny<@addprice) goto L_NoZeny;
+ if((countitem(@itemup1)<@itemupiece1) && (countitem(@itemup2)<@itemupiece2)) goto L_NoItemUp;
+
+ delitem @itemup1,@itemupiece1;
+ delitem @itemup2,@itemupiece2;
+ set Zeny,Zeny-@addprice;
+ delitem @olditem,1;
+ if(@rateit<rand(1,100))goto L_Fail;
+ misceffect 83;
+ getitem @newitem,1;
+
+ mes "[Socket Enchant]";
+ mes "Ok, take your item, Bye.";
+ close;
+
+
+ L_NoItem:
+ mes "[Socket Enchant]";
+ mes "You don't have this item.";
+ mes "Come back when you get it.";
+ close;
+
+ L_NoItemUp:
+ mes "[Socket Enchant]";
+ mes "You don't have all ingridients. Come back when you get it.";
+ close;
+
+ L_NoZeny:
+ mes "[Socket Enchant]";
+ mes "You don't have enough money. Come back later.";
+ close;
+
+ L_Fail:
+ misceffect 183;
+ mes "[Socket Enchant]";
+ mes "Sorry, but i could't upgrade it.";
+ close;
+
+ L_No:
+ mes "[Socket Enchant]";
+ mes "Ok, Bye.";
+ close;
+
+}
+
+
+//============================================================
+//= Functions
+//============================================================
+
+//= Weapon
+
+function script f_weapon_c {
+
+ set @rateit,50; //success rate
+ set @addprice,200000;
+ set @itemup,1010;
+ set @itemupiece,10;
+ set @itemupname$,"10 Phracon";
+ callfunc "addslot";
+
+}
+
+function script f_weapon_b {
+
+ set @rateit,25; //success rate
+ set @addprice,300000;
+ set @itemup1,984;
+ set @itemupiece1,2;
+ set @itemupname1$,"2 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,5;
+ set @itemupname2$,"5 Steel";
+ callfunc "addslot2";
+
+}
+
+function script f_weapon_a {
+
+ set @rateit,10; //success rate
+ set @addprice,500000;
+ set @itemup1,984;
+ set @itemupiece1,2;
+ set @itemupname1$,"2 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,10;
+ set @itemupname2$,"10 Steel";
+ callfunc "addslot2";
+
+}
+
+function script f_weapon_a2 {
+
+ set @rateit,10; //success rate
+ set @addprice,700000;
+ set @itemup1,984;
+ set @itemupiece1,2;
+ set @itemupname1$,"2 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,10;
+ set @itemupname2$,"10 Steel";
+ callfunc "addslot2";
+
+}
+
+function script f_weapon_a3 {
+
+ set @rateit,10; //success rate
+ set @addprice,800000;
+ set @itemup1,984;
+ set @itemupiece1,2;
+ set @itemupname1$,"2 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,10;
+ set @itemupname2$,"10 Steel";
+ callfunc "addslot2";
+
+}
+
+function script f_weapon_s {
+
+ set @rateit,4; //success rate
+ set @addprice,1000000;
+ set @itemup1,984;
+ set @itemupiece1,5;
+ set @itemupname1$,"5 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,10;
+ set @itemupname2$,"10 Steel";
+ callfunc "addslot2";
+
+}
+
+function script f_weapon_s2 {
+
+ set @rateit,4; //success rate
+ set @addprice,2000000;
+ set @itemup1,984;
+ set @itemupiece1,5;
+ set @itemupname1$,"5 Oridecon";
+ set @itemup2,999;
+ set @itemupiece2,10;
+ set @itemupname2$,"10 Steel";
+ callfunc "addslot2";
+
+}
+
+//= Armor
+
+function script f_armor_c {
+
+ set @rateit,50; //success rate
+ set @addprice,200000;
+ set @itemup,999;
+ set @itemupiece,3;
+ set @itemupname$,"3 Steel";
+ callfunc "addslot";
+
+}
+
+function script f_armor_b {
+
+ set @rateit,25; //success rate
+ set @addprice,250000;
+ set @itemup,999;
+ set @itemupiece,5;
+ set @itemupname$,"5 Steel";
+ callfunc "addslot";
+
+}
+
+function script f_armor_b2 {
+
+ set @rateit,25; //success rate
+ set @addprice,300000;
+ set @itemup,999;
+ set @itemupiece,5;
+ set @itemupname$,"5 Steel";
+ callfunc "addslot";
+
+}
+
+function script f_armor_a {
+
+ set @rateit,10; //success rate
+ set @addprice,300000;
+ set @itemup,985;
+ set @itemupiece,1;
+ set @itemupname$,"1 Elunium";
+ callfunc "addslot";
+
+}
+
+function script f_armor_a2 {
+
+ set @rateit,10; //success rate
+ set @addprice,400000;
+ set @itemup,985;
+ set @itemupiece,1;
+ set @itemupname$,"1 Elunium";
+ callfunc "addslot";
+
+}
+
+function script f_armor_s {
+
+ set @rateit,4; //success rate
+ set @addprice,1000000;
+ set @itemup,985;
+ set @itemupiece,2;
+ set @itemupname$,"2 Elunium";
+ callfunc "addslot";
+
+}
+
+function script f_armor_s2 {
+
+ set @rateit,4; //success rate
+ set @addprice,2000000;
+ set @itemup,985;
+ set @itemupiece,2;
+ set @itemupname$,"2 Elunium";
+ callfunc "addslot";
+
+}
+
+
+prt_in.gat,33,70,5 duplicate(Socket Enchant) Socket Enchant#2 84
+payon.gat,140,151,5 duplicate(Socket Enchant) Socket Enchant#3 84
morocc.gat,51,41,5 duplicate(Socket Enchant) Socket Enchant#4 84 \ No newline at end of file
diff --git a/npc/mobs/airplane.txt b/npc/mobs/airplane.txt
index 4d7e6d274..a0ff66c10 100644
--- a/npc/mobs/airplane.txt
+++ b/npc/mobs/airplane.txt
@@ -1,10 +1,10 @@
-//v 1.1
-//Temporary spawns until Airship quest is finished
-
-airplane_01.gat,225,52,25,10 monster Gremlin 1632,9,7200000,3600000,1
-airplane_01.gat,225,52,25,10 monster Beholder 1633,6,7200000,3600000,1
-airplane_01.gat,225,52,25,10 monster Picky 1049,4,7200000,3600000,1
-airplane_01.gat,225,52,25,10 monster Familiar 1005,2,7200000,3600000,1
-airplane_01.gat,225,52,25,10 monster Drainliar 1111,1,7200000,3600000,1
-airplane_01.gat,225,52,25,10 monster Rotar Zairo 1392,4,7200000,3600000,1
+//v 1.1
+//Temporary spawns until Airship quest is finished
+
+airplane_01.gat,225,52,25,10 monster Gremlin 1632,9,7200000,3600000,1
+airplane_01.gat,225,52,25,10 monster Beholder 1633,6,7200000,3600000,1
+airplane_01.gat,225,52,25,10 monster Picky 1049,4,7200000,3600000,1
+airplane_01.gat,225,52,25,10 monster Familiar 1005,2,7200000,3600000,1
+airplane_01.gat,225,52,25,10 monster Drainliar 1111,1,7200000,3600000,1
+airplane_01.gat,225,52,25,10 monster Rotar Zairo 1392,4,7200000,3600000,1
airplane_01.gat,225,52,25,10 monster Steel Chonchon 1042,2,7200000,3600000,1 \ No newline at end of file
diff --git a/npc/mobs/citycleaners.txt b/npc/mobs/citycleaners.txt
index 2d70908f6..5f1bd83f2 100644
--- a/npc/mobs/citycleaners.txt
+++ b/npc/mobs/citycleaners.txt
@@ -1,50 +1,50 @@
-//===== eAthena Script =======================================
-//= Mob Spawn in cities
-//===== By: ==================================================
-//= massdriller
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Spawns monsters to clean up city. Apparently spawning
-//= occured in iRO and kRO. Enable this if you want.
-//= 0.1a Added a few more towns to spawn Wild rose [MasterOfMuppets]
-//= 0.1b And even more from Poki#3 [Komurka]
-//= 1.0 Removed unofficial city cleaners [Playtester]
-//= 1.0 Added other city spawns [Playtester]
-//============================================================
-
-prontera.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-morocc.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-alberta.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-aldebaran.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-geffen.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-payon.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-comodo.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-izlude.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-yuno.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-umbala.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-amatsu.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-gonryun.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
-
-//==================================================
-// einbech - Einbech, The Mining Village
-//==================================================
-einbech.gat,0,0,0,0 monster Tarou 1175,5,1800000,1500000,0
-einbech.gat,0,0,0,0 monster Wild Rose 1261,1,3600000,3000000,0
-
-//==================================================
-// payon_in02 - Inside Payon
-//==================================================
-payon_in02.gat,23,68,5,5 monster Thief Bug 1051,7,1200000,600000,0
-
-//==================================================
-// sec_in02 - Inside Valhalla
-//==================================================
-sec_in02.gat,139,80,20,10 monster Poring 1002,5,0,0,0
-sec_in02.gat,138,54,20,20 monster Marin 1242,5,0,0,0
-sec_in02.gat,161,46,15,15 monster Poporing 1031,5,0,0,0
-sec_in02.gat,114,47,10,10 monster Drops 1113,5,0,0,0
-sec_in02.gat,114,47,10,10 monster Bigfoot 1060,10,0,0,0
-sec_in02.gat,139,80,30,30 monster Flora 1118,10,0,0,0
+//===== eAthena Script =======================================
+//= Mob Spawn in cities
+//===== By: ==================================================
+//= massdriller
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Spawns monsters to clean up city. Apparently spawning
+//= occured in iRO and kRO. Enable this if you want.
+//= 0.1a Added a few more towns to spawn Wild rose [MasterOfMuppets]
+//= 0.1b And even more from Poki#3 [Komurka]
+//= 1.0 Removed unofficial city cleaners [Playtester]
+//= 1.0 Added other city spawns [Playtester]
+//============================================================
+
+prontera.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+morocc.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+alberta.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+aldebaran.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+geffen.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+payon.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+comodo.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+izlude.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+yuno.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+umbala.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+amatsu.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+gonryun.gat,0,0,0,0 monster Wild Rose 1261,1,7200000,3600000,0
+
+//==================================================
+// einbech - Einbech, The Mining Village
+//==================================================
+einbech.gat,0,0,0,0 monster Tarou 1175,5,1800000,1500000,0
+einbech.gat,0,0,0,0 monster Wild Rose 1261,1,3600000,3000000,0
+
+//==================================================
+// payon_in02 - Inside Payon
+//==================================================
+payon_in02.gat,23,68,5,5 monster Thief Bug 1051,7,1200000,600000,0
+
+//==================================================
+// sec_in02 - Inside Valhalla
+//==================================================
+sec_in02.gat,139,80,20,10 monster Poring 1002,5,0,0,0
+sec_in02.gat,138,54,20,20 monster Marin 1242,5,0,0,0
+sec_in02.gat,161,46,15,15 monster Poporing 1031,5,0,0,0
+sec_in02.gat,114,47,10,10 monster Drops 1113,5,0,0,0
+sec_in02.gat,114,47,10,10 monster Bigfoot 1060,10,0,0,0
+sec_in02.gat,139,80,30,30 monster Flora 1118,10,0,0,0
diff --git a/npc/mobs/dungeons/abyss.txt b/npc/mobs/dungeons/abyss.txt
index ffebf2633..7df05ed72 100644
--- a/npc/mobs/dungeons/abyss.txt
+++ b/npc/mobs/dungeons/abyss.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= Abyss Lake Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Real spawns by Poki#3 [Nexon]
-//= 1.1 More official spawns [Playtester]
-//= 1.2 Official X.3 spawns [Playtester]
-//============================================================
-
-//==================================================
-// abyss_01 - Abyss Lakes Underground Cave F1
-//==================================================
-abyss_01.gat,0,0,0,0 monster Mimic 1191,10,600000,0,0
-abyss_01.gat,0,0,0,0 monster Ancient Mimic 1699,10,600000,0,0
-abyss_01.gat,152,205,130,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,152,205,130,70 monster Ferus 1717,25,300000,0,0
-abyss_01.gat,152,205,130,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,152,205,130,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,103,93,85,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,103,93,85,70 monster Ferus 1717,15,300000,0,0
-abyss_01.gat,103,93,85,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,103,93,85,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,195,102,85,70 monster Ferus 1714,10,0,0,0
-abyss_01.gat,195,102,85,70 monster Ferus 1717,15,300000,0,0
-abyss_01.gat,195,102,85,70 monster Novus 1715,3,0,0,0
-abyss_01.gat,195,102,85,70 monster Novus 1718,3,0,0,0
-abyss_01.gat,110,170,15,15 monster Penomena 1216,15,660000,300000,0
-abyss_01.gat,195,147,5,10 monster Penomena 1216,5,720000,300000,0
-abyss_01.gat,140,100,15,5 monster Penomena 1216,10,780000,300000,0
-abyss_01.gat,260,40,14,14 monster Dragon Egg 1721,3,1200000,600000,0
-abyss_01.gat,150,160,50,50 monster Dragon Egg 1721,5,1800000,600000,0
-
-//==================================================
-// abyss_02 - Abyss Lakes Underground Cave F2
-//==================================================
-abyss_02.gat,0,0,0,0 monster Mimic 1191,10,900000,0,0
-abyss_02.gat,0,0,0,0 monster Ancient Mimic 1699,10,900000,0,0
-abyss_02.gat,0,0,0,0 monster Ferus 1714,50,300000,0,0
-abyss_02.gat,0,0,0,0 monster Acidus 1713,10,600000,0,0
-abyss_02.gat,0,0,0,0 monster Acidus 1716,60,300000,0,0
-abyss_02.gat,0,0,0,0 monster Novus 1715,5,0,0,0
-abyss_02.gat,0,0,0,0 monster Novus 1718,5,0,0,0
-abyss_02.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
-
-//==================================================
-// abyss_03 - Abyss Lakes Underground Cave F3
-//==================================================
-abyss_03.gat,0,0,0,0 monster Mimic 1191,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ancient Mimic 1699,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Acidus 1713,60,600000,0,0
-abyss_03.gat,0,0,0,0 monster Acidus 1716,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ferus 1714,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Ferus 1717,10,300000,0,0
-abyss_03.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
-abyss_03.gat,0,0,0,0 monster Hydrolancer 1720,3,3000000,2400000,0
-abyss_03.gat,0,0,0,0 monster Detardeurus 1719,1,10800000,7200000,0
+//===== eAthena Script =======================================
+//= Abyss Lake Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Real spawns by Poki#3 [Nexon]
+//= 1.1 More official spawns [Playtester]
+//= 1.2 Official X.3 spawns [Playtester]
+//============================================================
+
+//==================================================
+// abyss_01 - Abyss Lakes Underground Cave F1
+//==================================================
+abyss_01.gat,0,0,0,0 monster Mimic 1191,10,600000,0,0
+abyss_01.gat,0,0,0,0 monster Ancient Mimic 1699,10,600000,0,0
+abyss_01.gat,152,205,130,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,152,205,130,70 monster Ferus 1717,25,300000,0,0
+abyss_01.gat,152,205,130,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,152,205,130,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,103,93,85,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,103,93,85,70 monster Ferus 1717,15,300000,0,0
+abyss_01.gat,103,93,85,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,103,93,85,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,195,102,85,70 monster Ferus 1714,10,0,0,0
+abyss_01.gat,195,102,85,70 monster Ferus 1717,15,300000,0,0
+abyss_01.gat,195,102,85,70 monster Novus 1715,3,0,0,0
+abyss_01.gat,195,102,85,70 monster Novus 1718,3,0,0,0
+abyss_01.gat,110,170,15,15 monster Penomena 1216,15,660000,300000,0
+abyss_01.gat,195,147,5,10 monster Penomena 1216,5,720000,300000,0
+abyss_01.gat,140,100,15,5 monster Penomena 1216,10,780000,300000,0
+abyss_01.gat,260,40,14,14 monster Dragon Egg 1721,3,1200000,600000,0
+abyss_01.gat,150,160,50,50 monster Dragon Egg 1721,5,1800000,600000,0
+
+//==================================================
+// abyss_02 - Abyss Lakes Underground Cave F2
+//==================================================
+abyss_02.gat,0,0,0,0 monster Mimic 1191,10,900000,0,0
+abyss_02.gat,0,0,0,0 monster Ancient Mimic 1699,10,900000,0,0
+abyss_02.gat,0,0,0,0 monster Ferus 1714,50,300000,0,0
+abyss_02.gat,0,0,0,0 monster Acidus 1713,10,600000,0,0
+abyss_02.gat,0,0,0,0 monster Acidus 1716,60,300000,0,0
+abyss_02.gat,0,0,0,0 monster Novus 1715,5,0,0,0
+abyss_02.gat,0,0,0,0 monster Novus 1718,5,0,0,0
+abyss_02.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
+
+//==================================================
+// abyss_03 - Abyss Lakes Underground Cave F3
+//==================================================
+abyss_03.gat,0,0,0,0 monster Mimic 1191,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ancient Mimic 1699,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Acidus 1713,60,600000,0,0
+abyss_03.gat,0,0,0,0 monster Acidus 1716,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ferus 1714,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Ferus 1717,10,300000,0,0
+abyss_03.gat,0,0,0,0 monster Dragon Egg 1721,10,1800000,600000,0
+abyss_03.gat,0,0,0,0 monster Hydrolancer 1720,3,3000000,2400000,0
+abyss_03.gat,0,0,0,0 monster Detardeurus 1719,1,10800000,7200000,0
diff --git a/npc/mobs/dungeons/amatdun.txt b/npc/mobs/dungeons/amatdun.txt
index 9a5e49db6..989eb9f63 100644
--- a/npc/mobs/dungeons/amatdun.txt
+++ b/npc/mobs/dungeons/amatdun.txt
@@ -1,41 +1,41 @@
-//===== eAthena Script =======================================
-//= Amatsu Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// ama_dun01 - Tatami Maze
-//==================================================
-ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
-ama_dun01.gat,0,0,0,0 monster Firelock Soldier 1403,45,0,0,0
-ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
-
-//==================================================
-// ama_dun02 - Battle Field in the Underground Forest
-//==================================================
-ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,180000,90000,0
-ama_dun02.gat,0,0,0,0 monster Firelock Soldier 1403,20,60000,30000,0
-ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,120000,60000,0
-ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
-ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
-ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,180000,90000,0
-
-//==================================================
-// ama_dun03 - Amatsu Underground Shrine
-//==================================================
-ama_dun03.gat,0,0,0,0 monster Shinobi 1401,35,600000,300000,0
-ama_dun03.gat,0,0,0,0 monster Firelock Soldier 1403,25,0,0,0
-ama_dun03.gat,0,0,0,0 monster Miyabi Doll 1404,1,0,0,0
-ama_dun03.gat,0,0,0,0 monster Tengu 1405,40,600000,300000,0
-ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
-ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,600000,300000,0
-ama_dun03.gat,0,0,0,0 monster Samurai Specter 1492,1,5460000,3600000,0
-ama_dun03.gat,0,0,0,0 monster Shinobi 1401,20,5450000,3600000,0
-ama_dun03.gat,0,0,0,0 monster Tengu 1405,15,5440000,3600000,0
+//===== eAthena Script =======================================
+//= Amatsu Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// ama_dun01 - Tatami Maze
+//==================================================
+ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
+ama_dun01.gat,0,0,0,0 monster Firelock Soldier 1403,45,0,0,0
+ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
+
+//==================================================
+// ama_dun02 - Battle Field in the Underground Forest
+//==================================================
+ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,180000,90000,0
+ama_dun02.gat,0,0,0,0 monster Firelock Soldier 1403,20,60000,30000,0
+ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,120000,60000,0
+ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,180000,90000,0
+ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
+ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,180000,90000,0
+
+//==================================================
+// ama_dun03 - Amatsu Underground Shrine
+//==================================================
+ama_dun03.gat,0,0,0,0 monster Shinobi 1401,35,600000,300000,0
+ama_dun03.gat,0,0,0,0 monster Firelock Soldier 1403,25,0,0,0
+ama_dun03.gat,0,0,0,0 monster Miyabi Doll 1404,1,0,0,0
+ama_dun03.gat,0,0,0,0 monster Tengu 1405,40,600000,300000,0
+ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
+ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,600000,300000,0
+ama_dun03.gat,0,0,0,0 monster Samurai Specter 1492,1,5460000,3600000,0
+ama_dun03.gat,0,0,0,0 monster Shinobi 1401,20,5450000,3600000,0
+ama_dun03.gat,0,0,0,0 monster Tengu 1405,15,5440000,3600000,0
diff --git a/npc/mobs/dungeons/anthell.txt b/npc/mobs/dungeons/anthell.txt
index 8f297b3e7..ca0e17090 100644
--- a/npc/mobs/dungeons/anthell.txt
+++ b/npc/mobs/dungeons/anthell.txt
@@ -1,121 +1,121 @@
-//===== eAthena Script =======================================
-//= Ant Hell Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// anthell01 - Ant Hell F1
-//==================================================
-anthell01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-anthell01.gat,0,0,0,0 monster Andre 1095,15,0,0,0
-anthell01.gat,0,0,0,0 monster Piere 1160,50,0,0,0
-anthell01.gat,0,0,0,0 monster Deniro 1105,40,0,0,0
-anthell01.gat,0,0,0,0 monster Vitata 1176,10,0,0,0
-anthell01.gat,0,0,0,0 monster Giearth 1121,1,0,0,0
-anthell01.gat,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,1
-anthell01.gat,28,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,261,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,264,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,262,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,263,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,270,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,269,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,268,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,267,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,269,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,268,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,267,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,266,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,197,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,196,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,194,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,33,195,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,33,196,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,190,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,190,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,189,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,198,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,32,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,31,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,40,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,168,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,167,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,42,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,41,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,43,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,44,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,45,165,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,44,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,43,166,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,30,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,29,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,37,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,36,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,35,186,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,36,187,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,184,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,38,183,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,37,183,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,99,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,98,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,127,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,126,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,125,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,124,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,97,123,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,98,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,99,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,100,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,101,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,123,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,122,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,104,120,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,103,120,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,103,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,105,124,0,0 monster Ant Egg 1097,1,60000,30000,0
-
-//==================================================
-// anthell02 - Ant Hell F2
-//==================================================
-anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,0,0,0
-anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-anthell02.gat,0,0,0,0 monster Andre 1095,50,0,0,0
-anthell02.gat,0,0,0,0 monster Piere 1160,15,0,0,0
-anthell02.gat,0,0,0,0 monster Deniro 1105,15,0,0,0
-anthell02.gat,0,0,0,0 monster Vitata 1176,30,0,0,0
-anthell02.gat,0,0,0,0 monster Giearth 1121,3,0,0,0
-anthell02.gat,0,0,0,0 monster Maya 1147,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Ant Hell Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// anthell01 - Ant Hell F1
+//==================================================
+anthell01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+anthell01.gat,0,0,0,0 monster Andre 1095,15,0,0,0
+anthell01.gat,0,0,0,0 monster Piere 1160,50,0,0,0
+anthell01.gat,0,0,0,0 monster Deniro 1105,40,0,0,0
+anthell01.gat,0,0,0,0 monster Vitata 1176,10,0,0,0
+anthell01.gat,0,0,0,0 monster Giearth 1121,1,0,0,0
+anthell01.gat,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,1
+anthell01.gat,28,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,261,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,264,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,262,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,263,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,270,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,269,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,268,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,267,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,269,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,268,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,267,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,266,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,197,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,196,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,194,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,33,195,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,33,196,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,190,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,190,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,189,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,198,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,32,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,31,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,40,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,168,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,167,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,42,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,41,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,43,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,44,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,45,165,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,44,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,43,166,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,30,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,29,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,37,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,36,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,35,186,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,36,187,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,184,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,38,183,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,37,183,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,99,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,98,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,127,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,126,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,125,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,124,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,97,123,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,98,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,99,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,100,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,101,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,123,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,122,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,104,120,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,103,120,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,103,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,102,121,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,105,124,0,0 monster Ant Egg 1097,1,60000,30000,0
+
+//==================================================
+// anthell02 - Ant Hell F2
+//==================================================
+anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,0,0,0
+anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+anthell02.gat,0,0,0,0 monster Andre 1095,50,0,0,0
+anthell02.gat,0,0,0,0 monster Piere 1160,15,0,0,0
+anthell02.gat,0,0,0,0 monster Deniro 1105,15,0,0,0
+anthell02.gat,0,0,0,0 monster Vitata 1176,30,0,0,0
+anthell02.gat,0,0,0,0 monster Giearth 1121,3,0,0,0
+anthell02.gat,0,0,0,0 monster Maya 1147,1,7200000,3600000,1
diff --git a/npc/mobs/dungeons/ayodun.txt b/npc/mobs/dungeons/ayodun.txt
index 020f95907..2ba4b4fcd 100644
--- a/npc/mobs/dungeons/ayodun.txt
+++ b/npc/mobs/dungeons/ayodun.txt
@@ -1,29 +1,29 @@
-//===== eAthena Script =======================================
-//= Ayothana Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= Currently using euRO data provided by Ishizu
-//= 1.2 Moved Tao Gunka to west cave of Comodo [Lupus]
-//= 1.3 Official jRO 10.3 spawns [Playtester]
-//============================================================
-
-//==================================================
-// ayo_dun01 - Ancient Shrine Maze
-//==================================================
-ayo_dun01.gat,0,0,0,0 monster Leaf Cat 1586,65,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Kraben 1587,5,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
-
-//==================================================
-// ayo_dun02 - Inside Ancient Shrine
-//==================================================
-ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,70,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
-ayo_dun02.gat,150,90,15,30 monster Lady Tanee 1688,1,25200000,18000000,0
+//===== eAthena Script =======================================
+//= Ayothana Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= Currently using euRO data provided by Ishizu
+//= 1.2 Moved Tao Gunka to west cave of Comodo [Lupus]
+//= 1.3 Official jRO 10.3 spawns [Playtester]
+//============================================================
+
+//==================================================
+// ayo_dun01 - Ancient Shrine Maze
+//==================================================
+ayo_dun01.gat,0,0,0,0 monster Leaf Cat 1586,65,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Kraben 1587,5,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
+
+//==================================================
+// ayo_dun02 - Inside Ancient Shrine
+//==================================================
+ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,70,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
+ayo_dun02.gat,150,90,15,30 monster Lady Tanee 1688,1,25200000,18000000,0
diff --git a/npc/mobs/dungeons/beachdun.txt b/npc/mobs/dungeons/beachdun.txt
index 30d11cb75..265e7a6ae 100644
--- a/npc/mobs/dungeons/beachdun.txt
+++ b/npc/mobs/dungeons/beachdun.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= Beach Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// beach_dun - Karu, the West Cave
-//==================================================
-beach_dun.gat,0,0,0,0 monster Medusa 1148,20,0,0,0
-beach_dun.gat,0,0,0,0 monster Merman 1264,3,10000,5000,0
-beach_dun.gat,0,0,0,0 monster Nereid 1255,15,0,0,0
-beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-beach_dun.gat,0,0,0,0 monster Penomena 1216,5,30000,0,0
-beach_dun.gat,0,0,0,0 monster Tao Gunka 1583,1,7380000,3600000,0
-
-//==================================================
-// beach_dun2 - Ruande, the North Cave
-//==================================================
-beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
-beach_dun2.gat,0,0,0,0 monster Nereid 1255,5,0,0,0
-beach_dun2.gat,0,0,0,0 monster Stalactic Golem 1278,40,5000,0,0
-beach_dun2.gat,0,0,0,0 monster Tri Joint 1279,20,0,0,0
-beach_dun2.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
-
-//==================================================
-// beach_dun3 - Mao, the East Cave
-//==================================================
-beach_dun3.gat,0,0,0,0 monster Nereid 1255,1,200000,100000,0
-beach_dun3.gat,0,0,0,0 monster Thara Frog 1034,50,0,0,0
-beach_dun3.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
-beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,0
+//===== eAthena Script =======================================
+//= Beach Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// beach_dun - Karu, the West Cave
+//==================================================
+beach_dun.gat,0,0,0,0 monster Medusa 1148,20,0,0,0
+beach_dun.gat,0,0,0,0 monster Merman 1264,3,10000,5000,0
+beach_dun.gat,0,0,0,0 monster Nereid 1255,15,0,0,0
+beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+beach_dun.gat,0,0,0,0 monster Penomena 1216,5,30000,0,0
+beach_dun.gat,0,0,0,0 monster Tao Gunka 1583,1,7380000,3600000,0
+
+//==================================================
+// beach_dun2 - Ruande, the North Cave
+//==================================================
+beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
+beach_dun2.gat,0,0,0,0 monster Nereid 1255,5,0,0,0
+beach_dun2.gat,0,0,0,0 monster Stalactic Golem 1278,40,5000,0,0
+beach_dun2.gat,0,0,0,0 monster Tri Joint 1279,20,0,0,0
+beach_dun2.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
+
+//==================================================
+// beach_dun3 - Mao, the East Cave
+//==================================================
+beach_dun3.gat,0,0,0,0 monster Nereid 1255,1,200000,100000,0
+beach_dun3.gat,0,0,0,0 monster Thara Frog 1034,50,0,0,0
+beach_dun3.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
+beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,0
diff --git a/npc/mobs/dungeons/byalan.txt b/npc/mobs/dungeons/byalan.txt
index 2c66dec57..7b20e936e 100644
--- a/npc/mobs/dungeons/byalan.txt
+++ b/npc/mobs/dungeons/byalan.txt
@@ -1,109 +1,109 @@
-//===== eAthena Script =======================================
-//= Byalan Island Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns for 1-4 [Playtester]
-//============================================================
-
-//==================================================
-// iz_dun00 - Undersea Tunnel F1
-//==================================================
-iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
-iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
-iz_dun00.gat,0,0,0,0 monster Kukre 1070,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Vadon 1066,15,0,0,0
-iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-
-//==================================================
-// iz_dun01 - Undersea Tunnel F2
-//==================================================
-iz_dun01.gat,0,0,0,0 monster Plankton 1161,10,0,0,0
-iz_dun01.gat,0,0,0,0 monster Marina 1141,15,0,0,0
-iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
-iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
-iz_dun01.gat,0,0,0,0 monster Vadon 1066,60,0,0,0
-iz_dun01.gat,0,0,0,0 monster Cornutus 1067,15,300000,150000,1
-iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
-
-//==================================================
-// iz_dun02 - Undersea Tunnel F3
-//==================================================
-iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
-iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
-iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
-iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
-
-//==================================================
-// iz_dun03 - Undersea Tunnel F4
-//==================================================
-iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
-iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
-iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
-iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
-iz_dun03.gat,0,0,0,0 monster Marc 1045,40,0,0,0
-iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
-iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,323000,150000,0
-iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,317000,150000,0
-iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,323000,150000,0
-iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
-iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
-iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
-iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,316000,150000,0
-iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,296000,150000,0
-iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
-iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
-iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
-
-//==================================================
-// iz_dun04 - Undersea Tunnel F5
-//==================================================
-iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,10,0,0,0
-iz_dun04.gat,0,0,0,0 monster Swordfish 1069,10,0,0,0
-iz_dun04.gat,0,0,0,0 monster Merman 1264,50,0,0,0
-iz_dun04.gat,0,0,0,0 monster Strouf 1065,50,0,0,0
-iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,0
-iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
-iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,308000,150000,0
-iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
-iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
-iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,303000,150000,0
-iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,600000,300000,0
+//===== eAthena Script =======================================
+//= Byalan Island Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns for 1-4 [Playtester]
+//============================================================
+
+//==================================================
+// iz_dun00 - Undersea Tunnel F1
+//==================================================
+iz_dun00.gat,0,0,0,0 monster Plankton 1161,65,0,0,0
+iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
+iz_dun00.gat,0,0,0,0 monster Kukre 1070,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Hydra 1068,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Vadon 1066,15,0,0,0
+iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+
+//==================================================
+// iz_dun01 - Undersea Tunnel F2
+//==================================================
+iz_dun01.gat,0,0,0,0 monster Plankton 1161,10,0,0,0
+iz_dun01.gat,0,0,0,0 monster Marina 1141,15,0,0,0
+iz_dun01.gat,0,0,0,0 monster Kukre 1070,50,0,0,0
+iz_dun01.gat,0,0,0,0 monster Hydra 1068,30,0,0,0
+iz_dun01.gat,0,0,0,0 monster Vadon 1066,60,0,0,0
+iz_dun01.gat,0,0,0,0 monster Cornutus 1067,15,300000,150000,1
+iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
+
+//==================================================
+// iz_dun02 - Undersea Tunnel F3
+//==================================================
+iz_dun02.gat,0,0,0,0 monster Hydra 1068,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Cornutus 1067,60,0,0,0
+iz_dun02.gat,0,0,0,0 monster Marse 1144,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Obeaune 1044,40,0,0,0
+iz_dun02.gat,0,0,0,0 monster Merman 1264,1,0,0,0
+iz_dun02.gat,0,0,0,0 monster Black Mushroom 1084,15,180000,90000,1
+
+//==================================================
+// iz_dun03 - Undersea Tunnel F4
+//==================================================
+iz_dun03.gat,0,0,0,0 monster Hydra 1068,10,0,0,0
+iz_dun03.gat,0,0,0,0 monster Phen 1158,45,0,0,0
+iz_dun03.gat,0,0,0,0 monster Marine Sphere 1142,20,0,0,0
+iz_dun03.gat,0,0,0,0 monster Swordfish 1069,40,0,0,0
+iz_dun03.gat,0,0,0,0 monster Marc 1045,40,0,0,0
+iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
+iz_dun03.gat,203,56,0,0 monster Hydra 1068,1,323000,150000,0
+iz_dun03.gat,203,53,0,0 monster Hydra 1068,1,317000,150000,0
+iz_dun03.gat,203,50,0,0 monster Hydra 1068,1,323000,150000,0
+iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
+iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
+iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
+iz_dun03.gat,191,144,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun03.gat,194,144,0,0 monster Hydra 1068,1,316000,150000,0
+iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,296000,150000,0
+iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
+iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
+iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun03.gat,193,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,176,260,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,180,251,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,178,253,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,108,249,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,0,0,0,0 monster Merman 1264,3,0,0,0
+
+//==================================================
+// iz_dun04 - Undersea Tunnel F5
+//==================================================
+iz_dun04.gat,0,0,0,0 monster Marine Sphere 1142,10,0,0,0
+iz_dun04.gat,0,0,0,0 monster Swordfish 1069,10,0,0,0
+iz_dun04.gat,0,0,0,0 monster Merman 1264,50,0,0,0
+iz_dun04.gat,0,0,0,0 monster Strouf 1065,50,0,0,0
+iz_dun04.gat,58,135,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun04.gat,61,135,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,0
+iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
+iz_dun04.gat,38,129,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,33,129,0,0 monster Hydra 1068,1,308000,150000,0
+iz_dun04.gat,38,115,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,33,115,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
+iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
+iz_dun04.gat,111,41,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,111,38,0,0 monster Hydra 1068,1,303000,150000,0
+iz_dun04.gat,111,35,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,69,243,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun04.gat,124,233,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,134,233,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun04.gat,95,147,0,0 monster Deviace 1108,3,600000,300000,0
diff --git a/npc/mobs/dungeons/clocktower.txt b/npc/mobs/dungeons/clocktower.txt
index a85a4fa8f..267ec8f6f 100644
--- a/npc/mobs/dungeons/clocktower.txt
+++ b/npc/mobs/dungeons/clocktower.txt
@@ -1,156 +1,156 @@
-//===== eAthena Script =======================================
-//= Clock Tower Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// alde_dun01 - Clock Tower B1
-//==================================================
-alde_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
-alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
-
-//==================================================
-// alde_dun02 - Clock Tower B2
-//==================================================
-alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
-alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
-alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-alde_dun02.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
-
-//==================================================
-// alde_dun03 - Clock Tower B3
-//==================================================
-alde_dun03.gat,0,0,0,0 monster Cramp 1209,25,0,0,0
-alde_dun03.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-alde_dun03.gat,77,28,5,5 monster Cramp 1209,3,40000,20000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
-alde_dun03.gat,184,61,30,30 monster Cramp 1209,10,300000,150000,0
-alde_dun03.gat,184,61,30,30 monster Drainliar 1111,10,300000,150000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,5,300000,150000,0
-alde_dun03.gat,163,56,10,10 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,168,42,6,6 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,147,30,8,8 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,0
-alde_dun03.gat,126,53,20,20 monster Cramp 1209,5,300000,150000,0
-alde_dun03.gat,126,53,20,20 monster Drainliar 1111,5,300000,150000,0
-alde_dun03.gat,102,40,10,10 monster Penomena 1216,4,600000,300000,0
-alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
-alde_dun03.gat,130,220,40,40 monster Cramp 1209,10,300000,150000,0
-alde_dun03.gat,130,220,40,40 monster Drainliar 1111,10,300000,150000,0
-alde_dun03.gat,155,201,25,25 monster Penomena 1216,7,600000,300000,0
-alde_dun03.gat,160,181,8,8 monster Penomena 1216,2,600000,300000,0
-alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Penomena 1216,5,600000,300000,0
-alde_dun03.gat,127,204,9,9 monster Cramp 1209,3,300000,150000,0
-alde_dun03.gat,142,157,8,8 monster Penomena 1216,5,600000,300000,0
-alde_dun03.gat,135,140,8,8 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Penomena 1216,3,600000,300000,0
-alde_dun03.gat,120,157,8,8 monster Drainliar 1111,10,300000,150000,0
-
-//==================================================
-// alde_dun04 - Clock Tower B4
-//==================================================
-alde_dun04.gat,0,0,0,0 monster Bathory 1102,50,0,0,0
-alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
-alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Ogretooth 1204,1,3600000,1800000,1
-alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-
-//==================================================
-// c_tower1 - Clock Tower F1
-//==================================================
-c_tower1.gat,0,0,0,0 monster Punk 1199,70,0,0,0
-c_tower1.gat,0,0,0,0 monster Rideword 1195,70,0,0,0
-c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower1.gat,0,0,0,0 monster Bathory 1102,1,0,0,0
-
-//==================================================
-// c_tower2 - Clock Tower F2
-//==================================================
-c_tower2.gat,0,0,0,0 monster Punk 1199,40,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock 1269,40,0,0,0
-c_tower2.gat,0,0,0,0 monster Rideword 1195,7,0,0,0
-c_tower2.gat,128,100,10,10 monster Rideword 1195,1,60000,30000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,120000,60000,0
-c_tower2.gat,149,199,10,10 monster Rideword 1195,1,300000,120000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,120000,60000,0
-c_tower2.gat,273,286,20,20 monster Rideword 1195,1,300000,120000,0
-c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-
-//==================================================
-// c_tower3 - Clock Tower F3
-//==================================================
-c_tower3.gat,0,0,0,0 monster Alarm 1193,60,0,0,0
-c_tower3.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-c_tower3.gat,153,220,10,10 monster Rideword 1195,1,126000,100000,0
-c_tower3.gat,0,0,0,0 monster Mimic 1191,15,0,0,0
-c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
-
-//==================================================
-// c_tower4 - Clock Tower F4
-//==================================================
-c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,2,1800000,0,0
-c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,1,3600000,0,0
-c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
-c_tower4.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
-c_tower4.gat,0,0,0,0 monster Elder 1377,1,1800000,600000,0
-c_tower4.gat,108,198,100,10 monster Alarm 1193,6,0,0,0
-c_tower4.gat,108,178,100,10 monster Alarm 1193,6,0,0,0
-c_tower4.gat,108,158,100,10 monster Alarm 1193,6,0,0,0
-c_tower4.gat,108,138,100,10 monster Alarm 1193,6,0,0,0
-c_tower4.gat,108,118,100,10 monster Alarm 1193,6,0,0,0
-c_tower4.gat,108,98,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,78,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,58,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,38,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,18,100,10 monster Clock 1269,7,0,0,0
-c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,0,0,0
-c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
-c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
-c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
-c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
-c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
-c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
-c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
-c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
-c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
-c_tower4.gat,86,180,0,0 monster Rideword 1195,1,380000,150000,1
-c_tower4.gat,80,179,0,0 monster Rideword 1195,1,360000,150000,1
-c_tower4.gat,80,180,0,0 monster Rideword 1195,1,350000,150000,1
-c_tower4.gat,80,181,0,0 monster Rideword 1195,1,290000,150000,1
-c_tower4.gat,80,182,0,0 monster Rideword 1195,1,300000,150000,1
-c_tower4.gat,80,183,0,0 monster Rideword 1195,1,340000,150000,1
-c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
-c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,0,0,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Clock Tower Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// alde_dun01 - Clock Tower B1
+//==================================================
+alde_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
+alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
+
+//==================================================
+// alde_dun02 - Clock Tower B2
+//==================================================
+alde_dun02.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
+alde_dun02.gat,0,0,0,0 monster Orc Archer 1189,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Brilight 1211,20,0,0,0
+alde_dun02.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+alde_dun02.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
+
+//==================================================
+// alde_dun03 - Clock Tower B3
+//==================================================
+alde_dun03.gat,0,0,0,0 monster Cramp 1209,25,0,0,0
+alde_dun03.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+alde_dun03.gat,77,28,5,5 monster Cramp 1209,3,40000,20000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
+alde_dun03.gat,184,61,30,30 monster Cramp 1209,10,300000,150000,0
+alde_dun03.gat,184,61,30,30 monster Drainliar 1111,10,300000,150000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,5,300000,150000,0
+alde_dun03.gat,163,56,10,10 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,168,42,6,6 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,147,30,8,8 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,0
+alde_dun03.gat,126,53,20,20 monster Cramp 1209,5,300000,150000,0
+alde_dun03.gat,126,53,20,20 monster Drainliar 1111,5,300000,150000,0
+alde_dun03.gat,102,40,10,10 monster Penomena 1216,4,600000,300000,0
+alde_dun03.gat,0,0,0,0 monster Penomena 1216,15,300000,150000,0
+alde_dun03.gat,130,220,40,40 monster Cramp 1209,10,300000,150000,0
+alde_dun03.gat,130,220,40,40 monster Drainliar 1111,10,300000,150000,0
+alde_dun03.gat,155,201,25,25 monster Penomena 1216,7,600000,300000,0
+alde_dun03.gat,160,181,8,8 monster Penomena 1216,2,600000,300000,0
+alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Penomena 1216,5,600000,300000,0
+alde_dun03.gat,127,204,9,9 monster Cramp 1209,3,300000,150000,0
+alde_dun03.gat,142,157,8,8 monster Penomena 1216,5,600000,300000,0
+alde_dun03.gat,135,140,8,8 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Penomena 1216,3,600000,300000,0
+alde_dun03.gat,120,157,8,8 monster Drainliar 1111,10,300000,150000,0
+
+//==================================================
+// alde_dun04 - Clock Tower B4
+//==================================================
+alde_dun04.gat,0,0,0,0 monster Bathory 1102,50,0,0,0
+alde_dun04.gat,0,0,0,0 monster Joker 1131,10,0,0,0
+alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Ogretooth 1204,1,3600000,1800000,1
+alde_dun04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+
+//==================================================
+// c_tower1 - Clock Tower F1
+//==================================================
+c_tower1.gat,0,0,0,0 monster Punk 1199,70,0,0,0
+c_tower1.gat,0,0,0,0 monster Rideword 1195,70,0,0,0
+c_tower1.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower1.gat,0,0,0,0 monster Bathory 1102,1,0,0,0
+
+//==================================================
+// c_tower2 - Clock Tower F2
+//==================================================
+c_tower2.gat,0,0,0,0 monster Punk 1199,40,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock 1269,40,0,0,0
+c_tower2.gat,0,0,0,0 monster Rideword 1195,7,0,0,0
+c_tower2.gat,128,100,10,10 monster Rideword 1195,1,60000,30000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,120000,60000,0
+c_tower2.gat,149,199,10,10 monster Rideword 1195,1,300000,120000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,120000,60000,0
+c_tower2.gat,273,286,20,20 monster Rideword 1195,1,300000,120000,0
+c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+c_tower2.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+
+//==================================================
+// c_tower3 - Clock Tower F3
+//==================================================
+c_tower3.gat,0,0,0,0 monster Alarm 1193,60,0,0,0
+c_tower3.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+c_tower3.gat,153,220,10,10 monster Rideword 1195,1,126000,100000,0
+c_tower3.gat,0,0,0,0 monster Mimic 1191,15,0,0,0
+c_tower3.gat,0,0,0,0 monster Clock Tower Manager 1270,1,0,0,0
+
+//==================================================
+// c_tower4 - Clock Tower F4
+//==================================================
+c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,2,1800000,0,0
+c_tower4.gat,0,0,0,0 monster Clock Tower Manager 1270,1,3600000,0,0
+c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
+c_tower4.gat,0,0,0,0 monster Elder 1377,1,3600000,1800000,0
+c_tower4.gat,0,0,0,0 monster Elder 1377,1,1800000,600000,0
+c_tower4.gat,108,198,100,10 monster Alarm 1193,6,0,0,0
+c_tower4.gat,108,178,100,10 monster Alarm 1193,6,0,0,0
+c_tower4.gat,108,158,100,10 monster Alarm 1193,6,0,0,0
+c_tower4.gat,108,138,100,10 monster Alarm 1193,6,0,0,0
+c_tower4.gat,108,118,100,10 monster Alarm 1193,6,0,0,0
+c_tower4.gat,108,98,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,78,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,58,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,38,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,18,100,10 monster Clock 1269,7,0,0,0
+c_tower4.gat,108,198,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,178,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,158,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,138,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,118,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,98,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,78,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,58,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,38,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,108,18,100,10 monster Owl Duke 1320,3,0,0,0
+c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
+c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
+c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
+c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
+c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
+c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
+c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
+c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
+c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
+c_tower4.gat,86,180,0,0 monster Rideword 1195,1,380000,150000,1
+c_tower4.gat,80,179,0,0 monster Rideword 1195,1,360000,150000,1
+c_tower4.gat,80,180,0,0 monster Rideword 1195,1,350000,150000,1
+c_tower4.gat,80,181,0,0 monster Rideword 1195,1,290000,150000,1
+c_tower4.gat,80,182,0,0 monster Rideword 1195,1,300000,150000,1
+c_tower4.gat,80,183,0,0 monster Rideword 1195,1,340000,150000,1
+c_tower4.gat,128,194,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,37,159,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,31,139,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,14,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,104,27,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,105,24,0,0 monster Mimic 1191,1,900000,400000,1
+c_tower4.gat,205,105,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,0,0,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,148,85,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,189,51,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,170,34,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,42,41,0,0 monster Executioner 1205,1,7200000,3600000,1
diff --git a/npc/mobs/dungeons/coalmine.txt b/npc/mobs/dungeons/coalmine.txt
index aab659757..63111f0b5 100644
--- a/npc/mobs/dungeons/coalmine.txt
+++ b/npc/mobs/dungeons/coalmine.txt
@@ -1,36 +1,36 @@
-//===== eAthena Script =======================================
-//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// mjo_dun01 - Mjolnir Dead Pit F1
-//==================================================
-mjo_dun01.gat,0,0,0,0 monster Familiar 1005,30,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
-mjo_dun01.gat,0,0,0,0 monster Martin 1145,20,0,0,0
-
-//==================================================
-// mjo_dun02 - Mjolnir Dead Pit F2
-//==================================================
-mjo_dun02.gat,0,0,0,0 monster Martin 1145,60,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
-mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
-
-//==================================================
-// mjo_dun03 - Mjolnir Dead Pit F3
-//==================================================
-mjo_dun03.gat,0,0,0,0 monster Martin 1145,5,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,70,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Giearth 1121,5,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Myst 1151,35,0,0,0
-mjo_dun03.gat,0,0,0,0 monster Cramp 1209,2,300000,150000,0
-mjo_dun03.gat,0,0,0,0 monster Cramp 1209,1,50000,25000,0
+//===== eAthena Script =======================================
+//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// mjo_dun01 - Mjolnir Dead Pit F1
+//==================================================
+mjo_dun01.gat,0,0,0,0 monster Familiar 1005,30,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
+mjo_dun01.gat,0,0,0,0 monster Martin 1145,20,0,0,0
+
+//==================================================
+// mjo_dun02 - Mjolnir Dead Pit F2
+//==================================================
+mjo_dun02.gat,0,0,0,0 monster Martin 1145,60,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Skeleton Worker 1169,20,0,0,0
+mjo_dun02.gat,0,0,0,0 monster Giearth 1121,35,30000,10000,0
+
+//==================================================
+// mjo_dun03 - Mjolnir Dead Pit F3
+//==================================================
+mjo_dun03.gat,0,0,0,0 monster Martin 1145,5,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Skeleton Worker 1169,70,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Giearth 1121,5,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Myst 1151,35,0,0,0
+mjo_dun03.gat,0,0,0,0 monster Cramp 1209,2,300000,150000,0
+mjo_dun03.gat,0,0,0,0 monster Cramp 1209,1,50000,25000,0
diff --git a/npc/mobs/dungeons/eindun.txt b/npc/mobs/dungeons/eindun.txt
index 1f08bee89..324686307 100644
--- a/npc/mobs/dungeons/eindun.txt
+++ b/npc/mobs/dungeons/eindun.txt
@@ -1,35 +1,35 @@
-//===== eAthena Script =======================================
-//= Einbroch Dungeon (Mine) Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 spawn N and spawn delays aren't yet correct, so I set
-//= respawn delays quite big for now [Lupus]
-//= 1.1 Fixed monsters spawn places
-//= 1.2 Update monster spawn numbers according to info on emperium.org [MasterOfMuppets]
-//= 1.3 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// ein_dun01 - Mine Dungeon F1
-//==================================================
-ein_dun01.gat,0,0,0,0 monster Pitman 1616,55,0,0,0
-ein_dun01.gat,0,0,0,0 monster Noxious 1620,40,0,0,0
-ein_dun01.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
-ein_dun01.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
-ein_dun01.gat,0,0,0,0 monster Old Stove 1617,5,120000,600000,0
-ein_dun01.gat,0,0,0,0 monster Ungoliant 1618,1,3600000,3000000,0
-
-//==================================================
-// ein_dun02 - Mine Dungeon F2
-//==================================================
-ein_dun02.gat,0,0,0,0 monster Mineral 1614,50,0,0,0
-ein_dun02.gat,0,0,0,0 monster Obsidian 1615,40,0,0,0
-ein_dun02.gat,0,0,0,0 monster Teddy Bear 1622,30,0,0,0
-ein_dun02.gat,0,0,0,0 monster Old Stove 1617,30,0,0,0
-ein_dun02.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
-ein_dun02.gat,0,0,0,0 monster RSX-0806 1623,1,7500000,7200000,0
+//===== eAthena Script =======================================
+//= Einbroch Dungeon (Mine) Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 spawn N and spawn delays aren't yet correct, so I set
+//= respawn delays quite big for now [Lupus]
+//= 1.1 Fixed monsters spawn places
+//= 1.2 Update monster spawn numbers according to info on emperium.org [MasterOfMuppets]
+//= 1.3 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// ein_dun01 - Mine Dungeon F1
+//==================================================
+ein_dun01.gat,0,0,0,0 monster Pitman 1616,55,0,0,0
+ein_dun01.gat,0,0,0,0 monster Noxious 1620,40,0,0,0
+ein_dun01.gat,0,0,0,0 monster Porcellio 1619,30,0,0,0
+ein_dun01.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
+ein_dun01.gat,0,0,0,0 monster Old Stove 1617,5,120000,600000,0
+ein_dun01.gat,0,0,0,0 monster Ungoliant 1618,1,3600000,3000000,0
+
+//==================================================
+// ein_dun02 - Mine Dungeon F2
+//==================================================
+ein_dun02.gat,0,0,0,0 monster Mineral 1614,50,0,0,0
+ein_dun02.gat,0,0,0,0 monster Obsidian 1615,40,0,0,0
+ein_dun02.gat,0,0,0,0 monster Teddy Bear 1622,30,0,0,0
+ein_dun02.gat,0,0,0,0 monster Old Stove 1617,30,0,0,0
+ein_dun02.gat,0,0,0,0 monster Venomous 1621,20,0,0,0
+ein_dun02.gat,0,0,0,0 monster RSX-0806 1623,1,7500000,7200000,0
diff --git a/npc/mobs/dungeons/gefenia.txt b/npc/mobs/dungeons/gefenia.txt
index f9ef3f02f..7992a6ffa 100644
--- a/npc/mobs/dungeons/gefenia.txt
+++ b/npc/mobs/dungeons/gefenia.txt
@@ -1,129 +1,129 @@
-//===== eAthena Script =======================================
-//= Gefenia Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Muad_Dib
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= Added 1st Version. [Muad_Dib]
-//= Conversion to eA [MasterOfMuppets]
-//= Updated spawns, information from emperium.org [MasterOfMuppets]
-//= Kept the old spawns incase someone would want them.
-//= Aegis ep 10.1 spawns [MasterOfMuppets]
-//============================================================
-
-//==================================================
-// gefenia01 - Geffenia
-//==================================================
-gefenia01.gat,0,0,0,0 monster False Angel 1371,60,0,0,0
-gefenia01.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Violy 1390,30,0,0,0
-gefenia01.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gefenia01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,10800000,7200000,0
-gefenia01.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia01.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-//==================================================
-// gefenia02 - Geffenia
-//==================================================
-gefenia02.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
-gefenia02.gat,0,0,0,0 monster Succubus 1370,20,0,0,0
-gefenia02.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Violy 1390,40,0,0,0
-gefenia02.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
-gefenia02.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia02.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia02.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia02.gat,0,0,0,0 monster Ogretooth 1204,1,10800000,7200000,0
-
-//==================================================
-// gefenia03 - Geffenia
-//==================================================
-gefenia03.gat,0,0,0,0 monster False Angel 1371,40,0,0,0
-gefenia03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
-gefenia03.gat,0,0,0,0 monster Incubus 1374,20,0,0,0
-gefenia03.gat,0,0,0,0 monster Violy 1390,40,0,0,0
-gefenia03.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
-gefenia03.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia03.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia03.gat,0,0,0,0 monster Executioner 1205,1,10800000,7200000,0
-gefenia03.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-//==================================================
-// gefenia04 - Geffenia
-//==================================================
-gefenia04.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
-gefenia04.gat,0,0,0,0 monster Succubus 1370,10,600000,300000,0
-gefenia04.gat,0,0,0,0 monster Incubus 1374,10,600000,300000,0
-gefenia04.gat,0,0,0,0 monster Violy 1390,30,0,0,0
-gefenia04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gefenia04.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
-gefenia04.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
-gefenia04.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
-gefenia04.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
-
-
-//The spawns bellow, are old ones that were used in events.
-//==================================================
-// gefenia01 - Geffenia (Old)
-//==================================================
-//gefenia01.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
-//gefenia01.gat,0,0,0,0 monster Mini Demon 1292,6,300000,0,0
-//gefenia01.gat,0,0,0,0 monster Apolcalips 1365,4,300000,0,0
-//gefenia01.gat,0,0,0,0 monster Elder 1377,10,300000,0,1
-//gefenia01.gat,0,0,0,0 monster Abyssmal Knight 1219,3,1800000,900000,1
-//gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
-//gefenia01.gat,0,0,0,0 monster Poring 1502,1,0,0,0
-//gefenia01.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,0
-//gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,7200000,3600000,1
-
-//==================================================
-// gefenia02 - Geffenia (Old)
-//==================================================
-//gefenia02.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
-//gefenia02.gat,0,0,0,0 monster Succubus 1370,6,0,0,0
-//gefenia02.gat,0,0,0,0 monster Incubus 1374,6,0,0,0
-//gefenia02.gat,0,0,0,0 monster Mini Demon 1292,10,300000,0,0
-//gefenia02.gat,0,0,0,0 monster Apolcalips 1365,8,300000,0,0
-//gefenia02.gat,0,0,0,0 monster Abyssmal Knight 1219,2,1800000,900000,1
-//gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,5,300000,0,0
-//gefenia02.gat,0,0,0,0 monster Poring 1502,1,0,0,0
-//gefenia02.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
-//gefenia02.gat,0,0,0,0 monster Chimera 1283,1,7200000,3600000,1
-
-//==================================================
-// gefenia03 - Geffenia (Old)
-//==================================================
-//gefenia03.gat,0,0,0,0 monster Fake Angel 1371,4,0,0,0
-//gefenia03.gat,0,0,0,0 monster Succubus 1370,5,0,0,0
-//gefenia03.gat,0,0,0,0 monster Incubus 1374,5,0,0,0
-//gefenia03.gat,0,0,0,0 monster Mini Demon 1292,10,300000,0,0
-//gefenia03.gat,0,0,0,0 monster Apolcalips 1365,6,300000,0,0
-//gefenia03.gat,0,0,0,0 monster Elder 1377,10,300000,0,1
-//gefenia03.gat,0,0,0,0 monster Abyssmal Knight 1219,3,1800000,900000,1
-//gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
-//gefenia03.gat,0,0,0,0 monster Poring 1502,1,0,0,0
-//gefenia03.gat,0,0,0,0 monster Dark Illusion 1302,1,300000,0,0
-//gefenia03.gat,0,0,0,0 monster Owl Baron 1295,1,0,0,0
-
-//==================================================
-// gefenia04 - Geffenia (Old)
-//==================================================
-//gefenia04.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
-//gefenia04.gat,0,0,0,0 monster Succubus 1370,5,0,0,0
-//gefenia04.gat,0,0,0,0 monster Incubus 1374,3,0,0,0
-//gefenia04.gat,0,0,0,0 monster Apolcalips 1365,4,300000,0,0
-//gefenia04.gat,0,0,0,0 monster Abyssmal Knight 1219,5,1800000,900000,1
-//gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
-//gefenia04.gat,0,0,0,0 monster Poring 1502,1,0,0,0
-//gefenia04.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1
-//gefenia04.gat,0,0,0,0 monster Maya Purple 1289,1,1200000,0,0
-//gefenia04.gat,0,0,0,0 monster Cat O' Nine Tail 1307,1,0,0,0
+//===== eAthena Script =======================================
+//= Gefenia Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Muad_Dib
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= Added 1st Version. [Muad_Dib]
+//= Conversion to eA [MasterOfMuppets]
+//= Updated spawns, information from emperium.org [MasterOfMuppets]
+//= Kept the old spawns incase someone would want them.
+//= Aegis ep 10.1 spawns [MasterOfMuppets]
+//============================================================
+
+//==================================================
+// gefenia01 - Geffenia
+//==================================================
+gefenia01.gat,0,0,0,0 monster False Angel 1371,60,0,0,0
+gefenia01.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Violy 1390,30,0,0,0
+gefenia01.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gefenia01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,10800000,7200000,0
+gefenia01.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia01.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+//==================================================
+// gefenia02 - Geffenia
+//==================================================
+gefenia02.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
+gefenia02.gat,0,0,0,0 monster Succubus 1370,20,0,0,0
+gefenia02.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Violy 1390,40,0,0,0
+gefenia02.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
+gefenia02.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia02.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia02.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia02.gat,0,0,0,0 monster Ogretooth 1204,1,10800000,7200000,0
+
+//==================================================
+// gefenia03 - Geffenia
+//==================================================
+gefenia03.gat,0,0,0,0 monster False Angel 1371,40,0,0,0
+gefenia03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
+gefenia03.gat,0,0,0,0 monster Incubus 1374,20,0,0,0
+gefenia03.gat,0,0,0,0 monster Violy 1390,40,0,0,0
+gefenia03.gat,0,0,0,0 monster Mini Demon 1292,30,0,0,0
+gefenia03.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia03.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia03.gat,0,0,0,0 monster Executioner 1205,1,10800000,7200000,0
+gefenia03.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+//==================================================
+// gefenia04 - Geffenia
+//==================================================
+gefenia04.gat,0,0,0,0 monster False Angel 1371,30,0,0,0
+gefenia04.gat,0,0,0,0 monster Succubus 1370,10,600000,300000,0
+gefenia04.gat,0,0,0,0 monster Incubus 1374,10,600000,300000,0
+gefenia04.gat,0,0,0,0 monster Violy 1390,30,0,0,0
+gefenia04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gefenia04.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,3000000,0
+gefenia04.gat,0,0,0,0 monster Mysteltainn 1203,1,18000000,14400000,0
+gefenia04.gat,0,0,0,0 monster Executioner 1205,1,18000000,14400000,0
+gefenia04.gat,0,0,0,0 monster Ogretooth 1204,1,18000000,14400000,0
+
+
+//The spawns bellow, are old ones that were used in events.
+//==================================================
+// gefenia01 - Geffenia (Old)
+//==================================================
+//gefenia01.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
+//gefenia01.gat,0,0,0,0 monster Mini Demon 1292,6,300000,0,0
+//gefenia01.gat,0,0,0,0 monster Apolcalips 1365,4,300000,0,0
+//gefenia01.gat,0,0,0,0 monster Elder 1377,10,300000,0,1
+//gefenia01.gat,0,0,0,0 monster Abyssmal Knight 1219,3,1800000,900000,1
+//gefenia01.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
+//gefenia01.gat,0,0,0,0 monster Poring 1502,1,0,0,0
+//gefenia01.gat,0,0,0,0 monster Executioner 1205,1,3600000,1800000,0
+//gefenia01.gat,0,0,0,0 monster Mysteltainn 1203,1,7200000,3600000,1
+
+//==================================================
+// gefenia02 - Geffenia (Old)
+//==================================================
+//gefenia02.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
+//gefenia02.gat,0,0,0,0 monster Succubus 1370,6,0,0,0
+//gefenia02.gat,0,0,0,0 monster Incubus 1374,6,0,0,0
+//gefenia02.gat,0,0,0,0 monster Mini Demon 1292,10,300000,0,0
+//gefenia02.gat,0,0,0,0 monster Apolcalips 1365,8,300000,0,0
+//gefenia02.gat,0,0,0,0 monster Abyssmal Knight 1219,2,1800000,900000,1
+//gefenia02.gat,0,0,0,0 monster Bloody Knight 1268,5,300000,0,0
+//gefenia02.gat,0,0,0,0 monster Poring 1502,1,0,0,0
+//gefenia02.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
+//gefenia02.gat,0,0,0,0 monster Chimera 1283,1,7200000,3600000,1
+
+//==================================================
+// gefenia03 - Geffenia (Old)
+//==================================================
+//gefenia03.gat,0,0,0,0 monster Fake Angel 1371,4,0,0,0
+//gefenia03.gat,0,0,0,0 monster Succubus 1370,5,0,0,0
+//gefenia03.gat,0,0,0,0 monster Incubus 1374,5,0,0,0
+//gefenia03.gat,0,0,0,0 monster Mini Demon 1292,10,300000,0,0
+//gefenia03.gat,0,0,0,0 monster Apolcalips 1365,6,300000,0,0
+//gefenia03.gat,0,0,0,0 monster Elder 1377,10,300000,0,1
+//gefenia03.gat,0,0,0,0 monster Abyssmal Knight 1219,3,1800000,900000,1
+//gefenia03.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
+//gefenia03.gat,0,0,0,0 monster Poring 1502,1,0,0,0
+//gefenia03.gat,0,0,0,0 monster Dark Illusion 1302,1,300000,0,0
+//gefenia03.gat,0,0,0,0 monster Owl Baron 1295,1,0,0,0
+
+//==================================================
+// gefenia04 - Geffenia (Old)
+//==================================================
+//gefenia04.gat,0,0,0,0 monster Fake Angel 1371,10,0,0,0
+//gefenia04.gat,0,0,0,0 monster Succubus 1370,5,0,0,0
+//gefenia04.gat,0,0,0,0 monster Incubus 1374,3,0,0,0
+//gefenia04.gat,0,0,0,0 monster Apolcalips 1365,4,300000,0,0
+//gefenia04.gat,0,0,0,0 monster Abyssmal Knight 1219,5,1800000,900000,1
+//gefenia04.gat,0,0,0,0 monster Bloody Knight 1268,2,300000,0,0
+//gefenia04.gat,0,0,0,0 monster Poring 1502,1,0,0,0
+//gefenia04.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1
+//gefenia04.gat,0,0,0,0 monster Maya Purple 1289,1,1200000,0,0
+//gefenia04.gat,0,0,0,0 monster Cat O' Nine Tail 1307,1,0,0,0
diff --git a/npc/mobs/dungeons/geftower.txt b/npc/mobs/dungeons/geftower.txt
index 99116a7a1..54070b3a7 100644
--- a/npc/mobs/dungeons/geftower.txt
+++ b/npc/mobs/dungeons/geftower.txt
@@ -1,96 +1,96 @@
-//===== eAthena Script =======================================
-//= Geffen Tower Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// gef_dun00 - Geffen Dungeon F1
-//==================================================
-gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,30,60000,30000,0
-gef_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,25,0,0,0
-gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,300000,150000,0
-gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,300000,150000,0
-gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,0
-gef_dun00.gat,0,0,0,0 monster Red Plant 1078,1,300000,150000,0
-gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
-gef_dun00.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
-gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
-
-//==================================================
-// gef_dun01 - Geffen Dungeon F2
-//==================================================
-gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
-gef_dun01.gat,0,0,0,0 monster Nightmare 1061,30,0,0,0
-gef_dun01.gat,0,0,0,0 monster Ogretooth 1204,1,1800000,1200000,0
-gef_dun01.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
-gef_dun01.gat,0,0,0,0 monster Ghoul 1036,40,0,0,0
-gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,100000,0
-gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,300000,100000,0
-gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
-gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,180000,90000,1
-gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,180000,90000,1
-
-//==================================================
-// gef_dun02 - Geffenia
-//==================================================
-gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,25,0,0,0
-gef_dun02.gat,0,0,0,0 monster Nightmare 1061,40,300000,100000,0
-gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
-gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,180000,90000,1
-gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// gef_dun03 - Geffenia (Event Map)
-//==================================================
-gef_dun03.gat,0,0,0,0 monster Wraith 1192,8,60000,30000,0
-gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,2,60000,30000,0
-gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,3,60000,30000,0
-gef_dun03.gat,0,0,0,0 monster Hellion Revenant 1626,1,600000,300000,1
-gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
-
-//==================================================
-// Old Event Spawn in case you want to use them
-//==================================================
-//gef_dun03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,7200000,1
-//gef_dun03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,7200000,1
-//gef_dun03.gat,0,0,0,0 monster Deviruchi 1109,8,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Joker 1131,5,300000,100000,0
-//gef_dun03.gat,0,0,0,0 monster Khalitzburg 1132,2,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Knight of Abyss 1219,2,300000,0,0
-//gef_dun03.gat,0,0,0,0 monster Gryphon 1259,1,7200000,3600000,1
-//gef_dun03.gat,0,0,0,0 monster Blood Knight 1268,2,300000,0,0
-//gef_dun03.gat,0,0,0,0 monster Dark Lord 1272,1,7200000,7200000,1
-//gef_dun03.gat,0,0,0,0 monster Alice 1275,3,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Chimera 1283,1,7200000,7200000,1
-//gef_dun03.gat,0,0,0,0 monster Mini Demon 1292,2,300000,0,0
-//gef_dun03.gat,0,0,0,0 monster Dark Illusion 1302,2,300000,0,0
-//gef_dun03.gat,0,0,0,0 monster Apocalypse 1365,2,300000,0,0
-//gef_dun03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Fake Angel 1371,8,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Lord of Death 1373,1,7200000,7200000,1
-//gef_dun03.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Nightmare Terror 1379,3,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Violy 1390,10,0,0,0
-//gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-//gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
+//===== eAthena Script =======================================
+//= Geffen Tower Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// gef_dun00 - Geffen Dungeon F1
+//==================================================
+gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,30,60000,30000,0
+gef_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,25,0,0,0
+gef_dun00.gat,91,106,0,0 monster Red Plant 1078,1,300000,150000,0
+gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,300000,150000,0
+gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,0
+gef_dun00.gat,0,0,0,0 monster Red Plant 1078,1,300000,150000,0
+gef_dun00.gat,0,0,0,0 monster Shining Plant 1083,1,3000000,1500000,0
+gef_dun00.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
+gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
+
+//==================================================
+// gef_dun01 - Geffen Dungeon F2
+//==================================================
+gef_dun01.gat,0,0,0,0 monster Drainliar 1111,30,0,0,0
+gef_dun01.gat,0,0,0,0 monster Nightmare 1061,30,0,0,0
+gef_dun01.gat,0,0,0,0 monster Ogretooth 1204,1,1800000,1200000,0
+gef_dun01.gat,0,0,0,0 monster Zombie 1015,25,0,0,0
+gef_dun01.gat,0,0,0,0 monster Ghoul 1036,40,0,0,0
+gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,100000,0
+gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,300000,100000,0
+gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,1
+gef_dun01.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+gef_dun01.gat,188,104,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun01.gat,263,115,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun01.gat,48,67,10,10 monster White Plant 1082,2,180000,90000,1
+gef_dun01.gat,150,237,10,10 monster White Plant 1082,2,180000,90000,1
+
+//==================================================
+// gef_dun02 - Geffenia
+//==================================================
+gef_dun02.gat,0,0,0,0 monster Ghoul 1036,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gef_dun02.gat,0,0,0,0 monster Marionette 1143,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,25,0,0,0
+gef_dun02.gat,0,0,0,0 monster Nightmare 1061,40,300000,100000,0
+gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
+gef_dun02.gat,214,212,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,215,67,10,10 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,72,210,20,20 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,106,151,20,7 monster White Plant 1082,3,180000,90000,1
+gef_dun02.gat,58,167,10,10 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun02.gat,185,83,3,3 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// gef_dun03 - Geffenia (Event Map)
+//==================================================
+gef_dun03.gat,0,0,0,0 monster Wraith 1192,8,60000,30000,0
+gef_dun03.gat,0,0,0,0 monster Wraith Dead 1291,2,60000,30000,0
+gef_dun03.gat,0,0,0,0 monster Wind Ghost 1263,3,60000,30000,0
+gef_dun03.gat,0,0,0,0 monster Hellion Revenant 1626,1,600000,300000,1
+gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
+
+//==================================================
+// Old Event Spawn in case you want to use them
+//==================================================
+//gef_dun03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,7200000,1
+//gef_dun03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,7200000,1
+//gef_dun03.gat,0,0,0,0 monster Deviruchi 1109,8,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Joker 1131,5,300000,100000,0
+//gef_dun03.gat,0,0,0,0 monster Khalitzburg 1132,2,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Knight of Abyss 1219,2,300000,0,0
+//gef_dun03.gat,0,0,0,0 monster Gryphon 1259,1,7200000,3600000,1
+//gef_dun03.gat,0,0,0,0 monster Blood Knight 1268,2,300000,0,0
+//gef_dun03.gat,0,0,0,0 monster Dark Lord 1272,1,7200000,7200000,1
+//gef_dun03.gat,0,0,0,0 monster Alice 1275,3,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Chimera 1283,1,7200000,7200000,1
+//gef_dun03.gat,0,0,0,0 monster Mini Demon 1292,2,300000,0,0
+//gef_dun03.gat,0,0,0,0 monster Dark Illusion 1302,2,300000,0,0
+//gef_dun03.gat,0,0,0,0 monster Apocalypse 1365,2,300000,0,0
+//gef_dun03.gat,0,0,0,0 monster Succubus 1370,10,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Fake Angel 1371,8,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Lord of Death 1373,1,7200000,7200000,1
+//gef_dun03.gat,0,0,0,0 monster Incubus 1374,10,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Nightmare Terror 1379,3,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Violy 1390,10,0,0,0
+//gef_dun03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+//gef_dun03.gat,0,0,0,0 monster White Plant 1082,10,180000,90000,1
diff --git a/npc/mobs/dungeons/glastheim.txt b/npc/mobs/dungeons/glastheim.txt
index 4fb14679c..3ffe7ca3d 100644
--- a/npc/mobs/dungeons/glastheim.txt
+++ b/npc/mobs/dungeons/glastheim.txt
@@ -1,227 +1,227 @@
-//===== eAthena Script =======================================
-//= Glast Heim Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 [Lupus]
-//= 1.2 Updated to ep 8.5 aegis spawns [MasterOfMuppets]
-//= 1.3 Official 10.1 kRO spawns [Playtester]
-//============================================================
-
-//==================================================
-// gl_cas01 - Glast Heim F1
-//==================================================
-gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
-gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
-gl_cas01.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_cas01.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
-gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
-
-//==================================================
-// gl_cas02 - Glast Heim F2
-//==================================================
-gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
-gl_cas02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
-gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
-gl_cas02.gat,193,167,5,5 monster Raydric 1163,3,300000,120000,0
-gl_cas02.gat,193,135,5,5 monster Raydric 1163,3,300000,120000,0
-gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
-gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
-gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
-gl_cas02.gat,182,12,3,3 monster Chimera 1283,1,3600000,1800000,1
-gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
-gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,120000,60000,1
-gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
-gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,360000,180000,1
-gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
-gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
-gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,360000,180000,1
-gl_cas02.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
-gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
-gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,360000,180000,0
-gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,360000,180000,0
-
-//==================================================
-// gl_in01 - Inside Glast Heim
-//==================================================
-gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
-gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
-gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
-gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
-gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
-gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
-gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
-gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
-gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
-gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
-gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
-gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
-gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
-gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
-gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
-
-//==================================================
-// gl_prison - Glast Heim Underprison F1
-//==================================================
-gl_prison.gat,0,0,0,0 monster Injustice 1257,20,0,0,0
-gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,30,0,0,0
-gl_prison.gat,0,0,0,0 monster Rybio 1201,15,0,0,0
-
-//==================================================
-// gl_prison1 - Glast Heim Underprison F2
-//==================================================
-gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,30,0,0,0
-gl_prison1.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
-gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
-gl_prison1.gat,0,0,0,0 monster Zealotus 1200,1,3600000,1800000,1
-gl_prison1.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
-
-//==================================================
-// glast_01 - Glast Heim
-//==================================================
-glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,2,600000,300000,1
-glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
-glast_01.gat,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
-glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
-glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// gl_church - Glast Heim St. Abbey
-//==================================================
-gl_church.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
-gl_church.gat,0,0,0,0 monster Evil Druid 1117,30,0,0,0
-gl_church.gat,0,0,0,0 monster Ghoul 1036,60,0,0,0
-gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
-gl_church.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
-gl_church.gat,155,92,10,10 monster Mimic 1191,1,30000,15000,0
-gl_church.gat,155,75,10,10 monster Mimic 1191,2,60000,30000,0
-gl_church.gat,155,54,10,10 monster Mimic 1191,1,30000,15000,0
-
-//==================================================
-// gl_chyard - Glast Heim Churchyard
-//==================================================
-gl_chyard.gat,0,0,0,0 monster Ghoul 1036,35,0,0,0
-gl_chyard.gat,0,0,0,0 monster Zombie 1015,30,0,0,0
-gl_chyard.gat,0,0,0,0 monster Wraith 1192,25,0,0,0
-gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
-gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,20,0,0,0
-gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
-
-//==================================================
-// gl_sew01 - Glast Heim Culvert F1
-//==================================================
-gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
-gl_sew01.gat,0,0,0,0 monster Arclouze 1194,10,0,0,0
-gl_sew01.gat,0,0,0,0 monster Whisper 1179,40,0,0,0
-
-//==================================================
-// gl_sew02 - Glast Heim Culvert F2
-//==================================================
-gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,55,0,0,0
-gl_sew02.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
-
-//==================================================
-// gl_sew03 - Glast Heim Culvert F3
-//==================================================
-gl_sew03.gat,0,0,0,0 monster Sting 1207,70,0,0,0
-gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,37,0,0,0
-gl_sew03.gat,147,7,5,1 monster Gargoyle 1253,1,2400000,1800000,0
-gl_sew03.gat,140,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
-gl_sew03.gat,158,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
-
-//==================================================
-// gl_sew04 - Glast Heim Culvert F4
-//==================================================
-gl_sew04.gat,0,0,0,0 monster Anolian 1206,50,0,0,0
-gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
-gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
-
-//==================================================
-// gl_step - Glast Heim Staircase Dungeon
-//==================================================
-gl_step.gat,0,0,0,0 monster Mimic 1191,20,60000,30000,0
-gl_step.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gl_step.gat,0,0,0,0 monster Wind Ghost 1263,50,0,0,0
-
-//==================================================
-// gl_knt01 - Inside Glast Heim Chivalry F1
-//==================================================
-gl_knt01.gat,0,0,0,0 monster Raydric 1163,60,0,0,0
-gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,10,0,0,0
-gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
-gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
-gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,120000,60000,1
-gl_knt01.gat,33,120,30,30 monster Rideword 1195,10,120000,60000,1
-gl_knt01.gat,26,223,20,20 monster Rideword 1195,10,120000,60000,1
-gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
-
-//==================================================
-// gl_knt02 - Inside Glast Heim Chivalry F2
-//==================================================
-gl_knt02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
-gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,30,0,0,0
-gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
-gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
-gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,1800000,1200000,0
-gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
-gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
-gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-
-//==================================================
-// gl_dun01 - The Lowest Cave in Glast Heim F1
-//==================================================
-gl_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
-gl_dun01.gat,0,0,0,0 monster Sting 1207,40,0,0,0
-
-//==================================================
-// gl_dun02 - The Lowest Cave in Glast Heim F2
-//==================================================
-gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
-gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
+//===== eAthena Script =======================================
+//= Glast Heim Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 [Lupus]
+//= 1.2 Updated to ep 8.5 aegis spawns [MasterOfMuppets]
+//= 1.3 Official 10.1 kRO spawns [Playtester]
+//============================================================
+
+//==================================================
+// gl_cas01 - Glast Heim F1
+//==================================================
+gl_cas01.gat,0,0,0,0 monster Sage Worm 1281,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Carat 1267,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Rideword 1195,15,0,0,0
+gl_cas01.gat,0,0,0,0 monster Dark Frame 1260,20,0,0,0
+gl_cas01.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+gl_cas01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_cas01.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
+gl_cas01.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,1
+
+//==================================================
+// gl_cas02 - Glast Heim F2
+//==================================================
+gl_cas02.gat,0,0,0,0 monster Wanderer 1208,20,0,0,0
+gl_cas02.gat,0,0,0,0 monster Raydric 1163,40,0,0,0
+gl_cas02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+gl_cas02.gat,0,0,0,0 monster Raydric Archer 1276,19,0,0,0
+gl_cas02.gat,193,167,5,5 monster Raydric 1163,3,300000,120000,0
+gl_cas02.gat,193,135,5,5 monster Raydric 1163,3,300000,120000,0
+gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
+gl_cas02.gat,102,180,0,0 monster Whisper 1185,1,1800000,900000,1
+gl_cas02.gat,105,180,0,0 monster Whisper 1185,1,1800000,900000,1
+gl_cas02.gat,182,12,3,3 monster Chimera 1283,1,3600000,1800000,1
+gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
+gl_cas02.gat,174,11,8,8 monster Evil Druid 1117,4,120000,60000,1
+gl_cas02.gat,104,38,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,24,35,4,4 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
+gl_cas02.gat,16,186,10,10 monster Evil Druid 1117,5,360000,180000,1
+gl_cas02.gat,133,83,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,182,65,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,173,127,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,173,167,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,93,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,115,177,3,3 monster Abysmal Knight 1219,1,1800000,900000,1
+gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
+gl_cas02.gat,83,80,2,2 monster Mimic 1191,1,360000,180000,1
+gl_cas02.gat,0,0,0,0 monster Ogretooth 1204,1,7200000,3600000,1
+gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
+gl_cas02.gat,190,23,1,1 monster Wanderer 1208,1,360000,180000,0
+gl_cas02.gat,190,38,1,1 monster Raydric Archer 1276,1,360000,180000,0
+
+//==================================================
+// gl_in01 - Inside Glast Heim
+//==================================================
+gl_in01.gat,41,155,40,45 monster Marionette 1143,5,0,0,0
+gl_in01.gat,156,147,34,42 monster Marionette 1143,5,0,0,0
+gl_in01.gat,42,48,41,32 monster Marionette 1143,5,0,0,0
+gl_in01.gat,154,44,36,33 monster Marionette 1143,5,0,0,0
+gl_in01.gat,42,154,40,45 monster Rideword 1195,2,0,0,0
+gl_in01.gat,155,143,34,42 monster Rideword 1195,1,0,0,0
+gl_in01.gat,41,47,41,32 monster Rideword 1195,3,0,0,0
+gl_in01.gat,152,44,36,33 monster Rideword 1195,2,0,0,0
+gl_in01.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
+gl_in01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_in01.gat,40,150,40,45 monster Dark Frame 1260,3,0,0,0
+gl_in01.gat,153,146,34,42 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,43,45,41,32 monster Dark Frame 1260,2,0,0,0
+gl_in01.gat,153,44,36,33 monster Dark Frame 1260,3,0,0,0
+gl_in01.gat,41,154,40,45 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,155,147,34,42 monster Sage Worm 1281,5,0,0,0
+gl_in01.gat,42,47,41,32 monster Sage Worm 1281,3,0,0,0
+gl_in01.gat,153,44,36,33 monster Sage Worm 1281,3,0,0,0
+
+//==================================================
+// gl_prison - Glast Heim Underprison F1
+//==================================================
+gl_prison.gat,0,0,0,0 monster Injustice 1257,20,0,0,0
+gl_prison.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gl_prison.gat,0,0,0,0 monster Zombie Prisoner 1197,30,0,0,0
+gl_prison.gat,0,0,0,0 monster Rybio 1201,15,0,0,0
+
+//==================================================
+// gl_prison1 - Glast Heim Underprison F2
+//==================================================
+gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,30,0,0,0
+gl_prison1.gat,0,0,0,0 monster Cramp 1209,20,0,0,0
+gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Injustice 1257,40,0,0,0
+gl_prison1.gat,0,0,0,0 monster Zealotus 1200,1,3600000,1800000,1
+gl_prison1.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Phendark 1202,10,0,0,0
+
+//==================================================
+// glast_01 - Glast Heim
+//==================================================
+glast_01.gat,0,0,0,0 monster Abysmal Knight 1219,2,600000,300000,1
+glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,1
+glast_01.gat,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
+glast_01.gat,233,209,15,15 monster Blue Plant 1079,2,900000,450000,1
+glast_01.gat,233,209,15,15 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// gl_church - Glast Heim St. Abbey
+//==================================================
+gl_church.gat,0,0,0,0 monster Wraith 1192,5,0,0,0
+gl_church.gat,0,0,0,0 monster Evil Druid 1117,30,0,0,0
+gl_church.gat,0,0,0,0 monster Ghoul 1036,60,0,0,0
+gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,3600000,1800000,0
+gl_church.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
+gl_church.gat,155,92,10,10 monster Mimic 1191,1,30000,15000,0
+gl_church.gat,155,75,10,10 monster Mimic 1191,2,60000,30000,0
+gl_church.gat,155,54,10,10 monster Mimic 1191,1,30000,15000,0
+
+//==================================================
+// gl_chyard - Glast Heim Churchyard
+//==================================================
+gl_chyard.gat,0,0,0,0 monster Ghoul 1036,35,0,0,0
+gl_chyard.gat,0,0,0,0 monster Zombie 1015,30,0,0,0
+gl_chyard.gat,0,0,0,0 monster Wraith 1192,25,0,0,0
+gl_chyard.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
+gl_chyard.gat,0,0,0,0 monster Hunter Fly 1035,20,0,0,0
+gl_chyard.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,1
+
+//==================================================
+// gl_sew01 - Glast Heim Culvert F1
+//==================================================
+gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
+gl_sew01.gat,0,0,0,0 monster Arclouze 1194,10,0,0,0
+gl_sew01.gat,0,0,0,0 monster Whisper 1179,40,0,0,0
+
+//==================================================
+// gl_sew02 - Glast Heim Culvert F2
+//==================================================
+gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,55,0,0,0
+gl_sew02.gat,0,0,0,0 monster Cramp 1209,15,0,0,0
+
+//==================================================
+// gl_sew03 - Glast Heim Culvert F3
+//==================================================
+gl_sew03.gat,0,0,0,0 monster Sting 1207,70,0,0,0
+gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,37,0,0,0
+gl_sew03.gat,147,7,5,1 monster Gargoyle 1253,1,2400000,1800000,0
+gl_sew03.gat,140,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
+gl_sew03.gat,158,7,5,1 monster Gargoyle 1253,1,3600000,1800000,0
+
+//==================================================
+// gl_sew04 - Glast Heim Culvert F4
+//==================================================
+gl_sew04.gat,0,0,0,0 monster Anolian 1206,50,0,0,0
+gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
+gl_sew04.gat,0,0,0,0 monster Drainliar 1111,10,0,0,0
+
+//==================================================
+// gl_step - Glast Heim Staircase Dungeon
+//==================================================
+gl_step.gat,0,0,0,0 monster Mimic 1191,20,60000,30000,0
+gl_step.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gl_step.gat,0,0,0,0 monster Wind Ghost 1263,50,0,0,0
+
+//==================================================
+// gl_knt01 - Inside Glast Heim Chivalry F1
+//==================================================
+gl_knt01.gat,0,0,0,0 monster Raydric 1163,60,0,0,0
+gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,10,0,0,0
+gl_knt01.gat,0,0,0,0 monster Abysmal Knight 1219,10,0,0,0
+gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_knt01.gat,21,278,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
+gl_knt01.gat,122,266,0,0 monster Rideword 1195,1,120000,60000,1
+gl_knt01.gat,33,120,30,30 monster Rideword 1195,10,120000,60000,1
+gl_knt01.gat,26,223,20,20 monster Rideword 1195,10,120000,60000,1
+gl_knt01.gat,9,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,184,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,9,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,8,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,7,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,6,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,5,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+gl_knt01.gat,4,185,0,0 monster Black Mushroom 1084,1,3600000,1800000,1
+
+//==================================================
+// gl_knt02 - Inside Glast Heim Chivalry F2
+//==================================================
+gl_knt02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
+gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gl_knt02.gat,0,0,0,0 monster Khalitzburg 1132,30,0,0,0
+gl_knt02.gat,0,0,0,0 monster Bloody Knight 1268,1,3600000,1800000,1
+gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,0
+gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,1800000,1200000,0
+gl_knt02.gat,0,0,0,0 monster Abysmal Knight 1219,5,0,0,0
+gl_knt02.gat,149,26,5,5 monster Abysmal Knight 1219,1,3600000,1800000,1
+gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,62,80,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,60,242,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,243,74,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+
+//==================================================
+// gl_dun01 - The Lowest Cave in Glast Heim F1
+//==================================================
+gl_dun01.gat,0,0,0,0 monster Arclouze 1194,50,0,0,0
+gl_dun01.gat,0,0,0,0 monster Sting 1207,40,0,0,0
+
+//==================================================
+// gl_dun02 - The Lowest Cave in Glast Heim F2
+//==================================================
+gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
+gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
diff --git a/npc/mobs/dungeons/gondun.txt b/npc/mobs/dungeons/gondun.txt
index cdd3b1303..b53f5abde 100644
--- a/npc/mobs/dungeons/gondun.txt
+++ b/npc/mobs/dungeons/gondun.txt
@@ -1,43 +1,43 @@
-//===== eAthena Script =======================================
-//= Gonryun Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// gon_dun01 - Shrine of Gonryun Queen
-//==================================================
-gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,650000,350000,0
-gon_dun01.gat,0,0,0,0 monster Enchanted Peach Tree 1410,35,0,0,0
-gon_dun01.gat,0,0,0,0 monster Zipper Bear 1417,30,0,0,0
-gon_dun01.gat,0,0,0,0 monster Red Plant 1078,5,0,0,0
-gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
-
-//==================================================
-// gon_dun02 - Hermit's Checkers
-//==================================================
-gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,2,300000,150000,0
-gon_dun02.gat,241,226,15,20 monster Baby Leopard 1415,4,600000,300000,0
-gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,3,120000,60000,0
-gon_dun02.gat,33,115,10,15 monster Enchanted Peach Tree 1410,1,300000,150000,0
-gon_dun02.gat,33,115,10,15 monster Baby Leopard 1415,2,600000,300000,0
-gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,20,690000,390000,0
-gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
-gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,15,0,0,0
-gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-
-//==================================================
-// gon_dun03 - Arcadia
-//==================================================
-gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
-gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,600000,300000,0
-gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,600000,300000,0
-gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
-gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,5650000,3650000,0
+//===== eAthena Script =======================================
+//= Gonryun Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// gon_dun01 - Shrine of Gonryun Queen
+//==================================================
+gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,650000,350000,0
+gon_dun01.gat,0,0,0,0 monster Enchanted Peach Tree 1410,35,0,0,0
+gon_dun01.gat,0,0,0,0 monster Zipper Bear 1417,30,0,0,0
+gon_dun01.gat,0,0,0,0 monster Red Plant 1078,5,0,0,0
+gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
+
+//==================================================
+// gon_dun02 - Hermit's Checkers
+//==================================================
+gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,2,300000,150000,0
+gon_dun02.gat,241,226,15,20 monster Baby Leopard 1415,4,600000,300000,0
+gon_dun02.gat,241,226,15,20 monster Enchanted Peach Tree 1410,3,120000,60000,0
+gon_dun02.gat,33,115,10,15 monster Enchanted Peach Tree 1410,1,300000,150000,0
+gon_dun02.gat,33,115,10,15 monster Baby Leopard 1415,2,600000,300000,0
+gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,20,690000,390000,0
+gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
+gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,15,0,0,0
+gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+
+//==================================================
+// gon_dun03 - Arcadia
+//==================================================
+gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,0
+gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,600000,300000,0
+gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,600000,300000,0
+gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
+gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,5650000,3650000,0
diff --git a/npc/mobs/dungeons/guilddun.txt b/npc/mobs/dungeons/guilddun.txt
index 8331bff13..9356e81b1 100644
--- a/npc/mobs/dungeons/guilddun.txt
+++ b/npc/mobs/dungeons/guilddun.txt
@@ -1,51 +1,51 @@
-//===== eAthena Script =======================================
-//= Guild Dungeons Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// gld_dun01 - Baldur Guild Dungeon
-//==================================================
-gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Am Mut 1301,20,0,0,0
-gld_dun01.gat,0,0,0,0 monster Cat o' Nine Tails 1307,3,1200000,0,0
-gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,7200000,1
-gld_dun01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,14400000,7200000,1
-
-//==================================================
-// gld_dun02 - Luina Guild Dungeon
-//==================================================
-gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
-gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,10,240000,120000,0
-gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,5,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,5,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,10,120000,60000,0
-gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,7200000,1
-
-//==================================================
-// gld_dun03 - Valkyrie Guild Dungeon
-//==================================================
-gld_dun03.gat,0,0,0,0 monster Maya Purple 1289,3,1200000,600000,0
-gld_dun03.gat,0,0,0,0 monster Caterpillar 1300,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Gullinbursti 1311,10,0,0,0
-gld_dun03.gat,0,0,0,0 monster Creamy Fear 1293,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Leib Olmai 1306,20,0,0,0
-gld_dun03.gat,0,0,0,0 monster Maya 1147,1,28800000,7200000,1
-
-//==================================================
-// gld_dun04 - Britoniah Guild Dungeon
-//==================================================
-gld_dun04.gat,0,0,0,0 monster Wraith Dead 1291,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Zombie Master 1298,20,0,0,0
-gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
-gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,7200000,1
-gld_dun04.gat,0,0,0,0 monster Ghostring 1120,1,14400000,7200000,1
+//===== eAthena Script =======================================
+//= Guild Dungeons Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// gld_dun01 - Baldur Guild Dungeon
+//==================================================
+gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Am Mut 1301,20,0,0,0
+gld_dun01.gat,0,0,0,0 monster Cat o' Nine Tails 1307,3,1200000,0,0
+gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,7200000,1
+gld_dun01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,14400000,7200000,1
+
+//==================================================
+// gld_dun02 - Luina Guild Dungeon
+//==================================================
+gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
+gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,10,240000,120000,0
+gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,5,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,5,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,10,120000,60000,0
+gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,7200000,1
+
+//==================================================
+// gld_dun03 - Valkyrie Guild Dungeon
+//==================================================
+gld_dun03.gat,0,0,0,0 monster Maya Purple 1289,3,1200000,600000,0
+gld_dun03.gat,0,0,0,0 monster Caterpillar 1300,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Gullinbursti 1311,10,0,0,0
+gld_dun03.gat,0,0,0,0 monster Creamy Fear 1293,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Leib Olmai 1306,20,0,0,0
+gld_dun03.gat,0,0,0,0 monster Maya 1147,1,28800000,7200000,1
+
+//==================================================
+// gld_dun04 - Britoniah Guild Dungeon
+//==================================================
+gld_dun04.gat,0,0,0,0 monster Wraith Dead 1291,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Mini Demon 1292,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Zombie Master 1298,20,0,0,0
+gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
+gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,7200000,1
+gld_dun04.gat,0,0,0,0 monster Ghostring 1120,1,14400000,7200000,1
diff --git a/npc/mobs/dungeons/icedun.txt b/npc/mobs/dungeons/icedun.txt
index cebe7dead..71d2047c7 100644
--- a/npc/mobs/dungeons/icedun.txt
+++ b/npc/mobs/dungeons/icedun.txt
@@ -1,36 +1,36 @@
-//===== eAthena Script =======================================
-//= Ice Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 First version from jAthena [Playtester]
-//============================================================
-
-//==================================================
-// ice_dun01 - Ice Cave
-//==================================================
-ice_dun01.gat,0,0,0,0 monster Siroma 1776,60,0,0,0
-ice_dun01.gat,0,0,0,0 monster Roween 1782,40,0,0,0
-ice_dun01.gat,0,0,0,0 monster Muscipular 1780,20,0,0,0
-ice_dun01.gat,0,0,0,0 monster Gazeti 1778,10,0,0,0
-
-//==================================================
-// ice_dun02 - Ice Cave
-//==================================================
-ice_dun02.gat,0,0,0,0 monster Snowier 1775,30,0,0,0
-ice_dun02.gat,0,0,0,0 monster Gazeti 1778,30,0,0,0
-ice_dun02.gat,0,0,0,0 monster Siroma 1776,20,0,0,0
-ice_dun02.gat,0,0,0,0 monster Ice Titan 1777,10,0,0,0
-ice_dun02.gat,0,0,0,0 monster Iceicle 1789,10,0,0,0
-
-//==================================================
-// ice_dun03 - Ice Cave
-//==================================================
-ice_dun03.gat,0,0,0,0 monster Ice Titan 1777,50,0,0,0
-ice_dun03.gat,0,0,0,0 monster Snowier 1775,30,0,0,0
-ice_dun03.gat,0,0,0,0 monster Gazeti 1778,30,0,0,0
-ice_dun03.gat,0,0,0,0 monster Iceicle 1789,10,0,0,0
+//===== eAthena Script =======================================
+//= Ice Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 First version from jAthena [Playtester]
+//============================================================
+
+//==================================================
+// ice_dun01 - Ice Cave
+//==================================================
+ice_dun01.gat,0,0,0,0 monster Siroma 1776,60,0,0,0
+ice_dun01.gat,0,0,0,0 monster Roween 1782,40,0,0,0
+ice_dun01.gat,0,0,0,0 monster Muscipular 1780,20,0,0,0
+ice_dun01.gat,0,0,0,0 monster Gazeti 1778,10,0,0,0
+
+//==================================================
+// ice_dun02 - Ice Cave
+//==================================================
+ice_dun02.gat,0,0,0,0 monster Snowier 1775,30,0,0,0
+ice_dun02.gat,0,0,0,0 monster Gazeti 1778,30,0,0,0
+ice_dun02.gat,0,0,0,0 monster Siroma 1776,20,0,0,0
+ice_dun02.gat,0,0,0,0 monster Ice Titan 1777,10,0,0,0
+ice_dun02.gat,0,0,0,0 monster Iceicle 1789,10,0,0,0
+
+//==================================================
+// ice_dun03 - Ice Cave
+//==================================================
+ice_dun03.gat,0,0,0,0 monster Ice Titan 1777,50,0,0,0
+ice_dun03.gat,0,0,0,0 monster Snowier 1775,30,0,0,0
+ice_dun03.gat,0,0,0,0 monster Gazeti 1778,30,0,0,0
+ice_dun03.gat,0,0,0,0 monster Iceicle 1789,10,0,0,0
diff --git a/npc/mobs/dungeons/jupedun.txt b/npc/mobs/dungeons/jupedun.txt
index af5643843..19bc6428a 100644
--- a/npc/mobs/dungeons/jupedun.txt
+++ b/npc/mobs/dungeons/jupedun.txt
@@ -1,55 +1,55 @@
-//===== eAthena Script =======================================
-//= Juperos Mystical Dungeon - Monster Spawn Locations
-//===== By: ==================================================
-// »» The Prometheus Project ««
-// Copyright (c) 2004,2005
-// Licensed under GPL
-// http://prometheus.fnae.net/
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena/Freya Version
-//===== Additional Comments: =================================
-//= 0.1 Added 1st version. [Muad_Dib]
-//= 0.2 Updated the spawns according to current info [MasterOfMuppets]
-//= 0.3 Updated the spawns according to own info from iRO [MasterOfMuppets]
-//= 1.0 More exact numbers thanks to Tharis [Playtester]
-//= 1.1 Official X.3 spawns [Playtester]
-//============================================================
-
-//========================================================================================
-// - Juperos 01
-//========================================================================================
-
-juperos_01.gat,100,180,60,70 monster Venatu 1679,15,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1676,25,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1677,20,0,0,1
-juperos_01.gat,100,180,60,70 monster Venatu 1678,25,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1679,35,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1676,45,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1677,50,0,0,1
-juperos_01.gat,192,132,60,80 monster Venatu 1678,45,0,0,1
-
-//========================================================================================
-// - Juperos 02
-//========================================================================================
-
-juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,1
-juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,1
-
-//========================================================================================
-// - Juperos Core
-//========================================================================================
-
-jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,1
-jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Juperos Mystical Dungeon - Monster Spawn Locations
+//===== By: ==================================================
+// »» The Prometheus Project ««
+// Copyright (c) 2004,2005
+// Licensed under GPL
+// http://prometheus.fnae.net/
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena/Freya Version
+//===== Additional Comments: =================================
+//= 0.1 Added 1st version. [Muad_Dib]
+//= 0.2 Updated the spawns according to current info [MasterOfMuppets]
+//= 0.3 Updated the spawns according to own info from iRO [MasterOfMuppets]
+//= 1.0 More exact numbers thanks to Tharis [Playtester]
+//= 1.1 Official X.3 spawns [Playtester]
+//============================================================
+
+//========================================================================================
+// - Juperos 01
+//========================================================================================
+
+juperos_01.gat,100,180,60,70 monster Venatu 1679,15,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1676,25,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1677,20,0,0,1
+juperos_01.gat,100,180,60,70 monster Venatu 1678,25,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1679,35,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1676,45,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1677,50,0,0,1
+juperos_01.gat,192,132,60,80 monster Venatu 1678,45,0,0,1
+
+//========================================================================================
+// - Juperos 02
+//========================================================================================
+
+juperos_02.gat,0,0,0,0 monster Venatu 1679,50,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1676,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1677,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Venatu 1678,65,0,0,1
+juperos_02.gat,0,0,0,0 monster Apocalypse 1365,70,0,0,1
+
+//========================================================================================
+// - Juperos Core
+//========================================================================================
+
+jupe_core.gat,0,0,0,0 monster Venatu 1676,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Venatu 1677,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Venatu 1678,25,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1670,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1671,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1672,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Dimik 1673,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Archdam 1668,40,0,0,1
+jupe_core.gat,0,0,0,0 monster Vesper 1685,1,7200000,3600000,1
diff --git a/npc/mobs/dungeons/kiel.txt b/npc/mobs/dungeons/kiel.txt
index fdd66c308..764f542ee 100644
--- a/npc/mobs/dungeons/kiel.txt
+++ b/npc/mobs/dungeons/kiel.txt
@@ -1,43 +1,43 @@
-//===== eAthena Script =======================================
-//= Kiel Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 First version [MasterOfMuppets]
-//= 1.1 Added official mob types [Playtester]
-//============================================================
-
-//==================================================
-// kh_kiehl01
-//==================================================
-kh_kiehl01.gat,0,0,0,0 monster Constant 1745,10,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Aliot 1740,8,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Aliza 1746,8,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Alicel 1739,8,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Aliza 1737,2,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Aliot 1736,2,0,0,0
-kh_kiehl01.gat,0,0,0,0 monster Alicel 1735,2,0,0,0
-
-//==================================================
-// kh_dun01 - Machine doll factory, 1st floor
-//==================================================
-kh_dun01.gat,0,0,0,0 monster Alice 1275,30,0,0,0
-kh_dun01.gat,0,0,0,0 monster Aliza 1737,60,0,0,0
-kh_dun01.gat,0,0,0,0 monster Constant 1738,10,0,0,0
-kh_dun01.gat,0,0,0,0 monster Constant 1745,10,0,0,0
-kh_dun01.gat,0,0,0,0 monster Alicel 1735,5,0,0,0
-kh_dun01.gat,0,0,0,0 monster Aliot 1736,5,0,0,0
-
-//==================================================
-// kh_dun02 - Machine doll factory, 2nd floor
-//==================================================
-kh_dun02.gat,0,0,0,0 monster Aliot 1736,30,0,0,0
-kh_dun02.gat,0,0,0,0 monster Alicel 1735,30,0,0,0
-kh_dun02.gat,0,0,0,0 monster Aliza 1737,30,0,0,0
-kh_dun02.gat,0,0,0,0 monster Constant 1738,30,0,0,0
-kh_dun02.gat,0,0,0,0 monster Constant 1745,30,0,0,0
-kh_dun02.gat,0,0,0,0 monster Kiel D-01 1734,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Kiel Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 First version [MasterOfMuppets]
+//= 1.1 Added official mob types [Playtester]
+//============================================================
+
+//==================================================
+// kh_kiehl01
+//==================================================
+kh_kiehl01.gat,0,0,0,0 monster Constant 1745,10,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Aliot 1740,8,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Aliza 1746,8,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Alicel 1739,8,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Aliza 1737,2,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Aliot 1736,2,0,0,0
+kh_kiehl01.gat,0,0,0,0 monster Alicel 1735,2,0,0,0
+
+//==================================================
+// kh_dun01 - Machine doll factory, 1st floor
+//==================================================
+kh_dun01.gat,0,0,0,0 monster Alice 1275,30,0,0,0
+kh_dun01.gat,0,0,0,0 monster Aliza 1737,60,0,0,0
+kh_dun01.gat,0,0,0,0 monster Constant 1738,10,0,0,0
+kh_dun01.gat,0,0,0,0 monster Constant 1745,10,0,0,0
+kh_dun01.gat,0,0,0,0 monster Alicel 1735,5,0,0,0
+kh_dun01.gat,0,0,0,0 monster Aliot 1736,5,0,0,0
+
+//==================================================
+// kh_dun02 - Machine doll factory, 2nd floor
+//==================================================
+kh_dun02.gat,0,0,0,0 monster Aliot 1736,30,0,0,0
+kh_dun02.gat,0,0,0,0 monster Alicel 1735,30,0,0,0
+kh_dun02.gat,0,0,0,0 monster Aliza 1737,30,0,0,0
+kh_dun02.gat,0,0,0,0 monster Constant 1738,30,0,0,0
+kh_dun02.gat,0,0,0,0 monster Constant 1745,30,0,0,0
+kh_dun02.gat,0,0,0,0 monster Kiel D-01 1734,1,7200000,3600000,1
diff --git a/npc/mobs/dungeons/lhzdun.txt b/npc/mobs/dungeons/lhzdun.txt
index ce93c213d..c70d163e4 100644
--- a/npc/mobs/dungeons/lhzdun.txt
+++ b/npc/mobs/dungeons/lhzdun.txt
@@ -1,241 +1,241 @@
-//===== eAthena Script =======================================
-//= Bio-life Labs - Monster Spawn Locations
-//===== By: ==================================================
-// »» The Prometheus Project ««
-// Copyright (c) 2004,2005
-// Licensed under GPL
-// http://prometheus.fnae.net/
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= Any Athena
-//===== Additional Comments: =================================
-//= 08/24/05 : Added 1st version. [Muad_Dib]
-//= 1.1: Some corrections to level 1, 2 as pointed out by
-//= MasterofMuppets. [Skotlex]
-//= 1.3: Some fixes based on kRO's "RO Map" [Poki#3]
-//= I also made the place more Moby ^^
-//= 1.4: Adjusted spawns according to own info from iRO [MasterOfMuppets]
-//= 1.5: More accurate spawn numbers and iRO names thanks to Tharis [Playtester]
-//= 1.6: Official X.3 spawns [Playtester]
-//============================================================
-
-
-//========================================================================================
-// lhz_dun01 - Bio-life Labs 1F
-//========================================================================================
-
-lhz_dun01.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Anopheles 1627,70,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Remover 1682,100,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Egnigem Cenia 1652,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Wickebine Tres 1653,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Armeyer Dinze 1654,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Errende Ebecee 1655,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Kavach Icarus 1656,1,0,0,0
-lhz_dun01.gat,0,0,0,0 monster Laurell Weinder 1657,1,0,0,0
-lhz_dun01.gat,150,50,16,18 monster Egnigem Cenia 1652,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Wickebine Tres 1653,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Errende Ebecee 1655,5,900000,800000,1
-lhz_dun01.gat,150,50,16,18 monster Kavach Icarus 1656,5,600000,300000,1
-lhz_dun01.gat,150,50,16,18 monster Laurell Weinder 1657,5,600000,300000,1
-lhz_dun01.gat,250,150,18,30 monster Egnigem Cenia 1652,4,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Wickebine Tres 1653,4,600000,300000,1
-lhz_dun01.gat,250,150,18,30 monster Armeyer Dinze 1654,4,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Errende Ebecee 1655,2,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Kavach Icarus 1656,2,900000,800000,1
-lhz_dun01.gat,250,150,18,30 monster Laurell Weinder 1657,2,600000,300000,1
-lhz_dun01.gat,50,150,11,35 monster Egnigem Cenia 1652,1,600000,300000,1
-lhz_dun01.gat,50,150,11,35 monster Wickebine Tres 1653,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Errende Ebecee 1655,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Kavach Icarus 1656,4,900000,800000,1
-lhz_dun01.gat,50,150,11,35 monster Laurell Weinder 1657,2,600000,300000,1
-lhz_dun01.gat,192,61,18,30 monster Egnigem Cenia 1652,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Wickebine Tres 1653,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Armeyer Dinze 1654,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Errende Ebecee 1655,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Kavach Icarus 1656,1,900000,800000,1
-lhz_dun01.gat,192,61,18,30 monster Laurell Weinder 1657,1,900000,800000,1
-lhz_dun01.gat,0,0,0,0 monster Gemini-S58 1681,1,7200000,5400000,0
-
-//========================================================================================
-// lhz_dun02 - Bio-life Labs 2F
-//========================================================================================
-
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,26,0,0,0
-lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,26,0,0,0
-lhz_dun02.gat,150,150,56,54 monster Egnigem Cenia 1652,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Wickebine Tres 1653,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Armeyer Dinze 1654,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Errende Ebecee 1655,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Kavach Icarus 1656,4,120000,60000,1
-lhz_dun02.gat,150,150,56,54 monster Laurell Weinder 1657,4,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Egnigem Cenia 1652,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Wickebine Tres 1653,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Armeyer Dinze 1654,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Errende Ebecee 1655,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Kavach Icarus 1656,10,120000,60000,1
-lhz_dun02.gat,150,150,105,90 monster Laurell Weinder 1657,10,120000,60000,1
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,10,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Remover 1682,20,300000,150000,1
-lhz_dun02.gat,0,0,0,0 monster Eremes Guile 1635,1,180000,120000,0
-lhz_dun02.gat,0,0,0,0 monster Gemini-S58 1681,10,5400000,180000,0
-lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1658,1,7200000,5400000,1
-
-//========================================================================================
-// lhz_dun03 - Bio-life Labs 3F
-//========================================================================================
-
-lhz_dun03.gat,140,235,116,30 monster Seyren Windsor 1634,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Eremes Guile 1635,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Howard Alt-Eisen 1636,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Margaretha Sorin 1637,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Cecil Damon 1638,4,180000,120000,0
-lhz_dun03.gat,140,235,116,30 monster Kathryne Keyron 1639,4,180000,120000,0
-
-lhz_dun03.gat,40,214,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,40,214,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,240,213,16,17 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,240,213,16,17 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,140,65,108,38 monster Seyren Windsor 1634,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Eremes Guile 1635,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Howard Alt-Eisen 1636,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Margaretha Sorin 1637,7,120000,160000,0
-lhz_dun03.gat,140,65,108,38 monster Cecil Damon 1638,7,120000,60000,0
-lhz_dun03.gat,140,65,108,38 monster Kathryne Keyron 1639,7,120000,60000,0
-
-lhz_dun03.gat,140,31,8,15 monster Seyren Windsor 1634,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Eremes Guile 1635,1,540000,480000,0
-lhz_dun03.gat,140,31,8,15 monster Howard Alt-Eisen 1636,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Margaretha Sorin 1637,1,540000,480000,0
-lhz_dun03.gat,140,31,8,15 monster Cecil Damon 1638,1,600000,540000,0
-lhz_dun03.gat,140,31,8,15 monster Kathryne Keyron 1639,1,540000,480000,0
-
-lhz_dun03.gat,40,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,40,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,240,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
-lhz_dun03.gat,240,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
-
-lhz_dun03.gat,54,131,35,39 monster Seyren Windsor 1634,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Eremes Guile 1635,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
-lhz_dun03.gat,54,131,35,39 monster Cecil Damon 1638,5,120000,60000,0
-lhz_dun03.gat,54,131,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
-
-lhz_dun03.gat,228,137,35,39 monster Seyren Windsor 1634,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Eremes Guile 1635,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
-lhz_dun03.gat,228,137,35,39 monster Cecil Damon 1638,5,120000,60000,0
-lhz_dun03.gat,228,137,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
-
-lhz_dun03.gat,138,138,36,34 monster Seyren Windsor 1634,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Eremes Guile 1635,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Howard Alt-Eisen 1636,3,120000,60000,0
-lhz_dun03.gat,138,138,36,34 monster Margaretha Sorin 1637,3,180000,120000,0
-lhz_dun03.gat,138,138,36,34 monster Cecil Damon 1638,4,0,0,0
-lhz_dun03.gat,138,138,36,34 monster Kathryne Keyron 1639,4,0,0,0
-
-lhz_dun03.gat,140,192,66,21 monster Seyren Windsor 1634,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Eremes Guile 1635,7,180000,120000,0
-lhz_dun03.gat,140,192,66,21 monster Howard Alt-Eisen 1636,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Margaretha Sorin 1637,7,180000,120000,0
-lhz_dun03.gat,140,192,66,21 monster Cecil Damon 1638,7,120000,60000,0
-lhz_dun03.gat,140,192,66,21 monster Kathryne Keyron 1639,7,120000,60000,0
-
-lhz_dun03.gat,89,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,89,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,107,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,107,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,171,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,171,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,189,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,189,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,89,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,89,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,107,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,107,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,171,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,171,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
-lhz_dun03.gat,189,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
-lhz_dun03.gat,189,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
-
-lhz_dun03.gat,96,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,96,164,13,8 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,96,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,180,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,180,164,13,8 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,180,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,98,113,13,9 monster Seyren Windsor 1634,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,98,113,13,9 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,98,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
-lhz_dun03.gat,180,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Margaretha Sorin 1637,2,300000,120000,0
-lhz_dun03.gat,180,113,13,9 monster Cecil Damon 1638,5,0,0,0
-lhz_dun03.gat,180,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
-
-lhz_dun03.gat,114,138,12,16 monster Lord Knight Seyren 1640,1,2700000,2400000,1
-lhz_dun03.gat,163,138,12,16 monster Whitesmith Howard 1642,1,3000000,2700000,1
-lhz_dun03.gat,139,158,20,11 monster Assassin Cross Eremes 1641,1,2580000,2340000,1
-lhz_dun03.gat,139,117,20,11 monster Sniper Cecil 1644,1,2700000,2500000,1
-lhz_dun03.gat,138,138,36,34 monster High Priest Margaretha 1643,1,3300000,3000000,1
-lhz_dun03.gat,138,138,36,34 monster High Wizard Kathryne 1645,1,2580000,2460000,1
-
-lhz_dun03.gat,1,1,0 script Lhzdun03monster -1,{
-OnInit:
- while(1){
- set $@metaspawn,rand(1,6);
- if($@metaspawn == 1)areamonster "lhz_dun03.gat",1,1,300,300,"Lord Knight Seyren",1646,1,"Lhzdun03monster::OnMonsterDead";
- if($@metaspawn == 2)areamonster "lhz_dun03.gat",1,1,300,300,"Assassin Cross Eremes",1647,1,"Lhzdun03monster::OnMonsterDead";
- if($@metaspawn == 3)areamonster "lhz_dun03.gat",1,1,300,300,"Whitesmith Horward",1648,1,"Lhzdun03monster::OnMonsterDead";
- if($@metaspawn == 4)areamonster "lhz_dun03.gat",1,1,300,300,"High Priest Margaretha",1649,1,"Lhzdun03monster::OnMonsterDead";
- if($@metaspawn == 5)areamonster "lhz_dun03.gat",1,1,300,300,"Sniper Cecil",1650,1,"Lhzdun03monster::OnMonsterDead";
- if($@metaspawn == 6)areamonster "lhz_dun03.gat",1,1,300,300,"High Wizard Kathryne",1651,1,"Lhzdun03monster::OnMonsterDead";
- end;
- OnMonsterDead:
- initnpctimer;
- setnpctimer 0;
- end;
- OnTimer7200000:
- stopnpctimer;
- }
-
-}
+//===== eAthena Script =======================================
+//= Bio-life Labs - Monster Spawn Locations
+//===== By: ==================================================
+// »» The Prometheus Project ««
+// Copyright (c) 2004,2005
+// Licensed under GPL
+// http://prometheus.fnae.net/
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= Any Athena
+//===== Additional Comments: =================================
+//= 08/24/05 : Added 1st version. [Muad_Dib]
+//= 1.1: Some corrections to level 1, 2 as pointed out by
+//= MasterofMuppets. [Skotlex]
+//= 1.3: Some fixes based on kRO's "RO Map" [Poki#3]
+//= I also made the place more Moby ^^
+//= 1.4: Adjusted spawns according to own info from iRO [MasterOfMuppets]
+//= 1.5: More accurate spawn numbers and iRO names thanks to Tharis [Playtester]
+//= 1.6: Official X.3 spawns [Playtester]
+//============================================================
+
+
+//========================================================================================
+// lhz_dun01 - Bio-life Labs 1F
+//========================================================================================
+
+lhz_dun01.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Anopheles 1627,70,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Remover 1682,100,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Egnigem Cenia 1652,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Wickebine Tres 1653,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Armeyer Dinze 1654,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Errende Ebecee 1655,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Kavach Icarus 1656,1,0,0,0
+lhz_dun01.gat,0,0,0,0 monster Laurell Weinder 1657,1,0,0,0
+lhz_dun01.gat,150,50,16,18 monster Egnigem Cenia 1652,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Wickebine Tres 1653,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Errende Ebecee 1655,5,900000,800000,1
+lhz_dun01.gat,150,50,16,18 monster Kavach Icarus 1656,5,600000,300000,1
+lhz_dun01.gat,150,50,16,18 monster Laurell Weinder 1657,5,600000,300000,1
+lhz_dun01.gat,250,150,18,30 monster Egnigem Cenia 1652,4,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Wickebine Tres 1653,4,600000,300000,1
+lhz_dun01.gat,250,150,18,30 monster Armeyer Dinze 1654,4,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Errende Ebecee 1655,2,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Kavach Icarus 1656,2,900000,800000,1
+lhz_dun01.gat,250,150,18,30 monster Laurell Weinder 1657,2,600000,300000,1
+lhz_dun01.gat,50,150,11,35 monster Egnigem Cenia 1652,1,600000,300000,1
+lhz_dun01.gat,50,150,11,35 monster Wickebine Tres 1653,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Errende Ebecee 1655,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Kavach Icarus 1656,4,900000,800000,1
+lhz_dun01.gat,50,150,11,35 monster Laurell Weinder 1657,2,600000,300000,1
+lhz_dun01.gat,192,61,18,30 monster Egnigem Cenia 1652,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Wickebine Tres 1653,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Armeyer Dinze 1654,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Errende Ebecee 1655,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Kavach Icarus 1656,1,900000,800000,1
+lhz_dun01.gat,192,61,18,30 monster Laurell Weinder 1657,1,900000,800000,1
+lhz_dun01.gat,0,0,0,0 monster Gemini-S58 1681,1,7200000,5400000,0
+
+//========================================================================================
+// lhz_dun02 - Bio-life Labs 2F
+//========================================================================================
+
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,26,0,0,0
+lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,26,0,0,0
+lhz_dun02.gat,150,150,56,54 monster Egnigem Cenia 1652,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Wickebine Tres 1653,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Armeyer Dinze 1654,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Errende Ebecee 1655,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Kavach Icarus 1656,4,120000,60000,1
+lhz_dun02.gat,150,150,56,54 monster Laurell Weinder 1657,4,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Egnigem Cenia 1652,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Wickebine Tres 1653,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Armeyer Dinze 1654,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Errende Ebecee 1655,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Kavach Icarus 1656,10,120000,60000,1
+lhz_dun02.gat,150,150,105,90 monster Laurell Weinder 1657,10,120000,60000,1
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1652,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Wickebine Tres 1653,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Armeyer Dinze 1654,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Errende Ebecee 1655,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Kavach Icarus 1656,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Laurell Weinder 1657,10,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Remover 1682,20,300000,150000,1
+lhz_dun02.gat,0,0,0,0 monster Eremes Guile 1635,1,180000,120000,0
+lhz_dun02.gat,0,0,0,0 monster Gemini-S58 1681,10,5400000,180000,0
+lhz_dun02.gat,0,0,0,0 monster Egnigem Cenia 1658,1,7200000,5400000,1
+
+//========================================================================================
+// lhz_dun03 - Bio-life Labs 3F
+//========================================================================================
+
+lhz_dun03.gat,140,235,116,30 monster Seyren Windsor 1634,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Eremes Guile 1635,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Howard Alt-Eisen 1636,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Margaretha Sorin 1637,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Cecil Damon 1638,4,180000,120000,0
+lhz_dun03.gat,140,235,116,30 monster Kathryne Keyron 1639,4,180000,120000,0
+
+lhz_dun03.gat,40,214,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,40,214,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,240,213,16,17 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,240,213,16,17 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,140,65,108,38 monster Seyren Windsor 1634,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Eremes Guile 1635,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Howard Alt-Eisen 1636,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Margaretha Sorin 1637,7,120000,160000,0
+lhz_dun03.gat,140,65,108,38 monster Cecil Damon 1638,7,120000,60000,0
+lhz_dun03.gat,140,65,108,38 monster Kathryne Keyron 1639,7,120000,60000,0
+
+lhz_dun03.gat,140,31,8,15 monster Seyren Windsor 1634,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Eremes Guile 1635,1,540000,480000,0
+lhz_dun03.gat,140,31,8,15 monster Howard Alt-Eisen 1636,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Margaretha Sorin 1637,1,540000,480000,0
+lhz_dun03.gat,140,31,8,15 monster Cecil Damon 1638,1,600000,540000,0
+lhz_dun03.gat,140,31,8,15 monster Kathryne Keyron 1639,1,540000,480000,0
+
+lhz_dun03.gat,40,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,40,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,240,66,16,16 monster Seyren Windsor 1634,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Eremes Guile 1635,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Howard Alt-Eisen 1636,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Margaretha Sorin 1637,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Cecil Damon 1638,1,120000,60000,0
+lhz_dun03.gat,240,66,16,16 monster Kathryne Keyron 1639,1,120000,60000,0
+
+lhz_dun03.gat,54,131,35,39 monster Seyren Windsor 1634,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Eremes Guile 1635,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
+lhz_dun03.gat,54,131,35,39 monster Cecil Damon 1638,5,120000,60000,0
+lhz_dun03.gat,54,131,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
+
+lhz_dun03.gat,228,137,35,39 monster Seyren Windsor 1634,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Eremes Guile 1635,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Howard Alt-Eisen 1636,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Margaretha Sorin 1637,5,180000,120000,0
+lhz_dun03.gat,228,137,35,39 monster Cecil Damon 1638,5,120000,60000,0
+lhz_dun03.gat,228,137,35,39 monster Kathryne Keyron 1639,5,120000,60000,0
+
+lhz_dun03.gat,138,138,36,34 monster Seyren Windsor 1634,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Eremes Guile 1635,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Howard Alt-Eisen 1636,3,120000,60000,0
+lhz_dun03.gat,138,138,36,34 monster Margaretha Sorin 1637,3,180000,120000,0
+lhz_dun03.gat,138,138,36,34 monster Cecil Damon 1638,4,0,0,0
+lhz_dun03.gat,138,138,36,34 monster Kathryne Keyron 1639,4,0,0,0
+
+lhz_dun03.gat,140,192,66,21 monster Seyren Windsor 1634,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Eremes Guile 1635,7,180000,120000,0
+lhz_dun03.gat,140,192,66,21 monster Howard Alt-Eisen 1636,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Margaretha Sorin 1637,7,180000,120000,0
+lhz_dun03.gat,140,192,66,21 monster Cecil Damon 1638,7,120000,60000,0
+lhz_dun03.gat,140,192,66,21 monster Kathryne Keyron 1639,7,120000,60000,0
+
+lhz_dun03.gat,89,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,89,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,107,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,107,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,171,167,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,171,167,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,189,164,4,8 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,189,164,4,8 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,89,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,89,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,107,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,107,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,171,109,4,5 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,171,109,4,5 monster Cecil Damon 1638,3,120000,60000,0
+lhz_dun03.gat,189,113,4,9 monster Kathryne Keyron 1639,1,120000,60000,0
+lhz_dun03.gat,189,113,4,9 monster Cecil Damon 1638,3,120000,60000,0
+
+lhz_dun03.gat,96,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,96,164,13,8 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,96,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,180,164,13,8 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,180,164,13,8 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,180,164,13,8 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,98,113,13,9 monster Seyren Windsor 1634,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,98,113,13,9 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,98,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
+lhz_dun03.gat,180,113,13,9 monster Eremes Guile 1635,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Howard Alt-Eisen 1636,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Margaretha Sorin 1637,2,300000,120000,0
+lhz_dun03.gat,180,113,13,9 monster Cecil Damon 1638,5,0,0,0
+lhz_dun03.gat,180,113,13,9 monster Kathryne Keyron 1639,3,0,0,0
+
+lhz_dun03.gat,114,138,12,16 monster Lord Knight Seyren 1640,1,2700000,2400000,1
+lhz_dun03.gat,163,138,12,16 monster Whitesmith Howard 1642,1,3000000,2700000,1
+lhz_dun03.gat,139,158,20,11 monster Assassin Cross Eremes 1641,1,2580000,2340000,1
+lhz_dun03.gat,139,117,20,11 monster Sniper Cecil 1644,1,2700000,2500000,1
+lhz_dun03.gat,138,138,36,34 monster High Priest Margaretha 1643,1,3300000,3000000,1
+lhz_dun03.gat,138,138,36,34 monster High Wizard Kathryne 1645,1,2580000,2460000,1
+
+lhz_dun03.gat,1,1,0 script Lhzdun03monster -1,{
+OnInit:
+ while(1){
+ set $@metaspawn,rand(1,6);
+ if($@metaspawn == 1)areamonster "lhz_dun03.gat",1,1,300,300,"Lord Knight Seyren",1646,1,"Lhzdun03monster::OnMonsterDead";
+ if($@metaspawn == 2)areamonster "lhz_dun03.gat",1,1,300,300,"Assassin Cross Eremes",1647,1,"Lhzdun03monster::OnMonsterDead";
+ if($@metaspawn == 3)areamonster "lhz_dun03.gat",1,1,300,300,"Whitesmith Horward",1648,1,"Lhzdun03monster::OnMonsterDead";
+ if($@metaspawn == 4)areamonster "lhz_dun03.gat",1,1,300,300,"High Priest Margaretha",1649,1,"Lhzdun03monster::OnMonsterDead";
+ if($@metaspawn == 5)areamonster "lhz_dun03.gat",1,1,300,300,"Sniper Cecil",1650,1,"Lhzdun03monster::OnMonsterDead";
+ if($@metaspawn == 6)areamonster "lhz_dun03.gat",1,1,300,300,"High Wizard Kathryne",1651,1,"Lhzdun03monster::OnMonsterDead";
+ end;
+ OnMonsterDead:
+ initnpctimer;
+ setnpctimer 0;
+ end;
+ OnTimer7200000:
+ stopnpctimer;
+ }
+
+}
diff --git a/npc/mobs/dungeons/louydun.txt b/npc/mobs/dungeons/louydun.txt
index 503ee91a7..320c8ef1e 100644
--- a/npc/mobs/dungeons/louydun.txt
+++ b/npc/mobs/dungeons/louydun.txt
@@ -1,42 +1,42 @@
-//===== eAthena Script =======================================
-//= Louyang Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Updated by MasterOfMuppets
-//= 1.2 Added Bacsojin and Chung E [MasterOfMuppets]
-//============================================================
-
-//==================================================
-// lou_dun01 - The Royal Tomb
-//==================================================
-lou_dun01.gat,0,0,0,0 monster Horong 1129,15,0,0,0
-lou_dun01.gat,0,0,0,0 monster Mi Gao 1516,15,0,0,0
-lou_dun01.gat,215,159,40,80 monster Side Winder 1037,10,300000,120000,0
-lou_dun01.gat,215,159,40,80 monster Jing Guai 1517,25,300000,120000,0
-lou_dun01.gat,0,0,0,0 monster Jing Guai 1517,20,0,0,0
-lou_dun01.gat,0,0,0,0 monster Grizzly 1381,15,0,0,0
-lou_dun01.gat,0,0,0,0 monster Leib Olmai 1306,1,300000,120000,0
-lou_dun01.gat,197,77,10,10 monster Black Mushroom 1084,5,0,0,0
-lou_dun01.gat,0,0,0,0 monster Shining Plant 1083,5,0,0,0
-
-//==================================================
-// lou_dun02 - Inside the Royal Tomb
-//==================================================
-lou_dun02.gat,0,0,0,0 monster Yao Jun 1512,40,300000,120000,0
-lou_dun02.gat,0,0,0,0 monster Munak 1026,25,0,0,0
-lou_dun02.gat,0,0,0,0 monster Zhu Po Long 1514,5,0,0,0
-lou_dun02.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
-
-//==================================================
-// lou_dun03 - Suei Long Gon
-//==================================================
-lou_dun03.gat,0,0,0,0 monster Yao Jun 1512,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Zhu Po Long 1514,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Mao Guai 1513,15,0,0,0
-lou_dun03.gat,0,0,0,0 monster Green Maiden 1631,5,3000000,1800000,1
-lou_dun03.gat,0,0,0,0 monster White Lady 1630,1,7000000,5000000,1
+//===== eAthena Script =======================================
+//= Louyang Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Updated by MasterOfMuppets
+//= 1.2 Added Bacsojin and Chung E [MasterOfMuppets]
+//============================================================
+
+//==================================================
+// lou_dun01 - The Royal Tomb
+//==================================================
+lou_dun01.gat,0,0,0,0 monster Horong 1129,15,0,0,0
+lou_dun01.gat,0,0,0,0 monster Mi Gao 1516,15,0,0,0
+lou_dun01.gat,215,159,40,80 monster Side Winder 1037,10,300000,120000,0
+lou_dun01.gat,215,159,40,80 monster Jing Guai 1517,25,300000,120000,0
+lou_dun01.gat,0,0,0,0 monster Jing Guai 1517,20,0,0,0
+lou_dun01.gat,0,0,0,0 monster Grizzly 1381,15,0,0,0
+lou_dun01.gat,0,0,0,0 monster Leib Olmai 1306,1,300000,120000,0
+lou_dun01.gat,197,77,10,10 monster Black Mushroom 1084,5,0,0,0
+lou_dun01.gat,0,0,0,0 monster Shining Plant 1083,5,0,0,0
+
+//==================================================
+// lou_dun02 - Inside the Royal Tomb
+//==================================================
+lou_dun02.gat,0,0,0,0 monster Yao Jun 1512,40,300000,120000,0
+lou_dun02.gat,0,0,0,0 monster Munak 1026,25,0,0,0
+lou_dun02.gat,0,0,0,0 monster Zhu Po Long 1514,5,0,0,0
+lou_dun02.gat,0,0,0,0 monster Mimic 1191,5,0,0,0
+
+//==================================================
+// lou_dun03 - Suei Long Gon
+//==================================================
+lou_dun03.gat,0,0,0,0 monster Yao Jun 1512,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Zhu Po Long 1514,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Mao Guai 1513,15,0,0,0
+lou_dun03.gat,0,0,0,0 monster Green Maiden 1631,5,3000000,1800000,1
+lou_dun03.gat,0,0,0,0 monster White Lady 1630,1,7000000,5000000,1
diff --git a/npc/mobs/dungeons/magmadun.txt b/npc/mobs/dungeons/magmadun.txt
index 832ebdb6d..92df8bae1 100644
--- a/npc/mobs/dungeons/magmadun.txt
+++ b/npc/mobs/dungeons/magmadun.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= Magma Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 fixed 2,3,4 tabs instead of 1... and wrong mob names [Lupus]
-//= 1.2 Official jRO 10.3 spawns [Playtester]
-//============================================================
-
-//==================================================
-// mag_dun01 - Nogg Road F1
-//==================================================
-mag_dun01.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
-mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,20,600000,300000,0
-mag_dun01.gat,0,0,0,0 monster Kaho 1072,20,0,0,0
-mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
-mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
-
-//==================================================
-// mag_dun02 - Nogg Road F2
-//==================================================
-mag_dun02.gat,70,190,20,20 monster Blazer 1367,5,300000,150000,0
-mag_dun02.gat,200,120,40,40 monster Blazer 1367,15,300000,150000,0
-mag_dun02.gat,70,87,50,50 monster Nightmare Terror 1379,10,300000,150000,0
-mag_dun02.gat,210,156,15,15 monster Nightmare Terror 1379,3,60000,30000,0
-mag_dun02.gat,135,153,15,15 monster Nightmare Terror 1379,3,60000,30000,0
-mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,12,60000,30000,0
-mag_dun02.gat,120,202,20,20 monster Deleter 1384,5,60000,30000,0
-mag_dun02.gat,185,185,50,50 monster Deleter 1385,10,300000,150000,0
-mag_dun02.gat,200,77,30,30 monster Deleter 1384,5,300000,150000,0
-mag_dun02.gat,0,0,0,0 monster Gig 1387,10,0,0,0
-mag_dun02.gat,200,77,30,30 monster Diabolic 1382,10,300000,150000,0
-mag_dun02.gat,135,68,15,15 monster Diabolic 1382,5,300000,30000,0
-mag_dun02.gat,0,0,0,0 monster Diabolic 1382,5,60000,30000,0
+//===== eAthena Script =======================================
+//= Magma Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 fixed 2,3,4 tabs instead of 1... and wrong mob names [Lupus]
+//= 1.2 Official jRO 10.3 spawns [Playtester]
+//============================================================
+
+//==================================================
+// mag_dun01 - Nogg Road F1
+//==================================================
+mag_dun01.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
+mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,20,600000,300000,0
+mag_dun01.gat,0,0,0,0 monster Kaho 1072,20,0,0,0
+mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
+mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
+
+//==================================================
+// mag_dun02 - Nogg Road F2
+//==================================================
+mag_dun02.gat,70,190,20,20 monster Blazer 1367,5,300000,150000,0
+mag_dun02.gat,200,120,40,40 monster Blazer 1367,15,300000,150000,0
+mag_dun02.gat,70,87,50,50 monster Nightmare Terror 1379,10,300000,150000,0
+mag_dun02.gat,210,156,15,15 monster Nightmare Terror 1379,3,60000,30000,0
+mag_dun02.gat,135,153,15,15 monster Nightmare Terror 1379,3,60000,30000,0
+mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,12,60000,30000,0
+mag_dun02.gat,120,202,20,20 monster Deleter 1384,5,60000,30000,0
+mag_dun02.gat,185,185,50,50 monster Deleter 1385,10,300000,150000,0
+mag_dun02.gat,200,77,30,30 monster Deleter 1384,5,300000,150000,0
+mag_dun02.gat,0,0,0,0 monster Gig 1387,10,0,0,0
+mag_dun02.gat,200,77,30,30 monster Diabolic 1382,10,300000,150000,0
+mag_dun02.gat,135,68,15,15 monster Diabolic 1382,5,300000,30000,0
+mag_dun02.gat,0,0,0,0 monster Diabolic 1382,5,60000,30000,0
diff --git a/npc/mobs/dungeons/moc_pyramid.txt b/npc/mobs/dungeons/moc_pyramid.txt
index 695bc80ff..019acf6ba 100644
--- a/npc/mobs/dungeons/moc_pyramid.txt
+++ b/npc/mobs/dungeons/moc_pyramid.txt
@@ -1,62 +1,62 @@
-//===== eAthena Script =======================================
-//= Morocc Pryamid Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// moc_pryd01 - Inside Pyramid F1
-//==================================================
-moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
-moc_pryd01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-
-//==================================================
-// moc_pryd02 - Inside Pyramid F2
-//==================================================
-moc_pryd02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Mummy 1041,30,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
-
-//==================================================
-// moc_pryd03 - Inside Pyramid F3
-//==================================================
-moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Mummy 1041,45,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Verit 1032,20,600000,300000,1
-
-//==================================================
-// moc_pryd04 - Inside Pyramid F4
-//==================================================
-moc_pryd04.gat,0,0,0,0 monster Mummy 1041,25,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
-moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,150000,75000,0
-moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
-moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
-moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-
-//==================================================
-// moc_pryd05 - Inside Pyramid B1
-//==================================================
-moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
-
-//==================================================
-// moc_pryd06 - Inside Pyramid B2
-//==================================================
-moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
-moc_pryd06.gat,102,85,1,1 monster Amon Ra 1511,1,3600000,1600000,0
+//===== eAthena Script =======================================
+//= Morocc Pryamid Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// moc_pryd01 - Inside Pyramid F1
+//==================================================
+moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
+moc_pryd01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+
+//==================================================
+// moc_pryd02 - Inside Pyramid F2
+//==================================================
+moc_pryd02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Mummy 1041,30,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Soldier Skeleton 1028,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Archer Skeleton 1016,20,0,0,0
+
+//==================================================
+// moc_pryd03 - Inside Pyramid F3
+//==================================================
+moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Matyr 1146,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Mummy 1041,45,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Verit 1032,20,600000,300000,1
+
+//==================================================
+// moc_pryd04 - Inside Pyramid F4
+//==================================================
+moc_pryd04.gat,0,0,0,0 monster Mummy 1041,25,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Ancient Mummy 1297,3,0,0,0
+moc_pryd04.gat,0,0,0,0 monster Isis 1029,50,150000,75000,0
+moc_pryd04.gat,0,0,0,0 monster Mimic 1191,15,600000,300000,1
+moc_pryd04.gat,0,0,0,0 monster Osiris 1038,1,3600000,7200000,0
+moc_pryd04.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+
+//==================================================
+// moc_pryd05 - Inside Pyramid B1
+//==================================================
+moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
+
+//==================================================
+// moc_pryd06 - Inside Pyramid B2
+//==================================================
+moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Arclouze 1194,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
+moc_pryd06.gat,102,85,1,1 monster Amon Ra 1511,1,3600000,1600000,0
diff --git a/npc/mobs/dungeons/moc_sphinx.txt b/npc/mobs/dungeons/moc_sphinx.txt
index b74ee8b18..681b8fe04 100644
--- a/npc/mobs/dungeons/moc_sphinx.txt
+++ b/npc/mobs/dungeons/moc_sphinx.txt
@@ -1,53 +1,53 @@
-//===== eAthena Script =======================================
-//= Morocc Sphinx Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// In_sphinx1 - Sphinx F1
-//==================================================
-in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Zerom 1178,20,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
-
-//==================================================
-// In_sphinx2 - Sphinx F2
-//==================================================
-in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Zerom 1178,50,0,0,0
-in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
-
-//==================================================
-// In_sphinx3 - Sphinx F3
-//==================================================
-in_sphinx3.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Pasana 1154,10,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
-
-//==================================================
-// In_sphinx4 - Sphinx F4
-//==================================================
-in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
-in_sphinx4.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
-in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
-
-//==================================================
-// In_sphinx5 - Sphinx F5
-//==================================================
-in_sphinx5.gat,0,0,0,0 monster Pasana 1154,50,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Mimic 1191,7,600000,300000,1
-in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
+//===== eAthena Script =======================================
+//= Morocc Sphinx Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// In_sphinx1 - Sphinx F1
+//==================================================
+in_sphinx1.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Zerom 1178,20,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
+
+//==================================================
+// In_sphinx2 - Sphinx F2
+//==================================================
+in_sphinx2.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Zerom 1178,50,0,0,0
+in_sphinx2.gat,0,0,0,0 monster Matyr 1146,20,0,0,0
+
+//==================================================
+// In_sphinx3 - Sphinx F3
+//==================================================
+in_sphinx3.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Pasana 1154,10,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
+
+//==================================================
+// In_sphinx4 - Sphinx F4
+//==================================================
+in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
+in_sphinx4.gat,0,0,0,0 monster Mimic 1191,4,600000,300000,1
+in_sphinx4.gat,0,0,0,0 monster Pasana 1154,20,0,0,0
+
+//==================================================
+// In_sphinx5 - Sphinx F5
+//==================================================
+in_sphinx5.gat,0,0,0,0 monster Pasana 1154,50,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Matyr 1146,10,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Mimic 1191,7,600000,300000,1
+in_sphinx5.gat,0,0,0,0 monster Pharaoh 1157,1,3600000,1800000,1
diff --git a/npc/mobs/dungeons/orcdun.txt b/npc/mobs/dungeons/orcdun.txt
index d1e8a709b..01324e187 100644
--- a/npc/mobs/dungeons/orcdun.txt
+++ b/npc/mobs/dungeons/orcdun.txt
@@ -1,41 +1,41 @@
-//===== eAthena Script =======================================
-//= Orcs Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// orcsdun01 - Orc Dungeon F1
-//==================================================
-orcsdun01.gat,0,0,0,0 monster Steel Chonchon 1042,10,0,0,0
-orcsdun01.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
-orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,10,3000,5000,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,30,60000,30000,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,40,120000,60000,0
-orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,180000,60000,0
-orcsdun01.gat,167,133,5,5 monster Black Mushroom 1084,5,900000,450000,1
-orcsdun01.gat,67,34,5,5 monster Black Mushroom 1084,5,900000,450000,1
-orcsdun01.gat,83,50,5,5 monster White Plant 1082,2,180000,90000,1
-orcsdun01.gat,58,67,10,10 monster White Plant 1082,3,180000,90000,1
-
-//==================================================
-// orcsdun02 - Orc Dungeon F2
-//==================================================
-orcsdun02.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,10,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,60000,30000,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,120000,60000,0
-orcsdun02.gat,0,0,0,0 monster Zenorc 1177,30,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Zenorc 1177,20,60000,30000,0
-orcsdun02.gat,0,0,0,0 monster Orc Archer 1189,5,1800000,900000,1
-orcsdun02.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
-orcsdun02.gat,105,37,10,10 monster White Plant 1082,2,180000,90000,1
-orcsdun02.gat,37,44,10,10 monster White Plant 1082,3,180000,90000,1
+//===== eAthena Script =======================================
+//= Orcs Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// orcsdun01 - Orc Dungeon F1
+//==================================================
+orcsdun01.gat,0,0,0,0 monster Steel Chonchon 1042,10,0,0,0
+orcsdun01.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
+orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,10,3000,5000,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,30,60000,30000,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,40,120000,60000,0
+orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,180000,60000,0
+orcsdun01.gat,167,133,5,5 monster Black Mushroom 1084,5,900000,450000,1
+orcsdun01.gat,67,34,5,5 monster Black Mushroom 1084,5,900000,450000,1
+orcsdun01.gat,83,50,5,5 monster White Plant 1082,2,180000,90000,1
+orcsdun01.gat,58,67,10,10 monster White Plant 1082,3,180000,90000,1
+
+//==================================================
+// orcsdun02 - Orc Dungeon F2
+//==================================================
+orcsdun02.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,10,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,60000,30000,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,20,120000,60000,0
+orcsdun02.gat,0,0,0,0 monster Zenorc 1177,30,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Zenorc 1177,20,60000,30000,0
+orcsdun02.gat,0,0,0,0 monster Orc Archer 1189,5,1800000,900000,1
+orcsdun02.gat,0,0,0,0 monster Black Mushroom 1084,5,180000,90000,1
+orcsdun02.gat,105,37,10,10 monster White Plant 1082,2,180000,90000,1
+orcsdun02.gat,37,44,10,10 monster White Plant 1082,3,180000,90000,1
diff --git a/npc/mobs/dungeons/payoncave.txt b/npc/mobs/dungeons/payoncave.txt
index b2265fc7b..69af9dd69 100644
--- a/npc/mobs/dungeons/payoncave.txt
+++ b/npc/mobs/dungeons/payoncave.txt
@@ -1,162 +1,162 @@
-//===== eAthena Script =======================================
-//= Payon Cave Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// pay_dun00 - Payon Cave F1
-//==================================================
-pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
-pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
-pay_dun00.gat,0,0,0,0 monster Skeleton 1076,35,0,0,0
-pay_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-pay_dun00.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
-
-//==================================================
-// pay_dun01 - Payon Cave F2
-//==================================================
-pay_dun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
-pay_dun01.gat,0,0,0,0 monster Eggyra 1116,15,0,0,0
-pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,50,300000,150000,1
-pay_dun01.gat,0,0,0,0 monster Archer Skeleton 1016,30,300000,150000,1
-pay_dun01.gat,235,54,10,10 monster Black Mushroom 1084,7,900000,450000,1
-pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-
-//==================================================
-// pay_dun02 - Payon Cave F3
-//==================================================
-pay_dun02.gat,0,0,0,0 monster Soldier Skeleton 1028,15,180000,90000,1
-pay_dun02.gat,0,0,0,0 monster Munak 1026,40,0,0,0
-pay_dun02.gat,0,0,0,0 monster Bongun 1188,30,0,0,0
-pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_dun02.gat,0,0,0,0 monster Archer Skeleton 1016,20,180000,90000,1
-pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
-pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
-pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
-pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
-pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
-pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
-pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,118,207,0,0 monster Hydra 1068,1,332000,100000,1
-pay_dun02.gat,118,201,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
-pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
-pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
-pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,119,196,0,0 monster Hydra 1068,1,315000,100000,1
-pay_dun02.gat,120,203,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,120,200,0,0 monster Hydra 1068,1,303000,100000,1
-pay_dun02.gat,120,194,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,121,200,0,0 monster Hydra 1068,1,333000,100000,1
-pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,122,197,0,0 monster Hydra 1068,1,321000,100000,1
-pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,113,194,0,0 monster Hydra 1068,1,319000,100000,1
-pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,113,193,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
-pay_dun02.gat,112,192,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
-pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
-pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,227,185,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,227,184,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,229,183,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun02.gat,214,266,0,0 monster Red Plant 1078,1,600000,300000,1
-pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
-pay_dun02.gat,37,243,0,0 monster Nine Tail 1180,1,3600000,1800000,1
-pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
-pay_dun02.gat,110,216,20,10 monster White Plant 1082,3,180000,90000,1
-pay_dun02.gat,132,84,10,10 monster White Plant 1082,3,180000,90000,1
-pay_dun02.gat,197,113,10,10 monster Red Plant 1078,4,180000,90000,1
-pay_dun02.gat,55,254,10,10 monster Red Plant 1078,4,180000,90000,1
-
-//==================================================
-// pay_dun03 - Payon Cave F4
-//==================================================
-pay_dun03.gat,0,0,0,0 monster Sohee 1170,50,0,0,0
-pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Bongun 1188,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
-pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,3600000,1800000,0
-pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,0,1
-pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,14400000,0,1
-pay_dun03.gat,66,73,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,68,72,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,67,71,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,63,70,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,58,69,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,67,69,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,60,68,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,69,68,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,62,67,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,67,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,64,66,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,57,65,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,66,65,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,59,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,68,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,64,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,66,63,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,71,243,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,86,248,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,85,178,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,115,190,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,230,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,240,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,219,244,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,243,220,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,219,185,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,228,185,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun03.gat,228,61,0,0 monster Red Plant 1078,1,600000,300000,1
-pay_dun03.gat,138,42,0,0 monster Blue Plant 1079,1,600000,300000,1
-pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
-pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
-pay_dun03.gat,126,135,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,134,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,133,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,132,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,126,131,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,134,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,133,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,132,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,131,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,179,130,0,0 monster Mandragora 1020,1,300000,100000,1
-pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-pay_dun03.gat,246,56,20,20 monster White Plant 1082,3,180000,90000,1
-pay_dun03.gat,52,262,10,4 monster White Plant 1082,2,180000,90000,1
-
-//==================================================
-// pay_dun04 - Payon Cave F5
-//==================================================
-pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
-pay_dun04.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
-pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
-pay_dun04.gat,120,115,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
-pay_dun04.gat,0,0,0,0 monster Greatest General 1277,15,0,0,0
-pay_dun04.gat,0,0,0,0 monster Archer Skeleton 1016,15,0,0,0
-pay_dun04.gat,0,0,0,0 monster Nine Tail 1180,20,800000,400000,0
-pay_dun04.gat,120,115,5,5 monster Skeleton General 1290,1,1800000,1200000,0
-pay_dun04.gat,120,115,5,5 monster Am Mut 1301,1,1800000,1200000,0
-pay_dun04.gat,120,115,0,0 monster Cat o' Nine Tails 1307,1,3600000,7200000,1
-pay_dun04.gat,0,0,0,0 monster Soldier Skeleton 1028,10,0,0,0
-pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,1,1800000,900000,1
-pay_dun04.gat,28,110,5,5 monster Shining Plant 1083,1,1800000,900000,1
-pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-pay_dun04.gat,107,206,5,5 monster White Plant 1082,2,180000,90000,1
-pay_dun04.gat,28,110,10,10 monster White Plant 1082,2,180000,90000,1
-pay_dun04.gat,190,207,5,5 monster White Plant 1082,2,180000,90000,1
+//===== eAthena Script =======================================
+//= Payon Cave Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// pay_dun00 - Payon Cave F1
+//==================================================
+pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
+pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,0,0,0
+pay_dun00.gat,0,0,0,0 monster Skeleton 1076,35,0,0,0
+pay_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+pay_dun00.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
+
+//==================================================
+// pay_dun01 - Payon Cave F2
+//==================================================
+pay_dun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
+pay_dun01.gat,0,0,0,0 monster Eggyra 1116,15,0,0,0
+pay_dun01.gat,0,0,0,0 monster Soldier Skeleton 1028,50,300000,150000,1
+pay_dun01.gat,0,0,0,0 monster Archer Skeleton 1016,30,300000,150000,1
+pay_dun01.gat,235,54,10,10 monster Black Mushroom 1084,7,900000,450000,1
+pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+
+//==================================================
+// pay_dun02 - Payon Cave F3
+//==================================================
+pay_dun02.gat,0,0,0,0 monster Soldier Skeleton 1028,15,180000,90000,1
+pay_dun02.gat,0,0,0,0 monster Munak 1026,40,0,0,0
+pay_dun02.gat,0,0,0,0 monster Bongun 1188,30,0,0,0
+pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_dun02.gat,0,0,0,0 monster Archer Skeleton 1016,20,180000,90000,1
+pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
+pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
+pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
+pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
+pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
+pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
+pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,118,207,0,0 monster Hydra 1068,1,332000,100000,1
+pay_dun02.gat,118,201,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
+pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
+pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
+pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,119,196,0,0 monster Hydra 1068,1,315000,100000,1
+pay_dun02.gat,120,203,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,120,200,0,0 monster Hydra 1068,1,303000,100000,1
+pay_dun02.gat,120,194,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,121,200,0,0 monster Hydra 1068,1,333000,100000,1
+pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,122,197,0,0 monster Hydra 1068,1,321000,100000,1
+pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,113,194,0,0 monster Hydra 1068,1,319000,100000,1
+pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,113,193,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
+pay_dun02.gat,112,192,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
+pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
+pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,227,185,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,227,184,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,229,183,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun02.gat,214,266,0,0 monster Red Plant 1078,1,600000,300000,1
+pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
+pay_dun02.gat,37,243,0,0 monster Nine Tail 1180,1,3600000,1800000,1
+pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
+pay_dun02.gat,110,216,20,10 monster White Plant 1082,3,180000,90000,1
+pay_dun02.gat,132,84,10,10 monster White Plant 1082,3,180000,90000,1
+pay_dun02.gat,197,113,10,10 monster Red Plant 1078,4,180000,90000,1
+pay_dun02.gat,55,254,10,10 monster Red Plant 1078,4,180000,90000,1
+
+//==================================================
+// pay_dun03 - Payon Cave F4
+//==================================================
+pay_dun03.gat,0,0,0,0 monster Sohee 1170,50,0,0,0
+pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Bongun 1188,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,0,0,0
+pay_dun03.gat,0,0,0,0 monster Nine Tail 1180,1,3600000,1800000,0
+pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,0,1
+pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,14400000,0,1
+pay_dun03.gat,66,73,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,68,72,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,67,71,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,63,70,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,58,69,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,67,69,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,60,68,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,69,68,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,62,67,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,67,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,64,66,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,57,65,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,66,65,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,59,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,68,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,64,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,66,63,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,71,243,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,86,248,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,85,178,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,115,190,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,230,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,240,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,219,244,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,243,220,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,219,185,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,228,185,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun03.gat,228,61,0,0 monster Red Plant 1078,1,600000,300000,1
+pay_dun03.gat,138,42,0,0 monster Blue Plant 1079,1,600000,300000,1
+pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
+pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
+pay_dun03.gat,126,135,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,134,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,133,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,132,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,126,131,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,134,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,133,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,132,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,131,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,179,130,0,0 monster Mandragora 1020,1,300000,100000,1
+pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+pay_dun03.gat,246,56,20,20 monster White Plant 1082,3,180000,90000,1
+pay_dun03.gat,52,262,10,4 monster White Plant 1082,2,180000,90000,1
+
+//==================================================
+// pay_dun04 - Payon Cave F5
+//==================================================
+pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
+pay_dun04.gat,0,0,0,0 monster Sohee 1170,5,0,0,0
+pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
+pay_dun04.gat,120,115,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
+pay_dun04.gat,0,0,0,0 monster Greatest General 1277,15,0,0,0
+pay_dun04.gat,0,0,0,0 monster Archer Skeleton 1016,15,0,0,0
+pay_dun04.gat,0,0,0,0 monster Nine Tail 1180,20,800000,400000,0
+pay_dun04.gat,120,115,5,5 monster Skeleton General 1290,1,1800000,1200000,0
+pay_dun04.gat,120,115,5,5 monster Am Mut 1301,1,1800000,1200000,0
+pay_dun04.gat,120,115,0,0 monster Cat o' Nine Tails 1307,1,3600000,7200000,1
+pay_dun04.gat,0,0,0,0 monster Soldier Skeleton 1028,10,0,0,0
+pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,1,1800000,900000,1
+pay_dun04.gat,28,110,5,5 monster Shining Plant 1083,1,1800000,900000,1
+pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+pay_dun04.gat,107,206,5,5 monster White Plant 1082,2,180000,90000,1
+pay_dun04.gat,28,110,10,10 monster White Plant 1082,2,180000,90000,1
+pay_dun04.gat,190,207,5,5 monster White Plant 1082,2,180000,90000,1
diff --git a/npc/mobs/dungeons/pront_maze.txt b/npc/mobs/dungeons/pront_maze.txt
index 08b0f6529..39b9cfb0d 100644
--- a/npc/mobs/dungeons/pront_maze.txt
+++ b/npc/mobs/dungeons/pront_maze.txt
@@ -1,103 +1,103 @@
-//===== eAthena Script =======================================
-//= Prontera Maze(Hidden Temple) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// prt_maze01 - Labyrinth Forest F1
-//==================================================
-prt_maze01.gat,0,0,0,0 monster Shining Plant 1083,5,1800000,900000,1
-prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze01.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
-prt_maze01.gat,179,20,21,21 monster Poring 1002,5,120000,40000,1
-prt_maze01.gat,139,20,21,21 monster Lunatic 1063,5,120000,40000,1
-prt_maze01.gat,99,20,21,21 monster Fabre 1007,5,120000,40000,1
-prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
-prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
-prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
-prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
-prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
-prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
-prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
-prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
-prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
-prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
-prt_maze01.gat,99,100,21,21 monster Chonchon 1011,5,120000,40000,1
-prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
-prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,3,120000,40000,1
-prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
-prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
-prt_maze01.gat,99,140,21,21 monster Side Winder 1037,3,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
-prt_maze01.gat,19,140,21,21 monster Steel Chonchon 1042,5,120000,40000,1
-prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
-prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
-prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
-prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage 1166,3,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
-prt_maze01.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
-prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
-prt_maze01.gat,101,138,5,5 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze01.gat,101,138,5,5 monster White Plant 1082,1,1800000,900000,1
-prt_maze01.gat,99,181,5,5 monster White Plant 1082,2,1800000,900000,1
-prt_maze01.gat,60,140,10,15 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,61,101,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze01.gat,141,100,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze01.gat,141,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze01.gat,100,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze01.gat,100,100,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze01.gat,176,132,5,5 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze01.gat,181,149,3,3 monster Black Mushroom 1084,2,180000,90000,1
-prt_maze01.gat,178,60,10,10 monster Red Mushroom 1085,3,180000,90000,1
-prt_maze01.gat,168,60,3,3 monster Red Mushroom 1085,2,180000,90000,1
-
-//==================================================
-// prt_maze02 - Labyrinth Forest F2
-//==================================================
-prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
-prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
-prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,900000,40000,0
-prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,0
-
-//==================================================
-// prt_maze03 - Labyrinth Forest F3
-//==================================================
-prt_maze03.gat,0,0,0,0 monster Poporing 1031,45,0,0,0
-prt_maze03.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
-prt_maze03.gat,0,0,0,0 monster Hunter Fly 1035,30,0,0,0
-prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,6800000,3400000,1
-prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
-prt_maze03.gat,150,50,70,70 monster Side Winder 1037,20,300000,150000,0
-prt_maze03.gat,150,50,70,70 monster Vocal 1088,1,1920000,1500000,1
-prt_maze03.gat,50,150,70,70 monster Stem Worm 1215,20,300000,150000,0
-prt_maze03.gat,50,150,70,70 monster Vagabond Wolf 1092,1,1920000,150000,1
-prt_maze03.gat,170,170,70,70 monster Mantis 1139,30,60000,30000,0
-prt_maze03.gat,170,170,70,70 monster Eclipse 1093,1,1920000,150000,1
-prt_maze03.gat,23,23,70,70 monster Mastering 1090,1,1920000,150000,1
-prt_maze03.gat,100,100,80,80 monster Baphomet Jr. 1101,25,0,0,0
-prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
-prt_maze03.gat,61,98,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,61,98,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,61,98,10,10 monster Yellow Plant 1081,1,1800000,900000,1
-prt_maze03.gat,57,56,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,15,15,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,137,140,3,3 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,17,58,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_maze03.gat,17,58,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,99,141,10,10 monster Blue Plant 1079,2,1800000,900000,1
-prt_maze03.gat,99,21,10,10 monster Blue Plant 1079,1,1800000,900000,1
-prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze03.gat,99,21,10,10 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze03.gat,54,15,10,10 monster Black Mushroom 1084,3,180000,90000,1
-prt_maze03.gat,171,180,3,3 monster Red Mushroom 1085,2,180000,90000,1
-prt_maze03.gat,174,187,3,3 monster Red Mushroom 1085,3,180000,90000,1
+//===== eAthena Script =======================================
+//= Prontera Maze(Hidden Temple) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// prt_maze01 - Labyrinth Forest F1
+//==================================================
+prt_maze01.gat,0,0,0,0 monster Shining Plant 1083,5,1800000,900000,1
+prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze01.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
+prt_maze01.gat,179,20,21,21 monster Poring 1002,5,120000,40000,1
+prt_maze01.gat,139,20,21,21 monster Lunatic 1063,5,120000,40000,1
+prt_maze01.gat,99,20,21,21 monster Fabre 1007,5,120000,40000,1
+prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
+prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
+prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
+prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
+prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
+prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
+prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
+prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
+prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
+prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
+prt_maze01.gat,99,100,21,21 monster Chonchon 1011,5,120000,40000,1
+prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
+prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,3,120000,40000,1
+prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
+prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
+prt_maze01.gat,99,140,21,21 monster Side Winder 1037,3,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
+prt_maze01.gat,19,140,21,21 monster Steel Chonchon 1042,5,120000,40000,1
+prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
+prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
+prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
+prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage 1166,3,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
+prt_maze01.gat,0,0,0,0 monster Hunter Fly 1035,1,0,0,0
+prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,0
+prt_maze01.gat,101,138,5,5 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze01.gat,101,138,5,5 monster White Plant 1082,1,1800000,900000,1
+prt_maze01.gat,99,181,5,5 monster White Plant 1082,2,1800000,900000,1
+prt_maze01.gat,60,140,10,15 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,61,101,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze01.gat,141,100,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze01.gat,141,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze01.gat,100,100,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze01.gat,100,100,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze01.gat,176,132,5,5 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze01.gat,181,149,3,3 monster Black Mushroom 1084,2,180000,90000,1
+prt_maze01.gat,178,60,10,10 monster Red Mushroom 1085,3,180000,90000,1
+prt_maze01.gat,168,60,3,3 monster Red Mushroom 1085,2,180000,90000,1
+
+//==================================================
+// prt_maze02 - Labyrinth Forest F2
+//==================================================
+prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
+prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
+prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,900000,40000,0
+prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,0
+
+//==================================================
+// prt_maze03 - Labyrinth Forest F3
+//==================================================
+prt_maze03.gat,0,0,0,0 monster Poporing 1031,45,0,0,0
+prt_maze03.gat,0,0,0,0 monster Side Winder 1037,10,0,0,0
+prt_maze03.gat,0,0,0,0 monster Hunter Fly 1035,30,0,0,0
+prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,6800000,3400000,1
+prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
+prt_maze03.gat,150,50,70,70 monster Side Winder 1037,20,300000,150000,0
+prt_maze03.gat,150,50,70,70 monster Vocal 1088,1,1920000,1500000,1
+prt_maze03.gat,50,150,70,70 monster Stem Worm 1215,20,300000,150000,0
+prt_maze03.gat,50,150,70,70 monster Vagabond Wolf 1092,1,1920000,150000,1
+prt_maze03.gat,170,170,70,70 monster Mantis 1139,30,60000,30000,0
+prt_maze03.gat,170,170,70,70 monster Eclipse 1093,1,1920000,150000,1
+prt_maze03.gat,23,23,70,70 monster Mastering 1090,1,1920000,150000,1
+prt_maze03.gat,100,100,80,80 monster Baphomet Jr. 1101,25,0,0,0
+prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
+prt_maze03.gat,61,98,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,61,98,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,61,98,10,10 monster Yellow Plant 1081,1,1800000,900000,1
+prt_maze03.gat,57,56,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,15,15,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,137,140,3,3 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,17,58,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_maze03.gat,17,58,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,99,141,10,10 monster Blue Plant 1079,2,1800000,900000,1
+prt_maze03.gat,99,21,10,10 monster Blue Plant 1079,1,1800000,900000,1
+prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze03.gat,99,21,10,10 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze03.gat,54,15,10,10 monster Black Mushroom 1084,3,180000,90000,1
+prt_maze03.gat,171,180,3,3 monster Red Mushroom 1085,2,180000,90000,1
+prt_maze03.gat,174,187,3,3 monster Red Mushroom 1085,3,180000,90000,1
diff --git a/npc/mobs/dungeons/pront_sewers.txt b/npc/mobs/dungeons/pront_sewers.txt
index 72a38942d..752220f5a 100644
--- a/npc/mobs/dungeons/pront_sewers.txt
+++ b/npc/mobs/dungeons/pront_sewers.txt
@@ -1,52 +1,52 @@
-//===== eAthena Script =======================================
-//= Prontera Sewers(Culvert) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// prt_sewb1 - Prontera Culvert F1
-//==================================================
-prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,80,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Tarou 1175,10,0,0,0
-
-//==================================================
-// prt_sewb2 - Prontera Culvert F2
-//==================================================
-prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Thief Bug 1051,70,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Plankton 1161,30,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Thief Bug Female 1053,10,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
-
-//==================================================
-// prt_sewb3 - Prontera Culvert F3
-//==================================================
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Female 1053,65,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Thief Bug Male 1054,65,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Tarou 1175,15,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-
-//==================================================
-// prt_sewb4 - Prontera Culvert F4
-//==================================================
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Male 1054,70,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,1800000,1
+//===== eAthena Script =======================================
+//= Prontera Sewers(Culvert) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// prt_sewb1 - Prontera Culvert F1
+//==================================================
+prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,80,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Tarou 1175,10,0,0,0
+
+//==================================================
+// prt_sewb2 - Prontera Culvert F2
+//==================================================
+prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Thief Bug 1051,70,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Plankton 1161,30,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Thief Bug Female 1053,10,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,0,0,0
+
+//==================================================
+// prt_sewb3 - Prontera Culvert F3
+//==================================================
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Female 1053,65,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Thief Bug Male 1054,65,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Tarou 1175,15,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+
+//==================================================
+// prt_sewb4 - Prontera Culvert F4
+//==================================================
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Male 1054,70,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,1800000,1
diff --git a/npc/mobs/dungeons/racheldun.txt b/npc/mobs/dungeons/racheldun.txt
index c313f3e93..863c15876 100644
--- a/npc/mobs/dungeons/racheldun.txt
+++ b/npc/mobs/dungeons/racheldun.txt
@@ -1,53 +1,53 @@
-//===== eAthena Script =======================================
-//= Rachel Santuary Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 First version with guessed amounts [Playtester]
-//============================================================
-
-//==================================================
-// ra_san01
-//==================================================
-ra_san01.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
-ra_san01.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
-ra_san01.gat,0,0,0,0 monster Vanberk 1771,20,0,0,0
-ra_san01.gat,0,0,0,0 monster Isilla 1772,10,0,0,0
-
-//==================================================
-// ra_san02
-//==================================================
-ra_san02.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
-ra_san02.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
-ra_san02.gat,0,0,0,0 monster Vanberk 1771,40,0,0,0
-ra_san02.gat,0,0,0,0 monster Isilla 1772,30,0,0,0
-
-//==================================================
-// ra_san03
-//==================================================
-ra_san03.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
-ra_san03.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
-ra_san03.gat,0,0,0,0 monster Hodremlin 1773,30,0,0,0
-ra_san03.gat,0,0,0,0 monster Seeker 1774,30,0,0,0
-
-//==================================================
-// ra_san04
-//==================================================
-ra_san04.gat,0,0,0,0 monster Agav 1769,30,0,0,0
-ra_san04.gat,0,0,0,0 monster Echio 1770,30,0,0,0
-ra_san04.gat,0,0,0,0 monster Hodremlin 1773,20,0,0,0
-ra_san04.gat,0,0,0,0 monster Seeker 1774,20,0,0,0
-
-//==================================================
-// ra_san05
-//==================================================
-ra_san05.gat,0,0,0,0 monster Agav 1769,20,0,0,0
-ra_san05.gat,0,0,0,0 monster Echio 1770,20,0,0,0
-ra_san05.gat,0,0,0,0 monster Isilla 1772,20,0,0,0
-ra_san05.gat,0,0,0,0 monster Hodremlin 1773,20,0,0,0
-ra_san05.gat,0,0,0,0 monster Seeker 1774,20,0,0,0
-ra_san05.gat,0,0,0,0 monster Gloom Under Night 1768,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Rachel Santuary Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 First version with guessed amounts [Playtester]
+//============================================================
+
+//==================================================
+// ra_san01
+//==================================================
+ra_san01.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
+ra_san01.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
+ra_san01.gat,0,0,0,0 monster Vanberk 1771,20,0,0,0
+ra_san01.gat,0,0,0,0 monster Isilla 1772,10,0,0,0
+
+//==================================================
+// ra_san02
+//==================================================
+ra_san02.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
+ra_san02.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
+ra_san02.gat,0,0,0,0 monster Vanberk 1771,40,0,0,0
+ra_san02.gat,0,0,0,0 monster Isilla 1772,30,0,0,0
+
+//==================================================
+// ra_san03
+//==================================================
+ra_san03.gat,0,0,0,0 monster Gremlin 1632,20,0,0,0
+ra_san03.gat,0,0,0,0 monster Beholder 1633,20,0,0,0
+ra_san03.gat,0,0,0,0 monster Hodremlin 1773,30,0,0,0
+ra_san03.gat,0,0,0,0 monster Seeker 1774,30,0,0,0
+
+//==================================================
+// ra_san04
+//==================================================
+ra_san04.gat,0,0,0,0 monster Agav 1769,30,0,0,0
+ra_san04.gat,0,0,0,0 monster Echio 1770,30,0,0,0
+ra_san04.gat,0,0,0,0 monster Hodremlin 1773,20,0,0,0
+ra_san04.gat,0,0,0,0 monster Seeker 1774,20,0,0,0
+
+//==================================================
+// ra_san05
+//==================================================
+ra_san05.gat,0,0,0,0 monster Agav 1769,20,0,0,0
+ra_san05.gat,0,0,0,0 monster Echio 1770,20,0,0,0
+ra_san05.gat,0,0,0,0 monster Isilla 1772,20,0,0,0
+ra_san05.gat,0,0,0,0 monster Hodremlin 1773,20,0,0,0
+ra_san05.gat,0,0,0,0 monster Seeker 1774,20,0,0,0
+ra_san05.gat,0,0,0,0 monster Gloom Under Night 1768,1,7200000,3600000,1
diff --git a/npc/mobs/dungeons/sunkenship.txt b/npc/mobs/dungeons/sunkenship.txt
index 1784ec465..b1b8b799a 100644
--- a/npc/mobs/dungeons/sunkenship.txt
+++ b/npc/mobs/dungeons/sunkenship.txt
@@ -1,159 +1,159 @@
-//===== eAthena Script =======================================
-//= Sunken Ship Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// treasure01 - Sunken Ship F1
-//==================================================
-treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure01.gat,0,0,0,0 monster Whisper 1179,5,0,0,1
-treasure01.gat,0,0,0,0 monster Whisper 1179,5,120000,60000,1
-treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
-treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
-treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
-treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
-treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,180000,90000,1
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
-treasure01.gat,106,111,9,9 monster Thara Frog 1034,5,180000,90000,1
-treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
-treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
-treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
-treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,49,161,0,0 monster Hydra 1068,1,310000,100000,1
-treasure01.gat,49,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
-treasure01.gat,50,160,0,0 monster Hydra 1068,1,301000,100000,1
-treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
-treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
-treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
-treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
-treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
-treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
-treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
-treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
-treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
-treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,164,71,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,164,70,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,165,70,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,164,59,12,10 monster Wanderer 1208,1,1800000,200000,1
-treasure01.gat,164,59,12,10 monster Penomena 1216,1,900000,450000,1
-treasure01.gat,164,59,12,10 monster Whisper 1179,5,300000,100000,1
-treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
-treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,158,44,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,43,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,158,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
-treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
-treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,168,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,168,44,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,168,43,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
-treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,169,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,41,0,0 monster Hydra 1068,1,313000,100000,1
-treasure01.gat,169,40,0,0 monster Hydra 1068,1,300000,100000,1
-
-//==================================================
-// treasure02 - Sunken Ship F2
-//==================================================
-treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1980000,1200000,1
-treasure02.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
-treasure02.gat,0,0,0,0 monster Wanderer 1208,1,600000,300000,1
-treasure02.gat,0,0,0,0 monster Penomena 1216,22,300000,120000,1
-treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,5,0,0,1
-treasure02.gat,0,0,0,0 monster Mimic 1191,3,0,0,1
-treasure02.gat,95,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,96,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,107,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,108,57,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,50,10,10 monster Penomena 1216,5,300000,100000,1
-treasure02.gat,102,68,13,13 monster Whisper 1179,1,300000,100000,1
-treasure02.gat,102,80,5,5 monster Whisper 1179,1,300000,100000,1
-treasure02.gat,102,88,5,5 monster Whisper 1179,1,300000,100000,1
-treasure02.gat,100,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,100,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,100,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,150,15,10 monster Whisper 1179,2,200000,100000,1
-treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
-treasure02.gat,101,151,10,10 monster Penomena 1216,4,100000,100000,1
-treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
-treasure02.gat,101,135,2,2 monster Penomena 1216,1,60000,200000,1
-treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure02.gat,38,74,9,9 monster Penomena 1216,5,300000,100000,1
-treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
-treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,300000,100000,1
-treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
-treasure02.gat,157,143,1,1 monster Whisper 1179,1,100000,100000,1
-treasure02.gat,151,138,1,1 monster Whisper 1179,1,100000,100000,1
-treasure02.gat,45,144,1,1 monster Whisper 1179,1,200000,100000,1
-treasure02.gat,52,139,1,1 monster Whisper 1179,1,200000,100000,1
-treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
+//===== eAthena Script =======================================
+//= Sunken Ship Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// treasure01 - Sunken Ship F1
+//==================================================
+treasure01.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure01.gat,0,0,0,0 monster Whisper 1179,5,0,0,1
+treasure01.gat,0,0,0,0 monster Whisper 1179,5,120000,60000,1
+treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
+treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
+treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
+treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
+treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,5,180000,90000,1
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,5,180000,90000,1
+treasure01.gat,106,111,9,9 monster Thara Frog 1034,5,180000,90000,1
+treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
+treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
+treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
+treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,49,161,0,0 monster Hydra 1068,1,310000,100000,1
+treasure01.gat,49,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
+treasure01.gat,50,160,0,0 monster Hydra 1068,1,301000,100000,1
+treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
+treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
+treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
+treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
+treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
+treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
+treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
+treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,2,300000,100000,1
+treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
+treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,164,71,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,164,70,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,165,70,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,164,59,12,10 monster Wanderer 1208,1,1800000,200000,1
+treasure01.gat,164,59,12,10 monster Penomena 1216,1,900000,450000,1
+treasure01.gat,164,59,12,10 monster Whisper 1179,5,300000,100000,1
+treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
+treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,158,44,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,43,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,158,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
+treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
+treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,168,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,168,44,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,168,43,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
+treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,169,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,41,0,0 monster Hydra 1068,1,313000,100000,1
+treasure01.gat,169,40,0,0 monster Hydra 1068,1,300000,100000,1
+
+//==================================================
+// treasure02 - Sunken Ship F2
+//==================================================
+treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1980000,1200000,1
+treasure02.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
+treasure02.gat,0,0,0,0 monster Wanderer 1208,1,600000,300000,1
+treasure02.gat,0,0,0,0 monster Penomena 1216,22,300000,120000,1
+treasure02.gat,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure02.gat,0,0,0,0 monster Pirate Skeleton 1071,5,0,0,1
+treasure02.gat,0,0,0,0 monster Mimic 1191,3,0,0,1
+treasure02.gat,95,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,96,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,107,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,108,57,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,50,10,10 monster Penomena 1216,5,300000,100000,1
+treasure02.gat,102,68,13,13 monster Whisper 1179,1,300000,100000,1
+treasure02.gat,102,80,5,5 monster Whisper 1179,1,300000,100000,1
+treasure02.gat,102,88,5,5 monster Whisper 1179,1,300000,100000,1
+treasure02.gat,100,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,100,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,100,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,150,15,10 monster Whisper 1179,2,200000,100000,1
+treasure02.gat,101,151,8,8 monster Drake 1112,1,7200000,3600000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
+treasure02.gat,101,151,10,10 monster Penomena 1216,4,100000,100000,1
+treasure02.gat,101,126,2,2 monster Penomena 1216,1,1200000,600000,1
+treasure02.gat,101,135,2,2 monster Penomena 1216,1,60000,200000,1
+treasure02.gat,38,74,9,9 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure02.gat,38,74,9,9 monster Penomena 1216,5,300000,100000,1
+treasure02.gat,170,71,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+treasure02.gat,168,77,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+treasure02.gat,164,67,1,1 monster Pirate Skeleton 1071,1,100000,100000,1
+treasure02.gat,155,43,21,13 monster Pirate Skeleton 1071,6,300000,100000,1
+treasure02.gat,178,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+treasure02.gat,178,140,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+treasure02.gat,184,143,1,1 monster Pirate Skeleton 1071,1,300000,100000,1
+treasure02.gat,157,143,1,1 monster Whisper 1179,1,100000,100000,1
+treasure02.gat,151,138,1,1 monster Whisper 1179,1,100000,100000,1
+treasure02.gat,45,144,1,1 monster Whisper 1179,1,200000,100000,1
+treasure02.gat,52,139,1,1 monster Whisper 1179,1,200000,100000,1
+treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
diff --git a/npc/mobs/dungeons/thanatos.txt b/npc/mobs/dungeons/thanatos.txt
index fe746f769..c728041c3 100644
--- a/npc/mobs/dungeons/thanatos.txt
+++ b/npc/mobs/dungeons/thanatos.txt
@@ -1,182 +1,182 @@
-//===== eAthena Script =======================================
-//= Thanatos Tower Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Real spawns by Poki#3 [Nexon]
-//= 1.1 More official spawns [Playtester]
-//= 1.2 Updated by using Tharis' Homun AI, by Tharis [Vicious]
-//= 1.3 Official Aegis X.3 spawns [Playtester]
-//============================================================
-
-//==================================================
-// tha_t01 - Thanatos Tower F1
-//==================================================
-tha_t01.gat,0,0,0,0 monster Alice 1275,5,0,0,0
-tha_t01.gat,0,0,0,0 monster Plasma 1695,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
-tha_t01.gat,0,0,0,0 monster Lady Solace 1703,4,1800000,1200000,0
-
-//==================================================
-// tha_t02 - Thanatos Tower F2
-//==================================================
-tha_t02.gat,0,0,0,0 monster Alice 1275,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Plasma 1697,20,0,0,0
-tha_t02.gat,0,0,0,0 monster Mimic 1191,30,0,0,0
-tha_t02.gat,0,0,0,0 monster Ancient Mimic 1699,80,0,0,0
-tha_t02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Death Word 1698,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Elder 1377,10,0,0,0
-tha_t02.gat,0,0,0,0 monster Baroness of Retribution 1702,4,1800000,1200000,0
-
-//==================================================
-// tha_t03 - Thanatos Tower F3
-//==================================================
-tha_t03.gat,0,0,0,0 monster Plasma 1696,20,0,0,0
-tha_t03.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
-tha_t03.gat,0,0,0,0 monster Death Word 1698,80,0,0,0
-tha_t03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Ancient Mimic 1699,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Elder 1377,10,0,0,0
-tha_t03.gat,0,0,0,0 monster Mistress of Shelter 1701,4,1800000,1200000,0
-
-//==================================================
-// tha_t04 - Thanatos Tower F4
-//==================================================
-tha_t04.gat,0,0,0,0 monster Plasma 1694,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Death Word 1698,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Ancient Mimic 1699,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Elder 1377,20,0,0,0
-tha_t04.gat,0,0,0,0 monster Owl Baron 1295,10,0,0,0
-tha_t04.gat,0,0,0,0 monster Owl Duke 1320,10,0,0,0
-tha_t04.gat,0,0,0,0 monster Dame of Sentinel 1700,4,1800000,1200000,0
-
-//==================================================
-// tha_t05 - Thanatos Tower F5
-//==================================================
-tha_t05.gat,61,179,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,61,179,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,61,179,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,178,178,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,178,178,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,178,178,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,178,63,55,5 monster Elder 1377,5,0,0,0
-tha_t05.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,178,63,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,178,63,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,62,63,55,55 monster Elder 1377,5,0,0,0
-tha_t05.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t05.gat,62,63,55,55 monster Owl Duke 1320,20,300000,120000,0
-tha_t05.gat,62,63,55,55 monster Owl Baron 1295,5,300000,120000,0
-tha_t05.gat,0,0,0,0 monster Dolor of Thanatos 1707,2,1800000,1200000,0
-
-//==================================================
-// tha_t06 - Thanatos Tower F6
-//==================================================
-tha_t06.gat,61,179,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,61,179,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,61,179,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,178,178,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,178,178,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,178,178,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,178,63,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,178,63,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,178,63,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,62,63,55,55 monster Elder 1377,5,0,0,0
-tha_t06.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
-tha_t06.gat,62,63,55,55 monster Owl Baron 1295,10,300000,120000,0
-tha_t06.gat,62,63,55,55 monster Owl Duke 1320,10,300000,120000,0
-tha_t06.gat,0,0,0,0 monster Maero of Thanatos 1706,2,1800000,1200000,0
-
-//==================================================
-// tha_t07 - Thanatos Tower F7
-//==================================================
-tha_t07.gat,70,105,40,75 monster Death Word 1698,10,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Ancient Mimic 1699,10,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Lady Solace 1703,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Mistress of Shelter 1701,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Baroness of Retribution 1702,15,0,0,0
-tha_t07.gat,70,105,40,75 monster Dame of Sentinel 1700,7,300000,120000,0
-tha_t07.gat,70,105,40,75 monster Despero of Thanatos 1705,2,1800000,1200000,0
-
-//==================================================
-// tha_t08 - Thanatos Tower F8
-//==================================================
-tha_t08.gat,70,105,40,80 monster Death Word 1698,10,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Ancient Mimic 1699,10,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Lady Solace 1703,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Mistress of Shelter 1701,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Baroness of Retribution 1702,20,300000,120000,0
-tha_t08.gat,70,105,40,80 monster Dame of Sentinel 1700,5,0,0,0
-tha_t08.gat,70,105,40,80 monster Odium of Thanatos 1704,2,1800000,1200000,0
-
-//==================================================
-// tha_t09 - Thanatos Tower F9
-//==================================================
-tha_t09.gat,50,129,35,35 monster Plasma 1694,5,0,0,0
-tha_t09.gat,50,129,35,35 monster Lady Solace 1703,20,600000,0,0
-tha_t09.gat,50,129,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1707,1,1800000,1200000,0
-tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1712,3,1800000,1200000,0
-
-//==================================================
-// tha_t10 - Thanatos Tower F10
-//==================================================
-tha_t10.gat,129,129,35,35 monster Plasma 1697,5,0,0,0
-tha_t10.gat,129,129,35,35 monster Baroness of Retribution 1702,20,600000,0,0
-tha_t10.gat,129,129,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1706,1,1800000,1200000,0
-tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1711,3,1800000,1200000,0
-
-//==================================================
-// tha_t11 - Thanatos Tower F11
-//==================================================
-tha_t11.gat,50,51,35,35 monster Plasma 1695,5,0,0,0
-tha_t11.gat,50,51,35,35 monster Mistress of Shelter 1701,20,600000,0,0
-tha_t11.gat,50,51,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Dame of Sentinel 1700,5,420000,0,0
-tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1705,1,1800000,1200000,0
-tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1710,3,1800000,1200000,0
-
-//==================================================
-// tha_t12 - Thanatos Tower F12
-//==================================================
-tha_t12.gat,129,51,35,35 monster Plasma 1693,5,0,0,0
-tha_t12.gat,129,51,35,35 monster Dame of Sentinel 1700,13,600000,0,0
-tha_t12.gat,129,51,35,35 monster Lady Solace 1703,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Mistress of Shelter 1701,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
-tha_t12.gat,129,51,35,35 monster Odium of Thanatos 1709,4,1800000,1200000,0
+//===== eAthena Script =======================================
+//= Thanatos Tower Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Real spawns by Poki#3 [Nexon]
+//= 1.1 More official spawns [Playtester]
+//= 1.2 Updated by using Tharis' Homun AI, by Tharis [Vicious]
+//= 1.3 Official Aegis X.3 spawns [Playtester]
+//============================================================
+
+//==================================================
+// tha_t01 - Thanatos Tower F1
+//==================================================
+tha_t01.gat,0,0,0,0 monster Alice 1275,5,0,0,0
+tha_t01.gat,0,0,0,0 monster Plasma 1695,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
+tha_t01.gat,0,0,0,0 monster Lady Solace 1703,4,1800000,1200000,0
+
+//==================================================
+// tha_t02 - Thanatos Tower F2
+//==================================================
+tha_t02.gat,0,0,0,0 monster Alice 1275,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Plasma 1697,20,0,0,0
+tha_t02.gat,0,0,0,0 monster Mimic 1191,30,0,0,0
+tha_t02.gat,0,0,0,0 monster Ancient Mimic 1699,80,0,0,0
+tha_t02.gat,0,0,0,0 monster Rideword 1195,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Death Word 1698,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Elder 1377,10,0,0,0
+tha_t02.gat,0,0,0,0 monster Baroness of Retribution 1702,4,1800000,1200000,0
+
+//==================================================
+// tha_t03 - Thanatos Tower F3
+//==================================================
+tha_t03.gat,0,0,0,0 monster Plasma 1696,20,0,0,0
+tha_t03.gat,0,0,0,0 monster Rideword 1195,30,0,0,0
+tha_t03.gat,0,0,0,0 monster Death Word 1698,80,0,0,0
+tha_t03.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Ancient Mimic 1699,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Elder 1377,10,0,0,0
+tha_t03.gat,0,0,0,0 monster Mistress of Shelter 1701,4,1800000,1200000,0
+
+//==================================================
+// tha_t04 - Thanatos Tower F4
+//==================================================
+tha_t04.gat,0,0,0,0 monster Plasma 1694,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Rideword 1195,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Death Word 1698,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Mimic 1191,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Ancient Mimic 1699,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Elder 1377,20,0,0,0
+tha_t04.gat,0,0,0,0 monster Owl Baron 1295,10,0,0,0
+tha_t04.gat,0,0,0,0 monster Owl Duke 1320,10,0,0,0
+tha_t04.gat,0,0,0,0 monster Dame of Sentinel 1700,4,1800000,1200000,0
+
+//==================================================
+// tha_t05 - Thanatos Tower F5
+//==================================================
+tha_t05.gat,61,179,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,61,179,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,61,179,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,178,178,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,178,178,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,178,178,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,178,63,55,5 monster Elder 1377,5,0,0,0
+tha_t05.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,178,63,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,178,63,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,62,63,55,55 monster Elder 1377,5,0,0,0
+tha_t05.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t05.gat,62,63,55,55 monster Owl Duke 1320,20,300000,120000,0
+tha_t05.gat,62,63,55,55 monster Owl Baron 1295,5,300000,120000,0
+tha_t05.gat,0,0,0,0 monster Dolor of Thanatos 1707,2,1800000,1200000,0
+
+//==================================================
+// tha_t06 - Thanatos Tower F6
+//==================================================
+tha_t06.gat,61,179,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,61,179,55,55 monster Plasma 1697,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,61,179,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,61,179,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,178,178,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,178,178,55,55 monster Plasma 1695,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,178,178,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,178,178,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,178,63,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,178,63,55,55 monster Plasma 1696,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,178,63,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,178,63,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,62,63,55,55 monster Elder 1377,5,0,0,0
+tha_t06.gat,62,63,55,55 monster Plasma 1694,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Death Word 1698,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Ancient Mimic 1699,10,0,0,0
+tha_t06.gat,62,63,55,55 monster Owl Baron 1295,10,300000,120000,0
+tha_t06.gat,62,63,55,55 monster Owl Duke 1320,10,300000,120000,0
+tha_t06.gat,0,0,0,0 monster Maero of Thanatos 1706,2,1800000,1200000,0
+
+//==================================================
+// tha_t07 - Thanatos Tower F7
+//==================================================
+tha_t07.gat,70,105,40,75 monster Death Word 1698,10,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Ancient Mimic 1699,10,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Lady Solace 1703,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Mistress of Shelter 1701,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Baroness of Retribution 1702,15,0,0,0
+tha_t07.gat,70,105,40,75 monster Dame of Sentinel 1700,7,300000,120000,0
+tha_t07.gat,70,105,40,75 monster Despero of Thanatos 1705,2,1800000,1200000,0
+
+//==================================================
+// tha_t08 - Thanatos Tower F8
+//==================================================
+tha_t08.gat,70,105,40,80 monster Death Word 1698,10,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Ancient Mimic 1699,10,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Lady Solace 1703,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Mistress of Shelter 1701,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Baroness of Retribution 1702,20,300000,120000,0
+tha_t08.gat,70,105,40,80 monster Dame of Sentinel 1700,5,0,0,0
+tha_t08.gat,70,105,40,80 monster Odium of Thanatos 1704,2,1800000,1200000,0
+
+//==================================================
+// tha_t09 - Thanatos Tower F9
+//==================================================
+tha_t09.gat,50,129,35,35 monster Plasma 1694,5,0,0,0
+tha_t09.gat,50,129,35,35 monster Lady Solace 1703,20,600000,0,0
+tha_t09.gat,50,129,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1707,1,1800000,1200000,0
+tha_t09.gat,50,129,35,35 monster Dolor of Thanatos 1712,3,1800000,1200000,0
+
+//==================================================
+// tha_t10 - Thanatos Tower F10
+//==================================================
+tha_t10.gat,129,129,35,35 monster Plasma 1697,5,0,0,0
+tha_t10.gat,129,129,35,35 monster Baroness of Retribution 1702,20,600000,0,0
+tha_t10.gat,129,129,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1706,1,1800000,1200000,0
+tha_t10.gat,129,129,35,35 monster Maero of Thanatos 1711,3,1800000,1200000,0
+
+//==================================================
+// tha_t11 - Thanatos Tower F11
+//==================================================
+tha_t11.gat,50,51,35,35 monster Plasma 1695,5,0,0,0
+tha_t11.gat,50,51,35,35 monster Mistress of Shelter 1701,20,600000,0,0
+tha_t11.gat,50,51,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Dame of Sentinel 1700,5,420000,0,0
+tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1705,1,1800000,1200000,0
+tha_t11.gat,50,51,35,35 monster Despero of Thanatos 1710,3,1800000,1200000,0
+
+//==================================================
+// tha_t12 - Thanatos Tower F12
+//==================================================
+tha_t12.gat,129,51,35,35 monster Plasma 1693,5,0,0,0
+tha_t12.gat,129,51,35,35 monster Dame of Sentinel 1700,13,600000,0,0
+tha_t12.gat,129,51,35,35 monster Lady Solace 1703,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Mistress of Shelter 1701,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Baroness of Retribution 1702,5,420000,0,0
+tha_t12.gat,129,51,35,35 monster Odium of Thanatos 1709,4,1800000,1200000,0
diff --git a/npc/mobs/dungeons/toyfactory.txt b/npc/mobs/dungeons/toyfactory.txt
index 8bcfca9b3..f6be13605 100644
--- a/npc/mobs/dungeons/toyfactory.txt
+++ b/npc/mobs/dungeons/toyfactory.txt
@@ -1,35 +1,35 @@
-//===== eAthena Script =======================================
-//= Toy Factory Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 added Garm Baby according to May 10 patch
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// xmas_dun01 - Toy Factory Warehouse
-//==================================================
-xmas_dun01.gat,0,0,0,0 monster Marin 1242,20,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Cookie 1265,40,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,40,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Myst Case 1249,5,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Chepet 1250,1,1200000,900000,0
-xmas_dun01.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,0
-xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
-
-//==================================================
-// xmas_dun02 - Toy Monitoring Room
-//==================================================
-xmas_dun02.gat,0,0,0,0 monster Cookie 1265,20,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Christmas Cookie 1246,20,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Cruiser 1248,35,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,50,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
-xmas_dun02.gat,0,0,0,0 monster Stormy Knight 1251,1,3600000,7200000,0
+//===== eAthena Script =======================================
+//= Toy Factory Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 added Garm Baby according to May 10 patch
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// xmas_dun01 - Toy Factory Warehouse
+//==================================================
+xmas_dun01.gat,0,0,0,0 monster Marin 1242,20,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Cookie 1265,40,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,40,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Myst Case 1249,5,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Chepet 1250,1,1200000,900000,0
+xmas_dun01.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,0
+xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
+
+//==================================================
+// xmas_dun02 - Toy Monitoring Room
+//==================================================
+xmas_dun02.gat,0,0,0,0 monster Cookie 1265,20,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Christmas Cookie 1246,20,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Cruiser 1248,35,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,50,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
+xmas_dun02.gat,0,0,0,0 monster Stormy Knight 1251,1,3600000,7200000,0
diff --git a/npc/mobs/dungeons/turtleisland.txt b/npc/mobs/dungeons/turtleisland.txt
index bccde856d..418517dcf 100644
--- a/npc/mobs/dungeons/turtleisland.txt
+++ b/npc/mobs/dungeons/turtleisland.txt
@@ -1,72 +1,72 @@
-//===== eAthena Script =======================================
-//= Turtle Island Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// tur_dun01 - Turtle Island
-//==================================================
-tur_dun01.gat,0,0,0,0 monster Dragon Tail 1321,25,0,0,0
-tur_dun01.gat,0,0,0,0 monster Spring Rabbit 1322,25,0,0,0
-tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
-tur_dun01.gat,0,0,0,0 monster Permeter 1314,10,0,0,0
-tur_dun01.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-//==================================================
-// tur_dun02 - Turtle Island Dungeon
-//==================================================
-tur_dun02.gat,0,0,0,0 monster Permeter 1314,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Solider 1316,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
-tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-//==================================================
-// tur_dun03 - Good Turtles Village
-//==================================================
-tur_dun03.gat,0,0,0,0 monster Permeter 1314,15,0,0,0
-tur_dun03.gat,0,0,0,0 monster Freezer 1319,40,0,0,0
-tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,0,0,0
-tur_dun03.gat,0,0,0,0 monster Heater 1318,10,50000,0,0
-
-//==================================================
-// tur_dun04 - Turtle Palace
-//==================================================
-tur_dun04.gat,99,92,10,10 monster Wanderer 1208,1,60000,30000,0
-tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,720000,0
-tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
-tur_dun04.gat,100,93,20,20 monster Assaulter 1315,10,120000,60000,0
-tur_dun04.gat,100,93,20,20 monster Freezer 1319,5,120000,60000,0
-tur_dun04.gat,171,159,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,171,155,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,171,149,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,28,159,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,28,155,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,28,149,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,174,26,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,174,29,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,174,32,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,26,26,3,3 monster Wanderer 1208,1,300000,150000,0
-tur_dun04.gat,26,29,3,3 monster Assaulter 1315,1,310000,160000,0
-tur_dun04.gat,26,32,3,3 monster Assaulter 1315,1,320000,170000,0
-tur_dun04.gat,0,0,0,0 monster Wanderer 1208,2,0,0,0
-tur_dun04.gat,0,0,0,0 monster Heater 1318,10,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Heater 1318,20,620000,310000,0
-tur_dun04.gat,0,0,0,0 monster Assaulter 1315,23,0,0,0
-tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,600000,300000,0
-tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,300000,150000,0
-tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,640000,320000,0
-
-//==================================================
-// tur_dun05 - Underground swamp zone
-//==================================================
-tur_dun05.gat,0,0,0,0 monster Permeter 1314,3,20000,0,0
-tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
-tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
+//===== eAthena Script =======================================
+//= Turtle Island Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// tur_dun01 - Turtle Island
+//==================================================
+tur_dun01.gat,0,0,0,0 monster Dragon Tail 1321,25,0,0,0
+tur_dun01.gat,0,0,0,0 monster Spring Rabbit 1322,25,0,0,0
+tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
+tur_dun01.gat,0,0,0,0 monster Permeter 1314,10,0,0,0
+tur_dun01.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+//==================================================
+// tur_dun02 - Turtle Island Dungeon
+//==================================================
+tur_dun02.gat,0,0,0,0 monster Permeter 1314,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Solider 1316,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
+tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+//==================================================
+// tur_dun03 - Good Turtles Village
+//==================================================
+tur_dun03.gat,0,0,0,0 monster Permeter 1314,15,0,0,0
+tur_dun03.gat,0,0,0,0 monster Freezer 1319,40,0,0,0
+tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,0,0,0
+tur_dun03.gat,0,0,0,0 monster Heater 1318,10,50000,0,0
+
+//==================================================
+// tur_dun04 - Turtle Palace
+//==================================================
+tur_dun04.gat,99,92,10,10 monster Wanderer 1208,1,60000,30000,0
+tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,720000,0
+tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
+tur_dun04.gat,100,93,20,20 monster Assaulter 1315,10,120000,60000,0
+tur_dun04.gat,100,93,20,20 monster Freezer 1319,5,120000,60000,0
+tur_dun04.gat,171,159,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,171,155,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,171,149,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,28,159,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,28,155,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,28,149,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,174,26,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,174,29,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,174,32,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,26,26,3,3 monster Wanderer 1208,1,300000,150000,0
+tur_dun04.gat,26,29,3,3 monster Assaulter 1315,1,310000,160000,0
+tur_dun04.gat,26,32,3,3 monster Assaulter 1315,1,320000,170000,0
+tur_dun04.gat,0,0,0,0 monster Wanderer 1208,2,0,0,0
+tur_dun04.gat,0,0,0,0 monster Heater 1318,10,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Heater 1318,20,620000,310000,0
+tur_dun04.gat,0,0,0,0 monster Assaulter 1315,23,0,0,0
+tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Freezer 1319,5,600000,300000,0
+tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,300000,150000,0
+tur_dun04.gat,0,0,0,0 monster Permeter 1314,2,640000,320000,0
+
+//==================================================
+// tur_dun05 - Underground swamp zone
+//==================================================
+tur_dun05.gat,0,0,0,0 monster Permeter 1314,3,20000,0,0
+tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
+tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
diff --git a/npc/mobs/dungeons/umbaladun.txt b/npc/mobs/dungeons/umbaladun.txt
index 2eb09cfca..e36a013c5 100644
--- a/npc/mobs/dungeons/umbaladun.txt
+++ b/npc/mobs/dungeons/umbaladun.txt
@@ -1,61 +1,61 @@
-//===== eAthena Script =======================================
-//= Umbala Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// um_dun01 - Carpenter's Shop in the Tree
-//==================================================
-um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,70,0,0,0
-um_dun01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
-um_dun01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-um_dun01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-
-//==================================================
-// um_dun02 - Passage to a Foreign World
-//==================================================
-um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,15,0,0,0
-um_dun02.gat,79,227,5,5 monster Wooden Golem 1497,5,120000,60000,0
-um_dun02.gat,87,189,5,5 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,170,145,5,5 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,196,131,7,7 monster Wooden Golem 1497,5,120000,60000,0
-um_dun02.gat,244,129,10,10 monster Wooden Golem 1497,5,120000,60000,0
-um_dun02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_dun02.gat,117,43,10,10 monster Beetle King 1494,3,120000,60000,0
-um_dun02.gat,209,34,10,10 monster Beetle King 1494,3,120000,60000,0
-um_dun02.gat,205,265,10,10 monster Beetle King 1494,4,120000,60000,0
-um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,10,0,0,0
-um_dun02.gat,90,97,10,10 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,32,83,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,180,238,10,10 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,144,277,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,272,163,10,10 monster Wooden Golem 1497,2,120000,60000,0
-um_dun02.gat,232,156,10,10 monster Wooden Golem 1497,3,120000,60000,0
-um_dun02.gat,0,0,0,0 monster Driller 1380,5,0,0,0
-um_dun02.gat,197,138,10,10 monster Driller 1380,2,120000,60000,0
-um_dun02.gat,164,203,10,10 monster Driller 1380,1,120000,60000,0
-um_dun02.gat,32,83,10,10 monster Driller 1380,1,120000,60000,0
-um_dun02.gat,244,129,10,10 monster Driller 1380,2,120000,60000,0
-um_dun02.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
-um_dun02.gat,213,217,10,10 monster Wootan Shooter 1498,2,120000,60000,0
-um_dun02.gat,72,258,10,10 monster Wootan Shooter 1498,3,120000,60000,0
-um_dun02.gat,79,227,5,5 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,170,145,5,5 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,209,34,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,272,163,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,232,156,10,10 monster Wootan Shooter 1498,1,120000,60000,0
-um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
-um_dun02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-um_dun02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_dun02.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
+//===== eAthena Script =======================================
+//= Umbala Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// um_dun01 - Carpenter's Shop in the Tree
+//==================================================
+um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,70,0,0,0
+um_dun01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
+um_dun01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+um_dun01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+
+//==================================================
+// um_dun02 - Passage to a Foreign World
+//==================================================
+um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,15,0,0,0
+um_dun02.gat,79,227,5,5 monster Wooden Golem 1497,5,120000,60000,0
+um_dun02.gat,87,189,5,5 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,170,145,5,5 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,196,131,7,7 monster Wooden Golem 1497,5,120000,60000,0
+um_dun02.gat,244,129,10,10 monster Wooden Golem 1497,5,120000,60000,0
+um_dun02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_dun02.gat,117,43,10,10 monster Beetle King 1494,3,120000,60000,0
+um_dun02.gat,209,34,10,10 monster Beetle King 1494,3,120000,60000,0
+um_dun02.gat,205,265,10,10 monster Beetle King 1494,4,120000,60000,0
+um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,10,0,0,0
+um_dun02.gat,90,97,10,10 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,32,83,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,180,238,10,10 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,144,277,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,272,163,10,10 monster Wooden Golem 1497,2,120000,60000,0
+um_dun02.gat,232,156,10,10 monster Wooden Golem 1497,3,120000,60000,0
+um_dun02.gat,0,0,0,0 monster Driller 1380,5,0,0,0
+um_dun02.gat,197,138,10,10 monster Driller 1380,2,120000,60000,0
+um_dun02.gat,164,203,10,10 monster Driller 1380,1,120000,60000,0
+um_dun02.gat,32,83,10,10 monster Driller 1380,1,120000,60000,0
+um_dun02.gat,244,129,10,10 monster Driller 1380,2,120000,60000,0
+um_dun02.gat,0,0,0,0 monster Wootan Shooter 1498,10,0,0,0
+um_dun02.gat,213,217,10,10 monster Wootan Shooter 1498,2,120000,60000,0
+um_dun02.gat,72,258,10,10 monster Wootan Shooter 1498,3,120000,60000,0
+um_dun02.gat,79,227,5,5 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,170,145,5,5 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,209,34,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,272,163,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,232,156,10,10 monster Wootan Shooter 1498,1,120000,60000,0
+um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
+um_dun02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+um_dun02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_dun02.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
diff --git a/npc/mobs/dungeons/yggdrasil.txt b/npc/mobs/dungeons/yggdrasil.txt
index 3c9494272..3d13c1d6f 100644
--- a/npc/mobs/dungeons/yggdrasil.txt
+++ b/npc/mobs/dungeons/yggdrasil.txt
@@ -1,35 +1,35 @@
-//===== eAthena Script =======================================
-//= Yggdrasil Tree Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Splitted from Nifflheim fields [DracoRPG]
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// yggdrasil01 - Hvergelmir's Fountain (Trunk of Yggdrasil)
-//==================================================
-yggdrasil01.gat,234,256,10,10 monster Blue Plant 1079,5,1800000,600000,0
-yggdrasil01.gat,273,234,3,3 monster Shining Plant 1083,1,1800000,600000,0
-yggdrasil01.gat,143,257,20,10 monster Shining Plant 1083,5,1200000,600000,0
-yggdrasil01.gat,98,238,20,15 monster Yellow Plant 1081,5,1200000,600000,0
-yggdrasil01.gat,98,238,20,15 monster White Plant 1082,5,1200000,600000,0
-yggdrasil01.gat,47,207,20,20 monster Blue Plant 1079,5,1200000,600000,0
-yggdrasil01.gat,61,258,3,3 monster Shining Plant 1083,1,1800000,600000,0
-yggdrasil01.gat,132,199,20,5 monster Blue Plant 1079,5,1200000,600000,0
-yggdrasil01.gat,209,218,2,2 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,192,186,2,2 monster Shining Plant 1083,1,1800000,1200000,0
-yggdrasil01.gat,169,176,3,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,169,176,3,3 monster Green Plant 1080,1,60000,30000,0
-yggdrasil01.gat,94,111,5,2 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,51,118,10,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,133,54,3,3 monster Shining Plant 1083,1,1200000,600000,0
-yggdrasil01.gat,257,63,10,10 monster Shining Plant 1083,3,1800000,1200000,0
-yggdrasil01.gat,0,0,0,0 monster Shining Plant 1083,10,3600000,2300000,0
-yggdrasil01.gat,0,0,0,0 monster Green Plant 1080,25,60000,30000,0
-yggdrasil01.gat,0,0,0,0 monster Red Plant 1078,15,60000,30000,0
+//===== eAthena Script =======================================
+//= Yggdrasil Tree Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Splitted from Nifflheim fields [DracoRPG]
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// yggdrasil01 - Hvergelmir's Fountain (Trunk of Yggdrasil)
+//==================================================
+yggdrasil01.gat,234,256,10,10 monster Blue Plant 1079,5,1800000,600000,0
+yggdrasil01.gat,273,234,3,3 monster Shining Plant 1083,1,1800000,600000,0
+yggdrasil01.gat,143,257,20,10 monster Shining Plant 1083,5,1200000,600000,0
+yggdrasil01.gat,98,238,20,15 monster Yellow Plant 1081,5,1200000,600000,0
+yggdrasil01.gat,98,238,20,15 monster White Plant 1082,5,1200000,600000,0
+yggdrasil01.gat,47,207,20,20 monster Blue Plant 1079,5,1200000,600000,0
+yggdrasil01.gat,61,258,3,3 monster Shining Plant 1083,1,1800000,600000,0
+yggdrasil01.gat,132,199,20,5 monster Blue Plant 1079,5,1200000,600000,0
+yggdrasil01.gat,209,218,2,2 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,192,186,2,2 monster Shining Plant 1083,1,1800000,1200000,0
+yggdrasil01.gat,169,176,3,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,169,176,3,3 monster Green Plant 1080,1,60000,30000,0
+yggdrasil01.gat,94,111,5,2 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,51,118,10,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,133,54,3,3 monster Shining Plant 1083,1,1200000,600000,0
+yggdrasil01.gat,257,63,10,10 monster Shining Plant 1083,3,1800000,1200000,0
+yggdrasil01.gat,0,0,0,0 monster Shining Plant 1083,10,3600000,2300000,0
+yggdrasil01.gat,0,0,0,0 monster Green Plant 1080,25,60000,30000,0
+yggdrasil01.gat,0,0,0,0 monster Red Plant 1078,15,60000,30000,0
diff --git a/npc/mobs/fields/amatsu.txt b/npc/mobs/fields/amatsu.txt
index 3a5b97429..8b90bf617 100644
--- a/npc/mobs/fields/amatsu.txt
+++ b/npc/mobs/fields/amatsu.txt
@@ -1,47 +1,47 @@
-//===== eAthena Script =======================================
-//= Amatsu Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 replaced Hydra -> G_Hydra (to fix drops exploit) [Lupus]
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//= Note: Please don't change spawns without official info
-//============================================================
-
-//==================================================
-// ama_fild01 - Amatsu Field
-//==================================================
-ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
-ama_fild01.gat,174,207,20,20 monster Kapha 1406,5,1200000,600000,0
-ama_fild01.gat,241,310,10,10 monster Kapha 1406,5,600000,300000,0
-ama_fild01.gat,114,230,10,10 monster Kapha 1406,5,600000,300000,0
-ama_fild01.gat,174,253,10,10 monster Kapha 1406,5,600000,300000,0
-ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,69000,34500,0
-ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,72000,39000,0
-ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,72000,39000,0
-ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,69000,34500,0
-ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,66000,33000,0
-ama_fild01.gat,175,312,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,173,312,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,312,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,174,311,0,0 monster Hydra 1068,1,63000,31500,0
-ama_fild01.gat,172,311,0,0 monster Hydra 1068,1,69000,36000,0
-ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,0,0,0,0 monster Kapha 1406,20,60000,30000,0
-ama_fild01.gat,174,306,20,20 monster Kapha 1406,10,300000,150000,0
-ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,180000,90000,0
-ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,180000,90000,0
-ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,60000,30000,0
+//===== eAthena Script =======================================
+//= Amatsu Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 replaced Hydra -> G_Hydra (to fix drops exploit) [Lupus]
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//= Note: Please don't change spawns without official info
+//============================================================
+
+//==================================================
+// ama_fild01 - Amatsu Field
+//==================================================
+ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
+ama_fild01.gat,174,207,20,20 monster Kapha 1406,5,1200000,600000,0
+ama_fild01.gat,241,310,10,10 monster Kapha 1406,5,600000,300000,0
+ama_fild01.gat,114,230,10,10 monster Kapha 1406,5,600000,300000,0
+ama_fild01.gat,174,253,10,10 monster Kapha 1406,5,600000,300000,0
+ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,69000,34500,0
+ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,72000,39000,0
+ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,72000,39000,0
+ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,69000,34500,0
+ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,66000,33000,0
+ama_fild01.gat,175,312,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,173,312,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,312,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,174,311,0,0 monster Hydra 1068,1,63000,31500,0
+ama_fild01.gat,172,311,0,0 monster Hydra 1068,1,69000,36000,0
+ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,0,0,0,0 monster Kapha 1406,20,60000,30000,0
+ama_fild01.gat,174,306,20,20 monster Kapha 1406,10,300000,150000,0
+ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,180000,90000,0
+ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,180000,90000,0
+ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,60000,30000,0
diff --git a/npc/mobs/fields/ayothaya.txt b/npc/mobs/fields/ayothaya.txt
index 324b22697..b494119f0 100644
--- a/npc/mobs/fields/ayothaya.txt
+++ b/npc/mobs/fields/ayothaya.txt
@@ -1,30 +1,30 @@
-//===== eAthena Script =======================================
-//= Ayothana Field Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= Currently using EuRO data provided by Ishizu.
-//= 1.3 Removed Choco
-//= 1.4 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// ayo_fild01 - Ayothaya Field
-//==================================================
-ayo_fild01.gat,0,0,0,0 monster Coco 1104,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Smokie 1056,30,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,3,3600000,1800000,0
-ayo_fild01.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-
-//==================================================
-// ayo_fild02 - Ayothaya Field
-//==================================================
-ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,50,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,20,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+//===== eAthena Script =======================================
+//= Ayothana Field Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= Currently using EuRO data provided by Ishizu.
+//= 1.3 Removed Choco
+//= 1.4 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// ayo_fild01 - Ayothaya Field
+//==================================================
+ayo_fild01.gat,0,0,0,0 monster Coco 1104,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Smokie 1056,30,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,3,3600000,1800000,0
+ayo_fild01.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+
+//==================================================
+// ayo_fild02 - Ayothaya Field
+//==================================================
+ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,50,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,20,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
diff --git a/npc/mobs/fields/comodo.txt b/npc/mobs/fields/comodo.txt
index 1e2f77b09..c2f7899cf 100644
--- a/npc/mobs/fields/comodo.txt
+++ b/npc/mobs/fields/comodo.txt
@@ -1,197 +1,197 @@
-//===== eAthena Script =======================================
-//= Comodo Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// cmd_fild01 - Papuchicha Forest
-//==================================================
-cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-cmd_fild01.gat,313,213,10,10 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild01.gat,313,213,10,10 monster Blue Plant 1079,1,1800000,900000,1
-cmd_fild01.gat,171,339,10,10 monster Blue Plant 1079,2,1800000,900000,1
-cmd_fild01.gat,72,78,10,10 monster Blue Plant 1079,2,1800000,900000,1
-cmd_fild01.gat,194,176,20,20 monster Blue Plant 1079,1,1800000,900000,1
-cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-
-//==================================================
-// cmd_fild02 - Kokomo Beach
-//==================================================
-cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,0,0,0
-cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
-cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,60000,0,0
-cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,180000,0,0
-cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,60000,0,0
-cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
-cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,180000,0,0
-cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
-cmd_fild02.gat,200,130,150,40 monster Seal 1317,18,0,0,0
-cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,180000,0,0
-cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
-
-//==================================================
-// cmd_fild03 - Zenhai Marsh
-//==================================================
-cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
-cmd_fild03.gat,0,0,0,0 monster Pest 1256,30,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
-cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,30,0,0,0
-cmd_fild03.gat,356,232,3,3 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild03.gat,262,289,3,3 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild03.gat,145,191,3,3 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// cmd_fild04 - Kokomo Beach
-//==================================================
-cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
-cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
-
-//==================================================
-// cmd_fild05 - Border of Papuchica Forest
-//==================================================
-cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
-cmd_fild05.gat,63,158,10,10 monster Shining Plant 1083,1,1800000,900000,1
-cmd_fild05.gat,318,277,10,10 monster Yellow Plant 1081,3,1800000,900000,1
-cmd_fild05.gat,282,49,20,20 monster Yellow Plant 1081,3,1800000,900000,1
-cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
-
-//==================================================
-// cmd_fild06 - Fortress Saint Darmain (West)
-//==================================================
-cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
-cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
-cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
-cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,0,0,0
-cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,0,0,0
-cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,0,0,0
-cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,0,0,0
-cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
-cmd_fild06.gat,293,235,5,5 monster Yellow Plant 1081,2,1800000,900000,1
-cmd_fild06.gat,84,375,10,10 monster Yellow Plant 1081,3,1800000,900000,1
-
-//==================================================
-// cmd_fild07 - Beacon Island, Pharos
-//==================================================
-cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
-cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
-cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
-cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
-cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,180000,0,0
-cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,180000,0,0
-cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,60000,0,0
-cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
-cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
-cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
-
-//==================================================
-// cmd_fild08 - Fortress Saint Darmain (East)
-//==================================================
-cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,60000,0,0
-cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,0,0,0
-cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,60000,0,0
-cmd_fild08.gat,190,115,100,80 monster Gargoyle 1253,10,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Gargoyle 1253,7,0,0,0
-cmd_fild08.gat,72,131,40,100 monster Gargoyle 1253,8,0,0,0
-cmd_fild08.gat,319,177,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,319,172,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,139,71,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,136,64,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,67,80,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,132,149,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,97,144,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,79,140,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,28,102,0,0 monster Gargoyle 1253,1,180000,0,0
-cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,30000,0,0
-cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,0,0,0
-cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,0,0,0
-cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,180000,0,0
-cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,180000,0,0
-cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
-cmd_fild08.gat,60,143,10,10 monster Yellow Plant 1081,4,1800000,900000,1
-cmd_fild08.gat,130,201,10,10 monster Yellow Plant 1081,4,1800000,900000,1
-
-//==================================================
-// cmd_fild09 - Fortress Saint Darmain (South)
-//==================================================
-cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Condor 1009,60,0,0,0
-cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,150000,0,0
-cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,150000,0,0
+//===== eAthena Script =======================================
+//= Comodo Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// cmd_fild01 - Papuchicha Forest
+//==================================================
+cmd_fild01.gat,0,0,0,0 monster Alligator 1271,60,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Savage 1166,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+cmd_fild01.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+cmd_fild01.gat,313,213,10,10 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild01.gat,313,213,10,10 monster Blue Plant 1079,1,1800000,900000,1
+cmd_fild01.gat,171,339,10,10 monster Blue Plant 1079,2,1800000,900000,1
+cmd_fild01.gat,72,78,10,10 monster Blue Plant 1079,2,1800000,900000,1
+cmd_fild01.gat,194,176,20,20 monster Blue Plant 1079,1,1800000,900000,1
+cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+
+//==================================================
+// cmd_fild02 - Kokomo Beach
+//==================================================
+cmd_fild02.gat,73,100,40,100 monster Aster 1266,5,0,0,0
+cmd_fild02.gat,200,130,150,50 monster Aster 1266,5,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Alligator 1271,10,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Raggler 1254,30,0,0,0
+cmd_fild02.gat,94,85,40,80 monster Raggler 1254,2,60000,0,0
+cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,5,180000,0,0
+cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,10,60000,0,0
+cmd_fild02.gat,0,0,0,0 monster Shellfish 1074,35,0,0,0
+cmd_fild02.gat,93,82,40,80 monster Shellfish 1074,5,180000,0,0
+cmd_fild02.gat,0,0,0,0 monster Mobster 1313,1,0,0,0
+cmd_fild02.gat,200,130,150,40 monster Seal 1317,18,0,0,0
+cmd_fild02.gat,93,82,40,80 monster Seal 1317,2,180000,0,0
+cmd_fild02.gat,0,0,0,0 monster Galapago 1391,20,0,0,0
+
+//==================================================
+// cmd_fild03 - Zenhai Marsh
+//==================================================
+cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,1800000,1
+cmd_fild03.gat,0,0,0,0 monster Pest 1256,30,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Anolian 1206,60,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
+cmd_fild03.gat,0,0,0,0 monster Rotar Zairo 1392,30,0,0,0
+cmd_fild03.gat,356,232,3,3 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild03.gat,262,289,3,3 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild03.gat,145,191,3,3 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// cmd_fild04 - Kokomo Beach
+//==================================================
+cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Alligator 1271,40,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Raggler 1254,20,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
+cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
+
+//==================================================
+// cmd_fild05 - Border of Papuchica Forest
+//==================================================
+cmd_fild05.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Anolian 1206,20,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Pest 1256,20,0,0,0
+cmd_fild05.gat,63,158,10,10 monster Shining Plant 1083,1,1800000,900000,1
+cmd_fild05.gat,318,277,10,10 monster Yellow Plant 1081,3,1800000,900000,1
+cmd_fild05.gat,282,49,20,20 monster Yellow Plant 1081,3,1800000,900000,1
+cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,900000,1
+
+//==================================================
+// cmd_fild06 - Fortress Saint Darmain (West)
+//==================================================
+cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
+cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
+cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild06.gat,284,197,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,286,289,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
+cmd_fild06.gat,244,110,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,292,169,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,284,129,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,279,199,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,277,186,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,284,186,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,354,342,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,340,334,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,305,95,70,180 monster Stem Worm 1215,30,0,0,0
+cmd_fild06.gat,102,268,10,40 monster Stem Worm 1215,3,0,0,0
+cmd_fild06.gat,359,156,30,50 monster Stem Worm 1215,1,0,0,0
+cmd_fild06.gat,360,155,30,50 monster Stem Worm 1215,1,0,0,0
+cmd_fild06.gat,357,298,80,70 monster Stem Worm 1215,20,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Harpy 1376,1,1500000,1000000,0
+cmd_fild06.gat,293,235,5,5 monster Yellow Plant 1081,2,1800000,900000,1
+cmd_fild06.gat,84,375,10,10 monster Yellow Plant 1081,3,1800000,900000,1
+
+//==================================================
+// cmd_fild07 - Beacon Island, Pharos
+//==================================================
+cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
+cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
+cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
+cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
+cmd_fild07.gat,101,176,60,90 monster Raggler 1254,1,180000,0,0
+cmd_fild07.gat,241,106,40,90 monster Raggler 1254,1,180000,0,0
+cmd_fild07.gat,204,317,60,60 monster Raggler 1254,1,60000,0,0
+cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
+cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
+cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
+
+//==================================================
+// cmd_fild08 - Fortress Saint Darmain (East)
+//==================================================
+cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,5,60000,0,0
+cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,73,132,40,100 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,5,0,0,0
+cmd_fild08.gat,157,329,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,173,168,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,178,363,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,175,367,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,53,248,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,52,238,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,2,60000,0,0
+cmd_fild08.gat,190,115,100,80 monster Gargoyle 1253,10,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Gargoyle 1253,7,0,0,0
+cmd_fild08.gat,72,131,40,100 monster Gargoyle 1253,8,0,0,0
+cmd_fild08.gat,319,177,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,319,172,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,139,71,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,136,64,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,67,80,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,132,149,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,97,144,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,79,140,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,28,102,0,0 monster Gargoyle 1253,1,180000,0,0
+cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,58,40,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,55,45,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,41,126,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,37,129,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,66,252,40,30 monster Stem Worm 1215,5,30000,0,0
+cmd_fild08.gat,130,192,110,150 monster Stem Worm 1215,10,0,0,0
+cmd_fild08.gat,70,130,40,90 monster Stem Worm 1215,2,0,0,0
+cmd_fild08.gat,189,64,30,30 monster Stem Worm 1215,3,180000,0,0
+cmd_fild08.gat,174,172,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,266,175,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,127,273,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,92,141,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,85,135,0,0 monster Stem Worm 1215,1,180000,0,0
+cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,10,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Side Winder 1037,2,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Side Winder 1037,3,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Side Winder 1037,15,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,1
+cmd_fild08.gat,60,143,10,10 monster Yellow Plant 1081,4,1800000,900000,1
+cmd_fild08.gat,130,201,10,10 monster Yellow Plant 1081,4,1800000,900000,1
+
+//==================================================
+// cmd_fild09 - Fortress Saint Darmain (South)
+//==================================================
+cmd_fild09.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Anacondaq 1030,20,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Condor 1009,60,0,0,0
+cmd_fild09.gat,142,325,40,50 monster Hode 1127,3,150000,0,0
+cmd_fild09.gat,140,323,40,50 monster Gargoyle 1253,2,150000,0,0
diff --git a/npc/mobs/fields/einbroch.txt b/npc/mobs/fields/einbroch.txt
index 9f56a0e39..7cc0fe96b 100644
--- a/npc/mobs/fields/einbroch.txt
+++ b/npc/mobs/fields/einbroch.txt
@@ -1,136 +1,136 @@
-//===== eAthena Script =======================================
-//= Einbroch Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 correct spawn maps, but not yet exact amount of
-//= monsters [Lupus]
-//= maps, marked with * are correct
-//= 1.2 Updated to correct mobs. Many thanks to vicious_pucca
-//= again for providing the information [MasterOfMuppets]
-//= 1.2a Fixed missing tabs [Lupus]
-//= 1.3 Updated after Episode 10.4 - Hugel [Poki#3]
-//= Mob quantity is custom.
-//= 1.3b Changed the spawn numbers a bit. [Poki#3]
-//= Thanks to Playtester and Emperium.org
-//= 1.4 Updated by using Tharis' Homun AI, by Tharis [Vicious]
-//= 1.5 Adjusted some spawns according to official info [Playtester]
-//============================================================
-
-//==================================================
-// ein_fild01 - Einbroch Field
-//==================================================
-ein_fild01.gat,0,0,0,0 monster Demon Pungus 1378,50,0,0,0
-ein_fild01.gat,0,0,0,0 monster Punk 1199,50,0,0,0
-
-//==================================================
-// ein_fild02 - Einbroch Field
-//==================================================
-ein_fild02.gat,0,0,0,0 monster Driller 1380,40,0,0,0
-ein_fild02.gat,0,0,0,0 monster Demon Pungus 1378,25,0,0,0
-ein_fild02.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
-
-//==================================================
-// ein_fild03 - Einbroch Field
-//==================================================
-ein_fild03.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
-ein_fild03.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
-ein_fild03.gat,0,0,0,0 monster Holden 1628,40,0,0,0
-ein_fild03.gat,153,328,100,35 monster Geographer 1368,10,0,0,0
-ein_fild03.gat,260,190,45,25 monster Geographer 1368,5,0,0,0
-ein_fild03.gat,88,143,25,70 monster Caramel 1103,10,60000,30000,1
-ein_fild03.gat,155,40,35,20 monster Horn 1128,5,60000,30000,1
-ein_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
-ein_fild03.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
-
-//==================================================
-// ein_fild04 - Einbroch Field
-//==================================================
-ein_fild04.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
-ein_fild04.gat,0,0,0,0 monster Holden 1628,5,0,0,0
-ein_fild04.gat,200,295,125,65 monster Geographer 1368,45,0,0,0
-ein_fild04.gat,125,135,40,40 monster Geographer 1368,5,0,0,0
-ein_fild04.gat,260,70,20,30 monster Geographer 1368,5,0,0,0
-ein_fild04.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-ein_fild04.gat,285,240,35,90 monster Giearth 1121,10,3600000,3000000,0
-ein_fild04.gat,106,284,60,60 monster Holden 1628,15,0,0,0
-ein_fild04.gat,106,284,60,60 monster Mineral 1614,5,3600000,3000000,0
-ein_fild04.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-ein_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
-ein_fild04.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
-
-//==================================================
-// ein_fild05 - Einbroch Field
-//==================================================
-ein_fild05.gat,0,0,0,0 monster Mineral 1614,35,0,0,0
-ein_fild05.gat,0,0,0,0 monster Obsidian 1615,20,0,0,0
-ein_fild05.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-ein_fild05.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0
-ein_fild05.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
-
-//==================================================
-// ein_fild06 - Einbroch Field
-//==================================================
-ein_fild06.gat,0,0,0,0 monster Goat 1372,55,0,0,0
-ein_fild06.gat,0,0,0,0 monster Pupa 1008,15,0,0,0
-ein_fild06.gat,0,0,0,0 monster Giearth 1121,2,3600000,3000000,0
-ein_fild06.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild06.gat,0,0,0,0 monster Black Mushroom 1084,10,120000,60000,0
-ein_fild06.gat,0,0,0,0 monster Harpy 1376,5,0,0,0
-
-//==================================================
-// ein_fild07 - Einbroch Field
-//==================================================
-ein_fild07.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-ein_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-ein_fild07.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
-ein_fild07.gat,0,0,0,0 monster Flora 1118,20,0,0,0
-ein_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-ein_fild07.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-ein_fild07.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
-
-//==================================================
-// ein_fild08 - Einbroch Field
-//==================================================
-ein_fild08.gat,0,0,0,0 monster Poring 1002,25,0,0,0
-ein_fild08.gat,0,0,0,0 monster Drops 1113,25,0,0,0
-ein_fild08.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
-ein_fild08.gat,0,0,0,0 monster Metaling 1613,25,0,0,0
-ein_fild08.gat,0,0,0,0 monster Porcellio 1619,10,0,0,0
-ein_fild08.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
-ein_fild08.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild08.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-
-//==================================================
-// ein_fild09 - Einbroch Field
-//==================================================
-ein_fild09.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
-ein_fild09.gat,0,0,0,0 monster Porcellio 1619,70,0,0,0
-ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
-ein_fild09.gat,100,260,2,2 monster Thief Bug Egg 1048,3,600000,300000,0
-ein_fild09.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
-ein_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
-ein_fild09.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
-ein_fild09.gat,260,85,50,20 monster Flora 1118,5,300000,120000,0
-
-//==================================================
-// ein_fild10 - Einbroch Field
-//==================================================
-ein_fild10.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
-ein_fild10.gat,0,0,0,0 monster Porcellio 1619,10,0,0,1
-ein_fild10.gat,152,314,130,30 monster Porcellio 1619,20,0,0,1
-ein_fild10.gat,0,0,0,0 monster Red Plant 1078,20,120000,60000,0
-ein_fild10.gat,0,0,0,0 monster Yellow Plant 1081,20,120000,60000,0
-ein_fild10.gat,0,0,0,0 monster Blue Plant 1079,20,120000,60000,0
-ein_fild10.gat,225,95,30,45 monster Yoyo 1057,6,30000,10000,0
-ein_fild10.gat,320,130,40,40 monster Yoyo 1057,4,30000,10000,0
-ein_fild10.gat,225,95,30,45 monster Flora 1118,10,300000,120000,0
-ein_fild10.gat,320,130,40,40 monster Flora 1118,10,300000,120000,0
+//===== eAthena Script =======================================
+//= Einbroch Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 correct spawn maps, but not yet exact amount of
+//= monsters [Lupus]
+//= maps, marked with * are correct
+//= 1.2 Updated to correct mobs. Many thanks to vicious_pucca
+//= again for providing the information [MasterOfMuppets]
+//= 1.2a Fixed missing tabs [Lupus]
+//= 1.3 Updated after Episode 10.4 - Hugel [Poki#3]
+//= Mob quantity is custom.
+//= 1.3b Changed the spawn numbers a bit. [Poki#3]
+//= Thanks to Playtester and Emperium.org
+//= 1.4 Updated by using Tharis' Homun AI, by Tharis [Vicious]
+//= 1.5 Adjusted some spawns according to official info [Playtester]
+//============================================================
+
+//==================================================
+// ein_fild01 - Einbroch Field
+//==================================================
+ein_fild01.gat,0,0,0,0 monster Demon Pungus 1378,50,0,0,0
+ein_fild01.gat,0,0,0,0 monster Punk 1199,50,0,0,0
+
+//==================================================
+// ein_fild02 - Einbroch Field
+//==================================================
+ein_fild02.gat,0,0,0,0 monster Driller 1380,40,0,0,0
+ein_fild02.gat,0,0,0,0 monster Demon Pungus 1378,25,0,0,0
+ein_fild02.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
+
+//==================================================
+// ein_fild03 - Einbroch Field
+//==================================================
+ein_fild03.gat,0,0,0,0 monster Metaling 1613,30,0,0,0
+ein_fild03.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+ein_fild03.gat,0,0,0,0 monster Holden 1628,40,0,0,0
+ein_fild03.gat,153,328,100,35 monster Geographer 1368,10,0,0,0
+ein_fild03.gat,260,190,45,25 monster Geographer 1368,5,0,0,0
+ein_fild03.gat,88,143,25,70 monster Caramel 1103,10,60000,30000,1
+ein_fild03.gat,155,40,35,20 monster Horn 1128,5,60000,30000,1
+ein_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
+ein_fild03.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
+
+//==================================================
+// ein_fild04 - Einbroch Field
+//==================================================
+ein_fild04.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
+ein_fild04.gat,0,0,0,0 monster Holden 1628,5,0,0,0
+ein_fild04.gat,200,295,125,65 monster Geographer 1368,45,0,0,0
+ein_fild04.gat,125,135,40,40 monster Geographer 1368,5,0,0,0
+ein_fild04.gat,260,70,20,30 monster Geographer 1368,5,0,0,0
+ein_fild04.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+ein_fild04.gat,285,240,35,90 monster Giearth 1121,10,3600000,3000000,0
+ein_fild04.gat,106,284,60,60 monster Holden 1628,15,0,0,0
+ein_fild04.gat,106,284,60,60 monster Mineral 1614,5,3600000,3000000,0
+ein_fild04.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+ein_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
+ein_fild04.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+
+//==================================================
+// ein_fild05 - Einbroch Field
+//==================================================
+ein_fild05.gat,0,0,0,0 monster Mineral 1614,35,0,0,0
+ein_fild05.gat,0,0,0,0 monster Obsidian 1615,20,0,0,0
+ein_fild05.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+ein_fild05.gat,0,0,0,0 monster Demon Pungus 1378,20,0,0,0
+ein_fild05.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+
+//==================================================
+// ein_fild06 - Einbroch Field
+//==================================================
+ein_fild06.gat,0,0,0,0 monster Goat 1372,55,0,0,0
+ein_fild06.gat,0,0,0,0 monster Pupa 1008,15,0,0,0
+ein_fild06.gat,0,0,0,0 monster Giearth 1121,2,3600000,3000000,0
+ein_fild06.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild06.gat,0,0,0,0 monster Black Mushroom 1084,10,120000,60000,0
+ein_fild06.gat,0,0,0,0 monster Harpy 1376,5,0,0,0
+
+//==================================================
+// ein_fild07 - Einbroch Field
+//==================================================
+ein_fild07.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+ein_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+ein_fild07.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
+ein_fild07.gat,0,0,0,0 monster Flora 1118,20,0,0,0
+ein_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+ein_fild07.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+ein_fild07.gat,0,0,0,0 monster Ungoliant 1618,1,86400000,86000000,0
+
+//==================================================
+// ein_fild08 - Einbroch Field
+//==================================================
+ein_fild08.gat,0,0,0,0 monster Poring 1002,25,0,0,0
+ein_fild08.gat,0,0,0,0 monster Drops 1113,25,0,0,0
+ein_fild08.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
+ein_fild08.gat,0,0,0,0 monster Metaling 1613,25,0,0,0
+ein_fild08.gat,0,0,0,0 monster Porcellio 1619,10,0,0,0
+ein_fild08.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
+ein_fild08.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild08.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+
+//==================================================
+// ein_fild09 - Einbroch Field
+//==================================================
+ein_fild09.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
+ein_fild09.gat,0,0,0,0 monster Porcellio 1619,70,0,0,0
+ein_fild09.gat,0,0,0,0 monster Thief Bug 1051,20,0,0,0
+ein_fild09.gat,100,260,2,2 monster Thief Bug Egg 1048,3,600000,300000,0
+ein_fild09.gat,0,0,0,0 monster Red Plant 1078,10,120000,60000,0
+ein_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,120000,60000,0
+ein_fild09.gat,0,0,0,0 monster Red Mushroom 1085,10,120000,60000,0
+ein_fild09.gat,260,85,50,20 monster Flora 1118,5,300000,120000,0
+
+//==================================================
+// ein_fild10 - Einbroch Field
+//==================================================
+ein_fild10.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+ein_fild10.gat,0,0,0,0 monster Porcellio 1619,10,0,0,1
+ein_fild10.gat,152,314,130,30 monster Porcellio 1619,20,0,0,1
+ein_fild10.gat,0,0,0,0 monster Red Plant 1078,20,120000,60000,0
+ein_fild10.gat,0,0,0,0 monster Yellow Plant 1081,20,120000,60000,0
+ein_fild10.gat,0,0,0,0 monster Blue Plant 1079,20,120000,60000,0
+ein_fild10.gat,225,95,30,45 monster Yoyo 1057,6,30000,10000,0
+ein_fild10.gat,320,130,40,40 monster Yoyo 1057,4,30000,10000,0
+ein_fild10.gat,225,95,30,45 monster Flora 1118,10,300000,120000,0
+ein_fild10.gat,320,130,40,40 monster Flora 1118,10,300000,120000,0
diff --git a/npc/mobs/fields/geffen.txt b/npc/mobs/fields/geffen.txt
index d81a96666..3889987c4 100644
--- a/npc/mobs/fields/geffen.txt
+++ b/npc/mobs/fields/geffen.txt
@@ -1,227 +1,227 @@
-//===== eAthena Script =======================================
-//= Geffen Field Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Map names typos fix [Lupus]
-//= 1.3 Official kRO 10.1 spawns + future changes [Playtester]
-//============================================================
-
-//==================================================
-// gef_fild00 - Geffen Field
-//==================================================
-gef_fild00.gat,0,0,0,0 monster Poring 1002,50,0,0,0
-gef_fild00.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
-gef_fild00.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-gef_fild00.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
-gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
-
-//==================================================
-// gef_fild01 - Geffen Field
-//==================================================
-gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,50,0,0,0
-gef_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild01.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
-gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
-
-//==================================================
-// gef_fild02 - Geffen Field
-//==================================================
-gef_fild02.gat,0,0,0,0 monster Yoyo 1057,10,0,0,0
-gef_fild02.gat,0,0,0,0 monster Orc Warrior 1023,40,0,0,0
-gef_fild02.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-gef_fild02.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
-gef_fild02.gat,0,0,0,0 monster Choco 1214,1,0,0,0
-gef_fild02.gat,227,316,6,6 monster Green Plant 1080,8,360000,180000,1
-gef_fild02.gat,87,48,6,6 monster Red Mushroom 1085,5,360000,180000,1
-gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,360000,180000,1
-gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
-gef_fild02.gat,220,214,1,1 monster Blue Plant 1079,1,360000,180000,1
-gef_fild02.gat,164,194,1,1 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// gef_fild03 - Geffen Field
-//==================================================
-gef_fild03.gat,0,0,0,0 monster Orc Warrior 1023,30,0,0,0
-gef_fild03.gat,0,0,0,0 monster High Orc 1213,10,0,0,0
-gef_fild03.gat,0,0,0,0 monster Savage 1166,30,0,0,0
-gef_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild03.gat,45,350,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,66,300,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,80,252,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,118,281,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,135,344,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,210,363,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,215,345,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,359,316,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,350,247,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,304,202,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,285,223,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,282,192,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,316,143,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,337,104,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,348,42,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,326,79,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,280,92,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,216,135,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,169,92,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,45,93,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// gef_fild04 - Geffen Field
-//==================================================
-gef_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-gef_fild04.gat,0,0,0,0 monster Chonchon 1011,30,0,0,0
-gef_fild04.gat,0,0,0,0 monster Pupa 1008,60,0,0,0
-gef_fild04.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
-gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,20,0,0,0
-gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
-gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
-
-//==================================================
-// gef_fild05 - Geffen Field
-//==================================================
-gef_fild05.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-gef_fild05.gat,0,0,0,0 monster Kobold Archer 1282,10,0,0,0
-gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,0,0,0
-gef_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
-gef_fild05.gat,235,322,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,238,326,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,170,337,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,108,317,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,56,285,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,65,256,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,74,228,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,50,189,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,51,166,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,146,161,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,153,180,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,124,207,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,187,249,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,187,265,0,0 monster Red Plant 1078,1,180000,90000,1
-gef_fild05.gat,130,293,0,0 monster Red Plant 1078,1,180000,90000,1
-
-//==================================================
-// gef_fild06 - Geffen Field
-//==================================================
-gef_fild06.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 1134,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 1135,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Petite 1156,50,0,0,0
-gef_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
-
-//==================================================
-// gef_fild07 - Geffen Field
-//==================================================
-gef_fild07.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-gef_fild07.gat,0,0,0,0 monster Chonchon 1011,30,0,0,0
-gef_fild07.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-gef_fild07.gat,0,0,0,0 monster Fabre 1007,60,0,0,0
-gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
-gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
-gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
-
-//==================================================
-// gef_fild08 - Geffen Field
-//==================================================
-gef_fild08.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 1134,40,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 1135,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Golem 1040,40,0,0,0
-gef_fild08.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-gef_fild08.gat,65,341,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,111,319,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,59,91,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,70,80,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,144,140,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,344,78,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,325,311,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild08.gat,162,247,0,0 monster Blue Plant 1079,1,900000,450000,1
-
-//==================================================
-// gef_fild09 - Geffen Field
-//==================================================
-gef_fild09.gat,0,0,0,0 monster Ambernite 1094,60,0,0,0
-gef_fild09.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,10,0,0,0
-gef_fild09.gat,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,125,53,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,148,74,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,184,66,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,207,54,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,245,62,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,268,45,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,258,24,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,325,36,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,344,51,0,0 monster Red Mushroom 1085,1,180000,90000,1
-gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,1
-
-//==================================================
-// gef_fild10 - Geffen Field
-//==================================================
-gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
-gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
-gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,70,0,0,0
-gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild10.gat,0,0,0,0 monster Orc Baby 1686,5,120000,0,0
-gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
-
-//==================================================
-// gef_fild11 - Geffen Field
-//==================================================
-gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,1800000,1200000,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1122,30,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1123,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1124,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1125,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1126,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild11.gat,0,0,0,0 monster Rotar Zairo 1392,10,0,0,0
-gef_fild11.gat,101,277,4,1 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,176,288,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,253,357,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,247,249,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,257,209,1,4 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,174,240,1,3 monster Black Mushroom 1084,3,360000,180000,1
-gef_fild11.gat,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
-
-//==================================================
-// gef_fild12 - Kordt Forest
-//==================================================
-gef_fild12.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 1134,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 1135,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold Archer 1282,40,0,0,0
-gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,1800000,1200000,0
-
-//==================================================
-// gef_fild13 - Britoniah
-//==================================================
-gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild13.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
-gef_fild13.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
-
-//==================================================
-// gef_fild14 - West Orc Village
-//==================================================
-gef_fild14.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,1800000,1
-gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Archer 1189,30,0,0,0
-gef_fild14.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
+//===== eAthena Script =======================================
+//= Geffen Field Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Map names typos fix [Lupus]
+//= 1.3 Official kRO 10.1 spawns + future changes [Playtester]
+//============================================================
+
+//==================================================
+// gef_fild00 - Geffen Field
+//==================================================
+gef_fild00.gat,0,0,0,0 monster Poring 1002,50,0,0,0
+gef_fild00.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
+gef_fild00.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+gef_fild00.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
+gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
+
+//==================================================
+// gef_fild01 - Geffen Field
+//==================================================
+gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,50,0,0,0
+gef_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild01.gat,0,0,0,0 monster Toad 1089,1,3600000,1800000,1
+gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
+
+//==================================================
+// gef_fild02 - Geffen Field
+//==================================================
+gef_fild02.gat,0,0,0,0 monster Yoyo 1057,10,0,0,0
+gef_fild02.gat,0,0,0,0 monster Orc Warrior 1023,40,0,0,0
+gef_fild02.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+gef_fild02.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
+gef_fild02.gat,0,0,0,0 monster Choco 1214,1,0,0,0
+gef_fild02.gat,227,316,6,6 monster Green Plant 1080,8,360000,180000,1
+gef_fild02.gat,87,48,6,6 monster Red Mushroom 1085,5,360000,180000,1
+gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,360000,180000,1
+gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
+gef_fild02.gat,220,214,1,1 monster Blue Plant 1079,1,360000,180000,1
+gef_fild02.gat,164,194,1,1 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// gef_fild03 - Geffen Field
+//==================================================
+gef_fild03.gat,0,0,0,0 monster Orc Warrior 1023,30,0,0,0
+gef_fild03.gat,0,0,0,0 monster High Orc 1213,10,0,0,0
+gef_fild03.gat,0,0,0,0 monster Savage 1166,30,0,0,0
+gef_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild03.gat,45,350,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,66,300,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,80,252,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,118,281,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,135,344,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,210,363,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,215,345,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,359,316,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,350,247,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,304,202,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,285,223,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,282,192,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,316,143,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,337,104,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,348,42,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,326,79,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,280,92,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,216,135,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,169,92,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,45,93,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// gef_fild04 - Geffen Field
+//==================================================
+gef_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+gef_fild04.gat,0,0,0,0 monster Chonchon 1011,30,0,0,0
+gef_fild04.gat,0,0,0,0 monster Pupa 1008,60,0,0,0
+gef_fild04.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
+gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,20,0,0,0
+gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
+gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
+
+//==================================================
+// gef_fild05 - Geffen Field
+//==================================================
+gef_fild05.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+gef_fild05.gat,0,0,0,0 monster Kobold Archer 1282,10,0,0,0
+gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,0,0,0
+gef_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
+gef_fild05.gat,235,322,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,238,326,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,170,337,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,108,317,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,56,285,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,65,256,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,74,228,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,50,189,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,51,166,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,146,161,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,153,180,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,124,207,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,187,249,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,187,265,0,0 monster Red Plant 1078,1,180000,90000,1
+gef_fild05.gat,130,293,0,0 monster Red Plant 1078,1,180000,90000,1
+
+//==================================================
+// gef_fild06 - Geffen Field
+//==================================================
+gef_fild06.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 1134,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 1135,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Petite 1156,50,0,0,0
+gef_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
+
+//==================================================
+// gef_fild07 - Geffen Field
+//==================================================
+gef_fild07.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+gef_fild07.gat,0,0,0,0 monster Chonchon 1011,30,0,0,0
+gef_fild07.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+gef_fild07.gat,0,0,0,0 monster Fabre 1007,60,0,0,0
+gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
+gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
+gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
+
+//==================================================
+// gef_fild08 - Geffen Field
+//==================================================
+gef_fild08.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 1134,40,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 1135,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Golem 1040,40,0,0,0
+gef_fild08.gat,0,0,0,0 monster Steel Chonchon 1042,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+gef_fild08.gat,65,341,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,111,319,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,59,91,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,70,80,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,144,140,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,344,78,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,325,311,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild08.gat,162,247,0,0 monster Blue Plant 1079,1,900000,450000,1
+
+//==================================================
+// gef_fild09 - Geffen Field
+//==================================================
+gef_fild09.gat,0,0,0,0 monster Ambernite 1094,60,0,0,0
+gef_fild09.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,10,0,0,0
+gef_fild09.gat,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,125,53,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,148,74,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,184,66,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,207,54,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,245,62,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,268,45,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,258,24,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,325,36,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,344,51,0,0 monster Red Mushroom 1085,1,180000,90000,1
+gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,1
+
+//==================================================
+// gef_fild10 - Geffen Field
+//==================================================
+gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
+gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
+gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,70,0,0,0
+gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild10.gat,0,0,0,0 monster Orc Baby 1686,5,120000,0,0
+gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
+
+//==================================================
+// gef_fild11 - Geffen Field
+//==================================================
+gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,1800000,1200000,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1122,30,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1123,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1124,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1125,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1126,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin Archer 1258,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild11.gat,0,0,0,0 monster Rotar Zairo 1392,10,0,0,0
+gef_fild11.gat,101,277,4,1 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,176,288,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,253,357,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,247,249,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,257,209,1,4 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,174,240,1,3 monster Black Mushroom 1084,3,360000,180000,1
+gef_fild11.gat,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
+
+//==================================================
+// gef_fild12 - Kordt Forest
+//==================================================
+gef_fild12.gat,0,0,0,0 monster Kobold 1133,20,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 1134,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 1135,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold Archer 1282,40,0,0,0
+gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,1800000,1200000,0
+
+//==================================================
+// gef_fild13 - Britoniah
+//==================================================
+gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild13.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
+gef_fild13.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
+
+//==================================================
+// gef_fild14 - West Orc Village
+//==================================================
+gef_fild14.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,1800000,1
+gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Archer 1189,30,0,0,0
+gef_fild14.gat,0,0,0,0 monster High Orc 1213,40,0,0,0
diff --git a/npc/mobs/fields/gonryun.txt b/npc/mobs/fields/gonryun.txt
index 3ccbfbe14..50f4fdce4 100644
--- a/npc/mobs/fields/gonryun.txt
+++ b/npc/mobs/fields/gonryun.txt
@@ -1,22 +1,22 @@
-//===== eAthena Script =======================================
-//= Gon Ryun Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// gon_fild01 - Gonryun Field
-//==================================================
-gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,600000,300000,0
-gon_fild01.gat,0,0,0,0 monster Zipper Bear 1417,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Dumpling Child 1409,30,0,0,0
-gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,630000,330000,0
-gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,0
-gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,0
+//===== eAthena Script =======================================
+//= Gon Ryun Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// gon_fild01 - Gonryun Field
+//==================================================
+gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,600000,300000,0
+gon_fild01.gat,0,0,0,0 monster Zipper Bear 1417,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Dumpling Child 1409,30,0,0,0
+gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,630000,330000,0
+gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,0
+gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,0
diff --git a/npc/mobs/fields/hugel.txt b/npc/mobs/fields/hugel.txt
index 23300f71d..6889e8de3 100644
--- a/npc/mobs/fields/hugel.txt
+++ b/npc/mobs/fields/hugel.txt
@@ -1,125 +1,125 @@
-//===== eAthena Script =======================================
-//= Hugel Field Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= Spawns for hu_fild05 and hu_fild04, numbers may not be correct [MasterOfMuppets]
-//= 0.2 Fixed Petit ID
-//= 0.3 Updated the spawns using kRO's website as info, [MasterOfMuppets]
-//= thanks to battousai90
-//= 0.4 Updated after Episode 10.4 - Hugel [Poki#3]
-//= Mob quantity is custom.
-//= 1.0 Updated by using Tharis' Homun AI, by Tharis [Vicious]
-//= 1.1 Official X.3 spawns [Playtester]
-//============================================================
-
-//==================================================
-// hu_fild01 - Hugel Field
-//==================================================
-hu_fild01.gat,0,0,0,0 monster Breeze 1692,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1697,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1695,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1696,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1694,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Plasma 1693,5,900000,300000,0
-hu_fild01.gat,0,0,0,0 monster Geographer 1368,30,300000,0,0
-hu_fild01.gat,0,0,0,0 monster Demon Pungus 1378,30,1200000,600000,0
-
-//==================================================
-// hu_fild02 - Hugel Field
-//==================================================
-hu_fild02.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-hu_fild02.gat,0,0,0,0 monster Rafflesia 1162,35,0,0,0
-hu_fild02.gat,0,0,0,0 monster Savage Babe 1167,21,0,0,0
-hu_fild02.gat,0,0,0,0 monster Metaling 1613,21,0,0,0
-hu_fild02.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild02.gat,0,0,0,0 monster Demon Pungus 1378,5,0,0,0
-hu_fild02.gat,0,0,0,0 monster Novus 1715,2,0,0,0
-hu_fild02.gat,0,0,0,0 monster Novus 1718,2,0,0,0
-
-//==================================================
-// hu_fild03 - Hugel Field
-//==================================================
-hu_fild03.gat,0,0,0,0 monster Metaling 1613,80,0,0,0
-hu_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-hu_fild03.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild03.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-hu_fild03.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
-hu_fild03.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
-
-//==================================================
-// hu_fild04 - Hugel Field
-//==================================================
-hu_fild04.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Deleter 1384,40,0,0,0
-hu_fild04.gat,0,0,0,0 monster Deleter 1385,30,0,0,0
-hu_fild04.gat,0,0,0,0 monster Novus 1715,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Novus 1718,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Anopheles 1627,50,0,0,0
-hu_fild04.gat,0,0,0,0 monster Grove 1687,20,0,0,0
-hu_fild04.gat,60,149,35,122 monster Sleeper 1386,7,600000,300000,0
-hu_fild04.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-hu_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-hu_fild04.gat,206,210,30,18 monster Blue Plant 1079,4,120000,600000,0
-hu_fild04.gat,206,120,10,10 monster Blue Plant 1079,2,120000,600000,0
-
-//==================================================
-// hu_fild05 - Hugel Field
-//==================================================
-hu_fild05.gat,112,272,62,82 monster Grove 1687,15,0,0,0
-hu_fild05.gat,112,272,62,82 monster Novus 1715,3,0,0,0
-hu_fild05.gat,112,272,62,82 monster Novus 1718,3,0,0,0
-hu_fild05.gat,112,272,62,82 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,112,272,62,82 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,276,302,93,60 monster Grove 1687,15,0,0,0
-hu_fild05.gat,276,302,93,60 monster Novus 1715,3,0,0,0
-hu_fild05.gat,276,302,93,60 monster Novus 1718,3,0,0,0
-hu_fild05.gat,276,302,93,60 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,276,302,93,60 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
-hu_fild05.gat,286,144,82,90 monster Novus 1715,3,0,0,0
-hu_fild05.gat,286,144,82,90 monster Novus 1718,3,0,0,0
-hu_fild05.gat,286,144,82,90 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,286,144,82,90 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
-hu_fild05.gat,118,106,80,70 monster Novus 1715,3,0,0,0
-hu_fild05.gat,118,106,80,70 monster Novus 1718,3,0,0,0
-hu_fild05.gat,118,106,80,70 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,118,106,80,70 monster Mutant Dragonoid 1262,1,24000000,1800000,0
-hu_fild05.gat,0,0,0,0 monster Anopheles 1627,10,0,0,0
-hu_fild05.gat,0,0,0,0 monster Dragon Egg 1721,2,3600000,1800000,0
-hu_fild05.gat,196,196,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
-hu_fild05.gat,340,50,10,10 monster Dragon Egg 1721,1,3600000,1800000,0
-hu_fild05.gat,280,350,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
-
-//==================================================
-// hu_fild06 - Hugel Field
-//==================================================
-hu_fild06.gat,0,0,0,0 monster Holden 1628,50,0,0,0
-hu_fild06.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
-hu_fild06.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
-hu_fild06.gat,0,0,0,0 monster Female Thief Bug 1053,3,0,0,0
-hu_fild06.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-hu_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// hu_fild07 - Hugel Field
-//==================================================
-hu_fild07.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Petite 1155,40,0,0,0
-hu_fild07.gat,0,0,0,0 monster Petite 1156,40,0,0,0
-hu_fild07.gat,0,0,0,0 monster Novus 1715,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Novus 1718,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
-hu_fild07.gat,0,0,0,0 monster Grove 1687,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-hu_fild07.gat,0,0,0,0 monster Demon Pungus 1378,10,0,0,0
-hu_fild07.gat,0,0,0,0 monster Yellow Plant 1081,20,0,0,0
+//===== eAthena Script =======================================
+//= Hugel Field Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= Spawns for hu_fild05 and hu_fild04, numbers may not be correct [MasterOfMuppets]
+//= 0.2 Fixed Petit ID
+//= 0.3 Updated the spawns using kRO's website as info, [MasterOfMuppets]
+//= thanks to battousai90
+//= 0.4 Updated after Episode 10.4 - Hugel [Poki#3]
+//= Mob quantity is custom.
+//= 1.0 Updated by using Tharis' Homun AI, by Tharis [Vicious]
+//= 1.1 Official X.3 spawns [Playtester]
+//============================================================
+
+//==================================================
+// hu_fild01 - Hugel Field
+//==================================================
+hu_fild01.gat,0,0,0,0 monster Breeze 1692,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1697,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1695,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1696,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1694,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Plasma 1693,5,900000,300000,0
+hu_fild01.gat,0,0,0,0 monster Geographer 1368,30,300000,0,0
+hu_fild01.gat,0,0,0,0 monster Demon Pungus 1378,30,1200000,600000,0
+
+//==================================================
+// hu_fild02 - Hugel Field
+//==================================================
+hu_fild02.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+hu_fild02.gat,0,0,0,0 monster Rafflesia 1162,35,0,0,0
+hu_fild02.gat,0,0,0,0 monster Savage Babe 1167,21,0,0,0
+hu_fild02.gat,0,0,0,0 monster Metaling 1613,21,0,0,0
+hu_fild02.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Geographer 1368,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild02.gat,0,0,0,0 monster Demon Pungus 1378,5,0,0,0
+hu_fild02.gat,0,0,0,0 monster Novus 1715,2,0,0,0
+hu_fild02.gat,0,0,0,0 monster Novus 1718,2,0,0,0
+
+//==================================================
+// hu_fild03 - Hugel Field
+//==================================================
+hu_fild03.gat,0,0,0,0 monster Metaling 1613,80,0,0,0
+hu_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+hu_fild03.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild03.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+hu_fild03.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
+hu_fild03.gat,0,0,0,0 monster Black Mushroom 1084,10,180000,90000,1
+
+//==================================================
+// hu_fild04 - Hugel Field
+//==================================================
+hu_fild04.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Deleter 1384,40,0,0,0
+hu_fild04.gat,0,0,0,0 monster Deleter 1385,30,0,0,0
+hu_fild04.gat,0,0,0,0 monster Novus 1715,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Novus 1718,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Anopheles 1627,50,0,0,0
+hu_fild04.gat,0,0,0,0 monster Grove 1687,20,0,0,0
+hu_fild04.gat,60,149,35,122 monster Sleeper 1386,7,600000,300000,0
+hu_fild04.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+hu_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+hu_fild04.gat,206,210,30,18 monster Blue Plant 1079,4,120000,600000,0
+hu_fild04.gat,206,120,10,10 monster Blue Plant 1079,2,120000,600000,0
+
+//==================================================
+// hu_fild05 - Hugel Field
+//==================================================
+hu_fild05.gat,112,272,62,82 monster Grove 1687,15,0,0,0
+hu_fild05.gat,112,272,62,82 monster Novus 1715,3,0,0,0
+hu_fild05.gat,112,272,62,82 monster Novus 1718,3,0,0,0
+hu_fild05.gat,112,272,62,82 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,112,272,62,82 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,276,302,93,60 monster Grove 1687,15,0,0,0
+hu_fild05.gat,276,302,93,60 monster Novus 1715,3,0,0,0
+hu_fild05.gat,276,302,93,60 monster Novus 1718,3,0,0,0
+hu_fild05.gat,276,302,93,60 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,276,302,93,60 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
+hu_fild05.gat,286,144,82,90 monster Novus 1715,3,0,0,0
+hu_fild05.gat,286,144,82,90 monster Novus 1718,3,0,0,0
+hu_fild05.gat,286,144,82,90 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,286,144,82,90 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,286,144,82,90 monster Grove 1687,15,0,0,0
+hu_fild05.gat,118,106,80,70 monster Novus 1715,3,0,0,0
+hu_fild05.gat,118,106,80,70 monster Novus 1718,3,0,0,0
+hu_fild05.gat,118,106,80,70 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,118,106,80,70 monster Mutant Dragonoid 1262,1,24000000,1800000,0
+hu_fild05.gat,0,0,0,0 monster Anopheles 1627,10,0,0,0
+hu_fild05.gat,0,0,0,0 monster Dragon Egg 1721,2,3600000,1800000,0
+hu_fild05.gat,196,196,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
+hu_fild05.gat,340,50,10,10 monster Dragon Egg 1721,1,3600000,1800000,0
+hu_fild05.gat,280,350,5,5 monster Dragon Egg 1721,1,3600000,1800000,0
+
+//==================================================
+// hu_fild06 - Hugel Field
+//==================================================
+hu_fild06.gat,0,0,0,0 monster Holden 1628,50,0,0,0
+hu_fild06.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
+hu_fild06.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Metaling 1613,10,0,0,0
+hu_fild06.gat,0,0,0,0 monster Female Thief Bug 1053,3,0,0,0
+hu_fild06.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+hu_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// hu_fild07 - Hugel Field
+//==================================================
+hu_fild07.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Petite 1155,40,0,0,0
+hu_fild07.gat,0,0,0,0 monster Petite 1156,40,0,0,0
+hu_fild07.gat,0,0,0,0 monster Novus 1715,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Novus 1718,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Anopheles 1627,30,0,0,0
+hu_fild07.gat,0,0,0,0 monster Grove 1687,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+hu_fild07.gat,0,0,0,0 monster Demon Pungus 1378,10,0,0,0
+hu_fild07.gat,0,0,0,0 monster Yellow Plant 1081,20,0,0,0
diff --git a/npc/mobs/fields/jawaii.txt b/npc/mobs/fields/jawaii.txt
index f7fa27875..719a19184 100644
--- a/npc/mobs/fields/jawaii.txt
+++ b/npc/mobs/fields/jawaii.txt
@@ -1,29 +1,29 @@
-//===== eAthena Script =======================================
-//= Jawaii the honeymoon Island Monster Spawn Script
-//===== By: ==================================================
-//= MasterOfMuppets (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 First version [MasterOfMuppets]
-//============================================================
-
-//==================================================
-// jawaii - Jawaii, the Honeymoon Island
-//==================================================
-jawaii.gat,207,290,10,10 monster Phen 1158,3,3600000,1800000,0
-jawaii.gat,221,220,30,30 monster Aster 1266,2,3600000,2400000,0
-jawaii.gat,276,163,20,20 monster Aster 1266,1,7200000,3600000,0
-jawaii.gat,221,220,30,30 monster Shellfish 1074,1,4800000,3000000,0
-jawaii.gat,276,163,20,30 monster Shellfish 1074,2,4200000,2400000,0
-
-//==================================================
-// jawaii_in - Inside Jawaii
-//==================================================
-jawaii_in.gat,128,121,1,4 monster Red Mushroom 1085,1,3000000,1200000,0
-jawaii_in.gat,124,76,1,1 monster Black Mushroom 1084,1,3600000,1200000,0
-jawaii_in.gat,72,74,5,1 monster Black Mushroom 1084,2,3000000,1200000,0
-jawaii_in.gat,73,117,4,4 monster Thief Bug 1051,1,5400000,3000000,0
-jawaii_in.gat,83,117,5,5 monster Thief Bug 1051,1,4800000,2400000,0
+//===== eAthena Script =======================================
+//= Jawaii the honeymoon Island Monster Spawn Script
+//===== By: ==================================================
+//= MasterOfMuppets (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 First version [MasterOfMuppets]
+//============================================================
+
+//==================================================
+// jawaii - Jawaii, the Honeymoon Island
+//==================================================
+jawaii.gat,207,290,10,10 monster Phen 1158,3,3600000,1800000,0
+jawaii.gat,221,220,30,30 monster Aster 1266,2,3600000,2400000,0
+jawaii.gat,276,163,20,20 monster Aster 1266,1,7200000,3600000,0
+jawaii.gat,221,220,30,30 monster Shellfish 1074,1,4800000,3000000,0
+jawaii.gat,276,163,20,30 monster Shellfish 1074,2,4200000,2400000,0
+
+//==================================================
+// jawaii_in - Inside Jawaii
+//==================================================
+jawaii_in.gat,128,121,1,4 monster Red Mushroom 1085,1,3000000,1200000,0
+jawaii_in.gat,124,76,1,1 monster Black Mushroom 1084,1,3600000,1200000,0
+jawaii_in.gat,72,74,5,1 monster Black Mushroom 1084,2,3000000,1200000,0
+jawaii_in.gat,73,117,4,4 monster Thief Bug 1051,1,5400000,3000000,0
+jawaii_in.gat,83,117,5,5 monster Thief Bug 1051,1,4800000,2400000,0
diff --git a/npc/mobs/fields/lighthalzen.txt b/npc/mobs/fields/lighthalzen.txt
index f5413e995..bdab6aa23 100644
--- a/npc/mobs/fields/lighthalzen.txt
+++ b/npc/mobs/fields/lighthalzen.txt
@@ -1,51 +1,51 @@
-//===== eAthena Script =======================================
-//= Lighthalzen Fields - Monster Spawn Locations
-//===== By: ==================================================
-//= Muad_Dib (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 by Muad_Dib (Prometheus Project)
-//= 1.1 Added Porcellio by MasterOfMuppets
-//= 1.2 Corrected monsters. Many thanks to vicious_pucca for
-//= the information [MasterOfMuppets]
-//= 1.3 Updated acordingly to Episode 10.4 [Poki#3]
-//= 1.4 Fully updated X.4 spawns [Playtester]
-//============================================================
-
-//==================================================
-// lhz_fild01 - Lighthalzen Field
-//==================================================
-lhz_fild01.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Holden 1628,60,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
-lhz_fild01.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-lhz_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
-lhz_fild01.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
-
-//==================================================
-// lhz_fild02 - Lighthalzen Field (Grim Ripper's Valley)
-//==================================================
-lhz_fild02.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Horn 1128,10,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Holden 1628,10,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Anopheles 1627,15,0,0,0
-lhz_fild02.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
-lhz_fild02.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
-
-//==================================================
-// lhz_fild03 - Lighthalzen Field
-//==================================================
-lhz_fild03.gat,262,233,74,140 monster Stem Worm 1215,50,0,0,0
-lhz_fild03.gat,262,233,74,140 monster Metaling 1613,20,0,0,0
-lhz_fild03.gat,262,233,74,140 monster Hill Wind 1680,2,0,0,1
-lhz_fild03.gat,127,248,45,140 monster Caramel 1103,20,0,0,0
-lhz_fild03.gat,127,248,45,140 monster Horn 1128,10,0,0,0
-lhz_fild03.gat,127,248,45,140 monster Rafflesia 1162,5,0,0,0
-lhz_fild03.gat,0,0,0,0 monster Anopheles 1627,20,0,0,1
-lhz_fild03.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,1
-lhz_fild03.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
-lhz_fild03.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+//===== eAthena Script =======================================
+//= Lighthalzen Fields - Monster Spawn Locations
+//===== By: ==================================================
+//= Muad_Dib (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 by Muad_Dib (Prometheus Project)
+//= 1.1 Added Porcellio by MasterOfMuppets
+//= 1.2 Corrected monsters. Many thanks to vicious_pucca for
+//= the information [MasterOfMuppets]
+//= 1.3 Updated acordingly to Episode 10.4 [Poki#3]
+//= 1.4 Fully updated X.4 spawns [Playtester]
+//============================================================
+
+//==================================================
+// lhz_fild01 - Lighthalzen Field
+//==================================================
+lhz_fild01.gat,0,0,0,0 monster Metaling 1613,60,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Holden 1628,60,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Caramel 1103,20,0,0,0
+lhz_fild01.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+lhz_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,60000,30000,0
+lhz_fild01.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
+
+//==================================================
+// lhz_fild02 - Lighthalzen Field (Grim Ripper's Valley)
+//==================================================
+lhz_fild02.gat,0,0,0,0 monster Metaling 1613,50,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Horn 1128,10,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Holden 1628,10,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Anopheles 1627,15,0,0,0
+lhz_fild02.gat,0,0,0,0 monster Yellow Plant 1081,15,60000,30000,0
+lhz_fild02.gat,0,0,0,0 monster Green Plant 1080,15,60000,30000,0
+
+//==================================================
+// lhz_fild03 - Lighthalzen Field
+//==================================================
+lhz_fild03.gat,262,233,74,140 monster Stem Worm 1215,50,0,0,0
+lhz_fild03.gat,262,233,74,140 monster Metaling 1613,20,0,0,0
+lhz_fild03.gat,262,233,74,140 monster Hill Wind 1680,2,0,0,1
+lhz_fild03.gat,127,248,45,140 monster Caramel 1103,20,0,0,0
+lhz_fild03.gat,127,248,45,140 monster Horn 1128,10,0,0,0
+lhz_fild03.gat,127,248,45,140 monster Rafflesia 1162,5,0,0,0
+lhz_fild03.gat,0,0,0,0 monster Anopheles 1627,20,0,0,1
+lhz_fild03.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,1
+lhz_fild03.gat,0,0,0,0 monster Red Plant 1078,10,60000,30000,0
+lhz_fild03.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,0
diff --git a/npc/mobs/fields/louyang.txt b/npc/mobs/fields/louyang.txt
index 528e8b69e..885dcfca3 100644
--- a/npc/mobs/fields/louyang.txt
+++ b/npc/mobs/fields/louyang.txt
@@ -1,33 +1,33 @@
-//===== eAthena Script =======================================
-//= Louyang Fields Monster Spawn Script
-//===== By: ==================================================
-//= Evera/Lorri
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 updated by MasterOfMuppets
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// lou_fild01 - Louyang Field
-//==================================================
-lou_fild01.gat,224,315,100,50 monster Bigfoot 1060,7,0,0,0
-lou_fild01.gat,203,225,110,35 monster Bigfoot 1060,4,60000,30000,1
-lou_fild01.gat,273,128,75,50 monster Bigfoot 1060,4,0,0,0
-lou_fild01.gat,224,315,100,50 monster Caramel 1103,7,0,0,0
-lou_fild01.gat,203,225,110,35 monster Caramel 1103,7,0,0,0
-lou_fild01.gat,273,128,75,50 monster Caramel 1103,7,0,0,0
-lou_fild01.gat,224,315,100,50 monster Mantis 1139,10,0,0,0
-lou_fild01.gat,203,225,110,35 monster Mantis 1139,10,0,0,0
-lou_fild01.gat,273,128,75,50 monster Mantis 1139,10,0,0,0
-lou_fild01.gat,224,315,100,50 monster Mi Gao 1516,8,0,0,0
-lou_fild01.gat,203,225,110,35 monster Mi Gao 1516,15,60000,30000,1
-lou_fild01.gat,273,128,75,500 monster Mi Gao 1516,7,0,0,0
-lou_fild01.gat,224,315,100,50 monster Anacondaq 1030,2,0,0,0
-lou_fild01.gat,203,225,110,35 monster Anacondaq 1030,1,0,0,0
-lou_fild01.gat,273,128,75,50 monster Anacondaq 1030,2,0,0,0
-lou_fild01.gat,0,0,0,0 monster Black Mushroom 1084,5,0,0,0
-lou_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+//===== eAthena Script =======================================
+//= Louyang Fields Monster Spawn Script
+//===== By: ==================================================
+//= Evera/Lorri
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 updated by MasterOfMuppets
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// lou_fild01 - Louyang Field
+//==================================================
+lou_fild01.gat,224,315,100,50 monster Bigfoot 1060,7,0,0,0
+lou_fild01.gat,203,225,110,35 monster Bigfoot 1060,4,60000,30000,1
+lou_fild01.gat,273,128,75,50 monster Bigfoot 1060,4,0,0,0
+lou_fild01.gat,224,315,100,50 monster Caramel 1103,7,0,0,0
+lou_fild01.gat,203,225,110,35 monster Caramel 1103,7,0,0,0
+lou_fild01.gat,273,128,75,50 monster Caramel 1103,7,0,0,0
+lou_fild01.gat,224,315,100,50 monster Mantis 1139,10,0,0,0
+lou_fild01.gat,203,225,110,35 monster Mantis 1139,10,0,0,0
+lou_fild01.gat,273,128,75,50 monster Mantis 1139,10,0,0,0
+lou_fild01.gat,224,315,100,50 monster Mi Gao 1516,8,0,0,0
+lou_fild01.gat,203,225,110,35 monster Mi Gao 1516,15,60000,30000,1
+lou_fild01.gat,273,128,75,500 monster Mi Gao 1516,7,0,0,0
+lou_fild01.gat,224,315,100,50 monster Anacondaq 1030,2,0,0,0
+lou_fild01.gat,203,225,110,35 monster Anacondaq 1030,1,0,0,0
+lou_fild01.gat,273,128,75,50 monster Anacondaq 1030,2,0,0,0
+lou_fild01.gat,0,0,0,0 monster Black Mushroom 1084,5,0,0,0
+lou_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
diff --git a/npc/mobs/fields/lutie.txt b/npc/mobs/fields/lutie.txt
index 82eec548b..2a7a064de 100644
--- a/npc/mobs/fields/lutie.txt
+++ b/npc/mobs/fields/lutie.txt
@@ -1,20 +1,20 @@
-//===== eAthena Script =======================================
-//= Lutie Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 added Garm Baby according to May 10 patch
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// xmas_fild01 - Lutie Field
-//==================================================
-xmas_fild01.gat,0,0,0,0 monster Marin 1242,35,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Sasquatch 1243,20,0,0,0
-xmas_fild01.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
-xmas_fild01.gat,0,0,0,0 monster Garm 1252,1,7200000,3600000,1
+//===== eAthena Script =======================================
+//= Lutie Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 added Garm Baby according to May 10 patch
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// xmas_fild01 - Lutie Field
+//==================================================
+xmas_fild01.gat,0,0,0,0 monster Marin 1242,35,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Sasquatch 1243,20,0,0,0
+xmas_fild01.gat,0,0,0,0 monster Garm Baby 1515,1,1800000,0,0
+xmas_fild01.gat,0,0,0,0 monster Garm 1252,1,7200000,3600000,1
diff --git a/npc/mobs/fields/mjolnir.txt b/npc/mobs/fields/mjolnir.txt
index eb7918218..390f11a90 100644
--- a/npc/mobs/fields/mjolnir.txt
+++ b/npc/mobs/fields/mjolnir.txt
@@ -1,250 +1,250 @@
-//===== eAthena Script =======================================
-//= Mt. Mjolnir Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// mjolnir_01 - Mt.Mjolnir
-//==================================================
-mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Coco 1104,70,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
-mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
-mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
-
-//==================================================
-// mjolnir_02 - Mt.Mjolnir
-//==================================================
-mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Petite 1155,50,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Flora 1118,30,0,0,0
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
-
-//==================================================
-// mjolnir_03 - Mt.Mjolnir
-//==================================================
-mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Petite 1156,70,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Flora 1118,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// mjolnir_04 - Mt.Mjolnir
-//==================================================
-mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
-mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// mjolnir_05 - Mt.Mjolnir
-//==================================================
-mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-
-//==================================================
-// mjolnir_06 - Mt.Mjolnir
-//==================================================
-mjolnir_06.gat,0,0,0,0 monster Stainer 1174,70,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
-mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//==================================================
-// mjolnir_07 - Mt.Mjolnir
-//==================================================
-mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
-mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
-
-//==================================================
-// mjolnir_08 - Mt.Mjolnir
-//==================================================
-mjolnir_08.gat,0,0,0,0 monster Mantis 1139,60,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Argos 1100,20,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
-mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// mjolnir_09 - Mt.Mjolnir
-//==================================================
-mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Horn 1128,70,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Wolf 1013,30,0,0,0
-mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//==================================================
-// mjolnir_10 - Mt.Mjolnir
-//==================================================
-mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Flora 1118,30,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Argos 1100,60,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Petite 1155,10,0,0,0
-mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
-mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-
-//==================================================
-// mjolnir_11 - Mt.Mjolnir
-//==================================================
-mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
-mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// mjolnir_12 - Mt.Mjolnir
-//==================================================
-mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
+//===== eAthena Script =======================================
+//= Mt. Mjolnir Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// mjolnir_01 - Mt.Mjolnir
+//==================================================
+mjolnir_01.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Coco 1104,70,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Caramel 1103,40,0,0,0
+mjolnir_01.gat,75,85,25,25 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_01.gat,78,219,25,25 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_01.gat,75,85,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,78,219,25,25 monster Green Plant 1080,5,180000,90000,1
+mjolnir_01.gat,311,271,25,25 monster Blue Plant 1079,5,360000,180000,1
+
+//==================================================
+// mjolnir_02 - Mt.Mjolnir
+//==================================================
+mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Creamy 1018,20,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Petite 1155,50,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Flora 1118,30,0,0,0
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,80,211,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,270,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,86,180,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,107,128,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,79,49,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,133,80,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,191,71,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,237,55,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,292,49,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,349,45,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,282,101,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,318,205,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,275,199,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,335,301,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,312,342,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,257,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,204,263,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,193,304,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,145,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,156,254,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,112,268,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,167,160,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,325,146,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,223,110,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_02.gat,254,155,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,243,208,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,273,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,289,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_02.gat,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
+
+//==================================================
+// mjolnir_03 - Mt.Mjolnir
+//==================================================
+mjolnir_03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Petite 1156,70,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Flora 1118,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+mjolnir_03.gat,211,216,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_03.gat,280,252,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_03.gat,135,94,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,199,97,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,262,98,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,322,144,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,356,213,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,352,288,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,324,355,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,255,349,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,168,341,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,77,271,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,66,219,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,91,161,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// mjolnir_04 - Mt.Mjolnir
+//==================================================
+mjolnir_04.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Hornet 1004,70,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Mistress 1059,1,7200000,3600000,1
+mjolnir_04.gat,200,200,30,30 monster Shining Plant 1083,3,1800000,900000,1
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,122,28,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,72,99,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,177,34,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,43,143,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,31,194,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,42,252,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,64,323,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,107,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,173,369,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,286,357,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,356,292,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,362,201,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,332,122,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,269,39,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_04.gat,205,33,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// mjolnir_05 - Mt.Mjolnir
+//==================================================
+mjolnir_05.gat,0,0,0,0 monster Mantis 1139,40,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Flora 1118,20,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Argiope 1099,70,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+mjolnir_05.gat,200,240,40,40 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,200,240,40,40 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_05.gat,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,261,100,20,10 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+
+//==================================================
+// mjolnir_06 - Mt.Mjolnir
+//==================================================
+mjolnir_06.gat,0,0,0,0 monster Stainer 1174,70,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Caramel 1103,30,0,0,0
+mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,304,98,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,279,174,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,339,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,296,317,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,45,345,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,73,339,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,69,225,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_06.gat,55,276,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//==================================================
+// mjolnir_07 - Mt.Mjolnir
+//==================================================
+mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Coco 1104,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Horn 1128,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
+mjolnir_07.gat,314,133,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,272,152,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,273,181,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,181,173,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,140,179,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,97,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,360000,180000,1
+
+//==================================================
+// mjolnir_08 - Mt.Mjolnir
+//==================================================
+mjolnir_08.gat,0,0,0,0 monster Mantis 1139,60,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Argos 1100,20,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+mjolnir_08.gat,280,280,20,40 monster Blue Plant 1079,2,360000,180000,1
+mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,176,153,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,169,204,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,180,282,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,149,328,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// mjolnir_09 - Mt.Mjolnir
+//==================================================
+mjolnir_09.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Horn 1128,70,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Wolf 1013,30,0,0,0
+mjolnir_09.gat,205,352,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,199,344,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,210,331,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,204,321,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,212,312,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,198,297,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,73,122,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,89,141,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,120,126,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,139,84,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_09.gat,125,82,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//==================================================
+// mjolnir_10 - Mt.Mjolnir
+//==================================================
+mjolnir_10.gat,0,0,0,0 monster Mantis 1139,20,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Flora 1118,30,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Argos 1100,60,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Petite 1155,10,0,0,0
+mjolnir_10.gat,123,331,10,10 monster Shining Plant 1083,1,1800000,900000,1
+mjolnir_10.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+
+//==================================================
+// mjolnir_11 - Mt.Mjolnir
+//==================================================
+mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Mandragora 1020,50,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Flora 1118,60,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Thief Bug Male 1054,30,0,0,0
+mjolnir_11.gat,112,276,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,159,283,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,116,240,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,146,215,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,145,177,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,129,135,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_11.gat,197,123,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,198,210,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,231,277,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_11.gat,282,300,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_11.gat,295,271,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// mjolnir_12 - Mt.Mjolnir
+//==================================================
+mjolnir_12.gat,0,0,0,0 monster Stem Worm 1215,20,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Thief Bug Female 1053,20,0,0,0
diff --git a/npc/mobs/fields/morocc.txt b/npc/mobs/fields/morocc.txt
index d81c3b821..578831d3a 100644
--- a/npc/mobs/fields/morocc.txt
+++ b/npc/mobs/fields/morocc.txt
@@ -1,294 +1,294 @@
-//===== eAthena Script =======================================
-//= Morocc Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// moc_fild01 - Sograt Desert
-//==================================================
-moc_fild01.gat,0,0,0,0 monster Baby Desert Wolf 1107,70,0,0,0
-moc_fild01.gat,0,0,0,0 monster Ant Egg 1097,20,0,0,0
-moc_fild01.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
-moc_fild01.gat,0,0,0,0 monster Picky 1049,10,0,0,0
-moc_fild01.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-moc_fild01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
-moc_fild01.gat,194,51,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-//==================================================
-// moc_fild02 - Sograt Desert
-//==================================================
-moc_fild02.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
-moc_fild02.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild02.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
-moc_fild02.gat,0,0,0,0 monster Picky 1049,10,0,0,0
-moc_fild02.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-moc_fild02.gat,89,315,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,99,261,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,94,195,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,139,222,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,132,307,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,194,294,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,275,241,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild02.gat,342,267,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,313,149,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,230,62,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,299,61,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,353,103,0,0 monster Green Plant 1080,1,180000,90000,1
-moc_fild02.gat,337,35,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//==================================================
-// moc_fild03 - Sograt Desert
-//==================================================
-moc_fild03.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
-moc_fild03.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
-moc_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-moc_fild03.gat,0,0,0,0 monster Eggyra 1116,10,0,0,0
-moc_fild03.gat,0,0,0,0 monster Willow 1010,20,0,0,0
-moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,1800000,1200000,0
-moc_fild03.gat,77,311,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,108,199,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,96,65,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,216,69,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,261,161,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,213,201,5,5 monster Green Plant 1080,2,180000,90000,1
-moc_fild03.gat,200,263,5,5 monster Green Plant 1080,2,180000,90000,1
-
-//==================================================
-// moc_fild04 - Sograt Desert
-//==================================================
-moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Scorpion 1001,30,0,0,0
-moc_fild04.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Magnolia 1138,40,0,0,0
-moc_fild04.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild04.gat,0,0,0,0 monster Andre 1095,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Piere 1160,20,0,0,0
-moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-//==================================================
-// moc_fild05 - Sograt Desert
-//==================================================
-moc_fild05.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
-moc_fild05.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
-moc_fild05.gat,0,0,0,0 monster Golem 1040,70,0,0,0
-moc_fild05.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
-moc_fild05.gat,0,0,0,0 monster Piere 1160,10,0,0,0
-moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
-
-//==================================================
-// moc_fild06 - Sograt Desert
-//==================================================
-moc_fild06.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
-moc_fild06.gat,0,0,0,0 monster Muka 1055,30,0,0,0
-moc_fild06.gat,0,0,0,0 monster Condor 1009,50,0,0,0
-moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
-moc_fild06.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild06.gat,193,203,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-//==================================================
-// moc_fild07 - Sograt Desert
-//==================================================
-moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
-moc_fild07.gat,0,0,0,0 monster Peco Peco Egg 1047,50,0,0,0
-moc_fild07.gat,0,0,0,0 monster Picky 1050,30,0,0,0
-moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
-moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
-
-//==================================================
-// moc_fild08 - Sograt Desert
-//==================================================
-moc_fild08.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Scorpion 1001,80,0,0,0
-moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Anacondaq 1030,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Baby Desert Wolf 1107,10,0,0,0
-moc_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-
-//==================================================
-// moc_fild09 - Sograt Desert
-//==================================================
-moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Metaller 1058,70,0,0,0
-moc_fild09.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
-moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
-moc_fild09.gat,332,341,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,240,313,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,305,62,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
-moc_fild09.gat,54,325,5,5 monster Yellow Plant 1081,2,180000,90000,1
-
-//==================================================
-// moc_fild10 - Sograt Desert
-//==================================================
-moc_fild10.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-moc_fild10.gat,0,0,0,0 monster Peco Peco Egg 1047,70,0,0,0
-moc_fild10.gat,0,0,0,0 monster Picky 1049,50,0,0,0
-moc_fild10.gat,0,0,0,0 monster Picky 1050,50,0,0,0
-moc_fild10.gat,0,0,0,0 monster Magnolia 1138,1,0,0,0
-moc_fild10.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild10.gat,198,150,40,30 monster Yellow Plant 1081,10,180000,90000,1
-moc_fild10.gat,198,150,40,30 monster Green Plant 1080,5,180000,90000,1
-
-//==================================================
-// moc_fild11 - Sograt Desert
-//==================================================
-moc_fild11.gat,0,0,0,0 monster Hode 1127,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Golem 1040,70,0,0,0
-moc_fild11.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Piere 1160,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
-moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
-moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// moc_fild12 - Sograt Desert
-//==================================================
-moc_fild12.gat,0,0,0,0 monster Picky 1050,50,0,0,0
-moc_fild12.gat,0,0,0,0 monster Picky 1049,50,0,0,0
-moc_fild12.gat,0,0,0,0 monster Peco Peco Egg 1047,35,0,0,0
-moc_fild12.gat,0,0,0,0 monster Drops 1113,35,0,0,0
-moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// moc_fild13 - Sograt Desert
-//==================================================
-moc_fild13.gat,0,0,0,0 monster Desert Wolf 1106,30,0,0,0
-moc_fild13.gat,0,0,0,0 monster Anacondaq 1030,70,0,0,0
-moc_fild13.gat,0,0,0,0 monster Boa 1025,25,0,0,0
-moc_fild13.gat,0,0,0,0 monster Side Winder 1037,35,0,0,0
-moc_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-moc_fild13.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-moc_fild13.gat,280,99,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,264,64,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,305,91,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,264,136,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,282,155,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,265,197,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,284,227,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,304,244,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,266,289,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,281,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,304,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,295,358,0,0 monster Red Mushroom 1085,1,180000,90000,1
-moc_fild13.gat,84,329,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,89,92,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,108,150,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,109,168,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
-
-//==================================================
-// moc_fild14 - Sograt Desert
-//==================================================
-moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
-moc_fild14.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
-moc_fild14.gat,0,0,0,0 monster Baby Desert Wolf 1107,40,0,0,0
-moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild14.gat,124,93,5,5 monster Shining Plant 1083,1,1800000,900000,1
-moc_fild14.gat,85,271,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,165,282,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,149,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,64,342,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild14.gat,160,366,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-//==================================================
-// moc_fild15 - Sograt Desert
-//==================================================
-moc_fild15.gat,0,0,0,0 monster Hode 1127,30,0,0,0
-moc_fild15.gat,0,0,0,0 monster Scorpion 1001,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild15.gat,0,0,0,0 monster Andre 1095,40,0,0,0
-moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild15.gat,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,1
-moc_fild15.gat,40,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,57,39,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,46,250,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,104,347,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,195,373,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,341,365,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,353,230,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,341,164,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,370,85,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,158,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,232,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild15.gat,294,74,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-//==================================================
-// moc_fild16 - Sograt Desert
-//==================================================
-moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,0,0,0
-moc_fild16.gat,0,0,0,0 monster Hode 1127,30,0,0,0
-moc_fild16.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild16.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild16.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild16.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-
-//==================================================
-// moc_fild17 - Sograt Desert
-//==================================================
-moc_fild17.gat,0,0,0,0 monster Hode 1127,50,0,0,0
-moc_fild17.gat,0,0,0,0 monster Steel Chonchon 1042,40,0,0,0
-moc_fild17.gat,0,0,0,0 monster Magnolia 1138,15,0,0,0
-moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
-moc_fild17.gat,0,0,0,0 monster Andre 1095,10,0,0,0
-moc_fild17.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
-moc_fild17.gat,0,0,0,0 monster Piere 1160,20,0,0,0
-moc_fild17.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild17.gat,0,0,0,0 monster Scorpion 1001,5,0,0,0
-moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
-moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,180000,90000,1
-moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
-
-//==================================================
-// moc_fild18 - Sograt Desert
-//==================================================
-moc_fild18.gat,0,0,0,0 monster Steel Chonchon 1042,70,0,0,0
-moc_fild18.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
-moc_fild18.gat,0,0,0,0 monster Muka 1055,40,0,0,0
-moc_fild18.gat,0,0,0,0 monster Metaller 1058,10,0,0,0
-moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild18.gat,0,0,0,0 monster Andre 1095,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Piere 1160,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Ant Egg 1097,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Dragon Fly 1091,1,3600000,1800000,1
-moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,7200000,3600000,1
-moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,180000,90000,1
+//===== eAthena Script =======================================
+//= Morocc Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// moc_fild01 - Sograt Desert
+//==================================================
+moc_fild01.gat,0,0,0,0 monster Baby Desert Wolf 1107,70,0,0,0
+moc_fild01.gat,0,0,0,0 monster Ant Egg 1097,20,0,0,0
+moc_fild01.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
+moc_fild01.gat,0,0,0,0 monster Picky 1049,10,0,0,0
+moc_fild01.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+moc_fild01.gat,0,0,0,0 monster Poring 1002,10,0,0,0
+moc_fild01.gat,194,51,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+//==================================================
+// moc_fild02 - Sograt Desert
+//==================================================
+moc_fild02.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
+moc_fild02.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild02.gat,0,0,0,0 monster Peco Peco Egg 1047,40,0,0,0
+moc_fild02.gat,0,0,0,0 monster Picky 1049,10,0,0,0
+moc_fild02.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+moc_fild02.gat,89,315,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,99,261,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,94,195,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,139,222,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,132,307,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,194,294,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,275,241,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild02.gat,342,267,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,313,149,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,230,62,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,299,61,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,353,103,0,0 monster Green Plant 1080,1,180000,90000,1
+moc_fild02.gat,337,35,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//==================================================
+// moc_fild03 - Sograt Desert
+//==================================================
+moc_fild03.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
+moc_fild03.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
+moc_fild03.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+moc_fild03.gat,0,0,0,0 monster Eggyra 1116,10,0,0,0
+moc_fild03.gat,0,0,0,0 monster Willow 1010,20,0,0,0
+moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,1800000,1200000,0
+moc_fild03.gat,77,311,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,108,199,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,96,65,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,216,69,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,261,161,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,213,201,5,5 monster Green Plant 1080,2,180000,90000,1
+moc_fild03.gat,200,263,5,5 monster Green Plant 1080,2,180000,90000,1
+
+//==================================================
+// moc_fild04 - Sograt Desert
+//==================================================
+moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Scorpion 1001,30,0,0,0
+moc_fild04.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Magnolia 1138,40,0,0,0
+moc_fild04.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild04.gat,0,0,0,0 monster Andre 1095,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Piere 1160,20,0,0,0
+moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+//==================================================
+// moc_fild05 - Sograt Desert
+//==================================================
+moc_fild05.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
+moc_fild05.gat,0,0,0,0 monster Metaller 1058,20,0,0,0
+moc_fild05.gat,0,0,0,0 monster Golem 1040,70,0,0,0
+moc_fild05.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
+moc_fild05.gat,0,0,0,0 monster Piere 1160,10,0,0,0
+moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
+
+//==================================================
+// moc_fild06 - Sograt Desert
+//==================================================
+moc_fild06.gat,0,0,0,0 monster Peco Peco 1019,70,0,0,0
+moc_fild06.gat,0,0,0,0 monster Muka 1055,30,0,0,0
+moc_fild06.gat,0,0,0,0 monster Condor 1009,50,0,0,0
+moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,0,0,0
+moc_fild06.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild06.gat,193,203,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+//==================================================
+// moc_fild07 - Sograt Desert
+//==================================================
+moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
+moc_fild07.gat,0,0,0,0 monster Peco Peco Egg 1047,50,0,0,0
+moc_fild07.gat,0,0,0,0 monster Picky 1050,30,0,0,0
+moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
+moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
+
+//==================================================
+// moc_fild08 - Sograt Desert
+//==================================================
+moc_fild08.gat,0,0,0,0 monster Magnolia 1138,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Scorpion 1001,80,0,0,0
+moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Anacondaq 1030,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Baby Desert Wolf 1107,10,0,0,0
+moc_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+
+//==================================================
+// moc_fild09 - Sograt Desert
+//==================================================
+moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Metaller 1058,70,0,0,0
+moc_fild09.gat,0,0,0,0 monster Magnolia 1138,50,0,0,0
+moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
+moc_fild09.gat,332,341,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,240,313,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,305,62,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
+moc_fild09.gat,54,325,5,5 monster Yellow Plant 1081,2,180000,90000,1
+
+//==================================================
+// moc_fild10 - Sograt Desert
+//==================================================
+moc_fild10.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+moc_fild10.gat,0,0,0,0 monster Peco Peco Egg 1047,70,0,0,0
+moc_fild10.gat,0,0,0,0 monster Picky 1049,50,0,0,0
+moc_fild10.gat,0,0,0,0 monster Picky 1050,50,0,0,0
+moc_fild10.gat,0,0,0,0 monster Magnolia 1138,1,0,0,0
+moc_fild10.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild10.gat,198,150,40,30 monster Yellow Plant 1081,10,180000,90000,1
+moc_fild10.gat,198,150,40,30 monster Green Plant 1080,5,180000,90000,1
+
+//==================================================
+// moc_fild11 - Sograt Desert
+//==================================================
+moc_fild11.gat,0,0,0,0 monster Hode 1127,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Golem 1040,70,0,0,0
+moc_fild11.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Deniro 1105,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Piere 1160,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
+moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
+moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// moc_fild12 - Sograt Desert
+//==================================================
+moc_fild12.gat,0,0,0,0 monster Picky 1050,50,0,0,0
+moc_fild12.gat,0,0,0,0 monster Picky 1049,50,0,0,0
+moc_fild12.gat,0,0,0,0 monster Peco Peco Egg 1047,35,0,0,0
+moc_fild12.gat,0,0,0,0 monster Drops 1113,35,0,0,0
+moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// moc_fild13 - Sograt Desert
+//==================================================
+moc_fild13.gat,0,0,0,0 monster Desert Wolf 1106,30,0,0,0
+moc_fild13.gat,0,0,0,0 monster Anacondaq 1030,70,0,0,0
+moc_fild13.gat,0,0,0,0 monster Boa 1025,25,0,0,0
+moc_fild13.gat,0,0,0,0 monster Side Winder 1037,35,0,0,0
+moc_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+moc_fild13.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+moc_fild13.gat,280,99,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,264,64,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,305,91,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,264,136,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,282,155,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,265,197,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,284,227,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,304,244,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,266,289,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,281,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,304,333,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,295,358,0,0 monster Red Mushroom 1085,1,180000,90000,1
+moc_fild13.gat,84,329,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,89,92,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,108,150,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,109,168,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
+
+//==================================================
+// moc_fild14 - Sograt Desert
+//==================================================
+moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
+moc_fild14.gat,0,0,0,0 monster Side Winder 1037,20,0,0,0
+moc_fild14.gat,0,0,0,0 monster Baby Desert Wolf 1107,40,0,0,0
+moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild14.gat,124,93,5,5 monster Shining Plant 1083,1,1800000,900000,1
+moc_fild14.gat,85,271,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,165,282,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,149,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,64,342,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild14.gat,160,366,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+//==================================================
+// moc_fild15 - Sograt Desert
+//==================================================
+moc_fild15.gat,0,0,0,0 monster Hode 1127,30,0,0,0
+moc_fild15.gat,0,0,0,0 monster Scorpion 1001,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Desert Wolf 1106,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild15.gat,0,0,0,0 monster Andre 1095,40,0,0,0
+moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild15.gat,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,1
+moc_fild15.gat,40,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,57,39,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,46,250,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,104,347,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,195,373,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,341,365,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,353,230,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,341,164,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,370,85,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,158,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,232,126,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild15.gat,294,74,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+//==================================================
+// moc_fild16 - Sograt Desert
+//==================================================
+moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,0,0,0
+moc_fild16.gat,0,0,0,0 monster Hode 1127,30,0,0,0
+moc_fild16.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild16.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild16.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild16.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+
+//==================================================
+// moc_fild17 - Sograt Desert
+//==================================================
+moc_fild17.gat,0,0,0,0 monster Hode 1127,50,0,0,0
+moc_fild17.gat,0,0,0,0 monster Steel Chonchon 1042,40,0,0,0
+moc_fild17.gat,0,0,0,0 monster Magnolia 1138,15,0,0,0
+moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,0,0,0
+moc_fild17.gat,0,0,0,0 monster Andre 1095,10,0,0,0
+moc_fild17.gat,0,0,0,0 monster Deniro 1105,20,0,0,0
+moc_fild17.gat,0,0,0,0 monster Piere 1160,20,0,0,0
+moc_fild17.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild17.gat,0,0,0,0 monster Scorpion 1001,5,0,0,0
+moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
+moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,180000,90000,1
+moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,180000,90000,1
+
+//==================================================
+// moc_fild18 - Sograt Desert
+//==================================================
+moc_fild18.gat,0,0,0,0 monster Steel Chonchon 1042,70,0,0,0
+moc_fild18.gat,0,0,0,0 monster Chonchon 1011,40,0,0,0
+moc_fild18.gat,0,0,0,0 monster Muka 1055,40,0,0,0
+moc_fild18.gat,0,0,0,0 monster Metaller 1058,10,0,0,0
+moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild18.gat,0,0,0,0 monster Andre 1095,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Deniro 1105,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Piere 1160,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Ant Egg 1097,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Dragon Fly 1091,1,3600000,1800000,1
+moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,7200000,3600000,1
+moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,180000,90000,1
diff --git a/npc/mobs/fields/niflheim.txt b/npc/mobs/fields/niflheim.txt
index 6498980e7..347f4ca51 100644
--- a/npc/mobs/fields/niflheim.txt
+++ b/npc/mobs/fields/niflheim.txt
@@ -1,196 +1,196 @@
-//===== eAthena Script =======================================
-//= Niflheim Temporary Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 updated [shadow],
-//= 1.3 many changes and wrong LOD ID 5373 -> 1373 [Lupus]
-//= 1.4 removed yggdrasil from this file [DracoRPG]
-//= 1.4a Readded Lord of Death, why was it removed anyway? [MasterOfMuppets]
-//= 1.5 Implemented the town invasion. [MasterOfMuppets]
-//= 1.6 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// nif_fild01 - Skellington, a Solitary Village in Niflheim
-//==================================================
-nif_fild01.gat,0,0,0,0 monster Disguise 1506,20,0,0,0
-nif_fild01.gat,0,0,0,0 monster Disguise 1506,30,300000,120000,0
-nif_fild01.gat,227,253,20,20 monster Dullahan 1504,7,1800000,1200000,0
-nif_fild01.gat,0,0,0,0 monster Dullahan 1504,13,0,0,0
-nif_fild01.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-nif_fild01.gat,0,0,0,0 monster Heirozoist 1510,10,0,0,0
-nif_fild01.gat,0,0,0,0 monster Quve 1508,30,0,0,0
-
-//==================================================
-// nif_fild02 - Valley of Gyoll
-//==================================================
-nif_fild02.gat,366,236,15,15 monster Lude 1509,10,360000,150000,0
-nif_fild02.gat,356,139,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,144,232,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,118,282,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,62,327,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
-nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,7,0,0,0
-nif_fild02.gat,114,136,15,15 monster Loli Ruri 1505,2,1200000,600000,0
-nif_fild02.gat,52,115,10,10 monster Heirozoist 1510,4,1200000,600000,0
-nif_fild02.gat,84,276,15,15 monster Gibbet 1503,5,1200000,600000,0
-nif_fild02.gat,352,273,15,15 monster Gibbet 1503,5,300000,150000,0
-nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,19,120000,60000,0
-nif_fild02.gat,352,273,15,15 monster Dullahan 1504,5,600000,300000,0
-nif_fild02.gat,0,0,0,0 monster Dullahan 1504,5,0,0,0
-nif_fild02.gat,0,0,0,0 monster Heirozoist 1510,6,0,0,0
-nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-
-//==================================================
-// niflheim - Niflheim, Realm of the Dead
-//==================================================
-niflheim.gat,0,0,0,0 monster Dullahan 1504,5,1800000,1200000,0
-niflheim.gat,0,0,0,0 monster Gibbet 1503,10,1200000,600000,0
-niflheim.gat,0,0,0,0 monster Heirozoist 1510,10,1200000,600000,0
-niflheim.gat,0,0,0,0 monster Quve 1508,20,300000,150000,0
-niflheim.gat,0,0,0,0 monster Lude 1509,20,300000,150000,0
-
-niflheim.gat,1,1,0 script NifInvasion -1,{
-OnInit:
-
- while(1)
- {
- initnpctimer;
- end;
-
-OnTimer7980000:
- stopnpctimer;
- switch(rand(6))
- {
-
- case 0:
- monster "niflheim.gat",327,193,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",330,193,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",324,193,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",327,196,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",327,190,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",324,190,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",330,190,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",324,196,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",330,196,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 1:
- monster "niflheim.gat",337,252,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",337,255,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",337,249,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",334,252,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",340,252,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",334,249,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",340,255,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",340,249,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",334,255,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 2:
- monster "niflheim.gat",190,185,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",190,188,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",190,182,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",193,185,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",187,185,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",187,182,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",193,182,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",193,188,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",187,188,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 3:
- monster "niflheim.gat",131,138,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",131,141,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",131,135,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",128,138,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",134,138,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",134,141,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",128,141,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",134,135,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",128,135,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 4:
- monster "niflheim.gat",311,64,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",311,67,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",311,61,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",308,64,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",314,64,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",314,61,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",314,67,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",308,67,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",308,61,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 5:
- monster "niflheim.gat",238,131,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",238,134,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",238,128,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",235,131,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",241,131,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",235,128,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",235,134,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",241,128,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",241,134,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- case 6:
- monster "niflheim.gat",86,219,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
- monster "niflheim.gat",86,222,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",86,216,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",89,219,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",83,219,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",89,222,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",89,216,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",83,222,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",83,216,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
- break;
-
- }
- monster "niflheim.gat",154,95,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",115,65,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",330,195,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",151,83,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",285,245,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",235,135,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",265,48,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",186,139,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",166,267,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",82,202,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",219,44,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",287,44,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",275,165,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",138,204,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",299,39,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",31,154,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",154,96,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",116,65,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",151,84,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",286,245,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",330,196,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",236,135,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",165,49,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",167,267,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",82,203,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",220,44,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",287,45,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",287,44,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",276,166,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",139,205,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",300,39,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- monster "niflheim.gat",31,155,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
- end;
-
-OnInvasionMonsters:
- end;
-
-OnLoDDead:
- killmonster "niflheim.gat","NifInvasion::OnInvasionMonsters";
- }
-
-}
+//===== eAthena Script =======================================
+//= Niflheim Temporary Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 updated [shadow],
+//= 1.3 many changes and wrong LOD ID 5373 -> 1373 [Lupus]
+//= 1.4 removed yggdrasil from this file [DracoRPG]
+//= 1.4a Readded Lord of Death, why was it removed anyway? [MasterOfMuppets]
+//= 1.5 Implemented the town invasion. [MasterOfMuppets]
+//= 1.6 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// nif_fild01 - Skellington, a Solitary Village in Niflheim
+//==================================================
+nif_fild01.gat,0,0,0,0 monster Disguise 1506,20,0,0,0
+nif_fild01.gat,0,0,0,0 monster Disguise 1506,30,300000,120000,0
+nif_fild01.gat,227,253,20,20 monster Dullahan 1504,7,1800000,1200000,0
+nif_fild01.gat,0,0,0,0 monster Dullahan 1504,13,0,0,0
+nif_fild01.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+nif_fild01.gat,0,0,0,0 monster Heirozoist 1510,10,0,0,0
+nif_fild01.gat,0,0,0,0 monster Quve 1508,30,0,0,0
+
+//==================================================
+// nif_fild02 - Valley of Gyoll
+//==================================================
+nif_fild02.gat,366,236,15,15 monster Lude 1509,10,360000,150000,0
+nif_fild02.gat,356,139,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,144,232,10,10 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,118,282,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,62,327,15,15 monster Bloody Murderer 1507,1,1200000,600000,0
+nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,7,0,0,0
+nif_fild02.gat,114,136,15,15 monster Loli Ruri 1505,2,1200000,600000,0
+nif_fild02.gat,52,115,10,10 monster Heirozoist 1510,4,1200000,600000,0
+nif_fild02.gat,84,276,15,15 monster Gibbet 1503,5,1200000,600000,0
+nif_fild02.gat,352,273,15,15 monster Gibbet 1503,5,300000,150000,0
+nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,19,120000,60000,0
+nif_fild02.gat,352,273,15,15 monster Dullahan 1504,5,600000,300000,0
+nif_fild02.gat,0,0,0,0 monster Dullahan 1504,5,0,0,0
+nif_fild02.gat,0,0,0,0 monster Heirozoist 1510,6,0,0,0
+nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+
+//==================================================
+// niflheim - Niflheim, Realm of the Dead
+//==================================================
+niflheim.gat,0,0,0,0 monster Dullahan 1504,5,1800000,1200000,0
+niflheim.gat,0,0,0,0 monster Gibbet 1503,10,1200000,600000,0
+niflheim.gat,0,0,0,0 monster Heirozoist 1510,10,1200000,600000,0
+niflheim.gat,0,0,0,0 monster Quve 1508,20,300000,150000,0
+niflheim.gat,0,0,0,0 monster Lude 1509,20,300000,150000,0
+
+niflheim.gat,1,1,0 script NifInvasion -1,{
+OnInit:
+
+ while(1)
+ {
+ initnpctimer;
+ end;
+
+OnTimer7980000:
+ stopnpctimer;
+ switch(rand(6))
+ {
+
+ case 0:
+ monster "niflheim.gat",327,193,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",330,193,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",324,193,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",327,196,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",327,190,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",324,190,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",330,190,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",324,196,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",330,196,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 1:
+ monster "niflheim.gat",337,252,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",337,255,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",337,249,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",334,252,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",340,252,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",334,249,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",340,255,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",340,249,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",334,255,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 2:
+ monster "niflheim.gat",190,185,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",190,188,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",190,182,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",193,185,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",187,185,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",187,182,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",193,182,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",193,188,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",187,188,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 3:
+ monster "niflheim.gat",131,138,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",131,141,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",131,135,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",128,138,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",134,138,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",134,141,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",128,141,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",134,135,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",128,135,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 4:
+ monster "niflheim.gat",311,64,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",311,67,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",311,61,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",308,64,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",314,64,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",314,61,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",314,67,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",308,67,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",308,61,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 5:
+ monster "niflheim.gat",238,131,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",238,134,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",238,128,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",235,131,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",241,131,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",235,128,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",235,134,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",241,128,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",241,134,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ case 6:
+ monster "niflheim.gat",86,219,"Lord Of Death",1373,1,"NifInvasion::OnLoDDead";
+ monster "niflheim.gat",86,222,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",86,216,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",89,219,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",83,219,"Bloody Murderer",1507,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",89,222,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",89,216,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",83,222,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",83,216,"Loli Ruri",1505,1,"NifInvasion::OnInvasionMonsters";
+ break;
+
+ }
+ monster "niflheim.gat",154,95,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",115,65,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",330,195,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",151,83,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",285,245,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",235,135,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",265,48,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",186,139,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",166,267,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",82,202,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",219,44,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",287,44,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",275,165,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",138,204,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",299,39,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",31,154,"Disguise",1506,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",154,96,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",116,65,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",151,84,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",286,245,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",330,196,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",236,135,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",165,49,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",167,267,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",82,203,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",220,44,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",287,45,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",287,44,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",276,166,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",139,205,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",300,39,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ monster "niflheim.gat",31,155,"Dullahan",1504,1,"NifInvasion::OnInvasionMonsters";
+ end;
+
+OnInvasionMonsters:
+ end;
+
+OnLoDDead:
+ killmonster "niflheim.gat","NifInvasion::OnInvasionMonsters";
+ }
+
+}
diff --git a/npc/mobs/fields/odin.txt b/npc/mobs/fields/odin.txt
index 2d71b1807..a6b039fdd 100644
--- a/npc/mobs/fields/odin.txt
+++ b/npc/mobs/fields/odin.txt
@@ -1,55 +1,55 @@
-//===== eAthena Script =======================================
-//= Odin Temple Monster Spawn Script
-//===== By: ==================================================
-//= Poki#3 (0.1)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Updated by using Tharis' Homun AI, by Tharis [Vicious]
-//============================================================
-
-//==================================================
-// odin_tem01 - Odin Temple F1
-//==================================================
-odin_tem01.gat,0,0,0,0 monster Plasma 1693,15,0,0,0
-odin_tem01.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
-odin_tem01.gat,0,0,0,0 monster Plasma 1694,3,0,0,0
-odin_tem01.gat,0,0,0,0 monster Plasma 1695,3,0,0,0
-odin_tem01.gat,0,0,0,0 monster Plasma 1696,3,0,0,0
-odin_tem01.gat,0,0,0,0 monster Plasma 1697,3,0,0,0
-odin_tem01.gat,0,0,0,0 monster Skeggiold 1754,1,0,0,0
-odin_tem01.gat,0,0,0,0 monster Blue Plant 1079,5,900000,450000,1
-odin_tem01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-odin_tem01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-
-//==================================================
-// odin_tem02 - Odin Temple F2
-//==================================================
-odin_tem02.gat,0,0,0,0 monster Skogul 1752,30,0,0,0
-odin_tem02.gat,0,0,0,0 monster Frus 1753,25,0,0,0
-odin_tem02.gat,0,0,0,0 monster Plasma 1693,15,0,0,0
-odin_tem02.gat,0,0,0,0 monster Skeggiold 1754,3,0,0,0
-odin_tem02.gat,0,0,0,0 monster Skeggiold 1755,3,0,0,0
-odin_tem02.gat,0,0,0,0 monster Valkyrie 1765,1,0,0,0
-odin_tem02.gat,0,0,0,0 monster Blue Plant 1079,12,900000,450000,1
-//Slave of who?
-odin_tem02.gat,0,0,0,0 monster Skogul 1761,1,0,0,0
-odin_tem02.gat,0,0,0,0 monster Frus 1762,1,0,0,0
-
-//==================================================
-// odin_tem03 - Odin Temple F3
-//==================================================
-odin_tem03.gat,0,0,0,0 monster Plasma 1693,20,0,0,0
-odin_tem03.gat,0,0,0,0 monster Skeggiold 1754,15,0,0,0
-odin_tem03.gat,0,0,0,0 monster Skeggiold 1755,10,0,0,0
-odin_tem03.gat,0,0,0,0 monster Skogul 1752,5,0,0,0
-odin_tem03.gat,0,0,0,0 monster Frus 1753,5,0,0,0
-odin_tem03.gat,0,0,0,0 monster Valkyrie 1765,2,0,0,0
-odin_tem03.gat,0,0,0,0 monster Valkyrie Randgris 1751,1,3600000,1800000,1
-odin_tem03.gat,0,0,0,0 monster Blue Plant 1079,12,900000,450000,1
-odin_tem03.gat,0,0,0,0 monster Shining Plant 1083,10,1800000,900000,1
-//Slave of who?
-odin_tem03.gat,0,0,0,0 monster Skogul 1761,1,0,0,0
+//===== eAthena Script =======================================
+//= Odin Temple Monster Spawn Script
+//===== By: ==================================================
+//= Poki#3 (0.1)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Updated by using Tharis' Homun AI, by Tharis [Vicious]
+//============================================================
+
+//==================================================
+// odin_tem01 - Odin Temple F1
+//==================================================
+odin_tem01.gat,0,0,0,0 monster Plasma 1693,15,0,0,0
+odin_tem01.gat,0,0,0,0 monster Breeze 1692,10,0,0,0
+odin_tem01.gat,0,0,0,0 monster Plasma 1694,3,0,0,0
+odin_tem01.gat,0,0,0,0 monster Plasma 1695,3,0,0,0
+odin_tem01.gat,0,0,0,0 monster Plasma 1696,3,0,0,0
+odin_tem01.gat,0,0,0,0 monster Plasma 1697,3,0,0,0
+odin_tem01.gat,0,0,0,0 monster Skeggiold 1754,1,0,0,0
+odin_tem01.gat,0,0,0,0 monster Blue Plant 1079,5,900000,450000,1
+odin_tem01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+odin_tem01.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+
+//==================================================
+// odin_tem02 - Odin Temple F2
+//==================================================
+odin_tem02.gat,0,0,0,0 monster Skogul 1752,30,0,0,0
+odin_tem02.gat,0,0,0,0 monster Frus 1753,25,0,0,0
+odin_tem02.gat,0,0,0,0 monster Plasma 1693,15,0,0,0
+odin_tem02.gat,0,0,0,0 monster Skeggiold 1754,3,0,0,0
+odin_tem02.gat,0,0,0,0 monster Skeggiold 1755,3,0,0,0
+odin_tem02.gat,0,0,0,0 monster Valkyrie 1765,1,0,0,0
+odin_tem02.gat,0,0,0,0 monster Blue Plant 1079,12,900000,450000,1
+//Slave of who?
+odin_tem02.gat,0,0,0,0 monster Skogul 1761,1,0,0,0
+odin_tem02.gat,0,0,0,0 monster Frus 1762,1,0,0,0
+
+//==================================================
+// odin_tem03 - Odin Temple F3
+//==================================================
+odin_tem03.gat,0,0,0,0 monster Plasma 1693,20,0,0,0
+odin_tem03.gat,0,0,0,0 monster Skeggiold 1754,15,0,0,0
+odin_tem03.gat,0,0,0,0 monster Skeggiold 1755,10,0,0,0
+odin_tem03.gat,0,0,0,0 monster Skogul 1752,5,0,0,0
+odin_tem03.gat,0,0,0,0 monster Frus 1753,5,0,0,0
+odin_tem03.gat,0,0,0,0 monster Valkyrie 1765,2,0,0,0
+odin_tem03.gat,0,0,0,0 monster Valkyrie Randgris 1751,1,3600000,1800000,1
+odin_tem03.gat,0,0,0,0 monster Blue Plant 1079,12,900000,450000,1
+odin_tem03.gat,0,0,0,0 monster Shining Plant 1083,10,1800000,900000,1
+//Slave of who?
+odin_tem03.gat,0,0,0,0 monster Skogul 1761,1,0,0,0
odin_tem03.gat,0,0,0,0 monster Frus 1762,1,0,0,0 \ No newline at end of file
diff --git a/npc/mobs/fields/payon.txt b/npc/mobs/fields/payon.txt
index edcae2095..a22f0371a 100644
--- a/npc/mobs/fields/payon.txt
+++ b/npc/mobs/fields/payon.txt
@@ -1,152 +1,152 @@
-//===== eAthena Script =======================================
-//= Payon Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// pay_fild01 - Payon Forest
-//==================================================
-pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
-pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,336,116,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,231,258,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,215,323,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,225,310,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,129,288,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,75,269,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,80,226,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,89,177,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,95,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,57,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,64,113,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,64,190,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,70,246,0,0 monster Black Mushroom 1084,1,180000,90000,1
-pay_fild01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-
-//==================================================
-// pay_fild02 - Payon Forest
-//==================================================
-pay_fild02.gat,0,0,0,0 monster Boa 1025,30,0,0,0
-pay_fild02.gat,0,0,0,0 monster Wolf 1013,70,0,0,0
-pay_fild02.gat,0,0,0,0 monster Spore 1014,10,0,0,0
-pay_fild02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild02.gat,105,256,10,10 monster Green Plant 1080,4,360000,180000,1
-pay_fild02.gat,105,256,10,10 monster Red Mushroom 1085,4,360000,180000,1
-
-//==================================================
-// pay_fild03 - Payon Forest
-//==================================================
-pay_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
-pay_fild03.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
-pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,0,0,0
-pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
-pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
-
-//==================================================
-// pay_fild04 - Sograt Desert
-//==================================================
-pay_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-pay_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-pay_fild04.gat,0,0,0,0 monster Poporing 1031,40,0,0,0
-pay_fild04.gat,0,0,0,0 monster Marin 1242,10,0,0,0
-pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Deviling 1582,1,7200000,3600000,1
-pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
-pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
-
-//==================================================
-// pay_fild05 - Payon Forest
-//==================================================
-pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,5,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,65,0,0,0
-pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
-pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
-
-//==================================================
-// pay_fild06 - Payon Forest
-//==================================================
-pay_fild06.gat,0,0,0,0 monster Wormtail 1024,70,0,0,0
-pay_fild06.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild06.gat,0,0,0,0 monster Thief Bug Female 1053,40,0,0,0
-pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
-pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
-pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// pay_fild07 - Payon Forest
-//==================================================
-pay_fild07.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
-pay_fild07.gat,0,0,0,0 monster Eggyra 1116,40,0,0,0
-pay_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild07.gat,0,0,0,0 monster Willow 1010,20,0,0,0
-pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,0,0,0
-pay_fild07.gat,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
-
-//==================================================
-// pay_fild08 - Payon Forest
-//==================================================
-pay_fild08.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-pay_fild08.gat,0,0,0,0 monster Willow 1010,70,0,0,0
-pay_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-pay_fild08.gat,0,0,0,0 monster Spore 1014,50,0,0,0
-pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
-pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
-
-//==================================================
-// pay_fild09 - Payon Forest
-//==================================================
-pay_fild09.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Wormtail 1024,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild09.gat,0,0,0,0 monster Boa 1025,30,0,0,0
-pay_fild09.gat,0,0,0,0 monster Sohee 1170,3,0,0,0
-pay_fild09.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
-pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,50,0,0,0
-pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,0
-pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// pay_fild10 - Payon Forest
-//==================================================
-pay_fild10.gat,0,0,0,0 monster Greatest General 1277,65,0,0,0
-pay_fild10.gat,0,0,0,0 monster Horong 1129,40,0,0,0
-pay_fild10.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-pay_fild10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,3,0,0,0
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,1800000,900000,1
-pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,900000,450000,1
-pay_fild10.gat,213,157,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,281,307,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,66,332,10,10 monster Green Plant 1080,5,360000,180000,1
-pay_fild10.gat,213,157,10,10 monster Blue Plant 1079,1,360000,180000,1
-pay_fild10.gat,281,307,10,10 monster Blue Plant 1079,1,360000,180000,1
-pay_fild10.gat,66,332,10,10 monster Blue Plant 1079,1,360000,180000,1
-
-//==================================================
-// pay_fild11 - Payon Forest
-//==================================================
-pay_fild11.gat,0,0,0,0 monster Horong 1129,50,0,0,0
-pay_fild11.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
-pay_fild11.gat,0,0,0,0 monster Elder Willow 1033,10,0,0,0
-pay_fild11.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-pay_fild11.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
-pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,0,0,0
-pay_fild11.gat,0,0,0,0 monster Eddga 1115,1,7200000,3600000,1
-pay_fild11.gat,241,162,5,5 monster Red Mushroom 1085,3,360000,180000,1
-pay_fild11.gat,66,293,5,5 monster Red Mushroom 1085,3,360000,180000,1
+//===== eAthena Script =======================================
+//= Payon Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// pay_fild01 - Payon Forest
+//==================================================
+pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
+pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,336,116,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,231,258,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,215,323,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,340,89,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,225,310,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,129,288,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,75,269,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,80,226,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,89,177,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,95,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,57,85,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,64,113,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,64,190,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,70,246,0,0 monster Black Mushroom 1084,1,180000,90000,1
+pay_fild01.gat,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+
+//==================================================
+// pay_fild02 - Payon Forest
+//==================================================
+pay_fild02.gat,0,0,0,0 monster Boa 1025,30,0,0,0
+pay_fild02.gat,0,0,0,0 monster Wolf 1013,70,0,0,0
+pay_fild02.gat,0,0,0,0 monster Spore 1014,10,0,0,0
+pay_fild02.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild02.gat,105,256,10,10 monster Green Plant 1080,4,360000,180000,1
+pay_fild02.gat,105,256,10,10 monster Red Mushroom 1085,4,360000,180000,1
+
+//==================================================
+// pay_fild03 - Payon Forest
+//==================================================
+pay_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
+pay_fild03.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
+pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,0,0,0
+pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
+pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
+
+//==================================================
+// pay_fild04 - Sograt Desert
+//==================================================
+pay_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+pay_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+pay_fild04.gat,0,0,0,0 monster Poporing 1031,40,0,0,0
+pay_fild04.gat,0,0,0,0 monster Marin 1242,10,0,0,0
+pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Deviling 1582,1,7200000,3600000,1
+pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
+pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
+
+//==================================================
+// pay_fild05 - Payon Forest
+//==================================================
+pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,5,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,65,0,0,0
+pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
+pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
+
+//==================================================
+// pay_fild06 - Payon Forest
+//==================================================
+pay_fild06.gat,0,0,0,0 monster Wormtail 1024,70,0,0,0
+pay_fild06.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild06.gat,0,0,0,0 monster Thief Bug Female 1053,40,0,0,0
+pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
+pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
+pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// pay_fild07 - Payon Forest
+//==================================================
+pay_fild07.gat,0,0,0,0 monster Elder Willow 1033,70,0,0,0
+pay_fild07.gat,0,0,0,0 monster Eggyra 1116,40,0,0,0
+pay_fild07.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild07.gat,0,0,0,0 monster Willow 1010,20,0,0,0
+pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,0,0,0
+pay_fild07.gat,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
+
+//==================================================
+// pay_fild08 - Payon Forest
+//==================================================
+pay_fild08.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+pay_fild08.gat,0,0,0,0 monster Willow 1010,70,0,0,0
+pay_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+pay_fild08.gat,0,0,0,0 monster Spore 1014,50,0,0,0
+pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
+pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
+
+//==================================================
+// pay_fild09 - Payon Forest
+//==================================================
+pay_fild09.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Wormtail 1024,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild09.gat,0,0,0,0 monster Boa 1025,30,0,0,0
+pay_fild09.gat,0,0,0,0 monster Sohee 1170,3,0,0,0
+pay_fild09.gat,0,0,0,0 monster Smokie 1056,50,0,0,0
+pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,50,0,0,0
+pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,0
+pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// pay_fild10 - Payon Forest
+//==================================================
+pay_fild10.gat,0,0,0,0 monster Greatest General 1277,65,0,0,0
+pay_fild10.gat,0,0,0,0 monster Horong 1129,40,0,0,0
+pay_fild10.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+pay_fild10.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,3,0,0,0
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,1800000,900000,1
+pay_fild10.gat,0,0,0,0 monster Nine Tail 1180,1,900000,450000,1
+pay_fild10.gat,213,157,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,281,307,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,66,332,10,10 monster Green Plant 1080,5,360000,180000,1
+pay_fild10.gat,213,157,10,10 monster Blue Plant 1079,1,360000,180000,1
+pay_fild10.gat,281,307,10,10 monster Blue Plant 1079,1,360000,180000,1
+pay_fild10.gat,66,332,10,10 monster Blue Plant 1079,1,360000,180000,1
+
+//==================================================
+// pay_fild11 - Payon Forest
+//==================================================
+pay_fild11.gat,0,0,0,0 monster Horong 1129,50,0,0,0
+pay_fild11.gat,0,0,0,0 monster Greatest General 1277,30,0,0,0
+pay_fild11.gat,0,0,0,0 monster Elder Willow 1033,10,0,0,0
+pay_fild11.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+pay_fild11.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
+pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,0,0,0
+pay_fild11.gat,0,0,0,0 monster Eddga 1115,1,7200000,3600000,1
+pay_fild11.gat,241,162,5,5 monster Red Mushroom 1085,3,360000,180000,1
+pay_fild11.gat,66,293,5,5 monster Red Mushroom 1085,3,360000,180000,1
diff --git a/npc/mobs/fields/prontera.txt b/npc/mobs/fields/prontera.txt
index 1b88c96b2..f4e82672d 100644
--- a/npc/mobs/fields/prontera.txt
+++ b/npc/mobs/fields/prontera.txt
@@ -1,140 +1,140 @@
-//===== eAthena Script =======================================
-//= Prontera Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.2 fixed some map name typos [Lupus]
-//= 1.3 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// prt_fild00 - Prontera Field
-//==================================================
-prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
-prt_fild00.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
-prt_fild00.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
-prt_fild00.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
-prt_fild00.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
-prt_fild00.gat,227,212,0,0 monster Shining Plant 1083,1,1800000,900000,1
-prt_fild00.gat,285,138,10,10 monster Green Plant 1080,5,360000,180000,1
-
-//==================================================
-// prt_fild01 - Prontera Field
-//==================================================
-prt_fild01.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
-prt_fild01.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
-prt_fild01.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-prt_fild01.gat,0,0,0,0 monster Lunatic 1063,80,0,0,0
-prt_fild01.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
-prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
-
-//==================================================
-// prt_fild02 - Prontera Field
-//==================================================
-prt_fild02.gat,0,0,0,0 monster Mandragora 1020,70,0,0,0
-prt_fild02.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
-prt_fild02.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild02.gat,0,0,0,0 monster Lunatic 1063,10,0,0,0
-prt_fild02.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,1800000,1200000,0
-prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
-prt_fild02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
-
-//==================================================
-// prt_fild03 - Prontera Field
-//==================================================
-prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
-prt_fild03.gat,0,0,0,0 monster Smokie 1056,40,0,0,0
-prt_fild03.gat,0,0,0,0 monster Choco 1214,3,1800000,900000,0
-prt_fild03.gat,0,0,0,0 monster Fabre 1007,10,0,0,0
-prt_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-prt_fild03.gat,296,58,15,15 monster Green Plant 1080,5,180000,90000,1
-prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
-prt_fild03.gat,307,75,5,5 monster Green Plant 1080,5,360000,180000,1
-prt_fild03.gat,0,0,0,0 monster Green Plant 1080,5,360000,180000,1
-prt_fild03.gat,148,107,5,5 monster Green Plant 1080,5,360000,180000,1
-
-//==================================================
-// prt_fild04 - Prontera Field
-//==================================================
-prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
-prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
-prt_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-prt_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild04.gat,0,0,0,0 monster Vocal 1088,1,1800000,1200000,0
-prt_fild04.gat,350,114,10,10 monster Green Plant 1080,5,900000,450000,1
-
-//==================================================
-// prt_fild05 - Prontera Field
-//==================================================
-prt_fild05.gat,0,0,0,0 monster Poring 1002,70,0,0,0
-prt_fild05.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_fild05.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
-prt_fild05.gat,0,0,0,0 monster Pupa 1008,30,0,0,0
-prt_fild05.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
-prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
-
-//==================================================
-// prt_fild06 - Prontera Field
-//==================================================
-prt_fild06.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
-prt_fild06.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-prt_fild06.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-prt_fild06.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild06.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-prt_fild06.gat,222,30,40,10 monster Green Plant 1080,15,900000,450000,1
-
-//==================================================
-// prt_fild07 - Prontera Field
-//==================================================
-prt_fild07.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
-prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
-
-//==================================================
-// prt_fild08 - Prontera Field
-//==================================================
-prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
-prt_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
-prt_fild08.gat,0,0,0,0 monster Poring 1002,70,0,0,0
-prt_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-
-//==================================================
-// prt_fild09 - Prontera Field
-//==================================================
-prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
-prt_fild09.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
-prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
-
-//==================================================
-// prt_fild10 - Prontera Field
-//==================================================
-prt_fild10.gat,0,0,0,0 monster Savage 1166,70,0,0,0
-prt_fild10.gat,0,0,0,0 monster Savage Babe 1167,40,0,0,0
-prt_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-prt_fild10.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
-prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
-prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
-
-//==================================================
-// prt_fild11 - Prontera Field
-//==================================================
-prt_fild11.gat,0,0,0,0 monster Goblin 1122,10,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1123,20,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1124,20,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1125,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1126,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin Archer 1258,10,0,0,0
-prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,1800000,1200000,0
-prt_fild11.gat,0,0,0,0 monster Goblin Steamrider 1280,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
+//===== eAthena Script =======================================
+//= Prontera Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.2 fixed some map name typos [Lupus]
+//= 1.3 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// prt_fild00 - Prontera Field
+//==================================================
+prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
+prt_fild00.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
+prt_fild00.gat,0,0,0,0 monster Pupa 1008,50,0,0,0
+prt_fild00.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
+prt_fild00.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,0,0,0
+prt_fild00.gat,227,212,0,0 monster Shining Plant 1083,1,1800000,900000,1
+prt_fild00.gat,285,138,10,10 monster Green Plant 1080,5,360000,180000,1
+
+//==================================================
+// prt_fild01 - Prontera Field
+//==================================================
+prt_fild01.gat,0,0,0,0 monster Thief Bug 1051,30,0,0,0
+prt_fild01.gat,0,0,0,0 monster Fabre 1007,20,0,0,0
+prt_fild01.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+prt_fild01.gat,0,0,0,0 monster Lunatic 1063,80,0,0,0
+prt_fild01.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
+prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
+
+//==================================================
+// prt_fild02 - Prontera Field
+//==================================================
+prt_fild02.gat,0,0,0,0 monster Mandragora 1020,70,0,0,0
+prt_fild02.gat,0,0,0,0 monster Fabre 1007,50,0,0,0
+prt_fild02.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild02.gat,0,0,0,0 monster Lunatic 1063,10,0,0,0
+prt_fild02.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,1800000,1200000,0
+prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
+prt_fild02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
+
+//==================================================
+// prt_fild03 - Prontera Field
+//==================================================
+prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
+prt_fild03.gat,0,0,0,0 monster Smokie 1056,40,0,0,0
+prt_fild03.gat,0,0,0,0 monster Choco 1214,3,1800000,900000,0
+prt_fild03.gat,0,0,0,0 monster Fabre 1007,10,0,0,0
+prt_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+prt_fild03.gat,296,58,15,15 monster Green Plant 1080,5,180000,90000,1
+prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
+prt_fild03.gat,307,75,5,5 monster Green Plant 1080,5,360000,180000,1
+prt_fild03.gat,0,0,0,0 monster Green Plant 1080,5,360000,180000,1
+prt_fild03.gat,148,107,5,5 monster Green Plant 1080,5,360000,180000,1
+
+//==================================================
+// prt_fild04 - Prontera Field
+//==================================================
+prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
+prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
+prt_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+prt_fild04.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild04.gat,0,0,0,0 monster Vocal 1088,1,1800000,1200000,0
+prt_fild04.gat,350,114,10,10 monster Green Plant 1080,5,900000,450000,1
+
+//==================================================
+// prt_fild05 - Prontera Field
+//==================================================
+prt_fild05.gat,0,0,0,0 monster Poring 1002,70,0,0,0
+prt_fild05.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_fild05.gat,0,0,0,0 monster Lunatic 1063,30,0,0,0
+prt_fild05.gat,0,0,0,0 monster Pupa 1008,30,0,0,0
+prt_fild05.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
+prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
+
+//==================================================
+// prt_fild06 - Prontera Field
+//==================================================
+prt_fild06.gat,0,0,0,0 monster Lunatic 1063,60,0,0,0
+prt_fild06.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+prt_fild06.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+prt_fild06.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild06.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+prt_fild06.gat,222,30,40,10 monster Green Plant 1080,15,900000,450000,1
+
+//==================================================
+// prt_fild07 - Prontera Field
+//==================================================
+prt_fild07.gat,0,0,0,0 monster Rocker 1052,70,0,0,0
+prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
+
+//==================================================
+// prt_fild08 - Prontera Field
+//==================================================
+prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
+prt_fild08.gat,0,0,0,0 monster Pupa 1008,20,0,0,0
+prt_fild08.gat,0,0,0,0 monster Poring 1002,70,0,0,0
+prt_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+
+//==================================================
+// prt_fild09 - Prontera Field
+//==================================================
+prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
+prt_fild09.gat,0,0,0,0 monster Baby Desert Wolf 1107,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Peco Peco Egg 1047,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
+prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
+
+//==================================================
+// prt_fild10 - Prontera Field
+//==================================================
+prt_fild10.gat,0,0,0,0 monster Savage 1166,70,0,0,0
+prt_fild10.gat,0,0,0,0 monster Savage Babe 1167,40,0,0,0
+prt_fild10.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+prt_fild10.gat,0,0,0,0 monster Thief Bug 1051,10,0,0,0
+prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
+prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
+
+//==================================================
+// prt_fild11 - Prontera Field
+//==================================================
+prt_fild11.gat,0,0,0,0 monster Goblin 1122,10,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1123,20,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1124,20,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1125,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1126,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin Archer 1258,10,0,0,0
+prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,1800000,1200000,0
+prt_fild11.gat,0,0,0,0 monster Goblin Steamrider 1280,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Red Mushroom 1085,10,180000,90000,1
diff --git a/npc/mobs/fields/rachel.txt b/npc/mobs/fields/rachel.txt
index 98401eca2..8f957376b 100644
--- a/npc/mobs/fields/rachel.txt
+++ b/npc/mobs/fields/rachel.txt
@@ -1,115 +1,115 @@
-//===== eAthena Script =======================================
-//= Rachel Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Created this [Sepheus]
-//= 1.1 Updated [Playtester]
-//============================================================
-
-//==================================================
-// ra_fild01 - Rachel Field
-//==================================================
-ra_fild01.gat,0,0,0,0 monster Muscipular 1780,50,0,0,0
-ra_fild01.gat,0,0,0,0 monster Geographer 1368,30,0,0,0
-ra_fild01.gat,0,0,0,0 monster Drosera 1781,20,0,0,0
-ra_fild01.gat,0,0,0,0 monster Gryphon 1259,3,0,0,0
-ra_fild01.gat,0,0,0,0 monster Galion 1783,2,0,0,0
-
-//==================================================
-// ra_fild02 - Rachel Field
-//==================================================
-ra_fild02.gat,0,0,0,0 monster Muscipular 1780,40,0,0,0
-ra_fild02.gat,0,0,0,0 monster Galion 1783,20,0,0,0
-ra_fild02.gat,0,0,0,0 monster Drosera 1781,20,0,0,0
-ra_fild02.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
-
-//==================================================
-// ra_fild03 - Rachel Field
-//==================================================
-ra_fild03.gat,0,0,0,0 monster Galion 1783,30,0,0,0
-ra_fild03.gat,0,0,0,0 monster Roween 1782,10,0,0,0
-ra_fild03.gat,0,0,0,0 monster Drosera 1781,10,0,0,0
-ra_fild03.gat,0,0,0,0 monster Stapo 1784,10,0,0,0
-ra_fild03.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
-
-//==================================================
-// ra_fild04 - Rachel Field
-//==================================================
-ra_fild04.gat,0,0,0,0 monster Roween 1782,60,0,0,0
-ra_fild04.gat,0,0,0,0 monster Stapo 1784,20,0,0,0
-ra_fild04.gat,0,0,0,0 monster Wild Rose 1261,10,0,0,0
-ra_fild04.gat,0,0,0,0 monster Galion 1783,3,0,0,0
-ra_fild04.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
-
-//==================================================
-// ra_fild05 - Rachel Field
-//==================================================
-ra_fild05.gat,0,0,0,0 monster Hill Wind 1680,50,0,0,0
-ra_fild05.gat,0,0,0,0 monster Drosera 1781,25,0,0,0
-ra_fild05.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
-
-//==================================================
-// ra_fild06 - Rachel Field
-//==================================================
-ra_fild06.gat,0,0,0,0 monster Hill Wind 1680,30,0,0,0
-ra_fild06.gat,0,0,0,0 monster Anopheles 1627,20,0,0,0
-ra_fild06.gat,0,0,0,0 monster Drosera 1781,10,0,0,0
-
-//==================================================
-// ra_fild07 - Rachel Field
-//==================================================
-ra_fild07.gat,0,0,0,0 monster Roween 1782,40,0,0,0
-ra_fild07.gat,0,0,0,0 monster Stapo 1784,30,0,0,0
-ra_fild07.gat,0,0,0,0 monster Galion 1783,20,0,0,0
-
-//==================================================
-// ra_fild08 - Rachel Field
-//==================================================
-ra_fild08.gat,0,0,0,0 monster Stapo 1784,60,0,0,0
-ra_fild08.gat,0,0,0,0 monster Drops 1113,30,0,0,0
-ra_fild08.gat,0,0,0,0 monster Drosera 1781,15,0,0,0
-
-//==================================================
-// ra_fild09 - Rachel Field
-//==================================================
-ra_fild09.gat,0,0,0,0 monster Drosera 1781,60,0,0,0
-ra_fild09.gat,0,0,0,0 monster Metaling 1613,20,0,0,0
-ra_fild09.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,0
-ra_fild09.gat,0,0,0,0 monster Harpy 1376,1,0,0,0
-
-//==================================================
-// ra_fild10 - Rachel Field
-//==================================================
-ra_fild10.gat,0,0,0,0 monster Stapo 1784,35,0,0,0
-ra_fild10.gat,0,0,0,0 monster Galion 1783,15,0,0,0
-ra_fild10.gat,0,0,0,0 monster Roween 1782,10,0,0,0
-
-//==================================================
-// ra_fild11 - Rachel Field
-//==================================================
-ra_fild11.gat,0,0,0,0 monster Drops 1113,35,0,0,0
-ra_fild11.gat,0,0,0,0 monster Stapo 1784,25,0,0,0
-ra_fild11.gat,0,0,0,0 monster Roween 1782,10,0,0,0
-ra_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-ra_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// ra_fild12 - Rachel Field
-//==================================================
-ra_fild12.gat,0,0,0,0 monster Drops 1113,65,0,0,0
-ra_fild12.gat,0,0,0,0 monster Stapo 1784,40,0,0,0
-ra_fild12.gat,0,0,0,0 monster Poporing 1031,5,0,0,0
-ra_fild12.gat,0,0,0,0 monster Yellow Plant 1081,15,180000,90000,1
-ra_fild12.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-
-//==================================================
-// ra_fild13 - Rachel Field
-//==================================================
-ra_fild13.gat,0,0,0,0 monster Stapo 1784,60,0,0,0
-ra_fild13.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-ra_fild13.gat,0,0,0,0 monster Roween 1782,5,0,0,0
+//===== eAthena Script =======================================
+//= Rachel Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Created this [Sepheus]
+//= 1.1 Updated [Playtester]
+//============================================================
+
+//==================================================
+// ra_fild01 - Rachel Field
+//==================================================
+ra_fild01.gat,0,0,0,0 monster Muscipular 1780,50,0,0,0
+ra_fild01.gat,0,0,0,0 monster Geographer 1368,30,0,0,0
+ra_fild01.gat,0,0,0,0 monster Drosera 1781,20,0,0,0
+ra_fild01.gat,0,0,0,0 monster Gryphon 1259,3,0,0,0
+ra_fild01.gat,0,0,0,0 monster Galion 1783,2,0,0,0
+
+//==================================================
+// ra_fild02 - Rachel Field
+//==================================================
+ra_fild02.gat,0,0,0,0 monster Muscipular 1780,40,0,0,0
+ra_fild02.gat,0,0,0,0 monster Galion 1783,20,0,0,0
+ra_fild02.gat,0,0,0,0 monster Drosera 1781,20,0,0,0
+ra_fild02.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
+
+//==================================================
+// ra_fild03 - Rachel Field
+//==================================================
+ra_fild03.gat,0,0,0,0 monster Galion 1783,30,0,0,0
+ra_fild03.gat,0,0,0,0 monster Roween 1782,10,0,0,0
+ra_fild03.gat,0,0,0,0 monster Drosera 1781,10,0,0,0
+ra_fild03.gat,0,0,0,0 monster Stapo 1784,10,0,0,0
+ra_fild03.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
+
+//==================================================
+// ra_fild04 - Rachel Field
+//==================================================
+ra_fild04.gat,0,0,0,0 monster Roween 1782,60,0,0,0
+ra_fild04.gat,0,0,0,0 monster Stapo 1784,20,0,0,0
+ra_fild04.gat,0,0,0,0 monster Wild Rose 1261,10,0,0,0
+ra_fild04.gat,0,0,0,0 monster Galion 1783,3,0,0,0
+ra_fild04.gat,0,0,0,0 monster Atros 1785,1,7200000,3600000,1
+
+//==================================================
+// ra_fild05 - Rachel Field
+//==================================================
+ra_fild05.gat,0,0,0,0 monster Hill Wind 1680,50,0,0,0
+ra_fild05.gat,0,0,0,0 monster Drosera 1781,25,0,0,0
+ra_fild05.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
+
+//==================================================
+// ra_fild06 - Rachel Field
+//==================================================
+ra_fild06.gat,0,0,0,0 monster Hill Wind 1680,30,0,0,0
+ra_fild06.gat,0,0,0,0 monster Anopheles 1627,20,0,0,0
+ra_fild06.gat,0,0,0,0 monster Drosera 1781,10,0,0,0
+
+//==================================================
+// ra_fild07 - Rachel Field
+//==================================================
+ra_fild07.gat,0,0,0,0 monster Roween 1782,40,0,0,0
+ra_fild07.gat,0,0,0,0 monster Stapo 1784,30,0,0,0
+ra_fild07.gat,0,0,0,0 monster Galion 1783,20,0,0,0
+
+//==================================================
+// ra_fild08 - Rachel Field
+//==================================================
+ra_fild08.gat,0,0,0,0 monster Stapo 1784,60,0,0,0
+ra_fild08.gat,0,0,0,0 monster Drops 1113,30,0,0,0
+ra_fild08.gat,0,0,0,0 monster Drosera 1781,15,0,0,0
+
+//==================================================
+// ra_fild09 - Rachel Field
+//==================================================
+ra_fild09.gat,0,0,0,0 monster Drosera 1781,60,0,0,0
+ra_fild09.gat,0,0,0,0 monster Metaling 1613,20,0,0,0
+ra_fild09.gat,0,0,0,0 monster Hill Wind 1680,10,0,0,0
+ra_fild09.gat,0,0,0,0 monster Harpy 1376,1,0,0,0
+
+//==================================================
+// ra_fild10 - Rachel Field
+//==================================================
+ra_fild10.gat,0,0,0,0 monster Stapo 1784,35,0,0,0
+ra_fild10.gat,0,0,0,0 monster Galion 1783,15,0,0,0
+ra_fild10.gat,0,0,0,0 monster Roween 1782,10,0,0,0
+
+//==================================================
+// ra_fild11 - Rachel Field
+//==================================================
+ra_fild11.gat,0,0,0,0 monster Drops 1113,35,0,0,0
+ra_fild11.gat,0,0,0,0 monster Stapo 1784,25,0,0,0
+ra_fild11.gat,0,0,0,0 monster Roween 1782,10,0,0,0
+ra_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+ra_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// ra_fild12 - Rachel Field
+//==================================================
+ra_fild12.gat,0,0,0,0 monster Drops 1113,65,0,0,0
+ra_fild12.gat,0,0,0,0 monster Stapo 1784,40,0,0,0
+ra_fild12.gat,0,0,0,0 monster Poporing 1031,5,0,0,0
+ra_fild12.gat,0,0,0,0 monster Yellow Plant 1081,15,180000,90000,1
+ra_fild12.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+
+//==================================================
+// ra_fild13 - Rachel Field
+//==================================================
+ra_fild13.gat,0,0,0,0 monster Stapo 1784,60,0,0,0
+ra_fild13.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+ra_fild13.gat,0,0,0,0 monster Roween 1782,5,0,0,0
diff --git a/npc/mobs/fields/umbala.txt b/npc/mobs/fields/umbala.txt
index c4f2c53b4..897f95961 100644
--- a/npc/mobs/fields/umbala.txt
+++ b/npc/mobs/fields/umbala.txt
@@ -1,100 +1,100 @@
-//===== eAthena Script =======================================
-//= Umbala Monster Spawn
-//===== By: ==================================================
-//= Darkchild (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Ep6+
-//===== Additional Comments: =================================
-//= 1.3 Official kRO 10.1 spawns [Playtester]
-//============================================================
-
-//==================================================
-// um_fild01 - Luluka Forest
-//==================================================
-um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
-um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
-um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
-um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
-um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-um_fild01.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
-
-//==================================================
-// um_fild02 - Hoomga Forest
-//==================================================
-um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
-um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
-um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
-um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
-um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,120000,60000,0
-um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,120000,60000,0
-um_fild02.gat,360,320,20,30 monster Flora 1118,3,180000,120000,0
-um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
-
-//==================================================
-// um_fild03 - Kalala Swamp
-//==================================================
-um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
-um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
-um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
-um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
-um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3500000,1900000,0
-um_fild03.gat,0,0,0,0 monster Pest 1256,2,0,0,0
-um_fild03.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
-um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-um_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,180000,90000,1
-
-//==================================================
-// um_fild04 - Hoomga Jungle
-//==================================================
-um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
-um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
-um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
-um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,120000,60000,0
-um_fild04.gat,264,293,10,10 monster Horn 1128,2,1200000,60000,0
-um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,118,237,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,311,285,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,206,188,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Horn 1128,1,120000,60000,0
-um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,300000,60000,0
-um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+//===== eAthena Script =======================================
+//= Umbala Monster Spawn
+//===== By: ==================================================
+//= Darkchild (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Ep6+
+//===== Additional Comments: =================================
+//= 1.3 Official kRO 10.1 spawns [Playtester]
+//============================================================
+
+//==================================================
+// um_fild01 - Luluka Forest
+//==================================================
+um_fild01.gat,0,0,0,0 monster Dryad 1493,40,0,0,0
+um_fild01.gat,0,0,0,0 monster Stem Worm 1215,30,0,0,0
+um_fild01.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
+um_fild01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+um_fild01.gat,0,0,0,0 monster Wootan Fighter 1499,10,0,0,0
+um_fild01.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+um_fild01.gat,0,0,0,0 monster Shining Plant 1083,6,180000,90000,1
+
+//==================================================
+// um_fild02 - Hoomga Forest
+//==================================================
+um_fild02.gat,0,0,0,0 monster Coco 1104,10,0,0,0
+um_fild02.gat,0,0,0,0 monster Choco 1214,3,0,0,0
+um_fild02.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+um_fild02.gat,0,0,0,0 monster Wootan Fighter 1499,26,0,0,0
+um_fild02.gat,0,0,0,0 monster Stone Shooter 1495,13,0,0,0
+um_fild02.gat,169,215,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,169,215,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,159,285,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,159,285,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,99,303,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,99,303,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,122,242,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,122,242,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,124,198,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,124,198,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,126,133,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,126,133,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,159,171,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,159,171,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,284,247,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,284,247,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,330,262,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,330,262,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,296,187,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,296,187,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,285,105,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,285,105,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,257,137,10,10 monster Stone Shooter 1495,1,120000,60000,0
+um_fild02.gat,257,137,10,10 monster Wootan Fighter 1499,2,120000,60000,0
+um_fild02.gat,360,320,20,30 monster Flora 1118,3,180000,120000,0
+um_fild02.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_fild02.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
+
+//==================================================
+// um_fild03 - Kalala Swamp
+//==================================================
+um_fild03.gat,0,0,0,0 monster Parasite 1500,60,0,0,0
+um_fild03.gat,0,0,0,0 monster Dragon Tail 1321,45,0,0,0
+um_fild03.gat,0,0,0,0 monster Alligator 1271,15,0,0,0
+um_fild03.gat,0,0,0,0 monster Stainer 1174,10,0,0,0
+um_fild03.gat,0,0,0,0 monster Gryphon 1259,1,3500000,1900000,0
+um_fild03.gat,0,0,0,0 monster Pest 1256,2,0,0,0
+um_fild03.gat,0,0,0,0 monster Blue Plant 1079,5,180000,90000,1
+um_fild03.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+um_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,180000,90000,1
+
+//==================================================
+// um_fild04 - Hoomga Jungle
+//==================================================
+um_fild04.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+um_fild04.gat,0,0,0,0 monster Horn 1128,15,0,0,0
+um_fild04.gat,0,0,0,0 monster Choco 1214,2,0,0,0
+um_fild04.gat,0,0,0,0 monster Wootan Shooter 1498,7,0,0,0
+um_fild04.gat,264,293,10,10 monster Beetle King 1494,4,120000,60000,0
+um_fild04.gat,264,293,10,10 monster Horn 1128,2,1200000,60000,0
+um_fild04.gat,121,239,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,91,79,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,91,79,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild04.gat,244,339,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,295,93,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,295,93,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild04.gat,118,237,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,118,237,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,311,285,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,311,285,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,206,188,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,206,188,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Beetle King 1494,2,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Horn 1128,1,120000,60000,0
+um_fild04.gat,239,245,10,10 monster Wootan Shooter 1498,1,300000,60000,0
+um_fild04.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+um_fild04.gat,0,0,0,0 monster Yellow Plant 1081,5,180000,90000,1
diff --git a/npc/mobs/fields/yuno.txt b/npc/mobs/fields/yuno.txt
index 61627e6c9..b764230c1 100644
--- a/npc/mobs/fields/yuno.txt
+++ b/npc/mobs/fields/yuno.txt
@@ -1,176 +1,176 @@
-//===== eAthena Script =======================================
-//= Yuno Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 fixed tabs, names [Lupus]
-//= 1.2 New/Better Spawn [Muad_Dib]
-//= 1.3 Fix Up [Darkchild]
-//= 1.4 Updated monster spawns. Many thanks to vicious_pucca for
-//= providing the information [MasterOfMuppets]
-//= 1.5 Updated after Episode 10.4 - Hugel [Poki#3]
-//= Mob quantity is custom.
-//= 1.5b Changed the spawn numbers a bit. [Poki#3]
-//= Thanks to Playtester and Emperium.org
-//= 1.6 Fixed Yuno Field 10. Mob amount sugested by Playtester [Poki#3]
-//= 1.7 Updated by using Tharis' Homun AI, by Tharis [Vicious]
-//= 1.8 Added kRO 10.1 spawns where they fit [Playtester]
-//============================================================
-
-//==================================================
-// yuno_fild01 - Border Posts
-//==================================================
-yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-yuno_fild01.gat,190,329,80,20 monster Grand Peco 1369,3,50000,25000,0
-yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
-yuno_fild01.gat,70,370,10,10 monster Blue Plant 1079,2,1800000,900000,1
-yuno_fild01.gat,70,370,10,10 monster Shining Plant 1083,1,1800000,900000,1
-yuno_fild01.gat,66,267,10,10 monster Yellow Plant 1081,2,1800000,900000,1
-yuno_fild01.gat,238,326,40,40 monster Yellow Plant 1081,6,1800000,900000,1
-yuno_fild01.gat,238,326,40,40 monster Shining Plant 1083,2,1800000,900000,1
-yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
-yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,20,1800000,900000,1
-
-//==================================================
-// yuno_fild02 - Kiel Khayr's Cottage
-//==================================================
-yuno_fild02.gat,0,0,0,0 monster Horn 1128,40,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Beetle King 1494,35,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Petite 1155,10,0,0,0
-yuno_fild02.gat,200,350,200,50 monster Deleter 1384,10,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
-yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
-yuno_fild02.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-
-//==================================================
-// yuno_fild03 - El Mes Plateau
-//==================================================
-yuno_fild03.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Marin 1242,20,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
-yuno_fild03.gat,62,131,44,15 monster Side Winder 1037,1,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
-yuno_fild03.gat,0,0,0,0 monster Deviling 1582,1,3600000,1800000,1
-yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
-yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
-yuno_fild03.gat,0,0,0,0 monster Green Plant 1080,15,1800000,900000,1
-yuno_fild03.gat,358,215,10,10 monster Shining Plant 1083,1,1800000,900000,1
-yuno_fild03.gat,358,215,10,10 monster Blue Plant 1079,4,1800000,900000,1
-
-//==================================================
-// yuno_fild04 - El Mes Plateau
-//==================================================
-yuno_fild04.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Condor 1009,20,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
-yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
-yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
-yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
-
-//==================================================
-// yuno_fild05 - El Mes Plateau
-//==================================================
-yuno_fild05.gat,0,0,0,0 monster Rafflesia 1162,70,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Horn 1128,30,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
-yuno_fild05.gat,0,0,0,0 monster Arc Angeling 1388,1,3600000,180000,0
-yuno_fild05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild05.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild05.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,0
-yuno_fild05.gat,176,202,8,8 monster Blue Plant 1079,2,180000,90000,1
-yuno_fild05.gat,300,280,5,5 monster Blue Plant 1079,2,180000,90000,1
-
-//==================================================
-// yuno_fild06 - Yuno Field
-//==================================================
-yuno_fild06.gat,0,0,0,0 monster Sleeper 1386,70,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Goat 1372,40,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
-yuno_fild06.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
-
-//==================================================
-// yuno_fild07 - El Mes Gorge (Valley of Abyss)
-//==================================================
-yuno_fild07.gat,0,0,0,0 monster Goat 1372,10,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Driller 1380,10,0,0,0
-yuno_fild07.gat,0,0,0,0 monster Harpy 1376,40,1800000,900000,0
-yuno_fild07.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild07.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// yuno_fild08 - Kiel Khayr's Academy
-//==================================================
-yuno_fild08.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Grand Peco 1369,30,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Grand Peco 1369,20,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Grand Peco 1369,30,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Geographer 1368,12,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Geographer 1368,6,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Geographer 1368,12,0,0,0
-yuno_fild08.gat,200,300,290,100 monster Dustiness 1114,7,0,0,0
-yuno_fild08.gat,272,205,100,120 monster Dustiness 1114,6,0,0,0
-yuno_fild08.gat,230,110,250,90 monster Dustiness 1114,7,0,0,0
-yuno_fild08.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild08.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// yuno_fild09 - Schwaltzwald Guards Camp
-//==================================================
-yuno_fild09.gat,0,0,0,0 monster Horn 1128,40,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
-yuno_fild09.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild09.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// yuno_fild10 - Yuno Field
-//==================================================
-yuno_fild10.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild10.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-
-//==================================================
-// yuno_fild11 - Yuno Field
-//==================================================
-yuno_fild11.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Geographer 1368,3,0,0,0
-yuno_fild11.gat,65,294,70,160 monster Sleeper 1386,5,0,0,0
-yuno_fild11.gat,65,294,70,160 monster Geographer 1368,2,0,0,0
-yuno_fild11.gat,225,220,125,135 monster Sleeper 1386,35,0,0,0
-yuno_fild11.gat,225,220,125,135 monster Geographer 1368,15,0,0,0
-yuno_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild11.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
-
-//==================================================
-// yuno_fild12 - Border Checkpoint
-//==================================================
-yuno_fild12.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-yuno_fild12.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
+//===== eAthena Script =======================================
+//= Yuno Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 fixed tabs, names [Lupus]
+//= 1.2 New/Better Spawn [Muad_Dib]
+//= 1.3 Fix Up [Darkchild]
+//= 1.4 Updated monster spawns. Many thanks to vicious_pucca for
+//= providing the information [MasterOfMuppets]
+//= 1.5 Updated after Episode 10.4 - Hugel [Poki#3]
+//= Mob quantity is custom.
+//= 1.5b Changed the spawn numbers a bit. [Poki#3]
+//= Thanks to Playtester and Emperium.org
+//= 1.6 Fixed Yuno Field 10. Mob amount sugested by Playtester [Poki#3]
+//= 1.7 Updated by using Tharis' Homun AI, by Tharis [Vicious]
+//= 1.8 Added kRO 10.1 spawns where they fit [Playtester]
+//============================================================
+
+//==================================================
+// yuno_fild01 - Border Posts
+//==================================================
+yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+yuno_fild01.gat,190,329,80,20 monster Grand Peco 1369,3,50000,25000,0
+yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
+yuno_fild01.gat,70,370,10,10 monster Blue Plant 1079,2,1800000,900000,1
+yuno_fild01.gat,70,370,10,10 monster Shining Plant 1083,1,1800000,900000,1
+yuno_fild01.gat,66,267,10,10 monster Yellow Plant 1081,2,1800000,900000,1
+yuno_fild01.gat,238,326,40,40 monster Yellow Plant 1081,6,1800000,900000,1
+yuno_fild01.gat,238,326,40,40 monster Shining Plant 1083,2,1800000,900000,1
+yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
+yuno_fild01.gat,0,0,0,0 monster Green Plant 1080,20,1800000,900000,1
+
+//==================================================
+// yuno_fild02 - Kiel Khayr's Cottage
+//==================================================
+yuno_fild02.gat,0,0,0,0 monster Horn 1128,40,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Beetle King 1494,35,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Petite 1155,10,0,0,0
+yuno_fild02.gat,200,350,200,50 monster Deleter 1384,10,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
+yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
+yuno_fild02.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+
+//==================================================
+// yuno_fild03 - El Mes Plateau
+//==================================================
+yuno_fild03.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Marin 1242,20,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Geographer 1368,15,0,0,0
+yuno_fild03.gat,62,131,44,15 monster Side Winder 1037,1,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
+yuno_fild03.gat,0,0,0,0 monster Deviling 1582,1,3600000,1800000,1
+yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,1800000,900000,1
+yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,15,1800000,900000,1
+yuno_fild03.gat,0,0,0,0 monster Green Plant 1080,15,1800000,900000,1
+yuno_fild03.gat,358,215,10,10 monster Shining Plant 1083,1,1800000,900000,1
+yuno_fild03.gat,358,215,10,10 monster Blue Plant 1079,4,1800000,900000,1
+
+//==================================================
+// yuno_fild04 - El Mes Plateau
+//==================================================
+yuno_fild04.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Drops 1113,40,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Condor 1009,20,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Pupa 1008,10,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Mastering 1090,1,3600000,1800000,1
+yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,1800000,900000,1
+yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,1800000,900000,1
+yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,1800000,900000,1
+
+//==================================================
+// yuno_fild05 - El Mes Plateau
+//==================================================
+yuno_fild05.gat,0,0,0,0 monster Rafflesia 1162,70,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Horn 1128,30,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Beetle King 1494,10,0,0,0
+yuno_fild05.gat,0,0,0,0 monster Arc Angeling 1388,1,3600000,180000,0
+yuno_fild05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild05.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild05.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,0
+yuno_fild05.gat,176,202,8,8 monster Blue Plant 1079,2,180000,90000,1
+yuno_fild05.gat,300,280,5,5 monster Blue Plant 1079,2,180000,90000,1
+
+//==================================================
+// yuno_fild06 - Yuno Field
+//==================================================
+yuno_fild06.gat,0,0,0,0 monster Sleeper 1386,70,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Goat 1372,40,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Red Plant 1078,10,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,0
+yuno_fild06.gat,0,0,0,0 monster Green Plant 1080,10,0,0,0
+
+//==================================================
+// yuno_fild07 - El Mes Gorge (Valley of Abyss)
+//==================================================
+yuno_fild07.gat,0,0,0,0 monster Goat 1372,10,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Driller 1380,10,0,0,0
+yuno_fild07.gat,0,0,0,0 monster Harpy 1376,40,1800000,900000,0
+yuno_fild07.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild07.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild07.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// yuno_fild08 - Kiel Khayr's Academy
+//==================================================
+yuno_fild08.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Grand Peco 1369,30,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Grand Peco 1369,20,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Grand Peco 1369,30,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Geographer 1368,12,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Geographer 1368,6,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Geographer 1368,12,0,0,0
+yuno_fild08.gat,200,300,290,100 monster Dustiness 1114,7,0,0,0
+yuno_fild08.gat,272,205,100,120 monster Dustiness 1114,6,0,0,0
+yuno_fild08.gat,230,110,250,90 monster Dustiness 1114,7,0,0,0
+yuno_fild08.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild08.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild08.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// yuno_fild09 - Schwaltzwald Guards Camp
+//==================================================
+yuno_fild09.gat,0,0,0,0 monster Horn 1128,40,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Beetle King 1494,30,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Wild Rose 1261,5,0,0,0
+yuno_fild09.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild09.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild09.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// yuno_fild10 - Yuno Field
+//==================================================
+yuno_fild10.gat,0,0,0,0 monster Beetle King 1494,40,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Stainer 1174,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild10.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+
+//==================================================
+// yuno_fild11 - Yuno Field
+//==================================================
+yuno_fild11.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Geographer 1368,3,0,0,0
+yuno_fild11.gat,65,294,70,160 monster Sleeper 1386,5,0,0,0
+yuno_fild11.gat,65,294,70,160 monster Geographer 1368,2,0,0,0
+yuno_fild11.gat,225,220,125,135 monster Sleeper 1386,35,0,0,0
+yuno_fild11.gat,225,220,125,135 monster Geographer 1368,15,0,0,0
+yuno_fild11.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild11.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild11.gat,0,0,0,0 monster Yellow Plant 1081,10,180000,90000,1
+
+//==================================================
+// yuno_fild12 - Border Checkpoint
+//==================================================
+yuno_fild12.gat,0,0,0,0 monster Dustiness 1114,30,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+yuno_fild12.gat,0,0,0,0 monster Geographer 1368,5,0,0,0
diff --git a/npc/mobs/pvp.txt b/npc/mobs/pvp.txt
index 2d29bf574..6a3437f0f 100644
--- a/npc/mobs/pvp.txt
+++ b/npc/mobs/pvp.txt
@@ -1,40 +1,40 @@
-//===== eAthena Script =======================================
-//= PvP Nightmare Rooms Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//==================================================
-// pvp_n_8-1 - PvP : Room Sandwich
-//==================================================
-pvp_n_8-1.gat,0,0,0,0 monster Side Winder 1037,2,360000,180000,1
-pvp_n_8-1.gat,0,0,0,0 monster Bigfoot 1060,2,360000,180000,1
-
-//==================================================
-// pvp_n_8-2 - PvP : Room Rock On
-//==================================================
-pvp_n_8-2.gat,0,0,0,0 monster Cramp 1209,4,360000,180000,1
-
-//==================================================
-// pvp_n_8-3 - PvP : Four Room
-//==================================================
-pvp_n_8-3.gat,0,0,0,0 monster Whisper 1179,3,360000,180000,1
-pvp_n_8-3.gat,0,0,0,0 monster Giant Whisper 1186,2,360000,180000,1
-
-//==================================================
-// pvp_n_8-4 - PvP : Room Undercross
-//==================================================
-pvp_n_8-4.gat,0,0,0,0 monster Zombie 1015,4,360000,180000,1
-pvp_n_8-4.gat,0,0,0,0 monster Ghoul 1036,3,360000,180000,1
-
-//==================================================
-// pvp_n_8-5 - PvP : Room Copass
-//==================================================
-pvp_n_8-5.gat,0,0,0,0 monster Khalitzburg 1132,1,360000,180000,1
-pvp_n_8-5.gat,0,0,0,0 monster Raydric 1163,2,360000,180000,1
+//===== eAthena Script =======================================
+//= PvP Nightmare Rooms Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//==================================================
+// pvp_n_8-1 - PvP : Room Sandwich
+//==================================================
+pvp_n_8-1.gat,0,0,0,0 monster Side Winder 1037,2,360000,180000,1
+pvp_n_8-1.gat,0,0,0,0 monster Bigfoot 1060,2,360000,180000,1
+
+//==================================================
+// pvp_n_8-2 - PvP : Room Rock On
+//==================================================
+pvp_n_8-2.gat,0,0,0,0 monster Cramp 1209,4,360000,180000,1
+
+//==================================================
+// pvp_n_8-3 - PvP : Four Room
+//==================================================
+pvp_n_8-3.gat,0,0,0,0 monster Whisper 1179,3,360000,180000,1
+pvp_n_8-3.gat,0,0,0,0 monster Giant Whisper 1186,2,360000,180000,1
+
+//==================================================
+// pvp_n_8-4 - PvP : Room Undercross
+//==================================================
+pvp_n_8-4.gat,0,0,0,0 monster Zombie 1015,4,360000,180000,1
+pvp_n_8-4.gat,0,0,0,0 monster Ghoul 1036,3,360000,180000,1
+
+//==================================================
+// pvp_n_8-5 - PvP : Room Copass
+//==================================================
+pvp_n_8-5.gat,0,0,0,0 monster Khalitzburg 1132,1,360000,180000,1
+pvp_n_8-5.gat,0,0,0,0 monster Raydric 1163,2,360000,180000,1
diff --git a/npc/other/Global_Functions.txt b/npc/other/Global_Functions.txt
index 6d2d145c4..d8a8f4d93 100644
--- a/npc/other/Global_Functions.txt
+++ b/npc/other/Global_Functions.txt
@@ -1,486 +1,486 @@
-//===== eAthena Script =======================================
-//= Global Functions
-//===== By: ==================================================
-//= Lupus, kobra_k88
-//===== Current Version: =====================================
-//= 2.08
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Added F_ClearJobVar - on getting a new job it clears all Job Quest variables
-//= Removed individual job check functions as they were redundant [kobra_k88]
-//= 1.3 Added Job Change Function for Baby/Normal Classes
-//= 1.3b a fix, due to const.txt change [Lupus]
-//= 1.4 Added Is_Taekwon_Class: Taekwondo, Star Knight(Gladiator),Soul Linker [Lupus]
-//= 1.5 Added clear of Bard Quest variables. 1.5a updated [Lupus]
-//= 1.6 Added F_RandMes, F_SexMes, F_Hi, F_Bye functions [Lupus]
-//= Moved here useful function 'getJobName'
-//= 1.7 Added "F_ItemName" function, added a great sample for "F_ItemName"
-//= 1.8 Added Job Vars clear for Extended classes: TK,SL,SG [Lupus]
-//= 1.9 Added "F_ClearGarbage" func that clears outdated, wasted variables [Lupus]
-//= 1.91 Added "F_SaveQuestSkills","F_Load?Skills" functions [Lupus]
-//= 2.0 Fixed F_Save/LoadQuestSkills functions. Had to split in into 2 vars [Lupus]
-//= 2.01 Added $talk to F_ClearGarbage [Evera]
-//= 2.02 Added $dtsglobalelig and $dts|(1<<6) to F_ClearGarbage [Evera]
-//= 2.03 Added Gunslinger vars to F_ClearJobVar [Lupus]
-//= 2.04 Added dtseligible 2 (becomes MISC_QUEST|128) to F_ClearGarbage [Evera]
-//= 2.05 Book of Devil -> MISC_QUEST|256, clear other Niflheim garbage vars [Lupus]
-//= +more garbage clean
-//= 2.06 Pass to Bio-Lab -> MISC_QUEST|512 [Lupus]
-//= 2.07 Added TK_Q variable clear [Lupus]
-//- 2.08 Added NINJ_Q variable clear [Lupus]
-//============================================================
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// Function that clears job quest variables
-//////////////////////////////////////////////////////////////////////////////////
-
-function script F_ClearJobVar {
- // Misc ---------------------------------
- set JBLVL,0;
- set FIRSTAID,0;
- set PLAYDEAD,0;
- set got_bandage,0;
- set got_novnametag,0;
- // First Class Jobs ---------------------
- set job_acolyte_q,0; set job_acolyte_q2,0;
- set job_archer_q,0;
- set job_magician_q,0;
- set job_merchant_q,0; set job_merchant_q2,0; set job_merchant_q3,0;
- set job_sword_q,0; set SWTEST, 0;
- set job_thief_q,0;
- // Super Novice
- set SUPNOV_Q,0;
- // 2-1 Jobs ------------------------------
- set ASSIN_Q,0; set ASSIN_Q2,0;
- set BSMITH_Q,0; set BSMITH_Q2,0;
- set HNTR_Q,0; set HNTR_Q2,0;
- set KNIGHT_Q,0; set KNIGHT_Q2,0;
- set PRIEST_Q,0; set PRIEST_Q2,0; set PRIEST_Q3,0;
- set WIZ_Q,0; set WIZ_Q2,0;
- // 2-2 Jobs ------------------------------
- set ROGUE_Q,0; set ROGUE_Q2,0;
- set ALCH_Q,0; set ALCH_Q2,0;
- set CRUS_Q,0;
- set MONK_Q,0; set JOB_MONK_C,0;
- set SAGE_Q,0; set SAGE_Q2,0;
- set DANC_Q,0;
- set BARD_Q,0;
- // Extended Classes
- set TAEK_Q,0; set TK_Q,0;
- set STGL_Q,0;
- set SOUL_Q,0;
- set GUNS_Q,0;
- set NINJ_Q,0;
- return;
-}
-
-function script F_ClearGarbage {
- // Clear outdated global VARS
- //DTS Vote System
- if($dtsglobalelig) set $dtsglobalelig,0;
- if($dts&(1<<6)) set $dts,$dts&~(1<<6);
- //Cube Room
- if(hzdun) {
- set MISC_QUEST,MISC_QUEST|512;
- set num1,0; set num2,0; set num3,0; set num4,0; set num5,0;
- set num6,0; set num7,0; set num8,0; set num9,0;
- set hzdun,0; set cubekey,0; set piciburn,0;
- }
- //Airship
- if($lengths){
- cleararray $textstringsa$[0],"",getarraysize($textstringsa$);
- cleararray $textstringsb$[0],"",getarraysize($textstringsb$);
- cleararray $textstringsc$[0],"",getarraysize($textstringsc$);
- cleararray $compstring$[0],"",getarraysize($compstring$);
- cleararray $lengths[0],0,getarraysize($lengths);
- }
- //Shinkskas Quest garbage
- if(Shinokas_Quest > 7){
- set ein_scientist,0;
- set ein_stuff,0;
- }
- return;
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// Used in REBIRTH scripts
-// Class = Internal Class ID
-// BaseJob = Base Job (0..23)
-// Upper : 0 - Default, 1 - Advanced, 2 - Baby
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Job_Change {
- if (Upper<2)
- jobchange getarg(0); // Common jobchange
- else
- jobchange getarg(0) + Job_Baby; //Change Job For Baby Class
- logmes "CLASS CHANGE: " +strcharinfo(0)+ " become a "+jobname(Class);
- return;
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// FOT BACKWISE COMPATIBILITY: Functions used to check a players job class
-// HOW TO USE:
-// i.e. We need all holy classes but monks
-// if ( callfunc("Is_Holy_Class") && callfunc("Is_Monk")==0 ) goto L_Start;
-//////////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Aco,Monk,Priest,Aco High,High Priest,
-// Champion, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Holy_Class {
- return ( BaseJob==Job_Acolyte || BaseJob==Job_Priest || BaseJob==Job_Monk );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Archer,Hunter,Bard,Dancer,Archer High,Sniper,
-// Clown,Gypsy, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Bow_Class {
- return ( BaseJob==Job_Archer || BaseJob==Job_Hunter || BaseJob==Job_Bard || BaseJob==Job_Dancer );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Mage,Wizard,Sage,Mage High,High Wizard,
-// Professor, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Magic_Class {
- return ( BaseJob==Job_Mage || BaseJob==Job_Wizard || BaseJob==Job_Sage );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Merc,Blacksmith,Alchemist,Merc High,
-// Whitesmith,Creator, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Merc_Class {
- return ( BaseJob==Job_Merchant || BaseJob==Job_Blacksmith || BaseJob==Job_Alchem );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Thief,Assassin,Rogue,Thief High, Assassin Cross
-// Stalker, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Thief_Class {
- return ( BaseJob==Job_Thief || BaseJob==Job_Assassin || BaseJob==Job_Rogue );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Swordy,Knight,Crusader,Swordy High,
-// Lord Knight,Paladin, 0 otherwise
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Sword_Class {
- return ( BaseJob==Job_Swordman || BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// returns 1 if the player is either Taekwon, Star Gladiator,Soul Linker, 0 otherwise
-// these classes can't be adopted nor reborn ()
-//////////////////////////////////////////////////////////////////////////////////
-
-function script Is_Taekwon_Class {
- return ( Class==Job_Taekwon || Class==Job_Star_Gladiator || Class==Job_Star_Gladiator2 || Class==Job_Soul_Linker );
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// Functions used to spiff up dialoges [Lupus]
-//////////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_RandMes"
-//////////////////////////////////////////////////////////////////////////////////
-//returns random string
-// Example: check F_Bye or F_Hi functions
-// READ AND THINK: You can use it to pick a random number form list:
-// set @itemIDfromList, callfunc("F_RandMes",8,1129,1222,1163,1357,1360,1522,1811,1410);
-
-function script F_RandMes {
- return getarg(rand(1,getarg(0)));
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_Sex"
-//////////////////////////////////////////////////////////////////////////////////
-//returns 1st string if female, 2nd string otherwise
-// Example: mes callfunc("F_Sex","What a beautiful lady!","What a handsom man!");
-
-function script F_SexMes {
- return getarg(Sex);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_Hi"
-//////////////////////////////////////////////////////////////////////////////////
-//returns random HELLO message
-
-function script F_Hi {
- return callfunc("F_RandMes",5,"Hi!","Hello!","Good day!","How are you?","Hello there.");
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_Bye"
-//////////////////////////////////////////////////////////////////////////////////
-//returns random BYE message
-
-function script F_Bye {
- return callfunc("F_RandMes",6,"Bye. See you again.","Later.","Goodbye.","Good luck!","Have a nice day!","Byebye!!!");
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_ItemName"
-//////////////////////////////////////////////////////////////////////////////////
-// Returns expanded item name string
-//Argumentss
-// 0 - Item ID
-// 1 - Element N (0=none,1=Ice,2=Earth,3=Fire,4=Wind)
-// 2 - VVS meter 0..3
-// 3 - Refine
-// Example: mes "Show me your "+callfunc("F_ItemName",1201,1,2,5)+"...";
-// is equal to: mes "Show me your ^000090 +5 VVS Fire Knife ^000000..."
-
-function script F_ItemName {
- set @t$,"^000090";
- if(getarg(3)) set @t$,@t$+"+"+getarg(3)+" ";
- if(getarg(2)==1) set @t$,@t$+"VS ";
- if(getarg(2)==2) set @t$,@t$+"VVS ";
- if(getarg(2)==3) set @t$,@t$+"VVVS ";
- if(getarg(2)>3) set @t$,@t$+getarg(2)+"xVS ";
- if(getarg(1)==1) set @t$,@t$+"Ice ";
- if(getarg(1)==2) set @t$,@t$+"Earth ";
- if(getarg(1)==3) set @t$,@t$+"Fire ";
- if(getarg(1)==4) set @t$,@t$+"Wind ";
- if(getarg(1)>4) set @t$,@t$+"Strange ";
- return @t$+getitemname(getarg(0))+"^000000";
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "getJobName" //
-// [Usage] : callfunc("getJobName",Class); //
-//////////////////////////////////////////////////////////////////////////////////
-
-function script getJobName {
- switch(getarg(0)){
- case Job_Novice:
- return "Novice";
- case Job_Swordman:
- return "Swordman";
- case Job_Mage:
- return "Magician";
- case Job_Archer:
- return "Archer";
- case Job_Acolyte:
- return "Acolyte";
- case Job_Merchant:
- return "Merchant";
- case Job_Thief:
- return "Thief";
- case Job_Knight:
- case Job_Knight2:
- return "Knight";
- case Job_Priest:
- return "Priest";
- case Job_Wizard:
- return "Wizard";
- case Job_Blacksmith:
- return "Blacksmith";
- case Job_Hunter:
- return "Hunter";
- case Job_Assassin:
- return "Assassin";
- case Job_Crusader:
- case Job_Crusader2:
- return "Crusader";
- case Job_Monk:
- return "Monk";
- case Job_Sage:
- return "Sage";
- case Job_Rogue:
- return "Rogue";
- case Job_Alchem:
- return "Alchemist";
- case Job_Bard:
- return "Bard";
- case Job_Dancer:
- return "Dancer";
- case Job_SuperNovice:
- return "Super Novice";
- case Job_Gunslinger:
- return "Gunsligner";
- case Job_Ninja:
- return "Ninja";
- case Job_Xmas:
- return "Xmas";
- case Job_Novice_High:
- return "Novice High";
- case Job_Swordman_High:
- return "Swordman High";
- case Job_Mage_High:
- return "Magician High";
- case Job_Archer_High:
- return "Archer High";
- case Job_Acolyte_High:
- return "Acolyte High";
- case Job_Merchant_High:
- return "Merchant High";
- case Job_Thief_High:
- return "Thief High";
- case Job_Lord_Knight:
- case Job_Lord_Knight2:
- return "Lord Knight";
- case Job_High_Priest:
- return "High Priest";
- case Job_High_Wizard:
- return "High Wizard";
- case Job_Whitesmith:
- return "Whitesmith";
- case Job_Sniper:
- return "Sniper";
- case Job_Assassin_Cross:
- return "Assassin Cross";
- case Job_Paladin:
- case Job_Paladin2:
- return "Paladin";
- case Job_Champion:
- return "Champion";
- case Job_Professor:
- return "Professor";
- case Job_Stalker:
- return "Stalker";
- case Job_Creator:
- return "Creator";
- case Job_Clown:
- return "Clown";
- case Job_Gypsy:
- return "Gypsy";
- case Job_Baby:
- return "Baby";
- case Job_Baby_Swordman:
- return "Baby Swordman";
- case Job_Baby_Mage:
- return "Baby Magician";
- case Job_Baby_Archer:
- return "Baby Archer";
- case Job_Baby_Acolyte:
- return "Baby Acolyte";
- case Job_Baby_Merchant:
- return "Baby Merchant";
- case Job_Baby_Thief:
- return "Baby Thief";
- case Job_Baby_Knight:
- case Job_Baby_Knight2:
- return "Baby Knight";
- case Job_Baby_Priest:
- return "Baby Priest";
- case Job_Baby_Wizard:
- return "Baby Wizard";
- case Job_Baby_Blacksmith:
- return "Baby Blacksmith";
- case Job_Baby_Hunter:
- return "Baby Hunter";
- case Job_Baby_Assassin:
- return "Baby Assassin";
- case Job_Baby_Crusader:
- case Job_Baby_Crusader2:
- return "Baby Crusader";
- case Job_Baby_Monk:
- return "Baby Monk";
- case Job_Baby_Sage:
- return "Baby Sage";
- case Job_Baby_Rogue:
- return "Baby Rogue";
- case Job_Baby_Alchem:
- return "Baby Alchemist";
- case Job_Baby_Bard:
- return "Baby Bard";
- case Job_Baby_Dancer:
- return "Baby Dancer";
- case Job_Super_Baby:
- return "Super Baby";
- case Job_Taekwon:
- if(Sex == 0)
- return "Taekwon Girl";
- else
- return "Taekwon Boy";
- case Job_Star_Gladiator:
- case Job_Star_Gladiator2:
- return "Star Gladiator";
- case Job_Soul_Linker:
- return "Soul Linker";
- case Job_Ninja:
- return "Ninja";
- case Job_Gunslinger:
- return "Gunslinger";
- case Job_Xmas:
- return "Christmas";
- case Option_Wedding:
- if(Sex == 0)
- return "Bride";
- else
- return "Bridegroom";
- default:
- return "omghaxor";
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_SaveQuestSkills": Store learnt quest skills
-//////////////////////////////////////////////////////////////////////////////////
-function script F_SaveQuestSkills {
- set ADV_QSK,0; set ADV_QSK2,0;
- //1st classes quest skills
- for(set @i, 0; @i < 14; set @i, @i + 1){
- if(getskilllv(144+@i)) set ADV_QSK,ADV_QSK|pow(2,@i);
- }
- //2nd classes quest skills
- for(set @i, 0; @i < 19; set @i, @i + 1){
- if(getskilllv(1001+@i)) set ADV_QSK2,ADV_QSK2|pow(2,@i);
- }
- return;
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_Load1Skills": Restore learnt 1st class quest skills
-//////////////////////////////////////////////////////////////////////////////////
-function script F_Load1Skills {
- //1st classes quest skills
- for(set @i, 0; @i < 14; set @i, @i + 1){
- if(ADV_QSK|pow(2,@i) == ADV_QSK) skill 144+@i,1,0;
- }
- set ADV_QSK,0; //Clear var
- return;
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// *** Function "F_Load2Skills": Restore learnt 2nd class quest skills
-//////////////////////////////////////////////////////////////////////////////////
-function script F_Load2Skills {
- //2nd classes quest skills
- for(set @i, 0; @i < 19; set @i, @i + 1){
- if(ADV_QSK2|pow(2,@i) == ADV_QSK2) skill 1001+@i,1,0;
- }
- set ADV_QSK2,0; //Clear var
- return;
+//===== eAthena Script =======================================
+//= Global Functions
+//===== By: ==================================================
+//= Lupus, kobra_k88
+//===== Current Version: =====================================
+//= 2.08
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Added F_ClearJobVar - on getting a new job it clears all Job Quest variables
+//= Removed individual job check functions as they were redundant [kobra_k88]
+//= 1.3 Added Job Change Function for Baby/Normal Classes
+//= 1.3b a fix, due to const.txt change [Lupus]
+//= 1.4 Added Is_Taekwon_Class: Taekwondo, Star Knight(Gladiator),Soul Linker [Lupus]
+//= 1.5 Added clear of Bard Quest variables. 1.5a updated [Lupus]
+//= 1.6 Added F_RandMes, F_SexMes, F_Hi, F_Bye functions [Lupus]
+//= Moved here useful function 'getJobName'
+//= 1.7 Added "F_ItemName" function, added a great sample for "F_ItemName"
+//= 1.8 Added Job Vars clear for Extended classes: TK,SL,SG [Lupus]
+//= 1.9 Added "F_ClearGarbage" func that clears outdated, wasted variables [Lupus]
+//= 1.91 Added "F_SaveQuestSkills","F_Load?Skills" functions [Lupus]
+//= 2.0 Fixed F_Save/LoadQuestSkills functions. Had to split in into 2 vars [Lupus]
+//= 2.01 Added $talk to F_ClearGarbage [Evera]
+//= 2.02 Added $dtsglobalelig and $dts|(1<<6) to F_ClearGarbage [Evera]
+//= 2.03 Added Gunslinger vars to F_ClearJobVar [Lupus]
+//= 2.04 Added dtseligible 2 (becomes MISC_QUEST|128) to F_ClearGarbage [Evera]
+//= 2.05 Book of Devil -> MISC_QUEST|256, clear other Niflheim garbage vars [Lupus]
+//= +more garbage clean
+//= 2.06 Pass to Bio-Lab -> MISC_QUEST|512 [Lupus]
+//= 2.07 Added TK_Q variable clear [Lupus]
+//- 2.08 Added NINJ_Q variable clear [Lupus]
+//============================================================
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// Function that clears job quest variables
+//////////////////////////////////////////////////////////////////////////////////
+
+function script F_ClearJobVar {
+ // Misc ---------------------------------
+ set JBLVL,0;
+ set FIRSTAID,0;
+ set PLAYDEAD,0;
+ set got_bandage,0;
+ set got_novnametag,0;
+ // First Class Jobs ---------------------
+ set job_acolyte_q,0; set job_acolyte_q2,0;
+ set job_archer_q,0;
+ set job_magician_q,0;
+ set job_merchant_q,0; set job_merchant_q2,0; set job_merchant_q3,0;
+ set job_sword_q,0; set SWTEST, 0;
+ set job_thief_q,0;
+ // Super Novice
+ set SUPNOV_Q,0;
+ // 2-1 Jobs ------------------------------
+ set ASSIN_Q,0; set ASSIN_Q2,0;
+ set BSMITH_Q,0; set BSMITH_Q2,0;
+ set HNTR_Q,0; set HNTR_Q2,0;
+ set KNIGHT_Q,0; set KNIGHT_Q2,0;
+ set PRIEST_Q,0; set PRIEST_Q2,0; set PRIEST_Q3,0;
+ set WIZ_Q,0; set WIZ_Q2,0;
+ // 2-2 Jobs ------------------------------
+ set ROGUE_Q,0; set ROGUE_Q2,0;
+ set ALCH_Q,0; set ALCH_Q2,0;
+ set CRUS_Q,0;
+ set MONK_Q,0; set JOB_MONK_C,0;
+ set SAGE_Q,0; set SAGE_Q2,0;
+ set DANC_Q,0;
+ set BARD_Q,0;
+ // Extended Classes
+ set TAEK_Q,0; set TK_Q,0;
+ set STGL_Q,0;
+ set SOUL_Q,0;
+ set GUNS_Q,0;
+ set NINJ_Q,0;
+ return;
+}
+
+function script F_ClearGarbage {
+ // Clear outdated global VARS
+ //DTS Vote System
+ if($dtsglobalelig) set $dtsglobalelig,0;
+ if($dts&(1<<6)) set $dts,$dts&~(1<<6);
+ //Cube Room
+ if(hzdun) {
+ set MISC_QUEST,MISC_QUEST|512;
+ set num1,0; set num2,0; set num3,0; set num4,0; set num5,0;
+ set num6,0; set num7,0; set num8,0; set num9,0;
+ set hzdun,0; set cubekey,0; set piciburn,0;
+ }
+ //Airship
+ if($lengths){
+ cleararray $textstringsa$[0],"",getarraysize($textstringsa$);
+ cleararray $textstringsb$[0],"",getarraysize($textstringsb$);
+ cleararray $textstringsc$[0],"",getarraysize($textstringsc$);
+ cleararray $compstring$[0],"",getarraysize($compstring$);
+ cleararray $lengths[0],0,getarraysize($lengths);
+ }
+ //Shinkskas Quest garbage
+ if(Shinokas_Quest > 7){
+ set ein_scientist,0;
+ set ein_stuff,0;
+ }
+ return;
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// Used in REBIRTH scripts
+// Class = Internal Class ID
+// BaseJob = Base Job (0..23)
+// Upper : 0 - Default, 1 - Advanced, 2 - Baby
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Job_Change {
+ if (Upper<2)
+ jobchange getarg(0); // Common jobchange
+ else
+ jobchange getarg(0) + Job_Baby; //Change Job For Baby Class
+ logmes "CLASS CHANGE: " +strcharinfo(0)+ " become a "+jobname(Class);
+ return;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// FOT BACKWISE COMPATIBILITY: Functions used to check a players job class
+// HOW TO USE:
+// i.e. We need all holy classes but monks
+// if ( callfunc("Is_Holy_Class") && callfunc("Is_Monk")==0 ) goto L_Start;
+//////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Aco,Monk,Priest,Aco High,High Priest,
+// Champion, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Holy_Class {
+ return ( BaseJob==Job_Acolyte || BaseJob==Job_Priest || BaseJob==Job_Monk );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Archer,Hunter,Bard,Dancer,Archer High,Sniper,
+// Clown,Gypsy, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Bow_Class {
+ return ( BaseJob==Job_Archer || BaseJob==Job_Hunter || BaseJob==Job_Bard || BaseJob==Job_Dancer );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Mage,Wizard,Sage,Mage High,High Wizard,
+// Professor, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Magic_Class {
+ return ( BaseJob==Job_Mage || BaseJob==Job_Wizard || BaseJob==Job_Sage );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Merc,Blacksmith,Alchemist,Merc High,
+// Whitesmith,Creator, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Merc_Class {
+ return ( BaseJob==Job_Merchant || BaseJob==Job_Blacksmith || BaseJob==Job_Alchem );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Thief,Assassin,Rogue,Thief High, Assassin Cross
+// Stalker, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Thief_Class {
+ return ( BaseJob==Job_Thief || BaseJob==Job_Assassin || BaseJob==Job_Rogue );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Swordy,Knight,Crusader,Swordy High,
+// Lord Knight,Paladin, 0 otherwise
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Sword_Class {
+ return ( BaseJob==Job_Swordman || BaseJob==Job_Knight || BaseJob==Job_Knight2 || BaseJob==Job_Crusader || BaseJob==Job_Crusader2 );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// returns 1 if the player is either Taekwon, Star Gladiator,Soul Linker, 0 otherwise
+// these classes can't be adopted nor reborn ()
+//////////////////////////////////////////////////////////////////////////////////
+
+function script Is_Taekwon_Class {
+ return ( Class==Job_Taekwon || Class==Job_Star_Gladiator || Class==Job_Star_Gladiator2 || Class==Job_Soul_Linker );
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// Functions used to spiff up dialoges [Lupus]
+//////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_RandMes"
+//////////////////////////////////////////////////////////////////////////////////
+//returns random string
+// Example: check F_Bye or F_Hi functions
+// READ AND THINK: You can use it to pick a random number form list:
+// set @itemIDfromList, callfunc("F_RandMes",8,1129,1222,1163,1357,1360,1522,1811,1410);
+
+function script F_RandMes {
+ return getarg(rand(1,getarg(0)));
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_Sex"
+//////////////////////////////////////////////////////////////////////////////////
+//returns 1st string if female, 2nd string otherwise
+// Example: mes callfunc("F_Sex","What a beautiful lady!","What a handsom man!");
+
+function script F_SexMes {
+ return getarg(Sex);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_Hi"
+//////////////////////////////////////////////////////////////////////////////////
+//returns random HELLO message
+
+function script F_Hi {
+ return callfunc("F_RandMes",5,"Hi!","Hello!","Good day!","How are you?","Hello there.");
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_Bye"
+//////////////////////////////////////////////////////////////////////////////////
+//returns random BYE message
+
+function script F_Bye {
+ return callfunc("F_RandMes",6,"Bye. See you again.","Later.","Goodbye.","Good luck!","Have a nice day!","Byebye!!!");
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_ItemName"
+//////////////////////////////////////////////////////////////////////////////////
+// Returns expanded item name string
+//Argumentss
+// 0 - Item ID
+// 1 - Element N (0=none,1=Ice,2=Earth,3=Fire,4=Wind)
+// 2 - VVS meter 0..3
+// 3 - Refine
+// Example: mes "Show me your "+callfunc("F_ItemName",1201,1,2,5)+"...";
+// is equal to: mes "Show me your ^000090 +5 VVS Fire Knife ^000000..."
+
+function script F_ItemName {
+ set @t$,"^000090";
+ if(getarg(3)) set @t$,@t$+"+"+getarg(3)+" ";
+ if(getarg(2)==1) set @t$,@t$+"VS ";
+ if(getarg(2)==2) set @t$,@t$+"VVS ";
+ if(getarg(2)==3) set @t$,@t$+"VVVS ";
+ if(getarg(2)>3) set @t$,@t$+getarg(2)+"xVS ";
+ if(getarg(1)==1) set @t$,@t$+"Ice ";
+ if(getarg(1)==2) set @t$,@t$+"Earth ";
+ if(getarg(1)==3) set @t$,@t$+"Fire ";
+ if(getarg(1)==4) set @t$,@t$+"Wind ";
+ if(getarg(1)>4) set @t$,@t$+"Strange ";
+ return @t$+getitemname(getarg(0))+"^000000";
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "getJobName" //
+// [Usage] : callfunc("getJobName",Class); //
+//////////////////////////////////////////////////////////////////////////////////
+
+function script getJobName {
+ switch(getarg(0)){
+ case Job_Novice:
+ return "Novice";
+ case Job_Swordman:
+ return "Swordman";
+ case Job_Mage:
+ return "Magician";
+ case Job_Archer:
+ return "Archer";
+ case Job_Acolyte:
+ return "Acolyte";
+ case Job_Merchant:
+ return "Merchant";
+ case Job_Thief:
+ return "Thief";
+ case Job_Knight:
+ case Job_Knight2:
+ return "Knight";
+ case Job_Priest:
+ return "Priest";
+ case Job_Wizard:
+ return "Wizard";
+ case Job_Blacksmith:
+ return "Blacksmith";
+ case Job_Hunter:
+ return "Hunter";
+ case Job_Assassin:
+ return "Assassin";
+ case Job_Crusader:
+ case Job_Crusader2:
+ return "Crusader";
+ case Job_Monk:
+ return "Monk";
+ case Job_Sage:
+ return "Sage";
+ case Job_Rogue:
+ return "Rogue";
+ case Job_Alchem:
+ return "Alchemist";
+ case Job_Bard:
+ return "Bard";
+ case Job_Dancer:
+ return "Dancer";
+ case Job_SuperNovice:
+ return "Super Novice";
+ case Job_Gunslinger:
+ return "Gunsligner";
+ case Job_Ninja:
+ return "Ninja";
+ case Job_Xmas:
+ return "Xmas";
+ case Job_Novice_High:
+ return "Novice High";
+ case Job_Swordman_High:
+ return "Swordman High";
+ case Job_Mage_High:
+ return "Magician High";
+ case Job_Archer_High:
+ return "Archer High";
+ case Job_Acolyte_High:
+ return "Acolyte High";
+ case Job_Merchant_High:
+ return "Merchant High";
+ case Job_Thief_High:
+ return "Thief High";
+ case Job_Lord_Knight:
+ case Job_Lord_Knight2:
+ return "Lord Knight";
+ case Job_High_Priest:
+ return "High Priest";
+ case Job_High_Wizard:
+ return "High Wizard";
+ case Job_Whitesmith:
+ return "Whitesmith";
+ case Job_Sniper:
+ return "Sniper";
+ case Job_Assassin_Cross:
+ return "Assassin Cross";
+ case Job_Paladin:
+ case Job_Paladin2:
+ return "Paladin";
+ case Job_Champion:
+ return "Champion";
+ case Job_Professor:
+ return "Professor";
+ case Job_Stalker:
+ return "Stalker";
+ case Job_Creator:
+ return "Creator";
+ case Job_Clown:
+ return "Clown";
+ case Job_Gypsy:
+ return "Gypsy";
+ case Job_Baby:
+ return "Baby";
+ case Job_Baby_Swordman:
+ return "Baby Swordman";
+ case Job_Baby_Mage:
+ return "Baby Magician";
+ case Job_Baby_Archer:
+ return "Baby Archer";
+ case Job_Baby_Acolyte:
+ return "Baby Acolyte";
+ case Job_Baby_Merchant:
+ return "Baby Merchant";
+ case Job_Baby_Thief:
+ return "Baby Thief";
+ case Job_Baby_Knight:
+ case Job_Baby_Knight2:
+ return "Baby Knight";
+ case Job_Baby_Priest:
+ return "Baby Priest";
+ case Job_Baby_Wizard:
+ return "Baby Wizard";
+ case Job_Baby_Blacksmith:
+ return "Baby Blacksmith";
+ case Job_Baby_Hunter:
+ return "Baby Hunter";
+ case Job_Baby_Assassin:
+ return "Baby Assassin";
+ case Job_Baby_Crusader:
+ case Job_Baby_Crusader2:
+ return "Baby Crusader";
+ case Job_Baby_Monk:
+ return "Baby Monk";
+ case Job_Baby_Sage:
+ return "Baby Sage";
+ case Job_Baby_Rogue:
+ return "Baby Rogue";
+ case Job_Baby_Alchem:
+ return "Baby Alchemist";
+ case Job_Baby_Bard:
+ return "Baby Bard";
+ case Job_Baby_Dancer:
+ return "Baby Dancer";
+ case Job_Super_Baby:
+ return "Super Baby";
+ case Job_Taekwon:
+ if(Sex == 0)
+ return "Taekwon Girl";
+ else
+ return "Taekwon Boy";
+ case Job_Star_Gladiator:
+ case Job_Star_Gladiator2:
+ return "Star Gladiator";
+ case Job_Soul_Linker:
+ return "Soul Linker";
+ case Job_Ninja:
+ return "Ninja";
+ case Job_Gunslinger:
+ return "Gunslinger";
+ case Job_Xmas:
+ return "Christmas";
+ case Option_Wedding:
+ if(Sex == 0)
+ return "Bride";
+ else
+ return "Bridegroom";
+ default:
+ return "omghaxor";
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_SaveQuestSkills": Store learnt quest skills
+//////////////////////////////////////////////////////////////////////////////////
+function script F_SaveQuestSkills {
+ set ADV_QSK,0; set ADV_QSK2,0;
+ //1st classes quest skills
+ for(set @i, 0; @i < 14; set @i, @i + 1){
+ if(getskilllv(144+@i)) set ADV_QSK,ADV_QSK|pow(2,@i);
+ }
+ //2nd classes quest skills
+ for(set @i, 0; @i < 19; set @i, @i + 1){
+ if(getskilllv(1001+@i)) set ADV_QSK2,ADV_QSK2|pow(2,@i);
+ }
+ return;
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_Load1Skills": Restore learnt 1st class quest skills
+//////////////////////////////////////////////////////////////////////////////////
+function script F_Load1Skills {
+ //1st classes quest skills
+ for(set @i, 0; @i < 14; set @i, @i + 1){
+ if(ADV_QSK|pow(2,@i) == ADV_QSK) skill 144+@i,1,0;
+ }
+ set ADV_QSK,0; //Clear var
+ return;
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// *** Function "F_Load2Skills": Restore learnt 2nd class quest skills
+//////////////////////////////////////////////////////////////////////////////////
+function script F_Load2Skills {
+ //2nd classes quest skills
+ for(set @i, 0; @i < 19; set @i, @i + 1){
+ if(ADV_QSK2|pow(2,@i) == ADV_QSK2) skill 1001+@i,1,0;
+ }
+ set ADV_QSK2,0; //Clear var
+ return;
} \ No newline at end of file
diff --git a/npc/other/arena.txt b/npc/other/arena.txt
index 26e47415c..919d9ad27 100644
--- a/npc/other/arena.txt
+++ b/npc/other/arena.txt
@@ -1,654 +1,654 @@
-// ------------------------------------------------------------------
-// Setup Of Arena
-// ------------------------------------------------------------------
-
-// The following maps are used
-//map: prontera.gat
-//map: prt_are_in.gat
-//map: force_1-1.gat
-
-// Disallow Teleport, etc.
-force_1-1.gat mapflag pvp dummy
-force_1-2.gat mapflag pvp dummy
-force_1-3.gat mapflag pvp dummy
-force_2-1.gat mapflag pvp dummy
-force_2-2.gat mapflag pvp dummy
-force_2-3.gat mapflag pvp dummy
-force_3-1.gat mapflag pvp dummy
-force_3-2.gat mapflag pvp dummy
-force_3-3.gat mapflag pvp dummy
-prt_are_in.gat mapflag nomemo dummy
-prt_are_in.gat mapflag noteleport dummy
-prt_are_in.gat mapflag nosave prontera.gat,156,191
-force_1-1.gat mapflag nomemo dummy
-force_1-1.gat mapflag noteleport dummy
-force_1-1.gat mapflag nosave prontera.gat,156,191
-
-// An entrance is placed in Prontera.
-prontera.gat,160,185,3 script Arena Entrance 116,{
- mes "Want to go to the arena?";
- next;
- menu "Let's go!",L_GOARENA,"Nah..",L_YAME;
-L_GOARENA:
- warp "prt_are_in.gat",31,82;
- close;
-L_YAME:
- close;
-}
-
-// Teleport from waiting room to ready room
-prt_are_in.gat,29,79,0 script Time Attack 116,{
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
-
- mes "This is the Time Attack selection.";
- mes "Please choose your challenge.";
- menu "Level 1 - 5 Porings, 30 secs!",L_GOLV1,"Level 2 - 7 Roda Frogs, 60 secs!",L_GOLV2,"Level 3 - 9 PecoPecos, 100 secs!",L_GOLV3,"Never mind.",L_YAME;
-L_GOLV1:
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
- disablenpc "fc103-1";
- disablenpc "fc105";
- disablenpc "fc107";
- addtimer 5000,"arenalv1st";
- warp "force_1-1.gat",99,12;
- end;
-L_GOLV2:
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
- disablenpc "fc103-1";
- disablenpc "fc105";
- disablenpc "fc107";
- addtimer 5000,"arenalv2st";
- warp "force_1-1.gat",99,12;
- end;
-L_GOLV3:
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
- disablenpc "fc103-1";
- disablenpc "fc105";
- disablenpc "fc107";
- addtimer 5000,"arenalv3st";
- warp "force_1-1.gat",99,12;
- end;
-L_WAIT:
- mes "Since the arena is in use,";
- mes "please wait for a while.";
-L_YAME:
- close;
-}
-
-
-// Ready room (10-second preparation)
-force_1-1.gat,99,12,0 script arenalv1st -1,{
- announce "It will begin in 10 seconds!",3;
- addtimer 10000,"arenalv1fgt";
-}
-force_1-1.gat,99,12,0 script arenalv2st -1,{
- announce "It will begin in 10 seconds!",3;
- addtimer 10000,"arenalv2fgt";
-}
-force_1-1.gat,99,12,0 script arenalv3st -1,{
- announce "It will begin in 10 seconds!",3;
- addtimer 10000,"arenalv3fgt";
-}
-
-
-// Transmission to the room, and mob organization
-//Time Attack Level 1
-force_1-1.gat,99,12,0 script arenalv1fgt -1,{
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",25,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
- set $arena00,5;
- disablenpc "fc101";
- disablenpc "fc103";
- warp "force_1-1.gat",25,26;
- enablenpc "fc103-1";
- enablenpc "fc105";
- enablenpc "fc107";
- announce "Do it within 30 seconds!",19;
- addtimer 30000,"arenalv1fail";
- addtimer 20000,"tensecsleft";
-arenalv1mon:
- end;
-}
-
-//Time Attack Level 2
-force_1-1.gat,99,12,0 script arenalv2fgt -1,{
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",20,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",20,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",30,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",30,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
- set $arena00,7;
- disablenpc "fc101";
- disablenpc "fc103";
- warp "force_1-1.gat",25,26;
- enablenpc "fc103-1";
- enablenpc "fc105";
- enablenpc "fc107";
- announce "You have 60 seconds to destroy all seven!",19;
- addtimer 60000,"arenalv2fail";
- addtimer 50000,"tensecsleft";
-arenalv2mon:
- end;
-}
-
-//Time Attack Level 3
-force_1-1.gat,99,12,0 script arenalv3fgt -1,{
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",20,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",20,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",30,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",30,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",25,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- monster "force_1-1.gat",20,35,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
- set $arena00,9;
- disablenpc "fc101";
- disablenpc "fc103";
- warp "force_1-1.gat",25,26;
- enablenpc "fc103-1";
- enablenpc "fc105";
- enablenpc "fc107";
- announce "You have 90 seconds to destroy all nine!",19;
- addtimer 90000,"arenalv3fail";
- addtimer 80000,"tensecsleft";
-arenalv3mon:
- end;
-}
-
-// Pushed-down Processing
-//Time Attack Level 1
-force_1-1.gat,25,26,0 script arenalv1mon -1,{
- set $arena00, $arena00 - 1;
- if( $arena00 > 0 ) goto L_CONT;
- deltimer "arenaev8000";
- announce "Crash!!",3;
- enablenpc "fc101";
- enablenpc "fc103";
- areaannounce "force_1-1.gat",0,0,350,350,
- "You cleared Time Attack Level 1.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- areaannounce "gonryun.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 1.",0;
- addtimer 5000,"arenareturn";
-L_CONT:
- end;
-}
-
-force_1-1.gat,25,26,0 script arenalv2mon -1,{
- set $arena00, $arena00 - 1;
- if( $arena00 > 0 ) goto L_CONT;
- deltimer "arenaev8000";
- announce "Crash!!",3;
- enablenpc "fc101";
- enablenpc "fc103";
- areaannounce "force_1-1.gat",0,0,350,350,
- "You cleared Time Attack Level 2.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- areaannounce "gonryun.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 2.",0;
- addtimer 5000,"arenareturn";
-L_CONT:
- end;
-}
-
-
-force_1-1.gat,25,26,0 script arenalv3mon -1,{
- set $arena00, $arena00 - 1;
- if( $arena00 > 0 ) goto L_CONT;
- deltimer "arenaev8000";
- announce "Crash!!",3;
- enablenpc "fc101";
- enablenpc "fc103";
- areaannounce "force_1-1.gat",0,0,350,350,
- "You cleared Time Attack Level 3.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- areaannounce "gonryun.gat",0,0,350,350,
- strcharinfo(0) + " cleared Time Attack Level 3.",0;
- addtimer 5000,"arenareturn";
-L_CONT:
- end;
-}
-
-// Timeout
-force_1-1.gat,25,26,0 script arenalv1fail -1,{
- set $arena00,99;
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- announce "Time Over!!",3;
- areaannounce "force_1-1.gat",0,0,350,350,
- "You failed Time Attack Level 1.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- areaannounce "gonryun",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 1.",0;
- addtimer 5000,"arenareturn";
-}
-
-force_1-1.gat,25,26,0 script arenalv2fail -1,{
- set $arena00,99;
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- announce "Time Over!!",3;
- areaannounce "force_1-1.gat",0,0,350,350,
- "You failed Time Attack Level 2.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- areaannounce "gonryun",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 2.",0;
- addtimer 5000,"arenareturn";
-}
-
-force_1-1.gat,25,26,0 script arenalv3fail -1,{
- set $arena00,99;
- killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
- killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
- killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
- announce "Time Over!!",3;
- areaannounce "force_1-1.gat",0,0,350,350,
- "You failed Time Attack Level 2.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prontera.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "morocc.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "geffen.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payon.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "alberta.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "izlude.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "aldebaran.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prt_are_in.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "xmas.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "comodo.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prt_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prtg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prtg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prtg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prtg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "prtg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "pay_gld.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payg_cas01.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payg_cas02.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payg_cas03.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payg_cas04.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "payg_cas05.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "yuno.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "amatsu.gat",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- areaannounce "gonryun",0,0,350,350,
- strcharinfo(0) + " failed Time Attack Level 3.",0;
- addtimer 5000,"arenareturn";
-}
-
-// Reminding the player of time constraints.
-force_1-1.gat,25,26,0 script tensecsleft -1,{
- announce "Ten seconds remaining!",3;
-}
-
-
-// Return to Prontera
-force_1-1.gat,25,26,0 script arenareturn -1,{
- warp "prontera.gat",156,191;
-}
-
-//Time Limit Mode
-force_1-1.gat,25,44,0 warp fc101 1,1,force_1-1.gat,25,69
-force_1-1.gat,25,65,0 warp fc101-1 1,1,force_1-1.gat,25,40
-force_1-1.gat,25,134,0 warp fc102 1,1,force_1-1.gat,25,159
-force_1-1.gat,25,155,0 warp fc102-1 1,1,force_1-1.gat,25,130
-force_1-1.gat,44,26,0 warp fc103 1,1,force_1-1.gat,66,26
-force_1-1.gat,62,26,0 warp fc103-1 1,1,force_1-1.gat,40,26
-force_1-1.gat,44,174,0 warp fc104 1,1,force_1-1.gat,69,174
-force_1-1.gat,65,174,0 warp fc104-1 1,1,force_1-1.gat,40,174
-force_1-1.gat,99,54,0 warp fc105 1,1,force_1-1.gat,96,82
-force_1-1.gat,100,81,0 warp fc105-1 1,1,force_1-1.gat,99,51
-force_1-1.gat,134,174,0 warp fc106 1,1,force_1-1.gat,159,174
-force_1-1.gat,155,174,0 warp fc106-1 1,1,force_1-1.gat,130,174
-force_1-1.gat,137,26,0 warp fc107 1,1,force_1-1.gat,159,26
-force_1-1.gat,155,26,0 warp fc107-1 1,1,force_1-1.gat,132,26
-force_1-1.gat,174,44,0 warp fc108 1,1,force_1-1.gat,174,69
-force_1-1.gat,174,65,0 warp fc108-1 1,1,force_1-1.gat,174,40
-force_1-1.gat,174,134,0 warp fc109 1,1,force_1-1.gat,174,159
-force_1-1.gat,174,155,0 warp fc109-1 1,1,force_1-1.gat,174,130
-force_1-2.gat,25,93,0 warp fc201 1,1,force_1-2.gat,25,118
-force_1-2.gat,25,114,0 warp fc201-1 1,1,force_1-2.gat,25,89
-force_1-2.gat,33,178,0 warp fc202 1,1,force_1-2.gat,59,178
-force_1-2.gat,55,178,0 warp fc202-1 1,1,force_1-2.gat,29,178
-force_1-2.gat,41,26,0 warp fc203 1,1,force_1-2.gat,89,26
-force_1-2.gat,85,26,0 warp fc203-1 1,1,force_1-2.gat,37,26
-force_1-2.gat,41,78,0 warp fc204 1,1,force_1-2.gat,88,78
-force_1-2.gat,84,78,0 warp fc204-1 1,1,force_1-2.gat,37,78
-force_1-2.gat,49,130,0 warp fc205 1,1,force_1-2.gat,91,125
-force_1-2.gat,91,129,0 warp fc205-1 1,1,force_1-2.gat,49,134
-force_1-2.gat,95,187,0 warp fc206 1,1,force_1-2.gat,107,141
-force_1-2.gat,107,145,0 warp fc206-1 1,1,force_1-2.gat,95,183
-force_1-2.gat,99,40,0 warp fc207 1,1,force_1-2.gat,99,66
-force_1-2.gat,99,62,0 warp fc207-1 1,1,force_1-2.gat,99,36
-force_1-2.gat,114,26,0 warp fc208 1,1,force_1-2.gat,162,26
-force_1-2.gat,158,26,0 warp fc208-1 1,1,force_1-2.gat,110,26
-force_1-2.gat,115,78,0 warp fc209 1,1,force_1-2.gat,162,78
-force_1-2.gat,158,78,0 warp fc209-1 1,1,force_1-2.gat,111,78
-force_1-2.gat,137,178,0 warp fc210 1,1,force_1-2.gat,162,178
-force_1-2.gat,158,178,0 warp fc210-1 1,1,force_1-2.gat,133,178
-force_1-2.gat,173,93,0 warp fc211 1,1,force_1-2.gat,173,118
-force_1-2.gat,173,114,0 warp fc211-1 1,1,force_1-2.gat,173,89
-force_1-3.gat,10,100,0 warp fc301 1,1,force_1-3.gat,25,180
-force_1-3.gat,29,180,0 warp fc301-1 1,1,force_1-3.gat,14,100
-force_1-3.gat,19,10,0 warp fc302 1,1,force_1-3.gat,19,185
-force_1-3.gat,19,189,0 warp fc302-1 1,1,force_1-3.gat,19,14
-force_1-3.gat,19,29,0 warp fc303 1,1,force_1-3.gat,19,54
-force_1-3.gat,19,50,0 warp fc303-1 1,1,force_1-3.gat,19,25
-force_1-3.gat,19,147,0 warp fc304 1,1,force_1-3.gat,179,94
-force_1-3.gat,179,90,0 warp fc304-1 1,1,force_1-3.gat,19,143
-force_1-3.gat,29,100,0 warp fc305 1,1,force_1-3.gat,174,180
-force_1-3.gat,170,180,0 warp fc305-1 1,1,force_1-3.gat,24,100
-force_1-3.gat,59,29,0 warp fc306 1,1,force_1-3.gat,99,132
-force_1-3.gat,99,128,0 warp fc306-1 1,1,force_1-3.gat,59,25
-force_1-3.gat,59,69,0 warp fc307 1,1,force_1-3.gat,59,94
-force_1-3.gat,59,90,0 warp fc307-1 1,1,force_1-3.gat,59,65
-force_1-3.gat,59,109,0 warp fc308 1,1,force_1-3.gat,139,54
-force_1-3.gat,139,50,0 warp fc308-1 1,1,force_1-3.gat,59,105
-force_1-3.gat,59,128,0 warp fc309 1,1,force_1-3.gat,139,105
-force_1-3.gat,139,109,0 warp fc309-1 1,1,force_1-3.gat,59,132
-force_1-3.gat,69,20,0 warp fc310 1,1,force_1-3.gat,134,100
-force_1-3.gat,130,100,0 warp fc310-1 1,1,force_1-3.gat,65,20
-force_1-3.gat,69,60,0 warp fc311 1,1,force_1-3.gat,94,60
-force_1-3.gat,90,60,0 warp fc311-1 1,1,force_1-3.gat,65,60
-force_1-3.gat,69,138,0 warp fc312 1,1,force_1-3.gat,174,60
-force_1-3.gat,170,60,0 warp fc312-1 1,1,force_1-3.gat,65,138
-force_1-3.gat,99,147,0 warp fc313 1,1,force_1-3.gat,99,168
-force_1-3.gat,99,164,0 warp fc313-1 1,1,force_1-3.gat,99,143
-force_1-3.gat,109,60,0 warp fc314 1,1,force_1-3.gat,134,20
-force_1-3.gat,130,20,0 warp fc314-1 1,1,force_1-3.gat,105,60
-force_1-3.gat,109,100,0 warp fc315 1,1,force_1-3.gat,174,100
-force_1-3.gat,170,100,0 warp fc315-1 1,1,force_1-3.gat,105,100
-force_1-3.gat,109,138,0 warp fc316 1,1,force_1-3.gat,134,138
-force_1-3.gat,130,138,0 warp fc316-1 1,1,force_1-3.gat,105,138
-force_1-3.gat,139,147,0 warp fc317 1,1,force_1-3.gat,179,174
-force_1-3.gat,179,170,0 warp fc317-1 1,1,force_1-3.gat,139,143
-force_1-3.gat,179,29,0 warp fc318 1,1,force_1-3.gat,179,54
-force_1-3.gat,179,50,0 warp fc318-1 1,1,force_1-3.gat,179,25
-force_1-3.gat,179,109,0 warp fc319 1,1,force_1-3.gat,179,132
-force_1-3.gat,179,128,0 warp fc319-1 1,1,force_1-3.gat,179,105
+// ------------------------------------------------------------------
+// Setup Of Arena
+// ------------------------------------------------------------------
+
+// The following maps are used
+//map: prontera.gat
+//map: prt_are_in.gat
+//map: force_1-1.gat
+
+// Disallow Teleport, etc.
+force_1-1.gat mapflag pvp dummy
+force_1-2.gat mapflag pvp dummy
+force_1-3.gat mapflag pvp dummy
+force_2-1.gat mapflag pvp dummy
+force_2-2.gat mapflag pvp dummy
+force_2-3.gat mapflag pvp dummy
+force_3-1.gat mapflag pvp dummy
+force_3-2.gat mapflag pvp dummy
+force_3-3.gat mapflag pvp dummy
+prt_are_in.gat mapflag nomemo dummy
+prt_are_in.gat mapflag noteleport dummy
+prt_are_in.gat mapflag nosave prontera.gat,156,191
+force_1-1.gat mapflag nomemo dummy
+force_1-1.gat mapflag noteleport dummy
+force_1-1.gat mapflag nosave prontera.gat,156,191
+
+// An entrance is placed in Prontera.
+prontera.gat,160,185,3 script Arena Entrance 116,{
+ mes "Want to go to the arena?";
+ next;
+ menu "Let's go!",L_GOARENA,"Nah..",L_YAME;
+L_GOARENA:
+ warp "prt_are_in.gat",31,82;
+ close;
+L_YAME:
+ close;
+}
+
+// Teleport from waiting room to ready room
+prt_are_in.gat,29,79,0 script Time Attack 116,{
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+
+ mes "This is the Time Attack selection.";
+ mes "Please choose your challenge.";
+ menu "Level 1 - 5 Porings, 30 secs!",L_GOLV1,"Level 2 - 7 Roda Frogs, 60 secs!",L_GOLV2,"Level 3 - 9 PecoPecos, 100 secs!",L_GOLV3,"Never mind.",L_YAME;
+L_GOLV1:
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+ disablenpc "fc103-1";
+ disablenpc "fc105";
+ disablenpc "fc107";
+ addtimer 5000,"arenalv1st";
+ warp "force_1-1.gat",99,12;
+ end;
+L_GOLV2:
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+ disablenpc "fc103-1";
+ disablenpc "fc105";
+ disablenpc "fc107";
+ addtimer 5000,"arenalv2st";
+ warp "force_1-1.gat",99,12;
+ end;
+L_GOLV3:
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+ disablenpc "fc103-1";
+ disablenpc "fc105";
+ disablenpc "fc107";
+ addtimer 5000,"arenalv3st";
+ warp "force_1-1.gat",99,12;
+ end;
+L_WAIT:
+ mes "Since the arena is in use,";
+ mes "please wait for a while.";
+L_YAME:
+ close;
+}
+
+
+// Ready room (10-second preparation)
+force_1-1.gat,99,12,0 script arenalv1st -1,{
+ announce "It will begin in 10 seconds!",3;
+ addtimer 10000,"arenalv1fgt";
+}
+force_1-1.gat,99,12,0 script arenalv2st -1,{
+ announce "It will begin in 10 seconds!",3;
+ addtimer 10000,"arenalv2fgt";
+}
+force_1-1.gat,99,12,0 script arenalv3st -1,{
+ announce "It will begin in 10 seconds!",3;
+ addtimer 10000,"arenalv3fgt";
+}
+
+
+// Transmission to the room, and mob organization
+//Time Attack Level 1
+force_1-1.gat,99,12,0 script arenalv1fgt -1,{
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",25,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1002,1,"arenalv1fgt::arenalv1mon";
+ set $arena00,5;
+ disablenpc "fc101";
+ disablenpc "fc103";
+ warp "force_1-1.gat",25,26;
+ enablenpc "fc103-1";
+ enablenpc "fc105";
+ enablenpc "fc107";
+ announce "Do it within 30 seconds!",19;
+ addtimer 30000,"arenalv1fail";
+ addtimer 20000,"tensecsleft";
+arenalv1mon:
+ end;
+}
+
+//Time Attack Level 2
+force_1-1.gat,99,12,0 script arenalv2fgt -1,{
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",20,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",20,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",30,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",30,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1012,1,"arenalv2fgt::arenalv2mon";
+ set $arena00,7;
+ disablenpc "fc101";
+ disablenpc "fc103";
+ warp "force_1-1.gat",25,26;
+ enablenpc "fc103-1";
+ enablenpc "fc105";
+ enablenpc "fc107";
+ announce "You have 60 seconds to destroy all seven!",19;
+ addtimer 60000,"arenalv2fail";
+ addtimer 50000,"tensecsleft";
+arenalv2mon:
+ end;
+}
+
+//Time Attack Level 3
+force_1-1.gat,99,12,0 script arenalv3fgt -1,{
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",20,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",20,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",30,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",30,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",25,25,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ monster "force_1-1.gat",20,35,"Arena Enemy",1019,1,"arenalv3fgt::arenalv3mon";
+ set $arena00,9;
+ disablenpc "fc101";
+ disablenpc "fc103";
+ warp "force_1-1.gat",25,26;
+ enablenpc "fc103-1";
+ enablenpc "fc105";
+ enablenpc "fc107";
+ announce "You have 90 seconds to destroy all nine!",19;
+ addtimer 90000,"arenalv3fail";
+ addtimer 80000,"tensecsleft";
+arenalv3mon:
+ end;
+}
+
+// Pushed-down Processing
+//Time Attack Level 1
+force_1-1.gat,25,26,0 script arenalv1mon -1,{
+ set $arena00, $arena00 - 1;
+ if( $arena00 > 0 ) goto L_CONT;
+ deltimer "arenaev8000";
+ announce "Crash!!",3;
+ enablenpc "fc101";
+ enablenpc "fc103";
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You cleared Time Attack Level 1.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ areaannounce "gonryun.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 1.",0;
+ addtimer 5000,"arenareturn";
+L_CONT:
+ end;
+}
+
+force_1-1.gat,25,26,0 script arenalv2mon -1,{
+ set $arena00, $arena00 - 1;
+ if( $arena00 > 0 ) goto L_CONT;
+ deltimer "arenaev8000";
+ announce "Crash!!",3;
+ enablenpc "fc101";
+ enablenpc "fc103";
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You cleared Time Attack Level 2.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ areaannounce "gonryun.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 2.",0;
+ addtimer 5000,"arenareturn";
+L_CONT:
+ end;
+}
+
+
+force_1-1.gat,25,26,0 script arenalv3mon -1,{
+ set $arena00, $arena00 - 1;
+ if( $arena00 > 0 ) goto L_CONT;
+ deltimer "arenaev8000";
+ announce "Crash!!",3;
+ enablenpc "fc101";
+ enablenpc "fc103";
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You cleared Time Attack Level 3.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ areaannounce "gonryun.gat",0,0,350,350,
+ strcharinfo(0) + " cleared Time Attack Level 3.",0;
+ addtimer 5000,"arenareturn";
+L_CONT:
+ end;
+}
+
+// Timeout
+force_1-1.gat,25,26,0 script arenalv1fail -1,{
+ set $arena00,99;
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ announce "Time Over!!",3;
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You failed Time Attack Level 1.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ areaannounce "gonryun",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 1.",0;
+ addtimer 5000,"arenareturn";
+}
+
+force_1-1.gat,25,26,0 script arenalv2fail -1,{
+ set $arena00,99;
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ announce "Time Over!!",3;
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You failed Time Attack Level 2.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ areaannounce "gonryun",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 2.",0;
+ addtimer 5000,"arenareturn";
+}
+
+force_1-1.gat,25,26,0 script arenalv3fail -1,{
+ set $arena00,99;
+ killmonster "force_1-1.gat","arenalv1fgt::arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2fgt::arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3fgt::arenalv3mon";
+ announce "Time Over!!",3;
+ areaannounce "force_1-1.gat",0,0,350,350,
+ "You failed Time Attack Level 2.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prontera.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "morocc.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "geffen.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payon.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "alberta.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "izlude.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "aldebaran.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prt_are_in.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "xmas.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "comodo.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prt_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prtg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prtg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prtg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prtg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "prtg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "pay_gld.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payg_cas01.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payg_cas02.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payg_cas03.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payg_cas04.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "payg_cas05.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "yuno.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "amatsu.gat",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ areaannounce "gonryun",0,0,350,350,
+ strcharinfo(0) + " failed Time Attack Level 3.",0;
+ addtimer 5000,"arenareturn";
+}
+
+// Reminding the player of time constraints.
+force_1-1.gat,25,26,0 script tensecsleft -1,{
+ announce "Ten seconds remaining!",3;
+}
+
+
+// Return to Prontera
+force_1-1.gat,25,26,0 script arenareturn -1,{
+ warp "prontera.gat",156,191;
+}
+
+//Time Limit Mode
+force_1-1.gat,25,44,0 warp fc101 1,1,force_1-1.gat,25,69
+force_1-1.gat,25,65,0 warp fc101-1 1,1,force_1-1.gat,25,40
+force_1-1.gat,25,134,0 warp fc102 1,1,force_1-1.gat,25,159
+force_1-1.gat,25,155,0 warp fc102-1 1,1,force_1-1.gat,25,130
+force_1-1.gat,44,26,0 warp fc103 1,1,force_1-1.gat,66,26
+force_1-1.gat,62,26,0 warp fc103-1 1,1,force_1-1.gat,40,26
+force_1-1.gat,44,174,0 warp fc104 1,1,force_1-1.gat,69,174
+force_1-1.gat,65,174,0 warp fc104-1 1,1,force_1-1.gat,40,174
+force_1-1.gat,99,54,0 warp fc105 1,1,force_1-1.gat,96,82
+force_1-1.gat,100,81,0 warp fc105-1 1,1,force_1-1.gat,99,51
+force_1-1.gat,134,174,0 warp fc106 1,1,force_1-1.gat,159,174
+force_1-1.gat,155,174,0 warp fc106-1 1,1,force_1-1.gat,130,174
+force_1-1.gat,137,26,0 warp fc107 1,1,force_1-1.gat,159,26
+force_1-1.gat,155,26,0 warp fc107-1 1,1,force_1-1.gat,132,26
+force_1-1.gat,174,44,0 warp fc108 1,1,force_1-1.gat,174,69
+force_1-1.gat,174,65,0 warp fc108-1 1,1,force_1-1.gat,174,40
+force_1-1.gat,174,134,0 warp fc109 1,1,force_1-1.gat,174,159
+force_1-1.gat,174,155,0 warp fc109-1 1,1,force_1-1.gat,174,130
+force_1-2.gat,25,93,0 warp fc201 1,1,force_1-2.gat,25,118
+force_1-2.gat,25,114,0 warp fc201-1 1,1,force_1-2.gat,25,89
+force_1-2.gat,33,178,0 warp fc202 1,1,force_1-2.gat,59,178
+force_1-2.gat,55,178,0 warp fc202-1 1,1,force_1-2.gat,29,178
+force_1-2.gat,41,26,0 warp fc203 1,1,force_1-2.gat,89,26
+force_1-2.gat,85,26,0 warp fc203-1 1,1,force_1-2.gat,37,26
+force_1-2.gat,41,78,0 warp fc204 1,1,force_1-2.gat,88,78
+force_1-2.gat,84,78,0 warp fc204-1 1,1,force_1-2.gat,37,78
+force_1-2.gat,49,130,0 warp fc205 1,1,force_1-2.gat,91,125
+force_1-2.gat,91,129,0 warp fc205-1 1,1,force_1-2.gat,49,134
+force_1-2.gat,95,187,0 warp fc206 1,1,force_1-2.gat,107,141
+force_1-2.gat,107,145,0 warp fc206-1 1,1,force_1-2.gat,95,183
+force_1-2.gat,99,40,0 warp fc207 1,1,force_1-2.gat,99,66
+force_1-2.gat,99,62,0 warp fc207-1 1,1,force_1-2.gat,99,36
+force_1-2.gat,114,26,0 warp fc208 1,1,force_1-2.gat,162,26
+force_1-2.gat,158,26,0 warp fc208-1 1,1,force_1-2.gat,110,26
+force_1-2.gat,115,78,0 warp fc209 1,1,force_1-2.gat,162,78
+force_1-2.gat,158,78,0 warp fc209-1 1,1,force_1-2.gat,111,78
+force_1-2.gat,137,178,0 warp fc210 1,1,force_1-2.gat,162,178
+force_1-2.gat,158,178,0 warp fc210-1 1,1,force_1-2.gat,133,178
+force_1-2.gat,173,93,0 warp fc211 1,1,force_1-2.gat,173,118
+force_1-2.gat,173,114,0 warp fc211-1 1,1,force_1-2.gat,173,89
+force_1-3.gat,10,100,0 warp fc301 1,1,force_1-3.gat,25,180
+force_1-3.gat,29,180,0 warp fc301-1 1,1,force_1-3.gat,14,100
+force_1-3.gat,19,10,0 warp fc302 1,1,force_1-3.gat,19,185
+force_1-3.gat,19,189,0 warp fc302-1 1,1,force_1-3.gat,19,14
+force_1-3.gat,19,29,0 warp fc303 1,1,force_1-3.gat,19,54
+force_1-3.gat,19,50,0 warp fc303-1 1,1,force_1-3.gat,19,25
+force_1-3.gat,19,147,0 warp fc304 1,1,force_1-3.gat,179,94
+force_1-3.gat,179,90,0 warp fc304-1 1,1,force_1-3.gat,19,143
+force_1-3.gat,29,100,0 warp fc305 1,1,force_1-3.gat,174,180
+force_1-3.gat,170,180,0 warp fc305-1 1,1,force_1-3.gat,24,100
+force_1-3.gat,59,29,0 warp fc306 1,1,force_1-3.gat,99,132
+force_1-3.gat,99,128,0 warp fc306-1 1,1,force_1-3.gat,59,25
+force_1-3.gat,59,69,0 warp fc307 1,1,force_1-3.gat,59,94
+force_1-3.gat,59,90,0 warp fc307-1 1,1,force_1-3.gat,59,65
+force_1-3.gat,59,109,0 warp fc308 1,1,force_1-3.gat,139,54
+force_1-3.gat,139,50,0 warp fc308-1 1,1,force_1-3.gat,59,105
+force_1-3.gat,59,128,0 warp fc309 1,1,force_1-3.gat,139,105
+force_1-3.gat,139,109,0 warp fc309-1 1,1,force_1-3.gat,59,132
+force_1-3.gat,69,20,0 warp fc310 1,1,force_1-3.gat,134,100
+force_1-3.gat,130,100,0 warp fc310-1 1,1,force_1-3.gat,65,20
+force_1-3.gat,69,60,0 warp fc311 1,1,force_1-3.gat,94,60
+force_1-3.gat,90,60,0 warp fc311-1 1,1,force_1-3.gat,65,60
+force_1-3.gat,69,138,0 warp fc312 1,1,force_1-3.gat,174,60
+force_1-3.gat,170,60,0 warp fc312-1 1,1,force_1-3.gat,65,138
+force_1-3.gat,99,147,0 warp fc313 1,1,force_1-3.gat,99,168
+force_1-3.gat,99,164,0 warp fc313-1 1,1,force_1-3.gat,99,143
+force_1-3.gat,109,60,0 warp fc314 1,1,force_1-3.gat,134,20
+force_1-3.gat,130,20,0 warp fc314-1 1,1,force_1-3.gat,105,60
+force_1-3.gat,109,100,0 warp fc315 1,1,force_1-3.gat,174,100
+force_1-3.gat,170,100,0 warp fc315-1 1,1,force_1-3.gat,105,100
+force_1-3.gat,109,138,0 warp fc316 1,1,force_1-3.gat,134,138
+force_1-3.gat,130,138,0 warp fc316-1 1,1,force_1-3.gat,105,138
+force_1-3.gat,139,147,0 warp fc317 1,1,force_1-3.gat,179,174
+force_1-3.gat,179,170,0 warp fc317-1 1,1,force_1-3.gat,139,143
+force_1-3.gat,179,29,0 warp fc318 1,1,force_1-3.gat,179,54
+force_1-3.gat,179,50,0 warp fc318-1 1,1,force_1-3.gat,179,25
+force_1-3.gat,179,109,0 warp fc319 1,1,force_1-3.gat,179,132
+force_1-3.gat,179,128,0 warp fc319-1 1,1,force_1-3.gat,179,105
diff --git a/npc/other/books.txt b/npc/other/books.txt
index 6a74807e1..67d94625f 100644
--- a/npc/other/books.txt
+++ b/npc/other/books.txt
@@ -1,2292 +1,2292 @@
-// $Id: books.txt,v 1.1.1.1 2004/09/10 17:26:42 MagicalTux Exp $
-// Changed Mage Guild Book to the correct one (now located in mage.txt)
-// Fixed over 300 spelling/grammar mistakes. (I was that bored!) [Nexon]
-//<--------------- NPCs BOOKS [Update: July. 27, 2004] --------------->\\
-
-//<=========== Library - Begin ==========>\\
-prt_in.gat,159,56,4 script Monster Encyclopedia::me_prt_in 111,{
- mes "^FF0000[Monster Encyclopedia]^000000";
- mes "This is a Monster Encyclopedia including information of Earth,Fire,Neutral Monsters!";
- next;
- menu "Monsters of Earth Property",MonEarPro,"Monsters of Fire Property",MonFirPro,"Monsters of Neutral Property",MonNeuPro,"Cancel",Cancel;
-
- MonEarPro:
- menu "Small Size Monster",SmaMonEarPro,"Medium Size Monster",MedMonEarPro,"Great Size Monster",GrMonEarPro,"Cancel",EndMonEarPro;
-
- SmaMonEarPro:
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "1.Fabre";
- mes "Larva of Creamy. It is cute when it wiggles,even though it is a weak and small monster,";
- mes "People often tend to slay Fabres,only for the reason they can get `Feather's,one of required items for `Bunny Band'.";
- mes "^0099FFFound Items^000000: Feather. Fluff .Green Herb.Clover";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "2.Pupa";
- mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "3.Martin";
- mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
- mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "3.Savage Bebe";
- mes "Tiny Pink baby of Savage. Unlike its small size, It is running about fields making annoying noise.";
- mes "^0099FFFound Items^000000: Leather,Meat,Arrow,Feather";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "4.Andre";
- mes "A kind of Worker Ants,they are very diligent in their work. They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "5.Coco";
- mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
- mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "6.Piere";
- mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "7.Smokie";
- mes "It's working out all the time. Often tries to shape shift with Racoon Leaves,but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
- mes "^0099FFFound Items^000000: Raccon Leaf,Leather,Sweet Potato";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "8.Deniro";
- mes "A kind of Work Ants, tend to group in a same kind as well as other ants.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "9.Yoyo";
- mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the ground outrageously, but they are nimble and cooperative, you must be cautious of being attacked by a group.";
- mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "10.Vitata";
- mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
- mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "11.Caramel";
- mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immediately.";
- mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
- next;
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "12.Giearth";
- mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
- mes "^0099FFFound Items^000000: Old Pixie's Moustache";
- next;
- goto MonEarPro;
- close;
- MedMonEarPro:
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "1.Willow";
- mes "Creature reborn from a Gigantic Old Tree. Everything like the figure or the sound to related it is eerie.";
- mes "^0099FFFound Items^000000: Tree Root,Trunk,Red Herb,Sweet Potato";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "2.Rocker";
- mes "Lazy Grasshopper which loves playing Violin.";
- mes "^0099FFFound Items^000000: Grasshopper's Leg,Jellopy";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "3.Madragora";
- mes "Stays the same but attacks passengers using Stalks under the ground. Look so Horrible,also attacks Very annoyingly.";
- mes "^0099FFFound Items^000000: Stem,Green Herb,Shoot";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "4.Wolf";
- mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
- mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "5.Snake";
- mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
- mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "6.Horn";
- mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
- mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "7.Orc Warrior";
- mes "Self-Confident Warrior of the Orc Tribe.";
- mes "^0099FFFound Items^000000:Orcish Voucher";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "8.Hode";
- mes "Huge earthworm without any more description. Huge earthworm!Usually conceals itself under the ground,commonly found in the Desert.";
- mes "^0099FFFound Items^000000: Earthworm Peeling,Sticky Muscus";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "9.Mantis";
- mes "It wanders about the field waving a tiny fan.";
- mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "10.Savage";
- mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
- mes "^0099FFFound Items^000000: Mane,Leather";
- next;
- mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
- mes "11.Petite";
- mes "Tiny little Walking Dragon. It seems like there exists 2 different kinds of Petite, flying one and walking one and this is the 2nd one.";
- mes "^0099FFFound Items^000000: Dragon Canine,Dragon Tail,Zargon";
- next;
- goto MonEarPro;
- close;
- GrMonEarPro:
- mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
- mes "1.Worm Tail";
- mes "Tiny little creature of light green which has a spiky,thin and long stick on the back. Usually it is very gentle but attacks using the stick on the back when got attacked,so be careful!";
- mes "^0099FFFound Items^000000: Pointed Scale,Yellow Herb";
- next;
- mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
- mes "2.Muka";
- mes "Cute Cactus commonly found in the Desert. It tries to threaten passengers with some funny sound but always failed.";
- mes "^0099FFFound Items^000000: Cactus Needle,Empty Bottle,Green Herb,Red Herb";
- next;
- mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
- mes "3.Big Foot";
- mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
- mes "^0099FFFound Items^000000: Bear's Foot Skin,Leather,Sweet Potato";
- next;
- mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
- mes "4.Flora";
- mes "Man eater with a big mouth. It pretends just a simple plant but anybody coming near,it rushes into him fiercely.";
- mes "^0099FFFound Items^000000: Maneater Blossom,Stem";
- next;
- goto MonEarPro;
- close;
- EndMonEarPro:
- close;
- close;
- MonFirPro:
- menu "Small Size Monster",SmaMonFirPro,"Medium Size Monster",MedMonFirPro,"Great Size Monster",GrMonFirPro,"Cancel",EndMonFirPro;
-
- SmaMonFirPro:
- mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
- mes "1.Picky";
- mes "Cute little chick before Peco Peco. It can't be realized that this little creature grows into a Peco Peco the big,strong bird.";
- mes "Sometimes you can find a picky with an egg shell which is a bit stronger than a normal picky.";
- mes "^0099FFFound Items^000000: Feather of Birds. Feather. Red Herb. Milk.";
- next;
- mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
- mes "2.Baby Desert Wolf";
- mes "Baby of Desert Wolf,trying to threaten passengers with a big bay.";
- mes "If you want to pat one of them,because you think it is pretty,don't do that before taking a look around enough. Not babies come to rush you but their parents will assault you at the same time. Parents don't want their babies being harmed.";
- mes "^0099FFFound Items^000000: Leather,Meat";
- next;
- mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
- mes "3.Horong";
- mes "Eerie-looking fireball of violet colour. Recognises the living when gets near.";
- mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
- next;
- goto MonFirPro;
- close;
- MedMonFirPro:
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "1.Drops";
- mes "A kind of Poring,but commonly found in the Desert and colors in Pale Orange. It eats everything just like Poring does.";
- mes "However it seems to be a bit stronger than Poring anyway.";
- mes "^0099FFFound Items^000000: Jellopy,Sticky Muscus,Apple,Empty Bottle,Red Herb";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "2.Elder Willow";
- mes "A kind of Willow but it looks older and colors in red. Frightening as much as Willow.";
-
- mes "^0099FFFound Items^000000: Resin,Trunk,Sweet Potato";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "3.Metaller";
- mes "Evolved one of Rocker. It is dim brown and lives in the Desert. Lazy equally to Rocker,but it steals stuffs on the ground.";
- mes "^0099FFFound Items^000000: Red Blood,Grasshopper's Leg,Scell,Shell";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "4.Zerom";
- mes "Undead Slave who had been extremely abused before he died. He is wandering in the Sphinx,carrying a big box on the back..";
- mes "^0099FFFound Items^000000: Panties";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "5.Scorpion";
- mes "Scorpion spreaded over the Desert. It is dangerous as much as its beautiful colour. Watch out its sharp tail.";
- mes "^0099FFFound Items^000000: Scorpion Tail,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "6.Desert Wolf";
- mes "Wolf commonly found in the desert,which is stronger than a Forest one. Take a look around before doing attacks,because Wolf tends to be cooperative each other!";
- mes "^0099FFFound Items^000000: Leather,Mink Coat,Meat,Wolf Claw";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "7.Frilldora";
- mes "Lizard which has a Unique neck. Looks a bit funny but is very Strong unlike its appearance.";
- mes "^0099FFFound Items^000000: Frill,Reptile Tongue,Red Potion,Zargon";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "8.Cobold the 3rd";
- mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
- mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
- next;
- mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
- mes "9.Jakk";
- mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
- mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
- next;
- goto MonFirPro;
- close;
- GrMonFirPro:
- mes "^FF0000[Fire,Great Monster Encyclopedia]^000000";
- mes "1.Peco Peco";
- mes "Nowadays peco peco is popular as vehicle for knights. They lives in the Desert or Forest and also cooperative.";
- mes "^0099FFFound Items^000000: Bill of Birds,Yellow Herb,Red Herb";
- next;
- mes "^FF0000[Fire,Great Monster Encyclopedia]^000000";
- mes "2.Marduk";
- mes "Unknown monster wearing Catholic uniform and looking serious.";
- mes "^0099FFFound Items^000000: Flame Heart";
- next;
- goto MonFirPro;
- close;
- EndMonFirPro:
- close;
- close;
- MonNeuPro:
- menu "Small Size Monster",SmaMonNeuPro,"Medium Size Monster",MedMonNeuPro,"Great Size Monster",GrMonNeuPro,"Cancel",EndMonNeuPro;
-
- SmaMonNeuPro:
- mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
- mes "1.Lunatic";
- mes "Plump and shaggy monster shaped in Rabbit. However it won't give you a `Bunny Band'.";
- mes "^0099FFFound Items^000000: Clover,Feather,Carrot,Red Herb";
- next;
- mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
- mes "2.Peco Peco Egg";
- mes "Egg of Peco Peco. It is so tiny that doesn't look like an egg of Big Bird. Novice people love to Crack it because it doesn't attack at all.";
- mes "^0099FFFound Items^000000: Shell,Red Potion,Empty Bottle";
- next;
- mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
- mes "3.Ant Egg";
- mes "Simple Ant Egg.";
- mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
- next;
- mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
- mes "2.Baby Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
- next;
- goto MonNeuPro;
- close;
- MedMonNeuPro:
- mes "^FF0000[Neutral,Medium Monster Encyclopedia]^000000";
- mes "Unfortunately there is no medium monster of Neutral property which has been discovered so far.";
- next;
- goto MonNeuPro;
- close;
- GrMonNeuPro:
- mes "^FF0000[Neutral,Great Monster Encyclopedia]^000000";
- mes "1.Golem";
- mes "Living Stone which has spell-bound by Black Magic. Its gigantic body makes its moving slow. Recognizes Magic Spell Casting.";
- mes "^0099FFFound Items^000000: Scell";
- next;
- goto MonNeuPro;
- close;
- EndMonNeuPro:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,161,50,4 script Monster Encyclopedia::me_prt_in2 111,{
- mes "^FF0000[Monster Encyclopedia]^000000";
- mes "This is a Monster Encyclopedia including Monsters of Dark,Poison and Undead Property!";
- next;
- menu "Monster of Dark Property",MonDrkPro,"Monster of Poison Property",MonPsoPro,"Monster of Undead Property",MonUndPro,"Cancel",Cancel;
-
- MonDrkPro:
- menu "Small Size Monster",SmaMonDrkPro,"Medium Size Monster",MedMonDrkPro,"Great Size Monster",GrMonDrkPro,"Cancel",EndMonDrkPro;
-
- SmaMonDrkPro:
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "1.Thief Bug Egg";
- mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "2.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "3.Tarou";
- mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert.";
- mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
- next;
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "4.Drainliar";
- mes "Freaking Bloody bat with a might.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
- next;
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "5.Dokebi";
- mes "Korean Traditional Ghost with Dark Skin. It looks so cute and has a small horn on the head.";
- mes "^0099FFFound Items^000000: Dokebi Horn";
- next;
- mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
- mes "6.Deviruchi";
- mes "Little evil creature,which carries a cute fork with.";
- mes "^0099FFFound Items^000000: Little Evil Horn,Little Evil Wing,Zargon";
- next;
- goto MonDrkPro;
- close;
- MedMonDrkPro:
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "1.Female Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb, Jellopy, Garlet. Insect Feeler";
- next;
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "2.Male Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb, Jellopy, Garlet. Insect Feeler,Yellow Herb";
- next;
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "3.Matyr";
- mes "Creature shaped in Black Dog.";
- mes "^0099FFFound Items^000000: Monster's Feed,Leather";
- next;
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "4.Zenorc";
- mes "Mutant Orc with a small and short build. It moves around using both hands and feet. It owns High AGI stat,so that it passes off almost every attack.";
- mes "^0099FFFound Items^000000: Znorc's Fang,Sticky Muscus,Yellow Potion";
- next;
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "5.Requiem";
- mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
- mes "^0099FFFound Items^000000: Mystic Blue Box";
- next;
- mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
- mes "6.Bathory";
- mes "Witch with a big wen on the nose. She rides on her magic broom flying around in the air.";
- mes "^0099FFFound Items^000000: Witched Starsand";
- next;
- goto MonDrkPro;
- close;
- GrMonDrkPro:
- mes "^FF0000[Dark,Great Monster Encyclopedia]^000000";
- mes "1.Isis.";
- mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
- mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
- next;
- mes "^FF0000[Dark,Great Monster Encyclopedia]^000000";
- mes "3.Raydric";
- mes "Ghost Knight of misfortune.";
- mes "^0099FFFound Items^000000: Elunium, Chivarly Emblem";
- next;
- goto MonDrkPro;
- close;
- EndMonDrkPro:
- close;
- close;
- MonPsoPro:
- menu "Small Size Monster",SmaMonPsoPro,"Medium Size Monster",MedMonPsoPro,"Great Size Monster",GrMonPsoPro,"Cancel",EndMonPsoPro;
-
- SmaMonPsoPro:
- mes "^FF0000[Poison,Small Monster Encyclopedia]^000000";
- mes "Unfortunately there is no small monster of Poison Property which has been discovered so far.";
- next;
- goto MonPsoPro;
- close;
- MedMonPsoPro:
- mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
- mes "1.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus, Garlet,Green Herb";
- next;
- mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
- mes "2.Poison Spore";
- mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
- mes "^0099FFFound Items^000000: Spore,Green Herb";
- next;
- mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
- mes "3.Cobold the 2nd";
- mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
- mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
- next;
- mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
- mes "4.Side Winder";
- mes "Horrendous Snake of Dark colour.";
- mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
- next;
- goto MonPsoPro;
- close;
- GrMonPsoPro:
- mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
- mes "1.Argos";
- mes "Big Spider of Dark colour. It often invades passengers who intend to go over Mt.Mjornir. Be cautious of Argos,if you are the one of those passengers.";
- mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
- mes "2.Argiope";
- mes "Monster crawling around with several articular legs.";
- mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
- next;
- mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
- mes "4.Myst";
- mes "Mist-like Monster.";
- mes "^0099FFFound Items^000000: Trunk. Gas Mask";
- next;
- goto MonPsoPro;
- close;
- EndMonPsoPro:
- close;
- close;
- MonUndPro:
- menu "Small Size Monster",SmaMonUndPro,"Medium Size Monster",MedMonUndPro,"Great Size Monster",GrMonUndPro,"Cancel",EndMonUndPro;
-
- SmaMonUndPro:
- mes "^FF0000[Undead,Small Monster Encyclopedia]^000000";
- mes "Unfortunately there is no small monster of Undead Property which has been discovered so far.";
- next;
- goto MonUndPro;
- close;
- MedMonUndPro:
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "1.Zombie";
- mes "Bad Case of the Dead which has been reborn as a Walking Corpse by Back magic. Let's lead it to Nirvana.";
- mes "^0099FFFound Items^000000: Decayed Nail,Sticky Muscus,Horrendous Mouth";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "2.Megalodon";
- mes "Skeleton Fish having spooky empty eye-holes.";
- mes "^0099FFFound Items^000000: Stinky Scale, Skel-Bone";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "3.Orc Zombie";
- mes "Corpse of the Orc which has been given a new life by Black magic.";
- mes "^0099FFFound Items^000000: Orc Claw,Sticky Muscus";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "4.Pirate Skel";
- mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
- mes "^0099FFFound Items^000000: Skel-Bone";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "5.Orc Skeleton";
- mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
- mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "6.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "7.Munak";
- mes "Pretty-looking Female corpse which had been frozen for a long time. She looks like holding a long story deep inside, the story people want to know about. Anyway Don't give her a break,she'll give strong damages on you.";
- mes "^0099FFFound Items^000000: Daenggie ,Munak Turban";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "8.Skel Worker";
- mes "Walking Skeleton which was dead in a mine.";
- mes "^0099FFFound Items^000000: Iron,Lantern";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "9.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "10.Mummy";
- mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
- mes "^0099FFFound Items^000000: Rotten Bandage";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "11.Verit";
- mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
- mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
- next;
- mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
- mes "12.Ghoul";
- mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
- mes "^0099FFFound Items^000000: Horrendous Mouth";
- next;
- goto MonUndPro;
- close;
- GrMonUndPro:
- mes "^FF0000[Undead,Great Monster Encyclopedia]^000000";
- mes "3.Evil Druid";
- mes "You'll shudder even once looking at it.";
- mes "^0099FFFound Items^000000: Amulet,White Herb";
- next;
- goto MonUndPro;
- close;
- EndMonUndPro:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,162,68,4 script `Merchant Guideline' for Dummies::mgfd_2 111,{
- mes "^FF0000[`Merchant Guideline' for Dummies]^000000";
- mes "Please go over the next page if you want to check `Vending'.";
- next;
- menu "Go over the next page",NextPage,"Close the book",CloseB;
-
- NextPage:
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "To Vend a Shop,first you must equip a ^0099FFCart^000000.";
- mes "You can rent a cart from Kafra. When equipped once,it won't be disappeared as long as you don't take off.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "However,this cart diminishes moving speed. You can recover moving speed after learning `Push Cart' the skill.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "When learn `Push Cart' over 3 points,it will allow you to learn `Vending'. You can display 3 kinds of item on your shop with Vending at first.";
- mes "As Vending skill goes higher, it will allow you to display more items.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "Let's store things you want to sell in the Cart.";
- mes "To open Cart Window,Use ^0099FFalt+W^000000 as hotkey. Or it will be open when you click `Item' icon on equipment(alt+Q) window.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "Now Use `Vending' skill.2 kinds of Window-`Item Shop' and `Item you want to sell'- will pop up.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "On `Item Shop' window,name your shop. Then Drag items onto `Item you want to sell' window and Fix the price.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "When close `My Shop' window,your shop will be closed. You can check each price of items with a mouse on the items. Meanwhile it keeps being recorded on Chat window how many items or which kind have been sold.";
- next;
- mes "^FF0000[Vending Guide for Dummies]^000000";
- mes "When every thing's sold out,the shop will be closed automatically.";
- close;
- CloseB:
- close;
-}
-
-prt_in.gat,164,96,4 script Monster Encyclopedia::me_prt_in3 111,{
- mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
- mes "This is an Encyclopedia describing Monsters living in Dungeons.";
- next;
- next;
- menu "Orc Dungeon",OrcDung,"Byalan Cave near Izlude",ByaCave,"Prontera Culvert",PrtCul;
-
- OrcDung:
- menu "F1",OrcDungF1,"F2",OrcDungF2,"Cancel",EndOrcDung;
-
- OrcDungF1:
- mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
- mes "1.Chonchon";
- mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
- mes "^0099FFFound Items^000000: Shell, Jellopy, Fly Wing";
- next;
- mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
- mes "2.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
- mes "3.Orc Zombie";
- mes "Corpse of the Orc which has been given a new life by Black magic.";
- mes "^0099FFFound Items^000000: Orc Claw,Sticky Muscus";
- next;
- mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
- mes "4.Orc Skeleton";
- mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
- mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
- next;
- goto OrcDung;
- close;
- OrcDungF2:
- mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
- mes "1.Chonchon";
- mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
- mes "^0099FFFound Items^000000: Shell, Jellopy, Fly Wing";
- next;
- mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
- mes "2.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
- mes "3.Orc Skeleton";
- mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
- mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
- next;
- mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
- mes "4.Zenorc";
- mes "Mutant Orc with a small and short build. It moves around using both hands and feet. It owns High AGI stat,so that it passes off almost every attack.";
- mes "^0099FFFound Items^000000: Znorc's Fang,Sticky Muscus,Yellow Potion";
- next;
- goto OrcDung;
- close;
- EndOrcDung:
- close;
- close;
- ByaCave:
- menu "1F",ByaCaveF1,"2F",ByaCaveF2,"3F",ByaCaveF3,"4F",ByaCaveF4,"5F",ByaCaveF5,"Cancel",EndByaCave;
-
- ByaCaveF1:
- mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
- mes "1.Plankton";
- mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
- mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
- next;
- mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
- mes "2.Kukre";
- mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
- mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
- next;
- mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
- mes "3.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
- next;
- mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
- mes "4.Vadon";
- mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
- mes "^0099FFFound Items^000000: Nipper. Garlet.Solid Shell. Shell";
- next;
- mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
- mes "5.Marina";
- mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
- mes "^0099FFFound Items^000000: Single Cell. Sticky Muscus";
- next;
- goto ByaCave;
- close;
- ByaCaveF2:
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "1.Plankton";
- mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
- mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
- next;
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "2.Kukre";
- mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
- mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
- next;
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "3.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
- next;
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "4.Vadon";
- mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
- mes "^0099FFFound Items^000000: Nipper. Garlet.Solid Shell. Shell";
- next;
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "5.Marina";
- mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
- mes "^0099FFFound Items^000000: Single Cell. Sticky Muscus";
- next;
- mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
- mes "6.Thara Frog";
- mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
- mes "^0099FFFound Items^000000: Spawn, Sticky Webfoot";
- next;
- goto ByaCave;
- close;
- ByaCaveF3:
- mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
- mes "1.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
- next;
- mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
- mes "2.Thara Frog";
- mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
- mes "^0099FFFound Items^000000: Spawn, Scell, Sticky Webfoot";
- next;
- mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
- mes "3.Cornutus";
- mes "Some buddies concealing themselves within hard turban shells and try to lead a quiet life.";
- mes "^0099FFFound Items^000000: Conch.Scell.Solid Shell";
- next;
- mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
- mes "4.Mars";
- mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
- mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
- next;
- mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
- mes "5.Obeaune";
- mes "Female Mermaid. Attacks using long hair, with a grim face.";
- mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
- next;
- goto ByaCave;
- close;
- ByaCaveF4:
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "1.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle.Sticky Muscus.Meat";
- next;
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "2.Mars";
- mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
- mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
- next;
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "3.Obeaune";
- mes "Female Mermaid. Attacks using long hair, with a grim face.";
- mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
- next;
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "4.Marine Sphere";
- mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
- mes "^0099FFFound Items^000000: Tendon. Detonator";
- next;
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "5.Phen";
- mes "Fish of blue color which is kicking and definitely alive.";
- mes "^0099FFFound Items^000000: Fish Tail,Sharp Scale,Meat,Fin";
- next;
- mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
- mes "6.Sword Fish";
- mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
- mes "^0099FFFound Items^000000: Sharp Scale,Gill";
- next;
- goto ByaCave;
- close;
- ByaCaveF5:
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "1.Marine Sphere";
- mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
- mes "^0099FFFound Items^000000: Tendon. Detonator";
- next;
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "2.Sword Fish";
- mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
- mes "^0099FFFound Items^000000: Sharp Scale,Gill";
- next;
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "3.Mars";
- mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
- mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
- next;
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "4.Obeaune";
- mes "Female Mermaid. Attacks using long hair, with a grim face.";
- mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
- next;
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "5.Marc";
- mes "Sea Horse. Don't ever think about riding a Sea Horse!";
- mes "^0099FFFound Items^000000: Gill,Fin";
- next;
- mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
- mes "6.Strouf";
- mes "Fish rarely seen under the deep sea.";
- mes "^0099FFFound Items^000000: Fin,Feather,Gill";
- next;
- goto ByaCave;
- close;
- EndByaCave:
- close;
- close;
- PrtCul:
- menu "1F",PrtCulF1,"2F",PrtCulF2,"3F",PrtCulF3,"4F",PrtCulF4,"Cancel",EndPrtCul;
-
- PrtCulF1:
- mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
- mes "1.Thief Bug Egg";
- mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
- mes "2.Thief Bug Baby";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
- next;
- mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
- mes "3.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
- mes "4.Spore";
- mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
- mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
- next;
- mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
- mes "5.Tarou";
- mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert.";
- mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
- next;
- goto PrtCul;
- close;
- PrtCulF2:
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "1.Thief Bug Egg";
- mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "2.Thief Bug Baby";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "3.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "4.Spore";
- mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
- mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "5.Tarou";
- mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
- mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "6.Plankton";
- mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
- mes "^0099FFFound Items^000000: Single Cell.Garlet.Sticky Muscus.Empty Bottle";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "7.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle.Sticky Muscus.Meat";
- next;
- mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
- mes "8.Female Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
- next;
- goto PrtCul;
- close;
- PrtCulF3:
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "1.Thief Bug Egg";
- mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "2.Thief Bug Baby";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
- next;
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "3.Female Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
- next;
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "4.Tarou";
- mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
- mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
- next;
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "5.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
- mes "6.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
- next;
- goto PrtCul;
- close;
- PrtCulF4:
- mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
- mes "1.Thief Bug Egg";
- mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
- mes "2.Thief Bug Baby";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
- next;
- mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
- mes "3.Female Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
- next;
- mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
- mes "4.Male Thief Bug";
- mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
- mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler,Yellow Herb";
- next;
- mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
- mes "5.Golden Thief Bug";
- mes "Impertinent Thief Bug of Golden Colour,wearing a solid shell all around the body. It's rarely seen by humans eye.";
- mes "^0099FFFound Items^000000: Blue Herb,Gold,Ora Ora,Insect Feeler";
- next;
- goto PrtCul;
- close;
- EndPrtCul:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,164,102,4 script Monster Encyclopedia::me_prt_in4 111,{
- mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
- mes "The is an Encyclopedia describing Monsters living in Dungeons.";
- next;
- menu "Sunken ship near Alberta",SunkShip,"Prontera Maze",PrtMaze;
-
- SunkShip:
- menu "F1",SunkShipF1,"F2",SunkShipF2,"Cancel",EndSunkShip;
-
- SunkShipF1:
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "1. Plankton";
- mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with serveral projections.";
- mes "^0099FFFound Items:^000000 Single Cell. Garlet. Sticky Mocus. Empty Bottle";
- next;
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "2. Kukre";
- mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
- mes "^0099FFFound Items:^000000 Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
- next;
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "3. Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items:^000000 Tentacles. Sticky Mocus. Meat";
- next;
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "4. Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
- mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
- next;
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "5. Poison Spore";
- mes "Poisonous Spore in Violet. Besides, it tends to attack haphazardly if anybody gets near.";
- mes "^0099FFFound Items:^000000 Spore. Green Herb";
- next;
- mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
- mes "6. Pirate Skel";
- mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
- mes "^0099FFFound Items:^000000 Skel-Bone";
- next;
- goto SunkShip;
- close;
- SunkShipF2:
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "1. Kukre";
- mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
- mes "^0099FFFound Items:^000000 Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "2. Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be in the ass. It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items:^000000 Tentacles. Sticky Mocus. Meat";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "3. Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
- mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "4. Thara Frogs";
- mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
- mes "^0099FFFound Items:^000000 Spawn. Scell. Skicky Webfoot";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "5. Whisper";
- mes "Living Fabric, which gives spooking feeling.";
- mes "^0099FFFound Items:^000000 Fabric";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "6. Megalodon";
- mes "Skeleton Fish having spooky empty eye-holes.";
- mes "^0099FFFound Items:^000000 Skinky Scale. Skel-Bone";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "7. Pirate Skel";
- mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
- mes "^0099FFFound Items:^000000 Skel-Bone";
- next;
- mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
- mes "8. Marionette";
- mes "Monster reborn from bewitched Doll, bound to strings on Wooden Sticks.";
- mes "^0099FFFound Items:^000000 Skinky Golden Hair, Trunk";
- next;
- mes "9. Drake";
- mes "Awfully Strong Monster which looks like the Captain of this Sunken Ship.";
- mes "^0099FFFound Items:^000000 Skel-Bone. White";
- next;
- goto SunkShip;
- close;
- EndSunkShip:
- close;
- PrtMaze:
- menu "F1",PrtMazeF1,"F3",PrtMazeF3,"Cancel",EndPrtMaze;
-
- PrtMazeF1:
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "1. Poring";
- mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped.";
- mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry. They are not strong, and you will get your back once you kill the monster, which eat your stuff.";
- mes "^0099FFFound Items:^000000 Jellopy. Skicky Mocus. Apple. Empty Bottle. Red Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "2. Lunatic";
- mes "Plump and shaggy monster shaped in Rabbit. However it won't give you `Bunny Band'.";
- mes "^0099FFFound Items:^000000 Clover. Feather. Carrot. Red Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "3. Fabre";
- mes "Larva of Creamy. It is cute when it wiggles, even though it is a weak and small monster,";
- mes "People often tends to slay Fabres, only for the reason they can get `Feather's', one of required items for `Bunny Band'.";
- mes "^0099FFFound Items:^000000 Fluff. Feather. Green Herb. Clover";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "4. Creamy";
- mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger then you expect. Be careful!";
- mes "^0099FFFound Items:^000000 Powder of Butterfly. Honey. Butterfly Wing. Flower";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "5. Pupa";
- mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
- mes "^0099FFFound Items:^000000 Chrysalis. Sticky Mocus";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "6. Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
- mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "7. Rocker";
- mes "Lazy Grasshopper which loves playing Violin.";
- mes "^0099FFFound Items:^000000 Grasshopper's Leg. Jellopy";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "8. Big Foot";
- mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
- mes "^0099FFFound Items:^000000 Bear's Foot Skin. Leather. Sweet Potato";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "9. Smokie";
- mes "It's working out all the time. Often tries to shape shift with Raccon Leaves, but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
- mes "^0099FFFound Items:^000000 Raccon Leaf. Leather. Sweet Potato";
- next;
- mes "10. Snake";
- mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
- mes "^0099FFFound Items:^000000 Snake Scale. Red Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "11.Wolf";
- mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
- mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "12.Argiope";
- mes "Monster crawling around with several articular legs.";
- mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "13.Argos";
- mes "Big Spider of Dark colour. It often invades people lost in the Maze.";
- mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "14.Chonchon";
- mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
- mes "^0099FFFound Items^000000: Shell,Jellopy,Fly Wing";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "15.Horn";
- mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
- mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "16.Hunter Fly";
- mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
- mes "^0099FFFound Items^000000: Solid Shell,Zargon";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "17.Mantis";
- mes "It wanders about the field waving a tiny fan.";
- mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "18.Steiner";
- mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
- mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "19.Side Winder";
- mes "Horrendous Snake of Dark colour.";
- mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "20.Yoyo";
- mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the gound outrageously, but they are nimble and cooperative,you must be cautious of being attacked by a group.";
- mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
- mes "21.Caramel";
- mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immeduately.";
- mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "22.Steel Chonchon";
- mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
- mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "23.Coco";
- mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
- mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "24.Dustiness";
- mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
- mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "25.Martin";
- mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
- mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
- next;
- mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
- mes "26.Savage";
- mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
- mes "^0099FFFound Items^000000: Mane,Leather";
- next;
- goto PrtMaze;
- close;
- PrtMazeF3:
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "1.Poring";
- mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped,";
- mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry. They are not strong, and you will get yours back once you kill the monster, which eat your stuff.";
- mes "^0099FFFound Items^000000: Jellopy.Sticky Muscus.Apple.Empty Bottle.Red Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "2.Lunatic";
- mes "Plump and shaggy monster shaped in Rabbit. However it won't give you a `Bunny Band'.";
- mes "^0099FFFound Items^000000: Clover,Feather,Carrot,Red Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "3.Fabre";
- mes "Larva of Creamy. It is cute when it wiggles,even though it is a weak and small monster,";
- mes "People often tend to slay Fabres,only for the reason they can get `Feather's,one of required items for `Bunny Band'.";
- mes "^0099FFFound Items^000000: Fluff.Feather.Green Herb.Clover";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "4.Creamy";
- mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger than you expect. Be careful!";
- mes "^0099FFFound Items^000000: Powder of Butterfly,Honey,Butterfly Wing,Flower";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "5.Pupa";
- mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
- mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "6.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "7.Rocker";
- mes "Lazy Grasshopper which loves playing Violin.";
- mes "^0099FFFound Items^000000: Grasshopper's Leg,Jellopy";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "8.Big Foot";
- mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
- mes "^0099FFFound Items^000000: Bear's Foot Skin,Leather,Sweet Potato";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "9.Smokie";
- mes "It's working out all the time. Often tries to shape shift with Raccon Leaves,but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
- mes "^0099FFFound Items^000000: Raccon Leaf,Leather,Sweet Potato";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "10.Snake";
- mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
- mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "11.Wolf";
- mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
- mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "12.Argiope";
- mes "Monster crawling around with several articular legs.";
- mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "13.Argos";
- mes "Big Spider of Dark colour. It often invades passengers.";
- mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "14.Horn";
- mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
- mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "15.Hunter Fly";
- mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
- mes "^0099FFFound Items^000000: Solid Shell,Zargon";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "16.Mantis";
- mes "It wanders about the field waving a tiny fan.";
- mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "17.Steiner";
- mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
- mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "18.Side Winder";
- mes "Horrendous Snake of Dark colour.";
- mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "19.Yoyo";
- mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the ground outrageously, but they are nimble and cooperative,you must be cautious of being attacked by a group.";
- mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "20.Caramel";
- mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immediately.";
- mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "21.Steel Chonchon";
- mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
- mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "22.Coco";
- mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
- mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "23.Dustiness";
- mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
- mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "24.Martin";
- mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
- mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "25.Savage";
- mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
- mes "^0099FFFound Items^000000: Mane,Leather";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "26.Savage Bebe";
- mes "Tiny Pink baby of Savage. Unlike its small size, It is running about fields making annoying noise";
- mes "^0099FFFound Items^000000: Leather,Meat,Arrow,Feather";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "27.Mastering";
- mes "Giant Poring rarely seen in the Morroc Desert,Mt.Mjornir or the Prontera Maze. It might be the leader of Porings. Surely stronger than normal Porings but, still it can't be more than a Poring anyway.";
- mes "^0099FFFound Items^000000: Apple,Apple Juice";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "28.Eclipse";
- mes "Giant Lunatic which might be the Boss among Lunatics!It does weak attacks but is highly defensive at the same time.";
- mes "^0099FFFound Items^000000: Carrot,Glass Bead,Milk,Carrot Juice";
- next;
- mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
- mes "29.Baphomet";
- mes "Dreadful Monster having huge horns on the head. It uses a Gargantuan Scythe to slay foes,often attacks with bare hands.";
- mes "^0099FFFound Items^000000: Evil Horn,Yggdrasilberry,Leather,Oridecon";
- next;
- EndPrtMaze:
- close;
-}
-
-prt_in.gat,168,56,4 script Monster Encyclopedia::me_prt_in5 111,{
- mes "^FF0000[Monster Encyclopedia]^000000";
- mes "I am a Monster Encyclopedia, you can check several types of Monster with me.";
- next;
- menu "Monsters of Water Property",MonWatPro,"Monsters of Wind Property",MonWinPro,"Monsters of Spiritual Property",MonSpiPro,"Cancel",Cancel;
-
- MonWatPro:
- menu "Small Size Monster",SmaMonWatPro,"Medium Size Monster",MidMonWatPro,"Great Size Monster",GrMonWatPro,"Cancel",EndMonWatPro;
-
- SmaMonWatPro:
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "1.Plankton";
- mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
- mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "2.Kukre";
- mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
- mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "3.Hydra";
- mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass.";
- mes "It will be effective to kill one by one before they gather.";
- mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "4.Vadon";
- mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
- mes "^0099FFFound Items^000000: Nipper.Garlet.Solid Shell.Shell";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "5.Marina";
- mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
- mes "^0099FFFound Items^000000: Single Cell.Sticky Muscus";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "6.Cornutus";
- mes "Some buddies concealing themselves within hard turban shells and try to lead a quiet life.";
- mes "^0099FFFound Items^000000: Conch. Scell. Solid Shell";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "7.Magnolia";
- mes "Creatures shaped in Big Egg Frying Fans. They spank attackers with the Frying Fans without mercy.";
- mes "Don't let your guard down just because they look cute. You will suffer if you do so.";
- mes "^0099FFFound Items^000000: Jellopy. Garlet. Scell";
- next;
- mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
- mes "8.Marine Sphere";
- mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
- mes "^0099FFFound Items^000000: Tendon. Detonator";
- next;
- goto MonWatPro;
- close;
- MidMonWatPro:
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "1.Poring";
- mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped,";
- mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry.";
- mes "They are not strong, and you will get yours back once you kill the monster, which eat your stuff.";
- mes "^0099FFFound Items^000000: Jellopy.Sticky Muscus.Apple.Empty Bottle.Red Herb";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "2.Roda Frog";
- mes "Usually they are hopping around, croaking very annoyingly. Let's stomp on them when found.";
- mes "^0099FFFound Items^000000: Sticky Webfoot,Spawn,Green Herb,Empty Bottle";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "3.Spore";
- mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
- mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "4.Goblin";
- mes "They are small and attack passengers using different kinds of mace. They always wear Masques, which frighten people more because we can't see what they might look like.";
- mes "There are all 5 different types, and they seem to be brothers.";
- mes "^0099FFFound Items^000000: Yellow Herb,Red Potion";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "5.Thara Frog";
- mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
- mes "^0099FFFound Items^000000: Spawn,Scell,Sticky Webfoot";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "6.Phen";
- mes "Fish of blue color which is kicking and definitely alive.";
- mes "^0099FFFound Items^000000: Fish Tail,Sharp Scale,Meat,Fin";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "7.Mars";
- mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
- mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "8.Obeaune";
- mes "Female Mermaid. Attacks using long hair, with a grim face.";
- mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "9. Sohee";
- mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
- mes "^0099FFFound Items^000000: Black Hair,Red Potion";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "10.Marc";
- mes "Sea Horse. Don't ever think about riding a Sea Horse!";
- mes "^0099FFFound Items^000000: Gill,Fin";
- next;
- mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
- mes "11.Deviace";
- mes "Fish monster with a big mouth possibly carrying something within. Small but Strong.";
- mes "^0099FFFound Items^000000: Ancient Tooth,Ancient Lips";
- next;
- goto MonWatPro;
- close;
- GrMonWatPro:
- mes "^FF0000[Water,Great Monster Encyclopedia]^000000";
- mes "1.Ambernite";
- mes "Snail shaped monster, it is highly strong and defensive at the same time. Don't you worry though. It is too slow to catch you so that you can run away at ease any time.";
- mes "^0099FFFound Items^000000: Snail's Shell,Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Water,Great Monster Encyclopedia]^000000";
- mes "2.Sword Fish";
- mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
- mes "^0099FFFound Items^000000: Sharp Scale,Gill";
- next;
- goto MonWatPro;
- close;
- EndMonWatPro:
- close;
- close;
- MonWinPro:
- menu "Small Size Monster",SmaMonWinPro,"Medium Size Monster",MedMonWinPro,"Great Size Monster",GrMonWinPro,"Cancel",EndMonWinPro;
-
- SmaMonWinPro:
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "1.Chonchon";
- mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
- mes "^0099FFFound Items^000000: Shell,Jellopy,Fly Wing";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "2.Hornet";
- mes "Usually they are doing their duty but when get harmed, they will group themselves to attack the enemy without mercy!";
- mes "^0099FFFound Items^000000: Bee Sting,Jellopy,Green Herb";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "3.Creamy";
- mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger than you expect. Be careful!";
- mes "^0099FFFound Items^000000: Powder of Butterfly,Honey,Butterfly Wing,Flower";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "4.Steiner";
- mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
- mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "5.Steel Chonchon";
- mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
- mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "6.Dustiness";
- mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
- mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
- next;
- mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
- mes "7.Hunter Fly";
- mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
- mes "^0099FFFound Items^000000: Solid Shell,Zargon";
- next;
- goto MonWinPro;
- close;
- MedMonWinPro:
- mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
- mes "1.Condor";
- mes "Bald head eagle in funny feature. They tends to be gathered when one gets attacked. So don't look down upon them and think of `I will caress you!'";
- mes "^0099FFFound Items^000000: Talon,Arrow,Meat,Feather of Birds";
- next;
- mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
- mes "2.Cobold the 1st";
- mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
- mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
- next;
- mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
- mes "3.Petite";
- mes "Tiny Cute flying Dragon. It seems like there exists 2 different kinds of Petite, flying one and walking one and this is the 1st one.";
- mes "^0099FFFound Items^000000: Dragon Canine,Dragon Tail,Zargon";
- next;
- goto MonWinPro;
- close;
- GrMonWinPro:
- mes "^FF0000[Wind,Great Monster Encyclopedia]^000000";
- mes "4.Joker";
- mes "A big Poker Card with Ugly looking girl printed on both side assaults you.";
- mes "^0099FFFound Items^000000: High Heels";
- next;
- goto MonWinPro;
- close;
- EndMonWinPro:
- close;
- close;
- MonSpiPro:
- menu "Small Size Monster",SmaMonSpiPro,"Medium Size Monster",MedMonSpiPro,"Great Size Monster",GrMonSpiPro,"Cancel",EndMonSpiPro;
-
- SmaMonSpiPro:
- mes "^FF0000[Spiritual,Small Monster Encyclopedia]^000000";
- mes "1.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Spiritual,Small Monster Encyclopedia]^000000";
- mes "2.Marionette";
- mes "Monster reborn from a bewitched Doll, bound to strings on Wooden Sticks.";
- mes "^0099FFFound Items^000000: Golden Hair,Trunk";
- next;
- goto MonSpiPro;
- close;
- MedMonSpiPro:
- mes "^FF0000[Spiritual,Medium Monster Encyclopedia]^000000";
- mes "1.Eggyra";
- mes "Hovering here and there, while making a clattering sound. Tough-Looking Face scares people but it is not as strong as it looks.";
- mes "^0099FFFound Items^000000: Scell,Sticky Muscus,Red Herb";
- next;
- goto MonSpiPro;
- close;
- GrMonSpiPro:
- mes "^FF0000[Spiritual,Great Monster Encyclopedia]^000000";
- mes "1.Nightmare";
- mes "Ghost Horse radiating an Aura of Violet all over the body.";
- mes "^0099FFFound Items^000000: Horseshoe,Blue Herb";
- next;
- mes "^FF0000[Spiritual,Great Monster Encyclopedia]^000000";
- mes "3.Medusa";
- mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
- mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Hair,White Potion";
- next;
- goto MonSpiPro;
- close;
- EndMonSpiPro:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,168,68,4 script `Merchant Guideline' for Dummies::mgfd_1 111,{
- mes "^FF0000[Blacksmith Guide for Dummies]^000000";
- mes "You can get the information about how to refine Ores and about Weapon Craft Skills.";
- next;
- menu "Ore Refining.",OreRef,"Weapon Craft.",WeaCra,"Cancel.",Cancel;
-
- OreRef:
- mes "^FF0000[Ore Refining for Dummies]^000000";
- mes "Please go over the next page if you want to know how to refine Ores.";
- next;
- menu "Ok",OreRefOk,"Cancel",EndOreRef;
-
- OreRefOk:
- mes "^FF0000[Ore Refining for Dummies]^000000";
- mes "Rough Ores like Iron Ore or Raw Materials for Enchanted Stones can be polished into High Quality Ones. For that, ^0099FFFurnace^000000 is needed.";
- mes "One High Quality Ore needs several Rough Ones to be refined.";
- next;
- mes "^FF0000[Ore Refining for Dummies]^000000";
- mes "When enough items are gathered,Double Click `Furnace'.You can use a Furnace only one time for refining.";
- next;
- mes "^FF0000[Ore Refining for Dummies]^000000";
- mes "Possible ores you can refine will pop up on a new window. You can make Ore with a click the name of Ore you need.";
- next;
- mes "^FF0000[Ore Refining for Dummies]^000000";
- mes "However it has a possibility to fail.";
- close;
- EndOreRef:
- close;
- close;
- WeaCra:
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "Please go over the next page if you want to learn how to Smith Weapons.";
- next;
- menu "Ok",WeaCraOk,"Cancel",EndWeaCra;
-
- WeaCraOk:
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "Learn a Skill from `Smith Sword,Two-Handed Sword,Spear,Mace,Brassknuckle' which allows you to make the pertinent weapon.";
- next;
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "Every Weapon needs ^0099FFSteel^000000 and ^0099FFHammer^000000.You can use a Hammer one time and it will disappeared when used.";
- next;
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "When Double Click on a Hammer,a new window which lists of items you can make will pop up.";
- mes "Clicking a Weapon on that list will show the required items and their numbers. But they will be exhausted automatically,so just know this.";
- next;
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "On that list window,there are 3 sockets which enable you to input some special items like Enchanted Stone or Star Crumb. These items amplify the weapon ability";
- next;
- mes "^FF0000[Weapon Craft for Dummies]^000000";
- mes "And they have different possibility of Success by their characters.";
- close;
- EndWeaCra:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,172,96,4 script Monster Encyclopedia::me_prt_in7 111,{
- mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
- mes "This is an Encyclopedia describing monsters living in Dungeons.";
- next;
- menu "Ant Hell",AntHell,"Geffen Dungeon",GefDung,"Sphinx",Sphinx,"Cancel",Cancel;
-
- AntHell:
- menu "1F",AntHellF1,"2F",AntHellF2,"Cancel",EndAntHell;
-
- AntHellF1:
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "1.Ant Egg";
- mes "Simple Ant Egg.";
- mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
- next;
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "2.Andre";
- mes "A kind of Worker Ants,they are very diligent in their work.They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "3.Piere";
- mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "4.Deniro";
- mes "A kind of Work Ants, tend to group in a same kind as well as other ants.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "5.Vitata";
- mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
- mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
- next;
- mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
- mes "6.Giearth";
- mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
- mes "^0099FFFound Items^000000: Old Pixie's Moustache";
- next;
- goto AntHell;
- close;
- AntHellF2:
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "1.Ant Egg";
- mes "Simple Ant Egg.";
- mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "2.Andre";
- mes "A kind of Worker Ants,they are very diligent in their work. They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "3.Piere";
- mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "4.Deniro";
- mes "A kind of Work Ants, tend to group in a same kind as well as other ants";
- mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
-
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "5.Vitata";
- mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
- mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "6.Giearth";
- mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
- mes "^0099FFFound Items^000000: Old Pixie's Moustache";
- next;
- mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
- mes "7.Phreeoni";
- mes "Some bastard with a huge creepy tongue. Extremely strong Monster rarely seen around.";
- mes "^0099FFFound Items^000000: Tongue,Ant Jaw";
- next;
- goto AntHell;
- close;
- EndAntHell:
- close;
- close;
- GefDung:
- menu "1F",GefDungF1,"2F",GefDungF2,"3F",GefDungF3,"4F",GefDungF4,"Cancel",EndGefDung;
-
- GefDungF1:
- mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
- mes "2.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
- next;
- mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
- mes "3.Dustiness";
- mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
- mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
- next;
- mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
- mes "4.Poison Spore";
- mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
- mes "^0099FFFound Items^000000: Spore,Green Herb";
- next;
- goto GefDung;
- close;
- GefDungF2:
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "2.Dustiness";
- mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
- mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
- next;
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "3.Poison Spore";
- mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
- mes "^0099FFFound Items^000000: Spore,Green Herb";
- next;
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "4.Argos";
- mes "Big Spider of Dark colour. It often invades passengers.";
- mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "5.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
- mes "6.Jakk";
- mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
- mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
- next;
- goto GefDung;
- close;
- GefDungF3:
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "1.Argos";
- mes "Big Spider of Dark colour.It often invades passengers.";
- mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "2.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "3.Jakk";
- mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
- mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "4.Myst";
- mes "Mist-like Monster.";
- mes "^0099FFFound Items^000000: Trunk. Gas Mask";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "5.Marionette";
- mes "Monster reborn from a bewitched Doll, bound to strings on Wooden Sticks.";
- mes "^0099FFFound Items^000000: Golden Hair,Trunk";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "6.Bathory";
- mes "Witch with a big wen on the nose. She rides on her magic broom flying around in the air..";
- mes "^0099FFFound Items^000000: Witched Starsand";
- next;
- mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
- mes "7.Nightmare";
- mes "Ghost Horse radiating an Aura of Violet all over the body.";
- mes "^0099FFFound Items^000000: Horseshoe,Blue Herb";
- next;
- goto GefDung;
- close;
- GefDungF4:
- mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
- mes "1.Myst";
- mes "Mist-like Monster.";
- mes "^0099FFFound Items^000000: Trunk. Gas Mask";
- next;
- mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
- mes "2.Deviruchi";
- mes "Little evil creature,which carries a cute fork with.";
- mes "^0099FFFound Items^000000: Little Evil Horn,Little Evil Wing,Zargon";
- next;
- mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
- mes "3.Raydric";
- mes "Ghost Knight of misfortune.";
- mes "^0099FFFound Items^000000: Elunium,Chivarly Emblem";
- next;
- mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
- mes "4.Joker";
- mes "A big Poker Card with Ugly looking girl printed on both side assaults you.";
- mes "^0099FFFound Items^000000: High Heels";
- next;
- mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
- mes "5.Doppelganger";
- mes "A ghostly double of a swordsman,Spooky and Powerful.";
- mes "^0099FFFound Items^000000: Spiky Band,Blue Potion,Cursed Ruby,Ruby";
- next;
- goto GefDung;
- close;
- EndGefDung:
- close;
- close;
- Sphinx:
- menu "1F",SphinxF1,"2F",SphinxF2,"3F",SphinxF3,"4F",SphinxF4,"5F",SphinxF5,"Cancel",EndSphinx;
-
- SphinxF1:
- mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
- mes "2.Snake";
- mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
- mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
- next;
- mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
- mes "3.Zerom";
- mes "Undead Slave who had been extremely abused before he died. He is wandering in the Sphinx,carrying a big box on the back..";
- mes "^0099FFFound Items^000000: Panties";
- next;
- mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
- mes "4.Matyr";
- mes "Creature shaped in Black Dog.";
- mes "^0099FFFound Items^000000: Monster's Feed,Leather";
- next;
- mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
- mes "5.Requiem";
- mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
- mes "^0099FFFound Items^000000: Mystic Blue Box";
- next;
- goto Sphinx;
- close;
- SphinxF2:
- mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
- mes "2.Matyr";
- mes "Creature shaped in Black Dog.";
- mes "^0099FFFound Items^000000: Monster's Feed,Leather";
- next;
- mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
- mes "3.Requiem";
- mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
- mes "^0099FFFound Items^000000: Mystic Blue Box";
- next;
- mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
- mes "4.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- goto Sphinx;
- close;
- SphinxF3:
- mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
- mes "1.Matyr";
- mes "Creature shaped in Black Dog.";
- mes "^0099FFFound Items^000000: Monster's Feed,Leather";
- next;
- mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
- mes "2.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
- mes "3.Marduk";
- mes "Unknown monster wearing Catholic uniform and looking serious.";
- mes "^0099FFFound Items^000000: Flame Heart";
- next;
- goto Sphinx;
- SphinxF4:
- mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
- mes "1.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
- mes "2.Marduk";
- mes "Unknown monster wearing Catholic uniform and looking serious.";
- mes "^0099FFFound Items^000000: Flame Heart";
- next;
- mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
- mes "3.Medusa";
- mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
- mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Snake,White Potion";
- next;
- goto Sphinx;
- close;
- SphinxF5:
- mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
- mes "1.Whisper";
- mes "Living Fabric, which gives spooky feeling.";
- mes "^0099FFFound Items^000000: Fabric";
- next;
- mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
- mes "2.Marduk";
- mes "Unknown monster wearing Catholic uniform and looking serious.";
- mes "^0099FFFound Items^000000: Flame Heart";
- next;
- mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
- mes "3.Medusa";
- mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
- mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Snake,White Potion";
- next;
- goto Sphinx;
- close;
- EndSphinx:
- close;
- close;
- Cancel:
- close;
-}
-
-prt_in.gat,172,102,4 script Monster Encyclopedia::me_prt_in8 111,{
- mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
- mes "The is an Encyclopedia describing Monsters living in Dungeons.";
- next;
- menu "Mjornir Dead Pit",MjrDeadPit,"Payon Cave",PayCave,"Pyramid",Pyramid;
-
- MjrDeadPit:
- menu "F1",MjrDeadPitF1,"F2",MjrDeadPitF2,"F3",MjrDeadPitF3,"Cancel",EndMjrDeadPit;
-
- MjrDeadPitF1:
- mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
- mes "2.Tarou";
- mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
- mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
- next;
- mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
- mes "3.Martin";
- mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
- mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
- next;
- mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
- mes "4.Drainliar";
- mes "Freaking Bloody bat with a might.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
- next;
- goto MjrDeadPit;
- close;
- MjrDeadPitF2:
- mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
- mes "1.Martin";
- mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
- mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
- next;
- mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
- mes "2.Drainliar";
- mes "Freaking Bloody bat with a might.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
- next;
- mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
- mes "3.Skel Worker";
- mes "Walking Skeleton which was dead in a mine.";
- mes "^0099FFFound Items^000000: Iron,Lantern";
- next;
- mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
- mes "4.Myst";
- mes "Mist-like Monster.";
- mes "^0099FFFound Items^000000: Trunk. Gas Mask";
- next;
- goto MjrDeadPit;
- close;
- MjrDeadPitF3:
- mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
- mes "1.Skel Worker";
- mes "Walking Skeleton which was dead in a mine.";
- mes "^0099FFFound Items^000000: Iron,Lantern";
- next;
- mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
- mes "2.Myst";
- mes "Mist-like Monster.";
- mes "^0099FFFound Items^000000: Trunk. Gas Mask";
- next;
- mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
- mes "3.Evil Druid";
- mes "You'll shudder even once looking at it.";
- mes "^0099FFFound Items^000000: Amulet,White Herb";
- next;
- goto MjrDeadPit;
- close;
- EndMjrDeadPit:
- close;
- close;
- PayCave:
- menu "1F",PayCaveF1,"2F",PayCaveF2,"3F",PayCaveF3,"4F",PayCaveF4,"5F",PayCaveF5,"Cancel",EndPayCave;
-
- PayCaveF1:
- mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
- mes "2.Spore";
- mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
- mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
- next;
- mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
- mes "3.Zombie";
- mes "Bad Case of the Dead which has been reborn as a Walking Corpse by Back magic. Let's lead it to Nirvana.";
- mes "^0099FFFound Items^000000: Decayed Nail,Sticky Muscus,Horrendous Mouth";
- next;
- goto PayCave;
- close;
- PayCaveF2:
- mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
- mes "2.Eggyra";
- mes "Hovering here and there, while making a clattering sound. Tough-Looking Face scares people but it is not as strong as it looks.";
- mes "^0099FFFound Items^000000: Scell,Sticky Muscus,Red Herb";
- next;
- mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
- mes "3.Magnolia";
- mes "Creatures shaped in Big Egg Frying Fans. They spank attackers with the Frying Fans without mercy. Don't let your guard down just because they look cute. You will suffer if you do so.";
- mes "^0099FFFound Items^000000: Jellopy.Garlet.Scell";
- next;
- mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
- mes "4.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- goto PayCave;
- close;
- PayCaveF3:
- mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
- mes "2.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
- mes "3.Munak";
- mes "Pretty-looking Female corpse which had been frozen for a long time. She looks like holding a long story deep inside, the story people want to know about. Anyway Don't give her a break,she'll give strong damages on you.";
- mes "^0099FFFound Items^000000: Daenggie ,Munak Turban";
- next;
- mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
- mes "4.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- goto PayCave;
- close;
- PayCaveF4:
- mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
- mes "1.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
- mes "2.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
- mes "3.Sohee";
- mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
- mes "^0099FFFound Items^000000: Black Hair,Red Potion";
- next;
- mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
- mes "4.Horong";
- mes "Eerie-looking fireball of violet colour. Recognizes the living when gets near.";
- mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
- next;
- goto PayCave;
- close;
- PayCaveF5:
- mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
- mes "1.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
- mes "2.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
- mes "3.Sohee";
- mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
- mes "^0099FFFound Items^000000: Black Hair,Red Potion";
- next;
- mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
- mes "4.Horong";
- mes "Eerie-looking fireball of violet colour. Recognizes the living when gets near.";
- mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
- next;
- mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
- mes "5.Moonlight";
- mes "Wild Girl having 9 tails of a Fox, and with a Big Bell on the back.";
- mes "^0099FFFound Items^000000: 9 Tails,White Potion,Topaz,Elunium";
- next;
- goto PayCave;
- close;
- EndPayCave:
- close;
- close;
- Pyramid:
- menu "1F",PyramidF1,"2F",PyramidF2,"3F",PyramidF3,"4F",PyramidF4,"5F",PyramidF5,"6F",PyramidF6,"Cancel",EndPyramid;
-
- PyramidF1:
- mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
- mes "1.Familiar";
- mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
- next;
- mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
- mes "2.Spore";
- mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
- mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
- next;
- mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
- mes "3.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
- next;
- goto Pyramid;
- close;
- PyramidF2:
- mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
- mes "1.Poporing";
- mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
- mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
- next;
- mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
- mes "2.Drainliar";
- mes "Freaking Bloody bat with a might.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
-
- next;
- mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
- mes "3.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
- mes "4.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- goto Pyramid;
- close;
- PyramidF3:
- mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
- mes "1.Drainliar";
- mes "Freaking Bloody bat with a might.";
- mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
- next;
- mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
- mes "2.Soldier Skeleton";
- mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
- mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
- next;
- mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
- mes "3.Archer Skeleton";
- mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
- mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
- next;
- mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
- mes "4.Mummy";
- mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
- mes "^0099FFFound Items^000000: Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
- mes "5.Verit";
- mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
- mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
- next;
- goto Pyramid;
- close;
- PyramidF4:
- mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
- mes "1.Mummy";
- mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
- mes "^0099FFFound Items^000000: Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
- mes "2.Verit";
- mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
- mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
- mes "3.Ghoul";
- mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
- mes "^0099FFFound Items^000000: Horrendous Mouth";
- next;
- mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
- mes "4.Isis";
- mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
- mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
- next;
- goto Pyramid;
- close;
- PyramidF5:
- mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
- mes "1.Mummy";
- mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
- mes "^0099FFFound Items^000000: Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
- mes "2.Ghoul";
- mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
- mes "^0099FFFound Items^000000: Horrendous Mouth";
- next;
- mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
- mes "3.Isis";
- mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
- mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
- next;
- goto Pyramid;
- close;
- PyramidF6:
- mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
- mes "1.Mummy";
- mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
- mes "^0099FFFound Items^000000: Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
- mes "2.Verit";
- mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
- mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
- next;
- mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
- mes "3.Ghoul";
- mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
- mes "^0099FFFound Items^000000: Horrendous Mouth";
- next;
- mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
- mes "4.Isis";
- mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
- mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
- next;
- mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
- mes "5.Osiris";
- mes "Mummy King with a rotten bandage all over the body, wearing a Crown on the head. He threatens Adventurers with an incredible might.";
- mes "^0099FFFound Items^000000: Memento,Rotten Bandage,Hand of God,Elunium";
- next;
- goto Pyramid;
- close;
- EndPyramid:
- close;
- close;
- Cancel:
- close;
-}
-//<=========== Library - End ==========>\\
+// $Id: books.txt,v 1.1.1.1 2004/09/10 17:26:42 MagicalTux Exp $
+// Changed Mage Guild Book to the correct one (now located in mage.txt)
+// Fixed over 300 spelling/grammar mistakes. (I was that bored!) [Nexon]
+//<--------------- NPCs BOOKS [Update: July. 27, 2004] --------------->\\
+
+//<=========== Library - Begin ==========>\\
+prt_in.gat,159,56,4 script Monster Encyclopedia::me_prt_in 111,{
+ mes "^FF0000[Monster Encyclopedia]^000000";
+ mes "This is a Monster Encyclopedia including information of Earth,Fire,Neutral Monsters!";
+ next;
+ menu "Monsters of Earth Property",MonEarPro,"Monsters of Fire Property",MonFirPro,"Monsters of Neutral Property",MonNeuPro,"Cancel",Cancel;
+
+ MonEarPro:
+ menu "Small Size Monster",SmaMonEarPro,"Medium Size Monster",MedMonEarPro,"Great Size Monster",GrMonEarPro,"Cancel",EndMonEarPro;
+
+ SmaMonEarPro:
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "1.Fabre";
+ mes "Larva of Creamy. It is cute when it wiggles,even though it is a weak and small monster,";
+ mes "People often tend to slay Fabres,only for the reason they can get `Feather's,one of required items for `Bunny Band'.";
+ mes "^0099FFFound Items^000000: Feather. Fluff .Green Herb.Clover";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "2.Pupa";
+ mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "3.Martin";
+ mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
+ mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "3.Savage Bebe";
+ mes "Tiny Pink baby of Savage. Unlike its small size, It is running about fields making annoying noise.";
+ mes "^0099FFFound Items^000000: Leather,Meat,Arrow,Feather";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "4.Andre";
+ mes "A kind of Worker Ants,they are very diligent in their work. They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "5.Coco";
+ mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
+ mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "6.Piere";
+ mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "7.Smokie";
+ mes "It's working out all the time. Often tries to shape shift with Racoon Leaves,but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
+ mes "^0099FFFound Items^000000: Raccon Leaf,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "8.Deniro";
+ mes "A kind of Work Ants, tend to group in a same kind as well as other ants.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "9.Yoyo";
+ mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the ground outrageously, but they are nimble and cooperative, you must be cautious of being attacked by a group.";
+ mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "10.Vitata";
+ mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "11.Caramel";
+ mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immediately.";
+ mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
+ next;
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "12.Giearth";
+ mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
+ mes "^0099FFFound Items^000000: Old Pixie's Moustache";
+ next;
+ goto MonEarPro;
+ close;
+ MedMonEarPro:
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "1.Willow";
+ mes "Creature reborn from a Gigantic Old Tree. Everything like the figure or the sound to related it is eerie.";
+ mes "^0099FFFound Items^000000: Tree Root,Trunk,Red Herb,Sweet Potato";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "2.Rocker";
+ mes "Lazy Grasshopper which loves playing Violin.";
+ mes "^0099FFFound Items^000000: Grasshopper's Leg,Jellopy";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "3.Madragora";
+ mes "Stays the same but attacks passengers using Stalks under the ground. Look so Horrible,also attacks Very annoyingly.";
+ mes "^0099FFFound Items^000000: Stem,Green Herb,Shoot";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "4.Wolf";
+ mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
+ mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "5.Snake";
+ mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
+ mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "6.Horn";
+ mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
+ mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "7.Orc Warrior";
+ mes "Self-Confident Warrior of the Orc Tribe.";
+ mes "^0099FFFound Items^000000:Orcish Voucher";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "8.Hode";
+ mes "Huge earthworm without any more description. Huge earthworm!Usually conceals itself under the ground,commonly found in the Desert.";
+ mes "^0099FFFound Items^000000: Earthworm Peeling,Sticky Muscus";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "9.Mantis";
+ mes "It wanders about the field waving a tiny fan.";
+ mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "10.Savage";
+ mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
+ mes "^0099FFFound Items^000000: Mane,Leather";
+ next;
+ mes "^FF0000[Earth,Medium Monster Encyclopedia]^000000";
+ mes "11.Petite";
+ mes "Tiny little Walking Dragon. It seems like there exists 2 different kinds of Petite, flying one and walking one and this is the 2nd one.";
+ mes "^0099FFFound Items^000000: Dragon Canine,Dragon Tail,Zargon";
+ next;
+ goto MonEarPro;
+ close;
+ GrMonEarPro:
+ mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
+ mes "1.Worm Tail";
+ mes "Tiny little creature of light green which has a spiky,thin and long stick on the back. Usually it is very gentle but attacks using the stick on the back when got attacked,so be careful!";
+ mes "^0099FFFound Items^000000: Pointed Scale,Yellow Herb";
+ next;
+ mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
+ mes "2.Muka";
+ mes "Cute Cactus commonly found in the Desert. It tries to threaten passengers with some funny sound but always failed.";
+ mes "^0099FFFound Items^000000: Cactus Needle,Empty Bottle,Green Herb,Red Herb";
+ next;
+ mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
+ mes "3.Big Foot";
+ mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
+ mes "^0099FFFound Items^000000: Bear's Foot Skin,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Earth,Great Monster Encyclopedia]^000000";
+ mes "4.Flora";
+ mes "Man eater with a big mouth. It pretends just a simple plant but anybody coming near,it rushes into him fiercely.";
+ mes "^0099FFFound Items^000000: Maneater Blossom,Stem";
+ next;
+ goto MonEarPro;
+ close;
+ EndMonEarPro:
+ close;
+ close;
+ MonFirPro:
+ menu "Small Size Monster",SmaMonFirPro,"Medium Size Monster",MedMonFirPro,"Great Size Monster",GrMonFirPro,"Cancel",EndMonFirPro;
+
+ SmaMonFirPro:
+ mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
+ mes "1.Picky";
+ mes "Cute little chick before Peco Peco. It can't be realized that this little creature grows into a Peco Peco the big,strong bird.";
+ mes "Sometimes you can find a picky with an egg shell which is a bit stronger than a normal picky.";
+ mes "^0099FFFound Items^000000: Feather of Birds. Feather. Red Herb. Milk.";
+ next;
+ mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
+ mes "2.Baby Desert Wolf";
+ mes "Baby of Desert Wolf,trying to threaten passengers with a big bay.";
+ mes "If you want to pat one of them,because you think it is pretty,don't do that before taking a look around enough. Not babies come to rush you but their parents will assault you at the same time. Parents don't want their babies being harmed.";
+ mes "^0099FFFound Items^000000: Leather,Meat";
+ next;
+ mes "^FF0000[Fire,Small Monster Encyclopedia]^000000";
+ mes "3.Horong";
+ mes "Eerie-looking fireball of violet colour. Recognises the living when gets near.";
+ mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
+ next;
+ goto MonFirPro;
+ close;
+ MedMonFirPro:
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "1.Drops";
+ mes "A kind of Poring,but commonly found in the Desert and colors in Pale Orange. It eats everything just like Poring does.";
+ mes "However it seems to be a bit stronger than Poring anyway.";
+ mes "^0099FFFound Items^000000: Jellopy,Sticky Muscus,Apple,Empty Bottle,Red Herb";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "2.Elder Willow";
+ mes "A kind of Willow but it looks older and colors in red. Frightening as much as Willow.";
+
+ mes "^0099FFFound Items^000000: Resin,Trunk,Sweet Potato";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "3.Metaller";
+ mes "Evolved one of Rocker. It is dim brown and lives in the Desert. Lazy equally to Rocker,but it steals stuffs on the ground.";
+ mes "^0099FFFound Items^000000: Red Blood,Grasshopper's Leg,Scell,Shell";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "4.Zerom";
+ mes "Undead Slave who had been extremely abused before he died. He is wandering in the Sphinx,carrying a big box on the back..";
+ mes "^0099FFFound Items^000000: Panties";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "5.Scorpion";
+ mes "Scorpion spreaded over the Desert. It is dangerous as much as its beautiful colour. Watch out its sharp tail.";
+ mes "^0099FFFound Items^000000: Scorpion Tail,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "6.Desert Wolf";
+ mes "Wolf commonly found in the desert,which is stronger than a Forest one. Take a look around before doing attacks,because Wolf tends to be cooperative each other!";
+ mes "^0099FFFound Items^000000: Leather,Mink Coat,Meat,Wolf Claw";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "7.Frilldora";
+ mes "Lizard which has a Unique neck. Looks a bit funny but is very Strong unlike its appearance.";
+ mes "^0099FFFound Items^000000: Frill,Reptile Tongue,Red Potion,Zargon";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "8.Cobold the 3rd";
+ mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
+ mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
+ next;
+ mes "^FF0000[Fire,Medium Monster Encyclopedia]^000000";
+ mes "9.Jakk";
+ mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
+ mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
+ next;
+ goto MonFirPro;
+ close;
+ GrMonFirPro:
+ mes "^FF0000[Fire,Great Monster Encyclopedia]^000000";
+ mes "1.Peco Peco";
+ mes "Nowadays peco peco is popular as vehicle for knights. They lives in the Desert or Forest and also cooperative.";
+ mes "^0099FFFound Items^000000: Bill of Birds,Yellow Herb,Red Herb";
+ next;
+ mes "^FF0000[Fire,Great Monster Encyclopedia]^000000";
+ mes "2.Marduk";
+ mes "Unknown monster wearing Catholic uniform and looking serious.";
+ mes "^0099FFFound Items^000000: Flame Heart";
+ next;
+ goto MonFirPro;
+ close;
+ EndMonFirPro:
+ close;
+ close;
+ MonNeuPro:
+ menu "Small Size Monster",SmaMonNeuPro,"Medium Size Monster",MedMonNeuPro,"Great Size Monster",GrMonNeuPro,"Cancel",EndMonNeuPro;
+
+ SmaMonNeuPro:
+ mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
+ mes "1.Lunatic";
+ mes "Plump and shaggy monster shaped in Rabbit. However it won't give you a `Bunny Band'.";
+ mes "^0099FFFound Items^000000: Clover,Feather,Carrot,Red Herb";
+ next;
+ mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
+ mes "2.Peco Peco Egg";
+ mes "Egg of Peco Peco. It is so tiny that doesn't look like an egg of Big Bird. Novice people love to Crack it because it doesn't attack at all.";
+ mes "^0099FFFound Items^000000: Shell,Red Potion,Empty Bottle";
+ next;
+ mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
+ mes "3.Ant Egg";
+ mes "Simple Ant Egg.";
+ mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
+ next;
+ mes "^FF0000[Neutral,Small Monster Encyclopedia]^000000";
+ mes "2.Baby Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
+ next;
+ goto MonNeuPro;
+ close;
+ MedMonNeuPro:
+ mes "^FF0000[Neutral,Medium Monster Encyclopedia]^000000";
+ mes "Unfortunately there is no medium monster of Neutral property which has been discovered so far.";
+ next;
+ goto MonNeuPro;
+ close;
+ GrMonNeuPro:
+ mes "^FF0000[Neutral,Great Monster Encyclopedia]^000000";
+ mes "1.Golem";
+ mes "Living Stone which has spell-bound by Black Magic. Its gigantic body makes its moving slow. Recognizes Magic Spell Casting.";
+ mes "^0099FFFound Items^000000: Scell";
+ next;
+ goto MonNeuPro;
+ close;
+ EndMonNeuPro:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,161,50,4 script Monster Encyclopedia::me_prt_in2 111,{
+ mes "^FF0000[Monster Encyclopedia]^000000";
+ mes "This is a Monster Encyclopedia including Monsters of Dark,Poison and Undead Property!";
+ next;
+ menu "Monster of Dark Property",MonDrkPro,"Monster of Poison Property",MonPsoPro,"Monster of Undead Property",MonUndPro,"Cancel",Cancel;
+
+ MonDrkPro:
+ menu "Small Size Monster",SmaMonDrkPro,"Medium Size Monster",MedMonDrkPro,"Great Size Monster",GrMonDrkPro,"Cancel",EndMonDrkPro;
+
+ SmaMonDrkPro:
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "1.Thief Bug Egg";
+ mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "2.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "3.Tarou";
+ mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert.";
+ mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
+ next;
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "4.Drainliar";
+ mes "Freaking Bloody bat with a might.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
+ next;
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "5.Dokebi";
+ mes "Korean Traditional Ghost with Dark Skin. It looks so cute and has a small horn on the head.";
+ mes "^0099FFFound Items^000000: Dokebi Horn";
+ next;
+ mes "^FF0000[Dark,Small Monster Encyclopedia]^000000";
+ mes "6.Deviruchi";
+ mes "Little evil creature,which carries a cute fork with.";
+ mes "^0099FFFound Items^000000: Little Evil Horn,Little Evil Wing,Zargon";
+ next;
+ goto MonDrkPro;
+ close;
+ MedMonDrkPro:
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "1.Female Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb, Jellopy, Garlet. Insect Feeler";
+ next;
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "2.Male Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb, Jellopy, Garlet. Insect Feeler,Yellow Herb";
+ next;
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "3.Matyr";
+ mes "Creature shaped in Black Dog.";
+ mes "^0099FFFound Items^000000: Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "4.Zenorc";
+ mes "Mutant Orc with a small and short build. It moves around using both hands and feet. It owns High AGI stat,so that it passes off almost every attack.";
+ mes "^0099FFFound Items^000000: Znorc's Fang,Sticky Muscus,Yellow Potion";
+ next;
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "5.Requiem";
+ mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
+ mes "^0099FFFound Items^000000: Mystic Blue Box";
+ next;
+ mes "^FF0000[Dark,Medium Monster Encyclopedia]^000000";
+ mes "6.Bathory";
+ mes "Witch with a big wen on the nose. She rides on her magic broom flying around in the air.";
+ mes "^0099FFFound Items^000000: Witched Starsand";
+ next;
+ goto MonDrkPro;
+ close;
+ GrMonDrkPro:
+ mes "^FF0000[Dark,Great Monster Encyclopedia]^000000";
+ mes "1.Isis.";
+ mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
+ mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
+ next;
+ mes "^FF0000[Dark,Great Monster Encyclopedia]^000000";
+ mes "3.Raydric";
+ mes "Ghost Knight of misfortune.";
+ mes "^0099FFFound Items^000000: Elunium, Chivarly Emblem";
+ next;
+ goto MonDrkPro;
+ close;
+ EndMonDrkPro:
+ close;
+ close;
+ MonPsoPro:
+ menu "Small Size Monster",SmaMonPsoPro,"Medium Size Monster",MedMonPsoPro,"Great Size Monster",GrMonPsoPro,"Cancel",EndMonPsoPro;
+
+ SmaMonPsoPro:
+ mes "^FF0000[Poison,Small Monster Encyclopedia]^000000";
+ mes "Unfortunately there is no small monster of Poison Property which has been discovered so far.";
+ next;
+ goto MonPsoPro;
+ close;
+ MedMonPsoPro:
+ mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
+ mes "1.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus, Garlet,Green Herb";
+ next;
+ mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
+ mes "2.Poison Spore";
+ mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
+ mes "^0099FFFound Items^000000: Spore,Green Herb";
+ next;
+ mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
+ mes "3.Cobold the 2nd";
+ mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
+ mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
+ next;
+ mes "^FF0000[Poison,Medium Monster Encyclopedia]^000000";
+ mes "4.Side Winder";
+ mes "Horrendous Snake of Dark colour.";
+ mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
+ next;
+ goto MonPsoPro;
+ close;
+ GrMonPsoPro:
+ mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
+ mes "1.Argos";
+ mes "Big Spider of Dark colour. It often invades passengers who intend to go over Mt.Mjornir. Be cautious of Argos,if you are the one of those passengers.";
+ mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
+ mes "2.Argiope";
+ mes "Monster crawling around with several articular legs.";
+ mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
+ next;
+ mes "^FF0000[Poison,Great Monster Encyclopedia]^000000";
+ mes "4.Myst";
+ mes "Mist-like Monster.";
+ mes "^0099FFFound Items^000000: Trunk. Gas Mask";
+ next;
+ goto MonPsoPro;
+ close;
+ EndMonPsoPro:
+ close;
+ close;
+ MonUndPro:
+ menu "Small Size Monster",SmaMonUndPro,"Medium Size Monster",MedMonUndPro,"Great Size Monster",GrMonUndPro,"Cancel",EndMonUndPro;
+
+ SmaMonUndPro:
+ mes "^FF0000[Undead,Small Monster Encyclopedia]^000000";
+ mes "Unfortunately there is no small monster of Undead Property which has been discovered so far.";
+ next;
+ goto MonUndPro;
+ close;
+ MedMonUndPro:
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "1.Zombie";
+ mes "Bad Case of the Dead which has been reborn as a Walking Corpse by Back magic. Let's lead it to Nirvana.";
+ mes "^0099FFFound Items^000000: Decayed Nail,Sticky Muscus,Horrendous Mouth";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "2.Megalodon";
+ mes "Skeleton Fish having spooky empty eye-holes.";
+ mes "^0099FFFound Items^000000: Stinky Scale, Skel-Bone";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "3.Orc Zombie";
+ mes "Corpse of the Orc which has been given a new life by Black magic.";
+ mes "^0099FFFound Items^000000: Orc Claw,Sticky Muscus";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "4.Pirate Skel";
+ mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
+ mes "^0099FFFound Items^000000: Skel-Bone";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "5.Orc Skeleton";
+ mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
+ mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "6.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "7.Munak";
+ mes "Pretty-looking Female corpse which had been frozen for a long time. She looks like holding a long story deep inside, the story people want to know about. Anyway Don't give her a break,she'll give strong damages on you.";
+ mes "^0099FFFound Items^000000: Daenggie ,Munak Turban";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "8.Skel Worker";
+ mes "Walking Skeleton which was dead in a mine.";
+ mes "^0099FFFound Items^000000: Iron,Lantern";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "9.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "10.Mummy";
+ mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
+ mes "^0099FFFound Items^000000: Rotten Bandage";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "11.Verit";
+ mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
+ mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
+ next;
+ mes "^FF0000[Undead,Medium Monster Encyclopedia]^000000";
+ mes "12.Ghoul";
+ mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
+ mes "^0099FFFound Items^000000: Horrendous Mouth";
+ next;
+ goto MonUndPro;
+ close;
+ GrMonUndPro:
+ mes "^FF0000[Undead,Great Monster Encyclopedia]^000000";
+ mes "3.Evil Druid";
+ mes "You'll shudder even once looking at it.";
+ mes "^0099FFFound Items^000000: Amulet,White Herb";
+ next;
+ goto MonUndPro;
+ close;
+ EndMonUndPro:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,162,68,4 script `Merchant Guideline' for Dummies::mgfd_2 111,{
+ mes "^FF0000[`Merchant Guideline' for Dummies]^000000";
+ mes "Please go over the next page if you want to check `Vending'.";
+ next;
+ menu "Go over the next page",NextPage,"Close the book",CloseB;
+
+ NextPage:
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "To Vend a Shop,first you must equip a ^0099FFCart^000000.";
+ mes "You can rent a cart from Kafra. When equipped once,it won't be disappeared as long as you don't take off.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "However,this cart diminishes moving speed. You can recover moving speed after learning `Push Cart' the skill.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "When learn `Push Cart' over 3 points,it will allow you to learn `Vending'. You can display 3 kinds of item on your shop with Vending at first.";
+ mes "As Vending skill goes higher, it will allow you to display more items.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "Let's store things you want to sell in the Cart.";
+ mes "To open Cart Window,Use ^0099FFalt+W^000000 as hotkey. Or it will be open when you click `Item' icon on equipment(alt+Q) window.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "Now Use `Vending' skill.2 kinds of Window-`Item Shop' and `Item you want to sell'- will pop up.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "On `Item Shop' window,name your shop. Then Drag items onto `Item you want to sell' window and Fix the price.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "When close `My Shop' window,your shop will be closed. You can check each price of items with a mouse on the items. Meanwhile it keeps being recorded on Chat window how many items or which kind have been sold.";
+ next;
+ mes "^FF0000[Vending Guide for Dummies]^000000";
+ mes "When every thing's sold out,the shop will be closed automatically.";
+ close;
+ CloseB:
+ close;
+}
+
+prt_in.gat,164,96,4 script Monster Encyclopedia::me_prt_in3 111,{
+ mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
+ mes "This is an Encyclopedia describing Monsters living in Dungeons.";
+ next;
+ next;
+ menu "Orc Dungeon",OrcDung,"Byalan Cave near Izlude",ByaCave,"Prontera Culvert",PrtCul;
+
+ OrcDung:
+ menu "F1",OrcDungF1,"F2",OrcDungF2,"Cancel",EndOrcDung;
+
+ OrcDungF1:
+ mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
+ mes "1.Chonchon";
+ mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
+ mes "^0099FFFound Items^000000: Shell, Jellopy, Fly Wing";
+ next;
+ mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
+ mes "2.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
+ mes "3.Orc Zombie";
+ mes "Corpse of the Orc which has been given a new life by Black magic.";
+ mes "^0099FFFound Items^000000: Orc Claw,Sticky Muscus";
+ next;
+ mes "^FF0000[Orc Dungeon 1F Monster Encyclopedia]^000000";
+ mes "4.Orc Skeleton";
+ mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
+ mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
+ next;
+ goto OrcDung;
+ close;
+ OrcDungF2:
+ mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
+ mes "1.Chonchon";
+ mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
+ mes "^0099FFFound Items^000000: Shell, Jellopy, Fly Wing";
+ next;
+ mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
+ mes "2.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
+ mes "3.Orc Skeleton";
+ mes "Ancient Living Skeleton of the Orc which had been buried for a long time. It has Great Power as well as the period of being buried.";
+ mes "^0099FFFound Items^000000: Orc's Fang,Green Potion";
+ next;
+ mes "^FF0000[Orc Dungeon 2F Monster Encyclopedia]^000000";
+ mes "4.Zenorc";
+ mes "Mutant Orc with a small and short build. It moves around using both hands and feet. It owns High AGI stat,so that it passes off almost every attack.";
+ mes "^0099FFFound Items^000000: Znorc's Fang,Sticky Muscus,Yellow Potion";
+ next;
+ goto OrcDung;
+ close;
+ EndOrcDung:
+ close;
+ close;
+ ByaCave:
+ menu "1F",ByaCaveF1,"2F",ByaCaveF2,"3F",ByaCaveF3,"4F",ByaCaveF4,"5F",ByaCaveF5,"Cancel",EndByaCave;
+
+ ByaCaveF1:
+ mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
+ mes "1.Plankton";
+ mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
+ mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
+ next;
+ mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
+ mes "2.Kukre";
+ mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
+ mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
+ next;
+ mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
+ mes "3.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
+ next;
+ mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
+ mes "4.Vadon";
+ mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
+ mes "^0099FFFound Items^000000: Nipper. Garlet.Solid Shell. Shell";
+ next;
+ mes "^FF0000[Byalan Cave 1F Monster Encyclopedia]^000000";
+ mes "5.Marina";
+ mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
+ mes "^0099FFFound Items^000000: Single Cell. Sticky Muscus";
+ next;
+ goto ByaCave;
+ close;
+ ByaCaveF2:
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "1.Plankton";
+ mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
+ mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
+ next;
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "2.Kukre";
+ mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
+ mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
+ next;
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "3.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
+ next;
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "4.Vadon";
+ mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
+ mes "^0099FFFound Items^000000: Nipper. Garlet.Solid Shell. Shell";
+ next;
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "5.Marina";
+ mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
+ mes "^0099FFFound Items^000000: Single Cell. Sticky Muscus";
+ next;
+ mes "^FF0000[Byalan Cave 2F Monster Encyclopedia]^000000";
+ mes "6.Thara Frog";
+ mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
+ mes "^0099FFFound Items^000000: Spawn, Sticky Webfoot";
+ next;
+ goto ByaCave;
+ close;
+ ByaCaveF3:
+ mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
+ mes "1.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
+ next;
+ mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
+ mes "2.Thara Frog";
+ mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
+ mes "^0099FFFound Items^000000: Spawn, Scell, Sticky Webfoot";
+ next;
+ mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
+ mes "3.Cornutus";
+ mes "Some buddies concealing themselves within hard turban shells and try to lead a quiet life.";
+ mes "^0099FFFound Items^000000: Conch.Scell.Solid Shell";
+ next;
+ mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
+ mes "4.Mars";
+ mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
+ mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
+ next;
+ mes "^FF0000[Byalan Cave 3F Monster Encyclopedia]^000000";
+ mes "5.Obeaune";
+ mes "Female Mermaid. Attacks using long hair, with a grim face.";
+ mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
+ next;
+ goto ByaCave;
+ close;
+ ByaCaveF4:
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "1.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle.Sticky Muscus.Meat";
+ next;
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "2.Mars";
+ mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
+ mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
+ next;
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "3.Obeaune";
+ mes "Female Mermaid. Attacks using long hair, with a grim face.";
+ mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
+ next;
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "4.Marine Sphere";
+ mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
+ mes "^0099FFFound Items^000000: Tendon. Detonator";
+ next;
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "5.Phen";
+ mes "Fish of blue color which is kicking and definitely alive.";
+ mes "^0099FFFound Items^000000: Fish Tail,Sharp Scale,Meat,Fin";
+ next;
+ mes "^FF0000[Byalan Cave 4F Monster Encyclopedia]^000000";
+ mes "6.Sword Fish";
+ mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
+ mes "^0099FFFound Items^000000: Sharp Scale,Gill";
+ next;
+ goto ByaCave;
+ close;
+ ByaCaveF5:
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "1.Marine Sphere";
+ mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
+ mes "^0099FFFound Items^000000: Tendon. Detonator";
+ next;
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "2.Sword Fish";
+ mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
+ mes "^0099FFFound Items^000000: Sharp Scale,Gill";
+ next;
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "3.Mars";
+ mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
+ mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
+ next;
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "4.Obeaune";
+ mes "Female Mermaid. Attacks using long hair, with a grim face.";
+ mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
+ next;
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "5.Marc";
+ mes "Sea Horse. Don't ever think about riding a Sea Horse!";
+ mes "^0099FFFound Items^000000: Gill,Fin";
+ next;
+ mes "^FF0000[Byalan Cave 5F Monster Encyclopedia]^000000";
+ mes "6.Strouf";
+ mes "Fish rarely seen under the deep sea.";
+ mes "^0099FFFound Items^000000: Fin,Feather,Gill";
+ next;
+ goto ByaCave;
+ close;
+ EndByaCave:
+ close;
+ close;
+ PrtCul:
+ menu "1F",PrtCulF1,"2F",PrtCulF2,"3F",PrtCulF3,"4F",PrtCulF4,"Cancel",EndPrtCul;
+
+ PrtCulF1:
+ mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
+ mes "1.Thief Bug Egg";
+ mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
+ mes "2.Thief Bug Baby";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
+ next;
+ mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
+ mes "3.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
+ mes "4.Spore";
+ mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
+ mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 1F Monster Encyclopedia]^000000";
+ mes "5.Tarou";
+ mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert.";
+ mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
+ next;
+ goto PrtCul;
+ close;
+ PrtCulF2:
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "1.Thief Bug Egg";
+ mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "2.Thief Bug Baby";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "3.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "4.Spore";
+ mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
+ mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "5.Tarou";
+ mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
+ mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "6.Plankton";
+ mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
+ mes "^0099FFFound Items^000000: Single Cell.Garlet.Sticky Muscus.Empty Bottle";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "7.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle.Sticky Muscus.Meat";
+ next;
+ mes "^FF0000[Prontera Culvert 2F Monster Encyclopedia]^000000";
+ mes "8.Female Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
+ next;
+ goto PrtCul;
+ close;
+ PrtCulF3:
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "1.Thief Bug Egg";
+ mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "2.Thief Bug Baby";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
+ next;
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "3.Female Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
+ next;
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "4.Tarou";
+ mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
+ mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
+ next;
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "5.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 3F Monster Encyclopedia]^000000";
+ mes "6.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
+ next;
+ goto PrtCul;
+ close;
+ PrtCulF4:
+ mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
+ mes "1.Thief Bug Egg";
+ mes "Egg of Filthy Bug. Let's cut off the evil at its root.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
+ mes "2.Thief Bug Baby";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy";
+ next;
+ mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
+ mes "3.Female Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler";
+ next;
+ mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
+ mes "4.Male Thief Bug";
+ mes "Dirty and filthy Creatures having a strong solidarity with the same kind, eat everything on the ground as well. They are sorted into 3 kinds by the Size and Colour.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Red Herb,Jellopy,Garlet.Insect Feeler,Yellow Herb";
+ next;
+ mes "^FF0000[Prontera Culvert 4F Monster Encyclopedia]^000000";
+ mes "5.Golden Thief Bug";
+ mes "Impertinent Thief Bug of Golden Colour,wearing a solid shell all around the body. It's rarely seen by humans eye.";
+ mes "^0099FFFound Items^000000: Blue Herb,Gold,Ora Ora,Insect Feeler";
+ next;
+ goto PrtCul;
+ close;
+ EndPrtCul:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,164,102,4 script Monster Encyclopedia::me_prt_in4 111,{
+ mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
+ mes "The is an Encyclopedia describing Monsters living in Dungeons.";
+ next;
+ menu "Sunken ship near Alberta",SunkShip,"Prontera Maze",PrtMaze;
+
+ SunkShip:
+ menu "F1",SunkShipF1,"F2",SunkShipF2,"Cancel",EndSunkShip;
+
+ SunkShipF1:
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "1. Plankton";
+ mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with serveral projections.";
+ mes "^0099FFFound Items:^000000 Single Cell. Garlet. Sticky Mocus. Empty Bottle";
+ next;
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "2. Kukre";
+ mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
+ mes "^0099FFFound Items:^000000 Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
+ next;
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "3. Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items:^000000 Tentacles. Sticky Mocus. Meat";
+ next;
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "4. Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
+ mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
+ next;
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "5. Poison Spore";
+ mes "Poisonous Spore in Violet. Besides, it tends to attack haphazardly if anybody gets near.";
+ mes "^0099FFFound Items:^000000 Spore. Green Herb";
+ next;
+ mes "^FF0000[Sunken Ship 1F Monster Encyclopedia]^000000";
+ mes "6. Pirate Skel";
+ mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
+ mes "^0099FFFound Items:^000000 Skel-Bone";
+ next;
+ goto SunkShip;
+ close;
+ SunkShipF2:
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "1. Kukre";
+ mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
+ mes "^0099FFFound Items:^000000 Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "2. Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be in the ass. It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items:^000000 Tentacles. Sticky Mocus. Meat";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "3. Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
+ mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "4. Thara Frogs";
+ mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
+ mes "^0099FFFound Items:^000000 Spawn. Scell. Skicky Webfoot";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "5. Whisper";
+ mes "Living Fabric, which gives spooking feeling.";
+ mes "^0099FFFound Items:^000000 Fabric";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "6. Megalodon";
+ mes "Skeleton Fish having spooky empty eye-holes.";
+ mes "^0099FFFound Items:^000000 Skinky Scale. Skel-Bone";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "7. Pirate Skel";
+ mes "Walking Corpse of a Pirate which had ordered all over the Sea.";
+ mes "^0099FFFound Items:^000000 Skel-Bone";
+ next;
+ mes "^FF0000[Sunken Ship 2F Monster Encyclopedia]^000000";
+ mes "8. Marionette";
+ mes "Monster reborn from bewitched Doll, bound to strings on Wooden Sticks.";
+ mes "^0099FFFound Items:^000000 Skinky Golden Hair, Trunk";
+ next;
+ mes "9. Drake";
+ mes "Awfully Strong Monster which looks like the Captain of this Sunken Ship.";
+ mes "^0099FFFound Items:^000000 Skel-Bone. White";
+ next;
+ goto SunkShip;
+ close;
+ EndSunkShip:
+ close;
+ PrtMaze:
+ menu "F1",PrtMazeF1,"F3",PrtMazeF3,"Cancel",EndPrtMaze;
+
+ PrtMazeF1:
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "1. Poring";
+ mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped.";
+ mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry. They are not strong, and you will get your back once you kill the monster, which eat your stuff.";
+ mes "^0099FFFound Items:^000000 Jellopy. Skicky Mocus. Apple. Empty Bottle. Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "2. Lunatic";
+ mes "Plump and shaggy monster shaped in Rabbit. However it won't give you `Bunny Band'.";
+ mes "^0099FFFound Items:^000000 Clover. Feather. Carrot. Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "3. Fabre";
+ mes "Larva of Creamy. It is cute when it wiggles, even though it is a weak and small monster,";
+ mes "People often tends to slay Fabres, only for the reason they can get `Feather's', one of required items for `Bunny Band'.";
+ mes "^0099FFFound Items:^000000 Fluff. Feather. Green Herb. Clover";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "4. Creamy";
+ mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger then you expect. Be careful!";
+ mes "^0099FFFound Items:^000000 Powder of Butterfly. Honey. Butterfly Wing. Flower";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "5. Pupa";
+ mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
+ mes "^0099FFFound Items:^000000 Chrysalis. Sticky Mocus";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "6. Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring, but much more stronger.";
+ mes "^0099FFFound Items:^000000 Skicky Mocus. Garlet. Green Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "7. Rocker";
+ mes "Lazy Grasshopper which loves playing Violin.";
+ mes "^0099FFFound Items:^000000 Grasshopper's Leg. Jellopy";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "8. Big Foot";
+ mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
+ mes "^0099FFFound Items:^000000 Bear's Foot Skin. Leather. Sweet Potato";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "9. Smokie";
+ mes "It's working out all the time. Often tries to shape shift with Raccon Leaves, but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
+ mes "^0099FFFound Items:^000000 Raccon Leaf. Leather. Sweet Potato";
+ next;
+ mes "10. Snake";
+ mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
+ mes "^0099FFFound Items:^000000 Snake Scale. Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "11.Wolf";
+ mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
+ mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "12.Argiope";
+ mes "Monster crawling around with several articular legs.";
+ mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "13.Argos";
+ mes "Big Spider of Dark colour. It often invades people lost in the Maze.";
+ mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "14.Chonchon";
+ mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
+ mes "^0099FFFound Items^000000: Shell,Jellopy,Fly Wing";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "15.Horn";
+ mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
+ mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "16.Hunter Fly";
+ mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
+ mes "^0099FFFound Items^000000: Solid Shell,Zargon";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "17.Mantis";
+ mes "It wanders about the field waving a tiny fan.";
+ mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "18.Steiner";
+ mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
+ mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "19.Side Winder";
+ mes "Horrendous Snake of Dark colour.";
+ mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "20.Yoyo";
+ mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the gound outrageously, but they are nimble and cooperative,you must be cautious of being attacked by a group.";
+ mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "^FF0000[Earth,Small Monster Encyclopedia]^000000";
+ mes "21.Caramel";
+ mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immeduately.";
+ mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "22.Steel Chonchon";
+ mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
+ mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "23.Coco";
+ mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
+ mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "24.Dustiness";
+ mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
+ mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "25.Martin";
+ mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
+ mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
+ next;
+ mes "^FF0000[Prontera Maze 1F Monster Encyclopedia]^000000";
+ mes "26.Savage";
+ mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
+ mes "^0099FFFound Items^000000: Mane,Leather";
+ next;
+ goto PrtMaze;
+ close;
+ PrtMazeF3:
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "1.Poring";
+ mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped,";
+ mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry. They are not strong, and you will get yours back once you kill the monster, which eat your stuff.";
+ mes "^0099FFFound Items^000000: Jellopy.Sticky Muscus.Apple.Empty Bottle.Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "2.Lunatic";
+ mes "Plump and shaggy monster shaped in Rabbit. However it won't give you a `Bunny Band'.";
+ mes "^0099FFFound Items^000000: Clover,Feather,Carrot,Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "3.Fabre";
+ mes "Larva of Creamy. It is cute when it wiggles,even though it is a weak and small monster,";
+ mes "People often tend to slay Fabres,only for the reason they can get `Feather's,one of required items for `Bunny Band'.";
+ mes "^0099FFFound Items^000000: Fluff.Feather.Green Herb.Clover";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "4.Creamy";
+ mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger than you expect. Be careful!";
+ mes "^0099FFFound Items^000000: Powder of Butterfly,Honey,Butterfly Wing,Flower";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "5.Pupa";
+ mes "Monster on the Fabre's pupal stage. It doesn't attack at all, so easy to kill for Novice people.";
+ mes "^0099FFFound Items^000000: Chrysalis,Sticky Muscus";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "6.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "7.Rocker";
+ mes "Lazy Grasshopper which loves playing Violin.";
+ mes "^0099FFFound Items^000000: Grasshopper's Leg,Jellopy";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "8.Big Foot";
+ mes "Dull-Looking Bear with a huge build. Although it looks dumb but you will realize how it can be fast after you provoke it.";
+ mes "^0099FFFound Items^000000: Bear's Foot Skin,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "9.Smokie";
+ mes "It's working out all the time. Often tries to shape shift with Raccon Leaves,but always failed. Back then, it tended to gather stuffs diligently, now it seems to give up.";
+ mes "^0099FFFound Items^000000: Raccon Leaf,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "10.Snake";
+ mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
+ mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "11.Wolf";
+ mes "Wanderers having Blue Manes. They are cooperative,so attack in a group when one got attacked. Let's just let them mind their business and watch.";
+ mes "^0099FFFound Items^000000: Wolf Claw,Meat,Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "12.Argiope";
+ mes "Monster crawling around with several articular legs.";
+ mes "^0099FFFound Items^000000: Bug Leg,Zargon,Green Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "13.Argos";
+ mes "Big Spider of Dark colour. It often invades passengers.";
+ mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "14.Horn";
+ mes "Compliant Insect unlike its offensive appearance. It's wandering about the field making some crunching sound.";
+ mes "^0099FFFound Items^000000: Horn,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "15.Hunter Fly";
+ mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
+ mes "^0099FFFound Items^000000: Solid Shell,Zargon";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "16.Mantis";
+ mes "It wanders about the field waving a tiny fan.";
+ mes "^0099FFFound Items^000000: Mantis Scythe,Scell,Solid Shell,Red Potion";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "17.Steiner";
+ mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
+ mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "18.Side Winder";
+ mes "Horrendous Snake of Dark colour.";
+ mes "^0099FFFound Items^000000: Shining Scale,Zargon,Poisonous Canine,Snake Scale";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "19.Yoyo";
+ mes "Pink coloured Monkey. Not only they pick up every stuff dropped on the ground outrageously, but they are nimble and cooperative,you must be cautious of being attacked by a group.";
+ mes "^0099FFFound Items^000000: Yoyo Tail,Banana,Yellow Herb,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "20.Caramel";
+ mes "Cute porcupine with tiny spiky quills. But don't ever touch it without intention,it will get mad immediately.";
+ mes "^0099FFFound Items^000000: Porcupine Quill,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "21.Steel Chonchon";
+ mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
+ mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "22.Coco";
+ mes "Little but fierce-looking eyed Creature carrying an Acorn on both hands. It is very unpleasant when it gives a dirty look,let's give it a lesson.";
+ mes "^0099FFFound Items^000000: Acorn,Fluff,Leather,Sweet Potato";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "23.Dustiness";
+ mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
+ mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "24.Martin";
+ mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
+ mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "25.Savage";
+ mes "Wild Boar always walking around restlessly,making some noise. It has Big fangs and looks different from the young one.";
+ mes "^0099FFFound Items^000000: Mane,Leather";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "26.Savage Bebe";
+ mes "Tiny Pink baby of Savage. Unlike its small size, It is running about fields making annoying noise";
+ mes "^0099FFFound Items^000000: Leather,Meat,Arrow,Feather";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "27.Mastering";
+ mes "Giant Poring rarely seen in the Morroc Desert,Mt.Mjornir or the Prontera Maze. It might be the leader of Porings. Surely stronger than normal Porings but, still it can't be more than a Poring anyway.";
+ mes "^0099FFFound Items^000000: Apple,Apple Juice";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "28.Eclipse";
+ mes "Giant Lunatic which might be the Boss among Lunatics!It does weak attacks but is highly defensive at the same time.";
+ mes "^0099FFFound Items^000000: Carrot,Glass Bead,Milk,Carrot Juice";
+ next;
+ mes "^FF0000[Prontera Maze 3F Monster Encyclopedia]^000000";
+ mes "29.Baphomet";
+ mes "Dreadful Monster having huge horns on the head. It uses a Gargantuan Scythe to slay foes,often attacks with bare hands.";
+ mes "^0099FFFound Items^000000: Evil Horn,Yggdrasilberry,Leather,Oridecon";
+ next;
+ EndPrtMaze:
+ close;
+}
+
+prt_in.gat,168,56,4 script Monster Encyclopedia::me_prt_in5 111,{
+ mes "^FF0000[Monster Encyclopedia]^000000";
+ mes "I am a Monster Encyclopedia, you can check several types of Monster with me.";
+ next;
+ menu "Monsters of Water Property",MonWatPro,"Monsters of Wind Property",MonWinPro,"Monsters of Spiritual Property",MonSpiPro,"Cancel",Cancel;
+
+ MonWatPro:
+ menu "Small Size Monster",SmaMonWatPro,"Medium Size Monster",MidMonWatPro,"Great Size Monster",GrMonWatPro,"Cancel",EndMonWatPro;
+
+ SmaMonWatPro:
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "1.Plankton";
+ mes "Even though looks like trifle creatures, they fly into a rage when stepped on. They are light, drifting on the water and attack with several projections.";
+ mes "^0099FFFound Items^000000: Single Cell. Garlet. Sticky Muscus. Empty Bottle";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "2.Kukre";
+ mes "Look better than Thief Bugs but basically do the same thing. But luckily they don't attack players in a group.";
+ mes "^0099FFFound Items^000000: Worm Peeling. Garlet. Monster's Feed. Red Herb. Insect Feeler";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "3.Hydra";
+ mes "Veggie Monsters which live near water or in the deep sea. Attack using tentacles. When run into them in a group, it will be the pain in the ass.";
+ mes "It will be effective to kill one by one before they gather.";
+ mes "^0099FFFound Items^000000: Tentacle. Sticky Muscus. Meat";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "4.Vadon";
+ mes "They wear thick shells all around the body and walk around tinkling nippers. Also their red color looks so tempting an appetite. Be careful anyway.";
+ mes "^0099FFFound Items^000000: Nipper.Garlet.Solid Shell.Shell";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "5.Marina";
+ mes "Jelly Fishes of transparent white color. Do flexible attacks stretching its body as long as they can. They live in cool places near water.";
+ mes "^0099FFFound Items^000000: Single Cell.Sticky Muscus";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "6.Cornutus";
+ mes "Some buddies concealing themselves within hard turban shells and try to lead a quiet life.";
+ mes "^0099FFFound Items^000000: Conch. Scell. Solid Shell";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "7.Magnolia";
+ mes "Creatures shaped in Big Egg Frying Fans. They spank attackers with the Frying Fans without mercy.";
+ mes "Don't let your guard down just because they look cute. You will suffer if you do so.";
+ mes "^0099FFFound Items^000000: Jellopy. Garlet. Scell";
+ next;
+ mes "^FF0000[Water, Small Monster Encyclopedia]^000000";
+ mes "8.Marine Sphere";
+ mes "Strange, round-shaped monsters beating so fast that they seem like they will burst.";
+ mes "^0099FFFound Items^000000: Tendon. Detonator";
+ next;
+ goto MonWatPro;
+ close;
+ MidMonWatPro:
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "1.Poring";
+ mes "Small and circular monsters of transparent pink color. Swallow anything on the ground with sparkling eyes, without any hesitations. No matter what kind of things dropped,";
+ mes "They tend to eat first. So be cautious when you put down drop something on the ground. But don't worry.";
+ mes "They are not strong, and you will get yours back once you kill the monster, which eat your stuff.";
+ mes "^0099FFFound Items^000000: Jellopy.Sticky Muscus.Apple.Empty Bottle.Red Herb";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "2.Roda Frog";
+ mes "Usually they are hopping around, croaking very annoyingly. Let's stomp on them when found.";
+ mes "^0099FFFound Items^000000: Sticky Webfoot,Spawn,Green Herb,Empty Bottle";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "3.Spore";
+ mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
+ mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "4.Goblin";
+ mes "They are small and attack passengers using different kinds of mace. They always wear Masques, which frighten people more because we can't see what they might look like.";
+ mes "There are all 5 different types, and they seem to be brothers.";
+ mes "^0099FFFound Items^000000: Yellow Herb,Red Potion";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "5.Thara Frog";
+ mes "Frogs of red color, surely stronger than Roda Frogs. However there is obvious one thing in common about them, annoying croaking noise.";
+ mes "^0099FFFound Items^000000: Spawn,Scell,Sticky Webfoot";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "6.Phen";
+ mes "Fish of blue color which is kicking and definitely alive.";
+ mes "^0099FFFound Items^000000: Fish Tail,Sharp Scale,Meat,Fin";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "7.Mars";
+ mes "Have many legs, flapping under the water. Do not rush to it because of its tempting look.";
+ mes "^0099FFFound Items^000000: Squid Ink,Tentacle";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "8.Obeaune";
+ mes "Female Mermaid. Attacks using long hair, with a grim face.";
+ mes "^0099FFFound Items^000000: Heart of Mermaid,Fin";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "9. Sohee";
+ mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
+ mes "^0099FFFound Items^000000: Black Hair,Red Potion";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "10.Marc";
+ mes "Sea Horse. Don't ever think about riding a Sea Horse!";
+ mes "^0099FFFound Items^000000: Gill,Fin";
+ next;
+ mes "^FF0000[Water,Medium Monster Encyclopedia]^000000";
+ mes "11.Deviace";
+ mes "Fish monster with a big mouth possibly carrying something within. Small but Strong.";
+ mes "^0099FFFound Items^000000: Ancient Tooth,Ancient Lips";
+ next;
+ goto MonWatPro;
+ close;
+ GrMonWatPro:
+ mes "^FF0000[Water,Great Monster Encyclopedia]^000000";
+ mes "1.Ambernite";
+ mes "Snail shaped monster, it is highly strong and defensive at the same time. Don't you worry though. It is too slow to catch you so that you can run away at ease any time.";
+ mes "^0099FFFound Items^000000: Snail's Shell,Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Water,Great Monster Encyclopedia]^000000";
+ mes "2.Sword Fish";
+ mes "Fish Monster with a sharp, thin, and long nose. Goggle eyes are funny but it belongs to one of those dangerous monsters.";
+ mes "^0099FFFound Items^000000: Sharp Scale,Gill";
+ next;
+ goto MonWatPro;
+ close;
+ EndMonWatPro:
+ close;
+ close;
+ MonWinPro:
+ menu "Small Size Monster",SmaMonWinPro,"Medium Size Monster",MedMonWinPro,"Great Size Monster",GrMonWinPro,"Cancel",EndMonWinPro;
+
+ SmaMonWinPro:
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "1.Chonchon";
+ mes "Flying monsters, they are not strong but make as annoying noises as Roda Frog. Make sure to eliminate them whenever you see.";
+ mes "^0099FFFound Items^000000: Shell,Jellopy,Fly Wing";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "2.Hornet";
+ mes "Usually they are doing their duty but when get harmed, they will group themselves to attack the enemy without mercy!";
+ mes "^0099FFFound Items^000000: Bee Sting,Jellopy,Green Herb";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "3.Creamy";
+ mes "Monster with Beautiful Wings. `Hah~ it's just a butterfly!'. Careless thinking like this will make you bleeding~! It is much stronger than you expect. Be careful!";
+ mes "^0099FFFound Items^000000: Powder of Butterfly,Honey,Butterfly Wing,Flower";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "4.Steiner";
+ mes "Tiny little insect with a Splendid shell. Don't ever look down upon it. It is stronger than you expect. Besides it recognizes Magical Spell Casting.";
+ mes "^0099FFFound Items^000000: Rainbow Shell,Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "5.Steel Chonchon";
+ mes "This is similar as Chonchon, but in yellow and green. Picks up every stuff on the ground. It is strong and well-cooperative with its fellows, so don't forget to get items before it picks up.";
+ mes "^0099FFFound Items^000000: Garlet,Shell,Solid Shell";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "6.Dustiness";
+ mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
+ mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
+ next;
+ mes "^FF0000[Wind,Small Monster Encyclopedia]^000000";
+ mes "7.Hunter Fly";
+ mes "Winged insect of Blood. It is Strong meanwhile very annoying. Be advised, you'd better flee away if you can.";
+ mes "^0099FFFound Items^000000: Solid Shell,Zargon";
+ next;
+ goto MonWinPro;
+ close;
+ MedMonWinPro:
+ mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
+ mes "1.Condor";
+ mes "Bald head eagle in funny feature. They tends to be gathered when one gets attacked. So don't look down upon them and think of `I will caress you!'";
+ mes "^0099FFFound Items^000000: Talon,Arrow,Meat,Feather of Birds";
+ next;
+ mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
+ mes "2.Cobold the 1st";
+ mes "Small monster looks like a Wolf but it is smart enough to handle several tools. It is hostile and strong unlike its appearance. All Cobolds seem to be brothers.";
+ mes "^0099FFFound Items^000000: Blue Hair,Zargon,Orange Potion";
+ next;
+ mes "^FF0000[Wind,Medium Monster Encyclopedia]^000000";
+ mes "3.Petite";
+ mes "Tiny Cute flying Dragon. It seems like there exists 2 different kinds of Petite, flying one and walking one and this is the 1st one.";
+ mes "^0099FFFound Items^000000: Dragon Canine,Dragon Tail,Zargon";
+ next;
+ goto MonWinPro;
+ close;
+ GrMonWinPro:
+ mes "^FF0000[Wind,Great Monster Encyclopedia]^000000";
+ mes "4.Joker";
+ mes "A big Poker Card with Ugly looking girl printed on both side assaults you.";
+ mes "^0099FFFound Items^000000: High Heels";
+ next;
+ goto MonWinPro;
+ close;
+ EndMonWinPro:
+ close;
+ close;
+ MonSpiPro:
+ menu "Small Size Monster",SmaMonSpiPro,"Medium Size Monster",MedMonSpiPro,"Great Size Monster",GrMonSpiPro,"Cancel",EndMonSpiPro;
+
+ SmaMonSpiPro:
+ mes "^FF0000[Spiritual,Small Monster Encyclopedia]^000000";
+ mes "1.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Spiritual,Small Monster Encyclopedia]^000000";
+ mes "2.Marionette";
+ mes "Monster reborn from a bewitched Doll, bound to strings on Wooden Sticks.";
+ mes "^0099FFFound Items^000000: Golden Hair,Trunk";
+ next;
+ goto MonSpiPro;
+ close;
+ MedMonSpiPro:
+ mes "^FF0000[Spiritual,Medium Monster Encyclopedia]^000000";
+ mes "1.Eggyra";
+ mes "Hovering here and there, while making a clattering sound. Tough-Looking Face scares people but it is not as strong as it looks.";
+ mes "^0099FFFound Items^000000: Scell,Sticky Muscus,Red Herb";
+ next;
+ goto MonSpiPro;
+ close;
+ GrMonSpiPro:
+ mes "^FF0000[Spiritual,Great Monster Encyclopedia]^000000";
+ mes "1.Nightmare";
+ mes "Ghost Horse radiating an Aura of Violet all over the body.";
+ mes "^0099FFFound Items^000000: Horseshoe,Blue Herb";
+ next;
+ mes "^FF0000[Spiritual,Great Monster Encyclopedia]^000000";
+ mes "3.Medusa";
+ mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
+ mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Hair,White Potion";
+ next;
+ goto MonSpiPro;
+ close;
+ EndMonSpiPro:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,168,68,4 script `Merchant Guideline' for Dummies::mgfd_1 111,{
+ mes "^FF0000[Blacksmith Guide for Dummies]^000000";
+ mes "You can get the information about how to refine Ores and about Weapon Craft Skills.";
+ next;
+ menu "Ore Refining.",OreRef,"Weapon Craft.",WeaCra,"Cancel.",Cancel;
+
+ OreRef:
+ mes "^FF0000[Ore Refining for Dummies]^000000";
+ mes "Please go over the next page if you want to know how to refine Ores.";
+ next;
+ menu "Ok",OreRefOk,"Cancel",EndOreRef;
+
+ OreRefOk:
+ mes "^FF0000[Ore Refining for Dummies]^000000";
+ mes "Rough Ores like Iron Ore or Raw Materials for Enchanted Stones can be polished into High Quality Ones. For that, ^0099FFFurnace^000000 is needed.";
+ mes "One High Quality Ore needs several Rough Ones to be refined.";
+ next;
+ mes "^FF0000[Ore Refining for Dummies]^000000";
+ mes "When enough items are gathered,Double Click `Furnace'.You can use a Furnace only one time for refining.";
+ next;
+ mes "^FF0000[Ore Refining for Dummies]^000000";
+ mes "Possible ores you can refine will pop up on a new window. You can make Ore with a click the name of Ore you need.";
+ next;
+ mes "^FF0000[Ore Refining for Dummies]^000000";
+ mes "However it has a possibility to fail.";
+ close;
+ EndOreRef:
+ close;
+ close;
+ WeaCra:
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "Please go over the next page if you want to learn how to Smith Weapons.";
+ next;
+ menu "Ok",WeaCraOk,"Cancel",EndWeaCra;
+
+ WeaCraOk:
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "Learn a Skill from `Smith Sword,Two-Handed Sword,Spear,Mace,Brassknuckle' which allows you to make the pertinent weapon.";
+ next;
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "Every Weapon needs ^0099FFSteel^000000 and ^0099FFHammer^000000.You can use a Hammer one time and it will disappeared when used.";
+ next;
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "When Double Click on a Hammer,a new window which lists of items you can make will pop up.";
+ mes "Clicking a Weapon on that list will show the required items and their numbers. But they will be exhausted automatically,so just know this.";
+ next;
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "On that list window,there are 3 sockets which enable you to input some special items like Enchanted Stone or Star Crumb. These items amplify the weapon ability";
+ next;
+ mes "^FF0000[Weapon Craft for Dummies]^000000";
+ mes "And they have different possibility of Success by their characters.";
+ close;
+ EndWeaCra:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,172,96,4 script Monster Encyclopedia::me_prt_in7 111,{
+ mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
+ mes "This is an Encyclopedia describing monsters living in Dungeons.";
+ next;
+ menu "Ant Hell",AntHell,"Geffen Dungeon",GefDung,"Sphinx",Sphinx,"Cancel",Cancel;
+
+ AntHell:
+ menu "1F",AntHellF1,"2F",AntHellF2,"Cancel",EndAntHell;
+
+ AntHellF1:
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "1.Ant Egg";
+ mes "Simple Ant Egg.";
+ mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
+ next;
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "2.Andre";
+ mes "A kind of Worker Ants,they are very diligent in their work.They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "3.Piere";
+ mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "4.Deniro";
+ mes "A kind of Work Ants, tend to group in a same kind as well as other ants.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "5.Vitata";
+ mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
+ next;
+ mes "^FF0000[Ant Hell 1F Monster Encyclopedia]^000000";
+ mes "6.Giearth";
+ mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
+ mes "^0099FFFound Items^000000: Old Pixie's Moustache";
+ next;
+ goto AntHell;
+ close;
+ AntHellF2:
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "1.Ant Egg";
+ mes "Simple Ant Egg.";
+ mes "^0099FFFound Items^000000: Shell,Jellopy,Sticky Muscus,Empty Bottle";
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "2.Andre";
+ mes "A kind of Worker Ants,they are very diligent in their work. They gather everything to save a sufficient stock and are well-cooperative,you need to be careful.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "3.Piere";
+ mes "A kind of Work Ants,seems to be very diligent. Its appearance is similar with other Ants,but you can easily distinguish them from others as they only gather in a same kind.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "4.Deniro";
+ mes "A kind of Work Ants, tend to group in a same kind as well as other ants";
+ mes "^0099FFFound Items^000000: Worm Peeling,Garlet,Sticky Muscus,Shell";
+
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "5.Vitata";
+ mes "Work Ants in charge of storing honey inside the body for emergency. It is a little pathetic to see their chubby tummy filled with Honey.";
+ mes "^0099FFFound Items^000000: Worm Peeling,Scell,Honey";
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "6.Giearth";
+ mes "Little Grampa Pixie. Usually lives in Caves to gather Ores. Even though he is short, but actually an adult. Show your manners.";
+ mes "^0099FFFound Items^000000: Old Pixie's Moustache";
+ next;
+ mes "^FF0000[Ant Hell 2F Monster Encyclopedia]^000000";
+ mes "7.Phreeoni";
+ mes "Some bastard with a huge creepy tongue. Extremely strong Monster rarely seen around.";
+ mes "^0099FFFound Items^000000: Tongue,Ant Jaw";
+ next;
+ goto AntHell;
+ close;
+ EndAntHell:
+ close;
+ close;
+ GefDung:
+ menu "1F",GefDungF1,"2F",GefDungF2,"3F",GefDungF3,"4F",GefDungF4,"Cancel",EndGefDung;
+
+ GefDungF1:
+ mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
+ mes "2.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
+ mes "3.Dustiness";
+ mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
+ mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 1F Monster Encyclopedia]^000000";
+ mes "4.Poison Spore";
+ mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
+ mes "^0099FFFound Items^000000: Spore,Green Herb";
+ next;
+ goto GefDung;
+ close;
+ GefDungF2:
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "2.Dustiness";
+ mes "This monster owns high dodge rate because it is flying. Need to be attentive if you want to attack.";
+ mes "^0099FFFound Items^000000: Moth Dust,Moth Wing,Insect Feeler,Red Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "3.Poison Spore";
+ mes "Poisonous Spore in Violet. Besides,it tends to attack haphazardly if anybody gets near.";
+ mes "^0099FFFound Items^000000: Spore,Green Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "4.Argos";
+ mes "Big Spider of Dark colour. It often invades passengers.";
+ mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "5.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Geffen Dungeon 2F Monster Encyclopedia]^000000";
+ mes "6.Jakk";
+ mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
+ mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
+ next;
+ goto GefDung;
+ close;
+ GefDungF3:
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "1.Argos";
+ mes "Big Spider of Dark colour.It often invades passengers.";
+ mes "^0099FFFound Items^000000: Cobweb,Scell,Bug Leg,Green Herb,Yellow Herb";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "2.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "3.Jakk";
+ mes "Quite Odd monster in a nice suit,but with a pumpkin head. It looks funny but changes the attitude fiercely when attacks someone.";
+ mes "^0099FFFound Items^000000: Jack'o'Pumpkin,Zargon";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "4.Myst";
+ mes "Mist-like Monster.";
+ mes "^0099FFFound Items^000000: Trunk. Gas Mask";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "5.Marionette";
+ mes "Monster reborn from a bewitched Doll, bound to strings on Wooden Sticks.";
+ mes "^0099FFFound Items^000000: Golden Hair,Trunk";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "6.Bathory";
+ mes "Witch with a big wen on the nose. She rides on her magic broom flying around in the air..";
+ mes "^0099FFFound Items^000000: Witched Starsand";
+ next;
+ mes "^FF0000[Geffen Dungeon 3F Monster Encyclopedia]^000000";
+ mes "7.Nightmare";
+ mes "Ghost Horse radiating an Aura of Violet all over the body.";
+ mes "^0099FFFound Items^000000: Horseshoe,Blue Herb";
+ next;
+ goto GefDung;
+ close;
+ GefDungF4:
+ mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
+ mes "1.Myst";
+ mes "Mist-like Monster.";
+ mes "^0099FFFound Items^000000: Trunk. Gas Mask";
+ next;
+ mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
+ mes "2.Deviruchi";
+ mes "Little evil creature,which carries a cute fork with.";
+ mes "^0099FFFound Items^000000: Little Evil Horn,Little Evil Wing,Zargon";
+ next;
+ mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
+ mes "3.Raydric";
+ mes "Ghost Knight of misfortune.";
+ mes "^0099FFFound Items^000000: Elunium,Chivarly Emblem";
+ next;
+ mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
+ mes "4.Joker";
+ mes "A big Poker Card with Ugly looking girl printed on both side assaults you.";
+ mes "^0099FFFound Items^000000: High Heels";
+ next;
+ mes "^FF0000[Geffen Dungeon 4F Monster Encyclopedia]^000000";
+ mes "5.Doppelganger";
+ mes "A ghostly double of a swordsman,Spooky and Powerful.";
+ mes "^0099FFFound Items^000000: Spiky Band,Blue Potion,Cursed Ruby,Ruby";
+ next;
+ goto GefDung;
+ close;
+ EndGefDung:
+ close;
+ close;
+ Sphinx:
+ menu "1F",SphinxF1,"2F",SphinxF2,"3F",SphinxF3,"4F",SphinxF4,"5F",SphinxF5,"Cancel",EndSphinx;
+
+ SphinxF1:
+ mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
+ mes "2.Snake";
+ mes "Green Coloured Snake living in the Forest or Desert. Not poisonous but be careful.";
+ mes "^0099FFFound Items^000000: Snake Scale,Red Herb";
+ next;
+ mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
+ mes "3.Zerom";
+ mes "Undead Slave who had been extremely abused before he died. He is wandering in the Sphinx,carrying a big box on the back..";
+ mes "^0099FFFound Items^000000: Panties";
+ next;
+ mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
+ mes "4.Matyr";
+ mes "Creature shaped in Black Dog.";
+ mes "^0099FFFound Items^000000: Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Sphinx 1F Monster Encyclopedia]^000000";
+ mes "5.Requiem";
+ mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
+ mes "^0099FFFound Items^000000: Mystic Blue Box";
+ next;
+ goto Sphinx;
+ close;
+ SphinxF2:
+ mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
+ mes "2.Matyr";
+ mes "Creature shaped in Black Dog.";
+ mes "^0099FFFound Items^000000: Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
+ mes "3.Requiem";
+ mes "It seems like an Ancient Slave,carrying a heavy Coffin on the back.";
+ mes "^0099FFFound Items^000000: Mystic Blue Box";
+ next;
+ mes "^FF0000[Sphinx 2F Monster Encyclopedia]^000000";
+ mes "4.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ goto Sphinx;
+ close;
+ SphinxF3:
+ mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
+ mes "1.Matyr";
+ mes "Creature shaped in Black Dog.";
+ mes "^0099FFFound Items^000000: Monster's Feed,Leather";
+ next;
+ mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
+ mes "2.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Sphinx 3F Monster Encyclopedia]^000000";
+ mes "3.Marduk";
+ mes "Unknown monster wearing Catholic uniform and looking serious.";
+ mes "^0099FFFound Items^000000: Flame Heart";
+ next;
+ goto Sphinx;
+ SphinxF4:
+ mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
+ mes "1.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
+ mes "2.Marduk";
+ mes "Unknown monster wearing Catholic uniform and looking serious.";
+ mes "^0099FFFound Items^000000: Flame Heart";
+ next;
+ mes "^FF0000[Sphinx 4F Monster Encyclopedia]^000000";
+ mes "3.Medusa";
+ mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
+ mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Snake,White Potion";
+ next;
+ goto Sphinx;
+ close;
+ SphinxF5:
+ mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
+ mes "1.Whisper";
+ mes "Living Fabric, which gives spooky feeling.";
+ mes "^0099FFFound Items^000000: Fabric";
+ next;
+ mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
+ mes "2.Marduk";
+ mes "Unknown monster wearing Catholic uniform and looking serious.";
+ mes "^0099FFFound Items^000000: Flame Heart";
+ next;
+ mes "^FF0000[Sphinx 5F Monster Encyclopedia]^000000";
+ mes "3.Medusa";
+ mes "Each of her hairs is a snake. It has rumored to turn people into stone when their eyes happen to meet.";
+ mes "^0099FFFound Items^000000: Dead Medusa,Horrendous Snake,White Potion";
+ next;
+ goto Sphinx;
+ close;
+ EndSphinx:
+ close;
+ close;
+ Cancel:
+ close;
+}
+
+prt_in.gat,172,102,4 script Monster Encyclopedia::me_prt_in8 111,{
+ mes "^FF0000[Dungeon Monster Encyclopedia]^000000";
+ mes "The is an Encyclopedia describing Monsters living in Dungeons.";
+ next;
+ menu "Mjornir Dead Pit",MjrDeadPit,"Payon Cave",PayCave,"Pyramid",Pyramid;
+
+ MjrDeadPit:
+ menu "F1",MjrDeadPitF1,"F2",MjrDeadPitF2,"F3",MjrDeadPitF3,"Cancel",EndMjrDeadPit;
+
+ MjrDeadPitF1:
+ mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
+ mes "2.Tarou";
+ mes "Little mouse of white colour. It is squicking very loudly in the Dead Pit or the Prontera Culvert..";
+ mes "^0099FFFound Items^000000: Rat Tail,Leather,Feather,Monster's Feed";
+ next;
+ mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
+ mes "3.Martin";
+ mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
+ mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
+ next;
+ mes "^FF0000[Dead Pit 1F Monster Encyclopedia]^000000";
+ mes "4.Drainliar";
+ mes "Freaking Bloody bat with a might.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
+ next;
+ goto MjrDeadPit;
+ close;
+ MjrDeadPitF2:
+ mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
+ mes "1.Martin";
+ mes "Funny looking Mole wearing a Safety Helmet on the head,which is always busy to walk around.";
+ mes "^0099FFFound Items^000000: Mole Whiskers,Mole Claw";
+ next;
+ mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
+ mes "2.Drainliar";
+ mes "Freaking Bloody bat with a might.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
+ next;
+ mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
+ mes "3.Skel Worker";
+ mes "Walking Skeleton which was dead in a mine.";
+ mes "^0099FFFound Items^000000: Iron,Lantern";
+ next;
+ mes "^FF0000[Dead Pit 2F Monster Encyclopedia]^000000";
+ mes "4.Myst";
+ mes "Mist-like Monster.";
+ mes "^0099FFFound Items^000000: Trunk. Gas Mask";
+ next;
+ goto MjrDeadPit;
+ close;
+ MjrDeadPitF3:
+ mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
+ mes "1.Skel Worker";
+ mes "Walking Skeleton which was dead in a mine.";
+ mes "^0099FFFound Items^000000: Iron,Lantern";
+ next;
+ mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
+ mes "2.Myst";
+ mes "Mist-like Monster.";
+ mes "^0099FFFound Items^000000: Trunk. Gas Mask";
+ next;
+ mes "^FF0000[Dead Pit 3F Monster Encyclopedia]^000000";
+ mes "3.Evil Druid";
+ mes "You'll shudder even once looking at it.";
+ mes "^0099FFFound Items^000000: Amulet,White Herb";
+ next;
+ goto MjrDeadPit;
+ close;
+ EndMjrDeadPit:
+ close;
+ close;
+ PayCave:
+ menu "1F",PayCaveF1,"2F",PayCaveF2,"3F",PayCaveF3,"4F",PayCaveF4,"5F",PayCaveF5,"Cancel",EndPayCave;
+
+ PayCaveF1:
+ mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
+ mes "2.Spore";
+ mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
+ mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
+ next;
+ mes "^FF0000[Payon Cave 1F Monster Encyclopedia]^000000";
+ mes "3.Zombie";
+ mes "Bad Case of the Dead which has been reborn as a Walking Corpse by Back magic. Let's lead it to Nirvana.";
+ mes "^0099FFFound Items^000000: Decayed Nail,Sticky Muscus,Horrendous Mouth";
+ next;
+ goto PayCave;
+ close;
+ PayCaveF2:
+ mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
+ mes "2.Eggyra";
+ mes "Hovering here and there, while making a clattering sound. Tough-Looking Face scares people but it is not as strong as it looks.";
+ mes "^0099FFFound Items^000000: Scell,Sticky Muscus,Red Herb";
+ next;
+ mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
+ mes "3.Magnolia";
+ mes "Creatures shaped in Big Egg Frying Fans. They spank attackers with the Frying Fans without mercy. Don't let your guard down just because they look cute. You will suffer if you do so.";
+ mes "^0099FFFound Items^000000: Jellopy.Garlet.Scell";
+ next;
+ mes "^FF0000[Payon Cave 2F Monster Encyclopedia]^000000";
+ mes "4.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ goto PayCave;
+ close;
+ PayCaveF3:
+ mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
+ mes "2.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
+ mes "3.Munak";
+ mes "Pretty-looking Female corpse which had been frozen for a long time. She looks like holding a long story deep inside, the story people want to know about. Anyway Don't give her a break,she'll give strong damages on you.";
+ mes "^0099FFFound Items^000000: Daenggie ,Munak Turban";
+ next;
+ mes "^FF0000[Payon Cave 3F Monster Encyclopedia]^000000";
+ mes "4.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ goto PayCave;
+ close;
+ PayCaveF4:
+ mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
+ mes "1.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
+ mes "2.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
+ mes "3.Sohee";
+ mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
+ mes "^0099FFFound Items^000000: Black Hair,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 4F Monster Encyclopedia]^000000";
+ mes "4.Horong";
+ mes "Eerie-looking fireball of violet colour. Recognizes the living when gets near.";
+ mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
+ next;
+ goto PayCave;
+ close;
+ PayCaveF5:
+ mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
+ mes "1.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
+ mes "2.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
+ mes "3.Sohee";
+ mes "Female Ghost which holds grudge deep inside. She is always crying as waving long hair. But when running into the living, she suddenly changes her attitude fiercely.";
+ mes "^0099FFFound Items^000000: Black Hair,Red Potion";
+ next;
+ mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
+ mes "4.Horong";
+ mes "Eerie-looking fireball of violet colour. Recognizes the living when gets near.";
+ mes "^0099FFFound Items^000000: Stone Heart,Zargon,Fire Arrow";
+ next;
+ mes "^FF0000[Payon Cave 5F Monster Encyclopedia]^000000";
+ mes "5.Moonlight";
+ mes "Wild Girl having 9 tails of a Fox, and with a Big Bell on the back.";
+ mes "^0099FFFound Items^000000: 9 Tails,White Potion,Topaz,Elunium";
+ next;
+ goto PayCave;
+ close;
+ EndPayCave:
+ close;
+ close;
+ Pyramid:
+ menu "1F",PyramidF1,"2F",PyramidF2,"3F",PyramidF3,"4F",PyramidF4,"5F",PyramidF5,"6F",PyramidF6,"Cancel",EndPyramid;
+
+ PyramidF1:
+ mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
+ mes "1.Familiar";
+ mes "Bat of Violet Colour. Not that strong but really annoying because it attacks very fast and outrageously when somebody gets near it.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Fly Wing,Grape,Red Herb";
+ next;
+ mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
+ mes "2.Spore";
+ mes "Mushroom-like monsters. Usually live in the Forest or Dungeons. By the way Don't try to eat it!";
+ mes "^0099FFFound Items^000000: Spore,Red Herb,Blue Herb";
+ next;
+ mes "^FF0000[Pyramid 1F Monster Encyclopedia]^000000";
+ mes "3.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
+ next;
+ goto Pyramid;
+ close;
+ PyramidF2:
+ mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
+ mes "1.Poporing";
+ mes "Poisonous Poring in light green. Every character is the same as poring,but much more stronger.";
+ mes "^0099FFFound Items^000000: Sticky Muscus,Garlet,Green Herb";
+ next;
+ mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
+ mes "2.Drainliar";
+ mes "Freaking Bloody bat with a might.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
+
+ next;
+ mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
+ mes "3.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Pyramid 2F Monster Encyclopedia]^000000";
+ mes "4.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ goto Pyramid;
+ close;
+ PyramidF3:
+ mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
+ mes "1.Drainliar";
+ mes "Freaking Bloody bat with a might.";
+ mes "^0099FFFound Items^000000: Tooth of Bat,Red Herb";
+ next;
+ mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
+ mes "2.Soldier Skeleton";
+ mes "Skeleton holding 2 swords on both grips,attacks fast. One of the dangerous monsters in the Cave.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Red Potion";
+ next;
+ mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
+ mes "3.Archer Skeleton";
+ mes "It seems to be an expert of bow when it was alive. It'll come to attack in no time when somebody gets inside of its range.";
+ mes "^0099FFFound Items^000000: Skel-Bone,Fire Arrow,Red Potion";
+ next;
+ mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
+ mes "4.Mummy";
+ mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
+ mes "^0099FFFound Items^000000: Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 3F Monster Encyclopedia]^000000";
+ mes "5.Verit";
+ mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
+ mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
+ next;
+ goto Pyramid;
+ close;
+ PyramidF4:
+ mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
+ mes "1.Mummy";
+ mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
+ mes "^0099FFFound Items^000000: Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
+ mes "2.Verit";
+ mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
+ mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
+ mes "3.Ghoul";
+ mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
+ mes "^0099FFFound Items^000000: Horrendous Mouth";
+ next;
+ mes "^FF0000[Pyramid 4F Monster Encyclopedia]^000000";
+ mes "4.Isis";
+ mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
+ mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
+ next;
+ goto Pyramid;
+ close;
+ PyramidF5:
+ mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
+ mes "1.Mummy";
+ mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
+ mes "^0099FFFound Items^000000: Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
+ mes "2.Ghoul";
+ mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
+ mes "^0099FFFound Items^000000: Horrendous Mouth";
+ next;
+ mes "^FF0000[Pyramid 5F Monster Encyclopedia]^000000";
+ mes "3.Isis";
+ mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
+ mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
+ next;
+ goto Pyramid;
+ close;
+ PyramidF6:
+ mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
+ mes "1.Mummy";
+ mes "Walking Corpse with a bandage all around the body. It smells so bad because its body is still on the decomposed stage.";
+ mes "^0099FFFound Items^000000: Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
+ mes "2.Verit";
+ mes "Dog with a bandage all around the body which was dead once before. It tends to eat everything dropped on the ground.";
+ mes "^0099FFFound Items^000000: Immortal Heart,Zargon,Rotten Bandage";
+ next;
+ mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
+ mes "3.Ghoul";
+ mes "Similar as Zombie but much more stronger. Yet very slow, you'd better run for your life when happen to meet this thing.";
+ mes "^0099FFFound Items^000000: Horrendous Mouth";
+ next;
+ mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
+ mes "4.Isis";
+ mes "Creature having the head and upper body of a woman and the tail of a snake. Her nail is quite a menace.";
+ mes "^0099FFFound Items^000000: Scale Skin,Shining Scale";
+ next;
+ mes "^FF0000[Pyramid 6F Monster Encyclopedia]^000000";
+ mes "5.Osiris";
+ mes "Mummy King with a rotten bandage all over the body, wearing a Crown on the head. He threatens Adventurers with an incredible might.";
+ mes "^0099FFFound Items^000000: Memento,Rotten Bandage,Hand of God,Elunium";
+ next;
+ goto Pyramid;
+ close;
+ EndPyramid:
+ close;
+ close;
+ Cancel:
+ close;
+}
+//<=========== Library - End ==========>\\
diff --git a/npc/other/bulletin_boards.txt b/npc/other/bulletin_boards.txt
index 8fc639114..6a365db5a 100644
--- a/npc/other/bulletin_boards.txt
+++ b/npc/other/bulletin_boards.txt
@@ -1,616 +1,616 @@
-//===== eAthena Script =======================================
-//= Official scripts for beginners from iRO
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.0 Added Alberta, Prontera, Izlude, Payon, Byalan Island,
-//= Archer Village, Payon Cave and Coal Mine
-//= 1.1 Geffen, Orc Dungeon
-//= 1.2 Added 5 more Boards [MasterOfMuppets]
-//= 1.3 Fixed spelling mistakes. [Nexon]
-//= 1.3a Fixed a missing close; [Nexon]
-//= 1.4 Added more BBS MasterOfMuppets
-//= 1.5 Added the last of the bulletin boards, I think... [MasterOfMuppets]
-//= 1.5a Fixed a small screw up with the color codes in the Glastheim BB [MasterOfMuppets]
-//= 1.5b Fixed another small screw up with the color codes in the Glastheim BB [Kayla]
-//= 1.6 Removed Duplicates [Silent]
-//============================================================
-
-alberta.gat,111,59,5 script Bulletin Board#1 837,{
- mes "[Alberta: The Port City]";
- mes "Welcome to Alberta, the Port City.";
- next;
- mes "[Alberta: The Port City]";
- mes "In Alberta, you can find the Merchant guild where adventurers can change their job to merchant";
- next;
- mes "[Alberta: The Port City]";
- mes "As a city that provides dependable sea travel, Alberta has provided the means for the foreign commerce that has brought prosperity to the Rune-Midgarts Kingdom.";
- next;
- mes "[Alberta: The Port City]";
- mes "On the docks, you may find representatives from foreign lands that will guide tourists to their countries.";
- next;
- mes "[Alberta: The Port City]";
- mes "Among seafarers, there is a rumor of a place known as ^338C60Turtle Island^000000. Intrepid adventurers may seek to investigate this rumor and learn the truth for themselves";
- next;
- mes "[Alberta: The Port City]";
- mes "There is also a sunken ship that has been discovered near Alberta, and it has become a popular area for adventurers to explore";
- next;
- mes "[Alberta: The Port City]";
- mes "From Alberta, ^1F3A11Payon^000000 is located to the Northwest. You can board passenger ships at the dock to travel to ^5E5C69Izlude^000000.";
- mes "Enjoy your travels.";
- close;
-}
-
-geffen.gat,124,65,5 script Bulletin Board#2 837,{
- mes "[Geffen: The City of Magic]";
- mes "Welcome to Geffen, the City of Magic. Geffen is well known for its various legends related to magic.";
- next;
- mes "[Geffen: The City of Magic]";
- mes "Points of interest in the city include the Forge, where people can change their jobs to Blacksmith, the Magic Academy for aspiring mages, and the Geffen Tower for the Wizard job change.";
- next;
- mes "[Geffen: The City of Magic]";
- mes "Underneath the Geffen Tower lies a dungeon in which dreadful monsters are rumored to appear.";
- next;
- mes "[Geffen: The City of Magic]";
- mes "It is said that the lost city of Gefenia, a place of elven lore and legend, is hidden within the depths of this dungeon.";
- next;
- mes "[Geffen: The City of Magic]";
- mes "From Geffen, the ^828E28Orc Village^000000 is located to the South, ^4C6055Glast Heim^000000 to the West, ^6D6FE0Prontera^000000 to the far East, and ^744B2DMt. Mjolnir^000000 to the North. Enjoy your stay here in Geffen.";
- close;
-}
-
-gef_fild10.gat,69,340,5 script Bulletin Board#3 837,{
- mes "[Orc Dungeon]";
- mes "^6B1312Caution!^000000";
- mes "The Orc Dungeon is comprised of 2 levels. Although not very strong individually, the monsters here attack in groups. Be careful.";
- next;
- mes "[Orc Dungeon]";
- mes "Only in this dungeon will you be able to encounter Orc Skeletons, Zenorcs and Orc Zombies.";
- next;
- mes "[Orc Dungeon]";
- mes "Holy attribute weapons will greatly aid you in this place, since most of the monsters in this dungeon are Undead.";
- next;
- mes "[Orc Dungeon]";
- mes "If you don't have a Holy Weapon and you're teamed with a Priest, the Priest's Aspersio spell would be of tremendous help.";
- close;
-}
-
-izlu2dun.gat,104,92,5 script Bulletin Board#4 837,{
- mes "[Byalan Island]";
- mes "^6B1312Caution!^000000";
- mes "The Izlude dungeon is comprised of 5 levels. The first few levels are suited for newer adventurers.";
- next;
- mes "[Byalan Island]";
- mes "As you venture deeper into the Byalan dungeon, you will encounter stronger, more powerful monsters.";
- next;
- mes "[Byalan Island]";
- mes "With a few exceptions, most of the monsters in this dungeon are of the Water attribute. Therefore, a Wind attribute weapon will help you greatly";
- close;
-}
-
-izlude.gat,131,116,4 script Bulletin Board#5 837,{
- mes "[Izlude: The Satellite City]";
- mes "Welcome to Izlude, the satellite of Prontera. Izlude was built to support Prontera's defense and to accommodate its burgeoning population";
- next;
- mes "[Izlude: The Satellite City]";
- mes "Points of interest include the Swordsman Association building which allows adventurers to change their job to Swordsman, and the Battle Area that is North of Izlude.";
- next;
- mes "[Izlude: The Satellite City]";
- mes "At the docks, you may take a ship and travel to ^123972Alberta^000000 or ^2F0400Byalan Island^000000.";
- next;
- mes "[Izlude: The Satellite City]";
- mes "From Izlude, ^6D6FE0Prontera^000000 is located to the Northwest, and ^1F3A11Payon^000000 is located to the South.";
- mes "Enjoy your travels in the Rune-Midgarts Kingdom.";
- close;
-}
-
-payon.gat,178,108,5 script Bulletin Board#06 837,{
- mes "[Payon: The Mountain City]";
- mes "Welcome to Payon, the mountain city. Payon has recently been renovated, so we hope you enjoy the clean, nice streets and buildings.";
- next;
- mes "[Payon: The Mountain City]";
- mes "Payon is famous for being a city of archery. For a long time, its citizens have made their living by hunting with bows and arrows. Bow crafting and training have also been developed here in Payon";
- next;
- mes "[Payon: The Mountain City]";
- mes "Payon has various armor and weapons, especially for the Archer class. If you wish to become an Archer, it would be best to become familiar with this city.";
- next;
- mes "[Payon: The Mountain City]";
- mes "Payon Palace is located in the center of the city. The Archer Village is located in the Northern part of Payon. There, people can change their jobs to Archer.";
- next;
- mes "[Payon: The Mountain City]";
- mes "Near the Archer Village, you can find the ^2F0400Payon Cave^000000 where Undead monsters reside.";
- next;
- mes "[Payon: The Mountain City]";
- mes "From Payon, ^123972Alberta^000000 is located to the Southeast, and ^866C4BMorroc^000000 is to the West. ^5E5C69Izlude^000000 and ^6D6FE0Prontera^000000 are North of Payon.";
- mes "Enjoy your travels.";
- close;
-}
-
-pay_arche.gat,79,30,5 script Bulletin Board#07 837,{
- mes "[Archer Village]";
- mes "Welcome to the Payon Archer Village where Novices can change their jobs to Archer.";
- next;
- mes "[Archer Village]";
- mes "The Archer Village provides Bows and Tights that are available for purchase. These are necessities for new Archers and Hunters.";
- next;
- mes "[Archer Village]";
- mes "If you wish to become an Archer, it is suggested to become familiar with this village. For aspiring Hunters, the Hunter Guild is located in a field that is East of Payon.";
- close;
-}
-
-pay_arche.gat,40,135,5 script Bulletin Board#08 837,{
- mes "[Payon Cave]";
- mes "^6B1312Caution!^000000";
- mes "Payon Cave consists of 5 levels full of Undead and Demon monsters. Beware of swarms of Hydra in the third and fourth levels.";
- next;
- mes "[Payon Cave]";
- mes "In the fifth level, there is a pretty, yet dreadful boss monster known as ^6B1312Moonlight^000000 that spawns at certain times. Approach with extreme caution.";
- close;
-}
-
-prontera.gat,148,49,5 script Bulletin Board#09 837,{
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "Welcome to Prontera, the capital city of Rune-Midgard.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "Prontera is located in the center of the Rune-Midgard continent and is very well-known as a city of flourishing commerce.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "In this city, you can fint the Sanctuary, where people can change their jobs to Acolyte and Priest.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "You can also find the Castle, where people can change their jobs to Crusader.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "Please feel free to explore the streets of Prontera, as there are various tourist attractions within the city.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "When you need to upgrade your weapons and armors, please visit the building in the 5 o'clock direction from the fountain in the center of Prontera.";
- next;
- mes "[Prontera: Capital of the]";
- mes "[Rune-Midgards Kingdom]";
- mes "From Prontera, ^5E5C69Izlude^000000 is located to the Southeast, ^1F3A11Payon^000000 to the far South, ^683C1FGeffen^000000 to the far West and ^2D3832Al De Baran^000000 to the far North.";
- mes "Enjoy Your time in Prontera.";
- close;
-}
-
-mjolnir_02.gat,76,362,5 script Bulletin Board#10 837,{
- mes "[Coal Mine]";
- mes "^6B1312Caution!^000000";
- mes "The Coal Mine consists of a total of 3 levels. This dungeon is suited to both new and experienced adventurers, depending on the dungeon level.";
- next;
- mes "[Coal Mine]";
- mes "In the third level, monsters tend to attack adventurers in swarms, so avoid being surrounded. Since this area is a mine, many Ores can be found within the depths of this dungeon.";
- close;
-}
-
-morocc.gat,152,110,5 script Bulletin Board#11 837,{
- mes "[Morroc: The Frontier Town]";
- mes "Welcome to Morroc, the City of the";
- mes "Desert. Morroc was built on an";
- mes "on an oasis, so this town can accommodate";
- mes "its many visitors and travelers.";
- next;
- mes "[Morroc: The Frontier Town]";
- mes "Morroc Castle lies in the center of";
- mes "this city. Please feel free to";
- mes "explore this town, and enjoy its";
- mes "unique atmosphere. However, watch";
- mes "your pockets and beware of Rogues";
- mes "and Thieves.";
- next;
- mes "[Morroc: The Frontier Town]";
- mes "From Morroc, the ^6B1312Pyramid Dungeon^000000";
- mes "can be found to the Northwest, and";
- mes "the ^6B1312Sphinx Dungeon^000000 can be found to";
- mes "the West. To the southeast, you may";
- mes "find ^6B1312Ant Hell.";
- next;
- mes "[Morroc: The Frontier Town]";
- mes "The Assassin Guild is rumored to be";
- mes "located to the Southeast. When you";
- mes "head East from Morroc, and then";
- mes "North, you will arrive at";
- mes "^6D6FE0Prontera^000000.";
- close;
-}
-
-comodo.gat,210,148,5 script Bulletin Board#12 837,{
- mes "[Comodo: The Beach City]";
- mes "Welcome! This town of Comodo is";
- mes "surrounded by many ancient relics";
- mes "from a forgotten era.";
- next;
- mes "[Comodo: The Beach City]";
- mes "Only in Comodo can you find the";
- mes "Dancer Guild and Bard Guild which";
- mes "provide the opportunity for";
- mes "adventurers to change their jobs to";
- mes "Dancers and Bards.";
- next;
- mes "[Comodo: The Beach City]";
- mes "You can also visit the Casino,";
- mes "which is a popular as a tourist";
- mes "attraction and place to lounge";
- next;
- mes "[Comodo: The Beach City]";
- mes "You can buy Berserk Potions, a";
- mes "special product of Comodo, from the";
- mes "Tool Dealers in the area.";
- next;
- mes "[Comodo: The Beach City]";
- mes "There are 3 caves around Comodo";
- mes "that are inhabited by many";
- mes "different monsters. If you enter";
- mes "these areas, please be extremely";
- mes "careful.";
- next;
- mes "[Comodo: The Beach City]";
- mes "From Comodo, you can travel to";
- mes "^866C4BMorroc^000000 through the East Cave";
- mes "and to ^7D2272Umbala^000000 through the North";
- mes "Cave.";
- next;
- mes "[Comodo: The Beach City]";
- mes "To the East, you can find ^BF2B0DParos";
- mes "^BF2B0DLighthouse^000000, where the Rogue Guild";
- mes "is located. Enjoy the Comodo night";
- mes "life~";
- close;
-}
-
-umbala.gat,137,94,5 script Bulletin Board#13 837,{
- mes "[Umbala: The Utan Village]";
- mes "Welcome to Umbala,";
- mes "the village of the Utan tribe.";
- next;
- mes "[Umbala: The Utan Village]";
- mes "Umbala, as well as the Utan tribe";
- mes "which speak their own unique";
- mes "language, was recently discovered";
- mes "by a few intrepid adventurers.";
- next;
- mes "[Umbala: The Utan Village]";
- mes "Scholars believe that Umbala may be";
- mes "the border between our world";
- mes "and another realm. They believe the";
- mes "junction between the worlds might";
- mes "be the Yggdrasil tree to the North.";
- next;
- mes "[Umbala: The Utan Village]";
- mes "Points of interest include the";
- mes "Chief's House, the Shaman's House,";
- mes "and the Bungee Jump Area. Thousands";
- mes "of tourists visit the Bungee Jump";
- mes "Area to test their courage.";
- next;
- mes "[Umbala: The Utan Village]";
- mes "From Umbala, head South to go to";
- mes "^D91B73Comodo^000000. Please enjoy your";
- mes "stay here in Umbala.";
- close;
-}
-
-gef_fild09.gat,227,29,4 script Bulletin Board::OrcsBoard 835,{
- mes "[Orc Village]";
- mes "^6B1312Caution!^000000";
- mes "Beyond this point";
- mes "lies the Orc Village.";
- next;
- mes "[Orc Village]";
- mes "Be aware that this village is";
- mes "teeming with dangerous Orcs, namely";
- mes "Orc Warriors, Orc Ladies and High";
- mes "Orcs. Two boss monsters, ^6B1312Orc Hero^000000";
- mes "and ^6B1312Orc Lord^000000 will also appear at certain times.";
- close;
-}
-
-gef_fild13.gat,202,31,5 duplicate(OrcsBoard) Bulletin Board#orc1 835
-
-gef_fild13.gat,29,206,5 script Bulletin Board::KoboldsBoard 836,{
-
- mes "[Kobold Village]";
- mes "^6B1312Caution!^000000";
- mes "You're heading to the Kobold Village.";
- mes "Please be aware this village is filled with many kobolds.";
- close;
-}
-
-gef_fild08.gat,211,24,5 duplicate(KoboldsBoard) Bulletin Board#kb1 836
-
-gef_fild10.gat,109,23,5 script Bulletin Board#15 836,{
-
- mes "[Goblin Village]";
- mes "^6B1312Caution!^000000";
- mes "You're heading to the Goblin Village.";
- mes "Please be aware this village is filled with many goblins.";
- close;
-}
-
-prt_fild05.gat,278,220,5 script Bulletin Board#16 837,{
- mes "[Culvert]";
- mes "Culvert is comprised of a total of";
- mes "4 levels, and is a good training";
- mes "ground for new adventurers.";
- next;
- mes "[Culvert]";
- mes "In order to access the Culver, you";
- mes "must volunteer as a monster";
- mes "exterminator at the Prontera";
- mes "Chivalry. Remember that the";
- mes "monsters here may attack in";
- mes "swarms.";
- next;
- mes "[Culvert]";
- mes "In the fourth level of the Prontera";
- mes "Culvert, you may encounter the boss";
- mes "monster known as the ^6B1312Golden Thief";
- mes "^6B1312Bug^000000. New adventurers should";
- mes "exercise caution.";
- close;
-}
-
-yuno.gat,154,112,5 script Bulletin Board#17 837,{
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "Welcome to Juno, the City of Sages.";
- mes "Juno is kept aloft in the air by";
- mes "the power of the Ymir Heart";
- mes "Pieces";
- next;
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "Those interested in becoming Sages";
- mes "should visit the Sage Castle for";
- mes "more information on the Sage job";
- mes "and its requirements.";
- next;
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "Other notable places include the";
- mes "Monster Museum, Magic Academy";
- mes "and the Juno Library.";
- next;
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "Somewhere around Juno, there is";
- mes "information regarding secret access";
- mes "to the world where adventurers may";
- mes "be reborn with newfound strength.";
- next;
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "To the Southeast of Juno lies ^6B1312Nogg";
- mes "^6B1312Road^000000, the Magma Dungeon. Nogg Road";
- mes "is infamous for its aggressive";
- mes "creatures, so be careful";
- next;
- mes "[Juno: Capital of]";
- mes "[The Schwartzwald Republic]";
- mes "From Juno, ^2D3832Al De Baran^000000, a city of";
- mes "the Rune-Midgarts Kingdom, is";
- mes "located to the South.";
- close;
-}
-
-aldebaran.gat,145,105,5 script Bulletin Board#18 837,{
- mes "[Al De Baran: The Border City]";
- mes "Welcome to Al De Baran, the border";
- mes "city of the Rune-Midgarts Kingdom.";
- mes "Al De Baran's beautiful canals and";
- mes "majestic Clock Tower are a source";
- mes "of pride for its citizens.";
- next;
- mes "[Al De Baran: The Border City]";
- mes "Adventurers can explore the Clock";
- mes "Tower located in the city's center.";
- mes "Other notable places are the Kafra";
- mes "Corporation Headquarters, and the";
- mes "Alchemist Guild which provides the";
- mes "Alchemist job change.";
- next;
- mes "[Al De Baran: The Border City]";
- mes "There is a fully trained Santa";
- mes "Claus somewhere in Al De Baran who";
- mes "can send you to the magical town of";
- mes "^1D2585Lutie^000000. If you're interested in";
- mes "seeing it for yourself, you must";
- mes "seek Santa Claus.";
- next;
- mes "[Al De Baran: The Border City]";
- mes "From this city, ^60D5FDJuno^000000 is located to";
- mes "the North, and ^6D6FE0Prontera^000000 is located";
- mes "to the South.";
- close;
-}
-
-aldebaran.gat,136,133,5 script Bulletin Board#19 837,{
- mes "[Clock Tower]";
- mes "^6B1312Caution!^000000";
- mes "Only well-experienced adventurers";
- mes "should consider entering the Clock";
- mes "Tower. There are a total of 8";
- mes "levels: 4 beneath the ground and 4 above the earth.";
- next;
- mes "[Clock Tower]";
- mes "The main monsters of the Clock";
- mes "Tower are Clocks, Alarms and";
- mes "Bathories. Beware of the Clock";
- mes "Tower Keepers on patrol.";
- next;
- mes "[Clock Tower]";
- mes "The paths in the Clock Tower are";
- mes "winding and complicated, so please";
- mes "be careful and avoid getting";
- mes "lost.";
- close;
-}
-
-moc_fild19.gat,107,101,5 script Bulletin Board#20 837,{
- mes "[Sphinx]";
- mes "^6B1312Caution!^000000";
- mes "The Sphinx consists of 5 levels.";
- mes "This dungeon is suited for training";
- mes "well-experienced adventurers.";
- next;
- mes "[Sphinx]";
- mes "There are many aggressive monsters";
- mes "residing in the Sphinx, and it is";
- mes "advised to run away if you happen";
- mes "to be surrounded by them.";
- next;
- mes "[Sphinx]";
- mes "In the fifth level, the boss";
- mes "monster ^6B1312Pharaoh^000000 will appear at";
- mes "certain times. Exorcise with";
- mes "extreme prejudice.";
- close;
-}
-
-gef_tower.gat,55,142,5 script Bulletin Board#21 837,{
-
- mes "[Geffen Dungeon]";
- mes "^6B1312Caution!^000000";
- mes "Geffen dungeon is consisted of 3 levels";
- mes "is too difficult for new adventurers to venture.";
- mes "As main monsters constantly appear,";
- mes "there are ^6B1312Hunter Flies^000000, ^6B1312Nightmares^000000 and ^6B1312Jakks^000000.";
- mes "Nightmares and Jakks only appear in this dungeon.";
- next;
- mes "[Geffen Dungeon]";
- mes "On the 2nd level of this dungeon,";
- mes "^6B1312Ogretooth^000000, the creature of a doomed sword and ^6B1312Dracula^000000,";
- mes "the boss monster appear without warning.";
- mes "On the 3rd level, ^6B1312Doppelganger^000000 one of the strongest boss monster appears at certain time.";
- close;
-}
-
-xmas_fild01.gat,75,80,5 script Bulletin Board#22 837,{
-
- mes "[Winter Town, Lutie]";
- mes "Welcome to Lutie, the town of snowfall.";
- mes "Manufacturing toys in the toy factory is the main";
- mes "business of this town.";
- next;
- mes "[Winter Town, Lutie]";
- mes "You can access to the toy factory dungeon";
- mes "at the north of Lutie.";
- mes "Please remember to visit Lutie in Christmas season.";
- mes "There are various event held with joy.";
- mes "Please beware of ^6B1312Stormy Knight^000000 and ^6B1312Hatii^000000 the boss monsters of the toy factory dungeon.";
- close;
-}
-
-xmas.gat,147,311,5 script Bulletin Board#23 837,{
-
- mes "[Toy Factory]";
- mes "^6B1312Caution!^000000";
- mes "Toy Factory is consisting of 2 levels.";
- mes "This dungeon is not that difficult to venture for new adventurers,";
- mes "but there are 3 dangerous boss monsters spawn at certain time.";
- next;
- mes "[Toy Factory]";
- mes "In 1st level, you will encounter a boss monster, ^6B1312Angeling^000000.";
- mes "In 2nd level, you will encounter 2 dangrous boss monsters which are";
- mes "^6B1312Stormy Knight^000000 and ^6B1312Hatii^000000. It is adviced to be attentive while venturing.";
- mes "For your reference, ^6B1312Myst Cases^000000, ^6B1312Cruisers^000000 and ^6B1312Cookies^000000 only appear in this dungeon.";
- close;
-}
-
-yuno_fild03.gat,37,143,5 script Bulletin Board#24 837,{
-
- mes "[The Magma Dungeon, Nogg Road]";
- mes "^6B1312Caution!^000000";
- mes "Nogg Road is filled with very dangerous creatures.";
- mes "It is limited to enter only to well-experienced adventurers.";
- next;
- mes "[The Magma Dungeon, Nogg Road]";
- mes "Main Monsters of this dungeon is";
- mes "^6B1312Kahos^000000 and ^6B1312Nightmare Terrors^000000.";
- mes "Please be attentive.";
- close;
-}
-
-niflheim.gat,200,191,5 script Bulletin Board#25 837,{
-
- mes "[City of the Dead, Nifflheim]";
- mes "Welcome to Nifflheim, the City of the Dead.";
- mes "Nifflheim was known as the other world where";
- mes "you come after the death.";
- mes "However, recently people found out a secret path behind of a mysterious tree.";
- mes "So, you will find many other people travelling around this area.";
- next;
- mes "[City of the Dead, Nifflheim]";
- mes "As a tourist attraction, The Witch's castle is suggested.";
- mes "Unlike normal towns, it is prohibited to save respawn point or";
- mes "warp point inside Nifflheim. Also monsters spawn within the town as well.";
- next;
- mes "[City of the Dead, Nifflheim]";
- mes "Especially, please be attentive with a boss monster";
- mes "called ^6B1312Lord of the Death^000000.";
- next;
- mes "[City of the Dead, Nifflheim]";
- mes "When you go ahead west, you will arrive at ^6B1312Valley of Gyoll^000000";
- mes "where all the powerful and fearful monsters dwell upon.";
- mes "It is suggested to leave the area immediately in case of a new solo adventurer.";
- close;
-}
-
-moc_fild15.gat,267,264,5 script Bulletin Board#26 837,{
-
- mes "[Ant Hell]";
- mes "^6B1312Caution!^000000";
- mes "Ant Hell is consisting of 2 levels.";
- mes "As the name shows, this dungeon is filled with various ants";
- mes "and good as the training grounds for new adventurers.";
- next;
- mes "[Ant Hell]";
- mes "However, please be aware that ^6B1312Maya Purple^000000 appears in the 1st level";
- mes "and ^6B1312Maya^000000 does in the 2nd level. They are the queens of ants.";
- mes "Also, in the field where you're standing";
- mes "a boss monster called ^6B1312Phreeoni^000000 will appear at certain time.";
- close;
-}
-
-moc_ruins.gat,61,164,5 script Bulletin Board#27 837,{
-
- mes "[Pyramids]";
- mes "^6B1312Caution!^000000";
- mes "Pyramids is consisting of total 7 levels as 4 levels on the earth and the rest under the ground.";
- mes "First few levels are suited for new adventurers to venture, but as deeper you go down, you will encounter stronger monsters.";
- next;
- mes "[Pyramids]";
- mes "In first level, there is the thief guild where people can change their jobs into Thief.";
- mes "In the 4:th level, a boss monster called ^6B1312Osiris^000000 appears at certain time.";
- mes "In the 3:d basement, ^6B1312Amon Ra^000000 appears at certain time.";
- close;
-}
-
-glast_01.gat,369,308,5 script Bulletin Board#28 837,{
-
- mes "[Glast Heim]";
- mes "Glast Heim is an enormous dungeon with countless levels.";
- mes "This dungeon is definately not for new or experienced adventurers";
- mes "but for dungeon experts.";
- next;
- mes "[Glast Heim]";
- mes "There are many fearsome monsters such as ^6B1312Dark Lord^000000,";
- mes "^6B1312Owl Baron^000000, ^6B1312Owl Duke^000000, ^6B1312Dark Illusion^000000, ^6B1312Bloody Knight^000000, ^6B1312Abysmal Knight^000000, ^6B1312Chimera^000000 and various types of doomed swords.";
- next;
- mes "[Glast Heim]";
- mes "However, more difficult the expedition is, greater the reward is.";
- mes "Therefore, this dungeon is pretty popular among dungeon experts.";
- mes "Enjoy your dungeon expedition.";
- close;
-}
+//===== eAthena Script =======================================
+//= Official scripts for beginners from iRO
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.0 Added Alberta, Prontera, Izlude, Payon, Byalan Island,
+//= Archer Village, Payon Cave and Coal Mine
+//= 1.1 Geffen, Orc Dungeon
+//= 1.2 Added 5 more Boards [MasterOfMuppets]
+//= 1.3 Fixed spelling mistakes. [Nexon]
+//= 1.3a Fixed a missing close; [Nexon]
+//= 1.4 Added more BBS MasterOfMuppets
+//= 1.5 Added the last of the bulletin boards, I think... [MasterOfMuppets]
+//= 1.5a Fixed a small screw up with the color codes in the Glastheim BB [MasterOfMuppets]
+//= 1.5b Fixed another small screw up with the color codes in the Glastheim BB [Kayla]
+//= 1.6 Removed Duplicates [Silent]
+//============================================================
+
+alberta.gat,111,59,5 script Bulletin Board#1 837,{
+ mes "[Alberta: The Port City]";
+ mes "Welcome to Alberta, the Port City.";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "In Alberta, you can find the Merchant guild where adventurers can change their job to merchant";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "As a city that provides dependable sea travel, Alberta has provided the means for the foreign commerce that has brought prosperity to the Rune-Midgarts Kingdom.";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "On the docks, you may find representatives from foreign lands that will guide tourists to their countries.";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "Among seafarers, there is a rumor of a place known as ^338C60Turtle Island^000000. Intrepid adventurers may seek to investigate this rumor and learn the truth for themselves";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "There is also a sunken ship that has been discovered near Alberta, and it has become a popular area for adventurers to explore";
+ next;
+ mes "[Alberta: The Port City]";
+ mes "From Alberta, ^1F3A11Payon^000000 is located to the Northwest. You can board passenger ships at the dock to travel to ^5E5C69Izlude^000000.";
+ mes "Enjoy your travels.";
+ close;
+}
+
+geffen.gat,124,65,5 script Bulletin Board#2 837,{
+ mes "[Geffen: The City of Magic]";
+ mes "Welcome to Geffen, the City of Magic. Geffen is well known for its various legends related to magic.";
+ next;
+ mes "[Geffen: The City of Magic]";
+ mes "Points of interest in the city include the Forge, where people can change their jobs to Blacksmith, the Magic Academy for aspiring mages, and the Geffen Tower for the Wizard job change.";
+ next;
+ mes "[Geffen: The City of Magic]";
+ mes "Underneath the Geffen Tower lies a dungeon in which dreadful monsters are rumored to appear.";
+ next;
+ mes "[Geffen: The City of Magic]";
+ mes "It is said that the lost city of Gefenia, a place of elven lore and legend, is hidden within the depths of this dungeon.";
+ next;
+ mes "[Geffen: The City of Magic]";
+ mes "From Geffen, the ^828E28Orc Village^000000 is located to the South, ^4C6055Glast Heim^000000 to the West, ^6D6FE0Prontera^000000 to the far East, and ^744B2DMt. Mjolnir^000000 to the North. Enjoy your stay here in Geffen.";
+ close;
+}
+
+gef_fild10.gat,69,340,5 script Bulletin Board#3 837,{
+ mes "[Orc Dungeon]";
+ mes "^6B1312Caution!^000000";
+ mes "The Orc Dungeon is comprised of 2 levels. Although not very strong individually, the monsters here attack in groups. Be careful.";
+ next;
+ mes "[Orc Dungeon]";
+ mes "Only in this dungeon will you be able to encounter Orc Skeletons, Zenorcs and Orc Zombies.";
+ next;
+ mes "[Orc Dungeon]";
+ mes "Holy attribute weapons will greatly aid you in this place, since most of the monsters in this dungeon are Undead.";
+ next;
+ mes "[Orc Dungeon]";
+ mes "If you don't have a Holy Weapon and you're teamed with a Priest, the Priest's Aspersio spell would be of tremendous help.";
+ close;
+}
+
+izlu2dun.gat,104,92,5 script Bulletin Board#4 837,{
+ mes "[Byalan Island]";
+ mes "^6B1312Caution!^000000";
+ mes "The Izlude dungeon is comprised of 5 levels. The first few levels are suited for newer adventurers.";
+ next;
+ mes "[Byalan Island]";
+ mes "As you venture deeper into the Byalan dungeon, you will encounter stronger, more powerful monsters.";
+ next;
+ mes "[Byalan Island]";
+ mes "With a few exceptions, most of the monsters in this dungeon are of the Water attribute. Therefore, a Wind attribute weapon will help you greatly";
+ close;
+}
+
+izlude.gat,131,116,4 script Bulletin Board#5 837,{
+ mes "[Izlude: The Satellite City]";
+ mes "Welcome to Izlude, the satellite of Prontera. Izlude was built to support Prontera's defense and to accommodate its burgeoning population";
+ next;
+ mes "[Izlude: The Satellite City]";
+ mes "Points of interest include the Swordsman Association building which allows adventurers to change their job to Swordsman, and the Battle Area that is North of Izlude.";
+ next;
+ mes "[Izlude: The Satellite City]";
+ mes "At the docks, you may take a ship and travel to ^123972Alberta^000000 or ^2F0400Byalan Island^000000.";
+ next;
+ mes "[Izlude: The Satellite City]";
+ mes "From Izlude, ^6D6FE0Prontera^000000 is located to the Northwest, and ^1F3A11Payon^000000 is located to the South.";
+ mes "Enjoy your travels in the Rune-Midgarts Kingdom.";
+ close;
+}
+
+payon.gat,178,108,5 script Bulletin Board#06 837,{
+ mes "[Payon: The Mountain City]";
+ mes "Welcome to Payon, the mountain city. Payon has recently been renovated, so we hope you enjoy the clean, nice streets and buildings.";
+ next;
+ mes "[Payon: The Mountain City]";
+ mes "Payon is famous for being a city of archery. For a long time, its citizens have made their living by hunting with bows and arrows. Bow crafting and training have also been developed here in Payon";
+ next;
+ mes "[Payon: The Mountain City]";
+ mes "Payon has various armor and weapons, especially for the Archer class. If you wish to become an Archer, it would be best to become familiar with this city.";
+ next;
+ mes "[Payon: The Mountain City]";
+ mes "Payon Palace is located in the center of the city. The Archer Village is located in the Northern part of Payon. There, people can change their jobs to Archer.";
+ next;
+ mes "[Payon: The Mountain City]";
+ mes "Near the Archer Village, you can find the ^2F0400Payon Cave^000000 where Undead monsters reside.";
+ next;
+ mes "[Payon: The Mountain City]";
+ mes "From Payon, ^123972Alberta^000000 is located to the Southeast, and ^866C4BMorroc^000000 is to the West. ^5E5C69Izlude^000000 and ^6D6FE0Prontera^000000 are North of Payon.";
+ mes "Enjoy your travels.";
+ close;
+}
+
+pay_arche.gat,79,30,5 script Bulletin Board#07 837,{
+ mes "[Archer Village]";
+ mes "Welcome to the Payon Archer Village where Novices can change their jobs to Archer.";
+ next;
+ mes "[Archer Village]";
+ mes "The Archer Village provides Bows and Tights that are available for purchase. These are necessities for new Archers and Hunters.";
+ next;
+ mes "[Archer Village]";
+ mes "If you wish to become an Archer, it is suggested to become familiar with this village. For aspiring Hunters, the Hunter Guild is located in a field that is East of Payon.";
+ close;
+}
+
+pay_arche.gat,40,135,5 script Bulletin Board#08 837,{
+ mes "[Payon Cave]";
+ mes "^6B1312Caution!^000000";
+ mes "Payon Cave consists of 5 levels full of Undead and Demon monsters. Beware of swarms of Hydra in the third and fourth levels.";
+ next;
+ mes "[Payon Cave]";
+ mes "In the fifth level, there is a pretty, yet dreadful boss monster known as ^6B1312Moonlight^000000 that spawns at certain times. Approach with extreme caution.";
+ close;
+}
+
+prontera.gat,148,49,5 script Bulletin Board#09 837,{
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "Welcome to Prontera, the capital city of Rune-Midgard.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "Prontera is located in the center of the Rune-Midgard continent and is very well-known as a city of flourishing commerce.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "In this city, you can fint the Sanctuary, where people can change their jobs to Acolyte and Priest.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "You can also find the Castle, where people can change their jobs to Crusader.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "Please feel free to explore the streets of Prontera, as there are various tourist attractions within the city.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "When you need to upgrade your weapons and armors, please visit the building in the 5 o'clock direction from the fountain in the center of Prontera.";
+ next;
+ mes "[Prontera: Capital of the]";
+ mes "[Rune-Midgards Kingdom]";
+ mes "From Prontera, ^5E5C69Izlude^000000 is located to the Southeast, ^1F3A11Payon^000000 to the far South, ^683C1FGeffen^000000 to the far West and ^2D3832Al De Baran^000000 to the far North.";
+ mes "Enjoy Your time in Prontera.";
+ close;
+}
+
+mjolnir_02.gat,76,362,5 script Bulletin Board#10 837,{
+ mes "[Coal Mine]";
+ mes "^6B1312Caution!^000000";
+ mes "The Coal Mine consists of a total of 3 levels. This dungeon is suited to both new and experienced adventurers, depending on the dungeon level.";
+ next;
+ mes "[Coal Mine]";
+ mes "In the third level, monsters tend to attack adventurers in swarms, so avoid being surrounded. Since this area is a mine, many Ores can be found within the depths of this dungeon.";
+ close;
+}
+
+morocc.gat,152,110,5 script Bulletin Board#11 837,{
+ mes "[Morroc: The Frontier Town]";
+ mes "Welcome to Morroc, the City of the";
+ mes "Desert. Morroc was built on an";
+ mes "on an oasis, so this town can accommodate";
+ mes "its many visitors and travelers.";
+ next;
+ mes "[Morroc: The Frontier Town]";
+ mes "Morroc Castle lies in the center of";
+ mes "this city. Please feel free to";
+ mes "explore this town, and enjoy its";
+ mes "unique atmosphere. However, watch";
+ mes "your pockets and beware of Rogues";
+ mes "and Thieves.";
+ next;
+ mes "[Morroc: The Frontier Town]";
+ mes "From Morroc, the ^6B1312Pyramid Dungeon^000000";
+ mes "can be found to the Northwest, and";
+ mes "the ^6B1312Sphinx Dungeon^000000 can be found to";
+ mes "the West. To the southeast, you may";
+ mes "find ^6B1312Ant Hell.";
+ next;
+ mes "[Morroc: The Frontier Town]";
+ mes "The Assassin Guild is rumored to be";
+ mes "located to the Southeast. When you";
+ mes "head East from Morroc, and then";
+ mes "North, you will arrive at";
+ mes "^6D6FE0Prontera^000000.";
+ close;
+}
+
+comodo.gat,210,148,5 script Bulletin Board#12 837,{
+ mes "[Comodo: The Beach City]";
+ mes "Welcome! This town of Comodo is";
+ mes "surrounded by many ancient relics";
+ mes "from a forgotten era.";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "Only in Comodo can you find the";
+ mes "Dancer Guild and Bard Guild which";
+ mes "provide the opportunity for";
+ mes "adventurers to change their jobs to";
+ mes "Dancers and Bards.";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "You can also visit the Casino,";
+ mes "which is a popular as a tourist";
+ mes "attraction and place to lounge";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "You can buy Berserk Potions, a";
+ mes "special product of Comodo, from the";
+ mes "Tool Dealers in the area.";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "There are 3 caves around Comodo";
+ mes "that are inhabited by many";
+ mes "different monsters. If you enter";
+ mes "these areas, please be extremely";
+ mes "careful.";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "From Comodo, you can travel to";
+ mes "^866C4BMorroc^000000 through the East Cave";
+ mes "and to ^7D2272Umbala^000000 through the North";
+ mes "Cave.";
+ next;
+ mes "[Comodo: The Beach City]";
+ mes "To the East, you can find ^BF2B0DParos";
+ mes "^BF2B0DLighthouse^000000, where the Rogue Guild";
+ mes "is located. Enjoy the Comodo night";
+ mes "life~";
+ close;
+}
+
+umbala.gat,137,94,5 script Bulletin Board#13 837,{
+ mes "[Umbala: The Utan Village]";
+ mes "Welcome to Umbala,";
+ mes "the village of the Utan tribe.";
+ next;
+ mes "[Umbala: The Utan Village]";
+ mes "Umbala, as well as the Utan tribe";
+ mes "which speak their own unique";
+ mes "language, was recently discovered";
+ mes "by a few intrepid adventurers.";
+ next;
+ mes "[Umbala: The Utan Village]";
+ mes "Scholars believe that Umbala may be";
+ mes "the border between our world";
+ mes "and another realm. They believe the";
+ mes "junction between the worlds might";
+ mes "be the Yggdrasil tree to the North.";
+ next;
+ mes "[Umbala: The Utan Village]";
+ mes "Points of interest include the";
+ mes "Chief's House, the Shaman's House,";
+ mes "and the Bungee Jump Area. Thousands";
+ mes "of tourists visit the Bungee Jump";
+ mes "Area to test their courage.";
+ next;
+ mes "[Umbala: The Utan Village]";
+ mes "From Umbala, head South to go to";
+ mes "^D91B73Comodo^000000. Please enjoy your";
+ mes "stay here in Umbala.";
+ close;
+}
+
+gef_fild09.gat,227,29,4 script Bulletin Board::OrcsBoard 835,{
+ mes "[Orc Village]";
+ mes "^6B1312Caution!^000000";
+ mes "Beyond this point";
+ mes "lies the Orc Village.";
+ next;
+ mes "[Orc Village]";
+ mes "Be aware that this village is";
+ mes "teeming with dangerous Orcs, namely";
+ mes "Orc Warriors, Orc Ladies and High";
+ mes "Orcs. Two boss monsters, ^6B1312Orc Hero^000000";
+ mes "and ^6B1312Orc Lord^000000 will also appear at certain times.";
+ close;
+}
+
+gef_fild13.gat,202,31,5 duplicate(OrcsBoard) Bulletin Board#orc1 835
+
+gef_fild13.gat,29,206,5 script Bulletin Board::KoboldsBoard 836,{
+
+ mes "[Kobold Village]";
+ mes "^6B1312Caution!^000000";
+ mes "You're heading to the Kobold Village.";
+ mes "Please be aware this village is filled with many kobolds.";
+ close;
+}
+
+gef_fild08.gat,211,24,5 duplicate(KoboldsBoard) Bulletin Board#kb1 836
+
+gef_fild10.gat,109,23,5 script Bulletin Board#15 836,{
+
+ mes "[Goblin Village]";
+ mes "^6B1312Caution!^000000";
+ mes "You're heading to the Goblin Village.";
+ mes "Please be aware this village is filled with many goblins.";
+ close;
+}
+
+prt_fild05.gat,278,220,5 script Bulletin Board#16 837,{
+ mes "[Culvert]";
+ mes "Culvert is comprised of a total of";
+ mes "4 levels, and is a good training";
+ mes "ground for new adventurers.";
+ next;
+ mes "[Culvert]";
+ mes "In order to access the Culver, you";
+ mes "must volunteer as a monster";
+ mes "exterminator at the Prontera";
+ mes "Chivalry. Remember that the";
+ mes "monsters here may attack in";
+ mes "swarms.";
+ next;
+ mes "[Culvert]";
+ mes "In the fourth level of the Prontera";
+ mes "Culvert, you may encounter the boss";
+ mes "monster known as the ^6B1312Golden Thief";
+ mes "^6B1312Bug^000000. New adventurers should";
+ mes "exercise caution.";
+ close;
+}
+
+yuno.gat,154,112,5 script Bulletin Board#17 837,{
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "Welcome to Juno, the City of Sages.";
+ mes "Juno is kept aloft in the air by";
+ mes "the power of the Ymir Heart";
+ mes "Pieces";
+ next;
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "Those interested in becoming Sages";
+ mes "should visit the Sage Castle for";
+ mes "more information on the Sage job";
+ mes "and its requirements.";
+ next;
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "Other notable places include the";
+ mes "Monster Museum, Magic Academy";
+ mes "and the Juno Library.";
+ next;
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "Somewhere around Juno, there is";
+ mes "information regarding secret access";
+ mes "to the world where adventurers may";
+ mes "be reborn with newfound strength.";
+ next;
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "To the Southeast of Juno lies ^6B1312Nogg";
+ mes "^6B1312Road^000000, the Magma Dungeon. Nogg Road";
+ mes "is infamous for its aggressive";
+ mes "creatures, so be careful";
+ next;
+ mes "[Juno: Capital of]";
+ mes "[The Schwartzwald Republic]";
+ mes "From Juno, ^2D3832Al De Baran^000000, a city of";
+ mes "the Rune-Midgarts Kingdom, is";
+ mes "located to the South.";
+ close;
+}
+
+aldebaran.gat,145,105,5 script Bulletin Board#18 837,{
+ mes "[Al De Baran: The Border City]";
+ mes "Welcome to Al De Baran, the border";
+ mes "city of the Rune-Midgarts Kingdom.";
+ mes "Al De Baran's beautiful canals and";
+ mes "majestic Clock Tower are a source";
+ mes "of pride for its citizens.";
+ next;
+ mes "[Al De Baran: The Border City]";
+ mes "Adventurers can explore the Clock";
+ mes "Tower located in the city's center.";
+ mes "Other notable places are the Kafra";
+ mes "Corporation Headquarters, and the";
+ mes "Alchemist Guild which provides the";
+ mes "Alchemist job change.";
+ next;
+ mes "[Al De Baran: The Border City]";
+ mes "There is a fully trained Santa";
+ mes "Claus somewhere in Al De Baran who";
+ mes "can send you to the magical town of";
+ mes "^1D2585Lutie^000000. If you're interested in";
+ mes "seeing it for yourself, you must";
+ mes "seek Santa Claus.";
+ next;
+ mes "[Al De Baran: The Border City]";
+ mes "From this city, ^60D5FDJuno^000000 is located to";
+ mes "the North, and ^6D6FE0Prontera^000000 is located";
+ mes "to the South.";
+ close;
+}
+
+aldebaran.gat,136,133,5 script Bulletin Board#19 837,{
+ mes "[Clock Tower]";
+ mes "^6B1312Caution!^000000";
+ mes "Only well-experienced adventurers";
+ mes "should consider entering the Clock";
+ mes "Tower. There are a total of 8";
+ mes "levels: 4 beneath the ground and 4 above the earth.";
+ next;
+ mes "[Clock Tower]";
+ mes "The main monsters of the Clock";
+ mes "Tower are Clocks, Alarms and";
+ mes "Bathories. Beware of the Clock";
+ mes "Tower Keepers on patrol.";
+ next;
+ mes "[Clock Tower]";
+ mes "The paths in the Clock Tower are";
+ mes "winding and complicated, so please";
+ mes "be careful and avoid getting";
+ mes "lost.";
+ close;
+}
+
+moc_fild19.gat,107,101,5 script Bulletin Board#20 837,{
+ mes "[Sphinx]";
+ mes "^6B1312Caution!^000000";
+ mes "The Sphinx consists of 5 levels.";
+ mes "This dungeon is suited for training";
+ mes "well-experienced adventurers.";
+ next;
+ mes "[Sphinx]";
+ mes "There are many aggressive monsters";
+ mes "residing in the Sphinx, and it is";
+ mes "advised to run away if you happen";
+ mes "to be surrounded by them.";
+ next;
+ mes "[Sphinx]";
+ mes "In the fifth level, the boss";
+ mes "monster ^6B1312Pharaoh^000000 will appear at";
+ mes "certain times. Exorcise with";
+ mes "extreme prejudice.";
+ close;
+}
+
+gef_tower.gat,55,142,5 script Bulletin Board#21 837,{
+
+ mes "[Geffen Dungeon]";
+ mes "^6B1312Caution!^000000";
+ mes "Geffen dungeon is consisted of 3 levels";
+ mes "is too difficult for new adventurers to venture.";
+ mes "As main monsters constantly appear,";
+ mes "there are ^6B1312Hunter Flies^000000, ^6B1312Nightmares^000000 and ^6B1312Jakks^000000.";
+ mes "Nightmares and Jakks only appear in this dungeon.";
+ next;
+ mes "[Geffen Dungeon]";
+ mes "On the 2nd level of this dungeon,";
+ mes "^6B1312Ogretooth^000000, the creature of a doomed sword and ^6B1312Dracula^000000,";
+ mes "the boss monster appear without warning.";
+ mes "On the 3rd level, ^6B1312Doppelganger^000000 one of the strongest boss monster appears at certain time.";
+ close;
+}
+
+xmas_fild01.gat,75,80,5 script Bulletin Board#22 837,{
+
+ mes "[Winter Town, Lutie]";
+ mes "Welcome to Lutie, the town of snowfall.";
+ mes "Manufacturing toys in the toy factory is the main";
+ mes "business of this town.";
+ next;
+ mes "[Winter Town, Lutie]";
+ mes "You can access to the toy factory dungeon";
+ mes "at the north of Lutie.";
+ mes "Please remember to visit Lutie in Christmas season.";
+ mes "There are various event held with joy.";
+ mes "Please beware of ^6B1312Stormy Knight^000000 and ^6B1312Hatii^000000 the boss monsters of the toy factory dungeon.";
+ close;
+}
+
+xmas.gat,147,311,5 script Bulletin Board#23 837,{
+
+ mes "[Toy Factory]";
+ mes "^6B1312Caution!^000000";
+ mes "Toy Factory is consisting of 2 levels.";
+ mes "This dungeon is not that difficult to venture for new adventurers,";
+ mes "but there are 3 dangerous boss monsters spawn at certain time.";
+ next;
+ mes "[Toy Factory]";
+ mes "In 1st level, you will encounter a boss monster, ^6B1312Angeling^000000.";
+ mes "In 2nd level, you will encounter 2 dangrous boss monsters which are";
+ mes "^6B1312Stormy Knight^000000 and ^6B1312Hatii^000000. It is adviced to be attentive while venturing.";
+ mes "For your reference, ^6B1312Myst Cases^000000, ^6B1312Cruisers^000000 and ^6B1312Cookies^000000 only appear in this dungeon.";
+ close;
+}
+
+yuno_fild03.gat,37,143,5 script Bulletin Board#24 837,{
+
+ mes "[The Magma Dungeon, Nogg Road]";
+ mes "^6B1312Caution!^000000";
+ mes "Nogg Road is filled with very dangerous creatures.";
+ mes "It is limited to enter only to well-experienced adventurers.";
+ next;
+ mes "[The Magma Dungeon, Nogg Road]";
+ mes "Main Monsters of this dungeon is";
+ mes "^6B1312Kahos^000000 and ^6B1312Nightmare Terrors^000000.";
+ mes "Please be attentive.";
+ close;
+}
+
+niflheim.gat,200,191,5 script Bulletin Board#25 837,{
+
+ mes "[City of the Dead, Nifflheim]";
+ mes "Welcome to Nifflheim, the City of the Dead.";
+ mes "Nifflheim was known as the other world where";
+ mes "you come after the death.";
+ mes "However, recently people found out a secret path behind of a mysterious tree.";
+ mes "So, you will find many other people travelling around this area.";
+ next;
+ mes "[City of the Dead, Nifflheim]";
+ mes "As a tourist attraction, The Witch's castle is suggested.";
+ mes "Unlike normal towns, it is prohibited to save respawn point or";
+ mes "warp point inside Nifflheim. Also monsters spawn within the town as well.";
+ next;
+ mes "[City of the Dead, Nifflheim]";
+ mes "Especially, please be attentive with a boss monster";
+ mes "called ^6B1312Lord of the Death^000000.";
+ next;
+ mes "[City of the Dead, Nifflheim]";
+ mes "When you go ahead west, you will arrive at ^6B1312Valley of Gyoll^000000";
+ mes "where all the powerful and fearful monsters dwell upon.";
+ mes "It is suggested to leave the area immediately in case of a new solo adventurer.";
+ close;
+}
+
+moc_fild15.gat,267,264,5 script Bulletin Board#26 837,{
+
+ mes "[Ant Hell]";
+ mes "^6B1312Caution!^000000";
+ mes "Ant Hell is consisting of 2 levels.";
+ mes "As the name shows, this dungeon is filled with various ants";
+ mes "and good as the training grounds for new adventurers.";
+ next;
+ mes "[Ant Hell]";
+ mes "However, please be aware that ^6B1312Maya Purple^000000 appears in the 1st level";
+ mes "and ^6B1312Maya^000000 does in the 2nd level. They are the queens of ants.";
+ mes "Also, in the field where you're standing";
+ mes "a boss monster called ^6B1312Phreeoni^000000 will appear at certain time.";
+ close;
+}
+
+moc_ruins.gat,61,164,5 script Bulletin Board#27 837,{
+
+ mes "[Pyramids]";
+ mes "^6B1312Caution!^000000";
+ mes "Pyramids is consisting of total 7 levels as 4 levels on the earth and the rest under the ground.";
+ mes "First few levels are suited for new adventurers to venture, but as deeper you go down, you will encounter stronger monsters.";
+ next;
+ mes "[Pyramids]";
+ mes "In first level, there is the thief guild where people can change their jobs into Thief.";
+ mes "In the 4:th level, a boss monster called ^6B1312Osiris^000000 appears at certain time.";
+ mes "In the 3:d basement, ^6B1312Amon Ra^000000 appears at certain time.";
+ close;
+}
+
+glast_01.gat,369,308,5 script Bulletin Board#28 837,{
+
+ mes "[Glast Heim]";
+ mes "Glast Heim is an enormous dungeon with countless levels.";
+ mes "This dungeon is definately not for new or experienced adventurers";
+ mes "but for dungeon experts.";
+ next;
+ mes "[Glast Heim]";
+ mes "There are many fearsome monsters such as ^6B1312Dark Lord^000000,";
+ mes "^6B1312Owl Baron^000000, ^6B1312Owl Duke^000000, ^6B1312Dark Illusion^000000, ^6B1312Bloody Knight^000000, ^6B1312Abysmal Knight^000000, ^6B1312Chimera^000000 and various types of doomed swords.";
+ next;
+ mes "[Glast Heim]";
+ mes "However, more difficult the expedition is, greater the reward is.";
+ mes "Therefore, this dungeon is pretty popular among dungeon experts.";
+ mes "Enjoy your dungeon expedition.";
+ close;
+}
diff --git a/npc/other/comodo_gambling.txt b/npc/other/comodo_gambling.txt
index 9412810e1..29f0a0db8 100644
--- a/npc/other/comodo_gambling.txt
+++ b/npc/other/comodo_gambling.txt
@@ -1,620 +1,620 @@
-//===== eAthena Script =======================================
-//= Comodo Gambling
-//===== By: ==================================================
-//= Reddozen, Cypress, Zefris
-//===== Current Version: =====================================
-//= 0.5
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Random items from 3crt diamonds in Comodo
-//===== Additional Comments: =================================
-//= 0.1- so far just a basic setup, and working on the function
-//= 0.2- fixed some spelling errors and set zeny,zeny - (@amount * 55000)[Cypress]
-//= 0.3- Revised the gambling NPC using the official Aegis script [MasterOfMuppets]
-//= for information. Thanks to Zefris for doing it for me.
-//= 0.4- Fixed an exploit. thanks to reddozen [MasterOfMuppets]
-//= 0.5- Moved item check to the proper place [Lupus]
-//============================================================
-
-mjolnir_02.gat,85,364,3 script Blacksmith Miner 726,{
-
- mes "[Dwayne]";
- mes "Wahahahaha~";
- mes "I've dug up a fortune!";
- next;
-
- mes "[Dwayne]";
- mes "Diamonds! Hundreds and";
- mes "thousands of Diamonds,";
- mes "all of them mine!";
- mes "I'm rich!";
- next;
-
- menu "I want to buy some.",L1,"Congratulations.",-;
-
- mes "[Dwayne]";
- mes "Haha, thank you~";
- mes "If by any chance";
- mes "you need a diamond,";
- mes "please drop by.";
- mes "I'll sell them to";
- mes "you at a cheap price.";
- close;
-
- L1:
- mes "[Dwayne]";
- mes "Ah, you have an";
- mes "eye for valuables!";
- mes "Sure, sure why not!";
- mes "I'll give you a discount, too!";
- mes "55,000 Zeny for a diamond,";
- mes "how does that sound?";
- next;
-
- mes "[Dwayne]";
- mes "How many";
- mes "diamonds do you need?";
- mes "If you change your mind";
- mes "please enter '0' to cancel";
- next;
-
- set @amount, 0;
- input @amount;
- if(@amount<1){
- mes "[Dwayne]";
- mes "Alright, you've";
- mes "canceled the trade.";
- mes "Take care!";
- close;
- }
- if((@amount*55000>zeny) || (@amount>500)){
- mes "[Dwayne]";
- mes "Hahahaha~";
- mes "You can't fool me!";
- mes "You dont have enough";
- mes "Zeny for that many!";
- close;
- }
- set zeny,zeny - (@amount * 55000);
- getitem 732, @amount;
- mes "[Dwayne]";
- mes "Thank you for";
- mes "buying my diamonds!";
- mes "You're welcome to";
- mes "come back anytime.";
- close;
-
-}
-
-
-comodo.gat,219,160,3 script Kachua 91,{
-
- mes "[Kachua]";
- mes "Diamonds...!";
- mes "I simply can't get my mind off";
- mes "them! Ever since that man showed me";
- mes "that diamond, it's been all I think";
- mes "about!";
- next;
- menu "Would you like to have mine?",L_1,"Ah, what a shame...",-;
-
- mes "[Kachua]";
- mes "Yes, I know...";
- mes "Even among everything";
- mes "in my collections, nothing";
- mes "compares to diamonds...";
- close;
-
- L_1:
- mes "[Kachua]";
- mes "Are you sure you don't mind";
- mes "giving this to me? Thank you";
- mes "so much! I don't have much in";
- mes "the way of money, but i can give";
- mes "you something from one of my";
- mes "collections~";
- next;
-
- mes "[Kachua]";
- mes "So what would";
- mes "you like to have?";
- next;
-
- set @item,512;
- switch( select( "Weapon", "Armor", "Garment", "Helmet", "Shoes", "Shield" ) )
- {
- case 1: // Weapons
- set @gamble,rand(1,1000);
- if ((@gamble > 920) && (@gamble < 931))
- {
- set @gamble2,rand(1,51);
- if (@gamble2 == 1)
- set @item,1128;
- else if (@gamble2 == 2)
- set @item,1120;
- else if (@gamble2 == 3)
- set @item,1127;
- else if (@gamble2 == 4)
- set @item,1158;
- else if (@gamble2 == 5)
- set @item,1155;
- else if (@gamble2 == 6)
- set @item,1220;
- else if (@gamble2 == 7)
- set @item,1222;
- else if (@gamble2 == 8)
- set @item,1253;
- else if (@gamble2 == 9)
- set @item,1529;
- else if (@gamble2 == 10)
- set @item,1251;
- else if (@gamble2 == 11)
- set @item,1361;
- else if (@gamble2 == 12)
- set @item,1258;
- else if (@gamble2 == 13)
- set @item,1257;
- else if (@gamble2 == 14)
- set @item,1256;
- else if (@gamble2 == 15)
- set @item,1259;
- else if (@gamble2 == 16)
- set @item,1260;
- else if (@gamble2 == 17)
- set @item,1716;
- else if (@gamble2 == 18)
- set @item,1715;
- else if (@gamble2 == 19)
- set @item,1711;
- else if (@gamble2 == 20)
- set @item,1702;
- else if (@gamble2 == 21)
- set @item,1520;
- else if (@gamble2 == 22)
- set @item,1610;
- else if (@gamble2 == 23)
- set @item,1615;
- else if (@gamble2 == 24)
- set @item,1602;
- else if (@gamble2 == 25)
- set @item,1461;
- else if (@gamble2 == 26)
- set @item,1402;
- else if (@gamble2 == 27)
- set @item,1953;
- else if (@gamble2 == 28)
- set @item,1957;
- else if (@gamble2 == 29)
- set @item,1552;
- else if (@gamble2 == 30)
- set @item,1551;
- else if (@gamble2 == 31)
- set @item,1553;
- else if (@gamble2 == 32)
- set @item,1554;
- else if (@gamble2 == 33)
- set @item,1555;
- else if (@gamble2 == 34)
- set @item,1556;
- else if (@gamble2 == 35)
- set @item,1951;
- else if (@gamble2 == 36)
- set @item,1959;
- else if (@gamble2 == 37)
- set @item,1961;
- else if (@gamble2 == 38)
- set @item,1955;
- else if (@gamble2 == 39)
- set @item,1810;
- else if (@gamble2 == 40)
- set @item,1910;
- else if (@gamble2 == 41)
- set @item,1906;
- else if (@gamble2 == 42)
- set @item,1902;
- else if (@gamble2 == 43)
- set @item,1904;
- else if (@gamble2 == 44)
- set @item,1912;
- else if (@gamble2 == 45)
- set @item,1908;
- else if (@gamble2 == 46)
- set @item,1808;
- else if (@gamble2 == 47)
- set @item,1802;
- else if (@gamble2 == 48)
- set @item,1812;
- else if (@gamble2 == 49)
- set @item,1806;
- else if (@gamble2 == 50)
- set @item,1804;
- else if (@gamble2 == 51)
- set @item,1550;
- }
- else if ((@gamble > 0) && (@gamble < 201))
- set @item,1201;
- else if ((@gamble > 200) && (@gamble < 301))
- set @item,1101;
- else if ((@gamble > 300) && (@gamble < 401))
- set @item,1601;
- else if ((@gamble > 400) && (@gamble < 501))
- set @item,1116;
- else if ((@gamble > 500) && (@gamble < 601))
- set @item,1250;
- else if ((@gamble > 600) && (@gamble < 701))
- set @item,1301;
- else if ((@gamble > 700) && (@gamble < 801))
- set @item,1701;
- else if ((@gamble > 800) && (@gamble < 851))
- set @item,1504;
- else if ((@gamble > 850) && (@gamble < 901))
- set @item,1604;
- else if ((@gamble > 900) && (@gamble < 911))
- set @item,1108;
- else if ((@gamble > 910) && (@gamble < 921))
- set @item,1163;
- else if ((@gamble > 930) && (@gamble < 961))
- set @item,1522;
- else if ((@gamble > 960) && (@gamble < 971))
- set @item,1608;
- else if ((@gamble > 970) && (@gamble < 981))
- set @item,1408;
- else if ((@gamble > 980) && (@gamble < 991))
- set @item,1452;
- else if ((@gamble > 990) && (@gamble < 1001))
- set @item,1208;
- break;
-
- case 2: // Armors
- set @gamble,rand(1,500);
- if ((@gamble > 299) && (@gamble < 302))
- {
- set @gamble2,rand(1,30);
- if ((@gamble2 > 0) && (@gamble2 < 3))
- set @item,2315;
- else if ((@gamble2 > 2) && (@gamble2 < 5))
- set @item,2336;
- else if ((@gamble2 > 4) && (@gamble2 < 7))
- set @item,2318;
- else if ((@gamble2 > 6) && (@gamble2 < 9))
- set @item,2326;
- else if ((@gamble2 > 8) && (@gamble2 < 11))
- set @item,2327;
- else if ((@gamble2 > 10) && (@gamble2 < 13))
- set @item,2317;
- else if ((@gamble2 > 12) && (@gamble2 < 15))
- set @item,2331;
- else if ((@gamble2 > 14) && (@gamble2 < 17))
- set @item,2342;
- else if ((@gamble2 > 16) && (@gamble2 < 19))
- set @item,2311;
- else if ((@gamble2 > 18) && (@gamble2 < 21))
- set @item,2320;
- else if ((@gamble2 > 20) && (@gamble2 < 23))
- set @item,2319;
- else if ((@gamble2 > 22) && (@gamble2 < 25))
- set @item,2344;
- else if ((@gamble2 > 24) && (@gamble2 < 27))
- set @item,2346;
- else if ((@gamble2 > 26) && (@gamble2 < 29))
- set @item,2348;
- else if ((@gamble2 > 28) && (@gamble2 < 31))
- set @item,2350;
- }
- else if ((@gamble > 0) && (@gamble < 51))
- set @item,2301;
- else if ((@gamble > 50) && (@gamble < 101))
- set @item,2302;
- else if ((@gamble > 100) && (@gamble < 151))
- set @item,2303;
- else if ((@gamble > 150) && (@gamble < 201))
- set @item,2304;
- else if ((@gamble > 200) && (@gamble < 251))
- set @item,2305;
- else if ((@gamble > 250) && (@gamble < 300))
- set @item,2301;
- else if ((@gamble > 301) && (@gamble < 351))
- set @item,2307;
- else if ((@gamble > 350) && (@gamble < 401))
- set @item,2309;
- else if ((@gamble > 400) && (@gamble < 402))
- set @item,2322;
- else if ((@gamble > 401) && (@gamble < 403))
- set @item,2310;
- else if ((@gamble > 402) && (@gamble < 411))
- set @item,2306;
- else if ((@gamble > 410) && (@gamble < 416))
- set @item,2308;
- else if ((@gamble > 415) && (@gamble < 421))
- set @item,2313;
- else if ((@gamble > 420) && (@gamble < 426))
- set @item,2337;
- else if ((@gamble > 425) && (@gamble < 431))
- set @item,2316;
- else if ((@gamble > 430) && (@gamble < 436))
- set @item,2325;
- else if ((@gamble > 435) && (@gamble < 441))
- set @item,2341;
- else if ((@gamble > 440) && (@gamble < 446))
- set @item,2330;
- else if ((@gamble > 445) && (@gamble < 451))
- set @item,2314;
- else if ((@gamble > 450) && (@gamble < 456))
- set @item,2335;
- else if ((@gamble > 455) && (@gamble < 461))
- set @item,2324;
- else if ((@gamble > 460) && (@gamble < 466))
- set @item,2329;
- else if ((@gamble > 465) && (@gamble < 471))
- set @item,2340;
- else if ((@gamble > 470) && (@gamble < 476))
- set @item,2312;
- else if ((@gamble > 475) && (@gamble < 481))
- set @item,2339;
- else if ((@gamble > 480) && (@gamble < 486))
- set @item,2328;
- else if ((@gamble > 485) && (@gamble < 491))
- set @item,2321;
- else if ((@gamble > 490) && (@gamble < 501))
- set @item,2323;
- break;
-
- case 3: // Garments
- set @gamble,rand(1,500);
- if ((@gamble > 200) && (@gamble < 204))
- {
- set @gamble2,rand(1,11);
- if ((@gamble2 > 0) && (@gamble2 < 3))
- set @item,2506;
- else if ((@gamble2 > 2) && (@gamble2 < 5))
- set @item,2504;
- else if ((@gamble2 > 4) && (@gamble2 < 8))
- set @item,2508;
- else if ((@gamble2 > 7) && (@gamble2 < 11))
- set @item,2507;
- else if (@gamble2 == 11)
- set @item,2523;
- }
- else if ((@gamble > 0) && (@gamble < 101))
- set @item,2503;
- else if ((@gamble > 100) && (@gamble < 201))
- set @item,2505;
- else if ((@gamble > 203) && (@gamble < 451))
- set @item,2501;
- else if ((@gamble > 450) && (@gamble < 501))
- set @item,2502;
- break;
-
- case 4: //headgears
- set @gamble,rand(1,1000);
- if ((@gamble > 299) && (@gamble < 304))
- {
- set @gamble2,rand(1,76);
- if ((@gamble2 > 0) && (@gamble2 < 3))
- set @item,5109;
- else if ((@gamble2 > 2) && (@gamble2 < 5))
- set @item,2285;
- else if ((@gamble2 > 4) && (@gamble2 < 7))
- set @item,2255;
- else if ((@gamble2 > 6) && (@gamble2 < 9))
- set @item,5045;
- else if ((@gamble2 > 8) && (@gamble2 < 11))
- set @item,2233;
- else if ((@gamble2 > 10) && (@gamble2 < 13))
- set @item,2231;
- else if ((@gamble2 > 12) && (@gamble2 < 15))
- set @item,2217;
- else if ((@gamble2 > 14) && (@gamble2 < 17))
- set @item,2206;
- else if ((@gamble2 > 16) && (@gamble2 < 19))
- set @item,2246;
- else if ((@gamble2 > 18) && (@gamble2 < 21))
- set @item,2261;
- else if ((@gamble2 > 20) && (@gamble2 < 23))
- set @item,2287;
- else if ((@gamble2 > 22) && (@gamble2 < 25))
- set @item,5012;
- else if ((@gamble2 > 24) && (@gamble2 < 27))
- set @item,2244;
- else if ((@gamble2 > 26) && (@gamble2 < 29))
- set @item,5057;
- else if ((@gamble2 > 28) && (@gamble2 < 31))
- set @item,2248;
- else if ((@gamble2 > 30) && (@gamble2 < 33))
- set @item,2223;
- else if ((@gamble2 > 32) && (@gamble2 < 35))
- set @item,2247;
- else if ((@gamble2 > 34) && (@gamble2 < 37))
- set @item,2245;
- else if ((@gamble2 > 36) && (@gamble2 < 39))
- set @item,5003;
- else if ((@gamble2 > 38) && (@gamble2 < 41))
- set @item,2225;
- else if ((@gamble2 > 40) && (@gamble2 < 43))
- set @item,5017;
- else if ((@gamble2 > 42) && (@gamble2 < 45))
- set @item,5030;
- else if ((@gamble2 > 44) && (@gamble2 < 47))
- set @item,5035;
- else if ((@gamble2 > 46) && (@gamble2 < 49))
- set @item,2250;
- else if ((@gamble2 > 48) && (@gamble2 < 51))
- set @item,2277;
- else if ((@gamble2 > 50) && (@gamble2 < 53))
- set @item,5011;
- else if ((@gamble2 > 52) && (@gamble2 < 55))
- set @item,2290;
- else if ((@gamble2 > 54) && (@gamble2 < 57))
- set @item,5010;
- else if ((@gamble2 > 56) && (@gamble2 < 60))
- set @item,2259;
- else if ((@gamble2 > 59) && (@gamble2 < 62))
- set @item,5008;
- else if ((@gamble2 > 61) && (@gamble2 < 63))
- set @item,2249;
- else if ((@gamble2 > 62) && (@gamble2 < 65))
- set @item,2229;
- else if (@gamble2 == 65)
- set @item,2258;
- else if (@gamble2 == 66)
- set @item,2274;
- else if (@gamble2 == 67)
- set @item,5019;
- else if (@gamble2 == 68)
- set @item,2254;
- else if (@gamble2 == 69)
- set @item,5007;
- else if (@gamble2 == 70)
- set @item,5066;
- else if (@gamble2 == 71)
- set @item,2235;
- else if (@gamble2 == 72)
- set @item,2234;
- else if (@gamble2 == 73)
- set @item,2256;
- else if (@gamble2 == 74)
- set @item,5093;
- else if (@gamble2 == 75)
- set @item,5072;
- else if (@gamble2 == 76)
- set @item,2231;
- }
- else if ((@gamble > 0) && (@gamble < 101))
- set @item,2226;
- else if ((@gamble > 100) && (@gamble < 201))
- set @item,2211;
- else if ((@gamble > 200) && (@gamble < 300))
- set @item,2209;
- else if ((@gamble > 303) && (@gamble < 401))
- set @item,2220;
- else if ((@gamble > 400) && (@gamble < 501))
- set @item,2232;
- else if ((@gamble > 500) && (@gamble < 601))
- set @item,2216;
- else if ((@gamble > 600) && (@gamble < 701))
- set @item,2230;
- else if ((@gamble > 700) && (@gamble < 801))
- set @item,2224;
- else if ((@gamble > 800) && (@gamble < 901))
- set @item,2222;
- else if ((@gamble > 900) && (@gamble < 906))
- set @item,2228;
- else if ((@gamble > 905) && (@gamble < 911))
- set @item,2252;
- else if ((@gamble > 910) && (@gamble < 916))
- set @item,2227;
- else if ((@gamble > 915) && (@gamble < 921))
- set @item,2221;
- else if ((@gamble > 920) && (@gamble < 926))
- set @item,2299;
- else if ((@gamble > 925) && (@gamble < 931))
- set @item,2236;
- else if ((@gamble > 930) && (@gamble < 936))
- set @item,2275;
- else if ((@gamble > 935) && (@gamble < 941))
- set @item,5015;
- else if ((@gamble > 940) && (@gamble < 946))
- set @item,5061;
- else if ((@gamble > 945) && (@gamble < 951))
- set @item,5092;
- else if ((@gamble > 950) && (@gamble < 1001))
- set @item,2226;
- break;
-
- case 5: //footgear
- set @gamble,rand(1,500);
- if ((@gamble > 299) && (@gamble < 303))
- {
- set @gamble2,rand(1,10);
- if ((@gamble2 > 0) && (@gamble2 < 3))
- set @item,2406;
- else if ((@gamble2 > 2) && (@gamble2 < 5))
- set @item,2412;
- else if ((@gamble2 > 4) && (@gamble2 < 8))
- set @item,2404;
- else if ((@gamble2 > 7) && (@gamble2 < 11))
- set @item,2407;
- }
- else if ((@gamble > 0) && (@gamble < 201))
- set @item,2401;
- else if ((@gamble > 200) && (@gamble < 300))
- set @item,2408;
- else if ((@gamble > 302) && (@gamble < 351))
- set @item,2411;
- else if ((@gamble > 350) && (@gamble < 401))
- set @item,2403;
- else if ((@gamble > 400) && (@gamble < 451))
- set @item,2405;
- else if ((@gamble > 450) && (@gamble < 476))
- set @item,2409;
- else if ((@gamble > 475) && (@gamble < 501))
- set @item,2402;
- break;
-
- case 6: //Shields
- set @gamble,rand(1,500);
- if ((@gamble > 200) && (@gamble < 205))
- {
- set @gamble2,rand(1,10);
- if ((@gamble2 > 0) && (@gamble2 < 3))
- set @item,2104;
- else if ((@gamble2 > 2) && (@gamble2 < 5))
- set @item,2106;
- else if ((@gamble2 > 4) && (@gamble2 < 7))
- set @item,2102;
- else if ((@gamble2 > 6) && (@gamble2 < 9))
- set @item,2111;
- else if ((@gamble2 > 8) && (@gamble2 < 11))
- set @item,2109;
- }
- else if ((@gamble > 0) && (@gamble < 201))
- set @item,2101;
- else if ((@gamble > 204) && (@gamble < 301))
- set @item,2103;
- else if ((@gamble > 300) && (@gamble < 401))
- set @item,2107;
- else if ((@gamble > 401) && (@gamble < 481))
- set @item,2105;
- else if ((@gamble > 480) && (@gamble < 501))
- set @item,2108;
- break;
- }
- if(countitem(732) < 1){
- mes "[Kachua]";
- mes "*piff*";
- mes "You don't have any";
- mes "diamonds! Don't even";
- mes "try to fool me!";
- close;
- }
- delitem 732,1;
- getitem @item,1;
- close;
-}
-
-comodo.gat,204,148,7 script Devellin 90,{
-
- mes "[Devellin]";
- mes "It seems some traveller showed";
- mes "a huge diamond to Kachua a while";
- mes "ago. Ever since then, all she's";
- mes "been talking about is diamonds and";
- mes "how much she wants them.";
- next;
- mes "[Devellin]";
- mes "She's been getting pretty obsessive";
- mes "about it, which scares me. It seems";
- mes "she's more than willing to";
- mes "sacrifice anything she owns for a";
- mes "diamond.";
- next;
- mes "[Devellin]";
- mes "She's the type of person who'll do";
- mes "anything to get what she wants. I'm";
- mes "worried that she might give away";
- mes "something far more valuable than a";
- mes "diamond in exchange...";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Comodo Gambling
+//===== By: ==================================================
+//= Reddozen, Cypress, Zefris
+//===== Current Version: =====================================
+//= 0.5
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Random items from 3crt diamonds in Comodo
+//===== Additional Comments: =================================
+//= 0.1- so far just a basic setup, and working on the function
+//= 0.2- fixed some spelling errors and set zeny,zeny - (@amount * 55000)[Cypress]
+//= 0.3- Revised the gambling NPC using the official Aegis script [MasterOfMuppets]
+//= for information. Thanks to Zefris for doing it for me.
+//= 0.4- Fixed an exploit. thanks to reddozen [MasterOfMuppets]
+//= 0.5- Moved item check to the proper place [Lupus]
+//============================================================
+
+mjolnir_02.gat,85,364,3 script Blacksmith Miner 726,{
+
+ mes "[Dwayne]";
+ mes "Wahahahaha~";
+ mes "I've dug up a fortune!";
+ next;
+
+ mes "[Dwayne]";
+ mes "Diamonds! Hundreds and";
+ mes "thousands of Diamonds,";
+ mes "all of them mine!";
+ mes "I'm rich!";
+ next;
+
+ menu "I want to buy some.",L1,"Congratulations.",-;
+
+ mes "[Dwayne]";
+ mes "Haha, thank you~";
+ mes "If by any chance";
+ mes "you need a diamond,";
+ mes "please drop by.";
+ mes "I'll sell them to";
+ mes "you at a cheap price.";
+ close;
+
+ L1:
+ mes "[Dwayne]";
+ mes "Ah, you have an";
+ mes "eye for valuables!";
+ mes "Sure, sure why not!";
+ mes "I'll give you a discount, too!";
+ mes "55,000 Zeny for a diamond,";
+ mes "how does that sound?";
+ next;
+
+ mes "[Dwayne]";
+ mes "How many";
+ mes "diamonds do you need?";
+ mes "If you change your mind";
+ mes "please enter '0' to cancel";
+ next;
+
+ set @amount, 0;
+ input @amount;
+ if(@amount<1){
+ mes "[Dwayne]";
+ mes "Alright, you've";
+ mes "canceled the trade.";
+ mes "Take care!";
+ close;
+ }
+ if((@amount*55000>zeny) || (@amount>500)){
+ mes "[Dwayne]";
+ mes "Hahahaha~";
+ mes "You can't fool me!";
+ mes "You dont have enough";
+ mes "Zeny for that many!";
+ close;
+ }
+ set zeny,zeny - (@amount * 55000);
+ getitem 732, @amount;
+ mes "[Dwayne]";
+ mes "Thank you for";
+ mes "buying my diamonds!";
+ mes "You're welcome to";
+ mes "come back anytime.";
+ close;
+
+}
+
+
+comodo.gat,219,160,3 script Kachua 91,{
+
+ mes "[Kachua]";
+ mes "Diamonds...!";
+ mes "I simply can't get my mind off";
+ mes "them! Ever since that man showed me";
+ mes "that diamond, it's been all I think";
+ mes "about!";
+ next;
+ menu "Would you like to have mine?",L_1,"Ah, what a shame...",-;
+
+ mes "[Kachua]";
+ mes "Yes, I know...";
+ mes "Even among everything";
+ mes "in my collections, nothing";
+ mes "compares to diamonds...";
+ close;
+
+ L_1:
+ mes "[Kachua]";
+ mes "Are you sure you don't mind";
+ mes "giving this to me? Thank you";
+ mes "so much! I don't have much in";
+ mes "the way of money, but i can give";
+ mes "you something from one of my";
+ mes "collections~";
+ next;
+
+ mes "[Kachua]";
+ mes "So what would";
+ mes "you like to have?";
+ next;
+
+ set @item,512;
+ switch( select( "Weapon", "Armor", "Garment", "Helmet", "Shoes", "Shield" ) )
+ {
+ case 1: // Weapons
+ set @gamble,rand(1,1000);
+ if ((@gamble > 920) && (@gamble < 931))
+ {
+ set @gamble2,rand(1,51);
+ if (@gamble2 == 1)
+ set @item,1128;
+ else if (@gamble2 == 2)
+ set @item,1120;
+ else if (@gamble2 == 3)
+ set @item,1127;
+ else if (@gamble2 == 4)
+ set @item,1158;
+ else if (@gamble2 == 5)
+ set @item,1155;
+ else if (@gamble2 == 6)
+ set @item,1220;
+ else if (@gamble2 == 7)
+ set @item,1222;
+ else if (@gamble2 == 8)
+ set @item,1253;
+ else if (@gamble2 == 9)
+ set @item,1529;
+ else if (@gamble2 == 10)
+ set @item,1251;
+ else if (@gamble2 == 11)
+ set @item,1361;
+ else if (@gamble2 == 12)
+ set @item,1258;
+ else if (@gamble2 == 13)
+ set @item,1257;
+ else if (@gamble2 == 14)
+ set @item,1256;
+ else if (@gamble2 == 15)
+ set @item,1259;
+ else if (@gamble2 == 16)
+ set @item,1260;
+ else if (@gamble2 == 17)
+ set @item,1716;
+ else if (@gamble2 == 18)
+ set @item,1715;
+ else if (@gamble2 == 19)
+ set @item,1711;
+ else if (@gamble2 == 20)
+ set @item,1702;
+ else if (@gamble2 == 21)
+ set @item,1520;
+ else if (@gamble2 == 22)
+ set @item,1610;
+ else if (@gamble2 == 23)
+ set @item,1615;
+ else if (@gamble2 == 24)
+ set @item,1602;
+ else if (@gamble2 == 25)
+ set @item,1461;
+ else if (@gamble2 == 26)
+ set @item,1402;
+ else if (@gamble2 == 27)
+ set @item,1953;
+ else if (@gamble2 == 28)
+ set @item,1957;
+ else if (@gamble2 == 29)
+ set @item,1552;
+ else if (@gamble2 == 30)
+ set @item,1551;
+ else if (@gamble2 == 31)
+ set @item,1553;
+ else if (@gamble2 == 32)
+ set @item,1554;
+ else if (@gamble2 == 33)
+ set @item,1555;
+ else if (@gamble2 == 34)
+ set @item,1556;
+ else if (@gamble2 == 35)
+ set @item,1951;
+ else if (@gamble2 == 36)
+ set @item,1959;
+ else if (@gamble2 == 37)
+ set @item,1961;
+ else if (@gamble2 == 38)
+ set @item,1955;
+ else if (@gamble2 == 39)
+ set @item,1810;
+ else if (@gamble2 == 40)
+ set @item,1910;
+ else if (@gamble2 == 41)
+ set @item,1906;
+ else if (@gamble2 == 42)
+ set @item,1902;
+ else if (@gamble2 == 43)
+ set @item,1904;
+ else if (@gamble2 == 44)
+ set @item,1912;
+ else if (@gamble2 == 45)
+ set @item,1908;
+ else if (@gamble2 == 46)
+ set @item,1808;
+ else if (@gamble2 == 47)
+ set @item,1802;
+ else if (@gamble2 == 48)
+ set @item,1812;
+ else if (@gamble2 == 49)
+ set @item,1806;
+ else if (@gamble2 == 50)
+ set @item,1804;
+ else if (@gamble2 == 51)
+ set @item,1550;
+ }
+ else if ((@gamble > 0) && (@gamble < 201))
+ set @item,1201;
+ else if ((@gamble > 200) && (@gamble < 301))
+ set @item,1101;
+ else if ((@gamble > 300) && (@gamble < 401))
+ set @item,1601;
+ else if ((@gamble > 400) && (@gamble < 501))
+ set @item,1116;
+ else if ((@gamble > 500) && (@gamble < 601))
+ set @item,1250;
+ else if ((@gamble > 600) && (@gamble < 701))
+ set @item,1301;
+ else if ((@gamble > 700) && (@gamble < 801))
+ set @item,1701;
+ else if ((@gamble > 800) && (@gamble < 851))
+ set @item,1504;
+ else if ((@gamble > 850) && (@gamble < 901))
+ set @item,1604;
+ else if ((@gamble > 900) && (@gamble < 911))
+ set @item,1108;
+ else if ((@gamble > 910) && (@gamble < 921))
+ set @item,1163;
+ else if ((@gamble > 930) && (@gamble < 961))
+ set @item,1522;
+ else if ((@gamble > 960) && (@gamble < 971))
+ set @item,1608;
+ else if ((@gamble > 970) && (@gamble < 981))
+ set @item,1408;
+ else if ((@gamble > 980) && (@gamble < 991))
+ set @item,1452;
+ else if ((@gamble > 990) && (@gamble < 1001))
+ set @item,1208;
+ break;
+
+ case 2: // Armors
+ set @gamble,rand(1,500);
+ if ((@gamble > 299) && (@gamble < 302))
+ {
+ set @gamble2,rand(1,30);
+ if ((@gamble2 > 0) && (@gamble2 < 3))
+ set @item,2315;
+ else if ((@gamble2 > 2) && (@gamble2 < 5))
+ set @item,2336;
+ else if ((@gamble2 > 4) && (@gamble2 < 7))
+ set @item,2318;
+ else if ((@gamble2 > 6) && (@gamble2 < 9))
+ set @item,2326;
+ else if ((@gamble2 > 8) && (@gamble2 < 11))
+ set @item,2327;
+ else if ((@gamble2 > 10) && (@gamble2 < 13))
+ set @item,2317;
+ else if ((@gamble2 > 12) && (@gamble2 < 15))
+ set @item,2331;
+ else if ((@gamble2 > 14) && (@gamble2 < 17))
+ set @item,2342;
+ else if ((@gamble2 > 16) && (@gamble2 < 19))
+ set @item,2311;
+ else if ((@gamble2 > 18) && (@gamble2 < 21))
+ set @item,2320;
+ else if ((@gamble2 > 20) && (@gamble2 < 23))
+ set @item,2319;
+ else if ((@gamble2 > 22) && (@gamble2 < 25))
+ set @item,2344;
+ else if ((@gamble2 > 24) && (@gamble2 < 27))
+ set @item,2346;
+ else if ((@gamble2 > 26) && (@gamble2 < 29))
+ set @item,2348;
+ else if ((@gamble2 > 28) && (@gamble2 < 31))
+ set @item,2350;
+ }
+ else if ((@gamble > 0) && (@gamble < 51))
+ set @item,2301;
+ else if ((@gamble > 50) && (@gamble < 101))
+ set @item,2302;
+ else if ((@gamble > 100) && (@gamble < 151))
+ set @item,2303;
+ else if ((@gamble > 150) && (@gamble < 201))
+ set @item,2304;
+ else if ((@gamble > 200) && (@gamble < 251))
+ set @item,2305;
+ else if ((@gamble > 250) && (@gamble < 300))
+ set @item,2301;
+ else if ((@gamble > 301) && (@gamble < 351))
+ set @item,2307;
+ else if ((@gamble > 350) && (@gamble < 401))
+ set @item,2309;
+ else if ((@gamble > 400) && (@gamble < 402))
+ set @item,2322;
+ else if ((@gamble > 401) && (@gamble < 403))
+ set @item,2310;
+ else if ((@gamble > 402) && (@gamble < 411))
+ set @item,2306;
+ else if ((@gamble > 410) && (@gamble < 416))
+ set @item,2308;
+ else if ((@gamble > 415) && (@gamble < 421))
+ set @item,2313;
+ else if ((@gamble > 420) && (@gamble < 426))
+ set @item,2337;
+ else if ((@gamble > 425) && (@gamble < 431))
+ set @item,2316;
+ else if ((@gamble > 430) && (@gamble < 436))
+ set @item,2325;
+ else if ((@gamble > 435) && (@gamble < 441))
+ set @item,2341;
+ else if ((@gamble > 440) && (@gamble < 446))
+ set @item,2330;
+ else if ((@gamble > 445) && (@gamble < 451))
+ set @item,2314;
+ else if ((@gamble > 450) && (@gamble < 456))
+ set @item,2335;
+ else if ((@gamble > 455) && (@gamble < 461))
+ set @item,2324;
+ else if ((@gamble > 460) && (@gamble < 466))
+ set @item,2329;
+ else if ((@gamble > 465) && (@gamble < 471))
+ set @item,2340;
+ else if ((@gamble > 470) && (@gamble < 476))
+ set @item,2312;
+ else if ((@gamble > 475) && (@gamble < 481))
+ set @item,2339;
+ else if ((@gamble > 480) && (@gamble < 486))
+ set @item,2328;
+ else if ((@gamble > 485) && (@gamble < 491))
+ set @item,2321;
+ else if ((@gamble > 490) && (@gamble < 501))
+ set @item,2323;
+ break;
+
+ case 3: // Garments
+ set @gamble,rand(1,500);
+ if ((@gamble > 200) && (@gamble < 204))
+ {
+ set @gamble2,rand(1,11);
+ if ((@gamble2 > 0) && (@gamble2 < 3))
+ set @item,2506;
+ else if ((@gamble2 > 2) && (@gamble2 < 5))
+ set @item,2504;
+ else if ((@gamble2 > 4) && (@gamble2 < 8))
+ set @item,2508;
+ else if ((@gamble2 > 7) && (@gamble2 < 11))
+ set @item,2507;
+ else if (@gamble2 == 11)
+ set @item,2523;
+ }
+ else if ((@gamble > 0) && (@gamble < 101))
+ set @item,2503;
+ else if ((@gamble > 100) && (@gamble < 201))
+ set @item,2505;
+ else if ((@gamble > 203) && (@gamble < 451))
+ set @item,2501;
+ else if ((@gamble > 450) && (@gamble < 501))
+ set @item,2502;
+ break;
+
+ case 4: //headgears
+ set @gamble,rand(1,1000);
+ if ((@gamble > 299) && (@gamble < 304))
+ {
+ set @gamble2,rand(1,76);
+ if ((@gamble2 > 0) && (@gamble2 < 3))
+ set @item,5109;
+ else if ((@gamble2 > 2) && (@gamble2 < 5))
+ set @item,2285;
+ else if ((@gamble2 > 4) && (@gamble2 < 7))
+ set @item,2255;
+ else if ((@gamble2 > 6) && (@gamble2 < 9))
+ set @item,5045;
+ else if ((@gamble2 > 8) && (@gamble2 < 11))
+ set @item,2233;
+ else if ((@gamble2 > 10) && (@gamble2 < 13))
+ set @item,2231;
+ else if ((@gamble2 > 12) && (@gamble2 < 15))
+ set @item,2217;
+ else if ((@gamble2 > 14) && (@gamble2 < 17))
+ set @item,2206;
+ else if ((@gamble2 > 16) && (@gamble2 < 19))
+ set @item,2246;
+ else if ((@gamble2 > 18) && (@gamble2 < 21))
+ set @item,2261;
+ else if ((@gamble2 > 20) && (@gamble2 < 23))
+ set @item,2287;
+ else if ((@gamble2 > 22) && (@gamble2 < 25))
+ set @item,5012;
+ else if ((@gamble2 > 24) && (@gamble2 < 27))
+ set @item,2244;
+ else if ((@gamble2 > 26) && (@gamble2 < 29))
+ set @item,5057;
+ else if ((@gamble2 > 28) && (@gamble2 < 31))
+ set @item,2248;
+ else if ((@gamble2 > 30) && (@gamble2 < 33))
+ set @item,2223;
+ else if ((@gamble2 > 32) && (@gamble2 < 35))
+ set @item,2247;
+ else if ((@gamble2 > 34) && (@gamble2 < 37))
+ set @item,2245;
+ else if ((@gamble2 > 36) && (@gamble2 < 39))
+ set @item,5003;
+ else if ((@gamble2 > 38) && (@gamble2 < 41))
+ set @item,2225;
+ else if ((@gamble2 > 40) && (@gamble2 < 43))
+ set @item,5017;
+ else if ((@gamble2 > 42) && (@gamble2 < 45))
+ set @item,5030;
+ else if ((@gamble2 > 44) && (@gamble2 < 47))
+ set @item,5035;
+ else if ((@gamble2 > 46) && (@gamble2 < 49))
+ set @item,2250;
+ else if ((@gamble2 > 48) && (@gamble2 < 51))
+ set @item,2277;
+ else if ((@gamble2 > 50) && (@gamble2 < 53))
+ set @item,5011;
+ else if ((@gamble2 > 52) && (@gamble2 < 55))
+ set @item,2290;
+ else if ((@gamble2 > 54) && (@gamble2 < 57))
+ set @item,5010;
+ else if ((@gamble2 > 56) && (@gamble2 < 60))
+ set @item,2259;
+ else if ((@gamble2 > 59) && (@gamble2 < 62))
+ set @item,5008;
+ else if ((@gamble2 > 61) && (@gamble2 < 63))
+ set @item,2249;
+ else if ((@gamble2 > 62) && (@gamble2 < 65))
+ set @item,2229;
+ else if (@gamble2 == 65)
+ set @item,2258;
+ else if (@gamble2 == 66)
+ set @item,2274;
+ else if (@gamble2 == 67)
+ set @item,5019;
+ else if (@gamble2 == 68)
+ set @item,2254;
+ else if (@gamble2 == 69)
+ set @item,5007;
+ else if (@gamble2 == 70)
+ set @item,5066;
+ else if (@gamble2 == 71)
+ set @item,2235;
+ else if (@gamble2 == 72)
+ set @item,2234;
+ else if (@gamble2 == 73)
+ set @item,2256;
+ else if (@gamble2 == 74)
+ set @item,5093;
+ else if (@gamble2 == 75)
+ set @item,5072;
+ else if (@gamble2 == 76)
+ set @item,2231;
+ }
+ else if ((@gamble > 0) && (@gamble < 101))
+ set @item,2226;
+ else if ((@gamble > 100) && (@gamble < 201))
+ set @item,2211;
+ else if ((@gamble > 200) && (@gamble < 300))
+ set @item,2209;
+ else if ((@gamble > 303) && (@gamble < 401))
+ set @item,2220;
+ else if ((@gamble > 400) && (@gamble < 501))
+ set @item,2232;
+ else if ((@gamble > 500) && (@gamble < 601))
+ set @item,2216;
+ else if ((@gamble > 600) && (@gamble < 701))
+ set @item,2230;
+ else if ((@gamble > 700) && (@gamble < 801))
+ set @item,2224;
+ else if ((@gamble > 800) && (@gamble < 901))
+ set @item,2222;
+ else if ((@gamble > 900) && (@gamble < 906))
+ set @item,2228;
+ else if ((@gamble > 905) && (@gamble < 911))
+ set @item,2252;
+ else if ((@gamble > 910) && (@gamble < 916))
+ set @item,2227;
+ else if ((@gamble > 915) && (@gamble < 921))
+ set @item,2221;
+ else if ((@gamble > 920) && (@gamble < 926))
+ set @item,2299;
+ else if ((@gamble > 925) && (@gamble < 931))
+ set @item,2236;
+ else if ((@gamble > 930) && (@gamble < 936))
+ set @item,2275;
+ else if ((@gamble > 935) && (@gamble < 941))
+ set @item,5015;
+ else if ((@gamble > 940) && (@gamble < 946))
+ set @item,5061;
+ else if ((@gamble > 945) && (@gamble < 951))
+ set @item,5092;
+ else if ((@gamble > 950) && (@gamble < 1001))
+ set @item,2226;
+ break;
+
+ case 5: //footgear
+ set @gamble,rand(1,500);
+ if ((@gamble > 299) && (@gamble < 303))
+ {
+ set @gamble2,rand(1,10);
+ if ((@gamble2 > 0) && (@gamble2 < 3))
+ set @item,2406;
+ else if ((@gamble2 > 2) && (@gamble2 < 5))
+ set @item,2412;
+ else if ((@gamble2 > 4) && (@gamble2 < 8))
+ set @item,2404;
+ else if ((@gamble2 > 7) && (@gamble2 < 11))
+ set @item,2407;
+ }
+ else if ((@gamble > 0) && (@gamble < 201))
+ set @item,2401;
+ else if ((@gamble > 200) && (@gamble < 300))
+ set @item,2408;
+ else if ((@gamble > 302) && (@gamble < 351))
+ set @item,2411;
+ else if ((@gamble > 350) && (@gamble < 401))
+ set @item,2403;
+ else if ((@gamble > 400) && (@gamble < 451))
+ set @item,2405;
+ else if ((@gamble > 450) && (@gamble < 476))
+ set @item,2409;
+ else if ((@gamble > 475) && (@gamble < 501))
+ set @item,2402;
+ break;
+
+ case 6: //Shields
+ set @gamble,rand(1,500);
+ if ((@gamble > 200) && (@gamble < 205))
+ {
+ set @gamble2,rand(1,10);
+ if ((@gamble2 > 0) && (@gamble2 < 3))
+ set @item,2104;
+ else if ((@gamble2 > 2) && (@gamble2 < 5))
+ set @item,2106;
+ else if ((@gamble2 > 4) && (@gamble2 < 7))
+ set @item,2102;
+ else if ((@gamble2 > 6) && (@gamble2 < 9))
+ set @item,2111;
+ else if ((@gamble2 > 8) && (@gamble2 < 11))
+ set @item,2109;
+ }
+ else if ((@gamble > 0) && (@gamble < 201))
+ set @item,2101;
+ else if ((@gamble > 204) && (@gamble < 301))
+ set @item,2103;
+ else if ((@gamble > 300) && (@gamble < 401))
+ set @item,2107;
+ else if ((@gamble > 401) && (@gamble < 481))
+ set @item,2105;
+ else if ((@gamble > 480) && (@gamble < 501))
+ set @item,2108;
+ break;
+ }
+ if(countitem(732) < 1){
+ mes "[Kachua]";
+ mes "*piff*";
+ mes "You don't have any";
+ mes "diamonds! Don't even";
+ mes "try to fool me!";
+ close;
+ }
+ delitem 732,1;
+ getitem @item,1;
+ close;
+}
+
+comodo.gat,204,148,7 script Devellin 90,{
+
+ mes "[Devellin]";
+ mes "It seems some traveller showed";
+ mes "a huge diamond to Kachua a while";
+ mes "ago. Ever since then, all she's";
+ mes "been talking about is diamonds and";
+ mes "how much she wants them.";
+ next;
+ mes "[Devellin]";
+ mes "She's been getting pretty obsessive";
+ mes "about it, which scares me. It seems";
+ mes "she's more than willing to";
+ mes "sacrifice anything she owns for a";
+ mes "diamond.";
+ next;
+ mes "[Devellin]";
+ mes "She's the type of person who'll do";
+ mes "anything to get what she wants. I'm";
+ mes "worried that she might give away";
+ mes "something far more valuable than a";
+ mes "diamond in exchange...";
+ close;
+
+}
diff --git a/npc/other/divorce.txt b/npc/other/divorce.txt
index d861c4fbc..919748727 100644
--- a/npc/other/divorce.txt
+++ b/npc/other/divorce.txt
@@ -1,112 +1,112 @@
-//===== eAthena Script =======================================
-//= Divorcing Deviruchi
-//===== By: ==================================================
-//= Perkka, Scriptor, LightFighter
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena 1 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Both players should be online to get divorced
-//= Fixed menu [Lupus]
-//============================================================
-
-
-nif_in.gat,190,112,5 script Deviruchi#divorce 1109,{
- if (getpartnerid() == 0) {
- mes "[Deviruchi]";
- mes "Kekeke, humans are always alone in the end,";
- mes "The feeling of lonely is just temporarily.";
- mes "If you feel lonely, how about getting a pet?";
- mes "I, the Deviruchi is quite popular recently, you know...";
- close;
- }
- mes "[Deviruchi]";
- mes "You don't look good...";
- mes "Anything that you have done that makes you feel regret now?";
- mes "You must know that I am not willing to help happy people.";
- mes "Deviruchi bear no interest";
- mes "to those kind of people. Kekeke";
- next;
- mes "[Deviruchi]";
- mes "Let's put everything aside first.";
- mes "Let me ask you. Are you happy after you get married?";
- mes "Don't think about love...";
- mes "I know more than you can imagine.";
- mes "There're countless problem behind one grand wedding.";
- next;
- mes "[Deviruchi]";
- mes "That's right.";
- mes "It your fate that you come here.";
- mes "And I know it's your instinct to change your life too.";
- mes "Although you have made an oath to your partner,";
- mes "the heart will still wither somehow...!";
- next;
- mes "[Deviruchi]";
- mes "The method is easy!";
- mes "Marriage is actually one kind of contract.";
- mes "Just ask a favor from Deviruchi";
- mes "and it will destroy the contract for you... Do you get it?";
- mes "Live a free life!!";
- next;
- mes "[Deviruchi]";
- mes "You don't need to get the agreement of your partner,";
- mes "You will find another lover soon,";
- mes "So, why not leave your current partner?";
- mes "... Want me to help?";
- mes "I can cancel your marriage now, you know...!";
- next;
- menu "No, I am very happy now",-,"Yes, I want a new life",M_NewLife;
-
- mes "[Deviruchi]";
- mes "Hmmph, lovers... lovers!!";
- mes "You will regret,";
- mes "and come back to find Deviruchi someday!";
- mes "We'll see how long your happiness will last!!";
- close2;
- warp "niflheim.gat",169,162;
- end;
-
-M_NewLife:
- mes "[Deviruchi]";
- mes "Good, you don't need anything.";
- mes "I just need your heart and 2,500,000 zeny.";
- mes "You want to get back your life before you get married, don't you?";
- mes "So, is that it? You're going to cancel the marriage contract?";
- next;
- menu "...I need to consider it again",-, "I am paying you to cancel it now!",M_Divorce;
- mes "[Deviruchi]";
- mes "Quit considering. Everyone will be alone in the end.";
- mes "Just make up your mind and prepare the zeny,";
- mes "then come and look for me...";
- mes "Kekekeke.....";
- close;
-
-M_Divorce:
- if (Zeny < 2500000) goto NoMoney;
- set Zeny, Zeny - 2500000;
- mes "[Deviruchi]";
- mes "Before you change your mind again, I will proceed with your divorce now!!";
- mes "It might take some time...";
- mes "So don't go away, and stay here!";
- next;
- //ShowEffect "Deviruchi#Divorce" EF_MAGICROD Dont know, what to do here >.>
- //ShowEffect "" EF_DEVIL same
- percentheal -100,-100;
- divorce;
- mes "[Deviruchi]";
- mes "Kekeke, you are free now!";
- mes "Throw away all your sinking feelings!";
- mes "You should thank Deviruchi.....!";
- close;
-
-NoMoney:
- mes "[Deviruchi]";
- mes "Haven't I said 2,500,000 zeny?";
- mes "This is the payment for Deviruchi to help you.";
- mes "If you don't even have that money,";
- mes "you can rot with that married life of yours... kekeke";
- close;
+//===== eAthena Script =======================================
+//= Divorcing Deviruchi
+//===== By: ==================================================
+//= Perkka, Scriptor, LightFighter
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena 1 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Both players should be online to get divorced
+//= Fixed menu [Lupus]
+//============================================================
+
+
+nif_in.gat,190,112,5 script Deviruchi#divorce 1109,{
+ if (getpartnerid() == 0) {
+ mes "[Deviruchi]";
+ mes "Kekeke, humans are always alone in the end,";
+ mes "The feeling of lonely is just temporarily.";
+ mes "If you feel lonely, how about getting a pet?";
+ mes "I, the Deviruchi is quite popular recently, you know...";
+ close;
+ }
+ mes "[Deviruchi]";
+ mes "You don't look good...";
+ mes "Anything that you have done that makes you feel regret now?";
+ mes "You must know that I am not willing to help happy people.";
+ mes "Deviruchi bear no interest";
+ mes "to those kind of people. Kekeke";
+ next;
+ mes "[Deviruchi]";
+ mes "Let's put everything aside first.";
+ mes "Let me ask you. Are you happy after you get married?";
+ mes "Don't think about love...";
+ mes "I know more than you can imagine.";
+ mes "There're countless problem behind one grand wedding.";
+ next;
+ mes "[Deviruchi]";
+ mes "That's right.";
+ mes "It your fate that you come here.";
+ mes "And I know it's your instinct to change your life too.";
+ mes "Although you have made an oath to your partner,";
+ mes "the heart will still wither somehow...!";
+ next;
+ mes "[Deviruchi]";
+ mes "The method is easy!";
+ mes "Marriage is actually one kind of contract.";
+ mes "Just ask a favor from Deviruchi";
+ mes "and it will destroy the contract for you... Do you get it?";
+ mes "Live a free life!!";
+ next;
+ mes "[Deviruchi]";
+ mes "You don't need to get the agreement of your partner,";
+ mes "You will find another lover soon,";
+ mes "So, why not leave your current partner?";
+ mes "... Want me to help?";
+ mes "I can cancel your marriage now, you know...!";
+ next;
+ menu "No, I am very happy now",-,"Yes, I want a new life",M_NewLife;
+
+ mes "[Deviruchi]";
+ mes "Hmmph, lovers... lovers!!";
+ mes "You will regret,";
+ mes "and come back to find Deviruchi someday!";
+ mes "We'll see how long your happiness will last!!";
+ close2;
+ warp "niflheim.gat",169,162;
+ end;
+
+M_NewLife:
+ mes "[Deviruchi]";
+ mes "Good, you don't need anything.";
+ mes "I just need your heart and 2,500,000 zeny.";
+ mes "You want to get back your life before you get married, don't you?";
+ mes "So, is that it? You're going to cancel the marriage contract?";
+ next;
+ menu "...I need to consider it again",-, "I am paying you to cancel it now!",M_Divorce;
+ mes "[Deviruchi]";
+ mes "Quit considering. Everyone will be alone in the end.";
+ mes "Just make up your mind and prepare the zeny,";
+ mes "then come and look for me...";
+ mes "Kekekeke.....";
+ close;
+
+M_Divorce:
+ if (Zeny < 2500000) goto NoMoney;
+ set Zeny, Zeny - 2500000;
+ mes "[Deviruchi]";
+ mes "Before you change your mind again, I will proceed with your divorce now!!";
+ mes "It might take some time...";
+ mes "So don't go away, and stay here!";
+ next;
+ //ShowEffect "Deviruchi#Divorce" EF_MAGICROD Dont know, what to do here >.>
+ //ShowEffect "" EF_DEVIL same
+ percentheal -100,-100;
+ divorce;
+ mes "[Deviruchi]";
+ mes "Kekeke, you are free now!";
+ mes "Throw away all your sinking feelings!";
+ mes "You should thank Deviruchi.....!";
+ close;
+
+NoMoney:
+ mes "[Deviruchi]";
+ mes "Haven't I said 2,500,000 zeny?";
+ mes "This is the payment for Deviruchi to help you.";
+ mes "If you don't even have that money,";
+ mes "you can rot with that married life of yours... kekeke";
+ close;
} \ No newline at end of file
diff --git a/npc/other/dts_warper.txt b/npc/other/dts_warper.txt
index f7f71d9c2..6b35ee388 100644
--- a/npc/other/dts_warper.txt
+++ b/npc/other/dts_warper.txt
@@ -1,966 +1,966 @@
-//===== eAthena Script =======================================
-//= Dungeon Teleport Service
-//===== By: ==================================================
-//= Evera
-//===== Current Version: =====================================
-//= 2.3c
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Cool Event Corp NPCs vs. Kafra Dungeon Teleport Service and voting system.
-//= This is a special event on official servers where there's a
-//= big competition between Kafra Corp. and Cool Event Corp.
-//= To warp to selected levels of certain dungeons.
-//= Also includes Cool Event Corp HQ NPCs.
-//===== Variables: ===========================================
-//=Server - $dtsvote = Variable for # of votes
-//= = Positive = Cool Corp winning
-//= = Negative = Kafra Corp winning
-//= $dts = Variable for DTS status
-//= = (1<<0) Election
-//= = (1<<1) Cool Corp Enabled
-//= = (1<<2) Kafra Enabled
-//= = (1<<3) No winner last election
-//= = (1<<4) Cool Corp won last election
-//= = (1<<5) Kafra won last election
-//= $dtsday = Week count for dts vote count, used for resetting players' votes
-//=Character - dtseligible = eligibility status, 0 not eligible yet, 1 eligible.
-//= = $dtsday used when MISC_QUEST|128, and signifies that person already voted.
-//= MISC_QUEST = |128 = eligible and voted.
-//=NPC Func. - arg(0) = 0, Cool Event Corp Voting Staff; 1, Kafra Corp Voting Staff
-//= arg(1) = Kafra only, Cool Corp script does not use. Changes illus for different sprites.
-//= = 0 = 4_f_kafra6 (yellow ponytail, classic outfit, spr 112)
-//= = 1 = 4_f_kafra5 (pink hair, classic outfit, spr 113)
-//= = 2 = 4_f_kafra4 (orange short hair, classic outfit, spr 114)
-//= = 3 = 4_f_kafra3 (brown bangs, classic outfit, spr 115)
-//= = 4 = 4_f_kafra2 (brown ponytale, classic outfit, spr 116)
-//= = 5 = 4_f_kafra1 (blue hair, classic outfit, spr 117)
-//= = 6 = 4_f_agentkafra (purp hair, black outfit, spr 859)
-//= = 7 = 4_f_kafra8 (blue hair, brown outfit, spr 860)
-//= = 8 = 4_f_kafra9 (red hair, brown outfit, spr 861)
-//=Temporary - @dtstemp = Temporary buffer, used in GM vote-fixing
-//= @dtstemps$ = Temporary buffer, like above, but a string.
-//= $@dtstempg = Temporary buffer, but global
-//===== Additional Comments: =================================
-//= Some unofficial translations, some unofficial dungeon warps
-//= Also includes unofficial GM-enabled tweaking for script
-//= Includes NPCs in Cool Event Corp headquarters
-//= If new locations are found of this NPC, please report on forums
-//= http://www.eathena.ws/board/index.php?showforum=106
-//= Base level 60 required to vote
-//===== Version History: ====================================
-//= 1.0 Initial release [Evera]
-//= 1.1 SVN release, removed from major town (found true info after research),
-//= put more arg(2) parameters, fixed a few bugs [Evera]
-//= 1.2 Mushed some variables together, optimized a bit [Evera]
-//= 1.3 Removed selfconfig [Evera]
-//= 1.4 Changed global variables to read from 3 global variables, updated names,
-//= fixed array bug [Evera]
-//= 1.5 Mushed voting varialbes into 1 variable. [Evera]
-//= 1.6 Removed Duplicates [Silent]
-//= 1.7 Fixed bug of DTS_Admin not running by itself [Evera]
-//= 1.8 Changed requirement to lvl 60 [Evera]
-//= 1.9 Removed global eligibility option [Evera]
-//= 2.0 Fixed zeny bug [Evera]
-//= 2.1 Fixed headers with and updated with newer information [Evera]
-//= 2.2 Changed dtseligible 2 to MISC_QUEST|128, to clean up variable usage. [Evera]
-//= Also added F_ClearGarbage function to the scripts. [Evera]
-//= 2.3 Changed dtseligible to be $dtsday when MISC_QUEST|128
-//= Added $dtsday for vote session counter
-//= Fixed bug that involved having both warpers enabled at the same time. [Evera]
-//= New $dtsday system and bug fix[Evera]
-//= 2.3a fixed 2 bugs with comparision [Lupus]
-//= 2.3b corrected Glast warp coords [Lupus] 2.3c Bailand -> Bayalan
-//============================================================
-
-//Yuno
-yuno.gat,153,191,4 script Cool Event Voting Staff::CoolEventVotingStaff01 874,{
- callfunc "F_DTS_Warp",0,0;
-}
-yuno.gat,162,191,6 script Kafra Voting Staff#01 861,{
- callfunc "F_DTS_Warp",1,8;
-}
-//Lighthalzen
-lighthalzen.gat,154,60,6 script Cool Event Voting Staff::CoolEventVotingStaff02 874,{
- callfunc "F_DTS_Warp",0,0;
-}
-//Prontera
-prontera.gat,147,125,4 script Cool Event Voting Staff::CoolEventVotingStaff03 874,{
- callfunc "F_DTS_Warp",0,0;
-}
-prontera.gat,164,125,6 script Kafra Voting Staff#02 115,{
- callfunc "F_DTS_Warp",1,3;
-}
-
-//Cool Event Staff Headquarters NPCs
-//Kudiuu (Maintenance Guy)
-lhz_in02.gat,20,274,6 script Maintenance Guy 851,{
- mes "[Kudiuu]";
- mes "Holy...!";
- mes "Will this place";
- mes "ever get cleaned up?!";
- mes "*Cough cough* There's";
- mes "so much dust here, it's";
- mes "almost a health hazard!";
- close;
-}
-//Cesuna (Zondaman at desk)
-lhz_in02.gat,36,284,1 script Cool Event Staff#01 874,{
- mes "[Cesuna]";
- mes "Ack! I'm totally";
- mes "swamped with all this";
- mes "work! But I don't wannna";
- mes "do any of it. That's it!";
- mes "I totally need a break";
- next;
- mes "[Cesuna]";
- mes "*Sigh...*";
- mes "I wonder if Saera";
- mes "would ever consider";
- mes "going out with me?";
- mes "That would be nice~";
- close;
-}
-//Jellarin (Event planner)
-lhz_in02.gat,40,279,3 script Event Planner 833,{
- mes "[Jellarin]";
- mes "I don't like this.";
- mes "But I don't like that";
- mes "idea either. What will";
- mes "I do for a new event, eh?";
- next;
- mes "[Jellarin]";
- mes "I need something";
- mes "major, something that'll";
- mes "really shake up the world,";
- mes "something epochal, but what?";
- mes "Hey, do you have any ideas";
- close;
-}
-//Baoto (Cool Event Manager)
-lhz_in02.gat,110,283,5 script Cool Event Manager 853,{
- mes "[Baoto]";
- mes "Hmmm...";
- mes "The employees seem";
- mes "to be having too much";
- mes "fun amongst themselves";
- mes "recently. This does not";
- mes "bode well at all...";
- next;
- mes "[Baoto]";
- mes "It looks like I'm";
- mes "just going to have to";
- mes "start cracking that whip";
- mes "more often and much";
- mes "harder. Ha ha ha ha!";
- close;
-}
-//Saera (Secretary), contains GM menu
-lhz_in02.gat,36,274,3 script Cool Event Staff#02 831,{
- callfunc "F_ClearGarbage"; //Clear outdated, unused variables
- if($dts == 0){
- set $dts,$dts|(1<<0); //Sets NPCs to election mode if first time running
- set $dts,$dts|(1<<3);
- }
- if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
- if($dts&(1<<0)) set $dts,$dts&~(1<<0);
- if($dts&(1<<1)) set $dts,$dts&~(1<<1);
- if($dts&(1<<2)) set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<0);
- }
- if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- set $dts,$dts|(1<<3);
- }
- mes "[Saera]";
- mes "Welcome to the";
- mes "temporary headquarters";
- mes "of Cool Event Corporation";
- mes "How may I help you today?";
- next;
- if(getgmlevel()>=40){ //Unofficial Text, GM-configurable settings for Event (GM level above 40 required)
- mes "[Saera]";
- mes "Why, I didn't even";
- mes "notice you there,";
- mes strcharinfo(0)+". What would";
- mes "you like to do today?";
- next;
- menu "Fix Vote",Lfixvote,
- "Set current teleporter",Lsettele,
- "Set last election winner",Lsetlast,
- "Manually run vote check",Lmanuvotecheck,
- "Normal menu please",-;
- mes "[Saera]";
- mes "Ok";
- next;
- }
- menu "Temporary headquarters?",Ltemphead,
- "Voting",Lvoting,"No, thanks.",Lnothx;
-
- Ltemphead:
- mes "[Saera]";
- mes "Our headquarters building";
- mes "is currently undergoing";
- mes "reconstruction, so we are";
- mes "basing our operations in";
- mes "this place for the meantime";
- close;
-
- Lvoting:
- mes "[Saera]";
- mes "Currently, Kafra Corporation";
- mes "and Cool Event Corp are working";
- mes "on a collaborative program that";
- mes "will provide direct teleport";
- mes "services to dungeons.";
- next;
- mes "[Saera]";
- mes "Due to technical issues,";
- mes "both companies cannot provide";
- mes "teleport services to the same";
- mes "dungeon. Therefore, we will be";
- mes "selecting our valued customers";
- mes "to choose the company they want.";
- next;
- if((dtseligible == 0 || dtseligible == 3) && baselevel >= 60 && MISC_QUEST&128 == 0) set dtseligible,1;
- //Clear previous var of dtseligible,3 being tried for eligibility already
- if(dtseligible != $dtsday && baselevel >= 60 && MISC_QUEST&128){
- set MISC_QUEST,MISC_QUEST&~128;
- set dtseligible,1;
- }
- switch(dtseligible){
- default:
- mes "[Saera]";
- mes "Only a limited number of";
- mes "voters will be chosen, so";
- mes "you can check your voting";
- mes "eligibility at the headquarters";
- mes "of both participating companies.";
- mes "Thank you for your patronage~";
- close;
- break;
- case 1:
- mes "[Saera]";
- mes "It appears that you are";
- mes "eligible to vote";
- mes "so please cast your";
- mes "vote at any Voting Staff";
- mes "representative. Thank you~";
- close;
- break;
- case 2:
- mes "[Saera]";
- mes "You are eligible to vote, but";
- mes "you have already voted. Thank";
- mes "you for your participation";
- close;
- break;
- }
-
- Lnothx:
- mes "[Saera]";
- mes "Thank you.";
- mes "Have a good day.";
- close;
- //GM options start
- Lfixvote: //Fix Vote
- mes "[Saera]";
- mes "Umm, sure..";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- mes "To who would you like to give votes to?";
- next;
- menu "Kafra",-,"Cool Event Corp",Lfixcool;
-
- Lfixkafra: //Fixing vote for Kafra
- mes "[Saera]";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes."; //multiplied by -1 because var is negative
- if($dtsv == 0) mes "The vote is currently tied.";
- mes "Please input the amount you wish to give to Kafra Corp";
- input @dtstemp; //Set buffer for Kafra vote
- next;
- mes "[Saera]";
- mes "You inputted "+@dtstemp+" for Kafra";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- mes "Are you sure you would like to";
- mes "make these changes?";
- next;
- menu "Yes",-,"No",Lnothx;
- set $dtsv,$dtsv-@dtstemp; //Set buffer to Kafra vote
- mes "[Saera]";
- mes "Okay, you fixed the vote";
- mes "of Kafra Corp.";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- close;
-
- Lfixcool: //Fixing vote for cool corp
- mes "[Saera]";
- mes "Let me find the papers...";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- mes "Please input new vote for Cool Event Corp";
- input @dtstemp; //Set buffer for Cool vote
- next;
- mes "[Saera]";
- mes "You inputted "+@dtstemp+" for Cool Event Corp";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- mes "Are you sure you would like to";
- mes "make these changes?";
- next;
- menu "Yes",-,"No",Lnothx; //Confirmaiton
- set $dtsv,@dtsv+@dtstemp; //Set buffer to Cool vote
- mes "[Saera]";
- mes "Okay, you fixed the vote";
- mes "of Cool Event Corp.";
- if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
- if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
- if($dtsv == 0) mes "The vote is currently tied.";
- close;
-
- Lsettele: //Set current DTS tele
- mes "[Saera]";
- mes "Type Kafra for Kafra-enabled warp,";
- mes "Cool for Cool Event Corp-enabled";
- mes "warp ,Election for election mode,";
- mes "or Cancel to cancel.";
- if($dts&(1<<0)) mes "The election is currently in election mode.";
- if($dts&(1<<1)) mes "Cool Event Corp is currently the DTS warper.";
- if($dts&(1<<2)) mes "Kafra Corp is currently the DTS warper.";
- next;
- input @dtstemps$; //Typed in choices to prevent mistakes
- mes "Let me find the papers...";
- next;
- if(@dtstemps$ == "Election" || @dtstemps$ == "election"){
- if($dts&(1<<1)){
- set $dts,$dts&~(1<<1); //Removes previous winner
- set $dts,$dts|(1<<0); //Changes status to election
- }
- if($dts&(1<<2)){
- set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<0);
- }
- mes "[Saera]";
- mes "Set to election mode.";
- close;
- }
- if(@dtstemps$ == "Cool" || @dtstemps$ == "cool"){
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0);
- set $dts,$dts|(1<<1);
- }
- if($dts&(1<<2)){
- set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<1);
- }
- mes "[Saera]";
- mes "Cool Event Corp. is now the DTS warper.";
- close;
- }
- if(@dtstemps$ == "Kafra" || @dtstemps$ == "kafra"){
- if($dts&(1<<1)){
- set $dts,$dts&~(1<<1);
- set $dts,$dts|(1<<2);
- }
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0);
- set $dts,$dts|(1<<2);
- }
- mes "[Saera]";
- mes "Kafra Corp. is now the DTS warper.";
- close;
- }
- if(@dtstemps$ == "Cancel" || @dtstemps$ == "cancel") goto Lnothx;
- mes "[Saera]";
- mes "Please input a correct name for the election";
- next;
- goto Lsettele;
-
- Lsetlast: //Set last winner
- mes "[Saera]";
- mes "Type Kafra for election records to show Kafra,";
- mes "Cool for Cool for election records to show Cool Event Corp,";
- mes "None for no winner in election records,";
- mes "or Cancel to cancel.";
- if($dts&(1<<3)) mes "There was no previous winner";
- if($dts&(1<<4)) mes "Cool Event Corp was the last winner";
- if($dts&(1<<5)) mes "Kafra Corp was the last winner";
- next;
- input @dtstemps$;
- mes "[Saera]";
- mes "Let me find the papers...";
- next;
- if(@dtstemps$ == "None" || @dtstemps$ == "none"){
- if($dts&(1<<4)){
- set $dts,$dts&~(1<<4); //removes last winner
- set $dts,$dts|(1<<3); //sets current last winner
- }
- if($dts&(1<<5)){
- set $dts,$dts&~(1<<5);
- set $dts,$dts|(1<<3);
- }
- mes "[Saera]";
- mes "Set records to show no previous winner.";
- close;
- }
- if(@dtstemps$ == "Cool" || @dtstemps$ == "cool"){
- if($dts&(1<<3)){
- set $dts,$dts&~(1<<3);
- set $dts,$dts|(1<<4);
- }
- if($dts&(1<<5)){
- set $dts,$dts&~(1<<5);
- set $dts,$dts|(1<<4);
- }
- mes "[Saera]";
- mes "Cool Event Corp. is now the previous winner.";
- close;
- }
- if(@dtstemps$ == "Kafra" || @dtstemps$ == "kafra"){
- if($dts&(1<<3)){
- set $dts,$dts&~(1<<3);
- set $dts,$dts|(1<<5);
- }
- if($dts&(1<<4)){
- set $dts,$dts&~(1<<4);
- set $dts,$dts|(1<<5);
- }
- mes "[Saera]";
- mes "Kafra Corp. is now the previous winner.";
- close;
- }
- if(@dtstemps$ == "Cancel" || @dtstemps$ == "cancel") goto Lnothx;
- mes "[Saera]";
- mes "Please input a correct name";
- mes "for previous winner";
- next;
- goto Lsetlast;
-
- Lmanuvotecheck:
- mes "[Saera]";
- mes "Are you sure you would like to run";
- mes "the vote check again?";
- next;
- menu "Yes",Lmanuvoteyes,"No",Lnothx;
-
- Lmanuvoteyes:
- if($dtsday<4 || $dtsday>=100) set $dtsday,4;
- else set $dtsday,$dtsday+1;
- if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
- if($dts&(1<<0)) set $dts,$dts&~(1<<0);
- if($dts&(1<<1)) set $dts,$dts&~(1<<1);
- if($dts&(1<<2)) set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<0);
- }
- if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- set $dts,$dts|(1<<3);
- }
- if($dtsv == 0){
- set $@dtstemp,rand(1,2);
- if($@dtstemp == 1) set $dtsv,$dtsv+100;
- else set $dtsv,$dtsv-100;
- }
- if($dtsv > 0){
- if($dts&(1<<3)) set $dts,$dts&~(1<<3); //removes last winner varialbes
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0); //removes winner variable
- set $dts,$dts|(1<<3); //sets last winner varialbe
- set $dts,$dts|(1<<1); //sets current winner variable
- }
- if($dts&(1<<1)) set $dts,$dts|(1<<4);
- if($dts&(1<<2)){
- set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<1);
- set $dts,$dts|(1<<5);
- }
- set $dtsv,0;
- }
- else{
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0);
- set $dts,$dts|(1<<2);
- set $dts,$dts|(1<<3);
- }
- if($dts&(1<<1)){
- set $dts,$dts&~(1<<1);
- set $dts,$dts|(1<<2);
- set $dts,$dts|(1<<4);
- }
- if($dts&(1<<2)) set $dts,$dts|(1<<5);
- set $dtsv,0;
- }
- mes "[Saera]";
- mes "Vote check run again.";
- if($dts&(1<<0)) mes "The election is currently in election mode.";
- if($dts&(1<<1)) mes "Cool Event Corp is currently the DTS warper.";
- if($dts&(1<<2)) mes "Kafra Corp is currently the DTS warper.";
- close;
-}
-
-//Function for Voting Staff NPC
-function script F_DTS_Warp {
- callfunc "F_ClearGarbage"; //Clear outdated, unused variables
- if($dts == 0){ //Sets NPCs to election mode if first time running
- set $dts,$dts|(1<<0);
- set $dts,$dts|(1<<3);
- }
- if((dtseligible == 0 || dtseligible == 3) && baselevel >= 60 && MISC_QUEST&128 == 0) set dtseligible,1; //Clear previous var of dtseligible,3 being tried for eligibility already
- if(dtseligible != $dtsday && baselevel >= 60 && MISC_QUEST&128){
- set MISC_QUEST,MISC_QUEST&~128;
- set dtseligible,1;
- }
- switch(getarg(0)){
- case 0:
- cutin "zonda_01",2;
- mes "[Cool Event Corp. Voting Staff]";
- mes "Hello! Don't forget to make";
- mes "your voice be heard and make";
- mes "sure you vote in the elections";
- mes "between Cool Event Corp. and";
- mes "Kafra Corporation for control of";
- mes "the Dungeon Teleport Service!";
- break;
- case 1:
- switch(getarg(1)){
- case 0: cutin "kafra_06",2; break; //Finding arguments to find which illust to use
- case 1: cutin "kafra_05",2; break; //Used Red hair "kafra_09" for black outfit kafra
- case 2: cutin "kafra_04",2; break; //because I couldn't find a suitable illust
- case 3: cutin "kafra_03",2; break;
- case 4: cutin "kafra_02",2; break;
- case 5: cutin "kafra_01",2; break;
- case 6: cutin "kafra_09",2; break;
- case 7: cutin "kafra_08",2; break;
- case 8: cutin "kafra_09",2; break;
- default: cutin "kafra_09",2; break;
- }
- mes "[Kafra Voting Staff]";
- mes "Greetings, adventurer.";
- mes "As you may be aware, we";
- mes "are holding an election to";
- mes "provide the Dungeon Teleport";
- mes "Service. How may I help you?";
- break;
- }
- next;
- menu "Reason for Election",Lelection,"Cast a Vote",Lvote,
- "Use Teleport Service",Lteleport,"Cancel",Lcancel;
-
- Lelection: //Reason for election explanation
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]";
- mes "Cool Event Corp. has been";
- mes "planning to provide a new";
- mes "Dungeon Teleport Service to";
- mes "its customers, a service not";
- mes "already provided by the Kafra";
- mes "Corporation. However...";
- next;
- mes "[Cool Event Corp. Voting Staff]";
- mes "Kafra Corporation, which";
- mes "already monopolizes the";
- mes "public teleportation market,";
- mes "actually also had plans to";
- mes "provide a similar service.";
- next;
- mes "[Cool Event Corp. Voting Staff]";
- mes "Because of technological";
- mes "limitations, only one company";
- mes "can be chosen as the provider";
- mes "of this Dungeon Teleport Service.";
- mes "Hence, we will let the customers";
- mes "decide through these elections.";
- next;
- mes "[Cool Event Corp. Voting Staff]";
- mes "Multiple elections will be";
- mes "held so that our customers";
- mes "can test out the special services";
- mes "of each company for themselves.";
- mes "However, keep in mind that you";
- mes "must be eligible in order to vote.";
- next;
- mes "[Cool Event Corp. Voting Staff]";
- mes "For voter eligibility";
- mes "details, please visit our";
- mes "headquarters in the city of";
- mes "Lighthalzen located in the";
- mes "Schwaltzvalt Republic.";
- mes "Thank you for your time.";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "Cool Event Corp and the";
- mes "Kafra Corporation have both";
- mes "been planning to provide a";
- mes "Teleport Service to dungeons.";
- next;
- mes "[Kafra Voting Staff]";
- mes "But due to technological";
- mes "limitations, only one company";
- mes "can serve as provider for this";
- mes "Dungeon Teleport Service at a";
- mes "time. There, both companies have";
- mes "agreed to hold special elections";
- next;
- mes "[Kafra Voting Staff]";
- mes "Each company has its own";
- mes "policies and guarantees in";
- mes "regards to the Dungeon Teleport";
- mes "Service, and in this election, the";
- mes "customers will ultimately decide";
- mes "and choose what's best for them.";
- next;
- mes "[Kafra Voting Staff]";
- mes "For now, the Dungeon";
- mes "Teleport Service will be";
- mes "provided in a series of trial";
- mes "periods. This way, customers can";
- mes "see the benefits of both companies";
- mes "before making the final decision";
- next;
- mes "[Kafra Voting Staff]";
- mes "If you are qualified,";
- mes "please vote in each election";
- mes "to decide which company will";
- mes "provide the Dungeon Teleport";
- mes "Service for the next trial period.";
- mes "Thank you for your support~";
- break;
- }
- goto Lend;
-
- Lvote: //If you clicked you wanted to vote
- if(dtseligible == 1) goto Leligible; //Var check if eligible
-
- Lnoteligible: //Text displayed if wanted to vote, but not eligible/voted
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]";
- mes "I'm sorry, but you are not";
- mes "eligible to vote at this time.";
- mes "Please visit our headquarters";
- mes "in Lighthalzen for information";
- mes "related to acquiring voting";
- mes "rights. Thank you for your time.";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "Oh, I'm so sorry, but you";
- mes "are currently not qualified to";
- mes "vote. For voting qualification";
- mes "information, please visit the";
- mes "Al De Baran Kafra Headquarters.";
- mes "Thank you and have a nice day.";
- break;
- }
- goto Lend;
-
- Leligible: //Text displayed if eligible to vote
- if(MISC_QUEST&128 && $dtsday == dtseligible) goto Lnoteligible; //Var check if voted
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]"; //Unofficial text
- mes "Checking your credentials, you";
- mes "are able to vote for the";
- mes "Dungeon Teleport Service";
- mes "elections. Who would you like";
- mes "to vote for?";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "It appears that you qualify";
- mes "to vote for the Dungeon";
- mes "Teleport Service elections.";
- mes "Who would you like to vote for"; //End Unofficial text
- break;
- }
- next;
- menu "Cool Event Corp.",Lvotecool,"Kafra Corp.",Lvotekafra;
-
- Lvotecool:
- set $dtsv,$dtsv+1; //Adds 1 to cool count
- set MISC_QUEST,MISC_QUEST|128; //Sets var so that you can't vote over and over
- set dtseligible,$dtsday;
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]";
- mes "Thank you for voting for us.";
- mes "Your vote has been counted,";
- mes "and we appreciate your input";
- mes "Thank you and have a good day.";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "We thank you for your vote.";
- mes "Your opinion matters very much";
- mes "and has been counted for Cool";
- mes "Event Corp.";
- break;
- }
- goto Lend;
-
- Lvotekafra:
- setd $dtsv,$dtsv-1; //Adds 1 to kafra count
- set MISC_QUEST,MISC_QUEST|128; //Sets var to prevent cheating
- set dtseligible,$dtsday;
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]"; //Unofficial Text
- mes "Thank you for your opinion.";
- mes "Your vote for Kafra corp.";
- mes "has been counted. Thank";
- mes "you and have a good day.";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "Your vote for us has been";
- mes "counted. We thank you very";
- mes "much for your input, and";
- mes "we hope that we meet your";
- mes "adventuring needs and";
- mes "standards of excellence.";
- break;
- }
- goto Lend; //End Unofficial text
-
- Lteleport: //Selected Teleport
- switch(getarg(0)){
- case 0:
- if($dts&(1<<0)){
- mes "[Cool Event Corp. Voting Staff]";
- mes "I'm sorry, but the";
- mes "Dungeon Teleport Service is";
- mes "unavailable during elections";
- mes "and will be reactivated after the";
- mes "election results are announced.";
- mes "Thank you and have a nice day.";
- goto Lend;
- }
- if($dts&(1<<1)) goto Lteleenabled;
- mes "[Cool Event Corp. Voting Staff]"; //Text if Kafra won DTS elect.
- mes "I'm sorry, but Cool Event";
- mes "Corp. does not currently offer";
- mes "the Dungeon Teleport Service";
- mes "due to the results of the last";
- mes "election. Please vote for us";
- mes "next time, alright? Good day~";
- break;
- case 1:
- if($dts&(1<<0)){
- mes "[Kafra Voting Staff]";
- mes "Sorry, but the elections for";
- mes "which Dungeon Teleport System";
- mes "to use is currently going on";
- mes "right now. We are unable to";
- mes "vote until results are announced";
- goto Lend;
- }
- if($dts&(1<<2)) goto Lteleenabled;
- mes "[Kafra Voting Staff]";
- mes "We're sorry, but Kafra Corp";
- mes "doesn't currently offer the";
- mes "Dungeon Teleport System due";
- mes "to last election's results,";
- mes "Please vote for Kafra Corp";
- mes "next time~";
- break;
- }
- goto Lend;
-
- Lteleenabled: //Shows DTS tele selections
- cleararray @dtswarpmap$[0],"",getarraysize(@dtswarpmap$);
- cleararray @dtswarp$[0],"",getarraysize(@dtswarp$);
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]";
- mes "Please remember that we";
- mes "cannot accept Free Warp Tickets";
- mes "or award Special Reserve Points";
- mes "for this service. Now, please";
- mes "choose your destination.";
- setarray @dtswarpmap$[0],"Byalan, Level 4","Clock Tower, Basement 3";
- setarray @dtswarp$[0],@dtswarpmap$[0]+" -> 4,000z",
- @dtswarpmap$[1]+" -> 4,000z","Cancel";
- if($dts&(1<<4)){
- set @dtswarpmap$[2],"Glastheim Entrance";
- setarray @dtswarp$[2],@dtswarpmap$[2]+" -> 4,000z","Cancel";
- }
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "Thank you for choosing the";
- mes "Dungeon Teleport Service";
- mes "Please keep in mind that the";
- mes "Free Warp Tickets and Kafra";
- mes "Special Reserve Points do not";
- mes "apply in this special service.";
- setarray @dtswarpmap$[0],"Toy Factory, Level 2","Clock Tower, Level 3";
- setarray @dtswarp$[0],@dtswarpmap$[0]+" -> 4,000z",
- @dtswarpmap$[1]+" -> 4,000z","Cancel";
- if($dts&(1<<5)){
- set @dtswarpmap$[2],"Lava Dungeon, Level 2";
- setarray @dtswarp$[2],@dtswarpmap$[2]+" -> 4,000z","Cancel";
- }
- break;
- }
- next;
- switch(select(@dtswarp$[0],@dtswarp$[1],@dtswarp$[2],@dtswarp$[3])){
- case 1:
- set @num, 0;
- break;
- case 2:
- set @num, 1;
- break;
- case 3:
- set @num, 2;
- break;
- case 4:
- set @num, 3;
- break;
- }
- Lwarp:
- if (@dtswarp$[@num] == "Cancel") goto Lcancel;
- if (Zeny<4000) goto Lnomoney;
- set Zeny, Zeny-4000;
- if (@dtswarpmap$[@num] == "Toy Factory, Level 2") warp "xmas_dun02.gat",130,123;
- //Maps to warp to
- if (@dtswarpmap$[@num] == "Clock Tower, Level 3") warp "alde_dun03.gat",265,22;
-
- if (@dtswarpmap$[@num] == "Lava Dungeon, Level 2") warp "mag_dun02.gat",47,40;
-
- if (@dtswarpmap$[@num] == "Byalan, Level 4") warp "iz_dun03.gat",32,63;
-
- if (@dtswarpmap$[@num] == "Clock Tower, Basement 3") warp "alde_dun03.gat",277,178;
-
- if (@dtswarpmap$[@num] == "Glastheim Entrance") warp "glast_01.gat",370,304;
-
- cutin "", 255;
- end;
- Lnomoney:
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]"; //Unofficial Text
- mes "Umm, apparently you don't have";
- mes "adequate funds for your";
- mes "selected warp. Please check";
- mes "that you have the correct amount";
- mes "of money, and try again later";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "It appears as if you don't";
- mes "have enough zeny for the warp";
- mes "Please check your funds and";
- mes "try again.";
- break;
- }
- goto Lend; //End unofficial text
-
- Lcancel: //Selected Cancel on first menu
- switch(getarg(0)){
- case 0:
- mes "[Cool Event Corp. Voting Staff]";
- mes "Cool Event Corp. is always";
- mes "working to make sure that";
- mes "not only are our customers";
- mes "satisfied, but that we also";
- mes "exceed your utmost standards.";
- mes "Thank you and have a good day.";
- break;
- case 1:
- mes "[Kafra Voting Staff]";
- mes "We, here at Kafra Corporation,";
- mes "are alwyas endeavoring to provide";
- mes "you with the best services. We hope";
- mes "that we meet your adventuring needs";
- mes "and the standards of excellence.";
- break;
- }
- goto Lend;
- Lend:
- close2;
- cutin "", 255;
- end;
-
-}
-
-//Elections administration NPC (hidden)
-- script DTS_Admin -1,{
- OnSun0100: //Works only at 1am on sunday
- if($dtsday<4 || $dtsday>=100) set $dtsday,4;
- else set $dtsday,$dtsday+1;
- if($dts == 0){
- set $dts,$dts|(1<<0);
- set $dts,$dts|(1<<3);
- }
- if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
- if($dts&(1<<0)) set $dts,$dts&~(1<<0);
- if($dts&(1<<1)) set $dts,$dts&~(1<<1);
- if($dts&(1<<2)) set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<0);
- }
- if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- set $dts,$dts|(1<<3);
- }
- if($dtsv == 0){ //If tied, gives random side 100 votes
- set $@dtstemp,rand(1,2);
- if($@dtstemp == 1) set $dtsv,$dtsv+100;
- else set $dtsv,$dtsv-100;
- }
- if($dtsv > 0){
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0);
- set $dts,$dts|(1<<1);
- set $dts,$dts|(1<<3);
- }
- if($dts&(1<<1)) set $dts,$dts|(1<<4);
- if($dts&(1<<2)){
- set $dts,$dts&~(1<<2);
- set $dts,$dts|(1<<1);
- set $dts,$dts|(1<<5);
- }
- set $dtsv,0;
- }
- else{
- if($dts&(1<<3)) set $dts,$dts&~(1<<3);
- if($dts&(1<<4)) set $dts,$dts&~(1<<4);
- if($dts&(1<<5)) set $dts,$dts&~(1<<5);
- if($dts&(1<<0)){
- set $dts,$dts&~(1<<0);
- set $dts,$dts|(1<<2);
- set $dts,$dts|(1<<3);
- }
- if($dts&(1<<1)){
- set $dts,$dts&~(1<<1);
- set $dts,$dts|(1<<2);
- set $dts,$dts|(1<<4);
- }
- if($dts&(1<<2)) set $dts,$dts|(1<<5);
- set $dtsv,0;
- }
- end;
+//===== eAthena Script =======================================
+//= Dungeon Teleport Service
+//===== By: ==================================================
+//= Evera
+//===== Current Version: =====================================
+//= 2.3c
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Cool Event Corp NPCs vs. Kafra Dungeon Teleport Service and voting system.
+//= This is a special event on official servers where there's a
+//= big competition between Kafra Corp. and Cool Event Corp.
+//= To warp to selected levels of certain dungeons.
+//= Also includes Cool Event Corp HQ NPCs.
+//===== Variables: ===========================================
+//=Server - $dtsvote = Variable for # of votes
+//= = Positive = Cool Corp winning
+//= = Negative = Kafra Corp winning
+//= $dts = Variable for DTS status
+//= = (1<<0) Election
+//= = (1<<1) Cool Corp Enabled
+//= = (1<<2) Kafra Enabled
+//= = (1<<3) No winner last election
+//= = (1<<4) Cool Corp won last election
+//= = (1<<5) Kafra won last election
+//= $dtsday = Week count for dts vote count, used for resetting players' votes
+//=Character - dtseligible = eligibility status, 0 not eligible yet, 1 eligible.
+//= = $dtsday used when MISC_QUEST|128, and signifies that person already voted.
+//= MISC_QUEST = |128 = eligible and voted.
+//=NPC Func. - arg(0) = 0, Cool Event Corp Voting Staff; 1, Kafra Corp Voting Staff
+//= arg(1) = Kafra only, Cool Corp script does not use. Changes illus for different sprites.
+//= = 0 = 4_f_kafra6 (yellow ponytail, classic outfit, spr 112)
+//= = 1 = 4_f_kafra5 (pink hair, classic outfit, spr 113)
+//= = 2 = 4_f_kafra4 (orange short hair, classic outfit, spr 114)
+//= = 3 = 4_f_kafra3 (brown bangs, classic outfit, spr 115)
+//= = 4 = 4_f_kafra2 (brown ponytale, classic outfit, spr 116)
+//= = 5 = 4_f_kafra1 (blue hair, classic outfit, spr 117)
+//= = 6 = 4_f_agentkafra (purp hair, black outfit, spr 859)
+//= = 7 = 4_f_kafra8 (blue hair, brown outfit, spr 860)
+//= = 8 = 4_f_kafra9 (red hair, brown outfit, spr 861)
+//=Temporary - @dtstemp = Temporary buffer, used in GM vote-fixing
+//= @dtstemps$ = Temporary buffer, like above, but a string.
+//= $@dtstempg = Temporary buffer, but global
+//===== Additional Comments: =================================
+//= Some unofficial translations, some unofficial dungeon warps
+//= Also includes unofficial GM-enabled tweaking for script
+//= Includes NPCs in Cool Event Corp headquarters
+//= If new locations are found of this NPC, please report on forums
+//= http://www.eathena.ws/board/index.php?showforum=106
+//= Base level 60 required to vote
+//===== Version History: ====================================
+//= 1.0 Initial release [Evera]
+//= 1.1 SVN release, removed from major town (found true info after research),
+//= put more arg(2) parameters, fixed a few bugs [Evera]
+//= 1.2 Mushed some variables together, optimized a bit [Evera]
+//= 1.3 Removed selfconfig [Evera]
+//= 1.4 Changed global variables to read from 3 global variables, updated names,
+//= fixed array bug [Evera]
+//= 1.5 Mushed voting varialbes into 1 variable. [Evera]
+//= 1.6 Removed Duplicates [Silent]
+//= 1.7 Fixed bug of DTS_Admin not running by itself [Evera]
+//= 1.8 Changed requirement to lvl 60 [Evera]
+//= 1.9 Removed global eligibility option [Evera]
+//= 2.0 Fixed zeny bug [Evera]
+//= 2.1 Fixed headers with and updated with newer information [Evera]
+//= 2.2 Changed dtseligible 2 to MISC_QUEST|128, to clean up variable usage. [Evera]
+//= Also added F_ClearGarbage function to the scripts. [Evera]
+//= 2.3 Changed dtseligible to be $dtsday when MISC_QUEST|128
+//= Added $dtsday for vote session counter
+//= Fixed bug that involved having both warpers enabled at the same time. [Evera]
+//= New $dtsday system and bug fix[Evera]
+//= 2.3a fixed 2 bugs with comparision [Lupus]
+//= 2.3b corrected Glast warp coords [Lupus] 2.3c Bailand -> Bayalan
+//============================================================
+
+//Yuno
+yuno.gat,153,191,4 script Cool Event Voting Staff::CoolEventVotingStaff01 874,{
+ callfunc "F_DTS_Warp",0,0;
+}
+yuno.gat,162,191,6 script Kafra Voting Staff#01 861,{
+ callfunc "F_DTS_Warp",1,8;
+}
+//Lighthalzen
+lighthalzen.gat,154,60,6 script Cool Event Voting Staff::CoolEventVotingStaff02 874,{
+ callfunc "F_DTS_Warp",0,0;
+}
+//Prontera
+prontera.gat,147,125,4 script Cool Event Voting Staff::CoolEventVotingStaff03 874,{
+ callfunc "F_DTS_Warp",0,0;
+}
+prontera.gat,164,125,6 script Kafra Voting Staff#02 115,{
+ callfunc "F_DTS_Warp",1,3;
+}
+
+//Cool Event Staff Headquarters NPCs
+//Kudiuu (Maintenance Guy)
+lhz_in02.gat,20,274,6 script Maintenance Guy 851,{
+ mes "[Kudiuu]";
+ mes "Holy...!";
+ mes "Will this place";
+ mes "ever get cleaned up?!";
+ mes "*Cough cough* There's";
+ mes "so much dust here, it's";
+ mes "almost a health hazard!";
+ close;
+}
+//Cesuna (Zondaman at desk)
+lhz_in02.gat,36,284,1 script Cool Event Staff#01 874,{
+ mes "[Cesuna]";
+ mes "Ack! I'm totally";
+ mes "swamped with all this";
+ mes "work! But I don't wannna";
+ mes "do any of it. That's it!";
+ mes "I totally need a break";
+ next;
+ mes "[Cesuna]";
+ mes "*Sigh...*";
+ mes "I wonder if Saera";
+ mes "would ever consider";
+ mes "going out with me?";
+ mes "That would be nice~";
+ close;
+}
+//Jellarin (Event planner)
+lhz_in02.gat,40,279,3 script Event Planner 833,{
+ mes "[Jellarin]";
+ mes "I don't like this.";
+ mes "But I don't like that";
+ mes "idea either. What will";
+ mes "I do for a new event, eh?";
+ next;
+ mes "[Jellarin]";
+ mes "I need something";
+ mes "major, something that'll";
+ mes "really shake up the world,";
+ mes "something epochal, but what?";
+ mes "Hey, do you have any ideas";
+ close;
+}
+//Baoto (Cool Event Manager)
+lhz_in02.gat,110,283,5 script Cool Event Manager 853,{
+ mes "[Baoto]";
+ mes "Hmmm...";
+ mes "The employees seem";
+ mes "to be having too much";
+ mes "fun amongst themselves";
+ mes "recently. This does not";
+ mes "bode well at all...";
+ next;
+ mes "[Baoto]";
+ mes "It looks like I'm";
+ mes "just going to have to";
+ mes "start cracking that whip";
+ mes "more often and much";
+ mes "harder. Ha ha ha ha!";
+ close;
+}
+//Saera (Secretary), contains GM menu
+lhz_in02.gat,36,274,3 script Cool Event Staff#02 831,{
+ callfunc "F_ClearGarbage"; //Clear outdated, unused variables
+ if($dts == 0){
+ set $dts,$dts|(1<<0); //Sets NPCs to election mode if first time running
+ set $dts,$dts|(1<<3);
+ }
+ if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
+ if($dts&(1<<0)) set $dts,$dts&~(1<<0);
+ if($dts&(1<<1)) set $dts,$dts&~(1<<1);
+ if($dts&(1<<2)) set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<0);
+ }
+ if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ set $dts,$dts|(1<<3);
+ }
+ mes "[Saera]";
+ mes "Welcome to the";
+ mes "temporary headquarters";
+ mes "of Cool Event Corporation";
+ mes "How may I help you today?";
+ next;
+ if(getgmlevel()>=40){ //Unofficial Text, GM-configurable settings for Event (GM level above 40 required)
+ mes "[Saera]";
+ mes "Why, I didn't even";
+ mes "notice you there,";
+ mes strcharinfo(0)+". What would";
+ mes "you like to do today?";
+ next;
+ menu "Fix Vote",Lfixvote,
+ "Set current teleporter",Lsettele,
+ "Set last election winner",Lsetlast,
+ "Manually run vote check",Lmanuvotecheck,
+ "Normal menu please",-;
+ mes "[Saera]";
+ mes "Ok";
+ next;
+ }
+ menu "Temporary headquarters?",Ltemphead,
+ "Voting",Lvoting,"No, thanks.",Lnothx;
+
+ Ltemphead:
+ mes "[Saera]";
+ mes "Our headquarters building";
+ mes "is currently undergoing";
+ mes "reconstruction, so we are";
+ mes "basing our operations in";
+ mes "this place for the meantime";
+ close;
+
+ Lvoting:
+ mes "[Saera]";
+ mes "Currently, Kafra Corporation";
+ mes "and Cool Event Corp are working";
+ mes "on a collaborative program that";
+ mes "will provide direct teleport";
+ mes "services to dungeons.";
+ next;
+ mes "[Saera]";
+ mes "Due to technical issues,";
+ mes "both companies cannot provide";
+ mes "teleport services to the same";
+ mes "dungeon. Therefore, we will be";
+ mes "selecting our valued customers";
+ mes "to choose the company they want.";
+ next;
+ if((dtseligible == 0 || dtseligible == 3) && baselevel >= 60 && MISC_QUEST&128 == 0) set dtseligible,1;
+ //Clear previous var of dtseligible,3 being tried for eligibility already
+ if(dtseligible != $dtsday && baselevel >= 60 && MISC_QUEST&128){
+ set MISC_QUEST,MISC_QUEST&~128;
+ set dtseligible,1;
+ }
+ switch(dtseligible){
+ default:
+ mes "[Saera]";
+ mes "Only a limited number of";
+ mes "voters will be chosen, so";
+ mes "you can check your voting";
+ mes "eligibility at the headquarters";
+ mes "of both participating companies.";
+ mes "Thank you for your patronage~";
+ close;
+ break;
+ case 1:
+ mes "[Saera]";
+ mes "It appears that you are";
+ mes "eligible to vote";
+ mes "so please cast your";
+ mes "vote at any Voting Staff";
+ mes "representative. Thank you~";
+ close;
+ break;
+ case 2:
+ mes "[Saera]";
+ mes "You are eligible to vote, but";
+ mes "you have already voted. Thank";
+ mes "you for your participation";
+ close;
+ break;
+ }
+
+ Lnothx:
+ mes "[Saera]";
+ mes "Thank you.";
+ mes "Have a good day.";
+ close;
+ //GM options start
+ Lfixvote: //Fix Vote
+ mes "[Saera]";
+ mes "Umm, sure..";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ mes "To who would you like to give votes to?";
+ next;
+ menu "Kafra",-,"Cool Event Corp",Lfixcool;
+
+ Lfixkafra: //Fixing vote for Kafra
+ mes "[Saera]";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes."; //multiplied by -1 because var is negative
+ if($dtsv == 0) mes "The vote is currently tied.";
+ mes "Please input the amount you wish to give to Kafra Corp";
+ input @dtstemp; //Set buffer for Kafra vote
+ next;
+ mes "[Saera]";
+ mes "You inputted "+@dtstemp+" for Kafra";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ mes "Are you sure you would like to";
+ mes "make these changes?";
+ next;
+ menu "Yes",-,"No",Lnothx;
+ set $dtsv,$dtsv-@dtstemp; //Set buffer to Kafra vote
+ mes "[Saera]";
+ mes "Okay, you fixed the vote";
+ mes "of Kafra Corp.";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ close;
+
+ Lfixcool: //Fixing vote for cool corp
+ mes "[Saera]";
+ mes "Let me find the papers...";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ mes "Please input new vote for Cool Event Corp";
+ input @dtstemp; //Set buffer for Cool vote
+ next;
+ mes "[Saera]";
+ mes "You inputted "+@dtstemp+" for Cool Event Corp";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ mes "Are you sure you would like to";
+ mes "make these changes?";
+ next;
+ menu "Yes",-,"No",Lnothx; //Confirmaiton
+ set $dtsv,@dtsv+@dtstemp; //Set buffer to Cool vote
+ mes "[Saera]";
+ mes "Okay, you fixed the vote";
+ mes "of Cool Event Corp.";
+ if($dtsv > 0) mes "Cool Event Corp is currently winning by "+$dtsv+" votes.";
+ if($dtsv < 0) mes "Kafra Corp is currently winning by "+$dtsv*-1+" votes.";
+ if($dtsv == 0) mes "The vote is currently tied.";
+ close;
+
+ Lsettele: //Set current DTS tele
+ mes "[Saera]";
+ mes "Type Kafra for Kafra-enabled warp,";
+ mes "Cool for Cool Event Corp-enabled";
+ mes "warp ,Election for election mode,";
+ mes "or Cancel to cancel.";
+ if($dts&(1<<0)) mes "The election is currently in election mode.";
+ if($dts&(1<<1)) mes "Cool Event Corp is currently the DTS warper.";
+ if($dts&(1<<2)) mes "Kafra Corp is currently the DTS warper.";
+ next;
+ input @dtstemps$; //Typed in choices to prevent mistakes
+ mes "Let me find the papers...";
+ next;
+ if(@dtstemps$ == "Election" || @dtstemps$ == "election"){
+ if($dts&(1<<1)){
+ set $dts,$dts&~(1<<1); //Removes previous winner
+ set $dts,$dts|(1<<0); //Changes status to election
+ }
+ if($dts&(1<<2)){
+ set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<0);
+ }
+ mes "[Saera]";
+ mes "Set to election mode.";
+ close;
+ }
+ if(@dtstemps$ == "Cool" || @dtstemps$ == "cool"){
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0);
+ set $dts,$dts|(1<<1);
+ }
+ if($dts&(1<<2)){
+ set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<1);
+ }
+ mes "[Saera]";
+ mes "Cool Event Corp. is now the DTS warper.";
+ close;
+ }
+ if(@dtstemps$ == "Kafra" || @dtstemps$ == "kafra"){
+ if($dts&(1<<1)){
+ set $dts,$dts&~(1<<1);
+ set $dts,$dts|(1<<2);
+ }
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0);
+ set $dts,$dts|(1<<2);
+ }
+ mes "[Saera]";
+ mes "Kafra Corp. is now the DTS warper.";
+ close;
+ }
+ if(@dtstemps$ == "Cancel" || @dtstemps$ == "cancel") goto Lnothx;
+ mes "[Saera]";
+ mes "Please input a correct name for the election";
+ next;
+ goto Lsettele;
+
+ Lsetlast: //Set last winner
+ mes "[Saera]";
+ mes "Type Kafra for election records to show Kafra,";
+ mes "Cool for Cool for election records to show Cool Event Corp,";
+ mes "None for no winner in election records,";
+ mes "or Cancel to cancel.";
+ if($dts&(1<<3)) mes "There was no previous winner";
+ if($dts&(1<<4)) mes "Cool Event Corp was the last winner";
+ if($dts&(1<<5)) mes "Kafra Corp was the last winner";
+ next;
+ input @dtstemps$;
+ mes "[Saera]";
+ mes "Let me find the papers...";
+ next;
+ if(@dtstemps$ == "None" || @dtstemps$ == "none"){
+ if($dts&(1<<4)){
+ set $dts,$dts&~(1<<4); //removes last winner
+ set $dts,$dts|(1<<3); //sets current last winner
+ }
+ if($dts&(1<<5)){
+ set $dts,$dts&~(1<<5);
+ set $dts,$dts|(1<<3);
+ }
+ mes "[Saera]";
+ mes "Set records to show no previous winner.";
+ close;
+ }
+ if(@dtstemps$ == "Cool" || @dtstemps$ == "cool"){
+ if($dts&(1<<3)){
+ set $dts,$dts&~(1<<3);
+ set $dts,$dts|(1<<4);
+ }
+ if($dts&(1<<5)){
+ set $dts,$dts&~(1<<5);
+ set $dts,$dts|(1<<4);
+ }
+ mes "[Saera]";
+ mes "Cool Event Corp. is now the previous winner.";
+ close;
+ }
+ if(@dtstemps$ == "Kafra" || @dtstemps$ == "kafra"){
+ if($dts&(1<<3)){
+ set $dts,$dts&~(1<<3);
+ set $dts,$dts|(1<<5);
+ }
+ if($dts&(1<<4)){
+ set $dts,$dts&~(1<<4);
+ set $dts,$dts|(1<<5);
+ }
+ mes "[Saera]";
+ mes "Kafra Corp. is now the previous winner.";
+ close;
+ }
+ if(@dtstemps$ == "Cancel" || @dtstemps$ == "cancel") goto Lnothx;
+ mes "[Saera]";
+ mes "Please input a correct name";
+ mes "for previous winner";
+ next;
+ goto Lsetlast;
+
+ Lmanuvotecheck:
+ mes "[Saera]";
+ mes "Are you sure you would like to run";
+ mes "the vote check again?";
+ next;
+ menu "Yes",Lmanuvoteyes,"No",Lnothx;
+
+ Lmanuvoteyes:
+ if($dtsday<4 || $dtsday>=100) set $dtsday,4;
+ else set $dtsday,$dtsday+1;
+ if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
+ if($dts&(1<<0)) set $dts,$dts&~(1<<0);
+ if($dts&(1<<1)) set $dts,$dts&~(1<<1);
+ if($dts&(1<<2)) set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<0);
+ }
+ if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ set $dts,$dts|(1<<3);
+ }
+ if($dtsv == 0){
+ set $@dtstemp,rand(1,2);
+ if($@dtstemp == 1) set $dtsv,$dtsv+100;
+ else set $dtsv,$dtsv-100;
+ }
+ if($dtsv > 0){
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3); //removes last winner varialbes
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0); //removes winner variable
+ set $dts,$dts|(1<<3); //sets last winner varialbe
+ set $dts,$dts|(1<<1); //sets current winner variable
+ }
+ if($dts&(1<<1)) set $dts,$dts|(1<<4);
+ if($dts&(1<<2)){
+ set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<1);
+ set $dts,$dts|(1<<5);
+ }
+ set $dtsv,0;
+ }
+ else{
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0);
+ set $dts,$dts|(1<<2);
+ set $dts,$dts|(1<<3);
+ }
+ if($dts&(1<<1)){
+ set $dts,$dts&~(1<<1);
+ set $dts,$dts|(1<<2);
+ set $dts,$dts|(1<<4);
+ }
+ if($dts&(1<<2)) set $dts,$dts|(1<<5);
+ set $dtsv,0;
+ }
+ mes "[Saera]";
+ mes "Vote check run again.";
+ if($dts&(1<<0)) mes "The election is currently in election mode.";
+ if($dts&(1<<1)) mes "Cool Event Corp is currently the DTS warper.";
+ if($dts&(1<<2)) mes "Kafra Corp is currently the DTS warper.";
+ close;
+}
+
+//Function for Voting Staff NPC
+function script F_DTS_Warp {
+ callfunc "F_ClearGarbage"; //Clear outdated, unused variables
+ if($dts == 0){ //Sets NPCs to election mode if first time running
+ set $dts,$dts|(1<<0);
+ set $dts,$dts|(1<<3);
+ }
+ if((dtseligible == 0 || dtseligible == 3) && baselevel >= 60 && MISC_QUEST&128 == 0) set dtseligible,1; //Clear previous var of dtseligible,3 being tried for eligibility already
+ if(dtseligible != $dtsday && baselevel >= 60 && MISC_QUEST&128){
+ set MISC_QUEST,MISC_QUEST&~128;
+ set dtseligible,1;
+ }
+ switch(getarg(0)){
+ case 0:
+ cutin "zonda_01",2;
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Hello! Don't forget to make";
+ mes "your voice be heard and make";
+ mes "sure you vote in the elections";
+ mes "between Cool Event Corp. and";
+ mes "Kafra Corporation for control of";
+ mes "the Dungeon Teleport Service!";
+ break;
+ case 1:
+ switch(getarg(1)){
+ case 0: cutin "kafra_06",2; break; //Finding arguments to find which illust to use
+ case 1: cutin "kafra_05",2; break; //Used Red hair "kafra_09" for black outfit kafra
+ case 2: cutin "kafra_04",2; break; //because I couldn't find a suitable illust
+ case 3: cutin "kafra_03",2; break;
+ case 4: cutin "kafra_02",2; break;
+ case 5: cutin "kafra_01",2; break;
+ case 6: cutin "kafra_09",2; break;
+ case 7: cutin "kafra_08",2; break;
+ case 8: cutin "kafra_09",2; break;
+ default: cutin "kafra_09",2; break;
+ }
+ mes "[Kafra Voting Staff]";
+ mes "Greetings, adventurer.";
+ mes "As you may be aware, we";
+ mes "are holding an election to";
+ mes "provide the Dungeon Teleport";
+ mes "Service. How may I help you?";
+ break;
+ }
+ next;
+ menu "Reason for Election",Lelection,"Cast a Vote",Lvote,
+ "Use Teleport Service",Lteleport,"Cancel",Lcancel;
+
+ Lelection: //Reason for election explanation
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Cool Event Corp. has been";
+ mes "planning to provide a new";
+ mes "Dungeon Teleport Service to";
+ mes "its customers, a service not";
+ mes "already provided by the Kafra";
+ mes "Corporation. However...";
+ next;
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Kafra Corporation, which";
+ mes "already monopolizes the";
+ mes "public teleportation market,";
+ mes "actually also had plans to";
+ mes "provide a similar service.";
+ next;
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Because of technological";
+ mes "limitations, only one company";
+ mes "can be chosen as the provider";
+ mes "of this Dungeon Teleport Service.";
+ mes "Hence, we will let the customers";
+ mes "decide through these elections.";
+ next;
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Multiple elections will be";
+ mes "held so that our customers";
+ mes "can test out the special services";
+ mes "of each company for themselves.";
+ mes "However, keep in mind that you";
+ mes "must be eligible in order to vote.";
+ next;
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "For voter eligibility";
+ mes "details, please visit our";
+ mes "headquarters in the city of";
+ mes "Lighthalzen located in the";
+ mes "Schwaltzvalt Republic.";
+ mes "Thank you for your time.";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "Cool Event Corp and the";
+ mes "Kafra Corporation have both";
+ mes "been planning to provide a";
+ mes "Teleport Service to dungeons.";
+ next;
+ mes "[Kafra Voting Staff]";
+ mes "But due to technological";
+ mes "limitations, only one company";
+ mes "can serve as provider for this";
+ mes "Dungeon Teleport Service at a";
+ mes "time. There, both companies have";
+ mes "agreed to hold special elections";
+ next;
+ mes "[Kafra Voting Staff]";
+ mes "Each company has its own";
+ mes "policies and guarantees in";
+ mes "regards to the Dungeon Teleport";
+ mes "Service, and in this election, the";
+ mes "customers will ultimately decide";
+ mes "and choose what's best for them.";
+ next;
+ mes "[Kafra Voting Staff]";
+ mes "For now, the Dungeon";
+ mes "Teleport Service will be";
+ mes "provided in a series of trial";
+ mes "periods. This way, customers can";
+ mes "see the benefits of both companies";
+ mes "before making the final decision";
+ next;
+ mes "[Kafra Voting Staff]";
+ mes "If you are qualified,";
+ mes "please vote in each election";
+ mes "to decide which company will";
+ mes "provide the Dungeon Teleport";
+ mes "Service for the next trial period.";
+ mes "Thank you for your support~";
+ break;
+ }
+ goto Lend;
+
+ Lvote: //If you clicked you wanted to vote
+ if(dtseligible == 1) goto Leligible; //Var check if eligible
+
+ Lnoteligible: //Text displayed if wanted to vote, but not eligible/voted
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "I'm sorry, but you are not";
+ mes "eligible to vote at this time.";
+ mes "Please visit our headquarters";
+ mes "in Lighthalzen for information";
+ mes "related to acquiring voting";
+ mes "rights. Thank you for your time.";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "Oh, I'm so sorry, but you";
+ mes "are currently not qualified to";
+ mes "vote. For voting qualification";
+ mes "information, please visit the";
+ mes "Al De Baran Kafra Headquarters.";
+ mes "Thank you and have a nice day.";
+ break;
+ }
+ goto Lend;
+
+ Leligible: //Text displayed if eligible to vote
+ if(MISC_QUEST&128 && $dtsday == dtseligible) goto Lnoteligible; //Var check if voted
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]"; //Unofficial text
+ mes "Checking your credentials, you";
+ mes "are able to vote for the";
+ mes "Dungeon Teleport Service";
+ mes "elections. Who would you like";
+ mes "to vote for?";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "It appears that you qualify";
+ mes "to vote for the Dungeon";
+ mes "Teleport Service elections.";
+ mes "Who would you like to vote for"; //End Unofficial text
+ break;
+ }
+ next;
+ menu "Cool Event Corp.",Lvotecool,"Kafra Corp.",Lvotekafra;
+
+ Lvotecool:
+ set $dtsv,$dtsv+1; //Adds 1 to cool count
+ set MISC_QUEST,MISC_QUEST|128; //Sets var so that you can't vote over and over
+ set dtseligible,$dtsday;
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Thank you for voting for us.";
+ mes "Your vote has been counted,";
+ mes "and we appreciate your input";
+ mes "Thank you and have a good day.";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "We thank you for your vote.";
+ mes "Your opinion matters very much";
+ mes "and has been counted for Cool";
+ mes "Event Corp.";
+ break;
+ }
+ goto Lend;
+
+ Lvotekafra:
+ setd $dtsv,$dtsv-1; //Adds 1 to kafra count
+ set MISC_QUEST,MISC_QUEST|128; //Sets var to prevent cheating
+ set dtseligible,$dtsday;
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]"; //Unofficial Text
+ mes "Thank you for your opinion.";
+ mes "Your vote for Kafra corp.";
+ mes "has been counted. Thank";
+ mes "you and have a good day.";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "Your vote for us has been";
+ mes "counted. We thank you very";
+ mes "much for your input, and";
+ mes "we hope that we meet your";
+ mes "adventuring needs and";
+ mes "standards of excellence.";
+ break;
+ }
+ goto Lend; //End Unofficial text
+
+ Lteleport: //Selected Teleport
+ switch(getarg(0)){
+ case 0:
+ if($dts&(1<<0)){
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "I'm sorry, but the";
+ mes "Dungeon Teleport Service is";
+ mes "unavailable during elections";
+ mes "and will be reactivated after the";
+ mes "election results are announced.";
+ mes "Thank you and have a nice day.";
+ goto Lend;
+ }
+ if($dts&(1<<1)) goto Lteleenabled;
+ mes "[Cool Event Corp. Voting Staff]"; //Text if Kafra won DTS elect.
+ mes "I'm sorry, but Cool Event";
+ mes "Corp. does not currently offer";
+ mes "the Dungeon Teleport Service";
+ mes "due to the results of the last";
+ mes "election. Please vote for us";
+ mes "next time, alright? Good day~";
+ break;
+ case 1:
+ if($dts&(1<<0)){
+ mes "[Kafra Voting Staff]";
+ mes "Sorry, but the elections for";
+ mes "which Dungeon Teleport System";
+ mes "to use is currently going on";
+ mes "right now. We are unable to";
+ mes "vote until results are announced";
+ goto Lend;
+ }
+ if($dts&(1<<2)) goto Lteleenabled;
+ mes "[Kafra Voting Staff]";
+ mes "We're sorry, but Kafra Corp";
+ mes "doesn't currently offer the";
+ mes "Dungeon Teleport System due";
+ mes "to last election's results,";
+ mes "Please vote for Kafra Corp";
+ mes "next time~";
+ break;
+ }
+ goto Lend;
+
+ Lteleenabled: //Shows DTS tele selections
+ cleararray @dtswarpmap$[0],"",getarraysize(@dtswarpmap$);
+ cleararray @dtswarp$[0],"",getarraysize(@dtswarp$);
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Please remember that we";
+ mes "cannot accept Free Warp Tickets";
+ mes "or award Special Reserve Points";
+ mes "for this service. Now, please";
+ mes "choose your destination.";
+ setarray @dtswarpmap$[0],"Byalan, Level 4","Clock Tower, Basement 3";
+ setarray @dtswarp$[0],@dtswarpmap$[0]+" -> 4,000z",
+ @dtswarpmap$[1]+" -> 4,000z","Cancel";
+ if($dts&(1<<4)){
+ set @dtswarpmap$[2],"Glastheim Entrance";
+ setarray @dtswarp$[2],@dtswarpmap$[2]+" -> 4,000z","Cancel";
+ }
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "Thank you for choosing the";
+ mes "Dungeon Teleport Service";
+ mes "Please keep in mind that the";
+ mes "Free Warp Tickets and Kafra";
+ mes "Special Reserve Points do not";
+ mes "apply in this special service.";
+ setarray @dtswarpmap$[0],"Toy Factory, Level 2","Clock Tower, Level 3";
+ setarray @dtswarp$[0],@dtswarpmap$[0]+" -> 4,000z",
+ @dtswarpmap$[1]+" -> 4,000z","Cancel";
+ if($dts&(1<<5)){
+ set @dtswarpmap$[2],"Lava Dungeon, Level 2";
+ setarray @dtswarp$[2],@dtswarpmap$[2]+" -> 4,000z","Cancel";
+ }
+ break;
+ }
+ next;
+ switch(select(@dtswarp$[0],@dtswarp$[1],@dtswarp$[2],@dtswarp$[3])){
+ case 1:
+ set @num, 0;
+ break;
+ case 2:
+ set @num, 1;
+ break;
+ case 3:
+ set @num, 2;
+ break;
+ case 4:
+ set @num, 3;
+ break;
+ }
+ Lwarp:
+ if (@dtswarp$[@num] == "Cancel") goto Lcancel;
+ if (Zeny<4000) goto Lnomoney;
+ set Zeny, Zeny-4000;
+ if (@dtswarpmap$[@num] == "Toy Factory, Level 2") warp "xmas_dun02.gat",130,123;
+ //Maps to warp to
+ if (@dtswarpmap$[@num] == "Clock Tower, Level 3") warp "alde_dun03.gat",265,22;
+
+ if (@dtswarpmap$[@num] == "Lava Dungeon, Level 2") warp "mag_dun02.gat",47,40;
+
+ if (@dtswarpmap$[@num] == "Byalan, Level 4") warp "iz_dun03.gat",32,63;
+
+ if (@dtswarpmap$[@num] == "Clock Tower, Basement 3") warp "alde_dun03.gat",277,178;
+
+ if (@dtswarpmap$[@num] == "Glastheim Entrance") warp "glast_01.gat",370,304;
+
+ cutin "", 255;
+ end;
+ Lnomoney:
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]"; //Unofficial Text
+ mes "Umm, apparently you don't have";
+ mes "adequate funds for your";
+ mes "selected warp. Please check";
+ mes "that you have the correct amount";
+ mes "of money, and try again later";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "It appears as if you don't";
+ mes "have enough zeny for the warp";
+ mes "Please check your funds and";
+ mes "try again.";
+ break;
+ }
+ goto Lend; //End unofficial text
+
+ Lcancel: //Selected Cancel on first menu
+ switch(getarg(0)){
+ case 0:
+ mes "[Cool Event Corp. Voting Staff]";
+ mes "Cool Event Corp. is always";
+ mes "working to make sure that";
+ mes "not only are our customers";
+ mes "satisfied, but that we also";
+ mes "exceed your utmost standards.";
+ mes "Thank you and have a good day.";
+ break;
+ case 1:
+ mes "[Kafra Voting Staff]";
+ mes "We, here at Kafra Corporation,";
+ mes "are alwyas endeavoring to provide";
+ mes "you with the best services. We hope";
+ mes "that we meet your adventuring needs";
+ mes "and the standards of excellence.";
+ break;
+ }
+ goto Lend;
+ Lend:
+ close2;
+ cutin "", 255;
+ end;
+
+}
+
+//Elections administration NPC (hidden)
+- script DTS_Admin -1,{
+ OnSun0100: //Works only at 1am on sunday
+ if($dtsday<4 || $dtsday>=100) set $dtsday,4;
+ else set $dtsday,$dtsday+1;
+ if($dts == 0){
+ set $dts,$dts|(1<<0);
+ set $dts,$dts|(1<<3);
+ }
+ if($dts&(1<<1) && $dts&(1<<2) || $dts&(1<<0) && $dts&(1<<1) || $dts&(1<<0) && $dts&(1<<2)){
+ if($dts&(1<<0)) set $dts,$dts&~(1<<0);
+ if($dts&(1<<1)) set $dts,$dts&~(1<<1);
+ if($dts&(1<<2)) set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<0);
+ }
+ if($dts&(1<<4) && $dts&(1<<5) || $dts&(1<<3) && $dts&(1<<4) || $dts&(1<<3) && $dts&(1<<5)){
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ set $dts,$dts|(1<<3);
+ }
+ if($dtsv == 0){ //If tied, gives random side 100 votes
+ set $@dtstemp,rand(1,2);
+ if($@dtstemp == 1) set $dtsv,$dtsv+100;
+ else set $dtsv,$dtsv-100;
+ }
+ if($dtsv > 0){
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0);
+ set $dts,$dts|(1<<1);
+ set $dts,$dts|(1<<3);
+ }
+ if($dts&(1<<1)) set $dts,$dts|(1<<4);
+ if($dts&(1<<2)){
+ set $dts,$dts&~(1<<2);
+ set $dts,$dts|(1<<1);
+ set $dts,$dts|(1<<5);
+ }
+ set $dtsv,0;
+ }
+ else{
+ if($dts&(1<<3)) set $dts,$dts&~(1<<3);
+ if($dts&(1<<4)) set $dts,$dts&~(1<<4);
+ if($dts&(1<<5)) set $dts,$dts&~(1<<5);
+ if($dts&(1<<0)){
+ set $dts,$dts&~(1<<0);
+ set $dts,$dts|(1<<2);
+ set $dts,$dts|(1<<3);
+ }
+ if($dts&(1<<1)){
+ set $dts,$dts&~(1<<1);
+ set $dts,$dts|(1<<2);
+ set $dts,$dts|(1<<4);
+ }
+ if($dts&(1<<2)) set $dts,$dts|(1<<5);
+ set $dtsv,0;
+ }
+ end;
} \ No newline at end of file
diff --git a/npc/other/lighthalzen_auction.txt b/npc/other/lighthalzen_auction.txt
index 8d8ae9121..1d0f0265b 100644
--- a/npc/other/lighthalzen_auction.txt
+++ b/npc/other/lighthalzen_auction.txt
@@ -1,59 +1,59 @@
-//===== eAthena Script =======================================
-//= Auction NPC
-//===== By: ==================================================
-//= Au{R}o
-//===== Current Version: =====================================
-//= 1.01
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Auction System
-//===== Additional Comments: =================================
-//= Converted from Aegis
-//= 1.0 Add NPC dialogue (FACING PROBABLY INCORRECT) [Au{R}oN]
-//============================================================
-
-//=======================WARPER===============================
-lighthalzen.gat,205,169,4 script Auction Guide 833,{
-
- mes "[Auction Guide]";
- mes "Trying to go to the acution";
- next;
- menu "Yes.",WA_yes,"No.",WA_no;
-WA_yes:
- mes "[Auction Guide]";
- mes "Have a good trip~";
- close2;
- warp "auction_02.gat",43,24;
- end;
-
-WA_no:
- mes "[Auction Guide]";
- MES "Come visit next time.";
- close;
-}
-
-//=======================AUCTION NPC==========================
-auction_02.gat,31,46,9 script Auction Supervisor::as1 874,{
-
- mes "[Auctioner]";
- mes "Welcome.";
- mes "Is there an item that you're";
- mes "looking for...?";
- next;
- menu "Yes.",AU_yes,"No.",AU_no;
-AU_yes:
- //NEED TO ADD THE COMMAND FOR OPEN AUCTION WINDOW!!
- mes "Sorry, but at the moment the auction system is in development";//CUSTOM MSG!!
- close;
-
-AU_no:
- mes "[Auctioner]";
- mes "Okay then..";
- close;
-}
-auction_02.gat,43,65,2 duplicate(as1) Auction Supervisor::asd1 874
-auction_02.gat,56,46,2 duplicate(as1) Auction Supervisor::asd2 874
-
-//=======================WARP=================================
+//===== eAthena Script =======================================
+//= Auction NPC
+//===== By: ==================================================
+//= Au{R}o
+//===== Current Version: =====================================
+//= 1.01
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Auction System
+//===== Additional Comments: =================================
+//= Converted from Aegis
+//= 1.0 Add NPC dialogue (FACING PROBABLY INCORRECT) [Au{R}oN]
+//============================================================
+
+//=======================WARPER===============================
+lighthalzen.gat,205,169,4 script Auction Guide 833,{
+
+ mes "[Auction Guide]";
+ mes "Trying to go to the acution";
+ next;
+ menu "Yes.",WA_yes,"No.",WA_no;
+WA_yes:
+ mes "[Auction Guide]";
+ mes "Have a good trip~";
+ close2;
+ warp "auction_02.gat",43,24;
+ end;
+
+WA_no:
+ mes "[Auction Guide]";
+ MES "Come visit next time.";
+ close;
+}
+
+//=======================AUCTION NPC==========================
+auction_02.gat,31,46,9 script Auction Supervisor::as1 874,{
+
+ mes "[Auctioner]";
+ mes "Welcome.";
+ mes "Is there an item that you're";
+ mes "looking for...?";
+ next;
+ menu "Yes.",AU_yes,"No.",AU_no;
+AU_yes:
+ //NEED TO ADD THE COMMAND FOR OPEN AUCTION WINDOW!!
+ mes "Sorry, but at the moment the auction system is in development";//CUSTOM MSG!!
+ close;
+
+AU_no:
+ mes "[Auctioner]";
+ mes "Okay then..";
+ close;
+}
+auction_02.gat,43,65,2 duplicate(as1) Auction Supervisor::asd1 874
+auction_02.gat,56,46,2 duplicate(as1) Auction Supervisor::asd2 874
+
+//=======================WARP=================================
auction_02.gat,43,17,0 warp auc_light01 1,1,lighthalzen.gat,209,169 \ No newline at end of file
diff --git a/npc/other/lighthalzen_bank.txt b/npc/other/lighthalzen_bank.txt
index 8dba963c6..a705eec5c 100644
--- a/npc/other/lighthalzen_bank.txt
+++ b/npc/other/lighthalzen_bank.txt
@@ -1,83 +1,83 @@
-//===== eAthena Script ========================================
-//= Lighthalzen Bank Area
-//===== By: ==================================================
-//= Au{R}oN (Translate by Alan)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Lighthalzen Bank
-//===== Additional Comments: =================================
-//= Converted from Aegis
-//= 1.0 Add all Bank NPC (TEMPORARY NAME and FACING PROBABLY INCORRECT) [Au{R}oN]
-//= 1.1 Add correct name, and change some dialogue. [Au{R}oN]
-//============================================================
-
-lhz_in02.gat,34,41,7 script Arthur 849,{
-
- mes "[Arthur]";
- mes "The chairs here are";
- mes "so not ergonomic. And";
- mes "they're uncomfortable too!";
- mes "But it's sooo cool inside this";
- mes "bank and I just wanted to get";
- mes "get away from all this heat...";
- close;
-}
-
-lhz_in02.gat,28,39,3 script Helen 703,{
-
- mes "[Helen]";
- mes "You know, maybe when";
- mes "I grow up, i'll be a bank";
- mes "clerk. That sounds liek a";
- mes "really nice jobm, don't you";
- mes "think? It's laid back and posh...";
- close;
-}
-
-lhz_in02.gat,31,34,3 script Tadem 847,{
-
- mes "[Tadem]";
- mes "I do so enjoy the";
- mes "architectural structure";
- mes "of this bank. It's quite";
- mes "artistic with both classical";
- mes "and modern elements. Would";
- mes "you not agree? Fascinating";
- close;
-}
-
-lhz_in02.gat,31,33,3 script Gracie 863,{
-
- mes "[Gracie]";
- mes "Oh, it's so comfortable";
- mes "in there~Though, why are";
- mes "we inside the bank when";
- mes "the bank services aren't even";
- mes "working? Yes, we're standing,";
- mes "but we're doing it in comfort";
- next;
- mes "[Gracie]";
- mes "In fact, it's so";
- mes "comfortable here,";
- mes "I think I'll refuse to leave.";
- mes "Though, I'm willing to change";
- mes "my mind if you can find a place";
- mes "that's even more comfortable.";
- close;
-}
-
-lhz_in02.gat,34,22,8 script Bank Clerk::1_st 755,{
-
- mes "[Bank Clerk]";
- mes "Due to some critical system";
- mes "errors, all of the bank services";
- mes "have been temporarily stopped.";
- mes "We apologize for any inconvenience.";
- mes "and appreciate your understanding.";
- close;
-}
-lhz_in02.gat,21,25,9 duplicate(1_st) Bank Clerk::2_nd 86
+//===== eAthena Script ========================================
+//= Lighthalzen Bank Area
+//===== By: ==================================================
+//= Au{R}oN (Translate by Alan)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Lighthalzen Bank
+//===== Additional Comments: =================================
+//= Converted from Aegis
+//= 1.0 Add all Bank NPC (TEMPORARY NAME and FACING PROBABLY INCORRECT) [Au{R}oN]
+//= 1.1 Add correct name, and change some dialogue. [Au{R}oN]
+//============================================================
+
+lhz_in02.gat,34,41,7 script Arthur 849,{
+
+ mes "[Arthur]";
+ mes "The chairs here are";
+ mes "so not ergonomic. And";
+ mes "they're uncomfortable too!";
+ mes "But it's sooo cool inside this";
+ mes "bank and I just wanted to get";
+ mes "get away from all this heat...";
+ close;
+}
+
+lhz_in02.gat,28,39,3 script Helen 703,{
+
+ mes "[Helen]";
+ mes "You know, maybe when";
+ mes "I grow up, i'll be a bank";
+ mes "clerk. That sounds liek a";
+ mes "really nice jobm, don't you";
+ mes "think? It's laid back and posh...";
+ close;
+}
+
+lhz_in02.gat,31,34,3 script Tadem 847,{
+
+ mes "[Tadem]";
+ mes "I do so enjoy the";
+ mes "architectural structure";
+ mes "of this bank. It's quite";
+ mes "artistic with both classical";
+ mes "and modern elements. Would";
+ mes "you not agree? Fascinating";
+ close;
+}
+
+lhz_in02.gat,31,33,3 script Gracie 863,{
+
+ mes "[Gracie]";
+ mes "Oh, it's so comfortable";
+ mes "in there~Though, why are";
+ mes "we inside the bank when";
+ mes "the bank services aren't even";
+ mes "working? Yes, we're standing,";
+ mes "but we're doing it in comfort";
+ next;
+ mes "[Gracie]";
+ mes "In fact, it's so";
+ mes "comfortable here,";
+ mes "I think I'll refuse to leave.";
+ mes "Though, I'm willing to change";
+ mes "my mind if you can find a place";
+ mes "that's even more comfortable.";
+ close;
+}
+
+lhz_in02.gat,34,22,8 script Bank Clerk::1_st 755,{
+
+ mes "[Bank Clerk]";
+ mes "Due to some critical system";
+ mes "errors, all of the bank services";
+ mes "have been temporarily stopped.";
+ mes "We apologize for any inconvenience.";
+ mes "and appreciate your understanding.";
+ close;
+}
+lhz_in02.gat,21,25,9 duplicate(1_st) Bank Clerk::2_nd 86
lhz_in02.gat,21,38,9 duplicate(1_st) Bank Clerk::3_th 86 \ No newline at end of file
diff --git a/npc/other/marriage.txt b/npc/other/marriage.txt
index 200968bb2..17cde4a5c 100644
--- a/npc/other/marriage.txt
+++ b/npc/other/marriage.txt
@@ -1,936 +1,936 @@
-//////////////////////////////////////////////////////////
-// Marriage Script //
-//////////////////////////////////////////////////////////
-//
-//=====eAthena Script====================================
-// Wedding Script
-//=====By================================================
-// AppleGirl and Evera(version 1.0)
-//=====Current Version===================================
-// 2.8
-//=====Compatible With:==================================
-// eAthena Version SVN-R8637 and up; RO Episode 6+
-//=====Description=======================================
-// Fully working wedding script for all kind of weddings
-//=====Additional Comments:==============================
-// Lesbian and Gay Weddings by ShadowLady (version 1.1)
-// Complete Rewrite by Skotlex (version 2.0->2.8)
-//=======================================================
-//
-
-// Configuration Variables:
-- script marriage_init -1,{
-OnInit:
- set $@wed_allow, 0; //If 1, allows same sex marriages.
- set $@wed_veil, 0; //Set to 0 to disable veil check on the bride
-
-//Id of the item that is traded for the wedding ring (use 0 to disable):
- set $@wed_ring, 2613;
-
- set $@wed_groom_reg, 1300000; //Registration cost for the Groom
- set $@wed_bride_reg, 1200000; //Registration cost for the Bride
- set $@wed_divorce_fee, 50000; //Divorcing fee
- set $@wedding_effect, 1; //On who to display the FX: 0: Priest, 1: Bride, 2: Groom
- end;
-}
-
-// Other Configuration:
-// Line 61,62: Priest location, sprite and name.
-// Line 437,438: Registration location, sprite and name.
-// Line 813,814: Divorcing location, sprite and name.
-
-// Variable Notes:
-// $wed_progress Signals that there is a wedding in progress
-// $wed_groom$ - Groom's name storage
-// $wed_groom_sex - Groom's gender (for same marriage ring giving)
-// $wed_bride$ - Bride's name storage
-// $wed_bride_sex - Groom's gender (for same marriage ring giving)
-// $wed_groom_progress - Notes the progress on the groom's part
-// $wed_bride_progress - Notes the progress on the bride's part
-// 0: Not registered. 1: Registered. 2: Accepted the partner. 3: Ready to
-// Retrieve the ring. 4: Retrieved the ring. 5: All set to be wed. 6: Already
-// a couple.
-// ceremony.
-// $wedding_effect_id - When wedding_effect is enabled, sets the ID of the
-// player to show the effect on.
-// $divorce_progress signals that there is a divorce in progress
-// $@divorcer$ name of the person who requested divorce
-// $@divorcee id of the partner, who has to accept the divorce and pay.
-
-//The Priest
-prt_church.gat,100,123,4 script Frederick Second 60,{
- set @name$,"Frederick Second";
-
- function SF_wed_end;
- function SF_equip_check;
- function SF_Groom;
- function SF_Bride;
- function SF_AcceptGroom;
- function SF_AcceptBride;
- function SF_RetrieveRingM;
- function SF_RetrieveRingF;
- function SF_RingsAccepted;
- function SF_StartCeremony;
-
- if (getpartnerid() > 0) {
- mes "["+@name$+"]";
- mes "You have my blessings, have a wonderful married life.";
- close;
- }
- if ($wed_progress == 0) {
- mes "["+@name$+"]";
- mes "Hello child. How is life treating you?";
- close;
- }
-
- if (strcharinfo(0) == $wed_groom$) {
- SF_Groom();
- end;
- }
- if (strcharinfo(0) == $wed_bride$) {
- SF_Bride();
- end;
- }
- mes "["+@name$+"]";
- if ($wed_groom_progress == 0 || $wed_bride_progress == 0) {
- mes "There is a wedding being planned. I would appreciate it if you would not interrupt me.";
- close;
- }
- if ($wed_groom_progress == 6) {
- mes "I am wedding "+$wed_groom$+" and "+$wed_bride$+", and it's already too late to object. Please let me continue.";
- close;
- }
- mes "I am going to wed "+$wed_groom$+" and "+$wed_bride$+", do you have an objection to it?";
- if (select("Sorry, please go on.","Yes, I actually do.") == 2) {
- //Abort
- npctalk "Ladies and gentlemen, "+strcharinfo(0)+" has an objection to the wedding!";
- SF_wed_end();
- mes "Why should they not be wed?";
- input $@msg$;
- npctalk strcharinfo(0)+"'s objection is: "+$@msg$;
- emotion e_sob;
- mes "I see...";
- } else
- mes "Very well, go sit and enjoy the ceremony.";
- close;
-
-function SF_Groom {
- if ($wed_bride_progress == 0) {
- mes "["+@name$+"]";
- mes "Looks like your bride has yet to arrive and register.";
- close;
- }
- if (SF_equip_check() == 0)
- close;
-
- switch($wed_groom_progress) {
- case 1:
- SF_AcceptBride();
- break;
- case 2:
- mes "["+@name$+"]";
- mes "I am waiting for your partner to accept you to start the ceremony.";
- close;
- case 3:
- SF_RetrieveRingM();
- break;
- case 4:
- mes "["+@name$+"]";
- mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
- close;
- case 5:
- mes "["+@name$+"]";
- SF_StartCeremony();
- break;
- default:
- mes "["+@name$+"]";
- mes "Please don't interrupt me now.";
- close;
- }
-}
-
-function SF_Bride {
- if ($wed_groom_progress == 0) {
- mes "["+@name$+"]";
- mes "Looks like your groom has yet to arrive and register.";
- close;
- }
-
- if (SF_equip_check() == 0)
- close;
-
- switch ($wed_bride_progress) {
- case 1:
- SF_AcceptGroom();
- break;
- case 2:
- mes "["+@name$+"]";
- mes "I am waiting for your partner to accept you to start the ceremony.";
- close;
- case 3:
- SF_RetrieveRingF();
- break;
- case 4:
- mes "["+@name$+"]";
- mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
- close;
- case 5:
- mes "["+@name$+"]";
- SF_StartCeremony();
- break;
- default:
- mes "["+@name$+"]";
- mes "Please don't interrupt me now.";
- close;
- }
-}
-
-function SF_AcceptGroom {
- mes "["+@name$+"]";
- mes $wed_bride$+", "+$wed_groom$+" has requested to be your husband for the rest of your life. Do you accept?";
- next;
- switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
- case 1:
- mes "["+@name$+"]";
- mes "You what!?";
- mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
- emotion e_ag;
- close;
- case 2:
- mes "["+@name$+"]";
- mes "!!";
- mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
- close2;
- emotion e_omg;
- npctalk "Ladies and gentlemen, "+$wed_bride$+" has rejected to marry "+$wed_groom$+"!";
- SF_wed_end();
- break;
- case 3:
- set $wed_bride_progress,2;
- if ($wed_groom_progress == 2) {
- SF_RingsAccepted();
- break;
- }
- emotion e_ok;
- mes "["+@name$+"]";
- mes "After your groom approves, you will be given your rings, the ceremony will begin and you will be officially married.";
- close;
- }
-}
-
-function SF_AcceptBride {
- mes "["+@name$+"]";
- mes $wed_groom$+", "+$wed_bride$+" has requested to be your wife for the rest of your life. Do you accept?";
- next;
- switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
- case 1:
- mes "["+@name$+"]";
- mes "You what!?";
- mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
- emotion e_ag;
- close;
- case 2:
- mes "["+@name$+"]";
- mes "!!";
- mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
- emotion e_omg;
- close2;
- npctalk "Ladies and gentlemen, "+$wed_groom$+" has rejected to marry "+$wed_bride$+"!";
- SF_wed_end();
- break;
- case 3:
- set $wed_groom_progress,2;
- if ($wed_bride_progress == 2) {
- SF_RingsAccepted();
- break;
- }
- emotion e_ok;
- mes "["+@name$+"]";
- mes "After your bride approves, you will be given your rings, the ceremony will begin and you will be officially married.";
- close;
- }
-}
-
-function SF_RingsAccepted {
- mes "["+@name$+"]";
- mes "Now that you both have accepted, the wedding will begin. Please come forth, you and your partner, to retrieve your rings.";
- set $wed_bride_progress,3;
- set $wed_groom_progress,3;
- announce $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony will be held at the church!",8;
- close2;
- emotion e_lv;
- npctalk "May the groom and bride please step forward and retrieve their rings?";
-}
-
-function SF_RetrieveRingM {
- mes "["+@name$+"]";
- if ($@wed_ring && countitem($@wed_ring) < 1) {
- mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
- close;
- }
- if ($wed_bride_sex)
- set @item, 2634; //Groom's wedding ring
- else
- set @item, 2635; //Bride's wedding ring
- if (getnameditem(@item,$wed_groom$) == 0) {
- mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
- close;
- }
- mes "Here's the wedding ring for your bride.";
- if ($@wed_ring) delitem $@wed_ring,1;
- set $wed_groom_progress,4;
-
- if ($wed_bride_progress == 4)
- SF_StartCeremony();
- else {
- mes "Once your bride retrieves the ring, the ceremony will begin.";
- close;
- }
-}
-
-function SF_RetrieveRingF {
- mes "["+@name$+"]";
- if ($@wed_ring && countitem($@wed_ring) < 1) {
- mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
- close;
- }
- if ($wed_groom_sex)
- set @item, 2634; //Groom's wedding ring
- else
- set @item, 2635; //Bride's wedding ring
-
- if (getnameditem(@item,$wed_bride$) == 0) {
- mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
- close;
- }
- mes "Here's the wedding ring for your groom.";
- if ($@wed_ring) delitem $@wed_ring,1;
- set $wed_bride_progress,4;
-
- if ($wed_groom_progress == 4)
- SF_StartCeremony();
- else {
- mes "Once your groom retrieves the ring, the ceremony will begin.";
- close;
- }
-}
-
-function SF_StartCeremony {
- mes "I will now start the wedding ceremony, and you will be declared forth husband and wife.";
- set $wed_bride_progress,5;
- set $wed_groom_progress,5;
- set $@msg$,$wed_groom$;
- if (strcharinfo(0) == $wed_groom$)
- set $@msg$,$wed_bride$;
- if (marriage($@msg$) == 0) {
- next;
- mes "["+@name$+"]";
- mes "Where is "+$@msg$+"?? I can't marry you both if one is missing...";
- close;
- }
- set $wed_bride_progress,6;
- set $wed_groom_progress,6;
- initnpctimer;
- close;
-}
-
-OnTimer1000:
- npctalk "Ladies and Gentlemen, We will now join in holy matrimony these two lovers.";
- end;
-
-OnTimer5000:
- npctalk "Now more than ever, will both of your lives be entwined together as so will be your souls.";
- end;
-
-OnTimer10000:
- npctalk "You will both honor and cherish each other through the best and worst of times.";
- end;
-
-OnTimer15000:
- npctalk "The safety and well being of your other will now also be your responsibility.";
- end;
-
-OnTimer20000:
- npctalk "May in sickness or good health, your love burn bright like no force can extinguish it.";
- end;
-
-OnTimer25000:
- npctalk "Those here stand witness to these vows bestowed upon you, you must act accordingly to them.";
- end;
-
-OnTimer30000:
- npctalk "Understanding that, we are nothing more but mortals on this earth, but this is our triumph.";
- end;
-
-OnTimer35000:
- npctalk "We here will now join these two mortal entities, and create an immortal love.";
- end;
-
-OnTimer40000:
- npctalk $wed_groom$+", you have accepted to take "+$wed_bride$+" as your lawfully wedded wife,";
- end;
-
-OnTimer45000:
- npctalk "and you, "+$wed_bride$+", have accepted take "+$wed_groom$+" as your lawfully wedded husband.";
- end;
-
-OnTimer50000:
- npctalk "And as such, now, by the powers vested in me...";
- end;
-
-OnTimer55000:
- npctalk "I pronounce you Husband and Wife, you may kiss the bride and exchange rings.";
- if ($wedding_effect_id && isloggedin($wedding_effect_id))
- {
- attachrid($wedding_effect_id);
- wedding;
- detachrid;
- } else
- wedding;
- SF_wed_end();
- stopnpctimer;
- end;
-
-//Subfunction: Checks that the groom/bride is still wearing their stuff.
-function SF_equip_check {
- if (sex && getequipid(2) != 7170) {
- mes "["+@name$+"]";
- mes "Child, what did you do with your "+getitemname(7170)+"?";
- emotion e_dots;
- return 0;
- }
- if (sex == 0 && getequipid(2) != 2338) {
- mes "["+@name$+"]";
- mes "Child, you are supposed to wear a "+getitemname(2338)+" at all times during the ceremony...";
- emotion e_dots;
- return 0;
- }
- if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
- mes "["+@name$+"]";
- mes "Child, you can't take off your "+getitemname(2206)+" yet....";
- emotion e_dots;
- return 0;
- }
- return 1;
-}
-
-//Subfunction: Resets wedding variables.
-function SF_wed_end {
- set $wed_groom$,"";
- set $wed_groom_sex, 0;
- set $wed_bride$,"";
- set $wed_bride_sex, 0;
- set $wed_groom_progress,0;
- set $wed_bride_progress,0;
- set $wed_progress,0;
- set $wedding_effect_id,0;
-}
-
-OnInit:
- if ($wed_groom_progress==6) {
- SF_wed_end();
- }
- end;
-}
-
-//Registration & Status
-prt_church.gat,106,99,3 script Sister Mary 67,{
- set @name$,"Mary";
- if (getpartnerid() > 0) {
- mes "["+@name$+"]";
- mes "Isn't marriage beautiful?";
- close;
- }
-
- function SF_WedProgress;
- function SF_Principles;
- function SF_Procedure;
- function SF_Register;
- function SF_TryRegister;
-
- if ($wed_progress) {
- SF_WedProgress();
- end;
- }
-
- do {
- mes "["+@name$+"]";
- mes "Marriage... is such a beautiful thing.";
- mes "Would you like to get married with someone?";
- next;
- set @menu, select(
- "I'll be single forever!",
- "Explain the principles of marriage.",
- "Explain the marriage procedure.",
- "I want to get married with someone."
- );
- switch (@menu) {
- case 1: //Quit
- mes "["+@name$+"]";
- mes "In that case, enjoy your bachelor's life.";
- close;
- case 2: //Principles
- SF_Principles();
- break;
- case 3: //Procedure
- SF_Procedure();
- break;
- case 4: //Register
- SF_Register();
- break;
- }
- } while (@menu > 1);
- end;
-
-function SF_Register {
- if ($@wed_allow) { //Role select
- mes "["+@name$+"]";
- mes "Very well, whom would you like to register as?";
- next;
- set @submenu, select("Groom","Bride","Cancel");
- } else if (sex) { //Groom
- mes "["+@name$+"]";
- mes "Very well, will you register as the Groom?";
- next;
- if (select("Yes","I've changed my mind.")==1)
- set @submenu, 1;
- else
- set @submenu, 3;
- } else { //Bride
- mes "["+@name$+"]";
- mes "Very well, will you register as the Bride?";
- next;
- if (select("Yes","I've changed my mind.")==1)
- set @submenu, 2;
- else
- set @submenu, 3;
- }
- switch (@submenu) {
- case 1: //Groom
- SF_TryRegister(0);
- set $wed_progress,1;
- mes "["+@name$+"]";
- mes "You are now registered as the groom.";
- mes "Tell your bride to register as soon as possible.";
- emotion e_hmm;
- initnpctimer;
- close;
- case 2: //Bride
- SF_TryRegister(1);
- set $wed_progress,1;
- mes "["+@name$+"]";
- mes "You are now registered as the bride.";
- mes "Tell your groom to register as soon as possible.";
- emotion e_hmm;
- initnpctimer;
- close;
- default: //Cancel
- mes "["+@name$+"]";
- mes "Come back when you are ready.";
- close;
- }
-}
-
-function SF_WedProgress {
- if (strcharinfo(0) == $wed_groom$) {
- mes "["+@name$+"]";
- if ($wed_bride_progress > 0)
- mes "The Priest will handle the rest of the ceremony.";
- else
- mes "Tell your bride to register, what is taking so long? Time is running out.";
- close;
- }
- if (strcharinfo(0) == $wed_bride$) {
- mes "["+@name$+"]";
- if ($wed_groom_progress > 0)
- mes "The Priest will handle the rest of the ceremony.";
- else
- mes "Tell your groom to register, what is taking so long? Time is running out.";
- close;
- }
- if (($wed_groom_progress == 0) && (sex == 1 || $@wed_allow == 1)) {
- mes "["+@name$+"]";
- mes $wed_bride$+" is waiting for the groom to register. Are you the one who came to register as groom?";
- next;
- if (select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
- SF_TryRegister(0);
- stopnpctimer;
- set $wed_groom_progress,1;
- mes "["+@name$+"]";
- mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
- emotion e_no1;
- close2;
- npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
- emotion e_no1;
- end;
- } else {
- mes "["+@name$+"]";
- mes "I see. Sorry to have bothered you then.";
- close;
- }
-
- }
- if (($wed_bride_progress == 0) && (sex == 0 || $@wed_allow == 1)) {
- mes "["+@name$+"]";
- mes $wed_groom$+" is waiting for the bride to register. Are you the one who came to register as the bride?";
- next;
- if(select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
- SF_TryRegister(1);
- stopnpctimer;
- mes "["+@name$+"]";
- mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
- emotion e_no1;
- close2;
- npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
- emotion e_no1;
- end;
- } else {
- mes "["+@name$+"]";
- mes "I see. Sorry to have bothered you then.";
- close;
- }
- }
- mes "["+@name$+"]";
- mes "There is a wedding in progress.";
- mes "Would you like to know the progress of said wedding?";
- next;
- if (select("Yes","No") != 1) {
- mes "["+@name$+"]";
- mes "Enjoy the wedding.";
- close;
- }
- //Display Progress
- mes "["+@name$+"]";
- switch ($wed_groom_progress) {
- case 0:
- mes "The groom has not registered yet.";
- break;
- case 1:
- mes "The groom, "+$wed_groom$+", has yet to accept the bride.";
- break;
- case 2:
- mes "The groom, "+$wed_groom$+", is waiting for the bride's acceptance.";
- break;
- case 3:
- mes "The groom, "+$wed_groom$+", has yet to retrieve the ring.";
- break;
- case 4:
- mes "The groom, "+$wed_groom$+", is waiting for the bride to retrieve the ring.";
- break;
- }
- switch ($wed_bride_progress) {
- case 0:
- mes "The bride has not registered yet.";
- break;
- case 1:
- mes "The bride, "+$wed_bride$+", has yet to confirm the groom.";
- break;
- case 2:
- mes "The bride, "+$wed_bride$+", is waiting for the groom's acceptance.";
- break;
- case 3:
- mes "The bride, "+$wed_bride$+", has yet to retrieve the ring.";
- break;
- case 4:
- mes "The bride, "+$wed_bride$+", is waiting for the groom to retrieve the ring.";
- break;
- case 5:
- mes "We are just waiting for both "+$wed_groom$+" and "+$wed_bride$+" to be together to marry them.";
- break;
- case 6:
- mes $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony is already well on it's way.";
- break;
- }
- mes "Enjoy the remaining of the wedding.";
- close;
-}
-
-OnInit:
- if ($wed_groom_progress + $wed_bride_progress == 1)
- initnpctimer;
- end;
-
-OnTimer60000:
- //Registration failed.
- if ($wed_bride_progress == 1)
- set $@msg$, $wed_bride$;
- else
- set $@msg$, $wed_groom$;
-
- npctalk "Registration timed out. Is it that noone wants to marry "+$@msg$+"..?";
- emotion e_hmm;
-
- set $wed_groom$,"";
- set $wed_groom_sex, 0;
- set $wed_bride$,"";
- set $wed_bride_sex, 0;
- set $wed_groom_progress,0;
- set $wed_bride_progress,0;
- set $wed_progress,0;
- stopnpctimer;
- end;
-
-//Subfunction SF_TryRegister (int bride)
-function SF_TryRegister {
- set @bride, getarg(0);
- set @type$, "groom";
- if (@bride)
- set @type$, "bride";
-
- mes "["+@name$+"]";
- mes "Before registering as "+@type$+", let me check if you meet all the requirements...";
- next;
- if (Upper == 2) {
- mes "["+@name$+"]";
- mes "Oh dear, you are too young to be thinking of marriage!";
- emotion e_gasp;
- close;
- }
- if (sex)
- set @item, 7170;
- else
- set @item, 2338;
-
- if (getequipid(2) != @item) {
- mes "["+@name$+"]";
- mes "You should be wearing a "+getitemname(@item)+" if you want to get married.";
- close;
- }
- if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
- mes "["+@name$+"]";
- mes "Where is your "+getitemname(2206)+"? It's a necessary complement to your dress.";
- close;
- }
- if ($@wed_ring && countitem($@wed_ring) < 1) {
- mes "["+@name$+"]";
- mes "Where's the ring? You need a "+getitemname($@wed_ring)+" for the ring exchange, dear.";
- close;
- }
- if (@bride)
- set @cost, $@wed_bride_reg;
- else
- set @cost, $@wed_groom_reg;
-
- if (Zeny < @cost) {
- mes "["+@name$+"]";
- mes "I am sorry, but you don't have enough to pay for the registration fee.";
- mes "Come back once you have collected "+@cost+"z.";
- close;
- }
- set Zeny,Zeny-@cost;
- sc_start SC_Wedding,3600000000,1; //Start Wedding Effect (SC_WEDDING)
- if (@bride) {
- set $wed_bride_progress,1;
- set $wed_bride$,strcharinfo(0);
- set $wed_bride_sex, sex;
- if ($@wedding_effect == 1) //Store account id for effect.
- set $wedding_effect_id, getcharid(3);
- } else {
- set $wed_groom_progress,1;
- set $wed_groom$,strcharinfo(0);
- set $wed_groom_sex, sex;
- if ($@wedding_effect == 2) //Store account id for effect.
- set $wedding_effect_id, getcharid(3);
- }
-}
-
-//Explain wedding principles...
-function SF_Principles {
- mes "["+@name$+"]";
- mes "Weddings are performed by our local Priest with the intent of promoting love and peace among the loving couples.";
- next;
- mes "["+@name$+"]";
- mes "The proposal must be done with prudence and courtesy, once the wedlocks have been made, they cannot be undone.";
- next;
- mes "["+@name$+"]";
- mes "The two who have been joined by marriage must remain together forever until the day death do them apart.";
- next;
- mes "["+@name$+"]";
- if ($@wed_allow == 1)
- mes "Altough normally only males can wed females (and viceversa), our local Priest is more open-minded than that and he permits all pairings regardless of gender.";
- else
- mes "Males may only wed with females, and females only with males, the church will not consent any other kind of partnerships.";
- next;
- mes "["+@name$+"]";
- mes "If there is a significant other with whom you want to spend the rest of your life with, then don't be shy to propose.";
- next;
- mes "["+@name$+"]";
- mes "I wish for many blessings upon couples who wish to live happily ever after...";
- next;
-}
-
-//Explain the wedding procedure...
-function SF_Procedure {
- mes "["+@name$+"]";
- mes "First of all, both groom and bride must register with me.";
- next;
- if ($@wed_allow == 1) {
- mes "["+@name$+"]";
- mes "The registration requirements are:";
- mes "- Males must be wearing a "+getitemname(7170)+".";
- mes "- Females must be wearing a "+getitemname(2338)+".";
- if ($@wed_veil) mes "- Females must also wear a "+getitemname(2206)+".";
- if ($@wed_ring) mes "- Both must own a "+getitemname($@wed_ring)+" each.";
- if ($@wed_groom_reg > 0) mes "- The registration fee for the groom is "+$@wed_groom_reg+"z.";
- if ($@wed_bride_reg > 0) mes "- The registration fee for the bride is "+$@wed_bride_reg+"z.";
- } else {
- mes "["+@name$+"]";
- mes "The registration requirements for the groom are:";
- mes "- To be wearing a "+getitemname(7170)+".";
- if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
- if ($@wed_groom_reg > 0) mes "- Pay a Registration fee of "+$@wed_groom_reg+"z.";
- next;
- mes "["+@name$+"]";
- mes "The registration requirements for the bride are:";
- mes "- To be wearing a "+getitemname(2338)+".";
- if ($@wed_veil) mes "- To be wearing a "+getitemname(2206)+".";
- if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
- if ($@wed_bride_reg > 0) mes "- Pay a Registration fee of "+$@wed_bride_reg+"z.";
- }
- next;
- mes "["+@name$+"]";
- mes "I shouldn't need to mention this, but adopted kids are too young to get married.";
- mes "Both groom and bride must register within a minute of each other, or the wedding will be cancelled. So be sure you both are ready and meet the registration requirements beforehand.";
- next;
- mes "["+@name$+"]";
- mes "After both have registered with me, you have to go pledge your vows to the Priest and accept your registered partner. If for some reason you reject your registered partner, the wedding will be cancelled...";
- next;
- mes "["+@name$+"]";
- mes "If you both accept each other, then the wedding has been decided and the ceremony will begin.";
- if ($@wed_ring) {
- mes "But first, you need to get your rings ready.";
- next;
- mes "["+@name$+"]";
- mes "Talk to the priest once more, and he will exchange your "+getitemname($@wed_ring)+" for a wedding ring. After you both have claimed the rings for exchanging, the ceremony will begin.";
- }
- next;
- mes "["+@name$+"]";
- mes "If there are various couples who desire to marry, you should keep in order, for the Priest can only handle one wedding at a time.";
- next;
-}
-}
-
-prt_church.gat,94,99,4 script Sister Lisa 79,{
- set @name$,"Lisa";
-
- function SF_DivorceEnd;
- function SF_InProgress;
-
- if ($@divorce_progress==1) {
- goto SF_InProgress;
- end;
- }
-
- do {
- mes "["+@name$+"]";
- mes "Divorcing can be such a sad event...";
- if (getpartnerid() == 0) {
- mes "People shouldn't make shallow vows to others, don't you think?";
- close;
- }
- mes "You wouldn't want to divorce, by any chance?";
- next;
- set @menu, select(
- "I am happy as I am, thank you.",
- "Explain the divorce.",
- "Explain Requirements.",
- "I want to divorce."
- );
- switch (@menu) {
- case 1:
- mes "["+@name$+"]";
- mes "Good to hear.";
- close;
- case 2: //Explanation
- mes "["+@name$+"]";
- mes "Even though it is said that once the wedlocks have been made they cannot be undone, sometimes it is necessary to undo our mistakes from the past..";
- next;
- mes "["+@name$+"]";
- mes "It is sad, but true. If you happen to have married the wrong person, it is possible to divorce, rather than spend the rest of your life with the wrong one.";
- next;
- break;
- case 3: //Requirement
- mes "["+@name$+"]";
- mes "In order to file for divorce, I need you both to agree to it.";
- mes "After you file in for divorce, your spouse has one minute to agree, and then you will both be divorced.";
- if ($@wed_divorce_fee > 0) mes "The fee is of "+$@wed_divorce_fee+"z and is paid by the person who confirms the divorce, so plan ahead of time how you will divide the costs.";
- next;
- break;
- case 4: //Divorce
- mes "["+@name$+"]";
- mes "You should not regret the choices you've made in life.";
- mes "Are you positively sure about getting divorced?";
- next;
- if (select("Wait... I need to think about it.","Absolutely") != 2) {
- mes "["+@name$+"]";
- mes "You should think this through.";
- close;
- }
- mes "["+@name$+"]";
- set $@divorcee,getpartnerid();
- set $@divorcer$,strcharinfo(0);
- set $@divorce_progress,1;
- initnpctimer;
- mes "Very well, get your partner to confirm, and I will collect the fee for filing the divorce then.";
- close;
- }
- } while (@menu > 1);
-end;
-
-function SF_InProgress {
- if (strcharinfo(0) == $@divorcer$) {
- mes "["+@name$+"]";
- mes "...I am still waiting for your partner to confirm the divorce procedure.";
- close;
- }
- if (getcharid(0) != $@divorcee) {
- mes "["+@name$+"]";
- mes "I am in the progress of divorcing "+$@divorcer$+".";
- mes "Do you know who the spouse is?";
- close;
- }
- //Confirm...
- mes "["+@name$+"]";
- mes $@divorcer$+" has asked to divorce you. If you accept, and have the fee of "+$@wed_divorce_fee+"z at hand, I will proceed to divorce you two.";
- mes "So, should I proceed with the divorce?";
- next;
- if (select("I don't want to divorce....","Yes, we have agreed to this.")!=2) {
- mes "["+@name$+"]";
- mes "I hope you can work things out.";
- emotion e_pat;
- goto SF_DivorceEnd;
- close;
- }
- if (Zeny < $@wed_divorce_fee) {
- mes "["+@name$+"]";
- mes "Well, I can't file your divorce because you don't have enough for the fee. Get your partner to lend you some?";
- close;
- }
- if (!(divorce())) {
- mes "["+@name$+"]";
- mes "Where has "+$@divorcer$+" gone to? I can't divorce you unless you both are here...";
- emotion e_swt2;
- close;
- }
- set Zeny,Zeny-$@wed_divorce_fee;
- announce $@divorcer$+" has just divorced "+strcharinfo(0)+"...", 8;
- mes "["+@name$+"]";
- mes "Your divorce has been filed. You are no longer wed.";
- emotion e_sob;
- goto SF_DivorceEnd;
- close;
-}
-
-function SF_DivorceEnd {
- stopnpctimer;
- set $@divorce_progress,0;
- set $@divorcee,0;
- set $@divorcer$,"";
-}
-
-OnTimer60000:
- npctalk "Divorce confirmation time's is up. Where did "+$@divorcer$+"'s spouse go...";
- emotion e_what;
- SF_DivorceEnd();
- end;
-}
+//////////////////////////////////////////////////////////
+// Marriage Script //
+//////////////////////////////////////////////////////////
+//
+//=====eAthena Script====================================
+// Wedding Script
+//=====By================================================
+// AppleGirl and Evera(version 1.0)
+//=====Current Version===================================
+// 2.8
+//=====Compatible With:==================================
+// eAthena Version SVN-R8637 and up; RO Episode 6+
+//=====Description=======================================
+// Fully working wedding script for all kind of weddings
+//=====Additional Comments:==============================
+// Lesbian and Gay Weddings by ShadowLady (version 1.1)
+// Complete Rewrite by Skotlex (version 2.0->2.8)
+//=======================================================
+//
+
+// Configuration Variables:
+- script marriage_init -1,{
+OnInit:
+ set $@wed_allow, 0; //If 1, allows same sex marriages.
+ set $@wed_veil, 0; //Set to 0 to disable veil check on the bride
+
+//Id of the item that is traded for the wedding ring (use 0 to disable):
+ set $@wed_ring, 2613;
+
+ set $@wed_groom_reg, 1300000; //Registration cost for the Groom
+ set $@wed_bride_reg, 1200000; //Registration cost for the Bride
+ set $@wed_divorce_fee, 50000; //Divorcing fee
+ set $@wedding_effect, 1; //On who to display the FX: 0: Priest, 1: Bride, 2: Groom
+ end;
+}
+
+// Other Configuration:
+// Line 61,62: Priest location, sprite and name.
+// Line 437,438: Registration location, sprite and name.
+// Line 813,814: Divorcing location, sprite and name.
+
+// Variable Notes:
+// $wed_progress Signals that there is a wedding in progress
+// $wed_groom$ - Groom's name storage
+// $wed_groom_sex - Groom's gender (for same marriage ring giving)
+// $wed_bride$ - Bride's name storage
+// $wed_bride_sex - Groom's gender (for same marriage ring giving)
+// $wed_groom_progress - Notes the progress on the groom's part
+// $wed_bride_progress - Notes the progress on the bride's part
+// 0: Not registered. 1: Registered. 2: Accepted the partner. 3: Ready to
+// Retrieve the ring. 4: Retrieved the ring. 5: All set to be wed. 6: Already
+// a couple.
+// ceremony.
+// $wedding_effect_id - When wedding_effect is enabled, sets the ID of the
+// player to show the effect on.
+// $divorce_progress signals that there is a divorce in progress
+// $@divorcer$ name of the person who requested divorce
+// $@divorcee id of the partner, who has to accept the divorce and pay.
+
+//The Priest
+prt_church.gat,100,123,4 script Frederick Second 60,{
+ set @name$,"Frederick Second";
+
+ function SF_wed_end;
+ function SF_equip_check;
+ function SF_Groom;
+ function SF_Bride;
+ function SF_AcceptGroom;
+ function SF_AcceptBride;
+ function SF_RetrieveRingM;
+ function SF_RetrieveRingF;
+ function SF_RingsAccepted;
+ function SF_StartCeremony;
+
+ if (getpartnerid() > 0) {
+ mes "["+@name$+"]";
+ mes "You have my blessings, have a wonderful married life.";
+ close;
+ }
+ if ($wed_progress == 0) {
+ mes "["+@name$+"]";
+ mes "Hello child. How is life treating you?";
+ close;
+ }
+
+ if (strcharinfo(0) == $wed_groom$) {
+ SF_Groom();
+ end;
+ }
+ if (strcharinfo(0) == $wed_bride$) {
+ SF_Bride();
+ end;
+ }
+ mes "["+@name$+"]";
+ if ($wed_groom_progress == 0 || $wed_bride_progress == 0) {
+ mes "There is a wedding being planned. I would appreciate it if you would not interrupt me.";
+ close;
+ }
+ if ($wed_groom_progress == 6) {
+ mes "I am wedding "+$wed_groom$+" and "+$wed_bride$+", and it's already too late to object. Please let me continue.";
+ close;
+ }
+ mes "I am going to wed "+$wed_groom$+" and "+$wed_bride$+", do you have an objection to it?";
+ if (select("Sorry, please go on.","Yes, I actually do.") == 2) {
+ //Abort
+ npctalk "Ladies and gentlemen, "+strcharinfo(0)+" has an objection to the wedding!";
+ SF_wed_end();
+ mes "Why should they not be wed?";
+ input $@msg$;
+ npctalk strcharinfo(0)+"'s objection is: "+$@msg$;
+ emotion e_sob;
+ mes "I see...";
+ } else
+ mes "Very well, go sit and enjoy the ceremony.";
+ close;
+
+function SF_Groom {
+ if ($wed_bride_progress == 0) {
+ mes "["+@name$+"]";
+ mes "Looks like your bride has yet to arrive and register.";
+ close;
+ }
+ if (SF_equip_check() == 0)
+ close;
+
+ switch($wed_groom_progress) {
+ case 1:
+ SF_AcceptBride();
+ break;
+ case 2:
+ mes "["+@name$+"]";
+ mes "I am waiting for your partner to accept you to start the ceremony.";
+ close;
+ case 3:
+ SF_RetrieveRingM();
+ break;
+ case 4:
+ mes "["+@name$+"]";
+ mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
+ close;
+ case 5:
+ mes "["+@name$+"]";
+ SF_StartCeremony();
+ break;
+ default:
+ mes "["+@name$+"]";
+ mes "Please don't interrupt me now.";
+ close;
+ }
+}
+
+function SF_Bride {
+ if ($wed_groom_progress == 0) {
+ mes "["+@name$+"]";
+ mes "Looks like your groom has yet to arrive and register.";
+ close;
+ }
+
+ if (SF_equip_check() == 0)
+ close;
+
+ switch ($wed_bride_progress) {
+ case 1:
+ SF_AcceptGroom();
+ break;
+ case 2:
+ mes "["+@name$+"]";
+ mes "I am waiting for your partner to accept you to start the ceremony.";
+ close;
+ case 3:
+ SF_RetrieveRingF();
+ break;
+ case 4:
+ mes "["+@name$+"]";
+ mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings.";
+ close;
+ case 5:
+ mes "["+@name$+"]";
+ SF_StartCeremony();
+ break;
+ default:
+ mes "["+@name$+"]";
+ mes "Please don't interrupt me now.";
+ close;
+ }
+}
+
+function SF_AcceptGroom {
+ mes "["+@name$+"]";
+ mes $wed_bride$+", "+$wed_groom$+" has requested to be your husband for the rest of your life. Do you accept?";
+ next;
+ switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "You what!?";
+ mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
+ emotion e_ag;
+ close;
+ case 2:
+ mes "["+@name$+"]";
+ mes "!!";
+ mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
+ close2;
+ emotion e_omg;
+ npctalk "Ladies and gentlemen, "+$wed_bride$+" has rejected to marry "+$wed_groom$+"!";
+ SF_wed_end();
+ break;
+ case 3:
+ set $wed_bride_progress,2;
+ if ($wed_groom_progress == 2) {
+ SF_RingsAccepted();
+ break;
+ }
+ emotion e_ok;
+ mes "["+@name$+"]";
+ mes "After your groom approves, you will be given your rings, the ceremony will begin and you will be officially married.";
+ close;
+ }
+}
+
+function SF_AcceptBride {
+ mes "["+@name$+"]";
+ mes $wed_groom$+", "+$wed_bride$+" has requested to be your wife for the rest of your life. Do you accept?";
+ next;
+ switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "You what!?";
+ mes "err.. *cough* *cough* very well... come back after you've made up your mind.";
+ emotion e_ag;
+ close;
+ case 2:
+ mes "["+@name$+"]";
+ mes "!!";
+ mes "Ah... err... ehm... okay. You two seem to have some differences to settle first.";
+ emotion e_omg;
+ close2;
+ npctalk "Ladies and gentlemen, "+$wed_groom$+" has rejected to marry "+$wed_bride$+"!";
+ SF_wed_end();
+ break;
+ case 3:
+ set $wed_groom_progress,2;
+ if ($wed_bride_progress == 2) {
+ SF_RingsAccepted();
+ break;
+ }
+ emotion e_ok;
+ mes "["+@name$+"]";
+ mes "After your bride approves, you will be given your rings, the ceremony will begin and you will be officially married.";
+ close;
+ }
+}
+
+function SF_RingsAccepted {
+ mes "["+@name$+"]";
+ mes "Now that you both have accepted, the wedding will begin. Please come forth, you and your partner, to retrieve your rings.";
+ set $wed_bride_progress,3;
+ set $wed_groom_progress,3;
+ announce $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony will be held at the church!",8;
+ close2;
+ emotion e_lv;
+ npctalk "May the groom and bride please step forward and retrieve their rings?";
+}
+
+function SF_RetrieveRingM {
+ mes "["+@name$+"]";
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
+ close;
+ }
+ if ($wed_bride_sex)
+ set @item, 2634; //Groom's wedding ring
+ else
+ set @item, 2635; //Bride's wedding ring
+ if (getnameditem(@item,$wed_groom$) == 0) {
+ mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
+ close;
+ }
+ mes "Here's the wedding ring for your bride.";
+ if ($@wed_ring) delitem $@wed_ring,1;
+ set $wed_groom_progress,4;
+
+ if ($wed_bride_progress == 4)
+ SF_StartCeremony();
+ else {
+ mes "Once your bride retrieves the ring, the ceremony will begin.";
+ close;
+ }
+}
+
+function SF_RetrieveRingF {
+ mes "["+@name$+"]";
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!";
+ close;
+ }
+ if ($wed_groom_sex)
+ set @item, 2634; //Groom's wedding ring
+ else
+ set @item, 2635; //Bride's wedding ring
+
+ if (getnameditem(@item,$wed_bride$) == 0) {
+ mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring.";
+ close;
+ }
+ mes "Here's the wedding ring for your groom.";
+ if ($@wed_ring) delitem $@wed_ring,1;
+ set $wed_bride_progress,4;
+
+ if ($wed_groom_progress == 4)
+ SF_StartCeremony();
+ else {
+ mes "Once your groom retrieves the ring, the ceremony will begin.";
+ close;
+ }
+}
+
+function SF_StartCeremony {
+ mes "I will now start the wedding ceremony, and you will be declared forth husband and wife.";
+ set $wed_bride_progress,5;
+ set $wed_groom_progress,5;
+ set $@msg$,$wed_groom$;
+ if (strcharinfo(0) == $wed_groom$)
+ set $@msg$,$wed_bride$;
+ if (marriage($@msg$) == 0) {
+ next;
+ mes "["+@name$+"]";
+ mes "Where is "+$@msg$+"?? I can't marry you both if one is missing...";
+ close;
+ }
+ set $wed_bride_progress,6;
+ set $wed_groom_progress,6;
+ initnpctimer;
+ close;
+}
+
+OnTimer1000:
+ npctalk "Ladies and Gentlemen, We will now join in holy matrimony these two lovers.";
+ end;
+
+OnTimer5000:
+ npctalk "Now more than ever, will both of your lives be entwined together as so will be your souls.";
+ end;
+
+OnTimer10000:
+ npctalk "You will both honor and cherish each other through the best and worst of times.";
+ end;
+
+OnTimer15000:
+ npctalk "The safety and well being of your other will now also be your responsibility.";
+ end;
+
+OnTimer20000:
+ npctalk "May in sickness or good health, your love burn bright like no force can extinguish it.";
+ end;
+
+OnTimer25000:
+ npctalk "Those here stand witness to these vows bestowed upon you, you must act accordingly to them.";
+ end;
+
+OnTimer30000:
+ npctalk "Understanding that, we are nothing more but mortals on this earth, but this is our triumph.";
+ end;
+
+OnTimer35000:
+ npctalk "We here will now join these two mortal entities, and create an immortal love.";
+ end;
+
+OnTimer40000:
+ npctalk $wed_groom$+", you have accepted to take "+$wed_bride$+" as your lawfully wedded wife,";
+ end;
+
+OnTimer45000:
+ npctalk "and you, "+$wed_bride$+", have accepted take "+$wed_groom$+" as your lawfully wedded husband.";
+ end;
+
+OnTimer50000:
+ npctalk "And as such, now, by the powers vested in me...";
+ end;
+
+OnTimer55000:
+ npctalk "I pronounce you Husband and Wife, you may kiss the bride and exchange rings.";
+ if ($wedding_effect_id && isloggedin($wedding_effect_id))
+ {
+ attachrid($wedding_effect_id);
+ wedding;
+ detachrid;
+ } else
+ wedding;
+ SF_wed_end();
+ stopnpctimer;
+ end;
+
+//Subfunction: Checks that the groom/bride is still wearing their stuff.
+function SF_equip_check {
+ if (sex && getequipid(2) != 7170) {
+ mes "["+@name$+"]";
+ mes "Child, what did you do with your "+getitemname(7170)+"?";
+ emotion e_dots;
+ return 0;
+ }
+ if (sex == 0 && getequipid(2) != 2338) {
+ mes "["+@name$+"]";
+ mes "Child, you are supposed to wear a "+getitemname(2338)+" at all times during the ceremony...";
+ emotion e_dots;
+ return 0;
+ }
+ if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
+ mes "["+@name$+"]";
+ mes "Child, you can't take off your "+getitemname(2206)+" yet....";
+ emotion e_dots;
+ return 0;
+ }
+ return 1;
+}
+
+//Subfunction: Resets wedding variables.
+function SF_wed_end {
+ set $wed_groom$,"";
+ set $wed_groom_sex, 0;
+ set $wed_bride$,"";
+ set $wed_bride_sex, 0;
+ set $wed_groom_progress,0;
+ set $wed_bride_progress,0;
+ set $wed_progress,0;
+ set $wedding_effect_id,0;
+}
+
+OnInit:
+ if ($wed_groom_progress==6) {
+ SF_wed_end();
+ }
+ end;
+}
+
+//Registration & Status
+prt_church.gat,106,99,3 script Sister Mary 67,{
+ set @name$,"Mary";
+ if (getpartnerid() > 0) {
+ mes "["+@name$+"]";
+ mes "Isn't marriage beautiful?";
+ close;
+ }
+
+ function SF_WedProgress;
+ function SF_Principles;
+ function SF_Procedure;
+ function SF_Register;
+ function SF_TryRegister;
+
+ if ($wed_progress) {
+ SF_WedProgress();
+ end;
+ }
+
+ do {
+ mes "["+@name$+"]";
+ mes "Marriage... is such a beautiful thing.";
+ mes "Would you like to get married with someone?";
+ next;
+ set @menu, select(
+ "I'll be single forever!",
+ "Explain the principles of marriage.",
+ "Explain the marriage procedure.",
+ "I want to get married with someone."
+ );
+ switch (@menu) {
+ case 1: //Quit
+ mes "["+@name$+"]";
+ mes "In that case, enjoy your bachelor's life.";
+ close;
+ case 2: //Principles
+ SF_Principles();
+ break;
+ case 3: //Procedure
+ SF_Procedure();
+ break;
+ case 4: //Register
+ SF_Register();
+ break;
+ }
+ } while (@menu > 1);
+ end;
+
+function SF_Register {
+ if ($@wed_allow) { //Role select
+ mes "["+@name$+"]";
+ mes "Very well, whom would you like to register as?";
+ next;
+ set @submenu, select("Groom","Bride","Cancel");
+ } else if (sex) { //Groom
+ mes "["+@name$+"]";
+ mes "Very well, will you register as the Groom?";
+ next;
+ if (select("Yes","I've changed my mind.")==1)
+ set @submenu, 1;
+ else
+ set @submenu, 3;
+ } else { //Bride
+ mes "["+@name$+"]";
+ mes "Very well, will you register as the Bride?";
+ next;
+ if (select("Yes","I've changed my mind.")==1)
+ set @submenu, 2;
+ else
+ set @submenu, 3;
+ }
+ switch (@submenu) {
+ case 1: //Groom
+ SF_TryRegister(0);
+ set $wed_progress,1;
+ mes "["+@name$+"]";
+ mes "You are now registered as the groom.";
+ mes "Tell your bride to register as soon as possible.";
+ emotion e_hmm;
+ initnpctimer;
+ close;
+ case 2: //Bride
+ SF_TryRegister(1);
+ set $wed_progress,1;
+ mes "["+@name$+"]";
+ mes "You are now registered as the bride.";
+ mes "Tell your groom to register as soon as possible.";
+ emotion e_hmm;
+ initnpctimer;
+ close;
+ default: //Cancel
+ mes "["+@name$+"]";
+ mes "Come back when you are ready.";
+ close;
+ }
+}
+
+function SF_WedProgress {
+ if (strcharinfo(0) == $wed_groom$) {
+ mes "["+@name$+"]";
+ if ($wed_bride_progress > 0)
+ mes "The Priest will handle the rest of the ceremony.";
+ else
+ mes "Tell your bride to register, what is taking so long? Time is running out.";
+ close;
+ }
+ if (strcharinfo(0) == $wed_bride$) {
+ mes "["+@name$+"]";
+ if ($wed_groom_progress > 0)
+ mes "The Priest will handle the rest of the ceremony.";
+ else
+ mes "Tell your groom to register, what is taking so long? Time is running out.";
+ close;
+ }
+ if (($wed_groom_progress == 0) && (sex == 1 || $@wed_allow == 1)) {
+ mes "["+@name$+"]";
+ mes $wed_bride$+" is waiting for the groom to register. Are you the one who came to register as groom?";
+ next;
+ if (select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
+ SF_TryRegister(0);
+ stopnpctimer;
+ set $wed_groom_progress,1;
+ mes "["+@name$+"]";
+ mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
+ emotion e_no1;
+ close2;
+ npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
+ emotion e_no1;
+ end;
+ } else {
+ mes "["+@name$+"]";
+ mes "I see. Sorry to have bothered you then.";
+ close;
+ }
+
+ }
+ if (($wed_bride_progress == 0) && (sex == 0 || $@wed_allow == 1)) {
+ mes "["+@name$+"]";
+ mes $wed_groom$+" is waiting for the bride to register. Are you the one who came to register as the bride?";
+ next;
+ if(select("Yes, I am.","Sorry, you got the wrong person.") == 1) {
+ SF_TryRegister(1);
+ stopnpctimer;
+ mes "["+@name$+"]";
+ mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin.";
+ emotion e_no1;
+ close2;
+ npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest.";
+ emotion e_no1;
+ end;
+ } else {
+ mes "["+@name$+"]";
+ mes "I see. Sorry to have bothered you then.";
+ close;
+ }
+ }
+ mes "["+@name$+"]";
+ mes "There is a wedding in progress.";
+ mes "Would you like to know the progress of said wedding?";
+ next;
+ if (select("Yes","No") != 1) {
+ mes "["+@name$+"]";
+ mes "Enjoy the wedding.";
+ close;
+ }
+ //Display Progress
+ mes "["+@name$+"]";
+ switch ($wed_groom_progress) {
+ case 0:
+ mes "The groom has not registered yet.";
+ break;
+ case 1:
+ mes "The groom, "+$wed_groom$+", has yet to accept the bride.";
+ break;
+ case 2:
+ mes "The groom, "+$wed_groom$+", is waiting for the bride's acceptance.";
+ break;
+ case 3:
+ mes "The groom, "+$wed_groom$+", has yet to retrieve the ring.";
+ break;
+ case 4:
+ mes "The groom, "+$wed_groom$+", is waiting for the bride to retrieve the ring.";
+ break;
+ }
+ switch ($wed_bride_progress) {
+ case 0:
+ mes "The bride has not registered yet.";
+ break;
+ case 1:
+ mes "The bride, "+$wed_bride$+", has yet to confirm the groom.";
+ break;
+ case 2:
+ mes "The bride, "+$wed_bride$+", is waiting for the groom's acceptance.";
+ break;
+ case 3:
+ mes "The bride, "+$wed_bride$+", has yet to retrieve the ring.";
+ break;
+ case 4:
+ mes "The bride, "+$wed_bride$+", is waiting for the groom to retrieve the ring.";
+ break;
+ case 5:
+ mes "We are just waiting for both "+$wed_groom$+" and "+$wed_bride$+" to be together to marry them.";
+ break;
+ case 6:
+ mes $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony is already well on it's way.";
+ break;
+ }
+ mes "Enjoy the remaining of the wedding.";
+ close;
+}
+
+OnInit:
+ if ($wed_groom_progress + $wed_bride_progress == 1)
+ initnpctimer;
+ end;
+
+OnTimer60000:
+ //Registration failed.
+ if ($wed_bride_progress == 1)
+ set $@msg$, $wed_bride$;
+ else
+ set $@msg$, $wed_groom$;
+
+ npctalk "Registration timed out. Is it that noone wants to marry "+$@msg$+"..?";
+ emotion e_hmm;
+
+ set $wed_groom$,"";
+ set $wed_groom_sex, 0;
+ set $wed_bride$,"";
+ set $wed_bride_sex, 0;
+ set $wed_groom_progress,0;
+ set $wed_bride_progress,0;
+ set $wed_progress,0;
+ stopnpctimer;
+ end;
+
+//Subfunction SF_TryRegister (int bride)
+function SF_TryRegister {
+ set @bride, getarg(0);
+ set @type$, "groom";
+ if (@bride)
+ set @type$, "bride";
+
+ mes "["+@name$+"]";
+ mes "Before registering as "+@type$+", let me check if you meet all the requirements...";
+ next;
+ if (Upper == 2) {
+ mes "["+@name$+"]";
+ mes "Oh dear, you are too young to be thinking of marriage!";
+ emotion e_gasp;
+ close;
+ }
+ if (sex)
+ set @item, 7170;
+ else
+ set @item, 2338;
+
+ if (getequipid(2) != @item) {
+ mes "["+@name$+"]";
+ mes "You should be wearing a "+getitemname(@item)+" if you want to get married.";
+ close;
+ }
+ if (sex == 0 && $@wed_veil && getequipid(1) != 2206) {
+ mes "["+@name$+"]";
+ mes "Where is your "+getitemname(2206)+"? It's a necessary complement to your dress.";
+ close;
+ }
+ if ($@wed_ring && countitem($@wed_ring) < 1) {
+ mes "["+@name$+"]";
+ mes "Where's the ring? You need a "+getitemname($@wed_ring)+" for the ring exchange, dear.";
+ close;
+ }
+ if (@bride)
+ set @cost, $@wed_bride_reg;
+ else
+ set @cost, $@wed_groom_reg;
+
+ if (Zeny < @cost) {
+ mes "["+@name$+"]";
+ mes "I am sorry, but you don't have enough to pay for the registration fee.";
+ mes "Come back once you have collected "+@cost+"z.";
+ close;
+ }
+ set Zeny,Zeny-@cost;
+ sc_start SC_Wedding,3600000000,1; //Start Wedding Effect (SC_WEDDING)
+ if (@bride) {
+ set $wed_bride_progress,1;
+ set $wed_bride$,strcharinfo(0);
+ set $wed_bride_sex, sex;
+ if ($@wedding_effect == 1) //Store account id for effect.
+ set $wedding_effect_id, getcharid(3);
+ } else {
+ set $wed_groom_progress,1;
+ set $wed_groom$,strcharinfo(0);
+ set $wed_groom_sex, sex;
+ if ($@wedding_effect == 2) //Store account id for effect.
+ set $wedding_effect_id, getcharid(3);
+ }
+}
+
+//Explain wedding principles...
+function SF_Principles {
+ mes "["+@name$+"]";
+ mes "Weddings are performed by our local Priest with the intent of promoting love and peace among the loving couples.";
+ next;
+ mes "["+@name$+"]";
+ mes "The proposal must be done with prudence and courtesy, once the wedlocks have been made, they cannot be undone.";
+ next;
+ mes "["+@name$+"]";
+ mes "The two who have been joined by marriage must remain together forever until the day death do them apart.";
+ next;
+ mes "["+@name$+"]";
+ if ($@wed_allow == 1)
+ mes "Altough normally only males can wed females (and viceversa), our local Priest is more open-minded than that and he permits all pairings regardless of gender.";
+ else
+ mes "Males may only wed with females, and females only with males, the church will not consent any other kind of partnerships.";
+ next;
+ mes "["+@name$+"]";
+ mes "If there is a significant other with whom you want to spend the rest of your life with, then don't be shy to propose.";
+ next;
+ mes "["+@name$+"]";
+ mes "I wish for many blessings upon couples who wish to live happily ever after...";
+ next;
+}
+
+//Explain the wedding procedure...
+function SF_Procedure {
+ mes "["+@name$+"]";
+ mes "First of all, both groom and bride must register with me.";
+ next;
+ if ($@wed_allow == 1) {
+ mes "["+@name$+"]";
+ mes "The registration requirements are:";
+ mes "- Males must be wearing a "+getitemname(7170)+".";
+ mes "- Females must be wearing a "+getitemname(2338)+".";
+ if ($@wed_veil) mes "- Females must also wear a "+getitemname(2206)+".";
+ if ($@wed_ring) mes "- Both must own a "+getitemname($@wed_ring)+" each.";
+ if ($@wed_groom_reg > 0) mes "- The registration fee for the groom is "+$@wed_groom_reg+"z.";
+ if ($@wed_bride_reg > 0) mes "- The registration fee for the bride is "+$@wed_bride_reg+"z.";
+ } else {
+ mes "["+@name$+"]";
+ mes "The registration requirements for the groom are:";
+ mes "- To be wearing a "+getitemname(7170)+".";
+ if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
+ if ($@wed_groom_reg > 0) mes "- Pay a Registration fee of "+$@wed_groom_reg+"z.";
+ next;
+ mes "["+@name$+"]";
+ mes "The registration requirements for the bride are:";
+ mes "- To be wearing a "+getitemname(2338)+".";
+ if ($@wed_veil) mes "- To be wearing a "+getitemname(2206)+".";
+ if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+".";
+ if ($@wed_bride_reg > 0) mes "- Pay a Registration fee of "+$@wed_bride_reg+"z.";
+ }
+ next;
+ mes "["+@name$+"]";
+ mes "I shouldn't need to mention this, but adopted kids are too young to get married.";
+ mes "Both groom and bride must register within a minute of each other, or the wedding will be cancelled. So be sure you both are ready and meet the registration requirements beforehand.";
+ next;
+ mes "["+@name$+"]";
+ mes "After both have registered with me, you have to go pledge your vows to the Priest and accept your registered partner. If for some reason you reject your registered partner, the wedding will be cancelled...";
+ next;
+ mes "["+@name$+"]";
+ mes "If you both accept each other, then the wedding has been decided and the ceremony will begin.";
+ if ($@wed_ring) {
+ mes "But first, you need to get your rings ready.";
+ next;
+ mes "["+@name$+"]";
+ mes "Talk to the priest once more, and he will exchange your "+getitemname($@wed_ring)+" for a wedding ring. After you both have claimed the rings for exchanging, the ceremony will begin.";
+ }
+ next;
+ mes "["+@name$+"]";
+ mes "If there are various couples who desire to marry, you should keep in order, for the Priest can only handle one wedding at a time.";
+ next;
+}
+}
+
+prt_church.gat,94,99,4 script Sister Lisa 79,{
+ set @name$,"Lisa";
+
+ function SF_DivorceEnd;
+ function SF_InProgress;
+
+ if ($@divorce_progress==1) {
+ goto SF_InProgress;
+ end;
+ }
+
+ do {
+ mes "["+@name$+"]";
+ mes "Divorcing can be such a sad event...";
+ if (getpartnerid() == 0) {
+ mes "People shouldn't make shallow vows to others, don't you think?";
+ close;
+ }
+ mes "You wouldn't want to divorce, by any chance?";
+ next;
+ set @menu, select(
+ "I am happy as I am, thank you.",
+ "Explain the divorce.",
+ "Explain Requirements.",
+ "I want to divorce."
+ );
+ switch (@menu) {
+ case 1:
+ mes "["+@name$+"]";
+ mes "Good to hear.";
+ close;
+ case 2: //Explanation
+ mes "["+@name$+"]";
+ mes "Even though it is said that once the wedlocks have been made they cannot be undone, sometimes it is necessary to undo our mistakes from the past..";
+ next;
+ mes "["+@name$+"]";
+ mes "It is sad, but true. If you happen to have married the wrong person, it is possible to divorce, rather than spend the rest of your life with the wrong one.";
+ next;
+ break;
+ case 3: //Requirement
+ mes "["+@name$+"]";
+ mes "In order to file for divorce, I need you both to agree to it.";
+ mes "After you file in for divorce, your spouse has one minute to agree, and then you will both be divorced.";
+ if ($@wed_divorce_fee > 0) mes "The fee is of "+$@wed_divorce_fee+"z and is paid by the person who confirms the divorce, so plan ahead of time how you will divide the costs.";
+ next;
+ break;
+ case 4: //Divorce
+ mes "["+@name$+"]";
+ mes "You should not regret the choices you've made in life.";
+ mes "Are you positively sure about getting divorced?";
+ next;
+ if (select("Wait... I need to think about it.","Absolutely") != 2) {
+ mes "["+@name$+"]";
+ mes "You should think this through.";
+ close;
+ }
+ mes "["+@name$+"]";
+ set $@divorcee,getpartnerid();
+ set $@divorcer$,strcharinfo(0);
+ set $@divorce_progress,1;
+ initnpctimer;
+ mes "Very well, get your partner to confirm, and I will collect the fee for filing the divorce then.";
+ close;
+ }
+ } while (@menu > 1);
+end;
+
+function SF_InProgress {
+ if (strcharinfo(0) == $@divorcer$) {
+ mes "["+@name$+"]";
+ mes "...I am still waiting for your partner to confirm the divorce procedure.";
+ close;
+ }
+ if (getcharid(0) != $@divorcee) {
+ mes "["+@name$+"]";
+ mes "I am in the progress of divorcing "+$@divorcer$+".";
+ mes "Do you know who the spouse is?";
+ close;
+ }
+ //Confirm...
+ mes "["+@name$+"]";
+ mes $@divorcer$+" has asked to divorce you. If you accept, and have the fee of "+$@wed_divorce_fee+"z at hand, I will proceed to divorce you two.";
+ mes "So, should I proceed with the divorce?";
+ next;
+ if (select("I don't want to divorce....","Yes, we have agreed to this.")!=2) {
+ mes "["+@name$+"]";
+ mes "I hope you can work things out.";
+ emotion e_pat;
+ goto SF_DivorceEnd;
+ close;
+ }
+ if (Zeny < $@wed_divorce_fee) {
+ mes "["+@name$+"]";
+ mes "Well, I can't file your divorce because you don't have enough for the fee. Get your partner to lend you some?";
+ close;
+ }
+ if (!(divorce())) {
+ mes "["+@name$+"]";
+ mes "Where has "+$@divorcer$+" gone to? I can't divorce you unless you both are here...";
+ emotion e_swt2;
+ close;
+ }
+ set Zeny,Zeny-$@wed_divorce_fee;
+ announce $@divorcer$+" has just divorced "+strcharinfo(0)+"...", 8;
+ mes "["+@name$+"]";
+ mes "Your divorce has been filed. You are no longer wed.";
+ emotion e_sob;
+ goto SF_DivorceEnd;
+ close;
+}
+
+function SF_DivorceEnd {
+ stopnpctimer;
+ set $@divorce_progress,0;
+ set $@divorcee,0;
+ set $@divorcer$,"";
+}
+
+OnTimer60000:
+ npctalk "Divorce confirmation time's is up. Where did "+$@divorcer$+"'s spouse go...";
+ emotion e_what;
+ SF_DivorceEnd();
+ end;
+}
diff --git a/npc/other/monster_museum.txt b/npc/other/monster_museum.txt
index a004c62d8..12e7f1bba 100644
--- a/npc/other/monster_museum.txt
+++ b/npc/other/monster_museum.txt
@@ -1,588 +1,588 @@
-//===== eAthena Script =======================================
-//= Juno Monster Museum
-//===== By: ==================================================
-//= Muad_Dib (The Prometheus Project)
-//===== Current Version: =====================================
-//= 1.1a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Juno Monster Museum - Non Player Character Locations
-//= - Information about various monsters
-//===== Additional Comments: =================================
-// 07/06/05 : Added 1st Version. [Muad_Dib]
-//= Adapted to eAthena Scripting Language by [Lance]
-//= 1.1a Fixed typos [Haplo]
-//============================================================
-
-
-yuno_in03.gat,33,17,3 script Guide of Monster Museum 67,{
- mes "[Shenya]";
- mes "Welcome.";
- mes "You are in the Monster Museum.";
- next;
- menu "What is the Monster Museum?",-,"Tip for observing monsters",L_Tip;
- mes "[Shenya]";
- mes "Our Monster Museum is a splendid achievement of Schwarz Project which was secretly";
- mes "accomplished by many sages from Svychervile Academy who were working in Midgard.";
- next;
- mes "[Shenya]";
- mes "Because of their effort, you can easily observe rare monsters of Midgard in here.";
- next;
- mes "[Shenya]";
- mes "Monsters are in the transparent cylinders, which were part of Schwarz Project. The cylinders protects you from the monsters.";
- next;
- mes "[Shenya]";
- mes "Talk to me if you need help.";
- close;
-L_Tip:
- mes "[Shenya]";
- mes "Check 'opaque' in the option key (ALT+O) to observe monsters more clearly.";
- next;
- mes "[Shenya]";
- mes "Talk to me if you need help.";
- close;
-}
-
-//yuno_in03.gat,32,102,1 script Biology Professor 755,{
-// mes "[Ruthy Celsus]";
-// mes "Hmm? What is it? Do you want to take a look at monsters?";
-// next;
-// mes "[Ruthy Celsus]";
-// mes "It is okay to look at them, but do not touch nor make noises.";
-// mes "There are many dangerous stuff here, so be careful.";
-// next;
-// mes "[Ruthy Celsus]";
-// mes "And also tell me if you catch rare monsters.";
-// mes "I will buy your info at high price.";
-// close;
-//}
-
-yuno_in03.gat,36,21,3 script Deviace 1108,{
- end;
-}
-
-yuno_in03.gat,33,21,1 script #Deviace 111,{
- mes " ";
- mes "- Scientific Name : Deviace";
- mes "- Size : Medium";
- mes "- Property : Water";
- next;
- mes "- Description : ";
- mes "It has sucking-disks on top of its round body and lives in the deep ocean.";
- mes "In spite of its fearsome appearance, Deviace is calm and do not attack others first.";
- next;
- mes "However, you should be aware of it because once Deviace gets mad, it casts magic of high level.";
- close;
-}
-
-yuno_in03.gat,36,27,3 script Fur Seal 1317,{
- end;
-}
-
-yuno_in03.gat,33,27,1 script #Fur Seal 111,{
- mes " ";
- mes "- Scientific Name : Fur Seal";
- mes "- Size : Medium";
- mes "- Property : Water";
- next;
- mes "- Description : ";
- mes "They put on an extra hide to cover it's soft skin.";
- mes "Also, their hides are used to make winter clothes.";
- close;
-}
-
-yuno_in03.gat,36,33,3 script Sage Worm 1281,{
- end;
-}
-
-yuno_in03.gat,33,33,1 script #Sage Worm 111,{
- mes " ";
- mes "- Scientific Name : Sage Worm";
- mes "- Size : Small";
- mes "- Property : Neutral";
- next;
- mes "- Description : ";
- mes "It's bottom looks like an animal, but the upper body looks like an old scholar.";
- mes "Sage Worm has weak strength but its intelligence is extraordinary high. They often cures other's critical status.";
- next;
- mes "As expected, they live nearby books or bookcases.";
- close;
-}
-
-yuno_in03.gat,39,39,3 script Penomena 1216,{
- end;
-}
-
-yuno_in03.gat,38,39,1 script #Penomena 111,{
- mes " ";
- mes "- Scientific Name : Penomena";
- mes "- Size : Medium";
- mes "- Property : Poison";
- next;
- mes "- Description : ";
- mes "It has a strong venom and lives in deep oceans or deep tunnels.";
- mes "Penomena has a similar appearance as Hydra but it moves with small dendrites on the sucking-disk.";
- next;
- mes "Also, its many long tentacles with strong venom are threatening opponents in the distance.";
- close;
-}
-
-yuno_in03.gat,39,44,3 script Galapago 1391,{
- end;
-}
-
-yuno_in03.gat,37,44,1 script #Galapago 111,{
- mes " ";
- mes "- Scientific Name : Galapago";
- mes "- Size : Small";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "This monster is a bird, but can't fly because of its heavy weight.";
- mes "They are always equipped with sunglasses and a bottle of drinking water because they are weak against sunlights.";
- next;
- mes "They show greedy on items but, when a stranger appears, they cooperate together to attack the stranger.";
- close;
-}
-
-yuno_in03.gat,38,50,3 script PecoPeco Egg 1047,{
- end;
-}
-
-yuno_in03.gat,34,54,3 script Thief Bug Egg 1048,{
- end;
-}
-
-yuno_in03.gat,12,50,3 script Ant Egg 1097,{
- end;
-}
-
-yuno_in03.gat,10,45,5 script Assaulter 1315,{
- end;
-}
-
-yuno_in03.gat,12,45,1 script #Assaulter 111,{
- mes " ";
- mes "- Scientific Name : Assaulter";
- mes "- Size : Medium";
- mes "- Property : Wind";
- next;
- mes "- Description : ";
- mes "Unlike the other turtles in the Turtle Island, this warrior monster stands on two legs.";
- mes "It always carries a large shuriken on its back. Its body is very agile and has a fast attack speed.";
- next;
- mes "Distinctively, when it is in danger, Assaulter summons another self and attacks together.";
- mes "Their weapons do strong damage, but also their piercing long nails are really threatening.";
- close;
-}
-
-yuno_in03.gat,10,39,5 script Alice 1275,{
- end;
-}
-
-yuno_in03.gat,12,39,1 script #Alice 111,{
- mes " ";
- mes "- Scientific Name : Alice";
- mes "- Size : Medium";
- mes "- Property : Neutral";
- next;
- mes "- Description : ";
- mes "It is a robot that was made to serve duties in the castle, and is still there.";
- mes "Alice is made of hard metal and no one knows what makes her move till this day.";
- close;
-}
-
-yuno_in03.gat,15,33,5 script Violy 1390,{
- end;
-}
-
-yuno_in03.gat,19,33,1 script #Violy 111,{
- mes " ";
- mes "- Scientific Name : Violy";
- mes "- Size : Medium";
- mes "- Property : Neutral";
- next;
- mes "- Description : ";
- mes "Girly monster with blond hair.";
- mes "She always plays her violin. You will suffer from the high frequency of her music.";
- close;
-}
-
-yuno_in03.gat,15,27,5 script Chepet 1250,{
- end;
-}
-
-yuno_in03.gat,19,27,1 script #Chepet 111,{
- mes " ";
- mes "- Scientific Name : Chepet";
- mes "- Size : Medium";
- mes "- Property : Fire";
- next;
- mes "- Description : ";
- mes "It looks like a girl possessed by an evil monster, but it is the evil monster which fools people with its appearance.";
- next;
- mes "Chepet ignites a fire with its large match stick. Is a rare monster because of their small numbers, they live in a limited habitat.";
- close;
-}
-
-yuno_in03.gat,15,21,5 script Raydric 1163,{
- end;
-}
-
-yuno_in03.gat,19,21,1 script #Raydric 111,{
- mes " ";
- mes "- Scientific Name : Raydric";
- mes "- Size : Large";
- mes "- Property : Darkness";
- next;
- mes "- Description : ";
- mes "Soldiers with armor who have no body. According to old studies,";
- mes "the souls of soldiers who once guarded castles were bound to their armor by curses.";
- next;
- mes "They have fast movement speed and strong attacks as guards of the castle.";
- close;
-}
-
-yuno_in03.gat,46,96,3 script Owl Duke 1320,{
- end;
-}
-
-yuno_in03.gat,44,96,1 script #Owl Duke 111,{
- mes " ";
- mes "- Scientific Name : Owl Duke";
- mes "- Size : Large";
- mes "- Property : Neutral";
- next;
- mes "- Description : ";
- mes "An owl with a Duke costume. It's massive body and elegant outfit are appalling.";
- mes "Owl Duke looks like a bird but is a devil with a large feet and sharp talon.";
- next;
- mes "It approaches the enemy silently and casts strong lightning magic.";
- mes "It's moves are full of dignity just like a Duke.";
- close;
-}
-
-yuno_in03.gat,48,100,3 script Marine Sphere 1142,{
- end;
-}
-
-yuno_in03.gat,46,101,1 script #Marine Sphere 111,{
- mes " ";
- mes "- Scientific Name : Marine Sphere";
- mes "- Size : Small";
- mes "- Property : Water";
- next;
- mes "- Description : ";
- mes "Drifting sphere in the ocean, it is known as <Bomb of the Ocean> because of its explosiveness.";
- mes "The structure of the inner sphere is simple, only a tendon and a detonator, however its explosion is very powerful.";
- next;
- mes "If there are other Marine Spheres during the explosion, all of them will explode sequentially.";
- close;
-}
-
-yuno_in03.gat,48,104,3 script Mandragora 1020,{
- end;
-}
-
-yuno_in03.gat,46,105,1 script #Mandragora 111,{
- mes " ";
- mes "- Scientific Name : Mandragora";
- mes "- Size : Medium";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "Man-eating plant that can eat every living thing.";
- mes "Mandragora pokes the victim by using its long tentacle and put it in its giant tube.";
- next;
- mes "On the surface of the Mandragora's tube there is a skull pattern, so the Mandragora pretends to be poisonous but it isn't.";
- mes "The tube contains a digestive fluid of unique fragrance, which have a very strong smell to attract the prey.";
- close;
-}
-
-yuno_in03.gat,48,108,3 script Geographer 1368,{
- end;
-}
-
-yuno_in03.gat,46,108,1 script #Geographer 111,{
- mes " ";
- mes "- Scientific Name : Geographer";
- mes "- Size : Medium";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "Man-eating plant that looks like a sunflower.";
- mes "It disguise itself as an ordinary flower and hunt preys approaching near by.";
- next;
- mes "Although its cousin Mandragora digest it's food in the tube,";
- mes "Geographer chews food because it doesn't have a tube.";
- next;
- mes "Geographer's root is very tough to support the large upper parts of the body.";
- close;
-}
-
-yuno_in03.gat,48,112,3 script Rafflesia 1162,{
- end;
-}
-
-yuno_in03.gat,46,112,1 script #Rafflesia 111,{
- mes " ";
- mes "- Scientific Name : Rafflesia";
- mes "- Size : Small";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "Somehow, this monster is an endangered species.";
- mes "Remaining Rafflesias are very few in a limited habitat,";
- mes "so they are under special protection.";
- next;
- mes "Because there aren't many Rafflesias, researches are not doing well.";
- mes "A few scholars are researching to artificially culture them.";
- close;
-}
-
-yuno_in03.gat,48,116,3 script Stem Worm 1215,{
- end;
-}
-
-yuno_in03.gat,45,116,1 script #Stem Worm 111,{
- mes " ";
- mes "- Scientific Name : Stem Worm";
- mes "- Size : Medium";
- mes "- Property : Wind";
- next;
- mes "- Description : ";
- mes "This is a mutation of Worm Tail. It has a round grizzled grey body with a small head.";
- mes "The hide is made of thin scales, and from the center of the body it's hide is divided into two pieces.";
- next;
- mes "The straight stem on the center of it's back looks like a tail.";
- mes "Stem Worm use this stem to whip others.";
- close;
-}
-
-yuno_in03.gat,44,120,3 script Succubus 1370,{
- end;
-}
-
-yuno_in03.gat,42,120,1 script #Succubus 111,{
- mes " ";
- mes "- Scientific Name : Succubus";
- mes "- Size : Medium";
- mes "- Property : Darkness";
- next;
- mes "- Description : ";
- mes "Devil who seduces people with a beautiful appearance. The male form is called Incubus and the female form is called Succubus.";
- mes "They pick and seduce confused or weak-minded people to wreck them.";
- close;
-}
-
-yuno_in03.gat,39,124,3 script Ancient Mummy 1297,{
- end;
-}
-
-yuno_in03.gat,39,122,1 script #Ancient Mummy 111,{
- mes " ";
- mes "- Scientific Name : Ancient Mummy";
- mes "- Size : Medium";
- mes "- Property : Undead";
- next;
- mes "- Description : ";
- mes "With a glimpse you can see that this ancient mummy is very old.";
- mes "He is wrapped with worn-out bandages.";
- mes "By looking at his luxurious snake headpiece,";
- next;
- mes "we can guess that he was high class and somehow revived from the dead.";
- mes "As he is stuck in a mummy form for so long time, he brutally kills living things.";
- close;
-}
-
-yuno_in03.gat,35,124,3 script Sleeper 1386,{
- end;
-}
-
-yuno_in03.gat,35,122,1 script #Sleeper 111,{
- mes " ";
- mes "- Scientific Name : Sleeper";
- mes "- Size : Medium";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "Formless sandy monster.";
- mes "It burrows itself in the ground and rise when people are walking near by.";
- next;
- mes "Sleepers are smaller than Sandmen and they attack indirectly by making sandy winds rather than direct attacks.";
- close;
-}
-
-yuno_in03.gat,31,124,3 script Megalodon 1064,{
- end;
-}
-
-yuno_in03.gat,31,122,1 script #Megalodon 111,{
- mes " ";
- mes "- Scientific Name : Megalodon";
- mes "- Size : Medium";
- mes "- Property : Undead";
- next;
- mes "- Description : ";
- mes "This monster is made out of bones of dead fish.";
- mes "It peacefully wanders around waterside because they didn't completely lose their old memory.";
- next;
- mes "It has no flesh but bones and stinky scales because it was revived from once decayed corpses.";
- close;
-}
-
-yuno_in03.gat,28,124,5 script Rideword 1195,{
- end;
-}
-
-yuno_in03.gat,28,122,1 script #Rideword 111,{
- mes " ";
- mes "- Scientific Name : Rideword";
- mes "- Size : Small";
- mes "- Property : Neutral";
- next;
- mes "- Description : ";
- mes "It is a magic book with sharp teeth and is controlled by magic powers.";
- mes "Rideword has no intelligence or feelings and was born to kill living things.";
- close;
-}
-
-yuno_in03.gat,24,124,3 script Blazzer 1367,{
- end;
-}
-
-yuno_in03.gat,24,122,1 script #Blazzer 111,{
- mes " ";
- mes "- Scientific Name : Blazzer";
- mes "- Size : Medium";
- mes "- Property : Fire";
- next;
- mes "- Description : ";
- mes "Burning flame which floats around lava as a cloud.";
- mes "The blaze comes out of hard rock and the surface is extremely hot.";
- next;
- mes "Some scholars believe that Blazzer was the origin of a volcanic eruption but it is only a hypothesis.";
- mes "It attacks travelers with a noxious gas from it's mouth.";
- close;
-}
-
-yuno_in03.gat,18,122,5 script Incubus 1374,{
- end;
-}
-
-yuno_in03.gat,19,120,1 script #Incubus 111,{
- mes " ";
- mes "- Scientific Name : Incubus";
- mes "- Size : Medium";
- mes "- Property : Darkness";
- next;
- mes "- Description : ";
- mes "Devil who seduces people a beautiful appearance. Male form is called Incubus and female form is called Succubus.";
- mes "They pick and seduce confused or weak-minded people to wreck them.";
- close;
-}
-
-yuno_in03.gat,16,116,5 script Dragon Tail 1321,{
- end;
-}
-
-yuno_in03.gat,18,116,1 script #Dragon Tail 111,{
- mes " ";
- mes "- Scientific Name : Dragon Tail";
- mes "- Size : Medium";
- mes "- Property : Wind";
- next;
- mes "- Description : ";
- mes "Insect with thick stings on its tail from the Dragonfly family.";
- mes "It sucks up blood of victims with its sting, and the Dragon Tail's hypnotoxine puts enemies to sleep.";
- close;
-}
-
-yuno_in03.gat,16,111,5 script Arclouse 1194,{
- end;
-}
-
-yuno_in03.gat,18,111,1 script #Arclouse 111,{
- mes " ";
- mes "- Scientific Name : Arclouse";
- mes "- Size : Medium";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "It is a monster with a hard shell and roles itself to attack enemies.";
- mes "Usually, Arclouses are found in groups and they are very agile. Their movement speed is as fast as a well-trained PecoPeco.";
- close;
-}
-
-yuno_in03.gat,16,108,5 script Tri-Joint 1279,{
- end;
-}
-
-yuno_in03.gat,18,108,1 script #Tri-Joint 111,{
- mes " ";
- mes "- Scientific Name : Tri-Joint";
- mes "- Size : Small";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "A monster called 'living fossil' because it has been existing from ancient times to today.";
- mes "Tri Joint's body is covered with hard shells, and advanced feelers replaced degenerated eyes.";
- next;
- mes "It moves fast in dark caves.";
- mes "Recently, as their fossils were found in deep caves,";
- mes "studies on evolution of Midgard organisms are speeding up.";
- close;
-}
-
-yuno_in03.gat,16,104,5 script Thief Bug Male 1054,{
- end;
-}
-
-yuno_in03.gat,18,104,1 script #Thief Bug Male 111,{
- mes " ";
- mes "- Scientific Name : Thief Bug Male";
- mes "- Size : Medium";
- mes "- Property : Darkness";
- next;
- mes "- Description : ";
- mes "This is a fully grown Thief Bug with bigger size than others and of blue color.";
- mes "Like other Thief Bugs, it is very agile and collect items.";
- next;
- mes "Male Thief Bugs protects it's family with strong attacks.";
- close;
-}
-
-yuno_in03.gat,16,100,5 script Caterpillar 1300,{
- end;
-}
-
-yuno_in03.gat,18,100,1 script #Caterpillar 111,{
- mes " ";
- mes "- Scientific Name : Caterpillar";
- mes "- Size : Small";
- mes "- Property : Earth";
- next;
- mes "- Description : ";
- mes "Because of a long buried life, it can barely use it's eyes,";
- mes "but it has numerous feelers and a lighting antenna to move around.";
- next;
- mes "There is a hypothesis that Caterpillar is the larva of Creamy Fear, the mutation of Creamy.";
- close;
-}
-
-yuno_in03.gat,18,96,5 script Wanderer 1208,{
- end;
-}
-
-yuno_in03.gat,20,96,1 script #Wanderer 111,{
- mes " ";
- mes "- Scientific Name : Wanderer";
- mes "- Size : Medium";
- mes "- Property : Wind";
- next;
- mes "- Description : ";
- mes "Sword master revived by dark magic. By looking at his magnificent swordsmanship, we guess that he was a very skillful swordsman before.";
- mes "As soon as he draws his sword, his opponents are sliced by him.";
- close;
-}
+//===== eAthena Script =======================================
+//= Juno Monster Museum
+//===== By: ==================================================
+//= Muad_Dib (The Prometheus Project)
+//===== Current Version: =====================================
+//= 1.1a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Juno Monster Museum - Non Player Character Locations
+//= - Information about various monsters
+//===== Additional Comments: =================================
+// 07/06/05 : Added 1st Version. [Muad_Dib]
+//= Adapted to eAthena Scripting Language by [Lance]
+//= 1.1a Fixed typos [Haplo]
+//============================================================
+
+
+yuno_in03.gat,33,17,3 script Guide of Monster Museum 67,{
+ mes "[Shenya]";
+ mes "Welcome.";
+ mes "You are in the Monster Museum.";
+ next;
+ menu "What is the Monster Museum?",-,"Tip for observing monsters",L_Tip;
+ mes "[Shenya]";
+ mes "Our Monster Museum is a splendid achievement of Schwarz Project which was secretly";
+ mes "accomplished by many sages from Svychervile Academy who were working in Midgard.";
+ next;
+ mes "[Shenya]";
+ mes "Because of their effort, you can easily observe rare monsters of Midgard in here.";
+ next;
+ mes "[Shenya]";
+ mes "Monsters are in the transparent cylinders, which were part of Schwarz Project. The cylinders protects you from the monsters.";
+ next;
+ mes "[Shenya]";
+ mes "Talk to me if you need help.";
+ close;
+L_Tip:
+ mes "[Shenya]";
+ mes "Check 'opaque' in the option key (ALT+O) to observe monsters more clearly.";
+ next;
+ mes "[Shenya]";
+ mes "Talk to me if you need help.";
+ close;
+}
+
+//yuno_in03.gat,32,102,1 script Biology Professor 755,{
+// mes "[Ruthy Celsus]";
+// mes "Hmm? What is it? Do you want to take a look at monsters?";
+// next;
+// mes "[Ruthy Celsus]";
+// mes "It is okay to look at them, but do not touch nor make noises.";
+// mes "There are many dangerous stuff here, so be careful.";
+// next;
+// mes "[Ruthy Celsus]";
+// mes "And also tell me if you catch rare monsters.";
+// mes "I will buy your info at high price.";
+// close;
+//}
+
+yuno_in03.gat,36,21,3 script Deviace 1108,{
+ end;
+}
+
+yuno_in03.gat,33,21,1 script #Deviace 111,{
+ mes " ";
+ mes "- Scientific Name : Deviace";
+ mes "- Size : Medium";
+ mes "- Property : Water";
+ next;
+ mes "- Description : ";
+ mes "It has sucking-disks on top of its round body and lives in the deep ocean.";
+ mes "In spite of its fearsome appearance, Deviace is calm and do not attack others first.";
+ next;
+ mes "However, you should be aware of it because once Deviace gets mad, it casts magic of high level.";
+ close;
+}
+
+yuno_in03.gat,36,27,3 script Fur Seal 1317,{
+ end;
+}
+
+yuno_in03.gat,33,27,1 script #Fur Seal 111,{
+ mes " ";
+ mes "- Scientific Name : Fur Seal";
+ mes "- Size : Medium";
+ mes "- Property : Water";
+ next;
+ mes "- Description : ";
+ mes "They put on an extra hide to cover it's soft skin.";
+ mes "Also, their hides are used to make winter clothes.";
+ close;
+}
+
+yuno_in03.gat,36,33,3 script Sage Worm 1281,{
+ end;
+}
+
+yuno_in03.gat,33,33,1 script #Sage Worm 111,{
+ mes " ";
+ mes "- Scientific Name : Sage Worm";
+ mes "- Size : Small";
+ mes "- Property : Neutral";
+ next;
+ mes "- Description : ";
+ mes "It's bottom looks like an animal, but the upper body looks like an old scholar.";
+ mes "Sage Worm has weak strength but its intelligence is extraordinary high. They often cures other's critical status.";
+ next;
+ mes "As expected, they live nearby books or bookcases.";
+ close;
+}
+
+yuno_in03.gat,39,39,3 script Penomena 1216,{
+ end;
+}
+
+yuno_in03.gat,38,39,1 script #Penomena 111,{
+ mes " ";
+ mes "- Scientific Name : Penomena";
+ mes "- Size : Medium";
+ mes "- Property : Poison";
+ next;
+ mes "- Description : ";
+ mes "It has a strong venom and lives in deep oceans or deep tunnels.";
+ mes "Penomena has a similar appearance as Hydra but it moves with small dendrites on the sucking-disk.";
+ next;
+ mes "Also, its many long tentacles with strong venom are threatening opponents in the distance.";
+ close;
+}
+
+yuno_in03.gat,39,44,3 script Galapago 1391,{
+ end;
+}
+
+yuno_in03.gat,37,44,1 script #Galapago 111,{
+ mes " ";
+ mes "- Scientific Name : Galapago";
+ mes "- Size : Small";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "This monster is a bird, but can't fly because of its heavy weight.";
+ mes "They are always equipped with sunglasses and a bottle of drinking water because they are weak against sunlights.";
+ next;
+ mes "They show greedy on items but, when a stranger appears, they cooperate together to attack the stranger.";
+ close;
+}
+
+yuno_in03.gat,38,50,3 script PecoPeco Egg 1047,{
+ end;
+}
+
+yuno_in03.gat,34,54,3 script Thief Bug Egg 1048,{
+ end;
+}
+
+yuno_in03.gat,12,50,3 script Ant Egg 1097,{
+ end;
+}
+
+yuno_in03.gat,10,45,5 script Assaulter 1315,{
+ end;
+}
+
+yuno_in03.gat,12,45,1 script #Assaulter 111,{
+ mes " ";
+ mes "- Scientific Name : Assaulter";
+ mes "- Size : Medium";
+ mes "- Property : Wind";
+ next;
+ mes "- Description : ";
+ mes "Unlike the other turtles in the Turtle Island, this warrior monster stands on two legs.";
+ mes "It always carries a large shuriken on its back. Its body is very agile and has a fast attack speed.";
+ next;
+ mes "Distinctively, when it is in danger, Assaulter summons another self and attacks together.";
+ mes "Their weapons do strong damage, but also their piercing long nails are really threatening.";
+ close;
+}
+
+yuno_in03.gat,10,39,5 script Alice 1275,{
+ end;
+}
+
+yuno_in03.gat,12,39,1 script #Alice 111,{
+ mes " ";
+ mes "- Scientific Name : Alice";
+ mes "- Size : Medium";
+ mes "- Property : Neutral";
+ next;
+ mes "- Description : ";
+ mes "It is a robot that was made to serve duties in the castle, and is still there.";
+ mes "Alice is made of hard metal and no one knows what makes her move till this day.";
+ close;
+}
+
+yuno_in03.gat,15,33,5 script Violy 1390,{
+ end;
+}
+
+yuno_in03.gat,19,33,1 script #Violy 111,{
+ mes " ";
+ mes "- Scientific Name : Violy";
+ mes "- Size : Medium";
+ mes "- Property : Neutral";
+ next;
+ mes "- Description : ";
+ mes "Girly monster with blond hair.";
+ mes "She always plays her violin. You will suffer from the high frequency of her music.";
+ close;
+}
+
+yuno_in03.gat,15,27,5 script Chepet 1250,{
+ end;
+}
+
+yuno_in03.gat,19,27,1 script #Chepet 111,{
+ mes " ";
+ mes "- Scientific Name : Chepet";
+ mes "- Size : Medium";
+ mes "- Property : Fire";
+ next;
+ mes "- Description : ";
+ mes "It looks like a girl possessed by an evil monster, but it is the evil monster which fools people with its appearance.";
+ next;
+ mes "Chepet ignites a fire with its large match stick. Is a rare monster because of their small numbers, they live in a limited habitat.";
+ close;
+}
+
+yuno_in03.gat,15,21,5 script Raydric 1163,{
+ end;
+}
+
+yuno_in03.gat,19,21,1 script #Raydric 111,{
+ mes " ";
+ mes "- Scientific Name : Raydric";
+ mes "- Size : Large";
+ mes "- Property : Darkness";
+ next;
+ mes "- Description : ";
+ mes "Soldiers with armor who have no body. According to old studies,";
+ mes "the souls of soldiers who once guarded castles were bound to their armor by curses.";
+ next;
+ mes "They have fast movement speed and strong attacks as guards of the castle.";
+ close;
+}
+
+yuno_in03.gat,46,96,3 script Owl Duke 1320,{
+ end;
+}
+
+yuno_in03.gat,44,96,1 script #Owl Duke 111,{
+ mes " ";
+ mes "- Scientific Name : Owl Duke";
+ mes "- Size : Large";
+ mes "- Property : Neutral";
+ next;
+ mes "- Description : ";
+ mes "An owl with a Duke costume. It's massive body and elegant outfit are appalling.";
+ mes "Owl Duke looks like a bird but is a devil with a large feet and sharp talon.";
+ next;
+ mes "It approaches the enemy silently and casts strong lightning magic.";
+ mes "It's moves are full of dignity just like a Duke.";
+ close;
+}
+
+yuno_in03.gat,48,100,3 script Marine Sphere 1142,{
+ end;
+}
+
+yuno_in03.gat,46,101,1 script #Marine Sphere 111,{
+ mes " ";
+ mes "- Scientific Name : Marine Sphere";
+ mes "- Size : Small";
+ mes "- Property : Water";
+ next;
+ mes "- Description : ";
+ mes "Drifting sphere in the ocean, it is known as <Bomb of the Ocean> because of its explosiveness.";
+ mes "The structure of the inner sphere is simple, only a tendon and a detonator, however its explosion is very powerful.";
+ next;
+ mes "If there are other Marine Spheres during the explosion, all of them will explode sequentially.";
+ close;
+}
+
+yuno_in03.gat,48,104,3 script Mandragora 1020,{
+ end;
+}
+
+yuno_in03.gat,46,105,1 script #Mandragora 111,{
+ mes " ";
+ mes "- Scientific Name : Mandragora";
+ mes "- Size : Medium";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "Man-eating plant that can eat every living thing.";
+ mes "Mandragora pokes the victim by using its long tentacle and put it in its giant tube.";
+ next;
+ mes "On the surface of the Mandragora's tube there is a skull pattern, so the Mandragora pretends to be poisonous but it isn't.";
+ mes "The tube contains a digestive fluid of unique fragrance, which have a very strong smell to attract the prey.";
+ close;
+}
+
+yuno_in03.gat,48,108,3 script Geographer 1368,{
+ end;
+}
+
+yuno_in03.gat,46,108,1 script #Geographer 111,{
+ mes " ";
+ mes "- Scientific Name : Geographer";
+ mes "- Size : Medium";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "Man-eating plant that looks like a sunflower.";
+ mes "It disguise itself as an ordinary flower and hunt preys approaching near by.";
+ next;
+ mes "Although its cousin Mandragora digest it's food in the tube,";
+ mes "Geographer chews food because it doesn't have a tube.";
+ next;
+ mes "Geographer's root is very tough to support the large upper parts of the body.";
+ close;
+}
+
+yuno_in03.gat,48,112,3 script Rafflesia 1162,{
+ end;
+}
+
+yuno_in03.gat,46,112,1 script #Rafflesia 111,{
+ mes " ";
+ mes "- Scientific Name : Rafflesia";
+ mes "- Size : Small";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "Somehow, this monster is an endangered species.";
+ mes "Remaining Rafflesias are very few in a limited habitat,";
+ mes "so they are under special protection.";
+ next;
+ mes "Because there aren't many Rafflesias, researches are not doing well.";
+ mes "A few scholars are researching to artificially culture them.";
+ close;
+}
+
+yuno_in03.gat,48,116,3 script Stem Worm 1215,{
+ end;
+}
+
+yuno_in03.gat,45,116,1 script #Stem Worm 111,{
+ mes " ";
+ mes "- Scientific Name : Stem Worm";
+ mes "- Size : Medium";
+ mes "- Property : Wind";
+ next;
+ mes "- Description : ";
+ mes "This is a mutation of Worm Tail. It has a round grizzled grey body with a small head.";
+ mes "The hide is made of thin scales, and from the center of the body it's hide is divided into two pieces.";
+ next;
+ mes "The straight stem on the center of it's back looks like a tail.";
+ mes "Stem Worm use this stem to whip others.";
+ close;
+}
+
+yuno_in03.gat,44,120,3 script Succubus 1370,{
+ end;
+}
+
+yuno_in03.gat,42,120,1 script #Succubus 111,{
+ mes " ";
+ mes "- Scientific Name : Succubus";
+ mes "- Size : Medium";
+ mes "- Property : Darkness";
+ next;
+ mes "- Description : ";
+ mes "Devil who seduces people with a beautiful appearance. The male form is called Incubus and the female form is called Succubus.";
+ mes "They pick and seduce confused or weak-minded people to wreck them.";
+ close;
+}
+
+yuno_in03.gat,39,124,3 script Ancient Mummy 1297,{
+ end;
+}
+
+yuno_in03.gat,39,122,1 script #Ancient Mummy 111,{
+ mes " ";
+ mes "- Scientific Name : Ancient Mummy";
+ mes "- Size : Medium";
+ mes "- Property : Undead";
+ next;
+ mes "- Description : ";
+ mes "With a glimpse you can see that this ancient mummy is very old.";
+ mes "He is wrapped with worn-out bandages.";
+ mes "By looking at his luxurious snake headpiece,";
+ next;
+ mes "we can guess that he was high class and somehow revived from the dead.";
+ mes "As he is stuck in a mummy form for so long time, he brutally kills living things.";
+ close;
+}
+
+yuno_in03.gat,35,124,3 script Sleeper 1386,{
+ end;
+}
+
+yuno_in03.gat,35,122,1 script #Sleeper 111,{
+ mes " ";
+ mes "- Scientific Name : Sleeper";
+ mes "- Size : Medium";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "Formless sandy monster.";
+ mes "It burrows itself in the ground and rise when people are walking near by.";
+ next;
+ mes "Sleepers are smaller than Sandmen and they attack indirectly by making sandy winds rather than direct attacks.";
+ close;
+}
+
+yuno_in03.gat,31,124,3 script Megalodon 1064,{
+ end;
+}
+
+yuno_in03.gat,31,122,1 script #Megalodon 111,{
+ mes " ";
+ mes "- Scientific Name : Megalodon";
+ mes "- Size : Medium";
+ mes "- Property : Undead";
+ next;
+ mes "- Description : ";
+ mes "This monster is made out of bones of dead fish.";
+ mes "It peacefully wanders around waterside because they didn't completely lose their old memory.";
+ next;
+ mes "It has no flesh but bones and stinky scales because it was revived from once decayed corpses.";
+ close;
+}
+
+yuno_in03.gat,28,124,5 script Rideword 1195,{
+ end;
+}
+
+yuno_in03.gat,28,122,1 script #Rideword 111,{
+ mes " ";
+ mes "- Scientific Name : Rideword";
+ mes "- Size : Small";
+ mes "- Property : Neutral";
+ next;
+ mes "- Description : ";
+ mes "It is a magic book with sharp teeth and is controlled by magic powers.";
+ mes "Rideword has no intelligence or feelings and was born to kill living things.";
+ close;
+}
+
+yuno_in03.gat,24,124,3 script Blazzer 1367,{
+ end;
+}
+
+yuno_in03.gat,24,122,1 script #Blazzer 111,{
+ mes " ";
+ mes "- Scientific Name : Blazzer";
+ mes "- Size : Medium";
+ mes "- Property : Fire";
+ next;
+ mes "- Description : ";
+ mes "Burning flame which floats around lava as a cloud.";
+ mes "The blaze comes out of hard rock and the surface is extremely hot.";
+ next;
+ mes "Some scholars believe that Blazzer was the origin of a volcanic eruption but it is only a hypothesis.";
+ mes "It attacks travelers with a noxious gas from it's mouth.";
+ close;
+}
+
+yuno_in03.gat,18,122,5 script Incubus 1374,{
+ end;
+}
+
+yuno_in03.gat,19,120,1 script #Incubus 111,{
+ mes " ";
+ mes "- Scientific Name : Incubus";
+ mes "- Size : Medium";
+ mes "- Property : Darkness";
+ next;
+ mes "- Description : ";
+ mes "Devil who seduces people a beautiful appearance. Male form is called Incubus and female form is called Succubus.";
+ mes "They pick and seduce confused or weak-minded people to wreck them.";
+ close;
+}
+
+yuno_in03.gat,16,116,5 script Dragon Tail 1321,{
+ end;
+}
+
+yuno_in03.gat,18,116,1 script #Dragon Tail 111,{
+ mes " ";
+ mes "- Scientific Name : Dragon Tail";
+ mes "- Size : Medium";
+ mes "- Property : Wind";
+ next;
+ mes "- Description : ";
+ mes "Insect with thick stings on its tail from the Dragonfly family.";
+ mes "It sucks up blood of victims with its sting, and the Dragon Tail's hypnotoxine puts enemies to sleep.";
+ close;
+}
+
+yuno_in03.gat,16,111,5 script Arclouse 1194,{
+ end;
+}
+
+yuno_in03.gat,18,111,1 script #Arclouse 111,{
+ mes " ";
+ mes "- Scientific Name : Arclouse";
+ mes "- Size : Medium";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "It is a monster with a hard shell and roles itself to attack enemies.";
+ mes "Usually, Arclouses are found in groups and they are very agile. Their movement speed is as fast as a well-trained PecoPeco.";
+ close;
+}
+
+yuno_in03.gat,16,108,5 script Tri-Joint 1279,{
+ end;
+}
+
+yuno_in03.gat,18,108,1 script #Tri-Joint 111,{
+ mes " ";
+ mes "- Scientific Name : Tri-Joint";
+ mes "- Size : Small";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "A monster called 'living fossil' because it has been existing from ancient times to today.";
+ mes "Tri Joint's body is covered with hard shells, and advanced feelers replaced degenerated eyes.";
+ next;
+ mes "It moves fast in dark caves.";
+ mes "Recently, as their fossils were found in deep caves,";
+ mes "studies on evolution of Midgard organisms are speeding up.";
+ close;
+}
+
+yuno_in03.gat,16,104,5 script Thief Bug Male 1054,{
+ end;
+}
+
+yuno_in03.gat,18,104,1 script #Thief Bug Male 111,{
+ mes " ";
+ mes "- Scientific Name : Thief Bug Male";
+ mes "- Size : Medium";
+ mes "- Property : Darkness";
+ next;
+ mes "- Description : ";
+ mes "This is a fully grown Thief Bug with bigger size than others and of blue color.";
+ mes "Like other Thief Bugs, it is very agile and collect items.";
+ next;
+ mes "Male Thief Bugs protects it's family with strong attacks.";
+ close;
+}
+
+yuno_in03.gat,16,100,5 script Caterpillar 1300,{
+ end;
+}
+
+yuno_in03.gat,18,100,1 script #Caterpillar 111,{
+ mes " ";
+ mes "- Scientific Name : Caterpillar";
+ mes "- Size : Small";
+ mes "- Property : Earth";
+ next;
+ mes "- Description : ";
+ mes "Because of a long buried life, it can barely use it's eyes,";
+ mes "but it has numerous feelers and a lighting antenna to move around.";
+ next;
+ mes "There is a hypothesis that Caterpillar is the larva of Creamy Fear, the mutation of Creamy.";
+ close;
+}
+
+yuno_in03.gat,18,96,5 script Wanderer 1208,{
+ end;
+}
+
+yuno_in03.gat,20,96,1 script #Wanderer 111,{
+ mes " ";
+ mes "- Scientific Name : Wanderer";
+ mes "- Size : Medium";
+ mes "- Property : Wind";
+ next;
+ mes "- Description : ";
+ mes "Sword master revived by dark magic. By looking at his magnificent swordsmanship, we guess that he was a very skillful swordsman before.";
+ mes "As soon as he draws his sword, his opponents are sliced by him.";
+ close;
+}
diff --git a/npc/other/msg_boards.txt b/npc/other/msg_boards.txt
index f4db8751c..d83c5ef95 100644
--- a/npc/other/msg_boards.txt
+++ b/npc/other/msg_boards.txt
@@ -1,134 +1,134 @@
-//===== eAthena Script =======================================
-//= Message Boards
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Rearranged [Lupus]
-//= Fixed spelling mistakes. [Nexon]
-//= 1.3 Removed Duplicates [Silent]
-//============================================================
-
-
-
-//=======================================================================//
-// Al De Baran //
-//=======================================================================//
-// Welcome Sign ------------------------------------------------
-aldebaran.gat,133,104,1 script Welcome Sign::ws_aldebaran 111,{
- mes "~sign reads....~";
- mes "Hello and enjoy your visit to Aldebaran! Aldebaran is the mystical city of clocks and Kafras!";
- close;
-}
-
-//=======================================================================//
-// Alberta //
-//=======================================================================//
-// Sign: Alberta Harbor -----------------------------------------------
-//alberta.gat,35,241,1 script Alberta Harbor 111,{
-// mes "~sign reads....~";
-// mes "Welcome to the port city Alberta! Alberta is the city of the sea! A tourist delight!";
-// close;
-//}
-
-// Welcome Sign -----------------------------------------------
-alberta.gat,196,152,1 script Welcome Sign::ws_alberta 111,{
- mes "~sign reads...~";
- mes "Welcome to the port city Alberta! Alberta is the city of the sea! A tourist delight!";
- close;
-}
-
-// Sign: Merchant Guild ------------------------------------------
-alberta.gat,37,39,1 script Merchant Guild 111,{
- mes "~sign reads...~";
- mes "Enjoy the art of buying and selling? Love making unbeatable deals?";
- mes "Then the Alberta Merchant Guild is perfect for you!";
- mes "Come on inn and find out all you need to know about becoming a Merchant.";
- close;
-}
-
-
-//=======================================================================//
-// Geffen //
-//=======================================================================//
-// Welcome Sign ----------------------------------------------
-geffen.gat,116,58,1 script Welcome Sign::ws_geffen 111,{
- mes "~sign reads...~";
- mes "Greetings!! You are in the wonderful city of Geffen! Geffen is the city of Magic and home to Mages and Wizards!.";
- close;
-}
-
-// Sign: Geffen Tower Sign ----------------------------------------------
-geffen.gat,113,104,1 script Geffen Tower 111,{
- mes "~sign reads...~";
- mes "This is the Geffen Tower, home to the Wizard Academy as well as the infamous Geffen Dungeon. Novices beware!!!";
- close;
-}
-
-// Sign: Blacksmith Guild -------------------------------------------
-geffen.gat,184,61,1 script Blacksmith Guild 111,{
- mes "~sign reads...~";
- mes "This is the Blacksmith Guild.";
- close;
-}
-
-// Sign Post -----------------------------------------------------------
-geffen.gat,119,190,0 script Sign Post#01 111,{
- mes "~sign reads...~";
- mes "North to Geffen Fields";
- mes "Northeast to Al De Baran";
- mes "Northwest to Glast Heim";
- mes "East to Geffen Fields";
- mes "South to Morroc";
- mes "Southeast to Prontera";
- mes "Further Southeast to Alberta";
- mes "Further Southwest to Comodo";
- mes "West to Geffen Fields";
- close;
-}
-
-
-//=======================================================================//
-// Morroc //
-//=======================================================================//
-
-// Sign: Inn ----------------------------------------------------------
-morocc.gat,272,272,1 script Morroc Town Inn 111,{
- mes "~sign reads....~";
- mes "Welcome weary travelers! Stay the night at the Morroc Town Inn.";
- close;
-}
-
-
-//=======================================================================//
-// Payon //
-//=======================================================================//
-
-
-
-//=======================================================================//
-// Prontera //
-//=======================================================================//
-// Welcome Sign -----------------------------------------------------------
-prontera.gat,156,197,1 script Welcome Sign::ws_prontera 111,{
- mes"~sign reads...~";
- mes "You've found yourself in the great city of Prontera! Prontera is one of the largest cities in Rune-Midgard and is home to the Prontera Chivalry!";
- close;
-}
-
-// Sign Post ----------------------------------------------------------------
-prontera.gat,158,213,1 script Sign Post#02 111,{
- mes "~ the sign post reads ~";
- mes "North to Prontera Castle";
- mes "Farther North to Al De Baran";
- mes "Northwest to Geffen";
- mes "East to Prontera Fields";
- mes "South to Prontera Fields";
- mes "Farther Southeast to Alberta";
- close;
+//===== eAthena Script =======================================
+//= Message Boards
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Rearranged [Lupus]
+//= Fixed spelling mistakes. [Nexon]
+//= 1.3 Removed Duplicates [Silent]
+//============================================================
+
+
+
+//=======================================================================//
+// Al De Baran //
+//=======================================================================//
+// Welcome Sign ------------------------------------------------
+aldebaran.gat,133,104,1 script Welcome Sign::ws_aldebaran 111,{
+ mes "~sign reads....~";
+ mes "Hello and enjoy your visit to Aldebaran! Aldebaran is the mystical city of clocks and Kafras!";
+ close;
+}
+
+//=======================================================================//
+// Alberta //
+//=======================================================================//
+// Sign: Alberta Harbor -----------------------------------------------
+//alberta.gat,35,241,1 script Alberta Harbor 111,{
+// mes "~sign reads....~";
+// mes "Welcome to the port city Alberta! Alberta is the city of the sea! A tourist delight!";
+// close;
+//}
+
+// Welcome Sign -----------------------------------------------
+alberta.gat,196,152,1 script Welcome Sign::ws_alberta 111,{
+ mes "~sign reads...~";
+ mes "Welcome to the port city Alberta! Alberta is the city of the sea! A tourist delight!";
+ close;
+}
+
+// Sign: Merchant Guild ------------------------------------------
+alberta.gat,37,39,1 script Merchant Guild 111,{
+ mes "~sign reads...~";
+ mes "Enjoy the art of buying and selling? Love making unbeatable deals?";
+ mes "Then the Alberta Merchant Guild is perfect for you!";
+ mes "Come on inn and find out all you need to know about becoming a Merchant.";
+ close;
+}
+
+
+//=======================================================================//
+// Geffen //
+//=======================================================================//
+// Welcome Sign ----------------------------------------------
+geffen.gat,116,58,1 script Welcome Sign::ws_geffen 111,{
+ mes "~sign reads...~";
+ mes "Greetings!! You are in the wonderful city of Geffen! Geffen is the city of Magic and home to Mages and Wizards!.";
+ close;
+}
+
+// Sign: Geffen Tower Sign ----------------------------------------------
+geffen.gat,113,104,1 script Geffen Tower 111,{
+ mes "~sign reads...~";
+ mes "This is the Geffen Tower, home to the Wizard Academy as well as the infamous Geffen Dungeon. Novices beware!!!";
+ close;
+}
+
+// Sign: Blacksmith Guild -------------------------------------------
+geffen.gat,184,61,1 script Blacksmith Guild 111,{
+ mes "~sign reads...~";
+ mes "This is the Blacksmith Guild.";
+ close;
+}
+
+// Sign Post -----------------------------------------------------------
+geffen.gat,119,190,0 script Sign Post#01 111,{
+ mes "~sign reads...~";
+ mes "North to Geffen Fields";
+ mes "Northeast to Al De Baran";
+ mes "Northwest to Glast Heim";
+ mes "East to Geffen Fields";
+ mes "South to Morroc";
+ mes "Southeast to Prontera";
+ mes "Further Southeast to Alberta";
+ mes "Further Southwest to Comodo";
+ mes "West to Geffen Fields";
+ close;
+}
+
+
+//=======================================================================//
+// Morroc //
+//=======================================================================//
+
+// Sign: Inn ----------------------------------------------------------
+morocc.gat,272,272,1 script Morroc Town Inn 111,{
+ mes "~sign reads....~";
+ mes "Welcome weary travelers! Stay the night at the Morroc Town Inn.";
+ close;
+}
+
+
+//=======================================================================//
+// Payon //
+//=======================================================================//
+
+
+
+//=======================================================================//
+// Prontera //
+//=======================================================================//
+// Welcome Sign -----------------------------------------------------------
+prontera.gat,156,197,1 script Welcome Sign::ws_prontera 111,{
+ mes"~sign reads...~";
+ mes "You've found yourself in the great city of Prontera! Prontera is one of the largest cities in Rune-Midgard and is home to the Prontera Chivalry!";
+ close;
+}
+
+// Sign Post ----------------------------------------------------------------
+prontera.gat,158,213,1 script Sign Post#02 111,{
+ mes "~ the sign post reads ~";
+ mes "North to Prontera Castle";
+ mes "Farther North to Al De Baran";
+ mes "Northwest to Geffen";
+ mes "East to Prontera Fields";
+ mes "South to Prontera Fields";
+ mes "Farther Southeast to Alberta";
+ close;
} \ No newline at end of file
diff --git a/npc/other/powernpc.txt b/npc/other/powernpc.txt
index 94539780e..4d89e0c5d 100644
--- a/npc/other/powernpc.txt
+++ b/npc/other/powernpc.txt
@@ -1,332 +1,332 @@
-//===== eAthena Script =======================================
-//= Official Gonryun Power Arena
-//===== By: ==================================================
-//= KarLaeda (Aegis script cnversion)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Athena SVN 9000+
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-gonryun.gat,180,118,4 script Iron man#gnp 85,{
- if (countitem(1201) > 0) {
- mes "- Wait a minute !! -";
- mes "- Currently you're carrying -";
- mes "- too many items with you. -";
- mes "- Please try again -";
- mes "- after you loose some weight. -";
- close;
- }
- if (BaseJob == Job_Novice) {
- mes "[Songmoodoo]";
- mes "Children are not allowed in here.";
- close;
- }
- if (in_battle == 3) set in_battle,1;
- if (in_battle < 1) {
- mes "[Songmoodoo]";
- mes "Hey hey~ This is not something";
- mes "You can see everyday.";
- mes "Oh~ you look strong!";
- mes "Wanna try?";
- next;
- switch(select("Why not?:?????:No thanks.")){
- case 1:
- mes "[Songmoodoo]";
- mes "Haha~ I knew you would try.";
- mes "If you could lift this up,";
- mes "I'll tell you something interesting.";
- mes "Ready?";
- next;
- mes "^0000FFSongmoodoo pointed to a rock";
- mes "and asked you to lift.";
- if (BaseJob < Job_Knight) {
- if (checkweight(7049,690)) {
- mes "^0000FFYou lifted the Stone lightly.^000000";
- set in_battle,1;
- getitem 7049,690; // Stone
- next;
- emotion e_no1;
- mes "[Songmoodoo]";
- mes "Wow~ Excellent~";
- mes "I'll take you to someplace nice";
- mes "next time I see you.";
- mes "See ya~";
- } else {
- mes "Looks too heavy for you.^000000";
- next;
- mes "[Songmoodoo]";
- mes "You are yet lack of training.";
- mes "Come after more practice.";
- }
- } else if (BaseClass == Job_Swordman || BaseClass == Job_Thief || BaseClass == Job_Merchant || BaseJob == Job_Monk) {
- if (checkweight(7049,1100)) {
- mes "^0000FFYou lifted the Stone lightly.^000000";
- set in_battle,1;
- getitem 7049,1100; // Stone
- next;
- emotion e_no1;
- mes "[Songmoodoo]";
- mes "Wow~ Excellent~";
- mes "I'll take you to someplace nice";
- mes "next time I see you.";
- mes "See ya~";
- } else {
- mes "Seemed too heavy to lift.^000000";
- next;
- mes "[Songmoodoo]";
- mes "You are yet lack of training.";
- mes "come after more practice.";
- }
- } else {
- if (checkweight(7049,730)) {
- mes "^0000FFYou lifted the Stone lightly.^000000";
- set in_battle,1;
- getitem 7049,730; // Stone
- next;
- emotion e_no1;
- mes "[Songmoodoo]";
- mes "Wow~ Excellent~";
- mes "I'll take you to someplace nice";
- mes "next time I see you.";
- mes "See ya~";
- } else {
- mes "Seemed too heavy to lift.^000000";
- next;
- mes "[Songmoodoo]";
- mes "You are yet lack of training.";
- mes "come after more practice.";
- }
- }
- break;
- case 2:
- mes "[Songmoodoo]";
- mes "That's not a big deal.";
- mes "If you believe you're strong,";
- mes "This might be a good chance to experience";
- mes "something new. Wanna try??";
- break;
- case 3:
- mes "[Songmoodoo]";
- mes "I guess not..";
- mes "....";
- emotion e_pif;
- break;
- }
- } else if (in_battle == 1) {
- mes "[Songmoodoo]";
- mes "Good to see you again!";
- mes "Wanna go??";
- next;
- if (select("Sure:Maybe next time") == 1) {
- mes "[Songmoodoo]";
- mes "Good! Haha.";
- mes "I like your confidence.";
- mes "Good luck on you~";
- close2;
- warp "gon_test.gat",53,6;
- end;
- } else {
- mes "[Songmoodoo]";
- mes "well..";
- mes "alright.";
- mes "I'll see you next time then.";
- }
- } else {
- mes "[Songmoodoo]";
- mes "You ran away from there?";
- mes "Guess you're not strong enough?";
- mes "I'll give you another chance.";
- mes "See you again.";
- emotion e_pif;
- set in_battle,1;
- }
- close;
-}
-
-gon_test.gat,50,14,4 script Administrator#gnp 780,{
- mes "[Administrator]";
- if (BaseJob == Job_Novice) {
- mes "Children are not allowed in here.";
- close;
- }
- if ($@in_battle) {
- mes "Sorry, a field of fight";
- mes "is occupied right now.";
- mes "Try again later.";
- close;
- }
- mes "Are you ready?";
- mes "";
- mes "Remember, you have to pay";
- mes "500z to fight.";
- next;
- if (select("Yes, let me fight!:One moment, please.") == 2) {
- mes "[Administrator]";
- mes "Ok, see you later.";
- close;
- }
- if (Zeny < 500) {
- mes "[Administrator]";
- mes "I'm sorry but you don't have enough zeny.";
- close;
- }
- set Zeny,Zeny - 500;
- set in_battle,1;
- warp "gon_test.gat",42,86;
- set $@in_battle,1;
- setnpctimer 0,"Summoner#gnp";
- startnpctimer "Summoner#gnp";
- end;
-}
-
-gon_test.gat,42,89,4 script Summoner#gnp 774,{
- mes "[SongYeunWoo]";
- if (in_battle == 3) {
- mes "Please come back after registration.";
- close;
- } else if (in_battle == 2) {
- mes "You had a single match already.";
- mes "You can have a match once at a time.";
- mes "Please re-enter if you want a match";
- mes "with other monsters.";
- close;
- }
- mes "Welcome.";
- mes "Which monster would you recall?";
- next;
- set @gnpGroup,select("Group 1:Group 2:Group 3:Group 4:Group 5:Group 6:Group 7:Group 8:Group 9:Group 10:Group 11");
- set @gnpGroupMob$,.gnpMobsName$[(@gnpGroup-1)*6];
- for (set @i,1; @i < 6; set @i, @i+1) {
- set @gnpGroupMob$, @gnpGroupMob$ + ":" + .gnpMobsName$[(@gnpGroup-1)*6 + @i];
- }
- set @gnpMob,select(@gnpGroupMob$);
- mes "[SongYeunWoo]";
- mes "Let the fight begin!";
- close2;
- set in_battle,2;
- if (getnpctimer(0) < 180000) monster "gon_test.gat",56,86,.gnpMobsName$[(@gnpGroup-1)*6 + @gnpMob - 1],.gnpMobsId[(@gnpGroup-1)*6 + @gnpMob - 1],1,"Summoner#gnp::OnGnpMobDead";
-// do init timer on mob select ?
-// setnpctimer 0;
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- setarray .gnpMobsName$[0],"Leather ribbon","Sitotoxism","Certificate of blood donation","Tarantulla","DangRangKwon","Molar of Desert";
- setarray .gnpMobsId[0],1419,1428,1434,1430,1457,1432;
- setarray .gnpMobsName$[6],"Hog Skeleton","Cannibal Bear","Miner","Fighting Dog","Mermaid Princess","Only Son";
- setarray .gnpMobsId[6],1462,1442,1469,1460,1425,1472;
- setarray .gnpMobsName$[12],"SamYeupchoom","Hunting Dog","Nutcracker","Sea Horse","JAKK","Corpse";
- setarray .gnpMobsId[12],1454,1455,1443,1426,1436,1423;
- setarray .gnpMobsName$[18],"Marduk","Onion Stem","Worm","Autodoll","Girl with Matches","Red Evil";
- setarray .gnpMobsId[18],1458,1440,1429,1459,1444,1422;
- setarray .gnpMobsName$[24],"Naga","Mold","Tracing Missiles","Aryong","Abiryong","Bacterium";
- setarray .gnpMobsId[24],1421,1481,1424,1465,1466,1433;
- setarray .gnpMobsName$[30],"Winning System","Fat Archer","Little black goat","Perverted","Treasure Box","Greenhorn";
- setarray .gnpMobsId[30],1427,1473,1431,1446,1474,1471;
- setarray .gnpMobsName$[36],"Hurricane","External Hog","Landlord of Maze","Knight of grudge","Archer of grudge","Papillon";
- setarray .gnpMobsId[36],1450,1439,1461,1467,1453,1479;
- setarray .gnpMobsName$[42],"Lip","Wendigo","E Card","Tentacle Monster","Muscular Alarm","Devil Cross";
- setarray .gnpMobsId[42],1451,1475,1437,1441,1476,1435;
- setarray .gnpMobsName$[48],"Maggot","Large Frame","Season of reading","Shining Fingers","Handbag","Major knight of grudge";
- setarray .gnpMobsId[48],1477,1448,1478,1489,1488,1438;
- setarray .gnpMobsName$[54],"Queen","Man of Fire","Sword of Executor","Mutant Dragon","Mixed Soup","Great Sword";
- setarray .gnpMobsId[54],1482,1464,1487,1449,1456,1486;
- setarray .gnpMobsName$[60],"Monster Bird","Torturer","Warrior","Vice-Torturer","Huge Sword";
- setarray .gnpMobsId[60],1447,1483,1490,1484,1485;
- end;
-
- OnTimer120000:
- areaannounce "gon_test.gat",41,81,74,92,"1 min. left",0;
- end;
-
- OnTimer180000:
- killmonster "gon_test.gat","Summoner#gnp::OnGnpMobDead";
- end;
-
- OnTimer182000:
- areaannounce "gon_test.gat",41,81,74,92,"Time Over.",0;
- end;
-
- OnGnpMobDead:
- setnpctimer 0;
- set in_battle,1;
- areaannounce "gon_test.gat",41,81,74,92,"Thank you. Please, come again.",0;
- sleep 4000;
- OnTimer184000:
- stopnpctimer;
- areawarp "gon_test.gat",41,81,74,92,"gon_test.gat",44,4;
- set $@in_battle,0;
- end;
-}
-
-gon_test.gat,46,14,3 script Guide of field of fight#gnp 770,{
- mes "[SongHeeYeon]";
- mes ".....";
- mes "Hi, there~";
- mes "This is a field of fight.";
- mes "Got any questions?";
- next;
- switch(select("A field of fight?:You got a minute lady?:Get in.:Out.:Nope.")){
- case 1:
- mes "[SongHeeYeon]";
- mes "Just like the name of this place,";
- mes "it is a field for matches.";
- mes "We have various monsters";
- mes "in different levels.";
- next;
- mes "[SongHeeYeon]";
- mes "1st Class Boss Monsters are in middle of preparation yet.";
- mes "We charge you a small fee to enter here.";
- break;
- case 2:
- mes "[SongHeeYeon]";
- mes "eh.... excuse me?";
- mes "ah..I'm afraid I have to work right now...";
- mes "I am sorry..";
- break;
- case 3:
- mes "[SongHeeYeon]";
- mes "Yes, Thank you.";
- mes "Have a good time.";
- close2;
- set in_battle,3;
- warp "gon_test.gat",25,98;
- end;
- case 4:
- mes "[SongHeeYeon]";
- mes "Thank you.";
- mes "Please come again.";
- close2;
- warp "gonryun.gat",177,112;
- end;
- case 5:
- mes "[SongHeeYeon]";
- mes "........";
- mes "Good bye..";
- break;
- }
- close;
-}
-
-gon_test.gat,70,103,3 script ChowAnAn#gnp 773,{
- mes "[ChowAnAn]";
- mes "Want to go back?";
- next;
- if (select("Yes.:No.") == 1) {
- mes "[ChowAnAn]";
- mes "Thank you.";
- mes "Please come again.";
- close2;
- set in_battle,1;
- warp "gon_test.gat",44,4;
- end;
- }
- mes "[ChowAnAn]";
- mes "Thank you.";
- close;
+//===== eAthena Script =======================================
+//= Official Gonryun Power Arena
+//===== By: ==================================================
+//= KarLaeda (Aegis script cnversion)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Athena SVN 9000+
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+gonryun.gat,180,118,4 script Iron man#gnp 85,{
+ if (countitem(1201) > 0) {
+ mes "- Wait a minute !! -";
+ mes "- Currently you're carrying -";
+ mes "- too many items with you. -";
+ mes "- Please try again -";
+ mes "- after you loose some weight. -";
+ close;
+ }
+ if (BaseJob == Job_Novice) {
+ mes "[Songmoodoo]";
+ mes "Children are not allowed in here.";
+ close;
+ }
+ if (in_battle == 3) set in_battle,1;
+ if (in_battle < 1) {
+ mes "[Songmoodoo]";
+ mes "Hey hey~ This is not something";
+ mes "You can see everyday.";
+ mes "Oh~ you look strong!";
+ mes "Wanna try?";
+ next;
+ switch(select("Why not?:?????:No thanks.")){
+ case 1:
+ mes "[Songmoodoo]";
+ mes "Haha~ I knew you would try.";
+ mes "If you could lift this up,";
+ mes "I'll tell you something interesting.";
+ mes "Ready?";
+ next;
+ mes "^0000FFSongmoodoo pointed to a rock";
+ mes "and asked you to lift.";
+ if (BaseJob < Job_Knight) {
+ if (checkweight(7049,690)) {
+ mes "^0000FFYou lifted the Stone lightly.^000000";
+ set in_battle,1;
+ getitem 7049,690; // Stone
+ next;
+ emotion e_no1;
+ mes "[Songmoodoo]";
+ mes "Wow~ Excellent~";
+ mes "I'll take you to someplace nice";
+ mes "next time I see you.";
+ mes "See ya~";
+ } else {
+ mes "Looks too heavy for you.^000000";
+ next;
+ mes "[Songmoodoo]";
+ mes "You are yet lack of training.";
+ mes "Come after more practice.";
+ }
+ } else if (BaseClass == Job_Swordman || BaseClass == Job_Thief || BaseClass == Job_Merchant || BaseJob == Job_Monk) {
+ if (checkweight(7049,1100)) {
+ mes "^0000FFYou lifted the Stone lightly.^000000";
+ set in_battle,1;
+ getitem 7049,1100; // Stone
+ next;
+ emotion e_no1;
+ mes "[Songmoodoo]";
+ mes "Wow~ Excellent~";
+ mes "I'll take you to someplace nice";
+ mes "next time I see you.";
+ mes "See ya~";
+ } else {
+ mes "Seemed too heavy to lift.^000000";
+ next;
+ mes "[Songmoodoo]";
+ mes "You are yet lack of training.";
+ mes "come after more practice.";
+ }
+ } else {
+ if (checkweight(7049,730)) {
+ mes "^0000FFYou lifted the Stone lightly.^000000";
+ set in_battle,1;
+ getitem 7049,730; // Stone
+ next;
+ emotion e_no1;
+ mes "[Songmoodoo]";
+ mes "Wow~ Excellent~";
+ mes "I'll take you to someplace nice";
+ mes "next time I see you.";
+ mes "See ya~";
+ } else {
+ mes "Seemed too heavy to lift.^000000";
+ next;
+ mes "[Songmoodoo]";
+ mes "You are yet lack of training.";
+ mes "come after more practice.";
+ }
+ }
+ break;
+ case 2:
+ mes "[Songmoodoo]";
+ mes "That's not a big deal.";
+ mes "If you believe you're strong,";
+ mes "This might be a good chance to experience";
+ mes "something new. Wanna try??";
+ break;
+ case 3:
+ mes "[Songmoodoo]";
+ mes "I guess not..";
+ mes "....";
+ emotion e_pif;
+ break;
+ }
+ } else if (in_battle == 1) {
+ mes "[Songmoodoo]";
+ mes "Good to see you again!";
+ mes "Wanna go??";
+ next;
+ if (select("Sure:Maybe next time") == 1) {
+ mes "[Songmoodoo]";
+ mes "Good! Haha.";
+ mes "I like your confidence.";
+ mes "Good luck on you~";
+ close2;
+ warp "gon_test.gat",53,6;
+ end;
+ } else {
+ mes "[Songmoodoo]";
+ mes "well..";
+ mes "alright.";
+ mes "I'll see you next time then.";
+ }
+ } else {
+ mes "[Songmoodoo]";
+ mes "You ran away from there?";
+ mes "Guess you're not strong enough?";
+ mes "I'll give you another chance.";
+ mes "See you again.";
+ emotion e_pif;
+ set in_battle,1;
+ }
+ close;
+}
+
+gon_test.gat,50,14,4 script Administrator#gnp 780,{
+ mes "[Administrator]";
+ if (BaseJob == Job_Novice) {
+ mes "Children are not allowed in here.";
+ close;
+ }
+ if ($@in_battle) {
+ mes "Sorry, a field of fight";
+ mes "is occupied right now.";
+ mes "Try again later.";
+ close;
+ }
+ mes "Are you ready?";
+ mes "";
+ mes "Remember, you have to pay";
+ mes "500z to fight.";
+ next;
+ if (select("Yes, let me fight!:One moment, please.") == 2) {
+ mes "[Administrator]";
+ mes "Ok, see you later.";
+ close;
+ }
+ if (Zeny < 500) {
+ mes "[Administrator]";
+ mes "I'm sorry but you don't have enough zeny.";
+ close;
+ }
+ set Zeny,Zeny - 500;
+ set in_battle,1;
+ warp "gon_test.gat",42,86;
+ set $@in_battle,1;
+ setnpctimer 0,"Summoner#gnp";
+ startnpctimer "Summoner#gnp";
+ end;
+}
+
+gon_test.gat,42,89,4 script Summoner#gnp 774,{
+ mes "[SongYeunWoo]";
+ if (in_battle == 3) {
+ mes "Please come back after registration.";
+ close;
+ } else if (in_battle == 2) {
+ mes "You had a single match already.";
+ mes "You can have a match once at a time.";
+ mes "Please re-enter if you want a match";
+ mes "with other monsters.";
+ close;
+ }
+ mes "Welcome.";
+ mes "Which monster would you recall?";
+ next;
+ set @gnpGroup,select("Group 1:Group 2:Group 3:Group 4:Group 5:Group 6:Group 7:Group 8:Group 9:Group 10:Group 11");
+ set @gnpGroupMob$,.gnpMobsName$[(@gnpGroup-1)*6];
+ for (set @i,1; @i < 6; set @i, @i+1) {
+ set @gnpGroupMob$, @gnpGroupMob$ + ":" + .gnpMobsName$[(@gnpGroup-1)*6 + @i];
+ }
+ set @gnpMob,select(@gnpGroupMob$);
+ mes "[SongYeunWoo]";
+ mes "Let the fight begin!";
+ close2;
+ set in_battle,2;
+ if (getnpctimer(0) < 180000) monster "gon_test.gat",56,86,.gnpMobsName$[(@gnpGroup-1)*6 + @gnpMob - 1],.gnpMobsId[(@gnpGroup-1)*6 + @gnpMob - 1],1,"Summoner#gnp::OnGnpMobDead";
+// do init timer on mob select ?
+// setnpctimer 0;
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ setarray .gnpMobsName$[0],"Leather ribbon","Sitotoxism","Certificate of blood donation","Tarantulla","DangRangKwon","Molar of Desert";
+ setarray .gnpMobsId[0],1419,1428,1434,1430,1457,1432;
+ setarray .gnpMobsName$[6],"Hog Skeleton","Cannibal Bear","Miner","Fighting Dog","Mermaid Princess","Only Son";
+ setarray .gnpMobsId[6],1462,1442,1469,1460,1425,1472;
+ setarray .gnpMobsName$[12],"SamYeupchoom","Hunting Dog","Nutcracker","Sea Horse","JAKK","Corpse";
+ setarray .gnpMobsId[12],1454,1455,1443,1426,1436,1423;
+ setarray .gnpMobsName$[18],"Marduk","Onion Stem","Worm","Autodoll","Girl with Matches","Red Evil";
+ setarray .gnpMobsId[18],1458,1440,1429,1459,1444,1422;
+ setarray .gnpMobsName$[24],"Naga","Mold","Tracing Missiles","Aryong","Abiryong","Bacterium";
+ setarray .gnpMobsId[24],1421,1481,1424,1465,1466,1433;
+ setarray .gnpMobsName$[30],"Winning System","Fat Archer","Little black goat","Perverted","Treasure Box","Greenhorn";
+ setarray .gnpMobsId[30],1427,1473,1431,1446,1474,1471;
+ setarray .gnpMobsName$[36],"Hurricane","External Hog","Landlord of Maze","Knight of grudge","Archer of grudge","Papillon";
+ setarray .gnpMobsId[36],1450,1439,1461,1467,1453,1479;
+ setarray .gnpMobsName$[42],"Lip","Wendigo","E Card","Tentacle Monster","Muscular Alarm","Devil Cross";
+ setarray .gnpMobsId[42],1451,1475,1437,1441,1476,1435;
+ setarray .gnpMobsName$[48],"Maggot","Large Frame","Season of reading","Shining Fingers","Handbag","Major knight of grudge";
+ setarray .gnpMobsId[48],1477,1448,1478,1489,1488,1438;
+ setarray .gnpMobsName$[54],"Queen","Man of Fire","Sword of Executor","Mutant Dragon","Mixed Soup","Great Sword";
+ setarray .gnpMobsId[54],1482,1464,1487,1449,1456,1486;
+ setarray .gnpMobsName$[60],"Monster Bird","Torturer","Warrior","Vice-Torturer","Huge Sword";
+ setarray .gnpMobsId[60],1447,1483,1490,1484,1485;
+ end;
+
+ OnTimer120000:
+ areaannounce "gon_test.gat",41,81,74,92,"1 min. left",0;
+ end;
+
+ OnTimer180000:
+ killmonster "gon_test.gat","Summoner#gnp::OnGnpMobDead";
+ end;
+
+ OnTimer182000:
+ areaannounce "gon_test.gat",41,81,74,92,"Time Over.",0;
+ end;
+
+ OnGnpMobDead:
+ setnpctimer 0;
+ set in_battle,1;
+ areaannounce "gon_test.gat",41,81,74,92,"Thank you. Please, come again.",0;
+ sleep 4000;
+ OnTimer184000:
+ stopnpctimer;
+ areawarp "gon_test.gat",41,81,74,92,"gon_test.gat",44,4;
+ set $@in_battle,0;
+ end;
+}
+
+gon_test.gat,46,14,3 script Guide of field of fight#gnp 770,{
+ mes "[SongHeeYeon]";
+ mes ".....";
+ mes "Hi, there~";
+ mes "This is a field of fight.";
+ mes "Got any questions?";
+ next;
+ switch(select("A field of fight?:You got a minute lady?:Get in.:Out.:Nope.")){
+ case 1:
+ mes "[SongHeeYeon]";
+ mes "Just like the name of this place,";
+ mes "it is a field for matches.";
+ mes "We have various monsters";
+ mes "in different levels.";
+ next;
+ mes "[SongHeeYeon]";
+ mes "1st Class Boss Monsters are in middle of preparation yet.";
+ mes "We charge you a small fee to enter here.";
+ break;
+ case 2:
+ mes "[SongHeeYeon]";
+ mes "eh.... excuse me?";
+ mes "ah..I'm afraid I have to work right now...";
+ mes "I am sorry..";
+ break;
+ case 3:
+ mes "[SongHeeYeon]";
+ mes "Yes, Thank you.";
+ mes "Have a good time.";
+ close2;
+ set in_battle,3;
+ warp "gon_test.gat",25,98;
+ end;
+ case 4:
+ mes "[SongHeeYeon]";
+ mes "Thank you.";
+ mes "Please come again.";
+ close2;
+ warp "gonryun.gat",177,112;
+ end;
+ case 5:
+ mes "[SongHeeYeon]";
+ mes "........";
+ mes "Good bye..";
+ break;
+ }
+ close;
+}
+
+gon_test.gat,70,103,3 script ChowAnAn#gnp 773,{
+ mes "[ChowAnAn]";
+ mes "Want to go back?";
+ next;
+ if (select("Yes.:No.") == 1) {
+ mes "[ChowAnAn]";
+ mes "Thank you.";
+ mes "Please come again.";
+ close2;
+ set in_battle,1;
+ warp "gon_test.gat",44,4;
+ end;
+ }
+ mes "[ChowAnAn]";
+ mes "Thank you.";
+ close;
} \ No newline at end of file
diff --git a/npc/other/pvp.txt b/npc/other/pvp.txt
index 538e51063..439398646 100644
--- a/npc/other/pvp.txt
+++ b/npc/other/pvp.txt
@@ -1,414 +1,414 @@
-//===== eAthena Script =======================================
-//= PvP
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.1 Fixed arena names for Nightmare mode. Added room limit
-//= check.[kobra_k88]
-//= v1.2 Fixed the bug that you aways savepoint in geffen.[shadowlady]
-//= v1.2a Added PvP Narrator function. Using args for Fight
-//= Square Helpers. [kobra_k88]
-//============================================================
-
-
-//==========================================================================
-// PvP Narrators
-//==========================================================================
-
-// Alberta -----------------------------------------
-alberta_in.gat,22,146,4 script PvP Narrator#1 84,{
- callfunc "F_PvPNarr", "alberta_in.gat", 24, 143;
- end;
-}
-// Payon -------------------------------------
-payon_in01.gat,173,109,3 script PvP Narrator#2 84,{
- callfunc "F_PvPNarr", "payon_in01.gat", 169, 108;
- end;
-}
-// Prontera -------------------------------------
-prt_in.gat,56,140,4 script PvP Narrator#3 84,{
- callfunc "F_PvPNarr", "prt_in.gat", 54, 137;
- end;
-}
-// Morocc --------------------------------------
-morocc_in.gat,144,138,4 script PvP Narrator#4 84,{
- callfunc "F_PvPNarr", "morocc_in.gat", 141, 140;
- end;
-}
-// Geffen --------------------------------------
-geffen_in.gat,67,63,4 script PvP Narrator#5 84,{
- callfunc "F_PvPNarr", "geffen_in.gat", 64, 60;
- end;
-}
-
-//******************************************************//
-// Function: PvP Narrator
-//******************************************************//
-// arg(0): mapname
-// arg(1): savepoint x cord.
-// arg(2): savepoint y cord.
-//=============================
-function script F_PvPNarr {
- mes "[PvP Narrator]";
- mes "Hello and welcome! I am in charge of explaining the PvP mode to all of those who inquire. I am the PvP Narrator!";
- M_Menu:
- next;
- menu "What is PvP?",M_0, "What are the PvP modes?",M_1, "What are the rules for PvP?",M_2, "Save position.",M_3;
-
- M_0:
- mes "[PvP Narrator]";
- mes "PvP is short for 'Player versus Player'! It is a unique play mode that allows players to duel other players!";
- next;
- mes "[PvP Narrator]";
- mes "If you're interested just speak with the ^5533FFGate Keeper'^000000. He will let you into the PvP square.";
- next;
- mes "[PvP Narrator]";
- mes "That IS, IF you have at least a base level of 31 and you have 500 zeny to pay for the enterance fee.";
- mes "Those are the requirements to participate in PvP.";
- goto M_Menu;
- M_1:
- mes "[PvP Narrator]";
- mes "There are 2 PvP modes to choose from.";
- mes "One is called ^5533FF'Yoyo'^000000 Mode and the other is called ^5533FF'Nightmare'^000000 Mode.";
- next;
- mes "[PvP Narrator]";
- mes "Yoyo mode essentially lets you play risk free. You can experience the thrill of PvP without any restrictions or penalties.";
- mes "It is recomended that you practice your skills in this mode before you move on.";
- next;
- mes "[PvP Narrator]";
- mes "Nightmare Mode is very dangerous! Please use caution when trying this mode of play.";
- mes "You will lose some of your real EXP if you are defeated. There is also the small chance that you will drop some items and equipment.";
- next;
- mes "[PvP Narrator]";
- mes "Of course if you win, the rewards can be great!! Even so you should really think twice before you attempt Nightmare Mode.";
- mes "Anyways, good luck.";
- goto M_Menu;
- M_2:
- mes "[PvP Narrator]";
- mes "Before you enter any actual PvP areana, you must first choose your level of ability based on your base level.";
- mes "You will do this in the pre-fight room. There will be a row of narrators, each one representing a set of player levels.";
- next;
- mes "[PvP Narrator]";
- mes "Speak to the narrator that represents your base level. You will then be asked to choose from five different fight maps.";
- mes "You will be able to see how many people are currently participating in any given map.";
- next;
- mes "[PvP Narrator]";
- mes "This will be represented by the 'Attendee/Total' figure in the corner of the screen. There is a limit to how many can play on a map.";
- mes "There is a hidden EXP value in PvP mode. This EXP will only apply inside of the PvP zone and not outside.";
- next;
- mes "[PvP Narrator]";
- mes "Every one will recieve a base EXP of 5 points when they first start. If you win a match your EXP with increase by 1 point.";
- mes "If you loose your EXP will drop by 5 points, so be carefull!";
- next;
- mes "[PvP Narrator]";
- mes "If you are defeated and your EXP is equal to or less than 0, you will be removed from the PvP arena.";
- mes "If your EXP is more than 0 than you may continue fighting and even get help from healers.";
- next;
- mes "[PvP Narrator]";
- mes "The fighting commands inside of PvP are the same as outside. Just remember that you won't be able to save inside a PvP arena.";
- next;
- mes "[PvP Narrator]";
- mes "Remember these rules well as they can help to ensure your victory.";
- goto M_Menu;
- M_3:
- savepoint getarg(0), getarg(1), getarg(2);
- mes "[PvP Narrator]";
- mes "Your position has been saved.";
- close;
-}
-
-
-//==========================================================================
-// Gate Keepers
-//==========================================================================
-
-// Alberta -----------------------------------
-alberta_in.gat,26,146,4 script Gate Keeper#1::GateKeep 83,{
- mes "[Gate Keeper]";
- mes "Hi. I'm glad to be of service. I will open the PvP fight square for you!";
- mes "If you have any questions about the PvP modes or rules, please ask the Narrator.....";
- next;
- menu "^5533FF'PvP Yoyo Mode'^000000 Fight Square.",M_0,
- "^FF5533'PvP Nightmare Mode'^000000 Fight Square.",M_1,
- "^5533FF'PvP Duel (Fighting) Mode'^000000 Combat Square.",M_2, "End Conversation.",M_End;
- M_0:
- set @mode$, "Yoyo";
- set @players1, 128;
- set @players2, 128;
- set @room1$, "Prontera";
- set @room2$, "Izlude";
- set @room3$, "Payon";
- set @room4$, "Alberta";
- set @room5$, "Morroc";
- callsub sF_Move;
- warp "pvp_y_room.gat", 51, 23;
- end;
- M_1:
- set @mode$, "Nightmare";
- set @players1, 64;
- set @players2, 32;
- set @room1$, "Sandwhich Arena";
- set @room2$, "Rock Arena";
- set @room3$, "Four Arena";
- set @room4$, "UnderCross Arena";
- set @room5$, "Copass Arena";
- callsub sF_Move;
- warp "pvp_n_room.gat", 51, 23;
- end;
- M_2:
-
- mes "[Gate Keeper]";
- mes "To enter the Duel (Fighting) Mode square you must have an admission ticket. Do you have one?";
- next;
- menu "Yes I do.",-, "No I don't.",sM_1;
-
- if(countitem(7029) < 1) goto sM_1;
- delitem 7029, 1;
- set @mode$, "Fighting";
- callsub sF_Move;
- warp "pvp_y_room.gat", 51, 23;
- end;
-
- sM_1:
- mes "[Gate Keeper]";
- mes "Eh? You don't have one? I'm sorry but this fight square is only for people who have admission or viewing tickets.";
- mes "You cannot come in without one.";
- close;
- M_End:
- mes "[Gate Keeper]";
- mes "In this war between Monsters and Humans this competition between people, PvP, encourages all of us to become stronger.";
- mes "Come again anytime. We welcome your challenge!";
- close;
-
-sF_Move:
- mes "[Gate Keeper]";
- mes "The admission fee is 500 Zeny. Do you want to move to the "+@mode$+" fight square?";
- next;
- menu "Yes",-, "No",M_End;
-
- if(BaseLevel < 31) goto sL_LowLvl;
- if(Zeny < 500) goto sL_NdZeny;
- set Zeny, Zeny - 500;
- mes "[Gate Keeper]";
- mes "Prepare to be warped to the arena.....";
- next;
- return;
-
- sL_LowLvl:
- mes "[Gate Keeper]";
- mes "In order to participate in PvP you must have a base level of at least ^FF4444'31'^000000.";
- close;
- sL_NdZeny:
- mes "[Gate Keeper]";
- mes "As I stated, the admission fee is ^FF4444'500'^000000 Zeny. You seem to be short on Zeny.";
- close;
-}
-
-// Geffen --------------------------------------------
-geffen_in.gat,63,63,4 duplicate(GateKeep) Gate Keeper#2 83
-// Morroc----------------------------------------------
-morocc_in.gat,144,142,4 duplicate(GateKeep) Gate Keeper#3 83
-// Payon ----------------------------------------------
-payon_in01.gat,175,106,3 duplicate(GateKeep) Gate Keeper#4 83
-// Prontera -------------------------------------------
-prt_in.gat,52,140,4 duplicate(GateKeep) Gate Keeper#5 83
-
-
-
-//==========================================================================//
-// PvP Yoyo Mode Fight Square Helpers
-//==========================================================================//
-
-// LV31 ~ 40 ---------------------------------
-pvp_y_room.gat,30,85,4 script Fight Square Helper::YHelper1 105,{
- callfunc "F_PvPRoom", "y_1", 31, 40;
-OnInit:
- waitingroom "LV31 ~ LV40",0;
- end;
-}
-
-// LV41 ~ 50 --------------------------------
-pvp_y_room.gat,38,85,4 script Fight Square Helper::YHelper2 105,{
- callfunc "F_PvPRoom", "y_2", 41, 50;
-OnInit:
- waitingroom "LV41 ~ LV50",0;
- end;
-}
-
-// LV51 ~ 60 ---------------------------------
-pvp_y_room.gat,46,85,4 script Fight Square Helper::YHelper3 105,{
- callfunc "F_PvPRoom", "y_3", 51, 60;
-OnInit:
- waitingroom "LV51 ~ LV60", 0;
- end;
-}
-
-// LV61 ~ 70 ------------------------------------
-pvp_y_room.gat,54,85,4 script Fight Square Helper::YHelper4 105,{
- callfunc "F_PvPRoom", "y_4", 61, 70;
-OnInit:
- waitingroom "LV61 ~ LV70", 0;
- end;
-}
-
-// LV71 ~ 80 ------------------------------------
-pvp_y_room.gat,62,85,4 script Fight Square Helper::YHelper5 105,{
- callfunc "F_PvPRoom", "y_5", 71, 80;
-OnInit:
- waitingroom "LV71 ~ LV80", 0;
- end;
-}
-
-// LV81 ~ 90 --------------------------------------
-pvp_y_room.gat,70,85,4 script Fight Square Helper::YHelper6 105,{
- callfunc "F_PvPRoom", "y_6", 81, 90;
-OnInit:
- waitingroom "LV81 ~ LV90", 0;
- end;
-}
-
-// LV91 ~ --------------------------------------------
-pvp_y_room.gat,78,85,4 script Fight Square Helper::YHelper7 105,{
- callfunc "F_PvPRoom", "y_7", 91, 255;
-OnInit:
- waitingroom "LV91 ~ ", 0;
- end;
-}
-
-// No Limit -----------------------------------------
-pvp_y_room.gat,86,85,4 script Fight Square Helper::YHelper8 105,{
- callfunc "F_PvPRoom", "y_8", 0, 255;
-OnInit:
- waitingroom "No Limit", 0;
- end;
-}
-
-
-//==========================================================================//
-// PvP Nightmare Mode Fight Square Helpers
-//==========================================================================//
-// LV31 ~ 40 -------------------------------------
-pvp_n_room.gat,30,85,4 script Fight Square Helper#N1 105,{
- callfunc "F_PvPRoom", "n_1", 31, 40;
-OnInit:
- waitingroom "LV31 ~ LV40",0;
- end;
-}
-
-// LV41 ~ 50 --------------------------------------
-pvp_n_room.gat,38,85,4 script Fight Square Helper#N2 105,{
- callfunc "F_PvPRoom", "n_2", 41, 50;
-OnInit:
- waitingroom "LV41 ~ LV50",0;
- end;
-}
-
-// LV51 ~ 60 -------------------------------------
-pvp_n_room.gat,46,85,4 script Fight Square Helper#N3 105,{
- callfunc "F_PvPRoom", "n_3", 51, 60;
-OnInit:
- waitingroom "LV51 ~ LV60", 0;
- end;
-}
-
-// LV61 ~ 70 ------------------------------------
-pvp_n_room.gat,54,85,4 script Fight Square Helper#N4 105,{
- callfunc "F_PvPRoom", "n_4", 61, 70;
-OnInit:
- waitingroom "LV61 ~ LV70", 0;
- end;
-}
-
-// LV71 ~ 80 -----------------------------------
-pvp_n_room.gat,62,85,4 script Fight Square Helper#N5 105,{
- callfunc "F_PvPRoom", "n_5", 71, 80;
-OnInit:
- waitingroom "LV71 ~ LV80", 0;
- end;
-}
-
-// LV81 ~ 90 ------------------------------------
-pvp_n_room.gat,70,85,4 script Fight Square Helper#N6 105,{
- callfunc "F_PvPRoom", "n_6", 81, 90;
-OnInit:
- waitingroom "LV81 ~ LV90", 0;
- end;
-}
-
-// LV91 ~ ---------------------------------------
-pvp_n_room.gat,78,85,4 script Fight Square Helper#N7 105,{
- callfunc "F_PvPRoom", "n_7", 91, 255;
-OnInit:
- waitingroom "LV91 ~ ", 0;
- end;
-}
-
-// No Limit ----------------------------------
-pvp_n_room.gat,86,85,4 script Fight Square Helper#N8 105,{
- callfunc "F_PvPRoom", "n_8", 0, 255;
-OnInit:
- waitingroom "No Limit", 0;
- end;
-}
-
-
-//***************************************************************//
-// Function: PvP Fight Square Helper
-//***************************************************************//
-// arg(0): pvp room name
-// arg(1): minimum base lvl to enter arena
-// arg(2): maximum base lvl allowed to enter arena
-//===============================================
-function script F_PvPRoom {
-
- mes "[Fight Square Helper]";
- if(BaseLevel < getarg(1)) goto L_LowLvl;
- if(BaseLevel > getarg(2)) goto L_HiLvl;
- mes "Please choose an arena to fight in...";
- M_Menu:
- next;
- menu @room1$ + " [" + getmapusers("pvp_" + getarg(0) + "-1.gat") + "/" +@players1+ "]",M_Rm1,
- @room2$ + " [" + getmapusers("pvp_" + getarg(0) + "-2.gat") + "/" +@players2+ "]",M_Rm2,
- @room3$ + " [" + getmapusers("pvp_" + getarg(0) + "-3.gat") + "/" +@players2+ "]",M_Rm3,
- @room4$ + " [" + getmapusers("pvp_" + getarg(0) + "-4.gat") + "/" +@players2+ "]",M_Rm4,
- @room5$ + " [" + getmapusers("pvp_" + getarg(0) + "-5.gat") + "/" +@players2+ "]",M_Rm5, "Cancel",M_End;
- M_Rm1:
- if (getmapusers("pvp_" + getarg(0) + "-1.gat") == @players1) goto L_Full;
- warp "pvp_" + getarg(0) + "-1.gat",0,0;
- end;
- M_Rm2:
- if (getmapusers("pvp_" + getarg(0) + "-2.gat") == @players2) goto L_Full;
- warp "pvp_" + getarg(0) + "-2.gat",0,0;
- end;
- M_Rm3:
- if (getmapusers("pvp_" + getarg(0) + "-3.gat") == @players2) goto L_Full;
- warp "pvp_" + getarg(0) + "-3.gat",0,0;
- end;
- M_Rm4:
- if (getmapusers("pvp_" + getarg(0) + "-4.gat") == @players2) goto L_Full;
- warp "pvp_" + getarg(0) + "-4.gat",0,0;
- end;
- M_Rm5:
- if (getmapusers("pvp_" + getarg(0) + "-5.gat") == @players2) goto L_Full;
- warp "pvp_" + getarg(0) + "-5.gat",0,0;
- end;
- M_End:
- close;
-
- L_LowLvl:
- mes "I'm sorry but you do not meet the Base Level requirements to enter. Please try a lower level room.";
- close;
- L_HiLvl:
- mes "I'm sorry but you exceed the Base Level requirements to enter. Please try a higher level room.";
- close;
- L_Full:
- mes "[Fight Square Helper]";
- mes "I'm sorry but this arena is full. Please choose another one to participate in....";
- goto M_Menu;
-}
+//===== eAthena Script =======================================
+//= PvP
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.1 Fixed arena names for Nightmare mode. Added room limit
+//= check.[kobra_k88]
+//= v1.2 Fixed the bug that you aways savepoint in geffen.[shadowlady]
+//= v1.2a Added PvP Narrator function. Using args for Fight
+//= Square Helpers. [kobra_k88]
+//============================================================
+
+
+//==========================================================================
+// PvP Narrators
+//==========================================================================
+
+// Alberta -----------------------------------------
+alberta_in.gat,22,146,4 script PvP Narrator#1 84,{
+ callfunc "F_PvPNarr", "alberta_in.gat", 24, 143;
+ end;
+}
+// Payon -------------------------------------
+payon_in01.gat,173,109,3 script PvP Narrator#2 84,{
+ callfunc "F_PvPNarr", "payon_in01.gat", 169, 108;
+ end;
+}
+// Prontera -------------------------------------
+prt_in.gat,56,140,4 script PvP Narrator#3 84,{
+ callfunc "F_PvPNarr", "prt_in.gat", 54, 137;
+ end;
+}
+// Morocc --------------------------------------
+morocc_in.gat,144,138,4 script PvP Narrator#4 84,{
+ callfunc "F_PvPNarr", "morocc_in.gat", 141, 140;
+ end;
+}
+// Geffen --------------------------------------
+geffen_in.gat,67,63,4 script PvP Narrator#5 84,{
+ callfunc "F_PvPNarr", "geffen_in.gat", 64, 60;
+ end;
+}
+
+//******************************************************//
+// Function: PvP Narrator
+//******************************************************//
+// arg(0): mapname
+// arg(1): savepoint x cord.
+// arg(2): savepoint y cord.
+//=============================
+function script F_PvPNarr {
+ mes "[PvP Narrator]";
+ mes "Hello and welcome! I am in charge of explaining the PvP mode to all of those who inquire. I am the PvP Narrator!";
+ M_Menu:
+ next;
+ menu "What is PvP?",M_0, "What are the PvP modes?",M_1, "What are the rules for PvP?",M_2, "Save position.",M_3;
+
+ M_0:
+ mes "[PvP Narrator]";
+ mes "PvP is short for 'Player versus Player'! It is a unique play mode that allows players to duel other players!";
+ next;
+ mes "[PvP Narrator]";
+ mes "If you're interested just speak with the ^5533FFGate Keeper'^000000. He will let you into the PvP square.";
+ next;
+ mes "[PvP Narrator]";
+ mes "That IS, IF you have at least a base level of 31 and you have 500 zeny to pay for the enterance fee.";
+ mes "Those are the requirements to participate in PvP.";
+ goto M_Menu;
+ M_1:
+ mes "[PvP Narrator]";
+ mes "There are 2 PvP modes to choose from.";
+ mes "One is called ^5533FF'Yoyo'^000000 Mode and the other is called ^5533FF'Nightmare'^000000 Mode.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Yoyo mode essentially lets you play risk free. You can experience the thrill of PvP without any restrictions or penalties.";
+ mes "It is recomended that you practice your skills in this mode before you move on.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Nightmare Mode is very dangerous! Please use caution when trying this mode of play.";
+ mes "You will lose some of your real EXP if you are defeated. There is also the small chance that you will drop some items and equipment.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Of course if you win, the rewards can be great!! Even so you should really think twice before you attempt Nightmare Mode.";
+ mes "Anyways, good luck.";
+ goto M_Menu;
+ M_2:
+ mes "[PvP Narrator]";
+ mes "Before you enter any actual PvP areana, you must first choose your level of ability based on your base level.";
+ mes "You will do this in the pre-fight room. There will be a row of narrators, each one representing a set of player levels.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Speak to the narrator that represents your base level. You will then be asked to choose from five different fight maps.";
+ mes "You will be able to see how many people are currently participating in any given map.";
+ next;
+ mes "[PvP Narrator]";
+ mes "This will be represented by the 'Attendee/Total' figure in the corner of the screen. There is a limit to how many can play on a map.";
+ mes "There is a hidden EXP value in PvP mode. This EXP will only apply inside of the PvP zone and not outside.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Every one will recieve a base EXP of 5 points when they first start. If you win a match your EXP with increase by 1 point.";
+ mes "If you loose your EXP will drop by 5 points, so be carefull!";
+ next;
+ mes "[PvP Narrator]";
+ mes "If you are defeated and your EXP is equal to or less than 0, you will be removed from the PvP arena.";
+ mes "If your EXP is more than 0 than you may continue fighting and even get help from healers.";
+ next;
+ mes "[PvP Narrator]";
+ mes "The fighting commands inside of PvP are the same as outside. Just remember that you won't be able to save inside a PvP arena.";
+ next;
+ mes "[PvP Narrator]";
+ mes "Remember these rules well as they can help to ensure your victory.";
+ goto M_Menu;
+ M_3:
+ savepoint getarg(0), getarg(1), getarg(2);
+ mes "[PvP Narrator]";
+ mes "Your position has been saved.";
+ close;
+}
+
+
+//==========================================================================
+// Gate Keepers
+//==========================================================================
+
+// Alberta -----------------------------------
+alberta_in.gat,26,146,4 script Gate Keeper#1::GateKeep 83,{
+ mes "[Gate Keeper]";
+ mes "Hi. I'm glad to be of service. I will open the PvP fight square for you!";
+ mes "If you have any questions about the PvP modes or rules, please ask the Narrator.....";
+ next;
+ menu "^5533FF'PvP Yoyo Mode'^000000 Fight Square.",M_0,
+ "^FF5533'PvP Nightmare Mode'^000000 Fight Square.",M_1,
+ "^5533FF'PvP Duel (Fighting) Mode'^000000 Combat Square.",M_2, "End Conversation.",M_End;
+ M_0:
+ set @mode$, "Yoyo";
+ set @players1, 128;
+ set @players2, 128;
+ set @room1$, "Prontera";
+ set @room2$, "Izlude";
+ set @room3$, "Payon";
+ set @room4$, "Alberta";
+ set @room5$, "Morroc";
+ callsub sF_Move;
+ warp "pvp_y_room.gat", 51, 23;
+ end;
+ M_1:
+ set @mode$, "Nightmare";
+ set @players1, 64;
+ set @players2, 32;
+ set @room1$, "Sandwhich Arena";
+ set @room2$, "Rock Arena";
+ set @room3$, "Four Arena";
+ set @room4$, "UnderCross Arena";
+ set @room5$, "Copass Arena";
+ callsub sF_Move;
+ warp "pvp_n_room.gat", 51, 23;
+ end;
+ M_2:
+
+ mes "[Gate Keeper]";
+ mes "To enter the Duel (Fighting) Mode square you must have an admission ticket. Do you have one?";
+ next;
+ menu "Yes I do.",-, "No I don't.",sM_1;
+
+ if(countitem(7029) < 1) goto sM_1;
+ delitem 7029, 1;
+ set @mode$, "Fighting";
+ callsub sF_Move;
+ warp "pvp_y_room.gat", 51, 23;
+ end;
+
+ sM_1:
+ mes "[Gate Keeper]";
+ mes "Eh? You don't have one? I'm sorry but this fight square is only for people who have admission or viewing tickets.";
+ mes "You cannot come in without one.";
+ close;
+ M_End:
+ mes "[Gate Keeper]";
+ mes "In this war between Monsters and Humans this competition between people, PvP, encourages all of us to become stronger.";
+ mes "Come again anytime. We welcome your challenge!";
+ close;
+
+sF_Move:
+ mes "[Gate Keeper]";
+ mes "The admission fee is 500 Zeny. Do you want to move to the "+@mode$+" fight square?";
+ next;
+ menu "Yes",-, "No",M_End;
+
+ if(BaseLevel < 31) goto sL_LowLvl;
+ if(Zeny < 500) goto sL_NdZeny;
+ set Zeny, Zeny - 500;
+ mes "[Gate Keeper]";
+ mes "Prepare to be warped to the arena.....";
+ next;
+ return;
+
+ sL_LowLvl:
+ mes "[Gate Keeper]";
+ mes "In order to participate in PvP you must have a base level of at least ^FF4444'31'^000000.";
+ close;
+ sL_NdZeny:
+ mes "[Gate Keeper]";
+ mes "As I stated, the admission fee is ^FF4444'500'^000000 Zeny. You seem to be short on Zeny.";
+ close;
+}
+
+// Geffen --------------------------------------------
+geffen_in.gat,63,63,4 duplicate(GateKeep) Gate Keeper#2 83
+// Morroc----------------------------------------------
+morocc_in.gat,144,142,4 duplicate(GateKeep) Gate Keeper#3 83
+// Payon ----------------------------------------------
+payon_in01.gat,175,106,3 duplicate(GateKeep) Gate Keeper#4 83
+// Prontera -------------------------------------------
+prt_in.gat,52,140,4 duplicate(GateKeep) Gate Keeper#5 83
+
+
+
+//==========================================================================//
+// PvP Yoyo Mode Fight Square Helpers
+//==========================================================================//
+
+// LV31 ~ 40 ---------------------------------
+pvp_y_room.gat,30,85,4 script Fight Square Helper::YHelper1 105,{
+ callfunc "F_PvPRoom", "y_1", 31, 40;
+OnInit:
+ waitingroom "LV31 ~ LV40",0;
+ end;
+}
+
+// LV41 ~ 50 --------------------------------
+pvp_y_room.gat,38,85,4 script Fight Square Helper::YHelper2 105,{
+ callfunc "F_PvPRoom", "y_2", 41, 50;
+OnInit:
+ waitingroom "LV41 ~ LV50",0;
+ end;
+}
+
+// LV51 ~ 60 ---------------------------------
+pvp_y_room.gat,46,85,4 script Fight Square Helper::YHelper3 105,{
+ callfunc "F_PvPRoom", "y_3", 51, 60;
+OnInit:
+ waitingroom "LV51 ~ LV60", 0;
+ end;
+}
+
+// LV61 ~ 70 ------------------------------------
+pvp_y_room.gat,54,85,4 script Fight Square Helper::YHelper4 105,{
+ callfunc "F_PvPRoom", "y_4", 61, 70;
+OnInit:
+ waitingroom "LV61 ~ LV70", 0;
+ end;
+}
+
+// LV71 ~ 80 ------------------------------------
+pvp_y_room.gat,62,85,4 script Fight Square Helper::YHelper5 105,{
+ callfunc "F_PvPRoom", "y_5", 71, 80;
+OnInit:
+ waitingroom "LV71 ~ LV80", 0;
+ end;
+}
+
+// LV81 ~ 90 --------------------------------------
+pvp_y_room.gat,70,85,4 script Fight Square Helper::YHelper6 105,{
+ callfunc "F_PvPRoom", "y_6", 81, 90;
+OnInit:
+ waitingroom "LV81 ~ LV90", 0;
+ end;
+}
+
+// LV91 ~ --------------------------------------------
+pvp_y_room.gat,78,85,4 script Fight Square Helper::YHelper7 105,{
+ callfunc "F_PvPRoom", "y_7", 91, 255;
+OnInit:
+ waitingroom "LV91 ~ ", 0;
+ end;
+}
+
+// No Limit -----------------------------------------
+pvp_y_room.gat,86,85,4 script Fight Square Helper::YHelper8 105,{
+ callfunc "F_PvPRoom", "y_8", 0, 255;
+OnInit:
+ waitingroom "No Limit", 0;
+ end;
+}
+
+
+//==========================================================================//
+// PvP Nightmare Mode Fight Square Helpers
+//==========================================================================//
+// LV31 ~ 40 -------------------------------------
+pvp_n_room.gat,30,85,4 script Fight Square Helper#N1 105,{
+ callfunc "F_PvPRoom", "n_1", 31, 40;
+OnInit:
+ waitingroom "LV31 ~ LV40",0;
+ end;
+}
+
+// LV41 ~ 50 --------------------------------------
+pvp_n_room.gat,38,85,4 script Fight Square Helper#N2 105,{
+ callfunc "F_PvPRoom", "n_2", 41, 50;
+OnInit:
+ waitingroom "LV41 ~ LV50",0;
+ end;
+}
+
+// LV51 ~ 60 -------------------------------------
+pvp_n_room.gat,46,85,4 script Fight Square Helper#N3 105,{
+ callfunc "F_PvPRoom", "n_3", 51, 60;
+OnInit:
+ waitingroom "LV51 ~ LV60", 0;
+ end;
+}
+
+// LV61 ~ 70 ------------------------------------
+pvp_n_room.gat,54,85,4 script Fight Square Helper#N4 105,{
+ callfunc "F_PvPRoom", "n_4", 61, 70;
+OnInit:
+ waitingroom "LV61 ~ LV70", 0;
+ end;
+}
+
+// LV71 ~ 80 -----------------------------------
+pvp_n_room.gat,62,85,4 script Fight Square Helper#N5 105,{
+ callfunc "F_PvPRoom", "n_5", 71, 80;
+OnInit:
+ waitingroom "LV71 ~ LV80", 0;
+ end;
+}
+
+// LV81 ~ 90 ------------------------------------
+pvp_n_room.gat,70,85,4 script Fight Square Helper#N6 105,{
+ callfunc "F_PvPRoom", "n_6", 81, 90;
+OnInit:
+ waitingroom "LV81 ~ LV90", 0;
+ end;
+}
+
+// LV91 ~ ---------------------------------------
+pvp_n_room.gat,78,85,4 script Fight Square Helper#N7 105,{
+ callfunc "F_PvPRoom", "n_7", 91, 255;
+OnInit:
+ waitingroom "LV91 ~ ", 0;
+ end;
+}
+
+// No Limit ----------------------------------
+pvp_n_room.gat,86,85,4 script Fight Square Helper#N8 105,{
+ callfunc "F_PvPRoom", "n_8", 0, 255;
+OnInit:
+ waitingroom "No Limit", 0;
+ end;
+}
+
+
+//***************************************************************//
+// Function: PvP Fight Square Helper
+//***************************************************************//
+// arg(0): pvp room name
+// arg(1): minimum base lvl to enter arena
+// arg(2): maximum base lvl allowed to enter arena
+//===============================================
+function script F_PvPRoom {
+
+ mes "[Fight Square Helper]";
+ if(BaseLevel < getarg(1)) goto L_LowLvl;
+ if(BaseLevel > getarg(2)) goto L_HiLvl;
+ mes "Please choose an arena to fight in...";
+ M_Menu:
+ next;
+ menu @room1$ + " [" + getmapusers("pvp_" + getarg(0) + "-1.gat") + "/" +@players1+ "]",M_Rm1,
+ @room2$ + " [" + getmapusers("pvp_" + getarg(0) + "-2.gat") + "/" +@players2+ "]",M_Rm2,
+ @room3$ + " [" + getmapusers("pvp_" + getarg(0) + "-3.gat") + "/" +@players2+ "]",M_Rm3,
+ @room4$ + " [" + getmapusers("pvp_" + getarg(0) + "-4.gat") + "/" +@players2+ "]",M_Rm4,
+ @room5$ + " [" + getmapusers("pvp_" + getarg(0) + "-5.gat") + "/" +@players2+ "]",M_Rm5, "Cancel",M_End;
+ M_Rm1:
+ if (getmapusers("pvp_" + getarg(0) + "-1.gat") == @players1) goto L_Full;
+ warp "pvp_" + getarg(0) + "-1.gat",0,0;
+ end;
+ M_Rm2:
+ if (getmapusers("pvp_" + getarg(0) + "-2.gat") == @players2) goto L_Full;
+ warp "pvp_" + getarg(0) + "-2.gat",0,0;
+ end;
+ M_Rm3:
+ if (getmapusers("pvp_" + getarg(0) + "-3.gat") == @players2) goto L_Full;
+ warp "pvp_" + getarg(0) + "-3.gat",0,0;
+ end;
+ M_Rm4:
+ if (getmapusers("pvp_" + getarg(0) + "-4.gat") == @players2) goto L_Full;
+ warp "pvp_" + getarg(0) + "-4.gat",0,0;
+ end;
+ M_Rm5:
+ if (getmapusers("pvp_" + getarg(0) + "-5.gat") == @players2) goto L_Full;
+ warp "pvp_" + getarg(0) + "-5.gat",0,0;
+ end;
+ M_End:
+ close;
+
+ L_LowLvl:
+ mes "I'm sorry but you do not meet the Base Level requirements to enter. Please try a lower level room.";
+ close;
+ L_HiLvl:
+ mes "I'm sorry but you exceed the Base Level requirements to enter. Please try a higher level room.";
+ close;
+ L_Full:
+ mes "[Fight Square Helper]";
+ mes "I'm sorry but this arena is full. Please choose another one to participate in....";
+ goto M_Menu;
+}
diff --git a/npc/quest_variables.txt b/npc/quest_variables.txt
index 6c65d3843..c9c8c08f5 100644
--- a/npc/quest_variables.txt
+++ b/npc/quest_variables.txt
@@ -1,91 +1,91 @@
---------------------------------------------------------------
-- Permanent Quest Variables -
---------------------------------------------------------------
-
-This file should help to understand and manage bit-wise quest
-variables. You can store up to 31 boolean value into a single
-variable. [Lupus]
---------------------------------------------------------------
-
-
---------------------------------------------------------------
-Variable: MISC_QUEST
-
-
-Quest: Juice Maker Quest
-Info: How to make juices. This bit keeps final state of the quest.
-How to set: set MISC_QUEST,MISC_QUEST | 1;
-How to check: if(MISC_QUEST & 1){}
-
-
-Quest: Tempestra Quest
-Info: Has you given a potion to Temperstra or not.
-How to set: set MISC_QUEST,MISC_QUEST | 2;
-How to check: if(MISC_QUEST & 2){}
-
-
-Quest: Morgenstein Quest
-Info: How to make Mixture & Counteragent. Also subquest for Alchemist Job
- This bit keeps final state of the quest.
-How to set: set MISC_QUEST,MISC_QUEST | 4;
-How to check: if(MISC_QUEST & 4){}
-
-
-Quest: Prontera Culvert Quest
-Info: Could you enter the Prontera Culvert or not.
-How to set: set MISC_QUEST,MISC_QUEST | 8;
-How to check: if(MISC_QUEST & 8){}
-
-
-Quest: Edgar's Offer
-Info: Cheap ticket from Izlude to Alberta.
- This bit keeps final state of the quest.
-How to set: set MISC_QUEST,MISC_QUEST | 16;
-How to check: if(MISC_QUEST & 16){}
-
-Quest: Piano Quest
-Info: The only way from Niflheim to Umbala.
-How to set: set MISC_QUEST,MISC_QUEST | 32;
-How to check: if(MISC_QUEST & 32){}
-
-Quest: Bio Ethics Quest
-Info: Bio Ethics quest for homunculus
- skill for alchemists. This bit
- is for final part of quest.
- (completed or not.)[Evera]
-How to set: set MISC_QUEST,MISC_QUEST|64;
-How to check: if(MISC_QUEST&64){}
-
-Quest: DTS Warper
-Info: Not really a quest, but to
- show if a person has
- already voted. Cleaning
- up the variables -.-;[Evera]
-How to set: set MISC_QUEST,MISC_QUEST|128;
-How to check: if(MISC_QUEST&128){}
-
-Quest: Book of Devil
-Info: The Lost Girl in Niflheim.
-How to set: set MISC_QUEST,MISC_QUEST | 256;
-How to check: if(MISC_QUEST & 256){}
-
-Quest: Cube Room
-Info: Lighthalzen. Cube Room Quest (Pass to Bio-Lab)
-How to set: set MISC_QUEST,MISC_QUEST | 512;
-How to check: if(MISC_QUEST & 512){}
-
-Quest: Reset Skills Event
-Info: Yuno, Hypnotist Teacher
-How to set: set MISC_QUEST,MISC_QUEST | 1024;
-How to check: if(MISC_QUEST & 1024){}
-
---------------------------------------------------------------
-Variable: MISC_QUEST2
-
-
-Quest: ?
-Info: ?
-How to set: set MISC_QUEST,MISC_QUEST | ?;
-How to check: if(MISC_QUEST & ?){}
-
---------------------------------------------------------------
+--------------------------------------------------------------
+- Permanent Quest Variables -
+--------------------------------------------------------------
+
+This file should help to understand and manage bit-wise quest
+variables. You can store up to 31 boolean value into a single
+variable. [Lupus]
+--------------------------------------------------------------
+
+
+--------------------------------------------------------------
+Variable: MISC_QUEST
+
+
+Quest: Juice Maker Quest
+Info: How to make juices. This bit keeps final state of the quest.
+How to set: set MISC_QUEST,MISC_QUEST | 1;
+How to check: if(MISC_QUEST & 1){}
+
+
+Quest: Tempestra Quest
+Info: Has you given a potion to Temperstra or not.
+How to set: set MISC_QUEST,MISC_QUEST | 2;
+How to check: if(MISC_QUEST & 2){}
+
+
+Quest: Morgenstein Quest
+Info: How to make Mixture & Counteragent. Also subquest for Alchemist Job
+ This bit keeps final state of the quest.
+How to set: set MISC_QUEST,MISC_QUEST | 4;
+How to check: if(MISC_QUEST & 4){}
+
+
+Quest: Prontera Culvert Quest
+Info: Could you enter the Prontera Culvert or not.
+How to set: set MISC_QUEST,MISC_QUEST | 8;
+How to check: if(MISC_QUEST & 8){}
+
+
+Quest: Edgar's Offer
+Info: Cheap ticket from Izlude to Alberta.
+ This bit keeps final state of the quest.
+How to set: set MISC_QUEST,MISC_QUEST | 16;
+How to check: if(MISC_QUEST & 16){}
+
+Quest: Piano Quest
+Info: The only way from Niflheim to Umbala.
+How to set: set MISC_QUEST,MISC_QUEST | 32;
+How to check: if(MISC_QUEST & 32){}
+
+Quest: Bio Ethics Quest
+Info: Bio Ethics quest for homunculus
+ skill for alchemists. This bit
+ is for final part of quest.
+ (completed or not.)[Evera]
+How to set: set MISC_QUEST,MISC_QUEST|64;
+How to check: if(MISC_QUEST&64){}
+
+Quest: DTS Warper
+Info: Not really a quest, but to
+ show if a person has
+ already voted. Cleaning
+ up the variables -.-;[Evera]
+How to set: set MISC_QUEST,MISC_QUEST|128;
+How to check: if(MISC_QUEST&128){}
+
+Quest: Book of Devil
+Info: The Lost Girl in Niflheim.
+How to set: set MISC_QUEST,MISC_QUEST | 256;
+How to check: if(MISC_QUEST & 256){}
+
+Quest: Cube Room
+Info: Lighthalzen. Cube Room Quest (Pass to Bio-Lab)
+How to set: set MISC_QUEST,MISC_QUEST | 512;
+How to check: if(MISC_QUEST & 512){}
+
+Quest: Reset Skills Event
+Info: Yuno, Hypnotist Teacher
+How to set: set MISC_QUEST,MISC_QUEST | 1024;
+How to check: if(MISC_QUEST & 1024){}
+
+--------------------------------------------------------------
+Variable: MISC_QUEST2
+
+
+Quest: ?
+Info: ?
+How to set: set MISC_QUEST,MISC_QUEST | ?;
+How to check: if(MISC_QUEST & ?){}
+
+--------------------------------------------------------------
diff --git a/npc/quests/Lvl4_weapon_quest.txt b/npc/quests/Lvl4_weapon_quest.txt
index b3183c526..20ca80b3d 100644
--- a/npc/quests/Lvl4_weapon_quest.txt
+++ b/npc/quests/Lvl4_weapon_quest.txt
@@ -1,3615 +1,3615 @@
-//===== eAthena Script =======================================
-//= Grade A and Grade S weapon quests
-//===== By: ==================================================
-//= Vicious_Pucca, Reddozen & MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.21
-//===== Compatible With: =====================================
-//= eAthena SVN 3422+(Requires jA Script System)
-//===== Description: =========================================
-//= Grade A and Grade S weapon quests
-//===== Additional Comments: =================================
-//= 1.0 First Version, Credits goes to Vicious_Pucca for converting [MasterOfMuppets]
-//= the quest from aegis format to eA format. Also thanks to
-//= reddozen for fixing bugs.
-//= 1.1 Many fixes to spelling, grammar, and sentence order. [Silent]
-//= 1.2 A small fix, thanks to vicious_pucca [MasterOfMuppets]
-//= 1.21 Fixing MoM's typos (Citrin -> Citrine) [erKURITA]
-//============================================================
-
-//---------------------------------------------------------------
-// Initialize the basic materials for easier reading/conversion
-//---------------------------------------------------------------
-
-- script lv4_weapon_init -1,{
-OnInit:
- set $@LV4_Citrine, 7295; // 7295,Citrine
- set $@LV4_Turquoise, 7294; // 7294,Turquoise
- set $@LV4_Agate, 7291; // 7291,Agate
-
- set $@LV4_Muscovite, 7292; // 7292,Muscovite
- set $@LV4_Biotite, 7297; // 7297,Biotite
- set $@LV4_Pyroxene, 7296; // 7296,Pyroxene
-
- set $@LV4_Phlogopite, 7290; // 7290,Phlogopite
- set $@LV4_Olivine, 7289; // 7289,Peridot
- set $@LV4_Rose_Quartz, 7293; // 7293,Rose_Quartz
-
- set $@LV4_Gold, 969; // 969,Gold
- set $@LV4_Steel, 999; // 999,Steel
- set $@LV4_Emperium, 714; // 714,Emperium
- set $@LV4_Hammer_Of_Blacksmith, 1005; // 1005,Hammer_of_Blacksmith
- set $@LV4_Emperium_Anvil, 989; // 989,Emperium_Anvil
- set $@LV4_Illusion_Flower, 710; // 710,Illusion_Flower
- end;
-}
-
-//---------------------------------------------------------------
-// Bazo, creates Immaterial Sword, Quadrille and Slash
-//---------------------------------------------------------------
-
-umbala.gat,117,285,3 script Bazo 85,{
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- Currently you are overweight. -";
- mes "- Please lighten your weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon == 1) goto LV4_1;
- if(lv4_weapon == 2) goto LV4_2;
- if(lv4_weapon == 3) goto LV4_2;
- if(lv4_weapon == 4) goto LV4_2;
- if(lv4_weapon == 5) goto LV4_5;
- if(lv4_weapon == 6) goto LV4_5;
- if(lv4_weapon == 7) goto LV4_5;
- if(lv4_weapon > 7) goto LV4_7;
- end; // shouldn't be here
-
-
-LV4_0:
- mes "[Bazo]";
- mes "Hello, you are from outside, huh?";
- mes "I can tell by your appearance.";
- mes "Pleased to meet you. My name is Bazo Heburiech.";
- mes "I am also from outside.";
- next;
- mes "[Bazo]";
- mes "We must have been meant to meet each other.";
- mes "If you don't mind, let me explain about this place for a while.";
- mes "Umbala is adjacent to Nifflheim, the city of the dead.";
- mes "Even at a first sight, I knew that";
- mes "there is something about this village.";
- next;
- mes "[Bazo]";
- mes "Due to that geographical trait,";
- mes "this village was filled with evil power";
- mes "that was influenced by the city of the dead.";
- next;
- mes "[Bazo]";
- mes "The local people have learned";
- mes "to manipulate the evil power for";
- mes "producing specialties.";
- next;
- mes "[Bazo]";
- mes "While staying here, I also have learned";
- mes "some recipes. If you bring me materials,";
- mes "I am willing to show you my skills.";
- mes "How does that sound?";
- next;
-
- switch( select( "Sounds good.", "No, thanks." ) ) {
- case 1:
- if(BaseLevel >= 70) goto L4_0_1;
-
- mes "[Bazo]";
- mes "Err...I don't think that you are powerful";
- mes "enough to handle my products.";
- mes "They are charged with evil power.";
- next;
- mes "That means if their owners are not powerful";
- mes "and not experienced enough,";
- mes "they will drive the owners insane.";
- mes "And I cannot do that to my friend.";
- next;
- mes "[Bazo]";
- mes "Therefore, I want you to go back and level up first.";
- mes "I will gladly expect you to come back when you are ready.";
- break;
-L4_0_1:
- mes "[Bazo]";
- mes "Excellent! Let me tell you";
- mes "the materials I need. I hope you will write them down.";
- mes "There is not that many though.";
- next;
- mes "[Bazo]";
- mes "I need 10 Gold, 50 Steel and 10 Emperium";
- mes "as basic materials...";
- mes "and you can enchant the product with a certain trait.";
- mes "For that, I need some rare ores...";
- next;
- mes "[Bazo]";
- mes "Please bring me 30 of either Citrine, Turquoise or Agate.";
- mes "Each one of them possess their own attribute";
- mes "and following by the ore you have brought,";
- mes "my product will possess a special trait.";
- next;
- mes "[Bazo]";
- mes "I wish you good luck...";
- mes "I will wait for you!";
-
- set lv4_weapon, 1;
- break;
- case 2:
- mes "[Bazo]";
- mes "Oh, okay. That is fine with me.";
- mes "By the way, don't you want to know how evil the city of the dead will be?";
- mes "I do since that city influences so much of this village";
- mes "with it's mysterious power, you know.";
- break;
- }
- close;
-
-
-
-//--------------------------------------------------
-//Gold, Steel, Emp Check + Choosing the gem
-//--------------------------------------------------
-LV4_1:
- if(countitem($@LV4_Gold) < 10) goto LV4_1_FAIL;
- if(countitem($@LV4_Steel) < 50) goto LV4_1_FAIL;
- if(countitem($@LV4_Emperium) < 10) goto LV4_1_FAIL;
-
- mes "[Bazo]";
- mes "Oh...you have brought all the basic materials.";
- mes "Now let me check what kind of rare ores";
- mes "you have brought...";
- next;
-
- if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Turquoise) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_CTA;
- if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Turquoise) >= 30) goto LV4_1_CT;
- if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_CA;
- if (countitem($@LV4_Turquoise) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_TA;
- if (countitem($@LV4_Citrine) >= 30) goto LV4_1_C;
- if (countitem($@LV4_Turquoise) >= 30) goto LV4_1_T;
- if (countitem($@LV4_Agate) >= 30) goto LV4_1_A;
- goto LV4_1_NOGEM;
- end;
-
-
-LV4_1_CTA:
- mes "[Bazo]";
- mes "Hahaha, I asked you to bring one kind not all of them.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Citrine", "Turquoise", "Agate" ) ) {
- case 1:
- mes "[Bazo]";
- mes "Citrine...okay. Before we start,";
- set @gem, $@LV4_Citrine;
- set @gemstring$,"Citrine";
- break;
- case 2:
- mes "[Bazo]";
- mes "Turquoise...okay. Before we start,";
- set @gem, $@LV4_Turquoise;
- set @gemstring$,"Turquoise";
- break;
- case 3:
- mes "[Bazo]";
- mes "Agate....okay. Before we start,";
- set @gem, $@LV4_Agate;
- set @gemstring$,"Agate";
- break;
- }
-
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_CT:
- mes "[Bazo]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Citrine", "Turquoise" ) ) {
- case 1:
- mes "[Bazo]";
- mes "Citrine...okay. Before we start,";
- set @gem, $@LV4_Citrine;
- set @gemstring$,"Citrine";
- break;
- case 2:
- mes "[Bazo]";
- mes "Turquoise...okay. Before we start,";
- set @gem, $@LV4_Turquoise;
- set @gemstring$,"Turquoise";
- break;
- }
-
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_CA:
- mes "[Bazo]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Citrine", "Agate" ) ) {
- case 1:
- mes "[Bazo]";
- mes "Citrine...okay. Before we start,";
- set @gem, $@LV4_Citrine;
- set @gemstring$,"Citrine";
- break;
- case 2:
- mes "[Bazo]";
- mes "Agate....okay. Before we start,";
- set @gem, $@LV4_Agate;
- set @gemstring$,"Agate";
- break;
- }
-
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_TA:
- mes "[Bazo]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Turquoise", "Agate" ) ) {
- case 1:
- mes "[Bazo]";
- mes "Turquoise...okay. Before we start,";
- set @gem, $@LV4_Turquoise;
- set @gemstring$,"Turquoise";
- break;
- case 2:
- mes "[Bazo]";
- mes "Agate....okay. Before we start,";
- set @gem, $@LV4_Agate;
- set @gemstring$,"Agate";
- break;
- }
-
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_C:
- mes "[Bazo]";
- mes "Citrine...okay. Before we start,";
- set @gem, $@LV4_Citrine;
- set @gemstring$,"Citrine";
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_T:
- mes "[Bazo]";
- mes "Turquoise...okay. Before we start,";
- set @gem, $@LV4_Turquoise;
- set @gemstring$,"Turquoise";
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_A:
- mes "[Bazo]";
- mes "Agate....okay. Before we start,";
- set @gem, $@LV4_Agate;
- set @gemstring$,"Agate";
- goto LV4_1_PICK;
- end; // shouldn't be here
-
-
-LV4_1_PICK:
- mes "we must do one thing first.";
- mes "That is, testing your luck.";
- mes "As you already know,";
- mes "I cannot guarantee you that we will succeed";
- mes "to make one right away.";
- next;
- mes "[Bazo]";
- mes "If we can raise your luck before we start,";
- mes "we will be able to succeed.";
- next;
- mes "[Bazo]";
- mes "Now you must be wondering what we";
- mes "will do in order to increase your luck.";
- mes "It is simple, we will play a mind-reading game.";
- mes "I am going to think of one monster among 4 of my favorite ones,";
- mes "you will guess what the monster is.";
- next;
- mes "[Bazo]";
- mes "You must answer correctly at least";
- mes "1 out of 5 times. It shouldn't be that difficult.";
- mes "And if you fail to answer, we must do something else";
- mes "to drive away your bad luck.";
- next;
- mes "[Bazo]";
- mes "I will take 10 of the special ore you chose.";
- mes "Well, I understand that it does not sound tempting";
- mes "but let's think of it this way.";
- mes "It is much better than wasting 30 ore";
- mes "by failing to create the item, isn't it?";
- next;
- mes "[Bazo]";
- mes "Okay, now I need some time to prepare...";
- mes "Talk to you later!";
-
- if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
- if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
- if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
- delitem $@LV4_Gold, 10;
- delitem $@LV4_Steel, 50;
- delitem $@LV4_Emperium, 10;
- if(@gem == $@LV4_Citrine) set lv4_weapon, 2;
- if(@gem == $@LV4_Turquoise) set lv4_weapon, 3;
- if(@gem == $@LV4_Agate) set lv4_weapon, 4;
- close;
-
-
-LV4_1_NOGEM:
- mes "[Bazo]";
- mes "I seem to recall that I asked you to bring";
- mes "30 of a special ore, Citrine, Turquoise, or Agate...";
- mes "And I don't see any of them.";
- mes "You must have forgot them. Please go get them too.";
- close;
-
-
-LV4_1_FAIL:
- mes "[Bazo]";
- mes "Please bring me 10 Gold, 50 Steel and 10 Emperium";
- mes "as basic materials...";
- mes "and you can enchant the product with a certain trait.";
- mes "For that, I need some rare ores...";
- next;
- mes "[Bazo]";
- mes "Please bring me 30 of either Citrine, Turquoise or Agate.";
- mes "Each one of them possess their own attribute";
- mes "and using the ore you have brought,";
- mes "my product will possess a special trait.";
- next;
- mes "[Bazo]";
- mes "I wish you good luck...";
- mes "I will wait for you!";
- close;
-
-
-
-//--------------------------------------------------
-//Guessing Game
-//--------------------------------------------------
-LV4_2:
- if(lv4_weapon == 2) set @gem, $@LV4_Citrine;
- if(lv4_weapon == 3) set @gem, $@LV4_Turquoise;
- if(lv4_weapon == 4) set @gem, $@LV4_Agate;
- if(countitem(@gem) < 30) goto LV4_2_NOGEM;
-
- mes "[Bazo]";
- mes "Ok, you seem to be ready.";
- mes "Let's get started.";
- mes "My favorite monsters are Poring,";
- mes "Hode, Obeaune, and Minorous.";
- next;
-
- set @dap, 0;
- set @correct[0],1;
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- mes "[Bazo]";
-
- if(@i == 1) mes "Here's the 1st question. Guess what monster";
- if(@i != 1) mes "Alright. Now guess what monster";
-
- mes "I have in my mind at this moment.";
- next;
-
- set @mons, rand(1, 4);
-
- switch( select( "Poring", "Hode", "Obeaune", "Minorous" ) ) {
- case 1:
- set @correct[@i], 1;
- if(@mons == 1) set @dap, @dap + 1;
- break;
-
- case 2:
- set @correct[@i], 2;
- if(@mons == 2) set @dap, @dap + 1;
- break;
-
- case 3:
- set @correct[@i], 3;
- if(@mons == 3) set @dap, @dap + 1;
- break;
-
- case 4:
- set @correct[@i], 4;
- if(@mons == 4) set @dap, @dap + 1;
- break;
- }
- }
-
- mes "[Bazo]";
- mes "Okay, let me give you answers for the questions.";
- mes "I was thinking of the monsters in the order of";
- next;
- mes "[Bazo]";
-
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- if(@correct[@i] == 1) mes "Poring";
- if(@correct[@i] == 2) mes "Hode";
- if(@correct[@i] == 3) mes "Obeaune";
- if(@correct[@i] == 4) mes "Minorous";
- }
-
- if(@dap < 1) goto LV4_2_FAIL;
-
- next;
- mes "[Bazo]";
- mes "You answered " + @dap + " times!";
- mes "I must say you're amazing!";
- mes "As I promised, I will make an Umbala specialty for you.";
- mes "Please give me some time to prepare.";
- mes "Talk to you later.";
-
- if(countitem(@gem) < 30) goto LV4_HACK;
- delitem @gem, 30;
- set lv4_weapon, lv4_weapon + 3;
- close;
-
-
-LV4_2_FAIL:
- if(countitem(@gem) < 10) goto LV4_HACK;
- delitem @gem, 10;
-
- next;
- mes "[Bazo]";
- mes "Errr... I don't think you are good at reading";
- mes "other people's minds. Or you had bad luck, I guess.";
- mes "We cannot do that again unless";
- mes "we drive away the bad luck.";
- mes "Give me 10 " + @gemstring$ + ", that will do the job.";
- next;
- mes "[Bazo]";
- mes "Well...if you want to do this mind-reading game again,";
- mes "please come back with the materials.";
- mes "I will wait here for you.";
- close;
-
-
-LV4_2_NOGEM:
- mes "[Bazo]";
- mes "Errr...something doesn't feel right. We lack something...";
- mes "Will you check the materials that you have brought?";
- close;
-
-
-
-//--------------------------------------------------
-//Weapon Creation
-//--------------------------------------------------
-LV4_5:
- mes "[Bazo]";
- mes "Great... now, let's do it!";
- mes "Wish me luck...ah, I forgot to tell you this.";
- mes "I cannot tell you what kind of product it will be. It is so random.";
- mes "Let's wish that a good thing will come out, okay?";
- next;
- mes "- You feel unknown power start gathering in -";
- mes "- the materials. It seems the materials are -";
- mes "- absorbing all the evil power in the air. -";
- next;
- mes "- Then, the materials start merging into one -";
- mes "- even though Bazo didn't touch them at all. -";
- next;
- mes "[Bazo]";
- mes "Can you feel that? The materials are gathering";
- mes "power at their own will.";
- mes "They are out of my hand now. Let's wait and hope.";
- next;
- mes "- After a while, the air becomes calm -";
- mes "- and you check the result. -";
- next;
- mes "[Bazo]";
- mes "Ooooooh! It is done!";
- mes "We have succeeded! Ah, it's amazing!";
- mes "Did I tell you that it is really rare to succeed right away?";
- mes "Yes, God must have listened to our prayers.";
- mes "Oh, it is a weapon! It will be very useful to you.";
- mes "Let's take a closer look...";
- next;
-
- mes "[Bazo]";
-
- switch( lv4_weapon ) {
- case 5:
- mes "Immaterial Sword!";
- getitem 1141, 1; // 1141,Immaterial_Sword
- break;
- case 6:
- mes "it is Slash!";
- getitem 1526, 1; // 1526,Slash
- break;
- case 7:
- mes "it is Quadrille!";
- getitem 1527, 1; // 1527,Quadrille
- break;
- }
-
- set lv4_weapon, 0;
- mes "This sword was born to be yours!";
- mes "Congratulations and hopefully it will have a good use for you.";
- next;
-
- mes "[Bazo]";
- mes "I feel so gratified. If you wish to have";
- mes "another one, please feel free to visit me anytime.";
- mes "Have a good travel!";
- close;
-
-
-
-//--------------------------------------------------
-//Other Quests
-//--------------------------------------------------
-LV4_7:
- mes "[Bazo]";
- mes "Hmm...I feel something strange from you.";
- mes "I regret to say that there is nothing I can do for you.";
- mes "I hope you have a safe travel.";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Bazo]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//---------------------------------------------------------------
-// Hibilaithan, creates Mailbreaker, Swordbreaker and Slaughter
-//---------------------------------------------------------------
-
-umbala.gat,163,257,3 script Hibilaithan 785,{
- if(event_umbala < 3) goto LumWord;
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- Currently you are overweight. -";
- mes "- Please lighten your weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon == 8) goto LV4_8;
- if(lv4_weapon == 9) goto LV4_9;
- if(lv4_weapon == 10) goto LV4_9;
- if(lv4_weapon == 11) goto LV4_9;
- if(lv4_weapon == 12) goto LV4_12;
- if(lv4_weapon == 13) goto LV4_12;
- if(lv4_weapon == 14) goto LV4_12;
- if(lv4_weapon < 8) goto LV4_7;
- if(lv4_weapon > 14) goto LV4_7;
- end; // shouldn't be here
-
-
-LumWord:
- mes "[Hibilaithan]";
- mes "Umba! Umbaba...umum! Baumba!";
- mes "Umumumbababaumumbabaumba!";
- mes "Umbaumbaumbaumbaumhah!";
- mes "Umumumumumbababababab!";
- close;
-
-
-LV4_0:
- mes "[Hibilaithan]";
- mes "Haha, yeah, I knew this day would come.";
- mes "Finally people recognize my value";
- mes "as the best artisan in Umbala!";
- next;
- mes "[Hibilaithan]";
- mes "Okay, let's talk straight.";
- mes "I, Hibilaithan shall craft something nice";
- mes "if you bring me materials!";
- mes "Hahahahahaha!";
- next;
- mes "[Hibilaithan]";
- mes "Eh? What? You didn't come to see me?";
- mes "Stop joking around...Don't play me for a fool!";
- mes "People are too shy to tell the truth nowadays!";
- mes "Let's be honest and tell me if you want it or not.";
- next;
-
- switch( select( "...okay.", "...sorry, I don't need it!" ) ) {
- case 1:
- if(BaseLevel >= 70) goto L4_0_1;
-
- mes "[Hibilaithan]";
- mes "...what a shame! I regret to tell you this,";
- mes "but your spirit is too weak";
- mes "to handle the power of my stuff!";
- mes "This is not good, not good at all!";
- mes "Go and train yourself first.";
- mes "When you become strong, you may come back!";
- break;
-L4_0_1:
- mes "[Hibilaithan]";
- mes "Great! I like your attitute! Great, great!";
- mes "I am going to tell you what I need.";
- mes "It is not much, so do not forget.";
- next;
- mes "[Hibilaithan]";
- mes "Bring me 10 Gold, 50 Steel and 10 Emperium";
- mes "... as basic materials.";
- mes "And I need some rare ores to endow power...";
- next;
- mes "[Hibilaithan]";
- mes "Bring me 30 of one ore among Muscovite, Biotite or Pyroxene.";
- mes "Remember you are going to bring 30 of one ore.";
- mes "I cannot pick one among those because I am";
- mes "not sure what will come out. Heh.";
- next;
- mes "[Hibilaithan]";
- mes "Okay, wish you good luck!";
- mes "Meanwhile I am going to chill here.";
-
- set lv4_weapon, 8;
- break;
- case 2:
- mes "[Hibilaithan]";
- mes "Bah~ what are you afraid of?";
- mes "I am just trying to do you a favor, you know?";
- mes "Alright, it is your call.";
- mes "But if you change your mind,";
- mes "feel free to come back.";
- break;
- }
- close;
-
-
-
-//--------------------------------------------------
-//Gold, Steel, Emp Check + Choosing the gem
-//--------------------------------------------------
-LV4_8:
- if(countitem($@LV4_Gold) < 10) goto LV4_8_FAIL;
- if(countitem($@LV4_Steel) < 50) goto LV4_8_FAIL;
- if(countitem($@LV4_Emperium) < 10) goto LV4_8_FAIL;
-
- mes "[Hibilaithan]";
- mes "Oh...you have brought all the basic materials.";
- mes "Now let me check what kind of rare ores";
- mes "you have brought...";
- next;
-
- if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Biotite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_MBP;
- if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Biotite) >= 30) goto LV4_8_MB;
- if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_MP;
- if (countitem($@LV4_Biotite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_BP;
- if (countitem($@LV4_Muscovite) >= 30) goto LV4_8_M;
- if (countitem($@LV4_Biotite) >= 30) goto LV4_8_B;
- if (countitem($@LV4_Pyroxene) >= 30) goto LV4_8_P;
- goto LV4_8_NOGEM;
- end;
-
-
-LV4_8_MBP:
- mes "[Hibilaithan]";
- mes "Gosh, did you brought all three kinds?";
- mes "Hahaha, it's fine.";
- mes "But we cannot use all of them this time.";
- mes "Pick one that you want to use.";
- next;
-
- switch( select( "Muscovite", "Biotite", "Pyroxene" ) ) {
- case 1:
- mes "[Hibilaithan]";
- mes "Muscovite...okay. Before we start,";
- set @gem, $@LV4_Muscovite;
- set @gemstring$,"Muscovite";
- break;
- case 2:
- mes "[Hibilaithan]";
- mes "Biotite...okay. Before we start,";
- set @gem, $@LV4_Biotite;
- set @gemstring$,"Biotite";
- break;
- case 3:
- mes "[Hibilaithan]";
- mes "Pyroxene....okay. Before we start,";
- set @gem, $@LV4_Pyroxene;
- set @gemstring$,"Pyroxene";
- break;
- }
-
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_MB:
- mes "[Hibilaithan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Muscovite", "Biotite" ) ) {
- case 1:
- mes "[Hibilaithan]";
- mes "Muscovite...okay. Before we start,";
- set @gem, $@LV4_Muscovite;
- set @gemstring$,"Muscovite";
- break;
- case 2:
- mes "[Hibilaithan]";
- mes "Biotite...okay. Before we start,";
- set @gem, $@LV4_Biotite;
- set @gemstring$,"Biotite";
- break;
- }
-
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_MP:
- mes "[Hibilaithan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Muscovite", "Pyroxene" ) ) {
- case 1:
- mes "[Hibilaithan]";
- mes "Muscovite...okay. Before we start,";
- set @gem, $@LV4_Muscovite;
- set @gemstring$,"Muscovite";
- break;
- case 2:
- mes "[Hibilaithan]";
- mes "Pyroxene....okay. Before we start,";
- set @gem, $@LV4_Pyroxene;
- set @gemstring$,"Pyroxene";
- break;
- }
-
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_BP:
- mes "[Hibilaithan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Biotite", "Pyroxene" ) ) {
- case 1:
- mes "[Hibilaithan]";
- mes "Biotite...okay. Before we start,";
- set @gem, $@LV4_Biotite;
- set @gemstring$,"Biotite";
- break;
- case 2:
- mes "[Hibilaithan]";
- mes "Pyroxene....okay. Before we start,";
- set @gem, $@LV4_Pyroxene;
- set @gemstring$,"Pyroxene";
- break;
- }
-
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_M:
- mes "[Hibilaithan]";
- mes "Muscovite...okay. Before we start,";
- set @gem, $@LV4_Muscovite;
- set @gemstring$,"Muscovite";
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_B:
- mes "[Hibilaithan]";
- mes "Biotite...okay. Before we start,";
- set @gem, $@LV4_Biotite;
- set @gemstring$,"Biotite";
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_P:
- mes "[Hibilaithan]";
- mes "Pyroxene....okay. Before we start,";
- set @gem, $@LV4_Pyroxene;
- set @gemstring$,"Pyroxene";
- goto LV4_8_PICK;
- end; // shouldn't be here
-
-
-LV4_8_PICK:
- mes "we must do one thing first.";
- mes "That is, to test your luck.";
- mes "As you already know,";
- mes "I cannot guarantee you that we will succeed";
- mes "to make one right away.";
- next;
- mes "[Hibilaithan]";
- mes "If we can raise your luck before we start,";
- mes "we will be able to succeed.";
- next;
- mes "[Hibilaithan]";
- mes "Now you must be wondering what we";
- mes "will do in order to increase your luck.";
- mes "It is simple, we will play a mind-reading game.";
- mes "I am going to think of one monster among 4 of my favorites,";
- mes "you will guess what that monster is.";
- next;
- mes "[Hibilaithan]";
- mes "You must answer correctly at least";
- mes "1 out of 5 times. It should not be that difficult.";
- mes "And if you fail to answer, we must do something else";
- mes "to drive away your bad luck.";
- next;
- mes "[Hibilaithan]";
- mes "I will take 10 of the special ore you have chose.";
- mes "Well, I understand that it does not sound tempting";
- mes "but let's think of it this way.";
- mes "It is much better than wasting 30 ore";
- mes "by failing to create the item, isn't it?";
- next;
- mes "[Hibilaithan]";
- mes "Okay, now I need some time to prepare...";
- mes "Talk to you later!";
-
- if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
- if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
- if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
- delitem $@LV4_Gold, 10;
- delitem $@LV4_Steel, 50;
- delitem $@LV4_Emperium, 10;
- if(@gem == $@LV4_Muscovite) set lv4_weapon, 9;
- if(@gem == $@LV4_Biotite) set lv4_weapon, 10;
- if(@gem == $@LV4_Pyroxene) set lv4_weapon, 11;
- close;
-
-
-LV4_8_NOGEM:
- mes "[Hibilaithan]";
- mes "I seem to recall that I asked you to bring";
- mes "30 of a special ore among Muscovite, Biotite or Pyroxene...";
- mes "And I don't see any of them.";
- mes "You must have forgot that. Please go get them too.";
- close;
-
-
-LV4_8_FAIL:
- mes "[Hibilaithan]";
- mes "Please bring me 10 Gold, 50 Steel and 10 Emperium";
- mes "as basic materials...";
- mes "and you can enchant the product with a certain trait.";
- mes "For that, I need some rare ores...";
- next;
- mes "[Hibilaithan]";
- mes "Please bring me 30 of an ore among Citrine, Biotite or Pyroxene.";
- mes "Each one of them possess their own attributes";
- mes "and by using the ore you have brought,";
- mes "my product will possess a special trait.";
- next;
- mes "[Hibilaithan]";
- mes "I wish you good luck...";
- mes "I will wait for you!";
- close;
-
-
-
-//--------------------------------------------------
-//Guessing Game
-//--------------------------------------------------
-LV4_9:
- if(lv4_weapon == 9) set @gem, $@LV4_Muscovite;
- if(lv4_weapon == 10) set @gem, $@LV4_Biotite;
- if(lv4_weapon == 11) set @gem, $@LV4_Pyroxene;
- if(countitem(@gem) < 30) goto LV4_9_NOGEM;
-
- mes "[Hibilaithan]";
- mes "Okay, let's get started!";
- mes "It is simple. There are";
- mes "4 monsters that I like. I am going to think";
- mes "of a monster among the 4, you will guess what it is.";
- mes "We will play this game 5 times and you must";
- mes "answer correctly at least 1 out of 5 times. Doesn't that sound easy?";
- next;
- mes "[Hibilaithan]";
- mes "This is a very good game for";
- mes "increasing your luck!";
- mes "Okay, you better be ready now.";
- next;
-
- set @dap, 0;
- set @correct[0],1;
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- mes "[Hibilaithan]";
-
- if(@i == 1) mes "I like Zealotus, Alice,";
- if(@i == 1) mes "Munak, and Isis among all monsters.";
-
- mes "Now, guess which one";
- mes "I am thinking of at this moment.";
- next;
-
- set @mons, rand(1, 4);
-
- switch( select( "Zhertilsh", "Alice", "Munak", "Isis" ) ) {
- case 1:
- set @correct[@i], 1;
- if(@mons == 1) set @dap, @dap + 1;
- break;
-
- case 2:
- set @correct[@i], 2;
- if(@mons == 2) set @dap, @dap + 1;
- break;
-
- case 3:
- set @correct[@i], 3;
- if(@mons == 3) set @dap, @dap + 1;
- break;
-
- case 4:
- set @correct[@i], 4;
- if(@mons == 4) set @dap, @dap + 1;
- break;
- }
- }
-
- mes "[Hibilaithan]";
- mes "Okay, that's all! Now let me";
- mes "check the answers. I was thinking";
- mes "monsters in the order of...";
- next;
- mes "[Hibilaithan]";
-
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- if(@correct[@i] == 1) mes "Zhertilsh";
- if(@correct[@i] == 2) mes "Alice";
- if(@correct[@i] == 3) mes "Munak";
- if(@correct[@i] == 4) mes "Isis";
- }
-
- if(@dap < 1) goto LV4_9_FAIL;
-
- next;
- mes "[Hibilaithan]";
- mes "Wow, are you a mind reader or what?";
- mes "You answered " + @dap + " times correctly! Whoa...";
- mes "I guess you are already a lucky one,";
- mes "therefore we don't have any reason";
- mes "to prolong the work now!";
- mes "I need some time to prepare, talk to you later!";
-
- if(countitem(@gem) < 30) goto LV4_HACK;
- delitem @gem, 30;
- set lv4_weapon, lv4_weapon + 3;
- close;
-
-
-LV4_9_FAIL:
- if(countitem(@gem) < 10) goto LV4_HACK;
- delitem @gem, 10;
-
- next;
- mes "[Hibilaithan]";
- mes "This is not good, not good at all!";
- mes "You didn't even have a correct answer.";
- mes "We cannot start the work with this kind of result.";
- mes "Okay...we must drive away your bad luck first.";
- mes "10 " + @gemstring$ + " will do it!";
- next;
- mes "[Hibilaithan]";
- mes "Now, we need to play the game again.";
- mes "If you don't anymore ore, go get some.";
- mes "I am not going anywhere";
- mes "so you don't need to be in hurry.";
- mes "Take your time!";
- close;
-
-
-LV4_9_NOGEM:
- mes "[Hibilaithan]";
- mes "Hum. You might lack of";
- mes "materials? Check them again.";
- mes "See. I knew it.";
- close;
-
-
-
-//--------------------------------------------------
-//Weapon Creation
-//--------------------------------------------------
-LV4_12:
- mes "[Hibilaithan]";
- mes "Ah, I can tell you are ready. Alright...";
- mes "I will try to make an awsome item for you.";
- mes "...and you are not going to look over my shoulder!";
- mes "I don't want to share my secret recipe with anyone!";
- next;
- mes "- Hibilaithan picks up all the materials -";
- mes "- and turns his back at you. -";
- mes "- You see him busying himself with something. -";
- mes "- Although the way he is doing it -";
- mes "- looks very primitive and crude, -";
- mes "- you feel that some strange energy has gathered around him. -";
- next;
- mes "[Hibilaithan]";
- mes "Umm~ umm~ umm~";
- mes "Aww~aww~ aww~";
- mes "Phew~ phew~ phew~";
- mes "Woo~ woo~ woo~";
- mes "Ho~ ho~ ho~";
- next;
- mes "[Hibilaithan]";
- mes " ";
- mes " ";
- mes "Haha, there it is! Phew, that was really hard...";
- mes "You're anxious, aren't you? Ok, let's see...";
- next;
-
- mes "[Hibilaithan]";
- mes "It's a big success! Hahaha, sure, I made it...";
- mes "Therefore, it should be a big success.";
- mes "Oh, you got a weapon here...let's see,";
-
- switch( lv4_weapon ) {
- case 12:
- mes "it is a Mailbreaker!";
- getitem 1225, 1; // 1225,Mail_Breaker
- break;
- case 13:
- mes "it is a Swordbreaker!";
- getitem 1224, 1; // 1224,Sword_Breaker
- break;
- case 14:
- mes "it is a Slaughter!";
- getitem 1367, 1; // 1367,Slaughter
- break;
- }
-
- set lv4_weapon, 0;
- mes "This was made competely because I am that skillful,";
- mes "you got to be thankful for that!";
- next;
-
- mes "[Hibilaithan]";
- mes "Whenever you want to have a nice thing,";
- mes "come back to me anytime!";
- mes "I am a very generous genius, you know?";
- mes "Always be thankful for the weapon that I made for you, okay?";
- mes "See you!";
- close;
-
-
-
-//--------------------------------------------------
-//Other Quests
-//--------------------------------------------------
-LV4_7:
- mes "[Hibilaithan]";
- mes "Hmm...I feel something strange from you.";
- mes "I regret to say that there is nothing I can do for you.";
- mes "I hope you have a safe travel.";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Hibilaithan]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//--------------------------------------------------
-// Tabezthan, creates Talefing, Sabbath and Caesar's Sword
-//--------------------------------------------------
-
-um_in.gat,156,77,5 script Tabezthan 788,{
- if(event_umbala < 3) goto LumWord;
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- You are currently overweight. -";
- mes "- Please lose some weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon == 15) goto LV4_15;
- if(lv4_weapon == 16) goto LV4_16;
- if(lv4_weapon == 17) goto LV4_16;
- if(lv4_weapon == 18) goto LV4_16;
- if(lv4_weapon == 19) goto LV4_19;
- if(lv4_weapon == 20) goto LV4_19;
- if(lv4_weapon == 21) goto LV4_19;
- if(lv4_weapon < 15) goto LV4_14;
- if(lv4_weapon > 21) goto LV4_14;
- end; // shouldn't be here
-
-
-LumWord:
- mes "[Tabezthan]";
- mes "Umba! Umbaba...umum! Baumba!";
- mes "Umumumbababaumumbabaumba!";
- mes "Umbaumbaumbaumbaumhah!";
- mes "Umumumumumbababababab!";
- close;
-
-
-LV4_0:
- mes "[Tabezthan]";
- mes "Hmm...I feel something different about you...";
- mes "You are a stranger...aren't you?";
- next;
- mes "[Tabezthan]";
- mes "Let me introduce myself.";
- mes "I am Tabezthan,";
- mes "the storage of the knowledge and the genius of Umbala...";
- mes "Hahahaha.";
- next;
- mes "[Tabezthan]";
- mes "I have two diciples. One is Hibilaithan the fool";
- mes "and the other one is Bazo who is intelligent";
- mes "and is from outside the same as you.";
- next;
- mes "[Tabezthan]";
- mes "Of course both of them are talented and skillful";
- mes "but I am worried about Hibilaithan, for he";
- mes "makes many stupid mistakes and is shameless";
- mes "for what he has done.";
- next;
- mes "[Tabezthan]";
- mes "I have tought them how to manipulate";
- mes "the mysterious energy existing in Umbala";
- mes "for creating things with it..";
- mes "I heard that there is a similar skill called Alchemy";
- mes "in the outside world. Although I am not sure if I remember it correctly.";
- next;
- mes "[Tabezthan]";
- mes "Anyways, would you like to see my skill?";
- mes "If so, bring me materials I need,";
- mes "I am more than willing to present my skill for you.";
- next;
-
- switch( select( "Yes, please.", "No, thank you." ) ) {
- case 1:
- if(BaseLevel >= 70) goto L4_0_1;
-
- mes "[Tabezthan]";
- mes "Sebelumnya saya harus menekankan ini";
- mes "Barang spesial ini akan menjadi berbahaya jika kamu sendiri masih lemah";
- mes "Kamu harus lebih berpengalaman lagi anak muda";
- mes "Naikan level kamu terlebih dahulu";
- mes "jika kamu sudah merasa kuat kembalilah kesini kembali";
- mes "Sampai jumpa ~~";
- break;
-L4_0_1:
- mes "[Tabezthan]";
- mes "One with curiousity...he is called the young adventurer...";
- mes "Fine. Then let me inform you of";
- mes "the matetrials I need. Please memorize them";
- mes "or write them down.";
- mes "It is not much however.";
- next;
- mes "[Tabezthan]";
- mes "I need 10 Gold, 50 Steel and 10 Emperium";
- mes "as basic materials...";
- mes "and you can enchant the product with a certain trait.";
- mes "For that, I need some rare ores...";
- next;
- mes "[Tabezthan]";
- mes "Please bring me 30 of an ore among Phlogopite, Peridot or Rose Quartz.";
- mes "Each one of them possess their own attribute";
- mes "and by using the ore you have brought,";
- mes "my product will possess a special trait.";
- next;
- mes "[Tabezthan]";
- mes "However, please be aware that";
- mes "I cannot guarantee what will come out as a result.";
- mes "There are too many factors in the world of alchemy";
- mes "where my knowledge is limited.";
- mes "So you must be willing to accept the result as it is";
- mes "even if it does not satisfy your expectations.";
- next;
- mes "[Tabezthan]";
- mes "That means that you should place trust in luck.";
- mes "Let's talk about it later...please go prepare the materials first.";
- mes "Come back when you are ready.";
- mes "I will wait here.";
-
- set lv4_weapon, 15;
- break;
- case 2:
- mes "[Tabezthan]";
- mes "Oh...I see. I was not forcing you anyhow.";
- mes "However, it is a little bit dissappointing to hear that.";
- mes "I was going to display my ability at full length.";
- mes "When you change your mind, please come back.";
- break;
- }
- close;
-
-
-
-//--------------------------------------------------
-//Gold, Steel, Emp Check + Choosing the gem
-//--------------------------------------------------
-LV4_15:
- if(countitem($@LV4_Gold) < 10) goto LV4_15_FAIL;
- if(countitem($@LV4_Steel) < 50) goto LV4_15_FAIL;
- if(countitem($@LV4_Emperium) < 10) goto LV4_15_FAIL;
-
- mes "[Tabezthan]";
- mes "Ah~ you came back ealier than I thought.";
- mes "Let's see...you have all the basic materials...and";
- mes "we need one more thing, remember?";
- mes "Did you bring it as well?";
- next;
-
- if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Olivine) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_POR;
- if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Olivine) >= 30) goto LV4_15_PO;
- if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_PR;
- if (countitem($@LV4_Olivine) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_OR;
- if (countitem($@LV4_Phlogopite) >= 30) goto LV4_15_P;
- if (countitem($@LV4_Olivine) >= 30) goto LV4_15_O;
- if (countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_R;
- goto LV4_15_NOGEM;
- end;
-
-
-LV4_15_POR:
- mes "[Tabezthan]";
- mes "You made a great effort to bring all of them.";
- mes "However, you can only use one kind at a time.";
- mes "Please choose what you want to use this time.";
- next;
-
- switch( select( "Phlogopite", "Peridot", "Rose Quartz" ) ) {
- case 1:
- mes "[Tabezthan]";
- mes "Phlogopite...okay. Before we start,";
- set @gem, $@LV4_Phlogopite;
- set @gemstring$,"Phlogopite";
- break;
- case 2:
- mes "[Tabezthan]";
- mes "Peridot...okay. Before we start,";
- set @gem, $@LV4_Olivine;
- set @gemstring$,"Peridot";
- break;
- case 3:
- mes "[Tabezthan]";
- mes "Rose Quartz....okay. Before we start,";
- set @gem, $@LV4_Rose_Quartz;
- set @gemstring$,"Rose Quartz";
- break;
- }
-
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_PO:
- mes "[Tabezthan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Phlogopite", "Peridot" ) ) {
- case 1:
- mes "[Tabezthan]";
- mes "Phlogopite...okay. Before we start,";
- set @gem, $@LV4_Phlogopite;
- set @gemstring$,"Phlogopite";
- break;
- case 2:
- mes "[Tabezthan]";
- mes "Peridot...okay. Before we start,";
- set @gem, $@LV4_Olivine;
- set @gemstring$,"Peridot";
- break;
- }
-
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_PR:
- mes "[Tabezthan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Phlogopite", "Rose Quartz" ) ) {
- case 1:
- mes "[Tabezthan]";
- mes "Phlogopite...okay. Before we start,";
- set @gem, $@LV4_Phlogopite;
- set @gemstring$,"Phlogopite";
- break;
- case 2:
- mes "[Tabezthan]";
- mes "Rose Quartz....okay. Before we start,";
- set @gem, $@LV4_Rose_Quartz;
- set @gemstring$,"Rose Quartz";
- break;
- }
-
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_OR:
- mes "[Tabezthan]";
- mes "Hahaha, I asked you to bring one kind not two.";
- mes "You can only use one kind of ore.";
- mes "Which one would you like to use?";
- next;
-
- switch( select( "Peridot", "Rose Quartz" ) ) {
- case 1:
- mes "[Tabezthan]";
- mes "Peridot...okay. Before we start,";
- set @gem, $@LV4_Olivine;
- set @gemstring$,"Peridot";
- break;
- case 2:
- mes "[Tabezthan]";
- mes "Rose Quartz....okay. Before we start,";
- set @gem, $@LV4_Rose_Quartz;
- set @gemstring$,"Rose Quartz";
- break;
- }
-
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_P:
- mes "[Tabezthan]";
- mes "Phlogopite...okay. Before we start,";
- set @gem, $@LV4_Phlogopite;
- set @gemstring$,"Phlogopite";
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_O:
- mes "[Tabezthan]";
- mes "Peridot...okay. Before we start,";
- set @gem, $@LV4_Olivine;
- set @gemstring$,"Peridot";
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_R:
- mes "[Tabezthan]";
- mes "Rose Quartz....okay. Before we start,";
- set @gem, $@LV4_Rose_Quartz;
- set @gemstring$,"Rose Quartz";
- goto LV4_15_PICK;
- end; // shouldn't be here
-
-
-LV4_15_PICK:
- mes "we must do one thing first.";
- mes "That is, to test your luck.";
- mes "As you already know,";
- mes "I cannot guarantee you that we will succeed";
- mes "in makeing one right away.";
- next;
- mes "[Tabezthan]";
- mes "If we can raise your luck before we start,";
- mes "we will be able to succeed.";
- next;
- mes "[Tabezthan]";
- mes "Now you must be wondering what we";
- mes "will do in order to increase your luck.";
- mes "It is simple, we will play a mind-reading game.";
- mes "I am going to think of one monster among 4 of my favorites,";
- mes "you will guess what the monster is.";
- next;
- mes "[Tabezthan]";
- mes "You must answer correctly at least";
- mes "1 out of 5 times. It should not be that difficult.";
- mes "And if you fail to answer correctly, we must do something else";
- mes "to drive away your bad luck.";
- next;
- mes "[Tabezthan]";
- mes "I will take 10 of the special ore you chose.";
- mes "Well, I understand that it does not sound tempting";
- mes "but let's think of it this way.";
- mes "It is much better than wasting 30 ore";
- mes "by failing to create the item, isn't it?";
- next;
- mes "[Tabezthan]";
- mes "Okay, now I need some time to prepare...";
- mes "Talk to you later!";
-
- if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
- if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
- if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
- delitem $@LV4_Gold, 10;
- delitem $@LV4_Steel, 50;
- delitem $@LV4_Emperium, 10;
- if(@gem == $@LV4_Phlogopite) set lv4_weapon, 16;
- if(@gem == $@LV4_Olivine) set lv4_weapon, 17;
- if(@gem == $@LV4_Rose_Quartz) set lv4_weapon, 18;
- close;
-
-
-LV4_15_NOGEM:
- mes "[Tabezthan]";
- mes "Hmmm...I cannot find any rare ores in";
- mes "the materials that you have brought...";
- mes "Please bring me 30 of an ore among Phlogopite, Peridot";
- mes "or Rose Quartz.";
- close;
-
-
-LV4_15_FAIL:
- mes "[Tabezthan]";
- mes "I need 10 Gold, 50 Steel and 10 Emperium";
- mes "as basic materials...";
- mes "and you can enchant the product with a certain trait.";
- mes "For that, I need some rare ores...";
- next;
- mes "[Tabezthan]";
- mes "Please bring me 30 of an ore among Phlogopite, Peridot or Rose Quartz.";
- mes "Each one of them possess their own attribute";
- mes "and by using the ore you have brought,";
- mes "my product will possess a special trait.";
- close;
-
-
-
-//--------------------------------------------------
-//Guessing Game
-//--------------------------------------------------
-LV4_16:
- if(lv4_weapon == 16) set @gem, $@LV4_Phlogopite;
- if(lv4_weapon == 17) set @gem, $@LV4_Olivine;
- if(lv4_weapon == 18) set @gem, $@LV4_Rose_Quartz;
- if(countitem(@gem) < 30) goto LV4_2_NOGEM;
-
- mes "[Tabezthan]";
- mes "Okay, let's get started!";
- mes "It is simple. There are";
- mes "4 monsters that I like. I am going to think";
- mes "of a monster among the 4, you will guess what it is.";
- mes "We will play this game 5 times and you must";
- mes "answer correctly at least 1 out of 5 times. Doesn't it sound easy?";
- next;
- mes "[Hibilaithan]";
- mes "This is a very good game for";
- mes "increasing your luck!";
- mes "Okay, better be ready now.";
- next;
-
- set @dap, 0;
- set @correct[0],1;
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- mes "[Tabezthan]";
-
- if(@i == 1) mes "I like Baphomet, Dark Lord,";
- if(@i == 1) mes "Bloody Knight, and Stormy Knight among all monsters.";
-
- mes "Now, guess which one";
- mes "I am thinking at this moment.";
- next;
-
- set @mons, rand(1, 4);
-
- switch( select( "Baphomet", "Dark Lord", "Bloody Knight", "Stormy Knight" ) ) {
- case 1:
- set @correct[@i], 1;
- if(@mons == 1) set @dap, @dap + 1;
- break;
-
- case 2:
- set @correct[@i], 2;
- if(@mons == 2) set @dap, @dap + 1;
- break;
-
- case 3:
- set @correct[@i], 3;
- if(@mons == 3) set @dap, @dap + 1;
- break;
-
- case 4:
- set @correct[@i], 4;
- if(@mons == 4) set @dap, @dap + 1;
- break;
- }
- }
-
- mes "[Tabezthan]";
- mes "Okay, that's all! Now let me check";
- mes "the answers. I was thinking";
- mes "of the monsters in the order of...";
- next;
- mes "[Tabezthan]";
-
- for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
- if(@correct[@i] == 1) mes "Baphomet";
- if(@correct[@i] == 2) mes "Dark Lord";
- if(@correct[@i] == 3) mes "Bloody Knight";
- if(@correct[@i] == 4) mes "Stormy Knight";
- }
-
- if(@dap < 1) goto LV4_16_FAIL;
-
- next;
- mes "[Tabezthan]";
- mes "You have answered " + @dap + " times correctly.";
- mes "It seems that your luck is at its highest.";
- mes "I need some time to prepare, talk to you later.";
-
- if(countitem(@gem) < 30) goto LV4_HACK;
- delitem @gem, 30;
- set lv4_weapon, lv4_weapon + 3;
- close;
-
-
-LV4_16_FAIL:
- if(countitem(@gem) < 10) goto LV4_HACK;
- delitem @gem, 10;
-
- next;
- mes "[Tabezthan]";
- mes "Unfortunately you have failed...";
- mes "When you have bad luck, you'd better";
- mes "not expect a good result.";
- mes "Okay, we must drive away your bad luck.";
- mes "10 " + @gemstring$ + " will do it.";
- next;
- mes "[Tabezthan]";
- mes "Do not be so dissappointed.";
- mes "It is still better than wasting 30 of them";
- mes "for trying to make a thing when you know";
- mes "you would not make it. ";
- next;
- mes "[Tabezthan]";
- mes "If you need something to prepare,";
- mes "please do. I will wait for you here.";
- close;
-
-
-LV4_16_NOGEM:
- mes "[Tabezthan]";
- mes "Umm...it seems you are lacking " + @gemstring$;
- mes "Please count them and";
- mes "if you don't have enough,";
- mes "you can go gather more first.";
- close;
-
-
-
-//--------------------------------------------------
-//Weapon Creation
-//--------------------------------------------------
-LV4_19:
- mes "[Tabezthan]";
- mes "Great, I am also ready.";
- mes "Shall we start now? Give me a minute.";
- mes "I need to arrange these materials in a magic circle.";
- next;
- mes "- He arranges materials in a strange circle -";
- mes "- and starts chanting in a strange language. -";
- mes "- As he does that, suddenly the air surrounding him -";
- mes "- seems to change and you feel something powerful-";
- mes "- gathering around him and the materials. -";
- next;
- mes "[Tabezthan]";
- mes "Please understand that the power is not from me.";
- mes "I just used my ability to gather the power into these materials.";
- mes "The power has come from the city of the dead.";
- next;
- mes "[Tabezthan]";
- mes "The result is in God's hands.";
- mes "Let's pray for a good result together.";
- mes "Hmmmmm!";
- next;
- mes "- After a while...you find the materials -";
- mes "- are gathering and combining into one new thing. -";
- mes "- Does that mean that you have succeeded or failed?! -";
- next;
- mes "[Tabezthan]";
- mes "?!...God must bless you!";
- mes "I cannot believe that I created such a rare weapon!";
- mes "Yes, my late father told me the name of this weapon.";
-
- switch( lv4_weapon ) {
- case 19:
- mes "That is Caesar's Sword.";
- getitem 1134, 1; // 1134,Caesar's_Sword
- break;
- case 20:
- mes "That is Talefing.";
- getitem 1139, 1; // 1139,Talefing_
- break;
- case 21:
- mes "That is Sabbath.";
- getitem 1365, 1; // 1365,Sabbath
- break;
- }
-
- set lv4_weapon, 0;
- mes "[Tabezthan]";
- mes "Now, since I made this with materials";
- mes "that you have brought, this is yours now.";
- mes "I only helped you to make it,";
- mes "and I am glad to give this to you.";
- next;
- mes "[Tabezthan]";
- mes "Well, feel free to come back";
- mes "if you want to make a thing again...hahaha.";
- mes "The weapon was made to be yours.";
- close;
-
-
-
-//--------------------------------------------------
-//Other Quests
-//--------------------------------------------------
-LV4_14:
- mes "[Tabezthan]";
- mes "Umm...you don't have a business with me, do you?";
- mes "Please do not think of me as an old fool.";
- mes "When a man gets older, he can see through other people's minds.";
- mes "Go ahead and do what you have been doing.";
- mes "Do not let me intrrupt you any longer.";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Tabezthan]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//--------------------------------------------------
-// Bill Thayer, Gives hints for S grade weapons quests
-//--------------------------------------------------
-
-aldebaran.gat,178,239,3 script Bill Thayer 712,{
- // Explain Materials
- if(lv4_weapon == 26) goto LV4_26;
- if(lv4_weapon == 27) goto LV4_27;
- if(lv4_weapon == 28) goto LV4_28;
-
- if(lv4_weapon == 35) goto LV4_35;
- if(lv4_weapon == 36) goto LV4_36;
- if(lv4_weapon == 37) goto LV4_37;
-
- if(lv4_weapon == 44) goto LV4_44;
- if(lv4_weapon == 45) goto LV4_45;
- if(lv4_weapon == 46) goto LV4_46;
-
- if(lv4_weapon == 53) goto LV4_53;
- if(lv4_weapon == 54) goto LV4_54;
- if(lv4_weapon == 55) goto LV4_55;
-
- // Guide
- if(lv4_weapon == 22) goto LV4_22;
- if(lv4_weapon == 23) goto LV4_23;
-
- if(lv4_weapon == 31) goto LV4_31;
- if(lv4_weapon == 32) goto LV4_32;
-
- if(lv4_weapon == 40) goto LV4_40;
- if(lv4_weapon == 41) goto LV4_41;
-
- if(lv4_weapon == 49) goto LV4_49;
- if(lv4_weapon == 50) goto LV4_50;
-
- mes "[Bill Thayer]";
- mes "...I cannot do anything now.";
- mes "In the past, I used to be a well-known weaponsmith";
- mes "but now I am just a lonely old man who lost all of his sons.";
- mes "Please leave me alone.";
- close;
-
-LV4_27:
-LV4_28:
-LV4_36:
-LV4_37:
-LV4_45:
-LV4_46:
-LV4_54:
-LV4_55:
- if(lv4_weapon == 27)
-{
- set @LV4_Gem1Name$, "Peridot";
- set @LV4_Gem2Name$, "Turquoise";
- set @LV4_Gem3Name$, "Agate";
-}
- if(lv4_weapon == 28)
-{
- set @LV4_Gem1Name$, "Phlogopite";
- set @LV4_Gem2Name$, "Pyroxene";
- set @LV4_Gem3Name$, "Rose Quartz";
-}
- if(lv4_weapon == 36)
-{
- set @LV4_Gem1Name$, "Muscovite";
- set @LV4_Gem2Name$, "Rose Quartz";
- set @LV4_Gem3Name$, "Peridot";
-}
- if(lv4_weapon == 37)
-{
- set @LV4_Gem1Name$, "Biotite";
- set @LV4_Gem2Name$, "Agate";
- set @LV4_Gem3Name$, "Citrine";
-}
- if(lv4_weapon == 45)
-{
- set @LV4_Gem1Name$, "Turquoise";
- set @LV4_Gem2Name$, "Biotite";
- set @LV4_Gem3Name$, "Rose Quartz";
-}
- if(lv4_weapon == 46)
-{
- set @LV4_Gem1Name$, "Citrine";
- set @LV4_Gem2Name$, "Pyroxene";
- set @LV4_Gem3Name$, "Phlogopite";
-}
- if(lv4_weapon == 54)
-{
- set @LV4_Gem1Name$, "Muscovite";
- set @LV4_Gem2Name$, "Agate";
- set @LV4_Gem3Name$, "Citrine";
-}
- if(lv4_weapon == 55)
-{
- set @LV4_Gem1Name$, "Pyroxene";
- set @LV4_Gem2Name$, "Turquoise";
- set @LV4_Gem3Name$, "Phlogopite";
-}
-
- mes "[Bill Thayer]";
- mes "Hmm...it seems that you need 30 of";
- mes @LV4_Gem1Name$ + ", " + @LV4_Gem2Name$ + ", and " + @LV4_Gem3Name$;
- mes "I am sure that those are the materials...";
- mes "but I cannot guarantee anything about the result...";
- next;
- mes "[Bill Thayer]";
- mes "My sons passed away before we finished this research...";
- mes "Hahaha...let's not talk about it.";
- mes "I told you what you need anyway.";
- close;
-
-
-LV4_26:
-LV4_35:
-LV4_44:
-LV4_53:
- mes "[Bill Thayer]";
- if(lv4_weapon == 26) mes "What, Kayron's research?";
- if(lv4_weapon == 35) mes "What, Reyghema's research?";
- if(lv4_weapon == 44) mes "What? Hein's research?";
- if(lv4_weapon == 53) mes "What? Waltboughst's research?";
- mes "How do you know him?";
- mes "Were you a friend of him when he was still alive?";
- mes "Ah....there must an act of providence.";
- next;
-
- set lv4_weapon, lv4_weapon + rand(1, 2);
-
- switch( lv4_weapon ) {
- case 27:
- set @LV4_Gem1Name$, "Peridot";
- set LV4_Gem1, $@LV4_Olivine;
- set @LV4_Gem2Name$, "Turquoise";
- set LV4_Gem2, $@LV4_Turquoise;
- set @LV4_Gem3Name$, "Agate";
- set LV4_Gem3, $@LV4_Agate;
- break;
- case 28:
- set @LV4_Gem1Name$, "Phlogopite";
- set LV4_Gem1, $@LV4_Phlogopite;
- set @LV4_Gem2Name$, "Pyroxene";
- set LV4_Gem2, $@LV4_Pyroxene;
- set @LV4_Gem3Name$, "Rose Quartz";
- set LV4_Gem3, $@LV4_Rose_Quartz;
- break;
- case 36:
- set @LV4_Gem1Name$, "Muscovite";
- set LV4_Gem1, $@LV4_Muscovite;
- set @LV4_Gem2Name$, "Rose Quartz";
- set LV4_Gem2, $@LV4_Rose_Quartz ;
- set @LV4_Gem3Name$, "Peridot";
- set LV4_Gem3, $@LV4_Olivine;
- break;
- case 37:
- set @LV4_Gem1Name$, "Biotite";
- set LV4_Gem1, $@LV4_Biotite;
- set @LV4_Gem2Name$, "Agate";
- set LV4_Gem2, $@LV4_Agate;
- set @LV4_Gem3Name$, "Citrine";
- set LV4_Gem3, $@LV4_Citrine;
- break;
- case 45:
- set @LV4_Gem1Name$, "Turquoise";
- set LV4_Gem1, $@LV4_Turquoise;
- set @LV4_Gem2Name$, "Biotite";
- set LV4_Gem2, $@LV4_Biotite;
- set @LV4_Gem3Name$, "Rose Quartz";
- set LV4_Gem3, $@LV4_Rose_Quartz;
- break;
- case 46:
- set @LV4_Gem1Name$, "Citrine";
- set LV4_Gem1, $@LV4_Citrine;
- set @LV4_Gem2Name$, "Pyroxene";
- set LV4_Gem2, $@LV4_Pyroxene;
- set @LV4_Gem3Name$, "Phlogopite";
- set LV4_Gem3, $@LV4_Phlogopite;
- break;
- case 54:
- set @LV4_Gem1Name$, "Muscovite";
- set LV4_Gem1, $@LV4_Muscovite;
- set @LV4_Gem2Name$, "Agate";
- set LV4_Gem2, $@LV4_Agate;
- set @LV4_Gem3Name$, "Citrine";
- set LV4_Gem3, $@LV4_Citrine;
- break;
- case 55:
- set @LV4_Gem1Name$, "Pyroxene";
- set LV4_Gem1, $@LV4_Pyroxene;
- set @LV4_Gem2Name$, "Turquoise";
- set LV4_Gem2, $@LV4_Turquoise;
- set @LV4_Gem3Name$, "Phlogopite";
- set LV4_Gem3, $@LV4_Phlogopite;
- break;
- }
-
- mes "[Bill Thayer]";
- mes "Hmm...it seems that you need 30 of";
- mes @LV4_Gem1Name$ + ", " + @LV4_Gem2Name$ + ", and " + @LV4_Gem3Name$;
- mes "I am sure that those are the materials...";
- mes "but I cannot guarantee anything about the result...";
- next;
- mes "[Bill Thayer]";
- mes "My sons passed away before we finished this research...";
- mes "Hahaha...let's not talk about it.";
- mes "I told you what you need anyway.";
- close;
-
-
-LV4_22:
-LV4_23:
- mes "[Bill Thayer]";
- mes "Oh well, I told you already";
- mes "that there is nothing I can do for you...";
- mes "since my sons are all gone...why are";
- mes "you wasting my breath? ^4D4DFFYou are helpless.^000000";
- set lv4_weapon, 23;
- next;
- mes "[Bill Thayer]";
- mes "...you just made me";
- mes "miss my sons again...";
- mes "Please leave me alone.";
- close;
-
-
-LV4_31:
-LV4_32:
- mes "[Bill Thayer]";
- mes "All of my sons broke my heart by dying young...";
- mes "...youth...what is youth?";
- mes "^4D4DFFThat means that you never regret anything!^000000";
- set lv4_weapon, 32;
- next;
- mes "[Bill Thayer]";
- mes "That was what I used to tell to my sons.";
- mes "Please remember that,";
- mes "never regret anything that you have done.";
- mes "However, in order to do that, you must";
- mes "do everything right...that's all I can tell you for now.";
- close;
-
-
-LV4_40:
-LV4_41:
- mes "[Bill Thayer]";
- mes "...no matter how much you are willing to pay me,";
- mes "I am not going to forge any weapons.";
- mes "Even when I was actively forging weapons,";
- mes "I didn't accept money from my clients.";
- mes "You know why?";
- next;
- mes "[Bill Thayer]";
- mes "It brings me bad luck ^4D4DFFto^000000";
- mes "^4D4DFFforge a good weapon.^000000";
- mes "Therefore I didn't receive money from them.";
- set lv4_weapon, 41;
- next;
- mes "[Bill Thayer]";
- mes "Well, I am not going to do so";
- mes "even if you offer me something else other than money";
- mes "...unless all of my sons come back";
- mes "alive....";
- close;
-
-
-LV4_49:
-LV4_50:
- mes "[Bill Thayer]";
- mes "...do you not have anything to do?";
- mes "I hope you stop bothering me";
- mes "and trying your best for your work.";
- mes "Ah...trying best does not always";
- mes "result in a success though.";
- next;
- mes "[Bill Thayer]";
- mes "However, ^4D4DFFall the successful men^000000";
- mes "^4D4DFFin the history tried their best!^000000";
- mes "I hope you will remember that.";
- mes "I used to tell this to my sons when they were alive.";
- mes "Hahaha...";
- set lv4_weapon, 50;
- close;
-}
-
-//--------------------------------------------------
-// Kayron, creates Longinus' Spear, Guillotine, Great Axe and Brionac
-//--------------------------------------------------
-
-niflheim.gat,240,193,3 script Kayron 794, {
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- You are currently overweight. -";
- mes "- Please lose some weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
- mes "[Kayron]";
- mes "Bah, I cannot believe";
- mes "that such a weak man like you even came here.";
- mes "You have an invisible sign on your forehead";
- mes "that indicates you are a weakling. Be strong first.";
- close;
-
-
-LV4_LEVEL_PASS:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon < 22) goto LV4_21;
- if(lv4_weapon == 22) goto LV4_22;
- if(lv4_weapon == 23) goto LV4_23;
- if(lv4_weapon == 24) goto LV4_24;
- if(lv4_weapon == 25) goto LV4_25;
- if(lv4_weapon == 26) goto LV4_26;
- if(lv4_weapon == 27) goto LV4_27;
- if(lv4_weapon == 28) goto LV4_28;
- if(lv4_weapon == 29) goto LV4_29;
- if(lv4_weapon == 30) goto LV4_30;
- if(lv4_weapon > 30) goto LV4_31;
- end; // shouldn't be here
-
-
-LV4_0:
-LV4_22:
- mes "[Kayron]";
- mes "I used to be called Kayron when I was alive.";
- mes "But now I am nothing but";
- mes "a ghost wandering this place.";
- mes "I am worthless...I cannot do anything";
- mes "without a body...";
- next;
-
- if(lv4_weapon == 0) goto LV4_0_ASK;
-
- mes "[Kayron]";
- mes "Ah...I cannot remember what I was going to say...";
- mes "Waaahhh.....I cannot remember....";
- mes "My memory is gone...!";
- close;
-
-LV4_0_ASK:
- switch( select( "Show interest.", "Ignore him." ) ) {
- case 1:
- mes "[Kayron]";
- mes "Ah...I cannot remember what I was going to say...";
- mes "Waaahhh.....I cannot remember....";
- mes "My memory is gone...!";
- set lv4_weapon, 22;
- close;
- break;
- case 2:
- mes "- Because you decided to ignore him, -";
- mes "- you are no longer able to hear him. -";
- close;
- break;
- }
- end;
-
-
-LV4_21:
-LV4_31:
- mes "[Kayron]";
- mes "I feel something different about you.";
- mes "Did you come here with a purpose?";
- mes "I am envious of you...";
- close;
-
-
-LV4_23:
- mes "[Kayron]";
- mes "I used to be called Kayron when I was alive.";
- mes "But now I am nothing but";
- mes "a ghost wandering this place.";
- mes "I am worthless...I cannot do anything";
- mes "without a body...";
- next;
- set @dap1$, "You are helpless.";
- input @answer1$;
- if(@answer1$ == @dap1$) goto LV4_23_CORRECT;
- mes "[Kayron]";
- mes "...? What did you just say?";
- mes "I am sorry but I don't think I understood you.";
- close;
-
-LV4_23_CORRECT:
- mes "[Kayron]";
- mes "Yes, You are helpless...?! Eh?";
- mes "That was my father's favorite saying!";
- mes "Whoa?! Ah...";
- mes "Yes...I forgot that I am dead already.";
- mes "Why did you make me recall something from my past?";
- mes "It is no use now...";
- next;
- mes "[Kayron]";
- mes "But I want to do something in return...";
- mes "since you made me find a piece of my mind.";
- mes "I used to be a weaponsmith in the past,";
- mes "therefore I am going to forge a nice weapon for you.";
- next;
- mes "[Kayron]";
- mes "But you have to gather the materials for me.";
- mes "As you see, I do not have a body";
- mes "that would allow me to touch other objects...";
- mes "So you got to help me with that.";
- next;
- mes "[Kayron]";
- mes "Luckily this place is filled with mysterious energy,";
- mes "that makes my work easier!";
- mes "Heh, even if I fail to forge one,";
- mes "I don't have to worry about dying.";
- mes "Because I am dead already! Muhahahaha!";
- next;
- mes "[Kayron]";
- mes "I will talk to you in a while.";
- mes "I am trying to think of the receipe...";
- set lv4_weapon, 24;
- close;
-
-
-LV4_25:
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_25_BASE_MAT;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_25_BASE_MAT;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_25_BASE_MAT;
- if(countitem($@LV4_Gold) < 20) goto LV4_25_BASE_MAT;
-
- mes "[Kayron]";
- mes "Oh...you brought everything I need!";
- mes "You are a reliable person unlike your appearance.";
- mes "But here is the thing...";
- mes "There are some more materials I need...";
- mes "But I cannot think of any of them...my memory";
- mes "is unclear...arrrrph...";
- next;
- mes "[Kayron]";
- mes "I need to think about that a little longer.";
- mes "I know that I really need those materials...awwww....";
- mes "Do you have any idea to bring my memory back?";
- mes "At the same time, rest assured that the materials";
- mes "you brought will be used for my creation. So let me keep them for you.";
-
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
- if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
- delitem $@LV4_Hammer_Of_Blacksmith, 2;
- delitem $@LV4_Emperium_Anvil, 1;
- delitem $@LV4_Illusion_Flower, 1;
- delitem $@LV4_Gold, 20;
- set lv4_weapon, 26;
- close;
-
-LV4_24:
-LV4_25_BASE_MAT:
- switch( lv4_weapon ) {
- case 24:
- mes "[Kayron]";
- mes "Oh, you came back at a right time.";
- mes "I just finished my thoughts. Let me tell you one thing.";
- mes "I cannot guarantee you which weapon will come out of this.";
- mes "Also you must be willing to take a risk as well...";
- mes "I guess that the result will be affected by the power";
- mes "of Nifflheim at the time I make.";
- next;
- mes "[Kayron]";
- mes "Let me give you the list of materials";
- mes "I need. They are quite a lot,";
- mes "so write them down if you need.";
- break;
- case 25:
- mes "[Kayron]";
- mes "I will tell you the list of materials I need again.";
- mes "I think I need a lot of materials...so";
- mes "write them down if you need.";
- break;
- }
- next;
- mes "[Kayron]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- next;
- mes "[Kayron]";
- mes "Bring these to me first. I am kind of worried";
- mes "that I forgot something...but I will try to remember";
- mes "while waiting for you to bring these items.";
- next;
- mes "[Kayron]";
- mes "Have a safe travel.";
- set lv4_weapon, 25;
- close;
-
-
-LV4_27:
-LV4_28:
- if(countitem(LV4_Gem1) < 30) goto LV4_27_NOGEM;
- if(countitem(LV4_Gem2) < 30) goto LV4_27_NOGEM;
- if(countitem(LV4_Gem3) < 30) goto LV4_27_NOGEM;
- mes "[Kayron]";
- mes "...Um? The items that you brought to me seem";
- mes "to be good materials for my creation...";
- mes "Give them to me, I shall try first!";
- next;
- mes "[Kayron]";
- mes "Oh...I was right! How did you";
- mes "know these are materials I need?";
- mes "Great, give me a moment!";
- next;
- mes "[Kayron]";
- mes "...wait, I must test your luck first.";
- mes "Since I am not sure about the result,";
- mes "we should place trust in luck for the result of my creation.";
- mes "You must have good luck...";
- next;
- mes "[Kayron]";
- mes "We are going to play 'Rock, Paper, Scissors'.";
- mes "You must win at least 2 out of 3 times.";
- mes "If you fail, you must throw away a large amount";
- mes "of one of the 3 kinds of ore that you have brought.";
- mes "It is for driving away your bad luck.";
- next;
- mes "[Kayron]";
- mes "I will give you a piece of paper.";
- mes "You will write down one among 'Rock, Paper, or Scissors'.";
- mes "I will do the same at the same time.";
- mes "We will compare each other's paper after.";
- next;
-
- set @shobu, 0;
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@i == 2) mes "[Kayron]";
- if(@i == 2) mes "Let's play the second one!";
- if(@i == 3) mes "[Kayron]";
- if(@i == 3) mes "This will be the last one!";
- if(@i == 3) mes "Let's compare after this.";
- set @npchand[@i], rand(1, 3);
- switch( select( "Scissors", "Rock", "Paper" ) ) {
- case 1:
- set @myhand[@i], 1;
- if(@npchand[@i] == 3) set @shobu, @shobu + 1;
- break;
- case 2:
- set @myhand[@i], 2;
- if(@npchand[@i] == 1) set @shobu, @shobu + 1;
- break;
- case 3:
- set @myhand[@i], 3;
- if(@npchand[@i] == 2) set @shobu, @shobu + 1;
- break;
- }
- }
-
- if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
-
- if(@shobu > 1) goto LV4_27_WIN;
-
- switch ( rand(1 ,3) ) {
- case 1:
- delitem LV4_Gem1, 30;
- break;
- case 2:
- delitem LV4_Gem2, 30;
- break;
- case 3:
- delitem LV4_Gem3, 30;
- break;
- }
- goto LV4_27_RESULT;
-
-LV4_27_WIN:
- delitem LV4_Gem1, 30;
- delitem LV4_Gem2, 30;
- delitem LV4_Gem3, 30;
- set lv4_weapon, lv4_weapon + 2;
- goto LV4_27_RESULT;
-
-LV4_27_RESULT:
- mes "[Kayron]";
- mes "Okay...I played in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@npchand[@i] == 1) mes "Scissors";
- if(@npchand[@i] == 2) mes "Rock";
- if(@npchand[@i] == 3) mes "Paper";
- }
-
- next;
- mes "[Kayron]";
- mes "You did in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@myhand[@i] == 1) mes "Scissors";
- if(@myhand[@i] == 2) mes "Rock";
- if(@myhand[@i] == 3) mes "Paper";
- }
-
- next;
-
- if(@shobu > 1) goto LV4_27_SAY_WIN;
-
- mes "[Kayron]";
- mes "Well well well...you lost the game.";
- mes "Ah~ you were close though...";
- mes "We must drive away bad luck.";
- next;
- mes "[Kayron]";
- mes "Okay, I will wait here,";
- mes "go bring me the materials again...";
- close;
-
-LV4_27_SAY_WIN:
- mes "[Kayron]";
- mes "Let's see...";
- mes "You won total " + @shobu + " times.";
- mes "Ah~ you must be really good at game!";
- mes "Yes, your luck is at its highest!";
- next;
- mes "[Kayron]";
- mes "I am going to keep my promise.";
- mes "But I need some time to prepare.";
- mes "Give me the materials now and I will talk to you later.";
- close;
-
-LV4_26:
-LV4_27_NOGEM:
- mes "[Kayron]";
- mes "Arph...it has not gotten into my memory yet.";
- mes "Awww....this is a problem.";
- mes "I used to often discuss the materials";
- mes "with my family...now I cannot remember what they are...";
- close;
-
-
-LV4_29:
-LV4_30:
- mes "[Kayron]";
- mes "Hahaha...you came back at the right time.";
- mes "The result? Do you want to know about the result?...";
- mes "Haha...okay...let's see...";
- next;
- mes "[Kayron]";
- mes "...YES! It's a success!";
- mes "I created the weapon that got me killed last time!";
- mes "Look at this...haha! I died while making this!";
- mes "... The name of the weapon is...";
-
-
- switch( rand(1, 2) ) {
- case 1:
- if(lv4_weapon == 29) mes "Great Axe! Weee~ I made it!";
- if(lv4_weapon == 29) getitem 1364 ,1; // 1364,Great_Axe
- if(lv4_weapon == 30) mes "Longinus's Spear! Weee~ I made it!";
- if(lv4_weapon == 30) getitem 1469, 1; // 1469,Longinus's_Spear
- break;
- case 2:
- if(lv4_weapon == 29) mes "Guillotine! Weee~ I made it!";
- if(lv4_weapon == 29) getitem 1369, 1; // 1369,Guillotine
- if(lv4_weapon == 30) mes "Brionac! Weee~ I made it!";
- if(lv4_weapon == 30) getitem 1470, 1; // 1470,Brionac
- }
-
- set lv4_weapon, 0;
- next;
- mes "[Kayron]";
- mes "I finally succeeded in the research...";
- mes "I want to show this result to my father...";
- mes "He will be really happy for this.";
- next;
- mes "[Kayron]";
- mes "Ah~ I feel my memories are fading again...";
- mes "If you see me next time...";
- mes "please let me remember the memories again...";
- mes "Thank you...";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Kayron]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//--------------------------------------------------
-// Reyghema, creates Berserk, Tjungkulleti, Rudra's Bow and Brocca(Skewer)
-//--------------------------------------------------
-
-niflheim.gat,99,268,5 script Reyghema 794, {
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- You are currently overweight. -";
- mes "- Please lose some weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
- mes "[Reyghema]";
- mes "Um? Do you have any business with me?";
- mes "Sorry but I don't. I'm also not";
- mes "speaking to a weak person like you.";
- mes "Have a safe travel~";
- close;
-
-
-LV4_LEVEL_PASS:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon < 31) goto LV4_30;
- if(lv4_weapon == 31) goto LV4_31;
- if(lv4_weapon == 32) goto LV4_32;
- if(lv4_weapon == 33) goto LV4_33;
- if(lv4_weapon == 34) goto LV4_34;
- if(lv4_weapon == 35) goto LV4_35;
- if(lv4_weapon == 36) goto LV4_36;
- if(lv4_weapon == 37) goto LV4_37;
- if(lv4_weapon == 38) goto LV4_38;
- if(lv4_weapon == 39) goto LV4_39;
- if(lv4_weapon > 39) goto LV4_40;
- end; // shouldn't be here
-
-
-LV4_0:
-LV4_31:
- mes "[Reyghema]";
- mes "Darn it...I didn't want to die!";
- mes "Well...there is no living thing that wants to die but...";
- mes "Especially me, I was too young to die!";
- mes "Youth! ...Ah...I just remember the word.";
- mes "Speaking of which...I think I usually said something related to that...";
- next;
-
- if(lv4_weapon == 0) goto LV4_0_ASK;
-
- mes "[Reyghema]";
- mes "Ah...I cannot remember what I was going to say...";
- mes "Waaahhh.....I cannot remember....";
- mes "My memory is gone...!";
- close;
-
-LV4_0_ASK:
- switch( select( "Show interest.", "Igonore him." ) ) {
- case 1:
- mes "[Reyghema]";
- mes "Ah...I cannot remember what I was going to say...";
- mes "Waaahhh.....I cannot remember....";
- mes "My memory is gone...!";
- set lv4_weapon, 31;
- close;
- break;
- case 2:
- mes "- Because you decided to ignore him, -";
- mes "- you are no longer able to hear him. -";
- close;
- break;
- }
- end;
-
-
-LV4_30:
-LV4_40:
- mes "[Reyghema]";
- mes "I feel something different about you.";
- mes "Did you come here with a purpose?";
- mes "I am envious of you...";
- close;
-
-
-LV4_32:
- mes "[Reyghema]";
- mes "I used to be called Reyghema when I was alive.";
- mes "But now I am nothing but";
- mes "a ghost wandering this place.";
- mes "I am worthless...I cannot do anything";
- mes "without a body...";
- next;
- set @dap2$, "That means that you never regret anything!";
- input @answer2$;
- if(@answer2$ == @dap2$) goto LV4_32_CORRECT;
- mes "[Reyghema]";
- mes "What? Do you want to play a game with me or what?";
- mes "Unfortunately I have something to do...";
- mes "wait...what was I going to do?";
- close;
-
-LV4_32_CORRECT:
- mes "[Reyghema]";
- mes "...";
- next;
- mes "[Reyghema]";
- mes "...";
- mes "......";
- next;
- mes "[Reyghema]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Reyghema]";
- mes "That's right! I am Bill Thayer the Weaponsmith's";
- mes "second son! And I must forge a weapon";
- mes "in order to not regret my youth!";
- mes "Even if I am dead, I cannot give it up!";
- next;
- mes "[Reyghema]";
- mes "Hey you, thank you for letting me have my memory back!";
- mes "You need to do me another favor!";
- mes "Bring me some items, I need to forge a weapon.";
- mes "Once I make one, I will give it to you in return for your favor.";
- next;
- mes "[Reyghema]";
- mes "Reyghema, breathe deeply first...phew~.";
- mes "Give me a second!";
- set lv4_weapon, 33;
- close;
-
-
-LV4_34:
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_34_BASE_MAT;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_34_BASE_MAT;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_34_BASE_MAT;
- if(countitem($@LV4_Gold) < 20) goto LV4_34_BASE_MAT;
-
- mes "[Reyghema]";
- mes "Oh...you brought everything I need!";
- mes "You are a reliable person unlike you appear.";
- mes "But here is the thing...";
- mes "There are some more materials I need...";
- mes "But I cannot think of any of them...my memory";
- mes "is unclear...arrrrph...";
- next;
- mes "[Reyghema]";
- mes "I need to think about that a little longer.";
- mes "I know that I really need those materials...awwww....";
- mes "Do you have any idea to bring my memory back?";
- mes "At the same time, rest assured that the materials";
- mes "you brought will be used for my creation. So let me keep them for you.";
-
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
- if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
- delitem $@LV4_Hammer_Of_Blacksmith, 2;
- delitem $@LV4_Emperium_Anvil, 1;
- delitem $@LV4_Illusion_Flower, 1;
- delitem $@LV4_Gold, 20;
- set lv4_weapon, 35;
- close;
-
-LV4_33:
-LV4_34_BASE_MAT:
- switch( lv4_weapon ) {
- case 33:
- mes "[Reyghema]";
- mes "Okay. You don't need any other explaination, do you?";
- mes "I will tell you what I need";
- mes "so please do not forget those materials.";
- break;
- case 34:
- mes "[Reyghema]";
- mes "I will tell you the list of materials I need again.";
- mes "I think I need a lot of materials...so";
- mes "write them down if you need.";
- break;
- }
- next;
- mes "[Reyghema]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- mes "...wait...are they all...or do I need more?!";
- if(lv4_weapon == 33) next;
- if(lv4_weapon == 33) mes "[Reyghema]";
- if(lv4_weapon == 33) mes "Ah...I think need something more...it's very important...";
- if(lv4_weapon == 33) mes "But I cannot remember what more I need....!";
- if(lv4_weapon == 33) mes "Bah...this is so frustrating.";
- set lv4_weapon, 34;
- close;
-
-
-LV4_36:
-LV4_37:
- if(countitem(LV4_Gem1) < 30) goto LV4_36_NOGEM;
- if(countitem(LV4_Gem2) < 30) goto LV4_36_NOGEM;
- if(countitem(LV4_Gem3) < 30) goto LV4_36_NOGEM;
- mes "[Reyghema]";
- mes "...Um? The items that you brought to me seem";
- mes "to be good materials for my creation...";
- mes "Give them to me, I shall try first!";
- next;
- mes "[Reyghema]";
- mes "Oh...I was right! How did you";
- mes "know these are materials I need?";
- mes "Great, give me a moment!";
- next;
- mes "[Reyghema]";
- mes "...wait, I must test your luck first.";
- mes "Since I am not sure about the result,";
- mes "we should place trust in luck for the result of my creation.";
- mes "You must have good luck...";
- next;
- mes "[Reyghema]";
- mes "We are going to play 'Rock, Paper, Scissors'.";
- mes "You must win at least 2 out of 3 times.";
- mes "If you fail, you must leave a large amount";
- mes "of one material you have brought.";
- mes "It is for driving away your bad luck.";
- next;
- mes "[Reyghema]";
- mes "I will give you a piece of paper.";
- mes "You will write down one among 'Rock, Paper, or Scissors'.";
- mes "I will do the same at the same time.";
- mes "We will then compare each other's paper.";
- next;
-
- set @shobu, 0;
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@i == 2) mes "[Reyghema]";
- if(@i == 2) mes "Let's play the second one!";
- if(@i == 3) mes "[Reyghema]";
- if(@i == 3) mes "This will be the last one!";
- if(@i == 3) mes "Let's compare after this.";
- set @npchand[@i], rand(1, 3);
- switch( select( "Scissors", "Rock", "Paper" ) ) {
- case 1:
- set @myhand[@i], 1;
- if(@npchand[@i] == 3) set @shobu, @shobu + 1;
- break;
- case 2:
- set @myhand[@i], 2;
- if(@npchand[@i] == 1) set @shobu, @shobu + 1;
- break;
- case 3:
- set @myhand[@i], 3;
- if(@npchand[@i] == 2) set @shobu, @shobu + 1;
- break;
- }
- }
-
- if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
-
- if(@shobu > 1) goto LV4_36_WIN;
-
- switch ( rand(1 ,3) ) {
- case 1:
- delitem LV4_Gem1, 30;
- break;
- case 2:
- delitem LV4_Gem2, 30;
- break;
- case 3:
- delitem LV4_Gem3, 30;
- break;
- }
- goto LV4_36_RESULT;
-
-LV4_36_WIN:
- delitem LV4_Gem1, 30;
- delitem LV4_Gem2, 30;
- delitem LV4_Gem3, 30;
- set lv4_weapon, lv4_weapon + 2;
- goto LV4_36_RESULT;
-
-LV4_36_RESULT:
- mes "[Reyghema]";
- mes "Okay...I played in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@npchand[@i] == 1) mes "Scissors";
- if(@npchand[@i] == 2) mes "Rock";
- if(@npchand[@i] == 3) mes "Paper";
- }
-
- next;
- mes "[Reyghema]";
- mes "You did in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@myhand[@i] == 1) mes "Scissors";
- if(@myhand[@i] == 2) mes "Rock";
- if(@myhand[@i] == 3) mes "Paper";
- }
-
- next;
-
- if(@shobu > 1) goto LV4_36_SAY_WIN;
-
- mes "[Reyghema]";
- mes "Well well well...you lost the game.";
- mes "Ah~ you were close though...";
- mes "We must drive away bad luck.";
- next;
- mes "[Reyghema]";
- mes "Okay, I will wait here,";
- mes "go bring me the materials again...";
- close;
-
-LV4_36_SAY_WIN:
- mes "[Reyghema]";
- mes "Let's see...";
- mes "You won total " + @shobu + " times.";
- mes "Ah~ you must be really good at game!";
- mes "Yes, your luck is at its highest!";
- next;
- mes "[Reyghema]";
- mes "I am going to keep my promise.";
- mes "But I need some time to prepare.";
- mes "Give me the materials now and I will talk to you later.";
- close;
-
-LV4_35:
-LV4_36_NOGEM:
- mes "[Reyghema]";
- mes "Not yet! I have not remembered it yet! Awwww...";
- mes "This is killing me...";
- mes "Oh, wait...I died already...";
- mes "God damn it!";
- close;
-
-
-LV4_38:
-LV4_39:
- mes "[Reyghema]";
- mes "..................";
- next;
- mes "[Reyghema]";
- mes "...YES! It's a success!";
- mes "I created the weapon that got me killed last time!";
- mes "Look at this...haha! I died while making this!";
- mes "... The name of the weapon is...";
-
- switch( rand(1, 2) ) {
- case 1:
- if(lv4_weapon == 38) mes "Berserk! Weee~ Weee~ I made it!";
- if(lv4_weapon == 38) getitem 1814 ,1; // 1814,Berserk
- if(lv4_weapon == 39) mes "Tjungkuletti! Weee~ I made it!";
- if(lv4_weapon == 39) getitem 1416, 1; // 1416,Tjungkuletti
- break;
- case 2:
- if(lv4_weapon == 38) mes "Rudra's Bow! Weee~ I made it!";
- if(lv4_weapon == 38) getitem 1720, 1; // 1720,Bow_of_Rudra
- if(lv4_weapon == 39) mes "Brocca!";
- if(lv4_weapon == 39) getitem 1415, 1; // 1415,Skewer
- }
-
- set lv4_weapon, 0;
- next;
- mes "[Reyghema]";
- mes "...*sigh*.";
- next;
- mes "[Reyghema]";
- mes "Happiness lasts too short...";
- mes "As I am a dead man, I think I am not allowed";
- mes "to keep the memory of past....";
- mes "My memory is fading again...";
- next;
- mes "[Reyghema]";
- mes "But thank you for letting me achieve";
- mes "my long-cherished desire.";
- mes "If we meet again, please let me";
- mes "retrieve my memory of past again.";
- mes "So I can try forging another weapon.";
- next;
- mes "[Reyghema]";
- mes "Farewell, adventurer.";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Reyghema]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//--------------------------------------------------
-// Hein, creates Excalibur, Schweisersabel, Dragon Slayer and Edge
-//--------------------------------------------------
-
-niflheim.gat,187,280,3 script Hein 795, {
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- You are currently overweight. -";
- mes "- Please lose some weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
- mes "[Hein]";
- mes "You should care about other people";
- mes "more than yourself...";
- mes "You are quite weak for an adventurer.";
- close;
-
-
-LV4_LEVEL_PASS:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon < 40) goto LV4_39;
- if(lv4_weapon == 40) goto LV4_40;
- if(lv4_weapon == 41) goto LV4_41;
- if(lv4_weapon == 42) goto LV4_42;
- if(lv4_weapon == 43) goto LV4_43;
- if(lv4_weapon == 44) goto LV4_44;
- if(lv4_weapon == 45) goto LV4_45;
- if(lv4_weapon == 46) goto LV4_46;
- if(lv4_weapon == 47) goto LV4_47;
- if(lv4_weapon == 48) goto LV4_48;
- if(lv4_weapon > 48) goto LV4_49;
- end; // shouldn't be here
-
-
-LV4_0:
-LV4_40:
- mes "[Hein]";
- mes "Ah...are you going to ask me something?";
- mes "However, I am not accepting money";
- mes "from my client. Because.";
- mes "It brings me bad luck to...";
- mes "...whaat? What did I just say?";
- mes "Awww....I am confused.";
- next;
-
- if(lv4_weapon == 0) goto LV4_0_ASK;
-
- mes "[Hein]";
- mes "Why did I speak of money?";
- mes "I am a dead man and dead people";
- mes "do not need money...arf!";
- mes "My head is hurting...I guess that";
- mes "a dead man can have a headache!";
- close;
-
-LV4_0_ASK:
- switch( select( "Show interest.", "Igonore him." ) ) {
- case 1:
- mes "[Hein]";
- mes "Why did I speak of money?";
- mes "I am a dead man and dead people";
- mes "do not need money...arf!";
- mes "My head is hurting...I guess that";
- mes "a dead man can have a headache!";
- set lv4_weapon, 40;
- close;
- break;
- case 2:
- mes "- Because you decided to ignore him, -";
- mes "- you are no longer able to hear him. -";
- close;
- break;
- }
- end;
-
-
-LV4_39:
-LV4_49:
- mes "[Hein]";
- mes "I feel something different from you.";
- mes "Did you come here with a purpose?";
- mes "I am envious of you...";
- close;
-
-
-LV4_41:
- mes "[Hein]";
- mes "Ah...are you going to ask me something?";
- mes "However, I am not accepting money";
- mes "from my client. Because.";
- mes "It brings me bad luck to...";
- next;
- set @dap3$, "to forge a good weapon.";
- input @answer3$;
- if(@answer3$ == @dap3$) goto LV4_41_CORRECT;
- mes "[Hein]";
- mes "...? What are you talking about?";
- mes "What was I going to say?";
- mes "Arf....my head is hurting...!";
- close;
-
-LV4_41_CORRECT:
- mes "[Hein]";
- mes "That's right! It's bad luck!";
- mes "Creating weapons is betting! And I am...I am?";
- mes "Oh right...I forgot that. Yes, I am dead.";
- mes "Ahahahahaha.";
- set lv4_weapon, 42;
- next;
- mes "[Hein]";
- mes "Well, I must be a lucky dead man";
- mes "for remembering my past!";
- mes "Hahahahaha!";
- next;
- mes "[Hein]";
- mes "Perhaps God wants me to";
- mes "continue my research...?";
- mes "wait, let me ask you a favor.";
- next;
- mes "[Hein]";
- mes "Can you bring me some materials";
- mes "that I need for my research?";
- mes "If I succeed in the research,";
- mes "I will give you the result in return.";
- next;
- mes "[Hein]";
- mes "You can take your time to think of my offer.";
- mes "Please talk to me later.";
- close;
-
-
-LV4_43:
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_43_BASE_MAT;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_43_BASE_MAT;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_43_BASE_MAT;
- if(countitem($@LV4_Gold) < 20) goto LV4_43_BASE_MAT;
-
- mes "[Hein]";
- mes "Oh, you have brought the materials I asked.";
- mes "Here's the thing. I cannot remember what I need other than those...";
- mes "Aww....I need some more time to think of them...";
- next;
- mes "[Hein]";
- mes "Please try to search what I need...if you can.";
- mes "Of course, it will not be an easy job for you";
- mes "to do so...but I know you have a body to move with your will...";
- mes "It is still better than being a ghost like me...";
- next;
- mes "[Hein]";
- mes "Please give me all the materials you have brought.";
- mes "I will keep them for you.";
-
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
- if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
- delitem $@LV4_Hammer_Of_Blacksmith, 2;
- delitem $@LV4_Emperium_Anvil, 1;
- delitem $@LV4_Illusion_Flower, 1;
- delitem $@LV4_Gold, 20;
- set lv4_weapon, 44;
- close;
-
-LV4_42:
-LV4_43_BASE_MAT:
- switch( lv4_weapon ) {
- case 42:
- mes "[Hein]";
- mes "I will take you speaking to me again";
- mes "as the approval of my request.";
- mes "Thank you so much.";
- next;
- mes "[Hein]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- mes "Most likely they are the ones I need.";
- next;
- mes "[Hein]";
- mes "And I do need 3 more things...";
- mes "but I have a hard time remembering what they are.";
- mes "That means that my memory of the past is not";
- mes "absolutely back.";
- next;
- mes "[Hein]";
- mes "*sigh*...I am so sorry to ask of you this...";
- mes "but please search for what those 3 things are.";
- mes "In the meantime, I will try to remember them.";
- mes "Thank you.";
- set lv4_weapon, 43;
- break;
- case 43:
- mes "[Hein]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- mes "Most likely they are the ones I need.";
- break;
- }
- close;
-
-
-LV4_45:
-LV4_46:
- if(countitem(LV4_Gem1) < 30) goto LV4_45_NOGEM;
- if(countitem(LV4_Gem2) < 30) goto LV4_45_NOGEM;
- if(countitem(LV4_Gem3) < 30) goto LV4_45_NOGEM;
- mes "[Hein]";
- mes "...Um? The items that you brought to me seem";
- mes "to be good materials for my creation...";
- mes "Give them to me, I shall try first!";
- next;
- mes "[Hein]";
- mes "Oh...I was right! How did you";
- mes "know these are materials I need?";
- mes "Great, give me a moment!";
- next;
- mes "[Hein]";
- mes "...Wait, I must test your luck first.";
- mes "Since I am not sure about the result,";
- mes "we should trust to luck for the result of my creation.";
- mes "You must have good luck...";
- next;
- mes "[Hein]";
- mes "We are going to play 'Rock, Paper, Scissors'.";
- mes "You must win at least 2 out of 3 times.";
- mes "If you fail, you must leave a large amount";
- mes "of one material you have brought.";
- mes "It is for driving away your bad luck.";
- next;
- mes "[Hein]";
- mes "I will give you a piece of paper.";
- mes "You will write down one among 'Rock, Paper, or Scissors'.";
- mes "I will do the same at the same time.";
- mes "We will then compare each other's paper at the end.";
- next;
-
- set @shobu, 0;
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@i == 2) mes "[Hein]";
- if(@i == 2) mes "Let's play the second one!";
- if(@i == 3) mes "[Hein]";
- if(@i == 3) mes "This will be the last one!";
- if(@i == 3) mes "Let's compare after this.";
- set @npchand[@i], rand(1, 3);
- switch( select( "Scissors", "Rock", "Paper" ) ) {
- case 1:
- set @myhand[@i], 1;
- if(@npchand[@i] == 3) set @shobu, @shobu + 1;
- break;
- case 2:
- set @myhand[@i], 2;
- if(@npchand[@i] == 1) set @shobu, @shobu + 1;
- break;
- case 3:
- set @myhand[@i], 3;
- if(@npchand[@i] == 2) set @shobu, @shobu + 1;
- break;
- }
- }
-
- if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
-
- if(@shobu > 1) goto LV4_45_WIN;
-
- switch ( rand(1 ,3) ) {
- case 1:
- delitem LV4_Gem1, 30;
- break;
- case 2:
- delitem LV4_Gem2, 30;
- break;
- case 3:
- delitem LV4_Gem3, 30;
- break;
- }
- goto LV4_45_RESULT;
-
-LV4_45_WIN:
- delitem LV4_Gem1, 30;
- delitem LV4_Gem2, 30;
- delitem LV4_Gem3, 30;
- set lv4_weapon, lv4_weapon + 2;
- goto LV4_45_RESULT;
-
-LV4_45_RESULT:
- mes "[Hein]";
- mes "Okay...I played in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@npchand[@i] == 1) mes "Scissors";
- if(@npchand[@i] == 2) mes "Rock";
- if(@npchand[@i] == 3) mes "Paper";
- }
-
- next;
- mes "[Hein]";
- mes "You did in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@myhand[@i] == 1) mes "Scissors";
- if(@myhand[@i] == 2) mes "Rock";
- if(@myhand[@i] == 3) mes "Paper";
- }
-
- next;
-
- if(@shobu > 1) goto LV4_45_SAY_WIN;
-
- mes "[Hein]";
- mes "Well well well...you lost the game.";
- mes "Ah~ you were close though...";
- mes "We must drive away bad luck.";
- next;
- mes "[Hein]";
- mes "Okay, I will wait here,";
- mes "go bring me the materials again...";
- close;
-
-LV4_45_SAY_WIN:
- mes "[Hein]";
- mes "Let's see...";
- mes "You won total " + @shobu + " times.";
- mes "Ah~ you must be really good at game!";
- mes "Yes, your luck is at its highest!";
- next;
- mes "[Hein]";
- mes "I am going to keep my promise.";
- mes "But I need some time to prepare.";
- mes "Give me the materials now and I will talk to you later.";
- close;
-
-LV4_44:
-LV4_45_NOGEM:
- mes "[Hein]";
- mes "I am sorry but please give me more time to remember the materials...";
- mes "I had really good memory when I was alive...";
- mes "So I could even recite them right after I woke up...";
- close;
-
-
-LV4_47:
-LV4_48:
- mes "[Hein]";
- mes "Oh, yes. I just finished the work.";
- mes "Do you want to know the result? Okay...";
- mes "Breathe deeply...before we check.";
- mes "The result is...";
- next;
- mes "[Hein]";
- mes "a Big Success! This is great!";
- mes "I have not labored in vain!";
- mes "Let's see the weapon...it is...";
-
- switch( rand(1, 2) ) {
- case 1:
- if(lv4_weapon == 47) mes "Edge.";
- if(lv4_weapon == 47) getitem 1132 ,1; // 1132,Edge
- if(lv4_weapon == 48) mes "Dragon Slayer.";
- if(lv4_weapon == 48) getitem 1166, 1; // 1166,Dragon_Slayer
- break;
- case 2:
- if(lv4_weapon == 47) mes "Excalibur.";
- if(lv4_weapon == 47) getitem 1137, 1; // 1137,Excalibur
- if(lv4_weapon == 48) mes "Schweizersabel.";
- if(lv4_weapon == 48) getitem 1167, 1; // 1167,Schweizersabel
- }
-
- set lv4_weapon, 0;
- next;
- mes "[Hein]";
- mes "Well...this is it.";
- mes "I feel my memory is fading again...";
- mes "Hahaha...being dead is not good.";
- next;
- mes "[Hein]";
- mes "Thank you for your help. And if you have";
- mes "a chance to visit Nifflheim again,";
- mes "please come back and retrieve my memory once more...";
- next;
- mes "[Hein]";
- mes "Aaahhhh! I don't think I will";
- mes "remember you next time...";
- mes "Take care, adventurer...father, I made it...";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Hein]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
-
-//--------------------------------------------------
-// Waltboughst, creates Byeollungum, Exorciser(excercise), Combat Knife and Grand Cross
-//--------------------------------------------------
-
-niflheim.gat,331,72,3 script Waltboughst 795,{
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 3000) goto LV4_NOT_OW;
- mes "- Wait a minute! -";
- mes "- You are currently overweight. -";
- mes "- Please lose some weight -";
- mes "- and try again. -";
- close;
-
-
-LV4_NOT_OW:
- if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
- mes "[Waltboughst]";
- mes "...Hah!";
- close;
-
-
-LV4_LEVEL_PASS:
- if(lv4_weapon == 0) goto LV4_0;
- if(lv4_weapon < 49) goto LV4_48;
- if(lv4_weapon == 49) goto LV4_49;
- if(lv4_weapon == 50) goto LV4_50;
- if(lv4_weapon == 51) goto LV4_51;
- if(lv4_weapon == 52) goto LV4_52;
- if(lv4_weapon == 53) goto LV4_53;
- if(lv4_weapon == 54) goto LV4_54;
- if(lv4_weapon == 55) goto LV4_55;
- if(lv4_weapon == 56) goto LV4_56;
- if(lv4_weapon == 57) goto LV4_57;
- if(lv4_weapon > 57) goto LV4_58;
- end; // shouldn't be here
-
-
-LV4_0:
-LV4_49:
- mes "[Waltboughst]";
- mes "Ah~ it is so frustrating to be a dead man.";
- mes "Because I cannot do anything without a body.";
- mes "You know what my father used to say?";
- mes "Trying best does not always";
- mes "result in a success.";
- mes "However...errr?";
- next;
-
- if(lv4_weapon == 0) goto LV4_0_ASK;
-
- mes "[Waltboughst]";
- mes "...What was my father's";
- mes "quote? Why am I stuck in";
- mes "here after death? Hey, you";
- mes "Do you know anything about";
- mes "Waltboughst when he was";
- mes "alive?";
- close;
-
-LV4_0_ASK:
- switch( select( "Show interest.", "Igonore him." ) ) {
- case 1:
- mes "[Waltboughst]";
- mes "...what did he say afterwards?";
- mes "Speaking of which, why am I";
- mes "so anxious to do something?";
- mes "I am a dead man, and a dead man is not supposed to do anything!";
- mes "Hey, do you know anything about me when I was alive?";
- set lv4_weapon, 49;
- close;
- break;
- case 2:
- mes "- Because you decided to ignore him, -";
- mes "- you are no longer able to hear him. -";
- close;
- break;
- }
- end;
-
-
-LV4_48:
-LV4_58:
- mes "[Waltboughst]";
- mes "I feel something different about you.";
- mes "Did you come here with a purpose?";
- mes "I am envious of you...";
- close;
-
-
-LV4_50:
- mes "[Waltboughst]";
- mes "Ah~ it is so frustrating to be a dead man.";
- mes "Because I cannot do anything without a body.";
- mes "You know what my father used to say?";
- mes "Trying best does not always";
- mes "result in a success.";
- mes "However...";
- next;
- set @dap4$, "All the successful men in the history tried their best!";
- input @answer4$;
- if(@answer4$ == @dap4$) goto LV4_50_CORRECT;
- mes "[Waltboughst]";
- mes "...What? What did you just say?";
- mes "Hmmm.";
- close;
-
-LV4_50_CORRECT:
- mes "[Waltboughst]";
- mes "Yes! That was it!";
- mes "Since I am dead, I cannot even try!";
- mes "Eh...?! Ah!";
- mes "I see, I see now.";
- mes "I must have been killed by some kind of accident!";
- set lv4_weapon, 51;
- next;
- mes "[Waltboughst]";
- mes "Okay, I am not going to end this way.";
- mes "Hey, you were meant to meet me!";
- mes "You got to do me a favor, now!";
- next;
- mes "[Waltboughst]";
- mes "I will give you the result of my research";
- mes "in return! All I want is to compete my research,";
- mes "not the result.";
- next;
- mes "[Waltboughst]";
- mes "Well, give me some time to remember";
- mes "what I need for my research.";
- mes "I will talk to you later.";
- close;
-
-
-LV4_52:
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_52_BASE_MAT;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_52_BASE_MAT;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_52_BASE_MAT;
- if(countitem($@LV4_Gold) < 20) goto LV4_52_BASE_MAT;
-
- mes "[Waltboughst]";
- mes "Oh...you brought everything I need!";
- mes "You were quick this time...I am still having";
- mes "a hard time remembering what I need other than those.";
- mes "This is not good, this is not good at all.";
- next;
- mes "[Waltboughst]";
- mes "Anyways, I will keep those materials for you.";
- mes "And give me some more times to";
- mes "remember what I need...arph!";
-
- if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
- if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
- if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
- if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
- delitem $@LV4_Hammer_Of_Blacksmith, 2;
- delitem $@LV4_Emperium_Anvil, 1;
- delitem $@LV4_Illusion_Flower, 1;
- delitem $@LV4_Gold, 20;
- set lv4_weapon, 53;
- close;
-
-LV4_51:
-LV4_52_BASE_MAT:
- switch( lv4_weapon ) {
- case 51:
- mes "[Waltboughst]";
- mes "Umm, you came back so early.";
- mes "I just remembered the materials.";
- next;
- mes "[Waltboughst]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- next;
- mes "[Waltboughst]";
- mes "I do need some other items...but I need some time";
- mes "to remember those. Oh well,";
- mes "we have enough time, so let me think of them.";
- set lv4_weapon, 52;
- break;
- case 52:
- mes "[Waltboughst]";
- mes "I need 2 Hammer of Blacksmith,";
- mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
- mes "Most likey they will be the ones I need...";
- break;
- }
- close;
-
-
-LV4_54:
-LV4_55:
- if(countitem(LV4_Gem1) < 30) goto LV4_54_NOGEM;
- if(countitem(LV4_Gem2) < 30) goto LV4_54_NOGEM;
- if(countitem(LV4_Gem3) < 30) goto LV4_54_NOGEM;
- mes "[Waltboughst]";
- mes "...Um? The items that you brought to me seem";
- mes "to be good materials for my creation...";
- mes "Give them to me, I shall try first!";
- next;
- mes "[Waltboughst]";
- mes "Oh...I was right! How did you";
- mes "know these are materials I need?";
- mes "Great, give me a moment!";
- next;
- mes "[Waltboughst]";
- mes "...wait, I must test your luck first.";
- mes "Since I am not sure about the result,";
- mes "we should trust to luck for the result of my creation.";
- mes "You must have good luck...";
- next;
- mes "[Waltboughst]";
- mes "We are going to play 'Rock, Paper, Scissors'.";
- mes "You must win at least 2 out of 3 times.";
- mes "If you fail, you must leave a large amount";
- mes "of one material you have brought.";
- mes "It is for driving away your bad luck.";
- next;
- mes "[Waltboughst]";
- mes "I will give you a piece of paper.";
- mes "You will write down one among 'Rock, Paper, or Scissors'.";
- mes "I will do the same at the same time.";
- mes "We will then compare each other's paper at the end.";
- next;
-
- set @shobu, 0;
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@i == 2) mes "[Waltboughst]";
- if(@i == 2) mes "Let's play the second one!";
- if(@i == 3) mes "[Waltboughst]";
- if(@i == 3) mes "This will be the last one!";
- if(@i == 3) mes "Let's compare after this.";
- set @npchand[@i], rand(1, 3);
- switch( select( "Scissors", "Rock", "Paper" ) ) {
- case 1:
- set @myhand[@i], 1;
- if(@npchand[@i] == 3) set @shobu, @shobu + 1;
- break;
- case 2:
- set @myhand[@i], 2;
- if(@npchand[@i] == 1) set @shobu, @shobu + 1;
- break;
- case 3:
- set @myhand[@i], 3;
- if(@npchand[@i] == 2) set @shobu, @shobu + 1;
- break;
- }
- }
-
- if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
- if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
-
- if(@shobu > 1) goto LV4_54_WIN;
-
- switch ( rand(1 ,3) ) {
- case 1:
- delitem LV4_Gem1, 30;
- break;
- case 2:
- delitem LV4_Gem2, 30;
- break;
- case 3:
- delitem LV4_Gem3, 30;
- break;
- }
- goto LV4_54_RESULT;
-
-LV4_54_WIN:
- delitem LV4_Gem1, 30;
- delitem LV4_Gem2, 30;
- delitem LV4_Gem3, 30;
- set lv4_weapon, lv4_weapon + 2;
- goto LV4_54_RESULT;
-
-LV4_54_RESULT:
- mes "[Waltboughst]";
- mes "Okay...I played in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@npchand[@i] == 1) mes "Scissors";
- if(@npchand[@i] == 2) mes "Rock";
- if(@npchand[@i] == 3) mes "Paper";
- }
-
- next;
- mes "[Waltboughst]";
- mes "You did in the order of...";
-
- for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
- if(@myhand[@i] == 1) mes "Scissors";
- if(@myhand[@i] == 2) mes "Rock";
- if(@myhand[@i] == 3) mes "Paper";
- }
-
- next;
-
- if(@shobu > 1) goto LV4_54_SAY_WIN;
-
- mes "[Waltboughst]";
- mes "Well well well...you lost the game.";
- mes "Ah~ you were close though...";
- mes "We must drive away bad luck.";
- next;
- mes "[Waltboughst]";
- mes "Okay, I will wait here,";
- mes "go bring me the materials again...";
- close;
-
-LV4_54_SAY_WIN:
- mes "[Waltboughst]";
- mes "Let's see...";
- mes "You won total " + @shobu + " times.";
- mes "Ah~ you must be really good at game!";
- mes "Yes, your luck is at its highest!";
- next;
- mes "[Waltboughst]";
- mes "I am going to keep my promise.";
- mes "But I need some time to prepare.";
- mes "Give me the materials now and I will talk to you later.";
- close;
-
-LV4_53:
-LV4_54_NOGEM:
- mes "[Waltboughst]";
- mes "Arph...I haven't remembered them yet.";
- mes "Awww....this is a problem.";
- mes "I must think of them as soon as possible...";
- close;
-
-
-LV4_56:
-LV4_57:
- mes "[Waltboughst]";
- mes "Hehe, I made something with the materials";
- mes "in this short time! Wanna see?";
- mes "Aren't you wondering about the result?";
- mes "Hmmm....let's see...";
- next;
- mes "[Waltboughst]";
- mes "Waltboughst never fails!";
- mes "Besides you had good luck,";
- mes "so it resulted in a perfect success!";
- mes "You got a nice weapon here, it is...";
-
- switch( rand(1, 2) ) {
- case 1:
- if(lv4_weapon == 56) mes "Byeollungum!";
- if(lv4_weapon == 56) getitem 1140 ,1; // 1140,Byeollungum
- if(lv4_weapon == 57) mes "Exorciser!";
- if(lv4_weapon == 57) getitem 1233, 1; // 1233,Exercise
- break;
- case 2:
- if(lv4_weapon == 56) mes "Combat Knife!";
- if(lv4_weapon == 56) getitem 1228, 1; // 1228,Combat_Knife
- if(lv4_weapon == 57) mes "Grand Cross!!";
- if(lv4_weapon == 57) getitem 1528, 1; // 1528,Grand_Cross
- }
-
- set lv4_weapon, 0;
- next;
- mes "[Waltboughst]";
- mes "I am genius! Hahahaha!";
- mes "I made it when my brothers could not!";
- mes "Muhahahahahaha!";
- mes "Eh...err? Arrr...phhh?";
- next;
- mes "[Waltboughst]";
- mes "Damn...I must try too hard.";
- mes "My memory is fading again...";
- mes "Oh well, somehow I proved";
- mes "that I am a genius even after I died.";
- next;
- mes "[Waltboughst]";
- mes "If you want me to display my genius again,";
- mes "come retrieve my memory again.";
- mes "And thank you!";
- next;
- mes "[Waltboughst]";
- mes "Ah...my memory's dying again...";
- mes "Farewell~ I don't think I will remember you";
- mes "but I hope you will remember me as Waltboughst";
- mes "the genius in the age!";
- close;
-
-
-
-//--------------------------------------------------
-//Hack Attempt
-//--------------------------------------------------
-LV4_HACK:
- mes "[Waltboughst]";
- mes "Hmm. There seems to be a bit of problem.";
- set lv4_weapon, 0;
- logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
- close;
-}
+//===== eAthena Script =======================================
+//= Grade A and Grade S weapon quests
+//===== By: ==================================================
+//= Vicious_Pucca, Reddozen & MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.21
+//===== Compatible With: =====================================
+//= eAthena SVN 3422+(Requires jA Script System)
+//===== Description: =========================================
+//= Grade A and Grade S weapon quests
+//===== Additional Comments: =================================
+//= 1.0 First Version, Credits goes to Vicious_Pucca for converting [MasterOfMuppets]
+//= the quest from aegis format to eA format. Also thanks to
+//= reddozen for fixing bugs.
+//= 1.1 Many fixes to spelling, grammar, and sentence order. [Silent]
+//= 1.2 A small fix, thanks to vicious_pucca [MasterOfMuppets]
+//= 1.21 Fixing MoM's typos (Citrin -> Citrine) [erKURITA]
+//============================================================
+
+//---------------------------------------------------------------
+// Initialize the basic materials for easier reading/conversion
+//---------------------------------------------------------------
+
+- script lv4_weapon_init -1,{
+OnInit:
+ set $@LV4_Citrine, 7295; // 7295,Citrine
+ set $@LV4_Turquoise, 7294; // 7294,Turquoise
+ set $@LV4_Agate, 7291; // 7291,Agate
+
+ set $@LV4_Muscovite, 7292; // 7292,Muscovite
+ set $@LV4_Biotite, 7297; // 7297,Biotite
+ set $@LV4_Pyroxene, 7296; // 7296,Pyroxene
+
+ set $@LV4_Phlogopite, 7290; // 7290,Phlogopite
+ set $@LV4_Olivine, 7289; // 7289,Peridot
+ set $@LV4_Rose_Quartz, 7293; // 7293,Rose_Quartz
+
+ set $@LV4_Gold, 969; // 969,Gold
+ set $@LV4_Steel, 999; // 999,Steel
+ set $@LV4_Emperium, 714; // 714,Emperium
+ set $@LV4_Hammer_Of_Blacksmith, 1005; // 1005,Hammer_of_Blacksmith
+ set $@LV4_Emperium_Anvil, 989; // 989,Emperium_Anvil
+ set $@LV4_Illusion_Flower, 710; // 710,Illusion_Flower
+ end;
+}
+
+//---------------------------------------------------------------
+// Bazo, creates Immaterial Sword, Quadrille and Slash
+//---------------------------------------------------------------
+
+umbala.gat,117,285,3 script Bazo 85,{
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- Currently you are overweight. -";
+ mes "- Please lighten your weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon == 1) goto LV4_1;
+ if(lv4_weapon == 2) goto LV4_2;
+ if(lv4_weapon == 3) goto LV4_2;
+ if(lv4_weapon == 4) goto LV4_2;
+ if(lv4_weapon == 5) goto LV4_5;
+ if(lv4_weapon == 6) goto LV4_5;
+ if(lv4_weapon == 7) goto LV4_5;
+ if(lv4_weapon > 7) goto LV4_7;
+ end; // shouldn't be here
+
+
+LV4_0:
+ mes "[Bazo]";
+ mes "Hello, you are from outside, huh?";
+ mes "I can tell by your appearance.";
+ mes "Pleased to meet you. My name is Bazo Heburiech.";
+ mes "I am also from outside.";
+ next;
+ mes "[Bazo]";
+ mes "We must have been meant to meet each other.";
+ mes "If you don't mind, let me explain about this place for a while.";
+ mes "Umbala is adjacent to Nifflheim, the city of the dead.";
+ mes "Even at a first sight, I knew that";
+ mes "there is something about this village.";
+ next;
+ mes "[Bazo]";
+ mes "Due to that geographical trait,";
+ mes "this village was filled with evil power";
+ mes "that was influenced by the city of the dead.";
+ next;
+ mes "[Bazo]";
+ mes "The local people have learned";
+ mes "to manipulate the evil power for";
+ mes "producing specialties.";
+ next;
+ mes "[Bazo]";
+ mes "While staying here, I also have learned";
+ mes "some recipes. If you bring me materials,";
+ mes "I am willing to show you my skills.";
+ mes "How does that sound?";
+ next;
+
+ switch( select( "Sounds good.", "No, thanks." ) ) {
+ case 1:
+ if(BaseLevel >= 70) goto L4_0_1;
+
+ mes "[Bazo]";
+ mes "Err...I don't think that you are powerful";
+ mes "enough to handle my products.";
+ mes "They are charged with evil power.";
+ next;
+ mes "That means if their owners are not powerful";
+ mes "and not experienced enough,";
+ mes "they will drive the owners insane.";
+ mes "And I cannot do that to my friend.";
+ next;
+ mes "[Bazo]";
+ mes "Therefore, I want you to go back and level up first.";
+ mes "I will gladly expect you to come back when you are ready.";
+ break;
+L4_0_1:
+ mes "[Bazo]";
+ mes "Excellent! Let me tell you";
+ mes "the materials I need. I hope you will write them down.";
+ mes "There is not that many though.";
+ next;
+ mes "[Bazo]";
+ mes "I need 10 Gold, 50 Steel and 10 Emperium";
+ mes "as basic materials...";
+ mes "and you can enchant the product with a certain trait.";
+ mes "For that, I need some rare ores...";
+ next;
+ mes "[Bazo]";
+ mes "Please bring me 30 of either Citrine, Turquoise or Agate.";
+ mes "Each one of them possess their own attribute";
+ mes "and following by the ore you have brought,";
+ mes "my product will possess a special trait.";
+ next;
+ mes "[Bazo]";
+ mes "I wish you good luck...";
+ mes "I will wait for you!";
+
+ set lv4_weapon, 1;
+ break;
+ case 2:
+ mes "[Bazo]";
+ mes "Oh, okay. That is fine with me.";
+ mes "By the way, don't you want to know how evil the city of the dead will be?";
+ mes "I do since that city influences so much of this village";
+ mes "with it's mysterious power, you know.";
+ break;
+ }
+ close;
+
+
+
+//--------------------------------------------------
+//Gold, Steel, Emp Check + Choosing the gem
+//--------------------------------------------------
+LV4_1:
+ if(countitem($@LV4_Gold) < 10) goto LV4_1_FAIL;
+ if(countitem($@LV4_Steel) < 50) goto LV4_1_FAIL;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_1_FAIL;
+
+ mes "[Bazo]";
+ mes "Oh...you have brought all the basic materials.";
+ mes "Now let me check what kind of rare ores";
+ mes "you have brought...";
+ next;
+
+ if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Turquoise) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_CTA;
+ if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Turquoise) >= 30) goto LV4_1_CT;
+ if (countitem($@LV4_Citrine) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_CA;
+ if (countitem($@LV4_Turquoise) >= 30 && countitem($@LV4_Agate) >= 30) goto LV4_1_TA;
+ if (countitem($@LV4_Citrine) >= 30) goto LV4_1_C;
+ if (countitem($@LV4_Turquoise) >= 30) goto LV4_1_T;
+ if (countitem($@LV4_Agate) >= 30) goto LV4_1_A;
+ goto LV4_1_NOGEM;
+ end;
+
+
+LV4_1_CTA:
+ mes "[Bazo]";
+ mes "Hahaha, I asked you to bring one kind not all of them.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Citrine", "Turquoise", "Agate" ) ) {
+ case 1:
+ mes "[Bazo]";
+ mes "Citrine...okay. Before we start,";
+ set @gem, $@LV4_Citrine;
+ set @gemstring$,"Citrine";
+ break;
+ case 2:
+ mes "[Bazo]";
+ mes "Turquoise...okay. Before we start,";
+ set @gem, $@LV4_Turquoise;
+ set @gemstring$,"Turquoise";
+ break;
+ case 3:
+ mes "[Bazo]";
+ mes "Agate....okay. Before we start,";
+ set @gem, $@LV4_Agate;
+ set @gemstring$,"Agate";
+ break;
+ }
+
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_CT:
+ mes "[Bazo]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Citrine", "Turquoise" ) ) {
+ case 1:
+ mes "[Bazo]";
+ mes "Citrine...okay. Before we start,";
+ set @gem, $@LV4_Citrine;
+ set @gemstring$,"Citrine";
+ break;
+ case 2:
+ mes "[Bazo]";
+ mes "Turquoise...okay. Before we start,";
+ set @gem, $@LV4_Turquoise;
+ set @gemstring$,"Turquoise";
+ break;
+ }
+
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_CA:
+ mes "[Bazo]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Citrine", "Agate" ) ) {
+ case 1:
+ mes "[Bazo]";
+ mes "Citrine...okay. Before we start,";
+ set @gem, $@LV4_Citrine;
+ set @gemstring$,"Citrine";
+ break;
+ case 2:
+ mes "[Bazo]";
+ mes "Agate....okay. Before we start,";
+ set @gem, $@LV4_Agate;
+ set @gemstring$,"Agate";
+ break;
+ }
+
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_TA:
+ mes "[Bazo]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Turquoise", "Agate" ) ) {
+ case 1:
+ mes "[Bazo]";
+ mes "Turquoise...okay. Before we start,";
+ set @gem, $@LV4_Turquoise;
+ set @gemstring$,"Turquoise";
+ break;
+ case 2:
+ mes "[Bazo]";
+ mes "Agate....okay. Before we start,";
+ set @gem, $@LV4_Agate;
+ set @gemstring$,"Agate";
+ break;
+ }
+
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_C:
+ mes "[Bazo]";
+ mes "Citrine...okay. Before we start,";
+ set @gem, $@LV4_Citrine;
+ set @gemstring$,"Citrine";
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_T:
+ mes "[Bazo]";
+ mes "Turquoise...okay. Before we start,";
+ set @gem, $@LV4_Turquoise;
+ set @gemstring$,"Turquoise";
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_A:
+ mes "[Bazo]";
+ mes "Agate....okay. Before we start,";
+ set @gem, $@LV4_Agate;
+ set @gemstring$,"Agate";
+ goto LV4_1_PICK;
+ end; // shouldn't be here
+
+
+LV4_1_PICK:
+ mes "we must do one thing first.";
+ mes "That is, testing your luck.";
+ mes "As you already know,";
+ mes "I cannot guarantee you that we will succeed";
+ mes "to make one right away.";
+ next;
+ mes "[Bazo]";
+ mes "If we can raise your luck before we start,";
+ mes "we will be able to succeed.";
+ next;
+ mes "[Bazo]";
+ mes "Now you must be wondering what we";
+ mes "will do in order to increase your luck.";
+ mes "It is simple, we will play a mind-reading game.";
+ mes "I am going to think of one monster among 4 of my favorite ones,";
+ mes "you will guess what the monster is.";
+ next;
+ mes "[Bazo]";
+ mes "You must answer correctly at least";
+ mes "1 out of 5 times. It shouldn't be that difficult.";
+ mes "And if you fail to answer, we must do something else";
+ mes "to drive away your bad luck.";
+ next;
+ mes "[Bazo]";
+ mes "I will take 10 of the special ore you chose.";
+ mes "Well, I understand that it does not sound tempting";
+ mes "but let's think of it this way.";
+ mes "It is much better than wasting 30 ore";
+ mes "by failing to create the item, isn't it?";
+ next;
+ mes "[Bazo]";
+ mes "Okay, now I need some time to prepare...";
+ mes "Talk to you later!";
+
+ if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
+ if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
+ delitem $@LV4_Gold, 10;
+ delitem $@LV4_Steel, 50;
+ delitem $@LV4_Emperium, 10;
+ if(@gem == $@LV4_Citrine) set lv4_weapon, 2;
+ if(@gem == $@LV4_Turquoise) set lv4_weapon, 3;
+ if(@gem == $@LV4_Agate) set lv4_weapon, 4;
+ close;
+
+
+LV4_1_NOGEM:
+ mes "[Bazo]";
+ mes "I seem to recall that I asked you to bring";
+ mes "30 of a special ore, Citrine, Turquoise, or Agate...";
+ mes "And I don't see any of them.";
+ mes "You must have forgot them. Please go get them too.";
+ close;
+
+
+LV4_1_FAIL:
+ mes "[Bazo]";
+ mes "Please bring me 10 Gold, 50 Steel and 10 Emperium";
+ mes "as basic materials...";
+ mes "and you can enchant the product with a certain trait.";
+ mes "For that, I need some rare ores...";
+ next;
+ mes "[Bazo]";
+ mes "Please bring me 30 of either Citrine, Turquoise or Agate.";
+ mes "Each one of them possess their own attribute";
+ mes "and using the ore you have brought,";
+ mes "my product will possess a special trait.";
+ next;
+ mes "[Bazo]";
+ mes "I wish you good luck...";
+ mes "I will wait for you!";
+ close;
+
+
+
+//--------------------------------------------------
+//Guessing Game
+//--------------------------------------------------
+LV4_2:
+ if(lv4_weapon == 2) set @gem, $@LV4_Citrine;
+ if(lv4_weapon == 3) set @gem, $@LV4_Turquoise;
+ if(lv4_weapon == 4) set @gem, $@LV4_Agate;
+ if(countitem(@gem) < 30) goto LV4_2_NOGEM;
+
+ mes "[Bazo]";
+ mes "Ok, you seem to be ready.";
+ mes "Let's get started.";
+ mes "My favorite monsters are Poring,";
+ mes "Hode, Obeaune, and Minorous.";
+ next;
+
+ set @dap, 0;
+ set @correct[0],1;
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ mes "[Bazo]";
+
+ if(@i == 1) mes "Here's the 1st question. Guess what monster";
+ if(@i != 1) mes "Alright. Now guess what monster";
+
+ mes "I have in my mind at this moment.";
+ next;
+
+ set @mons, rand(1, 4);
+
+ switch( select( "Poring", "Hode", "Obeaune", "Minorous" ) ) {
+ case 1:
+ set @correct[@i], 1;
+ if(@mons == 1) set @dap, @dap + 1;
+ break;
+
+ case 2:
+ set @correct[@i], 2;
+ if(@mons == 2) set @dap, @dap + 1;
+ break;
+
+ case 3:
+ set @correct[@i], 3;
+ if(@mons == 3) set @dap, @dap + 1;
+ break;
+
+ case 4:
+ set @correct[@i], 4;
+ if(@mons == 4) set @dap, @dap + 1;
+ break;
+ }
+ }
+
+ mes "[Bazo]";
+ mes "Okay, let me give you answers for the questions.";
+ mes "I was thinking of the monsters in the order of";
+ next;
+ mes "[Bazo]";
+
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ if(@correct[@i] == 1) mes "Poring";
+ if(@correct[@i] == 2) mes "Hode";
+ if(@correct[@i] == 3) mes "Obeaune";
+ if(@correct[@i] == 4) mes "Minorous";
+ }
+
+ if(@dap < 1) goto LV4_2_FAIL;
+
+ next;
+ mes "[Bazo]";
+ mes "You answered " + @dap + " times!";
+ mes "I must say you're amazing!";
+ mes "As I promised, I will make an Umbala specialty for you.";
+ mes "Please give me some time to prepare.";
+ mes "Talk to you later.";
+
+ if(countitem(@gem) < 30) goto LV4_HACK;
+ delitem @gem, 30;
+ set lv4_weapon, lv4_weapon + 3;
+ close;
+
+
+LV4_2_FAIL:
+ if(countitem(@gem) < 10) goto LV4_HACK;
+ delitem @gem, 10;
+
+ next;
+ mes "[Bazo]";
+ mes "Errr... I don't think you are good at reading";
+ mes "other people's minds. Or you had bad luck, I guess.";
+ mes "We cannot do that again unless";
+ mes "we drive away the bad luck.";
+ mes "Give me 10 " + @gemstring$ + ", that will do the job.";
+ next;
+ mes "[Bazo]";
+ mes "Well...if you want to do this mind-reading game again,";
+ mes "please come back with the materials.";
+ mes "I will wait here for you.";
+ close;
+
+
+LV4_2_NOGEM:
+ mes "[Bazo]";
+ mes "Errr...something doesn't feel right. We lack something...";
+ mes "Will you check the materials that you have brought?";
+ close;
+
+
+
+//--------------------------------------------------
+//Weapon Creation
+//--------------------------------------------------
+LV4_5:
+ mes "[Bazo]";
+ mes "Great... now, let's do it!";
+ mes "Wish me luck...ah, I forgot to tell you this.";
+ mes "I cannot tell you what kind of product it will be. It is so random.";
+ mes "Let's wish that a good thing will come out, okay?";
+ next;
+ mes "- You feel unknown power start gathering in -";
+ mes "- the materials. It seems the materials are -";
+ mes "- absorbing all the evil power in the air. -";
+ next;
+ mes "- Then, the materials start merging into one -";
+ mes "- even though Bazo didn't touch them at all. -";
+ next;
+ mes "[Bazo]";
+ mes "Can you feel that? The materials are gathering";
+ mes "power at their own will.";
+ mes "They are out of my hand now. Let's wait and hope.";
+ next;
+ mes "- After a while, the air becomes calm -";
+ mes "- and you check the result. -";
+ next;
+ mes "[Bazo]";
+ mes "Ooooooh! It is done!";
+ mes "We have succeeded! Ah, it's amazing!";
+ mes "Did I tell you that it is really rare to succeed right away?";
+ mes "Yes, God must have listened to our prayers.";
+ mes "Oh, it is a weapon! It will be very useful to you.";
+ mes "Let's take a closer look...";
+ next;
+
+ mes "[Bazo]";
+
+ switch( lv4_weapon ) {
+ case 5:
+ mes "Immaterial Sword!";
+ getitem 1141, 1; // 1141,Immaterial_Sword
+ break;
+ case 6:
+ mes "it is Slash!";
+ getitem 1526, 1; // 1526,Slash
+ break;
+ case 7:
+ mes "it is Quadrille!";
+ getitem 1527, 1; // 1527,Quadrille
+ break;
+ }
+
+ set lv4_weapon, 0;
+ mes "This sword was born to be yours!";
+ mes "Congratulations and hopefully it will have a good use for you.";
+ next;
+
+ mes "[Bazo]";
+ mes "I feel so gratified. If you wish to have";
+ mes "another one, please feel free to visit me anytime.";
+ mes "Have a good travel!";
+ close;
+
+
+
+//--------------------------------------------------
+//Other Quests
+//--------------------------------------------------
+LV4_7:
+ mes "[Bazo]";
+ mes "Hmm...I feel something strange from you.";
+ mes "I regret to say that there is nothing I can do for you.";
+ mes "I hope you have a safe travel.";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Bazo]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//---------------------------------------------------------------
+// Hibilaithan, creates Mailbreaker, Swordbreaker and Slaughter
+//---------------------------------------------------------------
+
+umbala.gat,163,257,3 script Hibilaithan 785,{
+ if(event_umbala < 3) goto LumWord;
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- Currently you are overweight. -";
+ mes "- Please lighten your weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon == 8) goto LV4_8;
+ if(lv4_weapon == 9) goto LV4_9;
+ if(lv4_weapon == 10) goto LV4_9;
+ if(lv4_weapon == 11) goto LV4_9;
+ if(lv4_weapon == 12) goto LV4_12;
+ if(lv4_weapon == 13) goto LV4_12;
+ if(lv4_weapon == 14) goto LV4_12;
+ if(lv4_weapon < 8) goto LV4_7;
+ if(lv4_weapon > 14) goto LV4_7;
+ end; // shouldn't be here
+
+
+LumWord:
+ mes "[Hibilaithan]";
+ mes "Umba! Umbaba...umum! Baumba!";
+ mes "Umumumbababaumumbabaumba!";
+ mes "Umbaumbaumbaumbaumhah!";
+ mes "Umumumumumbababababab!";
+ close;
+
+
+LV4_0:
+ mes "[Hibilaithan]";
+ mes "Haha, yeah, I knew this day would come.";
+ mes "Finally people recognize my value";
+ mes "as the best artisan in Umbala!";
+ next;
+ mes "[Hibilaithan]";
+ mes "Okay, let's talk straight.";
+ mes "I, Hibilaithan shall craft something nice";
+ mes "if you bring me materials!";
+ mes "Hahahahahaha!";
+ next;
+ mes "[Hibilaithan]";
+ mes "Eh? What? You didn't come to see me?";
+ mes "Stop joking around...Don't play me for a fool!";
+ mes "People are too shy to tell the truth nowadays!";
+ mes "Let's be honest and tell me if you want it or not.";
+ next;
+
+ switch( select( "...okay.", "...sorry, I don't need it!" ) ) {
+ case 1:
+ if(BaseLevel >= 70) goto L4_0_1;
+
+ mes "[Hibilaithan]";
+ mes "...what a shame! I regret to tell you this,";
+ mes "but your spirit is too weak";
+ mes "to handle the power of my stuff!";
+ mes "This is not good, not good at all!";
+ mes "Go and train yourself first.";
+ mes "When you become strong, you may come back!";
+ break;
+L4_0_1:
+ mes "[Hibilaithan]";
+ mes "Great! I like your attitute! Great, great!";
+ mes "I am going to tell you what I need.";
+ mes "It is not much, so do not forget.";
+ next;
+ mes "[Hibilaithan]";
+ mes "Bring me 10 Gold, 50 Steel and 10 Emperium";
+ mes "... as basic materials.";
+ mes "And I need some rare ores to endow power...";
+ next;
+ mes "[Hibilaithan]";
+ mes "Bring me 30 of one ore among Muscovite, Biotite or Pyroxene.";
+ mes "Remember you are going to bring 30 of one ore.";
+ mes "I cannot pick one among those because I am";
+ mes "not sure what will come out. Heh.";
+ next;
+ mes "[Hibilaithan]";
+ mes "Okay, wish you good luck!";
+ mes "Meanwhile I am going to chill here.";
+
+ set lv4_weapon, 8;
+ break;
+ case 2:
+ mes "[Hibilaithan]";
+ mes "Bah~ what are you afraid of?";
+ mes "I am just trying to do you a favor, you know?";
+ mes "Alright, it is your call.";
+ mes "But if you change your mind,";
+ mes "feel free to come back.";
+ break;
+ }
+ close;
+
+
+
+//--------------------------------------------------
+//Gold, Steel, Emp Check + Choosing the gem
+//--------------------------------------------------
+LV4_8:
+ if(countitem($@LV4_Gold) < 10) goto LV4_8_FAIL;
+ if(countitem($@LV4_Steel) < 50) goto LV4_8_FAIL;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_8_FAIL;
+
+ mes "[Hibilaithan]";
+ mes "Oh...you have brought all the basic materials.";
+ mes "Now let me check what kind of rare ores";
+ mes "you have brought...";
+ next;
+
+ if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Biotite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_MBP;
+ if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Biotite) >= 30) goto LV4_8_MB;
+ if (countitem($@LV4_Muscovite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_MP;
+ if (countitem($@LV4_Biotite) >= 30 && countitem($@LV4_Pyroxene) >= 30) goto LV4_8_BP;
+ if (countitem($@LV4_Muscovite) >= 30) goto LV4_8_M;
+ if (countitem($@LV4_Biotite) >= 30) goto LV4_8_B;
+ if (countitem($@LV4_Pyroxene) >= 30) goto LV4_8_P;
+ goto LV4_8_NOGEM;
+ end;
+
+
+LV4_8_MBP:
+ mes "[Hibilaithan]";
+ mes "Gosh, did you brought all three kinds?";
+ mes "Hahaha, it's fine.";
+ mes "But we cannot use all of them this time.";
+ mes "Pick one that you want to use.";
+ next;
+
+ switch( select( "Muscovite", "Biotite", "Pyroxene" ) ) {
+ case 1:
+ mes "[Hibilaithan]";
+ mes "Muscovite...okay. Before we start,";
+ set @gem, $@LV4_Muscovite;
+ set @gemstring$,"Muscovite";
+ break;
+ case 2:
+ mes "[Hibilaithan]";
+ mes "Biotite...okay. Before we start,";
+ set @gem, $@LV4_Biotite;
+ set @gemstring$,"Biotite";
+ break;
+ case 3:
+ mes "[Hibilaithan]";
+ mes "Pyroxene....okay. Before we start,";
+ set @gem, $@LV4_Pyroxene;
+ set @gemstring$,"Pyroxene";
+ break;
+ }
+
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_MB:
+ mes "[Hibilaithan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Muscovite", "Biotite" ) ) {
+ case 1:
+ mes "[Hibilaithan]";
+ mes "Muscovite...okay. Before we start,";
+ set @gem, $@LV4_Muscovite;
+ set @gemstring$,"Muscovite";
+ break;
+ case 2:
+ mes "[Hibilaithan]";
+ mes "Biotite...okay. Before we start,";
+ set @gem, $@LV4_Biotite;
+ set @gemstring$,"Biotite";
+ break;
+ }
+
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_MP:
+ mes "[Hibilaithan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Muscovite", "Pyroxene" ) ) {
+ case 1:
+ mes "[Hibilaithan]";
+ mes "Muscovite...okay. Before we start,";
+ set @gem, $@LV4_Muscovite;
+ set @gemstring$,"Muscovite";
+ break;
+ case 2:
+ mes "[Hibilaithan]";
+ mes "Pyroxene....okay. Before we start,";
+ set @gem, $@LV4_Pyroxene;
+ set @gemstring$,"Pyroxene";
+ break;
+ }
+
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_BP:
+ mes "[Hibilaithan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Biotite", "Pyroxene" ) ) {
+ case 1:
+ mes "[Hibilaithan]";
+ mes "Biotite...okay. Before we start,";
+ set @gem, $@LV4_Biotite;
+ set @gemstring$,"Biotite";
+ break;
+ case 2:
+ mes "[Hibilaithan]";
+ mes "Pyroxene....okay. Before we start,";
+ set @gem, $@LV4_Pyroxene;
+ set @gemstring$,"Pyroxene";
+ break;
+ }
+
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_M:
+ mes "[Hibilaithan]";
+ mes "Muscovite...okay. Before we start,";
+ set @gem, $@LV4_Muscovite;
+ set @gemstring$,"Muscovite";
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_B:
+ mes "[Hibilaithan]";
+ mes "Biotite...okay. Before we start,";
+ set @gem, $@LV4_Biotite;
+ set @gemstring$,"Biotite";
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_P:
+ mes "[Hibilaithan]";
+ mes "Pyroxene....okay. Before we start,";
+ set @gem, $@LV4_Pyroxene;
+ set @gemstring$,"Pyroxene";
+ goto LV4_8_PICK;
+ end; // shouldn't be here
+
+
+LV4_8_PICK:
+ mes "we must do one thing first.";
+ mes "That is, to test your luck.";
+ mes "As you already know,";
+ mes "I cannot guarantee you that we will succeed";
+ mes "to make one right away.";
+ next;
+ mes "[Hibilaithan]";
+ mes "If we can raise your luck before we start,";
+ mes "we will be able to succeed.";
+ next;
+ mes "[Hibilaithan]";
+ mes "Now you must be wondering what we";
+ mes "will do in order to increase your luck.";
+ mes "It is simple, we will play a mind-reading game.";
+ mes "I am going to think of one monster among 4 of my favorites,";
+ mes "you will guess what that monster is.";
+ next;
+ mes "[Hibilaithan]";
+ mes "You must answer correctly at least";
+ mes "1 out of 5 times. It should not be that difficult.";
+ mes "And if you fail to answer, we must do something else";
+ mes "to drive away your bad luck.";
+ next;
+ mes "[Hibilaithan]";
+ mes "I will take 10 of the special ore you have chose.";
+ mes "Well, I understand that it does not sound tempting";
+ mes "but let's think of it this way.";
+ mes "It is much better than wasting 30 ore";
+ mes "by failing to create the item, isn't it?";
+ next;
+ mes "[Hibilaithan]";
+ mes "Okay, now I need some time to prepare...";
+ mes "Talk to you later!";
+
+ if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
+ if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
+ delitem $@LV4_Gold, 10;
+ delitem $@LV4_Steel, 50;
+ delitem $@LV4_Emperium, 10;
+ if(@gem == $@LV4_Muscovite) set lv4_weapon, 9;
+ if(@gem == $@LV4_Biotite) set lv4_weapon, 10;
+ if(@gem == $@LV4_Pyroxene) set lv4_weapon, 11;
+ close;
+
+
+LV4_8_NOGEM:
+ mes "[Hibilaithan]";
+ mes "I seem to recall that I asked you to bring";
+ mes "30 of a special ore among Muscovite, Biotite or Pyroxene...";
+ mes "And I don't see any of them.";
+ mes "You must have forgot that. Please go get them too.";
+ close;
+
+
+LV4_8_FAIL:
+ mes "[Hibilaithan]";
+ mes "Please bring me 10 Gold, 50 Steel and 10 Emperium";
+ mes "as basic materials...";
+ mes "and you can enchant the product with a certain trait.";
+ mes "For that, I need some rare ores...";
+ next;
+ mes "[Hibilaithan]";
+ mes "Please bring me 30 of an ore among Citrine, Biotite or Pyroxene.";
+ mes "Each one of them possess their own attributes";
+ mes "and by using the ore you have brought,";
+ mes "my product will possess a special trait.";
+ next;
+ mes "[Hibilaithan]";
+ mes "I wish you good luck...";
+ mes "I will wait for you!";
+ close;
+
+
+
+//--------------------------------------------------
+//Guessing Game
+//--------------------------------------------------
+LV4_9:
+ if(lv4_weapon == 9) set @gem, $@LV4_Muscovite;
+ if(lv4_weapon == 10) set @gem, $@LV4_Biotite;
+ if(lv4_weapon == 11) set @gem, $@LV4_Pyroxene;
+ if(countitem(@gem) < 30) goto LV4_9_NOGEM;
+
+ mes "[Hibilaithan]";
+ mes "Okay, let's get started!";
+ mes "It is simple. There are";
+ mes "4 monsters that I like. I am going to think";
+ mes "of a monster among the 4, you will guess what it is.";
+ mes "We will play this game 5 times and you must";
+ mes "answer correctly at least 1 out of 5 times. Doesn't that sound easy?";
+ next;
+ mes "[Hibilaithan]";
+ mes "This is a very good game for";
+ mes "increasing your luck!";
+ mes "Okay, you better be ready now.";
+ next;
+
+ set @dap, 0;
+ set @correct[0],1;
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ mes "[Hibilaithan]";
+
+ if(@i == 1) mes "I like Zealotus, Alice,";
+ if(@i == 1) mes "Munak, and Isis among all monsters.";
+
+ mes "Now, guess which one";
+ mes "I am thinking of at this moment.";
+ next;
+
+ set @mons, rand(1, 4);
+
+ switch( select( "Zhertilsh", "Alice", "Munak", "Isis" ) ) {
+ case 1:
+ set @correct[@i], 1;
+ if(@mons == 1) set @dap, @dap + 1;
+ break;
+
+ case 2:
+ set @correct[@i], 2;
+ if(@mons == 2) set @dap, @dap + 1;
+ break;
+
+ case 3:
+ set @correct[@i], 3;
+ if(@mons == 3) set @dap, @dap + 1;
+ break;
+
+ case 4:
+ set @correct[@i], 4;
+ if(@mons == 4) set @dap, @dap + 1;
+ break;
+ }
+ }
+
+ mes "[Hibilaithan]";
+ mes "Okay, that's all! Now let me";
+ mes "check the answers. I was thinking";
+ mes "monsters in the order of...";
+ next;
+ mes "[Hibilaithan]";
+
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ if(@correct[@i] == 1) mes "Zhertilsh";
+ if(@correct[@i] == 2) mes "Alice";
+ if(@correct[@i] == 3) mes "Munak";
+ if(@correct[@i] == 4) mes "Isis";
+ }
+
+ if(@dap < 1) goto LV4_9_FAIL;
+
+ next;
+ mes "[Hibilaithan]";
+ mes "Wow, are you a mind reader or what?";
+ mes "You answered " + @dap + " times correctly! Whoa...";
+ mes "I guess you are already a lucky one,";
+ mes "therefore we don't have any reason";
+ mes "to prolong the work now!";
+ mes "I need some time to prepare, talk to you later!";
+
+ if(countitem(@gem) < 30) goto LV4_HACK;
+ delitem @gem, 30;
+ set lv4_weapon, lv4_weapon + 3;
+ close;
+
+
+LV4_9_FAIL:
+ if(countitem(@gem) < 10) goto LV4_HACK;
+ delitem @gem, 10;
+
+ next;
+ mes "[Hibilaithan]";
+ mes "This is not good, not good at all!";
+ mes "You didn't even have a correct answer.";
+ mes "We cannot start the work with this kind of result.";
+ mes "Okay...we must drive away your bad luck first.";
+ mes "10 " + @gemstring$ + " will do it!";
+ next;
+ mes "[Hibilaithan]";
+ mes "Now, we need to play the game again.";
+ mes "If you don't anymore ore, go get some.";
+ mes "I am not going anywhere";
+ mes "so you don't need to be in hurry.";
+ mes "Take your time!";
+ close;
+
+
+LV4_9_NOGEM:
+ mes "[Hibilaithan]";
+ mes "Hum. You might lack of";
+ mes "materials? Check them again.";
+ mes "See. I knew it.";
+ close;
+
+
+
+//--------------------------------------------------
+//Weapon Creation
+//--------------------------------------------------
+LV4_12:
+ mes "[Hibilaithan]";
+ mes "Ah, I can tell you are ready. Alright...";
+ mes "I will try to make an awsome item for you.";
+ mes "...and you are not going to look over my shoulder!";
+ mes "I don't want to share my secret recipe with anyone!";
+ next;
+ mes "- Hibilaithan picks up all the materials -";
+ mes "- and turns his back at you. -";
+ mes "- You see him busying himself with something. -";
+ mes "- Although the way he is doing it -";
+ mes "- looks very primitive and crude, -";
+ mes "- you feel that some strange energy has gathered around him. -";
+ next;
+ mes "[Hibilaithan]";
+ mes "Umm~ umm~ umm~";
+ mes "Aww~aww~ aww~";
+ mes "Phew~ phew~ phew~";
+ mes "Woo~ woo~ woo~";
+ mes "Ho~ ho~ ho~";
+ next;
+ mes "[Hibilaithan]";
+ mes " ";
+ mes " ";
+ mes "Haha, there it is! Phew, that was really hard...";
+ mes "You're anxious, aren't you? Ok, let's see...";
+ next;
+
+ mes "[Hibilaithan]";
+ mes "It's a big success! Hahaha, sure, I made it...";
+ mes "Therefore, it should be a big success.";
+ mes "Oh, you got a weapon here...let's see,";
+
+ switch( lv4_weapon ) {
+ case 12:
+ mes "it is a Mailbreaker!";
+ getitem 1225, 1; // 1225,Mail_Breaker
+ break;
+ case 13:
+ mes "it is a Swordbreaker!";
+ getitem 1224, 1; // 1224,Sword_Breaker
+ break;
+ case 14:
+ mes "it is a Slaughter!";
+ getitem 1367, 1; // 1367,Slaughter
+ break;
+ }
+
+ set lv4_weapon, 0;
+ mes "This was made competely because I am that skillful,";
+ mes "you got to be thankful for that!";
+ next;
+
+ mes "[Hibilaithan]";
+ mes "Whenever you want to have a nice thing,";
+ mes "come back to me anytime!";
+ mes "I am a very generous genius, you know?";
+ mes "Always be thankful for the weapon that I made for you, okay?";
+ mes "See you!";
+ close;
+
+
+
+//--------------------------------------------------
+//Other Quests
+//--------------------------------------------------
+LV4_7:
+ mes "[Hibilaithan]";
+ mes "Hmm...I feel something strange from you.";
+ mes "I regret to say that there is nothing I can do for you.";
+ mes "I hope you have a safe travel.";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Hibilaithan]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//--------------------------------------------------
+// Tabezthan, creates Talefing, Sabbath and Caesar's Sword
+//--------------------------------------------------
+
+um_in.gat,156,77,5 script Tabezthan 788,{
+ if(event_umbala < 3) goto LumWord;
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- You are currently overweight. -";
+ mes "- Please lose some weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon == 15) goto LV4_15;
+ if(lv4_weapon == 16) goto LV4_16;
+ if(lv4_weapon == 17) goto LV4_16;
+ if(lv4_weapon == 18) goto LV4_16;
+ if(lv4_weapon == 19) goto LV4_19;
+ if(lv4_weapon == 20) goto LV4_19;
+ if(lv4_weapon == 21) goto LV4_19;
+ if(lv4_weapon < 15) goto LV4_14;
+ if(lv4_weapon > 21) goto LV4_14;
+ end; // shouldn't be here
+
+
+LumWord:
+ mes "[Tabezthan]";
+ mes "Umba! Umbaba...umum! Baumba!";
+ mes "Umumumbababaumumbabaumba!";
+ mes "Umbaumbaumbaumbaumhah!";
+ mes "Umumumumumbababababab!";
+ close;
+
+
+LV4_0:
+ mes "[Tabezthan]";
+ mes "Hmm...I feel something different about you...";
+ mes "You are a stranger...aren't you?";
+ next;
+ mes "[Tabezthan]";
+ mes "Let me introduce myself.";
+ mes "I am Tabezthan,";
+ mes "the storage of the knowledge and the genius of Umbala...";
+ mes "Hahahaha.";
+ next;
+ mes "[Tabezthan]";
+ mes "I have two diciples. One is Hibilaithan the fool";
+ mes "and the other one is Bazo who is intelligent";
+ mes "and is from outside the same as you.";
+ next;
+ mes "[Tabezthan]";
+ mes "Of course both of them are talented and skillful";
+ mes "but I am worried about Hibilaithan, for he";
+ mes "makes many stupid mistakes and is shameless";
+ mes "for what he has done.";
+ next;
+ mes "[Tabezthan]";
+ mes "I have tought them how to manipulate";
+ mes "the mysterious energy existing in Umbala";
+ mes "for creating things with it..";
+ mes "I heard that there is a similar skill called Alchemy";
+ mes "in the outside world. Although I am not sure if I remember it correctly.";
+ next;
+ mes "[Tabezthan]";
+ mes "Anyways, would you like to see my skill?";
+ mes "If so, bring me materials I need,";
+ mes "I am more than willing to present my skill for you.";
+ next;
+
+ switch( select( "Yes, please.", "No, thank you." ) ) {
+ case 1:
+ if(BaseLevel >= 70) goto L4_0_1;
+
+ mes "[Tabezthan]";
+ mes "Sebelumnya saya harus menekankan ini";
+ mes "Barang spesial ini akan menjadi berbahaya jika kamu sendiri masih lemah";
+ mes "Kamu harus lebih berpengalaman lagi anak muda";
+ mes "Naikan level kamu terlebih dahulu";
+ mes "jika kamu sudah merasa kuat kembalilah kesini kembali";
+ mes "Sampai jumpa ~~";
+ break;
+L4_0_1:
+ mes "[Tabezthan]";
+ mes "One with curiousity...he is called the young adventurer...";
+ mes "Fine. Then let me inform you of";
+ mes "the matetrials I need. Please memorize them";
+ mes "or write them down.";
+ mes "It is not much however.";
+ next;
+ mes "[Tabezthan]";
+ mes "I need 10 Gold, 50 Steel and 10 Emperium";
+ mes "as basic materials...";
+ mes "and you can enchant the product with a certain trait.";
+ mes "For that, I need some rare ores...";
+ next;
+ mes "[Tabezthan]";
+ mes "Please bring me 30 of an ore among Phlogopite, Peridot or Rose Quartz.";
+ mes "Each one of them possess their own attribute";
+ mes "and by using the ore you have brought,";
+ mes "my product will possess a special trait.";
+ next;
+ mes "[Tabezthan]";
+ mes "However, please be aware that";
+ mes "I cannot guarantee what will come out as a result.";
+ mes "There are too many factors in the world of alchemy";
+ mes "where my knowledge is limited.";
+ mes "So you must be willing to accept the result as it is";
+ mes "even if it does not satisfy your expectations.";
+ next;
+ mes "[Tabezthan]";
+ mes "That means that you should place trust in luck.";
+ mes "Let's talk about it later...please go prepare the materials first.";
+ mes "Come back when you are ready.";
+ mes "I will wait here.";
+
+ set lv4_weapon, 15;
+ break;
+ case 2:
+ mes "[Tabezthan]";
+ mes "Oh...I see. I was not forcing you anyhow.";
+ mes "However, it is a little bit dissappointing to hear that.";
+ mes "I was going to display my ability at full length.";
+ mes "When you change your mind, please come back.";
+ break;
+ }
+ close;
+
+
+
+//--------------------------------------------------
+//Gold, Steel, Emp Check + Choosing the gem
+//--------------------------------------------------
+LV4_15:
+ if(countitem($@LV4_Gold) < 10) goto LV4_15_FAIL;
+ if(countitem($@LV4_Steel) < 50) goto LV4_15_FAIL;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_15_FAIL;
+
+ mes "[Tabezthan]";
+ mes "Ah~ you came back ealier than I thought.";
+ mes "Let's see...you have all the basic materials...and";
+ mes "we need one more thing, remember?";
+ mes "Did you bring it as well?";
+ next;
+
+ if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Olivine) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_POR;
+ if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Olivine) >= 30) goto LV4_15_PO;
+ if (countitem($@LV4_Phlogopite) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_PR;
+ if (countitem($@LV4_Olivine) >= 30 && countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_OR;
+ if (countitem($@LV4_Phlogopite) >= 30) goto LV4_15_P;
+ if (countitem($@LV4_Olivine) >= 30) goto LV4_15_O;
+ if (countitem($@LV4_Rose_Quartz) >= 30) goto LV4_15_R;
+ goto LV4_15_NOGEM;
+ end;
+
+
+LV4_15_POR:
+ mes "[Tabezthan]";
+ mes "You made a great effort to bring all of them.";
+ mes "However, you can only use one kind at a time.";
+ mes "Please choose what you want to use this time.";
+ next;
+
+ switch( select( "Phlogopite", "Peridot", "Rose Quartz" ) ) {
+ case 1:
+ mes "[Tabezthan]";
+ mes "Phlogopite...okay. Before we start,";
+ set @gem, $@LV4_Phlogopite;
+ set @gemstring$,"Phlogopite";
+ break;
+ case 2:
+ mes "[Tabezthan]";
+ mes "Peridot...okay. Before we start,";
+ set @gem, $@LV4_Olivine;
+ set @gemstring$,"Peridot";
+ break;
+ case 3:
+ mes "[Tabezthan]";
+ mes "Rose Quartz....okay. Before we start,";
+ set @gem, $@LV4_Rose_Quartz;
+ set @gemstring$,"Rose Quartz";
+ break;
+ }
+
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_PO:
+ mes "[Tabezthan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Phlogopite", "Peridot" ) ) {
+ case 1:
+ mes "[Tabezthan]";
+ mes "Phlogopite...okay. Before we start,";
+ set @gem, $@LV4_Phlogopite;
+ set @gemstring$,"Phlogopite";
+ break;
+ case 2:
+ mes "[Tabezthan]";
+ mes "Peridot...okay. Before we start,";
+ set @gem, $@LV4_Olivine;
+ set @gemstring$,"Peridot";
+ break;
+ }
+
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_PR:
+ mes "[Tabezthan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Phlogopite", "Rose Quartz" ) ) {
+ case 1:
+ mes "[Tabezthan]";
+ mes "Phlogopite...okay. Before we start,";
+ set @gem, $@LV4_Phlogopite;
+ set @gemstring$,"Phlogopite";
+ break;
+ case 2:
+ mes "[Tabezthan]";
+ mes "Rose Quartz....okay. Before we start,";
+ set @gem, $@LV4_Rose_Quartz;
+ set @gemstring$,"Rose Quartz";
+ break;
+ }
+
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_OR:
+ mes "[Tabezthan]";
+ mes "Hahaha, I asked you to bring one kind not two.";
+ mes "You can only use one kind of ore.";
+ mes "Which one would you like to use?";
+ next;
+
+ switch( select( "Peridot", "Rose Quartz" ) ) {
+ case 1:
+ mes "[Tabezthan]";
+ mes "Peridot...okay. Before we start,";
+ set @gem, $@LV4_Olivine;
+ set @gemstring$,"Peridot";
+ break;
+ case 2:
+ mes "[Tabezthan]";
+ mes "Rose Quartz....okay. Before we start,";
+ set @gem, $@LV4_Rose_Quartz;
+ set @gemstring$,"Rose Quartz";
+ break;
+ }
+
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_P:
+ mes "[Tabezthan]";
+ mes "Phlogopite...okay. Before we start,";
+ set @gem, $@LV4_Phlogopite;
+ set @gemstring$,"Phlogopite";
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_O:
+ mes "[Tabezthan]";
+ mes "Peridot...okay. Before we start,";
+ set @gem, $@LV4_Olivine;
+ set @gemstring$,"Peridot";
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_R:
+ mes "[Tabezthan]";
+ mes "Rose Quartz....okay. Before we start,";
+ set @gem, $@LV4_Rose_Quartz;
+ set @gemstring$,"Rose Quartz";
+ goto LV4_15_PICK;
+ end; // shouldn't be here
+
+
+LV4_15_PICK:
+ mes "we must do one thing first.";
+ mes "That is, to test your luck.";
+ mes "As you already know,";
+ mes "I cannot guarantee you that we will succeed";
+ mes "in makeing one right away.";
+ next;
+ mes "[Tabezthan]";
+ mes "If we can raise your luck before we start,";
+ mes "we will be able to succeed.";
+ next;
+ mes "[Tabezthan]";
+ mes "Now you must be wondering what we";
+ mes "will do in order to increase your luck.";
+ mes "It is simple, we will play a mind-reading game.";
+ mes "I am going to think of one monster among 4 of my favorites,";
+ mes "you will guess what the monster is.";
+ next;
+ mes "[Tabezthan]";
+ mes "You must answer correctly at least";
+ mes "1 out of 5 times. It should not be that difficult.";
+ mes "And if you fail to answer correctly, we must do something else";
+ mes "to drive away your bad luck.";
+ next;
+ mes "[Tabezthan]";
+ mes "I will take 10 of the special ore you chose.";
+ mes "Well, I understand that it does not sound tempting";
+ mes "but let's think of it this way.";
+ mes "It is much better than wasting 30 ore";
+ mes "by failing to create the item, isn't it?";
+ next;
+ mes "[Tabezthan]";
+ mes "Okay, now I need some time to prepare...";
+ mes "Talk to you later!";
+
+ if(countitem($@LV4_Gold) < 10) goto LV4_HACK;
+ if(countitem($@LV4_Steel) < 50) goto LV4_HACK;
+ if(countitem($@LV4_Emperium) < 10) goto LV4_HACK;
+ delitem $@LV4_Gold, 10;
+ delitem $@LV4_Steel, 50;
+ delitem $@LV4_Emperium, 10;
+ if(@gem == $@LV4_Phlogopite) set lv4_weapon, 16;
+ if(@gem == $@LV4_Olivine) set lv4_weapon, 17;
+ if(@gem == $@LV4_Rose_Quartz) set lv4_weapon, 18;
+ close;
+
+
+LV4_15_NOGEM:
+ mes "[Tabezthan]";
+ mes "Hmmm...I cannot find any rare ores in";
+ mes "the materials that you have brought...";
+ mes "Please bring me 30 of an ore among Phlogopite, Peridot";
+ mes "or Rose Quartz.";
+ close;
+
+
+LV4_15_FAIL:
+ mes "[Tabezthan]";
+ mes "I need 10 Gold, 50 Steel and 10 Emperium";
+ mes "as basic materials...";
+ mes "and you can enchant the product with a certain trait.";
+ mes "For that, I need some rare ores...";
+ next;
+ mes "[Tabezthan]";
+ mes "Please bring me 30 of an ore among Phlogopite, Peridot or Rose Quartz.";
+ mes "Each one of them possess their own attribute";
+ mes "and by using the ore you have brought,";
+ mes "my product will possess a special trait.";
+ close;
+
+
+
+//--------------------------------------------------
+//Guessing Game
+//--------------------------------------------------
+LV4_16:
+ if(lv4_weapon == 16) set @gem, $@LV4_Phlogopite;
+ if(lv4_weapon == 17) set @gem, $@LV4_Olivine;
+ if(lv4_weapon == 18) set @gem, $@LV4_Rose_Quartz;
+ if(countitem(@gem) < 30) goto LV4_2_NOGEM;
+
+ mes "[Tabezthan]";
+ mes "Okay, let's get started!";
+ mes "It is simple. There are";
+ mes "4 monsters that I like. I am going to think";
+ mes "of a monster among the 4, you will guess what it is.";
+ mes "We will play this game 5 times and you must";
+ mes "answer correctly at least 1 out of 5 times. Doesn't it sound easy?";
+ next;
+ mes "[Hibilaithan]";
+ mes "This is a very good game for";
+ mes "increasing your luck!";
+ mes "Okay, better be ready now.";
+ next;
+
+ set @dap, 0;
+ set @correct[0],1;
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ mes "[Tabezthan]";
+
+ if(@i == 1) mes "I like Baphomet, Dark Lord,";
+ if(@i == 1) mes "Bloody Knight, and Stormy Knight among all monsters.";
+
+ mes "Now, guess which one";
+ mes "I am thinking at this moment.";
+ next;
+
+ set @mons, rand(1, 4);
+
+ switch( select( "Baphomet", "Dark Lord", "Bloody Knight", "Stormy Knight" ) ) {
+ case 1:
+ set @correct[@i], 1;
+ if(@mons == 1) set @dap, @dap + 1;
+ break;
+
+ case 2:
+ set @correct[@i], 2;
+ if(@mons == 2) set @dap, @dap + 1;
+ break;
+
+ case 3:
+ set @correct[@i], 3;
+ if(@mons == 3) set @dap, @dap + 1;
+ break;
+
+ case 4:
+ set @correct[@i], 4;
+ if(@mons == 4) set @dap, @dap + 1;
+ break;
+ }
+ }
+
+ mes "[Tabezthan]";
+ mes "Okay, that's all! Now let me check";
+ mes "the answers. I was thinking";
+ mes "of the monsters in the order of...";
+ next;
+ mes "[Tabezthan]";
+
+ for( set @i, 1; @i <= 5; set @i, @i + 1 ) {
+ if(@correct[@i] == 1) mes "Baphomet";
+ if(@correct[@i] == 2) mes "Dark Lord";
+ if(@correct[@i] == 3) mes "Bloody Knight";
+ if(@correct[@i] == 4) mes "Stormy Knight";
+ }
+
+ if(@dap < 1) goto LV4_16_FAIL;
+
+ next;
+ mes "[Tabezthan]";
+ mes "You have answered " + @dap + " times correctly.";
+ mes "It seems that your luck is at its highest.";
+ mes "I need some time to prepare, talk to you later.";
+
+ if(countitem(@gem) < 30) goto LV4_HACK;
+ delitem @gem, 30;
+ set lv4_weapon, lv4_weapon + 3;
+ close;
+
+
+LV4_16_FAIL:
+ if(countitem(@gem) < 10) goto LV4_HACK;
+ delitem @gem, 10;
+
+ next;
+ mes "[Tabezthan]";
+ mes "Unfortunately you have failed...";
+ mes "When you have bad luck, you'd better";
+ mes "not expect a good result.";
+ mes "Okay, we must drive away your bad luck.";
+ mes "10 " + @gemstring$ + " will do it.";
+ next;
+ mes "[Tabezthan]";
+ mes "Do not be so dissappointed.";
+ mes "It is still better than wasting 30 of them";
+ mes "for trying to make a thing when you know";
+ mes "you would not make it. ";
+ next;
+ mes "[Tabezthan]";
+ mes "If you need something to prepare,";
+ mes "please do. I will wait for you here.";
+ close;
+
+
+LV4_16_NOGEM:
+ mes "[Tabezthan]";
+ mes "Umm...it seems you are lacking " + @gemstring$;
+ mes "Please count them and";
+ mes "if you don't have enough,";
+ mes "you can go gather more first.";
+ close;
+
+
+
+//--------------------------------------------------
+//Weapon Creation
+//--------------------------------------------------
+LV4_19:
+ mes "[Tabezthan]";
+ mes "Great, I am also ready.";
+ mes "Shall we start now? Give me a minute.";
+ mes "I need to arrange these materials in a magic circle.";
+ next;
+ mes "- He arranges materials in a strange circle -";
+ mes "- and starts chanting in a strange language. -";
+ mes "- As he does that, suddenly the air surrounding him -";
+ mes "- seems to change and you feel something powerful-";
+ mes "- gathering around him and the materials. -";
+ next;
+ mes "[Tabezthan]";
+ mes "Please understand that the power is not from me.";
+ mes "I just used my ability to gather the power into these materials.";
+ mes "The power has come from the city of the dead.";
+ next;
+ mes "[Tabezthan]";
+ mes "The result is in God's hands.";
+ mes "Let's pray for a good result together.";
+ mes "Hmmmmm!";
+ next;
+ mes "- After a while...you find the materials -";
+ mes "- are gathering and combining into one new thing. -";
+ mes "- Does that mean that you have succeeded or failed?! -";
+ next;
+ mes "[Tabezthan]";
+ mes "?!...God must bless you!";
+ mes "I cannot believe that I created such a rare weapon!";
+ mes "Yes, my late father told me the name of this weapon.";
+
+ switch( lv4_weapon ) {
+ case 19:
+ mes "That is Caesar's Sword.";
+ getitem 1134, 1; // 1134,Caesar's_Sword
+ break;
+ case 20:
+ mes "That is Talefing.";
+ getitem 1139, 1; // 1139,Talefing_
+ break;
+ case 21:
+ mes "That is Sabbath.";
+ getitem 1365, 1; // 1365,Sabbath
+ break;
+ }
+
+ set lv4_weapon, 0;
+ mes "[Tabezthan]";
+ mes "Now, since I made this with materials";
+ mes "that you have brought, this is yours now.";
+ mes "I only helped you to make it,";
+ mes "and I am glad to give this to you.";
+ next;
+ mes "[Tabezthan]";
+ mes "Well, feel free to come back";
+ mes "if you want to make a thing again...hahaha.";
+ mes "The weapon was made to be yours.";
+ close;
+
+
+
+//--------------------------------------------------
+//Other Quests
+//--------------------------------------------------
+LV4_14:
+ mes "[Tabezthan]";
+ mes "Umm...you don't have a business with me, do you?";
+ mes "Please do not think of me as an old fool.";
+ mes "When a man gets older, he can see through other people's minds.";
+ mes "Go ahead and do what you have been doing.";
+ mes "Do not let me intrrupt you any longer.";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Tabezthan]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//--------------------------------------------------
+// Bill Thayer, Gives hints for S grade weapons quests
+//--------------------------------------------------
+
+aldebaran.gat,178,239,3 script Bill Thayer 712,{
+ // Explain Materials
+ if(lv4_weapon == 26) goto LV4_26;
+ if(lv4_weapon == 27) goto LV4_27;
+ if(lv4_weapon == 28) goto LV4_28;
+
+ if(lv4_weapon == 35) goto LV4_35;
+ if(lv4_weapon == 36) goto LV4_36;
+ if(lv4_weapon == 37) goto LV4_37;
+
+ if(lv4_weapon == 44) goto LV4_44;
+ if(lv4_weapon == 45) goto LV4_45;
+ if(lv4_weapon == 46) goto LV4_46;
+
+ if(lv4_weapon == 53) goto LV4_53;
+ if(lv4_weapon == 54) goto LV4_54;
+ if(lv4_weapon == 55) goto LV4_55;
+
+ // Guide
+ if(lv4_weapon == 22) goto LV4_22;
+ if(lv4_weapon == 23) goto LV4_23;
+
+ if(lv4_weapon == 31) goto LV4_31;
+ if(lv4_weapon == 32) goto LV4_32;
+
+ if(lv4_weapon == 40) goto LV4_40;
+ if(lv4_weapon == 41) goto LV4_41;
+
+ if(lv4_weapon == 49) goto LV4_49;
+ if(lv4_weapon == 50) goto LV4_50;
+
+ mes "[Bill Thayer]";
+ mes "...I cannot do anything now.";
+ mes "In the past, I used to be a well-known weaponsmith";
+ mes "but now I am just a lonely old man who lost all of his sons.";
+ mes "Please leave me alone.";
+ close;
+
+LV4_27:
+LV4_28:
+LV4_36:
+LV4_37:
+LV4_45:
+LV4_46:
+LV4_54:
+LV4_55:
+ if(lv4_weapon == 27)
+{
+ set @LV4_Gem1Name$, "Peridot";
+ set @LV4_Gem2Name$, "Turquoise";
+ set @LV4_Gem3Name$, "Agate";
+}
+ if(lv4_weapon == 28)
+{
+ set @LV4_Gem1Name$, "Phlogopite";
+ set @LV4_Gem2Name$, "Pyroxene";
+ set @LV4_Gem3Name$, "Rose Quartz";
+}
+ if(lv4_weapon == 36)
+{
+ set @LV4_Gem1Name$, "Muscovite";
+ set @LV4_Gem2Name$, "Rose Quartz";
+ set @LV4_Gem3Name$, "Peridot";
+}
+ if(lv4_weapon == 37)
+{
+ set @LV4_Gem1Name$, "Biotite";
+ set @LV4_Gem2Name$, "Agate";
+ set @LV4_Gem3Name$, "Citrine";
+}
+ if(lv4_weapon == 45)
+{
+ set @LV4_Gem1Name$, "Turquoise";
+ set @LV4_Gem2Name$, "Biotite";
+ set @LV4_Gem3Name$, "Rose Quartz";
+}
+ if(lv4_weapon == 46)
+{
+ set @LV4_Gem1Name$, "Citrine";
+ set @LV4_Gem2Name$, "Pyroxene";
+ set @LV4_Gem3Name$, "Phlogopite";
+}
+ if(lv4_weapon == 54)
+{
+ set @LV4_Gem1Name$, "Muscovite";
+ set @LV4_Gem2Name$, "Agate";
+ set @LV4_Gem3Name$, "Citrine";
+}
+ if(lv4_weapon == 55)
+{
+ set @LV4_Gem1Name$, "Pyroxene";
+ set @LV4_Gem2Name$, "Turquoise";
+ set @LV4_Gem3Name$, "Phlogopite";
+}
+
+ mes "[Bill Thayer]";
+ mes "Hmm...it seems that you need 30 of";
+ mes @LV4_Gem1Name$ + ", " + @LV4_Gem2Name$ + ", and " + @LV4_Gem3Name$;
+ mes "I am sure that those are the materials...";
+ mes "but I cannot guarantee anything about the result...";
+ next;
+ mes "[Bill Thayer]";
+ mes "My sons passed away before we finished this research...";
+ mes "Hahaha...let's not talk about it.";
+ mes "I told you what you need anyway.";
+ close;
+
+
+LV4_26:
+LV4_35:
+LV4_44:
+LV4_53:
+ mes "[Bill Thayer]";
+ if(lv4_weapon == 26) mes "What, Kayron's research?";
+ if(lv4_weapon == 35) mes "What, Reyghema's research?";
+ if(lv4_weapon == 44) mes "What? Hein's research?";
+ if(lv4_weapon == 53) mes "What? Waltboughst's research?";
+ mes "How do you know him?";
+ mes "Were you a friend of him when he was still alive?";
+ mes "Ah....there must an act of providence.";
+ next;
+
+ set lv4_weapon, lv4_weapon + rand(1, 2);
+
+ switch( lv4_weapon ) {
+ case 27:
+ set @LV4_Gem1Name$, "Peridot";
+ set LV4_Gem1, $@LV4_Olivine;
+ set @LV4_Gem2Name$, "Turquoise";
+ set LV4_Gem2, $@LV4_Turquoise;
+ set @LV4_Gem3Name$, "Agate";
+ set LV4_Gem3, $@LV4_Agate;
+ break;
+ case 28:
+ set @LV4_Gem1Name$, "Phlogopite";
+ set LV4_Gem1, $@LV4_Phlogopite;
+ set @LV4_Gem2Name$, "Pyroxene";
+ set LV4_Gem2, $@LV4_Pyroxene;
+ set @LV4_Gem3Name$, "Rose Quartz";
+ set LV4_Gem3, $@LV4_Rose_Quartz;
+ break;
+ case 36:
+ set @LV4_Gem1Name$, "Muscovite";
+ set LV4_Gem1, $@LV4_Muscovite;
+ set @LV4_Gem2Name$, "Rose Quartz";
+ set LV4_Gem2, $@LV4_Rose_Quartz ;
+ set @LV4_Gem3Name$, "Peridot";
+ set LV4_Gem3, $@LV4_Olivine;
+ break;
+ case 37:
+ set @LV4_Gem1Name$, "Biotite";
+ set LV4_Gem1, $@LV4_Biotite;
+ set @LV4_Gem2Name$, "Agate";
+ set LV4_Gem2, $@LV4_Agate;
+ set @LV4_Gem3Name$, "Citrine";
+ set LV4_Gem3, $@LV4_Citrine;
+ break;
+ case 45:
+ set @LV4_Gem1Name$, "Turquoise";
+ set LV4_Gem1, $@LV4_Turquoise;
+ set @LV4_Gem2Name$, "Biotite";
+ set LV4_Gem2, $@LV4_Biotite;
+ set @LV4_Gem3Name$, "Rose Quartz";
+ set LV4_Gem3, $@LV4_Rose_Quartz;
+ break;
+ case 46:
+ set @LV4_Gem1Name$, "Citrine";
+ set LV4_Gem1, $@LV4_Citrine;
+ set @LV4_Gem2Name$, "Pyroxene";
+ set LV4_Gem2, $@LV4_Pyroxene;
+ set @LV4_Gem3Name$, "Phlogopite";
+ set LV4_Gem3, $@LV4_Phlogopite;
+ break;
+ case 54:
+ set @LV4_Gem1Name$, "Muscovite";
+ set LV4_Gem1, $@LV4_Muscovite;
+ set @LV4_Gem2Name$, "Agate";
+ set LV4_Gem2, $@LV4_Agate;
+ set @LV4_Gem3Name$, "Citrine";
+ set LV4_Gem3, $@LV4_Citrine;
+ break;
+ case 55:
+ set @LV4_Gem1Name$, "Pyroxene";
+ set LV4_Gem1, $@LV4_Pyroxene;
+ set @LV4_Gem2Name$, "Turquoise";
+ set LV4_Gem2, $@LV4_Turquoise;
+ set @LV4_Gem3Name$, "Phlogopite";
+ set LV4_Gem3, $@LV4_Phlogopite;
+ break;
+ }
+
+ mes "[Bill Thayer]";
+ mes "Hmm...it seems that you need 30 of";
+ mes @LV4_Gem1Name$ + ", " + @LV4_Gem2Name$ + ", and " + @LV4_Gem3Name$;
+ mes "I am sure that those are the materials...";
+ mes "but I cannot guarantee anything about the result...";
+ next;
+ mes "[Bill Thayer]";
+ mes "My sons passed away before we finished this research...";
+ mes "Hahaha...let's not talk about it.";
+ mes "I told you what you need anyway.";
+ close;
+
+
+LV4_22:
+LV4_23:
+ mes "[Bill Thayer]";
+ mes "Oh well, I told you already";
+ mes "that there is nothing I can do for you...";
+ mes "since my sons are all gone...why are";
+ mes "you wasting my breath? ^4D4DFFYou are helpless.^000000";
+ set lv4_weapon, 23;
+ next;
+ mes "[Bill Thayer]";
+ mes "...you just made me";
+ mes "miss my sons again...";
+ mes "Please leave me alone.";
+ close;
+
+
+LV4_31:
+LV4_32:
+ mes "[Bill Thayer]";
+ mes "All of my sons broke my heart by dying young...";
+ mes "...youth...what is youth?";
+ mes "^4D4DFFThat means that you never regret anything!^000000";
+ set lv4_weapon, 32;
+ next;
+ mes "[Bill Thayer]";
+ mes "That was what I used to tell to my sons.";
+ mes "Please remember that,";
+ mes "never regret anything that you have done.";
+ mes "However, in order to do that, you must";
+ mes "do everything right...that's all I can tell you for now.";
+ close;
+
+
+LV4_40:
+LV4_41:
+ mes "[Bill Thayer]";
+ mes "...no matter how much you are willing to pay me,";
+ mes "I am not going to forge any weapons.";
+ mes "Even when I was actively forging weapons,";
+ mes "I didn't accept money from my clients.";
+ mes "You know why?";
+ next;
+ mes "[Bill Thayer]";
+ mes "It brings me bad luck ^4D4DFFto^000000";
+ mes "^4D4DFFforge a good weapon.^000000";
+ mes "Therefore I didn't receive money from them.";
+ set lv4_weapon, 41;
+ next;
+ mes "[Bill Thayer]";
+ mes "Well, I am not going to do so";
+ mes "even if you offer me something else other than money";
+ mes "...unless all of my sons come back";
+ mes "alive....";
+ close;
+
+
+LV4_49:
+LV4_50:
+ mes "[Bill Thayer]";
+ mes "...do you not have anything to do?";
+ mes "I hope you stop bothering me";
+ mes "and trying your best for your work.";
+ mes "Ah...trying best does not always";
+ mes "result in a success though.";
+ next;
+ mes "[Bill Thayer]";
+ mes "However, ^4D4DFFall the successful men^000000";
+ mes "^4D4DFFin the history tried their best!^000000";
+ mes "I hope you will remember that.";
+ mes "I used to tell this to my sons when they were alive.";
+ mes "Hahaha...";
+ set lv4_weapon, 50;
+ close;
+}
+
+//--------------------------------------------------
+// Kayron, creates Longinus' Spear, Guillotine, Great Axe and Brionac
+//--------------------------------------------------
+
+niflheim.gat,240,193,3 script Kayron 794, {
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- You are currently overweight. -";
+ mes "- Please lose some weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
+ mes "[Kayron]";
+ mes "Bah, I cannot believe";
+ mes "that such a weak man like you even came here.";
+ mes "You have an invisible sign on your forehead";
+ mes "that indicates you are a weakling. Be strong first.";
+ close;
+
+
+LV4_LEVEL_PASS:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon < 22) goto LV4_21;
+ if(lv4_weapon == 22) goto LV4_22;
+ if(lv4_weapon == 23) goto LV4_23;
+ if(lv4_weapon == 24) goto LV4_24;
+ if(lv4_weapon == 25) goto LV4_25;
+ if(lv4_weapon == 26) goto LV4_26;
+ if(lv4_weapon == 27) goto LV4_27;
+ if(lv4_weapon == 28) goto LV4_28;
+ if(lv4_weapon == 29) goto LV4_29;
+ if(lv4_weapon == 30) goto LV4_30;
+ if(lv4_weapon > 30) goto LV4_31;
+ end; // shouldn't be here
+
+
+LV4_0:
+LV4_22:
+ mes "[Kayron]";
+ mes "I used to be called Kayron when I was alive.";
+ mes "But now I am nothing but";
+ mes "a ghost wandering this place.";
+ mes "I am worthless...I cannot do anything";
+ mes "without a body...";
+ next;
+
+ if(lv4_weapon == 0) goto LV4_0_ASK;
+
+ mes "[Kayron]";
+ mes "Ah...I cannot remember what I was going to say...";
+ mes "Waaahhh.....I cannot remember....";
+ mes "My memory is gone...!";
+ close;
+
+LV4_0_ASK:
+ switch( select( "Show interest.", "Ignore him." ) ) {
+ case 1:
+ mes "[Kayron]";
+ mes "Ah...I cannot remember what I was going to say...";
+ mes "Waaahhh.....I cannot remember....";
+ mes "My memory is gone...!";
+ set lv4_weapon, 22;
+ close;
+ break;
+ case 2:
+ mes "- Because you decided to ignore him, -";
+ mes "- you are no longer able to hear him. -";
+ close;
+ break;
+ }
+ end;
+
+
+LV4_21:
+LV4_31:
+ mes "[Kayron]";
+ mes "I feel something different about you.";
+ mes "Did you come here with a purpose?";
+ mes "I am envious of you...";
+ close;
+
+
+LV4_23:
+ mes "[Kayron]";
+ mes "I used to be called Kayron when I was alive.";
+ mes "But now I am nothing but";
+ mes "a ghost wandering this place.";
+ mes "I am worthless...I cannot do anything";
+ mes "without a body...";
+ next;
+ set @dap1$, "You are helpless.";
+ input @answer1$;
+ if(@answer1$ == @dap1$) goto LV4_23_CORRECT;
+ mes "[Kayron]";
+ mes "...? What did you just say?";
+ mes "I am sorry but I don't think I understood you.";
+ close;
+
+LV4_23_CORRECT:
+ mes "[Kayron]";
+ mes "Yes, You are helpless...?! Eh?";
+ mes "That was my father's favorite saying!";
+ mes "Whoa?! Ah...";
+ mes "Yes...I forgot that I am dead already.";
+ mes "Why did you make me recall something from my past?";
+ mes "It is no use now...";
+ next;
+ mes "[Kayron]";
+ mes "But I want to do something in return...";
+ mes "since you made me find a piece of my mind.";
+ mes "I used to be a weaponsmith in the past,";
+ mes "therefore I am going to forge a nice weapon for you.";
+ next;
+ mes "[Kayron]";
+ mes "But you have to gather the materials for me.";
+ mes "As you see, I do not have a body";
+ mes "that would allow me to touch other objects...";
+ mes "So you got to help me with that.";
+ next;
+ mes "[Kayron]";
+ mes "Luckily this place is filled with mysterious energy,";
+ mes "that makes my work easier!";
+ mes "Heh, even if I fail to forge one,";
+ mes "I don't have to worry about dying.";
+ mes "Because I am dead already! Muhahahaha!";
+ next;
+ mes "[Kayron]";
+ mes "I will talk to you in a while.";
+ mes "I am trying to think of the receipe...";
+ set lv4_weapon, 24;
+ close;
+
+
+LV4_25:
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_25_BASE_MAT;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_25_BASE_MAT;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_25_BASE_MAT;
+ if(countitem($@LV4_Gold) < 20) goto LV4_25_BASE_MAT;
+
+ mes "[Kayron]";
+ mes "Oh...you brought everything I need!";
+ mes "You are a reliable person unlike your appearance.";
+ mes "But here is the thing...";
+ mes "There are some more materials I need...";
+ mes "But I cannot think of any of them...my memory";
+ mes "is unclear...arrrrph...";
+ next;
+ mes "[Kayron]";
+ mes "I need to think about that a little longer.";
+ mes "I know that I really need those materials...awwww....";
+ mes "Do you have any idea to bring my memory back?";
+ mes "At the same time, rest assured that the materials";
+ mes "you brought will be used for my creation. So let me keep them for you.";
+
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
+ delitem $@LV4_Hammer_Of_Blacksmith, 2;
+ delitem $@LV4_Emperium_Anvil, 1;
+ delitem $@LV4_Illusion_Flower, 1;
+ delitem $@LV4_Gold, 20;
+ set lv4_weapon, 26;
+ close;
+
+LV4_24:
+LV4_25_BASE_MAT:
+ switch( lv4_weapon ) {
+ case 24:
+ mes "[Kayron]";
+ mes "Oh, you came back at a right time.";
+ mes "I just finished my thoughts. Let me tell you one thing.";
+ mes "I cannot guarantee you which weapon will come out of this.";
+ mes "Also you must be willing to take a risk as well...";
+ mes "I guess that the result will be affected by the power";
+ mes "of Nifflheim at the time I make.";
+ next;
+ mes "[Kayron]";
+ mes "Let me give you the list of materials";
+ mes "I need. They are quite a lot,";
+ mes "so write them down if you need.";
+ break;
+ case 25:
+ mes "[Kayron]";
+ mes "I will tell you the list of materials I need again.";
+ mes "I think I need a lot of materials...so";
+ mes "write them down if you need.";
+ break;
+ }
+ next;
+ mes "[Kayron]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ next;
+ mes "[Kayron]";
+ mes "Bring these to me first. I am kind of worried";
+ mes "that I forgot something...but I will try to remember";
+ mes "while waiting for you to bring these items.";
+ next;
+ mes "[Kayron]";
+ mes "Have a safe travel.";
+ set lv4_weapon, 25;
+ close;
+
+
+LV4_27:
+LV4_28:
+ if(countitem(LV4_Gem1) < 30) goto LV4_27_NOGEM;
+ if(countitem(LV4_Gem2) < 30) goto LV4_27_NOGEM;
+ if(countitem(LV4_Gem3) < 30) goto LV4_27_NOGEM;
+ mes "[Kayron]";
+ mes "...Um? The items that you brought to me seem";
+ mes "to be good materials for my creation...";
+ mes "Give them to me, I shall try first!";
+ next;
+ mes "[Kayron]";
+ mes "Oh...I was right! How did you";
+ mes "know these are materials I need?";
+ mes "Great, give me a moment!";
+ next;
+ mes "[Kayron]";
+ mes "...wait, I must test your luck first.";
+ mes "Since I am not sure about the result,";
+ mes "we should place trust in luck for the result of my creation.";
+ mes "You must have good luck...";
+ next;
+ mes "[Kayron]";
+ mes "We are going to play 'Rock, Paper, Scissors'.";
+ mes "You must win at least 2 out of 3 times.";
+ mes "If you fail, you must throw away a large amount";
+ mes "of one of the 3 kinds of ore that you have brought.";
+ mes "It is for driving away your bad luck.";
+ next;
+ mes "[Kayron]";
+ mes "I will give you a piece of paper.";
+ mes "You will write down one among 'Rock, Paper, or Scissors'.";
+ mes "I will do the same at the same time.";
+ mes "We will compare each other's paper after.";
+ next;
+
+ set @shobu, 0;
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@i == 2) mes "[Kayron]";
+ if(@i == 2) mes "Let's play the second one!";
+ if(@i == 3) mes "[Kayron]";
+ if(@i == 3) mes "This will be the last one!";
+ if(@i == 3) mes "Let's compare after this.";
+ set @npchand[@i], rand(1, 3);
+ switch( select( "Scissors", "Rock", "Paper" ) ) {
+ case 1:
+ set @myhand[@i], 1;
+ if(@npchand[@i] == 3) set @shobu, @shobu + 1;
+ break;
+ case 2:
+ set @myhand[@i], 2;
+ if(@npchand[@i] == 1) set @shobu, @shobu + 1;
+ break;
+ case 3:
+ set @myhand[@i], 3;
+ if(@npchand[@i] == 2) set @shobu, @shobu + 1;
+ break;
+ }
+ }
+
+ if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
+
+ if(@shobu > 1) goto LV4_27_WIN;
+
+ switch ( rand(1 ,3) ) {
+ case 1:
+ delitem LV4_Gem1, 30;
+ break;
+ case 2:
+ delitem LV4_Gem2, 30;
+ break;
+ case 3:
+ delitem LV4_Gem3, 30;
+ break;
+ }
+ goto LV4_27_RESULT;
+
+LV4_27_WIN:
+ delitem LV4_Gem1, 30;
+ delitem LV4_Gem2, 30;
+ delitem LV4_Gem3, 30;
+ set lv4_weapon, lv4_weapon + 2;
+ goto LV4_27_RESULT;
+
+LV4_27_RESULT:
+ mes "[Kayron]";
+ mes "Okay...I played in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@npchand[@i] == 1) mes "Scissors";
+ if(@npchand[@i] == 2) mes "Rock";
+ if(@npchand[@i] == 3) mes "Paper";
+ }
+
+ next;
+ mes "[Kayron]";
+ mes "You did in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@myhand[@i] == 1) mes "Scissors";
+ if(@myhand[@i] == 2) mes "Rock";
+ if(@myhand[@i] == 3) mes "Paper";
+ }
+
+ next;
+
+ if(@shobu > 1) goto LV4_27_SAY_WIN;
+
+ mes "[Kayron]";
+ mes "Well well well...you lost the game.";
+ mes "Ah~ you were close though...";
+ mes "We must drive away bad luck.";
+ next;
+ mes "[Kayron]";
+ mes "Okay, I will wait here,";
+ mes "go bring me the materials again...";
+ close;
+
+LV4_27_SAY_WIN:
+ mes "[Kayron]";
+ mes "Let's see...";
+ mes "You won total " + @shobu + " times.";
+ mes "Ah~ you must be really good at game!";
+ mes "Yes, your luck is at its highest!";
+ next;
+ mes "[Kayron]";
+ mes "I am going to keep my promise.";
+ mes "But I need some time to prepare.";
+ mes "Give me the materials now and I will talk to you later.";
+ close;
+
+LV4_26:
+LV4_27_NOGEM:
+ mes "[Kayron]";
+ mes "Arph...it has not gotten into my memory yet.";
+ mes "Awww....this is a problem.";
+ mes "I used to often discuss the materials";
+ mes "with my family...now I cannot remember what they are...";
+ close;
+
+
+LV4_29:
+LV4_30:
+ mes "[Kayron]";
+ mes "Hahaha...you came back at the right time.";
+ mes "The result? Do you want to know about the result?...";
+ mes "Haha...okay...let's see...";
+ next;
+ mes "[Kayron]";
+ mes "...YES! It's a success!";
+ mes "I created the weapon that got me killed last time!";
+ mes "Look at this...haha! I died while making this!";
+ mes "... The name of the weapon is...";
+
+
+ switch( rand(1, 2) ) {
+ case 1:
+ if(lv4_weapon == 29) mes "Great Axe! Weee~ I made it!";
+ if(lv4_weapon == 29) getitem 1364 ,1; // 1364,Great_Axe
+ if(lv4_weapon == 30) mes "Longinus's Spear! Weee~ I made it!";
+ if(lv4_weapon == 30) getitem 1469, 1; // 1469,Longinus's_Spear
+ break;
+ case 2:
+ if(lv4_weapon == 29) mes "Guillotine! Weee~ I made it!";
+ if(lv4_weapon == 29) getitem 1369, 1; // 1369,Guillotine
+ if(lv4_weapon == 30) mes "Brionac! Weee~ I made it!";
+ if(lv4_weapon == 30) getitem 1470, 1; // 1470,Brionac
+ }
+
+ set lv4_weapon, 0;
+ next;
+ mes "[Kayron]";
+ mes "I finally succeeded in the research...";
+ mes "I want to show this result to my father...";
+ mes "He will be really happy for this.";
+ next;
+ mes "[Kayron]";
+ mes "Ah~ I feel my memories are fading again...";
+ mes "If you see me next time...";
+ mes "please let me remember the memories again...";
+ mes "Thank you...";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Kayron]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//--------------------------------------------------
+// Reyghema, creates Berserk, Tjungkulleti, Rudra's Bow and Brocca(Skewer)
+//--------------------------------------------------
+
+niflheim.gat,99,268,5 script Reyghema 794, {
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- You are currently overweight. -";
+ mes "- Please lose some weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
+ mes "[Reyghema]";
+ mes "Um? Do you have any business with me?";
+ mes "Sorry but I don't. I'm also not";
+ mes "speaking to a weak person like you.";
+ mes "Have a safe travel~";
+ close;
+
+
+LV4_LEVEL_PASS:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon < 31) goto LV4_30;
+ if(lv4_weapon == 31) goto LV4_31;
+ if(lv4_weapon == 32) goto LV4_32;
+ if(lv4_weapon == 33) goto LV4_33;
+ if(lv4_weapon == 34) goto LV4_34;
+ if(lv4_weapon == 35) goto LV4_35;
+ if(lv4_weapon == 36) goto LV4_36;
+ if(lv4_weapon == 37) goto LV4_37;
+ if(lv4_weapon == 38) goto LV4_38;
+ if(lv4_weapon == 39) goto LV4_39;
+ if(lv4_weapon > 39) goto LV4_40;
+ end; // shouldn't be here
+
+
+LV4_0:
+LV4_31:
+ mes "[Reyghema]";
+ mes "Darn it...I didn't want to die!";
+ mes "Well...there is no living thing that wants to die but...";
+ mes "Especially me, I was too young to die!";
+ mes "Youth! ...Ah...I just remember the word.";
+ mes "Speaking of which...I think I usually said something related to that...";
+ next;
+
+ if(lv4_weapon == 0) goto LV4_0_ASK;
+
+ mes "[Reyghema]";
+ mes "Ah...I cannot remember what I was going to say...";
+ mes "Waaahhh.....I cannot remember....";
+ mes "My memory is gone...!";
+ close;
+
+LV4_0_ASK:
+ switch( select( "Show interest.", "Igonore him." ) ) {
+ case 1:
+ mes "[Reyghema]";
+ mes "Ah...I cannot remember what I was going to say...";
+ mes "Waaahhh.....I cannot remember....";
+ mes "My memory is gone...!";
+ set lv4_weapon, 31;
+ close;
+ break;
+ case 2:
+ mes "- Because you decided to ignore him, -";
+ mes "- you are no longer able to hear him. -";
+ close;
+ break;
+ }
+ end;
+
+
+LV4_30:
+LV4_40:
+ mes "[Reyghema]";
+ mes "I feel something different about you.";
+ mes "Did you come here with a purpose?";
+ mes "I am envious of you...";
+ close;
+
+
+LV4_32:
+ mes "[Reyghema]";
+ mes "I used to be called Reyghema when I was alive.";
+ mes "But now I am nothing but";
+ mes "a ghost wandering this place.";
+ mes "I am worthless...I cannot do anything";
+ mes "without a body...";
+ next;
+ set @dap2$, "That means that you never regret anything!";
+ input @answer2$;
+ if(@answer2$ == @dap2$) goto LV4_32_CORRECT;
+ mes "[Reyghema]";
+ mes "What? Do you want to play a game with me or what?";
+ mes "Unfortunately I have something to do...";
+ mes "wait...what was I going to do?";
+ close;
+
+LV4_32_CORRECT:
+ mes "[Reyghema]";
+ mes "...";
+ next;
+ mes "[Reyghema]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Reyghema]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Reyghema]";
+ mes "That's right! I am Bill Thayer the Weaponsmith's";
+ mes "second son! And I must forge a weapon";
+ mes "in order to not regret my youth!";
+ mes "Even if I am dead, I cannot give it up!";
+ next;
+ mes "[Reyghema]";
+ mes "Hey you, thank you for letting me have my memory back!";
+ mes "You need to do me another favor!";
+ mes "Bring me some items, I need to forge a weapon.";
+ mes "Once I make one, I will give it to you in return for your favor.";
+ next;
+ mes "[Reyghema]";
+ mes "Reyghema, breathe deeply first...phew~.";
+ mes "Give me a second!";
+ set lv4_weapon, 33;
+ close;
+
+
+LV4_34:
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_34_BASE_MAT;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_34_BASE_MAT;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_34_BASE_MAT;
+ if(countitem($@LV4_Gold) < 20) goto LV4_34_BASE_MAT;
+
+ mes "[Reyghema]";
+ mes "Oh...you brought everything I need!";
+ mes "You are a reliable person unlike you appear.";
+ mes "But here is the thing...";
+ mes "There are some more materials I need...";
+ mes "But I cannot think of any of them...my memory";
+ mes "is unclear...arrrrph...";
+ next;
+ mes "[Reyghema]";
+ mes "I need to think about that a little longer.";
+ mes "I know that I really need those materials...awwww....";
+ mes "Do you have any idea to bring my memory back?";
+ mes "At the same time, rest assured that the materials";
+ mes "you brought will be used for my creation. So let me keep them for you.";
+
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
+ delitem $@LV4_Hammer_Of_Blacksmith, 2;
+ delitem $@LV4_Emperium_Anvil, 1;
+ delitem $@LV4_Illusion_Flower, 1;
+ delitem $@LV4_Gold, 20;
+ set lv4_weapon, 35;
+ close;
+
+LV4_33:
+LV4_34_BASE_MAT:
+ switch( lv4_weapon ) {
+ case 33:
+ mes "[Reyghema]";
+ mes "Okay. You don't need any other explaination, do you?";
+ mes "I will tell you what I need";
+ mes "so please do not forget those materials.";
+ break;
+ case 34:
+ mes "[Reyghema]";
+ mes "I will tell you the list of materials I need again.";
+ mes "I think I need a lot of materials...so";
+ mes "write them down if you need.";
+ break;
+ }
+ next;
+ mes "[Reyghema]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ mes "...wait...are they all...or do I need more?!";
+ if(lv4_weapon == 33) next;
+ if(lv4_weapon == 33) mes "[Reyghema]";
+ if(lv4_weapon == 33) mes "Ah...I think need something more...it's very important...";
+ if(lv4_weapon == 33) mes "But I cannot remember what more I need....!";
+ if(lv4_weapon == 33) mes "Bah...this is so frustrating.";
+ set lv4_weapon, 34;
+ close;
+
+
+LV4_36:
+LV4_37:
+ if(countitem(LV4_Gem1) < 30) goto LV4_36_NOGEM;
+ if(countitem(LV4_Gem2) < 30) goto LV4_36_NOGEM;
+ if(countitem(LV4_Gem3) < 30) goto LV4_36_NOGEM;
+ mes "[Reyghema]";
+ mes "...Um? The items that you brought to me seem";
+ mes "to be good materials for my creation...";
+ mes "Give them to me, I shall try first!";
+ next;
+ mes "[Reyghema]";
+ mes "Oh...I was right! How did you";
+ mes "know these are materials I need?";
+ mes "Great, give me a moment!";
+ next;
+ mes "[Reyghema]";
+ mes "...wait, I must test your luck first.";
+ mes "Since I am not sure about the result,";
+ mes "we should place trust in luck for the result of my creation.";
+ mes "You must have good luck...";
+ next;
+ mes "[Reyghema]";
+ mes "We are going to play 'Rock, Paper, Scissors'.";
+ mes "You must win at least 2 out of 3 times.";
+ mes "If you fail, you must leave a large amount";
+ mes "of one material you have brought.";
+ mes "It is for driving away your bad luck.";
+ next;
+ mes "[Reyghema]";
+ mes "I will give you a piece of paper.";
+ mes "You will write down one among 'Rock, Paper, or Scissors'.";
+ mes "I will do the same at the same time.";
+ mes "We will then compare each other's paper.";
+ next;
+
+ set @shobu, 0;
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@i == 2) mes "[Reyghema]";
+ if(@i == 2) mes "Let's play the second one!";
+ if(@i == 3) mes "[Reyghema]";
+ if(@i == 3) mes "This will be the last one!";
+ if(@i == 3) mes "Let's compare after this.";
+ set @npchand[@i], rand(1, 3);
+ switch( select( "Scissors", "Rock", "Paper" ) ) {
+ case 1:
+ set @myhand[@i], 1;
+ if(@npchand[@i] == 3) set @shobu, @shobu + 1;
+ break;
+ case 2:
+ set @myhand[@i], 2;
+ if(@npchand[@i] == 1) set @shobu, @shobu + 1;
+ break;
+ case 3:
+ set @myhand[@i], 3;
+ if(@npchand[@i] == 2) set @shobu, @shobu + 1;
+ break;
+ }
+ }
+
+ if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
+
+ if(@shobu > 1) goto LV4_36_WIN;
+
+ switch ( rand(1 ,3) ) {
+ case 1:
+ delitem LV4_Gem1, 30;
+ break;
+ case 2:
+ delitem LV4_Gem2, 30;
+ break;
+ case 3:
+ delitem LV4_Gem3, 30;
+ break;
+ }
+ goto LV4_36_RESULT;
+
+LV4_36_WIN:
+ delitem LV4_Gem1, 30;
+ delitem LV4_Gem2, 30;
+ delitem LV4_Gem3, 30;
+ set lv4_weapon, lv4_weapon + 2;
+ goto LV4_36_RESULT;
+
+LV4_36_RESULT:
+ mes "[Reyghema]";
+ mes "Okay...I played in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@npchand[@i] == 1) mes "Scissors";
+ if(@npchand[@i] == 2) mes "Rock";
+ if(@npchand[@i] == 3) mes "Paper";
+ }
+
+ next;
+ mes "[Reyghema]";
+ mes "You did in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@myhand[@i] == 1) mes "Scissors";
+ if(@myhand[@i] == 2) mes "Rock";
+ if(@myhand[@i] == 3) mes "Paper";
+ }
+
+ next;
+
+ if(@shobu > 1) goto LV4_36_SAY_WIN;
+
+ mes "[Reyghema]";
+ mes "Well well well...you lost the game.";
+ mes "Ah~ you were close though...";
+ mes "We must drive away bad luck.";
+ next;
+ mes "[Reyghema]";
+ mes "Okay, I will wait here,";
+ mes "go bring me the materials again...";
+ close;
+
+LV4_36_SAY_WIN:
+ mes "[Reyghema]";
+ mes "Let's see...";
+ mes "You won total " + @shobu + " times.";
+ mes "Ah~ you must be really good at game!";
+ mes "Yes, your luck is at its highest!";
+ next;
+ mes "[Reyghema]";
+ mes "I am going to keep my promise.";
+ mes "But I need some time to prepare.";
+ mes "Give me the materials now and I will talk to you later.";
+ close;
+
+LV4_35:
+LV4_36_NOGEM:
+ mes "[Reyghema]";
+ mes "Not yet! I have not remembered it yet! Awwww...";
+ mes "This is killing me...";
+ mes "Oh, wait...I died already...";
+ mes "God damn it!";
+ close;
+
+
+LV4_38:
+LV4_39:
+ mes "[Reyghema]";
+ mes "..................";
+ next;
+ mes "[Reyghema]";
+ mes "...YES! It's a success!";
+ mes "I created the weapon that got me killed last time!";
+ mes "Look at this...haha! I died while making this!";
+ mes "... The name of the weapon is...";
+
+ switch( rand(1, 2) ) {
+ case 1:
+ if(lv4_weapon == 38) mes "Berserk! Weee~ Weee~ I made it!";
+ if(lv4_weapon == 38) getitem 1814 ,1; // 1814,Berserk
+ if(lv4_weapon == 39) mes "Tjungkuletti! Weee~ I made it!";
+ if(lv4_weapon == 39) getitem 1416, 1; // 1416,Tjungkuletti
+ break;
+ case 2:
+ if(lv4_weapon == 38) mes "Rudra's Bow! Weee~ I made it!";
+ if(lv4_weapon == 38) getitem 1720, 1; // 1720,Bow_of_Rudra
+ if(lv4_weapon == 39) mes "Brocca!";
+ if(lv4_weapon == 39) getitem 1415, 1; // 1415,Skewer
+ }
+
+ set lv4_weapon, 0;
+ next;
+ mes "[Reyghema]";
+ mes "...*sigh*.";
+ next;
+ mes "[Reyghema]";
+ mes "Happiness lasts too short...";
+ mes "As I am a dead man, I think I am not allowed";
+ mes "to keep the memory of past....";
+ mes "My memory is fading again...";
+ next;
+ mes "[Reyghema]";
+ mes "But thank you for letting me achieve";
+ mes "my long-cherished desire.";
+ mes "If we meet again, please let me";
+ mes "retrieve my memory of past again.";
+ mes "So I can try forging another weapon.";
+ next;
+ mes "[Reyghema]";
+ mes "Farewell, adventurer.";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Reyghema]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//--------------------------------------------------
+// Hein, creates Excalibur, Schweisersabel, Dragon Slayer and Edge
+//--------------------------------------------------
+
+niflheim.gat,187,280,3 script Hein 795, {
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- You are currently overweight. -";
+ mes "- Please lose some weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
+ mes "[Hein]";
+ mes "You should care about other people";
+ mes "more than yourself...";
+ mes "You are quite weak for an adventurer.";
+ close;
+
+
+LV4_LEVEL_PASS:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon < 40) goto LV4_39;
+ if(lv4_weapon == 40) goto LV4_40;
+ if(lv4_weapon == 41) goto LV4_41;
+ if(lv4_weapon == 42) goto LV4_42;
+ if(lv4_weapon == 43) goto LV4_43;
+ if(lv4_weapon == 44) goto LV4_44;
+ if(lv4_weapon == 45) goto LV4_45;
+ if(lv4_weapon == 46) goto LV4_46;
+ if(lv4_weapon == 47) goto LV4_47;
+ if(lv4_weapon == 48) goto LV4_48;
+ if(lv4_weapon > 48) goto LV4_49;
+ end; // shouldn't be here
+
+
+LV4_0:
+LV4_40:
+ mes "[Hein]";
+ mes "Ah...are you going to ask me something?";
+ mes "However, I am not accepting money";
+ mes "from my client. Because.";
+ mes "It brings me bad luck to...";
+ mes "...whaat? What did I just say?";
+ mes "Awww....I am confused.";
+ next;
+
+ if(lv4_weapon == 0) goto LV4_0_ASK;
+
+ mes "[Hein]";
+ mes "Why did I speak of money?";
+ mes "I am a dead man and dead people";
+ mes "do not need money...arf!";
+ mes "My head is hurting...I guess that";
+ mes "a dead man can have a headache!";
+ close;
+
+LV4_0_ASK:
+ switch( select( "Show interest.", "Igonore him." ) ) {
+ case 1:
+ mes "[Hein]";
+ mes "Why did I speak of money?";
+ mes "I am a dead man and dead people";
+ mes "do not need money...arf!";
+ mes "My head is hurting...I guess that";
+ mes "a dead man can have a headache!";
+ set lv4_weapon, 40;
+ close;
+ break;
+ case 2:
+ mes "- Because you decided to ignore him, -";
+ mes "- you are no longer able to hear him. -";
+ close;
+ break;
+ }
+ end;
+
+
+LV4_39:
+LV4_49:
+ mes "[Hein]";
+ mes "I feel something different from you.";
+ mes "Did you come here with a purpose?";
+ mes "I am envious of you...";
+ close;
+
+
+LV4_41:
+ mes "[Hein]";
+ mes "Ah...are you going to ask me something?";
+ mes "However, I am not accepting money";
+ mes "from my client. Because.";
+ mes "It brings me bad luck to...";
+ next;
+ set @dap3$, "to forge a good weapon.";
+ input @answer3$;
+ if(@answer3$ == @dap3$) goto LV4_41_CORRECT;
+ mes "[Hein]";
+ mes "...? What are you talking about?";
+ mes "What was I going to say?";
+ mes "Arf....my head is hurting...!";
+ close;
+
+LV4_41_CORRECT:
+ mes "[Hein]";
+ mes "That's right! It's bad luck!";
+ mes "Creating weapons is betting! And I am...I am?";
+ mes "Oh right...I forgot that. Yes, I am dead.";
+ mes "Ahahahahaha.";
+ set lv4_weapon, 42;
+ next;
+ mes "[Hein]";
+ mes "Well, I must be a lucky dead man";
+ mes "for remembering my past!";
+ mes "Hahahahaha!";
+ next;
+ mes "[Hein]";
+ mes "Perhaps God wants me to";
+ mes "continue my research...?";
+ mes "wait, let me ask you a favor.";
+ next;
+ mes "[Hein]";
+ mes "Can you bring me some materials";
+ mes "that I need for my research?";
+ mes "If I succeed in the research,";
+ mes "I will give you the result in return.";
+ next;
+ mes "[Hein]";
+ mes "You can take your time to think of my offer.";
+ mes "Please talk to me later.";
+ close;
+
+
+LV4_43:
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_43_BASE_MAT;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_43_BASE_MAT;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_43_BASE_MAT;
+ if(countitem($@LV4_Gold) < 20) goto LV4_43_BASE_MAT;
+
+ mes "[Hein]";
+ mes "Oh, you have brought the materials I asked.";
+ mes "Here's the thing. I cannot remember what I need other than those...";
+ mes "Aww....I need some more time to think of them...";
+ next;
+ mes "[Hein]";
+ mes "Please try to search what I need...if you can.";
+ mes "Of course, it will not be an easy job for you";
+ mes "to do so...but I know you have a body to move with your will...";
+ mes "It is still better than being a ghost like me...";
+ next;
+ mes "[Hein]";
+ mes "Please give me all the materials you have brought.";
+ mes "I will keep them for you.";
+
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
+ delitem $@LV4_Hammer_Of_Blacksmith, 2;
+ delitem $@LV4_Emperium_Anvil, 1;
+ delitem $@LV4_Illusion_Flower, 1;
+ delitem $@LV4_Gold, 20;
+ set lv4_weapon, 44;
+ close;
+
+LV4_42:
+LV4_43_BASE_MAT:
+ switch( lv4_weapon ) {
+ case 42:
+ mes "[Hein]";
+ mes "I will take you speaking to me again";
+ mes "as the approval of my request.";
+ mes "Thank you so much.";
+ next;
+ mes "[Hein]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ mes "Most likely they are the ones I need.";
+ next;
+ mes "[Hein]";
+ mes "And I do need 3 more things...";
+ mes "but I have a hard time remembering what they are.";
+ mes "That means that my memory of the past is not";
+ mes "absolutely back.";
+ next;
+ mes "[Hein]";
+ mes "*sigh*...I am so sorry to ask of you this...";
+ mes "but please search for what those 3 things are.";
+ mes "In the meantime, I will try to remember them.";
+ mes "Thank you.";
+ set lv4_weapon, 43;
+ break;
+ case 43:
+ mes "[Hein]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ mes "Most likely they are the ones I need.";
+ break;
+ }
+ close;
+
+
+LV4_45:
+LV4_46:
+ if(countitem(LV4_Gem1) < 30) goto LV4_45_NOGEM;
+ if(countitem(LV4_Gem2) < 30) goto LV4_45_NOGEM;
+ if(countitem(LV4_Gem3) < 30) goto LV4_45_NOGEM;
+ mes "[Hein]";
+ mes "...Um? The items that you brought to me seem";
+ mes "to be good materials for my creation...";
+ mes "Give them to me, I shall try first!";
+ next;
+ mes "[Hein]";
+ mes "Oh...I was right! How did you";
+ mes "know these are materials I need?";
+ mes "Great, give me a moment!";
+ next;
+ mes "[Hein]";
+ mes "...Wait, I must test your luck first.";
+ mes "Since I am not sure about the result,";
+ mes "we should trust to luck for the result of my creation.";
+ mes "You must have good luck...";
+ next;
+ mes "[Hein]";
+ mes "We are going to play 'Rock, Paper, Scissors'.";
+ mes "You must win at least 2 out of 3 times.";
+ mes "If you fail, you must leave a large amount";
+ mes "of one material you have brought.";
+ mes "It is for driving away your bad luck.";
+ next;
+ mes "[Hein]";
+ mes "I will give you a piece of paper.";
+ mes "You will write down one among 'Rock, Paper, or Scissors'.";
+ mes "I will do the same at the same time.";
+ mes "We will then compare each other's paper at the end.";
+ next;
+
+ set @shobu, 0;
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@i == 2) mes "[Hein]";
+ if(@i == 2) mes "Let's play the second one!";
+ if(@i == 3) mes "[Hein]";
+ if(@i == 3) mes "This will be the last one!";
+ if(@i == 3) mes "Let's compare after this.";
+ set @npchand[@i], rand(1, 3);
+ switch( select( "Scissors", "Rock", "Paper" ) ) {
+ case 1:
+ set @myhand[@i], 1;
+ if(@npchand[@i] == 3) set @shobu, @shobu + 1;
+ break;
+ case 2:
+ set @myhand[@i], 2;
+ if(@npchand[@i] == 1) set @shobu, @shobu + 1;
+ break;
+ case 3:
+ set @myhand[@i], 3;
+ if(@npchand[@i] == 2) set @shobu, @shobu + 1;
+ break;
+ }
+ }
+
+ if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
+
+ if(@shobu > 1) goto LV4_45_WIN;
+
+ switch ( rand(1 ,3) ) {
+ case 1:
+ delitem LV4_Gem1, 30;
+ break;
+ case 2:
+ delitem LV4_Gem2, 30;
+ break;
+ case 3:
+ delitem LV4_Gem3, 30;
+ break;
+ }
+ goto LV4_45_RESULT;
+
+LV4_45_WIN:
+ delitem LV4_Gem1, 30;
+ delitem LV4_Gem2, 30;
+ delitem LV4_Gem3, 30;
+ set lv4_weapon, lv4_weapon + 2;
+ goto LV4_45_RESULT;
+
+LV4_45_RESULT:
+ mes "[Hein]";
+ mes "Okay...I played in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@npchand[@i] == 1) mes "Scissors";
+ if(@npchand[@i] == 2) mes "Rock";
+ if(@npchand[@i] == 3) mes "Paper";
+ }
+
+ next;
+ mes "[Hein]";
+ mes "You did in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@myhand[@i] == 1) mes "Scissors";
+ if(@myhand[@i] == 2) mes "Rock";
+ if(@myhand[@i] == 3) mes "Paper";
+ }
+
+ next;
+
+ if(@shobu > 1) goto LV4_45_SAY_WIN;
+
+ mes "[Hein]";
+ mes "Well well well...you lost the game.";
+ mes "Ah~ you were close though...";
+ mes "We must drive away bad luck.";
+ next;
+ mes "[Hein]";
+ mes "Okay, I will wait here,";
+ mes "go bring me the materials again...";
+ close;
+
+LV4_45_SAY_WIN:
+ mes "[Hein]";
+ mes "Let's see...";
+ mes "You won total " + @shobu + " times.";
+ mes "Ah~ you must be really good at game!";
+ mes "Yes, your luck is at its highest!";
+ next;
+ mes "[Hein]";
+ mes "I am going to keep my promise.";
+ mes "But I need some time to prepare.";
+ mes "Give me the materials now and I will talk to you later.";
+ close;
+
+LV4_44:
+LV4_45_NOGEM:
+ mes "[Hein]";
+ mes "I am sorry but please give me more time to remember the materials...";
+ mes "I had really good memory when I was alive...";
+ mes "So I could even recite them right after I woke up...";
+ close;
+
+
+LV4_47:
+LV4_48:
+ mes "[Hein]";
+ mes "Oh, yes. I just finished the work.";
+ mes "Do you want to know the result? Okay...";
+ mes "Breathe deeply...before we check.";
+ mes "The result is...";
+ next;
+ mes "[Hein]";
+ mes "a Big Success! This is great!";
+ mes "I have not labored in vain!";
+ mes "Let's see the weapon...it is...";
+
+ switch( rand(1, 2) ) {
+ case 1:
+ if(lv4_weapon == 47) mes "Edge.";
+ if(lv4_weapon == 47) getitem 1132 ,1; // 1132,Edge
+ if(lv4_weapon == 48) mes "Dragon Slayer.";
+ if(lv4_weapon == 48) getitem 1166, 1; // 1166,Dragon_Slayer
+ break;
+ case 2:
+ if(lv4_weapon == 47) mes "Excalibur.";
+ if(lv4_weapon == 47) getitem 1137, 1; // 1137,Excalibur
+ if(lv4_weapon == 48) mes "Schweizersabel.";
+ if(lv4_weapon == 48) getitem 1167, 1; // 1167,Schweizersabel
+ }
+
+ set lv4_weapon, 0;
+ next;
+ mes "[Hein]";
+ mes "Well...this is it.";
+ mes "I feel my memory is fading again...";
+ mes "Hahaha...being dead is not good.";
+ next;
+ mes "[Hein]";
+ mes "Thank you for your help. And if you have";
+ mes "a chance to visit Nifflheim again,";
+ mes "please come back and retrieve my memory once more...";
+ next;
+ mes "[Hein]";
+ mes "Aaahhhh! I don't think I will";
+ mes "remember you next time...";
+ mes "Take care, adventurer...father, I made it...";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Hein]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
+
+//--------------------------------------------------
+// Waltboughst, creates Byeollungum, Exorciser(excercise), Combat Knife and Grand Cross
+//--------------------------------------------------
+
+niflheim.gat,331,72,3 script Waltboughst 795,{
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 3000) goto LV4_NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- You are currently overweight. -";
+ mes "- Please lose some weight -";
+ mes "- and try again. -";
+ close;
+
+
+LV4_NOT_OW:
+ if(BaseLevel >= 80) goto LV4_LEVEL_PASS;
+ mes "[Waltboughst]";
+ mes "...Hah!";
+ close;
+
+
+LV4_LEVEL_PASS:
+ if(lv4_weapon == 0) goto LV4_0;
+ if(lv4_weapon < 49) goto LV4_48;
+ if(lv4_weapon == 49) goto LV4_49;
+ if(lv4_weapon == 50) goto LV4_50;
+ if(lv4_weapon == 51) goto LV4_51;
+ if(lv4_weapon == 52) goto LV4_52;
+ if(lv4_weapon == 53) goto LV4_53;
+ if(lv4_weapon == 54) goto LV4_54;
+ if(lv4_weapon == 55) goto LV4_55;
+ if(lv4_weapon == 56) goto LV4_56;
+ if(lv4_weapon == 57) goto LV4_57;
+ if(lv4_weapon > 57) goto LV4_58;
+ end; // shouldn't be here
+
+
+LV4_0:
+LV4_49:
+ mes "[Waltboughst]";
+ mes "Ah~ it is so frustrating to be a dead man.";
+ mes "Because I cannot do anything without a body.";
+ mes "You know what my father used to say?";
+ mes "Trying best does not always";
+ mes "result in a success.";
+ mes "However...errr?";
+ next;
+
+ if(lv4_weapon == 0) goto LV4_0_ASK;
+
+ mes "[Waltboughst]";
+ mes "...What was my father's";
+ mes "quote? Why am I stuck in";
+ mes "here after death? Hey, you";
+ mes "Do you know anything about";
+ mes "Waltboughst when he was";
+ mes "alive?";
+ close;
+
+LV4_0_ASK:
+ switch( select( "Show interest.", "Igonore him." ) ) {
+ case 1:
+ mes "[Waltboughst]";
+ mes "...what did he say afterwards?";
+ mes "Speaking of which, why am I";
+ mes "so anxious to do something?";
+ mes "I am a dead man, and a dead man is not supposed to do anything!";
+ mes "Hey, do you know anything about me when I was alive?";
+ set lv4_weapon, 49;
+ close;
+ break;
+ case 2:
+ mes "- Because you decided to ignore him, -";
+ mes "- you are no longer able to hear him. -";
+ close;
+ break;
+ }
+ end;
+
+
+LV4_48:
+LV4_58:
+ mes "[Waltboughst]";
+ mes "I feel something different about you.";
+ mes "Did you come here with a purpose?";
+ mes "I am envious of you...";
+ close;
+
+
+LV4_50:
+ mes "[Waltboughst]";
+ mes "Ah~ it is so frustrating to be a dead man.";
+ mes "Because I cannot do anything without a body.";
+ mes "You know what my father used to say?";
+ mes "Trying best does not always";
+ mes "result in a success.";
+ mes "However...";
+ next;
+ set @dap4$, "All the successful men in the history tried their best!";
+ input @answer4$;
+ if(@answer4$ == @dap4$) goto LV4_50_CORRECT;
+ mes "[Waltboughst]";
+ mes "...What? What did you just say?";
+ mes "Hmmm.";
+ close;
+
+LV4_50_CORRECT:
+ mes "[Waltboughst]";
+ mes "Yes! That was it!";
+ mes "Since I am dead, I cannot even try!";
+ mes "Eh...?! Ah!";
+ mes "I see, I see now.";
+ mes "I must have been killed by some kind of accident!";
+ set lv4_weapon, 51;
+ next;
+ mes "[Waltboughst]";
+ mes "Okay, I am not going to end this way.";
+ mes "Hey, you were meant to meet me!";
+ mes "You got to do me a favor, now!";
+ next;
+ mes "[Waltboughst]";
+ mes "I will give you the result of my research";
+ mes "in return! All I want is to compete my research,";
+ mes "not the result.";
+ next;
+ mes "[Waltboughst]";
+ mes "Well, give me some time to remember";
+ mes "what I need for my research.";
+ mes "I will talk to you later.";
+ close;
+
+
+LV4_52:
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_52_BASE_MAT;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_52_BASE_MAT;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_52_BASE_MAT;
+ if(countitem($@LV4_Gold) < 20) goto LV4_52_BASE_MAT;
+
+ mes "[Waltboughst]";
+ mes "Oh...you brought everything I need!";
+ mes "You were quick this time...I am still having";
+ mes "a hard time remembering what I need other than those.";
+ mes "This is not good, this is not good at all.";
+ next;
+ mes "[Waltboughst]";
+ mes "Anyways, I will keep those materials for you.";
+ mes "And give me some more times to";
+ mes "remember what I need...arph!";
+
+ if(countitem($@LV4_Hammer_Of_Blacksmith) < 2) goto LV4_HACK;
+ if(countitem($@LV4_Emperium_Anvil) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Illusion_Flower) < 1) goto LV4_HACK;
+ if(countitem($@LV4_Gold) < 20) goto LV4_HACK;
+ delitem $@LV4_Hammer_Of_Blacksmith, 2;
+ delitem $@LV4_Emperium_Anvil, 1;
+ delitem $@LV4_Illusion_Flower, 1;
+ delitem $@LV4_Gold, 20;
+ set lv4_weapon, 53;
+ close;
+
+LV4_51:
+LV4_52_BASE_MAT:
+ switch( lv4_weapon ) {
+ case 51:
+ mes "[Waltboughst]";
+ mes "Umm, you came back so early.";
+ mes "I just remembered the materials.";
+ next;
+ mes "[Waltboughst]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ next;
+ mes "[Waltboughst]";
+ mes "I do need some other items...but I need some time";
+ mes "to remember those. Oh well,";
+ mes "we have enough time, so let me think of them.";
+ set lv4_weapon, 52;
+ break;
+ case 52:
+ mes "[Waltboughst]";
+ mes "I need 2 Hammer of Blacksmith,";
+ mes "1 Emperium Anvil, 1 Illusion Flower and 20 Gold...";
+ mes "Most likey they will be the ones I need...";
+ break;
+ }
+ close;
+
+
+LV4_54:
+LV4_55:
+ if(countitem(LV4_Gem1) < 30) goto LV4_54_NOGEM;
+ if(countitem(LV4_Gem2) < 30) goto LV4_54_NOGEM;
+ if(countitem(LV4_Gem3) < 30) goto LV4_54_NOGEM;
+ mes "[Waltboughst]";
+ mes "...Um? The items that you brought to me seem";
+ mes "to be good materials for my creation...";
+ mes "Give them to me, I shall try first!";
+ next;
+ mes "[Waltboughst]";
+ mes "Oh...I was right! How did you";
+ mes "know these are materials I need?";
+ mes "Great, give me a moment!";
+ next;
+ mes "[Waltboughst]";
+ mes "...wait, I must test your luck first.";
+ mes "Since I am not sure about the result,";
+ mes "we should trust to luck for the result of my creation.";
+ mes "You must have good luck...";
+ next;
+ mes "[Waltboughst]";
+ mes "We are going to play 'Rock, Paper, Scissors'.";
+ mes "You must win at least 2 out of 3 times.";
+ mes "If you fail, you must leave a large amount";
+ mes "of one material you have brought.";
+ mes "It is for driving away your bad luck.";
+ next;
+ mes "[Waltboughst]";
+ mes "I will give you a piece of paper.";
+ mes "You will write down one among 'Rock, Paper, or Scissors'.";
+ mes "I will do the same at the same time.";
+ mes "We will then compare each other's paper at the end.";
+ next;
+
+ set @shobu, 0;
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@i == 2) mes "[Waltboughst]";
+ if(@i == 2) mes "Let's play the second one!";
+ if(@i == 3) mes "[Waltboughst]";
+ if(@i == 3) mes "This will be the last one!";
+ if(@i == 3) mes "Let's compare after this.";
+ set @npchand[@i], rand(1, 3);
+ switch( select( "Scissors", "Rock", "Paper" ) ) {
+ case 1:
+ set @myhand[@i], 1;
+ if(@npchand[@i] == 3) set @shobu, @shobu + 1;
+ break;
+ case 2:
+ set @myhand[@i], 2;
+ if(@npchand[@i] == 1) set @shobu, @shobu + 1;
+ break;
+ case 3:
+ set @myhand[@i], 3;
+ if(@npchand[@i] == 2) set @shobu, @shobu + 1;
+ break;
+ }
+ }
+
+ if(countitem(LV4_Gem1) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem2) < 30) goto LV4_HACK;
+ if(countitem(LV4_Gem3) < 30) goto LV4_HACK;
+
+ if(@shobu > 1) goto LV4_54_WIN;
+
+ switch ( rand(1 ,3) ) {
+ case 1:
+ delitem LV4_Gem1, 30;
+ break;
+ case 2:
+ delitem LV4_Gem2, 30;
+ break;
+ case 3:
+ delitem LV4_Gem3, 30;
+ break;
+ }
+ goto LV4_54_RESULT;
+
+LV4_54_WIN:
+ delitem LV4_Gem1, 30;
+ delitem LV4_Gem2, 30;
+ delitem LV4_Gem3, 30;
+ set lv4_weapon, lv4_weapon + 2;
+ goto LV4_54_RESULT;
+
+LV4_54_RESULT:
+ mes "[Waltboughst]";
+ mes "Okay...I played in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@npchand[@i] == 1) mes "Scissors";
+ if(@npchand[@i] == 2) mes "Rock";
+ if(@npchand[@i] == 3) mes "Paper";
+ }
+
+ next;
+ mes "[Waltboughst]";
+ mes "You did in the order of...";
+
+ for( set @i, 1; @i <= 3; set @i, @i + 1 ) {
+ if(@myhand[@i] == 1) mes "Scissors";
+ if(@myhand[@i] == 2) mes "Rock";
+ if(@myhand[@i] == 3) mes "Paper";
+ }
+
+ next;
+
+ if(@shobu > 1) goto LV4_54_SAY_WIN;
+
+ mes "[Waltboughst]";
+ mes "Well well well...you lost the game.";
+ mes "Ah~ you were close though...";
+ mes "We must drive away bad luck.";
+ next;
+ mes "[Waltboughst]";
+ mes "Okay, I will wait here,";
+ mes "go bring me the materials again...";
+ close;
+
+LV4_54_SAY_WIN:
+ mes "[Waltboughst]";
+ mes "Let's see...";
+ mes "You won total " + @shobu + " times.";
+ mes "Ah~ you must be really good at game!";
+ mes "Yes, your luck is at its highest!";
+ next;
+ mes "[Waltboughst]";
+ mes "I am going to keep my promise.";
+ mes "But I need some time to prepare.";
+ mes "Give me the materials now and I will talk to you later.";
+ close;
+
+LV4_53:
+LV4_54_NOGEM:
+ mes "[Waltboughst]";
+ mes "Arph...I haven't remembered them yet.";
+ mes "Awww....this is a problem.";
+ mes "I must think of them as soon as possible...";
+ close;
+
+
+LV4_56:
+LV4_57:
+ mes "[Waltboughst]";
+ mes "Hehe, I made something with the materials";
+ mes "in this short time! Wanna see?";
+ mes "Aren't you wondering about the result?";
+ mes "Hmmm....let's see...";
+ next;
+ mes "[Waltboughst]";
+ mes "Waltboughst never fails!";
+ mes "Besides you had good luck,";
+ mes "so it resulted in a perfect success!";
+ mes "You got a nice weapon here, it is...";
+
+ switch( rand(1, 2) ) {
+ case 1:
+ if(lv4_weapon == 56) mes "Byeollungum!";
+ if(lv4_weapon == 56) getitem 1140 ,1; // 1140,Byeollungum
+ if(lv4_weapon == 57) mes "Exorciser!";
+ if(lv4_weapon == 57) getitem 1233, 1; // 1233,Exercise
+ break;
+ case 2:
+ if(lv4_weapon == 56) mes "Combat Knife!";
+ if(lv4_weapon == 56) getitem 1228, 1; // 1228,Combat_Knife
+ if(lv4_weapon == 57) mes "Grand Cross!!";
+ if(lv4_weapon == 57) getitem 1528, 1; // 1528,Grand_Cross
+ }
+
+ set lv4_weapon, 0;
+ next;
+ mes "[Waltboughst]";
+ mes "I am genius! Hahahaha!";
+ mes "I made it when my brothers could not!";
+ mes "Muhahahahahaha!";
+ mes "Eh...err? Arrr...phhh?";
+ next;
+ mes "[Waltboughst]";
+ mes "Damn...I must try too hard.";
+ mes "My memory is fading again...";
+ mes "Oh well, somehow I proved";
+ mes "that I am a genius even after I died.";
+ next;
+ mes "[Waltboughst]";
+ mes "If you want me to display my genius again,";
+ mes "come retrieve my memory again.";
+ mes "And thank you!";
+ next;
+ mes "[Waltboughst]";
+ mes "Ah...my memory's dying again...";
+ mes "Farewell~ I don't think I will remember you";
+ mes "but I hope you will remember me as Waltboughst";
+ mes "the genius in the age!";
+ close;
+
+
+
+//--------------------------------------------------
+//Hack Attempt
+//--------------------------------------------------
+LV4_HACK:
+ mes "[Waltboughst]";
+ mes "Hmm. There seems to be a bit of problem.";
+ set lv4_weapon, 0;
+ logmes "[" +strcharinfo(0) + "] tried to hack LV4 quest.";
+ close;
+}
diff --git a/npc/quests/WIP/4.txt b/npc/quests/WIP/4.txt
index bfe241c31..0f3a31f29 100644
--- a/npc/quests/WIP/4.txt
+++ b/npc/quests/WIP/4.txt
@@ -1,123 +1,123 @@
-airplane.gat,236,63,4 script Hallen 55,{
- if (fragmentauest>3) {
- mes "[Hallen]";
- mes "Nice weather, isnt it?";
- close;
- }
- if (fragmentauest==2) {
- if (girls==1) {
- mes "[Hallen]";
- mes "Have you finished that trip??";
- close;
- }
- mes "[Hallen]";
- mes "Oh, thx hero!Do you like my girls? She's reallybeatiful. Maybe you";
- mes "shall become her boyfriend?";
- next;
- mes "[Hallen]";
- mes " Its a joke ^_- Never mind.";
- mes "And you know, there is one thing im really ineterested in....";
- next;
- if (airshipquest != 5) {
- mes "[Hallen]";
- mes "You should better ask captain about the airship";
- mes "You cant understand me if you dont do that...";
- close;
- };
- mes "You see its about the airship works. Heart of Ymir...";
- mes "Very interesting thing i think...";
- getitem 501,1;
- set girls,1;
- next;
- mes "[Hallen]";
- mes "I really want to know something about it.. if somebody could help me...";
- mes "pity I cant go to einbroch Laboratory...";
- mes "never mind it just my feelings. Thanks for help..";
- next;
- if (select("I can do it for you:Sup, guy..") == 1) {
- mes "[Hallen]";
- mes "Really??? Thx. I will wait for you";
- } else {
- mes "Hallen";
- mes "Well, Thanks afterall.";
- }
- close;
- }
- if (fragmentauest==3) {
- mes "[Hallen]";
- mes "Thanks to you now i got it.. What is that Heart of Ymir..";
- close2;
- getexp 700,400;
- set fragmentauest,4;
- end;
- }
- mes "[Hallen]";
- mes "Hello, "+strcharinfo(0)+". Nice to see you on ship.";
- mes "Hows your trips? I suppose you have lots of to tell";
- mes "your children about";
- disablenpc "Ferlok";
- next;
- menu "Ye.. I have lots of tales..",-,"Nothing really interesting",l_inter,"Have any work for me?",l_work;
- mes "[Hallen]";
- mes "Ye.. I would like to listen to them too...";
- mes "But not now. I have some work to do";
- close;
- l_inter:
- mes "[Hallen]";
- mes "You are really shy to tell us. ^_- It doesnt matter";
- mes "we all know about your doings.";
- mes "Glad to see such a hero i can say";
- close;
- l_work:
- mes "[Hallen]";
- mes "Hm.. let me see... Ye. Its not so important, but if you have some";
- mes "free time, can you deliver the letter to my cousin Kaci?";
- next;
- if (select("yes, of course:no, sory") == 1) {
- mes "[Hallen]";
- mes "She can be found near gaming tables under deck. Thank you";
- getitem 7148,1;
- set fragmentauest,1;
- } else {
- mes "[Hallen]";
- mes "Its a pity. Good luck in training";
- }
- close;
-}
-//=====================================================================
-ein_in01,261,37,4 script #reader 111,4,4,{
-OnTouch:
-mes "[Code reader]";
- mes "Enter a valid 3 dig code to get information";
- mes "You can do it 3 times only. Be careful";
- next;
- set @number, rand(100,999);
- set @count, 0;
-l_input:
- input @input;
- if (@input != @number) {
- mes "[Code reader]";
- mes "you enter not valid digital";
- set @count,@count+1;
- next;
- if (@count < 3) goto l_input;
- mes "[Code reader]";
- mes "You have not enter code correct";
- close;
- }
- mes "[Card reader]";
- mes "It seems to you that you find the information. You try to learn it";
- next;
- enablenpc "Ferlok";
- mes "[Hallen]";
- mes "Please leave this plce. I will meet you on airplane";
- set fragmentauset,3;
- close;
- }
-}
-//===========================================================================
-ein_in01,255,33,4 script Ferlok 55,{
- mes "[Hallen]";
- mes "I have already told you to go to plane. Hurry!";
- close;
+airplane.gat,236,63,4 script Hallen 55,{
+ if (fragmentauest>3) {
+ mes "[Hallen]";
+ mes "Nice weather, isnt it?";
+ close;
+ }
+ if (fragmentauest==2) {
+ if (girls==1) {
+ mes "[Hallen]";
+ mes "Have you finished that trip??";
+ close;
+ }
+ mes "[Hallen]";
+ mes "Oh, thx hero!Do you like my girls? She's reallybeatiful. Maybe you";
+ mes "shall become her boyfriend?";
+ next;
+ mes "[Hallen]";
+ mes " Its a joke ^_- Never mind.";
+ mes "And you know, there is one thing im really ineterested in....";
+ next;
+ if (airshipquest != 5) {
+ mes "[Hallen]";
+ mes "You should better ask captain about the airship";
+ mes "You cant understand me if you dont do that...";
+ close;
+ };
+ mes "You see its about the airship works. Heart of Ymir...";
+ mes "Very interesting thing i think...";
+ getitem 501,1;
+ set girls,1;
+ next;
+ mes "[Hallen]";
+ mes "I really want to know something about it.. if somebody could help me...";
+ mes "pity I cant go to einbroch Laboratory...";
+ mes "never mind it just my feelings. Thanks for help..";
+ next;
+ if (select("I can do it for you:Sup, guy..") == 1) {
+ mes "[Hallen]";
+ mes "Really??? Thx. I will wait for you";
+ } else {
+ mes "Hallen";
+ mes "Well, Thanks afterall.";
+ }
+ close;
+ }
+ if (fragmentauest==3) {
+ mes "[Hallen]";
+ mes "Thanks to you now i got it.. What is that Heart of Ymir..";
+ close2;
+ getexp 700,400;
+ set fragmentauest,4;
+ end;
+ }
+ mes "[Hallen]";
+ mes "Hello, "+strcharinfo(0)+". Nice to see you on ship.";
+ mes "Hows your trips? I suppose you have lots of to tell";
+ mes "your children about";
+ disablenpc "Ferlok";
+ next;
+ menu "Ye.. I have lots of tales..",-,"Nothing really interesting",l_inter,"Have any work for me?",l_work;
+ mes "[Hallen]";
+ mes "Ye.. I would like to listen to them too...";
+ mes "But not now. I have some work to do";
+ close;
+ l_inter:
+ mes "[Hallen]";
+ mes "You are really shy to tell us. ^_- It doesnt matter";
+ mes "we all know about your doings.";
+ mes "Glad to see such a hero i can say";
+ close;
+ l_work:
+ mes "[Hallen]";
+ mes "Hm.. let me see... Ye. Its not so important, but if you have some";
+ mes "free time, can you deliver the letter to my cousin Kaci?";
+ next;
+ if (select("yes, of course:no, sory") == 1) {
+ mes "[Hallen]";
+ mes "She can be found near gaming tables under deck. Thank you";
+ getitem 7148,1;
+ set fragmentauest,1;
+ } else {
+ mes "[Hallen]";
+ mes "Its a pity. Good luck in training";
+ }
+ close;
+}
+//=====================================================================
+ein_in01,261,37,4 script #reader 111,4,4,{
+OnTouch:
+mes "[Code reader]";
+ mes "Enter a valid 3 dig code to get information";
+ mes "You can do it 3 times only. Be careful";
+ next;
+ set @number, rand(100,999);
+ set @count, 0;
+l_input:
+ input @input;
+ if (@input != @number) {
+ mes "[Code reader]";
+ mes "you enter not valid digital";
+ set @count,@count+1;
+ next;
+ if (@count < 3) goto l_input;
+ mes "[Code reader]";
+ mes "You have not enter code correct";
+ close;
+ }
+ mes "[Card reader]";
+ mes "It seems to you that you find the information. You try to learn it";
+ next;
+ enablenpc "Ferlok";
+ mes "[Hallen]";
+ mes "Please leave this plce. I will meet you on airplane";
+ set fragmentauset,3;
+ close;
+ }
+}
+//===========================================================================
+ein_in01,255,33,4 script Ferlok 55,{
+ mes "[Hallen]";
+ mes "I have already told you to go to plane. Hurry!";
+ close;
s} \ No newline at end of file
diff --git a/npc/quests/WIP/6.txt b/npc/quests/WIP/6.txt
index 46a856da2..c4954b6dc 100644
--- a/npc/quests/WIP/6.txt
+++ b/npc/quests/WIP/6.txt
@@ -1,127 +1,127 @@
// by CallNix v.0.0
-//======================================Juno to Izlude airship=====================================================================
-airplane_01.gat,238,154,4 script Captain 854,{
-if (airshipquest==0) {
-mes "[Fayroll]";
-mes "I have nothing to say to you anymore";
-close;
-}
-
-if (airshipquest==3) {
-mes "[Fayroll]";
-mes "Oh, you have finished that work. Great. Now i shall read this letter.";
-mes "Dont interrupt me please";
-delitem 7276,1;
-set airshipquest,4;
-//addtimer 30000,"Captain::OnFinish"; Âîçìîæíî ñäåëàòü òàê. Íî òóò ïî òàéìåðó, à íå ïî êëèêàì íà ÍÏÖ
-close;
-}
-
-if (airshipquest==4) {
-set @k,rand(4);
-if (@k == 2) goto OnFinish;
-mes "[Fayroll]";
-mes "I had not finished the letter yet";
-close;
-}
-
-mes "[Fayroll]";
-mes "Hello, "+strcharinfo(0)+". Nice to see you";
-mes "Anything want from me?";
-next;
-if (select("yes,about airships:no, nothing") == 1) {
- mes "[Fayroll]";
- mes "So i think you want to know how airship works";
- mes "This is the top secret that only a captain will know. Anyway, if you're willing ti help me, I will let you know.";
- next;
- menu "I will help you. But what must I do?",-,"No, sorry, I have no time for this.",L_SORRY;
- mes "[Fayroll]";
- mes " You see, I have a brother. He is also a captain of airplane in Juno to Lighthalzen airship.";
- mes "As we are on different ships, i cant communicate with him. Yor is to deliver this letter to him.";
- mes "If you will do this, I shall tell you the secret.";
- getitem 7276,1; //Tarloks letter. Íå íàøåë â áàçå
- set airshipquest,1;
-} else {
- mes "[Fayroll]";
- mes "Then dont interrupt me. I have alot of work to do.";
- mes "Go to the Casino on ship. And spen some time there";
-}
-close;
-
-L_SORRY:
-mes "[Fayroll]";
-mes "Ye this is bad, but i cant insist on it. Follow your way";
-mes "See you the other day.";
-close;
-
-OnFinish:
-mes "[Fayroll]";
-mes "Whoo... I finally got it.Now i shall tell you the secret.";
-next;
-mes "[Fayroll]";
-mes "The cocept of the flight of airship";
-mes "is the energy produced from the boiler wich push the propeller";
-mes "that moves the giant beauty. Do you understand now?";
-next;
-menu "Is That all???",-;
-mes "[Fayroll]";
-mes "You cant lift this thing up only with steam.";
-mes "thats why the machien ^5566FF'Enchancer'^000000 is used";
-mes "It is working on Heart of Ymir. Thats all the secret. Now go.";
-set airshipquest,0;
-getexp 200000,10000;
-close;
-}
-//=======================================Juno to Lighthalzen airship====================================================================
-airplane.gat,236,163,4 script Aiplane Captain 855,{
-if (airshipquest == 1) goto L_QUEST;
-if (airshipquest == 2) goto L_FINISH;
-mes "[Dulu]";
-mes "Welcome on the board of ourship. Guess you will have lots of time here";
-close;
-
-L_QUEST:
-mes "[Dulu]";
-mes "Hello, stranger. I am the Airplane Captain of this ship.";
-mes "If you have any problems with our stuff you can simply tell me about this.";
-next;
-if (select("I have letter for you:hmm.. sorry") == 1) {
- mes "[Dulu]";
- mes "You have letter for me?? Really??";
- delitem 7276,1;
- mes "WOHHOOO! Its from my brother. Thx alot, stranger..";
- mes "You see, he has borrowed something from me long ago. But unfortunatly he had lost it";
- mes "and this reallly bed for you...";
- next;
- mes "*Dulu shows you a letter*";
- mes "^5566FF'The one who send you the letter will find it for me. Don't reply to me if he refuses to do so'^000000";
- next;
- mes "[Dulu]";
- mes "So when you accept that work you accept doing this me. Now i shall tell you your work";
- next;
- mes "[Dulu]";
- mes "My brother had lost 2 Will of Darkness and 2 Prickly Fruits";
- mes "They can simply be dropped on the deck of the ship. Monsters often atack ships. Get this items for me from them.";
- mes "Now monster are going to atack Juno to Izlude airship. Go there and get what i need";
- set airshipquest,2;
- } else {
- mes "[Dulu]";
- mes "Well, you know where to find me. See you later";
-}
-close;
-
-L_FINISH:
-if (countitem(7340)<2 && countitem(576)<2) {
-mes "[Dulu]";
-mes "You havent geather items yet";
-close;
-}
-mes "[Dulu]";
-mes "Great work i can say";
-delitem 7340,2;
-delitem 576,2;
-getitem 7276,1;
-set airshipquest,3;
-close;
+//======================================Juno to Izlude airship=====================================================================
+airplane_01.gat,238,154,4 script Captain 854,{
+if (airshipquest==0) {
+mes "[Fayroll]";
+mes "I have nothing to say to you anymore";
+close;
+}
+
+if (airshipquest==3) {
+mes "[Fayroll]";
+mes "Oh, you have finished that work. Great. Now i shall read this letter.";
+mes "Dont interrupt me please";
+delitem 7276,1;
+set airshipquest,4;
+//addtimer 30000,"Captain::OnFinish"; Âîçìîæíî ñäåëàòü òàê. Íî òóò ïî òàéìåðó, à íå ïî êëèêàì íà ÍÏÖ
+close;
+}
+
+if (airshipquest==4) {
+set @k,rand(4);
+if (@k == 2) goto OnFinish;
+mes "[Fayroll]";
+mes "I had not finished the letter yet";
+close;
+}
+
+mes "[Fayroll]";
+mes "Hello, "+strcharinfo(0)+". Nice to see you";
+mes "Anything want from me?";
+next;
+if (select("yes,about airships:no, nothing") == 1) {
+ mes "[Fayroll]";
+ mes "So i think you want to know how airship works";
+ mes "This is the top secret that only a captain will know. Anyway, if you're willing ti help me, I will let you know.";
+ next;
+ menu "I will help you. But what must I do?",-,"No, sorry, I have no time for this.",L_SORRY;
+ mes "[Fayroll]";
+ mes " You see, I have a brother. He is also a captain of airplane in Juno to Lighthalzen airship.";
+ mes "As we are on different ships, i cant communicate with him. Yor is to deliver this letter to him.";
+ mes "If you will do this, I shall tell you the secret.";
+ getitem 7276,1; //Tarloks letter. Íå íàøåë â áàçå
+ set airshipquest,1;
+} else {
+ mes "[Fayroll]";
+ mes "Then dont interrupt me. I have alot of work to do.";
+ mes "Go to the Casino on ship. And spen some time there";
+}
+close;
+
+L_SORRY:
+mes "[Fayroll]";
+mes "Ye this is bad, but i cant insist on it. Follow your way";
+mes "See you the other day.";
+close;
+
+OnFinish:
+mes "[Fayroll]";
+mes "Whoo... I finally got it.Now i shall tell you the secret.";
+next;
+mes "[Fayroll]";
+mes "The cocept of the flight of airship";
+mes "is the energy produced from the boiler wich push the propeller";
+mes "that moves the giant beauty. Do you understand now?";
+next;
+menu "Is That all???",-;
+mes "[Fayroll]";
+mes "You cant lift this thing up only with steam.";
+mes "thats why the machien ^5566FF'Enchancer'^000000 is used";
+mes "It is working on Heart of Ymir. Thats all the secret. Now go.";
+set airshipquest,0;
+getexp 200000,10000;
+close;
+}
+//=======================================Juno to Lighthalzen airship====================================================================
+airplane.gat,236,163,4 script Aiplane Captain 855,{
+if (airshipquest == 1) goto L_QUEST;
+if (airshipquest == 2) goto L_FINISH;
+mes "[Dulu]";
+mes "Welcome on the board of ourship. Guess you will have lots of time here";
+close;
+
+L_QUEST:
+mes "[Dulu]";
+mes "Hello, stranger. I am the Airplane Captain of this ship.";
+mes "If you have any problems with our stuff you can simply tell me about this.";
+next;
+if (select("I have letter for you:hmm.. sorry") == 1) {
+ mes "[Dulu]";
+ mes "You have letter for me?? Really??";
+ delitem 7276,1;
+ mes "WOHHOOO! Its from my brother. Thx alot, stranger..";
+ mes "You see, he has borrowed something from me long ago. But unfortunatly he had lost it";
+ mes "and this reallly bed for you...";
+ next;
+ mes "*Dulu shows you a letter*";
+ mes "^5566FF'The one who send you the letter will find it for me. Don't reply to me if he refuses to do so'^000000";
+ next;
+ mes "[Dulu]";
+ mes "So when you accept that work you accept doing this me. Now i shall tell you your work";
+ next;
+ mes "[Dulu]";
+ mes "My brother had lost 2 Will of Darkness and 2 Prickly Fruits";
+ mes "They can simply be dropped on the deck of the ship. Monsters often atack ships. Get this items for me from them.";
+ mes "Now monster are going to atack Juno to Izlude airship. Go there and get what i need";
+ set airshipquest,2;
+ } else {
+ mes "[Dulu]";
+ mes "Well, you know where to find me. See you later";
+}
+close;
+
+L_FINISH:
+if (countitem(7340)<2 && countitem(576)<2) {
+mes "[Dulu]";
+mes "You havent geather items yet";
+close;
+}
+mes "[Dulu]";
+mes "Great work i can say";
+delitem 7340,2;
+delitem 576,2;
+getitem 7276,1;
+set airshipquest,3;
+close;
} \ No newline at end of file
diff --git a/npc/quests/WIP/airships.txt b/npc/quests/WIP/airships.txt
index b6284bcbd..60930f7d2 100644
--- a/npc/quests/WIP/airships.txt
+++ b/npc/quests/WIP/airships.txt
@@ -1,1138 +1,1138 @@
-//===== eAthena Script =======================================
-//= The Airship System Script
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 0.5c
-//===== Compatible With: =====================================
-//= eAthena SVN 3422+(Requires jA Script System)
-//===== Description: =========================================
-//= The Airship System used in the official servers, however this
-//= one is still about 25% custom and is missing some npcs.
-//===== Additional Comments: =================================
-//= 0.1 Added first version, it might be a little buggy [MasterOfMuppets]
-//= 0.1a Fixed the Airport Staff#Iz which was [MasterOfMuppets]
-//= warping you to the same location as Airport Staff#Ein
-//= 0.2 Implemented some more airship NPCs, more are to come.
-//= 0.3 Implemented some more NPCs [MasterOfMuppets]
-//= 0.4 Implemented two mini games scripted by Dj-Yhn [MasterOfMuppets]
-//= 0.5 Removed Duplicates [Silent]
-//= 0.5aFixed a typo [Evera] 0.5b Fixed appledice bugs [Lupus]
-//============================================================
-
-//============================================================
-//= The Airship System (Yuno -> Hugel -> Einbroch -> Lighthalzen -> repeat)
-//============================================================
-
-airplane.gat,243,74,4 script #AirshipWarp-1 45,2,2{
-OnTouch:
- if($@airplanelocation == 1)warp "einbroch.gat",90,275;
- if($@airplanelocation == 2)warp "yuno.gat",85,265;
- if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
- if($@airplanelocation == 4)warp "hugel.gat",182,150;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane.gat,243,29,4 script #AirshipWarp-2 45,2,2{
-OnTouch:
- if($@airplanelocation == 1)warp "einbroch.gat",90,275;
- if($@airplanelocation == 2)warp "yuno.gat",85,265;
- if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
- if($@airplanelocation == 4)warp "hugel.gat",182,150;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane.gat,1,1,0 script EinYuno_Airship -1,{
-OnInit:
-while(1)
-{
- initnpctimer;
- setnpctimer 0;
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Hugel.",1,0xBA55D3;
- end;
-OnTimer15000:
- mapannounce "airplane.gat","We are heading to Hugel.",1,0xBA55D3;
- end;
-OnTimer30000:
- mapannounce "airplane.gat","We will arrive in Hugel shortly.",1,0xBA55D3;
- end;
-OnTimer45000:
- set $@airplanelocation,4;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Hugel. Have a safe trip.",1,0xBA55D3;
- end;
-OnTimer55000:
- mapannounce "airplane.gat","Currently, we are in Hugel. The Airship will leave shortly.",1,0xBA55D3;
- end;
-OnTimer65000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Einbroch.",1,0x00FF00;
- end;
-OnTimer80000:
- mapannounce "airplane.gat","We are heading to Einbroch.",1,0x00FF00;
- end;
-OnTimer95000:
- mapannounce "airplane.gat","We will arrive in Einbroch shortly.",1,0x00FF00;
- end;
-OnTimer110000:
- set $@airplanelocation,1;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Einbroch. Have a safe trip.",1,0x00FF00;
- end;
-OnTimer120000:
- mapannounce "airplane.gat","Currently, we are in Einbroch. The Airship will take off shortly.",1,0x00FF00;
- end;
-OnTimer130000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Lighthalzen.",1,0xFF8600;
- end;
-OnTimer145000:
- mapannounce "airplane.gat","We are heading to Lighthalzen.",1,0xFF8600;
- end;
-OnTimer160000:
- mapannounce "airplane.gat","We will arrive in Lighthalzen shortly.",1,0xFF8600;
- end;
-OnTimer175000:
- set $@airplanelocation,3;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Lighthalzen. Have a safe trip.",1,0xFF8600;
- end;
-OnTimer185000:
- mapannounce "airplane.gat","Currently, we are in Lighthalzen. The Airship will leave shortly.",1,0xFF8600;
- end;
-OnTimer195000:
- set $@airplanelocation,0;
- donpcevent "#AirshipWarp-1::OnHide";
- donpcevent "#AirshipWarp-2::OnHide";
- disablenpc "#AirshipWarp-1";
- disablenpc "#AirshipWarp-2";
- mapannounce "airplane.gat","The Airship is now taking off. Our next destination is Yuno.",1,0x70DBDB;
- end;
-OnTimer210000:
- mapannounce "airplane.gat","We are heading to Yuno.",1,0x70DBDB;
- end;
-OnTimer225000:
- mapannounce "airplane.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
- end;
-OnTimer240000:
- set $@airplanelocation,2;
- enablenpc "#AirshipWarp-1";
- enablenpc "#AirshipWarp-2";
- donpcevent "#AirshipWarp-1::OnUnhide";
- donpcevent "#AirshipWarp-2::OnUnhide";
- mapannounce "airplane.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
- end;
-OnTimer250000:
- mapannounce "airplane.gat","Currently, we are in Yuno. The Airship will leave shortly.",1,0x70DBDB;
- end;
-OnTimer260000:
- stoptimer;
-}
-}
-
-//C4644E
-
-//============================================================
-//= Some normal NPCS (airplane.gat)
-//============================================================
-
-airplane.gat,240,64,5 script Exit#01::Exit2 857,{
-
-end;
-
-}
-
-airplane.gat,247,64,5 duplicate(Exit2) Exit#02 857
-
-airplane.gat,240,39,1 duplicate(Exit2) Exit#03 857
-
-airplane.gat,247,39,1 duplicate(Exit2) Exit#04 857
-
-airplane.gat,100,69,2 script Airship Crew#01::Airship Crew 852,{
-
- mes "[Airship Crew]";
- mes "If we've landed at";
- mes "your destination and";
- mes "you'd like to leave the";
- mes "Airship, please use the";
- mes "stairs up ahead. Thank";
- mes "you for you patronage.";
- close;
-
-}
-
-airplane.gat,250,59,3 script Airship Staff::AirshipInfo 67,{
-
- mes "[Airship Staff]";
- mes "Welcome";
- mes "to the Airship.";
- mes "How may I help you?";
- next;
- menu "Using the Airship",s_Use,"Captain's Cabin",s_Capt,"Facilities",s_Faci,"Cancel",-;
-
- mes "[Airship Staff]";
- mes "Well, I hope you like";
- mes "your flight aboard";
- mes "our Airships. Thank";
- mes "you and have a good day.";
- close;
-
-s_Use:
- mes "[Airship Staff]";
- mes "When you see a broadcast";
- mes "announcing that we have";
- mes "arrived at your destination,";
- mes "please use one of the exits";
- mes "located at the north and";
- mes "south ends of the Airship";
- next;
- mes "[Airship Staff]";
- mes "If you happen to miss";
- mes "your stop, don't worry.";
- mes "The airship is constantly";
- mes "on route and you'll get";
- mes "another chance to arrive";
- mes "to your intended destination.";
- close;
-
-s_Capt:
- mes "[Airship Staff]";
- mes "The Captain's Cabin";
- mes "is located at the front";
- mes "of the Airship. There, you";
- mes "can meet the captain and";
- mes "the pilot of the Airship.";
- close;
-
-s_Faci:
- mes "[Airship Staff]";
- mes "The Airship provides";
- mes "various Mini Games for";
- mes "the entertainment of all";
- mes "our passengers. We invite";
- mes "you to try your luck and skills";
- mes "in the Airship's Mini Games~";
- close;
-
-}
-
-airplane.gat,50,66,4 script Meltz::AirshipApples 86,{
-
- mes "[Meltz]";
- mes "Welcome to Meltz's";
- mes "Shop where you can";
- mes "purchase Apples or grind";
- mes "them to make Apple Juice.";
- next;
- menu "Buy Apples",s_Buy,"Make Apple Juice",s_Juice,"Cancel.",-;
-
-s_Cancel:
- mes "[Meltz]";
- mes "Thanks for stopping";
- mes "by my shop. Farewell!";
- mes "Come back anytime when";
- mes "you feel like having an";
- mes "Apple to snack on~";
- close;
-
-s_Buy:
- mes "[Meltz]";
- mes "Please enter the amount";
- mes "of Apples that you wish to";
- mes "buy. Each Apple is 15 zeny";
- mes "and you can buy a maximum";
- mes "of 500 at a time. Please enter";
- mes "\"0\" to cancel your order.";
- next;
- input @tempapple;
- if(!@tempapple)goto s_Cancel;
- if(@tempapple > 0 && @tempapple < 501)goto s_AppleBuy;
- if(@tempapple < 0)close;
- mes "[Meltz]";
- mes "The maximum amount of apples";
- mes "you can buy at the same time";
- mes "is 500. " + @tempapple + " is clearly";
- mes "over 500.";
- close;
-
-s_AppleBuy:
- mes "[Meltz]";
- mes "A total of ^FF0000" + @tempapple + "^000000 Apples.";
- mes "will cost you ^FF0000" + @tempapple * 15 + "^000000 zeny.";
- mes "Would you like to continue?";
- next;
- menu "Yes",-,"No",s_Cancel;
-
- if(zeny < (@tempapple * 15))goto s_NEnoughZeny;
- mes "[Meltz]";
- mes "Thanks for stopping by";
- mes "my shop. I hope you enjoy";
- mes "the flavor of these Apples~!";
- getitem 512,@tempapple;
- set zeny,zeny - (@tempapple * 15);
- close;
-
-s_NEnoughZeny:
- mes "[Meltz]";
- mes "I'm sorry buy you don't";
- mes "seem to have enough zeny.";
- mes "Come back anytime when";
- mes "you feel like having an";
- mes "Apple to snack on~";
- close;
-
-s_Juice:
- mes "[Meltz]";
- mes "Okay, I'll need";
- mes "^FF00003 Apples and 1 Empty Bottle^000000";
- mes "to make 1 Apple Juice for you.";
- mes "Would you like to proceed?";
- next;
- menu "Yes",-,"No",s_Cancel;
-
- if(countitem(512) < 3 || !countitem(713))goto s_Material;
- mes "[Meltz]";
- mes "Thank you,";
- mes "please wait";
- mes "just a moment.";
- next;
- mes "*Grind grind*";
- mes "*Grind grind*";
- mes "*Clang...!*";
- next;
- mes "[Meltz]";
- mes "There you go~";
- mes "I hope you enjoy!";
- mes "Please feel free to";
- mes "stop by for your Apple";
- mes "and Apple Juice needs";
- mes "at anytime, adventurer~";
- delitem 512,3;
- delitem 713,1;
- getitem 531,1;
- close;
-
-s_Material:
- mes "[Meltz]";
- mes "I'm sorry, but you don't";
- mes "have enough materials to";
- mes "create a bottle of Apple Juice.";
- mes "Remember, I need 3 Apples";
- mes "and 1 Empty Bottle to do it.";
- close;
-
-}
-
-
-airplane.gat,33,69,4 script Kaci 73,{
-if fragmentauest==1 {
-mes "[Kaci]";
-mes "Oh.. Thx my dear";
-close2;
-emotion e_kis;
-delitem 7148,1;
-set fragmentauest,2;
-end;
-}
- callfunc "applegamble","Kaci";
- end;
-
- OnLose:
- emotion e_wah;
- end;
-
- OnWin:
- emotion e_no1;
- end;
-}
-
-airplane.gat,80,71,4 script Zerta 834,{
- mes "[Zerta]";
- mes "Oh, hello adventurer.";
- mes "I am currently on a";
- mes "sacred journey, offering";
- mes "prayer for the sake of the";
- mes "Rune-Midgard continent.";
- close;
-}
-
-airplane.gat,65,63,4 script Maelin 714,{
- mes "[Maelin]";
- mes "Um, this Airship is";
- mes "to Lutie, isn't it? I've";
- mes "been waiting so long,";
- mes "but I haven't heard any";
- mes "broadcast about Lutie.";
- close;
-}
-
-airplane.gat,32,61,4 script Nils::TypingContest 49,{
-
-loopback:
- mes "[Nils]";
- mes "Welcome to the";
- mes "^FF0000RO Typing Challenge^000000.";
- mes "Would you like to play";
- mes "a quick typing game?";
- next;
- menu "Play ^FF0000RO Typing Challenge^000000",s_Play,"Information",s_Info,"View Top Records",s_Record,"Cancel",-;
-
- mes "[Nils]";
- mes "Feel free to take on the";
- mes "Ro Typing Challenge";
- mes "anytime. I'll be here~";
- close;
-
-s_Play:
- mes "[Nils]";
- mes "Okay, we have";
- mes "a new challenger!";
- mes "Enter the following";
- mes "text as quickly as you";
- mes "can without making any";
- mes "mistakes! Let's start~!";
- next;
- //below arrays are for simplified entering of new lines ;P
- //first lines array
- setarray $textstringsa$[0],"^00FFFFthkelfkskeldmsiejdlsle^0000FFhfndkelsheidl",
- "^993366hfjdkeldjsieldjs^663366hfjdjeiskdlefvbd",
- "^00FFFFCoboman no chikara-yumei na",
- "^993366belief love luck grimace sweat rush",
- "^00FFFFcallipygian salacious lascivious",
- "^663366uNflAPPaBLe LoVaBLe SeCreTs AnD",
- "^00CCFFburrdingdingdilidingdingphoohudaamb",
- "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi",
- "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn",
- "^00CCFFI'm the King of all Weirdos! Now",
- "^00CCFFBy the power of^000000",
- "^00CCFF...silence. quiet benevolence...";
- //second lines array
- setarray $textstringsb$[0],"skemd",
- "",
- "chikara-dalookii na chikara da ze!",
- "folktale rodimus optimus bumblebee",
- "licentious prurient concupiscent",
- "BoWLiNg aGaINST tHe KarMA of YoUtH",
- "andoora^0000FFbambarambambamburanbamding",
- "kabamturubamdingding",
- "RiGhT BuRn OrIGInAL GaNgSteR SmACk",
- "you know of my true power. Obey~!",
- "p-po-poi-po-poi-poin-poing",
- "soul mate... wonder. enigma...";
- //for the few 3-liners... =X
- setarray $textstringsc$[0],"",
- "",
- "COBO ON!",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "GOD-POING. I NEVER LOSE!",
- "cloud.";
- //comparisation strings
- setarray $compstring$[0],"thkelfkskeldmsiejdlslehfndkelsheidlskemd",
- "hfjdkeldjsieldjshfjdjeiskdlefvbd",
- "Coboman no chikara-yumei na chikara-dalookii na chikara da ze! COBO ON",
- "belief love luck grimace sweat rush folktale rodimus optimus bumblebee",
- "callipygian salacious lascivious licentious prurient concupiscent",
- "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA of YoUtH",
- "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding",
- "barapaphurarlandreamduranbatuhiwooikabamturubamdingding",
- "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk",
- "I'm the King of all Weirdos! Now you know of my true power. Obey~!",
- "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!",
- "...silence. quiet benevolence... soul mate... wonder. enigma... cloud";
- //lengths
- setarray $lengths[0],20,32,73,73,65,66,67,55,67,66,67,69;
- // initnpctimer;
- mes "[Nils]";
- set @index,rand(1,getarraysize($textstringsa$))-1;
- set @string1a$,$textstringsa$[@index];
- set @string1b$,$textstringsb$[@index];
- set @string1c$,$textstringsc$[@index];
- set @typingstring1$,$compstring$[@index];
- set @typingkeys,$lengths[@index];
- set @index2,rand(1,getarraysize($textstringsa$))-1;
- while (@index2 == @index) {
- set @index2,rand(1,getarraysize($textstringsa$))-1;
- }
- set @string2a$,$textstringsa$[@index2];
- set @string2b$,$textstringsb$[@index2];
- set @string2c$,$textstringsc$[@index2];
- set @typingstring2$,$compstring$[@index2];
- set @typingkeys,@typingkeys+$lengths[@index2];
- set @start,gettime(3)*60*60+gettime(2)*60+gettime(1);
- mes @string1a$;
- if(@string1b$ != "")mes @string1b$;
- if(@string1c$ != "")mes @string1c$;
- input @comparisonvar$[1];
- next;
- mes "^000000[Nils]";
- mes @string2a$;
- if(@string2b$ != "")mes @string2b$;
- if(@string2c$ != "")mes @string2c$;
- input @comparisonvar$[2];
- if(@comparisonvar$[1] == @typingstring1$ && @comparisonvar$[2] == @typingstring2$)set @typingcorrect,1;
- next;
- if(!@typingcorrect)goto s_Fail;
- set @time,(gettime(3)*60*60+gettime(2)*60+gettime(1))-@start; //seconds taken
- set @mypoints,(@typingkeys * 100) / @time;
- mes "[Nils]";
- mes "Your typing time";
- mes "was ^FF0000" + @time + " seconds^000000";
- mes "and your score is";
- mes "^0000FF" + @mypoints + "^000000 points";
- next;
- if(@mypoints <= $TypingRecord)goto loopback;
- mes "[Nils]";
- mes "Congratulations!";
- mes "It's a new record.";
- mes "I'll put you on the high-";
- mes "score list immediately.";
- set $TypingRecord,@mypoints;
- set $TypingRecord$,strcharinfo(0);
- close;
-
-s_Fail:
- mes "^000000[Nils]";
- mes "I'm sorry you didn't type";
- mes "all characters correctly.";
- mes "But remember, practice makes";
- mes "perfect!";
- close;
-
-s_Info:
- mes "[Nils]";
- mes "The RO Typing Challenge";
- mes "is a game where you enter";
- mes "the given text as quickly as you";
- mes "can. The name of the top player";
- mes "is recorded for posterity. If you";
- mes "want fame, here's your chance!";
- next;
- mes "[Nils]";
- mes "I'd just like to let";
- mes "you know that you type";
- mes "all the text that you see";
- mes "in the single input line that";
- mes "you're given. So don't press";
- mes "the enter key, just click 'OK'.";
- close;
-
-s_Record:
- mes "[Nils]";
- mes "^0000FF" + $TypingRecord$ + "^000000";
- mes "is the current";
- mes "record holder with";
- mes "a record of ^0000FF" + $TypingRecord + "^000000";
- mes "points. Try to beat";
- mes "that record next time~";
- close;
-
-}
-
-//============================================================
-//= The Airship System (Yuno -> Izlude -> Repeat)
-//============================================================
-
-airplane_01.gat,243,74,4 script #AirshipWarp-3 45,2,2{
-OnTouch:
- if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
- if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
- end;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane_01.gat,243,29,4 script #AirshipWarp-4 45,2,2{
-OnTouch:
- if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
- if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
-
-OnHide:
- misceffect 16;
- end;
-OnUnhide:
- misceffect 215;
- end;
-}
-
-airplane_01.gat,1,1,0 script YunoIzl_Airship -1,{
-OnInit:
-while(1)
-{
- initnpctimer;
- setnpctimer 0;
- set $@airplanelocation2,0;
- donpcevent "#AirshipWarp-3::OnHide";
- donpcevent "#AirshipWarp-4::OnHide";
- disablenpc "#AirshipWarp-3";
- disablenpc "#AirshipWarp-4";
- mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Izlude.",1,0x00FF00;
- end;
-OnTimer15000:
- mapannounce "airplane_01.gat","We are heading to Izlude.",1,0x00FF00;
- end;
-OnTimer30000:
- mapannounce "airplane_01.gat","We will arrive in Izlude shortly.",1,0x00FF00;
- end;
-OnTimer45000:
- set $@airplanelocation2,1;
- enablenpc "#AirshipWarp-3";
- enablenpc "#AirshipWarp-4";
- donpcevent "#AirshipWarp-3::OnUnhide";
- donpcevent "#AirshipWarp-4::OnUnhide";
- mapannounce "airplane_01.gat","Welcome to Izlude. Have a safe trip.",1,0x00FF00;
- end;
-OnTimer55000:
- mapannounce "airplane_01.gat","Currently, we are in Izlude. The Airship will leave shortly.",1,0x00FF00;
- end;
-OnTimer65000:
- set $@airplanelocation2,0;
- donpcevent "#AirshipWarp-3::OnHide";
- donpcevent "#AirshipWarp-4::OnHide";
- disablenpc "#AirshipWarp-3";
- disablenpc "#AirshipWarp-4";
- mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Yuno.",1,0x70DBDB;
- end;
-OnTimer80000:
- mapannounce "airplane_01.gat","We are heading to Yuno.",1,0x70DBDB;
- end;
-OnTimer95000:
- mapannounce "airplane_01.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
- end;
-OnTimer110000:
- set $@airplanelocation2,2;
- enablenpc "#AirshipWarp-3";
- enablenpc "#AirshipWarp-4";
- donpcevent "#AirshipWarp-3::OnUnhide";
- donpcevent "#AirshipWarp-4::OnUnhide";
- mapannounce "airplane_01.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
- end;
-OnTimer120000:
- mapannounce "airplane_01.gat","Currently, we are in Yuno. The Airship will take off shortly.",1,0x70DBDB;
- end;
-OnTimer130000:
- stoptimer;
-}
-}
-
-//============================================================
-//= Some normal NPCS (airplane_01.gat)
-//============================================================
-
-airplane_01.gat,240,64,5 duplicate(Exit2) Exit#05 857
-
-airplane_01.gat,247,64,5 duplicate(Exit2) Exit#06 857
-
-airplane_01.gat,240,39,1 duplicate(Exit2) Exit#07 857
-
-airplane_01.gat,247,39,1 duplicate(Exit2) Exit#08 857
-
-airplane_01.gat,100,69,2 duplicate(Airship Crew) Airship Crew#02 852
-
-airplane_01.gat,250,59,3 duplicate(AirshipInfo) Airship Staff#info 67
-
-airplane_01.gat,50,66,4 duplicate(AirshipApples) Meltz 86
-
-airplane_01.gat,32,61,4 duplicate(TypingContest) Nils 49
-
-airplane_01.gat,83,61,2 script Girl#10 72,{
-
- mes "[Dianne]";
- mes "It's so weird!";
- mes "I went to visit the";
- mes "Airship Captain and";
- mes "all I saw was this";
- mes "weird reindeer. Oh!";
- mes "Do you think that...";
- close;
-
-}
-
-airplane_01.gat,69,63,2 script Old Man#06 55,{
-
- mes "[Mendel]";
- mes "As I expected, the";
- mes "in-flight meals are";
- mes "three star quality at best.";
- mes "^111111*Harrrumph*^000000 I really should";
- mes "have brought my chef so that";
- mes "I could enjoy a real meal.";
- close;
-
-}
-
-airplane_01.gat,33,68,4 script Clarice 74,{
- callfunc "applegamble","Clarice";
- end;
-}
-
-//============================================================
-//= The Izlude Airship Staff
-//============================================================
-
-izlude.gat,201,54,3 script Airship Staff#izl 91,{
-
- mes "[Airship Staff]";
- mes "Welcome to the Izlude Airship.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airship Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto L_GotTicket;
- if(Zeny < 1200) goto L_NoZeny;
- set Zeny, Zeny - 1200;
- warp "airplane_01.gat",224,64;
- close;
-
- L_GotTicket:
- delitem 7311,1;
- warp "airplane_01.gat",224,64;
- close;
-
- L_NoZeny:
- mes "[Airship Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-//============================================================
-//= The Hugel Airship Staff
-//============================================================
-
-hugel.gat,182,150,3 script Airship Staff#hu 91,{
-
- mes "[Airship Staff]";
- mes "Welcome to the Schwartzwald Republic's Airship.";
- mes "How may I help you?";
- next;
- menu "Board the Airship",-,"Cancel",L_Cancel;
-
- mes "[Airship Staff]";
- mes "The Airship boarding fee";
- mes "is 1,200 zeny, but if you've";
- mes "got a Free Ticket for Airship,";
- mes "the fee will be waived. Will";
- mes "you board the Airship?";
- next;
- menu "Yes",-,"No",L_Cancel;
-
- if(countitem(7311) > 0) goto L_GotTicket;
- if(Zeny < 1200) goto L_NoZeny;
- set Zeny, Zeny - 1200;
- warp "airplane.gat",224,64;
- close;
-
- L_GotTicket:
- delitem 7311,1;
- warp "airplane.gat",224,64;
- close;
-
- L_NoZeny:
- mes "[Airship Staff]";
- mes "You don't have enough zeny.";
- close;
-
- L_Cancel:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-}
-
-//============================================================
-//= Yuno Airport NPCs
-//============================================================
-
-y_airport.gat,144,63,4 script Airport Staff#Ein 91,{
-
- mes "[Airship Staff]";
- mes "Good day!";
- mes "Would you like to go";
- mes "to ^FF0000Einbroch^000000,^FF0000Hugel^000000 or";
- mes "^FF0000Lighthalzen^000000?";
- next;
- menu "Yes.",s_Warp,"No.",-;
-
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-
-s_Warp:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close2;
- warp "yuno.gat",57,240;
- end;
-
-}
-
-y_airport.gat,141,63,4 script Airport Staff#Izl 91,{
-
- mes "[Airship Staff]";
- mes "Good day!";
- mes "Would you like to go";
- mes "to ^FF0000Izlude^000000?";
- next;
- menu "Yes.",s_Warp,"No.",-;
-
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close;
-
-s_Warp:
- mes "[Airship Staff]";
- mes "Thank you and";
- mes "have a nice day.";
- close2;
- warp "yuno.gat",50,240;
- end;
-
-}
-
-//============================================================
-//= Apple Gambling Function
-//============================================================
-
-function script applegamble {
- mes "["+getarg(0)+"]";
- mes "Hi, I'm "+getarg(0)+"~";
- mes "How would you like";
- mes "to wager some Apples";
- mes "in a friendly game of Dice?";
- next;
- switch(select("Play Dice Game:Learn Dice Game Rules:Cancel")){
- case 3:
- mes "["+getarg(0)+"]";
- mes "I'm up for a game of";
- mes "dice whenever you feel";
- mes "like it. Just talk to me if";
- mes "you ever get hit with the";
- mes "sudden urge to gamle, kay?";
- close;
- case 2:
- mes "["+getarg(0)+"]";
- mes "The rules for the Dice game";
- mes "are pretty simple. First, you";
- mes "place a bet by wagering Apples.";
- mes "You can bet a maximum of 50";
- mes "Apples at a time. To keep things";
- mes "legal, I can only accept Apples.";
- next;
- mes "["+getarg(0)+"]";
- mes "But hey, if all that zeny";
- mes "is burning a hole in your";
- mes "pocket, head over to Fruitz";
- mes "and you can buy as many";
- mes "Apples as you want, playah~";
- next;
- mes "["+getarg(0)+"]";
- mes "Now, we begin with me";
- mes "rolling wto 6-sided dice.";
- mes "When it's your turn, you'll";
- mes "roll two 6-sided dice. After";
- mes "that, both of us will have the";
- mes "option of rolling a third die.";
- next;
- mes "["+getarg(0)+"]";
- mes "Now here's the important";
- mes "thing. If your total is higher";
- mes "than 12, you'll bust, meaning";
- mes "that you lose. Otherwise, the";
- mes "person with the higher total";
- mes "is the winner. Got it?";
- next;
- mes "["+getarg(0)+"]";
- mes "Now, you'll be the first";
- mes "to decide whether or not";
- mes "you'll roll the third die. Then,";
- mes "depending on your result, I'll";
- mes "roll my third die... Or maybe not.";
- next;
- mes "["+getarg(0)+"]";
- mes "When you win, you'll";
- mes "receive twice as many";
- mes "Apples as you wagered.";
- mes "But if we happen to tie, you";
- mes "get the Apples that you bet";
- mes "returned to you. Fair, right?";
- close;
- case 1:
- break;
- }
- mes "["+getarg(0)+"]";
- mes "Ooh, so you'll play with";
- mes "me? Great! How many";
- mes "Apples would you like to bet?";
- mes "Remember, you can wager";
- mes "up to 50 Apples. If you'd like";
- mes "to cancel, please enter '0'.";
- next;
-L_Input:
- input @amount;
- if(@amount == 0) {
- mes "["+getarg(0)+"]";
- mes "Changed your mind?";
- mes "I understand. Well then,";
- mes "I hope we can play sometime.";
- close;
- }
- if(@amount > 50) set @amount,50;
- mes "["+getarg(0)+"]";
- mes "So you'll be";
- mes "betting ^FF0000"+@amount+"^000000 Apples.";
- mes "Is that right?";
- next;
- if(select("Yes:No")==2){
- mes "["+getarg(0)+"]";
- mes "Mm, made a mistake?";
- mes "Alright, please enter the";
- mes "number of Apples you";
- mes "wish to place in this bet";
- next;
- goto L_Input;
- }
- if(countitem(512)<@amount){
- //more apples then in inventory
- //-Improvised-
- mes "["+getarg(0)+"]";
- mes "Ooh...";
- mes "You don't have that";
- mes "much Apples with you,";
- mes "now do you?";
- close;
- }
- delitem 512,@amount;
- mes "["+getarg(0)+"]";
- mes "Good!";
- mes "Now we can start";
- mes "this game! I'll roll first~";
- next;
- mes "^0000FF*Rolling and rumbling*";
- set @table1,rand(1,6);
- set @table2,rand(1,6);
- set @tablesub,@table1+@table2;
- next;
- mes "I rolled a "+@table1+" and a "+@table2+",";
- mes "giving me a total of "+@tablesub+".";
- mes "Now it's your turn,";
- mes strcharinfo(0)+".";
- next;
- menu "Roll Dice.",-;
-
- mes "^0000FF*Rolling and rumbling*";
- set @player1,rand(1,6);
- set @player2,rand(1,6);
- set @playersub,@player1+@player2;
- next;
- mes "["+getarg(0)+"]";
- mes strcharinfo(0)+",";
- mes "you rolled a "+@player1+" and a "+@player2+",";
- mes "giving you a total of ^FF0000"+@playersub+"^000000.";
- next;
- mes "["+getarg(0)+"]";
- if(@playersub == @tablesub) {
- mes "Well, well, well.";
- mes "Both of us have a total";
- mes "of "+@playersub+". Well, the ball's in";
- mes "your court. Are you going";
- mes "to roll your third die,";
- mes strcharinfo(0)+"?";
- } else if(@playersub > @tablesub) {
- mes "Since my total is only ^0000FF"+@tablesub+"^000000,";
- mes "you have the advantage for";
- mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
- mes "you wanna roll one more die?";
- mes "Remember, you'll bust if all three";
- mes "of your dice total more than 12.";
- } else if(@tablesub > @playersub) {
- mes "Since my total is ^0000FF"+@tablesub+"^000000,";
- mes "I have the advantage for";
- mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
- mes "you wanna roll one more die?";
- mes "Remember, you'll bust if all three";
- mes "of your dice total more than 12.";
- }
- next;
- if(select("Roll another dice.:Don't Roll.")==2){
- mes "["+getarg(0)+"]";
- mes "Not gonna roll, huh?";
- if(@tablesub == @playersub) {
- mes "You better hope I roll";
- mes "too high and bust, or";
- mes "I'll beat you for sure!";
- mes "Okay, here goes nothing...";
- next;
- goto L_Table3;
- } else if(@tablesub < @playersub) {
- next;
- mes "["+getarg(0)+"]";
- mes "Alright, I see that you";
- mes "don't want to risk rolling";
- mes "higher than 12 and busting.";
- mes "I'll go ahead and roll then.";
- next;
- goto L_Table3;
- } else if(@tablesub > @playersub) {
- //you have a lower sub total then table, and do not roll 3th -Improvised-
- mes "["+getarg(0)+"]";
- mes "Not gonna roll, huh?";
- mes "Well, then I'm not";
- mes "gonna roll either.";
- next;
- mes "["+getarg(0)+"]";
- mes "That means that I";
- mes "have a total of ^0000FF"+@tablesub+"^000000";
- mes "wich beats your ^FF0000"+@playersub+"^000000.";
- mes "I'm sorry, but you lose";
- mes "this game, "+strcharinfo(0)+". Better";
- mes "luck next time.";
- }
- close;
- }
- mes "^0000FF*Rolling and rumbling*";
- set @player3,rand(1,6);
- set @playersub,@playersub+@player3;
- if(@playersub > 12) {
- //player bust --Improvised--
- next;
- mes "["+getarg(0)+"]";
- mes "Oh my... You rolled a ^FF000"+@player3+"^000000,";
- mes "making your total ^FF0000"+@playersub+"^000000.";
- mes "That's more then 12, meaning you bust.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+".";
- close;
- }
- next;
- mes "["+getarg(0)+"]";
- mes "Oh hey! You rolled";
- if(@playersub >= @tablesub) {
- mes "a ^FF0000"+@player3+"^000000, giving you a total";
- mes "of ^FF0000"+@playersub+"^000000. Now, if I don't";
- mes "roll, I'll lose for sure!";
- mes "I'm gonna go for it...";
- next;
- goto L_Table3;
- } else if(@playersub < @tablesub) {
- //player's sub together with 3th die is still too low
- //--Improvised--
- mes "a ^FF0000"+@player3+"^000000, giving";
- mes "you a total of ^FF0000"+@playersub+"^000000.";
- mes "Wich still isn't enough";
- mes "to beat my ^0000FF"+@tablesub+"^000000.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+". Them's";
- mes "the breaks, I suppose...";
- close;
- }
-L_Table3:
- mes "^0000FF*Rolling and rumbling*";
- set @table3,rand(1,6);
- set @tablesub,@tablesub+@table3;
- next;
- if(@tablesub > 12) {
- mes "["+getarg(0)+"]";
- mes "Eh? I rolled a ^0000FF"+@table3+"^000000, making";
- mes "my total ^0000FF"+@tablesub+"^000000. I hate to say";
- mes "it, but I gambled and lost.";
- mes "Take your winnings before";
- mes "I cry, "+strcharinfo(0)+"~!";
- close2;
- getitem 512,@amount*2;
- end;
- }
- mes "["+getarg(0)+"]";
- if(@tablesub < @playersub) {
- mes "I rolled a "+@table3+", which";
- mes "gives me a total of ^0000FF"+@tablesub+"^000000.";
- mes "But... It's still not enough";
- mes "to beat your ^FF0000"+@playersub+"^000000. It looks";
- mes "like I can't compete with";
- mes "you, "+strcharinfo(0)+"...";
- close2;
- getitem 512,@amount*2;
- end;
- } else if(@tablesub > @playersub) {
- mes "I rolled a ^0000FF"+@table3+"^000000, giving";
- mes "me a total of ^0000FF"+@tablesub+"^000000 which";
- mes "beats your total of ^FF0000"+@playersub+"^000000.";
- mes "Sorry, but you lose this";
- mes "game, "+strcharinfo(0)+". Them's";
- mes "the breaks, I suppose...";
- close;
- } else if(@tablesub == @playersub) {
- //Result = tie, --Improvised--
- mes "I rolled a ^0000FF"+@table3+"^000000, giving";
- mes "me a total of ^0000FF"+@tablesub+"^000000, which";
- mes "is the same as your total.";
- mes "Well, this game didn't have a";
- mes "winner or loser, "+strcharinfo(0)+".";
- close2;
- getitem 512,@amount;
- end;
- }
-}
+//===== eAthena Script =======================================
+//= The Airship System Script
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 0.5c
+//===== Compatible With: =====================================
+//= eAthena SVN 3422+(Requires jA Script System)
+//===== Description: =========================================
+//= The Airship System used in the official servers, however this
+//= one is still about 25% custom and is missing some npcs.
+//===== Additional Comments: =================================
+//= 0.1 Added first version, it might be a little buggy [MasterOfMuppets]
+//= 0.1a Fixed the Airport Staff#Iz which was [MasterOfMuppets]
+//= warping you to the same location as Airport Staff#Ein
+//= 0.2 Implemented some more airship NPCs, more are to come.
+//= 0.3 Implemented some more NPCs [MasterOfMuppets]
+//= 0.4 Implemented two mini games scripted by Dj-Yhn [MasterOfMuppets]
+//= 0.5 Removed Duplicates [Silent]
+//= 0.5aFixed a typo [Evera] 0.5b Fixed appledice bugs [Lupus]
+//============================================================
+
+//============================================================
+//= The Airship System (Yuno -> Hugel -> Einbroch -> Lighthalzen -> repeat)
+//============================================================
+
+airplane.gat,243,74,4 script #AirshipWarp-1 45,2,2{
+OnTouch:
+ if($@airplanelocation == 1)warp "einbroch.gat",90,275;
+ if($@airplanelocation == 2)warp "yuno.gat",85,265;
+ if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
+ if($@airplanelocation == 4)warp "hugel.gat",182,150;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane.gat,243,29,4 script #AirshipWarp-2 45,2,2{
+OnTouch:
+ if($@airplanelocation == 1)warp "einbroch.gat",90,275;
+ if($@airplanelocation == 2)warp "yuno.gat",85,265;
+ if($@airplanelocation == 3)warp "lighthalzen.gat",302,75;
+ if($@airplanelocation == 4)warp "hugel.gat",182,150;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane.gat,1,1,0 script EinYuno_Airship -1,{
+OnInit:
+while(1)
+{
+ initnpctimer;
+ setnpctimer 0;
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Hugel.",1,0xBA55D3;
+ end;
+OnTimer15000:
+ mapannounce "airplane.gat","We are heading to Hugel.",1,0xBA55D3;
+ end;
+OnTimer30000:
+ mapannounce "airplane.gat","We will arrive in Hugel shortly.",1,0xBA55D3;
+ end;
+OnTimer45000:
+ set $@airplanelocation,4;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Hugel. Have a safe trip.",1,0xBA55D3;
+ end;
+OnTimer55000:
+ mapannounce "airplane.gat","Currently, we are in Hugel. The Airship will leave shortly.",1,0xBA55D3;
+ end;
+OnTimer65000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Einbroch.",1,0x00FF00;
+ end;
+OnTimer80000:
+ mapannounce "airplane.gat","We are heading to Einbroch.",1,0x00FF00;
+ end;
+OnTimer95000:
+ mapannounce "airplane.gat","We will arrive in Einbroch shortly.",1,0x00FF00;
+ end;
+OnTimer110000:
+ set $@airplanelocation,1;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Einbroch. Have a safe trip.",1,0x00FF00;
+ end;
+OnTimer120000:
+ mapannounce "airplane.gat","Currently, we are in Einbroch. The Airship will take off shortly.",1,0x00FF00;
+ end;
+OnTimer130000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is leaving the ground. Our next destination is Lighthalzen.",1,0xFF8600;
+ end;
+OnTimer145000:
+ mapannounce "airplane.gat","We are heading to Lighthalzen.",1,0xFF8600;
+ end;
+OnTimer160000:
+ mapannounce "airplane.gat","We will arrive in Lighthalzen shortly.",1,0xFF8600;
+ end;
+OnTimer175000:
+ set $@airplanelocation,3;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Lighthalzen. Have a safe trip.",1,0xFF8600;
+ end;
+OnTimer185000:
+ mapannounce "airplane.gat","Currently, we are in Lighthalzen. The Airship will leave shortly.",1,0xFF8600;
+ end;
+OnTimer195000:
+ set $@airplanelocation,0;
+ donpcevent "#AirshipWarp-1::OnHide";
+ donpcevent "#AirshipWarp-2::OnHide";
+ disablenpc "#AirshipWarp-1";
+ disablenpc "#AirshipWarp-2";
+ mapannounce "airplane.gat","The Airship is now taking off. Our next destination is Yuno.",1,0x70DBDB;
+ end;
+OnTimer210000:
+ mapannounce "airplane.gat","We are heading to Yuno.",1,0x70DBDB;
+ end;
+OnTimer225000:
+ mapannounce "airplane.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
+ end;
+OnTimer240000:
+ set $@airplanelocation,2;
+ enablenpc "#AirshipWarp-1";
+ enablenpc "#AirshipWarp-2";
+ donpcevent "#AirshipWarp-1::OnUnhide";
+ donpcevent "#AirshipWarp-2::OnUnhide";
+ mapannounce "airplane.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
+ end;
+OnTimer250000:
+ mapannounce "airplane.gat","Currently, we are in Yuno. The Airship will leave shortly.",1,0x70DBDB;
+ end;
+OnTimer260000:
+ stoptimer;
+}
+}
+
+//C4644E
+
+//============================================================
+//= Some normal NPCS (airplane.gat)
+//============================================================
+
+airplane.gat,240,64,5 script Exit#01::Exit2 857,{
+
+end;
+
+}
+
+airplane.gat,247,64,5 duplicate(Exit2) Exit#02 857
+
+airplane.gat,240,39,1 duplicate(Exit2) Exit#03 857
+
+airplane.gat,247,39,1 duplicate(Exit2) Exit#04 857
+
+airplane.gat,100,69,2 script Airship Crew#01::Airship Crew 852,{
+
+ mes "[Airship Crew]";
+ mes "If we've landed at";
+ mes "your destination and";
+ mes "you'd like to leave the";
+ mes "Airship, please use the";
+ mes "stairs up ahead. Thank";
+ mes "you for you patronage.";
+ close;
+
+}
+
+airplane.gat,250,59,3 script Airship Staff::AirshipInfo 67,{
+
+ mes "[Airship Staff]";
+ mes "Welcome";
+ mes "to the Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Using the Airship",s_Use,"Captain's Cabin",s_Capt,"Facilities",s_Faci,"Cancel",-;
+
+ mes "[Airship Staff]";
+ mes "Well, I hope you like";
+ mes "your flight aboard";
+ mes "our Airships. Thank";
+ mes "you and have a good day.";
+ close;
+
+s_Use:
+ mes "[Airship Staff]";
+ mes "When you see a broadcast";
+ mes "announcing that we have";
+ mes "arrived at your destination,";
+ mes "please use one of the exits";
+ mes "located at the north and";
+ mes "south ends of the Airship";
+ next;
+ mes "[Airship Staff]";
+ mes "If you happen to miss";
+ mes "your stop, don't worry.";
+ mes "The airship is constantly";
+ mes "on route and you'll get";
+ mes "another chance to arrive";
+ mes "to your intended destination.";
+ close;
+
+s_Capt:
+ mes "[Airship Staff]";
+ mes "The Captain's Cabin";
+ mes "is located at the front";
+ mes "of the Airship. There, you";
+ mes "can meet the captain and";
+ mes "the pilot of the Airship.";
+ close;
+
+s_Faci:
+ mes "[Airship Staff]";
+ mes "The Airship provides";
+ mes "various Mini Games for";
+ mes "the entertainment of all";
+ mes "our passengers. We invite";
+ mes "you to try your luck and skills";
+ mes "in the Airship's Mini Games~";
+ close;
+
+}
+
+airplane.gat,50,66,4 script Meltz::AirshipApples 86,{
+
+ mes "[Meltz]";
+ mes "Welcome to Meltz's";
+ mes "Shop where you can";
+ mes "purchase Apples or grind";
+ mes "them to make Apple Juice.";
+ next;
+ menu "Buy Apples",s_Buy,"Make Apple Juice",s_Juice,"Cancel.",-;
+
+s_Cancel:
+ mes "[Meltz]";
+ mes "Thanks for stopping";
+ mes "by my shop. Farewell!";
+ mes "Come back anytime when";
+ mes "you feel like having an";
+ mes "Apple to snack on~";
+ close;
+
+s_Buy:
+ mes "[Meltz]";
+ mes "Please enter the amount";
+ mes "of Apples that you wish to";
+ mes "buy. Each Apple is 15 zeny";
+ mes "and you can buy a maximum";
+ mes "of 500 at a time. Please enter";
+ mes "\"0\" to cancel your order.";
+ next;
+ input @tempapple;
+ if(!@tempapple)goto s_Cancel;
+ if(@tempapple > 0 && @tempapple < 501)goto s_AppleBuy;
+ if(@tempapple < 0)close;
+ mes "[Meltz]";
+ mes "The maximum amount of apples";
+ mes "you can buy at the same time";
+ mes "is 500. " + @tempapple + " is clearly";
+ mes "over 500.";
+ close;
+
+s_AppleBuy:
+ mes "[Meltz]";
+ mes "A total of ^FF0000" + @tempapple + "^000000 Apples.";
+ mes "will cost you ^FF0000" + @tempapple * 15 + "^000000 zeny.";
+ mes "Would you like to continue?";
+ next;
+ menu "Yes",-,"No",s_Cancel;
+
+ if(zeny < (@tempapple * 15))goto s_NEnoughZeny;
+ mes "[Meltz]";
+ mes "Thanks for stopping by";
+ mes "my shop. I hope you enjoy";
+ mes "the flavor of these Apples~!";
+ getitem 512,@tempapple;
+ set zeny,zeny - (@tempapple * 15);
+ close;
+
+s_NEnoughZeny:
+ mes "[Meltz]";
+ mes "I'm sorry buy you don't";
+ mes "seem to have enough zeny.";
+ mes "Come back anytime when";
+ mes "you feel like having an";
+ mes "Apple to snack on~";
+ close;
+
+s_Juice:
+ mes "[Meltz]";
+ mes "Okay, I'll need";
+ mes "^FF00003 Apples and 1 Empty Bottle^000000";
+ mes "to make 1 Apple Juice for you.";
+ mes "Would you like to proceed?";
+ next;
+ menu "Yes",-,"No",s_Cancel;
+
+ if(countitem(512) < 3 || !countitem(713))goto s_Material;
+ mes "[Meltz]";
+ mes "Thank you,";
+ mes "please wait";
+ mes "just a moment.";
+ next;
+ mes "*Grind grind*";
+ mes "*Grind grind*";
+ mes "*Clang...!*";
+ next;
+ mes "[Meltz]";
+ mes "There you go~";
+ mes "I hope you enjoy!";
+ mes "Please feel free to";
+ mes "stop by for your Apple";
+ mes "and Apple Juice needs";
+ mes "at anytime, adventurer~";
+ delitem 512,3;
+ delitem 713,1;
+ getitem 531,1;
+ close;
+
+s_Material:
+ mes "[Meltz]";
+ mes "I'm sorry, but you don't";
+ mes "have enough materials to";
+ mes "create a bottle of Apple Juice.";
+ mes "Remember, I need 3 Apples";
+ mes "and 1 Empty Bottle to do it.";
+ close;
+
+}
+
+
+airplane.gat,33,69,4 script Kaci 73,{
+if fragmentauest==1 {
+mes "[Kaci]";
+mes "Oh.. Thx my dear";
+close2;
+emotion e_kis;
+delitem 7148,1;
+set fragmentauest,2;
+end;
+}
+ callfunc "applegamble","Kaci";
+ end;
+
+ OnLose:
+ emotion e_wah;
+ end;
+
+ OnWin:
+ emotion e_no1;
+ end;
+}
+
+airplane.gat,80,71,4 script Zerta 834,{
+ mes "[Zerta]";
+ mes "Oh, hello adventurer.";
+ mes "I am currently on a";
+ mes "sacred journey, offering";
+ mes "prayer for the sake of the";
+ mes "Rune-Midgard continent.";
+ close;
+}
+
+airplane.gat,65,63,4 script Maelin 714,{
+ mes "[Maelin]";
+ mes "Um, this Airship is";
+ mes "to Lutie, isn't it? I've";
+ mes "been waiting so long,";
+ mes "but I haven't heard any";
+ mes "broadcast about Lutie.";
+ close;
+}
+
+airplane.gat,32,61,4 script Nils::TypingContest 49,{
+
+loopback:
+ mes "[Nils]";
+ mes "Welcome to the";
+ mes "^FF0000RO Typing Challenge^000000.";
+ mes "Would you like to play";
+ mes "a quick typing game?";
+ next;
+ menu "Play ^FF0000RO Typing Challenge^000000",s_Play,"Information",s_Info,"View Top Records",s_Record,"Cancel",-;
+
+ mes "[Nils]";
+ mes "Feel free to take on the";
+ mes "Ro Typing Challenge";
+ mes "anytime. I'll be here~";
+ close;
+
+s_Play:
+ mes "[Nils]";
+ mes "Okay, we have";
+ mes "a new challenger!";
+ mes "Enter the following";
+ mes "text as quickly as you";
+ mes "can without making any";
+ mes "mistakes! Let's start~!";
+ next;
+ //below arrays are for simplified entering of new lines ;P
+ //first lines array
+ setarray $textstringsa$[0],"^00FFFFthkelfkskeldmsiejdlsle^0000FFhfndkelsheidl",
+ "^993366hfjdkeldjsieldjs^663366hfjdjeiskdlefvbd",
+ "^00FFFFCoboman no chikara-yumei na",
+ "^993366belief love luck grimace sweat rush",
+ "^00FFFFcallipygian salacious lascivious",
+ "^663366uNflAPPaBLe LoVaBLe SeCreTs AnD",
+ "^00CCFFburrdingdingdilidingdingphoohudaamb",
+ "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi",
+ "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn",
+ "^00CCFFI'm the King of all Weirdos! Now",
+ "^00CCFFBy the power of^000000",
+ "^00CCFF...silence. quiet benevolence...";
+ //second lines array
+ setarray $textstringsb$[0],"skemd",
+ "",
+ "chikara-dalookii na chikara da ze!",
+ "folktale rodimus optimus bumblebee",
+ "licentious prurient concupiscent",
+ "BoWLiNg aGaINST tHe KarMA of YoUtH",
+ "andoora^0000FFbambarambambamburanbamding",
+ "kabamturubamdingding",
+ "RiGhT BuRn OrIGInAL GaNgSteR SmACk",
+ "you know of my true power. Obey~!",
+ "p-po-poi-po-poi-poin-poing",
+ "soul mate... wonder. enigma...";
+ //for the few 3-liners... =X
+ setarray $textstringsc$[0],"",
+ "",
+ "COBO ON!",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "GOD-POING. I NEVER LOSE!",
+ "cloud.";
+ //comparisation strings
+ setarray $compstring$[0],"thkelfkskeldmsiejdlslehfndkelsheidlskemd",
+ "hfjdkeldjsieldjshfjdjeiskdlefvbd",
+ "Coboman no chikara-yumei na chikara-dalookii na chikara da ze! COBO ON",
+ "belief love luck grimace sweat rush folktale rodimus optimus bumblebee",
+ "callipygian salacious lascivious licentious prurient concupiscent",
+ "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA of YoUtH",
+ "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding",
+ "barapaphurarlandreamduranbatuhiwooikabamturubamdingding",
+ "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk",
+ "I'm the King of all Weirdos! Now you know of my true power. Obey~!",
+ "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!",
+ "...silence. quiet benevolence... soul mate... wonder. enigma... cloud";
+ //lengths
+ setarray $lengths[0],20,32,73,73,65,66,67,55,67,66,67,69;
+ // initnpctimer;
+ mes "[Nils]";
+ set @index,rand(1,getarraysize($textstringsa$))-1;
+ set @string1a$,$textstringsa$[@index];
+ set @string1b$,$textstringsb$[@index];
+ set @string1c$,$textstringsc$[@index];
+ set @typingstring1$,$compstring$[@index];
+ set @typingkeys,$lengths[@index];
+ set @index2,rand(1,getarraysize($textstringsa$))-1;
+ while (@index2 == @index) {
+ set @index2,rand(1,getarraysize($textstringsa$))-1;
+ }
+ set @string2a$,$textstringsa$[@index2];
+ set @string2b$,$textstringsb$[@index2];
+ set @string2c$,$textstringsc$[@index2];
+ set @typingstring2$,$compstring$[@index2];
+ set @typingkeys,@typingkeys+$lengths[@index2];
+ set @start,gettime(3)*60*60+gettime(2)*60+gettime(1);
+ mes @string1a$;
+ if(@string1b$ != "")mes @string1b$;
+ if(@string1c$ != "")mes @string1c$;
+ input @comparisonvar$[1];
+ next;
+ mes "^000000[Nils]";
+ mes @string2a$;
+ if(@string2b$ != "")mes @string2b$;
+ if(@string2c$ != "")mes @string2c$;
+ input @comparisonvar$[2];
+ if(@comparisonvar$[1] == @typingstring1$ && @comparisonvar$[2] == @typingstring2$)set @typingcorrect,1;
+ next;
+ if(!@typingcorrect)goto s_Fail;
+ set @time,(gettime(3)*60*60+gettime(2)*60+gettime(1))-@start; //seconds taken
+ set @mypoints,(@typingkeys * 100) / @time;
+ mes "[Nils]";
+ mes "Your typing time";
+ mes "was ^FF0000" + @time + " seconds^000000";
+ mes "and your score is";
+ mes "^0000FF" + @mypoints + "^000000 points";
+ next;
+ if(@mypoints <= $TypingRecord)goto loopback;
+ mes "[Nils]";
+ mes "Congratulations!";
+ mes "It's a new record.";
+ mes "I'll put you on the high-";
+ mes "score list immediately.";
+ set $TypingRecord,@mypoints;
+ set $TypingRecord$,strcharinfo(0);
+ close;
+
+s_Fail:
+ mes "^000000[Nils]";
+ mes "I'm sorry you didn't type";
+ mes "all characters correctly.";
+ mes "But remember, practice makes";
+ mes "perfect!";
+ close;
+
+s_Info:
+ mes "[Nils]";
+ mes "The RO Typing Challenge";
+ mes "is a game where you enter";
+ mes "the given text as quickly as you";
+ mes "can. The name of the top player";
+ mes "is recorded for posterity. If you";
+ mes "want fame, here's your chance!";
+ next;
+ mes "[Nils]";
+ mes "I'd just like to let";
+ mes "you know that you type";
+ mes "all the text that you see";
+ mes "in the single input line that";
+ mes "you're given. So don't press";
+ mes "the enter key, just click 'OK'.";
+ close;
+
+s_Record:
+ mes "[Nils]";
+ mes "^0000FF" + $TypingRecord$ + "^000000";
+ mes "is the current";
+ mes "record holder with";
+ mes "a record of ^0000FF" + $TypingRecord + "^000000";
+ mes "points. Try to beat";
+ mes "that record next time~";
+ close;
+
+}
+
+//============================================================
+//= The Airship System (Yuno -> Izlude -> Repeat)
+//============================================================
+
+airplane_01.gat,243,74,4 script #AirshipWarp-3 45,2,2{
+OnTouch:
+ if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
+ if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
+ end;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane_01.gat,243,29,4 script #AirshipWarp-4 45,2,2{
+OnTouch:
+ if($@airplanelocation2 == 1)warp "izlude.gat",202,56;
+ if($@airplanelocation2 == 2)warp "yuno.gat",20,265;
+
+OnHide:
+ misceffect 16;
+ end;
+OnUnhide:
+ misceffect 215;
+ end;
+}
+
+airplane_01.gat,1,1,0 script YunoIzl_Airship -1,{
+OnInit:
+while(1)
+{
+ initnpctimer;
+ setnpctimer 0;
+ set $@airplanelocation2,0;
+ donpcevent "#AirshipWarp-3::OnHide";
+ donpcevent "#AirshipWarp-4::OnHide";
+ disablenpc "#AirshipWarp-3";
+ disablenpc "#AirshipWarp-4";
+ mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Izlude.",1,0x00FF00;
+ end;
+OnTimer15000:
+ mapannounce "airplane_01.gat","We are heading to Izlude.",1,0x00FF00;
+ end;
+OnTimer30000:
+ mapannounce "airplane_01.gat","We will arrive in Izlude shortly.",1,0x00FF00;
+ end;
+OnTimer45000:
+ set $@airplanelocation2,1;
+ enablenpc "#AirshipWarp-3";
+ enablenpc "#AirshipWarp-4";
+ donpcevent "#AirshipWarp-3::OnUnhide";
+ donpcevent "#AirshipWarp-4::OnUnhide";
+ mapannounce "airplane_01.gat","Welcome to Izlude. Have a safe trip.",1,0x00FF00;
+ end;
+OnTimer55000:
+ mapannounce "airplane_01.gat","Currently, we are in Izlude. The Airship will leave shortly.",1,0x00FF00;
+ end;
+OnTimer65000:
+ set $@airplanelocation2,0;
+ donpcevent "#AirshipWarp-3::OnHide";
+ donpcevent "#AirshipWarp-4::OnHide";
+ disablenpc "#AirshipWarp-3";
+ disablenpc "#AirshipWarp-4";
+ mapannounce "airplane_01.gat","The Airship is leaving the ground. Our next destination is Yuno.",1,0x70DBDB;
+ end;
+OnTimer80000:
+ mapannounce "airplane_01.gat","We are heading to Yuno.",1,0x70DBDB;
+ end;
+OnTimer95000:
+ mapannounce "airplane_01.gat","We will arrive in Yuno shortly.",1,0x70DBDB;
+ end;
+OnTimer110000:
+ set $@airplanelocation2,2;
+ enablenpc "#AirshipWarp-3";
+ enablenpc "#AirshipWarp-4";
+ donpcevent "#AirshipWarp-3::OnUnhide";
+ donpcevent "#AirshipWarp-4::OnUnhide";
+ mapannounce "airplane_01.gat","Welcome to Yuno. Have a safe trip.",1,0x70DBDB;
+ end;
+OnTimer120000:
+ mapannounce "airplane_01.gat","Currently, we are in Yuno. The Airship will take off shortly.",1,0x70DBDB;
+ end;
+OnTimer130000:
+ stoptimer;
+}
+}
+
+//============================================================
+//= Some normal NPCS (airplane_01.gat)
+//============================================================
+
+airplane_01.gat,240,64,5 duplicate(Exit2) Exit#05 857
+
+airplane_01.gat,247,64,5 duplicate(Exit2) Exit#06 857
+
+airplane_01.gat,240,39,1 duplicate(Exit2) Exit#07 857
+
+airplane_01.gat,247,39,1 duplicate(Exit2) Exit#08 857
+
+airplane_01.gat,100,69,2 duplicate(Airship Crew) Airship Crew#02 852
+
+airplane_01.gat,250,59,3 duplicate(AirshipInfo) Airship Staff#info 67
+
+airplane_01.gat,50,66,4 duplicate(AirshipApples) Meltz 86
+
+airplane_01.gat,32,61,4 duplicate(TypingContest) Nils 49
+
+airplane_01.gat,83,61,2 script Girl#10 72,{
+
+ mes "[Dianne]";
+ mes "It's so weird!";
+ mes "I went to visit the";
+ mes "Airship Captain and";
+ mes "all I saw was this";
+ mes "weird reindeer. Oh!";
+ mes "Do you think that...";
+ close;
+
+}
+
+airplane_01.gat,69,63,2 script Old Man#06 55,{
+
+ mes "[Mendel]";
+ mes "As I expected, the";
+ mes "in-flight meals are";
+ mes "three star quality at best.";
+ mes "^111111*Harrrumph*^000000 I really should";
+ mes "have brought my chef so that";
+ mes "I could enjoy a real meal.";
+ close;
+
+}
+
+airplane_01.gat,33,68,4 script Clarice 74,{
+ callfunc "applegamble","Clarice";
+ end;
+}
+
+//============================================================
+//= The Izlude Airship Staff
+//============================================================
+
+izlude.gat,201,54,3 script Airship Staff#izl 91,{
+
+ mes "[Airship Staff]";
+ mes "Welcome to the Izlude Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airship Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto L_GotTicket;
+ if(Zeny < 1200) goto L_NoZeny;
+ set Zeny, Zeny - 1200;
+ warp "airplane_01.gat",224,64;
+ close;
+
+ L_GotTicket:
+ delitem 7311,1;
+ warp "airplane_01.gat",224,64;
+ close;
+
+ L_NoZeny:
+ mes "[Airship Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+//============================================================
+//= The Hugel Airship Staff
+//============================================================
+
+hugel.gat,182,150,3 script Airship Staff#hu 91,{
+
+ mes "[Airship Staff]";
+ mes "Welcome to the Schwartzwald Republic's Airship.";
+ mes "How may I help you?";
+ next;
+ menu "Board the Airship",-,"Cancel",L_Cancel;
+
+ mes "[Airship Staff]";
+ mes "The Airship boarding fee";
+ mes "is 1,200 zeny, but if you've";
+ mes "got a Free Ticket for Airship,";
+ mes "the fee will be waived. Will";
+ mes "you board the Airship?";
+ next;
+ menu "Yes",-,"No",L_Cancel;
+
+ if(countitem(7311) > 0) goto L_GotTicket;
+ if(Zeny < 1200) goto L_NoZeny;
+ set Zeny, Zeny - 1200;
+ warp "airplane.gat",224,64;
+ close;
+
+ L_GotTicket:
+ delitem 7311,1;
+ warp "airplane.gat",224,64;
+ close;
+
+ L_NoZeny:
+ mes "[Airship Staff]";
+ mes "You don't have enough zeny.";
+ close;
+
+ L_Cancel:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+}
+
+//============================================================
+//= Yuno Airport NPCs
+//============================================================
+
+y_airport.gat,144,63,4 script Airport Staff#Ein 91,{
+
+ mes "[Airship Staff]";
+ mes "Good day!";
+ mes "Would you like to go";
+ mes "to ^FF0000Einbroch^000000,^FF0000Hugel^000000 or";
+ mes "^FF0000Lighthalzen^000000?";
+ next;
+ menu "Yes.",s_Warp,"No.",-;
+
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+
+s_Warp:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close2;
+ warp "yuno.gat",57,240;
+ end;
+
+}
+
+y_airport.gat,141,63,4 script Airport Staff#Izl 91,{
+
+ mes "[Airship Staff]";
+ mes "Good day!";
+ mes "Would you like to go";
+ mes "to ^FF0000Izlude^000000?";
+ next;
+ menu "Yes.",s_Warp,"No.",-;
+
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close;
+
+s_Warp:
+ mes "[Airship Staff]";
+ mes "Thank you and";
+ mes "have a nice day.";
+ close2;
+ warp "yuno.gat",50,240;
+ end;
+
+}
+
+//============================================================
+//= Apple Gambling Function
+//============================================================
+
+function script applegamble {
+ mes "["+getarg(0)+"]";
+ mes "Hi, I'm "+getarg(0)+"~";
+ mes "How would you like";
+ mes "to wager some Apples";
+ mes "in a friendly game of Dice?";
+ next;
+ switch(select("Play Dice Game:Learn Dice Game Rules:Cancel")){
+ case 3:
+ mes "["+getarg(0)+"]";
+ mes "I'm up for a game of";
+ mes "dice whenever you feel";
+ mes "like it. Just talk to me if";
+ mes "you ever get hit with the";
+ mes "sudden urge to gamle, kay?";
+ close;
+ case 2:
+ mes "["+getarg(0)+"]";
+ mes "The rules for the Dice game";
+ mes "are pretty simple. First, you";
+ mes "place a bet by wagering Apples.";
+ mes "You can bet a maximum of 50";
+ mes "Apples at a time. To keep things";
+ mes "legal, I can only accept Apples.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "But hey, if all that zeny";
+ mes "is burning a hole in your";
+ mes "pocket, head over to Fruitz";
+ mes "and you can buy as many";
+ mes "Apples as you want, playah~";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now, we begin with me";
+ mes "rolling wto 6-sided dice.";
+ mes "When it's your turn, you'll";
+ mes "roll two 6-sided dice. After";
+ mes "that, both of us will have the";
+ mes "option of rolling a third die.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now here's the important";
+ mes "thing. If your total is higher";
+ mes "than 12, you'll bust, meaning";
+ mes "that you lose. Otherwise, the";
+ mes "person with the higher total";
+ mes "is the winner. Got it?";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Now, you'll be the first";
+ mes "to decide whether or not";
+ mes "you'll roll the third die. Then,";
+ mes "depending on your result, I'll";
+ mes "roll my third die... Or maybe not.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "When you win, you'll";
+ mes "receive twice as many";
+ mes "Apples as you wagered.";
+ mes "But if we happen to tie, you";
+ mes "get the Apples that you bet";
+ mes "returned to you. Fair, right?";
+ close;
+ case 1:
+ break;
+ }
+ mes "["+getarg(0)+"]";
+ mes "Ooh, so you'll play with";
+ mes "me? Great! How many";
+ mes "Apples would you like to bet?";
+ mes "Remember, you can wager";
+ mes "up to 50 Apples. If you'd like";
+ mes "to cancel, please enter '0'.";
+ next;
+L_Input:
+ input @amount;
+ if(@amount == 0) {
+ mes "["+getarg(0)+"]";
+ mes "Changed your mind?";
+ mes "I understand. Well then,";
+ mes "I hope we can play sometime.";
+ close;
+ }
+ if(@amount > 50) set @amount,50;
+ mes "["+getarg(0)+"]";
+ mes "So you'll be";
+ mes "betting ^FF0000"+@amount+"^000000 Apples.";
+ mes "Is that right?";
+ next;
+ if(select("Yes:No")==2){
+ mes "["+getarg(0)+"]";
+ mes "Mm, made a mistake?";
+ mes "Alright, please enter the";
+ mes "number of Apples you";
+ mes "wish to place in this bet";
+ next;
+ goto L_Input;
+ }
+ if(countitem(512)<@amount){
+ //more apples then in inventory
+ //-Improvised-
+ mes "["+getarg(0)+"]";
+ mes "Ooh...";
+ mes "You don't have that";
+ mes "much Apples with you,";
+ mes "now do you?";
+ close;
+ }
+ delitem 512,@amount;
+ mes "["+getarg(0)+"]";
+ mes "Good!";
+ mes "Now we can start";
+ mes "this game! I'll roll first~";
+ next;
+ mes "^0000FF*Rolling and rumbling*";
+ set @table1,rand(1,6);
+ set @table2,rand(1,6);
+ set @tablesub,@table1+@table2;
+ next;
+ mes "I rolled a "+@table1+" and a "+@table2+",";
+ mes "giving me a total of "+@tablesub+".";
+ mes "Now it's your turn,";
+ mes strcharinfo(0)+".";
+ next;
+ menu "Roll Dice.",-;
+
+ mes "^0000FF*Rolling and rumbling*";
+ set @player1,rand(1,6);
+ set @player2,rand(1,6);
+ set @playersub,@player1+@player2;
+ next;
+ mes "["+getarg(0)+"]";
+ mes strcharinfo(0)+",";
+ mes "you rolled a "+@player1+" and a "+@player2+",";
+ mes "giving you a total of ^FF0000"+@playersub+"^000000.";
+ next;
+ mes "["+getarg(0)+"]";
+ if(@playersub == @tablesub) {
+ mes "Well, well, well.";
+ mes "Both of us have a total";
+ mes "of "+@playersub+". Well, the ball's in";
+ mes "your court. Are you going";
+ mes "to roll your third die,";
+ mes strcharinfo(0)+"?";
+ } else if(@playersub > @tablesub) {
+ mes "Since my total is only ^0000FF"+@tablesub+"^000000,";
+ mes "you have the advantage for";
+ mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
+ mes "you wanna roll one more die?";
+ mes "Remember, you'll bust if all three";
+ mes "of your dice total more than 12.";
+ } else if(@tablesub > @playersub) {
+ mes "Since my total is ^0000FF"+@tablesub+"^000000,";
+ mes "I have the advantage for";
+ mes "now with your total of ^FF0000"+@playersub+"^000000. Do";
+ mes "you wanna roll one more die?";
+ mes "Remember, you'll bust if all three";
+ mes "of your dice total more than 12.";
+ }
+ next;
+ if(select("Roll another dice.:Don't Roll.")==2){
+ mes "["+getarg(0)+"]";
+ mes "Not gonna roll, huh?";
+ if(@tablesub == @playersub) {
+ mes "You better hope I roll";
+ mes "too high and bust, or";
+ mes "I'll beat you for sure!";
+ mes "Okay, here goes nothing...";
+ next;
+ goto L_Table3;
+ } else if(@tablesub < @playersub) {
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Alright, I see that you";
+ mes "don't want to risk rolling";
+ mes "higher than 12 and busting.";
+ mes "I'll go ahead and roll then.";
+ next;
+ goto L_Table3;
+ } else if(@tablesub > @playersub) {
+ //you have a lower sub total then table, and do not roll 3th -Improvised-
+ mes "["+getarg(0)+"]";
+ mes "Not gonna roll, huh?";
+ mes "Well, then I'm not";
+ mes "gonna roll either.";
+ next;
+ mes "["+getarg(0)+"]";
+ mes "That means that I";
+ mes "have a total of ^0000FF"+@tablesub+"^000000";
+ mes "wich beats your ^FF0000"+@playersub+"^000000.";
+ mes "I'm sorry, but you lose";
+ mes "this game, "+strcharinfo(0)+". Better";
+ mes "luck next time.";
+ }
+ close;
+ }
+ mes "^0000FF*Rolling and rumbling*";
+ set @player3,rand(1,6);
+ set @playersub,@playersub+@player3;
+ if(@playersub > 12) {
+ //player bust --Improvised--
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Oh my... You rolled a ^FF000"+@player3+"^000000,";
+ mes "making your total ^FF0000"+@playersub+"^000000.";
+ mes "That's more then 12, meaning you bust.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+".";
+ close;
+ }
+ next;
+ mes "["+getarg(0)+"]";
+ mes "Oh hey! You rolled";
+ if(@playersub >= @tablesub) {
+ mes "a ^FF0000"+@player3+"^000000, giving you a total";
+ mes "of ^FF0000"+@playersub+"^000000. Now, if I don't";
+ mes "roll, I'll lose for sure!";
+ mes "I'm gonna go for it...";
+ next;
+ goto L_Table3;
+ } else if(@playersub < @tablesub) {
+ //player's sub together with 3th die is still too low
+ //--Improvised--
+ mes "a ^FF0000"+@player3+"^000000, giving";
+ mes "you a total of ^FF0000"+@playersub+"^000000.";
+ mes "Wich still isn't enough";
+ mes "to beat my ^0000FF"+@tablesub+"^000000.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+". Them's";
+ mes "the breaks, I suppose...";
+ close;
+ }
+L_Table3:
+ mes "^0000FF*Rolling and rumbling*";
+ set @table3,rand(1,6);
+ set @tablesub,@tablesub+@table3;
+ next;
+ if(@tablesub > 12) {
+ mes "["+getarg(0)+"]";
+ mes "Eh? I rolled a ^0000FF"+@table3+"^000000, making";
+ mes "my total ^0000FF"+@tablesub+"^000000. I hate to say";
+ mes "it, but I gambled and lost.";
+ mes "Take your winnings before";
+ mes "I cry, "+strcharinfo(0)+"~!";
+ close2;
+ getitem 512,@amount*2;
+ end;
+ }
+ mes "["+getarg(0)+"]";
+ if(@tablesub < @playersub) {
+ mes "I rolled a "+@table3+", which";
+ mes "gives me a total of ^0000FF"+@tablesub+"^000000.";
+ mes "But... It's still not enough";
+ mes "to beat your ^FF0000"+@playersub+"^000000. It looks";
+ mes "like I can't compete with";
+ mes "you, "+strcharinfo(0)+"...";
+ close2;
+ getitem 512,@amount*2;
+ end;
+ } else if(@tablesub > @playersub) {
+ mes "I rolled a ^0000FF"+@table3+"^000000, giving";
+ mes "me a total of ^0000FF"+@tablesub+"^000000 which";
+ mes "beats your total of ^FF0000"+@playersub+"^000000.";
+ mes "Sorry, but you lose this";
+ mes "game, "+strcharinfo(0)+". Them's";
+ mes "the breaks, I suppose...";
+ close;
+ } else if(@tablesub == @playersub) {
+ //Result = tie, --Improvised--
+ mes "I rolled a ^0000FF"+@table3+"^000000, giving";
+ mes "me a total of ^0000FF"+@tablesub+"^000000, which";
+ mes "is the same as your total.";
+ mes "Well, this game didn't have a";
+ mes "winner or loser, "+strcharinfo(0)+".";
+ close2;
+ getitem 512,@amount;
+ end;
+ }
+}
diff --git a/npc/quests/WIP/schwalz.txt b/npc/quests/WIP/schwalz.txt
index 3ad7116c3..4d229a07f 100644
--- a/npc/quests/WIP/schwalz.txt
+++ b/npc/quests/WIP/schwalz.txt
@@ -1,1046 +1,1046 @@
-//===== eAthena Script =======================================
-//= Lighthalzen, Swaltzwalt Quest Part 1
-//= Lighthalzen, Swaltzwalt Quest Part 2
-//= Lighthalzen, Swaltzwalt Quest Part 3
-//===== By: ==================================================
-//= Gravity official script
-//= CallNix (Part 1)
-//= dunkle (Part 2 & 3)
-//===== Current Version: =====================================
-//= 1.0 working version
-//= 1.1 fixed bug with wrong valuable [dunkle]
-//= added and deleted some checks [dunkle]
-//= fixed warps (but they are wrong) [dunkle]
-//= fixed enabling of A Fine Gentleman [dunkle]
-//= fixed bug with reward [dunkle]
-//= 1.2 fixed bug in part with overflow timer (now you must wait untill next day, not 12 hours) [dunkle]
-// changed some valuables [dunkle]
-// fixed bugs in The broken Manufactoring [dunkle]
-//= 1.2b fixed timer Ordinary Man [dunkle]
-//= 1.3 fixed part1 bugs [dunkle]
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//=
-//=
-//===== Additional Comments: =================================
-//In alchemist_skills.txt comment because I use this NPC in the script:
-//lhz_in01.gat,285,169,7 script Researcher#2 865,{
-//Unknown Text
-// mes "[Researcher]";
-// mes "Hmm... I wonder...";
-// close;
-//}
-//
-//============================================================
-
-
-yuno_pre.gat,79,69,0 warp inside_pre01 1,1,yuno_pre.gat,97,68
-yuno_pre.gat,113,50,0 warp inside_pre02 1,1,yuno_pre.gat,58,22
-yuno_pre.gat,54,22,0 warp inside_pre03 1,1,yuno_pre.gat,113,55
-lhz_in01.gat,275,234,0 warp inside_pre04 1,1,lhz_in01.gat,277,161 //Çäåñü ïîðòàëû ïîñòàâèë íàîáóì, â ìåñòå îêîëî äâåðè,
-lhz_in01.gat,277,157,0 warp inside_pre04 1,1,lhz_in01.gat,275,231 //ãäå íå áûëî äðóãîãî ïîðòàëà :
-
-//OnInit!
-prontera.gat,0,0,0 script swarzwalt_trilogy -1,1,1{
-OnInit:
-disablenpc "kurelle";
-disablenpc "President's Secretary#2";
-disablenpc "Security#2";
-disablenpc "area 1-5";
-disablenpc "Kurelle#1";
-set $SCHWALTZVALT_DOOR_FLAG,0;
-stopnpctimer "schwalt2timer";
-end;
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-//Beginning. Lighthalzen, Swaltzwalt Quest Part 1/////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-lighthalzen.gat,179,170,4 script Ordinary man 48,{
-if (SCHWALTZVALT_PART2==23) {
- mes "[Ghalstein]";
- mes "arrr...";
- mes "is you....";
- mes ".....";
- mes "Now? verything finish...";
- mes "dream...vision";
- next;
- mes "[Ghalstein]";
- mes "arr..most forgot...";
- mes "This is your...";
- mes "...cure...";
- mes "Take this pill,";
- mes "You'll never have to take it";
- mes "anymore...";
- next;
- mes "[Ghalstein]";
- mes ".......";
- mes "We'll never meet each other anymore..";
- getitem 617,1; //Old Violet Box
- getexp 1800000,0; //Exp 1800000
- set dtseligible , 1; //Here is Voting Right (dts warper)
- set SCHWALTZVALT_PART2, 24;
- close;
- }
-
-
-if (questpass_swaltwaltp1==1) goto l_alreadydone;
-if ( (SCHWALTZVALT_PART1==2) || (SCHWALTZVALT_PART1==3) ) goto Quest_enable;
-if ( (SCHWALTZVALT_PART1==1) && (gettime(5)!=schwalzday) ) goto L_NEXTDAY;
-if (SCHWALTZVALT_PART1==1) goto l_hadspoken;
-mes "[Ghalstein]";
-mes "Hello,";
-mes "is this a great city?";
-menu "Hello",-,"This is a great city indeed",L_GREAT,"is still ok",L_OK;
-next;
-mes "[Ghalstein]";
-mes " Yes, It a nice day. I wish you have good time in our city. See you later";
-close;
-
-L_OK:
-next;
-mes "[Ghalstein]";
-mes "I like such sunny days... In such beautiful town...";
-close;
-
-L_GREAT:
-next;
-mes "[Ghalstein]";
-mes "Well. This great city is only for really great people.";
-mes "I wish you have good time here. Enjoy.";
-close2;
-mes "[??????]";
-mes "is here";
-mes "......";
-mes "[??????]";
-mes "hurry before we let people discover";
-mes "us...";
-mes "heard a familiar sound";
-menu "Continue listen",l_listen,"do not listen",l_nolisten;
-
-l_listen:
-next;
-mes "[??????]";
-mes "Its all as we suposed to... Everything is similar to our plan";
-mes "[??????]";
-mes "Yes, thats really cool.";
-next;
-mes "[??????]";
-mes "PSSS. Be silent";
-mes "I think somebody else is here listening us. We will meet the other day.";
-mes "[??????]";
-mes "I agree";
-set SCHWALTZVALT_PART1,1;
-set schwalzday, gettime(5);
-close;
-end;
-
-l_nolisten:
-next;
-mes "["+strcharinfo(0)+"]";
-mes "I dont think this is interesting for me.";
-close;
-end;
-
-L_NEXTDAY:
-mes "[Ghalstein]";
-mes "hi, how are you,";
-mes "today weather is good?";
-menu "Yes",l_da,"but last night",-;
-next;
-mes "[Ghalstein]";
-mes "What was last night? I've heard nothing about it. Anything strange had happened?";
-menu "I've heard you speaking to somebody about strange things.",-,"Nothing, sorry",L_NOTHING;
-next;
-mes "[Ghalstein]";
-mes "I think you are mistaken guy. I dont know what are you talking about";
-menu "Dont make a fool from me.",-,"Ok, sory",L_NOTHING;
-next;
-mes "[Ghalstein]";
-mes "I say you, that i hadn't speak to anybody yesterday.Hey, Protector come here plese";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "..........";
-mes "if really not him, he shouldn't";
-mes "denied it so strongly";
-mes "..........";
-next;
-mes "[Protector]";
-mes "I have no intention to";
-mes "interrogation you?";
-mes "just because...";
-menu "The matter that Mr.Ghalstein dealing with..",-,"i feel curious about it?",l_curious;
-next;
-mes "["+strcharinfo(0)+"]";
-mes "I clearly remember him talking to somebody about some strange plans. I think he is planning something restrickted...";
-next;
-mes "[Protector]";
-mes "Hm... Is that so mr. Ghalstein? Do you remember the constitution? Tell us the truth, or i shall arrest you";
-next;
-mes "[Ghalstein]";
-mes "oh.. Ok. I was speaking about our community. Nothing interesting...";
-next;
-mes "[Protector]";
-mes "Ok. Its about your Fishing clan? If so, i leave you. See you later";
-next;
-mes "[Ghalstein]";
-mes "Well, I will tell you the truth. Please give me sometime to consider....";
-mes "I belong to a secret group that antagonistic with another group and so we need some items";
-mes "to be protected. So we were going to organize a trip to Reagent Shaw Research Center.";
-next;
-mes "[Ghalstein]";
-mes "You can get there if you have passed BioLab quest. Its the second and third lvl.";
-mes "But we have no brave to go there. What about helping us?";
-menu "Ok, i shall help",-,"No,thanks",L_NOTHX;
-next;
-mes "[Ghalstein]";
-mes "well then.But you must take this pill to go this quest. This pill will add some status to you.";
-mes "when you shall finish quest - i will delete this status from your char.Is it OK with you?. I think It is.";
-if ( checkweight(7226,1) == 0 ) goto l_overweight;
-getitem (7226),1;
-next;
-mes "[Ghalstein]";
-mes "I want you to collect all related biological exhibit and no need big quantity plus the most important thing.";
-mes "You will simply recognize that things";
-mes "There are some strange mobs there. So be careful. And last...People who go there dissapear. Nobody was back from there...";
-next;
-mes "[Ghalstein]";
-mes "So you had to go to 2 and 3 lvl of BioLab. Be sure you have finish this quest. And bring me 10 Lab staff records, 10 Armlet of prisoner and 1 Pile of Imir heat";
-set SCHWALTZVALT_PART1,2;
-
-set schwalzday,0;
-close;
-
-l_curious:
-mes "[Ghalstein]";
-mes "even so i dont want to speak to smb who say such fool things. Cya.";
-close;
-
-L_NOTHX:
-mes "[Ghalstein]";
-mes "ye, its a pity i think. Have a nice day";
-close;
-
-L_NOTHING:
-mes "[Ghalstein]";
-mes "I've never think guy like you can think this way about me. I dont want to speak to you anymore";
-close;
-
-l_overweight:
-mes "["+strcharinfo(0)+"]";
-mes "sorry you can't take this item";
-close;
-
-
-Quest_enable:
-if (countitem (7345) >= 10) && (countitem(7347) >=10) && (countitem(7346) >=1) goto Quest_end;
-mes "[Ghalstein]";
-mes "You havent geather items yet. Come back when you should.";
-close;
-
-Quest_end:
-mes "[Ghalstein]";
-mes "Well done. You have finished my part of quest.";
-mes "Now, Visit Gushaar. He can be found sowhere around Yuno.";
-next;
-mes "[Ghalstein]";
-mes "Yes, i have forgotten....";
-mes "Now you are member of society Wind of Secret!";
-mes "congratulations!";
-delitem (7345),10;
-delitem (7347),10;
-delitem (7346),1;
-getitem (7226),1;
-getitem (7348),1;
-set questpass_swaltwaltp1,1;
-close;
-
-l_hadspoken:
-mes "[Ghalstein]";
-mes "Sorry, but i have nothing to say to you anymore. Buy.";
-close;
-
-l_da:
-mes "[Ghalstein]";
-mes "Im happy you have time to think so too. See you";
-close;
-
-l_alreadydone:
-mes "["+strcharinfo(0)+"]";
-mes "I have already done this quest. I dont want to go there once more time!";
-close;
-}
-//=======================================================================
-lhz_dun02.gat,268,287,4 script The broken Manufactoring 111,{
-if SCHWALTZVALT_PART1!=2 goto l_end;
-mes "[The broken Manufactoring]";
-mes "You see something shining inside the spoiling machines.Open up the machinr and check it,detected a round shape";
-mes "object wich circulate with a mysterious shines.";
-menu "Its seems like an important object",-,"But it looks nothing musch",l_nottake;
-getitem(7346),1;
-set SCHWALTZVALT_PART1,3;
-mes "["+strcharinfo(0)+"]";
-mes "Well, Now i suppose everything will be ok.";
-close2;
-npctalk "Creeep... Creeeep-Creep...*pfu*.";
-mes "["+strcharinfo(0)+"]";
-mes "Oooops....I dont think this machien will work anymore... I'll go better from here";
-close;
-end;
-l_nottake:
-close;
-
-l_end:
-mes "You see nothing there...";
-close;
-}
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-//Ending. Lighthalzen, Swaltzwalt Quest Part 1/////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-//NPC01 - Dismal Guy
-yuno_fild04.gat,165,245,5 script Dismal Guy 89,{
-if (SCHWALTZVALT_PART2>0) {
- mes "[Dismal Guy]";
- mes "Make your mission..we need you..";
- close;
- }
-mes "[Dismal Guy]";
-mes "Maybe you have some thing to show me?";
-menu "Yeah, I have it",-,"I don't know what do you mean",DG_end01;
-if ((countitem(7348)==0) || (questpass_swaltwaltp1!=1)) { //Membership Card, Çäåñü ïðîâåðêà, ïðîéäåíà ëè ïåðâàÿ ÷àñòü êâåñòà
- next;
- mes "[Dismal Guy]";
- mes "You are trying to cheat me?";
- mes "You don't have item which I am interesting in..";
- mes "Bye! Come back, when you will have what I want.";
- close;
- }
-//next;
-//mes "[Dismal Guy]";
-//mes "emm....";
-//mes "got red and blue pill,";
-//mes "which one you choose?";
-//menu "Red pill",-,"Blue pill",-; //Íàäî óçíàòü, ÷òî áóäåò åñëè âûáðàòü ñèíèþ ïèëþëþ (ïî èäåè â ïåðâîé ÷àñòè ÍÏÖ ìîæåò äàòü ëìáî ñèíþþ, ëèáî êðàñíóþ, íî ò.ê. îí äàåò ïðîñòî ïèëþëþ, òî çäåñü åñòåñíî ýòî íåíóæíî)
-//mes "Nowadays isn't the best time to live..";
-next;
-mes "[Dismal Guy]";
-mes "Schwaltzvalt is control by evil ^0000FFRekenber Enterprise^000000";
-mes "But we have organized a resistance called ^FF0000Wing Of Secret^000000 with the help of the President ^0000FFKarl Weierstrass^000000 to reform Schwaltzvalt Republic from the control of ^0000FFRekenber Enterprise^000000!";
-next;
-mes "[Dismal Guy]";
-mes "I have a task for you.";
-mes "You need to meet the candidate which won the president election ^0000FFKarl Weierstrass^000000";
-mes "He wants to reform Schwaltzvalt Republic from the control of ^0000FFRekenber Enterprise^000000";
-next;
-mes "[Dismal Guy]";
-mes "If you will unable to see ^0000FFKarl Weierstrass^000000, coordinate with his secrtary in Yuno at appointed time.";
-mes "The best time will be betwen 8pm to 11pm or betwen 11am to 2pm";
-set SCHWALTZVALT_PART2, 1; //Ïåðâûé ÍÏÖ ïðîéäåí, òåïåðü ìîæíî ê ñåêðåòàðþ.
-next;
-mes "[Dismal Guy]";
-mes "The fate of the whole Republic in your brave hands! Bye!";
-close;
-
-DG_end01:
-next;
-mes "[Dismal Guy]";
-mes "It'a a pity, I am finding you a good person..";
-close;
-}
-
-//NPC02 - President's Secretary
-yuno_pre.gat,69,20,5 script President's Secretary::pre 862,{
-if (SCHWALTZVALT_PART2==4) {
- mes "[Hes O'Neil]";
- if(countitem(7342)==0) {mes "Where is documemt?";close;} //Çäåñü ÈÄ äîêóìåíòà, íàäî óçíàòü ó Ëóïóñà.
- delitem 7342,1; //Çäåñü ÈÄ äîêóìåíòà, íàäî óçíàòü ó Ëóïóñà.
- mes "Thanks a lot!";
- set SCHWALTZVALT_PART2, 5; //Òåïåðü ñ ñåêðåòàðøåé âî âòîðîé ðàç âñå, èäåì ê Venice
- close;
- }
-if (SCHWALTZVALT_PART2>=2) {
- mes "[Hes O'Neil]";
- mes "I glad to see you again!";
- close;
- }
-
-if ( (gettime(3)>23) && (gettime(3)<11) ) || ( (gettime(3)>14) && (gettime(3)<20) ) {
- mes "[Hes O'Neil]";
- mes "It isn't reception time.";
- mes "Come back betwen 8pm to 11pm or betwen 11am to 2pm.";
- close;
- }
-
-
-mes "[Hes O'Neil]";
-mes "Who are you?";
-mes "How can I help?";
-menu "emm..",-,"Meet up with Mr.President",PS_meet,"Nothing",PS_end01;
-
-if (SCHWALTZVALT_PART2==1) {
- next;
- mes "[Hes O'Neil]";
- mes "Heh, you don't know how to explain youself:)";
- mes "But I know that Mr.President is waiting for you. Good Luck!";
- set SCHWALTZVALT_PART2, 2; //Âòîðîé ÍÏÖ ïðîéäåí, äàëåå ê ñòðàæíèêó.
- close;
- }
-
-next;
-mes "[Hes O'Neil]";
-mes "What do you want?";
-mes "Don't waste my time please!";
-close;
-
-PS_meet:
-next;
-mes "[Hes O'Neil]";
-mes "Sorry, but Mr.President is very busy.";
-//emotion 14; //sry
-close;
-
-PS_end01:
-next;
-mes "[Hes O'Neil]";
-mes "Sorry, I did't help you:(";
-//emotion 14; //sry
-close;
-}
-
-yuno_pre.gat,75,71,3 duplicate(pre) President's Secretary#2 862,0,0
-
-//NPC03 - Security
-yuno_pre.gat,95,71,5 script Security::sec 899,5,5 {
-if (SCHWALTZVALT_PART2==4) {
- mes "[Security]";
- mes "Mr.President still meeting with other person.";
- close;
- }
-if (SCHWALTZVALT_PART2>=3) {
- mes "[Security]";
- mes "Mr.Presideny is free now. You can come in.";
- close2;
- warp "yuno_pre.gat",75,70;
- end;
- }
-if (SCHWALTZVALT_PART2!=2) {
- mes "[Security]";
- mes "Nobody has disposed to pass you!";
- close;
- }
-if (rand(9)!=0) {
- mes "[Security]";
- mes "Please hold on for a moment.";
- mes "Mr.President still meeting with other person.";
- close;
- }
-enablenpc "kurelle";
-mes "[Keshnaar]";
-mes "Mr.President denied my petition about medical marihuana...";
-//emotion 25; //sob
-next;
-mes "[Keshnaar]";
-mes "I have collected 1000 signatures of the townspeople and nothing...";
-//emotion 25; //sob
-next;
-mes "[Keshnaar]";
-mes "Ok I must go and collect more signatures!";
-next;
-disablenpc "A Fine Gentleman";
-
-mes "[Security]";
-mes "Now Mr.President is free, you can pass.";
-G_menu:
-menu "Ok",S_warp,"Who is he?",-;
-next;
-mes "[Security]";
-mes "Are you talking about Mr.Keshnaar?";
-mes "Mr.Keshnaar works for Rekenber. He consulted with Mr.President.";
-next;
-goto G_menu;
-
-S_warp:
-set SCHWALTZVALT_PART2, 3; //Ó îõðàííèêà âñå, òåïåðü ê ïðåçèäåíòó.
-close2;
-warp "yuno_pre.gat",75,70;
-
-OnTouch:
-if (SCHWALTZVALT_PART2==4) {
- mes "...Suddenly your heard voices behind the door...";
- mes "...but is too slighty, can't heard clearly...";
- next;
- mes "[?????]";
- mes "...is true..";
- mes "so........";
- mes "......president...";
- mes "[?????]";
- mes "..their Investigation...";
- mes ".........";
- mes "....trap....";
- mes "[?????]";
- mes "...stop them....how?";
- mes ".....,surely...";
- mes "[?????]";
- mes "next?...election...";
- mes "....elected...";
- next;
- mes "...the sound became more slighty...";
- mes "...can't heard anymore...";
- close;
- }
-}
-
-//NPC04 - A Fine Gentleman
-yuno_pre.gat,96,69,3 script A Fine Gentleman::kurelle 82,{
-close;
-}
-//NPC - KURELLE
-yuno_pre.gat,69,74,0 duplicate(kurelle) Kurelle#1 109,0,0
-
-//NPC - Security in presidents room
-yuno_pre.gat,76,72,8 duplicate(sec) Security#2 899,0,0
-
-//NPC05 - President Karl
-yuno_pre.gat,69,79,5 script President Karl 872,{
-cutin "lhz_karl",2;
-if (SCHWALTZVALT_PART2==22) {
- mes "...after the story about traitor ^FF0000Kurelle^000000 president looks stunned...";
- next;
- mes "[President Karl]";
- mes "CALL MY SECRETARY NOOOOOOW!!!";
- next;
- mes ".....";
- next;
- enablenpc "President's Secretary#2";
- mes "...Secretary looks too afraid...";
- next;
- cutin "",255;
- mes "[Hes O'Neil]";
- mes "Yes sir! What is your oders?";
- next;
- cutin "lhz_karl",2;
- mes "[President Karl]";
- mes "INVITE THIS TRAITOR ^FF0000KURELLE^000000 NOOOOW!!!";
- next;
- disablenpc "President's Secretary#2";
- mes ".....";
- next;
- enablenpc "Kurelle#1";
- mes "[President Karl]";
- mes "What happened? Why did you betray us?";
- next;
- cutin "",255;
- mes "[Kurelle]";
- mes "You are right. I did it. I report all of your actions to the enterprise...";
- mes "I did it by myself.";
- next;
- mes "[Kurelle]";
- mes "When I carry on my plan, I meet with Rekenber people who are monitoring you...ha-ha!";
- next;
- mes "[Kurelle]";
- mes "Therefore I take those opportunity to propose them my plan,";
- mes "I provide information t0 them, to force you step down, I WILL BE THE NEXT PRESIDENT!!! HA-HA-HA";
- next;
- mes "[Kurelle]";
- mes "Although you'll not step down sp soon...but your team will lost seriously!";
- next;
- mes "[Kurelle]";
- mes "Yeap, your era is gone...";
- mes "Now you can't do anything, just waiting to step down then is enough...";
- mes "Ha ha...";
- next;
- cutin "lhz_karl",2;
- mes "[President Karl]";
- mes "SECURITY!!!";
- enablenpc "Security#2";
- next;
- next;
- mes "[President Karl]";
- mes "He is crazy!! Jail him now!";
- next;
- cutin "",255;
- mes "[Security]";
- mes "Yes sir!";
- disablenpc "Security#2";
- disablenpc "Kurelle#1";
- next;
- cutin "lhz_karl",2;
- mes "[President Karl]";
- mes "It is the end of our Rebublic..";
- mes "Soon it will fall..";
- next;
- mes "[President Karl]";
- mes "Thank you brave man ..";
- mes "...go away. Now I must stay here and wait the END..";
- set SCHWALTZVALT_PART2, 23;
- cutin "",255;
- close;
- }
-if (SCHWALTZVALT_PART2==20) {
- mes "[President Karl]";
- mes "Very interesting...";
- mes "With this information can give enterprise a big hit.";
- if(countitem(7343)==0) {mes "Where is documemt?";cutin "",255; close;} //Sealed documemt
- delitem 7343,1; //Sealed documemt
- next;
- mes "[President Karl]";
- mes "But I can't understand why should we withdraw our members?...";
- mes "...can you go to Esuna and ask her for reasons?";
- set SCHWALTZVALT_PART2, 21; //Îáðàòíî ê Åñóíå! (èçäåâàòåëüñòâî äëÿ èãðîêîâ:))))
- cutin "",255;
- close;
- }
-if (SCHWALTZVALT_PART2==18) {
- mes "[President Karl]";
- mes "It can't be true! You broght me a file containing all details of the Shinokas case!! ";
- if(countitem(7344)==0) {mes "Where is Shinokas documemt?";cutin "",255; close;} //Shinokas documemt
- delitem 7344,1; //Shinokas documemt
- set SCHWALTZVALT_PART2, 19; //Îáðàòíî ê Åñóíå!
- next;
- mes "...President Karl attentivly looking thought the papers...";
- next;
- mes "[President Karl]";
- mes "The death of ^FF0000Shinokas^000000...";
- mes "It is not important for us..";
- mes "The most important thing is what they are going to do with ^0000FFYmir Heart Piece^000000 what is their main purpose.";
- next;
- mes "[President Karl]";
- mes "I heard that when you are on the way to me. ^FF0000Esuna^000000 gained new information.";
- mes "Bye! I will be waiting for new information. ";
- cutin "",255;
- close;
- }
-if (SCHWALTZVALT_PART2==9) {
- mes "[President Karl]";
- mes "Ohh! You brought me this secret document!? You are awesome!";
- if(countitem(7343)==0) {mes "Where is documemt?";cutin "",255; close;} //Sealed Document
- delitem 7343,1; //Sealed Document
- mes "Let's see...";
- next;
- mes "[President Karl]";
- mes "...";
- next;
- mes "[President Karl]";
- mes "It is very-very interesting! One of ^0000FFRekenber Enterprise^000000 researcher is hiding in a secret place!";
- mes "He knows some secret!!!!! His name is ^FF0000Shinokas^000000";
- mes "...and the secret place is...";
- next;
- mes "[President Karl]";
- mes "...^FF0000Einbroch^000000";
- mes "So..your second mission is to find ^FF0000Shinokas^FF0000 in ^FF0000Einbroch^000000 and to know his secret!";
- next;
- mes "[President Karl]";
- mes "Do you have any questions?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Yes...I hane one..";
- mes "Shinikas is...";
- next;
- cutin "",255;
- enablenpc "Security#2";
- enablenpc "President's Secretary#2";
- next;
- mes "[Secutity]";
- mes "Mr.President, Mrs.Hes O'Neil has urgent matter to see you. ";
- next;
- mes "...Mrs.Hes O'Neil brooght to the President a pack of documents...";
- next;
- cutin "lhz_karl",2;
- mes "[President Karl]";
- mes "Thanks to Mrs.Hes O'Neil we found a secret file! It is in the store room of ^0000FFReagent Belfa Headquater^000000";
- next;
- mes "[President Karl]";
- mes "Ok. Go somewhere around ^FF0000Lighthalzen^000000, waiting for ^FF0000kafra service^000000 to contact with you.";
- set SCHWALTZVALT_PART2, 10; //Âçÿëè âòîðóþ ìèññèþ ó Ïðåçèäåíòà,
- next;
- disablenpc "Security#2";
- disablenpc "President's Secretary#2";
- cutin "",255;
- close;
- }
-if (SCHWALTZVALT_PART2>=4) {
- mes "[President Karl]";
- mes "See ya!";
- cutin "",255;
- close;
-}
-if (SCHWALTZVALT_PART2<3) {
- mes "[President Karl]";
- mes "Who are you doing here?!";
- next;
- mes "[President Karl]";
- mes "Secutity!!!!";
- cutin "",255;
- close2;
- warp "yuno.gat",153,313;
- }
-mes "[President Karl]";
-mes "I believe, you have many questions but.. ";
-mes "...I am very busy, so the time I have is limited.";
-
-PK_menu01:
-menu "Objective of the ^FF0000Wing Of Secret^000000f",PK_obj01,"Objective of the ^0000FFRekenber Enterprise^000000",PK_obj02,"What is my Mission?",-;
-
-next;
-mes "[President Karl]";
-mes "The first mission is to go ^0000FF'Aldebaran Kafra Headquater'^000000 to meet a guy called ^FF0000 Venice^000000. Then he will let you know what to do." ;
-next;
-mes "[President Karl]";
-mes "One more thing...";
-mes "Please, bring this document to ^FF0000Hes O'Neil^000000. Then you can continue your mission.";
-getitem 7342,1; //File Folder
-set SCHWALTZVALT_PART2, 4; //Ñ Ïðåçèäåíòîì ïîêà âñå, èäåì ê ñåêðåòàðøå îïÿòü.
-cutin "",255;
-close;
-
-PK_obj01:
-next;
-mes "[President Karl]";
-mes "It is resistance organization which try to reform Schwaltzvalt Republic with my help.";
-mes "Before I was elected I was the member of this organization.";
-mes "We should not admit the control of authority by ^0000FFRekenber Enterprise^000000!!!";
-goto PK_menu01;
-
-PK_obj02:
-next;
-mes "[President Karl]";
-mes "^0000FFRekenber Enterprise^000000 - the worst organization in Rune Midgard!!";
-mes "They try to get power.";
-mes "To make the prices in shops is more expensive, to receive greater taxes from the townspeople, to start up development Rune Midgard on a way of fear and terror.";
-goto PK_menu01;
-}
-
-//NPC06 - Venice
-aldeba_in.gat,155,240,3 script Kafra Employee 859,{
-if (SCHWALTZVALT_PART2==7) {
- if(countitem(7343)==0) {mes "Where is documemt?";close;} //Çäåñü ÈÄ äîêóìåíòà
- delitem 7343,1; //Sealed Document
- mes "[Venice]";
- mes "That is great!! You got this document!";
- next;
- mes "[Venice]";
- mes "And how is Jargeah? Where is he?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "He is....";
- next;
- mes "[Venice]";
- mes "I see...";
- mes "Here is document, give it to the President!";
- getitem 7343,1; //Sealed Document
- set SCHWALTZVALT_PART2, 9; //C Venice âî âòîðîé ðàç ïîêîí÷åíî, èäåì îòäàâàòü äîêóìåíò ê Ïðåçèäåíòó.
- close;
- }
-if (SCHWALTZVALT_PART2==6) {
- mes "[Venice]";
- mes "Find Jargeah please!";
- close;
- }
-mes "["+strcharinfo(0)+"]";
-mes "Can I know... are you Venice?";
-next;
-if (SCHWALTZVALT_PART2!=5) {
- mes "[Kafra Employee]";
- mes "May be yes and may be no!";
- mes "I am thinking, go away!";
- close;
- }
-mes "[Venice]";
-mes "Yes, I am Venice.";
-mes "What can I do for you?";
-
-menu "Let her see the logo",-,"Nothing",V_end01;
-
-next;
-mes "[Venice]";
-mes "Now I think that I can trust you..";
-next;
-mes "[Venice]";
-mes "I am the member of ^FF0000Wing Of Secret^000000 organization.";
-mes "I got terrible news...";
-next;
-mes "[Venice]";
-mes "With our agent something happened on the half way between ^FF0000Lighthalzen^000000 and ^FF0000Einbroch^000000 in ^FF0000Grim Reaper's Valley^000000.";
-mes "He needs help, his name is ^FF0000Jargeah^000000. Hurry up please!";
-set SCHWALTZVALT_PART2, 6; //Ñ Venice â ïåðâûé ïîêîí÷åíî èäåì èñêàòü Jargeah
-close;
-
-
-V_end01:
-next;
-mes "[Venice]";
-mes "Ok, come back when you will ready.";
-close;
-
-}
-
-//NPC07 - Jargeah
-lhz_fild02.gat,228,214,1 script A Wounded Man 887,{
-mes "["+strcharinfo(0)+"]";
-mes "It looks like a dead man...";
-if (SCHWALTZVALT_PART2!=6) {
- mes "["+strcharinfo(0)+"]";
- mes "He is dead!!! I must go away from here...";
- close;
- }
-mes "Maybe I can try to find something in his clothes..";
-mes "...It isn't good, but I need to make it..";
-next;
-mes "...";
-next;
-mes "You found the Sealed Document!";
-next;
-getitem 7343,1; //Sealed Document
-set SCHWALTZVALT_PART2, 7;
-close;
-}
-
-//NPC08 - Esuna
-lhz_fild01.gat,66,219,3 script A Mystery Woman 859,20,20{
-if (SCHWALTZVALT_PART2==21) {
- mes "[Esuna]";
- mes "..........";
- mes "The traitor in the internal is the problem!";
- mes "..........";
- next;
- mes "[Esuna]";
- mes "Those who able to seal the secret information, and drain it to opponents, only the President ";
- mes "or his trusted aide with his ability ^FF0000Kurelle^000000";
- next;
- mes "[Esuna]";
- mes "According to this information, he often meets with the organaizer of enterprize, ";
- mes "from here we can said that he is the most suspicious target.";
- next;
- mes "[Esuna]";
- mes "After infiltrated his residence, we found a lot of information and evidences that related with him!";
- next;
- mes "[Esuna]";
- mes "The headquater odered us to hold any actions correlated with the President, ";
- mes "and we determined that there is only disadvantage and it won't bring benefits anymore...";
- next;
- mes "[Esuna]";
- mes "I think this is the last, good bye...";
- set SCHWALTZVALT_PART2, 22; //Îïÿòü ê ïðåçèäåíòó! (óáåéñÿ îá ñòåíó åùå ðàç, è ïîìíè, òû ýòî äåëàåøü ðàäè 1.8êê îïûòà)
- close;
- }
-if (SCHWALTZVALT_PART2==19) {
- mes "[Esuna]";
- mes "I am too nervous..I lost many people of my group!";
- mes "So we should use plan B. We must withdraw our members from Schwaltsvalt!";
- next;
- mes "[Esuna]";
- mes "I think that it will be the best thing which we can do for our people.";
- mes "Here is documents, containing the plan of operation and some negative information about ^0000FFRekenber Enterprise^000000, go to the President he must look throught this documents.";
- getitem 7343,1; //Sealed Document
- set SCHWALTZVALT_PART2, 20; //Îïÿòü ê ïðåçèäåíòó!
- close;
- }
-if (SCHWALTZVALT_PART2==17) {
- mes "[Esuna]";
- if(countitem(7344)==0) {mes "Where is Case of Xinucarse";close;} //Çäåñü ÈÄ äîêóìåíòà,
- mes "Haha!! You got these secret documents!! You are great!";
- delitem 7344,1; //Case of Xinucarse
- set SCHWALTZVALT_PART2, 18; //Ìèññèÿ âûïîëíåíà! part 2 finished
- mes "[Esuna]";
- mes "I addded some new docements to the file! ";
- getitem 7344,1; //Case of Xinucarse
- next;
- mes "[Esuna]";
- mes "Now go to the President with this documents! ";
- close;
- }
-if (SCHWALTZVALT_PART2==10) {
-mes "[Esuna]";
-mes "Due to emergency I'll give you a short brief, firstly the target of the mission is to infiltrate into the internal of enterpeise and steal the secret information.";
-next;
-mes "[Esuna]";
-mes "It's too difficult to ifiltrate into the iternal, but we have secret agent from our side.";
-mes "Go to ^0000FFpass^000000 and disarm the security system, and then bring out the information.";
-next;
-mes "[Esuna]";
-mes "To cheat the security system fo first to the ^FF0000L.T.G. Store^000000 and buy some stuff.";
-mes "After you entered, find a person called ^FF0000Lestin^000000";
-set SCHWALTZVALT_PART2, 11; //C êàôðî ñåðâèñîì âñå, èäåì èñêàòü Ëåñòèíà
-close;
-}
-mes "[Esuna]";
-mes "I try to find some mushrooms...bye!";
-close;
-OnTouch:
-if (SCHWALTZVALT_PART2==10) {
-mes "?????";
-mes "..here..plz...come over..";
-close;
- }
-}
-
-//Òóò âîïðîñ ñ âàðïîì, äî Ëåñòèíà íå íàøåë êàê äîéòè, íàäî âàðï ê íåìó ïîñòàâèòü...âîò òóò lhz_in01 277 157
-//NPC09 - Lestin
-lhz_in01.gat,285,169,3 script Researcher#2 865,{
-if (SCHWALTZVALT_PART2==16) {
- mes "[Lestin]";
- mes "My entry pass! Thank you.";
- if(countitem(7349)==0) {mes "Where is my enty pass?";close;} //Card To Enter Document Room.
- delitem 7349,1; //Card To Enter Document Room.
- set SCHWALTZVALT_PART2, 17; //Òåïåðü ìîæíî îòäàòü äîêóìåíòû Åñóíå è çàêîí÷èòü âòîðóþ ÷àñòü êâåñòà.
- next;
- mes "[Lestin]";
- mes "Now, go to Esuna with these documents. Bye!";
- close;
- }
-if (SCHWALTZVALT_PART2==11) {
- mes "["+strcharinfo(0)+"]";
- mes "Are you Lestin?";
- next;
- mes "[Lestin]";
- mes "Yes, I am!";
- mes "And you are a member of ^FF0000Wing Of Secret^000000 organization!";
- mes "I can help you to steal secret documents!";
- next;
- mes "[Lestin]";
- mes "Here is my ^0000FFpass^000000, but whis this ^0000FFpass^000000 you only can stay for ^FF00003 minutes^000000";
- getitem 7349,1; //Card To Enter Document Room.
- next;
- mes "[Lestin]";
- mes "The secret information is located at the right hand-side of the research room where I stayed just now. And this...!";
- next;
- mes "[Lestin]";
- mes "...return me my ^0000FFpass^000000 when you will finish! Good Luck!";
- set SCHWALTZVALT_PART2, 12; //Òåïåðü èäåì ïîõèùàòü äîêóìåíò!
- }
-mes "[Researcher]";
-mes "Hmm... I wonder...";
-close;
-}
-
-//Ðàñïèøó ñèñòåìó äâåðåé:
-//Ó Ëåñòèíà ïîëó÷àåì ïåðåìåííóþ 12...
-//1. åñëè 12, 13 ,14 è ôëàã äâåðè 0(ò.å. åñòü ñòðàæíèêè) èäåì àêòèâèðîâàòü ãâàðäîâ
-//2. çàïóñêàåòñÿ òàéìåð, ñòðàæíèêè ïðîïàäàþò, ôëàã äâåðè = 1
-//3. ó íàñ åñòü 3 ìèíóòû, ÷òîáû ñäåëàòü âñå, ïîäõîäèì ê äâåðè, åñëè ïðàâèëüíî ââîäèì êîä, êàðòî÷êà îñòàåòñÿ â äâåðè, íàì ïðèñâàèâàþò ïåðåìåííóþ 13, âàðïàåò âíóòðü
-//4. íàæèìàåì íà ñèñòåìó ïîèñêà, ââîäèì Shinokas, òîãäà ïðèñâàèâàþò 14, àêòèâèðóåòñÿ àðåà1-5
-//5. òûðêàåì íà àðåà1-5, ïîëó÷àåì äîêóìåíòû, íàì ïðèñâàèâàåòñÿ 15, ìîæíî èäòè ê äâåðè
-//6. åñëè ó íàñ 15 è ôëàã äâåðè 1 (ò.å. åøå øâàðäîâ íåò), òî áëàãîïîëó÷íî ïîëó÷àåì êàðòî÷êó íàçàä è âûõîäèì, ïîëó÷àåì 16
-//Åñëè íå óñïåëè è ìû âíóòðè, çíà÷èò ó íàñ ïåðåìåííàÿ 13, 14 èëè 15, ôëàã äâåðè 0, ïðîïóñê èñ÷åçàåò è íàñ âûêèäûâàåò èç ëîêàöèè, ïðèäåòñÿ ñíîâà èäòè ê Ëåñòèíó çà ïðîïóñêîì
-//Äîïóñòèì ó íàñ 15 î÷êîâ ìû âíóòðè, âðåìÿ èñòåêëî. Äâà âàðèàíòà - íàæàòü íà äâåðü, òîãäà ïðèäåòñÿ èäòè ê ëåñòèíó ñíîâà, ïåðåìåííàÿ 11 ñòàíîâèòñÿ. Ëèáî óìåðåòü è òîïàòü ê àêòèâàöèè ãâàðäîâ.
-//NPC10 - Door
-lhz_in01.gat,177,30,1 script Door 111,{
-if ( (SCHWALTZVALT_PART2==15) && ($SCHWALTZVALT_DOOR_FLAG==1) ) {
- mes "You take out enty key.";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Hm....I need to bring this key to Lestin!";
- getitem 7349,1; //Card To Enter Document Room.
- set SCHWALTZVALT_PART2, 16; //Ê Ëåñòèíó
- menu "Go out!",-;
- close2;
- warp "lhz_in01.gat",177,27;
- end;
- }
-
-
-if ( (SCHWALTZVALT_PART2<15) && (SCHWALTZVALT_PART2>=13) && ($SCHWALTZVALT_DOOR_FLAG==0) ) {
- menu "Go out!",-;
- set SCHWALTZVALT_PART2,11; //íåóäà÷à, îïÿòü ê ëåñòèíó
- mes "[Guards]";
- mes "Intruder!!!";
- close2;
- warp "lighthalzen.gat",104,238;
- end;
- }
-if (SCHWALTZVALT_PART2>15) { mes "I got all the documents I needed!";
- close;
- }
-if ((SCHWALTZVALT_PART2<13) && $SCHWALTZVALT_DOOR_FLAG==0) {
- mes "Here is Guards, they can't let you infiltrate!";
- mes "You need to wait a little.";
- close;
- }
-if ( (countitem(7349)>0) && (SCHWALTZVALT_PART2==12) && ($SCHWALTZVALT_DOOR_FLAG==1)) {//Card To Enter Document Room. ÈÄ ïðîïóñêà, ñïðîñèòü ó Ëóïóñà
- mes "You have the entry pass. You can infiltrate now.";
- menu "Infiltrate",-;
- mes "Please, input code number!";
- input @tmp_code;
- if (@tmp_code != 738495) {next; mes "Incorrect code!"; close;} //Ýòî ÷èñëî â îïèñàíèè ïðîïóñêà äîëæíî áûòü
- next;
- delitem 7349,1; //Card To Enter Document Room
- mes "Accepted.";
- mes "You can stay in the documents room only for 3 minutes!.";
- set SCHWALTZVALT_PART2, 13; //ïóñòèëè âíóòðü
- close2;
- warp "lhz_in01",178,33;
- end;
- }
-mes "....";
-close;
-
-}
-
-//NPC11 - Activate Guards
-lhz_in01.gat,187,30,4 script Point of the review 111,1,0{
-close;
-OnTouch:
-if ( (SCHWALTZVALT_PART2<=15) && (SCHWALTZVALT_PART2>=12) && ($SCHWALTZVALT_DOOR_FLAG==0) ){
- mes "...It seemed that guards gonna smoke...";
- stopnpctimer;
- initnpctimer "schwalt2timer";
- set $SCHWALTZVALT_DOOR_FLAG,1;
- close;
- }
-mes "Nothing happened..";
-close;
-}
-
-//NPC12 - File Search Engine
-lhz_in01.gat,180,35,4 script File Search Engine 111,1,0{
-close;
-OnTouch:
-if (SCHWALTZVALT_PART2==13) {
- mes "-Activating the document seaching program-";
- mes "-Please key in the information of the document...-";
- mes "-..that you would like to search-";
- input @tmp_phrase$;
- if (@tmp_phrase$!="Shinokas") {next; mes "Nothing interesting was found!"; close;}
- next;
- mes "-relevant information of Shinokas-";
- mes "-is being kept in area 1-5-";
- enablenpc "area 1-5";
- set SCHWALTZVALT_PART2, 14; //àêòèâèðîâàëè àðåà1-5
- close;
- }
-mes "Nothing happened..";
-close;
-}
-
-//NPC13 - area 1-5
-lhz_in01.gat,184,49,4 script area 1-5 111,1,0{
-close;
-OnTouch:
-if (SCHWALTZVALT_PART2==14) {
- mes "It is interesting. Here is the secret indormation about the heart of Ymir. I must bring this case to Esuna.";
- getitem 7344,1; //Case of Xinucarse Èä ñïðîñèòü ó Ëóïóñà
- set SCHWALTZVALT_PART2, 15; //Çàáðàëè äîêóìåíò, òåïåðü ê äâåðè íàðóæó
- close;
- }
-
-mes "["+strcharinfo(0)+"]";
-mes "I don't know what to find!";
-close;
-}
-//Timer
-lhz_in01.gat,1,1,0 script schwalt2timer -1,{
- OnTimer2000:
- disablenpc "LhzRekGuard";
- disablenpc "Guard#03";
- end;
- OnTimer182000:
- enablenpc "LhzRekGuard";
- enablenpc "Guard#03";
- disablenpc "area 1-5";
- set $SCHWALTZVALT_DOOR_FLAG,0;
- stopnpctimer "schwalt2timer";
- end;
+//===== eAthena Script =======================================
+//= Lighthalzen, Swaltzwalt Quest Part 1
+//= Lighthalzen, Swaltzwalt Quest Part 2
+//= Lighthalzen, Swaltzwalt Quest Part 3
+//===== By: ==================================================
+//= Gravity official script
+//= CallNix (Part 1)
+//= dunkle (Part 2 & 3)
+//===== Current Version: =====================================
+//= 1.0 working version
+//= 1.1 fixed bug with wrong valuable [dunkle]
+//= added and deleted some checks [dunkle]
+//= fixed warps (but they are wrong) [dunkle]
+//= fixed enabling of A Fine Gentleman [dunkle]
+//= fixed bug with reward [dunkle]
+//= 1.2 fixed bug in part with overflow timer (now you must wait untill next day, not 12 hours) [dunkle]
+// changed some valuables [dunkle]
+// fixed bugs in The broken Manufactoring [dunkle]
+//= 1.2b fixed timer Ordinary Man [dunkle]
+//= 1.3 fixed part1 bugs [dunkle]
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//=
+//=
+//===== Additional Comments: =================================
+//In alchemist_skills.txt comment because I use this NPC in the script:
+//lhz_in01.gat,285,169,7 script Researcher#2 865,{
+//Unknown Text
+// mes "[Researcher]";
+// mes "Hmm... I wonder...";
+// close;
+//}
+//
+//============================================================
+
+
+yuno_pre.gat,79,69,0 warp inside_pre01 1,1,yuno_pre.gat,97,68
+yuno_pre.gat,113,50,0 warp inside_pre02 1,1,yuno_pre.gat,58,22
+yuno_pre.gat,54,22,0 warp inside_pre03 1,1,yuno_pre.gat,113,55
+lhz_in01.gat,275,234,0 warp inside_pre04 1,1,lhz_in01.gat,277,161 //Çäåñü ïîðòàëû ïîñòàâèë íàîáóì, â ìåñòå îêîëî äâåðè,
+lhz_in01.gat,277,157,0 warp inside_pre04 1,1,lhz_in01.gat,275,231 //ãäå íå áûëî äðóãîãî ïîðòàëà :
+
+//OnInit!
+prontera.gat,0,0,0 script swarzwalt_trilogy -1,1,1{
+OnInit:
+disablenpc "kurelle";
+disablenpc "President's Secretary#2";
+disablenpc "Security#2";
+disablenpc "area 1-5";
+disablenpc "Kurelle#1";
+set $SCHWALTZVALT_DOOR_FLAG,0;
+stopnpctimer "schwalt2timer";
+end;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//Beginning. Lighthalzen, Swaltzwalt Quest Part 1/////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+lighthalzen.gat,179,170,4 script Ordinary man 48,{
+if (SCHWALTZVALT_PART2==23) {
+ mes "[Ghalstein]";
+ mes "arrr...";
+ mes "is you....";
+ mes ".....";
+ mes "Now? verything finish...";
+ mes "dream...vision";
+ next;
+ mes "[Ghalstein]";
+ mes "arr..most forgot...";
+ mes "This is your...";
+ mes "...cure...";
+ mes "Take this pill,";
+ mes "You'll never have to take it";
+ mes "anymore...";
+ next;
+ mes "[Ghalstein]";
+ mes ".......";
+ mes "We'll never meet each other anymore..";
+ getitem 617,1; //Old Violet Box
+ getexp 1800000,0; //Exp 1800000
+ set dtseligible , 1; //Here is Voting Right (dts warper)
+ set SCHWALTZVALT_PART2, 24;
+ close;
+ }
+
+
+if (questpass_swaltwaltp1==1) goto l_alreadydone;
+if ( (SCHWALTZVALT_PART1==2) || (SCHWALTZVALT_PART1==3) ) goto Quest_enable;
+if ( (SCHWALTZVALT_PART1==1) && (gettime(5)!=schwalzday) ) goto L_NEXTDAY;
+if (SCHWALTZVALT_PART1==1) goto l_hadspoken;
+mes "[Ghalstein]";
+mes "Hello,";
+mes "is this a great city?";
+menu "Hello",-,"This is a great city indeed",L_GREAT,"is still ok",L_OK;
+next;
+mes "[Ghalstein]";
+mes " Yes, It a nice day. I wish you have good time in our city. See you later";
+close;
+
+L_OK:
+next;
+mes "[Ghalstein]";
+mes "I like such sunny days... In such beautiful town...";
+close;
+
+L_GREAT:
+next;
+mes "[Ghalstein]";
+mes "Well. This great city is only for really great people.";
+mes "I wish you have good time here. Enjoy.";
+close2;
+mes "[??????]";
+mes "is here";
+mes "......";
+mes "[??????]";
+mes "hurry before we let people discover";
+mes "us...";
+mes "heard a familiar sound";
+menu "Continue listen",l_listen,"do not listen",l_nolisten;
+
+l_listen:
+next;
+mes "[??????]";
+mes "Its all as we suposed to... Everything is similar to our plan";
+mes "[??????]";
+mes "Yes, thats really cool.";
+next;
+mes "[??????]";
+mes "PSSS. Be silent";
+mes "I think somebody else is here listening us. We will meet the other day.";
+mes "[??????]";
+mes "I agree";
+set SCHWALTZVALT_PART1,1;
+set schwalzday, gettime(5);
+close;
+end;
+
+l_nolisten:
+next;
+mes "["+strcharinfo(0)+"]";
+mes "I dont think this is interesting for me.";
+close;
+end;
+
+L_NEXTDAY:
+mes "[Ghalstein]";
+mes "hi, how are you,";
+mes "today weather is good?";
+menu "Yes",l_da,"but last night",-;
+next;
+mes "[Ghalstein]";
+mes "What was last night? I've heard nothing about it. Anything strange had happened?";
+menu "I've heard you speaking to somebody about strange things.",-,"Nothing, sorry",L_NOTHING;
+next;
+mes "[Ghalstein]";
+mes "I think you are mistaken guy. I dont know what are you talking about";
+menu "Dont make a fool from me.",-,"Ok, sory",L_NOTHING;
+next;
+mes "[Ghalstein]";
+mes "I say you, that i hadn't speak to anybody yesterday.Hey, Protector come here plese";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "..........";
+mes "if really not him, he shouldn't";
+mes "denied it so strongly";
+mes "..........";
+next;
+mes "[Protector]";
+mes "I have no intention to";
+mes "interrogation you?";
+mes "just because...";
+menu "The matter that Mr.Ghalstein dealing with..",-,"i feel curious about it?",l_curious;
+next;
+mes "["+strcharinfo(0)+"]";
+mes "I clearly remember him talking to somebody about some strange plans. I think he is planning something restrickted...";
+next;
+mes "[Protector]";
+mes "Hm... Is that so mr. Ghalstein? Do you remember the constitution? Tell us the truth, or i shall arrest you";
+next;
+mes "[Ghalstein]";
+mes "oh.. Ok. I was speaking about our community. Nothing interesting...";
+next;
+mes "[Protector]";
+mes "Ok. Its about your Fishing clan? If so, i leave you. See you later";
+next;
+mes "[Ghalstein]";
+mes "Well, I will tell you the truth. Please give me sometime to consider....";
+mes "I belong to a secret group that antagonistic with another group and so we need some items";
+mes "to be protected. So we were going to organize a trip to Reagent Shaw Research Center.";
+next;
+mes "[Ghalstein]";
+mes "You can get there if you have passed BioLab quest. Its the second and third lvl.";
+mes "But we have no brave to go there. What about helping us?";
+menu "Ok, i shall help",-,"No,thanks",L_NOTHX;
+next;
+mes "[Ghalstein]";
+mes "well then.But you must take this pill to go this quest. This pill will add some status to you.";
+mes "when you shall finish quest - i will delete this status from your char.Is it OK with you?. I think It is.";
+if ( checkweight(7226,1) == 0 ) goto l_overweight;
+getitem (7226),1;
+next;
+mes "[Ghalstein]";
+mes "I want you to collect all related biological exhibit and no need big quantity plus the most important thing.";
+mes "You will simply recognize that things";
+mes "There are some strange mobs there. So be careful. And last...People who go there dissapear. Nobody was back from there...";
+next;
+mes "[Ghalstein]";
+mes "So you had to go to 2 and 3 lvl of BioLab. Be sure you have finish this quest. And bring me 10 Lab staff records, 10 Armlet of prisoner and 1 Pile of Imir heat";
+set SCHWALTZVALT_PART1,2;
+
+set schwalzday,0;
+close;
+
+l_curious:
+mes "[Ghalstein]";
+mes "even so i dont want to speak to smb who say such fool things. Cya.";
+close;
+
+L_NOTHX:
+mes "[Ghalstein]";
+mes "ye, its a pity i think. Have a nice day";
+close;
+
+L_NOTHING:
+mes "[Ghalstein]";
+mes "I've never think guy like you can think this way about me. I dont want to speak to you anymore";
+close;
+
+l_overweight:
+mes "["+strcharinfo(0)+"]";
+mes "sorry you can't take this item";
+close;
+
+
+Quest_enable:
+if (countitem (7345) >= 10) && (countitem(7347) >=10) && (countitem(7346) >=1) goto Quest_end;
+mes "[Ghalstein]";
+mes "You havent geather items yet. Come back when you should.";
+close;
+
+Quest_end:
+mes "[Ghalstein]";
+mes "Well done. You have finished my part of quest.";
+mes "Now, Visit Gushaar. He can be found sowhere around Yuno.";
+next;
+mes "[Ghalstein]";
+mes "Yes, i have forgotten....";
+mes "Now you are member of society Wind of Secret!";
+mes "congratulations!";
+delitem (7345),10;
+delitem (7347),10;
+delitem (7346),1;
+getitem (7226),1;
+getitem (7348),1;
+set questpass_swaltwaltp1,1;
+close;
+
+l_hadspoken:
+mes "[Ghalstein]";
+mes "Sorry, but i have nothing to say to you anymore. Buy.";
+close;
+
+l_da:
+mes "[Ghalstein]";
+mes "Im happy you have time to think so too. See you";
+close;
+
+l_alreadydone:
+mes "["+strcharinfo(0)+"]";
+mes "I have already done this quest. I dont want to go there once more time!";
+close;
+}
+//=======================================================================
+lhz_dun02.gat,268,287,4 script The broken Manufactoring 111,{
+if SCHWALTZVALT_PART1!=2 goto l_end;
+mes "[The broken Manufactoring]";
+mes "You see something shining inside the spoiling machines.Open up the machinr and check it,detected a round shape";
+mes "object wich circulate with a mysterious shines.";
+menu "Its seems like an important object",-,"But it looks nothing musch",l_nottake;
+getitem(7346),1;
+set SCHWALTZVALT_PART1,3;
+mes "["+strcharinfo(0)+"]";
+mes "Well, Now i suppose everything will be ok.";
+close2;
+npctalk "Creeep... Creeeep-Creep...*pfu*.";
+mes "["+strcharinfo(0)+"]";
+mes "Oooops....I dont think this machien will work anymore... I'll go better from here";
+close;
+end;
+l_nottake:
+close;
+
+l_end:
+mes "You see nothing there...";
+close;
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//Ending. Lighthalzen, Swaltzwalt Quest Part 1/////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+//NPC01 - Dismal Guy
+yuno_fild04.gat,165,245,5 script Dismal Guy 89,{
+if (SCHWALTZVALT_PART2>0) {
+ mes "[Dismal Guy]";
+ mes "Make your mission..we need you..";
+ close;
+ }
+mes "[Dismal Guy]";
+mes "Maybe you have some thing to show me?";
+menu "Yeah, I have it",-,"I don't know what do you mean",DG_end01;
+if ((countitem(7348)==0) || (questpass_swaltwaltp1!=1)) { //Membership Card, Çäåñü ïðîâåðêà, ïðîéäåíà ëè ïåðâàÿ ÷àñòü êâåñòà
+ next;
+ mes "[Dismal Guy]";
+ mes "You are trying to cheat me?";
+ mes "You don't have item which I am interesting in..";
+ mes "Bye! Come back, when you will have what I want.";
+ close;
+ }
+//next;
+//mes "[Dismal Guy]";
+//mes "emm....";
+//mes "got red and blue pill,";
+//mes "which one you choose?";
+//menu "Red pill",-,"Blue pill",-; //Íàäî óçíàòü, ÷òî áóäåò åñëè âûáðàòü ñèíèþ ïèëþëþ (ïî èäåè â ïåðâîé ÷àñòè ÍÏÖ ìîæåò äàòü ëìáî ñèíþþ, ëèáî êðàñíóþ, íî ò.ê. îí äàåò ïðîñòî ïèëþëþ, òî çäåñü åñòåñíî ýòî íåíóæíî)
+//mes "Nowadays isn't the best time to live..";
+next;
+mes "[Dismal Guy]";
+mes "Schwaltzvalt is control by evil ^0000FFRekenber Enterprise^000000";
+mes "But we have organized a resistance called ^FF0000Wing Of Secret^000000 with the help of the President ^0000FFKarl Weierstrass^000000 to reform Schwaltzvalt Republic from the control of ^0000FFRekenber Enterprise^000000!";
+next;
+mes "[Dismal Guy]";
+mes "I have a task for you.";
+mes "You need to meet the candidate which won the president election ^0000FFKarl Weierstrass^000000";
+mes "He wants to reform Schwaltzvalt Republic from the control of ^0000FFRekenber Enterprise^000000";
+next;
+mes "[Dismal Guy]";
+mes "If you will unable to see ^0000FFKarl Weierstrass^000000, coordinate with his secrtary in Yuno at appointed time.";
+mes "The best time will be betwen 8pm to 11pm or betwen 11am to 2pm";
+set SCHWALTZVALT_PART2, 1; //Ïåðâûé ÍÏÖ ïðîéäåí, òåïåðü ìîæíî ê ñåêðåòàðþ.
+next;
+mes "[Dismal Guy]";
+mes "The fate of the whole Republic in your brave hands! Bye!";
+close;
+
+DG_end01:
+next;
+mes "[Dismal Guy]";
+mes "It'a a pity, I am finding you a good person..";
+close;
+}
+
+//NPC02 - President's Secretary
+yuno_pre.gat,69,20,5 script President's Secretary::pre 862,{
+if (SCHWALTZVALT_PART2==4) {
+ mes "[Hes O'Neil]";
+ if(countitem(7342)==0) {mes "Where is documemt?";close;} //Çäåñü ÈÄ äîêóìåíòà, íàäî óçíàòü ó Ëóïóñà.
+ delitem 7342,1; //Çäåñü ÈÄ äîêóìåíòà, íàäî óçíàòü ó Ëóïóñà.
+ mes "Thanks a lot!";
+ set SCHWALTZVALT_PART2, 5; //Òåïåðü ñ ñåêðåòàðøåé âî âòîðîé ðàç âñå, èäåì ê Venice
+ close;
+ }
+if (SCHWALTZVALT_PART2>=2) {
+ mes "[Hes O'Neil]";
+ mes "I glad to see you again!";
+ close;
+ }
+
+if ( (gettime(3)>23) && (gettime(3)<11) ) || ( (gettime(3)>14) && (gettime(3)<20) ) {
+ mes "[Hes O'Neil]";
+ mes "It isn't reception time.";
+ mes "Come back betwen 8pm to 11pm or betwen 11am to 2pm.";
+ close;
+ }
+
+
+mes "[Hes O'Neil]";
+mes "Who are you?";
+mes "How can I help?";
+menu "emm..",-,"Meet up with Mr.President",PS_meet,"Nothing",PS_end01;
+
+if (SCHWALTZVALT_PART2==1) {
+ next;
+ mes "[Hes O'Neil]";
+ mes "Heh, you don't know how to explain youself:)";
+ mes "But I know that Mr.President is waiting for you. Good Luck!";
+ set SCHWALTZVALT_PART2, 2; //Âòîðîé ÍÏÖ ïðîéäåí, äàëåå ê ñòðàæíèêó.
+ close;
+ }
+
+next;
+mes "[Hes O'Neil]";
+mes "What do you want?";
+mes "Don't waste my time please!";
+close;
+
+PS_meet:
+next;
+mes "[Hes O'Neil]";
+mes "Sorry, but Mr.President is very busy.";
+//emotion 14; //sry
+close;
+
+PS_end01:
+next;
+mes "[Hes O'Neil]";
+mes "Sorry, I did't help you:(";
+//emotion 14; //sry
+close;
+}
+
+yuno_pre.gat,75,71,3 duplicate(pre) President's Secretary#2 862,0,0
+
+//NPC03 - Security
+yuno_pre.gat,95,71,5 script Security::sec 899,5,5 {
+if (SCHWALTZVALT_PART2==4) {
+ mes "[Security]";
+ mes "Mr.President still meeting with other person.";
+ close;
+ }
+if (SCHWALTZVALT_PART2>=3) {
+ mes "[Security]";
+ mes "Mr.Presideny is free now. You can come in.";
+ close2;
+ warp "yuno_pre.gat",75,70;
+ end;
+ }
+if (SCHWALTZVALT_PART2!=2) {
+ mes "[Security]";
+ mes "Nobody has disposed to pass you!";
+ close;
+ }
+if (rand(9)!=0) {
+ mes "[Security]";
+ mes "Please hold on for a moment.";
+ mes "Mr.President still meeting with other person.";
+ close;
+ }
+enablenpc "kurelle";
+mes "[Keshnaar]";
+mes "Mr.President denied my petition about medical marihuana...";
+//emotion 25; //sob
+next;
+mes "[Keshnaar]";
+mes "I have collected 1000 signatures of the townspeople and nothing...";
+//emotion 25; //sob
+next;
+mes "[Keshnaar]";
+mes "Ok I must go and collect more signatures!";
+next;
+disablenpc "A Fine Gentleman";
+
+mes "[Security]";
+mes "Now Mr.President is free, you can pass.";
+G_menu:
+menu "Ok",S_warp,"Who is he?",-;
+next;
+mes "[Security]";
+mes "Are you talking about Mr.Keshnaar?";
+mes "Mr.Keshnaar works for Rekenber. He consulted with Mr.President.";
+next;
+goto G_menu;
+
+S_warp:
+set SCHWALTZVALT_PART2, 3; //Ó îõðàííèêà âñå, òåïåðü ê ïðåçèäåíòó.
+close2;
+warp "yuno_pre.gat",75,70;
+
+OnTouch:
+if (SCHWALTZVALT_PART2==4) {
+ mes "...Suddenly your heard voices behind the door...";
+ mes "...but is too slighty, can't heard clearly...";
+ next;
+ mes "[?????]";
+ mes "...is true..";
+ mes "so........";
+ mes "......president...";
+ mes "[?????]";
+ mes "..their Investigation...";
+ mes ".........";
+ mes "....trap....";
+ mes "[?????]";
+ mes "...stop them....how?";
+ mes ".....,surely...";
+ mes "[?????]";
+ mes "next?...election...";
+ mes "....elected...";
+ next;
+ mes "...the sound became more slighty...";
+ mes "...can't heard anymore...";
+ close;
+ }
+}
+
+//NPC04 - A Fine Gentleman
+yuno_pre.gat,96,69,3 script A Fine Gentleman::kurelle 82,{
+close;
+}
+//NPC - KURELLE
+yuno_pre.gat,69,74,0 duplicate(kurelle) Kurelle#1 109,0,0
+
+//NPC - Security in presidents room
+yuno_pre.gat,76,72,8 duplicate(sec) Security#2 899,0,0
+
+//NPC05 - President Karl
+yuno_pre.gat,69,79,5 script President Karl 872,{
+cutin "lhz_karl",2;
+if (SCHWALTZVALT_PART2==22) {
+ mes "...after the story about traitor ^FF0000Kurelle^000000 president looks stunned...";
+ next;
+ mes "[President Karl]";
+ mes "CALL MY SECRETARY NOOOOOOW!!!";
+ next;
+ mes ".....";
+ next;
+ enablenpc "President's Secretary#2";
+ mes "...Secretary looks too afraid...";
+ next;
+ cutin "",255;
+ mes "[Hes O'Neil]";
+ mes "Yes sir! What is your oders?";
+ next;
+ cutin "lhz_karl",2;
+ mes "[President Karl]";
+ mes "INVITE THIS TRAITOR ^FF0000KURELLE^000000 NOOOOW!!!";
+ next;
+ disablenpc "President's Secretary#2";
+ mes ".....";
+ next;
+ enablenpc "Kurelle#1";
+ mes "[President Karl]";
+ mes "What happened? Why did you betray us?";
+ next;
+ cutin "",255;
+ mes "[Kurelle]";
+ mes "You are right. I did it. I report all of your actions to the enterprise...";
+ mes "I did it by myself.";
+ next;
+ mes "[Kurelle]";
+ mes "When I carry on my plan, I meet with Rekenber people who are monitoring you...ha-ha!";
+ next;
+ mes "[Kurelle]";
+ mes "Therefore I take those opportunity to propose them my plan,";
+ mes "I provide information t0 them, to force you step down, I WILL BE THE NEXT PRESIDENT!!! HA-HA-HA";
+ next;
+ mes "[Kurelle]";
+ mes "Although you'll not step down sp soon...but your team will lost seriously!";
+ next;
+ mes "[Kurelle]";
+ mes "Yeap, your era is gone...";
+ mes "Now you can't do anything, just waiting to step down then is enough...";
+ mes "Ha ha...";
+ next;
+ cutin "lhz_karl",2;
+ mes "[President Karl]";
+ mes "SECURITY!!!";
+ enablenpc "Security#2";
+ next;
+ next;
+ mes "[President Karl]";
+ mes "He is crazy!! Jail him now!";
+ next;
+ cutin "",255;
+ mes "[Security]";
+ mes "Yes sir!";
+ disablenpc "Security#2";
+ disablenpc "Kurelle#1";
+ next;
+ cutin "lhz_karl",2;
+ mes "[President Karl]";
+ mes "It is the end of our Rebublic..";
+ mes "Soon it will fall..";
+ next;
+ mes "[President Karl]";
+ mes "Thank you brave man ..";
+ mes "...go away. Now I must stay here and wait the END..";
+ set SCHWALTZVALT_PART2, 23;
+ cutin "",255;
+ close;
+ }
+if (SCHWALTZVALT_PART2==20) {
+ mes "[President Karl]";
+ mes "Very interesting...";
+ mes "With this information can give enterprise a big hit.";
+ if(countitem(7343)==0) {mes "Where is documemt?";cutin "",255; close;} //Sealed documemt
+ delitem 7343,1; //Sealed documemt
+ next;
+ mes "[President Karl]";
+ mes "But I can't understand why should we withdraw our members?...";
+ mes "...can you go to Esuna and ask her for reasons?";
+ set SCHWALTZVALT_PART2, 21; //Îáðàòíî ê Åñóíå! (èçäåâàòåëüñòâî äëÿ èãðîêîâ:))))
+ cutin "",255;
+ close;
+ }
+if (SCHWALTZVALT_PART2==18) {
+ mes "[President Karl]";
+ mes "It can't be true! You broght me a file containing all details of the Shinokas case!! ";
+ if(countitem(7344)==0) {mes "Where is Shinokas documemt?";cutin "",255; close;} //Shinokas documemt
+ delitem 7344,1; //Shinokas documemt
+ set SCHWALTZVALT_PART2, 19; //Îáðàòíî ê Åñóíå!
+ next;
+ mes "...President Karl attentivly looking thought the papers...";
+ next;
+ mes "[President Karl]";
+ mes "The death of ^FF0000Shinokas^000000...";
+ mes "It is not important for us..";
+ mes "The most important thing is what they are going to do with ^0000FFYmir Heart Piece^000000 what is their main purpose.";
+ next;
+ mes "[President Karl]";
+ mes "I heard that when you are on the way to me. ^FF0000Esuna^000000 gained new information.";
+ mes "Bye! I will be waiting for new information. ";
+ cutin "",255;
+ close;
+ }
+if (SCHWALTZVALT_PART2==9) {
+ mes "[President Karl]";
+ mes "Ohh! You brought me this secret document!? You are awesome!";
+ if(countitem(7343)==0) {mes "Where is documemt?";cutin "",255; close;} //Sealed Document
+ delitem 7343,1; //Sealed Document
+ mes "Let's see...";
+ next;
+ mes "[President Karl]";
+ mes "...";
+ next;
+ mes "[President Karl]";
+ mes "It is very-very interesting! One of ^0000FFRekenber Enterprise^000000 researcher is hiding in a secret place!";
+ mes "He knows some secret!!!!! His name is ^FF0000Shinokas^000000";
+ mes "...and the secret place is...";
+ next;
+ mes "[President Karl]";
+ mes "...^FF0000Einbroch^000000";
+ mes "So..your second mission is to find ^FF0000Shinokas^FF0000 in ^FF0000Einbroch^000000 and to know his secret!";
+ next;
+ mes "[President Karl]";
+ mes "Do you have any questions?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Yes...I hane one..";
+ mes "Shinikas is...";
+ next;
+ cutin "",255;
+ enablenpc "Security#2";
+ enablenpc "President's Secretary#2";
+ next;
+ mes "[Secutity]";
+ mes "Mr.President, Mrs.Hes O'Neil has urgent matter to see you. ";
+ next;
+ mes "...Mrs.Hes O'Neil brooght to the President a pack of documents...";
+ next;
+ cutin "lhz_karl",2;
+ mes "[President Karl]";
+ mes "Thanks to Mrs.Hes O'Neil we found a secret file! It is in the store room of ^0000FFReagent Belfa Headquater^000000";
+ next;
+ mes "[President Karl]";
+ mes "Ok. Go somewhere around ^FF0000Lighthalzen^000000, waiting for ^FF0000kafra service^000000 to contact with you.";
+ set SCHWALTZVALT_PART2, 10; //Âçÿëè âòîðóþ ìèññèþ ó Ïðåçèäåíòà,
+ next;
+ disablenpc "Security#2";
+ disablenpc "President's Secretary#2";
+ cutin "",255;
+ close;
+ }
+if (SCHWALTZVALT_PART2>=4) {
+ mes "[President Karl]";
+ mes "See ya!";
+ cutin "",255;
+ close;
+}
+if (SCHWALTZVALT_PART2<3) {
+ mes "[President Karl]";
+ mes "Who are you doing here?!";
+ next;
+ mes "[President Karl]";
+ mes "Secutity!!!!";
+ cutin "",255;
+ close2;
+ warp "yuno.gat",153,313;
+ }
+mes "[President Karl]";
+mes "I believe, you have many questions but.. ";
+mes "...I am very busy, so the time I have is limited.";
+
+PK_menu01:
+menu "Objective of the ^FF0000Wing Of Secret^000000f",PK_obj01,"Objective of the ^0000FFRekenber Enterprise^000000",PK_obj02,"What is my Mission?",-;
+
+next;
+mes "[President Karl]";
+mes "The first mission is to go ^0000FF'Aldebaran Kafra Headquater'^000000 to meet a guy called ^FF0000 Venice^000000. Then he will let you know what to do." ;
+next;
+mes "[President Karl]";
+mes "One more thing...";
+mes "Please, bring this document to ^FF0000Hes O'Neil^000000. Then you can continue your mission.";
+getitem 7342,1; //File Folder
+set SCHWALTZVALT_PART2, 4; //Ñ Ïðåçèäåíòîì ïîêà âñå, èäåì ê ñåêðåòàðøå îïÿòü.
+cutin "",255;
+close;
+
+PK_obj01:
+next;
+mes "[President Karl]";
+mes "It is resistance organization which try to reform Schwaltzvalt Republic with my help.";
+mes "Before I was elected I was the member of this organization.";
+mes "We should not admit the control of authority by ^0000FFRekenber Enterprise^000000!!!";
+goto PK_menu01;
+
+PK_obj02:
+next;
+mes "[President Karl]";
+mes "^0000FFRekenber Enterprise^000000 - the worst organization in Rune Midgard!!";
+mes "They try to get power.";
+mes "To make the prices in shops is more expensive, to receive greater taxes from the townspeople, to start up development Rune Midgard on a way of fear and terror.";
+goto PK_menu01;
+}
+
+//NPC06 - Venice
+aldeba_in.gat,155,240,3 script Kafra Employee 859,{
+if (SCHWALTZVALT_PART2==7) {
+ if(countitem(7343)==0) {mes "Where is documemt?";close;} //Çäåñü ÈÄ äîêóìåíòà
+ delitem 7343,1; //Sealed Document
+ mes "[Venice]";
+ mes "That is great!! You got this document!";
+ next;
+ mes "[Venice]";
+ mes "And how is Jargeah? Where is he?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "He is....";
+ next;
+ mes "[Venice]";
+ mes "I see...";
+ mes "Here is document, give it to the President!";
+ getitem 7343,1; //Sealed Document
+ set SCHWALTZVALT_PART2, 9; //C Venice âî âòîðîé ðàç ïîêîí÷åíî, èäåì îòäàâàòü äîêóìåíò ê Ïðåçèäåíòó.
+ close;
+ }
+if (SCHWALTZVALT_PART2==6) {
+ mes "[Venice]";
+ mes "Find Jargeah please!";
+ close;
+ }
+mes "["+strcharinfo(0)+"]";
+mes "Can I know... are you Venice?";
+next;
+if (SCHWALTZVALT_PART2!=5) {
+ mes "[Kafra Employee]";
+ mes "May be yes and may be no!";
+ mes "I am thinking, go away!";
+ close;
+ }
+mes "[Venice]";
+mes "Yes, I am Venice.";
+mes "What can I do for you?";
+
+menu "Let her see the logo",-,"Nothing",V_end01;
+
+next;
+mes "[Venice]";
+mes "Now I think that I can trust you..";
+next;
+mes "[Venice]";
+mes "I am the member of ^FF0000Wing Of Secret^000000 organization.";
+mes "I got terrible news...";
+next;
+mes "[Venice]";
+mes "With our agent something happened on the half way between ^FF0000Lighthalzen^000000 and ^FF0000Einbroch^000000 in ^FF0000Grim Reaper's Valley^000000.";
+mes "He needs help, his name is ^FF0000Jargeah^000000. Hurry up please!";
+set SCHWALTZVALT_PART2, 6; //Ñ Venice â ïåðâûé ïîêîí÷åíî èäåì èñêàòü Jargeah
+close;
+
+
+V_end01:
+next;
+mes "[Venice]";
+mes "Ok, come back when you will ready.";
+close;
+
+}
+
+//NPC07 - Jargeah
+lhz_fild02.gat,228,214,1 script A Wounded Man 887,{
+mes "["+strcharinfo(0)+"]";
+mes "It looks like a dead man...";
+if (SCHWALTZVALT_PART2!=6) {
+ mes "["+strcharinfo(0)+"]";
+ mes "He is dead!!! I must go away from here...";
+ close;
+ }
+mes "Maybe I can try to find something in his clothes..";
+mes "...It isn't good, but I need to make it..";
+next;
+mes "...";
+next;
+mes "You found the Sealed Document!";
+next;
+getitem 7343,1; //Sealed Document
+set SCHWALTZVALT_PART2, 7;
+close;
+}
+
+//NPC08 - Esuna
+lhz_fild01.gat,66,219,3 script A Mystery Woman 859,20,20{
+if (SCHWALTZVALT_PART2==21) {
+ mes "[Esuna]";
+ mes "..........";
+ mes "The traitor in the internal is the problem!";
+ mes "..........";
+ next;
+ mes "[Esuna]";
+ mes "Those who able to seal the secret information, and drain it to opponents, only the President ";
+ mes "or his trusted aide with his ability ^FF0000Kurelle^000000";
+ next;
+ mes "[Esuna]";
+ mes "According to this information, he often meets with the organaizer of enterprize, ";
+ mes "from here we can said that he is the most suspicious target.";
+ next;
+ mes "[Esuna]";
+ mes "After infiltrated his residence, we found a lot of information and evidences that related with him!";
+ next;
+ mes "[Esuna]";
+ mes "The headquater odered us to hold any actions correlated with the President, ";
+ mes "and we determined that there is only disadvantage and it won't bring benefits anymore...";
+ next;
+ mes "[Esuna]";
+ mes "I think this is the last, good bye...";
+ set SCHWALTZVALT_PART2, 22; //Îïÿòü ê ïðåçèäåíòó! (óáåéñÿ îá ñòåíó åùå ðàç, è ïîìíè, òû ýòî äåëàåøü ðàäè 1.8êê îïûòà)
+ close;
+ }
+if (SCHWALTZVALT_PART2==19) {
+ mes "[Esuna]";
+ mes "I am too nervous..I lost many people of my group!";
+ mes "So we should use plan B. We must withdraw our members from Schwaltsvalt!";
+ next;
+ mes "[Esuna]";
+ mes "I think that it will be the best thing which we can do for our people.";
+ mes "Here is documents, containing the plan of operation and some negative information about ^0000FFRekenber Enterprise^000000, go to the President he must look throught this documents.";
+ getitem 7343,1; //Sealed Document
+ set SCHWALTZVALT_PART2, 20; //Îïÿòü ê ïðåçèäåíòó!
+ close;
+ }
+if (SCHWALTZVALT_PART2==17) {
+ mes "[Esuna]";
+ if(countitem(7344)==0) {mes "Where is Case of Xinucarse";close;} //Çäåñü ÈÄ äîêóìåíòà,
+ mes "Haha!! You got these secret documents!! You are great!";
+ delitem 7344,1; //Case of Xinucarse
+ set SCHWALTZVALT_PART2, 18; //Ìèññèÿ âûïîëíåíà! part 2 finished
+ mes "[Esuna]";
+ mes "I addded some new docements to the file! ";
+ getitem 7344,1; //Case of Xinucarse
+ next;
+ mes "[Esuna]";
+ mes "Now go to the President with this documents! ";
+ close;
+ }
+if (SCHWALTZVALT_PART2==10) {
+mes "[Esuna]";
+mes "Due to emergency I'll give you a short brief, firstly the target of the mission is to infiltrate into the internal of enterpeise and steal the secret information.";
+next;
+mes "[Esuna]";
+mes "It's too difficult to ifiltrate into the iternal, but we have secret agent from our side.";
+mes "Go to ^0000FFpass^000000 and disarm the security system, and then bring out the information.";
+next;
+mes "[Esuna]";
+mes "To cheat the security system fo first to the ^FF0000L.T.G. Store^000000 and buy some stuff.";
+mes "After you entered, find a person called ^FF0000Lestin^000000";
+set SCHWALTZVALT_PART2, 11; //C êàôðî ñåðâèñîì âñå, èäåì èñêàòü Ëåñòèíà
+close;
+}
+mes "[Esuna]";
+mes "I try to find some mushrooms...bye!";
+close;
+OnTouch:
+if (SCHWALTZVALT_PART2==10) {
+mes "?????";
+mes "..here..plz...come over..";
+close;
+ }
+}
+
+//Òóò âîïðîñ ñ âàðïîì, äî Ëåñòèíà íå íàøåë êàê äîéòè, íàäî âàðï ê íåìó ïîñòàâèòü...âîò òóò lhz_in01 277 157
+//NPC09 - Lestin
+lhz_in01.gat,285,169,3 script Researcher#2 865,{
+if (SCHWALTZVALT_PART2==16) {
+ mes "[Lestin]";
+ mes "My entry pass! Thank you.";
+ if(countitem(7349)==0) {mes "Where is my enty pass?";close;} //Card To Enter Document Room.
+ delitem 7349,1; //Card To Enter Document Room.
+ set SCHWALTZVALT_PART2, 17; //Òåïåðü ìîæíî îòäàòü äîêóìåíòû Åñóíå è çàêîí÷èòü âòîðóþ ÷àñòü êâåñòà.
+ next;
+ mes "[Lestin]";
+ mes "Now, go to Esuna with these documents. Bye!";
+ close;
+ }
+if (SCHWALTZVALT_PART2==11) {
+ mes "["+strcharinfo(0)+"]";
+ mes "Are you Lestin?";
+ next;
+ mes "[Lestin]";
+ mes "Yes, I am!";
+ mes "And you are a member of ^FF0000Wing Of Secret^000000 organization!";
+ mes "I can help you to steal secret documents!";
+ next;
+ mes "[Lestin]";
+ mes "Here is my ^0000FFpass^000000, but whis this ^0000FFpass^000000 you only can stay for ^FF00003 minutes^000000";
+ getitem 7349,1; //Card To Enter Document Room.
+ next;
+ mes "[Lestin]";
+ mes "The secret information is located at the right hand-side of the research room where I stayed just now. And this...!";
+ next;
+ mes "[Lestin]";
+ mes "...return me my ^0000FFpass^000000 when you will finish! Good Luck!";
+ set SCHWALTZVALT_PART2, 12; //Òåïåðü èäåì ïîõèùàòü äîêóìåíò!
+ }
+mes "[Researcher]";
+mes "Hmm... I wonder...";
+close;
+}
+
+//Ðàñïèøó ñèñòåìó äâåðåé:
+//Ó Ëåñòèíà ïîëó÷àåì ïåðåìåííóþ 12...
+//1. åñëè 12, 13 ,14 è ôëàã äâåðè 0(ò.å. åñòü ñòðàæíèêè) èäåì àêòèâèðîâàòü ãâàðäîâ
+//2. çàïóñêàåòñÿ òàéìåð, ñòðàæíèêè ïðîïàäàþò, ôëàã äâåðè = 1
+//3. ó íàñ åñòü 3 ìèíóòû, ÷òîáû ñäåëàòü âñå, ïîäõîäèì ê äâåðè, åñëè ïðàâèëüíî ââîäèì êîä, êàðòî÷êà îñòàåòñÿ â äâåðè, íàì ïðèñâàèâàþò ïåðåìåííóþ 13, âàðïàåò âíóòðü
+//4. íàæèìàåì íà ñèñòåìó ïîèñêà, ââîäèì Shinokas, òîãäà ïðèñâàèâàþò 14, àêòèâèðóåòñÿ àðåà1-5
+//5. òûðêàåì íà àðåà1-5, ïîëó÷àåì äîêóìåíòû, íàì ïðèñâàèâàåòñÿ 15, ìîæíî èäòè ê äâåðè
+//6. åñëè ó íàñ 15 è ôëàã äâåðè 1 (ò.å. åøå øâàðäîâ íåò), òî áëàãîïîëó÷íî ïîëó÷àåì êàðòî÷êó íàçàä è âûõîäèì, ïîëó÷àåì 16
+//Åñëè íå óñïåëè è ìû âíóòðè, çíà÷èò ó íàñ ïåðåìåííàÿ 13, 14 èëè 15, ôëàã äâåðè 0, ïðîïóñê èñ÷åçàåò è íàñ âûêèäûâàåò èç ëîêàöèè, ïðèäåòñÿ ñíîâà èäòè ê Ëåñòèíó çà ïðîïóñêîì
+//Äîïóñòèì ó íàñ 15 î÷êîâ ìû âíóòðè, âðåìÿ èñòåêëî. Äâà âàðèàíòà - íàæàòü íà äâåðü, òîãäà ïðèäåòñÿ èäòè ê ëåñòèíó ñíîâà, ïåðåìåííàÿ 11 ñòàíîâèòñÿ. Ëèáî óìåðåòü è òîïàòü ê àêòèâàöèè ãâàðäîâ.
+//NPC10 - Door
+lhz_in01.gat,177,30,1 script Door 111,{
+if ( (SCHWALTZVALT_PART2==15) && ($SCHWALTZVALT_DOOR_FLAG==1) ) {
+ mes "You take out enty key.";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Hm....I need to bring this key to Lestin!";
+ getitem 7349,1; //Card To Enter Document Room.
+ set SCHWALTZVALT_PART2, 16; //Ê Ëåñòèíó
+ menu "Go out!",-;
+ close2;
+ warp "lhz_in01.gat",177,27;
+ end;
+ }
+
+
+if ( (SCHWALTZVALT_PART2<15) && (SCHWALTZVALT_PART2>=13) && ($SCHWALTZVALT_DOOR_FLAG==0) ) {
+ menu "Go out!",-;
+ set SCHWALTZVALT_PART2,11; //íåóäà÷à, îïÿòü ê ëåñòèíó
+ mes "[Guards]";
+ mes "Intruder!!!";
+ close2;
+ warp "lighthalzen.gat",104,238;
+ end;
+ }
+if (SCHWALTZVALT_PART2>15) { mes "I got all the documents I needed!";
+ close;
+ }
+if ((SCHWALTZVALT_PART2<13) && $SCHWALTZVALT_DOOR_FLAG==0) {
+ mes "Here is Guards, they can't let you infiltrate!";
+ mes "You need to wait a little.";
+ close;
+ }
+if ( (countitem(7349)>0) && (SCHWALTZVALT_PART2==12) && ($SCHWALTZVALT_DOOR_FLAG==1)) {//Card To Enter Document Room. ÈÄ ïðîïóñêà, ñïðîñèòü ó Ëóïóñà
+ mes "You have the entry pass. You can infiltrate now.";
+ menu "Infiltrate",-;
+ mes "Please, input code number!";
+ input @tmp_code;
+ if (@tmp_code != 738495) {next; mes "Incorrect code!"; close;} //Ýòî ÷èñëî â îïèñàíèè ïðîïóñêà äîëæíî áûòü
+ next;
+ delitem 7349,1; //Card To Enter Document Room
+ mes "Accepted.";
+ mes "You can stay in the documents room only for 3 minutes!.";
+ set SCHWALTZVALT_PART2, 13; //ïóñòèëè âíóòðü
+ close2;
+ warp "lhz_in01",178,33;
+ end;
+ }
+mes "....";
+close;
+
+}
+
+//NPC11 - Activate Guards
+lhz_in01.gat,187,30,4 script Point of the review 111,1,0{
+close;
+OnTouch:
+if ( (SCHWALTZVALT_PART2<=15) && (SCHWALTZVALT_PART2>=12) && ($SCHWALTZVALT_DOOR_FLAG==0) ){
+ mes "...It seemed that guards gonna smoke...";
+ stopnpctimer;
+ initnpctimer "schwalt2timer";
+ set $SCHWALTZVALT_DOOR_FLAG,1;
+ close;
+ }
+mes "Nothing happened..";
+close;
+}
+
+//NPC12 - File Search Engine
+lhz_in01.gat,180,35,4 script File Search Engine 111,1,0{
+close;
+OnTouch:
+if (SCHWALTZVALT_PART2==13) {
+ mes "-Activating the document seaching program-";
+ mes "-Please key in the information of the document...-";
+ mes "-..that you would like to search-";
+ input @tmp_phrase$;
+ if (@tmp_phrase$!="Shinokas") {next; mes "Nothing interesting was found!"; close;}
+ next;
+ mes "-relevant information of Shinokas-";
+ mes "-is being kept in area 1-5-";
+ enablenpc "area 1-5";
+ set SCHWALTZVALT_PART2, 14; //àêòèâèðîâàëè àðåà1-5
+ close;
+ }
+mes "Nothing happened..";
+close;
+}
+
+//NPC13 - area 1-5
+lhz_in01.gat,184,49,4 script area 1-5 111,1,0{
+close;
+OnTouch:
+if (SCHWALTZVALT_PART2==14) {
+ mes "It is interesting. Here is the secret indormation about the heart of Ymir. I must bring this case to Esuna.";
+ getitem 7344,1; //Case of Xinucarse Èä ñïðîñèòü ó Ëóïóñà
+ set SCHWALTZVALT_PART2, 15; //Çàáðàëè äîêóìåíò, òåïåðü ê äâåðè íàðóæó
+ close;
+ }
+
+mes "["+strcharinfo(0)+"]";
+mes "I don't know what to find!";
+close;
+}
+//Timer
+lhz_in01.gat,1,1,0 script schwalt2timer -1,{
+ OnTimer2000:
+ disablenpc "LhzRekGuard";
+ disablenpc "Guard#03";
+ end;
+ OnTimer182000:
+ enablenpc "LhzRekGuard";
+ enablenpc "Guard#03";
+ disablenpc "area 1-5";
+ set $SCHWALTZVALT_DOOR_FLAG,0;
+ stopnpctimer "schwalt2timer";
+ end;
} \ No newline at end of file
diff --git a/npc/quests/WIP/shadow_quest.txt b/npc/quests/WIP/shadow_quest.txt
index 726df6fd9..34ae2e0a3 100644
--- a/npc/quests/WIP/shadow_quest.txt
+++ b/npc/quests/WIP/shadow_quest.txt
@@ -1,416 +1,416 @@
-//===== eAthena Script =======================================
-//= Lighthalzen, Shadow quest
-//===== By: ==================================================
-//= Gravity official script
-//= ColNix
-//===== Current Version: =====================================
-//= Fixed
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= Lighthalzen
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-lighthalzen.gat,141,162,4 script Old man 61,{
-readparam(baselevel);
-
-if (baselevel <= 70) {
-mes "["+strcharinfo(0)+"]";
-mes "It seems that i'm not as strong as i thought. Better i go to lvl.";
-close;
-}
- if (quest_shadow==1) {
- mes "[Kamenasai]";
- mes "Have you already spoken to Kazien? ooh...";
- mes "Hurry up and find him. He must be in Lighthalzen Castle.";
- close;
- }
- if (quest_shadow>1) {
- mes "[Kamenasai]";
- mes "I have nothing to say to you now.";
- mes "Leave me alone";
- close;
- }
-
-mes "[Kamenasai]";
-mes "Hello, "+strcharinfo(0)+". Nice to see you.";
-mes "I've heard alot about you doings. And want to know, if you could help us.";
-next;
-menu "Hm.. Interesting. Wat's the problem?",-,"No, I'm not interested",l_not;
-mes "[Kamenasai]";
-mes "I knew that you should help. So. My friend Kazien is busy due to a lack of workers,";
-mes "he has some work for you. Find him in Lighthalzen castle. Good luck";
-set quest_shadow,1;
-close;
-
-l_not:
-mes "[Kamenasai]";
-mes "It's a pity. But i cant make you change your mind. GL&HF guy. Cya";
-close;
-}
-
-//====================================================================================
-
-lhz_in01,174,258,4 script Young man 59,{
-if (quest_shadow==1) goto l_accept;
-if (quest_shadow==3) goto l_nochance;
-if (quest_shadow==4) goto l_part1;
-if (quest_shadow==5) goto l_wtfisthat;
-if (quest_shadow==8) goto l_zadolbal;
-if (quest_shadow==10) goto l_nu;
-
-mes "[Kazien]";
-mes "What do you want? Don't you see that i'm busy now!. Leave me alone!";
-close;
-
-l_accept:
-mes "[Kazien]";
-mes "What do you want from me. Don't you see that i am busy?";
-next;
-menu "Well, i'm, from Kamenasai",-,"hm... Can i borow some money? ^_-",l_nothing;
-mes "[Kazien]";
-mes "Oh, sorry my friend. You come to help me, don't you.";
-mes "Thanks alot. I'm too busy here and cant go myself, so i let my frind to help me";
-mes "His choice is you... So. Can you keep a secret?";
-next;
-menu "Of course i can",-,"i'm not sure.",l_goaway;
-mes "[Kazien]";
-mes "Well then. Lets see. Go to Einbroch Research Facility and find Garins there.";
-set quest_shadow,2;
-close;
-
-l_nothing:
-mes "[Kazien]";
-mes "Then, please leave me alone. I dont have any wish to speak to you.";
-close;
-
-l_goaway:
-mes "[Kazien]";
-mes "Its a pity... I think my friend was wrong sending you to me. Buy.";
-close;
-
-l_part1:
-mes "[Kazien]";
-mes "I see. You dont tell That guard about your quest, so i can rely on you. It was your first task.";
-mes "Now i shall tell you all. I am trying to make some buisness. But i can't deliver goods by myself.";
-mes "So i need somebody. And this somebody is you, "+strcharinfo(0)+".";
-next;
-mes "[Kazien]";
-mes "Go and Find Lyozien near Airship. He will tell you more.";
-close;
-
-l_forget:
-mes "[Kazien]";
-mes "Oh my head. Who are you at last? Im very dull. Somebody tell the police about me";
-mes "I am so bored...So...";
-next;
-goto l_accept;
-close;
-
-l_nochance:
-if (rand(10)==9) goto l_forget;
-mes "[Kazien]";
-mes "You cant keep any secret! What do you want from me?";
-mes "I dont want to see you anymore! Go somewhere else and never come here!";
-close;
-
-l_wtfisthat:
-if (quest_shadow_misc==1) goto l_leftthis;
-mes "[Kazien]";
-mes "Hm... He is saying something interesting. I will give delivery scroll. Go to";
-mes "Lyozien and speak to him...He is at the top of all this.";
-getitem 1072,1;
-getexp 110000,0;
-set quest_shadow_mobs,1;
-set quest_shadow_misc,1;
-set quest_shadow,6;
-close;
-
-l_zadolbal:
-if (quest_shadow_misc==2) goto l_leftthis;
-mes "[Kazien]";
-mes "Hm... He dont answer...You know thats strange. Something is wrong..";
-mes "And this something can destroy our plans....";
-next;
-menu "Also bandits.. and goods",-,"In every way i'm leaving this",l_leftthis;
-mes "[Kazien]";
-mes "Hm.. So you dont still receive goods.. And you say that bandits atack you...";
-mes "Now i understand. Go to Lyozien and be careful!";
-monster "airplane_01.gat",96,48,"Rogue",1268,1,"Man::OnMyMobDeath";
-getexp 150000,0;
-set quest_shadow_misc,2;
-set quest_shadow,9;
-close;
-
-l_leftthis:
-mes "[Kazien]";
-mes "Ye.. Its a pity i think. But its your choice. Remember,if you tell somebody";
-mes "About this you shall be dead...See you later";
-close;
-
-l_nu:
-if (quest_shadow_finish==1) goto l_leftthis;
-mes "[Kazien]";
-mes "How is our work? What about goods?";
-next;
-menu "Everything was really cool. I have lots of fun",-,"It was the wersest thing.",-;
-mes "[Kazien]";
-mes "Well... in everycase.^_^ I think you were really a good comrad";
-mes "["+strcharinfo(0)+"]";
-mes "I dont think so about you. Because i work for you and i must know what ware the goods";
-next;
-mes "[Kazien]";
-mes "Don't you think that it was me who give you work, let me dicide what you must know";
-mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
-mes "See you,my hero";
-getexp 150000,0;
-set quest_shadow_finish,1;
-close;
-}
-//===================================================================================
-lhz_in01,156,248,4 script #Kazien -1,6,3{
-OnTouch:
-if (quest_shadow_finish==1) {
-mes "[Remindes]";
-mes "[Kazien]";
-mes "How is our work? What about goods?";
-mes "...................................";
-mes "[Kazien]";
-mes "Well... in everycase. I think you were really a good comrade";
-mes "["+strcharinfo(0)+"]";
-mes "I dont think so. Because i work for you and i must know what was there";
-next;
-mes "[Kazien]";
-mes "Don't you think that it was me who give you work, let me dicide what you must know";
-mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
-mes "See you,my hero";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "Strange people are they... but i suppose that was really interesting journey...";
-set quest_shadow_finish,0;
-set quest_shadow,11;
-close;
-}
-close;
-}
-//===================================================================================
-airplane_01.gat,96,53,4 script #maner -1,6,3{
-OnTouch:
-if ((quest_shadow==6) && (quest_shadow_mobs==1)) {
-monster "airplane_01.gat",96,53,"Rogue",1268,5;
-set quest_shadow_mobs,0;
-}
-close;
-}
-//=======================================================================================
-airplane_01.gat,85,47,4 script #maner01 -1,6,3{
-OnTouch:
-if ((quest_shadow==6) && (quest_shadow_mobs==1)) {
-monster "airplane_01.gat",85,47,"Rogue",1268,5;
-set quest_shadow_mobs,0;
-}
-close;
-}
-//=======================================================================================
-lhz_in01,175,234,4 script #Kazien01 -1,6,3{
-OnTouch:
-if (quest_shadow_finish==1) {
-mes "[Remindes]";
-mes "[Kazien]";
-mes "How is our work? What about goods?";
-mes "...................................";
-mes "[Kazien]";
-mes "Well... in everycase. I think you were really a good comrade";
-mes "["+strcharinfo(0)+"]";
-mes "I dont think so. Because i work for you and i must know what was there";
-next;
-mes "[Kazien]";
-mes "Don't you think that it was me who give you work, let me dicide what you must know";
-mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
-mes "See you,my hero";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "Strange people are they... but i suppose that was really interesting journey...";
-set quest_shadow_finish,0;
-set quest_shadow,11;
-close;
-}
-close;
-}
-//=======================================================================================
-
-einbroch.gat,54,52,4 script Guard 734,{
-if (quest_shadow==2) goto l_done;
-
-mes "[Guard]";
-mes "This is restricted zone. Please leave this place.";
-close;
-
-l_done:
-mes "[Guard]";
-mes "Hey. Stop. What do you want here? Dont you know that this is restrickted zone?";
-mes "Tell me why are you here?";
-next;
-menu "Well...I'm leaving now. I dont know that",-,"Hm... Kazien asked me to find Garins.",l_garins;
-close2;
-set quest_shadow,4;
-end;
-
-l_garins:
-mes "[Guard]";
-mes "You say Kazien.. From Lighthalzen....";
-next;
-npctalk "*writing something to the notepad*";
-mes "[Guard]";
-mes "Find Garins.... Ok. Thanks. Now you are free. Go home.";
-set quest_shadow,3;
-close;
-}
-
-//========================================================================================
-
-airplane_01.gat,96,48,4 script Man 810,{
-if (quest_shadow==4) goto l_allok;
-if (quest_shadow==5) goto l_strange;
-if (quest_shadow==6) goto l_next;
-if (quest_shadow==7) goto l_talked;
-if (quest_shadow==9) goto l_nuinah;
-if (quest_shadow==10) goto l_wazaputaus;
-
-mes "[Lyozien]";
-mes "Greeting to you. Nice weather,isn't it?";
-close;
-
-l_strange:
-mes "[Lyozien]";
-mes "Hm.. strange. Kazien tell me nothing about it. I suppose you will better go to him";
-mes "and ask about this";
-close;
-
-l_allok:
-mes "[Lyozien]";
-mes "Oki doki guy. You see, that this is restricted doing. But we must do it";
-mes "For future of our country. So. That goods are really needed to our goverment, but";
-mes "Some rogues want to robe it. We can't protect them ourselves because we are on kings work";
-next;
-mes "[Lyozien]";
-mes "So its you, who will make it";
-mes "Go to Izlude and found Ahman there. He will give you nececcery items";
-mes "Good luck";
-close;
-
-l_next:
-mes "[Lyozien]";
-mes "So. What he says??";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "He say to come to you. Here is the Scroll of deliver that i must show you.";
-next;
-mes "[Lyozien]";
-mes "I suppose you should better go to Ahman and show this... In cas, i have no goods to give you.";
-close;
-
-l_talked:
-mes "[Lyozien]";
-mes "Well... You say He dont answer... I suppose You better go to Kazien and tell him this.";
-mes "It seemes to that it wasnt our plan.. i fear... Noway. Hurry up to Kazien";
-set quest_shadow,8;
-close;
-
-l_nuinah:
-if mobcount("airplane_01.gat","Man::OnMyMobDeath")==0 goto ondeath;
-mes "[Lyozien]";
-mes "Well.. I really dont know. But i will never tell you wat are the goods";
-mes "hey, Bandit is there! LOOK!!!";
-close;
-
-
-OnDeath:
-if looked==1 {
-mes "[Lyozien]";
-mes "I have already given you medicine. Hurry. Somebody";
-mes "wants to stop us!";
-close;
-}
-
-mes "[Lyozien]";
-mes "Whooo... I was so frightened... Here is potion for you. Hurry up. Go to Ahman";
-getitem 504,1;
-next;
-mes "Suddenly you see that some goods are broken...";
-mes "You decided to examine them";
-set looked,1;
-close;
-end;
-
-l_wazaputaus:
-Mes "[Lyozien]";
-mes "Well Ahmer was right. You are ill. Better have a rest.";
-mes "Go to Kazien. He will help you.";
-close;
-}
-
-//========================================================================================
-
-izlude.gat,186,57,4 script Scamp 85,{
-if quest_shadow==4 goto l_gocheck;
-if quest_shadow==6 goto l_done;
-if quest_shadow==9 goto l_nah;
-
-mes "[Ahman]";
-mes "Ahmaaa... Ahnaaa... Ahmaaan....";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "????????";
-next;
-mes "[Ahman]";
-mes "Ahmaaa... Ahnaaa... Ahmaaan....";
-close;
-
-l_gocheck:
-mes "[Ahman]";
-mes "Hello there. What do you want?";
-menu "i want to deliver goods.",-,"nothing",l_close;
-next;
-mes "[Ahman]";
-mes "what goods. What are you talking about? I know nothing about this.";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "Im here from Kazien, who send me to Lyozien who send me to you....";
-next;
-mes "[Ahman]";
-mes "Even so. Goods are already delivered. Go back to Lyozien";
-set quest_shadow,5;
-close;
-
-l_close:
-mes "[Ahman]";
-mes "You are very strange guy..";
-close;
-
-l_done:
-mes "["+strcharinfo(0)+"]";
-mes "hey!...";
-next;
-mes "You stay about 1 hour trying to speak to him. No answer";
-next;
-mes ".........";
-mes "["+strcharinfo(0)+"]";
-mes "Go i better to Lyozien. he is dead i think...";
-set quest_shadow,7;
-close;
-
-l_nah:
-mes "[Ahmar]";
-mes "You look very ill. You know?";
-next;
-mes "["+strcharinfo(0)+"]";
-mes "I dunno. Dont you know about atack on your goods? Some of them were broken. And i examine them..";
-next;
-mes "[Ahmer]";
-mes "What?? You look at them?? Its bad. go to Lyozine. Hurry!";
-set quest_shadow,10;
-close;
+//===== eAthena Script =======================================
+//= Lighthalzen, Shadow quest
+//===== By: ==================================================
+//= Gravity official script
+//= ColNix
+//===== Current Version: =====================================
+//= Fixed
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= Lighthalzen
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+lighthalzen.gat,141,162,4 script Old man 61,{
+readparam(baselevel);
+
+if (baselevel <= 70) {
+mes "["+strcharinfo(0)+"]";
+mes "It seems that i'm not as strong as i thought. Better i go to lvl.";
+close;
+}
+ if (quest_shadow==1) {
+ mes "[Kamenasai]";
+ mes "Have you already spoken to Kazien? ooh...";
+ mes "Hurry up and find him. He must be in Lighthalzen Castle.";
+ close;
+ }
+ if (quest_shadow>1) {
+ mes "[Kamenasai]";
+ mes "I have nothing to say to you now.";
+ mes "Leave me alone";
+ close;
+ }
+
+mes "[Kamenasai]";
+mes "Hello, "+strcharinfo(0)+". Nice to see you.";
+mes "I've heard alot about you doings. And want to know, if you could help us.";
+next;
+menu "Hm.. Interesting. Wat's the problem?",-,"No, I'm not interested",l_not;
+mes "[Kamenasai]";
+mes "I knew that you should help. So. My friend Kazien is busy due to a lack of workers,";
+mes "he has some work for you. Find him in Lighthalzen castle. Good luck";
+set quest_shadow,1;
+close;
+
+l_not:
+mes "[Kamenasai]";
+mes "It's a pity. But i cant make you change your mind. GL&HF guy. Cya";
+close;
+}
+
+//====================================================================================
+
+lhz_in01,174,258,4 script Young man 59,{
+if (quest_shadow==1) goto l_accept;
+if (quest_shadow==3) goto l_nochance;
+if (quest_shadow==4) goto l_part1;
+if (quest_shadow==5) goto l_wtfisthat;
+if (quest_shadow==8) goto l_zadolbal;
+if (quest_shadow==10) goto l_nu;
+
+mes "[Kazien]";
+mes "What do you want? Don't you see that i'm busy now!. Leave me alone!";
+close;
+
+l_accept:
+mes "[Kazien]";
+mes "What do you want from me. Don't you see that i am busy?";
+next;
+menu "Well, i'm, from Kamenasai",-,"hm... Can i borow some money? ^_-",l_nothing;
+mes "[Kazien]";
+mes "Oh, sorry my friend. You come to help me, don't you.";
+mes "Thanks alot. I'm too busy here and cant go myself, so i let my frind to help me";
+mes "His choice is you... So. Can you keep a secret?";
+next;
+menu "Of course i can",-,"i'm not sure.",l_goaway;
+mes "[Kazien]";
+mes "Well then. Lets see. Go to Einbroch Research Facility and find Garins there.";
+set quest_shadow,2;
+close;
+
+l_nothing:
+mes "[Kazien]";
+mes "Then, please leave me alone. I dont have any wish to speak to you.";
+close;
+
+l_goaway:
+mes "[Kazien]";
+mes "Its a pity... I think my friend was wrong sending you to me. Buy.";
+close;
+
+l_part1:
+mes "[Kazien]";
+mes "I see. You dont tell That guard about your quest, so i can rely on you. It was your first task.";
+mes "Now i shall tell you all. I am trying to make some buisness. But i can't deliver goods by myself.";
+mes "So i need somebody. And this somebody is you, "+strcharinfo(0)+".";
+next;
+mes "[Kazien]";
+mes "Go and Find Lyozien near Airship. He will tell you more.";
+close;
+
+l_forget:
+mes "[Kazien]";
+mes "Oh my head. Who are you at last? Im very dull. Somebody tell the police about me";
+mes "I am so bored...So...";
+next;
+goto l_accept;
+close;
+
+l_nochance:
+if (rand(10)==9) goto l_forget;
+mes "[Kazien]";
+mes "You cant keep any secret! What do you want from me?";
+mes "I dont want to see you anymore! Go somewhere else and never come here!";
+close;
+
+l_wtfisthat:
+if (quest_shadow_misc==1) goto l_leftthis;
+mes "[Kazien]";
+mes "Hm... He is saying something interesting. I will give delivery scroll. Go to";
+mes "Lyozien and speak to him...He is at the top of all this.";
+getitem 1072,1;
+getexp 110000,0;
+set quest_shadow_mobs,1;
+set quest_shadow_misc,1;
+set quest_shadow,6;
+close;
+
+l_zadolbal:
+if (quest_shadow_misc==2) goto l_leftthis;
+mes "[Kazien]";
+mes "Hm... He dont answer...You know thats strange. Something is wrong..";
+mes "And this something can destroy our plans....";
+next;
+menu "Also bandits.. and goods",-,"In every way i'm leaving this",l_leftthis;
+mes "[Kazien]";
+mes "Hm.. So you dont still receive goods.. And you say that bandits atack you...";
+mes "Now i understand. Go to Lyozien and be careful!";
+monster "airplane_01.gat",96,48,"Rogue",1268,1,"Man::OnMyMobDeath";
+getexp 150000,0;
+set quest_shadow_misc,2;
+set quest_shadow,9;
+close;
+
+l_leftthis:
+mes "[Kazien]";
+mes "Ye.. Its a pity i think. But its your choice. Remember,if you tell somebody";
+mes "About this you shall be dead...See you later";
+close;
+
+l_nu:
+if (quest_shadow_finish==1) goto l_leftthis;
+mes "[Kazien]";
+mes "How is our work? What about goods?";
+next;
+menu "Everything was really cool. I have lots of fun",-,"It was the wersest thing.",-;
+mes "[Kazien]";
+mes "Well... in everycase.^_^ I think you were really a good comrad";
+mes "["+strcharinfo(0)+"]";
+mes "I dont think so about you. Because i work for you and i must know what ware the goods";
+next;
+mes "[Kazien]";
+mes "Don't you think that it was me who give you work, let me dicide what you must know";
+mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
+mes "See you,my hero";
+getexp 150000,0;
+set quest_shadow_finish,1;
+close;
+}
+//===================================================================================
+lhz_in01,156,248,4 script #Kazien -1,6,3{
+OnTouch:
+if (quest_shadow_finish==1) {
+mes "[Remindes]";
+mes "[Kazien]";
+mes "How is our work? What about goods?";
+mes "...................................";
+mes "[Kazien]";
+mes "Well... in everycase. I think you were really a good comrade";
+mes "["+strcharinfo(0)+"]";
+mes "I dont think so. Because i work for you and i must know what was there";
+next;
+mes "[Kazien]";
+mes "Don't you think that it was me who give you work, let me dicide what you must know";
+mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
+mes "See you,my hero";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "Strange people are they... but i suppose that was really interesting journey...";
+set quest_shadow_finish,0;
+set quest_shadow,11;
+close;
+}
+close;
+}
+//===================================================================================
+airplane_01.gat,96,53,4 script #maner -1,6,3{
+OnTouch:
+if ((quest_shadow==6) && (quest_shadow_mobs==1)) {
+monster "airplane_01.gat",96,53,"Rogue",1268,5;
+set quest_shadow_mobs,0;
+}
+close;
+}
+//=======================================================================================
+airplane_01.gat,85,47,4 script #maner01 -1,6,3{
+OnTouch:
+if ((quest_shadow==6) && (quest_shadow_mobs==1)) {
+monster "airplane_01.gat",85,47,"Rogue",1268,5;
+set quest_shadow_mobs,0;
+}
+close;
+}
+//=======================================================================================
+lhz_in01,175,234,4 script #Kazien01 -1,6,3{
+OnTouch:
+if (quest_shadow_finish==1) {
+mes "[Remindes]";
+mes "[Kazien]";
+mes "How is our work? What about goods?";
+mes "...................................";
+mes "[Kazien]";
+mes "Well... in everycase. I think you were really a good comrade";
+mes "["+strcharinfo(0)+"]";
+mes "I dont think so. Because i work for you and i must know what was there";
+next;
+mes "[Kazien]";
+mes "Don't you think that it was me who give you work, let me dicide what you must know";
+mes "Afterall thx. Without you, this work wasn't done. You help me alot. I waiting forward hearing about your greatest doings.";
+mes "See you,my hero";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "Strange people are they... but i suppose that was really interesting journey...";
+set quest_shadow_finish,0;
+set quest_shadow,11;
+close;
+}
+close;
+}
+//=======================================================================================
+
+einbroch.gat,54,52,4 script Guard 734,{
+if (quest_shadow==2) goto l_done;
+
+mes "[Guard]";
+mes "This is restricted zone. Please leave this place.";
+close;
+
+l_done:
+mes "[Guard]";
+mes "Hey. Stop. What do you want here? Dont you know that this is restrickted zone?";
+mes "Tell me why are you here?";
+next;
+menu "Well...I'm leaving now. I dont know that",-,"Hm... Kazien asked me to find Garins.",l_garins;
+close2;
+set quest_shadow,4;
+end;
+
+l_garins:
+mes "[Guard]";
+mes "You say Kazien.. From Lighthalzen....";
+next;
+npctalk "*writing something to the notepad*";
+mes "[Guard]";
+mes "Find Garins.... Ok. Thanks. Now you are free. Go home.";
+set quest_shadow,3;
+close;
+}
+
+//========================================================================================
+
+airplane_01.gat,96,48,4 script Man 810,{
+if (quest_shadow==4) goto l_allok;
+if (quest_shadow==5) goto l_strange;
+if (quest_shadow==6) goto l_next;
+if (quest_shadow==7) goto l_talked;
+if (quest_shadow==9) goto l_nuinah;
+if (quest_shadow==10) goto l_wazaputaus;
+
+mes "[Lyozien]";
+mes "Greeting to you. Nice weather,isn't it?";
+close;
+
+l_strange:
+mes "[Lyozien]";
+mes "Hm.. strange. Kazien tell me nothing about it. I suppose you will better go to him";
+mes "and ask about this";
+close;
+
+l_allok:
+mes "[Lyozien]";
+mes "Oki doki guy. You see, that this is restricted doing. But we must do it";
+mes "For future of our country. So. That goods are really needed to our goverment, but";
+mes "Some rogues want to robe it. We can't protect them ourselves because we are on kings work";
+next;
+mes "[Lyozien]";
+mes "So its you, who will make it";
+mes "Go to Izlude and found Ahman there. He will give you nececcery items";
+mes "Good luck";
+close;
+
+l_next:
+mes "[Lyozien]";
+mes "So. What he says??";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "He say to come to you. Here is the Scroll of deliver that i must show you.";
+next;
+mes "[Lyozien]";
+mes "I suppose you should better go to Ahman and show this... In cas, i have no goods to give you.";
+close;
+
+l_talked:
+mes "[Lyozien]";
+mes "Well... You say He dont answer... I suppose You better go to Kazien and tell him this.";
+mes "It seemes to that it wasnt our plan.. i fear... Noway. Hurry up to Kazien";
+set quest_shadow,8;
+close;
+
+l_nuinah:
+if mobcount("airplane_01.gat","Man::OnMyMobDeath")==0 goto ondeath;
+mes "[Lyozien]";
+mes "Well.. I really dont know. But i will never tell you wat are the goods";
+mes "hey, Bandit is there! LOOK!!!";
+close;
+
+
+OnDeath:
+if looked==1 {
+mes "[Lyozien]";
+mes "I have already given you medicine. Hurry. Somebody";
+mes "wants to stop us!";
+close;
+}
+
+mes "[Lyozien]";
+mes "Whooo... I was so frightened... Here is potion for you. Hurry up. Go to Ahman";
+getitem 504,1;
+next;
+mes "Suddenly you see that some goods are broken...";
+mes "You decided to examine them";
+set looked,1;
+close;
+end;
+
+l_wazaputaus:
+Mes "[Lyozien]";
+mes "Well Ahmer was right. You are ill. Better have a rest.";
+mes "Go to Kazien. He will help you.";
+close;
+}
+
+//========================================================================================
+
+izlude.gat,186,57,4 script Scamp 85,{
+if quest_shadow==4 goto l_gocheck;
+if quest_shadow==6 goto l_done;
+if quest_shadow==9 goto l_nah;
+
+mes "[Ahman]";
+mes "Ahmaaa... Ahnaaa... Ahmaaan....";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "????????";
+next;
+mes "[Ahman]";
+mes "Ahmaaa... Ahnaaa... Ahmaaan....";
+close;
+
+l_gocheck:
+mes "[Ahman]";
+mes "Hello there. What do you want?";
+menu "i want to deliver goods.",-,"nothing",l_close;
+next;
+mes "[Ahman]";
+mes "what goods. What are you talking about? I know nothing about this.";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "Im here from Kazien, who send me to Lyozien who send me to you....";
+next;
+mes "[Ahman]";
+mes "Even so. Goods are already delivered. Go back to Lyozien";
+set quest_shadow,5;
+close;
+
+l_close:
+mes "[Ahman]";
+mes "You are very strange guy..";
+close;
+
+l_done:
+mes "["+strcharinfo(0)+"]";
+mes "hey!...";
+next;
+mes "You stay about 1 hour trying to speak to him. No answer";
+next;
+mes ".........";
+mes "["+strcharinfo(0)+"]";
+mes "Go i better to Lyozien. he is dead i think...";
+set quest_shadow,7;
+close;
+
+l_nah:
+mes "[Ahmar]";
+mes "You look very ill. You know?";
+next;
+mes "["+strcharinfo(0)+"]";
+mes "I dunno. Dont you know about atack on your goods? Some of them were broken. And i examine them..";
+next;
+mes "[Ahmer]";
+mes "What?? You look at them?? Its bad. go to Lyozine. Hurry!";
+set quest_shadow,10;
+close;
} \ No newline at end of file
diff --git a/npc/quests/bongunsword.txt b/npc/quests/bongunsword.txt
index 175f32957..861fc425a 100644
--- a/npc/quests/bongunsword.txt
+++ b/npc/quests/bongunsword.txt
@@ -1,157 +1,157 @@
-//===== eAthena Script =======================================
-//= Munak and Bongun accessory / Taming items Quest
-//===== By: ==================================================
-//= eAthena Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Quest itms:Sword o'Chinese Exorcist,No Recipient,Her Heart
-//===== Additional Comments: =================================
-//= 1.0. merged 3 sep. files, fixed exploits [Lupus]
-//= 1.1 Added missing next;'s [Evera]
-//= 1.2 Added another missing next; [Evera]
-//============================================================
-
-
-comodo.gat,135,227,5 script Sherri 93,{
- mes "[Sherri]";
- mes " ";
- mes "*sighs*";
- next;
- mes "[Sherri]";
- mes "Oh? Whats the matter? ...Well, I have finally managed to encase the soul of a handsome boy ...";
- next;
- mes "[Sherri]";
- mes "...so why am I sad?";
- mes " ";
- mes "It's because I don't even know how his personality is... say, if you can find me a 'Girl's Diary' about him, I'll give you his diary!";
- next;
- mes "[Sherri]";
- mes "Can you please help me?";
- next;
-
- menu "What do I need again?",-,"Here! I got what you need!",ExCreate,"Sorry, I can't help you.",ExEnd;
-
- mes "[Sherri]";
- mes "What I desire is...";
- mes " ";
- mes "A 'Girl's Diary' about him...";
- close;
-
-ExCreate:
- mes "[Sherri]";
- mes "Really!! You'll help me!";
- next;
-
- if(countitem(1558)<1) goto L_NoItem;//Items: Girl's_Diary,
- delitem 1558,1;//Items: Girl's_Diary,
- getitem 659,1;//Items: Her_Heart,
- mes "[Sherri]";
- mes "YES! I am forever in your debt!";
- mes " ";
- mes "Here is his diary as promised! Again - Thank you!";
- next;
- mes "[Sherri]";
- mes "Wait! Here's his sword, I found it next to him. But it's broken... I know of a old man just west of Geffen who can fix such a sword!";
- getitem 7110,1;//Items: Broken_Sword,
- close;
-
-L_NoItem:
- mes "[Sherri]";
- mes "Waahhhh, stop playing with my feelings!";
- mes " ";
- mes "Go away!";
- close;
-ExEnd:
- mes "[Sherri]";
- mes "*sighs*";
- close;
-}
-
-izlude_in.gat,115,76,5 script Evan 47,{
- mes "[Evan]";
- mes " ";
- mes "*sighs*";
- next;
- mes "[Evan]";
- mes "Oh? Whats the matter? ...Well, I have finally managed to encase the soul of a pretty girl ...";
- next;
- mes "[Evan]";
- mes "...so why am I sad?";
- mes " ";
- mes "It's because I don't even know how she looks like...say, if you can find me and 'Old Portrait' of her, I'll give you her lover's lost letter!";
- next;
- mes "[Evan]";
- mes "Whaddaya say? ..pal?";
- next;
-
- menu "What do I need again?",-,"Here! I got what you need!",ExCreate,"Sorry, I can't help you.",ExEnd;
-
- mes "[Evan]";
- mes "A picture of her lovely face...";
- mes " ";
- mes "An 'Old Portrait' preferrably...";
- close;
-
-ExCreate:
- mes "[Evan]";
- mes "Really!! You'll help me!";
- next;
- if(countitem(7014)<1) goto L_NoItem;//Items: Old_Portrait,
- delitem 7014,1;//Items: Old_Portrait,
- getitem 636,1;//Items: No_Recipient,
- mes "[Evan]";
- mes "YES! I am forever in your debt!";
- mes " ";
- mes "Here is lover's lost letter as promised! Again - Thank you!";
- close;
-
-L_NoItem:
- mes "[Evan]";
- mes "Waahhhh, stop playing with my feelings!";
- mes " ";
- mes "Go away!";
- close;
-
-ExEnd:
- mes "[Evan]";
- mes "*sighs*";
- close;
-}
-
-gef_fild07.gat,183,239,5 script Old Smith 120,{
- mes "[Old Smith]";
- mes "Ah, isn't it peaceful up here - I used to be one of the legendary Blacksmiths of midgard...sadly my skills have faded.";
- next;
- if(countitem(7110)<1) goto L_NoItemS;//Items: Broken_Sword,
- mes "[Old Smith]";
- mes "Hmm, it seems as if you need something. What would that be?";
- next;
- menu "Can you fix this broken sword?",-,"Nothing really...",ExEnd;
-
- mes "[Old Smith]";
- mes "Ahhh, this is a very old sword and yes I can fix it, I'll need an 'Oridecon' to mend the breaks though.";
- next;
- if(countitem(7110)<1 || countitem(984)<1) goto L_NoItem;//Items: Broken_Sword, Oridecon,
- delitem 7110,1;//Items: Broken_Sword,
- delitem 984,1;//Items: Oridecon,
- getitem 10020,1;//Items: Sword_of_Chinese_Exorcist,
- mes "[Old Smith]";
- mes "Ah yes here we go!";
- mes " ";
- mes "Haha! Gramps still has that old magic touch, Here you go!";
- close;
-
-L_NoItem:
- mes "[Old Smith]";
- mes "Hmm, you seem to be missing something... probably that 'Oridecon'.";
- close;
-
-L_NoItemS:
-ExEnd:
- mes "[Old Smith]";
- mes "...ah well, go out and live life young one. Time never stops!";
- close;
-}
+//===== eAthena Script =======================================
+//= Munak and Bongun accessory / Taming items Quest
+//===== By: ==================================================
+//= eAthena Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Quest itms:Sword o'Chinese Exorcist,No Recipient,Her Heart
+//===== Additional Comments: =================================
+//= 1.0. merged 3 sep. files, fixed exploits [Lupus]
+//= 1.1 Added missing next;'s [Evera]
+//= 1.2 Added another missing next; [Evera]
+//============================================================
+
+
+comodo.gat,135,227,5 script Sherri 93,{
+ mes "[Sherri]";
+ mes " ";
+ mes "*sighs*";
+ next;
+ mes "[Sherri]";
+ mes "Oh? Whats the matter? ...Well, I have finally managed to encase the soul of a handsome boy ...";
+ next;
+ mes "[Sherri]";
+ mes "...so why am I sad?";
+ mes " ";
+ mes "It's because I don't even know how his personality is... say, if you can find me a 'Girl's Diary' about him, I'll give you his diary!";
+ next;
+ mes "[Sherri]";
+ mes "Can you please help me?";
+ next;
+
+ menu "What do I need again?",-,"Here! I got what you need!",ExCreate,"Sorry, I can't help you.",ExEnd;
+
+ mes "[Sherri]";
+ mes "What I desire is...";
+ mes " ";
+ mes "A 'Girl's Diary' about him...";
+ close;
+
+ExCreate:
+ mes "[Sherri]";
+ mes "Really!! You'll help me!";
+ next;
+
+ if(countitem(1558)<1) goto L_NoItem;//Items: Girl's_Diary,
+ delitem 1558,1;//Items: Girl's_Diary,
+ getitem 659,1;//Items: Her_Heart,
+ mes "[Sherri]";
+ mes "YES! I am forever in your debt!";
+ mes " ";
+ mes "Here is his diary as promised! Again - Thank you!";
+ next;
+ mes "[Sherri]";
+ mes "Wait! Here's his sword, I found it next to him. But it's broken... I know of a old man just west of Geffen who can fix such a sword!";
+ getitem 7110,1;//Items: Broken_Sword,
+ close;
+
+L_NoItem:
+ mes "[Sherri]";
+ mes "Waahhhh, stop playing with my feelings!";
+ mes " ";
+ mes "Go away!";
+ close;
+ExEnd:
+ mes "[Sherri]";
+ mes "*sighs*";
+ close;
+}
+
+izlude_in.gat,115,76,5 script Evan 47,{
+ mes "[Evan]";
+ mes " ";
+ mes "*sighs*";
+ next;
+ mes "[Evan]";
+ mes "Oh? Whats the matter? ...Well, I have finally managed to encase the soul of a pretty girl ...";
+ next;
+ mes "[Evan]";
+ mes "...so why am I sad?";
+ mes " ";
+ mes "It's because I don't even know how she looks like...say, if you can find me and 'Old Portrait' of her, I'll give you her lover's lost letter!";
+ next;
+ mes "[Evan]";
+ mes "Whaddaya say? ..pal?";
+ next;
+
+ menu "What do I need again?",-,"Here! I got what you need!",ExCreate,"Sorry, I can't help you.",ExEnd;
+
+ mes "[Evan]";
+ mes "A picture of her lovely face...";
+ mes " ";
+ mes "An 'Old Portrait' preferrably...";
+ close;
+
+ExCreate:
+ mes "[Evan]";
+ mes "Really!! You'll help me!";
+ next;
+ if(countitem(7014)<1) goto L_NoItem;//Items: Old_Portrait,
+ delitem 7014,1;//Items: Old_Portrait,
+ getitem 636,1;//Items: No_Recipient,
+ mes "[Evan]";
+ mes "YES! I am forever in your debt!";
+ mes " ";
+ mes "Here is lover's lost letter as promised! Again - Thank you!";
+ close;
+
+L_NoItem:
+ mes "[Evan]";
+ mes "Waahhhh, stop playing with my feelings!";
+ mes " ";
+ mes "Go away!";
+ close;
+
+ExEnd:
+ mes "[Evan]";
+ mes "*sighs*";
+ close;
+}
+
+gef_fild07.gat,183,239,5 script Old Smith 120,{
+ mes "[Old Smith]";
+ mes "Ah, isn't it peaceful up here - I used to be one of the legendary Blacksmiths of midgard...sadly my skills have faded.";
+ next;
+ if(countitem(7110)<1) goto L_NoItemS;//Items: Broken_Sword,
+ mes "[Old Smith]";
+ mes "Hmm, it seems as if you need something. What would that be?";
+ next;
+ menu "Can you fix this broken sword?",-,"Nothing really...",ExEnd;
+
+ mes "[Old Smith]";
+ mes "Ahhh, this is a very old sword and yes I can fix it, I'll need an 'Oridecon' to mend the breaks though.";
+ next;
+ if(countitem(7110)<1 || countitem(984)<1) goto L_NoItem;//Items: Broken_Sword, Oridecon,
+ delitem 7110,1;//Items: Broken_Sword,
+ delitem 984,1;//Items: Oridecon,
+ getitem 10020,1;//Items: Sword_of_Chinese_Exorcist,
+ mes "[Old Smith]";
+ mes "Ah yes here we go!";
+ mes " ";
+ mes "Haha! Gramps still has that old magic touch, Here you go!";
+ close;
+
+L_NoItem:
+ mes "[Old Smith]";
+ mes "Hmm, you seem to be missing something... probably that 'Oridecon'.";
+ close;
+
+L_NoItemS:
+ExEnd:
+ mes "[Old Smith]";
+ mes "...ah well, go out and live life young one. Time never stops!";
+ close;
+}
diff --git a/npc/quests/bunnyband.txt b/npc/quests/bunnyband.txt
index 3f9cbd3bf..2ec20afa7 100644
--- a/npc/quests/bunnyband.txt
+++ b/npc/quests/bunnyband.txt
@@ -1,98 +1,98 @@
-//===== eAthena Script =======================================
-//= Bunny Band Quest
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= v1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 using duplicate command
-//= 1.2 Fixed NPC location, removed NPC dupes [Lupus]
-//= 1.3 RE-Fixed exploit V_V, also cleared used VAR [Lupus]
-//= 1.4 replaced BUNYBND with @BUNYBND [Lupus]
-//============================================================
-
-
-// Alberta ------------------------------------------------------------------------------------------------------------------------------------------
-alberta.gat,23,232,1 script Kafra Corp. Rep.#1::KCRep 83,{
- mes "[Kafra Corp. Rep.]";
- if (@BUNYBND) goto L_Check;
- mes "^529DFFSpecial Event, ^FF0000Bunny Band ^529DFFQuest!!^000000";
- next;
- menu "Information",-, "Join",M_Join, "Cancel",M_End;
-
- mes "[Kafra Corp. Rep.]";
- mes "To thank our customers for using the Kafra Corp. services, we have prepapred a small event for them...";
- next;
- mes "[Kafra Corp. Rep.]";
- mes "The ^FF0000Bunny Band ^529DFFquest!!!^000000. (Sponsered by: The Alberta Merchant Association.)";
- mes "This quest allows players to obtain the ultra-rare ^FF0000Bunny Band^000000!";
- next;
- mes "[Kafra Corp. Rep.]";
- mes "All you have to do is collect a number of items and bring them to a Kafra Corp. representative such as myself.";
- mes "We will then carefully handmake a Bunny Band for you on the spot!";
- next;
- mes "[Kafra Corp. Rep.]";
- mes "Here are the items that you will need for the Bunny Band.";
- mes "^5555FF100 Feather^000000,";
- mes "^5555FF1 Four Leaf Clover^000000,";
- mes "^5555FF1 Pearl^000000,";
- mes "^5555FF1 Kitty Band^000000.";
- next;
- mes "[Kafra Corp. Rep.]";
- mes "When you've collected all of the items, just speak with any Kafra Corp. representative like myself.";
- mes "We can be found in every town across Rune Midgard.";
- close;
-
- M_Join:
-
- mes "[Kafra Corp. Rep.]";
- mes "Thank you for participating in the event. Please come back when you have gathered all of the items.";
- set @BUNYBND, 1;
- close;
-
- M_End:
- mes "[Kafra Corp. Rep.]";
- mes "Have a nice day.";
- close;
-
- L_Check:
- if(countitem(949)<100 || countitem(706)<1 || countitem(722)<1 || countitem(2213)<1) goto sL_NoItems;
- delitem 949,100;
- delitem 706,1;
- delitem 722,1;
- delitem 2213,1;
- mes "Wow! Well-done, well-done! You've got every single item! I will make the Bunny Band for you right away...";
- emotion e_no1;
- next;
- mes "[Kafra Corp. Rep.]";
- mes "Tah dah!!! Here is your ^FF0000Bunny Band^000000... Please take it!";
- getitem 2214,1;
- set @BUNYBND,0;
- next;
- mes "[Kafra Corp. Rep.]";
- mes "We appreciate your participation in this special event. Thank you and enjoy your Bunny Band!";
- close;
-
- sL_NoItems:
- mes "Here are the items that you will need for the Bunny Band.";
- mes "^5555FF100 Feather^000000,";
- mes "^5555FF1 Four Leaf Clover^000000,";
- mes "^5555FF1 Pearl^000000,";
- mes "^5555FF1 Kitty Band^000000.";
- close;
-
-}
-
-
-// Geffen ------------------------------------------------------------------------------------------------------------------------------------------
-//geffen.gat,116,62,2 duplicate(KCRep) Kafra Corp. Rep.#2 83,
-// Morroc ------------------------------------------------------------------------------------------------------------------------------------------
-//morocc.gat,154,97,4 duplicate(KCRep) Kafra Corp. Rep.#3 83,
-// Payon ------------------------------------------------------------------------------------------------------------------------------------------
-//payon.gat,184,104,4 duplicate(KCRep) Kafra Corp. Rep.#4 83,
-// Prontera ------------------------------------------------------------------------------------------------------------------------------------------
-//prontera.gat,146,87,6 duplicate(KCRep) Kafra Corp. Rep.#5 83,
+//===== eAthena Script =======================================
+//= Bunny Band Quest
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= v1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 using duplicate command
+//= 1.2 Fixed NPC location, removed NPC dupes [Lupus]
+//= 1.3 RE-Fixed exploit V_V, also cleared used VAR [Lupus]
+//= 1.4 replaced BUNYBND with @BUNYBND [Lupus]
+//============================================================
+
+
+// Alberta ------------------------------------------------------------------------------------------------------------------------------------------
+alberta.gat,23,232,1 script Kafra Corp. Rep.#1::KCRep 83,{
+ mes "[Kafra Corp. Rep.]";
+ if (@BUNYBND) goto L_Check;
+ mes "^529DFFSpecial Event, ^FF0000Bunny Band ^529DFFQuest!!^000000";
+ next;
+ menu "Information",-, "Join",M_Join, "Cancel",M_End;
+
+ mes "[Kafra Corp. Rep.]";
+ mes "To thank our customers for using the Kafra Corp. services, we have prepapred a small event for them...";
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "The ^FF0000Bunny Band ^529DFFquest!!!^000000. (Sponsered by: The Alberta Merchant Association.)";
+ mes "This quest allows players to obtain the ultra-rare ^FF0000Bunny Band^000000!";
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "All you have to do is collect a number of items and bring them to a Kafra Corp. representative such as myself.";
+ mes "We will then carefully handmake a Bunny Band for you on the spot!";
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "Here are the items that you will need for the Bunny Band.";
+ mes "^5555FF100 Feather^000000,";
+ mes "^5555FF1 Four Leaf Clover^000000,";
+ mes "^5555FF1 Pearl^000000,";
+ mes "^5555FF1 Kitty Band^000000.";
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "When you've collected all of the items, just speak with any Kafra Corp. representative like myself.";
+ mes "We can be found in every town across Rune Midgard.";
+ close;
+
+ M_Join:
+
+ mes "[Kafra Corp. Rep.]";
+ mes "Thank you for participating in the event. Please come back when you have gathered all of the items.";
+ set @BUNYBND, 1;
+ close;
+
+ M_End:
+ mes "[Kafra Corp. Rep.]";
+ mes "Have a nice day.";
+ close;
+
+ L_Check:
+ if(countitem(949)<100 || countitem(706)<1 || countitem(722)<1 || countitem(2213)<1) goto sL_NoItems;
+ delitem 949,100;
+ delitem 706,1;
+ delitem 722,1;
+ delitem 2213,1;
+ mes "Wow! Well-done, well-done! You've got every single item! I will make the Bunny Band for you right away...";
+ emotion e_no1;
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "Tah dah!!! Here is your ^FF0000Bunny Band^000000... Please take it!";
+ getitem 2214,1;
+ set @BUNYBND,0;
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "We appreciate your participation in this special event. Thank you and enjoy your Bunny Band!";
+ close;
+
+ sL_NoItems:
+ mes "Here are the items that you will need for the Bunny Band.";
+ mes "^5555FF100 Feather^000000,";
+ mes "^5555FF1 Four Leaf Clover^000000,";
+ mes "^5555FF1 Pearl^000000,";
+ mes "^5555FF1 Kitty Band^000000.";
+ close;
+
+}
+
+
+// Geffen ------------------------------------------------------------------------------------------------------------------------------------------
+//geffen.gat,116,62,2 duplicate(KCRep) Kafra Corp. Rep.#2 83,
+// Morroc ------------------------------------------------------------------------------------------------------------------------------------------
+//morocc.gat,154,97,4 duplicate(KCRep) Kafra Corp. Rep.#3 83,
+// Payon ------------------------------------------------------------------------------------------------------------------------------------------
+//payon.gat,184,104,4 duplicate(KCRep) Kafra Corp. Rep.#4 83,
+// Prontera ------------------------------------------------------------------------------------------------------------------------------------------
+//prontera.gat,146,87,6 duplicate(KCRep) Kafra Corp. Rep.#5 83,
diff --git a/npc/quests/cooking_quest.txt b/npc/quests/cooking_quest.txt
index d6ae0cec5..38c6bed98 100644
--- a/npc/quests/cooking_quest.txt
+++ b/npc/quests/cooking_quest.txt
@@ -1,600 +1,600 @@
-//===== eAthena Script =======================================
-//= Cooking Quest
-//===== By: ==================================================
-//= Reddozen
-//===== Current Version: =====================================
-//= 1.5a
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Official Cooking Quest
-//===== Additional Comments: =================================
-//= 1.1 Fixed wrong item ID, added missing ";, optimized [Lupus]
-//= 1.1a minor bugfix, thx 2 Irmin [Lupus]
-//= 1.2 Fixed exploit, some typos [Lupus]
-//= 1.3 Fixed wrong label [Lupus] 1.3a updated to Reddozen's changes
-//= 1.3b Fixed wrong id, fixed Puch quest, added more Pouch Quest
-//= dialogues [Lupus]
-//= 1.4 Fixed spelling, added some dialoguesm optimized
-//= fixed bugs. Tested, fully working [Lupus]
-//= 1.5 More fixes [Lupus]
-//============================================================
-
-prt_castle.gat,43,30,6 script Chef Apprentice 878,{
-
- mes "[Chef's Apprentice]";
-
- if(cooking == 1) goto L_Remind;
-
- if(cooking == 2){
- mes "I see you passed the test.";
- mes "Good job!";
- next;
- mes "[Chef's Apprentice]";
- mes "This book would be quite helpful for a novice chef.";
- getitem 7472, 1;//Items: Lv1 Cookbook,
- set cook_book, 7472;
- set cooking, 3;
- close;
- }
-
- if(cooking == 3){
- mes "Hi there. Is there something";
- mes "that I can help you with?";
- next;
- menu "Buy Supplies",M_BuySupply, "Talk about cooking",L_Cook_Talk, "Leave",L_No_Talk;
-
- M_BuySupply:
- mes "[Chef's Apprentice]";
- mes "Outdoor Cooking Set - 500z each";
- mes " How many?";
- input @amount;
- if(@amount < 1) goto ER_Invalid;
- if(@amount > 100) goto ER_TooMuch;
- if(@amount*500 > Zeny) goto ER_Zeny;
- set Zeny, Zeny-(@amount*500);
- getitem 12125, @amount;//Items: Outdoor Cooker,
- next;
- mes "[Chef's Apprentice]";
- mes "Enjoy!";
- close;
-
- L_Cook_Talk:
- mes "[Chef's Apprentice]";
- mes "You passed the test,";
- mes "but were your results";
- mes "worth while?";
- next;
- menu "Taste my food",-, "No, it was horrible",L_Taste_End;
-
- mes "[Chef's Apprentice]";
- mes "I don't know about that.";
- mes "It may not be safe...";
- next;
- menu "Please taste it",-, "You're probably right",L_Taste_End;
-
- mes "[Chef's Apprentice]";
- mes "Why would I want to try";
- mes "the food of a novice chef?";
- next;
- menu "Please try",-, "Yeah, I'm too new at this",L_Taste_End;
-
- mes "[Chef's Apprentice]";
- mes "I'll make a deal with you.";
- mes "if you cook me one of every";
- mes "Lv 1 food, then I'll try";
- mes "your Cooking...";
- next;
- menu "Agree",-, "Refuse",L_Taste_End;
-
- mes "[Chef's Apprentice]";
- mes "You'll need to make all";
- mes "six foods. Let me know";
- mes "when you're finished.";
- set cooking, 4;
- close;
-
- L_Taste_End:
- mes "[Chef's Apprentice]";
- mes "Come back when you feel";
- mes "more confident.";
- close;
-
- L_No_Talk:
- mes "[Chef's Apprentice]";
- mes "Come back to vist anytime!";
- mes "Have a good day.";
- close;
- }
-
- if(cooking == 4){
- if(countitem(12056)
- && countitem(12061)
- && countitem(12046)
- && countitem(12066)
- && countitem(12041)
- && countitem(12051)) {//Items: Frog Spawn Soup, Grape Juice with Honey, Grape Juice and Tea, Fried Monkey Tail, Boiled Locust, Steamed Crab Pincer,
-
- delitem 12056, 1;//Items: Frog Spawn Soup,
- delitem 12061, 1;//Items: Grape Juice with Honey,
- delitem 12046, 1;//Items: Grape Juice and Tea,
- delitem 12066, 1;//Items: Fried Monkey Tail,
- delitem 12041, 1;//Items: Boiled Locust,
- delitem 12051, 1;//Items: Steamed Crab Pincer,
-
- mes "What!? Through already?";
- mes "Let me see what you've made";
- next;
-
- mes "[Chef's Apprentice]";
- mes "Great job, but there's";
- mes "still one thing that I need";
- mes "you to do. Talk to a friend";
- mes "of mine in Payon. We used";
- mes "to study together.";
- next;
- mes "[Chef's Apprentice]";
- mes "Take him this ^000080Leather Pouch^000000,";
- mes "and I'll put in a good word";
- mes "for you with my teacher.";
-
- getitem 7432, 1;//Items: Leather Pouch,
- set cooking, 5;
- } else {
- mes "Please come back when you've cooked";
- mes "all the Lv 1 foods.";
- next;
- menu "Buy Supplies",M_BuySupply, "Leave",L_No_Talk;
- }
- close;
- }
-
- if(cooking == 5){
- mes "Please, don't forget to";
- mes "hand my ^000080Leather Pouch^000000";
- mes "to my friend in Payon.";
- next;
- mes "[Chef's Apprentice]";
- mes "Well... Is there something";
- mes "that I can help you with?";
- next;
- menu "Buy Supplies",-, "Leave",L_No_Talk2;
-
- mes "[Chef's Apprentice]";
- mes "Outdoor Cooking Set - 500z each.";
- mes " How many?";
- input @amount;
- if(@amount < 1) goto ER_Invalid;
- if(@amount > 100) goto ER_TooMuch;
- if(@amount*500 > Zeny) goto ER_Zeny;
- set Zeny, Zeny-(@amount*500);
- getitem 12125, @amount;//Items: Outdoor Cooker,
-
- next;
- mes "[Chef's Apprentice]";
- mes "Enjoy!";
- close;
-
- L_No_Talk2:
- mes "[Chef's Apprentice]";
- mes "Come back to vist anytime!";
- mes "Have a good day.";
- close;
- }
-
- if(cooking == 6){
- mes "Thank you for taking that";
- mes "pouch to my friend! Take";
- mes "this as a gift.";
- set cooking, 7;
- getitem 12126, 10;//Items: Home Cooking Set,
- next;
- mes "[Chef's Apprentice]";
- mes "Come back later if you";
- mes "need anything else!";
- close;
- }
-
- if(cooking == 7){
- mes "Welcome back. What";
- mes "would you like to do?";
- next;
- menu "Buy Supplies",-, "Just visiting",L_Leave3;
-
- mes "[Chef's Apprentice]";
- mes "What would you like?";
- next;
- menu "Outdoor Cooking Set - 500z each",-, "Home Cooking Set - 1,000z",L_HomeCooking, "Never Mind",L_Leave3;
-
- set @price, 500;
- set @tool, 12125;
- goto L_Cooking_Tools4;
-
- L_HomeCooking:
- set @price, 1000;
- set @tool, 12126;
-
- L_Cooking_Tools4:
- mes "[Chef's Apprentice]";
- mes " How many?";
- input @amount;
- if(@amount < 1) goto ER_Invalid;
- if(@amount > 100) goto ER_TooMuch;
- if(@amount*@price > Zeny) goto ER_Zeny;
- set Zeny, Zeny-(@amount*@price);
- getitem @tool, @amount;
-
- next;
- mes "[Chef's Apprentice]";
- mes "Enjoy!";
- close;
-
- L_Leave3:
- mes "[Chef's Apprentice]";
- mes "Come back to vist anytime!";
- mes "Have a good day.";
- close;
- }
-
- mes "Hi there. What can I";
- mes "do for you?";
- next;
- menu "Just looking around",-, "I want to learn to cook",ap_2;
-
- mes "[Chef's Apprentice]";
- mes "Feel free to look around";
- mes "as much as you like.";
- mes "Just don't disturb my";
- mes "teacher.";
- close;
-
- ap_2:
- if(baseLevel < 50){
- mes "[Chef's Apprentice]";
- mes "You should train a little";
- mes "more before trying something";
- mes "as hard as cooking";
- close;
- }
-
- set cooking, 1;
- mes "[Chef's Apprentice]";
- L_Remind:
- mes "So you want to learn to";
- mes "cook huh? Well, if you";
- mes "think you can handle it,";
- mes "just talk to my teacher.";
- next;
- mes "[Chef's Apprentice]";
- mes "Just don't forget your";
- mes "^000080Chef's Hat^000000 or Sharle";
- mes "will yell at you.";
- close;
-
- ER_Zeny:
- next;
- mes "[Chef's Apprentice]";
- mes "You don't have enough zeny.";
- close;
-
- ER_TooMuch:
- next;
- mes "[Chef's Apprentice]";
- mes "You can't by that much at a time!.";
- mes "You don't have to buy it all at once.";
- close;
- ER_Invalid:
- next;
- mes "[Chef's Apprentice]";
- mes "You can't buy negative amounts of cooking";
- mes "equipment. Please buy a valid amount.";
- close;
-}
-
-
-payon.gat,209,127,4 script Cooking Friend 88,{
- mes "[Cooking Friend]";
- if(cooking == 5){
- if(countitem(7432)) {
- delitem 7432, 1;//Items: Leather Pouch,
- mes "I see my friend sent you";
- mes "to give me something.";
- set cooking, 6;
- emotion e_thx;
- } else {
- mes "What? My friend sent you";
- mes "just to say Hello?";
- emotion e_hmm;
- }
- mes "Thank you for your";
- mes "trouble. Tell him I said,";
- mes "Hello.";
- close;
- }
- mes "Hello, how are you?";
- close;
-}
-
-
-prt_castle.gat,45,35,4 script Sharle 886,{
- mes "[Sharle]";
- if(cooking && getequipid(1) != 5026) goto L_No_Uniform; //Item: Chef's Hat
- if(cooking == 7)goto L_Cooking_7;
- if(first_cooking)goto L_First_Cooking;
-
- if(cooking == 1){
- mes "So you want to learn how to cook?";
- next;
- menu "Yes",M_GetQuest, "No",M_End;
- }
-
- mes "What a great day to bake some";
- mes "wonderfull treats!";
- close;
-
- M_GetQuest:
- mes "[Sharle]";
- mes "Ok. Let's try to cook something together.";
- set first_cooking,rand(1,6);
-
- L_First_Cooking:
- mes "I'm lack of special ingredients,";
- mes "bring me:";
- if(first_cooking == 1){
- set @item1, 577;
- set @item1a, 1;
- set @item2, 908;
- set @item2a, 10;
- set @item3, 1024;
- set @item3a, 1;
- set @food1, 12056;
-
- mes "1 Grain, 10 Spawn, and";
- mes "1 Squid Ink.";
- }
-
- if(first_cooking == 2){
- set @item1, 518;
- set @item1a, 1;
- set @item2, 514;
- set @item2a, 2;
- set @item3, 501;
- set @item3a, 1;
- set @food1, 12061;
-
- mes "1 Honey, 2 Grapes, and";
- mes "1 Red Potion.";
- }
-
- if(first_cooking == 3){
- set @item1, 514;
- set @item1a, 3;
- set @item2, 501;
- set @item2a, 2;
- set @item3, 0;
- set @item3a, 0;
- set @food1, 12046;
-
- mes "3 Grapes and 2 Red Potions.";
- }
-
- if(first_cooking == 4){
- set @item1, 942;
- set @item1a, 5;
- set @item2, 7031;
- set @item2a, 1;
- set @item3, 7457;
- set @item3a, 1;
- set @food1, 12066;
-
- mes "5 Yoyo Tails, 1 Old Frying Pan, and";
- mes "1 Cooking Oil.";
- }
-
- if(first_cooking == 5){
- set @item1, 940;
- set @item1a, 5;
- set @item2, 7031;
- set @item2a, 1;
- set @item3, 7457;
- set @item3a, 1;
- set @food1, 12041;
-
- mes "5 Grasshopper Legs, 1 Old Frying Pan, and";
- mes "1 Cooking Oil.";
- }
-
- if(first_cooking == 6){
- set @item1, 960;
- set @item1a, 10;
- set @item2, 511;
- set @item2a, 10;
- set @item3, 503;
- set @item3a, 1;
- set @food1, 12051;
-
- mes "10 Nippers, 10 Green Herbs, and";
- mes "1 Yellow Potion.";
- }
-
- if(countitem(@item1) < @item1a || countitem(@item2) < @item2a || countitem(@item3) < @item3a) close;
-
- delitem @item1, @item1a;
- delitem @item2, @item2a;
- delitem @item3, @item3a;
- next;
- set cooking, 2;
-
- mes "[Sharle]";
- mes "Great Job!";
- mes "You can now purchase";
- mes "Outdoor Cooking Sets.";
- getitem @food1, 1;
- set first_cooking, 0;
- close;
-
- L_Cooking_7:
- mes "Would you like to check";
- mes "out my ^800000Cookbooks^000000?";
- next;
- menu "Yes",-, "No", M_End2, "Return Book", M_ReturnBook;
-
- mes "[Sharle]";
- if(cook_book){
- mes "You'll have to give me back the";
- mes "first book I loaned you if you";
- mes "would like to check out a new book.";
- mes "Would you like to trade books?";
- next;
- menu "Yes",-, "No",M_End2;
-
- if(countitem(cook_book)==0){
- mes "What? You don't have the book I loaned you?";
- mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
- emotion e_sry;
- close;
- }
- }
- mes "[Sharle]";
- mes "Which book would you like?";
- next;
- menu "^800000Lv 1 Cookbook",b_1, "Lv 2 Cookbook",b_2, "Lv 3 Cookbook",b_3, "Lv 4 Cookbook",b_4, "Lv 5 Cookbook",b_5, "^000000Leave",M_End2;
-
- b_1:
- mes "[Sharle]";
- mes "You will need:";
- mes "10 Pumpkins";
- next;
- if(countitem(535) < 10) goto L_No_Items;//Items: Pumpkin,
- delitem 535, 10;//Items: Pumpkin,
- set @checkout, 7472;
- mes "And I see you have";
- mes "what you need!";
- next;
- goto b_trade;
-
- b_2:
- mes "[Sharle]";
- mes "You will need:";
- mes "5 well-baked cookies";
- next;
- if(countitem(538) < 5) goto L_No_Items;//Items: Well-baked Cookie,
- delitem 538, 5;//Items: Well-baked Cookie,
- set @checkout, 7473;
- mes "And I see you have";
- mes "what you need!";
- next;
- goto b_trade;
-
- b_3:
- mes "[Sharle]";
- mes "You will need:";
- mes "5 Sushi";
- next;
- if(countitem(551) < 5) goto L_No_Items;//Items: Sushi,
- delitem 551, 5;//Items: Sushi,
- set @checkout, 7474;
- mes "And I see you have";
- mes "what you need!";
- next;
- goto b_trade;
-
- b_4:
- mes "[Sharle]";
- mes "You will need:";
- mes "5 Baos";
- next;
- if(countitem(553) < 5) goto L_No_Items;//Items: Bao,
- delitem 553, 5;//Items: Bao,
- set @checkout, 7475;
- mes "And I see you have";
- mes "what you need!";
- next;
- goto b_trade;
-
- b_5:
- mes "[Sharle]";
- mes "You will need:";
- mes "10 shoots";
- next;
- if(countitem(711) < 10) goto L_No_Items;//Items: Shoot,
- delitem 711, 10;//Items: Shoot,
- set @checkout, 7476;
- mes "And I see you have";
- mes "what you need!";
- next;
- goto b_trade;
-
- b_trade:
- mes "[Sharle]";
- mes "If you find you need a new book,";
- mes "you're welcome to come back and";
- mes "trade.";
-
- if(cook_book){
- if(countitem(cook_book)==0){
- mes "What? You don't have the book I loaned you?";
- mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
- emotion e_sry;
- close;
- }
- delitem cook_book,1;
- mes "Have fun, and good luck!";
- } else {
- mes "Good luck! I hope you learn a lot!";
- }
- getitem @checkout,1;
- set cook_book, @checkout;
- close;
-
- M_End:
- mes "[Sharle]";
- mes "That's fine with me, come back";
- mes "when you want to cook.";
- close;
-
- M_End2:
- mes "[Sharle]";
- mes "Well, I'm here whenever you'd like";
- mes "to learn. Just make sure you're";
- mes "ready.";
- close;
-
- M_ReturnBook:
- if(cook_book == 0){
- mes "[Sharle]";
- mes "You haven't borrowed any books.";
- emotion e_hmm;
- close;
- }
-
- if(countitem(cook_book)==0){
- mes "What? You don't have the book I loaned you?";
- mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
- emotion e_sry;
- close;
- }
- delitem cook_book,1;
- set cook_book, 0;
- mes "[Sharle]";
- mes "Returning the book already?";
- mes "did you learn what you wanted";
- mes "to know?";
- emotion e_what;
- close;
-
- L_No_Items:
- mes "[Sharle]";
- mes "So come back when";
- mes "you have the items";
- mes "that you need.";
- close;
-
- L_No_Uniform:
- mes "How dare you disrespect me";
- mes "by showing up out of uniform.";
- mes "Come back when you have your";
- mes "uniform on.";
- emotion e_bzz;
- close;
-}
+//===== eAthena Script =======================================
+//= Cooking Quest
+//===== By: ==================================================
+//= Reddozen
+//===== Current Version: =====================================
+//= 1.5a
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Official Cooking Quest
+//===== Additional Comments: =================================
+//= 1.1 Fixed wrong item ID, added missing ";, optimized [Lupus]
+//= 1.1a minor bugfix, thx 2 Irmin [Lupus]
+//= 1.2 Fixed exploit, some typos [Lupus]
+//= 1.3 Fixed wrong label [Lupus] 1.3a updated to Reddozen's changes
+//= 1.3b Fixed wrong id, fixed Puch quest, added more Pouch Quest
+//= dialogues [Lupus]
+//= 1.4 Fixed spelling, added some dialoguesm optimized
+//= fixed bugs. Tested, fully working [Lupus]
+//= 1.5 More fixes [Lupus]
+//============================================================
+
+prt_castle.gat,43,30,6 script Chef Apprentice 878,{
+
+ mes "[Chef's Apprentice]";
+
+ if(cooking == 1) goto L_Remind;
+
+ if(cooking == 2){
+ mes "I see you passed the test.";
+ mes "Good job!";
+ next;
+ mes "[Chef's Apprentice]";
+ mes "This book would be quite helpful for a novice chef.";
+ getitem 7472, 1;//Items: Lv1 Cookbook,
+ set cook_book, 7472;
+ set cooking, 3;
+ close;
+ }
+
+ if(cooking == 3){
+ mes "Hi there. Is there something";
+ mes "that I can help you with?";
+ next;
+ menu "Buy Supplies",M_BuySupply, "Talk about cooking",L_Cook_Talk, "Leave",L_No_Talk;
+
+ M_BuySupply:
+ mes "[Chef's Apprentice]";
+ mes "Outdoor Cooking Set - 500z each";
+ mes " How many?";
+ input @amount;
+ if(@amount < 1) goto ER_Invalid;
+ if(@amount > 100) goto ER_TooMuch;
+ if(@amount*500 > Zeny) goto ER_Zeny;
+ set Zeny, Zeny-(@amount*500);
+ getitem 12125, @amount;//Items: Outdoor Cooker,
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Enjoy!";
+ close;
+
+ L_Cook_Talk:
+ mes "[Chef's Apprentice]";
+ mes "You passed the test,";
+ mes "but were your results";
+ mes "worth while?";
+ next;
+ menu "Taste my food",-, "No, it was horrible",L_Taste_End;
+
+ mes "[Chef's Apprentice]";
+ mes "I don't know about that.";
+ mes "It may not be safe...";
+ next;
+ menu "Please taste it",-, "You're probably right",L_Taste_End;
+
+ mes "[Chef's Apprentice]";
+ mes "Why would I want to try";
+ mes "the food of a novice chef?";
+ next;
+ menu "Please try",-, "Yeah, I'm too new at this",L_Taste_End;
+
+ mes "[Chef's Apprentice]";
+ mes "I'll make a deal with you.";
+ mes "if you cook me one of every";
+ mes "Lv 1 food, then I'll try";
+ mes "your Cooking...";
+ next;
+ menu "Agree",-, "Refuse",L_Taste_End;
+
+ mes "[Chef's Apprentice]";
+ mes "You'll need to make all";
+ mes "six foods. Let me know";
+ mes "when you're finished.";
+ set cooking, 4;
+ close;
+
+ L_Taste_End:
+ mes "[Chef's Apprentice]";
+ mes "Come back when you feel";
+ mes "more confident.";
+ close;
+
+ L_No_Talk:
+ mes "[Chef's Apprentice]";
+ mes "Come back to vist anytime!";
+ mes "Have a good day.";
+ close;
+ }
+
+ if(cooking == 4){
+ if(countitem(12056)
+ && countitem(12061)
+ && countitem(12046)
+ && countitem(12066)
+ && countitem(12041)
+ && countitem(12051)) {//Items: Frog Spawn Soup, Grape Juice with Honey, Grape Juice and Tea, Fried Monkey Tail, Boiled Locust, Steamed Crab Pincer,
+
+ delitem 12056, 1;//Items: Frog Spawn Soup,
+ delitem 12061, 1;//Items: Grape Juice with Honey,
+ delitem 12046, 1;//Items: Grape Juice and Tea,
+ delitem 12066, 1;//Items: Fried Monkey Tail,
+ delitem 12041, 1;//Items: Boiled Locust,
+ delitem 12051, 1;//Items: Steamed Crab Pincer,
+
+ mes "What!? Through already?";
+ mes "Let me see what you've made";
+ next;
+
+ mes "[Chef's Apprentice]";
+ mes "Great job, but there's";
+ mes "still one thing that I need";
+ mes "you to do. Talk to a friend";
+ mes "of mine in Payon. We used";
+ mes "to study together.";
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Take him this ^000080Leather Pouch^000000,";
+ mes "and I'll put in a good word";
+ mes "for you with my teacher.";
+
+ getitem 7432, 1;//Items: Leather Pouch,
+ set cooking, 5;
+ } else {
+ mes "Please come back when you've cooked";
+ mes "all the Lv 1 foods.";
+ next;
+ menu "Buy Supplies",M_BuySupply, "Leave",L_No_Talk;
+ }
+ close;
+ }
+
+ if(cooking == 5){
+ mes "Please, don't forget to";
+ mes "hand my ^000080Leather Pouch^000000";
+ mes "to my friend in Payon.";
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Well... Is there something";
+ mes "that I can help you with?";
+ next;
+ menu "Buy Supplies",-, "Leave",L_No_Talk2;
+
+ mes "[Chef's Apprentice]";
+ mes "Outdoor Cooking Set - 500z each.";
+ mes " How many?";
+ input @amount;
+ if(@amount < 1) goto ER_Invalid;
+ if(@amount > 100) goto ER_TooMuch;
+ if(@amount*500 > Zeny) goto ER_Zeny;
+ set Zeny, Zeny-(@amount*500);
+ getitem 12125, @amount;//Items: Outdoor Cooker,
+
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Enjoy!";
+ close;
+
+ L_No_Talk2:
+ mes "[Chef's Apprentice]";
+ mes "Come back to vist anytime!";
+ mes "Have a good day.";
+ close;
+ }
+
+ if(cooking == 6){
+ mes "Thank you for taking that";
+ mes "pouch to my friend! Take";
+ mes "this as a gift.";
+ set cooking, 7;
+ getitem 12126, 10;//Items: Home Cooking Set,
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Come back later if you";
+ mes "need anything else!";
+ close;
+ }
+
+ if(cooking == 7){
+ mes "Welcome back. What";
+ mes "would you like to do?";
+ next;
+ menu "Buy Supplies",-, "Just visiting",L_Leave3;
+
+ mes "[Chef's Apprentice]";
+ mes "What would you like?";
+ next;
+ menu "Outdoor Cooking Set - 500z each",-, "Home Cooking Set - 1,000z",L_HomeCooking, "Never Mind",L_Leave3;
+
+ set @price, 500;
+ set @tool, 12125;
+ goto L_Cooking_Tools4;
+
+ L_HomeCooking:
+ set @price, 1000;
+ set @tool, 12126;
+
+ L_Cooking_Tools4:
+ mes "[Chef's Apprentice]";
+ mes " How many?";
+ input @amount;
+ if(@amount < 1) goto ER_Invalid;
+ if(@amount > 100) goto ER_TooMuch;
+ if(@amount*@price > Zeny) goto ER_Zeny;
+ set Zeny, Zeny-(@amount*@price);
+ getitem @tool, @amount;
+
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Enjoy!";
+ close;
+
+ L_Leave3:
+ mes "[Chef's Apprentice]";
+ mes "Come back to vist anytime!";
+ mes "Have a good day.";
+ close;
+ }
+
+ mes "Hi there. What can I";
+ mes "do for you?";
+ next;
+ menu "Just looking around",-, "I want to learn to cook",ap_2;
+
+ mes "[Chef's Apprentice]";
+ mes "Feel free to look around";
+ mes "as much as you like.";
+ mes "Just don't disturb my";
+ mes "teacher.";
+ close;
+
+ ap_2:
+ if(baseLevel < 50){
+ mes "[Chef's Apprentice]";
+ mes "You should train a little";
+ mes "more before trying something";
+ mes "as hard as cooking";
+ close;
+ }
+
+ set cooking, 1;
+ mes "[Chef's Apprentice]";
+ L_Remind:
+ mes "So you want to learn to";
+ mes "cook huh? Well, if you";
+ mes "think you can handle it,";
+ mes "just talk to my teacher.";
+ next;
+ mes "[Chef's Apprentice]";
+ mes "Just don't forget your";
+ mes "^000080Chef's Hat^000000 or Sharle";
+ mes "will yell at you.";
+ close;
+
+ ER_Zeny:
+ next;
+ mes "[Chef's Apprentice]";
+ mes "You don't have enough zeny.";
+ close;
+
+ ER_TooMuch:
+ next;
+ mes "[Chef's Apprentice]";
+ mes "You can't by that much at a time!.";
+ mes "You don't have to buy it all at once.";
+ close;
+ ER_Invalid:
+ next;
+ mes "[Chef's Apprentice]";
+ mes "You can't buy negative amounts of cooking";
+ mes "equipment. Please buy a valid amount.";
+ close;
+}
+
+
+payon.gat,209,127,4 script Cooking Friend 88,{
+ mes "[Cooking Friend]";
+ if(cooking == 5){
+ if(countitem(7432)) {
+ delitem 7432, 1;//Items: Leather Pouch,
+ mes "I see my friend sent you";
+ mes "to give me something.";
+ set cooking, 6;
+ emotion e_thx;
+ } else {
+ mes "What? My friend sent you";
+ mes "just to say Hello?";
+ emotion e_hmm;
+ }
+ mes "Thank you for your";
+ mes "trouble. Tell him I said,";
+ mes "Hello.";
+ close;
+ }
+ mes "Hello, how are you?";
+ close;
+}
+
+
+prt_castle.gat,45,35,4 script Sharle 886,{
+ mes "[Sharle]";
+ if(cooking && getequipid(1) != 5026) goto L_No_Uniform; //Item: Chef's Hat
+ if(cooking == 7)goto L_Cooking_7;
+ if(first_cooking)goto L_First_Cooking;
+
+ if(cooking == 1){
+ mes "So you want to learn how to cook?";
+ next;
+ menu "Yes",M_GetQuest, "No",M_End;
+ }
+
+ mes "What a great day to bake some";
+ mes "wonderfull treats!";
+ close;
+
+ M_GetQuest:
+ mes "[Sharle]";
+ mes "Ok. Let's try to cook something together.";
+ set first_cooking,rand(1,6);
+
+ L_First_Cooking:
+ mes "I'm lack of special ingredients,";
+ mes "bring me:";
+ if(first_cooking == 1){
+ set @item1, 577;
+ set @item1a, 1;
+ set @item2, 908;
+ set @item2a, 10;
+ set @item3, 1024;
+ set @item3a, 1;
+ set @food1, 12056;
+
+ mes "1 Grain, 10 Spawn, and";
+ mes "1 Squid Ink.";
+ }
+
+ if(first_cooking == 2){
+ set @item1, 518;
+ set @item1a, 1;
+ set @item2, 514;
+ set @item2a, 2;
+ set @item3, 501;
+ set @item3a, 1;
+ set @food1, 12061;
+
+ mes "1 Honey, 2 Grapes, and";
+ mes "1 Red Potion.";
+ }
+
+ if(first_cooking == 3){
+ set @item1, 514;
+ set @item1a, 3;
+ set @item2, 501;
+ set @item2a, 2;
+ set @item3, 0;
+ set @item3a, 0;
+ set @food1, 12046;
+
+ mes "3 Grapes and 2 Red Potions.";
+ }
+
+ if(first_cooking == 4){
+ set @item1, 942;
+ set @item1a, 5;
+ set @item2, 7031;
+ set @item2a, 1;
+ set @item3, 7457;
+ set @item3a, 1;
+ set @food1, 12066;
+
+ mes "5 Yoyo Tails, 1 Old Frying Pan, and";
+ mes "1 Cooking Oil.";
+ }
+
+ if(first_cooking == 5){
+ set @item1, 940;
+ set @item1a, 5;
+ set @item2, 7031;
+ set @item2a, 1;
+ set @item3, 7457;
+ set @item3a, 1;
+ set @food1, 12041;
+
+ mes "5 Grasshopper Legs, 1 Old Frying Pan, and";
+ mes "1 Cooking Oil.";
+ }
+
+ if(first_cooking == 6){
+ set @item1, 960;
+ set @item1a, 10;
+ set @item2, 511;
+ set @item2a, 10;
+ set @item3, 503;
+ set @item3a, 1;
+ set @food1, 12051;
+
+ mes "10 Nippers, 10 Green Herbs, and";
+ mes "1 Yellow Potion.";
+ }
+
+ if(countitem(@item1) < @item1a || countitem(@item2) < @item2a || countitem(@item3) < @item3a) close;
+
+ delitem @item1, @item1a;
+ delitem @item2, @item2a;
+ delitem @item3, @item3a;
+ next;
+ set cooking, 2;
+
+ mes "[Sharle]";
+ mes "Great Job!";
+ mes "You can now purchase";
+ mes "Outdoor Cooking Sets.";
+ getitem @food1, 1;
+ set first_cooking, 0;
+ close;
+
+ L_Cooking_7:
+ mes "Would you like to check";
+ mes "out my ^800000Cookbooks^000000?";
+ next;
+ menu "Yes",-, "No", M_End2, "Return Book", M_ReturnBook;
+
+ mes "[Sharle]";
+ if(cook_book){
+ mes "You'll have to give me back the";
+ mes "first book I loaned you if you";
+ mes "would like to check out a new book.";
+ mes "Would you like to trade books?";
+ next;
+ menu "Yes",-, "No",M_End2;
+
+ if(countitem(cook_book)==0){
+ mes "What? You don't have the book I loaned you?";
+ mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
+ emotion e_sry;
+ close;
+ }
+ }
+ mes "[Sharle]";
+ mes "Which book would you like?";
+ next;
+ menu "^800000Lv 1 Cookbook",b_1, "Lv 2 Cookbook",b_2, "Lv 3 Cookbook",b_3, "Lv 4 Cookbook",b_4, "Lv 5 Cookbook",b_5, "^000000Leave",M_End2;
+
+ b_1:
+ mes "[Sharle]";
+ mes "You will need:";
+ mes "10 Pumpkins";
+ next;
+ if(countitem(535) < 10) goto L_No_Items;//Items: Pumpkin,
+ delitem 535, 10;//Items: Pumpkin,
+ set @checkout, 7472;
+ mes "And I see you have";
+ mes "what you need!";
+ next;
+ goto b_trade;
+
+ b_2:
+ mes "[Sharle]";
+ mes "You will need:";
+ mes "5 well-baked cookies";
+ next;
+ if(countitem(538) < 5) goto L_No_Items;//Items: Well-baked Cookie,
+ delitem 538, 5;//Items: Well-baked Cookie,
+ set @checkout, 7473;
+ mes "And I see you have";
+ mes "what you need!";
+ next;
+ goto b_trade;
+
+ b_3:
+ mes "[Sharle]";
+ mes "You will need:";
+ mes "5 Sushi";
+ next;
+ if(countitem(551) < 5) goto L_No_Items;//Items: Sushi,
+ delitem 551, 5;//Items: Sushi,
+ set @checkout, 7474;
+ mes "And I see you have";
+ mes "what you need!";
+ next;
+ goto b_trade;
+
+ b_4:
+ mes "[Sharle]";
+ mes "You will need:";
+ mes "5 Baos";
+ next;
+ if(countitem(553) < 5) goto L_No_Items;//Items: Bao,
+ delitem 553, 5;//Items: Bao,
+ set @checkout, 7475;
+ mes "And I see you have";
+ mes "what you need!";
+ next;
+ goto b_trade;
+
+ b_5:
+ mes "[Sharle]";
+ mes "You will need:";
+ mes "10 shoots";
+ next;
+ if(countitem(711) < 10) goto L_No_Items;//Items: Shoot,
+ delitem 711, 10;//Items: Shoot,
+ set @checkout, 7476;
+ mes "And I see you have";
+ mes "what you need!";
+ next;
+ goto b_trade;
+
+ b_trade:
+ mes "[Sharle]";
+ mes "If you find you need a new book,";
+ mes "you're welcome to come back and";
+ mes "trade.";
+
+ if(cook_book){
+ if(countitem(cook_book)==0){
+ mes "What? You don't have the book I loaned you?";
+ mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
+ emotion e_sry;
+ close;
+ }
+ delitem cook_book,1;
+ mes "Have fun, and good luck!";
+ } else {
+ mes "Good luck! I hope you learn a lot!";
+ }
+ getitem @checkout,1;
+ set cook_book, @checkout;
+ close;
+
+ M_End:
+ mes "[Sharle]";
+ mes "That's fine with me, come back";
+ mes "when you want to cook.";
+ close;
+
+ M_End2:
+ mes "[Sharle]";
+ mes "Well, I'm here whenever you'd like";
+ mes "to learn. Just make sure you're";
+ mes "ready.";
+ close;
+
+ M_ReturnBook:
+ if(cook_book == 0){
+ mes "[Sharle]";
+ mes "You haven't borrowed any books.";
+ emotion e_hmm;
+ close;
+ }
+
+ if(countitem(cook_book)==0){
+ mes "What? You don't have the book I loaned you?";
+ mes "It was a ^800000"+getitemname(cook_book)+"^000000.";
+ emotion e_sry;
+ close;
+ }
+ delitem cook_book,1;
+ set cook_book, 0;
+ mes "[Sharle]";
+ mes "Returning the book already?";
+ mes "did you learn what you wanted";
+ mes "to know?";
+ emotion e_what;
+ close;
+
+ L_No_Items:
+ mes "[Sharle]";
+ mes "So come back when";
+ mes "you have the items";
+ mes "that you need.";
+ close;
+
+ L_No_Uniform:
+ mes "How dare you disrespect me";
+ mes "by showing up out of uniform.";
+ mes "Come back when you have your";
+ mes "uniform on.";
+ emotion e_bzz;
+ close;
+}
diff --git a/npc/quests/counteragent_mixture.txt b/npc/quests/counteragent_mixture.txt
index 019030992..ec2f0a0b9 100644
--- a/npc/quests/counteragent_mixture.txt
+++ b/npc/quests/counteragent_mixture.txt
@@ -1,268 +1,268 @@
-//===== eAthena Script =======================================
-//= Counteragent and Mixture Quest(Morgenstein)
-//===== By: ==================================================
-//= kobra_k88
-//= added some dialogs for Morgenstein by Komurka
-//===== Current Version: =====================================
-//= 2.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Counteragent and Mixtures for making dyes & Alchemist Job Quest
-//===== Additional Comments: =================================
-//= Fully working
-//= Update for Alchemist Quest.
-//= 1.2 added check for Empty Bottle [Lupus]
-//= Fixed some lil thingys [Darkchild]
-//= More li'l thing, added comments for items IDs [Lupus]
-//= 1.5 Fixed Spelling mistakes. [Nexon]
-//= 1.6 Fixed some bugs, also related to Alch Job quest [Lupus]
-//= 1,7 Fixed exploit 1.8 Got rid of 'al_morgen' var [Lupus]
-//= 2.1 now uses (MISC_QUEST & 4) bit instead of al_morgen [Lupus]
-//============================================================
-
-
-// Merchant Louitz -----------------------------------------------------------
-alberta_in.gat,130,54,2 script Merchant Louitz 84,{
- mes "[Louitz]";
- mes "What's going on?";
- if(countitem(970) && countitem(971) && countitem(972)) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
-M_Menu:
- next;
- menu "Talk",M_Talk,"Cancel",M_Cancel;
-M_Menu2:
- next;
- menu "Talk",M_Talk,"More about solutions",M_Solut,"Cancel",M_Cancel;
-
- M_Talk:
- mes "[Merchant Louitz]";
- mes "I was in Geffen for a while trying to find magic tools when I heard some rumors about a Mad Scientist.";
- mes "I became very interested in the man and tried to meet with him on several occasions.";
- next;
- mes "[Merchant Louitz]";
- mes "After many attempts, I finally got to meet him. Unfortunately he was too immersed in his work and didn't even take notice of me.";
- next;
- mes "[Merchant Louitz]";
- mes "He kept on mumbling to himself ^0000FF'Karvodainirol... Detrimindexta... Alcohol^000000...'";
- next;
- mes "[Merchant Louitz]";
- mes "I had know idea what he was talking about at first, but I later learned that those were names for some unique and rare solutions.";
- if(countitem(970) && countitem(971) && countitem(972)) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
- mes "I wish ^0000FFI could see them^000000 with my own eyes...";
- emotion e_slur;
- goto M_Menu;
-
- M_Solut:
- if((MISC_QUEST & 4)==0 && MORGEN==0)set MORGEN,1;
- mes "[Merchant Louitz]";
- mes "Apparently that scientist uses those solutions to make other agents and mixtures.";
- mes "You should speak with ^0000ddAure Dupon^000000 in Geffen to find out more about it. ";
- next;
- mes "[Merchant Louitz]";
- mes "You can find him near the ^0000ddEast end^000000 of town. Ask him about ^0000ddMorgenstein^000000. That's the mad scientists' name.";
- goto M_Menu2;
-
- M_Cancel:
- mes "[Louitz]";
- mes "Um... Now I've seen everything.";
- close;
-}
-
-// Aure Dupon ------------------------------------------------------------------------
-geffen.gat,181,114,4 script Aure Dupon 55,{
- mes "[Aure Dupon]";
- mes "TIME never WAITS for you!! Even MAGIC cannot SLOW it down! I can feel it passing me by even as we speak!!....";
- emotion e_gasp;
- next;
- mes "[Aure Dupon]";
- mes "So... why did you stop me??";
- emotion e_hmm;
- if((MISC_QUEST & 4) || MORGEN) goto M_Menu2;
-M_Menu:
- next;
- menu "Talk",M_Talk,"Cancel",M_Cancel;
-M_Menu2:
- next;
- menu "Talk",M_Talk,"More about Morgenstein",M_Morgen,"Cancel",M_Cancel;
-
- M_Talk:
- mes "[Aure Dupon]";
- mes "It's true that I'm a little eccentric because of my quest to gain the power of magic, but I assure that there are others out there that are even stranger than myself.";
- next;
- mes "[Aure Dupon]";
- mes "Like that mad scientist ^0000ddMorgenstein^000000. Anyway, if it were up to you, would you be able to devote your ENTIRE life to one single purpose?";
- next;
- mes "[Aure Dupon]";
- mes "Would you be able to give up everything else in your life to achieve that goal? Even if it meant risking insanity??";
- if((MISC_QUEST & 4) || MORGEN) goto M_Menu2;
- goto M_Menu;
-
- M_Morgen:
- if(MORGEN==1) set MORGEN,2;
- mes "[Aure Dupon]";
- mes "Morgenstein? Now that man definatley has a few screws loose. He's always in the ^0000ddBlasksmith Guild Building^000000 making crazy potions.";
- mes "He calls them ^ff0000Mixtures^000000 and ^ff0000Counteragents^000000. I'm not sure what there used for though.";
- next;
- mes "[Aure Dupon]";
- mes "You should go speak with him if your that curious about his work.";
- goto M_Menu2;
-
- M_Cancel:
- mes "[Aure Dupon]";
- mes "Human beings are just a small part of Nature.... therefore the human will is that of Natures will.....";
- close;
-}
-
-// Chemist Morgenstein -----------------------------------------------------------
-geffen_in.gat,141,140,2 script Morgenstein 121,{
- if(MORGEN >= 2) goto L_0;
- if(MISC_QUEST & 4) goto L_1;
-
- mes "[Chemist Morgenstein]";
- mes "Heheheheheh... Sniff Sniff... I can smell something appetizing here.";
- mes "It is a Human Being... living one... umm yummy... Heheheheheh";
- emotion e_awsm;
- close;
-
-L_0:
- mes "[Chemist Morgenstein]";
- mes "So you've been asking about me huh? What is it that you want to know?";
-M_Menu:
- next;
- menu "Ask about research",M_Rsrch,"Nothing",M_End;
-
- M_Rsrch:
- mes "[Chemist Morgenstein]";
- mes "Heheheheheh... You probably already heard about what I do ...";
- mes "Okay.. I will tell you everything... there is nothing left for me to hide.... Heheheheheh...";
- emotion e_gg;
- next;
- mes "[Chemist Morgenstein]";
- mes "As far as I'm concerned my research has already been completed.....";
- mes "I am a genius you know, and I can make anything!! Heheheheh... it's only a matter how long it will take...";
- next;
- mes "[Chemist Morgenstein]";
- mes "You know what I mean..... time?.... Hehehehehehehya....";
- emotion e_gg;
- next;
- mes "[Chemist Morgenstein]";
- mes "Um.... did you say you want to know about my Research?... Oh it's all very simple.... I'm just trying to find ways to combine different materials...";
- next;
- mes "[Chemist Morgenstein]";
- mes "Isn't it interesting? I'm perfecting a method that melts materials, such as iron and stone, and then mixes them into a new substance!!!";
- mes "Once it is perfected, I will be able to turn anything in the word into a new substance.....";
- next;
- mes "[Chemist Morgenstein]";
- mes "~~~~ !! Hehe!!!...Heheheheheh!!!...squash squash!!!..Kekekekekelll!!!!";
- emotion e_slur;
- next;
- mes "[Chemist Morgenstein]";
- mes "Ack!~cough~cough~ Ahem.... Though it is not yet possible, I did figure out something else incredible.";
- mes "Through my research I found out how to make different types of liquids. I call them ^5533FF'counteragents and mixtures'^000000.";
- next;
- mes "[Chemist Morgenstein]";
- mes "I can make one for you right now,if you want?? Ahhh... Talking about my experiments and research makes me.... 'excited'.......";
- mes "You too can feel my 'excitement' if you wish..... Ahhhhh.... I can make you feel...";
- set MISC_QUEST,MISC_QUEST | 4;
- set MORGEN,0;
- close;
-
-L_1:
- mes "[Chemist Morgenstein]";
- mes "What do you want now?";
-M_Menu2:
- next;
- menu "Ask about research",M_Rsrch,"Make a new one",-, "Nothing",M_End;
-
- mes "[Chemist Morgenstein]";
- mes "Heheheheheheh.... So I see you are interested in my creations?..... Who woudn't.... Kekekekekekeke!!!";
- mes "So what do you want me to make for you?? Huh? Heheheheheh.............";
- emotion e_gg;
- next;
- menu "-Counteragent",-, "-Mixture",sM_Mixture, "-Forget it",M_End;
-
- mes "[Chemist Morgenstein]";
- mes "Oh... You said Counteragent... Kekekekekekeke... Let's see.... I'll need some items.......";
- mes "... Let me check... Oh... Oh...... Ahhhh..... Hmmm.....";
- next;
- mes "[Chemist Morgenstein]";
- mes "Oh.... As I recall I need....:";
- mes "^5533FF1 Alcohol";
- mes "1 Detrimindexta^000000......";
- mes "and ^5533FF1 Empty Bottle^000000....";
- next;
- mes "[Chemist Morgenstein]";
- mes "With these 3 things I'll be able to make you a counter agent. It won't be a big deal to make..... Kekekekekekeke....";
- mes "Oh, and there will be a fee of ^5533FF3000 zeny^000000 okay? Heheheheheh..... Oh, surely you don't think it's rip-off?...";
- next;
- mes "[Chemist Morgenstein]";
- mes "Alright?....";
- next;
- menu "Make",-,"Cancel",M_End;
-
- mes "[Chemist Morgenstein]";
- if(countitem(970) && countitem(971) && countitem(713) && Zeny>=3000) goto sl_GetCounter;//Items: Alcohol, Detrimindexta, Empty Bottle,
- mes "I'm sorry but you need 1 Empty Bottle, 1 Alcohol, 1 Detrimindexta, and 3000 Zeny for me to make a Counteragent.";
- emotion e_sry;
- close;
-
- sl_GetCounter:
- delitem 970,1;//Items: Alcohol,
- delitem 713,1;//Items: Empty Bottle,
- delitem 971,1;//Items: Detrimindexta,
- set Zeny, Zeny-3000;
- mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
- mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
- next;
- getitem 973,1;//Items: Counteragent,
- mes "[Chemist Morgenstein]";
- mes ".... Hmmm......";
- emotion e_hmm;
- close;
-
- sM_Mixture:
- mes "[Chemist Morgenstein]";
- mes "Oh... You said Mixture?... Kekekekekekeke... Let's see... I'll need some items.......";
- mes "... Let me check... Oh... Oh...... Ahhhh..... Hmmm.....";
- next;
- mes "[Chemist Morgenstein]";
- mes "Oh.... As I recall I need....:";
- mes "^5533FF1 Alcohol";
- mes "1 Karvodailnirol^000000.....";
- mes "and ^5533FF1 Empty Bottle^000000...........";
- next;
- mes "[Chemist Morgenstein]";
- mes "With these 3 things I'll be able to make you a mixture. It won't be a big deal to make..... Kekekekekekeke....";
- mes "Oh, and there will be a fee of ^5533FF4000 zeny^000000 okay? Heheheheheh..... Oh, surely you don't think it's rip-off?...";
- next;
- mes "[Chemist Morgenstein]";
- mes "Alright??...";
- next;
- menu "Make",-,"Cancel",M_End;
-
- mes "[Chemist Morgenstein]";
- if(countitem(970) && countitem(972) && countitem(713) && Zeny>=4000) goto sl_GetMix;//Items: Alcohol, Karvodailnirol, Empty Bottle,
- mes "I'm sorry but you need 1 Empty Bottle, 1 Alcohol, 1 Karvodainirol, and 4000 Zeny for me to make a Mixture.";
- emotion e_sry;
- close;
-
- sl_GetMix:
- delitem 970,1;//Items: Alcohol,
- delitem 713,1;//Items: Empty Bottle,
- delitem 972,1;//Items: Karvodailnirol,
- set Zeny, Zeny-4000;
- mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
- mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
- next;
- getitem 974,1;//Items: Mixture,
- mes "[Chemist Morgenstein]";
- mes ".... Hmmm......";
- emotion e_hmm;
- close;
-
- M_End:
- mes "[Chemist Morgenstein]";
- mes "... Kekekekekekeke....";
- emotion e_heh;
- close;
+//===== eAthena Script =======================================
+//= Counteragent and Mixture Quest(Morgenstein)
+//===== By: ==================================================
+//= kobra_k88
+//= added some dialogs for Morgenstein by Komurka
+//===== Current Version: =====================================
+//= 2.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Counteragent and Mixtures for making dyes & Alchemist Job Quest
+//===== Additional Comments: =================================
+//= Fully working
+//= Update for Alchemist Quest.
+//= 1.2 added check for Empty Bottle [Lupus]
+//= Fixed some lil thingys [Darkchild]
+//= More li'l thing, added comments for items IDs [Lupus]
+//= 1.5 Fixed Spelling mistakes. [Nexon]
+//= 1.6 Fixed some bugs, also related to Alch Job quest [Lupus]
+//= 1,7 Fixed exploit 1.8 Got rid of 'al_morgen' var [Lupus]
+//= 2.1 now uses (MISC_QUEST & 4) bit instead of al_morgen [Lupus]
+//============================================================
+
+
+// Merchant Louitz -----------------------------------------------------------
+alberta_in.gat,130,54,2 script Merchant Louitz 84,{
+ mes "[Louitz]";
+ mes "What's going on?";
+ if(countitem(970) && countitem(971) && countitem(972)) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
+M_Menu:
+ next;
+ menu "Talk",M_Talk,"Cancel",M_Cancel;
+M_Menu2:
+ next;
+ menu "Talk",M_Talk,"More about solutions",M_Solut,"Cancel",M_Cancel;
+
+ M_Talk:
+ mes "[Merchant Louitz]";
+ mes "I was in Geffen for a while trying to find magic tools when I heard some rumors about a Mad Scientist.";
+ mes "I became very interested in the man and tried to meet with him on several occasions.";
+ next;
+ mes "[Merchant Louitz]";
+ mes "After many attempts, I finally got to meet him. Unfortunately he was too immersed in his work and didn't even take notice of me.";
+ next;
+ mes "[Merchant Louitz]";
+ mes "He kept on mumbling to himself ^0000FF'Karvodainirol... Detrimindexta... Alcohol^000000...'";
+ next;
+ mes "[Merchant Louitz]";
+ mes "I had know idea what he was talking about at first, but I later learned that those were names for some unique and rare solutions.";
+ if(countitem(970) && countitem(971) && countitem(972)) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
+ mes "I wish ^0000FFI could see them^000000 with my own eyes...";
+ emotion e_slur;
+ goto M_Menu;
+
+ M_Solut:
+ if((MISC_QUEST & 4)==0 && MORGEN==0)set MORGEN,1;
+ mes "[Merchant Louitz]";
+ mes "Apparently that scientist uses those solutions to make other agents and mixtures.";
+ mes "You should speak with ^0000ddAure Dupon^000000 in Geffen to find out more about it. ";
+ next;
+ mes "[Merchant Louitz]";
+ mes "You can find him near the ^0000ddEast end^000000 of town. Ask him about ^0000ddMorgenstein^000000. That's the mad scientists' name.";
+ goto M_Menu2;
+
+ M_Cancel:
+ mes "[Louitz]";
+ mes "Um... Now I've seen everything.";
+ close;
+}
+
+// Aure Dupon ------------------------------------------------------------------------
+geffen.gat,181,114,4 script Aure Dupon 55,{
+ mes "[Aure Dupon]";
+ mes "TIME never WAITS for you!! Even MAGIC cannot SLOW it down! I can feel it passing me by even as we speak!!....";
+ emotion e_gasp;
+ next;
+ mes "[Aure Dupon]";
+ mes "So... why did you stop me??";
+ emotion e_hmm;
+ if((MISC_QUEST & 4) || MORGEN) goto M_Menu2;
+M_Menu:
+ next;
+ menu "Talk",M_Talk,"Cancel",M_Cancel;
+M_Menu2:
+ next;
+ menu "Talk",M_Talk,"More about Morgenstein",M_Morgen,"Cancel",M_Cancel;
+
+ M_Talk:
+ mes "[Aure Dupon]";
+ mes "It's true that I'm a little eccentric because of my quest to gain the power of magic, but I assure that there are others out there that are even stranger than myself.";
+ next;
+ mes "[Aure Dupon]";
+ mes "Like that mad scientist ^0000ddMorgenstein^000000. Anyway, if it were up to you, would you be able to devote your ENTIRE life to one single purpose?";
+ next;
+ mes "[Aure Dupon]";
+ mes "Would you be able to give up everything else in your life to achieve that goal? Even if it meant risking insanity??";
+ if((MISC_QUEST & 4) || MORGEN) goto M_Menu2;
+ goto M_Menu;
+
+ M_Morgen:
+ if(MORGEN==1) set MORGEN,2;
+ mes "[Aure Dupon]";
+ mes "Morgenstein? Now that man definatley has a few screws loose. He's always in the ^0000ddBlasksmith Guild Building^000000 making crazy potions.";
+ mes "He calls them ^ff0000Mixtures^000000 and ^ff0000Counteragents^000000. I'm not sure what there used for though.";
+ next;
+ mes "[Aure Dupon]";
+ mes "You should go speak with him if your that curious about his work.";
+ goto M_Menu2;
+
+ M_Cancel:
+ mes "[Aure Dupon]";
+ mes "Human beings are just a small part of Nature.... therefore the human will is that of Natures will.....";
+ close;
+}
+
+// Chemist Morgenstein -----------------------------------------------------------
+geffen_in.gat,141,140,2 script Morgenstein 121,{
+ if(MORGEN >= 2) goto L_0;
+ if(MISC_QUEST & 4) goto L_1;
+
+ mes "[Chemist Morgenstein]";
+ mes "Heheheheheh... Sniff Sniff... I can smell something appetizing here.";
+ mes "It is a Human Being... living one... umm yummy... Heheheheheh";
+ emotion e_awsm;
+ close;
+
+L_0:
+ mes "[Chemist Morgenstein]";
+ mes "So you've been asking about me huh? What is it that you want to know?";
+M_Menu:
+ next;
+ menu "Ask about research",M_Rsrch,"Nothing",M_End;
+
+ M_Rsrch:
+ mes "[Chemist Morgenstein]";
+ mes "Heheheheheh... You probably already heard about what I do ...";
+ mes "Okay.. I will tell you everything... there is nothing left for me to hide.... Heheheheheh...";
+ emotion e_gg;
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "As far as I'm concerned my research has already been completed.....";
+ mes "I am a genius you know, and I can make anything!! Heheheheh... it's only a matter how long it will take...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "You know what I mean..... time?.... Hehehehehehehya....";
+ emotion e_gg;
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Um.... did you say you want to know about my Research?... Oh it's all very simple.... I'm just trying to find ways to combine different materials...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Isn't it interesting? I'm perfecting a method that melts materials, such as iron and stone, and then mixes them into a new substance!!!";
+ mes "Once it is perfected, I will be able to turn anything in the word into a new substance.....";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "~~~~ !! Hehe!!!...Heheheheheh!!!...squash squash!!!..Kekekekekelll!!!!";
+ emotion e_slur;
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Ack!~cough~cough~ Ahem.... Though it is not yet possible, I did figure out something else incredible.";
+ mes "Through my research I found out how to make different types of liquids. I call them ^5533FF'counteragents and mixtures'^000000.";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "I can make one for you right now,if you want?? Ahhh... Talking about my experiments and research makes me.... 'excited'.......";
+ mes "You too can feel my 'excitement' if you wish..... Ahhhhh.... I can make you feel...";
+ set MISC_QUEST,MISC_QUEST | 4;
+ set MORGEN,0;
+ close;
+
+L_1:
+ mes "[Chemist Morgenstein]";
+ mes "What do you want now?";
+M_Menu2:
+ next;
+ menu "Ask about research",M_Rsrch,"Make a new one",-, "Nothing",M_End;
+
+ mes "[Chemist Morgenstein]";
+ mes "Heheheheheheh.... So I see you are interested in my creations?..... Who woudn't.... Kekekekekekeke!!!";
+ mes "So what do you want me to make for you?? Huh? Heheheheheh.............";
+ emotion e_gg;
+ next;
+ menu "-Counteragent",-, "-Mixture",sM_Mixture, "-Forget it",M_End;
+
+ mes "[Chemist Morgenstein]";
+ mes "Oh... You said Counteragent... Kekekekekekeke... Let's see.... I'll need some items.......";
+ mes "... Let me check... Oh... Oh...... Ahhhh..... Hmmm.....";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Oh.... As I recall I need....:";
+ mes "^5533FF1 Alcohol";
+ mes "1 Detrimindexta^000000......";
+ mes "and ^5533FF1 Empty Bottle^000000....";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "With these 3 things I'll be able to make you a counter agent. It won't be a big deal to make..... Kekekekekekeke....";
+ mes "Oh, and there will be a fee of ^5533FF3000 zeny^000000 okay? Heheheheheh..... Oh, surely you don't think it's rip-off?...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Alright?....";
+ next;
+ menu "Make",-,"Cancel",M_End;
+
+ mes "[Chemist Morgenstein]";
+ if(countitem(970) && countitem(971) && countitem(713) && Zeny>=3000) goto sl_GetCounter;//Items: Alcohol, Detrimindexta, Empty Bottle,
+ mes "I'm sorry but you need 1 Empty Bottle, 1 Alcohol, 1 Detrimindexta, and 3000 Zeny for me to make a Counteragent.";
+ emotion e_sry;
+ close;
+
+ sl_GetCounter:
+ delitem 970,1;//Items: Alcohol,
+ delitem 713,1;//Items: Empty Bottle,
+ delitem 971,1;//Items: Detrimindexta,
+ set Zeny, Zeny-3000;
+ mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
+ mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
+ next;
+ getitem 973,1;//Items: Counteragent,
+ mes "[Chemist Morgenstein]";
+ mes ".... Hmmm......";
+ emotion e_hmm;
+ close;
+
+ sM_Mixture:
+ mes "[Chemist Morgenstein]";
+ mes "Oh... You said Mixture?... Kekekekekekeke... Let's see... I'll need some items.......";
+ mes "... Let me check... Oh... Oh...... Ahhhh..... Hmmm.....";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Oh.... As I recall I need....:";
+ mes "^5533FF1 Alcohol";
+ mes "1 Karvodailnirol^000000.....";
+ mes "and ^5533FF1 Empty Bottle^000000...........";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "With these 3 things I'll be able to make you a mixture. It won't be a big deal to make..... Kekekekekekeke....";
+ mes "Oh, and there will be a fee of ^5533FF4000 zeny^000000 okay? Heheheheheh..... Oh, surely you don't think it's rip-off?...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Alright??...";
+ next;
+ menu "Make",-,"Cancel",M_End;
+
+ mes "[Chemist Morgenstein]";
+ if(countitem(970) && countitem(972) && countitem(713) && Zeny>=4000) goto sl_GetMix;//Items: Alcohol, Karvodailnirol, Empty Bottle,
+ mes "I'm sorry but you need 1 Empty Bottle, 1 Alcohol, 1 Karvodainirol, and 4000 Zeny for me to make a Mixture.";
+ emotion e_sry;
+ close;
+
+ sl_GetMix:
+ delitem 970,1;//Items: Alcohol,
+ delitem 713,1;//Items: Empty Bottle,
+ delitem 972,1;//Items: Karvodailnirol,
+ set Zeny, Zeny-4000;
+ mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
+ mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
+ next;
+ getitem 974,1;//Items: Mixture,
+ mes "[Chemist Morgenstein]";
+ mes ".... Hmmm......";
+ emotion e_hmm;
+ close;
+
+ M_End:
+ mes "[Chemist Morgenstein]";
+ mes "... Kekekekekekeke....";
+ emotion e_heh;
+ close;
} \ No newline at end of file
diff --git a/npc/quests/doomed_swords.txt b/npc/quests/doomed_swords.txt
index de03dee9d..594158bcc 100644
--- a/npc/quests/doomed_swords.txt
+++ b/npc/quests/doomed_swords.txt
@@ -1,682 +1,682 @@
-//===== eAthena Script =======================================
-//= Doomed Swords Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Quest for Doomed Swords, Grimtooth, Mysteltain, Executioner.
-//= Based off mRO version. Part 1 and 2 of the quest can be
-//= found in cities\comodo.txt. Message text for Part 6 and 7
-//= is made up.
-//===== Additional Comments: =================================
-//=95% done
-//= 1.1 Fixed items count check. For all 3 swords... [Lupus]
-//= 1.3 Fixed exploit [Lupus]
-//============================================================
-
-
-//=============================================================================
-// Doomed Swords Part 3
-//=============================================================================
-// Moet Leng Good: Tablet Of Power
-aldebaran.gat,44,53,4 script Wizard in Training 64,{
- if(dmdswrd_Q == 15) goto L_1;
- if(dmdswrd_Q == 16) goto L_2;
- if(dmdswrd_Q == 17) goto L_3;
- if(dmdswrd_Q == 18) goto L_4;
- mes "[Moet Leng Good]";
- mes "Did you know that some people signed contract in shadows with the Dark Lord with the";
- mes "^3355FF`Tablet of Power'^000000?!";
- next;
- mes "[Moet Leng Good]";
- mes "As a result of their greed for power, it brought disasters for the entire world.";
- mes "So please, be happy with what you already have and do not give in to the dark side.";
- close;
-
-L_1:
- mes "[Moet Leng Good]";
- mes "I guess you are the possessor of the 'Stone of Awakening' and also the one seeking for the 'Tablet of Power'.";
- next;
- mes "[Moet Leng Good]";
- mes "Very well then, I will help you to make a 'Tablet of Power'.";
- mes "However, it is not a simple task, I will need a number of materials in order to succeed.";
- next;
- mes "[Moet Leng Good]";
- mes "I will need one of these stones, gems, and ores.";
- mes "^3355FF`Blue Gemstone'^000000";
- mes "^3355FF`Sapphire'^000000";
- mes "^3355FF`Aquarmarine'^000000";
- mes "^3355FF`Shining Stone'^000000";
- mes "and ^3355FF`Rough Elunium'^000000";
- next;
- mes "[Moet Leng Good]";
- mes "In other words, the 'Tablet of Power' is very valuable, and might take you a while to gather the resources for it.";
- set dmdswrd_Q,16;
- close;
-L_2:
- if((countitem(717) < 1) || (countitem(726) < 1) || (countitem(720) < 1) || (countitem(640) < 1) || (countitem(757) < 1)) goto L_1;
- mes "[Moet Leng Good]";
- mes ". . . . . ! !";
- mes "I can hardly believe that you actually gathered all the resources for the 'Tablet of Power'";
- mes "Because you have worked so hard, let me make the tablet for you now.";
- next;
- delitem 717,1;
- delitem 726,1;
- delitem 720,1;
- delitem 640,1;
- delitem 757,1;
- mes "^3355FF- Gives him all the stones -^000000";
- set dmdswrd_Q,17;
- next;
- mes "[Moet Leng Good]";
- mes "Now, I'll just need you to gather a few ingredients for the fininshing touch of the tablet.";
- next;
- mes "[Moet Leng Good]";
- mes "I will need just one ^3355FF`Cobweb'^000000";
- mes "You could easily obtain them through argos in Mt. Mjolnir";
- next;
- mes "^3355FF- Moet Leng Good's-^000000";
- mes "^3355FF- working hard on the tablet -^000000";
- close;
-L_3:
- if(countitem(1025) > 0) goto sL_3;
- mes "[Moet Leng Good]";
- mes "The tablet will be done when I finish!";
- mes "Please do not bother me for now, I need to concentrate";
- next;
- mes "[Moet Leng Good]";
- mes "Meanwhile, please go find a cobweb so I could use it to provide some finishing touches to the tablet, thanks.";
- close;
-
- sL_3:
- mes "[Moet Leng Good]";
- mes "Ah, very good, you got a cobweb, please just leave it over there.";
- next;
- mes "^3355FF- Gives cobweb to him-^000000";
- delitem 1025,1;
- next;
- mes "[Moet Leng Good]";
- mes "Alright, here we go !!";
- next;
- mes "^3355FF- Clang ! Clang ! Clunk ! -^000000";
- mes "^3355FF- Boom ! ! -^000000";
- next;
- mes "^3355FF- `Tablet of Power'-^000000";
- mes "^3355FF- is forged -^000000";
- next;
- mes "^3355FF- Received 'Tablet of Power'-^000000";
- set dmdswrd_Q,18;
- next;
- mes "[Moet Leng Good]";
- mes "Even though you possess the 'Tablet of Power' now, the tablet would not be effective without";
- mes "the ^3355FF` Book of the Tiresome Sheep'^000000??";
- next;
- mes "[Moet Leng Good]";
- mes "^3355FF`Book of the Tiresome Sheep'^000000";
- mes "was originally crafted by demons located in the desert and now the crafting skill have been passed down to a few wanderers near Morroc.";
- next;
- mes "[Moet Leng Good]";
- mes "So if you wish to obatin the 'Book of the Tiresome Sheep', Morroc would be a smart place to look";
- close;
-L_4:
- mes "[Moet Leng Good]";
- mes "Head to Morroc then! There's someone there that will tell you about";
- mes "the 'Book of the Tiresome Sheep'. I do not remember his name, but";
- mes "now that you have the 'Tablet of Power', I'm sure you'll find him.";
- close;
-}
-
-
-//=============================================================================
-// Doomed Swords Part 4
-//=============================================================================
-// Zaka: Book of Tiresome Sheep
-morocc.gat,202,33,4 script ZAKA 99,{
- if(dmdswrd_Q == 18) goto L_1;
- if(dmdswrd_Q == 19) goto L_2;
- if(dmdswrd_Q == 20) goto L_3;
- if(dmdswrd_Q == 21) goto L_4;
- if(dmdswrd_Q == 22) goto L_5;
- if(dmdswrd_Q == 23) goto L_6;
-
- mes "[ZAKA]";
- mes "...... The sun sets over another day. The moon rises to take it's nightly place.";
- mes "As darkness creeps across the desert, the people of Morroc huddle together.";
- mes "The never ending well is the life blood of the wandering nomads..... This is Morroc....";
- next;
- mes "[ZAKA]";
- mes "Eh hem.... Say... Have you ever heard of the ^FF4444Doomed Swords^000000, or ^5555FFSwords of Power^000000?";
- mes "It is believed that these swords are so powerful that whoever weilds them could rule the world!";
- next;
- mes "[ZAKA]";
- mes "The three swords I speak of are the ^5555FFMysteltainn, Ogre Tooth, and Executioner^000000.";
- next;
- mes "[ZAKA]";
- mes "These swords are hidden somewhere in this world.... have you seen any?";
- close;
-
-L_1:
- mes "[ZAKA]";
- mes ". . . . .";
- next;
- mes "[ZAKA]";
- mes "! ! ! ! ! ! !";
- next;
- mes "[ZAKA]";
- mes "Isn't that ?! That tablet?!";
- mes "^3355FF`Tablet of Power'^000000";
- mes "Right?! Wha ! !";
- next;
- mes "[ZAKA]";
- mes "Who are you? Why do you possess the 'Tablet of Power'?";
- mes "Bah, nevermind, it doesn't matter who you are.";
- mes "Whoever possesses the 'Tablet of Power' is a natural-born leader.";
- next;
- mes "[ZAKA]";
- mes "Well, we are one of the wanderers of Morroc.";
- mes "It is tradition and duty to make the possessor of^3355FF` Tablet of Power '^000000";
- mes "a ^3355FF`Book of the Tiresome Sheep'^000000";
- next;
- mes "[ZAKA]";
- mes "I will craft you a 'Book of the Tiresome Sheep', only for your personal use.";
- mes "As you might have expected, I will need various ingredients to make you the book.";
- next;
- mes "[ZAKA]";
- mes "The first thing will need are two ^3355FF`Snake Scale'^000000 , please bring them to me.";
- set dmdswrd_Q,19;
- close;
-L_2:
- if(countitem(926) > 1) goto sL_2;
- mes "[ZAKA]";
- mes "If you want the 'Book of the Tiresome Sheep', I will need^3355FF 2 'Snake Scales'^000000.";
- close;
-
- sL_2:
- mes "Gives Zaka two^3355FF'Snake Scales'^000000";
- delitem 926,2;
- set dmdswrd_Q,20;
- next;
- mes "[ZAKA]";
- mes "Now I can construct the basic layout of the book witht the snake scales, but I now need 1 piece of";
- mes "^3355FF'Scale Shell'^000000 in order to block only negative energies from the book.";
- close;
-L_3:
- if(countitem(936) > 0) goto sL_3;
- mes "[ZAKA]";
- mes "Please bring me the next ingredient needed for the 'Book of the Tiresome Sheep', I will need one";
- mes "^3355FF'Scale Shell'^000000 ??";
- mes ". . . . .";
- close;
-
- sL_3:
- mes "Gives^3355FF'Scale Shell^000000";
- mes "to Zaka";
- delitem 936,1;
- set dmdswrd_Q,21;
- next;
- mes "[ZAKA]";
- mes "Alright, good.";
- mes "Next, I will need one piece of ^3355FF'Shining Scale'^000000 in order to distribute the magical power equally throughout the book.";
- next;
- mes "[ZAKA]";
- mes "While you are getting the scale, I will continue to the next phase of crafting, good luck.";
- close;
-L_4:
- if(countitem(954) > 0) goto sL_4;
- mes "[ZAKA]";
- mes "In order to finish crafting the 'Book of the Tiresome Sheep', I will need you to gather me one piece of ^3355FF'Shining Scale'^000000, okay?";
- close;
-
- sL_4:
- mes "Gives^3355FF'Shining Scale'^000000";
- mes "to Zaka";
- delitem 954,1;
- set dmdswrd_Q,22;
- next;
- mes "[ZAKA]";
- mes "Great job!";
- mes "Finally, the last ingredient I need is one ^3355FF'Stinky Scale'^000000 to complete the book, please bring it to me";
- close;
-L_5:
- if(countitem(959) > 0) goto sL_5;
- mes "[ZAKA]";
- mes "All I need to craft the 'Book of the Tiresome Sheep' is one piece of ^3355FF'Stinky Scale'^000000 now, please bring one to me.";
- close;
-
- sL_5:
- mes "Gives^3355FF'Stinky Scale'^000000";
- mes "to Zaka";
- delitem 959,1;
- next;
- mes "[ZAKA]";
- mes "Ooo. this is all I need to finish up the book, thank you.";
- next;
- mes "^3355FF-Zaka is working hard in-^000000";
- mes "^3355FF-finalizing the book-^000000";
- next;
- mes "^3355FF- You receive the Book of-^000000";
- mes "^3355FF- the Tiresome Sheep from Zaka-^000000";
- set dmdswrd_Q,23;
- next;
- mes "[ZAKA]";
- mes "There, that's for you..";
- mes "I guess you have the required items to summon and use the Doomed Swords.";
- mes "But if you are really going to use the Doomed Swords please go talk to ^5533FFWon^000000, a wandering swordsman, he might have some important advice.";
- next;
- mes "[ZAKA]";
- mes "Legend has it that Won's sword fighting skills is already at god-like level, and he is also one of the ten most influential people in the world.";
- next;
- mes "[Zaka]";
- mes "Right now, he might be training inside Comodo Town, so you might be able to find him there.";
- close;
-L_6:
- mes "[ZAKA]";
- mes "The wandering swordsman ^3355FF`Won'^000000";
- mes "should be training somwhere in Comodo, look for him very carefully.";
- close;
-}
-
-
-//=============================================================================
-// Doomed Swords Part 5
-//=============================================================================
-// Won: Voucher of Power
-comodo.gat,232,87,4 script Wandering Swordsman WON 106,{
- if(dmdswrd_Q == 23) goto L_1;
- if(dmdswrd_Q == 24) goto L_2;
- if(dmdswrd_Q == 25) goto L_3;
-
- mes "[WON]";
- mes "My name is ^3355FF'Won'^000000. I have searched far and wide, across the oceans and the mountains, to find one who is worthy.......";
- next;
- mes "[WON]";
- mes "It has been many years since the Evil Witch was defeated in that legendary battle..... It is now a story of the past.......";
- mes "Still, the quest must continue! This is what the heavens desire of me.....";
- next;
- mes "[Won]";
- mes "I must stay here in Comodo..... It is my fate.... I must stay here and wait.........";
- mes ". . . . . . . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . .";
- mes ". . . . .";
- close;
-
-L_1:
- mes "^3355FF- The swordsman examines you -^000000";
- mes "^3355FF- for a few seconds -^000000";
- next;
- mes "[Swordsman]";
- mes "Heh, you're just a normal fella.";
- mes "I am a wandering swordsman,";
- mes "^3355FF`WON'^000000";
- next;
- mes "[WON]";
- mes "What? You say you are gonna summon the Doomed Swords?";
- mes "Psh, I don't care what you say, I will be the judge on whether or not you are worthy.";
- mes "Let me explain...";
- next;
- mes "[WON]";
- mes "Even though you do have all the required materials to summon the Doomed Swords but that does not mean that you could withstand the energy drained during one summoning.";
- next;
- mes "[WON]";
- mes "Without careful control of energy transfer from the normal world to the Dark World, many disasters could arise upon the world or even unforeseen consequences.";
- next;
- mes "[WON]";
- mes "I am sure that you have heard that the three different Doomed Swords are:";
- mes "^3355FF` Mysteltain '^000000";
- mes "^3355FF` Grimtooth '^000000";
- mes "and ^3355FF` Executioner '^000000.";
- mes "Each of them with very distinct specialties.";
- next;
- mes "[WON]";
- mes "Now that you understand these, let us start the summoning then.";
- next;
- mes "- `Won'-";
- mes "- draws his sword -";
- mes "- and starts to swing it around -";
- next;
- mes "- You notice something -";
- mes "- a blue light descending -";
- mes "- from the sky -";
- next;
- mes "^3355FF-You got-^000000";
- mes "^3355FF-Voucher of Power-^000000";
- set dmdswrd_Q,24;
- next;
- mes "[WON]";
- mes ". . . . .";
- next;
-L_2:
- mes "[WON]";
- mes "Hmm, it seems like the Dark World is not ready to give you the Doomed Sword just yet...even though you have what it takes to be the master of the swords.";
- next;
- mes "[WON]";
- mes "However, when the day is as long as the night, when the sunlight is as bright as solar sword.";
- mes "Only during that time, you will have the opportunity to receive the Doomed Swords.";
- next;
- mes "[WON]";
- mes "Head to Morocc and look for a man by the name of ^5533FFCetsu^000000. He has information about one of the swords.";
-// mes "When that time comes, visit the East for a quiet city name Payon, and you shall find yourself in a new journey for the Doomed Swords.";
- close;
-L_3:
- mes "123456789101112131415";
- close;
-}
-
-
-//==============================================================================
-// Doomed Swords Part 6
-//==============================================================================
-
-// Cetsu --------------------------------------------
-morocc.gat,281,178,8 script Cetsu 97,{
- if(dmdswrd_Q == 25) goto M_Yes;
- if(dmdswrd_Q > 25) goto L_1;
-
- mes "[Cetsu]";
- mes "It is rumored that there was once a dagger made out of the tooth of an ogre. This made the dagger much stronger than those made out of steel.";
- next;
- mes "[Cetsu]";
- mes "It became known as the ^ff0000Grimtooth^000000. What made the Grimtooth truly special was the fact that it was enchanted with a magic spell.";
- next;
- mes "[Cetsu]";
- mes "Many have tried to re-create the Grimtooth but have faild. Only one blacksmith, who once lived in Prontera, knows how to do this.";
- next;
- mes "[Cetsu]";
- mes "Unfortunalety he left Prontera long ago and has not been seen since...";
- if(dmdswrd_Q == 24) goto L_0;
- close;
-
-L_0:
- next;
- mes"[Cetsu]";
- mes "Say,.... are you really interested in this dagger?";
- next;
- menu "Yes",M_Yes,"Not really",M_No;
-
- M_Yes:
- mes "[Cetsu]";
- mes "You should speak with ^5533FFVeeyop^000000 then. He seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
- mes "You can find him in Prontera. With his help you may even be able to track down the Legendary Blacksmith. Good luck.";
- set dmdswrd_Q, 25;
- close;
- M_No:
- mes "[Cetsu]";
- mes "Oh, I see.";
- close;
-
-L_1:
- mes "[Cetsu]";
- mes "Wow! So you're gonna try to re-create the legendary, doomed dagger Grimtooth? You should becarefull though, that's one powerfull dagger.";
- close;
-}
-
-// Veeyop --------------------------------------------------
-prontera.gat,197,188,4 script Veeyop 50,{
- if(dmdswrd_Q == 26) goto M_Yes;
- if(dmdswrd_Q > 26) goto L_1;
-
- mes "[Veeyop]";
- mes "Have you ever heard of a doomed sword, ^ff0000Mysteltain^000000? It's named after ^0000bba legendary Young Twig^000000 that was used to murder Balder, the God of Light...";
- next;
- mes "[Veeyop]";
- mes "According to the legend, it was a weak, little twig. Other than that I know nothing more of the sword.";
- next;
- mes "[Veeyop]";
- mes "Whatever the legend may be, people say there is a way to re-construct the legendary sword.";
- mes "I've heard that there was once a Blacksmith who had the knowledge to re-create the legendary sword living in Prontera.";
- next;
- mes "[Veeyop]";
- mes "Unfortunately he's disapeared from this town. Anywho its just heresay.";
- if(dmdswrd_Q == 25) goto L_0;
- close;
-
-L_0:
- next;
- mes"[Veeyop]";
- mes "Say,.... are you really interested in this sword?";
- next;
- menu "Yes",M_Yes,"Not really",M_No;
-
- M_Yes:
- mes "[Veeyop]";
- mes "You should speak with ^FF5533Nain^000000 then. She seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
- mes "You can find her in Izlude. With her help you may even be able to track down the Legendary Blacksmith. Good luck.";
- set dmdswrd_Q, 26;
- close;
- M_No:
- mes "[Veeyop]";
- mes "Oh, I see.";
- close;
-
-L_1:
- mes "[Veeyop]";
- mes "Wow! So you're gonna try to re-create the legendary, doomed sword Mysteltain? You should becarefull though, that's one powerfull sword.";
- close;
-}
-
-// Nain -------------------------------------------------------------
-izlude_in.gat,173,88,2 script Nain 102,{
- if(dmdswrd_Q == 27) goto M_Yes;
- if(dmdswrd_Q > 27) goto L_1;
-
- mes "[Nain]";
- mes "I was once told a legend about a powerfull sword that was used only for executions.";
- next;
- mes "[Nain]";
- mes "For years and years, this mighty sword was used to be-head heinous criminals, but it also took the lives of great warriors as well.";
- mes "It is said that the overtime the government became corrupt and hence innocent lives fell victim to the sword.";
- next;
- mes "[Nain]";
- mes "This caused the sword to become corrupted with an emense evil power making it almost impossible to weild.";
- mes "Those who did try to weild it became possed with an dark aura that drove them to blood lust.";
- next;
- mes "[Nain]";
- mes "This ancient civilization eventually collapsed and faded away. The powerfull sword also vanished.";
- mes "The sword would later be named the ^ff0000Executioner^000000. An appropriate name considering its history.";
- next;
- mes "[Nain]";
- mes "Recently there have been rumors of a Legendary Blacksmith that has the skill to re-create the lost sword.";
- next;
- mes "[Nain]";
- mes "Just thinking about it sends shivers down my spine.";
- mes "No matter how powerfull a sword it is, to think that it is possessed with thousands and thousands of angry ghosts...";
- mes "I would rather see the Doomed sword stay lost to history.";
- if(dmdswrd_Q == 26) goto L_0;
- close;
-
-L_0:
- next;
- mes"[Nain]";
- mes "Say,.... are you really interested in this sword?";
- next;
- menu "Yes",M_Yes,"Not really",M_No;
-
- M_Yes:
- mes "[Nain]";
- mes "You should speak with ^aa00aaRupeto^000000 then. He seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
- mes "You can find him inside the Pub in Prontera. With his help you may even be able to track down the Legendary Blacksmith. Good luck.";
- set dmdswrd_Q, 27;
- close;
-
- M_No:
- mes "[Nain]";
- mes "Oh, I see.";
- close;
-
-L_1:
- mes "[Nain]";
- mes "Wow! So you're gonna try to re-create the legendary, doomed sword Executioner? You should becarefull though, that's one powerfull sword.";
- close;
-}
-
-// Rupeto ---------------------------------------------------------
-prt_in.gat,169,16,3 script Rupeto 86,{
- if(dmdswrd_Q == 27) goto L_0;
- mes "[Rupeto]";
- mes "Hello.";
- close;
-
-L_0:
- mes "[Rupeto]";
- mes "Looking for the Legendary Blacksmith? Go to the payon field just east of the town of Payon.";
- mes "It's said that the field looks alot like an Elder Willow....";
- close;
-}
-
-
-//=============================================================================
-// Doomed Swords Final Part
-//=============================================================================
-
-// Legendary Blacksmith ----------------------------------------------
-pay_fild08.gat,217,273,4 script Legendary Blacksmith 63,{
-
- if(dmdswrd_Q == 27) goto L_Start;
- if(dmdswrd_Q == 28) goto L_Forge;
- mes "[Legendary Blacksmith]";
- mes "I wonder what's going on in ^ff0000Prontera^000000? It's been so long since I've been there.";
- close;
-
-L_Start:
- mes "[Legendary Blacksmith]";
- mes "Hmm... what's this about Doomed Swords?? I have no idea what you're";
- mes "talking about.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "..... I see... so you've spoken to everyone who was involved with in";
- mes "the war with the witch... you've also gathered all of the items of";
- mes "power......";
- next;
- mes "[Legendary Blacksmith]";
- mes "I never thought the day would come when I would make one of these";
- mes "dreadfull swords again... but you have proven yourself so I can not";
- mes "turn you down.";
- next;
- L_Forge:
- mes "[Legendary Blacksmith]";
- mes "What sword do you want me to forge?";
- set dmdswrd_Q, 28;
- next;
- menu "Executioner",M_Exec, "Grimtooth",M_Grim, "Mysteltain",M_Myst;
-
- M_Exec: //1169
- if(countitem(7017)>=2 && countitem(7024)>=10 && countitem(1008)>=3 && countitem(609)>=50 && countitem(714)>=1) goto L_GetExec;
- mes "[Legendary Blacksmith]";
- mes "So you're interested in making the legendary Executioner Sword heh?.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "It's been sometime since I've forged any weapons,... but since it";
- mes "is a special challenge for me to make this sword.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "I'll do it! I will re-create the Executioner Sword! I must warn you";
- mes "however, this is a very powerfull and dangerous sword. Be carefull.";
- next;
- mes "[Legendary Blacksmith]";
- mes "For the Executioner Sword I will need the following items:";
- mes "- ^0000ff2 Executioners Mitten^000000"; //7017
- mes "- ^0000ff10 Bloody Edge^000000"; //7024
- mes "- ^0000ff3 Necklace of Oblivion^000000"; //1008
- mes "- ^0000ff50 Amulet^000000"; //609
- mes "- and ^0000ff1 Emperium^000000"; //714
- close;
-
- L_GetExec:
- delitem 7017,2;
- delitem 7024,10;
- delitem 1008,3;
- delitem 609,50;
- delitem 714,1;
- mes "[Legendary Blacksmith]";
- mes "Good! You have brought me all the necessary items.";
- mes "Please wait a moment while I forge the Executioner Sword.";
- next;
- mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
- next;
- mes "[Legendary Blacksmith]";
- mes "Phew! Once again a perfect sword! Hahaha! Here you are my friend, enjoy.";
- getitem 1169,1;
- close;
-
- M_Grim: //1237
- if(countitem(7023)>=10 && countitem(724)>=5 && countitem(7002)>=100 && countitem(7022)>=1 && countitem(714)>=1) goto L_GetGrim;
- mes "[Legendary Blacksmith]";
- mes "So you're interested in making the legendary Grimtooth Dagger heh?.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "It's been sometime since I've forged any weapons,... but since it";
- mes "is a special challenge for me to make this dagger.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "I'll do it! I will re-create the Grimtooth Dagger! I must warn you";
- mes "however, this is a very powerfull and dangerous dagger. Be carefull.";
- next;
- mes "[Legendary Blacksmith]";
- mes "For the Grimtooth Dagger I will need the following items:";
- mes "- ^0000ff10 Blade Lost in Darkness^000000"; //7023
- mes "- ^0000ff5 Cursed Ruby^000000"; //724
- mes "- ^0000ff100 Ogre Tooth^000000"; //7002
- mes "- ^0000ff1 Old Hilt^000000"; //7022
- mes "- and ^0000ff1 Emperium^000000";
- close;
-
- L_GetGrim:
- delitem 7023,10;
- delitem 724,5;
- delitem 7002,100;
- delitem 7022,1;
- delitem 714,1;
- mes "[Legendary Blacksmith]";
- mes "Good! You have brought me all the necessary items.";
- mes "Please wait a moment while I forge the Grimtooth Dagger.";
- next;
- mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
- next;
- mes "[Legendary Blacksmith]";
- mes "Phew! Once again a perfect dagger! Hahaha! Here you are my friend, enjoy.";
- getitem 1237,1;
- close;
-
- M_Myst: //1138
- if(countitem(7021)>=1 && countitem(7019)>=1 && countitem(7020)>=1 && countitem(7018)>=1 && countitem(714)>=1) goto L_GetMyst;
- mes "[Legendary Blacksmith]";
- mes "So you're interested in making the legendary Mysteltain Sword heh?.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "It's been sometime since I've forged any weapons,... but since it";
- mes "is a special challenge for me to make this sword.....";
- next;
- mes "[Legendary Blacksmith]";
- mes "I'll do it! I will re-create the Mysteltain Sword! I must warn you";
- mes "however, this is a very powerfull and dangerous sword. Be carefull.";
- next;
- mes "[Legendary Blacksmith]";
- mes "For the Mysteltain Sword I will need the following items:";
- mes "- ^0000ff1 Foolishness of the Blind^000000"; //7021
- mes "- ^0000ff1 Loki's Whispers^000000"; //7019
- mes "- ^0000ff1 Mother's Nightmare^000000"; //7020
- mes "- ^0000ff1 Young Twig^000000"; //7018
- mes "- and ^0000ff1 Emperium^000000";
- close;
-
- L_GetMyst:
- delitem 7021,1;
- delitem 7019,1;
- delitem 7020,1;
- delitem 7018,1;
- delitem 714,1;
- mes "[Legendary Blacksmith]";
- mes "Good! You have brought me all the necessary items.";
- mes " Please wait a moment while I forge the Mysteltain Sword.";
- next;
- mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
- next;
- mes "[Legendary Blacksmith]";
- mes "Phew! Once again a perfect sword! Hahaha! Here you are my friend, enjoy.";
- getitem 1138,1;
- close;
-}
+//===== eAthena Script =======================================
+//= Doomed Swords Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Quest for Doomed Swords, Grimtooth, Mysteltain, Executioner.
+//= Based off mRO version. Part 1 and 2 of the quest can be
+//= found in cities\comodo.txt. Message text for Part 6 and 7
+//= is made up.
+//===== Additional Comments: =================================
+//=95% done
+//= 1.1 Fixed items count check. For all 3 swords... [Lupus]
+//= 1.3 Fixed exploit [Lupus]
+//============================================================
+
+
+//=============================================================================
+// Doomed Swords Part 3
+//=============================================================================
+// Moet Leng Good: Tablet Of Power
+aldebaran.gat,44,53,4 script Wizard in Training 64,{
+ if(dmdswrd_Q == 15) goto L_1;
+ if(dmdswrd_Q == 16) goto L_2;
+ if(dmdswrd_Q == 17) goto L_3;
+ if(dmdswrd_Q == 18) goto L_4;
+ mes "[Moet Leng Good]";
+ mes "Did you know that some people signed contract in shadows with the Dark Lord with the";
+ mes "^3355FF`Tablet of Power'^000000?!";
+ next;
+ mes "[Moet Leng Good]";
+ mes "As a result of their greed for power, it brought disasters for the entire world.";
+ mes "So please, be happy with what you already have and do not give in to the dark side.";
+ close;
+
+L_1:
+ mes "[Moet Leng Good]";
+ mes "I guess you are the possessor of the 'Stone of Awakening' and also the one seeking for the 'Tablet of Power'.";
+ next;
+ mes "[Moet Leng Good]";
+ mes "Very well then, I will help you to make a 'Tablet of Power'.";
+ mes "However, it is not a simple task, I will need a number of materials in order to succeed.";
+ next;
+ mes "[Moet Leng Good]";
+ mes "I will need one of these stones, gems, and ores.";
+ mes "^3355FF`Blue Gemstone'^000000";
+ mes "^3355FF`Sapphire'^000000";
+ mes "^3355FF`Aquarmarine'^000000";
+ mes "^3355FF`Shining Stone'^000000";
+ mes "and ^3355FF`Rough Elunium'^000000";
+ next;
+ mes "[Moet Leng Good]";
+ mes "In other words, the 'Tablet of Power' is very valuable, and might take you a while to gather the resources for it.";
+ set dmdswrd_Q,16;
+ close;
+L_2:
+ if((countitem(717) < 1) || (countitem(726) < 1) || (countitem(720) < 1) || (countitem(640) < 1) || (countitem(757) < 1)) goto L_1;
+ mes "[Moet Leng Good]";
+ mes ". . . . . ! !";
+ mes "I can hardly believe that you actually gathered all the resources for the 'Tablet of Power'";
+ mes "Because you have worked so hard, let me make the tablet for you now.";
+ next;
+ delitem 717,1;
+ delitem 726,1;
+ delitem 720,1;
+ delitem 640,1;
+ delitem 757,1;
+ mes "^3355FF- Gives him all the stones -^000000";
+ set dmdswrd_Q,17;
+ next;
+ mes "[Moet Leng Good]";
+ mes "Now, I'll just need you to gather a few ingredients for the fininshing touch of the tablet.";
+ next;
+ mes "[Moet Leng Good]";
+ mes "I will need just one ^3355FF`Cobweb'^000000";
+ mes "You could easily obtain them through argos in Mt. Mjolnir";
+ next;
+ mes "^3355FF- Moet Leng Good's-^000000";
+ mes "^3355FF- working hard on the tablet -^000000";
+ close;
+L_3:
+ if(countitem(1025) > 0) goto sL_3;
+ mes "[Moet Leng Good]";
+ mes "The tablet will be done when I finish!";
+ mes "Please do not bother me for now, I need to concentrate";
+ next;
+ mes "[Moet Leng Good]";
+ mes "Meanwhile, please go find a cobweb so I could use it to provide some finishing touches to the tablet, thanks.";
+ close;
+
+ sL_3:
+ mes "[Moet Leng Good]";
+ mes "Ah, very good, you got a cobweb, please just leave it over there.";
+ next;
+ mes "^3355FF- Gives cobweb to him-^000000";
+ delitem 1025,1;
+ next;
+ mes "[Moet Leng Good]";
+ mes "Alright, here we go !!";
+ next;
+ mes "^3355FF- Clang ! Clang ! Clunk ! -^000000";
+ mes "^3355FF- Boom ! ! -^000000";
+ next;
+ mes "^3355FF- `Tablet of Power'-^000000";
+ mes "^3355FF- is forged -^000000";
+ next;
+ mes "^3355FF- Received 'Tablet of Power'-^000000";
+ set dmdswrd_Q,18;
+ next;
+ mes "[Moet Leng Good]";
+ mes "Even though you possess the 'Tablet of Power' now, the tablet would not be effective without";
+ mes "the ^3355FF` Book of the Tiresome Sheep'^000000??";
+ next;
+ mes "[Moet Leng Good]";
+ mes "^3355FF`Book of the Tiresome Sheep'^000000";
+ mes "was originally crafted by demons located in the desert and now the crafting skill have been passed down to a few wanderers near Morroc.";
+ next;
+ mes "[Moet Leng Good]";
+ mes "So if you wish to obatin the 'Book of the Tiresome Sheep', Morroc would be a smart place to look";
+ close;
+L_4:
+ mes "[Moet Leng Good]";
+ mes "Head to Morroc then! There's someone there that will tell you about";
+ mes "the 'Book of the Tiresome Sheep'. I do not remember his name, but";
+ mes "now that you have the 'Tablet of Power', I'm sure you'll find him.";
+ close;
+}
+
+
+//=============================================================================
+// Doomed Swords Part 4
+//=============================================================================
+// Zaka: Book of Tiresome Sheep
+morocc.gat,202,33,4 script ZAKA 99,{
+ if(dmdswrd_Q == 18) goto L_1;
+ if(dmdswrd_Q == 19) goto L_2;
+ if(dmdswrd_Q == 20) goto L_3;
+ if(dmdswrd_Q == 21) goto L_4;
+ if(dmdswrd_Q == 22) goto L_5;
+ if(dmdswrd_Q == 23) goto L_6;
+
+ mes "[ZAKA]";
+ mes "...... The sun sets over another day. The moon rises to take it's nightly place.";
+ mes "As darkness creeps across the desert, the people of Morroc huddle together.";
+ mes "The never ending well is the life blood of the wandering nomads..... This is Morroc....";
+ next;
+ mes "[ZAKA]";
+ mes "Eh hem.... Say... Have you ever heard of the ^FF4444Doomed Swords^000000, or ^5555FFSwords of Power^000000?";
+ mes "It is believed that these swords are so powerful that whoever weilds them could rule the world!";
+ next;
+ mes "[ZAKA]";
+ mes "The three swords I speak of are the ^5555FFMysteltainn, Ogre Tooth, and Executioner^000000.";
+ next;
+ mes "[ZAKA]";
+ mes "These swords are hidden somewhere in this world.... have you seen any?";
+ close;
+
+L_1:
+ mes "[ZAKA]";
+ mes ". . . . .";
+ next;
+ mes "[ZAKA]";
+ mes "! ! ! ! ! ! !";
+ next;
+ mes "[ZAKA]";
+ mes "Isn't that ?! That tablet?!";
+ mes "^3355FF`Tablet of Power'^000000";
+ mes "Right?! Wha ! !";
+ next;
+ mes "[ZAKA]";
+ mes "Who are you? Why do you possess the 'Tablet of Power'?";
+ mes "Bah, nevermind, it doesn't matter who you are.";
+ mes "Whoever possesses the 'Tablet of Power' is a natural-born leader.";
+ next;
+ mes "[ZAKA]";
+ mes "Well, we are one of the wanderers of Morroc.";
+ mes "It is tradition and duty to make the possessor of^3355FF` Tablet of Power '^000000";
+ mes "a ^3355FF`Book of the Tiresome Sheep'^000000";
+ next;
+ mes "[ZAKA]";
+ mes "I will craft you a 'Book of the Tiresome Sheep', only for your personal use.";
+ mes "As you might have expected, I will need various ingredients to make you the book.";
+ next;
+ mes "[ZAKA]";
+ mes "The first thing will need are two ^3355FF`Snake Scale'^000000 , please bring them to me.";
+ set dmdswrd_Q,19;
+ close;
+L_2:
+ if(countitem(926) > 1) goto sL_2;
+ mes "[ZAKA]";
+ mes "If you want the 'Book of the Tiresome Sheep', I will need^3355FF 2 'Snake Scales'^000000.";
+ close;
+
+ sL_2:
+ mes "Gives Zaka two^3355FF'Snake Scales'^000000";
+ delitem 926,2;
+ set dmdswrd_Q,20;
+ next;
+ mes "[ZAKA]";
+ mes "Now I can construct the basic layout of the book witht the snake scales, but I now need 1 piece of";
+ mes "^3355FF'Scale Shell'^000000 in order to block only negative energies from the book.";
+ close;
+L_3:
+ if(countitem(936) > 0) goto sL_3;
+ mes "[ZAKA]";
+ mes "Please bring me the next ingredient needed for the 'Book of the Tiresome Sheep', I will need one";
+ mes "^3355FF'Scale Shell'^000000 ??";
+ mes ". . . . .";
+ close;
+
+ sL_3:
+ mes "Gives^3355FF'Scale Shell^000000";
+ mes "to Zaka";
+ delitem 936,1;
+ set dmdswrd_Q,21;
+ next;
+ mes "[ZAKA]";
+ mes "Alright, good.";
+ mes "Next, I will need one piece of ^3355FF'Shining Scale'^000000 in order to distribute the magical power equally throughout the book.";
+ next;
+ mes "[ZAKA]";
+ mes "While you are getting the scale, I will continue to the next phase of crafting, good luck.";
+ close;
+L_4:
+ if(countitem(954) > 0) goto sL_4;
+ mes "[ZAKA]";
+ mes "In order to finish crafting the 'Book of the Tiresome Sheep', I will need you to gather me one piece of ^3355FF'Shining Scale'^000000, okay?";
+ close;
+
+ sL_4:
+ mes "Gives^3355FF'Shining Scale'^000000";
+ mes "to Zaka";
+ delitem 954,1;
+ set dmdswrd_Q,22;
+ next;
+ mes "[ZAKA]";
+ mes "Great job!";
+ mes "Finally, the last ingredient I need is one ^3355FF'Stinky Scale'^000000 to complete the book, please bring it to me";
+ close;
+L_5:
+ if(countitem(959) > 0) goto sL_5;
+ mes "[ZAKA]";
+ mes "All I need to craft the 'Book of the Tiresome Sheep' is one piece of ^3355FF'Stinky Scale'^000000 now, please bring one to me.";
+ close;
+
+ sL_5:
+ mes "Gives^3355FF'Stinky Scale'^000000";
+ mes "to Zaka";
+ delitem 959,1;
+ next;
+ mes "[ZAKA]";
+ mes "Ooo. this is all I need to finish up the book, thank you.";
+ next;
+ mes "^3355FF-Zaka is working hard in-^000000";
+ mes "^3355FF-finalizing the book-^000000";
+ next;
+ mes "^3355FF- You receive the Book of-^000000";
+ mes "^3355FF- the Tiresome Sheep from Zaka-^000000";
+ set dmdswrd_Q,23;
+ next;
+ mes "[ZAKA]";
+ mes "There, that's for you..";
+ mes "I guess you have the required items to summon and use the Doomed Swords.";
+ mes "But if you are really going to use the Doomed Swords please go talk to ^5533FFWon^000000, a wandering swordsman, he might have some important advice.";
+ next;
+ mes "[ZAKA]";
+ mes "Legend has it that Won's sword fighting skills is already at god-like level, and he is also one of the ten most influential people in the world.";
+ next;
+ mes "[Zaka]";
+ mes "Right now, he might be training inside Comodo Town, so you might be able to find him there.";
+ close;
+L_6:
+ mes "[ZAKA]";
+ mes "The wandering swordsman ^3355FF`Won'^000000";
+ mes "should be training somwhere in Comodo, look for him very carefully.";
+ close;
+}
+
+
+//=============================================================================
+// Doomed Swords Part 5
+//=============================================================================
+// Won: Voucher of Power
+comodo.gat,232,87,4 script Wandering Swordsman WON 106,{
+ if(dmdswrd_Q == 23) goto L_1;
+ if(dmdswrd_Q == 24) goto L_2;
+ if(dmdswrd_Q == 25) goto L_3;
+
+ mes "[WON]";
+ mes "My name is ^3355FF'Won'^000000. I have searched far and wide, across the oceans and the mountains, to find one who is worthy.......";
+ next;
+ mes "[WON]";
+ mes "It has been many years since the Evil Witch was defeated in that legendary battle..... It is now a story of the past.......";
+ mes "Still, the quest must continue! This is what the heavens desire of me.....";
+ next;
+ mes "[Won]";
+ mes "I must stay here in Comodo..... It is my fate.... I must stay here and wait.........";
+ mes ". . . . . . . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . .";
+ mes ". . . . .";
+ close;
+
+L_1:
+ mes "^3355FF- The swordsman examines you -^000000";
+ mes "^3355FF- for a few seconds -^000000";
+ next;
+ mes "[Swordsman]";
+ mes "Heh, you're just a normal fella.";
+ mes "I am a wandering swordsman,";
+ mes "^3355FF`WON'^000000";
+ next;
+ mes "[WON]";
+ mes "What? You say you are gonna summon the Doomed Swords?";
+ mes "Psh, I don't care what you say, I will be the judge on whether or not you are worthy.";
+ mes "Let me explain...";
+ next;
+ mes "[WON]";
+ mes "Even though you do have all the required materials to summon the Doomed Swords but that does not mean that you could withstand the energy drained during one summoning.";
+ next;
+ mes "[WON]";
+ mes "Without careful control of energy transfer from the normal world to the Dark World, many disasters could arise upon the world or even unforeseen consequences.";
+ next;
+ mes "[WON]";
+ mes "I am sure that you have heard that the three different Doomed Swords are:";
+ mes "^3355FF` Mysteltain '^000000";
+ mes "^3355FF` Grimtooth '^000000";
+ mes "and ^3355FF` Executioner '^000000.";
+ mes "Each of them with very distinct specialties.";
+ next;
+ mes "[WON]";
+ mes "Now that you understand these, let us start the summoning then.";
+ next;
+ mes "- `Won'-";
+ mes "- draws his sword -";
+ mes "- and starts to swing it around -";
+ next;
+ mes "- You notice something -";
+ mes "- a blue light descending -";
+ mes "- from the sky -";
+ next;
+ mes "^3355FF-You got-^000000";
+ mes "^3355FF-Voucher of Power-^000000";
+ set dmdswrd_Q,24;
+ next;
+ mes "[WON]";
+ mes ". . . . .";
+ next;
+L_2:
+ mes "[WON]";
+ mes "Hmm, it seems like the Dark World is not ready to give you the Doomed Sword just yet...even though you have what it takes to be the master of the swords.";
+ next;
+ mes "[WON]";
+ mes "However, when the day is as long as the night, when the sunlight is as bright as solar sword.";
+ mes "Only during that time, you will have the opportunity to receive the Doomed Swords.";
+ next;
+ mes "[WON]";
+ mes "Head to Morocc and look for a man by the name of ^5533FFCetsu^000000. He has information about one of the swords.";
+// mes "When that time comes, visit the East for a quiet city name Payon, and you shall find yourself in a new journey for the Doomed Swords.";
+ close;
+L_3:
+ mes "123456789101112131415";
+ close;
+}
+
+
+//==============================================================================
+// Doomed Swords Part 6
+//==============================================================================
+
+// Cetsu --------------------------------------------
+morocc.gat,281,178,8 script Cetsu 97,{
+ if(dmdswrd_Q == 25) goto M_Yes;
+ if(dmdswrd_Q > 25) goto L_1;
+
+ mes "[Cetsu]";
+ mes "It is rumored that there was once a dagger made out of the tooth of an ogre. This made the dagger much stronger than those made out of steel.";
+ next;
+ mes "[Cetsu]";
+ mes "It became known as the ^ff0000Grimtooth^000000. What made the Grimtooth truly special was the fact that it was enchanted with a magic spell.";
+ next;
+ mes "[Cetsu]";
+ mes "Many have tried to re-create the Grimtooth but have faild. Only one blacksmith, who once lived in Prontera, knows how to do this.";
+ next;
+ mes "[Cetsu]";
+ mes "Unfortunalety he left Prontera long ago and has not been seen since...";
+ if(dmdswrd_Q == 24) goto L_0;
+ close;
+
+L_0:
+ next;
+ mes"[Cetsu]";
+ mes "Say,.... are you really interested in this dagger?";
+ next;
+ menu "Yes",M_Yes,"Not really",M_No;
+
+ M_Yes:
+ mes "[Cetsu]";
+ mes "You should speak with ^5533FFVeeyop^000000 then. He seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
+ mes "You can find him in Prontera. With his help you may even be able to track down the Legendary Blacksmith. Good luck.";
+ set dmdswrd_Q, 25;
+ close;
+ M_No:
+ mes "[Cetsu]";
+ mes "Oh, I see.";
+ close;
+
+L_1:
+ mes "[Cetsu]";
+ mes "Wow! So you're gonna try to re-create the legendary, doomed dagger Grimtooth? You should becarefull though, that's one powerfull dagger.";
+ close;
+}
+
+// Veeyop --------------------------------------------------
+prontera.gat,197,188,4 script Veeyop 50,{
+ if(dmdswrd_Q == 26) goto M_Yes;
+ if(dmdswrd_Q > 26) goto L_1;
+
+ mes "[Veeyop]";
+ mes "Have you ever heard of a doomed sword, ^ff0000Mysteltain^000000? It's named after ^0000bba legendary Young Twig^000000 that was used to murder Balder, the God of Light...";
+ next;
+ mes "[Veeyop]";
+ mes "According to the legend, it was a weak, little twig. Other than that I know nothing more of the sword.";
+ next;
+ mes "[Veeyop]";
+ mes "Whatever the legend may be, people say there is a way to re-construct the legendary sword.";
+ mes "I've heard that there was once a Blacksmith who had the knowledge to re-create the legendary sword living in Prontera.";
+ next;
+ mes "[Veeyop]";
+ mes "Unfortunately he's disapeared from this town. Anywho its just heresay.";
+ if(dmdswrd_Q == 25) goto L_0;
+ close;
+
+L_0:
+ next;
+ mes"[Veeyop]";
+ mes "Say,.... are you really interested in this sword?";
+ next;
+ menu "Yes",M_Yes,"Not really",M_No;
+
+ M_Yes:
+ mes "[Veeyop]";
+ mes "You should speak with ^FF5533Nain^000000 then. She seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
+ mes "You can find her in Izlude. With her help you may even be able to track down the Legendary Blacksmith. Good luck.";
+ set dmdswrd_Q, 26;
+ close;
+ M_No:
+ mes "[Veeyop]";
+ mes "Oh, I see.";
+ close;
+
+L_1:
+ mes "[Veeyop]";
+ mes "Wow! So you're gonna try to re-create the legendary, doomed sword Mysteltain? You should becarefull though, that's one powerfull sword.";
+ close;
+}
+
+// Nain -------------------------------------------------------------
+izlude_in.gat,173,88,2 script Nain 102,{
+ if(dmdswrd_Q == 27) goto M_Yes;
+ if(dmdswrd_Q > 27) goto L_1;
+
+ mes "[Nain]";
+ mes "I was once told a legend about a powerfull sword that was used only for executions.";
+ next;
+ mes "[Nain]";
+ mes "For years and years, this mighty sword was used to be-head heinous criminals, but it also took the lives of great warriors as well.";
+ mes "It is said that the overtime the government became corrupt and hence innocent lives fell victim to the sword.";
+ next;
+ mes "[Nain]";
+ mes "This caused the sword to become corrupted with an emense evil power making it almost impossible to weild.";
+ mes "Those who did try to weild it became possed with an dark aura that drove them to blood lust.";
+ next;
+ mes "[Nain]";
+ mes "This ancient civilization eventually collapsed and faded away. The powerfull sword also vanished.";
+ mes "The sword would later be named the ^ff0000Executioner^000000. An appropriate name considering its history.";
+ next;
+ mes "[Nain]";
+ mes "Recently there have been rumors of a Legendary Blacksmith that has the skill to re-create the lost sword.";
+ next;
+ mes "[Nain]";
+ mes "Just thinking about it sends shivers down my spine.";
+ mes "No matter how powerfull a sword it is, to think that it is possessed with thousands and thousands of angry ghosts...";
+ mes "I would rather see the Doomed sword stay lost to history.";
+ if(dmdswrd_Q == 26) goto L_0;
+ close;
+
+L_0:
+ next;
+ mes"[Nain]";
+ mes "Say,.... are you really interested in this sword?";
+ next;
+ menu "Yes",M_Yes,"Not really",M_No;
+
+ M_Yes:
+ mes "[Nain]";
+ mes "You should speak with ^aa00aaRupeto^000000 then. He seems to know alot about the ^00aa00Legendary Blacksmith^000000.";
+ mes "You can find him inside the Pub in Prontera. With his help you may even be able to track down the Legendary Blacksmith. Good luck.";
+ set dmdswrd_Q, 27;
+ close;
+
+ M_No:
+ mes "[Nain]";
+ mes "Oh, I see.";
+ close;
+
+L_1:
+ mes "[Nain]";
+ mes "Wow! So you're gonna try to re-create the legendary, doomed sword Executioner? You should becarefull though, that's one powerfull sword.";
+ close;
+}
+
+// Rupeto ---------------------------------------------------------
+prt_in.gat,169,16,3 script Rupeto 86,{
+ if(dmdswrd_Q == 27) goto L_0;
+ mes "[Rupeto]";
+ mes "Hello.";
+ close;
+
+L_0:
+ mes "[Rupeto]";
+ mes "Looking for the Legendary Blacksmith? Go to the payon field just east of the town of Payon.";
+ mes "It's said that the field looks alot like an Elder Willow....";
+ close;
+}
+
+
+//=============================================================================
+// Doomed Swords Final Part
+//=============================================================================
+
+// Legendary Blacksmith ----------------------------------------------
+pay_fild08.gat,217,273,4 script Legendary Blacksmith 63,{
+
+ if(dmdswrd_Q == 27) goto L_Start;
+ if(dmdswrd_Q == 28) goto L_Forge;
+ mes "[Legendary Blacksmith]";
+ mes "I wonder what's going on in ^ff0000Prontera^000000? It's been so long since I've been there.";
+ close;
+
+L_Start:
+ mes "[Legendary Blacksmith]";
+ mes "Hmm... what's this about Doomed Swords?? I have no idea what you're";
+ mes "talking about.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "..... I see... so you've spoken to everyone who was involved with in";
+ mes "the war with the witch... you've also gathered all of the items of";
+ mes "power......";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "I never thought the day would come when I would make one of these";
+ mes "dreadfull swords again... but you have proven yourself so I can not";
+ mes "turn you down.";
+ next;
+ L_Forge:
+ mes "[Legendary Blacksmith]";
+ mes "What sword do you want me to forge?";
+ set dmdswrd_Q, 28;
+ next;
+ menu "Executioner",M_Exec, "Grimtooth",M_Grim, "Mysteltain",M_Myst;
+
+ M_Exec: //1169
+ if(countitem(7017)>=2 && countitem(7024)>=10 && countitem(1008)>=3 && countitem(609)>=50 && countitem(714)>=1) goto L_GetExec;
+ mes "[Legendary Blacksmith]";
+ mes "So you're interested in making the legendary Executioner Sword heh?.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "It's been sometime since I've forged any weapons,... but since it";
+ mes "is a special challenge for me to make this sword.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "I'll do it! I will re-create the Executioner Sword! I must warn you";
+ mes "however, this is a very powerfull and dangerous sword. Be carefull.";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "For the Executioner Sword I will need the following items:";
+ mes "- ^0000ff2 Executioners Mitten^000000"; //7017
+ mes "- ^0000ff10 Bloody Edge^000000"; //7024
+ mes "- ^0000ff3 Necklace of Oblivion^000000"; //1008
+ mes "- ^0000ff50 Amulet^000000"; //609
+ mes "- and ^0000ff1 Emperium^000000"; //714
+ close;
+
+ L_GetExec:
+ delitem 7017,2;
+ delitem 7024,10;
+ delitem 1008,3;
+ delitem 609,50;
+ delitem 714,1;
+ mes "[Legendary Blacksmith]";
+ mes "Good! You have brought me all the necessary items.";
+ mes "Please wait a moment while I forge the Executioner Sword.";
+ next;
+ mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "Phew! Once again a perfect sword! Hahaha! Here you are my friend, enjoy.";
+ getitem 1169,1;
+ close;
+
+ M_Grim: //1237
+ if(countitem(7023)>=10 && countitem(724)>=5 && countitem(7002)>=100 && countitem(7022)>=1 && countitem(714)>=1) goto L_GetGrim;
+ mes "[Legendary Blacksmith]";
+ mes "So you're interested in making the legendary Grimtooth Dagger heh?.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "It's been sometime since I've forged any weapons,... but since it";
+ mes "is a special challenge for me to make this dagger.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "I'll do it! I will re-create the Grimtooth Dagger! I must warn you";
+ mes "however, this is a very powerfull and dangerous dagger. Be carefull.";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "For the Grimtooth Dagger I will need the following items:";
+ mes "- ^0000ff10 Blade Lost in Darkness^000000"; //7023
+ mes "- ^0000ff5 Cursed Ruby^000000"; //724
+ mes "- ^0000ff100 Ogre Tooth^000000"; //7002
+ mes "- ^0000ff1 Old Hilt^000000"; //7022
+ mes "- and ^0000ff1 Emperium^000000";
+ close;
+
+ L_GetGrim:
+ delitem 7023,10;
+ delitem 724,5;
+ delitem 7002,100;
+ delitem 7022,1;
+ delitem 714,1;
+ mes "[Legendary Blacksmith]";
+ mes "Good! You have brought me all the necessary items.";
+ mes "Please wait a moment while I forge the Grimtooth Dagger.";
+ next;
+ mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "Phew! Once again a perfect dagger! Hahaha! Here you are my friend, enjoy.";
+ getitem 1237,1;
+ close;
+
+ M_Myst: //1138
+ if(countitem(7021)>=1 && countitem(7019)>=1 && countitem(7020)>=1 && countitem(7018)>=1 && countitem(714)>=1) goto L_GetMyst;
+ mes "[Legendary Blacksmith]";
+ mes "So you're interested in making the legendary Mysteltain Sword heh?.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "It's been sometime since I've forged any weapons,... but since it";
+ mes "is a special challenge for me to make this sword.....";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "I'll do it! I will re-create the Mysteltain Sword! I must warn you";
+ mes "however, this is a very powerfull and dangerous sword. Be carefull.";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "For the Mysteltain Sword I will need the following items:";
+ mes "- ^0000ff1 Foolishness of the Blind^000000"; //7021
+ mes "- ^0000ff1 Loki's Whispers^000000"; //7019
+ mes "- ^0000ff1 Mother's Nightmare^000000"; //7020
+ mes "- ^0000ff1 Young Twig^000000"; //7018
+ mes "- and ^0000ff1 Emperium^000000";
+ close;
+
+ L_GetMyst:
+ delitem 7021,1;
+ delitem 7019,1;
+ delitem 7020,1;
+ delitem 7018,1;
+ delitem 714,1;
+ mes "[Legendary Blacksmith]";
+ mes "Good! You have brought me all the necessary items.";
+ mes " Please wait a moment while I forge the Mysteltain Sword.";
+ next;
+ mes "(cling-clang!~ klonk!~ klank!~ cling-clang!)";
+ next;
+ mes "[Legendary Blacksmith]";
+ mes "Phew! Once again a perfect sword! Hahaha! Here you are my friend, enjoy.";
+ getitem 1138,1;
+ close;
+}
diff --git a/npc/quests/eye_of_hellion.txt b/npc/quests/eye_of_hellion.txt
index 9bee124d7..f90cf3714 100644
--- a/npc/quests/eye_of_hellion.txt
+++ b/npc/quests/eye_of_hellion.txt
@@ -1,2147 +1,2147 @@
-//===== eAthena Script =======================================
-//= The Eye of Hellion Quest.
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena SVN 3422+(Requires jA Script System)
-//===== Description: =========================================
-//= Quest for getting a Nile Rose
-//===== Comments: ============================================
-//=
-//===== Additional Comments: =================================
-//= 1.0 First version [MasterOfMuppets]
-//============================================================
-
-geffen.gat,110,200,3 script Sage Welshyun 754,2,2,{
-
- if(HELLIONQ > 25)goto s_Last;
- if(HELLIONQ > 18)goto s_Switches;
- mes "[Welshyun]";
- mes "Hm? Oh, pardon me.";
- mes "I didn't notice you. I was";
- mes "far too occupied thinking";
- mes "deep important thoughts";
- mes "that your puny little mind";
- mes "couldn't possible fathom.";
- close;
-
-s_Last:
- mes "[Welshyun]";
- mes "So, were you able";
- mes "to deliver the tablet";
- mes "and the Hellion's gem to";
- mes "Chilias safely? Ah, and";
- mes "how has my friend been?";
- close;
-
-s_Switches:
- switch(HELLIONQ)
- {
-
- case 19:
- if(HELLIONQ3)goto s_Thirsty;
- specialeffect 313;
- specialeffect2 313;
- mes "[Welshyun]";
- mes "That...";
- mes "That eerie glow...";
- next;
- mes "[Welshyun]";
- mes "You! Identify yourself";
- mes "and explain how you came";
- mes "about to get those tablet";
- mes "pieces! Now answer me!";
- next;
- mes "[Welshyun]";
- mes "Ah, forgive me. You're";
- mes "helping Chilias, are you?";
- mes "I see. So you must be here";
- mes "to seek my help in finding";
- mes "the final piece, am I correct?";
- next;
- menu "Shut up, I know you have it, so give it!",s_Shut,"Yes, please help me.",-;
-
- mes "[Welshyun]";
- mes "Ah, yes... I shall help";
- mes "you get the final tablet";
- mes "piece, but first you'll have";
- mes "to do a favor for me.";
- next;
- mes "[Welshyun]";
- mes "My student in the Geffen";
- mes "Tower has not reported back to";
- mes "about his research project,";
- mes "so I would like for you to find";
- mes "him and retrieve the report";
- mes "for me. Not a big deal, right?";
- next;
- mes "[Welshyun]";
- mes "The title of his report";
- mes "should be, \"^7151FFMonster Life";
- mes "in the Geffen Area^000000\", so";
- mes "please remember that.";
- mes "Ah, and my student's";
- mes "name is Enoz.";
- set HELLIONQ,20;
- close;
-
- s_Shut:
- mes "[Welshyun]";
- mes "Such insolence!";
- mes "Huh. I suppose Chilias";
- mes "may have misjudged you";
- mes "when he entrusted you with";
- mes "this important mission. Huh.";
- mes "A reevaluation is in order...";
- set HELLIONQ3,1;
- close;
-
- s_Thirsty:
- if(countitem(504))goto s_Thirsty2;
- mes "[Welshyun]";
- mes "^111111*Ahem*^000000 Oh dear me...";
- mes "I'm unfathombly thirsty...";
- mes "There's no way I can do any";
- mes "serious thinking with such";
- mes "a dry, parched throat...";
- close;
-
- s_Thirsty2:
- mes "[Welshyun]";
- mes "Oh, a White Potion?";
- mes "Yes, may I please have";
- mes "one? Ahh, most refreshing~";
- mes "You may not be such a bad";
- mes "person after all! Now";
- mes "Shall I help you find";
- mes "that tablet piece?";
- next;
- mes "[Welshyun]";
- mes "Of course, in the";
- mes "interest of mankind,";
- mes "I shall help you. But first,";
- mes "I have a favor to ask of you.";
- next;
- mes "[Welshyun]";
- mes "My student in the Geffen";
- mes "Tower has not reported back to";
- mes "about his research project,";
- mes "so I would like for you to find";
- mes "him and retrieve the report";
- mes "for me. Not a big deal, right?";
- next;
- mes "[Welshyun]";
- mes "The title of his report";
- mes "should be, \"^7151FFMonster Life";
- mes "in the Geffen Area^000000\", so";
- mes "please remember that.";
- mes "Ah, and my student's";
- mes "name is Enoz.";
- delitem 504,1; //White potion
- set HELLIONQ3,0;
- set HELLIONQ,20;
- close;
- break;
-
- case 20:
- mes "[Welshyun]";
- mes "Please bring me the";
- mes "report entitled, \"^7151FFMonster Life";
- mes "in the Geffen Area^000000\",";
- mes "from my student Enoz in";
- mes "the Geffen Tower. Thank";
- mes "you, I appreciate your help.";
- close;
- break;
-
- case 21:
- mes "[Welshyun]";
- mes "Hm? What's that strange";
- mes "expression on your face?";
- mes "Prank? Oh please. Such";
- mes "chicanery is beneath me...";
- mes "But even if I did play a";
- mes "joke, believe me. It";
- mes "builds character.";
- next;
- mes "[Welshyun]";
- mes "First and foremost,";
- mes "I want yo test you to see";
- mes "if you are worthy of this";
- mes "tablet piece. I want to see";
- mes "for myself if you are a person";
- mes "of honor. Someone of character.";
- next;
- mes "[Welshyun]";
- mes "Oh yes, I accidentally";
- mes "took this Master Science";
- mes "Reference Book from Enoz,";
- mes "so would you please return it";
- mes "to him for me? Oh, and please";
- mes "bring back 1 Blue Gemstone.";
- next;
- mes "^3151FFYou received the";
- mes "incredibly heavy tome,";
- mes "the the Master Science";
- mes "Reference Book.";
- set HELLIONQ,22;
- close;
- break;
-
- case 22:
- mes "[Welshyun]";
- mes "Please deliver the Master";
- mes "Science Reference Book to";
- mes "Enoz, and come back to me";
- mes "with 1 Blue Gemstone.";
- close;
- break;
-
- case 23:
- if(!countitem(717))goto s_NoGem;
- mes "[Welshyun]";
- mes "Thank you. You've";
- mes "brought the book to Enoz";
- mes "and delivered a Gemstone";
- mes "to me as I've asked. Now,";
- mes "there is one final test...";
- next;
- mes "[Welshyun]";
- mes "Answer this question.";
- mes "Where is the abode of the";
- mes "departed souls with a shining";
- mes "silver roof that is mentioned";
- mes "in the third part of the ballad";
- mes "of Grimnir? Well, adventurer?";
- next;
- input @str$;
- if(@str$ != "Valaskjalf")goto s_WrongStr;
- mes "[Welshyun]";
- mes "Ah, well met, well met.";
- mes "You are as well learned as";
- mes "you are brave. As promised,";
- mes "you may have this piece of";
- mes "the tablet, which I've";
- mes "already found. The clues";
- mes "were too simple...";
- set HELLIONQ,24;
- delitem 717,1; //Blue gemstone
- getitem 7336,1, //Geffen Tablet
- next;
- mes "[Welshyun]";
- mes "Please send my regards";
- mes "to my dear friend, Chilias,";
- mes "who has dedicated his life";
- mes "to sealing the evil within";
- mes "the Hellion's gem.";
- close;
-
- s_WrongStr:
- mes "[Welshyun]";
- mes "Bwahahaah! Only";
- mes " a superior mind could";
- mes "know the answer to such";
- mes "a question! Go forth and";
- mes "learn the answer, else";
- mes "I cannot help you, adventurer~";
- close;
-
- s_NoGem:
- mes "[Welshyun]";
- mes "Ah, I've heard that";
- mes "Enoz received the Master";
- mes "Science Reference Book";
- mes "from you. But did you remember";
- mes "to bring me a Blue Gemstone?";
- close;
- break;
-
- case 24:
- mes "[Welshyun]";
- mes "Hm. You should visit";
- mes "Chilias and determine";
- mes "your next course of action,";
- mes "now that you have all four";
- mes "of the pieces of the tablet.";
- close;
- break;
-
- case 25:
- mes "[Welshyun]";
- mes "Hm? Did you need";
- mes "me to combine all four";
- mes "pieces of the tabled and";
- mes "make it whole again? Oh.";
- mes "All this time I thought you";
- mes "knew how to do it. Alright.";
- next;
- mes "[Welshyun]";
- mes "As a matter of fact,";
- mes "I was planning on using";
- mes "the Blue Gemstone you gave";
- mes "me to do this. But since you";
- mes "never really asked... In any";
- mes "case, let me concentrate.";
- next;
- specialeffect 54;
- mes "[Welshyun]";
- mes "Shadows remembered by time.";
- mes "Help me retrieve the forgotten";
- mes "stories that have been";
- mes "scattered in the wind.";
- mes "Right here. Right now.";
- next;
- specialeffect 72;
- mes "[Welshyun]";
- mes "...";
- mes "Okay...";
- mes "That was tough.";
- next;
- mes "[Welshyun]";
- mes "Here's the";
- mes "complete tablet.";
- mes "Please bring this";
- mes "safely back to Chilias.";
- getitem 7332,1; //Complete Tablet
- delitem 7333,1; //Prontera Tablet
- delitem 7334,1; //Payon Tablet
- delitem 7335,1; //Morroc Tablet
- delitem 7336,1; //Geffen Tablet
- set HELLIONQ,26;
- next;
- mes "[Welshyun]";
- mes "Wait, take a look!";
- mes "There's a map on the back";
- mes "of the tablet. Although the gem";
- mes "is already embedded within the";
- mes "tablet, who knows where this";
- mes "map may lead? Perhaps";
- mes "Hellion Revenant?";
- next;
- mes "[Welshyun]";
- mes "I don't know if Chilias";
- mes "told you, but the name of";
- mes "the monster that guards and";
- mes "follows this gem is Hellion";
- mes "Revenant. But why mark its";
- mes "location on this tablet?";
- next;
- mes "[Welshyun]";
- mes "Well, it will be dangerous, but";
- mes "I'm sure that you're strong enough";
- mes "to confront this monster. I";
- mes "believe it was the wish of this";
- mes "tablet's creator for someone";
- mes "to defeat the Hellion Revenant.";
- next;
- menu "Alright I'll do it!",s_DoIt,"I better get this tablet to Chilias...",-;
-
- mes "[Welshyun]";
- mes "Yes, that's true.";
- mes "Chilias has been waiting";
- mes "his whole life to seal this";
- mes "gem. Plus, who knows what";
- mes "may happen while it is in";
- mes "your possession?";
- set HELLIONQ,26;
- close;
-
- s_DoIt:
- mes "[Welshyun]";
- mes "Well, I'm almost certain";
- mes "this map will lead you to";
- mes "Hellion Revenant. Let me";
- mes "warp you to the location";
- mes "marked on the tablet's map...";
- close2;
- warp "gef_fild09.gat",368,88;
- set HELLIONQ,26;
- end;
- break;
-
- }
-
-OnTouch:
- if(HELLIONQ != 19)end;
- specialeffect 313;
- specialeffect2 313;
- mes "^3151FFThe piece of tablet";
- mes "that you have is shining";
- mes "with light as if in response";
- mes "to something in the area.";
- close;
-
-}
-
-prontera.gat,269,326,3 script Clanux Heffron 50,{
-
- if(HELLIONQ > 7)goto s_Last;
- if(HELLIONQ)goto s_Switches;
- mes "[Clanux Heffron]";
- mes "What's wrong with";
- mes "this map?! I can't";
- mes "find a blasted thing";
- mes "on it! How can finding";
- mes "something be so hard?";
- close;
-
-s_Last:
- mes "[Clanux Heffron]";
- mes "Oh hey, it's you.";
- mes "Listen I got this number";
- mes "pad to pop out of that old";
- mes "machine in the Tool Shop,";
- mes "I still don't know what the";
- mes "password for it might be.";
- next;
- mes "[Clanux Heffron]";
- mes "If I couldn't figure";
- mes "it out, and I understand";
- mes "if you couldn't figure this";
- mes "out, then this puzzle must";
- mes "be freakin' impossible!";
- close;
-
-s_Switches:
- switch(HELLIONQ)
- {
-
- case 1:
- if(HELLIONQ2)goto s_Bother;
- mes "[" + strcharinfo(0) + "]";
- mes "Excuse me, but are";
- mes "you Clanux Heffron?";
- next;
- mes "[Clanux Heffron]";
- mes "Why, who are you";
- mes "and what the heck";
- mes "do you want? Oh...";
- mes "Sent by Chilias, eh?";
- mes "What does he want?";
- next;
- menu "He wants me to help you",s_You,"He wants you to help me.",-;
-
- mes "[Clanux Heffron]";
- mes "Help you...? What, with";
- mes "clues to the location of";
- mes "the Hellion's gem? Screw";
- mes "that, pal! Why should I help";
- mes "you if we're gonna compete";
- mes "for the same prize?!";
- set HELLIONQ2,1;
- close;
-
- s_Bother:
- mes "[Clanux Heffron]";
- mes "Hey, why do you keep";
- mes "botherin' me?! Go and";
- mes "find your own clues for the";
- mes "Hellion's gem on your own,";
- mes "jerkface! Now getouttahere!";
- next;
- menu "W-what! Let's work together!",s_Work,"Fine. I don't need your help!",-;
-
- mes "[" + strcharinfo(0) + "]";
- mes "Fine.";
- mes "I don't need";
- mes "your help!";
- next;
- mes "[Clanux Heffron]";
- mes "Yeah right!";
- mes "You'll be back!";
- mes "...They always";
- mes "come back.";
- close;
-
- s_Work:
- mes "[Clanux Heffron]";
- mes "Work together, eh? You";
- mes "know, normally I'd tell you";
- mes "to make like a moonwalker";
- mes "and just beat it, but I gotta";
- mes "admit that I ain't doin' so";
- mes "good on my own on this...";
- next;
- mes "[Clanux Heffron]";
- mes "Alright, fine.";
- mes "First, look through the";
- mes "old Swordman Training";
- mes "Grounds here in Prontera.";
- mes "There might be some clues";
- mes "left over there for you to";
- mes "find.";
- set HELLIONQ2,0;
- set HELLIONQ,2;
- close;
-
- s_You:
- mes "[Clanux Heffron]";
- mes "So he sent me an";
- mes "assistant, huh? Well...";
- mes "Seeing as he gave me this";
- mes "clue and I've taken so long";
- mes "and still don't have anything";
- mes "to show for it, I don't blame him.";
- next;
- mes "[Clanux Heffron]";
- mes "Well, if he sent you to";
- mes "help me out, I guess I can";
- mes "tell you everything. For the";
- mes "clues he had me look for,";
- mes "I've only found two so far.";
- mes "But I can't figure them out...";
- next;
- mes "[Clanux Heffron]";
- mes "Let's see, there's this";
- mes "broken sword and this";
- mes "strange lookin' cogwheel.";
- mes "What do these clues mean?!";
- mes "Did the old man give you";
- mes "any hints to help me out?";
- next;
- menu "Where did you find these?",-,"No I'm sorry.",s_Sorry;
- //Custom dialog
- mes "[Clanux Heffron]";
- mes "I found them next to a";
- mes "broken training dummy";
- mes "in the old Swordman";
- mes "Training Grounds here";
- mes "in Prontera.";
- next;
- mes "[Clanux Heffron]";
- mes "Why don't you go search";
- mes "the old Swordman Training";
- mes "Grounds for clues? I might";
- mes "have missed something...";
- mes "Not that I think so, but";
- mes "just in case!";
- set HELLIONQ,2;
- close;
-
-s_Sorry:
- mes "[Clanux Heffron]";
- mes "Wha--? Then why are";
- mes "you even here to help";
- mes "me then? Huh. That old";
- mes "coot must not trust me";
- mes "enough, but I can't exactly";
- mes "blame him. Alright then...";
- next;
- mes "[Clanux Heffron]";
- mes "If you're gonna help me,";
- mes "go search the old Swordman";
- mes "Training Grounds over here in";
- mes "Prontera. I doubt it, but there's";
- mes "a chance I mighta missed";
- mes "something there. Get to it!";
- set HELLIONQ,2;
- close;
- break;
-
- case 2:
- mes "[Clanux Heffron]";
- mes "Look pal, I found this broken";
- mes "sword, a bonafide clue if I";
- mes "ever saw one, in the old";
- mes "Swordman Training Grounds in";
- mes "Prontera. You should be able to";
- mes "find something else there, maybe.";
- close;
- break;
-
- case 3:
- mes "[Clanux Heffron]";
- mes "Hey, you're done";
- mes "searching? Were you";
- mes "able to find anything?";
- next;
- menu "Nothing...",s_Nothing,"In fact, I found this.",-;
-
- mes "[Clanux Heffron]";
- mes "Wha--? I had no idea";
- mes "that sort of thing could";
- mes "be hidden in that training";
- mes "ground. I missed it. Oh,";
- mes "so the Veggie Lady gave you a";
- mes "password and all?";
- next;
- mes "[Clanux Heffron]";
- mes "Huh, I can't make heads";
- mes "or tails of that password.";
- mes "I guess I have no choice but";
- mes "to give you this, the";
- mes "cogwheel clue I found";
- mes "from the Tool Shop.";
- next;
- mes "[Clanux Heffron]";
- mes "I mean, you've been lucky";
- mes "enough till now, so you'll";
- mes "probably be able to stumble";
- mes "upon the answer behind this";
- mes "weird, weird riddle. But you";
- mes "gotta tell me the answer too!";
- next;
- mes "[Clanux Heffron]";
- mes "Alright, now take your";
- mes "cogwheel and get outta";
- mes "here. The sooner you get";
- mes "that clue, the sooner I'll";
- mes "get that Hellion's gem.";
- set HELLIONQ,4;
- getitem 7093,1; //Cogwheel
- close;
-
- s_Nothing:
- mes "[" + strcharinfo(0) + "]";
- mes "^111111(This guy's a real punk!";
- mes "I better not share any new";
- mes "information I've found, just";
- mes "in case he doesn't already";
- mes "know about it.)";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I... I wasn't able to";
- mes "find anything that looked";
- mes "like a clue. I'm sorry, but";
- mes "I let you down big time...";
- next;
- mes "[Clanux Heffron]";
- mes "Aw nuts! Alright, if you";
- mes "go back to the old man, let";
- mes "him know that I found a broken";
- mes "sword from the old Swordman";
- mes "Training Grounds and this";
- mes "cogwheel from the Tool Shop.";
- next;
- mes "[Clanux Heffron]";
- mes "The clues I've found so";
- mes "far don't make any sense!";
- mes "So if you can, convince him to";
- mes "drop me a couple more hints.";
- mes "And give this to the old guy";
- mes "to prove I found it, will you?";
- next;
- mes "[Clanux Heffron]";
- mes "That's all I know.";
- mes "At this point you're";
- mes "probably better off";
- mes "searching for these";
- mes "clues on your own...";
- getitem 7093,1; //Cogwheel
- set HELLIONQ,4;
- close;
- break;
-
- case 4:
- case 5:
- case 6:
- mes "[Clanux Heffron]";
- mes "Hey... Didn't I tell";
- mes "you to check out the";
- mes "Tool Shop in case there";
- mes "was anything I missed?";
- mes "Now go! That's an order!";
- close;
- break;
-
- case 7:
- mes "[Clanux Heffron]";
- mes "Hey, so you have";
- mes "anything new to report?";
- mes "Oh, and did you learn";
- mes "anything from that weird";
- mes "maching in the Tool Shop?";
- next;
- menu "Tell him just a little bit.",s_Bit,"Don't tell him",-;
-
- s_Bit:
- mes "[" + strcharinfo(0) + "]";
- mes "Well, I put that cogwheel";
- mes "into that weird machine in";
- mes "the Tool Shop and some kind";
- mes "of number pad came out. Then...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "^111111(Wait, I can't trust this";
- mes "guy!)^000000 I put in every single";
- mes "password that I could think";
- mes "of, but nothing happened!";
- mes "I think I'm stuck...";
- next;
- mes "[Clanux Heffron]";
- mes "Oh yeah? Hah! Well, now";
- mes "that the easy part is";
- mes "done, I'll just figure out";
- mes "that secret password";
- mes "myself! Hahahah! That Hellion's";
- mes "gem is as good as mine!";
- set HELLIONQ,8;
- close;
- break;
-
- }
-
-}
-
-prontera.gat,224,84,1 script Training Dummy#HellionDummy 111,{
-
- if(HELLIONQ == 2)goto s_Hellion;
- mes "^3151FFIt's a training dummy";
- mes "that was used to hone the";
- mes "skills of new Swordmen...";
- mes "But the Swordman Training";
- mes "Grounds have moved to Izlude.";
- close;
-
-s_Hellion:
- mes "^3151FFIt's a training dummy";
- mes "with a gash in its body";
- mes "that looks like it was made";
- mes "by the thrust of a sharp sword.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Didn't Clanux mention that he";
- mes "found a broken sword around";
- mes "here? Maybe this was exactly";
- mes "where he found it. Let's see...";
- next;
- menu "Inspect the dummy's gash",-;
-
- mes "^3151FFInside of the dummy's body is";
- mes "a steel bearing with a roughly";
- mes "etched message that reads:";
- mes "^7151FF\"Veggie Lady N9 W3 BINGO.\"";
- next;
-
- mes "[" + strcharinfo(0) + "]";
- mes "What the heck does this";
- mes "even mean? A Veggie Lady?";
- mes "Does Clanux know anything";
- mes "at all about this clue...?";
- set HELLIONQ,3;
- close;
-
-}
-
-prt_in.gat,128,79,0 script Unknown Machine#HellionMchn 111,{
- if(HELLIONQ == 6)goto s_Input2;
- if(HELLIONQ == 5)goto s_Input;
- mes "^3151FFIt's some sort of";
- mes "strange looking machine";
- mes "with a mysterious purpose.";
- close;
-
-s_Input:
- mes "^3151FFIt's a weird looking";
- mes "machine that looks like";
- mes "it hasn't been used in a";
- mes "while. It looks like the";
- mes "cogwheel that you have";
- mes "would fit perfectly in it...";
- next;
- menu "Insert Cogwheel",s_Insert,"Ignore it.",-;
-
- mes "[" + strcharinfo(0) + "]";
- mes "Eh...";
- mes "Forget it.";
- close;
-
-s_Insert:
- if(!countitem(7093))goto s_NoCog;
- mes "[" + strcharinfo(0) + "]";
- mes "I just know this";
- mes "cogwheel will fit";
- mes "into this machine!";
- mes "What I don't know is";
- mes "what will happen once";
- mes "this machine works...";
- next;
- mes "^3151FF*Click...!*";
- mes "Once the cogwheel is";
- mes "fit into the machine and";
- mes "turned, the device hums";
- mes "to life and a panel opens,";
- mes "revealing a numeric keypad.";
- delitem 7093,1; //Cogwheel
- set HELLIONQ,6;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I guess that I've got";
- mes "to input some kind of";
- mes "numeric password...";
- mes "Ah, right, the numbers";
- mes "that Veggie Lady gave me!";
- next;
- input @temp;
- if(@temp != 16754213)goto s_FailInp;
-s_CorrectInput:
- mes "^3151FFThe machine responds to";
- mes "the password with a pleasant";
- mes "chime, confirming that you've";
- mes "input the correct numbers.";
- mes "The keypad slides open to";
- mes "reveal a piece of a tablet.";
- getitem 7333,1; //Prontera Tablet
- set HELLIONQ,7;
- next;
- mes "^3151FFThe message engraved on";
- mes "this table reads: \"This is for";
- mes "Christopher, my dear friend who";
- mes "I met in Prontera. To the one";
- mes "who finds this, please seek";
- mes "out the next piece of this tablet";
- mes "in the city of thickest forest.\"";
- next;
- mes "^3151FFThe message is signed";
- mes "by someone named Tyus.";
- mes "It would be best to bring";
- mes "this back to Sir Chilia'Tyus";
- mes "and confirm that this was";
- mes "made by his grandfater...";
- close;
-
-s_Input2:
- mes "[" + strcharinfo(0) + "]";
- mes "Okay, let me see";
- mes "if I can enter the";
- mes "right number this time...";
- next;
- input @temp;
- if(@temp == 16754213)goto s_CorrectInput;
-
-s_FailInp:
- mes "^3151FFThe machine responds to";
- mes "the passwords with an abrupt,";
- mes "screeching beep and the entire";
- mes "machine shuts down. You'll";
- mes "have to try entering the";
- mes "password again.";
- close;
-
-s_NoCog:
- mes "[" + strcharinfo(0) + "]";
- mes "Hmm, I can't find the";
- mes "cogwheel, now where did";
- mes "I put it?";
- close;
-
-}
-
-prontera.gat,45,67,1 script #HellionActivator 139,0,0,{
-OnTouch:
- if(HELLIONQ != 4)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Well, according to the";
- mes "message in that old training";
- mes "dummy, this is where I'm";
- mes "supposed to go. Nine steps";
- mes "north, 3 steps west. And now...";
- mes "Veggie Lady. Okay, okay...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Huh. That's creepy.";
- mes "There's one right there";
- mes "staring at me. But after";
- mes "the words \"Veggie Lady\"";
- mes "all the message says is, um,";
- mes "what was that last word again?";
- next;
- input @tempstr$;
- if(@tempstr$ != "BINGO")goto s_Failstr;
- mes "[" + strcharinfo(0) + "]";
- mes "Of course!";
- mes "\"BINGO!\" But";
- mes "I don't see a hall";
- mes "full of old people";
- mes "around here, I--";
- next;
- mes "[Veggie Lady]";
- mes "Finall, you say it.";
- mes "Yessh, I thought I was";
- mes "going to wait forever for";
- mes "somebody to say that";
- mes "password. Okay, here's";
- mes "the code number you want...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "C-code number?";
- mes "Wait, wh-what...?";
- next;
- mes "[Veggie Lady]";
- mes "Awww...I don't know!";
- mes "I'm only gonna say it";
- mes "now: ^7151FF16754213^000000. One";
- mes "more time, in case you";
- mes "didn't get it: ^7151FF16754213^000000.";
- mes "Don't forget it, adventurer.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Wait... What does";
- mes "this all mean? Won't";
- mes "you tell me more?";
- next;
- mes "[Veggie Lady]";
- mes "No. I've been given";
- mes "explicit instructions";
- mes "to not tell you more.";
- mes "In face, I hate talking.";
- mes "That's why I sell vegetables.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Holy cow...";
- mes "This is all";
- mes "really cloak and";
- mes "dagger type stuff!";
- set HELLIONQ,5;
- close;
-
-s_Failstr:
- mes "[" + strcharinfo(0) + "]";
- mes @tempstr$;
- mes "Hmmm. No, no that couldn't";
- mes "be it. What in the world was";
- mes "that word and why can't I";
- mes "remember it when I seemingly";
- mes "need it most?";
- close;
-
-}
-
-payon.gat,182,132,3 script Grout'he Tuccok 48,{
-
- if(HELLIONQ > 17)goto s_Final;
- if(HELLIONQ > 8)goto s_Switches;
- mes "[Grout'he]";
- mes "Hey...";
- mes "Hey you!";
- mes "What are you";
- mes "looking at?!";
- mes "Get outta my";
- mes "face, ya jerkward.";
- close;
-
-s_Final:
- mes "[Grout'he]";
- mes "Hey, this is great!";
- mes "you actually found the";
- mes "next piece of the tablet!";
- mes "You better take this back";
- mes "to Chilias'Tyus right now~";
- next;
- mes "[Grout'he]";
- mes "Oh. And um, thanks";
- mes "for being willing to pay";
- mes "me in cash for all those";
- mes "little bitty clues. I won't";
- mes "forget your help, pal~";
- close;
-
-s_Switches:
- switch(HELLIONQ)
- {
-
- case 9:
- mes "[Grout'he]";
- mes "What...?";
- mes "You got something";
- mes "to tell me or are you";
- mes "just bein' a rude prick";
- mes "and starting at me like";
- mes "this is your turf?!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I'm sorry, but well...";
- mes "Chilias'Tyus told me that";
- mes "you might know something";
- mes "about a piece of a table--";
- next;
- mes "[Grout'he]";
- mes "What? Oh, so Chilias'Tyus";
- mes "is lookin for the gem too eh?";
- mes "Ooh, that's right. He wants to";
- mes "seal its evil or something.";
- mes "Yeah, yeah. That's a good";
- mes "cause. Real noble and all...";
- next;
- mes "[Grout'he]";
- mes "I'll tell you what. The only reason";
- mes "I want that gem is to sell it";
- mes "so I can pay off ally my debts.";
- mes "But if I sell you the clues I found,";
- mes "I'll get the zeny I need and the";
- mes "gem will be in good hands too.";
- next;
- mes "[Grout'he]";
- mes "So what do you say?";
- mes "It's not a bad deal if";
- mes "you think about it and";
- mes "we might as well kill";
- mes "two birds with one stone...";
- next;
- menu "Alright, I'll buy your clues.",s_Buy,"Why the hell should I pay you?!",-;
-
- mes "[Grout'he]";
- mes "Why the hell should you";
- mes "pay me?! Hey, aren't you";
- mes "looking for the gem to help";
- mes "the world? Well, I happen to";
- mes "be a little part of this world,";
- mes "so why don't you help me first?";
- next;
- mes "[Grout'he]";
- mes "Man, you might not";
- mes "know it, but the money";
- mes "you give me will save";
- mes "a life. My own! Dude, how";
- mes "can you be so insensitive?";
- close;
-
- s_Buy:
- mes "[Grout'he]";
- mes "Oh man, thanks a lot.";
- mes "Alright, all I'm asking";
- mes "for is 10,000 zeny. You get";
- mes "my clues and I'll let you know";
- mes "where I found 'em, in case";
- mes "you can find something new.";
- next;
- if(Zeny < 10000)goto s_NoZeny;
- set Zeny,Zeny-10000;
- mes "[Grout'he]";
- mes "There you go!";
- mes "Thanks for the cash~";
- mes "(Know I won't have to";
- mes "get my knees all broken!)";
- mes "Oh, and let me makr your";
- mes "Mini-Map for you real quick...";
- next;
- mes "[Grout'he]";
- mes "You see this here?";
- mes "It's where I found the";
- mes "Skirt of Virgin I'm about";
- mes "to give you. So check that";
- mes "spot out and see if you find";
- mes "anything new and interesting.";
- viewpoint 1,101,191,10,0xFF00FF;
- next;
- mes "[Grout'he]";
- mes "Here you go, pal...";
- mes "A Stone Heart, Green Herb,";
- mes "some Grape Juice and one";
- mes "clean and pure Skirt of Virgin.";
- mes "If you got any more questions,";
- mes "I guess you can ask me later~";
- getitem 953,1;
- getitem 511,1;
- getitem 533,1;
- getitem 1049,1;
- set HELLIONQ,10;
- close;
-
- s_NoZeny:
- mes "[Grout'he]";
- mes "Oh hey...";
- mes "You don't got the zeny.";
- mes "Sorry pal, but I've really got";
- mes "to pay my debts somehow.";
- mes "I don't know if I'm allowed";
- mes "to reall talk about it...";
- mes "^111111*Sob*";
- close;
- break;
-
- case 10:
- mes "[Grout'he]";
- mes "You see this here?";
- mes "It's where I found the";
- mes "Skirt of Virgin I'm about";
- mes "to give you. So check that";
- mes "spot out and see if you find";
- mes "anything new and interesting.";
- viewpoint 1,101,191,10,0xFF00FF;
- close;
- break;
-
- case 11:
- mes "[Grout'he]";
- mes "You've been to the";
- mes "first location? Good.";
- mes "Okay, now look over here.";
- mes "Check your Mini-Map to";
- mes "see where I found that";
- mes "Stone Heart, got it?";
- viewpoint 1,82,109,11,0xFF00FF;
- close;
- break;
-
- case 12:
- mes "[Grout'he]";
- mes "Alright, here's where";
- mes "I found that Green Herb.";
- mes "You know you can use that";
- mes "to counter poison, right?";
- mes "Check that place to see if";
- mes "there's anything I missed.";
- viewpoint 1,239,56,12,0xFF00FF;
- close;
- break;
-
- case 13:
- mes "[Grout'he]";
- mes "Okay, here's the last";
- mes "place you should double";
- mes "check, the place where";
- mes "I nabbed that Grape";
- mes "Juice. Good luck~";
- viewpoint 1,240,161,13,0xFF00FF;
- close;
- break;
-
- case 14:
- mes "[Grout'he]";
- mes "Oh, you need some help";
- mes "with figuring out the clues?";
- mes "Heh. Alright, let's see.";
- mes "You want me to help";
- mes "you in making sense of";
- mes "this weird riddle?";
- next;
- menu "Yes, please!",s_YesP,"No thanks~",-;
-
- mes "[Grout'he]";
- mes "Oh yeah?";
- mes "Well listen, I dunno,";
- mes "but this looks to be one";
- mes "of those situations where";
- mes "two heads are better than one.";
- mes "I think we oughta team up~";
- close;
-
- s_YesP:
- mes "[Grout'he]";
- mes "Alright now. All those";
- mes "messages said stuff about";
- mes "one sized clothing, dried";
- mes "fish and green herbs, wine...";
- mes "Huh. It doesn't make sense.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "What...?";
- mes "I could have";
- mes "told you that!";
- next;
- mes "[Grout'he]";
- mes "Wait, wait.";
- mes "Let's mark all the";
- mes "clue locations again";
- mes "on your Mini-Map.";
- mes "Okay, we've got four";
- mes "dots around Payon.";
- viewpoint 1,101,191,10,0xFF00FF;
- viewpoint 1,82,109,11,0xFF00FF;
- viewpoint 1,239,56,12,0xFF00FF;
- viewpoint 1,240,161,13,0xFF00FF;
- next;
- mes "[Grout'he]";
- mes "Alright, now if";
- mes "I connect and interesect";
- mes "all the lines, there's";
- mes "a point in the middle.";
- mes "Why don't you check";
- mes "this middle point, eh?";
- viewpoint 1,159,130,14,0xFF00FF;
- next;
- mes "[Grout'he]";
- mes "Now, this location";
- mes "is a house, and I know";
- mes "it's pretty random, but";
- mes "it's all we got. Heck,";
- mes "all these clues make";
- mes "less sense than this!";
- set HELLIONQ,15;
- close;
- break;
-
- case 15:
- mes "[Grout'he]";
- mes "Hey, how's it goin'";
- mes "looking for that one";
- mes "piece of the tablet?";
- mes "It's a lot of trouble,";
- mes "but I guess that's the";
- mes "case with all treasures.";
- viewpoint 1,159,130,14,0xFF00FF;
- close;
- break;
-
- case 16:
- mes "[Grout'he]";
- mes "Oh, so all of those";
- mes "items came in handy?";
- mes "I don't believe it! So";
- mes "this puzzle actually";
- mes "makes sense?! So";
- mes "what'd the slab say?";
- next;
- mes "[Grout'he]";
- mes "\"Compassionate one?\"";
- mes "Oh hey, there's a giant";
- mes "stone statue over in the";
- mes "Archer Village that fits";
- mes "the description perfectly!";
- mes "You should check it out.";
- set HELLIONQ,17;
- close;
- break;
-
- case 17:
- mes "[Grout'he]";
- mes "Hey, you really ought";
- mes "to check out the huge";
- mes "stone statue over in the";
- mes "Archer Village. Now that";
- mes "I think about it, it's the";
- mes "perfect hiding place!";
- close;
- break;
-
- }
-
-}
-
-payon.gat,101,191,1 script #HellionStepAct 139,1,1,{
- if(HELLIONQ != 10)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Well, this is where";
- mes "Grout'he told me to look.";
- mes "Ooh, there's something";
- mes "written on the ceiling. Um,";
- mes "let's see... \"This garment";
- mes "is one size fits all.\"";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "That's it...?";
- mes "Hopefully this will";
- mes "make more sense once";
- mes "I find more clues. I hope.";
- set HELLIONQ,11;
- close;
-
-}
-
-payon.gat,82,109,1 script Pile of Stones#HellionStones 111,{
- if(HELLIONQ != 11)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Well, this is the place";
- mes "that Grout'he told me about.";
- mes "Let's see, there's an engraving";
- mes "here that says, \"I used to";
- mes "pray for peaceful days";
- mes "here.\" Okay.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Man...";
- mes "This better not be";
- mes "one of those puzzles";
- mes "that looks easy once";
- mes "I get the answer. Well,";
- mes "if I ever get it, that is.";
- set HELLIONQ,12;
- close;
-
-}
-
-payon.gat,239,56,1 script Dried Fish#HellionFish 111,{
- if(HELLIONQ != 12)end;
- mes "[" + strcharinfo(0) + "]";
- mes "So... Dried fish all";
- mes "around me. This is getting";
- mes "to be nonsense. Let's see,";
- mes "this message says, \"Green";
- mes "Herbs are very useful for";
- mes "getting rid of fish smells.\"";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I got it...!";
- mes "Whoever made up";
- mes "these clues must be";
- mes "some sort of crazy man!";
- mes "It's the only explanation!";
- set HELLIONQ,13;
- close;
-
-}
-
-payon.gat,240,161,1 script Vat#HellionVat 111,{
- if(HELLIONQ != 13)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Alright, the last";
- mes "place I have to check.";
- mes "It's a big old vat with a";
- mes "message here too. No";
- mes "Let me see, there should";
- mes "be a message here too. Ah--!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "This says, \"What will it be?";
- mes "Wine or Grape Juice? Oh,";
- mes "but I much prefer wine.\" Okay,";
- mes "what does this have to do with";
- mes "that Hellion's gem? Weird...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Am I missing something?";
- mes "I think I really need help in";
- mes "figuring this out. Hmm...";
- set HELLIONQ,14;
- close;
-
-}
-
-payon.gat,159,130,1 script Wooden Floor#HellionFloor 111,{
- if(HELLIONQ > 15)goto s_Slab;
- if(HELLIONQ != 15)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Hey, the floor around";
- mes "here doesn't seem very";
- mes "solid. Maybe there's";
- mes "something underneath?";
- next;
- menu "Just check the floor.",-,"Dig through the dust.",s_Dig;
-
- mes "^3151FFYou examine the floor,";
- mes "but are unable to find";
- mes "anything that resembles";
- mes "a clue to the location";
- mes "of the Hellion's gem";
- mes "or a tablet piece.";
- close;
-
-s_Dig:
- mes "[" + strcharinfo(0) + "]";
- mes "Oh man, there's";
- mes "so much dust! What";
- mes "can I do about all of";
- mes "this nasty dirt in the air?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Well, there are all these";
- mes "clues Gout'he found. I sucks";
- mes "but I'll use this Grape Juice";
- mes "to sort of keep this dust from";
- mes "kicking up. And if I put my";
- mes "morals on hold, I'll cover";
- mes "my face...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...With this Skirt of Virgin.";
- mes "Oh, and I can use this Stone";
- mes "Heart to prop any floor boards";
- mes "I tilt while I look undernearth";
- mes "this floor. Oh hey! I found it!";
- mes "It's... It's another clue!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Wait, wait...";
- mes "I can't read the";
- mes "engraving on this";
- mes "stone slab, it's way";
- mes "too old. Let's see...";
- next;
- mes "^3151FFYou cover the surface";
- mes "of the slab and begin";
- mes "to rub a Green Herb over";
- mes "it. Fortunately, the juice from";
- mes "the Green Herb makes the";
- mes "engraving appear more clearly.";
- next;
- mes "[Stone Engraving]";
- mes "^7151FF\"This has been entrusted to";
- mes "the care of the compassionate";
- mes "one so that my friends may";
- mes "find peace. To he who finds";
- mes "this, remember that avarice";
- mes "knows no bounds. --Tyus.\"";
- set HELLIONQ,16;
- close;
-
-s_Slab:
- mes "[Stone Engraving]";
- mes "^7151FF\"This has been entrusted to";
- mes "the care of the compassionate";
- mes "one so that my friends may";
- mes "find peace. To he who finds";
- mes "this, remember that avarice";
- mes "knows no bounds. --Tyus.\"";
- close;
-
-}
-
-pay_arche.gat,141,29,1 script Buddha Statue#HellionStat 111,3,3,{
- if(HELLIONQ != 17)end;
- mes "[" + strcharinfo(0) + "]";
- mes "Hey, there's a huge";
- mes "stone statue. This";
- mes "must be what Gout'he";
- mes "was telling me about.";
- next;
- mes "[Echoing Voice]";
- mes "^7151FFYou must...";
- mes "You must be...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "What the--?";
- mes "There's a voice";
- mes "inside my head!";
- mes "and it's not even mine!";
- next;
- mes "[Echoing Voice]";
- mes "You who have come";
- mes "for the Tablet Piece,";
- mes "I shall judge whether";
- mes "or not you are worthy.";
- mes "Answer this one question.";
- next;
- mes "[Echoing Voice]";
- mes "You are in a situation";
- mes "in which you will die,";
- mes "but if you cause the death";
- mes "of another person, you will";
- mes "surely save yourself. So...";
- mes "What do you do?";
- next;
- menu "I will kill to survive",s_Kill,"I have no choice, but to die.",s_Die,"I won't kill, but I'll find a way to live!",-,"I'll ask that person if it's okay to kill him.",s_Ask;
-
- mes "[Echoing Voice]";
- mes "Yes. Love for all life,";
- mes "including your own, is";
- mes "a trait all true heroes";
- mes "must have. You have chosen...";
- mes "Wisely. Please, take this into";
- mes "your capable hands, adventurer.";
- next;
- mes "^3151FFA stone slab at the foot";
- mes "of the statue slides open,";
- mes "revealing a piece of the";
- mes "tablet that will lead you";
- mes "to the Hellion's gem.";
- getitem 7334,1; //Payon Tablet
- set HELLIONQ,18;
- close;
-
-s_Kill:
- mes "[Echoing Voice]";
- mes "there is a primal truth";
- mes "to your answer. However...";
- mes "You have chosen poorly.";
- close2;
- percentheal -100,0;
- end;
-
-s_Die:
- mes "[Echoing Voice]";
- mes "There is a kindness and";
- mes "compassion in your answer";
- mes "that is indeed rare. However,";
- mes "where is the respect for your";
- mes "own life? If you are that";
- mes "willing to throw it away, you";
- mes "are no hero.";
- close2;
- percentheal -100,0;
- end;
-
-s_Ask:
- mes "[Echoing Voice]";
- mes "The veneer of honesty in";
- mes "your answer is surpassed by";
- mes "your own cowardice. You have";
- mes "chosen extremely poorly...";
- close2;
- percentheal -100,0;
- end;
-
-OnTouch:
- if(HELLIONQ != 17)end;
- specialeffect 313;
- specialeffect2 313;
- mes "^3151FFThe piece of tablet";
- mes "that you have is shining";
- mes "with light as if in repsonse";
- mes "to something in the area.";
- close;
-
-}
-
-morocc_in.gat,116,101,2 script Old Scholar Tyus 735,2,2,{
-
- if(HELLIONQ == 27)goto s_Last;
- if(countitem(7332))goto s_Tablet;
- if(HELLIONQ == 25)goto s_Completion;
- if(HELLIONQ == 24)goto s_Four;
- if(HELLIONQ > 18)goto s_Welshyun;
- if(HELLIONQ == 18)goto s_Morroc;
- if(HELLIONQ > 8)goto s_Grout;
- if(HELLIONQ == 8)goto s_Payon;
- if(HELLIONQ == 4)goto s_Veggie;
- if(HELLIONQ > 0)goto s_Seek;
- if(hellion_consideration)goto s_Consider;
- mes "[Sir Chilias'Tyus]";
- mes "Greetings...";
- mes "My name is Sir Chilias'Tyus.";
- mes "I've lived a long time here in";
- mes "Rune-Midgard and I've come";
- mes "to see and know a lot of things.";
- mes "Power, jealousy, hardship...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Sp what exactly";
- mes "brings you here to";
- mes "the middle of Morroc?";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "This land has grown corrupt";
- mes "with the disease of greed";
- mes "and selfishness. Everywhere";
- mes "you go, people are heartless,";
- mes "but I still believe that I'll find";
- mes "the one worth enough to help";
- mes "me...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "There is no shortage of";
- mes "brave and strong warriors";
- mes "in these dangerous times.";
- mes "But for the thing I seek,";
- mes "I must have the help of one";
- mes "who is truly pure of heart...";
- next;
- menu "What are you looking for?",s_Looking,"Pure of heart? Hah! Good luck!",-;
-
- mes "[Sir Chilias'Tyus]";
- mes "Times are bad when";
- mes "even the youth have";
- mes "been jaded. But I refuse";
- mes "to believe that hope is";
- mes "truly lost in this age...";
- close;
-
-s_Glimmer:
- mes "[Sir Chilias'Tyus]";
- mes "Heh heh~ I see you eyes";
- mes "glimmer with enthusiasm,";
- mes "but it seems this task might";
- mes "be a little too much for you.";
- mes "I'm sorry, but that's the";
- mes "reality I can't ignore...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Go out in to the world,";
- mes "and grow in strength.";
- mes "Perhaps after you become";
- mes "more capable, I'll find that";
- mes "I can rely on your help.";
- close;
-
-s_Looking:
- if(BaseLevel < 75)goto s_Glimmer;
- mes "[Sir Chilias'Tyus]";
- mes "I suppose I should tell you";
- mes "first about my grandfather,";
- mes "who was once a young and";
- mes "fearless adventurer, much";
- mes "like yourself. Yes, he";
- mes "traveled the world with his";
- mes "three friends...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "The four of them went on";
- mes "many expeditions together";
- mes "and earned themselves a";
- mes "reputation as a courageous";
- mes "team that worked especially";
- mes "well together after many years.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Then, on what was supposed";
- mes "to be a typical journey, they found";
- mes "an uncharted cave. Curious, and";
- mes "in need of rest, the four ventured";
- mes "inside. There, they encountered";
- mes "that most horrible creature...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "It was a ferocious beast";
- mes "with horns as large and as";
- mes "sharp as their weapons, with";
- mes "eyes that blazed with hellfire.";
- mes "My grandfather could tell that";
- mes "it was thirsty for blood.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "They ran from the beast";
- mes "as quickly as they could,";
- mes "but the four were separated";
- mes "in the cave's darkness. It was";
- mes "all they could do to hide in";
- mes "the darkness of the cave...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "From his hiding place, my";
- mes "grandfather heard the screams";
- mes "of his friends as the monster";
- mes "slaughtered them, one by one.";
- mes "The screams and the monster's";
- mes "growls were getting closer...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Unable to endure the";
- mes "suffering of his trusted";
- mes "comrades, my grandfather";
- mes "jumped out hiding and tried";
- mes "to save his friends. The beast";
- mes "found him and they battled.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "It was no use. The beast";
- mes "was too powerful and my";
- mes "grandfather was knocked out.";
- mes "When he came to, his friends";
- mes "were all dead and a shining";
- mes "gem lay in a pool of blood.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "My grandfather buried";
- mes "his friends that day. He";
- mes "took that gem as a memento";
- mes "of their final expedition, but";
- mes "wondered why the beast";
- mes "had decided to spare him.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "It wasn't long before he";
- mes "experienced the gem's curse";
- mes "firsthand. The gem inexplicably";
- mes "drew people to it, taking the";
- mes "greed in their hearts and";
- mes "twisting their minds...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Grandfather believed the";
- mes "beast let him live so that";
- mes "the gem would be set loose";
- mes "upon the outside world, free";
- mes "to pollute it with its evil.";
- mes "He had to do something...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "However, the gem proved";
- mes "to be formed out of pure evil";
- mes "and could not be destroyed";
- mes "by human means. In the end,";
- mes "my grandfather hid the gem";
- mes "someplace safe...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "However, the threat of the";
- mes "gem still exists. Grandfather";
- mes "and my father worked for";
- mes "years to find a way to seal";
- mes "its darkness. Only now have I";
- mes "been able to create a bracelet to";
- mes "seal its evil power.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "For my grandfather and his";
- mes "friends to truly rest in peace,";
- mes "I must find an adventurer of";
- mes "pure heart who can find the";
- mes "gem and bring it to me so that";
- mes "I can finally seal its power.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I think... I think you";
- mes "might be the hero that";
- mes "I've been waiting for. Will";
- mes "you help an old man for the";
- mes "sake of all that is good?";
- next;
- menu "Of course, I will.",s_Will,"I'm sorry, but I can't.",-;
-s_AskMuch:
- mes "[Sir Chilias'Tyus]";
- mes "I understand...";
- mes "I know I am asking much";
- mes "of you, and this task is not";
- mes "one to take lightly. However,";
- mes "I believe that you are wholly";
- mes "capable of accomplishing this.";
- set hellion_consideration,1;
- close;
-
-s_Consider:
- mes "[Sir Chilias'Tyus]";
- mes "So have you considered";
- mes "my proposal? I believe that";
- mes "you may be the one who will";
- mes "help me in sealing away the";
- mes "Hellion gem's evil forever.";
- next;
- menu "I will help you.",-,"...Sorry about that.",s_AskMuch;
-
- set hellion_consideration,0;
-s_Will:
- mes "[Sir Chilias'Tyus]";
- mes "Good good, but first";
- mes "I must test to see if you";
- mes "are worthy of holding the";
- mes "Hellion's gem. I can't tell";
- mes "you exacrlt where it is, but";
- mes "I will give you some clues.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "First, speak to Clanux";
- mes "Heffron in Prontera. He";
- mes "has offered to help me find";
- mes "the gem, but I do not know if";
- mes "I can trust him. Please help";
- mes "me protect this world from the gem...";
- set HELLIONQ,1;
- close;
-
-s_Seek:
- mes "[Sir Chilias'Tyus]";
- mes "Please seek out";
- mes "Clanux Heffron in";
- mes "Prontera. He may have";
- mes "information regarding a";
- mes "clue leading to the Hellion";
- mes "gem. Good luck to you.";
- close;
-
-s_Veggie:
- mes "^3151FFAs you told Chilias about";
- mes "the strange message you";
- mes "found inside the training";
- mes "dummy he starts to mumble";
- mes "something nobody could";
- mes "possibly understand.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Ok, I think I know what";
- mes "this clue means. Go find";
- mes "this Veggie Lady, wherever";
- mes "she might be. Then take";
- mes "9 steps North and then";
- mes "3 steps to the west.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I'm still clueless";
- mes "about the \"BINGO\" part.";
- mes "I'm sorry but I can't help";
- mes "you with that, you'll have";
- mes "to figure it out on your own.";
- close;
-
-s_Payon:
- mes "[Sir Chilias'Tyus]";
- mes "Ah, yes! This is one piece";
- mes "of the table that will lead";
- mes "you to the Hellion's gem!";
- mes "This engraving was definitely";
- mes "made by my grandfather, and";
- mes "Christopher was one of his friends.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I suppose he hid these pieces";
- mes "in the places that reminded him";
- mes "of his friends. Now according";
- mes "to the tablet's message, you";
- mes "should find the next piece";
- mes "in \"the city of thickest forest\"";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I'm sure that the";
- mes "next tablet piece is";
- mes "in Payon, so go there";
- mes "and see if you can find";
- mes "it. Good luck to you,";
- mes "kind adventurer.";
- set HELLIONQ,9;
- close;
-
-s_Grout:
- mes "[Sir Chilias'Tyus]";
- mes "Now that I think about";
- mes "it, there's a guy in Payon";
- mes "that I know named Grout'the";
- mes "Tuccok who knew my grandfather.";
- mes "He might know something, but";
- mes "he's a little, well... Hmm...";
- close;
-
-s_Morroc:
- mes "[Sir Chilias'Tyus]";
- mes "While you were gone,";
- mes "I felt a little bad that you";
- mes "were searching for the";
- mes "tablet pieces on your own,";
- mes "so I managed to find this";
- mes "piece here in Morroc. But...";
- next;
- mes "[Sir Chilias'Tyus]";
- specialeffect 313;
- specialeffect2 313;
- mes "Why are they glowing like";
- mes "this? In any case, we have";
- mes "this piece I found here in";
- mes "Morroc, and the pieces you";
- mes "found in Prontera and Payon.";
- mes "There's one more left in Geffen.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Anyway, on the last tablet";
- mes "piece that I found, it";
- mes "says \"Hakim loved magic,";
- mes "and always enjoyed its";
- mes "wondrous city\", so I'm sure";
- mes "the last piece is in Geffen.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Please take this third";
- mes "tablet piece and find the";
- mes "final piece so that we can";
- mes "fulfill my dear grandfather's";
- mes "greatest wish and forever";
- mes "seal away the Hellion's gem.";
- getitem 7335,1; //Morroc Tablet
- set HELLIONQ,19;
- next;
- mes "[Sir Chilias'Tyus]";
- mes "When you get back to Geffen,";
- mes "please speak to Welshyun,";
- mes "who's been helping me in";
- mes "creating a device to seal the";
- mes "gem's darkness. He is";
- mes "worthy of trust and";
- mes "will surely help us.";
- close;
-
-s_Welshyun:
- mes "[Sir Chilias'Tyus]";
- mes "Please visit the";
- mes "sage named Welshyun";
- mes "in Geffen. We are good";
- mes "friends, so I am sure";
- mes "that you can trust him.";
- close;
-
-s_Four:
- mes "[Sir Chilias'Tyus]";
- mes "You have all four";
- mes "pieces of the tablet?";
- mes "That's great news! Ah,";
- mes "and the gem is embedded";
- mes "in each of the tablet pieces.";
- mes "We're so close to finishing!";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Ah, would you go back";
- mes "to Welshyun? I know it's";
- mes "a hassle, but he is probably";
- mes "the only one who can combine";
- mes "the tablet pieces into their";
- mes "complete form. Thank you...";
- set HELLIONQ,25;
- close;
-
-s_Completion:
- mes "[Sir Chilias'Tyus]";
- mes "Ah, would you go back";
- mes "to Welshyun? I know it's";
- mes "a hassle, but he is probably";
- mes "the only one who can combine";
- mes "the tablet pieces into their";
- mes "complete form. Thank you...";
- close;
-
-s_Tablet:
- mes "[Sir Chilias'Tyus]";
- mes "At long last. We have";
- mes "everything. The Tablet";
- mes "and the Hellion's gem.";
- mes "Now I can finally use";
- mes "this bracelet to seal";
- mes "its power forever...";
- next;
- if(countitem(7337))goto s_HellionEye;
- specialeffect 12;
- mes "[Sir Chilias'Tyus]";
- mes "Darkness that writhes,";
- mes "souls lost in the inferno,";
- mes "I offer you comfort, I offer";
- mes "you peace. To the despairing";
- mes "ones, to the shameless ones,";
- mes "I give guidance to heaven...";
- next;
- specialeffect 58;
- mes "[Sir Chilias'Tyus]";
- mes "Instead of sadness,";
- mes "let there be joy. Instead";
- mes "of anger, let there be";
- mes "love. Souls that are";
- mes "lost will now find";
- mes "their way...";
- next;
- specialeffect 83;
- mes "[Sir Chilias'Tyus]";
- mes "Light and hope...";
- mes "Heaven and earth...";
- mes "Cast away the darkness.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I did it.";
- mes "After all these";
- mes "long years I finally did";
- mes "it. Thanks to you help.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Please take this";
- mes "Nile Rose, which will";
- mes "keep the power of the gem";
- mes "in check. I trust that you will";
- mes "keep its secret and protect it";
- mes "from those motivated by greed.";
- delitem 7332,1; //Complete Tablet
- getitem 2658,1; //Nile Rose
- set BaseExp,BaseExp+1000000;
- set HELLIONQ,27;
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Thank you, kind";
- mes "adventurer, for bringing";
- mes "peace to my grandfather's";
- mes "soul and for working to";
- mes "protect peace in our world.";
- mes "You are the truest of heroes.";
- close;
-
-s_HellionEye:
- mes "[Sir Chilias'Tyus]";
- mes "But your eyes...";
- mes "They seem so tired";
- mes "and I can sense some";
- mes "sort of pain from them.";
- mes "Did something happen?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I learned the secret of";
- mes "the Hellion's gem. It...";
- mes "It turns people into";
- mes "Hellion Revenants.";
- mes "it's what happened";
- mes "to your grandfather...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "What...";
- mes "What did you just say?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "The tablet had a map that";
- mes "let me to the chamber where";
- mes "your grandfather locked himself";
- mes "up before he completed turning";
- mes "into the Hellion Revenant.";
- mes "It was horrible...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "At the entrance, he";
- mes "left a message that said";
- mes "that he wanted to be killed.";
- mes "So that he could finally join";
- mes "his friends instead of living";
- mes "as a monster. So I... So I...";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "It's okay. I know you";
- mes "did the right thing. It's";
- mes "what my grandfather";
- mes "would have wanted most.";
- mes "Thank you for finally freeing";
- mes "his soul and giving him peace.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Here, I think you";
- mes "should have this Eye";
- mes "of Hellion, in case you";
- mes "wanted a memento of";
- mes "your dear grandfather.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I'd appreciate that.";
- mes "Grandfather's eye...";
- mes "It's full of the painful";
- mes "experiences of the people";
- mes "who were turned into Hellion";
- mes "Revenants against their will.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "But... Now is not the";
- mes "time for sentiment. For";
- mes "sake of my grandfather,";
- mes "I must seal the power of";
- mes "the Hellion's gem now!";
- next;
- specialeffect 12;
- mes "[Sir Chilias'Tyus]";
- mes "Darkness that writhes,";
- mes "souls lost in the inferno,";
- mes "I offer you comfort, I offer";
- mes "you peace. To the despairing";
- mes "ones, to the shameless ones,";
- mes "I give guidance to heaven...";
- next;
- specialeffect 58;
- mes "[Sir Chilias'Tyus]";
- mes "Instead of sadness,";
- mes "let there be joy. Instead";
- mes "of anger, let there be";
- mes "love. Souls that are";
- mes "lost will now find";
- mes "their way...";
- next;
- specialeffect 83;
- mes "[Sir Chilias'Tyus]";
- mes "Light and hope...";
- mes "Heaven and earth...";
- mes "Cast away the darkness.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "I did it.";
- mes "After all these";
- mes "long years I finally did";
- mes "it. Thanks to you help.";
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Please take this";
- mes "Nile Rose, which will";
- mes "keep the power of the gem";
- mes "in check. I trust that you will";
- mes "keep its secret and protect it";
- mes "from those motivated by greed.";
- delitem 7332,1; //Complete Tablet
- delitem 7337,1; //Eye of Hellion
- getitem 2658,1; //Nile Rose
- getitem 603,1; //Old Blue Box
- set BaseExp,BaseExp+1200000;
- set HELLIONQ,27;
- next;
- mes "[Sir Chilias'Tyus]";
- mes "Thank you, kind";
- mes "adventurer, for bringing";
- mes "peace to my grandfather's";
- mes "soul and for working to";
- mes "protect peace in our world.";
- mes "You are the truest of heroes.";
- next;
- mes "^3151FFYou have received the";
- mes "Nile Rose in which the";
- mes "Hellion's gem is sealed.";
- mes "The Eye of the Hellion has";
- mes "granted you some experience";
- mes "through its strange powers.";
- close;
-
-s_Last:
- mes "[Sir Chilias'Tyus]";
- mes "Long time no see. So, are you doing";
- mes "well to keep the promise with me?";
- mes "Please handle it with care";
- mes "to prevent the evil power within";
- mes "from being released.";
- close;
-
-OnTouch:
- if(HELLIONQ != 18)end;
- specialeffect 313;
- specialeffect2 313;
- mes "^3151FFOne of the Table Pieces";
- mes "that you have is beginning to";
- mes "shine with light, as if it were";
- mes "responding to something...";
- close;
-
-}
-
-gef_fild09.gat,296,59,1 script Hidden Cave#HellionCave 111,{
-
- if(!countitem(7332))goto s_NoTablet;
- mes "^3151FFAmongst the wild bushes";
- mes "and overgrown grass, you";
- mes "see a large rock slab that";
- mes "resembles a door. As you";
- mes "come closer, you can see a";
- mes "groove on the rock's surface.";
- next;
- menu "Insert the Tablet.",s_Insert,"Ignore",-;
-
- mes "^3151FFYou do nothing.";
- mes "And nothing happens.";
- close;
-
-s_Insert:
- mes "^3151FFYou insert the tablet into";
- mes "the rock's groove and the";
- mes "Hellion's gem begins to hum";
- mes "and glow. The rock slides open,";
- mes "revealing an engraved message";
- mes "on the ground for you to read.";
- next;
- mes "^7151FF\"To you who have found this";
- mes "place, I reveal the truth about";
- mes "the Hellion Revenant. It was";
- mes "never a devil, like we";
- mes "believed, but a human being";
- mes "slowly corrupted by the";
- mes "darkness of the Hellion's";
- mes "gem.\"";
- next;
- mes "^7151FF\"I learned this horrible";
- mes "truth too late. Already,";
- mes "I can feel the darkness";
- mes "welling up within me.";
- mes "It is all I can do to trap";
- mes "myself in this chamber";
- mes "before I lose all reason.\"";
- next;
- mes "^7151FF\"I failed an it's too";
- mes "late for me, but I hope";
- mes "someone in the future";
- mes "can seal the Hellion gem's";
- mes "dark power. And I hope that";
- mes "someone will grant me the";
- mes "sweet release I crave...\"";
- next;
- mes "^7151FF\"Brave hero, I beg of";
- mes "you. Please kill me and";
- mes "bring salvation to my soul.";
- mes "Please release me so that";
- mes "I can finally join my friends.\"";
- mes " ";
- mes " -Tyus";
- close2;
- warp "gef_dun03.gat",140,119;
- end;
-
-s_NoTablet:
- mes "^3151FFAmongst the wild bushes";
- mes "and overgrown grass, you";
- mes "see a large rock slab that";
- mes "resembles a door. But it";
- mes "seems it is sealed by a";
- mes "strong force so you're";
- mes "unable to open it.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= The Eye of Hellion Quest.
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena SVN 3422+(Requires jA Script System)
+//===== Description: =========================================
+//= Quest for getting a Nile Rose
+//===== Comments: ============================================
+//=
+//===== Additional Comments: =================================
+//= 1.0 First version [MasterOfMuppets]
+//============================================================
+
+geffen.gat,110,200,3 script Sage Welshyun 754,2,2,{
+
+ if(HELLIONQ > 25)goto s_Last;
+ if(HELLIONQ > 18)goto s_Switches;
+ mes "[Welshyun]";
+ mes "Hm? Oh, pardon me.";
+ mes "I didn't notice you. I was";
+ mes "far too occupied thinking";
+ mes "deep important thoughts";
+ mes "that your puny little mind";
+ mes "couldn't possible fathom.";
+ close;
+
+s_Last:
+ mes "[Welshyun]";
+ mes "So, were you able";
+ mes "to deliver the tablet";
+ mes "and the Hellion's gem to";
+ mes "Chilias safely? Ah, and";
+ mes "how has my friend been?";
+ close;
+
+s_Switches:
+ switch(HELLIONQ)
+ {
+
+ case 19:
+ if(HELLIONQ3)goto s_Thirsty;
+ specialeffect 313;
+ specialeffect2 313;
+ mes "[Welshyun]";
+ mes "That...";
+ mes "That eerie glow...";
+ next;
+ mes "[Welshyun]";
+ mes "You! Identify yourself";
+ mes "and explain how you came";
+ mes "about to get those tablet";
+ mes "pieces! Now answer me!";
+ next;
+ mes "[Welshyun]";
+ mes "Ah, forgive me. You're";
+ mes "helping Chilias, are you?";
+ mes "I see. So you must be here";
+ mes "to seek my help in finding";
+ mes "the final piece, am I correct?";
+ next;
+ menu "Shut up, I know you have it, so give it!",s_Shut,"Yes, please help me.",-;
+
+ mes "[Welshyun]";
+ mes "Ah, yes... I shall help";
+ mes "you get the final tablet";
+ mes "piece, but first you'll have";
+ mes "to do a favor for me.";
+ next;
+ mes "[Welshyun]";
+ mes "My student in the Geffen";
+ mes "Tower has not reported back to";
+ mes "about his research project,";
+ mes "so I would like for you to find";
+ mes "him and retrieve the report";
+ mes "for me. Not a big deal, right?";
+ next;
+ mes "[Welshyun]";
+ mes "The title of his report";
+ mes "should be, \"^7151FFMonster Life";
+ mes "in the Geffen Area^000000\", so";
+ mes "please remember that.";
+ mes "Ah, and my student's";
+ mes "name is Enoz.";
+ set HELLIONQ,20;
+ close;
+
+ s_Shut:
+ mes "[Welshyun]";
+ mes "Such insolence!";
+ mes "Huh. I suppose Chilias";
+ mes "may have misjudged you";
+ mes "when he entrusted you with";
+ mes "this important mission. Huh.";
+ mes "A reevaluation is in order...";
+ set HELLIONQ3,1;
+ close;
+
+ s_Thirsty:
+ if(countitem(504))goto s_Thirsty2;
+ mes "[Welshyun]";
+ mes "^111111*Ahem*^000000 Oh dear me...";
+ mes "I'm unfathombly thirsty...";
+ mes "There's no way I can do any";
+ mes "serious thinking with such";
+ mes "a dry, parched throat...";
+ close;
+
+ s_Thirsty2:
+ mes "[Welshyun]";
+ mes "Oh, a White Potion?";
+ mes "Yes, may I please have";
+ mes "one? Ahh, most refreshing~";
+ mes "You may not be such a bad";
+ mes "person after all! Now";
+ mes "Shall I help you find";
+ mes "that tablet piece?";
+ next;
+ mes "[Welshyun]";
+ mes "Of course, in the";
+ mes "interest of mankind,";
+ mes "I shall help you. But first,";
+ mes "I have a favor to ask of you.";
+ next;
+ mes "[Welshyun]";
+ mes "My student in the Geffen";
+ mes "Tower has not reported back to";
+ mes "about his research project,";
+ mes "so I would like for you to find";
+ mes "him and retrieve the report";
+ mes "for me. Not a big deal, right?";
+ next;
+ mes "[Welshyun]";
+ mes "The title of his report";
+ mes "should be, \"^7151FFMonster Life";
+ mes "in the Geffen Area^000000\", so";
+ mes "please remember that.";
+ mes "Ah, and my student's";
+ mes "name is Enoz.";
+ delitem 504,1; //White potion
+ set HELLIONQ3,0;
+ set HELLIONQ,20;
+ close;
+ break;
+
+ case 20:
+ mes "[Welshyun]";
+ mes "Please bring me the";
+ mes "report entitled, \"^7151FFMonster Life";
+ mes "in the Geffen Area^000000\",";
+ mes "from my student Enoz in";
+ mes "the Geffen Tower. Thank";
+ mes "you, I appreciate your help.";
+ close;
+ break;
+
+ case 21:
+ mes "[Welshyun]";
+ mes "Hm? What's that strange";
+ mes "expression on your face?";
+ mes "Prank? Oh please. Such";
+ mes "chicanery is beneath me...";
+ mes "But even if I did play a";
+ mes "joke, believe me. It";
+ mes "builds character.";
+ next;
+ mes "[Welshyun]";
+ mes "First and foremost,";
+ mes "I want yo test you to see";
+ mes "if you are worthy of this";
+ mes "tablet piece. I want to see";
+ mes "for myself if you are a person";
+ mes "of honor. Someone of character.";
+ next;
+ mes "[Welshyun]";
+ mes "Oh yes, I accidentally";
+ mes "took this Master Science";
+ mes "Reference Book from Enoz,";
+ mes "so would you please return it";
+ mes "to him for me? Oh, and please";
+ mes "bring back 1 Blue Gemstone.";
+ next;
+ mes "^3151FFYou received the";
+ mes "incredibly heavy tome,";
+ mes "the the Master Science";
+ mes "Reference Book.";
+ set HELLIONQ,22;
+ close;
+ break;
+
+ case 22:
+ mes "[Welshyun]";
+ mes "Please deliver the Master";
+ mes "Science Reference Book to";
+ mes "Enoz, and come back to me";
+ mes "with 1 Blue Gemstone.";
+ close;
+ break;
+
+ case 23:
+ if(!countitem(717))goto s_NoGem;
+ mes "[Welshyun]";
+ mes "Thank you. You've";
+ mes "brought the book to Enoz";
+ mes "and delivered a Gemstone";
+ mes "to me as I've asked. Now,";
+ mes "there is one final test...";
+ next;
+ mes "[Welshyun]";
+ mes "Answer this question.";
+ mes "Where is the abode of the";
+ mes "departed souls with a shining";
+ mes "silver roof that is mentioned";
+ mes "in the third part of the ballad";
+ mes "of Grimnir? Well, adventurer?";
+ next;
+ input @str$;
+ if(@str$ != "Valaskjalf")goto s_WrongStr;
+ mes "[Welshyun]";
+ mes "Ah, well met, well met.";
+ mes "You are as well learned as";
+ mes "you are brave. As promised,";
+ mes "you may have this piece of";
+ mes "the tablet, which I've";
+ mes "already found. The clues";
+ mes "were too simple...";
+ set HELLIONQ,24;
+ delitem 717,1; //Blue gemstone
+ getitem 7336,1, //Geffen Tablet
+ next;
+ mes "[Welshyun]";
+ mes "Please send my regards";
+ mes "to my dear friend, Chilias,";
+ mes "who has dedicated his life";
+ mes "to sealing the evil within";
+ mes "the Hellion's gem.";
+ close;
+
+ s_WrongStr:
+ mes "[Welshyun]";
+ mes "Bwahahaah! Only";
+ mes " a superior mind could";
+ mes "know the answer to such";
+ mes "a question! Go forth and";
+ mes "learn the answer, else";
+ mes "I cannot help you, adventurer~";
+ close;
+
+ s_NoGem:
+ mes "[Welshyun]";
+ mes "Ah, I've heard that";
+ mes "Enoz received the Master";
+ mes "Science Reference Book";
+ mes "from you. But did you remember";
+ mes "to bring me a Blue Gemstone?";
+ close;
+ break;
+
+ case 24:
+ mes "[Welshyun]";
+ mes "Hm. You should visit";
+ mes "Chilias and determine";
+ mes "your next course of action,";
+ mes "now that you have all four";
+ mes "of the pieces of the tablet.";
+ close;
+ break;
+
+ case 25:
+ mes "[Welshyun]";
+ mes "Hm? Did you need";
+ mes "me to combine all four";
+ mes "pieces of the tabled and";
+ mes "make it whole again? Oh.";
+ mes "All this time I thought you";
+ mes "knew how to do it. Alright.";
+ next;
+ mes "[Welshyun]";
+ mes "As a matter of fact,";
+ mes "I was planning on using";
+ mes "the Blue Gemstone you gave";
+ mes "me to do this. But since you";
+ mes "never really asked... In any";
+ mes "case, let me concentrate.";
+ next;
+ specialeffect 54;
+ mes "[Welshyun]";
+ mes "Shadows remembered by time.";
+ mes "Help me retrieve the forgotten";
+ mes "stories that have been";
+ mes "scattered in the wind.";
+ mes "Right here. Right now.";
+ next;
+ specialeffect 72;
+ mes "[Welshyun]";
+ mes "...";
+ mes "Okay...";
+ mes "That was tough.";
+ next;
+ mes "[Welshyun]";
+ mes "Here's the";
+ mes "complete tablet.";
+ mes "Please bring this";
+ mes "safely back to Chilias.";
+ getitem 7332,1; //Complete Tablet
+ delitem 7333,1; //Prontera Tablet
+ delitem 7334,1; //Payon Tablet
+ delitem 7335,1; //Morroc Tablet
+ delitem 7336,1; //Geffen Tablet
+ set HELLIONQ,26;
+ next;
+ mes "[Welshyun]";
+ mes "Wait, take a look!";
+ mes "There's a map on the back";
+ mes "of the tablet. Although the gem";
+ mes "is already embedded within the";
+ mes "tablet, who knows where this";
+ mes "map may lead? Perhaps";
+ mes "Hellion Revenant?";
+ next;
+ mes "[Welshyun]";
+ mes "I don't know if Chilias";
+ mes "told you, but the name of";
+ mes "the monster that guards and";
+ mes "follows this gem is Hellion";
+ mes "Revenant. But why mark its";
+ mes "location on this tablet?";
+ next;
+ mes "[Welshyun]";
+ mes "Well, it will be dangerous, but";
+ mes "I'm sure that you're strong enough";
+ mes "to confront this monster. I";
+ mes "believe it was the wish of this";
+ mes "tablet's creator for someone";
+ mes "to defeat the Hellion Revenant.";
+ next;
+ menu "Alright I'll do it!",s_DoIt,"I better get this tablet to Chilias...",-;
+
+ mes "[Welshyun]";
+ mes "Yes, that's true.";
+ mes "Chilias has been waiting";
+ mes "his whole life to seal this";
+ mes "gem. Plus, who knows what";
+ mes "may happen while it is in";
+ mes "your possession?";
+ set HELLIONQ,26;
+ close;
+
+ s_DoIt:
+ mes "[Welshyun]";
+ mes "Well, I'm almost certain";
+ mes "this map will lead you to";
+ mes "Hellion Revenant. Let me";
+ mes "warp you to the location";
+ mes "marked on the tablet's map...";
+ close2;
+ warp "gef_fild09.gat",368,88;
+ set HELLIONQ,26;
+ end;
+ break;
+
+ }
+
+OnTouch:
+ if(HELLIONQ != 19)end;
+ specialeffect 313;
+ specialeffect2 313;
+ mes "^3151FFThe piece of tablet";
+ mes "that you have is shining";
+ mes "with light as if in response";
+ mes "to something in the area.";
+ close;
+
+}
+
+prontera.gat,269,326,3 script Clanux Heffron 50,{
+
+ if(HELLIONQ > 7)goto s_Last;
+ if(HELLIONQ)goto s_Switches;
+ mes "[Clanux Heffron]";
+ mes "What's wrong with";
+ mes "this map?! I can't";
+ mes "find a blasted thing";
+ mes "on it! How can finding";
+ mes "something be so hard?";
+ close;
+
+s_Last:
+ mes "[Clanux Heffron]";
+ mes "Oh hey, it's you.";
+ mes "Listen I got this number";
+ mes "pad to pop out of that old";
+ mes "machine in the Tool Shop,";
+ mes "I still don't know what the";
+ mes "password for it might be.";
+ next;
+ mes "[Clanux Heffron]";
+ mes "If I couldn't figure";
+ mes "it out, and I understand";
+ mes "if you couldn't figure this";
+ mes "out, then this puzzle must";
+ mes "be freakin' impossible!";
+ close;
+
+s_Switches:
+ switch(HELLIONQ)
+ {
+
+ case 1:
+ if(HELLIONQ2)goto s_Bother;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Excuse me, but are";
+ mes "you Clanux Heffron?";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Why, who are you";
+ mes "and what the heck";
+ mes "do you want? Oh...";
+ mes "Sent by Chilias, eh?";
+ mes "What does he want?";
+ next;
+ menu "He wants me to help you",s_You,"He wants you to help me.",-;
+
+ mes "[Clanux Heffron]";
+ mes "Help you...? What, with";
+ mes "clues to the location of";
+ mes "the Hellion's gem? Screw";
+ mes "that, pal! Why should I help";
+ mes "you if we're gonna compete";
+ mes "for the same prize?!";
+ set HELLIONQ2,1;
+ close;
+
+ s_Bother:
+ mes "[Clanux Heffron]";
+ mes "Hey, why do you keep";
+ mes "botherin' me?! Go and";
+ mes "find your own clues for the";
+ mes "Hellion's gem on your own,";
+ mes "jerkface! Now getouttahere!";
+ next;
+ menu "W-what! Let's work together!",s_Work,"Fine. I don't need your help!",-;
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "Fine.";
+ mes "I don't need";
+ mes "your help!";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Yeah right!";
+ mes "You'll be back!";
+ mes "...They always";
+ mes "come back.";
+ close;
+
+ s_Work:
+ mes "[Clanux Heffron]";
+ mes "Work together, eh? You";
+ mes "know, normally I'd tell you";
+ mes "to make like a moonwalker";
+ mes "and just beat it, but I gotta";
+ mes "admit that I ain't doin' so";
+ mes "good on my own on this...";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Alright, fine.";
+ mes "First, look through the";
+ mes "old Swordman Training";
+ mes "Grounds here in Prontera.";
+ mes "There might be some clues";
+ mes "left over there for you to";
+ mes "find.";
+ set HELLIONQ2,0;
+ set HELLIONQ,2;
+ close;
+
+ s_You:
+ mes "[Clanux Heffron]";
+ mes "So he sent me an";
+ mes "assistant, huh? Well...";
+ mes "Seeing as he gave me this";
+ mes "clue and I've taken so long";
+ mes "and still don't have anything";
+ mes "to show for it, I don't blame him.";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Well, if he sent you to";
+ mes "help me out, I guess I can";
+ mes "tell you everything. For the";
+ mes "clues he had me look for,";
+ mes "I've only found two so far.";
+ mes "But I can't figure them out...";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Let's see, there's this";
+ mes "broken sword and this";
+ mes "strange lookin' cogwheel.";
+ mes "What do these clues mean?!";
+ mes "Did the old man give you";
+ mes "any hints to help me out?";
+ next;
+ menu "Where did you find these?",-,"No I'm sorry.",s_Sorry;
+ //Custom dialog
+ mes "[Clanux Heffron]";
+ mes "I found them next to a";
+ mes "broken training dummy";
+ mes "in the old Swordman";
+ mes "Training Grounds here";
+ mes "in Prontera.";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Why don't you go search";
+ mes "the old Swordman Training";
+ mes "Grounds for clues? I might";
+ mes "have missed something...";
+ mes "Not that I think so, but";
+ mes "just in case!";
+ set HELLIONQ,2;
+ close;
+
+s_Sorry:
+ mes "[Clanux Heffron]";
+ mes "Wha--? Then why are";
+ mes "you even here to help";
+ mes "me then? Huh. That old";
+ mes "coot must not trust me";
+ mes "enough, but I can't exactly";
+ mes "blame him. Alright then...";
+ next;
+ mes "[Clanux Heffron]";
+ mes "If you're gonna help me,";
+ mes "go search the old Swordman";
+ mes "Training Grounds over here in";
+ mes "Prontera. I doubt it, but there's";
+ mes "a chance I mighta missed";
+ mes "something there. Get to it!";
+ set HELLIONQ,2;
+ close;
+ break;
+
+ case 2:
+ mes "[Clanux Heffron]";
+ mes "Look pal, I found this broken";
+ mes "sword, a bonafide clue if I";
+ mes "ever saw one, in the old";
+ mes "Swordman Training Grounds in";
+ mes "Prontera. You should be able to";
+ mes "find something else there, maybe.";
+ close;
+ break;
+
+ case 3:
+ mes "[Clanux Heffron]";
+ mes "Hey, you're done";
+ mes "searching? Were you";
+ mes "able to find anything?";
+ next;
+ menu "Nothing...",s_Nothing,"In fact, I found this.",-;
+
+ mes "[Clanux Heffron]";
+ mes "Wha--? I had no idea";
+ mes "that sort of thing could";
+ mes "be hidden in that training";
+ mes "ground. I missed it. Oh,";
+ mes "so the Veggie Lady gave you a";
+ mes "password and all?";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Huh, I can't make heads";
+ mes "or tails of that password.";
+ mes "I guess I have no choice but";
+ mes "to give you this, the";
+ mes "cogwheel clue I found";
+ mes "from the Tool Shop.";
+ next;
+ mes "[Clanux Heffron]";
+ mes "I mean, you've been lucky";
+ mes "enough till now, so you'll";
+ mes "probably be able to stumble";
+ mes "upon the answer behind this";
+ mes "weird, weird riddle. But you";
+ mes "gotta tell me the answer too!";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Alright, now take your";
+ mes "cogwheel and get outta";
+ mes "here. The sooner you get";
+ mes "that clue, the sooner I'll";
+ mes "get that Hellion's gem.";
+ set HELLIONQ,4;
+ getitem 7093,1; //Cogwheel
+ close;
+
+ s_Nothing:
+ mes "[" + strcharinfo(0) + "]";
+ mes "^111111(This guy's a real punk!";
+ mes "I better not share any new";
+ mes "information I've found, just";
+ mes "in case he doesn't already";
+ mes "know about it.)";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I... I wasn't able to";
+ mes "find anything that looked";
+ mes "like a clue. I'm sorry, but";
+ mes "I let you down big time...";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Aw nuts! Alright, if you";
+ mes "go back to the old man, let";
+ mes "him know that I found a broken";
+ mes "sword from the old Swordman";
+ mes "Training Grounds and this";
+ mes "cogwheel from the Tool Shop.";
+ next;
+ mes "[Clanux Heffron]";
+ mes "The clues I've found so";
+ mes "far don't make any sense!";
+ mes "So if you can, convince him to";
+ mes "drop me a couple more hints.";
+ mes "And give this to the old guy";
+ mes "to prove I found it, will you?";
+ next;
+ mes "[Clanux Heffron]";
+ mes "That's all I know.";
+ mes "At this point you're";
+ mes "probably better off";
+ mes "searching for these";
+ mes "clues on your own...";
+ getitem 7093,1; //Cogwheel
+ set HELLIONQ,4;
+ close;
+ break;
+
+ case 4:
+ case 5:
+ case 6:
+ mes "[Clanux Heffron]";
+ mes "Hey... Didn't I tell";
+ mes "you to check out the";
+ mes "Tool Shop in case there";
+ mes "was anything I missed?";
+ mes "Now go! That's an order!";
+ close;
+ break;
+
+ case 7:
+ mes "[Clanux Heffron]";
+ mes "Hey, so you have";
+ mes "anything new to report?";
+ mes "Oh, and did you learn";
+ mes "anything from that weird";
+ mes "maching in the Tool Shop?";
+ next;
+ menu "Tell him just a little bit.",s_Bit,"Don't tell him",-;
+
+ s_Bit:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well, I put that cogwheel";
+ mes "into that weird machine in";
+ mes "the Tool Shop and some kind";
+ mes "of number pad came out. Then...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "^111111(Wait, I can't trust this";
+ mes "guy!)^000000 I put in every single";
+ mes "password that I could think";
+ mes "of, but nothing happened!";
+ mes "I think I'm stuck...";
+ next;
+ mes "[Clanux Heffron]";
+ mes "Oh yeah? Hah! Well, now";
+ mes "that the easy part is";
+ mes "done, I'll just figure out";
+ mes "that secret password";
+ mes "myself! Hahahah! That Hellion's";
+ mes "gem is as good as mine!";
+ set HELLIONQ,8;
+ close;
+ break;
+
+ }
+
+}
+
+prontera.gat,224,84,1 script Training Dummy#HellionDummy 111,{
+
+ if(HELLIONQ == 2)goto s_Hellion;
+ mes "^3151FFIt's a training dummy";
+ mes "that was used to hone the";
+ mes "skills of new Swordmen...";
+ mes "But the Swordman Training";
+ mes "Grounds have moved to Izlude.";
+ close;
+
+s_Hellion:
+ mes "^3151FFIt's a training dummy";
+ mes "with a gash in its body";
+ mes "that looks like it was made";
+ mes "by the thrust of a sharp sword.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Didn't Clanux mention that he";
+ mes "found a broken sword around";
+ mes "here? Maybe this was exactly";
+ mes "where he found it. Let's see...";
+ next;
+ menu "Inspect the dummy's gash",-;
+
+ mes "^3151FFInside of the dummy's body is";
+ mes "a steel bearing with a roughly";
+ mes "etched message that reads:";
+ mes "^7151FF\"Veggie Lady N9 W3 BINGO.\"";
+ next;
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "What the heck does this";
+ mes "even mean? A Veggie Lady?";
+ mes "Does Clanux know anything";
+ mes "at all about this clue...?";
+ set HELLIONQ,3;
+ close;
+
+}
+
+prt_in.gat,128,79,0 script Unknown Machine#HellionMchn 111,{
+ if(HELLIONQ == 6)goto s_Input2;
+ if(HELLIONQ == 5)goto s_Input;
+ mes "^3151FFIt's some sort of";
+ mes "strange looking machine";
+ mes "with a mysterious purpose.";
+ close;
+
+s_Input:
+ mes "^3151FFIt's a weird looking";
+ mes "machine that looks like";
+ mes "it hasn't been used in a";
+ mes "while. It looks like the";
+ mes "cogwheel that you have";
+ mes "would fit perfectly in it...";
+ next;
+ menu "Insert Cogwheel",s_Insert,"Ignore it.",-;
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "Eh...";
+ mes "Forget it.";
+ close;
+
+s_Insert:
+ if(!countitem(7093))goto s_NoCog;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I just know this";
+ mes "cogwheel will fit";
+ mes "into this machine!";
+ mes "What I don't know is";
+ mes "what will happen once";
+ mes "this machine works...";
+ next;
+ mes "^3151FF*Click...!*";
+ mes "Once the cogwheel is";
+ mes "fit into the machine and";
+ mes "turned, the device hums";
+ mes "to life and a panel opens,";
+ mes "revealing a numeric keypad.";
+ delitem 7093,1; //Cogwheel
+ set HELLIONQ,6;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I guess that I've got";
+ mes "to input some kind of";
+ mes "numeric password...";
+ mes "Ah, right, the numbers";
+ mes "that Veggie Lady gave me!";
+ next;
+ input @temp;
+ if(@temp != 16754213)goto s_FailInp;
+s_CorrectInput:
+ mes "^3151FFThe machine responds to";
+ mes "the password with a pleasant";
+ mes "chime, confirming that you've";
+ mes "input the correct numbers.";
+ mes "The keypad slides open to";
+ mes "reveal a piece of a tablet.";
+ getitem 7333,1; //Prontera Tablet
+ set HELLIONQ,7;
+ next;
+ mes "^3151FFThe message engraved on";
+ mes "this table reads: \"This is for";
+ mes "Christopher, my dear friend who";
+ mes "I met in Prontera. To the one";
+ mes "who finds this, please seek";
+ mes "out the next piece of this tablet";
+ mes "in the city of thickest forest.\"";
+ next;
+ mes "^3151FFThe message is signed";
+ mes "by someone named Tyus.";
+ mes "It would be best to bring";
+ mes "this back to Sir Chilia'Tyus";
+ mes "and confirm that this was";
+ mes "made by his grandfater...";
+ close;
+
+s_Input2:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Okay, let me see";
+ mes "if I can enter the";
+ mes "right number this time...";
+ next;
+ input @temp;
+ if(@temp == 16754213)goto s_CorrectInput;
+
+s_FailInp:
+ mes "^3151FFThe machine responds to";
+ mes "the passwords with an abrupt,";
+ mes "screeching beep and the entire";
+ mes "machine shuts down. You'll";
+ mes "have to try entering the";
+ mes "password again.";
+ close;
+
+s_NoCog:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Hmm, I can't find the";
+ mes "cogwheel, now where did";
+ mes "I put it?";
+ close;
+
+}
+
+prontera.gat,45,67,1 script #HellionActivator 139,0,0,{
+OnTouch:
+ if(HELLIONQ != 4)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well, according to the";
+ mes "message in that old training";
+ mes "dummy, this is where I'm";
+ mes "supposed to go. Nine steps";
+ mes "north, 3 steps west. And now...";
+ mes "Veggie Lady. Okay, okay...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Huh. That's creepy.";
+ mes "There's one right there";
+ mes "staring at me. But after";
+ mes "the words \"Veggie Lady\"";
+ mes "all the message says is, um,";
+ mes "what was that last word again?";
+ next;
+ input @tempstr$;
+ if(@tempstr$ != "BINGO")goto s_Failstr;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Of course!";
+ mes "\"BINGO!\" But";
+ mes "I don't see a hall";
+ mes "full of old people";
+ mes "around here, I--";
+ next;
+ mes "[Veggie Lady]";
+ mes "Finall, you say it.";
+ mes "Yessh, I thought I was";
+ mes "going to wait forever for";
+ mes "somebody to say that";
+ mes "password. Okay, here's";
+ mes "the code number you want...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "C-code number?";
+ mes "Wait, wh-what...?";
+ next;
+ mes "[Veggie Lady]";
+ mes "Awww...I don't know!";
+ mes "I'm only gonna say it";
+ mes "now: ^7151FF16754213^000000. One";
+ mes "more time, in case you";
+ mes "didn't get it: ^7151FF16754213^000000.";
+ mes "Don't forget it, adventurer.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Wait... What does";
+ mes "this all mean? Won't";
+ mes "you tell me more?";
+ next;
+ mes "[Veggie Lady]";
+ mes "No. I've been given";
+ mes "explicit instructions";
+ mes "to not tell you more.";
+ mes "In face, I hate talking.";
+ mes "That's why I sell vegetables.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Holy cow...";
+ mes "This is all";
+ mes "really cloak and";
+ mes "dagger type stuff!";
+ set HELLIONQ,5;
+ close;
+
+s_Failstr:
+ mes "[" + strcharinfo(0) + "]";
+ mes @tempstr$;
+ mes "Hmmm. No, no that couldn't";
+ mes "be it. What in the world was";
+ mes "that word and why can't I";
+ mes "remember it when I seemingly";
+ mes "need it most?";
+ close;
+
+}
+
+payon.gat,182,132,3 script Grout'he Tuccok 48,{
+
+ if(HELLIONQ > 17)goto s_Final;
+ if(HELLIONQ > 8)goto s_Switches;
+ mes "[Grout'he]";
+ mes "Hey...";
+ mes "Hey you!";
+ mes "What are you";
+ mes "looking at?!";
+ mes "Get outta my";
+ mes "face, ya jerkward.";
+ close;
+
+s_Final:
+ mes "[Grout'he]";
+ mes "Hey, this is great!";
+ mes "you actually found the";
+ mes "next piece of the tablet!";
+ mes "You better take this back";
+ mes "to Chilias'Tyus right now~";
+ next;
+ mes "[Grout'he]";
+ mes "Oh. And um, thanks";
+ mes "for being willing to pay";
+ mes "me in cash for all those";
+ mes "little bitty clues. I won't";
+ mes "forget your help, pal~";
+ close;
+
+s_Switches:
+ switch(HELLIONQ)
+ {
+
+ case 9:
+ mes "[Grout'he]";
+ mes "What...?";
+ mes "You got something";
+ mes "to tell me or are you";
+ mes "just bein' a rude prick";
+ mes "and starting at me like";
+ mes "this is your turf?!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I'm sorry, but well...";
+ mes "Chilias'Tyus told me that";
+ mes "you might know something";
+ mes "about a piece of a table--";
+ next;
+ mes "[Grout'he]";
+ mes "What? Oh, so Chilias'Tyus";
+ mes "is lookin for the gem too eh?";
+ mes "Ooh, that's right. He wants to";
+ mes "seal its evil or something.";
+ mes "Yeah, yeah. That's a good";
+ mes "cause. Real noble and all...";
+ next;
+ mes "[Grout'he]";
+ mes "I'll tell you what. The only reason";
+ mes "I want that gem is to sell it";
+ mes "so I can pay off ally my debts.";
+ mes "But if I sell you the clues I found,";
+ mes "I'll get the zeny I need and the";
+ mes "gem will be in good hands too.";
+ next;
+ mes "[Grout'he]";
+ mes "So what do you say?";
+ mes "It's not a bad deal if";
+ mes "you think about it and";
+ mes "we might as well kill";
+ mes "two birds with one stone...";
+ next;
+ menu "Alright, I'll buy your clues.",s_Buy,"Why the hell should I pay you?!",-;
+
+ mes "[Grout'he]";
+ mes "Why the hell should you";
+ mes "pay me?! Hey, aren't you";
+ mes "looking for the gem to help";
+ mes "the world? Well, I happen to";
+ mes "be a little part of this world,";
+ mes "so why don't you help me first?";
+ next;
+ mes "[Grout'he]";
+ mes "Man, you might not";
+ mes "know it, but the money";
+ mes "you give me will save";
+ mes "a life. My own! Dude, how";
+ mes "can you be so insensitive?";
+ close;
+
+ s_Buy:
+ mes "[Grout'he]";
+ mes "Oh man, thanks a lot.";
+ mes "Alright, all I'm asking";
+ mes "for is 10,000 zeny. You get";
+ mes "my clues and I'll let you know";
+ mes "where I found 'em, in case";
+ mes "you can find something new.";
+ next;
+ if(Zeny < 10000)goto s_NoZeny;
+ set Zeny,Zeny-10000;
+ mes "[Grout'he]";
+ mes "There you go!";
+ mes "Thanks for the cash~";
+ mes "(Know I won't have to";
+ mes "get my knees all broken!)";
+ mes "Oh, and let me makr your";
+ mes "Mini-Map for you real quick...";
+ next;
+ mes "[Grout'he]";
+ mes "You see this here?";
+ mes "It's where I found the";
+ mes "Skirt of Virgin I'm about";
+ mes "to give you. So check that";
+ mes "spot out and see if you find";
+ mes "anything new and interesting.";
+ viewpoint 1,101,191,10,0xFF00FF;
+ next;
+ mes "[Grout'he]";
+ mes "Here you go, pal...";
+ mes "A Stone Heart, Green Herb,";
+ mes "some Grape Juice and one";
+ mes "clean and pure Skirt of Virgin.";
+ mes "If you got any more questions,";
+ mes "I guess you can ask me later~";
+ getitem 953,1;
+ getitem 511,1;
+ getitem 533,1;
+ getitem 1049,1;
+ set HELLIONQ,10;
+ close;
+
+ s_NoZeny:
+ mes "[Grout'he]";
+ mes "Oh hey...";
+ mes "You don't got the zeny.";
+ mes "Sorry pal, but I've really got";
+ mes "to pay my debts somehow.";
+ mes "I don't know if I'm allowed";
+ mes "to reall talk about it...";
+ mes "^111111*Sob*";
+ close;
+ break;
+
+ case 10:
+ mes "[Grout'he]";
+ mes "You see this here?";
+ mes "It's where I found the";
+ mes "Skirt of Virgin I'm about";
+ mes "to give you. So check that";
+ mes "spot out and see if you find";
+ mes "anything new and interesting.";
+ viewpoint 1,101,191,10,0xFF00FF;
+ close;
+ break;
+
+ case 11:
+ mes "[Grout'he]";
+ mes "You've been to the";
+ mes "first location? Good.";
+ mes "Okay, now look over here.";
+ mes "Check your Mini-Map to";
+ mes "see where I found that";
+ mes "Stone Heart, got it?";
+ viewpoint 1,82,109,11,0xFF00FF;
+ close;
+ break;
+
+ case 12:
+ mes "[Grout'he]";
+ mes "Alright, here's where";
+ mes "I found that Green Herb.";
+ mes "You know you can use that";
+ mes "to counter poison, right?";
+ mes "Check that place to see if";
+ mes "there's anything I missed.";
+ viewpoint 1,239,56,12,0xFF00FF;
+ close;
+ break;
+
+ case 13:
+ mes "[Grout'he]";
+ mes "Okay, here's the last";
+ mes "place you should double";
+ mes "check, the place where";
+ mes "I nabbed that Grape";
+ mes "Juice. Good luck~";
+ viewpoint 1,240,161,13,0xFF00FF;
+ close;
+ break;
+
+ case 14:
+ mes "[Grout'he]";
+ mes "Oh, you need some help";
+ mes "with figuring out the clues?";
+ mes "Heh. Alright, let's see.";
+ mes "You want me to help";
+ mes "you in making sense of";
+ mes "this weird riddle?";
+ next;
+ menu "Yes, please!",s_YesP,"No thanks~",-;
+
+ mes "[Grout'he]";
+ mes "Oh yeah?";
+ mes "Well listen, I dunno,";
+ mes "but this looks to be one";
+ mes "of those situations where";
+ mes "two heads are better than one.";
+ mes "I think we oughta team up~";
+ close;
+
+ s_YesP:
+ mes "[Grout'he]";
+ mes "Alright now. All those";
+ mes "messages said stuff about";
+ mes "one sized clothing, dried";
+ mes "fish and green herbs, wine...";
+ mes "Huh. It doesn't make sense.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "What...?";
+ mes "I could have";
+ mes "told you that!";
+ next;
+ mes "[Grout'he]";
+ mes "Wait, wait.";
+ mes "Let's mark all the";
+ mes "clue locations again";
+ mes "on your Mini-Map.";
+ mes "Okay, we've got four";
+ mes "dots around Payon.";
+ viewpoint 1,101,191,10,0xFF00FF;
+ viewpoint 1,82,109,11,0xFF00FF;
+ viewpoint 1,239,56,12,0xFF00FF;
+ viewpoint 1,240,161,13,0xFF00FF;
+ next;
+ mes "[Grout'he]";
+ mes "Alright, now if";
+ mes "I connect and interesect";
+ mes "all the lines, there's";
+ mes "a point in the middle.";
+ mes "Why don't you check";
+ mes "this middle point, eh?";
+ viewpoint 1,159,130,14,0xFF00FF;
+ next;
+ mes "[Grout'he]";
+ mes "Now, this location";
+ mes "is a house, and I know";
+ mes "it's pretty random, but";
+ mes "it's all we got. Heck,";
+ mes "all these clues make";
+ mes "less sense than this!";
+ set HELLIONQ,15;
+ close;
+ break;
+
+ case 15:
+ mes "[Grout'he]";
+ mes "Hey, how's it goin'";
+ mes "looking for that one";
+ mes "piece of the tablet?";
+ mes "It's a lot of trouble,";
+ mes "but I guess that's the";
+ mes "case with all treasures.";
+ viewpoint 1,159,130,14,0xFF00FF;
+ close;
+ break;
+
+ case 16:
+ mes "[Grout'he]";
+ mes "Oh, so all of those";
+ mes "items came in handy?";
+ mes "I don't believe it! So";
+ mes "this puzzle actually";
+ mes "makes sense?! So";
+ mes "what'd the slab say?";
+ next;
+ mes "[Grout'he]";
+ mes "\"Compassionate one?\"";
+ mes "Oh hey, there's a giant";
+ mes "stone statue over in the";
+ mes "Archer Village that fits";
+ mes "the description perfectly!";
+ mes "You should check it out.";
+ set HELLIONQ,17;
+ close;
+ break;
+
+ case 17:
+ mes "[Grout'he]";
+ mes "Hey, you really ought";
+ mes "to check out the huge";
+ mes "stone statue over in the";
+ mes "Archer Village. Now that";
+ mes "I think about it, it's the";
+ mes "perfect hiding place!";
+ close;
+ break;
+
+ }
+
+}
+
+payon.gat,101,191,1 script #HellionStepAct 139,1,1,{
+ if(HELLIONQ != 10)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well, this is where";
+ mes "Grout'he told me to look.";
+ mes "Ooh, there's something";
+ mes "written on the ceiling. Um,";
+ mes "let's see... \"This garment";
+ mes "is one size fits all.\"";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "That's it...?";
+ mes "Hopefully this will";
+ mes "make more sense once";
+ mes "I find more clues. I hope.";
+ set HELLIONQ,11;
+ close;
+
+}
+
+payon.gat,82,109,1 script Pile of Stones#HellionStones 111,{
+ if(HELLIONQ != 11)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well, this is the place";
+ mes "that Grout'he told me about.";
+ mes "Let's see, there's an engraving";
+ mes "here that says, \"I used to";
+ mes "pray for peaceful days";
+ mes "here.\" Okay.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Man...";
+ mes "This better not be";
+ mes "one of those puzzles";
+ mes "that looks easy once";
+ mes "I get the answer. Well,";
+ mes "if I ever get it, that is.";
+ set HELLIONQ,12;
+ close;
+
+}
+
+payon.gat,239,56,1 script Dried Fish#HellionFish 111,{
+ if(HELLIONQ != 12)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "So... Dried fish all";
+ mes "around me. This is getting";
+ mes "to be nonsense. Let's see,";
+ mes "this message says, \"Green";
+ mes "Herbs are very useful for";
+ mes "getting rid of fish smells.\"";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I got it...!";
+ mes "Whoever made up";
+ mes "these clues must be";
+ mes "some sort of crazy man!";
+ mes "It's the only explanation!";
+ set HELLIONQ,13;
+ close;
+
+}
+
+payon.gat,240,161,1 script Vat#HellionVat 111,{
+ if(HELLIONQ != 13)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Alright, the last";
+ mes "place I have to check.";
+ mes "It's a big old vat with a";
+ mes "message here too. No";
+ mes "Let me see, there should";
+ mes "be a message here too. Ah--!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "This says, \"What will it be?";
+ mes "Wine or Grape Juice? Oh,";
+ mes "but I much prefer wine.\" Okay,";
+ mes "what does this have to do with";
+ mes "that Hellion's gem? Weird...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Am I missing something?";
+ mes "I think I really need help in";
+ mes "figuring this out. Hmm...";
+ set HELLIONQ,14;
+ close;
+
+}
+
+payon.gat,159,130,1 script Wooden Floor#HellionFloor 111,{
+ if(HELLIONQ > 15)goto s_Slab;
+ if(HELLIONQ != 15)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Hey, the floor around";
+ mes "here doesn't seem very";
+ mes "solid. Maybe there's";
+ mes "something underneath?";
+ next;
+ menu "Just check the floor.",-,"Dig through the dust.",s_Dig;
+
+ mes "^3151FFYou examine the floor,";
+ mes "but are unable to find";
+ mes "anything that resembles";
+ mes "a clue to the location";
+ mes "of the Hellion's gem";
+ mes "or a tablet piece.";
+ close;
+
+s_Dig:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Oh man, there's";
+ mes "so much dust! What";
+ mes "can I do about all of";
+ mes "this nasty dirt in the air?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Well, there are all these";
+ mes "clues Gout'he found. I sucks";
+ mes "but I'll use this Grape Juice";
+ mes "to sort of keep this dust from";
+ mes "kicking up. And if I put my";
+ mes "morals on hold, I'll cover";
+ mes "my face...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...With this Skirt of Virgin.";
+ mes "Oh, and I can use this Stone";
+ mes "Heart to prop any floor boards";
+ mes "I tilt while I look undernearth";
+ mes "this floor. Oh hey! I found it!";
+ mes "It's... It's another clue!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Wait, wait...";
+ mes "I can't read the";
+ mes "engraving on this";
+ mes "stone slab, it's way";
+ mes "too old. Let's see...";
+ next;
+ mes "^3151FFYou cover the surface";
+ mes "of the slab and begin";
+ mes "to rub a Green Herb over";
+ mes "it. Fortunately, the juice from";
+ mes "the Green Herb makes the";
+ mes "engraving appear more clearly.";
+ next;
+ mes "[Stone Engraving]";
+ mes "^7151FF\"This has been entrusted to";
+ mes "the care of the compassionate";
+ mes "one so that my friends may";
+ mes "find peace. To he who finds";
+ mes "this, remember that avarice";
+ mes "knows no bounds. --Tyus.\"";
+ set HELLIONQ,16;
+ close;
+
+s_Slab:
+ mes "[Stone Engraving]";
+ mes "^7151FF\"This has been entrusted to";
+ mes "the care of the compassionate";
+ mes "one so that my friends may";
+ mes "find peace. To he who finds";
+ mes "this, remember that avarice";
+ mes "knows no bounds. --Tyus.\"";
+ close;
+
+}
+
+pay_arche.gat,141,29,1 script Buddha Statue#HellionStat 111,3,3,{
+ if(HELLIONQ != 17)end;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Hey, there's a huge";
+ mes "stone statue. This";
+ mes "must be what Gout'he";
+ mes "was telling me about.";
+ next;
+ mes "[Echoing Voice]";
+ mes "^7151FFYou must...";
+ mes "You must be...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "What the--?";
+ mes "There's a voice";
+ mes "inside my head!";
+ mes "and it's not even mine!";
+ next;
+ mes "[Echoing Voice]";
+ mes "You who have come";
+ mes "for the Tablet Piece,";
+ mes "I shall judge whether";
+ mes "or not you are worthy.";
+ mes "Answer this one question.";
+ next;
+ mes "[Echoing Voice]";
+ mes "You are in a situation";
+ mes "in which you will die,";
+ mes "but if you cause the death";
+ mes "of another person, you will";
+ mes "surely save yourself. So...";
+ mes "What do you do?";
+ next;
+ menu "I will kill to survive",s_Kill,"I have no choice, but to die.",s_Die,"I won't kill, but I'll find a way to live!",-,"I'll ask that person if it's okay to kill him.",s_Ask;
+
+ mes "[Echoing Voice]";
+ mes "Yes. Love for all life,";
+ mes "including your own, is";
+ mes "a trait all true heroes";
+ mes "must have. You have chosen...";
+ mes "Wisely. Please, take this into";
+ mes "your capable hands, adventurer.";
+ next;
+ mes "^3151FFA stone slab at the foot";
+ mes "of the statue slides open,";
+ mes "revealing a piece of the";
+ mes "tablet that will lead you";
+ mes "to the Hellion's gem.";
+ getitem 7334,1; //Payon Tablet
+ set HELLIONQ,18;
+ close;
+
+s_Kill:
+ mes "[Echoing Voice]";
+ mes "there is a primal truth";
+ mes "to your answer. However...";
+ mes "You have chosen poorly.";
+ close2;
+ percentheal -100,0;
+ end;
+
+s_Die:
+ mes "[Echoing Voice]";
+ mes "There is a kindness and";
+ mes "compassion in your answer";
+ mes "that is indeed rare. However,";
+ mes "where is the respect for your";
+ mes "own life? If you are that";
+ mes "willing to throw it away, you";
+ mes "are no hero.";
+ close2;
+ percentheal -100,0;
+ end;
+
+s_Ask:
+ mes "[Echoing Voice]";
+ mes "The veneer of honesty in";
+ mes "your answer is surpassed by";
+ mes "your own cowardice. You have";
+ mes "chosen extremely poorly...";
+ close2;
+ percentheal -100,0;
+ end;
+
+OnTouch:
+ if(HELLIONQ != 17)end;
+ specialeffect 313;
+ specialeffect2 313;
+ mes "^3151FFThe piece of tablet";
+ mes "that you have is shining";
+ mes "with light as if in repsonse";
+ mes "to something in the area.";
+ close;
+
+}
+
+morocc_in.gat,116,101,2 script Old Scholar Tyus 735,2,2,{
+
+ if(HELLIONQ == 27)goto s_Last;
+ if(countitem(7332))goto s_Tablet;
+ if(HELLIONQ == 25)goto s_Completion;
+ if(HELLIONQ == 24)goto s_Four;
+ if(HELLIONQ > 18)goto s_Welshyun;
+ if(HELLIONQ == 18)goto s_Morroc;
+ if(HELLIONQ > 8)goto s_Grout;
+ if(HELLIONQ == 8)goto s_Payon;
+ if(HELLIONQ == 4)goto s_Veggie;
+ if(HELLIONQ > 0)goto s_Seek;
+ if(hellion_consideration)goto s_Consider;
+ mes "[Sir Chilias'Tyus]";
+ mes "Greetings...";
+ mes "My name is Sir Chilias'Tyus.";
+ mes "I've lived a long time here in";
+ mes "Rune-Midgard and I've come";
+ mes "to see and know a lot of things.";
+ mes "Power, jealousy, hardship...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Sp what exactly";
+ mes "brings you here to";
+ mes "the middle of Morroc?";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "This land has grown corrupt";
+ mes "with the disease of greed";
+ mes "and selfishness. Everywhere";
+ mes "you go, people are heartless,";
+ mes "but I still believe that I'll find";
+ mes "the one worth enough to help";
+ mes "me...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "There is no shortage of";
+ mes "brave and strong warriors";
+ mes "in these dangerous times.";
+ mes "But for the thing I seek,";
+ mes "I must have the help of one";
+ mes "who is truly pure of heart...";
+ next;
+ menu "What are you looking for?",s_Looking,"Pure of heart? Hah! Good luck!",-;
+
+ mes "[Sir Chilias'Tyus]";
+ mes "Times are bad when";
+ mes "even the youth have";
+ mes "been jaded. But I refuse";
+ mes "to believe that hope is";
+ mes "truly lost in this age...";
+ close;
+
+s_Glimmer:
+ mes "[Sir Chilias'Tyus]";
+ mes "Heh heh~ I see you eyes";
+ mes "glimmer with enthusiasm,";
+ mes "but it seems this task might";
+ mes "be a little too much for you.";
+ mes "I'm sorry, but that's the";
+ mes "reality I can't ignore...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Go out in to the world,";
+ mes "and grow in strength.";
+ mes "Perhaps after you become";
+ mes "more capable, I'll find that";
+ mes "I can rely on your help.";
+ close;
+
+s_Looking:
+ if(BaseLevel < 75)goto s_Glimmer;
+ mes "[Sir Chilias'Tyus]";
+ mes "I suppose I should tell you";
+ mes "first about my grandfather,";
+ mes "who was once a young and";
+ mes "fearless adventurer, much";
+ mes "like yourself. Yes, he";
+ mes "traveled the world with his";
+ mes "three friends...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "The four of them went on";
+ mes "many expeditions together";
+ mes "and earned themselves a";
+ mes "reputation as a courageous";
+ mes "team that worked especially";
+ mes "well together after many years.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Then, on what was supposed";
+ mes "to be a typical journey, they found";
+ mes "an uncharted cave. Curious, and";
+ mes "in need of rest, the four ventured";
+ mes "inside. There, they encountered";
+ mes "that most horrible creature...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "It was a ferocious beast";
+ mes "with horns as large and as";
+ mes "sharp as their weapons, with";
+ mes "eyes that blazed with hellfire.";
+ mes "My grandfather could tell that";
+ mes "it was thirsty for blood.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "They ran from the beast";
+ mes "as quickly as they could,";
+ mes "but the four were separated";
+ mes "in the cave's darkness. It was";
+ mes "all they could do to hide in";
+ mes "the darkness of the cave...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "From his hiding place, my";
+ mes "grandfather heard the screams";
+ mes "of his friends as the monster";
+ mes "slaughtered them, one by one.";
+ mes "The screams and the monster's";
+ mes "growls were getting closer...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Unable to endure the";
+ mes "suffering of his trusted";
+ mes "comrades, my grandfather";
+ mes "jumped out hiding and tried";
+ mes "to save his friends. The beast";
+ mes "found him and they battled.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "It was no use. The beast";
+ mes "was too powerful and my";
+ mes "grandfather was knocked out.";
+ mes "When he came to, his friends";
+ mes "were all dead and a shining";
+ mes "gem lay in a pool of blood.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "My grandfather buried";
+ mes "his friends that day. He";
+ mes "took that gem as a memento";
+ mes "of their final expedition, but";
+ mes "wondered why the beast";
+ mes "had decided to spare him.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "It wasn't long before he";
+ mes "experienced the gem's curse";
+ mes "firsthand. The gem inexplicably";
+ mes "drew people to it, taking the";
+ mes "greed in their hearts and";
+ mes "twisting their minds...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Grandfather believed the";
+ mes "beast let him live so that";
+ mes "the gem would be set loose";
+ mes "upon the outside world, free";
+ mes "to pollute it with its evil.";
+ mes "He had to do something...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "However, the gem proved";
+ mes "to be formed out of pure evil";
+ mes "and could not be destroyed";
+ mes "by human means. In the end,";
+ mes "my grandfather hid the gem";
+ mes "someplace safe...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "However, the threat of the";
+ mes "gem still exists. Grandfather";
+ mes "and my father worked for";
+ mes "years to find a way to seal";
+ mes "its darkness. Only now have I";
+ mes "been able to create a bracelet to";
+ mes "seal its evil power.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "For my grandfather and his";
+ mes "friends to truly rest in peace,";
+ mes "I must find an adventurer of";
+ mes "pure heart who can find the";
+ mes "gem and bring it to me so that";
+ mes "I can finally seal its power.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I think... I think you";
+ mes "might be the hero that";
+ mes "I've been waiting for. Will";
+ mes "you help an old man for the";
+ mes "sake of all that is good?";
+ next;
+ menu "Of course, I will.",s_Will,"I'm sorry, but I can't.",-;
+s_AskMuch:
+ mes "[Sir Chilias'Tyus]";
+ mes "I understand...";
+ mes "I know I am asking much";
+ mes "of you, and this task is not";
+ mes "one to take lightly. However,";
+ mes "I believe that you are wholly";
+ mes "capable of accomplishing this.";
+ set hellion_consideration,1;
+ close;
+
+s_Consider:
+ mes "[Sir Chilias'Tyus]";
+ mes "So have you considered";
+ mes "my proposal? I believe that";
+ mes "you may be the one who will";
+ mes "help me in sealing away the";
+ mes "Hellion gem's evil forever.";
+ next;
+ menu "I will help you.",-,"...Sorry about that.",s_AskMuch;
+
+ set hellion_consideration,0;
+s_Will:
+ mes "[Sir Chilias'Tyus]";
+ mes "Good good, but first";
+ mes "I must test to see if you";
+ mes "are worthy of holding the";
+ mes "Hellion's gem. I can't tell";
+ mes "you exacrlt where it is, but";
+ mes "I will give you some clues.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "First, speak to Clanux";
+ mes "Heffron in Prontera. He";
+ mes "has offered to help me find";
+ mes "the gem, but I do not know if";
+ mes "I can trust him. Please help";
+ mes "me protect this world from the gem...";
+ set HELLIONQ,1;
+ close;
+
+s_Seek:
+ mes "[Sir Chilias'Tyus]";
+ mes "Please seek out";
+ mes "Clanux Heffron in";
+ mes "Prontera. He may have";
+ mes "information regarding a";
+ mes "clue leading to the Hellion";
+ mes "gem. Good luck to you.";
+ close;
+
+s_Veggie:
+ mes "^3151FFAs you told Chilias about";
+ mes "the strange message you";
+ mes "found inside the training";
+ mes "dummy he starts to mumble";
+ mes "something nobody could";
+ mes "possibly understand.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Ok, I think I know what";
+ mes "this clue means. Go find";
+ mes "this Veggie Lady, wherever";
+ mes "she might be. Then take";
+ mes "9 steps North and then";
+ mes "3 steps to the west.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I'm still clueless";
+ mes "about the \"BINGO\" part.";
+ mes "I'm sorry but I can't help";
+ mes "you with that, you'll have";
+ mes "to figure it out on your own.";
+ close;
+
+s_Payon:
+ mes "[Sir Chilias'Tyus]";
+ mes "Ah, yes! This is one piece";
+ mes "of the table that will lead";
+ mes "you to the Hellion's gem!";
+ mes "This engraving was definitely";
+ mes "made by my grandfather, and";
+ mes "Christopher was one of his friends.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I suppose he hid these pieces";
+ mes "in the places that reminded him";
+ mes "of his friends. Now according";
+ mes "to the tablet's message, you";
+ mes "should find the next piece";
+ mes "in \"the city of thickest forest\"";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I'm sure that the";
+ mes "next tablet piece is";
+ mes "in Payon, so go there";
+ mes "and see if you can find";
+ mes "it. Good luck to you,";
+ mes "kind adventurer.";
+ set HELLIONQ,9;
+ close;
+
+s_Grout:
+ mes "[Sir Chilias'Tyus]";
+ mes "Now that I think about";
+ mes "it, there's a guy in Payon";
+ mes "that I know named Grout'the";
+ mes "Tuccok who knew my grandfather.";
+ mes "He might know something, but";
+ mes "he's a little, well... Hmm...";
+ close;
+
+s_Morroc:
+ mes "[Sir Chilias'Tyus]";
+ mes "While you were gone,";
+ mes "I felt a little bad that you";
+ mes "were searching for the";
+ mes "tablet pieces on your own,";
+ mes "so I managed to find this";
+ mes "piece here in Morroc. But...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ specialeffect 313;
+ specialeffect2 313;
+ mes "Why are they glowing like";
+ mes "this? In any case, we have";
+ mes "this piece I found here in";
+ mes "Morroc, and the pieces you";
+ mes "found in Prontera and Payon.";
+ mes "There's one more left in Geffen.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Anyway, on the last tablet";
+ mes "piece that I found, it";
+ mes "says \"Hakim loved magic,";
+ mes "and always enjoyed its";
+ mes "wondrous city\", so I'm sure";
+ mes "the last piece is in Geffen.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Please take this third";
+ mes "tablet piece and find the";
+ mes "final piece so that we can";
+ mes "fulfill my dear grandfather's";
+ mes "greatest wish and forever";
+ mes "seal away the Hellion's gem.";
+ getitem 7335,1; //Morroc Tablet
+ set HELLIONQ,19;
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "When you get back to Geffen,";
+ mes "please speak to Welshyun,";
+ mes "who's been helping me in";
+ mes "creating a device to seal the";
+ mes "gem's darkness. He is";
+ mes "worthy of trust and";
+ mes "will surely help us.";
+ close;
+
+s_Welshyun:
+ mes "[Sir Chilias'Tyus]";
+ mes "Please visit the";
+ mes "sage named Welshyun";
+ mes "in Geffen. We are good";
+ mes "friends, so I am sure";
+ mes "that you can trust him.";
+ close;
+
+s_Four:
+ mes "[Sir Chilias'Tyus]";
+ mes "You have all four";
+ mes "pieces of the tablet?";
+ mes "That's great news! Ah,";
+ mes "and the gem is embedded";
+ mes "in each of the tablet pieces.";
+ mes "We're so close to finishing!";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Ah, would you go back";
+ mes "to Welshyun? I know it's";
+ mes "a hassle, but he is probably";
+ mes "the only one who can combine";
+ mes "the tablet pieces into their";
+ mes "complete form. Thank you...";
+ set HELLIONQ,25;
+ close;
+
+s_Completion:
+ mes "[Sir Chilias'Tyus]";
+ mes "Ah, would you go back";
+ mes "to Welshyun? I know it's";
+ mes "a hassle, but he is probably";
+ mes "the only one who can combine";
+ mes "the tablet pieces into their";
+ mes "complete form. Thank you...";
+ close;
+
+s_Tablet:
+ mes "[Sir Chilias'Tyus]";
+ mes "At long last. We have";
+ mes "everything. The Tablet";
+ mes "and the Hellion's gem.";
+ mes "Now I can finally use";
+ mes "this bracelet to seal";
+ mes "its power forever...";
+ next;
+ if(countitem(7337))goto s_HellionEye;
+ specialeffect 12;
+ mes "[Sir Chilias'Tyus]";
+ mes "Darkness that writhes,";
+ mes "souls lost in the inferno,";
+ mes "I offer you comfort, I offer";
+ mes "you peace. To the despairing";
+ mes "ones, to the shameless ones,";
+ mes "I give guidance to heaven...";
+ next;
+ specialeffect 58;
+ mes "[Sir Chilias'Tyus]";
+ mes "Instead of sadness,";
+ mes "let there be joy. Instead";
+ mes "of anger, let there be";
+ mes "love. Souls that are";
+ mes "lost will now find";
+ mes "their way...";
+ next;
+ specialeffect 83;
+ mes "[Sir Chilias'Tyus]";
+ mes "Light and hope...";
+ mes "Heaven and earth...";
+ mes "Cast away the darkness.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I did it.";
+ mes "After all these";
+ mes "long years I finally did";
+ mes "it. Thanks to you help.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Please take this";
+ mes "Nile Rose, which will";
+ mes "keep the power of the gem";
+ mes "in check. I trust that you will";
+ mes "keep its secret and protect it";
+ mes "from those motivated by greed.";
+ delitem 7332,1; //Complete Tablet
+ getitem 2658,1; //Nile Rose
+ set BaseExp,BaseExp+1000000;
+ set HELLIONQ,27;
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Thank you, kind";
+ mes "adventurer, for bringing";
+ mes "peace to my grandfather's";
+ mes "soul and for working to";
+ mes "protect peace in our world.";
+ mes "You are the truest of heroes.";
+ close;
+
+s_HellionEye:
+ mes "[Sir Chilias'Tyus]";
+ mes "But your eyes...";
+ mes "They seem so tired";
+ mes "and I can sense some";
+ mes "sort of pain from them.";
+ mes "Did something happen?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I learned the secret of";
+ mes "the Hellion's gem. It...";
+ mes "It turns people into";
+ mes "Hellion Revenants.";
+ mes "it's what happened";
+ mes "to your grandfather...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "What...";
+ mes "What did you just say?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "The tablet had a map that";
+ mes "let me to the chamber where";
+ mes "your grandfather locked himself";
+ mes "up before he completed turning";
+ mes "into the Hellion Revenant.";
+ mes "It was horrible...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "At the entrance, he";
+ mes "left a message that said";
+ mes "that he wanted to be killed.";
+ mes "So that he could finally join";
+ mes "his friends instead of living";
+ mes "as a monster. So I... So I...";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "It's okay. I know you";
+ mes "did the right thing. It's";
+ mes "what my grandfather";
+ mes "would have wanted most.";
+ mes "Thank you for finally freeing";
+ mes "his soul and giving him peace.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Here, I think you";
+ mes "should have this Eye";
+ mes "of Hellion, in case you";
+ mes "wanted a memento of";
+ mes "your dear grandfather.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I'd appreciate that.";
+ mes "Grandfather's eye...";
+ mes "It's full of the painful";
+ mes "experiences of the people";
+ mes "who were turned into Hellion";
+ mes "Revenants against their will.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "But... Now is not the";
+ mes "time for sentiment. For";
+ mes "sake of my grandfather,";
+ mes "I must seal the power of";
+ mes "the Hellion's gem now!";
+ next;
+ specialeffect 12;
+ mes "[Sir Chilias'Tyus]";
+ mes "Darkness that writhes,";
+ mes "souls lost in the inferno,";
+ mes "I offer you comfort, I offer";
+ mes "you peace. To the despairing";
+ mes "ones, to the shameless ones,";
+ mes "I give guidance to heaven...";
+ next;
+ specialeffect 58;
+ mes "[Sir Chilias'Tyus]";
+ mes "Instead of sadness,";
+ mes "let there be joy. Instead";
+ mes "of anger, let there be";
+ mes "love. Souls that are";
+ mes "lost will now find";
+ mes "their way...";
+ next;
+ specialeffect 83;
+ mes "[Sir Chilias'Tyus]";
+ mes "Light and hope...";
+ mes "Heaven and earth...";
+ mes "Cast away the darkness.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "I did it.";
+ mes "After all these";
+ mes "long years I finally did";
+ mes "it. Thanks to you help.";
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Please take this";
+ mes "Nile Rose, which will";
+ mes "keep the power of the gem";
+ mes "in check. I trust that you will";
+ mes "keep its secret and protect it";
+ mes "from those motivated by greed.";
+ delitem 7332,1; //Complete Tablet
+ delitem 7337,1; //Eye of Hellion
+ getitem 2658,1; //Nile Rose
+ getitem 603,1; //Old Blue Box
+ set BaseExp,BaseExp+1200000;
+ set HELLIONQ,27;
+ next;
+ mes "[Sir Chilias'Tyus]";
+ mes "Thank you, kind";
+ mes "adventurer, for bringing";
+ mes "peace to my grandfather's";
+ mes "soul and for working to";
+ mes "protect peace in our world.";
+ mes "You are the truest of heroes.";
+ next;
+ mes "^3151FFYou have received the";
+ mes "Nile Rose in which the";
+ mes "Hellion's gem is sealed.";
+ mes "The Eye of the Hellion has";
+ mes "granted you some experience";
+ mes "through its strange powers.";
+ close;
+
+s_Last:
+ mes "[Sir Chilias'Tyus]";
+ mes "Long time no see. So, are you doing";
+ mes "well to keep the promise with me?";
+ mes "Please handle it with care";
+ mes "to prevent the evil power within";
+ mes "from being released.";
+ close;
+
+OnTouch:
+ if(HELLIONQ != 18)end;
+ specialeffect 313;
+ specialeffect2 313;
+ mes "^3151FFOne of the Table Pieces";
+ mes "that you have is beginning to";
+ mes "shine with light, as if it were";
+ mes "responding to something...";
+ close;
+
+}
+
+gef_fild09.gat,296,59,1 script Hidden Cave#HellionCave 111,{
+
+ if(!countitem(7332))goto s_NoTablet;
+ mes "^3151FFAmongst the wild bushes";
+ mes "and overgrown grass, you";
+ mes "see a large rock slab that";
+ mes "resembles a door. As you";
+ mes "come closer, you can see a";
+ mes "groove on the rock's surface.";
+ next;
+ menu "Insert the Tablet.",s_Insert,"Ignore",-;
+
+ mes "^3151FFYou do nothing.";
+ mes "And nothing happens.";
+ close;
+
+s_Insert:
+ mes "^3151FFYou insert the tablet into";
+ mes "the rock's groove and the";
+ mes "Hellion's gem begins to hum";
+ mes "and glow. The rock slides open,";
+ mes "revealing an engraved message";
+ mes "on the ground for you to read.";
+ next;
+ mes "^7151FF\"To you who have found this";
+ mes "place, I reveal the truth about";
+ mes "the Hellion Revenant. It was";
+ mes "never a devil, like we";
+ mes "believed, but a human being";
+ mes "slowly corrupted by the";
+ mes "darkness of the Hellion's";
+ mes "gem.\"";
+ next;
+ mes "^7151FF\"I learned this horrible";
+ mes "truth too late. Already,";
+ mes "I can feel the darkness";
+ mes "welling up within me.";
+ mes "It is all I can do to trap";
+ mes "myself in this chamber";
+ mes "before I lose all reason.\"";
+ next;
+ mes "^7151FF\"I failed an it's too";
+ mes "late for me, but I hope";
+ mes "someone in the future";
+ mes "can seal the Hellion gem's";
+ mes "dark power. And I hope that";
+ mes "someone will grant me the";
+ mes "sweet release I crave...\"";
+ next;
+ mes "^7151FF\"Brave hero, I beg of";
+ mes "you. Please kill me and";
+ mes "bring salvation to my soul.";
+ mes "Please release me so that";
+ mes "I can finally join my friends.\"";
+ mes " ";
+ mes " -Tyus";
+ close2;
+ warp "gef_dun03.gat",140,119;
+ end;
+
+s_NoTablet:
+ mes "^3151FFAmongst the wild bushes";
+ mes "and overgrown grass, you";
+ mes "see a large rock slab that";
+ mes "resembles a door. But it";
+ mes "seems it is sealed by a";
+ mes "strong force so you're";
+ mes "unable to open it.";
+ close;
+
+}
diff --git a/npc/quests/gunslinger_quests.txt b/npc/quests/gunslinger_quests.txt
index cb2823a88..c939035b6 100644
--- a/npc/quests/gunslinger_quests.txt
+++ b/npc/quests/gunslinger_quests.txt
@@ -1,405 +1,405 @@
-//===== By: ==================================================
-//= Playtester
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= SVN eA
-//===== Description: =========================================
-//= Gunslinger guns and bullet quests
-//===== Additional Comments: =================================
-//= 1.0 Only Garrison Gun done yet [Playtester]
-//= 1.1 Added Garrison[2] [Playtester]
-//= 1.2 Added Drifter, Destroyer and Inferno [Playtester]
-//============================================================
-
-
-//===================== Garrison =====================================================
-
-que_ng.gat,182,85,3 script Mr.Garrison 109,{
- set @npcname$,"[Mr.Garrison]";
-
- mes @npcname$;
- if(countitem(13105)>0) goto L_Already;
- if(countitem(13104)>0) goto L_Slot;
- mes "I have invented a new Revolver!";
- mes "I think I call it... Garrison.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Very innovative name really.";
- next;
- if(BaseJob != Job_Gunslinger || BaseLevel < 55){
- mes @npcname$;
- mes "I don't think you have enough";
- mes "knowledge of guns to see its";
- mes "true beauty.";
- close;
- }
- mes @npcname$;
- mes "You look like you're an expert";
- mes "in guns, aren't you?";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Yeah you could say so.";
- next;
- mes @npcname$;
- mes "So, do you want me to make a";
- mes "^0000FFGarrison^000000 for you?";
- next;
-
- switch(select("Yes, please.","Nah, I'll stick with my gun."))
- {
-
- case 1:
- mes @npcname$;
- mes "Great! But first you need to";
- mes "bring me the materials I need";
- mes "to create one.";
- next;
- mes @npcname$;
- mes "This is what I need:";
- mes "^FF000050 Steels^000000,";
- mes "^FF00003 Eluniums^000000,";
- mes "^FF00001 Oridecon^000000,";
- mes "^FF000050 Coals^000000,";
- mes "^FF000020 Rusty Screws^000000 and";
- mes "^FF000030000 Zeny^000000.";
- next;
- mes @npcname$;
- if ( (countitem(999)<50) || (countitem(985)<3) || (countitem(984)<1) || (countitem(1003)<50) || (countitem(7317)<20) || (Zeny < 30000) ) {
- mes "Come back when you have the materials.";
- close;
- }
- delitem 999,50;
- delitem 985,3;
- delitem 984,1;
- delitem 1003,50;
- delitem 7317,20;
- set Zeny,Zeny-30000;
- mes "I see you came prepared.";
- mes "Let me take those material.";
- next;
- mes @npcname$;
- mes "Give me just a minute...";
- mes "...";
- mes "...";
- next;
- getitem 13104,1;
- mes @npcname$;
- mes "It's done. Here, take this";
- mes "wonderful gun!";
- close;
-
- case 2:
- mes @npcname$;
- mes "Well, guess a true Gunslinger";
- mes "will never part from his";
- mes "favorite gun, heh.";
- close;
- }
-
-L_Slot:
- mes "Oh, I see you have one of";
- mes "my high-quality guns.";
- next;
- mes @npcname$;
- mes "Now that I look at it, I";
- mes "think I could improve it";
- mes "some more.";
- next;
- mes @npcname$;
- mes "How about I add a ^0000FFslot^000000";
- mes "to it? Be careful, though.";
- mes "If you put a card into it";
- mes "already, it will be lost";
- mes "in the process.";
- next;
- switch(select("Yes, please add a slot.","Nah, I keep it as it is now."))
- {
-
- case 1:
- mes @npcname$;
- mes "Great! But first you need to";
- mes "bring me the materials I need";
- mes "to improve it.";
- next;
- mes @npcname$;
- mes "This is what I need:";
- mes "^FF000010 Steels^000000,";
- mes "^FF00001 Eluniums^000000,";
- mes "^FF000010 Emveretarcon^000000,";
- mes "^FF000030 Coals^000000,";
- mes "^FF000010 Rusty Screws^000000 and";
- mes "of course your ^FF0000Garrison^000000.";
- next;
- mes @npcname$;
- if ( (countitem(999)<10) || (countitem(985)<1) || (countitem(1011)<10) ||(countitem(1003)<30) || (countitem(7317)<10) || (countitem(13104)<1) ) {
- mes "Come back when you have the materials.";
- close;
- }
- delitem 999,10;
- delitem 985,1;
- delitem 1011,10;
- delitem 1003,30;
- delitem 7317,10;
- delitem 13104,1;
- mes "I see you came prepared.";
- mes "Let me take those materials.";
- next;
- mes @npcname$;
- mes "Give me just a minute...";
- mes "...";
- mes "...";
- next;
- getitem 13105,1;
- mes @npcname$;
- mes "It's done. Now it is";
- mes "even better than before.";
- mes "Put it to good use.";
- close;
-
- case 2:
- mes @npcname$;
- mes "Okay, come back when you";
- mes "changed your mind.";
- close;
- }
-
-L_Already:
- mes "So how do you like";
- mes "my gun?";
- close;
-}
-
-que_ng.gat,187,163,3 script Ingrid 744,{
- set @npcname$,"[Ingrid]";
-
- mes @npcname$;
- mes "I can make the strongest of";
- mes "all weapons. The ultimate";
- mes "grenade launcher.";
- mes "It's called ^0000FFInferno^000000.";
- next;
- if(BaseJob != Job_Gunslinger || BaseLevel < 65){
- mes @npcname$;
- mes "But I don't think you are";
- mes "experienced enough to use it.";
- next;
- mes @npcname$;
- mes "You'll probably kill yourself.";
- mes "It's just too powerful to use";
- mes "for a beginner. I refuse to";
- mes "make one for you.";
- close;
- }
- mes @npcname$;
- mes "You look experienced.";
- mes "I think I could make one";
- mes "for you.";
- next;
- mes @npcname$;
- mes "So, do you want me to make an";
- mes "^0000FFInferno^000000 for you?";
- next;
-
- switch(select("Yes, please.","No thanks."))
- {
-
- case 1:
- mes @npcname$;
- mes "Okay, but first you need to";
- mes "bring me the materials I need";
- mes "to create one.";
- next;
- mes @npcname$;
- mes "This is what I need:";
- mes "^FF0000100 Used Iron Plates^000000,";
- mes "^FF000010 Oridecons^000000,";
- mes "^FF000050 Rusty Screws^000000,";
- mes "^FF0000100 Burning Hearts^000000 and";
- mes "^FF0000200000 Zeny^000000.";
- next;
- mes @npcname$;
- if ( (countitem(7319)<100) || (countitem(984)<10) || (countitem(7317)<50) || (countitem(7097)<100) || (Zeny < 200000) ) {
- mes "Come back when you have the materials.";
- close;
- }
- delitem 7319,100;
- delitem 984,10;
- delitem 7317,50;
- delitem 7097,100;
- set Zeny,Zeny-200000;
- mes "Oh, you already have the materials.";
- mes "Let me have them.";
- next;
- mes @npcname$;
- mes "I need to be careful...";
- mes "...";
- mes "...";
- next;
- getitem 13162,1;
- mes @npcname$;
- mes "It's done.";
- mes "Be careful with it.";
- close;
-
- case 2:
- mes @npcname$;
- mes "Probably a good choice.";
- mes "It's really dangerous.";
- close;
- }
-}
-
-que_ng.gat,185,180,3 script Vanessa 726,{
- set @npcname$,"[Vanessa]";
-
- mes @npcname$;
- mes "I can make a grenade launcher";
- mes "that can destroy armors.";
- mes "It's called ^0000FFDestroyer^000000.";
- next;
- if(BaseJob != Job_Gunslinger || BaseLevel < 52){
- mes @npcname$;
- mes "But I don't think you are";
- mes "experienced enough to use it.";
- next;
- mes @npcname$;
- mes "Come back when you think";
- mes "you are worthy to use this";
- mes "weapon.";
- close;
- }
- mes @npcname$;
- mes "You look experienced.";
- mes "I think I could make one";
- mes "for you.";
- next;
- mes @npcname$;
- mes "So, do you want me to make a";
- mes "^0000FFDestroyer^000000 for you?";
- next;
-
- switch(select("Yes, please.","No thanks."))
- {
-
- case 1:
- mes @npcname$;
- mes "Okay, but first you need to";
- mes "bring me the materials I need";
- mes "to create one.";
- next;
- mes @npcname$;
- mes "This is what I need:";
- mes "^FF000050 Used Iron Plates^000000,";
- mes "^FF00005 Oridecons^000000,";
- mes "^FF000070 Rusty Screws^000000 and";
- mes "^FF0000100000 Zeny^000000.";
- next;
- mes @npcname$;
- if ( (countitem(7319)<50) || (countitem(984)<5) || (countitem(7317)<70) || (Zeny < 100000) ) {
- mes "Come back when you have the materials.";
- close;
- }
- delitem 7319,50;
- delitem 984,5;
- delitem 7317,70;
- set Zeny,Zeny-100000;
- mes "Oh, you already have the materials.";
- mes "Let me have them.";
- next;
- mes @npcname$;
- mes "I'll make it in a minute...";
- mes "...";
- mes "...";
- next;
- getitem 13160,1;
- mes @npcname$;
- mes "It's done.";
- mes "Be careful with it.";
- close;
-
- case 2:
- mes @npcname$;
- mes "Oh well, your loss.";
- close;
- }
-}
-
-que_ng.gat,149,178,5 script N.A 744,{
- set @npcname$,"[N.A]";
-
- mes @npcname$;
- mes "If you like gatling guns, I'm the";
- mes "right person to talk to.";
- mes "I can make a ^0000FFDrifter^000000.";
- next;
- if(BaseJob != Job_Gunslinger || BaseLevel < 55){
- mes @npcname$;
- mes "But I don't think you are";
- mes "experienced enough to use it.";
- next;
- mes @npcname$;
- mes "Come back when you think";
- mes "you are worthy to use this";
- mes "weapon.";
- close;
- }
- mes @npcname$;
- mes "You look experienced.";
- mes "I think I could make one";
- mes "for you.";
- next;
- mes @npcname$;
- mes "So, do you want me to make a";
- mes "^0000FFDrifter^000000 for you?";
- next;
-
- switch(select("Yes, please.","No thanks."))
- {
-
- case 1:
- mes @npcname$;
- mes "Okay, but first you need to";
- mes "bring me the materials I need";
- mes "to create one.";
- next;
- mes @npcname$;
- mes "This is what I need:";
- mes "^FF000070 Steels^000000,";
- mes "^FF00005 Eluniums^000000,";
- mes "^FF00003 Oridecons^000000,";
- mes "^FF000070 Coals^000000,";
- mes "^FF000050 Rusty Screws^000000 and";
- mes "^FF000050000 Zeny^000000.";
- next;
- mes @npcname$;
- if ( (countitem(999)<70) || (countitem(985)<5) || (countitem(984)<3) || (countitem(1003)<70) || (countitem(7317)<50) || (Zeny < 50000) ) {
- mes "Come back when you have the materials.";
- close;
- }
- delitem 999,70;
- delitem 985,5;
- delitem 984,3;
- delitem 1003,70;
- delitem 7317,50;
- set Zeny,Zeny-50000;
- mes "I see you came prepared.";
- mes "Let me take those materials.";
- next;
- mes @npcname$;
- mes "Alright, you won't regret it...";
- mes "...";
- mes "...";
- next;
- getitem 13157,1;
- mes @npcname$;
- mes "It's done. Now shoot the";
- mes "enemies with no mercy!";
- close;
-
- case 2:
- mes @npcname$;
- mes "Oh well, your loss.";
- close;
- }
+//===== By: ==================================================
+//= Playtester
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= SVN eA
+//===== Description: =========================================
+//= Gunslinger guns and bullet quests
+//===== Additional Comments: =================================
+//= 1.0 Only Garrison Gun done yet [Playtester]
+//= 1.1 Added Garrison[2] [Playtester]
+//= 1.2 Added Drifter, Destroyer and Inferno [Playtester]
+//============================================================
+
+
+//===================== Garrison =====================================================
+
+que_ng.gat,182,85,3 script Mr.Garrison 109,{
+ set @npcname$,"[Mr.Garrison]";
+
+ mes @npcname$;
+ if(countitem(13105)>0) goto L_Already;
+ if(countitem(13104)>0) goto L_Slot;
+ mes "I have invented a new Revolver!";
+ mes "I think I call it... Garrison.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Very innovative name really.";
+ next;
+ if(BaseJob != Job_Gunslinger || BaseLevel < 55){
+ mes @npcname$;
+ mes "I don't think you have enough";
+ mes "knowledge of guns to see its";
+ mes "true beauty.";
+ close;
+ }
+ mes @npcname$;
+ mes "You look like you're an expert";
+ mes "in guns, aren't you?";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Yeah you could say so.";
+ next;
+ mes @npcname$;
+ mes "So, do you want me to make a";
+ mes "^0000FFGarrison^000000 for you?";
+ next;
+
+ switch(select("Yes, please.","Nah, I'll stick with my gun."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Great! But first you need to";
+ mes "bring me the materials I need";
+ mes "to create one.";
+ next;
+ mes @npcname$;
+ mes "This is what I need:";
+ mes "^FF000050 Steels^000000,";
+ mes "^FF00003 Eluniums^000000,";
+ mes "^FF00001 Oridecon^000000,";
+ mes "^FF000050 Coals^000000,";
+ mes "^FF000020 Rusty Screws^000000 and";
+ mes "^FF000030000 Zeny^000000.";
+ next;
+ mes @npcname$;
+ if ( (countitem(999)<50) || (countitem(985)<3) || (countitem(984)<1) || (countitem(1003)<50) || (countitem(7317)<20) || (Zeny < 30000) ) {
+ mes "Come back when you have the materials.";
+ close;
+ }
+ delitem 999,50;
+ delitem 985,3;
+ delitem 984,1;
+ delitem 1003,50;
+ delitem 7317,20;
+ set Zeny,Zeny-30000;
+ mes "I see you came prepared.";
+ mes "Let me take those material.";
+ next;
+ mes @npcname$;
+ mes "Give me just a minute...";
+ mes "...";
+ mes "...";
+ next;
+ getitem 13104,1;
+ mes @npcname$;
+ mes "It's done. Here, take this";
+ mes "wonderful gun!";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Well, guess a true Gunslinger";
+ mes "will never part from his";
+ mes "favorite gun, heh.";
+ close;
+ }
+
+L_Slot:
+ mes "Oh, I see you have one of";
+ mes "my high-quality guns.";
+ next;
+ mes @npcname$;
+ mes "Now that I look at it, I";
+ mes "think I could improve it";
+ mes "some more.";
+ next;
+ mes @npcname$;
+ mes "How about I add a ^0000FFslot^000000";
+ mes "to it? Be careful, though.";
+ mes "If you put a card into it";
+ mes "already, it will be lost";
+ mes "in the process.";
+ next;
+ switch(select("Yes, please add a slot.","Nah, I keep it as it is now."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Great! But first you need to";
+ mes "bring me the materials I need";
+ mes "to improve it.";
+ next;
+ mes @npcname$;
+ mes "This is what I need:";
+ mes "^FF000010 Steels^000000,";
+ mes "^FF00001 Eluniums^000000,";
+ mes "^FF000010 Emveretarcon^000000,";
+ mes "^FF000030 Coals^000000,";
+ mes "^FF000010 Rusty Screws^000000 and";
+ mes "of course your ^FF0000Garrison^000000.";
+ next;
+ mes @npcname$;
+ if ( (countitem(999)<10) || (countitem(985)<1) || (countitem(1011)<10) ||(countitem(1003)<30) || (countitem(7317)<10) || (countitem(13104)<1) ) {
+ mes "Come back when you have the materials.";
+ close;
+ }
+ delitem 999,10;
+ delitem 985,1;
+ delitem 1011,10;
+ delitem 1003,30;
+ delitem 7317,10;
+ delitem 13104,1;
+ mes "I see you came prepared.";
+ mes "Let me take those materials.";
+ next;
+ mes @npcname$;
+ mes "Give me just a minute...";
+ mes "...";
+ mes "...";
+ next;
+ getitem 13105,1;
+ mes @npcname$;
+ mes "It's done. Now it is";
+ mes "even better than before.";
+ mes "Put it to good use.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Okay, come back when you";
+ mes "changed your mind.";
+ close;
+ }
+
+L_Already:
+ mes "So how do you like";
+ mes "my gun?";
+ close;
+}
+
+que_ng.gat,187,163,3 script Ingrid 744,{
+ set @npcname$,"[Ingrid]";
+
+ mes @npcname$;
+ mes "I can make the strongest of";
+ mes "all weapons. The ultimate";
+ mes "grenade launcher.";
+ mes "It's called ^0000FFInferno^000000.";
+ next;
+ if(BaseJob != Job_Gunslinger || BaseLevel < 65){
+ mes @npcname$;
+ mes "But I don't think you are";
+ mes "experienced enough to use it.";
+ next;
+ mes @npcname$;
+ mes "You'll probably kill yourself.";
+ mes "It's just too powerful to use";
+ mes "for a beginner. I refuse to";
+ mes "make one for you.";
+ close;
+ }
+ mes @npcname$;
+ mes "You look experienced.";
+ mes "I think I could make one";
+ mes "for you.";
+ next;
+ mes @npcname$;
+ mes "So, do you want me to make an";
+ mes "^0000FFInferno^000000 for you?";
+ next;
+
+ switch(select("Yes, please.","No thanks."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Okay, but first you need to";
+ mes "bring me the materials I need";
+ mes "to create one.";
+ next;
+ mes @npcname$;
+ mes "This is what I need:";
+ mes "^FF0000100 Used Iron Plates^000000,";
+ mes "^FF000010 Oridecons^000000,";
+ mes "^FF000050 Rusty Screws^000000,";
+ mes "^FF0000100 Burning Hearts^000000 and";
+ mes "^FF0000200000 Zeny^000000.";
+ next;
+ mes @npcname$;
+ if ( (countitem(7319)<100) || (countitem(984)<10) || (countitem(7317)<50) || (countitem(7097)<100) || (Zeny < 200000) ) {
+ mes "Come back when you have the materials.";
+ close;
+ }
+ delitem 7319,100;
+ delitem 984,10;
+ delitem 7317,50;
+ delitem 7097,100;
+ set Zeny,Zeny-200000;
+ mes "Oh, you already have the materials.";
+ mes "Let me have them.";
+ next;
+ mes @npcname$;
+ mes "I need to be careful...";
+ mes "...";
+ mes "...";
+ next;
+ getitem 13162,1;
+ mes @npcname$;
+ mes "It's done.";
+ mes "Be careful with it.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Probably a good choice.";
+ mes "It's really dangerous.";
+ close;
+ }
+}
+
+que_ng.gat,185,180,3 script Vanessa 726,{
+ set @npcname$,"[Vanessa]";
+
+ mes @npcname$;
+ mes "I can make a grenade launcher";
+ mes "that can destroy armors.";
+ mes "It's called ^0000FFDestroyer^000000.";
+ next;
+ if(BaseJob != Job_Gunslinger || BaseLevel < 52){
+ mes @npcname$;
+ mes "But I don't think you are";
+ mes "experienced enough to use it.";
+ next;
+ mes @npcname$;
+ mes "Come back when you think";
+ mes "you are worthy to use this";
+ mes "weapon.";
+ close;
+ }
+ mes @npcname$;
+ mes "You look experienced.";
+ mes "I think I could make one";
+ mes "for you.";
+ next;
+ mes @npcname$;
+ mes "So, do you want me to make a";
+ mes "^0000FFDestroyer^000000 for you?";
+ next;
+
+ switch(select("Yes, please.","No thanks."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Okay, but first you need to";
+ mes "bring me the materials I need";
+ mes "to create one.";
+ next;
+ mes @npcname$;
+ mes "This is what I need:";
+ mes "^FF000050 Used Iron Plates^000000,";
+ mes "^FF00005 Oridecons^000000,";
+ mes "^FF000070 Rusty Screws^000000 and";
+ mes "^FF0000100000 Zeny^000000.";
+ next;
+ mes @npcname$;
+ if ( (countitem(7319)<50) || (countitem(984)<5) || (countitem(7317)<70) || (Zeny < 100000) ) {
+ mes "Come back when you have the materials.";
+ close;
+ }
+ delitem 7319,50;
+ delitem 984,5;
+ delitem 7317,70;
+ set Zeny,Zeny-100000;
+ mes "Oh, you already have the materials.";
+ mes "Let me have them.";
+ next;
+ mes @npcname$;
+ mes "I'll make it in a minute...";
+ mes "...";
+ mes "...";
+ next;
+ getitem 13160,1;
+ mes @npcname$;
+ mes "It's done.";
+ mes "Be careful with it.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Oh well, your loss.";
+ close;
+ }
+}
+
+que_ng.gat,149,178,5 script N.A 744,{
+ set @npcname$,"[N.A]";
+
+ mes @npcname$;
+ mes "If you like gatling guns, I'm the";
+ mes "right person to talk to.";
+ mes "I can make a ^0000FFDrifter^000000.";
+ next;
+ if(BaseJob != Job_Gunslinger || BaseLevel < 55){
+ mes @npcname$;
+ mes "But I don't think you are";
+ mes "experienced enough to use it.";
+ next;
+ mes @npcname$;
+ mes "Come back when you think";
+ mes "you are worthy to use this";
+ mes "weapon.";
+ close;
+ }
+ mes @npcname$;
+ mes "You look experienced.";
+ mes "I think I could make one";
+ mes "for you.";
+ next;
+ mes @npcname$;
+ mes "So, do you want me to make a";
+ mes "^0000FFDrifter^000000 for you?";
+ next;
+
+ switch(select("Yes, please.","No thanks."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Okay, but first you need to";
+ mes "bring me the materials I need";
+ mes "to create one.";
+ next;
+ mes @npcname$;
+ mes "This is what I need:";
+ mes "^FF000070 Steels^000000,";
+ mes "^FF00005 Eluniums^000000,";
+ mes "^FF00003 Oridecons^000000,";
+ mes "^FF000070 Coals^000000,";
+ mes "^FF000050 Rusty Screws^000000 and";
+ mes "^FF000050000 Zeny^000000.";
+ next;
+ mes @npcname$;
+ if ( (countitem(999)<70) || (countitem(985)<5) || (countitem(984)<3) || (countitem(1003)<70) || (countitem(7317)<50) || (Zeny < 50000) ) {
+ mes "Come back when you have the materials.";
+ close;
+ }
+ delitem 999,70;
+ delitem 985,5;
+ delitem 984,3;
+ delitem 1003,70;
+ delitem 7317,50;
+ set Zeny,Zeny-50000;
+ mes "I see you came prepared.";
+ mes "Let me take those materials.";
+ next;
+ mes @npcname$;
+ mes "Alright, you won't regret it...";
+ mes "...";
+ mes "...";
+ next;
+ getitem 13157,1;
+ mes @npcname$;
+ mes "It's done. Now shoot the";
+ mes "enemies with no mercy!";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Oh well, your loss.";
+ close;
+ }
} \ No newline at end of file
diff --git a/npc/quests/juice_maker.txt b/npc/quests/juice_maker.txt
index 3661408d4..7a1e315c0 100644
--- a/npc/quests/juice_maker.txt
+++ b/npc/quests/juice_maker.txt
@@ -1,307 +1,307 @@
-//===== eAthena Script =======================================
-//= Juice Maker Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Condition if done: (MISC_QUEST & 1)
-//=
-//= 1.1 fixed input number check [Lupus]
-//= 1.2 fixed misplaced Grape<->Carrot juices [Lupus]
-//= 1.3 added a loopless menu 'as many as possible' [Lupus]
-//= 1.3a Turned the juice making part of the Juicer npc into a
-//= subfunc. Changed fruit amount needed to 1.[kobra_k88]
-//= Fixed exploits [Lupus]
-//= 1.6 fixed typo (where did @ipnut came from?) [Lance]
-//= 1.8 got rid of vars: 'MEAT',"MARIANNE","MORRISON"
-//= From now, all common quests start using bits of the
-//= same variable MISC_QUEST [Lupus]
-//============================================================
-
-
-// Morrison ------------------------------------------------
-prt_in.gat,47,173,2 script Morrison 97,{
- mes "[Little Morrison]";
- if(MISC_QUEST&1 || @MORRISON > 10) goto L_GoAway;
- if(@MORRISON == 10) goto L_Candy;
-
- mes "Wahhhhh!!! Wahh... NO more! NO more!";
- mes "I won't... eat anymore stupid ^0000ffFruit^000000 things!!";
- emotion e_sob;
- next;
- menu "Talk",M_Talk,"Cancel",M_End;
-
- M_Talk:
- if(countitem(517)) goto L_Meat; //Meat
-
- mes "[Little Morrison]";
- mes "Arhhggg!! I'VE HAD ENOUGH!!! I can't eat anymore ^0000ffFruits^000000! They";
- mes "taste so SOUR..... I have to PEEL them before I can eat them.....";
- mes "they feel sticky and squishy...... it's really ANNOYING!!!!";
- emotion e_wah;
- next;
- mes "[LIttle Morrison]";
- mes "I just HATE FRUIT! I can't even get full off of the stuff.(~sigh~)";
- mes "Give me something more edible..... give me some...... ^ff0000MEAT^000000!!!";
- close;
-
- L_Meat:
- mes "[Little Morrison]";
- mes "...(sniff)....(sniff)(sniff).... Oh! Is that ^ff0000Meat^000000???";
- emotion e_ic;
- next;
- mes "[Little Morrison]";
- mes "Do you have some ^ff0000Meat^000000?!!!~(drools)~";
- mes "Umm... that yummy smell is making me SOOO HUNGRYYYY!!!l";
- emotion e_rice;
- next;
- mes "[Little Morrison]";
- mes "... Umm... excuse me..... could you give me some of that meat PLEEAASSSE?";
- emotion e_sob;
- next;
- menu "Give him some",sM_Give,"Ignore him",sM_Ignore;
-
- sM_Give:
- if(countitem(517) == 0) goto L_GoAway; //Meat
- delitem 517,1; //Meat
- set @MORRISON,@MORRISON+1;
- mes "[Little Morrison]";
- mes "Whoah~!!! It's real Meat, Meat!";
- mes "Mmmm! It makes my mouth water.";
- mes "Oh thank you. Now I feel happy. Yum Yum...";
- emotion e_awsm;
- close;
-
- sM_Ignore:
- set @MORRISON,11;
- mes "[Little Morrison]";
- mes "Boo...";
- mes "Boo... Fine... Alright, Alright~!!! Selfish meanie!";
- emotion e_bzz;
- close;
- M_End:
- mes "[Little Morrison]";
- mes "Wahhhh!!! No matter how hard I try, I just can't eat Vegetables";
- mes "or ^0000ffFruit^000000! They're plain disgusting!!";
- emotion e_sob;
- close;
-
-L_GoAway:
- mes "Pffff... Leave me alone! You DON'T CARE about me! I'm gonna DIE";
- mes "because of these stupid Veggies and Fuits so MIND your own business!";
- emotion e_pif;
- close;
-
-L_Candy:
- mes "Ah..I am full now. You don't have to feed me any more. I think I";
- mes "am gonna BURST if I keep eating more.";
- next;
- mes "[Little Morrison]";
- mes "And... um... Take this.";
- next;
- getitem 529,3;
- getitem 530,1;
- set @MORRISON,0;
- mes "[Little Morrison]";
- mes "It is from my secret stash of Candy that I hide from my Mom. Since";
- mes "you gave me some Meat, I will give you some candy." ;
- close;
-
-}
-
-// Housewife Marianne ---------------------------------------------------
-prt_in.gat,49,172,2 script Housewife Marianne 53,{
- mes "[Housewife Marianne]";
- if(MISC_QUEST&1 || @MORRISON > 10) goto L_Juice;
- if(@MORRISON) goto L_GaveMeat;
-
- mes "Morrison!! Please eat some fruit will ya? Fruit~!";
- mes "*Sob*~!! Like father like son...";
- emotion e_sob;
- next;
- menu "Talk",M_Talk,"Cancel",M_Cancel;
- close;
-
- M_Talk:
- mes "[Housewife Marianne]";
- mes "(~Sigh~)...This is Morrison... My one and only son. He's going";
- mes "through some kinda faze and doesn't want to eat any ^0000ffFruits^000000 or";
- mes "vegetables.";
- emotion e_shy;
- next;
- mes "[Housewife Marianne]";
- mes "Look at his face..., it turns sour just hearing about ^0000ffFruit^000000...";
- next;
- mes "[Housewife Marianne]";
- mes "All he wants to eat is but ^ff0000Meat^000000... (sigh)...he needs";
- mes "^0000ffFruits^000000 and vegetables for a proper diet.";
- next;
-
- M_Cancel:
- mes "[Housewife Marianne]";
- mes "Morrison!! I will get mad at you if you keep doing this!";
- emotion e_bzz;
- close;
-
-L_GaveMeat:
- set @MORRISON,0;
- mes "Oh MY GOD!!... Oh lord...";
- emotion e_omg;
- next;
- mes "[Housewife Marianne]";
- mes "WHAT ARE YOU DOING!! HOW DARE YOU feed my son!! And ^ff0000MEAT^000000 of all things!!!";
- next;
- mes "[Housewife Marianne]";
- mes "Arrrgh~~!! Get Lost right now!!!!!!";
- emotion e_pif;
- close;
-
-L_Juice:
- mes "Thank you for not giving my son any meat. I'm trying to feed him";
- mes "^0000ffFruits^000000 and vegetables, but this child doesn't want to eat";
- mes "anything except Meat...";
- next;
- mes "[Housewife Marianne]";
- mes "What if I could turn ^0000ffFruits^000000 into a ^0000ffJuice^000000... for example...Orange";
- mes "juice... Would my child like it?";
- emotion e_hmm;
- next;
- mes "[Housewife Marianne]";
- mes "Ah! Now I remember..There is a town where you can get a variety of";
- mes "^0000ffFruit^000000 turned into ^0000ffFruit Juices^000000.";
- emotion e_ic;
- next;
- mes "[Housewife Marianne]";
- mes "... Was is it...^ff0000Payon^000000...or ^ff0000Morroc^000000...?";
- emotion e_hmm;
- set @MORRISON,0;
- set MISC_QUEST,MISC_QUEST | 1;
- close;
-}
-
-// Juicer Marx Hansen ---------------------------------------------------------
-payon_in03.gat,188,146,5 script Juicer Marx Hansen 86,{
- mes "[Juicer Marx Hansen]";
- if(MISC_QUEST&1) goto L_Juice;
- mes "Welcome to my shop. What brings you here?";
- next;
- menu "Conversation",-,"I am just looking around",M_End;
-
- mes "[Juicer Marx Hansen]";
- mes "In the earliest years of humanity, fruits were the only substanace availble for people to eat.";
- mes "Fruits were vital for survival and without them people faced certain death.";
- mes "During that time Mother Nature was worshiped for her generous offerering.";
- next;
- mes "[Juicer Marx Hansen]";
- mes "Nowadays food is plentifull and it comes in a variety of flavors and forms.";
- mes "With so many other things to eat, fruits aren't consumed as much as they used to be.";
- mes "This is especially true among kids who'd rather eat pizza and candy.";
- next;
- mes "[Juicer Marx Hansen]";
- mes "Because of this I wanted to find a way to make young people realize the importance of fuit.";
- mes "I found that when fruits were turned into juices, they became more digestive and even tasty enough for kids.";
- close;
- M_End:
- mes "[Juicer Marx Hansen]";
- mes "Ok then.";
- close;
-
-//--------------
-L_Juice:
-//---------
- mes "Welcome to my shop. Are you here to process Fruits like everyone else?";
- next;
- menu "Yes, I am.",M_1a, "How do you make fruit juice?",M_1b, "Nope.",M_1End;
-
- M_1a:
- mes "[Juicer Marx Hansen]";
- mes "So what kind of fruit juice would you like to process?";
- next;
- menu "Apple Juice",sM_1a,"Banana Juice",sM_1b,"Grape Juice",sM_1c,"Carrot Juice",sM_1d,"None.",M_1End;
-
- sM_1a:
- callsub sF_Make, 512, "apples", 531;
- goto M_1a;
- sM_1b:
- callsub sF_Make, 513, "bananas", 532;
- goto M_1a;
- sM_1c:
- callsub sF_Make, 514, "grapes", 533;
- goto M_1a;
- sM_1d:
- callsub sF_Make, 515, "carrots", 534;
- goto M_1a;
- M_1b:
- mes "[Juicer Marx Hansen]";
- mes "# Fruit Juice Info #";
- mes "- ^FF3355Apple^000000 Juice - Apple x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "- ^D5A500Banana^000000 Juice - Banana x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "- ^FF8800Carrot^000000 Juice - Carrot x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "- ^AA00AAGrape^000000 Juice - Grape x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
- close;
- M_1End:
- mes "[Juicer Marx Hansen]";
- mes "Oh well... see you next time.";
- close;
-
-// Subfunction for making juice
-//----------------------------------
-sF_Make:
- mes "[Juicer Marx Hansen]";
- mes "How many bottles would you like?";
- next;
- menu "I'll tell you.",M_Tell, "As many as possible",-, "I've changed my mind.",M_1End;
-
- set @amount,1000; //max possible amount of Juice
- //calc max possible # juices
- if(Zeny/3 < @amount) set @amount, Zeny/3;
- if(countitem(getarg(0)) < @amount) set @amount, countitem(getarg(0));
- if(countitem(713) < @amount) set @amount, countitem(713);
- if(@amount > 0) goto L_Make;
- mes "[Juicer Marx Hansen]";
- mes "Doh! You don't have enough ingredients for a single bottle of juice.";
- emotion e_gasp;
- close;
-
- M_Tell:
- mes "[Juicer Marx Hansen]";
- mes "Very well then. Enter 0 if you don't want any. Also you cannot";
- mes "buy more than 1000 at a time.";
- next;
- input @amount;
- if(@amount < 1 || @amount > 1000) return;
- if(countitem(getarg(0)) < @amount) goto sL_NoFruits;
- if(countitem(713) < @amount) goto sL_NoBottles;
- if(Zeny < @amount * 3) goto sL_NoZeny;
-
- L_Make:
- delitem getarg(0), @amount; //del Fruit
- delitem 713, @amount; //del Empty Bottle
- set Zeny, Zeny - @amount * 3;
- getitem getarg(2), @amount; //get Juice
- mes "[Juicer Marx Hansen]";
- mes "Here you are. Take it.";
- close;
-
- sL_NoFruits:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough fruit.";
- mes "You need " +@amount+ " " +getarg(1)+ " to make that much juice.";
- next;
- return;
- sL_NoBottles:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough bottles. You need "+@amount+" empty bottle(s) to make that many juice drinks.";
- next;
- return;
- sL_NoZeny:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough zeny. You need " +(@amount*3)+ " zeny, to make that many juice drinks.";
- next;
- return;
-}
+//===== eAthena Script =======================================
+//= Juice Maker Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Condition if done: (MISC_QUEST & 1)
+//=
+//= 1.1 fixed input number check [Lupus]
+//= 1.2 fixed misplaced Grape<->Carrot juices [Lupus]
+//= 1.3 added a loopless menu 'as many as possible' [Lupus]
+//= 1.3a Turned the juice making part of the Juicer npc into a
+//= subfunc. Changed fruit amount needed to 1.[kobra_k88]
+//= Fixed exploits [Lupus]
+//= 1.6 fixed typo (where did @ipnut came from?) [Lance]
+//= 1.8 got rid of vars: 'MEAT',"MARIANNE","MORRISON"
+//= From now, all common quests start using bits of the
+//= same variable MISC_QUEST [Lupus]
+//============================================================
+
+
+// Morrison ------------------------------------------------
+prt_in.gat,47,173,2 script Morrison 97,{
+ mes "[Little Morrison]";
+ if(MISC_QUEST&1 || @MORRISON > 10) goto L_GoAway;
+ if(@MORRISON == 10) goto L_Candy;
+
+ mes "Wahhhhh!!! Wahh... NO more! NO more!";
+ mes "I won't... eat anymore stupid ^0000ffFruit^000000 things!!";
+ emotion e_sob;
+ next;
+ menu "Talk",M_Talk,"Cancel",M_End;
+
+ M_Talk:
+ if(countitem(517)) goto L_Meat; //Meat
+
+ mes "[Little Morrison]";
+ mes "Arhhggg!! I'VE HAD ENOUGH!!! I can't eat anymore ^0000ffFruits^000000! They";
+ mes "taste so SOUR..... I have to PEEL them before I can eat them.....";
+ mes "they feel sticky and squishy...... it's really ANNOYING!!!!";
+ emotion e_wah;
+ next;
+ mes "[LIttle Morrison]";
+ mes "I just HATE FRUIT! I can't even get full off of the stuff.(~sigh~)";
+ mes "Give me something more edible..... give me some...... ^ff0000MEAT^000000!!!";
+ close;
+
+ L_Meat:
+ mes "[Little Morrison]";
+ mes "...(sniff)....(sniff)(sniff).... Oh! Is that ^ff0000Meat^000000???";
+ emotion e_ic;
+ next;
+ mes "[Little Morrison]";
+ mes "Do you have some ^ff0000Meat^000000?!!!~(drools)~";
+ mes "Umm... that yummy smell is making me SOOO HUNGRYYYY!!!l";
+ emotion e_rice;
+ next;
+ mes "[Little Morrison]";
+ mes "... Umm... excuse me..... could you give me some of that meat PLEEAASSSE?";
+ emotion e_sob;
+ next;
+ menu "Give him some",sM_Give,"Ignore him",sM_Ignore;
+
+ sM_Give:
+ if(countitem(517) == 0) goto L_GoAway; //Meat
+ delitem 517,1; //Meat
+ set @MORRISON,@MORRISON+1;
+ mes "[Little Morrison]";
+ mes "Whoah~!!! It's real Meat, Meat!";
+ mes "Mmmm! It makes my mouth water.";
+ mes "Oh thank you. Now I feel happy. Yum Yum...";
+ emotion e_awsm;
+ close;
+
+ sM_Ignore:
+ set @MORRISON,11;
+ mes "[Little Morrison]";
+ mes "Boo...";
+ mes "Boo... Fine... Alright, Alright~!!! Selfish meanie!";
+ emotion e_bzz;
+ close;
+ M_End:
+ mes "[Little Morrison]";
+ mes "Wahhhh!!! No matter how hard I try, I just can't eat Vegetables";
+ mes "or ^0000ffFruit^000000! They're plain disgusting!!";
+ emotion e_sob;
+ close;
+
+L_GoAway:
+ mes "Pffff... Leave me alone! You DON'T CARE about me! I'm gonna DIE";
+ mes "because of these stupid Veggies and Fuits so MIND your own business!";
+ emotion e_pif;
+ close;
+
+L_Candy:
+ mes "Ah..I am full now. You don't have to feed me any more. I think I";
+ mes "am gonna BURST if I keep eating more.";
+ next;
+ mes "[Little Morrison]";
+ mes "And... um... Take this.";
+ next;
+ getitem 529,3;
+ getitem 530,1;
+ set @MORRISON,0;
+ mes "[Little Morrison]";
+ mes "It is from my secret stash of Candy that I hide from my Mom. Since";
+ mes "you gave me some Meat, I will give you some candy." ;
+ close;
+
+}
+
+// Housewife Marianne ---------------------------------------------------
+prt_in.gat,49,172,2 script Housewife Marianne 53,{
+ mes "[Housewife Marianne]";
+ if(MISC_QUEST&1 || @MORRISON > 10) goto L_Juice;
+ if(@MORRISON) goto L_GaveMeat;
+
+ mes "Morrison!! Please eat some fruit will ya? Fruit~!";
+ mes "*Sob*~!! Like father like son...";
+ emotion e_sob;
+ next;
+ menu "Talk",M_Talk,"Cancel",M_Cancel;
+ close;
+
+ M_Talk:
+ mes "[Housewife Marianne]";
+ mes "(~Sigh~)...This is Morrison... My one and only son. He's going";
+ mes "through some kinda faze and doesn't want to eat any ^0000ffFruits^000000 or";
+ mes "vegetables.";
+ emotion e_shy;
+ next;
+ mes "[Housewife Marianne]";
+ mes "Look at his face..., it turns sour just hearing about ^0000ffFruit^000000...";
+ next;
+ mes "[Housewife Marianne]";
+ mes "All he wants to eat is but ^ff0000Meat^000000... (sigh)...he needs";
+ mes "^0000ffFruits^000000 and vegetables for a proper diet.";
+ next;
+
+ M_Cancel:
+ mes "[Housewife Marianne]";
+ mes "Morrison!! I will get mad at you if you keep doing this!";
+ emotion e_bzz;
+ close;
+
+L_GaveMeat:
+ set @MORRISON,0;
+ mes "Oh MY GOD!!... Oh lord...";
+ emotion e_omg;
+ next;
+ mes "[Housewife Marianne]";
+ mes "WHAT ARE YOU DOING!! HOW DARE YOU feed my son!! And ^ff0000MEAT^000000 of all things!!!";
+ next;
+ mes "[Housewife Marianne]";
+ mes "Arrrgh~~!! Get Lost right now!!!!!!";
+ emotion e_pif;
+ close;
+
+L_Juice:
+ mes "Thank you for not giving my son any meat. I'm trying to feed him";
+ mes "^0000ffFruits^000000 and vegetables, but this child doesn't want to eat";
+ mes "anything except Meat...";
+ next;
+ mes "[Housewife Marianne]";
+ mes "What if I could turn ^0000ffFruits^000000 into a ^0000ffJuice^000000... for example...Orange";
+ mes "juice... Would my child like it?";
+ emotion e_hmm;
+ next;
+ mes "[Housewife Marianne]";
+ mes "Ah! Now I remember..There is a town where you can get a variety of";
+ mes "^0000ffFruit^000000 turned into ^0000ffFruit Juices^000000.";
+ emotion e_ic;
+ next;
+ mes "[Housewife Marianne]";
+ mes "... Was is it...^ff0000Payon^000000...or ^ff0000Morroc^000000...?";
+ emotion e_hmm;
+ set @MORRISON,0;
+ set MISC_QUEST,MISC_QUEST | 1;
+ close;
+}
+
+// Juicer Marx Hansen ---------------------------------------------------------
+payon_in03.gat,188,146,5 script Juicer Marx Hansen 86,{
+ mes "[Juicer Marx Hansen]";
+ if(MISC_QUEST&1) goto L_Juice;
+ mes "Welcome to my shop. What brings you here?";
+ next;
+ menu "Conversation",-,"I am just looking around",M_End;
+
+ mes "[Juicer Marx Hansen]";
+ mes "In the earliest years of humanity, fruits were the only substanace availble for people to eat.";
+ mes "Fruits were vital for survival and without them people faced certain death.";
+ mes "During that time Mother Nature was worshiped for her generous offerering.";
+ next;
+ mes "[Juicer Marx Hansen]";
+ mes "Nowadays food is plentifull and it comes in a variety of flavors and forms.";
+ mes "With so many other things to eat, fruits aren't consumed as much as they used to be.";
+ mes "This is especially true among kids who'd rather eat pizza and candy.";
+ next;
+ mes "[Juicer Marx Hansen]";
+ mes "Because of this I wanted to find a way to make young people realize the importance of fuit.";
+ mes "I found that when fruits were turned into juices, they became more digestive and even tasty enough for kids.";
+ close;
+ M_End:
+ mes "[Juicer Marx Hansen]";
+ mes "Ok then.";
+ close;
+
+//--------------
+L_Juice:
+//---------
+ mes "Welcome to my shop. Are you here to process Fruits like everyone else?";
+ next;
+ menu "Yes, I am.",M_1a, "How do you make fruit juice?",M_1b, "Nope.",M_1End;
+
+ M_1a:
+ mes "[Juicer Marx Hansen]";
+ mes "So what kind of fruit juice would you like to process?";
+ next;
+ menu "Apple Juice",sM_1a,"Banana Juice",sM_1b,"Grape Juice",sM_1c,"Carrot Juice",sM_1d,"None.",M_1End;
+
+ sM_1a:
+ callsub sF_Make, 512, "apples", 531;
+ goto M_1a;
+ sM_1b:
+ callsub sF_Make, 513, "bananas", 532;
+ goto M_1a;
+ sM_1c:
+ callsub sF_Make, 514, "grapes", 533;
+ goto M_1a;
+ sM_1d:
+ callsub sF_Make, 515, "carrots", 534;
+ goto M_1a;
+ M_1b:
+ mes "[Juicer Marx Hansen]";
+ mes "# Fruit Juice Info #";
+ mes "- ^FF3355Apple^000000 Juice - Apple x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "- ^D5A500Banana^000000 Juice - Banana x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "- ^FF8800Carrot^000000 Juice - Carrot x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "- ^AA00AAGrape^000000 Juice - Grape x 1 ea, Empty Bottle x 1 ea, 3 zeny.";
+ close;
+ M_1End:
+ mes "[Juicer Marx Hansen]";
+ mes "Oh well... see you next time.";
+ close;
+
+// Subfunction for making juice
+//----------------------------------
+sF_Make:
+ mes "[Juicer Marx Hansen]";
+ mes "How many bottles would you like?";
+ next;
+ menu "I'll tell you.",M_Tell, "As many as possible",-, "I've changed my mind.",M_1End;
+
+ set @amount,1000; //max possible amount of Juice
+ //calc max possible # juices
+ if(Zeny/3 < @amount) set @amount, Zeny/3;
+ if(countitem(getarg(0)) < @amount) set @amount, countitem(getarg(0));
+ if(countitem(713) < @amount) set @amount, countitem(713);
+ if(@amount > 0) goto L_Make;
+ mes "[Juicer Marx Hansen]";
+ mes "Doh! You don't have enough ingredients for a single bottle of juice.";
+ emotion e_gasp;
+ close;
+
+ M_Tell:
+ mes "[Juicer Marx Hansen]";
+ mes "Very well then. Enter 0 if you don't want any. Also you cannot";
+ mes "buy more than 1000 at a time.";
+ next;
+ input @amount;
+ if(@amount < 1 || @amount > 1000) return;
+ if(countitem(getarg(0)) < @amount) goto sL_NoFruits;
+ if(countitem(713) < @amount) goto sL_NoBottles;
+ if(Zeny < @amount * 3) goto sL_NoZeny;
+
+ L_Make:
+ delitem getarg(0), @amount; //del Fruit
+ delitem 713, @amount; //del Empty Bottle
+ set Zeny, Zeny - @amount * 3;
+ getitem getarg(2), @amount; //get Juice
+ mes "[Juicer Marx Hansen]";
+ mes "Here you are. Take it.";
+ close;
+
+ sL_NoFruits:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough fruit.";
+ mes "You need " +@amount+ " " +getarg(1)+ " to make that much juice.";
+ next;
+ return;
+ sL_NoBottles:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough bottles. You need "+@amount+" empty bottle(s) to make that many juice drinks.";
+ next;
+ return;
+ sL_NoZeny:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough zeny. You need " +(@amount*3)+ " zeny, to make that many juice drinks.";
+ next;
+ return;
+}
diff --git a/npc/quests/juperos.txt b/npc/quests/juperos.txt
index 6e189c0e3..9ba600aef 100644
--- a/npc/quests/juperos.txt
+++ b/npc/quests/juperos.txt
@@ -1,132 +1,132 @@
-//===== Athena Script =====================================
-//= Juperos Dungeon Quests
-//===== By ================================================
-//= MasterOfMuppets
-//===== Version ===========================================
-//= 1.0
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//=
-//===== Comments ==========================================
-//= 1.0 First version, partly implemented [MasterOfMuppets]
-//=========================================================
-
-juperos_01.gat,79,91,1 script Sculpture#Juperos1 111,{
-
- mes "^3131FFIt's a sculpture that";
- mes "looks familiar to you.";
- close;
-
-}
-
-juperos_01.gat,100,71,1 script Bronze Statue#Juperos2 111,{
-
- mes "^3131FFIt's an elaborate";
- mes "bronze statue that";
- mes "is twice the height of";
- mes "a normal human being.";
- close;
-
-}
-
-juperos_01.gat,124,92,1 script Stone Statue#Juperos3 111,{
-
- mes "^3131FFIt's an old";
- mes "statue sculpted";
- mes "out of stone.";
- close;
-
-}
-
-//Quest related?
-//juperos_01.gat,x,y,1 script Bronze Statue#Juperos4 111,{
-//
-// mes "^3131FFThere's a peculiar";
-// mes "engraving on the";
-// mes "Bronze Statue's rod.";
-// next;
-// menu "Investigate",s_Invest,"Ignore it",-;
-//
-// close;
-//
-//s_Invest:
-//
-// mes "^3131FFIt's an inscription that's";
-// mes "written in an old language";
-// mes "that you can't understand,";
-// mes "but have no problem reading";
-// mes "and making out the sounds";
-// mes "for some weird reason.";
-// next;
-// mes "[" + strcharinfo(0) + "]";
-// mes "This is creepy!";
-// mes "I know that I'm not";
-// mes "supposed to be able";
-// mes "to read this, but here";
-// mes "I am. I know what sounds";
-// mes "all of these letters make...";
-// next;
-// mes "[" + strcharinfo(0) + "]";
-// mes "Huh. Only a scholar,";
-// mes "maybe someone even in";
-// mes "Juno, could make sense";
-// mes "of what this stuff says.";
-// close;
-//
-//}
-
-juperos_02.gat,1,1,1 script JuperosLvl2QuestInit -1,{
-OnInit:
-while(1)
- {
-
- monster "juperos_02.gat",24,276,"1st Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate1Dead";
- monster "juperos_02.gat",240,29,"2nd Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate2Dead";
- monster "juperos_02.gat",282,183,"3rd Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate3Dead";
- end;
-
-OnGate1Dead:
-
- mapannounce "juperos_02.gat","Have you come seeking Juperos?! It no longer exists...",1,0xFF0000;
- set $JupeGate1,1;
- if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
- end;
-
-OnGate2Dead:
-
- mapannounce "juperos_02.gat","Who are you to come here?",1,0xFF0000;
- set $JupeGate2,1;
- if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
- end;
-
-OnGate3Dead:
-
- mapannounce "juperos_02.gat","Have you come to see me? Fine! Find me first!",1,0xFF0000;
- set $JupeGate3,1;
- if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
- end;
-
-s_WarpOpen:
- attachnpctimer;
- initnpctimer;
- end;
- OnTimer3000:
- mapannounce "juperos_02.gat","Vroom! Vroom!",1,0xBA55D3;
- end;
- OnTimer6000:
- mapannounce "juperos_02.gat","Attention, visitors.",1,0xBA55D3;
- end;
- OnTimer9000:
- mapannounce "juperos_02.gat","You are allowed to enter the next zone for a short period of time. Please use the portal in the center of the map.",1,0xBA55D3;
- enablenpc "JupeWarp2";
- end;
- OnTimer309000:
- mapannounce "juperos_02.gat","The portal has now closed.",1,0xBA55D3;
- disablenpc "JupeWarp2";
- set $JupeGate1,0;
- set $JupeGate2,0;
- set $JupeGate3,0;
- stopnpctimer;
- }
-}
+//===== Athena Script =====================================
+//= Juperos Dungeon Quests
+//===== By ================================================
+//= MasterOfMuppets
+//===== Version ===========================================
+//= 1.0
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//=
+//===== Comments ==========================================
+//= 1.0 First version, partly implemented [MasterOfMuppets]
+//=========================================================
+
+juperos_01.gat,79,91,1 script Sculpture#Juperos1 111,{
+
+ mes "^3131FFIt's a sculpture that";
+ mes "looks familiar to you.";
+ close;
+
+}
+
+juperos_01.gat,100,71,1 script Bronze Statue#Juperos2 111,{
+
+ mes "^3131FFIt's an elaborate";
+ mes "bronze statue that";
+ mes "is twice the height of";
+ mes "a normal human being.";
+ close;
+
+}
+
+juperos_01.gat,124,92,1 script Stone Statue#Juperos3 111,{
+
+ mes "^3131FFIt's an old";
+ mes "statue sculpted";
+ mes "out of stone.";
+ close;
+
+}
+
+//Quest related?
+//juperos_01.gat,x,y,1 script Bronze Statue#Juperos4 111,{
+//
+// mes "^3131FFThere's a peculiar";
+// mes "engraving on the";
+// mes "Bronze Statue's rod.";
+// next;
+// menu "Investigate",s_Invest,"Ignore it",-;
+//
+// close;
+//
+//s_Invest:
+//
+// mes "^3131FFIt's an inscription that's";
+// mes "written in an old language";
+// mes "that you can't understand,";
+// mes "but have no problem reading";
+// mes "and making out the sounds";
+// mes "for some weird reason.";
+// next;
+// mes "[" + strcharinfo(0) + "]";
+// mes "This is creepy!";
+// mes "I know that I'm not";
+// mes "supposed to be able";
+// mes "to read this, but here";
+// mes "I am. I know what sounds";
+// mes "all of these letters make...";
+// next;
+// mes "[" + strcharinfo(0) + "]";
+// mes "Huh. Only a scholar,";
+// mes "maybe someone even in";
+// mes "Juno, could make sense";
+// mes "of what this stuff says.";
+// close;
+//
+//}
+
+juperos_02.gat,1,1,1 script JuperosLvl2QuestInit -1,{
+OnInit:
+while(1)
+ {
+
+ monster "juperos_02.gat",24,276,"1st Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate1Dead";
+ monster "juperos_02.gat",240,29,"2nd Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate2Dead";
+ monster "juperos_02.gat",282,183,"3rd Gate Switch",1674,1,"JuperosLvl2QuestInit::OnGate3Dead";
+ end;
+
+OnGate1Dead:
+
+ mapannounce "juperos_02.gat","Have you come seeking Juperos?! It no longer exists...",1,0xFF0000;
+ set $JupeGate1,1;
+ if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
+ end;
+
+OnGate2Dead:
+
+ mapannounce "juperos_02.gat","Who are you to come here?",1,0xFF0000;
+ set $JupeGate2,1;
+ if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
+ end;
+
+OnGate3Dead:
+
+ mapannounce "juperos_02.gat","Have you come to see me? Fine! Find me first!",1,0xFF0000;
+ set $JupeGate3,1;
+ if($JupeGate1 && $JupeGate2 && $JupeGate3)goto s_WarpOpen;
+ end;
+
+s_WarpOpen:
+ attachnpctimer;
+ initnpctimer;
+ end;
+ OnTimer3000:
+ mapannounce "juperos_02.gat","Vroom! Vroom!",1,0xBA55D3;
+ end;
+ OnTimer6000:
+ mapannounce "juperos_02.gat","Attention, visitors.",1,0xBA55D3;
+ end;
+ OnTimer9000:
+ mapannounce "juperos_02.gat","You are allowed to enter the next zone for a short period of time. Please use the portal in the center of the map.",1,0xBA55D3;
+ enablenpc "JupeWarp2";
+ end;
+ OnTimer309000:
+ mapannounce "juperos_02.gat","The portal has now closed.",1,0xBA55D3;
+ disablenpc "JupeWarp2";
+ set $JupeGate1,0;
+ set $JupeGate2,0;
+ set $JupeGate3,0;
+ stopnpctimer;
+ }
+}
diff --git a/npc/quests/metto_quest.txt b/npc/quests/metto_quest.txt
index fd4a678e5..d1e2244a8 100644
--- a/npc/quests/metto_quest.txt
+++ b/npc/quests/metto_quest.txt
@@ -1,336 +1,336 @@
-//===== eAthena Script =======================================
-//= Metto Quest
-//===== By: ==================================================
-//= I have no idea.
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Metto Quest
-//===== Additional Comments: =================================
-//= Separated from cities/yuno.txt
-//============================================================
-
-
-yuno_in03.gat,25,39,3 script Metto 709,{
- mes "[Metto]";
- if(metto_q == 2 || metto_q == 4 || metto_q == 6) goto L_Check;
- if(metto_q == 1) goto L_Stang;
- if(metto_q == 3) goto L_Kato;
- if(metto_q == 5) goto L_Cici;
- if(metto_q == 7) goto L_Ruined;
- if(metto_q > 7) goto L_Done;
- mes "Whether it be today, tomorrow, or the next day, I spend every moment I have on my research.";
- mes "My whole life has been dedicated to making............";
- next;
- mes "[Metto]";
- mes "NEW YUNO, my own kingdom. In order to do that I must research how this city floats in the air.";
- mes "If I'm able to do so..... my goals will no longer be a mere dream, but a reality!!";
- next;
- mes "[Metto]";
- mes "That ^5544FFWagan^000000 thinks my research means nothing......";
- mes "But he doesn't realize that my ideas have been blessed by the Gods themselves!";
- close;
-
-L_Stang:
- mes "I'm going to ask my colleague ^5533FFStangckle^000000 to help me. I am sure he will be more than willing to help out an old friend.";
- next;
- mes "[Metto]";
- mes "Hmmm.... If I had that fellow's help, this would be much easier.... Pray! Pray to whatever God you believe in that we will succeed!";
- set metto_q, 2;
- close;
-L_Kato:
- mes "What??!! That fool Stangckle said he doesn't want to help me?? This is not good...... My research will slow down considerably.";
- mes "......... What will I do now?!?!?";
- emotion e_swt2;
- next;
- mes "[Metto]";
- mes "Luckily I have a backup plan. I'm certain that my friend and colleague ^5533FFKato^000000 will lend me a hand.";
- next;
- mes "[Metto]";
- mes "If I could only get a chance to study his super robot, the 'Great Z', I could continue my research.......";
- next;
- mes "[Metto]";
- mes "That Stangckle can have it his way for all I care. Even if he doesn't help me, my research will still go on.... it must!";
- next;
- mes "[Metto]";
- mes "Expect great things from me young friend..... MUHAHAHAHAH!!!!";
- set metto_q, 4;
- emotion e_gg;
- close;
-L_Cici:
- mes "WHAT!?!? You're telling me that the very thing I need to continue my research with... the Great Z.... has been DESTROYED!?!?";
- emotion e_wah;
- next;
- mes "[Metto]";
- mes "NOOOOOOO!!! Why?? How?? Why would he do that? Are the Gods cursing me?!?";
- emotion e_an;
- next;
- mes "[Metto]";
- mes "Wait.... I need to calm down...";
- mes "If I can just get the help of professor ^5533FFCiCi^000000 with his 'Riding Engine Theory', I may be able to finish my research.......";
- next;
- mes "[Metto]";
- mes "*sigggghhhh* I still have hope...... YES I DO!! HAHAHA!!!";
- set metto_q, 6;
- emotion e_gg;
- close;
-L_Check:
- mes "I better get going so I can check this new thing out..... What are you still doing here?";
- mes "I'll be leaving in a bit. I need to get ready so why don't you go ahead and just take off.......";
- close;
-L_Ruined:
- mes "............................";
- next;
- mes "[Metto]";
- mes "How could something like this happen?? All 3 of my colleagues abandoning me all at once?!?!";
- mes "It's true....... the Gods HAVE forsaken me..... I'm ruined...... RUINED!!!";
- emotion e_sob;
- next;
- mes "[Metto]";
- mes "What else can I do now? Has the time really come for me to let go of all of my research?....";
- mes "Those many, many years of research?........";
- emotion e_sob;
- next;
- mes "[Metto]";
- mes "You must be disappointed...... but please, forget about all of this... forget about me........";
- mes "Who would do this to me? What kind of malicious person would shatter a man's dreams??";
- next;
- mes "[Metto]";
- mes "I suddenly feel tired now....... It's time for me to give up....... It's all over. Please don't be too disappointed.......";
- set metto_q, 8;
- close;
-L_Done:
- mes "Maybe I should look into getting a job change. I hear it's a popular thing to do these days. I wonder what profession I should go into?";
- mes "All I know for sure is that I don't want to be a scientist anymore.";
- next;
- mes "[Metto]";
- mes "I'm done with research forever.............";
- close;
-}
-
-//=====================================================================
-yuno_in01.gat,18,95,5 script Stangckle 99,{
- mes "[Stangckle]";
- if(metto_q > 2) goto L_Done;
- if(metto_q == 2) goto L_Start;
- mes "I am one of the scientists in this city. My name is ^5533FFStangckle^000000.";
- mes "Remember my name for it may be useful to you in the future. Who knows, I may just invent something incredible.";
- close;
-L_Start:
- mes "What can I do for you? My colleague Metto is coming here soon, so I don't have much time.";
- mes "So what did you say you needed??";
- next;
- menu "I need to talk to you about Metto!!",-, "Actually I don't need anything.",M_End;
-
- mes "[Stangckle]";
- mes "......................";
- next;
- mes "[Stangckle]";
- mes "..................................";
- next;
- mes "[Stangckle]";
- mes "Is this true?? Metto doesn't think of me as a colleague, and is only USING me?";
- mes "He sees me as a lowly assistant and is going to STEAL all the CREDIT for our discoveries?!!";
- emotion e_omg;
- next;
- mes "[Stangckle]";
- mes "I can't believe I trusted him..... the rumors were true.... he IS a selfish mad man!!!.......";
- mes "And to think I respected a scumbag like that!!";
- emotion e_pif;
- next;
- mes "[Stangckle]";
- mes "I don't think I can even bear to see his disgusting face anymore.....";
- next;
- mes "[Stangckle]";
- mes "I'm glad that an honest and trustworthy person such as yourself had the guts to tell me the ugly truth about Metto.";
- mes "Thank you for sharing that information with me.";
- next;
- mes "[Stangckle]";
- mes "Now if you'll excuse me, I have some work to do.";
- set metto_q, 3;
- close;
- M_End:
- mes "[Stangckle]";
- mes "What are you doing here then? Stop wasting my time.";
- emotion e_swt;
- close;
-L_Done:
- mes "So Metto was truly a mad scientist after all...... I guess he will be the one who will ultimately pay for that choice.......";
- close;
-}
-
-//===================================================================
-yuno_in01.gat,19,182,3 script Kato 55,{
- mes "[Kato]";
- if(metto_q > 4) goto L_Done;
- if(metto_q == 4) goto L_Start;
- mes "I am a scientist that specializes in ^5533FFArtificial Intelligence and Robotics^000000.";
- mes "Although I'm not working on a specific project at this moment, my latest creation the 'Great Z' is truly a work of sheer genius!";
- close;
-
-L_Start:
- mes "As a scientist I research many different things.... of course this research is private. What can I do for you?";
- next;
- menu "I have news from Metto!",-, "Just wanted to say hello.",M_End;
-
- mes "[Kato]";
- mes "WHAT!!?? Metto said my Great Z is INFERIOR to Stangckles research!!??";
- mes "He.... he said I should rename it to 'LAME Z'??.......";
- emotion e_omg;
- next;
- mes "[Kato]";
- mes "*Sniff* I... I don't believe it.... *sob* how could he say that?..... If... if my invention is no good.....";
- mes "Then I guess I should destroy it.... my Great Z.... *sigh*";
- emotion e_sob;
- next;
- mes "[Kato]";
- mes "How could that Metto be such a heartless bastard?? Thank you for letting me know Metto's TRUE feelings about my work.";
- set metto_q, 5;
- close;
- M_End:
- mes "[Kato]";
- mes "........... Okay.... Um.... Hey........";
- close;
-
-L_Done:
- mes "I am interested in researching artificial intelligence. You know, like robots.";
- mes "I know that it is something very difficult to accomplish, but where there's a will, there's a way.";
- next;
- mes "[Kato]";
- mes "If you ever see something amazing that is similar to what I described, you'll know that it's my handwork.";
- close;
-}
-
-//===================================================================
-yuno_in03.gat,179,43,5 script CiCi 121,{
- mes "[CiCi]";
- if(metto_q > 6) goto L_Done;
- mes "My name is ^5533FFCiCi^000000. I am one of the ^5533FF3 great scientists^000000 that live in this city.";
- mes "Although there are many great scientists in this town, being one of the top 3 is a true honor don't you think??";
- if(metto_q == 6) goto L_Start;
- close;
-
-L_Start:
- next;
- mes "[CiCi]";
- mes "Heh, I guess I was being a little to egoistical there.... anyways what can I do for you?";
- next;
- menu "Metto wanted me to tell you this......",-, "Nothing, just saying hey.",M_End;
-
- mes "[CiCi]";
- mes "Hmm?? Metto said that he doesn't need my Riding Engine Theory?? Hmphf! How dare he!!!";
- emotion e_pif;
- next;
- mes "[CiCi]";
- mes "I have half a mind to teach him a little something about TRUE science and INTELLIGENT research!!";
- emotion e_ag;
- next;
- mes "[CiCi]";
- mes "... Whatever.... I don't have the necessary equipment to help him anyways.";
- mes "I guess, either way, he didn't have a chance.";
- next;
- mes "[CiCi]";
- mes "Let him know that I didn't really want to be a part of what he was doing in the first place.";
- mes "He isn't even doing the type of research that could be publicized.........";
- set metto_q, 7;
- close;
-
- M_End:
- mes "[CiCi]";
- mes "What? That's it? You just wanted to waste some time?...........";
- emotion e_swt;
- close;
-
-L_Done:
- mes "Hmm... I want to improve the Riding Engine but I lack the necessary parts. What a headache....";
- mes "Metto never offered me any help at all. This is not going to be easy.......";
- close;
-}
-
-//===================================================================
-yuno_in01.gat,18,30,3 script Wagan 85,{
- mes "[Wagan]";
- if(metto_q > 0) goto L_Check;
- mes "I'm sure you know that our village has been able to prosper for many years because of the brilliant research done here.";
- mes "We owe a great deal to those who have dedicated their lives to research and study.";
- next;
- mes "[Wagan]";
- mes "It is because of them that we can enjoy such a wonderful quality of life here.";
- mes "They have been able to work together and support each other which is great to see.";
- next;
- mes "[Wagan]";
- mes "Unfortunately there are a few 'bad apples' that cause problems within this solid community of researchers.";
- next;
- mes "[Wagan]";
- mes "These people just drive me crazy!";
- emotion e_an;
- next;
- mes "[Wagan]";
- mes "They think only of themselves and their crazy actions make it much more difficult for everyone else.";
- mes "Out of those few selfish mad men, ^FF3333'Metto'^000000 must be the worst by far.";
- next;
- mes "[Wagan]";
- mes "This disturbed individual does nothing but destroy public facilities, create harmful pollutants, disrupt other peoples lives......";
- next;
- mes "[Wagan]";
- mes "..... the list goes on and on. What's worse..... He tries to justify his dreadful actions by calling it 'research'!!!!";
- mes "He has definitely lost his sanity and has gone too far!!";
- emotion e_ag;
- next;
- mes "[Wagan]";
- mes "If only there was a way to stop this mad man from destroying our community......";
- mes "I just wish there was someone capable and brave enough to put an end to ^FF3333Metto's^000000 insanity.......";
- next;
- menu "Leave it to me.",-, "I wish your city the best of luck...",M_End;
-
- mes "[Wagan]";
- mes "Oh?? Are you really going to help us stop Metto? Our city would be very grateful if you could do this.......";
- mes "But how exactly do you plan on accomplishing this rather difficult task?";
- emotion e_what;
- next;
- menu "Yeah it's pretty hard....",M_End, "Well, I guess I need to think of a plan now.....",-;
-
- mes "[Wagan]";
- mes "Yes a solid plan will be necessary to put a stop to Metto. You will need to trick him into quitting his evil experiments somehow......";
- mes "It will have to be something subtle like....... hmm........";
- next;
- mes "[Wagan]";
- mes "... Sabotaging his experiments in a way that makes it look like he was destined to fail.";
- mes "He is talkative so you may be able to get him to tell you everything you need to know about his work.";
- next;
- mes "[Wagan]";
- mes "To be honest.... I have been thinking about this plan for a while.........";
- set metto_q, 1;
- close;
- M_End:
- mes "[Wagan]";
- mes "We will have to hope that fate will be on our side as we wait for things to unfold......";
- mes "Come to think of it.... Metto is a strong believer in fate..... If we could only use that to your advantage somehow....";
- close;
-L_Check:
- if(metto_q == 8) goto L_Thank;
- if(metto_q == 9) goto L_Done;
- mes "How goes your work on sabotaging Metto's experiments? Hopefully the plan is going well.";
- mes "I'm sorry to involve you in our city's problems, but we really do appreciate you efforts.";
- close;
-L_Thank:
- mes "Is this true? You were able to shut down Metto's research? Thank you sooo much for your help.";
- mes "Without Metto causing trouble we have a lot less to worry about.";
- emotion e_ic;
- next;
- mes "[Wagan]";
- mes "The people of this city are grateful to you. Here is a little token of our appreciation......";
- next;
- mes "[Wagan]";
- mes "Thank you once again for your assistance! I wish you the best of luck in all of your future endeavors!!!";
- getitem 715,10;
- emotion e_thx;
- set metto_q, 9;
- close;
-L_Done:
- mes "Things have been much more peaceful around here now that Metto has been shut down. Thank you once again for your help.";
- emotion e_thx;
- close;
+//===== eAthena Script =======================================
+//= Metto Quest
+//===== By: ==================================================
+//= I have no idea.
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Metto Quest
+//===== Additional Comments: =================================
+//= Separated from cities/yuno.txt
+//============================================================
+
+
+yuno_in03.gat,25,39,3 script Metto 709,{
+ mes "[Metto]";
+ if(metto_q == 2 || metto_q == 4 || metto_q == 6) goto L_Check;
+ if(metto_q == 1) goto L_Stang;
+ if(metto_q == 3) goto L_Kato;
+ if(metto_q == 5) goto L_Cici;
+ if(metto_q == 7) goto L_Ruined;
+ if(metto_q > 7) goto L_Done;
+ mes "Whether it be today, tomorrow, or the next day, I spend every moment I have on my research.";
+ mes "My whole life has been dedicated to making............";
+ next;
+ mes "[Metto]";
+ mes "NEW YUNO, my own kingdom. In order to do that I must research how this city floats in the air.";
+ mes "If I'm able to do so..... my goals will no longer be a mere dream, but a reality!!";
+ next;
+ mes "[Metto]";
+ mes "That ^5544FFWagan^000000 thinks my research means nothing......";
+ mes "But he doesn't realize that my ideas have been blessed by the Gods themselves!";
+ close;
+
+L_Stang:
+ mes "I'm going to ask my colleague ^5533FFStangckle^000000 to help me. I am sure he will be more than willing to help out an old friend.";
+ next;
+ mes "[Metto]";
+ mes "Hmmm.... If I had that fellow's help, this would be much easier.... Pray! Pray to whatever God you believe in that we will succeed!";
+ set metto_q, 2;
+ close;
+L_Kato:
+ mes "What??!! That fool Stangckle said he doesn't want to help me?? This is not good...... My research will slow down considerably.";
+ mes "......... What will I do now?!?!?";
+ emotion e_swt2;
+ next;
+ mes "[Metto]";
+ mes "Luckily I have a backup plan. I'm certain that my friend and colleague ^5533FFKato^000000 will lend me a hand.";
+ next;
+ mes "[Metto]";
+ mes "If I could only get a chance to study his super robot, the 'Great Z', I could continue my research.......";
+ next;
+ mes "[Metto]";
+ mes "That Stangckle can have it his way for all I care. Even if he doesn't help me, my research will still go on.... it must!";
+ next;
+ mes "[Metto]";
+ mes "Expect great things from me young friend..... MUHAHAHAHAH!!!!";
+ set metto_q, 4;
+ emotion e_gg;
+ close;
+L_Cici:
+ mes "WHAT!?!? You're telling me that the very thing I need to continue my research with... the Great Z.... has been DESTROYED!?!?";
+ emotion e_wah;
+ next;
+ mes "[Metto]";
+ mes "NOOOOOOO!!! Why?? How?? Why would he do that? Are the Gods cursing me?!?";
+ emotion e_an;
+ next;
+ mes "[Metto]";
+ mes "Wait.... I need to calm down...";
+ mes "If I can just get the help of professor ^5533FFCiCi^000000 with his 'Riding Engine Theory', I may be able to finish my research.......";
+ next;
+ mes "[Metto]";
+ mes "*sigggghhhh* I still have hope...... YES I DO!! HAHAHA!!!";
+ set metto_q, 6;
+ emotion e_gg;
+ close;
+L_Check:
+ mes "I better get going so I can check this new thing out..... What are you still doing here?";
+ mes "I'll be leaving in a bit. I need to get ready so why don't you go ahead and just take off.......";
+ close;
+L_Ruined:
+ mes "............................";
+ next;
+ mes "[Metto]";
+ mes "How could something like this happen?? All 3 of my colleagues abandoning me all at once?!?!";
+ mes "It's true....... the Gods HAVE forsaken me..... I'm ruined...... RUINED!!!";
+ emotion e_sob;
+ next;
+ mes "[Metto]";
+ mes "What else can I do now? Has the time really come for me to let go of all of my research?....";
+ mes "Those many, many years of research?........";
+ emotion e_sob;
+ next;
+ mes "[Metto]";
+ mes "You must be disappointed...... but please, forget about all of this... forget about me........";
+ mes "Who would do this to me? What kind of malicious person would shatter a man's dreams??";
+ next;
+ mes "[Metto]";
+ mes "I suddenly feel tired now....... It's time for me to give up....... It's all over. Please don't be too disappointed.......";
+ set metto_q, 8;
+ close;
+L_Done:
+ mes "Maybe I should look into getting a job change. I hear it's a popular thing to do these days. I wonder what profession I should go into?";
+ mes "All I know for sure is that I don't want to be a scientist anymore.";
+ next;
+ mes "[Metto]";
+ mes "I'm done with research forever.............";
+ close;
+}
+
+//=====================================================================
+yuno_in01.gat,18,95,5 script Stangckle 99,{
+ mes "[Stangckle]";
+ if(metto_q > 2) goto L_Done;
+ if(metto_q == 2) goto L_Start;
+ mes "I am one of the scientists in this city. My name is ^5533FFStangckle^000000.";
+ mes "Remember my name for it may be useful to you in the future. Who knows, I may just invent something incredible.";
+ close;
+L_Start:
+ mes "What can I do for you? My colleague Metto is coming here soon, so I don't have much time.";
+ mes "So what did you say you needed??";
+ next;
+ menu "I need to talk to you about Metto!!",-, "Actually I don't need anything.",M_End;
+
+ mes "[Stangckle]";
+ mes "......................";
+ next;
+ mes "[Stangckle]";
+ mes "..................................";
+ next;
+ mes "[Stangckle]";
+ mes "Is this true?? Metto doesn't think of me as a colleague, and is only USING me?";
+ mes "He sees me as a lowly assistant and is going to STEAL all the CREDIT for our discoveries?!!";
+ emotion e_omg;
+ next;
+ mes "[Stangckle]";
+ mes "I can't believe I trusted him..... the rumors were true.... he IS a selfish mad man!!!.......";
+ mes "And to think I respected a scumbag like that!!";
+ emotion e_pif;
+ next;
+ mes "[Stangckle]";
+ mes "I don't think I can even bear to see his disgusting face anymore.....";
+ next;
+ mes "[Stangckle]";
+ mes "I'm glad that an honest and trustworthy person such as yourself had the guts to tell me the ugly truth about Metto.";
+ mes "Thank you for sharing that information with me.";
+ next;
+ mes "[Stangckle]";
+ mes "Now if you'll excuse me, I have some work to do.";
+ set metto_q, 3;
+ close;
+ M_End:
+ mes "[Stangckle]";
+ mes "What are you doing here then? Stop wasting my time.";
+ emotion e_swt;
+ close;
+L_Done:
+ mes "So Metto was truly a mad scientist after all...... I guess he will be the one who will ultimately pay for that choice.......";
+ close;
+}
+
+//===================================================================
+yuno_in01.gat,19,182,3 script Kato 55,{
+ mes "[Kato]";
+ if(metto_q > 4) goto L_Done;
+ if(metto_q == 4) goto L_Start;
+ mes "I am a scientist that specializes in ^5533FFArtificial Intelligence and Robotics^000000.";
+ mes "Although I'm not working on a specific project at this moment, my latest creation the 'Great Z' is truly a work of sheer genius!";
+ close;
+
+L_Start:
+ mes "As a scientist I research many different things.... of course this research is private. What can I do for you?";
+ next;
+ menu "I have news from Metto!",-, "Just wanted to say hello.",M_End;
+
+ mes "[Kato]";
+ mes "WHAT!!?? Metto said my Great Z is INFERIOR to Stangckles research!!??";
+ mes "He.... he said I should rename it to 'LAME Z'??.......";
+ emotion e_omg;
+ next;
+ mes "[Kato]";
+ mes "*Sniff* I... I don't believe it.... *sob* how could he say that?..... If... if my invention is no good.....";
+ mes "Then I guess I should destroy it.... my Great Z.... *sigh*";
+ emotion e_sob;
+ next;
+ mes "[Kato]";
+ mes "How could that Metto be such a heartless bastard?? Thank you for letting me know Metto's TRUE feelings about my work.";
+ set metto_q, 5;
+ close;
+ M_End:
+ mes "[Kato]";
+ mes "........... Okay.... Um.... Hey........";
+ close;
+
+L_Done:
+ mes "I am interested in researching artificial intelligence. You know, like robots.";
+ mes "I know that it is something very difficult to accomplish, but where there's a will, there's a way.";
+ next;
+ mes "[Kato]";
+ mes "If you ever see something amazing that is similar to what I described, you'll know that it's my handwork.";
+ close;
+}
+
+//===================================================================
+yuno_in03.gat,179,43,5 script CiCi 121,{
+ mes "[CiCi]";
+ if(metto_q > 6) goto L_Done;
+ mes "My name is ^5533FFCiCi^000000. I am one of the ^5533FF3 great scientists^000000 that live in this city.";
+ mes "Although there are many great scientists in this town, being one of the top 3 is a true honor don't you think??";
+ if(metto_q == 6) goto L_Start;
+ close;
+
+L_Start:
+ next;
+ mes "[CiCi]";
+ mes "Heh, I guess I was being a little to egoistical there.... anyways what can I do for you?";
+ next;
+ menu "Metto wanted me to tell you this......",-, "Nothing, just saying hey.",M_End;
+
+ mes "[CiCi]";
+ mes "Hmm?? Metto said that he doesn't need my Riding Engine Theory?? Hmphf! How dare he!!!";
+ emotion e_pif;
+ next;
+ mes "[CiCi]";
+ mes "I have half a mind to teach him a little something about TRUE science and INTELLIGENT research!!";
+ emotion e_ag;
+ next;
+ mes "[CiCi]";
+ mes "... Whatever.... I don't have the necessary equipment to help him anyways.";
+ mes "I guess, either way, he didn't have a chance.";
+ next;
+ mes "[CiCi]";
+ mes "Let him know that I didn't really want to be a part of what he was doing in the first place.";
+ mes "He isn't even doing the type of research that could be publicized.........";
+ set metto_q, 7;
+ close;
+
+ M_End:
+ mes "[CiCi]";
+ mes "What? That's it? You just wanted to waste some time?...........";
+ emotion e_swt;
+ close;
+
+L_Done:
+ mes "Hmm... I want to improve the Riding Engine but I lack the necessary parts. What a headache....";
+ mes "Metto never offered me any help at all. This is not going to be easy.......";
+ close;
+}
+
+//===================================================================
+yuno_in01.gat,18,30,3 script Wagan 85,{
+ mes "[Wagan]";
+ if(metto_q > 0) goto L_Check;
+ mes "I'm sure you know that our village has been able to prosper for many years because of the brilliant research done here.";
+ mes "We owe a great deal to those who have dedicated their lives to research and study.";
+ next;
+ mes "[Wagan]";
+ mes "It is because of them that we can enjoy such a wonderful quality of life here.";
+ mes "They have been able to work together and support each other which is great to see.";
+ next;
+ mes "[Wagan]";
+ mes "Unfortunately there are a few 'bad apples' that cause problems within this solid community of researchers.";
+ next;
+ mes "[Wagan]";
+ mes "These people just drive me crazy!";
+ emotion e_an;
+ next;
+ mes "[Wagan]";
+ mes "They think only of themselves and their crazy actions make it much more difficult for everyone else.";
+ mes "Out of those few selfish mad men, ^FF3333'Metto'^000000 must be the worst by far.";
+ next;
+ mes "[Wagan]";
+ mes "This disturbed individual does nothing but destroy public facilities, create harmful pollutants, disrupt other peoples lives......";
+ next;
+ mes "[Wagan]";
+ mes "..... the list goes on and on. What's worse..... He tries to justify his dreadful actions by calling it 'research'!!!!";
+ mes "He has definitely lost his sanity and has gone too far!!";
+ emotion e_ag;
+ next;
+ mes "[Wagan]";
+ mes "If only there was a way to stop this mad man from destroying our community......";
+ mes "I just wish there was someone capable and brave enough to put an end to ^FF3333Metto's^000000 insanity.......";
+ next;
+ menu "Leave it to me.",-, "I wish your city the best of luck...",M_End;
+
+ mes "[Wagan]";
+ mes "Oh?? Are you really going to help us stop Metto? Our city would be very grateful if you could do this.......";
+ mes "But how exactly do you plan on accomplishing this rather difficult task?";
+ emotion e_what;
+ next;
+ menu "Yeah it's pretty hard....",M_End, "Well, I guess I need to think of a plan now.....",-;
+
+ mes "[Wagan]";
+ mes "Yes a solid plan will be necessary to put a stop to Metto. You will need to trick him into quitting his evil experiments somehow......";
+ mes "It will have to be something subtle like....... hmm........";
+ next;
+ mes "[Wagan]";
+ mes "... Sabotaging his experiments in a way that makes it look like he was destined to fail.";
+ mes "He is talkative so you may be able to get him to tell you everything you need to know about his work.";
+ next;
+ mes "[Wagan]";
+ mes "To be honest.... I have been thinking about this plan for a while.........";
+ set metto_q, 1;
+ close;
+ M_End:
+ mes "[Wagan]";
+ mes "We will have to hope that fate will be on our side as we wait for things to unfold......";
+ mes "Come to think of it.... Metto is a strong believer in fate..... If we could only use that to your advantage somehow....";
+ close;
+L_Check:
+ if(metto_q == 8) goto L_Thank;
+ if(metto_q == 9) goto L_Done;
+ mes "How goes your work on sabotaging Metto's experiments? Hopefully the plan is going well.";
+ mes "I'm sorry to involve you in our city's problems, but we really do appreciate you efforts.";
+ close;
+L_Thank:
+ mes "Is this true? You were able to shut down Metto's research? Thank you sooo much for your help.";
+ mes "Without Metto causing trouble we have a lot less to worry about.";
+ emotion e_ic;
+ next;
+ mes "[Wagan]";
+ mes "The people of this city are grateful to you. Here is a little token of our appreciation......";
+ next;
+ mes "[Wagan]";
+ mes "Thank you once again for your assistance! I wish you the best of luck in all of your future endeavors!!!";
+ getitem 715,10;
+ emotion e_thx;
+ set metto_q, 9;
+ close;
+L_Done:
+ mes "Things have been much more peaceful around here now that Metto has been shut down. Thank you once again for your help.";
+ emotion e_thx;
+ close;
} \ No newline at end of file
diff --git a/npc/quests/monstertamers.txt b/npc/quests/monstertamers.txt
index c965a7c99..b3ef8c297 100644
--- a/npc/quests/monstertamers.txt
+++ b/npc/quests/monstertamers.txt
@@ -1,440 +1,440 @@
-//===== eAthena Script =======================================
-//= Monster Tamers
-//===== By: ==================================================
-//= kobra_k88, Darkchild, x[tsk]
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Cute pet quest items
-//===== Additional Comments: =================================
-//= May not have all of the Monster Tamers, but the ones here are fully working.
-//= 1.1 Fixed exploits [Lupus]
-//= 1.2 Removed Duplicates [Silent]
-//============================================================
-
-
-//<================================================= Alberta ===============================================>\\
-alberta_in.gat,173,77,3 script Monster Tamer#01 125,{
- mes "[Monster Tamer Iwado]";
- mes "Monster taming has never been more popular than it is now! Why not join in on all of the excitement?....";
-M_Menu:
- next;
- menu "^5555FFMonster Taming^000000",M_0,
- "^5555FF'Monster Juice'^000000",M_1,
- "^5555FF'Singing Flower'^000000",M_2,
- "^5555FF'Wild Flower'^000000",M_3,
- "Please make one for me",M_Make,
- "Cancel",M_End;
- M_0:
- mes "[Monster Tamer Iwado]";
- mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
- mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
- next;
- mes "[Monster Tamer Iwado]";
- mes "These Taming Items are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Here the Taming Items that I offer:";
- mes "^5555FF'Monster Juice'^000000";
- mes "^5555FF'Singing Flower'^000000";
- mes "^5555FF'Wild Flower'^000000";
- next;
- mes "[Monster Tamer Iwado]";
- mes "These are fantastic items! You should really give them a try!";
- goto M_Menu;
- M_1:
- mes "[Monster Tamer Iwado]";
- mes "It is a drink made from animal blood. It's nothing a person would want to drink, but for the monster '^FF5555'Hunter Fly'^000000, it's a delicacy.";
- next;
- mes "[Monster Tamer Iwado]";
- mes "I can give you a ^5555FF'Monster Juice'^000000 in exchange for:";
- mes "-^FF5555'1 Animal Gore'";
- mes "-'2 Apples'^000000";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_2:
- mes "[Monster Tamer Iwado]";
- mes "The flower of a Singing Plant. It is a very unique and unusual item that seems to attract ^FF5555'Rockers'^000000.";
- next;
- mes "[Monster Tamer Iwado]";
- mes "I can give you a ^5555FF'Singing Flower'^000000 in exchange for:";
- mes "-^FF5555'1 Singing Plant'^000000";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_3:
- mes "[Monster Tamer Iwado]";
- mes "This flower blooms naturally here in Rune-Midgard. It can be used as armor for your ^FF5555Orc Warrior^000000 pet.";
- mes "I can give you a ^5555FF'Wild Flower'^000000 in exchange for:";
- mes "-^FF5555'1 Fancy Flower'";
- mes "-'1 Clover'^000000";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_Make:
- mes "[Monster Tamer Iwado]";
- mes "Which Taming Item would you like?";
- next;
- menu "^5555FF'Monster Juice'^000000",sM_1, "^5555FF'Singing Flower'^000000",sM_2, "^5555FF'Wild Flower'^000000",sM_3, "Cancel",M_End;
-
- sM_1:
- if(countitem(702)<1 || countitem(512)<2) goto sL_NoItems;
- delitem 702,1;
- delitem 512,2;
- mes "[Monster Tamer Iwado]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Here you are! A Monster Juice! Enjoy and feel free to come back anytime.";
- getitem 626,1;
- close;
- sM_2:
- if(countitem(707)<1) goto sL_NoItems;
- delitem 707,1;
- mes "[Monster Tamer Iwado]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Here you are! A Singing Flower! Enjoy and feel free to come back anytime.";
- getitem 629,1;
- close;
- sM_3:
- if(countitem(2207)<1 || countitem(705)<1) goto sL_NoItems;
- delitem 2207,1;
- delitem 705,1;
- mes "[Monster Tamer Iwado]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Iwado]";
- mes "Here you are! A Wild Flower! Enjoy and feel free to come back anytime.";
- getitem 10009,1;
- close;
-
- sL_NoItems:
- mes "[Monster Tamer Iwado]";
- mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
- close;
- M_End:
- mes "[Monster Tamer Iwado]";
- mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
- close;
-
-}
-
-
-//<================================================= Al De Baran ===============================================>\\
-aldeba_in.gat,167,177,3 script Monster Tamer#02 125,{
- mes "[Monster Tamer YuU]";
- mes "You must be looking for some Taming Items.... When it comes to making Taming Items there is no one better than me here in Rune Midgard.";
-M_Menu:
- next;
- menu "^5555FF'Monster Taming'^000000",M_0,
- "^5555FF'Skull Helm'^000000",M_1,
- "^5555FF'Monster Oxygen Mask'^000000",M_2,
- "^5555FF'Silk Ribbon'^000000",M_3,
- "^5555FF'Stellar Hairpin'^000000",M_4,
- "^5555FF'Tiny Egg Shell'^000000",M_5,
- "^5555FF'Rocker Glasses'^000000",M_6,
- "Please make one for me",M_Make,
- "Cancel",M_End;
- M_0:
- mes "[Monster Tamer YuU]";
- mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
- mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you obtain a pet, you must show it love and appreciation. This is the most important part of monster taming.";
- next;
- mes "[Monster Tamer YuU]";
- mes "The best way to show your new pet you care, is to get it an 'Accessory' to make it stand out from the rest of the monsters in Rune Midgard.";
- next;
- mes "[Monster Tamer YuU]";
- mes "These ^5555FF'Cute Pet Accessories'^000000 are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here the Taming Items that I offer:";
- mes "^5555FF'Skull Helm'";
- mes "'Monster Oxygen Mask'";
- mes "'Silk Ribbon'";
- mes "'Stellar Hairpin'";
- mes "'Tiny Egg Shell'";
- mes "'Rocker Glasses'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "These are fantastic items! You should really give them a try!";
- goto M_Menu;
- M_1:
- mes "[Monster Tamer YuU]";
- mes "It may be disgusting, but it has a mysterious power that has the potential to make its wearer go crazy!";
- mes "This item will look great on your '^FF5555'Baphomet Jr.'^000000 pet.";
- next;
- mes "[Monster Tamer YuU]";
- mes "I can give you a ^5555FF'Skull Helm'^000000 in exchange for:";
- mes "-^FF5555'1 Bone Helm'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_2:
- mes "[Monster Tamer YuU]";
- mes "Once worn it makes it difficult to tell whether or not the wearer is a monster or a human.";
- mes "A great gift for your ^FF5555'Choncon', 'Steel Choncon', or 'Hunter Fly'^000000.";
- next;
- mes "[Monster Tamer YuU]";
- mes "I can give you a ^5555FF'Monster Oxygen Mask'^000000 in exchange for:";
- mes "-^FF5555'1 Oxygen Mask'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_3:
- mes "[Monster Tamer YuU]";
- mes "It's a high quality ribbon knitted out of smooth silk. It will make your pet ^FF5555'Lunatic'^000000 look even cuter!.";
- next;
- mes "[Monster Tamer YuU]";
- mes "I can give you a ^5555FF'Silk Ribbon'^000000 in exchange for:";
- mes "-^FF5555'1 Ribbon (0 Slotts)'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_4:
- mes "[Monster Tamer YuU]";
- mes "It is extremely sharp and possesses a mysterious power that makes monsters want to wear it.";
- mes "Your ^FF5555'Green Petite'^000000 will love wearing this!";
- next;
- mes "[Monster Tamer YuU]";
- mes "I can give you a ^5555FF'Stellar Hairpin'^000000 in exchange for:";
- mes "-^FF5555'1 Stellar'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_5:
- mes "[Monster Tamer YuU]";
- mes "This seems to have a peculiar scent and a magnificent shine! It can be used as armor for your ^FF5555'Picky'^000000.";
- mes "I can give you a ^5555FF'Tiny Egg Shell'^000000 in exchange for:";
- mes "-^FF5555'1 Egg Shell'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_6:
- mes "[Monster Tamer YuU]";
- mes "Mysterious pair of eye glasses which make its wearer look like a geek. It's perfect for your ^FF5555Rocker^000000 pet.";
- next;
- mes "[Monster Tamer YuU]";
- mes "I can give you a pair of ^5555FF'Rocker Glasses'^000000 in exchange for:";
- mes "-^FF5555'1 Ribbon (0 Slotts)'";
- mes "-'2 Zargon'";
- mes "-'400 Zeny'^000000";
- next;
- mes "[Monster Tamer YuU]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_Make:
- mes "[Monster Tamer YuU]";
- mes "Which Taming Item would you like?";
- next;
- menu "^5555FF'Skull Helm'^000000",sM_1,
- "^5555FF'Monster Oxygen Mask'^000000",sM_2,
- "^5555FF'Silk Ribbon'^000000",sM_3,
- "^5555FF'Stellar Hairpin'^000000",sM_4,
- "^5555FF'Tiny Egg Shell'^000000",sM_5,
- "^5555FF'Rocker Glasses'^000000",sM_6,
- "Cancel",M_End;
-
- sM_1:
- if(countitem(5017)<1) goto sL_NoItems;
- delitem 5017,1;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! A Skull Helm! Enjoy and feel free to come back anytime.";
- getitem 10001,1;
- close;
- sM_2:
- if(countitem(5004)<1) goto sL_NoItems;
- delitem 5004,1;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! A Monster Oxygen Mask! Enjoy and feel free to come back anytime.";
- getitem 10002,1;
- close;
- sM_3:
- if(countitem(2208)<1) goto sL_NoItems;
- delitem 2208,1;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! A Silk Ribbon! Enjoy and feel free to come back anytime.";
- getitem 10007,1;
- close;
- sM_4:
- if(countitem(2294)<1) goto sL_NoItems;
- delitem 2294,1;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! Stellar Hairpin! Enjoy and feel free to come back anytime.";
- getitem 10011,1;
- close;
- sM_5:
- if(countitem(5015)<1) goto sL_NoItems;
- delitem 5015,1;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! A Tiny Egg Shell! Enjoy and feel free to come back anytime.";
- getitem 10012,1;
- close;
- sM_6:
- if(countitem(2208)<1 || countitem(912)<2 || Zeny<400) goto sL_NoItems;
- delitem 2208,1;
- delitem 912,2;
- set Zeny, Zeny-400;
- mes "[Monster Tamer YuU]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer YuU]";
- mes "Here you are! A pair of Rocker Glasses! Enjoy and feel free to come back anytime.";
- getitem 10014,1;
- close;
-
- sL_NoItems:
- mes "[Monster Tamer YuU]";
- mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
- close;
- M_End:
- mes "[Monster Tamer YuU]";
- mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
- close;
-
-}
-
-
-//<================================================= Izlude ===============================================>\\
-izlude_in.gat,128,64,3 script Monster Tamer#03 125,{
- mes "[Monster Tamer Shogo]";
- mes "Are you pre-occupied with gathering items for your cute pets, and want a break? Then let us find those items for you.....";
-M_Menu:
- next;
- menu "^5555FFMonster Taming^000000",M_0,
- "^5555FF'Book of Devil'^000000",M_1,
- "^5555FF'No Recipient'^000000",M_2,
- "^5555FF'Horror of Tribe'^000000",M_3,
- "Please make one for me",M_Make,
- "Cancel",M_End;
- M_0:
- mes "[Monster Tamer Shogo]";
- mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
- mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
- next;
- mes "[Monster Tamer Shogo]";
- mes "These Taming Items are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Here the Taming Items that I offer:";
- mes "^5555FF'Book of Devil'^000000,";
- mes "^5555FF'No Recipient'^000000,";
- mes "^5555FF'Horror of Tribe'^000000.";
- next;
- mes "[Monster Tamer Shogo]";
- mes "These are fantastic items! You should really give them a try!";
- goto M_Menu;
- M_1:
- mes "[Monster Tamer Shogo]";
- mes "This book is far too powerfull for any mere mortal to read and contains the secret method of summoning a devil!";
- mes "Use it to lure the monster ^FF5555'Baphomet Jr.'^000000.";
- next;
- mes "[Monster Tamer Shogo]";
- mes "I can give you a ^5555FF'Book of Devil'^000000 in exchange for:";
- mes "-^FF5555'1 Old Magic Book'";
- mes "-'2 Horrendous Mouth'^000000";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_2:
- mes "[Monster Tamer Shogo]";
- mes "An old letter which wasn't delivered because of an unkown recipient.";
- mes "It has no meaning to any living human, but ^FF5555'Munaks'^000000 seem to be very fond of it.";
- next;
- mes "[Monster Tamer Shogo]";
- mes "I can give you a ^5555FF'No Recipient'^000000 in exchange for:";
- mes "-^FF5555'1 Old Portrait'^000000";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_3:
- mes "[Monster Tamer Shogo]";
- mes "This trophy is an ^FF5555'Orc Warrior's'^000000 favorite item.";
- mes "I can give you a ^5555FF'Horror of Tribe'^000000 in exchange for:";
- mes "-^FF5555'1 Chivalry Emblem'";
- mes "-'1 Scorpion Tail'^000000";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
- goto M_Menu;
- M_Make:
- mes "[Monster Tamer Shogo]";
- mes "Which Taming Item would you like?";
- next;
- menu "^5555FF'Book of Devil'^000000",sM_1, "^5555FF'No Recipient'^000000",sM_2, "^5555FF'Horror of Tribe'^000000",sM_3, "Cancel",M_End;
-
- sM_1:
- if(countitem(1006)<1 || countitem(958)<2) goto sL_NoItems;
- delitem 1006,1;
- delitem 958,2;
- mes "[Monster Tamer Shogo]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Here you are! A Book of Devil! Enjoy and feel free to come back anytime.";
- getitem 642,1;
- close;
- sM_2:
- if(countitem(7014)<1) goto sL_NoItems;
- delitem 7014,1;
- mes "[Monster Tamer Shogo]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Here you are! A No Recipient! Enjoy and feel free to come back anytime.";
- getitem 636,1;
- close;
- sM_3:
- if(countitem(1004)<1 || countitem(904)<1) goto sL_NoItems;
- delitem 1004,1;
- delitem 904,1;
- mes "[Monster Tamer Shogo]";
- mes "Alright, just a minute while I prepare the tame......";
- next;
- mes "[Monster Tamer Shogo]";
- mes "Here you are! A Horror of Tribe! Enjoy and feel free to come back anytime.";
- getitem 635,1;
- close;
-
- sL_NoItems:
- mes "[Monster Tamer Shogo]";
- mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
- close;
- M_End:
- mes "[Monster Tamer Shogo]";
- mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Monster Tamers
+//===== By: ==================================================
+//= kobra_k88, Darkchild, x[tsk]
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Cute pet quest items
+//===== Additional Comments: =================================
+//= May not have all of the Monster Tamers, but the ones here are fully working.
+//= 1.1 Fixed exploits [Lupus]
+//= 1.2 Removed Duplicates [Silent]
+//============================================================
+
+
+//<================================================= Alberta ===============================================>\\
+alberta_in.gat,173,77,3 script Monster Tamer#01 125,{
+ mes "[Monster Tamer Iwado]";
+ mes "Monster taming has never been more popular than it is now! Why not join in on all of the excitement?....";
+M_Menu:
+ next;
+ menu "^5555FFMonster Taming^000000",M_0,
+ "^5555FF'Monster Juice'^000000",M_1,
+ "^5555FF'Singing Flower'^000000",M_2,
+ "^5555FF'Wild Flower'^000000",M_3,
+ "Please make one for me",M_Make,
+ "Cancel",M_End;
+ M_0:
+ mes "[Monster Tamer Iwado]";
+ mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
+ mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "These Taming Items are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Here the Taming Items that I offer:";
+ mes "^5555FF'Monster Juice'^000000";
+ mes "^5555FF'Singing Flower'^000000";
+ mes "^5555FF'Wild Flower'^000000";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "These are fantastic items! You should really give them a try!";
+ goto M_Menu;
+ M_1:
+ mes "[Monster Tamer Iwado]";
+ mes "It is a drink made from animal blood. It's nothing a person would want to drink, but for the monster '^FF5555'Hunter Fly'^000000, it's a delicacy.";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "I can give you a ^5555FF'Monster Juice'^000000 in exchange for:";
+ mes "-^FF5555'1 Animal Gore'";
+ mes "-'2 Apples'^000000";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_2:
+ mes "[Monster Tamer Iwado]";
+ mes "The flower of a Singing Plant. It is a very unique and unusual item that seems to attract ^FF5555'Rockers'^000000.";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "I can give you a ^5555FF'Singing Flower'^000000 in exchange for:";
+ mes "-^FF5555'1 Singing Plant'^000000";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_3:
+ mes "[Monster Tamer Iwado]";
+ mes "This flower blooms naturally here in Rune-Midgard. It can be used as armor for your ^FF5555Orc Warrior^000000 pet.";
+ mes "I can give you a ^5555FF'Wild Flower'^000000 in exchange for:";
+ mes "-^FF5555'1 Fancy Flower'";
+ mes "-'1 Clover'^000000";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_Make:
+ mes "[Monster Tamer Iwado]";
+ mes "Which Taming Item would you like?";
+ next;
+ menu "^5555FF'Monster Juice'^000000",sM_1, "^5555FF'Singing Flower'^000000",sM_2, "^5555FF'Wild Flower'^000000",sM_3, "Cancel",M_End;
+
+ sM_1:
+ if(countitem(702)<1 || countitem(512)<2) goto sL_NoItems;
+ delitem 702,1;
+ delitem 512,2;
+ mes "[Monster Tamer Iwado]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Here you are! A Monster Juice! Enjoy and feel free to come back anytime.";
+ getitem 626,1;
+ close;
+ sM_2:
+ if(countitem(707)<1) goto sL_NoItems;
+ delitem 707,1;
+ mes "[Monster Tamer Iwado]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Here you are! A Singing Flower! Enjoy and feel free to come back anytime.";
+ getitem 629,1;
+ close;
+ sM_3:
+ if(countitem(2207)<1 || countitem(705)<1) goto sL_NoItems;
+ delitem 2207,1;
+ delitem 705,1;
+ mes "[Monster Tamer Iwado]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Iwado]";
+ mes "Here you are! A Wild Flower! Enjoy and feel free to come back anytime.";
+ getitem 10009,1;
+ close;
+
+ sL_NoItems:
+ mes "[Monster Tamer Iwado]";
+ mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
+ close;
+ M_End:
+ mes "[Monster Tamer Iwado]";
+ mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
+ close;
+
+}
+
+
+//<================================================= Al De Baran ===============================================>\\
+aldeba_in.gat,167,177,3 script Monster Tamer#02 125,{
+ mes "[Monster Tamer YuU]";
+ mes "You must be looking for some Taming Items.... When it comes to making Taming Items there is no one better than me here in Rune Midgard.";
+M_Menu:
+ next;
+ menu "^5555FF'Monster Taming'^000000",M_0,
+ "^5555FF'Skull Helm'^000000",M_1,
+ "^5555FF'Monster Oxygen Mask'^000000",M_2,
+ "^5555FF'Silk Ribbon'^000000",M_3,
+ "^5555FF'Stellar Hairpin'^000000",M_4,
+ "^5555FF'Tiny Egg Shell'^000000",M_5,
+ "^5555FF'Rocker Glasses'^000000",M_6,
+ "Please make one for me",M_Make,
+ "Cancel",M_End;
+ M_0:
+ mes "[Monster Tamer YuU]";
+ mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
+ mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you obtain a pet, you must show it love and appreciation. This is the most important part of monster taming.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "The best way to show your new pet you care, is to get it an 'Accessory' to make it stand out from the rest of the monsters in Rune Midgard.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "These ^5555FF'Cute Pet Accessories'^000000 are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here the Taming Items that I offer:";
+ mes "^5555FF'Skull Helm'";
+ mes "'Monster Oxygen Mask'";
+ mes "'Silk Ribbon'";
+ mes "'Stellar Hairpin'";
+ mes "'Tiny Egg Shell'";
+ mes "'Rocker Glasses'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "These are fantastic items! You should really give them a try!";
+ goto M_Menu;
+ M_1:
+ mes "[Monster Tamer YuU]";
+ mes "It may be disgusting, but it has a mysterious power that has the potential to make its wearer go crazy!";
+ mes "This item will look great on your '^FF5555'Baphomet Jr.'^000000 pet.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "I can give you a ^5555FF'Skull Helm'^000000 in exchange for:";
+ mes "-^FF5555'1 Bone Helm'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_2:
+ mes "[Monster Tamer YuU]";
+ mes "Once worn it makes it difficult to tell whether or not the wearer is a monster or a human.";
+ mes "A great gift for your ^FF5555'Choncon', 'Steel Choncon', or 'Hunter Fly'^000000.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "I can give you a ^5555FF'Monster Oxygen Mask'^000000 in exchange for:";
+ mes "-^FF5555'1 Oxygen Mask'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_3:
+ mes "[Monster Tamer YuU]";
+ mes "It's a high quality ribbon knitted out of smooth silk. It will make your pet ^FF5555'Lunatic'^000000 look even cuter!.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "I can give you a ^5555FF'Silk Ribbon'^000000 in exchange for:";
+ mes "-^FF5555'1 Ribbon (0 Slotts)'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_4:
+ mes "[Monster Tamer YuU]";
+ mes "It is extremely sharp and possesses a mysterious power that makes monsters want to wear it.";
+ mes "Your ^FF5555'Green Petite'^000000 will love wearing this!";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "I can give you a ^5555FF'Stellar Hairpin'^000000 in exchange for:";
+ mes "-^FF5555'1 Stellar'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_5:
+ mes "[Monster Tamer YuU]";
+ mes "This seems to have a peculiar scent and a magnificent shine! It can be used as armor for your ^FF5555'Picky'^000000.";
+ mes "I can give you a ^5555FF'Tiny Egg Shell'^000000 in exchange for:";
+ mes "-^FF5555'1 Egg Shell'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_6:
+ mes "[Monster Tamer YuU]";
+ mes "Mysterious pair of eye glasses which make its wearer look like a geek. It's perfect for your ^FF5555Rocker^000000 pet.";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "I can give you a pair of ^5555FF'Rocker Glasses'^000000 in exchange for:";
+ mes "-^FF5555'1 Ribbon (0 Slotts)'";
+ mes "-'2 Zargon'";
+ mes "-'400 Zeny'^000000";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_Make:
+ mes "[Monster Tamer YuU]";
+ mes "Which Taming Item would you like?";
+ next;
+ menu "^5555FF'Skull Helm'^000000",sM_1,
+ "^5555FF'Monster Oxygen Mask'^000000",sM_2,
+ "^5555FF'Silk Ribbon'^000000",sM_3,
+ "^5555FF'Stellar Hairpin'^000000",sM_4,
+ "^5555FF'Tiny Egg Shell'^000000",sM_5,
+ "^5555FF'Rocker Glasses'^000000",sM_6,
+ "Cancel",M_End;
+
+ sM_1:
+ if(countitem(5017)<1) goto sL_NoItems;
+ delitem 5017,1;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! A Skull Helm! Enjoy and feel free to come back anytime.";
+ getitem 10001,1;
+ close;
+ sM_2:
+ if(countitem(5004)<1) goto sL_NoItems;
+ delitem 5004,1;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! A Monster Oxygen Mask! Enjoy and feel free to come back anytime.";
+ getitem 10002,1;
+ close;
+ sM_3:
+ if(countitem(2208)<1) goto sL_NoItems;
+ delitem 2208,1;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! A Silk Ribbon! Enjoy and feel free to come back anytime.";
+ getitem 10007,1;
+ close;
+ sM_4:
+ if(countitem(2294)<1) goto sL_NoItems;
+ delitem 2294,1;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! Stellar Hairpin! Enjoy and feel free to come back anytime.";
+ getitem 10011,1;
+ close;
+ sM_5:
+ if(countitem(5015)<1) goto sL_NoItems;
+ delitem 5015,1;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! A Tiny Egg Shell! Enjoy and feel free to come back anytime.";
+ getitem 10012,1;
+ close;
+ sM_6:
+ if(countitem(2208)<1 || countitem(912)<2 || Zeny<400) goto sL_NoItems;
+ delitem 2208,1;
+ delitem 912,2;
+ set Zeny, Zeny-400;
+ mes "[Monster Tamer YuU]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer YuU]";
+ mes "Here you are! A pair of Rocker Glasses! Enjoy and feel free to come back anytime.";
+ getitem 10014,1;
+ close;
+
+ sL_NoItems:
+ mes "[Monster Tamer YuU]";
+ mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
+ close;
+ M_End:
+ mes "[Monster Tamer YuU]";
+ mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
+ close;
+
+}
+
+
+//<================================================= Izlude ===============================================>\\
+izlude_in.gat,128,64,3 script Monster Tamer#03 125,{
+ mes "[Monster Tamer Shogo]";
+ mes "Are you pre-occupied with gathering items for your cute pets, and want a break? Then let us find those items for you.....";
+M_Menu:
+ next;
+ menu "^5555FFMonster Taming^000000",M_0,
+ "^5555FF'Book of Devil'^000000",M_1,
+ "^5555FF'No Recipient'^000000",M_2,
+ "^5555FF'Horror of Tribe'^000000",M_3,
+ "Please make one for me",M_Make,
+ "Cancel",M_End;
+ M_0:
+ mes "[Monster Tamer Shogo]";
+ mes "Monster Taming is the way in which players can get certain monsters to become their pets.";
+ mes "By using a ^5555FF'Taming Item'^000000 a player can lure a monster into becoming a pet.";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "These Taming Items are very hard to come by, but Monster Tamer Guild members such as myself can get them to you without any hassle.";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Here the Taming Items that I offer:";
+ mes "^5555FF'Book of Devil'^000000,";
+ mes "^5555FF'No Recipient'^000000,";
+ mes "^5555FF'Horror of Tribe'^000000.";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "These are fantastic items! You should really give them a try!";
+ goto M_Menu;
+ M_1:
+ mes "[Monster Tamer Shogo]";
+ mes "This book is far too powerfull for any mere mortal to read and contains the secret method of summoning a devil!";
+ mes "Use it to lure the monster ^FF5555'Baphomet Jr.'^000000.";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "I can give you a ^5555FF'Book of Devil'^000000 in exchange for:";
+ mes "-^FF5555'1 Old Magic Book'";
+ mes "-'2 Horrendous Mouth'^000000";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_2:
+ mes "[Monster Tamer Shogo]";
+ mes "An old letter which wasn't delivered because of an unkown recipient.";
+ mes "It has no meaning to any living human, but ^FF5555'Munaks'^000000 seem to be very fond of it.";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "I can give you a ^5555FF'No Recipient'^000000 in exchange for:";
+ mes "-^FF5555'1 Old Portrait'^000000";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_3:
+ mes "[Monster Tamer Shogo]";
+ mes "This trophy is an ^FF5555'Orc Warrior's'^000000 favorite item.";
+ mes "I can give you a ^5555FF'Horror of Tribe'^000000 in exchange for:";
+ mes "-^FF5555'1 Chivalry Emblem'";
+ mes "-'1 Scorpion Tail'^000000";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Once you bring me these items I will make this Taming item with the uttmost pride!";
+ goto M_Menu;
+ M_Make:
+ mes "[Monster Tamer Shogo]";
+ mes "Which Taming Item would you like?";
+ next;
+ menu "^5555FF'Book of Devil'^000000",sM_1, "^5555FF'No Recipient'^000000",sM_2, "^5555FF'Horror of Tribe'^000000",sM_3, "Cancel",M_End;
+
+ sM_1:
+ if(countitem(1006)<1 || countitem(958)<2) goto sL_NoItems;
+ delitem 1006,1;
+ delitem 958,2;
+ mes "[Monster Tamer Shogo]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Here you are! A Book of Devil! Enjoy and feel free to come back anytime.";
+ getitem 642,1;
+ close;
+ sM_2:
+ if(countitem(7014)<1) goto sL_NoItems;
+ delitem 7014,1;
+ mes "[Monster Tamer Shogo]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Here you are! A No Recipient! Enjoy and feel free to come back anytime.";
+ getitem 636,1;
+ close;
+ sM_3:
+ if(countitem(1004)<1 || countitem(904)<1) goto sL_NoItems;
+ delitem 1004,1;
+ delitem 904,1;
+ mes "[Monster Tamer Shogo]";
+ mes "Alright, just a minute while I prepare the tame......";
+ next;
+ mes "[Monster Tamer Shogo]";
+ mes "Here you are! A Horror of Tribe! Enjoy and feel free to come back anytime.";
+ getitem 635,1;
+ close;
+
+ sL_NoItems:
+ mes "[Monster Tamer Shogo]";
+ mes "It looks like you don't have enough items to exchange for this tame. Please come back when you do.";
+ close;
+ M_End:
+ mes "[Monster Tamer Shogo]";
+ mes "Oh... I see. You probably haven't decided on what monster to raise as a pet yet. It's a very important decision, so please, take your time.";
+ close;
+
+}
diff --git a/npc/quests/mrsmile.txt b/npc/quests/mrsmile.txt
index 1672ff57e..f59f3469a 100644
--- a/npc/quests/mrsmile.txt
+++ b/npc/quests/mrsmile.txt
@@ -1,92 +1,92 @@
-//===== eAthena Script =======================================
-//= Mr. Smile Quest
-//===== By: ==================================================
-//= kobra_k88, Akaru
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. 1.1 Optimized
-//= 1.2 updated Payon coords [Lupus]
-//= 1.3 fixed exploit [Lupus]
-//============================================================
-
-
-
-// Alberta ------------------------------------------------------------------------------------------
-alberta.gat,113,53,3 script Smile Assistance::SmileAT 92,{
- mes "[Smile Assistant]";
- mes "Hi, I'm a Smile Assistance. How may I help you?";
- next;
- menu "^0099FFMr. Smile^000000?",M_0, "Construct a ^0099FFMr. Smile^000000",M_1, "Quit",M_End;
-
- M_0:
- mes "[Smile Assistant]";
- mes "Oh, the Mr. Smile Event is a nationwide event that is being sponsered by ^0099FFHis Majesty Tristram the 3rd^000000.";
- mes "The goal of the event is to get the citizens of Rune Midgard to put on happy looking Mr. Smile masks.";
- next;
- mes "[Smile Assistance]";
- mes "By having this event, His Majesty wishes to encourage the people of Rune Midgard to have more fun and enjoy themselves!";
- mes "As you may have guessed, the Mr. Smile mask is simply a smiley face.";
- next;
- mes "[Smile Assistance]";
- mes "Although it may be simple, no one can argue the power of a smile! And if everybody in the kingdom were to wear one....";
- mes "just imagine how much joy and cheer the world would see!";
- next;
- mes "[Smile Assistant]";
- mes "As a Smile Assistant, it is my job to make a Mr. Smile mask for all of those who want one.";
- mes "All I need to make the mask are some little items, namely:";
- mes "^5555FF10 Jellopy^000000";
- mes "^5555FF10 Fluff^000000";
- mes "^5555FF10 Clover^000000";
- next;
- mes "[Smile Girl]";
- mes "The world could use more smiles so get those items and come back soon. I'll be waiting right here.";
- close;
- M_1:
- mes "[Smile Assistant]";
- if(countitem(705) < 10 || countitem(909) < 10 || countitem(914) < 10) goto sL_NoItems;
- delitem 705,10;
- delitem 909,10;
- delitem 914,10;
- mes "Oh, great! You've brought back all of the items needed. Wait just a sec while I get your Mr. Smile ready.....";
- next;
- mes "~!shook!~!shook!~!clack!~!clack!~!tok!~!tok!~";
- next;
- mes "[Smile Assistant]";
- mes "Here ya go, your very own Mr. Smile!";
- getitem 2278,1;
- next;
- mes "[Smile Assistant]";
- mes "The Mr. Smile Event is just one of the many ways His Majesty Tristam the 3rd is trying to make life more enjoyable here in Rune Midgard.";
- next;
- mes "[Smile Assistant]";
- mes "Hopefully you will be reminded of that fact everytime you put on your Mr. Smile.";
- close;
-
- sL_NoItems:
- mes "Oh... Unfortunately you don't have enough items for a Mr. Smile. What you need are:";
- mes "^5555FF10 Jellopy^000000,";
- mes "^5555FF10 Fluff^000000,";
- mes "^5555FF10 Clover^000000,";
- mes "I'll be waiting here so hurry back.";
- close;
- M_End:
- close;
-}
-
-// Aldebaran --------------------------------------------------------------------------------
-aldebaran.gat,136,135,4 duplicate(SmileAT) Smile Assistance#2 92
-// Geffen -----------------------------------------------------------------------------------
-geffen.gat,119,107,4 duplicate(SmileAT) Smile Assistance#3 92
-// Izlude -----------------------------------------------------------------------------------
-izlude.gat,129,118,4 duplicate(SmileAT) Smile Assistance#4 92
-// Morroc -----------------------------------------------------------------------------------
-morocc.gat,158,97,4 duplicate(SmileAT) Smile Assistance#5 92
-// Payon ------------------------------------------------------------------------------------
-payon.gat,168,225,4 duplicate(SmileAT) Smile Assistance#6 92
-// Prontera ---------------------------------------------------------------------------------
-prontera.gat,157,187,4 duplicate(SmileAT) Smile Assistance#7 92
+//===== eAthena Script =======================================
+//= Mr. Smile Quest
+//===== By: ==================================================
+//= kobra_k88, Akaru
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. 1.1 Optimized
+//= 1.2 updated Payon coords [Lupus]
+//= 1.3 fixed exploit [Lupus]
+//============================================================
+
+
+
+// Alberta ------------------------------------------------------------------------------------------
+alberta.gat,113,53,3 script Smile Assistance::SmileAT 92,{
+ mes "[Smile Assistant]";
+ mes "Hi, I'm a Smile Assistance. How may I help you?";
+ next;
+ menu "^0099FFMr. Smile^000000?",M_0, "Construct a ^0099FFMr. Smile^000000",M_1, "Quit",M_End;
+
+ M_0:
+ mes "[Smile Assistant]";
+ mes "Oh, the Mr. Smile Event is a nationwide event that is being sponsered by ^0099FFHis Majesty Tristram the 3rd^000000.";
+ mes "The goal of the event is to get the citizens of Rune Midgard to put on happy looking Mr. Smile masks.";
+ next;
+ mes "[Smile Assistance]";
+ mes "By having this event, His Majesty wishes to encourage the people of Rune Midgard to have more fun and enjoy themselves!";
+ mes "As you may have guessed, the Mr. Smile mask is simply a smiley face.";
+ next;
+ mes "[Smile Assistance]";
+ mes "Although it may be simple, no one can argue the power of a smile! And if everybody in the kingdom were to wear one....";
+ mes "just imagine how much joy and cheer the world would see!";
+ next;
+ mes "[Smile Assistant]";
+ mes "As a Smile Assistant, it is my job to make a Mr. Smile mask for all of those who want one.";
+ mes "All I need to make the mask are some little items, namely:";
+ mes "^5555FF10 Jellopy^000000";
+ mes "^5555FF10 Fluff^000000";
+ mes "^5555FF10 Clover^000000";
+ next;
+ mes "[Smile Girl]";
+ mes "The world could use more smiles so get those items and come back soon. I'll be waiting right here.";
+ close;
+ M_1:
+ mes "[Smile Assistant]";
+ if(countitem(705) < 10 || countitem(909) < 10 || countitem(914) < 10) goto sL_NoItems;
+ delitem 705,10;
+ delitem 909,10;
+ delitem 914,10;
+ mes "Oh, great! You've brought back all of the items needed. Wait just a sec while I get your Mr. Smile ready.....";
+ next;
+ mes "~!shook!~!shook!~!clack!~!clack!~!tok!~!tok!~";
+ next;
+ mes "[Smile Assistant]";
+ mes "Here ya go, your very own Mr. Smile!";
+ getitem 2278,1;
+ next;
+ mes "[Smile Assistant]";
+ mes "The Mr. Smile Event is just one of the many ways His Majesty Tristam the 3rd is trying to make life more enjoyable here in Rune Midgard.";
+ next;
+ mes "[Smile Assistant]";
+ mes "Hopefully you will be reminded of that fact everytime you put on your Mr. Smile.";
+ close;
+
+ sL_NoItems:
+ mes "Oh... Unfortunately you don't have enough items for a Mr. Smile. What you need are:";
+ mes "^5555FF10 Jellopy^000000,";
+ mes "^5555FF10 Fluff^000000,";
+ mes "^5555FF10 Clover^000000,";
+ mes "I'll be waiting here so hurry back.";
+ close;
+ M_End:
+ close;
+}
+
+// Aldebaran --------------------------------------------------------------------------------
+aldebaran.gat,136,135,4 duplicate(SmileAT) Smile Assistance#2 92
+// Geffen -----------------------------------------------------------------------------------
+geffen.gat,119,107,4 duplicate(SmileAT) Smile Assistance#3 92
+// Izlude -----------------------------------------------------------------------------------
+izlude.gat,129,118,4 duplicate(SmileAT) Smile Assistance#4 92
+// Morroc -----------------------------------------------------------------------------------
+morocc.gat,158,97,4 duplicate(SmileAT) Smile Assistance#5 92
+// Payon ------------------------------------------------------------------------------------
+payon.gat,168,225,4 duplicate(SmileAT) Smile Assistance#6 92
+// Prontera ---------------------------------------------------------------------------------
+prontera.gat,157,187,4 duplicate(SmileAT) Smile Assistance#7 92
diff --git a/npc/quests/newgears/2004_headgears.txt b/npc/quests/newgears/2004_headgears.txt
index cb0933369..7c2cfdf54 100644
--- a/npc/quests/newgears/2004_headgears.txt
+++ b/npc/quests/newgears/2004_headgears.txt
@@ -1,3362 +1,3362 @@
-//===== eAthena Script =======================================
-//= 2004 Headgear Quests
-//===== By: ==================================================
-//= Dj-Yhn
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= 2004 New Headgears. Official Quests
-//===== Additional Comments: =================================
-//= names with asterisk(*) are iRO names...
-//= names done: 1,3,6,8,9,12,14,15,16,17
-//= needed: 2,4,5,7,10,11,13 (7/17)
-//= ==Information For NPC's inside File==
-//= 1) Black Cat Ears [NekoNeko*] {Payon}
-//= o payon.gat 115 131
-//= 2) Crossed Hair Band, Plaster and Flower Hairpin [Arjen] {Geffen}
-//= o geffen.gat 129 148
-//= 3) Hot-blooded-headband [Zhenbolt*] {Yuno}
-//= o yuno.gat 300 188
-//= 4) Red Tailed Ribbon [Netpia] {Prontera}
-//= o prontera.gat 165 232
-//= 5) Indian Headband [Merunte] {Comodo}
-//= o comodo.gat 237 217
-//= 6) Mushroom headband [Ipore*] {Geffen}
-//= o geffen.gat 67 87
-//= 7) Ears of angel wing &
-//= Ears of devil wing [Old Blacksmith] {Yuno}
-//= o yuno.gat 241 52
-//= 8) Sea Otter Cap [Pretty Lindsay*] {Lutie}
-//= o xmas.gat 183 267
-//= 9) Brown Bear Cap [Fuzzy Fuzz*] {Lutie}
-//= o xmas.gat 175 156
-//=10) Cap of Concentration [Nan Hyang] {Payon}
-//= o payon_in03.gat 8 193
-//=11) Tulip Haipin [Ses] {Geffen}
-//= o geffen.gat 83 189
-//=12) Party Hat, Straw Hat, Cowboy Hat, Sombrero
-//= and Fur hat [Headgear Merchant (Mike)*] {Lutie}
-//= o xmas_in.gat 35 30
-//=13) Big Golden Bell, Headgear of Queen
-//= and Crown of Mistress [Neris] {Yuno}
-//= o yuno_in03.gat 20 18
-//=14) Alarm Mask [Muscle Man*]{Aldebaran}
-//= o alde_alche.gat 88 180
-//=15) Drooping Kitty, Smokie Leaf, Lazy Smokie
-//= and Blue Fish [Traveler*] {Morroc}
-//= o morocc.gat 273 79
-//=16) Fox Mask [Nine Tail*] {Payon Dungeon}
-//= o pay_dun03 48 84
-//=17) Orc Hero Helm [Orc Warrior*] {Orc Village}
-//= o in_orcs01 31 93 & 162 33
-//============================================================
-//= 1.01 Fixed items names iRO->kRO, fixed some bugs [Qwadrat]
-//= Fixed possible item exploits, fixed Straw Hat
-//= Added missing checks [Lupus]
-//= 1.1 Fixed a bug in Giant-band-aid that didn't counting rotten bandages
-//= Fixed a bug in Fur Hat that didn't count yarn [Evera]
-//= 1.2 Syntax fixes for parenthesis, reformatting [KarLaeda]
-//============================================================
-
-//Payon /=Black cat ears=/
-payon.gat,115,131,3 script NekoNeko 725,{
- if (countitem(2213) > 0 && countitem(983) > 0 && countitem(914) > 199 && Zeny > 9999) {
- delitem 2213,1;
- delitem 983,1;
- delitem 914,200;
- set Zeny,Zeny-10000;
- mes "[NekoNeko]";
- mes "Hihi? So you have collected all materials.";
- mes "According to our agreement,";
- mes "I will make it for you~ please";
- mes "wait for a while!";
- next;
- mes "[NekoNeko]";
- mes "Zomulazhumudazowuwudududu";
- mes "DidiSusuohwuzaowududaduda";
- next;
- getitem 5057,1;
- mes "[NekoNeko]";
- mes "Thank youfor using!";
- mes "If you need it again in future,";
- mes "come and fine me anytime!";
- close;
- } else {
- mes "[NekoNeko]";
- mes "How are you? Yes, I know.";
- mes "I know why you're trying to talk to me.";
- mes "That's because the Ears of Black Cat";
- mes "that I am wearing is too cute... right? Hahaha";
- next;
- mes "[NekoNeko]";
- mes "Honestly, I made this hairband";
- mes "with my skill of craftmanship.";
- mes "Therefore, not much people know,";
- mes "about this adorable head gear.";
- mes "Isn't that a pity that I use it myself?";
- next;
- mes "[NekoNeko]";
- mes "So, you better ask me to make that.";
- mes "I will make it";
- mes "with a pay of course.";
- mes "Fill your pockets with coints....";
- mes "That's my thinking, hehehehe";
- next;
- mes "[NekoNeko]";
- mes "^FF0000Kitty Band^000000 x1";
- mes "^FF0000Black Dyestuffs^000000 x1";
- mes "^FF0000Fluff^000000 x200";
- mes "and lastly, it requires at least ^FF000010000zeny^000000!";
- mes "If you want it, gather them and bring it to me~";
- next;
- mes "[NekoNeko]";
- mes "^FF0000Ah! Please keep this in mind.";
- mes "If you slot a card in your equipment,";
- mes "and you want to change it to the item now,";
- mes "you will lose the card and refined level.";
- close;
- }
-}
-//Geffen /=Crossed Hair Ban, Plaster and Flower Hairpin=/
-geffen.gat,129,148,3 script Arjen 779,{
- mes "[Arjen]";
- mes "Ahhh~So boring~ So very boring~";
- mes "There's noone I need to see, and the weather is so good - ! !";
- mes "It's so boring that I have nothing to do.";
- emotion e_gasp; //not sure if this is ET_SCRATCH
- next;
- mes "[Arjen]";
- mes "Oh yes, hey there, you!!";
- mes "Do you want to have a cute and fine hair clip?";
- mes "For a person as skillful as I am, there's nothing I can't make!! Wa haha!";
- mes "Clap ! It will be ready just like that!";
- emotion e_omg; //ET_SURPRISE?
- next;
- mes "[Arjen]";
- mes "Lucky I am freerightnow. So, just bring me the materials and I will whoosh! make it for you!";
- mes "So, any idea of what accessory you would like to have?";
- emotion e_heh; //ET_SMILE
- next;
- switch(select("^3131FFX Hairpin:Giant Band Aid:Flower Hairpin^000000:End conversation.")) {
- case 1:
- if (countitem(2294) > 0 && countitem(7220) > 399) {
- mes "[Arjen]";
- mes "X Hairpin!";
- mes "That's very good !!";
- next;
- mes "[Arjen]";
- mes "Oh yes!";
- mes "The Stellar.."; //star dust? that's not refinable, now is it? =X
- mes "^CE3100During the production, the refine level will disappear, is that ok with you?^000000";
- next;
- switch(select("It's ok, just make it for me!:I will come next time.")) {
- case 1:
- mes "[Arjen]";
- mes "Oh well- Then,";
- mes "it's time to show my skill after all this time !?";
- next;
- mes "^3131FF - Sha Sha !! - ^000000";
- mes "^3131FF - Cha Sha Haa !! - ^000000";
- next;
- if (countitem(2294) > 0 && countitem(7220) > 399) {
- delitem 2294,1;
- delitem 7220,400;
- getitem 5079,1; //X-Hairping == crossed hair band?
- }
- mes "[Arjen]";
- mes " OK - !!";
- mes "I still have my touch! Wa ha ha!!";
- mes "How about that? Do you like it?";
- next;
- mes "[Arjen]";
- mes "If you have any need, come and find me here anytime!";
- mes "So, good bye. Good Bye!";
- close;
- case 2:
- mes "[Arjen]";
- mes "Fine, fine, come back after you've made up your mind!";
- close;
- }
- } else {
- mes "[Arjen]";
- mes "Right - the ^3131FF X Hairpin!^000000";
- mes "That's simple!";
- next;
- mes "[Arjen]";
- mes "^FF0000Stellar x1^000000";
- mes "^FF0000Ectoplasm x400^000000";
- mes "If you've prepared all of this, I will help to make it for you!";
- close;
- }
- case 2:
- if (countitem(970) > 0 && countitem(930) > 499) {
- mes "[Arjen]";
- mes "Giant Band Aid??..";
- mes "Oh well- Then,";
- mes "it's time to show my skill after all this time !?";
- next;
- mes "^3131FF - Sha Sha !! - ^000000";
- mes "^3131FF - Cha Sha Haa !! - ^000000";
- next;
- if (countitem(970) > 0 && countitem(930) > 499) {
- delitem 970,1;
- delitem 930,500;
- getitem 5063,1; //another one in wich I love gravity for changing names =X
- }
- mes "[Arjen]";
- mes " OK - !!";
- mes "I still have my touch! Wa ha ha!!";
- mes "How about that? Do you like it?";
- next;
- mes "[Arjen]";
- mes "If you have any need, come and find me here anytime!";
- mes "So, good bye. Good Bye!";
- close;
- } else {
- mes "[Arjen]";
- mes "Hoho - ^3131FF Plaster !^000000";
- mes "If anyone asked where this is the Plaster that is used when someone is hurt?";
- mes "Tell them it is the real Plaster for injured people.";
- mes "Hmm, isn't that easy?";
- next;
- mes "[Arjen]";
- mes "^FF0000Alcohol x1^000000";
- mes "^FF0000Rotten Bandage x500^000000";
- mes "If you have prepared all the items, I will help to make it for you now?";
- close;
- }
- case 3:
- if (countitem(2269) > 0 && countitem(999) > 9 && Zeny > 19999) {
- mes "[Arjen]";
- mes "Great !! Flower Hairpin ~";
- mes "it's time to show my skill after all this time !?";
- next;
- mes "^3131FF - Sha Sha !! - ^000000";
- mes "^3131FF - Cha Sha Haa !! - ^000000";
- next;
- if (countitem(2269) > 0 && countitem(999) > 9 && Zeny > 19999) {
- delitem 2269,1;
- delitem 999,10;
- set Zeny,Zeny-20000;
- getitem 5061,1; //finally a non-changed name =X
- }
- mes "[Arjen]";
- mes " OK - !!";
- mes "I still have my touch! Wa ha ha!!";
- mes "How about it? Do you like it? Here is the stem left from the production. Take it as a souvenir. Haha.";
- next;
- mes "[Arjen]";
- mes "If you have any need, come and find me here anytime!";
- mes "So, good bye. Good Bye!";
- close;
- } else {
- mes "[Arjen]";
- mes "Yes - ^3131FF Flower Hairpin !^000000";
- mes "Sometimes, I see some strange girls with bare legs and a flower in their mouths.";
- mes "Looking at them, I get an idea!";
- next;
- mes "[Arjen]";
- mes "That is ^3131FFFlower^000000, ^3131FFFlower^000000 !";
- mes "Wa ha ha, isn't that a perfect match?";
- mes "Some even equip it on the Orc Warrior, you should be proud of it, right?";
- mes "Really ~ ~ ~";
- next;
- mes "[Arjen]";
- mes "But the process takes a little more effort,";
- mes "I need to take some process fee.";
- next;
- mes "[Arjen]";
- mes "You should know that,";
- mes "stabilizing a fragile flower on the head";
- mes "takes a lot of concentration and";
- mes "very high level of skills!";
- next;
- mes "[Arjen]";
- mes "So, please bring,";
- mes "^FF0000Romantic Flower x1^000000";
- mes "^FF0000Steel x10^000000";
- mes "together with ^3131FF 20,000 zeny^000000 !";
- mes "If you have prepared all of these, I will make it for you right away!";
- mes "Do you understand that?";
- close;
- }
- case 4:
- mes "[Arjen]";
- mes "Ha, what? You don't want it?";
- mes "Rumblerumblerumble";
- close;
- }
-}
-//Yuno /=Headband of power=/ <-- Ok, WTF? Thanks again bitches ;_;
-//Yuno /=Hot-blooded headband=/ [5070]
-yuno.gat,300,188,5 script Zhenbolt 753,{
- if(countitem(7216) > 299 && countitem(7097) > 299 && countitem(2211) > 0 && countitem(982) > 0) {
- delitem 7216,300;
- delitem 7097,300;
- delitem 2211,1;
- delitem 982,1;
- mes "[Zhenbolt]";
- mes "Uh oh...Have you collected all the items?";
- mes "Good.";
- mes "According to out agreement,";
- mes "I will create it for you, whole hearedly.";
- next;
- mes "[Zhenbolt]";
- mes "........................";
- next;
- mes "[Zhenbolt]";
- mes "........................";
- next;
- mes "[Zhenbolt]";
- mes "..................-work harder!-";
- next;
- mes "[Zhenbolt]";
- mes "Uh oh... It's finished.";
- mes "If you wear it,";
- mes "you will feel some warmth,";
- mes "in this cold world.";
- mes "A great item has been born in this world.";
- mes "Ladies and gentleman, this is ^FF0000Hot-blooded Headband^000000!!";
- getitem 5070,1;
- next;
- mes "[Zhenbolt]";
- mes "With this, I will be able";
- mes "to get back to the person I miss soon.";
- mes "My name is";
- mes "Zhenbolt";
- mes "Main distributor of hear warming sensation!";
- close;
- } else {
- mes "[Zhenbolt]";
- mes "My name is Zhenbolt,";
- mes "a simple practioner that travels around the world,";
- mes "to spead the warmth of heart around the world.";
- next;
- mes "[Zhenbolt]";
- mes "You won't understand the meaning";
- mes "of a burning spirit and heat of passion through mere explaining.";
- mes "So do you want to accept this?";
- mes "I will create an item";
- mes "that stores my heart for you.";
- next;
- mes "[Zhenbolt]";
- mes "However,";
- mes "I cannot leave this place,";
- mes "because I need to pass the message to others...";
- mes "So,";
- mes "I will have to trouble you";
- mes "to gather the materials.";
- next;
- mes "[Zhenbolt]";
- mes "^FF0000Red Muffler^000000 300 unit";
- mes "^FF0000Burning Heart^000000 300 unit";
- mes "^FF0000Bandana^000000 1unit ^FF0000White Dyestuffs^000000 1 unit...";
- mes "To produce the item,";
- mes "you'll need this materials.";
- mes "Come to find me again after you've collected all the materials required.";
- next;
- mes "[Zhenbolt]";
- mes "^FF0000Besides that,";
- mes "Ah! Please keep this in mind.";
- mes "If you slot a card in your equipment,";
- mes "and you want to change it to the item now,";
- mes "you will lose the card and refined level.";
- close;
- }
-}
-//Prontera /=Red Tailed Ribbon=/ [5083](Red Ribbon)//
-prontera.gat,165,232,3 script Netpia 744,{
- if(countitem(2244) > 0 && countitem(2209) > 0 && countitem(10007) > 0) {
- delitem 2244,1;
- delitem 2209,1;
- delitem 10007,1;
- mes "[Netpia]";
- mes "Wow... You've brought all of it.";
- mes "You've must have done a lot.";
- mes "I will make the item according to our agreement.";
- mes "Please wait for a while.";
- next;
- mes "[Netpia]";
- mes "...........................";
- next;
- mes "[Netpia]";
- mes "...........................";
- next;
- mes "[Netpia]";
- mes ".....................-Work Hard-";
- next;
- mes "[Netpia]";
- mes "Here it is.";
- mes "It's all yours now.";
- mes "Remember to always wear it.";
- getitem 5083,1;
- next;
- mes "[Netpia]";
- mes "Use this,";
- mes "to pass my intention to him...";
- mes "He left me for a while,";
- mes "with the hope to warm the heart of the world.";
- mes "The one who chases that dream...";
- mes "Where is he now?";
- next;
- mes "[Netpia]";
- mes "When you see the Red Ribbon,";
- mes "will you think of me,";
- mes "and continue to work harder?";
- mes "May you be blessed with luck on your journey.";
- close;
- } else {
- mes "[Netpia]";
- mes "Hello?";
- mes "Do you want to wear a Red Ribbon?";
- mes "It's a really beautiful head accesory.";
- mes "I am not trying to trick you,";
- mes "what do you think?";
- next;
- mes "[Netpia]";
- mes "^FF0000Big Ribbon^000000 x1.";
- mes "^FF0000Ribbon with one slot^000000 x1.";
- mes "^FF0000Silk Ribbon^000000 x1...";
- mes "I'll make it for you,";
- mes "if you bring the above items.";
- next;
- mes "[Netpia]";
- mes "Remember to bring it to me.";
- mes "I'll be more then glad,";
- mes "if you wear the Red Ribbon.";
- mes "Then see you soon.";
- next;
- mes "[Netpia]";
- mes "^FF0000Ah... let me tell you about this,";
- mes "Ah! Please keep this in mind.";
- mes "If you slot a card in you equipment,";
- mes "and you want to change it to the item now,";
- mes "you will lose the card and refined level.";
- close;
- }
-}
-//Comodo /=Indian Headband=/ [5071]
-comodo.gat,237,217,5 script Merunte 732,{
- if (countitem(5010) > 0 && countitem(5049) > 0 && countitem(7101) > 9 && Zeny > 9999) {
- delitem 5010,1;
- delitem 5049,1;
- delitem 7101,10;
- set Zeny,Zeny-10000;
- mes "[Merunte]";
- mes "Oh oh! You have brought it like you've promised!";
- mes "Then we shall pay our end of our bargain,";
- mes "just like the Indians!";
- next;
- mes "[Merunte]";
- mes "Now let me have";
- mes "the materials that you have brought first.";
- mes "I will use it well to make the headband.";
- getitem 5071,1;
- next;
- mes "[Merunte]";
- mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
- close;
- } else {
- mes "[Merunte]";
- mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
- mes " ";
- mes "Let the spirit of Indian stay glorious forever!";
- mes "With the honor of Comodo Indian,";
- mes "raise the glory of Indian!";
- next;
- mes "[Merunte]";
- mes "For this reason,";
- mes "do you want to try wearing,";
- mes "an Indian Headband? Bring ^FF0000Indian Fillet^000000 x1";
- mes "^FF0000Striped Hairband^000000 x1";
- mes "^FF0000Peco Peco Feather^000000 x10";
- mes "and together with ^FF000010000zeny^000000!";
- next;
- mes "[Merunte]";
- mes "And Indiantakes a promise,";
- mes "more importantly than his life.";
- mes "As long as you bring it, I will make that for you anytime!";
- mes " ";
- mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
- next;
- mes "[Merunte]";
- mes "^FF0000Ah! Please keep this in mind";
- mes "If you slot a card in your equipment,";
- mes "and you want to change it to the item now,";
- mes "you will lose the card and refined level.";
- close;
- }
-}
-//Geffen /=Mushroom Band=/ [5082]
-geffen.gat,67,87,3 script Ipore 700,{
- if (countitem(921) > 299) {
- delitem 921,300;
- mes "[Ipore]";
- mes "Oh Wow. You really have brought the Mushroom Spore x 300?";
- mes "You much have been tired.";
- mes "Then, I shall use these,";
- mes "to perform a magic show for you!";
- mes "Please wait for a while.";
- next;
- mes "- Sha Ka Sha Ka Sha Ka Sha Ka Sha Ka Sha Ka -";
- mes "- Iporeput all the Mushroom Spores-";
- mes "- onto my head. -";
- next;
- mes "[Ipore]";
- mes "Kineisihayituoohyilaahahsaiyi";
- mes "Chahulisitawutehayisikenbiah";
- mes "BiwuBiwuBiwu....Keahahah!!";
- next;
- mes "[Ipore]";
- mes ".......................";
- mes "Shoosh... Anyway,";
- mes "The spore has grown on your head.";
- mes "It looks odd just like that.";
- mes "Let me help you to make it into a headband.";
- next;
- mes "[Ipore]";
- mes "So...How about that? Feeling any better?";
- mes "Making a headband,";
- mes "using the spore that grows from your head...";
- mes "Isn't that romantic? Hehe.";
- next;
- mes "[Ipore]";
- mes "Anyway, you've done a lot.";
- mes "So, take this headban with you to show off somewhere.";
- mes "If you want to make another one,";
- mes "just come and find me!";
- getitem 5082,1;
- close;
- } else {
- mes "[Ipore]";
- mes "Huhuhu...";
- mes "I fount it at last!";
- mes "I have discovered a magic";
- mes "that will make the spore grows on your head.";
- next;
- mes "[Ipore]";
- mes "Of course, it might be inconvenient,";
- mes "with a headfull of mushroom spore...";
- mes "That's why I pick it up";
- mes "and make it into a hairband for you.";
- next;
- mes "[Ipore]";
- mes "Aiyo! No point listening and do not see it for yourself!";
- mes "Just bring 300 ^FF0000Mushroom Spore^000000,";
- mes "and I will let you experience it!";
- mes "I am confident that if you experience such magic,";
- mes "you're surely be thankful to me, won't you?";
- close;
- }
-}
-//Yuno /=Ears of Angel's Wing & Ears of Devil's Wing=/ [5074]&[5068]
-yuno.gat,241,52,3 script Old Blacksmith 813,{
- mes "[A seemingly skillful craftman]";
- mes "Uh Oh, since you've come to this place,";
- mes "you must have known how to enjoy the scenary.";
- mes "Since you're a Blacksmith, why not do your forging?";
- mes "What's the point staring at the sky?";
- mes "My name is Habir Moah!";
- mes "A wandering Blacksmith with my hammer as my companion.";
- next;
- if (countitem(2254) && countitem(2286) && Zeny>19999) {
- mes "[Habir Moah]";
- mes "Hmm? You do have really good items, don't you?";
- mes "Hmm... however,";
- mes "do you have the insufficientfeeling?";
- mes "If you are willing, take out your";
- mes "^4d4dffAngel Wing^000000 and ^4d4dffElven Ears^000000";
- mes "to create a unusual item.";
- next;
- mes "[Habir Moah]";
- mes "How about that, do you ever though of that?";
- mes "Don't suspect my capability!";
- mes "As a Blacksmith";
- mes "I am considered as one of the most skillful one, if not the most skillful!";
- mes "Through the skill of blacksmith,";
- mes "an ore will become a great steel, that's the rule.";
- next;
- switch(select("Hmm... I'll think about it.:Can you help me make it?:Can I craft Evil headband...?")) {
- case 1:
- mes "[Habir Moah]";
- mes "Hmm, what a pity!";
- mes "I thought I can show my skill again.";
- mes "Oh well.";
- mes "... ... ...";
- mes "Beautiful sky... So blue.";
- close;
- case 2:
- mes "[Habir Moah]";
- mes "Aha, thank you!";
- mes "Let's see the material first, shall we?";
- mes "Angel Wing and Elven Ears,";
- mes "other miscellaneous stuffs and 20000 zeny.";
- mes "All these items really cost something.";
- mes "I will help you make one fine accesory.";
- next;
- mes "[Habir Moah]";
- mes "Before I produce the item, let me remind you.";
- mes "I don't care about";
- mes "the level of refining for the item.";
- mes "If you have worries,";
- mes "I guess you better tidy up your items.";
- next;
- mes "[Habir Moah]";
- mes "^4d4dffPlease Reserve the items,";
- mes "that is required for making the headgear^000000";
- mes "I do not hope that you will blame me,";
- mes "if I fail to make that item.";
- next;
- switch(select("It's ok, just do it.:Hmm, I need to think about it.")) {
- case 1:
- mes "[Habir Moah]";
- mes "So, let's do it!";
- next;
- misceffect 154; //Success Hammer ;P
- mes "[Habit Moah]";
- mes "With my skills,";
- mes "the great creation of me, Habir Moah,";
- mes "is completed!";
- mes "Here it is,";
- mes "the Angel Wing Ears.";
- if (countitem(2254) && countitem(2286) && Zeny>19999) {
- delitem 2254,1;
- delitem 2286,1;
- set Zeny,Zeny-20000;
- getitem 5074,1;
- }
- next;
- mes "[Habir Moah]";
- mes "From now on,";
- mes "everyone will you.";
- close;
- case 2:
- mes "[Habir Moah]";
- mes "If you're interested in it in future,";
- mes "do come and find me.";
- mes " ";
- mes "Ah, what a soothing breeze.";
- close;
- }
- case 3:
- mes "[Habir Moah]";
- mes "Hoho, of couse I can craft";
- mes "Evil Wing!";
- mes "I'll make it into Devil Wing Ears!";
- next;
- mes "[Habir Moah]";
- mes "Let's see the materials required, shall we?";
- mes "Evil Wing and Elven Ears,";
- mes "in addition to that, 20,000 zeny.";
- mes "All these items really cost something.";
- mes "I will help you make one fine accesory.";
- next;
- mes "[Habir Moah]";
- mes "Before I produce the item, let me remind you.";
- mes "I don't care about";
- mes "the level of refining for the item.";
- mes "If you have worries,";
- mes "I guess you better tidy up your items.";
- next;
- mes "[Habir Moah]";
- mes "^4d4dffPlease reserve the items,";
- mes "this is required for making the headgear.^000000";
- mes "I do not hope that you will blame me,";
- mes "if I fail to make that item.";
- next;
- switch(select("It's ok. Let's do it.:I need to tidy up first.")) {
- case 1:
- if (countitem(2255) && countitem(2286) && Zeny > 19999) {
- mes "[Habir Moah]";
- mes "So, let's do it!";
- next;
- misceffect 154;
- mes "[Habir Moah]";
- mes "With my skills,";
- mes "the great creation of me, Habir Moah,";
- mes "is completed!";
- mes "Here it is,";
- mes "Devil Wing Ears";
- if (countitem(2255) && countitem(2286) && Zeny > 19999) {
- delitem 2255,1;
- delitem 2286,1;
- set Zeny,Zeny-20000;
- getitem 5068,1;
- }
- next;
- mes "[Habir Moah]";
- mes "Fromnow on,";
- mes "everyone will you.";
- close;
- } else {
- mes "[Habir Moah]";
- mes "I'm sorry. If you have not prepared all the materials,";
- mes "I won't do that for you.";
- mes "I'll need Evil Wing, Elven Ears and";
- mes "20000 zeny.";
- mes "Can you please confirm that you have all of those?";
- close;
- }
- case 2:
- mes "[Habir Moah]";
- mes "If you're interested in it in future,";
- mes "do come and find me.";
- mes " ";
- mes "Ah, what a soothing breeze.";
- close;
- }
- }
- } else if (countitem(2255) && countitem(2286) && Zeny>19999) {
- mes "[Habir Moah]";
- mes "Hmm? You do have really good items, don't you?";
- mes "Hmm... however,";
- mes "do you have the insufficientfeeling?";
- mes "If you are willing, take out your";
- mes "^4d4dffEvil Wing^000000 and ^4d4dffElven Ears^000000";
- mes "to create a unusual item.";
- next;
- mes "[Habir Moah]";
- mes "How about that, do you ever though of that?";
- mes "Don't suspect my capability!";
- mes "As a Blacksmith";
- mes "I am considered as one of the most skillful one, if not the most skillful!";
- mes "Through the skill of blacksmith,";
- mes "an ore will become a great steel, that's the rule.";
- next;
- switch(select("Hmm... I'll think about it.:Can you help me make it?:Can I craft Angel Wing...?")) {
- case 1:
- mes "[Habir Moah]";
- mes "Hmm, what a pity!";
- mes "I thought I can show my skill again.";
- mes "Oh well.";
- mes "... ... ...";
- mes "Beautiful sky... So blue.";
- close;
- case 2:
- mes "[Habir Moah]";
- mes "Aha, thank you!";
- mes "Let's see the material first, shall we?";
- mes "Evil Wing and Elven Ear,";
- mes "other miscellaneous stuffs and 20000 zeny.";
- mes "All these items really cost something.";
- mes "I will help you make one fine accesory.";
- next;
- mes "[Habir Moah]";
- mes "Before I produce the item, let me remind you.";
- mes "I don't care about";
- mes "the level of refining for the item.";
- mes "If you have worries,";
- mes "I guess you better tidy up your items.";
- next;
- mes "[Habir Moah]";
- mes "^4d4dffPlease Reserve the items,";
- mes "that is required for making the headgear^000000";
- mes "I do not hope that you will blame me,";
- mes "if I fail to make that item.";
- next;
- switch(select("It's ok, just do it.:Hmm, I need to think about it.")) {
- case 1:
- mes "[Habir Moah]";
- mes "So, let's do it!";
- next;
- misceffect 154; //Success Hammer ;P
- mes "[Habit Moah]";
- mes "With my skills,";
- mes "the great creation of me, Habir Moah,";
- mes "is completed!";
- mes "Here it is,";
- mes "the Angel Wing Ears.";
- if (countitem(2255) && countitem(2286) && Zeny>19999) {
- delitem 2255,1;
- delitem 2286,1;
- set Zeny,Zeny-20000;
- getitem 5068,1;
- }
- next;
- mes "[Habir Moah]";
- mes "From now on,";
- mes "everyone will you.";
- close;
- case 2:
- mes "[Habir Moah]";
- mes "If you're interested in it in future,";
- mes "do come and find me.";
- mes " ";
- mes "Ah, what a soothing breeze.";
- close;
- }
- case 3:
- mes "[Habir Moah]";
- mes "Hoho, of course I can craft";
- mes "Angel Wing!";
- mes "I'll make it into Angel Wing Ears!";
- next;
- mes "[Habir Moah]";
- mes "Let's see the materials required, shall we?";
- mes "Angel Wing and Elven Ears,";
- mes "in addition to that, 20,000 zeny.";
- mes "All these items really cost something.";
- mes "I will help you make one fine accesory.";
- next;
- mes "[Habir Moah]";
- mes "Before I produce the item, let me remind you.";
- mes "I don't care about";
- mes "the level of refining for the item.";
- mes "If you have worries,";
- mes "I guess you better tidy up your items.";
- next;
- mes "[Habir Moah]";
- mes "^4d4dffPlease reserve the items,";
- mes "this is required for making the headgear.^000000";
- mes "I do not hope that you will blame me,";
- mes "if I fail to make that item.";
- next;
- switch(select("It's ok. Let's do it.:I need to tidy up first.")) {
- case 1:
- if (countitem(2254) && countitem(2286) && Zeny > 19999) {
- delitem 2254,1;
- delitem 2286,1;
- set Zeny,Zeny-20000;
- mes "[Habir Moah]";
- mes "So, let's do it!";
- next;
- misceffect 154;
- mes "[Habir Moah]";
- mes "With my skills,";
- mes "the great creation of me, Habir Moah,";
- mes "is completed!";
- mes "Here it is,";
- mes "Angel Wing Ears";
- getitem 5074,1;
- next;
- mes "[Habir Moah]";
- mes "Fromnow on,";
- mes "everyone will you.";
- close;
- } else {
- mes "[Habir Moah]";
- mes "I'm sorry. If you have not prepared all the materials,";
- mes "I won't do that for you.";
- mes "I'll need Angel Wing, Elven Ears and";
- mes "20000 zeny.";
- mes "Can you please confirm that you have all of those?";
- close;
- }
- case 2:
- mes "[Habir Moah]";
- mes "If you're interested in it in future,";
- mes "do come and find me.";
- mes " ";
- mes "Ah, what a soothing breeze.";
- close;
- }
- }
- } else {
- mes "[Habir Moah]";
- mes "I am not sure how I have followed the wind,";
- mes "that leads me to Juno...";
- mes "Altough I don't really feel comfortable on a high place like this, the view here is really breath taking.";
- mes "I never knew the sky could be so beautiful,";
- mes "when I was travelling on the land.";
- next;
- mes "[Habir Moah]";
- mes "Anyway, I am a craftman in nature...";
- mes "I feel uneasy if I do not craft anything.";
- mes "And it's been a while since my last creation.";
- mes "If there're materials,";
- mes "I'll surely create the best creation of my life.";
- mes "Unfortunately, there weren't any. ...Hehe...";
- next;
- mes "[Habir Moah]";
- mes "May I ask, do you have either Angel Wing,";
- mes "Evil Wing or Elven Ear?";
- mes "If you do, can you bring it to me?";
- mes "I will help you to make a beautiful";
- mes "Ears of Angel's Wing and Ears of Devil's Wing.";
- next;
- switch(select("Can you tell me about the details?:I'll consider about it.")) {
- case 1:
- mes "[Habir Moah]";
- mes "Oh yes,";
- mes "I need to tell you the details about the materials.";
- mes "Angel Wing Ears requires ^4d4dffAngel Wings^000000 and";
- mes "^4d4dffElven Ears^000000 &#1038;Aand the cost for other materials is";
- mes "approximatedly ^4d4dff20000 zeny^000000";
- next;
- mes "[Habir Moah]";
- mes "Devil Wing Ears requires ^4d4dffEvil Wing^000000 and";
- mes "^4d4dffElven Ears^000000 &#1038;Awhile the cost for other materials is";
- mes "approximately ^4d4dff20000 zeny";
- next;
- mes "[Habir Moah]";
- mes "Please come to me after you have got all the materials.";
- mes "I will make the joy of Angel and terror of Devil";
- mes "as a present for you.";
- close;
- case 2:
- mes "[Habit Moah]";
- mes "I always look at thge sky at this location...";
- mes "So if you need me, you know where to find me.";
- close;
- }
- }
-}
-//Lutie /=Sea Otter Cap=/
-xmas.gat,183,267,3 script Pretty Lindsay 793,{
- if (countitem(5033) && countitem(5064)) {
- delitem 5033,1;
- delitem 5064,1;
- mes "[Pretty Lindsay]";
- mes "Wow~ you really have brought all the items here.";
- mes "Hang on for a while~";
- mes "Lindsay will make that for you right now.";
- next;
- mes "[Pretty Lindsay]";
- mes "Just like what my mom taught me,";
- mes "first, place this on the ground...";
- mes "Preparation complete. . . .";
- mes "Haya, yah!";
- next;
- misceffect 261;
- mes "^FF0000Lindsay put the RaccoonHat on the ground,";
- mes "and place the Smokie Leaf on top of it.";
- mes "Then she say something that none could understand its meaning.";
- mes "There's a bright glitter,";
- mes "and the fur of the RaccoonHat slowly turns into blue color.";
- mes "And finally, the shape of Smokie turns into Otter.";
- next;
- mes "[Pretty Lindsay]";
- mes "Pheww! It's done!";
- mes "It's so tiring I am feeling weak right now!";
- mes "Here~ Take it~";
- getitem 5078,1;
- next;
- mes "[Pretty Lindsay]";
- mes "This is.. This is the best creation of Lindsay.";
- mes "Remember to put it on always~";
- mes "Farewell~";
- close;
- } else {
- mes "[Pretty Lindsay]";
- mes "Hi~ Wassup?";
- if (sex) {
- mes "Handsome boy.";
- } else {
- mes "Beautiful?";
- }
- next;
- mes "[Pretty Lindsay]";
- mes "Do you want to get a cute headgear?";
- mes "Pretty Lindsay is going to create";
- mes "a cap that looks like a Sea Otter this time.";
- mes "How about that? It should be cute, ya?";
- emotion e_heh; //ET_SMILE
- next;
- mes "[Pretty Lindsay]";
- mes "Imagina that~ If you get to wear that hat,";
- mes "you will have the feeling,";
- mes "that you're like an Sea Otter.";
- mes "If you can be like an Sea Otter.. Woah!";
- mes "I am getting excited just by imagining it.";
- next;
- mes "[Pretty Lindsay]";
- mes "However, production of ^4D4DFFSea-Otter Hat^000000 requires,";
- mes "^0000FFRaccoonHat^000000 x1 ^0000FFSmokie Leaf^000000 x1";
- mes "So, if you want to get a Sea-Otter Hat, brother,";
- mes "just bring along the materials,";
- mes "and Lindsay will make it for you immediately.";
- next;
- switch(select("I will come again when I have collected them.:Yo..why RaccoonHat?")) {
- case 1:
- mes "[Pretty Lindsay]";
- mes "Hmm~ Come back soon~";
- emotion e_heh; //ET_SMILE
- close;
- case 2:
- mes "[Pretty Lindsay]";
- mes "Ah..why Sea-Otter Hat production";
- mes "requires Smokie Hat?";
- mes "Hmm. .That's because. . . secrets.. .";
- next;
- mes "[Pretty Lindsay]";
- mes "When you place Smokie Leaf with RaccoonHat,";
- mes "and say the spell,";
- mes "according to what my mom had taught, the RaccoonHat will";
- mes "^003063Bang!!^000000 and turn into Sea-Otter Hat.";
- next;
- mes "[Pretty Lindsay]";
- mes "But I don't know why it can be like that.";
- mes "Mom never tell me the reason.";
- next;
- mes "["+strcharinfo(0)+"]";
- mes ". . . . . . . . . . . . . . . . .";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Ok..Ok, I will come again when I have collected all the items.";
- close;
- }
- }
-}
-//Lutie /=Brown Bear Cap=/ [5059]
-xmas.gat,175,156,3 script Fuzzy Fuzz 712,{
- if (countitem(5030) && countitem(7213) > 99 && countitem(7217) > 99 && countitem(7161) > 299) {
- delitem 5030,1;
- delitem 7213,100;
- delitem 7217,100;
- delitem 7161,300;
- mes "[Fuzzy Fuzz]";
- mes "Good! You've brought it!";
- mes "The production might take some time.";
- mes "There's a lot of amendment to be done.";
- mes "So, please wait for a while.";
- next;
- mes "[Fuzzy Fuzz]";
- mes ". . . TutaTusa. . .";
- mes "Pluck this off. . . .";
- mes "Wuha!~ Sew it happily..";
- mes "Wait a little longer.";
- next;
- mes "[Fuzzy Fuzz]";
- mes "Didn't they say people who wait will be more lucky?";
- mes "It's almost done. So wait for a little while.";
- mes "Rub your hands if you feel cold.";
- next;
- mes "[Fuzzy Fuzz]";
- mes "It is done!";
- mes "I've made a cap that is suitable for you!";
- mes "I know I made it, but it really looks nice.";
- mes "I used a lot of efforts,";
- mes "so please take good care of it.";
- mes "Here~ Please take it with you~";
- getitem 5059,1;
- close;
- } else {
- mes "[Fuzzy Fuzz]";
- if (sex) {
- mes "Hey you, hold it right there!";
- } else {
- mes "Yoh miss, hold it right there.";
- }
- mes "You who look like a slow and dumb bear,";
- mes "I have a cap that fits you,";
- mes "how about that? do you want it?";
- emotion e_omg; //ET_SURPRISE?
- next;
- mes "[Fuzzy Fuzz]";
- mes "Haha.. Looks like you're not happy";
- mes "because I said you look dumb, right?";
- mes "How sensitive . . .";
- mes "What I mean is, you're honest and easy to be tricked.";
- mes "OkOk.. don't look at me like that.";
- emotion e_sry; //ET_SORRY
- next;
- mes "[Fuzzy Fuzz]";
- mes "I can't make the cap now because I do not have the materials.";
- mes "Can you please.";
- mes "find the materials for me?";
- mes "I will help to make the 'Teddybear Hat' for you.";
- next;
- mes "[Fuzzy Fuzz]";
- mes "Come, let me tell you about the required materials.";
- mes "You won't need very much materials here.";
- mes "^0000FFPanda Hat^000000 x1 ^0000FFNeedle Packet^000000 x100";
- mes "^0000FFSpool^000000 x100 ^0000FFBlack Bear's Skin^000000 x300";
- mes "That's all,";
- mes "isn't that easy to be found?";
- next;
- mes "[Fuzzy Fuzz]";
- mes "I will be waiting for you!";
- emotion e_heh; //ET_SMILE
- close;
- }
-}
-//payon /=Cap of Concentration=/ [5073]
-payon_in03.gat,8,193,4 script Nan Hyang 75,{
- if (countitem(2285) && countitem(1550)) {
- mes "[Nan Hyang]";
- mes "Sigh, give that to me.";
- mes "Before I start,";
- mes "take note of this,";
- mes "In the process of production ^FF0000'Model Training Hat'^000000,";
- mes "If ^FF0000the 'Book' is slotted with card,";
- mes "or possesses refined level^000000,";
- emotion e_heh; //ET_SMILE
- next;
- mes "[Nan Hyang]";
- mes "^FF0000the effect will dissappear,";
- mes "Of course, the same goes to the 'Apple of Archer' too^000000.";
- mes "So do you want me to make it now?";
- next;
- switch(select("Start making it:Wait, don't.")) {
- case 1:
- mes "[Nan Hyang]";
- mes "Request accepted,";
- mes "I will start it right now.";
- mes "Please have a seat,";
- mes "and wait for me, will you?";
- mes "This is to make sure that you have the correct posture.";
- mes "Don't worry, it's for free.";
- emotion e_ok; //ET_OK
- next;
- mes "[Nan Hyang]";
- mes "Please be patient!";
- next;
- mes ". . . . . . . . . . . . . . . . . .";
- mes " . . . . . . . . . . . . . . . . . ";
- mes ". . . . . . . . . . . . . . . . . .";
- mes " . . . . . . . . . . . . . . . . . ";
- next;
- mes "[Nan Hyang]";
- mes "This is not a hard task,";
- mes "so it's going to be completed right away..";
- mes "Please wear this hat,";
- mes "to keep a correct posture.";
- mes "Thank you!";
- next;
- mes "[Nan Hyang]";
- mes "An apple is placed on the book,";
- mes "keep it balanced and don't let is fall.";
- mes "This is the reason to put on the 'Model Training Hat',";
- mes "to keep the balance in order to keep the correct posture.";
- emotion e_oh; //ET_AHA? =X
- next;
- mes "[Nan Hyang]";
- mes "You might feel unconfortable and pain on your neck at the beginning.";
- mes "But as you use it,";
- mes "you will slowly found your posture going better.";
- if (countitem(2285) && countitem(1550)) {
- delitem 2285,1;
- delitem 1550,1;
- getitem 5073,1;
- }
- next;
- mes "[Nan Hyang]";
- mes "Here it is.";
- mes "Please take it.";
- mes "Ah.. Before I forget,";
- mes "This is the Arrow taken from the Apple of Archer.";
- mes "Please take it.";
- getitem 1750,1;
- next;
- mes "[Nan Hyang]";
- mes "Farewell then.";
- mes "Have a balanced day.";
- close;
- case 2:
- mes "[Nan Hyang]";
- mes "Ah.. isn't this an item that requires a lot of equipments?";
- mes "If you've fully prepared, come and find me.";
- emotion e_hmm; //ET_THINK?
- close;
- }
- } else {
- mes "[Nan Hyang]";
- mes "Good day.";
- mes "This place teaches manners and posture.";
- mes "May I know,";
- mes "how can I help you here?";
- emotion e_omg; //ET_SURPRISE?
- next;
- switch(select("I want to learn too . .:I'm sorry. I think I came to a wrong place.")) {
- case 1:
- mes "[Nan Hyang]";
- mes "Oh, I see.";
- mes "But how do I say this?";
- mes "I'm really sorry,";
- mes "we are not having any intake currently.";
- next;
- mes "[Nan Hyang]";
- mes "And since the president is going outstation,";
- mes "and we're not sure,";
- mes "when he'll return,";
- mes "(Phew..how long are you going to";
- mes "stay in the in. . . .)";
- next;
- mes "[Nan Hyang]";
- mes "Hmm, beofre you take the course of manners,";
- mes "we have to correct";
- mes "your unbalance posture first.";
- mes "This means that,";
- mes "a correct posture is a polite action.";
- mes "That's what I think.";
- next;
- mes "[Nan Hyang]";
- mes "Since it is quite impossible to correct your posture now,";
- mes "I will let you correct it yourself.";
- mes "The method is";
- mes "to create a 'Model Training Hat',";
- mes "for you.";
- next;
- mes "[Nan Hyang]";
- mes "Do you want me to make this for you?";
- mes "If you want it,";
- mes "please take the materials required here.";
- mes "Generally I can give it to you for free.";
- mes "But there's no stock in the storage anymore.";
- emotion e_hmm; //ET_QUESTION?
- next;
- mes "[Nan Hyang]";
- mes "If you bring ^0000FFApple of Archer^000000 x1 and ^0000FFBook^000000 x1,";
- mes "I will produce it,";
- mes "and give the product to you.";
- next;
- mes "[Nan Hyang]";
- mes "After you've get these items,";
- mes "come and find me.";
- mes "Farewell then.";
- close;
- case 2:
- mes "[Nan Hyang]";
- mes "Oh, I see.";
- mes "This place should be kept silent.";
- mes "If you do not have any important matters,";
- mes "can you please go out? Thank you.";
- mes "Good byethen. . .";
- close;
- }
- }
-}
-//geffen /=Tulip Hairpin=/
-geffen.gat,83,189,5 script Ses 716,{
- mes "[Ses]";
- mes "My name is Ses.";
- mes "Ses like to fold paper.";
- mes "I used a big colorful paper to make a huge boat for mummy yesterday.";
- mes "She thank me and touch my head, hehe.";
- emotion e_heh; //ET_SMILE
- next;
- mes "[Ses]";
- mes "Today, the teacher teaches us the method to make beautiful flower!!!";
- mes "Altough it's a little bit hard~ it's very interesting~";
- mes"The flower is beautiful when you put it on your head. Everyone tell me so, and I'm so happy!";
- emotion e_heh; //ET_THROB?=X
- next;
- if (countitem(2278) && countitem(975)) {
- mes "[Ses]";
- mes "Hehe- Mr. Smile!! Scarlet Dyestuffs!!!";
- mes "WuYeaghhhhh---";
- mes "Come, let me";
- mes "help you make a beautiful flower !!";
- emotion e_swt; //ET_SWEAT
- next;
- mes "[Ses]";
- mes "Let me make it for you, ok? Ok????";
- emotion e_swt;
- next;
- switch(select("Allow you to do so:I reject")) {
- case 1:
- mes "[Ses]";
- mes "Wahahahaha~";
- emotion e_heh;
- next;
- mes "[Ses]";
- mes "Take this Mr Smile,";
- mes "cut here a little, cut there some~~";
- mes "and a little there, and here....";
- mes "yiyik...";
- emotion e_ho; //ET_DELIGHT?
- next;
- mes "[Ses]";
- mes "Ha- !! It's done!!!!";
- if (countitem(2278) && countitem(975)) {
- delitem 2278,1;
- delitem 975,1;
- getitem 5077,1;
- }
- next;
- mes "[Ses]";
- mes "Hehe, it's done,";
- mes "How about it? Cute, isn't it? Right?";
- next;
- mes "[Ses]";
- mes "Am I good?";
- mes "Hehe, I am making one for my bother too.";
- mes "You need one, brother.";
- mes "come and find me again if you want me to make a beautiful flower again.";
- mes "Good bye then~";
- close;
- case 2:
- mes "[Ses]";
- mes "Yiyee~~ I don't need to help you do it again then!!";
- close;
- }
- } else {
- mes "[Ses]";
- mes "Do you want to make on too, big brother?";
- mes "I will teach you... hehehe";
- next;
- mes "[Ses]";
- mes "However, you need to prepare some items,";
- mes "because I don't have anything now.";
- mes "Can you bring it to me, big brother?";
- next;
- switch(select("Sure:No")) {
- case 1:
- mes "[Ses]";
- mes "So please bring,";
- mes "^3131FFMr. Smile x1";
- mes "Scarlet Dyestuffs x1^000000";
- mes "I will make a beautiful red flower for you.";
- next;
- mes "[Ses]";
- mes "I will wait for you here. Remember to come, ok!?";
- close;
- case 2:
- mes "[Ses]";
- mes "Hooyeahyeahyeah~~~~~";
- emotion e_sob;
- close;
- }
- }
-}
-//Lutie /=Party Hat, Straw Hat, Cowboy Hat, Sombrero and Fur hat=/
-xmas_in.gat,35,30,3 script Headgear Merchant 797,{
- mes "[Mike]";
- mes "I like hats...";
- mes "I like hats more than any other thing in this world!!";
- mes "Even if you compared hats with eating,";
- mes "wearing a new hat is far more important";
- next;
- mes "[Mike]";
- mes "Hat, Cap, Holy Bonnet,";
- mes "Turban, Iron Helm,";
- mes "Hemmed Sallet, Munak Turban...";
- mes "I like them all!!";
- mes "(Wuhoo! Wuhoohoo!!)";
- next;
- mes "[Mike]";
- mes "I have learned the way to modified a hat,";
- mes "and I am researching";
- mes "to design the most fashionable hat.";
- next;
- switch(select("Party Hat:Straw Hat:Cowboy Hat:Sombrero:Fur Hat")) {
- case 1: //Party hat [5060]
- if(countitem(2236) && countitem(7151) > 99 && countitem(7111) > 99) {
- mes "[Mike]";
- mes "Party Hat! It is made according to the Santa's Hat,";
- mes "decorated with some papers.";
- mes "This is the best Party Hat!! Do you want it?";
- mes "(Ohhhh, beautiful! So beautiful!)";
- next;
- mes "[Mike]";
- mes "Wait, before I start the production, let's confirm this.";
- mes "I will use items regarless of whether,";
- mes "it had been refined or slotted with cards.";
- mes "So you better just prepare the items required,";
- mes "and put the others in the storage.";
- next;
- mes "[Mike]";
- mes "You've brought all the materials...";
- mes "Great! The one who wants a Party Hat,";
- mes "do you want me to make it for you right now?";
- next;
- switch(select("No:Yes")) {
- case 1:
- mes "[Mike]";
- mes "Hmm, is that so...";
- mes "Let keep wearing your Santa's Hat then.";
- mes "Hmmmhmmmhmmm....";
- close;
- case 2:
- mes "^3355FFDeteDete ChebenCheben";
- mes "PotterPotter MeganMegan";
- mes "PosongPosong ShahaShaha";
- next;
- if(countitem(2236) && countitem(7151) > 99 && countitem(7111) > 99) {
- delitem 2236,1;
- delitem 7151,100;
- delitem 7111,100;
- getitem 5060,1;
- }
- mes "[Mike]";
- mes "Very Good!";
- mes "Force the birthday fellow to put this on,";
- mes "then you can play tricks on him. That should be fun...";
- mes "Please come again too next time~";
- next;
- mes "[Mike]";
- mes "And, this is what's left after the process.";
- mes "Here, take it!";
- mes "Maybe it might be useful to you... (Hehehehe)";
- getitem 949,10;
- close;
- }
- } else {
- mes "[Mike]";
- mes "Party Hat! It's a necessity,";
- mes "for anyone who throws a birthday party.";
- mes "No matter how serious looking one is,";
- mes "the hat will make him look cute and funny!";
- next;
- mes "[Mike]";
- mes "In my opinion, it is suitable not only for birthday,";
- mes "but as well as entertaining event!";
- mes "This beautiful hat is just suitable for fun.";
- mes "(...How about organizing a party for adventure?!?)";
- next;
- mes "[Mike]";
- mes "Anyway, the material required are";
- mes "^3355FFSanta's Hat^000000 x1";
- mes "^3355FFOil Paper^000000 x100";
- mes "^3355FFSlick Paper^000000 x100";
- next;
- mes "[Mike]";
- mes "These are what I need.";
- mes "So don't forget to collect the material, ok?";
- mes "I will always be around....";
- mes "So come back only after you have collected them!";
- close;
- }
- case 2: //Straw Hat [5062]
- if(countitem(2280) && countitem(7197) > 299 && countitem(7150) > 299) {
- mes "[Mike]";
- mes "Straw Hat! This hat is based on Sahkkat,";
- mes "that is make of bamboo and rattan.";
- mes "Wearing it makes you think that you're going to have a good harvesting year!";
- mes "(Look, power of farmer!!)";
- next;
- mes "[Mike]";
- mes "Wait, before I start the production, let's confirm this.";
- mes "I will use items regardless of whether";
- mes "it had been refined or slotted with cards.";
- mes "So you better just prepare the items required,";
- mes "and put the others in the storage.";
- next;
- mes "[Mike]";
- mes "You've brought all the materials...";
- mes "Great! The one who wants a Straw Hat,";
- mes "do you want me to make it for you right now?";
- next;
- switch(select("No, thanks:Sure")) {
- case 1:
- mes "[Mike]";
- mes "Hmm, is that so...";
- mes "Let keep wearing your Sahkkat then.";
- mes "Hmmmhmmmhmmm....";
- close;
- case 2:
- mes "^3355FFSakaSaka WakaWaka";
- mes "JekaJeka HuyiHuyi";
- mes "PokaPoka TewuTewu^000000";
- next;
- if(countitem(2280) && countitem(7197) > 299 && countitem(7150) > 299) {
- delitem 2280,1;
- delitem 7197,300;
- delitem 7150,300;
- getitem 5062,1;
- }
- mes "[Mike]";
- mes "HmmHmm! It feels that the harvest of this year shall be good!";
- mes "I hope next year will be the same too...";
- mes "Ahahaha, what am I talking about...";
- mes "Please come again if you want more~";
- close;
- }
- } else {
- mes "[Mike]";
- mes "Staw Hat! It gives you energy to work,";
- mes "even under the heat of the sun";
- mes "as well as providing shades that give you a cool feeling.";
- mes "This hat will make you hope for a good harvest this year too!";
- next;
- mes "[Mike]";
- mes "This hat is suitable for the farmers,";
- mes "who want to plant or cultivate their crops.";
- mes "You have the feel of a villager when you wear it!";
- mes "(For your info, I am a city kid!)";
- next;
- mes "[Mike]";
- mes "Anyway, the materials required for production are";
- mes "^3355FFSakkat^000000 x1";
- mes "^3355FFTough Vines^000000 x300";
- mes "^3355FFPiece of Bamboo^000000 x300";
- next;
- mes "[Mike]";
- mes "These are what I need.";
- mes "So don't forget to collect all the material, ok?";
- mes "I will always be around....";
- mes "So come back only after you have collected them!";
- close;
- }
- case 3: //Cowboy Hat [5075]
- if (countitem(2248) && countitem(7030) > 107 && countitem(7194) > 107 && countitem(7120) > 3) {
- mes "[Mike]";
- mes "Cowboy Hat! A hat of western feel,";
- mes "but looks toughet than Western Grace,";
- mes "That is suitable for the western's males!";
- mes "(Qiang... Yeehahaa~...)";
- next;
- mes "[Mike]";
- mes "Wait, before I start the production, let's confirm this.";
- mes "I will use item regardless of wether";
- mes "It had been refined or slotted with cards.";
- mes "So you better just prepare the items required,";
- mes "and put the others in the storage.";
- next;
- mes "[Mike]";
- mes "You've brought all the materials...";
- mes "Great! The one who wants a Cowboy Hat,";
- mes "do you want me to make it for you right now?";
- switch(select("No:Yes")) {
- case 1:
- mes "[Mike]";
- mes "Hmm,is that so...";
- mes "Let keep wearing your typical Western Grace then.";
- mes "Hmmmhmmmhmmm....";
- close;
- case 2:
- mes "^3355FFDudududu bangbangbangbang";
- mes "TadamTadam BiyongBiyong";
- mes "Wuuuuu Ahwuwuwuwuw^000000";
- next;
- if (countitem(2248) && countitem(7030) > 107 && countitem(7194) > 107 && countitem(7120) > 3) {
- delitem 2248,1;
- delitem 7030,108;
- delitem 7194,108;
- delitem 7120,4;
- getitem 5075,1;
- }
- mes "[Mike]";
- mes "HeeeHaH! With that";
- mes "you can tame even the wildest stiallion!";
- mes "Please come again if you need more~";
- close;
- }
- } else {
- mes "[Mike]";
- mes "Cowboy Hat!A hat of western feel,";
- mes "where you seem to found the boiling blood of the cowboys...";
- mes "It's as if you are going to draw something out,";
- mes "and start shooting!";
- next;
- mes "[Mike]";
- mes "The Cowboy Hat with thefeel of opening a barren land...";
- mes "It makes guys look cool!";
- mes "and it makes gals look prettier";
- mes "(Is tought the new concept of beauty...?)";
- next;
- mes "[Mike]";
- mes "Anyway, the materials required for production are";
- mes "^3355FFWestern Grace^000000 x1";
- mes "^3355FFClaw of Desert Wolf^000000 x108";
- mes "^3355FFSoft Blade of Grass^000000 x108";
- mes "^3355FFBurning Horseshoe^000000 x4";
- next;
- mes "[Mike]";
- mes "These are what I need.";
- mes "So don't forget to collect the material, ok?";
- mes "I will always be around....";
- mes "So come back only after you have collected them!";
- close;
- }
- case 4: //Sombrero [5067]
- if (countitem(5062) && countitem(952) > 49 && countitem(1907)) {
- mes "[Mike]";
- mes "SipoleiyeahhhhhhWoohohoh!!";
- mes "Amigo! Adios Amigo!";
- mes "If you like the sun and happy melody,";
- mes "this is the right hat for you!!";
- next;
- mes "[Mike]";
- mes "Wait, before I start the production, let's confirm this.";
- mes "I will use items regardless of wether";
- mes "it had been refined or slotted with cards.";
- mes "So you better just prepare the items required";
- mes "and put the others in the storage";
- next;
- mes "[Mike]";
- mes "You've brought all the materials...";
- mes "Great! The one who wants a Sombrero,";
- mes "so you want me to make if for you right now?";
- switch(select("No:Yes")) {
- case 1:
- mes "[Mike]";
- mes "Hmmm, is that so...";
- mes "Let keep wearing your shady Straw Hat then.";
- mes "Hmmmhmmmhmmm....";
- close;
- case 2:
- mes "^3355FFQingkaQinka KiangggQiangkiang";
- mes "Diringringling kaciangkaciang";
- mes "Adios Mamamiya^000000";
- next;
- if (countitem(5062) && countitem(952) > 49 && countitem(1907)) {
- delitem 5062,1;
- delitem 952,50;
- delitem 1907,1;
- getitem 5067,1;
- }
- mes "[Mike]";
- mes "If you wear this to the desert,";
- mes "you'll be Muka's friend too!! Full with joyous tempo and heat!!";
- mes "Please come again if you want more~";
- close;
- }
- } else {
- mes "[Mike]";
- mes "Yibayiba, andeleh andeleh!!";
- mes "Amigo! Adios, Amigo!";
- mes "Come again, Morocc!";
- mes "Astalacista Baby!";
- next;
- mes "[Mike]";
- mes "For you who like the sun and loud music!!";
- mes "I present you with";
- mes "the tri-level hat, Sombrero!!";
- mes "(From Yggdrasil tree trill here!?)";
- next;
- mes "[Mike]";
- mes "Anyway, the materials required for production are";
- mes "^3355FFStraw Hat^000000 x1,";
- mes "^3355FFCactus Needle^000000 x50,";
- mes "^3355FFGuitar^000000 x1";
- next;
- mes "[Mike]";
- mes "These are what I need";
- mes "So don't forget to collect the material, ok?";
- mes "I will always be around....";
- mes "So come back only after you have collected them!";
- close;
- }
- case 5: //fur hat [5076]
- if (countitem(2226) && countitem(7038) > 499) {
- mes "[Mike]";
- mes "Fur Hat! Yo, Man! Check it out!";
- mes "It's good for keeping warm! But it's fashionable too!";
- mes "Even if you went to places as cold as Lutie,";
- mes "you will be ok with this Beanie!!";
- next;
- mes "[Mike]";
- mes "Wait, before I start the productions, let's confirm this.";
- mes "I will use items regardless of wether";
- mes "it had been refined or slotted with cards.";
- mes "So you better just prepare the items required,";
- mes "and put the others in the storage.";
- next;
- mes "[Mike]";
- mes "You've brought all the materials...";
- mes "Great! The one who wants a Beanie,";
- mes "do you want me to make it for you right now?";
- next;
- switch(select("No:Yes")) {
- case 1:
- mes "[Mike]";
- mes "Hmm, is that so...";
- mes "Let keep wearing your Cap that is produce in bundles then.";
- mes "Hmmmhmmmhmmm....";
- close;
- case 2:
- mes "^3355FFKafokapo Kafokapo";
- mes "poterpote poterpote";
- mes "PosongPosong PosongPosong";
- next;
- if (countitem(2226) && countitem(7038) > 499) {
- delitem 2226,1;
- delitem 7038,500;
- getitem 5076,1;
- }
- mes "[Mike]";
- mes "Complete! The nicely knitted,";
- mes "cute white hat! Yeat! Go Go!";
- mes "Please come again if you need more~";
- close;
- }
- } else {
- mes "[Mike]";
- mes "Beanie! Gimme a chocolate!! Right!";
- mes "No matter who wears it,";
- mes "you will feel the snowy winter!! Event if you are from Morocc,";
- mes "you will look more like a traveller from Lutie if you put that on!";
- next;
- mes "[Mike]";
- mes "There was a rumor";
- mes "people wearing it will pull out his hard and shout Yo without knowing it-";
- mes "I think we better change a topic...";
- mes "(Hot weather, the head can't stand the heat?!?)";
- next;
- mes "[Mike]";
- mes "Anyway, the material required for production are";
- mes "^3355FFCap^000000 x1,";
- mes "^3355FFYarn^000000 x500.";
- next;
- mes "[Mike]";
- mes "These are what I need.";
- mes "So don't forget to collect the material, ok?";
- mes "I will always be around....";
- mes "So come back only after you have collected them!";
- close;
- }
- }
-}
-//Yuno /=Big Golden Bell, Headgear of Queen and Mistress Crown=/
-yuno_in03.gat,20,18,6 script Neris 726,{
- mes "[Neris]";
- mes "This time,";
- mes "as a gratitude of everyone's support to the Museum,";
- mes "we have prepared a special item,";
- mes "That is ...!";
- next;
- mes "[Neris]";
- mes "If an accessoiries for monsters is reconstructed, it can be equipped by human too!";
- next;
- mes "[Neris]";
- mes "We are in the experimenting stage currently,";
- mes "and there're only 3 type of monster's accesories that can be equipped.";
- mes "Maybe there're more to come in the future.";
- mes "However,";
- mes "we cannot provide these accessories to everyone without limit.";
- mes "We would like to ask for the materials and production fee,";
- mes "before we can provide the accessories to you.";
- next;
- mes "[Neris]";
- mes "Please select an accessoiries that you are curious of, or wich us to produce for you.";
- next;
- switch(select("Decorative Golden Bell:Crown of Ancient Queen:Crown of Mistress")) {
- case 1: //Big golden bell [5091]
- mes "[Neris]";
- mes "The Decorative Golden Bell is";
- mes "the accessory equipped by the monster 'Sohee'.";
- mes "It's very suitable and looks good on female players.";
- mes "Altough it might be a little big, I'm sure you'll like it.";
- next;
- if (countitem(10016) && countitem(714) && countitem(969) > 2 && Zeny > 19999) {
- delitem 10016,1;
- delitem 714,1;
- delitem 969,3;
- set Zeny,Zeny-20000;
- mes "[Neris]";
- mes "So you have brought all the required materials.";
- mes "Please wait for a while.";
- next;
- mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -^000000";
- getitem 5091,1;
- next;
- mes "[Neris]";
- mes "EEyaah~ The elegant golden bell is complete.";
- mes "Walk around with it.";
- mes "Altough it won't make the ding dong sounds,";
- mes "it sure is beautiful.";
- next;
- mes "[Neris]";
- mes "Don't you feel that you look like a Sohee now?";
- mes "But don't commit suicide like her.";
- mes "If you want to make anymore of it,";
- mes "do come and find me again.";
- mes "Finally, please come to visit the Monster Museum frequently.";
- close;
- } else {
- mes "[Neris]";
- mes "The material required for the production of this item are,";
- mes "^3355FFGolden Bell x1, Emperium x1, Gold x3^000000 and";
- mes "20,000 zeny";
- next;
- mes "[Neris]";
- mes "As long as you are prepared,";
- mes "with the materials and zeny required for the production,";
- mes "I will make it for you anytime.";
- close;
- }
- case 2: //Headgear of Queen [5080] (Crown of ancient queen)
- mes "[Neris]";
- mes "The Crown of Ancient Queen is the equipment of";
- mes "monster 'Isis'.";
- mes "When you wear it,";
- mes "you will feel like a queen.";
- next;
- if (countitem(10006) && countitem(714) && countitem(969)>2 && Zeny>19999) {
- delitem 10006,1;
- delitem 714,1;
- delitem 969,3;
- set Zeny,Zeny-20000;
- mes "[Neris]";
- mes "So you have brought all the required materials.";
- mes "Please wait for a while.";
- next;
- mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -";
- getitem 5080,1;
- next;
- mes "[Neris]";
- mes "Here it is! The Crown of Ancient Queen!";
- mes "Altough you won't become a real queen after wearing it,";
- mes "you will surely";
- mes "have a different feeling.";
- next;
- mes "[Neris]";
- mes "After you wear this,";
- mes "I think you should really have a good figure,";
- mes "because that will be more meaningful.";
- mes "If you need to make it again,";
- mes "do come find me again.";
- mes "Finally, please come to visit the Monster Museum frequently.";
- close;
- } else {
- mes "[Neris]";
- mes "The materials required for the production are";
- mes "^3355FFQueen's Hair Ornament x1, Emperium x1, Gold x3^000000 and";
- mes "20,000 zeny.";
- next;
- mes "[Neris]";
- mes "As long as you are prepared";
- mes "with the materials and zeny required for the production";
- mes "I will make it for you anytime.";
- close;
- }
- case 3: //crown of mistress [5081]
- mes "[Neris]";
- mes "Crown of Mistress is";
- mes "brought by monster 'Mistress'."; //Maya? riiiight!
- mes "You can feel the precence of Mistress from it.";
- next;
- if (countitem(2249) && countitem(714) && countitem(969)>2 && Zeny>39999) {
- mes "[Neris]";
- mes "So you have brought everything.";
- mes "^FF0000However, during the process of production,";
- mes "no matter how many times";
- mes "the coronet is refined,";
- mes "it does not have effect to the product.";
- next;
- mes "[Neris]";
- mes "^FF0000So,";
- mes "please bring along only the Coronet x 1 that is required for the production.";
- mes "If anything is missing,";
- mes "we will not take responsible of it.^000000";
- mes "So, are you ready?";
- next;
- switch(select("Yes, I am.:Hold on, please")) {
- case 1:
- mes "[Neris]";
- mes "Please wait for a while.";
- next;
- mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -";
- if (countitem(2249) && countitem(714) && countitem(969)>2 && Zeny>39999) {
- delitem 2249,1;
- delitem 714,1;
- delitem 969,3;
- set Zeny,Zeny-40000;
- getitem 5081,1;
- }
- next;
- mes "[Neris]";
- mes "Woohoo!";
- mes "The beautiful Crown of Mistress is completed.";
- mes "Altough you won't have any servants,";
- mes "after you've worn it,";
- mes "I am sure you're having a different feeling.";
- next;
- mes "[Neris]";
- mes "If you wear this crown,";
- mes "and takea photo with Mistress,";
- mes "it will be very interesting.";
- mes "If you want to make anymore of it,";
- mes "do come find me again.";
- mes "Finally, please come to visit the Monster Museum frequently.";
- close;
- case 2:
- mes "[Neris]";
- mes "Please confirm it first";
- mes "before you come to me~";
- close;
- }
- } else {
- mes "[Neris]";
- mes "The materials required for production are";
- mes "^3355FFCoronet x1, Emperium x1, Gold x3^000000 together with";
- mes "40,000 zeny.";
- next;
- mes "[Neris]";
- mes "As long as you are prepaired";
- mes "with the materials and zeny required for the production,";
- mes "I will make it for you anytime.";
- close;
- }
- }
-}
-//Aldebaran /=Alarm Mask=/
-//Effects: EF_BLASTMINE: 106
-//EF_FLASHER:99
-alde_alche.gat,88,180,1 script Muscle Man#Alarm 1193,{
-end;
-}
-alde_alche.gat,88,180,1 script Muscle Man#Masked Alarm 748,{
- mes "[Muscle Man]";
- mes "Muscle, muscle. I like it. Hehe!!";
- mes "What a beautiful robotic muscle!";
- misceffect 99;
- disablenpc "Muscle Man#Masked Alarm";
- enablenpc "Muscle Man#Alarm";
- enablenpc "#Masked Alarm1";
- enablenpc "#Masked Alarm2";
- enablenpc "#Masked Alarm3";
- enablenpc "#Masked Alarm4";
- donpcevent "#Masked Alarm1::OnBlast";
- donpcevent "#Masked Alarm2::OnBlast";
- donpcevent "#Masked Alarm3::OnBlast";
- donpcevent "#Masked Alarm4::OnBlast";
- next;
- disablenpc "Muscle Man#Alarm";
- enablenpc "Muscle Man#Masked Alarm";
- if (countitem(2288) && countitem(1095) > 2999) {
- switch(select("Give him the item:End")) {
- case 1:
- mes "You found... You found it. You really found it!";
- mes "That's great! That's so great!";
- next;
- mes "[Muscle Man]";
- mes "Yes... From today onwards, the Clock Hand and Mr. Scream are mine! My Precious!";
- next;
- mes "[Muscle Man]";
- mes "And this, this shall be your precious.";
- if (countitem(2288) && countitem(1095) > 2999) {
- delitem 1095,3000;
- delitem 2288,1;
- getitem 5086,1;
- }
- next;
- mes "[Muscle Man]";
- mes "Good... Good bye! If you find more, remember to bring it here!!";
- donpcevent "#Masked Alarm1::OnBlast";
- donpcevent "#Masked Alarm2::OnBlast";
- donpcevent "#Masked Alarm3::OnBlast";
- donpcevent "#Masked Alarm4::OnBlast";
- disablenpc "#Masked Alarm1";
- disablenpc "#Masked Alarm2";
- disablenpc "#Masked Alarm3";
- disablenpc "#Masked Alarm4";
- close;
- case 2:
- mes "[Muscle Man]";
- mes "Hmm? Do you have anything to say to me?";
- mes "I smell something. Isn't that the nice smell of the grease from Mr. Alarm that I sense now?";
- donpcevent "#Masked Alarm1::OnBlast";
- donpcevent "#Masked Alarm2::OnBlast";
- donpcevent "#Masked Alarm3::OnBlast";
- donpcevent "#Masked Alarm4::OnBlast";
- disablenpc "#Masked Alarm1";
- disablenpc "#Masked Alarm2";
- disablenpc "#Masked Alarm3";
- disablenpc "#Masked Alarm4";
- close;
- }
- } else {
- mes "[Muscle Man]";
- mes "This is the item created by 'Loui Meato' that is attached to the arms and legs of Alarm.";
- mes "This is the ancient technique that can be found in the Clock Tower.";
- next;
- mes "[Muscle Man]";
- mes "If there's any skill to shrink this thing, 'Loui Meato' can be used by everyone soon!";
- next;
- mes "[Muscle Man]";
- mes "Although I've lost my arm and legs in an alchemy accident, but if I can make this technique for public, it will benefit a lot of people!";
- next;
- mes "[Muscle Man]";
- mes "Therfore... I want to ask you";
- mes "Do you have the will to help my in this research?";
- next;
- mes "[Muscle Man]";
- mes "The material is not enough. I want the Alarm's ^0000FFClock Hand^000000 and that strange ^0000FFMr. Scream^000000 that is said to look like the mask of Alarm.";
- mes "It will help a lot if you have those things.";
- next;
- mes "[Muscle Man]";
- mes "However, when I saw the Alarm in the Clock Tower, I will be fascinated by the great work on the creature's mechanical parts that is so brilliantly designed and manifactured.";
- mes "I've forgotten everything, including the materials required for the research.";
- next;
- mes "[Muscle Man]";
- mes "I am telling you this, to give you the opportunity to help me.";
- mes "So how about that? Do you wish to help me? The price is the Mask of Alarm that looks really good! It's a very important thing, you know?";
- next;
- donpcevent "#Masked Alarm1::OnBlast";
- donpcevent "#Masked Alarm2::OnBlast";
- donpcevent "#Masked Alarm3::OnBlast";
- donpcevent "#Masked Alarm4::OnBlast";
- disablenpc "#Masked Alarm1";
- disablenpc "#Masked Alarm2";
- disablenpc "#Masked Alarm3";
- disablenpc "#Masked Alarm4";
- switch(select("I will help you:............")) {
- case 1:
- case 2:
- mes "[Muscle Man]";
- mes "Ohohoh! You agree that Mr. Alarm is beautiful too!";
- mes "Good, good!";
- next;
- mes "[Muscle Man]";
- mes "What I want is, ^0000FFClock Hand x3000^000000 and";
- mes "^0000FFMr. Scream x1 ^000000";
- mes "With these items, I will be able to reasearch the fascinating parts of Mr. Alarm.";
- next;
- mes "[Muscle Man]";
- mes "I have said before. If you're able to find these things, I will give you Mr. Alarm's Mask.";
- mes "You will have the chance to wear ^0000FFAlarm's Mask^000000!";
- next;
- mes "[Muscle Man]";
- mes "Go! Go and find them now!";
- mes "Follower of Mr Alarm.";
- mes "The researcher of 'Loui Meato'.";
- mes "He who wants to be Mr. Alarm!";
- close;
- }
- }
-OnInit:
- disablenpc "#Masked Alarm1";
- disablenpc "#Masked Alarm2";
- disablenpc "#Masked Alarm3";
- disablenpc "#Masked Alarm4";
- disablenpc "Muscle Man#Alarm";
- end;
-}
-alde_alche.gat,86,184,3 script #Masked Alarm1 1193,{
-end;
-OnBlast:
-misceffect 106;
-end; }
-alde_alche.gat,89,184,3 script #Masked Alarm2 1193,{
-end;
-OnBlast:
-misceffect 106;
-end; }
-alde_alche.gat,92,184,3 script #Masked Alarm3 1193,{
-end;
-OnBlast:
-misceffect 106;
-end; }
-alde_alche.gat,95,184,3 script #Masked Alarm4 1193,{
-end;
-OnBlast:
-misceffect 106;
-end; }
-//Morocc /= Drooping Kitty, Huge Leaf, Lazy Smokie and Blue Fish =/
-morocc.gat,273,79,4 script Traveler 99,{
- function creation_lines {
- mes "[Human]";
- mes "Ah....So do you have all of it?";
- mes "Haha";
- mes "What an opportunity for me to show my skill.";
- mes "Please wait for a moment.";
- mes "....";
- next;
- next;
- mes "SiwuSiwu...";
- next;
- mes "SiwuSiwu...";
- mes "DudaTeda...";
- next;
- mes "SiwuSiwu...";
- mes "DudaTeda...";
- mes "ChepoChepo....";
- next;
- mes "SiwuSiwu...";
- mes "DudaTeda...";
- mes "ChepoChepo....";
- mes "HuizheHuizhe.....";
- mes "I think I heard some strange noises.";
- next;
- mes "[Human]";
- mes "Uhoh, can you wait for a while?";
- mes "It's almost done.";
- mes "............";
- next;
- mes "HeniHeniHeni...";
- mes "............";
- next;
- mes "HeniHeniHeni...";
- mes "KodeKode...";
- mes "............";
- next;
- mes "[Human]";
- mes "Ah, finally it is done.";
- mes "I have not done this too long.";
- mes "So it takes a little longer then I expect.";
- mes "Haha";
- next;
- mes "[Human]";
- mes "Now, here it is.";
- mes "I rarely feel this happy.";
- mes "Ah, I will take the claw too.";
- mes "Just think of it as ... some process fee.";
- mes "Haha....";
- return;
- }
-
- if(countitem(7030)) {
- mes "[Human]";
- mes "Ah....";
- mes "Claw of the Desert Wolf...";
- mes "You have this...";
- mes "This is the true symbol of Desert.";
- mes "Haha...";
- mes "It's been a while since I saw this last time.";
- mes "It really makes me feel reenergized!";
- next;
- mes "[Human]";
- mes "Haha... You have let me see a great thing.";
- mes "And I am going to pay you back!";
- mes "I have traveled to a lot of places,";
- mes "and learn to create a lot of things.";
- mes "May I know what do you wnat?";
- next;
- mes "[Human]";
- mes "Oh yes..."; //here we go again =3
- mes "If your equipment has been refined";
- mes "or slotted with cards,";
- mes "^FF0000the level of refines and cards will dissapear too.^000000";
- mes "So please confirm the item you require.";
- next;
- switch(select("Drooping Cat:Smokie Leaf:Lazy Smokie:Blue Fish:There's nothing that I like.")) {
- case 1:
- if (countitem(2233) && countitem(983) && countitem(7206) > 299 && countitem(7030)) {
- delitem 2233,1;
- delitem 983,1;
- delitem 7206,300;
- delitem 7030,1;
- creation_lines;
- getitem 5058,1;
- close;
- } else {
- mes "[Human]";
- mes "Ah, you want the Drooping Cat.";
- mes "Well,";
- mes "I can make that for you,";
- mes "but you will have to gather the required materials by yourself.";
- mes "I heard that it is not easy to find the materials.";
- next;
- mes "[Human]";
- mes "They are..";
- mes "^FF0000One slot circlet^000000 and";
- mes "^FF0000Black Dyestuff x1^000000";
- mes "plus ^FF0000Black Cat Doll x 300^000000.";
- mes "This is all you need.";
- mes "If you bring them to me, I will make the Cat for you.";
- close;
- }
- case 2: //Smokie Leaf [5064]
- if (countitem(945) > 599 && countitem(7030)) {
- delitem 945,600;
- delitem 7030,1;
- creation_lines;
- getitem 5064,1;
- close;
- } else {
- mes "[Human]";
- mes "Ah, so you want the Smokie Leaf.";
- mes "Well,";
- mes "I can make that for you,";
- mes "but you will have to";
- mes "gather the required materials by yourself.";
- mes "I heard that it is not easy to find the materials.";
- next;
- mes "[Human]";
- mes "This item ..";
- mes "requires ^FF0000Raccoon Leaf x600^000000 ";
- mes "It might be a lot, but I'm sure you can get it, can't you?";
- mes "If you bring it to me, I will make the headgear for you.";
- close;
- }
- case 3: //Lazy Smokie [5084]
- if (countitem(1026)>999 && countitem(7065)>99 && countitem(945)>9 && countitem(7030)) {
- delitem 1026,1000;
- delitem 7065,100;
- delitem 945,10;
- delitem 7030,1;
- creation_lines;
- getitem 5084,1;
- close;
- } else {
- mes "[Human]";
- mes "Ah, so you want the Lazy Smokie.";
- mes "Well,";
- mes "I can make that for you,";
- mes "but you will have to";
- mes "gather the required materials by yourself.";
- mes "I heard that it is not easy to find the materials.";
- next;
- mes "[Human]";
- mes "The materials are..";
- mes "^FF0000Acorn x1000^000000 and";
- mes "^FF0000Sea-Otter Fur x100^000000, as well as ^FF0000Raccoon Leaf x10^000000";
- mes "That's all you need.";
- mes "If you bring it to me, I will make the headgear for you.";
- close;
- }
- case 4: //Blue Fish [5065]
- if (countitem(624) && countitem(959)>299 && countitem(544)>49 && countitem(1023) && countitem(938)>99 && countitem(7030)) {
- delitem 624,1;
- delitem 959,300;
- delitem 544,50;
- delitem 1023,1;
- delitem 938,100;
- delitem 7030,1;
- creation_lines;
- getitem 5065,1;
- } else {
- mes "[Human]";
- mes "Ah, so you want the Fish.";
- mes "Well,";
- mes "I can make that for you,";
- mes "but you will have to gather the required materials by yourself.";
- mes "I heard that it is not easy to find the materials.";
- next;
- mes "[Human]";
- mes "The materials are..";
- mes "^FF0000Rotten Fish x1";
- mes "Stinky Scale x300, Raw Fish x50,";
- mes "Fish Tail x1^000000 and lastly, it requires at least ^FF0000Sticky Mucus x100^000000";
- mes "That's all you need.";
- mes "If you bring it to me, I will make the headgear for you.";
- close;
- }
- case 5: //cancel
- mes "[Human]";
- mes "Oh.. is that so?";
- mes "Haha...";
- mes "I thought I have the chance to do it again.";
- mes "Oh well,";
- mes "enjoy your journey then.";
- close;
- }
- } else {
- mes "[Human]";
- mes "Hello there.";
- mes "a good day isn't it?";
- mes "Hmm... If you don't mind,";
- mes "can I tell you a little about myself?";
- mes "I know you're kind of unwilling to do so,";
- mes "but please, do listen for a while, will you?";
- next;
- mes "[Human]";
- mes "Hmm...";
- mes "The city of desert, Morocc";
- mes "has this special attraction.";
- mes "The wind of flame blows during the heat of the day,";
- mes "but the sunsets dye the hills of sand into a violet screne.";
- mes "Besides that, the freezing chill of night never stops until morning.";
- next;
- mes "[Human]";
- mes "All these are the pride of Morocc.";
- mes "However,";
- mes "These are not enough to feed the greed of human.";
- mes "Thay want to take everything";
- mes "except the desert";
- mes "as their belongings.";
- next;
- mes "[Human]";
- mes "So, I started to travel,";
- mes "going around this world to experience the adventure.";
- mes "Some view that can only be found in certain places,";
- mes "at their origin habitat.";
- next;
- mes "[Human]";
- mes "Therefore,";
- mes "I have decided to create items,";
- mes "that possesses the special characteristecs of the places.";
- mes "I have gained a few successes,";
- mes "but the materials required are too hard to be found.";
- mes "Therefore, I can't produce too many items.";
- next;
- mes "[Human]";
- mes "Oh! Uh Oh...";
- mes "I have spoken too much.";
- mes "Sorry for taking your time.";
- mes "There's nothing to do recently...";
- mes "I just hope to see";
- mes "some item that is related to the desert....";
- next;
- mes "[Human]";
- mes "Hmmph...Anyway,";
- mes "thank you for listening to me.";
- mes "Enjoy your journey...";
- mes "Think of the desert, you think of wolves... hahaha.";
- close;
- }
-}
-//Payon /=Fox Mask=/ //==Lets hope this works as it's supposed==//
-pay_dun03.gat,48,84,4 script Nine Tail#1 1180,1,1{
- mes "[Nine Tail]";
- mes "Kee! KeeKee!";
- mes "KeeKeeKee! KeeKee! KeeKee!";
- next;
- switch(select("Shaking your head:Nodding")) {
- case 1:
- mes "[Nine Tail]";
- mes "KeeKee! Ke! Kee!";
- close2;
- donpcevent "Nine Tail#1::OnReset";
- end;
- case 2:
- emotion e_hmm;
- close2;
- disablenpc "Nine Tail#1";
- enablenpc "Nine Tail#2";
- end;
- }
-
-OnInit:
- disablenpc "Nine Tail#1";
- disablenpc "Nine Tail#2";
- monster "pay_dun03.gat",48,84,"Nine Tail",1180,1,"NT::OnMobDead";
- end;
-
-OnReset:
- killmonster "pay_dun03.gat","NT::OnMobDead";
- disablenpc "Nine Tail#1";
- disablenpc "Nine Tail#2";
- initnpctimer;
- end;
-
-OnTimer300000:
-OnSpawn:
- stopnpctimer;
- killmonster "pay_dun03.gat","Nine Tail#1::OnMobDead";
- monster "pay_dun03.gat",48,84,"Nine Tail",1180,1,"NT::OnMobDead";
- end;
-}
-pay_dun03.gat,48,84,1 script NT -1,{
-OnMobDead:
- enablenpc "Nine Tail#1";
- end;
-}
-pay_dun03.gat,48,84,4 script Nine Tail#2 1180,{
- if(countitem(1022)>998) {
- mes "[Nine Tail]";
- mes "Uh Oh!! You've brought it, human.";
- mes "Good...I think you can save yourself with these.";
- next;
- switch(select("Give it to him:Do not give it to him")) {
- case 1:
- mes "[Nine Tail]";
- mes "Go now. You have got what you wanted, human. Now leave!";
- if(countitem(1022)>998) {
- delitem 1022,999;
- getitem 5069,1;
- }
- close2;
- disablenpc "Nine Tail#2";
- donpcevent "Nine Tail#1::OnReset";
- end;
- case 2:
- close2;
- disablenpc "Nine Tail#2";
- donpcevent "Nine Tail#1::OnReset";
- end;
- }
- }
- else {
- mes "[Nine Tail]";
- mes "......Aiyo? Isn't this the appearance of a human boy?";
- mes "Has my transfiguration skill gone wrong again... oh... oh well.";
- next;
- mes "[Nine Tail]";
- mes "Do you know how it feels to be chased everyday? How tough that is? Huh?";
- mes "I just want to live a quiet life with my husband!";
- next;
- mes "[Nine Tail]";
- mes "But one day, someone intruded into our habitat and tried to catch us.";
- next;
- mes "[Nine Tail]";
- mes "Do you know how much that Sohee that lives besides me likes to complain to me everyday? Someone will pull a disgusting face and say 'Haha, Miss Sohee~' and they will chase to rip off her clothes. They are making her crazy!";
- next;
- mes "[Nine Tail]";
- mes "It is just a flawless body as fine as pine, and as beautiful as the flower. Why can't anyone understand that?";
- next;
- mes "[Nine Tail]";
- mes "Hmmm...let me calm down first.";
- mes "I just want to save my husband and bring him back.";
- mes "I hope you can help me.";
- next;
- mes "[Nine Tail]";
- mes "To save my husband,";
- mes "please bring along ^FF0000999 ^0000FFNine Tails^000000!";
- mes "What? You said that's too much?";
- next;
- mes "[Nine Tail]";
- mes "Hmmph, it really makes me angry to think of what you've done to us...";
- mes "I understand. You human won't do anything without a reward...";
- next;
- mes "[Nine Tail]";
- mes "Hmm, ok. What do you think of the mask I'm wearing? The ^0000FFKitsune Mask^000000. Gather the item I want, and I will give you this.";
- mes "You must gather ^FF0000999 ^0000FFNine Tails^000000!";
- close2;
- disablenpc "Nine Tail#2";
- donpcevent "Nine Tail#1::OnReset";
- end;
- }
-}
-//Orc Village /=Orc Hero Helm=/
-in_orcs01.gat,31,93,1 script Orc Warrior#1 1023,2,2{
- if (orcs_hero_hat == 1) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "Good, you have collected it all, haven't you?";
- mes "So you really want to have a talk, hahahahaha!!";
- mes "Ok, I will talk to you then";
- next;
- mes "[Orc Warrior]";
- mes "I don't like humans.";
- mes "All of the Orcish Tribe dislike humans.";
- mes "Do you know that?";
- mes "I really hate it when you come to find us.";
- set orcs_hero_hat,2;
- next;
- mes "[Orc Warrior]";
- mes "So if you want to hear more. Prepare another ^FF0000Jellopy x1000^000000";
- mes "This means, get out of my sight...!";
- mes "Humans...";
- close;
- }
- } else if (orcs_hero_hat == 2) {
- if (countitem(909) > 999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "Good, you have collected it all, haven't you?";
- mes "So you really want to have a talk, hahahahahaha!!";
- mes "Ok, I will talk to you then";
- next;
- mes "[Orc Warrior]";
- mes "Do you want to know why we hate humans?";
- mes "That's because,";
- mes "out village is living a quiet life,";
- mes "before the rude intrusion of you human.";
- next;
- mes "[Orc Warrior]";
- mes "Can you just build your city";
- mes "and live there quietly?";
- mes "Why do you create chaos everywhere...";
- mes "I can't understand";
- set orcs_hero_hat,3;
- next;
- mes "[Orc Warrior]";
- mes "Go, if you want another conversation, prepare ^FF0000Jellopy x1000^000000 again,";
- mes "If you're statisfied with such kind of converstaion.";
- mes "Hahahahaha";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000...";
- mes "If you want to talk to me,";
- mes "show your will, humans.";
- mes "I don't care, just brought 1000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 3) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "Good, you have collect it all, haven't you? ";
- mes "So you really want to have a talk, hahahahaha!!";
- mes "Ok, I will talk to you until you're fed up then.";
- next;
- mes "[Orc Warrior]";
- mes "If you compare the achievement, ";
- mes "we won't lose to you humans.";
- mes "The same goes to the Goblin in the jungle,";
- mes "and the Kobold, who are the master of the grassland...";
- next;
- mes "[Orc Warrior]";
- mes "Before you human build cities, ";
- mes "we orc warriors has developed sophisticated tunnel in caves,";
- mes "as well as water way.";
- mes "We use the things we found in the wild,";
- mes "to create the things we wanted.";
- next;
- mes "[Orc Warrior]";
- mes "Then we build high tower.";
- mes "However, the evil forces ";
- mes "have made the master of the tower betray our tribe...";
- mes " And those who fail to escape there,";
- mes "they're still suffering,";
- mes "at that place.";
- next;
- mes "[Orc Warrior]";
- mes "...Hmm, this,";
- mes "Why do I tell this to you humans?";
- mes "The conversation ends here today.";
- set orcs_hero_hat,4;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000...";
- mes "If you want to talk to me";
- mes "Show your will, human.";
- mes "I don't care, just brought 2000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 4) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "Good, you have collect it all, haven't you? ";
- mes "So you really want to have a talk, hahahahaha!!";
- mes "Ok, I will talk to you until you're fed up then.";
- next;
- mes "[Orc Warrior]";
- mes "Yes, until that time,";
- mes "human and the orc warriors";
- mes "do lead a peaceful life.";
- mes "But as time goes by, the misunderstanding,";
- mes "has accumulated and cannot be broken.";
- next;
- mes "[Orc Warrior]";
- mes "The powerless human only wants fame and wealth.";
- mes "A true warrior,";
- mes "will only emphasize on glory and honor...";
- mes "Those who do not care what method they use to achieve their goal,";
- mes "will be lead to the path of perdition easily.";
- next;
- mes "[Orc Warrior]";
- mes "They only care about their safety,";
- mes "and ignore about others.";
- mes "They will not let anthing that";
- mes "pose a threat to them to live... ";
- mes "No matter it's other tribe,";
- mes "or unknown creature, they will kill";
- mes "even their closest companion if they had to.";
- next;
- mes "[Orc Warrior]";
- mes "...I have talked too much, and there's nothing more to talk about.";
- mes "The conversation ends here.";
- set orcs_hero_hat,5;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 3000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 5) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "You reall have the patience to collect these things.";
- mes "You really want to talk to me, don't you?... ";
- mes "If that's so, I will talk about other things.";
- next;
- mes "[Orc Warrior]";
- mes "The Orc Warriors think that the best things are";
- mes "battle and victory.";
- mes "It is the greatest honor,";
- mes "to fight and beat the enemies face to face.";
- next;
- mes "[Orc Warrior]";
- mes "The spirit to win will not stop even for death.";
- mes "However, some tribesmate that die of trickery,";
- mes "will get up from the grave,";
- mes "wandering to look for a target to fight.";
- next;
- mes "[Orc Warrior]";
- mes "During the battle,";
- mes "we are different from you.";
- mes "We don't use tricks, and we don't run away!";
- mes "We will fight till then end, till we are out of energy.";
- mes "Even when we're lost in the end, we will still make our last attempt to counter.";
- next;
- mes "[Orc Warrior]";
- mes "Besides that, we don't rely of potions.";
- mes "You human are too weak.";
- mes "That's why you use potions and herbs.";
- mes "Without potion, you will quit immediately, don't you?";
- mes "Hmm, I'm not sure whether you are like that too.";
- set orcs_hero_hat,6;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 4000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 6) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "You reall have the patience to collect these things.";
- mes "You really want to talk to me, don't you?... ";
- mes "If that's so, I will talk about other things.";
- next;
- mes "[Orc Warrior]";
- mes "The warriors of the tribe,";
- mes "are selected among the strongest.";
- mes "When they grow up, we'll send them into the jungle,";
- mes "to test their qualification to be a real warrior.";
- next;
- mes "[Orc Warrior]";
- mes "We will recognize";
- mes "the tribesman who come back alive as a warrior.";
- mes "These strong warriors are known as Orc Warriors.";
- mes "For the females that has fighting ability,";
- mes "they are known as Orc Lady.";
- next;
- mes "[Orc Warrior]";
- mes "And for those with a dexterous hand and";
- mes "possess good eyesight,";
- mes "we'll give them bow and arrow,";
- mes "and called them Orc Archer.";
- mes "They will learn and grow in the countless battles.";
- next;
- mes "[Orc Warrior]";
- mes "And there is another trial of fire.";
- mes "Those who pass the trial,";
- mes "will be protected by fire";
- mes "and gain greater ability and endurance.";
- mes "We called this warriors as High Orc.";
- next;
- mes "[Orc Warrior]";
- mes "Hmm, when human looks at us,";
- mes "you'll think that we look alike... ";
- mes "But for use Orc, we can distinguish it easily.";
- mes "So, when you look at me, ";
- mes "you will feel that I look like";
- mes "no different that the orc warrior outside, isn't it?";
- set orcs_hero_hat,7;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 5000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 7) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "I can feel you are getting tired and want to quit now.";
- mes "But you have keep the promise this time.";
- mes "So a promise is a promise, I shall continue to talk to you.";
- next;
- mes "[Orc Warrior]";
- mes "We are talking about the Orc Warrior last time...";
- mes "Yes, in the orcish fighters,";
- mes "there are dexterous one with abilities,";
- mes "that has not pass the trial of fire.";
- mes "They are the warriors that can take care of";
- mes "other orc warriors....";
- next;
- mes "[Orc Warrior]";
- mes "Such kind of warriors are the true hero.";
- mes "We call them Orc Heroes.";
- mes "They had strength and stamin greater than other orcs.";
- mes "They possess ability to lead too.";
- mes "This is the true hero of Orc Warriors.";
- next;
- mes "[Orc Warrior]";
- mes "They get the Voucher of Orcish Hero,";
- mes "and is able to wield the sword only a hero can use.";
- mes "When the Orc Hero wields the sword,";
- mes "the earth shakes...";
- next;
- mes "[Orc Warrior]";
- mes "Orc Hero has his own special headgear too.";
- mes "It is a symbol of";
- mes "the fame and strength of an Orc Hero... Just like you humans.";
- mes "If you want to see it, you can only feel its power in the battle.";
- set orcs_hero_hat,8;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 6000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 8) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "I can feel you are getting tired and want to quit now.";
- mes "But you have keep the promise this time.";
- mes "So a promise is a promise, I shall continue to talk to you.";
- next;
- mes "[Orc Warrior]";
- mes "We talk about the Orc Hero just now.";
- mes "Some orc does not born with an ability,";
- mes "like the Orc Heroes do.";
- mes "It took them a long time to go through numerous battle to be a warrior.";
- next;
- mes "[Orc Warrior]";
- mes "To a Orc Warrior,";
- mes "age does not means coward.";
- mes "In fact is represents experience and skills,";
- mes "that makes him more valiant.";
- next;
- mes "[Orc Warrior]";
- mes "They can perform great battle skill,";
- mes "even without weapons.";
- mes "They can fight for days even without their axe.";
- mes "If they reach that state,";
- mes "weapon are just useless burdens...";
- next;
- mes "[Orc Warrior]";
- mes "Among such experience elders,";
- mes "we called the most experienced one as ";
- mes "Orc Lord. And we honor them,";
- mes "They wear a 3 horn iron helm";
- mes "that represents the leadership of Orcish tribe.";
- set orcs_hero_hat,9;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 7000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 9) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "I've never seen,";
- mes "a human that won't quit like you... So I'll keep my promise";
- mes "to tell you about our tribe today.";
- next;
- mes "[Orc Warrior]";
- mes "Sometimes, there will be those treacherous ones";
- mes "who run away from the battle.";
- mes "We have such kind in out tribe too.";
- mes "Although it is a disgrace, they are Orcs too.";
- mes "They only differ in their level of existance.";
- next;
- mes "[Orc Warrior]";
- mes "Such kind will be cursed.";
- mes "Their body shrinks and the teeth grows.";
- mes "And finally, they lose the heart to fight.";
- mes "Since they don't want to be found by others, ";
- mes "they hide themselves.";
- next;
- mes "[Orc Warrior]";
- mes "They are originally us.";
- mes "But their alteration rise suspicions.";
- mes "Such kind with greed,";
- mes "and hatred to us are called...";
- mes "Zenorc.";
- next;
- mes "[Orc Warrior]";
- mes "Unlike us,";
- mes "human do not change even their hearts have changed.";
- mes "Therefore, we need to be more careful.";
- mes "Because we can tell from the appearances,";
- mes "how treacherous humans are....";
- set orcs_hero_hat,10;
- next;
- mes "[Orc Warrior]";
- mes "So, if you want to hear more,";
- mes "prepare ^FF0000Jellopy x 1000 again^000000";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 8000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 10) {
- if (countitem(909)>999) {
- delitem 909,1000;
- mes "[Orc Warrior]";
- mes "Really? Have you really gathered 10,000 Jellopy?";
- mes "Good, that's enough now.";
- mes "You've shown your sincerity.";
- mes "I will treat you honestly.";
- next;
- mes "[Orc Warrior]";
- mes "It is enough for";
- mes "the stories about our tribe.";
- mes "However, there are difference,";
- mes "from what you've heard and what you'll experience.";
- next;
- mes "[Orc Warrior]";
- mes "I advise that you gather more experience";
- mes "through the battle with us to understand our tribe.";
- mes "The most direct way,";
- mes "is through combat.";
- set orcs_hero_hat,11;
- next;
- mes "[Orc Warrior]";
- mes "I shall stop here.";
- mes "As the token of appreciation to your sincerity,";
- mes "this is the axe that has accompanied me in my pass battles.";
- mes "Take good care of it, thank you.";
- getitem 1304,1;
- next;
- mes "[Orc Warrior]";
- mes "It must be hard for you after all these time.";
- mes "If you want to understand more about Orcs,";
- mes "come and find me again.";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
- mes "If you want to talk to me,";
- mes "show you will, humans.";
- mes "I don't care, just brought 9000 Jellopy.";
- close;
- }
- } else if (orcs_hero_hat == 11 || orcs_hero_hat == 12) {
- if (countitem(1304)) {
- mes "[Orc Warrior]";
- mes "If must be hard for you after all these time.";
- mes "If you want to understand more about Orcs,";
- mes "come and find me again.";
- close;
- } else {
- set orc_hero_quest,rand(1,10);
- if (orc_hero_quest > 9) {
- if (orcs_hero_hat == 12 && countitem(931)>99) {
- mes "[Orc Warrior]";
- mes "Uhoh, that is really great.";
- mes "After all these battles, I am not sure how much you understand.";
- mes "However, the voucher of Orc warrior";
- mes "is given to a true Orc Warrior.";
- next;
- mes "[Orc Warrior]";
- mes "We use 1000 thousand victories";
- mes "as a qualification to recognize one asa true Orc Warrior.";
- mes "However, you are a human...";
- mes "It is hard to cross the line between two different kinds.";
- next;
- mes "[Orc Warrior]";
- mes "Ok, come again after you've won 10 thousand victories.";
- mes "By that time, we will recognized you as the true warrior.";
- mes "However,";
- mes "you will have to walk a lonely path for such fame.";
- mes "The choise is up to you...";
- next;
- mes "[Orc Warrior]";
- mes "All you get is just fame...";
- mes "But for a human,";
- mes "you get a chance to proof and test your capability...";
- mes "So what do you want to choose?";
- next;
- switch(select("I think I don't need it.:I want to take the 10,000 challenge.")) {
- case 1:
- mes "[Orc Warrior]";
- mes "Alright, I won't force you to choose.";
- mes "Now, please return";
- mes "to your human city slowly.";
- mes "Your friends are waiting for you.";
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "You have chosen a hard path";
- mes "A path of eternal battles is waiting ahead of you.";
- mes "You will have to face";
- mes "thousands,if not ten thousands of warriors.";
- next;
- mes "[Orc Warrior]";
- mes "Then, before you reach your 10,000th victories,";
- mes "Bring me the voucher of orc warrior.";
- mes "Once, ten times, or even hundreds";
- mes "please leave your record of victories.";
- if (countitem(931)>99) {
- delitem 931,100;
- set orcs_hero_hat,13;
- set orcs_hero_hat2,100;
- }
- next;
- mes "[Orc Warrior]";
- mes "If I take the voucher of Orc Warrior,";
- mes "I will record it a 100 victories.";
- mes "Please make sure you defeat 10,000 orc warrior...";
- mes "Please continue your battle, don't stop.";
- close;
- }
- }
- mes "[Orc Warrior]";
- mes "The best way to understand Orcs,";
- mes "is through battle.";
- mes "Thrugh collisions of strength and skills,";
- mes "improve your understanding between each other.";
- next;
- mes "[Orc Warrior]";
- mes "So, go out there and fight.";
- mes "conversation with my is just an acceptance of concepts.";
- mes "One day,";
- mes "You shall be recognized as a true warrior.";
- set orcs_hero_hat,12;
- close;
- } else {
- mes "[Orc Warrior]";
- mes "I feel that you are not statisfied?";
- mes "Do you have any doubts about us?";
- mes "You are a human.";
- mes "Your concern to other tribers,";
- mes "will not benefit you.";
- close;
- }
- }
- } else if (orcs_hero_hat == 13) {
- if (countitem(931)) {
- mes "[Orc Warrior]";
- mes "Stay alive before you grab the victory...";
- mes "Rest here for a while before you leave.";
- mes "Until now, you have achieved "+orcs_hero_hat2+" times of victories.";
- next;
- mes "[Orc Warrior]";
- mes "Do you want to add the record of your current victory";
- mes "into this record? You have won "+countitem(931)+" times this time.";
- next;
- switch(select("Add the record:Add it later")) {
- case 1:
- set orcs_hero_hat2,orcs_hero_hat2+countitem(931);
- delitem 931,countitem(931);
- if (orcs_hero_hat2>9999) {
- mes "[Orc Warrior]";
- mes "And this, achieving more than 10,000 victories";
- mes "is an extraordinary achievement to human...";
- mes "You have completed an unusual task.";
- mes "Through the current battle,";
- mes "You must have learned a lot about the Orcish Tribe.";
- next;
- mes "[Orc Warrior]";
- mes "Although you're a human, you have walked the path of a true warrior....";
- mes "We have recognized you.";
- mes "You are a true warrior!!";
- mes "You are... Orc Lady!!";
- getitem 2299,1;
- set orcs_hero_hat,14;
- next;
- mes "[Orc Warrior]";
- mes "This is your present.";
- mes "I wonder if it fits your head.";
- mes "Wear it well.";
- mes "If you do not want to wear it, take it along with you.";
- getitem 931,1;
- next;
- mes "[Orc Warrior]";
- mes "And, you have been recognized as a warrior...";
- mes "This voucher is for you.";
- mes "Although it has no difference compared to others,";
- mes "keep it well.";
- mes "You will only be recognized as a Orc Warrior,";
- mes "with this voucher.";
- next;
- mes "[Orc Warrior]";
- mes "So, you may go back now...";
- mes "If you ever think of us,";
- mes "come and look for us.";
- mes "A true self of a person can only be shown through endless battles.";
- mes "Return to the land now.";
- close;
- }
- mes "[Orc Warrior]";
- mes "You have worked hard.";
- mes "I hope your futue better will shine with the light of victories.";
- mes "If you ever lost,";
- mes "I hope to see you stand up again.";
- next;
- mes "[Orc Warrior]";
- mes "There are "+(10000-orcs_hero_hat2)+" of battles left.";
- mes "Although it is a though road ahead,";
- mes "I hope that you will pull yourself together and achieve the final victory.";
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "Hmm, as you like it.";
- mes "I will be dissapointed again,";
- mes "If you give up in the middle.";
- close;
- }
- } else {
- mes "[Orc Warrior]";
- mes "Rest here for a while before you leave.";
- mes "Until now, you have achieved "+orcs_hero_hat2+" times of victories.";
- close;
- }
- } else if(orcs_hero_hat == 14) {
- if (countitem(1304)) {
- mes "[Orc Warrior]";
- mes "Hmm? Don't tell me that you assume that";
- mes "you won't be able to get back to the human villages";
- mes "if you are recognized as a Orc Warrior. Hahahaha!";
- mes "You better leave then.";
- close;
- } else {
- set @orc_hero_quest,rand(1,10);
- if (@orc_hero_quest > 9) {
- mes "[Orc Warrior]";
- mes "That? Is that thirst...?";
- mes "Although you're recognized as a warrior,";
- mes "that eyes of yours show you seek more powerful enemies...";
- mes "Maybe you are not statisfied with the current situation.";
- next;
- mes "[Orc Warrior]";
- mes "Alright, do you want to take another trial?";
- mes "Maybe all you accumulated belongings";
- mes "shall become but a dream...";
- mes "This path,";
- mes "is a process feared,";
- mes "by even the most skullful warrior.";
- next;
- mes "[Orc Warrior]";
- mes "a recognized Orc Warrior, maybe you can defeat them...";
- mes "What is your choise?";
- next;
- switch(select("I am statisfied with the current condition:...I will challenge the trial")){
- case 1:
- mes "[Orc Warrior]";
- mes "Yes, it is useful";
- mes "if you are statisfied with yourself sometimes.";
- mes "It takes greater courage,";
- mes "to admit that you can't overcome a greater obstacle.";
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "Good, I praise your honorable spirit.";
- mes "This is an opportunity";
- mes "for a warrior who've won 10,000 victories.";
- mes "You will face";
- mes "the greatest warrior of the Orcish tribe...!";
- next;
- mes "[Orc Warrior]";
- mes "Fight the best warrior of the Orc Warrior.";
- mes "Obtain 100 victories from the Orc Heroes,";
- mes "and bring me the voucher.";
- mes "Although you're a great warrior, this is a ardous task";
- mes "espectially when you have to face it alone....!";
- next;
- mes "[Orc Warrior]";
- mes "Come, go now! Since you can beat 10,000 Orc warrior,";
- mes "there's some possibilities that";
- mes "you can take down 100 Orc Heroes!";
- mes "If that's so, we will recognize you as";
- mes "the Orc Hero...!";
- set orcs_hero_hat,15;
- close;
- }
- } else {
- mes "[Orc Warrior]";
- mes "Oh warrior, continue to shine in the victories of your battles.";
- mes "Stand up again even if you've lost.";
- mes "Show your unshaken spirit.";
- mes "You are the human that is reconized as an Orc Warrior!";
- close;
- }
- }
- } else if(orcs_hero_hat == 15) {
- if (countitem(968)>99) {
- mes "[Orc Warrior]";
- mes "Finally... You have achive the goal.";
- mes "Those who've lost to you have admitted that";
- mes "you have shown yourself as a Hero";
- mes "by crossing the barrier of kinds as a human...";
- mes "I, on behalf of our tribe,";
- mes "pay our greatest respect to you.";
- next;
- mes "[Orc Warrior]";
- mes "Now I ask you to make you final selection,";
- mes "what will you do with the vouchers you've taken?";
- mes "It means nothing to humands,";
- mes "but to the orcs,";
- mes "Heroic Emblem is a belonging";
- mes "of a true hero.";
- next;
- mes "[Orc Warrior]";
- mes "You've obtained this through you hardship.";
- mes "You can take it with you,";
- mes "or give them back to the Orc Heroes.";
- mes "The meaning of giving them back the voucher,";
- mes "is to battle them again...";
- next;
- mes "[Orc Warrion]";
- mes "So, heroic emblem,";
- mes "what will you do with it?";
- next;
- switch(select("I will take it back as token of victories:I'll give them back to Orc Heroes")) {
- case 1:
- mes "[Ork Warrior]";
- mes "Well, that is a good choise.";
- mes "Nobody can change your right to make that decision.";
- mes "Please take good care of";
- mes "these tokens of victory.";
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "This is the true spirit of a warrior...!";
- mes "Respecting your oppenent even after you've won,";
- mes "such deeds";
- mes "should be learned by we Orcs...!";
- if (countitem(968)<100) close;
- delitem 968,100;
- set orcs_hero_hat,16;
- next;
- mes "[Orc Warrior]";
- mes "The one who have defeated 100 Orc Hero...";
- mes "Altough you're a human";
- mes "we know you as the best warrior of the Orcs.";
- mes "You are now... Orc hero!";
- getitem 1124,1;
- next;
- mes "[Orc Warrior]";
- mes "This is the sword given only to the Heroes.";
- mes "Iam not sure wether you can use it.";
- mes "But as a Orc Hero,";
- mes "you should have it.";
- getitem 968,1;
- next;
- mes "[Orc Warrior]";
- mes "And since you're a Orc Hero now...";
- mes "This is the Heroic Emblem for you.";
- mes "Although it has no difference compared to others,";
- mes "keep it well.";
- mes "You will only be recognized as a Orc Hero,";
- mes "with this voucher.";
- next;
- mes "[Orc Warrior]";
- mes "So, you can leave now...";
- mes "A person from human tribe that can understand us,";
- mes "is the one who crosses the boundaries of tribe.";
- mes "Show the tough spirit of you,";
- mes "and set for you new destiny....";
- close;
- }
- } else {
- mes "[Orc Warrior]";
- mes "Tired...? Orc Hero is";
- mes "the best warrior among our warriors.";
- mes "They are known for their capability.";
- mes "It might be to hard for";
- mes "a human to pick on them.";
- next;
- mes "[Orc Warrior]";
- mes "However, this trial is the patch you've chosen.";
- mes "Maybe you want to know you true limit,";
- mes "so you keep your promise to walk this path...!";
- mes "Don't rush for the answer,";
- mes "it might lies beneath the records of your countless battles.";
- close;
- }
- } else if (orcs_hero_hat > 15) {
- if (countitem(968)) {
- mes "[Orc Warrior]";
- mes "Warrior of the Orc Warrior, the greatest Hero";
- mes "You are... Orc Hero!!";
- mes "May the valiant warrior be blessed with light!!";
- close;
- } else {
- mes "[Orc Warrior]";
- mes "Oh Hero, where have you put your voucher...?";
- mes "Without the Heroic Emblem,";
- mes "you shall not be knows as a Orc Hero.";
- mes "Please retrieve it and keep it with you.";
- close;
- }
- } else if (orcs_hero_hat == 0 || orcs_hero_hat ==1) {
- mes "[Orc Warrior]";
- if (sex == 1) {
- mes "What does the son of a human have to do here?";
- } else {
- mes "What does the daughter of a human have to do here?";
- }
- mes "Shouldn't you have nothing to do with us, the Orc Warriors?";
- mes "Or are you tired of the endless war";
- mes "and hope for a truce? That should be good!";
- next;
- mes "[Orc Warrior]";
- mes "We, the Orc Warriors don't simple speak to men.";
- mes "I praise your courage";
- mes "to dare to come and try to talk to me.";
- mes "But we have no intention of hearing what you want to say.";
- next;
- mes "[Orc Warrior]";
- mes "Sit there quietly and leave without making any noises.";
- mes "If you want to rest before you depart,";
- mes "watch your manners, at least to the host, me.";
- if (rand(1,10)>9) {
- next;
- switch(select(".....","I want a conversation with you.")) {
- case 1:
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "Converstation...? Conversation you say?Hahahaha!! ";
- mes "You are really an interesting human.";
- mes "Talk to a Orc Warrior? ";
- mes "This is the first time I see human talk without sword and shield...!";
- next;
- mes "[Orc Warrior]";
- mes "However, I won't be kind to anyone.";
- mes "If you want to talk to me,";
- mes "you'll need to show some respect! Do you understand that?";
- mes "Ok... this is my little suggestion.";
- next;
- mes "[Orc Warrior]";
- mes "Show me the will of a human,";
- mes "who wants to talk to me.";
- mes "To talk to me, gather^FF0000Jellopy x 1000 ^000000 ";
- mes "Bring it to me when you come to talk next time";
- next;
- mes "[Orc Warrior]";
- mes "And, don't question me.";
- mes "I won't give you the rights to question my opinion.";
- mes "And dont you dream that,";
- mes "I will give you anything.";
- mes "Do you still want to talk under these circumstances?";
- mes "Decendent of human?";
- next;
- switch(select("Let's battle, Orc Warrior!!:I will show you my faith")) {
- case 1:
- mes "[Orc Warrior]";
- mes "Yeahyeahyee, what a noisy fella!!";
- mes "If you like to fight, go outside!";
- mes "I really hate to see humans!!";
- close;
- case 2:
- mes "[Orc Warrior]";
- mes "Ok, keep your promise!";
- mes "I want to see how you keep that.";
- mes "You will quit eventually.";
- mes "Hahahahaha!!";
- set orcs_hero_hat,1;
- close;
- }
- }
- } else {
- close;
- }
- }
-}
-in_orcs01.gat,162,33,1 script Hero of Orc#1 1087,2,2{
- if (orcs_hero_hat < 16) {
- mes "[Orc Hero]";
- mes ".....Go away, don't interrupt me!";
- mes "If you want to fight me,";
- mes "wait for me at the west forest.";
- mes "I am not in the mood to fight human now.";
- close;
- } else if (orcs_hero_hat == 17) {
- mes "[Orc Hero]";
- mes "Hahaha, interesting, really interesting.";
- mes "You are the most interesting human";
- mes "that I have seen...";
- mes "I like it, interesting...";
- close;
- } else if (orcs_hero_hat == 16) {
- if (countitem(968) && countitem(2299) && countitem(1124) && countitem(931)) {
- if(rand(1,20)>19) {
- mes "[Orc Hero]";
- mes "Hmm, a human that is knows as Hero?";
- mes "DO you know the meaning of returning a Heroic Emblem?...";
- mes "When I am free later,";
- mes "I'll fight with you.";
- next;
- mes "[Orc Hero]";
- mes ".....HmmHmmm...? This iron helm...?";
- mes "It belongs to Orc Warrior...?";
- next;
- mes "[Orc Hero]";
- mes "Wait... You're still using this?";
- mes "Uhoh....";
- mes "Such an interesting human! Hahaha";
- mes "Good, really good...";
- next;
- mes "[Orc Hero]";
- mes "You seem not to be aware of the story behind this viking helm.";
- mes "In the battle between Orc Lord and the humands,";
- mes "he lost it in his defeat...";
- mes "The horn in the center was broken";
- mes "and this helm is created...!";
- next;
- mes "[Orc Hero]";
- mes "Rumors said that if it is given to a human,";
- mes "the human will be recognized as a Hero...";
- mes "Hahaha, interesting.";
- mes "And there're still people who";
- mes "continue to use it...!!";
- next;
- mes "[Orc Hero]";
- mes "So that's the belonging of the Orc Lord!";
- mes "And you are not qualified to have it.";
- mes "So if you don't mind,";
- mes "can you return it to its origional owner?";
- mes "Oh 'Human' Orc Warrior?";
- next;
- switch(select("I refuse to do so:I agree")) {
- case 1:
- mes "[Orc Hero]";
- mes "Hmm, how stubborn.";
- mes "If you think it's important, wear it well.";
- mes "The history of the battle is still kept";
- mes "on this headgear of a warrior.";
- close;
- case 2:
- mes "[Orc Hero]";
- mes "Good, that's more like it.";
- mes "This Viking Helm,";
- mes "I'll give it to him, hahahaha...";
- mes "I never imagined to see this thing here.";
- next;
- mes "[Orc Hero]";
- mes "I'll give you a useful item though!";
- mes "Although you're human,";
- mes "you're recognizedas a Orc Hero before.";
- mes "You should at least have a suitable headgear...";
- next;
- mes "[Orc Hero]";
- mes "Here you can have this.";
- mes "I have nade a special sign on it...";
- mes "So continue to use this in the future,";
- mes "understand? 'Human' Orc Warrior?";
- if (countitem(2299)) {
- delitem 2299,1;
- getitem 5094,1;
- set orcs_hero_hat,17;
- }
- close;
- }
- } else {
- mes "[Orc Hero]";
- mes "Hmm, a human that is recognized a warrior?";
- mes "Do you know the meaning of returning a Heroic Emblem?...";
- mes "When I am free later,";
- mes "I'll fight with you.";
- close;
- }
- } else {
- mes "[Orc Hero]";
- mes "Hmm, a human that is recognized a warrior?";
- mes "You don't look like one though.";
- mes "Is he really going to return the Heroic Emblem?";
- mes "I can't believe it.";
- next;
- mes "[Orc Hero]";
- mes "I won't recognize you as a Hero.";
- mes "He forgets even the most basic things.";
- mes "How can he be called warrior... Humans!!";
- mes "Go to the west forest now.";
- mes "I want you to pass the trial again...!";
- close;
- }
- }
-}
+//===== eAthena Script =======================================
+//= 2004 Headgear Quests
+//===== By: ==================================================
+//= Dj-Yhn
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= 2004 New Headgears. Official Quests
+//===== Additional Comments: =================================
+//= names with asterisk(*) are iRO names...
+//= names done: 1,3,6,8,9,12,14,15,16,17
+//= needed: 2,4,5,7,10,11,13 (7/17)
+//= ==Information For NPC's inside File==
+//= 1) Black Cat Ears [NekoNeko*] {Payon}
+//= o payon.gat 115 131
+//= 2) Crossed Hair Band, Plaster and Flower Hairpin [Arjen] {Geffen}
+//= o geffen.gat 129 148
+//= 3) Hot-blooded-headband [Zhenbolt*] {Yuno}
+//= o yuno.gat 300 188
+//= 4) Red Tailed Ribbon [Netpia] {Prontera}
+//= o prontera.gat 165 232
+//= 5) Indian Headband [Merunte] {Comodo}
+//= o comodo.gat 237 217
+//= 6) Mushroom headband [Ipore*] {Geffen}
+//= o geffen.gat 67 87
+//= 7) Ears of angel wing &
+//= Ears of devil wing [Old Blacksmith] {Yuno}
+//= o yuno.gat 241 52
+//= 8) Sea Otter Cap [Pretty Lindsay*] {Lutie}
+//= o xmas.gat 183 267
+//= 9) Brown Bear Cap [Fuzzy Fuzz*] {Lutie}
+//= o xmas.gat 175 156
+//=10) Cap of Concentration [Nan Hyang] {Payon}
+//= o payon_in03.gat 8 193
+//=11) Tulip Haipin [Ses] {Geffen}
+//= o geffen.gat 83 189
+//=12) Party Hat, Straw Hat, Cowboy Hat, Sombrero
+//= and Fur hat [Headgear Merchant (Mike)*] {Lutie}
+//= o xmas_in.gat 35 30
+//=13) Big Golden Bell, Headgear of Queen
+//= and Crown of Mistress [Neris] {Yuno}
+//= o yuno_in03.gat 20 18
+//=14) Alarm Mask [Muscle Man*]{Aldebaran}
+//= o alde_alche.gat 88 180
+//=15) Drooping Kitty, Smokie Leaf, Lazy Smokie
+//= and Blue Fish [Traveler*] {Morroc}
+//= o morocc.gat 273 79
+//=16) Fox Mask [Nine Tail*] {Payon Dungeon}
+//= o pay_dun03 48 84
+//=17) Orc Hero Helm [Orc Warrior*] {Orc Village}
+//= o in_orcs01 31 93 & 162 33
+//============================================================
+//= 1.01 Fixed items names iRO->kRO, fixed some bugs [Qwadrat]
+//= Fixed possible item exploits, fixed Straw Hat
+//= Added missing checks [Lupus]
+//= 1.1 Fixed a bug in Giant-band-aid that didn't counting rotten bandages
+//= Fixed a bug in Fur Hat that didn't count yarn [Evera]
+//= 1.2 Syntax fixes for parenthesis, reformatting [KarLaeda]
+//============================================================
+
+//Payon /=Black cat ears=/
+payon.gat,115,131,3 script NekoNeko 725,{
+ if (countitem(2213) > 0 && countitem(983) > 0 && countitem(914) > 199 && Zeny > 9999) {
+ delitem 2213,1;
+ delitem 983,1;
+ delitem 914,200;
+ set Zeny,Zeny-10000;
+ mes "[NekoNeko]";
+ mes "Hihi? So you have collected all materials.";
+ mes "According to our agreement,";
+ mes "I will make it for you~ please";
+ mes "wait for a while!";
+ next;
+ mes "[NekoNeko]";
+ mes "Zomulazhumudazowuwudududu";
+ mes "DidiSusuohwuzaowududaduda";
+ next;
+ getitem 5057,1;
+ mes "[NekoNeko]";
+ mes "Thank youfor using!";
+ mes "If you need it again in future,";
+ mes "come and fine me anytime!";
+ close;
+ } else {
+ mes "[NekoNeko]";
+ mes "How are you? Yes, I know.";
+ mes "I know why you're trying to talk to me.";
+ mes "That's because the Ears of Black Cat";
+ mes "that I am wearing is too cute... right? Hahaha";
+ next;
+ mes "[NekoNeko]";
+ mes "Honestly, I made this hairband";
+ mes "with my skill of craftmanship.";
+ mes "Therefore, not much people know,";
+ mes "about this adorable head gear.";
+ mes "Isn't that a pity that I use it myself?";
+ next;
+ mes "[NekoNeko]";
+ mes "So, you better ask me to make that.";
+ mes "I will make it";
+ mes "with a pay of course.";
+ mes "Fill your pockets with coints....";
+ mes "That's my thinking, hehehehe";
+ next;
+ mes "[NekoNeko]";
+ mes "^FF0000Kitty Band^000000 x1";
+ mes "^FF0000Black Dyestuffs^000000 x1";
+ mes "^FF0000Fluff^000000 x200";
+ mes "and lastly, it requires at least ^FF000010000zeny^000000!";
+ mes "If you want it, gather them and bring it to me~";
+ next;
+ mes "[NekoNeko]";
+ mes "^FF0000Ah! Please keep this in mind.";
+ mes "If you slot a card in your equipment,";
+ mes "and you want to change it to the item now,";
+ mes "you will lose the card and refined level.";
+ close;
+ }
+}
+//Geffen /=Crossed Hair Ban, Plaster and Flower Hairpin=/
+geffen.gat,129,148,3 script Arjen 779,{
+ mes "[Arjen]";
+ mes "Ahhh~So boring~ So very boring~";
+ mes "There's noone I need to see, and the weather is so good - ! !";
+ mes "It's so boring that I have nothing to do.";
+ emotion e_gasp; //not sure if this is ET_SCRATCH
+ next;
+ mes "[Arjen]";
+ mes "Oh yes, hey there, you!!";
+ mes "Do you want to have a cute and fine hair clip?";
+ mes "For a person as skillful as I am, there's nothing I can't make!! Wa haha!";
+ mes "Clap ! It will be ready just like that!";
+ emotion e_omg; //ET_SURPRISE?
+ next;
+ mes "[Arjen]";
+ mes "Lucky I am freerightnow. So, just bring me the materials and I will whoosh! make it for you!";
+ mes "So, any idea of what accessory you would like to have?";
+ emotion e_heh; //ET_SMILE
+ next;
+ switch(select("^3131FFX Hairpin:Giant Band Aid:Flower Hairpin^000000:End conversation.")) {
+ case 1:
+ if (countitem(2294) > 0 && countitem(7220) > 399) {
+ mes "[Arjen]";
+ mes "X Hairpin!";
+ mes "That's very good !!";
+ next;
+ mes "[Arjen]";
+ mes "Oh yes!";
+ mes "The Stellar.."; //star dust? that's not refinable, now is it? =X
+ mes "^CE3100During the production, the refine level will disappear, is that ok with you?^000000";
+ next;
+ switch(select("It's ok, just make it for me!:I will come next time.")) {
+ case 1:
+ mes "[Arjen]";
+ mes "Oh well- Then,";
+ mes "it's time to show my skill after all this time !?";
+ next;
+ mes "^3131FF - Sha Sha !! - ^000000";
+ mes "^3131FF - Cha Sha Haa !! - ^000000";
+ next;
+ if (countitem(2294) > 0 && countitem(7220) > 399) {
+ delitem 2294,1;
+ delitem 7220,400;
+ getitem 5079,1; //X-Hairping == crossed hair band?
+ }
+ mes "[Arjen]";
+ mes " OK - !!";
+ mes "I still have my touch! Wa ha ha!!";
+ mes "How about that? Do you like it?";
+ next;
+ mes "[Arjen]";
+ mes "If you have any need, come and find me here anytime!";
+ mes "So, good bye. Good Bye!";
+ close;
+ case 2:
+ mes "[Arjen]";
+ mes "Fine, fine, come back after you've made up your mind!";
+ close;
+ }
+ } else {
+ mes "[Arjen]";
+ mes "Right - the ^3131FF X Hairpin!^000000";
+ mes "That's simple!";
+ next;
+ mes "[Arjen]";
+ mes "^FF0000Stellar x1^000000";
+ mes "^FF0000Ectoplasm x400^000000";
+ mes "If you've prepared all of this, I will help to make it for you!";
+ close;
+ }
+ case 2:
+ if (countitem(970) > 0 && countitem(930) > 499) {
+ mes "[Arjen]";
+ mes "Giant Band Aid??..";
+ mes "Oh well- Then,";
+ mes "it's time to show my skill after all this time !?";
+ next;
+ mes "^3131FF - Sha Sha !! - ^000000";
+ mes "^3131FF - Cha Sha Haa !! - ^000000";
+ next;
+ if (countitem(970) > 0 && countitem(930) > 499) {
+ delitem 970,1;
+ delitem 930,500;
+ getitem 5063,1; //another one in wich I love gravity for changing names =X
+ }
+ mes "[Arjen]";
+ mes " OK - !!";
+ mes "I still have my touch! Wa ha ha!!";
+ mes "How about that? Do you like it?";
+ next;
+ mes "[Arjen]";
+ mes "If you have any need, come and find me here anytime!";
+ mes "So, good bye. Good Bye!";
+ close;
+ } else {
+ mes "[Arjen]";
+ mes "Hoho - ^3131FF Plaster !^000000";
+ mes "If anyone asked where this is the Plaster that is used when someone is hurt?";
+ mes "Tell them it is the real Plaster for injured people.";
+ mes "Hmm, isn't that easy?";
+ next;
+ mes "[Arjen]";
+ mes "^FF0000Alcohol x1^000000";
+ mes "^FF0000Rotten Bandage x500^000000";
+ mes "If you have prepared all the items, I will help to make it for you now?";
+ close;
+ }
+ case 3:
+ if (countitem(2269) > 0 && countitem(999) > 9 && Zeny > 19999) {
+ mes "[Arjen]";
+ mes "Great !! Flower Hairpin ~";
+ mes "it's time to show my skill after all this time !?";
+ next;
+ mes "^3131FF - Sha Sha !! - ^000000";
+ mes "^3131FF - Cha Sha Haa !! - ^000000";
+ next;
+ if (countitem(2269) > 0 && countitem(999) > 9 && Zeny > 19999) {
+ delitem 2269,1;
+ delitem 999,10;
+ set Zeny,Zeny-20000;
+ getitem 5061,1; //finally a non-changed name =X
+ }
+ mes "[Arjen]";
+ mes " OK - !!";
+ mes "I still have my touch! Wa ha ha!!";
+ mes "How about it? Do you like it? Here is the stem left from the production. Take it as a souvenir. Haha.";
+ next;
+ mes "[Arjen]";
+ mes "If you have any need, come and find me here anytime!";
+ mes "So, good bye. Good Bye!";
+ close;
+ } else {
+ mes "[Arjen]";
+ mes "Yes - ^3131FF Flower Hairpin !^000000";
+ mes "Sometimes, I see some strange girls with bare legs and a flower in their mouths.";
+ mes "Looking at them, I get an idea!";
+ next;
+ mes "[Arjen]";
+ mes "That is ^3131FFFlower^000000, ^3131FFFlower^000000 !";
+ mes "Wa ha ha, isn't that a perfect match?";
+ mes "Some even equip it on the Orc Warrior, you should be proud of it, right?";
+ mes "Really ~ ~ ~";
+ next;
+ mes "[Arjen]";
+ mes "But the process takes a little more effort,";
+ mes "I need to take some process fee.";
+ next;
+ mes "[Arjen]";
+ mes "You should know that,";
+ mes "stabilizing a fragile flower on the head";
+ mes "takes a lot of concentration and";
+ mes "very high level of skills!";
+ next;
+ mes "[Arjen]";
+ mes "So, please bring,";
+ mes "^FF0000Romantic Flower x1^000000";
+ mes "^FF0000Steel x10^000000";
+ mes "together with ^3131FF 20,000 zeny^000000 !";
+ mes "If you have prepared all of these, I will make it for you right away!";
+ mes "Do you understand that?";
+ close;
+ }
+ case 4:
+ mes "[Arjen]";
+ mes "Ha, what? You don't want it?";
+ mes "Rumblerumblerumble";
+ close;
+ }
+}
+//Yuno /=Headband of power=/ <-- Ok, WTF? Thanks again bitches ;_;
+//Yuno /=Hot-blooded headband=/ [5070]
+yuno.gat,300,188,5 script Zhenbolt 753,{
+ if(countitem(7216) > 299 && countitem(7097) > 299 && countitem(2211) > 0 && countitem(982) > 0) {
+ delitem 7216,300;
+ delitem 7097,300;
+ delitem 2211,1;
+ delitem 982,1;
+ mes "[Zhenbolt]";
+ mes "Uh oh...Have you collected all the items?";
+ mes "Good.";
+ mes "According to out agreement,";
+ mes "I will create it for you, whole hearedly.";
+ next;
+ mes "[Zhenbolt]";
+ mes "........................";
+ next;
+ mes "[Zhenbolt]";
+ mes "........................";
+ next;
+ mes "[Zhenbolt]";
+ mes "..................-work harder!-";
+ next;
+ mes "[Zhenbolt]";
+ mes "Uh oh... It's finished.";
+ mes "If you wear it,";
+ mes "you will feel some warmth,";
+ mes "in this cold world.";
+ mes "A great item has been born in this world.";
+ mes "Ladies and gentleman, this is ^FF0000Hot-blooded Headband^000000!!";
+ getitem 5070,1;
+ next;
+ mes "[Zhenbolt]";
+ mes "With this, I will be able";
+ mes "to get back to the person I miss soon.";
+ mes "My name is";
+ mes "Zhenbolt";
+ mes "Main distributor of hear warming sensation!";
+ close;
+ } else {
+ mes "[Zhenbolt]";
+ mes "My name is Zhenbolt,";
+ mes "a simple practioner that travels around the world,";
+ mes "to spead the warmth of heart around the world.";
+ next;
+ mes "[Zhenbolt]";
+ mes "You won't understand the meaning";
+ mes "of a burning spirit and heat of passion through mere explaining.";
+ mes "So do you want to accept this?";
+ mes "I will create an item";
+ mes "that stores my heart for you.";
+ next;
+ mes "[Zhenbolt]";
+ mes "However,";
+ mes "I cannot leave this place,";
+ mes "because I need to pass the message to others...";
+ mes "So,";
+ mes "I will have to trouble you";
+ mes "to gather the materials.";
+ next;
+ mes "[Zhenbolt]";
+ mes "^FF0000Red Muffler^000000 300 unit";
+ mes "^FF0000Burning Heart^000000 300 unit";
+ mes "^FF0000Bandana^000000 1unit ^FF0000White Dyestuffs^000000 1 unit...";
+ mes "To produce the item,";
+ mes "you'll need this materials.";
+ mes "Come to find me again after you've collected all the materials required.";
+ next;
+ mes "[Zhenbolt]";
+ mes "^FF0000Besides that,";
+ mes "Ah! Please keep this in mind.";
+ mes "If you slot a card in your equipment,";
+ mes "and you want to change it to the item now,";
+ mes "you will lose the card and refined level.";
+ close;
+ }
+}
+//Prontera /=Red Tailed Ribbon=/ [5083](Red Ribbon)//
+prontera.gat,165,232,3 script Netpia 744,{
+ if(countitem(2244) > 0 && countitem(2209) > 0 && countitem(10007) > 0) {
+ delitem 2244,1;
+ delitem 2209,1;
+ delitem 10007,1;
+ mes "[Netpia]";
+ mes "Wow... You've brought all of it.";
+ mes "You've must have done a lot.";
+ mes "I will make the item according to our agreement.";
+ mes "Please wait for a while.";
+ next;
+ mes "[Netpia]";
+ mes "...........................";
+ next;
+ mes "[Netpia]";
+ mes "...........................";
+ next;
+ mes "[Netpia]";
+ mes ".....................-Work Hard-";
+ next;
+ mes "[Netpia]";
+ mes "Here it is.";
+ mes "It's all yours now.";
+ mes "Remember to always wear it.";
+ getitem 5083,1;
+ next;
+ mes "[Netpia]";
+ mes "Use this,";
+ mes "to pass my intention to him...";
+ mes "He left me for a while,";
+ mes "with the hope to warm the heart of the world.";
+ mes "The one who chases that dream...";
+ mes "Where is he now?";
+ next;
+ mes "[Netpia]";
+ mes "When you see the Red Ribbon,";
+ mes "will you think of me,";
+ mes "and continue to work harder?";
+ mes "May you be blessed with luck on your journey.";
+ close;
+ } else {
+ mes "[Netpia]";
+ mes "Hello?";
+ mes "Do you want to wear a Red Ribbon?";
+ mes "It's a really beautiful head accesory.";
+ mes "I am not trying to trick you,";
+ mes "what do you think?";
+ next;
+ mes "[Netpia]";
+ mes "^FF0000Big Ribbon^000000 x1.";
+ mes "^FF0000Ribbon with one slot^000000 x1.";
+ mes "^FF0000Silk Ribbon^000000 x1...";
+ mes "I'll make it for you,";
+ mes "if you bring the above items.";
+ next;
+ mes "[Netpia]";
+ mes "Remember to bring it to me.";
+ mes "I'll be more then glad,";
+ mes "if you wear the Red Ribbon.";
+ mes "Then see you soon.";
+ next;
+ mes "[Netpia]";
+ mes "^FF0000Ah... let me tell you about this,";
+ mes "Ah! Please keep this in mind.";
+ mes "If you slot a card in you equipment,";
+ mes "and you want to change it to the item now,";
+ mes "you will lose the card and refined level.";
+ close;
+ }
+}
+//Comodo /=Indian Headband=/ [5071]
+comodo.gat,237,217,5 script Merunte 732,{
+ if (countitem(5010) > 0 && countitem(5049) > 0 && countitem(7101) > 9 && Zeny > 9999) {
+ delitem 5010,1;
+ delitem 5049,1;
+ delitem 7101,10;
+ set Zeny,Zeny-10000;
+ mes "[Merunte]";
+ mes "Oh oh! You have brought it like you've promised!";
+ mes "Then we shall pay our end of our bargain,";
+ mes "just like the Indians!";
+ next;
+ mes "[Merunte]";
+ mes "Now let me have";
+ mes "the materials that you have brought first.";
+ mes "I will use it well to make the headband.";
+ getitem 5071,1;
+ next;
+ mes "[Merunte]";
+ mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
+ close;
+ } else {
+ mes "[Merunte]";
+ mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
+ mes " ";
+ mes "Let the spirit of Indian stay glorious forever!";
+ mes "With the honor of Comodo Indian,";
+ mes "raise the glory of Indian!";
+ next;
+ mes "[Merunte]";
+ mes "For this reason,";
+ mes "do you want to try wearing,";
+ mes "an Indian Headband? Bring ^FF0000Indian Fillet^000000 x1";
+ mes "^FF0000Striped Hairband^000000 x1";
+ mes "^FF0000Peco Peco Feather^000000 x10";
+ mes "and together with ^FF000010000zeny^000000!";
+ next;
+ mes "[Merunte]";
+ mes "And Indiantakes a promise,";
+ mes "more importantly than his life.";
+ mes "As long as you bring it, I will make that for you anytime!";
+ mes " ";
+ mes "Ah Wuwuwuwuwuwuwuwuwuwuwu~";
+ next;
+ mes "[Merunte]";
+ mes "^FF0000Ah! Please keep this in mind";
+ mes "If you slot a card in your equipment,";
+ mes "and you want to change it to the item now,";
+ mes "you will lose the card and refined level.";
+ close;
+ }
+}
+//Geffen /=Mushroom Band=/ [5082]
+geffen.gat,67,87,3 script Ipore 700,{
+ if (countitem(921) > 299) {
+ delitem 921,300;
+ mes "[Ipore]";
+ mes "Oh Wow. You really have brought the Mushroom Spore x 300?";
+ mes "You much have been tired.";
+ mes "Then, I shall use these,";
+ mes "to perform a magic show for you!";
+ mes "Please wait for a while.";
+ next;
+ mes "- Sha Ka Sha Ka Sha Ka Sha Ka Sha Ka Sha Ka -";
+ mes "- Iporeput all the Mushroom Spores-";
+ mes "- onto my head. -";
+ next;
+ mes "[Ipore]";
+ mes "Kineisihayituoohyilaahahsaiyi";
+ mes "Chahulisitawutehayisikenbiah";
+ mes "BiwuBiwuBiwu....Keahahah!!";
+ next;
+ mes "[Ipore]";
+ mes ".......................";
+ mes "Shoosh... Anyway,";
+ mes "The spore has grown on your head.";
+ mes "It looks odd just like that.";
+ mes "Let me help you to make it into a headband.";
+ next;
+ mes "[Ipore]";
+ mes "So...How about that? Feeling any better?";
+ mes "Making a headband,";
+ mes "using the spore that grows from your head...";
+ mes "Isn't that romantic? Hehe.";
+ next;
+ mes "[Ipore]";
+ mes "Anyway, you've done a lot.";
+ mes "So, take this headban with you to show off somewhere.";
+ mes "If you want to make another one,";
+ mes "just come and find me!";
+ getitem 5082,1;
+ close;
+ } else {
+ mes "[Ipore]";
+ mes "Huhuhu...";
+ mes "I fount it at last!";
+ mes "I have discovered a magic";
+ mes "that will make the spore grows on your head.";
+ next;
+ mes "[Ipore]";
+ mes "Of course, it might be inconvenient,";
+ mes "with a headfull of mushroom spore...";
+ mes "That's why I pick it up";
+ mes "and make it into a hairband for you.";
+ next;
+ mes "[Ipore]";
+ mes "Aiyo! No point listening and do not see it for yourself!";
+ mes "Just bring 300 ^FF0000Mushroom Spore^000000,";
+ mes "and I will let you experience it!";
+ mes "I am confident that if you experience such magic,";
+ mes "you're surely be thankful to me, won't you?";
+ close;
+ }
+}
+//Yuno /=Ears of Angel's Wing & Ears of Devil's Wing=/ [5074]&[5068]
+yuno.gat,241,52,3 script Old Blacksmith 813,{
+ mes "[A seemingly skillful craftman]";
+ mes "Uh Oh, since you've come to this place,";
+ mes "you must have known how to enjoy the scenary.";
+ mes "Since you're a Blacksmith, why not do your forging?";
+ mes "What's the point staring at the sky?";
+ mes "My name is Habir Moah!";
+ mes "A wandering Blacksmith with my hammer as my companion.";
+ next;
+ if (countitem(2254) && countitem(2286) && Zeny>19999) {
+ mes "[Habir Moah]";
+ mes "Hmm? You do have really good items, don't you?";
+ mes "Hmm... however,";
+ mes "do you have the insufficientfeeling?";
+ mes "If you are willing, take out your";
+ mes "^4d4dffAngel Wing^000000 and ^4d4dffElven Ears^000000";
+ mes "to create a unusual item.";
+ next;
+ mes "[Habir Moah]";
+ mes "How about that, do you ever though of that?";
+ mes "Don't suspect my capability!";
+ mes "As a Blacksmith";
+ mes "I am considered as one of the most skillful one, if not the most skillful!";
+ mes "Through the skill of blacksmith,";
+ mes "an ore will become a great steel, that's the rule.";
+ next;
+ switch(select("Hmm... I'll think about it.:Can you help me make it?:Can I craft Evil headband...?")) {
+ case 1:
+ mes "[Habir Moah]";
+ mes "Hmm, what a pity!";
+ mes "I thought I can show my skill again.";
+ mes "Oh well.";
+ mes "... ... ...";
+ mes "Beautiful sky... So blue.";
+ close;
+ case 2:
+ mes "[Habir Moah]";
+ mes "Aha, thank you!";
+ mes "Let's see the material first, shall we?";
+ mes "Angel Wing and Elven Ears,";
+ mes "other miscellaneous stuffs and 20000 zeny.";
+ mes "All these items really cost something.";
+ mes "I will help you make one fine accesory.";
+ next;
+ mes "[Habir Moah]";
+ mes "Before I produce the item, let me remind you.";
+ mes "I don't care about";
+ mes "the level of refining for the item.";
+ mes "If you have worries,";
+ mes "I guess you better tidy up your items.";
+ next;
+ mes "[Habir Moah]";
+ mes "^4d4dffPlease Reserve the items,";
+ mes "that is required for making the headgear^000000";
+ mes "I do not hope that you will blame me,";
+ mes "if I fail to make that item.";
+ next;
+ switch(select("It's ok, just do it.:Hmm, I need to think about it.")) {
+ case 1:
+ mes "[Habir Moah]";
+ mes "So, let's do it!";
+ next;
+ misceffect 154; //Success Hammer ;P
+ mes "[Habit Moah]";
+ mes "With my skills,";
+ mes "the great creation of me, Habir Moah,";
+ mes "is completed!";
+ mes "Here it is,";
+ mes "the Angel Wing Ears.";
+ if (countitem(2254) && countitem(2286) && Zeny>19999) {
+ delitem 2254,1;
+ delitem 2286,1;
+ set Zeny,Zeny-20000;
+ getitem 5074,1;
+ }
+ next;
+ mes "[Habir Moah]";
+ mes "From now on,";
+ mes "everyone will you.";
+ close;
+ case 2:
+ mes "[Habir Moah]";
+ mes "If you're interested in it in future,";
+ mes "do come and find me.";
+ mes " ";
+ mes "Ah, what a soothing breeze.";
+ close;
+ }
+ case 3:
+ mes "[Habir Moah]";
+ mes "Hoho, of couse I can craft";
+ mes "Evil Wing!";
+ mes "I'll make it into Devil Wing Ears!";
+ next;
+ mes "[Habir Moah]";
+ mes "Let's see the materials required, shall we?";
+ mes "Evil Wing and Elven Ears,";
+ mes "in addition to that, 20,000 zeny.";
+ mes "All these items really cost something.";
+ mes "I will help you make one fine accesory.";
+ next;
+ mes "[Habir Moah]";
+ mes "Before I produce the item, let me remind you.";
+ mes "I don't care about";
+ mes "the level of refining for the item.";
+ mes "If you have worries,";
+ mes "I guess you better tidy up your items.";
+ next;
+ mes "[Habir Moah]";
+ mes "^4d4dffPlease reserve the items,";
+ mes "this is required for making the headgear.^000000";
+ mes "I do not hope that you will blame me,";
+ mes "if I fail to make that item.";
+ next;
+ switch(select("It's ok. Let's do it.:I need to tidy up first.")) {
+ case 1:
+ if (countitem(2255) && countitem(2286) && Zeny > 19999) {
+ mes "[Habir Moah]";
+ mes "So, let's do it!";
+ next;
+ misceffect 154;
+ mes "[Habir Moah]";
+ mes "With my skills,";
+ mes "the great creation of me, Habir Moah,";
+ mes "is completed!";
+ mes "Here it is,";
+ mes "Devil Wing Ears";
+ if (countitem(2255) && countitem(2286) && Zeny > 19999) {
+ delitem 2255,1;
+ delitem 2286,1;
+ set Zeny,Zeny-20000;
+ getitem 5068,1;
+ }
+ next;
+ mes "[Habir Moah]";
+ mes "Fromnow on,";
+ mes "everyone will you.";
+ close;
+ } else {
+ mes "[Habir Moah]";
+ mes "I'm sorry. If you have not prepared all the materials,";
+ mes "I won't do that for you.";
+ mes "I'll need Evil Wing, Elven Ears and";
+ mes "20000 zeny.";
+ mes "Can you please confirm that you have all of those?";
+ close;
+ }
+ case 2:
+ mes "[Habir Moah]";
+ mes "If you're interested in it in future,";
+ mes "do come and find me.";
+ mes " ";
+ mes "Ah, what a soothing breeze.";
+ close;
+ }
+ }
+ } else if (countitem(2255) && countitem(2286) && Zeny>19999) {
+ mes "[Habir Moah]";
+ mes "Hmm? You do have really good items, don't you?";
+ mes "Hmm... however,";
+ mes "do you have the insufficientfeeling?";
+ mes "If you are willing, take out your";
+ mes "^4d4dffEvil Wing^000000 and ^4d4dffElven Ears^000000";
+ mes "to create a unusual item.";
+ next;
+ mes "[Habir Moah]";
+ mes "How about that, do you ever though of that?";
+ mes "Don't suspect my capability!";
+ mes "As a Blacksmith";
+ mes "I am considered as one of the most skillful one, if not the most skillful!";
+ mes "Through the skill of blacksmith,";
+ mes "an ore will become a great steel, that's the rule.";
+ next;
+ switch(select("Hmm... I'll think about it.:Can you help me make it?:Can I craft Angel Wing...?")) {
+ case 1:
+ mes "[Habir Moah]";
+ mes "Hmm, what a pity!";
+ mes "I thought I can show my skill again.";
+ mes "Oh well.";
+ mes "... ... ...";
+ mes "Beautiful sky... So blue.";
+ close;
+ case 2:
+ mes "[Habir Moah]";
+ mes "Aha, thank you!";
+ mes "Let's see the material first, shall we?";
+ mes "Evil Wing and Elven Ear,";
+ mes "other miscellaneous stuffs and 20000 zeny.";
+ mes "All these items really cost something.";
+ mes "I will help you make one fine accesory.";
+ next;
+ mes "[Habir Moah]";
+ mes "Before I produce the item, let me remind you.";
+ mes "I don't care about";
+ mes "the level of refining for the item.";
+ mes "If you have worries,";
+ mes "I guess you better tidy up your items.";
+ next;
+ mes "[Habir Moah]";
+ mes "^4d4dffPlease Reserve the items,";
+ mes "that is required for making the headgear^000000";
+ mes "I do not hope that you will blame me,";
+ mes "if I fail to make that item.";
+ next;
+ switch(select("It's ok, just do it.:Hmm, I need to think about it.")) {
+ case 1:
+ mes "[Habir Moah]";
+ mes "So, let's do it!";
+ next;
+ misceffect 154; //Success Hammer ;P
+ mes "[Habit Moah]";
+ mes "With my skills,";
+ mes "the great creation of me, Habir Moah,";
+ mes "is completed!";
+ mes "Here it is,";
+ mes "the Angel Wing Ears.";
+ if (countitem(2255) && countitem(2286) && Zeny>19999) {
+ delitem 2255,1;
+ delitem 2286,1;
+ set Zeny,Zeny-20000;
+ getitem 5068,1;
+ }
+ next;
+ mes "[Habir Moah]";
+ mes "From now on,";
+ mes "everyone will you.";
+ close;
+ case 2:
+ mes "[Habir Moah]";
+ mes "If you're interested in it in future,";
+ mes "do come and find me.";
+ mes " ";
+ mes "Ah, what a soothing breeze.";
+ close;
+ }
+ case 3:
+ mes "[Habir Moah]";
+ mes "Hoho, of course I can craft";
+ mes "Angel Wing!";
+ mes "I'll make it into Angel Wing Ears!";
+ next;
+ mes "[Habir Moah]";
+ mes "Let's see the materials required, shall we?";
+ mes "Angel Wing and Elven Ears,";
+ mes "in addition to that, 20,000 zeny.";
+ mes "All these items really cost something.";
+ mes "I will help you make one fine accesory.";
+ next;
+ mes "[Habir Moah]";
+ mes "Before I produce the item, let me remind you.";
+ mes "I don't care about";
+ mes "the level of refining for the item.";
+ mes "If you have worries,";
+ mes "I guess you better tidy up your items.";
+ next;
+ mes "[Habir Moah]";
+ mes "^4d4dffPlease reserve the items,";
+ mes "this is required for making the headgear.^000000";
+ mes "I do not hope that you will blame me,";
+ mes "if I fail to make that item.";
+ next;
+ switch(select("It's ok. Let's do it.:I need to tidy up first.")) {
+ case 1:
+ if (countitem(2254) && countitem(2286) && Zeny > 19999) {
+ delitem 2254,1;
+ delitem 2286,1;
+ set Zeny,Zeny-20000;
+ mes "[Habir Moah]";
+ mes "So, let's do it!";
+ next;
+ misceffect 154;
+ mes "[Habir Moah]";
+ mes "With my skills,";
+ mes "the great creation of me, Habir Moah,";
+ mes "is completed!";
+ mes "Here it is,";
+ mes "Angel Wing Ears";
+ getitem 5074,1;
+ next;
+ mes "[Habir Moah]";
+ mes "Fromnow on,";
+ mes "everyone will you.";
+ close;
+ } else {
+ mes "[Habir Moah]";
+ mes "I'm sorry. If you have not prepared all the materials,";
+ mes "I won't do that for you.";
+ mes "I'll need Angel Wing, Elven Ears and";
+ mes "20000 zeny.";
+ mes "Can you please confirm that you have all of those?";
+ close;
+ }
+ case 2:
+ mes "[Habir Moah]";
+ mes "If you're interested in it in future,";
+ mes "do come and find me.";
+ mes " ";
+ mes "Ah, what a soothing breeze.";
+ close;
+ }
+ }
+ } else {
+ mes "[Habir Moah]";
+ mes "I am not sure how I have followed the wind,";
+ mes "that leads me to Juno...";
+ mes "Altough I don't really feel comfortable on a high place like this, the view here is really breath taking.";
+ mes "I never knew the sky could be so beautiful,";
+ mes "when I was travelling on the land.";
+ next;
+ mes "[Habir Moah]";
+ mes "Anyway, I am a craftman in nature...";
+ mes "I feel uneasy if I do not craft anything.";
+ mes "And it's been a while since my last creation.";
+ mes "If there're materials,";
+ mes "I'll surely create the best creation of my life.";
+ mes "Unfortunately, there weren't any. ...Hehe...";
+ next;
+ mes "[Habir Moah]";
+ mes "May I ask, do you have either Angel Wing,";
+ mes "Evil Wing or Elven Ear?";
+ mes "If you do, can you bring it to me?";
+ mes "I will help you to make a beautiful";
+ mes "Ears of Angel's Wing and Ears of Devil's Wing.";
+ next;
+ switch(select("Can you tell me about the details?:I'll consider about it.")) {
+ case 1:
+ mes "[Habir Moah]";
+ mes "Oh yes,";
+ mes "I need to tell you the details about the materials.";
+ mes "Angel Wing Ears requires ^4d4dffAngel Wings^000000 and";
+ mes "^4d4dffElven Ears^000000 &#1038;Aand the cost for other materials is";
+ mes "approximatedly ^4d4dff20000 zeny^000000";
+ next;
+ mes "[Habir Moah]";
+ mes "Devil Wing Ears requires ^4d4dffEvil Wing^000000 and";
+ mes "^4d4dffElven Ears^000000 &#1038;Awhile the cost for other materials is";
+ mes "approximately ^4d4dff20000 zeny";
+ next;
+ mes "[Habir Moah]";
+ mes "Please come to me after you have got all the materials.";
+ mes "I will make the joy of Angel and terror of Devil";
+ mes "as a present for you.";
+ close;
+ case 2:
+ mes "[Habit Moah]";
+ mes "I always look at thge sky at this location...";
+ mes "So if you need me, you know where to find me.";
+ close;
+ }
+ }
+}
+//Lutie /=Sea Otter Cap=/
+xmas.gat,183,267,3 script Pretty Lindsay 793,{
+ if (countitem(5033) && countitem(5064)) {
+ delitem 5033,1;
+ delitem 5064,1;
+ mes "[Pretty Lindsay]";
+ mes "Wow~ you really have brought all the items here.";
+ mes "Hang on for a while~";
+ mes "Lindsay will make that for you right now.";
+ next;
+ mes "[Pretty Lindsay]";
+ mes "Just like what my mom taught me,";
+ mes "first, place this on the ground...";
+ mes "Preparation complete. . . .";
+ mes "Haya, yah!";
+ next;
+ misceffect 261;
+ mes "^FF0000Lindsay put the RaccoonHat on the ground,";
+ mes "and place the Smokie Leaf on top of it.";
+ mes "Then she say something that none could understand its meaning.";
+ mes "There's a bright glitter,";
+ mes "and the fur of the RaccoonHat slowly turns into blue color.";
+ mes "And finally, the shape of Smokie turns into Otter.";
+ next;
+ mes "[Pretty Lindsay]";
+ mes "Pheww! It's done!";
+ mes "It's so tiring I am feeling weak right now!";
+ mes "Here~ Take it~";
+ getitem 5078,1;
+ next;
+ mes "[Pretty Lindsay]";
+ mes "This is.. This is the best creation of Lindsay.";
+ mes "Remember to put it on always~";
+ mes "Farewell~";
+ close;
+ } else {
+ mes "[Pretty Lindsay]";
+ mes "Hi~ Wassup?";
+ if (sex) {
+ mes "Handsome boy.";
+ } else {
+ mes "Beautiful?";
+ }
+ next;
+ mes "[Pretty Lindsay]";
+ mes "Do you want to get a cute headgear?";
+ mes "Pretty Lindsay is going to create";
+ mes "a cap that looks like a Sea Otter this time.";
+ mes "How about that? It should be cute, ya?";
+ emotion e_heh; //ET_SMILE
+ next;
+ mes "[Pretty Lindsay]";
+ mes "Imagina that~ If you get to wear that hat,";
+ mes "you will have the feeling,";
+ mes "that you're like an Sea Otter.";
+ mes "If you can be like an Sea Otter.. Woah!";
+ mes "I am getting excited just by imagining it.";
+ next;
+ mes "[Pretty Lindsay]";
+ mes "However, production of ^4D4DFFSea-Otter Hat^000000 requires,";
+ mes "^0000FFRaccoonHat^000000 x1 ^0000FFSmokie Leaf^000000 x1";
+ mes "So, if you want to get a Sea-Otter Hat, brother,";
+ mes "just bring along the materials,";
+ mes "and Lindsay will make it for you immediately.";
+ next;
+ switch(select("I will come again when I have collected them.:Yo..why RaccoonHat?")) {
+ case 1:
+ mes "[Pretty Lindsay]";
+ mes "Hmm~ Come back soon~";
+ emotion e_heh; //ET_SMILE
+ close;
+ case 2:
+ mes "[Pretty Lindsay]";
+ mes "Ah..why Sea-Otter Hat production";
+ mes "requires Smokie Hat?";
+ mes "Hmm. .That's because. . . secrets.. .";
+ next;
+ mes "[Pretty Lindsay]";
+ mes "When you place Smokie Leaf with RaccoonHat,";
+ mes "and say the spell,";
+ mes "according to what my mom had taught, the RaccoonHat will";
+ mes "^003063Bang!!^000000 and turn into Sea-Otter Hat.";
+ next;
+ mes "[Pretty Lindsay]";
+ mes "But I don't know why it can be like that.";
+ mes "Mom never tell me the reason.";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes ". . . . . . . . . . . . . . . . .";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Ok..Ok, I will come again when I have collected all the items.";
+ close;
+ }
+ }
+}
+//Lutie /=Brown Bear Cap=/ [5059]
+xmas.gat,175,156,3 script Fuzzy Fuzz 712,{
+ if (countitem(5030) && countitem(7213) > 99 && countitem(7217) > 99 && countitem(7161) > 299) {
+ delitem 5030,1;
+ delitem 7213,100;
+ delitem 7217,100;
+ delitem 7161,300;
+ mes "[Fuzzy Fuzz]";
+ mes "Good! You've brought it!";
+ mes "The production might take some time.";
+ mes "There's a lot of amendment to be done.";
+ mes "So, please wait for a while.";
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes ". . . TutaTusa. . .";
+ mes "Pluck this off. . . .";
+ mes "Wuha!~ Sew it happily..";
+ mes "Wait a little longer.";
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "Didn't they say people who wait will be more lucky?";
+ mes "It's almost done. So wait for a little while.";
+ mes "Rub your hands if you feel cold.";
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "It is done!";
+ mes "I've made a cap that is suitable for you!";
+ mes "I know I made it, but it really looks nice.";
+ mes "I used a lot of efforts,";
+ mes "so please take good care of it.";
+ mes "Here~ Please take it with you~";
+ getitem 5059,1;
+ close;
+ } else {
+ mes "[Fuzzy Fuzz]";
+ if (sex) {
+ mes "Hey you, hold it right there!";
+ } else {
+ mes "Yoh miss, hold it right there.";
+ }
+ mes "You who look like a slow and dumb bear,";
+ mes "I have a cap that fits you,";
+ mes "how about that? do you want it?";
+ emotion e_omg; //ET_SURPRISE?
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "Haha.. Looks like you're not happy";
+ mes "because I said you look dumb, right?";
+ mes "How sensitive . . .";
+ mes "What I mean is, you're honest and easy to be tricked.";
+ mes "OkOk.. don't look at me like that.";
+ emotion e_sry; //ET_SORRY
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "I can't make the cap now because I do not have the materials.";
+ mes "Can you please.";
+ mes "find the materials for me?";
+ mes "I will help to make the 'Teddybear Hat' for you.";
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "Come, let me tell you about the required materials.";
+ mes "You won't need very much materials here.";
+ mes "^0000FFPanda Hat^000000 x1 ^0000FFNeedle Packet^000000 x100";
+ mes "^0000FFSpool^000000 x100 ^0000FFBlack Bear's Skin^000000 x300";
+ mes "That's all,";
+ mes "isn't that easy to be found?";
+ next;
+ mes "[Fuzzy Fuzz]";
+ mes "I will be waiting for you!";
+ emotion e_heh; //ET_SMILE
+ close;
+ }
+}
+//payon /=Cap of Concentration=/ [5073]
+payon_in03.gat,8,193,4 script Nan Hyang 75,{
+ if (countitem(2285) && countitem(1550)) {
+ mes "[Nan Hyang]";
+ mes "Sigh, give that to me.";
+ mes "Before I start,";
+ mes "take note of this,";
+ mes "In the process of production ^FF0000'Model Training Hat'^000000,";
+ mes "If ^FF0000the 'Book' is slotted with card,";
+ mes "or possesses refined level^000000,";
+ emotion e_heh; //ET_SMILE
+ next;
+ mes "[Nan Hyang]";
+ mes "^FF0000the effect will dissappear,";
+ mes "Of course, the same goes to the 'Apple of Archer' too^000000.";
+ mes "So do you want me to make it now?";
+ next;
+ switch(select("Start making it:Wait, don't.")) {
+ case 1:
+ mes "[Nan Hyang]";
+ mes "Request accepted,";
+ mes "I will start it right now.";
+ mes "Please have a seat,";
+ mes "and wait for me, will you?";
+ mes "This is to make sure that you have the correct posture.";
+ mes "Don't worry, it's for free.";
+ emotion e_ok; //ET_OK
+ next;
+ mes "[Nan Hyang]";
+ mes "Please be patient!";
+ next;
+ mes ". . . . . . . . . . . . . . . . . .";
+ mes " . . . . . . . . . . . . . . . . . ";
+ mes ". . . . . . . . . . . . . . . . . .";
+ mes " . . . . . . . . . . . . . . . . . ";
+ next;
+ mes "[Nan Hyang]";
+ mes "This is not a hard task,";
+ mes "so it's going to be completed right away..";
+ mes "Please wear this hat,";
+ mes "to keep a correct posture.";
+ mes "Thank you!";
+ next;
+ mes "[Nan Hyang]";
+ mes "An apple is placed on the book,";
+ mes "keep it balanced and don't let is fall.";
+ mes "This is the reason to put on the 'Model Training Hat',";
+ mes "to keep the balance in order to keep the correct posture.";
+ emotion e_oh; //ET_AHA? =X
+ next;
+ mes "[Nan Hyang]";
+ mes "You might feel unconfortable and pain on your neck at the beginning.";
+ mes "But as you use it,";
+ mes "you will slowly found your posture going better.";
+ if (countitem(2285) && countitem(1550)) {
+ delitem 2285,1;
+ delitem 1550,1;
+ getitem 5073,1;
+ }
+ next;
+ mes "[Nan Hyang]";
+ mes "Here it is.";
+ mes "Please take it.";
+ mes "Ah.. Before I forget,";
+ mes "This is the Arrow taken from the Apple of Archer.";
+ mes "Please take it.";
+ getitem 1750,1;
+ next;
+ mes "[Nan Hyang]";
+ mes "Farewell then.";
+ mes "Have a balanced day.";
+ close;
+ case 2:
+ mes "[Nan Hyang]";
+ mes "Ah.. isn't this an item that requires a lot of equipments?";
+ mes "If you've fully prepared, come and find me.";
+ emotion e_hmm; //ET_THINK?
+ close;
+ }
+ } else {
+ mes "[Nan Hyang]";
+ mes "Good day.";
+ mes "This place teaches manners and posture.";
+ mes "May I know,";
+ mes "how can I help you here?";
+ emotion e_omg; //ET_SURPRISE?
+ next;
+ switch(select("I want to learn too . .:I'm sorry. I think I came to a wrong place.")) {
+ case 1:
+ mes "[Nan Hyang]";
+ mes "Oh, I see.";
+ mes "But how do I say this?";
+ mes "I'm really sorry,";
+ mes "we are not having any intake currently.";
+ next;
+ mes "[Nan Hyang]";
+ mes "And since the president is going outstation,";
+ mes "and we're not sure,";
+ mes "when he'll return,";
+ mes "(Phew..how long are you going to";
+ mes "stay in the in. . . .)";
+ next;
+ mes "[Nan Hyang]";
+ mes "Hmm, beofre you take the course of manners,";
+ mes "we have to correct";
+ mes "your unbalance posture first.";
+ mes "This means that,";
+ mes "a correct posture is a polite action.";
+ mes "That's what I think.";
+ next;
+ mes "[Nan Hyang]";
+ mes "Since it is quite impossible to correct your posture now,";
+ mes "I will let you correct it yourself.";
+ mes "The method is";
+ mes "to create a 'Model Training Hat',";
+ mes "for you.";
+ next;
+ mes "[Nan Hyang]";
+ mes "Do you want me to make this for you?";
+ mes "If you want it,";
+ mes "please take the materials required here.";
+ mes "Generally I can give it to you for free.";
+ mes "But there's no stock in the storage anymore.";
+ emotion e_hmm; //ET_QUESTION?
+ next;
+ mes "[Nan Hyang]";
+ mes "If you bring ^0000FFApple of Archer^000000 x1 and ^0000FFBook^000000 x1,";
+ mes "I will produce it,";
+ mes "and give the product to you.";
+ next;
+ mes "[Nan Hyang]";
+ mes "After you've get these items,";
+ mes "come and find me.";
+ mes "Farewell then.";
+ close;
+ case 2:
+ mes "[Nan Hyang]";
+ mes "Oh, I see.";
+ mes "This place should be kept silent.";
+ mes "If you do not have any important matters,";
+ mes "can you please go out? Thank you.";
+ mes "Good byethen. . .";
+ close;
+ }
+ }
+}
+//geffen /=Tulip Hairpin=/
+geffen.gat,83,189,5 script Ses 716,{
+ mes "[Ses]";
+ mes "My name is Ses.";
+ mes "Ses like to fold paper.";
+ mes "I used a big colorful paper to make a huge boat for mummy yesterday.";
+ mes "She thank me and touch my head, hehe.";
+ emotion e_heh; //ET_SMILE
+ next;
+ mes "[Ses]";
+ mes "Today, the teacher teaches us the method to make beautiful flower!!!";
+ mes "Altough it's a little bit hard~ it's very interesting~";
+ mes"The flower is beautiful when you put it on your head. Everyone tell me so, and I'm so happy!";
+ emotion e_heh; //ET_THROB?=X
+ next;
+ if (countitem(2278) && countitem(975)) {
+ mes "[Ses]";
+ mes "Hehe- Mr. Smile!! Scarlet Dyestuffs!!!";
+ mes "WuYeaghhhhh---";
+ mes "Come, let me";
+ mes "help you make a beautiful flower !!";
+ emotion e_swt; //ET_SWEAT
+ next;
+ mes "[Ses]";
+ mes "Let me make it for you, ok? Ok????";
+ emotion e_swt;
+ next;
+ switch(select("Allow you to do so:I reject")) {
+ case 1:
+ mes "[Ses]";
+ mes "Wahahahaha~";
+ emotion e_heh;
+ next;
+ mes "[Ses]";
+ mes "Take this Mr Smile,";
+ mes "cut here a little, cut there some~~";
+ mes "and a little there, and here....";
+ mes "yiyik...";
+ emotion e_ho; //ET_DELIGHT?
+ next;
+ mes "[Ses]";
+ mes "Ha- !! It's done!!!!";
+ if (countitem(2278) && countitem(975)) {
+ delitem 2278,1;
+ delitem 975,1;
+ getitem 5077,1;
+ }
+ next;
+ mes "[Ses]";
+ mes "Hehe, it's done,";
+ mes "How about it? Cute, isn't it? Right?";
+ next;
+ mes "[Ses]";
+ mes "Am I good?";
+ mes "Hehe, I am making one for my bother too.";
+ mes "You need one, brother.";
+ mes "come and find me again if you want me to make a beautiful flower again.";
+ mes "Good bye then~";
+ close;
+ case 2:
+ mes "[Ses]";
+ mes "Yiyee~~ I don't need to help you do it again then!!";
+ close;
+ }
+ } else {
+ mes "[Ses]";
+ mes "Do you want to make on too, big brother?";
+ mes "I will teach you... hehehe";
+ next;
+ mes "[Ses]";
+ mes "However, you need to prepare some items,";
+ mes "because I don't have anything now.";
+ mes "Can you bring it to me, big brother?";
+ next;
+ switch(select("Sure:No")) {
+ case 1:
+ mes "[Ses]";
+ mes "So please bring,";
+ mes "^3131FFMr. Smile x1";
+ mes "Scarlet Dyestuffs x1^000000";
+ mes "I will make a beautiful red flower for you.";
+ next;
+ mes "[Ses]";
+ mes "I will wait for you here. Remember to come, ok!?";
+ close;
+ case 2:
+ mes "[Ses]";
+ mes "Hooyeahyeahyeah~~~~~";
+ emotion e_sob;
+ close;
+ }
+ }
+}
+//Lutie /=Party Hat, Straw Hat, Cowboy Hat, Sombrero and Fur hat=/
+xmas_in.gat,35,30,3 script Headgear Merchant 797,{
+ mes "[Mike]";
+ mes "I like hats...";
+ mes "I like hats more than any other thing in this world!!";
+ mes "Even if you compared hats with eating,";
+ mes "wearing a new hat is far more important";
+ next;
+ mes "[Mike]";
+ mes "Hat, Cap, Holy Bonnet,";
+ mes "Turban, Iron Helm,";
+ mes "Hemmed Sallet, Munak Turban...";
+ mes "I like them all!!";
+ mes "(Wuhoo! Wuhoohoo!!)";
+ next;
+ mes "[Mike]";
+ mes "I have learned the way to modified a hat,";
+ mes "and I am researching";
+ mes "to design the most fashionable hat.";
+ next;
+ switch(select("Party Hat:Straw Hat:Cowboy Hat:Sombrero:Fur Hat")) {
+ case 1: //Party hat [5060]
+ if(countitem(2236) && countitem(7151) > 99 && countitem(7111) > 99) {
+ mes "[Mike]";
+ mes "Party Hat! It is made according to the Santa's Hat,";
+ mes "decorated with some papers.";
+ mes "This is the best Party Hat!! Do you want it?";
+ mes "(Ohhhh, beautiful! So beautiful!)";
+ next;
+ mes "[Mike]";
+ mes "Wait, before I start the production, let's confirm this.";
+ mes "I will use items regarless of whether,";
+ mes "it had been refined or slotted with cards.";
+ mes "So you better just prepare the items required,";
+ mes "and put the others in the storage.";
+ next;
+ mes "[Mike]";
+ mes "You've brought all the materials...";
+ mes "Great! The one who wants a Party Hat,";
+ mes "do you want me to make it for you right now?";
+ next;
+ switch(select("No:Yes")) {
+ case 1:
+ mes "[Mike]";
+ mes "Hmm, is that so...";
+ mes "Let keep wearing your Santa's Hat then.";
+ mes "Hmmmhmmmhmmm....";
+ close;
+ case 2:
+ mes "^3355FFDeteDete ChebenCheben";
+ mes "PotterPotter MeganMegan";
+ mes "PosongPosong ShahaShaha";
+ next;
+ if(countitem(2236) && countitem(7151) > 99 && countitem(7111) > 99) {
+ delitem 2236,1;
+ delitem 7151,100;
+ delitem 7111,100;
+ getitem 5060,1;
+ }
+ mes "[Mike]";
+ mes "Very Good!";
+ mes "Force the birthday fellow to put this on,";
+ mes "then you can play tricks on him. That should be fun...";
+ mes "Please come again too next time~";
+ next;
+ mes "[Mike]";
+ mes "And, this is what's left after the process.";
+ mes "Here, take it!";
+ mes "Maybe it might be useful to you... (Hehehehe)";
+ getitem 949,10;
+ close;
+ }
+ } else {
+ mes "[Mike]";
+ mes "Party Hat! It's a necessity,";
+ mes "for anyone who throws a birthday party.";
+ mes "No matter how serious looking one is,";
+ mes "the hat will make him look cute and funny!";
+ next;
+ mes "[Mike]";
+ mes "In my opinion, it is suitable not only for birthday,";
+ mes "but as well as entertaining event!";
+ mes "This beautiful hat is just suitable for fun.";
+ mes "(...How about organizing a party for adventure?!?)";
+ next;
+ mes "[Mike]";
+ mes "Anyway, the material required are";
+ mes "^3355FFSanta's Hat^000000 x1";
+ mes "^3355FFOil Paper^000000 x100";
+ mes "^3355FFSlick Paper^000000 x100";
+ next;
+ mes "[Mike]";
+ mes "These are what I need.";
+ mes "So don't forget to collect the material, ok?";
+ mes "I will always be around....";
+ mes "So come back only after you have collected them!";
+ close;
+ }
+ case 2: //Straw Hat [5062]
+ if(countitem(2280) && countitem(7197) > 299 && countitem(7150) > 299) {
+ mes "[Mike]";
+ mes "Straw Hat! This hat is based on Sahkkat,";
+ mes "that is make of bamboo and rattan.";
+ mes "Wearing it makes you think that you're going to have a good harvesting year!";
+ mes "(Look, power of farmer!!)";
+ next;
+ mes "[Mike]";
+ mes "Wait, before I start the production, let's confirm this.";
+ mes "I will use items regardless of whether";
+ mes "it had been refined or slotted with cards.";
+ mes "So you better just prepare the items required,";
+ mes "and put the others in the storage.";
+ next;
+ mes "[Mike]";
+ mes "You've brought all the materials...";
+ mes "Great! The one who wants a Straw Hat,";
+ mes "do you want me to make it for you right now?";
+ next;
+ switch(select("No, thanks:Sure")) {
+ case 1:
+ mes "[Mike]";
+ mes "Hmm, is that so...";
+ mes "Let keep wearing your Sahkkat then.";
+ mes "Hmmmhmmmhmmm....";
+ close;
+ case 2:
+ mes "^3355FFSakaSaka WakaWaka";
+ mes "JekaJeka HuyiHuyi";
+ mes "PokaPoka TewuTewu^000000";
+ next;
+ if(countitem(2280) && countitem(7197) > 299 && countitem(7150) > 299) {
+ delitem 2280,1;
+ delitem 7197,300;
+ delitem 7150,300;
+ getitem 5062,1;
+ }
+ mes "[Mike]";
+ mes "HmmHmm! It feels that the harvest of this year shall be good!";
+ mes "I hope next year will be the same too...";
+ mes "Ahahaha, what am I talking about...";
+ mes "Please come again if you want more~";
+ close;
+ }
+ } else {
+ mes "[Mike]";
+ mes "Staw Hat! It gives you energy to work,";
+ mes "even under the heat of the sun";
+ mes "as well as providing shades that give you a cool feeling.";
+ mes "This hat will make you hope for a good harvest this year too!";
+ next;
+ mes "[Mike]";
+ mes "This hat is suitable for the farmers,";
+ mes "who want to plant or cultivate their crops.";
+ mes "You have the feel of a villager when you wear it!";
+ mes "(For your info, I am a city kid!)";
+ next;
+ mes "[Mike]";
+ mes "Anyway, the materials required for production are";
+ mes "^3355FFSakkat^000000 x1";
+ mes "^3355FFTough Vines^000000 x300";
+ mes "^3355FFPiece of Bamboo^000000 x300";
+ next;
+ mes "[Mike]";
+ mes "These are what I need.";
+ mes "So don't forget to collect all the material, ok?";
+ mes "I will always be around....";
+ mes "So come back only after you have collected them!";
+ close;
+ }
+ case 3: //Cowboy Hat [5075]
+ if (countitem(2248) && countitem(7030) > 107 && countitem(7194) > 107 && countitem(7120) > 3) {
+ mes "[Mike]";
+ mes "Cowboy Hat! A hat of western feel,";
+ mes "but looks toughet than Western Grace,";
+ mes "That is suitable for the western's males!";
+ mes "(Qiang... Yeehahaa~...)";
+ next;
+ mes "[Mike]";
+ mes "Wait, before I start the production, let's confirm this.";
+ mes "I will use item regardless of wether";
+ mes "It had been refined or slotted with cards.";
+ mes "So you better just prepare the items required,";
+ mes "and put the others in the storage.";
+ next;
+ mes "[Mike]";
+ mes "You've brought all the materials...";
+ mes "Great! The one who wants a Cowboy Hat,";
+ mes "do you want me to make it for you right now?";
+ switch(select("No:Yes")) {
+ case 1:
+ mes "[Mike]";
+ mes "Hmm,is that so...";
+ mes "Let keep wearing your typical Western Grace then.";
+ mes "Hmmmhmmmhmmm....";
+ close;
+ case 2:
+ mes "^3355FFDudududu bangbangbangbang";
+ mes "TadamTadam BiyongBiyong";
+ mes "Wuuuuu Ahwuwuwuwuw^000000";
+ next;
+ if (countitem(2248) && countitem(7030) > 107 && countitem(7194) > 107 && countitem(7120) > 3) {
+ delitem 2248,1;
+ delitem 7030,108;
+ delitem 7194,108;
+ delitem 7120,4;
+ getitem 5075,1;
+ }
+ mes "[Mike]";
+ mes "HeeeHaH! With that";
+ mes "you can tame even the wildest stiallion!";
+ mes "Please come again if you need more~";
+ close;
+ }
+ } else {
+ mes "[Mike]";
+ mes "Cowboy Hat!A hat of western feel,";
+ mes "where you seem to found the boiling blood of the cowboys...";
+ mes "It's as if you are going to draw something out,";
+ mes "and start shooting!";
+ next;
+ mes "[Mike]";
+ mes "The Cowboy Hat with thefeel of opening a barren land...";
+ mes "It makes guys look cool!";
+ mes "and it makes gals look prettier";
+ mes "(Is tought the new concept of beauty...?)";
+ next;
+ mes "[Mike]";
+ mes "Anyway, the materials required for production are";
+ mes "^3355FFWestern Grace^000000 x1";
+ mes "^3355FFClaw of Desert Wolf^000000 x108";
+ mes "^3355FFSoft Blade of Grass^000000 x108";
+ mes "^3355FFBurning Horseshoe^000000 x4";
+ next;
+ mes "[Mike]";
+ mes "These are what I need.";
+ mes "So don't forget to collect the material, ok?";
+ mes "I will always be around....";
+ mes "So come back only after you have collected them!";
+ close;
+ }
+ case 4: //Sombrero [5067]
+ if (countitem(5062) && countitem(952) > 49 && countitem(1907)) {
+ mes "[Mike]";
+ mes "SipoleiyeahhhhhhWoohohoh!!";
+ mes "Amigo! Adios Amigo!";
+ mes "If you like the sun and happy melody,";
+ mes "this is the right hat for you!!";
+ next;
+ mes "[Mike]";
+ mes "Wait, before I start the production, let's confirm this.";
+ mes "I will use items regardless of wether";
+ mes "it had been refined or slotted with cards.";
+ mes "So you better just prepare the items required";
+ mes "and put the others in the storage";
+ next;
+ mes "[Mike]";
+ mes "You've brought all the materials...";
+ mes "Great! The one who wants a Sombrero,";
+ mes "so you want me to make if for you right now?";
+ switch(select("No:Yes")) {
+ case 1:
+ mes "[Mike]";
+ mes "Hmmm, is that so...";
+ mes "Let keep wearing your shady Straw Hat then.";
+ mes "Hmmmhmmmhmmm....";
+ close;
+ case 2:
+ mes "^3355FFQingkaQinka KiangggQiangkiang";
+ mes "Diringringling kaciangkaciang";
+ mes "Adios Mamamiya^000000";
+ next;
+ if (countitem(5062) && countitem(952) > 49 && countitem(1907)) {
+ delitem 5062,1;
+ delitem 952,50;
+ delitem 1907,1;
+ getitem 5067,1;
+ }
+ mes "[Mike]";
+ mes "If you wear this to the desert,";
+ mes "you'll be Muka's friend too!! Full with joyous tempo and heat!!";
+ mes "Please come again if you want more~";
+ close;
+ }
+ } else {
+ mes "[Mike]";
+ mes "Yibayiba, andeleh andeleh!!";
+ mes "Amigo! Adios, Amigo!";
+ mes "Come again, Morocc!";
+ mes "Astalacista Baby!";
+ next;
+ mes "[Mike]";
+ mes "For you who like the sun and loud music!!";
+ mes "I present you with";
+ mes "the tri-level hat, Sombrero!!";
+ mes "(From Yggdrasil tree trill here!?)";
+ next;
+ mes "[Mike]";
+ mes "Anyway, the materials required for production are";
+ mes "^3355FFStraw Hat^000000 x1,";
+ mes "^3355FFCactus Needle^000000 x50,";
+ mes "^3355FFGuitar^000000 x1";
+ next;
+ mes "[Mike]";
+ mes "These are what I need";
+ mes "So don't forget to collect the material, ok?";
+ mes "I will always be around....";
+ mes "So come back only after you have collected them!";
+ close;
+ }
+ case 5: //fur hat [5076]
+ if (countitem(2226) && countitem(7038) > 499) {
+ mes "[Mike]";
+ mes "Fur Hat! Yo, Man! Check it out!";
+ mes "It's good for keeping warm! But it's fashionable too!";
+ mes "Even if you went to places as cold as Lutie,";
+ mes "you will be ok with this Beanie!!";
+ next;
+ mes "[Mike]";
+ mes "Wait, before I start the productions, let's confirm this.";
+ mes "I will use items regardless of wether";
+ mes "it had been refined or slotted with cards.";
+ mes "So you better just prepare the items required,";
+ mes "and put the others in the storage.";
+ next;
+ mes "[Mike]";
+ mes "You've brought all the materials...";
+ mes "Great! The one who wants a Beanie,";
+ mes "do you want me to make it for you right now?";
+ next;
+ switch(select("No:Yes")) {
+ case 1:
+ mes "[Mike]";
+ mes "Hmm, is that so...";
+ mes "Let keep wearing your Cap that is produce in bundles then.";
+ mes "Hmmmhmmmhmmm....";
+ close;
+ case 2:
+ mes "^3355FFKafokapo Kafokapo";
+ mes "poterpote poterpote";
+ mes "PosongPosong PosongPosong";
+ next;
+ if (countitem(2226) && countitem(7038) > 499) {
+ delitem 2226,1;
+ delitem 7038,500;
+ getitem 5076,1;
+ }
+ mes "[Mike]";
+ mes "Complete! The nicely knitted,";
+ mes "cute white hat! Yeat! Go Go!";
+ mes "Please come again if you need more~";
+ close;
+ }
+ } else {
+ mes "[Mike]";
+ mes "Beanie! Gimme a chocolate!! Right!";
+ mes "No matter who wears it,";
+ mes "you will feel the snowy winter!! Event if you are from Morocc,";
+ mes "you will look more like a traveller from Lutie if you put that on!";
+ next;
+ mes "[Mike]";
+ mes "There was a rumor";
+ mes "people wearing it will pull out his hard and shout Yo without knowing it-";
+ mes "I think we better change a topic...";
+ mes "(Hot weather, the head can't stand the heat?!?)";
+ next;
+ mes "[Mike]";
+ mes "Anyway, the material required for production are";
+ mes "^3355FFCap^000000 x1,";
+ mes "^3355FFYarn^000000 x500.";
+ next;
+ mes "[Mike]";
+ mes "These are what I need.";
+ mes "So don't forget to collect the material, ok?";
+ mes "I will always be around....";
+ mes "So come back only after you have collected them!";
+ close;
+ }
+ }
+}
+//Yuno /=Big Golden Bell, Headgear of Queen and Mistress Crown=/
+yuno_in03.gat,20,18,6 script Neris 726,{
+ mes "[Neris]";
+ mes "This time,";
+ mes "as a gratitude of everyone's support to the Museum,";
+ mes "we have prepared a special item,";
+ mes "That is ...!";
+ next;
+ mes "[Neris]";
+ mes "If an accessoiries for monsters is reconstructed, it can be equipped by human too!";
+ next;
+ mes "[Neris]";
+ mes "We are in the experimenting stage currently,";
+ mes "and there're only 3 type of monster's accesories that can be equipped.";
+ mes "Maybe there're more to come in the future.";
+ mes "However,";
+ mes "we cannot provide these accessories to everyone without limit.";
+ mes "We would like to ask for the materials and production fee,";
+ mes "before we can provide the accessories to you.";
+ next;
+ mes "[Neris]";
+ mes "Please select an accessoiries that you are curious of, or wich us to produce for you.";
+ next;
+ switch(select("Decorative Golden Bell:Crown of Ancient Queen:Crown of Mistress")) {
+ case 1: //Big golden bell [5091]
+ mes "[Neris]";
+ mes "The Decorative Golden Bell is";
+ mes "the accessory equipped by the monster 'Sohee'.";
+ mes "It's very suitable and looks good on female players.";
+ mes "Altough it might be a little big, I'm sure you'll like it.";
+ next;
+ if (countitem(10016) && countitem(714) && countitem(969) > 2 && Zeny > 19999) {
+ delitem 10016,1;
+ delitem 714,1;
+ delitem 969,3;
+ set Zeny,Zeny-20000;
+ mes "[Neris]";
+ mes "So you have brought all the required materials.";
+ mes "Please wait for a while.";
+ next;
+ mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -^000000";
+ getitem 5091,1;
+ next;
+ mes "[Neris]";
+ mes "EEyaah~ The elegant golden bell is complete.";
+ mes "Walk around with it.";
+ mes "Altough it won't make the ding dong sounds,";
+ mes "it sure is beautiful.";
+ next;
+ mes "[Neris]";
+ mes "Don't you feel that you look like a Sohee now?";
+ mes "But don't commit suicide like her.";
+ mes "If you want to make anymore of it,";
+ mes "do come and find me again.";
+ mes "Finally, please come to visit the Monster Museum frequently.";
+ close;
+ } else {
+ mes "[Neris]";
+ mes "The material required for the production of this item are,";
+ mes "^3355FFGolden Bell x1, Emperium x1, Gold x3^000000 and";
+ mes "20,000 zeny";
+ next;
+ mes "[Neris]";
+ mes "As long as you are prepared,";
+ mes "with the materials and zeny required for the production,";
+ mes "I will make it for you anytime.";
+ close;
+ }
+ case 2: //Headgear of Queen [5080] (Crown of ancient queen)
+ mes "[Neris]";
+ mes "The Crown of Ancient Queen is the equipment of";
+ mes "monster 'Isis'.";
+ mes "When you wear it,";
+ mes "you will feel like a queen.";
+ next;
+ if (countitem(10006) && countitem(714) && countitem(969)>2 && Zeny>19999) {
+ delitem 10006,1;
+ delitem 714,1;
+ delitem 969,3;
+ set Zeny,Zeny-20000;
+ mes "[Neris]";
+ mes "So you have brought all the required materials.";
+ mes "Please wait for a while.";
+ next;
+ mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -";
+ getitem 5080,1;
+ next;
+ mes "[Neris]";
+ mes "Here it is! The Crown of Ancient Queen!";
+ mes "Altough you won't become a real queen after wearing it,";
+ mes "you will surely";
+ mes "have a different feeling.";
+ next;
+ mes "[Neris]";
+ mes "After you wear this,";
+ mes "I think you should really have a good figure,";
+ mes "because that will be more meaningful.";
+ mes "If you need to make it again,";
+ mes "do come find me again.";
+ mes "Finally, please come to visit the Monster Museum frequently.";
+ close;
+ } else {
+ mes "[Neris]";
+ mes "The materials required for the production are";
+ mes "^3355FFQueen's Hair Ornament x1, Emperium x1, Gold x3^000000 and";
+ mes "20,000 zeny.";
+ next;
+ mes "[Neris]";
+ mes "As long as you are prepared";
+ mes "with the materials and zeny required for the production";
+ mes "I will make it for you anytime.";
+ close;
+ }
+ case 3: //crown of mistress [5081]
+ mes "[Neris]";
+ mes "Crown of Mistress is";
+ mes "brought by monster 'Mistress'."; //Maya? riiiight!
+ mes "You can feel the precence of Mistress from it.";
+ next;
+ if (countitem(2249) && countitem(714) && countitem(969)>2 && Zeny>39999) {
+ mes "[Neris]";
+ mes "So you have brought everything.";
+ mes "^FF0000However, during the process of production,";
+ mes "no matter how many times";
+ mes "the coronet is refined,";
+ mes "it does not have effect to the product.";
+ next;
+ mes "[Neris]";
+ mes "^FF0000So,";
+ mes "please bring along only the Coronet x 1 that is required for the production.";
+ mes "If anything is missing,";
+ mes "we will not take responsible of it.^000000";
+ mes "So, are you ready?";
+ next;
+ switch(select("Yes, I am.:Hold on, please")) {
+ case 1:
+ mes "[Neris]";
+ mes "Please wait for a while.";
+ next;
+ mes "^3355FF- Dang Dang! Qing Yi Qing Yi! Ding Ding Dang Dang! -";
+ if (countitem(2249) && countitem(714) && countitem(969)>2 && Zeny>39999) {
+ delitem 2249,1;
+ delitem 714,1;
+ delitem 969,3;
+ set Zeny,Zeny-40000;
+ getitem 5081,1;
+ }
+ next;
+ mes "[Neris]";
+ mes "Woohoo!";
+ mes "The beautiful Crown of Mistress is completed.";
+ mes "Altough you won't have any servants,";
+ mes "after you've worn it,";
+ mes "I am sure you're having a different feeling.";
+ next;
+ mes "[Neris]";
+ mes "If you wear this crown,";
+ mes "and takea photo with Mistress,";
+ mes "it will be very interesting.";
+ mes "If you want to make anymore of it,";
+ mes "do come find me again.";
+ mes "Finally, please come to visit the Monster Museum frequently.";
+ close;
+ case 2:
+ mes "[Neris]";
+ mes "Please confirm it first";
+ mes "before you come to me~";
+ close;
+ }
+ } else {
+ mes "[Neris]";
+ mes "The materials required for production are";
+ mes "^3355FFCoronet x1, Emperium x1, Gold x3^000000 together with";
+ mes "40,000 zeny.";
+ next;
+ mes "[Neris]";
+ mes "As long as you are prepaired";
+ mes "with the materials and zeny required for the production,";
+ mes "I will make it for you anytime.";
+ close;
+ }
+ }
+}
+//Aldebaran /=Alarm Mask=/
+//Effects: EF_BLASTMINE: 106
+//EF_FLASHER:99
+alde_alche.gat,88,180,1 script Muscle Man#Alarm 1193,{
+end;
+}
+alde_alche.gat,88,180,1 script Muscle Man#Masked Alarm 748,{
+ mes "[Muscle Man]";
+ mes "Muscle, muscle. I like it. Hehe!!";
+ mes "What a beautiful robotic muscle!";
+ misceffect 99;
+ disablenpc "Muscle Man#Masked Alarm";
+ enablenpc "Muscle Man#Alarm";
+ enablenpc "#Masked Alarm1";
+ enablenpc "#Masked Alarm2";
+ enablenpc "#Masked Alarm3";
+ enablenpc "#Masked Alarm4";
+ donpcevent "#Masked Alarm1::OnBlast";
+ donpcevent "#Masked Alarm2::OnBlast";
+ donpcevent "#Masked Alarm3::OnBlast";
+ donpcevent "#Masked Alarm4::OnBlast";
+ next;
+ disablenpc "Muscle Man#Alarm";
+ enablenpc "Muscle Man#Masked Alarm";
+ if (countitem(2288) && countitem(1095) > 2999) {
+ switch(select("Give him the item:End")) {
+ case 1:
+ mes "You found... You found it. You really found it!";
+ mes "That's great! That's so great!";
+ next;
+ mes "[Muscle Man]";
+ mes "Yes... From today onwards, the Clock Hand and Mr. Scream are mine! My Precious!";
+ next;
+ mes "[Muscle Man]";
+ mes "And this, this shall be your precious.";
+ if (countitem(2288) && countitem(1095) > 2999) {
+ delitem 1095,3000;
+ delitem 2288,1;
+ getitem 5086,1;
+ }
+ next;
+ mes "[Muscle Man]";
+ mes "Good... Good bye! If you find more, remember to bring it here!!";
+ donpcevent "#Masked Alarm1::OnBlast";
+ donpcevent "#Masked Alarm2::OnBlast";
+ donpcevent "#Masked Alarm3::OnBlast";
+ donpcevent "#Masked Alarm4::OnBlast";
+ disablenpc "#Masked Alarm1";
+ disablenpc "#Masked Alarm2";
+ disablenpc "#Masked Alarm3";
+ disablenpc "#Masked Alarm4";
+ close;
+ case 2:
+ mes "[Muscle Man]";
+ mes "Hmm? Do you have anything to say to me?";
+ mes "I smell something. Isn't that the nice smell of the grease from Mr. Alarm that I sense now?";
+ donpcevent "#Masked Alarm1::OnBlast";
+ donpcevent "#Masked Alarm2::OnBlast";
+ donpcevent "#Masked Alarm3::OnBlast";
+ donpcevent "#Masked Alarm4::OnBlast";
+ disablenpc "#Masked Alarm1";
+ disablenpc "#Masked Alarm2";
+ disablenpc "#Masked Alarm3";
+ disablenpc "#Masked Alarm4";
+ close;
+ }
+ } else {
+ mes "[Muscle Man]";
+ mes "This is the item created by 'Loui Meato' that is attached to the arms and legs of Alarm.";
+ mes "This is the ancient technique that can be found in the Clock Tower.";
+ next;
+ mes "[Muscle Man]";
+ mes "If there's any skill to shrink this thing, 'Loui Meato' can be used by everyone soon!";
+ next;
+ mes "[Muscle Man]";
+ mes "Although I've lost my arm and legs in an alchemy accident, but if I can make this technique for public, it will benefit a lot of people!";
+ next;
+ mes "[Muscle Man]";
+ mes "Therfore... I want to ask you";
+ mes "Do you have the will to help my in this research?";
+ next;
+ mes "[Muscle Man]";
+ mes "The material is not enough. I want the Alarm's ^0000FFClock Hand^000000 and that strange ^0000FFMr. Scream^000000 that is said to look like the mask of Alarm.";
+ mes "It will help a lot if you have those things.";
+ next;
+ mes "[Muscle Man]";
+ mes "However, when I saw the Alarm in the Clock Tower, I will be fascinated by the great work on the creature's mechanical parts that is so brilliantly designed and manifactured.";
+ mes "I've forgotten everything, including the materials required for the research.";
+ next;
+ mes "[Muscle Man]";
+ mes "I am telling you this, to give you the opportunity to help me.";
+ mes "So how about that? Do you wish to help me? The price is the Mask of Alarm that looks really good! It's a very important thing, you know?";
+ next;
+ donpcevent "#Masked Alarm1::OnBlast";
+ donpcevent "#Masked Alarm2::OnBlast";
+ donpcevent "#Masked Alarm3::OnBlast";
+ donpcevent "#Masked Alarm4::OnBlast";
+ disablenpc "#Masked Alarm1";
+ disablenpc "#Masked Alarm2";
+ disablenpc "#Masked Alarm3";
+ disablenpc "#Masked Alarm4";
+ switch(select("I will help you:............")) {
+ case 1:
+ case 2:
+ mes "[Muscle Man]";
+ mes "Ohohoh! You agree that Mr. Alarm is beautiful too!";
+ mes "Good, good!";
+ next;
+ mes "[Muscle Man]";
+ mes "What I want is, ^0000FFClock Hand x3000^000000 and";
+ mes "^0000FFMr. Scream x1 ^000000";
+ mes "With these items, I will be able to reasearch the fascinating parts of Mr. Alarm.";
+ next;
+ mes "[Muscle Man]";
+ mes "I have said before. If you're able to find these things, I will give you Mr. Alarm's Mask.";
+ mes "You will have the chance to wear ^0000FFAlarm's Mask^000000!";
+ next;
+ mes "[Muscle Man]";
+ mes "Go! Go and find them now!";
+ mes "Follower of Mr Alarm.";
+ mes "The researcher of 'Loui Meato'.";
+ mes "He who wants to be Mr. Alarm!";
+ close;
+ }
+ }
+OnInit:
+ disablenpc "#Masked Alarm1";
+ disablenpc "#Masked Alarm2";
+ disablenpc "#Masked Alarm3";
+ disablenpc "#Masked Alarm4";
+ disablenpc "Muscle Man#Alarm";
+ end;
+}
+alde_alche.gat,86,184,3 script #Masked Alarm1 1193,{
+end;
+OnBlast:
+misceffect 106;
+end; }
+alde_alche.gat,89,184,3 script #Masked Alarm2 1193,{
+end;
+OnBlast:
+misceffect 106;
+end; }
+alde_alche.gat,92,184,3 script #Masked Alarm3 1193,{
+end;
+OnBlast:
+misceffect 106;
+end; }
+alde_alche.gat,95,184,3 script #Masked Alarm4 1193,{
+end;
+OnBlast:
+misceffect 106;
+end; }
+//Morocc /= Drooping Kitty, Huge Leaf, Lazy Smokie and Blue Fish =/
+morocc.gat,273,79,4 script Traveler 99,{
+ function creation_lines {
+ mes "[Human]";
+ mes "Ah....So do you have all of it?";
+ mes "Haha";
+ mes "What an opportunity for me to show my skill.";
+ mes "Please wait for a moment.";
+ mes "....";
+ next;
+ next;
+ mes "SiwuSiwu...";
+ next;
+ mes "SiwuSiwu...";
+ mes "DudaTeda...";
+ next;
+ mes "SiwuSiwu...";
+ mes "DudaTeda...";
+ mes "ChepoChepo....";
+ next;
+ mes "SiwuSiwu...";
+ mes "DudaTeda...";
+ mes "ChepoChepo....";
+ mes "HuizheHuizhe.....";
+ mes "I think I heard some strange noises.";
+ next;
+ mes "[Human]";
+ mes "Uhoh, can you wait for a while?";
+ mes "It's almost done.";
+ mes "............";
+ next;
+ mes "HeniHeniHeni...";
+ mes "............";
+ next;
+ mes "HeniHeniHeni...";
+ mes "KodeKode...";
+ mes "............";
+ next;
+ mes "[Human]";
+ mes "Ah, finally it is done.";
+ mes "I have not done this too long.";
+ mes "So it takes a little longer then I expect.";
+ mes "Haha";
+ next;
+ mes "[Human]";
+ mes "Now, here it is.";
+ mes "I rarely feel this happy.";
+ mes "Ah, I will take the claw too.";
+ mes "Just think of it as ... some process fee.";
+ mes "Haha....";
+ return;
+ }
+
+ if(countitem(7030)) {
+ mes "[Human]";
+ mes "Ah....";
+ mes "Claw of the Desert Wolf...";
+ mes "You have this...";
+ mes "This is the true symbol of Desert.";
+ mes "Haha...";
+ mes "It's been a while since I saw this last time.";
+ mes "It really makes me feel reenergized!";
+ next;
+ mes "[Human]";
+ mes "Haha... You have let me see a great thing.";
+ mes "And I am going to pay you back!";
+ mes "I have traveled to a lot of places,";
+ mes "and learn to create a lot of things.";
+ mes "May I know what do you wnat?";
+ next;
+ mes "[Human]";
+ mes "Oh yes..."; //here we go again =3
+ mes "If your equipment has been refined";
+ mes "or slotted with cards,";
+ mes "^FF0000the level of refines and cards will dissapear too.^000000";
+ mes "So please confirm the item you require.";
+ next;
+ switch(select("Drooping Cat:Smokie Leaf:Lazy Smokie:Blue Fish:There's nothing that I like.")) {
+ case 1:
+ if (countitem(2233) && countitem(983) && countitem(7206) > 299 && countitem(7030)) {
+ delitem 2233,1;
+ delitem 983,1;
+ delitem 7206,300;
+ delitem 7030,1;
+ creation_lines;
+ getitem 5058,1;
+ close;
+ } else {
+ mes "[Human]";
+ mes "Ah, you want the Drooping Cat.";
+ mes "Well,";
+ mes "I can make that for you,";
+ mes "but you will have to gather the required materials by yourself.";
+ mes "I heard that it is not easy to find the materials.";
+ next;
+ mes "[Human]";
+ mes "They are..";
+ mes "^FF0000One slot circlet^000000 and";
+ mes "^FF0000Black Dyestuff x1^000000";
+ mes "plus ^FF0000Black Cat Doll x 300^000000.";
+ mes "This is all you need.";
+ mes "If you bring them to me, I will make the Cat for you.";
+ close;
+ }
+ case 2: //Smokie Leaf [5064]
+ if (countitem(945) > 599 && countitem(7030)) {
+ delitem 945,600;
+ delitem 7030,1;
+ creation_lines;
+ getitem 5064,1;
+ close;
+ } else {
+ mes "[Human]";
+ mes "Ah, so you want the Smokie Leaf.";
+ mes "Well,";
+ mes "I can make that for you,";
+ mes "but you will have to";
+ mes "gather the required materials by yourself.";
+ mes "I heard that it is not easy to find the materials.";
+ next;
+ mes "[Human]";
+ mes "This item ..";
+ mes "requires ^FF0000Raccoon Leaf x600^000000 ";
+ mes "It might be a lot, but I'm sure you can get it, can't you?";
+ mes "If you bring it to me, I will make the headgear for you.";
+ close;
+ }
+ case 3: //Lazy Smokie [5084]
+ if (countitem(1026)>999 && countitem(7065)>99 && countitem(945)>9 && countitem(7030)) {
+ delitem 1026,1000;
+ delitem 7065,100;
+ delitem 945,10;
+ delitem 7030,1;
+ creation_lines;
+ getitem 5084,1;
+ close;
+ } else {
+ mes "[Human]";
+ mes "Ah, so you want the Lazy Smokie.";
+ mes "Well,";
+ mes "I can make that for you,";
+ mes "but you will have to";
+ mes "gather the required materials by yourself.";
+ mes "I heard that it is not easy to find the materials.";
+ next;
+ mes "[Human]";
+ mes "The materials are..";
+ mes "^FF0000Acorn x1000^000000 and";
+ mes "^FF0000Sea-Otter Fur x100^000000, as well as ^FF0000Raccoon Leaf x10^000000";
+ mes "That's all you need.";
+ mes "If you bring it to me, I will make the headgear for you.";
+ close;
+ }
+ case 4: //Blue Fish [5065]
+ if (countitem(624) && countitem(959)>299 && countitem(544)>49 && countitem(1023) && countitem(938)>99 && countitem(7030)) {
+ delitem 624,1;
+ delitem 959,300;
+ delitem 544,50;
+ delitem 1023,1;
+ delitem 938,100;
+ delitem 7030,1;
+ creation_lines;
+ getitem 5065,1;
+ } else {
+ mes "[Human]";
+ mes "Ah, so you want the Fish.";
+ mes "Well,";
+ mes "I can make that for you,";
+ mes "but you will have to gather the required materials by yourself.";
+ mes "I heard that it is not easy to find the materials.";
+ next;
+ mes "[Human]";
+ mes "The materials are..";
+ mes "^FF0000Rotten Fish x1";
+ mes "Stinky Scale x300, Raw Fish x50,";
+ mes "Fish Tail x1^000000 and lastly, it requires at least ^FF0000Sticky Mucus x100^000000";
+ mes "That's all you need.";
+ mes "If you bring it to me, I will make the headgear for you.";
+ close;
+ }
+ case 5: //cancel
+ mes "[Human]";
+ mes "Oh.. is that so?";
+ mes "Haha...";
+ mes "I thought I have the chance to do it again.";
+ mes "Oh well,";
+ mes "enjoy your journey then.";
+ close;
+ }
+ } else {
+ mes "[Human]";
+ mes "Hello there.";
+ mes "a good day isn't it?";
+ mes "Hmm... If you don't mind,";
+ mes "can I tell you a little about myself?";
+ mes "I know you're kind of unwilling to do so,";
+ mes "but please, do listen for a while, will you?";
+ next;
+ mes "[Human]";
+ mes "Hmm...";
+ mes "The city of desert, Morocc";
+ mes "has this special attraction.";
+ mes "The wind of flame blows during the heat of the day,";
+ mes "but the sunsets dye the hills of sand into a violet screne.";
+ mes "Besides that, the freezing chill of night never stops until morning.";
+ next;
+ mes "[Human]";
+ mes "All these are the pride of Morocc.";
+ mes "However,";
+ mes "These are not enough to feed the greed of human.";
+ mes "Thay want to take everything";
+ mes "except the desert";
+ mes "as their belongings.";
+ next;
+ mes "[Human]";
+ mes "So, I started to travel,";
+ mes "going around this world to experience the adventure.";
+ mes "Some view that can only be found in certain places,";
+ mes "at their origin habitat.";
+ next;
+ mes "[Human]";
+ mes "Therefore,";
+ mes "I have decided to create items,";
+ mes "that possesses the special characteristecs of the places.";
+ mes "I have gained a few successes,";
+ mes "but the materials required are too hard to be found.";
+ mes "Therefore, I can't produce too many items.";
+ next;
+ mes "[Human]";
+ mes "Oh! Uh Oh...";
+ mes "I have spoken too much.";
+ mes "Sorry for taking your time.";
+ mes "There's nothing to do recently...";
+ mes "I just hope to see";
+ mes "some item that is related to the desert....";
+ next;
+ mes "[Human]";
+ mes "Hmmph...Anyway,";
+ mes "thank you for listening to me.";
+ mes "Enjoy your journey...";
+ mes "Think of the desert, you think of wolves... hahaha.";
+ close;
+ }
+}
+//Payon /=Fox Mask=/ //==Lets hope this works as it's supposed==//
+pay_dun03.gat,48,84,4 script Nine Tail#1 1180,1,1{
+ mes "[Nine Tail]";
+ mes "Kee! KeeKee!";
+ mes "KeeKeeKee! KeeKee! KeeKee!";
+ next;
+ switch(select("Shaking your head:Nodding")) {
+ case 1:
+ mes "[Nine Tail]";
+ mes "KeeKee! Ke! Kee!";
+ close2;
+ donpcevent "Nine Tail#1::OnReset";
+ end;
+ case 2:
+ emotion e_hmm;
+ close2;
+ disablenpc "Nine Tail#1";
+ enablenpc "Nine Tail#2";
+ end;
+ }
+
+OnInit:
+ disablenpc "Nine Tail#1";
+ disablenpc "Nine Tail#2";
+ monster "pay_dun03.gat",48,84,"Nine Tail",1180,1,"NT::OnMobDead";
+ end;
+
+OnReset:
+ killmonster "pay_dun03.gat","NT::OnMobDead";
+ disablenpc "Nine Tail#1";
+ disablenpc "Nine Tail#2";
+ initnpctimer;
+ end;
+
+OnTimer300000:
+OnSpawn:
+ stopnpctimer;
+ killmonster "pay_dun03.gat","Nine Tail#1::OnMobDead";
+ monster "pay_dun03.gat",48,84,"Nine Tail",1180,1,"NT::OnMobDead";
+ end;
+}
+pay_dun03.gat,48,84,1 script NT -1,{
+OnMobDead:
+ enablenpc "Nine Tail#1";
+ end;
+}
+pay_dun03.gat,48,84,4 script Nine Tail#2 1180,{
+ if(countitem(1022)>998) {
+ mes "[Nine Tail]";
+ mes "Uh Oh!! You've brought it, human.";
+ mes "Good...I think you can save yourself with these.";
+ next;
+ switch(select("Give it to him:Do not give it to him")) {
+ case 1:
+ mes "[Nine Tail]";
+ mes "Go now. You have got what you wanted, human. Now leave!";
+ if(countitem(1022)>998) {
+ delitem 1022,999;
+ getitem 5069,1;
+ }
+ close2;
+ disablenpc "Nine Tail#2";
+ donpcevent "Nine Tail#1::OnReset";
+ end;
+ case 2:
+ close2;
+ disablenpc "Nine Tail#2";
+ donpcevent "Nine Tail#1::OnReset";
+ end;
+ }
+ }
+ else {
+ mes "[Nine Tail]";
+ mes "......Aiyo? Isn't this the appearance of a human boy?";
+ mes "Has my transfiguration skill gone wrong again... oh... oh well.";
+ next;
+ mes "[Nine Tail]";
+ mes "Do you know how it feels to be chased everyday? How tough that is? Huh?";
+ mes "I just want to live a quiet life with my husband!";
+ next;
+ mes "[Nine Tail]";
+ mes "But one day, someone intruded into our habitat and tried to catch us.";
+ next;
+ mes "[Nine Tail]";
+ mes "Do you know how much that Sohee that lives besides me likes to complain to me everyday? Someone will pull a disgusting face and say 'Haha, Miss Sohee~' and they will chase to rip off her clothes. They are making her crazy!";
+ next;
+ mes "[Nine Tail]";
+ mes "It is just a flawless body as fine as pine, and as beautiful as the flower. Why can't anyone understand that?";
+ next;
+ mes "[Nine Tail]";
+ mes "Hmmm...let me calm down first.";
+ mes "I just want to save my husband and bring him back.";
+ mes "I hope you can help me.";
+ next;
+ mes "[Nine Tail]";
+ mes "To save my husband,";
+ mes "please bring along ^FF0000999 ^0000FFNine Tails^000000!";
+ mes "What? You said that's too much?";
+ next;
+ mes "[Nine Tail]";
+ mes "Hmmph, it really makes me angry to think of what you've done to us...";
+ mes "I understand. You human won't do anything without a reward...";
+ next;
+ mes "[Nine Tail]";
+ mes "Hmm, ok. What do you think of the mask I'm wearing? The ^0000FFKitsune Mask^000000. Gather the item I want, and I will give you this.";
+ mes "You must gather ^FF0000999 ^0000FFNine Tails^000000!";
+ close2;
+ disablenpc "Nine Tail#2";
+ donpcevent "Nine Tail#1::OnReset";
+ end;
+ }
+}
+//Orc Village /=Orc Hero Helm=/
+in_orcs01.gat,31,93,1 script Orc Warrior#1 1023,2,2{
+ if (orcs_hero_hat == 1) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "Good, you have collected it all, haven't you?";
+ mes "So you really want to have a talk, hahahahaha!!";
+ mes "Ok, I will talk to you then";
+ next;
+ mes "[Orc Warrior]";
+ mes "I don't like humans.";
+ mes "All of the Orcish Tribe dislike humans.";
+ mes "Do you know that?";
+ mes "I really hate it when you come to find us.";
+ set orcs_hero_hat,2;
+ next;
+ mes "[Orc Warrior]";
+ mes "So if you want to hear more. Prepare another ^FF0000Jellopy x1000^000000";
+ mes "This means, get out of my sight...!";
+ mes "Humans...";
+ close;
+ }
+ } else if (orcs_hero_hat == 2) {
+ if (countitem(909) > 999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "Good, you have collected it all, haven't you?";
+ mes "So you really want to have a talk, hahahahahaha!!";
+ mes "Ok, I will talk to you then";
+ next;
+ mes "[Orc Warrior]";
+ mes "Do you want to know why we hate humans?";
+ mes "That's because,";
+ mes "out village is living a quiet life,";
+ mes "before the rude intrusion of you human.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Can you just build your city";
+ mes "and live there quietly?";
+ mes "Why do you create chaos everywhere...";
+ mes "I can't understand";
+ set orcs_hero_hat,3;
+ next;
+ mes "[Orc Warrior]";
+ mes "Go, if you want another conversation, prepare ^FF0000Jellopy x1000^000000 again,";
+ mes "If you're statisfied with such kind of converstaion.";
+ mes "Hahahahaha";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000...";
+ mes "If you want to talk to me,";
+ mes "show your will, humans.";
+ mes "I don't care, just brought 1000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 3) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "Good, you have collect it all, haven't you? ";
+ mes "So you really want to have a talk, hahahahaha!!";
+ mes "Ok, I will talk to you until you're fed up then.";
+ next;
+ mes "[Orc Warrior]";
+ mes "If you compare the achievement, ";
+ mes "we won't lose to you humans.";
+ mes "The same goes to the Goblin in the jungle,";
+ mes "and the Kobold, who are the master of the grassland...";
+ next;
+ mes "[Orc Warrior]";
+ mes "Before you human build cities, ";
+ mes "we orc warriors has developed sophisticated tunnel in caves,";
+ mes "as well as water way.";
+ mes "We use the things we found in the wild,";
+ mes "to create the things we wanted.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Then we build high tower.";
+ mes "However, the evil forces ";
+ mes "have made the master of the tower betray our tribe...";
+ mes " And those who fail to escape there,";
+ mes "they're still suffering,";
+ mes "at that place.";
+ next;
+ mes "[Orc Warrior]";
+ mes "...Hmm, this,";
+ mes "Why do I tell this to you humans?";
+ mes "The conversation ends here today.";
+ set orcs_hero_hat,4;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000...";
+ mes "If you want to talk to me";
+ mes "Show your will, human.";
+ mes "I don't care, just brought 2000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 4) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "Good, you have collect it all, haven't you? ";
+ mes "So you really want to have a talk, hahahahaha!!";
+ mes "Ok, I will talk to you until you're fed up then.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Yes, until that time,";
+ mes "human and the orc warriors";
+ mes "do lead a peaceful life.";
+ mes "But as time goes by, the misunderstanding,";
+ mes "has accumulated and cannot be broken.";
+ next;
+ mes "[Orc Warrior]";
+ mes "The powerless human only wants fame and wealth.";
+ mes "A true warrior,";
+ mes "will only emphasize on glory and honor...";
+ mes "Those who do not care what method they use to achieve their goal,";
+ mes "will be lead to the path of perdition easily.";
+ next;
+ mes "[Orc Warrior]";
+ mes "They only care about their safety,";
+ mes "and ignore about others.";
+ mes "They will not let anthing that";
+ mes "pose a threat to them to live... ";
+ mes "No matter it's other tribe,";
+ mes "or unknown creature, they will kill";
+ mes "even their closest companion if they had to.";
+ next;
+ mes "[Orc Warrior]";
+ mes "...I have talked too much, and there's nothing more to talk about.";
+ mes "The conversation ends here.";
+ set orcs_hero_hat,5;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 3000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 5) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "You reall have the patience to collect these things.";
+ mes "You really want to talk to me, don't you?... ";
+ mes "If that's so, I will talk about other things.";
+ next;
+ mes "[Orc Warrior]";
+ mes "The Orc Warriors think that the best things are";
+ mes "battle and victory.";
+ mes "It is the greatest honor,";
+ mes "to fight and beat the enemies face to face.";
+ next;
+ mes "[Orc Warrior]";
+ mes "The spirit to win will not stop even for death.";
+ mes "However, some tribesmate that die of trickery,";
+ mes "will get up from the grave,";
+ mes "wandering to look for a target to fight.";
+ next;
+ mes "[Orc Warrior]";
+ mes "During the battle,";
+ mes "we are different from you.";
+ mes "We don't use tricks, and we don't run away!";
+ mes "We will fight till then end, till we are out of energy.";
+ mes "Even when we're lost in the end, we will still make our last attempt to counter.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Besides that, we don't rely of potions.";
+ mes "You human are too weak.";
+ mes "That's why you use potions and herbs.";
+ mes "Without potion, you will quit immediately, don't you?";
+ mes "Hmm, I'm not sure whether you are like that too.";
+ set orcs_hero_hat,6;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 4000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 6) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "You reall have the patience to collect these things.";
+ mes "You really want to talk to me, don't you?... ";
+ mes "If that's so, I will talk about other things.";
+ next;
+ mes "[Orc Warrior]";
+ mes "The warriors of the tribe,";
+ mes "are selected among the strongest.";
+ mes "When they grow up, we'll send them into the jungle,";
+ mes "to test their qualification to be a real warrior.";
+ next;
+ mes "[Orc Warrior]";
+ mes "We will recognize";
+ mes "the tribesman who come back alive as a warrior.";
+ mes "These strong warriors are known as Orc Warriors.";
+ mes "For the females that has fighting ability,";
+ mes "they are known as Orc Lady.";
+ next;
+ mes "[Orc Warrior]";
+ mes "And for those with a dexterous hand and";
+ mes "possess good eyesight,";
+ mes "we'll give them bow and arrow,";
+ mes "and called them Orc Archer.";
+ mes "They will learn and grow in the countless battles.";
+ next;
+ mes "[Orc Warrior]";
+ mes "And there is another trial of fire.";
+ mes "Those who pass the trial,";
+ mes "will be protected by fire";
+ mes "and gain greater ability and endurance.";
+ mes "We called this warriors as High Orc.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Hmm, when human looks at us,";
+ mes "you'll think that we look alike... ";
+ mes "But for use Orc, we can distinguish it easily.";
+ mes "So, when you look at me, ";
+ mes "you will feel that I look like";
+ mes "no different that the orc warrior outside, isn't it?";
+ set orcs_hero_hat,7;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 5000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 7) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "I can feel you are getting tired and want to quit now.";
+ mes "But you have keep the promise this time.";
+ mes "So a promise is a promise, I shall continue to talk to you.";
+ next;
+ mes "[Orc Warrior]";
+ mes "We are talking about the Orc Warrior last time...";
+ mes "Yes, in the orcish fighters,";
+ mes "there are dexterous one with abilities,";
+ mes "that has not pass the trial of fire.";
+ mes "They are the warriors that can take care of";
+ mes "other orc warriors....";
+ next;
+ mes "[Orc Warrior]";
+ mes "Such kind of warriors are the true hero.";
+ mes "We call them Orc Heroes.";
+ mes "They had strength and stamin greater than other orcs.";
+ mes "They possess ability to lead too.";
+ mes "This is the true hero of Orc Warriors.";
+ next;
+ mes "[Orc Warrior]";
+ mes "They get the Voucher of Orcish Hero,";
+ mes "and is able to wield the sword only a hero can use.";
+ mes "When the Orc Hero wields the sword,";
+ mes "the earth shakes...";
+ next;
+ mes "[Orc Warrior]";
+ mes "Orc Hero has his own special headgear too.";
+ mes "It is a symbol of";
+ mes "the fame and strength of an Orc Hero... Just like you humans.";
+ mes "If you want to see it, you can only feel its power in the battle.";
+ set orcs_hero_hat,8;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 6000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 8) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "I can feel you are getting tired and want to quit now.";
+ mes "But you have keep the promise this time.";
+ mes "So a promise is a promise, I shall continue to talk to you.";
+ next;
+ mes "[Orc Warrior]";
+ mes "We talk about the Orc Hero just now.";
+ mes "Some orc does not born with an ability,";
+ mes "like the Orc Heroes do.";
+ mes "It took them a long time to go through numerous battle to be a warrior.";
+ next;
+ mes "[Orc Warrior]";
+ mes "To a Orc Warrior,";
+ mes "age does not means coward.";
+ mes "In fact is represents experience and skills,";
+ mes "that makes him more valiant.";
+ next;
+ mes "[Orc Warrior]";
+ mes "They can perform great battle skill,";
+ mes "even without weapons.";
+ mes "They can fight for days even without their axe.";
+ mes "If they reach that state,";
+ mes "weapon are just useless burdens...";
+ next;
+ mes "[Orc Warrior]";
+ mes "Among such experience elders,";
+ mes "we called the most experienced one as ";
+ mes "Orc Lord. And we honor them,";
+ mes "They wear a 3 horn iron helm";
+ mes "that represents the leadership of Orcish tribe.";
+ set orcs_hero_hat,9;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 7000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 9) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "I've never seen,";
+ mes "a human that won't quit like you... So I'll keep my promise";
+ mes "to tell you about our tribe today.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Sometimes, there will be those treacherous ones";
+ mes "who run away from the battle.";
+ mes "We have such kind in out tribe too.";
+ mes "Although it is a disgrace, they are Orcs too.";
+ mes "They only differ in their level of existance.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Such kind will be cursed.";
+ mes "Their body shrinks and the teeth grows.";
+ mes "And finally, they lose the heart to fight.";
+ mes "Since they don't want to be found by others, ";
+ mes "they hide themselves.";
+ next;
+ mes "[Orc Warrior]";
+ mes "They are originally us.";
+ mes "But their alteration rise suspicions.";
+ mes "Such kind with greed,";
+ mes "and hatred to us are called...";
+ mes "Zenorc.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Unlike us,";
+ mes "human do not change even their hearts have changed.";
+ mes "Therefore, we need to be more careful.";
+ mes "Because we can tell from the appearances,";
+ mes "how treacherous humans are....";
+ set orcs_hero_hat,10;
+ next;
+ mes "[Orc Warrior]";
+ mes "So, if you want to hear more,";
+ mes "prepare ^FF0000Jellopy x 1000 again^000000";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 8000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 10) {
+ if (countitem(909)>999) {
+ delitem 909,1000;
+ mes "[Orc Warrior]";
+ mes "Really? Have you really gathered 10,000 Jellopy?";
+ mes "Good, that's enough now.";
+ mes "You've shown your sincerity.";
+ mes "I will treat you honestly.";
+ next;
+ mes "[Orc Warrior]";
+ mes "It is enough for";
+ mes "the stories about our tribe.";
+ mes "However, there are difference,";
+ mes "from what you've heard and what you'll experience.";
+ next;
+ mes "[Orc Warrior]";
+ mes "I advise that you gather more experience";
+ mes "through the battle with us to understand our tribe.";
+ mes "The most direct way,";
+ mes "is through combat.";
+ set orcs_hero_hat,11;
+ next;
+ mes "[Orc Warrior]";
+ mes "I shall stop here.";
+ mes "As the token of appreciation to your sincerity,";
+ mes "this is the axe that has accompanied me in my pass battles.";
+ mes "Take good care of it, thank you.";
+ getitem 1304,1;
+ next;
+ mes "[Orc Warrior]";
+ mes "It must be hard for you after all these time.";
+ mes "If you want to understand more about Orcs,";
+ mes "come and find me again.";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Haven't I mentioned? Find ^FF0000Jellopy x1000^000000... ";
+ mes "If you want to talk to me,";
+ mes "show you will, humans.";
+ mes "I don't care, just brought 9000 Jellopy.";
+ close;
+ }
+ } else if (orcs_hero_hat == 11 || orcs_hero_hat == 12) {
+ if (countitem(1304)) {
+ mes "[Orc Warrior]";
+ mes "If must be hard for you after all these time.";
+ mes "If you want to understand more about Orcs,";
+ mes "come and find me again.";
+ close;
+ } else {
+ set orc_hero_quest,rand(1,10);
+ if (orc_hero_quest > 9) {
+ if (orcs_hero_hat == 12 && countitem(931)>99) {
+ mes "[Orc Warrior]";
+ mes "Uhoh, that is really great.";
+ mes "After all these battles, I am not sure how much you understand.";
+ mes "However, the voucher of Orc warrior";
+ mes "is given to a true Orc Warrior.";
+ next;
+ mes "[Orc Warrior]";
+ mes "We use 1000 thousand victories";
+ mes "as a qualification to recognize one asa true Orc Warrior.";
+ mes "However, you are a human...";
+ mes "It is hard to cross the line between two different kinds.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Ok, come again after you've won 10 thousand victories.";
+ mes "By that time, we will recognized you as the true warrior.";
+ mes "However,";
+ mes "you will have to walk a lonely path for such fame.";
+ mes "The choise is up to you...";
+ next;
+ mes "[Orc Warrior]";
+ mes "All you get is just fame...";
+ mes "But for a human,";
+ mes "you get a chance to proof and test your capability...";
+ mes "So what do you want to choose?";
+ next;
+ switch(select("I think I don't need it.:I want to take the 10,000 challenge.")) {
+ case 1:
+ mes "[Orc Warrior]";
+ mes "Alright, I won't force you to choose.";
+ mes "Now, please return";
+ mes "to your human city slowly.";
+ mes "Your friends are waiting for you.";
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "You have chosen a hard path";
+ mes "A path of eternal battles is waiting ahead of you.";
+ mes "You will have to face";
+ mes "thousands,if not ten thousands of warriors.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Then, before you reach your 10,000th victories,";
+ mes "Bring me the voucher of orc warrior.";
+ mes "Once, ten times, or even hundreds";
+ mes "please leave your record of victories.";
+ if (countitem(931)>99) {
+ delitem 931,100;
+ set orcs_hero_hat,13;
+ set orcs_hero_hat2,100;
+ }
+ next;
+ mes "[Orc Warrior]";
+ mes "If I take the voucher of Orc Warrior,";
+ mes "I will record it a 100 victories.";
+ mes "Please make sure you defeat 10,000 orc warrior...";
+ mes "Please continue your battle, don't stop.";
+ close;
+ }
+ }
+ mes "[Orc Warrior]";
+ mes "The best way to understand Orcs,";
+ mes "is through battle.";
+ mes "Thrugh collisions of strength and skills,";
+ mes "improve your understanding between each other.";
+ next;
+ mes "[Orc Warrior]";
+ mes "So, go out there and fight.";
+ mes "conversation with my is just an acceptance of concepts.";
+ mes "One day,";
+ mes "You shall be recognized as a true warrior.";
+ set orcs_hero_hat,12;
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "I feel that you are not statisfied?";
+ mes "Do you have any doubts about us?";
+ mes "You are a human.";
+ mes "Your concern to other tribers,";
+ mes "will not benefit you.";
+ close;
+ }
+ }
+ } else if (orcs_hero_hat == 13) {
+ if (countitem(931)) {
+ mes "[Orc Warrior]";
+ mes "Stay alive before you grab the victory...";
+ mes "Rest here for a while before you leave.";
+ mes "Until now, you have achieved "+orcs_hero_hat2+" times of victories.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Do you want to add the record of your current victory";
+ mes "into this record? You have won "+countitem(931)+" times this time.";
+ next;
+ switch(select("Add the record:Add it later")) {
+ case 1:
+ set orcs_hero_hat2,orcs_hero_hat2+countitem(931);
+ delitem 931,countitem(931);
+ if (orcs_hero_hat2>9999) {
+ mes "[Orc Warrior]";
+ mes "And this, achieving more than 10,000 victories";
+ mes "is an extraordinary achievement to human...";
+ mes "You have completed an unusual task.";
+ mes "Through the current battle,";
+ mes "You must have learned a lot about the Orcish Tribe.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Although you're a human, you have walked the path of a true warrior....";
+ mes "We have recognized you.";
+ mes "You are a true warrior!!";
+ mes "You are... Orc Lady!!";
+ getitem 2299,1;
+ set orcs_hero_hat,14;
+ next;
+ mes "[Orc Warrior]";
+ mes "This is your present.";
+ mes "I wonder if it fits your head.";
+ mes "Wear it well.";
+ mes "If you do not want to wear it, take it along with you.";
+ getitem 931,1;
+ next;
+ mes "[Orc Warrior]";
+ mes "And, you have been recognized as a warrior...";
+ mes "This voucher is for you.";
+ mes "Although it has no difference compared to others,";
+ mes "keep it well.";
+ mes "You will only be recognized as a Orc Warrior,";
+ mes "with this voucher.";
+ next;
+ mes "[Orc Warrior]";
+ mes "So, you may go back now...";
+ mes "If you ever think of us,";
+ mes "come and look for us.";
+ mes "A true self of a person can only be shown through endless battles.";
+ mes "Return to the land now.";
+ close;
+ }
+ mes "[Orc Warrior]";
+ mes "You have worked hard.";
+ mes "I hope your futue better will shine with the light of victories.";
+ mes "If you ever lost,";
+ mes "I hope to see you stand up again.";
+ next;
+ mes "[Orc Warrior]";
+ mes "There are "+(10000-orcs_hero_hat2)+" of battles left.";
+ mes "Although it is a though road ahead,";
+ mes "I hope that you will pull yourself together and achieve the final victory.";
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "Hmm, as you like it.";
+ mes "I will be dissapointed again,";
+ mes "If you give up in the middle.";
+ close;
+ }
+ } else {
+ mes "[Orc Warrior]";
+ mes "Rest here for a while before you leave.";
+ mes "Until now, you have achieved "+orcs_hero_hat2+" times of victories.";
+ close;
+ }
+ } else if(orcs_hero_hat == 14) {
+ if (countitem(1304)) {
+ mes "[Orc Warrior]";
+ mes "Hmm? Don't tell me that you assume that";
+ mes "you won't be able to get back to the human villages";
+ mes "if you are recognized as a Orc Warrior. Hahahaha!";
+ mes "You better leave then.";
+ close;
+ } else {
+ set @orc_hero_quest,rand(1,10);
+ if (@orc_hero_quest > 9) {
+ mes "[Orc Warrior]";
+ mes "That? Is that thirst...?";
+ mes "Although you're recognized as a warrior,";
+ mes "that eyes of yours show you seek more powerful enemies...";
+ mes "Maybe you are not statisfied with the current situation.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Alright, do you want to take another trial?";
+ mes "Maybe all you accumulated belongings";
+ mes "shall become but a dream...";
+ mes "This path,";
+ mes "is a process feared,";
+ mes "by even the most skullful warrior.";
+ next;
+ mes "[Orc Warrior]";
+ mes "a recognized Orc Warrior, maybe you can defeat them...";
+ mes "What is your choise?";
+ next;
+ switch(select("I am statisfied with the current condition:...I will challenge the trial")){
+ case 1:
+ mes "[Orc Warrior]";
+ mes "Yes, it is useful";
+ mes "if you are statisfied with yourself sometimes.";
+ mes "It takes greater courage,";
+ mes "to admit that you can't overcome a greater obstacle.";
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "Good, I praise your honorable spirit.";
+ mes "This is an opportunity";
+ mes "for a warrior who've won 10,000 victories.";
+ mes "You will face";
+ mes "the greatest warrior of the Orcish tribe...!";
+ next;
+ mes "[Orc Warrior]";
+ mes "Fight the best warrior of the Orc Warrior.";
+ mes "Obtain 100 victories from the Orc Heroes,";
+ mes "and bring me the voucher.";
+ mes "Although you're a great warrior, this is a ardous task";
+ mes "espectially when you have to face it alone....!";
+ next;
+ mes "[Orc Warrior]";
+ mes "Come, go now! Since you can beat 10,000 Orc warrior,";
+ mes "there's some possibilities that";
+ mes "you can take down 100 Orc Heroes!";
+ mes "If that's so, we will recognize you as";
+ mes "the Orc Hero...!";
+ set orcs_hero_hat,15;
+ close;
+ }
+ } else {
+ mes "[Orc Warrior]";
+ mes "Oh warrior, continue to shine in the victories of your battles.";
+ mes "Stand up again even if you've lost.";
+ mes "Show your unshaken spirit.";
+ mes "You are the human that is reconized as an Orc Warrior!";
+ close;
+ }
+ }
+ } else if(orcs_hero_hat == 15) {
+ if (countitem(968)>99) {
+ mes "[Orc Warrior]";
+ mes "Finally... You have achive the goal.";
+ mes "Those who've lost to you have admitted that";
+ mes "you have shown yourself as a Hero";
+ mes "by crossing the barrier of kinds as a human...";
+ mes "I, on behalf of our tribe,";
+ mes "pay our greatest respect to you.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Now I ask you to make you final selection,";
+ mes "what will you do with the vouchers you've taken?";
+ mes "It means nothing to humands,";
+ mes "but to the orcs,";
+ mes "Heroic Emblem is a belonging";
+ mes "of a true hero.";
+ next;
+ mes "[Orc Warrior]";
+ mes "You've obtained this through you hardship.";
+ mes "You can take it with you,";
+ mes "or give them back to the Orc Heroes.";
+ mes "The meaning of giving them back the voucher,";
+ mes "is to battle them again...";
+ next;
+ mes "[Orc Warrion]";
+ mes "So, heroic emblem,";
+ mes "what will you do with it?";
+ next;
+ switch(select("I will take it back as token of victories:I'll give them back to Orc Heroes")) {
+ case 1:
+ mes "[Ork Warrior]";
+ mes "Well, that is a good choise.";
+ mes "Nobody can change your right to make that decision.";
+ mes "Please take good care of";
+ mes "these tokens of victory.";
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "This is the true spirit of a warrior...!";
+ mes "Respecting your oppenent even after you've won,";
+ mes "such deeds";
+ mes "should be learned by we Orcs...!";
+ if (countitem(968)<100) close;
+ delitem 968,100;
+ set orcs_hero_hat,16;
+ next;
+ mes "[Orc Warrior]";
+ mes "The one who have defeated 100 Orc Hero...";
+ mes "Altough you're a human";
+ mes "we know you as the best warrior of the Orcs.";
+ mes "You are now... Orc hero!";
+ getitem 1124,1;
+ next;
+ mes "[Orc Warrior]";
+ mes "This is the sword given only to the Heroes.";
+ mes "Iam not sure wether you can use it.";
+ mes "But as a Orc Hero,";
+ mes "you should have it.";
+ getitem 968,1;
+ next;
+ mes "[Orc Warrior]";
+ mes "And since you're a Orc Hero now...";
+ mes "This is the Heroic Emblem for you.";
+ mes "Although it has no difference compared to others,";
+ mes "keep it well.";
+ mes "You will only be recognized as a Orc Hero,";
+ mes "with this voucher.";
+ next;
+ mes "[Orc Warrior]";
+ mes "So, you can leave now...";
+ mes "A person from human tribe that can understand us,";
+ mes "is the one who crosses the boundaries of tribe.";
+ mes "Show the tough spirit of you,";
+ mes "and set for you new destiny....";
+ close;
+ }
+ } else {
+ mes "[Orc Warrior]";
+ mes "Tired...? Orc Hero is";
+ mes "the best warrior among our warriors.";
+ mes "They are known for their capability.";
+ mes "It might be to hard for";
+ mes "a human to pick on them.";
+ next;
+ mes "[Orc Warrior]";
+ mes "However, this trial is the patch you've chosen.";
+ mes "Maybe you want to know you true limit,";
+ mes "so you keep your promise to walk this path...!";
+ mes "Don't rush for the answer,";
+ mes "it might lies beneath the records of your countless battles.";
+ close;
+ }
+ } else if (orcs_hero_hat > 15) {
+ if (countitem(968)) {
+ mes "[Orc Warrior]";
+ mes "Warrior of the Orc Warrior, the greatest Hero";
+ mes "You are... Orc Hero!!";
+ mes "May the valiant warrior be blessed with light!!";
+ close;
+ } else {
+ mes "[Orc Warrior]";
+ mes "Oh Hero, where have you put your voucher...?";
+ mes "Without the Heroic Emblem,";
+ mes "you shall not be knows as a Orc Hero.";
+ mes "Please retrieve it and keep it with you.";
+ close;
+ }
+ } else if (orcs_hero_hat == 0 || orcs_hero_hat ==1) {
+ mes "[Orc Warrior]";
+ if (sex == 1) {
+ mes "What does the son of a human have to do here?";
+ } else {
+ mes "What does the daughter of a human have to do here?";
+ }
+ mes "Shouldn't you have nothing to do with us, the Orc Warriors?";
+ mes "Or are you tired of the endless war";
+ mes "and hope for a truce? That should be good!";
+ next;
+ mes "[Orc Warrior]";
+ mes "We, the Orc Warriors don't simple speak to men.";
+ mes "I praise your courage";
+ mes "to dare to come and try to talk to me.";
+ mes "But we have no intention of hearing what you want to say.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Sit there quietly and leave without making any noises.";
+ mes "If you want to rest before you depart,";
+ mes "watch your manners, at least to the host, me.";
+ if (rand(1,10)>9) {
+ next;
+ switch(select(".....","I want a conversation with you.")) {
+ case 1:
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "Converstation...? Conversation you say?Hahahaha!! ";
+ mes "You are really an interesting human.";
+ mes "Talk to a Orc Warrior? ";
+ mes "This is the first time I see human talk without sword and shield...!";
+ next;
+ mes "[Orc Warrior]";
+ mes "However, I won't be kind to anyone.";
+ mes "If you want to talk to me,";
+ mes "you'll need to show some respect! Do you understand that?";
+ mes "Ok... this is my little suggestion.";
+ next;
+ mes "[Orc Warrior]";
+ mes "Show me the will of a human,";
+ mes "who wants to talk to me.";
+ mes "To talk to me, gather^FF0000Jellopy x 1000 ^000000 ";
+ mes "Bring it to me when you come to talk next time";
+ next;
+ mes "[Orc Warrior]";
+ mes "And, don't question me.";
+ mes "I won't give you the rights to question my opinion.";
+ mes "And dont you dream that,";
+ mes "I will give you anything.";
+ mes "Do you still want to talk under these circumstances?";
+ mes "Decendent of human?";
+ next;
+ switch(select("Let's battle, Orc Warrior!!:I will show you my faith")) {
+ case 1:
+ mes "[Orc Warrior]";
+ mes "Yeahyeahyee, what a noisy fella!!";
+ mes "If you like to fight, go outside!";
+ mes "I really hate to see humans!!";
+ close;
+ case 2:
+ mes "[Orc Warrior]";
+ mes "Ok, keep your promise!";
+ mes "I want to see how you keep that.";
+ mes "You will quit eventually.";
+ mes "Hahahahaha!!";
+ set orcs_hero_hat,1;
+ close;
+ }
+ }
+ } else {
+ close;
+ }
+ }
+}
+in_orcs01.gat,162,33,1 script Hero of Orc#1 1087,2,2{
+ if (orcs_hero_hat < 16) {
+ mes "[Orc Hero]";
+ mes ".....Go away, don't interrupt me!";
+ mes "If you want to fight me,";
+ mes "wait for me at the west forest.";
+ mes "I am not in the mood to fight human now.";
+ close;
+ } else if (orcs_hero_hat == 17) {
+ mes "[Orc Hero]";
+ mes "Hahaha, interesting, really interesting.";
+ mes "You are the most interesting human";
+ mes "that I have seen...";
+ mes "I like it, interesting...";
+ close;
+ } else if (orcs_hero_hat == 16) {
+ if (countitem(968) && countitem(2299) && countitem(1124) && countitem(931)) {
+ if(rand(1,20)>19) {
+ mes "[Orc Hero]";
+ mes "Hmm, a human that is knows as Hero?";
+ mes "DO you know the meaning of returning a Heroic Emblem?...";
+ mes "When I am free later,";
+ mes "I'll fight with you.";
+ next;
+ mes "[Orc Hero]";
+ mes ".....HmmHmmm...? This iron helm...?";
+ mes "It belongs to Orc Warrior...?";
+ next;
+ mes "[Orc Hero]";
+ mes "Wait... You're still using this?";
+ mes "Uhoh....";
+ mes "Such an interesting human! Hahaha";
+ mes "Good, really good...";
+ next;
+ mes "[Orc Hero]";
+ mes "You seem not to be aware of the story behind this viking helm.";
+ mes "In the battle between Orc Lord and the humands,";
+ mes "he lost it in his defeat...";
+ mes "The horn in the center was broken";
+ mes "and this helm is created...!";
+ next;
+ mes "[Orc Hero]";
+ mes "Rumors said that if it is given to a human,";
+ mes "the human will be recognized as a Hero...";
+ mes "Hahaha, interesting.";
+ mes "And there're still people who";
+ mes "continue to use it...!!";
+ next;
+ mes "[Orc Hero]";
+ mes "So that's the belonging of the Orc Lord!";
+ mes "And you are not qualified to have it.";
+ mes "So if you don't mind,";
+ mes "can you return it to its origional owner?";
+ mes "Oh 'Human' Orc Warrior?";
+ next;
+ switch(select("I refuse to do so:I agree")) {
+ case 1:
+ mes "[Orc Hero]";
+ mes "Hmm, how stubborn.";
+ mes "If you think it's important, wear it well.";
+ mes "The history of the battle is still kept";
+ mes "on this headgear of a warrior.";
+ close;
+ case 2:
+ mes "[Orc Hero]";
+ mes "Good, that's more like it.";
+ mes "This Viking Helm,";
+ mes "I'll give it to him, hahahaha...";
+ mes "I never imagined to see this thing here.";
+ next;
+ mes "[Orc Hero]";
+ mes "I'll give you a useful item though!";
+ mes "Although you're human,";
+ mes "you're recognizedas a Orc Hero before.";
+ mes "You should at least have a suitable headgear...";
+ next;
+ mes "[Orc Hero]";
+ mes "Here you can have this.";
+ mes "I have nade a special sign on it...";
+ mes "So continue to use this in the future,";
+ mes "understand? 'Human' Orc Warrior?";
+ if (countitem(2299)) {
+ delitem 2299,1;
+ getitem 5094,1;
+ set orcs_hero_hat,17;
+ }
+ close;
+ }
+ } else {
+ mes "[Orc Hero]";
+ mes "Hmm, a human that is recognized a warrior?";
+ mes "Do you know the meaning of returning a Heroic Emblem?...";
+ mes "When I am free later,";
+ mes "I'll fight with you.";
+ close;
+ }
+ } else {
+ mes "[Orc Hero]";
+ mes "Hmm, a human that is recognized a warrior?";
+ mes "You don't look like one though.";
+ mes "Is he really going to return the Heroic Emblem?";
+ mes "I can't believe it.";
+ next;
+ mes "[Orc Hero]";
+ mes "I won't recognize you as a Hero.";
+ mes "He forgets even the most basic things.";
+ mes "How can he be called warrior... Humans!!";
+ mes "Go to the west forest now.";
+ mes "I want you to pass the trial again...!";
+ close;
+ }
+ }
+}
diff --git a/npc/quests/newgears/2005_headgears.txt b/npc/quests/newgears/2005_headgears.txt
index a57807661..1582d8e2b 100644
--- a/npc/quests/newgears/2005_headgears.txt
+++ b/npc/quests/newgears/2005_headgears.txt
@@ -1,2255 +1,2255 @@
-//===== eAthena Script =======================================
-//= 2005 Headgear Quests
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= 2005 Headgears Official Quest.
-//===== Additional Comments: =================================
-// 1.0 First version, converted from the official aegis script. [MasterOfMuppets]
-//============================================================
-
-yuno.gat,222,116,3 script Kasis#LhzHat 851,{
-
- if(countitem(519) > 49 && countitem(7031) > 49 && countitem(548) > 49 && countitem(539) > 49)
- {
- mes "[Kasis]";
- mes "Milk, Cheese,";
- mes "Old Frying Pans,";
- mes "Pieces of Cake...";
- mes "Th-that's everything";
- mes "I need to make lunch for";
- mes "my friends in the Factory!";
- next;
- switch( select( "Well, I did promise to help you.", "What are you talking about?" ) )
- {
- case 1:
- mes "[Kasis]";
- mes "Finally, I can treat my";
- mes "buddies to a wonderful";
- mes "feast! They'll be so pleased!";
- mes "Oh, I'd really like to repay you";
- mes "somehow, but I'm not sure";
- mes "what I could possibly give...";
- next;
- mes "[Kasis]";
- mes "Of course! Why don't";
- mes "you treat yourself to";
- mes "my specialty, Kasis's";
- mes "Crunch Toast? It looks";
- mes "simple, but it actually";
- mes "requires great skill to make.";
- next;
- mes "[Kasis]";
- mes "Here you are!";
- mes "Please enjoy this and always";
- mes "remember that breakfast is the";
- mes "most important meal of the day!";
- mes "Now, I better prepare those";
- mes "lunches. Goodbye, my friend~";
- delitem 519,50;
- delitem 7031,50;
- delitem 548,50;
- delitem 539,50;
- getitem 5107,1;
- close;
- break;
-
- case 2:
- mes "[Kasis]";
- mes "Oh...";
- mes "Oh, I'm so sorry.";
- mes "I must have confused";
- mes "you with someone else.";
- next;
- mes "[Kasis]";
- mes "You see, I've been asking";
- mes "adventurers that have been";
- mes "passing through to provide";
- mes "me with food supplies so that";
- mes "I can make lunch for my friends";
- mes "that are working in Einbroch.";
- next;
- mes "[Kasis]";
- mes "Yes...";
- mes "So...";
- mes "Sorry...";
- mes "To... Bother you.";
- next;
- mes "^3355FFAs if entranced,";
- mes "Kasis continues to";
- mes "stare at the Milk, Cheese";
- mes "Old Frying Pans and Pieces";
- mes "of Cake that you are carrying.^000000";
- next;
- switch( select( "You can have these if you want.", "Um, why are you staring?" ) )
- {
- case 1:
- mes "[Kasis]";
- mes "Really? Is it alright";
- mes "with you for me to have";
- mes "all of this Milk, Cheese,";
- mes "Pieces of Cake and these";
- mes "Old Frying Pans? Oh, bless";
- mes "your kind heart, adventurer~";
- next;
- mes "[Kasis]";
- mes "Finally, I can treat my";
- mes "buddies to a wonderful";
- mes "feast! They'll be so pleased!";
- mes "Oh, I'd really like to repay you";
- mes "somehow, but I'm not sure";
- mes "what I could possibly give...";
- next;
- mes "[Kasis]";
- mes "Of course! Why don't";
- mes "you treat yourself to";
- mes "my specialty, Kasis's";
- mes "Crunch Toast? It looks";
- mes "simple, but it actually";
- mes "requires great skill to make.";
- next;
- mes "[Kasis]";
- mes "Here you are!";
- mes "Please enjoy this and always";
- mes "remember that breakfast is the";
- mes "most important meal of the day!";
- mes "Now, I better prepare those";
- mes "lunches. Goodbye, my friend~";
- delitem 519,50;
- delitem 7031,50;
- delitem 548,50;
- delitem 539,50;
- getitem 5107,1;
- close;
- break;
-
- case 2:
- mes "[Kasis]";
- mes "Oh, let me apologize";
- mes "again. But I can't help";
- mes "but admire the quality of";
- mes "your goods. Er, you know,";
- mes "the food you're carrying. I'm";
- mes "a chef by trade, after all.";
- close;
- break;
- }
- break;
- }
- }
- mes "[Kasis]";
- mes "I'm sorry, but we're closed";
- mes "right now. Unfortunately, we";
- mes "don't have any more bread";
- mes "in stock. ^333333*Siiiiiiiiigh...*^000000";
- next;
- switch( select( "Is something wrong?", "End Conversation." ) )
- {
- case 1:
- mes "[Kasis]";
- mes "Well, my current contract";
- mes "with the company that's been";
- mes "providing me with ingredients";
- mes "has expired. Of course, it's";
- mes "bad enough that I don't have";
- mes "the food to run this business.";
- next;
- mes "[Kasis]";
- mes "But I also feel like I'm";
- mes "letting my friends down.";
- mes "You see, I've been sending";
- mes "them lunch every day since";
- mes "they've been working in the";
- mes "Factory over in Einbroch.";
- next;
- mes "[Kasis]";
- mes "I'm unable to make";
- mes "lunch for them at the";
- mes "moment, but I really want to";
- mes "help my buddies, especially";
- mes "since their financial situation";
- mes "seems pretty bad right now.";
- next;
- switch( select( "Do you want me to help you?", "I'm so sorry to hear that." ) )
- {
- case 1:
- mes "[Kasis]";
- mes "Sure, I'm willing to accept";
- mes "help from wherever I can find";
- mes "it. If you would, I'd like you to bring me some food supplies";
- mes "that I can use to make lunches";
- mes "for my friends at the Factory.";
- next;
- mes "[Kasis]";
- mes "Would you";
- mes "please get me";
- mes "^4D4DFF50 Milk^000000,";
- mes "^4D4DFF50 Cheese^000000,";
- mes "^4D4DFF50 Pieces of Cake^000000 and";
- mes "^4D4DFF50 Old Frying Pans^000000?";
- next;
- mes "[Kasis]";
- mes "I'd really appreciate";
- mes "your help. My friends seem";
- mes "so depressed to be working";
- mes "in the Factory and I want to";
- mes "do all I can to cheer them up.";
- mes "Thanks for your kind offer~";
- close;
- break;
-
- case 2:
- mes "[Kasis]";
- mes "I'm trying to renew";
- mes "my contract with the";
- mes "company that's been";
- mes "providing me with food";
- mes "supplies, but it hasn't";
- mes "been working out so far...";
- next;
- mes "[Kasis]";
- mes "I don't know what's";
- mes "happening, but hopefully";
- mes "I can find a new supplier";
- mes "soon. There are my friends";
- mes "to worry about, as well as";
- mes "the sake of my business.";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Kasis]";
- mes "Anyway, please come";
- mes "again. Hopefully, we'll";
- mes "have some good bread";
- mes "in stock next time, okay?";
- close;
- break;
- }
-
-}
-
-lighthalzen.gat,143,68,0 script Strange Guy#LhzHat 47,{
-
- if(DTHATQ == 0)
- {
- mes "[Strange Guy]";
- mes "Wait! Don't say";
- mes "anything! You must be";
- mes "an adventurer from the";
- mes "Rune-Midgarts Kingdom!";
- mes "So... I'm right, aren't I?";
- next;
- switch( select( "Who are you?", "How did you know?", "Ignore him." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Allow me to";
- mes "introduce myself.";
- mes "My name is Morris Poe,";
- mes "detective of great acclaim";
- mes "and world wide fame.";
- next;
- switch( select( "I've never heard of you.", "You're kidding me.", "I'm outta here." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Morris Poe?";
- mes "Renown detective?";
- mes "Advocate for justice in";
- mes "the Schwaltzvalt Republic?";
- mes "Surely you recognize one";
- mes "of my esteemed titles.";
- next;
- switch( select( "Nope, I don't know you.", "You're Morris Poe?!" ) )
- {
- case 1:
- mes "[Morris]";
- mes "You don't...?";
- mes "But I'm a famous hero.";
- mes "Children look up to me";
- mes "and wish they'd grow";
- mes "up to be as smart as me.";
- next;
- mes "[Morris]";
- mes "I don't get it.";
- mes "I'm famouser than";
- mes "that. A household name";
- mes "even. I've got a sterling";
- mes "public image, how could";
- mes "you never have heard of me...?";
- close;
- break;
-
- case 2:
- break;
- }
- break;
-
- case 2:
- mes "[Morris]";
- mes "Kidding? Ha ha!";
- mes "Look at these keen,";
- mes "deductive and deeply";
- mes "analytical eyes and";
- mes "tell me I'm joking.";
- next;
- switch( select( "Whoa, those ARE keen eyes.", "Okay. You're joking." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Yes, this sharp,";
- mes "penetrating, yet";
- mes "highly intelligent gaze";
- mes "belongs to the world";
- mes "detective and crime";
- mes "fighter, Morris Poe!";
- next;
- switch( select( "I've never heard of you.", "Golly, Morris Poe?!" ) )
- {
- case 1:
- mes "[Morris]";
- mes "Never heard of...?";
- mes "Impossible! If there are";
- mes "two things I hate more";
- mes "than crime, they would be";
- mes "dishonesty... And rejection";
- mes "from beautiful women.";
- next;
- mes "[Morris]";
- mes "When you get over your";
- mes "sense of pride and gain";
- mes "a little maturity, then we";
- mes "might share an actual";
- mes "conversation. Until then,";
- mes "you'll just have to grow up.";
- close;
- break;
-
- case 2:
- break;
- }
- break;
-
- case 2:
- mes "[Morris]";
- mes "Hahahahahaah--Huh.";
- mes "If there are two things";
- mes "I hate more than criminals,";
- mes "they would be sarcasm...";
- mes "And receiving fake phone";
- mes "numbers from really cute girls.";
- next;
- switch( select( "Yeah, you're no Don Juan.", "I'm... I'm sorry." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Wah...!";
- mes "Did you just--?!";
- mes "Ugh, you're the worst";
- mes "type of person, you know that?";
- emotion e_omg;
- close;
- break;
-
- case 2:
- mes "[Morris]";
- mes "I think it's too late to";
- mes "apologize. Why would you";
- mes "treat someone of my stature";
- mes "with such caustic sarcasm?!";
- mes "What excuse could possibly";
- mes "exonerate your behavior?!";
- next;
- switch( select( "I... I was intimidated...", "It's how I treat all losers." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Of course: intense feelings";
- mes "of awe and fear of my vast";
- mes "intellect would result in that";
- mes "kind of deviant behavior. I'll";
- mes "have to forgive you, I suppose.";
- next;
- break;
-
- case 2:
- mes "[Morris]";
- mes "What...?!";
- mes "Morris Poe, a loser?";
- mes "Such defamatory remarks";
- mes "cannot be forgiven, no";
- mes "matter how unfounded";
- mes "and groundless they are!";
- emotion e_omg;
- close;
- break;
- }
- break;
- }
- break;
- }
- break;
-
- case 3:
- mes "[Morris]";
- mes "Hahaha, oh, that's";
- mes "funny. Wait. You're...";
- mes "You're really leaving.";
- mes "N-no, come baaaack!";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Strange Guy]";
- mes "How did I know?";
- mes "Elementary, my friend.";
- mes "There was an abundance";
- mes "of clues for me to make";
- mes "that sort of simple deduction.";
- close;
- break;
-
- case 3:
- mes "[Strange Guy]";
- mes "Hello...?";
- mes "...............";
- mes "Oh, this is embarassing.";
- mes "I can't believe I'm getting";
- mes "the silent treatment...";
- close;
- break;
- }
-
- mes "[Morris]";
- mes "Yes, I know it's";
- mes "difficult to believe that";
- mes "you would be fortunate";
- mes "enough to stand in the";
- mes "presence of genius. Now,";
- mes "you must be wondering...";
- next;
- menu "Um, wondering what?",-;
- mes "[Morris]";
- mes "You're wondering,";
- mes "\"How in the world";
- mes "can I be as brilliant";
- mes "as Morris Poe, the";
- mes "genius detective?\"";
- next;
- mes "[Morris]";
- mes "First, I think it's fair";
- mes "to let you know that it's";
- mes "an impossible dream. Men like";
- mes "myself only arise in this world";
- mes "perhaps once every generation.";
- mes "I'm sorry, but don't give up!";
- next;
- mes "[Morris]";
- mes "Now, you can try to reach";
- mes "a level of intelligence that";
- mes "is comparable to my own by";
- mes "joining the Young Detective's";
- mes "Club. To become a member, you just need one essential article.";
- next;
- mes "[Morris]";
- mes "Yes, you will need the";
- mes "^0000FFRenown Detective's Cap^000000!";
- mes "Luckily, I'm giving them";
- mes "away for a relatively small";
- mes "material cost, but you must";
- mes "hurry while supplies last.";
- next;
- mes "[Morris]";
- mes "Simply bring me";
- mes "^0000FF10 Magnifiers^000000,";
- mes "^0000FF1887 Tassels^000000,";
- mes "^0000FF1 Slotted Bucket Hat^000000";
- mes "and ^0000FF1,887 zeny^000000. That's all!";
- next;
- mes "[Morris]";
- mes "But first, let me warn you";
- mes "not to bring a ^FF0000slotted Bucket";
- mes "Hat with a card compounded to";
- mes "it, or any upgraded Bucket Hats. I'm not responsible for any";
- mes "loss resulting from that.";
- next;
- mes "[Morris]";
- mes "Hurry and bring me";
- mes "those items! There are";
- mes "only 20,000,000 Renown";
- mes "Detective Caps left!";
- mes "Once they're gone,";
- mes "they'll be extinct!";
- set DTHATQ,1;
- close;
- }
- else if(DTHATQ == 1)
- {
- mes "[Morris]";
- mes "So, did you want to";
- mes "buy, er, receive this";
- mes "Renown Detective's Cap";
- mes "and become an honored";
- mes "member of the Young";
- mes "Detective's Club?";
- next;
- mes "[Morris]";
- mes "Remember, make sure";
- mes "that you don't bring any";
- mes "^FF0000slotted Bucket Hats that";
- mes "have been upgraded or have";
- mes "cards compounded to them, or";
- mes "you'll lose those enhancements^000000.";
- next;
- mes "[Morris]";
- mes "Now, if you have only";
- mes "1 Bucket Hat, we can begin.";
- mes "Young Detective's Club... Salute! ";
- next;
- switch( select( "Salute.", "Whatever..." ) )
- {
- case 1:
- mes "[Morris]";
- mes "Great, done like a pro!";
- mes "Now, I need to check your";
- mes "fee--I mean qualifications.";
- mes "Let's see now, I need to";
- mes "look through your Inventory...";
- next;
- set @lhzhatfailed,0;
- if(countitem(611) < 10)
- {
- mes "[Morris]";
- mes "Wait. You don't have";
- mes "enough Magnifiers. You";
- mes "do want to join this club,";
- mes "don't you? Did you need to";
- mes "hear the requirements again?";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(7301) < 1887 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Not enough Tassels? Check.";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(5120) < 1 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Hm. You're missing";
- mes "the slotted Bucket Hat.";
- mes "You were so close...";
- set @lhzhatfailed,1;
- next;
- }
- if(Zeny < 1887 && failed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Slotted Bucket Hat. Got it.";
- mes "Hey. Where's the zeny?!";
- mes "That's the most important,";
- mes "er, qualification of all!";
- set @lhzhatfailed,1;
- next;
- }
-
- if(@lhzhatfailed == 1)
- {
- mes "[Morris]";
- mes "^333333*Sigh*^000000 You need";
- mes "^0000FF10 Magnifiers^000000,";
- mes "^0000FF1887 Tassels^000000,";
- mes "^0000FF1 Slotted Bucket Hat^000000";
- mes "and ^0000FF1,887 zeny^000000. That's all!";
- emotion e_an;
- next;
- mes "[Morris]";
- mes "Now, remember everything";
- mes "that you need this time, okay?";
- mes "I'll be next;ing to welcome";
- mes "you into the elite ranks of ";
- mes "the Young Detective's Club.";
- close;
- }
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Slotted Bucket Hat. Got it.";
- mes "Aaaand zeny. Heh heh. Perfect.";
- next;
- mes "[Morris]";
- mes "Great, that's everything!";
- mes "Welcome to the club! Here's";
- mes "your Renown Detective's Cap,";
- mes "so wear it with pride as you";
- mes "take an active part in our club's";
- mes "activities and promotion!";
- delitem 7301,1887;
- delitem 5120,1;
- delitem 611,10;
- set Zeny, Zeny - 1887;
- set DTHATQ,2;
- getitem 5108,1;
- next;
- switch( select( "Wait, promotion?", "Hooray!" ) )
- {
- case 1:
- mes "[Morris]";
- mes "Of course, isn't it obvious?";
- mes "As a member, one of your duties";
- mes "will be to sing accolades of this club so that more members";
- mes "will join and earn their own";
- mes "Renown Detective's Caps.";
- next;
- mes "[Morris]";
- mes "Alright, scurry off";
- mes "now and proudly display";
- mes "your new, rakishly stylish";
- mes "Renown Detective's Cap";
- mes "to all of your friends!";
- close;
- break;
-
- case 2:
- mes "[Morris]";
- mes "Alright, scurry off";
- mes "now and proudly display";
- mes "your new, rakishly stylish";
- mes "Renown Detective's Cap";
- mes "to all of your friends!";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Morris]";
- mes "Huh. You just failed";
- mes "the \"Test of Respect.\"";
- mes "You don't deserve the";
- mes "honor of wearing the";
- mes "Renowned Detective's Cap!";
- close;
- break;
- }
- }
- else if(DTHATQ == 2)
- {
- mes "[Morris]";
- mes "Have you come to me";
- mes "in order to obtain another";
- mes "Renown Detective's Cap?";
- mes "I realize that such a stylish";
- mes "headgear is in high demand.";
- next;
- mes "[Morris]";
- mes "Remember, make sure";
- mes "that you don't bring any";
- mes "^FF0000slotted Bucket Hats that";
- mes "have been upgraded or have";
- mes "cards compounded to them, or";
- mes "you'll lose those enhancements^000000.";
- next;
- mes "[Morris]";
- mes "As a proud member of";
- mes "the Young Detective's Club,";
- mes "did you bring everything";
- mes "you need in order to earn";
- mes "a Renown Detective's Cap?";
- next;
- switch( select( "I'm not sure~", "Sure!" ) )
- {
- case 1:
- mes "[Morris]";
- mes "What...?! Every good";
- mes "detective must have a";
- mes "photographic memory";
- mes "and be able to recall";
- mes "minute details in order";
- mes "to crack the case.";
- emotion e_sob;
- next;
- mes "[Morris]";
- mes "Remember...";
- mes "^0000FF10 Magnifiers^000000,";
- mes "^0000FF1887 Tassels^000000,";
- mes "^0000FF1 Slotted Bucket Hat^000000";
- mes "and ^0000FF1,887 zeny^000000. Okay?";
- close;
- break;
-
- case 2:
- mes "[Morris]";
- mes "Great!";
- mes "Now let me just";
- mes "check to see if you";
- mes "brought everything...";
- next;
- set @lhzhatfailed,0;
- if(countitem(611) < 10)
- {
- mes "[Morris]";
- mes "Hmm, you don't have";
- mes "enough Magnifiers? But";
- mes "those are essential tools";
- mes "for sleuthing. Come now,";
- mes "hurry back with them!";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(7301) < 1887 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Not enough Tassels? Check.";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(5120) < 1 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Hm. You're missing";
- mes "the slotted Bucket Hat.";
- mes "You were so close...";
- set @lhzhatfailed,1;
- next;
- }
- if(Zeny < 1887 && failed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Slotted Bucket Hat. Got it.";
- mes "Hey. Where's the zeny?!";
- mes "That's the most important,";
- mes "er, qualification of all!";
- set @lhzhatfailed,1;
- next;
- }
-
- if(@lhzhatfailed == 1)
- {
- mes "[Morris]";
- mes "Remember...";
- mes "^0000FF10 Magnifiers^000000,";
- mes "^0000FF1887 Tassels^000000,";
- mes "^0000FF1 Slotted Bucket Hat^000000";
- mes "and ^0000FF1,887 zeny^000000. Okay?";
- emotion e_an;
- close;
- } set @lhzhatfailed,0;
- if(countitem(611) < 10)
- {
- mes "[Morris]";
- mes "Hmm, you don't have";
- mes "enough Magnifiers? But";
- mes "those are essential tools";
- mes "for sleuthing. Come now,";
- mes "hurry back with them!";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(7301) < 1887 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Not enough Tassels? Check.";
- set @lhzhatfailed,1;
- next;
- }
- if(countitem(5120) < 1 && @lhzhatfailed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Hm. You're missing";
- mes "the slotted Bucket Hat.";
- mes "You were so close...";
- set @lhzhatfailed,1;
- next;
- }
- if(Zeny < 1887 && failed == 0)
- {
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Slotted Bucket Hat. Got it.";
- mes "Hey. Where's the zeny?!";
- mes "That's the most important,";
- mes "er, qualification of all!";
- set @lhzhatfailed,1;
- next;
- }
-
- if(@lhzhatfailed == 1)
- {
- mes "[Morris]";
- mes "Remember...";
- mes "^0000FF10 Magnifiers^000000,";
- mes "^0000FF1887 Tassels^000000,";
- mes "^0000FF1 Slotted Bucket Hat^000000";
- mes "and ^0000FF1,887 zeny^000000. Okay?";
- emotion e_an;
- close;
- }
- mes "[Morris]";
- mes "Magnifiers. Check.";
- mes "Tassels... Check.";
- mes "Slotted Bucket Hat. Got it.";
- mes "Aaaand zeny. Heh heh. Perfect.";
- next;
- mes "[Morris]";
- mes "Great! You've just qualified";
- mes "to own yet another Renowned";
- mes "Detective's Cap. Congratulations! Now, let me collect all of these";
- mes "goods and zeny from you...";
- delitem 7301,1887;
- delitem 5120,1;
- delitem 611,10;
- set Zeny, Zeny - 1887;
- set DTHATQ,2;
- getitem 5108,1;
- next;
- mes "[Morris]";
- mes "Hahaha! It's what";
- mes "I expect from one of";
- mes "our Junior Gold Members!";
- mes "How does it feel like to be";
- mes "the cream of the cream of";
- mes "the crop? Great, isn't it?";
- close;
- break;
- }
- }
-
-}
-
-lighthalzen.gat,360,313,3 script Boy#LhzHat 706,{
-
- mes "[Boy]";
- mes "Hello, mister!";
- mes "Um, would you do";
- mes "me a favor, please?";
- next;
- if(countitem(526) && countitem(7270) && countitem(941) && countitem(10004))
- {
- mes "[Boy]";
- mes "Oh! You brought me";
- mes "some Royal Jelly to";
- mes "eat, as well as everything";
- mes "I need to make a Baby Pacifier.";
- mes "Okay, let me get started on that right away. Just a moment...";
- next;
- mes "...";
- mes "......";
- next;
- mes "[Boy]";
- mes "Damn.";
- mes "That Royal Jelly";
- mes "was frickin' delicious!";
- mes "Now I can make your";
- mes "Baby Pacifier. Let's see";
- mes "here. Ah, here we go...";
- delitem 526,1;
- next;
- mes "[Boy]";
- mes "It's done!";
- mes "Now, you're the";
- mes "proud owner of your";
- mes "very own Baby Pacifier!";
- mes "I hope you're happy with";
- mes "yourself. Travel safe, okay?";
- delitem 7270,1;
- delitem 941,1;
- delitem 10004,1;
- getitem 5110,1;
- close;
- }
- switch( select( "What do you need?", "Sorry, kid..." ) )
- {
- case 1:
- mes "[Boy]";
- mes "Well, my mom has been";
- mes "sick recently, so both of";
- mes "us haven't been able to eat";
- mes "for the past few days. But";
- mes "if she doesn't eat, how does";
- mes "she expect to get better?";
- emotion e_sob;
- next;
- mes "[Boy]";
- mes "So I guess what I'm";
- mes "asking is, would you be";
- mes "able to spare some food?";
- next;
- switch( select( "Help him.", "Refuse to help." ) )
- {
- case 1:
- if(!countitem(526))
- {
- mes "[Boy]";
- mes "If you would, do you think";
- mes "you can get some Royal Jelly";
- mes "that I can give to my mom? The old lady next door says that it's";
- mes "really nutritious and helps you get better faster if you're sick.";
- next;
- mes "[Boy]";
- mes "My mom would be mad";
- mes "at me if she found out";
- mes "I was begging for it, but";
- mes "Royal Jelly is too expensive";
- mes "for me to get without any help!";
- close;
- }
- mes "[Boy]";
- mes "Oh, would it be alright";
- mes "if I have this Royal Jelly?";
- mes "It would really help my mom";
- mes "feel better. Thanks so much~";
- delitem 526,1;
- next;
- mes "[Boy]";
- mes "Hey, to pay you back, why";
- mes "don't I make a Baby Pacifier";
- mes "for you? I learned how to make";
- mes "one when my baby brother was";
- mes "born. But first, I'll need some";
- mes "materials to put it together...";
- next;
- mes "[Boy]";
- mes "Would you";
- mes "please bring";
- mes "^3131FF1 Nursing Bottle^000000,";
- mes "^3131FF1 Nose Ring^000000 and";
- mes "^3131FF1 Pacifier^000000? Oh, and one";
- mes "more ^3131FFRoyal Jelly^000000 for me~";
- close;
- break;
-
- case 2:
- mes "[Boy]";
- mes "Oh... Um, that's";
- mes "alright. Maybe I was";
- mes "asking too much from";
- mes "you. I mean, it's true";
- mes "that you barely know me...";
- emotion e_sob;
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Boy]";
- mes "Th-that's okay.";
- mes "I guess you must";
- mes "be so busy that you";
- mes "don't even have the";
- mes "time to listen to some";
- mes "little boy's problems...";
- emotion e_sob;
- close;
- break;
- }
-
-}
-
-einbech.gat,70,222,5 script Mater#LhzHat 91,{
-
- if(countitem(983) && countitem(7267) > 998 && countitem(749) && Zeny > 49999)
- {
- mes "[Mater]";
- mes "Oh, hello, what's this?";
- mes "You're carrying 1 Black";
- mes "Dyestuffs, 1 Frozen Rose,";
- mes "999 Tiger Panties and even";
- mes "50,000 zeny with you. That's";
- mes "enough to make a Winter Hat...";
- next;
- mes "[Mater]";
- mes "Um, would you mind letting";
- mes "me have those items so that";
- mes "I can make a Winter Hat?";
- mes "I'd never be able to gather";
- mes "those things on my own...";
- next;
- switch( select( "Let her have the items.", "Don't give her the items." ) )
- {
- case 1:
- mes "[Mater]";
- mes "Oh, thank you so much!";
- mes "I've always wanted to make";
- mes "this hat and try it on, even";
- mes "if it's just once. But don't";
- mes "worry, I'll give it to you~";
- mes "Now please next; a moment...";
- next;
- mes "[Mater]";
- mes "Let's see...";
- mes "I've got to fold";
- mes "the rose like this...";
- mes "Be careful with the dye...";
- mes "Where did I put all those";
- mes "pan--Oh, here we are.";
- next;
- mes "[Mater]";
- mes "^333333*Whew!*^000000";
- mes "Finally, it's done!";
- mes "Now, if you don't mind,";
- mes "let me try this hat on";
- mes "for just a little while.";
- delitem 983,1;
- delitem 7267,999;
- delitem 749,1;
- set Zeny,Zeny - 50000;
- getitem 5115,1;
- next;
- mes "...";
- mes "......";
- next;
- mes "[Mater]";
- mes "Ahhhhhh~";
- mes "It just feels...";
- mes "I felt so free~";
- mes "It was everything";
- mes "I imagined it to be.";
- next;
- mes "[Mater]";
- mes "Here, please take";
- mes "this Winter Hat. I really";
- mes "hope that you'll enjoy it";
- mes "as much as I do. Well then,";
- mes "be safe in your travels, okay?";
- close;
- break;
-
- case 2:
- mes "[Mater]";
- mes "I'm sorry, I know that";
- mes "I was asking a pretty big";
- mes "favor from someone I just";
- mes "met. I hope you understand";
- mes "how much I really want to";
- mes "make that Winter Hat...";
- close;
- break;
- }
- }
- mes "[Mater]";
- mes "Look at that blue";
- mes "sky. Don't you wish";
- mes "you could just soar";
- mes "through the heavens";
- mes "with your own wings?";
- next;
- mes "[Mater]";
- mes "Of course, it's an";
- mes "impossible dream,";
- mes "but with this Winter Hat,";
- mes "you can at least enjoy the";
- mes "sensation of freedom that";
- mes "a bird in flight must feel.";
- next;
- mes "[Mater]";
- mes "If you would like";
- mes "a hat like this, I would";
- mes "need to have some items";
- mes "that I don't think I can ever";
- mes "obtain on my very own.";
- next;
- mes "[Mater]";
- mes "^FF00001 Black Dyestuffs^000000,";
- mes "^FF0000999 Tiger Panties^000000,";
- mes "^FF00001 Frozen Rose^000000 and";
- mes "^FF000050,000 zeny^000000. If you can";
- mes "bring those to me, I shall";
- mes "make you a Winter Hat.";
- close;
-
-}
-
-lhz_in02.gat,91,38,5 script Margaret Mary#LhzHat 90,{
-
- mes "[Margaret Mary]";
- mes "The white rose, in its";
- mes "purity and simplicity, is";
- mes "like a woman who doesn't";
- mes "need jewels or fancy dresses";
- mes "to look noble and beautiful. It's the perfect gift for a lady.";
- next;
- switch( select( "Make a Mystic Rose.", "End Conversation." ) )
- {
- case 1:
- if(countitem(731) > 9 && countitem(748) > 1 && countitem(982) && Zeny > 49999)
- {
- mes "[Margaret Mary]";
- mes "Ah, I see that you've brought";
- mes "what I need to bleach the blood";
- mes "red hue from these Witherless";
- mes "Roses and adorn these flowers";
- mes "with eternal elegance. May I use these items to make a Mystic Rose?";
- next;
- switch( select( "Yes", "No" ) )
- {
- case 1:
- mes "[Margaret Mary]";
- mes "Thank you. Please";
- mes "next; a moment while";
- mes "I concentrate in order to";
- mes "preserve the natural beauty";
- mes "of these gorgeous flowers...";
- next;
- mes "[Margaret Mary]";
- mes "The rose truly is the";
- mes "undisputed queen of all";
- mes "flowers. All other flora must";
- mes "humbly bow to its regal beauty.";
- next;
- mes "...";
- mes "......";
- next;
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Margaret Mary]";
- mes "There, it is finished.";
- mes "Please remember to wear";
- mes "your hair in an elegant and";
- mes "refined manner when wearing";
- mes "the Mystic Rose so as not to disgrace these beautiful flowers.";
- delitem 731,10;
- delitem 748,2;
- delitem 982,1;
- set Zeny,Zeny - 50000;
- getitem 5117,1;
- close;
- break;
-
- case 2:
- mes "[Margaret Mary]";
- mes "White roses with thorns";
- mes "makes my heart beat with";
- mes "unceasing trepidation. What";
- mes "if I prick my finger and shed";
- mes "blood on its snow white petals?";
- close;
- break;
- }
- }
- mes "[Margaret Mary]";
- mes "I love roses, but it makes";
- mes "me sad that their beauty";
- mes "fades far too soon. And so,";
- mes "I've found a way to preserve";
- mes "the beauty of the roses, so";
- mes "that it lasts for all eternity.";
- next;
- mes "[Margaret Mary]";
- mes "Do you love roses as well?";
- mes "If you like, I can make a";
- mes "^3131FFMystic Rose^000000 that you can wear";
- mes "upon your crown. It's not easy";
- mes "for me to create, but I believe that you would enjoy it greatly.";
- next;
- mes "[Margaret Mary]";
- mes "Please bring me";
- mes "^3131FF10 2 Carat Diamonds^000000,";
- mes "^3131FF3 Witherless Roses^000000,";
- mes "^3131FF1 White Dyestuffs^000000 and";
- mes "^3131FF50,000 zeny^000000 if you would";
- mes "like to have a Mystic Rose.";
- close;
- break;
-
- case 2:
- mes "[Margaret Mary]";
- mes "White roses with thorns";
- mes "makes my heart beat with";
- mes "unceasing trepidation. What";
- mes "if I prick my finger and shed";
- mes "blood on its snow white petals?";
- close;
- break;
- }
-
-}
-
-lighthalzen.gat,182,89,0 script Rich Girl#LhzHat 91,{
-
- if(LHZBTQ == 0)
- {
- mes "[Rich Girl]";
- mes "Hmmm...?";
- mes "What? Did you";
- mes "need something?";
- next;
- switch( select( "N-Nothing.", "Um, you look so relaxed." ) )
- {
- case 1:
- mes "[Rich Girl]";
- mes "Huh.";
- mes "Alright then.";
- mes "Well, try not to stare";
- mes "at people so much.";
- close;
- break;
-
- case 2:
- mes "[Rich Girl]";
- mes "Really? You are probably";
- mes "the twentieth person to";
- mes "tell me that today. Mmm.";
- mes "That's strange, isn't it?";
- next;
- menu "I guess.",-,"It's not strange at all.",-;
- mes "[Rich Girl]";
- mes "Oh yeah.";
- mes "What's your name?";
- mes "That is, if you don't";
- mes "mind me asking you.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "My name is " + strcharinfo(0) + "";
- mes "and I'm an adventurer~";
- next;
- mes "[Achiha]";
- mes "Oh, one of those?";
- mes "My name is Achiha, nice";
- mes "to meet you. I don't really";
- mes "do much of anything.";
- mes "Just sit. Relax.";
- set LHZBTQ,1;
- emotion e_heh;
- next;
- mes "[Achiha]";
- mes "I do have a hobby,";
- mes "though. Once in a while,";
- mes "I'll sew a hat. Do you think";
- mes "an adventurer like you would";
- mes "want to have a hat I made?";
- next;
- switch( select( "Er, I dunno.", "Sure." ) )
- {
- case 1:
- mes "[Achiha]";
- mes "Mm. I mean, the";
- mes "Red Bonnets I make";
- mes "might not be sturdy";
- mes "enough for battles.";
- mes "But what about those";
- mes "fish and cake hats?";
- next;
- mes "[Achiha]";
- mes "Hats...?";
- mes "That look like";
- mes "fish or cake? Mm.";
- mes "Haha. I just got it.";
- mes "That's, that's funny.";
- close;
- break;
-
- case 2:
- mes "[Achiha]";
- mes "Really? Well, I can sew";
- mes "together a ^0000FFRed Bonnet^000000.";
- mes "It reminds most people";
- mes "of a baby's bonnet, but";
- mes "it does look good on";
- mes "most people I know.";
- next;
- mes "[Achiha]";
- mes "Um, did you want me";
- mes "to make you one? I can";
- mes "go ahead and do it if you";
- mes "bring me some materials.";
- mes "Since it's just for fun,";
- mes "I won't ask for too much.";
- next;
- mes "[Achiha]";
- mes "Just bring";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000.";
- next;
- mes "[Achiha]";
- mes "I think I'm going";
- mes "to just sit and relax";
- mes "a little bit longer. But";
- mes "if you want me to make";
- mes "a hat for you, come back";
- mes "with those materials, okay?";
- set LHZBTQ,2;
- close;
- break;
- }
- break;
- }
- }
- else if(LHZBTQ == 1)
- {
- mes "[Achiha]";
- mes "Oh, hello.";
- mes "Isn't it such a nice,";
- mes "quiet, pleasant day?";
- next;
- switch( select( "Indeed.", "Would you please make a hat for me?" ) )
- {
- case 1:
- mes "[Achiha]";
- mes "Yeah. Today would";
- mes "be a nice day for a";
- mes "picnic or a long stroll.";
- mes "But all I want to do is";
- mes "just sit and relax...";
- close;
- break;
-
- case 2:
- mes "[Achiha]";
- mes "What are you talking";
- mes "about? Oh, you mean the";
- mes "Red Bonnet? Well, I guess";
- mes "I can make one. But I think";
- mes "I need some materials first.";
- next;
- mes "[Achiha]";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000.";
- mes "That's what I need.";
- next;
- mes "[Achiha]";
- mes "Oh, but I don't";
- mes "feel like making it";
- mes "right now. I'm soooo";
- mes "tired. Let me just sit,";
- mes "relax, even if it's just";
- mes "a little while longer...";
- set LHZBTQ,2;
- close;
- break;
- }
- }
- else if(LHZBTQ == 2)
- {
- mes "[Achiha]";
- mes "Oh, good, you're here.";
- mes "I've been next;ing for you.";
- mes "Did you bring everything that";
- mes "you need to make a ^0000FFRed Bonnet^000000?";
- next;
- switch( select( "Yes.", "I forgot what I need." ) )
- {
- case 1:
- if(countitem(10015) < 1 || countitem(10007) < 1 || countitem(975) < 1 || countitem(5032) < 1 || Zeny < 50000)
- {
- mes "[Achiha]";
- mes "Uh oh.";
- mes "You forgot";
- mes "a couple things.";
- mes "Would you like me";
- mes "to remind you what";
- mes "you need to bring?";
- next;
- mes "[Achiha]";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000. Come back";
- mes "when you're ready, okay?";
- close;
- }
- mes "[Achiha]";
- mes "Oh, you brought";
- mes "everything. That's";
- mes "good. Okay, just give";
- mes "it to me. Um, let's see.";
- next;
- mes "[Achiha]";
- mes "Well, I'm finished.";
- mes "^333333*Yawn*^000000 And now I'm";
- mes "even more tired. Here,";
- mes "take this Red Bonnet.";
- mes "I hope you like it~";
- mes "I think I'll relax now...";
- delitem 10015,1;
- delitem 10007,1;
- delitem 975,1;
- delitem 5032,1;
- set Zeny,Zeny - 50000;
- getitem 5109,1;
- set LHZBTQ,3;
- next;
- mes "[Achiha]";
- mes "I hope you will enjoy the hat~";
- close;
- break;
-
- case 2:
- mes "[Achiha]";
- mes "Oh, you really";
- mes "forgot? Oh dear,";
- mes "let me try to remember.";
- mes "I didn't forget too, did I?";
- mes "Oh next;, I remember now...";
- next;
- mes "[Achiha]";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000. Come back";
- mes "when you're ready, okay?";
- close;
- break;
- }
- }
- else if(LHZBTQ == 3)
- {
- mes "[Achiha]";
- mes "Oh, I remember you.";
- mes "You're the adventurer";
- mes "who likes my Red Bonnets";
- mes "so much. Did you want me";
- mes "to make another one for you?";
- next;
- switch( select( "Yes.", "I forgot what I need." ) )
- {
- case 1:
- if(countitem(10015) < 1 || countitem(10007) < 1 || countitem(975) < 1 || countitem(5032) < 1 || Zeny < 50000)
- {
- mes "[Achiha]";
- mes "Uh oh.";
- mes "You forgot";
- mes "a couple things.";
- mes "Would you like me";
- mes "to remind you what";
- mes "you need to bring?";
- next;
- mes "[Achiha]";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000. Come back";
- mes "when you're ready, okay?";
- close;
- }
- mes "[Achiha]";
- mes "Oh, you brought";
- mes "everything. That's";
- mes "good. Okay, just give";
- mes "it to me. Um, let's see.";
- next;
- mes "[Achiha]";
- mes "Well, I'm finished.";
- mes "^333333*Yawn*^000000 And now I'm";
- mes "even more tired. Here,";
- mes "take this Red Bonnet.";
- mes "I hope you like it~";
- mes "I think I'll relax now...";
- delitem 10015,1;
- delitem 10007,1;
- delitem 975,1;
- delitem 5032,1;
- set Zeny,Zeny - 50000;
- getitem 5109,1;
- next;
- mes "[Achiha]";
- mes "I hope you will enjoy the hat~";
- close;
- break;
-
- case 2:
- mes "[Achiha]";
- mes "Oh, you really";
- mes "forgot? Oh dear,";
- mes "let me try to remember.";
- mes "I didn't forget too, did I?";
- mes "Oh next;, I remember now...";
- next;
- mes "[Achiha]";
- mes "^0000FF1 Green Lace^000000,";
- mes "^0000FF1 Silk Ribbon^000000,";
- mes "^0000FF1 Scarlet Dyestuffs^000000,";
- mes "^0000FF1 Sunday Hat^000000 and";
- mes "^0000FF50,000 zeny^000000. Come back";
- mes "when you're ready, okay?";
- close;
- break;
- }
- }
-
-}
-
-gl_prison1.gat,137,138,5 script Zealotus#LhzHat 1200,{
-
- if(ZLMASKQ == 0)
- {
- mes "[Zealotus]";
- mes "Kneel, worm!";
- mes "As ruler of this";
- mes "Underground Prison,";
- mes "I command all who step";
- mes "into my private realm!";
- next;
- mes "[Zealotus]";
- mes "Resist, and you shall be";
- mes "punished! Grovel and kiss";
- mes "my feet, and perhaps you";
- mes "might be spared. Hohohohoho!";
- next;
- switch( select( "Oh, your highness!", "Whatever." ) )
- {
- case 1:
- mes "[Zealotus]";
- mes "The submissive woman is";
- mes "nothing but an ideal dream";
- mes "for the arrogant male! A true";
- mes "woman revels in her power to";
- mes "have her man do her bidding!";
- next;
- switch( select( "Yes, it's so true!", "Boooo!" ) )
- {
- case 1:
- mes "[Zealotus]";
- mes "However, in my lust for power, I may have inadventently crushed";
- mes "the spirits of my beloved a little too harshly. His pride crumbled,";
- mes "my man even cowers in front of the humans! It pains me to see it.";
- next;
- mes "[Zealotus]";
- mes "It is beneath me to ask";
- mes "this of you, but it will take";
- mes "a human like you to make";
- mes "him remember who he truly is,";
- mes "a proud creature of darkness";
- mes "who should fear only me!";
- next;
- mes "[Zealotus]";
- mes "Human. I offer you a small";
- mes "share of my power if you can";
- mes "take the pathetic, weeping lump";
- mes "of monster crying in the corner";
- mes "of this prison and make him";
- mes "realize his true nature.";
- set ZLMASKQ,1;
- close;
- break;
-
- case 2:
- mes "[Zealotus]";
- mes "You dirty, dirty human...";
- mes "How dare you have an ";
- mes "opinion different than mine!";
- mes "No matter. The day will come";
- mes "when all of your race shall";
- mes "address me only as \"queen.\"";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Zealotus]";
- mes "Mortal simpleton!";
- mes "Bah! The mocking of";
- mes "a boorish cur is worthless";
- mes "to me. I have all the time in";
- mes "the world to grind your pride";
- mes "to dust beneath my heels.";
- close;
- break;
- }
- }
- else if(ZLMASKQ > 0 && ZLMASKQ < 6)
- {
- mes "[Zealotus]";
- mes "Hm. If my beloved is";
- mes "acting stubborn or refuses";
- mes "to listen, feel free to take";
- mes "drastic measures. Just think";
- mes "of what I would do in your";
- mes "place. Ohohohohoho~!";
- close;
- }
- else if(ZLMASKQ == 6)
- {
- mes "[Zealotus]";
- mes "Ooh, you're back.";
- mes "Phendark is certainly";
- mes "back to his old self again,";
- mes "thanks to your efforts, human.";
- mes "Yes, his anger, his courage";
- mes "and passion are all restored~";
- next;
- mes "[Zealotus]";
- mes "As I promised, I shall";
- mes "grant you a share of my";
- mes "power. However, I will need";
- mes "some items to form this minor";
- mes "contract between you and me.";
- next;
- mes "[Zealotus]";
- mes "I will need";
- mes "^3131FF1 Cat's Eye^000000,";
- mes "^3131FF1 Forbidden Red Candle^000000 and";
- mes "^3131FF30 Worn-Out Magic Scrolls^000000.";
- mes "Then, I can grant you a measure";
- mes "of my power as I've promised.";
- set ZLMASKQ,7;
- close;
- }
- else if(ZLMASKQ == 7)
- {
- if(countitem(7263) && countitem(660) && countitem(7099) > 29)
- {
- mes "[Zealotus]";
- mes "I see that you have";
- mes "brought what I need to";
- mes "complete the contract";
- mes "between you and me,";
- mes "human. Let's begin...";
- next;
- mes "^3355FFZealotus takes the red";
- mes "candle you've given her and";
- mes "drips the wax into her open";
- mes "palm. The Cat's Eye begins";
- mes "to glow with an eerie light.^000000";
- next;
- mes "[Zealotus]";
- mes "Now, place your index";
- mes "finger into my palm so";
- mes "that we may complete the";
- mes "final step of this contract...";
- next;
- switch( select( "Don't complete the contract.", "Complete the contract." ) )
- {
- case 1:
- mes "[Zealotus]";
- mes "Hm? What are you";
- mes "afraid of? This is a";
- mes "minor contract, so";
- mes "you are not selling me";
- mes "your soul, or anything";
- mes "else for that matter.";
- close;
- break;
-
- case 2:
- mes "[Zealotus]";
- mes "I, Zealotus, as ruler";
- mes "of this realm, seal this";
- mes "eternal contract with this";
- mes "Forbidden Red Candle.";
- next;
- mes "[Zealotus]";
- mes "" + strcharinfo(0) + " will";
- mes "forever have a share";
- mes "in my power. Those that";
- mes "bow to me must also bow";
- mes "to " + strcharinfo(0) + ". It shall be done.";
- specialeffect 196; //Curse? EF_DEVIL
- specialeffect 192; //Poison attack? EF_POISONHIT
- next;
- mes "[Zealotus]";
- mes "Human, take this";
- mes "mask with you as an";
- mes "everlasting token of our";
- mes "contract. So long as you";
- mes "carry this, I will be at your";
- mes "side. So says Zealotus!";
- delitem 7263,1;
- delitem 660,1;
- delitem 7099,30;
- getitem2 5121,1,1,0,0,254,0,getcharid(0)&0xffff,(getcharid(0)>>16)&0xffff;
- set ZLMASKQ,8;
- close;
- break;
- }
- }
- mes "[Zealotus]";
- mes "I will need";
- mes "^3131FF1 Cat's Eye^000000,";
- mes "^3131FF1 Forbidden Red Candle^000000 and";
- mes "^3131FF30 Worn-Out Magic Scrolls^000000.";
- mes "Then, I can grant you a measure";
- mes "of my power as I've promised.";
- close;
- }
- else if(ZLMASKQ == 8)
- {
- mes "[Zealotus]";
- mes "Ah, I greet you in";
- mes "peace, human. Behold,";
- mes "the splendor of our realm!";
- mes "Though, I do not blame you";
- mes "if you have no interest in";
- mes "commanding these Injustices...";
- next;
- mes "[Zealotus]";
- mes "Thanks to your help,";
- mes "my Phendark has returned";
- mes "to his old, monstrously";
- mes "passionate ways. Now I can";
- mes "show him the stinging love";
- mes "of my whip! Hohohohohoho!";
- emotion e_kis;
- close;
- }
-
-}
-
-gl_prison1.gat,97,104,1 script Phendark#LhzHat 1202,{
-
- if(ZLMASKQ == 0)
- {
- mes "[Phendark]";
- mes "Huh? Oh no!";
- mes "Another h-human?!";
- mes "P-please! S-stay away,";
- mes "don't come near me!";
- close;
- }
- else if(ZLMASKQ == 1)
- {
- if(countitem(1164) || isequipped(1164))set @whipcount,@whipcount+1;
- if(countitem(1165) || isequipped(1165))set @whipcount,@whipcount+1;
- if(countitem(1166) || isequipped(1166))set @whipcount,@whipcount+1;
- if(countitem(1167) || isequipped(1167))set @whipcount,@whipcount+1;
- if(countitem(1168) || isequipped(1168))set @whipcount,@whipcount+1;
- if(countitem(1169) || isequipped(1169))set @whipcount,@whipcount+1;
- if(countitem(1170) || isequipped(1170))set @whipcount,@whipcount+1;
- if(countitem(1261) || isequipped(1261))set @whipcount,@whipcount+1;
- if(countitem(1363) || isequipped(1363))set @whipcount,@whipcount+1;
- mes "[Phendark]";
- mes "Huh? Oh no!";
- mes "Another h-human?!";
- mes "P-please! S-stay away,";
- mes "don't come near me!";
- next;
- mes "[Phendark]";
- mes "I... I swear!";
- mes "I'm not carrying any";
- mes "rare items or stuff you";
- mes "can wear, so please don't";
- mes "beat me! I... Oh my god, you";
- mes "don't believe me, don't you?";
- next;
- mes "[Phendark]";
- mes "You humans never leave";
- mes "me alone! Why do you have";
- mes "to bully me like this?! I'm";
- mes "honestly not carrying anything";
- mes "of value! Z-Zealotus, please!";
- mes "Zealotus, heeeeeelp me~!";
- emotion e_sob;
- if(!@whipcount)close;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "You're pathetic!";
- mes "Aren't you supposed";
- mes "to be a monster? You know";
- mes "what Zealotus would do if";
- mes "she were actually here?";
- next;
- mes "[Phendark]";
- mes "^333333*Sniff...*^000000";
- mes "P-probably...";
- mes "Probably whip me.";
- next;
- mes "^3355FFYou nonchalantly^000000";
- mes "^3355FFbrandish your Whip.^000000";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "That's right.";
- next;
- mes "^3355FF*Snap!*";
- mes "*Snap!*";
- mes "*Crack crack crack!*";
- mes "*Snap snap snap crack!*^000000";
- next;
- mes "[Phendark]";
- mes "Oh! That stinging pain";
- mes "that burns with bloodlust!";
- mes "It's almost as good as";
- mes "Zealtos's whip of love!";
- next;
- mes "[Phendark]";
- mes "Zealotus...";
- mes "She must be pissed";
- mes "at me, but I just can't";
- mes "stop being afraid of all";
- mes "you humans! Damn it all!";
- set ZLMASKQ,2;
- close;
- }
- else if(ZLMASKQ == 2 || ZLMASKQ == 3)
- {
- if(countitem(7315) > 368 && ZLMASKQ == 3)
- {
- mes "[Phendark]";
- mes "Y-you again!";
- mes "Why do you hound me?!";
- mes "Th-there's nothing I can";
- mes "give you, so please don't";
- mes "hurt me! Oh, oh p-please...!";
- emotion e_swt2;
- next;
- switch( select( "Feed him Dark Crystal Fragment.", "Threaten him." ) )
- {
- case 1:
- mes "[Phendark]";
- mes "What...? You want";
- mes "me to eat these?";
- mes "It doesn't seem natural,";
- mes "but if Rybio says I should,";
- mes "it might not be that bad.";
- next;
- mes "...";
- mes "......";
- next;
- mes "[Phendark]";
- mes "What's supposed to";
- mes "happen now? My inner";
- mes "demon is supposed to";
- mes "awaken by eating these?";
- mes "That sounds ridiculous!";
- mes "Though, I did just eat crystal.";
- next;
- mes "[Phendark]";
- mes "Wh-whoa. Ugh!";
- mes "My chest! Something's";
- mes "burning inside! I c-can't--!";
- mes "Can't think straight... I'm...";
- mes "Slowly... Losing my humanity!";
- next;
- mes "[Phendark]";
- mes "Huh... Huuurg--!";
- mes "Huk-huk! Heeeeh!";
- mes "Heeeeeh! Waaoooooh!";
- next;
- mes "[Phendark]";
- mes "...";
- mes "Grrrrr...!";
- next;
- mes "[Phendark]";
- mes "^333333*Pant pant*^000000";
- mes "What... just...";
- mes "What happened?";
- set ZLMASKQ,4;
- delitem 7315,369;
- close;
- break;
-
- case 2:
- mes "[" + strcharinfo(0) + "]";
- mes "So what happens";
- mes "if I don't decide not";
- mes "to hurt you? Whatcha";
- mes "gonna do then, huh?";
- next;
- mes "...";
- mes "......";
- next;
- mes "[Phendark]";
- mes "S-stop it!";
- mes "Just--Just stop it!";
- close;
- break;
- }
- }
- mes "[Phendark]";
- mes "Humans...";
- mes "They're everywhere!";
- mes "You guys--I can't...";
- mes "You're torturing me!";
- emotion e_sob;
- close;
- }
- else if(ZLMASKQ == 4)
- {
- mes "[Phendark]";
- mes "My chest was on fire,";
- mes "like I was, I dunno,";
- mes "burning with anger or";
- mes "something. It's gone";
- mes "now, but what were";
- mes "those crystals?";
- close;
- }
- else if(ZLMASKQ == 5)
- {
- mes "[Phendark]";
- mes "You again? Oh no,";
- mes "you're not going to hurt";
- mes "me or make me eat those";
- mes "weird crystals again, are you?";
- next;
- mes "^3131FF[" + strcharinfo(0) + "]^000000";
- switch( select( "Rybio", "Injustice", "Zealotus" ) )
- {
- case 1:
- mes "Rybio";
- set @temp1,1;
- break;
-
- case 2:
- mes "Injustice";
- set @temp1,2;
- break;
-
- case 3:
- mes "Zealotus";
- set @temp1,3;
- break;
- }
- switch( select( "hates", "likes" ) )
- {
- case 1:
- mes "hates";
- set @temp2,1;
- break;
-
- case 2:
- mes "likes";
- set @temp2,2;
- break;
- }
- switch( select( "Rybio.", "Injustice.", "Phendark.", "Zealotus." ) )
- {
- case 1:
- mes "Rybio.";
- break;
-
- case 2:
- mes "Injustice.";
- break;
-
- case 3:
- if((@temp1 == 1 || @temp1 == 2) && @temp2 == 1)
- {
- mes "[Phendark]";
- mes "I can't believe";
- mes "something like that!";
- mes "Oh, that doesn't matter.";
- mes "Zealotus is too good for me.";
- mes "I'm not even worthy of tasting";
- mes "the sting of her Love Whip.";
- emotion e_sob;
- close;
- }
- else if(@temp1 == 3 && @temp2 == 1)
- {
- mes "[Phendark]";
- mes "...";
- mes "......";
- mes "Hates me?";
- mes "N-no, that can't--";
- mes "I didn't, that doesn't--";
- next;
- mes "[Phendark]";
- mes "Huh...?";
- mes "What is that";
- mes "supposed to mean?";
- close;
- }
- else if(@temp1 == 3 && @temp2 == 2)
- {
- mes "[Phendark]";
- mes "I can't believe";
- mes "something like that!";
- mes "Oh, that doesn't matter.";
- mes "Zealotus is too good for me.";
- mes "I'm not even worthy of tasting";
- mes "the sting of her Love Whip.";
- emotion e_sob;
- close;
- }
- break;
-
- case 4:
- mes "Zealotus.";
- break;
- }
- switch( select( "Insult him.", "Apologize." ) )
- {
- case 1:
- mes "[" + strcharinfo(0) + "]";
- mes "First of all,";
- mes "what exactly sets";
- mes "you apart from all the";
- mes "other eligible monsters";
- mes "that she can choose from?";
- mes "Not like you're much better...";
- next;
- mes "[Phendark]";
- mes "...";
- mes "......";
- next;
- switch( select( "Break his pride.", "Tell him you were joking." ) )
- {
- case 1:
- mes "^3131FF[" + strcharinfo(0) + "]^000000";
- mes "I mean, there are guys";
- mes "like Bloody Murderer out";
- mes "there who are more evil";
- mes "than you, and best of all,";
- mes "not afraid of humans!";
- next;
- switch( select( "Go for the low blow.", "Try to salvage his confidence." ) )
- {
- case 1:
- mes "[" + strcharinfo(0) + "]";
- mes "You know, me and Zealotus";
- mes "were actually talking about";
- mes "you recently. She told me that";
- mes "the sight of you makes her";
- mes "feel sick! I mean, what kind";
- mes "of monster is afraid of humans?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Now you've reached the";
- mes "point where even Injustice";
- mes "is manlier than you now,";
- mes "if you know what I mean!";
- mes "Hahahahahahahahaha!";
- next;
- mes "[Phendark]";
- mes "...";
- mes "......";
- next;
- mes "[Phendark]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Phendark]";
- mes "...";
- mes "......";
- mes ".........";
- mes "............";
- next;
- mes "[Phendark]";
- mes "GRRRRRR!";
- mes "THAT'S ENOUGH!";
- emotion e_ag;
- next;
- mes "[Phendark]";
- mes "I don't care who the";
- mes "hell she is, I'm going";
- mes "to see Zealotus and give";
- mes "that tramp a piece of my";
- mes "mind! Grrrr! She'll be sorry!";
- set ZLMASKQ,6;
- emotion e_an;
- close;
- break;
-
- case 2:
- mes "^3131FF[" + strcharinfo(0) + "]^000000";
- mes "But know that I think";
- mes "about it, maybe you look";
- mes "much tougher than that";
- mes "Bloody Murderer guy.";
- next;
- mes "[Phendark]";
- mes "*Sniff sniff*";
- mes "You really think so?";
- next;
- mes "...";
- mes "......";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...Yeeeeeah.";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[" + strcharinfo(0) + "]";
- mes "But now that I think";
- mes "about it, you actually";
- mes "are much better than all";
- mes "those other monsters.";
- mes "That stuff I said before?";
- mes "I was just kidding you.";
- next;
- mes "[Phendark]";
- mes "^333333*Sniff!*^000000";
- mes "You're...";
- mes "Not helping!";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[" + strcharinfo(0) + "]";
- mes "I...";
- mes "I was just kidding!";
- mes "How could she hate";
- mes "somebody like you?";
- next;
- mes "[Phendark]";
- mes "No... No.";
- mes "You're right.";
- mes "I don't deserve love.";
- mes "Not from Zealotus or";
- mes "from anybody else...";
- close;
- break;
- }
- }
- else if(ZLMASKQ > 5)
- {
- mes "[Phendark]";
- mes "Zealotus! How dare";
- mes "she say those things";
- mes "against me! Less manly";
- mes "than Injustice?! I'll just";
- mes "have to prove her wrong!";
- mes "Out the way, pithy human!";
- close;
- }
-
-}
-
-gl_prison1.gat,100,48,5 script Rybio#LhzHat 1201,{
-
- if(ZLMASKQ == 2)
- {
- mes "[Rybio]";
- mes "You know, I usually just";
- mes "run up and slash like crazy";
- mes "once I see you humans, but";
- mes "my heart's not in it today, so";
- mes "I'm gonna give you just one";
- mes "chance to run for your life.";
- next;
- switch( select( "Talk about Phendark.", "Run for your life." ) )
- {
- case 1:
- mes "[Rybio]";
- mes "What th--? You know the";
- mes "same Phendark I know?";
- mes "Dayam, that's weird. But";
- mes "yeah, him and Zealotus have";
- mes "some kind of... I dunno what";
- mes "it is, actually. Um, love?";
- next;
- mes "[Rybio]";
- mes "Anyway, Phendark has";
- mes "been acting really weird";
- mes "lately. I guess Zealotus";
- mes "loved him to the point that";
- mes "she abused him to the point";
- mes "that he's scared of humans now.";
- next;
- mes "[Rybio]";
- mes "Huh. You know what'd help?";
- mes "Dark Crystal Fragments. It's";
- mes "worthless to humans, but if";
- mes "creatures of darkness eat it,";
- mes "it brings out more of their";
- mes "inner demon. Scary, huh?";
- next;
- mes "[Rybio]";
- mes "Since Phendark's pretty big, and he's acting like a total wuss, you";
- mes "you should probably get him to eat ^3131FF369 Dark Crystal Fragments^000000. Don't";
- mes "worry, you should be able to find those all over Rune-Midgard.";
- next;
- mes "[Rybio]";
- mes "I dunno why a human";
- mes "like you would want to";
- mes "help one of us out, though.";
- mes "What's in it for you, exactly?";
- set ZLMASKQ,3;
- close;
- break;
-
- case 2:
- mes "[Rybio]";
- mes "That's right!";
- mes "Run, get outta here!";
- mes "If you're not fast enough,";
- mes "I might eat you, human!";
- mes "...Well... Probably not.";
- close;
- break;
- }
- }
- else if(ZLMASKQ == 3)
- {
- mes "[Rybio]";
- mes "I don't get why someone";
- mes "like you, a seemingly heroic";
- mes "adventurer, would want to help";
- mes "out Phendark? Did Zealotus";
- mes "blackmail you or something?";
- next;
- mes "[Rybio]";
- mes "Well, you could";
- mes "probably help him";
- mes "by getting him to eat";
- mes "^3131FF369 Dark Crystal Fragments^000000";
- mes "to sort of stir up the demon";
- mes "that sleeping within, you know?";
- close;
- }
- else if(ZLMASKQ == 4)
- {
- mes "[Rybio]";
- mes "Feeding him all of those";
- mes "Dark Crystal Fragments didn't";
- mes "work? But that was supposed";
- mes "to be foolproof! Dayam, what";
- mes "the hell happened to Phendark's";
- mes "inner demon?! Man oh man...";
- next;
- mes "[Rybio]";
- mes "Well, I don't know what";
- mes "else you could try. I mean,";
- mes "maybe you could try motivating";
- mes "him. Reverse psychology?";
- mes "It's weird talking about this";
- mes "with a human. Hahahaha~";
- set ZLMASKQ,5;
- close;
- }
- else if(ZLMASKQ == 5)
- {
- mes "[Rybio]";
- mes "Phendark sure looks";
- mes "tough, but I guess even";
- mes "he isn't totally evil. Yeah.";
- mes "We monsters aren't all";
- mes "bad... Just mostly bad.";
- close;
- }
-
-}
+//===== eAthena Script =======================================
+//= 2005 Headgear Quests
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= 2005 Headgears Official Quest.
+//===== Additional Comments: =================================
+// 1.0 First version, converted from the official aegis script. [MasterOfMuppets]
+//============================================================
+
+yuno.gat,222,116,3 script Kasis#LhzHat 851,{
+
+ if(countitem(519) > 49 && countitem(7031) > 49 && countitem(548) > 49 && countitem(539) > 49)
+ {
+ mes "[Kasis]";
+ mes "Milk, Cheese,";
+ mes "Old Frying Pans,";
+ mes "Pieces of Cake...";
+ mes "Th-that's everything";
+ mes "I need to make lunch for";
+ mes "my friends in the Factory!";
+ next;
+ switch( select( "Well, I did promise to help you.", "What are you talking about?" ) )
+ {
+ case 1:
+ mes "[Kasis]";
+ mes "Finally, I can treat my";
+ mes "buddies to a wonderful";
+ mes "feast! They'll be so pleased!";
+ mes "Oh, I'd really like to repay you";
+ mes "somehow, but I'm not sure";
+ mes "what I could possibly give...";
+ next;
+ mes "[Kasis]";
+ mes "Of course! Why don't";
+ mes "you treat yourself to";
+ mes "my specialty, Kasis's";
+ mes "Crunch Toast? It looks";
+ mes "simple, but it actually";
+ mes "requires great skill to make.";
+ next;
+ mes "[Kasis]";
+ mes "Here you are!";
+ mes "Please enjoy this and always";
+ mes "remember that breakfast is the";
+ mes "most important meal of the day!";
+ mes "Now, I better prepare those";
+ mes "lunches. Goodbye, my friend~";
+ delitem 519,50;
+ delitem 7031,50;
+ delitem 548,50;
+ delitem 539,50;
+ getitem 5107,1;
+ close;
+ break;
+
+ case 2:
+ mes "[Kasis]";
+ mes "Oh...";
+ mes "Oh, I'm so sorry.";
+ mes "I must have confused";
+ mes "you with someone else.";
+ next;
+ mes "[Kasis]";
+ mes "You see, I've been asking";
+ mes "adventurers that have been";
+ mes "passing through to provide";
+ mes "me with food supplies so that";
+ mes "I can make lunch for my friends";
+ mes "that are working in Einbroch.";
+ next;
+ mes "[Kasis]";
+ mes "Yes...";
+ mes "So...";
+ mes "Sorry...";
+ mes "To... Bother you.";
+ next;
+ mes "^3355FFAs if entranced,";
+ mes "Kasis continues to";
+ mes "stare at the Milk, Cheese";
+ mes "Old Frying Pans and Pieces";
+ mes "of Cake that you are carrying.^000000";
+ next;
+ switch( select( "You can have these if you want.", "Um, why are you staring?" ) )
+ {
+ case 1:
+ mes "[Kasis]";
+ mes "Really? Is it alright";
+ mes "with you for me to have";
+ mes "all of this Milk, Cheese,";
+ mes "Pieces of Cake and these";
+ mes "Old Frying Pans? Oh, bless";
+ mes "your kind heart, adventurer~";
+ next;
+ mes "[Kasis]";
+ mes "Finally, I can treat my";
+ mes "buddies to a wonderful";
+ mes "feast! They'll be so pleased!";
+ mes "Oh, I'd really like to repay you";
+ mes "somehow, but I'm not sure";
+ mes "what I could possibly give...";
+ next;
+ mes "[Kasis]";
+ mes "Of course! Why don't";
+ mes "you treat yourself to";
+ mes "my specialty, Kasis's";
+ mes "Crunch Toast? It looks";
+ mes "simple, but it actually";
+ mes "requires great skill to make.";
+ next;
+ mes "[Kasis]";
+ mes "Here you are!";
+ mes "Please enjoy this and always";
+ mes "remember that breakfast is the";
+ mes "most important meal of the day!";
+ mes "Now, I better prepare those";
+ mes "lunches. Goodbye, my friend~";
+ delitem 519,50;
+ delitem 7031,50;
+ delitem 548,50;
+ delitem 539,50;
+ getitem 5107,1;
+ close;
+ break;
+
+ case 2:
+ mes "[Kasis]";
+ mes "Oh, let me apologize";
+ mes "again. But I can't help";
+ mes "but admire the quality of";
+ mes "your goods. Er, you know,";
+ mes "the food you're carrying. I'm";
+ mes "a chef by trade, after all.";
+ close;
+ break;
+ }
+ break;
+ }
+ }
+ mes "[Kasis]";
+ mes "I'm sorry, but we're closed";
+ mes "right now. Unfortunately, we";
+ mes "don't have any more bread";
+ mes "in stock. ^333333*Siiiiiiiiigh...*^000000";
+ next;
+ switch( select( "Is something wrong?", "End Conversation." ) )
+ {
+ case 1:
+ mes "[Kasis]";
+ mes "Well, my current contract";
+ mes "with the company that's been";
+ mes "providing me with ingredients";
+ mes "has expired. Of course, it's";
+ mes "bad enough that I don't have";
+ mes "the food to run this business.";
+ next;
+ mes "[Kasis]";
+ mes "But I also feel like I'm";
+ mes "letting my friends down.";
+ mes "You see, I've been sending";
+ mes "them lunch every day since";
+ mes "they've been working in the";
+ mes "Factory over in Einbroch.";
+ next;
+ mes "[Kasis]";
+ mes "I'm unable to make";
+ mes "lunch for them at the";
+ mes "moment, but I really want to";
+ mes "help my buddies, especially";
+ mes "since their financial situation";
+ mes "seems pretty bad right now.";
+ next;
+ switch( select( "Do you want me to help you?", "I'm so sorry to hear that." ) )
+ {
+ case 1:
+ mes "[Kasis]";
+ mes "Sure, I'm willing to accept";
+ mes "help from wherever I can find";
+ mes "it. If you would, I'd like you to bring me some food supplies";
+ mes "that I can use to make lunches";
+ mes "for my friends at the Factory.";
+ next;
+ mes "[Kasis]";
+ mes "Would you";
+ mes "please get me";
+ mes "^4D4DFF50 Milk^000000,";
+ mes "^4D4DFF50 Cheese^000000,";
+ mes "^4D4DFF50 Pieces of Cake^000000 and";
+ mes "^4D4DFF50 Old Frying Pans^000000?";
+ next;
+ mes "[Kasis]";
+ mes "I'd really appreciate";
+ mes "your help. My friends seem";
+ mes "so depressed to be working";
+ mes "in the Factory and I want to";
+ mes "do all I can to cheer them up.";
+ mes "Thanks for your kind offer~";
+ close;
+ break;
+
+ case 2:
+ mes "[Kasis]";
+ mes "I'm trying to renew";
+ mes "my contract with the";
+ mes "company that's been";
+ mes "providing me with food";
+ mes "supplies, but it hasn't";
+ mes "been working out so far...";
+ next;
+ mes "[Kasis]";
+ mes "I don't know what's";
+ mes "happening, but hopefully";
+ mes "I can find a new supplier";
+ mes "soon. There are my friends";
+ mes "to worry about, as well as";
+ mes "the sake of my business.";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Kasis]";
+ mes "Anyway, please come";
+ mes "again. Hopefully, we'll";
+ mes "have some good bread";
+ mes "in stock next time, okay?";
+ close;
+ break;
+ }
+
+}
+
+lighthalzen.gat,143,68,0 script Strange Guy#LhzHat 47,{
+
+ if(DTHATQ == 0)
+ {
+ mes "[Strange Guy]";
+ mes "Wait! Don't say";
+ mes "anything! You must be";
+ mes "an adventurer from the";
+ mes "Rune-Midgarts Kingdom!";
+ mes "So... I'm right, aren't I?";
+ next;
+ switch( select( "Who are you?", "How did you know?", "Ignore him." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Allow me to";
+ mes "introduce myself.";
+ mes "My name is Morris Poe,";
+ mes "detective of great acclaim";
+ mes "and world wide fame.";
+ next;
+ switch( select( "I've never heard of you.", "You're kidding me.", "I'm outta here." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Morris Poe?";
+ mes "Renown detective?";
+ mes "Advocate for justice in";
+ mes "the Schwaltzvalt Republic?";
+ mes "Surely you recognize one";
+ mes "of my esteemed titles.";
+ next;
+ switch( select( "Nope, I don't know you.", "You're Morris Poe?!" ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "You don't...?";
+ mes "But I'm a famous hero.";
+ mes "Children look up to me";
+ mes "and wish they'd grow";
+ mes "up to be as smart as me.";
+ next;
+ mes "[Morris]";
+ mes "I don't get it.";
+ mes "I'm famouser than";
+ mes "that. A household name";
+ mes "even. I've got a sterling";
+ mes "public image, how could";
+ mes "you never have heard of me...?";
+ close;
+ break;
+
+ case 2:
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "Kidding? Ha ha!";
+ mes "Look at these keen,";
+ mes "deductive and deeply";
+ mes "analytical eyes and";
+ mes "tell me I'm joking.";
+ next;
+ switch( select( "Whoa, those ARE keen eyes.", "Okay. You're joking." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Yes, this sharp,";
+ mes "penetrating, yet";
+ mes "highly intelligent gaze";
+ mes "belongs to the world";
+ mes "detective and crime";
+ mes "fighter, Morris Poe!";
+ next;
+ switch( select( "I've never heard of you.", "Golly, Morris Poe?!" ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Never heard of...?";
+ mes "Impossible! If there are";
+ mes "two things I hate more";
+ mes "than crime, they would be";
+ mes "dishonesty... And rejection";
+ mes "from beautiful women.";
+ next;
+ mes "[Morris]";
+ mes "When you get over your";
+ mes "sense of pride and gain";
+ mes "a little maturity, then we";
+ mes "might share an actual";
+ mes "conversation. Until then,";
+ mes "you'll just have to grow up.";
+ close;
+ break;
+
+ case 2:
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "Hahahahahaah--Huh.";
+ mes "If there are two things";
+ mes "I hate more than criminals,";
+ mes "they would be sarcasm...";
+ mes "And receiving fake phone";
+ mes "numbers from really cute girls.";
+ next;
+ switch( select( "Yeah, you're no Don Juan.", "I'm... I'm sorry." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Wah...!";
+ mes "Did you just--?!";
+ mes "Ugh, you're the worst";
+ mes "type of person, you know that?";
+ emotion e_omg;
+ close;
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "I think it's too late to";
+ mes "apologize. Why would you";
+ mes "treat someone of my stature";
+ mes "with such caustic sarcasm?!";
+ mes "What excuse could possibly";
+ mes "exonerate your behavior?!";
+ next;
+ switch( select( "I... I was intimidated...", "It's how I treat all losers." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Of course: intense feelings";
+ mes "of awe and fear of my vast";
+ mes "intellect would result in that";
+ mes "kind of deviant behavior. I'll";
+ mes "have to forgive you, I suppose.";
+ next;
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "What...?!";
+ mes "Morris Poe, a loser?";
+ mes "Such defamatory remarks";
+ mes "cannot be forgiven, no";
+ mes "matter how unfounded";
+ mes "and groundless they are!";
+ emotion e_omg;
+ close;
+ break;
+ }
+ break;
+ }
+ break;
+ }
+ break;
+
+ case 3:
+ mes "[Morris]";
+ mes "Hahaha, oh, that's";
+ mes "funny. Wait. You're...";
+ mes "You're really leaving.";
+ mes "N-no, come baaaack!";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Strange Guy]";
+ mes "How did I know?";
+ mes "Elementary, my friend.";
+ mes "There was an abundance";
+ mes "of clues for me to make";
+ mes "that sort of simple deduction.";
+ close;
+ break;
+
+ case 3:
+ mes "[Strange Guy]";
+ mes "Hello...?";
+ mes "...............";
+ mes "Oh, this is embarassing.";
+ mes "I can't believe I'm getting";
+ mes "the silent treatment...";
+ close;
+ break;
+ }
+
+ mes "[Morris]";
+ mes "Yes, I know it's";
+ mes "difficult to believe that";
+ mes "you would be fortunate";
+ mes "enough to stand in the";
+ mes "presence of genius. Now,";
+ mes "you must be wondering...";
+ next;
+ menu "Um, wondering what?",-;
+ mes "[Morris]";
+ mes "You're wondering,";
+ mes "\"How in the world";
+ mes "can I be as brilliant";
+ mes "as Morris Poe, the";
+ mes "genius detective?\"";
+ next;
+ mes "[Morris]";
+ mes "First, I think it's fair";
+ mes "to let you know that it's";
+ mes "an impossible dream. Men like";
+ mes "myself only arise in this world";
+ mes "perhaps once every generation.";
+ mes "I'm sorry, but don't give up!";
+ next;
+ mes "[Morris]";
+ mes "Now, you can try to reach";
+ mes "a level of intelligence that";
+ mes "is comparable to my own by";
+ mes "joining the Young Detective's";
+ mes "Club. To become a member, you just need one essential article.";
+ next;
+ mes "[Morris]";
+ mes "Yes, you will need the";
+ mes "^0000FFRenown Detective's Cap^000000!";
+ mes "Luckily, I'm giving them";
+ mes "away for a relatively small";
+ mes "material cost, but you must";
+ mes "hurry while supplies last.";
+ next;
+ mes "[Morris]";
+ mes "Simply bring me";
+ mes "^0000FF10 Magnifiers^000000,";
+ mes "^0000FF1887 Tassels^000000,";
+ mes "^0000FF1 Slotted Bucket Hat^000000";
+ mes "and ^0000FF1,887 zeny^000000. That's all!";
+ next;
+ mes "[Morris]";
+ mes "But first, let me warn you";
+ mes "not to bring a ^FF0000slotted Bucket";
+ mes "Hat with a card compounded to";
+ mes "it, or any upgraded Bucket Hats. I'm not responsible for any";
+ mes "loss resulting from that.";
+ next;
+ mes "[Morris]";
+ mes "Hurry and bring me";
+ mes "those items! There are";
+ mes "only 20,000,000 Renown";
+ mes "Detective Caps left!";
+ mes "Once they're gone,";
+ mes "they'll be extinct!";
+ set DTHATQ,1;
+ close;
+ }
+ else if(DTHATQ == 1)
+ {
+ mes "[Morris]";
+ mes "So, did you want to";
+ mes "buy, er, receive this";
+ mes "Renown Detective's Cap";
+ mes "and become an honored";
+ mes "member of the Young";
+ mes "Detective's Club?";
+ next;
+ mes "[Morris]";
+ mes "Remember, make sure";
+ mes "that you don't bring any";
+ mes "^FF0000slotted Bucket Hats that";
+ mes "have been upgraded or have";
+ mes "cards compounded to them, or";
+ mes "you'll lose those enhancements^000000.";
+ next;
+ mes "[Morris]";
+ mes "Now, if you have only";
+ mes "1 Bucket Hat, we can begin.";
+ mes "Young Detective's Club... Salute! ";
+ next;
+ switch( select( "Salute.", "Whatever..." ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Great, done like a pro!";
+ mes "Now, I need to check your";
+ mes "fee--I mean qualifications.";
+ mes "Let's see now, I need to";
+ mes "look through your Inventory...";
+ next;
+ set @lhzhatfailed,0;
+ if(countitem(611) < 10)
+ {
+ mes "[Morris]";
+ mes "Wait. You don't have";
+ mes "enough Magnifiers. You";
+ mes "do want to join this club,";
+ mes "don't you? Did you need to";
+ mes "hear the requirements again?";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(7301) < 1887 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Not enough Tassels? Check.";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(5120) < 1 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Hm. You're missing";
+ mes "the slotted Bucket Hat.";
+ mes "You were so close...";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(Zeny < 1887 && failed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Slotted Bucket Hat. Got it.";
+ mes "Hey. Where's the zeny?!";
+ mes "That's the most important,";
+ mes "er, qualification of all!";
+ set @lhzhatfailed,1;
+ next;
+ }
+
+ if(@lhzhatfailed == 1)
+ {
+ mes "[Morris]";
+ mes "^333333*Sigh*^000000 You need";
+ mes "^0000FF10 Magnifiers^000000,";
+ mes "^0000FF1887 Tassels^000000,";
+ mes "^0000FF1 Slotted Bucket Hat^000000";
+ mes "and ^0000FF1,887 zeny^000000. That's all!";
+ emotion e_an;
+ next;
+ mes "[Morris]";
+ mes "Now, remember everything";
+ mes "that you need this time, okay?";
+ mes "I'll be next;ing to welcome";
+ mes "you into the elite ranks of ";
+ mes "the Young Detective's Club.";
+ close;
+ }
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Slotted Bucket Hat. Got it.";
+ mes "Aaaand zeny. Heh heh. Perfect.";
+ next;
+ mes "[Morris]";
+ mes "Great, that's everything!";
+ mes "Welcome to the club! Here's";
+ mes "your Renown Detective's Cap,";
+ mes "so wear it with pride as you";
+ mes "take an active part in our club's";
+ mes "activities and promotion!";
+ delitem 7301,1887;
+ delitem 5120,1;
+ delitem 611,10;
+ set Zeny, Zeny - 1887;
+ set DTHATQ,2;
+ getitem 5108,1;
+ next;
+ switch( select( "Wait, promotion?", "Hooray!" ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "Of course, isn't it obvious?";
+ mes "As a member, one of your duties";
+ mes "will be to sing accolades of this club so that more members";
+ mes "will join and earn their own";
+ mes "Renown Detective's Caps.";
+ next;
+ mes "[Morris]";
+ mes "Alright, scurry off";
+ mes "now and proudly display";
+ mes "your new, rakishly stylish";
+ mes "Renown Detective's Cap";
+ mes "to all of your friends!";
+ close;
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "Alright, scurry off";
+ mes "now and proudly display";
+ mes "your new, rakishly stylish";
+ mes "Renown Detective's Cap";
+ mes "to all of your friends!";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "Huh. You just failed";
+ mes "the \"Test of Respect.\"";
+ mes "You don't deserve the";
+ mes "honor of wearing the";
+ mes "Renowned Detective's Cap!";
+ close;
+ break;
+ }
+ }
+ else if(DTHATQ == 2)
+ {
+ mes "[Morris]";
+ mes "Have you come to me";
+ mes "in order to obtain another";
+ mes "Renown Detective's Cap?";
+ mes "I realize that such a stylish";
+ mes "headgear is in high demand.";
+ next;
+ mes "[Morris]";
+ mes "Remember, make sure";
+ mes "that you don't bring any";
+ mes "^FF0000slotted Bucket Hats that";
+ mes "have been upgraded or have";
+ mes "cards compounded to them, or";
+ mes "you'll lose those enhancements^000000.";
+ next;
+ mes "[Morris]";
+ mes "As a proud member of";
+ mes "the Young Detective's Club,";
+ mes "did you bring everything";
+ mes "you need in order to earn";
+ mes "a Renown Detective's Cap?";
+ next;
+ switch( select( "I'm not sure~", "Sure!" ) )
+ {
+ case 1:
+ mes "[Morris]";
+ mes "What...?! Every good";
+ mes "detective must have a";
+ mes "photographic memory";
+ mes "and be able to recall";
+ mes "minute details in order";
+ mes "to crack the case.";
+ emotion e_sob;
+ next;
+ mes "[Morris]";
+ mes "Remember...";
+ mes "^0000FF10 Magnifiers^000000,";
+ mes "^0000FF1887 Tassels^000000,";
+ mes "^0000FF1 Slotted Bucket Hat^000000";
+ mes "and ^0000FF1,887 zeny^000000. Okay?";
+ close;
+ break;
+
+ case 2:
+ mes "[Morris]";
+ mes "Great!";
+ mes "Now let me just";
+ mes "check to see if you";
+ mes "brought everything...";
+ next;
+ set @lhzhatfailed,0;
+ if(countitem(611) < 10)
+ {
+ mes "[Morris]";
+ mes "Hmm, you don't have";
+ mes "enough Magnifiers? But";
+ mes "those are essential tools";
+ mes "for sleuthing. Come now,";
+ mes "hurry back with them!";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(7301) < 1887 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Not enough Tassels? Check.";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(5120) < 1 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Hm. You're missing";
+ mes "the slotted Bucket Hat.";
+ mes "You were so close...";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(Zeny < 1887 && failed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Slotted Bucket Hat. Got it.";
+ mes "Hey. Where's the zeny?!";
+ mes "That's the most important,";
+ mes "er, qualification of all!";
+ set @lhzhatfailed,1;
+ next;
+ }
+
+ if(@lhzhatfailed == 1)
+ {
+ mes "[Morris]";
+ mes "Remember...";
+ mes "^0000FF10 Magnifiers^000000,";
+ mes "^0000FF1887 Tassels^000000,";
+ mes "^0000FF1 Slotted Bucket Hat^000000";
+ mes "and ^0000FF1,887 zeny^000000. Okay?";
+ emotion e_an;
+ close;
+ } set @lhzhatfailed,0;
+ if(countitem(611) < 10)
+ {
+ mes "[Morris]";
+ mes "Hmm, you don't have";
+ mes "enough Magnifiers? But";
+ mes "those are essential tools";
+ mes "for sleuthing. Come now,";
+ mes "hurry back with them!";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(7301) < 1887 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Not enough Tassels? Check.";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(countitem(5120) < 1 && @lhzhatfailed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Hm. You're missing";
+ mes "the slotted Bucket Hat.";
+ mes "You were so close...";
+ set @lhzhatfailed,1;
+ next;
+ }
+ if(Zeny < 1887 && failed == 0)
+ {
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Slotted Bucket Hat. Got it.";
+ mes "Hey. Where's the zeny?!";
+ mes "That's the most important,";
+ mes "er, qualification of all!";
+ set @lhzhatfailed,1;
+ next;
+ }
+
+ if(@lhzhatfailed == 1)
+ {
+ mes "[Morris]";
+ mes "Remember...";
+ mes "^0000FF10 Magnifiers^000000,";
+ mes "^0000FF1887 Tassels^000000,";
+ mes "^0000FF1 Slotted Bucket Hat^000000";
+ mes "and ^0000FF1,887 zeny^000000. Okay?";
+ emotion e_an;
+ close;
+ }
+ mes "[Morris]";
+ mes "Magnifiers. Check.";
+ mes "Tassels... Check.";
+ mes "Slotted Bucket Hat. Got it.";
+ mes "Aaaand zeny. Heh heh. Perfect.";
+ next;
+ mes "[Morris]";
+ mes "Great! You've just qualified";
+ mes "to own yet another Renowned";
+ mes "Detective's Cap. Congratulations! Now, let me collect all of these";
+ mes "goods and zeny from you...";
+ delitem 7301,1887;
+ delitem 5120,1;
+ delitem 611,10;
+ set Zeny, Zeny - 1887;
+ set DTHATQ,2;
+ getitem 5108,1;
+ next;
+ mes "[Morris]";
+ mes "Hahaha! It's what";
+ mes "I expect from one of";
+ mes "our Junior Gold Members!";
+ mes "How does it feel like to be";
+ mes "the cream of the cream of";
+ mes "the crop? Great, isn't it?";
+ close;
+ break;
+ }
+ }
+
+}
+
+lighthalzen.gat,360,313,3 script Boy#LhzHat 706,{
+
+ mes "[Boy]";
+ mes "Hello, mister!";
+ mes "Um, would you do";
+ mes "me a favor, please?";
+ next;
+ if(countitem(526) && countitem(7270) && countitem(941) && countitem(10004))
+ {
+ mes "[Boy]";
+ mes "Oh! You brought me";
+ mes "some Royal Jelly to";
+ mes "eat, as well as everything";
+ mes "I need to make a Baby Pacifier.";
+ mes "Okay, let me get started on that right away. Just a moment...";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "[Boy]";
+ mes "Damn.";
+ mes "That Royal Jelly";
+ mes "was frickin' delicious!";
+ mes "Now I can make your";
+ mes "Baby Pacifier. Let's see";
+ mes "here. Ah, here we go...";
+ delitem 526,1;
+ next;
+ mes "[Boy]";
+ mes "It's done!";
+ mes "Now, you're the";
+ mes "proud owner of your";
+ mes "very own Baby Pacifier!";
+ mes "I hope you're happy with";
+ mes "yourself. Travel safe, okay?";
+ delitem 7270,1;
+ delitem 941,1;
+ delitem 10004,1;
+ getitem 5110,1;
+ close;
+ }
+ switch( select( "What do you need?", "Sorry, kid..." ) )
+ {
+ case 1:
+ mes "[Boy]";
+ mes "Well, my mom has been";
+ mes "sick recently, so both of";
+ mes "us haven't been able to eat";
+ mes "for the past few days. But";
+ mes "if she doesn't eat, how does";
+ mes "she expect to get better?";
+ emotion e_sob;
+ next;
+ mes "[Boy]";
+ mes "So I guess what I'm";
+ mes "asking is, would you be";
+ mes "able to spare some food?";
+ next;
+ switch( select( "Help him.", "Refuse to help." ) )
+ {
+ case 1:
+ if(!countitem(526))
+ {
+ mes "[Boy]";
+ mes "If you would, do you think";
+ mes "you can get some Royal Jelly";
+ mes "that I can give to my mom? The old lady next door says that it's";
+ mes "really nutritious and helps you get better faster if you're sick.";
+ next;
+ mes "[Boy]";
+ mes "My mom would be mad";
+ mes "at me if she found out";
+ mes "I was begging for it, but";
+ mes "Royal Jelly is too expensive";
+ mes "for me to get without any help!";
+ close;
+ }
+ mes "[Boy]";
+ mes "Oh, would it be alright";
+ mes "if I have this Royal Jelly?";
+ mes "It would really help my mom";
+ mes "feel better. Thanks so much~";
+ delitem 526,1;
+ next;
+ mes "[Boy]";
+ mes "Hey, to pay you back, why";
+ mes "don't I make a Baby Pacifier";
+ mes "for you? I learned how to make";
+ mes "one when my baby brother was";
+ mes "born. But first, I'll need some";
+ mes "materials to put it together...";
+ next;
+ mes "[Boy]";
+ mes "Would you";
+ mes "please bring";
+ mes "^3131FF1 Nursing Bottle^000000,";
+ mes "^3131FF1 Nose Ring^000000 and";
+ mes "^3131FF1 Pacifier^000000? Oh, and one";
+ mes "more ^3131FFRoyal Jelly^000000 for me~";
+ close;
+ break;
+
+ case 2:
+ mes "[Boy]";
+ mes "Oh... Um, that's";
+ mes "alright. Maybe I was";
+ mes "asking too much from";
+ mes "you. I mean, it's true";
+ mes "that you barely know me...";
+ emotion e_sob;
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Boy]";
+ mes "Th-that's okay.";
+ mes "I guess you must";
+ mes "be so busy that you";
+ mes "don't even have the";
+ mes "time to listen to some";
+ mes "little boy's problems...";
+ emotion e_sob;
+ close;
+ break;
+ }
+
+}
+
+einbech.gat,70,222,5 script Mater#LhzHat 91,{
+
+ if(countitem(983) && countitem(7267) > 998 && countitem(749) && Zeny > 49999)
+ {
+ mes "[Mater]";
+ mes "Oh, hello, what's this?";
+ mes "You're carrying 1 Black";
+ mes "Dyestuffs, 1 Frozen Rose,";
+ mes "999 Tiger Panties and even";
+ mes "50,000 zeny with you. That's";
+ mes "enough to make a Winter Hat...";
+ next;
+ mes "[Mater]";
+ mes "Um, would you mind letting";
+ mes "me have those items so that";
+ mes "I can make a Winter Hat?";
+ mes "I'd never be able to gather";
+ mes "those things on my own...";
+ next;
+ switch( select( "Let her have the items.", "Don't give her the items." ) )
+ {
+ case 1:
+ mes "[Mater]";
+ mes "Oh, thank you so much!";
+ mes "I've always wanted to make";
+ mes "this hat and try it on, even";
+ mes "if it's just once. But don't";
+ mes "worry, I'll give it to you~";
+ mes "Now please next; a moment...";
+ next;
+ mes "[Mater]";
+ mes "Let's see...";
+ mes "I've got to fold";
+ mes "the rose like this...";
+ mes "Be careful with the dye...";
+ mes "Where did I put all those";
+ mes "pan--Oh, here we are.";
+ next;
+ mes "[Mater]";
+ mes "^333333*Whew!*^000000";
+ mes "Finally, it's done!";
+ mes "Now, if you don't mind,";
+ mes "let me try this hat on";
+ mes "for just a little while.";
+ delitem 983,1;
+ delitem 7267,999;
+ delitem 749,1;
+ set Zeny,Zeny - 50000;
+ getitem 5115,1;
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "[Mater]";
+ mes "Ahhhhhh~";
+ mes "It just feels...";
+ mes "I felt so free~";
+ mes "It was everything";
+ mes "I imagined it to be.";
+ next;
+ mes "[Mater]";
+ mes "Here, please take";
+ mes "this Winter Hat. I really";
+ mes "hope that you'll enjoy it";
+ mes "as much as I do. Well then,";
+ mes "be safe in your travels, okay?";
+ close;
+ break;
+
+ case 2:
+ mes "[Mater]";
+ mes "I'm sorry, I know that";
+ mes "I was asking a pretty big";
+ mes "favor from someone I just";
+ mes "met. I hope you understand";
+ mes "how much I really want to";
+ mes "make that Winter Hat...";
+ close;
+ break;
+ }
+ }
+ mes "[Mater]";
+ mes "Look at that blue";
+ mes "sky. Don't you wish";
+ mes "you could just soar";
+ mes "through the heavens";
+ mes "with your own wings?";
+ next;
+ mes "[Mater]";
+ mes "Of course, it's an";
+ mes "impossible dream,";
+ mes "but with this Winter Hat,";
+ mes "you can at least enjoy the";
+ mes "sensation of freedom that";
+ mes "a bird in flight must feel.";
+ next;
+ mes "[Mater]";
+ mes "If you would like";
+ mes "a hat like this, I would";
+ mes "need to have some items";
+ mes "that I don't think I can ever";
+ mes "obtain on my very own.";
+ next;
+ mes "[Mater]";
+ mes "^FF00001 Black Dyestuffs^000000,";
+ mes "^FF0000999 Tiger Panties^000000,";
+ mes "^FF00001 Frozen Rose^000000 and";
+ mes "^FF000050,000 zeny^000000. If you can";
+ mes "bring those to me, I shall";
+ mes "make you a Winter Hat.";
+ close;
+
+}
+
+lhz_in02.gat,91,38,5 script Margaret Mary#LhzHat 90,{
+
+ mes "[Margaret Mary]";
+ mes "The white rose, in its";
+ mes "purity and simplicity, is";
+ mes "like a woman who doesn't";
+ mes "need jewels or fancy dresses";
+ mes "to look noble and beautiful. It's the perfect gift for a lady.";
+ next;
+ switch( select( "Make a Mystic Rose.", "End Conversation." ) )
+ {
+ case 1:
+ if(countitem(731) > 9 && countitem(748) > 1 && countitem(982) && Zeny > 49999)
+ {
+ mes "[Margaret Mary]";
+ mes "Ah, I see that you've brought";
+ mes "what I need to bleach the blood";
+ mes "red hue from these Witherless";
+ mes "Roses and adorn these flowers";
+ mes "with eternal elegance. May I use these items to make a Mystic Rose?";
+ next;
+ switch( select( "Yes", "No" ) )
+ {
+ case 1:
+ mes "[Margaret Mary]";
+ mes "Thank you. Please";
+ mes "next; a moment while";
+ mes "I concentrate in order to";
+ mes "preserve the natural beauty";
+ mes "of these gorgeous flowers...";
+ next;
+ mes "[Margaret Mary]";
+ mes "The rose truly is the";
+ mes "undisputed queen of all";
+ mes "flowers. All other flora must";
+ mes "humbly bow to its regal beauty.";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Margaret Mary]";
+ mes "There, it is finished.";
+ mes "Please remember to wear";
+ mes "your hair in an elegant and";
+ mes "refined manner when wearing";
+ mes "the Mystic Rose so as not to disgrace these beautiful flowers.";
+ delitem 731,10;
+ delitem 748,2;
+ delitem 982,1;
+ set Zeny,Zeny - 50000;
+ getitem 5117,1;
+ close;
+ break;
+
+ case 2:
+ mes "[Margaret Mary]";
+ mes "White roses with thorns";
+ mes "makes my heart beat with";
+ mes "unceasing trepidation. What";
+ mes "if I prick my finger and shed";
+ mes "blood on its snow white petals?";
+ close;
+ break;
+ }
+ }
+ mes "[Margaret Mary]";
+ mes "I love roses, but it makes";
+ mes "me sad that their beauty";
+ mes "fades far too soon. And so,";
+ mes "I've found a way to preserve";
+ mes "the beauty of the roses, so";
+ mes "that it lasts for all eternity.";
+ next;
+ mes "[Margaret Mary]";
+ mes "Do you love roses as well?";
+ mes "If you like, I can make a";
+ mes "^3131FFMystic Rose^000000 that you can wear";
+ mes "upon your crown. It's not easy";
+ mes "for me to create, but I believe that you would enjoy it greatly.";
+ next;
+ mes "[Margaret Mary]";
+ mes "Please bring me";
+ mes "^3131FF10 2 Carat Diamonds^000000,";
+ mes "^3131FF3 Witherless Roses^000000,";
+ mes "^3131FF1 White Dyestuffs^000000 and";
+ mes "^3131FF50,000 zeny^000000 if you would";
+ mes "like to have a Mystic Rose.";
+ close;
+ break;
+
+ case 2:
+ mes "[Margaret Mary]";
+ mes "White roses with thorns";
+ mes "makes my heart beat with";
+ mes "unceasing trepidation. What";
+ mes "if I prick my finger and shed";
+ mes "blood on its snow white petals?";
+ close;
+ break;
+ }
+
+}
+
+lighthalzen.gat,182,89,0 script Rich Girl#LhzHat 91,{
+
+ if(LHZBTQ == 0)
+ {
+ mes "[Rich Girl]";
+ mes "Hmmm...?";
+ mes "What? Did you";
+ mes "need something?";
+ next;
+ switch( select( "N-Nothing.", "Um, you look so relaxed." ) )
+ {
+ case 1:
+ mes "[Rich Girl]";
+ mes "Huh.";
+ mes "Alright then.";
+ mes "Well, try not to stare";
+ mes "at people so much.";
+ close;
+ break;
+
+ case 2:
+ mes "[Rich Girl]";
+ mes "Really? You are probably";
+ mes "the twentieth person to";
+ mes "tell me that today. Mmm.";
+ mes "That's strange, isn't it?";
+ next;
+ menu "I guess.",-,"It's not strange at all.",-;
+ mes "[Rich Girl]";
+ mes "Oh yeah.";
+ mes "What's your name?";
+ mes "That is, if you don't";
+ mes "mind me asking you.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "My name is " + strcharinfo(0) + "";
+ mes "and I'm an adventurer~";
+ next;
+ mes "[Achiha]";
+ mes "Oh, one of those?";
+ mes "My name is Achiha, nice";
+ mes "to meet you. I don't really";
+ mes "do much of anything.";
+ mes "Just sit. Relax.";
+ set LHZBTQ,1;
+ emotion e_heh;
+ next;
+ mes "[Achiha]";
+ mes "I do have a hobby,";
+ mes "though. Once in a while,";
+ mes "I'll sew a hat. Do you think";
+ mes "an adventurer like you would";
+ mes "want to have a hat I made?";
+ next;
+ switch( select( "Er, I dunno.", "Sure." ) )
+ {
+ case 1:
+ mes "[Achiha]";
+ mes "Mm. I mean, the";
+ mes "Red Bonnets I make";
+ mes "might not be sturdy";
+ mes "enough for battles.";
+ mes "But what about those";
+ mes "fish and cake hats?";
+ next;
+ mes "[Achiha]";
+ mes "Hats...?";
+ mes "That look like";
+ mes "fish or cake? Mm.";
+ mes "Haha. I just got it.";
+ mes "That's, that's funny.";
+ close;
+ break;
+
+ case 2:
+ mes "[Achiha]";
+ mes "Really? Well, I can sew";
+ mes "together a ^0000FFRed Bonnet^000000.";
+ mes "It reminds most people";
+ mes "of a baby's bonnet, but";
+ mes "it does look good on";
+ mes "most people I know.";
+ next;
+ mes "[Achiha]";
+ mes "Um, did you want me";
+ mes "to make you one? I can";
+ mes "go ahead and do it if you";
+ mes "bring me some materials.";
+ mes "Since it's just for fun,";
+ mes "I won't ask for too much.";
+ next;
+ mes "[Achiha]";
+ mes "Just bring";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000.";
+ next;
+ mes "[Achiha]";
+ mes "I think I'm going";
+ mes "to just sit and relax";
+ mes "a little bit longer. But";
+ mes "if you want me to make";
+ mes "a hat for you, come back";
+ mes "with those materials, okay?";
+ set LHZBTQ,2;
+ close;
+ break;
+ }
+ break;
+ }
+ }
+ else if(LHZBTQ == 1)
+ {
+ mes "[Achiha]";
+ mes "Oh, hello.";
+ mes "Isn't it such a nice,";
+ mes "quiet, pleasant day?";
+ next;
+ switch( select( "Indeed.", "Would you please make a hat for me?" ) )
+ {
+ case 1:
+ mes "[Achiha]";
+ mes "Yeah. Today would";
+ mes "be a nice day for a";
+ mes "picnic or a long stroll.";
+ mes "But all I want to do is";
+ mes "just sit and relax...";
+ close;
+ break;
+
+ case 2:
+ mes "[Achiha]";
+ mes "What are you talking";
+ mes "about? Oh, you mean the";
+ mes "Red Bonnet? Well, I guess";
+ mes "I can make one. But I think";
+ mes "I need some materials first.";
+ next;
+ mes "[Achiha]";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000.";
+ mes "That's what I need.";
+ next;
+ mes "[Achiha]";
+ mes "Oh, but I don't";
+ mes "feel like making it";
+ mes "right now. I'm soooo";
+ mes "tired. Let me just sit,";
+ mes "relax, even if it's just";
+ mes "a little while longer...";
+ set LHZBTQ,2;
+ close;
+ break;
+ }
+ }
+ else if(LHZBTQ == 2)
+ {
+ mes "[Achiha]";
+ mes "Oh, good, you're here.";
+ mes "I've been next;ing for you.";
+ mes "Did you bring everything that";
+ mes "you need to make a ^0000FFRed Bonnet^000000?";
+ next;
+ switch( select( "Yes.", "I forgot what I need." ) )
+ {
+ case 1:
+ if(countitem(10015) < 1 || countitem(10007) < 1 || countitem(975) < 1 || countitem(5032) < 1 || Zeny < 50000)
+ {
+ mes "[Achiha]";
+ mes "Uh oh.";
+ mes "You forgot";
+ mes "a couple things.";
+ mes "Would you like me";
+ mes "to remind you what";
+ mes "you need to bring?";
+ next;
+ mes "[Achiha]";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000. Come back";
+ mes "when you're ready, okay?";
+ close;
+ }
+ mes "[Achiha]";
+ mes "Oh, you brought";
+ mes "everything. That's";
+ mes "good. Okay, just give";
+ mes "it to me. Um, let's see.";
+ next;
+ mes "[Achiha]";
+ mes "Well, I'm finished.";
+ mes "^333333*Yawn*^000000 And now I'm";
+ mes "even more tired. Here,";
+ mes "take this Red Bonnet.";
+ mes "I hope you like it~";
+ mes "I think I'll relax now...";
+ delitem 10015,1;
+ delitem 10007,1;
+ delitem 975,1;
+ delitem 5032,1;
+ set Zeny,Zeny - 50000;
+ getitem 5109,1;
+ set LHZBTQ,3;
+ next;
+ mes "[Achiha]";
+ mes "I hope you will enjoy the hat~";
+ close;
+ break;
+
+ case 2:
+ mes "[Achiha]";
+ mes "Oh, you really";
+ mes "forgot? Oh dear,";
+ mes "let me try to remember.";
+ mes "I didn't forget too, did I?";
+ mes "Oh next;, I remember now...";
+ next;
+ mes "[Achiha]";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000. Come back";
+ mes "when you're ready, okay?";
+ close;
+ break;
+ }
+ }
+ else if(LHZBTQ == 3)
+ {
+ mes "[Achiha]";
+ mes "Oh, I remember you.";
+ mes "You're the adventurer";
+ mes "who likes my Red Bonnets";
+ mes "so much. Did you want me";
+ mes "to make another one for you?";
+ next;
+ switch( select( "Yes.", "I forgot what I need." ) )
+ {
+ case 1:
+ if(countitem(10015) < 1 || countitem(10007) < 1 || countitem(975) < 1 || countitem(5032) < 1 || Zeny < 50000)
+ {
+ mes "[Achiha]";
+ mes "Uh oh.";
+ mes "You forgot";
+ mes "a couple things.";
+ mes "Would you like me";
+ mes "to remind you what";
+ mes "you need to bring?";
+ next;
+ mes "[Achiha]";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000. Come back";
+ mes "when you're ready, okay?";
+ close;
+ }
+ mes "[Achiha]";
+ mes "Oh, you brought";
+ mes "everything. That's";
+ mes "good. Okay, just give";
+ mes "it to me. Um, let's see.";
+ next;
+ mes "[Achiha]";
+ mes "Well, I'm finished.";
+ mes "^333333*Yawn*^000000 And now I'm";
+ mes "even more tired. Here,";
+ mes "take this Red Bonnet.";
+ mes "I hope you like it~";
+ mes "I think I'll relax now...";
+ delitem 10015,1;
+ delitem 10007,1;
+ delitem 975,1;
+ delitem 5032,1;
+ set Zeny,Zeny - 50000;
+ getitem 5109,1;
+ next;
+ mes "[Achiha]";
+ mes "I hope you will enjoy the hat~";
+ close;
+ break;
+
+ case 2:
+ mes "[Achiha]";
+ mes "Oh, you really";
+ mes "forgot? Oh dear,";
+ mes "let me try to remember.";
+ mes "I didn't forget too, did I?";
+ mes "Oh next;, I remember now...";
+ next;
+ mes "[Achiha]";
+ mes "^0000FF1 Green Lace^000000,";
+ mes "^0000FF1 Silk Ribbon^000000,";
+ mes "^0000FF1 Scarlet Dyestuffs^000000,";
+ mes "^0000FF1 Sunday Hat^000000 and";
+ mes "^0000FF50,000 zeny^000000. Come back";
+ mes "when you're ready, okay?";
+ close;
+ break;
+ }
+ }
+
+}
+
+gl_prison1.gat,137,138,5 script Zealotus#LhzHat 1200,{
+
+ if(ZLMASKQ == 0)
+ {
+ mes "[Zealotus]";
+ mes "Kneel, worm!";
+ mes "As ruler of this";
+ mes "Underground Prison,";
+ mes "I command all who step";
+ mes "into my private realm!";
+ next;
+ mes "[Zealotus]";
+ mes "Resist, and you shall be";
+ mes "punished! Grovel and kiss";
+ mes "my feet, and perhaps you";
+ mes "might be spared. Hohohohoho!";
+ next;
+ switch( select( "Oh, your highness!", "Whatever." ) )
+ {
+ case 1:
+ mes "[Zealotus]";
+ mes "The submissive woman is";
+ mes "nothing but an ideal dream";
+ mes "for the arrogant male! A true";
+ mes "woman revels in her power to";
+ mes "have her man do her bidding!";
+ next;
+ switch( select( "Yes, it's so true!", "Boooo!" ) )
+ {
+ case 1:
+ mes "[Zealotus]";
+ mes "However, in my lust for power, I may have inadventently crushed";
+ mes "the spirits of my beloved a little too harshly. His pride crumbled,";
+ mes "my man even cowers in front of the humans! It pains me to see it.";
+ next;
+ mes "[Zealotus]";
+ mes "It is beneath me to ask";
+ mes "this of you, but it will take";
+ mes "a human like you to make";
+ mes "him remember who he truly is,";
+ mes "a proud creature of darkness";
+ mes "who should fear only me!";
+ next;
+ mes "[Zealotus]";
+ mes "Human. I offer you a small";
+ mes "share of my power if you can";
+ mes "take the pathetic, weeping lump";
+ mes "of monster crying in the corner";
+ mes "of this prison and make him";
+ mes "realize his true nature.";
+ set ZLMASKQ,1;
+ close;
+ break;
+
+ case 2:
+ mes "[Zealotus]";
+ mes "You dirty, dirty human...";
+ mes "How dare you have an ";
+ mes "opinion different than mine!";
+ mes "No matter. The day will come";
+ mes "when all of your race shall";
+ mes "address me only as \"queen.\"";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Zealotus]";
+ mes "Mortal simpleton!";
+ mes "Bah! The mocking of";
+ mes "a boorish cur is worthless";
+ mes "to me. I have all the time in";
+ mes "the world to grind your pride";
+ mes "to dust beneath my heels.";
+ close;
+ break;
+ }
+ }
+ else if(ZLMASKQ > 0 && ZLMASKQ < 6)
+ {
+ mes "[Zealotus]";
+ mes "Hm. If my beloved is";
+ mes "acting stubborn or refuses";
+ mes "to listen, feel free to take";
+ mes "drastic measures. Just think";
+ mes "of what I would do in your";
+ mes "place. Ohohohohoho~!";
+ close;
+ }
+ else if(ZLMASKQ == 6)
+ {
+ mes "[Zealotus]";
+ mes "Ooh, you're back.";
+ mes "Phendark is certainly";
+ mes "back to his old self again,";
+ mes "thanks to your efforts, human.";
+ mes "Yes, his anger, his courage";
+ mes "and passion are all restored~";
+ next;
+ mes "[Zealotus]";
+ mes "As I promised, I shall";
+ mes "grant you a share of my";
+ mes "power. However, I will need";
+ mes "some items to form this minor";
+ mes "contract between you and me.";
+ next;
+ mes "[Zealotus]";
+ mes "I will need";
+ mes "^3131FF1 Cat's Eye^000000,";
+ mes "^3131FF1 Forbidden Red Candle^000000 and";
+ mes "^3131FF30 Worn-Out Magic Scrolls^000000.";
+ mes "Then, I can grant you a measure";
+ mes "of my power as I've promised.";
+ set ZLMASKQ,7;
+ close;
+ }
+ else if(ZLMASKQ == 7)
+ {
+ if(countitem(7263) && countitem(660) && countitem(7099) > 29)
+ {
+ mes "[Zealotus]";
+ mes "I see that you have";
+ mes "brought what I need to";
+ mes "complete the contract";
+ mes "between you and me,";
+ mes "human. Let's begin...";
+ next;
+ mes "^3355FFZealotus takes the red";
+ mes "candle you've given her and";
+ mes "drips the wax into her open";
+ mes "palm. The Cat's Eye begins";
+ mes "to glow with an eerie light.^000000";
+ next;
+ mes "[Zealotus]";
+ mes "Now, place your index";
+ mes "finger into my palm so";
+ mes "that we may complete the";
+ mes "final step of this contract...";
+ next;
+ switch( select( "Don't complete the contract.", "Complete the contract." ) )
+ {
+ case 1:
+ mes "[Zealotus]";
+ mes "Hm? What are you";
+ mes "afraid of? This is a";
+ mes "minor contract, so";
+ mes "you are not selling me";
+ mes "your soul, or anything";
+ mes "else for that matter.";
+ close;
+ break;
+
+ case 2:
+ mes "[Zealotus]";
+ mes "I, Zealotus, as ruler";
+ mes "of this realm, seal this";
+ mes "eternal contract with this";
+ mes "Forbidden Red Candle.";
+ next;
+ mes "[Zealotus]";
+ mes "" + strcharinfo(0) + " will";
+ mes "forever have a share";
+ mes "in my power. Those that";
+ mes "bow to me must also bow";
+ mes "to " + strcharinfo(0) + ". It shall be done.";
+ specialeffect 196; //Curse? EF_DEVIL
+ specialeffect 192; //Poison attack? EF_POISONHIT
+ next;
+ mes "[Zealotus]";
+ mes "Human, take this";
+ mes "mask with you as an";
+ mes "everlasting token of our";
+ mes "contract. So long as you";
+ mes "carry this, I will be at your";
+ mes "side. So says Zealotus!";
+ delitem 7263,1;
+ delitem 660,1;
+ delitem 7099,30;
+ getitem2 5121,1,1,0,0,254,0,getcharid(0)&0xffff,(getcharid(0)>>16)&0xffff;
+ set ZLMASKQ,8;
+ close;
+ break;
+ }
+ }
+ mes "[Zealotus]";
+ mes "I will need";
+ mes "^3131FF1 Cat's Eye^000000,";
+ mes "^3131FF1 Forbidden Red Candle^000000 and";
+ mes "^3131FF30 Worn-Out Magic Scrolls^000000.";
+ mes "Then, I can grant you a measure";
+ mes "of my power as I've promised.";
+ close;
+ }
+ else if(ZLMASKQ == 8)
+ {
+ mes "[Zealotus]";
+ mes "Ah, I greet you in";
+ mes "peace, human. Behold,";
+ mes "the splendor of our realm!";
+ mes "Though, I do not blame you";
+ mes "if you have no interest in";
+ mes "commanding these Injustices...";
+ next;
+ mes "[Zealotus]";
+ mes "Thanks to your help,";
+ mes "my Phendark has returned";
+ mes "to his old, monstrously";
+ mes "passionate ways. Now I can";
+ mes "show him the stinging love";
+ mes "of my whip! Hohohohohoho!";
+ emotion e_kis;
+ close;
+ }
+
+}
+
+gl_prison1.gat,97,104,1 script Phendark#LhzHat 1202,{
+
+ if(ZLMASKQ == 0)
+ {
+ mes "[Phendark]";
+ mes "Huh? Oh no!";
+ mes "Another h-human?!";
+ mes "P-please! S-stay away,";
+ mes "don't come near me!";
+ close;
+ }
+ else if(ZLMASKQ == 1)
+ {
+ if(countitem(1164) || isequipped(1164))set @whipcount,@whipcount+1;
+ if(countitem(1165) || isequipped(1165))set @whipcount,@whipcount+1;
+ if(countitem(1166) || isequipped(1166))set @whipcount,@whipcount+1;
+ if(countitem(1167) || isequipped(1167))set @whipcount,@whipcount+1;
+ if(countitem(1168) || isequipped(1168))set @whipcount,@whipcount+1;
+ if(countitem(1169) || isequipped(1169))set @whipcount,@whipcount+1;
+ if(countitem(1170) || isequipped(1170))set @whipcount,@whipcount+1;
+ if(countitem(1261) || isequipped(1261))set @whipcount,@whipcount+1;
+ if(countitem(1363) || isequipped(1363))set @whipcount,@whipcount+1;
+ mes "[Phendark]";
+ mes "Huh? Oh no!";
+ mes "Another h-human?!";
+ mes "P-please! S-stay away,";
+ mes "don't come near me!";
+ next;
+ mes "[Phendark]";
+ mes "I... I swear!";
+ mes "I'm not carrying any";
+ mes "rare items or stuff you";
+ mes "can wear, so please don't";
+ mes "beat me! I... Oh my god, you";
+ mes "don't believe me, don't you?";
+ next;
+ mes "[Phendark]";
+ mes "You humans never leave";
+ mes "me alone! Why do you have";
+ mes "to bully me like this?! I'm";
+ mes "honestly not carrying anything";
+ mes "of value! Z-Zealotus, please!";
+ mes "Zealotus, heeeeeelp me~!";
+ emotion e_sob;
+ if(!@whipcount)close;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "You're pathetic!";
+ mes "Aren't you supposed";
+ mes "to be a monster? You know";
+ mes "what Zealotus would do if";
+ mes "she were actually here?";
+ next;
+ mes "[Phendark]";
+ mes "^333333*Sniff...*^000000";
+ mes "P-probably...";
+ mes "Probably whip me.";
+ next;
+ mes "^3355FFYou nonchalantly^000000";
+ mes "^3355FFbrandish your Whip.^000000";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "That's right.";
+ next;
+ mes "^3355FF*Snap!*";
+ mes "*Snap!*";
+ mes "*Crack crack crack!*";
+ mes "*Snap snap snap crack!*^000000";
+ next;
+ mes "[Phendark]";
+ mes "Oh! That stinging pain";
+ mes "that burns with bloodlust!";
+ mes "It's almost as good as";
+ mes "Zealtos's whip of love!";
+ next;
+ mes "[Phendark]";
+ mes "Zealotus...";
+ mes "She must be pissed";
+ mes "at me, but I just can't";
+ mes "stop being afraid of all";
+ mes "you humans! Damn it all!";
+ set ZLMASKQ,2;
+ close;
+ }
+ else if(ZLMASKQ == 2 || ZLMASKQ == 3)
+ {
+ if(countitem(7315) > 368 && ZLMASKQ == 3)
+ {
+ mes "[Phendark]";
+ mes "Y-you again!";
+ mes "Why do you hound me?!";
+ mes "Th-there's nothing I can";
+ mes "give you, so please don't";
+ mes "hurt me! Oh, oh p-please...!";
+ emotion e_swt2;
+ next;
+ switch( select( "Feed him Dark Crystal Fragment.", "Threaten him." ) )
+ {
+ case 1:
+ mes "[Phendark]";
+ mes "What...? You want";
+ mes "me to eat these?";
+ mes "It doesn't seem natural,";
+ mes "but if Rybio says I should,";
+ mes "it might not be that bad.";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "[Phendark]";
+ mes "What's supposed to";
+ mes "happen now? My inner";
+ mes "demon is supposed to";
+ mes "awaken by eating these?";
+ mes "That sounds ridiculous!";
+ mes "Though, I did just eat crystal.";
+ next;
+ mes "[Phendark]";
+ mes "Wh-whoa. Ugh!";
+ mes "My chest! Something's";
+ mes "burning inside! I c-can't--!";
+ mes "Can't think straight... I'm...";
+ mes "Slowly... Losing my humanity!";
+ next;
+ mes "[Phendark]";
+ mes "Huh... Huuurg--!";
+ mes "Huk-huk! Heeeeh!";
+ mes "Heeeeeh! Waaoooooh!";
+ next;
+ mes "[Phendark]";
+ mes "...";
+ mes "Grrrrr...!";
+ next;
+ mes "[Phendark]";
+ mes "^333333*Pant pant*^000000";
+ mes "What... just...";
+ mes "What happened?";
+ set ZLMASKQ,4;
+ delitem 7315,369;
+ close;
+ break;
+
+ case 2:
+ mes "[" + strcharinfo(0) + "]";
+ mes "So what happens";
+ mes "if I don't decide not";
+ mes "to hurt you? Whatcha";
+ mes "gonna do then, huh?";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "[Phendark]";
+ mes "S-stop it!";
+ mes "Just--Just stop it!";
+ close;
+ break;
+ }
+ }
+ mes "[Phendark]";
+ mes "Humans...";
+ mes "They're everywhere!";
+ mes "You guys--I can't...";
+ mes "You're torturing me!";
+ emotion e_sob;
+ close;
+ }
+ else if(ZLMASKQ == 4)
+ {
+ mes "[Phendark]";
+ mes "My chest was on fire,";
+ mes "like I was, I dunno,";
+ mes "burning with anger or";
+ mes "something. It's gone";
+ mes "now, but what were";
+ mes "those crystals?";
+ close;
+ }
+ else if(ZLMASKQ == 5)
+ {
+ mes "[Phendark]";
+ mes "You again? Oh no,";
+ mes "you're not going to hurt";
+ mes "me or make me eat those";
+ mes "weird crystals again, are you?";
+ next;
+ mes "^3131FF[" + strcharinfo(0) + "]^000000";
+ switch( select( "Rybio", "Injustice", "Zealotus" ) )
+ {
+ case 1:
+ mes "Rybio";
+ set @temp1,1;
+ break;
+
+ case 2:
+ mes "Injustice";
+ set @temp1,2;
+ break;
+
+ case 3:
+ mes "Zealotus";
+ set @temp1,3;
+ break;
+ }
+ switch( select( "hates", "likes" ) )
+ {
+ case 1:
+ mes "hates";
+ set @temp2,1;
+ break;
+
+ case 2:
+ mes "likes";
+ set @temp2,2;
+ break;
+ }
+ switch( select( "Rybio.", "Injustice.", "Phendark.", "Zealotus." ) )
+ {
+ case 1:
+ mes "Rybio.";
+ break;
+
+ case 2:
+ mes "Injustice.";
+ break;
+
+ case 3:
+ if((@temp1 == 1 || @temp1 == 2) && @temp2 == 1)
+ {
+ mes "[Phendark]";
+ mes "I can't believe";
+ mes "something like that!";
+ mes "Oh, that doesn't matter.";
+ mes "Zealotus is too good for me.";
+ mes "I'm not even worthy of tasting";
+ mes "the sting of her Love Whip.";
+ emotion e_sob;
+ close;
+ }
+ else if(@temp1 == 3 && @temp2 == 1)
+ {
+ mes "[Phendark]";
+ mes "...";
+ mes "......";
+ mes "Hates me?";
+ mes "N-no, that can't--";
+ mes "I didn't, that doesn't--";
+ next;
+ mes "[Phendark]";
+ mes "Huh...?";
+ mes "What is that";
+ mes "supposed to mean?";
+ close;
+ }
+ else if(@temp1 == 3 && @temp2 == 2)
+ {
+ mes "[Phendark]";
+ mes "I can't believe";
+ mes "something like that!";
+ mes "Oh, that doesn't matter.";
+ mes "Zealotus is too good for me.";
+ mes "I'm not even worthy of tasting";
+ mes "the sting of her Love Whip.";
+ emotion e_sob;
+ close;
+ }
+ break;
+
+ case 4:
+ mes "Zealotus.";
+ break;
+ }
+ switch( select( "Insult him.", "Apologize." ) )
+ {
+ case 1:
+ mes "[" + strcharinfo(0) + "]";
+ mes "First of all,";
+ mes "what exactly sets";
+ mes "you apart from all the";
+ mes "other eligible monsters";
+ mes "that she can choose from?";
+ mes "Not like you're much better...";
+ next;
+ mes "[Phendark]";
+ mes "...";
+ mes "......";
+ next;
+ switch( select( "Break his pride.", "Tell him you were joking." ) )
+ {
+ case 1:
+ mes "^3131FF[" + strcharinfo(0) + "]^000000";
+ mes "I mean, there are guys";
+ mes "like Bloody Murderer out";
+ mes "there who are more evil";
+ mes "than you, and best of all,";
+ mes "not afraid of humans!";
+ next;
+ switch( select( "Go for the low blow.", "Try to salvage his confidence." ) )
+ {
+ case 1:
+ mes "[" + strcharinfo(0) + "]";
+ mes "You know, me and Zealotus";
+ mes "were actually talking about";
+ mes "you recently. She told me that";
+ mes "the sight of you makes her";
+ mes "feel sick! I mean, what kind";
+ mes "of monster is afraid of humans?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Now you've reached the";
+ mes "point where even Injustice";
+ mes "is manlier than you now,";
+ mes "if you know what I mean!";
+ mes "Hahahahahahahahaha!";
+ next;
+ mes "[Phendark]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Phendark]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Phendark]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ mes "............";
+ next;
+ mes "[Phendark]";
+ mes "GRRRRRR!";
+ mes "THAT'S ENOUGH!";
+ emotion e_ag;
+ next;
+ mes "[Phendark]";
+ mes "I don't care who the";
+ mes "hell she is, I'm going";
+ mes "to see Zealotus and give";
+ mes "that tramp a piece of my";
+ mes "mind! Grrrr! She'll be sorry!";
+ set ZLMASKQ,6;
+ emotion e_an;
+ close;
+ break;
+
+ case 2:
+ mes "^3131FF[" + strcharinfo(0) + "]^000000";
+ mes "But know that I think";
+ mes "about it, maybe you look";
+ mes "much tougher than that";
+ mes "Bloody Murderer guy.";
+ next;
+ mes "[Phendark]";
+ mes "*Sniff sniff*";
+ mes "You really think so?";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Yeeeeeah.";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[" + strcharinfo(0) + "]";
+ mes "But now that I think";
+ mes "about it, you actually";
+ mes "are much better than all";
+ mes "those other monsters.";
+ mes "That stuff I said before?";
+ mes "I was just kidding you.";
+ next;
+ mes "[Phendark]";
+ mes "^333333*Sniff!*^000000";
+ mes "You're...";
+ mes "Not helping!";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[" + strcharinfo(0) + "]";
+ mes "I...";
+ mes "I was just kidding!";
+ mes "How could she hate";
+ mes "somebody like you?";
+ next;
+ mes "[Phendark]";
+ mes "No... No.";
+ mes "You're right.";
+ mes "I don't deserve love.";
+ mes "Not from Zealotus or";
+ mes "from anybody else...";
+ close;
+ break;
+ }
+ }
+ else if(ZLMASKQ > 5)
+ {
+ mes "[Phendark]";
+ mes "Zealotus! How dare";
+ mes "she say those things";
+ mes "against me! Less manly";
+ mes "than Injustice?! I'll just";
+ mes "have to prove her wrong!";
+ mes "Out the way, pithy human!";
+ close;
+ }
+
+}
+
+gl_prison1.gat,100,48,5 script Rybio#LhzHat 1201,{
+
+ if(ZLMASKQ == 2)
+ {
+ mes "[Rybio]";
+ mes "You know, I usually just";
+ mes "run up and slash like crazy";
+ mes "once I see you humans, but";
+ mes "my heart's not in it today, so";
+ mes "I'm gonna give you just one";
+ mes "chance to run for your life.";
+ next;
+ switch( select( "Talk about Phendark.", "Run for your life." ) )
+ {
+ case 1:
+ mes "[Rybio]";
+ mes "What th--? You know the";
+ mes "same Phendark I know?";
+ mes "Dayam, that's weird. But";
+ mes "yeah, him and Zealotus have";
+ mes "some kind of... I dunno what";
+ mes "it is, actually. Um, love?";
+ next;
+ mes "[Rybio]";
+ mes "Anyway, Phendark has";
+ mes "been acting really weird";
+ mes "lately. I guess Zealotus";
+ mes "loved him to the point that";
+ mes "she abused him to the point";
+ mes "that he's scared of humans now.";
+ next;
+ mes "[Rybio]";
+ mes "Huh. You know what'd help?";
+ mes "Dark Crystal Fragments. It's";
+ mes "worthless to humans, but if";
+ mes "creatures of darkness eat it,";
+ mes "it brings out more of their";
+ mes "inner demon. Scary, huh?";
+ next;
+ mes "[Rybio]";
+ mes "Since Phendark's pretty big, and he's acting like a total wuss, you";
+ mes "you should probably get him to eat ^3131FF369 Dark Crystal Fragments^000000. Don't";
+ mes "worry, you should be able to find those all over Rune-Midgard.";
+ next;
+ mes "[Rybio]";
+ mes "I dunno why a human";
+ mes "like you would want to";
+ mes "help one of us out, though.";
+ mes "What's in it for you, exactly?";
+ set ZLMASKQ,3;
+ close;
+ break;
+
+ case 2:
+ mes "[Rybio]";
+ mes "That's right!";
+ mes "Run, get outta here!";
+ mes "If you're not fast enough,";
+ mes "I might eat you, human!";
+ mes "...Well... Probably not.";
+ close;
+ break;
+ }
+ }
+ else if(ZLMASKQ == 3)
+ {
+ mes "[Rybio]";
+ mes "I don't get why someone";
+ mes "like you, a seemingly heroic";
+ mes "adventurer, would want to help";
+ mes "out Phendark? Did Zealotus";
+ mes "blackmail you or something?";
+ next;
+ mes "[Rybio]";
+ mes "Well, you could";
+ mes "probably help him";
+ mes "by getting him to eat";
+ mes "^3131FF369 Dark Crystal Fragments^000000";
+ mes "to sort of stir up the demon";
+ mes "that sleeping within, you know?";
+ close;
+ }
+ else if(ZLMASKQ == 4)
+ {
+ mes "[Rybio]";
+ mes "Feeding him all of those";
+ mes "Dark Crystal Fragments didn't";
+ mes "work? But that was supposed";
+ mes "to be foolproof! Dayam, what";
+ mes "the hell happened to Phendark's";
+ mes "inner demon?! Man oh man...";
+ next;
+ mes "[Rybio]";
+ mes "Well, I don't know what";
+ mes "else you could try. I mean,";
+ mes "maybe you could try motivating";
+ mes "him. Reverse psychology?";
+ mes "It's weird talking about this";
+ mes "with a human. Hahahaha~";
+ set ZLMASKQ,5;
+ close;
+ }
+ else if(ZLMASKQ == 5)
+ {
+ mes "[Rybio]";
+ mes "Phendark sure looks";
+ mes "tough, but I guess even";
+ mes "he isn't totally evil. Yeah.";
+ mes "We monsters aren't all";
+ mes "bad... Just mostly bad.";
+ close;
+ }
+
+}
diff --git a/npc/quests/newgears/2006_headgear.txt b/npc/quests/newgears/2006_headgear.txt
index c59e383e6..a7445e6a5 100644
--- a/npc/quests/newgears/2006_headgear.txt
+++ b/npc/quests/newgears/2006_headgear.txt
@@ -1,489 +1,489 @@
-//===== eAthena Script =======================================
-//= 2006 Headgear
-//===== By: ==================================================
-//= DiviniaRO members, cleaned by reddozen
-//===== Current Version: =====================================
-//= 1.0c
-//===== Compatible With: =====================================
-//= SVN eA
-//===== Description: =========================================
-//= Anonymous Mask, Feather Beret, Valk. Helm, Smiling Mask,
-//= Lion Masquerade, Bride Mask, Judge Hat and A-Yam Hat
-//===== Additional Comments: =================================
-//= NPC id's and dialog are custom, please replace
-//= 1.0a fixed typos, added missing names, more cleaned and
-//= standartized stuff a bit [Lupus]
-//= 1.0b fixed Helm of Valkyries ingredients
-//= 1.0c corrected item names according to item_db [Lupus]
-//============================================================
-
-
-//===================== Anonymous Mask =====================================================
-
-rachel.gat,91,273,4 script Masked Man 880,{
- set @npcname$,"[Masked Man]";
-
- mes @npcname$;
- mes "Psssst....";
- next;
- mes @npcname$;
- mes "Shhhh...";
- mes "Come here, but keep quiet";
- next;
- mes @npcname$;
- mes "I have something that might interest you";
- next;
-
- switch(select("I think you know what I want...","Huh? Sorry, I'm Just looking around."))
- {
-
- case 1:
- mes @npcname$;
- mes "I only need a few things in return";
- mes "100 Slick Paper,";
- mes "99 Sticky Mucus,";
- mes "1 Black Dysetuff and";
- mes "100,000 Zeny.";
- next;
- mes @npcname$;
- if ( (countitem(983)<1) || (countitem(7111)<100) || (countitem(938)<99) || (Zeny < 100000) ) {
- mes "Come back when you have what I need...";
- close;
- }
-
- mes "I see you came prepared.";
- delitem 7111,100;
- delitem 938,99;
- delitem 983,1;
- set Zeny, Zeny-100000;
- next;
- getitem 5175,1;
- mes @npcname$;
- mes "You didnt get this from me by the way...";
- close;
-
-
- case 2:
- mes @npcname$;
- mes "Yeah... I knew that.";
- close;
- }
-
-}
-
-
-
-//======================== Feather Beret ================================================
-
-rachel.gat,135,121,4 script Sakyul 933,{
- set @npcname$,"[Sakyul]";
-
- mes @npcname$;
- mes "Mumble mumble..";
- mes "Stupid Arunafelz Military!";
- mes "I lost the use of my legs during the Rune-Midgard!";
- mes "I was in a special unit.. we even had our own beret!";
- mes "Wingmen, they called us..";
- next;
- mes @npcname$;
- mes "If you really want one, I can make a replica for you.";
- next;
-
- switch(select("Of course I do!","No way man, you creep me out!"))
- {
-
- case 1:
- mes @npcname$;
- mes "Alright then, I just need a few things:";
- mes "1 Beret,";
- mes "100 Soft Feathers and";
- mes "1 White Dyestuff.";
- next;
- mes @npcname$;
- if ( (countitem(5172)<1) || (countitem(982)<1) || (countitem(7063)<100) ) {
- mes "Eh.. I'm old, not Senile.. Bring me the rest of the stuff I asked for!";
- close;
- }
-
- mes "Nice to see a well prepared youngster!";
- delitem 5172,1;
- delitem 7063,100;
- delitem 982,1;
- next;
- getitem 5170,1;
- mes @npcname$;
- mes "Here.. This takes me back.. Have fun with it!";
- close;
-
-
- case 2:
- mes @npcname$;
- mes "Fine then! Leave an old man at peace! Git! Go!";
- close;
- }
-
-}
-
-
-
-//============================ Valkyrie Helm =====================================================
-
-hugel.gat,146,105,4 script Genirhimin 897,{
- set @npcname$,"[Genirhimin]";
-
- mes @npcname$;
- mes "Eh?";
- if (Zeny < 10000000) goto L_POOR;
- next;
- mes @npcname$;
- mes "In days long past us mortals were permitted";
- mes "to serve Odin and the Valkyries in battle..";
- mes "So that maybe we would have the cahnce to die";
- mes "honorably in battle and return to Val Halla";
- next;
- mes @npcname$;
- mes "The bravest of Warriors were rewarded with";
- mes "the Valkyrie Helm";
- mes "But.. those days are long since passed..";
- mes "I suppose I could make you one, if you can";
- mes "gather what I need.";
- next;
-
- switch(select("Really? I'd love one.","I'm not one for fairy tales old man."))
- {
-
- case 1:
- mes @npcname$;
- mes "Here is what I need:";
- mes "1 Sageworm Card,";
- mes "1 Argiope Card,";
- mes "1 Dryad Card,";
- mes "1 Wooden Golem Card,";
- mes "1 Bongun Card,";
- mes "1 Pirate Skel Card,";
- mes "1 Marduk Card and...";
- next;
- mes @npcname$;
- mes "1 Hode Card,";
- mes "1 Elder Card,";
- mes "1 Nightmare Terror Card,";
- mes "1000 Darkness Runes and";
- mes "1000 Bloody Runes.";
- next;
- mes @npcname$;
- if ( (countitem(4219)<1) || (countitem(4114)<1) || (countitem(4177)<1) || (countitem(4259)<1) || (countitem(4212)<1) || (countitem(4073)<1) || (countitem(4112)<1) || (countitem(4081)<1) || (countitem(4251)<1) || (countitem(4166)<1) || (countitem(7511)<1000) || (countitem(7563)<1000) ) {
- mes "I'm sorry, but I need more to make the helm.";
- close;
- }
-
- mes "Give me a minute and I'll work my magic...";
- delitem 4219,1;
- delitem 4114,1;
- delitem 4177,1;
- delitem 4259,1;
- delitem 4212,1;
- delitem 4073,1;
- delitem 4112,1;
- delitem 4081,1;
- delitem 4251,1;
- delitem 4166,1;
- delitem 7511,1000;
- delitem 7563,1000;
- next;
- getitem 5171,1;
- mes @npcname$;
- mes "This is a serious honour... You have proven yourself a brave and honorable Warrior, Wear this with Pride.";
- close;
-
- case 2:
- mes @npcname$;
- mes "So be it, suit yourself..";
- close;
- }
-
- L_POOR:
- mes "My time is worth more than the fortunes of Rune-Midgard and Arunafelz combined...";
- close;
-
-}
-
-
-
-//======================= Smiling Mask / Lion Masquerade / Bride Mask ===============================
-
-payon.gat,135,231,5 script Chung-Wol-Mang 907,{
- set @npcname$,"[Chung-Wol-Mang]";
-
- mes @npcname$;
- mes "Hey, I can make you three rare masks if you bring me all of the items needed to make them.";
- next;
- mes @npcname$;
- mes "So, which one will it be?";
- next;
- switch(select("Smiling Mask","Lion Masquerade","Bride Mask","I changed my mind."))
- {
-
- case 1:
- mes @npcname$;
- mes "Okay, for the Smiling Mask I need:";
- mes "1 Four-Leaf Clover,";
- mes "500 Trunks,";
- mes "10 Elastic Bands,";
- mes "20 Memory Bookmarks,";
- mes "1 Cigarette,";
- mes "100 Cactus Needles and";
- mes "100 Manes.";
- next;
-
- if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(7015) < 20) || (countitem(2267) < 1) || (countitem(952) < 100) || (countitem(1028) < 100) || (countitem(1028) < 100) ){
- mes @npcname$;
- mes "Come back and talk to me when you've gathered all the items.";
- close;
- }
-
- mes @npcname$;
- mes "You brought all the items, thanks. Here give them to me.";
- delitem 706,1;
- delitem 1019,500;
- delitem 7200,10;
- delitem 7015,20;
- delitem 2267,1;
- delitem 952,100;
- delitem 1028,100;
- next;
- getitem 5176,1;
- mes @npcname$;
- mes "Thanks, you can have your mask now.";
- close;
-
- case 2:
- mes @npcname$;
- mes "Okay, for the Lion Masquerade I need:";
- mes "1 Four-Leaf Clover,";
- mes "500 Trunks,";
- mes "10 Elastic Bands,";
- mes "500 Horrendous Hairs,";
- mes "2 Ancient Teeth and";
- mes "1 Orange Dyestuff.";
- next;
-
- if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(1048) < 500) || (countitem(1053) < 2) || (countitem(980) < 1) ) {
- mes @npcname$;
- mes "Come back and talk to me when you've gathered all the items.";
- close;
- }
-
- mes @npcname$;
- mes "You brought all the items, thanks. Here give them to me.";
- delitem 706,1;
- delitem 1019,500;
- delitem 7200,10;
- delitem 1048,500;
- delitem 1053,2;
- delitem 980,1;
- next;
- getitem 5177,1;
- mes @npcname$;
- mes "Thanks, you can have your mask now.";
- close;
-
-
- case 3:
- mes @npcname$;
- mes "Okay, for the Bride Mask I need:";
- mes "1 Four-Leaf Clover,";
- mes "500 Trunks,";
- mes "10 Elastic Bands,";
- mes "20 Skirts of Virgin,";
- mes "500 Transparent Celestial Robes,";
- mes "2 Ancient Lips and";
- mes "100 Squid Inks.";
- next;
-
- if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(1049) < 20) || (countitem(7165) < 500) || (countitem(1054) < 2) || (countitem(1024) < 100) ) {
- mes @npcname$;
- mes "Come back and talk to me when you've gathered all the items.";
- close;
- }
-
- mes @npcname$;
- mes "You brought all the items, thanks. Here give them to me.";
- delitem 706,1;
- delitem 1019,500;
- delitem 7200,10;
- delitem 1049,20;
- delitem 7165,500;
- delitem 1054,2;
- delitem 1024,100;
- next;
- getitem 5169,1;
- mes @npcname$;
- mes "Thanks, you can have your mask now.";
- close;
-
-
- case 4:
- mes @npcname$;
- mes "Okay, come back if you feel up to it later.";
- close;
-
- }
-
-}
-
-
-
-//====================== Judge Hat / A-Yam Hat =============================================
-
-payon.gat,137,123,5 script Hangaram 740,{
- set @npcname$,"[Hangaram]";
-
- mes @npcname$;
- mes "Hello adventurer!";
- mes "Our life is complicated.";
- next;
-
- mes @npcname$;
- mes "But if you want I can help you by making 2 Hats.";
- next;
-
- mes @npcname$;
- mes "My creations are the Judge Hat and the A-Yam Hat.";
- mes "Which Hat do you want?";
- next;
-
- switch(select("Judge Hat","A-Yam Hat","No thanks"))
- {
-
- case 1:
- mes @npcname$;
- mes "^3355FFJudge Hat^000000";
- mes "7 Red Bijou,";
- mes "7 Blue Bijou,";
- mes "7 Yellow Bijou,";
- mes "7 Green Bijou,";
- mes "300 Shining Scales,";
- next;
- mes "1 Black Dyestuff,";
- mes "5 Cracked Diamond and";
- mes "1 Slotted Hat.";
- next;
- mes @npcname$;
- if( (countitem(7445)<7) || (countitem(7446)<7) || (countitem(7447)<7) || (countitem(7448)<7) || (countitem(954)<300) || (countitem(983)<1) || (countitem(733)<5) || (countitem(2221)<1) ){
- mes "Please, return when you have everything I need.";
- close;
- }
- delitem 7445,7;
- delitem 7446,7;
- delitem 7447,7;
- delitem 7448,7;
- delitem 954,300;
- delitem 983,1;
- delitem 733,5;
- delitem 2221,1;
-
- mes "Ok you seem to have all the items.";
- next;
-
- mes @npcname$;
- mes "Hmmm.. We now make this... Mmm.";
- emotion 9;
- next;
-
- mes @npcname$;
- mes "Now we use the Dyestuff like this.";
- emotion 23;
- next;
-
- mes @npcname$;
- mes "OMG!!! this isn't meant to be like this.";
- emotion 28;
- next;
-
- mes @npcname$;
- mes "....";
- next;
-
- mes @npcname$;
- mes "Sorry, it didn't work.";
- next;
-
- mes @npcname$;
- mes "Well that's the way life is.";
- next;
-
- mes @npcname$;
- mes "JAJAJAJA... I was just kidding here is your item !!";
- emotion 29;
- next;
-
- getitem 5173,1;
-
- mes @npcname$;
- mes "Good Work.";
- close;
-
- case 2:
- mes @npcname$;
- mes "^3355FFA-Yam Hat^000000";
- mes "7 Red Bijou,";
- mes "7 Blue Bijou,";
- mes "7 Yellow Bijou,";
- mes "7 Green Bijou,";
- mes "300 Shining Scales,";
- next;
- mes "1 Scarlet Dyestuff,";
- mes "5 Cracked Diamonds and";
- mes "50 Soft Silks.";
- next;
- mes @npcname$;
- if( (countitem(7445)<7) || (countitem(7446)<7) || (countitem(7447)<7) || (countitem(7448)<7) || (countitem(954)<300) || (countitem(975)<1) || (countitem(733)<5) || (countitem(7166)<50) ){
- mes "Please return when you have everything I need.";
- close;
- }
- delitem 7445,7;
- delitem 7446,7;
- delitem 7447,7;
- delitem 7448,7;
- delitem 954,300;
- delitem 975,1;
- delitem 733,5;
- delitem 7166,50;
-
- mes "Well, you have everything.";
- next;
-
- mes @npcname$;
- mes "Mmm now we just split this part...";
- emotion 9;
- next;
-
- mes @npcname$;
- mes "We throw this... Mmm..";
- emotion 23;
- next;
-
- mes @npcname$;
- mes "This isn't meant to be like this..";
- emotion 28;
- next;
-
- mes @npcname$;
- mes "... ready!!!";
- emotion 21;
- next;
-
- getitem 5174,1;
-
- mes @npcname$;
- mes "Here you have my young fella !";
- close;
-
-
- case 3:
- mes @npcname$;
- mes "Goodbye then.";
- close;
-
- }
+//===== eAthena Script =======================================
+//= 2006 Headgear
+//===== By: ==================================================
+//= DiviniaRO members, cleaned by reddozen
+//===== Current Version: =====================================
+//= 1.0c
+//===== Compatible With: =====================================
+//= SVN eA
+//===== Description: =========================================
+//= Anonymous Mask, Feather Beret, Valk. Helm, Smiling Mask,
+//= Lion Masquerade, Bride Mask, Judge Hat and A-Yam Hat
+//===== Additional Comments: =================================
+//= NPC id's and dialog are custom, please replace
+//= 1.0a fixed typos, added missing names, more cleaned and
+//= standartized stuff a bit [Lupus]
+//= 1.0b fixed Helm of Valkyries ingredients
+//= 1.0c corrected item names according to item_db [Lupus]
+//============================================================
+
+
+//===================== Anonymous Mask =====================================================
+
+rachel.gat,91,273,4 script Masked Man 880,{
+ set @npcname$,"[Masked Man]";
+
+ mes @npcname$;
+ mes "Psssst....";
+ next;
+ mes @npcname$;
+ mes "Shhhh...";
+ mes "Come here, but keep quiet";
+ next;
+ mes @npcname$;
+ mes "I have something that might interest you";
+ next;
+
+ switch(select("I think you know what I want...","Huh? Sorry, I'm Just looking around."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "I only need a few things in return";
+ mes "100 Slick Paper,";
+ mes "99 Sticky Mucus,";
+ mes "1 Black Dysetuff and";
+ mes "100,000 Zeny.";
+ next;
+ mes @npcname$;
+ if ( (countitem(983)<1) || (countitem(7111)<100) || (countitem(938)<99) || (Zeny < 100000) ) {
+ mes "Come back when you have what I need...";
+ close;
+ }
+
+ mes "I see you came prepared.";
+ delitem 7111,100;
+ delitem 938,99;
+ delitem 983,1;
+ set Zeny, Zeny-100000;
+ next;
+ getitem 5175,1;
+ mes @npcname$;
+ mes "You didnt get this from me by the way...";
+ close;
+
+
+ case 2:
+ mes @npcname$;
+ mes "Yeah... I knew that.";
+ close;
+ }
+
+}
+
+
+
+//======================== Feather Beret ================================================
+
+rachel.gat,135,121,4 script Sakyul 933,{
+ set @npcname$,"[Sakyul]";
+
+ mes @npcname$;
+ mes "Mumble mumble..";
+ mes "Stupid Arunafelz Military!";
+ mes "I lost the use of my legs during the Rune-Midgard!";
+ mes "I was in a special unit.. we even had our own beret!";
+ mes "Wingmen, they called us..";
+ next;
+ mes @npcname$;
+ mes "If you really want one, I can make a replica for you.";
+ next;
+
+ switch(select("Of course I do!","No way man, you creep me out!"))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Alright then, I just need a few things:";
+ mes "1 Beret,";
+ mes "100 Soft Feathers and";
+ mes "1 White Dyestuff.";
+ next;
+ mes @npcname$;
+ if ( (countitem(5172)<1) || (countitem(982)<1) || (countitem(7063)<100) ) {
+ mes "Eh.. I'm old, not Senile.. Bring me the rest of the stuff I asked for!";
+ close;
+ }
+
+ mes "Nice to see a well prepared youngster!";
+ delitem 5172,1;
+ delitem 7063,100;
+ delitem 982,1;
+ next;
+ getitem 5170,1;
+ mes @npcname$;
+ mes "Here.. This takes me back.. Have fun with it!";
+ close;
+
+
+ case 2:
+ mes @npcname$;
+ mes "Fine then! Leave an old man at peace! Git! Go!";
+ close;
+ }
+
+}
+
+
+
+//============================ Valkyrie Helm =====================================================
+
+hugel.gat,146,105,4 script Genirhimin 897,{
+ set @npcname$,"[Genirhimin]";
+
+ mes @npcname$;
+ mes "Eh?";
+ if (Zeny < 10000000) goto L_POOR;
+ next;
+ mes @npcname$;
+ mes "In days long past us mortals were permitted";
+ mes "to serve Odin and the Valkyries in battle..";
+ mes "So that maybe we would have the cahnce to die";
+ mes "honorably in battle and return to Val Halla";
+ next;
+ mes @npcname$;
+ mes "The bravest of Warriors were rewarded with";
+ mes "the Valkyrie Helm";
+ mes "But.. those days are long since passed..";
+ mes "I suppose I could make you one, if you can";
+ mes "gather what I need.";
+ next;
+
+ switch(select("Really? I'd love one.","I'm not one for fairy tales old man."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Here is what I need:";
+ mes "1 Sageworm Card,";
+ mes "1 Argiope Card,";
+ mes "1 Dryad Card,";
+ mes "1 Wooden Golem Card,";
+ mes "1 Bongun Card,";
+ mes "1 Pirate Skel Card,";
+ mes "1 Marduk Card and...";
+ next;
+ mes @npcname$;
+ mes "1 Hode Card,";
+ mes "1 Elder Card,";
+ mes "1 Nightmare Terror Card,";
+ mes "1000 Darkness Runes and";
+ mes "1000 Bloody Runes.";
+ next;
+ mes @npcname$;
+ if ( (countitem(4219)<1) || (countitem(4114)<1) || (countitem(4177)<1) || (countitem(4259)<1) || (countitem(4212)<1) || (countitem(4073)<1) || (countitem(4112)<1) || (countitem(4081)<1) || (countitem(4251)<1) || (countitem(4166)<1) || (countitem(7511)<1000) || (countitem(7563)<1000) ) {
+ mes "I'm sorry, but I need more to make the helm.";
+ close;
+ }
+
+ mes "Give me a minute and I'll work my magic...";
+ delitem 4219,1;
+ delitem 4114,1;
+ delitem 4177,1;
+ delitem 4259,1;
+ delitem 4212,1;
+ delitem 4073,1;
+ delitem 4112,1;
+ delitem 4081,1;
+ delitem 4251,1;
+ delitem 4166,1;
+ delitem 7511,1000;
+ delitem 7563,1000;
+ next;
+ getitem 5171,1;
+ mes @npcname$;
+ mes "This is a serious honour... You have proven yourself a brave and honorable Warrior, Wear this with Pride.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "So be it, suit yourself..";
+ close;
+ }
+
+ L_POOR:
+ mes "My time is worth more than the fortunes of Rune-Midgard and Arunafelz combined...";
+ close;
+
+}
+
+
+
+//======================= Smiling Mask / Lion Masquerade / Bride Mask ===============================
+
+payon.gat,135,231,5 script Chung-Wol-Mang 907,{
+ set @npcname$,"[Chung-Wol-Mang]";
+
+ mes @npcname$;
+ mes "Hey, I can make you three rare masks if you bring me all of the items needed to make them.";
+ next;
+ mes @npcname$;
+ mes "So, which one will it be?";
+ next;
+ switch(select("Smiling Mask","Lion Masquerade","Bride Mask","I changed my mind."))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "Okay, for the Smiling Mask I need:";
+ mes "1 Four-Leaf Clover,";
+ mes "500 Trunks,";
+ mes "10 Elastic Bands,";
+ mes "20 Memory Bookmarks,";
+ mes "1 Cigarette,";
+ mes "100 Cactus Needles and";
+ mes "100 Manes.";
+ next;
+
+ if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(7015) < 20) || (countitem(2267) < 1) || (countitem(952) < 100) || (countitem(1028) < 100) || (countitem(1028) < 100) ){
+ mes @npcname$;
+ mes "Come back and talk to me when you've gathered all the items.";
+ close;
+ }
+
+ mes @npcname$;
+ mes "You brought all the items, thanks. Here give them to me.";
+ delitem 706,1;
+ delitem 1019,500;
+ delitem 7200,10;
+ delitem 7015,20;
+ delitem 2267,1;
+ delitem 952,100;
+ delitem 1028,100;
+ next;
+ getitem 5176,1;
+ mes @npcname$;
+ mes "Thanks, you can have your mask now.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "Okay, for the Lion Masquerade I need:";
+ mes "1 Four-Leaf Clover,";
+ mes "500 Trunks,";
+ mes "10 Elastic Bands,";
+ mes "500 Horrendous Hairs,";
+ mes "2 Ancient Teeth and";
+ mes "1 Orange Dyestuff.";
+ next;
+
+ if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(1048) < 500) || (countitem(1053) < 2) || (countitem(980) < 1) ) {
+ mes @npcname$;
+ mes "Come back and talk to me when you've gathered all the items.";
+ close;
+ }
+
+ mes @npcname$;
+ mes "You brought all the items, thanks. Here give them to me.";
+ delitem 706,1;
+ delitem 1019,500;
+ delitem 7200,10;
+ delitem 1048,500;
+ delitem 1053,2;
+ delitem 980,1;
+ next;
+ getitem 5177,1;
+ mes @npcname$;
+ mes "Thanks, you can have your mask now.";
+ close;
+
+
+ case 3:
+ mes @npcname$;
+ mes "Okay, for the Bride Mask I need:";
+ mes "1 Four-Leaf Clover,";
+ mes "500 Trunks,";
+ mes "10 Elastic Bands,";
+ mes "20 Skirts of Virgin,";
+ mes "500 Transparent Celestial Robes,";
+ mes "2 Ancient Lips and";
+ mes "100 Squid Inks.";
+ next;
+
+ if ( (countitem(706) < 1) || (countitem(1019) < 500) || (countitem(7200) < 10) || (countitem(1049) < 20) || (countitem(7165) < 500) || (countitem(1054) < 2) || (countitem(1024) < 100) ) {
+ mes @npcname$;
+ mes "Come back and talk to me when you've gathered all the items.";
+ close;
+ }
+
+ mes @npcname$;
+ mes "You brought all the items, thanks. Here give them to me.";
+ delitem 706,1;
+ delitem 1019,500;
+ delitem 7200,10;
+ delitem 1049,20;
+ delitem 7165,500;
+ delitem 1054,2;
+ delitem 1024,100;
+ next;
+ getitem 5169,1;
+ mes @npcname$;
+ mes "Thanks, you can have your mask now.";
+ close;
+
+
+ case 4:
+ mes @npcname$;
+ mes "Okay, come back if you feel up to it later.";
+ close;
+
+ }
+
+}
+
+
+
+//====================== Judge Hat / A-Yam Hat =============================================
+
+payon.gat,137,123,5 script Hangaram 740,{
+ set @npcname$,"[Hangaram]";
+
+ mes @npcname$;
+ mes "Hello adventurer!";
+ mes "Our life is complicated.";
+ next;
+
+ mes @npcname$;
+ mes "But if you want I can help you by making 2 Hats.";
+ next;
+
+ mes @npcname$;
+ mes "My creations are the Judge Hat and the A-Yam Hat.";
+ mes "Which Hat do you want?";
+ next;
+
+ switch(select("Judge Hat","A-Yam Hat","No thanks"))
+ {
+
+ case 1:
+ mes @npcname$;
+ mes "^3355FFJudge Hat^000000";
+ mes "7 Red Bijou,";
+ mes "7 Blue Bijou,";
+ mes "7 Yellow Bijou,";
+ mes "7 Green Bijou,";
+ mes "300 Shining Scales,";
+ next;
+ mes "1 Black Dyestuff,";
+ mes "5 Cracked Diamond and";
+ mes "1 Slotted Hat.";
+ next;
+ mes @npcname$;
+ if( (countitem(7445)<7) || (countitem(7446)<7) || (countitem(7447)<7) || (countitem(7448)<7) || (countitem(954)<300) || (countitem(983)<1) || (countitem(733)<5) || (countitem(2221)<1) ){
+ mes "Please, return when you have everything I need.";
+ close;
+ }
+ delitem 7445,7;
+ delitem 7446,7;
+ delitem 7447,7;
+ delitem 7448,7;
+ delitem 954,300;
+ delitem 983,1;
+ delitem 733,5;
+ delitem 2221,1;
+
+ mes "Ok you seem to have all the items.";
+ next;
+
+ mes @npcname$;
+ mes "Hmmm.. We now make this... Mmm.";
+ emotion 9;
+ next;
+
+ mes @npcname$;
+ mes "Now we use the Dyestuff like this.";
+ emotion 23;
+ next;
+
+ mes @npcname$;
+ mes "OMG!!! this isn't meant to be like this.";
+ emotion 28;
+ next;
+
+ mes @npcname$;
+ mes "....";
+ next;
+
+ mes @npcname$;
+ mes "Sorry, it didn't work.";
+ next;
+
+ mes @npcname$;
+ mes "Well that's the way life is.";
+ next;
+
+ mes @npcname$;
+ mes "JAJAJAJA... I was just kidding here is your item !!";
+ emotion 29;
+ next;
+
+ getitem 5173,1;
+
+ mes @npcname$;
+ mes "Good Work.";
+ close;
+
+ case 2:
+ mes @npcname$;
+ mes "^3355FFA-Yam Hat^000000";
+ mes "7 Red Bijou,";
+ mes "7 Blue Bijou,";
+ mes "7 Yellow Bijou,";
+ mes "7 Green Bijou,";
+ mes "300 Shining Scales,";
+ next;
+ mes "1 Scarlet Dyestuff,";
+ mes "5 Cracked Diamonds and";
+ mes "50 Soft Silks.";
+ next;
+ mes @npcname$;
+ if( (countitem(7445)<7) || (countitem(7446)<7) || (countitem(7447)<7) || (countitem(7448)<7) || (countitem(954)<300) || (countitem(975)<1) || (countitem(733)<5) || (countitem(7166)<50) ){
+ mes "Please return when you have everything I need.";
+ close;
+ }
+ delitem 7445,7;
+ delitem 7446,7;
+ delitem 7447,7;
+ delitem 7448,7;
+ delitem 954,300;
+ delitem 975,1;
+ delitem 733,5;
+ delitem 7166,50;
+
+ mes "Well, you have everything.";
+ next;
+
+ mes @npcname$;
+ mes "Mmm now we just split this part...";
+ emotion 9;
+ next;
+
+ mes @npcname$;
+ mes "We throw this... Mmm..";
+ emotion 23;
+ next;
+
+ mes @npcname$;
+ mes "This isn't meant to be like this..";
+ emotion 28;
+ next;
+
+ mes @npcname$;
+ mes "... ready!!!";
+ emotion 21;
+ next;
+
+ getitem 5174,1;
+
+ mes @npcname$;
+ mes "Here you have my young fella !";
+ close;
+
+
+ case 3:
+ mes @npcname$;
+ mes "Goodbye then.";
+ close;
+
+ }
} \ No newline at end of file
diff --git a/npc/quests/obb_quest.txt b/npc/quests/obb_quest.txt
index 76aa2517b..b134c1db6 100644
--- a/npc/quests/obb_quest.txt
+++ b/npc/quests/obb_quest.txt
@@ -1,197 +1,197 @@
-//===== Athena Script =======================================
-//= Old Blue Box Quest
-//===== By ================================================
-//= Celesta, Lupus
-//===== Version ===========================================
-//= 1.6a
-//===== Compatible With ===================================
-//= SVN3000+
-//===== Description =======================================
-//= Official OBB Quest. You can pass it any times you want.
-//= 1.6 Updated, fixed, optimized and translated into English [Lupus]
-//= 1.6a Halved the required items to make an obb, thanks to marquis007 [MasterOfMuppets]
-//===== Description =======================================
-
-alberta.gat,115,204,5 script Tourist 97,{
- mes "[Tourist]";
- if(obb_quest == 1 ) goto L_YES;
- if(obb_quest == 2 ) goto L_DONE;
-
- mes "Hello, stranger!";
- mes "Could you help me with kinda problem... Then I'd tell you something valuable.";
- next;
- mes "[Tourist]";
- mes "I'm starving. I haven't had an apple since the morning...";
- mes "Feed me and I'll tell you a secret.";
- next;
-
-L_MENU:
- menu "What do you like?",-,"I've got food.",L_FOOD, "See you later.", L_END;
-
- mes "[Tourist]";
- mes "Me.. I.. Today I'd like:";
- mes "20 ^0000FFMeat^000000";
- mes "20 ^0000FFWell-Baked Cookie^000000";
- next;
- goto L_MENU;
-
-L_NO_MEAT:
- delitem 517,20;//Items: Meat,
- mes "You know, you're lack of meat...";
- mes "Please, bring me more...";
- close;
-
-L_NO_COOK:
- delitem 538,20;//Items: Well-baked_Cookie,
- mes "Awww... I just wanna more sweeties!";
- mes "Please, get me more cookies...";
- close;
-
-L_FOOD:
- mes "[Tourist]";
- mes "Wha?! You brought all the food?";
- mes "At last!";
- next;
- mes "[Tourist]";
- if(countitem(517)<20) goto L_NO_MEAT;//Items: Meat,
- delitem 517,20;//Items: Meat,
- if(countitem(538)<20) goto L_NO_COOK;//Items: Well-baked_Cookie,
- delitem 538,20;//Items: Well-baked_Cookie,
- if(rand(10)<7) goto L_HUNGRY;
- mes "Well... I'm sorta full.";
- mes "Now listen to me. It's important.";
- next;
- mes "[Tourist]";
- mes "A friend of mine who lives in Morroc, know one old man from Comodo...";
- next;
- mes "[Tourist]";
- mes "That old man might know a secret of strange ancient blue boxes.";
- set obb_quest, 1;
- close;
-
-L_HUNGRY:
- mes "I'm still hungry!";
- mes "Is it all you got?";
- close;
-
-L_YES:
- mes "OK, go to Morroc and find my old pal Jacob,";
- mes "he'll help you to trace an old man, who might keep a knowledge how to make some blue boxes...";
- next;
- mes "[Tourist]";
- mes "Good luck, my friend.";
- close;
-
-L_DONE:
- mes "Have you made any Blue Boxes yet?";
- next;
- mes "[Tourist]";
- mes "Oh... yeah, you've met that Old Greek from Comodo...";
- close;
-
-L_END:
- mes "[Tourist]";
- mes "Well... farewell then.";
- close;
-}
-
-//second part Jacob
-morocc.gat,267,142,5 script Jacob 807,{
- mes "[Jacob]";
- if(obb_quest == 1 ) goto L_YES;
- if(obb_quest == 2 ) goto L_DONE;
- mes "Get off! I'm busy!";
- if(rand(2))mes "And it's none of your business!";
- if(rand(2))mes "What Alberta? Huh?! Have I said it aloud? Forget it.";
- close;
-
-L_YES:
- mes "Aha! You say you know my old friend from Alberta?";
- next;
- mes "[Jacob]";
- mes "Well, I'm gladly tell you about that weird old man if you bring me";
- mes "2 ^0000FFNo Recipient^000000";
- next;
- menu "Here you are!",-,"I've changed my plans.",L_END;
-
- mes "[Jacob]";
- mes "Let me see...";
- if(countitem(636)<2) goto L_NOITM;//Items: No_Recipient,
- delitem 636,2;//Items: No_Recipient,
- mes "Thank you, that's all I need.";
- emotion e_thx;
- next;
- mes "[Jacob]";
- set obb_quest, 2;
-L_DONE:
- mes "Go to Comodo. Somewhere on the beach you'll find Old Greek.";
- mes "Tell me that you know me and he'll help you.";
- close;
-
-L_NOITM:
- mes "Pardon, but I do really need these two ^0000FFNo Recipients^000000.";
- emotion e_hmm;
- close;
-
-L_END:
- mes "[Jacob]";
- mes "Well, good luck.";
- close;
-}
-
-//third part
-comodo.gat,41,209,5 script Old Greek 120,{
- mes "[Old Greek]";
- if(obb_quest == 2 ) goto L_YES;
- if(obb_quest < 2 ) goto L_LOST;
-
-L_LOST:
- mes "The KNOWLEDGE! That's the key, my child...";
- if(rand(2))mes "Wealth doesn't matter.";
- close;
-
-L_YES:
- mes "Huh? Jacob send you?";
- mes "OK, OK... It's true, I still can use old blue prints to make";
- mes "an ^0000FF Old Blue Box^000000";
- next;
-
-L_MENU:
- menu "Make me one.",L_CREATE,"What do you need?",-,"Gooodbye.",L_END;
-
- mes "[Old Greek]";
- mes "For an Old Blue Box I need:";
- mes "50 ^0000FFCyfars^000000";
- mes "10 ^0000FFBrigans^000000";
- mes "10 ^0000FFClam Shells^000000";
- mes "15 ^0000FFCrab Shells^000000";
- next;
- goto L_MENU;
-
-L_CREATE:
- mes "[Old Greek]";
- mes "Let's see... What have you got...";
- next;
-L_CREATE2:
- if(countitem(7053)<50 || countitem(7054)<10 || countitem(965)<10 || countitem(964)<15) goto L_NO;//Items: Cyfar, Brigan, Clam_Shell, Crab_Shell,
- delitem 7053,50;//Items: Cyfar,
- delitem 7054,10;//Items: Brigan,
- delitem 965,10;//Items: Clam_Shell,
- delitem 964,15;//Items: Crab_Shell,
- getitem 603,1;//Items: Old_Blue_Box,
- mes "[Old Greek]";
- mes "Here's your Box!";
- emotion e_no1;
- next;
- menu "Make another!",L_CREATE2, "It's enough.",-;
-
-L_END:
- mes "[Old Greek]";
- mes "I wish you happy journey, my child.";
- close;
-
-L_NO:
- mes "[Old Greek]";
- mes "Alas, my child. You haven't brought enough materials...";
- close;
-}
+//===== Athena Script =======================================
+//= Old Blue Box Quest
+//===== By ================================================
+//= Celesta, Lupus
+//===== Version ===========================================
+//= 1.6a
+//===== Compatible With ===================================
+//= SVN3000+
+//===== Description =======================================
+//= Official OBB Quest. You can pass it any times you want.
+//= 1.6 Updated, fixed, optimized and translated into English [Lupus]
+//= 1.6a Halved the required items to make an obb, thanks to marquis007 [MasterOfMuppets]
+//===== Description =======================================
+
+alberta.gat,115,204,5 script Tourist 97,{
+ mes "[Tourist]";
+ if(obb_quest == 1 ) goto L_YES;
+ if(obb_quest == 2 ) goto L_DONE;
+
+ mes "Hello, stranger!";
+ mes "Could you help me with kinda problem... Then I'd tell you something valuable.";
+ next;
+ mes "[Tourist]";
+ mes "I'm starving. I haven't had an apple since the morning...";
+ mes "Feed me and I'll tell you a secret.";
+ next;
+
+L_MENU:
+ menu "What do you like?",-,"I've got food.",L_FOOD, "See you later.", L_END;
+
+ mes "[Tourist]";
+ mes "Me.. I.. Today I'd like:";
+ mes "20 ^0000FFMeat^000000";
+ mes "20 ^0000FFWell-Baked Cookie^000000";
+ next;
+ goto L_MENU;
+
+L_NO_MEAT:
+ delitem 517,20;//Items: Meat,
+ mes "You know, you're lack of meat...";
+ mes "Please, bring me more...";
+ close;
+
+L_NO_COOK:
+ delitem 538,20;//Items: Well-baked_Cookie,
+ mes "Awww... I just wanna more sweeties!";
+ mes "Please, get me more cookies...";
+ close;
+
+L_FOOD:
+ mes "[Tourist]";
+ mes "Wha?! You brought all the food?";
+ mes "At last!";
+ next;
+ mes "[Tourist]";
+ if(countitem(517)<20) goto L_NO_MEAT;//Items: Meat,
+ delitem 517,20;//Items: Meat,
+ if(countitem(538)<20) goto L_NO_COOK;//Items: Well-baked_Cookie,
+ delitem 538,20;//Items: Well-baked_Cookie,
+ if(rand(10)<7) goto L_HUNGRY;
+ mes "Well... I'm sorta full.";
+ mes "Now listen to me. It's important.";
+ next;
+ mes "[Tourist]";
+ mes "A friend of mine who lives in Morroc, know one old man from Comodo...";
+ next;
+ mes "[Tourist]";
+ mes "That old man might know a secret of strange ancient blue boxes.";
+ set obb_quest, 1;
+ close;
+
+L_HUNGRY:
+ mes "I'm still hungry!";
+ mes "Is it all you got?";
+ close;
+
+L_YES:
+ mes "OK, go to Morroc and find my old pal Jacob,";
+ mes "he'll help you to trace an old man, who might keep a knowledge how to make some blue boxes...";
+ next;
+ mes "[Tourist]";
+ mes "Good luck, my friend.";
+ close;
+
+L_DONE:
+ mes "Have you made any Blue Boxes yet?";
+ next;
+ mes "[Tourist]";
+ mes "Oh... yeah, you've met that Old Greek from Comodo...";
+ close;
+
+L_END:
+ mes "[Tourist]";
+ mes "Well... farewell then.";
+ close;
+}
+
+//second part Jacob
+morocc.gat,267,142,5 script Jacob 807,{
+ mes "[Jacob]";
+ if(obb_quest == 1 ) goto L_YES;
+ if(obb_quest == 2 ) goto L_DONE;
+ mes "Get off! I'm busy!";
+ if(rand(2))mes "And it's none of your business!";
+ if(rand(2))mes "What Alberta? Huh?! Have I said it aloud? Forget it.";
+ close;
+
+L_YES:
+ mes "Aha! You say you know my old friend from Alberta?";
+ next;
+ mes "[Jacob]";
+ mes "Well, I'm gladly tell you about that weird old man if you bring me";
+ mes "2 ^0000FFNo Recipient^000000";
+ next;
+ menu "Here you are!",-,"I've changed my plans.",L_END;
+
+ mes "[Jacob]";
+ mes "Let me see...";
+ if(countitem(636)<2) goto L_NOITM;//Items: No_Recipient,
+ delitem 636,2;//Items: No_Recipient,
+ mes "Thank you, that's all I need.";
+ emotion e_thx;
+ next;
+ mes "[Jacob]";
+ set obb_quest, 2;
+L_DONE:
+ mes "Go to Comodo. Somewhere on the beach you'll find Old Greek.";
+ mes "Tell me that you know me and he'll help you.";
+ close;
+
+L_NOITM:
+ mes "Pardon, but I do really need these two ^0000FFNo Recipients^000000.";
+ emotion e_hmm;
+ close;
+
+L_END:
+ mes "[Jacob]";
+ mes "Well, good luck.";
+ close;
+}
+
+//third part
+comodo.gat,41,209,5 script Old Greek 120,{
+ mes "[Old Greek]";
+ if(obb_quest == 2 ) goto L_YES;
+ if(obb_quest < 2 ) goto L_LOST;
+
+L_LOST:
+ mes "The KNOWLEDGE! That's the key, my child...";
+ if(rand(2))mes "Wealth doesn't matter.";
+ close;
+
+L_YES:
+ mes "Huh? Jacob send you?";
+ mes "OK, OK... It's true, I still can use old blue prints to make";
+ mes "an ^0000FF Old Blue Box^000000";
+ next;
+
+L_MENU:
+ menu "Make me one.",L_CREATE,"What do you need?",-,"Gooodbye.",L_END;
+
+ mes "[Old Greek]";
+ mes "For an Old Blue Box I need:";
+ mes "50 ^0000FFCyfars^000000";
+ mes "10 ^0000FFBrigans^000000";
+ mes "10 ^0000FFClam Shells^000000";
+ mes "15 ^0000FFCrab Shells^000000";
+ next;
+ goto L_MENU;
+
+L_CREATE:
+ mes "[Old Greek]";
+ mes "Let's see... What have you got...";
+ next;
+L_CREATE2:
+ if(countitem(7053)<50 || countitem(7054)<10 || countitem(965)<10 || countitem(964)<15) goto L_NO;//Items: Cyfar, Brigan, Clam_Shell, Crab_Shell,
+ delitem 7053,50;//Items: Cyfar,
+ delitem 7054,10;//Items: Brigan,
+ delitem 965,10;//Items: Clam_Shell,
+ delitem 964,15;//Items: Crab_Shell,
+ getitem 603,1;//Items: Old_Blue_Box,
+ mes "[Old Greek]";
+ mes "Here's your Box!";
+ emotion e_no1;
+ next;
+ menu "Make another!",L_CREATE2, "It's enough.",-;
+
+L_END:
+ mes "[Old Greek]";
+ mes "I wish you happy journey, my child.";
+ close;
+
+L_NO:
+ mes "[Old Greek]";
+ mes "Alas, my child. You haven't brought enough materials...";
+ close;
+}
diff --git a/npc/quests/quests_alberta.txt b/npc/quests/quests_alberta.txt
index 511875537..819358092 100644
--- a/npc/quests/quests_alberta.txt
+++ b/npc/quests/quests_alberta.txt
@@ -1,1193 +1,1193 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Alberta
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Dolls Quest
-//= Boy's Cap Quest
-//= Antlers Quest
-//= Bao Bao, Cresent Hairpin, Fashionbale Glasses, Heart Hairpin Quests
-//= Hat of Sun God, Sunday Hat, Mage Hat, Magician Hat Quests
-//= Turtle Island Quests
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed Spore Doll exploit, Gramp's Tiger skin label bug
-//= 1.3 Fixed item ID 7031 -> 7013
-//= 1.4 Fixed a bug, Fixed Exploits, Optimized [Lupus]
-//= 1.6 TEMPESTRA quest uses common quests variable MISC_QUEST
-//= Condition if done: (MISC_QUEST & 2) [Lupus]
-//= 1.7 Moved quest from cities/albera.txt [Evera]
-//============================================================
-
-
-
-//=======================================================================================================//
-// Doll Quest
-//=======================================================================================================//
-alberta.gat,117,134,8 script Elin 96,{
- mes "[Elin]";
- if(Sex){
- mes "Hello, mister. Hmm, since you're a boy, you don't like dolls, do you?";
- }else{
- mes "Hello, miss. Since you're a girl, you must like dolls, don't you?";
- }
- next;
- mes "[Elin]";
- mes "I LOVE dolls!!";
- emotion e_lv2;
- next;
- mes "[Elin]";
- mes "Ya know..... I REALLY, REALLY, want a new doll. I hope daddy is going to buy me one for my birthday.....";
- next;
- menu "Aww, you must be happy...",-,"How about I give you one now?",M_2;
-
- mes "[Elin]";
- mes "Yeah, this time I'm hoping for a Yoyo doll. Hehe, they're so cute! They're my FAVORITE!";
- emotion e_ok;
- close;
- M_2:
- mes "[Elin]";
- mes "Oh my goodness! Really?? You're such a sweetie.... gimme, gimme!!";
- mes "What kinda doll are you going to give me? Are you really gonna give me one?";
- emotion e_gasp;
- next;
- menu "Puppet",-,"Poring doll",sM_2,"Chonchon doll",sM_3,"Rocker doll",sM_4, "Spore doll",sM_5,
- "Osiris doll",sM_6,"Baphomet doll",sM_7,"Racoon doll",sM_8,"Yoyo doll",sM_9, "I am as adorable as a doll!",sM_10;
-
- if(countitem(740) < 1) goto L_Liar;
- delitem 740,1;
- mes "[Elin]";
- mes "Wow--! It's a rabbit! It's SOOOO cute!! Thank you SOOO much!";
- emotion e_lv2;
- next;
- mes "[Elin]";
- mes "It's SOOO fluffy... Oh yeah! Let me give you a present too!";
- next;
- mes "(diggs around in her pockets)";
- next;
- mes "[Elin]";
- mes "Ummm ... found it! Here take this!";
- next;
- getitem 530,1;
- mes "[Elin]";
- mes "I got this from Santa. It's a candy cane~";
- next;
- mes "[Elin]";
- mes "Thanks again for the rabbit doll! I'm gonna HUG this to sleep EVERY night~";
- emotion e_thx;
- close;
-
- sM_2:
- if(countitem(741) < 1) goto L_Liar;
- delitem 741,1;
- mes "[Elin]";
- mes "Yay! It's a poring doll! It's SOOOO cute! Since you gave me a doll I'll give you this....";
- emotion e_lv2;
- next;
- getitem 529,1;
- mes "[Elin]";
- mes "Thank you for the doll!";
- emotion e_thx;
- close;
-
- sM_3:
- if(countitem(742) < 1) goto L_Liar;
- delitem 742,1;
- mes "[Elin]";
- mes "Ew whats this?.... a Chonchon ... doll? ...";
- emotion e_wah;
- next;
- mes "[Elin]";
- mes "Oh well, since you're giving it to me, I guess it's ok ....";
- next;
- mes "[Elin]";
- mes "Well here's a little something for giving me the doll. Don't eat too much or you'll get cavities.";
- getitem 530,1;
- next;
- mes "[Elin]";
- mes ".... chonchon.... (~grumble, grumble~)";
- emotion e_ag;
- close;
-
- sM_4:
- if(countitem(752) < 1) goto L_Liar;
- delitem 752,1;
- mes "[Elin]";
- mes "Oh! a Rocker doll. I hate hopping things but this doll's kinda cute.";
- next;
- mes "[Elin]";
- mes "Thank you. Let me give you something too.";
- next;
- mes "[Elin]";
- mes "Hmm, didn't I get some stuff from my uncle ...";
- next;
- mes "[Elin]";
- mes "Here it is. We've got tons of it at home so I'll share some with you~";
- getitem 532,7;
- next;
- mes "[Elin]";
- mes "Thanks again for the doll!";
- emotion e_thx;
- close;
-
- sM_5:
- if(countitem(743) < 1) goto L_Liar;
- delitem 743,1;
- mes "[Elin]";
- mes "Blehh .... It's a mushroom... Mom's always scolding me for not eating mushrooms ...";
- emotion e_swt;
- next;
- mes "[Elin]";
- mes "I'll take it anyway, since the doll looks cute. But I still won't eat mushrooms though ...";
- next;
- mes "[Elin]";
- mes "Hmm, I'll need to give you a present too.";
- next;
- mes "[Elin]";
- mes "My mom made this so please take it.";
- getitem 538,5;
- next;
- mes "[Litte Kid]";
- mes "Thank you for the doll~";
- emotion e_thx;
- close;
-
- sM_6:
- if(countitem(751) < 1) goto L_Liar;
- delitem 751,1;
- mes "[Elin]";
- mes "Yay! It's an Osiris doll!";
- next;
- mes "[Elin]";
- mes "Here's something for you too.";
- getitem 522,2;
- mes "[Elin]";
- mes "Thank you for the doll!";
- close;
-
- sM_7:
- if(countitem(750) < 1) goto L_Liar;
- delitem 750,1;
- mes "[Elin]";
- mes "Yay! It's a Baphomet doll!";
- next;
- mes "[Elin]";
- mes "Here's something for you too.";
- getitem 525,5;
- mes "[Elin]";
- mes "Thank you for the doll!";
- emotion e_thx;
- close;
-
- sM_8:
- if(countitem(754) < 1) goto L_Liar;
- delitem 754,1;
- mes "[Elin]";
- mes "Ah, it's a Smokie doll. I hate Smokies, but the doll's really cute! Thank you!";
- emotion e_ok;
- next;
- mes "[Elin]";
- mes "Let me give you some of Grandma's home-made cake!";
- getitem 539,3;
- next;
- mes "[Elin]";
- mes "They're really good so make sure you eat them ok.";
- next;
- mes "[Elin]";
- mes "Thanks again for this cute doll!";
- emotion e_thx;
- close;
-
- sM_9:
- if(countitem(753) < 1) goto L_Liar;
- delitem 753,1;
- mes "[Elin]";
- mes "WOW--!!! OH MY GOSH! It's a Yoyo doll! This is what I REALLY wanted!! It's SOOOO cute......";
- emotion e_lv2;
- next;
- mes "[Elin]";
- mes "As a thank you, I'll give you this.";
- getitem 608,1;
- next;
- mes "[Elin]";
- mes "Dad picked them up during his travels. It's a seed of some kind.";
- mes "We tried planting them at home, but it doesn't seem to grow.";
- next;
- mes "[Elin]";
- mes "Anyway, thank you SOOO MUCH for the Yoyo doll!!!!";
- emotion e_thx;
- close;
-
- sM_10:
- mes "[Elin]";
- mes "BLAAAAAAAAHHH!! Don't make fun of me cuz I'm young!";
- emotion e_pif;
- next;
- mes "[Elin]";
- mes "(mumbles) .....'stupid'.....";
- close;
-
- L_Liar:
- mes "[Elin]";
- mes "HEY!! You don't have any dolls... I can't believe you would lie to a little kid!!!";
- emotion e_gasp;
- next;
- mes "[Elin]";
- mes "You're a MEANIE!! I HATE YOU!!!..... sniff... sniff.... Waaaaaaaaaaaaaaaaaaaahhhhhh!!";
- emotion e_sob;
- close;
-}
-
-
-//=======================================================================================================//
-// Boy's Cap' Quest
-//=======================================================================================================//
-alberta_in.gat,28,145,4 script Grampa 120,{
- mes "[Grampa]";
- mes "Gasp ..Gasp";
- next;
- mes "[Grampa]";
- mes "When I look back on my younger days... I regret not making better use of my time...";
- next;
- mes "[Grampa]";
- mes "Even so I STILL feel young at heart..... unfortunately my body is very old and is in poor condtion...... Cough !! Cough .. !!";
- next;
- if(countitem(1030) >= 10) menu "Talk.",M_Talk, "Show him Tiger's Footskin.",M_Show, "Cancel.",M_End;
- menu "Talk",M_Talk, "Cancel",M_End;
-
- M_Talk:
- mes "[Grampa]";
- mes "Listen to me..... You must take care of your body as best you can....";
- mes "If you aren't serious about staying healthy now..... you will surely regret it as you get older.";
- next;
- mes "[Grampa]";
- mes "I've tried to restore my body to its youthful, healthy state with all of the best herbs and medicines that money can buy....";
- next;
- mes "[Grampa]";
- mes "Not only have none of them worked, but their emense cost have made me bankurpt!";
- next;
- mes "[Grampa]";
- mes "I have all but given up on trying to restore my youth.... there IS still one last thing I have not yet tried.....";
- next;
- mes "[Grampa]";
- mes "It is the ^3355FFTiger's Footskin^000000, the legendary king of rejuvination!!";
- emotion e_gasp;
- next;
- mes "[Grampa]";
- mes "Have you heard of the Tiger's Footskin???.....";
- emotion e_what;
- next;
- mes "[Grampa]";
- mes "Just by LOOKING at it, your white hair turns Black again! By SMELLING it, your reflexes become 10x faster!";
- mes "And just a single TASTE can turn and 80 year old man.... INTO AN 18 BOY!!!!";
- next;
- mes "[Grampa]";
- mes "It truely is amazing! Ah, if I could only get my hands on some Tiger's Footskin.... my wishes would at last come true.....";
- next;
- mes "[Grampa]";
- mes "For whoever brings me ^5555FF10 Tiger's Footskins^000000, I would gladly give that person my precious ^3355FFBoys Cap^000000.";
- close;
-
- M_Show:
- mes "[Grampa]";
- mes "Ohhh !! Th-This is the... this is the legendary.... TIGERS FOOTSKIN!!";
- next;
- mes "[Grampa]";
- mes "Just by LOOKING at it, your white hair turns Black again! By SMELLING it, your reflexes become 10x faster!";
- mes "And just a single TASTE can turn and 80 year old man.... INTO AN 18 BOY!!!!";
- next;
- mes "[Grampa]";
- mes "It is the real Tiger's Footskin !! In my wildest dreams I never thought...... P-P-Please.... I beg you.... let me have it.....";
- next;
- menu "-Give him the Tiger's Footskin.",-, "Walk away.", sM_End;
-
- mes "[Grampa]";
- if(countitem(1030) < 10) goto L_NoItems;
- delitem 1030,10;
- getitem 5016,1;
- mes "T-Thank YOU!! Thank you SO VERY MUCH!!";
- emotion e_thx;
- next;
- mes "[Grampa]";
- mes "Now my body can be reinvigorated!!! I will eat it right away!";
- close;
-
- L_NoItems:
- mes "Get off damn cheater!!!";
- emotion e_bzz;
- close;
-
- sM_End:
- mes "[Grampa]";
- mes "H-He-Hey!! Young one!! W-Wa-it! Please.... come back... I beg you.... come... back.... ooohh... foot.... sk... i... n....";
- close;
-
- M_End:
- mes "[Grampa]";
- mes "Cough Cough !! .. Tiger ....Tiger's ..... Foot ..... skin .....Cough Cough !!";
- close;
-
-
-}
-
-
-//=======================================================================================================//
-// Antlers Quest
-//=======================================================================================================//
-alberta_in.gat,122,53,4 script Cherokee 47,{
- mes "[Cherokee]";
- mes "Hey there, I am a Horn Collector. Sounds great, huh?";
- next;
- mes "[Cherokee]";
- mes "What do you think about Animal horns? I think they are very valuable and are well worth collecting.";
- mes "You can wear them on your head, or even decorate your house with them.";
- next;
- mes "[Cherokee]";
- mes "You know.... there has been a particular horn that I have not been able to find. It is the ^5555FF'Evil Horn '^000000..";
- next;
- mes "[Cherokee]";
- mes "Some say that an Evil Horn is really not an animal's horn, but one that comes from a Devil!";
- mes "Even so, I really wish I could get my hands on one.";
- next;
- mes "[Cherokee]";
- mes "Say.... do you have any ^5555FF'Evil Horns'^000000?";
- mes "If you offer me ^5533FF20 Evil Horns^000000, I will give you my precious and famed, ^FF3355'Antlers'^000000. Is it a deal?";
- next;
- menu "You got it!",-, "Shut up Dumbo.",M_End;
-
- mes "[Cherokee]";
- if(countitem(923) < 20) goto L_NotEnuf;
- delitem 923,20;
- mes "Whoah~! This is the first time I've ever seen a real ^3355FF'Evil Horn'^000000!!";
- emotion e_ic;
- next;
- mes "[Cherokee]";
- mes "Thank you! Here are the Antlers just as I promised you!";
- emotion e_thx;
- getitem 2284,1;
- next;
- mes "[Cherokee]";
- mes "With your great help I was finally able to realize my long time dream. I appreciate what you have done! God Bless You ..";
- close;
-
- L_NotEnuf:
- mes "Hmm.... like I said, I need ^FF5533'20 Evil Horns'^000000.";
- close;
-
- M_End:
- mes "[Cherokee]";
- mes "Well aren't you a rude person.... I will forgive you however, seeing as we will meet again, I'm sure....";
- close;
-}
-
-
-//=======================================================================================================//
-// Bao Bao, Cresent Hairpin, Fashionbale Glasses, Heart Hairpin
-//=======================================================================================================//
-alberta.gat,120,53,3 script Zic 51,{
- mes "[Zic]";
- mes "Yay! A cool breeze! That's why I love the sea!!";
- emotion e_ho;
- next;
- mes "[Zic]";
- mes "Huh?... Do you have any business with me? You came to me because I'm a merchant right?";
- emotion e_hmm;
- next;
- mes "[Zic]";
- mes "~Sigh!~ I get tired of my reputation.... I can't get any peace or quite around here.....";
- next;
- mes "[Zic]";
- mes "So what do you wanna get? Tell me, tell me! It's so easy to guess what you want.....";
- next;
- menu "-Bao Bao",-, "-Cresent Hairpin",M_1, "-Fashionable Glasses",M_2, "-Heart Hairpin",M_3;
-
- mes "[Zic]";
- mes "To make a Bao Bao I will need:"; //5042
- mes "- ^5555FF1 Silk Ribbon^000000,"; //10007
- mes "- ^5555FF50 Herioc Emblems^000000."; //968
- next;
- mes "[Zic]";
- mes "Would you like me to make you one?";
- next;
- menu "Sure.",-, "No thanks.",M_End;
-
- if (countitem(10007)<1 || countitem(968)<50) goto sL_NotEnuf;
- delitem 10007, 1;
- delitem 968, 50;
- mes "[Zic]";
- mes "Please wait while I make your Bao Bao......";
- next;
- mes "[Zic]";
- mes "There you are, one Bao Bao. Enjoy.";
- getitem 5042, 1;
- close;
- M_1:
- mes "[Zic]";
- mes "To make a Cresent Hairpin I will need:"; //5048
- mes "- ^5555FF1 Heart Hair Pin^000000,"; //5041
- mes "- ^5555FF10 Steel^000000."; //999
- next;
- mes "[Zic]";
- mes "Would you like me to make you one?";
- next;
- menu "Sure.",-, "No thanks.",M_End;
-
- if (countitem(5041)<1 || countitem(999)<10) goto sL_NotEnuf;
- delitem 5041, 1;
- delitem 999, 10;
- mes "[Zic]";
- mes "Please wait while I make your Cresent Hairpin......";
- next;
- mes "[Zic]";
- mes "There you are, one Cresent Hairpin. Enjoy.";
- getitem 5048, 1;
- close;
- M_2:
- mes "[Zic]";
- mes "To make a pair of Fashionable Glasses I will need:"; //5047
- mes "- ^5555FF1 Jack a Dandy^000000,"; //2271
- mes "- ^5555FF1 Scarlet Dyestuffs^000000."; //975
- next;
- mes "[Zic]";
- mes "Would you like me to make you one?";
- next;
- menu "Sure.",-, "No thanks.",M_End;
-
- if (countitem(2271)<1 || countitem(975)<1) goto sL_NotEnuf;
- delitem 2271, 1;
- delitem 975, 1;
- mes "[Zic]";
- mes "Please wait while I make your Fashionable Glasses......";
- next;
- mes "[Zic]";
- mes "There you are, one Fashionable Glasses. Enjoy.";
- getitem 5047, 1;
- close;
- M_3:
- mes "[Zic]";
- mes "Are you sure you want a simple item like this? Oh well... To make a Heart Hairpin I will need:"; //5041
- mes "- ^5555FF1200 Coral Reefs^000000."; //7013
- emotion e_hmm;
- next;
- mes "[Zic]";
- mes "Would you like me to make you one?";
- next;
- menu "Sure.",-, "No thanks.",M_End;
-
- if (countitem(7013)<1200) goto sL_NotEnuf;
- delitem 7013, 1200;
- mes "[Zic]";
- mes "Please wait while I make your Hear Hairpin......";
- next;
- mes "[Zic]";
- mes "There you are, one Heart Hairpin. Enjoy.";
- getitem 5041, 1;
- close;
-
- sL_NotEnuf:
- mes "[Zic]";
- mes "Hmm.... you don't have enough items for me to make it. Come back some other time.";
- close;
-
- M_End:
- mes "[Zic]";
- mes "See ya around.";
- close;
-}
-
-
-//=======================================================================================================//
-// Hat of Sun God, Sunday Hat, Mage Hat, Magician Hat
-//=======================================================================================================//
-alberta.gat,135,79,3 script Tempestra 71,{
- mes "[Tempestra]";
- mes "Ah...... Such a cool breeze. It's good to be next to the sea. I think it was the right choice for me to take a break from my business and come here.";
- emotion e_ho;
- if(MISC_QUEST & 2) goto sM_Menu;
- next;
- mes "[Tempestra]";
- mes "Oh the sun is so bright today. I'm glad I brought my hat. If my skin is exposed to the sun like this everyday, I'm sure to get a sunburn.";
- next;
- mes "[Tempestra]";
- mes "Boy, the heat is making me thirsty. Nothing would be better right now, than sipping on a perfectly chilled yellow potion.....";
- next;
- menu "Here you go, my treat.",-, "Then go get one, sheesh....",M_1;
-
- if(countitem(503) < 1) goto L_NoPot;
- delitem 503, 1;
- set MISC_QUEST,MISC_QUEST | 2;
- mes "[Tempestra]";
- mes "Oooh! Thank you so much. I'm so glad to meet such a friendly person here....";
- emotion e_thx;
- next;
- mes "[Tempestra]";
- mes "(~gulp~gulp~)";
- next;
- mes "[Tempestra]";
- mes "Hyaaaaaaa!! It's sooo cold!! Thank you.";
- sM_Menu:
- next;
- menu "The weather is really hot, isn't it...",-, "You should wear a hat.",sM_1;
-
- mes "[Tempestra]";
- mes "Yes, it's very hot indeed.....";
- next;
- mes "[Tempestra]";
- mes "Luckly I brought a lot of hats along. I have";
- mes "a ^5555FF'Sunday Hat'^000000,";
- mes "a ^5555FF'Mage Hat'^000000,";
- mes "a ^5555FF'Magician Hat'^000000, and more in my room...";
- next;
- mes "[Tempestra]";
- mes "I brought these hats with me so that I could sell them and use the money I made for my vacation expenses....";
- mes "but now it looks like I'll have to wear one.....";
- ssM_Menu:
- next;
- menu "Sunday Hat?",-, "Mage Hat?",ssM_0b, "Magician Hat?",ssM_0c, "End Conversation.",ssM_End;
-
- mes "[Tempestra]";
- mes "A Sunday Hat is made up of:";
- mes "- ^5555FF250 Fabric^000000,";
- mes "- ^5555FF1 Slotted Hat^000000,";
- mes "- ^5555FF1 Slotted Cap^000000,";
- mes "- ^5555FF600 Soft Feathers^000000.";
- mes "If you want, I can make one for you. Just bring me all of those items.";
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- if (countitem(1059)<250 || countitem(2221)<1 || countitem(2227)<1 || countitem(7063)<600) goto ssM_Menu;
- delitem 1059, 250;
- delitem 2221, 1;
- delitem 2227, 1;
- delitem 7063, 600;
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5032, 1;
- mes "[Tempestra]";
- mes "All done... one Sunday Hat just for you. Thank you and come back any time.";
- emotion e_thx;
- close;
- ssM_0b:
- mes "[Tempestra]";
- mes "A Mage Hat is made up of:";
- mes "- ^5555FF1 Wizard Hat^000000,";
- mes "- ^5555FF400 Dragon Scales^000000,";
- mes "- ^5555FF50 Mould Powder^000000,";
- mes "- ^5555FF1 Elder Wilow Card^000000.";
- mes "If you want, I can make one for you. Just bring me all of those items.";
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- if (countitem(2252)<1 || countitem(1036)<400 || countitem(7001)<50 || countitem(4052)<1) goto ssM_Menu;
- delitem 2252, 1;
- delitem 1036, 400;
- delitem 7001, 50;
- delitem 4052, 1;
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5027, 1;
- mes "[Tempestra]";
- mes "All done... one Mage Hat just for you. Thank you and come back any time.";
- emotion e_thx;
- close;
- ssM_0c:
- mes "[Tempestra]";
- mes "A Magician Hat is made up of:";
- mes "- ^5555FF1 Wizard Hat^000000,";
- mes "- ^5555FF450 Ancient Lips^000000,";
- mes "- ^5555FF1200 Solid Shells^000000,";
- mes "If you want, I can make one for you. Just bring me all of those items.";
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- if (countitem(2252)<1 || countitem(1054)<450 || countitem(943)<1200) goto ssM_Menu;
- delitem 2252, 1;
- delitem 1054, 450;
- delitem 943, 1200;
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5045, 1;
- mes "[Tempestra]";
- mes "All done... one Magician just for you. Thank you and come back any time.";
- emotion e_thx;
- close;
- ssM_End:
- close;
-
- sM_1:
- mes "[Tempestra]";
- mes "Oh but the hats I have are for sale.... if I use them for myself I won't be able to sell them to my customers.";
- next;
- mes "[Tempestra]";
- mes "Because you gave me the potion, I would like to make something for you. Unfortuately I don't have any materials right now.";
- next;
- mes "[Tempestra]";
- mes "Hmm... If you have:";
- mes "^5555FF1 Emblem of the Sun God";
- mes "10 Gold";
- mes "40 Steel";
- mes "50 Coal";
- mes "and 2 Oridecon^000000..........";
- next;
- mes "[Tempestra]";
- mes "I can make you a ^5555FF'Hat of the Sun God'^000000!! It's a fantastic piece of work! How's that sound?";
- next;
- menu "Alright.",-, "Not right now thanks.",ssM_1b;
-
- if(countitem(7086)<1 || countitem(969)<10 || countitem(999)<40 || countitem(1003)<50 || countitem(984)<2) goto ssL_NotEnuf;
- delitem 7086, 1;
- delitem 969, 10;
- delitem 999, 40;
- delitem 1003, 50;
- delitem 984, 2;
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5022, 1;
- mes "[Tempestra]";
- mes "All done... one Hat of the Sun God just for you. Thank you again for the potion, and please come back any time.";
- emotion e_thx;
- close;
-
- ssL_NotEnuf:
- mes "[Tempestra]";
- mes "Um.... where are those items exactly???";
- emotion e_hmm;
- close;
- ssM_1b:
- mes "[Tempestra]";
- mes "Come back anytime when you've changed your mind.";
- close;
-
- L_NoPot:
- mes "[Tempestra]";
- mes "Umm... excuse me but.... where is the potion??";
- emotion e_hmm;
- close;
-
- M_1:
- mes "[Tempestra]";
- mes "..... How RUDE!!";
- emotion e_gasp;
- close;
-}
-
-//=======================================================================================================//
-// Turtle Quest
-//=======================================================================================================//
-// Gotanblue --------------------------------------------------------------------------
-alberta.gat,247,123,5 script Gotanblue 709,{
- if(TURTLE) goto L_Turtle;
- mes "[Gotanblue]";
- mes "Ha ha! The sea seems endless!! We cannot begin to grasp its size merely by gazing at it from land....";
- next;
- mes "[Gotanblue]";
- mes "Do you know what I mean?.....";
- close;
-
-L_Turtle:
- mes "[Gotanblue]";
- mes "Oh! Your eyes.... they tell me everything!! You must have been sent by that drunken old man!";
-M_Menu:
- next;
- menu "-Tell me about Turtle Island.",-, "-How Can I get there?",M_2, "-End Conversation",M_End;
-
- mes "[Gotanblue]";
- mes "So you wanna know about Turtle Island?... You think it's a great place?... Do you like it that much?...";
- next;
- mes "[Gotanblue]";
- mes "Well let me tell you something....";
- next;
- mes "[Gotanblue]";
- mes "TURTLE ISLAND TOOK THE LIVES OF MY CLOSEST FRIENDS!!";
- emotion e_gasp;
- next;
- mes "[Gotanblue]";
- mes "Can you POSSIBLY understand??.........";
- next;
- mes "[Gotanblue]";
- mes "It all happened a few decades ago....";
- next;
- mes "[Gotanblue]";
- mes "^5555FFJornadan Niliria^000000 and our comrades set off on a journey to find out if the legends about the island were true.";
- next;
- mes "[Gotanblue]";
- mes "It was summer when I was approached to become a member of Jornadan's team.";
- mes "I was only 20 then, and it was a huge honor for me to be a part of such a well respected group of men.";
- next;
- mes "[Gotanblue]";
- mes "Jornadan Niliria was a great treasure hunter, I was the best seaman of the bunch, and the others were all the very best at what they did.";
- next;
- mes "[Gotanblue]";
- mes "We decided to start our great adventure here, in Alberta. This was because of a clue we found that put the location of Turtle Island near Alberta.";
- next;
- mes "[Gotanblue]";
- mes "We were all very exited and full of hope! We left everything behind and set sail to seek Turtle Island!";
- mes "We sailed all day and all night. We eventually ran adrift, and could do nothing but sit and wait as the days passed.....";
- next;
- mes "[Gotanblue]";
- mes "Then one day... without warning... we were surrounded by a tremendously thick blanket of fog!!";
- mes "It was impossible to see anything past the length of your own arm!";
- next;
- mes "[Gotanblue]";
- mes "We could not tell which way was East and which way was West. But it didn't matter... for we were all exhausted at that point.";
- next;
- mes "[Gotanblue]";
- mes "Then what we feared most happened. A huge rock formation pierced through the fog right in front of us!";
- mes "There was no way to avoid it and we crashed violently into it, severely damaging our ship!!";
- emotion e_gasp;
- next;
- mes "[Gotanblue]";
- mes "Amazingly, the ship held together and we were able to continue on.";
- next;
- mes "[Gotanblue]";
- mes "Then like a beam of energy descending down from the heavens, the first ray of sunlight we had seen in weeks pierced through the fog onto our battered ship.";
- next;
- mes "[Gotanblue]";
- mes "And like magic the fog lifted to reveal what we had been searching so long and hard for.... that legendary place.... TURTLE ISLAND!!!!";
- next;
- mes "[Gotanblue]";
- mes "We set up camp immediately and rested our weary bodies. A few days later we began to extensively search the island.";
- mes "What we found was shocking! Apparently someone had found the island before us. He left a very well kept journal of his expedition.";
- next;
- mes "[Gotanblue]";
- mes "According to his journal, the man had come by himself to find the island. Unfortunately, we couldn't find him.";
- next;
- mes "[Gotanblue]";
- mes "Even though someone had beaten us to Turtle Island, we still felt that it was an accomplishment to have made it to the island.";
- mes "We continued to explore the island and find out as much about it as we could.";
- next;
- mes "[Gotanblue]";
- mes "A particular artifact caught our interest. It was mentioned in that man's journal....";
- mes "Oh, now I remember his name... ^5555FF'Won'^000000... apparently a great sword master....";
- next;
- mes "[Gotanblue]";
- mes "Anyway, he wrote about a '^FF5555Jewel Fragment'^000000 of some kind. He described it as 'the most beautiful thing in the world'.";
- next;
- mes "[Gotanblue]";
- mes "We became intent on finding that jewel no matter what. Day after day we searched for it. Months passed.";
- mes "But even with Won's journal records, we were not able to find the jewel fragment. We had no choice but to give up.";
- next;
- mes "[Gotanblue]";
- mes "So we packed up our belongings and headed home. Again we passed through the horrible dense fog.";
- mes "After a month of sailing our journey was near its end... or so we thought.";
- next;
- mes "[Gotanblue]";
- mes "We spotted land and I breathed a sigh of relief... unfortunately that feeling of relief turned into bewilderment as I realized that..... that....";
- next;
- mes "[Gotanblue]";
- mes "IT WAS TURTLE ISLAND!!! We had landed on the other side of the island! We had no idea how it happened but we immediately cast off once again.";
- emotion e_gasp;
- next;
- mes "[Gotanblue]";
- mes "And as if some foul curse and been placed on our group, we again found ourselves on the shores of Turtle Island.";
- mes "Time after time we attempted to flee the island only to find ourselves back on it. A whole year passed and still, we were trapped!";
- next;
- mes "[Gotanblue]";
- mes "It was beyond reason.... We had tried every possible path.... Our spirits were broken, our hopes were crushed....";
- mes "And one by one, my comrades fell, no longer having the strength to find a way home....";
- next;
- mes "[Gotanblue]";
- mes "CURSED ISLAND!!!!!";
- emotion e_omg;
- next;
- mes "[Gotanblue]";
- mes "As you can see only I and Jornadan were able to make it out alive. By pure luck, we made back to Alberta....";
- next;
- mes "[Gotanblue]";
- mes "(~sob~sob~sob)... I apologize. I'm still very emotional about it after all these years... Well, that's all I have to say about Turtle Island.";
- emotion e_sob;
- goto M_Menu;
- M_2:
- mes "[Gotanblue]";
- mes "What's this? After my terrifying story about Turtle Island, you still want to go there? You're not at all scared??";
- emotion e_what;
- next;
- mes "[Gotanblue]";
- mes "So be it... but you will need me as your guide and that will cost 10,000 zeny!";
- next;
- menu "Turtle Island -> 10000 zeny",-, "Cancel",sM_End;
-
- if(Zeny < 10000) goto sL_Zeny;
- mes "[Gotanblue]";
- mes "Alright!! You've made your choice! With my experience we will get to Turtle Island without any problems.";
- mes "I admire your fighting spirit. Carry it with you always!";
- next;
- mes "^5555FF(You and Gotanblue climb on board his little steamboat)^000000";
- next;
- mes "[Gotanblue]";
- mes "We are now heading towards Turtle Island. Let us go without fear!!";
- next;
- mes "^5555FF(~choo~choooo~)^000000";
- next;
- if(Zeny < 10000) goto sL_Zeny;
- set Zeny, Zeny - 10000;
- warp "tur_dun01.gat",154,39;
- close;
- sL_Zeny:
- mes "[Gotanblue]";
- mes "What's this? I said 10,000 zeny. I will not guide you for less. Good day!";
- emotion e_what;
- close;
- sM_End:
- mes "[Gotanblue]";
- mes "A very good choice!! Turtle Island is a DREADFULL and EVIL place!";
- mes "When I take people there, I feel as if I'm leading them to their DEATHS!";
- close;
- M_End:
- mes "[Gotanblue]";
- mes "To this day, Turtle Island is shrouded in mystery. It is extremely hard to find, and almost impossible to escape from.";
- mes "If you do not want to suffer great despair, then leave the truth behind Turtle Island as it is.... unknown....";
- close;
-}
-
-//Go back to Alberta
-tur_dun01.gat,166,29,1 script Gotanblue#2 709,{
- mes "[Gotanblue]";
- mes "Going back to Alberta?";
- next;
- menu "Yep.",-, "Cancel",M_End;
-
- mes "^5555FF(You and Gotanblue climb on board his little steamboat)^000000";
- next;
- warp "alberta.gat",244,123;
- close;
-
-M_End:
- mes "[Gotanblue]";
- mes "A very good choice!!";
- close;
-}
-
-// Turtle Grandpa -------------------------------------------------------------------
-alberta_in.gat,23,104,2 script Turtle Grandpa 120,{
- mes "[Turtle Grandpa]";
- mes "~Buuurrrpp!!!~ Oops...";
- emotion e_swt;
- next;
- mes "[Turtle Grandpa]";
- mes "It's beyond me why people seem to think that Alberta is the center of world trade.";
- mes "I mean, this place doesn't even have a decent bar for crying out loud!!";
- emotion e_an;
- next;
- mes "[Turtle Grandpa]";
- mes "Why is it that I have to resort to drinking in a place like this??";
- emotion e_what;
- next;
- menu "-Tell me about Turtle Island.",-, "-How can I get there?",M_1, "-End conversation.",M_End;
-
- mes "[Turtle Grandpa]";
- mes "There is an enormous stash of treasure hidden on Turtle Island.";
- mes "There is also a special potion that can increase a person's lifespan on that island......";
- next;
- mes "[Turtle Grandpa]";
- mes "There are so many myths and legends about the island, that no one even knows for sure if Turtle Island exist.";
- next;
- mes "[Turtle Grandpa]";
- mes "I for one believe it does.... It HAS TO!!......";
- emotion e_gasp;
- next;
- mes "[Turtle Grandpa]";
- mes "If you are any sort of seaman, if you have a spirit for adventure, and if you have the heart to become a great treasure hunter....";
- mes "Then you may be worthy of the information I have to offer...";
- next;
- menu "-(~eyes twinkle~)",-, "-Heck Ya! Gimme that information.",sM_1;
-
- mes "[Turtle Grandpa]";
- mes "His name was ^5555FFJornadan Niliria^000000. Jornadan and his ten comrades set off on a journey to find the legendary Turtle Island.";
- next;
- mes "[Turtle Grandpa]";
- mes "At first they had no idea where the island was. They were ambitious and worked extremely hard to gather clues on the whereabouts of the island.";
- next;
- mes "[Turtle Grandpa]";
- mes "These men were very strong, especially Jornadan. He was so strong in fact, that his simple kicks were as powerful as a level 10 bash!!!";
- next;
- mes "[Turtle Grandpa]";
- mes "He could catch an arrow in one hand while healing a comrade with the other, all during the middle of a battle!";
- next;
- mes "[Turtle Grandpa]";
- mes "Heh heh. Well, it's just a rumor so take it for what it's worth. As I was saying....";
- next;
- mes "[Turtle Grandpa]";
- mes "After searching tirelessly Jornadan and his crew eventually found the famed Turtle Island.";
- next;
- mes "[Turtle Grandpa]";
- mes "But for reasons unknown, the crew became stranded on the island forever!!";
- mes "Although I do not know why or how it happened, there IS one person that does.";
- next;
- mes "[Turtle Grandpa]";
- mes "Go the docks on the east end of town. Look for a scholar named.... ^FF3333Jornadan^000000... ^FF3333Niliria^000000...";
- mes "Speak to him. He should be able to tell you more..... ";
- next;
- mes "[Turtle Grandpa]";
- mes "Oh! One more thing... look for his '^5555FFjournal^000000'. He usually has it close by. It's definitely an interesting read.";
- if(TURTLE==0) set TURTLE, 1;
- close;
- sM_1:
- mes "[Turtle Grandpa]";
- mes "No way! I have no interest in speaking with someone with greed in his/her heart!";
- emotion e_gasp;
- next;
- mes "[Turtle Grandpa]";
- mes "Get OUT of my sight!!! GO HOME!";
- emotion e_an;
- next;
- mes "[Turtle Grandpa]";
- mes "What's this?? You're still here?..... GO! GO AWAY!!............";
- emotion e_go;
- close;
- M_1:
- mes "[Turtle Grandpa]";
- mes "It's is extremely hard to find, and even more difficult to reach. The likelihood of returning home is slim at best....";
- next;
- mes "[Turtle Grandpa]";
- mes "Actually..... IT'S IMPOSSIBLE!!!!";
- emotion e_gasp;
- next;
- mes "[Turtle Grandpa]";
- mes "Yet you still want to go there??";
- emotion e_what;
- next;
- mes "[Turtle Grandpa]";
- mes "I want to warn you about the dangers of going there.... but.... I feel so dizzy..... wooah..... it must be the Vodka....";
- next;
- mes "[Turtle Grandpa]";
- mes "Any who, if you go the docks you'll find a fat, old, sailor. His name is ^5555FFGotanblue^000000.";
- mes "Tell him I sent you and maybe he'll tell you how to get to Turtle Island. Well, good luck.";
- close;
- M_End:
- mes "[Turtle Grandpa]";
- mes "Whooops......";
- next;
- mes "!!KA-PLOP!!(collapses on the floor)";
- next;
- mes "[Turtle Grandpa]";
- mes "He he he.... look at me.... I'm a fish... I'm drunk like a fish..... enough for today..... ~ZZZZZzzzz~";
- close;
-}
-
-// Letter of an explorer (on Turtle Grandpa's desk)------------------------------------------------------------------
-alberta_in.gat,17,101,1 script Letter of an explorer 111,{
- mes "~ The letter reads... ~";
- mes "- O/X/XOVX -";
- mes "If you find this letter, it means that our expedition to Turtle Island has failed. Please inform the others...";
- next;
- mes "~ continued...~";
- mes "As of now, only half the number of our crew members are left. Our food supply will only last for ten more days. It is a grave situation we are facing....";
- next;
- mes "~ continued...~";
- mes "- V/O/XOVX -";
- mes "It seems my letters did not make it to the outside world, and have instead come back to me.... This damn island is CURSED!! Oh God.....";
- next;
- mes "~ continued...~";
- mes "GOD FORSAKEN ISLAND!! There is nothing left to eat..... help... me... please.... HELP ME!!";
- next;
- mes "~ continued...~";
- mes "- V/X/XOVX -";
- mes "^5555FF- This section is severely crumpled and tattered. -^000000";
- mes "^5555FF- You are unable to read it. -^000000";
- close;
-}
-
-// Jornadan Niliria ------------------------------------------------------------------------
-alberta.gat,248,90,1 script Jornadan Niliria 121,{
- mes "[Jornadan Niliria]";
- mes "Sometimes I think that the world around me is ever changing.";
- mes "When I view the land it seems different, when I look up at the sky it too seems different....";
- next;
- mes "[Jornadan Niliria]";
- mes "The way that Alberta and Turtle Island are different. Hah hah hah....";
- next;
- menu "-About Turtle Island.",-, "-Um, did you get confused with Al De Baran?",M_1, "-End Conversation.",M_End;
-
- mes "[Jornadan Niliria]";
- mes "Ah yes..... Turtle Island.... Do you know why it's named, 'Turtle' Island? Would you like to know? Haha......";
- next;
- mes "[Jornadan Niliria]";
- mes "The reason behind the name is actually very easy to figure out and you might even feel a little foolish about not getting it in the first place.";
- next;
- mes "[Jornadan Niliria]";
- mes "It's called 'Turtle' Island, because of the fact that it is shaped like an actual turtle. Haha. That's all there is to it.";
- next;
- mes "[Jornadan Niliria]";
- mes "There is an unusually dense area of fog that surrounds the island.";
- mes "At first we tried to figure what causes it but with no luck. We figured that it was just a natural phenomenon.";
- next;
- mes "[Jornadan Niliria]";
- mes "Then we found a cave along the coastline of the island. Inside we were amazed to see a HUGE waterfall.";
- mes "It turns out that this waterfall is what creates that extremely thick area of fog around that island.";
- next;
- mes "[Jornadan Niliria]";
- mes "The reason is so simple and yet there are people who still try to find a deeper meaning behind it....";
- next;
- mes "[Jornadan Niliria]";
- mes "I believe that people continue to probe into the matter because they do not want to feel that their efforts have been in vain.";
- mes "Maybe they are afraid of the truth..... I for one was once afraid.... afraid of Turtle Island....";
- next;
- mes "[Jornadan Niliria]";
- mes "But now that I truly understand all of the myths about Turtle Island, I feel at ease and at peace with the island.";
- mes "There is still one lingering question about the island for me though..... it is the existence of the unknown ^FF5555'Jewel Fragment'^000000.";
- next;
- mes "[Jornadan Niliria]";
- mes "I am still not certain about what it really is. In the mean time I will continue to pursue the matter until I discover the truth! Hahaha!!";
- close;
- M_1:
- mes "[Jornadan Niliria]";
- mes "Whoops ! Oh that's right !! Confused !.... Yipe !..... WOOOOO !!!"; //have NO idea what this means.....
- close;
- M_End:
- mes "[Jornadan Niliria]";
- mes "When you're searching for the truth, make sure to keep trying. Someday you will find the answers you seek...";
- next;
- mes "[Jornadan Niliria]";
- mes "Hmmm.... by the way.... I feel hungry. Why doesn't Alberta have a store or restaurant for some good Dim Sum??";
- close;
-}
-
-// Jornadan's Voyage Log -------------------------------------------------
-alberta.gat,247,93,1 script A Voyage Log 111,{
- if(TURTLE == 1) goto L_Treasure;
- mes "[A Voyage Log]";
- mes "= 03:20 am =";
- mes "The moon was dark and I couldn't even see 100m in front of me. I had a bad feeling about the situation..... I was not the only one...";
- next;
- mes "[A Voyage Log]";
- mes "I could tell by the looks on my comrade's faces, that they too were worried. No one could sleep that night. I hope we will see the sunrise soon....";
- next;
- mes "[A Voyage Log]";
- mes "= 04:10 =";
- mes "5 minutes ago one of our comrades, Cooker, died. While he walking on deck, the flagpole suddenly broke and fell on his head....";
- next;
- mes "[A Voyage Log]";
- mes "He died at approximately 04:07. The flagpole had been damaged when our ship hit a reef.";
- mes "The ship sustained serious damage along the left side of the deck. I called on the chief to repair it.";
- next;
- mes "[A Voyage Log]";
- mes "= 04:45 =";
- mes "While two of our workers were fixing the bottom of the deck, monsters attacked them without warning.";
- mes "Apparently they had gotten in through some openings in the deck.";
- next;
- mes "[A Voyage Log]";
- mes "Two more men had been lost. Fortunately the ship has yet to sink and seems to be holding up. Still, we must find land soon.";
- next;
- mes "[A Voyage Log]";
- mes "During the collision with the reef we lost about 30% of our supplies. In particular we lost food... a great deal of food....";
- next;
- mes "[A Voyage Log]";
- mes "= 05:23 =";
- mes "We've been noticing an increase in the amount of reefs and they are getting larger as well.";
- mes "I wonder when we will find land.... I wonder if we can....";
- next;
- mes "[A Voyage Log]";
- mes "- Written by -";
- mes "- captain Jornadan Niliria -";
- next;
- mes "^5555FF- Closed the voyage log -^000000";
- close;
-
-L_Treasure:
- mes "^5555FF- The paper is torn -";
- mes "- Seaweed and mold have -";
- mes "- mixed with the paper -";
- mes "- It looks to be in very poor";
- mes "condition. -^000000";
- next;
- mes "^5555FF- Between some pages -";
- mes "- Is a Banana leaf -";
- mes "- this is written. -^000000";
- next;
- mes "[A Voyage Log]";
- mes "= O/X date =";
- mes "Just after we arrived to Turtle Island, we searched for some food to eat. I am so skinny now...";
- next;
- mes "[A Voyage Log]";
- mes "When I looked at myself in the mirror, it was horrible. I was disturbed by what I saw...";
- next;
- mes "[A Voyage Log]";
- mes "= X/X date =";
- mes "We found some kind of fruit! It has a yellow color and a long shape. It looks just like a banana!";
- next;
- mes "[A Voyage Log]";
- mes "= XO/X date =";
- mes "Although very similar, the fruit we found was not a banana. We believe it is a relative of the banana.";
- mes "It smells and tastes exactly like a banana.";
- next;
- mes "[A Voyage Log]";
- mes "We were starving so we just referred to the fruit as bananas and gathered it for food.";
- mes "Although there were a limited amount of trees, there was enough for our survival.";
- next;
- mes "[A Voyage Log]";
- mes "It has become the answer to our lack of food and has become precious to us.";
- mes "~ WE LOVE YOU BANANA!! ~";
- next;
- mes "[A Voyage Log]";
- mes "= O/O date =";
- mes "In the middle of the night, one of our comrades reported that he felt sick from something he ate.";
- next;
- mes "[A Voyage Log]";
- mes "= OO/O date =";
- mes "Another comrade fell ill. He had the strongest digestive system among us.";
- mes "He went by the name, 'Berot Berot', and he played a vital role in our group.";
- next;
- mes "[A Voyage Log]";
- mes "The fact that he got sick from something he ate, made it very clear that there was something poisoning us.";
- next;
- mes "[A Voyage Log]";
- mes "= XO/O date =";
- mes "A third person became sick today while we were out exploring. The first person to become ill has passed away.... We are all very worried.";
- next;
- mes "[A Voyage Log]";
- mes "We tried very hard to find the cause of the illness. Then by observing the animals one day, we found it.";
- mes "It was the very thing we thought to be our salvation and yet not one animal on the island would even touch it.....";
- next;
- mes "[A Voyage Log]";
- mes "What was killing us was..... our beloved BANANA!!";
- next;
- mes "[A Voyage Log]";
- mes "We decided to get rid of all of the bananas. But for some reason they didn't seem to be decomposing.";
- mes "Even when the skin was peeled off, the fruits remained the same.";
- next;
- mes "[A Voyage Log]";
- mes "I think that the poison or some other agent within the fruit is allowing it to survive.";
- mes "We may be able to use it for medicinal purposes later, but for now it is of no use to us.";
- mes "Until we get back to Alberta, we have to decided to bury what is left of the fruit.";
- next;
- mes "[A Voyage Log]";
- mes "This is the location where it's buried in case we forget:";
- mes "^FF8888- tur_dun01 -";
- mes "- X: 160, Y: 81 -^000000";
- next;
- mes "^5555FF- There is a thin Key -";
- mes "- with a skull mark on it -";
- mes "- You've gained -";
- mes "- a 'Skull Key' -^000000";
- set TURTLE, 2;
- close;
-}
-
-// Burried treasure --------------------------------------------------------------------
-tur_dun01.gat,160,80,1 script Skull Stone 111,{
- if(TURTLE == 2) goto L_OpenBox;
- mes "^5555FF(It's a frightening stone tomb with horrible skull on it.)^000000";
- close;
-
-L_OpenBox:
- mes "^5555FF(Under the stone is a tiny key hole with a skull mark. You used the 'Skull Key' to open the box.)^000000";
- next;
- mes "^5555FF(~click!~click!~)^000000";
- next;
- mes "^5555FF(Suddenly the top of the stone opens with many things coming out!)^000000";
- set TURTLE, 3;
- next;
- mes "^5555FF(You got 5 Tropical Bananas and 5 Banana Juices.)^000000";
- getitem 634, 5;
- getitem 532, 5;
- close;
+//===== eAthena Script =======================================
+//= Quest NPCs related to Alberta
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Dolls Quest
+//= Boy's Cap Quest
+//= Antlers Quest
+//= Bao Bao, Cresent Hairpin, Fashionbale Glasses, Heart Hairpin Quests
+//= Hat of Sun God, Sunday Hat, Mage Hat, Magician Hat Quests
+//= Turtle Island Quests
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed Spore Doll exploit, Gramp's Tiger skin label bug
+//= 1.3 Fixed item ID 7031 -> 7013
+//= 1.4 Fixed a bug, Fixed Exploits, Optimized [Lupus]
+//= 1.6 TEMPESTRA quest uses common quests variable MISC_QUEST
+//= Condition if done: (MISC_QUEST & 2) [Lupus]
+//= 1.7 Moved quest from cities/albera.txt [Evera]
+//============================================================
+
+
+
+//=======================================================================================================//
+// Doll Quest
+//=======================================================================================================//
+alberta.gat,117,134,8 script Elin 96,{
+ mes "[Elin]";
+ if(Sex){
+ mes "Hello, mister. Hmm, since you're a boy, you don't like dolls, do you?";
+ }else{
+ mes "Hello, miss. Since you're a girl, you must like dolls, don't you?";
+ }
+ next;
+ mes "[Elin]";
+ mes "I LOVE dolls!!";
+ emotion e_lv2;
+ next;
+ mes "[Elin]";
+ mes "Ya know..... I REALLY, REALLY, want a new doll. I hope daddy is going to buy me one for my birthday.....";
+ next;
+ menu "Aww, you must be happy...",-,"How about I give you one now?",M_2;
+
+ mes "[Elin]";
+ mes "Yeah, this time I'm hoping for a Yoyo doll. Hehe, they're so cute! They're my FAVORITE!";
+ emotion e_ok;
+ close;
+ M_2:
+ mes "[Elin]";
+ mes "Oh my goodness! Really?? You're such a sweetie.... gimme, gimme!!";
+ mes "What kinda doll are you going to give me? Are you really gonna give me one?";
+ emotion e_gasp;
+ next;
+ menu "Puppet",-,"Poring doll",sM_2,"Chonchon doll",sM_3,"Rocker doll",sM_4, "Spore doll",sM_5,
+ "Osiris doll",sM_6,"Baphomet doll",sM_7,"Racoon doll",sM_8,"Yoyo doll",sM_9, "I am as adorable as a doll!",sM_10;
+
+ if(countitem(740) < 1) goto L_Liar;
+ delitem 740,1;
+ mes "[Elin]";
+ mes "Wow--! It's a rabbit! It's SOOOO cute!! Thank you SOOO much!";
+ emotion e_lv2;
+ next;
+ mes "[Elin]";
+ mes "It's SOOO fluffy... Oh yeah! Let me give you a present too!";
+ next;
+ mes "(diggs around in her pockets)";
+ next;
+ mes "[Elin]";
+ mes "Ummm ... found it! Here take this!";
+ next;
+ getitem 530,1;
+ mes "[Elin]";
+ mes "I got this from Santa. It's a candy cane~";
+ next;
+ mes "[Elin]";
+ mes "Thanks again for the rabbit doll! I'm gonna HUG this to sleep EVERY night~";
+ emotion e_thx;
+ close;
+
+ sM_2:
+ if(countitem(741) < 1) goto L_Liar;
+ delitem 741,1;
+ mes "[Elin]";
+ mes "Yay! It's a poring doll! It's SOOOO cute! Since you gave me a doll I'll give you this....";
+ emotion e_lv2;
+ next;
+ getitem 529,1;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ emotion e_thx;
+ close;
+
+ sM_3:
+ if(countitem(742) < 1) goto L_Liar;
+ delitem 742,1;
+ mes "[Elin]";
+ mes "Ew whats this?.... a Chonchon ... doll? ...";
+ emotion e_wah;
+ next;
+ mes "[Elin]";
+ mes "Oh well, since you're giving it to me, I guess it's ok ....";
+ next;
+ mes "[Elin]";
+ mes "Well here's a little something for giving me the doll. Don't eat too much or you'll get cavities.";
+ getitem 530,1;
+ next;
+ mes "[Elin]";
+ mes ".... chonchon.... (~grumble, grumble~)";
+ emotion e_ag;
+ close;
+
+ sM_4:
+ if(countitem(752) < 1) goto L_Liar;
+ delitem 752,1;
+ mes "[Elin]";
+ mes "Oh! a Rocker doll. I hate hopping things but this doll's kinda cute.";
+ next;
+ mes "[Elin]";
+ mes "Thank you. Let me give you something too.";
+ next;
+ mes "[Elin]";
+ mes "Hmm, didn't I get some stuff from my uncle ...";
+ next;
+ mes "[Elin]";
+ mes "Here it is. We've got tons of it at home so I'll share some with you~";
+ getitem 532,7;
+ next;
+ mes "[Elin]";
+ mes "Thanks again for the doll!";
+ emotion e_thx;
+ close;
+
+ sM_5:
+ if(countitem(743) < 1) goto L_Liar;
+ delitem 743,1;
+ mes "[Elin]";
+ mes "Blehh .... It's a mushroom... Mom's always scolding me for not eating mushrooms ...";
+ emotion e_swt;
+ next;
+ mes "[Elin]";
+ mes "I'll take it anyway, since the doll looks cute. But I still won't eat mushrooms though ...";
+ next;
+ mes "[Elin]";
+ mes "Hmm, I'll need to give you a present too.";
+ next;
+ mes "[Elin]";
+ mes "My mom made this so please take it.";
+ getitem 538,5;
+ next;
+ mes "[Litte Kid]";
+ mes "Thank you for the doll~";
+ emotion e_thx;
+ close;
+
+ sM_6:
+ if(countitem(751) < 1) goto L_Liar;
+ delitem 751,1;
+ mes "[Elin]";
+ mes "Yay! It's an Osiris doll!";
+ next;
+ mes "[Elin]";
+ mes "Here's something for you too.";
+ getitem 522,2;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ close;
+
+ sM_7:
+ if(countitem(750) < 1) goto L_Liar;
+ delitem 750,1;
+ mes "[Elin]";
+ mes "Yay! It's a Baphomet doll!";
+ next;
+ mes "[Elin]";
+ mes "Here's something for you too.";
+ getitem 525,5;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ emotion e_thx;
+ close;
+
+ sM_8:
+ if(countitem(754) < 1) goto L_Liar;
+ delitem 754,1;
+ mes "[Elin]";
+ mes "Ah, it's a Smokie doll. I hate Smokies, but the doll's really cute! Thank you!";
+ emotion e_ok;
+ next;
+ mes "[Elin]";
+ mes "Let me give you some of Grandma's home-made cake!";
+ getitem 539,3;
+ next;
+ mes "[Elin]";
+ mes "They're really good so make sure you eat them ok.";
+ next;
+ mes "[Elin]";
+ mes "Thanks again for this cute doll!";
+ emotion e_thx;
+ close;
+
+ sM_9:
+ if(countitem(753) < 1) goto L_Liar;
+ delitem 753,1;
+ mes "[Elin]";
+ mes "WOW--!!! OH MY GOSH! It's a Yoyo doll! This is what I REALLY wanted!! It's SOOOO cute......";
+ emotion e_lv2;
+ next;
+ mes "[Elin]";
+ mes "As a thank you, I'll give you this.";
+ getitem 608,1;
+ next;
+ mes "[Elin]";
+ mes "Dad picked them up during his travels. It's a seed of some kind.";
+ mes "We tried planting them at home, but it doesn't seem to grow.";
+ next;
+ mes "[Elin]";
+ mes "Anyway, thank you SOOO MUCH for the Yoyo doll!!!!";
+ emotion e_thx;
+ close;
+
+ sM_10:
+ mes "[Elin]";
+ mes "BLAAAAAAAAHHH!! Don't make fun of me cuz I'm young!";
+ emotion e_pif;
+ next;
+ mes "[Elin]";
+ mes "(mumbles) .....'stupid'.....";
+ close;
+
+ L_Liar:
+ mes "[Elin]";
+ mes "HEY!! You don't have any dolls... I can't believe you would lie to a little kid!!!";
+ emotion e_gasp;
+ next;
+ mes "[Elin]";
+ mes "You're a MEANIE!! I HATE YOU!!!..... sniff... sniff.... Waaaaaaaaaaaaaaaaaaaahhhhhh!!";
+ emotion e_sob;
+ close;
+}
+
+
+//=======================================================================================================//
+// Boy's Cap' Quest
+//=======================================================================================================//
+alberta_in.gat,28,145,4 script Grampa 120,{
+ mes "[Grampa]";
+ mes "Gasp ..Gasp";
+ next;
+ mes "[Grampa]";
+ mes "When I look back on my younger days... I regret not making better use of my time...";
+ next;
+ mes "[Grampa]";
+ mes "Even so I STILL feel young at heart..... unfortunately my body is very old and is in poor condtion...... Cough !! Cough .. !!";
+ next;
+ if(countitem(1030) >= 10) menu "Talk.",M_Talk, "Show him Tiger's Footskin.",M_Show, "Cancel.",M_End;
+ menu "Talk",M_Talk, "Cancel",M_End;
+
+ M_Talk:
+ mes "[Grampa]";
+ mes "Listen to me..... You must take care of your body as best you can....";
+ mes "If you aren't serious about staying healthy now..... you will surely regret it as you get older.";
+ next;
+ mes "[Grampa]";
+ mes "I've tried to restore my body to its youthful, healthy state with all of the best herbs and medicines that money can buy....";
+ next;
+ mes "[Grampa]";
+ mes "Not only have none of them worked, but their emense cost have made me bankurpt!";
+ next;
+ mes "[Grampa]";
+ mes "I have all but given up on trying to restore my youth.... there IS still one last thing I have not yet tried.....";
+ next;
+ mes "[Grampa]";
+ mes "It is the ^3355FFTiger's Footskin^000000, the legendary king of rejuvination!!";
+ emotion e_gasp;
+ next;
+ mes "[Grampa]";
+ mes "Have you heard of the Tiger's Footskin???.....";
+ emotion e_what;
+ next;
+ mes "[Grampa]";
+ mes "Just by LOOKING at it, your white hair turns Black again! By SMELLING it, your reflexes become 10x faster!";
+ mes "And just a single TASTE can turn and 80 year old man.... INTO AN 18 BOY!!!!";
+ next;
+ mes "[Grampa]";
+ mes "It truely is amazing! Ah, if I could only get my hands on some Tiger's Footskin.... my wishes would at last come true.....";
+ next;
+ mes "[Grampa]";
+ mes "For whoever brings me ^5555FF10 Tiger's Footskins^000000, I would gladly give that person my precious ^3355FFBoys Cap^000000.";
+ close;
+
+ M_Show:
+ mes "[Grampa]";
+ mes "Ohhh !! Th-This is the... this is the legendary.... TIGERS FOOTSKIN!!";
+ next;
+ mes "[Grampa]";
+ mes "Just by LOOKING at it, your white hair turns Black again! By SMELLING it, your reflexes become 10x faster!";
+ mes "And just a single TASTE can turn and 80 year old man.... INTO AN 18 BOY!!!!";
+ next;
+ mes "[Grampa]";
+ mes "It is the real Tiger's Footskin !! In my wildest dreams I never thought...... P-P-Please.... I beg you.... let me have it.....";
+ next;
+ menu "-Give him the Tiger's Footskin.",-, "Walk away.", sM_End;
+
+ mes "[Grampa]";
+ if(countitem(1030) < 10) goto L_NoItems;
+ delitem 1030,10;
+ getitem 5016,1;
+ mes "T-Thank YOU!! Thank you SO VERY MUCH!!";
+ emotion e_thx;
+ next;
+ mes "[Grampa]";
+ mes "Now my body can be reinvigorated!!! I will eat it right away!";
+ close;
+
+ L_NoItems:
+ mes "Get off damn cheater!!!";
+ emotion e_bzz;
+ close;
+
+ sM_End:
+ mes "[Grampa]";
+ mes "H-He-Hey!! Young one!! W-Wa-it! Please.... come back... I beg you.... come... back.... ooohh... foot.... sk... i... n....";
+ close;
+
+ M_End:
+ mes "[Grampa]";
+ mes "Cough Cough !! .. Tiger ....Tiger's ..... Foot ..... skin .....Cough Cough !!";
+ close;
+
+
+}
+
+
+//=======================================================================================================//
+// Antlers Quest
+//=======================================================================================================//
+alberta_in.gat,122,53,4 script Cherokee 47,{
+ mes "[Cherokee]";
+ mes "Hey there, I am a Horn Collector. Sounds great, huh?";
+ next;
+ mes "[Cherokee]";
+ mes "What do you think about Animal horns? I think they are very valuable and are well worth collecting.";
+ mes "You can wear them on your head, or even decorate your house with them.";
+ next;
+ mes "[Cherokee]";
+ mes "You know.... there has been a particular horn that I have not been able to find. It is the ^5555FF'Evil Horn '^000000..";
+ next;
+ mes "[Cherokee]";
+ mes "Some say that an Evil Horn is really not an animal's horn, but one that comes from a Devil!";
+ mes "Even so, I really wish I could get my hands on one.";
+ next;
+ mes "[Cherokee]";
+ mes "Say.... do you have any ^5555FF'Evil Horns'^000000?";
+ mes "If you offer me ^5533FF20 Evil Horns^000000, I will give you my precious and famed, ^FF3355'Antlers'^000000. Is it a deal?";
+ next;
+ menu "You got it!",-, "Shut up Dumbo.",M_End;
+
+ mes "[Cherokee]";
+ if(countitem(923) < 20) goto L_NotEnuf;
+ delitem 923,20;
+ mes "Whoah~! This is the first time I've ever seen a real ^3355FF'Evil Horn'^000000!!";
+ emotion e_ic;
+ next;
+ mes "[Cherokee]";
+ mes "Thank you! Here are the Antlers just as I promised you!";
+ emotion e_thx;
+ getitem 2284,1;
+ next;
+ mes "[Cherokee]";
+ mes "With your great help I was finally able to realize my long time dream. I appreciate what you have done! God Bless You ..";
+ close;
+
+ L_NotEnuf:
+ mes "Hmm.... like I said, I need ^FF5533'20 Evil Horns'^000000.";
+ close;
+
+ M_End:
+ mes "[Cherokee]";
+ mes "Well aren't you a rude person.... I will forgive you however, seeing as we will meet again, I'm sure....";
+ close;
+}
+
+
+//=======================================================================================================//
+// Bao Bao, Cresent Hairpin, Fashionbale Glasses, Heart Hairpin
+//=======================================================================================================//
+alberta.gat,120,53,3 script Zic 51,{
+ mes "[Zic]";
+ mes "Yay! A cool breeze! That's why I love the sea!!";
+ emotion e_ho;
+ next;
+ mes "[Zic]";
+ mes "Huh?... Do you have any business with me? You came to me because I'm a merchant right?";
+ emotion e_hmm;
+ next;
+ mes "[Zic]";
+ mes "~Sigh!~ I get tired of my reputation.... I can't get any peace or quite around here.....";
+ next;
+ mes "[Zic]";
+ mes "So what do you wanna get? Tell me, tell me! It's so easy to guess what you want.....";
+ next;
+ menu "-Bao Bao",-, "-Cresent Hairpin",M_1, "-Fashionable Glasses",M_2, "-Heart Hairpin",M_3;
+
+ mes "[Zic]";
+ mes "To make a Bao Bao I will need:"; //5042
+ mes "- ^5555FF1 Silk Ribbon^000000,"; //10007
+ mes "- ^5555FF50 Herioc Emblems^000000."; //968
+ next;
+ mes "[Zic]";
+ mes "Would you like me to make you one?";
+ next;
+ menu "Sure.",-, "No thanks.",M_End;
+
+ if (countitem(10007)<1 || countitem(968)<50) goto sL_NotEnuf;
+ delitem 10007, 1;
+ delitem 968, 50;
+ mes "[Zic]";
+ mes "Please wait while I make your Bao Bao......";
+ next;
+ mes "[Zic]";
+ mes "There you are, one Bao Bao. Enjoy.";
+ getitem 5042, 1;
+ close;
+ M_1:
+ mes "[Zic]";
+ mes "To make a Cresent Hairpin I will need:"; //5048
+ mes "- ^5555FF1 Heart Hair Pin^000000,"; //5041
+ mes "- ^5555FF10 Steel^000000."; //999
+ next;
+ mes "[Zic]";
+ mes "Would you like me to make you one?";
+ next;
+ menu "Sure.",-, "No thanks.",M_End;
+
+ if (countitem(5041)<1 || countitem(999)<10) goto sL_NotEnuf;
+ delitem 5041, 1;
+ delitem 999, 10;
+ mes "[Zic]";
+ mes "Please wait while I make your Cresent Hairpin......";
+ next;
+ mes "[Zic]";
+ mes "There you are, one Cresent Hairpin. Enjoy.";
+ getitem 5048, 1;
+ close;
+ M_2:
+ mes "[Zic]";
+ mes "To make a pair of Fashionable Glasses I will need:"; //5047
+ mes "- ^5555FF1 Jack a Dandy^000000,"; //2271
+ mes "- ^5555FF1 Scarlet Dyestuffs^000000."; //975
+ next;
+ mes "[Zic]";
+ mes "Would you like me to make you one?";
+ next;
+ menu "Sure.",-, "No thanks.",M_End;
+
+ if (countitem(2271)<1 || countitem(975)<1) goto sL_NotEnuf;
+ delitem 2271, 1;
+ delitem 975, 1;
+ mes "[Zic]";
+ mes "Please wait while I make your Fashionable Glasses......";
+ next;
+ mes "[Zic]";
+ mes "There you are, one Fashionable Glasses. Enjoy.";
+ getitem 5047, 1;
+ close;
+ M_3:
+ mes "[Zic]";
+ mes "Are you sure you want a simple item like this? Oh well... To make a Heart Hairpin I will need:"; //5041
+ mes "- ^5555FF1200 Coral Reefs^000000."; //7013
+ emotion e_hmm;
+ next;
+ mes "[Zic]";
+ mes "Would you like me to make you one?";
+ next;
+ menu "Sure.",-, "No thanks.",M_End;
+
+ if (countitem(7013)<1200) goto sL_NotEnuf;
+ delitem 7013, 1200;
+ mes "[Zic]";
+ mes "Please wait while I make your Hear Hairpin......";
+ next;
+ mes "[Zic]";
+ mes "There you are, one Heart Hairpin. Enjoy.";
+ getitem 5041, 1;
+ close;
+
+ sL_NotEnuf:
+ mes "[Zic]";
+ mes "Hmm.... you don't have enough items for me to make it. Come back some other time.";
+ close;
+
+ M_End:
+ mes "[Zic]";
+ mes "See ya around.";
+ close;
+}
+
+
+//=======================================================================================================//
+// Hat of Sun God, Sunday Hat, Mage Hat, Magician Hat
+//=======================================================================================================//
+alberta.gat,135,79,3 script Tempestra 71,{
+ mes "[Tempestra]";
+ mes "Ah...... Such a cool breeze. It's good to be next to the sea. I think it was the right choice for me to take a break from my business and come here.";
+ emotion e_ho;
+ if(MISC_QUEST & 2) goto sM_Menu;
+ next;
+ mes "[Tempestra]";
+ mes "Oh the sun is so bright today. I'm glad I brought my hat. If my skin is exposed to the sun like this everyday, I'm sure to get a sunburn.";
+ next;
+ mes "[Tempestra]";
+ mes "Boy, the heat is making me thirsty. Nothing would be better right now, than sipping on a perfectly chilled yellow potion.....";
+ next;
+ menu "Here you go, my treat.",-, "Then go get one, sheesh....",M_1;
+
+ if(countitem(503) < 1) goto L_NoPot;
+ delitem 503, 1;
+ set MISC_QUEST,MISC_QUEST | 2;
+ mes "[Tempestra]";
+ mes "Oooh! Thank you so much. I'm so glad to meet such a friendly person here....";
+ emotion e_thx;
+ next;
+ mes "[Tempestra]";
+ mes "(~gulp~gulp~)";
+ next;
+ mes "[Tempestra]";
+ mes "Hyaaaaaaa!! It's sooo cold!! Thank you.";
+ sM_Menu:
+ next;
+ menu "The weather is really hot, isn't it...",-, "You should wear a hat.",sM_1;
+
+ mes "[Tempestra]";
+ mes "Yes, it's very hot indeed.....";
+ next;
+ mes "[Tempestra]";
+ mes "Luckly I brought a lot of hats along. I have";
+ mes "a ^5555FF'Sunday Hat'^000000,";
+ mes "a ^5555FF'Mage Hat'^000000,";
+ mes "a ^5555FF'Magician Hat'^000000, and more in my room...";
+ next;
+ mes "[Tempestra]";
+ mes "I brought these hats with me so that I could sell them and use the money I made for my vacation expenses....";
+ mes "but now it looks like I'll have to wear one.....";
+ ssM_Menu:
+ next;
+ menu "Sunday Hat?",-, "Mage Hat?",ssM_0b, "Magician Hat?",ssM_0c, "End Conversation.",ssM_End;
+
+ mes "[Tempestra]";
+ mes "A Sunday Hat is made up of:";
+ mes "- ^5555FF250 Fabric^000000,";
+ mes "- ^5555FF1 Slotted Hat^000000,";
+ mes "- ^5555FF1 Slotted Cap^000000,";
+ mes "- ^5555FF600 Soft Feathers^000000.";
+ mes "If you want, I can make one for you. Just bring me all of those items.";
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ if (countitem(1059)<250 || countitem(2221)<1 || countitem(2227)<1 || countitem(7063)<600) goto ssM_Menu;
+ delitem 1059, 250;
+ delitem 2221, 1;
+ delitem 2227, 1;
+ delitem 7063, 600;
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5032, 1;
+ mes "[Tempestra]";
+ mes "All done... one Sunday Hat just for you. Thank you and come back any time.";
+ emotion e_thx;
+ close;
+ ssM_0b:
+ mes "[Tempestra]";
+ mes "A Mage Hat is made up of:";
+ mes "- ^5555FF1 Wizard Hat^000000,";
+ mes "- ^5555FF400 Dragon Scales^000000,";
+ mes "- ^5555FF50 Mould Powder^000000,";
+ mes "- ^5555FF1 Elder Wilow Card^000000.";
+ mes "If you want, I can make one for you. Just bring me all of those items.";
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ if (countitem(2252)<1 || countitem(1036)<400 || countitem(7001)<50 || countitem(4052)<1) goto ssM_Menu;
+ delitem 2252, 1;
+ delitem 1036, 400;
+ delitem 7001, 50;
+ delitem 4052, 1;
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5027, 1;
+ mes "[Tempestra]";
+ mes "All done... one Mage Hat just for you. Thank you and come back any time.";
+ emotion e_thx;
+ close;
+ ssM_0c:
+ mes "[Tempestra]";
+ mes "A Magician Hat is made up of:";
+ mes "- ^5555FF1 Wizard Hat^000000,";
+ mes "- ^5555FF450 Ancient Lips^000000,";
+ mes "- ^5555FF1200 Solid Shells^000000,";
+ mes "If you want, I can make one for you. Just bring me all of those items.";
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ if (countitem(2252)<1 || countitem(1054)<450 || countitem(943)<1200) goto ssM_Menu;
+ delitem 2252, 1;
+ delitem 1054, 450;
+ delitem 943, 1200;
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5045, 1;
+ mes "[Tempestra]";
+ mes "All done... one Magician just for you. Thank you and come back any time.";
+ emotion e_thx;
+ close;
+ ssM_End:
+ close;
+
+ sM_1:
+ mes "[Tempestra]";
+ mes "Oh but the hats I have are for sale.... if I use them for myself I won't be able to sell them to my customers.";
+ next;
+ mes "[Tempestra]";
+ mes "Because you gave me the potion, I would like to make something for you. Unfortuately I don't have any materials right now.";
+ next;
+ mes "[Tempestra]";
+ mes "Hmm... If you have:";
+ mes "^5555FF1 Emblem of the Sun God";
+ mes "10 Gold";
+ mes "40 Steel";
+ mes "50 Coal";
+ mes "and 2 Oridecon^000000..........";
+ next;
+ mes "[Tempestra]";
+ mes "I can make you a ^5555FF'Hat of the Sun God'^000000!! It's a fantastic piece of work! How's that sound?";
+ next;
+ menu "Alright.",-, "Not right now thanks.",ssM_1b;
+
+ if(countitem(7086)<1 || countitem(969)<10 || countitem(999)<40 || countitem(1003)<50 || countitem(984)<2) goto ssL_NotEnuf;
+ delitem 7086, 1;
+ delitem 969, 10;
+ delitem 999, 40;
+ delitem 1003, 50;
+ delitem 984, 2;
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5022, 1;
+ mes "[Tempestra]";
+ mes "All done... one Hat of the Sun God just for you. Thank you again for the potion, and please come back any time.";
+ emotion e_thx;
+ close;
+
+ ssL_NotEnuf:
+ mes "[Tempestra]";
+ mes "Um.... where are those items exactly???";
+ emotion e_hmm;
+ close;
+ ssM_1b:
+ mes "[Tempestra]";
+ mes "Come back anytime when you've changed your mind.";
+ close;
+
+ L_NoPot:
+ mes "[Tempestra]";
+ mes "Umm... excuse me but.... where is the potion??";
+ emotion e_hmm;
+ close;
+
+ M_1:
+ mes "[Tempestra]";
+ mes "..... How RUDE!!";
+ emotion e_gasp;
+ close;
+}
+
+//=======================================================================================================//
+// Turtle Quest
+//=======================================================================================================//
+// Gotanblue --------------------------------------------------------------------------
+alberta.gat,247,123,5 script Gotanblue 709,{
+ if(TURTLE) goto L_Turtle;
+ mes "[Gotanblue]";
+ mes "Ha ha! The sea seems endless!! We cannot begin to grasp its size merely by gazing at it from land....";
+ next;
+ mes "[Gotanblue]";
+ mes "Do you know what I mean?.....";
+ close;
+
+L_Turtle:
+ mes "[Gotanblue]";
+ mes "Oh! Your eyes.... they tell me everything!! You must have been sent by that drunken old man!";
+M_Menu:
+ next;
+ menu "-Tell me about Turtle Island.",-, "-How Can I get there?",M_2, "-End Conversation",M_End;
+
+ mes "[Gotanblue]";
+ mes "So you wanna know about Turtle Island?... You think it's a great place?... Do you like it that much?...";
+ next;
+ mes "[Gotanblue]";
+ mes "Well let me tell you something....";
+ next;
+ mes "[Gotanblue]";
+ mes "TURTLE ISLAND TOOK THE LIVES OF MY CLOSEST FRIENDS!!";
+ emotion e_gasp;
+ next;
+ mes "[Gotanblue]";
+ mes "Can you POSSIBLY understand??.........";
+ next;
+ mes "[Gotanblue]";
+ mes "It all happened a few decades ago....";
+ next;
+ mes "[Gotanblue]";
+ mes "^5555FFJornadan Niliria^000000 and our comrades set off on a journey to find out if the legends about the island were true.";
+ next;
+ mes "[Gotanblue]";
+ mes "It was summer when I was approached to become a member of Jornadan's team.";
+ mes "I was only 20 then, and it was a huge honor for me to be a part of such a well respected group of men.";
+ next;
+ mes "[Gotanblue]";
+ mes "Jornadan Niliria was a great treasure hunter, I was the best seaman of the bunch, and the others were all the very best at what they did.";
+ next;
+ mes "[Gotanblue]";
+ mes "We decided to start our great adventure here, in Alberta. This was because of a clue we found that put the location of Turtle Island near Alberta.";
+ next;
+ mes "[Gotanblue]";
+ mes "We were all very exited and full of hope! We left everything behind and set sail to seek Turtle Island!";
+ mes "We sailed all day and all night. We eventually ran adrift, and could do nothing but sit and wait as the days passed.....";
+ next;
+ mes "[Gotanblue]";
+ mes "Then one day... without warning... we were surrounded by a tremendously thick blanket of fog!!";
+ mes "It was impossible to see anything past the length of your own arm!";
+ next;
+ mes "[Gotanblue]";
+ mes "We could not tell which way was East and which way was West. But it didn't matter... for we were all exhausted at that point.";
+ next;
+ mes "[Gotanblue]";
+ mes "Then what we feared most happened. A huge rock formation pierced through the fog right in front of us!";
+ mes "There was no way to avoid it and we crashed violently into it, severely damaging our ship!!";
+ emotion e_gasp;
+ next;
+ mes "[Gotanblue]";
+ mes "Amazingly, the ship held together and we were able to continue on.";
+ next;
+ mes "[Gotanblue]";
+ mes "Then like a beam of energy descending down from the heavens, the first ray of sunlight we had seen in weeks pierced through the fog onto our battered ship.";
+ next;
+ mes "[Gotanblue]";
+ mes "And like magic the fog lifted to reveal what we had been searching so long and hard for.... that legendary place.... TURTLE ISLAND!!!!";
+ next;
+ mes "[Gotanblue]";
+ mes "We set up camp immediately and rested our weary bodies. A few days later we began to extensively search the island.";
+ mes "What we found was shocking! Apparently someone had found the island before us. He left a very well kept journal of his expedition.";
+ next;
+ mes "[Gotanblue]";
+ mes "According to his journal, the man had come by himself to find the island. Unfortunately, we couldn't find him.";
+ next;
+ mes "[Gotanblue]";
+ mes "Even though someone had beaten us to Turtle Island, we still felt that it was an accomplishment to have made it to the island.";
+ mes "We continued to explore the island and find out as much about it as we could.";
+ next;
+ mes "[Gotanblue]";
+ mes "A particular artifact caught our interest. It was mentioned in that man's journal....";
+ mes "Oh, now I remember his name... ^5555FF'Won'^000000... apparently a great sword master....";
+ next;
+ mes "[Gotanblue]";
+ mes "Anyway, he wrote about a '^FF5555Jewel Fragment'^000000 of some kind. He described it as 'the most beautiful thing in the world'.";
+ next;
+ mes "[Gotanblue]";
+ mes "We became intent on finding that jewel no matter what. Day after day we searched for it. Months passed.";
+ mes "But even with Won's journal records, we were not able to find the jewel fragment. We had no choice but to give up.";
+ next;
+ mes "[Gotanblue]";
+ mes "So we packed up our belongings and headed home. Again we passed through the horrible dense fog.";
+ mes "After a month of sailing our journey was near its end... or so we thought.";
+ next;
+ mes "[Gotanblue]";
+ mes "We spotted land and I breathed a sigh of relief... unfortunately that feeling of relief turned into bewilderment as I realized that..... that....";
+ next;
+ mes "[Gotanblue]";
+ mes "IT WAS TURTLE ISLAND!!! We had landed on the other side of the island! We had no idea how it happened but we immediately cast off once again.";
+ emotion e_gasp;
+ next;
+ mes "[Gotanblue]";
+ mes "And as if some foul curse and been placed on our group, we again found ourselves on the shores of Turtle Island.";
+ mes "Time after time we attempted to flee the island only to find ourselves back on it. A whole year passed and still, we were trapped!";
+ next;
+ mes "[Gotanblue]";
+ mes "It was beyond reason.... We had tried every possible path.... Our spirits were broken, our hopes were crushed....";
+ mes "And one by one, my comrades fell, no longer having the strength to find a way home....";
+ next;
+ mes "[Gotanblue]";
+ mes "CURSED ISLAND!!!!!";
+ emotion e_omg;
+ next;
+ mes "[Gotanblue]";
+ mes "As you can see only I and Jornadan were able to make it out alive. By pure luck, we made back to Alberta....";
+ next;
+ mes "[Gotanblue]";
+ mes "(~sob~sob~sob)... I apologize. I'm still very emotional about it after all these years... Well, that's all I have to say about Turtle Island.";
+ emotion e_sob;
+ goto M_Menu;
+ M_2:
+ mes "[Gotanblue]";
+ mes "What's this? After my terrifying story about Turtle Island, you still want to go there? You're not at all scared??";
+ emotion e_what;
+ next;
+ mes "[Gotanblue]";
+ mes "So be it... but you will need me as your guide and that will cost 10,000 zeny!";
+ next;
+ menu "Turtle Island -> 10000 zeny",-, "Cancel",sM_End;
+
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "[Gotanblue]";
+ mes "Alright!! You've made your choice! With my experience we will get to Turtle Island without any problems.";
+ mes "I admire your fighting spirit. Carry it with you always!";
+ next;
+ mes "^5555FF(You and Gotanblue climb on board his little steamboat)^000000";
+ next;
+ mes "[Gotanblue]";
+ mes "We are now heading towards Turtle Island. Let us go without fear!!";
+ next;
+ mes "^5555FF(~choo~choooo~)^000000";
+ next;
+ if(Zeny < 10000) goto sL_Zeny;
+ set Zeny, Zeny - 10000;
+ warp "tur_dun01.gat",154,39;
+ close;
+ sL_Zeny:
+ mes "[Gotanblue]";
+ mes "What's this? I said 10,000 zeny. I will not guide you for less. Good day!";
+ emotion e_what;
+ close;
+ sM_End:
+ mes "[Gotanblue]";
+ mes "A very good choice!! Turtle Island is a DREADFULL and EVIL place!";
+ mes "When I take people there, I feel as if I'm leading them to their DEATHS!";
+ close;
+ M_End:
+ mes "[Gotanblue]";
+ mes "To this day, Turtle Island is shrouded in mystery. It is extremely hard to find, and almost impossible to escape from.";
+ mes "If you do not want to suffer great despair, then leave the truth behind Turtle Island as it is.... unknown....";
+ close;
+}
+
+//Go back to Alberta
+tur_dun01.gat,166,29,1 script Gotanblue#2 709,{
+ mes "[Gotanblue]";
+ mes "Going back to Alberta?";
+ next;
+ menu "Yep.",-, "Cancel",M_End;
+
+ mes "^5555FF(You and Gotanblue climb on board his little steamboat)^000000";
+ next;
+ warp "alberta.gat",244,123;
+ close;
+
+M_End:
+ mes "[Gotanblue]";
+ mes "A very good choice!!";
+ close;
+}
+
+// Turtle Grandpa -------------------------------------------------------------------
+alberta_in.gat,23,104,2 script Turtle Grandpa 120,{
+ mes "[Turtle Grandpa]";
+ mes "~Buuurrrpp!!!~ Oops...";
+ emotion e_swt;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "It's beyond me why people seem to think that Alberta is the center of world trade.";
+ mes "I mean, this place doesn't even have a decent bar for crying out loud!!";
+ emotion e_an;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Why is it that I have to resort to drinking in a place like this??";
+ emotion e_what;
+ next;
+ menu "-Tell me about Turtle Island.",-, "-How can I get there?",M_1, "-End conversation.",M_End;
+
+ mes "[Turtle Grandpa]";
+ mes "There is an enormous stash of treasure hidden on Turtle Island.";
+ mes "There is also a special potion that can increase a person's lifespan on that island......";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "There are so many myths and legends about the island, that no one even knows for sure if Turtle Island exist.";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "I for one believe it does.... It HAS TO!!......";
+ emotion e_gasp;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "If you are any sort of seaman, if you have a spirit for adventure, and if you have the heart to become a great treasure hunter....";
+ mes "Then you may be worthy of the information I have to offer...";
+ next;
+ menu "-(~eyes twinkle~)",-, "-Heck Ya! Gimme that information.",sM_1;
+
+ mes "[Turtle Grandpa]";
+ mes "His name was ^5555FFJornadan Niliria^000000. Jornadan and his ten comrades set off on a journey to find the legendary Turtle Island.";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "At first they had no idea where the island was. They were ambitious and worked extremely hard to gather clues on the whereabouts of the island.";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "These men were very strong, especially Jornadan. He was so strong in fact, that his simple kicks were as powerful as a level 10 bash!!!";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "He could catch an arrow in one hand while healing a comrade with the other, all during the middle of a battle!";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Heh heh. Well, it's just a rumor so take it for what it's worth. As I was saying....";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "After searching tirelessly Jornadan and his crew eventually found the famed Turtle Island.";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "But for reasons unknown, the crew became stranded on the island forever!!";
+ mes "Although I do not know why or how it happened, there IS one person that does.";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Go the docks on the east end of town. Look for a scholar named.... ^FF3333Jornadan^000000... ^FF3333Niliria^000000...";
+ mes "Speak to him. He should be able to tell you more..... ";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Oh! One more thing... look for his '^5555FFjournal^000000'. He usually has it close by. It's definitely an interesting read.";
+ if(TURTLE==0) set TURTLE, 1;
+ close;
+ sM_1:
+ mes "[Turtle Grandpa]";
+ mes "No way! I have no interest in speaking with someone with greed in his/her heart!";
+ emotion e_gasp;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Get OUT of my sight!!! GO HOME!";
+ emotion e_an;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "What's this?? You're still here?..... GO! GO AWAY!!............";
+ emotion e_go;
+ close;
+ M_1:
+ mes "[Turtle Grandpa]";
+ mes "It's is extremely hard to find, and even more difficult to reach. The likelihood of returning home is slim at best....";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Actually..... IT'S IMPOSSIBLE!!!!";
+ emotion e_gasp;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Yet you still want to go there??";
+ emotion e_what;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "I want to warn you about the dangers of going there.... but.... I feel so dizzy..... wooah..... it must be the Vodka....";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Any who, if you go the docks you'll find a fat, old, sailor. His name is ^5555FFGotanblue^000000.";
+ mes "Tell him I sent you and maybe he'll tell you how to get to Turtle Island. Well, good luck.";
+ close;
+ M_End:
+ mes "[Turtle Grandpa]";
+ mes "Whooops......";
+ next;
+ mes "!!KA-PLOP!!(collapses on the floor)";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "He he he.... look at me.... I'm a fish... I'm drunk like a fish..... enough for today..... ~ZZZZZzzzz~";
+ close;
+}
+
+// Letter of an explorer (on Turtle Grandpa's desk)------------------------------------------------------------------
+alberta_in.gat,17,101,1 script Letter of an explorer 111,{
+ mes "~ The letter reads... ~";
+ mes "- O/X/XOVX -";
+ mes "If you find this letter, it means that our expedition to Turtle Island has failed. Please inform the others...";
+ next;
+ mes "~ continued...~";
+ mes "As of now, only half the number of our crew members are left. Our food supply will only last for ten more days. It is a grave situation we are facing....";
+ next;
+ mes "~ continued...~";
+ mes "- V/O/XOVX -";
+ mes "It seems my letters did not make it to the outside world, and have instead come back to me.... This damn island is CURSED!! Oh God.....";
+ next;
+ mes "~ continued...~";
+ mes "GOD FORSAKEN ISLAND!! There is nothing left to eat..... help... me... please.... HELP ME!!";
+ next;
+ mes "~ continued...~";
+ mes "- V/X/XOVX -";
+ mes "^5555FF- This section is severely crumpled and tattered. -^000000";
+ mes "^5555FF- You are unable to read it. -^000000";
+ close;
+}
+
+// Jornadan Niliria ------------------------------------------------------------------------
+alberta.gat,248,90,1 script Jornadan Niliria 121,{
+ mes "[Jornadan Niliria]";
+ mes "Sometimes I think that the world around me is ever changing.";
+ mes "When I view the land it seems different, when I look up at the sky it too seems different....";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "The way that Alberta and Turtle Island are different. Hah hah hah....";
+ next;
+ menu "-About Turtle Island.",-, "-Um, did you get confused with Al De Baran?",M_1, "-End Conversation.",M_End;
+
+ mes "[Jornadan Niliria]";
+ mes "Ah yes..... Turtle Island.... Do you know why it's named, 'Turtle' Island? Would you like to know? Haha......";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "The reason behind the name is actually very easy to figure out and you might even feel a little foolish about not getting it in the first place.";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "It's called 'Turtle' Island, because of the fact that it is shaped like an actual turtle. Haha. That's all there is to it.";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "There is an unusually dense area of fog that surrounds the island.";
+ mes "At first we tried to figure what causes it but with no luck. We figured that it was just a natural phenomenon.";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "Then we found a cave along the coastline of the island. Inside we were amazed to see a HUGE waterfall.";
+ mes "It turns out that this waterfall is what creates that extremely thick area of fog around that island.";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "The reason is so simple and yet there are people who still try to find a deeper meaning behind it....";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "I believe that people continue to probe into the matter because they do not want to feel that their efforts have been in vain.";
+ mes "Maybe they are afraid of the truth..... I for one was once afraid.... afraid of Turtle Island....";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "But now that I truly understand all of the myths about Turtle Island, I feel at ease and at peace with the island.";
+ mes "There is still one lingering question about the island for me though..... it is the existence of the unknown ^FF5555'Jewel Fragment'^000000.";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "I am still not certain about what it really is. In the mean time I will continue to pursue the matter until I discover the truth! Hahaha!!";
+ close;
+ M_1:
+ mes "[Jornadan Niliria]";
+ mes "Whoops ! Oh that's right !! Confused !.... Yipe !..... WOOOOO !!!"; //have NO idea what this means.....
+ close;
+ M_End:
+ mes "[Jornadan Niliria]";
+ mes "When you're searching for the truth, make sure to keep trying. Someday you will find the answers you seek...";
+ next;
+ mes "[Jornadan Niliria]";
+ mes "Hmmm.... by the way.... I feel hungry. Why doesn't Alberta have a store or restaurant for some good Dim Sum??";
+ close;
+}
+
+// Jornadan's Voyage Log -------------------------------------------------
+alberta.gat,247,93,1 script A Voyage Log 111,{
+ if(TURTLE == 1) goto L_Treasure;
+ mes "[A Voyage Log]";
+ mes "= 03:20 am =";
+ mes "The moon was dark and I couldn't even see 100m in front of me. I had a bad feeling about the situation..... I was not the only one...";
+ next;
+ mes "[A Voyage Log]";
+ mes "I could tell by the looks on my comrade's faces, that they too were worried. No one could sleep that night. I hope we will see the sunrise soon....";
+ next;
+ mes "[A Voyage Log]";
+ mes "= 04:10 =";
+ mes "5 minutes ago one of our comrades, Cooker, died. While he walking on deck, the flagpole suddenly broke and fell on his head....";
+ next;
+ mes "[A Voyage Log]";
+ mes "He died at approximately 04:07. The flagpole had been damaged when our ship hit a reef.";
+ mes "The ship sustained serious damage along the left side of the deck. I called on the chief to repair it.";
+ next;
+ mes "[A Voyage Log]";
+ mes "= 04:45 =";
+ mes "While two of our workers were fixing the bottom of the deck, monsters attacked them without warning.";
+ mes "Apparently they had gotten in through some openings in the deck.";
+ next;
+ mes "[A Voyage Log]";
+ mes "Two more men had been lost. Fortunately the ship has yet to sink and seems to be holding up. Still, we must find land soon.";
+ next;
+ mes "[A Voyage Log]";
+ mes "During the collision with the reef we lost about 30% of our supplies. In particular we lost food... a great deal of food....";
+ next;
+ mes "[A Voyage Log]";
+ mes "= 05:23 =";
+ mes "We've been noticing an increase in the amount of reefs and they are getting larger as well.";
+ mes "I wonder when we will find land.... I wonder if we can....";
+ next;
+ mes "[A Voyage Log]";
+ mes "- Written by -";
+ mes "- captain Jornadan Niliria -";
+ next;
+ mes "^5555FF- Closed the voyage log -^000000";
+ close;
+
+L_Treasure:
+ mes "^5555FF- The paper is torn -";
+ mes "- Seaweed and mold have -";
+ mes "- mixed with the paper -";
+ mes "- It looks to be in very poor";
+ mes "condition. -^000000";
+ next;
+ mes "^5555FF- Between some pages -";
+ mes "- Is a Banana leaf -";
+ mes "- this is written. -^000000";
+ next;
+ mes "[A Voyage Log]";
+ mes "= O/X date =";
+ mes "Just after we arrived to Turtle Island, we searched for some food to eat. I am so skinny now...";
+ next;
+ mes "[A Voyage Log]";
+ mes "When I looked at myself in the mirror, it was horrible. I was disturbed by what I saw...";
+ next;
+ mes "[A Voyage Log]";
+ mes "= X/X date =";
+ mes "We found some kind of fruit! It has a yellow color and a long shape. It looks just like a banana!";
+ next;
+ mes "[A Voyage Log]";
+ mes "= XO/X date =";
+ mes "Although very similar, the fruit we found was not a banana. We believe it is a relative of the banana.";
+ mes "It smells and tastes exactly like a banana.";
+ next;
+ mes "[A Voyage Log]";
+ mes "We were starving so we just referred to the fruit as bananas and gathered it for food.";
+ mes "Although there were a limited amount of trees, there was enough for our survival.";
+ next;
+ mes "[A Voyage Log]";
+ mes "It has become the answer to our lack of food and has become precious to us.";
+ mes "~ WE LOVE YOU BANANA!! ~";
+ next;
+ mes "[A Voyage Log]";
+ mes "= O/O date =";
+ mes "In the middle of the night, one of our comrades reported that he felt sick from something he ate.";
+ next;
+ mes "[A Voyage Log]";
+ mes "= OO/O date =";
+ mes "Another comrade fell ill. He had the strongest digestive system among us.";
+ mes "He went by the name, 'Berot Berot', and he played a vital role in our group.";
+ next;
+ mes "[A Voyage Log]";
+ mes "The fact that he got sick from something he ate, made it very clear that there was something poisoning us.";
+ next;
+ mes "[A Voyage Log]";
+ mes "= XO/O date =";
+ mes "A third person became sick today while we were out exploring. The first person to become ill has passed away.... We are all very worried.";
+ next;
+ mes "[A Voyage Log]";
+ mes "We tried very hard to find the cause of the illness. Then by observing the animals one day, we found it.";
+ mes "It was the very thing we thought to be our salvation and yet not one animal on the island would even touch it.....";
+ next;
+ mes "[A Voyage Log]";
+ mes "What was killing us was..... our beloved BANANA!!";
+ next;
+ mes "[A Voyage Log]";
+ mes "We decided to get rid of all of the bananas. But for some reason they didn't seem to be decomposing.";
+ mes "Even when the skin was peeled off, the fruits remained the same.";
+ next;
+ mes "[A Voyage Log]";
+ mes "I think that the poison or some other agent within the fruit is allowing it to survive.";
+ mes "We may be able to use it for medicinal purposes later, but for now it is of no use to us.";
+ mes "Until we get back to Alberta, we have to decided to bury what is left of the fruit.";
+ next;
+ mes "[A Voyage Log]";
+ mes "This is the location where it's buried in case we forget:";
+ mes "^FF8888- tur_dun01 -";
+ mes "- X: 160, Y: 81 -^000000";
+ next;
+ mes "^5555FF- There is a thin Key -";
+ mes "- with a skull mark on it -";
+ mes "- You've gained -";
+ mes "- a 'Skull Key' -^000000";
+ set TURTLE, 2;
+ close;
+}
+
+// Burried treasure --------------------------------------------------------------------
+tur_dun01.gat,160,80,1 script Skull Stone 111,{
+ if(TURTLE == 2) goto L_OpenBox;
+ mes "^5555FF(It's a frightening stone tomb with horrible skull on it.)^000000";
+ close;
+
+L_OpenBox:
+ mes "^5555FF(Under the stone is a tiny key hole with a skull mark. You used the 'Skull Key' to open the box.)^000000";
+ next;
+ mes "^5555FF(~click!~click!~)^000000";
+ next;
+ mes "^5555FF(Suddenly the top of the stone opens with many things coming out!)^000000";
+ set TURTLE, 3;
+ next;
+ mes "^5555FF(You got 5 Tropical Bananas and 5 Banana Juices.)^000000";
+ getitem 634, 5;
+ getitem 532, 5;
+ close;
} \ No newline at end of file
diff --git a/npc/quests/quests_aldebaran.txt b/npc/quests/quests_aldebaran.txt
index 167acf736..609f5a985 100644
--- a/npc/quests/quests_aldebaran.txt
+++ b/npc/quests/quests_aldebaran.txt
@@ -1,93 +1,93 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Aldebaran
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quests.
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed Doctor Band items [Lupus]
-//= 1.2 Removed Duplicates [Silent]
-//============================================================
-
-
-//=======================================================================================================//
-// 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quest
-//=======================================================================================================//
-aldeba_in.gat,152,166,4 script Trader#01 86,{
- mes "[Trader]";
- mes "Muhahaha! I am the Very Famous Enigmatic Dealer! I am always hustling and bustling in and out of Rune Midgard!";
- mes "Take a look at my RARE and UNIQUE items from ALL OVER the WORLD!!";
- next;
- mes "(1) · ^3355FFDoctor Band^000000 :";
- mes "^FF55331 Red Bandana + 50 Iron + 1 Cracked Diamond + 3500 Zeny^000000.";
- mes "(2) · ^3355FFFeather Bonnet^000000 :";
- mes "^FF55331 Romantic Gent + 300 Feather of Birds + 500 Zeny^000000.";
- mes "(3) · ^3355FFOpera Masque^000000 :";
- mes "^FF553320 Iron + 1 Singing Plant + 5000 Zeny^000000.";
- mes "(4) · ^3355FFSakkat Hat^000000 :";
- mes "^FF5533120 Trunk + 10000 Zeny^000000.";
- next;
- menu "Doctor Band",-, "Feather Bonnet",M_1, "Opera Masque",M_2, "Sakkat",M_3;
-
- mes "[Trader]";
- if(countitem(2275) == 0 || countitem(998) < 50 || countitem(733) == 0 || Zeny < 3500) goto L_CantMake;
- delitem 2275,1;//Items: Red Bandana,
- delitem 998,50;//Items: Iron,
- delitem 733,1;//Items: Cracked deamond
- set Zeny,Zeny - 3500;
- mes "Hmm.... Do you have a.... MEDICAL LICENSE?!";
- emotion e_what;
- next;
- mes "[Trader]";
- mes "I've heard about a well-known unlicensed physician 'Cuwaki'... I hope you don't get caught....";
- mes "Anyways it's your own buisness what you do... Take this.";
- getitem 2273,1;//Items: Doctor Band,
- close;
- M_1:
- mes "[Trader]";
- if(countitem(2247) == 0 || countitem(916) < 300 || Zeny < 500) goto L_CantMake;//Items: Romantic Gent, Feather of Birds,
- delitem 2247,1;//Items: Romantic Gent,
- delitem 916,300;//Items: Feather of Birds,
- set Zeny,Zeny - 500;
- mes "Umhahaha. You have good fashion sense. I know you had a hard time collecting these items, but this bonnet is definately worth it. Take it.";
- emotion e_heh;
- getitem 5018,1;//Items: Feather Bonnet,
- close;
- M_2:
- mes "[Trader]";
- if(countitem(998) < 20 || countitem(707) == 0 || Zeny < 5000) goto L_CantMake;//Items: Iron, Singing Plant,
- delitem 998,20;//Items: Iron,
- delitem 707,1;//Items: Singing Plant,
- set Zeny,Zeny - 5000;
- mes "This is a pretty nice item. A little bit creepy looking though.... I think it gives off some kinda weird vibe. What do you think?";
- next;
- mes "[Trader]";
- mes ".. You like it ..Alright.. Take it!";
- getitem 2281,1;//Items: Opera Masque,
- close;
- M_3:
- mes "[Trader]";
- if(countitem(1019) < 120 || Zeny < 10000) goto L_CantMake;//Items: Trunk,
- delitem 1019,120;//Items: Trunk,
- set Zeny,Zeny - 10000;
- mes "If you have a chance to visit the Village of Payon, please go meet the Sakkat Craftsman.";
- mes "He's never sold a Sakkat to any other dealer but to me.";
- next;
- mes "[Trader]";
- mes "Because only I can recognize a Sakkat hats' quality. Due to the fact that it's so rare, the Sakkat Hat has become a very popular item!";
- next;
- mes "[Trader]";
- mes "OK! Take it!";
- getitem 2280,1;//Items: Sakkat,
- close;
-
- L_CantMake:
- mes "You, fool! Check the requirements again..... you're not some kinda idiot are you? C'mon..... give me a break.";
- emotion e_an;
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Aldebaran
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quests.
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed Doctor Band items [Lupus]
+//= 1.2 Removed Duplicates [Silent]
+//============================================================
+
+
+//=======================================================================================================//
+// 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quest
+//=======================================================================================================//
+aldeba_in.gat,152,166,4 script Trader#01 86,{
+ mes "[Trader]";
+ mes "Muhahaha! I am the Very Famous Enigmatic Dealer! I am always hustling and bustling in and out of Rune Midgard!";
+ mes "Take a look at my RARE and UNIQUE items from ALL OVER the WORLD!!";
+ next;
+ mes "(1) · ^3355FFDoctor Band^000000 :";
+ mes "^FF55331 Red Bandana + 50 Iron + 1 Cracked Diamond + 3500 Zeny^000000.";
+ mes "(2) · ^3355FFFeather Bonnet^000000 :";
+ mes "^FF55331 Romantic Gent + 300 Feather of Birds + 500 Zeny^000000.";
+ mes "(3) · ^3355FFOpera Masque^000000 :";
+ mes "^FF553320 Iron + 1 Singing Plant + 5000 Zeny^000000.";
+ mes "(4) · ^3355FFSakkat Hat^000000 :";
+ mes "^FF5533120 Trunk + 10000 Zeny^000000.";
+ next;
+ menu "Doctor Band",-, "Feather Bonnet",M_1, "Opera Masque",M_2, "Sakkat",M_3;
+
+ mes "[Trader]";
+ if(countitem(2275) == 0 || countitem(998) < 50 || countitem(733) == 0 || Zeny < 3500) goto L_CantMake;
+ delitem 2275,1;//Items: Red Bandana,
+ delitem 998,50;//Items: Iron,
+ delitem 733,1;//Items: Cracked deamond
+ set Zeny,Zeny - 3500;
+ mes "Hmm.... Do you have a.... MEDICAL LICENSE?!";
+ emotion e_what;
+ next;
+ mes "[Trader]";
+ mes "I've heard about a well-known unlicensed physician 'Cuwaki'... I hope you don't get caught....";
+ mes "Anyways it's your own buisness what you do... Take this.";
+ getitem 2273,1;//Items: Doctor Band,
+ close;
+ M_1:
+ mes "[Trader]";
+ if(countitem(2247) == 0 || countitem(916) < 300 || Zeny < 500) goto L_CantMake;//Items: Romantic Gent, Feather of Birds,
+ delitem 2247,1;//Items: Romantic Gent,
+ delitem 916,300;//Items: Feather of Birds,
+ set Zeny,Zeny - 500;
+ mes "Umhahaha. You have good fashion sense. I know you had a hard time collecting these items, but this bonnet is definately worth it. Take it.";
+ emotion e_heh;
+ getitem 5018,1;//Items: Feather Bonnet,
+ close;
+ M_2:
+ mes "[Trader]";
+ if(countitem(998) < 20 || countitem(707) == 0 || Zeny < 5000) goto L_CantMake;//Items: Iron, Singing Plant,
+ delitem 998,20;//Items: Iron,
+ delitem 707,1;//Items: Singing Plant,
+ set Zeny,Zeny - 5000;
+ mes "This is a pretty nice item. A little bit creepy looking though.... I think it gives off some kinda weird vibe. What do you think?";
+ next;
+ mes "[Trader]";
+ mes ".. You like it ..Alright.. Take it!";
+ getitem 2281,1;//Items: Opera Masque,
+ close;
+ M_3:
+ mes "[Trader]";
+ if(countitem(1019) < 120 || Zeny < 10000) goto L_CantMake;//Items: Trunk,
+ delitem 1019,120;//Items: Trunk,
+ set Zeny,Zeny - 10000;
+ mes "If you have a chance to visit the Village of Payon, please go meet the Sakkat Craftsman.";
+ mes "He's never sold a Sakkat to any other dealer but to me.";
+ next;
+ mes "[Trader]";
+ mes "Because only I can recognize a Sakkat hats' quality. Due to the fact that it's so rare, the Sakkat Hat has become a very popular item!";
+ next;
+ mes "[Trader]";
+ mes "OK! Take it!";
+ getitem 2280,1;//Items: Sakkat,
+ close;
+
+ L_CantMake:
+ mes "You, fool! Check the requirements again..... you're not some kinda idiot are you? C'mon..... give me a break.";
+ emotion e_an;
+ close;
+}
diff --git a/npc/quests/quests_amatsu.txt b/npc/quests/quests_amatsu.txt
index c64740466..4e0a60308 100644
--- a/npc/quests/quests_amatsu.txt
+++ b/npc/quests/quests_amatsu.txt
@@ -1,1528 +1,1528 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Amatsu
-//===== By: ==================================================
-//= eAthena team & others? & MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Momotaro event, Sushi Quest, Amatsu Event
-//===== Additional Comments: =================================
-//= 1.0 Rewrote parts of other/momotaro.txt to make it work.
-//= I'm sorry for the mess, I couldn't do much better with
-//= the current code I had.
-//= 1.1 Added Sushi Quest and Amatsu Event from cities/ [Evera]
-//= 1.2 Fixed Momotaro Quest, thanks to .~Abism0~. [Lupus]
-//============================================================
-
-amatsu.gat,223,235,4 script Publisher 763,{
- if (event_momo > 4) goto Lfin;
- if ((event_momo >= 1) && (event_momo <= 4)) goto Lget;
- mes "[Publisher]";
- mes "Hello~~!!";
- mes "Our ^00B6FFScroll Publishing Company^000000";
- mes "is professionally publishing";
- mes "tales.";
- next;
- mes "[Publisher]";
- mes "We established";
- mes "^3366FFMomotaro Field Trip^000000";
- mes "to celebrate ^00B6FF<Momotaro Story>^000000";
- mes "selling over a million copies.";
- next;
- mes "[Publisher]";
- mes "Become Momotaro and eliminate";
- mes "Dokebis, just like in the story!";
- mes "There will also be rewards.";
- next;
- menu "What is Momotaro Story?!",-,"I want to try!",L1,"I'm busy right now...",L2;
- mes "[Publisher]";
- mes "Eh~!? How can you not know about";
- mes "Momotaro? Don't they have this";
- mes "tale in Rune-Midgard?? Well...";
- mes "Let me tell you the story.";
- next;
- mes "[Publisher]";
- mes "Long ago, there lived an old";
- mes "married couple. They were happy,";
- mes "but didn't have any children.";
- next;
- mes "[Publisher]";
- mes "One day, while old lady was doing";
- mes "the laundry, she found a humongous";
- mes "peach. She cut it in half and...";
- mes "'Poof!' There was a baby inside!";
- next;
- mes "[Publisher]";
- mes "The old man and lady were shocked.";
- mes "They decided to adopt that baby,";
- mes "and give him their love...";
- next;
- mes "[Publisher]";
- mes "That baby grew so fast, like that";
- mes "beanstalk from 'Jack and";
- mes "Beanstalk' and became a strong boy";
- mes "in only a few days.";
- next;
- mes "[Publisher]";
- mes "That's boy's name was...";
- mes "<Momotaro>!!!";
- mes "Momotaro traveled to eliminate";
- mes "dokebis that were harassing";
- mes "the towners.";
- next;
- mes "[Publisher]";
- mes "He became friends with";
- mes "^3151FFYoyo, Picky, and Desert Wolf^000000";
- mes "and eliminated all of the Dokebis.";
- mes "then he lived happily ever after";
- mes "with the old couple.";
- next;
- mes "[Publisher]";
- mes "How was it?";
- mes "Great, right?";
- mes "I mean, this story sold a million";
- mes "copies!";
- close;
-L1:
- mes "[Publisher]";
- mes "Yay-! You look excited!";
- mes "You'll be ready to go soon.";
- mes "Please fill out this registration";
- mes "card.";
- next;
- mes "[Publisher]";
- mes ".................";
- mes "......Mm.....Let's see.....";
- mes ".............Good!";
- mes "Alright, then!";
- mes "Let it begin~~~!!!!!!!!!";
- mes "<Momotaro Field Trip>~!";
- close2;
- warp "ama_test",52,35;
- end;
-L2:
- mes "[Publisher]";
- mes "Eh?";
- mes "...But there are sweet rewards";
- mes "waiting...";
- close;
-Lget:
- mes "[Publisher]";
- mes "How was it? Did you enjoy the event?";
- mes "I hope the arrangements at the event hall allowed you to spend an enjoyable time there.";
- next;
- if (event_momo > 1 && event_momo < 4)
- {
- switch(rand(1,24))
- {
-
- case 1:
- getitem 627,1; //sweet milk
- break;
-
- case 2:
- getitem 629,1; //singing flower
- break;
-
- case 3:
- getitem 625,1; //rusty iron
- break;
-
- case 4:
- getitem 619,1; //unripe apple
- break;
-
- case 5:
- getitem 620,1; //orange juice
- break;
-
- case 6:
- getitem 621,1; //bitter herb
- break;
-
- case 7:
- getitem 622,1; //rainbow carrot
- break;
-
- case 8:
- getitem 623,1; //earthworm the dude
- break;
-
- case 9:
- getitem 624,1; //rotten fish
- break;
-
- case 10:
- getitem 626,1; //monster juice
- break;
-
- case 11:
- getitem 628,1; //well-dried bone
- break;
-
- case 12:
- getitem 630,1; //dew laden moss
- break;
-
- case 13:
- getitem 631,1; //deadly noxious herb
- break;
-
- case 14:
- getitem 632,1; //fatty chubby earthworm
- break;
-
- case 15:
- getitem 633,1; //sweet potato
- break;
-
- case 16:
- getitem 634,1; //tropical banana
- break;
-
- case 17:
- getitem 635,1; //orc trophy
- break;
-
- case 18:
- getitem 636,1; //no recipient
- break;
-
- case 19:
- getitem 637,1; //old broom
- break;
-
- case 20:
- getitem 638,1; //silver knife of chastity
- break;
-
- case 21:
- getitem 639,1; //armlet of obedience
- break;
-
- case 22:
- getitem 640,1; //shining stone
- break;
-
- case 23:
- getitem 641,1; //contract in shadow
- break;
-
- case 24:
- getitem 642,1; //book of the devil
- break;
-
- }
- }
-//Am Mut successful finish unknown
- if (event_momo == 4)
- {
- while(@i != 3)
- {
- switch(rand(1,24))
- {
-
- case 1:
- getitem 627,1; //sweet milk
- break;
-
- case 2:
- getitem 629,1; //singing flower
- break;
-
- case 3:
- getitem 625,1; //rusty iron
- break;
-
- case 4:
- getitem 619,1; //unripe apple
- break;
-
- case 5:
- getitem 620,1; //orange juice
- break;
-
- case 6:
- getitem 621,1; //bitter herb
- break;
-
- case 7:
- getitem 622,1; //rainbow carrot
- break;
-
- case 8:
- getitem 623,1; //earthworm the dude
- break;
-
- case 9:
- getitem 624,1; //rotten fish
- break;
-
- case 10:
- getitem 626,1; //monster juice
- break;
-
- case 11:
- getitem 628,1; //well-dried bone
- break;
-
- case 12:
- getitem 630,1; //dew laden moss
- break;
-
- case 13:
- getitem 631,1; //deadly noxious herb
- break;
-
- case 14:
- getitem 632,1; //fatty chubby earthworm
- break;
-
- case 15:
- getitem 633,1; //sweet potato
- break;
-
- case 16:
- getitem 634,1; //tropical banana
- break;
-
- case 17:
- getitem 635,1; //orc trophy
- break;
-
- case 18:
- getitem 636,1; //no recipient
- break;
-
- case 19:
- getitem 637,1; //old broom
- break;
-
- case 20:
- getitem 638,1; //silver knife of chastity
- break;
-
- case 21:
- getitem 639,1; //armlet of obedience
- break;
-
- case 22:
- getitem 640,1; //shining stone
- break;
-
- case 23:
- getitem 641,1; //contract in shadow
- break;
-
- case 24:
- getitem 642,1; //book of the devil
- break;
-
- }
- set @i,@i+1;
- }
- }
- set event_momo,5;
- mes "[Publisher]";
- mes "Well then, I will give you a small present which I have prepared.";
- mes "May the legend be widely loved also in the future......";
- close;
-Lfin:
- mes "[Publisher]";
- mes "We have a nice weather today, don't we...... It is a perfect day to dry the futon.";
- close;
-}
-//=====================================================================
-ama_test.gat,50,44,4 script Event Hall Staff 109,{
- mes "[Satoshi]";
- mes "Welcome to <Momotaro Field Trip>";
- next;
- mes "[Satoshi]";
- mes "I'm Satoshi who is in charge of the";
- mes "waiting room in <Momotaro Field";
- mes "Trip>.";
- next;
- mes "[Satoshi]";
- mes "Originally, I was working for the";
- mes "publishing company, but we lacked";
- mes "workers for the Field Trip...";
- mes "But working here is much better!";
- mes "Now I just watch people trying to";
- mes "accomplish the mission. Heh hehe~";
- next;
- mes "[Satoshi]";
- mes "..............";
- mes "Just kidding";
- mes "^111111*Wipes away sweat*^000000";
- next;
- mes "[Satoshi]";
- mes "Well, let me explain";
- mes "about the rules in the Field Trip";
- next;
- mes "[Satoshi]";
- mes "First of all...Did you hear";
- mes "about the story from the";
- mes "publisher?";
- next;
- menu "Yes",L1,"No",-;
- mes "[Satoshi]";
- mes "Eh? You can't just";
- mes "skip the story";
- mes "when you enter the field";
- mes "trip! I can't allow you to";
- mes "do that as a Momotaro's";
- mes "fan!!!";
- next;
- mes "[Satoshi]";
- mes "Please listen to the story";
- mes "from the publisher.";
- mes "Thank you.";
- mes "Bye~~";
- close2;
- warp "amatsu.gat",223,230;
- end;
-L1:
- mes "[Satoshi]";
- mes "Hehe...Good.";
- mes "Momotoro's Story is our";
- mes "pride. It's the best story EVER.";
- mes "Hahaha!!!";
- next;
- mes "[Satoshi]";
- mes "...Hmmhmm.";
- next;
- mes "[Satoshi]";
- mes "The Field Trip is simple.";
- mes "Go inside and eliminate";
- mes "Dokebis bravely!!!";
- mes "Just like Momotaro!!!";
- mes "Understand? Bravely!!!";
- next;
- mes "[Satoshi]";
- mes "In addition, there are three";
- mes "things you need to know.";
- next;
- mes "[Satoshi]";
- mes "First....";
- mes "You can't come back once you clear";
- mes "the field trip. Keep that in mind.";
- next;
- mes "[Satoshi]";
- mes "Secondly...";
- mes "Q-pet is prohibited";
- mes "inside of the field trip.";
- mes "if you are with a pet,";
- mes "please change it to egg status.";
- next;
- mes "[Satoshi]";
- mes "And finally...";
- mes "One person can be on the";
- mes "field trip for 6 minutes.";
- next;
- mes "[Satoshi]";
- mes "Well then, Please";
- mes "wait for you turn";
- mes "in the waitiSng room.";
- mes "Good luck in fighting!!";
- close;
-OnInit:
- waitingroom "Event Hall Waiting Room",1,"Event Hall Staff::OnMax";
-OnInitCopy:
- enablewaitingroomevent "Event Hall Staff";
- areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
- disablenpc "Manager#Momotaro";
- enablenpc "Grandpa#Momotaro";
- enablenpc "Grandma#Momotaro";
- donpcevent "#MomotaroTimer::OnStopTimer";
- killmonsterall "ama_test.gat";
- end;
-OnMax:
- warpwaitingpc "ama_test.gat",51,85;
- disablewaitingroomevent "Event Hall Staff";
- disablenpc "Manager#Momotaro";
- enablenpc "Grandpa#Momotaro";
- enablenpc "Grandma#Momotaro";
- donpcevent "#MomotaroActivator::OnMomoInit";
- end;
-}
-
-ama_test.gat,1,1,0 script #MomotaroTimer -1,{
-OnStartTimer:
- initnpctimer;
- end;
-OnTimer180000:
- if(!isloggedin($MomotaroRID))goto s_Cleanup;
- mapannounce "ama_test.gat","Timer: 3 Minutes left.",8;
- end;
-OnTimer300000:
- if(!isloggedin($MomotaroRID))goto s_Cleanup;
- mapannounce "ama_test.gat","Timer: 1 Minute left.",8;
- end;
-OnTimer360000:
- if(!isloggedin($MomotaroRID))goto s_Cleanup;
- mapannounce "ama_test.gat","Timer: Beep- Beep- Beep- Time's up.",8;
-OnTimer362500:
- areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
- goto s_Cleanup;
-
-
-OnTimer20000:
-OnTimer40000:
-OnTimer60000:
-OnTimer80000:
-OnTimer100000:
-OnTimer120000:
-OnTimer140000:
-OnTimer160000:
-OnTimer200000:
-OnTimer220000:
-OnTimer240000:
-OnTimer260000:
-OnTimer280000:
-OnTimer320000:
-OnTimer340000:
- if(!isloggedin($MomotaroRID))goto s_Cleanup;
- end;
-
-OnCleanUp:
-s_Cleanup:
- stopnpctimer;
- set $Momotaro,0;
- set $MomoDokebi,0;
- set $MomoDokebi2,0;
- set $MomotaroRID,0;
- mapannounce "ama_test.gat","The current player has exited. The waiting room will now open again.",8;
- disablenpc "Manager#Momotaro";
- donpcevent "Event Hall Staff::OnInitCopy";
- end;
-
-OnStopTimer:
- stopnpctimer;
- end;
-
-}
-
-ama_test.gat,51,85,0 script #MomotaroActivator 139,1,1,{
- if($Momotaro)end;
- set $Momotaro,1;
- set $MomotaroRID,getcharid(3);
- areaannounce "ama_test.gat",30,78,68,120,"Timer: The Timer has been activated. You have 6 minutes. Annihilate the monsters in time!",8;
- donpcevent "#MomotaroTimer::OnStartTimer";
- mes "[Grandpa]";
- mes "Arrrk!!!";
- next;
- mes "[Grandma]";
- mes "Honey!! Someone hacked my account";
- mes "and stole my equipment!!";
- next;
- mes "[Grandpa]";
- mes "Hmm. The Chief said the Dokebi";
- mes "earned 20 million zeny by hacking";
- mes "other's accounts...";
- next;
- mes "[Grandma]";
- mes "Dohhhhhhh!!!!";
- next;
- mes "[Grandpa]";
- mes "...Huh I've heard that somewhere";
- mes "before....";
- next;
- mes "[Grandpa]";
- mes "Anyway, Momotaro...";
- next;
- mes "[Grandpa]";
- mes "As you know, since we towners spends";
- mes "our time sitting and chatting,";
- mes "we can't kill Dokebis because we're";
- mes "low levels, so...Please do it for";
- mes "us.";
- next;
- mes "[Grandma]";
- mes "Momotaro...";
- mes "I really wanted to give you";
- mes "a handmade ^3151FFYummiest Red Poiton in";
- mes "the whole world^000000 ...but...";
- mes ".....I failed to make them ....";
- next;
- mes "[Grandma]";
- mes "...I'm sorry. I should have been";
- mes "leveling up before...^111111*Sob*";
- next;
- mes "[Grandma & Grandpa]";
- mes "So...Do me this favor, kid~";
- close2;
- initnpctimer;
- end;
-
-OnTimer5000:
- stopnpctimer;
- set $MomoDokebi,0;
- set $MomoDokebi2,0;
- disablenpc "Grandpa#Momotaro";
- disablenpc "Grandma#Momotaro";
- monster "ama_test.gat",47,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",51,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",55,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",55,97,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",55,93,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",53,91,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",49,91,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",45,96,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- monster "ama_test.gat",45,99,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
- end;
-
-OnInit:
- set $Momotaro,0;
- set $MomoDokebi,0;
- set $MomoDokebi2,0;
- set $MomotaroRID,0;
- end;
-
-}
-
-ama_test.gat,49,95,4 script Grandpa#Momotaro 766,{
-
- mes "[Grandpa]";
- mes "Zzzzzz......";
- close;
-}
-
-ama_test.gat,51,95,4 script Grandma#Momotaro 761,{
-
- mes "[Grandma]";
- mes "Oh....!?";
- close;
-
-}
-
-ama_test.gat,50,100,4 script Manager#Momotaro 762,{
-
- if (event_momo >= 4) goto LSecondFin;
- mes "[Manager]";
- mes "Hoho, you did it...... I'm the manager here...... You are not an ordinary person, right? You did very well.";
- next;
- mes "[Manager]";
- mes "The Momotaro from the legend appears in this world!";
- mes "Hohohohoho!";
- next;
- menu "Is there some extra?",L1,"Thanks for nothing......",L2;
-L1:
- mes "[Manager]";
- mes "Hohoho......";
- mes "This is maybe not really recomending......";
- mes "I think in your current condition the small demons can twirl you lightly around their fingers.";
- mes "......Hohoho......";
- next;
- mes "[Manager]";
- mes "......";
- mes "Just a joke.";
- next;
- mes "[Manager]";
- mes "Well then, you enjoyed the Momotaro Event Hall?";
- mes "Talk to the staff member, that you have met first, about our premium presents. He will give you some.";
- next;
- mes "[Manager]";
- mes "Whatever you encounter, never loose that strong spirit!";
- close2;
- set $Momotaro,0;
- set $MomoDokebi,0;
- set $MomoDokebi2,0;
- set $MomotaroRID,0;
- set event_momo,1;
- donpcevent "Event Hall Staff::OnInitCopy";
- warp "amatsu.gat",223,230;
- disablenpc "Manager#Momotaro";
- end;
-L2:
- mes "[Manager]";
- mes "!!!!!";
- mes "......Ho...Hohoho......";
- mes "You are an amusing fellow......";
- mes "Well...... One little suggestion from me to you.";
- next;
- mes "[Manager]";
- mes "Normally I would just kick you out, but...... I would like to see your true capabilities... Hohoho.";
- mes "As if I would look at my own young self. Hohohoho.";
- next;
- mes "[Manager]";
- mes "What do you think? I will give this one nonrecurring chance. It is the challenge of ^3355ffSecond Grade^000000 which is not officially available......";
- mes "But I warn you, this one will be difficult.";
- next;
- menu "Na, it is enough",L2_1,"I take the challenge",L2_2;
-L2_1:
- mes "[Manager]";
- mes "Hoho......";
- mes "You got tired from the last fight?";
- mes "Well, ok...... Did you enjoy the Momotaro Event Hall? Talk to the staff member, that you have met first, about our premium presents. She will give you some.";
- next;
- mes "[Manager]";
- mes "Whatever you encounter, never loose that strong spirit!";
- next;
- set event_momo,2;
- goto LWarpOut;
-L2_2:
- mes "[Manager]";
- mes "Hohoho, You like it more and more, right? This will be the last decisive battle. Show your power without regrets!";
- initnpctimer;
- close;
-OnTimer5000:
- stopnpctimer;
- if(!isloggedin($MomotaroRID)){ donpcevent "#MomotaroTimer::OnCleanUp"; end; }
- attachrid($MomotaroRID);
- monster "ama_test.gat",35,103,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
- monster "ama_test.gat",56,111,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
- monster "ama_test.gat",40,91,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
- misceffect 16;
- set event_momo,3;
- disablenpc "Manager#Momotaro";
- end;
-LSecondFin:
- mes "[Manager]";
- mes "You are really strong... Wasn't it thrilling? Momotaro Event Hall can be really enjoyable, right?";
- mes "Ok now, talk to the staff member, that you have met first, about our premium presents. She will give you some.";
- close2;
- set event_momo,4;
-LWarpOut:
- mes "[Manager]";
- mes "Whatever you encounter, never loose that strong spirit!";
- close2;
- set $Momotaro,0;
- set $MomoDokebi,0;
- set $MomoDokebi2,0;
- set $MomotaroRID,0;
- warp "amatsu.gat",223,230;
- donpcevent "Event Hall Staff::OnInitCopy";
- disablenpc "Manager#Momotaro";
- end;
-OnStart:
- misceffect 215;
- if(!isloggedin($MomotaroRID)){ donpcevent "#MomotaroTimer::OnCleanUp"; end; }
- attachrid($MomotaroRID);
- mes "[Manager]";
- mes "Hohoho......";
- close;
-
-}
-//=======================================MobCount===============================-
-ama_test.gat,0,1,0 script mobcount#momotaro -1,{
-OnMobDead:
- if ($MomoDokebi >= 8){
- areaannounce "ama_test.gat",30,78,68,120,"Dokebi: I will be baaack~~~~!!!",8;
- attachrid($MomotaroRID);
- initnpctimer;
- end;
- }
- set $MomoDokebi,$MomoDokebi+1;
- set @mobrand,rand(4);
- if (@mobrand == 1) goto Lrand1;
- if (@mobrand == 2) goto Lrand2;
- if (@mobrand == 3) goto Lrand3;
-
- areaannounce "ama_test.gat",30,78,68,120,"Dokebi: I'm sorry~~! Waaaaah~~",8;
- end;
-Lrand1:
- areaannounce "ama_test.gat",30,78,68,120,"Dokebi: !! IT'S A RAID!!!! RUN!!",8;
- end;
-Lrand2:
- areaannounce "ama_test.gat",30,78,68,120,"Dokebi: But I didn't even do anything baaaaad~!",8;
- end;
-Lrand3:
- areaannounce "ama_test.gat",30,78,68,120,"Dokebi: Ow, Ouch!!!",8;
- end;
-OnTimer5000:
- donpcevent "mobcount2#momotaro::OnTimer5000";
- end;
-}
-//=======================================MobCount2==============================-
-ama_test.gat,50,101,0 script mobcount2#momotaro -1,{
-OnMobDead:
- if ($MomoDokebi2 == 2) goto Lfin;
- set $MomoDokebi2,$MomoDokebi2+1;
- areaannounce "ama_test.gat",30,78,68,120,"Am Mut: Ow, Ouch!!!",8;end;
-Lfin:
- areaannounce "ama_test.gat",30,78,68,120,"Am Mut: I'm sorry~~! Waaaaah~~",8;
- set event_momo,4;
- initnpctimer;
- end;
-OnTimer5000:
- stopnpctimer;
- enablenpc "Manager#Momotaro";
- donpcevent "Manager#Momotaro::OnStart";
- end;
-
-}
-
-//============================================================
-//====================================================== Sushi
-//====================================================== Quest
-ama_in01.gat,162,17,0 script Iron Chef 765,{
- if (ama_sushi == 1) goto LStart2;
- mes "[ShabuShabu]";
- mes "*Sighs* This is getting worse..";
- mes "Everyday more customers come,";
- mes "but I can never get";
- mes "enough material, even today.";
- mes "A lot of customers surely will be hungry?";
- next;
- mes "[ShabuShabu]";
- mes "*Sigh*, a customer. Welcome.";
- mes "As always, my homemade sashimi";
- mes "focuses on the freshness. What do you need?";
- next;
- menu "I want to buy shrimp sushi",L1,"I want to buy sashimi",L2,"Need some help!",L3,"Keep up the good work",-;
- mes "[ShabuShabu]";
- mes "Alright then, my sashimi";
- mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
- mes "If you have a chance, come try a little sashimi!";
- close;
- L1:
- mes "[ShabuShabu]";
- mes "Alright! How much do you want?";
- mes "Unit price 700 zeny, but if you only want a taste,";
- mes "I'll give you a discount of 74 zeny,";
- mes "If you like the taste come back and find me later.";
- next;
- menu "I want the 700 zeny piece!",L1_1,"I want the 74 zeny sample!",L1_2,"I'll come eat next time",-;
- mes "[ShabuShabu]";
- mes "Alright then, my shrimp sushi";
- mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
- mes "If you have a chance, come try a little sashimi!";
- close;
- L1_1:
- if (Zeny < 700) goto Lzeny;
- set Zeny,Zeny-700;
- getitem 551,10;
- mes "[If you have a chance, come try a little sashimi!]";
- mes "Thank you very much";
- close;
- L1_2:
- if (Zeny < 74) goto Lzeny;
- set Zeny,Zeny-74;
- getitem 551,1;
- mes "[If you have a chance, come try a little sashimi!]";
- mes "Thank you very much";
- close;
- L2:
- mes "[ShabuShabu]";
- mes "Alright! How much do you want?";
- mes "Unit price 350 zeny, but if you only want a taste,";
- mes "I'll just give you a discount of 37 zeny.";
- mes "If you like the taste come back and find me later";
- next;
- menu "I want the 350 zeny piece!",L2_1,"I want the 37 zeny sample",L2_2,"I'll come eat next time",-;
- mes "[ShabuShabu]";
- mes "Alright then, my sashimi";
- mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
- mes "[If you have a chance, come try a little sashimi!]";
- close;
- L2_1:
- if (Zeny < 350) goto Lzeny;
- set Zeny,Zeny-350;
- getitem 544,10;
- mes "[ShabuShabu]";
- mes "Thank you very much";
- close;
- L2_2:
- if (Zeny < 37) goto Lzeny;
- set Zeny,Zeny-37;
- getitem 544,1;
- mes "[ShabuShabu]";
- mes "Thank you very much";
- close;
- Lzeny:
- mes "[ShabuShabu]";
- mes "You don't have enough zeny with you";
- close;
-L3:
- mes "[ShabuShabu]";
- mes "Oh, any help is welcomed!!";
- mes "I was just worrying about not having enough material everyday.";
- mes "Do you want to hear my request?";
- mes "Of course I will pay you to help me.";
- next;
-
- set ama_sushi,1;
- mes "[ShabuShabu]";
- mes "Crab Shell.";
- mes "They are all out. I need them right now.";
- mes "So please find ^0000FF10Crab shells^000000.";
- mes "I can never find it when I need it.";
- mes "I'll be counting on you.";
- next;
- mes "[ShabuShabu]";
- mes "Then, please hurry! I'll be here";
- mes "waiting for you, please don't forget my request!";
- close;
-LStart2:
- if (countitem(964)>=10) goto Lok;
- mes "[ShabuShabu]";
- mes "Man, don't have my materials ready?";
- mes "Oh no, you didn't forget it did you?";
- next;
- mes "[ShabuShabu]";
- mes "^0000FF10Crab shells^000000";
- mes "Don't forget again.";
- mes "You must help me find them!";
- close;
-Lok:
- delitem 964,10;
- getitem 551,20;
- mes "[ShabuShabu]";
- mes "Hmm! Thank you so much";
- next;
- mes "[ShabuShabu]";
- mes "Here is my thanks, take it!";
- set ama_sushi,0;
- close;
-
-}
-
-//============================================================
-//===================================================== Amatsu
-//====================================================== Event
-amatsu.gat,189,166,4 script Kouji 764,{
- mes "[Kuruchi]";
- mes "Lalala Lalala Lalalalalala..";
- mes "Lalala Lalala Lalalalalala..";
- next;
- if (event_amatsu == 2) goto L1;
- if ((event_amatsu == 3) || (event_amatsu == 4)) goto L2;
- if (event_amatsu == 5) goto L3;
- if (event_amatsu == 6) goto L4;
-L0:
- mes "[Kuruchi]";
- mes "Hanging Under the Blue Sky's Blue Roof";
- mes "Shining on Blue Wall's Reflection on the Blue Lake";
- mes "Blue Hearting Containing a Blue Desire";
- mes "Blue, Blue Every thing's Blue";
- next;
- goto LEnd;
-L1:
- mes "[Kuruchi]";
- mes "Monk, Monk, the fox is following me";
- mes "Because I have its favourite food";
- mes "Ramen noodle, my favourite too";
- mes "I can eat it three times a day";
- set event_amatsu,3;
- goto LEnd;
-L2:
- mes "[Kuruchi]";
- mes "Monk, Monk, The Fox Is Following Me";
- mes "Shout At Him To Scare It Off!";
- mes "Voice Too Small So It Didn't Run Off";
- mes "Followed All The Way To North Side's Shrine!";
- set event_amatsu,4;
- goto LEnd;
-L3:
- mes "[Kuruchi]";
- mes "Monk, Monk, The Fox Is Following Me";
- mes "Ramen noodles My Favorite";
- mes "But Now I am No Longer Afraid?";
- mes "I Shouted Loudly To Scare It Off!";
- goto LEnd;
-L4:
- mes "[Kuruchi]";
- mes "The Town's Dock Has An Abandoned Boat!";
- mes "Everyone Forget That In The Ship";
- mes "Is Full Of Treasure And Gold";
- mes "A Boat That Is Feared By Everyone";
- goto LEnd;
-
-LEnd:
- next;
- mes "[Kuruchi]";
- mes "Lalala Lalala Lalalalalala..";
- mes "Lalala Lalala Lalalalalala..";
- close;
-}
-//=====================================================================
-amatsu.gat,171,174,4 script Guard Soldier#01 767,{
- if ((event_amatsu == 0) || (event_amatsu == 1)) goto L0;
- if (event_amatsu == 6) goto L1;
- if (event_amatsu == 7) goto L2;
- mes "[Guard Soldier]";
- mes "This area is where";
- mes "the Master's mother";
- mes "Is here for her treatment.";
- next;
- mes "[Guard Soldier]";
- mes "Although it's not much to talk about...";
- mes "She has been sick here for several months";
- mes "and started to live here";
- close;
-L0:
- mes "[Guard Soldier]";
- mes "This is where the Master's mother stays at.";
- mes "Please keep quiet, we are also";
- mes "very worried watching this everyday";
- next;
- mes "[Guard Soldier]";
- mes "Why does this happen";
- mes "to our benign and wise Master...";
- mes "I don't understand, *sobs*...";
- close;
-L1:
- mes "[Guard Soldier]";
- mes "What? Seems like something";
- mes "flew by... Didn't you see? Oh...";
- mes "And I heard a loud noise... Scared the shit out of me";
- close;
-L2:
- mes "[Guard Soldier]";
- mes "Our master should be alright now.";
- mes "We are also greatly relieved.";
- mes "You have no idea how worried we were... Phew.";
- close;
-}
-//=====================================================================
-amatsu.gat,164,174,4 script Guard Soldier#02 767,{
- if (event_amatsu == 0) goto LOnce;
- if ((event_amatsu >= 2) && (event_amatsu <= 5)) goto L2;
- if (event_amatsu == 6) goto L3;
- if (event_amatsu == 7) goto L4;
- mes "[Guard Soldier]";
- mes "Hopefully she will return healthy soon...";
- mes "The Master has spent a lot of time";
- mes "taking care and worrying about her.";
- close;
-LOnce:
- mes "[Guard Soldier]";
- mes "Do not enter here.";
- mes "This is where the master's mother is";
- mes "recuperating.";
- next;
- mes "[Guard Soldier]";
- mes "Although it's not much to talk about.";
- mes "But she has been sick here for several months";
- mes "and started to live here.";
- set event_amatsu,1;
- close;
-L2:
- mes "[Guard Soldier]";
- mes "If you are invited by the Master...";
- mes "Please do come in.";
- mes "Up till today, many doctors came to diagnose but";
- mes "all their efforts seem futile.";
- close;
-L3:
- mes "[Guard Soldier]";
- mes" Hey!";
- mes" What's that sound!?";
- mes" Where did it come from!?";
- close;
-L4:
- mes "[Guard Soldier]";
- mes "The master's mother still";
- mes "hasn't fully recovered.. ";
- mes "Although, it seems to have turned for the better.";
- mes "But then again..";
- close;
-}
-
-//=====================================================================
-ama_in01.gat,22,111,0 script Old Lady#01 761,{
- if (event_amatsu == 5) goto LStart2;
- if (event_amatsu == 6) goto LStart3;
- if (event_amatsu == 7) goto LStart4;
- mes "[...]";
- mes "^FF6060Clang Clannng! Clang Clannng! Stupid humans again!";
- mes "Clang Clannng, Clang Clannng. Who is it? Is it human!?";
- mes "What do you need here! Hurry up";
- mes "Get out... Clang Clannng! Clang Clannng!^000000";
- next;
- mes "[...]";
- mes "^FF6060I have decided to live here till";
- mes "the Ishida Family line ends!";
- mes "Stop bothering me and get out! Clang Clannng!^000000";
- next;
- warp "amatsu",167,197;
- end;
-LStart2:
- mes "[...]";
- mes "^FF0066Clang Clannng! Clang Clannng! Here comes another one!";
- mes "Stupid Humans! What do you want now";
- mes "Throw me out of here!?^000000";
- next;
- mes "[...]";
- mes "^FF0066Seems like you learned something somewhere,";
- mes "That's about all you can do";
- mes "You can't do anything to me!! Clang Clannng!^000000";
- next;
- menu "HAAAA!!",-;
- set @which,rand(2);
- if (@which == 1) goto Lfail;
- mes "[...]";
- mes "^FF0066Clang Clannng! Clang Clannng! Clang Clannng! This Bastard!";
- mes "He threw me out like this!";
- mes "Sick! Not fair!!^000000";
- next;
- mes "[...]";
- mes "^FF0066That god-damned Ishida that rendered me to this.";
- mes "I'll curse them forever! FOREVER!";
- mes "Human, you better be careful too!^000000";
- next;
- monster "ama_in01.gat",22,112,"Fox",1180,1;
- killmonsterall "ama_in01.gat";
- getitem 1022,1;
- mes "[...]";
- mes "^FF0066Everything that Paul Shinaku did";
- mes "will sooner or later";
- mes "Bring about my downfall...^000000";
- mes "^CC3300Clangggggggggggg!!^000000";
- set event_amatsu,6;
- close;
-Lfail:
- mes "[...]";
- mes "^FF0066Clang Clannng! Haha! Clang Clannng! Hahahaha!";
- mes "How dare you, wanting to throw me out!";
- mes "Get out of here!! Clang Clannng!^000000";
- next;
- warp "amatsu",167,197;
- end;
-LStart3:
- mes "[Ishida Sauk]";
- mes "...*Sigh* Where from young man...?";
- mes "Did you get rid of the fox?";
- mes "Somehow I feel so tired, *sigh*...";
- next;
- mes "[Ishida Sauk]";
- mes "Thank you. Coming from another place";
- mes "and still has to endure through this.";
- mes "Very sorry... Sorry...";
- next;
- mes "[Ishida Sauk]";
- mes "I need to find my son.";
- mes "Tell him that I got rid of the fox...";
- mes "Thank you.";
- next;
- mes "[Ishida Sauk]";
- mes "Now I am getting very tired.";
- mes "I need to rest now, young man.....";
- mes "Go find my son...";
- close;
-LStart4:
- mes "[Ishida Sauk]";
- mes "Oh, You are the you man who";
- mes "got rid of the fox... welcome.";
- mes "Sit here a while if you can...";
- next;
- mes "[Ishida Sauk]";
- mes "To be possessed by that fox...";
- mes "It is all my own fault...";
- mes "I didn't teach my child properly... *sigh*";
- mes "He was a good kid when he was small.";
- mes "It's all because I wasn't strict enough...";
- next;
- mes "[Ishida Sauk]";
- mes "Originally this town was small.";
- mes "Without a castle of this size either.";
- mes "But, my son got some zeny somehow";
- mes "and just start bringing them to me.";
- mes "Don't know what he did to get this zeny.";
- mes "And has to hide the truth from even me...";
- next;
- mes "[Ishida Sauk]";
- mes "Then starting building on the castle and town,";
- mes "and treated the townspeople fairly and nicely...";
- mes "If that was all, then there will be no problem.";
- mes "The problem came after he did some strange things...";
- next;
- mes "[Ishida Sauk]";
- mes "Yea, he angered the gods";
- mes "learning some weird spells somewhere.";
- mes "And started doing experimenting,";
- mes "Capturing the monsters,";
- mes "Doing bad things...";
- next;
- mes "[Ishida Sauk]";
- mes "And now, the monsters";
- mes "started to live in Amatsu...";
- mes "The gods became so angry even ";
- mes "the monks from the shrine";
- mes "don't know what to do.....";
- next;
- mes "[Ishida Sauk]";
- mes "They punished me as well...";
- mes "and sent a fox here, ";
- mes "hoping to give a warning,";
- mes "but my son didn't stop.";
- next;
- mes "[Ishida Sauk]";
- mes "If possible please stop my son.";
- mes "I am old and almost dead.";
- mes "I don't know what to do either...";
- mes "Please guard this peaceful town.";
- mes "I don't know what my son is smoking";
- mes "doing that kind of stuff...";
- close;
-}
-//=====================================================================
-ama_in02.gat,170,62,4 script Soldier#02 767,{
- mes "[Kyro]";
- mes "My name is Kyro. In this town";
- mes "I handle all the administrative work.";
- mes "What type of service do you need?";
- next;
- menu "Please give me a pass",-,"I want to live here",L2,"Nothing",L3;
-
- if (event_amatsu == 7) goto L1_1;
- mes "[Kyro]";
- mes "The master said that the guests from the continent";
- mes "can move about freely,";
- mes "Without any";
- mes "permits or passes.";
- close;
-L1_1:
- if (countitem(7160) == 0) goto L1_2;
- mes "[Kyro]";
- mes "I have already given you a pass.";
- close;
-L1_2:
- mes "[Kyro]";
- mes "Did you lose the pass?";
- mes "If you want another pass";
- mes "you need to pay 10,000 zeny for registration fees.";
- next;
- menu "Get the pass",L1_2_1,"Maybe next time",-;
- mes "No problem!";
- mes "If you need anything please come talk to me again!";
- close;
-L1_2_1:
- if (Zeny < 10000) goto LError;
- set Zeny,Zeny-10000;
- getitem 7160,1;
- mes "[Kyro]";
- mes "Come, this is it.";
- mes "Please be careful and don't lose it again.";
- close;
-LError:
- mes "[Kyro]";
- mes "You don't have enough zeny!";
- close;
-L2:
- mes "[Kyro]";
- mes "This will be difficult, you can";
- mes "freely move around, but the master";
- mes "hasn't considered anything about immigration.";
- mes "But, you can stay as long as you want";
- close;
-L3:
- mes "[Kyro]";
- mes "Then that's it for now...";
- mes "If there's anything else just tell me.";
- close;
-
-}
-
-//=====================================================================
-ama_in02.gat,115,177,7 script Juro 767,{
- mes "[Juro]";
- mes "What are you here for?";
- mes "There is nothing much over here.";
- next;
- menu "Oh, really",-,"Please open the door for me",L2;
-
- mes "[Juro]";
- mes "The town has much more stuff.";
- mes "Have a wonderful time...";
- close;
-L2:
- if (event_amatsu != 7) goto Lnoflag;
- if (countitem(7160) < 1) goto Llost;
- mes "[Juro]";
- mes "You already got the pass...";
- mes "Do you want to go in directly? Or";
- mes "Do you want me to explain first...?";
- next;
- menu "Direct access",-,"Listen to explanation",L2_2;
-
- mes "[Juro]";
- mes "Then, I will open the door for you.";
- mes "Please take care...";
- next;
- warp "ama_dun01.gat",229,10;
- end;
-L2_2:
- mes "[Juro]";
- mes "The inner space seems to be ";
- mes "protected by special spells.";
- mes "Those who wander in carelessly,";
- mes "become lost and will be assaulted";
- mes "mysteriously and die.";
- next;
- mes "[Juro]";
- mes "What I can tell you";
- mes "isn't all that much.";
- mes "I have not been inside.";
- mes "It's a mysterious place, its only proof is";
- mes "of existence is from the";
- mes "survivors that ventured inside";
- next;
- mes "[Juro]";
- mes "First of all.....";
- mes "'Don't believe in what you see.'";
- next;
- mes "[Juro]";
- mes "Second of all.....";
- mes "About the spells, they have their own rules.";
- mes "Everything has its own purpose,";
- mes "including the spells.";
- mes "Will you find some";
- mes "answers?";
- next;
- mes "[Juro]";
- mes "Then, I'll open the door for you.";
- mes "Please be careful...";
- next;
- warp "ama_dun01.gat",229,10;
- end;
-Llost:
- mes "[Juro]";
- mes "You don't have the pass";
- mes "so I cannot open the gate for you.";
- mes "Please understand.";
- close;
-Lnoflag:
- mes "[Juro]";
- mes "What door are you talking about?";
- mes "In a place like this there won't";
- mes "be any doors as far as I know.";
- mes "You might have been mistaken.";
- next;
- mes "[Juro]";
- mes "There are more to see in town.";
- mes "I hope you have a good time...";
- close;
-}
-ama_dun01.gat,229,7,0 script Soldier#08 767,{
- mes "[Juro]";
- mes "Ready to leave?";
- next;
- menu "Leave",-,"Wait a little more",L1;
- mes "[Juro]";
- mes "Gogo!!";
- next;
- warp "ama_in02.gat",119,181;
- end;
-L1:
- mes "[Juro]";
- mes "Take care of yourself!";
- close;
-}
-
-//=====================================================================
-ama_in02.gat,200,176,4 script Castle Owner 768,{
- if (event_amatsu == 1) goto LStart2;
- if ((event_amatsu >= 2) && (event_amatsu <=5)) goto LStart3;
- if (event_amatsu == 6) goto LStart4;
- if (event_amatsu == 7) goto LStart5;
- mes "[Ishida Yoshinake]";
- mes "What! An outsider?";
- mes "What do you need me for?? If it's nothing important";
- mes "Talk to you later...!";
- next;
- mes "[Ishida Yoshinake]";
- mes "Please leave! No matter who you are!!";
- mes "Right now I am in a VERY bad mood!";
- close;
-LStart2:
- mes "[Ishida Yoshinaku]";
- mes "What! A visitor...? Oh, sorry";
- mes "But today I am not in the mood";
- mes "of seeing a visitor!";
- next;
- menu "I heard your mother is sick...",L1,"What a beautiful castle",L2,"Who are you?",L3;
-L1:
- mes "[Ishida Yoshinaku]";
- mes "Oh... You are an expert pathologist?";
- mes "Oh yea, if you are a foreign expert";
- mes "I should be able to trust you...";
- mes "I guess...";
- next;
- mes "[Ishida Yoshinaku]";
- mes "Welcome, as you know";
- mes "I am the owner of the East Lake Castle";
- mes "My name is Ishida Yoshinaku,";
- mes "Nice to meet you.";
- next;
- mes "[Ishida Yoshinaku]";
- mes "To put it simple: my mother";
- mes "is not very healthy,";
- mes "of course you are here because of it";
- mes "Can you cure my ailing mother??";
- next;
- mes "[Ishida Yoshinaku]";
- mes "So many famous and talented";
- mes "Doctors has visited her already,";
- mes "But not only did they not cure her!!";
- mes "They worsened her condition!!";
- mes "so I kept feeling disappointed";
- next;
- mes "[Ishida Yoshinaku]";
- mes "You, being a foreign expert,";
- mes "may cure my mother's sickness!";
- mes "if you do, I will give you lots of zeny and rewards...";
- next;
- mes "[Ishida Yoshinaku]";
- mes "Please help her,";
- mes "my mother lives in the mansion outside of the castle,";
- mes "After you cure her";
- mes "Come see me again";
- set event_amatsu,2;
- close;
-L2:
- mes "[Ishida Yoshinaku]";
- mes "Yes! Beautiful indeed! So what";
- mes "Do you want to do! Leave when you get";
- mes "bored of it! Man!";
- next;
- mes "[Ishida Yoshinaku]";
- mes "At a pressing time like this... *Sobs*...";
- mes "Leave when you become satisfied or bored!";
- close;
-L3:
- mes "[Ishida Yoshinaku]";
- mes "...Talking about me? You don't know? Eh?";
- mes "I am this castle's master!";
- mes "Go ask around the soldiers outside";
- mes "If you are not sure!";
- next;
- mes "[if you are not sure]";
- mes "At a pressing time like this... *Sobs*...";
- mes "Leave when you become satisfied or bored!";
- close;
-LStart3:
- mes "[Ishida Yushinaku]";
- mes "How is my mother?";
- mes "If you know the name of the sickness....";
- mes "Please tell me immediately...";
- mes "Argh... So worried!";
- mes "I can't sleep at night any longer!";
- next;
- mes "[Ishida Yushinaku]";
- mes "You are from the other continents,";
- mes "so you must know....";
- mes "now you are the only one I can trust";
- close;
-LStart4:
- mes "[Ishida Yushinaku]";
- mes "WoW, you are great, I heard";
- mes "My mother is getting better already,";
- mes "Anyway, what sickness was it?";
- next;
- mes "[Ishida Yushinaku]";
- mes "Fox? The fox is the reason? ho...";
- mes "So it's not a sickness after all...!!";
- mes "Why didn't I think of it earlier!!!";
- next;
- mes "[Ishida Yushinaku]";
- mes "Damn fox, after it ran away,";
- mes "it tried to revenge like this...";
- mes "But now there is no other";
- mes "Way... hahaha! Hahahaha!";
- next;
- mes "[Ishida Yushinaku]";
- mes "Um, hmm, umm...";
- next;
- mes "[Ishida Yushinaku]";
- mes "Anyway, Thanks for your help!";
- mes "I think my mother will return to normal now...";
- mes "I want to show you my gratitude...";
- mes "What to do...";
- next;
- mes "[Ishida Yushinaku]";
- mes "Alright, I will give you this pass.";
- mes "As long as you have this pass,";
- mes "you can get into ANYWHERE";
- mes "In this town";
- next;
- set event_amatsu,7;
- getitem 7160,1;
- mes "[Ishida Yushinaku]";
- mes "Although it's not such a great gift, but";
- mes "I believe you will have use for it someday...";
- mes "talk to 'Juro' For the details";
- close;
-LStart5:
- mes "[Ishida Yushinaku]";
- mes "Hey... I hope you have a";
- mes "good time in Amatsu.....";
- mes "We always welcome the foreigners!";
- close;
-}
-
-ama_in01.gat,180,173,2 script Fox Mask 762,{
- if (event_amatsu == 4) goto LStart2;
- if (event_amatsu == 5) goto LStart3;
- mes "[Takikuwi]";
- mes "Hiya, outsider, this";
- mes "Shrine is left by a monk a long time ago.";
- mes "Sometimes I come here to play";
- mes "along with my friend Tokari";
- next;
- mes "[Takikuwi]";
- mes "If you are here to hide from the monsters,";
- mes "please do come in, no monsters";
- mes "can ever come in here!";
- mes "You can always take a short rest in here!";
- close;
-LStart2:
- mes "[Takikuwi]";
- mes "Hiya, outsider, here to find me?";
- mes "Because of the fox bothering you?";
- mes "From your expression You seem to";
- mes "have had quite a bit of trouble";
- next;
- mes "[Takikuwi]";
- mes "Although usually the head monk";
- mes "should come to help himself, this shrine";
- mes "Has been deserted for a long time";
- next;
- mes "[Takikuwi]";
- mes "It is very hard to get rid of a fox in a person's body";
- mes "If there's alcohol and ramen noodle,";
- mes "It might be a little easier,";
- mes "But they are hard to find!";
- next;
- mes "[Takikuwi]";
- mes "Good thing I know quite a bit";
- mes "about the fox, I'll tell you";
- mes "some words of advice, although foxes";
- mes "are very tricky, and although they like to";
- mes "make fun of humans... but it is seldom";
- mes "for a fox to display hatred!";
- next;
- mes "[Takikuwi]";
- mes "In another word, if there is hatred";
- mes "human also did something wrong!!";
- mes "Which will hurt self,";
- mes "And sometimes unlucky things happen";
- mes "and to friend and family as well!";
- next;
- mes "[Takikuwi]";
- mes "Anyway, I've heard that when";
- mes "there's a strong animal then a fox will chased,";
- mes "away from the human.";
- mes "So try hard, and try summoning the animal spirit!";
- next;
- menu "Haaaa!!",-;
- mes "[Takikuwi]";
- mes "Very good, just repeating it will";
- mes "show the fox a strong spirit,";
- mes "and show results, but the best thing is";
- mes "to find out why the fox will enter the";
- mes "person's body, but if you do this";
- mes "it should help, more or less";
- set event_amatsu,5;
- close;
-LStart3:
- mes "[Takikuwi]";
- mes "Don't forget, when you try summoning";
- mes "you must think about!";
- mes "A monster that is stronger than a fox";
- mes "or it would just be a futile effort!";
- mes "Remember....... Stronger than a fox....";
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Amatsu
+//===== By: ==================================================
+//= eAthena team & others? & MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Momotaro event, Sushi Quest, Amatsu Event
+//===== Additional Comments: =================================
+//= 1.0 Rewrote parts of other/momotaro.txt to make it work.
+//= I'm sorry for the mess, I couldn't do much better with
+//= the current code I had.
+//= 1.1 Added Sushi Quest and Amatsu Event from cities/ [Evera]
+//= 1.2 Fixed Momotaro Quest, thanks to .~Abism0~. [Lupus]
+//============================================================
+
+amatsu.gat,223,235,4 script Publisher 763,{
+ if (event_momo > 4) goto Lfin;
+ if ((event_momo >= 1) && (event_momo <= 4)) goto Lget;
+ mes "[Publisher]";
+ mes "Hello~~!!";
+ mes "Our ^00B6FFScroll Publishing Company^000000";
+ mes "is professionally publishing";
+ mes "tales.";
+ next;
+ mes "[Publisher]";
+ mes "We established";
+ mes "^3366FFMomotaro Field Trip^000000";
+ mes "to celebrate ^00B6FF<Momotaro Story>^000000";
+ mes "selling over a million copies.";
+ next;
+ mes "[Publisher]";
+ mes "Become Momotaro and eliminate";
+ mes "Dokebis, just like in the story!";
+ mes "There will also be rewards.";
+ next;
+ menu "What is Momotaro Story?!",-,"I want to try!",L1,"I'm busy right now...",L2;
+ mes "[Publisher]";
+ mes "Eh~!? How can you not know about";
+ mes "Momotaro? Don't they have this";
+ mes "tale in Rune-Midgard?? Well...";
+ mes "Let me tell you the story.";
+ next;
+ mes "[Publisher]";
+ mes "Long ago, there lived an old";
+ mes "married couple. They were happy,";
+ mes "but didn't have any children.";
+ next;
+ mes "[Publisher]";
+ mes "One day, while old lady was doing";
+ mes "the laundry, she found a humongous";
+ mes "peach. She cut it in half and...";
+ mes "'Poof!' There was a baby inside!";
+ next;
+ mes "[Publisher]";
+ mes "The old man and lady were shocked.";
+ mes "They decided to adopt that baby,";
+ mes "and give him their love...";
+ next;
+ mes "[Publisher]";
+ mes "That baby grew so fast, like that";
+ mes "beanstalk from 'Jack and";
+ mes "Beanstalk' and became a strong boy";
+ mes "in only a few days.";
+ next;
+ mes "[Publisher]";
+ mes "That's boy's name was...";
+ mes "<Momotaro>!!!";
+ mes "Momotaro traveled to eliminate";
+ mes "dokebis that were harassing";
+ mes "the towners.";
+ next;
+ mes "[Publisher]";
+ mes "He became friends with";
+ mes "^3151FFYoyo, Picky, and Desert Wolf^000000";
+ mes "and eliminated all of the Dokebis.";
+ mes "then he lived happily ever after";
+ mes "with the old couple.";
+ next;
+ mes "[Publisher]";
+ mes "How was it?";
+ mes "Great, right?";
+ mes "I mean, this story sold a million";
+ mes "copies!";
+ close;
+L1:
+ mes "[Publisher]";
+ mes "Yay-! You look excited!";
+ mes "You'll be ready to go soon.";
+ mes "Please fill out this registration";
+ mes "card.";
+ next;
+ mes "[Publisher]";
+ mes ".................";
+ mes "......Mm.....Let's see.....";
+ mes ".............Good!";
+ mes "Alright, then!";
+ mes "Let it begin~~~!!!!!!!!!";
+ mes "<Momotaro Field Trip>~!";
+ close2;
+ warp "ama_test",52,35;
+ end;
+L2:
+ mes "[Publisher]";
+ mes "Eh?";
+ mes "...But there are sweet rewards";
+ mes "waiting...";
+ close;
+Lget:
+ mes "[Publisher]";
+ mes "How was it? Did you enjoy the event?";
+ mes "I hope the arrangements at the event hall allowed you to spend an enjoyable time there.";
+ next;
+ if (event_momo > 1 && event_momo < 4)
+ {
+ switch(rand(1,24))
+ {
+
+ case 1:
+ getitem 627,1; //sweet milk
+ break;
+
+ case 2:
+ getitem 629,1; //singing flower
+ break;
+
+ case 3:
+ getitem 625,1; //rusty iron
+ break;
+
+ case 4:
+ getitem 619,1; //unripe apple
+ break;
+
+ case 5:
+ getitem 620,1; //orange juice
+ break;
+
+ case 6:
+ getitem 621,1; //bitter herb
+ break;
+
+ case 7:
+ getitem 622,1; //rainbow carrot
+ break;
+
+ case 8:
+ getitem 623,1; //earthworm the dude
+ break;
+
+ case 9:
+ getitem 624,1; //rotten fish
+ break;
+
+ case 10:
+ getitem 626,1; //monster juice
+ break;
+
+ case 11:
+ getitem 628,1; //well-dried bone
+ break;
+
+ case 12:
+ getitem 630,1; //dew laden moss
+ break;
+
+ case 13:
+ getitem 631,1; //deadly noxious herb
+ break;
+
+ case 14:
+ getitem 632,1; //fatty chubby earthworm
+ break;
+
+ case 15:
+ getitem 633,1; //sweet potato
+ break;
+
+ case 16:
+ getitem 634,1; //tropical banana
+ break;
+
+ case 17:
+ getitem 635,1; //orc trophy
+ break;
+
+ case 18:
+ getitem 636,1; //no recipient
+ break;
+
+ case 19:
+ getitem 637,1; //old broom
+ break;
+
+ case 20:
+ getitem 638,1; //silver knife of chastity
+ break;
+
+ case 21:
+ getitem 639,1; //armlet of obedience
+ break;
+
+ case 22:
+ getitem 640,1; //shining stone
+ break;
+
+ case 23:
+ getitem 641,1; //contract in shadow
+ break;
+
+ case 24:
+ getitem 642,1; //book of the devil
+ break;
+
+ }
+ }
+//Am Mut successful finish unknown
+ if (event_momo == 4)
+ {
+ while(@i != 3)
+ {
+ switch(rand(1,24))
+ {
+
+ case 1:
+ getitem 627,1; //sweet milk
+ break;
+
+ case 2:
+ getitem 629,1; //singing flower
+ break;
+
+ case 3:
+ getitem 625,1; //rusty iron
+ break;
+
+ case 4:
+ getitem 619,1; //unripe apple
+ break;
+
+ case 5:
+ getitem 620,1; //orange juice
+ break;
+
+ case 6:
+ getitem 621,1; //bitter herb
+ break;
+
+ case 7:
+ getitem 622,1; //rainbow carrot
+ break;
+
+ case 8:
+ getitem 623,1; //earthworm the dude
+ break;
+
+ case 9:
+ getitem 624,1; //rotten fish
+ break;
+
+ case 10:
+ getitem 626,1; //monster juice
+ break;
+
+ case 11:
+ getitem 628,1; //well-dried bone
+ break;
+
+ case 12:
+ getitem 630,1; //dew laden moss
+ break;
+
+ case 13:
+ getitem 631,1; //deadly noxious herb
+ break;
+
+ case 14:
+ getitem 632,1; //fatty chubby earthworm
+ break;
+
+ case 15:
+ getitem 633,1; //sweet potato
+ break;
+
+ case 16:
+ getitem 634,1; //tropical banana
+ break;
+
+ case 17:
+ getitem 635,1; //orc trophy
+ break;
+
+ case 18:
+ getitem 636,1; //no recipient
+ break;
+
+ case 19:
+ getitem 637,1; //old broom
+ break;
+
+ case 20:
+ getitem 638,1; //silver knife of chastity
+ break;
+
+ case 21:
+ getitem 639,1; //armlet of obedience
+ break;
+
+ case 22:
+ getitem 640,1; //shining stone
+ break;
+
+ case 23:
+ getitem 641,1; //contract in shadow
+ break;
+
+ case 24:
+ getitem 642,1; //book of the devil
+ break;
+
+ }
+ set @i,@i+1;
+ }
+ }
+ set event_momo,5;
+ mes "[Publisher]";
+ mes "Well then, I will give you a small present which I have prepared.";
+ mes "May the legend be widely loved also in the future......";
+ close;
+Lfin:
+ mes "[Publisher]";
+ mes "We have a nice weather today, don't we...... It is a perfect day to dry the futon.";
+ close;
+}
+//=====================================================================
+ama_test.gat,50,44,4 script Event Hall Staff 109,{
+ mes "[Satoshi]";
+ mes "Welcome to <Momotaro Field Trip>";
+ next;
+ mes "[Satoshi]";
+ mes "I'm Satoshi who is in charge of the";
+ mes "waiting room in <Momotaro Field";
+ mes "Trip>.";
+ next;
+ mes "[Satoshi]";
+ mes "Originally, I was working for the";
+ mes "publishing company, but we lacked";
+ mes "workers for the Field Trip...";
+ mes "But working here is much better!";
+ mes "Now I just watch people trying to";
+ mes "accomplish the mission. Heh hehe~";
+ next;
+ mes "[Satoshi]";
+ mes "..............";
+ mes "Just kidding";
+ mes "^111111*Wipes away sweat*^000000";
+ next;
+ mes "[Satoshi]";
+ mes "Well, let me explain";
+ mes "about the rules in the Field Trip";
+ next;
+ mes "[Satoshi]";
+ mes "First of all...Did you hear";
+ mes "about the story from the";
+ mes "publisher?";
+ next;
+ menu "Yes",L1,"No",-;
+ mes "[Satoshi]";
+ mes "Eh? You can't just";
+ mes "skip the story";
+ mes "when you enter the field";
+ mes "trip! I can't allow you to";
+ mes "do that as a Momotaro's";
+ mes "fan!!!";
+ next;
+ mes "[Satoshi]";
+ mes "Please listen to the story";
+ mes "from the publisher.";
+ mes "Thank you.";
+ mes "Bye~~";
+ close2;
+ warp "amatsu.gat",223,230;
+ end;
+L1:
+ mes "[Satoshi]";
+ mes "Hehe...Good.";
+ mes "Momotoro's Story is our";
+ mes "pride. It's the best story EVER.";
+ mes "Hahaha!!!";
+ next;
+ mes "[Satoshi]";
+ mes "...Hmmhmm.";
+ next;
+ mes "[Satoshi]";
+ mes "The Field Trip is simple.";
+ mes "Go inside and eliminate";
+ mes "Dokebis bravely!!!";
+ mes "Just like Momotaro!!!";
+ mes "Understand? Bravely!!!";
+ next;
+ mes "[Satoshi]";
+ mes "In addition, there are three";
+ mes "things you need to know.";
+ next;
+ mes "[Satoshi]";
+ mes "First....";
+ mes "You can't come back once you clear";
+ mes "the field trip. Keep that in mind.";
+ next;
+ mes "[Satoshi]";
+ mes "Secondly...";
+ mes "Q-pet is prohibited";
+ mes "inside of the field trip.";
+ mes "if you are with a pet,";
+ mes "please change it to egg status.";
+ next;
+ mes "[Satoshi]";
+ mes "And finally...";
+ mes "One person can be on the";
+ mes "field trip for 6 minutes.";
+ next;
+ mes "[Satoshi]";
+ mes "Well then, Please";
+ mes "wait for you turn";
+ mes "in the waitiSng room.";
+ mes "Good luck in fighting!!";
+ close;
+OnInit:
+ waitingroom "Event Hall Waiting Room",1,"Event Hall Staff::OnMax";
+OnInitCopy:
+ enablewaitingroomevent "Event Hall Staff";
+ areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
+ disablenpc "Manager#Momotaro";
+ enablenpc "Grandpa#Momotaro";
+ enablenpc "Grandma#Momotaro";
+ donpcevent "#MomotaroTimer::OnStopTimer";
+ killmonsterall "ama_test.gat";
+ end;
+OnMax:
+ warpwaitingpc "ama_test.gat",51,85;
+ disablewaitingroomevent "Event Hall Staff";
+ disablenpc "Manager#Momotaro";
+ enablenpc "Grandpa#Momotaro";
+ enablenpc "Grandma#Momotaro";
+ donpcevent "#MomotaroActivator::OnMomoInit";
+ end;
+}
+
+ama_test.gat,1,1,0 script #MomotaroTimer -1,{
+OnStartTimer:
+ initnpctimer;
+ end;
+OnTimer180000:
+ if(!isloggedin($MomotaroRID))goto s_Cleanup;
+ mapannounce "ama_test.gat","Timer: 3 Minutes left.",8;
+ end;
+OnTimer300000:
+ if(!isloggedin($MomotaroRID))goto s_Cleanup;
+ mapannounce "ama_test.gat","Timer: 1 Minute left.",8;
+ end;
+OnTimer360000:
+ if(!isloggedin($MomotaroRID))goto s_Cleanup;
+ mapannounce "ama_test.gat","Timer: Beep- Beep- Beep- Time's up.",8;
+OnTimer362500:
+ areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
+ goto s_Cleanup;
+
+
+OnTimer20000:
+OnTimer40000:
+OnTimer60000:
+OnTimer80000:
+OnTimer100000:
+OnTimer120000:
+OnTimer140000:
+OnTimer160000:
+OnTimer200000:
+OnTimer220000:
+OnTimer240000:
+OnTimer260000:
+OnTimer280000:
+OnTimer320000:
+OnTimer340000:
+ if(!isloggedin($MomotaroRID))goto s_Cleanup;
+ end;
+
+OnCleanUp:
+s_Cleanup:
+ stopnpctimer;
+ set $Momotaro,0;
+ set $MomoDokebi,0;
+ set $MomoDokebi2,0;
+ set $MomotaroRID,0;
+ mapannounce "ama_test.gat","The current player has exited. The waiting room will now open again.",8;
+ disablenpc "Manager#Momotaro";
+ donpcevent "Event Hall Staff::OnInitCopy";
+ end;
+
+OnStopTimer:
+ stopnpctimer;
+ end;
+
+}
+
+ama_test.gat,51,85,0 script #MomotaroActivator 139,1,1,{
+ if($Momotaro)end;
+ set $Momotaro,1;
+ set $MomotaroRID,getcharid(3);
+ areaannounce "ama_test.gat",30,78,68,120,"Timer: The Timer has been activated. You have 6 minutes. Annihilate the monsters in time!",8;
+ donpcevent "#MomotaroTimer::OnStartTimer";
+ mes "[Grandpa]";
+ mes "Arrrk!!!";
+ next;
+ mes "[Grandma]";
+ mes "Honey!! Someone hacked my account";
+ mes "and stole my equipment!!";
+ next;
+ mes "[Grandpa]";
+ mes "Hmm. The Chief said the Dokebi";
+ mes "earned 20 million zeny by hacking";
+ mes "other's accounts...";
+ next;
+ mes "[Grandma]";
+ mes "Dohhhhhhh!!!!";
+ next;
+ mes "[Grandpa]";
+ mes "...Huh I've heard that somewhere";
+ mes "before....";
+ next;
+ mes "[Grandpa]";
+ mes "Anyway, Momotaro...";
+ next;
+ mes "[Grandpa]";
+ mes "As you know, since we towners spends";
+ mes "our time sitting and chatting,";
+ mes "we can't kill Dokebis because we're";
+ mes "low levels, so...Please do it for";
+ mes "us.";
+ next;
+ mes "[Grandma]";
+ mes "Momotaro...";
+ mes "I really wanted to give you";
+ mes "a handmade ^3151FFYummiest Red Poiton in";
+ mes "the whole world^000000 ...but...";
+ mes ".....I failed to make them ....";
+ next;
+ mes "[Grandma]";
+ mes "...I'm sorry. I should have been";
+ mes "leveling up before...^111111*Sob*";
+ next;
+ mes "[Grandma & Grandpa]";
+ mes "So...Do me this favor, kid~";
+ close2;
+ initnpctimer;
+ end;
+
+OnTimer5000:
+ stopnpctimer;
+ set $MomoDokebi,0;
+ set $MomoDokebi2,0;
+ disablenpc "Grandpa#Momotaro";
+ disablenpc "Grandma#Momotaro";
+ monster "ama_test.gat",47,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",51,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",55,101,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",55,97,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",55,93,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",53,91,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",49,91,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",45,96,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ monster "ama_test.gat",45,99,"Dokebi",1110,1,"mobcount#momotaro::OnMobDead";
+ end;
+
+OnInit:
+ set $Momotaro,0;
+ set $MomoDokebi,0;
+ set $MomoDokebi2,0;
+ set $MomotaroRID,0;
+ end;
+
+}
+
+ama_test.gat,49,95,4 script Grandpa#Momotaro 766,{
+
+ mes "[Grandpa]";
+ mes "Zzzzzz......";
+ close;
+}
+
+ama_test.gat,51,95,4 script Grandma#Momotaro 761,{
+
+ mes "[Grandma]";
+ mes "Oh....!?";
+ close;
+
+}
+
+ama_test.gat,50,100,4 script Manager#Momotaro 762,{
+
+ if (event_momo >= 4) goto LSecondFin;
+ mes "[Manager]";
+ mes "Hoho, you did it...... I'm the manager here...... You are not an ordinary person, right? You did very well.";
+ next;
+ mes "[Manager]";
+ mes "The Momotaro from the legend appears in this world!";
+ mes "Hohohohoho!";
+ next;
+ menu "Is there some extra?",L1,"Thanks for nothing......",L2;
+L1:
+ mes "[Manager]";
+ mes "Hohoho......";
+ mes "This is maybe not really recomending......";
+ mes "I think in your current condition the small demons can twirl you lightly around their fingers.";
+ mes "......Hohoho......";
+ next;
+ mes "[Manager]";
+ mes "......";
+ mes "Just a joke.";
+ next;
+ mes "[Manager]";
+ mes "Well then, you enjoyed the Momotaro Event Hall?";
+ mes "Talk to the staff member, that you have met first, about our premium presents. He will give you some.";
+ next;
+ mes "[Manager]";
+ mes "Whatever you encounter, never loose that strong spirit!";
+ close2;
+ set $Momotaro,0;
+ set $MomoDokebi,0;
+ set $MomoDokebi2,0;
+ set $MomotaroRID,0;
+ set event_momo,1;
+ donpcevent "Event Hall Staff::OnInitCopy";
+ warp "amatsu.gat",223,230;
+ disablenpc "Manager#Momotaro";
+ end;
+L2:
+ mes "[Manager]";
+ mes "!!!!!";
+ mes "......Ho...Hohoho......";
+ mes "You are an amusing fellow......";
+ mes "Well...... One little suggestion from me to you.";
+ next;
+ mes "[Manager]";
+ mes "Normally I would just kick you out, but...... I would like to see your true capabilities... Hohoho.";
+ mes "As if I would look at my own young self. Hohohoho.";
+ next;
+ mes "[Manager]";
+ mes "What do you think? I will give this one nonrecurring chance. It is the challenge of ^3355ffSecond Grade^000000 which is not officially available......";
+ mes "But I warn you, this one will be difficult.";
+ next;
+ menu "Na, it is enough",L2_1,"I take the challenge",L2_2;
+L2_1:
+ mes "[Manager]";
+ mes "Hoho......";
+ mes "You got tired from the last fight?";
+ mes "Well, ok...... Did you enjoy the Momotaro Event Hall? Talk to the staff member, that you have met first, about our premium presents. She will give you some.";
+ next;
+ mes "[Manager]";
+ mes "Whatever you encounter, never loose that strong spirit!";
+ next;
+ set event_momo,2;
+ goto LWarpOut;
+L2_2:
+ mes "[Manager]";
+ mes "Hohoho, You like it more and more, right? This will be the last decisive battle. Show your power without regrets!";
+ initnpctimer;
+ close;
+OnTimer5000:
+ stopnpctimer;
+ if(!isloggedin($MomotaroRID)){ donpcevent "#MomotaroTimer::OnCleanUp"; end; }
+ attachrid($MomotaroRID);
+ monster "ama_test.gat",35,103,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
+ monster "ama_test.gat",56,111,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
+ monster "ama_test.gat",40,91,"Am Mut",1301,1,"mobcount2#momotaro::OnMobDead";
+ misceffect 16;
+ set event_momo,3;
+ disablenpc "Manager#Momotaro";
+ end;
+LSecondFin:
+ mes "[Manager]";
+ mes "You are really strong... Wasn't it thrilling? Momotaro Event Hall can be really enjoyable, right?";
+ mes "Ok now, talk to the staff member, that you have met first, about our premium presents. She will give you some.";
+ close2;
+ set event_momo,4;
+LWarpOut:
+ mes "[Manager]";
+ mes "Whatever you encounter, never loose that strong spirit!";
+ close2;
+ set $Momotaro,0;
+ set $MomoDokebi,0;
+ set $MomoDokebi2,0;
+ set $MomotaroRID,0;
+ warp "amatsu.gat",223,230;
+ donpcevent "Event Hall Staff::OnInitCopy";
+ disablenpc "Manager#Momotaro";
+ end;
+OnStart:
+ misceffect 215;
+ if(!isloggedin($MomotaroRID)){ donpcevent "#MomotaroTimer::OnCleanUp"; end; }
+ attachrid($MomotaroRID);
+ mes "[Manager]";
+ mes "Hohoho......";
+ close;
+
+}
+//=======================================MobCount===============================-
+ama_test.gat,0,1,0 script mobcount#momotaro -1,{
+OnMobDead:
+ if ($MomoDokebi >= 8){
+ areaannounce "ama_test.gat",30,78,68,120,"Dokebi: I will be baaack~~~~!!!",8;
+ attachrid($MomotaroRID);
+ initnpctimer;
+ end;
+ }
+ set $MomoDokebi,$MomoDokebi+1;
+ set @mobrand,rand(4);
+ if (@mobrand == 1) goto Lrand1;
+ if (@mobrand == 2) goto Lrand2;
+ if (@mobrand == 3) goto Lrand3;
+
+ areaannounce "ama_test.gat",30,78,68,120,"Dokebi: I'm sorry~~! Waaaaah~~",8;
+ end;
+Lrand1:
+ areaannounce "ama_test.gat",30,78,68,120,"Dokebi: !! IT'S A RAID!!!! RUN!!",8;
+ end;
+Lrand2:
+ areaannounce "ama_test.gat",30,78,68,120,"Dokebi: But I didn't even do anything baaaaad~!",8;
+ end;
+Lrand3:
+ areaannounce "ama_test.gat",30,78,68,120,"Dokebi: Ow, Ouch!!!",8;
+ end;
+OnTimer5000:
+ donpcevent "mobcount2#momotaro::OnTimer5000";
+ end;
+}
+//=======================================MobCount2==============================-
+ama_test.gat,50,101,0 script mobcount2#momotaro -1,{
+OnMobDead:
+ if ($MomoDokebi2 == 2) goto Lfin;
+ set $MomoDokebi2,$MomoDokebi2+1;
+ areaannounce "ama_test.gat",30,78,68,120,"Am Mut: Ow, Ouch!!!",8;end;
+Lfin:
+ areaannounce "ama_test.gat",30,78,68,120,"Am Mut: I'm sorry~~! Waaaaah~~",8;
+ set event_momo,4;
+ initnpctimer;
+ end;
+OnTimer5000:
+ stopnpctimer;
+ enablenpc "Manager#Momotaro";
+ donpcevent "Manager#Momotaro::OnStart";
+ end;
+
+}
+
+//============================================================
+//====================================================== Sushi
+//====================================================== Quest
+ama_in01.gat,162,17,0 script Iron Chef 765,{
+ if (ama_sushi == 1) goto LStart2;
+ mes "[ShabuShabu]";
+ mes "*Sighs* This is getting worse..";
+ mes "Everyday more customers come,";
+ mes "but I can never get";
+ mes "enough material, even today.";
+ mes "A lot of customers surely will be hungry?";
+ next;
+ mes "[ShabuShabu]";
+ mes "*Sigh*, a customer. Welcome.";
+ mes "As always, my homemade sashimi";
+ mes "focuses on the freshness. What do you need?";
+ next;
+ menu "I want to buy shrimp sushi",L1,"I want to buy sashimi",L2,"Need some help!",L3,"Keep up the good work",-;
+ mes "[ShabuShabu]";
+ mes "Alright then, my sashimi";
+ mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
+ mes "If you have a chance, come try a little sashimi!";
+ close;
+ L1:
+ mes "[ShabuShabu]";
+ mes "Alright! How much do you want?";
+ mes "Unit price 700 zeny, but if you only want a taste,";
+ mes "I'll give you a discount of 74 zeny,";
+ mes "If you like the taste come back and find me later.";
+ next;
+ menu "I want the 700 zeny piece!",L1_1,"I want the 74 zeny sample!",L1_2,"I'll come eat next time",-;
+ mes "[ShabuShabu]";
+ mes "Alright then, my shrimp sushi";
+ mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
+ mes "If you have a chance, come try a little sashimi!";
+ close;
+ L1_1:
+ if (Zeny < 700) goto Lzeny;
+ set Zeny,Zeny-700;
+ getitem 551,10;
+ mes "[If you have a chance, come try a little sashimi!]";
+ mes "Thank you very much";
+ close;
+ L1_2:
+ if (Zeny < 74) goto Lzeny;
+ set Zeny,Zeny-74;
+ getitem 551,1;
+ mes "[If you have a chance, come try a little sashimi!]";
+ mes "Thank you very much";
+ close;
+ L2:
+ mes "[ShabuShabu]";
+ mes "Alright! How much do you want?";
+ mes "Unit price 350 zeny, but if you only want a taste,";
+ mes "I'll just give you a discount of 37 zeny.";
+ mes "If you like the taste come back and find me later";
+ next;
+ menu "I want the 350 zeny piece!",L2_1,"I want the 37 zeny sample",L2_2,"I'll come eat next time",-;
+ mes "[ShabuShabu]";
+ mes "Alright then, my sashimi";
+ mes "are famous throughout the world! Their taste relies on its freshness, and no one else can make them.";
+ mes "[If you have a chance, come try a little sashimi!]";
+ close;
+ L2_1:
+ if (Zeny < 350) goto Lzeny;
+ set Zeny,Zeny-350;
+ getitem 544,10;
+ mes "[ShabuShabu]";
+ mes "Thank you very much";
+ close;
+ L2_2:
+ if (Zeny < 37) goto Lzeny;
+ set Zeny,Zeny-37;
+ getitem 544,1;
+ mes "[ShabuShabu]";
+ mes "Thank you very much";
+ close;
+ Lzeny:
+ mes "[ShabuShabu]";
+ mes "You don't have enough zeny with you";
+ close;
+L3:
+ mes "[ShabuShabu]";
+ mes "Oh, any help is welcomed!!";
+ mes "I was just worrying about not having enough material everyday.";
+ mes "Do you want to hear my request?";
+ mes "Of course I will pay you to help me.";
+ next;
+
+ set ama_sushi,1;
+ mes "[ShabuShabu]";
+ mes "Crab Shell.";
+ mes "They are all out. I need them right now.";
+ mes "So please find ^0000FF10Crab shells^000000.";
+ mes "I can never find it when I need it.";
+ mes "I'll be counting on you.";
+ next;
+ mes "[ShabuShabu]";
+ mes "Then, please hurry! I'll be here";
+ mes "waiting for you, please don't forget my request!";
+ close;
+LStart2:
+ if (countitem(964)>=10) goto Lok;
+ mes "[ShabuShabu]";
+ mes "Man, don't have my materials ready?";
+ mes "Oh no, you didn't forget it did you?";
+ next;
+ mes "[ShabuShabu]";
+ mes "^0000FF10Crab shells^000000";
+ mes "Don't forget again.";
+ mes "You must help me find them!";
+ close;
+Lok:
+ delitem 964,10;
+ getitem 551,20;
+ mes "[ShabuShabu]";
+ mes "Hmm! Thank you so much";
+ next;
+ mes "[ShabuShabu]";
+ mes "Here is my thanks, take it!";
+ set ama_sushi,0;
+ close;
+
+}
+
+//============================================================
+//===================================================== Amatsu
+//====================================================== Event
+amatsu.gat,189,166,4 script Kouji 764,{
+ mes "[Kuruchi]";
+ mes "Lalala Lalala Lalalalalala..";
+ mes "Lalala Lalala Lalalalalala..";
+ next;
+ if (event_amatsu == 2) goto L1;
+ if ((event_amatsu == 3) || (event_amatsu == 4)) goto L2;
+ if (event_amatsu == 5) goto L3;
+ if (event_amatsu == 6) goto L4;
+L0:
+ mes "[Kuruchi]";
+ mes "Hanging Under the Blue Sky's Blue Roof";
+ mes "Shining on Blue Wall's Reflection on the Blue Lake";
+ mes "Blue Hearting Containing a Blue Desire";
+ mes "Blue, Blue Every thing's Blue";
+ next;
+ goto LEnd;
+L1:
+ mes "[Kuruchi]";
+ mes "Monk, Monk, the fox is following me";
+ mes "Because I have its favourite food";
+ mes "Ramen noodle, my favourite too";
+ mes "I can eat it three times a day";
+ set event_amatsu,3;
+ goto LEnd;
+L2:
+ mes "[Kuruchi]";
+ mes "Monk, Monk, The Fox Is Following Me";
+ mes "Shout At Him To Scare It Off!";
+ mes "Voice Too Small So It Didn't Run Off";
+ mes "Followed All The Way To North Side's Shrine!";
+ set event_amatsu,4;
+ goto LEnd;
+L3:
+ mes "[Kuruchi]";
+ mes "Monk, Monk, The Fox Is Following Me";
+ mes "Ramen noodles My Favorite";
+ mes "But Now I am No Longer Afraid?";
+ mes "I Shouted Loudly To Scare It Off!";
+ goto LEnd;
+L4:
+ mes "[Kuruchi]";
+ mes "The Town's Dock Has An Abandoned Boat!";
+ mes "Everyone Forget That In The Ship";
+ mes "Is Full Of Treasure And Gold";
+ mes "A Boat That Is Feared By Everyone";
+ goto LEnd;
+
+LEnd:
+ next;
+ mes "[Kuruchi]";
+ mes "Lalala Lalala Lalalalalala..";
+ mes "Lalala Lalala Lalalalalala..";
+ close;
+}
+//=====================================================================
+amatsu.gat,171,174,4 script Guard Soldier#01 767,{
+ if ((event_amatsu == 0) || (event_amatsu == 1)) goto L0;
+ if (event_amatsu == 6) goto L1;
+ if (event_amatsu == 7) goto L2;
+ mes "[Guard Soldier]";
+ mes "This area is where";
+ mes "the Master's mother";
+ mes "Is here for her treatment.";
+ next;
+ mes "[Guard Soldier]";
+ mes "Although it's not much to talk about...";
+ mes "She has been sick here for several months";
+ mes "and started to live here";
+ close;
+L0:
+ mes "[Guard Soldier]";
+ mes "This is where the Master's mother stays at.";
+ mes "Please keep quiet, we are also";
+ mes "very worried watching this everyday";
+ next;
+ mes "[Guard Soldier]";
+ mes "Why does this happen";
+ mes "to our benign and wise Master...";
+ mes "I don't understand, *sobs*...";
+ close;
+L1:
+ mes "[Guard Soldier]";
+ mes "What? Seems like something";
+ mes "flew by... Didn't you see? Oh...";
+ mes "And I heard a loud noise... Scared the shit out of me";
+ close;
+L2:
+ mes "[Guard Soldier]";
+ mes "Our master should be alright now.";
+ mes "We are also greatly relieved.";
+ mes "You have no idea how worried we were... Phew.";
+ close;
+}
+//=====================================================================
+amatsu.gat,164,174,4 script Guard Soldier#02 767,{
+ if (event_amatsu == 0) goto LOnce;
+ if ((event_amatsu >= 2) && (event_amatsu <= 5)) goto L2;
+ if (event_amatsu == 6) goto L3;
+ if (event_amatsu == 7) goto L4;
+ mes "[Guard Soldier]";
+ mes "Hopefully she will return healthy soon...";
+ mes "The Master has spent a lot of time";
+ mes "taking care and worrying about her.";
+ close;
+LOnce:
+ mes "[Guard Soldier]";
+ mes "Do not enter here.";
+ mes "This is where the master's mother is";
+ mes "recuperating.";
+ next;
+ mes "[Guard Soldier]";
+ mes "Although it's not much to talk about.";
+ mes "But she has been sick here for several months";
+ mes "and started to live here.";
+ set event_amatsu,1;
+ close;
+L2:
+ mes "[Guard Soldier]";
+ mes "If you are invited by the Master...";
+ mes "Please do come in.";
+ mes "Up till today, many doctors came to diagnose but";
+ mes "all their efforts seem futile.";
+ close;
+L3:
+ mes "[Guard Soldier]";
+ mes" Hey!";
+ mes" What's that sound!?";
+ mes" Where did it come from!?";
+ close;
+L4:
+ mes "[Guard Soldier]";
+ mes "The master's mother still";
+ mes "hasn't fully recovered.. ";
+ mes "Although, it seems to have turned for the better.";
+ mes "But then again..";
+ close;
+}
+
+//=====================================================================
+ama_in01.gat,22,111,0 script Old Lady#01 761,{
+ if (event_amatsu == 5) goto LStart2;
+ if (event_amatsu == 6) goto LStart3;
+ if (event_amatsu == 7) goto LStart4;
+ mes "[...]";
+ mes "^FF6060Clang Clannng! Clang Clannng! Stupid humans again!";
+ mes "Clang Clannng, Clang Clannng. Who is it? Is it human!?";
+ mes "What do you need here! Hurry up";
+ mes "Get out... Clang Clannng! Clang Clannng!^000000";
+ next;
+ mes "[...]";
+ mes "^FF6060I have decided to live here till";
+ mes "the Ishida Family line ends!";
+ mes "Stop bothering me and get out! Clang Clannng!^000000";
+ next;
+ warp "amatsu",167,197;
+ end;
+LStart2:
+ mes "[...]";
+ mes "^FF0066Clang Clannng! Clang Clannng! Here comes another one!";
+ mes "Stupid Humans! What do you want now";
+ mes "Throw me out of here!?^000000";
+ next;
+ mes "[...]";
+ mes "^FF0066Seems like you learned something somewhere,";
+ mes "That's about all you can do";
+ mes "You can't do anything to me!! Clang Clannng!^000000";
+ next;
+ menu "HAAAA!!",-;
+ set @which,rand(2);
+ if (@which == 1) goto Lfail;
+ mes "[...]";
+ mes "^FF0066Clang Clannng! Clang Clannng! Clang Clannng! This Bastard!";
+ mes "He threw me out like this!";
+ mes "Sick! Not fair!!^000000";
+ next;
+ mes "[...]";
+ mes "^FF0066That god-damned Ishida that rendered me to this.";
+ mes "I'll curse them forever! FOREVER!";
+ mes "Human, you better be careful too!^000000";
+ next;
+ monster "ama_in01.gat",22,112,"Fox",1180,1;
+ killmonsterall "ama_in01.gat";
+ getitem 1022,1;
+ mes "[...]";
+ mes "^FF0066Everything that Paul Shinaku did";
+ mes "will sooner or later";
+ mes "Bring about my downfall...^000000";
+ mes "^CC3300Clangggggggggggg!!^000000";
+ set event_amatsu,6;
+ close;
+Lfail:
+ mes "[...]";
+ mes "^FF0066Clang Clannng! Haha! Clang Clannng! Hahahaha!";
+ mes "How dare you, wanting to throw me out!";
+ mes "Get out of here!! Clang Clannng!^000000";
+ next;
+ warp "amatsu",167,197;
+ end;
+LStart3:
+ mes "[Ishida Sauk]";
+ mes "...*Sigh* Where from young man...?";
+ mes "Did you get rid of the fox?";
+ mes "Somehow I feel so tired, *sigh*...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "Thank you. Coming from another place";
+ mes "and still has to endure through this.";
+ mes "Very sorry... Sorry...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "I need to find my son.";
+ mes "Tell him that I got rid of the fox...";
+ mes "Thank you.";
+ next;
+ mes "[Ishida Sauk]";
+ mes "Now I am getting very tired.";
+ mes "I need to rest now, young man.....";
+ mes "Go find my son...";
+ close;
+LStart4:
+ mes "[Ishida Sauk]";
+ mes "Oh, You are the you man who";
+ mes "got rid of the fox... welcome.";
+ mes "Sit here a while if you can...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "To be possessed by that fox...";
+ mes "It is all my own fault...";
+ mes "I didn't teach my child properly... *sigh*";
+ mes "He was a good kid when he was small.";
+ mes "It's all because I wasn't strict enough...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "Originally this town was small.";
+ mes "Without a castle of this size either.";
+ mes "But, my son got some zeny somehow";
+ mes "and just start bringing them to me.";
+ mes "Don't know what he did to get this zeny.";
+ mes "And has to hide the truth from even me...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "Then starting building on the castle and town,";
+ mes "and treated the townspeople fairly and nicely...";
+ mes "If that was all, then there will be no problem.";
+ mes "The problem came after he did some strange things...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "Yea, he angered the gods";
+ mes "learning some weird spells somewhere.";
+ mes "And started doing experimenting,";
+ mes "Capturing the monsters,";
+ mes "Doing bad things...";
+ next;
+ mes "[Ishida Sauk]";
+ mes "And now, the monsters";
+ mes "started to live in Amatsu...";
+ mes "The gods became so angry even ";
+ mes "the monks from the shrine";
+ mes "don't know what to do.....";
+ next;
+ mes "[Ishida Sauk]";
+ mes "They punished me as well...";
+ mes "and sent a fox here, ";
+ mes "hoping to give a warning,";
+ mes "but my son didn't stop.";
+ next;
+ mes "[Ishida Sauk]";
+ mes "If possible please stop my son.";
+ mes "I am old and almost dead.";
+ mes "I don't know what to do either...";
+ mes "Please guard this peaceful town.";
+ mes "I don't know what my son is smoking";
+ mes "doing that kind of stuff...";
+ close;
+}
+//=====================================================================
+ama_in02.gat,170,62,4 script Soldier#02 767,{
+ mes "[Kyro]";
+ mes "My name is Kyro. In this town";
+ mes "I handle all the administrative work.";
+ mes "What type of service do you need?";
+ next;
+ menu "Please give me a pass",-,"I want to live here",L2,"Nothing",L3;
+
+ if (event_amatsu == 7) goto L1_1;
+ mes "[Kyro]";
+ mes "The master said that the guests from the continent";
+ mes "can move about freely,";
+ mes "Without any";
+ mes "permits or passes.";
+ close;
+L1_1:
+ if (countitem(7160) == 0) goto L1_2;
+ mes "[Kyro]";
+ mes "I have already given you a pass.";
+ close;
+L1_2:
+ mes "[Kyro]";
+ mes "Did you lose the pass?";
+ mes "If you want another pass";
+ mes "you need to pay 10,000 zeny for registration fees.";
+ next;
+ menu "Get the pass",L1_2_1,"Maybe next time",-;
+ mes "No problem!";
+ mes "If you need anything please come talk to me again!";
+ close;
+L1_2_1:
+ if (Zeny < 10000) goto LError;
+ set Zeny,Zeny-10000;
+ getitem 7160,1;
+ mes "[Kyro]";
+ mes "Come, this is it.";
+ mes "Please be careful and don't lose it again.";
+ close;
+LError:
+ mes "[Kyro]";
+ mes "You don't have enough zeny!";
+ close;
+L2:
+ mes "[Kyro]";
+ mes "This will be difficult, you can";
+ mes "freely move around, but the master";
+ mes "hasn't considered anything about immigration.";
+ mes "But, you can stay as long as you want";
+ close;
+L3:
+ mes "[Kyro]";
+ mes "Then that's it for now...";
+ mes "If there's anything else just tell me.";
+ close;
+
+}
+
+//=====================================================================
+ama_in02.gat,115,177,7 script Juro 767,{
+ mes "[Juro]";
+ mes "What are you here for?";
+ mes "There is nothing much over here.";
+ next;
+ menu "Oh, really",-,"Please open the door for me",L2;
+
+ mes "[Juro]";
+ mes "The town has much more stuff.";
+ mes "Have a wonderful time...";
+ close;
+L2:
+ if (event_amatsu != 7) goto Lnoflag;
+ if (countitem(7160) < 1) goto Llost;
+ mes "[Juro]";
+ mes "You already got the pass...";
+ mes "Do you want to go in directly? Or";
+ mes "Do you want me to explain first...?";
+ next;
+ menu "Direct access",-,"Listen to explanation",L2_2;
+
+ mes "[Juro]";
+ mes "Then, I will open the door for you.";
+ mes "Please take care...";
+ next;
+ warp "ama_dun01.gat",229,10;
+ end;
+L2_2:
+ mes "[Juro]";
+ mes "The inner space seems to be ";
+ mes "protected by special spells.";
+ mes "Those who wander in carelessly,";
+ mes "become lost and will be assaulted";
+ mes "mysteriously and die.";
+ next;
+ mes "[Juro]";
+ mes "What I can tell you";
+ mes "isn't all that much.";
+ mes "I have not been inside.";
+ mes "It's a mysterious place, its only proof is";
+ mes "of existence is from the";
+ mes "survivors that ventured inside";
+ next;
+ mes "[Juro]";
+ mes "First of all.....";
+ mes "'Don't believe in what you see.'";
+ next;
+ mes "[Juro]";
+ mes "Second of all.....";
+ mes "About the spells, they have their own rules.";
+ mes "Everything has its own purpose,";
+ mes "including the spells.";
+ mes "Will you find some";
+ mes "answers?";
+ next;
+ mes "[Juro]";
+ mes "Then, I'll open the door for you.";
+ mes "Please be careful...";
+ next;
+ warp "ama_dun01.gat",229,10;
+ end;
+Llost:
+ mes "[Juro]";
+ mes "You don't have the pass";
+ mes "so I cannot open the gate for you.";
+ mes "Please understand.";
+ close;
+Lnoflag:
+ mes "[Juro]";
+ mes "What door are you talking about?";
+ mes "In a place like this there won't";
+ mes "be any doors as far as I know.";
+ mes "You might have been mistaken.";
+ next;
+ mes "[Juro]";
+ mes "There are more to see in town.";
+ mes "I hope you have a good time...";
+ close;
+}
+ama_dun01.gat,229,7,0 script Soldier#08 767,{
+ mes "[Juro]";
+ mes "Ready to leave?";
+ next;
+ menu "Leave",-,"Wait a little more",L1;
+ mes "[Juro]";
+ mes "Gogo!!";
+ next;
+ warp "ama_in02.gat",119,181;
+ end;
+L1:
+ mes "[Juro]";
+ mes "Take care of yourself!";
+ close;
+}
+
+//=====================================================================
+ama_in02.gat,200,176,4 script Castle Owner 768,{
+ if (event_amatsu == 1) goto LStart2;
+ if ((event_amatsu >= 2) && (event_amatsu <=5)) goto LStart3;
+ if (event_amatsu == 6) goto LStart4;
+ if (event_amatsu == 7) goto LStart5;
+ mes "[Ishida Yoshinake]";
+ mes "What! An outsider?";
+ mes "What do you need me for?? If it's nothing important";
+ mes "Talk to you later...!";
+ next;
+ mes "[Ishida Yoshinake]";
+ mes "Please leave! No matter who you are!!";
+ mes "Right now I am in a VERY bad mood!";
+ close;
+LStart2:
+ mes "[Ishida Yoshinaku]";
+ mes "What! A visitor...? Oh, sorry";
+ mes "But today I am not in the mood";
+ mes "of seeing a visitor!";
+ next;
+ menu "I heard your mother is sick...",L1,"What a beautiful castle",L2,"Who are you?",L3;
+L1:
+ mes "[Ishida Yoshinaku]";
+ mes "Oh... You are an expert pathologist?";
+ mes "Oh yea, if you are a foreign expert";
+ mes "I should be able to trust you...";
+ mes "I guess...";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "Welcome, as you know";
+ mes "I am the owner of the East Lake Castle";
+ mes "My name is Ishida Yoshinaku,";
+ mes "Nice to meet you.";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "To put it simple: my mother";
+ mes "is not very healthy,";
+ mes "of course you are here because of it";
+ mes "Can you cure my ailing mother??";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "So many famous and talented";
+ mes "Doctors has visited her already,";
+ mes "But not only did they not cure her!!";
+ mes "They worsened her condition!!";
+ mes "so I kept feeling disappointed";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "You, being a foreign expert,";
+ mes "may cure my mother's sickness!";
+ mes "if you do, I will give you lots of zeny and rewards...";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "Please help her,";
+ mes "my mother lives in the mansion outside of the castle,";
+ mes "After you cure her";
+ mes "Come see me again";
+ set event_amatsu,2;
+ close;
+L2:
+ mes "[Ishida Yoshinaku]";
+ mes "Yes! Beautiful indeed! So what";
+ mes "Do you want to do! Leave when you get";
+ mes "bored of it! Man!";
+ next;
+ mes "[Ishida Yoshinaku]";
+ mes "At a pressing time like this... *Sobs*...";
+ mes "Leave when you become satisfied or bored!";
+ close;
+L3:
+ mes "[Ishida Yoshinaku]";
+ mes "...Talking about me? You don't know? Eh?";
+ mes "I am this castle's master!";
+ mes "Go ask around the soldiers outside";
+ mes "If you are not sure!";
+ next;
+ mes "[if you are not sure]";
+ mes "At a pressing time like this... *Sobs*...";
+ mes "Leave when you become satisfied or bored!";
+ close;
+LStart3:
+ mes "[Ishida Yushinaku]";
+ mes "How is my mother?";
+ mes "If you know the name of the sickness....";
+ mes "Please tell me immediately...";
+ mes "Argh... So worried!";
+ mes "I can't sleep at night any longer!";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "You are from the other continents,";
+ mes "so you must know....";
+ mes "now you are the only one I can trust";
+ close;
+LStart4:
+ mes "[Ishida Yushinaku]";
+ mes "WoW, you are great, I heard";
+ mes "My mother is getting better already,";
+ mes "Anyway, what sickness was it?";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "Fox? The fox is the reason? ho...";
+ mes "So it's not a sickness after all...!!";
+ mes "Why didn't I think of it earlier!!!";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "Damn fox, after it ran away,";
+ mes "it tried to revenge like this...";
+ mes "But now there is no other";
+ mes "Way... hahaha! Hahahaha!";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "Um, hmm, umm...";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "Anyway, Thanks for your help!";
+ mes "I think my mother will return to normal now...";
+ mes "I want to show you my gratitude...";
+ mes "What to do...";
+ next;
+ mes "[Ishida Yushinaku]";
+ mes "Alright, I will give you this pass.";
+ mes "As long as you have this pass,";
+ mes "you can get into ANYWHERE";
+ mes "In this town";
+ next;
+ set event_amatsu,7;
+ getitem 7160,1;
+ mes "[Ishida Yushinaku]";
+ mes "Although it's not such a great gift, but";
+ mes "I believe you will have use for it someday...";
+ mes "talk to 'Juro' For the details";
+ close;
+LStart5:
+ mes "[Ishida Yushinaku]";
+ mes "Hey... I hope you have a";
+ mes "good time in Amatsu.....";
+ mes "We always welcome the foreigners!";
+ close;
+}
+
+ama_in01.gat,180,173,2 script Fox Mask 762,{
+ if (event_amatsu == 4) goto LStart2;
+ if (event_amatsu == 5) goto LStart3;
+ mes "[Takikuwi]";
+ mes "Hiya, outsider, this";
+ mes "Shrine is left by a monk a long time ago.";
+ mes "Sometimes I come here to play";
+ mes "along with my friend Tokari";
+ next;
+ mes "[Takikuwi]";
+ mes "If you are here to hide from the monsters,";
+ mes "please do come in, no monsters";
+ mes "can ever come in here!";
+ mes "You can always take a short rest in here!";
+ close;
+LStart2:
+ mes "[Takikuwi]";
+ mes "Hiya, outsider, here to find me?";
+ mes "Because of the fox bothering you?";
+ mes "From your expression You seem to";
+ mes "have had quite a bit of trouble";
+ next;
+ mes "[Takikuwi]";
+ mes "Although usually the head monk";
+ mes "should come to help himself, this shrine";
+ mes "Has been deserted for a long time";
+ next;
+ mes "[Takikuwi]";
+ mes "It is very hard to get rid of a fox in a person's body";
+ mes "If there's alcohol and ramen noodle,";
+ mes "It might be a little easier,";
+ mes "But they are hard to find!";
+ next;
+ mes "[Takikuwi]";
+ mes "Good thing I know quite a bit";
+ mes "about the fox, I'll tell you";
+ mes "some words of advice, although foxes";
+ mes "are very tricky, and although they like to";
+ mes "make fun of humans... but it is seldom";
+ mes "for a fox to display hatred!";
+ next;
+ mes "[Takikuwi]";
+ mes "In another word, if there is hatred";
+ mes "human also did something wrong!!";
+ mes "Which will hurt self,";
+ mes "And sometimes unlucky things happen";
+ mes "and to friend and family as well!";
+ next;
+ mes "[Takikuwi]";
+ mes "Anyway, I've heard that when";
+ mes "there's a strong animal then a fox will chased,";
+ mes "away from the human.";
+ mes "So try hard, and try summoning the animal spirit!";
+ next;
+ menu "Haaaa!!",-;
+ mes "[Takikuwi]";
+ mes "Very good, just repeating it will";
+ mes "show the fox a strong spirit,";
+ mes "and show results, but the best thing is";
+ mes "to find out why the fox will enter the";
+ mes "person's body, but if you do this";
+ mes "it should help, more or less";
+ set event_amatsu,5;
+ close;
+LStart3:
+ mes "[Takikuwi]";
+ mes "Don't forget, when you try summoning";
+ mes "you must think about!";
+ mes "A monster that is stronger than a fox";
+ mes "or it would just be a futile effort!";
+ mes "Remember....... Stronger than a fox....";
+ close;
+}
diff --git a/npc/quests/quests_ayothaya.txt b/npc/quests/quests_ayothaya.txt
index 3d17a9d99..93f8716f6 100644
--- a/npc/quests/quests_ayothaya.txt
+++ b/npc/quests/quests_ayothaya.txt
@@ -1,1833 +1,1833 @@
-//===== Athena Script =======================================
-//= Quest NPCs related to Ayothaya
-//===== By ================================================
-//= Fredzilla
-//===== Version ===========================================
-//= 1.6
-//===== Compatible With ===================================
-//= eAthena 1.0
-//===== Description =======================================
-//= Ayothaya Clue Quest, Ayothaya Shrimp Quest, Ayothaya
-//= Dungeon Quest, Tom Yum Goong Quest,
-//===== Comments ==========================================
-//= List or Variables used
-//= @fishing - Checks for if you have caught a fish or not,
-//= 1/10 chance you will get the wedding ring if
-//= you have started that quest.
-//= weddingring - Signifies the start of the wedding ring
-//= quest, and used throughout to keep track of
-//= progress.
-//= recoveredring - Signifies you have retrieved the ring
-//= and therefore can't just drop the ring and
-//= get the same quest again.
-//= 1.0 - First Release, made with infomation from RagnaInfo
-//= 1.1 - added anti-novice protection [Lupus]
-//= 1.3 - Fixed exploit [Lupus]
-//= 1.4 Updated, more close to the official. Thanks to birkiczd
-//= Also optimized it again, remove unused global variable [Lupus]
-//= 1.5 Removed Duplicates [Silent]
-//= 1.6 Moved quests from cities/ to here:
-//= Shrimp, Dungeon, Tom Yum Goong [Evera]
-//=========================================================
-
-//============================================================
-//============================================== Ayothaya Clue
-//====================================================== Quest
-ayo_dun02.gat,277,178,1 script OBB 139,4,4,{
- if(AyoOBB==1 || weddingring!=3) end;
- mes "["+strcharinfo(0)+"]";
- mes "Huh what is this?, not foot prints, this is an Old Blue coloured Box";
- next;
- set AyoOBB,1;
- getitem 603,1;
- logmes "Q_AYOTH1: got OBB";
- mes "["+strcharinfo(0)+"]";
- mes "I think I will keep it";
- close;
-}
-//Dungeon 1 foot prints x 5
-ayo_dun01.gat,30,149,1 script Clue#01 139,5,5,{
- if(weddingring!=3) end;
- npctalk "There are some foot prints here, they head off to the East.";
- set @footprints1,1;
- close;
-}
-ayo_dun01.gat,70,149,1 script Clue#02 139,5,5,{
- if(weddingring!=3) end;
- npctalk "There are some more foot prints, they are heading off to the East too!";
- set @footprints2,1;
- close;
-}
-ayo_dun01.gat,100,149,1 script Clue#03 139,5,5,{
- if(weddingring!=3) end;
- npctalk "More foot prints heading to the East, who do they belong too?";
- set @footprints3,1;
- close;
-}
-ayo_dun01.gat,190,149,1 script Clue#04 139,5,5,{
- if(weddingring!=3) end;
- npctalk "More foot prints, but these are going North.";
- set @footprints4,1;
- close;
-}
-ayo_dun01.gat,261,263,1 script Clue#05 139,5,5,{
- if(weddingring!=3) end;
- npctalk "There are some foot prints, they seem to head into that hole there.";
- set @footprints5,1;
- close;
-}
-
-//Dungeon 2 foot prints x 4 + 1 fake
-ayo_dun02.gat,222,204,1 script Clue#06 139,5,5,{
- if(weddingring!=3) end;
- npctalk "Yet more foot prints, they are either going South or West.";
- set @footprints6,1;
- close;
-}
-ayo_dun02.gat,169,212,1 script Clue#07 139,5,5,{
- if(weddingring!=3) end;
- npctalk "Looks like there are foot print going to the West.";
- set @footprints7,1;
- close;
-}
-ayo_dun02.gat,129,212,1 script Clue#08 139,5,5,{
- if(weddingring!=3) end;
- npctalk "Ok these foot prints are either going to the North or West.";
- set @footprints8,1;
- close;
-}
-ayo_dun02.gat,79,212,1 script Clue#09 139,7,7,{
- if(weddingring!=3) end;
- npctalk "These are very new, they are going North.";
- set @footprints9,1;
- close;
-}
-//FAKE
-ayo_dun02.gat,245,166,1 script Clue#10 139,7,7,{
- if(weddingring!=3) end;
- npctalk "Seems something came by this way, to the East.";
- close;
-}
-
-ayothaya.gat,233,105,7 script Shuda 838,{
- mes "[Shuda]";
- if(BaseLevel<50) {
- mes "Where is my ring!?!";
- close;
- }
- if(weddingring==2) goto L_Quest2;
- if(weddingring==3) goto L_OnQ2;
- if(weddingring==4) goto L_QuestComplete;
- if(weddingring==5) goto L_QuestOver;
- if(countitem(7288)>=1) goto L_RingFound;
- mes "Oh please wont you help me, my partner has gone missing, but not before droping our ^FF0000Engagement Ring^000000 maybe there is a way of ^0000FFfishing^000000 it out of the sea.";
- set weddingring,1;
- close;
-L_RingFound:
- mes "Oh is that my ring!?!";
- next;
- mes "[Shuda]";
- mes "Can I please have it back?";
- next;
- menu "Yes, here you go",N_Yes,"No, I found it, it's mine",-;
- mes "[Shuda]";
- mes "Think what you want, but that ring is mine, and without it I can never marry my true love.";
- mes "";
- mes "Where ever he may be.";
- close;
-N_Yes:
- mes "[Shuda]";
- if(countitem(7288)<1) {
- mes "Go away, cheater!";
- close;
- }
- delitem 7288,1;
- mes "Thank you so much, now I have this back maybe my partner will return.";
- set weddingring,2;
- next;
- mes "[Shuda]";
- mes "Come back to me when you have time, I need you to do something else for me.";
- close;
-L_Quest2:
- mes "It seems even though I have my ring back my partner ^FF0000Annon^000000 doesn't seem to want to come back to me";
- mes "Maybe he has gotten lost somewhere";
- mes "";
- mes "Will you please go and look for him";
- next;
- menu "Yes, I would be glad to",L_YesQ2,"No, he will come back on his own",-;
- mes "[Shuda]";
- mes "Well he might, but I still need someone to find him, I am afraid something might have happened to him.";
- close;
-L_YesQ2:
- set weddingring,3;
- mes "[Shuda]";
- mes "Oh thank you so much, I think someone in the town might have seen where he went, maybe he can give you a clue";
- close;
-L_OnQ2:
- mes "Have you been able to find my love yet?";
- mes " ";
- mes "Please hurry.";
- mes "*tear*";
- close;
-L_QuestComplete:
- mes "You have found him ?!?";
- mes "Then where is he???";
- next;
- mes "You explain the situation.";
- next;
- mes "[Shuda]";
- mes "Well, I thought he was my one.";
- mes "I don't think I will ever find another like him.";
- mes "*tear*";
- next;
- set weddingring,5;
- mes "[Shuda]";
- mes "I can understand, but why not come and talk to me about it, we might have been able to talk it out.";
- close;
-L_QuestOver:
- mes "Nice to see you again "+strcharinfo(0)+". How have you been?";
- close;
-}
-
-ayothaya.gat,253,99,3 script Fisherman#01 843,{
- mes "[Dannai]";
- mes "This place is known to be teeming with fish. The fish here tend to eat anything they find, so it's easy to catch them.";
- next;
- mes "[Dannai]";
- mes "We are providing a fishing rod rental service. Every time you fish, you'll need ^4466771 Monster's Food^000000 to use as bait, and pay a rod rental fee of ^44667750 Zeny^000000.";
- next;
- mes "[Dannai]";
- mes "Would you";
- mes "like to try?";
- next;
- menu "Yes",-,"No",L_No;
- if(countitem(528) < 1 || zeny < 50) goto L_Fail;
- delitem 528,1;
- set zeny,zeny-50;
- mes "[Fisher Man]";
- mes "Ok give it a good swing.";
- mes "Lets see if you got anything.";
- next;
- set @fishing, rand(1,10);
- mes "[Fisher Man]";
- if(@fishing<5) goto L_Nothing;
- if(@fishing<10) goto L_Fish;
- if(@fishing==10) goto L_RingCheck;
-L_No:
- mes "[Dannai]";
- mes "Come back anytime.";
- close;
-L_Fail:
- mes "[Dannai]";
- mes "Seems you don't have what I need";
- mes "Come back when you have some Monster Feed, and 50 zeny.";
- close;
-L_Nothing:
- mes "Sorry it seems like you didn't get anything, try again anytime.";
- close;
-L_Fish:
- getitem 544,1;
- mes "Look at this you got yourself a fish, well done.";
- close;
-L_RingCheck:
- if(weddingring!=1 || recoveredring==1) goto L_Fish;
- mes "What is this, some sort of ring!!!";
- mes "Well I guess since you fished it out you can keep it";
- next;
- getitem 7288,1;
- mes "[Fisher Man]";
- mes "Come back anytime";
- set weddingring,0;
- set recoveredring,1;
- close;
-}
-
-ayothaya.gat,192,171,4 script Old Man#10 824,{
- mes "[Tham]";
- if(weddingring==3) goto L_OnQ2;
- mes "What a nice day it is today, don't you agree?";
- close;
-L_OnQ2:
- mes "What! Annon is missing, I only saw him a few minutes ago.";
- next;
- mes "[Tham]";
- mes "He was heading for Ayothaya's dungeon, I thought this kind of odd, and now you say he hasn't come back?!?";
- mes "I think you should follow him in there, just in case something has happened to him";
- next;
- mes "[Tham]";
- mes "Maybe he has left something inside the dungeon, something that can lead you to him";
- mes "But thats just me";
- next;
- mes "[Tham]";
- mes "You can get to the dungeon through the old temple, it is one map to the right of here, and down the hill.";
- close;
-}
-
-ayo_dun02.gat,91,264,4 script Guy 822,{
- if(weddingring==4) goto L_QuestComplete;
- if(weddingring==5) goto L_TalkedShuda;
- if(weddingring==3 && @footprints1==1 && @footprints2==1 && @footprints3==1 && @footprints4==1 && @footprints5==1 && @footprints6==1 && @footprints7==1 && @footprints8==1 && @footprints9==1) goto L_Groom;
- mes "[Guy]";
- mes "She won't find me here,she won't...";
- close;
-L_Groom:
-
- mes "[Annon]";
- mes "Help me please...";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "^He seems to be injured very bad...";
- next;
- menu "Treat his wounds",-,"Leave him alone",L_Go;
- if(countitem(504) < 1) goto L_Need;
- delitem 504,1;
- mes "[Annon]";
- mes "Who are you";
- mes "Have you been sent to follow me?";
- next;
- mes "[Annon]";
- mes "So I see now, my ex-partner has sent you to see if I'm OK.";
- mes " ";
- mes "Can you go and tell her I'm ok, but I cant go through with the marriage.";
- next;
- mes "[Annon]";
- mes "I cant really give a reason, just tell her that I love her, but not enough to spend the rest of my life with her.";
- next;
- mes "[Annon]";
- mes "I hope she will understand.";
- mes " ";
- mes "I guess you will want something in return.";
- next;
- mes "[Annon]";
- mes "I can train you, and make you gain some exp.";
- mes " ";
- mes "I will do this now.";
- next;
- set BaseExp,BaseExp+100000;
- set weddingring,4;
- mes "[Annon]";
- mes "It is done, please make you way back to Shuda, and please try not to make her cry";
- close;
-L_Need:
- mes "["+strcharinfo(0)+"]";
- mes "I need a White potion to be able to cure him.";
- close;
-L_Go:
- mes "["+strcharinfo(0)+"]";
- mes "Someone else will probably find him.I have other things to do.";
- close;
-L_QuestComplete:
- mes "[Annon]";
- mes "Have you seen Shuda yet?";
- close;
-L_TalkedShuda:
- mes "[Annon]";
- mes "Did she take it OK?";
- close;
-}
-
-//============================================================
-//============================================ Ayothaya Shrimp
-//====================================================== Quest
-ayothaya.gat,203,169,3 script Noi 839,{
- mes "[Noi]";
- mes "Welcome to Ayothaya.";
- mes "Out beautiful village is built above the water, surrounded by a dense forest.";
- next;
- mes "[Noi]";
- mes "There are many tourist attractions in this village, that you won't be able to find anywhere else. Out fish markets and the unique architecture of our buildings is enough reason to visit Ayothaya.";
- next;
- mes "[Noi]";
- mes "Please feel free";
- mes "to take a look around.";
- next;
- menu "Building Locations.",s_Loc,"Remove marks from mini-map.",s_Remo,"Cancel.",-;
-
- mes "[Noi]";
- mes "Please enjoy";
- mes "your travels.";
- close;
-s_Loc:
- mes "[Noi]";
- mes "Where would";
- mes "you like to visit?";
- next;
- menu "Weapon Shop",s_Weap,"Tool Shop",s_Tool,"Tavern",s_Tavern,"Shrine",s_Shrine,"Fishing Spot",s_Fish,"Cancel",-;
-
- mes "[Noi]";
- mes "If you wish to remove location marks on your mini-map, please select the 'Remove marks from mini-map' command from the menu.";
- close;
-
-s_Weap:
- mes "[Noi]";
- mes "At our Weapon Shop,";
- mes "you will find great weapons favored by brave Ayothayan seafarers.";
- next;
- mes "[Noi]";
- mes "Our weapon shop is located at ^00FF00+^000000.";
- viewpoint 1,166,90,1,0x00FF00;
- close;
-
-s_Tool:
- mes "[Noi]";
- mes "We Ayothayans always make sure we have everything we need before we go traveling. It never hurts to be prepared, does it?";
- next;
- mes "[Noi]";
- mes "Our Tool Shop";
- mes "is located at ^0000FF+^000000.";
- viewpoint 1,128,86,2,0x0000FF;
- close;
-
-s_Tavern:
- mes "[Noi]";
- mes "One of the basics of adventuring is gathering information, or at least that's what they say. You can meet people from all sorts of places in the Tavern. I'm sure you can earn something useful there.";
- next;
- mes "[Noi]";
- mes "Of course, you must";
- mes "drop by our Tavern.";
- mes "It is located at ^FFFF00+^000000.";
- viewpoint 1,229,70,3,0xFFFF00;
- close;
-
-s_Shrine:
- mes "[Noi]";
- mes "If you wish to pray to God, or achieve a state of peace in your mind, why don't you visit our Shrine? Even if it's just for sight-seeing, everyone is welcome there.";
- next;
- mes "[Noi]";
- mes "Our shrine";
- mes "is located at^880088+^000000.";
- viewpoint 1,207,284,4,0x880088;
- close;
-s_Fish:
- mes "[Noi]";
- mes "Since Ayothaya was built above the surface of the water and so close to a beach, it's been a favorite spot for fishermen. Why don't you catch some for dinner at the Fishing Spot?";
- next;
- mes "[Noi]";
- mes "Our famous";
- mes "Fishing Spot";
- mes "is located at ^AFAFAF+^000000.";
- viewpoint 1,251,97,5,0xAFAFAF;
- close;
-s_Remo:
- viewpoint 2,166,90,1,0x00FF00;
- viewpoint 2,128,86,2,0x0000FF;
- viewpoint 2,229,70,3,0xFFFF00;
- viewpoint 2,207,284,4,0x880088;
- viewpoint 2,251,97,5,0xAFAFAF;
- mes "[Noi]";
- mes "Alright...";
- mes "I've removed all the location marks from your mini-map.";
- mes "Thank you.";
- close;
-}
-
-ayothaya.gat,153,86,4 script Thongpool 843,{
- if(ayoshrimps == 1)goto s_Shrimp2;
- if(tomyumgoong == 2)goto s_Shrimp;
- mes "[Thongpool]";
- mes "Welcome, welcome!";
- mes "I've got the best Shrimp caught in the cleanest waters in the world~!";
- close;
-s_Shrimp:
- mes "[Thongpool]";
- mes "Come adventurers,";
- mes "take a look! I have";
- mes "plenty of Shrimp!";
- next;
- mes "[Thongpool]";
- mes "You're looking for Shrimp,";
- mes "aren't you? How many Shrimps";
- mes "do you need? Twenty Forty?";
- next;
- menu "I need Shrimp for Tom Yum Goong.",s_Tom,"Err, they look expensive.",-;
-
- mes "[Thongpool]";
- mes "What...?";
- mes "Do you think";
- mes "it's expensive?";
- mes "But the fantastic taste";
- mes "of Tom Yum Goong";
- mes "is priceless!";
- close;
-s_Tom:
- mes "[Thongpool]";
- mes "Ah! I guess Ms. Mali the Spicy recommended me to you. I guess that also means you want to buy them in bulk?";
- next;
- mes "[Thongpool]";
- mes "After all,";
- mes "you'll need a larger";
- mes "amount of Shrimp to";
- mes "cook Tom Yum Goong.";
- next;
- mes "[Thongpool]";
- mes "Oh yes, you will need 20 Shrimps for Ms. Mali's Tom Yum Goong.";
- mes "I even give you a discount:";
- mes "11,000 zeny for 20 shrimps.";
- mes "What do you say?";
- next;
- menu "I'll take them.",s_Take,"I could get 100 Jellopies for that much!",-;
-
- mes "[Thongpool]";
- mes "Well well well...";
- mes "You might your hungry stomach with that many Jellopies but they wouldn't taste as good as my Shrimp!";
- close;
-
-s_Take:
- if(Zeny < 11000) goto s_NoZeny;
- set Zeny, Zeny - 11000;
- getitem 567,20;
- emotion e_no1;
- mes "[Thongpool]";
- mes "Good, now you have the freshest Shrimp in this village!";
- mes "It's time for you to go back and ask Ms. Mali to cook them for you.";
- if(ayoshrimps < 1)set ayoshrimps,1;
- close;
-
-s_NoZeny:
- mes "[Thongpool]";
- mes "Awww...";
- mes "You don't have";
- mes "enough money.";
- close;
-
-s_Shrimp2:
- mes "[Thongpool]";
- mes "Mmm...?";
- mes "Did you need more Shrimps?";
- mes "Would you like to buy more?";
- next;
- menu "Yes!",s_Take,"No, thanks.",-;
-
- mes "[Thongpool]";
- mes "I see...";
- mes "If you need some shrimps, just tell me!";
- close;
-}
-
-//============================================================
-//=========================================== Ayothaya Dungeon
-//====================================================== Quest
-ayothaya.gat,83,132,7 script Dusit 843,{
- if(ayodunquest == 1 || ayodunquest == 2 || ayodunquest == 3)goto s_Dun;
- mes "[Dusit]";
- mes "Oh...!";
- mes "You must be a traveller.";
- mes "I have a tale you may wish to hear if you're interested in listening.";
- next;
- menu "What is it?",s_What,"I know what the story is.",-;
-
- mes "[Dusit]";
- mes "You do now?";
- mes "Then be careful!";
- mes "It'll eat you alive!";
- close;
-s_What:
- mes "[Dusit]";
- mes "Ayothaya has a long history. Perhaps it looks calm and peaceful now, but in the past our village was terrorized bu a terrible creature.";
- next;
- mes "[Dusit]";
- mes "This beast is known to us as the ^6B1312Sa-mhing Tiger^000000, which used to dwell deep in the ancient ruins.";
- next;
- mes "[Dusit]";
- mes "The Sa-mhing Tiger is addicted to the taste of human flesh. It has been known to transform into the shape of a person it has eaten in order to lure out his family and friends.";
- next;
- mes "[Dusit]";
- mes "The local people are still afraid that the creature might transform into someone they know, and sneak into their homes to eat them.";
- next;
- mes "[Dusit]";
- mes "However there is one way you can identify the Sa-mhing Tiger from a human being. Since it's a tiger, it cannot do some of the things humans are taught to do, such as light a match.";
- next;
- mes "[Dusit]";
- mes "So, if by chance you see a friend acting strangely all of a sudden, ask him to strike a match. Make sure he is not the Sa-mhing Tiger.";
- next;
- mes "[Dusit]";
- mes "However...";
- mes "I'm not sure if this actually works or not. I guess the best thing to do is just run for your life if you even suspect someone of being the Sa-mhing Tiger.";
- next;
- mes "[Dusit]";
- mes "Do you blieve";
- mes "in the existance";
- mes "of man-eating tigers?";
- next;
- menu "Well, not really.",-,"Yes, I do and I think they're scary!",s_Yes;
-
- mes "[Dusit]";
- mes "Umm...";
- mes "Oh well. My late grandfather told me about the Sa-mhing Tiger when I was a little kid. Of course, I haven't seen it.";
- next;
- mes "[Dusit]";
- mes "The closest thing I've seen to the Sa-mhing Tiger was a golden cat with a bell. Somehow, I don't think it ate men.";
- close;
-s_Yes:
- mes "[Dusit]";
- mes "Run for your life if you ever encounter the Sa-mhing Tiger! It'll eat you alive!";
- next;
- mes "[Dusit]";
- mes "If you're interested in finding more about the story, I can introduce you to someone who knows that creature more than anyone else.";
- next;
- mes "[Dusit]";
- mes "Why don't you talk to Boonthom? He's a pretty strange person, but there's something about him...";
- next;
- mes "[Dusit]";
- mes "...";
- mes "......";
- next;
- mes "[Dusit]";
- mes "Ah well, you'll see what I'm talking about. I hope he'll help you learn more about that evil creature.";
- set ayodunquest,1;
- close;
-s_Dun:
- mes "[Dusit]";
- mes "How are you?";
- mes "If you're interested in the Sa-mhing Tiger, please to talk to Boonthom.";
- next;
- mes "[Dusit]";
- mes "But beware!";
- mes "The Sa-mhing Tiger might be closer to you than you expect!";
- close;
-}
-
-ayo_in01.gat,181,193,4 script Shaman 840,{
- if(ayodot == 8)goto s_Check2;
- if(ayodot == 7 && countitem(7285) > 0)goto s_ICheck;
- if(ayodot == 6 && countitem(7285) > 0)goto s_Holier;
- if(ayodunquest == 3)goto s_Lose;
- if(ayodunquest == 2)goto s_Items;
- if(ayodunquest == 1)goto s_Quest;
- mes "[Boonthom]";
- mes "I'm sorry I can't talk to you.";
- mes "I'm very busy right now.";
- close;
-s_Quest:
- mes "[Boonthom]";
- mes "You...!";
- mes "Isn't it...!";
- mes "Ooooooohhhhhhh!";
- next;
- mes "[Boonthom]";
- mes "Oh...?";
- next;
- mes "[Boonthom]";
- mes "...";
- next;
- mes "[Boonthom]";
- mes "...";
- mes "......";
- next;
- mes "[Boonthom]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Boonthom]";
- mes "Never mind.";
- mes "Hah! I've lost my train of thought.";
- next;
- mes "[Boonthom]";
- mes "So have you come to me to seek help? I can see the fear in your eyes. Let me gaze into your soul, and see what your fear is for myself. Hmmm...";
- next;
- mes "[Boonthom]";
- mes "...";
- next;
- mes "[Boonthom]";
- mes "...";
- mes "......";
- next;
- mes "[Boonthom]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Boonthom]";
- mes "What...!";
- mes "I see that you dread the Sa-mhing Tiger! I haven't heard any news of that monster for a long time...";
- next;
- mes "[Boonthom]";
- mes "A long time ago, the Sa-mhing Tiger really did roam the village and ate innocent people.";
- next;
- mes "[Boonthom]";
- mes "However, its terror was brought to an end when it was finally captured. I was one of those involved in capturing the Sa-mhing Tiger.";
- next;
- mes "[Boonthom]";
- mes "I insisted on killing it, but the other people were too afraid to do so. Instead, the Sa-mhing Tiger was locked in a cave inside of the ancient ruins.";
- next;
- mes "[Boonthom]";
- mes "I believe that was at least 10 years ago. Perhaps it's already dead by now. However, no one knows how powerful the tiger truly is. It may still be alive.";
- next;
- mes "[Boonthom]";
- mes "I don't think we need to worry about it though. It is locked up and there it shall remain.";
- next;
- menu "I want to explore the ancient ruins.",s_Explore,"Locked up! Good! I'm not afraid!",-;
-
- mes "[Boonthom]";
- mes "Hmmm...";
- mes "Not afraid";
- mes "of it, are you?";
- next;
- mes "[Boonthom]";
- mes "..........";
- mes "..........";
- close;
-s_Explore:
- mes "[Boonthom]";
- mes "You...";
- mes "You are strange.";
- mes "You want to explore the ancient ruins. Do all the adventurers disregard their safety like that?";
- next;
- mes "[Boonthom]";
- mes "It's your choice. But remember, it is very dangerous to go through the path to the center of the building.";
- mes "Usually, I forbid it.";
- next;
- mes "[Boonthom]";
- mes "But if you want to go in, I can give you some useful tips.";
- mes "Would you like to listen?";
- next;
- menu "If it's that dangerous I'd rather not try",-,"Sure!",s_Sure;
-
- mes "[Boonthom]";
- mes "You made a good decision.";
- mes "You'd better be careful if you want to stay alive.";
- close;
-s_Sure:
- mes "[Boonthom]";
- mes "Umm, okay.";
- mes "Since you're";
- mes "that interested...";
- next;
- mes "[Boonthom]";
- mes "If you wish to enter the ancient building, you must have protection against evil spirits and malice.";
- next;
- mes "[Boonthom]";
- mes "There are many ghosts and demons within the cave, and they will attack people who do not possess holy power... Like you.";
- next;
- mes "[Boonthom]";
- mes "I can make you an object";
- mes "containing this holy power if you wish. In order to make it, I will need some materials.";
- next;
- mes "[Boonthom]";
- mes "^4466771 Needle Packet^000000,";
- mes "^4466771 Spool^000000,";
- mes "^4466771 Solid Husk^000000 and";
- mes "^4466771 Holy Water^000000...";
- mes "That's all I need.";
- next;
- mes "[Boonthom]";
- mes "Please come back";
- mes "when you prepare all the materials.";
- set ayodunquest,2;
- close;
-
-s_Items:
- if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems; //Pin Cusion, Spool, Hard Back Shell, Holy Water
- delitem 7213,1; //Pin Cusion
- delitem 7217,1; //Spool
- delitem 7190,1; //Hard Back Shell
- delitem 523,1; //Holy Water
- mes "[Boonthom]";
- mes "Excellent!";
- mes "Now you have brought everything I need. Let me make the thing for you as promised...";
- next;
- mes "[Boonthom]";
- mes "Ooooohmmmmm...";
- next;
- mes "[Boonthom]";
- mes "Hmmmmmm...";
- mes "Hmmmmmmmmm.";
- next;
- mes "[Boonthom]";
- mes "Pffff pffff...";
- next;
- set ayodunquest,3;
- getitem 7285,1; //Holy Threads
- mes "[Boonthom]";
- mes "Here you go.";
- mes "Please take these holy threads.";
- mes "With this, you will be able to enter the ruins with less worry.";
- next;
- mes "[Boonthom]";
- mes "Even if you lose this, don't worry.";
- mes "Just bring me the materials, and I will make you another one.";
- next;
- mes "[Boonthom]";
- mes "The ancient building consists of 2 levels. Before you enter the 2nd underground level, please return to me so that I can tell you how to enter that place.";
- close;
-
-s_NoItems:
- mes "[Boonthom]";
- mes "Did you forget what materials you need to create my object of holy power? Please listen carefully this time.";
- next;
- mes "[Boonthom]";
- mes "^4466771 Needle Packet^000000,";
- mes "^4466771 Spool^000000,";
- mes "^4466771 Solid Husk^000000 and";
- mes "^4466771 Holy Water^000000.";
- next;
- mes "[Boonthom]";
- mes "See you later.";
- close;
-
-s_Lose:
- if(countitem(7285) > 0)goto s_NoItems2;
- if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems2; //Pin Cusion, Spool, Hard Back Shell, Holy Water
- //Custom Dialogues
- mes "[Boonthom]";
- mes "Oh, you have all the items I require to make holy threads.";
- next;
- mes "[Boonthom]";
- mes "Would you like to make one?";
- next;
- menu "Yes please.",s_Yes,"No I'm fine.",-;
-
- mes "[Boonthom]";
- mes "See you later then.";
- close;
-s_Yes:
- if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems2; //Pin Cusion, Spool, Hard Back Shell, Holy Water
- delitem 7213,1; //Pin Cusion
- delitem 7217,1; //Spool
- delitem 7190,1; //Hard Back Shell
- delitem 523,1; //Holy Water
- getitem 7285,1; //Holy Threads
- mes "[Boonthom]";
- mes "All right, here are your holy threads.";
- mes "If you lose them, I'm still here to make some more.";
- next;
- mes "[Boonthom]";
- mes "Good luck venturing down the dungeon.";
- close;
-
-s_NoItems2:
- mes "[Boonthom]";
- mes "If you lose the holy threads, don't worry. I can make some more for you. Just gather the following items.";
- next;
- mes "[Boonthom]";
- mes "^4466771 Needle Packet^000000,";
- mes "^4466771 Spool^000000,";
- mes "^4466771 Solid Husk^000000 and";
- mes "^4466771 Holy Water^000000.";
- next;
- mes "[Boonthom]";
- mes "See you later.";
- close;
-s_Holier:
- mes "[" + strcharinfo(0) + "]";
- mes "I copied down this";
- mes "message while exploring";
- mes "the dungeon. Would you";
- mes "take a look at this?";
- next;
- mes "[Stone Slate]";
- mes "Do not enter the";
- mes "2nd underground level";
- mes "...is danger... You will";
- mes "...encounter... tiger...";
- next;
- mes "[Stone Slate]";
- mes "You must kill... In order to do...";
- mes "Must... How to go... the 2nd";
- mes "underground level...";
- mes "You need more... Holy power... in";
- mes "order to... Otherwise, it's";
- mes "impossible...";
- next;
- mes "[Boonthom]";
- mes "That was written by one of my";
- mes "comrades who entered the ruins,";
- mes "as he regretted letting the tiger";
- mes "live, let it return";
- next;
- mes "[Boonthom]";
- mes "If you were able to find this note,";
- mes "you must have strong determination";
- mes "to venture through the ruins.";
- next;
- mes "[Boonthom]";
- mes "As you can guess from the";
- mes "note, the 2nd underground level is";
- mes "very very dangerous. You will need";
- mes "holy threads that contains even more";
- mes "holy protection.";
- next;
- mes "[Boonthom]";
- mes "Now, go and gather some materials";
- mes "so that I can create more powerful";
- mes "holy threads for you.";
- next;
- mes "[Boonthom]";
- mes "^4466772 Holy Water^000000,";
- mes "^4466771 Yggdrasil Leaf^000000,";
- mes "^4466772 Needle Packet^000000 and";
- mes "^4466772 Spool^000000.";
- next;
- mes "[Boonthom]";
- mes "Return to me";
- mes "once you have";
- mes "gathered everything.";
- set ayodot,7;
- close;
-s_ICheck:
- if(countitem(523) < 2 || countitem(610) < 1 || countitem(7213) < 2 || countitem(7217) < 2)goto s_NEnoughItems;
- if(ayodot == 8)goto s_Process;
- mes "[Boonthom]";
- mes "Hmmm~";
- mes "You've brought";
- mes "everything. Quite";
- mes "the enthusiastic one,";
- mes "aren't you?";
- next;
- mes "[Boonthom]";
- mes "Ooooohmmmmm...";
- next;
- mes "[Boonthom]";
- mes "Hmmmmmm...";
- mes "Hmmmmmmmmm.";
- next;
- mes "[Boonthom]";
- mes "Pffff pffff...";
- next;
-s_Process:
- if(countitem(523) < 2 || countitem(610) < 1 || countitem(7213) < 2 || countitem(7217) < 2)goto s_NEnoughItems;
- delitem 523,2;
- delitem 610,1;
- delitem 7213,2;
- delitem 7217,2;
- getitem 7287,1;
- if(ayodot != 8)set ayodot,8;
- mes "[Boonthom]";
- mes "Here you go.";
- mes "Please take these holy threads.";
- mes "With this, you will be able to";
- mes "enter the ruins with less worry.";
- next;
- mes "[Boonthom]";
- mes "Even if you lost this, don't worry.";
- mes "Just bring me the materials, and";
- mes "I will make you another one.";
- close;
-s_NEnoughItems:
- mes "[Boonthom]";
- mes "Hmmm...?";
- mes "Didn't I tell you";
- mes "what I need to make";
- mes "a more powerful";
- mes "holy thread?";
- next;
- mes "[Boonthom]";
- mes "^4466772 Holy Water^000000,";
- mes "^4466771 Yggdrasil Leaf^000000,";
- mes "^4466772 Needle Packet^000000 and";
- mes "^4466772 Spool^000000.";
- next;
- mes "[Boonthom]";
- mes "Return to me";
- mes "with those items";
- mes "And I will craft";
- mes "more powerful holy";
- mes "threads for you.";
- close;
-s_Check2:
- if(countitem(7285) < 1)goto s_Lose;
- if(countitem(7287) < 1)goto s_LoseThreads;
- mes "[Boonthom]";
- mes "Those threads";
- mes "will protect you";
- mes "from the spiritual";
- mes "dangers, but it's up";
- mes "to you to defend yourself";
- mes "from monster attacks, okay?";
- close;
-s_LoseThreads:
-//Custom Dialogues
- mes "[Boonthom]";
- mes "I can feel the absence of holy power.";
- mes "You lost the holier threads didn't you?";
- next;
- mes "[Boonthom]";
- mes "But that's alright, I can make a new one";
- mes "So... Do you want one?";
- next;
- menu "Yeah!",s_ICheck,"Nah",-;
-
- mes "[Boonthom]";
- mes "Come back anytime!";
- close;
-}
-ayo_fild01.gat,129,197,7 script Puraim 842,{
- if(countitem(7285) > 0)goto s_Dungeon; //Holy Threads
- mes "[Puraim]";
- mes "If I were you, I wouldn't even dare to approach";
- mes "The ruins down over there.";
- next;
- mes "[Puraim]";
- mes "Anyone who doesn't have the protection of a holy spirit will be easy game for the evil creatures living there. You'd be killed in no time at all!";
- next;
- mes "[Puraim]";
- mes "Go back, adventurer.";
- mes "If you wish to explore this area, you'd better show me some holy spirit.";
- close;
-s_Dungeon:
- mes "[Puraim]";
- mes "Huh...?";
- mes "I feel it!";
- mes "I can feel the power of holiness!";
- mes "It's coming from you!";
- next;
- mes "[Puraim]";
- mes "I guess you can go ahead into the ruins. So that's what you want? To explore this aera?";
- next;
- mes "[Puraim]";
- mes "I would suggest against coming inside. Even the local people fear this area.";
- next;
- mes "[Puraim]";
- mes "If the Sa-mhing Tiger wasn't around, there would still be all the evil spirits in this place. Even with the holy threads, this place is still dangerous.";
- next;
- mes "[Puraim]";
- mes "So what do you want to do? Do you still want to explore the area, adventurer?";
- next;
- menu "Yes",s_Yes,"No! I'm too afraid of the ruins now.",-;
-
- mes "[Puraim]";
- mes "Good decision!";
- mes "As I expected, you're smart enough not to stupidly jeopardize your life.";
- close;
-s_Yes:
- mes "[Puraim]";
- mes "Hmmm...";
- mes "It seems you adventurers are tempted by the thrill of danger, or you've all got some death wish.";
- next;
- mes "[Puraim]";
- mes "Oh well, that's none of my business. After all, you already have a holy spirit. Still, be careful. You might not want to go to the 2nd underground level of the ruins.";
- next;
- mes "[Puraim]";
- mes "As you Rune-Midgardians say, 'curiousity killed the cat.' Anyway, go for it!";
- next;
- mes "[Puraim]";
- mes "^3C2EE6He shoved you off the hill and you plummet like a rock.";
- close2;
- set @hpcheck,readparam(6)/10;
- if(readparam(5) < @hpcheck)goto s_SetHp;
- percentheal -10,0;
-s_Warp:
- warp "ayo_fild02.gat",30,135;
- end;
-s_SetHp:
- set @hpcheck2,readparam(5)-1;
- heal -@hpcheck2,0;
- goto s_Warp;
-}
-
-ayo_dun01.gat,260,42,4 script LocationActivator 139,4,0,{
- if(ayodot > 5)end;
- if(countitem(7285) > 0)goto s_Dots;
- end;
-s_Dots:
- mes "- Holy threads in your pocket";
- mes "suddenly started glowing. You felt";
- mes "something is near you.-";
- if(ayodot == 0)goto s_0;
- if(ayodot == 1)goto s_1;
- if(ayodot == 2)goto s_2;
- if(ayodot == 3)goto s_3;
- if(ayodot == 4)goto s_4;
- if(ayodot == 5)goto s_5;
- end;
-
-s_0:
- viewpoint 1,198,164,1,0xFF0000;
- viewpoint 1,87,16,2,0xFF0000;
- viewpoint 1,268,215,3,0xFF0000;
- viewpoint 1,147,274,4,0xFF0000;
- viewpoint 1,99,118,5,0xFF0000;
- viewpoint 1,16,188,6,0xFF0000;
- stopnpctimer;
- close;
-s_1:
- viewpoint 1,87,16,2,0xFF0000;
- viewpoint 1,268,215,3,0xFF0000;
- viewpoint 1,147,274,4,0xFF0000;
- viewpoint 1,99,118,5,0xFF0000;
- viewpoint 1,16,188,6,0xFF0000;
- close;
-s_2:
- viewpoint 1,268,215,3,0xFF0000;
- viewpoint 1,147,274,4,0xFF0000;
- viewpoint 1,99,118,5,0xFF0000;
- viewpoint 1,16,188,6,0xFF0000;
- close;
-s_3:
- viewpoint 1,147,274,4,0xFF0000;
- viewpoint 1,99,118,5,0xFF0000;
- viewpoint 1,16,188,6,0xFF0000;
- close;
-s_4:
- viewpoint 1,99,118,5,0xFF0000;
- viewpoint 1,16,188,6,0xFF0000;
- close;
-s_5:
- viewpoint 1,16,188,6,0xFF0000;
- close;
-}
-
-ayo_dun01.gat,198,164,4 script #invayo1 111,{
-
- if(countitem(7285) < 1)end;
- if(ayodot == 0)goto s_First;
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 1st part of the slate.";
- close;
-
-s_First:
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 1st part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FFDo not enter the 2nd underground level.^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,1;
- close;
-
-}
-
-ayo_dun01.gat,87,16,4 script #invayo2 111,{
-
- if(countitem(7285) < 1)end;
- if(ayodot == 1)goto s_First;
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 2nd part of the slate.";
- close;
-
-s_First:
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 2nd part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FF...is danger... You wil....^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,2;
- close;
-
-}
-
-ayo_dun01.gat,268,215,4 script #invayo3 111,{
-
- if(countitem(7285) < 1)end;
- if(ayodot == 2)goto s_First;
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 3rd part of the slate.";
- close;
-
-s_First:
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 3rd part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FF...encounter...tiger....^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,3;
- close;
-
-}
-
-ayo_dun01.gat,147,274,4 script #invayo4 111,{
-
- if(countitem(7285) < 1)end;
- if(ayodot == 3)goto s_First;
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 4th part of the slate.";
- close;
-
-s_First:
-
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 4th part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FFYou must kill... In order to do... MUST ... How to go... the 2nd underground level...^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,4;
- close;
-
-}
-
-ayo_dun01.gat,99,118,4 script #invayo5 111,{
- if(countitem(7285) < 1)end;
- if(ayodot == 4)goto s_First;
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 5th part of the slate.";
- close;
-s_First:
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 5th part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FFYou need more... Holy power... in order to...^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,5;
- close;
-
-}
-
-ayo_dun01.gat,16,188,4 script #invayo6 111,{
- if(countitem(7285) < 1)end;
- if(ayodot == 5)goto s_First;
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the last part of the slate.";
- close;
-s_First:
- mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the last part of the slate.";
- next;
- mes "^3C2EE6It reads '^0000FFOtherwise, it's impossible...^3C2EE6' You are unable to read the rest of the message.";
- set ayodot,6;
- close;
-}
-
-ayo_dun01.gat,24,283,4 script #ayowarp 111,{
- if(countitem(7287) < 1)goto s_NoEntry;
- mes "^3C2EE6The holy threads emanate a powerful sense of safety and security. With the protection of holiness, you begin your descent into the 2nd level..";
- close2;
- set @ayodunwarp,rand(1,2);
- if(@ayodunwarp == 2)goto s_2;
- warp "ayo_dun02.gat",275,26;
- end;
-s_2:
- warp "ayo_dun02.gat",24,26;
- end;
-s_NoEntry:
- mes "^3C2EE6You find what seems to be the entrance to the 2nd level. However, you are filled with an overwhelming sense of dread. Somehow, you can't bring yourself to go down...";
- close;
-}
-
-ayo_dun01.gat,23,283,4 duplicate(#ayowarp) #ayodupe1 111
-ayo_dun01.gat,25,283,4 duplicate(#ayowarp) #ayodupe2 111
-ayo_dun01.gat,26,283,4 duplicate(#ayowarp) #ayodupe3 111
-
-//============================================================
-//============================================== Tom Yum Goong
-//====================================================== Quest
-
-
-ayothaya.gat,196,265,3 script Einon 842,{
- if(tomyumgoong == 5)goto s_Done;
- if(tomyumgoong == 1 || tomyumgoong == 2 || tomyumgoong == 3 || tomyumgoong == 4)goto s_Resta;
- mes "[Einon]";
- mes "Do you know what the";
- mes "most popular cuisine";
- mes "of this village is?";
- next;
- mes "[Einon]";
- mes "Ayothaya is world famous for its regional cuisine, but out of all Ayothayan dishes, '^3C2EE6Tom Yum Goong^000000' is the best.";
- next;
- mes "[Einon]";
- mes "Tom Yum Goong is a type of soup that is very spicy. Try it once, and you will be amazed by its profound taste. Try it twice, and you will be enraptured by its tantalizing aroma.";
- next;
- mes "[Einon]";
- mes "It's really one of the most delicious foods in the world!";
- mes "Everyone in the world would would want to try this at least once in his lifetime. So, would you like to try some?";
- next;
- menu "Sure thing.",s_Sure,"No, thanks. I hate spicy food.",-;
-
- mes "[Einon]";
- mes "Oh I see...";
- mes "However, when you";
- mes "change your mind,";
- mes "please come back.";
- close;
-
-s_Sure:
- mes "[Einon]";
- mes "Okay...!";
- mes "Now who would be best for preparing Tom Yum Goong for you?";
- mes "Hmmmmm...";
- next;
- mes "[Einon]";
- mes "Everyone in the village knows how to make it, but I recommend that you go visit ^0000FF Mali the Spicy^000000.";
- next;
- mes "[Einon]";
- mes "She is the best cook when it comes to Tom Yum Goong!";
- mes "Why don't you ask her to cook you some?";
- set tomyumgoong,1;
- close;
-s_Resta:
- mes "[Einon]";
- mes "Ah, you wanna know where ^0000FFMali the Spicy^000000 is?";
- mes "Well, there's not too many places a cook would stay other than in a restaurant, right? Hahaha~";
- close;
-s_Done:
- mes "[Einon]";
- mes "Golden Ayothaya...";
- mes "Although I've grown";
- mes "up in this village,";
- mes "I still think my village";
- mes "is magnificient and beautiful.";
- next;
- mes "[Einon]";
- mes "What do you think?";
- mes "Wouldn't you agree with me?";
- close;
-}
-
-ayo_in01.gat,145,163,4 script Cook 839,{
- if(tomyumgoong == 5)goto s_Busy;
- if(ayopause == 1)goto s_Pause;
- if(ayopause == 2)goto s_Pause2;
- if(tomyumgoong == 4)goto s_Chilee;
- if(tomyumgoong == 3)goto s_Lemons;
- if(tomyumgoong == 2)goto s_Shrimp;
- mes "[Mali the Spicy]";
- mes "Hello, there!";
- mes "I am called Mali the Spicy.";
- mes "All of my dishes always amaze my customers with their tempting scents and deep flavors.";
- next;
- mes "[Mali the Spicy]";
- mes "I am especially proud of my ^3C2EE6Tom Yum Goong^000000, which is the best in the village. I suppose it's my fate to cook the greatest Tom Yum Goong ever.";
- if(tomyumgoong == 1)goto s_Quest;
- close;
-s_Quest:
- next;
- mes "[Mali the Spicy]";
- mes "Oh I see...";
- mes "You want me to cook Tom Yum Goong for you, don't you?";
- next;
- mes "[Mali the Spicy]";
- mes "Honestly, I've been really buse ever since I opened this restaurant. If you really wish to taste my Tom Yum Goong, would you do something for me?";
- next;
- menu "Sure!",s_Sure,"Eh... I dunno.",-;
-
- mes "[Mali the Spicy]";
- mes "I understand this might be difficult to do, but it's worth a try if you really want to taste the best Tom Yum Goong.";
- close;
-
-s_Sure:
- mes "[Mali the Spicy]";
- mes "First, would you go get the ingredients to make Tom Yum Goong for me? I'll need some ^FF0000Shrimps^000000, ^FF0000Chilees^000000 and ^FF0000Lemons^000000.";
- next;
- mes "[Mali the Spicy]";
- mes "Remember, Shrimp is the main ingredient of this dish. So, the fresher the Shrimp, the tastier your food will be.";
- next;
- menu "Where can I find them?",-;
- mes "[Mali the Spicy]";
- mes "I expected you to ask me that.";
- mes "For shrimps, look around the beach. You should see a lot of them there.";
- next;
- mes "[Mali the Spicy]";
- mes "However, you might have a hard time finding them since you haven't done that before. So just buy some Shrimp from the guy who sells the freshest Shrimp around.";
- next;
- mes "[Mali the Spicy]";
- mes "Hmmm...";
- mes "If you mention";
- mes "my name, that guy";
- mes "might give you a discount";
- next;
- mes "[Mali the Spicy]";
- mes "His name is ^0000FFThongpool^000000.";
- mes "He will be somewhere around the village selling Shrimps. Go and ask him to give you 20 Shrimps to cook Tom Yum Goong.";
- set tomyumgoong,2;
- close;
-s_Shrimp:
- if(countitem(567) > 19)goto s_EnoughShrimp;
- mes "[Mali the Spicy]";
- mes "Did you visit ^0000FFThongpool^000000?";
- mes "He will be somewhere around the village selling Shrimps. Go and ask him to give you 20 Shrimps to cook Tom Yum Goong.";
- close;
-
-s_EnoughShrimp:
- delitem 567,20;
- mes "[Mali the Spicy]";
- mes "Ah you came back!";
- mes "Now, let me see what";
- mes "you've brought. Hmmm...";
- mes "These are...";
- next;
- set ayopause,1;
- set ayoshrimps,0;
- emotion e_no1;
- mes "[Mali the Spicy]";
- mes "The freshest Shrimp that";
- mes "I've been looking for!";
- mes "With these big and fresh Shrimps,";
- mes "I can cook the best Tom Yum Goong";
- mes "for you! Thank you so much!";
- next;
- mes "[Mali the Spicy]";
- mes "It will be a perfect food with the natural sweetness of the Shrimp, the sourness of Lemons and a little bit of fish sauce!";
- next;
-s_Pause:
- mes "[Mali the Spicy]";
- mes "Oh... Right";
- mes "But we only have Shrimp.";
- mes "Now, I want you to bring me some ^FF0000Lemons^000000.";
- next;
- menu "Where can I find Lemons?",s_WLemon,"I hate sour food. I'd better quit!",-;
-
- mes "[Mali the Spicy]";
- mes "It's your call.";
- mes "But remember...";
- mes "The shimps might go bad while you're taking a rest.";
- close;
-
-s_WLemon:
- mes "[Mali the Spicy]";
- mes "A few days ago, I saw a good";
- mes "Lemon tree while taking a walk.";
- mes "But this tree belongs to an";
- mes "ordinary man who's not a Fruit Merchant.";
- next;
- mes "[Mali the Spicy]";
- mes "I'm not sure wheter or not he'd sell Lemons to you, but you can try, I guess.";
- set ayopause,0;
- set tomyumgoong,3;
- close;
-s_Lemons:
- if(countitem(568) > 9)goto s_EnoughLemon;
- mes "[Mali the Spicy]";
- mes "Alright...";
- mes "I'm counting on you";
- mes "to get the best Lemons";
- mes "from the man who owns that tree.";
- next;
- mes "[Mali the Spicy]";
- mes "Somehow, you've got";
- mes "to get those high quality";
- mes "Lemons so that I can make some Tom Yum Goong!";
- close;
-s_EnoughLemon:
- delitem 568,10;
- emotion e_gasp;
- mes "[Mali the Spicy]";
- mes "Welcome back!";
- mes "Wow, you came back";
- mes "really fast! Okay, let me";
- mes "see the Lemons";
- mes "you brought?";
- next;
- set ayopause,2;
- mes "[Mali the Spicy]";
- mes "Wow, great!";
- mes "These are really fresh Lemons!";
- mes "How could you bring all of these by";
- mes "yourself? Thanks for your trouble~";
- next;
-s_Pause2:
- mes "[Mali the Spicy]";
- mes "Now, you should go buy";
- mes "some ^FF0000Chilees^000000 and some";
- mes "other materials in the market.";
- next;
- mes "[Mali the Spicy]";
- mes "When you talk";
- mes "to the Merchants";
- mes "in the Market, they";
- mes "will know what you want.";
- next;
- menu "Okay, I'll be right back.",s_Okay,"Ah, I'm tired now. Let me take a rest first...",-;
-
- mes "[Mali the Spicy]";
- mes "It's your call.";
- mes "But remember...";
- mes "The Shrimps might go bad";
- mes "while you're taking a rest.";
- close;
-s_Okay:
- mes "[Mali the Spicy]";
- mes "See you in a bit~";
- set ayopause,0;
- set tomyumgoong,4;
- close;
-s_Chilee:
- if(countitem(7286) > 29)goto s_EnoughChilee;
- mes "[Mali the Spicy]";
- mes "Did you get the Chilees?";
- mes "You should talk to the Merchants in the Market, they'll know what you want.";
- close;
-s_EnoughChilee:
- delitem 7286,30;
- mes "[Mali the Spicy]";
- mes "Now...";
- mes "Everything is all set!";
- mes "Before we start, let me";
- mes "check the materials.";
- next;
- mes "[Mali the Spicy]";
- mes "^FF0000Shrimp^000000, ^FF0000Chilees^000000, ^FF0000Lemons^000000...";
- mes "Fish sauce and other little";
- mes "things...";
- next;
- mes "[Mali the Spicy]";
- mes "Perfect!";
- mes "Shall we begin?";
- next;
- misceffect 125;
- mes "^D0122C*Tuk*";
- mes "^6F1E6A*Tup*";
- mes "^357030*Puk*";
- next;
- misceffect 124;
- mes "^D10C3A*Chop chop*";
- mes "^DCB060*Tup tup tup*";
- mes "^8CA7BA*Pu pu*";
- next;
- misceffect 23;
- misceffect 135;
- mes "^86733BTup tup ^396254chook";
- mes "^486354chop chop";
- mes "^BA0010Tup tup tup ^28842FPu pu";
- next;
- emotion e_omg;
- misceffect 99;
- misceffect 90;
- mes "Wah^050158ah^241999ahhh^0F48CBhaaaahhh^000000!";
- next;
- mes "[Mali the Spicy]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- set tomyumgoong,5;
- set ayoshrimps,0;
- getitem 566,10;
- emotion e_no1;
- mes "[Mali the Spicy]";
- mes "Here's your";
- mes "Tom Yum Goong!";
- mes "Ah~ This taste,";
- mes "this scent... Yeah.";
- mes "I know I did a good job.";
- next;
- mes "[Mali the Spicy]";
- mes "Do you know what is the secret of Tom Yum Goong? It isn't simply just food. This has the power to heal you, and help you get into better shape.";
- next;
- mes "[Mali the Spicy]";
- mes "Because...";
- mes "It countains the";
- mes "power of God.";
- next;
- mes "[Mali the Spicy]";
- mes "Okay...!";
- mes "I'm giving you";
- mes "10 Tom Yum Goong";
- mes "free of charge~";
- next;
- mes "[Mali the Spicy]";
- mes "Thank you for all the trouble";
- mes "you have been through to get these";
- mes "ingredients. It would make me happy";
- mes "if you shared Tom Yum Goong with";
- mes "your friends.";
- next;
- mes "[Mali the Spicy]";
- mes "Share the flavor of Ayothaya, and";
- mes "let them know how beautiful our";
- mes "land is. It was good to see you,";
- mes "take care now~";
- close;
-s_Busy:
- emotion e_wah;
- mes "[Mali the Spicy]";
- mes "Ah...!";
- mes "So busy, so busy!";
- mes "My customers never get tired of";
- mes "the taste of my Tom Yum Goong!";
- mes "Heh heh heh~!";
- close;
-}
-
-ayothaya.gat,213,95,7 script Merchant 841,{
- if(tomyumgoong == 4)goto s_Chili;
-s_JumpBack:
- mes "[Merchant Thongdum]";
- mes "Hello there!";
- mes "Ever try a Chili before?";
- next;
- mes "[Merchant Thongdum]";
- mes "Despite its tiny appearance, it has a very strong flavor. It's also hot and spicy, so you should be careful when you eat one.";
- next;
- mes "[Merchant Thongdum]";
- mes "The people of Ayothaya enjoy sensational food with distinct, spicy flavors. In Ayothayan cuisine, we use things like Chilis, Garlics, Ginger and Cilantro.";
- next;
- mes "[Merchant Thongdum]";
- mes "I'm selling Chilis,";
- mes "so if you need any,";
- mes "please come to me~";
- close;
-s_Chili:
- if(countitem(7286) > 29)goto s_JumpBack;
- mes "[Merchant Thongdum]";
- mes "Hello, there~";
- mes "Are you looking for";
- mes "ingredients to make";
- mes "Tom Yum Goong?";
- next;
- mes "[Merchant Thongdum]";
- mes "Let's see...";
- mes "I'm selling chilis,";
- mes "fish sauce, and some";
- mes "spices and flavorings";
- mes "you'll need. I'll sell";
- mes "it all to you for 2,000 zeny.";
- next;
- menu "Thanks, I'll take it",s_Take,"It's a rip-off, man!",-;
-
- mes "[Merchant Thongdum]";
- mes "Don't say that.";
- mes "My prices are always";
- mes "reasonable. I want you to know";
- mes "that I'm a respectable Merchant.";
- close;
-
-s_Take:
- if(Zeny < 2000) goto s_NoZeny;
- set Zeny, Zeny - 2000;
- getitem 7286,30;
- mes "[Merchant Thongdum]";
- mes "Thank you.";
- mes "I hhope you will enjoy";
- mes "your Tom Yum Goong~";
- close;
-
-s_NoZeny:
-//custom dialogues
- emotion e_wah;
- mes "[Merchant Thongdum]";
- mes "Aw, you don't have enough zeny.";
- mes "Please come back when you do!";
- close;
-}
-
-ayothaya.gat,121,240,7 script Mr. Jun 842,1,1,{
- mes "[Mr. Jun]";
- mes "...";
- close;
-OnTouch:
- if(ayolemon == 2)end;
- if(ayolemon == 1)goto s_Again;
- if(tomyumgoong == 3)goto s_Lemon;
- end;
-s_Lemon:
- emotion e_hmm;
- mes "[Mr. Jun]";
- mes "Hello, there?";
- mes "Did you need";
- mes "some help...?";
- next;
- menu "I need some Lemons.",s_Quest,"No, thanks.",-;
-
- mes "[Mr. Jun]";
- mes "Feel free to";
- mes "ask me for help";
- mes "any time, okay?";
- close;
-
-s_Quest:
- mes "[Mr. Jun]";
- mes "Umm...";
- mes "Lemons?";
- mes "As you see, I have plenty";
- mes "of Lemons on my tree";
- mes "Do you really need some?";
- next;
- menu "Yes, I will pay you.",s_Pay,"No, thanks.",-;
-
- mes "[Mr. Jun]";
- mes "Hmm...";
- mes "Now what can";
- mes "I possibly do";
- mes "with all these";
- mes "Lemons?";
- close;
-
-s_Pay:
- mes "[Mr. Jun]";
- mes "I started growing this Lemon tree as a hobby, but I didn't expect to have such a good havest of sweet, succulent Lemons.";
- next;
- mes "[Mr. Jun]";
- mes "Did you just say you were going to pay me for the Lemons? Oh, you've got me wrong. I don't intend to sell these.";
- next;
- mes "[Mr. Jun]";
- mes "But...";
- mes "I'm more than willing";
- mes "to share some of them with";
- mes "you, but only if you can...";
- next;
- mes "[Mr. Jun]";
- mes "Play a small game with me!";
- mes "How about that? I've been so bored";
- mes "to death. Even an old man like me";
- mes "needs to enjoy himself!";
- next;
- mes "[Mr. Jun]";
- mes "Hahahaha~!";
- mes "What do you say?";
- mes "Would you like to try?";
- next;
- menu "Sure, why not!",s_Game,"No, thanks.",-;
-
- mes "[Mr. Jun]";
- mes "Afraid are we?";
- mes "There's no fooling you:";
- mes "I'm one of the best at games!";
- close;
-
-s_Again:
-//custom dialogues
- mes "[Mr. Jun]";
- mes "Oh, you're back!";
- mes "Would you like to try again?";
- next;
- menu "Yeah, I'm going to beat you.",s_Game4,"Nah, I just passed by.",-;
-
- mes "[Mr. Jun]";
- mes "Ha ha ha!";
- mes "Come back when you think you can beat me.";
- close;
-s_Game:
- mes "[Mr. Jun]";
- mes "Good!";
- mes "The game I want us to play is an easy children's game.";
- next;
- mes "[Mr. Jun]";
- mes "^6B1312Rock,";
- mes "^6B1312Paper, Scissors!";
- mes "Perhaps you've heard";
- mes "of it in your land.";
- next;
- mes "[Mr. Jun]";
- mes "Nuh-uh, don't look at me like that.";
- mes "I'm an old man, and I want to play this game re-live my youth a little bit. You'll understand when you're my age.";
- next;
- mes "[Mr. Jun]";
- mes "Alright, if you win";
- mes "^3C2EE63^000000 out of ^3C2EE65^000000 matches,";
- mes "The lemons are yours.";
- mes "Are you ready?";
- next;
-s_Game4:
- mes "[Mr. Jun]";
- mes "Okay...";
- mes "As you kids say,";
- mes "^6B1312Let's get eXtreme!";
-s_Game3:
- next;
- mes "[Mr. Jun]";
- mes "Rock!";
- mes "Paper!";
- mes "Scissors!";
-s_Game2:
- next;
- menu "Rock",s_Rock,"Paper",s_Paper,"Scissors",s_Scissors;
-
-s_Rock:
- set @npcvar,rand(1,3);
- set @playervar,1;
- next;
- goto s_Play;
-s_Paper:
- set @npcvar,rand(1,3);
- set @playervar,2;
- next;
- goto s_Play;
-s_Scissors:
- set @npcvar,rand(1,3);
- set @playervar,3;
- next;
- goto s_Play;
-s_Play:
- if(@playervar == 1 && @npcvar == 1)goto s_RockRock;
- if(@playervar == 1 && @npcvar == 2)goto s_RockPaper;
- if(@playervar == 1 && @npcvar == 3)goto s_RockScissors;
- if(@playervar == 2 && @npcvar == 1)goto s_PaperRock;
- if(@playervar == 2 && @npcvar == 2)goto s_PaperPaper;
- if(@playervar == 2 && @npcvar == 3)goto s_PaperScissors;
- if(@playervar == 3 && @npcvar == 1)goto s_ScissorsRock;
- if(@playervar == 3 && @npcvar == 2)goto s_ScissorsPaper;
- if(@playervar == 3 && @npcvar == 3)goto s_ScissorsScissors;
-s_RockRock:
- emotion e_rock;
- emotion 11,1;
- goto s_Draw;
-s_RockPaper:
- emotion e_paper;
- emotion 11,1;
- goto s_Lose;
-s_RockScissors:
- emotion e_scissors;
- emotion 11,1;
- goto s_Win;
-s_PaperRock:
- emotion e_rock;
- emotion 12,1;
- goto s_Win;
-s_PaperPaper:
- emotion e_paper;
- emotion 12,1;
- goto s_Draw;
-s_PaperScissors:
- emotion e_scissors;
- emotion 12,1;
- goto s_Lose;
-s_ScissorsRock:
- emotion e_rock;
- emotion 10,1;
- goto s_Lose;
-s_ScissorsPaper:
- emotion e_paper;
- emotion 10,1;
- goto s_Win;
-s_ScissorsScissors:
- emotion e_scissors;
- emotion 10,1;
- goto s_Draw;
-s_Draw:
- mes "[Mr. Jun]";
- mes "Hmpf.";
- mes "It's a draw";
- mes "One more time!";
- mes "Rock! Paper!";
- mes "Scissors!";
- goto s_Game2;
-s_Lose:
- mes "[Mr. Jun]";
- mes "Yes...!";
- mes "Oh my god, yes!";
- set @npcpoint,@npcpoint+1;
- if(@npcpoint == 3)goto s_Lose2;
- goto s_Game3;
-s_Win:
- set @playerpoint,@playerpoint+1;
- mes "[Mr. Jun]";
- if(@playerpoint == 1)mes "Noooo...! This cannot be!";
- if(@playerpoint == 2)mes "What...? I don't believe it! Bah.. !";
- if(@playerpoint == 3)mes "No...! Sacrilege!";
- if(@playerpoint == 3)goto s_Win2;
- goto s_Game3;
-s_Lose2:
- if(ayolemon != 1)set ayolemon,1;
-//Custom Dialogues
- next;
- mes "[Mr. Jun]";
- mes "I won!";
- mes "Seems like I can keep up with the kids. Ha ha ha!";
- next;
- mes "[Mr. Jun]";
- mes "If you still want the lemons I'm up for another game. So please don't hesitate to come back.";
- set @playerpoint,0;
- set @npcpoint,0;
- close;
-s_Win2:
- next;
- mes "[Mr. Jun]";
- mes "You... won.";
- mes "I'm so exhausted.";
- mes "I guess I can't compete with you youngsters anymore. Ha ha ha!";
- next;
- mes "[Mr. Jun]";
- mes "As promised,";
- mes "I shall share some";
- mes "of my Lemons with you.";
- mes "Grab as many as you want!";
- next;
- set ayolemon,2;
- getitem 568,10;
- mes "^3C2EE6You have plucked";
- mes "^3C2EE610 Lemons from the tree.";
- next;
- emotion e_dots;
- mes "[Mr. Jun]";
- mes "Hmm...";
- mes "Looks like you need a lot of them.";
- mes "Oh well, that's fine with me. I had";
- mes "a good time with you.";
- next;
- mes "[Mr. Jun]";
- mes "Don't forget this though:";
- mes "Don't be selfish, and always share";
- mes "what you have with others. That's";
- mes "one of the most important values";
- mes "for human beings.";
- close;
+//===== Athena Script =======================================
+//= Quest NPCs related to Ayothaya
+//===== By ================================================
+//= Fredzilla
+//===== Version ===========================================
+//= 1.6
+//===== Compatible With ===================================
+//= eAthena 1.0
+//===== Description =======================================
+//= Ayothaya Clue Quest, Ayothaya Shrimp Quest, Ayothaya
+//= Dungeon Quest, Tom Yum Goong Quest,
+//===== Comments ==========================================
+//= List or Variables used
+//= @fishing - Checks for if you have caught a fish or not,
+//= 1/10 chance you will get the wedding ring if
+//= you have started that quest.
+//= weddingring - Signifies the start of the wedding ring
+//= quest, and used throughout to keep track of
+//= progress.
+//= recoveredring - Signifies you have retrieved the ring
+//= and therefore can't just drop the ring and
+//= get the same quest again.
+//= 1.0 - First Release, made with infomation from RagnaInfo
+//= 1.1 - added anti-novice protection [Lupus]
+//= 1.3 - Fixed exploit [Lupus]
+//= 1.4 Updated, more close to the official. Thanks to birkiczd
+//= Also optimized it again, remove unused global variable [Lupus]
+//= 1.5 Removed Duplicates [Silent]
+//= 1.6 Moved quests from cities/ to here:
+//= Shrimp, Dungeon, Tom Yum Goong [Evera]
+//=========================================================
+
+//============================================================
+//============================================== Ayothaya Clue
+//====================================================== Quest
+ayo_dun02.gat,277,178,1 script OBB 139,4,4,{
+ if(AyoOBB==1 || weddingring!=3) end;
+ mes "["+strcharinfo(0)+"]";
+ mes "Huh what is this?, not foot prints, this is an Old Blue coloured Box";
+ next;
+ set AyoOBB,1;
+ getitem 603,1;
+ logmes "Q_AYOTH1: got OBB";
+ mes "["+strcharinfo(0)+"]";
+ mes "I think I will keep it";
+ close;
+}
+//Dungeon 1 foot prints x 5
+ayo_dun01.gat,30,149,1 script Clue#01 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "There are some foot prints here, they head off to the East.";
+ set @footprints1,1;
+ close;
+}
+ayo_dun01.gat,70,149,1 script Clue#02 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "There are some more foot prints, they are heading off to the East too!";
+ set @footprints2,1;
+ close;
+}
+ayo_dun01.gat,100,149,1 script Clue#03 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "More foot prints heading to the East, who do they belong too?";
+ set @footprints3,1;
+ close;
+}
+ayo_dun01.gat,190,149,1 script Clue#04 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "More foot prints, but these are going North.";
+ set @footprints4,1;
+ close;
+}
+ayo_dun01.gat,261,263,1 script Clue#05 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "There are some foot prints, they seem to head into that hole there.";
+ set @footprints5,1;
+ close;
+}
+
+//Dungeon 2 foot prints x 4 + 1 fake
+ayo_dun02.gat,222,204,1 script Clue#06 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "Yet more foot prints, they are either going South or West.";
+ set @footprints6,1;
+ close;
+}
+ayo_dun02.gat,169,212,1 script Clue#07 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "Looks like there are foot print going to the West.";
+ set @footprints7,1;
+ close;
+}
+ayo_dun02.gat,129,212,1 script Clue#08 139,5,5,{
+ if(weddingring!=3) end;
+ npctalk "Ok these foot prints are either going to the North or West.";
+ set @footprints8,1;
+ close;
+}
+ayo_dun02.gat,79,212,1 script Clue#09 139,7,7,{
+ if(weddingring!=3) end;
+ npctalk "These are very new, they are going North.";
+ set @footprints9,1;
+ close;
+}
+//FAKE
+ayo_dun02.gat,245,166,1 script Clue#10 139,7,7,{
+ if(weddingring!=3) end;
+ npctalk "Seems something came by this way, to the East.";
+ close;
+}
+
+ayothaya.gat,233,105,7 script Shuda 838,{
+ mes "[Shuda]";
+ if(BaseLevel<50) {
+ mes "Where is my ring!?!";
+ close;
+ }
+ if(weddingring==2) goto L_Quest2;
+ if(weddingring==3) goto L_OnQ2;
+ if(weddingring==4) goto L_QuestComplete;
+ if(weddingring==5) goto L_QuestOver;
+ if(countitem(7288)>=1) goto L_RingFound;
+ mes "Oh please wont you help me, my partner has gone missing, but not before droping our ^FF0000Engagement Ring^000000 maybe there is a way of ^0000FFfishing^000000 it out of the sea.";
+ set weddingring,1;
+ close;
+L_RingFound:
+ mes "Oh is that my ring!?!";
+ next;
+ mes "[Shuda]";
+ mes "Can I please have it back?";
+ next;
+ menu "Yes, here you go",N_Yes,"No, I found it, it's mine",-;
+ mes "[Shuda]";
+ mes "Think what you want, but that ring is mine, and without it I can never marry my true love.";
+ mes "";
+ mes "Where ever he may be.";
+ close;
+N_Yes:
+ mes "[Shuda]";
+ if(countitem(7288)<1) {
+ mes "Go away, cheater!";
+ close;
+ }
+ delitem 7288,1;
+ mes "Thank you so much, now I have this back maybe my partner will return.";
+ set weddingring,2;
+ next;
+ mes "[Shuda]";
+ mes "Come back to me when you have time, I need you to do something else for me.";
+ close;
+L_Quest2:
+ mes "It seems even though I have my ring back my partner ^FF0000Annon^000000 doesn't seem to want to come back to me";
+ mes "Maybe he has gotten lost somewhere";
+ mes "";
+ mes "Will you please go and look for him";
+ next;
+ menu "Yes, I would be glad to",L_YesQ2,"No, he will come back on his own",-;
+ mes "[Shuda]";
+ mes "Well he might, but I still need someone to find him, I am afraid something might have happened to him.";
+ close;
+L_YesQ2:
+ set weddingring,3;
+ mes "[Shuda]";
+ mes "Oh thank you so much, I think someone in the town might have seen where he went, maybe he can give you a clue";
+ close;
+L_OnQ2:
+ mes "Have you been able to find my love yet?";
+ mes " ";
+ mes "Please hurry.";
+ mes "*tear*";
+ close;
+L_QuestComplete:
+ mes "You have found him ?!?";
+ mes "Then where is he???";
+ next;
+ mes "You explain the situation.";
+ next;
+ mes "[Shuda]";
+ mes "Well, I thought he was my one.";
+ mes "I don't think I will ever find another like him.";
+ mes "*tear*";
+ next;
+ set weddingring,5;
+ mes "[Shuda]";
+ mes "I can understand, but why not come and talk to me about it, we might have been able to talk it out.";
+ close;
+L_QuestOver:
+ mes "Nice to see you again "+strcharinfo(0)+". How have you been?";
+ close;
+}
+
+ayothaya.gat,253,99,3 script Fisherman#01 843,{
+ mes "[Dannai]";
+ mes "This place is known to be teeming with fish. The fish here tend to eat anything they find, so it's easy to catch them.";
+ next;
+ mes "[Dannai]";
+ mes "We are providing a fishing rod rental service. Every time you fish, you'll need ^4466771 Monster's Food^000000 to use as bait, and pay a rod rental fee of ^44667750 Zeny^000000.";
+ next;
+ mes "[Dannai]";
+ mes "Would you";
+ mes "like to try?";
+ next;
+ menu "Yes",-,"No",L_No;
+ if(countitem(528) < 1 || zeny < 50) goto L_Fail;
+ delitem 528,1;
+ set zeny,zeny-50;
+ mes "[Fisher Man]";
+ mes "Ok give it a good swing.";
+ mes "Lets see if you got anything.";
+ next;
+ set @fishing, rand(1,10);
+ mes "[Fisher Man]";
+ if(@fishing<5) goto L_Nothing;
+ if(@fishing<10) goto L_Fish;
+ if(@fishing==10) goto L_RingCheck;
+L_No:
+ mes "[Dannai]";
+ mes "Come back anytime.";
+ close;
+L_Fail:
+ mes "[Dannai]";
+ mes "Seems you don't have what I need";
+ mes "Come back when you have some Monster Feed, and 50 zeny.";
+ close;
+L_Nothing:
+ mes "Sorry it seems like you didn't get anything, try again anytime.";
+ close;
+L_Fish:
+ getitem 544,1;
+ mes "Look at this you got yourself a fish, well done.";
+ close;
+L_RingCheck:
+ if(weddingring!=1 || recoveredring==1) goto L_Fish;
+ mes "What is this, some sort of ring!!!";
+ mes "Well I guess since you fished it out you can keep it";
+ next;
+ getitem 7288,1;
+ mes "[Fisher Man]";
+ mes "Come back anytime";
+ set weddingring,0;
+ set recoveredring,1;
+ close;
+}
+
+ayothaya.gat,192,171,4 script Old Man#10 824,{
+ mes "[Tham]";
+ if(weddingring==3) goto L_OnQ2;
+ mes "What a nice day it is today, don't you agree?";
+ close;
+L_OnQ2:
+ mes "What! Annon is missing, I only saw him a few minutes ago.";
+ next;
+ mes "[Tham]";
+ mes "He was heading for Ayothaya's dungeon, I thought this kind of odd, and now you say he hasn't come back?!?";
+ mes "I think you should follow him in there, just in case something has happened to him";
+ next;
+ mes "[Tham]";
+ mes "Maybe he has left something inside the dungeon, something that can lead you to him";
+ mes "But thats just me";
+ next;
+ mes "[Tham]";
+ mes "You can get to the dungeon through the old temple, it is one map to the right of here, and down the hill.";
+ close;
+}
+
+ayo_dun02.gat,91,264,4 script Guy 822,{
+ if(weddingring==4) goto L_QuestComplete;
+ if(weddingring==5) goto L_TalkedShuda;
+ if(weddingring==3 && @footprints1==1 && @footprints2==1 && @footprints3==1 && @footprints4==1 && @footprints5==1 && @footprints6==1 && @footprints7==1 && @footprints8==1 && @footprints9==1) goto L_Groom;
+ mes "[Guy]";
+ mes "She won't find me here,she won't...";
+ close;
+L_Groom:
+
+ mes "[Annon]";
+ mes "Help me please...";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "^He seems to be injured very bad...";
+ next;
+ menu "Treat his wounds",-,"Leave him alone",L_Go;
+ if(countitem(504) < 1) goto L_Need;
+ delitem 504,1;
+ mes "[Annon]";
+ mes "Who are you";
+ mes "Have you been sent to follow me?";
+ next;
+ mes "[Annon]";
+ mes "So I see now, my ex-partner has sent you to see if I'm OK.";
+ mes " ";
+ mes "Can you go and tell her I'm ok, but I cant go through with the marriage.";
+ next;
+ mes "[Annon]";
+ mes "I cant really give a reason, just tell her that I love her, but not enough to spend the rest of my life with her.";
+ next;
+ mes "[Annon]";
+ mes "I hope she will understand.";
+ mes " ";
+ mes "I guess you will want something in return.";
+ next;
+ mes "[Annon]";
+ mes "I can train you, and make you gain some exp.";
+ mes " ";
+ mes "I will do this now.";
+ next;
+ set BaseExp,BaseExp+100000;
+ set weddingring,4;
+ mes "[Annon]";
+ mes "It is done, please make you way back to Shuda, and please try not to make her cry";
+ close;
+L_Need:
+ mes "["+strcharinfo(0)+"]";
+ mes "I need a White potion to be able to cure him.";
+ close;
+L_Go:
+ mes "["+strcharinfo(0)+"]";
+ mes "Someone else will probably find him.I have other things to do.";
+ close;
+L_QuestComplete:
+ mes "[Annon]";
+ mes "Have you seen Shuda yet?";
+ close;
+L_TalkedShuda:
+ mes "[Annon]";
+ mes "Did she take it OK?";
+ close;
+}
+
+//============================================================
+//============================================ Ayothaya Shrimp
+//====================================================== Quest
+ayothaya.gat,203,169,3 script Noi 839,{
+ mes "[Noi]";
+ mes "Welcome to Ayothaya.";
+ mes "Out beautiful village is built above the water, surrounded by a dense forest.";
+ next;
+ mes "[Noi]";
+ mes "There are many tourist attractions in this village, that you won't be able to find anywhere else. Out fish markets and the unique architecture of our buildings is enough reason to visit Ayothaya.";
+ next;
+ mes "[Noi]";
+ mes "Please feel free";
+ mes "to take a look around.";
+ next;
+ menu "Building Locations.",s_Loc,"Remove marks from mini-map.",s_Remo,"Cancel.",-;
+
+ mes "[Noi]";
+ mes "Please enjoy";
+ mes "your travels.";
+ close;
+s_Loc:
+ mes "[Noi]";
+ mes "Where would";
+ mes "you like to visit?";
+ next;
+ menu "Weapon Shop",s_Weap,"Tool Shop",s_Tool,"Tavern",s_Tavern,"Shrine",s_Shrine,"Fishing Spot",s_Fish,"Cancel",-;
+
+ mes "[Noi]";
+ mes "If you wish to remove location marks on your mini-map, please select the 'Remove marks from mini-map' command from the menu.";
+ close;
+
+s_Weap:
+ mes "[Noi]";
+ mes "At our Weapon Shop,";
+ mes "you will find great weapons favored by brave Ayothayan seafarers.";
+ next;
+ mes "[Noi]";
+ mes "Our weapon shop is located at ^00FF00+^000000.";
+ viewpoint 1,166,90,1,0x00FF00;
+ close;
+
+s_Tool:
+ mes "[Noi]";
+ mes "We Ayothayans always make sure we have everything we need before we go traveling. It never hurts to be prepared, does it?";
+ next;
+ mes "[Noi]";
+ mes "Our Tool Shop";
+ mes "is located at ^0000FF+^000000.";
+ viewpoint 1,128,86,2,0x0000FF;
+ close;
+
+s_Tavern:
+ mes "[Noi]";
+ mes "One of the basics of adventuring is gathering information, or at least that's what they say. You can meet people from all sorts of places in the Tavern. I'm sure you can earn something useful there.";
+ next;
+ mes "[Noi]";
+ mes "Of course, you must";
+ mes "drop by our Tavern.";
+ mes "It is located at ^FFFF00+^000000.";
+ viewpoint 1,229,70,3,0xFFFF00;
+ close;
+
+s_Shrine:
+ mes "[Noi]";
+ mes "If you wish to pray to God, or achieve a state of peace in your mind, why don't you visit our Shrine? Even if it's just for sight-seeing, everyone is welcome there.";
+ next;
+ mes "[Noi]";
+ mes "Our shrine";
+ mes "is located at^880088+^000000.";
+ viewpoint 1,207,284,4,0x880088;
+ close;
+s_Fish:
+ mes "[Noi]";
+ mes "Since Ayothaya was built above the surface of the water and so close to a beach, it's been a favorite spot for fishermen. Why don't you catch some for dinner at the Fishing Spot?";
+ next;
+ mes "[Noi]";
+ mes "Our famous";
+ mes "Fishing Spot";
+ mes "is located at ^AFAFAF+^000000.";
+ viewpoint 1,251,97,5,0xAFAFAF;
+ close;
+s_Remo:
+ viewpoint 2,166,90,1,0x00FF00;
+ viewpoint 2,128,86,2,0x0000FF;
+ viewpoint 2,229,70,3,0xFFFF00;
+ viewpoint 2,207,284,4,0x880088;
+ viewpoint 2,251,97,5,0xAFAFAF;
+ mes "[Noi]";
+ mes "Alright...";
+ mes "I've removed all the location marks from your mini-map.";
+ mes "Thank you.";
+ close;
+}
+
+ayothaya.gat,153,86,4 script Thongpool 843,{
+ if(ayoshrimps == 1)goto s_Shrimp2;
+ if(tomyumgoong == 2)goto s_Shrimp;
+ mes "[Thongpool]";
+ mes "Welcome, welcome!";
+ mes "I've got the best Shrimp caught in the cleanest waters in the world~!";
+ close;
+s_Shrimp:
+ mes "[Thongpool]";
+ mes "Come adventurers,";
+ mes "take a look! I have";
+ mes "plenty of Shrimp!";
+ next;
+ mes "[Thongpool]";
+ mes "You're looking for Shrimp,";
+ mes "aren't you? How many Shrimps";
+ mes "do you need? Twenty Forty?";
+ next;
+ menu "I need Shrimp for Tom Yum Goong.",s_Tom,"Err, they look expensive.",-;
+
+ mes "[Thongpool]";
+ mes "What...?";
+ mes "Do you think";
+ mes "it's expensive?";
+ mes "But the fantastic taste";
+ mes "of Tom Yum Goong";
+ mes "is priceless!";
+ close;
+s_Tom:
+ mes "[Thongpool]";
+ mes "Ah! I guess Ms. Mali the Spicy recommended me to you. I guess that also means you want to buy them in bulk?";
+ next;
+ mes "[Thongpool]";
+ mes "After all,";
+ mes "you'll need a larger";
+ mes "amount of Shrimp to";
+ mes "cook Tom Yum Goong.";
+ next;
+ mes "[Thongpool]";
+ mes "Oh yes, you will need 20 Shrimps for Ms. Mali's Tom Yum Goong.";
+ mes "I even give you a discount:";
+ mes "11,000 zeny for 20 shrimps.";
+ mes "What do you say?";
+ next;
+ menu "I'll take them.",s_Take,"I could get 100 Jellopies for that much!",-;
+
+ mes "[Thongpool]";
+ mes "Well well well...";
+ mes "You might your hungry stomach with that many Jellopies but they wouldn't taste as good as my Shrimp!";
+ close;
+
+s_Take:
+ if(Zeny < 11000) goto s_NoZeny;
+ set Zeny, Zeny - 11000;
+ getitem 567,20;
+ emotion e_no1;
+ mes "[Thongpool]";
+ mes "Good, now you have the freshest Shrimp in this village!";
+ mes "It's time for you to go back and ask Ms. Mali to cook them for you.";
+ if(ayoshrimps < 1)set ayoshrimps,1;
+ close;
+
+s_NoZeny:
+ mes "[Thongpool]";
+ mes "Awww...";
+ mes "You don't have";
+ mes "enough money.";
+ close;
+
+s_Shrimp2:
+ mes "[Thongpool]";
+ mes "Mmm...?";
+ mes "Did you need more Shrimps?";
+ mes "Would you like to buy more?";
+ next;
+ menu "Yes!",s_Take,"No, thanks.",-;
+
+ mes "[Thongpool]";
+ mes "I see...";
+ mes "If you need some shrimps, just tell me!";
+ close;
+}
+
+//============================================================
+//=========================================== Ayothaya Dungeon
+//====================================================== Quest
+ayothaya.gat,83,132,7 script Dusit 843,{
+ if(ayodunquest == 1 || ayodunquest == 2 || ayodunquest == 3)goto s_Dun;
+ mes "[Dusit]";
+ mes "Oh...!";
+ mes "You must be a traveller.";
+ mes "I have a tale you may wish to hear if you're interested in listening.";
+ next;
+ menu "What is it?",s_What,"I know what the story is.",-;
+
+ mes "[Dusit]";
+ mes "You do now?";
+ mes "Then be careful!";
+ mes "It'll eat you alive!";
+ close;
+s_What:
+ mes "[Dusit]";
+ mes "Ayothaya has a long history. Perhaps it looks calm and peaceful now, but in the past our village was terrorized bu a terrible creature.";
+ next;
+ mes "[Dusit]";
+ mes "This beast is known to us as the ^6B1312Sa-mhing Tiger^000000, which used to dwell deep in the ancient ruins.";
+ next;
+ mes "[Dusit]";
+ mes "The Sa-mhing Tiger is addicted to the taste of human flesh. It has been known to transform into the shape of a person it has eaten in order to lure out his family and friends.";
+ next;
+ mes "[Dusit]";
+ mes "The local people are still afraid that the creature might transform into someone they know, and sneak into their homes to eat them.";
+ next;
+ mes "[Dusit]";
+ mes "However there is one way you can identify the Sa-mhing Tiger from a human being. Since it's a tiger, it cannot do some of the things humans are taught to do, such as light a match.";
+ next;
+ mes "[Dusit]";
+ mes "So, if by chance you see a friend acting strangely all of a sudden, ask him to strike a match. Make sure he is not the Sa-mhing Tiger.";
+ next;
+ mes "[Dusit]";
+ mes "However...";
+ mes "I'm not sure if this actually works or not. I guess the best thing to do is just run for your life if you even suspect someone of being the Sa-mhing Tiger.";
+ next;
+ mes "[Dusit]";
+ mes "Do you blieve";
+ mes "in the existance";
+ mes "of man-eating tigers?";
+ next;
+ menu "Well, not really.",-,"Yes, I do and I think they're scary!",s_Yes;
+
+ mes "[Dusit]";
+ mes "Umm...";
+ mes "Oh well. My late grandfather told me about the Sa-mhing Tiger when I was a little kid. Of course, I haven't seen it.";
+ next;
+ mes "[Dusit]";
+ mes "The closest thing I've seen to the Sa-mhing Tiger was a golden cat with a bell. Somehow, I don't think it ate men.";
+ close;
+s_Yes:
+ mes "[Dusit]";
+ mes "Run for your life if you ever encounter the Sa-mhing Tiger! It'll eat you alive!";
+ next;
+ mes "[Dusit]";
+ mes "If you're interested in finding more about the story, I can introduce you to someone who knows that creature more than anyone else.";
+ next;
+ mes "[Dusit]";
+ mes "Why don't you talk to Boonthom? He's a pretty strange person, but there's something about him...";
+ next;
+ mes "[Dusit]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Dusit]";
+ mes "Ah well, you'll see what I'm talking about. I hope he'll help you learn more about that evil creature.";
+ set ayodunquest,1;
+ close;
+s_Dun:
+ mes "[Dusit]";
+ mes "How are you?";
+ mes "If you're interested in the Sa-mhing Tiger, please to talk to Boonthom.";
+ next;
+ mes "[Dusit]";
+ mes "But beware!";
+ mes "The Sa-mhing Tiger might be closer to you than you expect!";
+ close;
+}
+
+ayo_in01.gat,181,193,4 script Shaman 840,{
+ if(ayodot == 8)goto s_Check2;
+ if(ayodot == 7 && countitem(7285) > 0)goto s_ICheck;
+ if(ayodot == 6 && countitem(7285) > 0)goto s_Holier;
+ if(ayodunquest == 3)goto s_Lose;
+ if(ayodunquest == 2)goto s_Items;
+ if(ayodunquest == 1)goto s_Quest;
+ mes "[Boonthom]";
+ mes "I'm sorry I can't talk to you.";
+ mes "I'm very busy right now.";
+ close;
+s_Quest:
+ mes "[Boonthom]";
+ mes "You...!";
+ mes "Isn't it...!";
+ mes "Ooooooohhhhhhh!";
+ next;
+ mes "[Boonthom]";
+ mes "Oh...?";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Boonthom]";
+ mes "Never mind.";
+ mes "Hah! I've lost my train of thought.";
+ next;
+ mes "[Boonthom]";
+ mes "So have you come to me to seek help? I can see the fear in your eyes. Let me gaze into your soul, and see what your fear is for myself. Hmmm...";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Boonthom]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Boonthom]";
+ mes "What...!";
+ mes "I see that you dread the Sa-mhing Tiger! I haven't heard any news of that monster for a long time...";
+ next;
+ mes "[Boonthom]";
+ mes "A long time ago, the Sa-mhing Tiger really did roam the village and ate innocent people.";
+ next;
+ mes "[Boonthom]";
+ mes "However, its terror was brought to an end when it was finally captured. I was one of those involved in capturing the Sa-mhing Tiger.";
+ next;
+ mes "[Boonthom]";
+ mes "I insisted on killing it, but the other people were too afraid to do so. Instead, the Sa-mhing Tiger was locked in a cave inside of the ancient ruins.";
+ next;
+ mes "[Boonthom]";
+ mes "I believe that was at least 10 years ago. Perhaps it's already dead by now. However, no one knows how powerful the tiger truly is. It may still be alive.";
+ next;
+ mes "[Boonthom]";
+ mes "I don't think we need to worry about it though. It is locked up and there it shall remain.";
+ next;
+ menu "I want to explore the ancient ruins.",s_Explore,"Locked up! Good! I'm not afraid!",-;
+
+ mes "[Boonthom]";
+ mes "Hmmm...";
+ mes "Not afraid";
+ mes "of it, are you?";
+ next;
+ mes "[Boonthom]";
+ mes "..........";
+ mes "..........";
+ close;
+s_Explore:
+ mes "[Boonthom]";
+ mes "You...";
+ mes "You are strange.";
+ mes "You want to explore the ancient ruins. Do all the adventurers disregard their safety like that?";
+ next;
+ mes "[Boonthom]";
+ mes "It's your choice. But remember, it is very dangerous to go through the path to the center of the building.";
+ mes "Usually, I forbid it.";
+ next;
+ mes "[Boonthom]";
+ mes "But if you want to go in, I can give you some useful tips.";
+ mes "Would you like to listen?";
+ next;
+ menu "If it's that dangerous I'd rather not try",-,"Sure!",s_Sure;
+
+ mes "[Boonthom]";
+ mes "You made a good decision.";
+ mes "You'd better be careful if you want to stay alive.";
+ close;
+s_Sure:
+ mes "[Boonthom]";
+ mes "Umm, okay.";
+ mes "Since you're";
+ mes "that interested...";
+ next;
+ mes "[Boonthom]";
+ mes "If you wish to enter the ancient building, you must have protection against evil spirits and malice.";
+ next;
+ mes "[Boonthom]";
+ mes "There are many ghosts and demons within the cave, and they will attack people who do not possess holy power... Like you.";
+ next;
+ mes "[Boonthom]";
+ mes "I can make you an object";
+ mes "containing this holy power if you wish. In order to make it, I will need some materials.";
+ next;
+ mes "[Boonthom]";
+ mes "^4466771 Needle Packet^000000,";
+ mes "^4466771 Spool^000000,";
+ mes "^4466771 Solid Husk^000000 and";
+ mes "^4466771 Holy Water^000000...";
+ mes "That's all I need.";
+ next;
+ mes "[Boonthom]";
+ mes "Please come back";
+ mes "when you prepare all the materials.";
+ set ayodunquest,2;
+ close;
+
+s_Items:
+ if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems; //Pin Cusion, Spool, Hard Back Shell, Holy Water
+ delitem 7213,1; //Pin Cusion
+ delitem 7217,1; //Spool
+ delitem 7190,1; //Hard Back Shell
+ delitem 523,1; //Holy Water
+ mes "[Boonthom]";
+ mes "Excellent!";
+ mes "Now you have brought everything I need. Let me make the thing for you as promised...";
+ next;
+ mes "[Boonthom]";
+ mes "Ooooohmmmmm...";
+ next;
+ mes "[Boonthom]";
+ mes "Hmmmmmm...";
+ mes "Hmmmmmmmmm.";
+ next;
+ mes "[Boonthom]";
+ mes "Pffff pffff...";
+ next;
+ set ayodunquest,3;
+ getitem 7285,1; //Holy Threads
+ mes "[Boonthom]";
+ mes "Here you go.";
+ mes "Please take these holy threads.";
+ mes "With this, you will be able to enter the ruins with less worry.";
+ next;
+ mes "[Boonthom]";
+ mes "Even if you lose this, don't worry.";
+ mes "Just bring me the materials, and I will make you another one.";
+ next;
+ mes "[Boonthom]";
+ mes "The ancient building consists of 2 levels. Before you enter the 2nd underground level, please return to me so that I can tell you how to enter that place.";
+ close;
+
+s_NoItems:
+ mes "[Boonthom]";
+ mes "Did you forget what materials you need to create my object of holy power? Please listen carefully this time.";
+ next;
+ mes "[Boonthom]";
+ mes "^4466771 Needle Packet^000000,";
+ mes "^4466771 Spool^000000,";
+ mes "^4466771 Solid Husk^000000 and";
+ mes "^4466771 Holy Water^000000.";
+ next;
+ mes "[Boonthom]";
+ mes "See you later.";
+ close;
+
+s_Lose:
+ if(countitem(7285) > 0)goto s_NoItems2;
+ if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems2; //Pin Cusion, Spool, Hard Back Shell, Holy Water
+ //Custom Dialogues
+ mes "[Boonthom]";
+ mes "Oh, you have all the items I require to make holy threads.";
+ next;
+ mes "[Boonthom]";
+ mes "Would you like to make one?";
+ next;
+ menu "Yes please.",s_Yes,"No I'm fine.",-;
+
+ mes "[Boonthom]";
+ mes "See you later then.";
+ close;
+s_Yes:
+ if(countitem(7213) < 1 || countitem(7217) < 1 || countitem(7190) < 1 || countitem(523) < 1)goto s_NoItems2; //Pin Cusion, Spool, Hard Back Shell, Holy Water
+ delitem 7213,1; //Pin Cusion
+ delitem 7217,1; //Spool
+ delitem 7190,1; //Hard Back Shell
+ delitem 523,1; //Holy Water
+ getitem 7285,1; //Holy Threads
+ mes "[Boonthom]";
+ mes "All right, here are your holy threads.";
+ mes "If you lose them, I'm still here to make some more.";
+ next;
+ mes "[Boonthom]";
+ mes "Good luck venturing down the dungeon.";
+ close;
+
+s_NoItems2:
+ mes "[Boonthom]";
+ mes "If you lose the holy threads, don't worry. I can make some more for you. Just gather the following items.";
+ next;
+ mes "[Boonthom]";
+ mes "^4466771 Needle Packet^000000,";
+ mes "^4466771 Spool^000000,";
+ mes "^4466771 Solid Husk^000000 and";
+ mes "^4466771 Holy Water^000000.";
+ next;
+ mes "[Boonthom]";
+ mes "See you later.";
+ close;
+s_Holier:
+ mes "[" + strcharinfo(0) + "]";
+ mes "I copied down this";
+ mes "message while exploring";
+ mes "the dungeon. Would you";
+ mes "take a look at this?";
+ next;
+ mes "[Stone Slate]";
+ mes "Do not enter the";
+ mes "2nd underground level";
+ mes "...is danger... You will";
+ mes "...encounter... tiger...";
+ next;
+ mes "[Stone Slate]";
+ mes "You must kill... In order to do...";
+ mes "Must... How to go... the 2nd";
+ mes "underground level...";
+ mes "You need more... Holy power... in";
+ mes "order to... Otherwise, it's";
+ mes "impossible...";
+ next;
+ mes "[Boonthom]";
+ mes "That was written by one of my";
+ mes "comrades who entered the ruins,";
+ mes "as he regretted letting the tiger";
+ mes "live, let it return";
+ next;
+ mes "[Boonthom]";
+ mes "If you were able to find this note,";
+ mes "you must have strong determination";
+ mes "to venture through the ruins.";
+ next;
+ mes "[Boonthom]";
+ mes "As you can guess from the";
+ mes "note, the 2nd underground level is";
+ mes "very very dangerous. You will need";
+ mes "holy threads that contains even more";
+ mes "holy protection.";
+ next;
+ mes "[Boonthom]";
+ mes "Now, go and gather some materials";
+ mes "so that I can create more powerful";
+ mes "holy threads for you.";
+ next;
+ mes "[Boonthom]";
+ mes "^4466772 Holy Water^000000,";
+ mes "^4466771 Yggdrasil Leaf^000000,";
+ mes "^4466772 Needle Packet^000000 and";
+ mes "^4466772 Spool^000000.";
+ next;
+ mes "[Boonthom]";
+ mes "Return to me";
+ mes "once you have";
+ mes "gathered everything.";
+ set ayodot,7;
+ close;
+s_ICheck:
+ if(countitem(523) < 2 || countitem(610) < 1 || countitem(7213) < 2 || countitem(7217) < 2)goto s_NEnoughItems;
+ if(ayodot == 8)goto s_Process;
+ mes "[Boonthom]";
+ mes "Hmmm~";
+ mes "You've brought";
+ mes "everything. Quite";
+ mes "the enthusiastic one,";
+ mes "aren't you?";
+ next;
+ mes "[Boonthom]";
+ mes "Ooooohmmmmm...";
+ next;
+ mes "[Boonthom]";
+ mes "Hmmmmmm...";
+ mes "Hmmmmmmmmm.";
+ next;
+ mes "[Boonthom]";
+ mes "Pffff pffff...";
+ next;
+s_Process:
+ if(countitem(523) < 2 || countitem(610) < 1 || countitem(7213) < 2 || countitem(7217) < 2)goto s_NEnoughItems;
+ delitem 523,2;
+ delitem 610,1;
+ delitem 7213,2;
+ delitem 7217,2;
+ getitem 7287,1;
+ if(ayodot != 8)set ayodot,8;
+ mes "[Boonthom]";
+ mes "Here you go.";
+ mes "Please take these holy threads.";
+ mes "With this, you will be able to";
+ mes "enter the ruins with less worry.";
+ next;
+ mes "[Boonthom]";
+ mes "Even if you lost this, don't worry.";
+ mes "Just bring me the materials, and";
+ mes "I will make you another one.";
+ close;
+s_NEnoughItems:
+ mes "[Boonthom]";
+ mes "Hmmm...?";
+ mes "Didn't I tell you";
+ mes "what I need to make";
+ mes "a more powerful";
+ mes "holy thread?";
+ next;
+ mes "[Boonthom]";
+ mes "^4466772 Holy Water^000000,";
+ mes "^4466771 Yggdrasil Leaf^000000,";
+ mes "^4466772 Needle Packet^000000 and";
+ mes "^4466772 Spool^000000.";
+ next;
+ mes "[Boonthom]";
+ mes "Return to me";
+ mes "with those items";
+ mes "And I will craft";
+ mes "more powerful holy";
+ mes "threads for you.";
+ close;
+s_Check2:
+ if(countitem(7285) < 1)goto s_Lose;
+ if(countitem(7287) < 1)goto s_LoseThreads;
+ mes "[Boonthom]";
+ mes "Those threads";
+ mes "will protect you";
+ mes "from the spiritual";
+ mes "dangers, but it's up";
+ mes "to you to defend yourself";
+ mes "from monster attacks, okay?";
+ close;
+s_LoseThreads:
+//Custom Dialogues
+ mes "[Boonthom]";
+ mes "I can feel the absence of holy power.";
+ mes "You lost the holier threads didn't you?";
+ next;
+ mes "[Boonthom]";
+ mes "But that's alright, I can make a new one";
+ mes "So... Do you want one?";
+ next;
+ menu "Yeah!",s_ICheck,"Nah",-;
+
+ mes "[Boonthom]";
+ mes "Come back anytime!";
+ close;
+}
+ayo_fild01.gat,129,197,7 script Puraim 842,{
+ if(countitem(7285) > 0)goto s_Dungeon; //Holy Threads
+ mes "[Puraim]";
+ mes "If I were you, I wouldn't even dare to approach";
+ mes "The ruins down over there.";
+ next;
+ mes "[Puraim]";
+ mes "Anyone who doesn't have the protection of a holy spirit will be easy game for the evil creatures living there. You'd be killed in no time at all!";
+ next;
+ mes "[Puraim]";
+ mes "Go back, adventurer.";
+ mes "If you wish to explore this area, you'd better show me some holy spirit.";
+ close;
+s_Dungeon:
+ mes "[Puraim]";
+ mes "Huh...?";
+ mes "I feel it!";
+ mes "I can feel the power of holiness!";
+ mes "It's coming from you!";
+ next;
+ mes "[Puraim]";
+ mes "I guess you can go ahead into the ruins. So that's what you want? To explore this aera?";
+ next;
+ mes "[Puraim]";
+ mes "I would suggest against coming inside. Even the local people fear this area.";
+ next;
+ mes "[Puraim]";
+ mes "If the Sa-mhing Tiger wasn't around, there would still be all the evil spirits in this place. Even with the holy threads, this place is still dangerous.";
+ next;
+ mes "[Puraim]";
+ mes "So what do you want to do? Do you still want to explore the area, adventurer?";
+ next;
+ menu "Yes",s_Yes,"No! I'm too afraid of the ruins now.",-;
+
+ mes "[Puraim]";
+ mes "Good decision!";
+ mes "As I expected, you're smart enough not to stupidly jeopardize your life.";
+ close;
+s_Yes:
+ mes "[Puraim]";
+ mes "Hmmm...";
+ mes "It seems you adventurers are tempted by the thrill of danger, or you've all got some death wish.";
+ next;
+ mes "[Puraim]";
+ mes "Oh well, that's none of my business. After all, you already have a holy spirit. Still, be careful. You might not want to go to the 2nd underground level of the ruins.";
+ next;
+ mes "[Puraim]";
+ mes "As you Rune-Midgardians say, 'curiousity killed the cat.' Anyway, go for it!";
+ next;
+ mes "[Puraim]";
+ mes "^3C2EE6He shoved you off the hill and you plummet like a rock.";
+ close2;
+ set @hpcheck,readparam(6)/10;
+ if(readparam(5) < @hpcheck)goto s_SetHp;
+ percentheal -10,0;
+s_Warp:
+ warp "ayo_fild02.gat",30,135;
+ end;
+s_SetHp:
+ set @hpcheck2,readparam(5)-1;
+ heal -@hpcheck2,0;
+ goto s_Warp;
+}
+
+ayo_dun01.gat,260,42,4 script LocationActivator 139,4,0,{
+ if(ayodot > 5)end;
+ if(countitem(7285) > 0)goto s_Dots;
+ end;
+s_Dots:
+ mes "- Holy threads in your pocket";
+ mes "suddenly started glowing. You felt";
+ mes "something is near you.-";
+ if(ayodot == 0)goto s_0;
+ if(ayodot == 1)goto s_1;
+ if(ayodot == 2)goto s_2;
+ if(ayodot == 3)goto s_3;
+ if(ayodot == 4)goto s_4;
+ if(ayodot == 5)goto s_5;
+ end;
+
+s_0:
+ viewpoint 1,198,164,1,0xFF0000;
+ viewpoint 1,87,16,2,0xFF0000;
+ viewpoint 1,268,215,3,0xFF0000;
+ viewpoint 1,147,274,4,0xFF0000;
+ viewpoint 1,99,118,5,0xFF0000;
+ viewpoint 1,16,188,6,0xFF0000;
+ stopnpctimer;
+ close;
+s_1:
+ viewpoint 1,87,16,2,0xFF0000;
+ viewpoint 1,268,215,3,0xFF0000;
+ viewpoint 1,147,274,4,0xFF0000;
+ viewpoint 1,99,118,5,0xFF0000;
+ viewpoint 1,16,188,6,0xFF0000;
+ close;
+s_2:
+ viewpoint 1,268,215,3,0xFF0000;
+ viewpoint 1,147,274,4,0xFF0000;
+ viewpoint 1,99,118,5,0xFF0000;
+ viewpoint 1,16,188,6,0xFF0000;
+ close;
+s_3:
+ viewpoint 1,147,274,4,0xFF0000;
+ viewpoint 1,99,118,5,0xFF0000;
+ viewpoint 1,16,188,6,0xFF0000;
+ close;
+s_4:
+ viewpoint 1,99,118,5,0xFF0000;
+ viewpoint 1,16,188,6,0xFF0000;
+ close;
+s_5:
+ viewpoint 1,16,188,6,0xFF0000;
+ close;
+}
+
+ayo_dun01.gat,198,164,4 script #invayo1 111,{
+
+ if(countitem(7285) < 1)end;
+ if(ayodot == 0)goto s_First;
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 1st part of the slate.";
+ close;
+
+s_First:
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 1st part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FFDo not enter the 2nd underground level.^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,1;
+ close;
+
+}
+
+ayo_dun01.gat,87,16,4 script #invayo2 111,{
+
+ if(countitem(7285) < 1)end;
+ if(ayodot == 1)goto s_First;
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 2nd part of the slate.";
+ close;
+
+s_First:
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 2nd part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FF...is danger... You wil....^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,2;
+ close;
+
+}
+
+ayo_dun01.gat,268,215,4 script #invayo3 111,{
+
+ if(countitem(7285) < 1)end;
+ if(ayodot == 2)goto s_First;
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 3rd part of the slate.";
+ close;
+
+s_First:
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 3rd part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FF...encounter...tiger....^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,3;
+ close;
+
+}
+
+ayo_dun01.gat,147,274,4 script #invayo4 111,{
+
+ if(countitem(7285) < 1)end;
+ if(ayodot == 3)goto s_First;
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 4th part of the slate.";
+ close;
+
+s_First:
+
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 4th part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FFYou must kill... In order to do... MUST ... How to go... the 2nd underground level...^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,4;
+ close;
+
+}
+
+ayo_dun01.gat,99,118,4 script #invayo5 111,{
+ if(countitem(7285) < 1)end;
+ if(ayodot == 4)goto s_First;
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 5th part of the slate.";
+ close;
+s_First:
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the 5th part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FFYou need more... Holy power... in order to...^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,5;
+ close;
+
+}
+
+ayo_dun01.gat,16,188,4 script #invayo6 111,{
+ if(countitem(7285) < 1)end;
+ if(ayodot == 5)goto s_First;
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the last part of the slate.";
+ close;
+s_First:
+ mes "^3C2EE6You find a piece of a stone slate with letters etched on it. It seems to be the last part of the slate.";
+ next;
+ mes "^3C2EE6It reads '^0000FFOtherwise, it's impossible...^3C2EE6' You are unable to read the rest of the message.";
+ set ayodot,6;
+ close;
+}
+
+ayo_dun01.gat,24,283,4 script #ayowarp 111,{
+ if(countitem(7287) < 1)goto s_NoEntry;
+ mes "^3C2EE6The holy threads emanate a powerful sense of safety and security. With the protection of holiness, you begin your descent into the 2nd level..";
+ close2;
+ set @ayodunwarp,rand(1,2);
+ if(@ayodunwarp == 2)goto s_2;
+ warp "ayo_dun02.gat",275,26;
+ end;
+s_2:
+ warp "ayo_dun02.gat",24,26;
+ end;
+s_NoEntry:
+ mes "^3C2EE6You find what seems to be the entrance to the 2nd level. However, you are filled with an overwhelming sense of dread. Somehow, you can't bring yourself to go down...";
+ close;
+}
+
+ayo_dun01.gat,23,283,4 duplicate(#ayowarp) #ayodupe1 111
+ayo_dun01.gat,25,283,4 duplicate(#ayowarp) #ayodupe2 111
+ayo_dun01.gat,26,283,4 duplicate(#ayowarp) #ayodupe3 111
+
+//============================================================
+//============================================== Tom Yum Goong
+//====================================================== Quest
+
+
+ayothaya.gat,196,265,3 script Einon 842,{
+ if(tomyumgoong == 5)goto s_Done;
+ if(tomyumgoong == 1 || tomyumgoong == 2 || tomyumgoong == 3 || tomyumgoong == 4)goto s_Resta;
+ mes "[Einon]";
+ mes "Do you know what the";
+ mes "most popular cuisine";
+ mes "of this village is?";
+ next;
+ mes "[Einon]";
+ mes "Ayothaya is world famous for its regional cuisine, but out of all Ayothayan dishes, '^3C2EE6Tom Yum Goong^000000' is the best.";
+ next;
+ mes "[Einon]";
+ mes "Tom Yum Goong is a type of soup that is very spicy. Try it once, and you will be amazed by its profound taste. Try it twice, and you will be enraptured by its tantalizing aroma.";
+ next;
+ mes "[Einon]";
+ mes "It's really one of the most delicious foods in the world!";
+ mes "Everyone in the world would would want to try this at least once in his lifetime. So, would you like to try some?";
+ next;
+ menu "Sure thing.",s_Sure,"No, thanks. I hate spicy food.",-;
+
+ mes "[Einon]";
+ mes "Oh I see...";
+ mes "However, when you";
+ mes "change your mind,";
+ mes "please come back.";
+ close;
+
+s_Sure:
+ mes "[Einon]";
+ mes "Okay...!";
+ mes "Now who would be best for preparing Tom Yum Goong for you?";
+ mes "Hmmmmm...";
+ next;
+ mes "[Einon]";
+ mes "Everyone in the village knows how to make it, but I recommend that you go visit ^0000FF Mali the Spicy^000000.";
+ next;
+ mes "[Einon]";
+ mes "She is the best cook when it comes to Tom Yum Goong!";
+ mes "Why don't you ask her to cook you some?";
+ set tomyumgoong,1;
+ close;
+s_Resta:
+ mes "[Einon]";
+ mes "Ah, you wanna know where ^0000FFMali the Spicy^000000 is?";
+ mes "Well, there's not too many places a cook would stay other than in a restaurant, right? Hahaha~";
+ close;
+s_Done:
+ mes "[Einon]";
+ mes "Golden Ayothaya...";
+ mes "Although I've grown";
+ mes "up in this village,";
+ mes "I still think my village";
+ mes "is magnificient and beautiful.";
+ next;
+ mes "[Einon]";
+ mes "What do you think?";
+ mes "Wouldn't you agree with me?";
+ close;
+}
+
+ayo_in01.gat,145,163,4 script Cook 839,{
+ if(tomyumgoong == 5)goto s_Busy;
+ if(ayopause == 1)goto s_Pause;
+ if(ayopause == 2)goto s_Pause2;
+ if(tomyumgoong == 4)goto s_Chilee;
+ if(tomyumgoong == 3)goto s_Lemons;
+ if(tomyumgoong == 2)goto s_Shrimp;
+ mes "[Mali the Spicy]";
+ mes "Hello, there!";
+ mes "I am called Mali the Spicy.";
+ mes "All of my dishes always amaze my customers with their tempting scents and deep flavors.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "I am especially proud of my ^3C2EE6Tom Yum Goong^000000, which is the best in the village. I suppose it's my fate to cook the greatest Tom Yum Goong ever.";
+ if(tomyumgoong == 1)goto s_Quest;
+ close;
+s_Quest:
+ next;
+ mes "[Mali the Spicy]";
+ mes "Oh I see...";
+ mes "You want me to cook Tom Yum Goong for you, don't you?";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Honestly, I've been really buse ever since I opened this restaurant. If you really wish to taste my Tom Yum Goong, would you do something for me?";
+ next;
+ menu "Sure!",s_Sure,"Eh... I dunno.",-;
+
+ mes "[Mali the Spicy]";
+ mes "I understand this might be difficult to do, but it's worth a try if you really want to taste the best Tom Yum Goong.";
+ close;
+
+s_Sure:
+ mes "[Mali the Spicy]";
+ mes "First, would you go get the ingredients to make Tom Yum Goong for me? I'll need some ^FF0000Shrimps^000000, ^FF0000Chilees^000000 and ^FF0000Lemons^000000.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Remember, Shrimp is the main ingredient of this dish. So, the fresher the Shrimp, the tastier your food will be.";
+ next;
+ menu "Where can I find them?",-;
+ mes "[Mali the Spicy]";
+ mes "I expected you to ask me that.";
+ mes "For shrimps, look around the beach. You should see a lot of them there.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "However, you might have a hard time finding them since you haven't done that before. So just buy some Shrimp from the guy who sells the freshest Shrimp around.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Hmmm...";
+ mes "If you mention";
+ mes "my name, that guy";
+ mes "might give you a discount";
+ next;
+ mes "[Mali the Spicy]";
+ mes "His name is ^0000FFThongpool^000000.";
+ mes "He will be somewhere around the village selling Shrimps. Go and ask him to give you 20 Shrimps to cook Tom Yum Goong.";
+ set tomyumgoong,2;
+ close;
+s_Shrimp:
+ if(countitem(567) > 19)goto s_EnoughShrimp;
+ mes "[Mali the Spicy]";
+ mes "Did you visit ^0000FFThongpool^000000?";
+ mes "He will be somewhere around the village selling Shrimps. Go and ask him to give you 20 Shrimps to cook Tom Yum Goong.";
+ close;
+
+s_EnoughShrimp:
+ delitem 567,20;
+ mes "[Mali the Spicy]";
+ mes "Ah you came back!";
+ mes "Now, let me see what";
+ mes "you've brought. Hmmm...";
+ mes "These are...";
+ next;
+ set ayopause,1;
+ set ayoshrimps,0;
+ emotion e_no1;
+ mes "[Mali the Spicy]";
+ mes "The freshest Shrimp that";
+ mes "I've been looking for!";
+ mes "With these big and fresh Shrimps,";
+ mes "I can cook the best Tom Yum Goong";
+ mes "for you! Thank you so much!";
+ next;
+ mes "[Mali the Spicy]";
+ mes "It will be a perfect food with the natural sweetness of the Shrimp, the sourness of Lemons and a little bit of fish sauce!";
+ next;
+s_Pause:
+ mes "[Mali the Spicy]";
+ mes "Oh... Right";
+ mes "But we only have Shrimp.";
+ mes "Now, I want you to bring me some ^FF0000Lemons^000000.";
+ next;
+ menu "Where can I find Lemons?",s_WLemon,"I hate sour food. I'd better quit!",-;
+
+ mes "[Mali the Spicy]";
+ mes "It's your call.";
+ mes "But remember...";
+ mes "The shimps might go bad while you're taking a rest.";
+ close;
+
+s_WLemon:
+ mes "[Mali the Spicy]";
+ mes "A few days ago, I saw a good";
+ mes "Lemon tree while taking a walk.";
+ mes "But this tree belongs to an";
+ mes "ordinary man who's not a Fruit Merchant.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "I'm not sure wheter or not he'd sell Lemons to you, but you can try, I guess.";
+ set ayopause,0;
+ set tomyumgoong,3;
+ close;
+s_Lemons:
+ if(countitem(568) > 9)goto s_EnoughLemon;
+ mes "[Mali the Spicy]";
+ mes "Alright...";
+ mes "I'm counting on you";
+ mes "to get the best Lemons";
+ mes "from the man who owns that tree.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Somehow, you've got";
+ mes "to get those high quality";
+ mes "Lemons so that I can make some Tom Yum Goong!";
+ close;
+s_EnoughLemon:
+ delitem 568,10;
+ emotion e_gasp;
+ mes "[Mali the Spicy]";
+ mes "Welcome back!";
+ mes "Wow, you came back";
+ mes "really fast! Okay, let me";
+ mes "see the Lemons";
+ mes "you brought?";
+ next;
+ set ayopause,2;
+ mes "[Mali the Spicy]";
+ mes "Wow, great!";
+ mes "These are really fresh Lemons!";
+ mes "How could you bring all of these by";
+ mes "yourself? Thanks for your trouble~";
+ next;
+s_Pause2:
+ mes "[Mali the Spicy]";
+ mes "Now, you should go buy";
+ mes "some ^FF0000Chilees^000000 and some";
+ mes "other materials in the market.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "When you talk";
+ mes "to the Merchants";
+ mes "in the Market, they";
+ mes "will know what you want.";
+ next;
+ menu "Okay, I'll be right back.",s_Okay,"Ah, I'm tired now. Let me take a rest first...",-;
+
+ mes "[Mali the Spicy]";
+ mes "It's your call.";
+ mes "But remember...";
+ mes "The Shrimps might go bad";
+ mes "while you're taking a rest.";
+ close;
+s_Okay:
+ mes "[Mali the Spicy]";
+ mes "See you in a bit~";
+ set ayopause,0;
+ set tomyumgoong,4;
+ close;
+s_Chilee:
+ if(countitem(7286) > 29)goto s_EnoughChilee;
+ mes "[Mali the Spicy]";
+ mes "Did you get the Chilees?";
+ mes "You should talk to the Merchants in the Market, they'll know what you want.";
+ close;
+s_EnoughChilee:
+ delitem 7286,30;
+ mes "[Mali the Spicy]";
+ mes "Now...";
+ mes "Everything is all set!";
+ mes "Before we start, let me";
+ mes "check the materials.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "^FF0000Shrimp^000000, ^FF0000Chilees^000000, ^FF0000Lemons^000000...";
+ mes "Fish sauce and other little";
+ mes "things...";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Perfect!";
+ mes "Shall we begin?";
+ next;
+ misceffect 125;
+ mes "^D0122C*Tuk*";
+ mes "^6F1E6A*Tup*";
+ mes "^357030*Puk*";
+ next;
+ misceffect 124;
+ mes "^D10C3A*Chop chop*";
+ mes "^DCB060*Tup tup tup*";
+ mes "^8CA7BA*Pu pu*";
+ next;
+ misceffect 23;
+ misceffect 135;
+ mes "^86733BTup tup ^396254chook";
+ mes "^486354chop chop";
+ mes "^BA0010Tup tup tup ^28842FPu pu";
+ next;
+ emotion e_omg;
+ misceffect 99;
+ misceffect 90;
+ mes "Wah^050158ah^241999ahhh^0F48CBhaaaahhh^000000!";
+ next;
+ mes "[Mali the Spicy]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ set tomyumgoong,5;
+ set ayoshrimps,0;
+ getitem 566,10;
+ emotion e_no1;
+ mes "[Mali the Spicy]";
+ mes "Here's your";
+ mes "Tom Yum Goong!";
+ mes "Ah~ This taste,";
+ mes "this scent... Yeah.";
+ mes "I know I did a good job.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Do you know what is the secret of Tom Yum Goong? It isn't simply just food. This has the power to heal you, and help you get into better shape.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Because...";
+ mes "It countains the";
+ mes "power of God.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Okay...!";
+ mes "I'm giving you";
+ mes "10 Tom Yum Goong";
+ mes "free of charge~";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Thank you for all the trouble";
+ mes "you have been through to get these";
+ mes "ingredients. It would make me happy";
+ mes "if you shared Tom Yum Goong with";
+ mes "your friends.";
+ next;
+ mes "[Mali the Spicy]";
+ mes "Share the flavor of Ayothaya, and";
+ mes "let them know how beautiful our";
+ mes "land is. It was good to see you,";
+ mes "take care now~";
+ close;
+s_Busy:
+ emotion e_wah;
+ mes "[Mali the Spicy]";
+ mes "Ah...!";
+ mes "So busy, so busy!";
+ mes "My customers never get tired of";
+ mes "the taste of my Tom Yum Goong!";
+ mes "Heh heh heh~!";
+ close;
+}
+
+ayothaya.gat,213,95,7 script Merchant 841,{
+ if(tomyumgoong == 4)goto s_Chili;
+s_JumpBack:
+ mes "[Merchant Thongdum]";
+ mes "Hello there!";
+ mes "Ever try a Chili before?";
+ next;
+ mes "[Merchant Thongdum]";
+ mes "Despite its tiny appearance, it has a very strong flavor. It's also hot and spicy, so you should be careful when you eat one.";
+ next;
+ mes "[Merchant Thongdum]";
+ mes "The people of Ayothaya enjoy sensational food with distinct, spicy flavors. In Ayothayan cuisine, we use things like Chilis, Garlics, Ginger and Cilantro.";
+ next;
+ mes "[Merchant Thongdum]";
+ mes "I'm selling Chilis,";
+ mes "so if you need any,";
+ mes "please come to me~";
+ close;
+s_Chili:
+ if(countitem(7286) > 29)goto s_JumpBack;
+ mes "[Merchant Thongdum]";
+ mes "Hello, there~";
+ mes "Are you looking for";
+ mes "ingredients to make";
+ mes "Tom Yum Goong?";
+ next;
+ mes "[Merchant Thongdum]";
+ mes "Let's see...";
+ mes "I'm selling chilis,";
+ mes "fish sauce, and some";
+ mes "spices and flavorings";
+ mes "you'll need. I'll sell";
+ mes "it all to you for 2,000 zeny.";
+ next;
+ menu "Thanks, I'll take it",s_Take,"It's a rip-off, man!",-;
+
+ mes "[Merchant Thongdum]";
+ mes "Don't say that.";
+ mes "My prices are always";
+ mes "reasonable. I want you to know";
+ mes "that I'm a respectable Merchant.";
+ close;
+
+s_Take:
+ if(Zeny < 2000) goto s_NoZeny;
+ set Zeny, Zeny - 2000;
+ getitem 7286,30;
+ mes "[Merchant Thongdum]";
+ mes "Thank you.";
+ mes "I hhope you will enjoy";
+ mes "your Tom Yum Goong~";
+ close;
+
+s_NoZeny:
+//custom dialogues
+ emotion e_wah;
+ mes "[Merchant Thongdum]";
+ mes "Aw, you don't have enough zeny.";
+ mes "Please come back when you do!";
+ close;
+}
+
+ayothaya.gat,121,240,7 script Mr. Jun 842,1,1,{
+ mes "[Mr. Jun]";
+ mes "...";
+ close;
+OnTouch:
+ if(ayolemon == 2)end;
+ if(ayolemon == 1)goto s_Again;
+ if(tomyumgoong == 3)goto s_Lemon;
+ end;
+s_Lemon:
+ emotion e_hmm;
+ mes "[Mr. Jun]";
+ mes "Hello, there?";
+ mes "Did you need";
+ mes "some help...?";
+ next;
+ menu "I need some Lemons.",s_Quest,"No, thanks.",-;
+
+ mes "[Mr. Jun]";
+ mes "Feel free to";
+ mes "ask me for help";
+ mes "any time, okay?";
+ close;
+
+s_Quest:
+ mes "[Mr. Jun]";
+ mes "Umm...";
+ mes "Lemons?";
+ mes "As you see, I have plenty";
+ mes "of Lemons on my tree";
+ mes "Do you really need some?";
+ next;
+ menu "Yes, I will pay you.",s_Pay,"No, thanks.",-;
+
+ mes "[Mr. Jun]";
+ mes "Hmm...";
+ mes "Now what can";
+ mes "I possibly do";
+ mes "with all these";
+ mes "Lemons?";
+ close;
+
+s_Pay:
+ mes "[Mr. Jun]";
+ mes "I started growing this Lemon tree as a hobby, but I didn't expect to have such a good havest of sweet, succulent Lemons.";
+ next;
+ mes "[Mr. Jun]";
+ mes "Did you just say you were going to pay me for the Lemons? Oh, you've got me wrong. I don't intend to sell these.";
+ next;
+ mes "[Mr. Jun]";
+ mes "But...";
+ mes "I'm more than willing";
+ mes "to share some of them with";
+ mes "you, but only if you can...";
+ next;
+ mes "[Mr. Jun]";
+ mes "Play a small game with me!";
+ mes "How about that? I've been so bored";
+ mes "to death. Even an old man like me";
+ mes "needs to enjoy himself!";
+ next;
+ mes "[Mr. Jun]";
+ mes "Hahahaha~!";
+ mes "What do you say?";
+ mes "Would you like to try?";
+ next;
+ menu "Sure, why not!",s_Game,"No, thanks.",-;
+
+ mes "[Mr. Jun]";
+ mes "Afraid are we?";
+ mes "There's no fooling you:";
+ mes "I'm one of the best at games!";
+ close;
+
+s_Again:
+//custom dialogues
+ mes "[Mr. Jun]";
+ mes "Oh, you're back!";
+ mes "Would you like to try again?";
+ next;
+ menu "Yeah, I'm going to beat you.",s_Game4,"Nah, I just passed by.",-;
+
+ mes "[Mr. Jun]";
+ mes "Ha ha ha!";
+ mes "Come back when you think you can beat me.";
+ close;
+s_Game:
+ mes "[Mr. Jun]";
+ mes "Good!";
+ mes "The game I want us to play is an easy children's game.";
+ next;
+ mes "[Mr. Jun]";
+ mes "^6B1312Rock,";
+ mes "^6B1312Paper, Scissors!";
+ mes "Perhaps you've heard";
+ mes "of it in your land.";
+ next;
+ mes "[Mr. Jun]";
+ mes "Nuh-uh, don't look at me like that.";
+ mes "I'm an old man, and I want to play this game re-live my youth a little bit. You'll understand when you're my age.";
+ next;
+ mes "[Mr. Jun]";
+ mes "Alright, if you win";
+ mes "^3C2EE63^000000 out of ^3C2EE65^000000 matches,";
+ mes "The lemons are yours.";
+ mes "Are you ready?";
+ next;
+s_Game4:
+ mes "[Mr. Jun]";
+ mes "Okay...";
+ mes "As you kids say,";
+ mes "^6B1312Let's get eXtreme!";
+s_Game3:
+ next;
+ mes "[Mr. Jun]";
+ mes "Rock!";
+ mes "Paper!";
+ mes "Scissors!";
+s_Game2:
+ next;
+ menu "Rock",s_Rock,"Paper",s_Paper,"Scissors",s_Scissors;
+
+s_Rock:
+ set @npcvar,rand(1,3);
+ set @playervar,1;
+ next;
+ goto s_Play;
+s_Paper:
+ set @npcvar,rand(1,3);
+ set @playervar,2;
+ next;
+ goto s_Play;
+s_Scissors:
+ set @npcvar,rand(1,3);
+ set @playervar,3;
+ next;
+ goto s_Play;
+s_Play:
+ if(@playervar == 1 && @npcvar == 1)goto s_RockRock;
+ if(@playervar == 1 && @npcvar == 2)goto s_RockPaper;
+ if(@playervar == 1 && @npcvar == 3)goto s_RockScissors;
+ if(@playervar == 2 && @npcvar == 1)goto s_PaperRock;
+ if(@playervar == 2 && @npcvar == 2)goto s_PaperPaper;
+ if(@playervar == 2 && @npcvar == 3)goto s_PaperScissors;
+ if(@playervar == 3 && @npcvar == 1)goto s_ScissorsRock;
+ if(@playervar == 3 && @npcvar == 2)goto s_ScissorsPaper;
+ if(@playervar == 3 && @npcvar == 3)goto s_ScissorsScissors;
+s_RockRock:
+ emotion e_rock;
+ emotion 11,1;
+ goto s_Draw;
+s_RockPaper:
+ emotion e_paper;
+ emotion 11,1;
+ goto s_Lose;
+s_RockScissors:
+ emotion e_scissors;
+ emotion 11,1;
+ goto s_Win;
+s_PaperRock:
+ emotion e_rock;
+ emotion 12,1;
+ goto s_Win;
+s_PaperPaper:
+ emotion e_paper;
+ emotion 12,1;
+ goto s_Draw;
+s_PaperScissors:
+ emotion e_scissors;
+ emotion 12,1;
+ goto s_Lose;
+s_ScissorsRock:
+ emotion e_rock;
+ emotion 10,1;
+ goto s_Lose;
+s_ScissorsPaper:
+ emotion e_paper;
+ emotion 10,1;
+ goto s_Win;
+s_ScissorsScissors:
+ emotion e_scissors;
+ emotion 10,1;
+ goto s_Draw;
+s_Draw:
+ mes "[Mr. Jun]";
+ mes "Hmpf.";
+ mes "It's a draw";
+ mes "One more time!";
+ mes "Rock! Paper!";
+ mes "Scissors!";
+ goto s_Game2;
+s_Lose:
+ mes "[Mr. Jun]";
+ mes "Yes...!";
+ mes "Oh my god, yes!";
+ set @npcpoint,@npcpoint+1;
+ if(@npcpoint == 3)goto s_Lose2;
+ goto s_Game3;
+s_Win:
+ set @playerpoint,@playerpoint+1;
+ mes "[Mr. Jun]";
+ if(@playerpoint == 1)mes "Noooo...! This cannot be!";
+ if(@playerpoint == 2)mes "What...? I don't believe it! Bah.. !";
+ if(@playerpoint == 3)mes "No...! Sacrilege!";
+ if(@playerpoint == 3)goto s_Win2;
+ goto s_Game3;
+s_Lose2:
+ if(ayolemon != 1)set ayolemon,1;
+//Custom Dialogues
+ next;
+ mes "[Mr. Jun]";
+ mes "I won!";
+ mes "Seems like I can keep up with the kids. Ha ha ha!";
+ next;
+ mes "[Mr. Jun]";
+ mes "If you still want the lemons I'm up for another game. So please don't hesitate to come back.";
+ set @playerpoint,0;
+ set @npcpoint,0;
+ close;
+s_Win2:
+ next;
+ mes "[Mr. Jun]";
+ mes "You... won.";
+ mes "I'm so exhausted.";
+ mes "I guess I can't compete with you youngsters anymore. Ha ha ha!";
+ next;
+ mes "[Mr. Jun]";
+ mes "As promised,";
+ mes "I shall share some";
+ mes "of my Lemons with you.";
+ mes "Grab as many as you want!";
+ next;
+ set ayolemon,2;
+ getitem 568,10;
+ mes "^3C2EE6You have plucked";
+ mes "^3C2EE610 Lemons from the tree.";
+ next;
+ emotion e_dots;
+ mes "[Mr. Jun]";
+ mes "Hmm...";
+ mes "Looks like you need a lot of them.";
+ mes "Oh well, that's fine with me. I had";
+ mes "a good time with you.";
+ next;
+ mes "[Mr. Jun]";
+ mes "Don't forget this though:";
+ mes "Don't be selfish, and always share";
+ mes "what you have with others. That's";
+ mes "one of the most important values";
+ mes "for human beings.";
+ close;
} \ No newline at end of file
diff --git a/npc/quests/quests_comodo.txt b/npc/quests/quests_comodo.txt
index 949309e3f..01708afec 100644
--- a/npc/quests/quests_comodo.txt
+++ b/npc/quests/quests_comodo.txt
@@ -1,1243 +1,1243 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Comodo
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= 'Cross Hat', 'Bulb Hairband', 'Striped Hairband', 'Blue Hairband' Quests.
-//= 'Mine Helmet', 'Parcel Hat', 'Money Loser's Grief',
-//= 'Phantom of the Opera Mask', 'Doomed Sword' (parts 1,2,3), Quests.
-//===== Additional Comments: =================================
-//= 1.1 Fixed exploits [Lupus]
-//= 1.2 Added more quest from cities/comodo.txt [Evera]
-//============================================================
-
-
-
-//============================================================================================//
-// Hair Ornament Girl
-//============================================================================================//
-// Cross Hat, Bulb Hairband, Striped Hairband, Blue Hairband
-//==================================================
-comodo.gat,227,158,4 script Hair Ornament Girl 700,{
- mes "[Hair Ornament Girl]";
- if(sex==1)mes "Oh, hi. Do you need to buy a present for a friend, your mother, or maybe your girl friend? Then get her a Hair Band! It's the best gift you can get her.";
- if(sex==0)mes "Oh, hi. Do you need to buy a present for a friend, your mother, or maybe yourself? Then get a Hair Band! It's the best gift you can give, or get.";
- next;
- mes "[Hair Ornament Girl]";
- mes "Just by bringing me a few simple items, I can make you a gorgeous Hair Band! Here, take a look at these....";
-M_Menu:
- next;
- menu "-Cross Hat Hairband",-, "-Bulb Hairband",M_Bulb, "-Striped Hairband",M_Striped, "-Blue Hairband",M_Blue, "-End Conversation",M_End;
-
- set @BAND$, "Cross Hat Hairband";
- set @ITEMS$, " ^5555FF1 Rosary^000000 and ^5555FF500 Destroyed Armors^000000.";
- if(countitem(2608)>=1 && countitem(7069)>=500) set @GETBAND, 1;
- goto sL_0;
-
- M_Bulb:
- set @BAND$, "Bulb Hairband";
- set @ITEMS$, "^5555FF1 Slotted Circlet^000000 and ^5555FF20 Glass Beads^000000.";
- if(countitem(2233)>=1 && countitem(746)>=20) set @GETBAND, 2;
- goto sL_0;
-
- M_Striped:
- set @BAND$, "Striped Hairband";
- set @ITEMS$, "^5555FF1500 Worn-out Prison Uniforms^000000.";
- if(countitem(1099)>=1500) set @GETBAND, 3;
- goto sL_0;
-
- M_Blue:
- set @BAND$, "Blue Hairband";
- set @ITEMS$, "^5555FF1 Bandana^000000, ^5555FF1 Cobaltblue Dyestuffs^000000, and ^5555FF300 Anolian Skins^000000.";
- if(countitem(2211)>=1 && countitem(978)>=1 && countitem(7003)>=300) set @GETBAND, 4;
-
- sL_0:
- mes "[Hair Ornament Girl]";
- mes "So you're interested in the "+@BAND$+" huh? Here are the items you'll need for the "+@BAND$+":";
- mes @ITEMS$;
- next;
- if(@GETBAND > 0) goto sL_GetBand;
-
- mes "[Hair Ornament Girl]";
- mes "Bring me all of these items and I will be able to make you a "+@BAND$+".";
- goto M_Menu;
-
- sL_GetBand:
- mes "[Hair Ornament Girl]";
- mes "I see that you have enough items for a "+@BAND$+". Would you like me to make you one?";
- next;
- menu "Yes, I would.",-, "No thank you.",M_End;
-
- if(@GETBAND == 1) goto ssL_Cross;
- if(@GETBAND == 2) goto ssL_Bulb;
- if(@GETBAND == 3) goto ssL_Striped;
- if(@GETBAND == 4) goto ssL_Blue;
-
- ssL_Cross:
- if(countitem(2608)<1 || countitem(7069)<500) goto L_Cheater;
- delitem 2608,1;
- delitem 7069,500;
- getitem 5036,1;
- goto ssL_End;
- ssL_Bulb:
- if(countitem(2233)<1 || countitem(746)<20) goto L_Cheater;
- delitem 2233,1;
- delitem 746,20;
- getitem 5034,1;
- goto ssL_End;
- ssL_Striped:
- if(countitem(1099)<1500) goto L_Cheater;
- delitem 1099,1500;
- getitem 5049,1;
- goto ssL_End;
- ssL_Blue:
- if(countitem(2211)<1 || countitem(978)<1 || countitem(7003)<300) goto L_Cheater;
- delitem 2211,1;
- delitem 978,1;
- delitem 7003,300;
- getitem 5052,1;
- ssL_End:
- mes "[Hair Ornament Girl]";
- mes "Here is your "+@BAND$+". Thank you.";
- set @GETBAND, 0;
- close;
- L_Cheater:
- mes "[Hair Ornament Girl]";
- mes "Ooops... Where are these items?";
- close;
-
- M_End:
- mes "[Hair Ornament Girl]";
- mes "Hope to see you again soon.";
- close;
-}
-
-
-//===================================================================================================//
-// Mari Isac
-//===================================================================================================//
-// 'Mine Helmet', 'Parcel Hat', 'Money Loser's Grief', 'Phantom of the Opera Mask'
-//===============================================================//
-comodo.gat,274,137,5 script Mari Isac 702,{
- mes "[Mari Isac]";
- mes "I travel all over the world and get to hear many interesting stories from the people I meet.";
- mes "Sometimes they even teach me how to make special items";
- next;
- mes "[Mari Isac]";
- mes "Would you be interested in some of the items I've learned to make?";
-M_Menu:
- next;
- menu "Tell me about them.",M_0, "Make me one.",M_1;
-
- M_0:
- menu "-Mine Helmet",-, "-Parcel Hat",sM_Parcel, "-Money Loser's Grief",sM_Money, "-Phantom of the Opera Mask",sM_Phantom;
-
- mes "[Mari Isac]";
- mes "I learned how to make the Mine Helmet when I traveled to the old coal mines near Geffen.";
- next;
- mes "[Mari Isac]";
- mes "The 2 most important things a miner needs are light, and head protection.";
- mes "A very inventive miner was able to create something that dealt with both issues.";
- next;
- mes "[Mari Isac]";
- mes "He attached a light to his safety helmet and called it a Mine Helmet.";
- mes "This meant that miners no longer had to worry about carrying around lamps and could work more efficiently.";
- next;
- mes "[Mari Isac]";
- mes "Anyways, if you want me to make you a Mine Helmet you'll need to bring me these items:";
- mes "^5555FF1 Safety Helmet^000000,";
- mes "^5555FF1 Candle^000000,";
- mes "^5555FF1 Crystal Mirror^000000,";
- mes "^5555FF25 Steel^000000.";
- next;
- goto M_0;
- sM_Parcel:
- mes "[Mari Isac]";
- mes "I learned how to make the Parcel Hat when I traveled to Alberta. There they have a unique way of distributing mail and goods.";
- next;
- mes "[Mari Isac]";
- mes "Instead of using a pouch or a sack to carry items for delivery, they use a special kind of hat, called a Parcel Hat.";
- mes "This hat allows the delivery personel to carry numerous items on their heads. Of course they have to have good balance to use it.";
- next;
- mes "[Mari Isac]";
- mes "Anyways, if you want me to make you a Parcel Hat, you'll need to bring me these items.";
- mes "^5555FF150 Fabric^000000,";
- mes "^5555FF100 Resin^000000,";
- mes "^5555FF1 Cobaltblue Dyestuffs^000000.";
- next;
- goto M_0;
- sM_Money:
- mes "[Mari Isac]";
- mes "I learned how to make the Money Loser's Grief when I traveled to Morroc.";
- next;
- mes "[Mari Isac]";
- mes "A long time ago an honest merchant got into a conflict with a crooked guild.";
- mes "Unlike the dirty guild, the merchant did not scam or cheat people.";
- next;
- mes "[Mari Isac]";
- mes "Because of this they attacked the merchants shop and took all of his goods.";
- next;
- mes "[Mari Isac]";
- mes "The merchant was devastated by the loss of his shop.";
- mes "In his sadness he used the bits and pieces that were left from his shop to create a new item.";
- next;
- mes "[Mari Isac]";
- mes "He created the Money Loser's Grief, a symbol of his great sadness. When people see it, they can't help but feel sympathetic to the wearer.";
- next;
- mes "[Mari Isac]";
- mes "Many merchants now wear it to help themselves get more business. Of course it is also a reminder of the honest merchants sad tale.";
- next;
- mes "[Mari Isac]";
- mes "Anyways, if you want me to make you a Money Losers Grief, you'll need to bring me these items.";
- mes "^5555FF1 Circlet with a single slott^000000,";
- mes "^5555FF1 Gold^000000,";
- mes "^5555FF20 Steel^000000,";
- mes "^5555FF80 Feathers^000000,";
- mes "^5555FF800 Sticky Mucus^000000.";
- next;
- goto M_0;
- sM_Phantom:
- mes "[Mari Isac]";
- mes "I learned how to make the Phantom of the Opera Mask when I traveled to Al De Baran.";
- mes "The story behind this item is that of a man's pure love........";
- next;
- mes "[Mari Isac]";
- mes "There once was a man who was in love with a beautiful opera singer.";
- mes "Unfortunately the man had a terribly disfigured face which forced to him to wear a mask.";
- next;
- mes "[Mari Isac]";
- mes "He was ashamed of his appearance and could never bring himself to face the singer.";
- mes "The man instead, watched her from a far, admiring every nuance of her beauty and grace.";
- next;
- mes "[Mari Isac]";
- mes "He lurked in the bowles of the opera house and from time to time he would sing his sad love song.";
- mes "Many people heard it and believed that there was a phantom haunting the opera house.";
- next;
- mes "[Mari Isac]";
- mes "The singer also heard his song, and through it she was able to feel his pain and his love for her.";
- mes "The two eventually met, and when they did she was able to look past his appereance and accept him for who he was.";
- next;
- mes "[Mari Isac]";
- mes "Too this day, the tale of the masked 'phantom' is still romantacised.";
- next;
- mes "[Mari Isac]";
- mes "Anyways, if you want me to make you a Phantom of the Opera Mask, you'll need to bring me these items.";
- mes "^5555FF1 Opera Masque^000000,";
- mes "^5555FF50 Horrendous Hairs^000000.";
- goto M_0;
-
- M_1:
- menu "-Mine Helmet",-, "-Parcel Hat",sM_MakePar, "-Money Loser's Grief",sM_MakeMon, "-Phantom of the Opera Mask",sM_MakePhan;
-
- if(countitem(5009)<1 || countitem(5028)<1 || countitem(747)<1 || countitem(999)<25) goto ssL_NoItems;
- delitem 5009, 1;
- delitem 5028, 1;
- delitem 747, 1;
- delitem 999, 25;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Mine Helmet!";
- getitem 5031,1;
- close;
- sM_MakePar:
- if(countitem(1059)<150 || countitem(907)<100 || countitem(978)<1) goto ssL_NoItems;
- delitem 1059, 150;
- delitem 907, 100;
- delitem 978, 1;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Parcel Hat!";
- getitem 5023,1;
- close;
- sM_MakeMon:
- if(countitem(2233)<1 || countitem(969)<1 || countitem(999)<20 || countitem(949)<80 || countitem(938)<800) goto ssL_NoItems;
- delitem 2233, 1;
- delitem 969, 1;
- delitem 999, 20;
- delitem 949, 80;
- delitem 938, 800;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Money Loser's Grief!";
- getitem 5021,1;
- close;
- sM_MakePhan:
- if(countitem(2281)<1 || countitem(1048)<50) goto ssL_NoItems;
- delitem 2281,1;
- delitem 1048, 50;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Phantom of the Opera Mask!";
- getitem 5043, 1;
- close;
-
- ssL_NoItems:
- mes "[Mari Isac]";
- mes "You don't seem to have enough items for me to make that hat. Please come back when you do.";
- close;
-}
-
-//============================================================================//
-// Chief Quest (Doomed Swords Part 1)
-//============================================================================//
-//=======================================================
-comodo.gat,206,310,4 script Rochito 48,{
- if(dmdswrd_Q == 1) goto L_1;
- if(dmdswrd_Q == 2) goto L_2;
- if(dmdswrd_Q == 3) goto sL_2;
- if(dmdswrd_Q == 4) goto L_3;
- if(dmdswrd_Q == 5 || dmdswrd_Q == 6) goto sL_3;
-L_0:
- mes "[Rochito]";
- mes "Meat, meat, meat... I LOVE MEAT!! Eat, eat, eat... ALL I eat is MEAT!! I'm sooo obsessed with meat..... I'm... I.. I... I'm a MEAT MAN!!";
- emotion e_lv;
- next;
- mes "[Rochito]";
- mes "Comodo is meat heaven!! That's why BBQ camping in Comodo is sooooo AWESOME!!!";
- next;
- menu "Tell me more about BBQ Camping.",M_0, "End Conversation.",M_End;
-
- M_0:
- mes "[Rochito]";
- mes "The Komodoru, a native animal of Comodo, is famous because of it's delicious meat. Every part of the animal is tasty.";
- mes "However the tastiest part of the Komodoru, is the area around the spine. It's number one!";
- emotion e_no1;
- next;
- mes "[Rochito]";
- mes "Look at all of this meat in front of me! I don't know what to do with all of this meat! What should I do?? Oh no!...";
- emotion e_swt2;
- next;
- mes "[Rochito]";
- mes "Oh, I almost forgot!! You must try this Komodoru spine meat with Comodo's authentic BBQ seasoning.";
- mes "^5555FFKoserahserah^000000 is the name of the seasoning, and you should at least try it once before you leave.";
- next;
- mes "[Rochito]";
- mes "There is a rumor going around this camp ground that Koserahserah is soooo good that it might be addictive.";
- mes "It's possible that it may even cause a slight euphoria in those who try it.";
- next;
- mes "[Rochito]";
- mes "I'm not sure if that's true, but I do not that the seasoning is not allowed to be exported outside of Comodo.";
- mes "Luckily I'm a resident here so I can have as much as I want.";
- next;
- mes "[Rochito]";
- mes "Still, the authorities are worried about how Koserahserah should be regulated.";
- mes "The ^5555FFChief of Comodo^000000 is currently working on a some guidelines for it.";
- if(dmdswrd_Q == 0) set dmdswrd_Q, 1;
- close;
- M_End:
- close;
-
-L_1:
- mes "[Rochito]";
- mes "This Komodoru spine meat is delicious when seasoned with ^5555FFKoserahseah^000000, a local flavoring that is the pride of Comodo!!";
- mes "Would you like to try some?";
- next;
- mes "[Rochito]";
- mes "Oh, are you looking for the ^5555FFChief's^000000 house? Just go west of this camp ground to the village. You'll find his house there.";
- close;
-
-L_2:
- mes "[Rochito]";
- mes "We have a lot of time left on our vacation and I think we should spend the rest of it here, enjoying the Komodoru meat.";
- next;
- mes "[Rochito]";
- mes "In fact, we should just keep on having BBQ parties!";
- next;
- mes "^5533FF~ gave Rochito the Koserahserah ~^000000";
- next;
- mes "[Rochito]";
- mes "Oh my!! This is the special Comodo seasoning.... Koserahserah!! How did you manage to get this precious delicacy?";
- emotion e_gasp;
- next;
- mes "[Rochito]";
- mes "Oh... I see, I see. So it was given to you by my long time friend. Well, thank you so much.... thank you...";
- emotion e_thx;
- next;
- mes "[Rochito]";
- mes "Hey everybody! Tausupa has sent us some Koserahserah seasoning!!";
- next;
- mes "[Emralhandas]";
- mes "Our old friend?";
- next;
- mes "[Rochito]";
- mes "I don't know if we should take such a great gift....";
- next;
- mes "[Rockha]";
- mes ".........................";
- next;
- mes "[Rochito]";
- mes "We should give him something in return as a thank you. But what can we give him?...";
- mes "should we give him that wonderful ^5555FFWine^000000 we've been saving? It has a very nice aroma....";
- next;
- mes "[Rochito]";
- mes "May I ask a favor of you? If it is not too much trouble, would you take this to our dear friend.....";
- mes "I would deliver this in person but I'm a little busy with the BBQ and all.....";
- next;
- mes "[Rochito]";
- mes "Please. We would be very grateful if you could give this to him.";
- next;
- mes "^5555FF~ received 'Mureuchieligu Wine' ~^000000";
- set dmdswrd_Q, 3;
- close;
-
- sL_2:
- mes "[Rochito]";
- mes "Please do us a favor and deliver the wine to the chief. We would be very happy if you did.";
- close;
-
-L_3:
- mes "[Rochito]";
- mes "You've returned..... Oh! Thank you for the delivering the wine for us.";
- emotion e_thx;
- set dmdswrd_Q, 5;
- next;
-
- sL_3:
- mes "[Rochito]";
- mes "We are very proud of our courageous friend. It is because of him that we can live peacefully and travel safely.";
- next;
- mes "[Rochito]";
- mes "Oh, I just remembered something....";
- mes "We've been talking about Comodo's famous meat all this time, and I didn't even mention Comodo's world famous ^5555FFCheese^000000!";
- next;
- mes "[Rochito]";
- mes "I believe there is a cheese expert named ^5533FFTORUNA^000000 somewhere on this island.";
- mes "If your interested in the cheese you should go ask him about it.";
- if(dmdswrd_Q == 5) set dmdswrd_Q, 6;
- close;
-
-
-}
-
-//=======================================================
-comodo.gat,204,310,4 script Rockha 98,{
- if(dmdswrd_Q == 3) goto L_1;
- if(dmdswrd_Q == 4 || dmdswrd_Q==5) goto L_2;
-L_0:
- mes "[Rockha]";
- mes ". . . . . . . . . .";
- mes "My friends and I always wanted to have our BBQ eat out.....";
- mes ". . . . . . . . . .";
- next;
- menu "About the ^3355FFChief^000000.",M_0, "End Conversation.",M_End;
-
- M_0:
- mes "[Rockha]";
- mes "Yeah... I recently discovered that a friend I thought I lost during the ^FF4444'War with the Witch'^000000, is still alive.";
- mes "Now he's the ^5555FFChief of Comodo^000000....";
- next;
- mes "[Rockha]";
- mes "At the end of the war the witch was defeated and sealed in the ground beneath this village.";
- next;
- mes "[Rockha]";
- mes "It is rumored that the seasonings we get from our local plants somehow receive their unique qualities from the Witch's magical influence.";
- next;
- mes "[Rockha]";
- mes "Although my friend and I now live in different worlds, his new life hasn't changed him.";
- mes "Thankfully we can still be friends after all that's happened.";
- close;
-
-L_1:
- mes "[Rockha]";
- mes "Oh, and by the way.... Could you give him this message as well?";
- mes "Tell him, 'For as long as you have remembered us, we will not forget you. Friends forever.'.....";
- close;
-
-L_2:
- mes "[Rockha]";
- mes "Ha ha ha..... aaaahhh.... THIS is FRIENDSHIP!!";
- emotion e_heh;
- next;
- mes "[Rockha]";
- mes "Let us take a moment to make a toast to our good friend. Let us eat and drink until we can eat no more!!";
- next;
- mes "[Rockha]";
- mes "~!!Yippeeeeee!!~!!Wooohooooo!!~";
- close;
- mes "[Rockha]";
- mes "Thank you for your assistance. You have shown us that you are truly a good person. We now consider you as a friend.";
- next;
- mes "[Rockha]";
- mes "If you ever need any help, just come and look for me, ^3355FF'Rockha'^000000. We are forever in your debt.";
- close;
-}
-
-//=======================================================
-comodo.gat,209,314,4 script Rotute 82,{
- if(dmdswrd_Q==2 || dmdswrd_Q==3) goto L_1;
- if(dmdswrd_Q == 4 || dmdswrd_Q==5) goto L_2;
-
-L_0:
- mes "[Rotute]";
- mes "The quest for the ^5555FFSwords of Power^000000 has not yet been completed!";
- next;
- mes "[Rotute]";
- mes "Although four of the swords have been recovered by our team, there are rumors of a more powerful sword near ^5555FFGlastheim^000000.";
- mes "This has brought us yet another challenge.....";
- next;
- mes "[Rotute]";
- mes "We must find this new sword!! A new expedition has been planned to find this sword but I feel very anxious.";
- mes "If we succeed this will affect the whole world!! For my deceased father.....";
- next;
- mes "[Rotute]";
- mes "...... We MUST SUCCEED!!!!";
- emotion e_go;
- close;
-
-L_1:
- mes "[Rotute]";
- mes "Wow!! This is Comodo's famous seasoning!! The Captain's friend is truly a good person. To be this generous is unbelievable!";
- emotion e_gasp;
- next;
- mes "[Rotute]";
- mes "I can only hope that I find a friend that is as loyal as he on this quest.....";
- close;
-
-L_2:
- mes "[Rotute]";
- mes "It's strange.... this is only my first visit to Comodo and yet.... for some reason, it seems so familiar... like it's my home town.";
- next;
- mes "[Rotute]";
- mes "When this journey is over, I hope to visit this wonderful place again..... It feels like something is waiting for me here.";
- next;
- mes "[Rotute]";
- mes "Oh, and thanks so much for helping our captain.";
- emotion e_thx;
- close;
-}
-
-//=======================================================
-comodo.gat,209,305,4 script Emralhandas 70,{
- mes "[Emralhandas]";
- mes "Rockha, empty your glass so I can pour you a drink.";
- next;
- mes "[Emralhandas]";
- mes "Many years ago, during the War with the Witch, we dreamed of the day when we could live in peace.";
- mes "Today that dream has come true and it's all because of you my friends!!";
- emotion e_no1;
- next;
- menu "Ask about her friends....",M_0, "End Conversation",M_End;
-
- M_0:
- mes "[Emralhandas]";
- mes "Many years ago, heroes from every region of Rune Midgard were selected to embark upon a very unique and important quest.";
- next;
- mes "[Emralhandas]";
- mes "The goal was to find the ^5555FF4 rare 'Swords of Power'^000000!";
- mes "These 4 swords were said to be the most powerful weapons to have ever been made.";
- next;
- mes "[Emralhandas]";
- mes "After 10 hard years of searching, all 4 swords were found and brought together.";
- mes "Out of all of those who searched the swords, the four bravest were chosen to protect them.";
- next;
- mes "[Emralhandas]";
- mes "I, Emralhandas, was one of the four that were chosen.";
- next;
- mes "[Emralhandas]";
- mes "Of course there were many hardships that we had to endure before, and even after these swords were found........";
- next;
- mes "[Emralhandas]";
- mes "Our team of adventures consisted of myself, our ship's captain 'Rockha', our comrade 'Rochito', and the Chief of this town, 'Tausupa'.";
- next;
- mes "[Emralhandas]";
- mes "We had found the last sword and headed back to the island. Up to this point we had not even thought about the weapon's owner.";
- mes "As we left we began to have a bad feeling about what was going to happen next.";
- next;
- mes "[Emralhandas]";
- mes "When we returned to the island, we were confronted by ^790079'Mariposum'^000000, a powerful Witch who practiced the dark art of EVIL magic!!";
- next;
- mes "[Emralhandas]";
- mes "Her goal was to take over the world and plunge into a dark chaos!! We had to defend not only ourselves, but the future of humanity!!";
- mes "So it was here that me made our stand against this terrible evil!";
- emotion e_gasp;
- next;
- mes "[Emralhandas]";
- mes "A tremendous battle took place and many of our comrades fell that day... but their efforts were not in vain.";
- next;
- mes "[Emralhandas]";
- mes "With bloodshed and fierce determination we were able to defeat the witch and imprison her beneath the earth.";
- next;
- mes "[Emralhandas]";
- mes "Of all of those who risked their lives that day, one stood out amongst the rest and became the deciding factor in the witch's defeat.....";
- next;
- mes "[Emralhandas]";
- mes "It was ^5555FFTausupa^000000.";
- next;
- mes "[Emralhandas]";
- mes "Of course we are great full to all the brave warriors who fought and lost their lives that day.";
- mes "Especially to 'Rotute's' father who cannot be with us today, may he rest in peace.";
- next;
- mes "[Emralhandas]";
- mes "Rotute does not know about this yet, but hopefully he will find out about his father's heroism before this quest is complete......";
- close;
- M_End:
- mes "[Emralhandas]";
- mes "Our quest has not yet been completed. Rockha, we must eat all of the meat in Rune Midgard until there is none left!!";
- mes "We must eat and eat, for the pride of our Meat Club!!! (~hiccup~)";
- close;
-}
-
-
-// Chief's House =========================================================//
-cmd_in02.gat,32,140,4 script Chief Tausupa 49,{
- if(dmdswrd_Q == 1) goto L_1;
- if(dmdswrd_Q == 2) goto sL_1;
- if(dmdswrd_Q == 3) goto L_2;
- if(dmdswrd_Q == 4) goto sL_2;
-
-L_0:
- mes "[Chief Tausupa]";
- mes "Hello, I am the Chief of Comodo. You may call me Tausupa. Comodo is a place of pleasure, enjoyment, love, and beauty.";
- mes "Welcome, and have a pleasant and relaxing stay here.";
- next;
- menu "Ask about the ^5555FFCasino^000000.",M_0, "Ask about the ^790079Evil Witch^000000.",M_1, "End Conversation.",M_End;
-
- M_0:
- mes "[Chief Tausupa]";
- mes "The Casino is one of the many notable sites in Comodo. It would seem that you have some interest in it.";
- mes "The Casino uses it's own currency, a coin called the ^5555FF'Eulwo'^000000.";
- next;
- mes "[Chief Tausupa]";
- mes "There are a variety of games for you to enjoy there.";
- mes "The earnings you win can be used to purchase different items available only in the Casino.";
- next;
- mes "[Chief Tausupa]";
- mes "These earnings, which are in the form of Eulwo, cannot be exchanged for Zeny though.";
- close;
- M_1:
- mes "[Chief Tausupa]";
- mes ". . . . . . . . . .";
- mes "You must be from out of town. I'm not sure where you heard about it, but that story is old and most people have forgotten about it.";
- mes "It's really not worth mentioning. . . . . . . . . . . .";
- close;
- M_End:
- mes "[Chief Tausupa]";
- mes "If you haven't noticed, Comodo is located inside of a huge, natural, cave. No matter what time of day it is, you'll never see the sunlight.";
- next;
- mes "[Chief Tausupa]";
- mes "It is this unique 24 hour nightlife that attracts so many tourist to our town. Anyways, please enjoy your stay here.";
- close;
-
-L_1:
- mes "[Tausupa]";
- mes "..... Is that so? My long time friends have come back to Comodo and are at the Camp Grounds enjoying the BBQ huh?.......";
- next;
- mes "[Tausupa]";
- mes "It would seem that they are planning another expedition........";
- next;
- mes "[Tausupa]";
- mes "I have not seen my friends in a long time and the sound of going on another adventure with them is very exciting.... however......";
- next;
- mes "[Tausupa]";
- mes "~sigh~ Unfortunately I will not be able to go with them. I fear that if I leave, the evil witch will revive and wreak havoc on this world once again.";
- next;
- mes "[Tausupa]";
- mes "..... I have a favor I must ask of you.......";
- next;
- mes "[Tausupa]";
- mes "Can you take this special seasoning to my friends?";
- next;
- mes "^5555FF~ recieved Koserahserah ~^000000";
- set dmdswrd_Q, 2;
- next;
-
- sL_1:
- mes "[Chief Tausupa]";
- mes "Please take this seasoning to my friends at the BBQ camp grounds and give it to ^5555FFRochito^000000. Thank you.";
- close;
-
-L_2:
- mes "[Chief Tausupa]";
- mes "Were my friends happy? After you left, I had some time to think..... I should have delivered the seasoning personally......";
- mes "I should have gone to see them......";
- next;
- mes "[Chief Tausupa]";
- mes "But I am much too busy as the Chief of Comodo........ Maybe I should quit...........";
- mes "I really want to go on another quest with my good friends.... How did I end up like this?";
- next;
- mes "^5555FF~ you give him Mureuchieligu Wine and convey the message ~^000000";
- next;
- mes "[Chief Tausupa]";
- mes "..................";
- next;
- mes "[Chief Tausupa]";
- mes "That was a message from my friends? I think I understand now.... My friends are TRUE friends. They have been thinking of me all this time........";
- next;
- mes "[Chief Tausupa]";
- mes "I have made up my mind!";
- emotion e_ic;
- next;
- mes "[Chief Tausupa]";
- mes "Mureuchieligu Wine is made as soon as the grapes are picked. It is then bottled in the very same place and is left there to age.";
- mes "The wine spends the rest of its days aging in the same spot.";
- next;
- mes "[Chief Tausupa]";
- mes "Much like the wine, I have been aging away in the same place here in Comodo, and I must continue to stay here for it is my duty.";
- next;
- mes "[Chief Tausupa]";
- mes "I am thankful for my friends' advice. The gift they gave me had a great deal of meaning.";
- mes "Please tell my friends this, 'I will not avoid my destiny. On the contrary, I will fulfill it to the best of my ability'.";
- set dmdswrd_Q, 4;
- next;
-
- sL_2:
- mes "[Chief Tausupa]";
- mes "I would like to thank you for helping my friends and I. I am truly great full.";
- close;
-}
-
-
-
-//============================================================================//
-// Cheese Quest (Doomed Swords Part 2)
-//============================================================================//
-
-//=======================================================
-comodo.gat,88,97,4 script Cheese Expert TORUNA 109,{
- if(dmdswrd_Q == 7) goto sL_2;
- mes "[TORUNA]";
- mes "I hear that the cheese here is delicious. Every time I come here to visit, I ask for some of that popular cheese.";
- mes "But they always seem to be out! If I could just get a taste of that cheese...........";
-M_Menu:
- next;
- menu "Ask about the cave.",M_0, "Comodo is a town inside a cave?",M_1, "End Conversation.",M_End;
-
- M_0:
- mes "[TORUNA]";
- mes "It is a natural formation of limestone which was shaped by the erosive powers of fresh water with sea water.";
- next;
- mes "[TORUNA]";
- mes "The air and topsoil in the cave are rich in carbon-dioxide gas.";
- mes "This was caused by C02 gas leaking into the cave through cracks in the limestone over a period of many years.";
- next;
- mes "[TORUNA]";
- mes "Water from rainfall and ocean currents slowly eroded the limestone to carve out the cave.";
- next;
- mes "[TORUNA]";
- mes "Essentially a cave is formed when water finds cracks in some type of rock formation and erodes the rock to a point where a cave is formed.";
- mes "Of course this takes hundreds of years and a lot of water.";
- goto M_Menu;
- M_1:
- mes "[TORUNA]";
- mes "Yep. What you see here is really the inside of a gigantic cave.";
- mes "Most people don't realize this at first, and that's thanks to all of the towns people's hard work and dedication.";
- next;
- mes "[TORUNA]";
- mes "The people who settled here were very industrious and worked diligently to turn this cave into a place that they could call home.";
- next;
- mes "[TORUNA]";
- mes "They slowly chipped away at the limestone surfaces, to shape the interior of the cave into something much more eye pleasing.";
- mes "It was from these humble beginnings that the Comodo you see today, was founded.";
- next;
- if(dmdswrd_Q == 6) goto sL_1;
-
- mes "[TORUNA]";
- mes "Unfortunately that is only half the story.";
- next;
- mes "[TORUNA]";
- mes "The early settlers faced an even greater challenge when the ^790079Evil Witch, Meropusum^000000, arrived.";
- mes "She was determined to rule the world, and used the newly founded town of Comodo as her staging ground.";
- next;
- mes "[TORUNA]";
- mes "Led by a group of strong heroes, the town fought back against the witch and sealed her away. Many lives were lost in this war however.";
- next;
- mes "[TORUNA]";
- mes "The strongest of the heroes was chosen as the town's new leader, and under his leadership the town prospered.";
- next;
- mes "[TORUNA]";
- mes "Be aware though, that Meropusom is still alive. Although she has been sealed away, her evil powers can still be felt.";
- mes "Her minions still lurks in the shadows awaiting their master's return.";
- next;
- mes "[TORUNA]";
- mes "So be cautious when venturing into the unknown parts of Comodo. Anyway, so long and take care.";
- goto M_Menu;
-
- sL_1:
- mes "[TORUNA]";
- mes "Not only has this cave become a home for the people of Comodo, but it's unique environment has also helped in creating....";
- next;
- mes "[TORUNA]";
- mes "The world famous..... Comodo ^5533FFCheese^000000!!!";
- emotion e_ic;
- next;
- mes "[TORUNA]";
- mes "This special Cheese is simply DELICIOUS! You will understand how good the Cheese is once you try it.";
- emotion e_lv2;
- set dmdswrd_Q, 7;
- next;
- sL_2:
- mes "[TORUNA]";
- mes "You should go speak with the people at the ^009500Outdoor Bar^000000 near the camp grounds.";
- mes "I heard them talking about the ^5533FFCheese^000000, it is so popular.";
- close;
- M_End:
- mes "[TORUNA]";
- mes "The taste of Comodo Cheese is simply out of this world!! Just one taste and I guarantee that you won't be able to stop!";
- mes "It's so good you may even go GRAZY without it!";
- emotion e_lv;
- next;
- mes "[TORUNA]";
- mes "Oh if I could just have one piece.... I'd be so happy I'd dance all night on that ^5555FFHula Dancing Stage^000000!!";
- close;
-}
-
-//=======================================================
-comodo.gat,164,291,2 script Rakusa 73,{
- if(dmdswrd_Q == 7) goto L_1;
- if(dmdswrd_Q == 8) goto L_2;
-
- mes "[Rakusa]";
- mes "Comodo is often referred to as the town of 'recreation and relaxation'.......";
- next;
- mes "[Rakusa]";
- mes "This can be misleading however, for Comodo is not only the home of fun tourist attractions, but two very ^FF4444dangerous dungeons^000000 as well.";
- next;
- mes "[Rakusa]";
- mes "This area has unusually strong monsters. If you plan on entering the dungeons, be very well prepared and expect trouble.";
- mes "These dungeons are definitely not for the faint of heart!";
- close;
-L_1:
- mes "[Rakusa]";
- mes "That man sitting over there simply won't stop talking about that Comodo ^3355FF'Cheese'^000000.........";
- next;
- mes "[Rakusa]";
- mes "I just can't stop wondering about what kind of Cheese it is. I sure hope I will have the opportunity to try it someday.";
- set dmdswrd_Q, 8;
- next;
-L_2:
- mes "[Rakusa]";
- mes "It looks like ^5533FFKichiri^000000 isn't as interested in the Cheese as that other man is though...... actually he looks rather annoyed.........";
- next;
- mes "[Rakusa]";
- mes "Someone should check on Kichiri and make sure everything is all right......";
- close;
-}
-
-//=======================================================
-comodo.gat,169,284,4 script Kichiri 99,{
- mes "[Kichiri]";
- if(dmdswrd_Q == 8) goto L_1;
- if(dmdswrd_Q == 9) goto L_2;
-
- mes "In the heart of Comodo lies a performance stage. It's where a number of crazed residents put on shows for the tourists that come to visit.";
- mes "The shows are so popular that some tourist even come back to Comodo to see them again.";
- next;
- mes "[Kichiri]";
- mes "Many of the residents just dance and dance without much skill.";
- mes "But for the few who show some talent, there is the possibility of being recruited by the local ^5555FFDancers Guild^000000.";
- close;
-L_1:
- mes "The guy sitting near me just won't stop talking about Comodo ^5533FFCheese^000000...... It's going to drive me insane!";
- emotion e_pif;
- next;
- mes "[Kichiri]";
- mes "Yeah, right over there, the guy named ^3355FFMagatu^000000. Can you do something about it?";
- set dmdswrd_Q, 9;
- close;
-L_2:
- mes "I just want to have a quit time and have a few drinks, is this too much to ask for?";
- mes "Stupid drunk ^3355FF' Magatu '^000000..... always talking about ^5533FFCheese^000000......";
- emotion e_ag;
- close;
-}
-
-//=======================================================
-comodo.gat,163,280,4 script Magatu 55,{
- mes "[Magatu]";
- if(dmdswrd_Q == 9) goto L_1;
- if(dmdswrd_Q == 10) goto L_2;
-
- mes "Yes! That's it!! The irresistible smell of that amazing ^5533FFCheese^000000!! It's so delicious!.... Oh, I can't wait any longer......";
- emotion e_lv;
- next;
- mes "[Magatu]";
- mes "No matter what anyone else says..... Comodo Cheese is truly the BEST!!! Kekekeke!!";
- emotion e_no1;
- next;
- mes "[Magatu]";
- mes "Cheese! CHEESE!! WONDERFULL Comodo CHEESE!!!.... so.... tas... ty.... (~drooools~)";
- emotion e_lv;
- close;
-L_1:
- mes "What? You want to know some information regarding Comodo's special ^5533FFCheese^000000?";
- mes "I guess I could give you some inside information............";
- emotion e_what;
- next;
- mes "[Magatu]";
- mes "Okay, go to the ^009500Casino^000000 and look for a guy named ^5533FFManzi^000000. He should be somewhere on the first floor.";
- mes "He's got a huge scar on his face so he should be easy to spot.";
- next;
- mes "[Magatu]";
- mes "When you see him give him this Bottle Cap. Don't do anything else, just give him the bottle cap and he will give you some info on the Cheese....";
- next;
- mes "^3355FF- Received a Bottle Cap -^000000";
- set dmdswrd_Q, 10;
- close;
-L_2:
- mes "Oh yeah, I got to tell you my friend's name.....";
- next;
- mes "[Magatu]";
- mes "O? I already told you? Bah, I am so drunk....... ^5533FFManzi^000000... He’s in the ^009500Casino^000000, got it?";
- emotion e_hmm;
- close;
-}
-
-//======================================================
-cmd_in02.gat,189,99,4 script Manzi 85,{
- if(dmdswrd_Q == 10) goto L_1;
- if(dmdswrd_Q == 11) goto L_2;
- if(BaseJob == Job_Novice) goto L_Nov;
-
- mes "[Manzi]";
- mes "There have been some people who've bet too much and have lost their pecopeco and many other precious items.";
- mes "So be careful when you make your bets..... you might just loose the shirt off your back.......";
- close;
-
- L_Nov:
- mes "[Manzi]";
- mes "Stop bothering me you little kid. This place is for adults only, get out of here.";
- close;
-L_1:
- mes "[Manzi]";
- mes "Yes?..........";
- next;
- mes "^3355FF- You give him the Bottle Cap-^000000";
- next;
- mes "[Manzi]";
- mes "..........................";
- next;
- mes "[Mazi]";
- mes "Whoa! This is from my friend Magatu, you must be someone of great importance to him.";
- mes "Otherwise, he wouldn't have given you the Bottle Cap.";
- emotion e_ic;
- next;
- mes "[Manzi]";
- mes "I made a promise to Magatu that I'd help anybody who had one of his bottle caps find out more about the ^5533FFCheese^000000.........";
- next;
- mes "[Manzi]";
- mes "Only a selected few get the rare opportunity to taste the legendary Comodo Cheese you know.";
- next;
- mes "[Manzi]";
- mes "Well, I guess you could find out more about Comodo Cheese from a lady near the ^3355FF 'Hulla Stage' ^000000 located near the center of town.";
- next;
- mes "^3355FF- Received Shiny Coin -^000000";
- next;
- mes "[Manzi]";
- mes "Just tell her that Manzi from the casino sent you and show her that coin. She'll tell you all you need to know about the Cheese.";
- next;
- mes "[Manzi]";
- mes "By the way......... no else is listening this right?....... *whispers: that lady is actually in charge of the Comodo Cheese distribution*...........";
- set dmdswrd_Q, 11;
- close;
-L_2:
- mes "[Manzi]";
- mes "The cheese lady should be near the ^5533FFHulla Stage^000000. Just remember to show her the coin when you ask her about the cheese.";
- close;
-}
-
-//=======================================================
-comodo.gat,187,153,4 script Hullaris 701,{
- mes "[Hullaris]";
- if(dmdswrd_Q == 11) goto L_1;
- if(dmdswrd_Q == 12) goto L_2;
- if(dmdswrd_Q == 13) goto L_3;
- if(dmdswrd_Q == 14) goto L_4;
-
- mes "Hula Dance? Who says it's merely a hula dance?? It is much more than just some dance.";
- mes "To refer to Comodo's unique form of dancing as simply a hula dance, is just insulting!";
- emotion e_an;
- next;
- mes "[Hullaris]";
- mes "The Comodo Hula Dance was developed long ago. Legend has it that the dance was used to control the minds and bodies of others!";
- mes "Hula 'dance'?.... More like Hula 'communication'......";
- next;
- mes "[Hullaris]";
- mes "This form of 'communication' was capable of not only changing a persons mood, but of controlling a persons mind as well!";
- next;
- mes "[Hullaris]";
- mes "Hehehehehe...... If anyone can dance better than me.... LET EM COME OUT!! It is more than just dancing..........";
- mes "It is a form of 'COMMUNICATION'!!!";
- emotion e_gg;
- close;
-
-L_1:
- mes "Ah, such a great day...........";
- next;
- menu "Show her the Shiny Coin",-,"Don't show her the coin, but continue talking",M_End;
-
- mes "^3355FF- Shows lady the Shiny Coin -^000000";
- next;
- mes "[Hullaris]";
- mes "Hmm, that coin.... How did you know to come and look for me? Ah, I got it. Manzi must have told you about me.";
- emotion e_hmm;
- next;
- mes "[Hullaris]";
- mes "I presume you are also interested in the famous Comodo ^5533FFCheese^000000.";
- mes "Well you've come to the right place because you're talking to a real expert.";
- next;
- mes "[Hullaris]";
- mes "And let me tell you something about how rare Comodo Cheese is.......";
- mes "Some people will NEVER get to taste it in their entire lifetime.....";
- next;
- mes "[Hullaris]";
- mes "Before I go any further, I will need to clear up some of the misconceptions you may have about Comodo Cheese.";
- next;
- mes "[Hullaris]";
- mes "In reality, Comodo Cheese is NOT actually a cheese. It is actually a very powerful enchanted magical stone, know as.........";
- mes "The ^3355FFStone of Awakening^000000.";
- next;
- mes "[Hullaris]";
- mes "Because of the similarities in shape, form, and color, between the two, people have mistaken the stone to be cheese.";
- next;
- mes "[Hullaris]";
- mes "Legend has it that the user of the Stone of Awakening, could gain great knowledge and power much faster than normal people.";
- next;
- mes "[Hullaris]";
- mes "Many Wizards and Mages in the past have grown very powerful in very short time after consuming the Stone of Awakening.";
- next;
- mes "[Hullaris]";
- mes "Therefore, even though my close friend told you to come to me, I cannot just give you this rare item.";
- next;
- mes "[Hullaris]";
- mes "I am very sorry about this, but you will need to prove to me somehow that you are worthy of this stone.";
- next;
- mes "[Hullaris]";
- goto L_2;
-
- M_End:
- mes "[Hullaris]";
- mes "Hey! Don't look at me like that, get out of here!";
- emotion e_gasp;
- close;
-
-L_2:
- mes "Some sort of ^5533FFProof of Worthiness^000000 could be obtained through the wizard ^5533FF'Nigirboran'^000000.";
- mes "He is usually inside of the ^009500East Comodo Dungeon^000000.";
- next;
- mes "[Hullaris]";
- mes "Just tell Nigirboran everything I have told you and he will judge whether or not you are worthy of the Stone of Awakening.";
- mes "Best of luck to you.";
- set dmdswrd_Q, 12;
- close;
-L_3:
- mes "Your back........ do you have the ^5533FFProof of Worthiness^000000?";
- mes "I cannot give you the Stone of Awakening if you have not passed the test.";
- close;
-L_4:
- mes "How did the test go?";
- next;
- mes "^3355FF~ Shows Hullaris ~^000000";
- mes "^3355FF~ Proof of Worthiness ~^000000";
- next;
- mes "[Hullaris]";
- mes "Ah, you did it! I knew you would pass the test. No I mean it.";
- mes "There was something about you that gave me confidence in your abilities.";
- next;
- mes "[Hullaris]";
- mes "Anyway, here is the Stone of Awakening as promised.........";
- next;
- mes "^3355FF~ you received the Stone of Awakening ~^000000";
- mes "^3355FF~ you quickly eat it. . . . . ~^000000";
- next;
- mes "^3355FF~ Munch . .Munch . . ~^000000";
- next;
- mes "^3355FF~ Tastes like some sort of mushroom... ~^000000";
- mes "^3355FF~ it is somewhat sour... ~^000000";
- next;
- mes "^3355FF~ somehow you feel more confident... ~^000000";
- mes "^3355FF~ and more courageous now! ~^000000";
- next;
- mes "[Hullaris]";
- mes "What do you think? The taste and smell are indescribable huh? From the way you look I can tell that it was worth the effort to find.";
- next;
- mes "[Hullaris]";
- mes "You are now one of the few who have been privileged enough to taste Comodo's special 'Cheese', heh heh heh.....";
- mes "Well have fun here in Comodo.";
- set dmdswrd_Q,15;
- close;
-}
-
-//=========================================================
-beach_dun3.gat,30,220,4 script Wizard Nigirboran 704,{
- mes "[Nigirboran]";
- if(dmdswrd_Q == 12) goto L_1;
- if(dmdswrd_Q == 13) goto L_2;
- if(dmdswrd_Q == 14) goto L_3;
- if(dmdswrd_Q == 15) goto L_4;
-
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "[Nigirboran]";
- mes "I am Nigirboran, a Wizard in training...";
- next;
- mes "[Nigirboran]";
- mes "If you don't have anything to say, please do not bother me, I am very busy.";
- close;
-
-L_1:
- mes ". . . . . Hmm. . . . . .";
- next;
- mes "[Nigirboran]";
- mes "Hullaris told you to come didn't she? Let me introduce myself. I am Nigirboran, a Wizard in training.";
- next;
- mes "[Nigirboran]";
- mes "It is true that Comodo ^5533FFCheese^000000 is actually the ^5533FF'Stone of Awakening' or the 'Stone of Wisdom'^000000.";
- mes "It's unfortunate that so many people think of this great stone as nothing more than a tasty snack.";
- next;
- mes "[Nigirboran]";
- mes "A long time ago, real Comodo cheese was actually made from Payon's poisonous mushrooms, Aldebaran's singing plants, and Morroc's cactus juice.";
- next;
- mes "[Nigirboran]";
- mes "The cheese was aged for a minimum of 3 years before it could be eaten. If anyone ate the cheese before it had a chance to properly age....";
- next;
- mes "[Nigirboran]";
- mes "The posion and magic from the cheese would melt their insides instantly............";
- next;
- mes "[Nigirboran]";
- mes "That's why Hullaris sent you here. She wants to see if you can withstand those strong poisons.";
- next;
- mes "[Nigirboran]";
- mes "Are you willing to risk your life just to prove yourself to Hullaris?";
- next;
- menu "Sure, why not.",-, "...... Uh... no....",M_End;
-
- set dmdswrd_Q, 13;
- mes "[Nigirboran]";
- goto L_2;
-
- M_End:
- mes "[Nigirboran]";
- mes "Very well then.";
- close;
-L_2:
- mes "Very good, then let us begin the test.";
- percentheal 100, 100;
- next;
- mes "[Nigirboran]";
- mes "You will be given some real Comodo cheese to eat. If you are strong enough you will have no problems with the cheese.";
- next;
- mes "[Nigirboran]";
- mes "If you start to feel noxious and start having hallucinations, that means you have succumb to the poison and are not worthy of the Stone of Awakening.";
- next;
- mes "[Nigirboran]";
- mes "Ready?";
- next;
- mes "^3355FF~ you are given a piece of funky cheese ~";
- mes ". . . . . . . . . . . . .^000000";
- next;
- mes "^3355FF~ you are given a piece of funky cheese ~";
- mes ". . . . . . . . . . . . .";
- mes "~ you swallow it ~";
- mes ". . . . . . . . . . . . .^000000";
- next;
- mes "^3355FF~ you are given a piece of funky cheese ~";
- mes ". . . . . . . . . . . . .";
- mes "~ you swallow it ~";
- mes ". . . . . . . . . . . . .";
- mes "~ it tastes nasty!!! ~^000000";
- next;
- mes "^3355FF~ your body is overcome with a wave of heat ~";
- mes "~ you feel the poison racing through your body ~^000000";
- sc_start SC_Poison,900000,1;
- next;
- mes "^5533FF. . . . . . . . . . . . . . .^000000";
- next;
- sc_end SC_Poison;
- if(BaseLevel < 25) goto L_LowLvl;
- set @TEMP, rand(3);
- if(@TEMP == 2) goto R_2;
- if(@TEMP == 1) goto R_1;
-
- R_0:
- mes "^3355FF~ your body seems fine but.....but...but.... ~^000000";
- next;
- mes "^3355FF~ your body seems fine but.....but...but.... ~";
- mes "~ You see pink elephants everywhere!! ~^000000";
- next;
- mes "[Nigirboran]";
- mes "Tsk tsk. Although your body didn't seem to have any ill effects from the poison.... your mind was not as fortunate.";
- next;
- mes "[Nigirboran]";
- mes "Hahaha... pink elephants.... reminds me of a bad acid trip I once had... er..... forget what I just said.";
- emotion e_heh;
- next;
- mes "[Nigirboran]";
- mes "If you cannot handle a little piece of cheese, there is absolutely no way you will be able to handle the Stone of Awakening.";
- next;
- mes "[Nigirboran]";
- mes "If you feel up to it, you may try again later. The fact that you're still alive is a good sign.";
- close;
- R_1:
- mes "^3355FF~ now you feel extremely cold and dizzy.... ~";
- mes "~ your body feels weak and you are getting drowsy.... ~^000000";
- sc_start SC_Sleep,900000,1;
- next;
- mes "[Nigirboran]";
- mes "Hmm.... well the good news is you didn't have any hallucinations. Your body however, reacted poorly and you fell asleep.";
- sc_end SC_Sleep;
- next;
- mes "[Nigirboran]";
- mes "If you cannot handle a little piece of cheese, there is absolutely no way you will be able to handle the Stone of Awakening.";
- next;
- mes "[Nigirboran]";
- mes "If you feel up to it, you may try again later. The fact that you're still alive is a good sign.";
- close;
- R_2:
- mes "^3355FF~ you now feel a very strange, soothing sensation........ ~";
- mes "~ your body feels at ease and your mind is clear... ~^000000";
- next;
- mes "[Nigirboran]";
- mes "Hmm?.... Wow! Now that's rare!! You don't seem to have any ill effects from the posion.";
- mes "You must be in top shape both mentally and physically.";
- emotion e_ic;
- next;
- mes "[Nigirboran]";
- mes "You have proved that you are worthy of the ^5533FFStone of Awakening^000000. Take this.......";
- next;
- mes "~ received ^5533FF'Proof of Worthiness'^000000 ~";
- next;
- mes "[Nigirboran]";
- mes "Just show this to Hullaris and she will give you the Stone of Awakening.";
- set dmdswrd_Q, 14;
- next;
- mes "[Nigirboran]";
- mes "Oh, by the way, why did you choose to look for the Stone in the first place?";
- next;
- mes "[Nigirboran]";
- mes "I surely hope its not because of the temptations of the three Doomed Swords...";
- mes "....Huh? You don't know what the three Doomed Swords are?";
- next;
- mes "[Nigirboran]";
- mes "Legend has it that the one who wields the three Doomed Swords";
- mes "^3355FF- Executioner -^000000";
- mes "^3355FF- Mysteltain-^000000";
- mes "^3355FF- Grimtooth -^000000";
- mes "could conquer the whole world with ease.";
- next;
- mes "[Nigirboran]";
- mes "To summon these three Doomed Swords, the user is also required to possess";
- mes "both the ^3355FF` Tablet of Power '^000000 and";
- mes "^3355FF` Book of the Tiresome Sheep'^000000.";
- close;
-
- L_LowLvl:
- mes "^3355FF~ it is unbearable and causes you to faint ~^000000";
- next;
- warp "beach_dun3.gat",32,214;
- doevent "Wizard Nigirboran::OnFainted";
- end;
-
- OnFainted:
- mes "[Nigirboran]";
- mes "~ Sigh ~ You are simply not strong enough to withstand the poison.";
- mes "Maybe if you had a ^5533FFBase level of at least 25^000000, you could withstand the poison....";
- close;
-L_3:
- mes "Go see Hullaris for the Stone of Awakening. Good luck to you.";
- close;
-L_4:
- mes "Look for ^3355FFMoet Leng Good^000000 somewhere";
- mes "inside ^3355FFAldebaran^000000";
- mes "regarding information about the 'Tablet of Power'";
- close;
+//===== eAthena Script =======================================
+//= Quest NPCs related to Comodo
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= 'Cross Hat', 'Bulb Hairband', 'Striped Hairband', 'Blue Hairband' Quests.
+//= 'Mine Helmet', 'Parcel Hat', 'Money Loser's Grief',
+//= 'Phantom of the Opera Mask', 'Doomed Sword' (parts 1,2,3), Quests.
+//===== Additional Comments: =================================
+//= 1.1 Fixed exploits [Lupus]
+//= 1.2 Added more quest from cities/comodo.txt [Evera]
+//============================================================
+
+
+
+//============================================================================================//
+// Hair Ornament Girl
+//============================================================================================//
+// Cross Hat, Bulb Hairband, Striped Hairband, Blue Hairband
+//==================================================
+comodo.gat,227,158,4 script Hair Ornament Girl 700,{
+ mes "[Hair Ornament Girl]";
+ if(sex==1)mes "Oh, hi. Do you need to buy a present for a friend, your mother, or maybe your girl friend? Then get her a Hair Band! It's the best gift you can get her.";
+ if(sex==0)mes "Oh, hi. Do you need to buy a present for a friend, your mother, or maybe yourself? Then get a Hair Band! It's the best gift you can give, or get.";
+ next;
+ mes "[Hair Ornament Girl]";
+ mes "Just by bringing me a few simple items, I can make you a gorgeous Hair Band! Here, take a look at these....";
+M_Menu:
+ next;
+ menu "-Cross Hat Hairband",-, "-Bulb Hairband",M_Bulb, "-Striped Hairband",M_Striped, "-Blue Hairband",M_Blue, "-End Conversation",M_End;
+
+ set @BAND$, "Cross Hat Hairband";
+ set @ITEMS$, " ^5555FF1 Rosary^000000 and ^5555FF500 Destroyed Armors^000000.";
+ if(countitem(2608)>=1 && countitem(7069)>=500) set @GETBAND, 1;
+ goto sL_0;
+
+ M_Bulb:
+ set @BAND$, "Bulb Hairband";
+ set @ITEMS$, "^5555FF1 Slotted Circlet^000000 and ^5555FF20 Glass Beads^000000.";
+ if(countitem(2233)>=1 && countitem(746)>=20) set @GETBAND, 2;
+ goto sL_0;
+
+ M_Striped:
+ set @BAND$, "Striped Hairband";
+ set @ITEMS$, "^5555FF1500 Worn-out Prison Uniforms^000000.";
+ if(countitem(1099)>=1500) set @GETBAND, 3;
+ goto sL_0;
+
+ M_Blue:
+ set @BAND$, "Blue Hairband";
+ set @ITEMS$, "^5555FF1 Bandana^000000, ^5555FF1 Cobaltblue Dyestuffs^000000, and ^5555FF300 Anolian Skins^000000.";
+ if(countitem(2211)>=1 && countitem(978)>=1 && countitem(7003)>=300) set @GETBAND, 4;
+
+ sL_0:
+ mes "[Hair Ornament Girl]";
+ mes "So you're interested in the "+@BAND$+" huh? Here are the items you'll need for the "+@BAND$+":";
+ mes @ITEMS$;
+ next;
+ if(@GETBAND > 0) goto sL_GetBand;
+
+ mes "[Hair Ornament Girl]";
+ mes "Bring me all of these items and I will be able to make you a "+@BAND$+".";
+ goto M_Menu;
+
+ sL_GetBand:
+ mes "[Hair Ornament Girl]";
+ mes "I see that you have enough items for a "+@BAND$+". Would you like me to make you one?";
+ next;
+ menu "Yes, I would.",-, "No thank you.",M_End;
+
+ if(@GETBAND == 1) goto ssL_Cross;
+ if(@GETBAND == 2) goto ssL_Bulb;
+ if(@GETBAND == 3) goto ssL_Striped;
+ if(@GETBAND == 4) goto ssL_Blue;
+
+ ssL_Cross:
+ if(countitem(2608)<1 || countitem(7069)<500) goto L_Cheater;
+ delitem 2608,1;
+ delitem 7069,500;
+ getitem 5036,1;
+ goto ssL_End;
+ ssL_Bulb:
+ if(countitem(2233)<1 || countitem(746)<20) goto L_Cheater;
+ delitem 2233,1;
+ delitem 746,20;
+ getitem 5034,1;
+ goto ssL_End;
+ ssL_Striped:
+ if(countitem(1099)<1500) goto L_Cheater;
+ delitem 1099,1500;
+ getitem 5049,1;
+ goto ssL_End;
+ ssL_Blue:
+ if(countitem(2211)<1 || countitem(978)<1 || countitem(7003)<300) goto L_Cheater;
+ delitem 2211,1;
+ delitem 978,1;
+ delitem 7003,300;
+ getitem 5052,1;
+ ssL_End:
+ mes "[Hair Ornament Girl]";
+ mes "Here is your "+@BAND$+". Thank you.";
+ set @GETBAND, 0;
+ close;
+ L_Cheater:
+ mes "[Hair Ornament Girl]";
+ mes "Ooops... Where are these items?";
+ close;
+
+ M_End:
+ mes "[Hair Ornament Girl]";
+ mes "Hope to see you again soon.";
+ close;
+}
+
+
+//===================================================================================================//
+// Mari Isac
+//===================================================================================================//
+// 'Mine Helmet', 'Parcel Hat', 'Money Loser's Grief', 'Phantom of the Opera Mask'
+//===============================================================//
+comodo.gat,274,137,5 script Mari Isac 702,{
+ mes "[Mari Isac]";
+ mes "I travel all over the world and get to hear many interesting stories from the people I meet.";
+ mes "Sometimes they even teach me how to make special items";
+ next;
+ mes "[Mari Isac]";
+ mes "Would you be interested in some of the items I've learned to make?";
+M_Menu:
+ next;
+ menu "Tell me about them.",M_0, "Make me one.",M_1;
+
+ M_0:
+ menu "-Mine Helmet",-, "-Parcel Hat",sM_Parcel, "-Money Loser's Grief",sM_Money, "-Phantom of the Opera Mask",sM_Phantom;
+
+ mes "[Mari Isac]";
+ mes "I learned how to make the Mine Helmet when I traveled to the old coal mines near Geffen.";
+ next;
+ mes "[Mari Isac]";
+ mes "The 2 most important things a miner needs are light, and head protection.";
+ mes "A very inventive miner was able to create something that dealt with both issues.";
+ next;
+ mes "[Mari Isac]";
+ mes "He attached a light to his safety helmet and called it a Mine Helmet.";
+ mes "This meant that miners no longer had to worry about carrying around lamps and could work more efficiently.";
+ next;
+ mes "[Mari Isac]";
+ mes "Anyways, if you want me to make you a Mine Helmet you'll need to bring me these items:";
+ mes "^5555FF1 Safety Helmet^000000,";
+ mes "^5555FF1 Candle^000000,";
+ mes "^5555FF1 Crystal Mirror^000000,";
+ mes "^5555FF25 Steel^000000.";
+ next;
+ goto M_0;
+ sM_Parcel:
+ mes "[Mari Isac]";
+ mes "I learned how to make the Parcel Hat when I traveled to Alberta. There they have a unique way of distributing mail and goods.";
+ next;
+ mes "[Mari Isac]";
+ mes "Instead of using a pouch or a sack to carry items for delivery, they use a special kind of hat, called a Parcel Hat.";
+ mes "This hat allows the delivery personel to carry numerous items on their heads. Of course they have to have good balance to use it.";
+ next;
+ mes "[Mari Isac]";
+ mes "Anyways, if you want me to make you a Parcel Hat, you'll need to bring me these items.";
+ mes "^5555FF150 Fabric^000000,";
+ mes "^5555FF100 Resin^000000,";
+ mes "^5555FF1 Cobaltblue Dyestuffs^000000.";
+ next;
+ goto M_0;
+ sM_Money:
+ mes "[Mari Isac]";
+ mes "I learned how to make the Money Loser's Grief when I traveled to Morroc.";
+ next;
+ mes "[Mari Isac]";
+ mes "A long time ago an honest merchant got into a conflict with a crooked guild.";
+ mes "Unlike the dirty guild, the merchant did not scam or cheat people.";
+ next;
+ mes "[Mari Isac]";
+ mes "Because of this they attacked the merchants shop and took all of his goods.";
+ next;
+ mes "[Mari Isac]";
+ mes "The merchant was devastated by the loss of his shop.";
+ mes "In his sadness he used the bits and pieces that were left from his shop to create a new item.";
+ next;
+ mes "[Mari Isac]";
+ mes "He created the Money Loser's Grief, a symbol of his great sadness. When people see it, they can't help but feel sympathetic to the wearer.";
+ next;
+ mes "[Mari Isac]";
+ mes "Many merchants now wear it to help themselves get more business. Of course it is also a reminder of the honest merchants sad tale.";
+ next;
+ mes "[Mari Isac]";
+ mes "Anyways, if you want me to make you a Money Losers Grief, you'll need to bring me these items.";
+ mes "^5555FF1 Circlet with a single slott^000000,";
+ mes "^5555FF1 Gold^000000,";
+ mes "^5555FF20 Steel^000000,";
+ mes "^5555FF80 Feathers^000000,";
+ mes "^5555FF800 Sticky Mucus^000000.";
+ next;
+ goto M_0;
+ sM_Phantom:
+ mes "[Mari Isac]";
+ mes "I learned how to make the Phantom of the Opera Mask when I traveled to Al De Baran.";
+ mes "The story behind this item is that of a man's pure love........";
+ next;
+ mes "[Mari Isac]";
+ mes "There once was a man who was in love with a beautiful opera singer.";
+ mes "Unfortunately the man had a terribly disfigured face which forced to him to wear a mask.";
+ next;
+ mes "[Mari Isac]";
+ mes "He was ashamed of his appearance and could never bring himself to face the singer.";
+ mes "The man instead, watched her from a far, admiring every nuance of her beauty and grace.";
+ next;
+ mes "[Mari Isac]";
+ mes "He lurked in the bowles of the opera house and from time to time he would sing his sad love song.";
+ mes "Many people heard it and believed that there was a phantom haunting the opera house.";
+ next;
+ mes "[Mari Isac]";
+ mes "The singer also heard his song, and through it she was able to feel his pain and his love for her.";
+ mes "The two eventually met, and when they did she was able to look past his appereance and accept him for who he was.";
+ next;
+ mes "[Mari Isac]";
+ mes "Too this day, the tale of the masked 'phantom' is still romantacised.";
+ next;
+ mes "[Mari Isac]";
+ mes "Anyways, if you want me to make you a Phantom of the Opera Mask, you'll need to bring me these items.";
+ mes "^5555FF1 Opera Masque^000000,";
+ mes "^5555FF50 Horrendous Hairs^000000.";
+ goto M_0;
+
+ M_1:
+ menu "-Mine Helmet",-, "-Parcel Hat",sM_MakePar, "-Money Loser's Grief",sM_MakeMon, "-Phantom of the Opera Mask",sM_MakePhan;
+
+ if(countitem(5009)<1 || countitem(5028)<1 || countitem(747)<1 || countitem(999)<25) goto ssL_NoItems;
+ delitem 5009, 1;
+ delitem 5028, 1;
+ delitem 747, 1;
+ delitem 999, 25;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Mine Helmet!";
+ getitem 5031,1;
+ close;
+ sM_MakePar:
+ if(countitem(1059)<150 || countitem(907)<100 || countitem(978)<1) goto ssL_NoItems;
+ delitem 1059, 150;
+ delitem 907, 100;
+ delitem 978, 1;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Parcel Hat!";
+ getitem 5023,1;
+ close;
+ sM_MakeMon:
+ if(countitem(2233)<1 || countitem(969)<1 || countitem(999)<20 || countitem(949)<80 || countitem(938)<800) goto ssL_NoItems;
+ delitem 2233, 1;
+ delitem 969, 1;
+ delitem 999, 20;
+ delitem 949, 80;
+ delitem 938, 800;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Money Loser's Grief!";
+ getitem 5021,1;
+ close;
+ sM_MakePhan:
+ if(countitem(2281)<1 || countitem(1048)<50) goto ssL_NoItems;
+ delitem 2281,1;
+ delitem 1048, 50;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Phantom of the Opera Mask!";
+ getitem 5043, 1;
+ close;
+
+ ssL_NoItems:
+ mes "[Mari Isac]";
+ mes "You don't seem to have enough items for me to make that hat. Please come back when you do.";
+ close;
+}
+
+//============================================================================//
+// Chief Quest (Doomed Swords Part 1)
+//============================================================================//
+//=======================================================
+comodo.gat,206,310,4 script Rochito 48,{
+ if(dmdswrd_Q == 1) goto L_1;
+ if(dmdswrd_Q == 2) goto L_2;
+ if(dmdswrd_Q == 3) goto sL_2;
+ if(dmdswrd_Q == 4) goto L_3;
+ if(dmdswrd_Q == 5 || dmdswrd_Q == 6) goto sL_3;
+L_0:
+ mes "[Rochito]";
+ mes "Meat, meat, meat... I LOVE MEAT!! Eat, eat, eat... ALL I eat is MEAT!! I'm sooo obsessed with meat..... I'm... I.. I... I'm a MEAT MAN!!";
+ emotion e_lv;
+ next;
+ mes "[Rochito]";
+ mes "Comodo is meat heaven!! That's why BBQ camping in Comodo is sooooo AWESOME!!!";
+ next;
+ menu "Tell me more about BBQ Camping.",M_0, "End Conversation.",M_End;
+
+ M_0:
+ mes "[Rochito]";
+ mes "The Komodoru, a native animal of Comodo, is famous because of it's delicious meat. Every part of the animal is tasty.";
+ mes "However the tastiest part of the Komodoru, is the area around the spine. It's number one!";
+ emotion e_no1;
+ next;
+ mes "[Rochito]";
+ mes "Look at all of this meat in front of me! I don't know what to do with all of this meat! What should I do?? Oh no!...";
+ emotion e_swt2;
+ next;
+ mes "[Rochito]";
+ mes "Oh, I almost forgot!! You must try this Komodoru spine meat with Comodo's authentic BBQ seasoning.";
+ mes "^5555FFKoserahserah^000000 is the name of the seasoning, and you should at least try it once before you leave.";
+ next;
+ mes "[Rochito]";
+ mes "There is a rumor going around this camp ground that Koserahserah is soooo good that it might be addictive.";
+ mes "It's possible that it may even cause a slight euphoria in those who try it.";
+ next;
+ mes "[Rochito]";
+ mes "I'm not sure if that's true, but I do not that the seasoning is not allowed to be exported outside of Comodo.";
+ mes "Luckily I'm a resident here so I can have as much as I want.";
+ next;
+ mes "[Rochito]";
+ mes "Still, the authorities are worried about how Koserahserah should be regulated.";
+ mes "The ^5555FFChief of Comodo^000000 is currently working on a some guidelines for it.";
+ if(dmdswrd_Q == 0) set dmdswrd_Q, 1;
+ close;
+ M_End:
+ close;
+
+L_1:
+ mes "[Rochito]";
+ mes "This Komodoru spine meat is delicious when seasoned with ^5555FFKoserahseah^000000, a local flavoring that is the pride of Comodo!!";
+ mes "Would you like to try some?";
+ next;
+ mes "[Rochito]";
+ mes "Oh, are you looking for the ^5555FFChief's^000000 house? Just go west of this camp ground to the village. You'll find his house there.";
+ close;
+
+L_2:
+ mes "[Rochito]";
+ mes "We have a lot of time left on our vacation and I think we should spend the rest of it here, enjoying the Komodoru meat.";
+ next;
+ mes "[Rochito]";
+ mes "In fact, we should just keep on having BBQ parties!";
+ next;
+ mes "^5533FF~ gave Rochito the Koserahserah ~^000000";
+ next;
+ mes "[Rochito]";
+ mes "Oh my!! This is the special Comodo seasoning.... Koserahserah!! How did you manage to get this precious delicacy?";
+ emotion e_gasp;
+ next;
+ mes "[Rochito]";
+ mes "Oh... I see, I see. So it was given to you by my long time friend. Well, thank you so much.... thank you...";
+ emotion e_thx;
+ next;
+ mes "[Rochito]";
+ mes "Hey everybody! Tausupa has sent us some Koserahserah seasoning!!";
+ next;
+ mes "[Emralhandas]";
+ mes "Our old friend?";
+ next;
+ mes "[Rochito]";
+ mes "I don't know if we should take such a great gift....";
+ next;
+ mes "[Rockha]";
+ mes ".........................";
+ next;
+ mes "[Rochito]";
+ mes "We should give him something in return as a thank you. But what can we give him?...";
+ mes "should we give him that wonderful ^5555FFWine^000000 we've been saving? It has a very nice aroma....";
+ next;
+ mes "[Rochito]";
+ mes "May I ask a favor of you? If it is not too much trouble, would you take this to our dear friend.....";
+ mes "I would deliver this in person but I'm a little busy with the BBQ and all.....";
+ next;
+ mes "[Rochito]";
+ mes "Please. We would be very grateful if you could give this to him.";
+ next;
+ mes "^5555FF~ received 'Mureuchieligu Wine' ~^000000";
+ set dmdswrd_Q, 3;
+ close;
+
+ sL_2:
+ mes "[Rochito]";
+ mes "Please do us a favor and deliver the wine to the chief. We would be very happy if you did.";
+ close;
+
+L_3:
+ mes "[Rochito]";
+ mes "You've returned..... Oh! Thank you for the delivering the wine for us.";
+ emotion e_thx;
+ set dmdswrd_Q, 5;
+ next;
+
+ sL_3:
+ mes "[Rochito]";
+ mes "We are very proud of our courageous friend. It is because of him that we can live peacefully and travel safely.";
+ next;
+ mes "[Rochito]";
+ mes "Oh, I just remembered something....";
+ mes "We've been talking about Comodo's famous meat all this time, and I didn't even mention Comodo's world famous ^5555FFCheese^000000!";
+ next;
+ mes "[Rochito]";
+ mes "I believe there is a cheese expert named ^5533FFTORUNA^000000 somewhere on this island.";
+ mes "If your interested in the cheese you should go ask him about it.";
+ if(dmdswrd_Q == 5) set dmdswrd_Q, 6;
+ close;
+
+
+}
+
+//=======================================================
+comodo.gat,204,310,4 script Rockha 98,{
+ if(dmdswrd_Q == 3) goto L_1;
+ if(dmdswrd_Q == 4 || dmdswrd_Q==5) goto L_2;
+L_0:
+ mes "[Rockha]";
+ mes ". . . . . . . . . .";
+ mes "My friends and I always wanted to have our BBQ eat out.....";
+ mes ". . . . . . . . . .";
+ next;
+ menu "About the ^3355FFChief^000000.",M_0, "End Conversation.",M_End;
+
+ M_0:
+ mes "[Rockha]";
+ mes "Yeah... I recently discovered that a friend I thought I lost during the ^FF4444'War with the Witch'^000000, is still alive.";
+ mes "Now he's the ^5555FFChief of Comodo^000000....";
+ next;
+ mes "[Rockha]";
+ mes "At the end of the war the witch was defeated and sealed in the ground beneath this village.";
+ next;
+ mes "[Rockha]";
+ mes "It is rumored that the seasonings we get from our local plants somehow receive their unique qualities from the Witch's magical influence.";
+ next;
+ mes "[Rockha]";
+ mes "Although my friend and I now live in different worlds, his new life hasn't changed him.";
+ mes "Thankfully we can still be friends after all that's happened.";
+ close;
+
+L_1:
+ mes "[Rockha]";
+ mes "Oh, and by the way.... Could you give him this message as well?";
+ mes "Tell him, 'For as long as you have remembered us, we will not forget you. Friends forever.'.....";
+ close;
+
+L_2:
+ mes "[Rockha]";
+ mes "Ha ha ha..... aaaahhh.... THIS is FRIENDSHIP!!";
+ emotion e_heh;
+ next;
+ mes "[Rockha]";
+ mes "Let us take a moment to make a toast to our good friend. Let us eat and drink until we can eat no more!!";
+ next;
+ mes "[Rockha]";
+ mes "~!!Yippeeeeee!!~!!Wooohooooo!!~";
+ close;
+ mes "[Rockha]";
+ mes "Thank you for your assistance. You have shown us that you are truly a good person. We now consider you as a friend.";
+ next;
+ mes "[Rockha]";
+ mes "If you ever need any help, just come and look for me, ^3355FF'Rockha'^000000. We are forever in your debt.";
+ close;
+}
+
+//=======================================================
+comodo.gat,209,314,4 script Rotute 82,{
+ if(dmdswrd_Q==2 || dmdswrd_Q==3) goto L_1;
+ if(dmdswrd_Q == 4 || dmdswrd_Q==5) goto L_2;
+
+L_0:
+ mes "[Rotute]";
+ mes "The quest for the ^5555FFSwords of Power^000000 has not yet been completed!";
+ next;
+ mes "[Rotute]";
+ mes "Although four of the swords have been recovered by our team, there are rumors of a more powerful sword near ^5555FFGlastheim^000000.";
+ mes "This has brought us yet another challenge.....";
+ next;
+ mes "[Rotute]";
+ mes "We must find this new sword!! A new expedition has been planned to find this sword but I feel very anxious.";
+ mes "If we succeed this will affect the whole world!! For my deceased father.....";
+ next;
+ mes "[Rotute]";
+ mes "...... We MUST SUCCEED!!!!";
+ emotion e_go;
+ close;
+
+L_1:
+ mes "[Rotute]";
+ mes "Wow!! This is Comodo's famous seasoning!! The Captain's friend is truly a good person. To be this generous is unbelievable!";
+ emotion e_gasp;
+ next;
+ mes "[Rotute]";
+ mes "I can only hope that I find a friend that is as loyal as he on this quest.....";
+ close;
+
+L_2:
+ mes "[Rotute]";
+ mes "It's strange.... this is only my first visit to Comodo and yet.... for some reason, it seems so familiar... like it's my home town.";
+ next;
+ mes "[Rotute]";
+ mes "When this journey is over, I hope to visit this wonderful place again..... It feels like something is waiting for me here.";
+ next;
+ mes "[Rotute]";
+ mes "Oh, and thanks so much for helping our captain.";
+ emotion e_thx;
+ close;
+}
+
+//=======================================================
+comodo.gat,209,305,4 script Emralhandas 70,{
+ mes "[Emralhandas]";
+ mes "Rockha, empty your glass so I can pour you a drink.";
+ next;
+ mes "[Emralhandas]";
+ mes "Many years ago, during the War with the Witch, we dreamed of the day when we could live in peace.";
+ mes "Today that dream has come true and it's all because of you my friends!!";
+ emotion e_no1;
+ next;
+ menu "Ask about her friends....",M_0, "End Conversation",M_End;
+
+ M_0:
+ mes "[Emralhandas]";
+ mes "Many years ago, heroes from every region of Rune Midgard were selected to embark upon a very unique and important quest.";
+ next;
+ mes "[Emralhandas]";
+ mes "The goal was to find the ^5555FF4 rare 'Swords of Power'^000000!";
+ mes "These 4 swords were said to be the most powerful weapons to have ever been made.";
+ next;
+ mes "[Emralhandas]";
+ mes "After 10 hard years of searching, all 4 swords were found and brought together.";
+ mes "Out of all of those who searched the swords, the four bravest were chosen to protect them.";
+ next;
+ mes "[Emralhandas]";
+ mes "I, Emralhandas, was one of the four that were chosen.";
+ next;
+ mes "[Emralhandas]";
+ mes "Of course there were many hardships that we had to endure before, and even after these swords were found........";
+ next;
+ mes "[Emralhandas]";
+ mes "Our team of adventures consisted of myself, our ship's captain 'Rockha', our comrade 'Rochito', and the Chief of this town, 'Tausupa'.";
+ next;
+ mes "[Emralhandas]";
+ mes "We had found the last sword and headed back to the island. Up to this point we had not even thought about the weapon's owner.";
+ mes "As we left we began to have a bad feeling about what was going to happen next.";
+ next;
+ mes "[Emralhandas]";
+ mes "When we returned to the island, we were confronted by ^790079'Mariposum'^000000, a powerful Witch who practiced the dark art of EVIL magic!!";
+ next;
+ mes "[Emralhandas]";
+ mes "Her goal was to take over the world and plunge into a dark chaos!! We had to defend not only ourselves, but the future of humanity!!";
+ mes "So it was here that me made our stand against this terrible evil!";
+ emotion e_gasp;
+ next;
+ mes "[Emralhandas]";
+ mes "A tremendous battle took place and many of our comrades fell that day... but their efforts were not in vain.";
+ next;
+ mes "[Emralhandas]";
+ mes "With bloodshed and fierce determination we were able to defeat the witch and imprison her beneath the earth.";
+ next;
+ mes "[Emralhandas]";
+ mes "Of all of those who risked their lives that day, one stood out amongst the rest and became the deciding factor in the witch's defeat.....";
+ next;
+ mes "[Emralhandas]";
+ mes "It was ^5555FFTausupa^000000.";
+ next;
+ mes "[Emralhandas]";
+ mes "Of course we are great full to all the brave warriors who fought and lost their lives that day.";
+ mes "Especially to 'Rotute's' father who cannot be with us today, may he rest in peace.";
+ next;
+ mes "[Emralhandas]";
+ mes "Rotute does not know about this yet, but hopefully he will find out about his father's heroism before this quest is complete......";
+ close;
+ M_End:
+ mes "[Emralhandas]";
+ mes "Our quest has not yet been completed. Rockha, we must eat all of the meat in Rune Midgard until there is none left!!";
+ mes "We must eat and eat, for the pride of our Meat Club!!! (~hiccup~)";
+ close;
+}
+
+
+// Chief's House =========================================================//
+cmd_in02.gat,32,140,4 script Chief Tausupa 49,{
+ if(dmdswrd_Q == 1) goto L_1;
+ if(dmdswrd_Q == 2) goto sL_1;
+ if(dmdswrd_Q == 3) goto L_2;
+ if(dmdswrd_Q == 4) goto sL_2;
+
+L_0:
+ mes "[Chief Tausupa]";
+ mes "Hello, I am the Chief of Comodo. You may call me Tausupa. Comodo is a place of pleasure, enjoyment, love, and beauty.";
+ mes "Welcome, and have a pleasant and relaxing stay here.";
+ next;
+ menu "Ask about the ^5555FFCasino^000000.",M_0, "Ask about the ^790079Evil Witch^000000.",M_1, "End Conversation.",M_End;
+
+ M_0:
+ mes "[Chief Tausupa]";
+ mes "The Casino is one of the many notable sites in Comodo. It would seem that you have some interest in it.";
+ mes "The Casino uses it's own currency, a coin called the ^5555FF'Eulwo'^000000.";
+ next;
+ mes "[Chief Tausupa]";
+ mes "There are a variety of games for you to enjoy there.";
+ mes "The earnings you win can be used to purchase different items available only in the Casino.";
+ next;
+ mes "[Chief Tausupa]";
+ mes "These earnings, which are in the form of Eulwo, cannot be exchanged for Zeny though.";
+ close;
+ M_1:
+ mes "[Chief Tausupa]";
+ mes ". . . . . . . . . .";
+ mes "You must be from out of town. I'm not sure where you heard about it, but that story is old and most people have forgotten about it.";
+ mes "It's really not worth mentioning. . . . . . . . . . . .";
+ close;
+ M_End:
+ mes "[Chief Tausupa]";
+ mes "If you haven't noticed, Comodo is located inside of a huge, natural, cave. No matter what time of day it is, you'll never see the sunlight.";
+ next;
+ mes "[Chief Tausupa]";
+ mes "It is this unique 24 hour nightlife that attracts so many tourist to our town. Anyways, please enjoy your stay here.";
+ close;
+
+L_1:
+ mes "[Tausupa]";
+ mes "..... Is that so? My long time friends have come back to Comodo and are at the Camp Grounds enjoying the BBQ huh?.......";
+ next;
+ mes "[Tausupa]";
+ mes "It would seem that they are planning another expedition........";
+ next;
+ mes "[Tausupa]";
+ mes "I have not seen my friends in a long time and the sound of going on another adventure with them is very exciting.... however......";
+ next;
+ mes "[Tausupa]";
+ mes "~sigh~ Unfortunately I will not be able to go with them. I fear that if I leave, the evil witch will revive and wreak havoc on this world once again.";
+ next;
+ mes "[Tausupa]";
+ mes "..... I have a favor I must ask of you.......";
+ next;
+ mes "[Tausupa]";
+ mes "Can you take this special seasoning to my friends?";
+ next;
+ mes "^5555FF~ recieved Koserahserah ~^000000";
+ set dmdswrd_Q, 2;
+ next;
+
+ sL_1:
+ mes "[Chief Tausupa]";
+ mes "Please take this seasoning to my friends at the BBQ camp grounds and give it to ^5555FFRochito^000000. Thank you.";
+ close;
+
+L_2:
+ mes "[Chief Tausupa]";
+ mes "Were my friends happy? After you left, I had some time to think..... I should have delivered the seasoning personally......";
+ mes "I should have gone to see them......";
+ next;
+ mes "[Chief Tausupa]";
+ mes "But I am much too busy as the Chief of Comodo........ Maybe I should quit...........";
+ mes "I really want to go on another quest with my good friends.... How did I end up like this?";
+ next;
+ mes "^5555FF~ you give him Mureuchieligu Wine and convey the message ~^000000";
+ next;
+ mes "[Chief Tausupa]";
+ mes "..................";
+ next;
+ mes "[Chief Tausupa]";
+ mes "That was a message from my friends? I think I understand now.... My friends are TRUE friends. They have been thinking of me all this time........";
+ next;
+ mes "[Chief Tausupa]";
+ mes "I have made up my mind!";
+ emotion e_ic;
+ next;
+ mes "[Chief Tausupa]";
+ mes "Mureuchieligu Wine is made as soon as the grapes are picked. It is then bottled in the very same place and is left there to age.";
+ mes "The wine spends the rest of its days aging in the same spot.";
+ next;
+ mes "[Chief Tausupa]";
+ mes "Much like the wine, I have been aging away in the same place here in Comodo, and I must continue to stay here for it is my duty.";
+ next;
+ mes "[Chief Tausupa]";
+ mes "I am thankful for my friends' advice. The gift they gave me had a great deal of meaning.";
+ mes "Please tell my friends this, 'I will not avoid my destiny. On the contrary, I will fulfill it to the best of my ability'.";
+ set dmdswrd_Q, 4;
+ next;
+
+ sL_2:
+ mes "[Chief Tausupa]";
+ mes "I would like to thank you for helping my friends and I. I am truly great full.";
+ close;
+}
+
+
+
+//============================================================================//
+// Cheese Quest (Doomed Swords Part 2)
+//============================================================================//
+
+//=======================================================
+comodo.gat,88,97,4 script Cheese Expert TORUNA 109,{
+ if(dmdswrd_Q == 7) goto sL_2;
+ mes "[TORUNA]";
+ mes "I hear that the cheese here is delicious. Every time I come here to visit, I ask for some of that popular cheese.";
+ mes "But they always seem to be out! If I could just get a taste of that cheese...........";
+M_Menu:
+ next;
+ menu "Ask about the cave.",M_0, "Comodo is a town inside a cave?",M_1, "End Conversation.",M_End;
+
+ M_0:
+ mes "[TORUNA]";
+ mes "It is a natural formation of limestone which was shaped by the erosive powers of fresh water with sea water.";
+ next;
+ mes "[TORUNA]";
+ mes "The air and topsoil in the cave are rich in carbon-dioxide gas.";
+ mes "This was caused by C02 gas leaking into the cave through cracks in the limestone over a period of many years.";
+ next;
+ mes "[TORUNA]";
+ mes "Water from rainfall and ocean currents slowly eroded the limestone to carve out the cave.";
+ next;
+ mes "[TORUNA]";
+ mes "Essentially a cave is formed when water finds cracks in some type of rock formation and erodes the rock to a point where a cave is formed.";
+ mes "Of course this takes hundreds of years and a lot of water.";
+ goto M_Menu;
+ M_1:
+ mes "[TORUNA]";
+ mes "Yep. What you see here is really the inside of a gigantic cave.";
+ mes "Most people don't realize this at first, and that's thanks to all of the towns people's hard work and dedication.";
+ next;
+ mes "[TORUNA]";
+ mes "The people who settled here were very industrious and worked diligently to turn this cave into a place that they could call home.";
+ next;
+ mes "[TORUNA]";
+ mes "They slowly chipped away at the limestone surfaces, to shape the interior of the cave into something much more eye pleasing.";
+ mes "It was from these humble beginnings that the Comodo you see today, was founded.";
+ next;
+ if(dmdswrd_Q == 6) goto sL_1;
+
+ mes "[TORUNA]";
+ mes "Unfortunately that is only half the story.";
+ next;
+ mes "[TORUNA]";
+ mes "The early settlers faced an even greater challenge when the ^790079Evil Witch, Meropusum^000000, arrived.";
+ mes "She was determined to rule the world, and used the newly founded town of Comodo as her staging ground.";
+ next;
+ mes "[TORUNA]";
+ mes "Led by a group of strong heroes, the town fought back against the witch and sealed her away. Many lives were lost in this war however.";
+ next;
+ mes "[TORUNA]";
+ mes "The strongest of the heroes was chosen as the town's new leader, and under his leadership the town prospered.";
+ next;
+ mes "[TORUNA]";
+ mes "Be aware though, that Meropusom is still alive. Although she has been sealed away, her evil powers can still be felt.";
+ mes "Her minions still lurks in the shadows awaiting their master's return.";
+ next;
+ mes "[TORUNA]";
+ mes "So be cautious when venturing into the unknown parts of Comodo. Anyway, so long and take care.";
+ goto M_Menu;
+
+ sL_1:
+ mes "[TORUNA]";
+ mes "Not only has this cave become a home for the people of Comodo, but it's unique environment has also helped in creating....";
+ next;
+ mes "[TORUNA]";
+ mes "The world famous..... Comodo ^5533FFCheese^000000!!!";
+ emotion e_ic;
+ next;
+ mes "[TORUNA]";
+ mes "This special Cheese is simply DELICIOUS! You will understand how good the Cheese is once you try it.";
+ emotion e_lv2;
+ set dmdswrd_Q, 7;
+ next;
+ sL_2:
+ mes "[TORUNA]";
+ mes "You should go speak with the people at the ^009500Outdoor Bar^000000 near the camp grounds.";
+ mes "I heard them talking about the ^5533FFCheese^000000, it is so popular.";
+ close;
+ M_End:
+ mes "[TORUNA]";
+ mes "The taste of Comodo Cheese is simply out of this world!! Just one taste and I guarantee that you won't be able to stop!";
+ mes "It's so good you may even go GRAZY without it!";
+ emotion e_lv;
+ next;
+ mes "[TORUNA]";
+ mes "Oh if I could just have one piece.... I'd be so happy I'd dance all night on that ^5555FFHula Dancing Stage^000000!!";
+ close;
+}
+
+//=======================================================
+comodo.gat,164,291,2 script Rakusa 73,{
+ if(dmdswrd_Q == 7) goto L_1;
+ if(dmdswrd_Q == 8) goto L_2;
+
+ mes "[Rakusa]";
+ mes "Comodo is often referred to as the town of 'recreation and relaxation'.......";
+ next;
+ mes "[Rakusa]";
+ mes "This can be misleading however, for Comodo is not only the home of fun tourist attractions, but two very ^FF4444dangerous dungeons^000000 as well.";
+ next;
+ mes "[Rakusa]";
+ mes "This area has unusually strong monsters. If you plan on entering the dungeons, be very well prepared and expect trouble.";
+ mes "These dungeons are definitely not for the faint of heart!";
+ close;
+L_1:
+ mes "[Rakusa]";
+ mes "That man sitting over there simply won't stop talking about that Comodo ^3355FF'Cheese'^000000.........";
+ next;
+ mes "[Rakusa]";
+ mes "I just can't stop wondering about what kind of Cheese it is. I sure hope I will have the opportunity to try it someday.";
+ set dmdswrd_Q, 8;
+ next;
+L_2:
+ mes "[Rakusa]";
+ mes "It looks like ^5533FFKichiri^000000 isn't as interested in the Cheese as that other man is though...... actually he looks rather annoyed.........";
+ next;
+ mes "[Rakusa]";
+ mes "Someone should check on Kichiri and make sure everything is all right......";
+ close;
+}
+
+//=======================================================
+comodo.gat,169,284,4 script Kichiri 99,{
+ mes "[Kichiri]";
+ if(dmdswrd_Q == 8) goto L_1;
+ if(dmdswrd_Q == 9) goto L_2;
+
+ mes "In the heart of Comodo lies a performance stage. It's where a number of crazed residents put on shows for the tourists that come to visit.";
+ mes "The shows are so popular that some tourist even come back to Comodo to see them again.";
+ next;
+ mes "[Kichiri]";
+ mes "Many of the residents just dance and dance without much skill.";
+ mes "But for the few who show some talent, there is the possibility of being recruited by the local ^5555FFDancers Guild^000000.";
+ close;
+L_1:
+ mes "The guy sitting near me just won't stop talking about Comodo ^5533FFCheese^000000...... It's going to drive me insane!";
+ emotion e_pif;
+ next;
+ mes "[Kichiri]";
+ mes "Yeah, right over there, the guy named ^3355FFMagatu^000000. Can you do something about it?";
+ set dmdswrd_Q, 9;
+ close;
+L_2:
+ mes "I just want to have a quit time and have a few drinks, is this too much to ask for?";
+ mes "Stupid drunk ^3355FF' Magatu '^000000..... always talking about ^5533FFCheese^000000......";
+ emotion e_ag;
+ close;
+}
+
+//=======================================================
+comodo.gat,163,280,4 script Magatu 55,{
+ mes "[Magatu]";
+ if(dmdswrd_Q == 9) goto L_1;
+ if(dmdswrd_Q == 10) goto L_2;
+
+ mes "Yes! That's it!! The irresistible smell of that amazing ^5533FFCheese^000000!! It's so delicious!.... Oh, I can't wait any longer......";
+ emotion e_lv;
+ next;
+ mes "[Magatu]";
+ mes "No matter what anyone else says..... Comodo Cheese is truly the BEST!!! Kekekeke!!";
+ emotion e_no1;
+ next;
+ mes "[Magatu]";
+ mes "Cheese! CHEESE!! WONDERFULL Comodo CHEESE!!!.... so.... tas... ty.... (~drooools~)";
+ emotion e_lv;
+ close;
+L_1:
+ mes "What? You want to know some information regarding Comodo's special ^5533FFCheese^000000?";
+ mes "I guess I could give you some inside information............";
+ emotion e_what;
+ next;
+ mes "[Magatu]";
+ mes "Okay, go to the ^009500Casino^000000 and look for a guy named ^5533FFManzi^000000. He should be somewhere on the first floor.";
+ mes "He's got a huge scar on his face so he should be easy to spot.";
+ next;
+ mes "[Magatu]";
+ mes "When you see him give him this Bottle Cap. Don't do anything else, just give him the bottle cap and he will give you some info on the Cheese....";
+ next;
+ mes "^3355FF- Received a Bottle Cap -^000000";
+ set dmdswrd_Q, 10;
+ close;
+L_2:
+ mes "Oh yeah, I got to tell you my friend's name.....";
+ next;
+ mes "[Magatu]";
+ mes "O? I already told you? Bah, I am so drunk....... ^5533FFManzi^000000... He’s in the ^009500Casino^000000, got it?";
+ emotion e_hmm;
+ close;
+}
+
+//======================================================
+cmd_in02.gat,189,99,4 script Manzi 85,{
+ if(dmdswrd_Q == 10) goto L_1;
+ if(dmdswrd_Q == 11) goto L_2;
+ if(BaseJob == Job_Novice) goto L_Nov;
+
+ mes "[Manzi]";
+ mes "There have been some people who've bet too much and have lost their pecopeco and many other precious items.";
+ mes "So be careful when you make your bets..... you might just loose the shirt off your back.......";
+ close;
+
+ L_Nov:
+ mes "[Manzi]";
+ mes "Stop bothering me you little kid. This place is for adults only, get out of here.";
+ close;
+L_1:
+ mes "[Manzi]";
+ mes "Yes?..........";
+ next;
+ mes "^3355FF- You give him the Bottle Cap-^000000";
+ next;
+ mes "[Manzi]";
+ mes "..........................";
+ next;
+ mes "[Mazi]";
+ mes "Whoa! This is from my friend Magatu, you must be someone of great importance to him.";
+ mes "Otherwise, he wouldn't have given you the Bottle Cap.";
+ emotion e_ic;
+ next;
+ mes "[Manzi]";
+ mes "I made a promise to Magatu that I'd help anybody who had one of his bottle caps find out more about the ^5533FFCheese^000000.........";
+ next;
+ mes "[Manzi]";
+ mes "Only a selected few get the rare opportunity to taste the legendary Comodo Cheese you know.";
+ next;
+ mes "[Manzi]";
+ mes "Well, I guess you could find out more about Comodo Cheese from a lady near the ^3355FF 'Hulla Stage' ^000000 located near the center of town.";
+ next;
+ mes "^3355FF- Received Shiny Coin -^000000";
+ next;
+ mes "[Manzi]";
+ mes "Just tell her that Manzi from the casino sent you and show her that coin. She'll tell you all you need to know about the Cheese.";
+ next;
+ mes "[Manzi]";
+ mes "By the way......... no else is listening this right?....... *whispers: that lady is actually in charge of the Comodo Cheese distribution*...........";
+ set dmdswrd_Q, 11;
+ close;
+L_2:
+ mes "[Manzi]";
+ mes "The cheese lady should be near the ^5533FFHulla Stage^000000. Just remember to show her the coin when you ask her about the cheese.";
+ close;
+}
+
+//=======================================================
+comodo.gat,187,153,4 script Hullaris 701,{
+ mes "[Hullaris]";
+ if(dmdswrd_Q == 11) goto L_1;
+ if(dmdswrd_Q == 12) goto L_2;
+ if(dmdswrd_Q == 13) goto L_3;
+ if(dmdswrd_Q == 14) goto L_4;
+
+ mes "Hula Dance? Who says it's merely a hula dance?? It is much more than just some dance.";
+ mes "To refer to Comodo's unique form of dancing as simply a hula dance, is just insulting!";
+ emotion e_an;
+ next;
+ mes "[Hullaris]";
+ mes "The Comodo Hula Dance was developed long ago. Legend has it that the dance was used to control the minds and bodies of others!";
+ mes "Hula 'dance'?.... More like Hula 'communication'......";
+ next;
+ mes "[Hullaris]";
+ mes "This form of 'communication' was capable of not only changing a persons mood, but of controlling a persons mind as well!";
+ next;
+ mes "[Hullaris]";
+ mes "Hehehehehe...... If anyone can dance better than me.... LET EM COME OUT!! It is more than just dancing..........";
+ mes "It is a form of 'COMMUNICATION'!!!";
+ emotion e_gg;
+ close;
+
+L_1:
+ mes "Ah, such a great day...........";
+ next;
+ menu "Show her the Shiny Coin",-,"Don't show her the coin, but continue talking",M_End;
+
+ mes "^3355FF- Shows lady the Shiny Coin -^000000";
+ next;
+ mes "[Hullaris]";
+ mes "Hmm, that coin.... How did you know to come and look for me? Ah, I got it. Manzi must have told you about me.";
+ emotion e_hmm;
+ next;
+ mes "[Hullaris]";
+ mes "I presume you are also interested in the famous Comodo ^5533FFCheese^000000.";
+ mes "Well you've come to the right place because you're talking to a real expert.";
+ next;
+ mes "[Hullaris]";
+ mes "And let me tell you something about how rare Comodo Cheese is.......";
+ mes "Some people will NEVER get to taste it in their entire lifetime.....";
+ next;
+ mes "[Hullaris]";
+ mes "Before I go any further, I will need to clear up some of the misconceptions you may have about Comodo Cheese.";
+ next;
+ mes "[Hullaris]";
+ mes "In reality, Comodo Cheese is NOT actually a cheese. It is actually a very powerful enchanted magical stone, know as.........";
+ mes "The ^3355FFStone of Awakening^000000.";
+ next;
+ mes "[Hullaris]";
+ mes "Because of the similarities in shape, form, and color, between the two, people have mistaken the stone to be cheese.";
+ next;
+ mes "[Hullaris]";
+ mes "Legend has it that the user of the Stone of Awakening, could gain great knowledge and power much faster than normal people.";
+ next;
+ mes "[Hullaris]";
+ mes "Many Wizards and Mages in the past have grown very powerful in very short time after consuming the Stone of Awakening.";
+ next;
+ mes "[Hullaris]";
+ mes "Therefore, even though my close friend told you to come to me, I cannot just give you this rare item.";
+ next;
+ mes "[Hullaris]";
+ mes "I am very sorry about this, but you will need to prove to me somehow that you are worthy of this stone.";
+ next;
+ mes "[Hullaris]";
+ goto L_2;
+
+ M_End:
+ mes "[Hullaris]";
+ mes "Hey! Don't look at me like that, get out of here!";
+ emotion e_gasp;
+ close;
+
+L_2:
+ mes "Some sort of ^5533FFProof of Worthiness^000000 could be obtained through the wizard ^5533FF'Nigirboran'^000000.";
+ mes "He is usually inside of the ^009500East Comodo Dungeon^000000.";
+ next;
+ mes "[Hullaris]";
+ mes "Just tell Nigirboran everything I have told you and he will judge whether or not you are worthy of the Stone of Awakening.";
+ mes "Best of luck to you.";
+ set dmdswrd_Q, 12;
+ close;
+L_3:
+ mes "Your back........ do you have the ^5533FFProof of Worthiness^000000?";
+ mes "I cannot give you the Stone of Awakening if you have not passed the test.";
+ close;
+L_4:
+ mes "How did the test go?";
+ next;
+ mes "^3355FF~ Shows Hullaris ~^000000";
+ mes "^3355FF~ Proof of Worthiness ~^000000";
+ next;
+ mes "[Hullaris]";
+ mes "Ah, you did it! I knew you would pass the test. No I mean it.";
+ mes "There was something about you that gave me confidence in your abilities.";
+ next;
+ mes "[Hullaris]";
+ mes "Anyway, here is the Stone of Awakening as promised.........";
+ next;
+ mes "^3355FF~ you received the Stone of Awakening ~^000000";
+ mes "^3355FF~ you quickly eat it. . . . . ~^000000";
+ next;
+ mes "^3355FF~ Munch . .Munch . . ~^000000";
+ next;
+ mes "^3355FF~ Tastes like some sort of mushroom... ~^000000";
+ mes "^3355FF~ it is somewhat sour... ~^000000";
+ next;
+ mes "^3355FF~ somehow you feel more confident... ~^000000";
+ mes "^3355FF~ and more courageous now! ~^000000";
+ next;
+ mes "[Hullaris]";
+ mes "What do you think? The taste and smell are indescribable huh? From the way you look I can tell that it was worth the effort to find.";
+ next;
+ mes "[Hullaris]";
+ mes "You are now one of the few who have been privileged enough to taste Comodo's special 'Cheese', heh heh heh.....";
+ mes "Well have fun here in Comodo.";
+ set dmdswrd_Q,15;
+ close;
+}
+
+//=========================================================
+beach_dun3.gat,30,220,4 script Wizard Nigirboran 704,{
+ mes "[Nigirboran]";
+ if(dmdswrd_Q == 12) goto L_1;
+ if(dmdswrd_Q == 13) goto L_2;
+ if(dmdswrd_Q == 14) goto L_3;
+ if(dmdswrd_Q == 15) goto L_4;
+
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "[Nigirboran]";
+ mes "I am Nigirboran, a Wizard in training...";
+ next;
+ mes "[Nigirboran]";
+ mes "If you don't have anything to say, please do not bother me, I am very busy.";
+ close;
+
+L_1:
+ mes ". . . . . Hmm. . . . . .";
+ next;
+ mes "[Nigirboran]";
+ mes "Hullaris told you to come didn't she? Let me introduce myself. I am Nigirboran, a Wizard in training.";
+ next;
+ mes "[Nigirboran]";
+ mes "It is true that Comodo ^5533FFCheese^000000 is actually the ^5533FF'Stone of Awakening' or the 'Stone of Wisdom'^000000.";
+ mes "It's unfortunate that so many people think of this great stone as nothing more than a tasty snack.";
+ next;
+ mes "[Nigirboran]";
+ mes "A long time ago, real Comodo cheese was actually made from Payon's poisonous mushrooms, Aldebaran's singing plants, and Morroc's cactus juice.";
+ next;
+ mes "[Nigirboran]";
+ mes "The cheese was aged for a minimum of 3 years before it could be eaten. If anyone ate the cheese before it had a chance to properly age....";
+ next;
+ mes "[Nigirboran]";
+ mes "The posion and magic from the cheese would melt their insides instantly............";
+ next;
+ mes "[Nigirboran]";
+ mes "That's why Hullaris sent you here. She wants to see if you can withstand those strong poisons.";
+ next;
+ mes "[Nigirboran]";
+ mes "Are you willing to risk your life just to prove yourself to Hullaris?";
+ next;
+ menu "Sure, why not.",-, "...... Uh... no....",M_End;
+
+ set dmdswrd_Q, 13;
+ mes "[Nigirboran]";
+ goto L_2;
+
+ M_End:
+ mes "[Nigirboran]";
+ mes "Very well then.";
+ close;
+L_2:
+ mes "Very good, then let us begin the test.";
+ percentheal 100, 100;
+ next;
+ mes "[Nigirboran]";
+ mes "You will be given some real Comodo cheese to eat. If you are strong enough you will have no problems with the cheese.";
+ next;
+ mes "[Nigirboran]";
+ mes "If you start to feel noxious and start having hallucinations, that means you have succumb to the poison and are not worthy of the Stone of Awakening.";
+ next;
+ mes "[Nigirboran]";
+ mes "Ready?";
+ next;
+ mes "^3355FF~ you are given a piece of funky cheese ~";
+ mes ". . . . . . . . . . . . .^000000";
+ next;
+ mes "^3355FF~ you are given a piece of funky cheese ~";
+ mes ". . . . . . . . . . . . .";
+ mes "~ you swallow it ~";
+ mes ". . . . . . . . . . . . .^000000";
+ next;
+ mes "^3355FF~ you are given a piece of funky cheese ~";
+ mes ". . . . . . . . . . . . .";
+ mes "~ you swallow it ~";
+ mes ". . . . . . . . . . . . .";
+ mes "~ it tastes nasty!!! ~^000000";
+ next;
+ mes "^3355FF~ your body is overcome with a wave of heat ~";
+ mes "~ you feel the poison racing through your body ~^000000";
+ sc_start SC_Poison,900000,1;
+ next;
+ mes "^5533FF. . . . . . . . . . . . . . .^000000";
+ next;
+ sc_end SC_Poison;
+ if(BaseLevel < 25) goto L_LowLvl;
+ set @TEMP, rand(3);
+ if(@TEMP == 2) goto R_2;
+ if(@TEMP == 1) goto R_1;
+
+ R_0:
+ mes "^3355FF~ your body seems fine but.....but...but.... ~^000000";
+ next;
+ mes "^3355FF~ your body seems fine but.....but...but.... ~";
+ mes "~ You see pink elephants everywhere!! ~^000000";
+ next;
+ mes "[Nigirboran]";
+ mes "Tsk tsk. Although your body didn't seem to have any ill effects from the poison.... your mind was not as fortunate.";
+ next;
+ mes "[Nigirboran]";
+ mes "Hahaha... pink elephants.... reminds me of a bad acid trip I once had... er..... forget what I just said.";
+ emotion e_heh;
+ next;
+ mes "[Nigirboran]";
+ mes "If you cannot handle a little piece of cheese, there is absolutely no way you will be able to handle the Stone of Awakening.";
+ next;
+ mes "[Nigirboran]";
+ mes "If you feel up to it, you may try again later. The fact that you're still alive is a good sign.";
+ close;
+ R_1:
+ mes "^3355FF~ now you feel extremely cold and dizzy.... ~";
+ mes "~ your body feels weak and you are getting drowsy.... ~^000000";
+ sc_start SC_Sleep,900000,1;
+ next;
+ mes "[Nigirboran]";
+ mes "Hmm.... well the good news is you didn't have any hallucinations. Your body however, reacted poorly and you fell asleep.";
+ sc_end SC_Sleep;
+ next;
+ mes "[Nigirboran]";
+ mes "If you cannot handle a little piece of cheese, there is absolutely no way you will be able to handle the Stone of Awakening.";
+ next;
+ mes "[Nigirboran]";
+ mes "If you feel up to it, you may try again later. The fact that you're still alive is a good sign.";
+ close;
+ R_2:
+ mes "^3355FF~ you now feel a very strange, soothing sensation........ ~";
+ mes "~ your body feels at ease and your mind is clear... ~^000000";
+ next;
+ mes "[Nigirboran]";
+ mes "Hmm?.... Wow! Now that's rare!! You don't seem to have any ill effects from the posion.";
+ mes "You must be in top shape both mentally and physically.";
+ emotion e_ic;
+ next;
+ mes "[Nigirboran]";
+ mes "You have proved that you are worthy of the ^5533FFStone of Awakening^000000. Take this.......";
+ next;
+ mes "~ received ^5533FF'Proof of Worthiness'^000000 ~";
+ next;
+ mes "[Nigirboran]";
+ mes "Just show this to Hullaris and she will give you the Stone of Awakening.";
+ set dmdswrd_Q, 14;
+ next;
+ mes "[Nigirboran]";
+ mes "Oh, by the way, why did you choose to look for the Stone in the first place?";
+ next;
+ mes "[Nigirboran]";
+ mes "I surely hope its not because of the temptations of the three Doomed Swords...";
+ mes "....Huh? You don't know what the three Doomed Swords are?";
+ next;
+ mes "[Nigirboran]";
+ mes "Legend has it that the one who wields the three Doomed Swords";
+ mes "^3355FF- Executioner -^000000";
+ mes "^3355FF- Mysteltain-^000000";
+ mes "^3355FF- Grimtooth -^000000";
+ mes "could conquer the whole world with ease.";
+ next;
+ mes "[Nigirboran]";
+ mes "To summon these three Doomed Swords, the user is also required to possess";
+ mes "both the ^3355FF` Tablet of Power '^000000 and";
+ mes "^3355FF` Book of the Tiresome Sheep'^000000.";
+ close;
+
+ L_LowLvl:
+ mes "^3355FF~ it is unbearable and causes you to faint ~^000000";
+ next;
+ warp "beach_dun3.gat",32,214;
+ doevent "Wizard Nigirboran::OnFainted";
+ end;
+
+ OnFainted:
+ mes "[Nigirboran]";
+ mes "~ Sigh ~ You are simply not strong enough to withstand the poison.";
+ mes "Maybe if you had a ^5533FFBase level of at least 25^000000, you could withstand the poison....";
+ close;
+L_3:
+ mes "Go see Hullaris for the Stone of Awakening. Good luck to you.";
+ close;
+L_4:
+ mes "Look for ^3355FFMoet Leng Good^000000 somewhere";
+ mes "inside ^3355FFAldebaran^000000";
+ mes "regarding information about the 'Tablet of Power'";
+ close;
} \ No newline at end of file
diff --git a/npc/quests/quests_ein.txt b/npc/quests/quests_ein.txt
index 2592a8468..1a3a02e97 100644
--- a/npc/quests/quests_ein.txt
+++ b/npc/quests/quests_ein.txt
@@ -1,4104 +1,4104 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Einbroch and Einbech
-//===== By: ==================================================
-//= Evera and The eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.5.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Shinokas Quest, Einbroch Lover Quest, Factory Quest,
-//= Uwe Quest.
-//===== Additional Comments: =================================
-//= 1.0 Initial Release [Evera]
-//= 1.1 Added more quests [Evera]
-//= 1.2 Added quest bits from Einbech and renamed file to
-//= quests_ein.txt [Evera]
-//= 1.3 Implemented the polution quest. [MasterOfMuppets]
-//= 1.4.1 Massive bugfix. Fixed Pollution exploit [Lupus]
-//= 1.4.2 Fixed Khowropher bug [Lupus]
-//= 1.5 Fixed double levelup bug [Lupus]
-//= 1.5.1 Fixed exploit [KarLaeda]
-//= 1.5.2 Updated Shino Quest to leave no grabage vars [Lupus]
-//============================================================
-
-
-//============================================================
-//=================================================== Shinokas
-//====================================================== Quest
-
-ein_in01.gat,231,163,1 script Sick Old Man 849,6,6,{
- switch(Shinokas_Quest){
- case 9:
- mes "^3131FFShinokas's";
- mes "body has grown";
- mes "cold to the tough.";
- close;
- case 8:
- mes "["+strcharinfo(0)+"]";
- mes "Shinokas,";
- mes "I found something!";
- next;
- mes "[Shinokas]";
- mes "You...";
- mes "Came... back...";
- mes "Even... if... it's";
- mes "already... Too late.";
- mes "*Couhg Cough*";
- next;
- mes "^3131FFYou help Shinokas";
- mes "sit up, but find that";
- mes "your hands have been";
- mes "stained with his blood.^000000";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Blood...?!";
- mes "Shinokas!";
- mes "Who did this to you?";
- mes "W-we need to call for help!";
- next;
- mes "[Shinokas]";
- mes "No...";
- mes "It's already";
- mes "too late for me.";
- mes "I should have died";
- mes "a long time ago...";
- next;
- mes "[Shinokas]";
- mes "*Cough*";
- mes "I only regret that";
- mes "I've never been able";
- mes "to apologize to my";
- mes "friends... *Cough!*";
- next;
- mes "[Shinokas]";
- mes "But did you";
- mes "find out? D-did";
- mes "you find out what's";
- mes "so special about";
- mes "that ore? W-what";
- mes "is it... Really?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "It was...";
- next;
- input @text$;
- mes "^0000FF"+@text$+"^000000!";
- next;
- mes "[Shinokas]";
- mes "W-wait...!";
- mes "What did...";
- mes "I can't underst--";
- mes "*Couhgh cough!*";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "No...!";
- mes "Tell me who";
- mes "did this to you!";
- mes "Where are they?";
- mes "Speak to me, please!";
- next;
- mes "[Shinokas]";
- mes "W-wha...?";
- mes "I told you.";
- mes "Th-they we--";
- next;
- mes "[Shinokas]";
- mes "...";
- mes "......";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "No!";
- mes "Shinokas!";
- mes "Why, God?";
- mes "Why...";
- set Shinokas_Quest,9;
- close;
- case 7:
- mes "[Shinokas]";
- mes "...";
- mes "......";
- close;
- case 6:
- mes "[Shinokas]";
- mes "So...?";
- mes "Did you learn";
- mes "anything new";
- mes "in the Factory?";
- next;
- mes "["+strcharinfo(0)+"]";
- if(EinFactory != 16){
- mes "I haven't went there";
- mes "yet.";
- next;
- mes "[Shinokas]";
- mes "Then why did you come";
- mes "back? Go and investigate";
- mes "the factory now.";
- close;
- }
- mes "Well...";
- mes "There's a lot of";
- mes "suspicious business";
- mes "in the factory, but I don't";
- mes "think any of it is related";
- mes "to that ore you mentioned.";
- next;
- mes "[Shinokas]";
- mes "Damn it...";
- mes "Then where did";
- mes "they hide it? Where";
- mes "do you think that";
- mes "ore might be?";
- next;
- while(1){
- switch(select("Airport:Factory:Train Station:Airship Repairshop:Laboratory")){
- case 1: //airport
- mes "[Shinokas]";
- mes "No...";
- mes "The Airport is always";
- mes "crowded with people.";
- mes "It'd be a bad idea to hide";
- mes "something so important";
- mes "in that kind of place.";
- next;
- break;
- case 2: //factory
- mes "[Shinokas]";
- mes "Didn't you just";
- mes "check the factory?";
- mes "You couldn't find";
- mes "any clues to the";
- mes "ore over there...";
- next;
- break;
- case 3: //train
- mes "[Shinokas]";
- mes "Hmm...";
- mes "People are always going";
- mes "in and out of the Train Station.";
- mes "It's not the best place to hide";
- mes "something as important as the ore.";
- next;
- break;
- case 4: //repairshop
- mes "The Airship? Hm, it does";
- mes "fly through some mysterious";
- mes "power... But I already checked";
- mes "the Airship Replairshop myself.";
- mes "I haven't found any trace of";
- mes "the ore over there.";
- next;
- break;
- case 5: //Laboratory
- mes "[Shinokas]";
- mes "...!";
- mes "Yes. Yes...!";
- mes "That could be it!";
- mes "Why didn't I think";
- mes "about the Laboratory?";
- mes "It makes so much sense!";
- next;
- mes "[Shinokas]";
- mes "I have a good feeling";
- mes "about this. Please sneak";
- mes "into that Laboratory and";
- mes "see if you can find the ore!";
- next;
- mes "[Shinokas]";
- mes "Remember...";
- mes "Not just anybody";
- mes "can enter that kind";
- mes "of place. But I'm sure";
- mes "you'll figure something out.";
- set Shinokas_Quest,7;
- close;
- }
- }
- case 5:
- mes "[Shinokas]";
- mes "So, did you find";
- mes "anything from the";
- mes "Kapellthaines?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Well, Mr. Kapelltheine";
- mes "is kind of violent, but";
- mes "I didn't find anything";
- mes "really suspicious.";
- next;
- mes "[Shinokas]";
- mes "Huh...";
- mes "I must have";
- mes "been wrong, then...";
- mes "Where else could it be?";
- next;
- mes "[Shinokas]";
- mes "Oh, right! The huge";
- mes "factory in Einbroch!";
- mes "What could be more";
- mes "suspicious? There's a ton";
- mes "of workers, but no one really";
- mes "knows what they do there...";
- next;
- mes "[Shinokas]";
- mes "If they're so secretive";
- mes "it's possible that they're";
- mes "keeping the ore over there.";
- mes "Please go and search the";
- mes "Factory for that ore as";
- mes "soon as you can.";
- set Shinokas_Quest,6;
- close;
- case 4:
- mes "[Shinokas]";
- mes "Please...";
- mes "Find out if the Kapelltheines";
- mes "are keeping some kind of unique";
- mes "ore. Their manor is on the road";
- mes "that leads to the Airport.";
- close;
- }
- //Shinokas_Quest = 0 1 2 3 10
- mes "[Sick Old Man]";
- mes "...!";
- next;
- mes "[Sick Old Man]";
- mes "Awwwk~";
- mes "It's killing me!";
- mes "Arrrgh! Awwwrgh!";
- mes "W-when will my son";
- mes "come back from";
- mes "the factory...?!";
- next;
- if(Shinokas_Quest != 3){
- mes "^3131FFYou feel really awkward";
- mes "just staring at this old";
- mes "man violently rolling";
- mes "around in his bed.";
- close;
- }
- //Shinokas_Quest = 3
- mes "["+strcharinfo(0)+"]";
- mes "Shi...";
- mes "Shinokas?";
- next;
- mes "[Sick Old Man]";
- mes "Huh...?";
- mes "Noooo! My name is";
- mes "Shinotarous. Y-you've";
- mes "got the wrong person!";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "This has to be the";
- mes "Shinokas that Hikeman";
- mes "was talking about in Einbech";
- mes "Hmmm, but how can I get";
- mes "him to admit it?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "*Ahem!*";
- mes "Excuse me...";
- next;
- while(1){
- switch(select("Remember the mine tunnel collapse?:Didn't you used to be a miner?:Have you lived in Einbroch all your life?")){
- case 1: //remember
- if(@shinqst2 > 4 || @shinqst3 > 4) goto L_Cont;
- mes "[Sick Old Man]";
- mes "Noooo!";
- mes "I don't know";
- mes "what the hell";
- mes "you're talking";
- mes "about!";
- next;
- break;
- case 2: //miner
- if(@shinqst2 > 1)goto s_Quest2;
- mes "[Sick Old Man]";
- mes "Noooo...!";
- mes "W-why would you";
- mes "even ask me that";
- mes "kind of question?!";
- s_Quest2:
- set @shinqst2,@shinqst2 + 1;
- if(@shinqst3)set @shinqst3,0;
- next;
- break;
-
- case 3: //einbroch
- if(@shinqst3 > 1)goto s_Quest3;
- mes "[Sick Old Man]";
- mes "Y-yes!";
- mes "Born and raised";
- mes "raised here in";
- mes "Einbe--Einbroch!";
- next;
- mes "^3131FFIt doesn't seem";
- mes "like this old man";
- mes "is telling the truth...";
- s_Quest3:
- set @shinqst3,@shinqst3 + 1;
- if(@shinqst2)set @shinqst2,0;
- next;
- break;
- }
- }
-
-L_Cont:
- mes "[Shinokas]";
- mes "Hmm...";
- mes "^0000FFBuender Hikeman^000000...";
- next;
- mes "[Shinokas]";
- mes "No!";
- mes "I've never met";
- mes "Buender Hikeman";
- mes "in my entire li--";
- next;
- mes "[Shinokas]";
- mes "...";
- mes "......";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "I was right!";
- mes "You're Shinokas!";
- next;
- mes "[Shinokas]";
- mes "Curses!";
- mes "I've blown";
- mes "my cover!";
- mes "W-wait! How much";
- mes "do you know?!";
- next;
- mes "[Shinokas]";
- mes "Did ^0000FFthey^000000 send you?";
- mes "*Sigh* I think that this";
- mes "is it. I'll never be";
- mes "able to solve the";
- mes "secret before I die.";
- next;
- mes "[Shinokas]";
- mes "Okay.";
- mes "Get on with it.";
- mes "I'm ready now...";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Tell me everything";
- mes "you know related to";
- mes "that incident where";
- mes "the mine tunnel";
- mes "collapsed around";
- mes "you and Hikeman.";
- next;
- mes "[Shinokas]";
- mes "...?";
- mes "Errr....";
- mes "You're not";
- mes "here to kill me?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "No...!";
- mes "I'm here to find";
- mes "out the truth";
- next;
- mes "[Shinokas]";
- mes "That means...";
- mes "I still have some time.";
- mes "This must be destiny!";
- mes "Allright, I'll tell you what";
- mes "happened. But it's a";
- mes "long story...";
- next;
- mes "[Shinokas]";
- mes "How much do you know";
- mes "about the accident? No,";
- mes "wait. Don't answer that.";
- mes "I don't want to hear it";
- next;
- mes "[Shinokas]";
- mes "I admit it. Yes.";
- mes "I stabbed my friends";
- mes "in the back. It was an";
- mes "unforgivable sin that will";
- mes "haunt me untill the day that I die";
- next;
- mes "[Shinokas]";
- mes "I sold out my friends for";
- mes "money. I destroyed that";
- mes "tunnel and killed them. But";
- mes "I suppose I was tricked as well.";
- mes "^0000FFThey^000000 never intended to keep";
- mes "their end of our agreement.";
- next;
- mes "[Shinokas]";
- mes "After I destroyed the tunnel,";
- mes "they targeted me and I ended";
- mes "spending the rest of my life being";
- mes "pursued and running for place to";
- mes "place. What the hell was that ^0000FFore^000000";
- mes "and why was it so important?";
- next;
- mes "[Shinokas]";
- mes "I need to know more about";
- mes "that ore if it's worth killing for.";
- mes "That's why I've risked sneaking";
- mes "into Einbroch. Sopposedly, an ore";
- mes "similar to the ore we found has";
- mes "been transported here recently";
- next;
- menu "Did you find it?",-;
- mes "[Shinokas]";
- mes "No, not yet.";
- mes "I've been searching";
- mes "for that ore every night.";
- mes "During the day, this kind";
- mes "blacksmith has managed";
- mes "to hide me from those men";
- next;
- mes "[Shinokas]";
- mes "But I won't be safe";
- mes "for very long. Look, I'm";
- mes "no saint, but before I die,";
- mes "I wanna do this one last";
- mes "thing and see what's so";
- mes "great about this ore...";
- next;
- menu "Wait, who's trying to get you?",-;
- mes "[Shinokas]";
- mes "Who's trying to kill me?";
- mes "The people who hired me and";
- mes "my friends to dig up that ore in";
- mes "the first place. We thought they";
- mes "were ordinary businessmen,";
- mes "but... They're dangerous.";
- next;
- mes "[Shinokas]";
- mes "So I told you everything";
- mes "and now you know that my";
- mes "day might be numbered.";
- mes "Please do an old man a favor";
- mes "and search Einbroch for that";
- mes "strange, mysterious ore.";
- next;
- mes "[Shinokas]";
- mes "Now, the first thing I learned";
- mes "in this tows is that the richest";
- mes "family is the Kapelltheines. Only";
- mes "the rich and powerful can possibly";
- mes "be involved in something so big.";
- next;
- mes "[Shinokas]";
- mes "Would you search";
- mes "Kappelltheine Manor";
- mes "for that ore? It's on the way";
- mes "to the Airport and it shouldn't be";
- mes "hard to miss. They're the richest";
- mes "people in Einbroch, after all.";
- next;
- mes "[Shinokas]";
- mes "I'm too old and weak to leave";
- mes "this house, and there's the change";
- mes "that those men will find me. If you";
- mes "can sympathize with my situation,";
- mes "please find out if the Kapelltheine";
- mes "family has any unique ores...";
- set Shinokas_Quest,4;
- close;
-
-OnTouch:
- if(Shinokas_Quest != 8) end;
- mes "^3131FFThe open window rattles";
- mes "as you enter the room and";
- mes "are welcomed by a sudden";
- mes "chill. A trail of red footprints";
- mes "lies near your feet.";
- next;
- mes "^3131FFA grey sheet lies";
- mes "rumpled on the bed,";
- mes "but you can see dark red";
- mes "stains in between the folds.";
- close;
-}
-
-ein_in01.gat,32,133,6 script Maid 850,{
- mes "[Maid]";
- if(Shinokas_Quest != 4){
- mes "There's no end";
- mes "to all these plates";
- mes "I have to clean...!";
- close;
- }
- mes "Did you ask me";
- mes "if I saw some kind";
- mes "of ore around here?";
- mes "That's strange...";
- next;
- mes "[Maid]";
- mes "Will, I've been with";
- mes "this family for a long";
- mes "time. Let me assure you";
- mes "that there's no secrets";
- mes "from me in this household!";
- next;
- mes "[Maid]";
- mes "I'm sorry, but I don't";
- mes "think we have any ores,";
- mes "special or otherwise, here";
- mes "in the manor. What exactly";
- mes "do you need them for?";
- set Shinokas_Quest,5;
- close;
-}
-
-einbroch.gat,51,52,1 script lab_warp 45,2,2{
- if(Shinokas_Quest != 7){
- mes "^3131FFThe door is locked.";
- mes "You cannot enter.";
- close;
- }
- mes "[Security System]";
- mes "^FF0000*Beep Boop*^000000";
- mes "Restricted Access Area.";
- mes "Please identify yourself";
- mes "through the system.";
- next;
- switch(select("Identify.:Information:Cancel")){
- case 1: //Identify
- break; //continue after switch =\
- case 2: //information
- mes "[Security System]";
- mes "You must use the";
- mes "security system in order";
- mes "to gain access into the";
- mes "Einbroch Laboratory.";
- next;
- mes "[Security System]";
- mes "You will be given";
- mes "a password that you";
- mes "must input correctly";
- mes "withing 60 seconds.";
- mes "Otherwise, you will";
- mes "fail the security check.";
- //hell of a security system ye got there mate
- //wonder if gravity co has the same sort? xD
- next;
- mes "[Security System]";
- mes "If you take longer";
- mes "then 3 minutes to";
- mes "enter the password,";
- mes "the security system";
- mes "will initiate lockout.";
- close;
- case 3: //cancel
- mes "[Security System]";
- mes "You have canceled";
- mes "the ID security check.";
- close;
- }
- //ID check:
- mes "[Security System]";
- mes "Enter the following";
- mes "password in 60 seconds.";
- mes "Failure to do so will result";
- mes "in lockout. Please wait.";
- next;
- mes "[Security System]";
- set @startseconds,gettime(3)*60*60+gettime(2)*60+gettime(1);
- switch(rand(1,11)){
- case 1:
- mes "^00CCFFburrdingdingdilidingdingphoohudaamb";
- mes "^00CCFFandoora^0000FFbambarambambamburanbamding";
- input @str$;
- if(@str$ != "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding") goto L_SCFail;
- goto L_Suc;
- case 2:
- mes "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi";
- mes "^990066kabamturubamdingding";
- next;
- input @str$;
- if(@str$ != "barapaphurarlandreamduranbatuhiwooikabamturubamdingding") goto L_SCFail;
- goto L_Suc;
- case 3:
- mes "^00CCFFbelief love luck grimace sweat rush";
- mes "^00CCFFfolktale rodimus optimus burnblebe";
- input @str$;
- if(@str$ != "belief love luck grimace sweat rush folktale rodimus optimus burnblebe") goto L_SCFail;
- goto L_Suc;
- case 4:
- mes "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn";
- mes "^FF33CCRiGhT BuRn OrIGInAL GaNgSteR SmACk";
- input @str$;
- if(@str$ != "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk") goto L_SCFail;
- goto L_Suc;
- case 5:
- mes "^00CCFFCoboman no chikara-yumei na";
- mes "^00CCFFchikara-daiookii na chikara da ze!";
- mes "^00CCFFCOBO ON";
- input @str$;
- if(@str$ != "Coboman no chikara-yumei na chikara-daiookii na chikara da ze! COBO ON") goto L_SCFail;
- goto L_Suc;
- case 6:
- mes "^FF33CChfjdkeldjs^990066hfjdjeiskdlefvbd";
- input @str$;
- if(@str$ != "hfjdkeldjshfjdjeiskdlefvbd") goto L_SCFail;
- goto L_Suc;
- case 7:
- mes "^00CCFFI'm the King of all Weirdos! Now";
- mes "^00CCFFyou know of my true power. Obey~!";
- input @str$;
- if(@str$ != "I'm the King of all Weirdos! Now you know of my true power. Obey~!") goto L_SCFail;
- goto L_Suc;
- case 8:
- mes "^990066uNflAPPaBLe LoVaBLe SeCreTs AnD";
- mes "^990066BoWLiNg aGaINST tHe KarMA of YoUtH";
- input @str$;
- if(@str$ != "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA if YoUtH") goto L_SCFail;
- goto L_Suc;
- case 9:
- mes "^00CCFFBy the power of^000000";
- mes "^00CCFFp-po-poi-po-poi-poin-poing";
- mes "^00CCFFGOD-POING. I NEVER LOSE!";
- input @str$;
- if(@str$ != "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!") goto L_SCFail;
- goto L_Suc;
- case 10:
- mes "^00CCFF...silence. quiet benevolence...";
- mes "^00CCFFsoul mate... wonder. enigma...";
- mes "^00CCFFcloud.^000000";
- input @str$;
- if(@str$ != "...silence. quiet benevolence... soul mate... wonder. enigma... cloud") goto L_SCFail;
- goto L_Suc;
- case 11:
- mes "^FF33CCopeN,Open!op3n.openOpen0p3nOpEn0pen";
- mes "^FF33CC`open'0Pen open?open!111OPENSESAME";
- input @str$;
- if(@str$ != "opeN,Open!op3n.openOpenOp3nIoEnOpen`open'0Pen open?open!111OPENSESAME") goto L_SCFail;
- goto L_Suc;
- }
-L_Suc:
- next;
- set @endtime,gettime(3)*60*60+gettime(2)*60+gettime(1);
- set @time,@endtime-@startseconds;
- if(@time > 60) goto L_SC60;
- mes "[Security System]";
- mes "It took ^FF0000"+@time+" seconds^000000";
- mes "for you to enter the";
- mes "password. Initiating";
- mes "override. Access granted.";
- close2;
- warp "ein_in01.gat",283,25;
- end;
-
-L_SC60:
- mes "[Security System]";
- mes "Time over.";
- mes "It took ^FF0000"+@time+" seconds^000000";
- mes "for you to enter the";
- mes "password. Initiating";
- mes "lockout. Access denied.";
- close;
-
-L_SCFail:
- next;
- mes "[Security System]";
- mes "You have failed";
- mes "the identification";
- mes "check. Access denied.";
- close;
-}
-einbroch.gat,51,56,6 script Laboratory Soldier#01 852,{
- mes "[Laboratory Soldier]";
- mes "This area is off limits.";
- mes "Please leave";
- mes "immediately";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Laboratory Soldier#01";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-einbroch.gat,51,47,6 script Laboratory Soldier#02 852,{
- mes "[Laboratory Soldier]";
- mes "This area is off limits.";
- mes "Please leave";
- mes "immediately";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Laboratory Soldier#02";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-ein_in01.gat,254,35,1 script Scientist 749,{
- mes "[Scientist]";
- mes "*Grumble grumble*";
- next;
- if(ein_scientist == 1) goto L_P2;
- mes "[Scientist]";
- mes "Huh...?";
- mes "How did you";
- mes "get in here?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Oh! Ah...";
- mes "I'm the new...";
- mes "Guard. Nice";
- mes "to meet you.";
- next;
- mes "[Scientist]";
- mes "Oh. Yeah.";
- mes "Nice-meet-you";
- mes "..............";
- mes "*Grumble grumble*";
- next;
- if(select("What's wrong?:Catch you later.")==2){
- mes "[Scientist]";
- mes "Right.";
- mes "Yeah.";
- mes "Later, man.";
- close;
- }
- mes "[Scientist]";
- mes "What's wrong...?!";
- mes "Oh, don't get me started!";
- mes "I'm stuck here doing all the";
- mes "work while the Lab Departement";
- mes "Head goes out every freakin' day!";
- next;
- mes "[Scientist]";
- mes "While I'm slaving";
- mes "away here, he's in";
- mes "that Airship, busy";
- mes "flirting with that";
- mes "woman. God...!";
- mes "I'm like, so teed off!";
- if(Shinokas_Quest < 8) set ein_scientist,1;
- close;
-
-L_P2:
- mes "[Scientist]";
- mes "Man alive!";
- mes "Would it kill the";
- mes "Department Head";
- mes "to come in here and do";
- mes "some work for a change?!";
- next;
- mes "[Scientist]";
- mes "I mean, come on!";
- mes "I shouldn't have to";
- mes "carry his workload!";
- close;
-}
-
-ein_in01.gat,266,26,1 script Unknown Stuff 111,{
- mes "^3131FFThere's something";
- mes "attached to a huge";
- mes "machine with many cords";
- mes "and folds of barbed wire";
- if(Shinokas_Quest < 8) set ein_stuff,1;
- close;
-}
-
-airplane.gat,31,77,4 script Drunken Man#03 853,{
- if(Shinokas_Quest >= 8){
- mes "[Drunken Man]";
- mes "Hahahahaha!";
- mes "You're great!";
- mes "I feel great!";
- mes "Everything's great!";
- mes "Bwahahahaahahah!";
- mes "*Hiccup*";
- close;
- }
- mes "[Drunken Man]";
- mes "Okay okay...";
- mes "Daddy's gonna";
- mes "win some Apples";
- mes "this time for sure!";
- next;
- if(ein_stuff && ein_scientist){
- mes "[Drunken Man]";
- mes "Let's do it!";
- mes "^3131FFYmir's Heart^000000 is";
- mes "on my side! GO!";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Huh...?";
- mes "What did he just say?";
- mes "It seemed important!";
- next;
- }
- mes "^0000FF*Rolling and rumbling*^000000";
- next;
- mes "[Kaci]";
- mes "I have a total of ^FF000011^000000";
- mes "and you have total ^FF00005^000000.";
- mes "You lose this game. I'm";
- mes "sorry, but I hope we play";
- mes "again sometime.";
- donpcevent "Kaci::OnLose";
- next;
- mes "[Drunken Man]";
- mes "Waaaaaahhhhhhhhh!";
- mes "Apples! My apples!";
- mes "Apples, I need more...!";
- if(countitem(512) && ein_stuff && ein_scientist) goto L_Apples;
- close;
-
-L_Apples:
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Do you want";
- mes "some of mine?";
- next;
- if(countitem(512) <100){
- mes "[Drunken Man]";
- mes "What...?";
- mes "I can't do anything";
- mes "with so few Apples!";
- mes "I'm a high roller and";
- mes "this is a high stakes game!";
- close;
- }
- mes "[Drunken Man]";
- mes "Wha--? Yes...";
- mes "Hell yes! Gimme";
- mes "some of your Apples!";
- mes "Yeeeeeeeeeeehaw!";
- mes "I'm back, baby!";
- next;
- mes "[Drunken Man]";
- mes "Now, to win!";
- mes "Daddy needs love...";
- mes "Time to go from";
- mes "crappy to classy!";
- next;
- mes "^0000FF*Rolling and rumbling*^000000";
- next;
- delitem 512,countitem(512);
- set @kaci,rand(2,12);
- set @man,rand(2,12);
- if(@man == @kaci){
- if(rand(2)){
- if(@man != 12)
- set @man,@man+1;
- else
- set @man,@man-1;
- }else{
- if(@man != 2)
- set @man,@man-1;
- else
- set @man,@man+1;
- }
- }
- mes "[Kaci]";
- mes "Oooh...";
- mes "I got a total of ^FF0000"+@kaci+"^000000,";
- mes "and you have a total of ^FF0000"+@man+"^000000.";
- if(@man < @kaci){
- mes "I'm sorry, but you lose";
- mes "again. Better luck next time...";
- donpcevent "Kaci::OnLose";
- next;
- mes "[Drunken Man]";
- mes "Waaaaaahhhhhhhhhhhh!";
- mes "Waaaaaaaahhhhhhh!";
- close;
- }
- mes "Congratulations, you won!";
- mes "Let me give you your winning";
- mes "and we'll play again some time~";
- donpcevent "Kaci::OnWin";
- next;
- mes "[Drunken Man]";
- mes "Mwahhhahahahaha!";
- mes "Whahahahahahahahaha!";
- mes "That's why they call me";
- mes "the 'Resurrection Kid!'";
- mes "I always come back!";
- next;
- mes "[Drunken Man]";
- mes "Oh yes, right!";
- mes "You...! You lent";
- mes "me those lucky";
- mes "Apples. ^111111*Hiccup*^000000";
- next;
- mes "[Drunken Man]";
- mes "I'm Kurschenburg!";
- mes "Thanks to you, I'm";
- mes "on a winning streak!";
- mes "Hahaha! Th-thank you~";
- mes "^111111*Hic-hic-hiccup!*^000000";
- next;
- if(select("So what was that about Ymir's Heart?:Hehe, you're welcome.")==2){
- mes "[Drunken Man]";
- mes "Hahahaha!";
- mes "You're great!";
- mes "And I feel great!";
- mes "Bwahahahaahahah!";
- mes "^111111*Hiccup*^000000";
- close;
- }
- mes "[Drunken Man]";
- mes "What...?";
- mes "Ymir's Heart?";
- mes "How do you know";
- mes "about that? ^111111*Hiccup*^000000";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Y-you...!";
- mes "You were just yelling,";
- mes "'Ymir's Heart is on my";
- mes "side,' while you were";
- mes "gambling with those Apples!";
- next;
- mes "[Drunken Man]";
- mes "What...?!";
- mes "No way~";
- mes "Err...? Did I...?";
- next;
- mes "[Drunken Man]";
- mes "Heh heh...";
- mes "I'm not really";
- mes "supposed to be talking";
- mes "about this. As head of";
- mes "the Laboratory, I'm sworn";
- mes "to secrecy about Ymir's Heart.";
- next;
- mes "[Drunken Man]";
- mes "But what do I care?!";
- mes "All they want are the";
- mes "results of my research!";
- mes "They don't appreciate";
- mes "my work at all! My title";
- mes "is completely worthless!";
- next;
- mes "[Drunken Man]";
- mes "You don't know how long I've";
- mes "been imprisoned in the lab and";
- mes "that the work conditions just get";
- mes "worse and worse. Screw them! I'll";
- mes "keep getting paid as long as I show";
- mes "them some progress in our project!";
- next;
- menu "Project?",-;
- mes "[Drunken Man]";
- mes "Yeah, we're researching";
- mes "Ymir's Heart. It was found";
- mes "a long time ago in ^3131FFEinbech^000000";
- mes "and it's in our lab now.";
- next;
- mes "[Drunken Man]";
- mes "Everyone knows it's supposed";
- mes "to hold some legendary power,";
- mes "but even I was surprised to see";
- mes "what it was capable of. It's both";
- mes "terrible and miraculous, scary";
- mes "and wondrous...";
- next;
- mes "[Drunken Man]";
- mes "So...";
- mes "I figure...";
- mes "It may even";
- mes "have the power to";
- mes "win me Dice games!";
- mes "Bwahaha--*Hiccup!*";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "(That thing I saw";
- mes "hooked up to all those";
- mes "wires in the Laboratory";
- mes "must have been a piece";
- mes "of ^3131FFYmir's Heart^000000. I better";
- mes "tell Shinokas about this.)";
- set Shinokas_Quest,8;
- //cleaning temp variables from the lab.
- set ein_stuff,0;
- set ein_scientist,0;
- close;
-}
-
-einbech.gat,57,210,4 script Young Man#04 854,{
- mes "[Young Man]";
- mes "Behind the pub,";
- mes "you'll see this old man";
- mes "who's always mumbling";
- mes "something to himself.";
- next;
- mes "[Young Man]";
- mes "Sometimes he seems really";
- mes "angry, but other times he looks";
- mes "awfully depressed. He must have";
- mes "lived through some really horrible";
- mes "experiences. I can't help but feel";
- mes "really sorry for the old guy.";
- next;
- mes "[Young Man]";
- mes "He says and does";
- mes "a lot of strange things.";
- mes "It's sad to see someone";
- mes "that old act that way, but";
- mes "it makes me wonder what";
- mes "could have happened to him.";
- if(!Shinokas_Quest)set Shinokas_Quest,1;
- close;
-}
-
-einbech.gat,165,105,7 script Buender Hikeman 847,{
- if(Shinokas_Quest >= 9) goto L_P2;
- if(Shinokas_Quest == 3) goto L_BEST;
- if(Shinokas_Quest == 2) goto L_BASTARD;
- mes "[Buender Hikeman]";
- mes "...";
- mes "......";
- if(!Shinokas_Quest)close;
- next;
- mes "[Buender Hikeman]";
- mes "...";
- mes "......";
- mes "......You...";
- next;
- mes "[Buender Hikeman]";
- mes "...";
- mes "......";
- mes "......You...";
- mes "......Stop it...";
- next;
- mes "[Buender Hikeman]";
- mes "...";
- mes "......";
- mes "......You...";
- mes "......Stop it...";
- mes "...You ^FF0000bastard^000000!";
- next;
- mes "[Buender Hikeman]";
- mes "RaaaaAAAARGHHH!!";
- next;
- mes "[Buender Hikeman]";
- mes "^0000FFThe old man seems^000000";
- mes "^0000FFslightly irked at seeing^000000";
- mes "^0000FFyou. Unfortunately, his^000000";
- mes "^0000FFscreaming and rambling^000000";
- mes "^0000FFis totally incoherent.^000000";
- next;
- mes "[Buender Hikeman]";
- mes "It ^FF0000is^000000 you!";
- mes "You're responsible!";
- mes "You've taken everything";
- mes "away from me!!";
- next;
- menu "What are you talking about?",L_WHAT,"Ignore Him.",-;
- mes "[Buender Hikeman]";
- mes "W...wait!";
- mes "I said wait!";
- mes "*Cough!*";
- close;
-L_WHAT:
- mes "[Buender Hikeman]";
- mes "How dare you...";
- mes "How dare you treat";
- mes "after destroying all the";
- mes "happiness in my life!";
- next;
- mes "[Buender Hikeman]";
- mes "Damn you...";
- mes "How can you have";
- mes "the audacity to pretend";
- mes "as if nothing happened?!";
- mes "*C-cough Cough...*";
- next;
- mes "[Buender Hikeman]";
- mes "Are you so evil to";
- mes "just shallowly forget";
- mes "what you've done to our";
- mes "lives? Did you already";
- mes "forget what you did";
- mes "here in Einbech?!";
- next;
- mes "[Buender Hikeman]";
- mes "It was such a long";
- mes "time ago, but I'll never";
- mes "forget. This town was";
- mes "small, but full of folk";
- mes "with warm hearts...";
- next;
- mes "[Buender Hikeman]";
- mes "Me, Khartophe, Anuto,";
- mes "Maskharundt... All of";
- mes "us were friends hired";
- mes "by that businessman";
- mes "to dig up ores in the mine.";
- next;
- mes "[Buender Hikeman]";
- mes "And then there";
- mes "was you! All of us";
- mes "put together made the";
- mes "greatest mining team!";
- mes "That was, until, we";
- mes "discovered ^FF0000it^000000.";
- next;
- mes "[Buender Hikeman]";
- mes "Yes...";
- mes "The mysterious ore";
- mes "that dazzled with a";
- mes "magnificent light.";
- next;
- mes "[Buender Hikeman]";
- mes "But we should have known";
- mes "that the ^0000FFUngoliant^000000 would";
- mes "be arround that ore. We";
- mes "should have realized";
- mes "the danger...";
- next;
- mes "[Buender Hikeman]";
- mes "We reported our findings";
- mes "to our employer, and then";
- mes "the ore just disappeared. He";
- mes "must have sent it somewhere,";
- mes "it was none of our business.";
- next;
- mes "[Buender Hikeman]";
- mes "Then life was back";
- mes "to normal for a while.";
- mes "But one day you yelled";
- mes "to us that you had found";
- mes "another special, mysterious";
- mes "ore in the mines.";
- next;
- mes "[Buender Hikeman]";
- mes "But when we came";
- mes "over to check the hole";
- mes "you dug up, you know";
- mes "what we found...?!";
- next;
- menu "Ungoliant?",L_UNGOLIANT,"A mysterious ore, right?",L_ORE,"Nothing...?",-;
- mes "[Buender Hikeman]";
- mes "Yes...";
- mes "Nothing.";
- next;
- goto L_CONTINUE;
-L_UNGOLIANT:
- mes "[Buender Hikeman]";
- mes "Don't you remember";
- mes "what happened? What";
- mes "you did to us at that time?!";
- next;
-L_CONTINUE:
- mes "[Buender Hikeman]";
- mes "There was nothing";
- mes "inside the hole!";
- next;
- mes "[Buender Hikeman]";
- mes "Then you pointed to";
- mes "the wall behind us and";
- mes "screamed that Ungoliant";
- mes "was coming! In our panic";
- mes "we started to dig our way out!";
- next;
- mes "[Buender Hikeman]";
- mes "I remember that the expression on";
- mes "your face seemed so strange. I had";
- mes "thought you looked sad, but now I'm";
- mes "sure you were consumed by greed! We";
- mes "trusted you and you betrayed us!";
- next;
- mes "[Buender Hikeman]";
- mes "When we finally smashed";
- mes "down that last wall, everything";
- mes "started to fall around us. We";
- mes "were the only two to survive";
- mes "that tunnel collapse.";
- next;
- mes "[Buender Hikeman]";
- mes "Then I learned...";
- mes "You planned it all along.";
- if(Shinokas_Quest == 1) set Shinokas_Quest,2;
- close;
-L_ORE:
- mes "[Buender Hikeman]";
- mes "Don't you remember";
- mes "what happened? What";
- mes "you did to us at that time?!";
- next;
- goto L_CONTINUE;
-L_BASTARD:
- mes "[Buender Hikeman]";
- mes "Bastard!";
- mes "I'm sick of";
- mes "your lies!";
- next;
- menu "I'm not who you think!",L_IM,"How did you survive the accident?",-;
-L_HOW:
- mes "[Buender Hikeman]";
- mes "When I came to,";
- mes "I was lying on my";
- mes "stomach in the ruins";
- mes "of that dark tunnel.";
- next;
- mes "[Buender Hikeman]";
- mes "And I found...";
- mes "You know what I found.";
- next;
- mes "[Buender Hikeman]";
- mes "*Cough Cough*";
- mes "The corpses of my friends!";
- mes "Kartophe, Anuto, Maskharundt";
- mes "Great men and my best friends.";
- mes "But where were you?!";
- next;
- mes "[Buender Hikeman]";
- mes "Your body was nowhere";
- mes "to be found. I searched";
- mes "the tunnel and finnaly";
- mes "climbed outside where";
- mes "I was found unconscious.";
- next;
- mes "[Buender Hikeman]";
- mes "I was so stupid.";
- mes "It was because of";
- mes "that ore! You killed our";
- mes "friend and destroyed";
- mes "my life for that thing!";
- next;
- mes "[Buender Hikeman]";
- mes "And now...";
- mes "You come out of";
- mes "hiding and show up.";
- mes "What do you want of";
- mes "me? What more can";
- mes "you possibly take away?!";
- next;
- menu "I'm not who you think I am!",L_THINK,"I'd like to apologize.",-;
- mes "[Buender Hikeman]";
- mes "Ha ha...";
- mes "Apologize?";
- mes "The harm is";
- mes "already done...";
- goto L_CONTINUE2;
-L_THINK:
- mes "[Buender Hikeman]";
- mes "Quit lying!";
- mes "You've stirred up";
- mes "my hatred by showing";
- mes "up again! I've never";
- mes "forgotten that day!";
- next;
-L_CONTINUE2:
- mes "[Buender Hikeman]";
- mes "It's too late";
- mes "for you now. For";
- mes "the sake of my friends,";
- mes "I'll have my vengeance!";
- next;
- mes "[Buender Hikeman]";
- mes "Prepare to die!";
- mes "^0000FFShinokas^000000!!!!";
- next;
- mes "[Buender Hikeman]";
- mes "...!";
- mes "*Cough! Cough!*";
- mes "Noooo! N-not now...";
- mes "*Cough! Cough!*";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...";
- mes "I better";
- mes "get away";
- mes "from him!";
- next;
- mes "^0000FFYou ran away from Hikeman^000000";
- mes "^0000FFas he collapsed on the ground^000000";
- mes "^0000FFIt wouldn't be a good idea to^000000";
- mes "^0000FFprovoke the old man anymore,^000000";
- mes "^0000FFintentionally or not.^000000";
- if(Shinokas_Quest == 2) set Shinokas_Quest,3;
- close;
-L_BEST:
- mes "^0000FFIt'd be best^000000";
- mes "^0000FFto avoid aggravating^000000";
- mes "^0000FFthe old man for now.^000000";
- close;
-L_IM:
- mes "[Buender Hikeman]";
- mes "Ha...!";
- mes "Do you think";
- mes "I'd so easily";
- mes "forget the face";
- mes "of the person who";
- mes "shattered my life?!";
- goto L_HOW;
-
-L_P2:
- mes "^0000FFHikeman is dozing^000000";
- mes "^0000FFoff in his chair. Judging^000000";
- mes "^0000FFfrom the look of discomfort^000000";
- mes "^0000FFon his face, he seems to be^000000";
- mes "^0000FFhaving a nightmare.^000000";
- if(Shinokas_Quest == 10) close;
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Excuse me...";
- next;
- mes "[Buender Hikeman]";
- mes "Huh...?";
- mes ".........!!";
- mes "Hahahahaha!";
- mes "Come back for";
- mes "your beating,";
- mes "eh, Shinokas?!";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Look...!";
- mes "I'm not Shinokas,";
- mes "okay? How can you";
- mes "forget what he looks";
- mes "like or how old he is?";
- mes "I'm way younger!";
- next;
- mes "[Buender Hikeman]";
- mes "What...?";
- next;
- mes "[Buender Hikeman]";
- mes "..................";
- next;
- mes "[Buender Hikeman]";
- mes "Uhhhh......";
- next;
- mes "[Buender Hikeman]";
- mes "Huh.";
- next;
- mes "[Buender Hikeman]";
- mes "It seems...";
- mes "I've made a";
- mes "huge mistake.";
- next;
- mes "[Buender Hikeman]";
- mes "Ever since the accident, people";
- mes "have said that I haven't been the";
- mes "same. Maybe they're right.";
- next;
- mes "[Buender Hikeman]";
- mes "I keep making the same";
- mes "mistakes, so maybe they're";
- mes "right about me getting senile.";
- mes "Did you come just to clear";
- mes "up this misunderstanding?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Um...";
- mes "Actually...";
- next;
- menu "Tell Hikeman about Shinakas's death.",-,"Don't notify Hikeman",L_NNotify;
-
- set Shinokas_Quest,10;
- mes "["+strcharinfo(0)+"]";
- mes "Shinokas died";
- mes "a while ago in";
- mes "Einbroch.";
- next;
- mes "[Buender Hikeman]";
- mes "Wh-what...?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Shinokas was killed by";
- mes "some men. He thinks they";
- mes "may have been the ones";
- mes "who hired you guys. In the";
- mes "end, he was betrayed too...";
- next;
- mes "[Buender Hikeman]";
- mes "I...";
- mes "I see...";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Shinokas may have";
- mes "gotten some money,";
- mes "but he spent the rest";
- mes "of his life in hiding,";
- mes "being hunted down.";
- next;
- mes "[Buender Hikeman]";
- mes "Nothing's left.";
- mes "I've got nothing";
- mes "to look forward to.";
- mes "I was living only to";
- mes "avenge my friends...";
- next;
- mes "[Buender Hikeman]";
- mes "Please...";
- mes "Just go back to";
- mes "wherever you came";
- mes "from. Leave me alone...";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "...";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Did Hikeman really want";
- mes "revenge on Shinokas or did";
- mes "he want to hear him out since";
- mes "they used to be close friends?";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "If I mention that";
- mes "what they found was";
- mes "the Ymir Heart Piece,";
- mes "Hikeman might end up";
- mes "getting hunter down, so";
- mes "I better not say anything.";
- next;
- mes "["+strcharinfo(0)+"]";
- mes "Why are those men";
- mes "so obsessed with that";
- mes "Ymir Heart Piece? Is it";
- mes "really worth this kind of";
- mes "cruelty? Whoever they are,";
- mes "their intentions can't be good.";
- if(BaseLevel < 41)set BaseExp,BaseExp+34750;
- else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+69500;
- else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+139000;
- else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+278000;
- else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+417000;
- else if(BaseLevel > 90)set BaseExp,BaseExp+556000;
- close;
-
-L_NNotify:
- mes "["+strcharinfo(0)+"]";
- mes "Yeah...";
- mes "That's right.";
- mes "I wanted to clear up";
- mes "this misunderstanding";
- mes "so you could calm down,";
- mes "even if it's just a little bit.";
- next;
- mes "[Buender Hikeman]";
- mes "Well, you don't have";
- mes "to worry so much about";
- mes ",u stress. I find that the";
- mes "winds that pass through";
- mes "this town to be very relaxing.";
- next;
- mes "[Buender Hikeman]";
- mes "Each time the wind";
- mes "blows by, my vision blurs,";
- mes "my memories haze and all";
- mes "of my hatred just drifts away.";
- next;
- mes "[Buender Hikeman]";
- mes "Without the wind, I'd only";
- mes "have my hatred towards ^FF0000him^000000.";
- mes "Maybe it's my only reason for";
- mes "living and maybe I'm lonely,";
- mes "but it's too late to feel";
- mes "sorry for myself now.";
- close;
-}
-
-
-//============================================================
-//============================================= Einbroch Lover
-//====================================================== Quest
-ein_in01.gat,31,151,4 script Satra 850,{
- if(EIN_LOVERQ > 11)goto s_Intimi;
- if(EIN_LOVERQ == 11)goto s_Coal4;
- if(EIN_LOVERQ == 10)goto s_Coal3;
- if(EIN_LOVERQ == 9)goto s_Coal2;
- if(EIN_LOVERQ == 8)goto s_Coal1;
- if(EIN_LOVERQ == 7)goto s_Advent;
- mes "[Satra]";
- mes "A wandering";
- mes "adventurer...?";
- mes "How sinfully";
- mes "intriguing!";
- mes "Ho ho ho ho~";
- next;
- mes "[Satra]";
- mes "Oh, do not worry";
- mes "I'm sure the beauty of";
- mes "my home has captured your";
- mes "curiosity. My brutish excuse";
- mes "for a husband would have you";
- mes "beat if he found you...";
- next;
- mes "[Satra]";
- mes "But I'm far more genteel";
- mes "then Megass. You're more";
- mes "than welcome to enjoy the";
- mes "furnishings. Ho ho ho ho~";
- close;
-
-s_Advent:
- mes "[Satra]";
- mes "A wandering adventurer...?";
- mes "How ravishingly delightful!";
- mes "You must have risked life and";
- mes "limb to sneak past my husband";
- mes "to enjoy the captivating sights";
- mes "of my home. Ho ho ho ho~";
- next;
- mes "[Satra]";
- mes "Since you're a very";
- mes "unique quest, I shall";
- mes "give you a unique honor";
- mes "and deign to converse";
- mes "with you, adventurer.";
- next;
- mes "[Satra]";
- mes "Einbech exists to provide";
- mes "my family with coal and";
- mes "materials from their mines.";
- mes "It's a natural law: workers";
- mes "must be led by a chosen few.";
- next;
- mes "[Satra]";
- mes "It's delightfully";
- mes "ludicrous to see those";
- mes "workers aspire to reach";
- mes "our heights of social";
- mes "prestige. Ho ho ho ho~";
- next;
- mes "[Satra]";
- mes "Oh, I haven't spoken to";
- mes "someone from a lower";
- mes "class in ages! It feels";
- mes "so forbiddenly exciting!";
- next;
- mes "[Satra]";
- mes "Well adventurer, that's";
- mes "the end of our informal";
- mes "chat. I'll even grant you";
- mes "full permission to boast";
- mes "of the fact that you've";
- mes "spoken to Lady Satra.";
- next;
- mes "[Satra]";
- mes "If you wish for";
- mes "me to share words with";
- mes "you once more, prove to";
- mes "me that you're worthier";
- mes "than the other peons of";
- mes "my graceful presence.";
- next;
-s_Coal1:
- mes "[Satra]";
- mes "Oh, I have a marvelous";
- mes "idea! Why don't you bring";
- mes "me ^9C0000Coals^000000? It's not impossible";
- mes "for someone like yourself, but";
- mes "this kind of task will require";
- mes "some effort on your part.";
- next;
- if(EIN_LOVERQ == 8 && countitem(1003) > 9)goto s_GotCoal1;
- mes "[Satra]";
- mes "Tah tah,";
- mes "adventurer~";
- if(EIN_LOVERQ == 7)set EIN_LOVERQ,8;
- close;
-
-s_GotCoal1:
- mes "[Satra]";
- mes "My, you've already";
- mes "brought the Coal?";
- mes "How charmingly";
- mes "prompt you are~";
- next;
- mes "[Satra]";
- mes "On behalf of the";
- mes "Kappellthaine family,";
- mes "I shall ignore your lowly";
- mes "status and graciously";
- mes "accept your small gift.";
- mes "Ho ho ho~";
- next;
- mes "[Satra]";
- mes "Do you hail from";
- mes "Einbech, adventurer?";
- mes "Ah, the Rune-Midgarts";
- mes "kingdom! I've visited your";
- mes "country. It's quite quaint";
- mes "and Jawaii is very lovely.";
- next;
- mes "[Satra]";
- mes "Well, I shall try to";
- mes "find some use for these.";
- mes "I'm afraid the gift I've asked";
- mes "from you isn't very practical.";
- mes "How is coal usually used?";
- mes "Ah, I have a novel idea!";
- next;
- mes "[Satra]";
- mes "Wouldn't it be";
- mes "intoxicatingly wild if";
- mes "Megass were to hold one";
- mes "of those social functions that";
- mes "the lower classes are so fond";
- mes "of? A 'barbeque', yes?";
- next;
- mes "[Satra]";
- mes "In any case, If you";
- mes "bring me more of that";
- mes "Coal, you would be even";
- mes "more favored by me and";
- mes "you'll become a recipient";
- mes "of my good graces. Ho ho~";
- set EIN_LOVERQ,9;
- delitem 1003,10;
- close;
-
-s_Coal2:
- mes "[Satra]";
- mes "^111111*Titter~*^000000";
- mes "Why, if it isn't my";
- mes "intrepid adventurer.";
- mes "Ho ho ho ho~";
- next;
- if(countitem(1003) > 9)goto s_GotCoal2;
- mes "[Satra]";
- mes "My apologies, but you";
- mes "must first prove to me";
- mes "that you are worthy of";
- mes "conversation. Why don't";
- mes "you deliver more of those";
- mes "^9C0000Coals^000000, mmm?";
- next;
- mes "[Satra]";
- mes "After all, I have no other";
- mes "means of knowing whether";
- mes "or not you appreciate the time";
- mes "I sacrifice by socializing with";
- mes "someone of your status.";
- mes "Ho ho ho ho~";
- close;
-
-s_GotCoal2:
- mes "[Satra]";
- mes "My word!";
- mes "Why are you carrying";
- mes "all of that dirty Coal";
- mes "with you? You poor,";
- mes "impoverished thing.";
- next;
- mes "[Satra]";
- mes "Oh! Dear me,";
- mes "I've nearly forgotten~";
- mes "How divinely silly of me!";
- mes "Once again, I graciously";
- mes "accept your small gift on";
- mes "behalf of the Kappelthaines.";
- next;
- mes "[Satra]";
- mes "Let me share a little";
- mes "bit of history concerning";
- mes "our lovely Einbroch. At one";
- mes "time, there was only Einbech,";
- mes "the mining village. You can";
- mes "imagine how long ago that was.";
- next;
- mes "[Satra]";
- mes "However, the minerals";
- mes "and ores mined in Einbech";
- mes "need to be processed and";
- mes "refined in factories that were";
- mes "all built in a nearby industrial";
- mes "comple which became Einbroch.";
- next;
- mes "[Satra]";
- mes "Now every citizen in";
- mes "Einbroch is wealthy and";
- mes "it's well known that there";
- mes "is a higher standard of";
- mes "living here than in Einbech.";
- next;
- mes "[Satra]";
- mes "Goodness, I believe";
- mes "it's time for a spot of tea~";
- mes "The next time you wish to have";
- mes "an audience with me, it would";
- mes "behoove you to bring another";
- mes "gift of Coal. Toodles~";
- set EIN_LOVERQ,10;
- delitem 1003,10;
- close;
-
-s_Coal3:
- mes "[Satra]";
- mes "Why hello~";
- mes "Your visits have";
- mes "recently been quite";
- mes "delightful, fair adventurer.";
- next;
- mes "[Satra]";
- mes "Oh, my apologies!";
- mes "I supposed you're just";
- mes "here for sight seeing,";
- mes "or perhaps you're running";
- mes "some sort of adventurer's";
- mes "errand. Am I right?";
- next;
- if(countitem(1003) > 9)goto s_GotCoal3;
- mes "[Satra]";
- mes "I know you well enough";
- mes "to know that you wouldn't";
- mes "be so rude as to stop by";
- mes "and chat without bringing";
- mes "any ^9C0000Coal^000000. Ho ho ho ho~";
- close;
-
-s_GotCoal3:
- mes "[Satra]";
- mes "Continue to show";
- mes "your appreciation";
- mes "and dedication to me";
- mes "and you'll soon be known";
- mes "to be my most favored";
- mes "commoner. Ho ho ho ho~";
- next;
- mes "[Satra]";
- mes "I'm sure you've noticed";
- mes "the strained relationship";
- mes "between Einbroch and Einbech";
- mes "by now. It's a shame, really.";
- next;
- mes "[Satra]";
- mes "As Einbroch grew wealthier";
- mes "and Einbech became more";
- mes "destitude, the affluent began";
- mes "despising the impoverished.";
- mes "I supposed it follows that the";
- mes "poor started to resent the rich.";
- next;
- mes "[Satra]";
- mes "It might be said that";
- mes "both towns have been";
- mes "trying to take advantage";
- mes "of each other, but it's";
- mes "clear that Einbroch has";
- mes "always had the upper hand.";
- next;
- mes "[Satra]";
- mes "In fact, because of";
- mes "this rift between our";
- mes "cities, our families are";
- mes "taught not to associate";
- mes "with the people of Einbech.";
- next;
- mes "[Satra]";
- mes "Now, I believe that most";
- mes "people who live in Einbech";
- mes "are peons, but that does not";
- mes "mean I will not give them a";
- mes "chance to prove their worth.";
- next;
- mes "[Satra]";
- mes "Why should I deprive";
- mes "the lowly of my gracious";
- mes "presence if they prove";
- mes "themselves meritable?";
- mes "Ho ho ho ho~";
- next;
- mes "[Satra]";
- mes "Oh, that was scrumptious!";
- mes "If you wish to pay me another";
- mes "visit, don't forget to bring some";
- mes "Coal with you. Tah tah~";
- set EIN_LOVERQ,11;
- delitem 1003,10;
- close;
-
-s_Coal4:
- mes "[Satra]";
- mes "Ho ho ho ho~";
- mes "Welcome adventurer,";
- mes "I so enjoy our little chats.";
- mes "Hors d'oeuvre?";
- next;
- if(countitem(1003) > 9)goto s_GotCoal4;
- mes "[Satra]";
- mes "Ah...";
- mes "It seems you've";
- mes "forgotten your ^9C0000Coals^000000.";
- mes "A silly mistake, but one";
- mes "I'm willing to overlook.";
- close;
-
-s_GotCoal4:
- mes "[Satra]";
- mes "Oh! You can't enjoy";
- mes "any food in that state!";
- mes "Your hands are atrociously";
- mes "grimy! May I ask why?";
- next;
- mes "[Satra]";
- mes "Ah~";
- mes "In my excitement,";
- mes "I nearly forgot that";
- mes "I asked you to bring";
- mes "Coals to me again!";
- mes "My apologies~";
- next;
- mes "[Satra]";
- mes "You've brought so much Coal";
- mes "to me, I'm convinced that you're";
- mes "much more diligent than those";
- mes "languid peasants in Einbech.";
- mes "I appreciate that you've labored";
- mes "so much to win my favor.";
- next;
- mes "[Satra]";
- mes "Hm, what was that?";
- mes "someone else provided";
- mes "these Coals and you were";
- mes "only delivering them? Then";
- mes "who actually gathered these?";
- next;
- input @str$;
- mes "[Satra]";
- if(@str$ != "Clitzer"){
- mes "I beg your pardon?";
- mes "" + @str$ + "? Oh my...";
- mes "I believe I may have";
- mes "misheard you. Ho ho ho ho~";
- close;
- }
- mes "Ah, Clitzer?";
- mes "I must say, that's";
- mes "a very humble name.";
- mes "Yet it's so familiar...";
- next;
- mes "[Satra]";
- mes "Ah, I recall there";
- mes "was a hooligan that";
- mes "has been pestering my";
- mes "daughter named Clitzer.";
- mes "Perhaps they are one";
- mes "and the same. Hmm...";
- next;
- mes "[Satra]";
- mes "I remember that he was";
- mes "rather shabby looking and";
- mes "lacked any semblance of";
- mes "etiquette whatsoever. Clearly,";
- mes "he is a fool and a coward, but";
- mes "now I see that he is sincere.";
- next;
- mes "[Satra]";
- mes "It might not be possible";
- mes "to let him go otu with my";
- mes "daughter straight away, but";
- mes "I will invite him for a spot of";
- mes "tea. And if Calla likes him,";
- mes "well, he must be special.";
- next;
- mes "[Satra]";
- mes "For a humble peasant,";
- mes "this must be like a dream";
- mes "come true! And to have tea";
- mes "with Clitzer. Oh, what would";
- mes "the girls say? Ah, but I did";
- mes "marry that oafish Megass~";
- next;
- mes "[Satra]";
- mes "Anyway, when you next";
- mes "meet Clitzer, please tell";
- mes "him to pay me a visit soon.";
- mes "Oh, and remind him to dress";
- mes "appropriately for this special";
- mes "occasion. Ho ho ho ho ho~";
- set EIN_LOVERQ,12;
- close;
-
-s_Intimi:
- mes "[Satra]";
- mes "I understand that my";
- mes "home is extravagantly";
- mes "splendid and to approach";
- mes "any Kappelthaine is an";
- mes "honor t most commoners.";
- next;
- mes "[Satra]";
- mes "However, Clitzer";
- mes "has no reason to feel so";
- mes "intimidated. Tell the poor";
- mes "boy that he's earned the";
- mes "honor of speaking with me.";
- close;
-
-}
-
-ein_in01.gat,31,138,4 script Calla 90,{
- if(EIN_LOVERQ > 4 && EIN_LOVERQ < 14)goto s_NoSwitch;
- if(EIN_LOVERQ > 1)goto s_Switches;
-s_NoSwitch:
- mes "[Calla]";
- mes "Hello adventurer.";
- mes "Our city must just be";
- mes "another place where";
- mes "you'll stay no longer";
- mes "than a few days.";
- next;
- mes "[Calla]";
- mes "You must have so much";
- mes "freedom. I envy you. I can't";
- mes "do what I want to do. I don't";
- mes "even have the courage to tell";
- mes "my family what I really want,";
- mes "much less change things here...";
- next;
- mes "[Calla]";
- mes "How is it like?";
- mes "Going wherever you";
- mes "please, following your";
- mes "heart's true desire?";
- mes "What I would give to";
- mes "be able to do that...";
- if(!EIN_LOVERQ)set EIN_LOVERQ,1;
- close;
-
-s_Switches:
- switch(EIN_LOVERQ)
- {
-
- case 2:
- mes "[Calla]";
- mes "You're the adventurer";
- mes "from before, aren't you?";
- mes "Sadly, there isn't much";
- mes "to do around here. This";
- mes "place is basically like";
- mes "a prison to me...";
- next;
- mes "[Calla]";
- mes "Oh, you've met Clitzer?";
- mes "Isn't he so kind, such";
- mes "a perfect gentleman?";
- next;
- mes "[Calla]";
- mes "I really wish I could";
- mes "see him, but it's almost";
- mes "impossible. My parents think";
- mes "he's not good enough for me,";
- mes "but they're wrong! What am";
- mes "I going to do? Oh, Clitzer...";
- next;
- mes "[Calla]";
- mes "Well, maybe I can't see";
- mes "him, but would you give";
- mes "my violin to Clitzer for me?";
- mes "I used to play this for him";
- mes "all the time...";
- next;
- mes "[Calla]";
- mes "I'm sorry to trouble you,";
- mes "but please understand";
- mes "that I want to comfort my";
- mes "Clitzer in any way that";
- mes "I possibly can. Thank";
- mes "you so much, adventurer...";
- set EIN_LOVERQ,3;
- getitem 1901,1;
- close;
- break;
-
- case 3:
- s_Regards:
- mes "[Calla]";
- mes "Oh, please send my";
- mes "regards to Clitzer for me.";
- mes "I wish I could comnfort";
- mes "him in person, but this";
- mes "is the best I can do for now.";
- close;
- break;
-
- case 4:
- if(!countitem(712))goto s_Regards;
- mes "[Calla]";
- mes "You've spoken";
- mes "with Clitzer? How";
- mes "is he? What did he say?";
- next;
- mes "[Calla]";
- mes "Oh...?";
- mes "He asked you to";
- mes "deliver this flower";
- mes "to me? How sweet~";
- mes "Thank you very much,";
- mes "kind adventurer~";
- next;
- mes "[Calla]";
- mes "Ah, I'm so rude!";
- mes "I've been calling you";
- mes "^111111*adventurer*^000000 this whole";
- mes "time you've been helping";
- mes "me! Would you please";
- mes "tell me your name?";
- next;
- input @str$;
- mes "[Calla]";
- if(@str$ != strcharinfo(0)){
- mes "I'm sorry...";
- mes "I didn't catch that.";
- mes "would you please tell";
- mes "me your name again?";
- close;
- }
- mes "Ah, " + strcharinfo(0) + "!";
- mes "Such a lovely name~";
- mes "I promise that I won't ever";
- mes "forget it. Oh, and if you pass by";
- mes "Einbech, would you thank Clitzer";
- mes "for the flower for me please?";
- next;
- mes "[Calla]";
- mes "A-and... And...";
- mes "Please tell him that";
- mes "I really miss him a lot.";
- mes "^565656*Sob Sob...*";
- delitem 712,1;
- set EIN_LOVERQ,5;
- close;
- break;
-
- case 14:
- mes "[Calla]";
- mes "I just heard from my mother";
- mes "that she's planning to have";
- mes "tea with Clitzer! I'm sure that";
- mes "I have you to thank for this~";
- next;
- mes "[Calla]";
- mes "I never dreamed that";
- mes "something as wonderful";
- mes "as this could happen.";
- mes "I'm so happy, I could cry...";
- mes "I'll always be grateful";
- mes "for what you've done.";
- next;
- mes "[Calla]";
- mes "I feel like such a fool,";
- mes "thinking it was all hopeless.";
- mes "I'll be doing my best to have";
- mes "my parents accept Clitzer and";
- mes "someday we'll be married~";
- next;
- mes "[Calla]";
- mes "There isn't much that I can";
- mes "give you, but I can show you";
- mes "one of my family's secrets.";
- mes "It's an invigorating massage";
- mes "technique that makes you alot";
- mes "healthier in only ten seconds.";
- next;
- mes "[Calla]";
- mes "Well, please take";
- mes "off your equipment";
- mes "and stand still while";
- mes "I give the massage. It";
- mes "might hurt a bit at first...";
- nude;
- next;
- mes "^3151FF*Rub Rub Rub*";
- mes "*Knead Knead Knead*";
- mes "*Crrack C-c-c--c-crack*";
- mes "*Crack Crack Crrrrrack*";
- mes "*Rub Crrraaaaaaaaaackk*^000000";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Ooooooooh...";
- mes "I feel sooo";
- mes "sore and yet";
- mes "soooooo good.";
- mes "Wait. Now I just";
- mes "feel goooood~";
- if(BaseLevel < 41)set BaseExp,BaseExp+3712;
- else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+7425;
- else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+14850;
- else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+29700;
- else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+59400;
- else if(BaseLevel > 90)set BaseExp,BaseExp+118800;
- set EIN_LOVERQ,15;
- next;
- mes "[Calla]";
- mes "So how was it?";
- mes "I hope it was refreshing.";
- mes "Please understand that";
- mes "it's the best thing I can";
- mes "give you to show my gratitude.";
- next;
- mes "[Calla]";
- mes "Once again,";
- mes "thank you so";
- mes "much, " + strcharinfo(0) + ".";
- mes "I'll always pray for";
- mes "your safety on your";
- mes "your adventures~";
- close;
- break;
-
- case 15:
- mes "[Calla]";
- mes "Thank you so much!";
- mes "I'll try my best to convince";
- mes "my parents to accept our";
- mes "relationship. It'll be hard,";
- mes "but it's a good first step~";
- next;
- mes "[Calla]";
- mes "I hope that we can all";
- mes "work together ti improve";
- mes "relations between Einbech";
- mes "and Einbroch. The hatred";
- mes "between our towns must end...";
- next;
- mes "[Calla]";
- mes "I really appreciate";
- mes "what you've done for";
- mes "all of use. I'll be praying";
- mes "for your safety, adventurer.";
- close;
- break;
-
- }
-}
-
-ein_in01.gat,191,102,4 script Kaijeta 846,{
- if(EIN_LOVERQ > 13)goto s_Learned;
- if(EIN_LOVERQ == 13)goto s_Clothes;
- if(EIN_LOVERQ > 6 && EIN_LOVERQ < 13)goto s_Hatred;
- if(EIN_LOVERQ == 6)goto s_Helping;
- mes "[Kaijeta]";
- mes "Welcome to my humble";
- mes "abode, adventurer. I'm";
- mes "sorry if I'm a poor host.";
- next;
- mes "[Kaijeta]";
- mes "As you can see, we have";
- mes "to share this house with";
- mes "other families so we don't";
- mes "have much open space or";
- mes "privacy. I'm afraid we can't";
- mes "even affor basic comfort.";
- next;
- mes "[Kaijeta]";
- mes "For now, this is the best";
- mes "we can do. We don't have";
- mes "the zeny to buy a house or";
- mes "land, so we have no choice";
- mes "but to endure through this...";
- close;
-
-s_Helping:
- mes "[Kaijeta]";
- mes "Thank you for helping my";
- mes "son. He may look like a fool";
- mes "for falling in love with someone";
- mes "from Einbroch, but he's an honest";
- mes "hard working man.";
- next;
- mes "[Kaijeta]";
- mes "Then again, it was bound to";
- mes "happen sometime. Einbech is";
- mes "a very poor town while Einbroch";
- mes "is a very rich town. I'd understand";
- mes "if you don't agree, but opposites";
- mes "attract sooner of later.";
- next;
- mes "[Kaijeta]";
- mes "^565656*Sigh...*^000000";
- mes "If my son and Calla can";
- mes "work things out, maybe it";
- mes "would improve relations";
- mes "between our two towns.";
- mes "I certainly hope so...";
- next;
- mes "[Kaijeta]";
- mes "Still, I'm quite baffled!";
- mes "I raised my son to have more";
- mes "guts than to wallow in misery";
- mes "when his heart's broken. And";
- mes "I still have no idea how he got";
- mes "together with such a rich woman.";
- next;
- mes "[Kaijeta]";
- mes "Do you have any idea";
- mes "how we can put an end";
- mes "to the hate between our";
- mes "two towns? I don't want to";
- mes "see this couple separated";
- mes "because of such pettiness.";
- set EIN_LOVERQ,7;
- close;
-
-s_Hatred:
- mes "[Kaijeta]";
- mes "I can't bear to see the";
- mes "petty hatred between our";
- mes "two towns stop my son from";
- mes "seeing the woman he loves...";
- close;
-
-s_Clothes:
- mes "[Kaijeta]";
- mes "Thank you for helping";
- mes "my son Clitzer. Sadly, the";
- mes "little fool doesn't have any";
- mes "clue when it comes to certain";
- mes "things like choosing clothing.";
- mes "he gets so nervous about it!";
- next;
- mes "[Kaijeta]";
- mes "A man should wear nice";
- mes "clothes, like a Formal Suit";
- mes "or a Tuxedo, for important";
- mes "meetings and special occassions.";
- mes "hopefully, he'll learn that soon.";
- close;
-
-s_Learned:
- mes "[Kaijeta]";
- mes "My son learned";
- mes "an awful lot from";
- mes "your good example.";
- mes "As a mother, I really";
- mes "appreciate everything";
- mes "you've done for him.";
- next;
- mes "[Kaijeta]";
- mes "Well, adventurer,";
- mes "I will be praying for";
- mes "your safety wherever";
- mes "your journeys may";
- mes "take you.";
- close;
-
-}
-
-ein_in01.gat,200,101,4 script Clitzer 854,{
- if(EIN_LOVERQ)goto s_Switches;
-s_Back:
- mes "[Clitzer]";
- mes "Is there something";
- mes "that you really want";
- mes "in life, but it's just";
- mes "beyond your grasp?";
- next;
- mes "[Clitzer]";
- mes "I wish I was more";
- mes "like you adventurers.";
- mes "People like you never";
- mes "seem to give up, no matter";
- mes "what the obstacles may be.";
- mes "But I'm so helpless...";
- next;
- mes "[Clitzer]";
- mes "I can't even see";
- mes "the one person that";
- mes "I love. We're just so";
- mes "different that it's not";
- mes "even possible anymore...";
- close;
-
-s_Switches:
- switch(EIN_LOVERQ){
- case 1:
- mes "[Clitzer]";
- mes "That faintly sweet";
- mes "and pleasant scent...";
- mes "It's just like the fragrance";
- mes "they use in Calla's house.";
- next;
- mes "[Clitzer]";
- mes "Ah, so you visited";
- mes "Calla in Einbroch?";
- mes "I miss her sooo much!";
- mes "Is she doing alright?";
- next;
- mes "[Clitzer]";
- mes "Calla's so beautiful.";
- mes "And she's so lovely.";
- mes "Every time I close my";
- mes "eyes, I can still see";
- mes "her lovely smile.";
- next;
- mes "[Clitzer]";
- mes "I'm sorry if I sound";
- mes "silly, but I can't help";
- mes "it. I know I'm acting like";
- mes "a complete idiot. But I'd";
- mes "give anything to see her...";
- next;
- mes "[Clitzer]";
- mes "Just...";
- mes "Just don't listen";
- mes "to anything I say.";
- mes "I'm just a poor fool";
- mes "in love with the wrong";
- mes "person. That has to be it...";
- set EIN_LOVERQ,2;
- close;
- break;
-
- case 2:
- mes "[Clitzer]";
- mes "^565656*Sigh*^000000";
- mes "I really appreciate your";
- mes "sympathy, but I'm merely";
- mes "a coward and a fool.";
- next;
- mes "[Clitzer]";
- mes "Yeah...";
- mes "I'm a coward for doing";
- mes "nothing about my feelings";
- mes "and an idiot for falling in love";
- mes "with such a high class girl in";
- mes "the first place... Oh, Calla...";
- close;
- break;
-
- case 3:
- if(!countitem(1901))goto s_Back;
- mes "[Clitzer]";
- mes "What brings you here?";
- mes "aren't you tired of hearing";
- mes "me moan and whine about";
- mes "lost love? ^111111*Siiiiigh...*^000000";
- next;
- mes "[Clitzer]";
- mes "Hey, this violin...";
- mes "Calla used to play";
- mes "such beautiful music";
- mes "on this for me. Did";
- mes "she give this to you?";
- next;
- mes "[Clitzer]";
- mes "I see. Calla must have";
- mes "known that I'm all broken up";
- mes "right now. She's too good to";
- mes "me. How can se consider";
- mes "my feelings before thinking";
- mes "about herself?";
- next;
- mes "[Clitzer]";
- mes "I know I'm being";
- mes "shameless, but I have";
- mes "a favor to ask. Adventurer,";
- mes "would you please send";
- mes "Calla a present for me?";
- next;
- mes "[Clitzer]";
- mes "All you need to do is";
- mes "just give her ^FF00001 Flower^000000.";
- mes "I don't have the zeny and";
- mes "I don't think I'm welcome";
- mes "at Kapellthaine Manor.";
- next;
- mes "[Clitzer]";
- mes "Here, in return, I'll";
- mes "give you this health";
- mes "massage. It's not a";
- mes "big deal, but when I'm";
- mes "done, your mind and body";
- mes "will be refreshed. Here goes!";
- next;
- mes "^3151FF*Knead Knead*";
- mes "*Rub Rub Rub Rub*";
- mes "*Press Press Press*";
- mes "*C-c-c-c-c-c-crakck!*^000000";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Oh--";
- mes "Hell yeah!";
- mes "That's the stuff!";
- delitem 1901,1;
- if(BaseLevel < 41)set BaseExp,BaseExp+3712;
- else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+7425;
- else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+14850;
- else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+29700;
- else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+59400;
- else if(BaseLevel > 90)set BaseExp,BaseExp+118800;
- set EIN_LOVERQ,4;
- next;
- mes "[Clitzer]";
- mes "Would you please bring";
- mes "1 Flower to Calla for me?";
- mes "I'm sorry for troubling you...";
- close;
- break;
-
- case 4:
- mes "[Clitzer]";
- mes "Would you please bring";
- mes "1 Flower to Calla for me?";
- mes "I'm sorry for troubling you...";
- close;
- break;
-
- case 5:
- mes "[Clitzer]";
- mes "You've given her";
- mes "the flower? That's";
- mes "great! Thank you,";
- mes "thank you so mu--";
- next;
- mes "[Clitzer]";
- mes "...Oh!";
- mes "Gosh! I was thinking so";
- mes "much about myself that";
- mes "I forgot to ask you for your";
- mes "name! I'm sorry for being";
- mes "so knuckle-headed...";
- next;
- mes "[Clitzer]";
- mes "So...";
- mes "What's your name?";
- next;
- input @str$;
- mes "[Clitzer]";
- if(@str$ != strcharinfo(0)){
- mes "Hm...?";
- mes "Oh, don't be";
- mes "so nervous~";
- mes "But would you please";
- mes "tell me your name again?";
- mes "I couldn't hear you...";
- close;
- }
- mes "" + strcharinfo(0) + "...";
- mes "That's very nice. Thank you,";
- mes "I'm really grateful for your help.";
- mes "Although I can't see Calla in";
- mes "person, I can at least send";
- mes "my regards if you help me.";
- next;
- mes "[Clitzer]";
- mes "I feel so much";
- mes "better now. Oh!";
- mes "When you have the";
- mes "time, why don't you talk";
- mes "to my mother? She always";
- mes "likes meeting my friends.";
- set EIN_LOVERQ,6;
- close;
- break;
-
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- mes "[Clitzer]";
- mes "^111111*Sigh...*^000000";
- mes "What can I do to";
- mes "get Calla's parents";
- mes "to accept me as her";
- mes "boyfriend? I can't";
- mes "think of anything...";
- close;
- break;
-
- case 12:
- mes "[Clitzer]";
- mes "Eh...?";
- mes "What did you just say?";
- mes "You did something for";
- mes "the Kapellthaines?";
- next;
- mes "[Clitzer]";
- mes "What...?";
- mes "Did you just say";
- mes "that Calla's mother";
- mes "wants me to have tea";
- mes "with her? Holy moley...!";
- next;
- mes "[Clitzer]";
- mes "Okay, okay.";
- mes "I-I I'll need something";
- mes "nice to wear, right? Oh.";
- mes "Wow. This is so sudden!";
- mes "W-what should I do?";
- next;
- mes "[Clitzer]";
- mes "This monkey suit";
- mes "that I've got on just";
- mes "won't do! Arrrgh! But I've";
- mes "already outgrown all of my";
- mes "nice clothes already. Boy,";
- mes "am I in a pickle...";
- set EIN_LOVERQ,13;
- close;
- break;
-
- case 13:
- if(countitem(2320) || countitem(7170))goto s_Clothes;
- mes "[Clitzer]";
- mes "Noooooo!";
- mes "I've got to find";
- mes "the perfect thing";
- mes "to wear or Calla's";
- mes "mother might ^FF0000hate^000000 me!";
- next;
- mes "[Clitzer]";
- mes "Think, Clitzer, think!";
- mes "Okay, no fun colors.";
- mes "I don't want her to";
- mes "think I'm not serious";
- mes "about Calla. Stripes";
- mes "might be bad too...";
- close;
- break;
-
- case 14:
- case 15:
- mes "[Clitzer]";
- mes "Look out, world!";
- mes "I'm gonna become";
- mes "worth of Calla's love!";
- mes "Someday, maybe even her";
- mes "parents will approve me!";
- close;
- break;
- }
-
-s_Clothes:
- mes "[Clitzer]";
- mes "Waaah!";
- mes "What should I wear?!";
- mes "I can't for the life of me";
- mes "figure this out! Something,";
- mes "um, formal? I've never worn";
- mes "anything like that before!";
- next;
- if(countitem(7170)){
- set @clothes,7170;
- mes "[Clitzer]";
- mes "Wait, " + strcharinfo(0) + ".";
- mes "What's that you've got";
- mes "there? I've seen something";
- mes "like that before. It's called";
- mes "a Tuxedo, right? Something";
- mes "like that would be perfect!";
- next;
- menu "Give it to him.",s_Giveclothes,"Ignore him.",-;
-
- mes "[Clitzer]";
- mes "But how can I get";
- mes "a Tuxedo? Ooh, I hope";
- mes "it doesn't cost too much";
- mes "zeny or I won't be able to";
- mes "get one of those soon...";
- } else if(countitem(2320)){
- set @clothes,2320;
- mes "[Clitzer]";
- mes "Wait, " + strcharinfo(0) + ".";
- mes "What's that you've got";
- mes "there? I've seen something";
- mes "like that before. It's called";
- mes "a Formal Suit, right?";
- mes "Something like that would";
- mes "be perfect!";
- next;
- menu "Give it to him.",s_Giveclothes,"Ignore him.",-;
-
- mes "[Clitzer]";
- mes "But how can I get";
- mes "a Formal Suit? I hope";
- mes "it doesn't cost too much";
- mes "zeny or I won't be able to";
- mes "get one of those soon...";
- }
- close;
-
-s_Giveclothes:
- mes "[Clitzer]";
- mes "I can have this?";
- mes "Oh, thank you so much!";
- mes "Finally, I have something";
- mes "nice enough to wear to meet";
- mes "Calla's mom! What a relief!";
- next;
- mes "[Clitzer]";
- mes "You've been helping me all";
- mes "this time and I haven't properly";
- mes "expressed my gratitude. I'm sorry";
- mes "if I've been to absorbed in my own";
- mes "problems. I may be poor, but I need";
- mes "to repay you somehow...";
- next;
- mes "[Clitzer]";
- mes "Wait...";
- mes "Why don't you have this";
- mes "ore? I don't how";
- mes "valuable it is, but I know";
- mes "that it's pretty rare. It may";
- mes "even be useful to you later~";
- delitem @clothes,1;
- set EIN_LOVERQ,14;
- switch(rand(1,9)){
- case 1:
- getitem 7289,1;
- break;
-
- case 2:
- getitem 7290,1;
- break;
-
- case 3:
- getitem 7291,1;
- break;
-
- case 4:
- getitem 7292,1;
- break;
-
- case 5:
- getitem 7293,1;
- break;
-
- case 6:
- getitem 7294,1;
- break;
-
- case 7:
- getitem 7295,1;
- break;
-
- case 8:
- getitem 7296,1;
- break;
-
- case 9:
- getitem 7297,1;
- break;
- }
- next;
- mes "[Clitzer]";
- mes "" + strcharinfo(0) + ",";
- mes "you've really opened";
- mes "my eyes. From now on,";
- mes "I'll do my best to earn the";
- mes "approval of Calla's parents and";
- mes "become worthy of Calla's love.";
- close;
-
-}
-
-//============================================================
-//=========================================== Einbroch Polution
-//============================================================
-
-einbroch.gat,1,1,0 script #PolutionNPC -1,{
-
-OnPolution:
- set @AlrdEinPoll,1;
- donpcevent "Liotzburg::OnHide";
- donpcevent "Morei::OnHide";
- donpcevent "Mark::OnHide";
- donpcevent "Khemko::OnHide";
- donpcevent "Oberu::OnHide";
- donpcevent "Khowropher::OnHide";
- donpcevent "Kesunboss::OnHide";
- donpcevent "Train Station Staff#01::OnHide";
- donpcevent "Train Station Staff#02::OnHide";
- donpcevent "Leslie::OnHide";
- donpcevent "Little Toby::OnHide";
- donpcevent "Tan::OnHide";
- donpcevent "Keneshiotz::OnHide";
- donpcevent "Sleik::OnHide";
- donpcevent "Uwe Kleine::OnHide";
- donpcevent "Laboratory Soldier#01::OnHide";
- donpcevent "Laboratory Soldier#02::OnHide";
- disablenpc "Paddler";
- disablenpc "Head Gear Dealer";
-
- mapannounce "einbroch.gat","This is a state of emercency! Harmful smog is reaching high levels of saturation. Residents of Einbroch must find shelter immediately.",bc_map;
- monster "einbroch.gat",82,332,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",99,328,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",122,317,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",138,319,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",147,312,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",159,316,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",173,315,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",161,311,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",147,296,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",168,282,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",175,271,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",146,274,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",160,272,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",155,256,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",179,262,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",192,248,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",212,255,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",230,250,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",246,251,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",262,254,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",253,240,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",202,245,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",181,251,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",172,238,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",146,242,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",186,226,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",173,239,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",124,248,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",120,234,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",98,234,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",101,219,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",89,208,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",96,191,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",76,194,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",60,196,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",45,194,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",34,201,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",40,184,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",64,173,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",96,173,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",41,155,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",46,131,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",46,108,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",38,93,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",55,86,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",81,81,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",107,82,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",107,104,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",123,73,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",132,87,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",125,63,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",142,64,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",150,52,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",157,37,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",179,39,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",197,46,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",217,67,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",246,54,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",228,110,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",250,118,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",273,127,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",288,138,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",281,160,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",281,192,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",291,201,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",283,218,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",268,216,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",273,196,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",262,164,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",241,180,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",216,205,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",209,198,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",224,177,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",227,163,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",208,166,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",132,87,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",149,119,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",119,36,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",84,155,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
- monster "einbroch.gat",82,107,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
- initnpctimer;
- end;
-
-OnMobChk:
- if(mobcount("einbroch.gat","#PolutionNPC::OnMobChk"))end;
-
-OnTimer600000:
- killmonster "einbroch.gat","#PolutionNPC::OnMobChk";
- mapannounce "einbroch.gat","Emergency status is now cancelled. Air pollution levels are now within the safety zone.",bc_map;
- enablenpc "Liotzburg";
- donpcevent "Liotzburg::OnUnHide";
- enablenpc "Morei";
- donpcevent "Morei::OnUnHide";
- enablenpc "Mark";
- donpcevent "Mark::OnUnHide";
- enablenpc "Khemko";
- donpcevent "Khemko::OnUnHide";
- enablenpc "Oberu";
- donpcevent "Oberu::OnUnHide";
- enablenpc "Khowropher";
- donpcevent "Khowropher::OnUnHide";
- enablenpc "Kesunboss";
- donpcevent "Kesunboss::OnUnHide";
- enablenpc "Train Station Staff#01";
- donpcevent "Train Station Staff#01::OnUnHide";
- enablenpc "Train Station Staff#02";
- donpcevent "Train Station Staff#02::OnUnHide";
- enablenpc "Leslie";
- donpcevent "Leslie::OnUnHide";
- enablenpc "Little Toby";
- donpcevent "Little Toby::OnUnHide";
- enablenpc "Tan";
- donpcevent "Tan::OnUnHide";
- enablenpc "Keneshiotz";
- donpcevent "Keneshiotz::OnUnHide";
- enablenpc "Sleik";
- donpcevent "Sleik::OnUnHide";
- enablenpc "Uwe Kleine";
- donpcevent "Uwe Kleine::OnUnHide";
- enablenpc "Laboratory Soldier#01";
- donpcevent "Laboratory Soldier#01::OnUnHide";
- enablenpc "Laboratory Soldier#02";
- donpcevent "Laboratory Soldier#02::OnUnHide";
- enablenpc "Paddler";
- enablenpc "Head Gear Dealer";
- set $EinPolution,0;
- set @AlrdEinPoll,0;
- end;
-
-}
-
-sec_in02.gat,127,86,3 script Einbroch Polution 851,{
-
- if(getgmlevel() > 79){
- mes "[Einbroch Polution Variable Management]";
- mes "$EinPolution is currently: " + $EinPolution + ".";
- mes "What would you like to do?";
- next;
- menu "Reset $EinPolution to 0",s_0,"Input My Own Value",s_Input,"Cancel.",-;
- close;
- s_0:
- mes "[Einbroch Polution Variable Management]";
- mes "$EinPolution has been reset to 0.";
- set $EinPolution,0;
- set @AlrdEinPoll,0;
- close;
- s_Input:
- mes "[Einbroch Polution Variable Management]";
- mes "Insert a number you want $EinPollution";
- mes "to be replaced with. Type '0' to cancel.";
- input @temppol;
- if(@temppol == 0)close;
- set $EinPolution,@temppol;
- mes "[Einbroch Polution Variable Management]";
- mes "$EinPolution has been set to: " + $EinPolution + ".";
- close;
- } else {
- mes "[Einbroch Polution Variable Management]";
- mes "Sorry you don't have authorization";
- mes "to use this NPC.";
- close;
- }
-}
-
-//============================================================
-//=========================================== Einbroch Factory
-//====================================================== Quest
-
-einbroch.gat,132,84,3 script Liotzburg 853,{
-
- if($EinPolution > 9){
- mes "[Liotzburg]";
- mes "What's going on?!";
- mes "Who's responsible?!";
- mes "God, I can't believe";
- mes "this is happening!";
- mes "^333333*Cough Cough!*^000000";
- next;
- mes "[Liotzburg]";
- mes "I need to get out of here!";
- mes "You! D-do something and";
- mes "fix this! I gotta hide and find";
- mes "someplace safe!";
- close2;
- if(!@AlrdEinPoll)donpcevent "#PolutionNPC::OnPolution";
- end;
- }
- if(EinFactory >= 13){
- if(EinFactory > 13){
- mes "[Liotzburg]";
- mes "What...?";
- mes "Factory Repair";
- mes "budget? No way!";
- next;
- }
- mes "[Liotzburg]";
- mes "Why waste money?";
- mes "We haven't had any";
- mes "problems so far! Look,";
- mes "everything's fine! Why";
- mes "are you exaggerating";
- mes "such small details?";
- next;
- mes "[Liotzburg]";
- mes "The field overseer,";
- mes "Zelmeto, just came by to";
- mes "ask for a budget increase.";
- mes "Well, I think he's lying!";
- mes "Everything's perfect!";
- if(EinFactory == 13)set EinFactory,14;
- close;
- }
- mes "[Liotzburg]";
- mes "I'm the plant";
- mes "superintendant of this";
- mes "factory. Most of my employees";
- mes "are diligent workers. I can't say";
- mes "that of everyone, but overall we're";
- mes "doing an excellent job. Ha ha ha~!";
- next;
- mes "[Liotzburg]";
- mes "So long as this factory";
- mes "is well maintained, we won't";
- mes "have to worry about this city's";
- mes "safety. The field overseer,";
- mes "Zelmeto, is also very reliable.";
- next;
- mes "[Liotzburg]";
- mes "I can trust Zelmeto";
- mes "to look after things,";
- mes "so there's no need for";
- mes "me to go inside the factory.";
- mes "Delegating work is great!";
- next;
- mes "[Liotzburg]";
- mes "Our factory will";
- mes "continue to develop";
- mes "and everyone will be";
- mes "proud of the progress";
- mes "we're making. Yes, I can";
- mes "assure you of that!";
- close;
-
-OnHide:
- specialeffect 16;
- disablenpc "Liotzburg";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
-}
-
-ein_in01.gat,67,243,3 script Zelmeto 851,{
-
- if($EinPolution > 9){
- mes "[Zelmeto]";
- mes "We've got a big problem";
- mes "here! I appreciate that you've";
- mes "been gathering the materials,";
- mes "but the machines have been";
- mes "broken for too long!";
- next;
- mes "[Zelmeto]";
- mes "Right when I tried to";
- mes "fix it, a huge shortout";
- mes "occurred. Our town is";
- mes "probably filled with";
- mes "toxic fog right now!";
- next;
- mes "[Zelmeto]";
- mes "I'll try my best to fix";
- mes "this, but we really should";
- mes "have allocated some funds";
- mes "to fix this machine earlier!";
- next;
- mes "[Zelmeto]";
- mes "The most important";
- mes "thing is that you get";
- mes "out of here and find";
- mes "shelter! Right now!";
- close2;
- warp "einbroch.gat",131,83;
- end;
- }
-
- if(EinFactory > 0)goto s_Switches;
- mes "[Zelmeto]";
- mes "Ah, you must be a visitor.";
- mes "I'm Zelmeto Abellov, the";
- mes "field overseer. Have you";
- mes "been in this facility before?";
- next;
- mes "[Zelmeto]";
- mes "This factory plays an";
- mes "important role in our city";
- mes "and generates a lot of income.";
- mes "However, our employess suffer";
- mes "from a poor work environment.";
- next;
- mes "[Zelmeto]";
- mes "Our superintendant makes a lot";
- mes "of money and seems content with";
- mes "the current situation. However, the";
- mes "rest of the workforce doesn't enjoy";
- mes "all of the benefits he receives.";
- mes "[Zelmeto]";
- mes "Many people have already";
- mes "quit and there are only a few";
- mes "people who continue to work";
- mes "here. So now we're understaffed";
- mes "and I'm in quite a bind...";
- next;
- mes "[Zelmeto]";
- mes "There are some urgent";
- mes "tasks I need done, but";
- mes "there's no way for me";
- mes "to recruit new workers.";
- mes "Ah, I'm sorry, I've spoken too";
- mes "freely about my own problems...";
- next;
- menu "You're understaffed?",s_Underst,"No, it's okay.",-;
-
- mes "[Zelmeto]";
- mes "Thank you for";
- mes "your kindness.";
- mes "And please don't";
- mes "let anyone know about";
- mes "anything I just told you.";
- close;
-
-s_Underst:
- mes "[Zelmeto]";
- mes "Yes, we are!";
- mes "I don't have enough";
- mes "people to inspect the";
- mes "factory machines and";
- mes "determine what kinds";
- mes "of problems we have.";
- next;
- mes "[Zelmeto]";
- mes "It's a time consuming";
- mes "task I'd rather do on my";
- mes "own. However, between that";
- mes "and managing the workforce,";
- mes "I don't have enough time...";
- next;
- menu "I can help you.",s_Help,"Keep up the good job.",-;
-
- mes "[Zelmeto]";
- mes "Well, it's a living.";
- mes "^6A6A6A*Sigh*^000000 I can put up with";
- mes "this, but I hope the higher";
- mes "ups will consider improving";
- mes "the work environment here...";
- close;
-
-s_Help:
- mes "[Zelmeto]";
- mes "You can help me?";
- mes "I know something like";
- mes "this is too much to ask,";
- mes "but I'll accept any help";
- mes "anyone offers me. I'm";
- mes "that desperate.";
- next;
- mes "[Zelmeto]";
- mes "Alright, I'll have you";
- mes "inspect the machines";
- mes "in the factory one by one.";
- mes "It's imperative that we know";
- mes "what needs to be repaired";
- mes "and what's working fine";
- next;
- mes "[Zelmeto]";
- mes "First, find the ^FF00002nd control";
- mes "panel^000000 and determine its";
- mes "status. I'm fairly certain that";
- mes "it broke a long time ago, but";
- mes "it wouldn't hur to make sure.";
- mes "You should find it easily.";
- next;
- mes "[Zelmeto]";
- mes "When you finish your";
- mes "inspection, report back";
- mes "to me so I can tell you";
- mes "which machine to check";
- mes "next. Thanks again for";
- mes "offering to help";
- set EinFactory,1;
- close;
-s_Switches:
- switch(EinFactory){
- case 1:
- mes "[Zelmeto]";
- mes "If you would,";
- mes "please inspect the";
- mes "2nd control panel that";
- mes "seems to have been";
- mes "broken for a while...";
- close;
- break;
-
- case 2:
- mes "[Zelmeto]";
- mes "Huh, I see.";
- mes "We must do something";
- mes "about that as soon as";
- mes "we can. Now, let me tell";
- mes "you what to check next.";
- next;
- mes "[Zelmeto]";
- mes "There are 3 automatic";
- mes "pressure governors which";
- mes "hammer the bent iron plates";
- mes "from above to flatten them. It";
- mes "seems that one of them may";
- mes "have some kind of problem.";
- next;
- mes "[Zelmeto]";
- mes "Please inspect the ^FF0000automatic";
- mes "pressure governors^000000. Even if the";
- mes "problem seems small, please";
- mes "report it to me. I know it might";
- mes "seem fine now, but I want to";
- mes "prevent an accident if I can.";
- next;
- mes "[Zelmeto]";
- mes "Thank you";
- mes "in advance,";
- mes "adventurer.";
- set EinFactory,3;
- close;
- break;
-
- case 3:
- mes "[Zelmeto]";
- mes "You need to inspect";
- mes "an automatic pressure";
- mes "governor. It looks fine,";
- mes "but sometimes it makes";
- mes "strange noises.";
- next;
- mes "[Zelmeto]";
- mes "It probably will";
- mes "be a good idea to";
- mes "check that machine";
- mes "more carefully this";
- mes "time, just in case.";
- next;
- mes "[Zelmeto]";
- mes "Thank you";
- mes "for helping us,";
- mes "adventurer.";
- close;
- break;
-
- case 4:
- mes "[Zelmeto]";
- mes "What...?";
- mes "This is worse";
- mes "than I expected. But";
- mes "it's good that we know";
- mes "about these problems";
- mes "as soon as possible.";
- next;
- mes "[Zelmeto]";
- mes "Don't you worry,";
- mes "we'll take care of";
- mes "this. In the meantime,";
- mes "I'd like you to inspect";
- mes "the next machine for me.";
- next;
- mes "[Zelmeto]";
- mes "I want you to check";
- mes "a ^FF0000control panel^000000. It's the";
- mes "same kind as the one";
- mes "you just inspected, but";
- mes "bigger in size.";
- next;
- mes "[Zelmeto]";
- mes "It's located in the";
- mes "middle of the factory,";
- mes "so you should be able";
- mes "to find it. It may be in bad";
- mes "condition, even though it's";
- mes "operating fine for now...";
- next;
- mes "[Zelmeto]";
- mes "We need to ensure that";
- mes "it's stable, reliable and";
- mes "doesn't pose a threat to";
- mes "our workforce. Thanks";
- mes "again, adventurer.";
- set EinFactory,5;
- close;
- break;
-
- case 5:
- mes "[Zelmeto]";
- mes "I'd like you to inspect";
- mes "the control panel. It's";
- mes "fairly large and can be";
- mes "found in the middle of the";
- mes "factory. You shouldn't have";
- mes "too much trouble finding it.";
- close;
- break;
-
- case 6:
- mes "[Zelmeto]";
- mes "I see...";
- mes "It's most likely that";
- mes "there was a short";
- mes "circuit and most";
- mes "of the internal devices";
- mes "were burnt out...";
- next;
- mes "[Zelmeto]";
- mes "Thanks for checking";
- mes "that out for me. Now,";
- mes "the next machine I need";
- mes "you to inspect is different";
- mes "than the others I've had";
- mes "you examine.";
- next;
- mes "[Zelmeto]";
- mes "It's a mechanical";
- mes "hand that transports";
- mes "small objects. We didn't";
- mes "really give it a name, but";
- mes "you should be able to find it.";
- next;
- mes "[Zelmeto]";
- mes "Recently, it seems";
- mes "that there have been";
- mes "problems in operating";
- mes "that machine. If something's";
- mes "broken, we need to know";
- mes "and fix it right away.";
- next;
- mes "[Zelmeto]";
- mes "Thanks again";
- mes "in advance.";
- set EinFactory,7;
- close;
- break;
-
- case 7:
- mes "[Zelmeto]";
- mes "The machine which";
- mes "I want you to inspect";
- mes "this time is a small";
- mes "sized conveyor.";
- next;
- mes "[Zelmeto]";
- mes "Be sure that you";
- mes "inspect the small";
- mes "one, since we also";
- mes "have a large conveyor";
- mes "in the factory as well";
- close;
- break;
-
- case 8:
- mes "[Zelmeto]";
- mes "Huh?";
- mes "I'm suprised to hear";
- mes "that. ^6A6A6A*Sigh*^000000 There's just";
- mes "too many things that need";
- mes "fixing. This is terrible...";
- next;
- mes "[Zelmeto]";
- mes "Well, let me worry";
- mes "about that for now. Please";
- mes "focus on continuing to inspect";
- mes "some of the other machines.";
- next;
- mes "[Zelmeto]";
- mes "Now, there's a pipe inside";
- mes "this factory that I want you";
- mes "to look at. Many of our pipes";
- mes "aren't in the best condition,";
- mes "but this particular one might";
- mes "be severely damaged.";
- next;
- mes "[Zelmeto]";
- mes "Now, the pipe I want";
- mes "you to inspect is located";
- mes "near those large caultrons";
- mes "of molten metal. You should";
- mes "be able to find it pretty easily";
- next;
- mes "[Zelmeto]";
- mes "Thanks again";
- mes "for your help,";
- mes "adventurer.";
- set EinFactory,9;
- close;
- break;
-
- case 9:
- mes "[Zelmeto]";
- mes "The pipe I want";
- mes "you to inspect is located";
- mes "near those large caultrons";
- mes "of molten metal. You should";
- mes "be able to find it pretty easily";
- next;
- mes "[Zelmeto]";
- mes "Thanks again";
- mes "for your help,";
- mes "adventurer.";
- close;
- break;
-
- case 10:
- mes "[Zelmeto]";
- mes "This is";
- mes "worse than";
- mes "I imagined...";
- next;
- mes "[Zelmeto]";
- mes "We've got to start";
- mes "repairs as soon as we";
- mes "can! Hopefully, we can";
- mes "resolve this before";
- mes "any serious problems happen...";
- next;
- mes "[Zelmeto]";
- mes "Alright, the last";
- mes "thing that you need to";
- mes "inspect is a ^FF0000large conveyor^000000.";
- mes "It's similiar to the one you";
- mes "inspected before, but it's";
- mes "bigger and more powerful.";
- next;
- mes "[Zelmeto]";
- mes "We have only one of these";
- mes "machines and it's usually";
- mes "moved around a lot since";
- mes "a lot of people in the factory";
- mes "use it. I really don't know";
- mes "where it could be now.";
- next;
- mes "[Zelmeto]";
- mes "Still I'm sure that";
- mes "it's inside the building,";
- mes "so you should be able to";
- mes "find it. I hope you can inspect";
- mes "that conveyor for me soon.";
- set EinFactory,11;
- close;
- break;
-
- case 11:
- mes "[Zelmeto]";
- mes "The machine which";
- mes "you are supposed to";
- mes "inspect right now";
- mes "is a large convyore.";
- next;
- mes "[Zelmeto]";
- mes "Remember that we";
- mes "also have a small sized";
- mes "conveyor, so make sure";
- mes "that you examine the";
- mes "larger one, alright?";
- close;
- break;
-
- case 12:
- mes "[Zelmeto]";
- mes "Well, I figured that both";
- mes "conveyors would have";
- mes "similiar problems. We";
- mes "can fix them at the";
- mes "same time, but it'll";
- mes "be a hassle";
- next;
- mes "[Zelmeto]";
- mes "Thank you so much for";
- mes "your help. Without you,";
- mes "I'm pretty sure we wouldn't";
- mes "know about these problems";
- mes "until it was too late.";
- next;
- mes "[Zelmeto]";
- mes "Now, I've got to make sure";
- mes "we have enough materials";
- mes "to make the repairs so that";
- mes "the machines will be safely";
- mes "functioning again.";
- next;
- mes "[Zelmeto]";
- mes "First, I better";
- mes "hurry and request";
- mes "an increase for the";
- mes "Factory Repair budget";
- mes "from our superintendant.";
- set EinFactory,13;
- close;
- break;
-
- case 13:
- mes "[Zelmeto]";
- mes "I've got to report this";
- mes "to our superintendant";
- mes "as soon as possible.";
- next;
- mes "[Zelmeto]";
- mes "With any luck, he'll approve";
- mes "a budget increase so that we";
- mes "can get all of the materials";
- mes "needed for the repairs.";
- close;
- break;
-
- case 14:
- mes "[Zelmeto]";
- mes "...";
- mes "......";
- next;
- mes "[Zelmeto]";
- mes "^6A6A6A*Sigh*^000000";
- mes "My proposal was rejected";
- mes "by our superintendant. But";
- mes "maintainance and repairs";
- mes "are crucial for peak operating";
- mes "efficiency and worker safety!";
- next;
- mes "[Zelmeto]";
- mes "I'm frustrated and worried.";
- mes "Maybe nothing will happen";
- mes "for now, but we've got to";
- mes "safeguard our future by";
- mes "regularly maintaining";
- mes "all of these machines";
- next;
- mes "[Zelmeto]";
- mes "Even possible threats";
- mes "to the safety of our workers";
- mes "can't be ignored. Isn't there";
- mes "something I can do? ^6A6A6A*Sigh*^000000";
- next;
- mes "[Zelmeto]";
- mes "If we can";
- mes "just get";
- mes "20 ^FF0000Flexible Tube^000000,";
- mes "10 ^FF0000Rusty Screw^000000 and";
- mes "10 ^FF0000Used Iron Plate^000000,";
- mes "we could make those repairs.";
- next;
- mes "[Zelmeto]";
- mes "But without funds, there's";
- mes "no way we can purchase";
- mes "those items. If something";
- mes "happens, who's going to";
- mes "be responsible?";
- set EinFactory,15;
- close;
- break;
-
- case 15:
- mes "[Zelmeto]";
- if(countitem(7325) < 20 || countitem(7317) < 10 || countitem(7319) < 10){
- mes "We need";
- mes "at least";
- mes "20 ^FF0000Flexible Tube^000000,";
- mes "10 ^FF0000Rusty Screw^000000 and";
- mes "10 ^FF0000Used Iron Plate^000000,";
- mes "to repair this factory.";
- next;
- mes "[Zelmeto]";
- mes "^6A6A6A*Sigh*^000000";
- mes "But there's no way";
- mes "we can get all of those";
- mes "things. Our budget isn't";
- mes "big enough to cover it.";
- close;
- }
- mes "Ah, it's you again.";
- mes "It's shameful letting";
- mes "other people know about";
- mes "our miserable situation...";
- next;
- mes "[Zelmeto]";
- mes "There's nothing";
- mes "worth seeing here,";
- mes "so there really isn't";
- mes "a point in you coming to";
- mes "visit this place anymore.";
- next;
- menu "Give him the materials.",s_Give,"Huh.",-;
-
- mes "[Zelmeto]";
- mes "^6A6A6A*Sigh*^000000";
- mes "I'm really worried";
- mes "about this factory's";
- mes "future. What is our";
- mes "superintendant thinking...?";
- close;
-
- s_Give:
- mes "[Zelmeto]";
- mes "...Hm?";
- mes "Aren't these the";
- mes "materials we need";
- mes "to make repairs in";
- mes "the factory? How did";
- mes "you find all of these?";
- next;
- if(countitem(7325) < 20 || countitem(7317) < 10 || countitem(7319) < 10)close;
- delitem 7325,20;
- delitem 7317,10;
- delitem 7319,10;
- set EinFactory,16;
- set $EinPolution,$EinPolution+1;
- if(BaseLevel < 41) set BaseExp,BaseExp+615;
- else if(BaseLevel >= 41 && BaseLevel < 51) set BaseExp,BaseExp+3075;
- else if(BaseLevel >= 51 && BaseLevel < 61) set BaseExp,BaseExp+6604;
- else if(BaseLevel >= 61 && BaseLevel < 71) set BaseExp,BaseExp+18508;
- else if(BaseLevel >= 71 && BaseLevel < 81) set BaseExp,BaseExp+32062;
- else if(BaseLevel >= 81 && BaseLevel < 91) set BaseExp,BaseExp+76026;
- else if(BaseLevel >= 91) set BaseExp,BaseExp+290675;
- mes "[Zelmeto]";
- mes "I don't know how";
- mes "I can possible pay you";
- mes "back for this great favor.";
- mes "I appreciate that you've";
- mes "stepped forward to help us.";
- next;
- mes "[Zelmeto]";
- mes "Oh...!";
- mes "In my years of managing,";
- mes "I've learned the ultimate";
- mes "motivation techniques. Let";
- mes "me enhance your motivation";
- mes "to show you my gratitude.";
- next;
- mes "[Zelmeto]";
- mes "Now...";
- mes "Just open your mind";
- mes "and listen to my words";
- mes "of encouragement";
- mes "and inspiration...";
- next;
- mes "[Zelmeto]";
- mes "^3131FFWhen the going";
- mes "gets rough, you've";
- mes "gotta get rougher!";
- mes "You gotta climb that";
- mes "mountain 'cause no one's";
- mes "gonna climb it for you!";
- next;
- mes "[Zelmeto]";
- mes "^3131FFDon't give it up!";
- mes "Go for broke!";
- mes "Losers are quitters";
- mes "and quitters are losers!";
- next;
- mes "[Zelmeto]";
- mes "^6A6A6A*Whew*";
- mes "^000000I haven't given that much";
- mes "inspiration in a while, but";
- mes "your help was well worth it.";
- mes "I'm going to start the repairs, but";
- mes "once again I'd like to thank you.";
- close;
- break;
-
- case 16:
- mes "[Zelmeto]";
- mes "We'll be putting good";
- mes "use to the materials you";
- mes "gave me. With your help,";
- mes "our factory will operate";
- mes "safely. At least, for just";
- mes "a little while longer.";
- close;
- }
-}
-
-ein_in01.gat,50,232,4 script 2nd Control Panel 111,{
-
- if(EinFactory == 1){
- mes "^3131FFIt's the 2nd control panel";
- mes "Zelmeto asked you to inspect.";
- mes "it looks totally broken: screws";
- mes "are missing, and the iron cover";
- mes "has been bent open, revealing";
- mes "a tangled mess of wires inside.";
- set EinFactory,2;
- close;
- }
- end;
-}
-
-ein_in01.gat,108,217,4 script 3rd Pressure Governor 111,{
-
- if(EinFactory == 3){
- mes "^3131FFAt first glance, this";
- mes "pressure governor looks";
- mes "perfectly fine. But after you";
- mes "check it more carefully, you";
- mes "find that it's making strange";
- mes "grinding noises and a few of";
- mes "the surface screws are loose.";
- set EinFactory,4;
- close;
- }
- end;
-}
-
-ein_in01.gat,61,259,4 script Main Control Panel 111,{
-
- if(EinFactory == 5){
- mes "^3131FFThe main control panel";
- mes "doesn't look like it has";
- mes "any problems. But after";
- mes "tapping on its surface,";
- mes "you hear a disheartening";
- mes "hollow sound. It looks like";
- mes "it's missing some parts...";
- set EinFactory,6;
- close;
- }
- end;
-}
-
-ein_in01.gat,47,197,4 script Conveyor#01 111,{
-
- if(EinFactory == 7){
- mes "^3131FFThe conveyor's movements";
- mes "look jittery and clumsy. The";
- mes "mechanical arm also doesn't";
- mes "look powerful enough to bear";
- mes "the loads that it's carrying. The";
- mes "screws in the conveyor look";
- mes "loose and rusted over.";
- set EinFactory,8;
- close;
- }
- end;
-}
-
-ein_in01.gat,100,267,4 script Pipe 111,{
-
- if(EinFactory == 9){
- mes "^3131FFThe inspection of this";
- mes "pipe didn't take very long.";
- mes "It's bloated and worn out";
- mes "from long durations of";
- mes "being overloaded with";
- mes "pressure. It's a wonder";
- mes "it hasn't exploded yet.";
- set EinFactory,10;
- close;
- }
- end;
-}
-
-ein_in01.gat,95,238,4 script Conveyor#02 111,{
-
- if(EinFactory == 11){
- mes "^3131FFThis conveyor seems";
- mes "to have similiar problems";
- mes "as its smaller version. Its";
- mes "movements are awkward,";
- mes "erratic and weak, and almost";
- mes "all of its screws are rusted.";
- set EinFactory,12;
- close;
- }
- end;
-}
-//============================================================
-//=============================================== Einbroch Uwe
-//====================================================== Quest
-einbroch.gat,215,180,5 script Uwe Kleine 85,{
-
- if(EinUwe == 2)goto s_Cont2;
- if(EinUwe == 1)goto s_Cont;
- mes "[Uwe]";
- mes "Cooking is such a joy~!";
- mes "The scents, the flavors, the";
- mes "sensation of sheer ^EFAEBDsatiation^000000...";
- next;
- menu "Um, isn't this a forge?",s_Forge,"Ignore him.",-;
-
- mes "[Uwe]";
- mes "Cooking begins with";
- mes "fire and ends with fire.";
- mes "There's a certain art to";
- mes "creating fine, delicious";
- mes "foods to delight the palate~";
- close;
-
-s_Forge:
- mes "[Uwe]";
- mes "Is this a forge?";
- mes "Oh, sugar honey,";
- mes "you haven't been here";
- mes "before, haven't you?";
- next;
- mes "[Uwe]";
- mes "My name is Uwe Kleine";
- mes "and this is my forge~! I am";
- mes "the most elegant Blacksmith";
- mes "and the best chef here in the";
- mes "Schwartzwald Republic~";
- next;
- mes "[Uwe]";
- mes "So, how can";
- if(Sex){
- mes "I help you, you";
- mes "adoooooooooorable";
- mes "hunk of a man?";
- }else{
- mes "I help you?";
- }
- next;
- menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Master, I want to learn cooking.",s_Cook,"Cancel.",-;
-
- mes "[Uwe]";
- mes "Take care,";
- mes "sugar honey~";
- mes "Ho ho ho!";
- close;
-
-s_Ein:
- mes "[Uwe]";
- mes "Einbroch was originally";
- mes "build to support Einbech's";
- mes "mining efforts. Because it's";
- mes "small and crowded with people,";
- mes "there's no room to build the ore";
- mes "refining factories over there.";
- next;
- mes "[Uwe]";
- mes "Sine Einbroch used to be";
- mes "an empty lot, it was perfect";
- mes "for building factories. That's";
- mes "what my grandfather told me a";
- mes "long time ago. Anyway, Einbroch";
- mes "quickly grew into a major city.";
- next;
- mes "[Uwe]";
- mes "Now people think that this";
- mes "city was never planned to be";
- mes "just an extension of Einbech.";
- mes "See that rampart over there?";
- mes "It doesn't connection to Einbech";
- mes "at all! No protection for them...";
- next;
- mes "[Uwe]";
- mes "It's like the government";
- mes "lost all interest in Einbech.";
- mes "Even the miners there have";
- mes "been moving here to work in";
- mes "the factories. But more people";
- mes "hasn't made this city more lively.";
- next;
- mes "[Uwe]";
- mes "Einbroch may look modern";
- mes "and exciting now, but soon";
- mes "you'll see that there's no sign";
- mes "of warmth or life. So... Just";
- mes "don't live here in your old age.";
- next;
- menu "Then why are you here?",s_WhyHere,"I won't. Thanks for the advice.",-;
-
- mes "[Uwe]";
- mes "Oh, that is such";
- mes "a good decision,";
- mes "sugar honey! Oh, you";
- mes "cutie adventurers are";
- mes "so precious, so lovable.";
- mes "^111111*Tee hee hee~*^000000";
- next;
- mes "[Uwe]";
- mes "Well, that was";
- mes "a fun talk. Come";
- mes "back and visit, 'kay?";
- mes "I'll miss you until";
- mes "the next time~";
- close;
-
-s_WhyHere:
- mes "[Uwe]";
- mes "Well, I have some";
- mes "precious memories of";
- mes "this place. Once, there was";
- mes "a man who lived here who";
- mes "was just like a father to me.";
- next;
- mes "[Uwe]";
- mes "Oh, but I'm sure that";
- mes "you don't want to hear";
- mes "about that. Next time you";
- mes "drop by, we'll talk about";
- mes "something more fun, 'kay?";
- mes "Buhbye for now, cutie~";
- close;
-
-s_Weap:
- mes "[Uwe]";
- mes "Well...";
- mes "I actually just";
- mes "do smithing work";
- mes "to create my own";
- mes "cooking tools.";
- next;
- mes "[Uwe]";
- mes "Oh, I understand";
- mes "that somebody needs";
- mes "to fight the monsters,";
- mes "but I'm the wrong person";
- mes "to ask for forging weapons.";
- mes "I... am a strict pacifist~";
- next;
- mes "[Uwe]";
- mes "Just go look";
- mes "around for a little";
- mes "bit, I'm sure you'll";
- mes "find a Blacksmith";
- mes "who's willing to forge";
- mes "you a good weapon~";
- close;
-
-s_Cook:
- mes "[Uwe]";
- mes "Mm...?";
- mes "Did you just";
- mes "say that you";
- mes "want to learn";
- mes "the art of cooking?";
- next;
- mes "[Uwe]";
- mes "I'm sorry, but I can't";
- mes "really give culinary";
- mes "lessons. But I will";
- mes "give good advice for";
- mes "hopeful beginners.";
- next;
- mes "[Uwe]";
- mes "Now...";
- mes "For your tuiton";
- mes "I'll need-- Gosh,";
- mes "there's just so many";
- mes "things. Get some paper,";
- mes "and a pen for this list...";
- next;
- mes "[Uwe]";
- mes "Just kidding!";
- mes "^111111*Titter~* ^000000I don't need";
- mes "much to make some";
- mes "cooking utensils. Bring";
- mes "6 ^0000FFLarge Jellopies^000000. That's it!";
- next;
- mes "[Uwe]";
- mes "In return, I will give you";
- mes "1 Coal and some useful";
- mes "cooking advice for novices.";
- mes "I give this advice for free to";
- mes "my smithing colleages, though.";
- next;
- mes "[Uwe]";
- mes "Why ^EFAEBDdon't^000000 you";
- mes "become a Blacksmith?";
- mes "I'm much more confident";
- mes "in that field. ^111111*Tee hee~*^000000";
- next;
- mes "[Uwe]";
- mes "Well, I'll be";
- mes "waiting right";
- mes "here until you";
- mes "come back.";
- mes "^111111...*Tee hee~*";
- set EinUwe,1;
- close;
-
-s_Cont:
- mes "[Uwe]";
- mes "Oh hello hello~";
- mes "It's been a long";
- mes "time since we've talked,";
- mes "you cutie adventurer~";
- next;
- mes "[Uwe]";
- mes "So, sugar honey,";
- mes "how is it going with";
- mes "the little favor I asked";
- mes "you about last time?";
- mes "Did you already forget";
- mes "the 6 Large Jellopies?";
- next;
- menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Give him the Materials.",s_Material,"Cancel.",-;
-
-s_Material:
- mes "[Uwe]";
- if(countitem(7126) < 6){
- mes "Huh...?";
- mes "You brought";
- if(countitem(7126))
- mes "only " + countitem(7126) + " of them?";
- else
- mes "none at all...?";
- mes "Next time, be sure";
- mes "to bring 6 Large Jellopies,";
- mes "okay? Don't forget, cutie~";
- close;
- }
- delitem 7126,6;
- getitem 1003,1;
- set EinUwe,2;
- mes "Thank you ^EFAEBDso^000000 much!";
- mes "Here's the Coal I promised~";
- next;
- mes "[Uwe]";
- mes "Now, I can't teach you everything";
- mes "about cooking, but I will give you";
- mes "some good advice for beginners.";
- mes "I hope you pay attnetion, sugar";
- mes "honey. Now what would you like";
- mes "to hear more about? Hmm...?";
- next;
-s_Menu3:
- menu "Heart",s_Heart,"Ingredients",s_Ingredients,"Skills",s_Skills,"Tools",s_Tools,"Cancel.",-;
-
- mes "[Uwe]";
- mes "Take care,";
- mes "sugar honey~";
- mes "Ho ho ho!";
- close;
-
-s_Heart:
- mes "[Uwe]";
- mes "Ah, heart. Just like forging,";
- mes "you need passion and desire";
- mes "to create something special.";
- mes "Every smith and cook knows that";
- mes "you can do anything if you have";
- mes "the will and the commitments.";
- next;
- mes "[Uwe]";
- mes "Well, that's all";
- mes "I really have to";
- mes "say about that. But";
- mes "come back and chat";
- mes "whenever you please.";
- mes "...Behbie~";
- close;
-
-s_Ingredients:
- mes "[Uwe]";
- mes "Now, for beginners,";
- mes "learning to select";
- mes "and use ingredients";
- mes "is one of the most";
- mes "important fundamentals.";
- next;
- mes "[Uwe]";
- mes "Cooking is like forging";
- mes "since specific ingredients";
- mes "are needed to make specialty";
- mes "items or dishes. You can't just";
- mes "skip them if you really need";
- mes "them, right? Right!";
- next;
- mes "[Uwe]";
- mes "Once you make up your";
- mes "mind to do something,";
- mes "focus on finishing it, 'kay?";
- mes "Never cut corners and always";
- mes "dedicate yourself to make the";
- mes "very best finished product~";
- next;
- mes "[Uwe]";
- mes "Well, that was";
- mes "a fun talk. Come";
- mes "back and visit, 'kay?";
- mes "I'll miss you until";
- mes "the next time~";
- mes "...Ho ho~";
- close;
-
-s_Skills:
- mes "[Uwe]";
- mes "When you're beginning to learn";
- mes "skills, you can't let yourself be";
- mes "discouraged! Practice makes";
- mes "perfect, you know? But never";
- mes "use your lack of skills as an";
- mes "excuse if you happen to fail...";
- next;
- mes "[Uwe]";
- mes "Effort is also an essential";
- mes "in forging and cooking! Now,";
- mes "on the oher hand, if you put";
- mes "in all the effort but didn't learn";
- mes "any of the skills, you'll still get";
- mes "nowhere fast, right? Right!";
- next;
- mes "[Uwe]";
- mes "The key is to always";
- mes "give 100% effort and work";
- mes "on improving your skills.";
- mes "Before you know it, you'll";
- mes "be a respected master!";
- next;
- mes "[Uwe]";
- mes "Well, that was";
- mes "a fun talk. Come";
- mes "back and visit, 'kay?";
- mes "I'll miss you until";
- mes "the next time~";
- mes "...Ho ho~";
- close;
-
-s_Tools:
- mes "[Uwe]";
- mes "Cooking is a little";
- mes "easier if you have";
- mes "nicer tools to use,";
- mes "but that's it. Tools by";
- mes "themselves can't make";
- mes "just anybody a master.";
- next;
- mes "[Uwe]";
- mes "In the end, the best";
- mes "tools are the ones you're";
- mes "most comfortable with using.";
- mes "In fact, I still use the old knife";
- mes "I used back when I was just";
- mes "a little novice chef~";
- next;
- mes "[Uwe]";
- mes "Well, that was";
- mes "a fun talk. Come";
- mes "back and visit, 'kay?";
- mes "I'll miss you until";
- mes "the next time~";
- mes "...Ho ho~";
- close;
-
-s_Cont2:
- mes "[Uwe]";
- mes "Ah, hello again,";
- mes "cutie adventurer.";
- mes "How can I help you?";
- next;
- menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Talk about Cooking.",s_Cooking,"Cancel.",-;
-
- mes "[Uwe]";
- mes "Take care,";
- mes "sugar honey~";
- mes "Ho ho ho!";
- close;
-
-s_Cooking:
- mes "[Uwe]";
- mes "Ooh, cooking!";
- mes "So what did you";
- mes "want to ask me...?";
- next;
- goto s_Menu3;
-
-OnHide:
- specialeffect 16;
- disablenpc "Uwe Kleine";
- end;
-
-OnUnhide:
- misceffect 215;
- end;
-
+//===== eAthena Script =======================================
+//= Quest NPCs related to Einbroch and Einbech
+//===== By: ==================================================
+//= Evera and The eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.5.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Shinokas Quest, Einbroch Lover Quest, Factory Quest,
+//= Uwe Quest.
+//===== Additional Comments: =================================
+//= 1.0 Initial Release [Evera]
+//= 1.1 Added more quests [Evera]
+//= 1.2 Added quest bits from Einbech and renamed file to
+//= quests_ein.txt [Evera]
+//= 1.3 Implemented the polution quest. [MasterOfMuppets]
+//= 1.4.1 Massive bugfix. Fixed Pollution exploit [Lupus]
+//= 1.4.2 Fixed Khowropher bug [Lupus]
+//= 1.5 Fixed double levelup bug [Lupus]
+//= 1.5.1 Fixed exploit [KarLaeda]
+//= 1.5.2 Updated Shino Quest to leave no grabage vars [Lupus]
+//============================================================
+
+
+//============================================================
+//=================================================== Shinokas
+//====================================================== Quest
+
+ein_in01.gat,231,163,1 script Sick Old Man 849,6,6,{
+ switch(Shinokas_Quest){
+ case 9:
+ mes "^3131FFShinokas's";
+ mes "body has grown";
+ mes "cold to the tough.";
+ close;
+ case 8:
+ mes "["+strcharinfo(0)+"]";
+ mes "Shinokas,";
+ mes "I found something!";
+ next;
+ mes "[Shinokas]";
+ mes "You...";
+ mes "Came... back...";
+ mes "Even... if... it's";
+ mes "already... Too late.";
+ mes "*Couhg Cough*";
+ next;
+ mes "^3131FFYou help Shinokas";
+ mes "sit up, but find that";
+ mes "your hands have been";
+ mes "stained with his blood.^000000";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Blood...?!";
+ mes "Shinokas!";
+ mes "Who did this to you?";
+ mes "W-we need to call for help!";
+ next;
+ mes "[Shinokas]";
+ mes "No...";
+ mes "It's already";
+ mes "too late for me.";
+ mes "I should have died";
+ mes "a long time ago...";
+ next;
+ mes "[Shinokas]";
+ mes "*Cough*";
+ mes "I only regret that";
+ mes "I've never been able";
+ mes "to apologize to my";
+ mes "friends... *Cough!*";
+ next;
+ mes "[Shinokas]";
+ mes "But did you";
+ mes "find out? D-did";
+ mes "you find out what's";
+ mes "so special about";
+ mes "that ore? W-what";
+ mes "is it... Really?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "It was...";
+ next;
+ input @text$;
+ mes "^0000FF"+@text$+"^000000!";
+ next;
+ mes "[Shinokas]";
+ mes "W-wait...!";
+ mes "What did...";
+ mes "I can't underst--";
+ mes "*Couhgh cough!*";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "No...!";
+ mes "Tell me who";
+ mes "did this to you!";
+ mes "Where are they?";
+ mes "Speak to me, please!";
+ next;
+ mes "[Shinokas]";
+ mes "W-wha...?";
+ mes "I told you.";
+ mes "Th-they we--";
+ next;
+ mes "[Shinokas]";
+ mes "...";
+ mes "......";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "No!";
+ mes "Shinokas!";
+ mes "Why, God?";
+ mes "Why...";
+ set Shinokas_Quest,9;
+ close;
+ case 7:
+ mes "[Shinokas]";
+ mes "...";
+ mes "......";
+ close;
+ case 6:
+ mes "[Shinokas]";
+ mes "So...?";
+ mes "Did you learn";
+ mes "anything new";
+ mes "in the Factory?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ if(EinFactory != 16){
+ mes "I haven't went there";
+ mes "yet.";
+ next;
+ mes "[Shinokas]";
+ mes "Then why did you come";
+ mes "back? Go and investigate";
+ mes "the factory now.";
+ close;
+ }
+ mes "Well...";
+ mes "There's a lot of";
+ mes "suspicious business";
+ mes "in the factory, but I don't";
+ mes "think any of it is related";
+ mes "to that ore you mentioned.";
+ next;
+ mes "[Shinokas]";
+ mes "Damn it...";
+ mes "Then where did";
+ mes "they hide it? Where";
+ mes "do you think that";
+ mes "ore might be?";
+ next;
+ while(1){
+ switch(select("Airport:Factory:Train Station:Airship Repairshop:Laboratory")){
+ case 1: //airport
+ mes "[Shinokas]";
+ mes "No...";
+ mes "The Airport is always";
+ mes "crowded with people.";
+ mes "It'd be a bad idea to hide";
+ mes "something so important";
+ mes "in that kind of place.";
+ next;
+ break;
+ case 2: //factory
+ mes "[Shinokas]";
+ mes "Didn't you just";
+ mes "check the factory?";
+ mes "You couldn't find";
+ mes "any clues to the";
+ mes "ore over there...";
+ next;
+ break;
+ case 3: //train
+ mes "[Shinokas]";
+ mes "Hmm...";
+ mes "People are always going";
+ mes "in and out of the Train Station.";
+ mes "It's not the best place to hide";
+ mes "something as important as the ore.";
+ next;
+ break;
+ case 4: //repairshop
+ mes "The Airship? Hm, it does";
+ mes "fly through some mysterious";
+ mes "power... But I already checked";
+ mes "the Airship Replairshop myself.";
+ mes "I haven't found any trace of";
+ mes "the ore over there.";
+ next;
+ break;
+ case 5: //Laboratory
+ mes "[Shinokas]";
+ mes "...!";
+ mes "Yes. Yes...!";
+ mes "That could be it!";
+ mes "Why didn't I think";
+ mes "about the Laboratory?";
+ mes "It makes so much sense!";
+ next;
+ mes "[Shinokas]";
+ mes "I have a good feeling";
+ mes "about this. Please sneak";
+ mes "into that Laboratory and";
+ mes "see if you can find the ore!";
+ next;
+ mes "[Shinokas]";
+ mes "Remember...";
+ mes "Not just anybody";
+ mes "can enter that kind";
+ mes "of place. But I'm sure";
+ mes "you'll figure something out.";
+ set Shinokas_Quest,7;
+ close;
+ }
+ }
+ case 5:
+ mes "[Shinokas]";
+ mes "So, did you find";
+ mes "anything from the";
+ mes "Kapellthaines?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Well, Mr. Kapelltheine";
+ mes "is kind of violent, but";
+ mes "I didn't find anything";
+ mes "really suspicious.";
+ next;
+ mes "[Shinokas]";
+ mes "Huh...";
+ mes "I must have";
+ mes "been wrong, then...";
+ mes "Where else could it be?";
+ next;
+ mes "[Shinokas]";
+ mes "Oh, right! The huge";
+ mes "factory in Einbroch!";
+ mes "What could be more";
+ mes "suspicious? There's a ton";
+ mes "of workers, but no one really";
+ mes "knows what they do there...";
+ next;
+ mes "[Shinokas]";
+ mes "If they're so secretive";
+ mes "it's possible that they're";
+ mes "keeping the ore over there.";
+ mes "Please go and search the";
+ mes "Factory for that ore as";
+ mes "soon as you can.";
+ set Shinokas_Quest,6;
+ close;
+ case 4:
+ mes "[Shinokas]";
+ mes "Please...";
+ mes "Find out if the Kapelltheines";
+ mes "are keeping some kind of unique";
+ mes "ore. Their manor is on the road";
+ mes "that leads to the Airport.";
+ close;
+ }
+ //Shinokas_Quest = 0 1 2 3 10
+ mes "[Sick Old Man]";
+ mes "...!";
+ next;
+ mes "[Sick Old Man]";
+ mes "Awwwk~";
+ mes "It's killing me!";
+ mes "Arrrgh! Awwwrgh!";
+ mes "W-when will my son";
+ mes "come back from";
+ mes "the factory...?!";
+ next;
+ if(Shinokas_Quest != 3){
+ mes "^3131FFYou feel really awkward";
+ mes "just staring at this old";
+ mes "man violently rolling";
+ mes "around in his bed.";
+ close;
+ }
+ //Shinokas_Quest = 3
+ mes "["+strcharinfo(0)+"]";
+ mes "Shi...";
+ mes "Shinokas?";
+ next;
+ mes "[Sick Old Man]";
+ mes "Huh...?";
+ mes "Noooo! My name is";
+ mes "Shinotarous. Y-you've";
+ mes "got the wrong person!";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "This has to be the";
+ mes "Shinokas that Hikeman";
+ mes "was talking about in Einbech";
+ mes "Hmmm, but how can I get";
+ mes "him to admit it?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "*Ahem!*";
+ mes "Excuse me...";
+ next;
+ while(1){
+ switch(select("Remember the mine tunnel collapse?:Didn't you used to be a miner?:Have you lived in Einbroch all your life?")){
+ case 1: //remember
+ if(@shinqst2 > 4 || @shinqst3 > 4) goto L_Cont;
+ mes "[Sick Old Man]";
+ mes "Noooo!";
+ mes "I don't know";
+ mes "what the hell";
+ mes "you're talking";
+ mes "about!";
+ next;
+ break;
+ case 2: //miner
+ if(@shinqst2 > 1)goto s_Quest2;
+ mes "[Sick Old Man]";
+ mes "Noooo...!";
+ mes "W-why would you";
+ mes "even ask me that";
+ mes "kind of question?!";
+ s_Quest2:
+ set @shinqst2,@shinqst2 + 1;
+ if(@shinqst3)set @shinqst3,0;
+ next;
+ break;
+
+ case 3: //einbroch
+ if(@shinqst3 > 1)goto s_Quest3;
+ mes "[Sick Old Man]";
+ mes "Y-yes!";
+ mes "Born and raised";
+ mes "raised here in";
+ mes "Einbe--Einbroch!";
+ next;
+ mes "^3131FFIt doesn't seem";
+ mes "like this old man";
+ mes "is telling the truth...";
+ s_Quest3:
+ set @shinqst3,@shinqst3 + 1;
+ if(@shinqst2)set @shinqst2,0;
+ next;
+ break;
+ }
+ }
+
+L_Cont:
+ mes "[Shinokas]";
+ mes "Hmm...";
+ mes "^0000FFBuender Hikeman^000000...";
+ next;
+ mes "[Shinokas]";
+ mes "No!";
+ mes "I've never met";
+ mes "Buender Hikeman";
+ mes "in my entire li--";
+ next;
+ mes "[Shinokas]";
+ mes "...";
+ mes "......";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "I was right!";
+ mes "You're Shinokas!";
+ next;
+ mes "[Shinokas]";
+ mes "Curses!";
+ mes "I've blown";
+ mes "my cover!";
+ mes "W-wait! How much";
+ mes "do you know?!";
+ next;
+ mes "[Shinokas]";
+ mes "Did ^0000FFthey^000000 send you?";
+ mes "*Sigh* I think that this";
+ mes "is it. I'll never be";
+ mes "able to solve the";
+ mes "secret before I die.";
+ next;
+ mes "[Shinokas]";
+ mes "Okay.";
+ mes "Get on with it.";
+ mes "I'm ready now...";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Tell me everything";
+ mes "you know related to";
+ mes "that incident where";
+ mes "the mine tunnel";
+ mes "collapsed around";
+ mes "you and Hikeman.";
+ next;
+ mes "[Shinokas]";
+ mes "...?";
+ mes "Errr....";
+ mes "You're not";
+ mes "here to kill me?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "No...!";
+ mes "I'm here to find";
+ mes "out the truth";
+ next;
+ mes "[Shinokas]";
+ mes "That means...";
+ mes "I still have some time.";
+ mes "This must be destiny!";
+ mes "Allright, I'll tell you what";
+ mes "happened. But it's a";
+ mes "long story...";
+ next;
+ mes "[Shinokas]";
+ mes "How much do you know";
+ mes "about the accident? No,";
+ mes "wait. Don't answer that.";
+ mes "I don't want to hear it";
+ next;
+ mes "[Shinokas]";
+ mes "I admit it. Yes.";
+ mes "I stabbed my friends";
+ mes "in the back. It was an";
+ mes "unforgivable sin that will";
+ mes "haunt me untill the day that I die";
+ next;
+ mes "[Shinokas]";
+ mes "I sold out my friends for";
+ mes "money. I destroyed that";
+ mes "tunnel and killed them. But";
+ mes "I suppose I was tricked as well.";
+ mes "^0000FFThey^000000 never intended to keep";
+ mes "their end of our agreement.";
+ next;
+ mes "[Shinokas]";
+ mes "After I destroyed the tunnel,";
+ mes "they targeted me and I ended";
+ mes "spending the rest of my life being";
+ mes "pursued and running for place to";
+ mes "place. What the hell was that ^0000FFore^000000";
+ mes "and why was it so important?";
+ next;
+ mes "[Shinokas]";
+ mes "I need to know more about";
+ mes "that ore if it's worth killing for.";
+ mes "That's why I've risked sneaking";
+ mes "into Einbroch. Sopposedly, an ore";
+ mes "similar to the ore we found has";
+ mes "been transported here recently";
+ next;
+ menu "Did you find it?",-;
+ mes "[Shinokas]";
+ mes "No, not yet.";
+ mes "I've been searching";
+ mes "for that ore every night.";
+ mes "During the day, this kind";
+ mes "blacksmith has managed";
+ mes "to hide me from those men";
+ next;
+ mes "[Shinokas]";
+ mes "But I won't be safe";
+ mes "for very long. Look, I'm";
+ mes "no saint, but before I die,";
+ mes "I wanna do this one last";
+ mes "thing and see what's so";
+ mes "great about this ore...";
+ next;
+ menu "Wait, who's trying to get you?",-;
+ mes "[Shinokas]";
+ mes "Who's trying to kill me?";
+ mes "The people who hired me and";
+ mes "my friends to dig up that ore in";
+ mes "the first place. We thought they";
+ mes "were ordinary businessmen,";
+ mes "but... They're dangerous.";
+ next;
+ mes "[Shinokas]";
+ mes "So I told you everything";
+ mes "and now you know that my";
+ mes "day might be numbered.";
+ mes "Please do an old man a favor";
+ mes "and search Einbroch for that";
+ mes "strange, mysterious ore.";
+ next;
+ mes "[Shinokas]";
+ mes "Now, the first thing I learned";
+ mes "in this tows is that the richest";
+ mes "family is the Kapelltheines. Only";
+ mes "the rich and powerful can possibly";
+ mes "be involved in something so big.";
+ next;
+ mes "[Shinokas]";
+ mes "Would you search";
+ mes "Kappelltheine Manor";
+ mes "for that ore? It's on the way";
+ mes "to the Airport and it shouldn't be";
+ mes "hard to miss. They're the richest";
+ mes "people in Einbroch, after all.";
+ next;
+ mes "[Shinokas]";
+ mes "I'm too old and weak to leave";
+ mes "this house, and there's the change";
+ mes "that those men will find me. If you";
+ mes "can sympathize with my situation,";
+ mes "please find out if the Kapelltheine";
+ mes "family has any unique ores...";
+ set Shinokas_Quest,4;
+ close;
+
+OnTouch:
+ if(Shinokas_Quest != 8) end;
+ mes "^3131FFThe open window rattles";
+ mes "as you enter the room and";
+ mes "are welcomed by a sudden";
+ mes "chill. A trail of red footprints";
+ mes "lies near your feet.";
+ next;
+ mes "^3131FFA grey sheet lies";
+ mes "rumpled on the bed,";
+ mes "but you can see dark red";
+ mes "stains in between the folds.";
+ close;
+}
+
+ein_in01.gat,32,133,6 script Maid 850,{
+ mes "[Maid]";
+ if(Shinokas_Quest != 4){
+ mes "There's no end";
+ mes "to all these plates";
+ mes "I have to clean...!";
+ close;
+ }
+ mes "Did you ask me";
+ mes "if I saw some kind";
+ mes "of ore around here?";
+ mes "That's strange...";
+ next;
+ mes "[Maid]";
+ mes "Will, I've been with";
+ mes "this family for a long";
+ mes "time. Let me assure you";
+ mes "that there's no secrets";
+ mes "from me in this household!";
+ next;
+ mes "[Maid]";
+ mes "I'm sorry, but I don't";
+ mes "think we have any ores,";
+ mes "special or otherwise, here";
+ mes "in the manor. What exactly";
+ mes "do you need them for?";
+ set Shinokas_Quest,5;
+ close;
+}
+
+einbroch.gat,51,52,1 script lab_warp 45,2,2{
+ if(Shinokas_Quest != 7){
+ mes "^3131FFThe door is locked.";
+ mes "You cannot enter.";
+ close;
+ }
+ mes "[Security System]";
+ mes "^FF0000*Beep Boop*^000000";
+ mes "Restricted Access Area.";
+ mes "Please identify yourself";
+ mes "through the system.";
+ next;
+ switch(select("Identify.:Information:Cancel")){
+ case 1: //Identify
+ break; //continue after switch =\
+ case 2: //information
+ mes "[Security System]";
+ mes "You must use the";
+ mes "security system in order";
+ mes "to gain access into the";
+ mes "Einbroch Laboratory.";
+ next;
+ mes "[Security System]";
+ mes "You will be given";
+ mes "a password that you";
+ mes "must input correctly";
+ mes "withing 60 seconds.";
+ mes "Otherwise, you will";
+ mes "fail the security check.";
+ //hell of a security system ye got there mate
+ //wonder if gravity co has the same sort? xD
+ next;
+ mes "[Security System]";
+ mes "If you take longer";
+ mes "then 3 minutes to";
+ mes "enter the password,";
+ mes "the security system";
+ mes "will initiate lockout.";
+ close;
+ case 3: //cancel
+ mes "[Security System]";
+ mes "You have canceled";
+ mes "the ID security check.";
+ close;
+ }
+ //ID check:
+ mes "[Security System]";
+ mes "Enter the following";
+ mes "password in 60 seconds.";
+ mes "Failure to do so will result";
+ mes "in lockout. Please wait.";
+ next;
+ mes "[Security System]";
+ set @startseconds,gettime(3)*60*60+gettime(2)*60+gettime(1);
+ switch(rand(1,11)){
+ case 1:
+ mes "^00CCFFburrdingdingdilidingdingphoohudaamb";
+ mes "^00CCFFandoora^0000FFbambarambambamburanbamding";
+ input @str$;
+ if(@str$ != "burrdindingdilidingdingphoohudaambandoorabambarambambamburanbamding") goto L_SCFail;
+ goto L_Suc;
+ case 2:
+ mes "^FF33CCbarapaphurarlandreamduranbatuhi^990066wooi";
+ mes "^990066kabamturubamdingding";
+ next;
+ input @str$;
+ if(@str$ != "barapaphurarlandreamduranbatuhiwooikabamturubamdingding") goto L_SCFail;
+ goto L_Suc;
+ case 3:
+ mes "^00CCFFbelief love luck grimace sweat rush";
+ mes "^00CCFFfolktale rodimus optimus burnblebe";
+ input @str$;
+ if(@str$ != "belief love luck grimace sweat rush folktale rodimus optimus burnblebe") goto L_SCFail;
+ goto L_Suc;
+ case 4:
+ mes "^FF33CCLiGhTsPeEd RiGhT SPEed leFT TURn";
+ mes "^FF33CCRiGhT BuRn OrIGInAL GaNgSteR SmACk";
+ input @str$;
+ if(@str$ != "LiGhTsPeEd RiGhT SPEed leFT TURn RiGhT BuRn OrIGInAL GaNgSteR SmACk") goto L_SCFail;
+ goto L_Suc;
+ case 5:
+ mes "^00CCFFCoboman no chikara-yumei na";
+ mes "^00CCFFchikara-daiookii na chikara da ze!";
+ mes "^00CCFFCOBO ON";
+ input @str$;
+ if(@str$ != "Coboman no chikara-yumei na chikara-daiookii na chikara da ze! COBO ON") goto L_SCFail;
+ goto L_Suc;
+ case 6:
+ mes "^FF33CChfjdkeldjs^990066hfjdjeiskdlefvbd";
+ input @str$;
+ if(@str$ != "hfjdkeldjshfjdjeiskdlefvbd") goto L_SCFail;
+ goto L_Suc;
+ case 7:
+ mes "^00CCFFI'm the King of all Weirdos! Now";
+ mes "^00CCFFyou know of my true power. Obey~!";
+ input @str$;
+ if(@str$ != "I'm the King of all Weirdos! Now you know of my true power. Obey~!") goto L_SCFail;
+ goto L_Suc;
+ case 8:
+ mes "^990066uNflAPPaBLe LoVaBLe SeCreTs AnD";
+ mes "^990066BoWLiNg aGaINST tHe KarMA of YoUtH";
+ input @str$;
+ if(@str$ != "uNflAPPaBLe LoVaBLe SeCreTs AnD BoWLiNg aGaINST tHe KarMA if YoUtH") goto L_SCFail;
+ goto L_Suc;
+ case 9:
+ mes "^00CCFFBy the power of^000000";
+ mes "^00CCFFp-po-poi-po-poi-poin-poing";
+ mes "^00CCFFGOD-POING. I NEVER LOSE!";
+ input @str$;
+ if(@str$ != "By the power of p-po-poi-po-poi-poin-poing GOD-POING. I NEVER LOSE!") goto L_SCFail;
+ goto L_Suc;
+ case 10:
+ mes "^00CCFF...silence. quiet benevolence...";
+ mes "^00CCFFsoul mate... wonder. enigma...";
+ mes "^00CCFFcloud.^000000";
+ input @str$;
+ if(@str$ != "...silence. quiet benevolence... soul mate... wonder. enigma... cloud") goto L_SCFail;
+ goto L_Suc;
+ case 11:
+ mes "^FF33CCopeN,Open!op3n.openOpen0p3nOpEn0pen";
+ mes "^FF33CC`open'0Pen open?open!111OPENSESAME";
+ input @str$;
+ if(@str$ != "opeN,Open!op3n.openOpenOp3nIoEnOpen`open'0Pen open?open!111OPENSESAME") goto L_SCFail;
+ goto L_Suc;
+ }
+L_Suc:
+ next;
+ set @endtime,gettime(3)*60*60+gettime(2)*60+gettime(1);
+ set @time,@endtime-@startseconds;
+ if(@time > 60) goto L_SC60;
+ mes "[Security System]";
+ mes "It took ^FF0000"+@time+" seconds^000000";
+ mes "for you to enter the";
+ mes "password. Initiating";
+ mes "override. Access granted.";
+ close2;
+ warp "ein_in01.gat",283,25;
+ end;
+
+L_SC60:
+ mes "[Security System]";
+ mes "Time over.";
+ mes "It took ^FF0000"+@time+" seconds^000000";
+ mes "for you to enter the";
+ mes "password. Initiating";
+ mes "lockout. Access denied.";
+ close;
+
+L_SCFail:
+ next;
+ mes "[Security System]";
+ mes "You have failed";
+ mes "the identification";
+ mes "check. Access denied.";
+ close;
+}
+einbroch.gat,51,56,6 script Laboratory Soldier#01 852,{
+ mes "[Laboratory Soldier]";
+ mes "This area is off limits.";
+ mes "Please leave";
+ mes "immediately";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Laboratory Soldier#01";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+einbroch.gat,51,47,6 script Laboratory Soldier#02 852,{
+ mes "[Laboratory Soldier]";
+ mes "This area is off limits.";
+ mes "Please leave";
+ mes "immediately";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Laboratory Soldier#02";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+ein_in01.gat,254,35,1 script Scientist 749,{
+ mes "[Scientist]";
+ mes "*Grumble grumble*";
+ next;
+ if(ein_scientist == 1) goto L_P2;
+ mes "[Scientist]";
+ mes "Huh...?";
+ mes "How did you";
+ mes "get in here?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Oh! Ah...";
+ mes "I'm the new...";
+ mes "Guard. Nice";
+ mes "to meet you.";
+ next;
+ mes "[Scientist]";
+ mes "Oh. Yeah.";
+ mes "Nice-meet-you";
+ mes "..............";
+ mes "*Grumble grumble*";
+ next;
+ if(select("What's wrong?:Catch you later.")==2){
+ mes "[Scientist]";
+ mes "Right.";
+ mes "Yeah.";
+ mes "Later, man.";
+ close;
+ }
+ mes "[Scientist]";
+ mes "What's wrong...?!";
+ mes "Oh, don't get me started!";
+ mes "I'm stuck here doing all the";
+ mes "work while the Lab Departement";
+ mes "Head goes out every freakin' day!";
+ next;
+ mes "[Scientist]";
+ mes "While I'm slaving";
+ mes "away here, he's in";
+ mes "that Airship, busy";
+ mes "flirting with that";
+ mes "woman. God...!";
+ mes "I'm like, so teed off!";
+ if(Shinokas_Quest < 8) set ein_scientist,1;
+ close;
+
+L_P2:
+ mes "[Scientist]";
+ mes "Man alive!";
+ mes "Would it kill the";
+ mes "Department Head";
+ mes "to come in here and do";
+ mes "some work for a change?!";
+ next;
+ mes "[Scientist]";
+ mes "I mean, come on!";
+ mes "I shouldn't have to";
+ mes "carry his workload!";
+ close;
+}
+
+ein_in01.gat,266,26,1 script Unknown Stuff 111,{
+ mes "^3131FFThere's something";
+ mes "attached to a huge";
+ mes "machine with many cords";
+ mes "and folds of barbed wire";
+ if(Shinokas_Quest < 8) set ein_stuff,1;
+ close;
+}
+
+airplane.gat,31,77,4 script Drunken Man#03 853,{
+ if(Shinokas_Quest >= 8){
+ mes "[Drunken Man]";
+ mes "Hahahahaha!";
+ mes "You're great!";
+ mes "I feel great!";
+ mes "Everything's great!";
+ mes "Bwahahahaahahah!";
+ mes "*Hiccup*";
+ close;
+ }
+ mes "[Drunken Man]";
+ mes "Okay okay...";
+ mes "Daddy's gonna";
+ mes "win some Apples";
+ mes "this time for sure!";
+ next;
+ if(ein_stuff && ein_scientist){
+ mes "[Drunken Man]";
+ mes "Let's do it!";
+ mes "^3131FFYmir's Heart^000000 is";
+ mes "on my side! GO!";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Huh...?";
+ mes "What did he just say?";
+ mes "It seemed important!";
+ next;
+ }
+ mes "^0000FF*Rolling and rumbling*^000000";
+ next;
+ mes "[Kaci]";
+ mes "I have a total of ^FF000011^000000";
+ mes "and you have total ^FF00005^000000.";
+ mes "You lose this game. I'm";
+ mes "sorry, but I hope we play";
+ mes "again sometime.";
+ donpcevent "Kaci::OnLose";
+ next;
+ mes "[Drunken Man]";
+ mes "Waaaaaahhhhhhhhh!";
+ mes "Apples! My apples!";
+ mes "Apples, I need more...!";
+ if(countitem(512) && ein_stuff && ein_scientist) goto L_Apples;
+ close;
+
+L_Apples:
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Do you want";
+ mes "some of mine?";
+ next;
+ if(countitem(512) <100){
+ mes "[Drunken Man]";
+ mes "What...?";
+ mes "I can't do anything";
+ mes "with so few Apples!";
+ mes "I'm a high roller and";
+ mes "this is a high stakes game!";
+ close;
+ }
+ mes "[Drunken Man]";
+ mes "Wha--? Yes...";
+ mes "Hell yes! Gimme";
+ mes "some of your Apples!";
+ mes "Yeeeeeeeeeeehaw!";
+ mes "I'm back, baby!";
+ next;
+ mes "[Drunken Man]";
+ mes "Now, to win!";
+ mes "Daddy needs love...";
+ mes "Time to go from";
+ mes "crappy to classy!";
+ next;
+ mes "^0000FF*Rolling and rumbling*^000000";
+ next;
+ delitem 512,countitem(512);
+ set @kaci,rand(2,12);
+ set @man,rand(2,12);
+ if(@man == @kaci){
+ if(rand(2)){
+ if(@man != 12)
+ set @man,@man+1;
+ else
+ set @man,@man-1;
+ }else{
+ if(@man != 2)
+ set @man,@man-1;
+ else
+ set @man,@man+1;
+ }
+ }
+ mes "[Kaci]";
+ mes "Oooh...";
+ mes "I got a total of ^FF0000"+@kaci+"^000000,";
+ mes "and you have a total of ^FF0000"+@man+"^000000.";
+ if(@man < @kaci){
+ mes "I'm sorry, but you lose";
+ mes "again. Better luck next time...";
+ donpcevent "Kaci::OnLose";
+ next;
+ mes "[Drunken Man]";
+ mes "Waaaaaahhhhhhhhhhhh!";
+ mes "Waaaaaaaahhhhhhh!";
+ close;
+ }
+ mes "Congratulations, you won!";
+ mes "Let me give you your winning";
+ mes "and we'll play again some time~";
+ donpcevent "Kaci::OnWin";
+ next;
+ mes "[Drunken Man]";
+ mes "Mwahhhahahahaha!";
+ mes "Whahahahahahahahaha!";
+ mes "That's why they call me";
+ mes "the 'Resurrection Kid!'";
+ mes "I always come back!";
+ next;
+ mes "[Drunken Man]";
+ mes "Oh yes, right!";
+ mes "You...! You lent";
+ mes "me those lucky";
+ mes "Apples. ^111111*Hiccup*^000000";
+ next;
+ mes "[Drunken Man]";
+ mes "I'm Kurschenburg!";
+ mes "Thanks to you, I'm";
+ mes "on a winning streak!";
+ mes "Hahaha! Th-thank you~";
+ mes "^111111*Hic-hic-hiccup!*^000000";
+ next;
+ if(select("So what was that about Ymir's Heart?:Hehe, you're welcome.")==2){
+ mes "[Drunken Man]";
+ mes "Hahahaha!";
+ mes "You're great!";
+ mes "And I feel great!";
+ mes "Bwahahahaahahah!";
+ mes "^111111*Hiccup*^000000";
+ close;
+ }
+ mes "[Drunken Man]";
+ mes "What...?";
+ mes "Ymir's Heart?";
+ mes "How do you know";
+ mes "about that? ^111111*Hiccup*^000000";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Y-you...!";
+ mes "You were just yelling,";
+ mes "'Ymir's Heart is on my";
+ mes "side,' while you were";
+ mes "gambling with those Apples!";
+ next;
+ mes "[Drunken Man]";
+ mes "What...?!";
+ mes "No way~";
+ mes "Err...? Did I...?";
+ next;
+ mes "[Drunken Man]";
+ mes "Heh heh...";
+ mes "I'm not really";
+ mes "supposed to be talking";
+ mes "about this. As head of";
+ mes "the Laboratory, I'm sworn";
+ mes "to secrecy about Ymir's Heart.";
+ next;
+ mes "[Drunken Man]";
+ mes "But what do I care?!";
+ mes "All they want are the";
+ mes "results of my research!";
+ mes "They don't appreciate";
+ mes "my work at all! My title";
+ mes "is completely worthless!";
+ next;
+ mes "[Drunken Man]";
+ mes "You don't know how long I've";
+ mes "been imprisoned in the lab and";
+ mes "that the work conditions just get";
+ mes "worse and worse. Screw them! I'll";
+ mes "keep getting paid as long as I show";
+ mes "them some progress in our project!";
+ next;
+ menu "Project?",-;
+ mes "[Drunken Man]";
+ mes "Yeah, we're researching";
+ mes "Ymir's Heart. It was found";
+ mes "a long time ago in ^3131FFEinbech^000000";
+ mes "and it's in our lab now.";
+ next;
+ mes "[Drunken Man]";
+ mes "Everyone knows it's supposed";
+ mes "to hold some legendary power,";
+ mes "but even I was surprised to see";
+ mes "what it was capable of. It's both";
+ mes "terrible and miraculous, scary";
+ mes "and wondrous...";
+ next;
+ mes "[Drunken Man]";
+ mes "So...";
+ mes "I figure...";
+ mes "It may even";
+ mes "have the power to";
+ mes "win me Dice games!";
+ mes "Bwahaha--*Hiccup!*";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "(That thing I saw";
+ mes "hooked up to all those";
+ mes "wires in the Laboratory";
+ mes "must have been a piece";
+ mes "of ^3131FFYmir's Heart^000000. I better";
+ mes "tell Shinokas about this.)";
+ set Shinokas_Quest,8;
+ //cleaning temp variables from the lab.
+ set ein_stuff,0;
+ set ein_scientist,0;
+ close;
+}
+
+einbech.gat,57,210,4 script Young Man#04 854,{
+ mes "[Young Man]";
+ mes "Behind the pub,";
+ mes "you'll see this old man";
+ mes "who's always mumbling";
+ mes "something to himself.";
+ next;
+ mes "[Young Man]";
+ mes "Sometimes he seems really";
+ mes "angry, but other times he looks";
+ mes "awfully depressed. He must have";
+ mes "lived through some really horrible";
+ mes "experiences. I can't help but feel";
+ mes "really sorry for the old guy.";
+ next;
+ mes "[Young Man]";
+ mes "He says and does";
+ mes "a lot of strange things.";
+ mes "It's sad to see someone";
+ mes "that old act that way, but";
+ mes "it makes me wonder what";
+ mes "could have happened to him.";
+ if(!Shinokas_Quest)set Shinokas_Quest,1;
+ close;
+}
+
+einbech.gat,165,105,7 script Buender Hikeman 847,{
+ if(Shinokas_Quest >= 9) goto L_P2;
+ if(Shinokas_Quest == 3) goto L_BEST;
+ if(Shinokas_Quest == 2) goto L_BASTARD;
+ mes "[Buender Hikeman]";
+ mes "...";
+ mes "......";
+ if(!Shinokas_Quest)close;
+ next;
+ mes "[Buender Hikeman]";
+ mes "...";
+ mes "......";
+ mes "......You...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "...";
+ mes "......";
+ mes "......You...";
+ mes "......Stop it...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "...";
+ mes "......";
+ mes "......You...";
+ mes "......Stop it...";
+ mes "...You ^FF0000bastard^000000!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "RaaaaAAAARGHHH!!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "^0000FFThe old man seems^000000";
+ mes "^0000FFslightly irked at seeing^000000";
+ mes "^0000FFyou. Unfortunately, his^000000";
+ mes "^0000FFscreaming and rambling^000000";
+ mes "^0000FFis totally incoherent.^000000";
+ next;
+ mes "[Buender Hikeman]";
+ mes "It ^FF0000is^000000 you!";
+ mes "You're responsible!";
+ mes "You've taken everything";
+ mes "away from me!!";
+ next;
+ menu "What are you talking about?",L_WHAT,"Ignore Him.",-;
+ mes "[Buender Hikeman]";
+ mes "W...wait!";
+ mes "I said wait!";
+ mes "*Cough!*";
+ close;
+L_WHAT:
+ mes "[Buender Hikeman]";
+ mes "How dare you...";
+ mes "How dare you treat";
+ mes "after destroying all the";
+ mes "happiness in my life!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Damn you...";
+ mes "How can you have";
+ mes "the audacity to pretend";
+ mes "as if nothing happened?!";
+ mes "*C-cough Cough...*";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Are you so evil to";
+ mes "just shallowly forget";
+ mes "what you've done to our";
+ mes "lives? Did you already";
+ mes "forget what you did";
+ mes "here in Einbech?!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "It was such a long";
+ mes "time ago, but I'll never";
+ mes "forget. This town was";
+ mes "small, but full of folk";
+ mes "with warm hearts...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Me, Khartophe, Anuto,";
+ mes "Maskharundt... All of";
+ mes "us were friends hired";
+ mes "by that businessman";
+ mes "to dig up ores in the mine.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "And then there";
+ mes "was you! All of us";
+ mes "put together made the";
+ mes "greatest mining team!";
+ mes "That was, until, we";
+ mes "discovered ^FF0000it^000000.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Yes...";
+ mes "The mysterious ore";
+ mes "that dazzled with a";
+ mes "magnificent light.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "But we should have known";
+ mes "that the ^0000FFUngoliant^000000 would";
+ mes "be arround that ore. We";
+ mes "should have realized";
+ mes "the danger...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "We reported our findings";
+ mes "to our employer, and then";
+ mes "the ore just disappeared. He";
+ mes "must have sent it somewhere,";
+ mes "it was none of our business.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Then life was back";
+ mes "to normal for a while.";
+ mes "But one day you yelled";
+ mes "to us that you had found";
+ mes "another special, mysterious";
+ mes "ore in the mines.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "But when we came";
+ mes "over to check the hole";
+ mes "you dug up, you know";
+ mes "what we found...?!";
+ next;
+ menu "Ungoliant?",L_UNGOLIANT,"A mysterious ore, right?",L_ORE,"Nothing...?",-;
+ mes "[Buender Hikeman]";
+ mes "Yes...";
+ mes "Nothing.";
+ next;
+ goto L_CONTINUE;
+L_UNGOLIANT:
+ mes "[Buender Hikeman]";
+ mes "Don't you remember";
+ mes "what happened? What";
+ mes "you did to us at that time?!";
+ next;
+L_CONTINUE:
+ mes "[Buender Hikeman]";
+ mes "There was nothing";
+ mes "inside the hole!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Then you pointed to";
+ mes "the wall behind us and";
+ mes "screamed that Ungoliant";
+ mes "was coming! In our panic";
+ mes "we started to dig our way out!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "I remember that the expression on";
+ mes "your face seemed so strange. I had";
+ mes "thought you looked sad, but now I'm";
+ mes "sure you were consumed by greed! We";
+ mes "trusted you and you betrayed us!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "When we finally smashed";
+ mes "down that last wall, everything";
+ mes "started to fall around us. We";
+ mes "were the only two to survive";
+ mes "that tunnel collapse.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Then I learned...";
+ mes "You planned it all along.";
+ if(Shinokas_Quest == 1) set Shinokas_Quest,2;
+ close;
+L_ORE:
+ mes "[Buender Hikeman]";
+ mes "Don't you remember";
+ mes "what happened? What";
+ mes "you did to us at that time?!";
+ next;
+ goto L_CONTINUE;
+L_BASTARD:
+ mes "[Buender Hikeman]";
+ mes "Bastard!";
+ mes "I'm sick of";
+ mes "your lies!";
+ next;
+ menu "I'm not who you think!",L_IM,"How did you survive the accident?",-;
+L_HOW:
+ mes "[Buender Hikeman]";
+ mes "When I came to,";
+ mes "I was lying on my";
+ mes "stomach in the ruins";
+ mes "of that dark tunnel.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "And I found...";
+ mes "You know what I found.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "*Cough Cough*";
+ mes "The corpses of my friends!";
+ mes "Kartophe, Anuto, Maskharundt";
+ mes "Great men and my best friends.";
+ mes "But where were you?!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Your body was nowhere";
+ mes "to be found. I searched";
+ mes "the tunnel and finnaly";
+ mes "climbed outside where";
+ mes "I was found unconscious.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "I was so stupid.";
+ mes "It was because of";
+ mes "that ore! You killed our";
+ mes "friend and destroyed";
+ mes "my life for that thing!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "And now...";
+ mes "You come out of";
+ mes "hiding and show up.";
+ mes "What do you want of";
+ mes "me? What more can";
+ mes "you possibly take away?!";
+ next;
+ menu "I'm not who you think I am!",L_THINK,"I'd like to apologize.",-;
+ mes "[Buender Hikeman]";
+ mes "Ha ha...";
+ mes "Apologize?";
+ mes "The harm is";
+ mes "already done...";
+ goto L_CONTINUE2;
+L_THINK:
+ mes "[Buender Hikeman]";
+ mes "Quit lying!";
+ mes "You've stirred up";
+ mes "my hatred by showing";
+ mes "up again! I've never";
+ mes "forgotten that day!";
+ next;
+L_CONTINUE2:
+ mes "[Buender Hikeman]";
+ mes "It's too late";
+ mes "for you now. For";
+ mes "the sake of my friends,";
+ mes "I'll have my vengeance!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Prepare to die!";
+ mes "^0000FFShinokas^000000!!!!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "...!";
+ mes "*Cough! Cough!*";
+ mes "Noooo! N-not now...";
+ mes "*Cough! Cough!*";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...";
+ mes "I better";
+ mes "get away";
+ mes "from him!";
+ next;
+ mes "^0000FFYou ran away from Hikeman^000000";
+ mes "^0000FFas he collapsed on the ground^000000";
+ mes "^0000FFIt wouldn't be a good idea to^000000";
+ mes "^0000FFprovoke the old man anymore,^000000";
+ mes "^0000FFintentionally or not.^000000";
+ if(Shinokas_Quest == 2) set Shinokas_Quest,3;
+ close;
+L_BEST:
+ mes "^0000FFIt'd be best^000000";
+ mes "^0000FFto avoid aggravating^000000";
+ mes "^0000FFthe old man for now.^000000";
+ close;
+L_IM:
+ mes "[Buender Hikeman]";
+ mes "Ha...!";
+ mes "Do you think";
+ mes "I'd so easily";
+ mes "forget the face";
+ mes "of the person who";
+ mes "shattered my life?!";
+ goto L_HOW;
+
+L_P2:
+ mes "^0000FFHikeman is dozing^000000";
+ mes "^0000FFoff in his chair. Judging^000000";
+ mes "^0000FFfrom the look of discomfort^000000";
+ mes "^0000FFon his face, he seems to be^000000";
+ mes "^0000FFhaving a nightmare.^000000";
+ if(Shinokas_Quest == 10) close;
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Excuse me...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Huh...?";
+ mes ".........!!";
+ mes "Hahahahaha!";
+ mes "Come back for";
+ mes "your beating,";
+ mes "eh, Shinokas?!";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Look...!";
+ mes "I'm not Shinokas,";
+ mes "okay? How can you";
+ mes "forget what he looks";
+ mes "like or how old he is?";
+ mes "I'm way younger!";
+ next;
+ mes "[Buender Hikeman]";
+ mes "What...?";
+ next;
+ mes "[Buender Hikeman]";
+ mes "..................";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Uhhhh......";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Huh.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "It seems...";
+ mes "I've made a";
+ mes "huge mistake.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Ever since the accident, people";
+ mes "have said that I haven't been the";
+ mes "same. Maybe they're right.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "I keep making the same";
+ mes "mistakes, so maybe they're";
+ mes "right about me getting senile.";
+ mes "Did you come just to clear";
+ mes "up this misunderstanding?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Um...";
+ mes "Actually...";
+ next;
+ menu "Tell Hikeman about Shinakas's death.",-,"Don't notify Hikeman",L_NNotify;
+
+ set Shinokas_Quest,10;
+ mes "["+strcharinfo(0)+"]";
+ mes "Shinokas died";
+ mes "a while ago in";
+ mes "Einbroch.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Wh-what...?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Shinokas was killed by";
+ mes "some men. He thinks they";
+ mes "may have been the ones";
+ mes "who hired you guys. In the";
+ mes "end, he was betrayed too...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "I...";
+ mes "I see...";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Shinokas may have";
+ mes "gotten some money,";
+ mes "but he spent the rest";
+ mes "of his life in hiding,";
+ mes "being hunted down.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Nothing's left.";
+ mes "I've got nothing";
+ mes "to look forward to.";
+ mes "I was living only to";
+ mes "avenge my friends...";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Please...";
+ mes "Just go back to";
+ mes "wherever you came";
+ mes "from. Leave me alone...";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "...";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Did Hikeman really want";
+ mes "revenge on Shinokas or did";
+ mes "he want to hear him out since";
+ mes "they used to be close friends?";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "If I mention that";
+ mes "what they found was";
+ mes "the Ymir Heart Piece,";
+ mes "Hikeman might end up";
+ mes "getting hunter down, so";
+ mes "I better not say anything.";
+ next;
+ mes "["+strcharinfo(0)+"]";
+ mes "Why are those men";
+ mes "so obsessed with that";
+ mes "Ymir Heart Piece? Is it";
+ mes "really worth this kind of";
+ mes "cruelty? Whoever they are,";
+ mes "their intentions can't be good.";
+ if(BaseLevel < 41)set BaseExp,BaseExp+34750;
+ else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+69500;
+ else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+139000;
+ else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+278000;
+ else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+417000;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+556000;
+ close;
+
+L_NNotify:
+ mes "["+strcharinfo(0)+"]";
+ mes "Yeah...";
+ mes "That's right.";
+ mes "I wanted to clear up";
+ mes "this misunderstanding";
+ mes "so you could calm down,";
+ mes "even if it's just a little bit.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Well, you don't have";
+ mes "to worry so much about";
+ mes ",u stress. I find that the";
+ mes "winds that pass through";
+ mes "this town to be very relaxing.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Each time the wind";
+ mes "blows by, my vision blurs,";
+ mes "my memories haze and all";
+ mes "of my hatred just drifts away.";
+ next;
+ mes "[Buender Hikeman]";
+ mes "Without the wind, I'd only";
+ mes "have my hatred towards ^FF0000him^000000.";
+ mes "Maybe it's my only reason for";
+ mes "living and maybe I'm lonely,";
+ mes "but it's too late to feel";
+ mes "sorry for myself now.";
+ close;
+}
+
+
+//============================================================
+//============================================= Einbroch Lover
+//====================================================== Quest
+ein_in01.gat,31,151,4 script Satra 850,{
+ if(EIN_LOVERQ > 11)goto s_Intimi;
+ if(EIN_LOVERQ == 11)goto s_Coal4;
+ if(EIN_LOVERQ == 10)goto s_Coal3;
+ if(EIN_LOVERQ == 9)goto s_Coal2;
+ if(EIN_LOVERQ == 8)goto s_Coal1;
+ if(EIN_LOVERQ == 7)goto s_Advent;
+ mes "[Satra]";
+ mes "A wandering";
+ mes "adventurer...?";
+ mes "How sinfully";
+ mes "intriguing!";
+ mes "Ho ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "Oh, do not worry";
+ mes "I'm sure the beauty of";
+ mes "my home has captured your";
+ mes "curiosity. My brutish excuse";
+ mes "for a husband would have you";
+ mes "beat if he found you...";
+ next;
+ mes "[Satra]";
+ mes "But I'm far more genteel";
+ mes "then Megass. You're more";
+ mes "than welcome to enjoy the";
+ mes "furnishings. Ho ho ho ho~";
+ close;
+
+s_Advent:
+ mes "[Satra]";
+ mes "A wandering adventurer...?";
+ mes "How ravishingly delightful!";
+ mes "You must have risked life and";
+ mes "limb to sneak past my husband";
+ mes "to enjoy the captivating sights";
+ mes "of my home. Ho ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "Since you're a very";
+ mes "unique quest, I shall";
+ mes "give you a unique honor";
+ mes "and deign to converse";
+ mes "with you, adventurer.";
+ next;
+ mes "[Satra]";
+ mes "Einbech exists to provide";
+ mes "my family with coal and";
+ mes "materials from their mines.";
+ mes "It's a natural law: workers";
+ mes "must be led by a chosen few.";
+ next;
+ mes "[Satra]";
+ mes "It's delightfully";
+ mes "ludicrous to see those";
+ mes "workers aspire to reach";
+ mes "our heights of social";
+ mes "prestige. Ho ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "Oh, I haven't spoken to";
+ mes "someone from a lower";
+ mes "class in ages! It feels";
+ mes "so forbiddenly exciting!";
+ next;
+ mes "[Satra]";
+ mes "Well adventurer, that's";
+ mes "the end of our informal";
+ mes "chat. I'll even grant you";
+ mes "full permission to boast";
+ mes "of the fact that you've";
+ mes "spoken to Lady Satra.";
+ next;
+ mes "[Satra]";
+ mes "If you wish for";
+ mes "me to share words with";
+ mes "you once more, prove to";
+ mes "me that you're worthier";
+ mes "than the other peons of";
+ mes "my graceful presence.";
+ next;
+s_Coal1:
+ mes "[Satra]";
+ mes "Oh, I have a marvelous";
+ mes "idea! Why don't you bring";
+ mes "me ^9C0000Coals^000000? It's not impossible";
+ mes "for someone like yourself, but";
+ mes "this kind of task will require";
+ mes "some effort on your part.";
+ next;
+ if(EIN_LOVERQ == 8 && countitem(1003) > 9)goto s_GotCoal1;
+ mes "[Satra]";
+ mes "Tah tah,";
+ mes "adventurer~";
+ if(EIN_LOVERQ == 7)set EIN_LOVERQ,8;
+ close;
+
+s_GotCoal1:
+ mes "[Satra]";
+ mes "My, you've already";
+ mes "brought the Coal?";
+ mes "How charmingly";
+ mes "prompt you are~";
+ next;
+ mes "[Satra]";
+ mes "On behalf of the";
+ mes "Kappellthaine family,";
+ mes "I shall ignore your lowly";
+ mes "status and graciously";
+ mes "accept your small gift.";
+ mes "Ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "Do you hail from";
+ mes "Einbech, adventurer?";
+ mes "Ah, the Rune-Midgarts";
+ mes "kingdom! I've visited your";
+ mes "country. It's quite quaint";
+ mes "and Jawaii is very lovely.";
+ next;
+ mes "[Satra]";
+ mes "Well, I shall try to";
+ mes "find some use for these.";
+ mes "I'm afraid the gift I've asked";
+ mes "from you isn't very practical.";
+ mes "How is coal usually used?";
+ mes "Ah, I have a novel idea!";
+ next;
+ mes "[Satra]";
+ mes "Wouldn't it be";
+ mes "intoxicatingly wild if";
+ mes "Megass were to hold one";
+ mes "of those social functions that";
+ mes "the lower classes are so fond";
+ mes "of? A 'barbeque', yes?";
+ next;
+ mes "[Satra]";
+ mes "In any case, If you";
+ mes "bring me more of that";
+ mes "Coal, you would be even";
+ mes "more favored by me and";
+ mes "you'll become a recipient";
+ mes "of my good graces. Ho ho~";
+ set EIN_LOVERQ,9;
+ delitem 1003,10;
+ close;
+
+s_Coal2:
+ mes "[Satra]";
+ mes "^111111*Titter~*^000000";
+ mes "Why, if it isn't my";
+ mes "intrepid adventurer.";
+ mes "Ho ho ho ho~";
+ next;
+ if(countitem(1003) > 9)goto s_GotCoal2;
+ mes "[Satra]";
+ mes "My apologies, but you";
+ mes "must first prove to me";
+ mes "that you are worthy of";
+ mes "conversation. Why don't";
+ mes "you deliver more of those";
+ mes "^9C0000Coals^000000, mmm?";
+ next;
+ mes "[Satra]";
+ mes "After all, I have no other";
+ mes "means of knowing whether";
+ mes "or not you appreciate the time";
+ mes "I sacrifice by socializing with";
+ mes "someone of your status.";
+ mes "Ho ho ho ho~";
+ close;
+
+s_GotCoal2:
+ mes "[Satra]";
+ mes "My word!";
+ mes "Why are you carrying";
+ mes "all of that dirty Coal";
+ mes "with you? You poor,";
+ mes "impoverished thing.";
+ next;
+ mes "[Satra]";
+ mes "Oh! Dear me,";
+ mes "I've nearly forgotten~";
+ mes "How divinely silly of me!";
+ mes "Once again, I graciously";
+ mes "accept your small gift on";
+ mes "behalf of the Kappelthaines.";
+ next;
+ mes "[Satra]";
+ mes "Let me share a little";
+ mes "bit of history concerning";
+ mes "our lovely Einbroch. At one";
+ mes "time, there was only Einbech,";
+ mes "the mining village. You can";
+ mes "imagine how long ago that was.";
+ next;
+ mes "[Satra]";
+ mes "However, the minerals";
+ mes "and ores mined in Einbech";
+ mes "need to be processed and";
+ mes "refined in factories that were";
+ mes "all built in a nearby industrial";
+ mes "comple which became Einbroch.";
+ next;
+ mes "[Satra]";
+ mes "Now every citizen in";
+ mes "Einbroch is wealthy and";
+ mes "it's well known that there";
+ mes "is a higher standard of";
+ mes "living here than in Einbech.";
+ next;
+ mes "[Satra]";
+ mes "Goodness, I believe";
+ mes "it's time for a spot of tea~";
+ mes "The next time you wish to have";
+ mes "an audience with me, it would";
+ mes "behoove you to bring another";
+ mes "gift of Coal. Toodles~";
+ set EIN_LOVERQ,10;
+ delitem 1003,10;
+ close;
+
+s_Coal3:
+ mes "[Satra]";
+ mes "Why hello~";
+ mes "Your visits have";
+ mes "recently been quite";
+ mes "delightful, fair adventurer.";
+ next;
+ mes "[Satra]";
+ mes "Oh, my apologies!";
+ mes "I supposed you're just";
+ mes "here for sight seeing,";
+ mes "or perhaps you're running";
+ mes "some sort of adventurer's";
+ mes "errand. Am I right?";
+ next;
+ if(countitem(1003) > 9)goto s_GotCoal3;
+ mes "[Satra]";
+ mes "I know you well enough";
+ mes "to know that you wouldn't";
+ mes "be so rude as to stop by";
+ mes "and chat without bringing";
+ mes "any ^9C0000Coal^000000. Ho ho ho ho~";
+ close;
+
+s_GotCoal3:
+ mes "[Satra]";
+ mes "Continue to show";
+ mes "your appreciation";
+ mes "and dedication to me";
+ mes "and you'll soon be known";
+ mes "to be my most favored";
+ mes "commoner. Ho ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "I'm sure you've noticed";
+ mes "the strained relationship";
+ mes "between Einbroch and Einbech";
+ mes "by now. It's a shame, really.";
+ next;
+ mes "[Satra]";
+ mes "As Einbroch grew wealthier";
+ mes "and Einbech became more";
+ mes "destitude, the affluent began";
+ mes "despising the impoverished.";
+ mes "I supposed it follows that the";
+ mes "poor started to resent the rich.";
+ next;
+ mes "[Satra]";
+ mes "It might be said that";
+ mes "both towns have been";
+ mes "trying to take advantage";
+ mes "of each other, but it's";
+ mes "clear that Einbroch has";
+ mes "always had the upper hand.";
+ next;
+ mes "[Satra]";
+ mes "In fact, because of";
+ mes "this rift between our";
+ mes "cities, our families are";
+ mes "taught not to associate";
+ mes "with the people of Einbech.";
+ next;
+ mes "[Satra]";
+ mes "Now, I believe that most";
+ mes "people who live in Einbech";
+ mes "are peons, but that does not";
+ mes "mean I will not give them a";
+ mes "chance to prove their worth.";
+ next;
+ mes "[Satra]";
+ mes "Why should I deprive";
+ mes "the lowly of my gracious";
+ mes "presence if they prove";
+ mes "themselves meritable?";
+ mes "Ho ho ho ho~";
+ next;
+ mes "[Satra]";
+ mes "Oh, that was scrumptious!";
+ mes "If you wish to pay me another";
+ mes "visit, don't forget to bring some";
+ mes "Coal with you. Tah tah~";
+ set EIN_LOVERQ,11;
+ delitem 1003,10;
+ close;
+
+s_Coal4:
+ mes "[Satra]";
+ mes "Ho ho ho ho~";
+ mes "Welcome adventurer,";
+ mes "I so enjoy our little chats.";
+ mes "Hors d'oeuvre?";
+ next;
+ if(countitem(1003) > 9)goto s_GotCoal4;
+ mes "[Satra]";
+ mes "Ah...";
+ mes "It seems you've";
+ mes "forgotten your ^9C0000Coals^000000.";
+ mes "A silly mistake, but one";
+ mes "I'm willing to overlook.";
+ close;
+
+s_GotCoal4:
+ mes "[Satra]";
+ mes "Oh! You can't enjoy";
+ mes "any food in that state!";
+ mes "Your hands are atrociously";
+ mes "grimy! May I ask why?";
+ next;
+ mes "[Satra]";
+ mes "Ah~";
+ mes "In my excitement,";
+ mes "I nearly forgot that";
+ mes "I asked you to bring";
+ mes "Coals to me again!";
+ mes "My apologies~";
+ next;
+ mes "[Satra]";
+ mes "You've brought so much Coal";
+ mes "to me, I'm convinced that you're";
+ mes "much more diligent than those";
+ mes "languid peasants in Einbech.";
+ mes "I appreciate that you've labored";
+ mes "so much to win my favor.";
+ next;
+ mes "[Satra]";
+ mes "Hm, what was that?";
+ mes "someone else provided";
+ mes "these Coals and you were";
+ mes "only delivering them? Then";
+ mes "who actually gathered these?";
+ next;
+ input @str$;
+ mes "[Satra]";
+ if(@str$ != "Clitzer"){
+ mes "I beg your pardon?";
+ mes "" + @str$ + "? Oh my...";
+ mes "I believe I may have";
+ mes "misheard you. Ho ho ho ho~";
+ close;
+ }
+ mes "Ah, Clitzer?";
+ mes "I must say, that's";
+ mes "a very humble name.";
+ mes "Yet it's so familiar...";
+ next;
+ mes "[Satra]";
+ mes "Ah, I recall there";
+ mes "was a hooligan that";
+ mes "has been pestering my";
+ mes "daughter named Clitzer.";
+ mes "Perhaps they are one";
+ mes "and the same. Hmm...";
+ next;
+ mes "[Satra]";
+ mes "I remember that he was";
+ mes "rather shabby looking and";
+ mes "lacked any semblance of";
+ mes "etiquette whatsoever. Clearly,";
+ mes "he is a fool and a coward, but";
+ mes "now I see that he is sincere.";
+ next;
+ mes "[Satra]";
+ mes "It might not be possible";
+ mes "to let him go otu with my";
+ mes "daughter straight away, but";
+ mes "I will invite him for a spot of";
+ mes "tea. And if Calla likes him,";
+ mes "well, he must be special.";
+ next;
+ mes "[Satra]";
+ mes "For a humble peasant,";
+ mes "this must be like a dream";
+ mes "come true! And to have tea";
+ mes "with Clitzer. Oh, what would";
+ mes "the girls say? Ah, but I did";
+ mes "marry that oafish Megass~";
+ next;
+ mes "[Satra]";
+ mes "Anyway, when you next";
+ mes "meet Clitzer, please tell";
+ mes "him to pay me a visit soon.";
+ mes "Oh, and remind him to dress";
+ mes "appropriately for this special";
+ mes "occasion. Ho ho ho ho ho~";
+ set EIN_LOVERQ,12;
+ close;
+
+s_Intimi:
+ mes "[Satra]";
+ mes "I understand that my";
+ mes "home is extravagantly";
+ mes "splendid and to approach";
+ mes "any Kappelthaine is an";
+ mes "honor t most commoners.";
+ next;
+ mes "[Satra]";
+ mes "However, Clitzer";
+ mes "has no reason to feel so";
+ mes "intimidated. Tell the poor";
+ mes "boy that he's earned the";
+ mes "honor of speaking with me.";
+ close;
+
+}
+
+ein_in01.gat,31,138,4 script Calla 90,{
+ if(EIN_LOVERQ > 4 && EIN_LOVERQ < 14)goto s_NoSwitch;
+ if(EIN_LOVERQ > 1)goto s_Switches;
+s_NoSwitch:
+ mes "[Calla]";
+ mes "Hello adventurer.";
+ mes "Our city must just be";
+ mes "another place where";
+ mes "you'll stay no longer";
+ mes "than a few days.";
+ next;
+ mes "[Calla]";
+ mes "You must have so much";
+ mes "freedom. I envy you. I can't";
+ mes "do what I want to do. I don't";
+ mes "even have the courage to tell";
+ mes "my family what I really want,";
+ mes "much less change things here...";
+ next;
+ mes "[Calla]";
+ mes "How is it like?";
+ mes "Going wherever you";
+ mes "please, following your";
+ mes "heart's true desire?";
+ mes "What I would give to";
+ mes "be able to do that...";
+ if(!EIN_LOVERQ)set EIN_LOVERQ,1;
+ close;
+
+s_Switches:
+ switch(EIN_LOVERQ)
+ {
+
+ case 2:
+ mes "[Calla]";
+ mes "You're the adventurer";
+ mes "from before, aren't you?";
+ mes "Sadly, there isn't much";
+ mes "to do around here. This";
+ mes "place is basically like";
+ mes "a prison to me...";
+ next;
+ mes "[Calla]";
+ mes "Oh, you've met Clitzer?";
+ mes "Isn't he so kind, such";
+ mes "a perfect gentleman?";
+ next;
+ mes "[Calla]";
+ mes "I really wish I could";
+ mes "see him, but it's almost";
+ mes "impossible. My parents think";
+ mes "he's not good enough for me,";
+ mes "but they're wrong! What am";
+ mes "I going to do? Oh, Clitzer...";
+ next;
+ mes "[Calla]";
+ mes "Well, maybe I can't see";
+ mes "him, but would you give";
+ mes "my violin to Clitzer for me?";
+ mes "I used to play this for him";
+ mes "all the time...";
+ next;
+ mes "[Calla]";
+ mes "I'm sorry to trouble you,";
+ mes "but please understand";
+ mes "that I want to comfort my";
+ mes "Clitzer in any way that";
+ mes "I possibly can. Thank";
+ mes "you so much, adventurer...";
+ set EIN_LOVERQ,3;
+ getitem 1901,1;
+ close;
+ break;
+
+ case 3:
+ s_Regards:
+ mes "[Calla]";
+ mes "Oh, please send my";
+ mes "regards to Clitzer for me.";
+ mes "I wish I could comnfort";
+ mes "him in person, but this";
+ mes "is the best I can do for now.";
+ close;
+ break;
+
+ case 4:
+ if(!countitem(712))goto s_Regards;
+ mes "[Calla]";
+ mes "You've spoken";
+ mes "with Clitzer? How";
+ mes "is he? What did he say?";
+ next;
+ mes "[Calla]";
+ mes "Oh...?";
+ mes "He asked you to";
+ mes "deliver this flower";
+ mes "to me? How sweet~";
+ mes "Thank you very much,";
+ mes "kind adventurer~";
+ next;
+ mes "[Calla]";
+ mes "Ah, I'm so rude!";
+ mes "I've been calling you";
+ mes "^111111*adventurer*^000000 this whole";
+ mes "time you've been helping";
+ mes "me! Would you please";
+ mes "tell me your name?";
+ next;
+ input @str$;
+ mes "[Calla]";
+ if(@str$ != strcharinfo(0)){
+ mes "I'm sorry...";
+ mes "I didn't catch that.";
+ mes "would you please tell";
+ mes "me your name again?";
+ close;
+ }
+ mes "Ah, " + strcharinfo(0) + "!";
+ mes "Such a lovely name~";
+ mes "I promise that I won't ever";
+ mes "forget it. Oh, and if you pass by";
+ mes "Einbech, would you thank Clitzer";
+ mes "for the flower for me please?";
+ next;
+ mes "[Calla]";
+ mes "A-and... And...";
+ mes "Please tell him that";
+ mes "I really miss him a lot.";
+ mes "^565656*Sob Sob...*";
+ delitem 712,1;
+ set EIN_LOVERQ,5;
+ close;
+ break;
+
+ case 14:
+ mes "[Calla]";
+ mes "I just heard from my mother";
+ mes "that she's planning to have";
+ mes "tea with Clitzer! I'm sure that";
+ mes "I have you to thank for this~";
+ next;
+ mes "[Calla]";
+ mes "I never dreamed that";
+ mes "something as wonderful";
+ mes "as this could happen.";
+ mes "I'm so happy, I could cry...";
+ mes "I'll always be grateful";
+ mes "for what you've done.";
+ next;
+ mes "[Calla]";
+ mes "I feel like such a fool,";
+ mes "thinking it was all hopeless.";
+ mes "I'll be doing my best to have";
+ mes "my parents accept Clitzer and";
+ mes "someday we'll be married~";
+ next;
+ mes "[Calla]";
+ mes "There isn't much that I can";
+ mes "give you, but I can show you";
+ mes "one of my family's secrets.";
+ mes "It's an invigorating massage";
+ mes "technique that makes you alot";
+ mes "healthier in only ten seconds.";
+ next;
+ mes "[Calla]";
+ mes "Well, please take";
+ mes "off your equipment";
+ mes "and stand still while";
+ mes "I give the massage. It";
+ mes "might hurt a bit at first...";
+ nude;
+ next;
+ mes "^3151FF*Rub Rub Rub*";
+ mes "*Knead Knead Knead*";
+ mes "*Crrack C-c-c--c-crack*";
+ mes "*Crack Crack Crrrrrack*";
+ mes "*Rub Crrraaaaaaaaaackk*^000000";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Ooooooooh...";
+ mes "I feel sooo";
+ mes "sore and yet";
+ mes "soooooo good.";
+ mes "Wait. Now I just";
+ mes "feel goooood~";
+ if(BaseLevel < 41)set BaseExp,BaseExp+3712;
+ else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+7425;
+ else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+14850;
+ else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+29700;
+ else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+59400;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+118800;
+ set EIN_LOVERQ,15;
+ next;
+ mes "[Calla]";
+ mes "So how was it?";
+ mes "I hope it was refreshing.";
+ mes "Please understand that";
+ mes "it's the best thing I can";
+ mes "give you to show my gratitude.";
+ next;
+ mes "[Calla]";
+ mes "Once again,";
+ mes "thank you so";
+ mes "much, " + strcharinfo(0) + ".";
+ mes "I'll always pray for";
+ mes "your safety on your";
+ mes "your adventures~";
+ close;
+ break;
+
+ case 15:
+ mes "[Calla]";
+ mes "Thank you so much!";
+ mes "I'll try my best to convince";
+ mes "my parents to accept our";
+ mes "relationship. It'll be hard,";
+ mes "but it's a good first step~";
+ next;
+ mes "[Calla]";
+ mes "I hope that we can all";
+ mes "work together ti improve";
+ mes "relations between Einbech";
+ mes "and Einbroch. The hatred";
+ mes "between our towns must end...";
+ next;
+ mes "[Calla]";
+ mes "I really appreciate";
+ mes "what you've done for";
+ mes "all of use. I'll be praying";
+ mes "for your safety, adventurer.";
+ close;
+ break;
+
+ }
+}
+
+ein_in01.gat,191,102,4 script Kaijeta 846,{
+ if(EIN_LOVERQ > 13)goto s_Learned;
+ if(EIN_LOVERQ == 13)goto s_Clothes;
+ if(EIN_LOVERQ > 6 && EIN_LOVERQ < 13)goto s_Hatred;
+ if(EIN_LOVERQ == 6)goto s_Helping;
+ mes "[Kaijeta]";
+ mes "Welcome to my humble";
+ mes "abode, adventurer. I'm";
+ mes "sorry if I'm a poor host.";
+ next;
+ mes "[Kaijeta]";
+ mes "As you can see, we have";
+ mes "to share this house with";
+ mes "other families so we don't";
+ mes "have much open space or";
+ mes "privacy. I'm afraid we can't";
+ mes "even affor basic comfort.";
+ next;
+ mes "[Kaijeta]";
+ mes "For now, this is the best";
+ mes "we can do. We don't have";
+ mes "the zeny to buy a house or";
+ mes "land, so we have no choice";
+ mes "but to endure through this...";
+ close;
+
+s_Helping:
+ mes "[Kaijeta]";
+ mes "Thank you for helping my";
+ mes "son. He may look like a fool";
+ mes "for falling in love with someone";
+ mes "from Einbroch, but he's an honest";
+ mes "hard working man.";
+ next;
+ mes "[Kaijeta]";
+ mes "Then again, it was bound to";
+ mes "happen sometime. Einbech is";
+ mes "a very poor town while Einbroch";
+ mes "is a very rich town. I'd understand";
+ mes "if you don't agree, but opposites";
+ mes "attract sooner of later.";
+ next;
+ mes "[Kaijeta]";
+ mes "^565656*Sigh...*^000000";
+ mes "If my son and Calla can";
+ mes "work things out, maybe it";
+ mes "would improve relations";
+ mes "between our two towns.";
+ mes "I certainly hope so...";
+ next;
+ mes "[Kaijeta]";
+ mes "Still, I'm quite baffled!";
+ mes "I raised my son to have more";
+ mes "guts than to wallow in misery";
+ mes "when his heart's broken. And";
+ mes "I still have no idea how he got";
+ mes "together with such a rich woman.";
+ next;
+ mes "[Kaijeta]";
+ mes "Do you have any idea";
+ mes "how we can put an end";
+ mes "to the hate between our";
+ mes "two towns? I don't want to";
+ mes "see this couple separated";
+ mes "because of such pettiness.";
+ set EIN_LOVERQ,7;
+ close;
+
+s_Hatred:
+ mes "[Kaijeta]";
+ mes "I can't bear to see the";
+ mes "petty hatred between our";
+ mes "two towns stop my son from";
+ mes "seeing the woman he loves...";
+ close;
+
+s_Clothes:
+ mes "[Kaijeta]";
+ mes "Thank you for helping";
+ mes "my son Clitzer. Sadly, the";
+ mes "little fool doesn't have any";
+ mes "clue when it comes to certain";
+ mes "things like choosing clothing.";
+ mes "he gets so nervous about it!";
+ next;
+ mes "[Kaijeta]";
+ mes "A man should wear nice";
+ mes "clothes, like a Formal Suit";
+ mes "or a Tuxedo, for important";
+ mes "meetings and special occassions.";
+ mes "hopefully, he'll learn that soon.";
+ close;
+
+s_Learned:
+ mes "[Kaijeta]";
+ mes "My son learned";
+ mes "an awful lot from";
+ mes "your good example.";
+ mes "As a mother, I really";
+ mes "appreciate everything";
+ mes "you've done for him.";
+ next;
+ mes "[Kaijeta]";
+ mes "Well, adventurer,";
+ mes "I will be praying for";
+ mes "your safety wherever";
+ mes "your journeys may";
+ mes "take you.";
+ close;
+
+}
+
+ein_in01.gat,200,101,4 script Clitzer 854,{
+ if(EIN_LOVERQ)goto s_Switches;
+s_Back:
+ mes "[Clitzer]";
+ mes "Is there something";
+ mes "that you really want";
+ mes "in life, but it's just";
+ mes "beyond your grasp?";
+ next;
+ mes "[Clitzer]";
+ mes "I wish I was more";
+ mes "like you adventurers.";
+ mes "People like you never";
+ mes "seem to give up, no matter";
+ mes "what the obstacles may be.";
+ mes "But I'm so helpless...";
+ next;
+ mes "[Clitzer]";
+ mes "I can't even see";
+ mes "the one person that";
+ mes "I love. We're just so";
+ mes "different that it's not";
+ mes "even possible anymore...";
+ close;
+
+s_Switches:
+ switch(EIN_LOVERQ){
+ case 1:
+ mes "[Clitzer]";
+ mes "That faintly sweet";
+ mes "and pleasant scent...";
+ mes "It's just like the fragrance";
+ mes "they use in Calla's house.";
+ next;
+ mes "[Clitzer]";
+ mes "Ah, so you visited";
+ mes "Calla in Einbroch?";
+ mes "I miss her sooo much!";
+ mes "Is she doing alright?";
+ next;
+ mes "[Clitzer]";
+ mes "Calla's so beautiful.";
+ mes "And she's so lovely.";
+ mes "Every time I close my";
+ mes "eyes, I can still see";
+ mes "her lovely smile.";
+ next;
+ mes "[Clitzer]";
+ mes "I'm sorry if I sound";
+ mes "silly, but I can't help";
+ mes "it. I know I'm acting like";
+ mes "a complete idiot. But I'd";
+ mes "give anything to see her...";
+ next;
+ mes "[Clitzer]";
+ mes "Just...";
+ mes "Just don't listen";
+ mes "to anything I say.";
+ mes "I'm just a poor fool";
+ mes "in love with the wrong";
+ mes "person. That has to be it...";
+ set EIN_LOVERQ,2;
+ close;
+ break;
+
+ case 2:
+ mes "[Clitzer]";
+ mes "^565656*Sigh*^000000";
+ mes "I really appreciate your";
+ mes "sympathy, but I'm merely";
+ mes "a coward and a fool.";
+ next;
+ mes "[Clitzer]";
+ mes "Yeah...";
+ mes "I'm a coward for doing";
+ mes "nothing about my feelings";
+ mes "and an idiot for falling in love";
+ mes "with such a high class girl in";
+ mes "the first place... Oh, Calla...";
+ close;
+ break;
+
+ case 3:
+ if(!countitem(1901))goto s_Back;
+ mes "[Clitzer]";
+ mes "What brings you here?";
+ mes "aren't you tired of hearing";
+ mes "me moan and whine about";
+ mes "lost love? ^111111*Siiiiigh...*^000000";
+ next;
+ mes "[Clitzer]";
+ mes "Hey, this violin...";
+ mes "Calla used to play";
+ mes "such beautiful music";
+ mes "on this for me. Did";
+ mes "she give this to you?";
+ next;
+ mes "[Clitzer]";
+ mes "I see. Calla must have";
+ mes "known that I'm all broken up";
+ mes "right now. She's too good to";
+ mes "me. How can se consider";
+ mes "my feelings before thinking";
+ mes "about herself?";
+ next;
+ mes "[Clitzer]";
+ mes "I know I'm being";
+ mes "shameless, but I have";
+ mes "a favor to ask. Adventurer,";
+ mes "would you please send";
+ mes "Calla a present for me?";
+ next;
+ mes "[Clitzer]";
+ mes "All you need to do is";
+ mes "just give her ^FF00001 Flower^000000.";
+ mes "I don't have the zeny and";
+ mes "I don't think I'm welcome";
+ mes "at Kapellthaine Manor.";
+ next;
+ mes "[Clitzer]";
+ mes "Here, in return, I'll";
+ mes "give you this health";
+ mes "massage. It's not a";
+ mes "big deal, but when I'm";
+ mes "done, your mind and body";
+ mes "will be refreshed. Here goes!";
+ next;
+ mes "^3151FF*Knead Knead*";
+ mes "*Rub Rub Rub Rub*";
+ mes "*Press Press Press*";
+ mes "*C-c-c-c-c-c-crakck!*^000000";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Oh--";
+ mes "Hell yeah!";
+ mes "That's the stuff!";
+ delitem 1901,1;
+ if(BaseLevel < 41)set BaseExp,BaseExp+3712;
+ else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+7425;
+ else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+14850;
+ else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+29700;
+ else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+59400;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+118800;
+ set EIN_LOVERQ,4;
+ next;
+ mes "[Clitzer]";
+ mes "Would you please bring";
+ mes "1 Flower to Calla for me?";
+ mes "I'm sorry for troubling you...";
+ close;
+ break;
+
+ case 4:
+ mes "[Clitzer]";
+ mes "Would you please bring";
+ mes "1 Flower to Calla for me?";
+ mes "I'm sorry for troubling you...";
+ close;
+ break;
+
+ case 5:
+ mes "[Clitzer]";
+ mes "You've given her";
+ mes "the flower? That's";
+ mes "great! Thank you,";
+ mes "thank you so mu--";
+ next;
+ mes "[Clitzer]";
+ mes "...Oh!";
+ mes "Gosh! I was thinking so";
+ mes "much about myself that";
+ mes "I forgot to ask you for your";
+ mes "name! I'm sorry for being";
+ mes "so knuckle-headed...";
+ next;
+ mes "[Clitzer]";
+ mes "So...";
+ mes "What's your name?";
+ next;
+ input @str$;
+ mes "[Clitzer]";
+ if(@str$ != strcharinfo(0)){
+ mes "Hm...?";
+ mes "Oh, don't be";
+ mes "so nervous~";
+ mes "But would you please";
+ mes "tell me your name again?";
+ mes "I couldn't hear you...";
+ close;
+ }
+ mes "" + strcharinfo(0) + "...";
+ mes "That's very nice. Thank you,";
+ mes "I'm really grateful for your help.";
+ mes "Although I can't see Calla in";
+ mes "person, I can at least send";
+ mes "my regards if you help me.";
+ next;
+ mes "[Clitzer]";
+ mes "I feel so much";
+ mes "better now. Oh!";
+ mes "When you have the";
+ mes "time, why don't you talk";
+ mes "to my mother? She always";
+ mes "likes meeting my friends.";
+ set EIN_LOVERQ,6;
+ close;
+ break;
+
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ mes "[Clitzer]";
+ mes "^111111*Sigh...*^000000";
+ mes "What can I do to";
+ mes "get Calla's parents";
+ mes "to accept me as her";
+ mes "boyfriend? I can't";
+ mes "think of anything...";
+ close;
+ break;
+
+ case 12:
+ mes "[Clitzer]";
+ mes "Eh...?";
+ mes "What did you just say?";
+ mes "You did something for";
+ mes "the Kapellthaines?";
+ next;
+ mes "[Clitzer]";
+ mes "What...?";
+ mes "Did you just say";
+ mes "that Calla's mother";
+ mes "wants me to have tea";
+ mes "with her? Holy moley...!";
+ next;
+ mes "[Clitzer]";
+ mes "Okay, okay.";
+ mes "I-I I'll need something";
+ mes "nice to wear, right? Oh.";
+ mes "Wow. This is so sudden!";
+ mes "W-what should I do?";
+ next;
+ mes "[Clitzer]";
+ mes "This monkey suit";
+ mes "that I've got on just";
+ mes "won't do! Arrrgh! But I've";
+ mes "already outgrown all of my";
+ mes "nice clothes already. Boy,";
+ mes "am I in a pickle...";
+ set EIN_LOVERQ,13;
+ close;
+ break;
+
+ case 13:
+ if(countitem(2320) || countitem(7170))goto s_Clothes;
+ mes "[Clitzer]";
+ mes "Noooooo!";
+ mes "I've got to find";
+ mes "the perfect thing";
+ mes "to wear or Calla's";
+ mes "mother might ^FF0000hate^000000 me!";
+ next;
+ mes "[Clitzer]";
+ mes "Think, Clitzer, think!";
+ mes "Okay, no fun colors.";
+ mes "I don't want her to";
+ mes "think I'm not serious";
+ mes "about Calla. Stripes";
+ mes "might be bad too...";
+ close;
+ break;
+
+ case 14:
+ case 15:
+ mes "[Clitzer]";
+ mes "Look out, world!";
+ mes "I'm gonna become";
+ mes "worth of Calla's love!";
+ mes "Someday, maybe even her";
+ mes "parents will approve me!";
+ close;
+ break;
+ }
+
+s_Clothes:
+ mes "[Clitzer]";
+ mes "Waaah!";
+ mes "What should I wear?!";
+ mes "I can't for the life of me";
+ mes "figure this out! Something,";
+ mes "um, formal? I've never worn";
+ mes "anything like that before!";
+ next;
+ if(countitem(7170)){
+ set @clothes,7170;
+ mes "[Clitzer]";
+ mes "Wait, " + strcharinfo(0) + ".";
+ mes "What's that you've got";
+ mes "there? I've seen something";
+ mes "like that before. It's called";
+ mes "a Tuxedo, right? Something";
+ mes "like that would be perfect!";
+ next;
+ menu "Give it to him.",s_Giveclothes,"Ignore him.",-;
+
+ mes "[Clitzer]";
+ mes "But how can I get";
+ mes "a Tuxedo? Ooh, I hope";
+ mes "it doesn't cost too much";
+ mes "zeny or I won't be able to";
+ mes "get one of those soon...";
+ } else if(countitem(2320)){
+ set @clothes,2320;
+ mes "[Clitzer]";
+ mes "Wait, " + strcharinfo(0) + ".";
+ mes "What's that you've got";
+ mes "there? I've seen something";
+ mes "like that before. It's called";
+ mes "a Formal Suit, right?";
+ mes "Something like that would";
+ mes "be perfect!";
+ next;
+ menu "Give it to him.",s_Giveclothes,"Ignore him.",-;
+
+ mes "[Clitzer]";
+ mes "But how can I get";
+ mes "a Formal Suit? I hope";
+ mes "it doesn't cost too much";
+ mes "zeny or I won't be able to";
+ mes "get one of those soon...";
+ }
+ close;
+
+s_Giveclothes:
+ mes "[Clitzer]";
+ mes "I can have this?";
+ mes "Oh, thank you so much!";
+ mes "Finally, I have something";
+ mes "nice enough to wear to meet";
+ mes "Calla's mom! What a relief!";
+ next;
+ mes "[Clitzer]";
+ mes "You've been helping me all";
+ mes "this time and I haven't properly";
+ mes "expressed my gratitude. I'm sorry";
+ mes "if I've been to absorbed in my own";
+ mes "problems. I may be poor, but I need";
+ mes "to repay you somehow...";
+ next;
+ mes "[Clitzer]";
+ mes "Wait...";
+ mes "Why don't you have this";
+ mes "ore? I don't how";
+ mes "valuable it is, but I know";
+ mes "that it's pretty rare. It may";
+ mes "even be useful to you later~";
+ delitem @clothes,1;
+ set EIN_LOVERQ,14;
+ switch(rand(1,9)){
+ case 1:
+ getitem 7289,1;
+ break;
+
+ case 2:
+ getitem 7290,1;
+ break;
+
+ case 3:
+ getitem 7291,1;
+ break;
+
+ case 4:
+ getitem 7292,1;
+ break;
+
+ case 5:
+ getitem 7293,1;
+ break;
+
+ case 6:
+ getitem 7294,1;
+ break;
+
+ case 7:
+ getitem 7295,1;
+ break;
+
+ case 8:
+ getitem 7296,1;
+ break;
+
+ case 9:
+ getitem 7297,1;
+ break;
+ }
+ next;
+ mes "[Clitzer]";
+ mes "" + strcharinfo(0) + ",";
+ mes "you've really opened";
+ mes "my eyes. From now on,";
+ mes "I'll do my best to earn the";
+ mes "approval of Calla's parents and";
+ mes "become worthy of Calla's love.";
+ close;
+
+}
+
+//============================================================
+//=========================================== Einbroch Polution
+//============================================================
+
+einbroch.gat,1,1,0 script #PolutionNPC -1,{
+
+OnPolution:
+ set @AlrdEinPoll,1;
+ donpcevent "Liotzburg::OnHide";
+ donpcevent "Morei::OnHide";
+ donpcevent "Mark::OnHide";
+ donpcevent "Khemko::OnHide";
+ donpcevent "Oberu::OnHide";
+ donpcevent "Khowropher::OnHide";
+ donpcevent "Kesunboss::OnHide";
+ donpcevent "Train Station Staff#01::OnHide";
+ donpcevent "Train Station Staff#02::OnHide";
+ donpcevent "Leslie::OnHide";
+ donpcevent "Little Toby::OnHide";
+ donpcevent "Tan::OnHide";
+ donpcevent "Keneshiotz::OnHide";
+ donpcevent "Sleik::OnHide";
+ donpcevent "Uwe Kleine::OnHide";
+ donpcevent "Laboratory Soldier#01::OnHide";
+ donpcevent "Laboratory Soldier#02::OnHide";
+ disablenpc "Paddler";
+ disablenpc "Head Gear Dealer";
+
+ mapannounce "einbroch.gat","This is a state of emercency! Harmful smog is reaching high levels of saturation. Residents of Einbroch must find shelter immediately.",bc_map;
+ monster "einbroch.gat",82,332,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",99,328,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",122,317,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",138,319,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",147,312,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",159,316,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",173,315,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",161,311,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",147,296,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",168,282,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",175,271,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",146,274,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",160,272,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",155,256,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",179,262,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",192,248,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",212,255,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",230,250,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",246,251,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",262,254,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",253,240,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",202,245,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",181,251,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",172,238,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",146,242,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",186,226,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",173,239,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",124,248,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",120,234,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",98,234,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",101,219,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",89,208,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",96,191,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",76,194,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",60,196,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",45,194,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",34,201,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",40,184,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",64,173,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",96,173,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",41,155,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",46,131,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",46,108,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",38,93,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",55,86,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",81,81,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",107,82,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",107,104,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",123,73,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",132,87,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",125,63,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",142,64,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",150,52,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",157,37,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",179,39,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",197,46,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",217,67,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",246,54,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",228,110,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",250,118,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",273,127,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",288,138,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",281,160,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",281,192,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",291,201,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",283,218,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",268,216,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",273,196,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",262,164,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",241,180,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",216,205,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",209,198,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",224,177,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",227,163,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",208,166,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",132,87,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",149,119,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",119,36,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",84,155,"Toxic Fog",1621,1,"#PolutionNPC::OnMobChk";
+ monster "einbroch.gat",82,107,"Red Fog",1620,1,"#PolutionNPC::OnMobChk";
+ initnpctimer;
+ end;
+
+OnMobChk:
+ if(mobcount("einbroch.gat","#PolutionNPC::OnMobChk"))end;
+
+OnTimer600000:
+ killmonster "einbroch.gat","#PolutionNPC::OnMobChk";
+ mapannounce "einbroch.gat","Emergency status is now cancelled. Air pollution levels are now within the safety zone.",bc_map;
+ enablenpc "Liotzburg";
+ donpcevent "Liotzburg::OnUnHide";
+ enablenpc "Morei";
+ donpcevent "Morei::OnUnHide";
+ enablenpc "Mark";
+ donpcevent "Mark::OnUnHide";
+ enablenpc "Khemko";
+ donpcevent "Khemko::OnUnHide";
+ enablenpc "Oberu";
+ donpcevent "Oberu::OnUnHide";
+ enablenpc "Khowropher";
+ donpcevent "Khowropher::OnUnHide";
+ enablenpc "Kesunboss";
+ donpcevent "Kesunboss::OnUnHide";
+ enablenpc "Train Station Staff#01";
+ donpcevent "Train Station Staff#01::OnUnHide";
+ enablenpc "Train Station Staff#02";
+ donpcevent "Train Station Staff#02::OnUnHide";
+ enablenpc "Leslie";
+ donpcevent "Leslie::OnUnHide";
+ enablenpc "Little Toby";
+ donpcevent "Little Toby::OnUnHide";
+ enablenpc "Tan";
+ donpcevent "Tan::OnUnHide";
+ enablenpc "Keneshiotz";
+ donpcevent "Keneshiotz::OnUnHide";
+ enablenpc "Sleik";
+ donpcevent "Sleik::OnUnHide";
+ enablenpc "Uwe Kleine";
+ donpcevent "Uwe Kleine::OnUnHide";
+ enablenpc "Laboratory Soldier#01";
+ donpcevent "Laboratory Soldier#01::OnUnHide";
+ enablenpc "Laboratory Soldier#02";
+ donpcevent "Laboratory Soldier#02::OnUnHide";
+ enablenpc "Paddler";
+ enablenpc "Head Gear Dealer";
+ set $EinPolution,0;
+ set @AlrdEinPoll,0;
+ end;
+
+}
+
+sec_in02.gat,127,86,3 script Einbroch Polution 851,{
+
+ if(getgmlevel() > 79){
+ mes "[Einbroch Polution Variable Management]";
+ mes "$EinPolution is currently: " + $EinPolution + ".";
+ mes "What would you like to do?";
+ next;
+ menu "Reset $EinPolution to 0",s_0,"Input My Own Value",s_Input,"Cancel.",-;
+ close;
+ s_0:
+ mes "[Einbroch Polution Variable Management]";
+ mes "$EinPolution has been reset to 0.";
+ set $EinPolution,0;
+ set @AlrdEinPoll,0;
+ close;
+ s_Input:
+ mes "[Einbroch Polution Variable Management]";
+ mes "Insert a number you want $EinPollution";
+ mes "to be replaced with. Type '0' to cancel.";
+ input @temppol;
+ if(@temppol == 0)close;
+ set $EinPolution,@temppol;
+ mes "[Einbroch Polution Variable Management]";
+ mes "$EinPolution has been set to: " + $EinPolution + ".";
+ close;
+ } else {
+ mes "[Einbroch Polution Variable Management]";
+ mes "Sorry you don't have authorization";
+ mes "to use this NPC.";
+ close;
+ }
+}
+
+//============================================================
+//=========================================== Einbroch Factory
+//====================================================== Quest
+
+einbroch.gat,132,84,3 script Liotzburg 853,{
+
+ if($EinPolution > 9){
+ mes "[Liotzburg]";
+ mes "What's going on?!";
+ mes "Who's responsible?!";
+ mes "God, I can't believe";
+ mes "this is happening!";
+ mes "^333333*Cough Cough!*^000000";
+ next;
+ mes "[Liotzburg]";
+ mes "I need to get out of here!";
+ mes "You! D-do something and";
+ mes "fix this! I gotta hide and find";
+ mes "someplace safe!";
+ close2;
+ if(!@AlrdEinPoll)donpcevent "#PolutionNPC::OnPolution";
+ end;
+ }
+ if(EinFactory >= 13){
+ if(EinFactory > 13){
+ mes "[Liotzburg]";
+ mes "What...?";
+ mes "Factory Repair";
+ mes "budget? No way!";
+ next;
+ }
+ mes "[Liotzburg]";
+ mes "Why waste money?";
+ mes "We haven't had any";
+ mes "problems so far! Look,";
+ mes "everything's fine! Why";
+ mes "are you exaggerating";
+ mes "such small details?";
+ next;
+ mes "[Liotzburg]";
+ mes "The field overseer,";
+ mes "Zelmeto, just came by to";
+ mes "ask for a budget increase.";
+ mes "Well, I think he's lying!";
+ mes "Everything's perfect!";
+ if(EinFactory == 13)set EinFactory,14;
+ close;
+ }
+ mes "[Liotzburg]";
+ mes "I'm the plant";
+ mes "superintendant of this";
+ mes "factory. Most of my employees";
+ mes "are diligent workers. I can't say";
+ mes "that of everyone, but overall we're";
+ mes "doing an excellent job. Ha ha ha~!";
+ next;
+ mes "[Liotzburg]";
+ mes "So long as this factory";
+ mes "is well maintained, we won't";
+ mes "have to worry about this city's";
+ mes "safety. The field overseer,";
+ mes "Zelmeto, is also very reliable.";
+ next;
+ mes "[Liotzburg]";
+ mes "I can trust Zelmeto";
+ mes "to look after things,";
+ mes "so there's no need for";
+ mes "me to go inside the factory.";
+ mes "Delegating work is great!";
+ next;
+ mes "[Liotzburg]";
+ mes "Our factory will";
+ mes "continue to develop";
+ mes "and everyone will be";
+ mes "proud of the progress";
+ mes "we're making. Yes, I can";
+ mes "assure you of that!";
+ close;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Liotzburg";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
+}
+
+ein_in01.gat,67,243,3 script Zelmeto 851,{
+
+ if($EinPolution > 9){
+ mes "[Zelmeto]";
+ mes "We've got a big problem";
+ mes "here! I appreciate that you've";
+ mes "been gathering the materials,";
+ mes "but the machines have been";
+ mes "broken for too long!";
+ next;
+ mes "[Zelmeto]";
+ mes "Right when I tried to";
+ mes "fix it, a huge shortout";
+ mes "occurred. Our town is";
+ mes "probably filled with";
+ mes "toxic fog right now!";
+ next;
+ mes "[Zelmeto]";
+ mes "I'll try my best to fix";
+ mes "this, but we really should";
+ mes "have allocated some funds";
+ mes "to fix this machine earlier!";
+ next;
+ mes "[Zelmeto]";
+ mes "The most important";
+ mes "thing is that you get";
+ mes "out of here and find";
+ mes "shelter! Right now!";
+ close2;
+ warp "einbroch.gat",131,83;
+ end;
+ }
+
+ if(EinFactory > 0)goto s_Switches;
+ mes "[Zelmeto]";
+ mes "Ah, you must be a visitor.";
+ mes "I'm Zelmeto Abellov, the";
+ mes "field overseer. Have you";
+ mes "been in this facility before?";
+ next;
+ mes "[Zelmeto]";
+ mes "This factory plays an";
+ mes "important role in our city";
+ mes "and generates a lot of income.";
+ mes "However, our employess suffer";
+ mes "from a poor work environment.";
+ next;
+ mes "[Zelmeto]";
+ mes "Our superintendant makes a lot";
+ mes "of money and seems content with";
+ mes "the current situation. However, the";
+ mes "rest of the workforce doesn't enjoy";
+ mes "all of the benefits he receives.";
+ mes "[Zelmeto]";
+ mes "Many people have already";
+ mes "quit and there are only a few";
+ mes "people who continue to work";
+ mes "here. So now we're understaffed";
+ mes "and I'm in quite a bind...";
+ next;
+ mes "[Zelmeto]";
+ mes "There are some urgent";
+ mes "tasks I need done, but";
+ mes "there's no way for me";
+ mes "to recruit new workers.";
+ mes "Ah, I'm sorry, I've spoken too";
+ mes "freely about my own problems...";
+ next;
+ menu "You're understaffed?",s_Underst,"No, it's okay.",-;
+
+ mes "[Zelmeto]";
+ mes "Thank you for";
+ mes "your kindness.";
+ mes "And please don't";
+ mes "let anyone know about";
+ mes "anything I just told you.";
+ close;
+
+s_Underst:
+ mes "[Zelmeto]";
+ mes "Yes, we are!";
+ mes "I don't have enough";
+ mes "people to inspect the";
+ mes "factory machines and";
+ mes "determine what kinds";
+ mes "of problems we have.";
+ next;
+ mes "[Zelmeto]";
+ mes "It's a time consuming";
+ mes "task I'd rather do on my";
+ mes "own. However, between that";
+ mes "and managing the workforce,";
+ mes "I don't have enough time...";
+ next;
+ menu "I can help you.",s_Help,"Keep up the good job.",-;
+
+ mes "[Zelmeto]";
+ mes "Well, it's a living.";
+ mes "^6A6A6A*Sigh*^000000 I can put up with";
+ mes "this, but I hope the higher";
+ mes "ups will consider improving";
+ mes "the work environment here...";
+ close;
+
+s_Help:
+ mes "[Zelmeto]";
+ mes "You can help me?";
+ mes "I know something like";
+ mes "this is too much to ask,";
+ mes "but I'll accept any help";
+ mes "anyone offers me. I'm";
+ mes "that desperate.";
+ next;
+ mes "[Zelmeto]";
+ mes "Alright, I'll have you";
+ mes "inspect the machines";
+ mes "in the factory one by one.";
+ mes "It's imperative that we know";
+ mes "what needs to be repaired";
+ mes "and what's working fine";
+ next;
+ mes "[Zelmeto]";
+ mes "First, find the ^FF00002nd control";
+ mes "panel^000000 and determine its";
+ mes "status. I'm fairly certain that";
+ mes "it broke a long time ago, but";
+ mes "it wouldn't hur to make sure.";
+ mes "You should find it easily.";
+ next;
+ mes "[Zelmeto]";
+ mes "When you finish your";
+ mes "inspection, report back";
+ mes "to me so I can tell you";
+ mes "which machine to check";
+ mes "next. Thanks again for";
+ mes "offering to help";
+ set EinFactory,1;
+ close;
+s_Switches:
+ switch(EinFactory){
+ case 1:
+ mes "[Zelmeto]";
+ mes "If you would,";
+ mes "please inspect the";
+ mes "2nd control panel that";
+ mes "seems to have been";
+ mes "broken for a while...";
+ close;
+ break;
+
+ case 2:
+ mes "[Zelmeto]";
+ mes "Huh, I see.";
+ mes "We must do something";
+ mes "about that as soon as";
+ mes "we can. Now, let me tell";
+ mes "you what to check next.";
+ next;
+ mes "[Zelmeto]";
+ mes "There are 3 automatic";
+ mes "pressure governors which";
+ mes "hammer the bent iron plates";
+ mes "from above to flatten them. It";
+ mes "seems that one of them may";
+ mes "have some kind of problem.";
+ next;
+ mes "[Zelmeto]";
+ mes "Please inspect the ^FF0000automatic";
+ mes "pressure governors^000000. Even if the";
+ mes "problem seems small, please";
+ mes "report it to me. I know it might";
+ mes "seem fine now, but I want to";
+ mes "prevent an accident if I can.";
+ next;
+ mes "[Zelmeto]";
+ mes "Thank you";
+ mes "in advance,";
+ mes "adventurer.";
+ set EinFactory,3;
+ close;
+ break;
+
+ case 3:
+ mes "[Zelmeto]";
+ mes "You need to inspect";
+ mes "an automatic pressure";
+ mes "governor. It looks fine,";
+ mes "but sometimes it makes";
+ mes "strange noises.";
+ next;
+ mes "[Zelmeto]";
+ mes "It probably will";
+ mes "be a good idea to";
+ mes "check that machine";
+ mes "more carefully this";
+ mes "time, just in case.";
+ next;
+ mes "[Zelmeto]";
+ mes "Thank you";
+ mes "for helping us,";
+ mes "adventurer.";
+ close;
+ break;
+
+ case 4:
+ mes "[Zelmeto]";
+ mes "What...?";
+ mes "This is worse";
+ mes "than I expected. But";
+ mes "it's good that we know";
+ mes "about these problems";
+ mes "as soon as possible.";
+ next;
+ mes "[Zelmeto]";
+ mes "Don't you worry,";
+ mes "we'll take care of";
+ mes "this. In the meantime,";
+ mes "I'd like you to inspect";
+ mes "the next machine for me.";
+ next;
+ mes "[Zelmeto]";
+ mes "I want you to check";
+ mes "a ^FF0000control panel^000000. It's the";
+ mes "same kind as the one";
+ mes "you just inspected, but";
+ mes "bigger in size.";
+ next;
+ mes "[Zelmeto]";
+ mes "It's located in the";
+ mes "middle of the factory,";
+ mes "so you should be able";
+ mes "to find it. It may be in bad";
+ mes "condition, even though it's";
+ mes "operating fine for now...";
+ next;
+ mes "[Zelmeto]";
+ mes "We need to ensure that";
+ mes "it's stable, reliable and";
+ mes "doesn't pose a threat to";
+ mes "our workforce. Thanks";
+ mes "again, adventurer.";
+ set EinFactory,5;
+ close;
+ break;
+
+ case 5:
+ mes "[Zelmeto]";
+ mes "I'd like you to inspect";
+ mes "the control panel. It's";
+ mes "fairly large and can be";
+ mes "found in the middle of the";
+ mes "factory. You shouldn't have";
+ mes "too much trouble finding it.";
+ close;
+ break;
+
+ case 6:
+ mes "[Zelmeto]";
+ mes "I see...";
+ mes "It's most likely that";
+ mes "there was a short";
+ mes "circuit and most";
+ mes "of the internal devices";
+ mes "were burnt out...";
+ next;
+ mes "[Zelmeto]";
+ mes "Thanks for checking";
+ mes "that out for me. Now,";
+ mes "the next machine I need";
+ mes "you to inspect is different";
+ mes "than the others I've had";
+ mes "you examine.";
+ next;
+ mes "[Zelmeto]";
+ mes "It's a mechanical";
+ mes "hand that transports";
+ mes "small objects. We didn't";
+ mes "really give it a name, but";
+ mes "you should be able to find it.";
+ next;
+ mes "[Zelmeto]";
+ mes "Recently, it seems";
+ mes "that there have been";
+ mes "problems in operating";
+ mes "that machine. If something's";
+ mes "broken, we need to know";
+ mes "and fix it right away.";
+ next;
+ mes "[Zelmeto]";
+ mes "Thanks again";
+ mes "in advance.";
+ set EinFactory,7;
+ close;
+ break;
+
+ case 7:
+ mes "[Zelmeto]";
+ mes "The machine which";
+ mes "I want you to inspect";
+ mes "this time is a small";
+ mes "sized conveyor.";
+ next;
+ mes "[Zelmeto]";
+ mes "Be sure that you";
+ mes "inspect the small";
+ mes "one, since we also";
+ mes "have a large conveyor";
+ mes "in the factory as well";
+ close;
+ break;
+
+ case 8:
+ mes "[Zelmeto]";
+ mes "Huh?";
+ mes "I'm suprised to hear";
+ mes "that. ^6A6A6A*Sigh*^000000 There's just";
+ mes "too many things that need";
+ mes "fixing. This is terrible...";
+ next;
+ mes "[Zelmeto]";
+ mes "Well, let me worry";
+ mes "about that for now. Please";
+ mes "focus on continuing to inspect";
+ mes "some of the other machines.";
+ next;
+ mes "[Zelmeto]";
+ mes "Now, there's a pipe inside";
+ mes "this factory that I want you";
+ mes "to look at. Many of our pipes";
+ mes "aren't in the best condition,";
+ mes "but this particular one might";
+ mes "be severely damaged.";
+ next;
+ mes "[Zelmeto]";
+ mes "Now, the pipe I want";
+ mes "you to inspect is located";
+ mes "near those large caultrons";
+ mes "of molten metal. You should";
+ mes "be able to find it pretty easily";
+ next;
+ mes "[Zelmeto]";
+ mes "Thanks again";
+ mes "for your help,";
+ mes "adventurer.";
+ set EinFactory,9;
+ close;
+ break;
+
+ case 9:
+ mes "[Zelmeto]";
+ mes "The pipe I want";
+ mes "you to inspect is located";
+ mes "near those large caultrons";
+ mes "of molten metal. You should";
+ mes "be able to find it pretty easily";
+ next;
+ mes "[Zelmeto]";
+ mes "Thanks again";
+ mes "for your help,";
+ mes "adventurer.";
+ close;
+ break;
+
+ case 10:
+ mes "[Zelmeto]";
+ mes "This is";
+ mes "worse than";
+ mes "I imagined...";
+ next;
+ mes "[Zelmeto]";
+ mes "We've got to start";
+ mes "repairs as soon as we";
+ mes "can! Hopefully, we can";
+ mes "resolve this before";
+ mes "any serious problems happen...";
+ next;
+ mes "[Zelmeto]";
+ mes "Alright, the last";
+ mes "thing that you need to";
+ mes "inspect is a ^FF0000large conveyor^000000.";
+ mes "It's similiar to the one you";
+ mes "inspected before, but it's";
+ mes "bigger and more powerful.";
+ next;
+ mes "[Zelmeto]";
+ mes "We have only one of these";
+ mes "machines and it's usually";
+ mes "moved around a lot since";
+ mes "a lot of people in the factory";
+ mes "use it. I really don't know";
+ mes "where it could be now.";
+ next;
+ mes "[Zelmeto]";
+ mes "Still I'm sure that";
+ mes "it's inside the building,";
+ mes "so you should be able to";
+ mes "find it. I hope you can inspect";
+ mes "that conveyor for me soon.";
+ set EinFactory,11;
+ close;
+ break;
+
+ case 11:
+ mes "[Zelmeto]";
+ mes "The machine which";
+ mes "you are supposed to";
+ mes "inspect right now";
+ mes "is a large convyore.";
+ next;
+ mes "[Zelmeto]";
+ mes "Remember that we";
+ mes "also have a small sized";
+ mes "conveyor, so make sure";
+ mes "that you examine the";
+ mes "larger one, alright?";
+ close;
+ break;
+
+ case 12:
+ mes "[Zelmeto]";
+ mes "Well, I figured that both";
+ mes "conveyors would have";
+ mes "similiar problems. We";
+ mes "can fix them at the";
+ mes "same time, but it'll";
+ mes "be a hassle";
+ next;
+ mes "[Zelmeto]";
+ mes "Thank you so much for";
+ mes "your help. Without you,";
+ mes "I'm pretty sure we wouldn't";
+ mes "know about these problems";
+ mes "until it was too late.";
+ next;
+ mes "[Zelmeto]";
+ mes "Now, I've got to make sure";
+ mes "we have enough materials";
+ mes "to make the repairs so that";
+ mes "the machines will be safely";
+ mes "functioning again.";
+ next;
+ mes "[Zelmeto]";
+ mes "First, I better";
+ mes "hurry and request";
+ mes "an increase for the";
+ mes "Factory Repair budget";
+ mes "from our superintendant.";
+ set EinFactory,13;
+ close;
+ break;
+
+ case 13:
+ mes "[Zelmeto]";
+ mes "I've got to report this";
+ mes "to our superintendant";
+ mes "as soon as possible.";
+ next;
+ mes "[Zelmeto]";
+ mes "With any luck, he'll approve";
+ mes "a budget increase so that we";
+ mes "can get all of the materials";
+ mes "needed for the repairs.";
+ close;
+ break;
+
+ case 14:
+ mes "[Zelmeto]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Zelmeto]";
+ mes "^6A6A6A*Sigh*^000000";
+ mes "My proposal was rejected";
+ mes "by our superintendant. But";
+ mes "maintainance and repairs";
+ mes "are crucial for peak operating";
+ mes "efficiency and worker safety!";
+ next;
+ mes "[Zelmeto]";
+ mes "I'm frustrated and worried.";
+ mes "Maybe nothing will happen";
+ mes "for now, but we've got to";
+ mes "safeguard our future by";
+ mes "regularly maintaining";
+ mes "all of these machines";
+ next;
+ mes "[Zelmeto]";
+ mes "Even possible threats";
+ mes "to the safety of our workers";
+ mes "can't be ignored. Isn't there";
+ mes "something I can do? ^6A6A6A*Sigh*^000000";
+ next;
+ mes "[Zelmeto]";
+ mes "If we can";
+ mes "just get";
+ mes "20 ^FF0000Flexible Tube^000000,";
+ mes "10 ^FF0000Rusty Screw^000000 and";
+ mes "10 ^FF0000Used Iron Plate^000000,";
+ mes "we could make those repairs.";
+ next;
+ mes "[Zelmeto]";
+ mes "But without funds, there's";
+ mes "no way we can purchase";
+ mes "those items. If something";
+ mes "happens, who's going to";
+ mes "be responsible?";
+ set EinFactory,15;
+ close;
+ break;
+
+ case 15:
+ mes "[Zelmeto]";
+ if(countitem(7325) < 20 || countitem(7317) < 10 || countitem(7319) < 10){
+ mes "We need";
+ mes "at least";
+ mes "20 ^FF0000Flexible Tube^000000,";
+ mes "10 ^FF0000Rusty Screw^000000 and";
+ mes "10 ^FF0000Used Iron Plate^000000,";
+ mes "to repair this factory.";
+ next;
+ mes "[Zelmeto]";
+ mes "^6A6A6A*Sigh*^000000";
+ mes "But there's no way";
+ mes "we can get all of those";
+ mes "things. Our budget isn't";
+ mes "big enough to cover it.";
+ close;
+ }
+ mes "Ah, it's you again.";
+ mes "It's shameful letting";
+ mes "other people know about";
+ mes "our miserable situation...";
+ next;
+ mes "[Zelmeto]";
+ mes "There's nothing";
+ mes "worth seeing here,";
+ mes "so there really isn't";
+ mes "a point in you coming to";
+ mes "visit this place anymore.";
+ next;
+ menu "Give him the materials.",s_Give,"Huh.",-;
+
+ mes "[Zelmeto]";
+ mes "^6A6A6A*Sigh*^000000";
+ mes "I'm really worried";
+ mes "about this factory's";
+ mes "future. What is our";
+ mes "superintendant thinking...?";
+ close;
+
+ s_Give:
+ mes "[Zelmeto]";
+ mes "...Hm?";
+ mes "Aren't these the";
+ mes "materials we need";
+ mes "to make repairs in";
+ mes "the factory? How did";
+ mes "you find all of these?";
+ next;
+ if(countitem(7325) < 20 || countitem(7317) < 10 || countitem(7319) < 10)close;
+ delitem 7325,20;
+ delitem 7317,10;
+ delitem 7319,10;
+ set EinFactory,16;
+ set $EinPolution,$EinPolution+1;
+ if(BaseLevel < 41) set BaseExp,BaseExp+615;
+ else if(BaseLevel >= 41 && BaseLevel < 51) set BaseExp,BaseExp+3075;
+ else if(BaseLevel >= 51 && BaseLevel < 61) set BaseExp,BaseExp+6604;
+ else if(BaseLevel >= 61 && BaseLevel < 71) set BaseExp,BaseExp+18508;
+ else if(BaseLevel >= 71 && BaseLevel < 81) set BaseExp,BaseExp+32062;
+ else if(BaseLevel >= 81 && BaseLevel < 91) set BaseExp,BaseExp+76026;
+ else if(BaseLevel >= 91) set BaseExp,BaseExp+290675;
+ mes "[Zelmeto]";
+ mes "I don't know how";
+ mes "I can possible pay you";
+ mes "back for this great favor.";
+ mes "I appreciate that you've";
+ mes "stepped forward to help us.";
+ next;
+ mes "[Zelmeto]";
+ mes "Oh...!";
+ mes "In my years of managing,";
+ mes "I've learned the ultimate";
+ mes "motivation techniques. Let";
+ mes "me enhance your motivation";
+ mes "to show you my gratitude.";
+ next;
+ mes "[Zelmeto]";
+ mes "Now...";
+ mes "Just open your mind";
+ mes "and listen to my words";
+ mes "of encouragement";
+ mes "and inspiration...";
+ next;
+ mes "[Zelmeto]";
+ mes "^3131FFWhen the going";
+ mes "gets rough, you've";
+ mes "gotta get rougher!";
+ mes "You gotta climb that";
+ mes "mountain 'cause no one's";
+ mes "gonna climb it for you!";
+ next;
+ mes "[Zelmeto]";
+ mes "^3131FFDon't give it up!";
+ mes "Go for broke!";
+ mes "Losers are quitters";
+ mes "and quitters are losers!";
+ next;
+ mes "[Zelmeto]";
+ mes "^6A6A6A*Whew*";
+ mes "^000000I haven't given that much";
+ mes "inspiration in a while, but";
+ mes "your help was well worth it.";
+ mes "I'm going to start the repairs, but";
+ mes "once again I'd like to thank you.";
+ close;
+ break;
+
+ case 16:
+ mes "[Zelmeto]";
+ mes "We'll be putting good";
+ mes "use to the materials you";
+ mes "gave me. With your help,";
+ mes "our factory will operate";
+ mes "safely. At least, for just";
+ mes "a little while longer.";
+ close;
+ }
+}
+
+ein_in01.gat,50,232,4 script 2nd Control Panel 111,{
+
+ if(EinFactory == 1){
+ mes "^3131FFIt's the 2nd control panel";
+ mes "Zelmeto asked you to inspect.";
+ mes "it looks totally broken: screws";
+ mes "are missing, and the iron cover";
+ mes "has been bent open, revealing";
+ mes "a tangled mess of wires inside.";
+ set EinFactory,2;
+ close;
+ }
+ end;
+}
+
+ein_in01.gat,108,217,4 script 3rd Pressure Governor 111,{
+
+ if(EinFactory == 3){
+ mes "^3131FFAt first glance, this";
+ mes "pressure governor looks";
+ mes "perfectly fine. But after you";
+ mes "check it more carefully, you";
+ mes "find that it's making strange";
+ mes "grinding noises and a few of";
+ mes "the surface screws are loose.";
+ set EinFactory,4;
+ close;
+ }
+ end;
+}
+
+ein_in01.gat,61,259,4 script Main Control Panel 111,{
+
+ if(EinFactory == 5){
+ mes "^3131FFThe main control panel";
+ mes "doesn't look like it has";
+ mes "any problems. But after";
+ mes "tapping on its surface,";
+ mes "you hear a disheartening";
+ mes "hollow sound. It looks like";
+ mes "it's missing some parts...";
+ set EinFactory,6;
+ close;
+ }
+ end;
+}
+
+ein_in01.gat,47,197,4 script Conveyor#01 111,{
+
+ if(EinFactory == 7){
+ mes "^3131FFThe conveyor's movements";
+ mes "look jittery and clumsy. The";
+ mes "mechanical arm also doesn't";
+ mes "look powerful enough to bear";
+ mes "the loads that it's carrying. The";
+ mes "screws in the conveyor look";
+ mes "loose and rusted over.";
+ set EinFactory,8;
+ close;
+ }
+ end;
+}
+
+ein_in01.gat,100,267,4 script Pipe 111,{
+
+ if(EinFactory == 9){
+ mes "^3131FFThe inspection of this";
+ mes "pipe didn't take very long.";
+ mes "It's bloated and worn out";
+ mes "from long durations of";
+ mes "being overloaded with";
+ mes "pressure. It's a wonder";
+ mes "it hasn't exploded yet.";
+ set EinFactory,10;
+ close;
+ }
+ end;
+}
+
+ein_in01.gat,95,238,4 script Conveyor#02 111,{
+
+ if(EinFactory == 11){
+ mes "^3131FFThis conveyor seems";
+ mes "to have similiar problems";
+ mes "as its smaller version. Its";
+ mes "movements are awkward,";
+ mes "erratic and weak, and almost";
+ mes "all of its screws are rusted.";
+ set EinFactory,12;
+ close;
+ }
+ end;
+}
+//============================================================
+//=============================================== Einbroch Uwe
+//====================================================== Quest
+einbroch.gat,215,180,5 script Uwe Kleine 85,{
+
+ if(EinUwe == 2)goto s_Cont2;
+ if(EinUwe == 1)goto s_Cont;
+ mes "[Uwe]";
+ mes "Cooking is such a joy~!";
+ mes "The scents, the flavors, the";
+ mes "sensation of sheer ^EFAEBDsatiation^000000...";
+ next;
+ menu "Um, isn't this a forge?",s_Forge,"Ignore him.",-;
+
+ mes "[Uwe]";
+ mes "Cooking begins with";
+ mes "fire and ends with fire.";
+ mes "There's a certain art to";
+ mes "creating fine, delicious";
+ mes "foods to delight the palate~";
+ close;
+
+s_Forge:
+ mes "[Uwe]";
+ mes "Is this a forge?";
+ mes "Oh, sugar honey,";
+ mes "you haven't been here";
+ mes "before, haven't you?";
+ next;
+ mes "[Uwe]";
+ mes "My name is Uwe Kleine";
+ mes "and this is my forge~! I am";
+ mes "the most elegant Blacksmith";
+ mes "and the best chef here in the";
+ mes "Schwartzwald Republic~";
+ next;
+ mes "[Uwe]";
+ mes "So, how can";
+ if(Sex){
+ mes "I help you, you";
+ mes "adoooooooooorable";
+ mes "hunk of a man?";
+ }else{
+ mes "I help you?";
+ }
+ next;
+ menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Master, I want to learn cooking.",s_Cook,"Cancel.",-;
+
+ mes "[Uwe]";
+ mes "Take care,";
+ mes "sugar honey~";
+ mes "Ho ho ho!";
+ close;
+
+s_Ein:
+ mes "[Uwe]";
+ mes "Einbroch was originally";
+ mes "build to support Einbech's";
+ mes "mining efforts. Because it's";
+ mes "small and crowded with people,";
+ mes "there's no room to build the ore";
+ mes "refining factories over there.";
+ next;
+ mes "[Uwe]";
+ mes "Sine Einbroch used to be";
+ mes "an empty lot, it was perfect";
+ mes "for building factories. That's";
+ mes "what my grandfather told me a";
+ mes "long time ago. Anyway, Einbroch";
+ mes "quickly grew into a major city.";
+ next;
+ mes "[Uwe]";
+ mes "Now people think that this";
+ mes "city was never planned to be";
+ mes "just an extension of Einbech.";
+ mes "See that rampart over there?";
+ mes "It doesn't connection to Einbech";
+ mes "at all! No protection for them...";
+ next;
+ mes "[Uwe]";
+ mes "It's like the government";
+ mes "lost all interest in Einbech.";
+ mes "Even the miners there have";
+ mes "been moving here to work in";
+ mes "the factories. But more people";
+ mes "hasn't made this city more lively.";
+ next;
+ mes "[Uwe]";
+ mes "Einbroch may look modern";
+ mes "and exciting now, but soon";
+ mes "you'll see that there's no sign";
+ mes "of warmth or life. So... Just";
+ mes "don't live here in your old age.";
+ next;
+ menu "Then why are you here?",s_WhyHere,"I won't. Thanks for the advice.",-;
+
+ mes "[Uwe]";
+ mes "Oh, that is such";
+ mes "a good decision,";
+ mes "sugar honey! Oh, you";
+ mes "cutie adventurers are";
+ mes "so precious, so lovable.";
+ mes "^111111*Tee hee hee~*^000000";
+ next;
+ mes "[Uwe]";
+ mes "Well, that was";
+ mes "a fun talk. Come";
+ mes "back and visit, 'kay?";
+ mes "I'll miss you until";
+ mes "the next time~";
+ close;
+
+s_WhyHere:
+ mes "[Uwe]";
+ mes "Well, I have some";
+ mes "precious memories of";
+ mes "this place. Once, there was";
+ mes "a man who lived here who";
+ mes "was just like a father to me.";
+ next;
+ mes "[Uwe]";
+ mes "Oh, but I'm sure that";
+ mes "you don't want to hear";
+ mes "about that. Next time you";
+ mes "drop by, we'll talk about";
+ mes "something more fun, 'kay?";
+ mes "Buhbye for now, cutie~";
+ close;
+
+s_Weap:
+ mes "[Uwe]";
+ mes "Well...";
+ mes "I actually just";
+ mes "do smithing work";
+ mes "to create my own";
+ mes "cooking tools.";
+ next;
+ mes "[Uwe]";
+ mes "Oh, I understand";
+ mes "that somebody needs";
+ mes "to fight the monsters,";
+ mes "but I'm the wrong person";
+ mes "to ask for forging weapons.";
+ mes "I... am a strict pacifist~";
+ next;
+ mes "[Uwe]";
+ mes "Just go look";
+ mes "around for a little";
+ mes "bit, I'm sure you'll";
+ mes "find a Blacksmith";
+ mes "who's willing to forge";
+ mes "you a good weapon~";
+ close;
+
+s_Cook:
+ mes "[Uwe]";
+ mes "Mm...?";
+ mes "Did you just";
+ mes "say that you";
+ mes "want to learn";
+ mes "the art of cooking?";
+ next;
+ mes "[Uwe]";
+ mes "I'm sorry, but I can't";
+ mes "really give culinary";
+ mes "lessons. But I will";
+ mes "give good advice for";
+ mes "hopeful beginners.";
+ next;
+ mes "[Uwe]";
+ mes "Now...";
+ mes "For your tuiton";
+ mes "I'll need-- Gosh,";
+ mes "there's just so many";
+ mes "things. Get some paper,";
+ mes "and a pen for this list...";
+ next;
+ mes "[Uwe]";
+ mes "Just kidding!";
+ mes "^111111*Titter~* ^000000I don't need";
+ mes "much to make some";
+ mes "cooking utensils. Bring";
+ mes "6 ^0000FFLarge Jellopies^000000. That's it!";
+ next;
+ mes "[Uwe]";
+ mes "In return, I will give you";
+ mes "1 Coal and some useful";
+ mes "cooking advice for novices.";
+ mes "I give this advice for free to";
+ mes "my smithing colleages, though.";
+ next;
+ mes "[Uwe]";
+ mes "Why ^EFAEBDdon't^000000 you";
+ mes "become a Blacksmith?";
+ mes "I'm much more confident";
+ mes "in that field. ^111111*Tee hee~*^000000";
+ next;
+ mes "[Uwe]";
+ mes "Well, I'll be";
+ mes "waiting right";
+ mes "here until you";
+ mes "come back.";
+ mes "^111111...*Tee hee~*";
+ set EinUwe,1;
+ close;
+
+s_Cont:
+ mes "[Uwe]";
+ mes "Oh hello hello~";
+ mes "It's been a long";
+ mes "time since we've talked,";
+ mes "you cutie adventurer~";
+ next;
+ mes "[Uwe]";
+ mes "So, sugar honey,";
+ mes "how is it going with";
+ mes "the little favor I asked";
+ mes "you about last time?";
+ mes "Did you already forget";
+ mes "the 6 Large Jellopies?";
+ next;
+ menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Give him the Materials.",s_Material,"Cancel.",-;
+
+s_Material:
+ mes "[Uwe]";
+ if(countitem(7126) < 6){
+ mes "Huh...?";
+ mes "You brought";
+ if(countitem(7126))
+ mes "only " + countitem(7126) + " of them?";
+ else
+ mes "none at all...?";
+ mes "Next time, be sure";
+ mes "to bring 6 Large Jellopies,";
+ mes "okay? Don't forget, cutie~";
+ close;
+ }
+ delitem 7126,6;
+ getitem 1003,1;
+ set EinUwe,2;
+ mes "Thank you ^EFAEBDso^000000 much!";
+ mes "Here's the Coal I promised~";
+ next;
+ mes "[Uwe]";
+ mes "Now, I can't teach you everything";
+ mes "about cooking, but I will give you";
+ mes "some good advice for beginners.";
+ mes "I hope you pay attnetion, sugar";
+ mes "honey. Now what would you like";
+ mes "to hear more about? Hmm...?";
+ next;
+s_Menu3:
+ menu "Heart",s_Heart,"Ingredients",s_Ingredients,"Skills",s_Skills,"Tools",s_Tools,"Cancel.",-;
+
+ mes "[Uwe]";
+ mes "Take care,";
+ mes "sugar honey~";
+ mes "Ho ho ho!";
+ close;
+
+s_Heart:
+ mes "[Uwe]";
+ mes "Ah, heart. Just like forging,";
+ mes "you need passion and desire";
+ mes "to create something special.";
+ mes "Every smith and cook knows that";
+ mes "you can do anything if you have";
+ mes "the will and the commitments.";
+ next;
+ mes "[Uwe]";
+ mes "Well, that's all";
+ mes "I really have to";
+ mes "say about that. But";
+ mes "come back and chat";
+ mes "whenever you please.";
+ mes "...Behbie~";
+ close;
+
+s_Ingredients:
+ mes "[Uwe]";
+ mes "Now, for beginners,";
+ mes "learning to select";
+ mes "and use ingredients";
+ mes "is one of the most";
+ mes "important fundamentals.";
+ next;
+ mes "[Uwe]";
+ mes "Cooking is like forging";
+ mes "since specific ingredients";
+ mes "are needed to make specialty";
+ mes "items or dishes. You can't just";
+ mes "skip them if you really need";
+ mes "them, right? Right!";
+ next;
+ mes "[Uwe]";
+ mes "Once you make up your";
+ mes "mind to do something,";
+ mes "focus on finishing it, 'kay?";
+ mes "Never cut corners and always";
+ mes "dedicate yourself to make the";
+ mes "very best finished product~";
+ next;
+ mes "[Uwe]";
+ mes "Well, that was";
+ mes "a fun talk. Come";
+ mes "back and visit, 'kay?";
+ mes "I'll miss you until";
+ mes "the next time~";
+ mes "...Ho ho~";
+ close;
+
+s_Skills:
+ mes "[Uwe]";
+ mes "When you're beginning to learn";
+ mes "skills, you can't let yourself be";
+ mes "discouraged! Practice makes";
+ mes "perfect, you know? But never";
+ mes "use your lack of skills as an";
+ mes "excuse if you happen to fail...";
+ next;
+ mes "[Uwe]";
+ mes "Effort is also an essential";
+ mes "in forging and cooking! Now,";
+ mes "on the oher hand, if you put";
+ mes "in all the effort but didn't learn";
+ mes "any of the skills, you'll still get";
+ mes "nowhere fast, right? Right!";
+ next;
+ mes "[Uwe]";
+ mes "The key is to always";
+ mes "give 100% effort and work";
+ mes "on improving your skills.";
+ mes "Before you know it, you'll";
+ mes "be a respected master!";
+ next;
+ mes "[Uwe]";
+ mes "Well, that was";
+ mes "a fun talk. Come";
+ mes "back and visit, 'kay?";
+ mes "I'll miss you until";
+ mes "the next time~";
+ mes "...Ho ho~";
+ close;
+
+s_Tools:
+ mes "[Uwe]";
+ mes "Cooking is a little";
+ mes "easier if you have";
+ mes "nicer tools to use,";
+ mes "but that's it. Tools by";
+ mes "themselves can't make";
+ mes "just anybody a master.";
+ next;
+ mes "[Uwe]";
+ mes "In the end, the best";
+ mes "tools are the ones you're";
+ mes "most comfortable with using.";
+ mes "In fact, I still use the old knife";
+ mes "I used back when I was just";
+ mes "a little novice chef~";
+ next;
+ mes "[Uwe]";
+ mes "Well, that was";
+ mes "a fun talk. Come";
+ mes "back and visit, 'kay?";
+ mes "I'll miss you until";
+ mes "the next time~";
+ mes "...Ho ho~";
+ close;
+
+s_Cont2:
+ mes "[Uwe]";
+ mes "Ah, hello again,";
+ mes "cutie adventurer.";
+ mes "How can I help you?";
+ next;
+ menu "Talk about Einbroch",s_Ein,"Ask him to forge a Weapon.",s_Weap,"Talk about Cooking.",s_Cooking,"Cancel.",-;
+
+ mes "[Uwe]";
+ mes "Take care,";
+ mes "sugar honey~";
+ mes "Ho ho ho!";
+ close;
+
+s_Cooking:
+ mes "[Uwe]";
+ mes "Ooh, cooking!";
+ mes "So what did you";
+ mes "want to ask me...?";
+ next;
+ goto s_Menu3;
+
+OnHide:
+ specialeffect 16;
+ disablenpc "Uwe Kleine";
+ end;
+
+OnUnhide:
+ misceffect 215;
+ end;
+
} \ No newline at end of file
diff --git a/npc/quests/quests_geffen.txt b/npc/quests/quests_geffen.txt
index 628e1d3ae..2942f5a82 100644
--- a/npc/quests/quests_geffen.txt
+++ b/npc/quests/quests_geffen.txt
@@ -1,184 +1,184 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Geffen
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Welding Mask and Headset Quests.
-//===== Additional Comments: =================================
-//= 1.1 Fixed exploits [Lupus]
-//= 1.2 Removed Duplicates [Silent]
-//============================================================
-
-
-
-//==============================================================================================//
-// Blacksmith: 'Welding Mask' Quest
-//==============================================================================================//
-geffen_in.gat,144,166,4 script Blacksmith#01 63,{
- mes "[Blacksmith]";
- mes "Who am I?!........";
- emotion e_gasp;
- next;
- mes "[Blacksmith]";
- mes "Iam the one and only Veteran Blacksmith here!! Haven't you heard???";
- mes "I've been working for 30 years in this hot, bloody, Hellfire!";
- emotion e_no1;
- next;
- mes "[Blacksmith]";
- mes "Since I became a Blacksmith, I invented something really incredible..... wanna hear about it?";
- next;
- menu "I'd love to.",-, "Well, not really....",M_No;
-
- mes "[Blacksmith]";
- mes "Blacksmiths are always welding metals under the HOTEST and must grueling conditions!";
- mes "The tremendous heat from the metals is so intense that it almost feels as if your face is going to burn off....";
- emotion e_omg;
- next;
- mes "[Blacksmith]";
- mes "But with my great invention, Blacksmiths no longer have to fear their faces catching on fire! I call it the ^3355FF' Welding Mask'^000000!!";
- emotion e_ic;
- next;
- mes "[Blacksmith]";
- mes "By wearing this over ones face, one will be fully protected from scorching heat and flying debirs.";
- next;
- mes "[Blacksmith]";
- mes "So what do you think? For ^4455FF'50 Steels'^000000 and only ^4455FF2000 Zeny^000000, I can make you one.";
- next;
- menu "Hm.. Not bad. Alright.",-, "No thanks. I'd have no use for it.",sM_No;
-
- mes "[Blacksmith]";
- if(countitem(999) < 50 || Zeny < 2000) goto sL_NotEnuf;
- delitem 999,50;
- set Zeny, Zeny - 2000;
- mes "Great! I'll make one right away.......";
- next;
- mes "~!clonk!~!clank!~!bang!~ ~!clonk!~!clank!~!bang!~";
- next;
- mes "[Blacksmith]";
- mes "Here you are, your very own Welding Mask! It was a pleasure doing buisness with you!";
- getitem 2292,1;
- close;
-
- sL_NotEnuf:
- mes "Listen here.... I said I needed ^4455FF'50 Steels'^000000 and ^4455FF2000 Zeny^000000 to make you a Welding Mask.";
- emotion e_swt;
- close;
-
- sM_No:
- mes "[Blacksmith]";
- mes "Oh man... Your gonna regret not getting one. Trust me sooner or later you're gonna need a ^5555FFWelding Mask^000000.";
- mes "Everybody does.....";
- close;
-
- M_No:
- mes "[Blacksmith]";
- mes "Well then, stop wasting my time!";
- emotion e_pif;
- close;
-}
-
-
-//=============================================================================================//
-// Eric: Headset Quest
-//=============================================================================================//
-geffen_in.gat,30,71,4 script Eric 83,{
- mes "[Eric]";
- mes "Please listen to the story of my blessed grand father...";
- emotion e_sob;
- next;
- menu "Listen.",-, "Ask about Items needed.",M_Ask, "Make.",M_Make, "End Conversation.",M_End;
-
- mes "[Eric]";
- mes "My grand father passed away few years ago.... he was very special to me.....";
- next;
- mes "[Eric]";
- mes "For as long as I can remember, he was always there for me.";
- mes "He even took better care of me than did my own father, who was always busy with work.";
- next;
- mes "[Eric]";
- mes "To me, my grand father's library was always like a 'Fairyland'.";
- mes "I spent most of my time there and I learned a lot of things from his vast collection of books";
- next;
- mes "[Eric]";
- mes "Grand father was interested in alchemy and music, so his library was filled with many books on these subjects.";
- next;
- mes "[Eric]";
- mes "One day while I was in grand fathers library, I discovered an interesting design sheet.....";
- mes "It was a design for what look liked 'Ear Muffs'.... underneath the drawing was a description that read:";
- next;
- mes "[Eric]";
- mes "'When worn on over the ears, anything from music to the faintest whispers can be heard.";
- mes "The sounds are transmitted to the ears through a thin wire. Project Name: ^5555FFHeadset^000000";
- next;
- mes "[Eric]";
- mes "It was a project that my grand father was working on before he passed away.... unfortunately he was never able to finish it.....";
- next;
- mes "[Eric]";
- mes "That's why I made up my mind to pick up where he left off and finish his beloved project!";
- mes "I met with a few Alchemists and asked them to create a working prototype based on his plans.";
- next;
- mes "[Eric]";
- mes "But they were not able to understand my grand fathers concepts and therefore could not help me.";
- next;
- mes "[Eric]";
- mes "Even so I did not give up and decided to make it myself. So I studied and researched for many years....";
- mes "And now I have a full working knowledge of my grand fathers invention, the ^5555FFHeadset^000000!!";
- next;
- mes "[Eric]";
- mes "Yet there is still one obsticale that is keeping me from making it.... I do not have the materials necessary to make my grand fathers invention!";
- next;
- mes "[Eric]";
- mes "My only goal in life is to realize my grand fathers ideas and pay tribute to the man I hold so dear to my heart.......";
- emotion e_sob;
- next;
- mes "[Eric]";
- mes "If only I had those materials.... Hmm... would you be iterested in this project? All I ask is that you gather the right items for me....";
- emotion e_hmm;
- close;
-
- M_Ask:
- mes "[Eric]";
- mes "These are items needed for grand father's Headset:";
- mes "^3355FFSteel^000000 ^FF555540^000000";
- mes "^3355FFOridecon^000000 ^FF55551^000000";
- mes "^3355FFAlcohol^000000 ^FF55551^000000";
- mes "^3355FFCoal^000000 ^FF55551^000000";
- close;
-
- M_Make:
- mes "[Eric]";
- if(countitem(999) < 40 || countitem(984) < 1 || countitem(970)<1 || countitem(1003) < 1) goto L_NotEnuf;
- delitem 999,40;
- delitem 984,1;
- delitem 970,1;
- delitem 1003,1;
- mes "Oh this is GREAT!! You have all of the materials I need to make my grandfather's Headset!";
- emotion e_ic;
- next;
- mes "[Eric]";
- mes "Give me a few minutes to assemble it...............";
- next;
- getitem 5001,1;
- mes "[Eric]";
- mes "FINALLY!! It's complete! My grand father's Headset! Please take them... without your help this wouldn't have been possible.";
- emotion e_gasp;
- next;
- mes "[Eric]";
- mes "Thank so very much! Because of you, I could fullfill my grand father's wish. I just know he's smiling down on me from Heaven.....";
- emotion e_thx;
- close;
-
- L_NotEnuf:
- mes "Thank you for trying to help me but..... you don't seem to have all of the items I need.....";
- emotion e_swt;
- close;
- M_End:
- mes "[Eric]";
- mes "Farewell..... boo hoo....";
- emotion e_sob;
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Geffen
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Welding Mask and Headset Quests.
+//===== Additional Comments: =================================
+//= 1.1 Fixed exploits [Lupus]
+//= 1.2 Removed Duplicates [Silent]
+//============================================================
+
+
+
+//==============================================================================================//
+// Blacksmith: 'Welding Mask' Quest
+//==============================================================================================//
+geffen_in.gat,144,166,4 script Blacksmith#01 63,{
+ mes "[Blacksmith]";
+ mes "Who am I?!........";
+ emotion e_gasp;
+ next;
+ mes "[Blacksmith]";
+ mes "Iam the one and only Veteran Blacksmith here!! Haven't you heard???";
+ mes "I've been working for 30 years in this hot, bloody, Hellfire!";
+ emotion e_no1;
+ next;
+ mes "[Blacksmith]";
+ mes "Since I became a Blacksmith, I invented something really incredible..... wanna hear about it?";
+ next;
+ menu "I'd love to.",-, "Well, not really....",M_No;
+
+ mes "[Blacksmith]";
+ mes "Blacksmiths are always welding metals under the HOTEST and must grueling conditions!";
+ mes "The tremendous heat from the metals is so intense that it almost feels as if your face is going to burn off....";
+ emotion e_omg;
+ next;
+ mes "[Blacksmith]";
+ mes "But with my great invention, Blacksmiths no longer have to fear their faces catching on fire! I call it the ^3355FF' Welding Mask'^000000!!";
+ emotion e_ic;
+ next;
+ mes "[Blacksmith]";
+ mes "By wearing this over ones face, one will be fully protected from scorching heat and flying debirs.";
+ next;
+ mes "[Blacksmith]";
+ mes "So what do you think? For ^4455FF'50 Steels'^000000 and only ^4455FF2000 Zeny^000000, I can make you one.";
+ next;
+ menu "Hm.. Not bad. Alright.",-, "No thanks. I'd have no use for it.",sM_No;
+
+ mes "[Blacksmith]";
+ if(countitem(999) < 50 || Zeny < 2000) goto sL_NotEnuf;
+ delitem 999,50;
+ set Zeny, Zeny - 2000;
+ mes "Great! I'll make one right away.......";
+ next;
+ mes "~!clonk!~!clank!~!bang!~ ~!clonk!~!clank!~!bang!~";
+ next;
+ mes "[Blacksmith]";
+ mes "Here you are, your very own Welding Mask! It was a pleasure doing buisness with you!";
+ getitem 2292,1;
+ close;
+
+ sL_NotEnuf:
+ mes "Listen here.... I said I needed ^4455FF'50 Steels'^000000 and ^4455FF2000 Zeny^000000 to make you a Welding Mask.";
+ emotion e_swt;
+ close;
+
+ sM_No:
+ mes "[Blacksmith]";
+ mes "Oh man... Your gonna regret not getting one. Trust me sooner or later you're gonna need a ^5555FFWelding Mask^000000.";
+ mes "Everybody does.....";
+ close;
+
+ M_No:
+ mes "[Blacksmith]";
+ mes "Well then, stop wasting my time!";
+ emotion e_pif;
+ close;
+}
+
+
+//=============================================================================================//
+// Eric: Headset Quest
+//=============================================================================================//
+geffen_in.gat,30,71,4 script Eric 83,{
+ mes "[Eric]";
+ mes "Please listen to the story of my blessed grand father...";
+ emotion e_sob;
+ next;
+ menu "Listen.",-, "Ask about Items needed.",M_Ask, "Make.",M_Make, "End Conversation.",M_End;
+
+ mes "[Eric]";
+ mes "My grand father passed away few years ago.... he was very special to me.....";
+ next;
+ mes "[Eric]";
+ mes "For as long as I can remember, he was always there for me.";
+ mes "He even took better care of me than did my own father, who was always busy with work.";
+ next;
+ mes "[Eric]";
+ mes "To me, my grand father's library was always like a 'Fairyland'.";
+ mes "I spent most of my time there and I learned a lot of things from his vast collection of books";
+ next;
+ mes "[Eric]";
+ mes "Grand father was interested in alchemy and music, so his library was filled with many books on these subjects.";
+ next;
+ mes "[Eric]";
+ mes "One day while I was in grand fathers library, I discovered an interesting design sheet.....";
+ mes "It was a design for what look liked 'Ear Muffs'.... underneath the drawing was a description that read:";
+ next;
+ mes "[Eric]";
+ mes "'When worn on over the ears, anything from music to the faintest whispers can be heard.";
+ mes "The sounds are transmitted to the ears through a thin wire. Project Name: ^5555FFHeadset^000000";
+ next;
+ mes "[Eric]";
+ mes "It was a project that my grand father was working on before he passed away.... unfortunately he was never able to finish it.....";
+ next;
+ mes "[Eric]";
+ mes "That's why I made up my mind to pick up where he left off and finish his beloved project!";
+ mes "I met with a few Alchemists and asked them to create a working prototype based on his plans.";
+ next;
+ mes "[Eric]";
+ mes "But they were not able to understand my grand fathers concepts and therefore could not help me.";
+ next;
+ mes "[Eric]";
+ mes "Even so I did not give up and decided to make it myself. So I studied and researched for many years....";
+ mes "And now I have a full working knowledge of my grand fathers invention, the ^5555FFHeadset^000000!!";
+ next;
+ mes "[Eric]";
+ mes "Yet there is still one obsticale that is keeping me from making it.... I do not have the materials necessary to make my grand fathers invention!";
+ next;
+ mes "[Eric]";
+ mes "My only goal in life is to realize my grand fathers ideas and pay tribute to the man I hold so dear to my heart.......";
+ emotion e_sob;
+ next;
+ mes "[Eric]";
+ mes "If only I had those materials.... Hmm... would you be iterested in this project? All I ask is that you gather the right items for me....";
+ emotion e_hmm;
+ close;
+
+ M_Ask:
+ mes "[Eric]";
+ mes "These are items needed for grand father's Headset:";
+ mes "^3355FFSteel^000000 ^FF555540^000000";
+ mes "^3355FFOridecon^000000 ^FF55551^000000";
+ mes "^3355FFAlcohol^000000 ^FF55551^000000";
+ mes "^3355FFCoal^000000 ^FF55551^000000";
+ close;
+
+ M_Make:
+ mes "[Eric]";
+ if(countitem(999) < 40 || countitem(984) < 1 || countitem(970)<1 || countitem(1003) < 1) goto L_NotEnuf;
+ delitem 999,40;
+ delitem 984,1;
+ delitem 970,1;
+ delitem 1003,1;
+ mes "Oh this is GREAT!! You have all of the materials I need to make my grandfather's Headset!";
+ emotion e_ic;
+ next;
+ mes "[Eric]";
+ mes "Give me a few minutes to assemble it...............";
+ next;
+ getitem 5001,1;
+ mes "[Eric]";
+ mes "FINALLY!! It's complete! My grand father's Headset! Please take them... without your help this wouldn't have been possible.";
+ emotion e_gasp;
+ next;
+ mes "[Eric]";
+ mes "Thank so very much! Because of you, I could fullfill my grand father's wish. I just know he's smiling down on me from Heaven.....";
+ emotion e_thx;
+ close;
+
+ L_NotEnuf:
+ mes "Thank you for trying to help me but..... you don't seem to have all of the items I need.....";
+ emotion e_swt;
+ close;
+ M_End:
+ mes "[Eric]";
+ mes "Farewell..... boo hoo....";
+ emotion e_sob;
+ close;
+}
diff --git a/npc/quests/quests_gonryun.txt b/npc/quests/quests_gonryun.txt
index e7e7c231c..83000a5db 100644
--- a/npc/quests/quests_gonryun.txt
+++ b/npc/quests/quests_gonryun.txt
@@ -1,3493 +1,3493 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Gonryun
-//===== By: ==================================================
-//= KarLaeda
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1
-//===== Description: =========================================
-//= Gonryun Broken Sword Quest
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-gon_in.gat,17,93,5 script Chief#gnbs 775,{
- mes "[SaYumMoon]";
- if (BaseLevel <= 50) {
- mes "hmm...";
- mes "Oh, Hi there~";
- mes "I am SaYumMoon, a chief of";
- mes "this village.";
- mes "Welcome to Kunlun.";
- next;
- mes "[SaYumMoon]";
- mes "Well, to tell you about this village..";
- mes "We weren't that much associated with ";
- mes "other villages.";
- mes "Nevertheless, through the village named";
- mes "Alberta, we allowed people to visit";
- mes "here. It all happened lately.";
- next;
- mes "[SaYumMoon]";
- mes "I feel that this town has been";
- mes "isolated for too long.";
- mes "Therefore, people in this town";
- mes "are not yet so friendly with";
- mes "visitors yet.";
- next;
- mes "[SaYumMoon]";
- mes "Moreover, thieves are having";
- mes "fun in this town lately.";
- mes "Well, you've come to visit this";
- mes "town.. Enjoy your stay.";
- close;
- }
- if (b_sword == 0) {
- set b_sword,1;
- mes "hmm...";
- mes "Oh, Hi there~";
- mes "I am SaYumMoon, a chief of";
- mes "this village.";
- mes "Welcome to Kunlun.";
- next;
- mes "[SaYumMoon]";
- mes "Well, to tell you about this village..";
- mes "We weren't that much associated with ";
- mes "other villages.";
- mes "Nevertheless, through the village named";
- mes "Alberta, we allowed people to visit";
- mes "here. It all happened lately.";
- next;
- mes "[SaYumMoon]";
- mes "I feel that this town has been";
- mes "isolated for too long.";
- mes "Therefore, people in this town";
- mes "are not yet so friendly with";
- mes "visitors yet.";
- next;
- mes "[SaYumMoon]";
- mes "Moreover, thieves are having";
- mes "fun in this town lately.";
- mes "Well, you've come to visit this";
- mes "town.. Enjoy your stay.";
- close;
- }
- if (b_sword < 18) {
- switch (b_sword) {
- case 1:
- mes "Umm....";
- mes "Oh, Hi there~";
- mes "I am SaYumMoon, a chief of";
- mes "this village.";
- next;
- mes "[SaYumMoon]";
- mes "Welcome to Kunlun.";
- mes "I feel that this village has been";
- mes "isolated for too long";
- mes "unlike other villages.";
- next;
- mes "[SaYumMoon]";
- mes "Nevertheless, through the village named";
- mes "Alberta, we allowed people to visit";
- mes "here. It all happened lately.";
- mes "Since our village has been";
- next;
- mes "[SaYumMoon]";
- mes "isolated for long time,";
- mes "people in this town";
- mes "are not yet so friendly with";
- mes "visitors yet.";
- mes "Moreover, thieves are having";
- next;
- mes "[SaYumMoon]";
- mes "fun in this town lately.";
- mes "Well, you've come to visit this";
- mes "town.. Enjoy your stay.";
- break;
- case 2:
- mes "Oh, it's you~";
- mes "How do you like it here so far?";
- mes "Like you've noticed,";
- mes "village is not so peaceful huh?";
- next;
- if(select("It's alright.:I heard that something was stolen..") == 1){
- mes "[SaYumMoon]";
- mes "Good...";
- mes "Well, watch out for robbery.";
- mes "And..don't act suspicious";
- mes "in the village.";
- close;
- }
- mes "[SaYumMoon]";
- mes "hmm..you heard of it?";
- mes "It was just last night when robbery";
- mes "occurred. The rumor was true..";
- mes "Lots of thieves are out there in the village.";
- next;
- switch(select("......:What was stolen?:Anyone with injuries?")){
- case 1:
- mes "[SaYumMoon]";
- mes "Can't believe it really happened.";
- mes "If you see anyone suspicious,";
- mes "please let me know.";
- set b_sword,3;
- break;
- case 2:
- mes "[SaYumMoon]";
- mes "um.....";
- mes "that is....";
- mes "just an ordinary sword.";
- mes "But to us, it's a family treasure";
- mes "from generation to generation.";
- next;
- mes "[SaYumMoon]";
- mes "I must find this sword";
- mes "no mattter what!";
- mes "...but I can't go find it just";
- mes "by myself. I am too busy.";
- next;
- mes "[SaYumMoon]";
- mes "You know how busy it is to be a";
- mes "chief of village.";
- mes "This is a big trouble...hmm...";
- next;
- if (select("Hope you find it soon.:Can I find it for you?") == 1){
- mes "[SaYumMoon]";
- mes "um..thank you.";
- mes "Perhaps you find a sword, ";
- mes "please let me know.";
- set b_sword,11;
- } else {
- mes "[SaYumMoon]";
- mes "Oh~ Are you serious??";
- mes "People in the village are";
- mes "now very sensitive cause of";
- mes "thieves. It is so difficult to ask";
- mes "them for a help. If you would help";
- mes "me to find a sword. I'll pay for that for sure.";
- set b_sword,3;
- }
- break;
- case 3:
- mes "[SaYumMoon]";
- mes "Fortunately, no one's hurt.";
- mes "But we lost something valuable.";
- mes "It's a family treasure";
- mes "which came from generation";
- mes "to generation.";
- next;
- mes "[SaYumMoon]";
- mes "I must find this sword";
- mes "no mattter what!";
- mes "...but I can't go find it just";
- mes "by myself. I am too busy.";
- next;
- mes "[SaYumMoon]";
- mes "You know how busy it is to be a";
- mes "chief of village.";
- mes "This is a big trouble...hmm...";
- next;
- if (select("Hope you find it soon.:Can I find it for you?") == 1){
- mes "[SaYumMoon]";
- mes "um..thank you.";
- mes "Perhaps you find a sword, ";
- mes "please let me know.";
- set b_sword,11;
- } else {
- mes "[SaYumMoon]";
- mes "Oh~ Are you serious??";
- mes "People in the village are";
- mes "now very sensitive cause of";
- mes "thieves. It is so difficult to ask";
- mes "them for a help. If you would help";
- mes "me to find a sword. I'll pay for that for sure.";
- set b_sword,3;
- }
- break;
- }
- break;
- case 3:
- mes "Haven't found it yet?";
- mes "No rush. Take it easy.";
- mes "You have to take care of";
- mes "youself first before";
- mes "doing other's favors.";
- break;
- case 4:
- mes "Haven't found it yet?";
- mes "No rush. Take it easy.";
- mes "You have to take care of";
- mes "youself first before";
- mes "doing other's favors.";
- break;
- case 5:
- mes "Haven't found it yet?";
- mes "No rush. Take it easy.";
- mes "You have to take care of";
- mes "youself first before";
- mes "doing other's favors.";
- break;
- case 6:
- mes "Oh, you found a traces?";
- mes "You're doing a good work.";
- mes "This is my family remedies.";
- mes "It might help you.";
- set b_sword,7;
- getitem 504,3; // White_Potion
- break;
- case 7:
- mes "Thief is in an injury.";
- mes "He probably is not";
- mes "far away from here.";
- break;
- case 8:
- mes "Oh, my sword...";
- mes "..it's broken?";
- mes "Unbelievable~";
- mes "How could this happen..";
- mes "Would you also look for";
- mes "the other parts please?";
- break;
- case 9:
- mes "hmm...";
- mes "..my sword... in pieces..";
- mes "I beg you please. Find it for me.";
- mes "You'll get something in return.";
- break;
- case 10:
- mes "Oh~~";
- mes "You've found the pieces for me~";
- mes "I knew you would've make it.";
- mes "But they are broken into pieces.";
- mes "What should I do...";
- next;
- mes "[SaYumMoon]";
- mes "If it's ok with you,";
- mes "Would you repair my sword for me?";
- mes "I'm sure I'll pay for that.";
- next;
- if (select("No way.:Alright.") == 1) {
- mes "[SaYumMoon]";
- mes "Well, yes.. you've been such a";
- mes "nice person. I appreciate for";
- mes "your hard work.";
- mes "It would be better if you help me";
- mes "to repair the sword for me though..";
- mes "nono.. I am not enforcing you..";
- next;
- mes "[SaYumMoon]";
- mes "I'll find someway to repair it.";
- mes "Without your help, I could've done";
- mes "nothing. This is not a big present";
- mes "but please take it.";
- set b_sword,15;
- getitem 603,1; // Old_Blue_Box
- next;
- mes "[SaYumMoon]";
- mes "If you get any informations or";
- mes "traces about that damn thief,";
- mes "please let me know.";
- mes "I got my sword back but there's";
- mes "no way I can forgive that thief.";
- mes "Have a nice travel.";
- } else {
- mes "[SaYumMoon]";
- mes "Wow..you are so nice.";
- mes "I am owing you a big favor.";
- mes "I have no idea how this sword";
- mes "broke into pieces.";
- mes "I believe you have to find famous";
- mes "blacksmith to repair it.";
- next;
- mes "[SaYumMoon]";
- mes "Like you know already, this is";
- mes "a family treasure for me.";
- mes "oh.. one more thing..";
- next;
- mes "[SaYumMoon]";
- mes "There's a guy named ^555555Choahk^000000";
- mes "in the village. He has been to many";
- mes "places all around the world.";
- mes "He probably has the informations";
- mes "you need. Go find him first.";
- next;
- mes "[SaYumMoon]";
- mes "and.. this is not a big gift";
- mes "but please take it..";
- mes "here...";
- set b_sword,14;
- getitem 603,1; // Old_Blue_Box
- }
- break;
- case 11:
- mes "The village is not in a good";
- mes "mood at this moment, but still";
- mes "lots of things to look around.";
- break;
- case 12:
- mes "hmm.. no traces? no marks?... nothing?";
- mes "ok.. well, thanks for help anyways.";
- mes "umm....";
- next;
- mes "[SaYumMoon]";
- mes "Here..take this.";
- mes "Have a good time.";
- set b_sword,13;
- getitem 504,1; // White_Potion
- break;
- case 13:
- mes "Everything going well?";
- mes "The village is not in a good mood.";
- mes "Take care of yourself.";
- break;
- case 14:
- mes "I appreciate what you are doing.";
- mes "You make me feel comfortable.";
- mes "Village seems it's turning back";
- mes "to old times too. huhu";
- break;
- case 15:
- mes "I appreciate what you are doing.";
- mes "You make me feel comfortable.";
- mes "Village seems it's turning back";
- mes "to old times too. huhu";
- break;
- case 16:
- mes "I appreciate what you are doing.";
- mes "You make me feel comfortable.";
- mes "Village seems it's turning back";
- mes "to old times too. huhu";
- break;
- case 17:
- mes "I appreciate what you are doing.";
- mes "You make me feel comfortable.";
- mes "Village seems it's turning back";
- mes "to old times too. huhu";
- break;
- }
- } else if (b_sword < 32) {
- mes "I appreciate what you are doing.";
- mes "You make me feel comfortable.";
- mes "Village seems it's turning back";
- mes "to old times too. huhu";
- mes "and please repair my";
- mes "sword for me.";
- next;
- mes "[SaYumMoon]";
- mes "You've done so many things for me.";
- mes "I feel sorry about asking you";
- mes "more to do.";
- } else if (b_sword == 32) {
- if (countitem(1123) < 1) { // Haedonggum
- mes "um.....";
- mes "Not yet huh?";
- mes "You'll repair it for me right?";
- mes "I'll be waiting.";
- } else {
- mes "oh.. it's you.";
- mes "............";
- mes "Is that my sword?";
- mes "Wow you have done it.";
- mes "Good work!";
- next;
- mes "[SaYumMoon]";
- mes "Hmm..If you have a similar sword I have,";
- mes "please leave it somewhere else and come back.";
- mes "Just in case that you give me a wrong one...";
- next;
- if(select("Wait for sec:Here it is.") == 1 || countitem(1123) < 1){
- mes "[SaYumMoon]";
- mes "Ok, go ahead.";
- mes "Don't leave mine!!";
- mes "haha..";
- close;
- }
- mes "[SaYumMoon]";
- mes "This is a small gift for you.";
- mes "Please take it.";
- mes "Thanks for a job well done!";
- delitem 1123,1; // Haedonggum
- set b_sword,33;
- getitem 2404,1; // Shoes_
- next;
- mes "[SaYumMoon]";
- mes "Many thanks for your trouble.";
- mes "Now I don't feel shame to";
- mes "ancestors anymore.";
- mes "huhuh...";
- mes "Have a good time.";
- }
- } else {
- mes "Oh, it's you.";
- mes "Once again, thank you.";
- mes "Enjoy your stay in";
- mes "our village.";
- mes "huhuh..";
- }
- close;
-}
-
-gon_in.gat,152,35,4 script Hostess#gnbs 702,{
- mes "[MaYumBang]";
- if (b_sword < 1) {
- mes "Oh.. you're new here right?";
- mes "Came from out of town?";
- mes "It's easy to see many people from";
- mes "out of town these days.";
- mes "It made people in the village busy.";
- next;
- mes "[MaYumBang]";
- mes "Oops, what am I saying..";
- mes "Wants some wine?";
- next;
- if (select("Yes, please:No, it's ok.") == 1) {
- mes "[MaYumBang]";
- mes "Oooops.. oh no...";
- mes "Many customers came by earlier and";
- mes "we are out of wine..";
- mes "Customers are growing larger.";
- mes "It is also a trouble..";
- } else {
- mes "[MaYumBang]";
- mes "Well, have fun in the village.";
- mes "Stop by sometimes.";
- }
- } else if (b_sword < 3) {
- mes "You know what?";
- mes "Chief's house was robbed last night.";
- mes "I can't believe this happened.";
- mes "Thieves are hanging around the";
- mes "village these days.";
- next;
- mes "[MaYumBang]";
- mes "How anxious it is..";
- mes "It could also happen to my shop.";
- mes "I should watch out.";
- mes "oh..what am I saying to you..";
- mes "Enjoy your time in my shop..hoho.";
- if (b_sword == 1) set b_sword,2;
- } else if (b_sword == 3) {
- mes "Oh, it's you again.";
- mes "I heard that you decided to";
- mes "help our chief.";
- mes "Please get him for us.";
- mes "How anxious it is..";
- next;
- mes "[MaYumBang]";
- mes "Do you see that guy over there";
- mes "leaning on the table?";
- mes "He seems to know about last night's";
- mes "happenings.";
- mes "He has been drinking all night long.";
- set b_sword,4;
- } else if (b_sword > 3 && b_sword < 11) {
- mes "Hello there.";
- mes "Feel something strange in the village huh?";
- mes "It's all because of the thieves.";
- mes "And it makes my business worse.";
- mes "peeew...";
- } else if (b_sword == 11 || b_sword == 12) {
- mes "Feel something strange in the village huh?";
- mes "Hope the thief to get caught in short time.";
- mes "...";
- } else {
- mes "You caught him?";
- mes "Wow, how brave you are.";
- mes "I should get ready to run the";
- mes "shop again. I need to order";
- mes "some wine first.";
- next;
- mes "[MaYumBang]";
- mes "SulBoong drank all the wine in the shop.";
- mes "I did not refill the wine since there";
- mes "aren't any customers...hoho.";
- mes "Stop by next time.";
- mes "I'll have a wine ready.";
- }
- close;
-}
-
-gon_in.gat,165,16,4 script Man in hangover#gnbs 748,{
- mes "[SulBoong]";
- if (b_sword < 4) {
- mes "Ahhh.. my stomach.. my head..";
- mes "Shouldn't drink so much..";
- mes "Ehhhh....";
- emotion e_swt2;
- } else if (b_sword == 4) {
- if (countitem(506) < 1) { // Green_Potion
- mes "Ehhh....";
- mes "Can somebody bring me a potion?";
- mes "Ehhh....";
- close;
- }
- mes "Ehhh..my stomach..";
- mes "I need something..";
- mes "Ehhh..";
- mes "uh..hey you.. could you give me one of";
- mes "your ^00FF00Green_Potion^000000 to me?";
- mes "I got a mad stomach.";
- next;
- if (select("No.:Ok, here.") == 1 || countitem(506) < 1) {
- mes "[SulBoong]";
- mes "Ehh...";
- mes "Are you sure?";
- next;
- if (select("Sorry, I don't have one.:Ok, here it is.") == 1 || countitem(506) < 1) {
- mes "[SulBoong]";
- mes "Wooo..";
- mes "Go away man..";
- set b_sword,12;
- close;
- }
- delitem 506,1; // Green_Potion
- set b_sword,5;
- mes "[SulBoong]";
- mes "Oh.. thanks.";
- mes "I thought you're teasing me.";
- mes "I feel much better now.";
- mes "By the way.. You got any questions?";
- next;
- if (select("About thief.:Nothing.") == 1){
- mes "[SulBoong]";
- mes "Ah~ a thief..";
- mes "hmm.. let me see..";
- mes "I went out for walk in the middle";
- mes "of night while I was drinking.";
- mes "And I heard something noisy.";
- next;
- mes "[SulBoong]";
- mes "I looked around and found that";
- mes "area near chief's house was brighter";
- mes "than any other area. It was strange.";
- mes "So I kept watching at it and";
- mes "all of a sudden, I saw something moving";
- mes "on the roof of houses.";
- next;
- mes "[SulBoong]";
- mes "It disappeared in a second.";
- mes "I was drunk, and it was dark outside.";
- mes "I have no idea whether it was a man or a cat or..";
- mes "don't know what it was.. huhu..";
- set b_sword,6;
- } else {
- mes "[SulBoong]";
- mes "Ok, then, good bye..";
- mes "Don't be a drinker like me.";
- mes "Unless you want to suffer from a hangovers.";
- mes "huhu..";
- }
- } else {
- delitem 506,1; // Green_Potion
- set b_sword,5;
- emotion e_thx;
- mes "[SulBoong]";
- mes "Thank you.";
- mes "heew.. feel much better now.";
- mes "hmm.. you seem like you got";
- mes "something to ask me.";
- next;
- switch(select("About thief..:How much have you been drinking?:Nothing..")){
- case 1:
- mes "[SulBoong]";
- mes "Ah~ a thief..hmm...";
- mes "I went out for walk in the middle";
- mes "of night while I was drinking.";
- mes "And I heard something noisy.";
- mes "I looked around and found that";
- mes "area near chief's house was brighter";
- next;
- mes "[SulBoong]";
- mes "than any other area. It was strange.";
- mes "So I kept watching at it and";
- mes "all of a sudden, I saw something moving";
- mes "on the roof of houses.";
- mes "It disappeared in a second.";
- next;
- if (select("Where to?:Probably a cat.") == 1) {
- mes "[SulBoong]";
- mes "Umm?";
- mes "Well..let me see..";
- mes "It came from... and head to...um...";
- mes "bla bla..";
- next;
- mes "He was mumbling for awhile";
- mes "......";
- next;
- mes "[SulBoong]";
- mes "Ah ha~ right...";
- mes "A shrine.. yes..thief was heading to";
- mes "a shrine and disappeared.";
- mes "I'm not sure if it was a human or";
- mes "an animal...but little big creature.";
- mes "wonder what it was..";
- set b_sword,6;
- next;
- mes "[SulBoong]";
- mes "Anything else I can help?";
- mes "Thanks for the potion.";
- next;
- switch(select("Thanks for the information.:Stop drinking too much.:Ok, bye")){
- case 1:
- mes "[SulBoong]";
- mes "I'll see you later then.";
- mes "I am always here drinking..huhu";
- break;
- case 2:
- mes "[SulBoong]";
- mes "hmm..";
- mes "Don't mind me.";
- break;
- case 3:
- mes "[SulBoong]";
- mes "Alrighty.";
- mes "Come again whenever you find";
- mes "any other questions.";
- break;
- }
- } else {
- mes "[SulBoong]";
- mes "Yeah..maybe.";
- mes "It was so dark outside and I was drunk.";
- mes "I can't remember it clearly.";
- mes "Anyways it was bigger than a cat for sure.";
- }
- break;
- case 2:
- mes "[SulBoong]";
- mes "Ah..um....I..I am not sure.";
- mes "When I woke up, There were so many";
- mes "empty bottles around me.";
- mes ".....";
- next;
- mes "^00FF00.......";
- mes "Without a specific reason, he seemed to be very respectable.^000000";
- break;
- case 3:
- mes "[SulBoong]";
- mes "alright then.";
- mes "Hope you don't ever drink like me";
- mes "in the future.";
- mes "You'll suffer for long time if you do.";
- mes "You know what hangover is right?";
- break;
- }
- }
- } else if (b_sword == 5) {
- mes "Oh, it's you.";
- mes "Thanks for the portion last time.";
- mes "What are you up to?";
- mes "Got any question for me?";
- next;
- if (select("About a thief last night...:Nope, just passing by..") == 1){
- mes "[SulBoong]";
- mes "Ah~ a thief..";
- mes "hmm.. let me see..";
- mes "I went out for walk in the middle";
- mes "of night while I was drinking.";
- mes "And I heard something noisy.";
- mes "I looked around and found that";
- next;
- mes "[SulBoong]";
- mes "area near chief's house was brighter";
- mes "than any other area. It was strange.";
- mes "So I kept watching at it and";
- mes "all of a sudden, I saw something moving";
- mes "on the roof of houses.";
- next;
- mes "[SulBoong]";
- mes "It disappeared in a second.";
- mes "I was drunk, and it was dark outside.";
- mes "I have no idea whether it was a man or a cat or..";
- mes "don't know what it was.. huhu..";
- set b_sword,6;
- } else {
- mes "[SulBoong]";
- mes "alright then.";
- mes "Hope you don't ever drink like me";
- mes "in the future.";
- mes "bye.";
- }
- } else if (b_sword < 11) {
- mes "Well, do your job well.";
- mes "To keep the peace in our village,";
- mes "we need to take chief's worries out.";
- } else if (b_sword <14) {
- switch (b_sword) {
- case 11:
- mes "Ahhh.. my stomach.. my head..";
- mes "Shouldn't drink so much..";
- mes "Ehhhh....";
- emotion e_swt2;
- break;
- case 12:
- mes "Ehhhh..go away.";
- mes "You're a man with no mercy.";
- mes "ehhh...";
- emotion e_pif;
- break;
- case 13:
- mes "Ehhhh..go away.";
- mes "You're such a coldhearted man.";
- mes "ehhh...";
- emotion e_pif;
- break;
- }
- } else {
- mes "Wahahaha.";
- mes "So..you found a chief's belongging's?";
- mes "I knew you could've done it.";
- mes "You're brave enough to do anything.";
- mes "Wahahaha.";
- }
- close;
-}
-
-gon_dun01.gat,148,156,0 script start01#gnbs -1,{
- OnInit:
- sleep 10000;
- OnCommandOn:
- donpcevent "trace1-"+rand(1,5)+"::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,201,25,0 script trace1-1#gnbs 139,1,1,{
- if (b_sword == 7) donpcevent "timer1-1::OnCommandOn";
- end;
-
- OnTimer10000:
- stopnpctimer;
- disablenpc "trace1-1#gnbs";
- donpcevent "start01#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace1-1#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace1-1#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun01.gat,2,1,0 script timer1-1 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer1-1";
- end;
-
- OnCommandOn:
- enablenpc "timer1-1";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer1-1";
- end;
-
- OnTimer3000:
- donpcevent "#getitem1-1::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,202,25,0 script #getitem1-1 111,2,1,{
- if (b_sword != 7) end;
- set b_sword,8;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem1-1";
- end;
-
- OnCommandOn:
- enablenpc "#getitem1-1";
- donpcevent "timer1-1::OnCommandOff";
- donpcevent "start01#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem1-1";
- end;
-}
-
-gon_dun01.gat,190,160,0 script trace1-2#gnbs 139,1,1,{
- if (b_sword == 7) donpcevent "timer1-2::OnCommandOn";
- end;
-
- OnTimer100000:
- stopnpctimer;
- disablenpc "trace1-2#gnbs";
- donpcevent "start01#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace1-2#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace1-2#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun01.gat,3,1,0 script timer1-2 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer1-2";
- end;
-
- OnCommandOn:
- enablenpc "timer1-2";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer1-2";
- end;
-
- OnTimer3000:
- donpcevent "#getitem1-2::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,190,159,0 script #getitem1-2 111,2,1,{
- if (b_sword != 7) end;
- set b_sword,8;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem1-2";
- end;
-
- OnCommandOn:
- enablenpc "#getitem1-2";
- donpcevent "timer1-2::OnCommandOff";
- donpcevent "start01#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem1-2";
- end;
-}
-
-gon_dun01.gat,163,53,0 script trace1-3#gnbs 139,1,1,{
- if (b_sword == 7) donpcevent "timer1-3::OnCommandOn";
- end;
-
- OnTimer90000:
- stopnpctimer;
- disablenpc "trace1-3#gnbs";
- donpcevent "start01#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace1-3#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace1-3#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun01.gat,4,1,0 script timer1-3 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer1-3";
- end;
-
- OnCommandOn:
- enablenpc "timer1-3";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer1-3";
- end;
-
- OnTimer3000:
- donpcevent "#getitem1-3::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,164,53,0 script #getitem1-3 111,2,1,{
- if (b_sword != 7) end;
- set b_sword,8;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem1-3";
- end;
-
- OnCommandOn:
- enablenpc "#getitem1-3";
- donpcevent "timer1-3::OnCommandOff";
- donpcevent "start01#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem1-3";
- end;
-}
-
-gon_dun01.gat,133,183,0 script trace1-4#gnbs 139,1,1,{
- if (b_sword == 7) donpcevent "timer1-4::OnCommandOn";
- end;
-
- OnTimer150000:
- stopnpctimer;
- disablenpc "trace1-4#gnbs";
- donpcevent "start01#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace1-4#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace1-4#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun01.gat,5,1,0 script timer1-4 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer1-4";
- end;
-
- OnCommandOn:
- enablenpc "timer1-4";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer1-4";
- end;
-
- OnTimer3000:
- donpcevent "#getitem1-4::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,134,183,0 script #getitem1-4 111,2,1,{
- if (b_sword != 7) end;
- set b_sword,8;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem1-4";
- end;
-
- OnCommandOn:
- enablenpc "#getitem1-4";
- donpcevent "timer1-4::OnCommandOff";
- donpcevent "start01#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem1-4";
- end;
-}
-
-gon_dun01.gat,139,257,0 script trace1-5#gnbs 139,1,1,{
- if (b_sword == 7) donpcevent "timer1-5::OnCommandOn";
- end;
-
- OnTimer170000:
- stopnpctimer;
- disablenpc "trace1-5#gnbs";
- donpcevent "start01#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace1-5#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace1-5#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun01.gat,6,1,0 script timer1-5 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer1-5";
- end;
-
- OnCommandOn:
- enablenpc "timer1-5";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer1-5";
- end;
-
- OnTimer3000:
- donpcevent "#getitem1-5::OnCommandOn";
- end;
-}
-
-gon_dun01.gat,140,257,0 script #getitem1-5 111,2,1,{
- if (b_sword != 7) end;
- set b_sword,8;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem1-5";
- end;
-
- OnCommandOn:
- enablenpc "#getitem1-5";
- donpcevent "timer1-5::OnCommandOff";
- donpcevent "start01#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem1-5";
- end;
-}
-
-gon_dun02.gat,1,1,0 script start02#gnbs -1,{
- OnInit:
- sleep 10000;
- OnCommandOn:
- donpcevent "trace2-"+rand(1,6)+"::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,65,168,0 script trace2-1#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-1::OnCommandOn";
- end;
-
- OnTimer80000:
- stopnpctimer;
- disablenpc "trace2-1#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-1#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-1#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,2,1,0 script timer2-1 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-1";
- end;
-
- OnCommandOn:
- enablenpc "timer2-1";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-1";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-1::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,202,25,0 script #getitem2-1 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-1";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-1";
- donpcevent "timer2-1::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-1";
- end;
-}
-
-gon_dun02.gat,265,200,0 script trace2-2#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-2::OnCommandOn";
- end;
-
- OnTimer130000:
- stopnpctimer;
- disablenpc "trace2-2#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-2#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-2#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,3,1,0 script timer2-2 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-2";
- end;
-
- OnCommandOn:
- enablenpc "timer2-2";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-2";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-2::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,265,201,0 script #getitem2-2 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-2";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-2";
- donpcevent "timer2-2::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-2";
- end;
-}
-
-gon_dun02.gat,247,129,0 script trace2-3#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-3::OnCommandOn";
- end;
-
- OnTimer110000:
- stopnpctimer;
- disablenpc "trace2-3#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-3#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-3#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,4,1,0 script timer2-3 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-3";
- end;
-
- OnCommandOn:
- enablenpc "timer2-3";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-3";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-3::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,247,128,0 script #getitem2-3 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-3";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-3";
- donpcevent "timer2-3::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-3";
- end;
-}
-
-gon_dun02.gat,149,74,0 script trace2-4#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-4::OnCommandOn";
- end;
-
- OnTimer230000:
- stopnpctimer;
- disablenpc "trace2-4#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-4#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-4#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,5,1,0 script timer2-4 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-4";
- end;
-
- OnCommandOn:
- enablenpc "timer2-4";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-4";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-4::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,149,75,0 script #getitem2-4 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-4";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-4";
- donpcevent "timer2-4::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-4";
- end;
-}
-
-gon_dun02.gat,23,105,0 script trace2-5#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-5::OnCommandOn";
- end;
-
- OnTimer190000:
- stopnpctimer;
- disablenpc "trace2-5#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-5#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-5#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,6,1,0 script timer2-5 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-5";
- end;
-
- OnCommandOn:
- enablenpc "timer2-5";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-5";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-5::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,23,106,0 script #getitem2-5 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-5";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-5";
- donpcevent "timer2-5::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-5";
- end;
-}
-
-gon_dun02.gat,249,39,0 script trace2-6#gnbs 139,1,1,{
- if (b_sword == 8) donpcevent "timer2-6::OnCommandOn";
- end;
-
- OnTimer110000:
- stopnpctimer;
- disablenpc "trace2-6#gnbs";
- donpcevent "start02#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace2-6#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace2-6#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun02.gat,7,1,0 script timer2-6 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer2-6";
- end;
-
- OnCommandOn:
- enablenpc "timer2-6";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer2-6";
- end;
-
- OnTimer3000:
- donpcevent "#getitem2-6::OnCommandOn";
- end;
-}
-
-gon_dun02.gat,249,40,0 script #getitem2-6 111,2,1,{
- if (b_sword != 8) end;
- set b_sword,9;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- close;
-
- OnInit:
- disablenpc "#getitem2-6";
- end;
-
- OnCommandOn:
- enablenpc "#getitem2-6";
- donpcevent "timer2-6::OnCommandOff";
- donpcevent "start02#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem2-6";
- end;
-}
-
-gon_dun03.gat,1,1,0 script start03#gnbs -1,{
- OnInit:
- sleep 10000;
- OnCommandOn:
- donpcevent "trace3-"+rand(1,7)+"::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,11,75,0 script trace3-1#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-1::OnCommandOn";
- end;
-
- OnTimer200000:
- stopnpctimer;
- disablenpc "trace3-1#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-1#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-1#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,2,1,0 script timer3-1 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-1";
- end;
-
- OnCommandOn:
- enablenpc "timer3-1";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-1";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-1::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,10,74,0 script #getitem3-1 111,2,1,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-1";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-1";
- donpcevent "timer3-1::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-1";
- end;
-}
-
-gon_dun03.gat,199,103,0 script trace3-2#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-2::OnCommandOn";
- end;
-
- OnTimer130000:
- stopnpctimer;
- disablenpc "trace3-2#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-2#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-2#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,3,1,0 script timer3-2 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-2";
- end;
-
- OnCommandOn:
- enablenpc "timer3-2";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-2";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-2::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,199,102,0 script #getitem3-2 111,2,1,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-2";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-2";
- donpcevent "timer3-2::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-2";
- end;
-}
-
-gon_dun03.gat,14,162,0 script trace3-3#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-3::OnCommandOn";
- end;
-
- OnTimer110000:
- stopnpctimer;
- disablenpc "trace3-3#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-3#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-3#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,4,1,0 script timer3-3 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-3";
- end;
-
- OnCommandOn:
- enablenpc "timer3-3";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-3";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-3::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,14,163,0 script #getitem3-3 111,2,1,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-3";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-3";
- donpcevent "timer3-3::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-3";
- end;
-}
-
-gon_dun03.gat,155,263,0 script trace3-4#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-4::OnCommandOn";
- end;
-
- OnTimer230000:
- stopnpctimer;
- disablenpc "trace3-4#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-4#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-4#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,5,1,0 script timer3-4 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-4";
- end;
-
- OnCommandOn:
- enablenpc "timer3-4";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-4";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-4::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,156,263,0 script #getitem3-4 111,2,1,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-4";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-4";
- donpcevent "timer3-4::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-4";
- end;
-}
-
-gon_dun03.gat,169,90,0 script trace3-5#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-5::OnCommandOn";
- end;
-
- OnTimer190000:
- stopnpctimer;
- disablenpc "trace3-5#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-5#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-5#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,6,1,0 script timer3-5 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-5";
- end;
-
- OnCommandOn:
- enablenpc "timer3-5";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-5";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-5::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,170,90,0 script #getitem3-5 111,2,1,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-5";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-5";
- donpcevent "timer3-5::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-5";
- end;
-}
-
-gon_dun03.gat,162,40,0 script trace3-6#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-6::OnCommandOn";
- end;
-
- OnTimer110000:
- stopnpctimer;
- disablenpc "trace3-6#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-6#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-6#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,7,1,0 script timer3-6 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-6";
- end;
-
- OnCommandOn:
- enablenpc "timer3-6";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-6";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-6::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,68,39,0 script #getitem3-6 111,1,2,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-6";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-6";
- donpcevent "timer3-6::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-6";
- end;
-}
-
-gon_dun03.gat,68,212,0 script trace3-7#gnbs 139,1,1,{
- if (b_sword == 9) donpcevent "timer3-7::OnCommandOn";
- end;
-
- OnTimer110000:
- stopnpctimer;
- disablenpc "trace3-7#gnbs";
- donpcevent "start03#gnbs::OnCommandOn";
- end;
-
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "trace3-7#gnbs";
- end;
-
- OnCommandOn:
- enablenpc "trace3-7#gnbs";
- setnpctimer 0;
- startnpctimer;
- end;
-}
-
-gon_dun03.gat,6,1,0 script timer3-7 -1,{
- OnInit:
- initnpctimer;
- stopnpctimer;
- disablenpc "timer3-7";
- end;
-
- OnCommandOn:
- enablenpc "timer3-7";
- setnpctimer 0;
- startnpctimer;
- end;
-
- OnCommandOff:
- stopnpctimer;
- disablenpc "timer3-7";
- end;
-
- OnTimer3000:
- donpcevent "#getitem3-7::OnCommandOn";
- end;
-}
-
-gon_dun03.gat,68,213,0 script #getitem3-7 111,1,2,{
- if (b_sword != 9) end;
- set b_sword,10;
- mes "You found ^FF0000piece of blade^000000.";
- mes "Seems like it's a part of the sword you've been looking for.";
- mes "You put all the pieces on the ground";
- mes "and assembled them. Seems like you've found ";
- mes "all pieces of the blade.";
- close;
-
- OnInit:
- disablenpc "#getitem3-7";
- end;
-
- OnCommandOn:
- enablenpc "#getitem3-7";
- donpcevent "timer3-7::OnCommandOff";
- donpcevent "start03#gnbs::OnCommandOn";
-
- OnCommandOff:
- disablenpc "#getitem3-7";
- end;
-}
-
-gon_in,18,27,5 script Madam#gnbs 771,{
- mes "[SangHwaYeun]";
- mes "hohohohoho~";
- mes "Who might this be?";
- mes "A vistor from out of town~";
- mes "hohoho.";
- next;
- if (select("Hi, Madam~:Where's chief?") == 1) {
- mes "[SangHwaYeun]";
- mes "Hi, there~";
- close;
- }
- mes "[SangHwaYeun]";
- if (sex == 0) {
- mes "Hoho, he's upstairs.";
- mes "You're such a pretty lady.";
- mes "Don't be too fascinated by";
- mes "my husband. alright?";
- mes "Hohoho~";
- } else {
- mes "He's upstairs.";
- mes "You are such a handsome young man";
- mes "But not better than my huhsband.";
- mes "Hohoho..";
- }
- close;
-}
-
-gon_dun03,62,222,0 script Strange dead body#gnbs 111,{
- if (b_sword < 7) {
- mes "Here's a rotten dead body.";
- mes "Seemed to be eaten by monsters.";
- close;
- }
- if (b_sword > 6 && b_sword < 11) {
- mes "There's a paper between the bones";
- mes "of dead body.";
- mes "Take a look?";
- next;
- if (select("Yes.:Leave.") == 1) {
- mes "Paper is so worned out,";
- mes "but there's a words on it.";
- mes "It's written by a blood.";
- mes "So difficult to see the letter.";
- mes "Almost impossible to find out what's written.";
- next;
- mes "^FF0000Damn I can't...believe.. failed..";
- mes "Sayum... I should've..";
- mes "watchout...ehhh...but.. break";
- mes "..pieces...and seprate..";
- mes "I..with";
- mes "this...^000000";
- next;
- mes "Paper was all blood-stained.";
- mes "He probably couldn't make it any longer.";
- } else {
- mes "Felt something was missing.";
- mes "Blood-stained dead body was";
- mes "getting on my nerve";
- mes "But I just decided to leave from here.";
- }
- } else if (b_sword == 11 || b_sword == 12) {
- mes "Here's a ungly looking dead body.";
- mes "I should just pass by.";
- } else {
- mes "A skeleton eaten by many monsters.";
- mes "Felt pitable for awhile, but felt";
- mes "bad when looking at it for";
- mes "long time.";
- }
- close;
-}
-
-gonryun,139,142,7 script Girl##gnbs1 772,{
- mes "[SaEunSo]";
- if (b_sword < 12) {
- mes "..........";
- mes "I was happy looking at the visitors";
- mes "from other villages, but because of";
- mes "the thief, I feel terrible now'";
- emotion e_dots;
- } else {
- mes "Hehe...";
- mes "I am so happy now.";
- mes "Lots of visitors are coming to our village..";
- mes "found the stuff my father lost..";
- mes "Hehe...";
- mes "The guy who found the stuff for my";
- mes "father.. I am sure he is a great man.";
- }
- close;
-}
-
-gonryun.gat,100,241,0 script Stranger#gnbs" 733,{
- mes "[Choahk]";
- if (b_sword < 14) {
- mes "Hmm...";
- mes "I'm pretty busy right now, come later.";
- emotion e_dots;
- } else if (b_sword < 17) {
- switch (b_sword) {
- case 14:
- switch(nakha) {
- case 0:
- mes "Hmm...";
- mes "What is it?";
- mes "What do you want?";
- mes "I don't like to get bothered.";
- next;
- if (select("Ask about blacksmith.:Are are you being so mean?") == 1){
- mes "[Choahk]";
- mes "Hum.....";
- mes "so..you are the one who found";
- mes "the sword huh?";
- mes "Did you also get asked to repair it?";
- next;
- if (select("Exactly.:No..I'm just...") == 1){
- mes "[Choahk]";
- mes "well..";
- mes "If you want some information";
- mes "from me, come after helping one";
- mes "person in the village who's in trouble right now.";
- set b_sword,16;
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "I guess not...";
- mes "Don't bother me anymore. I got bunch of things to do.";
- }
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "Why do you care about other's";
- mes "personality. It's none of your business.";
- mes "Take a look at yourself first";
- mes "before you say something like that.";
- }
- break;
- case 1:
- mes "Hmm...";
- mes "You're in the middle of helping";
- mes "someone now huh?";
- mes "Why don't you go and take care of it first.";
- mes "Once you start to help someone,";
- mes "you're responsible to finsh that job well.";
- set b_sword,16;
- break;
- case 2:
- mes "Hmm...";
- mes "You're in the middle of helping";
- mes "someone now huh?";
- mes "Why don't you go and take care of it first.";
- mes "Once you start to help someone,";
- mes "you're responsible to finsh that job well.";
- set b_sword,16;
- break;
- case 3:
- mes "Hmm...";
- mes "What do you want??";
- next;
- if (select("Ask about blacksmith.:Are are you being so mean?") == 1) {
- mes "[Choahk]";
- mes "Hum.....";
- mes "so..you are the one who found";
- mes "the sword huh?";
- mes "Did you also get asked to repair it?";
- next;
- if (select("Exactly.:No..I'm just...") == 1){
- mes "[Choahk]";
- mes "Hmm...";
- mes "Since it's broke into pieces,";
- mes "you should find someone to repair it.";
- mes "Go to ^FF0000Geffen^000000, you'll find someone";
- mes "who can help you.";
- set b_sword,17;
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "I guess not...";
- mes "Don't bother me anymore.";
- mes "I got bunch of things to do.";
- }
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "Why do you care about other's";
- mes "personality. It's none of your business.";
- mes "Take a look at yourself first";
- mes "before you say something like that.";
- }
- break;
- case 4:
- mes "Guess I was wasting my time.";
- mes "If you make any promises,";
- mes "it's your responsibility to";
- mes "take care of it until it's completely done.";
- next;
- mes "[Choahk]";
- mes "I don't like people who do not";
- mes "keep the promises.";
- mes "You'll not get any informations from me.";
- mes "Don't ever bother me again.";
- set b_sword,15;
- break;
- }
- break;
- case 15:
- mes "Hmm...";
- mes "I'm busy right now. Why don't come later.";
- emotion e_dots;
- break;
- case 16:
- switch(nakha){
- case 0:
- mes "Hmm......";
- mes "You're not done with your";
- mes "requirements yet.";
- mes "I can't give you any information";
- mes "until you finish your job.";
- break;
- case 1:
- mes "Hmm....";
- mes "Once you start to help someone,";
- mes "you're responsible to finsh that job well.";
- mes "Why don't you go and take care of it first.";
- break;
- case 2:
- mes "Hmm....";
- mes "Once you start to help someone,";
- mes "you're responsible to finsh that job well.";
- mes "Why don't you go and take care of it first.";
- break;
- case 3:
- mes "Hmm......";
- mes "What do you want?";
- next;
- if (select("Ask about blacksmith.:Are are you being so mean?") == 1) {
- mes "[Choahk]";
- mes "Hum.....";
- mes "so..you are the one who found";
- mes "the sword huh?";
- mes "Did you also get asked to repair it?";
- next;
- if (select("Exactly:No.. I'm just...") == 1) {
- mes "[Choahk]";
- mes "Hmm...";
- mes "Since it's broke into pieces,";
- mes "you should find someone to repair it.";
- mes "Go to ^FF0000Geffen^000000, you'll find someone";
- mes "who can help you.";
- set b_sword,17;
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "I guess not...";
- mes "Don't bother me anymore.";
- mes "I got bunch of things to do.";
- }
- } else {
- mes "[Choahk]";
- mes "Hmm...";
- mes "Why do you care about other's";
- mes "personality. It's none of your business.";
- mes "Take a look at yourself first";
- mes "before you say something like that.";
- }
- break;
- case 4:
- mes "Guess I was wasting my time.";
- mes "If you make any promises,";
- mes "it's your responsibility to";
- mes "take care of it until it's completely done.";
- next;
- mes "[Choahk]";
- mes "I don't like people who do not";
- mes "keep the promises.";
- mes "You'll not get any informations from me.";
- mes "Don't ever bother me again.";
- set b_sword,15;
- break;
- }
- break;
- }
- } else if (b_sword < 33) {
- mes "Umm?";
- mes "Didn't I tell you to go to ^FF0000Geffen^000000?";
- mes "You'll find famous blacksmith there.";
- mes "He'll repair the sword for you.";
- mes "I gave you all the informations";
- mes "I have so far.";
- next;
- mes "[Choahk]";
- mes "You are responsible to take care of the rest.";
- } else {
- mes "Hmm......";
- mes "Helping people in trouble is";
- mes "such a nice thing to do.";
- mes "You are doing the right thing.";
- }
- close;
-}
-
-geffen_in.gat,71,112,2 script Blacksmith#SaYumMoon 731,{
- mes "[Aumgarl]";
- if (b_sword < 17) {
- mes "Pew..hew....";
- mes "My poor baby Lyroo..";
- mes "hew....";
- } else if (b_sword < 32) {
- switch (b_sword) {
- case 17:
- mes "Pew..hew....";
- mes "My poor baby Lyroo..";
- mes "hew....";
- next;
- if (select("Sir...:...........") == 1) {
- mes "[Aumgarl]";
- mes "Umm? Who're you?";
- mes "Need something?";
- mes "If not, please leave..";
- next;
- if (select("I came to repair the sword.:I heard you are famous blacksmith...") == 1) {
- mes "[Aumgarl]";
- mes "Umm........";
- mes "Sorry but, we're closed.";
- mes "Come again next time.";
- mes "Bye";
- set b_sword,18;
- } else {
- mes "[Aumgarl]";
- mes "Yes, I am a blacksmith,";
- mes "but I don't think I am famous.";
- mes "And unfortunately.. we are closed.";
- }
- } else {
- mes "[Aumgarl]";
- mes "Done with your business?";
- mes "Then please leave.";
- }
- break;
- case 18:
- mes "Like I said...I am busy!";
- mes "Come later.";
- if (rand(1,8) == 7) {
- set b_sword,19;
- mes "What nerve you've got!";
- }
- close2;
- warp "geffen.gat",173,169;
- end;
- case 19:
- mes "Hmm....";
- mes "Ahh....";
- mes "What nerve you've got!";
- mes "What do you want?";
- next;
- switch(select("I want to marry your granddaughter.:Your graddaughter is such a pretty girl.:I came to repair the sword.")){
- case 1:
- mes "[Aumgarl]";
- mes ".....";
- mes ".........";
- mes ".............";
- mes "...................";
- mes "........................";
- next;
- mes "[Aumgarl]";
- mes "Who the heck are you?";
- mes "Want my granddaughter all of a sudden?";
- mes "Get the hell out of here!";
- mes "Don't ever come back here!";
- emotion e_pif;
- break;
- case 2:
- mes "[Aumgarl]";
- mes "You're damn right~";
- mes "My granddaughter is so~ pretty.";
- mes "Hahaha....";
- mes ".....peew heew....";
- next;
- switch(select("I want to marry her...:I came to repair the sword.:Anything wrong?")){
- case 1:
- mes "[Aumgarl]";
- mes ".....";
- mes ".........";
- mes ".............";
- mes "...................";
- mes "........................";
- next;
- mes "[Aumgarl]";
- mes "Who the heck are you?";
- mes "Want my granddaughter all of a sudden?";
- mes "Get the hell out of here!";
- mes "Don't ever come back here!";
- emotion e_pif;
- break;
- case 2:
- mes "[Aumgarl]";
- mes "...............";
- mes "the sword?";
- mes "I don't remember when was the";
- mes "last time I touched a steel.";
- mes "hmm...";
- mes "let me see the sword.?";
- next;
- mes "[Aumgarl]";
- mes "Hmm......";
- mes "Umm.........";
- mes "............";
- next;
- mes "^0000FFHe took a careful look at the pieces of sword for awhile.^000000";
- next;
- mes "[Aumgarl]";
- mes "Hmm.......";
- mes "So this is the one huh?";
- mes "Well.....";
- mes "I am sorry, but this sword is not";
- mes "something I can repair";
- mes "at the moment.";
- next;
- mes "[Aumgarl]";
- mes "Why don't you go find";
- mes "some other blacksmith.";
- mes "I am sorry........";
- break;
- case 3:
- mes "[Aumgarl]";
- mes "Ah...............";
- mes "this is not something I shall tell";
- mes "others....but....";
- mes "my granddaughter lyroo has";
- mes "an incurable disease...";
- next;
- mes "[Aumgarl]";
- mes "Not long after she was born,";
- mes "her parents died by an accident.";
- mes "Since from that day of an accident,";
- mes "I took care of her.";
- mes "hmm......";
- next;
- mes "[Aumgarl]";
- mes "Ahh...........";
- mes "and...moreover, she started to suffer";
- mes "from an illness. I've met many famous";
- mes "doctors all around the place but....";
- mes "no one even found out the name of";
- mes "a disease.";
- next;
- switch(select("I am sorry to hear that.:I'll make her happy.:I want to cure her.")){
- case 1:
- mes "[Aumgarl]";
- mes "Ahh.......";
- mes "I'll just have to take it";
- mes "as our fate.";
- mes "I just feel sorry for lyroo.";
- mes ".............";
- emotion e_dots;
- break;
- case 2:
- mes "[Aumgarl]";
- mes "Umm.....";
- mes "What do you mean?";
- mes "How're you going to make her happy?";
- mes "I don't think it makes sense at all.";
- mes "Umm......";
- next;
- switch(select( "I'll make her happy all the time.:I want to take her with me.:I will cure her.")){
- case 1:
- mes "[Aumgarl]";
- mes "................";
- mes "What are you talking about?";
- mes "Make her happy all the time?";
- mes "She is dying even at";
- mes "this moment.";
- next;
- mes "[Aumgarl]";
- mes "I think you are out of";
- mes "your mind!";
- mes "Get out of here.";
- break;
- case 2:
- mes "[Aumgarl]";
- mes "................";
- mes "You want to take her to where?";
- mes "What are you gonna do?";
- next;
- if (select("I will cure her.:I am sorry.") == 1) {
- mes "[Aumgarl]";
- mes "It's useless talking about";
- mes "it any longer. I don't think";
- mes "there is anyone who can";
- mes "cure my granddaughter.";
- } else {
- mes "[Aumgarl]";
- mes "Ahh.......";
- mes "I am not blaming you.";
- mes "It's not your fault anyway.";
- mes "........";
- next;
- if (select("...........:I'll wish for her recover.") == 1){
- mes "[Aumgarl]";
- mes "Ahh......";
- mes "....I am sorry to ask you this but..";
- mes "can you do me a favor?";
- mes "Umm......";
- next;
- if (select("No.:Sure.") == 1) {
- mes "[Aumgarl]";
- mes "Umm....";
- mes "Alright, I won't bother you..";
- mes "bye...";
- break;
- }
- mes "[Aumgarl]";
- mes "It won't be easy but,";
- mes "would you help me to find";
- mes "any doctors... nono..anybody";
- mes "who can cure Lyroo or";
- next;
- mes "[Aumgarl]";
- mes "has any informations";
- mes "about her unidentified illness?";
- mes "please?";
- mes "...peeew..";
- next;
- menu "Yes, Sir.",-;
- mes "[Aumgarl]";
- mes "Oh....";
- mes "Thank you so much.";
- mes "If Lyroo can get her health back,";
- mes "I'll never forget";
- mes "your help forever.";
- next;
- mes "[Aumgarl]";
- mes "Thank you..";
- mes "Thank you...";
- set b_sword,20;
- } else {
- mes "[Aumgarl]";
- mes "Well...thanks.";
- mes "I'm going to try my best to";
- mes "make her happy till the";
- mes "last second.";
- mes "Come by sometimes to say hi";
- mes "to Lyroo.";
- }
- }
- break;
- case 3:
- mes "[Aumgarl]";
- mes ".............";
- mes "How're you going to cure";
- mes "my granddaughter?";
- mes "You don't look like";
- mes "a doctor to me.";
- next;
- switch(select("I am a doctor.:I know a famous doctor.:I'll cure her no matter what.")){
- case 1:
- mes "[Aumgarl]";
- mes "Hoo.......";
- mes "Do I look like a fool to you?";
- mes "I hate people who lie";
- emotion e_pif;
- close2;
- warp "geffen.gat",173,169;
- end;
- case 2:
- mes "[Aumgarl]";
- mes "A famous doctor?";
- mes "I've met all kinds of";
- mes "doctors around.";
- mes "I probably have met that";
- mes "doctor already.";
- break;
- case 3:
- mes "[Aumgarl]";
- mes "................";
- mes "You want to cure her";
- mes "no matter what?";
- mes "How're going to do that?";
- mes "What if it turns worse?";
- mes "Huh?";
- next;
- mes "[Aumgarl]";
- mes "No more of your bragging.";
- mes "Please go away.";
- break;
- }
- break;
- }
- break;
- case 3:
- mes "[Aumgarl]";
- mes ".................";
- mes "Thanks for your concern..";
- mes "but you're a stranger to us.";
- mes "I can't let you do that.";
- mes "Thanks anyways.";
- break;
- }
- break;
- }
- break;
- case 3:
- mes "[Aumgarl]";
- mes ".........";
- mes "Umm........";
- mes "I'm sorry but";
- mes "I am so exhausted.";
- mes "Can't help you..";
- break;
- }
- break;
- case 20:
- case 21:
- case 22:
- case 23:
- mes "Ahh........";
- mes "Go to place where it's";
- mes "crowd of people.";
- mes "And you'll get some informations.";
- mes "I'm counting on you.";
- break;
- case 24:
- case 25:
- case 26:
- mes "Ahh....";
- mes "Lyroo is upstairs.";
- mes "She's in pain.";
- mes "Don't talk to her too long.";
- break;
- case 27:
- mes "Oh....";
- mes "Thank you...";
- mes "I never thought you'll";
- mes "help me.";
- mes "Go ahead see Lyroo.";
- break;
- case 28:
- mes "Thank you so much...";
- mes "Without your help...";
- emotion e_sob;
- mes "it was meaningless.";
- next;
- mes "[Aumgarl]";
- mes "Alright....";
- mes "Is there anything I can";
- mes "do for you?";
- mes "I want to return your favor somehow.";
- next;
- if (select("No..I don't need anything.:Would you repair the sword for me?") == 1) {
- mes "[Aumgarl]";
- mes "Hmm....";
- mes "Well..";
- mes "Whenever you have a favor to ask,";
- mes "come and find me.";
- mes "I'll try my best to help you.";
- set b_sword,29;
- } else {
- mes "[Aumgarl]";
- mes "Hmm....";
- mes "Show me the sword.";
- mes "I need to take a look at it first";
- mes "to find out whether I can repair it or not.";
- next;
- mes "^0000FF Showed the pieces of broken sword";
- mes "to Aumgarl.";
- mes "....................";
- mes "Aumgarl took a careful look";
- mes "at the pieces for awhile..^000000";
- next;
- mes "................";
- mes "............";
- mes "........";
- mes "......";
- next;
- mes "[Aumgarl]";
- mes "Umm.....";
- mes "Well.....";
- mes "It's not possible to get into";
- mes "work right away.";
- mes "I need some materials.";
- next;
- mes "[Aumgarl]";
- mes "To repair this sword, we need";
- mes "some materials.";
- mes "Since Lyroo is upstairs in pain.";
- mes "I don't think I can leave the house.";
- next;
- mes "[Aumgarl]";
- mes "so....would you get the";
- mes "materials for me?";
- mes "I am sorry I am asking";
- mes "you too much to do.";
- next;
- if (select("Umm..let's do it next time.:Alright, I'll go get them.") == 1){
- mes "[Aumgarl]";
- mes "Umm.....";
- mes "I am sorry I can't";
- mes "help you right away.";
- mes "Come back here when";
- mes "you need my help then.";
- } else {
- mes "[Aumgarl]";
- mes "Oh~~ really?";
- mes "Thank you.";
- mes "I'm sure I'll repair it for you.";
- mes "Now, listen carefully.";
- next;
- mes "[Aumgarl]";
- mes "^FF00FF One Anvil";
- mes "2 Oridecon Stones";
- mes "5 Broken Swords";
- mes "2 Steels";
- mes "1 Hammer of Blacksmith";
- mes "2 Star Crumbs";
- mes "5 Live Coals^000000";
- next;
- mes "[Aumgarl]";
- mes "Quite alot huh?";
- mes "They are necessities";
- mes "We need them to repair the sword.";
- mes "I'll go find some other materials.";
- set b_sword,30;
- }
- }
- break;
- case 29:
- mes "Oh~ It's you.";
- mes "Got any favor to ask?";
- mes "I'll do my best";
- mes "to help you.";
- next;
- if (select("Maybe next time..:Please repair this sword for me.") == 1) {
- mes "[Aumgarl]";
- mes "Well..";
- mes "Whenever you have a favor to ask,";
- mes "come and find me.";
- } else {
- mes "[Aumgarl]";
- mes "Hmm....";
- mes "Show me the sword.";
- mes "I need to take a look at it first";
- mes "to find out whether I can repair it or not.";
- next;
- mes "^0000FF Showed the pieces of broken sword";
- mes "to Aumgarl.";
- mes "....................";
- mes "Aumgarl took a careful look";
- mes "at the pieces for awhile..^000000";
- next;
- mes "................";
- mes "............";
- mes "........";
- mes "......";
- next;
- mes "[Aumgarl]";
- mes "Umm.....";
- mes "Well.....";
- mes "It's not possible to get into";
- mes "work right away.";
- mes "I need some materials.";
- next;
- mes "[Aumgarl]";
- mes "To repair this sword, we need";
- mes "some materials.";
- mes "Since Lyroo is upstairs in pain.";
- mes "I don't think I can leave the house.";
- next;
- mes "[Aumgarl]";
- mes "so....would you get the";
- mes "materials for me?";
- mes "I am sorry I am asking";
- mes "you too much to do.";
- next;
- if (select("Umm..let's do it next time.:Alright, I'll go get them.") == 1) {
- mes "[Aumgarl]";
- mes "Umm.....";
- mes "I am sorry I can't";
- mes "help you right away.";
- mes "Come back here when";
- mes "you need my help then.";
- } else {
- mes "[Aumgarl]";
- mes "Oh~~ really?";
- mes "Thank you.";
- mes "I'm sure I'll repair it for you.";
- mes "Now, listen carefully.";
- next;
- mes "[Aumgarl]";
- mes "^FF00FF1 Anvil";
- mes "2 Oridecon Stones";
- mes "5 Broken Swords";
- mes "2 Steels";
- mes "1 Hammer of Blacksmith";
- mes "2 Star Crumbs";
- mes "5 Live Coals^000000";
- next;
- mes "[Aumgarl]";
- mes "Quite alot huh?";
- mes "They are necessities";
- mes "We need them to repair the sword.";
- mes "I'll go find some other materials.";
- set b_sword,30;
- }
- }
- break;
- case 30:
- if (countitem(986) > 0 && countitem(756) > 1 && countitem(7110) > 4 && countitem(999) > 1 && countitem(1005) > 0 && countitem(1000) > 1 && countitem(7098) > 4) {
- mes "Oh~~ good, you got them all.";
- mes "Alright, come back later,";
- mes "I'll have it repaired.";
- delitem 986,1; // Anvil
- delitem 756,2; // Oridecon_Stone
- delitem 7110,5; // Vroken_Sword
- delitem 999,2; // Steel
- delitem 1005,1; // Hammer_Of_Blacksmith
- delitem 1000,2; // Star_Crumb
- delitem 7098,5; // Live_Coal
- set b_sword,31;
- } else {
- mes "Hmm.....";
- mes "Not ready yet?";
- mes "Materials you need are...";
- next;
- mes "[Aumgarl]";
- mes "^FF00FF1 Anvil";
- mes "2 Oridecon Stones";
- mes "5 Broken Swords";
- mes "2 Steels";
- mes "1 Hammer of Blacksmith";
- mes "2 Star Crumbs";
- mes "5 Live Coals^000000";
- next;
- mes "[Aumgarl]";
- mes "Wrote them down?";
- mes "I'm almost ready for other materials.";
- }
- break;
- case 31:
- if (rand(1,5) == 2) {
- mes "Hey, you're back.";
- mes "Here it is.";
- mes "This sword is a great one";
- mes "for sure. I've noticed at";
- mes "the first sight.";
- mes "huhu.....";
- next;
- mes "[Aumgarl]";
- mes "I haven't seen this kind of";
- mes "great sword for a long";
- mes "time in my life.";
- mes "I envy you...";
- mes "Huhuhu......";
- next;
- mes "'You received repaired";
- mes "'^FF0000SaYumMoon's sword^000000'.";
- set b_sword,32;
- getitem 1123,1; // Haedonggum
- } else {
- mes "Umm.. it's not done yet.";
- mes "Would you give me little";
- mes "more time? It takes longer";
- mes "than I thought. sorry.";
- }
- break;
- }
- } else {
- mes "Thank you...";
- mes "You've been a great help";
- mes "to us.";
- mes "Hope my work had";
- mes "helped you.";
- }
- close;
-}
-
-geffen_in.gat,106,106,7 script Girl#gnbs2 716,{
- mes "[Lyroo]";
- if (b_sword < 20) {
- mes "Ah...Ah....";
- mes "Ah...Hi.......";
- next;
- mes "^0000FFThis girl seemed to be in serious pain.^000000";
- close;
- } else if (b_sword < 24) {
- mes "Aaa....Aaa....";
- mes "you...you....";
- mes "you are the....one...";
- mes "who will....cure....";
- mes "...me? Aa....";
- next;
- mes "[Lyroo]";
- mes "..tha... thank you....";
- next;
- mes "^0000FFBetter stop talking to her and";
- mes "rush to find a way to cure her.^000000";
- close;
- } else if (b_sword == 24 || b_sword == 25 || b_sword == 26) {
- mes "Ahh...ahh....";
- if (sex == 0) {
- mes "It's ..you.. pretty...sister..";
- } else {
- mes "It's ..you.. handsome...brother..";
- }
- mes "ah he he....";
- next;
- if (select("Ask about her health condition.:Talk to her for a while.") == 1){
- mes "[Lyroo]";
- if (rand(1,4) == 3) {
- mes "uh....umm...?";
- mes "umm... I...";
- mes "I can't talk...too long..";
- mes "so.. listen....carefully..please...";
- next;
- mes "[Lyroo]";
- mes "^0030FFMy body..repeatedly turns cold and hot...";
- mes "....no sweating on my body...";
- mes "..and get paralyzed ...quite often..and..";
- mes "my heart beats ...irregularly.^000000";
- next;
- mes "[Lyroo]";
- mes "Ahh...Ahh.";
- mes "...........";
- } else {
- mes "I...am...so...";
- mes "...tired.";
- mes ".............";
- }
- } else {
- mes "[Lyroo]";
- mes "Ahh........";
- mes "I..want to ...talk to...you..";
- mes "but.... sorry....";
- }
- next;
- mes "^0000FFshe seems to have fallen asleeep.^000000";
- close;
- } else if (b_sword == 27) {
- mes "uh...umm?";
- if (sex == 0) {
- mes "Ah....It's you pretty sister...";
- } else {
- mes "Ah....It's you handsome brother...";
- }
- if (countitem(606) > 0) {
- mes "uh?..what is that you have?";
- next;
- if (select("It's nothing.:It's your medicine.") == 1 || countitem(606) < 1){
- mes "[Lyroo]";
- mes "umm......";
- mes "ok....";
- mes "...........";
- close;
- }
- mes "[Lyroo]";
- mes "Ah!";
- mes "you found the medicine~";
- mes "Ah..hehe...";
- delitem 606,1; // Aloebera
- next;
- mes "^0000FFYou gave her a medicine you";
- mes "received from Cylrnel.";
- mes "After taking a medicine, Lyroo";
- mes "fell in asleep.^000000";
- set b_sword,28;
- }
- close;
- } else {
- mes "ehehe...";
- if (sex == 0) {
- mes "Thank you my pretty sister.";
- } else {
- mes "Thank you my handsome brother.";
- }
- mes "I'll have my health back";
- mes "and be a strong girl. hehe";
- close;
- }
-}
-
-prontera.gat,275,86,2 script Young man#SaYumMoon" 97,{
- mes "[Neil]";
- if (b_sword < 20) {
- mes "It's so good to be helathy.";
- mes "If you stay in hospital laying";
- mes "down on the bed all day long,";
- mes "It'll make you feel depressed.";
- next;
- mes "[Neil]";
- mes "Take care of your health";
- mes "all the time.";
- mes "Health is the best of all.";
- } else {
- mes "Not long ago, I was in hospital";
- mes "laying down on the bed for";
- mes "quite a long time.";
- mes "And I met this ^FF5000doctor from Yuno^000000.";
- mes "She helped me to recover in no time.";
- mes "Yet, I can't run around though.";
- next;
- mes "[Neil]";
- mes "However, I can't believe I got";
- mes "my health back. It's like a";
- mes "miracle. Hope I can be someone like";
- mes "her who can cure others.";
- if (b_sword == 20) set b_sword,21;
- }
- close;
-}
-
-yuno,208,164,4 script Active little girl#gnbs 101,{
- mes "[Hisa]";
- if (b_sword < 21) {
- mes "Ahhmm.....";
- mes "This town is so boring.";
- mes "No events, no festivals..";
- mes "and all the people stay in";
- mes "their home studying this and that.";
- close;
- }
- mes "But still, there's one person";
- mes "I respect. Her name is ^FF5500Cylrnel^000000.";
- mes "She is an expert in medical treatment.";
- mes "Moreover, whenever someone becomes";
- mes "sick in the town, she comes right";
- mes "away to cure that person..";
- next;
- mes "[Hisa]";
- mes "She tells me lots of stories";
- mes "she experienced. It's so";
- mes "interesting to hear them.";
- mes "She also made jorney round the";
- mes "world.... Ah ha.....";
- next;
- mes "[Hisa]";
- mes "She's probably at her home.";
- mes "She came back from a trip.";
- mes "haha......";
- if (b_sword == 21) set b_sword,22;
- if (rand(1,2) == 2) {
- next;
- mes "[Hisa]";
- mes "Ah~!";
- mes "She's also known as an";
- mes "fickle woman.";
- mes "Better watch out. haha..";
- }
- close;
-}
-
-yuno_in01,99,101,4 script Doctor#gnbs 744,{
- if (b_sword < 23) {
- mes "[??????]";
- mes "I have no idea who you are";
- mes "but would you mind to leave me alone?";
- mes "I am really busy right now.";
- } else if (b_sword < 27) {
- mes "[Cylrnel]";
- switch (b_sword) {
- case 23:
- mes "How can I help you?";
- mes "If it's not urgent, please";
- mes "come back next time.";
- next;
- mes "[Cylrnel]";
- if (rand(1,4) == 2) {
- mes "...............";
- mes "Need to ask me something?";
- next;
- if (select("You're so beautiful.:Do you like traveling?") == 1) {
- mes "[Cylrnel]";
- if (rand(1,4) == 4) {
- mes "..excuse me?";
- mes "Ah ha ha~";
- mes "You're a funny guy.";
- mes "Trying to work on me?";
- mes "Ah ha ha ha.";
- next;
- if (select("Yes, I fell in love in first sight.:I have a favor to ask.") == 1) {
- mes "[Cylrnel]";
- if (rand(1,3) == 3) {
- mes "Ahhaha...Ahahaha...";
- mes "Ah..I'm sorry..";
- mes "I haven't seen a guy like you";
- mes "for a long time.";
- next;
- mes "[Cylrnel]";
- mes "It makes me laugh..haha.";
- mes "Guess what?";
- mes "I know you're not here";
- mes "to work on me.";
- mes "What business do you have?";
- next;
- menu "Well, actually...",-;
- mes "^FF0000Told Cylrnel about Lyroo.";
- mes "And also about favor of blacksmith, Aumgarl.^000000";
- next;
- mes "[Cylrnel]";
- if (rand(1,3) == 2) {
- mes "Um.....";
- mes "that's what happened..";
- mes "Oh, well..";
- mes "I need exact symptoms of a girl.";
- mes "Go find exact symptoms first";
- mes "and come back again.";
- next;
- mes "[Cylrnel]";
- mes "Without exact symptoms,";
- mes "I can't make any diagnose.";
- set b_sword,24;
- } else {
- mes "Umm.......";
- mes "Quite a long story..";
- mes "I have no idea why you're";
- mes "trying to help these people,";
- mes "but, it's hard to believe you.";
- mes "Why don't you find some other doctor?";
- }
- } else {
- mes "Ah!";
- mes "I never thought someone";
- mes "like you still exist.";
- mes "I am sorry but, I am";
- mes "tired with this crap.";
- }
- } else {
- mes "[Cylrnel]";
- if (rand(1,3) == 3) {
- mes "Huhu...";
- mes "well...";
- mes "Let me hear your story.";
- next;
- menu "Actually...",-;
- mes "^FF0000Told Cylrnel about Lyroo.";
- mes "And also about favor of blacksmith, Aumgarl.^000000";
- next;
- mes "[Cylrnel]";
- if (rand(1,3) == 1) {
- mes "Um.....";
- mes "that's what happened..";
- mes "Oh, well..";
- mes "I need exact symptoms of a girl.";
- mes "Go find exact symptoms first";
- mes "and come back again.";
- next;
- mes "[Cylrnel]";
- mes "Without exact symptoms,";
- mes "I can't make any diagnose.";
- set b_sword,24;
- } else {
- mes "Umm.......";
- mes "Quite a long story..";
- mes "I have no idea why you're";
- mes "trying to help these people,";
- mes "but, it's hard to believe you.";
- mes "Why don't you find some other doctor?";
- }
- } else {
- mes "Huhu..";
- mes "Well...";
- mes "You're no differ with";
- mes "any other guys around.";
- mes "I don't have any bussiness";
- mes "with you. please leave.";
- close2;
- warp "yuno.gat",246,143;
- end;
- }
- }
- } else {
- mes "Ahhaha..";
- mes "You're a funny guy.";
- mes "But, that doesn't";
- mes "work on me.";
- }
- } else {
- mes "[Cylrnel]";
- mes "Hmm.. Yes.. but,";
- mes "if you don't have ";
- mes "any business to take care,";
- mes "please leave, I'm pretty busy right now.";
- }
- } else {
- mes "I am sorry, I don't have a time to waste.";
- }
- break;
- case 24:
- mes "Oh..";
- mes "you're back..";
- mes "Did you find the right symptoms?";
- mes "I wanted to go with you, but";
- mes "I been really busy.";
- next;
- if(select("Not yet...:Yes, Here.") == 1){
- mes "[Cylrnel]";
- mes "You're still here?";
- mes "Go right away!";
- mes "She's in serious pain.";
- mes "Her body could be paralyzed";
- mes "in any minute!";
- close;
- }
- mes "[Cylrnel]";
- mes "What a relief..";
- mes "You're earlier than I thought.";
- mes "I'll ask you some questions about";
- mes "her condition. Answer correctly.";
- next;
- mes "[Cylrnel]";
- mes "First, How was her body temperature?";
- set @sick,0;
- next;
- setarray .sick1$[1],"Very hot.","Very cold.","Normal.","Turns hot and cold repeatedly.";
- set @sick1,select(.sick1$[1],.sick1$[2],.sick1$[3],.sick1$[4]);
- if (@sick1 == 4) set @sick,@sick+1;
- mes "[Cylrnel]";
- mes "Ok.";
- mes "Now, about physiological condition.";
- next;
- setarray .sick2$[1],"No sweating at all.","Sweating all over the body.","Runny nose.","No tears, sweats at all.";
- set @sick2,select(.sick2$[1],.sick2$[2],.sick2$[3],.sick2$[4]);
- if (@sick2 == 1) set @sick,@sick+1;
- mes "[Cylrnel]";
- mes "Next, tell me about";
- mes "her body condition.";
- next;
- setarray .sick3$[1],"Nothing particular.","Become paralyzed often.","Muscles became so soft.","Muscles became so hard.";
- set @sick3,select(.sick3$[1],.sick3$[2],.sick3$[3],.sick3$[4]);
- if (@sick3 == 2) set @sick,@sick+1;
- mes "[Cylrnel]";
- mes "How about an internal organs?";
- next;
- setarray .sick4$[1],"Stomach hurts like it's been stabbed by a knife.","Head hurts like it's been smashed by a hammer.","Heart beats irregularly.","Has difficulty in breathing.";
- set @sick4,select(.sick4$[1],.sick4$[2],.sick4$[3],.sick4$[4]);
- if (@sick4 == 3) set @sick,@sick+1;
- mes "[Cylrnel]";
- mes "Hmm.. alright.";
- mes "Let me check this.";
- mes "so the symptoms are";
- mes "..............";
- next;
- mes "[Cylrnel]";
- mes "^FF0000"+.sick1$[@sick1]+"";
- mes ""+.sick2$[@sick2]+"";
- mes ""+.sick3$[@sick3]+"";
- mes ""+.sick4$[@sick4]+"^000000";
- mes "right?";
- next;
- if(select("No..not exactly..:Yes, I am sure.") == 1){
- mes "[Cylrnel]";
- mes "Then, go back to her and";
- mes "find the exact symptoms";
- mes "right away~!!";
- close;
- }
- mes "[Cylrnel]";
- mes "You're sure about";
- mes "this, right?";
- mes "If they're wrong symptoms, I can't be responsible.";
- next;
- if(select("Well..let me go and recheck it.:I'm sure.") == 1){
- mes "[Cylrnel]";
- mes "Then, go back to her and";
- mes "find the exact symptoms";
- mes "right away~!!";
- close;
- }
- mes "[Cylrnel]";
- mes "Hmm.....";
- mes "Aright. I'll trust you.";
- mes "Now, go get these ingredients.";
- mes "Get them as fast as possible.";
- mes "Alright?";
- next;
- if (@sick == 4) {
- mes "[Cylrnel]";
- mes "^FF00002 Seeds of Yggdrasil";
- mes "3 Aloes";
- mes "1 Witherless Rose";
- mes "10 Starsands Of Witch";
- mes "5 Burning Hearts";
- mes "5 Ice pieces";
- set b_sword,26;
- next;
- mes "[Cylrnel]";
- mes "Wrote them down?";
- mes "I'll tell you once again.";
- mes "We need...";
- next;
- mes "[Cylrnel]";
- mes "^FF00002 Seeds of Yggdrasil";
- mes "3 Aloes";
- mes "1 Witherless Rose";
- mes "10 Starsands Of Witch";
- mes "5 Burning Hearts";
- mes "5 Ice pieces";
- next;
- } else {
- mes "[Cylrnel]";
- mes "^FF00001 Seed of Yggdrasil";
- mes "1 Aloe";
- mes "5 Starsands Of Witch";
- mes "3 Burning Hearts";
- mes "3 Ice pieces";
- set b_sword,25;
- next;
- mes "[Cylrnel]";
- mes "Wrote them down?";
- mes "I'll tell you once again.";
- mes "We need...";
- next;
- mes "[Cylrnel]";
- mes "^FF00001 Seed of Yggdrasil";
- mes "1 Aloe";
- mes "5 Starsands Of Witch";
- mes "3 Burning Hearts";
- mes "3 Ice pieces";
- next;
- }
- mes "[Cylrnel]";
- mes "Get them as fast as possible.";
- mes "There isn't much time for Lyroo.";
- break;
- case 25:
- if (countitem(608) > 0 && countitem(704) > 0 && countitem(1061) > 4 && countitem(7097) > 2 && countitem(7066) > 2) {
- mes "Hmm....";
- mes "Good. you got them all.";
- mes "Let me see..";
- mes ".............";
- delitem 608,1; // Seed_Of_Yggdrasil
- delitem 704,1; // Aloe
- delitem 1061,5; // Starsand_Of_Witch
- delitem 7097,3; // Burning_Heart
- delitem 7066,3; // Ice_Piece
- next;
- mes "^FF0000Cylrnel began to mix";
- mes "the ingredients.";
- mes "................";
- mes ".............";
- mes ".........";
- mes "......^000000";
- next;
- mes "[Cylrnel]";
- mes "............";
- mes "What!?!?";
- mes ".....";
- mes "Hey you....";
- mes "You gave me a wrong information.";
- set b_sword,24;
- next;
- mes "[Cylrnel]";
- mes "I made the mecine according";
- mes "to the symptoms you told me.";
- mes "But, it became strange medicine!";
- mes "Bring me the exact symptoms!";
- close2;
- warp "yuno.gat",246,143;
- end;
- } else {
- mes "...........";
- mes "Hey~ you don't have all";
- mes "the ingredients yet.";
- mes "Go get them all right away.";
- next;
- mes "[Cylrnel]";
- mes "^FF00001 Seed of Yggdrasil";
- mes "1 Aloe";
- mes "5 Starsands Of Witch";
- mes "3 Burning Hearts";
- mes "3 Ice pieces";
- next;
- mes "[Cylrnel]";
- mes "Alright?";
- mes "Now, hurry!.";
- close2;
- warp "yuno.gat",246,143;
- end;
- }
- break;
- case 26:
- if (countitem(608) > 1 && countitem(704) > 2 && countitem(748) > 0 && countitem(1061) > 9 && countitem(7097) > 4 && countitem(7066) > 4) {
- mes "Hmm....";
- mes "Good. you got them all.";
- mes "Let me see..";
- mes ".............";
- delitem 608,2; // Seed_Of_Yggdrasil
- delitem 704,3; // Aloe
- delitem 748,1; // Witherless_Rose
- delitem 1061,10; // Starsand_Of_Witch
- delitem 7097,5; // Burning_Heart
- delitem 7066,5; // Ice_Piece
- next;
- mes "^FF0000Cylrnel began to mix";
- mes "the ingredients.";
- mes "................";
- mes ".............";
- mes ".........";
- mes "......^000000";
- next;
- mes "[Cylrnel]";
- mes "Here~!";
- mes "It's done.";
- mes "I don't think this medicine would";
- mes "cure her disease completely. However,";
- mes "it will alleviate her from the pain.";
- next;
- mes "[Cylrnel]";
- mes "It wasn't easy to make this medicine.";
- mes "Here, take this with you.";
- mes "Take care then..";
- set b_sword,27;
- getitem 606,1; // Aloebera
- } else {
- mes "...........";
- mes "Hey~ you don't have all";
- mes "the ingredients yet.";
- mes "Go get them all right away.";
- next;
- mes "[Cylrnel]";
- mes "^FF00002 Seeds of Yggdrasil";
- mes "3 Aloes";
- mes "1 Witherless Rose";
- mes "10 Starsands Of Witch";
- mes "5 Burning Hearts";
- mes "5 Ice pieces";
- next;
- mes "[Cylrnel]";
- mes "Alright?";
- mes "Go get them as fast as possible.";
- close;
- warp "yuno.gat",246,143;
- end;
- }
- break;
- }
- } else {
- mes "[Cylrnel]";
- mes "Huhu...";
- mes "How is she doing?";
- mes "Getting better?.";
- mes "By taking that medicine, she'll";
- mes "recover fast.";
- next;
- mes "[Cylrnel]";
- mes "Tell her to come to me";
- mes "sometimes to get a medical.";
- mes "treatment. Walking from her";
- mes "house to here would be a good";
- mes "exercise too. Name of her disease";
- mes "is called '^FF0000Amarhade^000000'.";
- next;
- mes "[Cylrnel]";
- mes "It's a rare disease that";
- mes "it's not even well known";
- mes "to medical institution.";
- mes "Likewise, exact treatment";
- mes "has not maden yet.";
- next;
- mes "[Cylrnel]";
- mes "..but I found the something..";
- mes "and it's a.....secret. haha.";
-// Emotion "Doctor" ET_DELIGHT
- emotion e_ho;
- }
- close;
-}
-
-yuno_in01.gat,104,94,0 script go away#gnbs 139,2,1{
- if (b_sword < 22) {
- mes "[??????]";
- mes "^FF0000What are you doing here?";
- mes "Get out!^000000";
- close2;
- warp "yuno.gat",246,143;
- end;
- } else if (b_sword == 22) {
- if (rand(1,10) == 10) {
- mes "[??????]";
- mes "I am very busy right now. please leave.";
- set b_sword,23;
- close;
- } else {
- mes "[??????]";
- mes "^FF0000What are you doing here?";
- mes "Get out!^000000";
- close2;
- warp "yuno.gat",246,143;
- end;
- }
- } else {
- mes "[Cylrnel]";
- mes "Who are you?";
- close;
- }
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Gonryun
+//===== By: ==================================================
+//= KarLaeda
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1
+//===== Description: =========================================
+//= Gonryun Broken Sword Quest
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+gon_in.gat,17,93,5 script Chief#gnbs 775,{
+ mes "[SaYumMoon]";
+ if (BaseLevel <= 50) {
+ mes "hmm...";
+ mes "Oh, Hi there~";
+ mes "I am SaYumMoon, a chief of";
+ mes "this village.";
+ mes "Welcome to Kunlun.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Well, to tell you about this village..";
+ mes "We weren't that much associated with ";
+ mes "other villages.";
+ mes "Nevertheless, through the village named";
+ mes "Alberta, we allowed people to visit";
+ mes "here. It all happened lately.";
+ next;
+ mes "[SaYumMoon]";
+ mes "I feel that this town has been";
+ mes "isolated for too long.";
+ mes "Therefore, people in this town";
+ mes "are not yet so friendly with";
+ mes "visitors yet.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Moreover, thieves are having";
+ mes "fun in this town lately.";
+ mes "Well, you've come to visit this";
+ mes "town.. Enjoy your stay.";
+ close;
+ }
+ if (b_sword == 0) {
+ set b_sword,1;
+ mes "hmm...";
+ mes "Oh, Hi there~";
+ mes "I am SaYumMoon, a chief of";
+ mes "this village.";
+ mes "Welcome to Kunlun.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Well, to tell you about this village..";
+ mes "We weren't that much associated with ";
+ mes "other villages.";
+ mes "Nevertheless, through the village named";
+ mes "Alberta, we allowed people to visit";
+ mes "here. It all happened lately.";
+ next;
+ mes "[SaYumMoon]";
+ mes "I feel that this town has been";
+ mes "isolated for too long.";
+ mes "Therefore, people in this town";
+ mes "are not yet so friendly with";
+ mes "visitors yet.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Moreover, thieves are having";
+ mes "fun in this town lately.";
+ mes "Well, you've come to visit this";
+ mes "town.. Enjoy your stay.";
+ close;
+ }
+ if (b_sword < 18) {
+ switch (b_sword) {
+ case 1:
+ mes "Umm....";
+ mes "Oh, Hi there~";
+ mes "I am SaYumMoon, a chief of";
+ mes "this village.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Welcome to Kunlun.";
+ mes "I feel that this village has been";
+ mes "isolated for too long";
+ mes "unlike other villages.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Nevertheless, through the village named";
+ mes "Alberta, we allowed people to visit";
+ mes "here. It all happened lately.";
+ mes "Since our village has been";
+ next;
+ mes "[SaYumMoon]";
+ mes "isolated for long time,";
+ mes "people in this town";
+ mes "are not yet so friendly with";
+ mes "visitors yet.";
+ mes "Moreover, thieves are having";
+ next;
+ mes "[SaYumMoon]";
+ mes "fun in this town lately.";
+ mes "Well, you've come to visit this";
+ mes "town.. Enjoy your stay.";
+ break;
+ case 2:
+ mes "Oh, it's you~";
+ mes "How do you like it here so far?";
+ mes "Like you've noticed,";
+ mes "village is not so peaceful huh?";
+ next;
+ if(select("It's alright.:I heard that something was stolen..") == 1){
+ mes "[SaYumMoon]";
+ mes "Good...";
+ mes "Well, watch out for robbery.";
+ mes "And..don't act suspicious";
+ mes "in the village.";
+ close;
+ }
+ mes "[SaYumMoon]";
+ mes "hmm..you heard of it?";
+ mes "It was just last night when robbery";
+ mes "occurred. The rumor was true..";
+ mes "Lots of thieves are out there in the village.";
+ next;
+ switch(select("......:What was stolen?:Anyone with injuries?")){
+ case 1:
+ mes "[SaYumMoon]";
+ mes "Can't believe it really happened.";
+ mes "If you see anyone suspicious,";
+ mes "please let me know.";
+ set b_sword,3;
+ break;
+ case 2:
+ mes "[SaYumMoon]";
+ mes "um.....";
+ mes "that is....";
+ mes "just an ordinary sword.";
+ mes "But to us, it's a family treasure";
+ mes "from generation to generation.";
+ next;
+ mes "[SaYumMoon]";
+ mes "I must find this sword";
+ mes "no mattter what!";
+ mes "...but I can't go find it just";
+ mes "by myself. I am too busy.";
+ next;
+ mes "[SaYumMoon]";
+ mes "You know how busy it is to be a";
+ mes "chief of village.";
+ mes "This is a big trouble...hmm...";
+ next;
+ if (select("Hope you find it soon.:Can I find it for you?") == 1){
+ mes "[SaYumMoon]";
+ mes "um..thank you.";
+ mes "Perhaps you find a sword, ";
+ mes "please let me know.";
+ set b_sword,11;
+ } else {
+ mes "[SaYumMoon]";
+ mes "Oh~ Are you serious??";
+ mes "People in the village are";
+ mes "now very sensitive cause of";
+ mes "thieves. It is so difficult to ask";
+ mes "them for a help. If you would help";
+ mes "me to find a sword. I'll pay for that for sure.";
+ set b_sword,3;
+ }
+ break;
+ case 3:
+ mes "[SaYumMoon]";
+ mes "Fortunately, no one's hurt.";
+ mes "But we lost something valuable.";
+ mes "It's a family treasure";
+ mes "which came from generation";
+ mes "to generation.";
+ next;
+ mes "[SaYumMoon]";
+ mes "I must find this sword";
+ mes "no mattter what!";
+ mes "...but I can't go find it just";
+ mes "by myself. I am too busy.";
+ next;
+ mes "[SaYumMoon]";
+ mes "You know how busy it is to be a";
+ mes "chief of village.";
+ mes "This is a big trouble...hmm...";
+ next;
+ if (select("Hope you find it soon.:Can I find it for you?") == 1){
+ mes "[SaYumMoon]";
+ mes "um..thank you.";
+ mes "Perhaps you find a sword, ";
+ mes "please let me know.";
+ set b_sword,11;
+ } else {
+ mes "[SaYumMoon]";
+ mes "Oh~ Are you serious??";
+ mes "People in the village are";
+ mes "now very sensitive cause of";
+ mes "thieves. It is so difficult to ask";
+ mes "them for a help. If you would help";
+ mes "me to find a sword. I'll pay for that for sure.";
+ set b_sword,3;
+ }
+ break;
+ }
+ break;
+ case 3:
+ mes "Haven't found it yet?";
+ mes "No rush. Take it easy.";
+ mes "You have to take care of";
+ mes "youself first before";
+ mes "doing other's favors.";
+ break;
+ case 4:
+ mes "Haven't found it yet?";
+ mes "No rush. Take it easy.";
+ mes "You have to take care of";
+ mes "youself first before";
+ mes "doing other's favors.";
+ break;
+ case 5:
+ mes "Haven't found it yet?";
+ mes "No rush. Take it easy.";
+ mes "You have to take care of";
+ mes "youself first before";
+ mes "doing other's favors.";
+ break;
+ case 6:
+ mes "Oh, you found a traces?";
+ mes "You're doing a good work.";
+ mes "This is my family remedies.";
+ mes "It might help you.";
+ set b_sword,7;
+ getitem 504,3; // White_Potion
+ break;
+ case 7:
+ mes "Thief is in an injury.";
+ mes "He probably is not";
+ mes "far away from here.";
+ break;
+ case 8:
+ mes "Oh, my sword...";
+ mes "..it's broken?";
+ mes "Unbelievable~";
+ mes "How could this happen..";
+ mes "Would you also look for";
+ mes "the other parts please?";
+ break;
+ case 9:
+ mes "hmm...";
+ mes "..my sword... in pieces..";
+ mes "I beg you please. Find it for me.";
+ mes "You'll get something in return.";
+ break;
+ case 10:
+ mes "Oh~~";
+ mes "You've found the pieces for me~";
+ mes "I knew you would've make it.";
+ mes "But they are broken into pieces.";
+ mes "What should I do...";
+ next;
+ mes "[SaYumMoon]";
+ mes "If it's ok with you,";
+ mes "Would you repair my sword for me?";
+ mes "I'm sure I'll pay for that.";
+ next;
+ if (select("No way.:Alright.") == 1) {
+ mes "[SaYumMoon]";
+ mes "Well, yes.. you've been such a";
+ mes "nice person. I appreciate for";
+ mes "your hard work.";
+ mes "It would be better if you help me";
+ mes "to repair the sword for me though..";
+ mes "nono.. I am not enforcing you..";
+ next;
+ mes "[SaYumMoon]";
+ mes "I'll find someway to repair it.";
+ mes "Without your help, I could've done";
+ mes "nothing. This is not a big present";
+ mes "but please take it.";
+ set b_sword,15;
+ getitem 603,1; // Old_Blue_Box
+ next;
+ mes "[SaYumMoon]";
+ mes "If you get any informations or";
+ mes "traces about that damn thief,";
+ mes "please let me know.";
+ mes "I got my sword back but there's";
+ mes "no way I can forgive that thief.";
+ mes "Have a nice travel.";
+ } else {
+ mes "[SaYumMoon]";
+ mes "Wow..you are so nice.";
+ mes "I am owing you a big favor.";
+ mes "I have no idea how this sword";
+ mes "broke into pieces.";
+ mes "I believe you have to find famous";
+ mes "blacksmith to repair it.";
+ next;
+ mes "[SaYumMoon]";
+ mes "Like you know already, this is";
+ mes "a family treasure for me.";
+ mes "oh.. one more thing..";
+ next;
+ mes "[SaYumMoon]";
+ mes "There's a guy named ^555555Choahk^000000";
+ mes "in the village. He has been to many";
+ mes "places all around the world.";
+ mes "He probably has the informations";
+ mes "you need. Go find him first.";
+ next;
+ mes "[SaYumMoon]";
+ mes "and.. this is not a big gift";
+ mes "but please take it..";
+ mes "here...";
+ set b_sword,14;
+ getitem 603,1; // Old_Blue_Box
+ }
+ break;
+ case 11:
+ mes "The village is not in a good";
+ mes "mood at this moment, but still";
+ mes "lots of things to look around.";
+ break;
+ case 12:
+ mes "hmm.. no traces? no marks?... nothing?";
+ mes "ok.. well, thanks for help anyways.";
+ mes "umm....";
+ next;
+ mes "[SaYumMoon]";
+ mes "Here..take this.";
+ mes "Have a good time.";
+ set b_sword,13;
+ getitem 504,1; // White_Potion
+ break;
+ case 13:
+ mes "Everything going well?";
+ mes "The village is not in a good mood.";
+ mes "Take care of yourself.";
+ break;
+ case 14:
+ mes "I appreciate what you are doing.";
+ mes "You make me feel comfortable.";
+ mes "Village seems it's turning back";
+ mes "to old times too. huhu";
+ break;
+ case 15:
+ mes "I appreciate what you are doing.";
+ mes "You make me feel comfortable.";
+ mes "Village seems it's turning back";
+ mes "to old times too. huhu";
+ break;
+ case 16:
+ mes "I appreciate what you are doing.";
+ mes "You make me feel comfortable.";
+ mes "Village seems it's turning back";
+ mes "to old times too. huhu";
+ break;
+ case 17:
+ mes "I appreciate what you are doing.";
+ mes "You make me feel comfortable.";
+ mes "Village seems it's turning back";
+ mes "to old times too. huhu";
+ break;
+ }
+ } else if (b_sword < 32) {
+ mes "I appreciate what you are doing.";
+ mes "You make me feel comfortable.";
+ mes "Village seems it's turning back";
+ mes "to old times too. huhu";
+ mes "and please repair my";
+ mes "sword for me.";
+ next;
+ mes "[SaYumMoon]";
+ mes "You've done so many things for me.";
+ mes "I feel sorry about asking you";
+ mes "more to do.";
+ } else if (b_sword == 32) {
+ if (countitem(1123) < 1) { // Haedonggum
+ mes "um.....";
+ mes "Not yet huh?";
+ mes "You'll repair it for me right?";
+ mes "I'll be waiting.";
+ } else {
+ mes "oh.. it's you.";
+ mes "............";
+ mes "Is that my sword?";
+ mes "Wow you have done it.";
+ mes "Good work!";
+ next;
+ mes "[SaYumMoon]";
+ mes "Hmm..If you have a similar sword I have,";
+ mes "please leave it somewhere else and come back.";
+ mes "Just in case that you give me a wrong one...";
+ next;
+ if(select("Wait for sec:Here it is.") == 1 || countitem(1123) < 1){
+ mes "[SaYumMoon]";
+ mes "Ok, go ahead.";
+ mes "Don't leave mine!!";
+ mes "haha..";
+ close;
+ }
+ mes "[SaYumMoon]";
+ mes "This is a small gift for you.";
+ mes "Please take it.";
+ mes "Thanks for a job well done!";
+ delitem 1123,1; // Haedonggum
+ set b_sword,33;
+ getitem 2404,1; // Shoes_
+ next;
+ mes "[SaYumMoon]";
+ mes "Many thanks for your trouble.";
+ mes "Now I don't feel shame to";
+ mes "ancestors anymore.";
+ mes "huhuh...";
+ mes "Have a good time.";
+ }
+ } else {
+ mes "Oh, it's you.";
+ mes "Once again, thank you.";
+ mes "Enjoy your stay in";
+ mes "our village.";
+ mes "huhuh..";
+ }
+ close;
+}
+
+gon_in.gat,152,35,4 script Hostess#gnbs 702,{
+ mes "[MaYumBang]";
+ if (b_sword < 1) {
+ mes "Oh.. you're new here right?";
+ mes "Came from out of town?";
+ mes "It's easy to see many people from";
+ mes "out of town these days.";
+ mes "It made people in the village busy.";
+ next;
+ mes "[MaYumBang]";
+ mes "Oops, what am I saying..";
+ mes "Wants some wine?";
+ next;
+ if (select("Yes, please:No, it's ok.") == 1) {
+ mes "[MaYumBang]";
+ mes "Oooops.. oh no...";
+ mes "Many customers came by earlier and";
+ mes "we are out of wine..";
+ mes "Customers are growing larger.";
+ mes "It is also a trouble..";
+ } else {
+ mes "[MaYumBang]";
+ mes "Well, have fun in the village.";
+ mes "Stop by sometimes.";
+ }
+ } else if (b_sword < 3) {
+ mes "You know what?";
+ mes "Chief's house was robbed last night.";
+ mes "I can't believe this happened.";
+ mes "Thieves are hanging around the";
+ mes "village these days.";
+ next;
+ mes "[MaYumBang]";
+ mes "How anxious it is..";
+ mes "It could also happen to my shop.";
+ mes "I should watch out.";
+ mes "oh..what am I saying to you..";
+ mes "Enjoy your time in my shop..hoho.";
+ if (b_sword == 1) set b_sword,2;
+ } else if (b_sword == 3) {
+ mes "Oh, it's you again.";
+ mes "I heard that you decided to";
+ mes "help our chief.";
+ mes "Please get him for us.";
+ mes "How anxious it is..";
+ next;
+ mes "[MaYumBang]";
+ mes "Do you see that guy over there";
+ mes "leaning on the table?";
+ mes "He seems to know about last night's";
+ mes "happenings.";
+ mes "He has been drinking all night long.";
+ set b_sword,4;
+ } else if (b_sword > 3 && b_sword < 11) {
+ mes "Hello there.";
+ mes "Feel something strange in the village huh?";
+ mes "It's all because of the thieves.";
+ mes "And it makes my business worse.";
+ mes "peeew...";
+ } else if (b_sword == 11 || b_sword == 12) {
+ mes "Feel something strange in the village huh?";
+ mes "Hope the thief to get caught in short time.";
+ mes "...";
+ } else {
+ mes "You caught him?";
+ mes "Wow, how brave you are.";
+ mes "I should get ready to run the";
+ mes "shop again. I need to order";
+ mes "some wine first.";
+ next;
+ mes "[MaYumBang]";
+ mes "SulBoong drank all the wine in the shop.";
+ mes "I did not refill the wine since there";
+ mes "aren't any customers...hoho.";
+ mes "Stop by next time.";
+ mes "I'll have a wine ready.";
+ }
+ close;
+}
+
+gon_in.gat,165,16,4 script Man in hangover#gnbs 748,{
+ mes "[SulBoong]";
+ if (b_sword < 4) {
+ mes "Ahhh.. my stomach.. my head..";
+ mes "Shouldn't drink so much..";
+ mes "Ehhhh....";
+ emotion e_swt2;
+ } else if (b_sword == 4) {
+ if (countitem(506) < 1) { // Green_Potion
+ mes "Ehhh....";
+ mes "Can somebody bring me a potion?";
+ mes "Ehhh....";
+ close;
+ }
+ mes "Ehhh..my stomach..";
+ mes "I need something..";
+ mes "Ehhh..";
+ mes "uh..hey you.. could you give me one of";
+ mes "your ^00FF00Green_Potion^000000 to me?";
+ mes "I got a mad stomach.";
+ next;
+ if (select("No.:Ok, here.") == 1 || countitem(506) < 1) {
+ mes "[SulBoong]";
+ mes "Ehh...";
+ mes "Are you sure?";
+ next;
+ if (select("Sorry, I don't have one.:Ok, here it is.") == 1 || countitem(506) < 1) {
+ mes "[SulBoong]";
+ mes "Wooo..";
+ mes "Go away man..";
+ set b_sword,12;
+ close;
+ }
+ delitem 506,1; // Green_Potion
+ set b_sword,5;
+ mes "[SulBoong]";
+ mes "Oh.. thanks.";
+ mes "I thought you're teasing me.";
+ mes "I feel much better now.";
+ mes "By the way.. You got any questions?";
+ next;
+ if (select("About thief.:Nothing.") == 1){
+ mes "[SulBoong]";
+ mes "Ah~ a thief..";
+ mes "hmm.. let me see..";
+ mes "I went out for walk in the middle";
+ mes "of night while I was drinking.";
+ mes "And I heard something noisy.";
+ next;
+ mes "[SulBoong]";
+ mes "I looked around and found that";
+ mes "area near chief's house was brighter";
+ mes "than any other area. It was strange.";
+ mes "So I kept watching at it and";
+ mes "all of a sudden, I saw something moving";
+ mes "on the roof of houses.";
+ next;
+ mes "[SulBoong]";
+ mes "It disappeared in a second.";
+ mes "I was drunk, and it was dark outside.";
+ mes "I have no idea whether it was a man or a cat or..";
+ mes "don't know what it was.. huhu..";
+ set b_sword,6;
+ } else {
+ mes "[SulBoong]";
+ mes "Ok, then, good bye..";
+ mes "Don't be a drinker like me.";
+ mes "Unless you want to suffer from a hangovers.";
+ mes "huhu..";
+ }
+ } else {
+ delitem 506,1; // Green_Potion
+ set b_sword,5;
+ emotion e_thx;
+ mes "[SulBoong]";
+ mes "Thank you.";
+ mes "heew.. feel much better now.";
+ mes "hmm.. you seem like you got";
+ mes "something to ask me.";
+ next;
+ switch(select("About thief..:How much have you been drinking?:Nothing..")){
+ case 1:
+ mes "[SulBoong]";
+ mes "Ah~ a thief..hmm...";
+ mes "I went out for walk in the middle";
+ mes "of night while I was drinking.";
+ mes "And I heard something noisy.";
+ mes "I looked around and found that";
+ mes "area near chief's house was brighter";
+ next;
+ mes "[SulBoong]";
+ mes "than any other area. It was strange.";
+ mes "So I kept watching at it and";
+ mes "all of a sudden, I saw something moving";
+ mes "on the roof of houses.";
+ mes "It disappeared in a second.";
+ next;
+ if (select("Where to?:Probably a cat.") == 1) {
+ mes "[SulBoong]";
+ mes "Umm?";
+ mes "Well..let me see..";
+ mes "It came from... and head to...um...";
+ mes "bla bla..";
+ next;
+ mes "He was mumbling for awhile";
+ mes "......";
+ next;
+ mes "[SulBoong]";
+ mes "Ah ha~ right...";
+ mes "A shrine.. yes..thief was heading to";
+ mes "a shrine and disappeared.";
+ mes "I'm not sure if it was a human or";
+ mes "an animal...but little big creature.";
+ mes "wonder what it was..";
+ set b_sword,6;
+ next;
+ mes "[SulBoong]";
+ mes "Anything else I can help?";
+ mes "Thanks for the potion.";
+ next;
+ switch(select("Thanks for the information.:Stop drinking too much.:Ok, bye")){
+ case 1:
+ mes "[SulBoong]";
+ mes "I'll see you later then.";
+ mes "I am always here drinking..huhu";
+ break;
+ case 2:
+ mes "[SulBoong]";
+ mes "hmm..";
+ mes "Don't mind me.";
+ break;
+ case 3:
+ mes "[SulBoong]";
+ mes "Alrighty.";
+ mes "Come again whenever you find";
+ mes "any other questions.";
+ break;
+ }
+ } else {
+ mes "[SulBoong]";
+ mes "Yeah..maybe.";
+ mes "It was so dark outside and I was drunk.";
+ mes "I can't remember it clearly.";
+ mes "Anyways it was bigger than a cat for sure.";
+ }
+ break;
+ case 2:
+ mes "[SulBoong]";
+ mes "Ah..um....I..I am not sure.";
+ mes "When I woke up, There were so many";
+ mes "empty bottles around me.";
+ mes ".....";
+ next;
+ mes "^00FF00.......";
+ mes "Without a specific reason, he seemed to be very respectable.^000000";
+ break;
+ case 3:
+ mes "[SulBoong]";
+ mes "alright then.";
+ mes "Hope you don't ever drink like me";
+ mes "in the future.";
+ mes "You'll suffer for long time if you do.";
+ mes "You know what hangover is right?";
+ break;
+ }
+ }
+ } else if (b_sword == 5) {
+ mes "Oh, it's you.";
+ mes "Thanks for the portion last time.";
+ mes "What are you up to?";
+ mes "Got any question for me?";
+ next;
+ if (select("About a thief last night...:Nope, just passing by..") == 1){
+ mes "[SulBoong]";
+ mes "Ah~ a thief..";
+ mes "hmm.. let me see..";
+ mes "I went out for walk in the middle";
+ mes "of night while I was drinking.";
+ mes "And I heard something noisy.";
+ mes "I looked around and found that";
+ next;
+ mes "[SulBoong]";
+ mes "area near chief's house was brighter";
+ mes "than any other area. It was strange.";
+ mes "So I kept watching at it and";
+ mes "all of a sudden, I saw something moving";
+ mes "on the roof of houses.";
+ next;
+ mes "[SulBoong]";
+ mes "It disappeared in a second.";
+ mes "I was drunk, and it was dark outside.";
+ mes "I have no idea whether it was a man or a cat or..";
+ mes "don't know what it was.. huhu..";
+ set b_sword,6;
+ } else {
+ mes "[SulBoong]";
+ mes "alright then.";
+ mes "Hope you don't ever drink like me";
+ mes "in the future.";
+ mes "bye.";
+ }
+ } else if (b_sword < 11) {
+ mes "Well, do your job well.";
+ mes "To keep the peace in our village,";
+ mes "we need to take chief's worries out.";
+ } else if (b_sword <14) {
+ switch (b_sword) {
+ case 11:
+ mes "Ahhh.. my stomach.. my head..";
+ mes "Shouldn't drink so much..";
+ mes "Ehhhh....";
+ emotion e_swt2;
+ break;
+ case 12:
+ mes "Ehhhh..go away.";
+ mes "You're a man with no mercy.";
+ mes "ehhh...";
+ emotion e_pif;
+ break;
+ case 13:
+ mes "Ehhhh..go away.";
+ mes "You're such a coldhearted man.";
+ mes "ehhh...";
+ emotion e_pif;
+ break;
+ }
+ } else {
+ mes "Wahahaha.";
+ mes "So..you found a chief's belongging's?";
+ mes "I knew you could've done it.";
+ mes "You're brave enough to do anything.";
+ mes "Wahahaha.";
+ }
+ close;
+}
+
+gon_dun01.gat,148,156,0 script start01#gnbs -1,{
+ OnInit:
+ sleep 10000;
+ OnCommandOn:
+ donpcevent "trace1-"+rand(1,5)+"::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,201,25,0 script trace1-1#gnbs 139,1,1,{
+ if (b_sword == 7) donpcevent "timer1-1::OnCommandOn";
+ end;
+
+ OnTimer10000:
+ stopnpctimer;
+ disablenpc "trace1-1#gnbs";
+ donpcevent "start01#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace1-1#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace1-1#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun01.gat,2,1,0 script timer1-1 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer1-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer1-1";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer1-1";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem1-1::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,202,25,0 script #getitem1-1 111,2,1,{
+ if (b_sword != 7) end;
+ set b_sword,8;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem1-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem1-1";
+ donpcevent "timer1-1::OnCommandOff";
+ donpcevent "start01#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem1-1";
+ end;
+}
+
+gon_dun01.gat,190,160,0 script trace1-2#gnbs 139,1,1,{
+ if (b_sword == 7) donpcevent "timer1-2::OnCommandOn";
+ end;
+
+ OnTimer100000:
+ stopnpctimer;
+ disablenpc "trace1-2#gnbs";
+ donpcevent "start01#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace1-2#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace1-2#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun01.gat,3,1,0 script timer1-2 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer1-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer1-2";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer1-2";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem1-2::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,190,159,0 script #getitem1-2 111,2,1,{
+ if (b_sword != 7) end;
+ set b_sword,8;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem1-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem1-2";
+ donpcevent "timer1-2::OnCommandOff";
+ donpcevent "start01#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem1-2";
+ end;
+}
+
+gon_dun01.gat,163,53,0 script trace1-3#gnbs 139,1,1,{
+ if (b_sword == 7) donpcevent "timer1-3::OnCommandOn";
+ end;
+
+ OnTimer90000:
+ stopnpctimer;
+ disablenpc "trace1-3#gnbs";
+ donpcevent "start01#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace1-3#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace1-3#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun01.gat,4,1,0 script timer1-3 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer1-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer1-3";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer1-3";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem1-3::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,164,53,0 script #getitem1-3 111,2,1,{
+ if (b_sword != 7) end;
+ set b_sword,8;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem1-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem1-3";
+ donpcevent "timer1-3::OnCommandOff";
+ donpcevent "start01#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem1-3";
+ end;
+}
+
+gon_dun01.gat,133,183,0 script trace1-4#gnbs 139,1,1,{
+ if (b_sword == 7) donpcevent "timer1-4::OnCommandOn";
+ end;
+
+ OnTimer150000:
+ stopnpctimer;
+ disablenpc "trace1-4#gnbs";
+ donpcevent "start01#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace1-4#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace1-4#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun01.gat,5,1,0 script timer1-4 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer1-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer1-4";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer1-4";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem1-4::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,134,183,0 script #getitem1-4 111,2,1,{
+ if (b_sword != 7) end;
+ set b_sword,8;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem1-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem1-4";
+ donpcevent "timer1-4::OnCommandOff";
+ donpcevent "start01#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem1-4";
+ end;
+}
+
+gon_dun01.gat,139,257,0 script trace1-5#gnbs 139,1,1,{
+ if (b_sword == 7) donpcevent "timer1-5::OnCommandOn";
+ end;
+
+ OnTimer170000:
+ stopnpctimer;
+ disablenpc "trace1-5#gnbs";
+ donpcevent "start01#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace1-5#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace1-5#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun01.gat,6,1,0 script timer1-5 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer1-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer1-5";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer1-5";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem1-5::OnCommandOn";
+ end;
+}
+
+gon_dun01.gat,140,257,0 script #getitem1-5 111,2,1,{
+ if (b_sword != 7) end;
+ set b_sword,8;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem1-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem1-5";
+ donpcevent "timer1-5::OnCommandOff";
+ donpcevent "start01#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem1-5";
+ end;
+}
+
+gon_dun02.gat,1,1,0 script start02#gnbs -1,{
+ OnInit:
+ sleep 10000;
+ OnCommandOn:
+ donpcevent "trace2-"+rand(1,6)+"::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,65,168,0 script trace2-1#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-1::OnCommandOn";
+ end;
+
+ OnTimer80000:
+ stopnpctimer;
+ disablenpc "trace2-1#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-1#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-1#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,2,1,0 script timer2-1 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-1";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-1";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-1::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,202,25,0 script #getitem2-1 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-1";
+ donpcevent "timer2-1::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-1";
+ end;
+}
+
+gon_dun02.gat,265,200,0 script trace2-2#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-2::OnCommandOn";
+ end;
+
+ OnTimer130000:
+ stopnpctimer;
+ disablenpc "trace2-2#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-2#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-2#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,3,1,0 script timer2-2 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-2";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-2";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-2::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,265,201,0 script #getitem2-2 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-2";
+ donpcevent "timer2-2::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-2";
+ end;
+}
+
+gon_dun02.gat,247,129,0 script trace2-3#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-3::OnCommandOn";
+ end;
+
+ OnTimer110000:
+ stopnpctimer;
+ disablenpc "trace2-3#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-3#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-3#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,4,1,0 script timer2-3 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-3";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-3";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-3::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,247,128,0 script #getitem2-3 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-3";
+ donpcevent "timer2-3::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-3";
+ end;
+}
+
+gon_dun02.gat,149,74,0 script trace2-4#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-4::OnCommandOn";
+ end;
+
+ OnTimer230000:
+ stopnpctimer;
+ disablenpc "trace2-4#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-4#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-4#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,5,1,0 script timer2-4 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-4";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-4";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-4::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,149,75,0 script #getitem2-4 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-4";
+ donpcevent "timer2-4::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-4";
+ end;
+}
+
+gon_dun02.gat,23,105,0 script trace2-5#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-5::OnCommandOn";
+ end;
+
+ OnTimer190000:
+ stopnpctimer;
+ disablenpc "trace2-5#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-5#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-5#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,6,1,0 script timer2-5 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-5";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-5";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-5::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,23,106,0 script #getitem2-5 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-5";
+ donpcevent "timer2-5::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-5";
+ end;
+}
+
+gon_dun02.gat,249,39,0 script trace2-6#gnbs 139,1,1,{
+ if (b_sword == 8) donpcevent "timer2-6::OnCommandOn";
+ end;
+
+ OnTimer110000:
+ stopnpctimer;
+ disablenpc "trace2-6#gnbs";
+ donpcevent "start02#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace2-6#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace2-6#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun02.gat,7,1,0 script timer2-6 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer2-6";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer2-6";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer2-6";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem2-6::OnCommandOn";
+ end;
+}
+
+gon_dun02.gat,249,40,0 script #getitem2-6 111,2,1,{
+ if (b_sword != 8) end;
+ set b_sword,9;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem2-6";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem2-6";
+ donpcevent "timer2-6::OnCommandOff";
+ donpcevent "start02#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem2-6";
+ end;
+}
+
+gon_dun03.gat,1,1,0 script start03#gnbs -1,{
+ OnInit:
+ sleep 10000;
+ OnCommandOn:
+ donpcevent "trace3-"+rand(1,7)+"::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,11,75,0 script trace3-1#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-1::OnCommandOn";
+ end;
+
+ OnTimer200000:
+ stopnpctimer;
+ disablenpc "trace3-1#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-1#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-1#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,2,1,0 script timer3-1 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-1";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-1";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-1::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,10,74,0 script #getitem3-1 111,2,1,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-1";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-1";
+ donpcevent "timer3-1::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-1";
+ end;
+}
+
+gon_dun03.gat,199,103,0 script trace3-2#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-2::OnCommandOn";
+ end;
+
+ OnTimer130000:
+ stopnpctimer;
+ disablenpc "trace3-2#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-2#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-2#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,3,1,0 script timer3-2 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-2";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-2";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-2::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,199,102,0 script #getitem3-2 111,2,1,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-2";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-2";
+ donpcevent "timer3-2::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-2";
+ end;
+}
+
+gon_dun03.gat,14,162,0 script trace3-3#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-3::OnCommandOn";
+ end;
+
+ OnTimer110000:
+ stopnpctimer;
+ disablenpc "trace3-3#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-3#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-3#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,4,1,0 script timer3-3 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-3";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-3";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-3::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,14,163,0 script #getitem3-3 111,2,1,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-3";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-3";
+ donpcevent "timer3-3::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-3";
+ end;
+}
+
+gon_dun03.gat,155,263,0 script trace3-4#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-4::OnCommandOn";
+ end;
+
+ OnTimer230000:
+ stopnpctimer;
+ disablenpc "trace3-4#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-4#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-4#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,5,1,0 script timer3-4 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-4";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-4";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-4::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,156,263,0 script #getitem3-4 111,2,1,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-4";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-4";
+ donpcevent "timer3-4::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-4";
+ end;
+}
+
+gon_dun03.gat,169,90,0 script trace3-5#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-5::OnCommandOn";
+ end;
+
+ OnTimer190000:
+ stopnpctimer;
+ disablenpc "trace3-5#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-5#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-5#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,6,1,0 script timer3-5 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-5";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-5";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-5::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,170,90,0 script #getitem3-5 111,2,1,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-5";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-5";
+ donpcevent "timer3-5::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-5";
+ end;
+}
+
+gon_dun03.gat,162,40,0 script trace3-6#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-6::OnCommandOn";
+ end;
+
+ OnTimer110000:
+ stopnpctimer;
+ disablenpc "trace3-6#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-6#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-6#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,7,1,0 script timer3-6 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-6";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-6";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-6";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-6::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,68,39,0 script #getitem3-6 111,1,2,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-6";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-6";
+ donpcevent "timer3-6::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-6";
+ end;
+}
+
+gon_dun03.gat,68,212,0 script trace3-7#gnbs 139,1,1,{
+ if (b_sword == 9) donpcevent "timer3-7::OnCommandOn";
+ end;
+
+ OnTimer110000:
+ stopnpctimer;
+ disablenpc "trace3-7#gnbs";
+ donpcevent "start03#gnbs::OnCommandOn";
+ end;
+
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "trace3-7#gnbs";
+ end;
+
+ OnCommandOn:
+ enablenpc "trace3-7#gnbs";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+}
+
+gon_dun03.gat,6,1,0 script timer3-7 -1,{
+ OnInit:
+ initnpctimer;
+ stopnpctimer;
+ disablenpc "timer3-7";
+ end;
+
+ OnCommandOn:
+ enablenpc "timer3-7";
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+ OnCommandOff:
+ stopnpctimer;
+ disablenpc "timer3-7";
+ end;
+
+ OnTimer3000:
+ donpcevent "#getitem3-7::OnCommandOn";
+ end;
+}
+
+gon_dun03.gat,68,213,0 script #getitem3-7 111,1,2,{
+ if (b_sword != 9) end;
+ set b_sword,10;
+ mes "You found ^FF0000piece of blade^000000.";
+ mes "Seems like it's a part of the sword you've been looking for.";
+ mes "You put all the pieces on the ground";
+ mes "and assembled them. Seems like you've found ";
+ mes "all pieces of the blade.";
+ close;
+
+ OnInit:
+ disablenpc "#getitem3-7";
+ end;
+
+ OnCommandOn:
+ enablenpc "#getitem3-7";
+ donpcevent "timer3-7::OnCommandOff";
+ donpcevent "start03#gnbs::OnCommandOn";
+
+ OnCommandOff:
+ disablenpc "#getitem3-7";
+ end;
+}
+
+gon_in,18,27,5 script Madam#gnbs 771,{
+ mes "[SangHwaYeun]";
+ mes "hohohohoho~";
+ mes "Who might this be?";
+ mes "A vistor from out of town~";
+ mes "hohoho.";
+ next;
+ if (select("Hi, Madam~:Where's chief?") == 1) {
+ mes "[SangHwaYeun]";
+ mes "Hi, there~";
+ close;
+ }
+ mes "[SangHwaYeun]";
+ if (sex == 0) {
+ mes "Hoho, he's upstairs.";
+ mes "You're such a pretty lady.";
+ mes "Don't be too fascinated by";
+ mes "my husband. alright?";
+ mes "Hohoho~";
+ } else {
+ mes "He's upstairs.";
+ mes "You are such a handsome young man";
+ mes "But not better than my huhsband.";
+ mes "Hohoho..";
+ }
+ close;
+}
+
+gon_dun03,62,222,0 script Strange dead body#gnbs 111,{
+ if (b_sword < 7) {
+ mes "Here's a rotten dead body.";
+ mes "Seemed to be eaten by monsters.";
+ close;
+ }
+ if (b_sword > 6 && b_sword < 11) {
+ mes "There's a paper between the bones";
+ mes "of dead body.";
+ mes "Take a look?";
+ next;
+ if (select("Yes.:Leave.") == 1) {
+ mes "Paper is so worned out,";
+ mes "but there's a words on it.";
+ mes "It's written by a blood.";
+ mes "So difficult to see the letter.";
+ mes "Almost impossible to find out what's written.";
+ next;
+ mes "^FF0000Damn I can't...believe.. failed..";
+ mes "Sayum... I should've..";
+ mes "watchout...ehhh...but.. break";
+ mes "..pieces...and seprate..";
+ mes "I..with";
+ mes "this...^000000";
+ next;
+ mes "Paper was all blood-stained.";
+ mes "He probably couldn't make it any longer.";
+ } else {
+ mes "Felt something was missing.";
+ mes "Blood-stained dead body was";
+ mes "getting on my nerve";
+ mes "But I just decided to leave from here.";
+ }
+ } else if (b_sword == 11 || b_sword == 12) {
+ mes "Here's a ungly looking dead body.";
+ mes "I should just pass by.";
+ } else {
+ mes "A skeleton eaten by many monsters.";
+ mes "Felt pitable for awhile, but felt";
+ mes "bad when looking at it for";
+ mes "long time.";
+ }
+ close;
+}
+
+gonryun,139,142,7 script Girl##gnbs1 772,{
+ mes "[SaEunSo]";
+ if (b_sword < 12) {
+ mes "..........";
+ mes "I was happy looking at the visitors";
+ mes "from other villages, but because of";
+ mes "the thief, I feel terrible now'";
+ emotion e_dots;
+ } else {
+ mes "Hehe...";
+ mes "I am so happy now.";
+ mes "Lots of visitors are coming to our village..";
+ mes "found the stuff my father lost..";
+ mes "Hehe...";
+ mes "The guy who found the stuff for my";
+ mes "father.. I am sure he is a great man.";
+ }
+ close;
+}
+
+gonryun.gat,100,241,0 script Stranger#gnbs" 733,{
+ mes "[Choahk]";
+ if (b_sword < 14) {
+ mes "Hmm...";
+ mes "I'm pretty busy right now, come later.";
+ emotion e_dots;
+ } else if (b_sword < 17) {
+ switch (b_sword) {
+ case 14:
+ switch(nakha) {
+ case 0:
+ mes "Hmm...";
+ mes "What is it?";
+ mes "What do you want?";
+ mes "I don't like to get bothered.";
+ next;
+ if (select("Ask about blacksmith.:Are are you being so mean?") == 1){
+ mes "[Choahk]";
+ mes "Hum.....";
+ mes "so..you are the one who found";
+ mes "the sword huh?";
+ mes "Did you also get asked to repair it?";
+ next;
+ if (select("Exactly.:No..I'm just...") == 1){
+ mes "[Choahk]";
+ mes "well..";
+ mes "If you want some information";
+ mes "from me, come after helping one";
+ mes "person in the village who's in trouble right now.";
+ set b_sword,16;
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "I guess not...";
+ mes "Don't bother me anymore. I got bunch of things to do.";
+ }
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "Why do you care about other's";
+ mes "personality. It's none of your business.";
+ mes "Take a look at yourself first";
+ mes "before you say something like that.";
+ }
+ break;
+ case 1:
+ mes "Hmm...";
+ mes "You're in the middle of helping";
+ mes "someone now huh?";
+ mes "Why don't you go and take care of it first.";
+ mes "Once you start to help someone,";
+ mes "you're responsible to finsh that job well.";
+ set b_sword,16;
+ break;
+ case 2:
+ mes "Hmm...";
+ mes "You're in the middle of helping";
+ mes "someone now huh?";
+ mes "Why don't you go and take care of it first.";
+ mes "Once you start to help someone,";
+ mes "you're responsible to finsh that job well.";
+ set b_sword,16;
+ break;
+ case 3:
+ mes "Hmm...";
+ mes "What do you want??";
+ next;
+ if (select("Ask about blacksmith.:Are are you being so mean?") == 1) {
+ mes "[Choahk]";
+ mes "Hum.....";
+ mes "so..you are the one who found";
+ mes "the sword huh?";
+ mes "Did you also get asked to repair it?";
+ next;
+ if (select("Exactly.:No..I'm just...") == 1){
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "Since it's broke into pieces,";
+ mes "you should find someone to repair it.";
+ mes "Go to ^FF0000Geffen^000000, you'll find someone";
+ mes "who can help you.";
+ set b_sword,17;
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "I guess not...";
+ mes "Don't bother me anymore.";
+ mes "I got bunch of things to do.";
+ }
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "Why do you care about other's";
+ mes "personality. It's none of your business.";
+ mes "Take a look at yourself first";
+ mes "before you say something like that.";
+ }
+ break;
+ case 4:
+ mes "Guess I was wasting my time.";
+ mes "If you make any promises,";
+ mes "it's your responsibility to";
+ mes "take care of it until it's completely done.";
+ next;
+ mes "[Choahk]";
+ mes "I don't like people who do not";
+ mes "keep the promises.";
+ mes "You'll not get any informations from me.";
+ mes "Don't ever bother me again.";
+ set b_sword,15;
+ break;
+ }
+ break;
+ case 15:
+ mes "Hmm...";
+ mes "I'm busy right now. Why don't come later.";
+ emotion e_dots;
+ break;
+ case 16:
+ switch(nakha){
+ case 0:
+ mes "Hmm......";
+ mes "You're not done with your";
+ mes "requirements yet.";
+ mes "I can't give you any information";
+ mes "until you finish your job.";
+ break;
+ case 1:
+ mes "Hmm....";
+ mes "Once you start to help someone,";
+ mes "you're responsible to finsh that job well.";
+ mes "Why don't you go and take care of it first.";
+ break;
+ case 2:
+ mes "Hmm....";
+ mes "Once you start to help someone,";
+ mes "you're responsible to finsh that job well.";
+ mes "Why don't you go and take care of it first.";
+ break;
+ case 3:
+ mes "Hmm......";
+ mes "What do you want?";
+ next;
+ if (select("Ask about blacksmith.:Are are you being so mean?") == 1) {
+ mes "[Choahk]";
+ mes "Hum.....";
+ mes "so..you are the one who found";
+ mes "the sword huh?";
+ mes "Did you also get asked to repair it?";
+ next;
+ if (select("Exactly:No.. I'm just...") == 1) {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "Since it's broke into pieces,";
+ mes "you should find someone to repair it.";
+ mes "Go to ^FF0000Geffen^000000, you'll find someone";
+ mes "who can help you.";
+ set b_sword,17;
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "I guess not...";
+ mes "Don't bother me anymore.";
+ mes "I got bunch of things to do.";
+ }
+ } else {
+ mes "[Choahk]";
+ mes "Hmm...";
+ mes "Why do you care about other's";
+ mes "personality. It's none of your business.";
+ mes "Take a look at yourself first";
+ mes "before you say something like that.";
+ }
+ break;
+ case 4:
+ mes "Guess I was wasting my time.";
+ mes "If you make any promises,";
+ mes "it's your responsibility to";
+ mes "take care of it until it's completely done.";
+ next;
+ mes "[Choahk]";
+ mes "I don't like people who do not";
+ mes "keep the promises.";
+ mes "You'll not get any informations from me.";
+ mes "Don't ever bother me again.";
+ set b_sword,15;
+ break;
+ }
+ break;
+ }
+ } else if (b_sword < 33) {
+ mes "Umm?";
+ mes "Didn't I tell you to go to ^FF0000Geffen^000000?";
+ mes "You'll find famous blacksmith there.";
+ mes "He'll repair the sword for you.";
+ mes "I gave you all the informations";
+ mes "I have so far.";
+ next;
+ mes "[Choahk]";
+ mes "You are responsible to take care of the rest.";
+ } else {
+ mes "Hmm......";
+ mes "Helping people in trouble is";
+ mes "such a nice thing to do.";
+ mes "You are doing the right thing.";
+ }
+ close;
+}
+
+geffen_in.gat,71,112,2 script Blacksmith#SaYumMoon 731,{
+ mes "[Aumgarl]";
+ if (b_sword < 17) {
+ mes "Pew..hew....";
+ mes "My poor baby Lyroo..";
+ mes "hew....";
+ } else if (b_sword < 32) {
+ switch (b_sword) {
+ case 17:
+ mes "Pew..hew....";
+ mes "My poor baby Lyroo..";
+ mes "hew....";
+ next;
+ if (select("Sir...:...........") == 1) {
+ mes "[Aumgarl]";
+ mes "Umm? Who're you?";
+ mes "Need something?";
+ mes "If not, please leave..";
+ next;
+ if (select("I came to repair the sword.:I heard you are famous blacksmith...") == 1) {
+ mes "[Aumgarl]";
+ mes "Umm........";
+ mes "Sorry but, we're closed.";
+ mes "Come again next time.";
+ mes "Bye";
+ set b_sword,18;
+ } else {
+ mes "[Aumgarl]";
+ mes "Yes, I am a blacksmith,";
+ mes "but I don't think I am famous.";
+ mes "And unfortunately.. we are closed.";
+ }
+ } else {
+ mes "[Aumgarl]";
+ mes "Done with your business?";
+ mes "Then please leave.";
+ }
+ break;
+ case 18:
+ mes "Like I said...I am busy!";
+ mes "Come later.";
+ if (rand(1,8) == 7) {
+ set b_sword,19;
+ mes "What nerve you've got!";
+ }
+ close2;
+ warp "geffen.gat",173,169;
+ end;
+ case 19:
+ mes "Hmm....";
+ mes "Ahh....";
+ mes "What nerve you've got!";
+ mes "What do you want?";
+ next;
+ switch(select("I want to marry your granddaughter.:Your graddaughter is such a pretty girl.:I came to repair the sword.")){
+ case 1:
+ mes "[Aumgarl]";
+ mes ".....";
+ mes ".........";
+ mes ".............";
+ mes "...................";
+ mes "........................";
+ next;
+ mes "[Aumgarl]";
+ mes "Who the heck are you?";
+ mes "Want my granddaughter all of a sudden?";
+ mes "Get the hell out of here!";
+ mes "Don't ever come back here!";
+ emotion e_pif;
+ break;
+ case 2:
+ mes "[Aumgarl]";
+ mes "You're damn right~";
+ mes "My granddaughter is so~ pretty.";
+ mes "Hahaha....";
+ mes ".....peew heew....";
+ next;
+ switch(select("I want to marry her...:I came to repair the sword.:Anything wrong?")){
+ case 1:
+ mes "[Aumgarl]";
+ mes ".....";
+ mes ".........";
+ mes ".............";
+ mes "...................";
+ mes "........................";
+ next;
+ mes "[Aumgarl]";
+ mes "Who the heck are you?";
+ mes "Want my granddaughter all of a sudden?";
+ mes "Get the hell out of here!";
+ mes "Don't ever come back here!";
+ emotion e_pif;
+ break;
+ case 2:
+ mes "[Aumgarl]";
+ mes "...............";
+ mes "the sword?";
+ mes "I don't remember when was the";
+ mes "last time I touched a steel.";
+ mes "hmm...";
+ mes "let me see the sword.?";
+ next;
+ mes "[Aumgarl]";
+ mes "Hmm......";
+ mes "Umm.........";
+ mes "............";
+ next;
+ mes "^0000FFHe took a careful look at the pieces of sword for awhile.^000000";
+ next;
+ mes "[Aumgarl]";
+ mes "Hmm.......";
+ mes "So this is the one huh?";
+ mes "Well.....";
+ mes "I am sorry, but this sword is not";
+ mes "something I can repair";
+ mes "at the moment.";
+ next;
+ mes "[Aumgarl]";
+ mes "Why don't you go find";
+ mes "some other blacksmith.";
+ mes "I am sorry........";
+ break;
+ case 3:
+ mes "[Aumgarl]";
+ mes "Ah...............";
+ mes "this is not something I shall tell";
+ mes "others....but....";
+ mes "my granddaughter lyroo has";
+ mes "an incurable disease...";
+ next;
+ mes "[Aumgarl]";
+ mes "Not long after she was born,";
+ mes "her parents died by an accident.";
+ mes "Since from that day of an accident,";
+ mes "I took care of her.";
+ mes "hmm......";
+ next;
+ mes "[Aumgarl]";
+ mes "Ahh...........";
+ mes "and...moreover, she started to suffer";
+ mes "from an illness. I've met many famous";
+ mes "doctors all around the place but....";
+ mes "no one even found out the name of";
+ mes "a disease.";
+ next;
+ switch(select("I am sorry to hear that.:I'll make her happy.:I want to cure her.")){
+ case 1:
+ mes "[Aumgarl]";
+ mes "Ahh.......";
+ mes "I'll just have to take it";
+ mes "as our fate.";
+ mes "I just feel sorry for lyroo.";
+ mes ".............";
+ emotion e_dots;
+ break;
+ case 2:
+ mes "[Aumgarl]";
+ mes "Umm.....";
+ mes "What do you mean?";
+ mes "How're you going to make her happy?";
+ mes "I don't think it makes sense at all.";
+ mes "Umm......";
+ next;
+ switch(select( "I'll make her happy all the time.:I want to take her with me.:I will cure her.")){
+ case 1:
+ mes "[Aumgarl]";
+ mes "................";
+ mes "What are you talking about?";
+ mes "Make her happy all the time?";
+ mes "She is dying even at";
+ mes "this moment.";
+ next;
+ mes "[Aumgarl]";
+ mes "I think you are out of";
+ mes "your mind!";
+ mes "Get out of here.";
+ break;
+ case 2:
+ mes "[Aumgarl]";
+ mes "................";
+ mes "You want to take her to where?";
+ mes "What are you gonna do?";
+ next;
+ if (select("I will cure her.:I am sorry.") == 1) {
+ mes "[Aumgarl]";
+ mes "It's useless talking about";
+ mes "it any longer. I don't think";
+ mes "there is anyone who can";
+ mes "cure my granddaughter.";
+ } else {
+ mes "[Aumgarl]";
+ mes "Ahh.......";
+ mes "I am not blaming you.";
+ mes "It's not your fault anyway.";
+ mes "........";
+ next;
+ if (select("...........:I'll wish for her recover.") == 1){
+ mes "[Aumgarl]";
+ mes "Ahh......";
+ mes "....I am sorry to ask you this but..";
+ mes "can you do me a favor?";
+ mes "Umm......";
+ next;
+ if (select("No.:Sure.") == 1) {
+ mes "[Aumgarl]";
+ mes "Umm....";
+ mes "Alright, I won't bother you..";
+ mes "bye...";
+ break;
+ }
+ mes "[Aumgarl]";
+ mes "It won't be easy but,";
+ mes "would you help me to find";
+ mes "any doctors... nono..anybody";
+ mes "who can cure Lyroo or";
+ next;
+ mes "[Aumgarl]";
+ mes "has any informations";
+ mes "about her unidentified illness?";
+ mes "please?";
+ mes "...peeew..";
+ next;
+ menu "Yes, Sir.",-;
+ mes "[Aumgarl]";
+ mes "Oh....";
+ mes "Thank you so much.";
+ mes "If Lyroo can get her health back,";
+ mes "I'll never forget";
+ mes "your help forever.";
+ next;
+ mes "[Aumgarl]";
+ mes "Thank you..";
+ mes "Thank you...";
+ set b_sword,20;
+ } else {
+ mes "[Aumgarl]";
+ mes "Well...thanks.";
+ mes "I'm going to try my best to";
+ mes "make her happy till the";
+ mes "last second.";
+ mes "Come by sometimes to say hi";
+ mes "to Lyroo.";
+ }
+ }
+ break;
+ case 3:
+ mes "[Aumgarl]";
+ mes ".............";
+ mes "How're you going to cure";
+ mes "my granddaughter?";
+ mes "You don't look like";
+ mes "a doctor to me.";
+ next;
+ switch(select("I am a doctor.:I know a famous doctor.:I'll cure her no matter what.")){
+ case 1:
+ mes "[Aumgarl]";
+ mes "Hoo.......";
+ mes "Do I look like a fool to you?";
+ mes "I hate people who lie";
+ emotion e_pif;
+ close2;
+ warp "geffen.gat",173,169;
+ end;
+ case 2:
+ mes "[Aumgarl]";
+ mes "A famous doctor?";
+ mes "I've met all kinds of";
+ mes "doctors around.";
+ mes "I probably have met that";
+ mes "doctor already.";
+ break;
+ case 3:
+ mes "[Aumgarl]";
+ mes "................";
+ mes "You want to cure her";
+ mes "no matter what?";
+ mes "How're going to do that?";
+ mes "What if it turns worse?";
+ mes "Huh?";
+ next;
+ mes "[Aumgarl]";
+ mes "No more of your bragging.";
+ mes "Please go away.";
+ break;
+ }
+ break;
+ }
+ break;
+ case 3:
+ mes "[Aumgarl]";
+ mes ".................";
+ mes "Thanks for your concern..";
+ mes "but you're a stranger to us.";
+ mes "I can't let you do that.";
+ mes "Thanks anyways.";
+ break;
+ }
+ break;
+ }
+ break;
+ case 3:
+ mes "[Aumgarl]";
+ mes ".........";
+ mes "Umm........";
+ mes "I'm sorry but";
+ mes "I am so exhausted.";
+ mes "Can't help you..";
+ break;
+ }
+ break;
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ mes "Ahh........";
+ mes "Go to place where it's";
+ mes "crowd of people.";
+ mes "And you'll get some informations.";
+ mes "I'm counting on you.";
+ break;
+ case 24:
+ case 25:
+ case 26:
+ mes "Ahh....";
+ mes "Lyroo is upstairs.";
+ mes "She's in pain.";
+ mes "Don't talk to her too long.";
+ break;
+ case 27:
+ mes "Oh....";
+ mes "Thank you...";
+ mes "I never thought you'll";
+ mes "help me.";
+ mes "Go ahead see Lyroo.";
+ break;
+ case 28:
+ mes "Thank you so much...";
+ mes "Without your help...";
+ emotion e_sob;
+ mes "it was meaningless.";
+ next;
+ mes "[Aumgarl]";
+ mes "Alright....";
+ mes "Is there anything I can";
+ mes "do for you?";
+ mes "I want to return your favor somehow.";
+ next;
+ if (select("No..I don't need anything.:Would you repair the sword for me?") == 1) {
+ mes "[Aumgarl]";
+ mes "Hmm....";
+ mes "Well..";
+ mes "Whenever you have a favor to ask,";
+ mes "come and find me.";
+ mes "I'll try my best to help you.";
+ set b_sword,29;
+ } else {
+ mes "[Aumgarl]";
+ mes "Hmm....";
+ mes "Show me the sword.";
+ mes "I need to take a look at it first";
+ mes "to find out whether I can repair it or not.";
+ next;
+ mes "^0000FF Showed the pieces of broken sword";
+ mes "to Aumgarl.";
+ mes "....................";
+ mes "Aumgarl took a careful look";
+ mes "at the pieces for awhile..^000000";
+ next;
+ mes "................";
+ mes "............";
+ mes "........";
+ mes "......";
+ next;
+ mes "[Aumgarl]";
+ mes "Umm.....";
+ mes "Well.....";
+ mes "It's not possible to get into";
+ mes "work right away.";
+ mes "I need some materials.";
+ next;
+ mes "[Aumgarl]";
+ mes "To repair this sword, we need";
+ mes "some materials.";
+ mes "Since Lyroo is upstairs in pain.";
+ mes "I don't think I can leave the house.";
+ next;
+ mes "[Aumgarl]";
+ mes "so....would you get the";
+ mes "materials for me?";
+ mes "I am sorry I am asking";
+ mes "you too much to do.";
+ next;
+ if (select("Umm..let's do it next time.:Alright, I'll go get them.") == 1){
+ mes "[Aumgarl]";
+ mes "Umm.....";
+ mes "I am sorry I can't";
+ mes "help you right away.";
+ mes "Come back here when";
+ mes "you need my help then.";
+ } else {
+ mes "[Aumgarl]";
+ mes "Oh~~ really?";
+ mes "Thank you.";
+ mes "I'm sure I'll repair it for you.";
+ mes "Now, listen carefully.";
+ next;
+ mes "[Aumgarl]";
+ mes "^FF00FF One Anvil";
+ mes "2 Oridecon Stones";
+ mes "5 Broken Swords";
+ mes "2 Steels";
+ mes "1 Hammer of Blacksmith";
+ mes "2 Star Crumbs";
+ mes "5 Live Coals^000000";
+ next;
+ mes "[Aumgarl]";
+ mes "Quite alot huh?";
+ mes "They are necessities";
+ mes "We need them to repair the sword.";
+ mes "I'll go find some other materials.";
+ set b_sword,30;
+ }
+ }
+ break;
+ case 29:
+ mes "Oh~ It's you.";
+ mes "Got any favor to ask?";
+ mes "I'll do my best";
+ mes "to help you.";
+ next;
+ if (select("Maybe next time..:Please repair this sword for me.") == 1) {
+ mes "[Aumgarl]";
+ mes "Well..";
+ mes "Whenever you have a favor to ask,";
+ mes "come and find me.";
+ } else {
+ mes "[Aumgarl]";
+ mes "Hmm....";
+ mes "Show me the sword.";
+ mes "I need to take a look at it first";
+ mes "to find out whether I can repair it or not.";
+ next;
+ mes "^0000FF Showed the pieces of broken sword";
+ mes "to Aumgarl.";
+ mes "....................";
+ mes "Aumgarl took a careful look";
+ mes "at the pieces for awhile..^000000";
+ next;
+ mes "................";
+ mes "............";
+ mes "........";
+ mes "......";
+ next;
+ mes "[Aumgarl]";
+ mes "Umm.....";
+ mes "Well.....";
+ mes "It's not possible to get into";
+ mes "work right away.";
+ mes "I need some materials.";
+ next;
+ mes "[Aumgarl]";
+ mes "To repair this sword, we need";
+ mes "some materials.";
+ mes "Since Lyroo is upstairs in pain.";
+ mes "I don't think I can leave the house.";
+ next;
+ mes "[Aumgarl]";
+ mes "so....would you get the";
+ mes "materials for me?";
+ mes "I am sorry I am asking";
+ mes "you too much to do.";
+ next;
+ if (select("Umm..let's do it next time.:Alright, I'll go get them.") == 1) {
+ mes "[Aumgarl]";
+ mes "Umm.....";
+ mes "I am sorry I can't";
+ mes "help you right away.";
+ mes "Come back here when";
+ mes "you need my help then.";
+ } else {
+ mes "[Aumgarl]";
+ mes "Oh~~ really?";
+ mes "Thank you.";
+ mes "I'm sure I'll repair it for you.";
+ mes "Now, listen carefully.";
+ next;
+ mes "[Aumgarl]";
+ mes "^FF00FF1 Anvil";
+ mes "2 Oridecon Stones";
+ mes "5 Broken Swords";
+ mes "2 Steels";
+ mes "1 Hammer of Blacksmith";
+ mes "2 Star Crumbs";
+ mes "5 Live Coals^000000";
+ next;
+ mes "[Aumgarl]";
+ mes "Quite alot huh?";
+ mes "They are necessities";
+ mes "We need them to repair the sword.";
+ mes "I'll go find some other materials.";
+ set b_sword,30;
+ }
+ }
+ break;
+ case 30:
+ if (countitem(986) > 0 && countitem(756) > 1 && countitem(7110) > 4 && countitem(999) > 1 && countitem(1005) > 0 && countitem(1000) > 1 && countitem(7098) > 4) {
+ mes "Oh~~ good, you got them all.";
+ mes "Alright, come back later,";
+ mes "I'll have it repaired.";
+ delitem 986,1; // Anvil
+ delitem 756,2; // Oridecon_Stone
+ delitem 7110,5; // Vroken_Sword
+ delitem 999,2; // Steel
+ delitem 1005,1; // Hammer_Of_Blacksmith
+ delitem 1000,2; // Star_Crumb
+ delitem 7098,5; // Live_Coal
+ set b_sword,31;
+ } else {
+ mes "Hmm.....";
+ mes "Not ready yet?";
+ mes "Materials you need are...";
+ next;
+ mes "[Aumgarl]";
+ mes "^FF00FF1 Anvil";
+ mes "2 Oridecon Stones";
+ mes "5 Broken Swords";
+ mes "2 Steels";
+ mes "1 Hammer of Blacksmith";
+ mes "2 Star Crumbs";
+ mes "5 Live Coals^000000";
+ next;
+ mes "[Aumgarl]";
+ mes "Wrote them down?";
+ mes "I'm almost ready for other materials.";
+ }
+ break;
+ case 31:
+ if (rand(1,5) == 2) {
+ mes "Hey, you're back.";
+ mes "Here it is.";
+ mes "This sword is a great one";
+ mes "for sure. I've noticed at";
+ mes "the first sight.";
+ mes "huhu.....";
+ next;
+ mes "[Aumgarl]";
+ mes "I haven't seen this kind of";
+ mes "great sword for a long";
+ mes "time in my life.";
+ mes "I envy you...";
+ mes "Huhuhu......";
+ next;
+ mes "'You received repaired";
+ mes "'^FF0000SaYumMoon's sword^000000'.";
+ set b_sword,32;
+ getitem 1123,1; // Haedonggum
+ } else {
+ mes "Umm.. it's not done yet.";
+ mes "Would you give me little";
+ mes "more time? It takes longer";
+ mes "than I thought. sorry.";
+ }
+ break;
+ }
+ } else {
+ mes "Thank you...";
+ mes "You've been a great help";
+ mes "to us.";
+ mes "Hope my work had";
+ mes "helped you.";
+ }
+ close;
+}
+
+geffen_in.gat,106,106,7 script Girl#gnbs2 716,{
+ mes "[Lyroo]";
+ if (b_sword < 20) {
+ mes "Ah...Ah....";
+ mes "Ah...Hi.......";
+ next;
+ mes "^0000FFThis girl seemed to be in serious pain.^000000";
+ close;
+ } else if (b_sword < 24) {
+ mes "Aaa....Aaa....";
+ mes "you...you....";
+ mes "you are the....one...";
+ mes "who will....cure....";
+ mes "...me? Aa....";
+ next;
+ mes "[Lyroo]";
+ mes "..tha... thank you....";
+ next;
+ mes "^0000FFBetter stop talking to her and";
+ mes "rush to find a way to cure her.^000000";
+ close;
+ } else if (b_sword == 24 || b_sword == 25 || b_sword == 26) {
+ mes "Ahh...ahh....";
+ if (sex == 0) {
+ mes "It's ..you.. pretty...sister..";
+ } else {
+ mes "It's ..you.. handsome...brother..";
+ }
+ mes "ah he he....";
+ next;
+ if (select("Ask about her health condition.:Talk to her for a while.") == 1){
+ mes "[Lyroo]";
+ if (rand(1,4) == 3) {
+ mes "uh....umm...?";
+ mes "umm... I...";
+ mes "I can't talk...too long..";
+ mes "so.. listen....carefully..please...";
+ next;
+ mes "[Lyroo]";
+ mes "^0030FFMy body..repeatedly turns cold and hot...";
+ mes "....no sweating on my body...";
+ mes "..and get paralyzed ...quite often..and..";
+ mes "my heart beats ...irregularly.^000000";
+ next;
+ mes "[Lyroo]";
+ mes "Ahh...Ahh.";
+ mes "...........";
+ } else {
+ mes "I...am...so...";
+ mes "...tired.";
+ mes ".............";
+ }
+ } else {
+ mes "[Lyroo]";
+ mes "Ahh........";
+ mes "I..want to ...talk to...you..";
+ mes "but.... sorry....";
+ }
+ next;
+ mes "^0000FFshe seems to have fallen asleeep.^000000";
+ close;
+ } else if (b_sword == 27) {
+ mes "uh...umm?";
+ if (sex == 0) {
+ mes "Ah....It's you pretty sister...";
+ } else {
+ mes "Ah....It's you handsome brother...";
+ }
+ if (countitem(606) > 0) {
+ mes "uh?..what is that you have?";
+ next;
+ if (select("It's nothing.:It's your medicine.") == 1 || countitem(606) < 1){
+ mes "[Lyroo]";
+ mes "umm......";
+ mes "ok....";
+ mes "...........";
+ close;
+ }
+ mes "[Lyroo]";
+ mes "Ah!";
+ mes "you found the medicine~";
+ mes "Ah..hehe...";
+ delitem 606,1; // Aloebera
+ next;
+ mes "^0000FFYou gave her a medicine you";
+ mes "received from Cylrnel.";
+ mes "After taking a medicine, Lyroo";
+ mes "fell in asleep.^000000";
+ set b_sword,28;
+ }
+ close;
+ } else {
+ mes "ehehe...";
+ if (sex == 0) {
+ mes "Thank you my pretty sister.";
+ } else {
+ mes "Thank you my handsome brother.";
+ }
+ mes "I'll have my health back";
+ mes "and be a strong girl. hehe";
+ close;
+ }
+}
+
+prontera.gat,275,86,2 script Young man#SaYumMoon" 97,{
+ mes "[Neil]";
+ if (b_sword < 20) {
+ mes "It's so good to be helathy.";
+ mes "If you stay in hospital laying";
+ mes "down on the bed all day long,";
+ mes "It'll make you feel depressed.";
+ next;
+ mes "[Neil]";
+ mes "Take care of your health";
+ mes "all the time.";
+ mes "Health is the best of all.";
+ } else {
+ mes "Not long ago, I was in hospital";
+ mes "laying down on the bed for";
+ mes "quite a long time.";
+ mes "And I met this ^FF5000doctor from Yuno^000000.";
+ mes "She helped me to recover in no time.";
+ mes "Yet, I can't run around though.";
+ next;
+ mes "[Neil]";
+ mes "However, I can't believe I got";
+ mes "my health back. It's like a";
+ mes "miracle. Hope I can be someone like";
+ mes "her who can cure others.";
+ if (b_sword == 20) set b_sword,21;
+ }
+ close;
+}
+
+yuno,208,164,4 script Active little girl#gnbs 101,{
+ mes "[Hisa]";
+ if (b_sword < 21) {
+ mes "Ahhmm.....";
+ mes "This town is so boring.";
+ mes "No events, no festivals..";
+ mes "and all the people stay in";
+ mes "their home studying this and that.";
+ close;
+ }
+ mes "But still, there's one person";
+ mes "I respect. Her name is ^FF5500Cylrnel^000000.";
+ mes "She is an expert in medical treatment.";
+ mes "Moreover, whenever someone becomes";
+ mes "sick in the town, she comes right";
+ mes "away to cure that person..";
+ next;
+ mes "[Hisa]";
+ mes "She tells me lots of stories";
+ mes "she experienced. It's so";
+ mes "interesting to hear them.";
+ mes "She also made jorney round the";
+ mes "world.... Ah ha.....";
+ next;
+ mes "[Hisa]";
+ mes "She's probably at her home.";
+ mes "She came back from a trip.";
+ mes "haha......";
+ if (b_sword == 21) set b_sword,22;
+ if (rand(1,2) == 2) {
+ next;
+ mes "[Hisa]";
+ mes "Ah~!";
+ mes "She's also known as an";
+ mes "fickle woman.";
+ mes "Better watch out. haha..";
+ }
+ close;
+}
+
+yuno_in01,99,101,4 script Doctor#gnbs 744,{
+ if (b_sword < 23) {
+ mes "[??????]";
+ mes "I have no idea who you are";
+ mes "but would you mind to leave me alone?";
+ mes "I am really busy right now.";
+ } else if (b_sword < 27) {
+ mes "[Cylrnel]";
+ switch (b_sword) {
+ case 23:
+ mes "How can I help you?";
+ mes "If it's not urgent, please";
+ mes "come back next time.";
+ next;
+ mes "[Cylrnel]";
+ if (rand(1,4) == 2) {
+ mes "...............";
+ mes "Need to ask me something?";
+ next;
+ if (select("You're so beautiful.:Do you like traveling?") == 1) {
+ mes "[Cylrnel]";
+ if (rand(1,4) == 4) {
+ mes "..excuse me?";
+ mes "Ah ha ha~";
+ mes "You're a funny guy.";
+ mes "Trying to work on me?";
+ mes "Ah ha ha ha.";
+ next;
+ if (select("Yes, I fell in love in first sight.:I have a favor to ask.") == 1) {
+ mes "[Cylrnel]";
+ if (rand(1,3) == 3) {
+ mes "Ahhaha...Ahahaha...";
+ mes "Ah..I'm sorry..";
+ mes "I haven't seen a guy like you";
+ mes "for a long time.";
+ next;
+ mes "[Cylrnel]";
+ mes "It makes me laugh..haha.";
+ mes "Guess what?";
+ mes "I know you're not here";
+ mes "to work on me.";
+ mes "What business do you have?";
+ next;
+ menu "Well, actually...",-;
+ mes "^FF0000Told Cylrnel about Lyroo.";
+ mes "And also about favor of blacksmith, Aumgarl.^000000";
+ next;
+ mes "[Cylrnel]";
+ if (rand(1,3) == 2) {
+ mes "Um.....";
+ mes "that's what happened..";
+ mes "Oh, well..";
+ mes "I need exact symptoms of a girl.";
+ mes "Go find exact symptoms first";
+ mes "and come back again.";
+ next;
+ mes "[Cylrnel]";
+ mes "Without exact symptoms,";
+ mes "I can't make any diagnose.";
+ set b_sword,24;
+ } else {
+ mes "Umm.......";
+ mes "Quite a long story..";
+ mes "I have no idea why you're";
+ mes "trying to help these people,";
+ mes "but, it's hard to believe you.";
+ mes "Why don't you find some other doctor?";
+ }
+ } else {
+ mes "Ah!";
+ mes "I never thought someone";
+ mes "like you still exist.";
+ mes "I am sorry but, I am";
+ mes "tired with this crap.";
+ }
+ } else {
+ mes "[Cylrnel]";
+ if (rand(1,3) == 3) {
+ mes "Huhu...";
+ mes "well...";
+ mes "Let me hear your story.";
+ next;
+ menu "Actually...",-;
+ mes "^FF0000Told Cylrnel about Lyroo.";
+ mes "And also about favor of blacksmith, Aumgarl.^000000";
+ next;
+ mes "[Cylrnel]";
+ if (rand(1,3) == 1) {
+ mes "Um.....";
+ mes "that's what happened..";
+ mes "Oh, well..";
+ mes "I need exact symptoms of a girl.";
+ mes "Go find exact symptoms first";
+ mes "and come back again.";
+ next;
+ mes "[Cylrnel]";
+ mes "Without exact symptoms,";
+ mes "I can't make any diagnose.";
+ set b_sword,24;
+ } else {
+ mes "Umm.......";
+ mes "Quite a long story..";
+ mes "I have no idea why you're";
+ mes "trying to help these people,";
+ mes "but, it's hard to believe you.";
+ mes "Why don't you find some other doctor?";
+ }
+ } else {
+ mes "Huhu..";
+ mes "Well...";
+ mes "You're no differ with";
+ mes "any other guys around.";
+ mes "I don't have any bussiness";
+ mes "with you. please leave.";
+ close2;
+ warp "yuno.gat",246,143;
+ end;
+ }
+ }
+ } else {
+ mes "Ahhaha..";
+ mes "You're a funny guy.";
+ mes "But, that doesn't";
+ mes "work on me.";
+ }
+ } else {
+ mes "[Cylrnel]";
+ mes "Hmm.. Yes.. but,";
+ mes "if you don't have ";
+ mes "any business to take care,";
+ mes "please leave, I'm pretty busy right now.";
+ }
+ } else {
+ mes "I am sorry, I don't have a time to waste.";
+ }
+ break;
+ case 24:
+ mes "Oh..";
+ mes "you're back..";
+ mes "Did you find the right symptoms?";
+ mes "I wanted to go with you, but";
+ mes "I been really busy.";
+ next;
+ if(select("Not yet...:Yes, Here.") == 1){
+ mes "[Cylrnel]";
+ mes "You're still here?";
+ mes "Go right away!";
+ mes "She's in serious pain.";
+ mes "Her body could be paralyzed";
+ mes "in any minute!";
+ close;
+ }
+ mes "[Cylrnel]";
+ mes "What a relief..";
+ mes "You're earlier than I thought.";
+ mes "I'll ask you some questions about";
+ mes "her condition. Answer correctly.";
+ next;
+ mes "[Cylrnel]";
+ mes "First, How was her body temperature?";
+ set @sick,0;
+ next;
+ setarray .sick1$[1],"Very hot.","Very cold.","Normal.","Turns hot and cold repeatedly.";
+ set @sick1,select(.sick1$[1],.sick1$[2],.sick1$[3],.sick1$[4]);
+ if (@sick1 == 4) set @sick,@sick+1;
+ mes "[Cylrnel]";
+ mes "Ok.";
+ mes "Now, about physiological condition.";
+ next;
+ setarray .sick2$[1],"No sweating at all.","Sweating all over the body.","Runny nose.","No tears, sweats at all.";
+ set @sick2,select(.sick2$[1],.sick2$[2],.sick2$[3],.sick2$[4]);
+ if (@sick2 == 1) set @sick,@sick+1;
+ mes "[Cylrnel]";
+ mes "Next, tell me about";
+ mes "her body condition.";
+ next;
+ setarray .sick3$[1],"Nothing particular.","Become paralyzed often.","Muscles became so soft.","Muscles became so hard.";
+ set @sick3,select(.sick3$[1],.sick3$[2],.sick3$[3],.sick3$[4]);
+ if (@sick3 == 2) set @sick,@sick+1;
+ mes "[Cylrnel]";
+ mes "How about an internal organs?";
+ next;
+ setarray .sick4$[1],"Stomach hurts like it's been stabbed by a knife.","Head hurts like it's been smashed by a hammer.","Heart beats irregularly.","Has difficulty in breathing.";
+ set @sick4,select(.sick4$[1],.sick4$[2],.sick4$[3],.sick4$[4]);
+ if (@sick4 == 3) set @sick,@sick+1;
+ mes "[Cylrnel]";
+ mes "Hmm.. alright.";
+ mes "Let me check this.";
+ mes "so the symptoms are";
+ mes "..............";
+ next;
+ mes "[Cylrnel]";
+ mes "^FF0000"+.sick1$[@sick1]+"";
+ mes ""+.sick2$[@sick2]+"";
+ mes ""+.sick3$[@sick3]+"";
+ mes ""+.sick4$[@sick4]+"^000000";
+ mes "right?";
+ next;
+ if(select("No..not exactly..:Yes, I am sure.") == 1){
+ mes "[Cylrnel]";
+ mes "Then, go back to her and";
+ mes "find the exact symptoms";
+ mes "right away~!!";
+ close;
+ }
+ mes "[Cylrnel]";
+ mes "You're sure about";
+ mes "this, right?";
+ mes "If they're wrong symptoms, I can't be responsible.";
+ next;
+ if(select("Well..let me go and recheck it.:I'm sure.") == 1){
+ mes "[Cylrnel]";
+ mes "Then, go back to her and";
+ mes "find the exact symptoms";
+ mes "right away~!!";
+ close;
+ }
+ mes "[Cylrnel]";
+ mes "Hmm.....";
+ mes "Aright. I'll trust you.";
+ mes "Now, go get these ingredients.";
+ mes "Get them as fast as possible.";
+ mes "Alright?";
+ next;
+ if (@sick == 4) {
+ mes "[Cylrnel]";
+ mes "^FF00002 Seeds of Yggdrasil";
+ mes "3 Aloes";
+ mes "1 Witherless Rose";
+ mes "10 Starsands Of Witch";
+ mes "5 Burning Hearts";
+ mes "5 Ice pieces";
+ set b_sword,26;
+ next;
+ mes "[Cylrnel]";
+ mes "Wrote them down?";
+ mes "I'll tell you once again.";
+ mes "We need...";
+ next;
+ mes "[Cylrnel]";
+ mes "^FF00002 Seeds of Yggdrasil";
+ mes "3 Aloes";
+ mes "1 Witherless Rose";
+ mes "10 Starsands Of Witch";
+ mes "5 Burning Hearts";
+ mes "5 Ice pieces";
+ next;
+ } else {
+ mes "[Cylrnel]";
+ mes "^FF00001 Seed of Yggdrasil";
+ mes "1 Aloe";
+ mes "5 Starsands Of Witch";
+ mes "3 Burning Hearts";
+ mes "3 Ice pieces";
+ set b_sword,25;
+ next;
+ mes "[Cylrnel]";
+ mes "Wrote them down?";
+ mes "I'll tell you once again.";
+ mes "We need...";
+ next;
+ mes "[Cylrnel]";
+ mes "^FF00001 Seed of Yggdrasil";
+ mes "1 Aloe";
+ mes "5 Starsands Of Witch";
+ mes "3 Burning Hearts";
+ mes "3 Ice pieces";
+ next;
+ }
+ mes "[Cylrnel]";
+ mes "Get them as fast as possible.";
+ mes "There isn't much time for Lyroo.";
+ break;
+ case 25:
+ if (countitem(608) > 0 && countitem(704) > 0 && countitem(1061) > 4 && countitem(7097) > 2 && countitem(7066) > 2) {
+ mes "Hmm....";
+ mes "Good. you got them all.";
+ mes "Let me see..";
+ mes ".............";
+ delitem 608,1; // Seed_Of_Yggdrasil
+ delitem 704,1; // Aloe
+ delitem 1061,5; // Starsand_Of_Witch
+ delitem 7097,3; // Burning_Heart
+ delitem 7066,3; // Ice_Piece
+ next;
+ mes "^FF0000Cylrnel began to mix";
+ mes "the ingredients.";
+ mes "................";
+ mes ".............";
+ mes ".........";
+ mes "......^000000";
+ next;
+ mes "[Cylrnel]";
+ mes "............";
+ mes "What!?!?";
+ mes ".....";
+ mes "Hey you....";
+ mes "You gave me a wrong information.";
+ set b_sword,24;
+ next;
+ mes "[Cylrnel]";
+ mes "I made the mecine according";
+ mes "to the symptoms you told me.";
+ mes "But, it became strange medicine!";
+ mes "Bring me the exact symptoms!";
+ close2;
+ warp "yuno.gat",246,143;
+ end;
+ } else {
+ mes "...........";
+ mes "Hey~ you don't have all";
+ mes "the ingredients yet.";
+ mes "Go get them all right away.";
+ next;
+ mes "[Cylrnel]";
+ mes "^FF00001 Seed of Yggdrasil";
+ mes "1 Aloe";
+ mes "5 Starsands Of Witch";
+ mes "3 Burning Hearts";
+ mes "3 Ice pieces";
+ next;
+ mes "[Cylrnel]";
+ mes "Alright?";
+ mes "Now, hurry!.";
+ close2;
+ warp "yuno.gat",246,143;
+ end;
+ }
+ break;
+ case 26:
+ if (countitem(608) > 1 && countitem(704) > 2 && countitem(748) > 0 && countitem(1061) > 9 && countitem(7097) > 4 && countitem(7066) > 4) {
+ mes "Hmm....";
+ mes "Good. you got them all.";
+ mes "Let me see..";
+ mes ".............";
+ delitem 608,2; // Seed_Of_Yggdrasil
+ delitem 704,3; // Aloe
+ delitem 748,1; // Witherless_Rose
+ delitem 1061,10; // Starsand_Of_Witch
+ delitem 7097,5; // Burning_Heart
+ delitem 7066,5; // Ice_Piece
+ next;
+ mes "^FF0000Cylrnel began to mix";
+ mes "the ingredients.";
+ mes "................";
+ mes ".............";
+ mes ".........";
+ mes "......^000000";
+ next;
+ mes "[Cylrnel]";
+ mes "Here~!";
+ mes "It's done.";
+ mes "I don't think this medicine would";
+ mes "cure her disease completely. However,";
+ mes "it will alleviate her from the pain.";
+ next;
+ mes "[Cylrnel]";
+ mes "It wasn't easy to make this medicine.";
+ mes "Here, take this with you.";
+ mes "Take care then..";
+ set b_sword,27;
+ getitem 606,1; // Aloebera
+ } else {
+ mes "...........";
+ mes "Hey~ you don't have all";
+ mes "the ingredients yet.";
+ mes "Go get them all right away.";
+ next;
+ mes "[Cylrnel]";
+ mes "^FF00002 Seeds of Yggdrasil";
+ mes "3 Aloes";
+ mes "1 Witherless Rose";
+ mes "10 Starsands Of Witch";
+ mes "5 Burning Hearts";
+ mes "5 Ice pieces";
+ next;
+ mes "[Cylrnel]";
+ mes "Alright?";
+ mes "Go get them as fast as possible.";
+ close;
+ warp "yuno.gat",246,143;
+ end;
+ }
+ break;
+ }
+ } else {
+ mes "[Cylrnel]";
+ mes "Huhu...";
+ mes "How is she doing?";
+ mes "Getting better?.";
+ mes "By taking that medicine, she'll";
+ mes "recover fast.";
+ next;
+ mes "[Cylrnel]";
+ mes "Tell her to come to me";
+ mes "sometimes to get a medical.";
+ mes "treatment. Walking from her";
+ mes "house to here would be a good";
+ mes "exercise too. Name of her disease";
+ mes "is called '^FF0000Amarhade^000000'.";
+ next;
+ mes "[Cylrnel]";
+ mes "It's a rare disease that";
+ mes "it's not even well known";
+ mes "to medical institution.";
+ mes "Likewise, exact treatment";
+ mes "has not maden yet.";
+ next;
+ mes "[Cylrnel]";
+ mes "..but I found the something..";
+ mes "and it's a.....secret. haha.";
+// Emotion "Doctor" ET_DELIGHT
+ emotion e_ho;
+ }
+ close;
+}
+
+yuno_in01.gat,104,94,0 script go away#gnbs 139,2,1{
+ if (b_sword < 22) {
+ mes "[??????]";
+ mes "^FF0000What are you doing here?";
+ mes "Get out!^000000";
+ close2;
+ warp "yuno.gat",246,143;
+ end;
+ } else if (b_sword == 22) {
+ if (rand(1,10) == 10) {
+ mes "[??????]";
+ mes "I am very busy right now. please leave.";
+ set b_sword,23;
+ close;
+ } else {
+ mes "[??????]";
+ mes "^FF0000What are you doing here?";
+ mes "Get out!^000000";
+ close2;
+ warp "yuno.gat",246,143;
+ end;
+ }
+ } else {
+ mes "[Cylrnel]";
+ mes "Who are you?";
+ close;
+ }
+}
diff --git a/npc/quests/quests_izlude.txt b/npc/quests/quests_izlude.txt
index 9144f7a93..4ff96b343 100644
--- a/npc/quests/quests_izlude.txt
+++ b/npc/quests/quests_izlude.txt
@@ -1,128 +1,128 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Izlude
-//===== By: ==================================================
-//= Evera and The eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Edgar's Offer
-//===== Additional Comments: =================================
-//= 1.0 Initial release [Evera]
-//============================================================
-
-//==================================================== Edgar's
-//====================================================== Offer
-izlude.gat,182,186,6 script Edgar 709,{
-
- mes "[Edgar]";
- mes "My town, Izlude is connected to";
- mes "Alberta by the harbor in the West.";
- mes "There is so much traffic between";
- mes "us, I almost become an Albertian.";
- mes "Hehehe~";
- next;
- mes "[Edgar]";
- mes "There's this guy I know pretty";
- mes "well, Phelix, who lives in Alberta.";
- mes "That guy is really stingy... He";
- mes "charges for everything!";
- next;
- mes "[Edgar]";
- mes "But he's a really nice guy and";
- mes "likes helping other people. He has";
- mes "a good heart and will give you his";
- mes "support if you meet his price.";
- next;
- mes "[Edgar]";
- mes "Lately, people in Alberta say that";
- mes "he is really trying to help folks";
- mes "and that his demand for Jellopies";
- mes "is just a cover-up. Well, you";
- mes "should take a look at what he has";
- mes "to offer.";
-M_Menu:
- next;
- menu "Can you tell me the way to Alberta?",-,"End Conversation",M_End;
-
- mes "[Edgar]";
- mes "Huh? Well, you can use your feet";
- mes "and just walk. But if you have";
- mes "money, I'd like to suggest that you";
- mes "take a ship.";
- next;
- menu "Ok, gotcha.",-,"But I'm sick of walking and I'm broke!",sM_1;
-
- mes "[Edgar]";
- mes "Alright, Take Care~";
- close;
-
- sM_1:
- if (MISC_QUEST & 16) goto sM_2;
- mes "[Edgar]";
- mes "Okay...";
- mes "You don't want to walk AND you've";
- mes "got no cash, but you still want to";
- mes "go there? Oh geez.";
- next;
- mes "[Edgar]";
- mes "Fine fine. Me, being the captain of";
- mes "a ship, can afford to bring you";
- mes "there at a lower price. How does";
- mes "250 Zeny sound?";
- next;
- menu "Alrighty~?",-,"Bah, what a rip off!!",sm_1b;
-
- set MISC_QUEST,MISC_QUEST | 16;
- if(Zeny < 250) goto sl_NoZeny;
- set Zeny, Zeny - 250;
- warp "alberta.gat",195,164;
-
- sm_1b:
- mes "[Edgar]";
- mes "Boy oh boy,";
- mes "if you think";
- mes "that's a rip off...";
- close;
-
- sM_2:
- mes "[Edgar]";
- mes "So are you heading to Alberta";
- mes "again? Let me give you the same";
- mes "discount and only charge 250 Zeny,";
- mes "just like the last time.";
- mes "How's that sound?";
- next;
- menu "Alrighty~!",-,"Why are you being so nice to me?!",sM_2b;
-
- if(Zeny < 250) goto sl_NoZeny;
- set Zeny, Zeny - 250;
- warp "alberta.gat",195,164;
-
- sM_2b:
- mes "[Edgar]";
- mes "It's just the way I am. That, and";
- mes "your devilish smile reminds me of";
- mes "my beloved blond haired son who";
- mes "left home years ago to become a";
- mes "Sailor on his own ship. Bless his";
- mes "soul, wherever he is.";
- close;
-
- sl_NoZeny:
- mes "[Edgar]";
- mes "Um...";
- mes "This isn't";
- mes "enough money.";
- mes "Go and get";
- mes "some more.";
- close;
-
- M_End:
- mes "[Edgar]";
- mes "Yeah, alright.";
- mes "See you later~";
- close;
-
+//===== eAthena Script =======================================
+//= Quest NPCs related to Izlude
+//===== By: ==================================================
+//= Evera and The eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Edgar's Offer
+//===== Additional Comments: =================================
+//= 1.0 Initial release [Evera]
+//============================================================
+
+//==================================================== Edgar's
+//====================================================== Offer
+izlude.gat,182,186,6 script Edgar 709,{
+
+ mes "[Edgar]";
+ mes "My town, Izlude is connected to";
+ mes "Alberta by the harbor in the West.";
+ mes "There is so much traffic between";
+ mes "us, I almost become an Albertian.";
+ mes "Hehehe~";
+ next;
+ mes "[Edgar]";
+ mes "There's this guy I know pretty";
+ mes "well, Phelix, who lives in Alberta.";
+ mes "That guy is really stingy... He";
+ mes "charges for everything!";
+ next;
+ mes "[Edgar]";
+ mes "But he's a really nice guy and";
+ mes "likes helping other people. He has";
+ mes "a good heart and will give you his";
+ mes "support if you meet his price.";
+ next;
+ mes "[Edgar]";
+ mes "Lately, people in Alberta say that";
+ mes "he is really trying to help folks";
+ mes "and that his demand for Jellopies";
+ mes "is just a cover-up. Well, you";
+ mes "should take a look at what he has";
+ mes "to offer.";
+M_Menu:
+ next;
+ menu "Can you tell me the way to Alberta?",-,"End Conversation",M_End;
+
+ mes "[Edgar]";
+ mes "Huh? Well, you can use your feet";
+ mes "and just walk. But if you have";
+ mes "money, I'd like to suggest that you";
+ mes "take a ship.";
+ next;
+ menu "Ok, gotcha.",-,"But I'm sick of walking and I'm broke!",sM_1;
+
+ mes "[Edgar]";
+ mes "Alright, Take Care~";
+ close;
+
+ sM_1:
+ if (MISC_QUEST & 16) goto sM_2;
+ mes "[Edgar]";
+ mes "Okay...";
+ mes "You don't want to walk AND you've";
+ mes "got no cash, but you still want to";
+ mes "go there? Oh geez.";
+ next;
+ mes "[Edgar]";
+ mes "Fine fine. Me, being the captain of";
+ mes "a ship, can afford to bring you";
+ mes "there at a lower price. How does";
+ mes "250 Zeny sound?";
+ next;
+ menu "Alrighty~?",-,"Bah, what a rip off!!",sm_1b;
+
+ set MISC_QUEST,MISC_QUEST | 16;
+ if(Zeny < 250) goto sl_NoZeny;
+ set Zeny, Zeny - 250;
+ warp "alberta.gat",195,164;
+
+ sm_1b:
+ mes "[Edgar]";
+ mes "Boy oh boy,";
+ mes "if you think";
+ mes "that's a rip off...";
+ close;
+
+ sM_2:
+ mes "[Edgar]";
+ mes "So are you heading to Alberta";
+ mes "again? Let me give you the same";
+ mes "discount and only charge 250 Zeny,";
+ mes "just like the last time.";
+ mes "How's that sound?";
+ next;
+ menu "Alrighty~!",-,"Why are you being so nice to me?!",sM_2b;
+
+ if(Zeny < 250) goto sl_NoZeny;
+ set Zeny, Zeny - 250;
+ warp "alberta.gat",195,164;
+
+ sM_2b:
+ mes "[Edgar]";
+ mes "It's just the way I am. That, and";
+ mes "your devilish smile reminds me of";
+ mes "my beloved blond haired son who";
+ mes "left home years ago to become a";
+ mes "Sailor on his own ship. Bless his";
+ mes "soul, wherever he is.";
+ close;
+
+ sl_NoZeny:
+ mes "[Edgar]";
+ mes "Um...";
+ mes "This isn't";
+ mes "enough money.";
+ mes "Go and get";
+ mes "some more.";
+ close;
+
+ M_End:
+ mes "[Edgar]";
+ mes "Yeah, alright.";
+ mes "See you later~";
+ close;
+
} \ No newline at end of file
diff --git a/npc/quests/quests_lighthalzen.txt b/npc/quests/quests_lighthalzen.txt
index b1fcd2fb0..8d7a4aaa7 100644
--- a/npc/quests/quests_lighthalzen.txt
+++ b/npc/quests/quests_lighthalzen.txt
@@ -1,2617 +1,2617 @@
-//===== eAthena Script =======================================
-//= Quest NPCs located in Lighthalzen
-//===== By: ==================================================
-//= Persian, Vicious_Pucca, aoa00, Evera, MasterOfMupppets,
-//= Lupus, Lord Gywall
-//===== Current Version: =====================================
-//= 2.9
-//===== Compatible With: =====================================
-//= eAthena SVN
-//===== Description: =========================================
-//= Event for the Mobster respawn
-//= Bio Labs Quest
-//= Friendship Quest
-//= Pickpocket Mini-Quest
-//= Bio Ethics Quest (Need bug testing!)
-//===== Additional Comments: =================================
-//= Grammar/script check please. This was a quick job.
-//= Things to add: Look at the thread "Lighthalzen Guard" in SVN script
-//= 0.3 Initial Release
-//= 0.5 Added mobsters spawn and Einbroch pollution. Alert lasts either 10 minutes or all mob killed.
-//= 0.6-0.9 fix small bug. Added Bio-lab entrance Quest. Added Getting security-card Quest.
-//= 1.0 Patched "mobsters spawn & Alert" like Real-RO.
-//= 1.0a fixed rand(1,10) + comparision. There just can't be 'X < 1' [Lupus]
-//= 1.1 Changed the mobster spawn to g_mobster to prevent exploits [MasterOfMuppets]
-//= 1.2 Added the cube room quest by DeNy, translated by vicious_pucca. [MasterOfMuppets]
-//= Thanks to Linuxwolf for a grammar check as well =).
-//= 1.2a Moved Biolab entrance to lhz_dun warps. [Vicious]
-//= 1.3 Fixed password bug, fixed endless item exploit, some typos [Lupus]
-//= 1.4 Fixed password abuse. When people don't read the password under the picture
-//= and enter Zero shit 8) (TODO: I saw some "Sticks" abuses, too.. where you could skip a part of quest...)
-//= 1.5 Fixed Mobster's OnDead event(it has to start with "On"!) [Playtester]
-//= 1.5a Fixed "free stick" bug, thx 2 Neouni [Lupus]
-//= 1.6 Added Gywall's Pickpocket Quest
-//= 1.7 Implemented the Friendship quest [MasterOfMuppets]
-//= 1.8 Changed the name of the mobsters to Gangster, as it should be. [MasterOfMuppets]
-//= 1.9 Added extra input check on Biolab so that the first letter of the word could be capitalized or undercase. [Evera]
-//= 2.0 Removed Duplicates [Silent]
-//= 2.1 Added first part of Bio Ethics Quest [Evera]
-//= 2.2 Added bit to say Bio Ethics is unfinished, and if a player attempts, it warps them
-//= out after finished part... Don't want players getting stuck ;_; [Evera]
-//= 2.3 Finished Bio Ethics Quest. Need bug testers before moving to trunk, my
-//= mind was somewhere else when writing @_@ [Evera]
-//= 2.4 Fixed the bug where a str&int debug was shown in the console for
-//= test tube in bio labs quest. [Evera]
-//= 2.5 Fixed Kellasus giving you extra skills in Bio Ethics quest [Evera]
-//= 2.6 Fixed exploit letting any class get homunculus from Bio Ethics Quest [Evera]
-//= 2.6a Moved Bio Ethics Quest to Alchemist SKILL QUESTS [Lupus]
-//= 2.7 fixed bugs that let people bypass some quest parts V_V [Lupus]
-//= reused cubekey var for 4 Cube Room key vars
-//= 2.8 More optimization. Also fixed bug with "2x short sticks -> long" [Lupus]
-//= Now uses MISC_QUEST&512 instead of 'hzdun'. WIP
-//= 2.9 Fixed Friendship Quest levelup exploit (u could get EXP twice) [Lupus]
-//============================================================
-
-lighthalzen.gat,1,1,7 script sneakAddSuber -1,{
-OnInit:
- set $@sneakchance, 3; // chance of successful sneak(0 = never, 10 = always)
- set $@sneakguard, 0; // numbers of people who sneaked past guard
- set $@threshold, 10; // numbers of sneakers before mob appears
- set $@mob, 50; // Max respawn numbers of "mobsters"
- set $@mobcount, 0; // current numbers of "mobsters"
- set $@lhz_alert, 0; // Alert on Lighthalzen(0 = off, 1 = on)
- set $@i, 0;
-
- end;
-
-OnMinute00:
-OnMinute05:
-OnMinute10:
-OnMinute15:
-OnMinute20:
-OnMinute25:
-OnMinute30:
-OnMinute35:
-OnMinute40:
-OnMinute45:
-OnMinute50:
-OnMinute55:
- if($@lhz_alert == 0) set $@sneakguard, $@sneakguard + rand(1,3);
- if($@lhz_alert == 1) set $@sneakguard, $@sneakguard - 1; // Monsters will die after 5~10 min. (sneakAddSuber)
- end;
-}
-
-lighthalzen.gat,1,1,7 script AlertChk -1,{
-OnInit:
- initnpctimer;
- end;
-
-OnTimer10000:
- if($@sneakguard >= $@threshold) goto MakeMob;
- if($@sneakguard == 0) goto ClearMob; // Monsters will die after 5~10 min. (sneakAddSuber)
- setnpctimer 0;
- end;
-
-MakeMob:
- if($@lhz_alert == 1) goto ChkEnd;
- set $@mobcount, $@mob;
- mapannounce "lighthalzen.gat","Maintenance Organization of the Public Order: Currently the security of the city has been compromized, We ask the citizens to be more careful. I repeat. We ask the citizens to be more careful.", 1;
-
- for( set $@i, 0; $@i < $@mob; set $@i, $@i + 1 ) {
- monster "lighthalzen.gat",0,0,"Gangster",1592,1,"AlertChk::OnMobKilled";
- }
-
- set $@lhz_alert, 1;
- set $@sneakguard, 2; // Monsters will die after 5~10 min. (sneakAddSuber)
- setnpctimer 0;
- end;
-
-ClearMob:
- if($@lhz_alert == 0) goto ChkEnd;
- set $@mobcount, 0;
- mapannounce "lighthalzen.gat","Maintenance organization of the Public Order: We were able to get rid of all the trouble makers in the city. You may relax now.", 1;
- killmonster "lighthalzen.gat","AlertChk::OnMobKilled";
- set $@lhz_alert, 0;
- set $@sneakguard, 0;
- setnpctimer 0;
- end;
-
-OnMobKilled:
- set $@mobcount, $@mobcount - 1;
- if($@mobcount == 0) goto ClearMob;
- setnpctimer 0;
- end;
-
-ChkEnd:
- setnpctimer 0;
- end;
-}
-
-lighthalzen.gat,267,200,3 script Security Guard#01 868,{
-
- if(countitem(7350)>0) goto Lhzpass1;
- if($@lhz_alert == 1) goto Lhzstop;
- if((gettime(2)>00 && gettime(2)<10)) goto LhzTalk2;
- if((gettime(2)>30 && gettime(2)<40)) goto LhzTalk2;
- set @LhzTalk,rand(1,10);
- if(@LhzTalk < 2 ) goto LhzTalk1;
-
-LhzTalk:
- mes "[Guard]";
- mes "Hey! Where do you think you are going?";
- mes "I can not send nobody to the slum district!";
- mes "If we let suspecious people like you pass,";
- mes "there is no point in peace keeping!";
- close;
-
-LhzTalk1:
- mes "-Looks like the guard is doing something else";
- mes "Now is a good time to sneak by.-";
- next;
- warp "lighthalzen.gat",297,227;
- set $@sneakguard, $@sneakguard + 1;
- close;
-
-LhzTalk2:
- set @LhzTalk,rand(1,10);
- if(@LhzTalk < 2 ) goto LhzTalk;
- mes "[Guard]";
- mes "zzZ... zzZ... zzZ...";
- mes "hmm. hmm... zzZ...";
- next;
- mes "-Looks like the guard is sleeping";
- mes "Now is a good time to sneak by.-";
- next;
- warp "lighthalzen.gat",297,227;
- close;
-
-Lhzpass1:
- mes "[Guard]";
- mes "Who are you! ...Hmm? You have a pass?";
- mes "I'm sorry. You look like an adventurer,";
- mes "but I guess you got the authority.";
- mes "You may pass.";
- next;
- warp "lighthalzen.gat",297,227;
- close;
-
-Lhzstop:
- mes "[Guard]";
- mes "Recently, there were too many people sneaking pass us,";
- mes "so we raised the security level.";
- mes "Who sneak past us anyway?";
- mes "It's troublesome...";
- close;
-}
-
-lighthalzen.gat,294,223,7 script Security Guard#02 868,{
-
- if(countitem(7350)>0) goto Lhzpass1;
- if($@lhz_alert == 1) goto Lhzstop;
- if((gettime(2)>00 && gettime(2)<10)) goto LhzTalk2;
- if((gettime(2)>30 && gettime(2)<40)) goto LhzTalk2;
- set @LhzTalk,rand(1,10);
- if(@LhzTalk < 2 ) goto LhzTalk1;
-
-LhzTalk:
- mes "[Guard]";
- mes "Hey! Where do you think you are going?";
- mes "I can not send nobody to the slum district!";
- mes "If we let suspecious people like you pass,";
- mes "there is no point in peace keeping!";
- close;
-
-LhzTalk1:
- mes "-Looks like the guard is doing something else";
- mes "Now is a good time to sneak by.-";
- next;
- warp "lighthalzen.gat",264,200;
- set $@sneakguard, $@sneakguard + 1;
- close;
-
-LhzTalk2:
- set @LhzTalk,rand(1,10);
- if(@LhzTalk < 2 ) goto LhzTalk;
- mes "[Guard]";
- mes "zzZ... zzZ... zzZ...";
- mes "hmm. hmm... zzZ...";
- next;
- mes "-Looks like the guard is sleeping";
- mes "Now is a good time to sneak by.-";
- next;
- warp "lighthalzen.gat",264,200;
- close;
-
-Lhzpass1:
- mes "[Guard]";
- mes "Who are you! ...Hmm? You have a pass?";
- mes "I'm sorry. You look like an adventurer,";
- mes "but I guess you got the authority.";
- mes "You may pass.";
- next;
- warp "lighthalzen.gat",264,200;
- close;
-
-Lhzstop:
- mes "[Guard]";
- mes "Recently, there were too many people sneaking pass us,";
- mes "so we raised the security level.";
- mes "Who sneak past us anyway?";
- mes "It's troublesome...";
- close;
-}
-
-//============================================================
-// Cube Room
-//============================================================
-
-//--------------------------Piciburn--------------------------
-
-lighthalzen.gat,341,224,4 script Piciburn 868,{
- if (BaseLevel < 60){
- mes "[Piciburn]";
- mes "Keep moving.";
- close;
- }
- if (MISC_QUEST&512) goto L_DONE;
- if (piciburn == 7) goto L_10;
- if (piciburn == 6) goto L_9;
- if (piciburn == 5) goto L_6;
- if (piciburn == 4) goto L_4;
- if (piciburn == 3) goto L_3;
- if (piciburn == 2) goto L_2;
- if (piciburn == 1) goto L_1;
- mes "[Piciburn]";
- mes "Hmm...? What is it?";
- mes "I am busy at the moment,";
- mes "so stop bothering me.";
- set piciburn,1;
- close;
-
-L_1:
- mes "[Piciburn]";
- mes "I'm getting distracted because";
- mes "You keep staring at me!";
- mes "Would you please leave me alone?";
- set piciburn,piciburn+1;
- close;
-
-L_2:
- mes "[Piciburn]";
- mes "Hmm...? Oh, it's you..";
- mes "You are really getting on my nerves.";
- mes "You're weird, you know that?";
- mes "What is it that you want from me?";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Nothing really...";
- mes "Just looking around...";
- mes "What are you doing?";
- next;
- mes "[Piciburn]";
- mes "Oh, man...";
- mes "If I just needed to show you this,";
- mes "I wouldn't have got all worked up.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "I know. Haha.";
- next;
- mes "[Piciburn]";
- mes "You really ARE a weird person...";
- mes "Are you just going to stand there";
- mes "and keep watching?";
- next;
- mes "[Piciburn]";
- mes "... You're really annoying me!";
- mes "What do you want from me?!";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "I've aready told you.";
- mes "I asked what you were doing.";
- mes "This place is hot and sticky.";
- next;
- mes "[Piciburn]";
- mes "Okay, okay..";
- mes "I'll tell you what i'm doing,";
- mes "but would you leave me in peace";
- mes "if i did? Thanks.";
- next;
- mes "[Piciburn]";
- mes "I'm.. um... doing something illegal...";
- mes "Don't tell anyone about this!";
- next;
- mes "[Piciburn]";
- mes "I am the only person who can make a route to";
- mes "the industrial city's -^FF0000Laboratory^000000- or";
- mes "places normal people wouldn't usually be able to get to.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "The -Laboratory?!!!-";
- mes "Can you really get people in there?!!!";
- next;
- mes "[Piciburn]";
- mes "Agh! Quieten down! What did i tell you?";
- mes "I've told you what i do, now will you stop staring at me?";
- mes "And be quiet~!";
- mes "You're weird.. ¬_¬";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Ah..Haha.. I'm sorry.";
- mes "I really want to go there,";
- mes "so I got excited when I heard you can get people in there";
- next;
- mes "[Piciburn]";
- mes "Hmm? You were planning to get in there?";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Yeah, but i couldn't get in..";
- next;
- mes "[Piciburn]";
- mes "Hmm...";
- mes "This is troublesome...";
- mes "I don't usually tell people i cannot";
- mes "trust how to get into the Laboratory...";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "What do I need to do?";
- mes "How can I get into the laboratory?";
- next;
- mes "[Piciburn]";
- mes "Geez~, I'm just giving people a route, not sending them there.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Doesn't that mean the same thing?";
- next;
- mes "[Piciburn]";
- mes "What I'm saying is,";
- mes "I'm giving people the chance to get into the labs.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "You're really talented, huh.";
- next;
- mes "[Piciburn]";
- mes "Hahaha! Damn right.";
- mes "It's a piece of cake!";
- mes "...";
- mes "Actually, now i think about it, it's impossible..";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "How's it impossible?";
- mes "I haven't say anything yet~..";
- next;
- mes "[Piciburn]";
- mes "Oh come on, you were going to BEG me to send you there~!!!";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Heh...";
- mes "You really ARE clever.";
- mes "Well...";
- mes "Pretty please~~?";
- next;
- mes "[Piciburn]";
- mes "I can never let you in~..";
- mes "Never ever~!!!";
- set piciburn,piciburn+1;
- close;
-
-L_3:
- mes "[" +strcharinfo(0) + "]";
- mes "Please?";
- next;
- mes "[Piciburn]";
- mes "No way.";
- set piciburn,piciburn+1;
- close;
-
-L_4:
- mes "[" +strcharinfo(0) + "]";
- mes "Pleaseeeee?";
- next;
- mes "[Piciburn]";
- mes "No.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Pleaseeeeeeeeeee?";
- next;
- mes "[Piciburn]";
- mes "I don't want to.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Do it!!!";
- next;
- mes "[Piciburn]";
- mes "Never~!!!";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Why are you doing this to me?!!";
- mes "What do you want from me !?!";
- next;
- mes "[Piciburn]";
- mes "What do I want?";
- mes "Heh heh.. One billion zeny.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Are you crazy?!";
- next;
- mes "[Piciburn]";
- mes "It's your choice.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "Sir, you know I don't have that much money.";
- mes "Is there anything else you need?";
- next;
- mes "[Piciburn]";
- mes "Hmm...";
- mes "Okay fine...";
- mes "Bring me 20 Jellopies.";
- mes "'Kay?";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "........";
- mes "So that's what you really wanted to ask me?";
- next;
- mes "[Piciburn]";
- mes "Hahaha...";
- mes "Yeah~~...";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "........";
- next;
- mes "[Piciburn]";
- mes "So, what're you doing just standing there?";
- mes "Are you going to do it or not?";
- next;
- menu "Definitely!",L_5,"No way! It's impossible!",-;
-
- mes "[Piciburn]";
- mes "Ah well, your loss,";
- mes "Too bad!";
- mes "Bye now~!!";
- close;
-
-L_5:
- mes "[Piciburn]";
- mes "Okay then, do as I said,";
- mes "bring me 20 jellopies!";
- mes "....";
- mes "What're you waiting for?! GO!!";
- set piciburn,piciburn+1;
- close;
-
-L_6:
- mes "[Piciburn]";
- mes "Did you get the items?";
- next;
- menu "Erm.. No..",-,"Hell yeah!",L_7,"What did you want again..?",L7_1;
-
- mes "[Piciburn]";
- mes "Hey, I don't feel like playing around anymore.";
- mes "If you really want to get there, bring the damn items!";
- close;
-
-L_7:
- if (countitem(909) >= 20) goto L_8;
- mes "[Piciburn]";
- mes "Are you joking?";
- mes "If you keep doing this,";
- mes "I may not keep the promise either.";
- mes "So go and get them already!";
- close;
-
-L7_1:
- mes "[Piciburn]";
- mes "You're really stupid~!";
- mes "It's 20 jellopies!";
- mes "Don't forget this time~";
- close;
-
-L_8:
- delitem 909,20;
- mes "[Piciburn]";
- mes "Hmm. You're more reliable than i thought.";
- mes "Taking this errand into consideration,";
- mes "i guess you really want to get in there?";
- next;
- mes "[Piciburn]";
- mes "Coming to think of it,";
- mes "you look different.";
- mes "Should I say you look more... trustworthy..?";
- next;
- mes "[Piciburn]";
- mes "Well... Anyway...";
- mes "A promise is a promise.";
- mes "I will tell you how to get there.";
- next;
- mes "[Piciburn]";
- mes "As I told you earlier, all I can do is";
- mes "give you the opportunity to get in.";
- next;
- mes "[Piciburn]";
- mes "I used to be a manager working for the lab,";
- mes "but time moves on, as people do,";
- mes "and now I am working against the lab.";
- next;
- mes "[Piciburn]";
- mes "Now... Answer honestly on all I ask here on out.";
- mes "Where i send you all depends on how you answer.";
- next;
- mes "[Piciburn]";
- mes "Somewhere in the place I'm going to send you";
- mes "There will be things you must find,";
- mes "So search well.";
- next;
- mes "[Piciburn]";
- mes "Well, when you've made your mind up,";
- mes "come back and talk to me. Okay?";
- set piciburn,piciburn+1;
- close;
-
-L_9:
- mes "[Piciburn]";
- mes "Hmm... So...";
- mes "Are you ready to go?";
- next;
- menu "No",-,"Yes",L9_1;
-
- mes "[Piciburn]";
- mes "Hmm... Not yet, huh...";
- mes "Well, I guess it is to be expected.";
- mes "But don't make me wait too long~!";
- close;
-
-L9_1:
- mes "[Piciburn]";
- mes "This is going to be hard~";
- mes "Let's go!!!";
- close2;
- set piciburn,piciburn+1;
- set @rdm,rand(3);
- if(@rdm==1)goto L_warp1;
- if(@rdm==2)goto L_warp2;
- warp "lhz_cube.gat",67,193;
- end;
-
-L_10:
- mes "[Piciburn]";
- mes "Hah!";
- mes "You failed in there, right? Hahahaha~.";
- mes "Are you going to try again? Or is it too tough~";
- next;
- menu "No",-,"Yes",L10_1;
-
- mes "[Piciburn]";
- mes "It was that hard huh?";
- mes "Well, come back if you change your mind.";
- close;
-
-L10_1:
- mes "[Piciburn]";
- mes "Okay..";
- mes "I will send you there again..";
- mes "Good luck!";
- close2;
- set @rdm,rand(3);
- if(@rdm==1)goto L_warp1;
- if(@rdm==2)goto L_warp2;
- warp "lhz_cube.gat",67,193;
- end;
-
-L_warp1:
- warp "lhz_cube.gat",66,136;
- end;
-L_warp2:
- warp "lhz_cube.gat",66,74;
- end;
-
-L_DONE:
- mes "[Piciburn]";
- mes "Oh~ I guess you found the entrance.";
- mes "I'll tell you now...";
- mes "If you want to go in there again";
- next;
- mes "[Piciburn]";
- mes "You can get there by a sewer passage a bit south of the town.";
- next;
- mes "[" +strcharinfo(0) + "]";
- mes "No wayyyyy!!";
- next;
- mes "[Piciburn]";
- mes "I know. I know...";
- mes "It is dirty.";
- mes "But it's only way in, so don't complain!";
- next;
- mes "[Piciburn]";
- mes "Now, take care of yourself~.";
- close;
-}
-
-//--------------------------Box--------------------------
-
-lhz_cube.gat,248,179,0 script Box#01 111,{
- if (MISC_QUEST&512 || cubekey&64) goto L_DONE;
- mes "There is an axe in the box.";
- next;
- menu "Take the axe.",L_1,"Leave it alone.",-;
- close;
-
-L_1:
- mes "You acquired the ^FF0000axe^000000.";
- set cubekey,cubekey|64;
- close;
-
-L_DONE:
- mes "There is a box that used to contain an ^FF0000axe^000000.";
- close;
-}
-
-//--------------------------Barrel--------------------------
-
-lhz_cube.gat,237,183,0 script Barrel 111,{
- if (MISC_QUEST&512 || cubekey&1) goto L_DONE;
- if (cubekey&128) goto L_2;
- mes "There is a box that looks weak.";
- if ((cubekey&64) == 0) close;
- next;
- input @axe$;
-
- if (@axe$ == "axe" || @axe$ == "Axe") goto L_1;
- mes "There is no change.";
- close;
-
-L_1:
- mes "When you break the barrel with an axe,";
- mes "you see that there's a box inside of it.";
- next;
- mes "On top of the box, there's a panel with the numbers 1~9";
- set cubekey,cubekey|128;
- close;
-
-L_2:
- mes "There is a box with numbers 1~9 on it's surface.";
- next;
- set @agree,0;
- input @number;
- if (num6 == @number) set @agree,@agree+1;
- input @number;
- if (num8 == @number) set @agree,@agree+1;
- input @number;
- if (num1 == @number) set @agree,@agree+1;
- input @number;
- if (num4 == @number) set @agree,@agree+1;
- input @number;
- if (num9 == @number) set @agree,@agree+1;
- input @number;
- if (num2 == @number) set @agree,@agree+1;
- input @number;
- if (num7 == @number) set @agree,@agree+1;
- input @number;
- if (num5 == @number) set @agree,@agree+1;
- input @number;
- if (num3 == @number) set @agree,@agree+1;
- if (@agree == 9 && num1) goto L_3; //you can't enter correct numbers, till read them under that picture [Lupus]
- mes "There is no change.";
- close;
-
-L_3:
- mes "The box opened, making a metallic click.";
- mes "Within the box, there is 'yellow key'.";
- next;
- mes "You acquired '^FF0000yellow key^000000'.";
- set cubekey,cubekey|1;
- close;
-
-L_DONE:
- mes "This box used to have the '^FF0000yellow key^000000'";
- mes "The box is now empty.";
- close;
-}
-
-//--------------------------Drawer--------------------------
-
-lhz_cube.gat,242,201,0 script Drawer 111,{
- if (MISC_QUEST&512 || cubekey&32) goto L_DONE;
- mes "The drawer is locked.";
- if (cubekey&2) goto L_1;
- close;
-
-L_1:
- input @key$;
- if (@key$ == "red key" || @key$ == "Red Key") goto L_2;
- mes "The drawer is locked, you need some kind of key.";
- close;
-
-L_2:
- mes "The red key fits the lock perfectly,opening the drawer.";
- mes "You found a 'small knife' inside.";
- next;
- mes "You acquired ^FF0000small knife^000000.";
- set cubekey,cubekey|32;
- close;
-
-L_DONE:
- mes "It is the drawer you got ^FF0000small knife^000000 from.";
- mes "There is nothing inside now.";
- close;
-}
-
-//--------------------------Documents--------------------------
-
-lhz_cube.gat,237,198,0 script Documents 111,{
- if (MISC_QUEST&512 || cubekey&2) goto L_DONE;
- mes "There are tons of documents here.";
- next;
- menu "Search the documents.",L_1,"Ignore.",-;
- close;
-
-L_1:
- mes "As you look through the documents, a 'red key' falls out.";
- next;
- mes "You acquired ^FF0000red key^000000.";
- set cubekey,cubekey|2;
- close;
-
-L_DONE:
- mes "This is where you acquired ^FF0000red key^000000.";
- mes "There's nothing else to do here.";
- close;
-}
-
-//--------------------------Bed--------------------------
-
-lhz_cube.gat,247,198,0 script Bed 111,{
- mes "There is a messy bed.";
- next;
- menu "Above bed",-,"Below bed",L_1;
-
- mes "The blanket is messily placed.";
- mes "There is nothing special here.";
- close;
-
-L_1:
- if (MISC_QUEST&512 || cubekey&131072) goto L_DONE;
- if (cubekey&2048){
- mes "As you look under the bed, you see that there";
- mes "is a small object covered in dust.";
- next;
- input @bed$;
-
- if (cubekey&4096 && (@bed$ == "long stick" || @bed$ == "Long Stick")){
- mes "You used the long stick to pull it out.";
- next;
- mes "You acquired '^FF0000cube model^000000'.";
- set cubekey,cubekey|131072;
- close;
- }
- mes "It looks like you need some kind of long item to";
- mes "Get the item out, you can't reach it!";
- close;
- }
- mes "You look below the bed and see a 'small stick'.";
- mes "It is within your grasp, but there is";
- mes "also another item hidden under the bed, which";
- mes "you'll need some kind of long item to pull it out.";
- next;
- mes "You acquired the '^FF0000small stick^000000'.";
- mes "It looks like this stick could be combined";
- mes "with another stick to make it larger.";
- set cubekey,cubekey|2048;
-
- if ((cubekey&4096) == 0 && cubekey&1024){
- set cubekey,cubekey|4096;
- next;
- mes "It looks similar to the decently sized stick that you";
- mes "found under the desk.";
- mes "You put the two end to end, and they click into place.";
- next;
- mes "You acquired '^FF0000long stick^000000'.";
- }
- close;
-
-L_DONE:
- mes "This is the place where you got '^FF0000cube model^000000' from.";
- mes "There is nothing down here now but dust.";
- close;
-}
-
-//--------------------------Cup--------------------------
-
-lhz_cube.gat,229,184,0 script Cup 111,{
- if (MISC_QUEST&512 || cubekey&4) goto L_DONE;
- mes "You see an empty bottle and a cup with something in it.";
- next;
- menu "Leave it alone.",-,"Look what is inside.",L_1;
- close;
-
-L_1:
- mes "When you look inside, you see a 'rusty key'.";
- next;
- mes "You acquired the '^FF0000rusty key^000000'.";
- set cubekey,cubekey|4;
- close;
-
-L_DONE:
- mes "You got the '^FF0000rusty key^000000' here.";
- mes "There's nothing but an empty cup and an empty bottle.";
- close;
-}
-
-//--------------------------Shelf--------------------------
-
-lhz_cube.gat,233,206,0 script Shelf 111,{
- if (MISC_QUEST&512 || cubekey&8) goto L_DONE;
- mes "There are lots of bottles filled with acids lined up";
- mes "Along the shelf, they have different labels.";
- next;
- input @lathe$;
-
- if (cubekey&4 && (@lathe$ == "rusty key" || @lathe$ == "Rusty Key")) goto L_1;
- mes "Nothing happened.";
- close;
-
-L_1:
- mes "As you put the 'rusty key' into a bottle, it fizzes";
- mes "and bubbles, and all the liquid disappears.";
- mes "All that's left is a clean, green key.";
- next;
- mes "You acquired the '^FF0000green key^000000'";
- set cubekey,cubekey|8;
- close;
-
-L_DONE:
- mes "There is an acid that changed corroded all the rust";
- mes "off of your key.";
- next;
- mes "I don't see anything useful.";
- close;
-}
-
-//--------------------------Closet--------------------------
-
-lhz_cube.gat,249,191,0 script Closet 111,{
- if (MISC_QUEST&512 || cubekey&8192) goto L_DONE;
- mes "There is a closet with lots of drawers.";
- if (cubekey&8) goto L_2;
- next;
- menu "Leave it alone.",-,"Open one of the drawers.",L_1;
- close;
-
-L_1:
- mes "There's nothing of any interest in this drawer.";
- close;
-
-L_2:
- next;
- input @gkey$;
-
- if (@gkey$ == "green key" || @gkey$ == "Green Key") goto L_3;
- mes "There's nothing of any interest in this drawer.";
- close;
-
-L_3:
- mes "You put the 'green key' into a keyhole,";
- mes "opening one of the locked drawers.";
- mes "In the drawer, there is a model of";
- mes "a polygon.";
- next;
- mes "'You acquired the ^FF0000polygon model^000000.";
- set cubekey,cubekey|8192;
- close;
-
-L_DONE:
- mes "This is the closet where you got";
- mes "the 'polygon model' from.";
- next;
- mes "The other draws will not open, there's";
- mes "nothing else to do here.";
- close;
-}
-
-//--------------------------Desk--------------------------
-
-lhz_cube.gat,234,200,0 script Desk 111,{
- mes "There is a desk with lots of objects scattered around.";
- next;
- menu "Above the desk",-,"Below the desk",L_1,"Drawer",L_2;
-
- mes "There are lots of books, papers and";
- mes "research equipment.";
- close;
-
-L_1:
- if(MISC_QUEST&512 || cubekey&1024) goto L_DONE;
-
- mes "When you look below the desk,";
- mes "You see a decent sized stick.";
- next;
- mes "You acquired '^FF0000short stick^000000'.";
- mes "It looks like this stick could be combined";
- mes "with another stick to make it larger.";
- set cubekey,cubekey|1024;
- if(cubekey&2048){
- set cubekey,cubekey|4096;
- next;
- mes "It seems like the decently sized stick can be";
- mes "combined with the 'short stick' from under the bed.";
- mes "You put the two end to end, and they click into place.";
- next;
- mes "You acquired the '^FF0000long stick^000000'";
- }
- close;
-L_DONE:
- mes "This is where you acquired the '^FF0000short stick^000000'.";
- mes "There is nothing but dust now.";
- close;
-L_2:
- mes "It is locked and can't be opened.";
- close;
-}
-
-//--------------------------Picture--------------------------
-
-lhz_cube.gat,237,206,0 script Picture 111,{
- if (MISC_QUEST&512 || num1 > 0) goto L_DONE;
- mes "There is a picture on the wall.";
- next;
- menu "Move it.",L_1,"Leave it alone.",-;
- close;
-
-L_1:
- mes "It does not move.";
- next;
- input @knife$;
-
- if (cubekey&32 && (@knife$ == "small knife" || @knife$ == "Small Knife")) goto L1_1;
- mes "Nothing happened.";
- close;
-
-L1_1:
- mes "You slid the 'small knife' behind the frame";
- mes "and used it to twist the picture.";
- mes "As you turn the frame, the picture detatches and";
- mes "falls from the wall.";
- next;
- set num1,rand(1,9);
- Lset1:
- set num2,rand(1,9);
- if (num1 == num2) goto Lset1;
- Lset2:
- set num3,rand(1,9);
- if (num1 == num3) goto Lset2;
- if (num2 == num3) goto Lset2;
- Lset3:
- set num4,rand(1,9);
- if (num1 == num4) goto Lset3;
- if (num2 == num4) goto Lset3;
- if (num3 == num4) goto Lset3;
- Lset4:
- set num5,rand(1,9);
- if (num1 == num5) goto Lset4;
- if (num2 == num5) goto Lset4;
- if (num3 == num5) goto Lset4;
- if (num4 == num5) goto Lset4;
- Lset5:
- set num6,rand(1,9);
- if (num1 == num6) goto Lset5;
- if (num2 == num6) goto Lset5;
- if (num3 == num6) goto Lset5;
- if (num4 == num6) goto Lset5;
- if (num5 == num6) goto Lset5;
- Lset6:
- set num7,rand(1,9);
- if (num1 == num7) goto Lset6;
- if (num2 == num7) goto Lset6;
- if (num3 == num7) goto Lset6;
- if (num4 == num7) goto Lset6;
- if (num5 == num7) goto Lset6;
- if (num6 == num7) goto Lset6;
- Lset7:
- set num8,rand(1,9);
- if (num1 == num8) goto Lset7;
- if (num2 == num8) goto Lset7;
- if (num3 == num8) goto Lset7;
- if (num4 == num8) goto Lset7;
- if (num5 == num8) goto Lset7;
- if (num6 == num8) goto Lset7;
- if (num7 == num8) goto Lset7;
- Lset8:
- set num9,rand(1,9);
- if (num1 == num9) goto Lset8;
- if (num2 == num9) goto Lset8;
- if (num3 == num9) goto Lset8;
- if (num4 == num9) goto Lset8;
- if (num5 == num9) goto Lset8;
- if (num6 == num9) goto Lset8;
- if (num7 == num9) goto Lset8;
- if (num8 == num9) goto Lset8;
-
-L_DONE:
- mes "There is a number behind the picture.";
- mes "" + num1 + "3 " + num2 + "6 " + num3 + "9 " + num4 + "4 " + num5 + "8 " + num6 + "1 " + num7 + "7 " + num8 + "2 " + num9 + "5";
- mes "Perhaps you should write this number down somewhere...";
- close;
-}
-
-//--------------------------generator--------------------------
-
-lhz_cube.gat,224,192,0 script Generator 111,{
- if (MISC_QUEST&512 || cubekey&256) goto L_DONE;
- mes "The big machine is running, making a huge noise.";
- mes "There are lots weird symbols and";
- mes "a small key hole beside them.";
- next;
- input @key$;
-
- if (cubekey&1 && (@key$ == "yellow key" || @key$ == "Yellow Key")) goto L_1;
- mes "There's nothing to do here.";
- close;
-
-L_1:
- mes "You insert the 'yellow key' into the keyhole";
- mes "and twist it.";
- mes "The machine clicks, and becomes silent.";
- next;
- mes "When it was stopped, the lamp next to the bed";
- mes "also turned off.";
- set cubekey,cubekey|256;
- close;
-
-L_DONE:
- mes "The big machine sits quietly.";
- close;
-}
-
-//--------------------------Lamp--------------------------
-
-lhz_cube.gat,248,205,0 script Lamp 111,{
- if (MISC_QUEST&512 || cubekey&16) goto L_DONE;
- if (cubekey&256) goto L_1;
- mes "There is a bright lamp.";
- mes "Seems like there is something inside";
- mes "but it is too hot to touch.";
- mes "It looks like you need to somehow turn the lamp off.";
- close;
-
-L_1:
- mes "There is something inside of the bulb.";
- next;
- menu "Leave it alone.",-,"Break the bulb.",L_2;
- close;
-
-L_2:
- mes "When you break the bulb, a";
- mes "'black key' falls out.";
- next;
- mes "You acquired the '^FF0000black key^000000'.";
- set cubekey,cubekey|16;
- close;
-
-L_DONE:
- mes "There nothing but a broken bulb.";
- close;
-}
-
-//--------------------------Box--------------------------
-
-lhz_cube.gat,248,193,0 script Box#02 111,{
- if (MISC_QUEST&512 || countitem(2657) || @gotLPkey) goto L_DONE;
- mes "There is a box with three holes.";
- next;
- if (cubekey&65536 && cubekey&262144 && cubekey&16384) goto L_4;
- menu "Ellipse hole",L_1,"Square hole",L_2,"Polygonal hole",L_3;
-
-L_1:
- if (cubekey&65536) goto L1_2;
- input @ellipse$;
-
- if (cubekey&32768 && (@ellipse$ == "ellipse model" || @ellipse$ == "Ellipse Model")) goto L1_1;
- mes "Nothing happened.";
- close;
-
-L1_1:
- mes "You inserted the 'ellipse model' into the ellipse-shaped hole.";
- mes "The box makes a metallic click.";
- set cubekey,cubekey|65536;
- close;
-
-L1_2:
- mes "You've already inserted the 'ellipse model'.";
- close;
-
-L_2:
- if (cubekey&262144) goto L2_2;
- input @quadrangle$;
-
- if (cubekey&131072 && (@quadrangle$ == "cube model" || @quadrangle$ == "Cube Model")) goto L2_1;
- mes "Nothing happened.";
- close;
-
-L2_1:
- mes "You inserted the 'cube model' into the square-shaped hole.";
- mes "The box makes a metallic click.";
- set cubekey,cubekey|262144;
- close;
-
-L2_2:
- mes "You already inserted the 'square model'.";
- close;
-
-L_3:
- if (cubekey&16384) goto L3_2;
- input @polygon$;
-
- if (cubekey&8192 && (@polygon$ == "polygon model" || @polygon$ == "Polygon Model")) goto L3_1;
- mes "Nothing happened.";
- close;
-
-L3_1:
- mes "You inserted the 'polygon model' into the polygonal hole.";
- mes "The box makes a metallic click.";
- set cubekey,cubekey|16384;
- close;
-
-L3_2:
- mes "You've already inserted the 'polygon model'.";
- close;
-
-L_4:
- mes "All holes are filled with keymodels.";
- next;
- menu "Leave it alone.",-,"Open the box.",L4_1;
- close;
-
-L4_1:
- mes "There is a small card inside of it.";
- next;
- mes "You acquired the 'Laboratory Permit'.";
- set @gotLPkey,1;
- getitem 2657,1;
- close;
-
-L_DONE:
- mes "There is an opened box.";
- mes "There is nothing inside.";
- close;
-}
-
-//--------------------------Test tube--------------------------
-
-lhz_cube.gat,224,197,0 script Test Tube 111,{
- if (MISC_QUEST&512) goto L_DONE;
- if (countitem(2657) > 0) goto L_3;
- if (cubekey&32768) goto L_2;
- mes "There is a weird test tube.";
- mes "It seems like there is something inside.";
- mes "There' a keyhole and a hole that fits a thin object.";
- next;
- input @key$;
-
- if (cubekey&16 && (@key$ == "black key" || @key$ == "Black Key")) goto L_1;
- mes "Nothing happened.";
- close;
-
-L_1:
- mes "You inserted the 'black key' and turned it.";
- mes "The glass window at the front of the machine opened,";
- mes "Revealing an ellipse model.";
- next;
- mes "You acquired the '^FF0000ellipse model^000000'.";
- set cubekey,cubekey|32768;
- close;
-
-L_2:
- mes "This is where you got '^FF0000ellipse model^000000'.";
- mes "There is a weird symbol on the bottom of the machine.";
- mes "It looks like it could open as it has hinges on one side.";
- close;
-
-L_3:
- mes "There is a rectangular hole in the front of the machine.";
- next;
- input @answer$;
-
- if (@answer$ == "Laboratory Permit" || @answer$ == "permit" || @answer$ == "laboratory permit" || @answer$ == "Permit") goto L_4;
- mes "Nothing happened.";
- close;
-
-L_4:
- mes "You inserted the 'Laboratory Keycard' in the hole,";
- mes "and the stair leading down appeared on the floor.";
- next;
- menu "Go down.",L4_1,"Do not go down.",-;
- close;
-
-L4_1:
- mes "It connected to a long staircase.";
- set cubekey,0;
- set num1,0; set num2,0; set num3,0; set num4,0; set num5,0;
- set num6,0; set num7,0; set num8,0; set num9,0;
- set piciburn,0;
- set MISC_QUEST,MISC_QUEST|512;
- close2;
-L_DONE:
- warp "lhz_cube.gat",177,13;
- end;
-}
-
-//============================================================
-// Lighthalzen Pickpocket Mini-Quest
-//============================================================
-
-lighthalzen.gat,240,216,4 script Man#Pickpocket1 870,2,2,{
- end;
-OnTouch:
- callfunc "F_LHZPick",33,1;
- close;
-}
-
-lighthalzen.gat,220,169,4 script Man#Pickpocket2 870,2,2,{
- end;
-OnTouch:
- callfunc "F_LHZPick",33,2;
- close;
-}
-
-lighthalzen.gat,164,127,4 script Man#Pickpocket3 870,2,2,{
- end;
-OnTouch:
- callfunc "F_LHZPick",20,3;
- if(@caught!=1) close;
- mes "[Strange Man]";
- mes "Ayee! I'm trapped.";
- mes "If you will forgive me,";
- mes "I can give you something good.";
- mes "["+strcharinfo(0)+"]";
- mes "You're forgiven, now what is this";
- mes "good thing you mentioned?";
- next;
- mes "[Strange Man]";
- mes "The lower part of your body,";
- mes "will produce a strong power";
- mes "once you've taken the secret potion.";
- mes "It's very useful";
- mes "when you want to run quickly";
- next;
- mes "[Strange Man]";
- mes "I will sell you them for a bargin";
- mes "price of 15,000 zeny to a maximum";
- mes "of three potions.";
- mes "How many do you want?";
- next;
- input @number;
- if(@number>3) set @number,3;
- set @cost,15000*@number;
- if(Zeny<@cost) goto L_Zeny;
- //please check that you add the script to it.
- set Zeny,zeny-@cost;
- getitem 12016,@number; //Speed Potion
- mes "[Strange Man]";
- mes "Thanks for your money.";
- if(rand(1,2)==1) goto L_Reset;
- disablenpc "Man#Pickpocket3";
- enablenpc "Man#Pickpocket2";
- close;
-L_Reset:
- disablenpc "Man#Pickpocket3";
- enablenpc "Man#Pickpocket1";
- close;
-L_Zeny:
- mes "[Strange Man]";
- mes "Too bad.";
- mes "No zeny makes you a poor man.";
- close;
-OnInit:
- disablenpc "Man#Pickpocket2";
- disablenpc "Man#Pickpocket3";
-}
-
-function script F_LHZPick {
- if(Zeny<100) set Zeny,0;
- if(Zeny>=100) set Zeny,zeny-100;
- mes "Pickpocket";
- next;
- if(rand(0,100)<getarg(0)) goto L_Caught;
- mes "Hehehehe....";
- return;
-L_Caught:
- mes "(You notice the man put his";
- mes "hand in your pocket!)";
- mes "["+strcharinfo(0)+"]";
- mes "Eh!? What are you doing!";
- mes "You are!! Stealing my money?!";
- mes "[Strange Man]";
- mes "Ah! I'm caught!";
- mes "["+strcharinfo(0)+"]";
- mes "You're a pickpocket?!?";
- mes "[Strange Man]";
- mes "Hehehehe....";
- next;
- set @rand,rand(1,4);
- if(getarg(1)==1 && @rand<4) goto L_MoveB;
- if(getarg(1)==2 && @rand<4) goto L_MoveA;
- if(getarg(1)==1 && @rand==4) goto L_MoveC1;
- if(getarg(1)==2 && @rand==4) goto L_MoveC2;
- set @caught,1;
- return;
-L_MoveA:
- disablenpc "Man#Pickpocket2";
- enablenpc "Man#Pickpocket1";
- return;
-L_MoveB:
- disablenpc "Man#Pickpocket1";
- enablenpc "Man#Pickpocket2";
- return;
-L_MoveC1:
- disablenpc "Man#Pickpocket1";
- enablenpc "Man#Pickpocket3";
- return;
-L_MoveC2:
- disablenpc "Man#Pickpocket2";
- enablenpc "Man#Pickpocket3";
- return;
-}
-
-//==============================================================
-// Friendship
-//==============================================================
-
-lhz_in02.gat,201,210,3 script Digotz 869,{
-
- if(friendship > 9)goto s_Dead;
- if(friendship == 9)goto s_Wounded;
- if(friendship == 8)goto s_Cont7;
- if(friendship == 6 && friendship2 || friendship == 7)goto s_Cont6;
- if(friendship == 6)goto s_Cont5;
- if(friendship == 4 || friendship == 5)goto s_Cont4;
- if(friendship == 3)goto s_Cont3;
- if(friendship == 2)goto s_Cont2;
- mes "[Digotz]";
- mes "Oh, an adventurer?";
- mes "Welcome to Uptown";
- mes "Lighthalzen. However,";
- mes "I'm afraid this area won't";
- mes "have much to offer you";
- mes "in the way of excitement.";
- next;
- if(friendship == 1)goto s_Cont;
- mes "[Digotz]";
- mes "Feel free to take";
- mes "a look around if you";
- mes "so wish. I'm actually";
- mes "glad to see somebody";
- mes "aside from the stuck up";
- mes "rich people who live here.";
- close;
-
-s_Cont:
- mes "[Digotz]";
- mes "My name is Digotz,";
- mes "just another citizen";
- mes "of Upper Lighthalzen.";
- mes "I hope that you enjoy";
- mes "your stay in my hometown";
- next;
- menu "Do you know someone named Maku?",-;
-
- mes "[Digotz]";
- mes "Maku? Maku. Yes, he's my";
- mes "childhood friend. Or he was,";
- mes "anyway. Now he's just a jerk.";
- mes "In an case, we can't hang";
- mes "out, even if we wanted to,";
- mes "for several reasons.";
- next;
- mes "[Digotz]";
- mes "Hey, why am I even";
- mes "talking about this? It's";
- mes "not like I'm bothered by";
- mes "the fact that me and Maku aren't";
- mes "pals anymore. You know what?";
- mes "Just forget everything I said.";
- set friendship,2;
- close;
-
-s_Cont2:
- mes "[Digotz]";
- mes "What are you still";
- mes "doing hanging around";
- mes "here? There's nothing";
- mes "interesting in Uptown";
- mes "for you to see, adventurer.";
- next;
- mes "[Digotz]";
- mes "Gosh...!";
- mes "Just hearing about";
- mes "Maku makes me so feel";
- mes "so upset for some reason!";
- close;
-
-s_Cont3:
- mes "[Digotz]";
- mes "I know that the";
- mes "opulence of Uptown";
- mes "seems rather attractive,";
- mes "but trust me. This place";
- mes "is colorless. Now, have";
- mes "you visited the poor district?";
- next;
- menu "Yes, I did already...",-;
-
- mes "[" + strcharinfo(0) + "]";
- mes "Yes, I did already...";
- mes "And I met someone";
- mes "named Maku there.";
- next;
- mes "[Digotz]";
- mes "Maku?! Oh, he must have";
- mes "mentioned something about";
- mes "me. But I don't care what he";
- mes "says, unless it's an apology";
- mes "for being a fully blown jerk.";
- mes "Ever since we were kids...";
- next;
- mes "[Digotz]";
- mes "Anyway, we used to be close,";
- mes "but that guy was never a true";
- mes "friend of mine! Like that one";
- mes "time he cheated to beat me at";
- mes "arm wrestling! Or when he never";
- mes "thanked me for buying us lunch!";
- next;
- mes "[Digotz]";
- mes "Sure, he might have helped";
- mes "me a little in meeting my first";
- mes "girlfriend, but I'll never ever";
- mes "forgive him for fixing me up";
- mes "on the worst blind dates a";
- mes "man can possible experience!";
- next;
- mes "[Digotz]";
- mes "Maku doesn't know a damn";
- mes "about friendship! Even if I did";
- mes "want to see him, there are these";
- mes "people who don't want the rich";
- mes "to ever meet with the poor.";
- next;
- mes "If Maku's fine, that's";
- mes "good enough to hear for";
- mes "me! There's no need for me";
- mes "to go all the way over there";
- mes "and check up on him! I only";
- mes "have one regret though...";
- next;
- mes "[Digotz]";
- mes "I only wish I had one";
- mes "last chance to see Maku...";
- mes "So that I could kick his sorry";
- mes "ass myself! Yeah, that's right!";
- mes "Arrogant bastard! But still,";
- mes "I'm not able to do that...";
- next;
- mes "[Digotz]";
- mes "The security guards here";
- mes "will never allow the rich and";
- mes "poor to meet, fearing that";
- mes "the poor will disturb the peace";
- mes "and order of the city. It's a dumb";
- mes "rule made for dumb people.";
- next;
- mes "[Digotz]";
- mes "Still, it's pretty scary that";
- mes "someone can get punished";
- mes "for violating such a stupid";
- mes "taboo, actually. Anyway, if";
- mes "you see Maku again, tell";
- mes "him this for me, got it?";
- next;
- mes "[Digotz]";
- mes "^FF0000Hopeless bastard!";
- mes "You're still a stubborn jerk!";
- mes "You owe me at least 3 lunches!";
- mes "Not to mention an apology!";
- mes "But who cares what you think?!";
- mes "I'm so goddamn happy without you!";
- set friendship,4;
- close;
-
-s_Cont4:
- mes "[Digotz]";
- mes "Still checking out";
- mes "Uptown Lighthalzen?";
- mes "Not like I'd care, but if you";
- mes "do happen to see Maku,";
- mes "deliver this little message";
- mes "for me, sentence by sentence.";
- next;
- mes "[Digotz]";
- mes "^FF0000Hopeless bastard!";
- mes "You're still a stubborn jerk!";
- mes "You owe me at least 3 lunches!";
- mes "Not to mention an apology!";
- mes "But who cares what you think?!";
- mes "I'm so goddamn happy without you!";
- close;
-
-s_Cont5:
- mes "[Digotz]";
- mes "Oh, it's been a while.";
- mes "What are you doing back";
- mes "over here? And, um, did";
- mes "you deliver that message";
- mes "to Maku? Now when I think";
- mes "about it, I was kind of--";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "I delivered your message";
- mes "word for word, and Maku";
- mes "got angry, called you names";
- mes "and has been threatening to";
- mes "beat you up pretty badly.";
- next;
- mes "[Digotz]";
- mes "That no-good, dirty";
- mes "lying rotten scoundrel!";
- mes "If it weren't for those";
- mes "guards, I'd head over to";
- mes "the ghetto and beat Maku";
- mes "up myself! That stupid guy!";
- next;
- mes "[Digotz]";
- mes "During times like this,";
- mes "I really miss ^FF0000Benkaistein^000000";
- mes "That guy would always have";
- mes "an answer for this kind of";
- mes "situation. Yeah, I think he's";
- mes "in some far off town, studying.";
- next;
- mes "[Digotz]";
- mes "Supposedly he's in that";
- mes "place, whatever it's called,";
- mes "since there's a ton of books";
- mes "there that he can use. But";
- mes "yeah, Benkaistein would";
- mes "always be the mediator...";
- next;
- mes "[Digotz]";
- mes "Even back then, when";
- mes "me, him and Maku used to";
- mes "hang out, Benkastein would";
- mes "mediate if we got into some";
- mes "argument. Still, he couldn't";
- mes "do anything about Maku now...";
- next;
- mes "[Digotz]";
- mes "I don't know why,";
- mes "but I'm so angry!";
- mes "Why am I stressing";
- mes "out so much over this?!";
- set friendship2,1;
- close;
-
-s_Cont6:
- mes "[Digotz]";
- mes "Even if Benkaistein came";
- mes "back from wherever he was";
- mes "studying, I don't think he'd be";
- mes "able to get Maku to apologize";
- mes "to me. That guy is just way";
- mes "too stubborn for his own good!";
- if(friendship != 7)close;
- next;
- menu "Show Benkastein's Journal",s_Journal,"Don't show Benkastein's Journal.",-;
-
- mes "[Digotz]";
- mes "I don't understand";
- mes "why I'm so angry!";
- mes "I'm starting to act";
- mes "more like Maku, though,";
- mes "don't get me wrong, it's";
- mes "not like I care about the guy.";
- close;
-
-s_Journal:
- mes "[Digotz]";
- mes "Why am I so ticked off?";
- mes "^3131FF*Sigh*^000000 You have something";
- mes "to show me? Huh? Benkastein";
- mes "wanted me to read this diary";
- mes "of his? Sure, why not? I do";
- mes "owe him a lot over the years...";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Today, me, Digotz and";
- mes "Maku played this crazy flying";
- mes "game. Basically, we make";
- mes "these wings out of wood and";
- mes "paper, jump of these hills";
- mes "and try to fly. Dumb, I know.";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595Today it was my turn to";
- mes "jump and flap my arms with";
- mes "these fake, badly made wings.";
- mes "It's not really a fun game when";
- mes "I think about it. Boy, I hope";
- mes "we don't do that again.";
- next;
- mes "^000000[Digotz]";
- mes "Oh yeah, I remember that!";
- mes "Maky wore the wings most";
- mes "of the time, but I still hold";
- mes "the record for staying in the";
- mes "air the longest! Yeah, I was";
- mes "a regular Kid Pegasus~";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Maku, Digotz and me went";
- mes "outside of town. Of course,";
- mes "we didn't tell anyone or else";
- mes "we'd get in trouble. It was";
- mes "a really exciting day. But";
- mes "then, we ran into a monster!";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595I wanted to run away but Maku";
- mes "and Digotz wanted to beat it so";
- mes "that we could become heroes.";
- mes "Of course, we got hurt pretty";
- mes "bad and the monster got away.";
- mes "Boy, mom was not happy...";
- next;
- mes "^000000[Digotz]";
- mes "Huh. I don't remember";
- mes "that so well. But I know that";
- mes "Benkastein, me and Maku";
- mes "weren't afraid of anything back";
- mes "then. We must have been totally";
- mes "nuts to fight a monster, though.";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Digotz's been sick for three";
- mes "days now. It's just a normal";
- mes "cold and Maku keeps saying";
- mes "it's Digotz's fault he got sick.";
- mes "But he's always asking me to";
- mes "go visit him and see if he's okay.";
- next;
- mes "^000000[Digotz]";
- mes "I think I remember being";
- mes "pretty sick. Maku was worried?";
- mes "I... I must have had a horrible";
- mes "life threatening disease like,";
- mes "um, Gonorrhitis. You know.";
- mes "That might have been it.";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Mom and dad keep telling";
- mes "me not to hang out with Maku";
- mes "anymore. Their reason is really";
- mes "dumb, and I don't care if he is";
- mes "poor. He's one of the best guys";
- mes "that I'll ever know.";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595Digotz's family is really";
- mes "rich and they don't want him";
- mes "to see Maku anymore either.";
- mes "But Digotz doesn't care.";
- mes "I know he likes Maku a lot.";
- next;
- mes "^000000[Digotz]";
- mes "Well, we were a lot";
- mes "younger and closer back";
- mes "then, so... ^111111*Ahem!*^000000Why did";
- mes "Benkastein even write that?!";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Today, the three of us";
- mes "made an oath of brotherhood,";
- mes "just like we read in the comic";
- mes "book. We swore we'd always";
- mes "be friends no matter what.";
- mes "For always and for always.";
- next;
- mes "^000000[Digotz]";
- mes "I... I was forced to make";
- mes "that oath! And people do";
- mes "change, you know! I mean,";
- mes "we were basically just kids,";
- mes "it's not like that oath really";
- mes "means anything now, does it?";
- next;
- mes "[Digotz]";
- mes "That does it. I'm gonna";
- mes "go see that Maku. I don't";
- mes "miss him or anything, but";
- mes "I gotta get him to cancel";
- mes "that oath. And maybe I'll";
- mes "beat up him a little bit.";
- set friendship,8;
- close;
-
-s_Cont7:
- mes "[Digotz]";
- mes "Wh-whoa, I need to";
- mes "get ready! That Maku's";
- mes "gonna make fun of me if";
- mes "I look too rich and pampered.";
- mes "Damn! Where did I put all of";
- mes "my fashionable street clothes?";
- close;
-
-s_Wounded:
- mes "^3131FFDigotz is seriously";
- mes "injured from a wound";
- mes "by a knife that is still";
- mes "embedded in his belly.^000000";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Digotz...?";
- mes "Oh no, let me";
- mes "get you some help!";
- next;
- mes "[Digotz]";
- mes "H-het... It's the";
- mes "adventurer... Man,";
- mes "that Maku. He always";
- mes "did bring me bad luck...";
- mes "It's too late for me and";
- mes "I don't have much time...";
- next;
- mes "[Digotz]";
- mes "Those guards I told you";
- mes "about... The ones who don't";
- mes "want the poor and the rich to";
- mes "mingle? I... Guess they found";
- mes "out I was gonna meet my old";
- mes "pal. I just wanted to see him...";
- next;
- mes "[Digotz]";
- mes "This guy... In a black";
- mes "suit... He just... He just";
- mes "stabbed me! I... God. It's";
- mes "been so long since I've talked";
- mes "to him. We'll hang out and have";
- mes "fun, just like the good old days.";
- next;
- mes "[Digotz]";
- mes "I missed my buddies, but now...";
- mes "Now I can hear them calling me.";
- mes "Now we can all be together just";
- mes "like we all promised. Yeah...";
- mes "I was wrong. Life's too short";
- mes "to be angry with your frie--";
- next;
- mes "[Digotz]";
- mes "..............";
- next;
- mes "[Digotz]";
- mes "..............";
- mes ".......................";
- next;
- mes "[Digotz]";
- mes "..............";
- mes ".......................";
- mes "................................";
- next;
- mes "^3131FFDigotz stopped breating.";
- mes "You remove the Knife from";
- mes "his lifeless body as a final";
- mes "courtesy to a man who";
- mes "dearly loved his friends.";
- next;
- set friendship,10;
- getitem 1201,1;
- close;
-
-s_Dead:
- mes "^3131FFDigotz has passed";
- mes "away, but the look on";
- mes "his face seems very";
- mes "peaceful and content.";
- close;
-
-}
-
-lighthalzen.gat,337,232,3 script Maku 870,{
-
- if(friendship > 1)goto Switches;
- mes "[Maku]";
- mes "Hey, you're on of";
- mes "those adventurers, eh?";
- mes "Welcome to the ghetto.";
- mes "Nothing too adventurous";
- mes "here, but hey, you can";
- mes "explore all you want.";
- next;
- mes "[Maku]";
- mes "I don't know if you know";
- mes "but actually, the people who";
- mes "live here ain't allowed to";
- mes "explore this whole city. It's";
- mes "kind of taboo to talk about,";
- mes "but what do I care, right?";
- next;
- mes "[Maku]";
- mes "Yeah, basically the rich";
- mes "people here are too afraid";
- mes "of the poor people comin' to";
- mes "see them, so the security in";
- mes "this city is pretty tight! Those";
- mes "upper class guys are trash...";
- next;
- mes "[Maku]";
- mes "I didn't use to think";
- mes "this way. I actually used";
- mes "to have a pretty rich friend";
- mes "till I found out he's not all";
- mes "I thought he was. That";
- mes "moron! Why's he like that?!";
- next;
- mes "[Maku]";
- mes "Eh, forget about it.";
- mes "Why am I even talking";
- mes "about my personal life";
- mes "to someone I just met";
- mes "anyway? Sure, we all";
- mes "do it, but still...";
- next;
- mes "[Maku]";
- mes "Well, when you get";
- mes "bored of the ghetto,";
- mes "you really oughta check";
- mes "out the rich section of town.";
- mes "I'm bitter, but I'll also admit";
- mes "it's way nicer than this place.";
- if(BaseLevel > 29) set friendship,1;
- close;
-
-
-Switches:
- switch(friendship)
- {
-
- case 2:
- mes "[Maku]";
- mes "Hey, what are you";
- mes "doing back over here?";
- mes "I thought I recommended";
- mes "going over to check out";
- mes "Uptown Lighthalzen. This";
- mes "place is pretty run-down...";
- next;
- menu "I actually met Digotz and...",-;
-
- mes "[Maku]";
- mes "You what...?!";
- mes "You saw my old pal,";
- mes "Digotz?! Er, I mean,";
- mes "Mister Alexander Digotz,";
- mes "who used to be my buddy,";
- mes "but obviously not anymore.";
- next;
- mes "[Maku]";
- mes "Sure, we were real close";
- mes "at one time, but that was";
- mes "too long ago. It's been a";
- mes "long time since we hung";
- mes "out and he probable hates";
- mes "my penniless guts and...";
- next;
- mes "[Maku]";
- mes "Crud, just listen to";
- mes "me, I sound like a wuss.";
- mes "I don't miss Digotz! In fact,";
- mes "I hate the guy, one hundred";
- mes "percent! The next time I see";
- mes "him, I'll beat him to a pulp!";
- set friendship,3;
- close;
- break;
-
- case 3:
- mes "[Maku]";
- mes "Man, I need to blow off some";
- mes "steam! Sure, me and Digotz";
- mes "were buds before and maybe";
- mes "we might seem like friends now,";
- mes "but not anymore, though we used";
- mes "to be closer than this. Argh!";
- next;
- mes "[Maku]";
- mes "Don't get me wrong, I don't";
- mes "miss the guy or anything like";
- mes "that and I don't feel sorry about";
- mes "what happened. But if he ever";
- mes "came to apologize to me, I'd";
- mes "probably accept, you know.";
- next;
- mes "[Maku]";
- mes "Well, after thinking";
- mes "about it, of course.";
- mes "I mean, I'm not the one";
- mes "holding a grudge. It's all";
- mes "that guy's fault! Sheeeesh!";
- close;
- break;
-
- case 4:
- mes "[Maku]";
- mes "What the hell are you";
- mes "still doing around here?";
- mes "You must have better things";
- mes "to do than talk to a ruffian";
- mes "like me or that snobby and";
- mes "totally prickish Digotz.";
- next;
- menu "Speaking of which...",-;
- mes "[" + strcharinfo(0) + "]";
- mes "Speaking of which...";
- mes "I spoke to Digotz again.";
- mes "He told me to give you a";
- mes "message, but I'm not sure th--";
- next;
- mes "[Maku]";
- mes "That no-good bastard";
- mes "has a message for me?!";
- mes "Oh, I'm soooo honored~";
- mes "Tell me what that fink";
- mes "has to say, line by line!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "Hopeless bastard!")goto failstr;
- mes "[Maku]";
- mes "\"Hopeless Bastard?!\"";
- mes "Well, at least he had";
- mes "the stomach to say that.";
- mes "Through somebody else";
- mes "anyway! What else'd he say?!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "You're still a stubborn jerk!")goto failstr;
- mes "[Maku]";
- mes "\"Stubborn Jerk?!\"";
- mes "Takes no one to know one,";
- mes "bastard! Why I oughta--";
- mes "Grrr! What'd he say next?!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "You owe me at least 3 lunches!")goto failstr;
- mes "[Maku]";
- mes "Three lunches?!";
- mes "I treated that guy to";
- mes "lunch like, fifteen times!";
- mes "I tell you, the guy does not";
- mes "know the meaning of friendship!";
- mes "What else did that moron say?!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "Not to mention an apology!")goto failstr;
- mes "[Maku]";
- mes "Me, apologize?!";
- mes "He should be on his hands";
- mes "and knees begging for my";
- mes "frickin' forgiveness! That...";
- mes "That selfish no-good stupid...";
- mes "W-what else did he tell you?!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "But who cares what you think?!")goto failstr;
- mes "[Maku]";
- mes "Who cares what I think?!";
- mes "GRRRAAH~!! Who cares";
- mes "what he thinks!! ^111111*Pant Pant*^000000";
- mes "I'm gonna murderlize that";
- mes "dumb creep! He can't possibly";
- mes "make me angrier than I am now!";
- next;
- input @digotzstr$;
- if(@digotzstr$ != "I'm so goddamn happy without you!")goto failstr;
- mes "[Maku]";
- mes "That's it.";
- mes "It's decided. The";
- mes "next time I see Digotz,";
- mes "I'm gonna plaster his";
- mes "face all over the floor.";
- set friendship,5;
- close;
- break;
-
- case 5:
- mes "[Maku]";
- mes "RrrrRrrrr.....";
- mes "RrrrrRRRrrRR.....";
- mes "GGGGGRRRRR...";
- next;
- mes "^3131FFUh oh...";
- mes "It looks like Maku";
- mes "is starting to rage";
- mes "just a bit too much.^000000";
- next;
- mes "[Maku]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Maku]";
- mes "Gggrrrr...";
- next;
- mes "[Maku]";
- mes "GRAAAAAAAAH~!";
- mes "Who the hell does he";
- mes "think he is, telling me";
- mes "all sorts of crap!? Digotz,";
- mes "you're not getting away";
- mes "with this! Gonna wreck you!!";
- next;
- set Hp,MaxHp/2;
- mes "^3131FFMaku's seething quickly";
- mes "explodes into pure, violent";
- mes "rage. You manage to calm";
- mes "him down after a while, but";
- mes "barely keep yourself from";
- mes "getting killed in this outburst^000000";
- next;
- mes "[Maku]";
- mes "^111111*Pant pant* *Whew~*^000000";
- mes "D-don't worry, I've got";
- mes "a grip on myself now.";
- mes "Thanks for not letting me";
- mes "get too crazy. Times like";
- mes "this, I really miss ^FF0000Benkaistein^000000.";
- next;
- mes "[Maku]";
- mes "Benkastein would always";
- mes "make sure that I'd stay out";
- mes "of fights. I really miss that";
- mes "guy. Still, he ain't around...";
- next;
- mes "[Maku]";
- mes "Damn those guards!";
- mes "If they weren't there,";
- mes "I could just go over and";
- mes "kick Digotz's ass! I swear,";
- mes "if it weren't for them...!";
- set friendship,6;
- close;
- break;
-
- case 6:
- mes "[Maku]";
- mes "Arrrrgh! Whenever I hear";
- mes "about that Digotz, I get so";
- mes "peeved! Is that guy giving";
- mes "me the brushoff just because";
- mes "I'm not a rich guy like he is?!";
- next;
- mes "[Maku]";
- mes "I can't...";
- mes "I can't even beat him up";
- mes "all properly because of";
- mes "all those freakin' guards!";
- mes "Arrrrrrrgh! Man, where's";
- mes "Benkastein when I need him?";
- close;
- break;
-
- case 7:
- mes "[Maku]";
- mes "Arrrrgh! Whenever I hear";
- mes "about that Digotz, I get so";
- mes "peeved! Is that guy giving";
- mes "me the brushoff just because";
- mes "I'm not a rich guy like he is?!";
- next;
- mes "[Maku]";
- mes "I can't...";
- mes "I can't even beat him up";
- mes "all properly because of";
- mes "all those freakin' guards!";
- mes "Arrrrrrrgh! Man, where's";
- mes "Benkastein when I need him?";
- close;
- break;
-
- case 8:
- mes "[Maku]";
- mes "Hey, what is that? You want";
- mes "me to read this journal?";
- mes "Er, okay, but I'm none too";
- mes "comfortable going through";
- mes "somebody's diary. It's just";
- mes "kinda... creepy, you know?";
- next;
- mes "[Maku]";
- mes "Hey, this think is";
- mes "Benkastein's. I haven't";
- mes "seen that guy in a long while.";
- mes "Ah, so he gave it to you for me";
- mes "to read? Alright, I owe him a";
- mes "favor or two, so I oughta...";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Today, me, Digotz and";
- mes "Maku played this crazy flying";
- mes "game. Basically, we make";
- mes "these wings out of wood and";
- mes "paper, jump of these hills";
- mes "and try to fly. Dumb, I know.";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595Today it was my turn to";
- mes "jump and flap my arms with";
- mes "these fake, badly made wings.";
- mes "It's not really a fun game when";
- mes "I think about it. Boy, I hope";
- mes "we don't do that again.";
- next;
- mes "^000000[Maku]";
- mes "What is he talking about?!";
- mes "That game was real fun!";
- mes "Yeah, I usually wore the";
- mes "wings and Digotz always";
- mes "wanted to wear them too.";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Maku, Digotz and me went";
- mes "outside of town. Of course,";
- mes "we didn't tell anyone or else";
- mes "we'd get in trouble. It was";
- mes "a really exciting day. But";
- mes "then, we ran into a monster!";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595I wanted to run away but Maku";
- mes "and Digotz wanted to beat it so";
- mes "that we could become heroes.";
- mes "Of course, we got hurt pretty";
- mes "bad and the monster got away.";
- mes "Boy, mom was not happy...";
- next;
- mes "^000000[Maku]";
- mes "That's right! Back then,";
- mes "the three of us weren't";
- mes "afraid of anything! Of course,";
- mes "Digotz got beat up the most.";
- mes "But I gotta say, he was also";
- mes "the most fearless of us.";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Digotz's been sick for three";
- mes "days now. It's just a normal";
- mes "cold and Maku keeps saying";
- mes "it's Digotz's fault he got sick.";
- mes "But he's always asking me to";
- mes "go visit him and see if he's okay.";
- next;
- mes "^000000[Maku]";
- mes "Wh-what?! No, I wasn't";
- mes "worried at all! That must";
- mes "have been the time Digotz";
- mes "caught Clymonia. You know,";
- mes "that, uh, horrible disease. No";
- mes "one should have that one!";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Mom and dad keep telling";
- mes "me not to hang out with Maku";
- mes "anymore. Their reason is really";
- mes "dumb, and I don't care if he is";
- mes "poor. He's one of the best guys";
- mes "that I'll ever know.";
- next;
- mes "^000000[Benkastein's Journal]";
- mes "^AD9595Digotz's family is really";
- mes "rich and they don't want him";
- mes "to see Maku anymore either.";
- mes "But Digotz doesn't care.";
- mes "I know he likes Maku a lot.";
- next;
- mes "^000000[Maku]";
- mes "...";
- mes "......";
- next;
- mes "[Benkastein's Journal]";
- mes "^AD9595Today, the three of us";
- mes "made an oath of brotherhood,";
- mes "just like we read in the comic";
- mes "book. We swore we'd always";
- mes "be friends no matter what.";
- mes "For always and for always.";
- next;
- mes "^000000[Maku]";
- mes "Well, that's true,";
- mes "I guess, but people";
- mes "change! Besides, we got";
- mes "that idea from a comic book!";
- mes "Well, if he apologizes first,";
- mes "I guess I better forgive him.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Good...";
- mes "Because Digotz said";
- mes "that he'll be coming";
- mes "by in a few days.";
- next;
- mes "[Maku]";
- mes "What?! He's really coming";
- mes "here? What for? It's too late";
- mes "to patch things up! Still, I'd be";
- mes "a real prick if I didn't see him";
- mes "Alright, fine! I'll teach that guy";
- mes "a lesson once he's here!";
- next;
- mes "[Maku]";
- mes "And, um, gimme that";
- mes "journal! I'm gonna read";
- mes "more of it so I can make";
- mes "fun of Digotz. Bwahahaha!";
- mes "But yeah, um, thanks. Not";
- mes "that I'm grateful or anything.";
- next;
- mes "[Maku]";
- mes "So, uh, I guess";
- mes "I'll see you later.";
- mes "Um, now I gotta get";
- mes "ready for something.";
- mes "^111111(But not to see Digotz!)";
- if(countitem(7351))delitem 7351,1;
- set friendship,9;
- close;
- break;
-
- case 9:
- mes "[Maku]";
- mes "Why is Digotz";
- mes "so late? This isn't";
- mes "like him at all. Maybe";
- mes "something's wrong?";
- close;
- break;
-
- case 10:
- mes "[Maku]";
- mes "Why is Digotz";
- mes "so late? This isn't";
- mes "like him at all. Maybe";
- mes "something's wrong?";
- next;
- mes "[Maku]";
- mes "Eh, he might have";
- mes "some kinda reason for";
- mes "being late, but if he don't,";
- mes "i've been saving a whole";
- mes "six pack of kickass to open,";
- mes "just for him. Heh heh heh~";
- close;
- break;
-
- case 11:
- mes "[Maku]";
- mes "Why is Digotz";
- mes "so late? This isn't";
- mes "like him at all. Maybe";
- mes "something's wrong?";
- next;
- mes "[Maku]";
- mes "Eh, he might have";
- mes "some kinda reason for";
- mes "being late, but if he don't,";
- mes "i've been saving a whole";
- mes "six pack of kickass to open,";
- mes "just for him. Heh heh heh~";
- close;
- break;
- }
-
-failstr:
- mes "[Maku]";
- mes "Wha...? I dunno if Digotz";
- mes "would say something like";
- mes "that. You sure you heard";
- mes "him carefully enough? It's";
- mes "been a while, but I know";
- mes "how Digotz talks, man.";
- close;
-}
-
-yuno_in04.gat,107,14,4 script Student 754,{
-
- mes "[Joey Choryee]";
- mes "This is a study area where";
- mes "you're not supposed to speak,";
- mes "walk or even breathe loudly.";
- mes "Still, students like Benkastein";
- mes "can tune out the whole world";
- mes "when they study hard enough...";
- if(friendship != 6)close;
- next;
- mes "[Joey Choryee]";
- mes "Benkastein...?";
- mes "He's in the north part.";
- mes "of this room. He's a real";
- mes "nice guy, but a little anal.";
- mes "Well, he's too organized";
- mes "and he labels everything!";
- close;
-
-}
-
-yuno_in04.gat,96,106,4 script Passionate Student 754,{
-
- if(friendship == 10)goto s_Ask;
- if(friendship3 == 2 || friendship3 == 3)goto s_Cont2;
- if(friendship3 == 1)goto s_Cont;
- mes "[Passionate Student]";
- mes "Let's see, now.";
- mes "Wind Magic, Black Magic,";
- mes "Porings, ah, there it is";
- mes "Monster race properties.";
- mes "Hopefully this contains";
- mes "the information I need...";
- next;
- if(friendship != 6)goto s_Dialog;
- mes "Upon briefly glancing at";
- mes "this student's belongings,";
- mes "you notice that the name";
- mes "\"Benkastein\" is printed";
- mes "on them. This is the friend";
- mes "mentioned by Maku and Digotz!";
- next;
- menu "Excuse me...",-;
- mes "[" + strcharinfo(0) + "]";
- mes "Excuse me...";
- mes "Benkastein?";
- next;
- mes "[Passionate Student]";
- mes "...The world of humans";
- mes "and the world of demons,";
- mes "yes, yes... No, what I'm";
- mes "looking for is a reference";
- mes "to the heavens of Asgard.";
- mes "Hmm, this here might help...";
- next;
- menu "Hey...",-;
- mes "[" + strcharinfo(0) + "]";
- mes "Hey...";
- mes "Over here.";
- mes "Benkastein!";
- next;
- mes "[Passionate Student]";
- mes "...Oh, now that's a very";
- mes "interesting observation.";
- mes "If I can incorporate that";
- mes "into my thesis without too";
- mes "much trouble, my standpoint";
- mes "would look much more solid...";
- next;
- menu "HEY YOU...!",-;
- mes "[" + strcharinfo(0) + "]";
- mes "HEY YOU...!";
- mes "BENKASTEIN~!";
- next;
- mes "[Passionate Student]";
- mes "Oh, good heavens!";
- mes "C-can't you keep";
- mes "your voice down?";
- mes "I-I'm trying to study!";
- mes "No, wait. Have you been";
- mes "calling me all this time?";
- set friendship3,1;
- close;
-
-s_Cont:
- mes "[Passionate Student]";
- mes "Oh, you startled me!";
- mes "Still, I'm aware that it's";
- mes "hard to get my attention";
- mes "once I immerse myself";
- mes "in a book. So, how can";
- mes "I help you, adventurer?";
- next;
- menu "Tell him about Maku and Digotz.",-;
- mes "[Benkastein]";
- mes "Oh, how are my friends";
- mes "doing? Oh, what? They're";
- mes "having a huge fight just";
- mes "because one's rich and";
- mes "the other one's poor?";
- mes "That's pretty childish!";
- next;
- mes "[Benkastein]";
- mes "But then again, that's just";
- mes "like them. ^111111*Sigh*^000000 I really want";
- mes "to go back home and get those";
- mes "two to make up, but I also need";
- mes "to finish this thesis. Let's see...";
- mes "What can I possibly do from here?";
- next;
- mes "[Benkastein]";
- mes "Oh, I know what I can do!";
- mes "Wait, but where did I put it?";
- mes "Oh, how cold I lose something";
- mes "so important? Wait! Would you";
- mes "please wait a second while";
- mes "I look for something?";
- set friendship3,2;
- close;
-
-s_Cont2:
- mes "[Benkastein]";
- mes "Aw nuts, this is";
- mes "taking much longer";
- mes "than I had expected.";
- mes "Now where did I put";
- mes "that thing? Hmmmm...";
- if(friendship3 == 3)goto s_Cont3;
- next;
- mes "^3131FFPerhaps it would";
- mes "be best if you help";
- mes "Benkastein to look for";
- mes "what he's searching for.";
- close;
-
-s_Cont3:
- next;
- mes "[Benkastein]";
- mes "Oh, is that it?";
- mes "Did you find my";
- mes "journal? Quick, let";
- mes "me check. Yes, yes...";
- mes "This is it! Thank you";
- mes "for finding this for me!";
- next;
- mes "[Benkastein]";
- mes "Would you mind doing";
- mes "a favor for me? It'd be";
- mes "better if I talk to them";
- mes "myself, but I'm too busy";
- mes "working on this thesis...";
- next;
- mes "[Benkastein]";
- mes "Would you please give this";
- mes "journal to Digotz and Maku?";
- mes "I wrote it in when we were";
- mes "really young, so it should";
- mes "remind them of all the good";
- mes "times we used to share.";
- next;
- mes "[Benkastein]";
- mes "Anyway, this should at";
- mes "least help them realize";
- mes "how stupid they've been";
- mes "acting. Thanks in advance,";
- mes "and please take care of";
- mes "Maku and Digotz for me.";
- if(friendship == 6)set friendship,7;
- close;
-
-s_Dialog:
- mes "^3131FFThis student seems to";
- mes "be dilligently conducting";
- mes "intensive research on some";
- mes "academic subject. For now,";
- mes "it would be best to leave him";
- mes "alone so that he can study.";
- close;
-
-s_Ask:
- mes "[Benkastein]";
- mes "Were you able to bring";
- mes "my journal to Digotz and";
- mes "Maku? I'm pretty sure it'd";
- mes "remind them of all the good";
- mes "times we had. I know they";
- mes "sure can be stubborn...";
- next;
- mes "[Benkastein]";
- mes "Anyway, I really";
- mes "appreciate all your";
- mes "help. When I go back";
- mes "home, I look forward to";
- mes "seeing the two of them again.";
- next;
- mes "[Benkastein]";
- mes "Until then, I need to research,";
- mes "finish my thesis and accomplish";
- mes "my academic goals. Oh, please";
- mes "take this pass which will let you";
- mes "go back and forth between the";
- mes "rich and poor areas as my thanks.";
- next;
- mes "[Benkastein]";
- mes "Anyway, I wish you";
- mes "safety in your travels,";
- mes "adventurer. When the three";
- mes "of us get together, I'll be";
- mes "sure to let you know~";
- if(BaseLevel < 41)set BaseExp,BaseExp+49500;
- else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+99000;
- else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+198000;
- else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+396000;
- else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+594000;
- else if(BaseLevel > 90)set BaseExp,BaseExp+792000;
- getitem 7350,1;
- set friendship,11;
- set friendship3,0;
- close;
-
-}
-
-yuno_in04.gat,168,117,1 script Book 111,{
-
- if(friendship3 >= 3)goto Book2;
- if(friendship3 == 2)goto Book;
- mes "^3131FFThis book is labeled,";
- mes "\"Benkastein's Journal";
- mes "Vol. 6.\".";
- close;
-Book:
- mes "^3131FFThis book is labeled,";
- mes "\"Benkastein's Journal";
- mes "Vol. 6.\". This is probably";
- mes "what Benkastein was trying";
- mes "to find, so it might be best to";
- mes "bring this and show it to him";
- set friendship3,3;
- getitem 7351,1;
- close;
-Book2:
- mes "^3131FFThis is where you found";
- mes "the book that Benkastein";
- mes "was looking for.";
- close;
-
-}
-
-yuno_in04.gat,169,109,1 script Ambitious Hollgrehenn 111,{
-
- mes "*Hollgrehenn: The Ambition*";
- mes "By Aragham Caul*";
- mes "";
- mes "";
- mes "";
- mes "";
- mes "Publisher:";
- mes "Muha Books, Co.";
- next;
- mes "...";
- mes "He would stop at nothing";
- mes "to have the greatest weapon";
- mes "in the world in his possession.";
- mes "He became a smith so that he";
- mes "could discern which weapons";
- mes "were the most powerful...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "That's strange...";
- mes "The next page";
- mes "has been torn out.";
- close;
-
-}
-
-yuno_in04.gat,171,117,1 script List of Books 111,{
-
- mes "^3131FFYou find a series";
- mes "of paperback books";
- mes "with titles, printed";
- mes "on the binding in an";
- mes "elegantly decorative";
- mes "cursive style font.";
- mes "The titles include...";
- next;
- mes "*Volcanic Passion*";
- mes "*Midnight Crescendo*";
- mes "*A Paris Affair*";
- mes "*Fever Pitch*";
- mes "*The Cowyboy Next Door*";
- mes "*Platonic Romance*";
- mes "*How Lara Got Her Groove Back*";
- next;
- mes "^000000[" + strcharinfo(0) + "]";
- mes "What the...?!";
- mes "This place even has";
- mes "a romance novel section?";
- close;
-
+//===== eAthena Script =======================================
+//= Quest NPCs located in Lighthalzen
+//===== By: ==================================================
+//= Persian, Vicious_Pucca, aoa00, Evera, MasterOfMupppets,
+//= Lupus, Lord Gywall
+//===== Current Version: =====================================
+//= 2.9
+//===== Compatible With: =====================================
+//= eAthena SVN
+//===== Description: =========================================
+//= Event for the Mobster respawn
+//= Bio Labs Quest
+//= Friendship Quest
+//= Pickpocket Mini-Quest
+//= Bio Ethics Quest (Need bug testing!)
+//===== Additional Comments: =================================
+//= Grammar/script check please. This was a quick job.
+//= Things to add: Look at the thread "Lighthalzen Guard" in SVN script
+//= 0.3 Initial Release
+//= 0.5 Added mobsters spawn and Einbroch pollution. Alert lasts either 10 minutes or all mob killed.
+//= 0.6-0.9 fix small bug. Added Bio-lab entrance Quest. Added Getting security-card Quest.
+//= 1.0 Patched "mobsters spawn & Alert" like Real-RO.
+//= 1.0a fixed rand(1,10) + comparision. There just can't be 'X < 1' [Lupus]
+//= 1.1 Changed the mobster spawn to g_mobster to prevent exploits [MasterOfMuppets]
+//= 1.2 Added the cube room quest by DeNy, translated by vicious_pucca. [MasterOfMuppets]
+//= Thanks to Linuxwolf for a grammar check as well =).
+//= 1.2a Moved Biolab entrance to lhz_dun warps. [Vicious]
+//= 1.3 Fixed password bug, fixed endless item exploit, some typos [Lupus]
+//= 1.4 Fixed password abuse. When people don't read the password under the picture
+//= and enter Zero shit 8) (TODO: I saw some "Sticks" abuses, too.. where you could skip a part of quest...)
+//= 1.5 Fixed Mobster's OnDead event(it has to start with "On"!) [Playtester]
+//= 1.5a Fixed "free stick" bug, thx 2 Neouni [Lupus]
+//= 1.6 Added Gywall's Pickpocket Quest
+//= 1.7 Implemented the Friendship quest [MasterOfMuppets]
+//= 1.8 Changed the name of the mobsters to Gangster, as it should be. [MasterOfMuppets]
+//= 1.9 Added extra input check on Biolab so that the first letter of the word could be capitalized or undercase. [Evera]
+//= 2.0 Removed Duplicates [Silent]
+//= 2.1 Added first part of Bio Ethics Quest [Evera]
+//= 2.2 Added bit to say Bio Ethics is unfinished, and if a player attempts, it warps them
+//= out after finished part... Don't want players getting stuck ;_; [Evera]
+//= 2.3 Finished Bio Ethics Quest. Need bug testers before moving to trunk, my
+//= mind was somewhere else when writing @_@ [Evera]
+//= 2.4 Fixed the bug where a str&int debug was shown in the console for
+//= test tube in bio labs quest. [Evera]
+//= 2.5 Fixed Kellasus giving you extra skills in Bio Ethics quest [Evera]
+//= 2.6 Fixed exploit letting any class get homunculus from Bio Ethics Quest [Evera]
+//= 2.6a Moved Bio Ethics Quest to Alchemist SKILL QUESTS [Lupus]
+//= 2.7 fixed bugs that let people bypass some quest parts V_V [Lupus]
+//= reused cubekey var for 4 Cube Room key vars
+//= 2.8 More optimization. Also fixed bug with "2x short sticks -> long" [Lupus]
+//= Now uses MISC_QUEST&512 instead of 'hzdun'. WIP
+//= 2.9 Fixed Friendship Quest levelup exploit (u could get EXP twice) [Lupus]
+//============================================================
+
+lighthalzen.gat,1,1,7 script sneakAddSuber -1,{
+OnInit:
+ set $@sneakchance, 3; // chance of successful sneak(0 = never, 10 = always)
+ set $@sneakguard, 0; // numbers of people who sneaked past guard
+ set $@threshold, 10; // numbers of sneakers before mob appears
+ set $@mob, 50; // Max respawn numbers of "mobsters"
+ set $@mobcount, 0; // current numbers of "mobsters"
+ set $@lhz_alert, 0; // Alert on Lighthalzen(0 = off, 1 = on)
+ set $@i, 0;
+
+ end;
+
+OnMinute00:
+OnMinute05:
+OnMinute10:
+OnMinute15:
+OnMinute20:
+OnMinute25:
+OnMinute30:
+OnMinute35:
+OnMinute40:
+OnMinute45:
+OnMinute50:
+OnMinute55:
+ if($@lhz_alert == 0) set $@sneakguard, $@sneakguard + rand(1,3);
+ if($@lhz_alert == 1) set $@sneakguard, $@sneakguard - 1; // Monsters will die after 5~10 min. (sneakAddSuber)
+ end;
+}
+
+lighthalzen.gat,1,1,7 script AlertChk -1,{
+OnInit:
+ initnpctimer;
+ end;
+
+OnTimer10000:
+ if($@sneakguard >= $@threshold) goto MakeMob;
+ if($@sneakguard == 0) goto ClearMob; // Monsters will die after 5~10 min. (sneakAddSuber)
+ setnpctimer 0;
+ end;
+
+MakeMob:
+ if($@lhz_alert == 1) goto ChkEnd;
+ set $@mobcount, $@mob;
+ mapannounce "lighthalzen.gat","Maintenance Organization of the Public Order: Currently the security of the city has been compromized, We ask the citizens to be more careful. I repeat. We ask the citizens to be more careful.", 1;
+
+ for( set $@i, 0; $@i < $@mob; set $@i, $@i + 1 ) {
+ monster "lighthalzen.gat",0,0,"Gangster",1592,1,"AlertChk::OnMobKilled";
+ }
+
+ set $@lhz_alert, 1;
+ set $@sneakguard, 2; // Monsters will die after 5~10 min. (sneakAddSuber)
+ setnpctimer 0;
+ end;
+
+ClearMob:
+ if($@lhz_alert == 0) goto ChkEnd;
+ set $@mobcount, 0;
+ mapannounce "lighthalzen.gat","Maintenance organization of the Public Order: We were able to get rid of all the trouble makers in the city. You may relax now.", 1;
+ killmonster "lighthalzen.gat","AlertChk::OnMobKilled";
+ set $@lhz_alert, 0;
+ set $@sneakguard, 0;
+ setnpctimer 0;
+ end;
+
+OnMobKilled:
+ set $@mobcount, $@mobcount - 1;
+ if($@mobcount == 0) goto ClearMob;
+ setnpctimer 0;
+ end;
+
+ChkEnd:
+ setnpctimer 0;
+ end;
+}
+
+lighthalzen.gat,267,200,3 script Security Guard#01 868,{
+
+ if(countitem(7350)>0) goto Lhzpass1;
+ if($@lhz_alert == 1) goto Lhzstop;
+ if((gettime(2)>00 && gettime(2)<10)) goto LhzTalk2;
+ if((gettime(2)>30 && gettime(2)<40)) goto LhzTalk2;
+ set @LhzTalk,rand(1,10);
+ if(@LhzTalk < 2 ) goto LhzTalk1;
+
+LhzTalk:
+ mes "[Guard]";
+ mes "Hey! Where do you think you are going?";
+ mes "I can not send nobody to the slum district!";
+ mes "If we let suspecious people like you pass,";
+ mes "there is no point in peace keeping!";
+ close;
+
+LhzTalk1:
+ mes "-Looks like the guard is doing something else";
+ mes "Now is a good time to sneak by.-";
+ next;
+ warp "lighthalzen.gat",297,227;
+ set $@sneakguard, $@sneakguard + 1;
+ close;
+
+LhzTalk2:
+ set @LhzTalk,rand(1,10);
+ if(@LhzTalk < 2 ) goto LhzTalk;
+ mes "[Guard]";
+ mes "zzZ... zzZ... zzZ...";
+ mes "hmm. hmm... zzZ...";
+ next;
+ mes "-Looks like the guard is sleeping";
+ mes "Now is a good time to sneak by.-";
+ next;
+ warp "lighthalzen.gat",297,227;
+ close;
+
+Lhzpass1:
+ mes "[Guard]";
+ mes "Who are you! ...Hmm? You have a pass?";
+ mes "I'm sorry. You look like an adventurer,";
+ mes "but I guess you got the authority.";
+ mes "You may pass.";
+ next;
+ warp "lighthalzen.gat",297,227;
+ close;
+
+Lhzstop:
+ mes "[Guard]";
+ mes "Recently, there were too many people sneaking pass us,";
+ mes "so we raised the security level.";
+ mes "Who sneak past us anyway?";
+ mes "It's troublesome...";
+ close;
+}
+
+lighthalzen.gat,294,223,7 script Security Guard#02 868,{
+
+ if(countitem(7350)>0) goto Lhzpass1;
+ if($@lhz_alert == 1) goto Lhzstop;
+ if((gettime(2)>00 && gettime(2)<10)) goto LhzTalk2;
+ if((gettime(2)>30 && gettime(2)<40)) goto LhzTalk2;
+ set @LhzTalk,rand(1,10);
+ if(@LhzTalk < 2 ) goto LhzTalk1;
+
+LhzTalk:
+ mes "[Guard]";
+ mes "Hey! Where do you think you are going?";
+ mes "I can not send nobody to the slum district!";
+ mes "If we let suspecious people like you pass,";
+ mes "there is no point in peace keeping!";
+ close;
+
+LhzTalk1:
+ mes "-Looks like the guard is doing something else";
+ mes "Now is a good time to sneak by.-";
+ next;
+ warp "lighthalzen.gat",264,200;
+ set $@sneakguard, $@sneakguard + 1;
+ close;
+
+LhzTalk2:
+ set @LhzTalk,rand(1,10);
+ if(@LhzTalk < 2 ) goto LhzTalk;
+ mes "[Guard]";
+ mes "zzZ... zzZ... zzZ...";
+ mes "hmm. hmm... zzZ...";
+ next;
+ mes "-Looks like the guard is sleeping";
+ mes "Now is a good time to sneak by.-";
+ next;
+ warp "lighthalzen.gat",264,200;
+ close;
+
+Lhzpass1:
+ mes "[Guard]";
+ mes "Who are you! ...Hmm? You have a pass?";
+ mes "I'm sorry. You look like an adventurer,";
+ mes "but I guess you got the authority.";
+ mes "You may pass.";
+ next;
+ warp "lighthalzen.gat",264,200;
+ close;
+
+Lhzstop:
+ mes "[Guard]";
+ mes "Recently, there were too many people sneaking pass us,";
+ mes "so we raised the security level.";
+ mes "Who sneak past us anyway?";
+ mes "It's troublesome...";
+ close;
+}
+
+//============================================================
+// Cube Room
+//============================================================
+
+//--------------------------Piciburn--------------------------
+
+lighthalzen.gat,341,224,4 script Piciburn 868,{
+ if (BaseLevel < 60){
+ mes "[Piciburn]";
+ mes "Keep moving.";
+ close;
+ }
+ if (MISC_QUEST&512) goto L_DONE;
+ if (piciburn == 7) goto L_10;
+ if (piciburn == 6) goto L_9;
+ if (piciburn == 5) goto L_6;
+ if (piciburn == 4) goto L_4;
+ if (piciburn == 3) goto L_3;
+ if (piciburn == 2) goto L_2;
+ if (piciburn == 1) goto L_1;
+ mes "[Piciburn]";
+ mes "Hmm...? What is it?";
+ mes "I am busy at the moment,";
+ mes "so stop bothering me.";
+ set piciburn,1;
+ close;
+
+L_1:
+ mes "[Piciburn]";
+ mes "I'm getting distracted because";
+ mes "You keep staring at me!";
+ mes "Would you please leave me alone?";
+ set piciburn,piciburn+1;
+ close;
+
+L_2:
+ mes "[Piciburn]";
+ mes "Hmm...? Oh, it's you..";
+ mes "You are really getting on my nerves.";
+ mes "You're weird, you know that?";
+ mes "What is it that you want from me?";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Nothing really...";
+ mes "Just looking around...";
+ mes "What are you doing?";
+ next;
+ mes "[Piciburn]";
+ mes "Oh, man...";
+ mes "If I just needed to show you this,";
+ mes "I wouldn't have got all worked up.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "I know. Haha.";
+ next;
+ mes "[Piciburn]";
+ mes "You really ARE a weird person...";
+ mes "Are you just going to stand there";
+ mes "and keep watching?";
+ next;
+ mes "[Piciburn]";
+ mes "... You're really annoying me!";
+ mes "What do you want from me?!";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "I've aready told you.";
+ mes "I asked what you were doing.";
+ mes "This place is hot and sticky.";
+ next;
+ mes "[Piciburn]";
+ mes "Okay, okay..";
+ mes "I'll tell you what i'm doing,";
+ mes "but would you leave me in peace";
+ mes "if i did? Thanks.";
+ next;
+ mes "[Piciburn]";
+ mes "I'm.. um... doing something illegal...";
+ mes "Don't tell anyone about this!";
+ next;
+ mes "[Piciburn]";
+ mes "I am the only person who can make a route to";
+ mes "the industrial city's -^FF0000Laboratory^000000- or";
+ mes "places normal people wouldn't usually be able to get to.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "The -Laboratory?!!!-";
+ mes "Can you really get people in there?!!!";
+ next;
+ mes "[Piciburn]";
+ mes "Agh! Quieten down! What did i tell you?";
+ mes "I've told you what i do, now will you stop staring at me?";
+ mes "And be quiet~!";
+ mes "You're weird.. ¬_¬";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Ah..Haha.. I'm sorry.";
+ mes "I really want to go there,";
+ mes "so I got excited when I heard you can get people in there";
+ next;
+ mes "[Piciburn]";
+ mes "Hmm? You were planning to get in there?";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Yeah, but i couldn't get in..";
+ next;
+ mes "[Piciburn]";
+ mes "Hmm...";
+ mes "This is troublesome...";
+ mes "I don't usually tell people i cannot";
+ mes "trust how to get into the Laboratory...";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "What do I need to do?";
+ mes "How can I get into the laboratory?";
+ next;
+ mes "[Piciburn]";
+ mes "Geez~, I'm just giving people a route, not sending them there.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Doesn't that mean the same thing?";
+ next;
+ mes "[Piciburn]";
+ mes "What I'm saying is,";
+ mes "I'm giving people the chance to get into the labs.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "You're really talented, huh.";
+ next;
+ mes "[Piciburn]";
+ mes "Hahaha! Damn right.";
+ mes "It's a piece of cake!";
+ mes "...";
+ mes "Actually, now i think about it, it's impossible..";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "How's it impossible?";
+ mes "I haven't say anything yet~..";
+ next;
+ mes "[Piciburn]";
+ mes "Oh come on, you were going to BEG me to send you there~!!!";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Heh...";
+ mes "You really ARE clever.";
+ mes "Well...";
+ mes "Pretty please~~?";
+ next;
+ mes "[Piciburn]";
+ mes "I can never let you in~..";
+ mes "Never ever~!!!";
+ set piciburn,piciburn+1;
+ close;
+
+L_3:
+ mes "[" +strcharinfo(0) + "]";
+ mes "Please?";
+ next;
+ mes "[Piciburn]";
+ mes "No way.";
+ set piciburn,piciburn+1;
+ close;
+
+L_4:
+ mes "[" +strcharinfo(0) + "]";
+ mes "Pleaseeeee?";
+ next;
+ mes "[Piciburn]";
+ mes "No.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Pleaseeeeeeeeeee?";
+ next;
+ mes "[Piciburn]";
+ mes "I don't want to.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Do it!!!";
+ next;
+ mes "[Piciburn]";
+ mes "Never~!!!";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Why are you doing this to me?!!";
+ mes "What do you want from me !?!";
+ next;
+ mes "[Piciburn]";
+ mes "What do I want?";
+ mes "Heh heh.. One billion zeny.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Are you crazy?!";
+ next;
+ mes "[Piciburn]";
+ mes "It's your choice.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "Sir, you know I don't have that much money.";
+ mes "Is there anything else you need?";
+ next;
+ mes "[Piciburn]";
+ mes "Hmm...";
+ mes "Okay fine...";
+ mes "Bring me 20 Jellopies.";
+ mes "'Kay?";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "........";
+ mes "So that's what you really wanted to ask me?";
+ next;
+ mes "[Piciburn]";
+ mes "Hahaha...";
+ mes "Yeah~~...";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "........";
+ next;
+ mes "[Piciburn]";
+ mes "So, what're you doing just standing there?";
+ mes "Are you going to do it or not?";
+ next;
+ menu "Definitely!",L_5,"No way! It's impossible!",-;
+
+ mes "[Piciburn]";
+ mes "Ah well, your loss,";
+ mes "Too bad!";
+ mes "Bye now~!!";
+ close;
+
+L_5:
+ mes "[Piciburn]";
+ mes "Okay then, do as I said,";
+ mes "bring me 20 jellopies!";
+ mes "....";
+ mes "What're you waiting for?! GO!!";
+ set piciburn,piciburn+1;
+ close;
+
+L_6:
+ mes "[Piciburn]";
+ mes "Did you get the items?";
+ next;
+ menu "Erm.. No..",-,"Hell yeah!",L_7,"What did you want again..?",L7_1;
+
+ mes "[Piciburn]";
+ mes "Hey, I don't feel like playing around anymore.";
+ mes "If you really want to get there, bring the damn items!";
+ close;
+
+L_7:
+ if (countitem(909) >= 20) goto L_8;
+ mes "[Piciburn]";
+ mes "Are you joking?";
+ mes "If you keep doing this,";
+ mes "I may not keep the promise either.";
+ mes "So go and get them already!";
+ close;
+
+L7_1:
+ mes "[Piciburn]";
+ mes "You're really stupid~!";
+ mes "It's 20 jellopies!";
+ mes "Don't forget this time~";
+ close;
+
+L_8:
+ delitem 909,20;
+ mes "[Piciburn]";
+ mes "Hmm. You're more reliable than i thought.";
+ mes "Taking this errand into consideration,";
+ mes "i guess you really want to get in there?";
+ next;
+ mes "[Piciburn]";
+ mes "Coming to think of it,";
+ mes "you look different.";
+ mes "Should I say you look more... trustworthy..?";
+ next;
+ mes "[Piciburn]";
+ mes "Well... Anyway...";
+ mes "A promise is a promise.";
+ mes "I will tell you how to get there.";
+ next;
+ mes "[Piciburn]";
+ mes "As I told you earlier, all I can do is";
+ mes "give you the opportunity to get in.";
+ next;
+ mes "[Piciburn]";
+ mes "I used to be a manager working for the lab,";
+ mes "but time moves on, as people do,";
+ mes "and now I am working against the lab.";
+ next;
+ mes "[Piciburn]";
+ mes "Now... Answer honestly on all I ask here on out.";
+ mes "Where i send you all depends on how you answer.";
+ next;
+ mes "[Piciburn]";
+ mes "Somewhere in the place I'm going to send you";
+ mes "There will be things you must find,";
+ mes "So search well.";
+ next;
+ mes "[Piciburn]";
+ mes "Well, when you've made your mind up,";
+ mes "come back and talk to me. Okay?";
+ set piciburn,piciburn+1;
+ close;
+
+L_9:
+ mes "[Piciburn]";
+ mes "Hmm... So...";
+ mes "Are you ready to go?";
+ next;
+ menu "No",-,"Yes",L9_1;
+
+ mes "[Piciburn]";
+ mes "Hmm... Not yet, huh...";
+ mes "Well, I guess it is to be expected.";
+ mes "But don't make me wait too long~!";
+ close;
+
+L9_1:
+ mes "[Piciburn]";
+ mes "This is going to be hard~";
+ mes "Let's go!!!";
+ close2;
+ set piciburn,piciburn+1;
+ set @rdm,rand(3);
+ if(@rdm==1)goto L_warp1;
+ if(@rdm==2)goto L_warp2;
+ warp "lhz_cube.gat",67,193;
+ end;
+
+L_10:
+ mes "[Piciburn]";
+ mes "Hah!";
+ mes "You failed in there, right? Hahahaha~.";
+ mes "Are you going to try again? Or is it too tough~";
+ next;
+ menu "No",-,"Yes",L10_1;
+
+ mes "[Piciburn]";
+ mes "It was that hard huh?";
+ mes "Well, come back if you change your mind.";
+ close;
+
+L10_1:
+ mes "[Piciburn]";
+ mes "Okay..";
+ mes "I will send you there again..";
+ mes "Good luck!";
+ close2;
+ set @rdm,rand(3);
+ if(@rdm==1)goto L_warp1;
+ if(@rdm==2)goto L_warp2;
+ warp "lhz_cube.gat",67,193;
+ end;
+
+L_warp1:
+ warp "lhz_cube.gat",66,136;
+ end;
+L_warp2:
+ warp "lhz_cube.gat",66,74;
+ end;
+
+L_DONE:
+ mes "[Piciburn]";
+ mes "Oh~ I guess you found the entrance.";
+ mes "I'll tell you now...";
+ mes "If you want to go in there again";
+ next;
+ mes "[Piciburn]";
+ mes "You can get there by a sewer passage a bit south of the town.";
+ next;
+ mes "[" +strcharinfo(0) + "]";
+ mes "No wayyyyy!!";
+ next;
+ mes "[Piciburn]";
+ mes "I know. I know...";
+ mes "It is dirty.";
+ mes "But it's only way in, so don't complain!";
+ next;
+ mes "[Piciburn]";
+ mes "Now, take care of yourself~.";
+ close;
+}
+
+//--------------------------Box--------------------------
+
+lhz_cube.gat,248,179,0 script Box#01 111,{
+ if (MISC_QUEST&512 || cubekey&64) goto L_DONE;
+ mes "There is an axe in the box.";
+ next;
+ menu "Take the axe.",L_1,"Leave it alone.",-;
+ close;
+
+L_1:
+ mes "You acquired the ^FF0000axe^000000.";
+ set cubekey,cubekey|64;
+ close;
+
+L_DONE:
+ mes "There is a box that used to contain an ^FF0000axe^000000.";
+ close;
+}
+
+//--------------------------Barrel--------------------------
+
+lhz_cube.gat,237,183,0 script Barrel 111,{
+ if (MISC_QUEST&512 || cubekey&1) goto L_DONE;
+ if (cubekey&128) goto L_2;
+ mes "There is a box that looks weak.";
+ if ((cubekey&64) == 0) close;
+ next;
+ input @axe$;
+
+ if (@axe$ == "axe" || @axe$ == "Axe") goto L_1;
+ mes "There is no change.";
+ close;
+
+L_1:
+ mes "When you break the barrel with an axe,";
+ mes "you see that there's a box inside of it.";
+ next;
+ mes "On top of the box, there's a panel with the numbers 1~9";
+ set cubekey,cubekey|128;
+ close;
+
+L_2:
+ mes "There is a box with numbers 1~9 on it's surface.";
+ next;
+ set @agree,0;
+ input @number;
+ if (num6 == @number) set @agree,@agree+1;
+ input @number;
+ if (num8 == @number) set @agree,@agree+1;
+ input @number;
+ if (num1 == @number) set @agree,@agree+1;
+ input @number;
+ if (num4 == @number) set @agree,@agree+1;
+ input @number;
+ if (num9 == @number) set @agree,@agree+1;
+ input @number;
+ if (num2 == @number) set @agree,@agree+1;
+ input @number;
+ if (num7 == @number) set @agree,@agree+1;
+ input @number;
+ if (num5 == @number) set @agree,@agree+1;
+ input @number;
+ if (num3 == @number) set @agree,@agree+1;
+ if (@agree == 9 && num1) goto L_3; //you can't enter correct numbers, till read them under that picture [Lupus]
+ mes "There is no change.";
+ close;
+
+L_3:
+ mes "The box opened, making a metallic click.";
+ mes "Within the box, there is 'yellow key'.";
+ next;
+ mes "You acquired '^FF0000yellow key^000000'.";
+ set cubekey,cubekey|1;
+ close;
+
+L_DONE:
+ mes "This box used to have the '^FF0000yellow key^000000'";
+ mes "The box is now empty.";
+ close;
+}
+
+//--------------------------Drawer--------------------------
+
+lhz_cube.gat,242,201,0 script Drawer 111,{
+ if (MISC_QUEST&512 || cubekey&32) goto L_DONE;
+ mes "The drawer is locked.";
+ if (cubekey&2) goto L_1;
+ close;
+
+L_1:
+ input @key$;
+ if (@key$ == "red key" || @key$ == "Red Key") goto L_2;
+ mes "The drawer is locked, you need some kind of key.";
+ close;
+
+L_2:
+ mes "The red key fits the lock perfectly,opening the drawer.";
+ mes "You found a 'small knife' inside.";
+ next;
+ mes "You acquired ^FF0000small knife^000000.";
+ set cubekey,cubekey|32;
+ close;
+
+L_DONE:
+ mes "It is the drawer you got ^FF0000small knife^000000 from.";
+ mes "There is nothing inside now.";
+ close;
+}
+
+//--------------------------Documents--------------------------
+
+lhz_cube.gat,237,198,0 script Documents 111,{
+ if (MISC_QUEST&512 || cubekey&2) goto L_DONE;
+ mes "There are tons of documents here.";
+ next;
+ menu "Search the documents.",L_1,"Ignore.",-;
+ close;
+
+L_1:
+ mes "As you look through the documents, a 'red key' falls out.";
+ next;
+ mes "You acquired ^FF0000red key^000000.";
+ set cubekey,cubekey|2;
+ close;
+
+L_DONE:
+ mes "This is where you acquired ^FF0000red key^000000.";
+ mes "There's nothing else to do here.";
+ close;
+}
+
+//--------------------------Bed--------------------------
+
+lhz_cube.gat,247,198,0 script Bed 111,{
+ mes "There is a messy bed.";
+ next;
+ menu "Above bed",-,"Below bed",L_1;
+
+ mes "The blanket is messily placed.";
+ mes "There is nothing special here.";
+ close;
+
+L_1:
+ if (MISC_QUEST&512 || cubekey&131072) goto L_DONE;
+ if (cubekey&2048){
+ mes "As you look under the bed, you see that there";
+ mes "is a small object covered in dust.";
+ next;
+ input @bed$;
+
+ if (cubekey&4096 && (@bed$ == "long stick" || @bed$ == "Long Stick")){
+ mes "You used the long stick to pull it out.";
+ next;
+ mes "You acquired '^FF0000cube model^000000'.";
+ set cubekey,cubekey|131072;
+ close;
+ }
+ mes "It looks like you need some kind of long item to";
+ mes "Get the item out, you can't reach it!";
+ close;
+ }
+ mes "You look below the bed and see a 'small stick'.";
+ mes "It is within your grasp, but there is";
+ mes "also another item hidden under the bed, which";
+ mes "you'll need some kind of long item to pull it out.";
+ next;
+ mes "You acquired the '^FF0000small stick^000000'.";
+ mes "It looks like this stick could be combined";
+ mes "with another stick to make it larger.";
+ set cubekey,cubekey|2048;
+
+ if ((cubekey&4096) == 0 && cubekey&1024){
+ set cubekey,cubekey|4096;
+ next;
+ mes "It looks similar to the decently sized stick that you";
+ mes "found under the desk.";
+ mes "You put the two end to end, and they click into place.";
+ next;
+ mes "You acquired '^FF0000long stick^000000'.";
+ }
+ close;
+
+L_DONE:
+ mes "This is the place where you got '^FF0000cube model^000000' from.";
+ mes "There is nothing down here now but dust.";
+ close;
+}
+
+//--------------------------Cup--------------------------
+
+lhz_cube.gat,229,184,0 script Cup 111,{
+ if (MISC_QUEST&512 || cubekey&4) goto L_DONE;
+ mes "You see an empty bottle and a cup with something in it.";
+ next;
+ menu "Leave it alone.",-,"Look what is inside.",L_1;
+ close;
+
+L_1:
+ mes "When you look inside, you see a 'rusty key'.";
+ next;
+ mes "You acquired the '^FF0000rusty key^000000'.";
+ set cubekey,cubekey|4;
+ close;
+
+L_DONE:
+ mes "You got the '^FF0000rusty key^000000' here.";
+ mes "There's nothing but an empty cup and an empty bottle.";
+ close;
+}
+
+//--------------------------Shelf--------------------------
+
+lhz_cube.gat,233,206,0 script Shelf 111,{
+ if (MISC_QUEST&512 || cubekey&8) goto L_DONE;
+ mes "There are lots of bottles filled with acids lined up";
+ mes "Along the shelf, they have different labels.";
+ next;
+ input @lathe$;
+
+ if (cubekey&4 && (@lathe$ == "rusty key" || @lathe$ == "Rusty Key")) goto L_1;
+ mes "Nothing happened.";
+ close;
+
+L_1:
+ mes "As you put the 'rusty key' into a bottle, it fizzes";
+ mes "and bubbles, and all the liquid disappears.";
+ mes "All that's left is a clean, green key.";
+ next;
+ mes "You acquired the '^FF0000green key^000000'";
+ set cubekey,cubekey|8;
+ close;
+
+L_DONE:
+ mes "There is an acid that changed corroded all the rust";
+ mes "off of your key.";
+ next;
+ mes "I don't see anything useful.";
+ close;
+}
+
+//--------------------------Closet--------------------------
+
+lhz_cube.gat,249,191,0 script Closet 111,{
+ if (MISC_QUEST&512 || cubekey&8192) goto L_DONE;
+ mes "There is a closet with lots of drawers.";
+ if (cubekey&8) goto L_2;
+ next;
+ menu "Leave it alone.",-,"Open one of the drawers.",L_1;
+ close;
+
+L_1:
+ mes "There's nothing of any interest in this drawer.";
+ close;
+
+L_2:
+ next;
+ input @gkey$;
+
+ if (@gkey$ == "green key" || @gkey$ == "Green Key") goto L_3;
+ mes "There's nothing of any interest in this drawer.";
+ close;
+
+L_3:
+ mes "You put the 'green key' into a keyhole,";
+ mes "opening one of the locked drawers.";
+ mes "In the drawer, there is a model of";
+ mes "a polygon.";
+ next;
+ mes "'You acquired the ^FF0000polygon model^000000.";
+ set cubekey,cubekey|8192;
+ close;
+
+L_DONE:
+ mes "This is the closet where you got";
+ mes "the 'polygon model' from.";
+ next;
+ mes "The other draws will not open, there's";
+ mes "nothing else to do here.";
+ close;
+}
+
+//--------------------------Desk--------------------------
+
+lhz_cube.gat,234,200,0 script Desk 111,{
+ mes "There is a desk with lots of objects scattered around.";
+ next;
+ menu "Above the desk",-,"Below the desk",L_1,"Drawer",L_2;
+
+ mes "There are lots of books, papers and";
+ mes "research equipment.";
+ close;
+
+L_1:
+ if(MISC_QUEST&512 || cubekey&1024) goto L_DONE;
+
+ mes "When you look below the desk,";
+ mes "You see a decent sized stick.";
+ next;
+ mes "You acquired '^FF0000short stick^000000'.";
+ mes "It looks like this stick could be combined";
+ mes "with another stick to make it larger.";
+ set cubekey,cubekey|1024;
+ if(cubekey&2048){
+ set cubekey,cubekey|4096;
+ next;
+ mes "It seems like the decently sized stick can be";
+ mes "combined with the 'short stick' from under the bed.";
+ mes "You put the two end to end, and they click into place.";
+ next;
+ mes "You acquired the '^FF0000long stick^000000'";
+ }
+ close;
+L_DONE:
+ mes "This is where you acquired the '^FF0000short stick^000000'.";
+ mes "There is nothing but dust now.";
+ close;
+L_2:
+ mes "It is locked and can't be opened.";
+ close;
+}
+
+//--------------------------Picture--------------------------
+
+lhz_cube.gat,237,206,0 script Picture 111,{
+ if (MISC_QUEST&512 || num1 > 0) goto L_DONE;
+ mes "There is a picture on the wall.";
+ next;
+ menu "Move it.",L_1,"Leave it alone.",-;
+ close;
+
+L_1:
+ mes "It does not move.";
+ next;
+ input @knife$;
+
+ if (cubekey&32 && (@knife$ == "small knife" || @knife$ == "Small Knife")) goto L1_1;
+ mes "Nothing happened.";
+ close;
+
+L1_1:
+ mes "You slid the 'small knife' behind the frame";
+ mes "and used it to twist the picture.";
+ mes "As you turn the frame, the picture detatches and";
+ mes "falls from the wall.";
+ next;
+ set num1,rand(1,9);
+ Lset1:
+ set num2,rand(1,9);
+ if (num1 == num2) goto Lset1;
+ Lset2:
+ set num3,rand(1,9);
+ if (num1 == num3) goto Lset2;
+ if (num2 == num3) goto Lset2;
+ Lset3:
+ set num4,rand(1,9);
+ if (num1 == num4) goto Lset3;
+ if (num2 == num4) goto Lset3;
+ if (num3 == num4) goto Lset3;
+ Lset4:
+ set num5,rand(1,9);
+ if (num1 == num5) goto Lset4;
+ if (num2 == num5) goto Lset4;
+ if (num3 == num5) goto Lset4;
+ if (num4 == num5) goto Lset4;
+ Lset5:
+ set num6,rand(1,9);
+ if (num1 == num6) goto Lset5;
+ if (num2 == num6) goto Lset5;
+ if (num3 == num6) goto Lset5;
+ if (num4 == num6) goto Lset5;
+ if (num5 == num6) goto Lset5;
+ Lset6:
+ set num7,rand(1,9);
+ if (num1 == num7) goto Lset6;
+ if (num2 == num7) goto Lset6;
+ if (num3 == num7) goto Lset6;
+ if (num4 == num7) goto Lset6;
+ if (num5 == num7) goto Lset6;
+ if (num6 == num7) goto Lset6;
+ Lset7:
+ set num8,rand(1,9);
+ if (num1 == num8) goto Lset7;
+ if (num2 == num8) goto Lset7;
+ if (num3 == num8) goto Lset7;
+ if (num4 == num8) goto Lset7;
+ if (num5 == num8) goto Lset7;
+ if (num6 == num8) goto Lset7;
+ if (num7 == num8) goto Lset7;
+ Lset8:
+ set num9,rand(1,9);
+ if (num1 == num9) goto Lset8;
+ if (num2 == num9) goto Lset8;
+ if (num3 == num9) goto Lset8;
+ if (num4 == num9) goto Lset8;
+ if (num5 == num9) goto Lset8;
+ if (num6 == num9) goto Lset8;
+ if (num7 == num9) goto Lset8;
+ if (num8 == num9) goto Lset8;
+
+L_DONE:
+ mes "There is a number behind the picture.";
+ mes "" + num1 + "3 " + num2 + "6 " + num3 + "9 " + num4 + "4 " + num5 + "8 " + num6 + "1 " + num7 + "7 " + num8 + "2 " + num9 + "5";
+ mes "Perhaps you should write this number down somewhere...";
+ close;
+}
+
+//--------------------------generator--------------------------
+
+lhz_cube.gat,224,192,0 script Generator 111,{
+ if (MISC_QUEST&512 || cubekey&256) goto L_DONE;
+ mes "The big machine is running, making a huge noise.";
+ mes "There are lots weird symbols and";
+ mes "a small key hole beside them.";
+ next;
+ input @key$;
+
+ if (cubekey&1 && (@key$ == "yellow key" || @key$ == "Yellow Key")) goto L_1;
+ mes "There's nothing to do here.";
+ close;
+
+L_1:
+ mes "You insert the 'yellow key' into the keyhole";
+ mes "and twist it.";
+ mes "The machine clicks, and becomes silent.";
+ next;
+ mes "When it was stopped, the lamp next to the bed";
+ mes "also turned off.";
+ set cubekey,cubekey|256;
+ close;
+
+L_DONE:
+ mes "The big machine sits quietly.";
+ close;
+}
+
+//--------------------------Lamp--------------------------
+
+lhz_cube.gat,248,205,0 script Lamp 111,{
+ if (MISC_QUEST&512 || cubekey&16) goto L_DONE;
+ if (cubekey&256) goto L_1;
+ mes "There is a bright lamp.";
+ mes "Seems like there is something inside";
+ mes "but it is too hot to touch.";
+ mes "It looks like you need to somehow turn the lamp off.";
+ close;
+
+L_1:
+ mes "There is something inside of the bulb.";
+ next;
+ menu "Leave it alone.",-,"Break the bulb.",L_2;
+ close;
+
+L_2:
+ mes "When you break the bulb, a";
+ mes "'black key' falls out.";
+ next;
+ mes "You acquired the '^FF0000black key^000000'.";
+ set cubekey,cubekey|16;
+ close;
+
+L_DONE:
+ mes "There nothing but a broken bulb.";
+ close;
+}
+
+//--------------------------Box--------------------------
+
+lhz_cube.gat,248,193,0 script Box#02 111,{
+ if (MISC_QUEST&512 || countitem(2657) || @gotLPkey) goto L_DONE;
+ mes "There is a box with three holes.";
+ next;
+ if (cubekey&65536 && cubekey&262144 && cubekey&16384) goto L_4;
+ menu "Ellipse hole",L_1,"Square hole",L_2,"Polygonal hole",L_3;
+
+L_1:
+ if (cubekey&65536) goto L1_2;
+ input @ellipse$;
+
+ if (cubekey&32768 && (@ellipse$ == "ellipse model" || @ellipse$ == "Ellipse Model")) goto L1_1;
+ mes "Nothing happened.";
+ close;
+
+L1_1:
+ mes "You inserted the 'ellipse model' into the ellipse-shaped hole.";
+ mes "The box makes a metallic click.";
+ set cubekey,cubekey|65536;
+ close;
+
+L1_2:
+ mes "You've already inserted the 'ellipse model'.";
+ close;
+
+L_2:
+ if (cubekey&262144) goto L2_2;
+ input @quadrangle$;
+
+ if (cubekey&131072 && (@quadrangle$ == "cube model" || @quadrangle$ == "Cube Model")) goto L2_1;
+ mes "Nothing happened.";
+ close;
+
+L2_1:
+ mes "You inserted the 'cube model' into the square-shaped hole.";
+ mes "The box makes a metallic click.";
+ set cubekey,cubekey|262144;
+ close;
+
+L2_2:
+ mes "You already inserted the 'square model'.";
+ close;
+
+L_3:
+ if (cubekey&16384) goto L3_2;
+ input @polygon$;
+
+ if (cubekey&8192 && (@polygon$ == "polygon model" || @polygon$ == "Polygon Model")) goto L3_1;
+ mes "Nothing happened.";
+ close;
+
+L3_1:
+ mes "You inserted the 'polygon model' into the polygonal hole.";
+ mes "The box makes a metallic click.";
+ set cubekey,cubekey|16384;
+ close;
+
+L3_2:
+ mes "You've already inserted the 'polygon model'.";
+ close;
+
+L_4:
+ mes "All holes are filled with keymodels.";
+ next;
+ menu "Leave it alone.",-,"Open the box.",L4_1;
+ close;
+
+L4_1:
+ mes "There is a small card inside of it.";
+ next;
+ mes "You acquired the 'Laboratory Permit'.";
+ set @gotLPkey,1;
+ getitem 2657,1;
+ close;
+
+L_DONE:
+ mes "There is an opened box.";
+ mes "There is nothing inside.";
+ close;
+}
+
+//--------------------------Test tube--------------------------
+
+lhz_cube.gat,224,197,0 script Test Tube 111,{
+ if (MISC_QUEST&512) goto L_DONE;
+ if (countitem(2657) > 0) goto L_3;
+ if (cubekey&32768) goto L_2;
+ mes "There is a weird test tube.";
+ mes "It seems like there is something inside.";
+ mes "There' a keyhole and a hole that fits a thin object.";
+ next;
+ input @key$;
+
+ if (cubekey&16 && (@key$ == "black key" || @key$ == "Black Key")) goto L_1;
+ mes "Nothing happened.";
+ close;
+
+L_1:
+ mes "You inserted the 'black key' and turned it.";
+ mes "The glass window at the front of the machine opened,";
+ mes "Revealing an ellipse model.";
+ next;
+ mes "You acquired the '^FF0000ellipse model^000000'.";
+ set cubekey,cubekey|32768;
+ close;
+
+L_2:
+ mes "This is where you got '^FF0000ellipse model^000000'.";
+ mes "There is a weird symbol on the bottom of the machine.";
+ mes "It looks like it could open as it has hinges on one side.";
+ close;
+
+L_3:
+ mes "There is a rectangular hole in the front of the machine.";
+ next;
+ input @answer$;
+
+ if (@answer$ == "Laboratory Permit" || @answer$ == "permit" || @answer$ == "laboratory permit" || @answer$ == "Permit") goto L_4;
+ mes "Nothing happened.";
+ close;
+
+L_4:
+ mes "You inserted the 'Laboratory Keycard' in the hole,";
+ mes "and the stair leading down appeared on the floor.";
+ next;
+ menu "Go down.",L4_1,"Do not go down.",-;
+ close;
+
+L4_1:
+ mes "It connected to a long staircase.";
+ set cubekey,0;
+ set num1,0; set num2,0; set num3,0; set num4,0; set num5,0;
+ set num6,0; set num7,0; set num8,0; set num9,0;
+ set piciburn,0;
+ set MISC_QUEST,MISC_QUEST|512;
+ close2;
+L_DONE:
+ warp "lhz_cube.gat",177,13;
+ end;
+}
+
+//============================================================
+// Lighthalzen Pickpocket Mini-Quest
+//============================================================
+
+lighthalzen.gat,240,216,4 script Man#Pickpocket1 870,2,2,{
+ end;
+OnTouch:
+ callfunc "F_LHZPick",33,1;
+ close;
+}
+
+lighthalzen.gat,220,169,4 script Man#Pickpocket2 870,2,2,{
+ end;
+OnTouch:
+ callfunc "F_LHZPick",33,2;
+ close;
+}
+
+lighthalzen.gat,164,127,4 script Man#Pickpocket3 870,2,2,{
+ end;
+OnTouch:
+ callfunc "F_LHZPick",20,3;
+ if(@caught!=1) close;
+ mes "[Strange Man]";
+ mes "Ayee! I'm trapped.";
+ mes "If you will forgive me,";
+ mes "I can give you something good.";
+ mes "["+strcharinfo(0)+"]";
+ mes "You're forgiven, now what is this";
+ mes "good thing you mentioned?";
+ next;
+ mes "[Strange Man]";
+ mes "The lower part of your body,";
+ mes "will produce a strong power";
+ mes "once you've taken the secret potion.";
+ mes "It's very useful";
+ mes "when you want to run quickly";
+ next;
+ mes "[Strange Man]";
+ mes "I will sell you them for a bargin";
+ mes "price of 15,000 zeny to a maximum";
+ mes "of three potions.";
+ mes "How many do you want?";
+ next;
+ input @number;
+ if(@number>3) set @number,3;
+ set @cost,15000*@number;
+ if(Zeny<@cost) goto L_Zeny;
+ //please check that you add the script to it.
+ set Zeny,zeny-@cost;
+ getitem 12016,@number; //Speed Potion
+ mes "[Strange Man]";
+ mes "Thanks for your money.";
+ if(rand(1,2)==1) goto L_Reset;
+ disablenpc "Man#Pickpocket3";
+ enablenpc "Man#Pickpocket2";
+ close;
+L_Reset:
+ disablenpc "Man#Pickpocket3";
+ enablenpc "Man#Pickpocket1";
+ close;
+L_Zeny:
+ mes "[Strange Man]";
+ mes "Too bad.";
+ mes "No zeny makes you a poor man.";
+ close;
+OnInit:
+ disablenpc "Man#Pickpocket2";
+ disablenpc "Man#Pickpocket3";
+}
+
+function script F_LHZPick {
+ if(Zeny<100) set Zeny,0;
+ if(Zeny>=100) set Zeny,zeny-100;
+ mes "Pickpocket";
+ next;
+ if(rand(0,100)<getarg(0)) goto L_Caught;
+ mes "Hehehehe....";
+ return;
+L_Caught:
+ mes "(You notice the man put his";
+ mes "hand in your pocket!)";
+ mes "["+strcharinfo(0)+"]";
+ mes "Eh!? What are you doing!";
+ mes "You are!! Stealing my money?!";
+ mes "[Strange Man]";
+ mes "Ah! I'm caught!";
+ mes "["+strcharinfo(0)+"]";
+ mes "You're a pickpocket?!?";
+ mes "[Strange Man]";
+ mes "Hehehehe....";
+ next;
+ set @rand,rand(1,4);
+ if(getarg(1)==1 && @rand<4) goto L_MoveB;
+ if(getarg(1)==2 && @rand<4) goto L_MoveA;
+ if(getarg(1)==1 && @rand==4) goto L_MoveC1;
+ if(getarg(1)==2 && @rand==4) goto L_MoveC2;
+ set @caught,1;
+ return;
+L_MoveA:
+ disablenpc "Man#Pickpocket2";
+ enablenpc "Man#Pickpocket1";
+ return;
+L_MoveB:
+ disablenpc "Man#Pickpocket1";
+ enablenpc "Man#Pickpocket2";
+ return;
+L_MoveC1:
+ disablenpc "Man#Pickpocket1";
+ enablenpc "Man#Pickpocket3";
+ return;
+L_MoveC2:
+ disablenpc "Man#Pickpocket2";
+ enablenpc "Man#Pickpocket3";
+ return;
+}
+
+//==============================================================
+// Friendship
+//==============================================================
+
+lhz_in02.gat,201,210,3 script Digotz 869,{
+
+ if(friendship > 9)goto s_Dead;
+ if(friendship == 9)goto s_Wounded;
+ if(friendship == 8)goto s_Cont7;
+ if(friendship == 6 && friendship2 || friendship == 7)goto s_Cont6;
+ if(friendship == 6)goto s_Cont5;
+ if(friendship == 4 || friendship == 5)goto s_Cont4;
+ if(friendship == 3)goto s_Cont3;
+ if(friendship == 2)goto s_Cont2;
+ mes "[Digotz]";
+ mes "Oh, an adventurer?";
+ mes "Welcome to Uptown";
+ mes "Lighthalzen. However,";
+ mes "I'm afraid this area won't";
+ mes "have much to offer you";
+ mes "in the way of excitement.";
+ next;
+ if(friendship == 1)goto s_Cont;
+ mes "[Digotz]";
+ mes "Feel free to take";
+ mes "a look around if you";
+ mes "so wish. I'm actually";
+ mes "glad to see somebody";
+ mes "aside from the stuck up";
+ mes "rich people who live here.";
+ close;
+
+s_Cont:
+ mes "[Digotz]";
+ mes "My name is Digotz,";
+ mes "just another citizen";
+ mes "of Upper Lighthalzen.";
+ mes "I hope that you enjoy";
+ mes "your stay in my hometown";
+ next;
+ menu "Do you know someone named Maku?",-;
+
+ mes "[Digotz]";
+ mes "Maku? Maku. Yes, he's my";
+ mes "childhood friend. Or he was,";
+ mes "anyway. Now he's just a jerk.";
+ mes "In an case, we can't hang";
+ mes "out, even if we wanted to,";
+ mes "for several reasons.";
+ next;
+ mes "[Digotz]";
+ mes "Hey, why am I even";
+ mes "talking about this? It's";
+ mes "not like I'm bothered by";
+ mes "the fact that me and Maku aren't";
+ mes "pals anymore. You know what?";
+ mes "Just forget everything I said.";
+ set friendship,2;
+ close;
+
+s_Cont2:
+ mes "[Digotz]";
+ mes "What are you still";
+ mes "doing hanging around";
+ mes "here? There's nothing";
+ mes "interesting in Uptown";
+ mes "for you to see, adventurer.";
+ next;
+ mes "[Digotz]";
+ mes "Gosh...!";
+ mes "Just hearing about";
+ mes "Maku makes me so feel";
+ mes "so upset for some reason!";
+ close;
+
+s_Cont3:
+ mes "[Digotz]";
+ mes "I know that the";
+ mes "opulence of Uptown";
+ mes "seems rather attractive,";
+ mes "but trust me. This place";
+ mes "is colorless. Now, have";
+ mes "you visited the poor district?";
+ next;
+ menu "Yes, I did already...",-;
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "Yes, I did already...";
+ mes "And I met someone";
+ mes "named Maku there.";
+ next;
+ mes "[Digotz]";
+ mes "Maku?! Oh, he must have";
+ mes "mentioned something about";
+ mes "me. But I don't care what he";
+ mes "says, unless it's an apology";
+ mes "for being a fully blown jerk.";
+ mes "Ever since we were kids...";
+ next;
+ mes "[Digotz]";
+ mes "Anyway, we used to be close,";
+ mes "but that guy was never a true";
+ mes "friend of mine! Like that one";
+ mes "time he cheated to beat me at";
+ mes "arm wrestling! Or when he never";
+ mes "thanked me for buying us lunch!";
+ next;
+ mes "[Digotz]";
+ mes "Sure, he might have helped";
+ mes "me a little in meeting my first";
+ mes "girlfriend, but I'll never ever";
+ mes "forgive him for fixing me up";
+ mes "on the worst blind dates a";
+ mes "man can possible experience!";
+ next;
+ mes "[Digotz]";
+ mes "Maku doesn't know a damn";
+ mes "about friendship! Even if I did";
+ mes "want to see him, there are these";
+ mes "people who don't want the rich";
+ mes "to ever meet with the poor.";
+ next;
+ mes "If Maku's fine, that's";
+ mes "good enough to hear for";
+ mes "me! There's no need for me";
+ mes "to go all the way over there";
+ mes "and check up on him! I only";
+ mes "have one regret though...";
+ next;
+ mes "[Digotz]";
+ mes "I only wish I had one";
+ mes "last chance to see Maku...";
+ mes "So that I could kick his sorry";
+ mes "ass myself! Yeah, that's right!";
+ mes "Arrogant bastard! But still,";
+ mes "I'm not able to do that...";
+ next;
+ mes "[Digotz]";
+ mes "The security guards here";
+ mes "will never allow the rich and";
+ mes "poor to meet, fearing that";
+ mes "the poor will disturb the peace";
+ mes "and order of the city. It's a dumb";
+ mes "rule made for dumb people.";
+ next;
+ mes "[Digotz]";
+ mes "Still, it's pretty scary that";
+ mes "someone can get punished";
+ mes "for violating such a stupid";
+ mes "taboo, actually. Anyway, if";
+ mes "you see Maku again, tell";
+ mes "him this for me, got it?";
+ next;
+ mes "[Digotz]";
+ mes "^FF0000Hopeless bastard!";
+ mes "You're still a stubborn jerk!";
+ mes "You owe me at least 3 lunches!";
+ mes "Not to mention an apology!";
+ mes "But who cares what you think?!";
+ mes "I'm so goddamn happy without you!";
+ set friendship,4;
+ close;
+
+s_Cont4:
+ mes "[Digotz]";
+ mes "Still checking out";
+ mes "Uptown Lighthalzen?";
+ mes "Not like I'd care, but if you";
+ mes "do happen to see Maku,";
+ mes "deliver this little message";
+ mes "for me, sentence by sentence.";
+ next;
+ mes "[Digotz]";
+ mes "^FF0000Hopeless bastard!";
+ mes "You're still a stubborn jerk!";
+ mes "You owe me at least 3 lunches!";
+ mes "Not to mention an apology!";
+ mes "But who cares what you think?!";
+ mes "I'm so goddamn happy without you!";
+ close;
+
+s_Cont5:
+ mes "[Digotz]";
+ mes "Oh, it's been a while.";
+ mes "What are you doing back";
+ mes "over here? And, um, did";
+ mes "you deliver that message";
+ mes "to Maku? Now when I think";
+ mes "about it, I was kind of--";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I delivered your message";
+ mes "word for word, and Maku";
+ mes "got angry, called you names";
+ mes "and has been threatening to";
+ mes "beat you up pretty badly.";
+ next;
+ mes "[Digotz]";
+ mes "That no-good, dirty";
+ mes "lying rotten scoundrel!";
+ mes "If it weren't for those";
+ mes "guards, I'd head over to";
+ mes "the ghetto and beat Maku";
+ mes "up myself! That stupid guy!";
+ next;
+ mes "[Digotz]";
+ mes "During times like this,";
+ mes "I really miss ^FF0000Benkaistein^000000";
+ mes "That guy would always have";
+ mes "an answer for this kind of";
+ mes "situation. Yeah, I think he's";
+ mes "in some far off town, studying.";
+ next;
+ mes "[Digotz]";
+ mes "Supposedly he's in that";
+ mes "place, whatever it's called,";
+ mes "since there's a ton of books";
+ mes "there that he can use. But";
+ mes "yeah, Benkaistein would";
+ mes "always be the mediator...";
+ next;
+ mes "[Digotz]";
+ mes "Even back then, when";
+ mes "me, him and Maku used to";
+ mes "hang out, Benkastein would";
+ mes "mediate if we got into some";
+ mes "argument. Still, he couldn't";
+ mes "do anything about Maku now...";
+ next;
+ mes "[Digotz]";
+ mes "I don't know why,";
+ mes "but I'm so angry!";
+ mes "Why am I stressing";
+ mes "out so much over this?!";
+ set friendship2,1;
+ close;
+
+s_Cont6:
+ mes "[Digotz]";
+ mes "Even if Benkaistein came";
+ mes "back from wherever he was";
+ mes "studying, I don't think he'd be";
+ mes "able to get Maku to apologize";
+ mes "to me. That guy is just way";
+ mes "too stubborn for his own good!";
+ if(friendship != 7)close;
+ next;
+ menu "Show Benkastein's Journal",s_Journal,"Don't show Benkastein's Journal.",-;
+
+ mes "[Digotz]";
+ mes "I don't understand";
+ mes "why I'm so angry!";
+ mes "I'm starting to act";
+ mes "more like Maku, though,";
+ mes "don't get me wrong, it's";
+ mes "not like I care about the guy.";
+ close;
+
+s_Journal:
+ mes "[Digotz]";
+ mes "Why am I so ticked off?";
+ mes "^3131FF*Sigh*^000000 You have something";
+ mes "to show me? Huh? Benkastein";
+ mes "wanted me to read this diary";
+ mes "of his? Sure, why not? I do";
+ mes "owe him a lot over the years...";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Today, me, Digotz and";
+ mes "Maku played this crazy flying";
+ mes "game. Basically, we make";
+ mes "these wings out of wood and";
+ mes "paper, jump of these hills";
+ mes "and try to fly. Dumb, I know.";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595Today it was my turn to";
+ mes "jump and flap my arms with";
+ mes "these fake, badly made wings.";
+ mes "It's not really a fun game when";
+ mes "I think about it. Boy, I hope";
+ mes "we don't do that again.";
+ next;
+ mes "^000000[Digotz]";
+ mes "Oh yeah, I remember that!";
+ mes "Maky wore the wings most";
+ mes "of the time, but I still hold";
+ mes "the record for staying in the";
+ mes "air the longest! Yeah, I was";
+ mes "a regular Kid Pegasus~";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Maku, Digotz and me went";
+ mes "outside of town. Of course,";
+ mes "we didn't tell anyone or else";
+ mes "we'd get in trouble. It was";
+ mes "a really exciting day. But";
+ mes "then, we ran into a monster!";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595I wanted to run away but Maku";
+ mes "and Digotz wanted to beat it so";
+ mes "that we could become heroes.";
+ mes "Of course, we got hurt pretty";
+ mes "bad and the monster got away.";
+ mes "Boy, mom was not happy...";
+ next;
+ mes "^000000[Digotz]";
+ mes "Huh. I don't remember";
+ mes "that so well. But I know that";
+ mes "Benkastein, me and Maku";
+ mes "weren't afraid of anything back";
+ mes "then. We must have been totally";
+ mes "nuts to fight a monster, though.";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Digotz's been sick for three";
+ mes "days now. It's just a normal";
+ mes "cold and Maku keeps saying";
+ mes "it's Digotz's fault he got sick.";
+ mes "But he's always asking me to";
+ mes "go visit him and see if he's okay.";
+ next;
+ mes "^000000[Digotz]";
+ mes "I think I remember being";
+ mes "pretty sick. Maku was worried?";
+ mes "I... I must have had a horrible";
+ mes "life threatening disease like,";
+ mes "um, Gonorrhitis. You know.";
+ mes "That might have been it.";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Mom and dad keep telling";
+ mes "me not to hang out with Maku";
+ mes "anymore. Their reason is really";
+ mes "dumb, and I don't care if he is";
+ mes "poor. He's one of the best guys";
+ mes "that I'll ever know.";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595Digotz's family is really";
+ mes "rich and they don't want him";
+ mes "to see Maku anymore either.";
+ mes "But Digotz doesn't care.";
+ mes "I know he likes Maku a lot.";
+ next;
+ mes "^000000[Digotz]";
+ mes "Well, we were a lot";
+ mes "younger and closer back";
+ mes "then, so... ^111111*Ahem!*^000000Why did";
+ mes "Benkastein even write that?!";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Today, the three of us";
+ mes "made an oath of brotherhood,";
+ mes "just like we read in the comic";
+ mes "book. We swore we'd always";
+ mes "be friends no matter what.";
+ mes "For always and for always.";
+ next;
+ mes "^000000[Digotz]";
+ mes "I... I was forced to make";
+ mes "that oath! And people do";
+ mes "change, you know! I mean,";
+ mes "we were basically just kids,";
+ mes "it's not like that oath really";
+ mes "means anything now, does it?";
+ next;
+ mes "[Digotz]";
+ mes "That does it. I'm gonna";
+ mes "go see that Maku. I don't";
+ mes "miss him or anything, but";
+ mes "I gotta get him to cancel";
+ mes "that oath. And maybe I'll";
+ mes "beat up him a little bit.";
+ set friendship,8;
+ close;
+
+s_Cont7:
+ mes "[Digotz]";
+ mes "Wh-whoa, I need to";
+ mes "get ready! That Maku's";
+ mes "gonna make fun of me if";
+ mes "I look too rich and pampered.";
+ mes "Damn! Where did I put all of";
+ mes "my fashionable street clothes?";
+ close;
+
+s_Wounded:
+ mes "^3131FFDigotz is seriously";
+ mes "injured from a wound";
+ mes "by a knife that is still";
+ mes "embedded in his belly.^000000";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Digotz...?";
+ mes "Oh no, let me";
+ mes "get you some help!";
+ next;
+ mes "[Digotz]";
+ mes "H-het... It's the";
+ mes "adventurer... Man,";
+ mes "that Maku. He always";
+ mes "did bring me bad luck...";
+ mes "It's too late for me and";
+ mes "I don't have much time...";
+ next;
+ mes "[Digotz]";
+ mes "Those guards I told you";
+ mes "about... The ones who don't";
+ mes "want the poor and the rich to";
+ mes "mingle? I... Guess they found";
+ mes "out I was gonna meet my old";
+ mes "pal. I just wanted to see him...";
+ next;
+ mes "[Digotz]";
+ mes "This guy... In a black";
+ mes "suit... He just... He just";
+ mes "stabbed me! I... God. It's";
+ mes "been so long since I've talked";
+ mes "to him. We'll hang out and have";
+ mes "fun, just like the good old days.";
+ next;
+ mes "[Digotz]";
+ mes "I missed my buddies, but now...";
+ mes "Now I can hear them calling me.";
+ mes "Now we can all be together just";
+ mes "like we all promised. Yeah...";
+ mes "I was wrong. Life's too short";
+ mes "to be angry with your frie--";
+ next;
+ mes "[Digotz]";
+ mes "..............";
+ next;
+ mes "[Digotz]";
+ mes "..............";
+ mes ".......................";
+ next;
+ mes "[Digotz]";
+ mes "..............";
+ mes ".......................";
+ mes "................................";
+ next;
+ mes "^3131FFDigotz stopped breating.";
+ mes "You remove the Knife from";
+ mes "his lifeless body as a final";
+ mes "courtesy to a man who";
+ mes "dearly loved his friends.";
+ next;
+ set friendship,10;
+ getitem 1201,1;
+ close;
+
+s_Dead:
+ mes "^3131FFDigotz has passed";
+ mes "away, but the look on";
+ mes "his face seems very";
+ mes "peaceful and content.";
+ close;
+
+}
+
+lighthalzen.gat,337,232,3 script Maku 870,{
+
+ if(friendship > 1)goto Switches;
+ mes "[Maku]";
+ mes "Hey, you're on of";
+ mes "those adventurers, eh?";
+ mes "Welcome to the ghetto.";
+ mes "Nothing too adventurous";
+ mes "here, but hey, you can";
+ mes "explore all you want.";
+ next;
+ mes "[Maku]";
+ mes "I don't know if you know";
+ mes "but actually, the people who";
+ mes "live here ain't allowed to";
+ mes "explore this whole city. It's";
+ mes "kind of taboo to talk about,";
+ mes "but what do I care, right?";
+ next;
+ mes "[Maku]";
+ mes "Yeah, basically the rich";
+ mes "people here are too afraid";
+ mes "of the poor people comin' to";
+ mes "see them, so the security in";
+ mes "this city is pretty tight! Those";
+ mes "upper class guys are trash...";
+ next;
+ mes "[Maku]";
+ mes "I didn't use to think";
+ mes "this way. I actually used";
+ mes "to have a pretty rich friend";
+ mes "till I found out he's not all";
+ mes "I thought he was. That";
+ mes "moron! Why's he like that?!";
+ next;
+ mes "[Maku]";
+ mes "Eh, forget about it.";
+ mes "Why am I even talking";
+ mes "about my personal life";
+ mes "to someone I just met";
+ mes "anyway? Sure, we all";
+ mes "do it, but still...";
+ next;
+ mes "[Maku]";
+ mes "Well, when you get";
+ mes "bored of the ghetto,";
+ mes "you really oughta check";
+ mes "out the rich section of town.";
+ mes "I'm bitter, but I'll also admit";
+ mes "it's way nicer than this place.";
+ if(BaseLevel > 29) set friendship,1;
+ close;
+
+
+Switches:
+ switch(friendship)
+ {
+
+ case 2:
+ mes "[Maku]";
+ mes "Hey, what are you";
+ mes "doing back over here?";
+ mes "I thought I recommended";
+ mes "going over to check out";
+ mes "Uptown Lighthalzen. This";
+ mes "place is pretty run-down...";
+ next;
+ menu "I actually met Digotz and...",-;
+
+ mes "[Maku]";
+ mes "You what...?!";
+ mes "You saw my old pal,";
+ mes "Digotz?! Er, I mean,";
+ mes "Mister Alexander Digotz,";
+ mes "who used to be my buddy,";
+ mes "but obviously not anymore.";
+ next;
+ mes "[Maku]";
+ mes "Sure, we were real close";
+ mes "at one time, but that was";
+ mes "too long ago. It's been a";
+ mes "long time since we hung";
+ mes "out and he probable hates";
+ mes "my penniless guts and...";
+ next;
+ mes "[Maku]";
+ mes "Crud, just listen to";
+ mes "me, I sound like a wuss.";
+ mes "I don't miss Digotz! In fact,";
+ mes "I hate the guy, one hundred";
+ mes "percent! The next time I see";
+ mes "him, I'll beat him to a pulp!";
+ set friendship,3;
+ close;
+ break;
+
+ case 3:
+ mes "[Maku]";
+ mes "Man, I need to blow off some";
+ mes "steam! Sure, me and Digotz";
+ mes "were buds before and maybe";
+ mes "we might seem like friends now,";
+ mes "but not anymore, though we used";
+ mes "to be closer than this. Argh!";
+ next;
+ mes "[Maku]";
+ mes "Don't get me wrong, I don't";
+ mes "miss the guy or anything like";
+ mes "that and I don't feel sorry about";
+ mes "what happened. But if he ever";
+ mes "came to apologize to me, I'd";
+ mes "probably accept, you know.";
+ next;
+ mes "[Maku]";
+ mes "Well, after thinking";
+ mes "about it, of course.";
+ mes "I mean, I'm not the one";
+ mes "holding a grudge. It's all";
+ mes "that guy's fault! Sheeeesh!";
+ close;
+ break;
+
+ case 4:
+ mes "[Maku]";
+ mes "What the hell are you";
+ mes "still doing around here?";
+ mes "You must have better things";
+ mes "to do than talk to a ruffian";
+ mes "like me or that snobby and";
+ mes "totally prickish Digotz.";
+ next;
+ menu "Speaking of which...",-;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Speaking of which...";
+ mes "I spoke to Digotz again.";
+ mes "He told me to give you a";
+ mes "message, but I'm not sure th--";
+ next;
+ mes "[Maku]";
+ mes "That no-good bastard";
+ mes "has a message for me?!";
+ mes "Oh, I'm soooo honored~";
+ mes "Tell me what that fink";
+ mes "has to say, line by line!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "Hopeless bastard!")goto failstr;
+ mes "[Maku]";
+ mes "\"Hopeless Bastard?!\"";
+ mes "Well, at least he had";
+ mes "the stomach to say that.";
+ mes "Through somebody else";
+ mes "anyway! What else'd he say?!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "You're still a stubborn jerk!")goto failstr;
+ mes "[Maku]";
+ mes "\"Stubborn Jerk?!\"";
+ mes "Takes no one to know one,";
+ mes "bastard! Why I oughta--";
+ mes "Grrr! What'd he say next?!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "You owe me at least 3 lunches!")goto failstr;
+ mes "[Maku]";
+ mes "Three lunches?!";
+ mes "I treated that guy to";
+ mes "lunch like, fifteen times!";
+ mes "I tell you, the guy does not";
+ mes "know the meaning of friendship!";
+ mes "What else did that moron say?!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "Not to mention an apology!")goto failstr;
+ mes "[Maku]";
+ mes "Me, apologize?!";
+ mes "He should be on his hands";
+ mes "and knees begging for my";
+ mes "frickin' forgiveness! That...";
+ mes "That selfish no-good stupid...";
+ mes "W-what else did he tell you?!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "But who cares what you think?!")goto failstr;
+ mes "[Maku]";
+ mes "Who cares what I think?!";
+ mes "GRRRAAH~!! Who cares";
+ mes "what he thinks!! ^111111*Pant Pant*^000000";
+ mes "I'm gonna murderlize that";
+ mes "dumb creep! He can't possibly";
+ mes "make me angrier than I am now!";
+ next;
+ input @digotzstr$;
+ if(@digotzstr$ != "I'm so goddamn happy without you!")goto failstr;
+ mes "[Maku]";
+ mes "That's it.";
+ mes "It's decided. The";
+ mes "next time I see Digotz,";
+ mes "I'm gonna plaster his";
+ mes "face all over the floor.";
+ set friendship,5;
+ close;
+ break;
+
+ case 5:
+ mes "[Maku]";
+ mes "RrrrRrrrr.....";
+ mes "RrrrrRRRrrRR.....";
+ mes "GGGGGRRRRR...";
+ next;
+ mes "^3131FFUh oh...";
+ mes "It looks like Maku";
+ mes "is starting to rage";
+ mes "just a bit too much.^000000";
+ next;
+ mes "[Maku]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Maku]";
+ mes "Gggrrrr...";
+ next;
+ mes "[Maku]";
+ mes "GRAAAAAAAAH~!";
+ mes "Who the hell does he";
+ mes "think he is, telling me";
+ mes "all sorts of crap!? Digotz,";
+ mes "you're not getting away";
+ mes "with this! Gonna wreck you!!";
+ next;
+ set Hp,MaxHp/2;
+ mes "^3131FFMaku's seething quickly";
+ mes "explodes into pure, violent";
+ mes "rage. You manage to calm";
+ mes "him down after a while, but";
+ mes "barely keep yourself from";
+ mes "getting killed in this outburst^000000";
+ next;
+ mes "[Maku]";
+ mes "^111111*Pant pant* *Whew~*^000000";
+ mes "D-don't worry, I've got";
+ mes "a grip on myself now.";
+ mes "Thanks for not letting me";
+ mes "get too crazy. Times like";
+ mes "this, I really miss ^FF0000Benkaistein^000000.";
+ next;
+ mes "[Maku]";
+ mes "Benkastein would always";
+ mes "make sure that I'd stay out";
+ mes "of fights. I really miss that";
+ mes "guy. Still, he ain't around...";
+ next;
+ mes "[Maku]";
+ mes "Damn those guards!";
+ mes "If they weren't there,";
+ mes "I could just go over and";
+ mes "kick Digotz's ass! I swear,";
+ mes "if it weren't for them...!";
+ set friendship,6;
+ close;
+ break;
+
+ case 6:
+ mes "[Maku]";
+ mes "Arrrrgh! Whenever I hear";
+ mes "about that Digotz, I get so";
+ mes "peeved! Is that guy giving";
+ mes "me the brushoff just because";
+ mes "I'm not a rich guy like he is?!";
+ next;
+ mes "[Maku]";
+ mes "I can't...";
+ mes "I can't even beat him up";
+ mes "all properly because of";
+ mes "all those freakin' guards!";
+ mes "Arrrrrrrgh! Man, where's";
+ mes "Benkastein when I need him?";
+ close;
+ break;
+
+ case 7:
+ mes "[Maku]";
+ mes "Arrrrgh! Whenever I hear";
+ mes "about that Digotz, I get so";
+ mes "peeved! Is that guy giving";
+ mes "me the brushoff just because";
+ mes "I'm not a rich guy like he is?!";
+ next;
+ mes "[Maku]";
+ mes "I can't...";
+ mes "I can't even beat him up";
+ mes "all properly because of";
+ mes "all those freakin' guards!";
+ mes "Arrrrrrrgh! Man, where's";
+ mes "Benkastein when I need him?";
+ close;
+ break;
+
+ case 8:
+ mes "[Maku]";
+ mes "Hey, what is that? You want";
+ mes "me to read this journal?";
+ mes "Er, okay, but I'm none too";
+ mes "comfortable going through";
+ mes "somebody's diary. It's just";
+ mes "kinda... creepy, you know?";
+ next;
+ mes "[Maku]";
+ mes "Hey, this think is";
+ mes "Benkastein's. I haven't";
+ mes "seen that guy in a long while.";
+ mes "Ah, so he gave it to you for me";
+ mes "to read? Alright, I owe him a";
+ mes "favor or two, so I oughta...";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Today, me, Digotz and";
+ mes "Maku played this crazy flying";
+ mes "game. Basically, we make";
+ mes "these wings out of wood and";
+ mes "paper, jump of these hills";
+ mes "and try to fly. Dumb, I know.";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595Today it was my turn to";
+ mes "jump and flap my arms with";
+ mes "these fake, badly made wings.";
+ mes "It's not really a fun game when";
+ mes "I think about it. Boy, I hope";
+ mes "we don't do that again.";
+ next;
+ mes "^000000[Maku]";
+ mes "What is he talking about?!";
+ mes "That game was real fun!";
+ mes "Yeah, I usually wore the";
+ mes "wings and Digotz always";
+ mes "wanted to wear them too.";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Maku, Digotz and me went";
+ mes "outside of town. Of course,";
+ mes "we didn't tell anyone or else";
+ mes "we'd get in trouble. It was";
+ mes "a really exciting day. But";
+ mes "then, we ran into a monster!";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595I wanted to run away but Maku";
+ mes "and Digotz wanted to beat it so";
+ mes "that we could become heroes.";
+ mes "Of course, we got hurt pretty";
+ mes "bad and the monster got away.";
+ mes "Boy, mom was not happy...";
+ next;
+ mes "^000000[Maku]";
+ mes "That's right! Back then,";
+ mes "the three of us weren't";
+ mes "afraid of anything! Of course,";
+ mes "Digotz got beat up the most.";
+ mes "But I gotta say, he was also";
+ mes "the most fearless of us.";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Digotz's been sick for three";
+ mes "days now. It's just a normal";
+ mes "cold and Maku keeps saying";
+ mes "it's Digotz's fault he got sick.";
+ mes "But he's always asking me to";
+ mes "go visit him and see if he's okay.";
+ next;
+ mes "^000000[Maku]";
+ mes "Wh-what?! No, I wasn't";
+ mes "worried at all! That must";
+ mes "have been the time Digotz";
+ mes "caught Clymonia. You know,";
+ mes "that, uh, horrible disease. No";
+ mes "one should have that one!";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Mom and dad keep telling";
+ mes "me not to hang out with Maku";
+ mes "anymore. Their reason is really";
+ mes "dumb, and I don't care if he is";
+ mes "poor. He's one of the best guys";
+ mes "that I'll ever know.";
+ next;
+ mes "^000000[Benkastein's Journal]";
+ mes "^AD9595Digotz's family is really";
+ mes "rich and they don't want him";
+ mes "to see Maku anymore either.";
+ mes "But Digotz doesn't care.";
+ mes "I know he likes Maku a lot.";
+ next;
+ mes "^000000[Maku]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Benkastein's Journal]";
+ mes "^AD9595Today, the three of us";
+ mes "made an oath of brotherhood,";
+ mes "just like we read in the comic";
+ mes "book. We swore we'd always";
+ mes "be friends no matter what.";
+ mes "For always and for always.";
+ next;
+ mes "^000000[Maku]";
+ mes "Well, that's true,";
+ mes "I guess, but people";
+ mes "change! Besides, we got";
+ mes "that idea from a comic book!";
+ mes "Well, if he apologizes first,";
+ mes "I guess I better forgive him.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Good...";
+ mes "Because Digotz said";
+ mes "that he'll be coming";
+ mes "by in a few days.";
+ next;
+ mes "[Maku]";
+ mes "What?! He's really coming";
+ mes "here? What for? It's too late";
+ mes "to patch things up! Still, I'd be";
+ mes "a real prick if I didn't see him";
+ mes "Alright, fine! I'll teach that guy";
+ mes "a lesson once he's here!";
+ next;
+ mes "[Maku]";
+ mes "And, um, gimme that";
+ mes "journal! I'm gonna read";
+ mes "more of it so I can make";
+ mes "fun of Digotz. Bwahahaha!";
+ mes "But yeah, um, thanks. Not";
+ mes "that I'm grateful or anything.";
+ next;
+ mes "[Maku]";
+ mes "So, uh, I guess";
+ mes "I'll see you later.";
+ mes "Um, now I gotta get";
+ mes "ready for something.";
+ mes "^111111(But not to see Digotz!)";
+ if(countitem(7351))delitem 7351,1;
+ set friendship,9;
+ close;
+ break;
+
+ case 9:
+ mes "[Maku]";
+ mes "Why is Digotz";
+ mes "so late? This isn't";
+ mes "like him at all. Maybe";
+ mes "something's wrong?";
+ close;
+ break;
+
+ case 10:
+ mes "[Maku]";
+ mes "Why is Digotz";
+ mes "so late? This isn't";
+ mes "like him at all. Maybe";
+ mes "something's wrong?";
+ next;
+ mes "[Maku]";
+ mes "Eh, he might have";
+ mes "some kinda reason for";
+ mes "being late, but if he don't,";
+ mes "i've been saving a whole";
+ mes "six pack of kickass to open,";
+ mes "just for him. Heh heh heh~";
+ close;
+ break;
+
+ case 11:
+ mes "[Maku]";
+ mes "Why is Digotz";
+ mes "so late? This isn't";
+ mes "like him at all. Maybe";
+ mes "something's wrong?";
+ next;
+ mes "[Maku]";
+ mes "Eh, he might have";
+ mes "some kinda reason for";
+ mes "being late, but if he don't,";
+ mes "i've been saving a whole";
+ mes "six pack of kickass to open,";
+ mes "just for him. Heh heh heh~";
+ close;
+ break;
+ }
+
+failstr:
+ mes "[Maku]";
+ mes "Wha...? I dunno if Digotz";
+ mes "would say something like";
+ mes "that. You sure you heard";
+ mes "him carefully enough? It's";
+ mes "been a while, but I know";
+ mes "how Digotz talks, man.";
+ close;
+}
+
+yuno_in04.gat,107,14,4 script Student 754,{
+
+ mes "[Joey Choryee]";
+ mes "This is a study area where";
+ mes "you're not supposed to speak,";
+ mes "walk or even breathe loudly.";
+ mes "Still, students like Benkastein";
+ mes "can tune out the whole world";
+ mes "when they study hard enough...";
+ if(friendship != 6)close;
+ next;
+ mes "[Joey Choryee]";
+ mes "Benkastein...?";
+ mes "He's in the north part.";
+ mes "of this room. He's a real";
+ mes "nice guy, but a little anal.";
+ mes "Well, he's too organized";
+ mes "and he labels everything!";
+ close;
+
+}
+
+yuno_in04.gat,96,106,4 script Passionate Student 754,{
+
+ if(friendship == 10)goto s_Ask;
+ if(friendship3 == 2 || friendship3 == 3)goto s_Cont2;
+ if(friendship3 == 1)goto s_Cont;
+ mes "[Passionate Student]";
+ mes "Let's see, now.";
+ mes "Wind Magic, Black Magic,";
+ mes "Porings, ah, there it is";
+ mes "Monster race properties.";
+ mes "Hopefully this contains";
+ mes "the information I need...";
+ next;
+ if(friendship != 6)goto s_Dialog;
+ mes "Upon briefly glancing at";
+ mes "this student's belongings,";
+ mes "you notice that the name";
+ mes "\"Benkastein\" is printed";
+ mes "on them. This is the friend";
+ mes "mentioned by Maku and Digotz!";
+ next;
+ menu "Excuse me...",-;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Excuse me...";
+ mes "Benkastein?";
+ next;
+ mes "[Passionate Student]";
+ mes "...The world of humans";
+ mes "and the world of demons,";
+ mes "yes, yes... No, what I'm";
+ mes "looking for is a reference";
+ mes "to the heavens of Asgard.";
+ mes "Hmm, this here might help...";
+ next;
+ menu "Hey...",-;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Hey...";
+ mes "Over here.";
+ mes "Benkastein!";
+ next;
+ mes "[Passionate Student]";
+ mes "...Oh, now that's a very";
+ mes "interesting observation.";
+ mes "If I can incorporate that";
+ mes "into my thesis without too";
+ mes "much trouble, my standpoint";
+ mes "would look much more solid...";
+ next;
+ menu "HEY YOU...!",-;
+ mes "[" + strcharinfo(0) + "]";
+ mes "HEY YOU...!";
+ mes "BENKASTEIN~!";
+ next;
+ mes "[Passionate Student]";
+ mes "Oh, good heavens!";
+ mes "C-can't you keep";
+ mes "your voice down?";
+ mes "I-I'm trying to study!";
+ mes "No, wait. Have you been";
+ mes "calling me all this time?";
+ set friendship3,1;
+ close;
+
+s_Cont:
+ mes "[Passionate Student]";
+ mes "Oh, you startled me!";
+ mes "Still, I'm aware that it's";
+ mes "hard to get my attention";
+ mes "once I immerse myself";
+ mes "in a book. So, how can";
+ mes "I help you, adventurer?";
+ next;
+ menu "Tell him about Maku and Digotz.",-;
+ mes "[Benkastein]";
+ mes "Oh, how are my friends";
+ mes "doing? Oh, what? They're";
+ mes "having a huge fight just";
+ mes "because one's rich and";
+ mes "the other one's poor?";
+ mes "That's pretty childish!";
+ next;
+ mes "[Benkastein]";
+ mes "But then again, that's just";
+ mes "like them. ^111111*Sigh*^000000 I really want";
+ mes "to go back home and get those";
+ mes "two to make up, but I also need";
+ mes "to finish this thesis. Let's see...";
+ mes "What can I possibly do from here?";
+ next;
+ mes "[Benkastein]";
+ mes "Oh, I know what I can do!";
+ mes "Wait, but where did I put it?";
+ mes "Oh, how cold I lose something";
+ mes "so important? Wait! Would you";
+ mes "please wait a second while";
+ mes "I look for something?";
+ set friendship3,2;
+ close;
+
+s_Cont2:
+ mes "[Benkastein]";
+ mes "Aw nuts, this is";
+ mes "taking much longer";
+ mes "than I had expected.";
+ mes "Now where did I put";
+ mes "that thing? Hmmmm...";
+ if(friendship3 == 3)goto s_Cont3;
+ next;
+ mes "^3131FFPerhaps it would";
+ mes "be best if you help";
+ mes "Benkastein to look for";
+ mes "what he's searching for.";
+ close;
+
+s_Cont3:
+ next;
+ mes "[Benkastein]";
+ mes "Oh, is that it?";
+ mes "Did you find my";
+ mes "journal? Quick, let";
+ mes "me check. Yes, yes...";
+ mes "This is it! Thank you";
+ mes "for finding this for me!";
+ next;
+ mes "[Benkastein]";
+ mes "Would you mind doing";
+ mes "a favor for me? It'd be";
+ mes "better if I talk to them";
+ mes "myself, but I'm too busy";
+ mes "working on this thesis...";
+ next;
+ mes "[Benkastein]";
+ mes "Would you please give this";
+ mes "journal to Digotz and Maku?";
+ mes "I wrote it in when we were";
+ mes "really young, so it should";
+ mes "remind them of all the good";
+ mes "times we used to share.";
+ next;
+ mes "[Benkastein]";
+ mes "Anyway, this should at";
+ mes "least help them realize";
+ mes "how stupid they've been";
+ mes "acting. Thanks in advance,";
+ mes "and please take care of";
+ mes "Maku and Digotz for me.";
+ if(friendship == 6)set friendship,7;
+ close;
+
+s_Dialog:
+ mes "^3131FFThis student seems to";
+ mes "be dilligently conducting";
+ mes "intensive research on some";
+ mes "academic subject. For now,";
+ mes "it would be best to leave him";
+ mes "alone so that he can study.";
+ close;
+
+s_Ask:
+ mes "[Benkastein]";
+ mes "Were you able to bring";
+ mes "my journal to Digotz and";
+ mes "Maku? I'm pretty sure it'd";
+ mes "remind them of all the good";
+ mes "times we had. I know they";
+ mes "sure can be stubborn...";
+ next;
+ mes "[Benkastein]";
+ mes "Anyway, I really";
+ mes "appreciate all your";
+ mes "help. When I go back";
+ mes "home, I look forward to";
+ mes "seeing the two of them again.";
+ next;
+ mes "[Benkastein]";
+ mes "Until then, I need to research,";
+ mes "finish my thesis and accomplish";
+ mes "my academic goals. Oh, please";
+ mes "take this pass which will let you";
+ mes "go back and forth between the";
+ mes "rich and poor areas as my thanks.";
+ next;
+ mes "[Benkastein]";
+ mes "Anyway, I wish you";
+ mes "safety in your travels,";
+ mes "adventurer. When the three";
+ mes "of us get together, I'll be";
+ mes "sure to let you know~";
+ if(BaseLevel < 41)set BaseExp,BaseExp+49500;
+ else if(BaseLevel > 40 && BaseLevel < 61)set BaseExp,BaseExp+99000;
+ else if(BaseLevel > 60 && BaseLevel < 71)set BaseExp,BaseExp+198000;
+ else if(BaseLevel > 70 && BaseLevel < 81)set BaseExp,BaseExp+396000;
+ else if(BaseLevel > 80 && BaseLevel < 91)set BaseExp,BaseExp+594000;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+792000;
+ getitem 7350,1;
+ set friendship,11;
+ set friendship3,0;
+ close;
+
+}
+
+yuno_in04.gat,168,117,1 script Book 111,{
+
+ if(friendship3 >= 3)goto Book2;
+ if(friendship3 == 2)goto Book;
+ mes "^3131FFThis book is labeled,";
+ mes "\"Benkastein's Journal";
+ mes "Vol. 6.\".";
+ close;
+Book:
+ mes "^3131FFThis book is labeled,";
+ mes "\"Benkastein's Journal";
+ mes "Vol. 6.\". This is probably";
+ mes "what Benkastein was trying";
+ mes "to find, so it might be best to";
+ mes "bring this and show it to him";
+ set friendship3,3;
+ getitem 7351,1;
+ close;
+Book2:
+ mes "^3131FFThis is where you found";
+ mes "the book that Benkastein";
+ mes "was looking for.";
+ close;
+
+}
+
+yuno_in04.gat,169,109,1 script Ambitious Hollgrehenn 111,{
+
+ mes "*Hollgrehenn: The Ambition*";
+ mes "By Aragham Caul*";
+ mes "";
+ mes "";
+ mes "";
+ mes "";
+ mes "Publisher:";
+ mes "Muha Books, Co.";
+ next;
+ mes "...";
+ mes "He would stop at nothing";
+ mes "to have the greatest weapon";
+ mes "in the world in his possession.";
+ mes "He became a smith so that he";
+ mes "could discern which weapons";
+ mes "were the most powerful...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "That's strange...";
+ mes "The next page";
+ mes "has been torn out.";
+ close;
+
+}
+
+yuno_in04.gat,171,117,1 script List of Books 111,{
+
+ mes "^3131FFYou find a series";
+ mes "of paperback books";
+ mes "with titles, printed";
+ mes "on the binding in an";
+ mes "elegantly decorative";
+ mes "cursive style font.";
+ mes "The titles include...";
+ next;
+ mes "*Volcanic Passion*";
+ mes "*Midnight Crescendo*";
+ mes "*A Paris Affair*";
+ mes "*Fever Pitch*";
+ mes "*The Cowyboy Next Door*";
+ mes "*Platonic Romance*";
+ mes "*How Lara Got Her Groove Back*";
+ next;
+ mes "^000000[" + strcharinfo(0) + "]";
+ mes "What the...?!";
+ mes "This place even has";
+ mes "a romance novel section?";
+ close;
+
} \ No newline at end of file
diff --git a/npc/quests/quests_louyang.txt b/npc/quests/quests_louyang.txt
index 09eb261a0..e24a48650 100644
--- a/npc/quests/quests_louyang.txt
+++ b/npc/quests/quests_louyang.txt
@@ -1,3159 +1,3159 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Louyang
-//===== By: ==================================================
-//= Evera and The eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Soup Quest, Tool Master Quest, Doctor Quest,
-//= Poison King Quest
-//===== Additional Comments: =================================
-//= 1.0 Initial Release [Evera]
-//= 1.1 Fixed double levelup bug [Lupus]
-//============================================================
-
-//============================================================
-//======================================================= Soup
-//====================================================== Quest
-lou_fild01.gat,195,177,4 script Jiu Lian Bu#01 819,{
- if(QL_SOUP2) goto L_DONE;
- if(QL_SOUPQUEST)goto L_WHERE;
- if(QL_GOTFAKESOUP) goto L_FAKE;
- if(QL_GOTDRAGONSOUP) goto L_SOUP;
- if(QL_ACCEPTSOUP) goto L_GORESTA;
- mes "[Jiu Lian Bu]";
- mes "Hey~";
- mes "What's up?";
- next;
- mes "[Jiu Lian Bu]";
- mes "I don't like hanging around too many people, so I came here. Listening to this strean really puts my mind to ease.";
- next;
- mes "[Jiu Lian Bu]";
- mes "No offense, but I'm upset";
- mes "at the sheer number of tourists coming over to Louyang";
- mes "Sure, I can understand that our town is attractive and has beautiful sights.";
- next;
- mes "[Jiu Lian Bu]";
- mes "But I just can't stand crowds of people. People gather like sheep to any place they hear is popular, and that really bugs me!";
- next;
- mes "[Jiu Lian Bu]";
- mes "Speaking of which, there's even";
- mes "a place in Louyang that's just like";
- mes "that. Man, I hate that restaurant!";
- next;
- menu "What restaurant?",-,"Ignore him.",M_IGNORE;
-
- mes "[Jiu Lian Bu]";
- mes "In the east side of Louyang, there's a restaurant built on a pond. It's been around for a long time, selling food for ridiculous prices!";
- next;
- mes "[Jiu Lian Bu]";
- mes "Oh sure, the food and flavors";
- mes "there have a long history, but I";
- mes "don't think that justifies how they";
- mes "charge their patrons!";
- next;
- mes "[Jiu Lian Bu]";
- mes "As a young man";
- mes "who loves his town,";
- mes "I can't let them manipulate my";
- mes "people like that!";
- next;
- mes "[Jiu Lian Bu]";
- mes "But everyone here already knows who I am, so I can't do anything! I've already had one too many, shall we say, 'incidents' with the people living here already.";
- next;
- mes "[Jiu Lian Bu]";
- mes "I've been caught for tagging walls, shoplifting, camming, stealing a few girlfriends... So yeah, I'm not exactly known as a sterling citizen.";
- next;
- mes "[Jiu Lian Bu]";
- mes "Say, wait a minute. The local";
- mes "people around here aren't too";
- mes "familiar with you. Hmmm...";
- next;
- mes "[Jiu Lian Bu]";
- mes "Would you sneak into that restaurant and steal the ^3131FFDragon Soup Broth^000000 for me?";
- next;
- mes "[Jiu Lian Bu]";
- mes "The Dragon Soup Broth is the";
- mes "backbone for the restaurant";
- mes "owner's secret recipe.";
- next;
- mes "[Jiu Lian Bu]";
- mes "But they've been cheating their";
- mes "customers by watering that broth";
- mes "down and selling it for a";
- mes "ridiculous price! Serves them right";
- mes "if their secrets were stolen!";
- next;
- mes "[Jiu Lian Bu]";
- mes "If you can steal some of the broth,";
- mes "I'll pay you back. Whaddaya say?";
- next;
- menu "I'll do it!",-,"No, stealing is wrong.",M_NO;
-
- mes "[Jiu Lian Bu]";
- mes "Great!";
- mes "I knew you'd";
- mes "see things my way!";
- next;
- mes "[Jiu Lian Bu]";
- mes "Okay, the restaurant is at the East side of Louyang. But you got to be careful. The workers there watch over that broth like freakin' hawks!";
- set QL_ACCEPTSOUP,1;
- close;
-
-M_NO:
- mes "[Jiu Lian Bu]";
- mes "Stealing?";
- mes "You may have";
- mes "a point there.";
- next;
- mes "[Jiu Lian Bu]";
- mes "But then, that restaurant has been doing that to their customers for years! So, technically. we'd just be stealing back.";
- close;
-
-M_IGNORE:
- mes "[Jiu Lian Bu]";
- mes "That join isn't even that great. I mean, it's so obvious that they rip off their customers! Dragon Soup?! More like... Dragon Crap Soup!";
- close;
-
-L_GORESTA:
- mes "[Jiu Lian Bu]";
- mes "Huh...?";
- mes "Whoa, I thought you were on you way to the restaurant. You better get a move on.";
- next;
- mes "[Jiu Lian Bu]";
- mes "Alright then, pal. Make sure the";
- mes "guys who work there don't catch you. Good luck~";
- close;
-
-L_FAKE:
- mes "[Jiu Lian Bu]";
- mes "Wow! You made it!";
- mes "Let me see...";
- next;
- mes "^445BA7Jiu Lian Bu takes a hearty sip of the broth you've managed to steal for him.";
- next;
- mes "[Jiu Lian Bu]";
- mes "Ohhhh man....";
- mes "This is so not Dragon Soup Broth. Sorry, but would you go and try to get it again?";
- set QL_GOTFAKESOUP,0;
- close;
-
-L_SOUP:
- mes "[Jiu Lian Bu]";
- mes "Wow! You made it!";
- mes "Let me see...";
- next;
- mes "^445BA7Jiu Lian Bu takes a hearty sip of the broth you've managed to steal for him.";
- next;
- mes "Ooooh. Ooh yeah.";
- mes "This is the stuff.";
- mes "Muhahahahahaha~!";
- mes "This'll put the chef";
- mes "in agony for a while!";
- next;
- set QL_GOTDRAGONSOUP,0;
- set QL_ACCEPTSOUP,0;
- set QL_SOUPQUEST,1;
- mes "[Jiu Lian Bu]";
- mes "Good job, chum! Heh heh heh, because you risked your neck for me, I'm gonna show you an awesome place! Just follow me~";
- close2;
- warp "lou_fild01.gat",180,171;
- end;
-
-L_DONE:
- mes "[Jiu Lian Bu]";
- mes "Hey~";
- mes "So how ya been, ya smooth criminal?";
- mes "You want to visit that place again?";
- next;
- menu "Sure, let's go~",-,"Nah, maybe next time.",M_NAH;
-
- mes "[Jiu Lian Bu]";
- mes "Alright~";
- mes "Let's get";
- mes "a groove on.";
- close2;
- warp "lou_fild01.gat",180,171;
- end;
-
-M_NAH:
- next;
- mes "[Jiu Lian Bu]";
- mes "Not in the mood, eh?";
- mes "No prob. But feel free";
- mes "to come see me whenever";
- mes "you want.";
- close;
-L_WHERE:
- mes "[Jiu Lian Bu]";
- mes "Hey where did you go?";
- mes "Come up again and I'll";
- mes "give you your reward.";
- close2;
- warp "lou_fild01.gat",180,171;
- end;
-}
-
-lou_fild01.gat,175,174,4 script Jiu Lian Bu#02 819,{
- if(QL_SOUPQUEST < 1) goto L_DOQUEST;
- if(QL_SOUP2 < 1) goto L_1STTIME;
- mes "[Jiu Lian Bu]";
- mes "So...";
- mes "Whaddya want to do?";
- emotion e_heh;
- next;
- menu "Shout.",-,"Leave.",M_LEAVE;
-
- mes "[Jiu Lian Bu]";
- mes "Ready~!";
- mes "Say it out loud!";
- next;
- input @loushout$;
- mapannounce "lou_fild01.gat","'" + strcharinfo(0) + "' shouts: " + @loushout$ ,1,0x9CFF00;
- mes "[" + strcharinfo(0) + "]";
- mes @loushout$;
- close;
-
-M_LEAVE:
- mes "[Jiu Lian Bu]";
- mes "Ahhh...";
- mes "Alright, let's";
- mes "get a groove on.";
- close2;
- warp "lou_fild01.gat",197,174;
- end;
-
-L_DOQUEST:
- mes "[Jiu Lian Bu]";
- mes "Who are you?";
- mes "Get off my turf!";
- close2;
- warp "lou_fild01.gat",197,174;
- end;
-
-L_1STTIME:
- mes "[Jiu Lian Bu]";
- mes "So...";
- mes "Whaddya think?";
- mes "Prettiest place in Louyang, isn't it?";
- next;
- mes "[Jiu Lian Bu]";
- mes "Whenever I'm depressed or need to relax, I just sit here and enjoy the breeze. It helps me forget all my worries.";
- next;
- mes "[Jiu Lian Bu]";
- mes "Heh heh, the best part is, this place is far away from my older siste. Man, that woman can nag, nag, nag, all day long.";
- next;
- mes "[Jiu Lian Bu]";
- mes "Why don't you sit down and close your eyes, and feel that soothing wind. It's pretty refreshing";
- next;
- mes "[Jiu Lian Bu]";
- mes "Also...";
- mes "I'm a little";
- mes "embarrassed to";
- mes "say this but...";
- next;
- mes "[Jiu Lian Bu]";
- mes "I'm the kind of guy who speaks his mind. If there's something you just wanna say, but can't, it's kind of like poison in your mind.";
- next;
- mes "[Jiu Lian Bu]";
- mes "You know what I'm talking about, right? If you bottle something up inside of you, it just causes you anxiety you don't need.";
- next;
- mes "[Jiu Lian Bu]";
- mes "So..";
- mes "This is what you do.";
- mes "Clench your first, take";
- mes "a deep breath.";
- next;
- mes "[Jiu Lian Bu]";
- mes "And just yell";
- mes "Whatever you want!";
- mes "If you don't know";
- mes "the words, just";
- mes "screaming will do.";
- mes "Let everything out!";
- next;
- mes "[Jiu Lian Bu]";
- mes "Ready~!";
- mes "Say it out loud!";
- next;
- input @loushout$;
- mapannounce "lou_fild01.gat","'" + strcharinfo(0) + "' shouts: " + @loushout$ ,1,0x9CFF00;
- mes "[" + strcharinfo(0) + "]";
- mes @loushout$;
- set QL_SOUP2,1;
- next;
- mes "[Jiu Lian Bu]";
- mes "So, how do you feel?";
- mes "Don't you feel better now? Hahaha~";
- next;
- mes "[Jiu Lian Bu]";
- mes "So from now on, whenever you";
- mes "want to relieve yourself of stress,";
- mes "come see me and we'll come back to";
- mes "this place. Call it my way of";
- mes "saying thanks.";
- close;
-}
-
-lou_in02.gat,61,175,2 script Employee#01 818,2,2{
- mes "[Ya Hua]";
- mes "^6A6A6A*Yawn...*";
- close;
-
-OnTouch:
- if(QL_GOTDRAGONSOUP == 1 || QL_GOTFAKESOUP == 1) goto S_CAUGHT;
- end;
-
-S_CAUGHT:
- mes "[Ya Hua]";
- mes "^6A6A6A*Yawn...*";
- mes "^000000Eyelids...";
- mes "Getting...";
- mes "Heavier...";
- next;
- mes "[Ya Hua]";
- mes "Wait a sec...";
- mes "Are you a thief?!";
- mes "Get out of here!!";
- if(QL_GOTFAKESOUP == 1) set QL_GOTFAKESOUP,0;
- if(QL_GOTDRAGONSOUP == 1) set QL_GOTDRAGONSOUP,0;
- next;
- mes "^3131FFYou have failed";
- mes "^3131FFto steal the pot.";
- close;
-}
-
-lou_in02.gat,54,174,6 script Employee#02 822,{
- mes "[Chang Pai]";
- mes "^6A6A6A*Yawn...*";
- close;
-}
-
-lou_in02.gat,50,185,4 script Pot#01 111,{
- if(QL_SOUPQUEST == 1) goto L_EMPTY;
- if(QL_ACCEPTSOUP < 1) goto L_NORMAL;
- mes "^3131FFBeneath the shadows, you find a large pot filled with dark, red liquid. What do you want to do?";
- next;
- menu "Take the pot.",-,"Look for another pot.",M_LOOK;
-
- if (QL_GOTDRAGONSOUP == 1) set QL_GOTDRAGONSOUP,0;
- mes "^3131FFYou take a careful look around. It wouldn't be wise to steal this now if anyone is watching.";
- next;
- mes "^3131FFSince the restaurant is closed, the whole place is completely quiet. The employees are all asleep.";
- next;
- mes "^3131FFYou carefully lift the pot, and although it's heavy, you think you can carry it.";
- next;
- mes "^3131FFAll you have";
- mes "^3131FFto do now is get";
- mes "^3131FFaway from this restaurant";
- mes "^3131FFwithout getting caught...";
- set QL_GOTFAKESOUP,1;
- close;
-
-M_LOOK:
- mes "^3131FFYou decide to";
- mes "look for another pot.";
- close;
-
-L_NORMAL:
- mes "[Chef]";
- mes "Ah...";
- mes "Please, do not";
- mes "touch the pots!";
- close;
-
-L_EMPTY:
- mes "^3131FFYou found a pot, however it's empty.";
- close;
-}
-
-lou_in02.gat,49,185,4 script Pot#02 111,{
- if(QL_SOUPQUEST == 1) goto L_EMPTY;
- if(QL_ACCEPTSOUP < 1) goto L_NORMAL;
- mes "^3131FFBeneath the shadows, you find a large pot filled with dark, red liquid. What do you want to do?";
- next;
- menu "Take the pot.",-,"Look for another pot.",M_LOOK;
-
- if (QL_GOTFAKESOUP == 1) set QL_GOTFAKESOUP,0;
- mes "^3131FFYou take a careful look around. It wouldn't be wise to steal this now if anyone is watching.";
- next;
- mes "^3131FFSince the restaurant is closed, the whole place is completely quiet. The employees are all asleep.";
- next;
- mes "^3131FFYou carefully lift the pot, and although it's heavy, you think you can carry it.";
- next;
- mes "^3131FFAll you have";
- mes "^3131FFto do now is get";
- mes "^3131FFaway from this restaurant";
- mes "^3131FFwithout getting caught...";
- set QL_GOTDRAGONSOUP,1;
- close;
-
-M_LOOK:
- mes "^3131FFYou decide to";
- mes "look for another pot.";
- close;
-
-L_NORMAL:
- mes "[Chef]";
- mes "Ah...";
- mes "Please, do not";
- mes "touch the pots!";
- close;
-
-L_EMPTY:
- mes "^3131FFYou found an empty pot.";
- close;
-}
-
-lou_in02.gat,62,183,4 script Chef 820,{
- if(QL_SOUPQUEST == 1) goto L_FINISHED;
- mes "[Wang Shi Long]";
- mes "Hello, are you";
- mes "one of our customers?";
- mes "I am Wang Shi Long";
- mes "the chef of this restaurant.";
- next;
- mes "[Wang Shi Long]";
- mes "My family has server food";
- mes "to Lord Bai Long for a long time.";
- mes "This restaurant has been handed";
- mes "down the family line, and I am the successor~";
- next;
- mes "[Wang Shi Long]";
- mes "Our specialty, Dragon Soup,";
- mes "won especially high praise from";
- mes "Lord Bai Long, who is known for";
- mes "his extremely discerning sense of taste.";
- next;
- mes "[Wang Shi Long]";
- mes "I'm also proud to say that we cook";
- mes "with only the freshest and highest";
- mes "quality ingredients.";
- next;
- mes "[Wang Shi Long]";
- mes "We've always been popular in";
- mes "Louyang for hundreds and hundreds";
- mes "of years because of our high";
- mes "quality gourmet cuisine.";
- next;
- mes "[Wang Shi Long]";
- mes "In this dry and hot weather,";
- mes "Dragon Soup is the best food for";
- mes "any appetite. I suggest that you";
- mes "try a bowl. You'll be quite";
- mes "pleased!";
- close;
-
-L_FINISHED:
- mes "[Wang Shi Long]";
- mes "^6A6A6A*Moans and Cries*^000000";
- mes "I guess this is it...!";
- mes "The end of my family's glory.";
- mes "Someone stole the base broth";
- mes "of my Dragon Soup!";
- next;
- mes "[Wang Shi Long]";
- mes "What should I do, now?";
- mes "Without Dragon Soup, my family's";
- mes "restaurant will now just be like";
- mes "all the others...";
- close;
-}
-
-lou_in02.gat,42,186,4 script Liu Jia Lim 816,{
- if(QL_SOUPQUEST == 1) goto L_FINISHED;
- mes "[Liu Jia Lim]";
- mes "Do you know what's the best dish at this restaurant? It's Dragon Soup! They've been selling it here for as long as this restaurant has been around";
- next;
- mes "[Liu Jia Lim]";
- mes "It's delicate taste comes from a broth extracted from pure meat that doesn't contain any fat. So it's also a very popular diet food for the ladies.";
- next;
- mes "It's tasty and really good for your health. Why don't you order a bowl? I've never known anyone to taste Dragon Soup and not love it!";
- close;
-
-L_FINISHED:
- mes "[Liu Jia Lim]";
- mes "Do you know what was this restaurant's best dish throughout all of its history? Dragon Soup!";
- next;
- mes "[Liu Jia Lim]";
- mes "It's delicate taste comes from a broth extracted from pure meat that doesn't contain any fat. So it's also a very popular diet food for the ladies.";
- next;
- mes "[Liu Jia Lim]";
- mes "I'm not sure what happened, but people say this restaurant no longer sells Dragon Soup.";
- mes "Was it because of the price...?";
- close;
-}
-
-lou_in02.gat,80,173,2 script Li Min 746,{
- if(QL_SOUPQUEST == 1) goto L_FINISHED;
- mes "[Li Min]";
- mes "Well, I don't really";
- mes "live here in Louyang.";
- mes "Still, I come here often";
- mes "enough to visit.";
- next;
- mes "[Li Min]";
- mes "I just returned";
- mes "because I've got";
- mes "a huge craving for the";
- mes "food I tasted here";
- mes "a while ago.";
- next;
- mes "[Li Min]";
- mes "For some reason, I can't forget it.";
- mes "I can't get it out of my mind!";
- next;
- mes "[Li Min]";
- mes "The taste, the texture.";
- mes "The sweetness, melting down into my";
- mes "mouth, and it's tempting scent";
- mes "lingering on my lips...";
- next;
- mes "[Li Min]";
- mes "Ummmmm...";
- mes "Royal Jelly!";
- mes "It makes my";
- mes "mouth water~";
- close;
-
-L_FINISHED:
- mes "[Li Min]";
- mes "^6A6A6A*Sigh*^000000 I am so disappointed. I came";
- mes "all the way down here to taste the";
- mes "food! I can't believe they don't";
- mes "sell it anymore!";
- next;
- mes "[Li Min]";
- mes "The worst part is that I'm already";
- mes "addicted to the taste! ^6A6A6A*Sob...*^000000";
- close;
-}
-
-louyang.gat,174,150,4 script Liu Chi Ling 815,{
- if(QL_SOUPQUEST == 1) goto L_RUMOR;
- mes "[Jiu Chi Ling]";
- mes "I'm worried about my brother.";
- mes "He's young, rebellious and doesn't";
- mes "listen to anybody...";
- next;
- mes "[Jiu Chi Ling]";
- mes "He just left the";
- mes "house while he was";
- mes "complaining about";
- mes "that restaurant...";
- next;
- mes "[Jiu Chi Ling]";
- mes "^6A6A6A*Sigh~~*^000000";
- mes "I'm not going to let him get";
- mes "away this time!";
- close;
-
-L_RUMOR:
- mes "[Jiu Chi Ling]";
- mes "There's a strange rumor going";
- mes "around that the restaurant is no";
- mes "longer selling Dragon Soup...";
- next;
- mes "[Jiu Chi Ling]";
- mes "Do you think";
- mes "my brother did";
- mes "something bad again!?";
- mes "I hope not! If he did...";
- mes "What am I supposed to do?!";
- close;
-}
-
-
-//============================================================
-//================================================ Tool Master
-//====================================================== Quest
-lou_in02.gat,210,47,8 script City Hall Officer 825,{
- if(QL_GOTCOMPROP == 1)goto L_BEENTOHIM;
- if(QL_LOUBRIBE == 1)goto L_OFFICER;
- if(QL_BEENTOSTORAGE == 1)goto L_QUEST;
- mes "[Jin Chiyuan]";
- mes "^6A6A6A*Yawn~*^000000";
- mes "Gosh, this hot weather is such a pain. Oh? You look like a tourist. Are you enjoying your stay?";
- next;
- mes "[Jin Chiyuan]";
- mes "Although we've been having bad weather recently, there are many good places to visit in Louyang. I hope you have a good time.";
- close;
-
-L_QUEST:
- mes "[Jin Chiyuan]";
- mes "Hm? A Rune-Midgardian? Now, how may I help you?";
- next;
- menu "I need a document.",-,"I just dropped by",M_DROP;
-
- mes "[Jin Chiyuan]";
- mes "Ah, you do?";
- mes "Unfortunately, there are many people waiting in line to procure goverment forms, so it will take a while to handle your request.";
- next;
- mes "[Jin Chiyuan]";
- mes "^6A6A6A*whispers*";
- mes "^2A2A2AWell, there is a way that you can, shall we say, expedite our processing of your request...^000000";
- next;
- menu "Huh? Come again?",-,"A little zeny to cut the red tape, eh?",M_BRIBE;
-
- mes "[Jin Chiyuan]";
- mes "^6A6A6A*Ahem!*^000000 Nothing.";
- mes "Nothing of importance. Now, I'm very busy, so if you would go fill the application over there...";
- close;
-
-M_BRIBE:
- input @loubribe;
- if(@loubribe < 10000)goto L_POOR;
- if(zeny < @loubribe)goto L_NOTENOUGH;
- set Zeny, Zeny - @loubribe;
- set QL_LOUBRIBE,1;
- mes "[Jin Chiyuan]";
- mes "What...?!";
- mes "That's not what I meant, but if you insist on donating to our government...";
- next;
- mes "[Jin Chiyuan]";
- mes "^6A6A6A*Whispers*";
- mes "^2A2A2AWhen you go upstairs, another officer will give you the document you want.^6A6A6A *Ahem* ^000000Louyang thanks you!";
- close;
-
-L_POOR:
- mes "[Jin Chiyuan]";
- mes "Good lord,";
- mes "What are you thinking? What am I, a beggar?! That's a poor excuse for a bribe!";
- next;
- emotion e_pif;
- mes "[Jin Chiyuan]";
- mes "I mean...";
- mes "How dare you bribe an officer of the law! I hope other outsiders are not like you! Please leave immediately.";
- close;
-
-M_DROP:
- mes "[Jin Chiyuan]";
- mes "Oh well...";
- mes "Let me tell you that this is not a good time for tourists. I hope you don't wander into places you're not supposed to be.";
- next;
- mes "[Jin Chiyuan]";
- mes "Quite frankly,";
- mes "it's a dangerous climate for curiosity right now. Please, be careful.";
- close;
-
-L_NOTENOUGH:
- mes "[Jin Chiyuan]";
- mes "You don't even have that much money.";
- close;
-
-L_OFFICER:
- mes "[Jin Chiyuan]";
- mes "Haven't you met the officer I told you about? I've contacted him about the matter, so you may meet him upstairs.";
- next;
- mes "[Jin Chiyuan]";
- mes "Hahahaha...";
- mes "Take care,";
- mes "Rune-Midgardian.";
- close;
-
-L_BEENTOHIM:
- emotion e_heh;
- mes "[Jin Chiyuan]";
- mes "Ah~";
- mes "You met him,";
- mes "didn't you?";
- mes "Hahaha...";
- mes "Enjoy your stay";
- mes "in Louyang!";
- close;
-}
-
-lou_in02.gat,156,38,8 script Studying Officer 822,{
- if(QL_GOTCOMPROP == 1)goto L_RANT2;
- if(QL_LOUBRIBE == 1)goto L_BRIBED;
- if(QL_BEENTOSTORAGE == 1)goto L_RANT;
- mes "[Huang Zhishu]";
- mes ".....";
- mes "^6A6A6A*Mumble mumble*^000000";
- next;
- mes "^3131FFHe appears to be rummaging around for some documents and takes no notice of you.";
- next;
- menu "Excuse me.",-,"Pass him.",M_PASS;
-
- mes "[Huang Zhishu]";
- mes "Hmmm...?";
- mes "Well...";
- mes "...";
- mes "I see...";
- mes "^6A6A6A*Mumble mumble...*^000000";
- close;
-
-M_PASS:
- mes "[Huang Zhishu]";
- mes ".....";
- mes "^6A6A6A*Mumble mumble*^000000";
- close;
-
-L_RANT:
- mes "[Huang Zhishu]";
- mes "Books contain the spirit and ideas of their authors. Any work of are can be considered a window into the soul of its creator.";
- next;
- mes "[Huang Zhishu]";
- mes "^6A6A6A*Mumble mumble...*^000000";
- mes "Hmm... I see...";
- mes "Ah, I see....";
- mes "^6A6A6A*Mumble mumble...*^000000";
- close;
-
-L_BRIBED:
- mes "^3131FF*Rummage rummage...*^000000";
- next;
- menu "Sorry about that.",-,"I came to pick up my documents.",L_DOCU;
-
- mes "[Huang Zhishu]";
- mes "Apology accepted.";
- mes "Hmmm....";
- mes "Oh I see, I see...";
- next;
- emotion e_gasp;
- mes "^3131FF*Rummage rummage...*";
- mes "^3131FF..........";
- close;
-
-L_DOCU:
- mes "[Huang Zhishu]";
- mes "Huh?";
- mes "Ah...";
- mes "You're the one I'm waiting for. So what kind of document did you need?";
- input @loudocument$;
- next;
- mes "[Huang Zhishu]";
- mes "Let's see now.";
- mes "You want..";
- mes "a " + @loudocument$ + "?";
- next;
- if(@loudocument$ != "Communication Proposal")goto L_WHAT;
- mes "[Huang Zhishu]";
- mes "Now where did I put that? You want a Communication Proposal, huh? I think I'll need some time to find it. Ah, right. I think I know where I put that.";
- next;
- mes "...";
- next;
- mes "...";
- mes "......";
- next;
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "...";
- mes "......";
- mes ".........";
- mes "............";
- next;
- mes "...";
- mes "......";
- mes ".........";
- mes "............";
- mes "...............";
- next;
- mes "[Huang Zhishu]";
- mes "Here it is. Someone asked me for the same document a few days ago so I was able to find it again pretty easily. I hope it's useful to you.";
- set QL_GOTCOMPROP,1;
- set QL_LOUBRIBE,0;
- set QL_BEENTOSTORAGE,0;
- close;
-
-L_WHAT:
- mes "[Huang Zhishu]";
- mes "Huh?";
- mes "Wha...";
- next;
- mes "[Huang Zhishu]";
- mes "I'm sorry but I don't think we have that one. You might want to check the name of the document once more, and then come back to me.";
- close;
-
-L_RANT2:
- emotion e_ok;
- mes "[Huang Zhishu]";
- mes "Hmmm...?";
- mes "Do you think I need to go outside more often? Well, I guess for some reason, I don't feel well. I guess I really should get some fresh air.";
- mes "^6A6A6A*Yawn...*^000000";
- next;
- mes "[Huang Zhishu]";
- mes "But you should get out more often yourself! It's not a good idea to always stay home. If you don't get some exercise when you're young, it could affect your health later.";
- close;
-}
-
-lou_in02.gat,248,166,2 script Tool Shop Master 824,{
- if(QL_GOTHERB == 1)goto L_HERB;
- if(QL_TOOLMASTER == 1)goto L_STORAGE;
- if(QL_DOCQUEST == 1)goto L_QUEST;
-L_HERB:
- mes "[Wang Chuiyi]";
- mes "My business hasn't been doing well recently. And what is wrong with this weather? I don't know what's going on with the world...";
- close;
-
-L_QUEST:
- mes "[Wang Chuiyi]";
- mes "Darn it!";
- mes "I hate this";
- mes "weather...!";
- next;
- emotion e_what;
- mes "[Wang Chuiyi]";
- mes "Um? Can I help";
- mes "you with anything?";
- next;
- menu "I'm here to get something for the doctor...",-,"I agree, the weather really is bad.",M_WEATHER;
-
- mes "[Wang Chuiyi]";
- mes "Huh?";
- mes "An errand for the doctor? She must have run out of medicine again. Go ahead and check the storage.";
- next;
- mes "[Wang Chuiyi]";
- mes "You can find the storage on the opposite side of this building. There, you'll see a guy named Jiang Xiayou. Go ahead and ask him for the stuff you need.";
- set QL_TOOLMASTER,1;
- close;
-
-M_WEATHER:
- mes "[Wang Chuiyi]";
- mes "Tell me about it. This weather keeps stressing me out. Damn, I don't think I'll live very long if I keep getting aggravated like this by the weather...";
- close;
-
-L_STORAGE:
- mes "[Wang Chuiyi]";
- mes "You can find the storage on the opposite side of this building. There, you'll see a guy named Jiang Xiayou. Go ahead and ask him for the stuff you need.";
- close;
-}
-
-lou_in02.gat,201,166,5 script Storage Keeper 819,{
- if(QL_GOTCOMPROP == 1)goto L_FINALLY;
- if(QL_BEENTOSTORAGE == 1)goto L_LAZY;
- if(QL_TOOLMASTER == 1)goto L_QUEST;
- mes "[Jiang Xiayou]";
- mes "^6A6A6A*Yawn...*^000000";
- mes "This is boring...";
- mes "So boring, it's ridiculous. I don't want to waste any more time here, I've got important things to do...";
- close;
-
-L_QUEST:
- mes "[Jiang Xiayou]";
- mes "Huh?";
- mes "What, what are you doing here? If you don't need anything, you better get a move on.";
- next;
- menu "Sorry about that.",-,"It's hot isn't it?",M_HOT,"I'm on an errand for the doctor.",M_ERRAND;
-
- mes "[Jiang Xiayou]";
- mes "That's right!";
- mes "You don't mess with a person in this hot weather! Now, go away. Can't you see I'm busy!";
- close;
-
-M_HOT:
- mes "[Jiang Xiayou]";
- mes "You don't have to ask me that. I can feel if for myself! Now, I got a bunch of things to take care of, so quit bugging me. Damn, it's hot!";
- close;
-
-M_ERRAND:
- mes "[Jiang Xiayou]";
- emotion e_gasp;
- mes "Oh yeah?";
- mes "Well, why didn't you say so? Let's see.";
- mes "Hmmm...";
- next;
- mes "[Jiang Xiayou]";
- mes "Actually, could you help me out first? Don't worry, it's not so hard but it's pretty important for me. Once you help me out, I'll get what you need.";
- next;
- menu "Um, what is it?",-,"Sorry, I'm busy.",L_BUSY;
-
- mes "[Jiang Xiayou]";
- mes "Cool, thanks. I have to go get some official documents from City Hall, but I can't leave this storage area since no one can take over my shift.";
- next;
- mes "[Jiang Xiayou]";
- mes "So I want you to go get the documents from City Hall for me. I don't think it'll take much of your time.";
- next;
- mes "[Jiang Xiayou]";
- mes "Just go east from here and look for the building that looks sort of like it was made in gauge form. That's City Hall.";
- next;
- mes "[Jiang Xiayou]";
- mes "I don't get why the government spent so much money making that building, but anyway, I hope you can do that for me.";
- next;
- mes "[Jiang Xiayou]";
- mes "Oh, I almost forgot.";
- mes "You have to ask for a specific type of document, so let me tell you right now.";
- next;
- mes "[Jiang Xiayou]";
- mes "This is important,";
- mes "so don't forget this.";
- mes "When the guy asks what you need, you tell him: '^FF0000Communication Proposal^000000' Just like that?";
- next;
- mes "[Jiang Xiayou]";
- mes "If you don't specify the documents you need, they won't give you anything. So be careful and don't forget!";
- set QL_BEENTOSTORAGE,1;
- close;
-
-L_BUSY:
- mes "[Jiang Xiayou]";
- mes "Bah~!";
- mes "Forget it, then!";
- next;
- mes "[Jiang Xiayou]";
- mes "The medicines you're looking for might be around here. so look around. If it weren't for the doctor, I wouldn't even let you hang around, you know that?";
- close;
-
-L_LAZY:
- mes "[Jiang Xiayou]";
- mes "Huh?";
- mes "Haven't you gone to City Hall yet?";
- mes "What a lazy ass";
- next;
- mes "[Jiang Xiayou]";
- mes "Shouldn't you hurry to get that medicine to the doc? We're talking a man's life at stake, that mean anything to you?";
- next;
- mes "[Jiang Xiayou]";
- mes "I guess you're";
- mes "the forgetful type...";
- mes "When the guy asks what you need, you tell him:";
- mes "'^FF0000Communication Proposal^000000'.";
- next;
- mes "[Jiang Xiayou]";
- mes "Just like that.";
- mes "Now, go to it, tiger.";
- close;
-
-L_FINALLY:
- mes "[Jiang Xiayou]";
- mes "You finally brought it! Haha, I just got everything you need, too. Let me see...";
- mes "Yup this is it!";
- mes "Good, good...";
- next;
- mes "^3131FF*Rummage rummage...*";
- mes "^3131FF......";
- next;
- menu "Excuse me.",-;
- mes "[Jiang Xiayou]";
- mes "Huh?";
- mes "Ah....";
- mes "Haha...";
- mes "Sorry about";
- mes "that. Hahaha~";
- next;
- getitem 7252,1; //Herbal Medicine
- mes "[Jiang Xiayou]";
- mes "Ah! Here you go. Even if it was kind of annoying to do, I guess we gotta help each other, right? Alright then, I'll see ya around.";
- set QL_GOTHERB,1;
- set QL_BEENTOSTORAGE,0;
- set QL_GOTCOMPROP,0;
- set QL_TOOLMASTER,0;
- close;
-}
-
-
-//============================================================
-//===================================================== Doctor
-//====================================================== Quest
-lou_in02.gat,265,69,4 script Doctor 814,{
- if(QL_DOCQUEST == 1) goto L_MED;
- if(QL_DOCQUEST == 2) goto L_RANT;
- if(QL_DOCQUEST == 3) goto L_CHECKITM;
- if(QL_DOC1STTIME == 1) goto L_QUEST;
- mes "[Hua Tuo]";
- mes "There are many pressure points on the human body. Ever since ancient times, it has been believed that each pressure point was limited to its role and functions.";
- next;
- mes "[Hua Tuo]";
- mes "However, as I studied and experimented with every pressure point, I came to the conclusion that the use of pressure points, depending on the circumstances, can produce different results.";
- next;
- mes "[Hua Tuo]";
- mes "Few pressure points tend to show the same symptoms, regardless of the problem. Most of the time, the effects of pressure points will differ depending on the body's health or time of day.";
- next;
- mes "[Hua Tuo]";
- mes "For instance, the pressure point located on the upper side of the navel is the most vulnerable point.";
- next;
- mes "[Hua Tuo]";
- mes "If pressed the wrong way, it can cause death. But between 5:15 am and 7:15 am, it's just a weak point.";
- set QL_DOC1STTIME,1;
- close;
-
-L_QUEST:
- mes "[Hua Tuo]";
- mes "Hmmm...";
- mes "I'm in trouble";
- next;
- emotion e_swt2;
- mes "[Hua Tuo]";
- mes "I cannot do anything without my medicine. But one of my patients needs immediate treatment and I can't leave the office...";
- next;
- menu "I can help you",-,"What a shame!",M_SHAME;
-
- mes "[Hua Tuo]";
- mes "Huh...?";
- mes "Are...";
- mes "Are you serious?";
- next;
- mes "[Hua Tuo]";
- mes "This won't take much effort, but it may be too much to ask of you, especially since we have just met.";
- next;
- menu "If you feel burdened...",-,"I don't mind, I'd be glad to help.",M_HELP2;
-
- mes "[Hua Tuo]";
- mes "Thank you so";
- mes "much for saying that.";
- mes "I feel very uncomfortable asking a favor of someone I have only just met.";
- next;
- emotion e_thx;
- mes "[Hua Tuo]";
- mes "However, I will ask you if we meet another time. Now, if you'll excuse me...";
- close;
-
-M_HELP2:
- mes "[Hua Tuo]";
- mes "Hmm, I see.";
- mes "Well then, let me";
- mes "ask a favor of you.";
- next;
- mes "[Hua Tuo]";
- mes "As you heard earlier, I need a special medicine to treat this patient. However, I'm running out of the medicine I need.";
- next;
- mes "[Hua Tuo]";
- mes "I will need you to get it for me since I cannot leave the patients that are waiting for me right now.";
- next;
- mes "[Hua Tuo]";
- mes "^6A6A6A*Sigh*^000000";
- mes "Misfortunes always seem to occur one after another, don't they? My staff is currently too busy doing other errands.";
- next;
- mes "[Hua Tuo]";
- mes "Please visit the";
- mes "Tool Shop in town and bring me the medicine that I need. Master will understand if you tell him you've been sent by me.";
- next;
- mes "[Hua Tuo]";
- mes "I am sorry for causing you so much trouble, but if you'll excuse me, I have other patients waiting. Please hurry back with the medicine!";
- set QL_DOCQUEST,1;
- close;
-
-M_SHAME:
- mes "[Hua Tuo]";
- mes "^6A6A6A*Sigh*^000000 For some reason, I never seem to have enough in stock. Is there no one I can ask to help me?";
- close;
-
-L_MED:
- if(countitem(7252) == 0)goto L_NOMED;
- delitem 7252,1; //Herbal Medicine
- mes "[Hua Tuo]";
- mes "Ah, finally...";
- mes "You've brought what I need. Thank you so much, it's such a relief to have this medicine on hand again.";
- next;
- mes "[Hua Tuo]";
- mes "I apologize in advance, but may I ask you for another favor? I am asking for your help once, since I know I can depend on you. Of course, I will compensate you for your trouble.";
- next;
- menu "I'm sorry...",L_DONE,"No problem.",-;
-
- mes "[Hua Tuo]";
- mes "Thank you, thank you so much!";
- mes "I've just run out of other medicines that my patients will be needing. I don't need too much, but you would be doing me a great favor.";
- next;
- mes "[Hua Tuo]";
- mes "The medicines I need are ^0000FF2 Leopard Claw^000000 which supports the bones, ^0000FF10 Solid Peach^000000 which strengthens the muscle, ^0000FF5 Poisonous Toad Skin which replenishes the skin...";
- next;
- mes "[Hua Tuo]";
- mes "^0000FF20 Brown Root^000000 which regulates the heart, ^0000FF10 Sprout^000000 which eases the abdomen and ^0000FF5 Honey Pot^000000 which provides nutrition.";
- next;
- mes "[Hua Tuo]";
- mes "I hope you've memorized it all.";
- mes "Once again, that's...";
- set QL_DOCQUEST,3;
- next;
-L_INGREDIENT:
- mes "[Hua Tuo]";
- mes "^3131FF2 Leopard Claw^000000,";
- mes "^3131FF10 Solid Peach^000000,";
- mes "^3131FF5 Poisonous Toad Skin^000000,";
- mes "^3131FF20 Brown Root^000000,";
- mes "^3131FF10 Sprout^000000 and";
- mes "^3131FF5 Honey Pot^000000.";
- close;
-
-L_DONE:
- mes "[Hua Tuo]";
- mes "Alright...";
- mes "I understand.";
- mes "But thank you for helping me out. please take this...";
- next;
- mes "[Hua Tuo]";
- mes "It's not much, but this medicine is an old family secret. I hope that it will be of use to you in dangerous situations.";
- set QL_GOTHERB,0;
- set QL_DOC1STTIME,0;
- set QL_DOCQUEST,2;
- getitem 679,2; //Pilule
- set BaseExp,BaseExp + 10000;
- next;
- mes "[Hua Tuo]";
- mes "Well then, I will see you around. Once again, I'd like to thank you for your help.";
- close;
-
-L_NOMED:
- mes "[Hua Tuo]";
- mes "You haven't gotten the medicine yet...? I hope you can get it as soon as possible...";
- close;
-
-L_RANT:
- mes "[Hua Tuo]";
- mes "Being strong as a person is not defined as mere physical strength.";
- next;
- mes "[Hua Tuo]";
- mes "Factors such as intelligence, experience and knowledge are also considered when judging one's strength.";
- next;
- mes "[Hua Tuo]";
- mes "Let's say you're very strong and given the most powerful weapon.";
- next;
- mes "[Hua Tuo]";
- mes "If you don't know how to use the weapon's power, you will not be strong... You will be weak.";
- next;
- mes "[Hua Tuo]";
- mes "When the tools or weapons overwhelm your capabilities, the worst situations result.";
- close;
-
-L_CHECKITM:
- if(countitem(7172) < 2)goto L_NOTENOUGH; //Leopard Claw
- if(countitem(7164) < 10)goto L_NOTENOUGH; //Solid Peach
- if(countitem(7155) < 5)goto L_NOTENOUGH; //Poisonous Toad Skin
- if(countitem(7188) < 20)goto L_NOTENOUGH; //Brown Root
- if(countitem(7193) < 10)goto L_NOTENOUGH; //Sprout
- if(countitem(7121) < 5)goto L_NOTENOUGH; //Honey Pot
- delitem 7172,2; //Leopard Claw
- delitem 7164,10; //Solid Peach
- delitem 7155,5; //Poisonous Toad Skin
- delitem 7188,20; //Brown Root
- delitem 7193,10; //Sprout
- delitem 7121,5; //Honey Pot
- //These following dialogs are made up, I didn't finish the quest =/
- mes "[Hua Tuo]";
- mes "Thank you so much, now I can treat my patients.";
- next;
- mes "[Hua Tuo]";
- mes "Ah...";
- mes "Of course!";
- mes "Here's your reward. Use this medicine when you feel weary.";
- getitem 679,5; //Pilule
- set BaseExp,BaseExp + 30000;
- set QL_GOTHERB,0;
- set QL_DOC1STTIME,0;
- set QL_DOCQUEST,2;
- close;
-
-L_NOTENOUGH:
- mes "[Hua Tuo]";
- mes "Hmm....";
- mes "Unfortunately, you haven't collected everything that I need yet. Once again, please gather...";
- next;
- goto L_INGREDIENT;
-}
-
-
-//============================================================
-//================================================ Poison King
-//====================================================== Quest
-lou_fild01.gat,224,348,7 script Lady#04 817,{
-
- emotion 30;
- mes "[Lady]";
- mes "You're at the entrance of Louyang.";
- if(QL_POISONKING > 8)
- {
- mes "I hope you have a good time~";
- close;
- }
- next;
- mes "[Lady]";
- mes "Louyang is well known";
- mes "for its various firecrackers.";
- mes "Would you like to see one?";
- next;
- menu "Sure!",s_Firework,"No thanks~",-;
-
- if(QL_POISONKING == 8)goto s_PKQuest;
- mes "[Lady]";
- mes "Hmpf...!";
- emotion 9;
- close;
-
-s_PKQuest:
- mes "[Lady]";
- mes "Hmm, if not firecrackers,";
- mes "then you must want something";
- mes "else. Did someone send you?";
- next;
- menu "Yes.",s_Sent,"No.",-;
-
- mes "[Lady]";
- mes "No...?";
- if(!Sex)close;
- next;
- mes "[Lady]";
- mes "Are you...";
- mes "Coming on to me?";
- close;
-
-s_Sent:
- mes "[Lady]";
- mes "Who was it?";
- mes "Please tell me";
- mes "his name.";
- next;
- input @PKstr$;
- if(@PKstr$ != "Song Zhi Du")goto s_Dunno;
-
- mes "[Lady]";
- mes "Oh, I see.";
- mes "Let me give";
- mes "you the package.";
- next;
- mes "[Lady]";
- mes "Ah, wait! I forgot!";
- mes "You must first pay the";
- mes "delivery fee of 1,000 zeny.";
- next;
- mes "[Lady]";
- if(Zeny < 1000)goto s_NEnoughZeny;
- mes "Thank you~";
- mes "Now that the fee is paid,";
- mes "please bring this to";
- mes "Song Zhi Du.";
- mes "Take care!";
- set Zeny,Zeny-1000;
- getitem 7126,1;
- set QL_POISONKING,9;
- close;
-
-s_NEnoughZeny:
- mes "Sorry, you don't have";
- mes "enough zeny to pay the";
- mes "delivery fee.";
- close;
-
-s_Dunno:
- mes "[Lady]";
- mes "Hmmm?";
- mes "I don't know who that is.";
- mes "So I definitely don't have";
- mes "a package for whoever you're";
- mes "talking about.";
- close;
-
-s_Firework:
- mes "[Lady]";
- mes "Alright, there you go!";
- close2;
- donpcevent "LouFireWrk::OnExplosion";
- end;
-
-}
-
-lou_fild01.gat,225,349,1 script LouFireWrk 139,{
-
-OnExplosion:
- misceffect 183;
- end;
-
-}
-
-lou_in01.gat,99,158,4 script Lord 821,{
- mes "[Lord Bai Long]";
- mes "Hahahaha!";
- mes "Welcome to Louyang!";
- next;
- mes "[Lord Bai Long]";
- mes "Louyang is such a great city.";
- mes "We're protected this land for forty";
- mes "years from the invasions of evil";
- mes "creatures!";
- next;
- mes "[Lord Bai Long]";
- mes "I hope you enjoy";
- mes "your stay here,";
- mes "Rune-Midgardian!";
- next;
- if(QL_POISONKING == 15)goto s_Journal;
- mes "[Lord Bai Long]";
- mes "How could I have lost my friend";
- mes "from our glory days? Hmm...?";
- mes "Oh, I didn't realize you were still";
- mes "there...Listening to me.";
- next;
- mes "[Lord Bai Long]";
- mes "I'm sorry, I was just talking to";
- mes "myself. I hope you have a good time";
- mes "while you stay here in Louyang.";
- close;
-
-s_Journal:
- mes "^3131FFYou give Nagash Arses' Journal";
- mes "to Bai Long. He reads it intently,";
- mes "slowly turnin each page.";
- next;
- mes "^3131FFHe's completely silent for about";
- mes "fifteen minutes, and focuses all";
- mes "of his attention on the journal.";
- next;
- mes "^3131FFA single tear trickles";
- mes "from his eye as he reads";
- mes "the words of Nagash Arses...^000000";
- next;
- mes "[Lord Bai Long]";
- mes "Thank you..";
- mes "Adventurer...";
- next;
- mes "[Lord Bai Long]";
- mes "Thank you so much.";
- mes "You've helped me make";
- mes "up with an old friend!";
- next;
- mes "[Lord Bai Long]";
- mes "I, Bai Long, will work on giving";
- mes "fair treatment to all of martial";
- mes "arts organizations, regardless of";
- mes "their methods or philosophies!";
- next;
- mes "[Lord Bai Long]";
- mes "I will also forgive Song Zhi Du,";
- mes "even if he tried to poison me.";
- mes "He is innocent...";
- next;
- mes "[Lord Bai Long]";
- mes "As a matter of fact, it was";
- mes "reported to me that Nagash was";
- mes "deported to his homeland after";
- mes "that incident. I had no idea";
- mes "he was in jail!";
- next;
- mes "[Lord Bai Long]";
- mes "Thank you so";
- mes "much for your help!";
- next;
- mes "[Lord Bai Long]";
- mes "Please take this as a token of";
- mes "gratitude. And please deliver this";
- mes "letter to Nagash and Song Zhi Du";
- mes "for me.";
- getitem 603,1;
- set QL_POISONKING,16;
- next;
- mes "^3131FFYou obtained ^0000FFBai Long's letter.^000000";
- next;
- mes "[Lord Bai Long]";
- mes "Thank you in advance.";
- close;
-
-}
-lou_in02.gat,253,45,4 script Employee#04 822,{
-
- if(QL_POISONKING == 30)goto s_NoGoodIdea;
- if(QL_POISONKING == 18)goto s_Busy;
- if(QL_POISONKING == 17)goto s_Told;
- if(QL_POISONKING == 14 && QL_POISONPATH < 2)goto s_CameBack;
- if(QL_POISONKING > 13)goto s_Proud;
- if(QL_POISONKING > 12)goto s_Security;
- if(QL_POISONKING == 12)goto s_LordDie;
- if(QL_POISONKING == 11)goto s_MaterialCheck;
- if(QL_POISONKING == 10)goto s_NotSure;
- if(QL_POISONKING == 9)goto s_Thanked;
- if(QL_POISONKING == 7 && QL_POISONDISLIKED)goto s_Materials2;
- if(QL_POISONKING > 6)goto s_DeliveryMes;
- if(QL_POISONKING == 6 && QL_POISONDISLIKED)goto s_Pity;
- if(QL_POISONKING == 6)goto s_Talked;
- if(QL_DOCQUEST != 2)goto s_NotPoison;
- mes "[Song Zhi Du]";
- mes "Well, well. Thank you for you're";
- mes "trouble. I didn't expect you to";
- mes "gather all these herbs for us...";
- next;
- mes "[Song Zhi Du]";
- mes "I suppose I underestimated you. By";
- mes "the way, do you know anything about";
- mes "poison?";
- next;
- menu "Yes, I am kind of interested in it",-,"No, not at all",s_No;
- mes "[Song Zhi Du]";
- mes "Oh, I see. Well, if you have some";
- mes "time, why don't you go visit my old";
- mes "master in the slums?";
- next;
- mes "[Song Zhi Du]";
- mes "If you two get along, I will tell";
- mes "you something important.";
- set QL_POISONKING,1;
- close;
-s_No:
- mes "[Song Zhi Du]";
- mes "Huh? I see. Well, thank you for";
- mes "your troubles once again. I hope you";
- mes "have a good time in Louyang.";
- close;
-
-s_NotPoison:
- mes "[Song Zhi Du]";
- mes "^111111*Sigh*^000000.....";
- mes "I wish there was someone who";
- mes "could help me carry my revenge out.";
- close;
-
-s_Talked:
- mes "[Song Zhi Du]";
- mes "...";
- mes "So, did you talk";
- mes "to my old master?";
- mes "It seems he really";
- mes "likes you.";
- next;
- mes "[Song Zhi Du]";
- mes "As you know, my master has been";
- mes "accused of something he didn't do!";
- mes "And they crippled his use of the";
- mes "martial arts!";
- next;
- mes "[Song Zhi Du]";
- mes "I can't forgive what";
- mes "they've done to my master!";
- mes "I want to grind their bones";
- mes "to powder! And that's before";
- mes "I kill them!";
- next;
- mes "[Song Zhi Du]";
- mes "He's innocent and all he did";
- mes "was research poison with all";
- mes "of his effort! And for that,";
- mes "they destroyed him!";
- next;
- mes "[Song Zhi Du]";
- mes "I was yound";
- mes "when it happened...";
- mes "Too young to know";
- mes "any martial arts.";
- next;
- mes "[Song Zhi Du]";
- mes "I could protect him.";
- mes "All I could do was hide and";
- mes "watch other people get killed.";
- next;
- mes "[Song Zhi Du]";
- mes "I hate myself";
- mes "for not being strong!";
- mes "But, my body isn't suited";
- mes "for martial arts.";
- next;
- mes "[Song Zhi Du]";
- mes "All I can do is maintain my weak";
- mes "body and make sure it's reasonably";
- mes "healthy. Even so, if it weren't for";
- mes "my master, I'd be dead";
- mes "in the streets...";
- next;
- mes "[Song Zhi Du]";
- mes "It was my master who picked me up";
- mes "from the streets and cured me. So,";
- mes "I've decided to become a doctor and";
- mes "save as many lives as I can.";
- next;
- mes "[Song Zhi Du]";
- mes "But before";
- mes "I do that,";
- mes "I want ^FF0000revenge^000000!";
- next;
- mes "[Song Zhi Du]";
- mes "As I told you, I am weak.";
- mes "Too weak... I know that from";
- mes "the bottom of my heart.";
- next;
- mes "[Song Zhi Du]";
- mes "But...";
- next;
- mes "[Song Zhi Du]";
- mes "I am knowledged about medicine,";
- mes "especially the use of poison. I can";
- mes "tell you that I'm one of the best.";
- next;
- mes "[Song Zhi Du]";
- mes "Poison can kill people but it can";
- mes "also be used to save lives. The";
- mes "people who destroyed my master";
- mes "will pay the price.";
- next;
- mes "[Song Zhi Du]";
- mes "Do you understand";
- mes "why I'm furious!?";
- next;
- menu "But Revenge isn't good.",-,"Yes, I fully understand",s_Understand;
-
- mes "[Song Zhi Du]";
- mes "Hmm...";
- mes "I see.";
- next;
- mes "[Song Zhi Du]";
- mes "I supposed you couldn't";
- mes "understand the way I feel.";
- mes "After all, you didn't have";
- mes "to go through the same";
- mes "things I did.";
- next;
- mes "[Song Zhi Du]";
- mes "I suppose I expected too much";
- mes "since my master likes you. How";
- mes "could you know the rage and";
- mes "sadness that I feel!?";
- next;
- mes "[Song Zhi Du]";
- mes "Fine.";
- mes "Go do whatever";
- mes "you were going to do.";
- mes "I'm just disappointed...";
- set QL_POISONDISLIKED,1;
- close;
-
-s_Understand:
- mes "[Song Zhi Du]";
- mes "Yes! Yes!";
- mes "You do understand!";
- next;
- mes "[Song Zhi Du]";
- mes "I volunteered for this medicine";
- mes "storage position so that I can";
- mes "secretly study poison! Now, the";
- mes "time for action has come!";
- next;
- mes "[Song Zhi Du]";
- mes "Still, I'll need some materials to";
- mes "complete my research. Then, when";
- mes "I succeeed and create a poison pill,";
- mes "I'll need someone to carry my";
- mes "revenge out for me.";
- next;
- mes "[Song Zhi Du]";
- mes "Since my body is so frail, I can't";
- mes "bear the tension and rage of seeing";
- mes "my lifelong enemy face to face.";
- set QL_POISONKING,7;
- close;
-
-s_Pity:
- mes "[Song Zhi Du]";
- mes "I'm so disappointed.";
- mes "You've even seen the";
- mes "pitiable state of my";
- mes "master for yourself!";
- mes "How could you not";
- mes "understand me?!";
- next;
- menu "I'm sorry for the last time",s_Sorry,"No matter what, revenge isn't good.",-;
-
- specialeffect 11;
- mes "[Song Zhi Du]";
- mes "Oh, forget about it";
- mes "I don't think I can ever";
- mes "make you understand how I feel.";
- close;
-
-s_Sorry:
- mes "[Song Zhi Du]";
- mes "If you really";
- mes "feel sorry for me,";
- mes "then you must help me";
- mes "carry out my revenge!";
- next;
- mes "[Song Zhi Du]";
- mes "I still need to complete the";
- mes "poison potion I'm creating. I hope";
- mes "you can bring what I need to finish";
- mes "it. Go and get me...";
- next;
- mes "[Song Zhi Du]";
- mes "^0000FF4 Bee Sting^000000,";
- mes "^0000FF10 Venom Canine^000000,";
- mes "^0000FF10 Empty Potion Bottle^000000,";
- mes "^0000FF30 Green Potion^000000.";
- next;
- mes "[Song Zhi Du]";
- mes "An apology is fine, but you must";
- mes "also show me that you are sorry and";
- mes "help me carry out my plan. Do you";
- mes "have any problem with this?";
- set QL_POISONKING,7;
- close;
-
-s_Materials2:
- mes "[Song Zhi Du]";
- mes "So, did you";
- mes "gather everything";
- mes "I asked of you?";
- next;
- menu "Yes.",s_Items,"What do you need again?",-;
-
- mes "[Song Zhi Du]";
- mes "^111111*Sigh...*^000000";
- mes "Go and get me...";
- next;
- specialeffect 11;
- mes "[Song Zhi Du]";
- mes "^0000FF4 Bee Sting^000000,";
- mes "^0000FF10 Venom Canine^000000,";
- mes "^0000FF10 Empty Potion Bottle^000000,";
- mes "^0000FF30 Green Potion^000000.";
- close;
-
-s_Items:
- if(countitem(939) < 4 || countitem(937) < 10 || countitem(1093) < 10 || countitem(506) < 30)goto s_NEnoughItems;
- delitem 939,4; //Bee Sting
- delitem 937,10; //Venom Canine
- delitem 1093,10; //Empty Potion Bottle
- delitem 506,30; //Green Potion
- set QL_POISONDISLIKED,0;
- mes "[Song Zhi Du]";
- mes "Ah...";
- mes "With these, I accept your apology";
- mes "Thank you for all the trouble you";
- mes "went through to get this stuff";
- next;
- mes "[Song Zhi Du]";
- mes "Now that you're this involved,";
- mes "you're in this with me all the way!";
- mes "I've been waiting for this";
- mes "day for years...";
- next;
- mes "[Song Zhi Du]";
- mes "All that's left is to create this";
- mes "poison, and then to get the";
- mes "lord of Louyang to drink it..";
- close;
-
-
-s_NEnoughItems:
- mes "[Song Zhi Du]";
- mes "Where are the things";
- mes "I asked you to bring?";
- mes "Are you testing my";
- mes "patience or what?";
- next;
- specialeffect 11;
- mes "[Song Zhi Du]";
- mes "You're still missing some of the";
- mes "items I need. I must have them all";
- mes "in order to finish making this";
- mes "poison!";
- close;
-
-s_DeliveryMes:
- emotion 0;
- mes "[Song Zhi Du]";
- mes "Ah, hello.";
- mes "Please give me a minute,";
- mes "I've just received a message.";
- next;
- mes "[Song Zhi Du]";
- mes "Ah!";
- mes "It says here";
- mes "that my delivery";
- mes "has finally arrived!";
- next;
- mes "[Song Zhi Du]";
- mes "Would you bring me the";
- mes "box from the firecracker";
- mes "lady at the entrance";
- mes "to Louyang? Thanks";
- mes "in advance.";
- set QL_POISONKING,8;
- close;
-
-s_Thanked:
- if(countitem(7126) == 0)goto s_WheresJellopy;
- delitem 7126,1;
- mes "[Song Zhi Du]";
- mes "Ah. Thank you,";
- mes "I needed this. Now,";
- mes "shall we begin?";
- next;
- mes "[Song Zhi Du]";
- mes "First, I shall mix a poison";
- mes "extraced from Venom Canine";
- mes "with a foreign liquid named";
- mes "Karvodailnirol.";
- next;
- specialeffect 12;
- mes "[Song Zhi Du]";
- mes "Then, I add Green Herb extract,";
- mes "poison extracted from Bee Sting and";
- mes "a Large Jellopy into the liquid!";
- mes "Finally, I must heat them all!";
- next;
- specialeffect 124;
- specialeffect 20;
- mes "[Song Zhi Du]";
- mes "Finally, I have to carefully heat";
- mes "the mixture and collect it all into";
- mes "a Potion Bottle.";
- next;
- mes "[Song Zhi Du]";
- mes "Now I've got to do this just";
- mes "right. This is a very delicate";
- mes "procedure...";
- next;
- specialeffect 17;
- emotion 23;
- mes "[Song Zhi Du]";
- mes "No!! I failed again! ^656565*Sigh...*^000000 And";
- mes "I spent a long time preparing all";
- mes "of those materials...";
- set QL_POISONKING,10;
- close;
-
-s_WheresJellopy:
- //Made up Dialog
- emotion 0;
- mes "[Song Zhi Du]";
- mes "I was told by the lady at";
- mes "the gate that she gave you";
- mes "the ^0000FFLarge Jellopy^000000...";
- mes "Yet you don't have it?";
- next;
- mes "[Song Zhi Du]";
- mes "I can't make the poison without";
- mes "it. You'll have to find a new one";
- mes "somehow.";
- close;
-
-s_NotSure:
- mes "[Song Zhi Du]";
- mes "I'm not sure what went wrong.";
- mes "Hmm, would you please help me";
- mes "again? I've used all the materials";
- mes "from last time.";
- next;
- mes "[Song Zhi Du]";
- mes "^0000FF4 Bee Sting^000000,";
- mes "^0000FF10 Venom Canine^000000,";
- mes "^0000FF10 Empty Potion Bottle^000000,";
- mes "^0000FF30 Green Potion^000000 and";
- mes "^0000FF1 Large Jellopy^000000.";
- next;
- mes "[Song Zhi Du]";
- mes "That's everything I'll need.";
- mes "I would apologize, but since you've";
- mes "shown that you'll help carry out my";
- mes "revenge, I know you'll understand.";
- set QL_POISONKING,11;
- close;
-
-s_MaterialCheck:
- if(countitem(939) < 4 || countitem(937) < 10 || countitem(1093) < 10 || countitem(506) < 30 || countitem(7126) < 1 )goto s_NEnoughItems2;
- delitem 939,countitem(939); //Bee Sting
- delitem 937,countitem(937); //Venom Canine
- delitem 1093,countitem(1093); //Empty Potion Bottle
- delitem 506,countitem(506); //Green Potion
- delitem 7126,countitem(7126); //Large Jellopy
- mes "[Song Zhi Du]";
- mes "Oh! You brought";
- mes "me everything I need!";
- mes "I'm very impressed!";
- next;
- mes "[Song Zhi Du]";
- mes "You're the only one";
- mes "who actually understands how";
- mes "I feel. Thank you for gathering all";
- mes "of these ^0000FFmaterials^000000.";
- next;
- mes "[Song Zhi Du]";
- mes "Alright, now";
- mes "to create the poison.";
- mes "This is going to be tough.";
- mes "Here we go...";
- next;
- mes "[Song Zhi Du]";
- mes "First, I shall mix a poison";
- mes "extraced from Venom Canine";
- mes "with a foreign liquid named";
- mes "Karvodailnirol.";
- next;
- specialeffect 12;
- mes "[Song Zhi Du]";
- mes "Then, I add Green Herb extract,";
- mes "poison extracted from Bee Sting and";
- mes "a Large Jellopy into the liquid!";
- mes "Finally, I must heat them all!";
- next;
- specialeffect 124;
- specialeffect 20;
- mes "[Song Zhi Du]";
- mes "Finally, I have to carefully heat";
- mes "the mixture and collect it all into";
- mes "a Potion Bottle.";
- next;
- mes "[Song Zhi Du]";
- mes "^111111*Phew...*";
- mes "Did...";
- mes "Did I make it?";
- next;
-
- set @PKSuccessRate,rand(1,1000);
- if(@PKSuccessRate > 700)
- {
- emotion 23;
- specialeffect 20;
- mes "[Song Zhi Du]";
- mes "Hahaha~!";
- mes "Success!";
- mes "It works!";
- mes "I finally created it!";
- mes "Mwahahahahahaha!";
- next;
- mes "[Song Zhi Du]";
- mes "Muhahahahaha!";
- next;
- mes "[Song Zhi Du]";
- mes "Muhahahahaha!";
- mes "Hahahahahahahahahahahaha!";
- next;
- mes "[Song Zhi Du]";
- mes "I made it!";
- mes "I made it!";
- mes "Now, revenge will be mine!";
- next;
- mes "[Song Zhi Du]";
- mes "Hahaha! Now, please";
- mes "take this bottle. But be careful.";
- mes "Even if you smell it just a little,";
- mes "it can cause your body to";
- mes "decompose, leading to death.";
- getitem 678,2; //Poison Bottle
- set QL_POISONKING,12;
- close;
- }
- else
- {
- emotion 23;
- specialeffect 17;
- mes "[Song Zhi Du]";
- mes "NO! I... I've failed again! And I";
- mes "spent a long time getting";
- mes "everything ready...";
- close;
- }
-
-s_NEnoughItems2:
- //Made up dialog
- mes "[Song Zhi Du]";
- mes "You seem to be missing some";
- mes "of the materials that I need,";
- mes "don't come back until you get";
- mes "them!";
- next;
- mes "[Song Zhi Du]";
- mes "I will need the following:";
- mes "^0000FF4 Bee Sting^000000,";
- mes "^0000FF10 Venom Canine^000000,";
- mes "^0000FF10 Empty Potion Bottle^000000,";
- mes "^0000FF30 Green Potion^000000 and";
- mes "^0000FF1 Large Jellopy^000000.";
- close;
-
-s_LordDie:
- mes "[Song Zhi Du]";
- mes "Hahahaha...!";
- mes "Now, time has come.";
- mes "With this poison, Louyang's";
- mes "lord will be cast into hell!";
- next;
- mes "[Song Zhi Du]";
- mes "If they lied about my master,";
- mes "then I'll simply make their lies";
- mes "into truth. Then, my master";
- mes "won't feel victimized!";
- next;
- mes "[Song Zhi Du]";
- mes "Lord Bai Long!";
- mes "You will die!";
- mes "Ha HA HA HA HA!";
- next;
- mes "[Song Zhi Du]";
- mes "Muhahahahaha!";
- mes "Hahaha...Haha..hahaha..haha..hahah";
- mes "ahaha...mmmmuhahahahahahahahahaha!!";
- next;
- mes "[Song Zhi Du]";
- mes "Muhahahahahaha!";
- mes "............";
- next;
- mes "[Song Zhi Du]";
- mes "Ah, forgive me.";
- mes "I was overly excited.";
- mes "Yes, I must calm down...";
- next;
- mes "[Song Zhi Du]";
- mes "Now, I have one last favor to ask";
- mes "of you. Please sneak into the";
- mes "Castle of the Dragon.";
- next;
- mes "[Song Zhi Du]";
- mes "I want you to put this poison some";
- mes "place where Lord Bai Long might";
- mes "stay. But be careful, the castle";
- mes "has a lot of security.";
- next;
- mes "[Song Zhi Du]";
- mes "Still, you're an adventurer from";
- mes "Rune-Midgard. You've probably had";
- mes "challenges like this before, so I'm";
- mes "sure you'll find a way.";
- next;
- mes "[Song Zhi Du]";
- mes "Anyway, I'm sure my master";
- mes "will be happy to know that";
- mes "I finally created the ^0000FFpoison";
- mes "he wished to create^000000!";
- next;
- mes "[Song Zhi Du]";
- mes "Hahaha...!";
- mes "Master, I did it!";
- mes "Your disciple Song Zhi Du made the";
- mes "world's deadliest poison for you!";
- set QL_POISONKING,13;
- close;
-
-s_Security:
- mes "[Song Zhi Du]";
- mes "Remember...";
- mes "The Castle of the Dragon";
- mes "is under heavy surveillance.";
- mes "I guess Lord Bai Long is";
- mes "insecure. Heh heh.";
- next;
- mes "[Song Zhi Du]";
- mes "Anyways, I hope you'll be";
- mes "really careful. When you go in,";
- mes "don't forget to use this poison";
- mes "somewhere the Lord Bai Long";
- mes "can ingest it.";
- next;
- mes "[Song Zhi Du]";
- mes "Anyway, I'm sure my master";
- mes "will be happy to know that";
- mes "I finally created the ^0000FFpoison";
- mes "he wished to create^000000!";
- next;
- mes "[Song Zhi Du]";
- mes "Hahaha...!";
- mes "Master, I did it!";
- mes "Your disciple Song Zhi Du made the";
- mes "world's deadliest poison for you!";
- next;
- mes "[Song Zhi Du]";
- mes "Leave now,";
- mes "my friend!";
- mes "For my revenge!";
- mes "Go and kill Lord Bai Long!";
- close;
-
-s_CameBack:
- mes "[Song Zhi Du]";
- mes "Ah!";
- mes "You came back!";
- next;
- mes "[Song Zhi Du]";
- mes "Ah yes.";
- mes "All I have to do now";
- mes "is wait and hear news";
- mes "of Lord Bai Long's death.";
- next;
- mes "[Song Zhi Du]";
- mes "Thank you so much, my friend.";
- mes "You've satisfied my old grudge.";
- next;
- mes "[Song Zhi Du]";
- mes "Now, I am getting tired.";
- mes "Let me rest... Take care, my";
- mes "friend, and travel in safety.";
- next;
- mes "[Song Zhi Du]";
- mes "But before you go, let me give you";
- mes "some poison and a medicinal pill.";
- mes "I made these with the leftover";
- mes "materials and medicine in the";
- mes "storage.";
- next;
- mes "[Song Zhi Du]";
- mes "Please take the";
- mes "medicine pill";
- mes "right away.";
- next;
- mes "^3131FFYou swallowed a strange pill";
- mes "that shines with a gold color.";
- mes "it tastes bitter...";
- next;
- mes "^3131FFThe nasty taste lingers in your";
- mes "mouth but then you feel a great";
- mes "warmth flowing throughout your";
- mes "body. Eventually, you pass out.";
- close2;
- set QL_POISONKING,30;
- set QL_POISONPATH,0;
- getitem 678,3;
- if(BaseLevel < 56)set BaseExp,BaseExp+8909;
- else if(BaseLevel > 55 && BaseLevel < 61)set BaseExp,BaseExp+10213;
- else if(BaseLevel > 60 && BaseLevel < 66)set BaseExp,BaseExp+17684;
- else if(BaseLevel > 65 && BaseLevel < 71)set BaseExp,BaseExp+25411;
- else if(BaseLevel > 70 && BaseLevel < 76)set BaseExp,BaseExp+68757;
- else if(BaseLevel > 75 && BaseLevel < 81)set BaseExp,BaseExp+128246;
- else if(BaseLevel > 80 && BaseLevel < 86)set BaseExp,BaseExp+142340;
- else if(BaseLevel > 85 && BaseLevel < 91)set BaseExp,BaseExp+152052;
- else if(BaseLevel > 90)set BaseExp,BaseExp+366786;
- warp "louyang.gat",270,136;
- end;
-
-s_Proud:
- mes "[Song Zhi Du]";
- mes "Nagash Arses is also the name of";
- mes "the Poison King in a legend of";
- mes "Arcturus. There's good reasons for";
- mes "my master to be proud of hise name!";
- close;
-
-s_Told:
- mes "[Song Zhi Du]";
- mes "Ah...";
- mes "Welcome.";
- mes "My master told";
- mes "me everything.";
- next;
- mes "[Song Zhi Du]";
- mes "Somehow, I feel relieved, but sorry";
- mes "at the same time. Still, now I can";
- mes "forget everything that's happened";
- mes "in the past.";
- next;
- mes "[Song Zhi Du]";
- mes "Now, I've decided to focus more on";
- mes "my medical studies so that I can";
- mes "really save as many lives as I can.";
- mes "I'm sorry I've been so rude to you";
- mes "before.";
- next;
- mes "[Song Zhi Du]";
- mes "Also, I hope you will";
- mes "take these, since I don't";
- mes "need them any longer.";
- getitem 678,5; //Poison Bottle
- set QL_POISONKING,18;
- set QL_POISONPATH,0;
- next;
- mes "[Song Zhi Du]";
- mes "Thank you";
- mes "once again, friend.";
- mes "Now if you'll excuse me,";
- mes "i have many things to do...";
- close;
-
-s_Busy:
- mes "^3131FFSong Zhi Du is busily engaged with";
- mes "organizing medicinal herbs. The";
- mes "faint look of sadness that used to";
- mes "be on his face now seems drained.";
- next;
- mes "^3131FFStill, from his movements and the";
- mes "pace at which he is working, you";
- mes "can tell that he loves what he is";
- mes "doing. It seems that Song Zhi Du";
- mes "has finally found his life's path.";
- close;
-
-s_NoGoodIdea:
- mes "[Song Zhi Du]";
- mes "...................";
- next;
- mes "^3131FFSong Zhi Du looks blankly at the";
- mes "ceiling. With his revenge, it seems";
- mes "he's lost his motivation in life.";
- mes "Was it a good idea to help him,";
- mes "after all?";
- next;
- mes "^3131FFBy hearsay, the poisoned drink";
- mes "didn't work so well, as a Thief";
- mes "from a foreign land actually stole";
- mes "the bottle.";
- close;
-
-}
-
-lou_in02.gat,122,38,4 script Poison King 824,{
-
- if(QL_POISONKING > 16 && QL_POISONKING != 30)goto s_Proud;
- if(QL_POISONKING == 16)goto s_Letter;
- if(QL_POISONKING == 15)goto s_Hope;
- if(QL_POISONKING == 14 && QL_POISONPATH > 1)goto s_Happened;
- if(QL_POISONKING == 30)goto s_Emo;
- if(QL_POISONPATH == 2)goto s_StopHim;
- if(QL_POISONKING == 13 || QL_POISONKING == 14)goto s_MetDisciple;
- mes "[Nagash Arses]";
- mes "It's been 40 years since I came";
- mes "here. Hahaha, but it doesn't feel";
- mes "like it's been that long.";
- next;
- mes "[Nagash Arses]";
- mes "In the past, I was one of the";
- mes "most renowned experts in the use";
- mes "of poison. I even created a martial";
- mes "art based on it's use, and formed my";
- mes "own martial arts organization.";
- next;
- mes "[Nagash Arses]";
- mes "Now, those memories";
- mes "don't even seem real";
- mes "anymore. This poem is";
- mes "all I can remember...";
- next;
- mes "[Nagash Arses]";
- mes "As I lay in bed looking";
- mes "up at the moonlight,";
- mes " ";
- mes "It looks like the ";
- mes "frost on the ground.";
- next;
- mes "[Nagash Arses]";
- mes "I lift head up to look";
- mes "at the bright moon,";
- mes " ";
- mes "I lower my head";
- mes "feeling homesick.";
- if(!QL_POISONKING)close;
- next;
- if(QL_POISONKING > 1)goto s_Menu2;
- menu "Grin at him.",-,"Lament on his grief.",s_Grief,"Reprove him.",s_Reprove,"Listen to the poem again.",s_Again,"Show him a sad look.",s_Sad;
-
- mes "[Nagash Arses]";
- mes "Yeah, I don't blame you.";
- mes "I know I look stupid. Legally,";
- mes "I'm a criminal after all.";
- mes "I don't have any friends and";
- mes "there's no one I can trust.";
- close;
-
-s_Grief:
- mes "[Nagash Arses]";
- mes "How can you sympathize?";
- mes "I doubt anyone has had";
- mes "experiences that are";
- mes "much worse than mine...";
- close;
-
-s_Reprove:
- mes "What--? I haven't wrongers you in any";
- mes "way! Why must you be so mean to an";
- mes "old man? You don't even know half";
- mes "of what I've gone though.";
- close;
-
-s_Again:
- mes "[Nagash Arses]";
- mes "As I lay in bed looking";
- mes "up at the moonlight,";
- mes " ";
- mes "It looks like the ";
- mes "frost on the ground.";
- next;
- mes "[Nagash Arses]";
- mes "I lift head up to look";
- mes "at the bright moon,";
- mes " ";
- mes "I lower my head";
- mes "feeling homesick.";
- close;
-
-s_Sad:
- mes "[Nagash Arses]";
- mes "Do you miss your hometown";
- mes "as much as I do? I'm envious";
- mes "of you, youngster. You have";
- mes "the freedom to go";
- mes "wherever you want.";
- next;
- mes "[Nagash Arses]";
- mes "I'm a wanted criminal.";
- mes "Even if I were free to";
- mes "travel, I may not have";
- mes "the strength to try.";
- next;
- mes "[Nagash Arses]";
- mes "Let's not talk about this any";
- mes "longer. It's reminded me of";
- mes "my worst memories.";
- next;
- mes "[Nagash Arses]";
- mes "I'm too old to remember anything.";
- mes "Ha ha ha. Maybe if I saw something";
- mes "related to poison, I might remember";
- mes "something.";
- next;
- mes "[Nagash Arses]";
- mes "...";
- next;
- mes "[Nagash Arses]";
- mes "No, no...";
- mes "I think I'm too old";
- mes "to remember anything.";
- mes "Anything at all.";
- set QL_POISONKING,2;
- close;
-
-s_Menu2:
- menu "Ask about the poem.",-,"Ask about his hometown.",s_Hometown,"Ask him about use of poison.",s_Poison,"Ask about his situation.",s_Situation;
-
- mes "[Nagash Arses]";
- mes "Ah, have you";
- mes "heard of this poem?";
- mes "As I grow older, my";
- mes "memory also drows worse,";
- mes "but I really like this poem";
- mes "and don't want to forget it.";
- next;
- mes "[Nagash Arses]";
- mes "I hope you don't";
- mes "mind helping me";
- mes "memorize this poem...";
- next;
- set @PKrand,rand(0,2);
- if(@PKrand == 0)
-{
- mes "[Nagash Arses]";
- mes "^3131FF'As I lay ^000000[ ]^3131FF looking up at the";
- mes "moonlight.'^000000 In this first line,";
- mes "what word should be in [ ]?";
- next;
- menu "on the ground",s_1,"with you",s_1,"in bed",-,"in the stars",s_1;
- set @PKtest,@PKtest+1;
-
-s_1:
- mes "[Nagash Arses]";
- mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
- mes "ground.'^000000 In the second line, which";
- mes "word should be in [ ]?";
- next;
- menu "Frost",-,"Dew",s_2,"Pebbles",s_2,"Snow",s_2;
- set @PKtest,@PKtest+1;
-
-s_2:
- mes "[Nagash Arses]";
- mes "Now to see if you really";
- mes "understand the poem. It's no";
- mes "use to just know the words. They";
- mes "must be a part of you as well.";
- next;
- mes "[Nagash Arses]";
- mes "How would you describe the overall";
- mes "mood and tone of the speaker of";
- mes "this poem?";
- next;
- menu "Romantic",s_3,"Wistful",s_3,"Regretful",-,"Passionate",s_3;
- set @PKtest,@PKtest+1;
-
-s_3:
- set @PKrand2,rand(0,1);
- if(!@PKrand2)
- {
- mes "[Nagash Arses]";
- mes "What do you think is the major";
- mes "theme of this poem?";
- next;
- menu "Tragedy",s_4,"Seperation",-,"Love",s_4,"Revenge",s_4,"Buddy Cop Film",s_4;
- }
- if(@PKrand2)
- {
- mes "[Nagash Arses]";
- mes "According to the poem,";
- mes "where is the location";
- mes "of the speaker as he is";
- mes "gazing at the moon?";
- next;
- menu "In his hometown",s_4,"In jail",s_4,"In the depths of the cosmos.",s_4,"In bed",-;
- }
- set @PKtest,@PKtest+1;
-
-s_4:
- mes "[Nagash Arses]";
- mes "Ha ha ha! You undestand this poem";
- mes "well! Now, would you repeat the";
- mes "first line for me again?";
- next;
- menu "When I lay in bed looking up at the moonlight",s_5,"When I lay in bed thinking of the moonlight",s_5,"As I lay in bed looking up at the moonlight",-,"As I lay in bed thinking of the moonlight",s_5;
- set @PKtest,@PKtest+1;
-
-s_5:
-}
- if(@PKrand == 1)
-{
- mes "[Nagash Arses]";
- mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
- mes "ground.'^000000 In the second line, which";
- mes "word should be in [ ]?";
- next;
- menu "Frost",-,"Dew",s_6,"Pebbles",s_6,"Snow",s_6;
- set @PKtest,@PKtest+1;
-
-s_6:
- mes "[Nagash Arses]";
- mes "^3131FFI lower my head feeling ^000000[ ]^3131FF.^000000'";
- mes "Which word should be in [ ]?";
- next;
- menu "Homesick",-,"Drowsy",s_7,"Loneliness",s_7,"Heartbroken",s_7;
- set @PKtest,@PKtest+1;
-
-s_7:
- mes "[Nagash Arses]";
- mes "Now to see if you really";
- mes "understand the poem. It's no";
- mes "use to just know the words. They";
- mes "must be a part of you as well.";
- next;
- mes "[Nagash Arses]";
- mes "in the first two lines, what";
- mes "is being linked by the poet?";
- next;
- menu "Bed and ground.",s_8,"Frost and hometown.",-,"Gloomy.",s_8,"Smokey.",s_8,"Moonlight and Frost.",s_8;
- set @PKtest,@PKtest+1;
-
-s_8:
- mes "[Nagash Arses]";
- mes "In this land, the image of the moon";
- mes "often appears in poems expressing";
- mes "seperation, longing and";
- mes "homesickness. Why would gazing at";
- mes "the moon offer comfort?";
- next;
- menu "The rabbit on the moon grants wishes.",s_9,"It's sheer beauty eases anxiety",s_9,"Because it wanes and waxes",s_9,"All people and places share the same moon",-;
- set @PKtest,@PKtest+1;
-
-s_9:
- mes "[Nagash Arses]";
- mes "Ha ha ha! You understand this poem";
- mes "well! Now, would you repeat the";
- mes "third line for me again?";
- next;
- menu "I look upon the bright moon",s_10,"I lift my head to look at the bright moon.",-,"I turn my head to look at the bright moon.",s_10,"I face the bright moon.",s_10;
- set @PKtest,@PKtest+1;
-
-s_10:
-}
- if(@PKrand == 2)
-{
- mes "[Nagash Arses]";
- mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
- mes "ground.'^000000 In the second line, which";
- mes "word should be in [ ]?";
- next;
- menu "Frost",-,"Dew",s_11,"Pebbles",s_11,"Snow",s_11;
- set @PKtest,@PKtest+1;
-
-s_11:
- mes "[Nagash Arses]";
- mes "^3131FF'I lift my ^000000[ ]^3131FF to look at the";
- mes "bright moon.'^000000 In the third line,";
- mes "which word should be in [ ]?";
- next;
- menu "eyes",s_12,"head",-,"gaze",s_12,"sights",s_12;
- set @PKtest,@PKtest+1;
-
-s_12:
- mes "[Nagash Arses]";
- mes "Now to see if you really";
- mes "understand this poem. It's no";
- mes "use to just know the words. They";
- mes "must be a part of you as well.";
- next;
- mes "[Nagash Arses]";
- mes "What do you think is the major";
- mes "theme of this poem?";
- next;
- menu "Tragedy",s_13,"Seperation",-,"Love",s_13,"Revenge",s_13,"Buddy Cop Film",s_13;
- set @PKtest,@PKtest+1;
-
-s_13:
- set @PKrand2,rand(0,1);
- if(!@PKrand2)
- {
- mes "[Nagash Arses]";
- mes "What might be one reason why the";
- mes "bright moonlight looks like frost";
- mes "on the ground to the poet?";
- next;
- menu "He's looking though a frosty window",s_14,"A bright moon glimmers like icicles",-,"He's homesick, so the moonlight looks cold.",s_14,"It's called 'Poetic Lisense.'",s_14;
- }
- if(@PKrand2)
- {
- mes "[Nagash Arses]";
- mes "Although this poem is only four";
- mes "lines long, it's structure can be";
- mes "easily classified. How would you";
- mes "describe this poem's structure?";
- next;
- menu "Why it's a sonnet",s_14,"It's a prose with erratic caesuras",s_14,"It's a quatrain of course",-,"Lambic Pentameter?",s_14;
- }
- set @PKtest,@PKtest+1;
-
-s_14:
- mes "[Nagash Arses]";
- mes "Ha ha ha! You understand this poem";
- mes "well! Now, would you repeat the";
- mes "last line for me again?";
- next;
- menu "I cry for my home town.",s_15,"I lower my head feeling homesick.",-,"I miss my home town",s_15,"I sob feeling homesick.",s_15;
- set @PKtest,@PKtest+1;
-
-s_15:
-}
- if(@PKtest == 5 && QL_POISONKING == 2)set QL_POISONKING,3;
- mes "[Nagash Arses]";
- mes "Thank you for yout time,";
- mes "youngster. Oh, and this is";
- mes "an old, famous poem written";
- mes "by Li Tai Bai. You know that,";
- mes "don't you?";
- close;
-
-s_Hometown:
- mes "[Nagash Arses]";
- mes "Are you asking me";
- mes "about my hometown...?";
- mes "As a Rune-Midgardian,";
- mes "I'm sure you've at least";
- mes "heard of Morroc...";
- next;
- mes "[Nagash Arses]";
- mes "A city built in the middle of the";
- mes "desert, its founders had to combat";
- mes "the harsh and unforgiving forces of";
- mes "nature everyday.";
- next;
- mes "[Nagash Arses]";
- mes "Yeah, the blazing sun never";
- mes "seems to leave, and it's a dry,";
- mes "desert area, but people still";
- mes "manage to live there.";
- next;
- mes "[Nagash Arses]";
- mes "Ah~ I miss Morroc, my hometown.";
- mes "I used to be a member of the";
- mes "Assassin organization known as the";
- mes "'Canine of Desert.' Long ago, I was";
- mes "their poison expert.";
- next;
- if(QL_POISONKING == 3)goto s_AltMenu;
- menu "Tell him news of Morroc",s_News,"Info about 'Canine of Desert'",s_Canine;
-
-s_AltMenu:
- menu "Tell him news of Morroc",s_News,"Info about 'Canine of Desert'",s_Canine,"Just listen",s_Listen;
-
-s_News:
- mes "[Nagash Arses]";
- mes "Hm...?";
- mes "Is there anything";
- mes "you want to say?";
- next;
- mes "[" + strcharinfo(0) +"]";
- mes "I have news";
- mes "of Morroc...";
- input @PKstr$;
- mes "[" + strcharinfo(0) +"]";
- mes @PKstr$;
- next;
- mes "[Nagash Arses]";
- mes "I see...";
- mes "Thank you for";
- mes "telling me that.";
- close;
-
-s_Canine:
- mes "[Nagash Arses]";
- mes "I just told you what the 'Canine";
- mes "of Desert' is. If you can't remember what";
- mes "I just told you, it's no use for me";
- mes "to explain further. You go ahead";
- mes "and tell me what it is.";
- next;
- input @PKstr$;
- mes "[Nagash Arses]";
- mes "Well, I suppose I can't blame you";
- mes "for not knowing or remembering.";
- mes "When you get the chance, find";
- mes "someone wearing a purple suit...";
- next;
- mes "[Nagash Arses]";
- mes "Any Assassin worth his salt should";
- mes "know what the 'Canine of Desert'";
- mes "is.";
- close;
-
-s_Listen:
- mes "[Nagash Arses]";
- mes "I tried Many things to develop my";
- mes "poison skills when I was young.";
- mes "I tried to extract poison from";
- mes "Muka's needles and from purple";
- mes "mushrooms. Eventually, I became";
- mes "an expert of toxins from my";
- mes "efforts. ";
- next;
- mes "[Nagash Arses]";
- mes "One time I even injected";
- mes "a poison into my own body";
- mes "to fully test it. Yeah...";
- mes "It almost killed me.";
- next;
- mes "[Nagash Arses]";
- mes "I was recognized as the man who";
- mes "was most highly skilled in the use";
- mes "of poison in the 'Canine of";
- mes "Desert,' and I was sent on the most";
- mes "crucial and dangerous missions.";
- next;
- mes "[Nagash Arses]";
- mes "One day, I was hired by the Alberta";
- mes "Merchant Guild to assassinate an";
- mes "enemy that had been threatening";
- mes "them. However, I never got to";
- mes "complete that missions.";
- next;
- mes "[Nagash Arses]";
- mes "While I was on the ship to proceed";
- mes "with my mission, we encountered";
- mes "heavy wind and waves, and the ship";
- mes "sank. I believe I was the only";
- mes "survivor of that accident.";
- next;
- mes "[Nagash Arses]";
- mes "I was floated helplessly on the";
- mes "ocean and somehow managed";
- mes "to arrive here, in Louyang. That";
- mes "was forty years ago.";
- next;
- mes "[Nagash Arses]";
- mes "It seemed that my arrival was";
- mes "rather timely. Louyang was intruded";
- mes "by huge mobs of dangerous monsters";
- mes "that were able to infiltrate";
- mes "the Castle of the Dragon.";
- next;
- mes "[Nagash Arses]";
- mes "Since I was one of the best";
- mes "assassins of the 'Canine of";
- mes "Desert.’ I did far more than my";
- mes "share fair of monster killing.";
- next;
- mes "[Nagash Arses]";
- mes "It was on the battlefield that";
- mes "I met Bai Long who is now the Lord of";
- mes "this town. But back then, he was";
- mes "known as the 'Street Knight.'";
- next;
- mes "[Nagash Arses]";
- mes "I remember seeing him surrounded";
- mes "by enemies, and I dove into thick";
- mes "of battle to keep him from getting";
- mes "killed. We fought back to back and";
- mes "managed to stay alive back then.";
- next;
- mes "[Nagash Arses]";
- mes "You have to understand that it's";
- mes "not easy to let someone back you";
- mes "up in battle unless there's a solid";
- mes "trust. Those sights... where the";
- mes "greatest moments in my life.";
- next;
- mes "[Nagash Arses]";
- mes "Sadly, Many of our comrades,";
- mes "all of them respectable and highly";
- mes "skilled in martial artists, fell in";
- mes "battle. The number of monsters we";
- mes "had to contend with was just";
- mes "overwhelming.";
- next;
- mes "[Nagash Arses]";
- mes "Still, I manage to continue my";
- mes "poison research, even during those";
- mes "tough times. I studied medicine in";
- mes "this town and was able to use that";
- mes "knowledge to enhance my";
- mes "understanding of poisons.";
- next;
- mes "[Nagash Arses]";
- mes "I created a new skill based on all";
- mes "of my knowledge, and learned how";
- mes "to put poison on weapons.";
- next;
- mes "[Nagash Arses]";
- mes "I even learned martial arts in";
- mes "Louyang, and combined that";
- mes "knowledge with my poison expertise";
- mes "to create my own unique fighting";
- mes "style.";
- next;
- mes "[Nagash Arses]";
- mes "Well, that's my story.";
- mes "But now, I just miss my";
- mes "home town. I miss the heat";
- mes "of the desert, and the glare";
- mes "of the blazing sun.";
- set QL_POISONKING,4;
- close;
-
-s_Poison:
- mes "[Nagash Arses]";
- mes "Did you just say you";
- mes "want to learn about the";
- mes "use of poison?";
- next;
- mes "[Nagash Arses]";
- mes "Why would you want";
- mes "to learn about it?";
- mes "Even if I wanted to";
- mes "teach, I'm too old to";
- mes "remember everything";
- mes "clearly...";
- if(QL_POISONKING > 4)goto s_Disciple;
- close;
-
-s_Disciple:
- next;
- mes "[Nagash Arses]";
- mes "Go find my last disciple,";
- mes "^0000FFSong Zhi Du^000000, as he may tell you";
- mes "something useful. He's working at";
- mes "the doctor's office. If it weren't";
- mes "for him, I'd be starving now.";
- if(QL_POISONKING == 5)set QL_POISONKING,6;
- close;
-
-s_Situation:
- if(QL_POISONKING == 4)goto s_Situation2;
- mes "[Nagash Arses]";
- mes "I...";
- mes "I don't want";
- mes "to talk about that.";
- mes "Let's not talk about it.";
- close;
-
-s_Situation2:
- mes "[Nagash Arses]";
- mes "You're asking me how";
- mes "things came to be like";
- mes "this? Life used to be good.";
- next;
- mes "[Nagash Arses]";
- mes "Ah I told you, I distinguished";
- mes "myself in the battles with";
- mes "monsters. I was rewarded with";
- mes "Louyang citizenship and given";
- mes "gifts of money.";
- next;
- mes "[Nagash Arses]";
- mes "I was invited to join a martial";
- mes "arts organization that specialized";
- mes "in the use of poison. I joined";
- mes "them, excited about further";
- mes "broadening my knowldege.";
- next;
- mes "[Nagash Arses]";
- mes "I was stunned by the enormous body";
- mes "of knowledge about toxins that they";
- mes "provided. I tried to learn as much";
- mes "as I could so I could develop my";
- mes "own, unique poisoning skills.";
- next;
- mes "[Nagash Arses]";
- mes "As I studied with them, together we";
- mes "started to clear the town of the";
- mes "remaining monsters. Can you guess";
- mes "the results of our effors to clean";
- mes "up the city?";
- next;
- menu "..??",-,"It must have been good.",s_Good,"I guess it was okay.",s_Okay,"I don't know, but how did it go?",s_Dunno;
-
- mes "[Nagash Arses]";
- mes "Did you even listen to me? It's no";
- mes "use talking to you if you don't";
- mes "even care about what I have to";
- mes "say.";
- next;
- goto s_False;
-
-s_Good:
- mes "[Nagash Arses]";
- mes "You're right!";
- mes "We got rid of every";
- mes "single monster in the city!";
- next;
- goto s_Right;
-
-s_Okay:
- mes "[Nagash Arses]";
- mes "Just okay...?";
- mes "I don't think you realized how";
- mes "powerful we were back then! Eh...";
- next;
- goto s_False;
-
-s_Dunno:
- mes "[Nagash Arses]";
- mes "We got rid of every single monster";
- mes "in the city!";
- next;
-
-s_Right:
- mes "[Nagash Arses]";
- mes "We managed to eliminate every";
- mes "monster that was wandering around";
- mes "Louyang. At the time, we were the";
- mes "only people brave enough to take on";
- mes "this sort of task.";
- next;
- mes "[Nagash Arses]";
- mes "Unfortunately, other martial arts";
- mes "organizations grew envious of our";
- mes "success, insisting that we were";
- mes "dishonorable for using poison to";
- mes "attack our enemies.";
- next;
- mes "[Nagash Arses]";
- mes "Although we can accept criticism";
- mes "for our use of poison, we were";
- mes "finally blamed for something we";
- mes "never would have done.";
- next;
- mes "[Nagash Arses]";
- mes "Someone put poison into a meal";
- mes "which was eaten by a son of the";
- mes "lord and then falsely accused us!";
- next;
- mes "[Nagash Arses]";
- mes "in the end, our organization was";
- mes "disbanded and I was put in jail.";
- mes "I suffered through much to escape";
- mes "from prison...";
- next;
- mes "[Nagash Arses]";
- mes "However, because of all the";
- mes "injuries I've had to endure in jail";
- mes "and in my escape attempts,";
- mes "I can no longer use my";
- mes "martial arts.";
- next;
- mes "[Nagash Arses]";
- mes "Even to this day, the police are";
- mes "hounding after me. I really want to";
- mes "tell the lord of Louyang that I'm";
- mes "innocent, but it may be";
- mes "too late now...";
- set QL_POISONKING,5;
- close;
-
-s_False:
- mes "[Nagash Arses]";
- mes "Sorry for keeping you from what you";
- mes "wanted to do. Take care of";
- mes "yourself, youngster.";
- close;
-
-s_MetDisciple:
- mes "[Nagash Arses]";
- mes "Aren't you the youngster";
- mes "I talked to a while ago?";
- mes "Did you get a chance";
- mes "to meet my disciple?";
- mes "How was he?";
- next;
- mes "[Nagash Arses]";
- mes "He was sick all the time when he";
- mes "was young, so he worried me a lot.";
- mes "But now I'm proud of him and he's";
- mes "doing as well as just any other fine";
- mes "young man.";
- next;
- mes "[Nagash Arses]";
- mes "I am living only for him,";
- mes "and hope that he becomes a great";
- mes "healer someday. Recently, I've";
- mes "found that my sole comfort is in";
- mes "treating diseases for other";
- mes "people...";
- next;
- mes "[Nagash Arses]";
- mes "By the way...";
- mes "You look pale...";
- mes "Did something happen?";
- next;
- menu "Nothing",-,"I want to talk about your disciple",s_TalkDisciple,"I don't feel good.",s_DontFeelG;
-
- mes "[Nagash Arses]";
- mes "Oh...";
- mes "I see...";
- mes "But take care";
- mes "of yourself.";
- next;
- mes "[Nagash Arses]";
- mes "You better enjoy your physical";
- mes "strength when you're young. When";
- mes "you're my age, it's tough to regain";
- mes "your health once you lose it.";
- close;
-
-s_TalkDisciple:
- mes "[Nagash Arses]";
- mes "Did something happen to him?";
- mes "I've been worried since he hasn't";
- mes "come to visit me since you last";
- mes "came to speak with me.";
- next;
- if(QL_POISONPATH == 1)goto s_BeFine;
- if(countitem(678))menu "Give him Poison Bottle.",s_Bottle,"Cancel and go to 'Song Zhi Du'.",-;
- else
- {
- mes "[" + strcharinfo(0) + "]";
- mes "...Nothing much.";
- close;
- }
-
- mes "[" + strcharinfo(0) + "]";
- mes "...Nothing much.";
- next;
-s_BeFine:
- mes "[Nagash Arses]";
- mes "Hmm...?";
- mes "I guess you don't know what is";
- mes "going on. I've heard some bad";
- mes "rumors about him, which is why I'm";
- mes "asking.";
- next;
- mes "[Nagash Arses]";
- mes "I hope he'll be fine.";
- mes "After all, he's truly";
- mes "kind at heart.";
- close;
-
-s_Bottle:
- delitem 678,1;
- mes "[Nagash Arses]";
- mes "Huh!?";
- mes "Isn't this...!?";
- next;
- mes "[Nagash Arses]";
- mes "I've dreamed of creating";
- mes "a poison of such potency!";
- mes "W-where did you find this?";
- next;
- menu "It's common nowadays.",-,"Explain to him what happened.",s_Explain;
-
- mes "[Nagash Arses]";
- mes "Really...?";
- mes "Then someone finally figured it out.";
- next;
- mes "[Nagash Arses]";
- mes "I shared all of my knowledge with";
- mes "others, so I guess a doctor might";
- mes "have figured out how to creat this.";
- next;
- mes "[Nagash Arses]";
- mes "^666666*Sigh...*^000000";
- mes "Now I feel depressed";
- mes "for some reason..";
- set QL_POISONPATH,1;
- close;
-
-s_Explain:
- mes "^3131FFYou tell Nagash Arses how";
- mes "Song Zhi Du created this Deadly";
- mes "Poison Bottle and his plan to get";
- mes "his revenge on the lord of";
- mes "Louyang.^000000";
- next;
- mes "[Nagash Arses]";
- mes "^666666*Sigh...*^000000";
- next;
- mes "[Nagash Arses]";
- mes "Will you...";
- mes "Will you excuse";
- mes "me for a second...?";
- set QL_POISONPATH,2;
- close;
-
-s_DontFeelG:
- mes "[Nagash Arses]";
- mes "Oh, you don't?";
- mes "Well, that can happen";
- mes "sometimes when you're";
- mes "in a foreign land for";
- mes "too long. I hope you";
- mes "feel better soon.";
- close;
-
-s_StopHim:
- mes "[Nagash Arses]";
- mes "Youngster...";
- mes "I beg of you.";
- mes "Please don not let him";
- mes "bring any harm to the lord.";
- next;
- mes "[Nagash Arses]";
- mes "If you cannot stop him,";
- mes "then please interrupt him";
- mes "from carrying out his plan.";
- next;
- mes "[Nagash Arses]";
- mes "I tried...";
- mes "To convince myself";
- mes "that what I had heard";
- mes "were just ugly rumors.";
- mes "I was wrong...";
- next;
- mes "[Nagash Arses]";
- mes "I am pretty sure he's been asking";
- mes "you, as well as others, for aid.";
- mes "Even if you do not agree to carry";
- mes "out his plan, I'm sure he will find";
- mes "someone to poison Lord Bai Long.";
- next;
- mes "[Nagash Arses]";
- mes "There is only one way he can";
- mes "poison the lord. He likes";
- mes "drinking, and has a favorite";
- mes "drink bottle he keeps with him";
- mes "all the time. You must get rid";
- mes "of his drink.";
- next;
- mes "[Nagash Arses]";
- mes "Please, I beg you.";
- mes "for my sake, as well";
- mes "as that of my disciple,";
- mes "Louyang's leader must live...";
- close;
-
-s_Emo:
- mes "^3131FFNagash Arses. He is no longer a";
- mes "well-known Assassin of the martial";
- mes "arts organization of which he was";
- mes "once master has lon since";
- mes "disbanded.";
- next;
- mes "^3131FFNow he is but a poor old man";
- mes "who is in anguish over his";
- mes "disciple. No matter what you say,";
- mes "he continues to talk about";
- mes "something totally unrelated, as if";
- mes "in a dream.";
- close;
-
-s_Happened:
- mes "[Nagash Arses]";
- mes "So...";
- mes "What..";
- mes "What happened?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "i made it.";
- next;
- emotion 6;
- mes "[Nagash Arses]";
- mes "You did?!";
- mes "Oh~ thank you,";
- mes "thank you so much!";
- next;
- mes "[Nagash Arses]";
- mes "Thank God I've";
- mes "lived this long.";
- mes "And... I just realized";
- mes "something while you were away.";
- next;
- mes "[Nagash Arses]";
- mes "This is a journal that I have been";
- mes "writing for 15 years about my";
- mes "feelings of guild, and what really";
- mes "happened in the past. I hope you";
- mes "can deliver this to the lord for";
- mes "me.";
- next;
- mes "^3131FFYou obtained";
- mes "^0000FFPoison King,";
- mes "Nagash Arses' Journal.";
- set QL_POISONKING,15;
- close;
-
-s_Hope:
- mes "[Nagash Arses]";
- mes "I hope you";
- mes "can deliver this";
- mes "to Lord Bai Long...";
- close;
-
-s_Letter:
- mes "^3131FFYou gave him the";
- mes "^0000FFLetter from Bai Long.^000000";
- next;
- mes "[Nagash Arses]";
- mes "What's this...?";
- next;
- mes "[Nagash Arses]";
- mes "Why, he's invited me";
- mes "to take the position of";
- mes "a government official!";
- mes "I'm truly grateful!";
- next;
- mes "[Nagash Arses]";
- mes "However, please let him";
- mes "know that I must respectfully";
- mes "decline his offer. I'm afraid that";
- mes "I may be a burden to him once";
- mes "again.";
- next;
- mes "[Nagash Arses]";
- mes "Please tell him that I wish to";
- mes "enjoy the rest of my life here.";
- mes "Also, there are people here";
- mes "who still need me...";
- next;
- mes "[Nagash Arses]";
- mes "Thank you, youngster.";
- mes "You've stopped my disciple";
- mes "and helped me make up";
- mes "with an old friend...";
- next;
- mes "^3131FFNagash Arses put his palm on your";
- mes "back, and you can feel his strength";
- mes "flowing into you.";
- percentheal 100,100;
- next;
- mes "^3131FFYou grow dizzy, but you can also feel";
- mes "like you're becoming more powerful";
- mes "and gaining experience.";
- if(BaseLevel < 56)set BaseExp,BaseExp+9000;
- else if(BaseLevel > 55 && BaseLevel < 61)set BaseExp,BaseExp+10500;
- else if(BaseLevel > 60 && BaseLevel < 66)set BaseExp,BaseExp+18684;
- else if(BaseLevel > 65 && BaseLevel < 71)set BaseExp,BaseExp+27411;
- else if(BaseLevel > 70 && BaseLevel < 76)set BaseExp,BaseExp+70757;
- else if(BaseLevel > 75 && BaseLevel < 81)set BaseExp,BaseExp+130246;
- else if(BaseLevel > 80 && BaseLevel < 86)set BaseExp,BaseExp+150340;
- else if(BaseLevel > 85 && BaseLevel < 91)set BaseExp,BaseExp+182052;
- else if(BaseLevel > 90)set BaseExp,BaseExp+406786;
- set QL_POISONKING,17;
- close2;
- warp "louyang.gat",270,136;
- end;
-
-s_Proud:
- mes "[Nagash Arses]";
- mes "My name, Nagash Arses,";
- mes "is also the name of the poison king";
- mes "in the legend of Arcturus. I have";
- mes "a good reason to be proud of my";
- mes "name!";
- close;
-
-}
-
-lou_in01.gat,101,124,0 script #LouSoldChk 139,100,0,{
- if(QL_POISONKING == 13)goto s_SoldChk;
- end;
-
-s_SoldChk:
- mes "[Soldier]";
- mes "Who goes there!";
- next;
- mes "^3131FFYou ran away as quickly as you";
- mes "could!";
- close2;
- warp "louyang.gat",218,249;
- end;
-
-}
-
-lou_in01.gat,115,163,0 script #LouSoldChk2 139,0,2,{
- if(QL_POISONKING == 13)goto s_SoldChk;
- end;
-
-s_SoldChk:
- mes "[Soldier]";
- mes "Who goes there!";
- next;
- mes "^3131FFYou escape before the soldier can";
- mes "find you.";
- close2;
- warp "louyang.gat",217,278;
- end;
-
-}
-
-lou_in01.gat,115,163,0 script #LouSoldChk3 139,25,0,{
- if(QL_POISONKING == 13)goto s_SoldChk;
- end;
-
-s_SoldChk:
- mes "[Soldier]";
- mes "Who goes there!";
- next;
- mes "^3131FFYou escape before the soldier can";
- mes "find you.";
- close2;
- warp "louyang.gat",217,278;
- end;
-
-}
-louyang.gat,218,278,0 script #LouSecEntrnc 111,{
-
- mes "[" + strcharinfo(0) + "]";
- mes "What's this?";
- mes "A crack in the wall?";
- next;
- mes "^3131FFYou jump to the stone wall and peek into the crack. It looks big enough for someone to squeeze through.";
- next;
- mes "You move through the crack as";
- mes "quickly as you can.";
- close2;
- warp "lou_in01.gat",119,167;
- end;
-
-}
-
-lou_in01.gat,117,167,0 script #LouSecExit 111,{
-
- mes "[" + strcharinfo(0) + "]";
- mes "What's this?";
- mes "A crack in the wall?";
- next;
- mes "^3131FFYou jump to the stone wall and peek into the crack. It looks big enough for someone to squeeze through.";
- next;
- mes "You move through the crack as";
- mes "quickly as you can.";
- close2;
- warp "louyang.gat",217,278;
- end;
-
-}
-
-lou_in01.gat,106,162,0 script #BaiLongBottle 111,{
-
- if(QL_POISONPATH > 1 && countitem(713) && countitem(938))goto s_Save;
- if(QL_POISONKING != 13)goto s_Fancy;
- mes "^3131FFYou found a drink bottle that's";
- mes "possibly owned by Bai Long, lord of";
- mes "Louyang.^000000";
- if(QL_POISONPATH < 2 && countitem(678))goto s_Assassinate;
- close;
-
-s_Assassinate:
- next;
- delitem 678,1; //Poison Bottle
- mes "^3131FFYou put the deadly poison into the bottle.";
- set QL_POISONKING,14;
- next;
- mes "^3131FFIt would be smart to get out of this place as soon as you can.";
- close;
-
-s_Fancy:
- mes "^3131FFYou found a drink bottle. It's fancy enough that the only possible owner could be Bai Long, lord of Louyang.";
- close;
-
-s_Save:
- mes "^3131FFYou take the drink bottle and replace it with a bottle filled with sticky mucus. Hopefully Bai Long won't notice!";
- delitem 713,1; //Empty Bottle
- delitem 938,1; //Stick Mucus
- set QL_POISONKING,14;
- close;
-
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Louyang
+//===== By: ==================================================
+//= Evera and The eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Soup Quest, Tool Master Quest, Doctor Quest,
+//= Poison King Quest
+//===== Additional Comments: =================================
+//= 1.0 Initial Release [Evera]
+//= 1.1 Fixed double levelup bug [Lupus]
+//============================================================
+
+//============================================================
+//======================================================= Soup
+//====================================================== Quest
+lou_fild01.gat,195,177,4 script Jiu Lian Bu#01 819,{
+ if(QL_SOUP2) goto L_DONE;
+ if(QL_SOUPQUEST)goto L_WHERE;
+ if(QL_GOTFAKESOUP) goto L_FAKE;
+ if(QL_GOTDRAGONSOUP) goto L_SOUP;
+ if(QL_ACCEPTSOUP) goto L_GORESTA;
+ mes "[Jiu Lian Bu]";
+ mes "Hey~";
+ mes "What's up?";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "I don't like hanging around too many people, so I came here. Listening to this strean really puts my mind to ease.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "No offense, but I'm upset";
+ mes "at the sheer number of tourists coming over to Louyang";
+ mes "Sure, I can understand that our town is attractive and has beautiful sights.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "But I just can't stand crowds of people. People gather like sheep to any place they hear is popular, and that really bugs me!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Speaking of which, there's even";
+ mes "a place in Louyang that's just like";
+ mes "that. Man, I hate that restaurant!";
+ next;
+ menu "What restaurant?",-,"Ignore him.",M_IGNORE;
+
+ mes "[Jiu Lian Bu]";
+ mes "In the east side of Louyang, there's a restaurant built on a pond. It's been around for a long time, selling food for ridiculous prices!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Oh sure, the food and flavors";
+ mes "there have a long history, but I";
+ mes "don't think that justifies how they";
+ mes "charge their patrons!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "As a young man";
+ mes "who loves his town,";
+ mes "I can't let them manipulate my";
+ mes "people like that!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "But everyone here already knows who I am, so I can't do anything! I've already had one too many, shall we say, 'incidents' with the people living here already.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "I've been caught for tagging walls, shoplifting, camming, stealing a few girlfriends... So yeah, I'm not exactly known as a sterling citizen.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Say, wait a minute. The local";
+ mes "people around here aren't too";
+ mes "familiar with you. Hmmm...";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Would you sneak into that restaurant and steal the ^3131FFDragon Soup Broth^000000 for me?";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "The Dragon Soup Broth is the";
+ mes "backbone for the restaurant";
+ mes "owner's secret recipe.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "But they've been cheating their";
+ mes "customers by watering that broth";
+ mes "down and selling it for a";
+ mes "ridiculous price! Serves them right";
+ mes "if their secrets were stolen!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "If you can steal some of the broth,";
+ mes "I'll pay you back. Whaddaya say?";
+ next;
+ menu "I'll do it!",-,"No, stealing is wrong.",M_NO;
+
+ mes "[Jiu Lian Bu]";
+ mes "Great!";
+ mes "I knew you'd";
+ mes "see things my way!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Okay, the restaurant is at the East side of Louyang. But you got to be careful. The workers there watch over that broth like freakin' hawks!";
+ set QL_ACCEPTSOUP,1;
+ close;
+
+M_NO:
+ mes "[Jiu Lian Bu]";
+ mes "Stealing?";
+ mes "You may have";
+ mes "a point there.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "But then, that restaurant has been doing that to their customers for years! So, technically. we'd just be stealing back.";
+ close;
+
+M_IGNORE:
+ mes "[Jiu Lian Bu]";
+ mes "That join isn't even that great. I mean, it's so obvious that they rip off their customers! Dragon Soup?! More like... Dragon Crap Soup!";
+ close;
+
+L_GORESTA:
+ mes "[Jiu Lian Bu]";
+ mes "Huh...?";
+ mes "Whoa, I thought you were on you way to the restaurant. You better get a move on.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Alright then, pal. Make sure the";
+ mes "guys who work there don't catch you. Good luck~";
+ close;
+
+L_FAKE:
+ mes "[Jiu Lian Bu]";
+ mes "Wow! You made it!";
+ mes "Let me see...";
+ next;
+ mes "^445BA7Jiu Lian Bu takes a hearty sip of the broth you've managed to steal for him.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Ohhhh man....";
+ mes "This is so not Dragon Soup Broth. Sorry, but would you go and try to get it again?";
+ set QL_GOTFAKESOUP,0;
+ close;
+
+L_SOUP:
+ mes "[Jiu Lian Bu]";
+ mes "Wow! You made it!";
+ mes "Let me see...";
+ next;
+ mes "^445BA7Jiu Lian Bu takes a hearty sip of the broth you've managed to steal for him.";
+ next;
+ mes "Ooooh. Ooh yeah.";
+ mes "This is the stuff.";
+ mes "Muhahahahahaha~!";
+ mes "This'll put the chef";
+ mes "in agony for a while!";
+ next;
+ set QL_GOTDRAGONSOUP,0;
+ set QL_ACCEPTSOUP,0;
+ set QL_SOUPQUEST,1;
+ mes "[Jiu Lian Bu]";
+ mes "Good job, chum! Heh heh heh, because you risked your neck for me, I'm gonna show you an awesome place! Just follow me~";
+ close2;
+ warp "lou_fild01.gat",180,171;
+ end;
+
+L_DONE:
+ mes "[Jiu Lian Bu]";
+ mes "Hey~";
+ mes "So how ya been, ya smooth criminal?";
+ mes "You want to visit that place again?";
+ next;
+ menu "Sure, let's go~",-,"Nah, maybe next time.",M_NAH;
+
+ mes "[Jiu Lian Bu]";
+ mes "Alright~";
+ mes "Let's get";
+ mes "a groove on.";
+ close2;
+ warp "lou_fild01.gat",180,171;
+ end;
+
+M_NAH:
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Not in the mood, eh?";
+ mes "No prob. But feel free";
+ mes "to come see me whenever";
+ mes "you want.";
+ close;
+L_WHERE:
+ mes "[Jiu Lian Bu]";
+ mes "Hey where did you go?";
+ mes "Come up again and I'll";
+ mes "give you your reward.";
+ close2;
+ warp "lou_fild01.gat",180,171;
+ end;
+}
+
+lou_fild01.gat,175,174,4 script Jiu Lian Bu#02 819,{
+ if(QL_SOUPQUEST < 1) goto L_DOQUEST;
+ if(QL_SOUP2 < 1) goto L_1STTIME;
+ mes "[Jiu Lian Bu]";
+ mes "So...";
+ mes "Whaddya want to do?";
+ emotion e_heh;
+ next;
+ menu "Shout.",-,"Leave.",M_LEAVE;
+
+ mes "[Jiu Lian Bu]";
+ mes "Ready~!";
+ mes "Say it out loud!";
+ next;
+ input @loushout$;
+ mapannounce "lou_fild01.gat","'" + strcharinfo(0) + "' shouts: " + @loushout$ ,1,0x9CFF00;
+ mes "[" + strcharinfo(0) + "]";
+ mes @loushout$;
+ close;
+
+M_LEAVE:
+ mes "[Jiu Lian Bu]";
+ mes "Ahhh...";
+ mes "Alright, let's";
+ mes "get a groove on.";
+ close2;
+ warp "lou_fild01.gat",197,174;
+ end;
+
+L_DOQUEST:
+ mes "[Jiu Lian Bu]";
+ mes "Who are you?";
+ mes "Get off my turf!";
+ close2;
+ warp "lou_fild01.gat",197,174;
+ end;
+
+L_1STTIME:
+ mes "[Jiu Lian Bu]";
+ mes "So...";
+ mes "Whaddya think?";
+ mes "Prettiest place in Louyang, isn't it?";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Whenever I'm depressed or need to relax, I just sit here and enjoy the breeze. It helps me forget all my worries.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Heh heh, the best part is, this place is far away from my older siste. Man, that woman can nag, nag, nag, all day long.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Why don't you sit down and close your eyes, and feel that soothing wind. It's pretty refreshing";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Also...";
+ mes "I'm a little";
+ mes "embarrassed to";
+ mes "say this but...";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "I'm the kind of guy who speaks his mind. If there's something you just wanna say, but can't, it's kind of like poison in your mind.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "You know what I'm talking about, right? If you bottle something up inside of you, it just causes you anxiety you don't need.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "So..";
+ mes "This is what you do.";
+ mes "Clench your first, take";
+ mes "a deep breath.";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "And just yell";
+ mes "Whatever you want!";
+ mes "If you don't know";
+ mes "the words, just";
+ mes "screaming will do.";
+ mes "Let everything out!";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "Ready~!";
+ mes "Say it out loud!";
+ next;
+ input @loushout$;
+ mapannounce "lou_fild01.gat","'" + strcharinfo(0) + "' shouts: " + @loushout$ ,1,0x9CFF00;
+ mes "[" + strcharinfo(0) + "]";
+ mes @loushout$;
+ set QL_SOUP2,1;
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "So, how do you feel?";
+ mes "Don't you feel better now? Hahaha~";
+ next;
+ mes "[Jiu Lian Bu]";
+ mes "So from now on, whenever you";
+ mes "want to relieve yourself of stress,";
+ mes "come see me and we'll come back to";
+ mes "this place. Call it my way of";
+ mes "saying thanks.";
+ close;
+}
+
+lou_in02.gat,61,175,2 script Employee#01 818,2,2{
+ mes "[Ya Hua]";
+ mes "^6A6A6A*Yawn...*";
+ close;
+
+OnTouch:
+ if(QL_GOTDRAGONSOUP == 1 || QL_GOTFAKESOUP == 1) goto S_CAUGHT;
+ end;
+
+S_CAUGHT:
+ mes "[Ya Hua]";
+ mes "^6A6A6A*Yawn...*";
+ mes "^000000Eyelids...";
+ mes "Getting...";
+ mes "Heavier...";
+ next;
+ mes "[Ya Hua]";
+ mes "Wait a sec...";
+ mes "Are you a thief?!";
+ mes "Get out of here!!";
+ if(QL_GOTFAKESOUP == 1) set QL_GOTFAKESOUP,0;
+ if(QL_GOTDRAGONSOUP == 1) set QL_GOTDRAGONSOUP,0;
+ next;
+ mes "^3131FFYou have failed";
+ mes "^3131FFto steal the pot.";
+ close;
+}
+
+lou_in02.gat,54,174,6 script Employee#02 822,{
+ mes "[Chang Pai]";
+ mes "^6A6A6A*Yawn...*";
+ close;
+}
+
+lou_in02.gat,50,185,4 script Pot#01 111,{
+ if(QL_SOUPQUEST == 1) goto L_EMPTY;
+ if(QL_ACCEPTSOUP < 1) goto L_NORMAL;
+ mes "^3131FFBeneath the shadows, you find a large pot filled with dark, red liquid. What do you want to do?";
+ next;
+ menu "Take the pot.",-,"Look for another pot.",M_LOOK;
+
+ if (QL_GOTDRAGONSOUP == 1) set QL_GOTDRAGONSOUP,0;
+ mes "^3131FFYou take a careful look around. It wouldn't be wise to steal this now if anyone is watching.";
+ next;
+ mes "^3131FFSince the restaurant is closed, the whole place is completely quiet. The employees are all asleep.";
+ next;
+ mes "^3131FFYou carefully lift the pot, and although it's heavy, you think you can carry it.";
+ next;
+ mes "^3131FFAll you have";
+ mes "^3131FFto do now is get";
+ mes "^3131FFaway from this restaurant";
+ mes "^3131FFwithout getting caught...";
+ set QL_GOTFAKESOUP,1;
+ close;
+
+M_LOOK:
+ mes "^3131FFYou decide to";
+ mes "look for another pot.";
+ close;
+
+L_NORMAL:
+ mes "[Chef]";
+ mes "Ah...";
+ mes "Please, do not";
+ mes "touch the pots!";
+ close;
+
+L_EMPTY:
+ mes "^3131FFYou found a pot, however it's empty.";
+ close;
+}
+
+lou_in02.gat,49,185,4 script Pot#02 111,{
+ if(QL_SOUPQUEST == 1) goto L_EMPTY;
+ if(QL_ACCEPTSOUP < 1) goto L_NORMAL;
+ mes "^3131FFBeneath the shadows, you find a large pot filled with dark, red liquid. What do you want to do?";
+ next;
+ menu "Take the pot.",-,"Look for another pot.",M_LOOK;
+
+ if (QL_GOTFAKESOUP == 1) set QL_GOTFAKESOUP,0;
+ mes "^3131FFYou take a careful look around. It wouldn't be wise to steal this now if anyone is watching.";
+ next;
+ mes "^3131FFSince the restaurant is closed, the whole place is completely quiet. The employees are all asleep.";
+ next;
+ mes "^3131FFYou carefully lift the pot, and although it's heavy, you think you can carry it.";
+ next;
+ mes "^3131FFAll you have";
+ mes "^3131FFto do now is get";
+ mes "^3131FFaway from this restaurant";
+ mes "^3131FFwithout getting caught...";
+ set QL_GOTDRAGONSOUP,1;
+ close;
+
+M_LOOK:
+ mes "^3131FFYou decide to";
+ mes "look for another pot.";
+ close;
+
+L_NORMAL:
+ mes "[Chef]";
+ mes "Ah...";
+ mes "Please, do not";
+ mes "touch the pots!";
+ close;
+
+L_EMPTY:
+ mes "^3131FFYou found an empty pot.";
+ close;
+}
+
+lou_in02.gat,62,183,4 script Chef 820,{
+ if(QL_SOUPQUEST == 1) goto L_FINISHED;
+ mes "[Wang Shi Long]";
+ mes "Hello, are you";
+ mes "one of our customers?";
+ mes "I am Wang Shi Long";
+ mes "the chef of this restaurant.";
+ next;
+ mes "[Wang Shi Long]";
+ mes "My family has server food";
+ mes "to Lord Bai Long for a long time.";
+ mes "This restaurant has been handed";
+ mes "down the family line, and I am the successor~";
+ next;
+ mes "[Wang Shi Long]";
+ mes "Our specialty, Dragon Soup,";
+ mes "won especially high praise from";
+ mes "Lord Bai Long, who is known for";
+ mes "his extremely discerning sense of taste.";
+ next;
+ mes "[Wang Shi Long]";
+ mes "I'm also proud to say that we cook";
+ mes "with only the freshest and highest";
+ mes "quality ingredients.";
+ next;
+ mes "[Wang Shi Long]";
+ mes "We've always been popular in";
+ mes "Louyang for hundreds and hundreds";
+ mes "of years because of our high";
+ mes "quality gourmet cuisine.";
+ next;
+ mes "[Wang Shi Long]";
+ mes "In this dry and hot weather,";
+ mes "Dragon Soup is the best food for";
+ mes "any appetite. I suggest that you";
+ mes "try a bowl. You'll be quite";
+ mes "pleased!";
+ close;
+
+L_FINISHED:
+ mes "[Wang Shi Long]";
+ mes "^6A6A6A*Moans and Cries*^000000";
+ mes "I guess this is it...!";
+ mes "The end of my family's glory.";
+ mes "Someone stole the base broth";
+ mes "of my Dragon Soup!";
+ next;
+ mes "[Wang Shi Long]";
+ mes "What should I do, now?";
+ mes "Without Dragon Soup, my family's";
+ mes "restaurant will now just be like";
+ mes "all the others...";
+ close;
+}
+
+lou_in02.gat,42,186,4 script Liu Jia Lim 816,{
+ if(QL_SOUPQUEST == 1) goto L_FINISHED;
+ mes "[Liu Jia Lim]";
+ mes "Do you know what's the best dish at this restaurant? It's Dragon Soup! They've been selling it here for as long as this restaurant has been around";
+ next;
+ mes "[Liu Jia Lim]";
+ mes "It's delicate taste comes from a broth extracted from pure meat that doesn't contain any fat. So it's also a very popular diet food for the ladies.";
+ next;
+ mes "It's tasty and really good for your health. Why don't you order a bowl? I've never known anyone to taste Dragon Soup and not love it!";
+ close;
+
+L_FINISHED:
+ mes "[Liu Jia Lim]";
+ mes "Do you know what was this restaurant's best dish throughout all of its history? Dragon Soup!";
+ next;
+ mes "[Liu Jia Lim]";
+ mes "It's delicate taste comes from a broth extracted from pure meat that doesn't contain any fat. So it's also a very popular diet food for the ladies.";
+ next;
+ mes "[Liu Jia Lim]";
+ mes "I'm not sure what happened, but people say this restaurant no longer sells Dragon Soup.";
+ mes "Was it because of the price...?";
+ close;
+}
+
+lou_in02.gat,80,173,2 script Li Min 746,{
+ if(QL_SOUPQUEST == 1) goto L_FINISHED;
+ mes "[Li Min]";
+ mes "Well, I don't really";
+ mes "live here in Louyang.";
+ mes "Still, I come here often";
+ mes "enough to visit.";
+ next;
+ mes "[Li Min]";
+ mes "I just returned";
+ mes "because I've got";
+ mes "a huge craving for the";
+ mes "food I tasted here";
+ mes "a while ago.";
+ next;
+ mes "[Li Min]";
+ mes "For some reason, I can't forget it.";
+ mes "I can't get it out of my mind!";
+ next;
+ mes "[Li Min]";
+ mes "The taste, the texture.";
+ mes "The sweetness, melting down into my";
+ mes "mouth, and it's tempting scent";
+ mes "lingering on my lips...";
+ next;
+ mes "[Li Min]";
+ mes "Ummmmm...";
+ mes "Royal Jelly!";
+ mes "It makes my";
+ mes "mouth water~";
+ close;
+
+L_FINISHED:
+ mes "[Li Min]";
+ mes "^6A6A6A*Sigh*^000000 I am so disappointed. I came";
+ mes "all the way down here to taste the";
+ mes "food! I can't believe they don't";
+ mes "sell it anymore!";
+ next;
+ mes "[Li Min]";
+ mes "The worst part is that I'm already";
+ mes "addicted to the taste! ^6A6A6A*Sob...*^000000";
+ close;
+}
+
+louyang.gat,174,150,4 script Liu Chi Ling 815,{
+ if(QL_SOUPQUEST == 1) goto L_RUMOR;
+ mes "[Jiu Chi Ling]";
+ mes "I'm worried about my brother.";
+ mes "He's young, rebellious and doesn't";
+ mes "listen to anybody...";
+ next;
+ mes "[Jiu Chi Ling]";
+ mes "He just left the";
+ mes "house while he was";
+ mes "complaining about";
+ mes "that restaurant...";
+ next;
+ mes "[Jiu Chi Ling]";
+ mes "^6A6A6A*Sigh~~*^000000";
+ mes "I'm not going to let him get";
+ mes "away this time!";
+ close;
+
+L_RUMOR:
+ mes "[Jiu Chi Ling]";
+ mes "There's a strange rumor going";
+ mes "around that the restaurant is no";
+ mes "longer selling Dragon Soup...";
+ next;
+ mes "[Jiu Chi Ling]";
+ mes "Do you think";
+ mes "my brother did";
+ mes "something bad again!?";
+ mes "I hope not! If he did...";
+ mes "What am I supposed to do?!";
+ close;
+}
+
+
+//============================================================
+//================================================ Tool Master
+//====================================================== Quest
+lou_in02.gat,210,47,8 script City Hall Officer 825,{
+ if(QL_GOTCOMPROP == 1)goto L_BEENTOHIM;
+ if(QL_LOUBRIBE == 1)goto L_OFFICER;
+ if(QL_BEENTOSTORAGE == 1)goto L_QUEST;
+ mes "[Jin Chiyuan]";
+ mes "^6A6A6A*Yawn~*^000000";
+ mes "Gosh, this hot weather is such a pain. Oh? You look like a tourist. Are you enjoying your stay?";
+ next;
+ mes "[Jin Chiyuan]";
+ mes "Although we've been having bad weather recently, there are many good places to visit in Louyang. I hope you have a good time.";
+ close;
+
+L_QUEST:
+ mes "[Jin Chiyuan]";
+ mes "Hm? A Rune-Midgardian? Now, how may I help you?";
+ next;
+ menu "I need a document.",-,"I just dropped by",M_DROP;
+
+ mes "[Jin Chiyuan]";
+ mes "Ah, you do?";
+ mes "Unfortunately, there are many people waiting in line to procure goverment forms, so it will take a while to handle your request.";
+ next;
+ mes "[Jin Chiyuan]";
+ mes "^6A6A6A*whispers*";
+ mes "^2A2A2AWell, there is a way that you can, shall we say, expedite our processing of your request...^000000";
+ next;
+ menu "Huh? Come again?",-,"A little zeny to cut the red tape, eh?",M_BRIBE;
+
+ mes "[Jin Chiyuan]";
+ mes "^6A6A6A*Ahem!*^000000 Nothing.";
+ mes "Nothing of importance. Now, I'm very busy, so if you would go fill the application over there...";
+ close;
+
+M_BRIBE:
+ input @loubribe;
+ if(@loubribe < 10000)goto L_POOR;
+ if(zeny < @loubribe)goto L_NOTENOUGH;
+ set Zeny, Zeny - @loubribe;
+ set QL_LOUBRIBE,1;
+ mes "[Jin Chiyuan]";
+ mes "What...?!";
+ mes "That's not what I meant, but if you insist on donating to our government...";
+ next;
+ mes "[Jin Chiyuan]";
+ mes "^6A6A6A*Whispers*";
+ mes "^2A2A2AWhen you go upstairs, another officer will give you the document you want.^6A6A6A *Ahem* ^000000Louyang thanks you!";
+ close;
+
+L_POOR:
+ mes "[Jin Chiyuan]";
+ mes "Good lord,";
+ mes "What are you thinking? What am I, a beggar?! That's a poor excuse for a bribe!";
+ next;
+ emotion e_pif;
+ mes "[Jin Chiyuan]";
+ mes "I mean...";
+ mes "How dare you bribe an officer of the law! I hope other outsiders are not like you! Please leave immediately.";
+ close;
+
+M_DROP:
+ mes "[Jin Chiyuan]";
+ mes "Oh well...";
+ mes "Let me tell you that this is not a good time for tourists. I hope you don't wander into places you're not supposed to be.";
+ next;
+ mes "[Jin Chiyuan]";
+ mes "Quite frankly,";
+ mes "it's a dangerous climate for curiosity right now. Please, be careful.";
+ close;
+
+L_NOTENOUGH:
+ mes "[Jin Chiyuan]";
+ mes "You don't even have that much money.";
+ close;
+
+L_OFFICER:
+ mes "[Jin Chiyuan]";
+ mes "Haven't you met the officer I told you about? I've contacted him about the matter, so you may meet him upstairs.";
+ next;
+ mes "[Jin Chiyuan]";
+ mes "Hahahaha...";
+ mes "Take care,";
+ mes "Rune-Midgardian.";
+ close;
+
+L_BEENTOHIM:
+ emotion e_heh;
+ mes "[Jin Chiyuan]";
+ mes "Ah~";
+ mes "You met him,";
+ mes "didn't you?";
+ mes "Hahaha...";
+ mes "Enjoy your stay";
+ mes "in Louyang!";
+ close;
+}
+
+lou_in02.gat,156,38,8 script Studying Officer 822,{
+ if(QL_GOTCOMPROP == 1)goto L_RANT2;
+ if(QL_LOUBRIBE == 1)goto L_BRIBED;
+ if(QL_BEENTOSTORAGE == 1)goto L_RANT;
+ mes "[Huang Zhishu]";
+ mes ".....";
+ mes "^6A6A6A*Mumble mumble*^000000";
+ next;
+ mes "^3131FFHe appears to be rummaging around for some documents and takes no notice of you.";
+ next;
+ menu "Excuse me.",-,"Pass him.",M_PASS;
+
+ mes "[Huang Zhishu]";
+ mes "Hmmm...?";
+ mes "Well...";
+ mes "...";
+ mes "I see...";
+ mes "^6A6A6A*Mumble mumble...*^000000";
+ close;
+
+M_PASS:
+ mes "[Huang Zhishu]";
+ mes ".....";
+ mes "^6A6A6A*Mumble mumble*^000000";
+ close;
+
+L_RANT:
+ mes "[Huang Zhishu]";
+ mes "Books contain the spirit and ideas of their authors. Any work of are can be considered a window into the soul of its creator.";
+ next;
+ mes "[Huang Zhishu]";
+ mes "^6A6A6A*Mumble mumble...*^000000";
+ mes "Hmm... I see...";
+ mes "Ah, I see....";
+ mes "^6A6A6A*Mumble mumble...*^000000";
+ close;
+
+L_BRIBED:
+ mes "^3131FF*Rummage rummage...*^000000";
+ next;
+ menu "Sorry about that.",-,"I came to pick up my documents.",L_DOCU;
+
+ mes "[Huang Zhishu]";
+ mes "Apology accepted.";
+ mes "Hmmm....";
+ mes "Oh I see, I see...";
+ next;
+ emotion e_gasp;
+ mes "^3131FF*Rummage rummage...*";
+ mes "^3131FF..........";
+ close;
+
+L_DOCU:
+ mes "[Huang Zhishu]";
+ mes "Huh?";
+ mes "Ah...";
+ mes "You're the one I'm waiting for. So what kind of document did you need?";
+ input @loudocument$;
+ next;
+ mes "[Huang Zhishu]";
+ mes "Let's see now.";
+ mes "You want..";
+ mes "a " + @loudocument$ + "?";
+ next;
+ if(@loudocument$ != "Communication Proposal")goto L_WHAT;
+ mes "[Huang Zhishu]";
+ mes "Now where did I put that? You want a Communication Proposal, huh? I think I'll need some time to find it. Ah, right. I think I know where I put that.";
+ next;
+ mes "...";
+ next;
+ mes "...";
+ mes "......";
+ next;
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "...";
+ mes "......";
+ mes ".........";
+ mes "............";
+ next;
+ mes "...";
+ mes "......";
+ mes ".........";
+ mes "............";
+ mes "...............";
+ next;
+ mes "[Huang Zhishu]";
+ mes "Here it is. Someone asked me for the same document a few days ago so I was able to find it again pretty easily. I hope it's useful to you.";
+ set QL_GOTCOMPROP,1;
+ set QL_LOUBRIBE,0;
+ set QL_BEENTOSTORAGE,0;
+ close;
+
+L_WHAT:
+ mes "[Huang Zhishu]";
+ mes "Huh?";
+ mes "Wha...";
+ next;
+ mes "[Huang Zhishu]";
+ mes "I'm sorry but I don't think we have that one. You might want to check the name of the document once more, and then come back to me.";
+ close;
+
+L_RANT2:
+ emotion e_ok;
+ mes "[Huang Zhishu]";
+ mes "Hmmm...?";
+ mes "Do you think I need to go outside more often? Well, I guess for some reason, I don't feel well. I guess I really should get some fresh air.";
+ mes "^6A6A6A*Yawn...*^000000";
+ next;
+ mes "[Huang Zhishu]";
+ mes "But you should get out more often yourself! It's not a good idea to always stay home. If you don't get some exercise when you're young, it could affect your health later.";
+ close;
+}
+
+lou_in02.gat,248,166,2 script Tool Shop Master 824,{
+ if(QL_GOTHERB == 1)goto L_HERB;
+ if(QL_TOOLMASTER == 1)goto L_STORAGE;
+ if(QL_DOCQUEST == 1)goto L_QUEST;
+L_HERB:
+ mes "[Wang Chuiyi]";
+ mes "My business hasn't been doing well recently. And what is wrong with this weather? I don't know what's going on with the world...";
+ close;
+
+L_QUEST:
+ mes "[Wang Chuiyi]";
+ mes "Darn it!";
+ mes "I hate this";
+ mes "weather...!";
+ next;
+ emotion e_what;
+ mes "[Wang Chuiyi]";
+ mes "Um? Can I help";
+ mes "you with anything?";
+ next;
+ menu "I'm here to get something for the doctor...",-,"I agree, the weather really is bad.",M_WEATHER;
+
+ mes "[Wang Chuiyi]";
+ mes "Huh?";
+ mes "An errand for the doctor? She must have run out of medicine again. Go ahead and check the storage.";
+ next;
+ mes "[Wang Chuiyi]";
+ mes "You can find the storage on the opposite side of this building. There, you'll see a guy named Jiang Xiayou. Go ahead and ask him for the stuff you need.";
+ set QL_TOOLMASTER,1;
+ close;
+
+M_WEATHER:
+ mes "[Wang Chuiyi]";
+ mes "Tell me about it. This weather keeps stressing me out. Damn, I don't think I'll live very long if I keep getting aggravated like this by the weather...";
+ close;
+
+L_STORAGE:
+ mes "[Wang Chuiyi]";
+ mes "You can find the storage on the opposite side of this building. There, you'll see a guy named Jiang Xiayou. Go ahead and ask him for the stuff you need.";
+ close;
+}
+
+lou_in02.gat,201,166,5 script Storage Keeper 819,{
+ if(QL_GOTCOMPROP == 1)goto L_FINALLY;
+ if(QL_BEENTOSTORAGE == 1)goto L_LAZY;
+ if(QL_TOOLMASTER == 1)goto L_QUEST;
+ mes "[Jiang Xiayou]";
+ mes "^6A6A6A*Yawn...*^000000";
+ mes "This is boring...";
+ mes "So boring, it's ridiculous. I don't want to waste any more time here, I've got important things to do...";
+ close;
+
+L_QUEST:
+ mes "[Jiang Xiayou]";
+ mes "Huh?";
+ mes "What, what are you doing here? If you don't need anything, you better get a move on.";
+ next;
+ menu "Sorry about that.",-,"It's hot isn't it?",M_HOT,"I'm on an errand for the doctor.",M_ERRAND;
+
+ mes "[Jiang Xiayou]";
+ mes "That's right!";
+ mes "You don't mess with a person in this hot weather! Now, go away. Can't you see I'm busy!";
+ close;
+
+M_HOT:
+ mes "[Jiang Xiayou]";
+ mes "You don't have to ask me that. I can feel if for myself! Now, I got a bunch of things to take care of, so quit bugging me. Damn, it's hot!";
+ close;
+
+M_ERRAND:
+ mes "[Jiang Xiayou]";
+ emotion e_gasp;
+ mes "Oh yeah?";
+ mes "Well, why didn't you say so? Let's see.";
+ mes "Hmmm...";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "Actually, could you help me out first? Don't worry, it's not so hard but it's pretty important for me. Once you help me out, I'll get what you need.";
+ next;
+ menu "Um, what is it?",-,"Sorry, I'm busy.",L_BUSY;
+
+ mes "[Jiang Xiayou]";
+ mes "Cool, thanks. I have to go get some official documents from City Hall, but I can't leave this storage area since no one can take over my shift.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "So I want you to go get the documents from City Hall for me. I don't think it'll take much of your time.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "Just go east from here and look for the building that looks sort of like it was made in gauge form. That's City Hall.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "I don't get why the government spent so much money making that building, but anyway, I hope you can do that for me.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "Oh, I almost forgot.";
+ mes "You have to ask for a specific type of document, so let me tell you right now.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "This is important,";
+ mes "so don't forget this.";
+ mes "When the guy asks what you need, you tell him: '^FF0000Communication Proposal^000000' Just like that?";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "If you don't specify the documents you need, they won't give you anything. So be careful and don't forget!";
+ set QL_BEENTOSTORAGE,1;
+ close;
+
+L_BUSY:
+ mes "[Jiang Xiayou]";
+ mes "Bah~!";
+ mes "Forget it, then!";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "The medicines you're looking for might be around here. so look around. If it weren't for the doctor, I wouldn't even let you hang around, you know that?";
+ close;
+
+L_LAZY:
+ mes "[Jiang Xiayou]";
+ mes "Huh?";
+ mes "Haven't you gone to City Hall yet?";
+ mes "What a lazy ass";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "Shouldn't you hurry to get that medicine to the doc? We're talking a man's life at stake, that mean anything to you?";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "I guess you're";
+ mes "the forgetful type...";
+ mes "When the guy asks what you need, you tell him:";
+ mes "'^FF0000Communication Proposal^000000'.";
+ next;
+ mes "[Jiang Xiayou]";
+ mes "Just like that.";
+ mes "Now, go to it, tiger.";
+ close;
+
+L_FINALLY:
+ mes "[Jiang Xiayou]";
+ mes "You finally brought it! Haha, I just got everything you need, too. Let me see...";
+ mes "Yup this is it!";
+ mes "Good, good...";
+ next;
+ mes "^3131FF*Rummage rummage...*";
+ mes "^3131FF......";
+ next;
+ menu "Excuse me.",-;
+ mes "[Jiang Xiayou]";
+ mes "Huh?";
+ mes "Ah....";
+ mes "Haha...";
+ mes "Sorry about";
+ mes "that. Hahaha~";
+ next;
+ getitem 7252,1; //Herbal Medicine
+ mes "[Jiang Xiayou]";
+ mes "Ah! Here you go. Even if it was kind of annoying to do, I guess we gotta help each other, right? Alright then, I'll see ya around.";
+ set QL_GOTHERB,1;
+ set QL_BEENTOSTORAGE,0;
+ set QL_GOTCOMPROP,0;
+ set QL_TOOLMASTER,0;
+ close;
+}
+
+
+//============================================================
+//===================================================== Doctor
+//====================================================== Quest
+lou_in02.gat,265,69,4 script Doctor 814,{
+ if(QL_DOCQUEST == 1) goto L_MED;
+ if(QL_DOCQUEST == 2) goto L_RANT;
+ if(QL_DOCQUEST == 3) goto L_CHECKITM;
+ if(QL_DOC1STTIME == 1) goto L_QUEST;
+ mes "[Hua Tuo]";
+ mes "There are many pressure points on the human body. Ever since ancient times, it has been believed that each pressure point was limited to its role and functions.";
+ next;
+ mes "[Hua Tuo]";
+ mes "However, as I studied and experimented with every pressure point, I came to the conclusion that the use of pressure points, depending on the circumstances, can produce different results.";
+ next;
+ mes "[Hua Tuo]";
+ mes "Few pressure points tend to show the same symptoms, regardless of the problem. Most of the time, the effects of pressure points will differ depending on the body's health or time of day.";
+ next;
+ mes "[Hua Tuo]";
+ mes "For instance, the pressure point located on the upper side of the navel is the most vulnerable point.";
+ next;
+ mes "[Hua Tuo]";
+ mes "If pressed the wrong way, it can cause death. But between 5:15 am and 7:15 am, it's just a weak point.";
+ set QL_DOC1STTIME,1;
+ close;
+
+L_QUEST:
+ mes "[Hua Tuo]";
+ mes "Hmmm...";
+ mes "I'm in trouble";
+ next;
+ emotion e_swt2;
+ mes "[Hua Tuo]";
+ mes "I cannot do anything without my medicine. But one of my patients needs immediate treatment and I can't leave the office...";
+ next;
+ menu "I can help you",-,"What a shame!",M_SHAME;
+
+ mes "[Hua Tuo]";
+ mes "Huh...?";
+ mes "Are...";
+ mes "Are you serious?";
+ next;
+ mes "[Hua Tuo]";
+ mes "This won't take much effort, but it may be too much to ask of you, especially since we have just met.";
+ next;
+ menu "If you feel burdened...",-,"I don't mind, I'd be glad to help.",M_HELP2;
+
+ mes "[Hua Tuo]";
+ mes "Thank you so";
+ mes "much for saying that.";
+ mes "I feel very uncomfortable asking a favor of someone I have only just met.";
+ next;
+ emotion e_thx;
+ mes "[Hua Tuo]";
+ mes "However, I will ask you if we meet another time. Now, if you'll excuse me...";
+ close;
+
+M_HELP2:
+ mes "[Hua Tuo]";
+ mes "Hmm, I see.";
+ mes "Well then, let me";
+ mes "ask a favor of you.";
+ next;
+ mes "[Hua Tuo]";
+ mes "As you heard earlier, I need a special medicine to treat this patient. However, I'm running out of the medicine I need.";
+ next;
+ mes "[Hua Tuo]";
+ mes "I will need you to get it for me since I cannot leave the patients that are waiting for me right now.";
+ next;
+ mes "[Hua Tuo]";
+ mes "^6A6A6A*Sigh*^000000";
+ mes "Misfortunes always seem to occur one after another, don't they? My staff is currently too busy doing other errands.";
+ next;
+ mes "[Hua Tuo]";
+ mes "Please visit the";
+ mes "Tool Shop in town and bring me the medicine that I need. Master will understand if you tell him you've been sent by me.";
+ next;
+ mes "[Hua Tuo]";
+ mes "I am sorry for causing you so much trouble, but if you'll excuse me, I have other patients waiting. Please hurry back with the medicine!";
+ set QL_DOCQUEST,1;
+ close;
+
+M_SHAME:
+ mes "[Hua Tuo]";
+ mes "^6A6A6A*Sigh*^000000 For some reason, I never seem to have enough in stock. Is there no one I can ask to help me?";
+ close;
+
+L_MED:
+ if(countitem(7252) == 0)goto L_NOMED;
+ delitem 7252,1; //Herbal Medicine
+ mes "[Hua Tuo]";
+ mes "Ah, finally...";
+ mes "You've brought what I need. Thank you so much, it's such a relief to have this medicine on hand again.";
+ next;
+ mes "[Hua Tuo]";
+ mes "I apologize in advance, but may I ask you for another favor? I am asking for your help once, since I know I can depend on you. Of course, I will compensate you for your trouble.";
+ next;
+ menu "I'm sorry...",L_DONE,"No problem.",-;
+
+ mes "[Hua Tuo]";
+ mes "Thank you, thank you so much!";
+ mes "I've just run out of other medicines that my patients will be needing. I don't need too much, but you would be doing me a great favor.";
+ next;
+ mes "[Hua Tuo]";
+ mes "The medicines I need are ^0000FF2 Leopard Claw^000000 which supports the bones, ^0000FF10 Solid Peach^000000 which strengthens the muscle, ^0000FF5 Poisonous Toad Skin which replenishes the skin...";
+ next;
+ mes "[Hua Tuo]";
+ mes "^0000FF20 Brown Root^000000 which regulates the heart, ^0000FF10 Sprout^000000 which eases the abdomen and ^0000FF5 Honey Pot^000000 which provides nutrition.";
+ next;
+ mes "[Hua Tuo]";
+ mes "I hope you've memorized it all.";
+ mes "Once again, that's...";
+ set QL_DOCQUEST,3;
+ next;
+L_INGREDIENT:
+ mes "[Hua Tuo]";
+ mes "^3131FF2 Leopard Claw^000000,";
+ mes "^3131FF10 Solid Peach^000000,";
+ mes "^3131FF5 Poisonous Toad Skin^000000,";
+ mes "^3131FF20 Brown Root^000000,";
+ mes "^3131FF10 Sprout^000000 and";
+ mes "^3131FF5 Honey Pot^000000.";
+ close;
+
+L_DONE:
+ mes "[Hua Tuo]";
+ mes "Alright...";
+ mes "I understand.";
+ mes "But thank you for helping me out. please take this...";
+ next;
+ mes "[Hua Tuo]";
+ mes "It's not much, but this medicine is an old family secret. I hope that it will be of use to you in dangerous situations.";
+ set QL_GOTHERB,0;
+ set QL_DOC1STTIME,0;
+ set QL_DOCQUEST,2;
+ getitem 679,2; //Pilule
+ set BaseExp,BaseExp + 10000;
+ next;
+ mes "[Hua Tuo]";
+ mes "Well then, I will see you around. Once again, I'd like to thank you for your help.";
+ close;
+
+L_NOMED:
+ mes "[Hua Tuo]";
+ mes "You haven't gotten the medicine yet...? I hope you can get it as soon as possible...";
+ close;
+
+L_RANT:
+ mes "[Hua Tuo]";
+ mes "Being strong as a person is not defined as mere physical strength.";
+ next;
+ mes "[Hua Tuo]";
+ mes "Factors such as intelligence, experience and knowledge are also considered when judging one's strength.";
+ next;
+ mes "[Hua Tuo]";
+ mes "Let's say you're very strong and given the most powerful weapon.";
+ next;
+ mes "[Hua Tuo]";
+ mes "If you don't know how to use the weapon's power, you will not be strong... You will be weak.";
+ next;
+ mes "[Hua Tuo]";
+ mes "When the tools or weapons overwhelm your capabilities, the worst situations result.";
+ close;
+
+L_CHECKITM:
+ if(countitem(7172) < 2)goto L_NOTENOUGH; //Leopard Claw
+ if(countitem(7164) < 10)goto L_NOTENOUGH; //Solid Peach
+ if(countitem(7155) < 5)goto L_NOTENOUGH; //Poisonous Toad Skin
+ if(countitem(7188) < 20)goto L_NOTENOUGH; //Brown Root
+ if(countitem(7193) < 10)goto L_NOTENOUGH; //Sprout
+ if(countitem(7121) < 5)goto L_NOTENOUGH; //Honey Pot
+ delitem 7172,2; //Leopard Claw
+ delitem 7164,10; //Solid Peach
+ delitem 7155,5; //Poisonous Toad Skin
+ delitem 7188,20; //Brown Root
+ delitem 7193,10; //Sprout
+ delitem 7121,5; //Honey Pot
+ //These following dialogs are made up, I didn't finish the quest =/
+ mes "[Hua Tuo]";
+ mes "Thank you so much, now I can treat my patients.";
+ next;
+ mes "[Hua Tuo]";
+ mes "Ah...";
+ mes "Of course!";
+ mes "Here's your reward. Use this medicine when you feel weary.";
+ getitem 679,5; //Pilule
+ set BaseExp,BaseExp + 30000;
+ set QL_GOTHERB,0;
+ set QL_DOC1STTIME,0;
+ set QL_DOCQUEST,2;
+ close;
+
+L_NOTENOUGH:
+ mes "[Hua Tuo]";
+ mes "Hmm....";
+ mes "Unfortunately, you haven't collected everything that I need yet. Once again, please gather...";
+ next;
+ goto L_INGREDIENT;
+}
+
+
+//============================================================
+//================================================ Poison King
+//====================================================== Quest
+lou_fild01.gat,224,348,7 script Lady#04 817,{
+
+ emotion 30;
+ mes "[Lady]";
+ mes "You're at the entrance of Louyang.";
+ if(QL_POISONKING > 8)
+ {
+ mes "I hope you have a good time~";
+ close;
+ }
+ next;
+ mes "[Lady]";
+ mes "Louyang is well known";
+ mes "for its various firecrackers.";
+ mes "Would you like to see one?";
+ next;
+ menu "Sure!",s_Firework,"No thanks~",-;
+
+ if(QL_POISONKING == 8)goto s_PKQuest;
+ mes "[Lady]";
+ mes "Hmpf...!";
+ emotion 9;
+ close;
+
+s_PKQuest:
+ mes "[Lady]";
+ mes "Hmm, if not firecrackers,";
+ mes "then you must want something";
+ mes "else. Did someone send you?";
+ next;
+ menu "Yes.",s_Sent,"No.",-;
+
+ mes "[Lady]";
+ mes "No...?";
+ if(!Sex)close;
+ next;
+ mes "[Lady]";
+ mes "Are you...";
+ mes "Coming on to me?";
+ close;
+
+s_Sent:
+ mes "[Lady]";
+ mes "Who was it?";
+ mes "Please tell me";
+ mes "his name.";
+ next;
+ input @PKstr$;
+ if(@PKstr$ != "Song Zhi Du")goto s_Dunno;
+
+ mes "[Lady]";
+ mes "Oh, I see.";
+ mes "Let me give";
+ mes "you the package.";
+ next;
+ mes "[Lady]";
+ mes "Ah, wait! I forgot!";
+ mes "You must first pay the";
+ mes "delivery fee of 1,000 zeny.";
+ next;
+ mes "[Lady]";
+ if(Zeny < 1000)goto s_NEnoughZeny;
+ mes "Thank you~";
+ mes "Now that the fee is paid,";
+ mes "please bring this to";
+ mes "Song Zhi Du.";
+ mes "Take care!";
+ set Zeny,Zeny-1000;
+ getitem 7126,1;
+ set QL_POISONKING,9;
+ close;
+
+s_NEnoughZeny:
+ mes "Sorry, you don't have";
+ mes "enough zeny to pay the";
+ mes "delivery fee.";
+ close;
+
+s_Dunno:
+ mes "[Lady]";
+ mes "Hmmm?";
+ mes "I don't know who that is.";
+ mes "So I definitely don't have";
+ mes "a package for whoever you're";
+ mes "talking about.";
+ close;
+
+s_Firework:
+ mes "[Lady]";
+ mes "Alright, there you go!";
+ close2;
+ donpcevent "LouFireWrk::OnExplosion";
+ end;
+
+}
+
+lou_fild01.gat,225,349,1 script LouFireWrk 139,{
+
+OnExplosion:
+ misceffect 183;
+ end;
+
+}
+
+lou_in01.gat,99,158,4 script Lord 821,{
+ mes "[Lord Bai Long]";
+ mes "Hahahaha!";
+ mes "Welcome to Louyang!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Louyang is such a great city.";
+ mes "We're protected this land for forty";
+ mes "years from the invasions of evil";
+ mes "creatures!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "I hope you enjoy";
+ mes "your stay here,";
+ mes "Rune-Midgardian!";
+ next;
+ if(QL_POISONKING == 15)goto s_Journal;
+ mes "[Lord Bai Long]";
+ mes "How could I have lost my friend";
+ mes "from our glory days? Hmm...?";
+ mes "Oh, I didn't realize you were still";
+ mes "there...Listening to me.";
+ next;
+ mes "[Lord Bai Long]";
+ mes "I'm sorry, I was just talking to";
+ mes "myself. I hope you have a good time";
+ mes "while you stay here in Louyang.";
+ close;
+
+s_Journal:
+ mes "^3131FFYou give Nagash Arses' Journal";
+ mes "to Bai Long. He reads it intently,";
+ mes "slowly turnin each page.";
+ next;
+ mes "^3131FFHe's completely silent for about";
+ mes "fifteen minutes, and focuses all";
+ mes "of his attention on the journal.";
+ next;
+ mes "^3131FFA single tear trickles";
+ mes "from his eye as he reads";
+ mes "the words of Nagash Arses...^000000";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Thank you..";
+ mes "Adventurer...";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Thank you so much.";
+ mes "You've helped me make";
+ mes "up with an old friend!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "I, Bai Long, will work on giving";
+ mes "fair treatment to all of martial";
+ mes "arts organizations, regardless of";
+ mes "their methods or philosophies!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "I will also forgive Song Zhi Du,";
+ mes "even if he tried to poison me.";
+ mes "He is innocent...";
+ next;
+ mes "[Lord Bai Long]";
+ mes "As a matter of fact, it was";
+ mes "reported to me that Nagash was";
+ mes "deported to his homeland after";
+ mes "that incident. I had no idea";
+ mes "he was in jail!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Thank you so";
+ mes "much for your help!";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Please take this as a token of";
+ mes "gratitude. And please deliver this";
+ mes "letter to Nagash and Song Zhi Du";
+ mes "for me.";
+ getitem 603,1;
+ set QL_POISONKING,16;
+ next;
+ mes "^3131FFYou obtained ^0000FFBai Long's letter.^000000";
+ next;
+ mes "[Lord Bai Long]";
+ mes "Thank you in advance.";
+ close;
+
+}
+lou_in02.gat,253,45,4 script Employee#04 822,{
+
+ if(QL_POISONKING == 30)goto s_NoGoodIdea;
+ if(QL_POISONKING == 18)goto s_Busy;
+ if(QL_POISONKING == 17)goto s_Told;
+ if(QL_POISONKING == 14 && QL_POISONPATH < 2)goto s_CameBack;
+ if(QL_POISONKING > 13)goto s_Proud;
+ if(QL_POISONKING > 12)goto s_Security;
+ if(QL_POISONKING == 12)goto s_LordDie;
+ if(QL_POISONKING == 11)goto s_MaterialCheck;
+ if(QL_POISONKING == 10)goto s_NotSure;
+ if(QL_POISONKING == 9)goto s_Thanked;
+ if(QL_POISONKING == 7 && QL_POISONDISLIKED)goto s_Materials2;
+ if(QL_POISONKING > 6)goto s_DeliveryMes;
+ if(QL_POISONKING == 6 && QL_POISONDISLIKED)goto s_Pity;
+ if(QL_POISONKING == 6)goto s_Talked;
+ if(QL_DOCQUEST != 2)goto s_NotPoison;
+ mes "[Song Zhi Du]";
+ mes "Well, well. Thank you for you're";
+ mes "trouble. I didn't expect you to";
+ mes "gather all these herbs for us...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I suppose I underestimated you. By";
+ mes "the way, do you know anything about";
+ mes "poison?";
+ next;
+ menu "Yes, I am kind of interested in it",-,"No, not at all",s_No;
+ mes "[Song Zhi Du]";
+ mes "Oh, I see. Well, if you have some";
+ mes "time, why don't you go visit my old";
+ mes "master in the slums?";
+ next;
+ mes "[Song Zhi Du]";
+ mes "If you two get along, I will tell";
+ mes "you something important.";
+ set QL_POISONKING,1;
+ close;
+s_No:
+ mes "[Song Zhi Du]";
+ mes "Huh? I see. Well, thank you for";
+ mes "your troubles once again. I hope you";
+ mes "have a good time in Louyang.";
+ close;
+
+s_NotPoison:
+ mes "[Song Zhi Du]";
+ mes "^111111*Sigh*^000000.....";
+ mes "I wish there was someone who";
+ mes "could help me carry my revenge out.";
+ close;
+
+s_Talked:
+ mes "[Song Zhi Du]";
+ mes "...";
+ mes "So, did you talk";
+ mes "to my old master?";
+ mes "It seems he really";
+ mes "likes you.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "As you know, my master has been";
+ mes "accused of something he didn't do!";
+ mes "And they crippled his use of the";
+ mes "martial arts!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I can't forgive what";
+ mes "they've done to my master!";
+ mes "I want to grind their bones";
+ mes "to powder! And that's before";
+ mes "I kill them!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "He's innocent and all he did";
+ mes "was research poison with all";
+ mes "of his effort! And for that,";
+ mes "they destroyed him!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I was yound";
+ mes "when it happened...";
+ mes "Too young to know";
+ mes "any martial arts.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I could protect him.";
+ mes "All I could do was hide and";
+ mes "watch other people get killed.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I hate myself";
+ mes "for not being strong!";
+ mes "But, my body isn't suited";
+ mes "for martial arts.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "All I can do is maintain my weak";
+ mes "body and make sure it's reasonably";
+ mes "healthy. Even so, if it weren't for";
+ mes "my master, I'd be dead";
+ mes "in the streets...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "It was my master who picked me up";
+ mes "from the streets and cured me. So,";
+ mes "I've decided to become a doctor and";
+ mes "save as many lives as I can.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "But before";
+ mes "I do that,";
+ mes "I want ^FF0000revenge^000000!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "As I told you, I am weak.";
+ mes "Too weak... I know that from";
+ mes "the bottom of my heart.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "But...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I am knowledged about medicine,";
+ mes "especially the use of poison. I can";
+ mes "tell you that I'm one of the best.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Poison can kill people but it can";
+ mes "also be used to save lives. The";
+ mes "people who destroyed my master";
+ mes "will pay the price.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Do you understand";
+ mes "why I'm furious!?";
+ next;
+ menu "But Revenge isn't good.",-,"Yes, I fully understand",s_Understand;
+
+ mes "[Song Zhi Du]";
+ mes "Hmm...";
+ mes "I see.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I supposed you couldn't";
+ mes "understand the way I feel.";
+ mes "After all, you didn't have";
+ mes "to go through the same";
+ mes "things I did.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I suppose I expected too much";
+ mes "since my master likes you. How";
+ mes "could you know the rage and";
+ mes "sadness that I feel!?";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Fine.";
+ mes "Go do whatever";
+ mes "you were going to do.";
+ mes "I'm just disappointed...";
+ set QL_POISONDISLIKED,1;
+ close;
+
+s_Understand:
+ mes "[Song Zhi Du]";
+ mes "Yes! Yes!";
+ mes "You do understand!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I volunteered for this medicine";
+ mes "storage position so that I can";
+ mes "secretly study poison! Now, the";
+ mes "time for action has come!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Still, I'll need some materials to";
+ mes "complete my research. Then, when";
+ mes "I succeeed and create a poison pill,";
+ mes "I'll need someone to carry my";
+ mes "revenge out for me.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Since my body is so frail, I can't";
+ mes "bear the tension and rage of seeing";
+ mes "my lifelong enemy face to face.";
+ set QL_POISONKING,7;
+ close;
+
+s_Pity:
+ mes "[Song Zhi Du]";
+ mes "I'm so disappointed.";
+ mes "You've even seen the";
+ mes "pitiable state of my";
+ mes "master for yourself!";
+ mes "How could you not";
+ mes "understand me?!";
+ next;
+ menu "I'm sorry for the last time",s_Sorry,"No matter what, revenge isn't good.",-;
+
+ specialeffect 11;
+ mes "[Song Zhi Du]";
+ mes "Oh, forget about it";
+ mes "I don't think I can ever";
+ mes "make you understand how I feel.";
+ close;
+
+s_Sorry:
+ mes "[Song Zhi Du]";
+ mes "If you really";
+ mes "feel sorry for me,";
+ mes "then you must help me";
+ mes "carry out my revenge!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I still need to complete the";
+ mes "poison potion I'm creating. I hope";
+ mes "you can bring what I need to finish";
+ mes "it. Go and get me...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "^0000FF4 Bee Sting^000000,";
+ mes "^0000FF10 Venom Canine^000000,";
+ mes "^0000FF10 Empty Potion Bottle^000000,";
+ mes "^0000FF30 Green Potion^000000.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "An apology is fine, but you must";
+ mes "also show me that you are sorry and";
+ mes "help me carry out my plan. Do you";
+ mes "have any problem with this?";
+ set QL_POISONKING,7;
+ close;
+
+s_Materials2:
+ mes "[Song Zhi Du]";
+ mes "So, did you";
+ mes "gather everything";
+ mes "I asked of you?";
+ next;
+ menu "Yes.",s_Items,"What do you need again?",-;
+
+ mes "[Song Zhi Du]";
+ mes "^111111*Sigh...*^000000";
+ mes "Go and get me...";
+ next;
+ specialeffect 11;
+ mes "[Song Zhi Du]";
+ mes "^0000FF4 Bee Sting^000000,";
+ mes "^0000FF10 Venom Canine^000000,";
+ mes "^0000FF10 Empty Potion Bottle^000000,";
+ mes "^0000FF30 Green Potion^000000.";
+ close;
+
+s_Items:
+ if(countitem(939) < 4 || countitem(937) < 10 || countitem(1093) < 10 || countitem(506) < 30)goto s_NEnoughItems;
+ delitem 939,4; //Bee Sting
+ delitem 937,10; //Venom Canine
+ delitem 1093,10; //Empty Potion Bottle
+ delitem 506,30; //Green Potion
+ set QL_POISONDISLIKED,0;
+ mes "[Song Zhi Du]";
+ mes "Ah...";
+ mes "With these, I accept your apology";
+ mes "Thank you for all the trouble you";
+ mes "went through to get this stuff";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Now that you're this involved,";
+ mes "you're in this with me all the way!";
+ mes "I've been waiting for this";
+ mes "day for years...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "All that's left is to create this";
+ mes "poison, and then to get the";
+ mes "lord of Louyang to drink it..";
+ close;
+
+
+s_NEnoughItems:
+ mes "[Song Zhi Du]";
+ mes "Where are the things";
+ mes "I asked you to bring?";
+ mes "Are you testing my";
+ mes "patience or what?";
+ next;
+ specialeffect 11;
+ mes "[Song Zhi Du]";
+ mes "You're still missing some of the";
+ mes "items I need. I must have them all";
+ mes "in order to finish making this";
+ mes "poison!";
+ close;
+
+s_DeliveryMes:
+ emotion 0;
+ mes "[Song Zhi Du]";
+ mes "Ah, hello.";
+ mes "Please give me a minute,";
+ mes "I've just received a message.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Ah!";
+ mes "It says here";
+ mes "that my delivery";
+ mes "has finally arrived!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Would you bring me the";
+ mes "box from the firecracker";
+ mes "lady at the entrance";
+ mes "to Louyang? Thanks";
+ mes "in advance.";
+ set QL_POISONKING,8;
+ close;
+
+s_Thanked:
+ if(countitem(7126) == 0)goto s_WheresJellopy;
+ delitem 7126,1;
+ mes "[Song Zhi Du]";
+ mes "Ah. Thank you,";
+ mes "I needed this. Now,";
+ mes "shall we begin?";
+ next;
+ mes "[Song Zhi Du]";
+ mes "First, I shall mix a poison";
+ mes "extraced from Venom Canine";
+ mes "with a foreign liquid named";
+ mes "Karvodailnirol.";
+ next;
+ specialeffect 12;
+ mes "[Song Zhi Du]";
+ mes "Then, I add Green Herb extract,";
+ mes "poison extracted from Bee Sting and";
+ mes "a Large Jellopy into the liquid!";
+ mes "Finally, I must heat them all!";
+ next;
+ specialeffect 124;
+ specialeffect 20;
+ mes "[Song Zhi Du]";
+ mes "Finally, I have to carefully heat";
+ mes "the mixture and collect it all into";
+ mes "a Potion Bottle.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Now I've got to do this just";
+ mes "right. This is a very delicate";
+ mes "procedure...";
+ next;
+ specialeffect 17;
+ emotion 23;
+ mes "[Song Zhi Du]";
+ mes "No!! I failed again! ^656565*Sigh...*^000000 And";
+ mes "I spent a long time preparing all";
+ mes "of those materials...";
+ set QL_POISONKING,10;
+ close;
+
+s_WheresJellopy:
+ //Made up Dialog
+ emotion 0;
+ mes "[Song Zhi Du]";
+ mes "I was told by the lady at";
+ mes "the gate that she gave you";
+ mes "the ^0000FFLarge Jellopy^000000...";
+ mes "Yet you don't have it?";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I can't make the poison without";
+ mes "it. You'll have to find a new one";
+ mes "somehow.";
+ close;
+
+s_NotSure:
+ mes "[Song Zhi Du]";
+ mes "I'm not sure what went wrong.";
+ mes "Hmm, would you please help me";
+ mes "again? I've used all the materials";
+ mes "from last time.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "^0000FF4 Bee Sting^000000,";
+ mes "^0000FF10 Venom Canine^000000,";
+ mes "^0000FF10 Empty Potion Bottle^000000,";
+ mes "^0000FF30 Green Potion^000000 and";
+ mes "^0000FF1 Large Jellopy^000000.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "That's everything I'll need.";
+ mes "I would apologize, but since you've";
+ mes "shown that you'll help carry out my";
+ mes "revenge, I know you'll understand.";
+ set QL_POISONKING,11;
+ close;
+
+s_MaterialCheck:
+ if(countitem(939) < 4 || countitem(937) < 10 || countitem(1093) < 10 || countitem(506) < 30 || countitem(7126) < 1 )goto s_NEnoughItems2;
+ delitem 939,countitem(939); //Bee Sting
+ delitem 937,countitem(937); //Venom Canine
+ delitem 1093,countitem(1093); //Empty Potion Bottle
+ delitem 506,countitem(506); //Green Potion
+ delitem 7126,countitem(7126); //Large Jellopy
+ mes "[Song Zhi Du]";
+ mes "Oh! You brought";
+ mes "me everything I need!";
+ mes "I'm very impressed!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "You're the only one";
+ mes "who actually understands how";
+ mes "I feel. Thank you for gathering all";
+ mes "of these ^0000FFmaterials^000000.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Alright, now";
+ mes "to create the poison.";
+ mes "This is going to be tough.";
+ mes "Here we go...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "First, I shall mix a poison";
+ mes "extraced from Venom Canine";
+ mes "with a foreign liquid named";
+ mes "Karvodailnirol.";
+ next;
+ specialeffect 12;
+ mes "[Song Zhi Du]";
+ mes "Then, I add Green Herb extract,";
+ mes "poison extracted from Bee Sting and";
+ mes "a Large Jellopy into the liquid!";
+ mes "Finally, I must heat them all!";
+ next;
+ specialeffect 124;
+ specialeffect 20;
+ mes "[Song Zhi Du]";
+ mes "Finally, I have to carefully heat";
+ mes "the mixture and collect it all into";
+ mes "a Potion Bottle.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "^111111*Phew...*";
+ mes "Did...";
+ mes "Did I make it?";
+ next;
+
+ set @PKSuccessRate,rand(1,1000);
+ if(@PKSuccessRate > 700)
+ {
+ emotion 23;
+ specialeffect 20;
+ mes "[Song Zhi Du]";
+ mes "Hahaha~!";
+ mes "Success!";
+ mes "It works!";
+ mes "I finally created it!";
+ mes "Mwahahahahahaha!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Muhahahahaha!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Muhahahahaha!";
+ mes "Hahahahahahahahahahahaha!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I made it!";
+ mes "I made it!";
+ mes "Now, revenge will be mine!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Hahaha! Now, please";
+ mes "take this bottle. But be careful.";
+ mes "Even if you smell it just a little,";
+ mes "it can cause your body to";
+ mes "decompose, leading to death.";
+ getitem 678,2; //Poison Bottle
+ set QL_POISONKING,12;
+ close;
+ }
+ else
+ {
+ emotion 23;
+ specialeffect 17;
+ mes "[Song Zhi Du]";
+ mes "NO! I... I've failed again! And I";
+ mes "spent a long time getting";
+ mes "everything ready...";
+ close;
+ }
+
+s_NEnoughItems2:
+ //Made up dialog
+ mes "[Song Zhi Du]";
+ mes "You seem to be missing some";
+ mes "of the materials that I need,";
+ mes "don't come back until you get";
+ mes "them!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I will need the following:";
+ mes "^0000FF4 Bee Sting^000000,";
+ mes "^0000FF10 Venom Canine^000000,";
+ mes "^0000FF10 Empty Potion Bottle^000000,";
+ mes "^0000FF30 Green Potion^000000 and";
+ mes "^0000FF1 Large Jellopy^000000.";
+ close;
+
+s_LordDie:
+ mes "[Song Zhi Du]";
+ mes "Hahahaha...!";
+ mes "Now, time has come.";
+ mes "With this poison, Louyang's";
+ mes "lord will be cast into hell!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "If they lied about my master,";
+ mes "then I'll simply make their lies";
+ mes "into truth. Then, my master";
+ mes "won't feel victimized!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Lord Bai Long!";
+ mes "You will die!";
+ mes "Ha HA HA HA HA!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Muhahahahaha!";
+ mes "Hahaha...Haha..hahaha..haha..hahah";
+ mes "ahaha...mmmmuhahahahahahahahahaha!!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Muhahahahahaha!";
+ mes "............";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Ah, forgive me.";
+ mes "I was overly excited.";
+ mes "Yes, I must calm down...";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Now, I have one last favor to ask";
+ mes "of you. Please sneak into the";
+ mes "Castle of the Dragon.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "I want you to put this poison some";
+ mes "place where Lord Bai Long might";
+ mes "stay. But be careful, the castle";
+ mes "has a lot of security.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Still, you're an adventurer from";
+ mes "Rune-Midgard. You've probably had";
+ mes "challenges like this before, so I'm";
+ mes "sure you'll find a way.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Anyway, I'm sure my master";
+ mes "will be happy to know that";
+ mes "I finally created the ^0000FFpoison";
+ mes "he wished to create^000000!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Hahaha...!";
+ mes "Master, I did it!";
+ mes "Your disciple Song Zhi Du made the";
+ mes "world's deadliest poison for you!";
+ set QL_POISONKING,13;
+ close;
+
+s_Security:
+ mes "[Song Zhi Du]";
+ mes "Remember...";
+ mes "The Castle of the Dragon";
+ mes "is under heavy surveillance.";
+ mes "I guess Lord Bai Long is";
+ mes "insecure. Heh heh.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Anyways, I hope you'll be";
+ mes "really careful. When you go in,";
+ mes "don't forget to use this poison";
+ mes "somewhere the Lord Bai Long";
+ mes "can ingest it.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Anyway, I'm sure my master";
+ mes "will be happy to know that";
+ mes "I finally created the ^0000FFpoison";
+ mes "he wished to create^000000!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Hahaha...!";
+ mes "Master, I did it!";
+ mes "Your disciple Song Zhi Du made the";
+ mes "world's deadliest poison for you!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Leave now,";
+ mes "my friend!";
+ mes "For my revenge!";
+ mes "Go and kill Lord Bai Long!";
+ close;
+
+s_CameBack:
+ mes "[Song Zhi Du]";
+ mes "Ah!";
+ mes "You came back!";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Ah yes.";
+ mes "All I have to do now";
+ mes "is wait and hear news";
+ mes "of Lord Bai Long's death.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Thank you so much, my friend.";
+ mes "You've satisfied my old grudge.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Now, I am getting tired.";
+ mes "Let me rest... Take care, my";
+ mes "friend, and travel in safety.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "But before you go, let me give you";
+ mes "some poison and a medicinal pill.";
+ mes "I made these with the leftover";
+ mes "materials and medicine in the";
+ mes "storage.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Please take the";
+ mes "medicine pill";
+ mes "right away.";
+ next;
+ mes "^3131FFYou swallowed a strange pill";
+ mes "that shines with a gold color.";
+ mes "it tastes bitter...";
+ next;
+ mes "^3131FFThe nasty taste lingers in your";
+ mes "mouth but then you feel a great";
+ mes "warmth flowing throughout your";
+ mes "body. Eventually, you pass out.";
+ close2;
+ set QL_POISONKING,30;
+ set QL_POISONPATH,0;
+ getitem 678,3;
+ if(BaseLevel < 56)set BaseExp,BaseExp+8909;
+ else if(BaseLevel > 55 && BaseLevel < 61)set BaseExp,BaseExp+10213;
+ else if(BaseLevel > 60 && BaseLevel < 66)set BaseExp,BaseExp+17684;
+ else if(BaseLevel > 65 && BaseLevel < 71)set BaseExp,BaseExp+25411;
+ else if(BaseLevel > 70 && BaseLevel < 76)set BaseExp,BaseExp+68757;
+ else if(BaseLevel > 75 && BaseLevel < 81)set BaseExp,BaseExp+128246;
+ else if(BaseLevel > 80 && BaseLevel < 86)set BaseExp,BaseExp+142340;
+ else if(BaseLevel > 85 && BaseLevel < 91)set BaseExp,BaseExp+152052;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+366786;
+ warp "louyang.gat",270,136;
+ end;
+
+s_Proud:
+ mes "[Song Zhi Du]";
+ mes "Nagash Arses is also the name of";
+ mes "the Poison King in a legend of";
+ mes "Arcturus. There's good reasons for";
+ mes "my master to be proud of hise name!";
+ close;
+
+s_Told:
+ mes "[Song Zhi Du]";
+ mes "Ah...";
+ mes "Welcome.";
+ mes "My master told";
+ mes "me everything.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Somehow, I feel relieved, but sorry";
+ mes "at the same time. Still, now I can";
+ mes "forget everything that's happened";
+ mes "in the past.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Now, I've decided to focus more on";
+ mes "my medical studies so that I can";
+ mes "really save as many lives as I can.";
+ mes "I'm sorry I've been so rude to you";
+ mes "before.";
+ next;
+ mes "[Song Zhi Du]";
+ mes "Also, I hope you will";
+ mes "take these, since I don't";
+ mes "need them any longer.";
+ getitem 678,5; //Poison Bottle
+ set QL_POISONKING,18;
+ set QL_POISONPATH,0;
+ next;
+ mes "[Song Zhi Du]";
+ mes "Thank you";
+ mes "once again, friend.";
+ mes "Now if you'll excuse me,";
+ mes "i have many things to do...";
+ close;
+
+s_Busy:
+ mes "^3131FFSong Zhi Du is busily engaged with";
+ mes "organizing medicinal herbs. The";
+ mes "faint look of sadness that used to";
+ mes "be on his face now seems drained.";
+ next;
+ mes "^3131FFStill, from his movements and the";
+ mes "pace at which he is working, you";
+ mes "can tell that he loves what he is";
+ mes "doing. It seems that Song Zhi Du";
+ mes "has finally found his life's path.";
+ close;
+
+s_NoGoodIdea:
+ mes "[Song Zhi Du]";
+ mes "...................";
+ next;
+ mes "^3131FFSong Zhi Du looks blankly at the";
+ mes "ceiling. With his revenge, it seems";
+ mes "he's lost his motivation in life.";
+ mes "Was it a good idea to help him,";
+ mes "after all?";
+ next;
+ mes "^3131FFBy hearsay, the poisoned drink";
+ mes "didn't work so well, as a Thief";
+ mes "from a foreign land actually stole";
+ mes "the bottle.";
+ close;
+
+}
+
+lou_in02.gat,122,38,4 script Poison King 824,{
+
+ if(QL_POISONKING > 16 && QL_POISONKING != 30)goto s_Proud;
+ if(QL_POISONKING == 16)goto s_Letter;
+ if(QL_POISONKING == 15)goto s_Hope;
+ if(QL_POISONKING == 14 && QL_POISONPATH > 1)goto s_Happened;
+ if(QL_POISONKING == 30)goto s_Emo;
+ if(QL_POISONPATH == 2)goto s_StopHim;
+ if(QL_POISONKING == 13 || QL_POISONKING == 14)goto s_MetDisciple;
+ mes "[Nagash Arses]";
+ mes "It's been 40 years since I came";
+ mes "here. Hahaha, but it doesn't feel";
+ mes "like it's been that long.";
+ next;
+ mes "[Nagash Arses]";
+ mes "In the past, I was one of the";
+ mes "most renowned experts in the use";
+ mes "of poison. I even created a martial";
+ mes "art based on it's use, and formed my";
+ mes "own martial arts organization.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Now, those memories";
+ mes "don't even seem real";
+ mes "anymore. This poem is";
+ mes "all I can remember...";
+ next;
+ mes "[Nagash Arses]";
+ mes "As I lay in bed looking";
+ mes "up at the moonlight,";
+ mes " ";
+ mes "It looks like the ";
+ mes "frost on the ground.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I lift head up to look";
+ mes "at the bright moon,";
+ mes " ";
+ mes "I lower my head";
+ mes "feeling homesick.";
+ if(!QL_POISONKING)close;
+ next;
+ if(QL_POISONKING > 1)goto s_Menu2;
+ menu "Grin at him.",-,"Lament on his grief.",s_Grief,"Reprove him.",s_Reprove,"Listen to the poem again.",s_Again,"Show him a sad look.",s_Sad;
+
+ mes "[Nagash Arses]";
+ mes "Yeah, I don't blame you.";
+ mes "I know I look stupid. Legally,";
+ mes "I'm a criminal after all.";
+ mes "I don't have any friends and";
+ mes "there's no one I can trust.";
+ close;
+
+s_Grief:
+ mes "[Nagash Arses]";
+ mes "How can you sympathize?";
+ mes "I doubt anyone has had";
+ mes "experiences that are";
+ mes "much worse than mine...";
+ close;
+
+s_Reprove:
+ mes "What--? I haven't wrongers you in any";
+ mes "way! Why must you be so mean to an";
+ mes "old man? You don't even know half";
+ mes "of what I've gone though.";
+ close;
+
+s_Again:
+ mes "[Nagash Arses]";
+ mes "As I lay in bed looking";
+ mes "up at the moonlight,";
+ mes " ";
+ mes "It looks like the ";
+ mes "frost on the ground.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I lift head up to look";
+ mes "at the bright moon,";
+ mes " ";
+ mes "I lower my head";
+ mes "feeling homesick.";
+ close;
+
+s_Sad:
+ mes "[Nagash Arses]";
+ mes "Do you miss your hometown";
+ mes "as much as I do? I'm envious";
+ mes "of you, youngster. You have";
+ mes "the freedom to go";
+ mes "wherever you want.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I'm a wanted criminal.";
+ mes "Even if I were free to";
+ mes "travel, I may not have";
+ mes "the strength to try.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Let's not talk about this any";
+ mes "longer. It's reminded me of";
+ mes "my worst memories.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I'm too old to remember anything.";
+ mes "Ha ha ha. Maybe if I saw something";
+ mes "related to poison, I might remember";
+ mes "something.";
+ next;
+ mes "[Nagash Arses]";
+ mes "...";
+ next;
+ mes "[Nagash Arses]";
+ mes "No, no...";
+ mes "I think I'm too old";
+ mes "to remember anything.";
+ mes "Anything at all.";
+ set QL_POISONKING,2;
+ close;
+
+s_Menu2:
+ menu "Ask about the poem.",-,"Ask about his hometown.",s_Hometown,"Ask him about use of poison.",s_Poison,"Ask about his situation.",s_Situation;
+
+ mes "[Nagash Arses]";
+ mes "Ah, have you";
+ mes "heard of this poem?";
+ mes "As I grow older, my";
+ mes "memory also drows worse,";
+ mes "but I really like this poem";
+ mes "and don't want to forget it.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I hope you don't";
+ mes "mind helping me";
+ mes "memorize this poem...";
+ next;
+ set @PKrand,rand(0,2);
+ if(@PKrand == 0)
+{
+ mes "[Nagash Arses]";
+ mes "^3131FF'As I lay ^000000[ ]^3131FF looking up at the";
+ mes "moonlight.'^000000 In this first line,";
+ mes "what word should be in [ ]?";
+ next;
+ menu "on the ground",s_1,"with you",s_1,"in bed",-,"in the stars",s_1;
+ set @PKtest,@PKtest+1;
+
+s_1:
+ mes "[Nagash Arses]";
+ mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
+ mes "ground.'^000000 In the second line, which";
+ mes "word should be in [ ]?";
+ next;
+ menu "Frost",-,"Dew",s_2,"Pebbles",s_2,"Snow",s_2;
+ set @PKtest,@PKtest+1;
+
+s_2:
+ mes "[Nagash Arses]";
+ mes "Now to see if you really";
+ mes "understand the poem. It's no";
+ mes "use to just know the words. They";
+ mes "must be a part of you as well.";
+ next;
+ mes "[Nagash Arses]";
+ mes "How would you describe the overall";
+ mes "mood and tone of the speaker of";
+ mes "this poem?";
+ next;
+ menu "Romantic",s_3,"Wistful",s_3,"Regretful",-,"Passionate",s_3;
+ set @PKtest,@PKtest+1;
+
+s_3:
+ set @PKrand2,rand(0,1);
+ if(!@PKrand2)
+ {
+ mes "[Nagash Arses]";
+ mes "What do you think is the major";
+ mes "theme of this poem?";
+ next;
+ menu "Tragedy",s_4,"Seperation",-,"Love",s_4,"Revenge",s_4,"Buddy Cop Film",s_4;
+ }
+ if(@PKrand2)
+ {
+ mes "[Nagash Arses]";
+ mes "According to the poem,";
+ mes "where is the location";
+ mes "of the speaker as he is";
+ mes "gazing at the moon?";
+ next;
+ menu "In his hometown",s_4,"In jail",s_4,"In the depths of the cosmos.",s_4,"In bed",-;
+ }
+ set @PKtest,@PKtest+1;
+
+s_4:
+ mes "[Nagash Arses]";
+ mes "Ha ha ha! You undestand this poem";
+ mes "well! Now, would you repeat the";
+ mes "first line for me again?";
+ next;
+ menu "When I lay in bed looking up at the moonlight",s_5,"When I lay in bed thinking of the moonlight",s_5,"As I lay in bed looking up at the moonlight",-,"As I lay in bed thinking of the moonlight",s_5;
+ set @PKtest,@PKtest+1;
+
+s_5:
+}
+ if(@PKrand == 1)
+{
+ mes "[Nagash Arses]";
+ mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
+ mes "ground.'^000000 In the second line, which";
+ mes "word should be in [ ]?";
+ next;
+ menu "Frost",-,"Dew",s_6,"Pebbles",s_6,"Snow",s_6;
+ set @PKtest,@PKtest+1;
+
+s_6:
+ mes "[Nagash Arses]";
+ mes "^3131FFI lower my head feeling ^000000[ ]^3131FF.^000000'";
+ mes "Which word should be in [ ]?";
+ next;
+ menu "Homesick",-,"Drowsy",s_7,"Loneliness",s_7,"Heartbroken",s_7;
+ set @PKtest,@PKtest+1;
+
+s_7:
+ mes "[Nagash Arses]";
+ mes "Now to see if you really";
+ mes "understand the poem. It's no";
+ mes "use to just know the words. They";
+ mes "must be a part of you as well.";
+ next;
+ mes "[Nagash Arses]";
+ mes "in the first two lines, what";
+ mes "is being linked by the poet?";
+ next;
+ menu "Bed and ground.",s_8,"Frost and hometown.",-,"Gloomy.",s_8,"Smokey.",s_8,"Moonlight and Frost.",s_8;
+ set @PKtest,@PKtest+1;
+
+s_8:
+ mes "[Nagash Arses]";
+ mes "In this land, the image of the moon";
+ mes "often appears in poems expressing";
+ mes "seperation, longing and";
+ mes "homesickness. Why would gazing at";
+ mes "the moon offer comfort?";
+ next;
+ menu "The rabbit on the moon grants wishes.",s_9,"It's sheer beauty eases anxiety",s_9,"Because it wanes and waxes",s_9,"All people and places share the same moon",-;
+ set @PKtest,@PKtest+1;
+
+s_9:
+ mes "[Nagash Arses]";
+ mes "Ha ha ha! You understand this poem";
+ mes "well! Now, would you repeat the";
+ mes "third line for me again?";
+ next;
+ menu "I look upon the bright moon",s_10,"I lift my head to look at the bright moon.",-,"I turn my head to look at the bright moon.",s_10,"I face the bright moon.",s_10;
+ set @PKtest,@PKtest+1;
+
+s_10:
+}
+ if(@PKrand == 2)
+{
+ mes "[Nagash Arses]";
+ mes "^3131FF'It looks like the ^000000[ ]^3131FF on the";
+ mes "ground.'^000000 In the second line, which";
+ mes "word should be in [ ]?";
+ next;
+ menu "Frost",-,"Dew",s_11,"Pebbles",s_11,"Snow",s_11;
+ set @PKtest,@PKtest+1;
+
+s_11:
+ mes "[Nagash Arses]";
+ mes "^3131FF'I lift my ^000000[ ]^3131FF to look at the";
+ mes "bright moon.'^000000 In the third line,";
+ mes "which word should be in [ ]?";
+ next;
+ menu "eyes",s_12,"head",-,"gaze",s_12,"sights",s_12;
+ set @PKtest,@PKtest+1;
+
+s_12:
+ mes "[Nagash Arses]";
+ mes "Now to see if you really";
+ mes "understand this poem. It's no";
+ mes "use to just know the words. They";
+ mes "must be a part of you as well.";
+ next;
+ mes "[Nagash Arses]";
+ mes "What do you think is the major";
+ mes "theme of this poem?";
+ next;
+ menu "Tragedy",s_13,"Seperation",-,"Love",s_13,"Revenge",s_13,"Buddy Cop Film",s_13;
+ set @PKtest,@PKtest+1;
+
+s_13:
+ set @PKrand2,rand(0,1);
+ if(!@PKrand2)
+ {
+ mes "[Nagash Arses]";
+ mes "What might be one reason why the";
+ mes "bright moonlight looks like frost";
+ mes "on the ground to the poet?";
+ next;
+ menu "He's looking though a frosty window",s_14,"A bright moon glimmers like icicles",-,"He's homesick, so the moonlight looks cold.",s_14,"It's called 'Poetic Lisense.'",s_14;
+ }
+ if(@PKrand2)
+ {
+ mes "[Nagash Arses]";
+ mes "Although this poem is only four";
+ mes "lines long, it's structure can be";
+ mes "easily classified. How would you";
+ mes "describe this poem's structure?";
+ next;
+ menu "Why it's a sonnet",s_14,"It's a prose with erratic caesuras",s_14,"It's a quatrain of course",-,"Lambic Pentameter?",s_14;
+ }
+ set @PKtest,@PKtest+1;
+
+s_14:
+ mes "[Nagash Arses]";
+ mes "Ha ha ha! You understand this poem";
+ mes "well! Now, would you repeat the";
+ mes "last line for me again?";
+ next;
+ menu "I cry for my home town.",s_15,"I lower my head feeling homesick.",-,"I miss my home town",s_15,"I sob feeling homesick.",s_15;
+ set @PKtest,@PKtest+1;
+
+s_15:
+}
+ if(@PKtest == 5 && QL_POISONKING == 2)set QL_POISONKING,3;
+ mes "[Nagash Arses]";
+ mes "Thank you for yout time,";
+ mes "youngster. Oh, and this is";
+ mes "an old, famous poem written";
+ mes "by Li Tai Bai. You know that,";
+ mes "don't you?";
+ close;
+
+s_Hometown:
+ mes "[Nagash Arses]";
+ mes "Are you asking me";
+ mes "about my hometown...?";
+ mes "As a Rune-Midgardian,";
+ mes "I'm sure you've at least";
+ mes "heard of Morroc...";
+ next;
+ mes "[Nagash Arses]";
+ mes "A city built in the middle of the";
+ mes "desert, its founders had to combat";
+ mes "the harsh and unforgiving forces of";
+ mes "nature everyday.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Yeah, the blazing sun never";
+ mes "seems to leave, and it's a dry,";
+ mes "desert area, but people still";
+ mes "manage to live there.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Ah~ I miss Morroc, my hometown.";
+ mes "I used to be a member of the";
+ mes "Assassin organization known as the";
+ mes "'Canine of Desert.' Long ago, I was";
+ mes "their poison expert.";
+ next;
+ if(QL_POISONKING == 3)goto s_AltMenu;
+ menu "Tell him news of Morroc",s_News,"Info about 'Canine of Desert'",s_Canine;
+
+s_AltMenu:
+ menu "Tell him news of Morroc",s_News,"Info about 'Canine of Desert'",s_Canine,"Just listen",s_Listen;
+
+s_News:
+ mes "[Nagash Arses]";
+ mes "Hm...?";
+ mes "Is there anything";
+ mes "you want to say?";
+ next;
+ mes "[" + strcharinfo(0) +"]";
+ mes "I have news";
+ mes "of Morroc...";
+ input @PKstr$;
+ mes "[" + strcharinfo(0) +"]";
+ mes @PKstr$;
+ next;
+ mes "[Nagash Arses]";
+ mes "I see...";
+ mes "Thank you for";
+ mes "telling me that.";
+ close;
+
+s_Canine:
+ mes "[Nagash Arses]";
+ mes "I just told you what the 'Canine";
+ mes "of Desert' is. If you can't remember what";
+ mes "I just told you, it's no use for me";
+ mes "to explain further. You go ahead";
+ mes "and tell me what it is.";
+ next;
+ input @PKstr$;
+ mes "[Nagash Arses]";
+ mes "Well, I suppose I can't blame you";
+ mes "for not knowing or remembering.";
+ mes "When you get the chance, find";
+ mes "someone wearing a purple suit...";
+ next;
+ mes "[Nagash Arses]";
+ mes "Any Assassin worth his salt should";
+ mes "know what the 'Canine of Desert'";
+ mes "is.";
+ close;
+
+s_Listen:
+ mes "[Nagash Arses]";
+ mes "I tried Many things to develop my";
+ mes "poison skills when I was young.";
+ mes "I tried to extract poison from";
+ mes "Muka's needles and from purple";
+ mes "mushrooms. Eventually, I became";
+ mes "an expert of toxins from my";
+ mes "efforts. ";
+ next;
+ mes "[Nagash Arses]";
+ mes "One time I even injected";
+ mes "a poison into my own body";
+ mes "to fully test it. Yeah...";
+ mes "It almost killed me.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I was recognized as the man who";
+ mes "was most highly skilled in the use";
+ mes "of poison in the 'Canine of";
+ mes "Desert,' and I was sent on the most";
+ mes "crucial and dangerous missions.";
+ next;
+ mes "[Nagash Arses]";
+ mes "One day, I was hired by the Alberta";
+ mes "Merchant Guild to assassinate an";
+ mes "enemy that had been threatening";
+ mes "them. However, I never got to";
+ mes "complete that missions.";
+ next;
+ mes "[Nagash Arses]";
+ mes "While I was on the ship to proceed";
+ mes "with my mission, we encountered";
+ mes "heavy wind and waves, and the ship";
+ mes "sank. I believe I was the only";
+ mes "survivor of that accident.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I was floated helplessly on the";
+ mes "ocean and somehow managed";
+ mes "to arrive here, in Louyang. That";
+ mes "was forty years ago.";
+ next;
+ mes "[Nagash Arses]";
+ mes "It seemed that my arrival was";
+ mes "rather timely. Louyang was intruded";
+ mes "by huge mobs of dangerous monsters";
+ mes "that were able to infiltrate";
+ mes "the Castle of the Dragon.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Since I was one of the best";
+ mes "assassins of the 'Canine of";
+ mes "Desert.’ I did far more than my";
+ mes "share fair of monster killing.";
+ next;
+ mes "[Nagash Arses]";
+ mes "It was on the battlefield that";
+ mes "I met Bai Long who is now the Lord of";
+ mes "this town. But back then, he was";
+ mes "known as the 'Street Knight.'";
+ next;
+ mes "[Nagash Arses]";
+ mes "I remember seeing him surrounded";
+ mes "by enemies, and I dove into thick";
+ mes "of battle to keep him from getting";
+ mes "killed. We fought back to back and";
+ mes "managed to stay alive back then.";
+ next;
+ mes "[Nagash Arses]";
+ mes "You have to understand that it's";
+ mes "not easy to let someone back you";
+ mes "up in battle unless there's a solid";
+ mes "trust. Those sights... where the";
+ mes "greatest moments in my life.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Sadly, Many of our comrades,";
+ mes "all of them respectable and highly";
+ mes "skilled in martial artists, fell in";
+ mes "battle. The number of monsters we";
+ mes "had to contend with was just";
+ mes "overwhelming.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Still, I manage to continue my";
+ mes "poison research, even during those";
+ mes "tough times. I studied medicine in";
+ mes "this town and was able to use that";
+ mes "knowledge to enhance my";
+ mes "understanding of poisons.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I created a new skill based on all";
+ mes "of my knowledge, and learned how";
+ mes "to put poison on weapons.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I even learned martial arts in";
+ mes "Louyang, and combined that";
+ mes "knowledge with my poison expertise";
+ mes "to create my own unique fighting";
+ mes "style.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Well, that's my story.";
+ mes "But now, I just miss my";
+ mes "home town. I miss the heat";
+ mes "of the desert, and the glare";
+ mes "of the blazing sun.";
+ set QL_POISONKING,4;
+ close;
+
+s_Poison:
+ mes "[Nagash Arses]";
+ mes "Did you just say you";
+ mes "want to learn about the";
+ mes "use of poison?";
+ next;
+ mes "[Nagash Arses]";
+ mes "Why would you want";
+ mes "to learn about it?";
+ mes "Even if I wanted to";
+ mes "teach, I'm too old to";
+ mes "remember everything";
+ mes "clearly...";
+ if(QL_POISONKING > 4)goto s_Disciple;
+ close;
+
+s_Disciple:
+ next;
+ mes "[Nagash Arses]";
+ mes "Go find my last disciple,";
+ mes "^0000FFSong Zhi Du^000000, as he may tell you";
+ mes "something useful. He's working at";
+ mes "the doctor's office. If it weren't";
+ mes "for him, I'd be starving now.";
+ if(QL_POISONKING == 5)set QL_POISONKING,6;
+ close;
+
+s_Situation:
+ if(QL_POISONKING == 4)goto s_Situation2;
+ mes "[Nagash Arses]";
+ mes "I...";
+ mes "I don't want";
+ mes "to talk about that.";
+ mes "Let's not talk about it.";
+ close;
+
+s_Situation2:
+ mes "[Nagash Arses]";
+ mes "You're asking me how";
+ mes "things came to be like";
+ mes "this? Life used to be good.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Ah I told you, I distinguished";
+ mes "myself in the battles with";
+ mes "monsters. I was rewarded with";
+ mes "Louyang citizenship and given";
+ mes "gifts of money.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I was invited to join a martial";
+ mes "arts organization that specialized";
+ mes "in the use of poison. I joined";
+ mes "them, excited about further";
+ mes "broadening my knowldege.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I was stunned by the enormous body";
+ mes "of knowledge about toxins that they";
+ mes "provided. I tried to learn as much";
+ mes "as I could so I could develop my";
+ mes "own, unique poisoning skills.";
+ next;
+ mes "[Nagash Arses]";
+ mes "As I studied with them, together we";
+ mes "started to clear the town of the";
+ mes "remaining monsters. Can you guess";
+ mes "the results of our effors to clean";
+ mes "up the city?";
+ next;
+ menu "..??",-,"It must have been good.",s_Good,"I guess it was okay.",s_Okay,"I don't know, but how did it go?",s_Dunno;
+
+ mes "[Nagash Arses]";
+ mes "Did you even listen to me? It's no";
+ mes "use talking to you if you don't";
+ mes "even care about what I have to";
+ mes "say.";
+ next;
+ goto s_False;
+
+s_Good:
+ mes "[Nagash Arses]";
+ mes "You're right!";
+ mes "We got rid of every";
+ mes "single monster in the city!";
+ next;
+ goto s_Right;
+
+s_Okay:
+ mes "[Nagash Arses]";
+ mes "Just okay...?";
+ mes "I don't think you realized how";
+ mes "powerful we were back then! Eh...";
+ next;
+ goto s_False;
+
+s_Dunno:
+ mes "[Nagash Arses]";
+ mes "We got rid of every single monster";
+ mes "in the city!";
+ next;
+
+s_Right:
+ mes "[Nagash Arses]";
+ mes "We managed to eliminate every";
+ mes "monster that was wandering around";
+ mes "Louyang. At the time, we were the";
+ mes "only people brave enough to take on";
+ mes "this sort of task.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Unfortunately, other martial arts";
+ mes "organizations grew envious of our";
+ mes "success, insisting that we were";
+ mes "dishonorable for using poison to";
+ mes "attack our enemies.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Although we can accept criticism";
+ mes "for our use of poison, we were";
+ mes "finally blamed for something we";
+ mes "never would have done.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Someone put poison into a meal";
+ mes "which was eaten by a son of the";
+ mes "lord and then falsely accused us!";
+ next;
+ mes "[Nagash Arses]";
+ mes "in the end, our organization was";
+ mes "disbanded and I was put in jail.";
+ mes "I suffered through much to escape";
+ mes "from prison...";
+ next;
+ mes "[Nagash Arses]";
+ mes "However, because of all the";
+ mes "injuries I've had to endure in jail";
+ mes "and in my escape attempts,";
+ mes "I can no longer use my";
+ mes "martial arts.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Even to this day, the police are";
+ mes "hounding after me. I really want to";
+ mes "tell the lord of Louyang that I'm";
+ mes "innocent, but it may be";
+ mes "too late now...";
+ set QL_POISONKING,5;
+ close;
+
+s_False:
+ mes "[Nagash Arses]";
+ mes "Sorry for keeping you from what you";
+ mes "wanted to do. Take care of";
+ mes "yourself, youngster.";
+ close;
+
+s_MetDisciple:
+ mes "[Nagash Arses]";
+ mes "Aren't you the youngster";
+ mes "I talked to a while ago?";
+ mes "Did you get a chance";
+ mes "to meet my disciple?";
+ mes "How was he?";
+ next;
+ mes "[Nagash Arses]";
+ mes "He was sick all the time when he";
+ mes "was young, so he worried me a lot.";
+ mes "But now I'm proud of him and he's";
+ mes "doing as well as just any other fine";
+ mes "young man.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I am living only for him,";
+ mes "and hope that he becomes a great";
+ mes "healer someday. Recently, I've";
+ mes "found that my sole comfort is in";
+ mes "treating diseases for other";
+ mes "people...";
+ next;
+ mes "[Nagash Arses]";
+ mes "By the way...";
+ mes "You look pale...";
+ mes "Did something happen?";
+ next;
+ menu "Nothing",-,"I want to talk about your disciple",s_TalkDisciple,"I don't feel good.",s_DontFeelG;
+
+ mes "[Nagash Arses]";
+ mes "Oh...";
+ mes "I see...";
+ mes "But take care";
+ mes "of yourself.";
+ next;
+ mes "[Nagash Arses]";
+ mes "You better enjoy your physical";
+ mes "strength when you're young. When";
+ mes "you're my age, it's tough to regain";
+ mes "your health once you lose it.";
+ close;
+
+s_TalkDisciple:
+ mes "[Nagash Arses]";
+ mes "Did something happen to him?";
+ mes "I've been worried since he hasn't";
+ mes "come to visit me since you last";
+ mes "came to speak with me.";
+ next;
+ if(QL_POISONPATH == 1)goto s_BeFine;
+ if(countitem(678))menu "Give him Poison Bottle.",s_Bottle,"Cancel and go to 'Song Zhi Du'.",-;
+ else
+ {
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Nothing much.";
+ close;
+ }
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "...Nothing much.";
+ next;
+s_BeFine:
+ mes "[Nagash Arses]";
+ mes "Hmm...?";
+ mes "I guess you don't know what is";
+ mes "going on. I've heard some bad";
+ mes "rumors about him, which is why I'm";
+ mes "asking.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I hope he'll be fine.";
+ mes "After all, he's truly";
+ mes "kind at heart.";
+ close;
+
+s_Bottle:
+ delitem 678,1;
+ mes "[Nagash Arses]";
+ mes "Huh!?";
+ mes "Isn't this...!?";
+ next;
+ mes "[Nagash Arses]";
+ mes "I've dreamed of creating";
+ mes "a poison of such potency!";
+ mes "W-where did you find this?";
+ next;
+ menu "It's common nowadays.",-,"Explain to him what happened.",s_Explain;
+
+ mes "[Nagash Arses]";
+ mes "Really...?";
+ mes "Then someone finally figured it out.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I shared all of my knowledge with";
+ mes "others, so I guess a doctor might";
+ mes "have figured out how to creat this.";
+ next;
+ mes "[Nagash Arses]";
+ mes "^666666*Sigh...*^000000";
+ mes "Now I feel depressed";
+ mes "for some reason..";
+ set QL_POISONPATH,1;
+ close;
+
+s_Explain:
+ mes "^3131FFYou tell Nagash Arses how";
+ mes "Song Zhi Du created this Deadly";
+ mes "Poison Bottle and his plan to get";
+ mes "his revenge on the lord of";
+ mes "Louyang.^000000";
+ next;
+ mes "[Nagash Arses]";
+ mes "^666666*Sigh...*^000000";
+ next;
+ mes "[Nagash Arses]";
+ mes "Will you...";
+ mes "Will you excuse";
+ mes "me for a second...?";
+ set QL_POISONPATH,2;
+ close;
+
+s_DontFeelG:
+ mes "[Nagash Arses]";
+ mes "Oh, you don't?";
+ mes "Well, that can happen";
+ mes "sometimes when you're";
+ mes "in a foreign land for";
+ mes "too long. I hope you";
+ mes "feel better soon.";
+ close;
+
+s_StopHim:
+ mes "[Nagash Arses]";
+ mes "Youngster...";
+ mes "I beg of you.";
+ mes "Please don not let him";
+ mes "bring any harm to the lord.";
+ next;
+ mes "[Nagash Arses]";
+ mes "If you cannot stop him,";
+ mes "then please interrupt him";
+ mes "from carrying out his plan.";
+ next;
+ mes "[Nagash Arses]";
+ mes "I tried...";
+ mes "To convince myself";
+ mes "that what I had heard";
+ mes "were just ugly rumors.";
+ mes "I was wrong...";
+ next;
+ mes "[Nagash Arses]";
+ mes "I am pretty sure he's been asking";
+ mes "you, as well as others, for aid.";
+ mes "Even if you do not agree to carry";
+ mes "out his plan, I'm sure he will find";
+ mes "someone to poison Lord Bai Long.";
+ next;
+ mes "[Nagash Arses]";
+ mes "There is only one way he can";
+ mes "poison the lord. He likes";
+ mes "drinking, and has a favorite";
+ mes "drink bottle he keeps with him";
+ mes "all the time. You must get rid";
+ mes "of his drink.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Please, I beg you.";
+ mes "for my sake, as well";
+ mes "as that of my disciple,";
+ mes "Louyang's leader must live...";
+ close;
+
+s_Emo:
+ mes "^3131FFNagash Arses. He is no longer a";
+ mes "well-known Assassin of the martial";
+ mes "arts organization of which he was";
+ mes "once master has lon since";
+ mes "disbanded.";
+ next;
+ mes "^3131FFNow he is but a poor old man";
+ mes "who is in anguish over his";
+ mes "disciple. No matter what you say,";
+ mes "he continues to talk about";
+ mes "something totally unrelated, as if";
+ mes "in a dream.";
+ close;
+
+s_Happened:
+ mes "[Nagash Arses]";
+ mes "So...";
+ mes "What..";
+ mes "What happened?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "i made it.";
+ next;
+ emotion 6;
+ mes "[Nagash Arses]";
+ mes "You did?!";
+ mes "Oh~ thank you,";
+ mes "thank you so much!";
+ next;
+ mes "[Nagash Arses]";
+ mes "Thank God I've";
+ mes "lived this long.";
+ mes "And... I just realized";
+ mes "something while you were away.";
+ next;
+ mes "[Nagash Arses]";
+ mes "This is a journal that I have been";
+ mes "writing for 15 years about my";
+ mes "feelings of guild, and what really";
+ mes "happened in the past. I hope you";
+ mes "can deliver this to the lord for";
+ mes "me.";
+ next;
+ mes "^3131FFYou obtained";
+ mes "^0000FFPoison King,";
+ mes "Nagash Arses' Journal.";
+ set QL_POISONKING,15;
+ close;
+
+s_Hope:
+ mes "[Nagash Arses]";
+ mes "I hope you";
+ mes "can deliver this";
+ mes "to Lord Bai Long...";
+ close;
+
+s_Letter:
+ mes "^3131FFYou gave him the";
+ mes "^0000FFLetter from Bai Long.^000000";
+ next;
+ mes "[Nagash Arses]";
+ mes "What's this...?";
+ next;
+ mes "[Nagash Arses]";
+ mes "Why, he's invited me";
+ mes "to take the position of";
+ mes "a government official!";
+ mes "I'm truly grateful!";
+ next;
+ mes "[Nagash Arses]";
+ mes "However, please let him";
+ mes "know that I must respectfully";
+ mes "decline his offer. I'm afraid that";
+ mes "I may be a burden to him once";
+ mes "again.";
+ next;
+ mes "[Nagash Arses]";
+ mes "Please tell him that I wish to";
+ mes "enjoy the rest of my life here.";
+ mes "Also, there are people here";
+ mes "who still need me...";
+ next;
+ mes "[Nagash Arses]";
+ mes "Thank you, youngster.";
+ mes "You've stopped my disciple";
+ mes "and helped me make up";
+ mes "with an old friend...";
+ next;
+ mes "^3131FFNagash Arses put his palm on your";
+ mes "back, and you can feel his strength";
+ mes "flowing into you.";
+ percentheal 100,100;
+ next;
+ mes "^3131FFYou grow dizzy, but you can also feel";
+ mes "like you're becoming more powerful";
+ mes "and gaining experience.";
+ if(BaseLevel < 56)set BaseExp,BaseExp+9000;
+ else if(BaseLevel > 55 && BaseLevel < 61)set BaseExp,BaseExp+10500;
+ else if(BaseLevel > 60 && BaseLevel < 66)set BaseExp,BaseExp+18684;
+ else if(BaseLevel > 65 && BaseLevel < 71)set BaseExp,BaseExp+27411;
+ else if(BaseLevel > 70 && BaseLevel < 76)set BaseExp,BaseExp+70757;
+ else if(BaseLevel > 75 && BaseLevel < 81)set BaseExp,BaseExp+130246;
+ else if(BaseLevel > 80 && BaseLevel < 86)set BaseExp,BaseExp+150340;
+ else if(BaseLevel > 85 && BaseLevel < 91)set BaseExp,BaseExp+182052;
+ else if(BaseLevel > 90)set BaseExp,BaseExp+406786;
+ set QL_POISONKING,17;
+ close2;
+ warp "louyang.gat",270,136;
+ end;
+
+s_Proud:
+ mes "[Nagash Arses]";
+ mes "My name, Nagash Arses,";
+ mes "is also the name of the poison king";
+ mes "in the legend of Arcturus. I have";
+ mes "a good reason to be proud of my";
+ mes "name!";
+ close;
+
+}
+
+lou_in01.gat,101,124,0 script #LouSoldChk 139,100,0,{
+ if(QL_POISONKING == 13)goto s_SoldChk;
+ end;
+
+s_SoldChk:
+ mes "[Soldier]";
+ mes "Who goes there!";
+ next;
+ mes "^3131FFYou ran away as quickly as you";
+ mes "could!";
+ close2;
+ warp "louyang.gat",218,249;
+ end;
+
+}
+
+lou_in01.gat,115,163,0 script #LouSoldChk2 139,0,2,{
+ if(QL_POISONKING == 13)goto s_SoldChk;
+ end;
+
+s_SoldChk:
+ mes "[Soldier]";
+ mes "Who goes there!";
+ next;
+ mes "^3131FFYou escape before the soldier can";
+ mes "find you.";
+ close2;
+ warp "louyang.gat",217,278;
+ end;
+
+}
+
+lou_in01.gat,115,163,0 script #LouSoldChk3 139,25,0,{
+ if(QL_POISONKING == 13)goto s_SoldChk;
+ end;
+
+s_SoldChk:
+ mes "[Soldier]";
+ mes "Who goes there!";
+ next;
+ mes "^3131FFYou escape before the soldier can";
+ mes "find you.";
+ close2;
+ warp "louyang.gat",217,278;
+ end;
+
+}
+louyang.gat,218,278,0 script #LouSecEntrnc 111,{
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "What's this?";
+ mes "A crack in the wall?";
+ next;
+ mes "^3131FFYou jump to the stone wall and peek into the crack. It looks big enough for someone to squeeze through.";
+ next;
+ mes "You move through the crack as";
+ mes "quickly as you can.";
+ close2;
+ warp "lou_in01.gat",119,167;
+ end;
+
+}
+
+lou_in01.gat,117,167,0 script #LouSecExit 111,{
+
+ mes "[" + strcharinfo(0) + "]";
+ mes "What's this?";
+ mes "A crack in the wall?";
+ next;
+ mes "^3131FFYou jump to the stone wall and peek into the crack. It looks big enough for someone to squeeze through.";
+ next;
+ mes "You move through the crack as";
+ mes "quickly as you can.";
+ close2;
+ warp "louyang.gat",217,278;
+ end;
+
+}
+
+lou_in01.gat,106,162,0 script #BaiLongBottle 111,{
+
+ if(QL_POISONPATH > 1 && countitem(713) && countitem(938))goto s_Save;
+ if(QL_POISONKING != 13)goto s_Fancy;
+ mes "^3131FFYou found a drink bottle that's";
+ mes "possibly owned by Bai Long, lord of";
+ mes "Louyang.^000000";
+ if(QL_POISONPATH < 2 && countitem(678))goto s_Assassinate;
+ close;
+
+s_Assassinate:
+ next;
+ delitem 678,1; //Poison Bottle
+ mes "^3131FFYou put the deadly poison into the bottle.";
+ set QL_POISONKING,14;
+ next;
+ mes "^3131FFIt would be smart to get out of this place as soon as you can.";
+ close;
+
+s_Fancy:
+ mes "^3131FFYou found a drink bottle. It's fancy enough that the only possible owner could be Bai Long, lord of Louyang.";
+ close;
+
+s_Save:
+ mes "^3131FFYou take the drink bottle and replace it with a bottle filled with sticky mucus. Hopefully Bai Long won't notice!";
+ delitem 713,1; //Empty Bottle
+ delitem 938,1; //Stick Mucus
+ set QL_POISONKING,14;
+ close;
+
+}
diff --git a/npc/quests/quests_lutie.txt b/npc/quests/quests_lutie.txt
index 8be6282e0..d32da5cd7 100644
--- a/npc/quests/quests_lutie.txt
+++ b/npc/quests/quests_lutie.txt
@@ -1,178 +1,178 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Lutie
-//===== By: ==================================================
-//= TonyMan
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Blush, Cake Hat, Candle, Chef Hat, Raccoon Hat, Rainbow Eggshell,
-//= Spore Hat, Wonder Nutshell Quests
-//===== Additional Comments: =================================
-//= 1.1 Optimized [Lupus]
-//= 1.2 Fixed Chef Hat items [Lupus]
-//============================================================
-
-xmas.gat,117,295,3 script Titicupe 704,{
- mes "[^469ED2Titicupe^000000]";
- mes "I am the well known ^27BEB7Vending Machine Man Titicupe^000000, I am also a Wizard of the great ^9A3CA2Geffen Mage Guild^000000. I can use my special magic to make some rare items, but I need ingridients. Choose an item you want.";
- next;
- menu "Blush",-,"Cake Hat",cake_hat,"Candle",candle,"Chef Hat",chef_hat,"Raccoon Hat",raccoon_hat,"Rainbow Eggshell",rainbow_egg,"Spore Hat",spore_hat,"Wonder Nutshell",wonder_nut,"Cancel",M_Cancel;
-
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "100 Alice's Apron";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(7047)<100) goto L_NoItem;
- delitem 7047,100;
- getitem 5040,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^D6294BBlush^000000, it's yours.";
- close;
-
-cake_hat:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "10 Candy";
- mes "5 Candy Cane";
- mes "20 Piece of Cake";
- mes "10 Steel";
- mes "15 Well-baked Cookie";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(529)<10 || countitem(530)<5 || countitem(539)<20 || countitem(999)<10 || countitem(538)<15) goto L_NoItem;
- delitem 529,10;
- delitem 530,5;
- delitem 539,20;
- delitem 999,10;
- delitem 538,15;
- getitem 5024,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBACake Hat^000000, it's yours.";
- close;
-
-candle:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "1 Bomb Wick";
- mes "50 Matchstick";
- mes "100 Royal Jelly";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(2279)<1 || countitem(7035)<50 || countitem(526)<100) goto L_NoItem;
- delitem 2279,1;
- delitem 7035,50;
- delitem 526,100;
- getitem 5028,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBACandle^000000, it's yours.";
- close;
-
-chef_hat:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "450 Dragon Scale";
- mes "330 Feather";
- mes "120 Piece of Cake";
- mes " 1 White Dyestuffs";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(1036)<450 || countitem(949)<330 || countitem(539)<120 || countitem(982)<1) goto L_NoItem;
- delitem 1036,450;
- delitem 949,330;
- delitem 539,120;
- delitem 982,1;
- getitem 5026,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBAChef Hat^000000, it's yours.";
- close;
-
-raccoon_hat:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "20 Dragon Scale";
- mes "1 Kitty Band";
- mes "300 Sea-otter Fur";
- mes "200 Tough Scalelike Stem";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(1036)<20 || countitem(2213)<1 || countitem(7065)<300 || countitem(7012)<200) goto L_NoItem;
- delitem 1036,20;
- delitem 2213,1;
- delitem 7065,300;
- delitem 7012,200;
- getitem 5033,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Raccoon Hat^000000, it's yours.";
- close;
-
-rainbow_egg:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "50 Claw of Desert Wolf";
- mes "1 Cobaltblue Dyestuffs";
- mes "1 Egg Shell";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(7030)<50 || countitem(978)<1 || countitem(5015)<1) goto L_NoItem;
- delitem 7030,50;
- delitem 978,1;
- delitem 5015,1;
- getitem 5039,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^8D4178Rainbow Egg^000000, it's yours.";
- close;
-
-spore_hat:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "300 Burnt Tree";
- mes "850 Poison Spore";
- mes "1 Tongue";
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(7068)<300 || countitem(7033)<850 || countitem(1015)<1) goto L_NoItem;
- delitem 7068,300;
- delitem 7033,850;
- delitem 1015,1;
- getitem 5029,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Spore Hat^000000, it's yours.";
- close;
-
-wonder_nut:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "1 Nut Shell";
- mes "500 Wing of Dragonfly";
-
- next;
- menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
-
- if(countitem(5037)<1 || countitem(7064)<500) goto L_NoItem;
- delitem 5037,1;
- delitem 7064,500;
- getitem 5050,1;
- mes "[^469ED2Titicupe^000000]";
- mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Wonder Nutshell^000000, it's yours.";
- close;
-
-M_Cancel:
- mes "[^469ED2Titicupe^000000]";
- mes "I bid you farewell, try not to catch a cold out here. It's ^5A9FD8freezing out here!^000000";
- close;
-
-L_NoItem:
- mes "[^469ED2Titicupe^000000]";
- mes "I can't cast since you don't seem to have all I need...";
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Lutie
+//===== By: ==================================================
+//= TonyMan
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Blush, Cake Hat, Candle, Chef Hat, Raccoon Hat, Rainbow Eggshell,
+//= Spore Hat, Wonder Nutshell Quests
+//===== Additional Comments: =================================
+//= 1.1 Optimized [Lupus]
+//= 1.2 Fixed Chef Hat items [Lupus]
+//============================================================
+
+xmas.gat,117,295,3 script Titicupe 704,{
+ mes "[^469ED2Titicupe^000000]";
+ mes "I am the well known ^27BEB7Vending Machine Man Titicupe^000000, I am also a Wizard of the great ^9A3CA2Geffen Mage Guild^000000. I can use my special magic to make some rare items, but I need ingridients. Choose an item you want.";
+ next;
+ menu "Blush",-,"Cake Hat",cake_hat,"Candle",candle,"Chef Hat",chef_hat,"Raccoon Hat",raccoon_hat,"Rainbow Eggshell",rainbow_egg,"Spore Hat",spore_hat,"Wonder Nutshell",wonder_nut,"Cancel",M_Cancel;
+
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "100 Alice's Apron";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(7047)<100) goto L_NoItem;
+ delitem 7047,100;
+ getitem 5040,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^D6294BBlush^000000, it's yours.";
+ close;
+
+cake_hat:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "10 Candy";
+ mes "5 Candy Cane";
+ mes "20 Piece of Cake";
+ mes "10 Steel";
+ mes "15 Well-baked Cookie";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(529)<10 || countitem(530)<5 || countitem(539)<20 || countitem(999)<10 || countitem(538)<15) goto L_NoItem;
+ delitem 529,10;
+ delitem 530,5;
+ delitem 539,20;
+ delitem 999,10;
+ delitem 538,15;
+ getitem 5024,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBACake Hat^000000, it's yours.";
+ close;
+
+candle:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "1 Bomb Wick";
+ mes "50 Matchstick";
+ mes "100 Royal Jelly";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(2279)<1 || countitem(7035)<50 || countitem(526)<100) goto L_NoItem;
+ delitem 2279,1;
+ delitem 7035,50;
+ delitem 526,100;
+ getitem 5028,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBACandle^000000, it's yours.";
+ close;
+
+chef_hat:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "450 Dragon Scale";
+ mes "330 Feather";
+ mes "120 Piece of Cake";
+ mes " 1 White Dyestuffs";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(1036)<450 || countitem(949)<330 || countitem(539)<120 || countitem(982)<1) goto L_NoItem;
+ delitem 1036,450;
+ delitem 949,330;
+ delitem 539,120;
+ delitem 982,1;
+ getitem 5026,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^BD3CBAChef Hat^000000, it's yours.";
+ close;
+
+raccoon_hat:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "20 Dragon Scale";
+ mes "1 Kitty Band";
+ mes "300 Sea-otter Fur";
+ mes "200 Tough Scalelike Stem";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(1036)<20 || countitem(2213)<1 || countitem(7065)<300 || countitem(7012)<200) goto L_NoItem;
+ delitem 1036,20;
+ delitem 2213,1;
+ delitem 7065,300;
+ delitem 7012,200;
+ getitem 5033,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Raccoon Hat^000000, it's yours.";
+ close;
+
+rainbow_egg:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "50 Claw of Desert Wolf";
+ mes "1 Cobaltblue Dyestuffs";
+ mes "1 Egg Shell";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(7030)<50 || countitem(978)<1 || countitem(5015)<1) goto L_NoItem;
+ delitem 7030,50;
+ delitem 978,1;
+ delitem 5015,1;
+ getitem 5039,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^8D4178Rainbow Egg^000000, it's yours.";
+ close;
+
+spore_hat:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "300 Burnt Tree";
+ mes "850 Poison Spore";
+ mes "1 Tongue";
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(7068)<300 || countitem(7033)<850 || countitem(1015)<1) goto L_NoItem;
+ delitem 7068,300;
+ delitem 7033,850;
+ delitem 1015,1;
+ getitem 5029,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Spore Hat^000000, it's yours.";
+ close;
+
+wonder_nut:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "1 Nut Shell";
+ mes "500 Wing of Dragonfly";
+
+ next;
+ menu "Here. Now do your magic!",-,"Cancel",M_Cancel;
+
+ if(countitem(5037)<1 || countitem(7064)<500) goto L_NoItem;
+ delitem 5037,1;
+ delitem 7064,500;
+ getitem 5050,1;
+ mes "[^469ED2Titicupe^000000]";
+ mes "^4599A3Abra ^66A73FKa ^C7A82EDabra, ^64826BSim ^E9239ESa ^B7EB01La ^8080C0Bim^000000!! ^45A8C9*poof*^000000 I succeeded! Here take this ^7D4E31Wonder Nutshell^000000, it's yours.";
+ close;
+
+M_Cancel:
+ mes "[^469ED2Titicupe^000000]";
+ mes "I bid you farewell, try not to catch a cold out here. It's ^5A9FD8freezing out here!^000000";
+ close;
+
+L_NoItem:
+ mes "[^469ED2Titicupe^000000]";
+ mes "I can't cast since you don't seem to have all I need...";
+ close;
+}
diff --git a/npc/quests/quests_morocc.txt b/npc/quests/quests_morocc.txt
index 4e469d603..dacc0e1af 100644
--- a/npc/quests/quests_morocc.txt
+++ b/npc/quests/quests_morocc.txt
@@ -1,123 +1,123 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Morroc
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Stop Post and Binoculars Quest.
-//===== Additional Comments: =================================
-//= 1.1 Fixed exploits [Lupus]
-//============================================================
-
-
-
-//==================================================================================//
-// Stop Post Quest
-//==================================================================================//
-morocc_in.gat,142,100,4 script William 89,{
- mes "[William]";
- mes "Welcome to MacMillan's ^3355FF'Post'^000000 Workshop .";
- next;
- mes "[William]";
- mes "My Clan, MacMillan, Has been producing professional grade Traffic Signal Posts for more than 250 years.";
- mes "Nowadays we are taking special orders for our very unique, ^3355FF'Stop Post'^000000.";
- next;
- menu "Could I order a ^3355FF'Stop Post'^000000?",-, "I'm not interested.",M_End;
-
- mes "[William]";
- mes "MacMillan's one of a kind ^3355FF'Stop Post'^000000 fits comfortably on a persons head.";
- mes "Not only does it make an interesting head accessory, but it can actually be used as a stop sign as well.";
- next;
- mes "[William]";
- mes "I garauntee that our ^3355FF'Stop Post'^000000 will last for well over 100 years, or my name isn't MacMillan!!";
- next;
- mes "[William]";
- mes "For us to make you a ^3355FF'Stop Post'^000000, we will need:";
- mes "^3355FF91100 Zeny,";
- mes "50 Trunks,";
- mes "and 1 Black Dyestuff^000000.";
- next;
- if(countitem(1019) >= 50 && countitem(983) >= 1 && Zeny >= 91100) goto sL_GetPost;
- mes "[William]";
- mes "Come back when you have all of the items.";
- close;
-
- sL_GetPost:
- delitem 1019,50;
- delitem 983,1;
- set Zeny, Zeny - 91100;
- mes "[William]";
- mes "Here you are! A hand made, one of a kind, ^3355FF'Stop Post '^000000! Thank you for your patronage!";
- getitem 2272,1;
- emotion e_thx;
- close;
-
- M_End:
- mes "[William]";
- mes "Thanks for stopping by the MacMillan's Workshop. I hope to see you soon.";
- close;
-}
-
-
-//==================================================================================//
-// Binoculars Quest
-//==================================================================================//
-morocc_in.gat,76,163,4 script Alchemist 64,{
- mes "[Marius]";
- mes "Howdy! A new customer........ Wait!!! I know what you're here for....... You're interested in those magical goggles aren't you?";
- next;
- menu "What is that ?",-, "Make",M_Make, "Ignore him",M_End;
-
- mes "[Marius]";
- mes "It is actually called ^3355FF'Binoculars'^000000! It is an opitcal device that allows the wearer to see far away objects.";
- next;
- mes "[Marius]";
- mes "You see, when two lens are placed next to each other in front of your eyes, your brain interperets this image........ blah blah...... blah....";
- next;
- mes "[Marius]";
- mes "............... What's this? You don't seem interested in what I have to say?? I don't think you realize what I'm talking about!";
- emotion e_hmm;
- next;
- mes "[Marius]";
- mes "For us to make you a ^3355FF'Binoculars'^000000, we will need:";
- mes "^3355FF50,000 Zeny,";
- mes "100 Steel,";
- mes "and 1 Geek Glasses.^000000.";
- next;
- mes "[Marius]";
- mes "Oh c'mon! Don't be a jerk! What I'm talking about is REALLY COOL!!";
- close;
-
- M_Make:
- mes "[Marius]";
- if(countitem(2243) < 1 || countitem(999) < 100 || Zeny < 50000) goto sL_NotEnuf;
- delitem 2243,1;
- delitem 999,100;
- set Zeny, Zeny - 50000;
- mes "Gr~~~~eat ! You'll definitely enjoy a pair of these!";
- next;
- mes "[Marius]";
- mes "Here it is ! The Binoculars!";
- getitem 2296,1;
- next;
- mes "[Marius]";
- mes "But before you go out and use them I have to tell you......";
- if(sex==0) mes "DON'T USE THEM TO BE A PEEPING TOM!!!";
- if(sex==1) mes "Becarefull where you look..... you might see someting you didn't want to........";
- close;
-
- sL_NotEnuf:
- mes "Argggghhhhhhh !! You didn't bring enough items!! You need:";
- mes "^3355FF1 pair of Geek Glasses, 50,000 Zeny and 100 Steel^000000.";
- emotion e_an;
- close;
-
- M_End:
- mes "[Marius]";
- mes "Hey you! You DARE IGNORE ME!! I am MARIUS the alchemist of ALCHEMISTS!!!!!";
- emotion e_omg;
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Morroc
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Stop Post and Binoculars Quest.
+//===== Additional Comments: =================================
+//= 1.1 Fixed exploits [Lupus]
+//============================================================
+
+
+
+//==================================================================================//
+// Stop Post Quest
+//==================================================================================//
+morocc_in.gat,142,100,4 script William 89,{
+ mes "[William]";
+ mes "Welcome to MacMillan's ^3355FF'Post'^000000 Workshop .";
+ next;
+ mes "[William]";
+ mes "My Clan, MacMillan, Has been producing professional grade Traffic Signal Posts for more than 250 years.";
+ mes "Nowadays we are taking special orders for our very unique, ^3355FF'Stop Post'^000000.";
+ next;
+ menu "Could I order a ^3355FF'Stop Post'^000000?",-, "I'm not interested.",M_End;
+
+ mes "[William]";
+ mes "MacMillan's one of a kind ^3355FF'Stop Post'^000000 fits comfortably on a persons head.";
+ mes "Not only does it make an interesting head accessory, but it can actually be used as a stop sign as well.";
+ next;
+ mes "[William]";
+ mes "I garauntee that our ^3355FF'Stop Post'^000000 will last for well over 100 years, or my name isn't MacMillan!!";
+ next;
+ mes "[William]";
+ mes "For us to make you a ^3355FF'Stop Post'^000000, we will need:";
+ mes "^3355FF91100 Zeny,";
+ mes "50 Trunks,";
+ mes "and 1 Black Dyestuff^000000.";
+ next;
+ if(countitem(1019) >= 50 && countitem(983) >= 1 && Zeny >= 91100) goto sL_GetPost;
+ mes "[William]";
+ mes "Come back when you have all of the items.";
+ close;
+
+ sL_GetPost:
+ delitem 1019,50;
+ delitem 983,1;
+ set Zeny, Zeny - 91100;
+ mes "[William]";
+ mes "Here you are! A hand made, one of a kind, ^3355FF'Stop Post '^000000! Thank you for your patronage!";
+ getitem 2272,1;
+ emotion e_thx;
+ close;
+
+ M_End:
+ mes "[William]";
+ mes "Thanks for stopping by the MacMillan's Workshop. I hope to see you soon.";
+ close;
+}
+
+
+//==================================================================================//
+// Binoculars Quest
+//==================================================================================//
+morocc_in.gat,76,163,4 script Alchemist 64,{
+ mes "[Marius]";
+ mes "Howdy! A new customer........ Wait!!! I know what you're here for....... You're interested in those magical goggles aren't you?";
+ next;
+ menu "What is that ?",-, "Make",M_Make, "Ignore him",M_End;
+
+ mes "[Marius]";
+ mes "It is actually called ^3355FF'Binoculars'^000000! It is an opitcal device that allows the wearer to see far away objects.";
+ next;
+ mes "[Marius]";
+ mes "You see, when two lens are placed next to each other in front of your eyes, your brain interperets this image........ blah blah...... blah....";
+ next;
+ mes "[Marius]";
+ mes "............... What's this? You don't seem interested in what I have to say?? I don't think you realize what I'm talking about!";
+ emotion e_hmm;
+ next;
+ mes "[Marius]";
+ mes "For us to make you a ^3355FF'Binoculars'^000000, we will need:";
+ mes "^3355FF50,000 Zeny,";
+ mes "100 Steel,";
+ mes "and 1 Geek Glasses.^000000.";
+ next;
+ mes "[Marius]";
+ mes "Oh c'mon! Don't be a jerk! What I'm talking about is REALLY COOL!!";
+ close;
+
+ M_Make:
+ mes "[Marius]";
+ if(countitem(2243) < 1 || countitem(999) < 100 || Zeny < 50000) goto sL_NotEnuf;
+ delitem 2243,1;
+ delitem 999,100;
+ set Zeny, Zeny - 50000;
+ mes "Gr~~~~eat ! You'll definitely enjoy a pair of these!";
+ next;
+ mes "[Marius]";
+ mes "Here it is ! The Binoculars!";
+ getitem 2296,1;
+ next;
+ mes "[Marius]";
+ mes "But before you go out and use them I have to tell you......";
+ if(sex==0) mes "DON'T USE THEM TO BE A PEEPING TOM!!!";
+ if(sex==1) mes "Becarefull where you look..... you might see someting you didn't want to........";
+ close;
+
+ sL_NotEnuf:
+ mes "Argggghhhhhhh !! You didn't bring enough items!! You need:";
+ mes "^3355FF1 pair of Geek Glasses, 50,000 Zeny and 100 Steel^000000.";
+ emotion e_an;
+ close;
+
+ M_End:
+ mes "[Marius]";
+ mes "Hey you! You DARE IGNORE ME!! I am MARIUS the alchemist of ALCHEMISTS!!!!!";
+ emotion e_omg;
+ close;
+}
diff --git a/npc/quests/quests_niflheim.txt b/npc/quests/quests_niflheim.txt
index 97074a709..fccb58e66 100644
--- a/npc/quests/quests_niflheim.txt
+++ b/npc/quests/quests_niflheim.txt
@@ -1,300 +1,300 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Niflheim
-//===== By: ==================================================
-//= The eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Book of Devil (MISC_QUEST | 256)
-//= Piano Key Ouest (MISC_QUEST | 32)
-//===== Additional Comments: =================================
-//= 1.0 Initial release, moved Book of Devil and Piano quest
-//= from npc/cities/niflheim.txt [Evera]
-//= 1.1 Optimized Book of Devil quest. used bit-wise var,
-//= Optimized Piano Quest - now uses 1 variable [Lupus]
-//============================================================
-
-//=============================================================
-//Quest for Book of Devil
-//=============================================================
-niflheim.gat,184,199,5 script Little Girl#02 793,{
- mes "[Sairin]";
- if(MISC_QUEST & 256){
- mes "Thanks again!";
- close;
- }
- if(@niflheimlost == 2){
- mes "You found him?";
- mes "Oh thank you!";
- mes "Please, take this as a token of my appreciation.";
- getitem 642,1;//Items: Book of Devil,
- set MISC_QUEST,MISC_QUEST | 256;
- set @niflheimlost,0;
- close;
- }
- if(@niflheimlost == 1){
-M_YES:
- set @niflheimlost,1;
- mes "Please find him and tell him where I am! I saw him last in Niflheim Field, the first one...";
- close;
- }
- mes "Sir, will you please help me?";
- if(BaseJob==Job_Novice){
- mes "Oh... you are lost, too...";
- close;
- }
- next;
- menu "Yes",-, "No",M_NO;
-
- mes "[Sairin]";
- mes "My friend and I went for a hike and ended up wandering into a strange field.";
- next;
- mes "[Sairin]";
- mes "Suddenly, I found a doll. I picked it up, and it turned into a ghost!";
- next;
- mes "[Sairin]";
- mes "I screamed and ran as fast as I could. When I stopped running, I ended up in this strange town..";
- next;
- mes "[Sairin]";
- mes "No one here will help me, and there are ghosts everywhere! Could you help me find my friend?";
- next;
- menu "Sure",M_YES, "No",M_NO;
-M_NO:
- close;
-}
-
-nif_fild01.gat,213,268,5 script Little Boy 797,{
- if(MISC_QUEST & 256){
-L_DONE:
- set @niflheimlost,2;
- mes "[Marius]";
- mes "Thank you for helping us!";
- close;
- }
- if(@niflheimlost == 2) goto L_PART2;
- if(@niflheimlost == 1){
- mes "[Marius]";
- mes "Who are you?";
- mes "...";
- mes "You found Sairin?";
- mes "She ran to Niflheim?";
- next;
-L_PART2:
- mes "[Marius]";
- mes "Could you tell her that I am on my way?";
- mes "I am a little slow, and its very important that she knows.";
- next;
- menu "Yes",L_DONE, "No",-;
- close;
- }
- mes "[Marius]";
- mes "Sairin... where are you?";
- close;
-}
-
-//=============================================================
-//Piano Quest
-//=============================================================
-niflheim.gat,224,243,3 script Alager 795,{
- mes "[Alager]";
- mes "Muahaha, I love to eat meat...";
- mes "You look... delicious!";
- next;
- mes "[Alager]";
- mes "I'm going to eat you...";
- next;
- mes "-Chomp bite slurp-";
- if(nif_piano&1 || (MISC_QUEST & 32)) goto L_end;
- percentheal -60,0;
- next;
- mes "[Alager]";
- mes "Ahhh, it's been some time since I had such delicious meat!";
- // 50% made up, not the slightest idea how to translate these ^^;
- mes "as an ex-barbeque chef, my favourite meat";
- mes "would be like preparing beef fillet,";
- mes "crossed and grilled to perfection";
- mes "that would be really delicious... ";
- next;
- mes "[Alager]";
- mes "Ah, let me thank you with this,";
- mes "I found it on the ground, hoho~";
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|1;
- close;
-L_end:
- percentheal -30,0;
- close;
-}
-
-nif_in.gat,105,81,3 script Crayu 794,{
- mes "[Crayu]";
- mes "Ah, there was this poem...";
- mes "in which author and time of writing was unknown,";
- mes "and has been circulating since long ago...";
- next;
- mes "[Crayu]";
- mes "^FF0000When the sun sets in the western hills,^000000";
- mes "^FF0000Where points the velvet gloom of dawn,^000000";
- mes "^FF0000The beautiful melody surrounding thy soul,^000000";
- mes "^FF0000Is the key from Lord Death's wrath.^000000";
- next;
- mes "[Crayu]";
- if(nif_piano&2 || (MISC_QUEST & 32)){
- mes "I wonder what does it mean...";
- mes "If you read it carefully,";
- mes "it seems to have a deep meaning,";
- mes "as if there is a mysterious secret";
- mes "hidden within these words...";
- close;
- }
- set @nif_random,rand(1,4);
- mes "Heh, let me give you a little exam!";
- mes "Repeat line no. " + @nif_random + " of the poem";
- mes "that you have just heard to me!";
- next;
- input @inputstr1$;
- switch(@nif_random){
- case 1:
- set @str1$,"When the sun sets in the western hills,";
- break;
- case 2:
- set @str1$,"Where points the velvet gloom of dawn,";
- break;
- case 3:
- set @str1$,"The beautiful melody surrounding thy soul,";
- break;
- case 4:
- set @str1$,"Is the key from Lord Death's wrath.";
- break;
- }
- mes "[Crayu]";
- if(@inputstr1$ == @str1$){
- mes "Hoho... I see you have paid attention!";
- mes "I am Grey, a wandering poet of yore,";
- mes "you are the best audience I have had so far,";
- mes "here, take this as a reward.";
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|2;
- next;
- mes "[Crayu]";
- mes "I hope you will treat other poets";
- mes "as well as you treated me, farewell.";
- close;
- }
- mes "Aih... If you had paid more attention,";
- mes "you would have known the correct answer!";
- mes "Come back for the challenge again,";
- mes "when you have thought over it!";
- close;
-}
-
-nif_in.gat,31,20,3 script Kurtz 794,{
- mes "[Kurtz]";
- mes "Business nowadays is really bad...";
- mes "Back when I used to be alive,";
- mes "my business was this bad too~!";
- if(nif_piano&4 || (MISC_QUEST & 32)) close;
- next;
- mes "[Kurtz]";
- mes "Hey! You there! Dump this for me";
- mes "on the way out will you!";
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|4;
- next;
- mes "[Kurtz]";
- mes "Why is business so bad lately...";
- mes "(mumble mumble)";
- close;
-}
-
-niflheim.gat,169,71,5 script #1 111,2,2{
- if(MISC_QUEST & 32 || nif_piano&8) end;
-
- mes "- In the nearby tombs -";
- mes "- you see something -";
- mes "- half buried in the ground -";
- mes "- What is it? -";
- mes "- Looks like it broke off something -";
- next;
- mes "- Pick it up? -";
- menu "Yes",-,"No",L_end;
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|8;
-L_end:
- close;
-}
-
-niflheim.gat,208,103,5 script #2 111,2,2{
- if(MISC_QUEST & 32 || nif_piano&32) end;
- if(nif_piano&16){
- mes "- In the hole you have dug -";
- mes "- there is something else -";
- mes "- buried deep in the ground -";
- mes "- Looks like its another fragment -";
- next;
- mes "- Pick it up? -";
- menu "Yes",-,"No",L_end;
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|32;
- L_end:
- close;
- }
- mes "- In the nearby tombs -";
- mes "- you see something -";
- mes "- half buried in the ground -";
- mes "- What is it? -";
- mes "- Looks like it broke off something -";
- next;
- mes "- Pick it up? -";
- menu "Yes",-,"No",L_end;
- getitem 7184,1;//Items: Piano Key,
- set nif_piano, nif_piano|16;
- close;
-}
-
-nif_in.gat,115,181,5 script #4 111,3,3{
- mes "- You see a huge old piano -";
- if((MISC_QUEST & 32)==0) mes "- with a few keys missing -";
- if(MISC_QUEST & 32) mes "- with one key missing -";
- if(MISC_QUEST & 32 || countitem(7184) < 6) close;
-
- delitem 7184,countitem(7184);//Items: Piano Key,
- set MISC_QUEST,MISC_QUEST | 32;
- set nif_piano, 0;
- mes "- You slide the 6 piano keys one -";
- mes "- by one into the missing slots -";
- mes "- on the piano, but you realize -";
- mes "- the left-most side seems to be -";
- mes "- missing one more key. -";
- close;
-}
-
-nif_in.gat,118,151,5 script #5 111,3,3{
- if((MISC_QUEST & 32)==0) end;
- mes "- The very moment the long shadow -";
- mes "- of your body falls on the piano -";
- next;
- mes "- You suddenly seem to feel lighter -";
- mes "- and your vision starts to blur... -";
- next;
- warp "nif_in.gat",179,163;
- close;
-}
-
-nif_in.gat,188,168,3 script Witch 792,{
- mes "[Kirkena]";
- mes "Hmm?... Aren't you a living human?";
- mes "Must have took you some effort";
- mes "to get to this place...";
- mes "Whatever reason though, this is not a place";
- mes "the living shall belong...";
- next;
- mes "[Kirkena]";
- mes "I shall use my powers to send you back";
- mes "but you should not return in the future.";
- close2;
- warp "umbala.gat",138,208;
- end;
+//===== eAthena Script =======================================
+//= Quest NPCs related to Niflheim
+//===== By: ==================================================
+//= The eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Book of Devil (MISC_QUEST | 256)
+//= Piano Key Ouest (MISC_QUEST | 32)
+//===== Additional Comments: =================================
+//= 1.0 Initial release, moved Book of Devil and Piano quest
+//= from npc/cities/niflheim.txt [Evera]
+//= 1.1 Optimized Book of Devil quest. used bit-wise var,
+//= Optimized Piano Quest - now uses 1 variable [Lupus]
+//============================================================
+
+//=============================================================
+//Quest for Book of Devil
+//=============================================================
+niflheim.gat,184,199,5 script Little Girl#02 793,{
+ mes "[Sairin]";
+ if(MISC_QUEST & 256){
+ mes "Thanks again!";
+ close;
+ }
+ if(@niflheimlost == 2){
+ mes "You found him?";
+ mes "Oh thank you!";
+ mes "Please, take this as a token of my appreciation.";
+ getitem 642,1;//Items: Book of Devil,
+ set MISC_QUEST,MISC_QUEST | 256;
+ set @niflheimlost,0;
+ close;
+ }
+ if(@niflheimlost == 1){
+M_YES:
+ set @niflheimlost,1;
+ mes "Please find him and tell him where I am! I saw him last in Niflheim Field, the first one...";
+ close;
+ }
+ mes "Sir, will you please help me?";
+ if(BaseJob==Job_Novice){
+ mes "Oh... you are lost, too...";
+ close;
+ }
+ next;
+ menu "Yes",-, "No",M_NO;
+
+ mes "[Sairin]";
+ mes "My friend and I went for a hike and ended up wandering into a strange field.";
+ next;
+ mes "[Sairin]";
+ mes "Suddenly, I found a doll. I picked it up, and it turned into a ghost!";
+ next;
+ mes "[Sairin]";
+ mes "I screamed and ran as fast as I could. When I stopped running, I ended up in this strange town..";
+ next;
+ mes "[Sairin]";
+ mes "No one here will help me, and there are ghosts everywhere! Could you help me find my friend?";
+ next;
+ menu "Sure",M_YES, "No",M_NO;
+M_NO:
+ close;
+}
+
+nif_fild01.gat,213,268,5 script Little Boy 797,{
+ if(MISC_QUEST & 256){
+L_DONE:
+ set @niflheimlost,2;
+ mes "[Marius]";
+ mes "Thank you for helping us!";
+ close;
+ }
+ if(@niflheimlost == 2) goto L_PART2;
+ if(@niflheimlost == 1){
+ mes "[Marius]";
+ mes "Who are you?";
+ mes "...";
+ mes "You found Sairin?";
+ mes "She ran to Niflheim?";
+ next;
+L_PART2:
+ mes "[Marius]";
+ mes "Could you tell her that I am on my way?";
+ mes "I am a little slow, and its very important that she knows.";
+ next;
+ menu "Yes",L_DONE, "No",-;
+ close;
+ }
+ mes "[Marius]";
+ mes "Sairin... where are you?";
+ close;
+}
+
+//=============================================================
+//Piano Quest
+//=============================================================
+niflheim.gat,224,243,3 script Alager 795,{
+ mes "[Alager]";
+ mes "Muahaha, I love to eat meat...";
+ mes "You look... delicious!";
+ next;
+ mes "[Alager]";
+ mes "I'm going to eat you...";
+ next;
+ mes "-Chomp bite slurp-";
+ if(nif_piano&1 || (MISC_QUEST & 32)) goto L_end;
+ percentheal -60,0;
+ next;
+ mes "[Alager]";
+ mes "Ahhh, it's been some time since I had such delicious meat!";
+ // 50% made up, not the slightest idea how to translate these ^^;
+ mes "as an ex-barbeque chef, my favourite meat";
+ mes "would be like preparing beef fillet,";
+ mes "crossed and grilled to perfection";
+ mes "that would be really delicious... ";
+ next;
+ mes "[Alager]";
+ mes "Ah, let me thank you with this,";
+ mes "I found it on the ground, hoho~";
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|1;
+ close;
+L_end:
+ percentheal -30,0;
+ close;
+}
+
+nif_in.gat,105,81,3 script Crayu 794,{
+ mes "[Crayu]";
+ mes "Ah, there was this poem...";
+ mes "in which author and time of writing was unknown,";
+ mes "and has been circulating since long ago...";
+ next;
+ mes "[Crayu]";
+ mes "^FF0000When the sun sets in the western hills,^000000";
+ mes "^FF0000Where points the velvet gloom of dawn,^000000";
+ mes "^FF0000The beautiful melody surrounding thy soul,^000000";
+ mes "^FF0000Is the key from Lord Death's wrath.^000000";
+ next;
+ mes "[Crayu]";
+ if(nif_piano&2 || (MISC_QUEST & 32)){
+ mes "I wonder what does it mean...";
+ mes "If you read it carefully,";
+ mes "it seems to have a deep meaning,";
+ mes "as if there is a mysterious secret";
+ mes "hidden within these words...";
+ close;
+ }
+ set @nif_random,rand(1,4);
+ mes "Heh, let me give you a little exam!";
+ mes "Repeat line no. " + @nif_random + " of the poem";
+ mes "that you have just heard to me!";
+ next;
+ input @inputstr1$;
+ switch(@nif_random){
+ case 1:
+ set @str1$,"When the sun sets in the western hills,";
+ break;
+ case 2:
+ set @str1$,"Where points the velvet gloom of dawn,";
+ break;
+ case 3:
+ set @str1$,"The beautiful melody surrounding thy soul,";
+ break;
+ case 4:
+ set @str1$,"Is the key from Lord Death's wrath.";
+ break;
+ }
+ mes "[Crayu]";
+ if(@inputstr1$ == @str1$){
+ mes "Hoho... I see you have paid attention!";
+ mes "I am Grey, a wandering poet of yore,";
+ mes "you are the best audience I have had so far,";
+ mes "here, take this as a reward.";
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|2;
+ next;
+ mes "[Crayu]";
+ mes "I hope you will treat other poets";
+ mes "as well as you treated me, farewell.";
+ close;
+ }
+ mes "Aih... If you had paid more attention,";
+ mes "you would have known the correct answer!";
+ mes "Come back for the challenge again,";
+ mes "when you have thought over it!";
+ close;
+}
+
+nif_in.gat,31,20,3 script Kurtz 794,{
+ mes "[Kurtz]";
+ mes "Business nowadays is really bad...";
+ mes "Back when I used to be alive,";
+ mes "my business was this bad too~!";
+ if(nif_piano&4 || (MISC_QUEST & 32)) close;
+ next;
+ mes "[Kurtz]";
+ mes "Hey! You there! Dump this for me";
+ mes "on the way out will you!";
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|4;
+ next;
+ mes "[Kurtz]";
+ mes "Why is business so bad lately...";
+ mes "(mumble mumble)";
+ close;
+}
+
+niflheim.gat,169,71,5 script #1 111,2,2{
+ if(MISC_QUEST & 32 || nif_piano&8) end;
+
+ mes "- In the nearby tombs -";
+ mes "- you see something -";
+ mes "- half buried in the ground -";
+ mes "- What is it? -";
+ mes "- Looks like it broke off something -";
+ next;
+ mes "- Pick it up? -";
+ menu "Yes",-,"No",L_end;
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|8;
+L_end:
+ close;
+}
+
+niflheim.gat,208,103,5 script #2 111,2,2{
+ if(MISC_QUEST & 32 || nif_piano&32) end;
+ if(nif_piano&16){
+ mes "- In the hole you have dug -";
+ mes "- there is something else -";
+ mes "- buried deep in the ground -";
+ mes "- Looks like its another fragment -";
+ next;
+ mes "- Pick it up? -";
+ menu "Yes",-,"No",L_end;
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|32;
+ L_end:
+ close;
+ }
+ mes "- In the nearby tombs -";
+ mes "- you see something -";
+ mes "- half buried in the ground -";
+ mes "- What is it? -";
+ mes "- Looks like it broke off something -";
+ next;
+ mes "- Pick it up? -";
+ menu "Yes",-,"No",L_end;
+ getitem 7184,1;//Items: Piano Key,
+ set nif_piano, nif_piano|16;
+ close;
+}
+
+nif_in.gat,115,181,5 script #4 111,3,3{
+ mes "- You see a huge old piano -";
+ if((MISC_QUEST & 32)==0) mes "- with a few keys missing -";
+ if(MISC_QUEST & 32) mes "- with one key missing -";
+ if(MISC_QUEST & 32 || countitem(7184) < 6) close;
+
+ delitem 7184,countitem(7184);//Items: Piano Key,
+ set MISC_QUEST,MISC_QUEST | 32;
+ set nif_piano, 0;
+ mes "- You slide the 6 piano keys one -";
+ mes "- by one into the missing slots -";
+ mes "- on the piano, but you realize -";
+ mes "- the left-most side seems to be -";
+ mes "- missing one more key. -";
+ close;
+}
+
+nif_in.gat,118,151,5 script #5 111,3,3{
+ if((MISC_QUEST & 32)==0) end;
+ mes "- The very moment the long shadow -";
+ mes "- of your body falls on the piano -";
+ next;
+ mes "- You suddenly seem to feel lighter -";
+ mes "- and your vision starts to blur... -";
+ next;
+ warp "nif_in.gat",179,163;
+ close;
+}
+
+nif_in.gat,188,168,3 script Witch 792,{
+ mes "[Kirkena]";
+ mes "Hmm?... Aren't you a living human?";
+ mes "Must have took you some effort";
+ mes "to get to this place...";
+ mes "Whatever reason though, this is not a place";
+ mes "the living shall belong...";
+ next;
+ mes "[Kirkena]";
+ mes "I shall use my powers to send you back";
+ mes "but you should not return in the future.";
+ close2;
+ warp "umbala.gat",138,208;
+ end;
} \ No newline at end of file
diff --git a/npc/quests/quests_payon.txt b/npc/quests/quests_payon.txt
index c7e9cb89a..d17dc9acd 100644
--- a/npc/quests/quests_payon.txt
+++ b/npc/quests/quests_payon.txt
@@ -1,293 +1,293 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Payon
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Pretend Murder, Ear Muffs, Oxygen, Derivuchi Cap, Helm of Angel Quests.
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Helm of Angel bug fixed [Lupus]
-//= 1.2 Fixed skirt of virgin [Lupus]
-//= 1.3 Fixed exploits [Lupus]
-//= 1.4 Removed Duplicates [Silent]
-//============================================================
-
-
-
-//==========================================================================================//
-// Pretend Murdered quest
-//==========================================================================================//
-payon.gat,154,170,4 script Granny 78,{
- mes "[Granny]";
- if(countitem(1049) >= 4) goto L_Get;
-
- mes "Oh deary me. What to do... what to do........ You see I want to nitt some special clothes for my family but I don't have the right cloth to do so.";
- next;
- mes "[Granny]";
- mes ".....sigggghhhhhh........";
- next;
- mes "[Granny]";
- mes "Why what's this? Mushrooms? Oh yes I remember now, I pick these mushrooms on the Payon Mountain side.";
- mes "Ho ho, I have such a hard time remembering things now.";
- next;
- mes "[Granny]";
- mes "What was I saying before? Oh yes! I need some special cloth to make clothes for my family.";
- mes "If you happen to come across some ^5555FF'Skirt of Virgin'^000000, please let me know.";
- emotion e_hmm;
- next;
- mes "[Granny]";
- mes "I need ^5555FF'4 Skirt of Virgin'^000000 to make the clothes. I will be very greatfull if you could bring me some.";
- close;
-
-L_Get:
- mes "Oh! You have 4 Skirt of Virgin. Would you be willing to give them to me dear?";
- next;
- menu "Why of course granny",-,"Heck no ya old bag!",M_No;
-
- if(countitem(1049) < 4) goto M_No;
- mes "[Granny]";
- mes "Bless your kind heart. Now I can make some special clothes for my family. Let me give you a reward for being so genrous dear.";
- emotion e_lv2;
- next;
- getitem 2293,1;
- delitem 1049,4;
- mes "[Granny]";
- mes "There you are. It's something I kept from my younger days as an actress. I was quite fetching and very popular back then.";
- mes "I've kept it as a reminder of my days as an actress, but with my memory as bad as it is, it's really of no use to me anymore.";
- next;
- mes "[Granny]";
- mes "I'm sure you'll have fun using it at parties.";
- close;
-
- M_No:
- mes "[Granny]";
- mes "Well I never!!! Kids these days just have no respect or compasion for their elders!";
- emotion e_pif;
- close;
-
-}
-
-
-//========================================================================================//
-// Ear Muffs Quest
-//========================================================================================//
-payon_in01.gat,18,10,4 script Mystic Lady 75,{
- mes "[Mystic Lady]";
- mes "Hi there.";
- next;
- menu "Hello.",-,"Please make me a pair of Ear Muffs.",M_Muffs, "End",M_End;
-
- mes "[Mystic Lady]";
- mes "My family and I recently came to Payon.";
- mes "Where we came from the weather was very cold so we started a business hand making a special type of ^5555FF'Ear Muffs'^000000";
- next;
- mes "[Mystic Lady]";
- mes "I have tried to continue the family business here in Payon but it has proven to be difficult because of the warm whether.";
- next;
- mes "[Mystic Lady]";
- mes "Although the 'Ear Muffs' aren't very usefull here, if you plan on going somewhere that's cold our 'Ear Muffs' are a must have.";
- next;
- mes "[Mystic Lady]";
- mes "All I need are:";
- mes "^5555FF1 Cursed Ruby,";
- mes "1 Headset,";
- mes "200 Feathers,";
- mes "and a 5,000 zeny fee^000000 for my labor.";
- next;
- mes "[Mystic Lady]";
- mes "With those items I can make you a pair of 'Ear Muffs'. Believe me, they are of the highest quality and look good on just about anybody!";
- close;
-
- M_Muffs:
- if(countitem(724)<1 || countitem(5001)<1 || countitem(949)<200 || zeny<5000) goto sL_NotEnuf;
- delitem 724,1;
- delitem 5001,1;
- delitem 949,200;
- set Zeny, Zeny-5000;
- mes "[Mystic Lady]";
- mes "Oh, I see that you have brought all of the required items. Just a moment please...";
- next;
- mes "[Mystic Lady]";
- mes "... this goes here... that goes there...... some glue here... a couple stitches over there..........";
- next;
- getitem 2283,1;
- mes "[Mystic Lady]";
- mes "Ah, there you are! One pair of my familys' specialty Ear Muffs. Enjoy!";
- close;
-
- sL_NotEnuf:
- mes "[Mystic Lady]";
- mes "I'm sorry but you don't have the required items for me to make you a pair of my familys' specialty Ear Muffs.";
- close;
- M_End:
- close;
-
-}
-
-
-//========================================================================================//
-// Oxygen Mask Quest
-//========================================================================================//
-payon_in02.gat,25,71,4 script Young Man#11 86,{
- mes "[Young Man]";
- if(countitem(701) >= 5) goto L_GotOra;
- mes "Blahhhhhh! I... I... I JUST CAN'T take it anymore!! You little stinky, filthy, BASTARDS!!!";
- emotion e_an;
- next;
- menu "Continue.",M_Cont, "End Conversation.",M_End;
-
- M_Cont:
- mes "[Young Man]";
- mes "~Sigh~ I've had a rough life. You see, both my parents passed away when I was a kid, so I had to work to support myself at a young age.";
- next;
- mes "[Young Man]";
- mes "It sure was rough. But after 10 years of hard work I was able to save up and finally buy myself a home!";
- next;
- mes "[Young Man]";
- mes "Unfortunately I didn't have that much money, so I couldn't buy the home I really wanted.";
- mes "Instead, I found this house..... It was big and cheap.... so I bought without really thinking my decision through.....";
- next;
- mes "[Young Man]";
- mes "Jeez was that a mistake...... The house turned out to be a HAVEN for THIEF BUGS!!!";
- emotion e_omg;
- next;
- mes "[Young Man]";
- mes "I tried EVERYTHING to get rid of them! I sprayed them, I smashed them, I lured them out with food.........";
- mes "Finally as a last resort.... I even tried to burn the house down!!";
- next;
- mes "[Young Man]";
- mes "Grrr! What will it take to get rid of these vile creatures???";
- emotion e_pif;
- next;
- mes "[Young Man]";
- mes "I've heard there is something called ^3355FF'Ora Ora'^000000, that people in other countries use to fight bugs.....";
- mes "But will it work for my situation?";
- next;
- mes "[Young Man]";
- mes "I'm willing to give anything a try at this point. I don't have much money so I can only afford ^5555FF'5 Ora Oras'^000000.";
- mes "If you happen to come across some 'Ora Ora' please let me know.";
- close;
-
- M_End:
- mes "[Young Man]";
- mes "I'm just so tired of fighting this never ending battle against these bugs...... those dirty scumbags!!";
- emotion e_pif;
- close;
-
-L_GotOra:
- mes "ArrrGgghhh!! No!... It can't be!..... I think I'm going mad... they're starting to look so cute... ArrrGgghhh!!... Nooooooo!!";
- emotion e_omg;
- M_Menu:
- next;
- menu "Continue",M_Cont, "Show Ora Ora",-, "Give Ora Ora",M_Give, "Cancel",M_End2;
-
- mes "[Young Man]";
- mes "Oooooohhhh..... is.. is this... is this... Ora Ora...??? If you give it to me I'll give you my prized treasure in return!";
- mes "What do you say?? Is it a deal?";
- goto M_Menu;
-
- M_Give:
- if(countitem(701) < 5) goto L_Cheater;
- delitem 701,5;
- mes "[Young Man]";
- mes "Muhahahahah!!! Finally, I have it.... Ora Ora! Stupid and distgusting Thief Bugs.... you'll pay for invading MY HOME!!!";
- emotion e_gg;
- next;
- mes "[Young Man]";
- mes "..... Eh em... sorry. I was a little outa control there.... Ah, let me give you my valuable treasure......";
- emotion e_swt;
- next;
- getitem 5004,1;
- mes "[Young Man]";
- mes "By wearing this over your mouth, the air you breathe will be filltered so that you can breathe clean air.";
- mes "I picked it up while I was a Sailor out at sea. I really have no need for it.";
- next;
- mes "[Young Man]";
- mes "Hehehehe!! I can't wait to use this Ora Ora!!!";
- close;
-
- L_Cheater:
- mes "Oh... Where is it?!";
- next;
-
- M_End2:
- mes "[Young Man]";
- mes "What if I CAN'T get rid of these thief bugs???... I guess the only other thing I could do is fall in love with them...... heh... heh... heh....";
- emotion e_swt;
- close;
-
-}
-
-
-//========================================================================================//
-// Derivuchi Cap(Hat of Petite Diablo), Helm of Angel
-//========================================================================================//
-payon_in01.gat,56,12,4 script Young Man#12 89,{
- mes "[Young Man]";
- mes "What is it?............";
- next;
- menu "Can you make me a special item?",-, "Nothing.",M_End;
-
- mes "[Young Man]";
- mes "I see.... so you know about me huh?.... Ok, tell me what you want.";
- next;
- menu "-Helm of Angel",-, "-Deviruchi Hat",sM_Devir, "-I'll come back later.",M_End;
-
- mes "[Young Man]";
- mes "For the Helm of Angel I will need:";
- mes "- ^5555FF1 Helm (slotted)^000000.";
- mes "- ^5555FF1 Angel Wing^000000.";
- mes "- ^5555FF5 Fang of Garm^000000.";
- set @HAT, 1;
- next;
- goto sL_GetHat;
- sM_Devir:
- mes "[Young Man]";
- mes "For the Deviruchi Hat I will need:";
- mes "- ^5555FF600 Little Evil Horn^000000.";
- mes "- ^5555FF40 Talon of Griffon^000000.";
- set @HAT, 2;
-
- sL_GetHat:
- mes "[Young Man]";
- mes "Wait a moment! Be carefull about what items you give me.";
- mes "I do not distinguish between equipment that has been forged or has cards attached to them.";
- mes "If you don't want to loose a precious card or piece of equipment, make sure you don't have it equiped.";
- next;
- mes "[Young Man]";
- mes "Do you have all of the items needed?";
- menu "-Give him the items.",-, "Nevermind.",M_End;
-
- if(@HAT == 2) goto ssL_Devir;
-
- if(countitem(2229)<1 || countitem(2254)<1 || countitem(7036)<5) goto ssL_NotEnuf;
- delitem 2229, 1;
- delitem 2254, 1;
- delitem 7036, 5;
- mes "[Young Man]";
- mes "Here is your Helm of Angel.";
- getitem 5025, 1;
- close;
- ssL_Devir:
- if(countitem(1038)<600 || countitem(7048)<40) goto ssL_NotEnuf;
- delitem 1038, 600;
- delitem 7048, 40;
- mes "[Young Man]";
- mes "Here is your Deviruchi Hat.";
- getitem 5038, 1;
- close;
- ssL_NotEnuf:
- mes "[Young Man]";
- mes "You don't have enough items for me to make what you want.";
- close;
-
- M_End:
- mes "[Young Man]";
- mes "Fine then.....";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Payon
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Pretend Murder, Ear Muffs, Oxygen, Derivuchi Cap, Helm of Angel Quests.
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Helm of Angel bug fixed [Lupus]
+//= 1.2 Fixed skirt of virgin [Lupus]
+//= 1.3 Fixed exploits [Lupus]
+//= 1.4 Removed Duplicates [Silent]
+//============================================================
+
+
+
+//==========================================================================================//
+// Pretend Murdered quest
+//==========================================================================================//
+payon.gat,154,170,4 script Granny 78,{
+ mes "[Granny]";
+ if(countitem(1049) >= 4) goto L_Get;
+
+ mes "Oh deary me. What to do... what to do........ You see I want to nitt some special clothes for my family but I don't have the right cloth to do so.";
+ next;
+ mes "[Granny]";
+ mes ".....sigggghhhhhh........";
+ next;
+ mes "[Granny]";
+ mes "Why what's this? Mushrooms? Oh yes I remember now, I pick these mushrooms on the Payon Mountain side.";
+ mes "Ho ho, I have such a hard time remembering things now.";
+ next;
+ mes "[Granny]";
+ mes "What was I saying before? Oh yes! I need some special cloth to make clothes for my family.";
+ mes "If you happen to come across some ^5555FF'Skirt of Virgin'^000000, please let me know.";
+ emotion e_hmm;
+ next;
+ mes "[Granny]";
+ mes "I need ^5555FF'4 Skirt of Virgin'^000000 to make the clothes. I will be very greatfull if you could bring me some.";
+ close;
+
+L_Get:
+ mes "Oh! You have 4 Skirt of Virgin. Would you be willing to give them to me dear?";
+ next;
+ menu "Why of course granny",-,"Heck no ya old bag!",M_No;
+
+ if(countitem(1049) < 4) goto M_No;
+ mes "[Granny]";
+ mes "Bless your kind heart. Now I can make some special clothes for my family. Let me give you a reward for being so genrous dear.";
+ emotion e_lv2;
+ next;
+ getitem 2293,1;
+ delitem 1049,4;
+ mes "[Granny]";
+ mes "There you are. It's something I kept from my younger days as an actress. I was quite fetching and very popular back then.";
+ mes "I've kept it as a reminder of my days as an actress, but with my memory as bad as it is, it's really of no use to me anymore.";
+ next;
+ mes "[Granny]";
+ mes "I'm sure you'll have fun using it at parties.";
+ close;
+
+ M_No:
+ mes "[Granny]";
+ mes "Well I never!!! Kids these days just have no respect or compasion for their elders!";
+ emotion e_pif;
+ close;
+
+}
+
+
+//========================================================================================//
+// Ear Muffs Quest
+//========================================================================================//
+payon_in01.gat,18,10,4 script Mystic Lady 75,{
+ mes "[Mystic Lady]";
+ mes "Hi there.";
+ next;
+ menu "Hello.",-,"Please make me a pair of Ear Muffs.",M_Muffs, "End",M_End;
+
+ mes "[Mystic Lady]";
+ mes "My family and I recently came to Payon.";
+ mes "Where we came from the weather was very cold so we started a business hand making a special type of ^5555FF'Ear Muffs'^000000";
+ next;
+ mes "[Mystic Lady]";
+ mes "I have tried to continue the family business here in Payon but it has proven to be difficult because of the warm whether.";
+ next;
+ mes "[Mystic Lady]";
+ mes "Although the 'Ear Muffs' aren't very usefull here, if you plan on going somewhere that's cold our 'Ear Muffs' are a must have.";
+ next;
+ mes "[Mystic Lady]";
+ mes "All I need are:";
+ mes "^5555FF1 Cursed Ruby,";
+ mes "1 Headset,";
+ mes "200 Feathers,";
+ mes "and a 5,000 zeny fee^000000 for my labor.";
+ next;
+ mes "[Mystic Lady]";
+ mes "With those items I can make you a pair of 'Ear Muffs'. Believe me, they are of the highest quality and look good on just about anybody!";
+ close;
+
+ M_Muffs:
+ if(countitem(724)<1 || countitem(5001)<1 || countitem(949)<200 || zeny<5000) goto sL_NotEnuf;
+ delitem 724,1;
+ delitem 5001,1;
+ delitem 949,200;
+ set Zeny, Zeny-5000;
+ mes "[Mystic Lady]";
+ mes "Oh, I see that you have brought all of the required items. Just a moment please...";
+ next;
+ mes "[Mystic Lady]";
+ mes "... this goes here... that goes there...... some glue here... a couple stitches over there..........";
+ next;
+ getitem 2283,1;
+ mes "[Mystic Lady]";
+ mes "Ah, there you are! One pair of my familys' specialty Ear Muffs. Enjoy!";
+ close;
+
+ sL_NotEnuf:
+ mes "[Mystic Lady]";
+ mes "I'm sorry but you don't have the required items for me to make you a pair of my familys' specialty Ear Muffs.";
+ close;
+ M_End:
+ close;
+
+}
+
+
+//========================================================================================//
+// Oxygen Mask Quest
+//========================================================================================//
+payon_in02.gat,25,71,4 script Young Man#11 86,{
+ mes "[Young Man]";
+ if(countitem(701) >= 5) goto L_GotOra;
+ mes "Blahhhhhh! I... I... I JUST CAN'T take it anymore!! You little stinky, filthy, BASTARDS!!!";
+ emotion e_an;
+ next;
+ menu "Continue.",M_Cont, "End Conversation.",M_End;
+
+ M_Cont:
+ mes "[Young Man]";
+ mes "~Sigh~ I've had a rough life. You see, both my parents passed away when I was a kid, so I had to work to support myself at a young age.";
+ next;
+ mes "[Young Man]";
+ mes "It sure was rough. But after 10 years of hard work I was able to save up and finally buy myself a home!";
+ next;
+ mes "[Young Man]";
+ mes "Unfortunately I didn't have that much money, so I couldn't buy the home I really wanted.";
+ mes "Instead, I found this house..... It was big and cheap.... so I bought without really thinking my decision through.....";
+ next;
+ mes "[Young Man]";
+ mes "Jeez was that a mistake...... The house turned out to be a HAVEN for THIEF BUGS!!!";
+ emotion e_omg;
+ next;
+ mes "[Young Man]";
+ mes "I tried EVERYTHING to get rid of them! I sprayed them, I smashed them, I lured them out with food.........";
+ mes "Finally as a last resort.... I even tried to burn the house down!!";
+ next;
+ mes "[Young Man]";
+ mes "Grrr! What will it take to get rid of these vile creatures???";
+ emotion e_pif;
+ next;
+ mes "[Young Man]";
+ mes "I've heard there is something called ^3355FF'Ora Ora'^000000, that people in other countries use to fight bugs.....";
+ mes "But will it work for my situation?";
+ next;
+ mes "[Young Man]";
+ mes "I'm willing to give anything a try at this point. I don't have much money so I can only afford ^5555FF'5 Ora Oras'^000000.";
+ mes "If you happen to come across some 'Ora Ora' please let me know.";
+ close;
+
+ M_End:
+ mes "[Young Man]";
+ mes "I'm just so tired of fighting this never ending battle against these bugs...... those dirty scumbags!!";
+ emotion e_pif;
+ close;
+
+L_GotOra:
+ mes "ArrrGgghhh!! No!... It can't be!..... I think I'm going mad... they're starting to look so cute... ArrrGgghhh!!... Nooooooo!!";
+ emotion e_omg;
+ M_Menu:
+ next;
+ menu "Continue",M_Cont, "Show Ora Ora",-, "Give Ora Ora",M_Give, "Cancel",M_End2;
+
+ mes "[Young Man]";
+ mes "Oooooohhhh..... is.. is this... is this... Ora Ora...??? If you give it to me I'll give you my prized treasure in return!";
+ mes "What do you say?? Is it a deal?";
+ goto M_Menu;
+
+ M_Give:
+ if(countitem(701) < 5) goto L_Cheater;
+ delitem 701,5;
+ mes "[Young Man]";
+ mes "Muhahahahah!!! Finally, I have it.... Ora Ora! Stupid and distgusting Thief Bugs.... you'll pay for invading MY HOME!!!";
+ emotion e_gg;
+ next;
+ mes "[Young Man]";
+ mes "..... Eh em... sorry. I was a little outa control there.... Ah, let me give you my valuable treasure......";
+ emotion e_swt;
+ next;
+ getitem 5004,1;
+ mes "[Young Man]";
+ mes "By wearing this over your mouth, the air you breathe will be filltered so that you can breathe clean air.";
+ mes "I picked it up while I was a Sailor out at sea. I really have no need for it.";
+ next;
+ mes "[Young Man]";
+ mes "Hehehehe!! I can't wait to use this Ora Ora!!!";
+ close;
+
+ L_Cheater:
+ mes "Oh... Where is it?!";
+ next;
+
+ M_End2:
+ mes "[Young Man]";
+ mes "What if I CAN'T get rid of these thief bugs???... I guess the only other thing I could do is fall in love with them...... heh... heh... heh....";
+ emotion e_swt;
+ close;
+
+}
+
+
+//========================================================================================//
+// Derivuchi Cap(Hat of Petite Diablo), Helm of Angel
+//========================================================================================//
+payon_in01.gat,56,12,4 script Young Man#12 89,{
+ mes "[Young Man]";
+ mes "What is it?............";
+ next;
+ menu "Can you make me a special item?",-, "Nothing.",M_End;
+
+ mes "[Young Man]";
+ mes "I see.... so you know about me huh?.... Ok, tell me what you want.";
+ next;
+ menu "-Helm of Angel",-, "-Deviruchi Hat",sM_Devir, "-I'll come back later.",M_End;
+
+ mes "[Young Man]";
+ mes "For the Helm of Angel I will need:";
+ mes "- ^5555FF1 Helm (slotted)^000000.";
+ mes "- ^5555FF1 Angel Wing^000000.";
+ mes "- ^5555FF5 Fang of Garm^000000.";
+ set @HAT, 1;
+ next;
+ goto sL_GetHat;
+ sM_Devir:
+ mes "[Young Man]";
+ mes "For the Deviruchi Hat I will need:";
+ mes "- ^5555FF600 Little Evil Horn^000000.";
+ mes "- ^5555FF40 Talon of Griffon^000000.";
+ set @HAT, 2;
+
+ sL_GetHat:
+ mes "[Young Man]";
+ mes "Wait a moment! Be carefull about what items you give me.";
+ mes "I do not distinguish between equipment that has been forged or has cards attached to them.";
+ mes "If you don't want to loose a precious card or piece of equipment, make sure you don't have it equiped.";
+ next;
+ mes "[Young Man]";
+ mes "Do you have all of the items needed?";
+ menu "-Give him the items.",-, "Nevermind.",M_End;
+
+ if(@HAT == 2) goto ssL_Devir;
+
+ if(countitem(2229)<1 || countitem(2254)<1 || countitem(7036)<5) goto ssL_NotEnuf;
+ delitem 2229, 1;
+ delitem 2254, 1;
+ delitem 7036, 5;
+ mes "[Young Man]";
+ mes "Here is your Helm of Angel.";
+ getitem 5025, 1;
+ close;
+ ssL_Devir:
+ if(countitem(1038)<600 || countitem(7048)<40) goto ssL_NotEnuf;
+ delitem 1038, 600;
+ delitem 7048, 40;
+ mes "[Young Man]";
+ mes "Here is your Deviruchi Hat.";
+ getitem 5038, 1;
+ close;
+ ssL_NotEnuf:
+ mes "[Young Man]";
+ mes "You don't have enough items for me to make what you want.";
+ close;
+
+ M_End:
+ mes "[Young Man]";
+ mes "Fine then.....";
+ close;
+
+}
diff --git a/npc/quests/quests_prontera.txt b/npc/quests/quests_prontera.txt
index 92096a9f8..49afb1b62 100644
--- a/npc/quests/quests_prontera.txt
+++ b/npc/quests/quests_prontera.txt
@@ -1,177 +1,177 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Prontera
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Ph.D Hat Quest + Culvert
-//===== Additional Comments: =================================
-//= Fixed flower name Dreamy -> Illusion
-//= 1.2 Fixed exploit [Lupus]
-//= 1.3 Removed Duplicates [Silent]
-//= 1.4 Moved Culvert from cities/prontera.txt [Evera]
-//============================================================
-
-
-// Ph.D Hat Quest-------------------------------------------------------
-prt_in.gat,38,108,4 script Teacher#01 53,{
- if(countitem(710) >= 1 && countitem(703) >= 1 && countitem(704) >= 1 && countitem(708) >= 1) goto L_Start;//Items: Illusion Flower, Hinalle, Aloe, Ment,
- mes "Don't you think.... ^4444FF'flowers'^000000 are pretty?";
- next;
- menu "Talk.",-, "End Conversation.",M_End;
-
- mes "[Teacher]";
- mes "When I was young, I didn't play with friends like the other children. Instead, I spent time studing by myself.";
- next;
- mes "[Teacher]";
- mes "Sometimes I regret that decision.... but it doesn't really matter now. Through hard work, I was able to finish school earlier than my classmates.";
- next;
- mes "[Teacher]";
- mes "I was very lonely however..... when things got rough I had no one to talk to about my feelings.";
- next;
- mes "[Teacher]";
- mes "Then one day, I found my best friend.";
- next;
- mes "[Teacher]";
- mes "It was when I saw this pretty flower blooming in an abandoned garden.... I realised that it was just like me and in it, I found my best friend.";
- next;
- mes "[Teacher]";
- mes "Even though, to others it was just a common flower.... for me this flower meant much more. This flower gave me the strength to continue my studies.";
- mes "I could achieve my goals because of her.";
- next;
- mes "[Teacher]";
- mes "So.. now... I am trying to repay to her. I have started studying Flowers, and It is my goal to cover the whole world in Flowers!";
- next;
- mes "[Teacher]";
- mes "To accomplish my work.. I need a great deal of flowers. Unfortunately because of my studies, I can rarely go outside.";
- mes "It is really hard to find as many flowers as I need.";
- next;
- mes "[Teacher]";
- mes "I need 1 ^3355FFIllusion Flower^000000 ,1 ^3355FFHinalle^000000,1 ^3355FFAloe^000000 and 1 ^3355FFMent^000000...";
- mes "If you can bring these flowers to me, I would be willing to give you a special item...";
- close;
-
- M_End:
- mes "[Teacher]";
- mes "One of these days I will cover whole world in Flowers!.....";
- close;
-
-L_Start:
- mes "[Teacher]";
- mes "Oh... Those Flowers in your hand are....";
- M_Menu:
- next;
- menu "Show Flowers",-, "Give Flowers",M_Give, "Cancel",M_End;
-
- mes "[Teacher]";
- mes "Ah... How wonderful!! These are definately the 4 kinds of Flowers I was looking for ..";
- mes "The ^3355FFIllusion Flower, Hinalle, Aloe, and Ment^000000. Would you give them to me?...";
- next;
- mes "[Teacher]";
- mes "If you do I'd be willing to give you a special item.....";
- goto M_Menu;
-
- M_Give:
- if(countitem(710) < 1 || countitem(703) < 1 || countitem(704) < 1 || countitem(708) < 1) goto L_Cheater;//Items: Illusion Flower, Hinalle, Aloe, Ment,
- delitem 710,1;//Items: Illusion Flower,
- delitem 703,1;//Items: Hinalle,
- delitem 704,1;//Items: Aloe,
- delitem 708,1;//Items: Ment,
- mes "[Teacher]";
- mes "I really, really appreciate what you've done for me!! I trully am grateful! I will give you a very special item as I promised.";
- emotion e_thx;
- next;
- mes "[Teacher]";
- mes "This is the hat I wore at my Graduation Ceremony. It is a reminder of my joyfull school days at the University.";
- mes "Please take it...";
- getitem 5012,1;//Items: Ph.D Hat,
- close;
-
- L_Cheater:
- mes "[Teacher]";
- mes "I won't give a special item to a cheater...";
- mes "Now go away!";
- emotion e_bzz;
- close;
-}
-
-// ------------------------------------------------------------------------------------------- Culvert -------------------------------------------------------------------------------\\
-// Culvert Guardian ----------------------------------------------------
-prt_fild05.gat,270,212,5 script Culvert Guardian 105,{
- mes "[Culvert Guardian]";
- if(MISC_QUEST & 8) {
- mes "Here you are. The entrance of the Culvert. Are you sure you want to Go inside?";
- next;
- menu "Sure.",-,"Quit.",M_END;
-
- warp "prt_sewb1.gat",131,247;
- M_END:
- close;
- }
- mes "Sorry, but only volunteers for the Culvert Campaign can go inside.";
- mes "Speak with the ^000077Recruiter^000000 about volunteering. He's located in the ^ff0000Prontera Chivalry^000000.";
- close;
-}
-
-// Recruiter -----------------------------------------------------------
-prt_in.gat,88,105,2 script Recruiter 105,{
- mes "[Recruiter]";
- if(MISC_QUEST & 8) goto L_WARP;
- mes "Let me inform about the official Notice from the Capital Defence Headquarter of Rune-Midgard Kingdom";
- next;
- mes "[Recruiter]";
- mes "We decided to recruit volunteers to deal with the 'issues' that have been plauging our cities' sewers.";
- next;
- menu "Volunteer.",M_VOL,"Issues...?",-,"Quit",L_END;
-
- mes "[Recruiter]";
- mes "Didn't you hear yet? The Culvert is infested with noxious insects. We found bugs, maggots, and other creatures there.";
- mes "They've become a huge problem... You've Never heard of this?";
- emotion e_what;
- next;
- mes "[Recruiter]";
- mes "Because of the severity of these 'issues',it is forbidden for the people to use the water supply for the time being.";
- next;
- mes "[Recruiter]";
- mes "Needless to say, the people have been greatly inconvenienced by this. If this were to linger on it would cause great ill will among the people of the Prontera.";
- next;
- mes "[Recruiter]";
- mes "The situation is becoming critical! There is restlessness among the people!!";
- next;
- mes "[Recruiter]";
- mes "Mighty Warrior!! The People NEED YOU!! Let's EXPEL these VILE creatures from our land!!!";
- emotion e_go;
- next;
- mes "[Recruiter]";
- mes "WILL YOU volunteer????";
- next;
- menu "Volunteer.",M_VOL,"Quit.",-;
-
- mes "[Recruiter]";
- mes "..............";
- emotion e_swt;
- close;
- M_VOL:
- mes "[Recruiter]";
- mes "Very good!!! Your Registration is confirmed. We will try to maintain peace and order in Rune-Midgard Kingdom.";
- mes "I appreciate your support of the Capital Defence Headquarter. Here are some subsidies....";
- next;
- mes "[Recruiter]";
- mes "3 Red Potions, 1 Milk, and 1 Orange Potion for an emergency.";
- set MISC_QUEST,MISC_QUEST | 8;
- getitem 501,3;
- getitem 519,1;
- getitem 502,1;
- next;
- mes "[Recruiter]";
- L_WARP:
- mes "Are you ready? I will warp you to the Culvert.";
- next;
- warp "prt_fild05.gat",274,208;
- L_END:
- close;
-
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Prontera
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Ph.D Hat Quest + Culvert
+//===== Additional Comments: =================================
+//= Fixed flower name Dreamy -> Illusion
+//= 1.2 Fixed exploit [Lupus]
+//= 1.3 Removed Duplicates [Silent]
+//= 1.4 Moved Culvert from cities/prontera.txt [Evera]
+//============================================================
+
+
+// Ph.D Hat Quest-------------------------------------------------------
+prt_in.gat,38,108,4 script Teacher#01 53,{
+ if(countitem(710) >= 1 && countitem(703) >= 1 && countitem(704) >= 1 && countitem(708) >= 1) goto L_Start;//Items: Illusion Flower, Hinalle, Aloe, Ment,
+ mes "Don't you think.... ^4444FF'flowers'^000000 are pretty?";
+ next;
+ menu "Talk.",-, "End Conversation.",M_End;
+
+ mes "[Teacher]";
+ mes "When I was young, I didn't play with friends like the other children. Instead, I spent time studing by myself.";
+ next;
+ mes "[Teacher]";
+ mes "Sometimes I regret that decision.... but it doesn't really matter now. Through hard work, I was able to finish school earlier than my classmates.";
+ next;
+ mes "[Teacher]";
+ mes "I was very lonely however..... when things got rough I had no one to talk to about my feelings.";
+ next;
+ mes "[Teacher]";
+ mes "Then one day, I found my best friend.";
+ next;
+ mes "[Teacher]";
+ mes "It was when I saw this pretty flower blooming in an abandoned garden.... I realised that it was just like me and in it, I found my best friend.";
+ next;
+ mes "[Teacher]";
+ mes "Even though, to others it was just a common flower.... for me this flower meant much more. This flower gave me the strength to continue my studies.";
+ mes "I could achieve my goals because of her.";
+ next;
+ mes "[Teacher]";
+ mes "So.. now... I am trying to repay to her. I have started studying Flowers, and It is my goal to cover the whole world in Flowers!";
+ next;
+ mes "[Teacher]";
+ mes "To accomplish my work.. I need a great deal of flowers. Unfortunately because of my studies, I can rarely go outside.";
+ mes "It is really hard to find as many flowers as I need.";
+ next;
+ mes "[Teacher]";
+ mes "I need 1 ^3355FFIllusion Flower^000000 ,1 ^3355FFHinalle^000000,1 ^3355FFAloe^000000 and 1 ^3355FFMent^000000...";
+ mes "If you can bring these flowers to me, I would be willing to give you a special item...";
+ close;
+
+ M_End:
+ mes "[Teacher]";
+ mes "One of these days I will cover whole world in Flowers!.....";
+ close;
+
+L_Start:
+ mes "[Teacher]";
+ mes "Oh... Those Flowers in your hand are....";
+ M_Menu:
+ next;
+ menu "Show Flowers",-, "Give Flowers",M_Give, "Cancel",M_End;
+
+ mes "[Teacher]";
+ mes "Ah... How wonderful!! These are definately the 4 kinds of Flowers I was looking for ..";
+ mes "The ^3355FFIllusion Flower, Hinalle, Aloe, and Ment^000000. Would you give them to me?...";
+ next;
+ mes "[Teacher]";
+ mes "If you do I'd be willing to give you a special item.....";
+ goto M_Menu;
+
+ M_Give:
+ if(countitem(710) < 1 || countitem(703) < 1 || countitem(704) < 1 || countitem(708) < 1) goto L_Cheater;//Items: Illusion Flower, Hinalle, Aloe, Ment,
+ delitem 710,1;//Items: Illusion Flower,
+ delitem 703,1;//Items: Hinalle,
+ delitem 704,1;//Items: Aloe,
+ delitem 708,1;//Items: Ment,
+ mes "[Teacher]";
+ mes "I really, really appreciate what you've done for me!! I trully am grateful! I will give you a very special item as I promised.";
+ emotion e_thx;
+ next;
+ mes "[Teacher]";
+ mes "This is the hat I wore at my Graduation Ceremony. It is a reminder of my joyfull school days at the University.";
+ mes "Please take it...";
+ getitem 5012,1;//Items: Ph.D Hat,
+ close;
+
+ L_Cheater:
+ mes "[Teacher]";
+ mes "I won't give a special item to a cheater...";
+ mes "Now go away!";
+ emotion e_bzz;
+ close;
+}
+
+// ------------------------------------------------------------------------------------------- Culvert -------------------------------------------------------------------------------\\
+// Culvert Guardian ----------------------------------------------------
+prt_fild05.gat,270,212,5 script Culvert Guardian 105,{
+ mes "[Culvert Guardian]";
+ if(MISC_QUEST & 8) {
+ mes "Here you are. The entrance of the Culvert. Are you sure you want to Go inside?";
+ next;
+ menu "Sure.",-,"Quit.",M_END;
+
+ warp "prt_sewb1.gat",131,247;
+ M_END:
+ close;
+ }
+ mes "Sorry, but only volunteers for the Culvert Campaign can go inside.";
+ mes "Speak with the ^000077Recruiter^000000 about volunteering. He's located in the ^ff0000Prontera Chivalry^000000.";
+ close;
+}
+
+// Recruiter -----------------------------------------------------------
+prt_in.gat,88,105,2 script Recruiter 105,{
+ mes "[Recruiter]";
+ if(MISC_QUEST & 8) goto L_WARP;
+ mes "Let me inform about the official Notice from the Capital Defence Headquarter of Rune-Midgard Kingdom";
+ next;
+ mes "[Recruiter]";
+ mes "We decided to recruit volunteers to deal with the 'issues' that have been plauging our cities' sewers.";
+ next;
+ menu "Volunteer.",M_VOL,"Issues...?",-,"Quit",L_END;
+
+ mes "[Recruiter]";
+ mes "Didn't you hear yet? The Culvert is infested with noxious insects. We found bugs, maggots, and other creatures there.";
+ mes "They've become a huge problem... You've Never heard of this?";
+ emotion e_what;
+ next;
+ mes "[Recruiter]";
+ mes "Because of the severity of these 'issues',it is forbidden for the people to use the water supply for the time being.";
+ next;
+ mes "[Recruiter]";
+ mes "Needless to say, the people have been greatly inconvenienced by this. If this were to linger on it would cause great ill will among the people of the Prontera.";
+ next;
+ mes "[Recruiter]";
+ mes "The situation is becoming critical! There is restlessness among the people!!";
+ next;
+ mes "[Recruiter]";
+ mes "Mighty Warrior!! The People NEED YOU!! Let's EXPEL these VILE creatures from our land!!!";
+ emotion e_go;
+ next;
+ mes "[Recruiter]";
+ mes "WILL YOU volunteer????";
+ next;
+ menu "Volunteer.",M_VOL,"Quit.",-;
+
+ mes "[Recruiter]";
+ mes "..............";
+ emotion e_swt;
+ close;
+ M_VOL:
+ mes "[Recruiter]";
+ mes "Very good!!! Your Registration is confirmed. We will try to maintain peace and order in Rune-Midgard Kingdom.";
+ mes "I appreciate your support of the Capital Defence Headquarter. Here are some subsidies....";
+ next;
+ mes "[Recruiter]";
+ mes "3 Red Potions, 1 Milk, and 1 Orange Potion for an emergency.";
+ set MISC_QUEST,MISC_QUEST | 8;
+ getitem 501,3;
+ getitem 519,1;
+ getitem 502,1;
+ next;
+ mes "[Recruiter]";
+ L_WARP:
+ mes "Are you ready? I will warp you to the Culvert.";
+ next;
+ warp "prt_fild05.gat",274,208;
+ L_END:
+ close;
+
+}
diff --git a/npc/quests/quests_umbala.txt b/npc/quests/quests_umbala.txt
index b4a539b81..e9213d9f7 100644
--- a/npc/quests/quests_umbala.txt
+++ b/npc/quests/quests_umbala.txt
@@ -1,921 +1,921 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Umbala
-//===== By: ==================================================
-//= sabernet09 & eAthena Team
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Umbalian Language Quest, Umbala Skeletal Gate Quest,
-//= Umbala Event, Create Essence/Dismantle Stone
-// Phase1.Learning the Language
-// 1 (Elder)First discussion
-// 2 (Elder)Asking about learning the language
-// 3 (Elder)Final step (understanding NPC speech)
-// ------------------------------------------
-// Phase2.Create Essence/Dismantle Stone
-// 4 (Shaman)Get permission to speak with her from the chief
-// 5 (Elder)Ask about conditions needed to be fulfilled to get permission
-// 6 (Elder)Get permission
-// 7 (Shaman)Use the shaman to create essences and dismantle elemental stones.
-//===== Additional Comments: =================================
-//= fixed by x[tsk], Lupus, PoW
-//= Quest completion is now registered
-//= 1.1 fixed Poporing Egg ID -> Poring Egg, fixed condition
-//= 1.2-1.6 fixed some Umbalian Language quests [Lupus]
-//= 1.7 Moved Umbala Event, Create Essence/Dismantle Stone, and Skeletal Gate from npc/cities/umbala.txt [Evera]
-//= 1.7a Removed all custom quests to custom folder [Lupus]
-//= 1.8 Added official chance of failure to Create Essence/Dismantle Stone [Lupus]
-//============================================================
-
-
-//========================================================================================================================\\
-// Little Quest NPC to enter the dungeon
-//========================================================================================================================\\
-umbala.gat,65,253,4 script Tree Guardian 752,{
- mes "[Tree Guardian]";
- mes "Stop, stranger, here is the entrance to the ancient tree!";
- next;
- mes "[Tree Guardian]";
- mes "I cannot allow you to enter, you look pretty weak!";
- next;
-L_MENU:
- menu "Talk about tree",-, "Talk about Umbala",M_TALKUMB, "Enter Dungeon",M_DUN, "Leave",M_Leave;
-
- mes "[Tree Guardian]";
- mes "The tree is an ancient relique of our culture!";
- next;
- mes "[Tree Guardian]";
- mes "But recently some monsters overwhelmed the tree and are now";
- mes "slowly killing the tree...like a poison...from inside..";
- next;
- goto L_MENU;
-M_TALKUMB:
- mes "[Tree Guardian]";
- mes "We don't have many visitors in our small town..";
- next;
- mes "[Tree Guardian]";
- mes "Most people don't find us or are just afraid of us!";
- next;
- mes "[Tree Guardian]";
- mes "And now, we are even more unpopular, because of that damn beast!";
- next;
- menu "What beast?",- ,"Leave",M_Leave;
-
- mes "[Tree Guardian]";
- mes "The Werewolf of course!!";
- next;
- mes "[Tree Guardian]";
- mes "He is sneaking around our town and killing our soldiers at night!";
- next;
- mes "[Tree Guardian]";
- mes "Hey...if you could get rid of that beast!";
- next;
- mes "[Tree Guardian]";
- mes "I'll let you in!";
- next;
- mes "[Tree Guardian]";
- mes "From now on we can live in peace again, thanks to you!";
- next;
- mes "[Tree Guardian]";
- mes "You may enter the dungeon now!";
- set umbdun,1;
- close;
-M_DUN:
- mes "[Tree Guardian]";
- if(umbdun != 1) mes "We do not permit weak people to enter!";
- if(umbdun != 1) close;
- mes "Come on in, brave warrior!";
- warp "um_dun01.gat",42,30;
-M_Leave:
- close;
-}
-
-//==============================================================================
-//Skeletal Gate
-//==============================================================================
-umbala.gat,221,193,1 script #Skeletal Gate 111,{
- if(event_umbala==7) goto LwarpNoText;
- set @ryumon,0;
- mes "^3355FFThe gate is shaped like a skeleton";
- mes "You cannot pass this point as the gate is";
- mes "locked. You hear sounds coming from the";
- mes "inside.^000000";
- next;
- menu "Examine the skeleton",-,"Nothing",Lend;
- mes "^3355FFWhen you examine the gate";
- mes "carefully, you notice that there";
- mes "is a hole about the size of a gemstone";
- mes "on the left side of the gate about where";
- mes "the skeleton's left eye should be. There is";
- mes "a matching hole on the other side.^000000";
- next;
- mes "^3355FFWhat you would like to";
- mes "to do with the left socket?^000000";
- next;
- menu "Nothing",-,"Insert a Blue Gemstone",L1_2,"Insert a Yellow Gemstone",L1_3,"Insert a Red Gemstone",L1_4;
- mes "^3355FFNothing was inserted into the left socket.^000000";
- next;
- goto LRight;
- L1_2:
- //Blue
- if(countitem(717) < 1) goto L1_2_e;//Items: Blue Gemstone,
- mes "^3355FFYou inserted a Blue Gemstone into the";
- mes "left socket.^000000";
- next;
- delitem 717,1;//Items: Blue Gemstone,
- getitem 717,1;//Items: Blue Gemstone,
- set @ryumon,1;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto LRight;
- L1_3:
- //Yellow
- if(countitem(715) < 1) goto L1_3_e;//Items: Yellow Gemstone,
- mes "^3355FFYou inserted a Yellow Gemstone into the";
- mes "left socket.^000000";
- next;
- delitem 715,1;//Items: Yellow Gemstone,
- getitem 715,1;//Items: Yellow Gemstone,
- set @ryumon,2;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto LRight;
- L1_4:
- //Red
- if(countitem(716) < 1) goto L1_4_e;//Items: Red Gemstone,
- mes "^3355FFYou inserted a Red Gemstone into the";
- mes "left socket.^000000";
- next;
- delitem 716,1;//Items: Red Gemstone,
- getitem 716,1;//Items: Red Gemstone,
- set @ryumon,3;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto LRight;
- L1_2_e:
- mes "^3355FFYou don't have a Blue Gemstone.";
- goto L1_e;
- L1_3_e:
- mes "^3355FFYou don't have a Yellow Gemstone.";
- goto L1_e;
- L1_4_e:
- mes "^3355FFYou don't have a Red Gemstone.";
- L1_e:
- mes "Therefore, nothing was inserted into";
- mes "the left socket.^000000";
- next;
- LRight:
- mes "^3355FFWhat about the right";
- mes "socket?^000000";
- next;
- menu "Nothing",-,"Insert a Blue Gemstone",L2_2,"Insert a Yellow Gemstone",L2_3,"Insert a Red Gemstone",L2_4;
- mes "^3355FFNothing was inserted into the right socket.^000000";
- next;
- goto Lfin;
- L2_2:
- //Blue
- if(countitem(717) < 1) goto L2_2_e;//Items: Blue Gemstone,
- mes "^3355FFYou inserted a Blue Gemstone into the";
- mes "right socket.^000000";
- next;
- delitem 717,1;//Items: Blue Gemstone,
- getitem 717,1;//Items: Blue Gemstone,
- set @ryumon,@ryumon+10;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto Lfin;
- L2_3:
- //Yellow
- if(countitem(715) < 1) goto L2_3_e;//Items: Yellow Gemstone,
- mes "^3355FFYou inserted a Yellow Gemstone into the";
- mes "right socket.^000000";
- next;
- delitem 715,1;//Items: Yellow Gemstone,
- getitem 715,1;//Items: Yellow Gemstone,
- set @ryumon,@ryumon+20;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto Lfin;
- L2_4:
- //Red
- if(countitem(716) < 1) goto L2_4_e;//Items: Red Gemstone,
- mes "^3355FFYou inserted a Red Gemstone into the";
- mes "right socket.^000000";
- next;
- delitem 716,1;//Items: Red Gemstone,
- getitem 716,1;//Items: Red Gemstone,
- set @ryumon,@ryumon+30;
- mes "^3355FFA rolling sound can be heard, and";
- mes "the gemstone comes out of the skeleton's mouth.^000000";
- next;
- goto Lfin;
- L2_2_e:
- mes "^3355FFYou don't have a Blue Gemstone.";
- goto L2_e;
- L2_3_e:
- mes "^3355FFYou don't have a Yellow Gemstone.";
- goto L2_e;
- L2_4_e:
- mes "^3355FFYou don't have a Red Gemstone.";
- L2_e:
- mes "Therefore, nothing was inserted into";
- mes "the right socket.^000000";
- next;
- Lfin:
- mes "^3355FF..........^000000";
- next;
- mes "^3355FF...................";
- mes ".....................^000000";
- next;
- mes "^3355FF.......................";
- mes ".........................";
- mes ".........................^000000";
- next;
- if(event_umbala < 6) goto LSecondCheck;
- if(@ryumon == 33) goto Lwarp;
- LSecondCheck:
- if(event_umbala >= 6) goto LNewEnd;
- if(@ryumon == 13) goto Lwarp;
- LNewEnd:
- mes "^3355FFNothing happened.";
- mes "You hear a faint laugh, but";
- mes "decide that it's all in";
- mes "your head.^000000";
- close;
- Lwarp:
- mes "^3355FFA rumbling sound can be";
- mes "heard as the gate opens.";
- mes "As you step across the threshold.";
- mes "you feel as if you're walking in";
- mes "into the arms of death itself.^000000";
- next;
- LwarpNoText:
- warp "um_in.gat",32,71;
- close;
-Lend:
- mes "^3355FFAfter hitting the gate a few";
- mes "times with no result, you decide to give";
- mes "up.^000000";
- close;
-}
-
-//==============================================================================
-//Umbala Event
-//==============================================================================
-um_in.gat,39,122,5 script Utan Tribal Elder 784,{
- if(event_umbala == 1) goto LStart2;
- if(event_umbala == 2) goto LStart3;
- if(event_umbala == 3) goto LStart4;
- if(event_umbala == 4) goto LStart5;
- if(event_umbala == 5) goto LStart6;
- if(event_umbala == 6) goto LStart4;
- if(event_umbala == 7) goto LStart4;
- mes "[Karukatan]";
- mes "Aha, You're new to the Utan";
- mes "family's little village, aren't";
- mes "you? I would remember such a face";
- mes "had I met you before.";
- next;
- mes "[Karukatan]";
- mes "We know there is a wide world around";
- mes "us, but the there is something to";
- mes "be appreciated in the simple life";
- mes "we lead here.";
- next;
- mes "[Karukatan]";
- mes "All decisions in the village are made";
- mes "by me or with my input";
- next;
- mes "[Karukatan]";
- mes "You want to know how I speak your";
- mes "language when it seems no one else in";
- mes "the village does? A fair question.";
- mes "I picked up your tongue from the";
- mes "adventurers who sometimes pass";
- mes "through this village.";
- next;
- mes "[Karukatan]";
- mes "Some outsiders have also settled near here";
- mes "over time. In exchange for information";
- mes "about their customs and culture, I";
- mes "teach them the language and customs";
- mes "of the Utan tribe.";
- next;
- mes "[Karukatan]";
- mes "If you want to learn our language,";
- mes "you must immerse yourselves in";
- mes "our customs and cultural traditions.";
- mes "You should even try and look as much";
- mes "like us as you can.";
- next;
- mes "[Karukatan]";
- mes "I hope you're worthy of my confidence.";
- mes "Some members of the tribe have expressed";
- mes "the sentiment that welcoming outsiders";
- mes "is dangerous to the village.";
- next;
- mes "[Karukatan]";
- mes "When you want to begin learning the";
- mes "language, come and visit me. Don't";
- mes "forget to make yourself appear as";
- mes "much like us as you can.";
- set event_umbala,1;
- close;
-LStart2:
- mes "[Karukatan]";
- mes "Ahh, have you looked around the";
- mes "village a bit? Did other people";
- mes "from the tribe hide from you when";
- mes "they saw you? Don't worry. They";
- mes "were just surprised to see a new face.";
- next;
- mes "[Karukatan]";
- mes "Hmm? You need something from me?";
- mes "How can I make your stay in the village";
- mes "more pleasant?";
- next;
- menu "I want to learn the tribal language",-,"Umbaumbaba?",L2,"Forget it",L3;
- if ((getequipisequiped(9)>0) && (getequipisequiped(10)>0)) goto L1_mask;
- mes "[Karukatan]";
- mes "Well, in order to understand our";
- mes "language, you need to assimilate";
- mes "our cultural values, too. Trying to";
- mes "understand a language in the context of an";
- mes "alien culture is foolish, right?";
- next;
- mes "[Karukatan]";
- mes "Besides, if the tribesmen in the";
- mes "village fear you, how will you";
- mes "ever get them to speak with you?";
- mes "You should try making yourself";
- mes "look like us in order to be more";
- mes "accepted.";
- close;
- L1_mask:
- mes "[Karukatan]";
- mes "What a cute mask. The Utan tribe";
- mes "appreciates its traditional masks";
- mes "because sometimes by hiding your";
- mes "face, you can express more genuine";
- mes "feelings.";
- next;
- mes "[Karukatan]";
- mes "Over time, the mask itself";
- mes "has come to symbolize trust among";
- mes "the members of the Utan tribe.";
- next;
- mes "[Karukatan]";
- mes "Now that you're prepared, I will";
- mes "begin teaching you the Utan";
- mes "language as promised. First,";
- mes "you need to make some preparations,";
- mes "however...";
- next;
- mes "[Karukatan]";
- mes "First, I need some paper. With";
- mes "paper, I can write down the words";
- mes "I intend to teach.";
- next;
- mes "[Karukatan]";
- mes "I need ^3377FF10x Oil Paper^000000, and ^3377FF5x Slick Paper^000000.";
- mes "I also need something to write with.";
- mes "of course.";
- mes "For that, ^3377FF1x Squid Ink^000000 and ^3377FF1x Feather of Birds^000000";
- mes "will do nicely.";
- next;
- mes "[Karukatan]";
- mes "Once you get these, I can start";
- mes "teaching you the language.";
- set event_umbala,2;
- close;
- L2:
- mes "[Karukatan]";
- mes "Haha. Only imitating the sound";
- mes "of the words is useless. Even";
- mes "though it sounds random, there is";
- mes "a specific way of combining the";
- mes "words.";
- next;
- mes "[Karukatan]";
- mes "Also, our language has depends a";
- mes "a lot on emotion to convey its";
- mes "meaning. Outsiders can't pick up";
- mes "the subtlety right away, even though";
- mes "we're the same race, ";
- next;
- mes "[Karukatan]";
- mes "It seems you have an interest";
- mes "in learning the language of the";
- mes "Utan tribe. If that's the case,";
- mes "come visit me and I'll teach you.";
- next;
- mes "[Karukatan]";
- mes "Then, you won't sound so silly.";
- close;
- L3:
- mes "[Karukatan]";
- mes "Ah. If you want to continue your";
- mes "trip, please keep this village in";
- mes "your memories.";
- close;
-LStart3:
- if ((countitem(7151)>=10) && (countitem(7111)>=5) && (countitem(1024)>=1) && (countitem(916)>=1)) goto Lchkok;//Items: Oiled Paper, String Paper, Squid Ink, Feather of Birds,
- mes "[Karukatan]";
- mes "It seems you've not yet prepared the";
- mes "proper items. Did you forget what";
- mes "you need to gather before I can";
- mes "teach you the language? You need to gather";
- next;
- mes "[Karukatan]";
- mes "^3377FF10x Oil Paper^000000,";
- mes "^3377FF5x Slick Paper^000000,";
- mes "^3377FF1x Squid Ink^000000, and";
- mes "^3377FF1x Feather of Bird^000000.";
- mes "Once you have gathered those, I can teach";
- mes "you Utan tribal language.";
- close;
-Lchkok:
- delitem 7151,10;//Items: Oiled Paper,
- delitem 7111,5;//Items: String Paper,
- delitem 1024,1;//Items: Squid Ink,
- delitem 916,1;//Items: Feather of Birds,
- mes "[Karukatan]";
- mes "Good. You've prepared all the";
- mes "necessary materials. Now, I can";
- mes "begin to teach you the Utan tribal";
- mes "language.";
- next;
- mes "[Karukatan]";
- mes "............";
- next;
- mes "[Karukatan]";
- mes "............";
- mes "............";
- next;
- mes "[Karukatan]";
- mes "............";
- mes "............";
- mes "............";
- next;
- mes "[Karukatan]";
- mes "Do you feel more enlightened now?";
- mes "Try talking to others in the Utan";
- mes "tribe. They'll warm up to your quickly";
- mes "now that you speak the language.";
- set event_umbala,3;
- next;
- mes "[Karukatan]";
- mes "If you need something while you're";
- mes "here, don't hesitate to visit me.";
- close;
-LStart4:
-//fin
- mes "[Karukatan]";
- mes "Do you need something?";
- mes "If you need someone to guide you around";
- mes "the village, you should ask someone else.";
- mes "I can't leave here right now.";
- next;
- mes "[Karukatan]";
- mes "The best way to get a feel for";
- mes "the village is to just walk";
- mes "around and see the sights. By doing";
- mes "that, you can form a personal";
- mes "bond with the village.";
- close;
-LStart5:
- mes "[Karukatan]";
- mes "Oh, it seems you're enjoying yourself here.";
- mes "You need something else?";
- next;
- mes "[Karukatan]";
- mes "It seems you want to ask the";
- mes "shaman Putsuchiratan something";
- mes "and you're seeking my permission";
- mes "to do so.";
- next;
- mes "[Karukatan]";
- mes "Well...There's a mask from";
- mes "abroad that Putsuchiratan and I";
- mes "have both always desired. Putsuchiratan";
- mes "heard about it some time ago.";
- next;
- mes "[Karukatan]";
- mes "If I could have the ^3377FFSmile Mask^000000,";
- mes "it would be a great honour, but";
- mes "I promised I would give it to";
- mes "to Putsuchiratan as a gift if I ever";
- mes "came across one. If you can find a Smile Mask for me,";
- mes "I'll give you permission to speak with her.";
- set event_umbala,5;
- close;
-LStart6:
- if(countitem(2278) > 0) goto Lsmileok;//Items: Mr. Smile,
- mes "[Karukatan]";
- mes "Did you find the ^3377FFSmile Mask^000000 yet?";
- mes "In order to let you see the shaman,";
- mes "you need to collect one.";
- mes "A gift will put Putsuchiritan in";
- mes "a good mood, also.";
- close;
-Lsmileok:
- delitem 2278,1;//Items: Mr. Smile,
- mes "[Karukatan]";
- mes "Ahh! It's a Smile Mask!";
- mes "I would really like to put this";
- mes "on just once, but I promised to";
- mes "give this to Putsuchiritan as";
- mes "a gift.";
- set event_umbala,6;
- next;
- mes "[Karukatan]";
- mes "I'll tell Putsuchiritan to allow you";
- mes "to meet with her. I'm certain that you";
- mes "will find her talents to be a tremendous";
- mes "help on your journey.";
- close;
-}
-
-//=====================================================================
-// Create Essence/Dismantle Stone
-//=====================================================================
-um_in.gat,44,71,2 script Utan Tribe Shaman 782,{
-
- switch(event_umbala) {
- default:
- mes "[?????]";
- mes "Umbaumbaumbaba Utan Umbaba";
- mes "Umbaumbaumbafumbabauma...";
- mes "Umbabaumbaumbabaumbabaumba";
- mes "Umbabaumbabaumbaumbabaumba";
- mes "Fumbaumba.";
- next;
- warp "umbala.gat",217,186;
- close;
- case 3:
- mes "[Putsuchiritan]";
- mes "I will not see outsiders that are";
- mes "not from the Utan tribe.";
- mes "...There are many things about the";
- mes "nature of our society that you do";
- mes "not yet understand.";
- next;
- mes "[Putsuchiritan]";
- mes "Others of your type will do anything";
- mes "to set foot on land which is sacred";
- mes "to the Utan tribe. We fear that";
- mes "revealing our secrets will expose";
- mes "use to danger.";
- next;
- mes "[Putsuchiritan]";
- mes "What's worse, I don't think that";
- mes "outsiders understand our desire";
- mes "to preserve our tribal culture.";
- next;
- mes "[Putsuchiritan]";
- mes "As my talents are foremost for";
- mes "the use of the Utan tribe, you";
- mes "must get permission from the elder";
- mes "if you want my assistance.";
- mes "Also, don't be stirring up trouble";
- mes "among the tribesmen.";
- set event_umbala,4;
- close;
- case 4:
- case 5:
- mes "[Putsuchiritan]";
- mes "Didn't you hear me? You need";
- mes "to get the elder's permission before";
- mes "I can help you.";
- close;
- case 6:
- mes "[Putsuchiritan]";
- mes "You seem to have gotten permission from";
- mes "the elder. Fine, I'll help you, though";
- mes "I don't really want to.";
- next;
- mes "[Putsuchiritan]";
- mes "I can call forth hidden talents";
- mes "buried deep within your psyche";
- mes "and tap the power hidden in";
- mes "elemental stones.";
- next;
- mes "[Putsuchiritan]";
- mes "I need to prepare my rituals.";
- mes "When you're ready to proceed, please";
- mes "talk to me again.";
- set event_umbala,7;
- close;
- case 7:
- mes "[Putsuchiritan]";
- mes "I don't know whether my talents";
- mes "will be useful to you, but I'll";
- mes "help you anyway.";
- next;
- mes "[Putsuchiritan]";
- mes "I can create elemental essence from natural objects,";
- mes "or, dismantle elemental stones into their component essences.";
- mes "Which would you like to do?";
- }
-
- next;
-
- set .@need,0;
-
- switch (select("Create Essence","Dismantle Elemental Stone","Nothing")) {
- case 1:
- mes "[Putsuchiritan]";
- mes "Which elemental essence would you";
- mes "like to create? I can create earth, water,";
- mes "fire, and wind essence.";
- next;
- switch (select("Earth","Water","Fire","Wind")) {
- case 1:
- if(countitem(947)<15) {
- mes "[Putsuchiritan]";
- mes "Earth...You need that which is";
- mes "a friend of the earth. Explore";
- mes "the verdant forest and find";
- mes "^3377FF15x Horn^000000 for the ritual.";
- }
- else {
- set .@need,947;
- set .@amount,15;
- set .@gain,993;
- }
- break;
- case 2:
- if(countitem(946)<20) {
- mes "[Putsuchiritan]";
- mes "Water...You need that which is";
- mes "saturated with water. Explore";
- mes "the area around here and find";
- mes "^3377FF20x Snails Shell^000000 for the ritual.";
- }
- else {
- set .@need,946;
- set .@amount,20;
- set .@gain,991;
- }
- break;
- case 3:
- if(countitem(904)<20) {
- mes "[Putsuchiritan]";
- mes "Fire...You need that which";
- mes "can withstand the roiling heat";
- mes "of perpetual flame. Explore the";
- mes "desert and find ^3377FF20x Scorpion Tail^000000";
- mes "for the ritual.";
- }
- else {
- set .@need,904;
- set .@amount,20;
- set .@gain,990;
- }
- break;
- case 4:
- if(countitem(1013)<25) {
- mes "[Putsuchiritan]";
- mes "Wind...You need that which";
- mes "has an easy camaraderie with";
- mes "the sky itself.";
- mes "You need ^3377FF25x Rainbow Shell^000000";
- mes "to complete the ritual.";
- }
- else {
- set .@need,1013;
- set .@amount,25;
- set .@gain,992;
- }
- break;
- }
- if(.@need == 0) {
- next;
- mes "[Putsuchiritan]";
- mes "Once you've prepared these";
- mes "objects from nature, please return here";
- mes "so we can complete the ritual.";
- close;
- }
- mes "[Putsuchiritan]";
- mes "Now, I will try to tap the";
- mes "source of power hidden deep within";
- mes "you. Choose a number between 1 and 9.";
- mes "If you don't want to create essence";
- mes "after all, choose 0.";
- while(1) {
- next;
- input .@num;
- if(.@num<=0) {
- mes "[Putsuchiritan]";
- mes "If you don't wish my help at the moment,";
- mes "that's fine. When you do, please come";
- mes "by again.";
- close;
- }
- if(.@num>9) {
- mes "[Putsuchiritan]";
- mes "You must choose a number between";
- mes "1 and 9. It is very important that";
- mes "you choose the number most dear to";
- mes "your heart.";
- continue;
- }
- break;
- }
- mes "[Putsuchiritan]";
- switch(.@need) {
- case 947: mes "The horn begins to vibrate."; break;
- case 904: mes "The tail begins to vibrate."; break;
- default: mes "The shell begins to vibrate."; break;
- }
- mes "I will now chant a holy mantra.";
- mes "Imagine the number in your mind";
- mes "and imagine power radiating forth from";
- mes "your body.";
- next;
- mes "[Putsuchiritan]";
- mes "Amba Omba Sanba! Unba Chi!";
- mes "Wanbatauma Eurukaba! Unba! Ba!";
- mes "Jyur! Fumuba Rurara! Wamba! Ra!";
- mes "Damtsuha Ombabaraka! Unba! Shi!";
- mes "Sukatamba Aburumba! Umba! Shi!";
- next;
- mes "[Putsuchiritan]";
- if(countitem(.@need)<.@amount){
- mes "You're An Amba HacK0R!";
- mes "I'm clearing your mind!";
- //we reset the whole quest for the hacker
- set event_umbala,0;
- emotion e_swt,1;
- close;
- }
- delitem .@need,.@amount;
- if(!rand(10)){
- getitem 910,1; //if failed get Garlet
- mes "Your inner power has failed";
- mes "to convert these objects";
- mes "from nature into elemental essence...";
- next;
- mes "[Putsuchiritan]";
- mes "Purify your mind and try again.";
- close;
- }
- getitem .@gain,1;
- mes "There. Your inner power has converted";
- mes "these objects from nature into";
- mes "elemental essence. Put";
- mes "it to good use.";
- close;
- case 2:
- mes "[Putsuchiritan]";
- mes "What type of stone would you like to";
- mes "dismantle? Please choose earth, water,";
- mes "fire, or wind.";
- next;
- switch (select("Earth","Water","Fire","Wind")) {
- case 1:
- if(countitem(997)==0) {
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Great Nature^000000";
- mes "to disassemble into its";
- mes "component essence.";
- }
- else {
- set .@need,997;
- set .@gain,993;
- }
- break;
- case 2:
- if(countitem(995)==0) {
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Mystic Frozen^000000";
- mes "to disassemble into its";
- mes "component essence.";
- }
- else {
- set .@need,995;
- set .@gain,991;
- }
- break;
- case 3:
- if(countitem(994)==0) {
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Flaming Heart^000000";
- mes "to disassemble into its";
- mes "component essence.";
- }
- else {
- set .@need,994;
- set .@gain,990;
- }
- break;
- case 4:
- if(countitem(996)==0) {
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Rough Wind^000000";
- mes "to disassemble into its";
- mes "component essence.";
- }
- else {
- set .@need,996;
- set .@gain,992;
- }
- break;
- }
- next;
- if(.@need == 0) {
- mes "[Putsuchiritan]";
- mes "Once you have the necessary stone,";
- mes "please come back and visit me";
- mes "so that the ritual can be completed.";
- close;
- }
- mes "[Putsuchiritan]";
- switch(.@need) {
- case 997: mes "I will dismantle your earth crystal"; break;
- case 995: mes "I will dismantle your frozen crystal"; break;
- case 994: mes "I will dismantle your heart of flame"; break;
- case 996: mes "I will dismantle your rough wind stone"; break;
- }
- mes "into its component essence.";
- mes "Choose a number between 1 and 9.";
- mes "If you don't want me to dismantle the";
- mes "stone, choose 0.";
- while(1) {
- next;
- input .@num;
- if(.@num<=0) {
- mes "[Putsuchiritan]";
- mes "If you don't wish my help at the moment,";
- mes "that's fine. When you do, please come";
- mes "by again.";
- close;
- }
- if(.@num>9) {
- mes "[Putsuchiritan]";
- mes "You must choose a number between";
- mes "1 and 9. It is very important that";
- mes "you choose the number most dear to";
- mes "your heart.";
- continue;
- }
- break;
- }
- set .@num,rand(1,10); //official amount chance
- if(.@num == 1)
- set .@num,10;
- else if(.@num == 2 || .@num == 3)
- set .@num,8;
- else if(.@num < 7)
- set .@num,7;
- else
- set .@num,6;
- mes "[Putsuchiritan]";
- mes "Please place the elemental stone";
- mes "inside this holy circle. I will chant a";
- mes "a mantra. I don't know if I can";
- mes "completely dismantle the stone,";
- mes "but here goes...";
- next;
- mes "[Putsuchiritan]";
- mes "Unba Unba Karama! Unba! Ta!";
- mes "Rukara! Ukarere! Un! Unba! Ka!";
- mes "Anburaka Taburaka Taburakan! Unba Ra!";
- mes "Onbaruzu Zan Kata! Unba Ka!";
- next;
- mes "[Putsuchiritan]";
- if(countitem(.@need)<1){
- mes "You're An Amba HacK0R!";
- mes "I'm clearing your mind!";
- //we reset the whole quest for the hacker
- set event_umbala,0;
- emotion e_swt,1;
- close;
- }
- delitem .@need,1;
- getitem .@gain,.@num;
- mes "The elemental stone has been";
- mes "dismantled into its natural";
- mes "essence. Please put it to";
- mes "good use.";
- close;
- case 3:
- mes "[Putsuchiritan]";
- mes "If you don't wish my help at the moment,";
- mes "that's fine. When you do, please come";
- mes "by again.";
- close;
- }
+//===== eAthena Script =======================================
+//= Quest NPCs related to Umbala
+//===== By: ==================================================
+//= sabernet09 & eAthena Team
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Umbalian Language Quest, Umbala Skeletal Gate Quest,
+//= Umbala Event, Create Essence/Dismantle Stone
+// Phase1.Learning the Language
+// 1 (Elder)First discussion
+// 2 (Elder)Asking about learning the language
+// 3 (Elder)Final step (understanding NPC speech)
+// ------------------------------------------
+// Phase2.Create Essence/Dismantle Stone
+// 4 (Shaman)Get permission to speak with her from the chief
+// 5 (Elder)Ask about conditions needed to be fulfilled to get permission
+// 6 (Elder)Get permission
+// 7 (Shaman)Use the shaman to create essences and dismantle elemental stones.
+//===== Additional Comments: =================================
+//= fixed by x[tsk], Lupus, PoW
+//= Quest completion is now registered
+//= 1.1 fixed Poporing Egg ID -> Poring Egg, fixed condition
+//= 1.2-1.6 fixed some Umbalian Language quests [Lupus]
+//= 1.7 Moved Umbala Event, Create Essence/Dismantle Stone, and Skeletal Gate from npc/cities/umbala.txt [Evera]
+//= 1.7a Removed all custom quests to custom folder [Lupus]
+//= 1.8 Added official chance of failure to Create Essence/Dismantle Stone [Lupus]
+//============================================================
+
+
+//========================================================================================================================\\
+// Little Quest NPC to enter the dungeon
+//========================================================================================================================\\
+umbala.gat,65,253,4 script Tree Guardian 752,{
+ mes "[Tree Guardian]";
+ mes "Stop, stranger, here is the entrance to the ancient tree!";
+ next;
+ mes "[Tree Guardian]";
+ mes "I cannot allow you to enter, you look pretty weak!";
+ next;
+L_MENU:
+ menu "Talk about tree",-, "Talk about Umbala",M_TALKUMB, "Enter Dungeon",M_DUN, "Leave",M_Leave;
+
+ mes "[Tree Guardian]";
+ mes "The tree is an ancient relique of our culture!";
+ next;
+ mes "[Tree Guardian]";
+ mes "But recently some monsters overwhelmed the tree and are now";
+ mes "slowly killing the tree...like a poison...from inside..";
+ next;
+ goto L_MENU;
+M_TALKUMB:
+ mes "[Tree Guardian]";
+ mes "We don't have many visitors in our small town..";
+ next;
+ mes "[Tree Guardian]";
+ mes "Most people don't find us or are just afraid of us!";
+ next;
+ mes "[Tree Guardian]";
+ mes "And now, we are even more unpopular, because of that damn beast!";
+ next;
+ menu "What beast?",- ,"Leave",M_Leave;
+
+ mes "[Tree Guardian]";
+ mes "The Werewolf of course!!";
+ next;
+ mes "[Tree Guardian]";
+ mes "He is sneaking around our town and killing our soldiers at night!";
+ next;
+ mes "[Tree Guardian]";
+ mes "Hey...if you could get rid of that beast!";
+ next;
+ mes "[Tree Guardian]";
+ mes "I'll let you in!";
+ next;
+ mes "[Tree Guardian]";
+ mes "From now on we can live in peace again, thanks to you!";
+ next;
+ mes "[Tree Guardian]";
+ mes "You may enter the dungeon now!";
+ set umbdun,1;
+ close;
+M_DUN:
+ mes "[Tree Guardian]";
+ if(umbdun != 1) mes "We do not permit weak people to enter!";
+ if(umbdun != 1) close;
+ mes "Come on in, brave warrior!";
+ warp "um_dun01.gat",42,30;
+M_Leave:
+ close;
+}
+
+//==============================================================================
+//Skeletal Gate
+//==============================================================================
+umbala.gat,221,193,1 script #Skeletal Gate 111,{
+ if(event_umbala==7) goto LwarpNoText;
+ set @ryumon,0;
+ mes "^3355FFThe gate is shaped like a skeleton";
+ mes "You cannot pass this point as the gate is";
+ mes "locked. You hear sounds coming from the";
+ mes "inside.^000000";
+ next;
+ menu "Examine the skeleton",-,"Nothing",Lend;
+ mes "^3355FFWhen you examine the gate";
+ mes "carefully, you notice that there";
+ mes "is a hole about the size of a gemstone";
+ mes "on the left side of the gate about where";
+ mes "the skeleton's left eye should be. There is";
+ mes "a matching hole on the other side.^000000";
+ next;
+ mes "^3355FFWhat you would like to";
+ mes "to do with the left socket?^000000";
+ next;
+ menu "Nothing",-,"Insert a Blue Gemstone",L1_2,"Insert a Yellow Gemstone",L1_3,"Insert a Red Gemstone",L1_4;
+ mes "^3355FFNothing was inserted into the left socket.^000000";
+ next;
+ goto LRight;
+ L1_2:
+ //Blue
+ if(countitem(717) < 1) goto L1_2_e;//Items: Blue Gemstone,
+ mes "^3355FFYou inserted a Blue Gemstone into the";
+ mes "left socket.^000000";
+ next;
+ delitem 717,1;//Items: Blue Gemstone,
+ getitem 717,1;//Items: Blue Gemstone,
+ set @ryumon,1;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto LRight;
+ L1_3:
+ //Yellow
+ if(countitem(715) < 1) goto L1_3_e;//Items: Yellow Gemstone,
+ mes "^3355FFYou inserted a Yellow Gemstone into the";
+ mes "left socket.^000000";
+ next;
+ delitem 715,1;//Items: Yellow Gemstone,
+ getitem 715,1;//Items: Yellow Gemstone,
+ set @ryumon,2;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto LRight;
+ L1_4:
+ //Red
+ if(countitem(716) < 1) goto L1_4_e;//Items: Red Gemstone,
+ mes "^3355FFYou inserted a Red Gemstone into the";
+ mes "left socket.^000000";
+ next;
+ delitem 716,1;//Items: Red Gemstone,
+ getitem 716,1;//Items: Red Gemstone,
+ set @ryumon,3;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto LRight;
+ L1_2_e:
+ mes "^3355FFYou don't have a Blue Gemstone.";
+ goto L1_e;
+ L1_3_e:
+ mes "^3355FFYou don't have a Yellow Gemstone.";
+ goto L1_e;
+ L1_4_e:
+ mes "^3355FFYou don't have a Red Gemstone.";
+ L1_e:
+ mes "Therefore, nothing was inserted into";
+ mes "the left socket.^000000";
+ next;
+ LRight:
+ mes "^3355FFWhat about the right";
+ mes "socket?^000000";
+ next;
+ menu "Nothing",-,"Insert a Blue Gemstone",L2_2,"Insert a Yellow Gemstone",L2_3,"Insert a Red Gemstone",L2_4;
+ mes "^3355FFNothing was inserted into the right socket.^000000";
+ next;
+ goto Lfin;
+ L2_2:
+ //Blue
+ if(countitem(717) < 1) goto L2_2_e;//Items: Blue Gemstone,
+ mes "^3355FFYou inserted a Blue Gemstone into the";
+ mes "right socket.^000000";
+ next;
+ delitem 717,1;//Items: Blue Gemstone,
+ getitem 717,1;//Items: Blue Gemstone,
+ set @ryumon,@ryumon+10;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto Lfin;
+ L2_3:
+ //Yellow
+ if(countitem(715) < 1) goto L2_3_e;//Items: Yellow Gemstone,
+ mes "^3355FFYou inserted a Yellow Gemstone into the";
+ mes "right socket.^000000";
+ next;
+ delitem 715,1;//Items: Yellow Gemstone,
+ getitem 715,1;//Items: Yellow Gemstone,
+ set @ryumon,@ryumon+20;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto Lfin;
+ L2_4:
+ //Red
+ if(countitem(716) < 1) goto L2_4_e;//Items: Red Gemstone,
+ mes "^3355FFYou inserted a Red Gemstone into the";
+ mes "right socket.^000000";
+ next;
+ delitem 716,1;//Items: Red Gemstone,
+ getitem 716,1;//Items: Red Gemstone,
+ set @ryumon,@ryumon+30;
+ mes "^3355FFA rolling sound can be heard, and";
+ mes "the gemstone comes out of the skeleton's mouth.^000000";
+ next;
+ goto Lfin;
+ L2_2_e:
+ mes "^3355FFYou don't have a Blue Gemstone.";
+ goto L2_e;
+ L2_3_e:
+ mes "^3355FFYou don't have a Yellow Gemstone.";
+ goto L2_e;
+ L2_4_e:
+ mes "^3355FFYou don't have a Red Gemstone.";
+ L2_e:
+ mes "Therefore, nothing was inserted into";
+ mes "the right socket.^000000";
+ next;
+ Lfin:
+ mes "^3355FF..........^000000";
+ next;
+ mes "^3355FF...................";
+ mes ".....................^000000";
+ next;
+ mes "^3355FF.......................";
+ mes ".........................";
+ mes ".........................^000000";
+ next;
+ if(event_umbala < 6) goto LSecondCheck;
+ if(@ryumon == 33) goto Lwarp;
+ LSecondCheck:
+ if(event_umbala >= 6) goto LNewEnd;
+ if(@ryumon == 13) goto Lwarp;
+ LNewEnd:
+ mes "^3355FFNothing happened.";
+ mes "You hear a faint laugh, but";
+ mes "decide that it's all in";
+ mes "your head.^000000";
+ close;
+ Lwarp:
+ mes "^3355FFA rumbling sound can be";
+ mes "heard as the gate opens.";
+ mes "As you step across the threshold.";
+ mes "you feel as if you're walking in";
+ mes "into the arms of death itself.^000000";
+ next;
+ LwarpNoText:
+ warp "um_in.gat",32,71;
+ close;
+Lend:
+ mes "^3355FFAfter hitting the gate a few";
+ mes "times with no result, you decide to give";
+ mes "up.^000000";
+ close;
+}
+
+//==============================================================================
+//Umbala Event
+//==============================================================================
+um_in.gat,39,122,5 script Utan Tribal Elder 784,{
+ if(event_umbala == 1) goto LStart2;
+ if(event_umbala == 2) goto LStart3;
+ if(event_umbala == 3) goto LStart4;
+ if(event_umbala == 4) goto LStart5;
+ if(event_umbala == 5) goto LStart6;
+ if(event_umbala == 6) goto LStart4;
+ if(event_umbala == 7) goto LStart4;
+ mes "[Karukatan]";
+ mes "Aha, You're new to the Utan";
+ mes "family's little village, aren't";
+ mes "you? I would remember such a face";
+ mes "had I met you before.";
+ next;
+ mes "[Karukatan]";
+ mes "We know there is a wide world around";
+ mes "us, but the there is something to";
+ mes "be appreciated in the simple life";
+ mes "we lead here.";
+ next;
+ mes "[Karukatan]";
+ mes "All decisions in the village are made";
+ mes "by me or with my input";
+ next;
+ mes "[Karukatan]";
+ mes "You want to know how I speak your";
+ mes "language when it seems no one else in";
+ mes "the village does? A fair question.";
+ mes "I picked up your tongue from the";
+ mes "adventurers who sometimes pass";
+ mes "through this village.";
+ next;
+ mes "[Karukatan]";
+ mes "Some outsiders have also settled near here";
+ mes "over time. In exchange for information";
+ mes "about their customs and culture, I";
+ mes "teach them the language and customs";
+ mes "of the Utan tribe.";
+ next;
+ mes "[Karukatan]";
+ mes "If you want to learn our language,";
+ mes "you must immerse yourselves in";
+ mes "our customs and cultural traditions.";
+ mes "You should even try and look as much";
+ mes "like us as you can.";
+ next;
+ mes "[Karukatan]";
+ mes "I hope you're worthy of my confidence.";
+ mes "Some members of the tribe have expressed";
+ mes "the sentiment that welcoming outsiders";
+ mes "is dangerous to the village.";
+ next;
+ mes "[Karukatan]";
+ mes "When you want to begin learning the";
+ mes "language, come and visit me. Don't";
+ mes "forget to make yourself appear as";
+ mes "much like us as you can.";
+ set event_umbala,1;
+ close;
+LStart2:
+ mes "[Karukatan]";
+ mes "Ahh, have you looked around the";
+ mes "village a bit? Did other people";
+ mes "from the tribe hide from you when";
+ mes "they saw you? Don't worry. They";
+ mes "were just surprised to see a new face.";
+ next;
+ mes "[Karukatan]";
+ mes "Hmm? You need something from me?";
+ mes "How can I make your stay in the village";
+ mes "more pleasant?";
+ next;
+ menu "I want to learn the tribal language",-,"Umbaumbaba?",L2,"Forget it",L3;
+ if ((getequipisequiped(9)>0) && (getequipisequiped(10)>0)) goto L1_mask;
+ mes "[Karukatan]";
+ mes "Well, in order to understand our";
+ mes "language, you need to assimilate";
+ mes "our cultural values, too. Trying to";
+ mes "understand a language in the context of an";
+ mes "alien culture is foolish, right?";
+ next;
+ mes "[Karukatan]";
+ mes "Besides, if the tribesmen in the";
+ mes "village fear you, how will you";
+ mes "ever get them to speak with you?";
+ mes "You should try making yourself";
+ mes "look like us in order to be more";
+ mes "accepted.";
+ close;
+ L1_mask:
+ mes "[Karukatan]";
+ mes "What a cute mask. The Utan tribe";
+ mes "appreciates its traditional masks";
+ mes "because sometimes by hiding your";
+ mes "face, you can express more genuine";
+ mes "feelings.";
+ next;
+ mes "[Karukatan]";
+ mes "Over time, the mask itself";
+ mes "has come to symbolize trust among";
+ mes "the members of the Utan tribe.";
+ next;
+ mes "[Karukatan]";
+ mes "Now that you're prepared, I will";
+ mes "begin teaching you the Utan";
+ mes "language as promised. First,";
+ mes "you need to make some preparations,";
+ mes "however...";
+ next;
+ mes "[Karukatan]";
+ mes "First, I need some paper. With";
+ mes "paper, I can write down the words";
+ mes "I intend to teach.";
+ next;
+ mes "[Karukatan]";
+ mes "I need ^3377FF10x Oil Paper^000000, and ^3377FF5x Slick Paper^000000.";
+ mes "I also need something to write with.";
+ mes "of course.";
+ mes "For that, ^3377FF1x Squid Ink^000000 and ^3377FF1x Feather of Birds^000000";
+ mes "will do nicely.";
+ next;
+ mes "[Karukatan]";
+ mes "Once you get these, I can start";
+ mes "teaching you the language.";
+ set event_umbala,2;
+ close;
+ L2:
+ mes "[Karukatan]";
+ mes "Haha. Only imitating the sound";
+ mes "of the words is useless. Even";
+ mes "though it sounds random, there is";
+ mes "a specific way of combining the";
+ mes "words.";
+ next;
+ mes "[Karukatan]";
+ mes "Also, our language has depends a";
+ mes "a lot on emotion to convey its";
+ mes "meaning. Outsiders can't pick up";
+ mes "the subtlety right away, even though";
+ mes "we're the same race, ";
+ next;
+ mes "[Karukatan]";
+ mes "It seems you have an interest";
+ mes "in learning the language of the";
+ mes "Utan tribe. If that's the case,";
+ mes "come visit me and I'll teach you.";
+ next;
+ mes "[Karukatan]";
+ mes "Then, you won't sound so silly.";
+ close;
+ L3:
+ mes "[Karukatan]";
+ mes "Ah. If you want to continue your";
+ mes "trip, please keep this village in";
+ mes "your memories.";
+ close;
+LStart3:
+ if ((countitem(7151)>=10) && (countitem(7111)>=5) && (countitem(1024)>=1) && (countitem(916)>=1)) goto Lchkok;//Items: Oiled Paper, String Paper, Squid Ink, Feather of Birds,
+ mes "[Karukatan]";
+ mes "It seems you've not yet prepared the";
+ mes "proper items. Did you forget what";
+ mes "you need to gather before I can";
+ mes "teach you the language? You need to gather";
+ next;
+ mes "[Karukatan]";
+ mes "^3377FF10x Oil Paper^000000,";
+ mes "^3377FF5x Slick Paper^000000,";
+ mes "^3377FF1x Squid Ink^000000, and";
+ mes "^3377FF1x Feather of Bird^000000.";
+ mes "Once you have gathered those, I can teach";
+ mes "you Utan tribal language.";
+ close;
+Lchkok:
+ delitem 7151,10;//Items: Oiled Paper,
+ delitem 7111,5;//Items: String Paper,
+ delitem 1024,1;//Items: Squid Ink,
+ delitem 916,1;//Items: Feather of Birds,
+ mes "[Karukatan]";
+ mes "Good. You've prepared all the";
+ mes "necessary materials. Now, I can";
+ mes "begin to teach you the Utan tribal";
+ mes "language.";
+ next;
+ mes "[Karukatan]";
+ mes "............";
+ next;
+ mes "[Karukatan]";
+ mes "............";
+ mes "............";
+ next;
+ mes "[Karukatan]";
+ mes "............";
+ mes "............";
+ mes "............";
+ next;
+ mes "[Karukatan]";
+ mes "Do you feel more enlightened now?";
+ mes "Try talking to others in the Utan";
+ mes "tribe. They'll warm up to your quickly";
+ mes "now that you speak the language.";
+ set event_umbala,3;
+ next;
+ mes "[Karukatan]";
+ mes "If you need something while you're";
+ mes "here, don't hesitate to visit me.";
+ close;
+LStart4:
+//fin
+ mes "[Karukatan]";
+ mes "Do you need something?";
+ mes "If you need someone to guide you around";
+ mes "the village, you should ask someone else.";
+ mes "I can't leave here right now.";
+ next;
+ mes "[Karukatan]";
+ mes "The best way to get a feel for";
+ mes "the village is to just walk";
+ mes "around and see the sights. By doing";
+ mes "that, you can form a personal";
+ mes "bond with the village.";
+ close;
+LStart5:
+ mes "[Karukatan]";
+ mes "Oh, it seems you're enjoying yourself here.";
+ mes "You need something else?";
+ next;
+ mes "[Karukatan]";
+ mes "It seems you want to ask the";
+ mes "shaman Putsuchiratan something";
+ mes "and you're seeking my permission";
+ mes "to do so.";
+ next;
+ mes "[Karukatan]";
+ mes "Well...There's a mask from";
+ mes "abroad that Putsuchiratan and I";
+ mes "have both always desired. Putsuchiratan";
+ mes "heard about it some time ago.";
+ next;
+ mes "[Karukatan]";
+ mes "If I could have the ^3377FFSmile Mask^000000,";
+ mes "it would be a great honour, but";
+ mes "I promised I would give it to";
+ mes "to Putsuchiratan as a gift if I ever";
+ mes "came across one. If you can find a Smile Mask for me,";
+ mes "I'll give you permission to speak with her.";
+ set event_umbala,5;
+ close;
+LStart6:
+ if(countitem(2278) > 0) goto Lsmileok;//Items: Mr. Smile,
+ mes "[Karukatan]";
+ mes "Did you find the ^3377FFSmile Mask^000000 yet?";
+ mes "In order to let you see the shaman,";
+ mes "you need to collect one.";
+ mes "A gift will put Putsuchiritan in";
+ mes "a good mood, also.";
+ close;
+Lsmileok:
+ delitem 2278,1;//Items: Mr. Smile,
+ mes "[Karukatan]";
+ mes "Ahh! It's a Smile Mask!";
+ mes "I would really like to put this";
+ mes "on just once, but I promised to";
+ mes "give this to Putsuchiritan as";
+ mes "a gift.";
+ set event_umbala,6;
+ next;
+ mes "[Karukatan]";
+ mes "I'll tell Putsuchiritan to allow you";
+ mes "to meet with her. I'm certain that you";
+ mes "will find her talents to be a tremendous";
+ mes "help on your journey.";
+ close;
+}
+
+//=====================================================================
+// Create Essence/Dismantle Stone
+//=====================================================================
+um_in.gat,44,71,2 script Utan Tribe Shaman 782,{
+
+ switch(event_umbala) {
+ default:
+ mes "[?????]";
+ mes "Umbaumbaumbaba Utan Umbaba";
+ mes "Umbaumbaumbafumbabauma...";
+ mes "Umbabaumbaumbabaumbabaumba";
+ mes "Umbabaumbabaumbaumbabaumba";
+ mes "Fumbaumba.";
+ next;
+ warp "umbala.gat",217,186;
+ close;
+ case 3:
+ mes "[Putsuchiritan]";
+ mes "I will not see outsiders that are";
+ mes "not from the Utan tribe.";
+ mes "...There are many things about the";
+ mes "nature of our society that you do";
+ mes "not yet understand.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "Others of your type will do anything";
+ mes "to set foot on land which is sacred";
+ mes "to the Utan tribe. We fear that";
+ mes "revealing our secrets will expose";
+ mes "use to danger.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "What's worse, I don't think that";
+ mes "outsiders understand our desire";
+ mes "to preserve our tribal culture.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "As my talents are foremost for";
+ mes "the use of the Utan tribe, you";
+ mes "must get permission from the elder";
+ mes "if you want my assistance.";
+ mes "Also, don't be stirring up trouble";
+ mes "among the tribesmen.";
+ set event_umbala,4;
+ close;
+ case 4:
+ case 5:
+ mes "[Putsuchiritan]";
+ mes "Didn't you hear me? You need";
+ mes "to get the elder's permission before";
+ mes "I can help you.";
+ close;
+ case 6:
+ mes "[Putsuchiritan]";
+ mes "You seem to have gotten permission from";
+ mes "the elder. Fine, I'll help you, though";
+ mes "I don't really want to.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "I can call forth hidden talents";
+ mes "buried deep within your psyche";
+ mes "and tap the power hidden in";
+ mes "elemental stones.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "I need to prepare my rituals.";
+ mes "When you're ready to proceed, please";
+ mes "talk to me again.";
+ set event_umbala,7;
+ close;
+ case 7:
+ mes "[Putsuchiritan]";
+ mes "I don't know whether my talents";
+ mes "will be useful to you, but I'll";
+ mes "help you anyway.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "I can create elemental essence from natural objects,";
+ mes "or, dismantle elemental stones into their component essences.";
+ mes "Which would you like to do?";
+ }
+
+ next;
+
+ set .@need,0;
+
+ switch (select("Create Essence","Dismantle Elemental Stone","Nothing")) {
+ case 1:
+ mes "[Putsuchiritan]";
+ mes "Which elemental essence would you";
+ mes "like to create? I can create earth, water,";
+ mes "fire, and wind essence.";
+ next;
+ switch (select("Earth","Water","Fire","Wind")) {
+ case 1:
+ if(countitem(947)<15) {
+ mes "[Putsuchiritan]";
+ mes "Earth...You need that which is";
+ mes "a friend of the earth. Explore";
+ mes "the verdant forest and find";
+ mes "^3377FF15x Horn^000000 for the ritual.";
+ }
+ else {
+ set .@need,947;
+ set .@amount,15;
+ set .@gain,993;
+ }
+ break;
+ case 2:
+ if(countitem(946)<20) {
+ mes "[Putsuchiritan]";
+ mes "Water...You need that which is";
+ mes "saturated with water. Explore";
+ mes "the area around here and find";
+ mes "^3377FF20x Snails Shell^000000 for the ritual.";
+ }
+ else {
+ set .@need,946;
+ set .@amount,20;
+ set .@gain,991;
+ }
+ break;
+ case 3:
+ if(countitem(904)<20) {
+ mes "[Putsuchiritan]";
+ mes "Fire...You need that which";
+ mes "can withstand the roiling heat";
+ mes "of perpetual flame. Explore the";
+ mes "desert and find ^3377FF20x Scorpion Tail^000000";
+ mes "for the ritual.";
+ }
+ else {
+ set .@need,904;
+ set .@amount,20;
+ set .@gain,990;
+ }
+ break;
+ case 4:
+ if(countitem(1013)<25) {
+ mes "[Putsuchiritan]";
+ mes "Wind...You need that which";
+ mes "has an easy camaraderie with";
+ mes "the sky itself.";
+ mes "You need ^3377FF25x Rainbow Shell^000000";
+ mes "to complete the ritual.";
+ }
+ else {
+ set .@need,1013;
+ set .@amount,25;
+ set .@gain,992;
+ }
+ break;
+ }
+ if(.@need == 0) {
+ next;
+ mes "[Putsuchiritan]";
+ mes "Once you've prepared these";
+ mes "objects from nature, please return here";
+ mes "so we can complete the ritual.";
+ close;
+ }
+ mes "[Putsuchiritan]";
+ mes "Now, I will try to tap the";
+ mes "source of power hidden deep within";
+ mes "you. Choose a number between 1 and 9.";
+ mes "If you don't want to create essence";
+ mes "after all, choose 0.";
+ while(1) {
+ next;
+ input .@num;
+ if(.@num<=0) {
+ mes "[Putsuchiritan]";
+ mes "If you don't wish my help at the moment,";
+ mes "that's fine. When you do, please come";
+ mes "by again.";
+ close;
+ }
+ if(.@num>9) {
+ mes "[Putsuchiritan]";
+ mes "You must choose a number between";
+ mes "1 and 9. It is very important that";
+ mes "you choose the number most dear to";
+ mes "your heart.";
+ continue;
+ }
+ break;
+ }
+ mes "[Putsuchiritan]";
+ switch(.@need) {
+ case 947: mes "The horn begins to vibrate."; break;
+ case 904: mes "The tail begins to vibrate."; break;
+ default: mes "The shell begins to vibrate."; break;
+ }
+ mes "I will now chant a holy mantra.";
+ mes "Imagine the number in your mind";
+ mes "and imagine power radiating forth from";
+ mes "your body.";
+ next;
+ mes "[Putsuchiritan]";
+ mes "Amba Omba Sanba! Unba Chi!";
+ mes "Wanbatauma Eurukaba! Unba! Ba!";
+ mes "Jyur! Fumuba Rurara! Wamba! Ra!";
+ mes "Damtsuha Ombabaraka! Unba! Shi!";
+ mes "Sukatamba Aburumba! Umba! Shi!";
+ next;
+ mes "[Putsuchiritan]";
+ if(countitem(.@need)<.@amount){
+ mes "You're An Amba HacK0R!";
+ mes "I'm clearing your mind!";
+ //we reset the whole quest for the hacker
+ set event_umbala,0;
+ emotion e_swt,1;
+ close;
+ }
+ delitem .@need,.@amount;
+ if(!rand(10)){
+ getitem 910,1; //if failed get Garlet
+ mes "Your inner power has failed";
+ mes "to convert these objects";
+ mes "from nature into elemental essence...";
+ next;
+ mes "[Putsuchiritan]";
+ mes "Purify your mind and try again.";
+ close;
+ }
+ getitem .@gain,1;
+ mes "There. Your inner power has converted";
+ mes "these objects from nature into";
+ mes "elemental essence. Put";
+ mes "it to good use.";
+ close;
+ case 2:
+ mes "[Putsuchiritan]";
+ mes "What type of stone would you like to";
+ mes "dismantle? Please choose earth, water,";
+ mes "fire, or wind.";
+ next;
+ switch (select("Earth","Water","Fire","Wind")) {
+ case 1:
+ if(countitem(997)==0) {
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Great Nature^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ }
+ else {
+ set .@need,997;
+ set .@gain,993;
+ }
+ break;
+ case 2:
+ if(countitem(995)==0) {
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Mystic Frozen^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ }
+ else {
+ set .@need,995;
+ set .@gain,991;
+ }
+ break;
+ case 3:
+ if(countitem(994)==0) {
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Flaming Heart^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ }
+ else {
+ set .@need,994;
+ set .@gain,990;
+ }
+ break;
+ case 4:
+ if(countitem(996)==0) {
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Rough Wind^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ }
+ else {
+ set .@need,996;
+ set .@gain,992;
+ }
+ break;
+ }
+ next;
+ if(.@need == 0) {
+ mes "[Putsuchiritan]";
+ mes "Once you have the necessary stone,";
+ mes "please come back and visit me";
+ mes "so that the ritual can be completed.";
+ close;
+ }
+ mes "[Putsuchiritan]";
+ switch(.@need) {
+ case 997: mes "I will dismantle your earth crystal"; break;
+ case 995: mes "I will dismantle your frozen crystal"; break;
+ case 994: mes "I will dismantle your heart of flame"; break;
+ case 996: mes "I will dismantle your rough wind stone"; break;
+ }
+ mes "into its component essence.";
+ mes "Choose a number between 1 and 9.";
+ mes "If you don't want me to dismantle the";
+ mes "stone, choose 0.";
+ while(1) {
+ next;
+ input .@num;
+ if(.@num<=0) {
+ mes "[Putsuchiritan]";
+ mes "If you don't wish my help at the moment,";
+ mes "that's fine. When you do, please come";
+ mes "by again.";
+ close;
+ }
+ if(.@num>9) {
+ mes "[Putsuchiritan]";
+ mes "You must choose a number between";
+ mes "1 and 9. It is very important that";
+ mes "you choose the number most dear to";
+ mes "your heart.";
+ continue;
+ }
+ break;
+ }
+ set .@num,rand(1,10); //official amount chance
+ if(.@num == 1)
+ set .@num,10;
+ else if(.@num == 2 || .@num == 3)
+ set .@num,8;
+ else if(.@num < 7)
+ set .@num,7;
+ else
+ set .@num,6;
+ mes "[Putsuchiritan]";
+ mes "Please place the elemental stone";
+ mes "inside this holy circle. I will chant a";
+ mes "a mantra. I don't know if I can";
+ mes "completely dismantle the stone,";
+ mes "but here goes...";
+ next;
+ mes "[Putsuchiritan]";
+ mes "Unba Unba Karama! Unba! Ta!";
+ mes "Rukara! Ukarere! Un! Unba! Ka!";
+ mes "Anburaka Taburaka Taburakan! Unba Ra!";
+ mes "Onbaruzu Zan Kata! Unba Ka!";
+ next;
+ mes "[Putsuchiritan]";
+ if(countitem(.@need)<1){
+ mes "You're An Amba HacK0R!";
+ mes "I'm clearing your mind!";
+ //we reset the whole quest for the hacker
+ set event_umbala,0;
+ emotion e_swt,1;
+ close;
+ }
+ delitem .@need,1;
+ getitem .@gain,.@num;
+ mes "The elemental stone has been";
+ mes "dismantled into its natural";
+ mes "essence. Please put it to";
+ mes "good use.";
+ close;
+ case 3:
+ mes "[Putsuchiritan]";
+ mes "If you don't wish my help at the moment,";
+ mes "that's fine. When you do, please come";
+ mes "by again.";
+ close;
+ }
} \ No newline at end of file
diff --git a/npc/quests/quests_yuno.txt b/npc/quests/quests_yuno.txt
index d9a82cf5c..672d65c01 100644
--- a/npc/quests/quests_yuno.txt
+++ b/npc/quests/quests_yuno.txt
@@ -1,128 +1,128 @@
-//===== eAthena Script =======================================
-//= Quest NPCs related to Yuno
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Help the bros and get some rubies or gold. This quest is
-//= also used in part of the Alchemist job quest.
-//===== Additional Comments: =================================
-//= v1.1 Re-did the text and re-organized the script. Corrected some items. [kobra_k88]
-//= v1.2 Added part to Bro's for alchemist quest [Darkchild]
-//= 1.3 fixed that part of Alch Job Quest. [Lupus]
-//= 1.4 Fixed exploit [Lupus]
-//============================================================
-
-
-//===========================================================================
-yuno_in01.gat,103,158,4 script Bain 98,{
- set @name$, "[Bain]";
-
-OnStart:
- mes @name$;
- if(bros_q == 1) goto L_Check;
- mes "We are going to invent a doll that can talk and communicate! Well, at least that's what I'm trying to do....";
- mes "The idea came from an old tale about a doll that acted like a real person.";
- next;
- mes @name$;
- mes "I figure if someone had the ability to make such a doll back then, then it should definitely be possible today.";
- next;
- mes @name$;
- mes "Unfortunately I lack the proper supplies and parts to actually try and build the doll.";
- mes "Although I can buy some of the things I need, many of these items can only be taken from monsters......";
- next;
- mes @name$;
- mes "I am much to weak to defeat these monsters....... How will I be able to continue this project??.....";
- next;
- menu "I'll get the items for you.",-, "Good luck.",M_End;
-
- mes @name$;
- mes "Really? Such benevolence is rare in this day and age. We would be grateful for you assisstance.";
- mes "Here are the items that we will be needing.......";
- callsub sF_List;
- set bros_q, 1;
- close;
-
- M_End:
- mes @name$;
- mes "We'll need a lot of luck if this is going to happen. If you know of anyone who can help us, please let us know.";
- close;
-
-L_Check:
- if(countitem(974) < 1 || countitem(612) < 5 || countitem(7068) < 5 || countitem(1003) < 5 || countitem(7043) < 5 ||
- countitem(757) < 3 || countitem(756) < 3 || Zeny < 2000) goto L_NotEnuf;
- delitem 974,1;
- delitem 612,5;
- delitem 7068,5;
- delitem 1003,5;
- delitem 7043,5;
- delitem 757,3;
- delitem 756,3;
- set Zeny, Zeny-2000;
- mes "Thank you very much! You found all of the items I needed. We could not have completed this project without your help";
- next;
- mes @name$;
- mes "Okay, let's try this out!";
- mes "Hold on for just a second!";
- next;
- mes "-Vrrrmrmrmrmrmrmrrmrmrmmrmrmrmrmmm";
- next;
- mes "-Pakakakakakakakakakakakakakak";
- next;
- mes "-Shakakakakakakakakakakaakakak";
- next;
- mes @name$;
- mes "AHHH it is a success!";
- mes "I don't know if we can do anything else, but this time we have created";
- set @wowitem,rand(2);
- if(@wowitem == 0) mes "5 Ruby!";
- if(@wowitem == 0) getitem 723,5;
- if(@wowitem == 1) mes "3 Gold!";
- if(@wowitem == 1) getitem 969,3;
- if(ALCH_Q == 6) set ALCH_Q2, 2; //for Alchemist Job Quest
- set bros_q, 0;
- next;
- mes @name$;
- mes "Now that we know that it works,";
- mes "I don't have any need for this.";
- mes "Why don't you take it? Oh,";
- mes "and if you find anymore parts,";
- mes "bring them to me again. Heheheheh.";
- next;
- mes @name$;
- mes "Thanks for helping me out.";
- mes "You have my eternal gratitude.";
- mes "I wish you luck in your journeys!";
- close;
-
- L_NotEnuf:
- mes "In case you forgot, these are the items that we will need. I suggest you write them down......";
- callsub sF_List;
- close;
-
-sF_List:
- next;
- mes @name$;
- mes "^5533FF1 Mixture";
- mes "5 Mini-Furnaces";
- mes "5 Burnt Trees";
- mes "5 Coal";
- mes "5 Fine Sand";
- mes "3 Rough Elunium";
- mes "3 Rough Oridecon^000000";
- next;
- mes @name$;
- mes "We will also need ^5533FF2,000 zeny^000000.";
- mes "The money will help pay for the minor expenses invovled in the undertaking of this project. Good luck and please be safe.";
- return;
-}
-
-//=====================================================================
-yuno_in01.gat,99,153,4 script Bajin 47,{
- set @name$, "[Bajin]";
- doevent "Bain::OnStart";
- close;
-}
+//===== eAthena Script =======================================
+//= Quest NPCs related to Yuno
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Help the bros and get some rubies or gold. This quest is
+//= also used in part of the Alchemist job quest.
+//===== Additional Comments: =================================
+//= v1.1 Re-did the text and re-organized the script. Corrected some items. [kobra_k88]
+//= v1.2 Added part to Bro's for alchemist quest [Darkchild]
+//= 1.3 fixed that part of Alch Job Quest. [Lupus]
+//= 1.4 Fixed exploit [Lupus]
+//============================================================
+
+
+//===========================================================================
+yuno_in01.gat,103,158,4 script Bain 98,{
+ set @name$, "[Bain]";
+
+OnStart:
+ mes @name$;
+ if(bros_q == 1) goto L_Check;
+ mes "We are going to invent a doll that can talk and communicate! Well, at least that's what I'm trying to do....";
+ mes "The idea came from an old tale about a doll that acted like a real person.";
+ next;
+ mes @name$;
+ mes "I figure if someone had the ability to make such a doll back then, then it should definitely be possible today.";
+ next;
+ mes @name$;
+ mes "Unfortunately I lack the proper supplies and parts to actually try and build the doll.";
+ mes "Although I can buy some of the things I need, many of these items can only be taken from monsters......";
+ next;
+ mes @name$;
+ mes "I am much to weak to defeat these monsters....... How will I be able to continue this project??.....";
+ next;
+ menu "I'll get the items for you.",-, "Good luck.",M_End;
+
+ mes @name$;
+ mes "Really? Such benevolence is rare in this day and age. We would be grateful for you assisstance.";
+ mes "Here are the items that we will be needing.......";
+ callsub sF_List;
+ set bros_q, 1;
+ close;
+
+ M_End:
+ mes @name$;
+ mes "We'll need a lot of luck if this is going to happen. If you know of anyone who can help us, please let us know.";
+ close;
+
+L_Check:
+ if(countitem(974) < 1 || countitem(612) < 5 || countitem(7068) < 5 || countitem(1003) < 5 || countitem(7043) < 5 ||
+ countitem(757) < 3 || countitem(756) < 3 || Zeny < 2000) goto L_NotEnuf;
+ delitem 974,1;
+ delitem 612,5;
+ delitem 7068,5;
+ delitem 1003,5;
+ delitem 7043,5;
+ delitem 757,3;
+ delitem 756,3;
+ set Zeny, Zeny-2000;
+ mes "Thank you very much! You found all of the items I needed. We could not have completed this project without your help";
+ next;
+ mes @name$;
+ mes "Okay, let's try this out!";
+ mes "Hold on for just a second!";
+ next;
+ mes "-Vrrrmrmrmrmrmrmrrmrmrmmrmrmrmrmmm";
+ next;
+ mes "-Pakakakakakakakakakakakakakak";
+ next;
+ mes "-Shakakakakakakakakakakaakakak";
+ next;
+ mes @name$;
+ mes "AHHH it is a success!";
+ mes "I don't know if we can do anything else, but this time we have created";
+ set @wowitem,rand(2);
+ if(@wowitem == 0) mes "5 Ruby!";
+ if(@wowitem == 0) getitem 723,5;
+ if(@wowitem == 1) mes "3 Gold!";
+ if(@wowitem == 1) getitem 969,3;
+ if(ALCH_Q == 6) set ALCH_Q2, 2; //for Alchemist Job Quest
+ set bros_q, 0;
+ next;
+ mes @name$;
+ mes "Now that we know that it works,";
+ mes "I don't have any need for this.";
+ mes "Why don't you take it? Oh,";
+ mes "and if you find anymore parts,";
+ mes "bring them to me again. Heheheheh.";
+ next;
+ mes @name$;
+ mes "Thanks for helping me out.";
+ mes "You have my eternal gratitude.";
+ mes "I wish you luck in your journeys!";
+ close;
+
+ L_NotEnuf:
+ mes "In case you forgot, these are the items that we will need. I suggest you write them down......";
+ callsub sF_List;
+ close;
+
+sF_List:
+ next;
+ mes @name$;
+ mes "^5533FF1 Mixture";
+ mes "5 Mini-Furnaces";
+ mes "5 Burnt Trees";
+ mes "5 Coal";
+ mes "5 Fine Sand";
+ mes "3 Rough Elunium";
+ mes "3 Rough Oridecon^000000";
+ next;
+ mes @name$;
+ mes "We will also need ^5533FF2,000 zeny^000000.";
+ mes "The money will help pay for the minor expenses invovled in the undertaking of this project. Good luck and please be safe.";
+ return;
+}
+
+//=====================================================================
+yuno_in01.gat,99,153,4 script Bajin 47,{
+ set @name$, "[Bajin]";
+ doevent "Bain::OnStart";
+ close;
+}
diff --git a/npc/quests/quiz/quiz_qt.txt b/npc/quests/quiz/quiz_qt.txt
index 6d5347db5..584465804 100644
--- a/npc/quests/quiz/quiz_qt.txt
+++ b/npc/quests/quiz/quiz_qt.txt
@@ -1,2139 +1,2139 @@
-//===== eAthena Script =======================================
-//= Quiz (Revolution) Part 1
-//===== By: ==================================================
-//= CAHTXHuK
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//=========================================================================================================================================
-prontera.gat,152,286,4 script Receptionist::RecepQuiz 755,{
-
-if (countitem(1201) > 3) goto M_MaxItem;
-if (checkweight(1201,3) == 0 ) goto L_OverWeight;
-
-
-if(BaseLevel < 20){
- mes "^2f4f4f[Tsuji]^000000";
- mes "Hello";
- mes "This is Tsuji who is in charge of";
- mes "receiving application forms for";
- mes "Quiz Revolution event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Zonda corporation has prepared";
- mes "^0000ffQuiz Revolution^000000 event to";
- mes "provide fun and excitement";
- mes "to all of you.";
- mes "Please read the following explanation and";
- mes "participate in this event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "This Quiz Revolution event is..";
- mes "operated in a different way compared to the previous one.";
- mes "The event will only be open for those who wish to participate in the game.";
- mes "Also, the ^006400Quiz Tickets^000000 will be given to those who";
- mes "pass simple tests to check if the player is worthy of";
- mes "playing the game.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "The assessment will be made through";
- mes "^006400four simple tests^000000";
- mes "For the ones who pass all four tests";
- mes "will receive the quiz ticket of the";
- mes "Quiz Revolution event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Hmm?! Wait a sec.";
- mes "If you wish to join Quiz Revolution event";
- mes "you should have base level";
- mes "20 or above.";
- mes "Please go and return after raising the";
- mes "level to the expected point.";
- close;
-
-} else if (quiz_rvl > 2) {
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "The event for all of you!";
- mes "Quiz Revolution is about to start.";
- mes "Please show us a lot of";
- mes "participation.";
- mes "And don't forget to bring the admission ticket~~";
- close;
-
-} else if (quiz_rvl == 2) {
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "You have already passed the first test.";
- mes "Please visit 'Payon' and find";
- mes "'Seeil'.";
- mes "Seeil will give the second test.";
- close;
-
-} else if (quiz_rvl == 1) {
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "^0000ff" +strcharinfo(0)+ "^000000.";
- mes "You have to take the retest";
- mes "to pass the test.";
- mes "Will you accept it?";
- next;
- menu "Yes",-,"No",sM1_No;
-
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "Very well.";
- mes "I hope you pass the test this time..";
- mes "Here are the questions.";
- set @test_soonsu, rand(2);
- set @score_test, 0;
- next;
-
- if (@test_soonsu == 0){
- mes "^2f4f4f[Tsuji]^000000";
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
-
- next;
- menu "O",-,"X",X1;
-
- set @score_test, @score_test + 10;
-
- X1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "Ragnarok's monetary unit is 'Zeny'.";
- next;
- menu "O",-,"X",X2;
-
- set @score_test, @score_test + 10;
-
- X2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "If an unknown person is attacking a monster";
- mes "you have to attack the same monster together.";
- next;
- menu "O",X3,"X",-;
-
- set @score_test, @score_test + 10;
- X3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "'Payon' is the capital of 'Rune Midgarts'.";
- next;
- menu "O",X4,"X",-;
-
- set @score_test, @score_test + 10;
-
- X4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "There are ships in 'Alberta'.";
- next;
- menu "O",-,"X",X5;
-
- set @score_test, @score_test + 10;
-
- X5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "A job class that can use";
- mes "'Grand Cross' is";
- mes "'Lord Knight'.";
- next;
- menu "O",X6,"X",-;
-
- set @score_test, @score_test + 10;
-
- X6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th question.";
- mes "When 'Bard' screams, the oppenet can be 'sturn status'";
- mes "in regular probability.";
- next;
- menu "O",X7,"X",-;
-
- set @score_test, @score_test + 10;
-
- X7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Baphomet'is a tool";
- mes "for killing mosquitos.";
- next;
- menu "O",X8,"X",-;
-
- set @score_test, @score_test + 10;
-
- X8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "'Swordman' can class change to";
- mes "'Ambernite'.";
- next;
- menu "O",X9,"X",-;
-
- set @score_test, @score_test + 10;
-
- X9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "The last question.";
- mes "A fine horse, which appears in North european Myth";
- mes "'Sleipnir' has five legs.";
- next;
- menu "O",X0,"X",-;
-
- set @score_test, @score_test + 10;
-
- goto X0;
-
-
- } else if (@test_soonsu == 1){
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
- next;
- menu "O",-, "X",X1_1;
-
- set @score_test, @score_test + 10;
-
- X1_1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "'Valkyrie' who appears in North european Myth";
- mes "is the godess of Love.";
- next;
- menu "O",X1_2,"X",-;
- set @score_test, @score_test + 10;
-
- X1_2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "'Bethoven' composed the classic";
- mes "'Moon Light sonata'.";
- next;
- menu "O",-, "X",X1_3;
-
- set @score_test, @score_test + 10;
-
- X1_3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "Orcs that exsits in the world of Ragnarok";
- mes "are divided into 7 types.";
- next;
- menu "O",X1_4,"X",-;
- set @score_test, @score_test + 10;
-
- X1_4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "'Cobolt Card' can be installed";
- mes "into";
- mes "shield items.";
- next;
- menu "O",X1_5,"X",-;
- set @score_test, @score_test + 10;
-
- X1_5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "'Katar'is exclusive use of Assassins.";
- next;
- menu "O",-, "X",X1_6;
-
- set @score_test, @score_test + 10;
-
- X1_6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th questino.";
- mes "'Emperium' is a material for";
- mes "refining.";
- next;
- menu "O",X1_7,"X",-;
- set @score_test, @score_test + 10;
-
- X1_7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Payon' is a village of bandits.";
- next;
- menu "O",X1_8,"X",-;
- set @score_test, @score_test + 10;
-
- X1_8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "'Prontera' is the only place where";
- mes "to class change into 'Swordman'.";
- next;
- menu "O",X1_9,"X",-;
- set @score_test, @score_test + 10;
-
- X1_9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "The last question.";
- mes "A monster 'Merman' is a human type.";
- next;
- menu "O",-, "X",X0;
-
- set @score_test, @score_test + 10;
-
- goto X0;
-
- } else if (@test_soonsu == 2){
-
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
- next;
- menu "O",-, "X",X2_1;
-
- set @score_test, @score_test + 10;
-
- X2_1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "The cloesest village from Pyramid Dugeon is 'Morroc'.";
- next;
- menu "O",-, "X",X2_2;
-
- set @score_test, @score_test + 10;
-
- X2_2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "A merchant association is located in 'Al De Baran'.";
- next;
- menu "O",X2_3,"X",-;
- set @score_test, @score_test + 10;
-
- X2_3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "Acolyte can";
- mes "class change to";
- mes "'Sage' and 'Priest'.";
- next;
- menu "O",X2_4,"X",-;
- set @score_test, @score_test + 10;
-
- X2_4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "When reached base level 10";
- mes "can be class changed to 1st job10.";
- next;
- menu "O",X2_5,"X",-;
- set @score_test, @score_test + 10;
-
- X2_5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "'Bowling Bash' can not be activated";
- mes "without equip";
- mes "'Two handed sword'.";
- next;
- menu "O",X2_6,"X",-;
- set @score_test, @score_test + 10;
-
- X2_6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th question.";
- mes "When Priest uses 'Signum Crusis'";
- mes "all monsters' defense will decrease";
- mes "in regular probability.";
- next;
- menu "O",X2_7,"X",-;
- set @score_test, @score_test + 10;
-
- X2_7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Wizard' will use a Blue gemstone";
- mes "when casts 'Fire Pillar'.";
- next;
- menu "O",-, "X",X2_8;
-
- set @score_test, @score_test + 10;
-
- X2_8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "A name of Assassin's exclusive weapon'";
- mes "'Katar' that gives";
- mes "additional 50% damage to human type";
- mes "is 'Infiltrator'.";
- next;
- menu "O",X2_9,"X",-;
- set @score_test, @score_test + 10;
-
- X2_9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "10th question.";
- mes "'Fire' is the most effective";
- mes "property against to 'water'.";
- next;
- menu "O",X0,"X",-;
- set @score_test, @score_test + 10;
-
-
- X0:
- mes "^2f4f4f[Tsuji]^000000";
- mes "Well done~";
- mes "You have solved all the 10 questions.";
- mes "Let me check";
- mes "how many you got?";
- mes "^ff0000If you don't get a perfect score, you have to re-test~^000000";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Wait a moment please.";
- mes "Grading.";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Hum . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "OK, finished grading.";
- mes "I will tell your score.";
- next;
- if (@score_test > 99) {
- mes "^2f4f4f[Tsuji]^000000";
- mes "Your score is ^2f4f4f" + @score_test + "^000000!";
- mes "You have";
- mes "qualified to participate in";
- mes "Quiz Revolution.";
- mes "You have cleared the 1st test!";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "This is a reward";
- mes "from us.";
- mes "Please accept it.";
- set quiz_rvl,2;
- getitem 501,10; //Red_Potion
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Now, the 2nd test is";
- mes "ready.";
- mes "Go to 'Payon' and meet";
- mes "'Seeil'.";
- mes "You can get the 2nd test";
- mes "from him.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "You have no business with me";
- mes "Have a good day.";
- close;
- }
- } else {
- set quiz_rvl,1;
- mes "^2f4f4f[Tsuji]^000000";
- mes "You score is ^2f4f4f" + @score_test + "^000000.";
- mes "You did not get a perfect score.";
- mes "I do not tell you";
- mes "where you got wrong.";
- mes "You have to take the test again.";
- close;
- }
-
- sM1_No:
- mes "^2f4f4f[Tsuji]^000000";
- mes "Oh, really?";
- mes "Well, it's up to you.";
- mes "Too bad.";
- mes "If you change your mind,";
- mes "let me know.";
- close;
-
-
-} else if (quiz_rvl == 0) && (BaseLevel > 19) {
-
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "Hello";
- mes "This is Tsuji who is in charge of";
- mes "receiving application forms for";
- mes "Quiz Revolution event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Zonda corporation has prepared";
- mes "^0000ffQuiz Revolution^000000 event to";
- mes "provide fun and excitement";
- mes "to all of you.";
- mes "Please read the following explanation and";
- mes "participate in this event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "This Quiz Revolution event is..";
- mes "operated in a different way compared to the previous one.";
- mes "The event will only be open for those who wish to participate in the game.";
- mes "Also, the ^006400Quiz Tickets^000000 will be given to those who";
- mes "pass simple tests to check if the player is worthy of";
- mes "playing the game.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "The assessment will be made through";
- mes "^006400four simple tests^000000";
- mes "For the ones who pass all four tests";
- mes "will receive the quiz ticket of the";
- mes "Quiz Revolution event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "There is a saying,";
- mes "^dc143c'No pain no gain!'^000000";
- mes "Hmm.. I don't think I know exactly what it means.";
- mes "Anyway, I hope you pass all the tests";
- mes "and receive the quiz ticket";
- mes "required for the Quiz Revolution event.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "So~ Will you now take the";
- mes "four test to attain the quiz ticket for";
- mes "the Quiz Revolution event?";
- next;
- menu "Yes",-,"No",sM2_No;
-
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "Good.";
- mes "The first one is the ^191970'knowledge test'^000000.";
- mes "I give out the questions and the player has to choose";
- mes "an answer using O and X.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "For your information, the player must get ^dc143ceverything right^000000, ";
- mes "to become eligible for the quiz event";
- mes "so please take your time solving questions.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "I wish many players participate";
- mes "Quiz Revolution event.";
- mes "I will try to give out easy";
- mes "questions. Muhaha!";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Then let us start.";
- mes "Read the question carefully and choose";
- mes "the right answer.";
- set @test_soonsu, rand(2);
- set @score_test, 0;
- next;
-
-
- if (@test_soonsu == 0) {
- mes "^2f4f4f[Tsuji]^000000";
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
- next;
- menu "O",-, "X",X3_1;
-
- set @score_test, @score_test + 10;
-
- X3_1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "Ragnarok's monetary unit is 'Zeny'.";
- next;
- menu "O",-, "X",X3_2;
-
- set @score_test, @score_test + 10;
-
- X3_2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "If an unknown person is attacking a monster";
- mes "you have to attack the same monster together.";
- next;
- menu "O",X3_3, "X",-;
-
- set @score_test, @score_test + 10;
-
- X3_3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "'Payon' is the capital of 'Rune Midgarts'.";
- next;
- menu "O",-, "X",X3_4;
-
- set @score_test, @score_test + 10;
-
- X3_4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "There are ships in 'Alberta'.";
- next;
- menu "O",-, "X",X3_5;
-
- set @score_test, @score_test + 10;
-
- X3_5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "A job class that can use";
- mes "'Grand Cross' is";
- mes "'Lord Knight'.";
- next;
- menu "O",X3_6, "X",-;
-
- set @score_test, @score_test + 10;
-
- X3_6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th question.";
- mes "When 'Bard' screams, the oppenet can be 'sturn status'";
- mes "in regular probability.";
- next;
- menu "O",X3_7, "X",-;
-
- set @score_test, @score_test + 10;
-
- X3_7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Baphomet'is a tool";
- mes "for killing mosquitos.";
- next;
- menu "O",X3_8, "X",-;
-
- set @score_test, @score_test + 10;
-
- X3_8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "'Swordman' can class change to";
- mes "'Ambernite'.";
- next;
- menu "O",X3_9, "X",-;
-
- set @score_test, @score_test + 10;
-
- X3_9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "The last question.";
- mes "A fine horse, which appears in North european Myth";
- mes "'Sleipnir' has five legs.";
- next;
- menu "O",Y0, "X",-;
-
- set @score_test, @score_test + 10;
-
- goto Y0;
-
-
- } else if (@test_soonsu == 1) {
-
- mes "^2f4f4f[Tsuji]^000000";
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
- next;
- menu "O",-, "X",X4_1;
-
- set @score_test, @score_test + 10;
-
- X4_1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "'Valkyrie' who appears in North european Myth";
- mes "is the godess of Love.";
- next;
- menu "O",X4_2, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "'Bethoven' composed the classic";
- mes "'Moon Light sonata'.";
- next;
- menu "O",-, "X",X4_3;
-
- set @score_test, @score_test + 10;
-
- X4_3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "Orcs that exsits in the world of Ragnarok";
- mes "are divided into 7 types.";
- next;
- menu "O",X4_4, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "'Cobolt Card' can be installed";
- mes "into";
- mes "shield items.";
- next;
- menu "O",X4_5, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "'Katar'is exclusive use of Assassins.";
- next;
- menu "O",-, "X",X4_6;
-
- set @score_test, @score_test + 10;
-
- X4_6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th questino.";
- mes "'Emperium' is a material for";
- mes "refining.";
- next;
- menu "O",X4_7, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Payon' is a village of bandits.";
- next;
- menu "O",X4_8, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "'Prontera' is the only place where";
- mes "to class change into 'Swordman'.";
- next;
- menu "O",X4_9, "X",-;
-
- set @score_test, @score_test + 10;
-
- X4_9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "The last question.";
- mes "A monster 'Merman' is a human type.";
- next;
- menu "O",-, "X",Y0;
-
- set @score_test, @score_test + 10;
-
- goto Y0;
-
- } else if (@test_soonsu == 2) {
-
-
- mes "1st question.";
- mes "Ragnarok is a MMORPG game.";
- mes "Please choose O and X.";
- next;
- menu "O",-, "X",X5_1;
-
- set @score_test, @score_test + 10;
-
- X5_1:
- mes "^2f4f4f[Tsuji]^000000";
- mes "2nd question.";
- mes "The cloesest village from Pyramid Dugeon is 'Morroc'.";
- next;
- menu "O",-, "X",X5_2;
-
- set @score_test, @score_test + 10;
-
- X5_2:
- mes "^2f4f4f[Tsuji]^000000";
- mes "3rd question.";
- mes "A merchant association is located in 'Al De Baran'.";
- next;
- menu "O",X5_3, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_3:
- mes "^2f4f4f[Tsuji]^000000";
- mes "4th question.";
- mes "Acolyte can";
- mes "class change to";
- mes "'Sage' and 'Priest'.";
- next;
- menu "O",X5_4, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_4:
- mes "^2f4f4f[Tsuji]^000000";
- mes "5th question.";
- mes "When reached base level 10";
- mes "can be class changed to 1st job10.";
- next;
- menu "O",X5_5, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_5:
- mes "^2f4f4f[Tsuji]^000000";
- mes "6th question.";
- mes "'Bowling Bash' can not be activated";
- mes "without equip";
- mes "'Two handed sword'.";
- next;
- menu "O",X5_6, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_6:
- mes "^2f4f4f[Tsuji]^000000";
- mes "7th question.";
- mes "When Priest uses 'Signum Crusis'";
- mes "all monsters' defense will decrease";
- mes "in regular probability.";
- next;
- menu "O",X5_7, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_7:
- mes "^2f4f4f[Tsuji]^000000";
- mes "8th question.";
- mes "'Wizard' will use a Blue gemstone";
- mes "when casts 'Fire Pillar'.";
- next;
- menu "O",-, "X",X5_8;
-
- set @score_test, @score_test + 10;
-
- X5_8:
- mes "^2f4f4f[Tsuji]^000000";
- mes "9th question.";
- mes "A name of Assassin's exclusive weapon'";
- mes "'Katar' that gives";
- mes "additional 50% damage to human type";
- mes "is 'Infiltrator'.";
- next;
- menu "O",X5_9, "X",-;
-
- set @score_test, @score_test + 10;
-
- X5_9:
- mes "^2f4f4f[Tsuji]^000000";
- mes "10th question.";
- mes "'Fire' is the most effective";
- mes "property against to 'water'.";
- next;
- menu "O",Y0, "X",-;
-
- set @score_test, @score_test + 10;
-
-
-
- Y0:
- mes "^2f4f4f[Tsuji]^000000";
- mes "Well done~";
- mes "You have solved all the 10 questions.";
- mes "Let me check";
- mes "how many you got?";
- mes "^ff0000If you don't get a perfect score, you have to re-test~^000000";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Wait a moment please.";
- mes "Grading.";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Hum . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "OK, finished grading.";
- mes "I will tell your score.";
- next;
- if (@score_test > 99) {
- mes "^2f4f4f[Tsuji]^000000";
- mes "Your score is ^2f4f4f" + @score_test + "^000000!";
- mes "You have";
- mes "qualified to participate in";
- mes "Quiz Revolution.";
- mes "You have cleared the 1st test!";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "This is a reward";
- mes "from us.";
- mes "Please accept it.";
- set quiz_rvl,2;
- getitem 501,10; //Red_Potion
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "Now, the 2nd test is";
- mes "ready.";
- mes "Go to 'Payon' and meet";
- mes "'Seeil'.";
- mes "You can get the 2nd test";
- mes "from him.";
- next;
- mes "^2f4f4f[Tsuji]^000000";
- mes "You have no business with me";
- mes "Have a good day.";
- close;
- } else {
- set quiz_rvl,1;
- mes "^2f4f4f[Tsuji]^000000";
- mes "You score is ^2f4f4f" + @score_test + "^000000.";
- mes "You did not get a perfect score.";
- mes "I do not tell you";
- mes "where you got wrong.";
- mes "You have to take the test again.";
- close;
- }
-
-
- sM2_No:
- mes "^2f4f4f[Tsuji]^000000";
- mes "Oh, really?";
- mes "Well, it's up to you.";
- mes "Too bad.";
- mes "If you change your mind,";
- mes "let me know.";
- close;
- }
-}
-M_MaxItem:
- mes "^2f4f4f[Tsuji]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-
-L_OverWeight:
- mes "^2f4f4f[Tsuji]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-}
-
-//======================================payon=================================
-payon.gat,85,133,4 duplicate(RecepQuiz) Receptionist#2 755
-//======================================geffen================================
-geffen.gat,111,104,4 duplicate(RecepQuiz) Receptionist#3 755
-//====================================morocc==================================
-morocc.gat,148,272,5 duplicate(RecepQuiz) Receptionist#4 755
-//=============================Alberta========================================
-alberta.gat,29,241,4 duplicate(RecepQuiz) Receptionist#5 755
-//============================================================================
-
-//===================Quiz Revolution 2nd quest collecting job items==================
-payon.gat,111,117,3 script Seeil 89,{
-if (countitem(1201) > 3) goto M_MaxItem;
-if (checkweight(1201,3) == 0 ) goto L_OverWeight;
-
- if (quiz_rvl > 13) {
- mes "[Seeil]";
- mes "How was the last test? I hope you do this";
- mes "one well.";
- close;
- } else if (quiz_rvl == 13) {
- mes "[Seeil]";
- mes "Since you have cleared the conditions to receive the";
- mes "last test, please go and visit Radeng in Prontera.";
- mes "During that time, I will transfer";
- mes "will transfer all";
- mes "your data.";
- next;
- mes "[Seeil]";
- mes "So this is the last one. Show me some spirit!";
- mes "This is a present to encourage you! Take it!";
- set quiz_rvl,14;
- getitem 503,10; //Yellow_Potion
- close;
-
- } else if (quiz_rvl > 6) && (quiz_rvl < 13) {
- mes "[Seeil]";
- mes "Eh? You didn't finish the marathon test and";
- mes "came out in the middle of the test.";
- mes "Oh my.. I don't know how you came out, but";
- mes "this can't be like this. I will send you";
- mes "once again!";
- close2;
- set quiz_rvl,6;
- warp "quiz_test.gat",385,388;
- end;
-
- } else if (quiz_rvl == 6) {
- mes "[Seeil]";
- mes "Ho.. You are fast. Well...";
- mes "All the preparations have been made so I can send";
- mes "you to the next stage. This will test your patience";
- mes "and endurance. It will not be require to use your brain";
- mes "this time. All you have to do is.. just run.";
- next;
- mes "[Seeil]";
- mes "You can't come back from there until";
- mes "you finish. Are you ready?";
- mes "Will you take the third test";
- mes "now?";
- next;
- menu "Take the test",-,"Refuse to take the test",M2_S;
-
- mes "[Seeil]";
- mes "Okay! I hope you do well and";
- mes "pass the test.";
- mes "Go for it!";
- close2;
- warp "quiz_test.gat",385,388;
- end;
-
- M2_S:
- mes "[Seeil]";
- mes "Oh my gosh, you are not ready";
- mes "yet. I don't have any intention to";
- mes "force you so whenever you are ready";
- mes "please come back to me. Ha ha ha.";
- close;
-
-
- } else if (quiz_rvl == 3) {
- if (countitem(902) > 39) && (countitem(908) > 39) && (countitem(909) > 39) {
- mes "[Seeil]";
- mes "Wow. You have collected the requested items.";
- mes "So I will keep my promise. Before that";
- mes "this is a present for you.. Please";
- mes "take it.";
- delitem 902,40;
- delitem 908,40;
- delitem 909,40;
- set quiz_rvl,6;
- getitem 502,10; //Orange_Potion
- next;
- mes "[Seeil]";
- mes "Then come back after a while and talk to me.";
- mes "I need to prepare somethings for the third test";
- mes "so... please go and do something";
- mes "to kill some time.";
- close;
- }
-
- mes "[Seeil]";
- mes "You are under a test which you are required to bring";
- mes "^FF0000Tree Root^000000, ^FF0000Spawn^000000,";
- mes "^FF0000Jellopy^000000, 40ea each.";
- mes "Go for it!";
- close;
-
- } else if (quiz_rvl == 4) {
- if (countitem(905) > 39) && (countitem(920) > 39) && (countitem(909) > 39) {
- mes "[Seeil]";
- mes "Ho. You have collected the required items.";
- mes "I will keep my promise too. Before that";
- mes "this is a present for you. Please";
- mes "take it.";
- delitem 905,40;
- delitem 920,40;
- delitem 909,40;
- set quiz_rvl,6;
- getitem 502,10; //Orange_Potion
- next;
- mes "[Seeil]";
- mes "Then come back to me after a while.";
- mes "I have somethings to prepare so";
- mes "please go and do somethings to kill";
- mes "time.";
- close;
- }
-
- mes "[Seeil]";
- mes "You are under a test which you are required to bring";
- mes "^FF0000Stem^000000, ^FF0000Claw of Wolves^000000, ^FF0000Jellopy^000000";
- mes "40 ea each.";
- mes "Go for it.";
- close;
-
- } else if (quiz_rvl == 5) {
- if (countitem(940) > 39) && (countitem(916) > 39) && (countitem(909) > 39) {
-
- mes "[Seeil]";
- mes "Ho. You have collected the required items.";
- mes "I will keep my promise too. Before that";
- mes "this is a present for you. Please";
- mes "take it.";
- delitem 940,40;
- delitem 916,40;
- delitem 909,40;
- set quiz_rvl,6;
- getitem 502,10; //Orange_Potion
- next;
- mes "[Seeil]";
- mes "Then come back to me after a while.";
- mes "I have somethings to prepare so";
- mes "please go and do somethings to kill";
- mes "time.";
- close;
- }
-
- mes "[Seeil]";
- mes "You are under a test which you are required to bring";
- mes "^FF0000Grasshopper's Leg^000000, FF0000Feather of Birds^000000, ^FF0000Jellopy^000000";
- mes "40ea each.";
- mes "Go for it!";
- close;
-
-
- } else if (quiz_rvl == 2) {
-
- mes "[Seeil]";
- mes "Hmm? You are the one Tsuji sent?";
- mes "Your name is... " +strcharinfo(0)+ " Right? Okay...";
- mes "Confirmed. You look about the same as Tsuji";
- mes "described to me. Well, shall we start the";
- mes "test?";
- next;
- mes "[Seeil]";
- mes "It isn't that tough. All you have";
- mes "to do is bring specified items";
- mes "Life isn't that hard~";
- set @japtem,rand(2);
- next;
-
- if (@japtem == 0) {
- set quiz_rvl,3;
- mes "[Seeil]";
- mes "Bring ^FF0000Tree Root ^000000 40ea, ^FF0000Spawn";
- mes "^000000 40ea, and ^FF0000Jellopy^000000 40ea";
- mes "I told ya. It's is not so hard, is it?";
- mes "I would like to specify some items hard to find";
- mes "but seniors told me not ";
- mes "to do so~ Hehe.";
- next;
- mes "[Seeil]";
- mes "Well, bring it as soon as you can. This is";
- mes "an easy test, but there is a time limit.";
- mes "Sooner the better, that is what";
- mes "I mean~";
- close;
- }
-
- else if (@japtem == 1) {
- set quiz_rvl,4;
- mes "[Seeil]";
- mes "Bring ^FF0000Stem^000000 40ea, ^FF0000Wolf Claw^000000 40ea,";
- mes "and ^FF0000Jellopy^000000 40ea.";
- mes "I told ya. It's is not so hard, is it?";
- mes "I would like to specify some items hard to find";
- mes "but seniors told me not ";
- mes "to do so~ Hehe.";
- next;
- mes "[Seeil]";
- mes "Well, bring it as soon as you can. This is";
- mes "an easy test, but there is a time limit.";
- mes "Sooner the better, that is what";
- mes "I mean~";
- close;
- }
-
- else if (@japtem == 2) {
- set quiz_rvl,5;
- mes "[Seeil]";
- mes "^FF0000Grasshopper's Leg^000000 40ea, ^FF0000Feather of Birds^000000 40ea,";
- mes "and ^FF0000Jellopy^000000 40ea.";
- mes "I told ya. It's is not so hard, is it?";
- mes "I would like to specify some items hard to find";
- mes "but seniors told me not ";
- mes "to do so~ Hehe.";
- next;
- mes "[Seeil]";
- mes "Well, bring it as soon as you can. This is";
- mes "an easy test, but there is a time limit.";
- mes "Sooner the better, that is what";
- mes "I mean~";
- close;
- }
- } else {
-
- mes "[Seeil]";
- mes "Call me Seeil=Lanchest";
- mes "I am here to test the ones who";
- mes "wishes to join in the quiz event.";
- next;
- mes "[Seeil]";
- mes "I am in charge of second and third test";
- mes "so in order to get a test from me, you have to";
- mes "pass the first test which is given";
- mes "by Tsuji.";
- close;
-}
-M_MaxItem:
- mes "^800000[Seeil]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-
-L_OverWeight:
- mes "^800000[Seeil]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-}
-
-//=========================================================================================================================================================
-prontera.gat,116,266,5 script Receptionist 109,{
-
-if (countitem(1201) > 3) goto M_MaxItem;
-if (checkweight(1201,3) == 0 ) goto L_OverWeight;
-
-
-if(quiz_rvl == 18) {
-
- mes "^800000[Radeng]^000000";
- mes "^6b8e23" + strcharinfo(0)+ "^000000?";
- mes "'Go look for ^b8860b'Kantryl'^000000 ";
- mes "at Izlude.";
- close;
-
-
-
-} else if(quiz_rvl == 17) {
-
- if (countitem(955) > 19) && (countitem(913) > 19) && (countitem(729) > 0) {
-
- mes "^800000[Radeng]^000000";
- mes "Oh~";
- mes "You are here!";
- mes "Let me check whether";
- mes "you brought the right thing.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Yes,that's right.";
- mes "You brought the right thing.";
- mes "Please, wait a second and..";
- mes "I have to";
- mes "put you on the list.";
- next;
- mes "^800000[Radeng]^000000";
- mes "You are..^6b8e23" + strcharinfo(0)+ "^000000 ..right?";
- mes "Hm...";
- mes "Well done.";
- mes "And this is compensation for the";
- mes "ones who have passed the test.";
- next;
- mes "^800000[Radeng]^000000";
- mes "All you have to do is";
- mes "meeting ^b8860b'Kantryl'^000000";
- mes "at Izlude.";
- delitem 955,20;
- delitem 913,20;
- delitem 729,1;
- set quiz_rvl,18;
- getitem 504,10; //White_Potion
- next;
- mes "^800000[Radeng]^000000";
- mes "Goodbye~~.";
- close;
- }
- mes "^800000[Radeng]^000000";
- mes "Oh~~";
- mes "You are here!";
- mes "Let me check whether";
- mes "You brought the right thing.";
- next;
- mes "^800000[Radeng]^000000";
- mes "oh my....";
- next;
- mes "^800000[Radeng]^000000";
- mes "Seems like you didn't prepare";
- mes "what I asked you for.";
- mes "I'll tell you what items you have to bring.";
- mes "I'm not going to tell you again.";
- mes "So please remember.";
- next;
- mes "^800000[Radeng]^000000";
- mes "The items are";
- mes "^19197020 Warm peeling^000000";
- mes "^19197020Tooth of Bat^000000";
- mes "^1919701 Zircon^000000";
- close;
-
-
-
-
-
-
-} if(quiz_rvl == 16) {
- if (countitem(1055) > 29) && (countitem(940) > 29) && (countitem(948) > 29) && (countitem(730) > 0) {
- mes "^800000[Radeng]^000000";
- mes "Oh~~~";
- mes "You are here!";
- mes "Let me check whether ";
- mes "you brought the right thing.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Yes,that's right.";
- mes "You brought the right thing.";
- mes "Please, wait a second and..";
- mes "I have to";
- mes "put you on the list.";
- next;
- set quiz_rvl,18;
- getitem 504,10; //White_Potion
- delitem 1055,30;
- delitem 940,30;
- delitem 948,30;
- delitem 730,1;
- mes "^800000[Radeng]^000000";
- mes "You are..^6b8e23" + strcharinfo(0)+ "^000000..right?";
- mes "Hm...";
- mes "Well done.";
- mes "And this is compensation for the";
- mes "ones who have passed the test.";
- next;
- mes "^800000[Radeng]^000000";
- mes "All you have to do is";
- mes "meeting ^b8860b'Kantryl'^000000";
- mes "at Izlude.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Goodbye";
- close;
- }
- mes "^800000[Radeng]^000000";
- mes "Oh~~~";
- mes "You are here!";
- mes "Let me check whether";
- mes "you brought the right thing.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Oh my....";
- next;
- mes "^800000[Radeng]^000000";
- mes "Seems like you didn't prepare";
- mes "what I asked you for..";
- mes "I'll tell you what items you have to bring..";
- mes "I'm not going to tell you again.";
- mes "So please remember..";
- next;
- mes "^800000[Radeng]^000000";
- mes "^191970Earthwarm Peeling^000000 30";
- mes "^191970Grasshopper's Leg^000000 30";
- mes "^191970Bear's Footskin^000000 30";
- mes "^1919701carat Diamond^000000 1.";
- mes "Try hard.";
- close;
-
-
-
-
-
-} else if(quiz_rvl == 15) {
- mes "^800000[Radeng]^000000";
- mes "You are....";
- mes "the one who left before I tell you the score";
- mes "Aren't you?";
- mes "Can't tell you failed. So...";
- next;
- mes "If ^800000[Radeng]^000000";
- mes "^191970Earthwarm Peeling^000000 30";
- mes "^191970Grasshopper's Leg^000000 30";
- mes "^191970Bear's Footskin^000000 30";
- mes "^1919701carat Diamond^000000 1";
- mes "is prepared,";
- mes "You are pass.";
- set quiz_rvl,16;
- close;
-
-} else if(quiz_rvl == 14) {
- mes "^800000[Radeng]^000000";
- mes "Hello";
- mes "I'm 'Radeng'.";
- mes "I'm in charge of 4th test.";
- mes "You seem to have finished";
- mes "3rd test!";
- next;
- mes "^800000[Radeng]^000000";
- mes "Then,let's start 4th test.";
- mes "the last barrier of quiz revolution.";
- mes "First of all,";
- mes "I will briefly go over about the test.";
- next;
- mes "^800000[Radeng]^000000";
- mes "you have to do quiz and collect items";
- mes " ";
- mes "You have to answer 10 mulptiple choice questions";
- mes "and the amount of required items changes ";
- mes "depending on score you acheive.";
- mes " ";
- next;
- mes "^800000[Radeng]^000000";
- mes "First,";
- mes "If you clear all 10 questions";
- mes "you are pass with";
- mes "pretest of collecting items.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Second,";
- mes "If you score between 50~90";
- mes "required items are";
- mes "not so much.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Third,";
- mes "If you score between 0~40";
- mes "required items will be";
- mes "vast.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Well, this is all about";
- mes "4th test.";
- mes "Then, let's start!";
- next;
- menu "Yes",-,"No",M_No;
-
- mes "^800000[Radeng]^000000";
- mes "Well,now";
- mes "10 questions will be presented.";
- mes "Look carefully through ";
- mes "questions and";
- mes "choose the right answer.";
- next;
- mes "^800000[Radeng]^000000";
- mes "1st question.";
- mes "How many jobs";
- mes "are in the game?";
- set @score_test2, 0;
- next;
- menu "22",sM1_1,"28",sM1_1,"32",sM1_1,"34",-;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_1:
-
- mes "^800000[Radeng]^000000";
- mes "2nd question.";
- mes "The name of santa NPC";
- mes "which links christmas town";
- mes "'Lutie' and 'Aldebaran'?";
- next;
- menu "Warp Santa",sM1_2, "Link Santa",-, "Lutie Santa",sM1_2, "Hulk Santa",sM1_2;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_2:
- mes "^800000[Radeng]^000000";
- mes "3rd question.";
- mes "What job level at least you have to be";
- mes "to learn novice skill";
- mes "'Pretend dead'?";
- next;
- menu "Job level4",sM1_3,"Job level5",sM1_3,"Job level6",sM1_3,"Job level7",-;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_3:
- mes "^800000[Radeng]^000000";
- mes "4th question.";
- mes "Require items";
- mes "to raise Poring?";
- next;
- menu "Unripe Apple",-,"Rippen Apple",sM1_4, "Delicious looking Apple",sM1_4, "Apple",sM1_4;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_4:
- mes "^800000[Radeng]^000000";
- mes "5th question";
- mes "What doll can you buy";
- mes "from NPC?";
- next;
- menu "Doll",-,"Baphomet Doll",sM1_5,"Yoyo Doll",sM1_5,"Rocker Doll",sM1_5;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_5:
- mes "^800000[Radeng]^000000";
- mes "6th question.";
- mes "Name of monster which drop";
- mes "'Big Ribbon'?";
- next;
- menu "Eclipse",sM1_6,"Dragon Fly",sM1_6,"Vocal",sM1_6,"Toad,",-;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_6:
- mes "^800000[Radeng]^000000";
- mes "Choose the monster that has smiliar size and form of";
- mes "Pring.";
- next;
- menu "Pupa",sM1_7,"Fabre",sM1_7,"Wander Man",-,"Golem",sM1_7;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_7:
- mes "^800000[Radeng]^000000";
- mes "8th question.";
- mes "When can Green Herb work";
- mes "it's efficacy?";
- next;
- menu "Silence",sM1_8,"Sleep",sM1_8,"Poison",-,"Chaos",sM1_8;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_8:
- mes "^800000[Radeng]^000000";
- mes "9th question.";
- mes "Which weapon gives biggest damages";
- mes "to small sized monsters?";
- next;
- menu "Dagger",-,"Two hand Sword",sM1_9,"Katar",sM1_9,"One hand Sword",sM1_9;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_9:
- mes "^800000[Radeng]^000000";
- mes "Last question!!";
- mes "What is not neccesary when learnig";
- mes "First-aid treatment?";
- next;
- menu "Clover",sM1_0,"Red Herb",sM1_0,"Novice Nametag",-,"Sterilized Bandages",sM1_0;
-
- set @score_test2, @score_test2 + 10;
-
- sM1_0:
- mes "^800000[Radeng]^000000";
- mes "You finished answering all questions.";
- mes "Wonder what your score is.";
- mes "10points for 1 question.";
- mes "Please wait a second.";
- next;
- mes "^800000[Radeng]^000000";
- mes "Please, wait a second and..";
- mes "Grading.";
- mes ". . . . . . . . . . . . . . .";
- mes ". . . . . . . . . . . . . . .";
- next;
- mes "^800000[Radeng]^000000";
- mes "OK.";
- mes "Your score is" + strcharinfo(0)+ "";
- mes "" + @score_test2 + "!" ;
- set quiz_rvl,15;
- next;
- if (@score_test2 > 40) && (@score_test2 < 90)goto L_Passed;
- if (@score_test2 >= 90)goto L_Perfect;
- mes "^800000[Radeng]^000000";
- mes "Your score is too low.";
- mes "Like as I told you before,";
- mes "you have to bring a lot of";
- mes "items to pass the test.";
- mes " ";
- next;
- mes "^800000[Radeng]^000000";
- mes "Required items are";
- mes "^191970Earthworm Peeling^000000 30";
- mes "^191970Grasshopper's Leg^000000 30";
- mes "^191970Bear's Footskin^000000 30";
- mes "^1919701Carat Diamond^000000 1";
- mes "";
- next;
- mes "^800000[Radeng]^000000";
- mes "I'm sorry.";
- mes "If you have scored just a little bit higher..";
- mes ".........";
- mes "Then,go look for items..";
- set quiz_rvl,16;
- close;
-
- L_Passed:
-
- mes "^800000[Radeng]^000000";
- mes "You did fine. ";
- mes "But as I told you before";
- mes "you need to bring";
- mes "some more items.";
- mes " ";
- next;
- mes "^800000[Radeng]^000000";
- mes "Required items are";
- mes "^191970Worm Peeling^000000 20";
- mes "^191970Tooth of Bat^000000 20";
- mes "^191970Zircon^000000 1.";
- next;
- mes "^800000[Radeng]^000000";
- mes "I'm sorry~";
- mes "If you have scored just a little bit higher..";
- mes "you could have passed.";
- mes "(KeKeke)";
- mes "Then,go look for items..";
- set quiz_rvl,17;
- close;
-
- L_Perfect:
- mes "^800000[Radeng]^000000";
- mes "Wow!You got it all right!.";
- mes "Fantastic!!!!";
- mes "For those of who ";
- mes "got all right need no assignment";
- mes " ";
- next;
- mes "^800000[Radeng]^000000";
- mes "" + strcharinfo(0)+ "";
- mes "Have passed all tests.";
- mes "Congratulations";
- mes "And this is your compensation ";
- mes "";
- set quiz_rvl,18;
- getitem 504,10; //White_Potion
- next;
- mes "^800000[Radeng]^000000";
- mes "Now, go look for";
- mes "^b8860b'Kantryl'^000000.";
- mes "at Izlude.";
- close;
-
-
- M_No:
- mes "^800000[Radeng]^000000";
- mes "Come back if you change your mind.";
- close;
-} else {
- mes "^800000[Radeng]^000000";
- mes "Hello~~~";
- mes "Please join at comming";
- mes "Quiz Revolution~";
- mes "Register will be made";
- mes "by receptionist in every town.";
- close;
-}
-M_MaxItem:
- mes "^800000[Radeng]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-
-L_OverWeight:
- mes "^800000[Radeng]^000000";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-}
-
-//=======================================================================================================================================================
-izlude.gat,106,220,5 script Kantryl 98,{
-
-if (countitem(1201) > 3) goto M_MaxItem;
-if (checkweight(1201,3) == 0 ) goto L_OverWeight;
-
-
-if(quiz_rvl == 20) {
- mes "[Kantryl]";
- mes "I see that you have already givin me a";
- mes "notice of absence...";
- mes "Well, but I can't give you entry ticket.";
- mes "who Knows~~";
- mes "Wait untill quiz starts";
- mes "You may catch a fortune.";
- close;
-
-}else if(quiz_rvl == 19) {
- mes "[Kantryl]";
- mes "You have already received an entry ticket.";
- mes "It's impossible getting";
- mes "another one.";
- next;
- mes "[Kantryl]";
- mes "For reference, number of particapants are";
- next;
- mes "[Kantryl]";
- mes "1st Quiz Revolution - " + quiz1 + "/200";
- mes "2nd Quiz Revolution - " + quiz2 + "/200";
- mes "3rd Quiz Revolution - " + quiz3 + "/200";
- mes "4th Quiz Revolution - " + quiz4 + "/200";
- mes "5th Quiz Revolution - " + quiz5 + "/200";
- mes "keep it in your mind.";
- close;
-
-
-} else if(quiz_rvl == 18) {
-
- mes "[Kantryl]";
- mes "You are " + strcharinfo(0)+ ".";
- mes "Who finished the test.right?";
- mes "Would you please make a decision ";
- mes "whether you will join or not join the";
- mes "Quiz Revolution.";
- next;
- mes "[Kantryl]";
- mes "Would you like to join?";
- mes "If you say yes, you can register at";
- mes "Quiz Revolution";
- mes "If you choose ^FF0000'NO,I won't join'^000000";
- mes " then ^FF0000'You can't join'^000000";
- mes "Please make a right decision.";
- next;
- mes "[Kantryl]";
- mes "If you haven't made up your mind,";
- mes "say yes for now";
- mes "and can change later on.";
- mes "Take it easy.";
- next;
- menu "Join", -, "Not join.",NJ;
-
-
- mes "[Kantryl]";
- mes "Itis to 1~5 round";
- mes "first 200 have chance.";
- mes ""+ strcharinfo(0)+ ",when do you want to join?";
- mes "It is ^FF0000Impossible to cancel^000000";
- mes "So please make right decision.";
- next;
- mes "[Kantryl]";
- mes "1st Quiz Revolution - " + quiz1 + "/200";
- mes "2nd Quiz Revolution - " + quiz2 + "/200";
- mes "3rd Quiz Revolution - " + quiz3 + "/200";
- mes "4th Quiz Revolution - " + quiz4 + "/200";
- mes "5th Quiz Revolution - " + quiz5 + "/200";
- next;
- menu "Join 1st round",-,"Join 2nd round",s2nd,"Join 3rd round",s3nd,"Join 4th round",s4nd,"Join 5th round",s5nd;
-
- if(quiz1 > 199){
- mes "[Kantryl]";
- mes "I'm sorry. We are all full at";
- mes "1st round of quiz revolution";
- mes "No more applicants for 1st round.";
- close;
-
- }
- mes "[Kantryl]";
- mes "Hm..."+ strcharinfo(0)+" ";
- mes "I have received your application";
- mes "Try hard and study hard.";
- set quiz_rvl,19;
- set quiz1,quiz1 + 1;
- getitem 7280,1; //Quiz_Ticket01
- close;
-
-
-
-
- s2nd:
- if(quiz2 > 199){
- mes "[Kantryl]";
- mes "I'm sorry. We are all full at";
- mes "2nd round of quiz revolution";
- mes "No more applicants for 2nd round.";
- close;
- }
-
- mes "[Kantryl]";
- mes "Hm..."+ strcharinfo(0)+"";
- mes "I have received your application";
- mes "Try hard and study hard.";
- set quiz_rvl,19;
- set quiz2,quiz2 + 1;
- getitem 7281,1; //Quiz_Ticket02
- close;
-
-
-
- s3nd:
- if(quiz3 > 199){
- mes "[Kantryl]";
- mes "I'm sorry. We are all full at";
- mes "3rd round of quiz revolution.";
- mes "No more applicants for 3rd round.";
- close;
- }
-
-
- mes "[Kantryl]";
- mes "Hm..." + strcharinfo(0)+ "";
- mes "I have received your application.";
- mes "Try hard and study hard.";
- set quiz_rvl,19;
- set quiz3,quiz3 + 1;
- getitem 7282,1; //Quiz_Ticket03
- close;
-
-
-
-
- s4nd:
- if(quiz4 > 199){
- mes "[Kantryl]";
- mes "I'm sorry. We are all full at";
- mes "4th round of quiz revolution.";
- mes "No more applicants for 4th round..";
- close;
- }
-
- mes "[Kantryl]";
- mes "Hm..." + strcharinfo(0)+ "";
- mes "I have received your application.";
- mes "Try hard and study hard.";
- set quiz_rvl,19;
- set quiz4,quiz4 + 1;
- getitem 7283,1; //Quiz_Ticket04
- close;
-
-
-
-
- s5nd:
- if(quiz5 > 199){
- mes "[Kantryl]";
- mes "I'm sorry. We are all full at";
- mes "5th round of quiz revolution.";
- mes "No more applicants for 5th round..";
- close;
- }
-
- mes "[Kantryl]";
- mes "Hm..." + strcharinfo(0)+ "";
- mes "I have received your application.";
- mes "Try hard and study hard.";
- set quiz_rvl,19;
- set quiz5,quiz5 + 1;
- getitem 7284,1; //Quiz_Ticket05
- close;
-
-
-
-
- NJ:
- mes "[Kantryl]";
- mes "Ok,if that's how you think.";
- mes "Choice is on you";
- mes "Good job any way.";
- set quiz_rvl,20;
- next;
- mes "[Kantryl]";
- mes "Actually,we have plan to";
- mes "allowed for those of who didn't ";
- mes "apply previously unless they have an entry ticket.";
- mes "If you have any chance to get an entry ticket,";
- mes "you are always welcome.";
- next;
- mes "[Kantryl]";
- mes "Go ask for the ones";
- mes "who changed their mind.";
- mes "If you are lucky,";
- mes "you'll get the chance.";
- close;
-} else {
- mes "[Kantryl]";
- mes "Hello~";
- mes "I'm Kantryl=Ranegalf.";
- mes "I help the ones who have passsed the test";
- mes "to take a formal step.";
- next;
- mes "[Kantryl]";
- mes "It is impossible to accept";
- mes "applications from those of who didn't";
- mes "finish the test.";
- mes "Go look for our staff in every";
- mes "Midgarts";
- mes "and take a test.";
- next;
- mes "[Kantryl]";
- mes "At that time, I'll gladly";
- mes "welcome you and accept the application.";
- close;
-}
-M_MaxItem:
- mes "[Kantryl]";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-
-L_OverWeight:
- mes "[Kantryl]";
- mes "- Wait a minute !! -";
- mes "- You currently have too many items that -";
- mes "- you can't receive an item. -";
- mes "- Please loose some weight -";
- mes "- and try again. -";
- close;
-}
-
-//============================================================================================================================
-quiz_test.gat,387,350,4 script "From somewhere::race_monk 45,2,2,{
-OnTouch:
-
- if (quiz_rvl == 6) {
- set quiz_rvl,7;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 7) {
- set quiz_rvl,8;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 8) {
- set quiz_rvl,9;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 9) {
- set quiz_rvl,10;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 10) {
- announce "You are almost there. Show me your spirit.",bc_blue|bc_map;
- set quiz_rvl,11;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 11) {
- set quiz_rvl,12;
- warp "quiz_test.gat",385,388;
- end;
- }else if (quiz_rvl == 12) {
- mes "[Seeil]";
- mes "You have worked hard and finished.";
- mes "It wasn't that hard as you thought, huh?";
- mes "All you have to do is run in circle... Well,";
- mes "come in front of me.";
- announce "Congratulations! " +strcharinfo(0)+ ", you have passed the test!",bc_blue|bc_map;
- close2;
- set quiz_rvl,13;
- warp "payon.gat",109,115;
- end;
- }
-
-}
-//=============================hiddenwarp=================================================================
-
-//-----------------------------1111-----------------------------------------------------------------------
-quiz_test.gat,82,384,4 script Pit::ham_quiz#1-1 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,83,384,4 script Pit::ham_quiz#1-2 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,82,385,4 script Pit::ham_quiz#1-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,83,385,4 script Pit::ham_quiz#1-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//-----------------------------2222-----------------------------------------------------------------------
-quiz_test.gat,38,388,4 script Pit::ham_quiz#2-1 -1,0,1,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,39,388,4 script Pit::ham_quiz#2-2 -1,0,1,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,38,386,4 script Pit::ham_quiz#2-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,39,386,4 script Pit::ham_quiz#2-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//-----------------------------3333-----------------------------------------------------------------------
-quiz_test.gat,11,158,4 script Pit::ham_quiz#3-1 -1,1,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,11,159,4 script Pit::ham_quiz#3-2 -1,1,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,13,159,4 script Pit::ham_quiz#3-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,13,158,4 script Pit::ham_quiz#3-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//-----------------------------4444-----------------------------------------------------------------------
-quiz_test.gat,11,30,4 script Pit::ham_quiz#4-1 -1,3,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,11,31,4 script Pit::ham_quiz#4-2 -1,3,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,15,30,4 script Pit::ham_quiz#4-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,15,30,4 script Pit::ham_quiz#4-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//-----------------------------5555-----------------------------------------------------------------------
-quiz_test.gat,70,12,4 script Pit::ham_quiz#5-1 -1,0,1,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,71,12,4 script Pit::ham_quiz#5-2 -1,0,1,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,70,10,4 script Pit::ham_quiz#5-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,71,10,4 script Pit::ham_quiz#5-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//---------------------------6666-------------------------------------------------------------------------
-quiz_test.gat,186,11,4 script Pit::ham_quiz#6-1 -1,2,3,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,189,11,4 script Pit::ham_quiz#6-2 -1,0,3,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-//---------------------------7777-------------------------------------------------------------------------
-quiz_test.gat,387,43,4 script Pit::ham_quiz#7-1 -1,1,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,387,42,4 script Pit::ham_quiz#7-2 -1,1,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,389,43,4 script Pit::ham_quiz#7-3 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-quiz_test.gat,389,42,4 script Pit::ham_quiz#7-4 -1,0,0,{
-OnTouch:
- announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
- warp "quiz_test.gat",387,387;
- end;
-}
-
-//-------------------------------------------------------------------------------------------------------------
-// Comments
-// 0 = Didn't receive a quest from Tsuji
-// 1 = Failed Tsuji's quest
-// 2 = Pass Tsuji's quest and to 2nd round
-// 3 = Seeil's randomly collecting job item quest 1
-// 4 = Seeil's randomly collecting job item quest
-// 5 = Seeil's randomly collecting job item quest
-// 6 = Clear with collecting job item. start Marathon test
-// 7~12 =Checking Marathon quest occasionally.
-// 13 = Use after clearing Marathon quest
-// 14 = Clear 3rd quest, start Radeng(4th) quest
-// 15 = check after reporting errors of Radeng
-// 16 = randomly collecting job items at Radeng quest 1
-// 17 = randomly collecting job items at Radeng quest 2
-// 18 = Radeng quest clear. Possible time to apply. Begin Kantryl apply.
-// 19 = checked if you show intention to join
-// 20 = checked If you don't show intention to join
-// 21 = 3 items for the one who gets compansation
+//===== eAthena Script =======================================
+//= Quiz (Revolution) Part 1
+//===== By: ==================================================
+//= CAHTXHuK
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//=========================================================================================================================================
+prontera.gat,152,286,4 script Receptionist::RecepQuiz 755,{
+
+if (countitem(1201) > 3) goto M_MaxItem;
+if (checkweight(1201,3) == 0 ) goto L_OverWeight;
+
+
+if(BaseLevel < 20){
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Hello";
+ mes "This is Tsuji who is in charge of";
+ mes "receiving application forms for";
+ mes "Quiz Revolution event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Zonda corporation has prepared";
+ mes "^0000ffQuiz Revolution^000000 event to";
+ mes "provide fun and excitement";
+ mes "to all of you.";
+ mes "Please read the following explanation and";
+ mes "participate in this event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "This Quiz Revolution event is..";
+ mes "operated in a different way compared to the previous one.";
+ mes "The event will only be open for those who wish to participate in the game.";
+ mes "Also, the ^006400Quiz Tickets^000000 will be given to those who";
+ mes "pass simple tests to check if the player is worthy of";
+ mes "playing the game.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The assessment will be made through";
+ mes "^006400four simple tests^000000";
+ mes "For the ones who pass all four tests";
+ mes "will receive the quiz ticket of the";
+ mes "Quiz Revolution event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Hmm?! Wait a sec.";
+ mes "If you wish to join Quiz Revolution event";
+ mes "you should have base level";
+ mes "20 or above.";
+ mes "Please go and return after raising the";
+ mes "level to the expected point.";
+ close;
+
+} else if (quiz_rvl > 2) {
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The event for all of you!";
+ mes "Quiz Revolution is about to start.";
+ mes "Please show us a lot of";
+ mes "participation.";
+ mes "And don't forget to bring the admission ticket~~";
+ close;
+
+} else if (quiz_rvl == 2) {
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "You have already passed the first test.";
+ mes "Please visit 'Payon' and find";
+ mes "'Seeil'.";
+ mes "Seeil will give the second test.";
+ close;
+
+} else if (quiz_rvl == 1) {
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "^0000ff" +strcharinfo(0)+ "^000000.";
+ mes "You have to take the retest";
+ mes "to pass the test.";
+ mes "Will you accept it?";
+ next;
+ menu "Yes",-,"No",sM1_No;
+
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Very well.";
+ mes "I hope you pass the test this time..";
+ mes "Here are the questions.";
+ set @test_soonsu, rand(2);
+ set @score_test, 0;
+ next;
+
+ if (@test_soonsu == 0){
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+
+ next;
+ menu "O",-,"X",X1;
+
+ set @score_test, @score_test + 10;
+
+ X1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "Ragnarok's monetary unit is 'Zeny'.";
+ next;
+ menu "O",-,"X",X2;
+
+ set @score_test, @score_test + 10;
+
+ X2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "If an unknown person is attacking a monster";
+ mes "you have to attack the same monster together.";
+ next;
+ menu "O",X3,"X",-;
+
+ set @score_test, @score_test + 10;
+ X3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "'Payon' is the capital of 'Rune Midgarts'.";
+ next;
+ menu "O",X4,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "There are ships in 'Alberta'.";
+ next;
+ menu "O",-,"X",X5;
+
+ set @score_test, @score_test + 10;
+
+ X5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "A job class that can use";
+ mes "'Grand Cross' is";
+ mes "'Lord Knight'.";
+ next;
+ menu "O",X6,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ X6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th question.";
+ mes "When 'Bard' screams, the oppenet can be 'sturn status'";
+ mes "in regular probability.";
+ next;
+ menu "O",X7,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ X7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Baphomet'is a tool";
+ mes "for killing mosquitos.";
+ next;
+ menu "O",X8,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ X8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "'Swordman' can class change to";
+ mes "'Ambernite'.";
+ next;
+ menu "O",X9,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ X9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The last question.";
+ mes "A fine horse, which appears in North european Myth";
+ mes "'Sleipnir' has five legs.";
+ next;
+ menu "O",X0,"X",-;
+
+ set @score_test, @score_test + 10;
+
+ goto X0;
+
+
+ } else if (@test_soonsu == 1){
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+ next;
+ menu "O",-, "X",X1_1;
+
+ set @score_test, @score_test + 10;
+
+ X1_1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "'Valkyrie' who appears in North european Myth";
+ mes "is the godess of Love.";
+ next;
+ menu "O",X1_2,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "'Bethoven' composed the classic";
+ mes "'Moon Light sonata'.";
+ next;
+ menu "O",-, "X",X1_3;
+
+ set @score_test, @score_test + 10;
+
+ X1_3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "Orcs that exsits in the world of Ragnarok";
+ mes "are divided into 7 types.";
+ next;
+ menu "O",X1_4,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "'Cobolt Card' can be installed";
+ mes "into";
+ mes "shield items.";
+ next;
+ menu "O",X1_5,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "'Katar'is exclusive use of Assassins.";
+ next;
+ menu "O",-, "X",X1_6;
+
+ set @score_test, @score_test + 10;
+
+ X1_6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th questino.";
+ mes "'Emperium' is a material for";
+ mes "refining.";
+ next;
+ menu "O",X1_7,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Payon' is a village of bandits.";
+ next;
+ menu "O",X1_8,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "'Prontera' is the only place where";
+ mes "to class change into 'Swordman'.";
+ next;
+ menu "O",X1_9,"X",-;
+ set @score_test, @score_test + 10;
+
+ X1_9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The last question.";
+ mes "A monster 'Merman' is a human type.";
+ next;
+ menu "O",-, "X",X0;
+
+ set @score_test, @score_test + 10;
+
+ goto X0;
+
+ } else if (@test_soonsu == 2){
+
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+ next;
+ menu "O",-, "X",X2_1;
+
+ set @score_test, @score_test + 10;
+
+ X2_1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "The cloesest village from Pyramid Dugeon is 'Morroc'.";
+ next;
+ menu "O",-, "X",X2_2;
+
+ set @score_test, @score_test + 10;
+
+ X2_2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "A merchant association is located in 'Al De Baran'.";
+ next;
+ menu "O",X2_3,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "Acolyte can";
+ mes "class change to";
+ mes "'Sage' and 'Priest'.";
+ next;
+ menu "O",X2_4,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "When reached base level 10";
+ mes "can be class changed to 1st job10.";
+ next;
+ menu "O",X2_5,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "'Bowling Bash' can not be activated";
+ mes "without equip";
+ mes "'Two handed sword'.";
+ next;
+ menu "O",X2_6,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th question.";
+ mes "When Priest uses 'Signum Crusis'";
+ mes "all monsters' defense will decrease";
+ mes "in regular probability.";
+ next;
+ menu "O",X2_7,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Wizard' will use a Blue gemstone";
+ mes "when casts 'Fire Pillar'.";
+ next;
+ menu "O",-, "X",X2_8;
+
+ set @score_test, @score_test + 10;
+
+ X2_8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "A name of Assassin's exclusive weapon'";
+ mes "'Katar' that gives";
+ mes "additional 50% damage to human type";
+ mes "is 'Infiltrator'.";
+ next;
+ menu "O",X2_9,"X",-;
+ set @score_test, @score_test + 10;
+
+ X2_9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "10th question.";
+ mes "'Fire' is the most effective";
+ mes "property against to 'water'.";
+ next;
+ menu "O",X0,"X",-;
+ set @score_test, @score_test + 10;
+
+
+ X0:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Well done~";
+ mes "You have solved all the 10 questions.";
+ mes "Let me check";
+ mes "how many you got?";
+ mes "^ff0000If you don't get a perfect score, you have to re-test~^000000";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Wait a moment please.";
+ mes "Grading.";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Hum . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "OK, finished grading.";
+ mes "I will tell your score.";
+ next;
+ if (@score_test > 99) {
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Your score is ^2f4f4f" + @score_test + "^000000!";
+ mes "You have";
+ mes "qualified to participate in";
+ mes "Quiz Revolution.";
+ mes "You have cleared the 1st test!";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "This is a reward";
+ mes "from us.";
+ mes "Please accept it.";
+ set quiz_rvl,2;
+ getitem 501,10; //Red_Potion
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Now, the 2nd test is";
+ mes "ready.";
+ mes "Go to 'Payon' and meet";
+ mes "'Seeil'.";
+ mes "You can get the 2nd test";
+ mes "from him.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "You have no business with me";
+ mes "Have a good day.";
+ close;
+ }
+ } else {
+ set quiz_rvl,1;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "You score is ^2f4f4f" + @score_test + "^000000.";
+ mes "You did not get a perfect score.";
+ mes "I do not tell you";
+ mes "where you got wrong.";
+ mes "You have to take the test again.";
+ close;
+ }
+
+ sM1_No:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Oh, really?";
+ mes "Well, it's up to you.";
+ mes "Too bad.";
+ mes "If you change your mind,";
+ mes "let me know.";
+ close;
+
+
+} else if (quiz_rvl == 0) && (BaseLevel > 19) {
+
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Hello";
+ mes "This is Tsuji who is in charge of";
+ mes "receiving application forms for";
+ mes "Quiz Revolution event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Zonda corporation has prepared";
+ mes "^0000ffQuiz Revolution^000000 event to";
+ mes "provide fun and excitement";
+ mes "to all of you.";
+ mes "Please read the following explanation and";
+ mes "participate in this event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "This Quiz Revolution event is..";
+ mes "operated in a different way compared to the previous one.";
+ mes "The event will only be open for those who wish to participate in the game.";
+ mes "Also, the ^006400Quiz Tickets^000000 will be given to those who";
+ mes "pass simple tests to check if the player is worthy of";
+ mes "playing the game.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The assessment will be made through";
+ mes "^006400four simple tests^000000";
+ mes "For the ones who pass all four tests";
+ mes "will receive the quiz ticket of the";
+ mes "Quiz Revolution event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "There is a saying,";
+ mes "^dc143c'No pain no gain!'^000000";
+ mes "Hmm.. I don't think I know exactly what it means.";
+ mes "Anyway, I hope you pass all the tests";
+ mes "and receive the quiz ticket";
+ mes "required for the Quiz Revolution event.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "So~ Will you now take the";
+ mes "four test to attain the quiz ticket for";
+ mes "the Quiz Revolution event?";
+ next;
+ menu "Yes",-,"No",sM2_No;
+
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Good.";
+ mes "The first one is the ^191970'knowledge test'^000000.";
+ mes "I give out the questions and the player has to choose";
+ mes "an answer using O and X.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "For your information, the player must get ^dc143ceverything right^000000, ";
+ mes "to become eligible for the quiz event";
+ mes "so please take your time solving questions.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "I wish many players participate";
+ mes "Quiz Revolution event.";
+ mes "I will try to give out easy";
+ mes "questions. Muhaha!";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Then let us start.";
+ mes "Read the question carefully and choose";
+ mes "the right answer.";
+ set @test_soonsu, rand(2);
+ set @score_test, 0;
+ next;
+
+
+ if (@test_soonsu == 0) {
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+ next;
+ menu "O",-, "X",X3_1;
+
+ set @score_test, @score_test + 10;
+
+ X3_1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "Ragnarok's monetary unit is 'Zeny'.";
+ next;
+ menu "O",-, "X",X3_2;
+
+ set @score_test, @score_test + 10;
+
+ X3_2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "If an unknown person is attacking a monster";
+ mes "you have to attack the same monster together.";
+ next;
+ menu "O",X3_3, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X3_3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "'Payon' is the capital of 'Rune Midgarts'.";
+ next;
+ menu "O",-, "X",X3_4;
+
+ set @score_test, @score_test + 10;
+
+ X3_4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "There are ships in 'Alberta'.";
+ next;
+ menu "O",-, "X",X3_5;
+
+ set @score_test, @score_test + 10;
+
+ X3_5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "A job class that can use";
+ mes "'Grand Cross' is";
+ mes "'Lord Knight'.";
+ next;
+ menu "O",X3_6, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X3_6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th question.";
+ mes "When 'Bard' screams, the oppenet can be 'sturn status'";
+ mes "in regular probability.";
+ next;
+ menu "O",X3_7, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X3_7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Baphomet'is a tool";
+ mes "for killing mosquitos.";
+ next;
+ menu "O",X3_8, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X3_8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "'Swordman' can class change to";
+ mes "'Ambernite'.";
+ next;
+ menu "O",X3_9, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X3_9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The last question.";
+ mes "A fine horse, which appears in North european Myth";
+ mes "'Sleipnir' has five legs.";
+ next;
+ menu "O",Y0, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ goto Y0;
+
+
+ } else if (@test_soonsu == 1) {
+
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+ next;
+ menu "O",-, "X",X4_1;
+
+ set @score_test, @score_test + 10;
+
+ X4_1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "'Valkyrie' who appears in North european Myth";
+ mes "is the godess of Love.";
+ next;
+ menu "O",X4_2, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "'Bethoven' composed the classic";
+ mes "'Moon Light sonata'.";
+ next;
+ menu "O",-, "X",X4_3;
+
+ set @score_test, @score_test + 10;
+
+ X4_3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "Orcs that exsits in the world of Ragnarok";
+ mes "are divided into 7 types.";
+ next;
+ menu "O",X4_4, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "'Cobolt Card' can be installed";
+ mes "into";
+ mes "shield items.";
+ next;
+ menu "O",X4_5, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "'Katar'is exclusive use of Assassins.";
+ next;
+ menu "O",-, "X",X4_6;
+
+ set @score_test, @score_test + 10;
+
+ X4_6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th questino.";
+ mes "'Emperium' is a material for";
+ mes "refining.";
+ next;
+ menu "O",X4_7, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Payon' is a village of bandits.";
+ next;
+ menu "O",X4_8, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "'Prontera' is the only place where";
+ mes "to class change into 'Swordman'.";
+ next;
+ menu "O",X4_9, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X4_9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "The last question.";
+ mes "A monster 'Merman' is a human type.";
+ next;
+ menu "O",-, "X",Y0;
+
+ set @score_test, @score_test + 10;
+
+ goto Y0;
+
+ } else if (@test_soonsu == 2) {
+
+
+ mes "1st question.";
+ mes "Ragnarok is a MMORPG game.";
+ mes "Please choose O and X.";
+ next;
+ menu "O",-, "X",X5_1;
+
+ set @score_test, @score_test + 10;
+
+ X5_1:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "2nd question.";
+ mes "The cloesest village from Pyramid Dugeon is 'Morroc'.";
+ next;
+ menu "O",-, "X",X5_2;
+
+ set @score_test, @score_test + 10;
+
+ X5_2:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "3rd question.";
+ mes "A merchant association is located in 'Al De Baran'.";
+ next;
+ menu "O",X5_3, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_3:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "4th question.";
+ mes "Acolyte can";
+ mes "class change to";
+ mes "'Sage' and 'Priest'.";
+ next;
+ menu "O",X5_4, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_4:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "5th question.";
+ mes "When reached base level 10";
+ mes "can be class changed to 1st job10.";
+ next;
+ menu "O",X5_5, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_5:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "6th question.";
+ mes "'Bowling Bash' can not be activated";
+ mes "without equip";
+ mes "'Two handed sword'.";
+ next;
+ menu "O",X5_6, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_6:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "7th question.";
+ mes "When Priest uses 'Signum Crusis'";
+ mes "all monsters' defense will decrease";
+ mes "in regular probability.";
+ next;
+ menu "O",X5_7, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_7:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "8th question.";
+ mes "'Wizard' will use a Blue gemstone";
+ mes "when casts 'Fire Pillar'.";
+ next;
+ menu "O",-, "X",X5_8;
+
+ set @score_test, @score_test + 10;
+
+ X5_8:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "9th question.";
+ mes "A name of Assassin's exclusive weapon'";
+ mes "'Katar' that gives";
+ mes "additional 50% damage to human type";
+ mes "is 'Infiltrator'.";
+ next;
+ menu "O",X5_9, "X",-;
+
+ set @score_test, @score_test + 10;
+
+ X5_9:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "10th question.";
+ mes "'Fire' is the most effective";
+ mes "property against to 'water'.";
+ next;
+ menu "O",Y0, "X",-;
+
+ set @score_test, @score_test + 10;
+
+
+
+ Y0:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Well done~";
+ mes "You have solved all the 10 questions.";
+ mes "Let me check";
+ mes "how many you got?";
+ mes "^ff0000If you don't get a perfect score, you have to re-test~^000000";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Wait a moment please.";
+ mes "Grading.";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Hum . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "OK, finished grading.";
+ mes "I will tell your score.";
+ next;
+ if (@score_test > 99) {
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Your score is ^2f4f4f" + @score_test + "^000000!";
+ mes "You have";
+ mes "qualified to participate in";
+ mes "Quiz Revolution.";
+ mes "You have cleared the 1st test!";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "This is a reward";
+ mes "from us.";
+ mes "Please accept it.";
+ set quiz_rvl,2;
+ getitem 501,10; //Red_Potion
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Now, the 2nd test is";
+ mes "ready.";
+ mes "Go to 'Payon' and meet";
+ mes "'Seeil'.";
+ mes "You can get the 2nd test";
+ mes "from him.";
+ next;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "You have no business with me";
+ mes "Have a good day.";
+ close;
+ } else {
+ set quiz_rvl,1;
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "You score is ^2f4f4f" + @score_test + "^000000.";
+ mes "You did not get a perfect score.";
+ mes "I do not tell you";
+ mes "where you got wrong.";
+ mes "You have to take the test again.";
+ close;
+ }
+
+
+ sM2_No:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "Oh, really?";
+ mes "Well, it's up to you.";
+ mes "Too bad.";
+ mes "If you change your mind,";
+ mes "let me know.";
+ close;
+ }
+}
+M_MaxItem:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+
+L_OverWeight:
+ mes "^2f4f4f[Tsuji]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+}
+
+//======================================payon=================================
+payon.gat,85,133,4 duplicate(RecepQuiz) Receptionist#2 755
+//======================================geffen================================
+geffen.gat,111,104,4 duplicate(RecepQuiz) Receptionist#3 755
+//====================================morocc==================================
+morocc.gat,148,272,5 duplicate(RecepQuiz) Receptionist#4 755
+//=============================Alberta========================================
+alberta.gat,29,241,4 duplicate(RecepQuiz) Receptionist#5 755
+//============================================================================
+
+//===================Quiz Revolution 2nd quest collecting job items==================
+payon.gat,111,117,3 script Seeil 89,{
+if (countitem(1201) > 3) goto M_MaxItem;
+if (checkweight(1201,3) == 0 ) goto L_OverWeight;
+
+ if (quiz_rvl > 13) {
+ mes "[Seeil]";
+ mes "How was the last test? I hope you do this";
+ mes "one well.";
+ close;
+ } else if (quiz_rvl == 13) {
+ mes "[Seeil]";
+ mes "Since you have cleared the conditions to receive the";
+ mes "last test, please go and visit Radeng in Prontera.";
+ mes "During that time, I will transfer";
+ mes "will transfer all";
+ mes "your data.";
+ next;
+ mes "[Seeil]";
+ mes "So this is the last one. Show me some spirit!";
+ mes "This is a present to encourage you! Take it!";
+ set quiz_rvl,14;
+ getitem 503,10; //Yellow_Potion
+ close;
+
+ } else if (quiz_rvl > 6) && (quiz_rvl < 13) {
+ mes "[Seeil]";
+ mes "Eh? You didn't finish the marathon test and";
+ mes "came out in the middle of the test.";
+ mes "Oh my.. I don't know how you came out, but";
+ mes "this can't be like this. I will send you";
+ mes "once again!";
+ close2;
+ set quiz_rvl,6;
+ warp "quiz_test.gat",385,388;
+ end;
+
+ } else if (quiz_rvl == 6) {
+ mes "[Seeil]";
+ mes "Ho.. You are fast. Well...";
+ mes "All the preparations have been made so I can send";
+ mes "you to the next stage. This will test your patience";
+ mes "and endurance. It will not be require to use your brain";
+ mes "this time. All you have to do is.. just run.";
+ next;
+ mes "[Seeil]";
+ mes "You can't come back from there until";
+ mes "you finish. Are you ready?";
+ mes "Will you take the third test";
+ mes "now?";
+ next;
+ menu "Take the test",-,"Refuse to take the test",M2_S;
+
+ mes "[Seeil]";
+ mes "Okay! I hope you do well and";
+ mes "pass the test.";
+ mes "Go for it!";
+ close2;
+ warp "quiz_test.gat",385,388;
+ end;
+
+ M2_S:
+ mes "[Seeil]";
+ mes "Oh my gosh, you are not ready";
+ mes "yet. I don't have any intention to";
+ mes "force you so whenever you are ready";
+ mes "please come back to me. Ha ha ha.";
+ close;
+
+
+ } else if (quiz_rvl == 3) {
+ if (countitem(902) > 39) && (countitem(908) > 39) && (countitem(909) > 39) {
+ mes "[Seeil]";
+ mes "Wow. You have collected the requested items.";
+ mes "So I will keep my promise. Before that";
+ mes "this is a present for you.. Please";
+ mes "take it.";
+ delitem 902,40;
+ delitem 908,40;
+ delitem 909,40;
+ set quiz_rvl,6;
+ getitem 502,10; //Orange_Potion
+ next;
+ mes "[Seeil]";
+ mes "Then come back after a while and talk to me.";
+ mes "I need to prepare somethings for the third test";
+ mes "so... please go and do something";
+ mes "to kill some time.";
+ close;
+ }
+
+ mes "[Seeil]";
+ mes "You are under a test which you are required to bring";
+ mes "^FF0000Tree Root^000000, ^FF0000Spawn^000000,";
+ mes "^FF0000Jellopy^000000, 40ea each.";
+ mes "Go for it!";
+ close;
+
+ } else if (quiz_rvl == 4) {
+ if (countitem(905) > 39) && (countitem(920) > 39) && (countitem(909) > 39) {
+ mes "[Seeil]";
+ mes "Ho. You have collected the required items.";
+ mes "I will keep my promise too. Before that";
+ mes "this is a present for you. Please";
+ mes "take it.";
+ delitem 905,40;
+ delitem 920,40;
+ delitem 909,40;
+ set quiz_rvl,6;
+ getitem 502,10; //Orange_Potion
+ next;
+ mes "[Seeil]";
+ mes "Then come back to me after a while.";
+ mes "I have somethings to prepare so";
+ mes "please go and do somethings to kill";
+ mes "time.";
+ close;
+ }
+
+ mes "[Seeil]";
+ mes "You are under a test which you are required to bring";
+ mes "^FF0000Stem^000000, ^FF0000Claw of Wolves^000000, ^FF0000Jellopy^000000";
+ mes "40 ea each.";
+ mes "Go for it.";
+ close;
+
+ } else if (quiz_rvl == 5) {
+ if (countitem(940) > 39) && (countitem(916) > 39) && (countitem(909) > 39) {
+
+ mes "[Seeil]";
+ mes "Ho. You have collected the required items.";
+ mes "I will keep my promise too. Before that";
+ mes "this is a present for you. Please";
+ mes "take it.";
+ delitem 940,40;
+ delitem 916,40;
+ delitem 909,40;
+ set quiz_rvl,6;
+ getitem 502,10; //Orange_Potion
+ next;
+ mes "[Seeil]";
+ mes "Then come back to me after a while.";
+ mes "I have somethings to prepare so";
+ mes "please go and do somethings to kill";
+ mes "time.";
+ close;
+ }
+
+ mes "[Seeil]";
+ mes "You are under a test which you are required to bring";
+ mes "^FF0000Grasshopper's Leg^000000, FF0000Feather of Birds^000000, ^FF0000Jellopy^000000";
+ mes "40ea each.";
+ mes "Go for it!";
+ close;
+
+
+ } else if (quiz_rvl == 2) {
+
+ mes "[Seeil]";
+ mes "Hmm? You are the one Tsuji sent?";
+ mes "Your name is... " +strcharinfo(0)+ " Right? Okay...";
+ mes "Confirmed. You look about the same as Tsuji";
+ mes "described to me. Well, shall we start the";
+ mes "test?";
+ next;
+ mes "[Seeil]";
+ mes "It isn't that tough. All you have";
+ mes "to do is bring specified items";
+ mes "Life isn't that hard~";
+ set @japtem,rand(2);
+ next;
+
+ if (@japtem == 0) {
+ set quiz_rvl,3;
+ mes "[Seeil]";
+ mes "Bring ^FF0000Tree Root ^000000 40ea, ^FF0000Spawn";
+ mes "^000000 40ea, and ^FF0000Jellopy^000000 40ea";
+ mes "I told ya. It's is not so hard, is it?";
+ mes "I would like to specify some items hard to find";
+ mes "but seniors told me not ";
+ mes "to do so~ Hehe.";
+ next;
+ mes "[Seeil]";
+ mes "Well, bring it as soon as you can. This is";
+ mes "an easy test, but there is a time limit.";
+ mes "Sooner the better, that is what";
+ mes "I mean~";
+ close;
+ }
+
+ else if (@japtem == 1) {
+ set quiz_rvl,4;
+ mes "[Seeil]";
+ mes "Bring ^FF0000Stem^000000 40ea, ^FF0000Wolf Claw^000000 40ea,";
+ mes "and ^FF0000Jellopy^000000 40ea.";
+ mes "I told ya. It's is not so hard, is it?";
+ mes "I would like to specify some items hard to find";
+ mes "but seniors told me not ";
+ mes "to do so~ Hehe.";
+ next;
+ mes "[Seeil]";
+ mes "Well, bring it as soon as you can. This is";
+ mes "an easy test, but there is a time limit.";
+ mes "Sooner the better, that is what";
+ mes "I mean~";
+ close;
+ }
+
+ else if (@japtem == 2) {
+ set quiz_rvl,5;
+ mes "[Seeil]";
+ mes "^FF0000Grasshopper's Leg^000000 40ea, ^FF0000Feather of Birds^000000 40ea,";
+ mes "and ^FF0000Jellopy^000000 40ea.";
+ mes "I told ya. It's is not so hard, is it?";
+ mes "I would like to specify some items hard to find";
+ mes "but seniors told me not ";
+ mes "to do so~ Hehe.";
+ next;
+ mes "[Seeil]";
+ mes "Well, bring it as soon as you can. This is";
+ mes "an easy test, but there is a time limit.";
+ mes "Sooner the better, that is what";
+ mes "I mean~";
+ close;
+ }
+ } else {
+
+ mes "[Seeil]";
+ mes "Call me Seeil=Lanchest";
+ mes "I am here to test the ones who";
+ mes "wishes to join in the quiz event.";
+ next;
+ mes "[Seeil]";
+ mes "I am in charge of second and third test";
+ mes "so in order to get a test from me, you have to";
+ mes "pass the first test which is given";
+ mes "by Tsuji.";
+ close;
+}
+M_MaxItem:
+ mes "^800000[Seeil]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+
+L_OverWeight:
+ mes "^800000[Seeil]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+}
+
+//=========================================================================================================================================================
+prontera.gat,116,266,5 script Receptionist 109,{
+
+if (countitem(1201) > 3) goto M_MaxItem;
+if (checkweight(1201,3) == 0 ) goto L_OverWeight;
+
+
+if(quiz_rvl == 18) {
+
+ mes "^800000[Radeng]^000000";
+ mes "^6b8e23" + strcharinfo(0)+ "^000000?";
+ mes "'Go look for ^b8860b'Kantryl'^000000 ";
+ mes "at Izlude.";
+ close;
+
+
+
+} else if(quiz_rvl == 17) {
+
+ if (countitem(955) > 19) && (countitem(913) > 19) && (countitem(729) > 0) {
+
+ mes "^800000[Radeng]^000000";
+ mes "Oh~";
+ mes "You are here!";
+ mes "Let me check whether";
+ mes "you brought the right thing.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Yes,that's right.";
+ mes "You brought the right thing.";
+ mes "Please, wait a second and..";
+ mes "I have to";
+ mes "put you on the list.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "You are..^6b8e23" + strcharinfo(0)+ "^000000 ..right?";
+ mes "Hm...";
+ mes "Well done.";
+ mes "And this is compensation for the";
+ mes "ones who have passed the test.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "All you have to do is";
+ mes "meeting ^b8860b'Kantryl'^000000";
+ mes "at Izlude.";
+ delitem 955,20;
+ delitem 913,20;
+ delitem 729,1;
+ set quiz_rvl,18;
+ getitem 504,10; //White_Potion
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Goodbye~~.";
+ close;
+ }
+ mes "^800000[Radeng]^000000";
+ mes "Oh~~";
+ mes "You are here!";
+ mes "Let me check whether";
+ mes "You brought the right thing.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "oh my....";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Seems like you didn't prepare";
+ mes "what I asked you for.";
+ mes "I'll tell you what items you have to bring.";
+ mes "I'm not going to tell you again.";
+ mes "So please remember.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "The items are";
+ mes "^19197020 Warm peeling^000000";
+ mes "^19197020Tooth of Bat^000000";
+ mes "^1919701 Zircon^000000";
+ close;
+
+
+
+
+
+
+} if(quiz_rvl == 16) {
+ if (countitem(1055) > 29) && (countitem(940) > 29) && (countitem(948) > 29) && (countitem(730) > 0) {
+ mes "^800000[Radeng]^000000";
+ mes "Oh~~~";
+ mes "You are here!";
+ mes "Let me check whether ";
+ mes "you brought the right thing.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Yes,that's right.";
+ mes "You brought the right thing.";
+ mes "Please, wait a second and..";
+ mes "I have to";
+ mes "put you on the list.";
+ next;
+ set quiz_rvl,18;
+ getitem 504,10; //White_Potion
+ delitem 1055,30;
+ delitem 940,30;
+ delitem 948,30;
+ delitem 730,1;
+ mes "^800000[Radeng]^000000";
+ mes "You are..^6b8e23" + strcharinfo(0)+ "^000000..right?";
+ mes "Hm...";
+ mes "Well done.";
+ mes "And this is compensation for the";
+ mes "ones who have passed the test.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "All you have to do is";
+ mes "meeting ^b8860b'Kantryl'^000000";
+ mes "at Izlude.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Goodbye";
+ close;
+ }
+ mes "^800000[Radeng]^000000";
+ mes "Oh~~~";
+ mes "You are here!";
+ mes "Let me check whether";
+ mes "you brought the right thing.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Oh my....";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Seems like you didn't prepare";
+ mes "what I asked you for..";
+ mes "I'll tell you what items you have to bring..";
+ mes "I'm not going to tell you again.";
+ mes "So please remember..";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "^191970Earthwarm Peeling^000000 30";
+ mes "^191970Grasshopper's Leg^000000 30";
+ mes "^191970Bear's Footskin^000000 30";
+ mes "^1919701carat Diamond^000000 1.";
+ mes "Try hard.";
+ close;
+
+
+
+
+
+} else if(quiz_rvl == 15) {
+ mes "^800000[Radeng]^000000";
+ mes "You are....";
+ mes "the one who left before I tell you the score";
+ mes "Aren't you?";
+ mes "Can't tell you failed. So...";
+ next;
+ mes "If ^800000[Radeng]^000000";
+ mes "^191970Earthwarm Peeling^000000 30";
+ mes "^191970Grasshopper's Leg^000000 30";
+ mes "^191970Bear's Footskin^000000 30";
+ mes "^1919701carat Diamond^000000 1";
+ mes "is prepared,";
+ mes "You are pass.";
+ set quiz_rvl,16;
+ close;
+
+} else if(quiz_rvl == 14) {
+ mes "^800000[Radeng]^000000";
+ mes "Hello";
+ mes "I'm 'Radeng'.";
+ mes "I'm in charge of 4th test.";
+ mes "You seem to have finished";
+ mes "3rd test!";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Then,let's start 4th test.";
+ mes "the last barrier of quiz revolution.";
+ mes "First of all,";
+ mes "I will briefly go over about the test.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "you have to do quiz and collect items";
+ mes " ";
+ mes "You have to answer 10 mulptiple choice questions";
+ mes "and the amount of required items changes ";
+ mes "depending on score you acheive.";
+ mes " ";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "First,";
+ mes "If you clear all 10 questions";
+ mes "you are pass with";
+ mes "pretest of collecting items.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Second,";
+ mes "If you score between 50~90";
+ mes "required items are";
+ mes "not so much.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Third,";
+ mes "If you score between 0~40";
+ mes "required items will be";
+ mes "vast.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Well, this is all about";
+ mes "4th test.";
+ mes "Then, let's start!";
+ next;
+ menu "Yes",-,"No",M_No;
+
+ mes "^800000[Radeng]^000000";
+ mes "Well,now";
+ mes "10 questions will be presented.";
+ mes "Look carefully through ";
+ mes "questions and";
+ mes "choose the right answer.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "1st question.";
+ mes "How many jobs";
+ mes "are in the game?";
+ set @score_test2, 0;
+ next;
+ menu "22",sM1_1,"28",sM1_1,"32",sM1_1,"34",-;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_1:
+
+ mes "^800000[Radeng]^000000";
+ mes "2nd question.";
+ mes "The name of santa NPC";
+ mes "which links christmas town";
+ mes "'Lutie' and 'Aldebaran'?";
+ next;
+ menu "Warp Santa",sM1_2, "Link Santa",-, "Lutie Santa",sM1_2, "Hulk Santa",sM1_2;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_2:
+ mes "^800000[Radeng]^000000";
+ mes "3rd question.";
+ mes "What job level at least you have to be";
+ mes "to learn novice skill";
+ mes "'Pretend dead'?";
+ next;
+ menu "Job level4",sM1_3,"Job level5",sM1_3,"Job level6",sM1_3,"Job level7",-;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_3:
+ mes "^800000[Radeng]^000000";
+ mes "4th question.";
+ mes "Require items";
+ mes "to raise Poring?";
+ next;
+ menu "Unripe Apple",-,"Rippen Apple",sM1_4, "Delicious looking Apple",sM1_4, "Apple",sM1_4;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_4:
+ mes "^800000[Radeng]^000000";
+ mes "5th question";
+ mes "What doll can you buy";
+ mes "from NPC?";
+ next;
+ menu "Doll",-,"Baphomet Doll",sM1_5,"Yoyo Doll",sM1_5,"Rocker Doll",sM1_5;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_5:
+ mes "^800000[Radeng]^000000";
+ mes "6th question.";
+ mes "Name of monster which drop";
+ mes "'Big Ribbon'?";
+ next;
+ menu "Eclipse",sM1_6,"Dragon Fly",sM1_6,"Vocal",sM1_6,"Toad,",-;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_6:
+ mes "^800000[Radeng]^000000";
+ mes "Choose the monster that has smiliar size and form of";
+ mes "Pring.";
+ next;
+ menu "Pupa",sM1_7,"Fabre",sM1_7,"Wander Man",-,"Golem",sM1_7;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_7:
+ mes "^800000[Radeng]^000000";
+ mes "8th question.";
+ mes "When can Green Herb work";
+ mes "it's efficacy?";
+ next;
+ menu "Silence",sM1_8,"Sleep",sM1_8,"Poison",-,"Chaos",sM1_8;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_8:
+ mes "^800000[Radeng]^000000";
+ mes "9th question.";
+ mes "Which weapon gives biggest damages";
+ mes "to small sized monsters?";
+ next;
+ menu "Dagger",-,"Two hand Sword",sM1_9,"Katar",sM1_9,"One hand Sword",sM1_9;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_9:
+ mes "^800000[Radeng]^000000";
+ mes "Last question!!";
+ mes "What is not neccesary when learnig";
+ mes "First-aid treatment?";
+ next;
+ menu "Clover",sM1_0,"Red Herb",sM1_0,"Novice Nametag",-,"Sterilized Bandages",sM1_0;
+
+ set @score_test2, @score_test2 + 10;
+
+ sM1_0:
+ mes "^800000[Radeng]^000000";
+ mes "You finished answering all questions.";
+ mes "Wonder what your score is.";
+ mes "10points for 1 question.";
+ mes "Please wait a second.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Please, wait a second and..";
+ mes "Grading.";
+ mes ". . . . . . . . . . . . . . .";
+ mes ". . . . . . . . . . . . . . .";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "OK.";
+ mes "Your score is" + strcharinfo(0)+ "";
+ mes "" + @score_test2 + "!" ;
+ set quiz_rvl,15;
+ next;
+ if (@score_test2 > 40) && (@score_test2 < 90)goto L_Passed;
+ if (@score_test2 >= 90)goto L_Perfect;
+ mes "^800000[Radeng]^000000";
+ mes "Your score is too low.";
+ mes "Like as I told you before,";
+ mes "you have to bring a lot of";
+ mes "items to pass the test.";
+ mes " ";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Required items are";
+ mes "^191970Earthworm Peeling^000000 30";
+ mes "^191970Grasshopper's Leg^000000 30";
+ mes "^191970Bear's Footskin^000000 30";
+ mes "^1919701Carat Diamond^000000 1";
+ mes "";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "I'm sorry.";
+ mes "If you have scored just a little bit higher..";
+ mes ".........";
+ mes "Then,go look for items..";
+ set quiz_rvl,16;
+ close;
+
+ L_Passed:
+
+ mes "^800000[Radeng]^000000";
+ mes "You did fine. ";
+ mes "But as I told you before";
+ mes "you need to bring";
+ mes "some more items.";
+ mes " ";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Required items are";
+ mes "^191970Worm Peeling^000000 20";
+ mes "^191970Tooth of Bat^000000 20";
+ mes "^191970Zircon^000000 1.";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "I'm sorry~";
+ mes "If you have scored just a little bit higher..";
+ mes "you could have passed.";
+ mes "(KeKeke)";
+ mes "Then,go look for items..";
+ set quiz_rvl,17;
+ close;
+
+ L_Perfect:
+ mes "^800000[Radeng]^000000";
+ mes "Wow!You got it all right!.";
+ mes "Fantastic!!!!";
+ mes "For those of who ";
+ mes "got all right need no assignment";
+ mes " ";
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "" + strcharinfo(0)+ "";
+ mes "Have passed all tests.";
+ mes "Congratulations";
+ mes "And this is your compensation ";
+ mes "";
+ set quiz_rvl,18;
+ getitem 504,10; //White_Potion
+ next;
+ mes "^800000[Radeng]^000000";
+ mes "Now, go look for";
+ mes "^b8860b'Kantryl'^000000.";
+ mes "at Izlude.";
+ close;
+
+
+ M_No:
+ mes "^800000[Radeng]^000000";
+ mes "Come back if you change your mind.";
+ close;
+} else {
+ mes "^800000[Radeng]^000000";
+ mes "Hello~~~";
+ mes "Please join at comming";
+ mes "Quiz Revolution~";
+ mes "Register will be made";
+ mes "by receptionist in every town.";
+ close;
+}
+M_MaxItem:
+ mes "^800000[Radeng]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+
+L_OverWeight:
+ mes "^800000[Radeng]^000000";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+}
+
+//=======================================================================================================================================================
+izlude.gat,106,220,5 script Kantryl 98,{
+
+if (countitem(1201) > 3) goto M_MaxItem;
+if (checkweight(1201,3) == 0 ) goto L_OverWeight;
+
+
+if(quiz_rvl == 20) {
+ mes "[Kantryl]";
+ mes "I see that you have already givin me a";
+ mes "notice of absence...";
+ mes "Well, but I can't give you entry ticket.";
+ mes "who Knows~~";
+ mes "Wait untill quiz starts";
+ mes "You may catch a fortune.";
+ close;
+
+}else if(quiz_rvl == 19) {
+ mes "[Kantryl]";
+ mes "You have already received an entry ticket.";
+ mes "It's impossible getting";
+ mes "another one.";
+ next;
+ mes "[Kantryl]";
+ mes "For reference, number of particapants are";
+ next;
+ mes "[Kantryl]";
+ mes "1st Quiz Revolution - " + quiz1 + "/200";
+ mes "2nd Quiz Revolution - " + quiz2 + "/200";
+ mes "3rd Quiz Revolution - " + quiz3 + "/200";
+ mes "4th Quiz Revolution - " + quiz4 + "/200";
+ mes "5th Quiz Revolution - " + quiz5 + "/200";
+ mes "keep it in your mind.";
+ close;
+
+
+} else if(quiz_rvl == 18) {
+
+ mes "[Kantryl]";
+ mes "You are " + strcharinfo(0)+ ".";
+ mes "Who finished the test.right?";
+ mes "Would you please make a decision ";
+ mes "whether you will join or not join the";
+ mes "Quiz Revolution.";
+ next;
+ mes "[Kantryl]";
+ mes "Would you like to join?";
+ mes "If you say yes, you can register at";
+ mes "Quiz Revolution";
+ mes "If you choose ^FF0000'NO,I won't join'^000000";
+ mes " then ^FF0000'You can't join'^000000";
+ mes "Please make a right decision.";
+ next;
+ mes "[Kantryl]";
+ mes "If you haven't made up your mind,";
+ mes "say yes for now";
+ mes "and can change later on.";
+ mes "Take it easy.";
+ next;
+ menu "Join", -, "Not join.",NJ;
+
+
+ mes "[Kantryl]";
+ mes "Itis to 1~5 round";
+ mes "first 200 have chance.";
+ mes ""+ strcharinfo(0)+ ",when do you want to join?";
+ mes "It is ^FF0000Impossible to cancel^000000";
+ mes "So please make right decision.";
+ next;
+ mes "[Kantryl]";
+ mes "1st Quiz Revolution - " + quiz1 + "/200";
+ mes "2nd Quiz Revolution - " + quiz2 + "/200";
+ mes "3rd Quiz Revolution - " + quiz3 + "/200";
+ mes "4th Quiz Revolution - " + quiz4 + "/200";
+ mes "5th Quiz Revolution - " + quiz5 + "/200";
+ next;
+ menu "Join 1st round",-,"Join 2nd round",s2nd,"Join 3rd round",s3nd,"Join 4th round",s4nd,"Join 5th round",s5nd;
+
+ if(quiz1 > 199){
+ mes "[Kantryl]";
+ mes "I'm sorry. We are all full at";
+ mes "1st round of quiz revolution";
+ mes "No more applicants for 1st round.";
+ close;
+
+ }
+ mes "[Kantryl]";
+ mes "Hm..."+ strcharinfo(0)+" ";
+ mes "I have received your application";
+ mes "Try hard and study hard.";
+ set quiz_rvl,19;
+ set quiz1,quiz1 + 1;
+ getitem 7280,1; //Quiz_Ticket01
+ close;
+
+
+
+
+ s2nd:
+ if(quiz2 > 199){
+ mes "[Kantryl]";
+ mes "I'm sorry. We are all full at";
+ mes "2nd round of quiz revolution";
+ mes "No more applicants for 2nd round.";
+ close;
+ }
+
+ mes "[Kantryl]";
+ mes "Hm..."+ strcharinfo(0)+"";
+ mes "I have received your application";
+ mes "Try hard and study hard.";
+ set quiz_rvl,19;
+ set quiz2,quiz2 + 1;
+ getitem 7281,1; //Quiz_Ticket02
+ close;
+
+
+
+ s3nd:
+ if(quiz3 > 199){
+ mes "[Kantryl]";
+ mes "I'm sorry. We are all full at";
+ mes "3rd round of quiz revolution.";
+ mes "No more applicants for 3rd round.";
+ close;
+ }
+
+
+ mes "[Kantryl]";
+ mes "Hm..." + strcharinfo(0)+ "";
+ mes "I have received your application.";
+ mes "Try hard and study hard.";
+ set quiz_rvl,19;
+ set quiz3,quiz3 + 1;
+ getitem 7282,1; //Quiz_Ticket03
+ close;
+
+
+
+
+ s4nd:
+ if(quiz4 > 199){
+ mes "[Kantryl]";
+ mes "I'm sorry. We are all full at";
+ mes "4th round of quiz revolution.";
+ mes "No more applicants for 4th round..";
+ close;
+ }
+
+ mes "[Kantryl]";
+ mes "Hm..." + strcharinfo(0)+ "";
+ mes "I have received your application.";
+ mes "Try hard and study hard.";
+ set quiz_rvl,19;
+ set quiz4,quiz4 + 1;
+ getitem 7283,1; //Quiz_Ticket04
+ close;
+
+
+
+
+ s5nd:
+ if(quiz5 > 199){
+ mes "[Kantryl]";
+ mes "I'm sorry. We are all full at";
+ mes "5th round of quiz revolution.";
+ mes "No more applicants for 5th round..";
+ close;
+ }
+
+ mes "[Kantryl]";
+ mes "Hm..." + strcharinfo(0)+ "";
+ mes "I have received your application.";
+ mes "Try hard and study hard.";
+ set quiz_rvl,19;
+ set quiz5,quiz5 + 1;
+ getitem 7284,1; //Quiz_Ticket05
+ close;
+
+
+
+
+ NJ:
+ mes "[Kantryl]";
+ mes "Ok,if that's how you think.";
+ mes "Choice is on you";
+ mes "Good job any way.";
+ set quiz_rvl,20;
+ next;
+ mes "[Kantryl]";
+ mes "Actually,we have plan to";
+ mes "allowed for those of who didn't ";
+ mes "apply previously unless they have an entry ticket.";
+ mes "If you have any chance to get an entry ticket,";
+ mes "you are always welcome.";
+ next;
+ mes "[Kantryl]";
+ mes "Go ask for the ones";
+ mes "who changed their mind.";
+ mes "If you are lucky,";
+ mes "you'll get the chance.";
+ close;
+} else {
+ mes "[Kantryl]";
+ mes "Hello~";
+ mes "I'm Kantryl=Ranegalf.";
+ mes "I help the ones who have passsed the test";
+ mes "to take a formal step.";
+ next;
+ mes "[Kantryl]";
+ mes "It is impossible to accept";
+ mes "applications from those of who didn't";
+ mes "finish the test.";
+ mes "Go look for our staff in every";
+ mes "Midgarts";
+ mes "and take a test.";
+ next;
+ mes "[Kantryl]";
+ mes "At that time, I'll gladly";
+ mes "welcome you and accept the application.";
+ close;
+}
+M_MaxItem:
+ mes "[Kantryl]";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+
+L_OverWeight:
+ mes "[Kantryl]";
+ mes "- Wait a minute !! -";
+ mes "- You currently have too many items that -";
+ mes "- you can't receive an item. -";
+ mes "- Please loose some weight -";
+ mes "- and try again. -";
+ close;
+}
+
+//============================================================================================================================
+quiz_test.gat,387,350,4 script "From somewhere::race_monk 45,2,2,{
+OnTouch:
+
+ if (quiz_rvl == 6) {
+ set quiz_rvl,7;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 7) {
+ set quiz_rvl,8;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 8) {
+ set quiz_rvl,9;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 9) {
+ set quiz_rvl,10;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 10) {
+ announce "You are almost there. Show me your spirit.",bc_blue|bc_map;
+ set quiz_rvl,11;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 11) {
+ set quiz_rvl,12;
+ warp "quiz_test.gat",385,388;
+ end;
+ }else if (quiz_rvl == 12) {
+ mes "[Seeil]";
+ mes "You have worked hard and finished.";
+ mes "It wasn't that hard as you thought, huh?";
+ mes "All you have to do is run in circle... Well,";
+ mes "come in front of me.";
+ announce "Congratulations! " +strcharinfo(0)+ ", you have passed the test!",bc_blue|bc_map;
+ close2;
+ set quiz_rvl,13;
+ warp "payon.gat",109,115;
+ end;
+ }
+
+}
+//=============================hiddenwarp=================================================================
+
+//-----------------------------1111-----------------------------------------------------------------------
+quiz_test.gat,82,384,4 script Pit::ham_quiz#1-1 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,83,384,4 script Pit::ham_quiz#1-2 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,82,385,4 script Pit::ham_quiz#1-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,83,385,4 script Pit::ham_quiz#1-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//-----------------------------2222-----------------------------------------------------------------------
+quiz_test.gat,38,388,4 script Pit::ham_quiz#2-1 -1,0,1,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,39,388,4 script Pit::ham_quiz#2-2 -1,0,1,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,38,386,4 script Pit::ham_quiz#2-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,39,386,4 script Pit::ham_quiz#2-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//-----------------------------3333-----------------------------------------------------------------------
+quiz_test.gat,11,158,4 script Pit::ham_quiz#3-1 -1,1,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,11,159,4 script Pit::ham_quiz#3-2 -1,1,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,13,159,4 script Pit::ham_quiz#3-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,13,158,4 script Pit::ham_quiz#3-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//-----------------------------4444-----------------------------------------------------------------------
+quiz_test.gat,11,30,4 script Pit::ham_quiz#4-1 -1,3,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,11,31,4 script Pit::ham_quiz#4-2 -1,3,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,15,30,4 script Pit::ham_quiz#4-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,15,30,4 script Pit::ham_quiz#4-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//-----------------------------5555-----------------------------------------------------------------------
+quiz_test.gat,70,12,4 script Pit::ham_quiz#5-1 -1,0,1,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,71,12,4 script Pit::ham_quiz#5-2 -1,0,1,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,70,10,4 script Pit::ham_quiz#5-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,71,10,4 script Pit::ham_quiz#5-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//---------------------------6666-------------------------------------------------------------------------
+quiz_test.gat,186,11,4 script Pit::ham_quiz#6-1 -1,2,3,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,189,11,4 script Pit::ham_quiz#6-2 -1,0,3,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+//---------------------------7777-------------------------------------------------------------------------
+quiz_test.gat,387,43,4 script Pit::ham_quiz#7-1 -1,1,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,387,42,4 script Pit::ham_quiz#7-2 -1,1,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,389,43,4 script Pit::ham_quiz#7-3 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+quiz_test.gat,389,42,4 script Pit::ham_quiz#7-4 -1,0,0,{
+OnTouch:
+ announce ""+strcharinfo(0)+" Start running from the beginning. You fell in a pit.",bc_blue|bc_map;
+ warp "quiz_test.gat",387,387;
+ end;
+}
+
+//-------------------------------------------------------------------------------------------------------------
+// Comments
+// 0 = Didn't receive a quest from Tsuji
+// 1 = Failed Tsuji's quest
+// 2 = Pass Tsuji's quest and to 2nd round
+// 3 = Seeil's randomly collecting job item quest 1
+// 4 = Seeil's randomly collecting job item quest
+// 5 = Seeil's randomly collecting job item quest
+// 6 = Clear with collecting job item. start Marathon test
+// 7~12 =Checking Marathon quest occasionally.
+// 13 = Use after clearing Marathon quest
+// 14 = Clear 3rd quest, start Radeng(4th) quest
+// 15 = check after reporting errors of Radeng
+// 16 = randomly collecting job items at Radeng quest 1
+// 17 = randomly collecting job items at Radeng quest 2
+// 18 = Radeng quest clear. Possible time to apply. Begin Kantryl apply.
+// 19 = checked if you show intention to join
+// 20 = checked If you don't show intention to join
+// 21 = 3 items for the one who gets compansation
diff --git a/npc/quests/seals/brisingamen_seal.txt b/npc/quests/seals/brisingamen_seal.txt
index 8e79d74ad..618ea54fe 100644
--- a/npc/quests/seals/brisingamen_seal.txt
+++ b/npc/quests/seals/brisingamen_seal.txt
@@ -1,5536 +1,5536 @@
-//===== eAthena Script =======================================
-//= Brisingamen seal unlocking NPCs.
-//===== By: ==================================================
-//= SinSloth
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Quest for breaking the seal of Brisingamen.
-//===== Additional Comments: =================================
-// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
-// 1.0a Removed duplicates [Toms]
-//============================================================
-
-prt_fild08.gat,175,374,3 script Bard#brising 51,{
-
- if ($God2 > 49 && $God3 < 100)
-{
- if (god_brising > 49)
- {
- mes "[Nelliorde]";
- mes "Oh, I guess you found what you wanted, huh? So how's it been going lately?";
- next;
- mes "[Nelliorde]";
- mes "Recently I've been feeling strange, like something might happen soon. Aaah, forget, it's no big deal. Maybe I'm just being jumpy.";
- next;
- mes "[Nelliorde]";
- mes "Right, right, let me play a song for you. Would you care to listen?";
- next;
- menu "Sure, why not~",L_Song,"How about some news?",L_News,"No thanks.",L_NoThx;
- L_Song:
- mes "[Nelliorde]";
- mes "So, which song";
- mes "would you like to hear?";
- mes "Go ahead, pick one~";
- next;
- menu "Bragi's Poem",-,"Eternal Chaos",L_Chaos,"Assassin in the Sunset",L_Sunset,"Der Ring des Nibelungen",L_Nibel;
- mes "[Nelliorde]";
- mes "Bragi's Poem!";
- mes "What a good choice!";
- mes "I must say this song";
- mes "represents the heart";
- mes "of a poet!";
- soundeffect "bragis_poem.wav",1;
- close;
-
- L_Chaos:
- mes "[Nelliorde]";
- mes "Eternal Chaos...";
- mes "Sounds too chaotic.";
- mes "By the way, I wonder";
- mes "what the title really";
- mes "means. Is it the chaos";
- mes "of hell or our own reality?";
- soundeffect "chaos_of_eternity.wav",1;
- close;
- L_Sunset:
- mes "[Nelliorde]";
- mes "Assassin in";
- mes "the Sunset!";
- mes "Yes, no one looks cooler than an Assassin, the bringer of death, standing alone in the sunset! Heh heh~";
- soundeffect "assassin_of_sunset.wav",1;
- close;
- L_Nibel:
- mes "[Nelliorde]";
- mes "Der Ring des Nibelungen.....";
- mes "Okay, are you ready to listen?";
- mes "Hum hum hum....";
- next;
- soundeffect "ring_of_nibelungen.wav",1;
- mes "^4D4DFFRheingold...";
- mes "Hidden in the Rhein river.";
- mes "If made into a ring,";
- mes "Could rule the world~^000000";
- next;
- mes "^4D4DFFProtected by a spell";
- mes "Cursing its thief";
- mes "To never find love.";
- mes "Alberich had known";
- mes "Nonetheless stole it.";
- mes "Love was forsaken for power.^000000";
- next;
- mes "^4D4DFFGiants built beautiful Valhalla";
- mes "Matrimony with Freya";
- mes "Goddess of beauty";
- mes "Their supposed payment.";
- mes "In not receiving it";
- mes "They forcefully took her.^000000";
- next;
- mes "^4D4DFFThe gods would";
- mes "give Alberich's treasure";
- mes "To the Giants for Freya's return.";
- mes "Loki tricked Alberich,";
- mes "Stealing his ring or power.^000000";
- next;
- mes "^4D4DFFBut Alberich cursed his ring";
- mes "Before it was returned to him,";
- mes "Envy and death would";
- mes "befall its wearers.^000000";
- next;
- mes "^4D4DFFThe ring was given to the giants";
- mes "Freya was returned to the gods";
- mes "The giants killed themselves";
- mes "Fighting over the rheingold,";
- mes "Victims of";
- mes "Alberich's curse~^000000";
- close;
-
- L_News:
- mes "[Nelliorde]";
- mes "You wish to";
- mes "hear of some news?";
- mes "What kind of news do";
- mes "you wish to know about?";
- next;
-
- menu "About Prontera!",-,"About seaside areas.",L_NewsSea,"Is the desert still hot?",L_NewsDes,"How about the borderlands?",L_NewsBord;
- mes "[Nelliorde]";
- mes "What?! Prontera?!";
- mes "Can you not see that the front gate of Prontera is right before you? You should at least know where you are, adventurer.";
- next;
- mes "[Nelliorde]";
- mes "Anyways, I know one interesting news about Prontera. But, it's a secret. Shh! Are you... Single?";
- next;
- mes "[Nelliorde]";
- mes "If so, go visit the tavern. I met a guy there who took me a nice place. Oh yes. He took me 'the place' where singles are forbidden~!";
- close;
- L_NewsSea:
- mes "[Nelliorde]";
- mes "Seaside areas?";
- mes "That's a funny question. I mean, there's Alberta and a few other places where you can see the sea.";
- next;
- mes "[Nelliorde]";
- mes "To the SouthWest there's Kokomo Beach. But, I suppose it's too dangerous just to go there to take a stroll.";
- next;
- mes "[Nelliorde]";
- mes "Kokomo beach is a large expanse of sand. The nearby water is filled with sea animals, so you can enjoy catching Shellfishes.";
- next;
- mes "[Nelliorde]";
- mes "However, there are always bullies in that kind of place. Once, I met a threatening looking hoodlum with red spiky hair.";
- next;
- mes "[Nelliorde]";
- mes "He was chewing on something and spat on the ground. He big buffoon managed to intimidate me into giving him all of my Zeny!";
- next;
- mes "[Nelliorde]";
- mes "^333333*Sigh...*^000000";
- mes "This world is too";
- mes "dangerous for a young";
- mes "and fragile Bard.";
- next;
- mes "[Nelliorde]";
- mes "By the way, Alberta doesn't seem to have changed. The Sunken Ship looks the same as well, with all of its Skeleton Pirates and whatnot. You know how it is.";
- next;
- mes "[Nelliorde]";
- mes "The event agency in charge of expeditions into the Sunken Ship is still making tons of money. If you have nothing to do, why don't you hunt for monsters down there?";
- close;
- L_NewsDes:
- mes "[Nelliorde]";
- mes "Oh, hell yes!";
- mes "When is it not?";
- mes "The desert is hot, has";
- mes "been hot and probably";
- mes "always will be...!";
- next;
- mes "[Nelliorde]";
- mes "Giant worms still jump out of nowhere, freaking out innocent travellers like myself, and the Sandmen still kick people in the ass!";
- next;
- mes "[Nelliorde]";
- mes "Even if the desert is filled with hideous monsters, the view of the ocean there is so magnificent. Hah, it makes me want to play a song.";
- next;
- mes "[Nelliorde]";
- mes "I must say there is";
- mes "one place you may wish";
- mes "to see in the desert.";
- next;
- mes "[Nelliorde]";
- mes "I'm talking about the Assassin Guild. Supposedly, it's hidden behind a sandstorm in the Morroc Desert!";
-
- if (Class == Job_Assassin || Class == Job_Assassin_Cross) mes "But you should know what I am talking about! So when are you gonna take me to the guild, eh?";
- else mes "Have you ever been there before?";
- close;
- L_NewsBord:
- mes "[Nelliorde]";
- mes "Well, to the north is the Schwaltzwald Republic.";
- mes "There, you'll find Juno,";
- mes "the 'City of Sages.'";
- next;
- mes "[Nelliorde]";
- mes "The people there say that there is one major nuisance, a man known as the 'Mad Scientist.' He's antisocial and creates a lot of public disturbances with his experiments.";
- next;
- mes "[Nelliorde]";
- mes "It seems everyone in Juno hates him with passion. Even one of the Tool Shop owners begged a passing adventurer to stop this Mad Scientist's research!";
- next;
- mes "[Nelliorde]";
- mes "But I have a different opinion about him. I believe it's not a good idea to interrupt the work of any scientist. After all, he might just discover something important, even if his experiments are a little hazardous.";
- next;
- mes "[Nelliorde]";
- mes "Speaking of discoveries, you know how Juno floats in the air, right?";
- next;
- mes "[Nelliorde]";
- mes "It's said that a piece of Ymir's Heart generates enough power to keep the entire city aloft in the sky. Isn't that amazing?";
- next;
- mes "[Nelliorde]";
- mes "Even more recent is the news about the discovery of Ymir's Book. You can read it in Juno's Sage Castle. I hear that it contains the secret to meeting Valkyrie...";
- close;
- L_NoThx:
- mes "[Nelliorde]";
- mes "Huh? Okay then, talk to you later. May Bragi bless you on your journeys.";
- close;
- }
- else if(god_brising > 0 && god_brising < 50)
- {
- mes "[Nelliorde]";
- mes "So, have you met Mr. Kaili? Please do your best. After all, I especially recommended you~";
- next;
-
- menu "Tell me a story.",-,"Sing a song for me.",L_Sing;
- mes "[Nelliorde]";
- mes "Hmm. What would be a good story for you this time...? Ah yes, I've got it. Let me tell you about one of my own adventures. It was a pretty amazing experience.";
- next;
- mes "[Nelliorde]";
- mes "I went to Morroc, the city of the desert. On my way there, I became exhausted from the heat. Luckily, I found a hole beneath the shadows and climbed in to rest.";
- next;
- mes "[Nelliorde]";
- mes "Oh my God...";
- mes "If I had known";
- mes "better, I never";
- mes "would have gone";
- mes "inside that place...";
- next;
- mes "[Nelliorde]";
- mes "I actually crawled into the infamous ^FF0000Ant Hell^000000! I don't sound like a coward to you, do I?";
- next;
- mes "[Nelliorde]";
- mes "Well, the ants aren't the only ones living there. I wasn't afraid of them at all. Except, of course, when they attacked in groups.";
- next;
- mes "[Nelliorde]";
- mes "What I was really afraid of was this some sort of strawberry colored... tongue thing. Phreeoni!";
- next;
- mes "[Nelliorde]";
- mes "Fortunately, I survived intact, although I still have nightmares of that man-sized tongue.";
- next;
- mes "[Nelliorde]";
- mes "Once I got out of there, I craved human companionship and to restore my sense of normalcy. The closest place that I knew was Paros Lighthouse.";
- next;
- mes "[Nelliorde]";
- mes "Yet again, I decided to traverse the desert, despite the fact that the Kafra Ladies provide a very convenient teleport service there.";
- next;
- mes "[Nelliorde]";
- mes "Anyway, the fortress of Sandaruman is on the way to Paros Lighthouse. I remember Serutero, a guy I met in south Morroc, telling me about its scenic beauty.";
- next;
- mes "[Nelliorde]";
- mes "I was so excited about seeing it for myself. After all, doesn't 'Sandaruman' sound like the name of a beautiful place?";
- next;
- mes "[Nelliorde]";
- mes "But I immediately regret my decision once I arrived. Of course, the view was breathtaking: the sandy hills near the ocean, as well as the ruins.";
- next;
- mes "[Nelliorde]";
- mes "Of course I forgot Serutero's warning about all the monsters. Argh! It was a nightmare! Instead of enjoying the scenary, I ended up running for my life.";
- next;
- mes "[Nelliorde]";
- mes "I was still trying to escape those monsters when I stumbled upon an old house to the West of Sandaruman, that seemed to be in a state of decay.";
- next;
- mes "[Nelliorde]";
- mes "I recalled that Serutero said that no one was living in that area, so I began to worry a bit. Still, I was desperate and needed refuge.";
- next;
- mes "[Nelliorde]";
- mes "In my panic, I violently knocked on the door and screamed for someone to let me inside. Then do you know what I heard?";
- next;
- mes "[Nelliorde]";
- mes "^FF0000Who's there?!";
- mes "Who would dare";
- mes "intrude my territory?^000000";
- mes "I was freaked out! However owned that house must have been some kind of lunatic!";
- next;
- mes "[Nelliorde]";
- mes "Th-then, with the specter of Death nipping at my heels, he told me to get lost! Luckily, I was saved by a mysterious, wandering SuperNovice, but that's another story.";
- next;
- mes "[Nelliorde]";
- mes "In any case, I finally arrived at Paros Lighthouse. There, I learned that the old house was a secret camp for the Rogue Guild. ";
- next;
- mes "[Nelliorde]";
- mes "It's amazing, how they can live in such dangerous areas. Only Rogues would be able to survive there, you know?";
- next;
- mes "[Nelliorde]";
- mes "Ah...";
- mes "I'm so tired from talking so much. But if I happen to have another adventure, I shall share that tale to you.";
- close;
-
- L_Sing:
- mes "[Nelliorde]";
- mes "Ah, you wish";
- mes "to hear a song?";
- mes "Okay! I shall then";
- mes "perform my favorite.";
- next;
- mes "[Nelliorde]";
- mes "I chased after fame.";
- mes "It eluded me.";
- mes "I ran after happiness";
- mes "But never caught it.";
- next;
- mes "[Nelliorde]";
- mes "But tomorrow will still";
- mes "Be there, I'm sure.";
- mes "Like the Water Mill";
- mes "In Al De Baran";
- mes "Which turns as";
- mes "Life goes on.";
- next;
- mes "[Nelliorde]";
- mes "Cheer up! Life goes on.";
- mes "As surely as the Water";
- mes "Mill turns, tomorrow";
- mes "Will come.";
- close;
- }
- else
- {
- mes "[Nelliorde]";
- mes "Say...";
- mes "Have we met before?";
- mes "Hmm? Never? Well...";
- mes "That's rather odd.";
- next;
- mes "[Nelliorde]";
- mes "I seem to recall that you've asked me to give you some information if I ever have any. Well, now I have and shall share it with you~";
- next;
- mes "[Nelliorde]";
- mes "The usefulness of this information all depends on you. Now, have you heard of the ^3333CCMonster Research Organization^000000?";
- next;
- mes "[Nelliorde]";
- mes "I happened to get this information from its headquarters in Juno. So how does that sound?";
- next;
-
- menu "Wee~ I want to hear!",-,"Booooring~",L_Boring;
- mes "[Nelliorde]";
- mes "Well...!";
- mes "You seem to be";
- mes "very excited about";
- mes "this new tidbit of";
- mes "knowledge I have~";
- next;
-
- if(BaseLevel < 70)
- {
- mes "[Nelliorde]";
- mes "Alas, this information doesn't seem to be very valuable to someone such as yourself.";
- next;
- mes "[Nelliorde]";
- mes "I'm so very sorry to have excited you, but only people that are strong enough to handle grueling work can benefit from this.";
- next;
- mes "[Nelliorde]";
- mes "Why don't you travel around and gain more experiences? I will let you know when you're ready, you know~";
- close;
- }
- else
- {
- mes "[Nelliorde]";
- mes "Ooh...";
- mes "And you look";
- mes "like you can handle";
- mes "this kind of information.";
- mes "I'll share everything I know!";
- next;
- mes "[Nelliorde]";
- mes "One day, an adventurer discovered a strange, mysterious object. Unable to figure out what it could do, he visited the Monster Organization.";
- next;
- mes "[Nelliorde]";
- mes "There, it was entrusted to a scholar by the name of Mr. Kaili. He still hasn't uncovered the truth about that item and wishes for assistance in his investigation.";
- next;
- mes "[Nelliorde]";
- mes "Mr. Kaili suspects that the item might be part of an undiscovered ancient relic. Fortunately, he is also researching ancient relics as a project assigned by the royal court.";
- next;
- mes "[Nelliorde]";
- mes "So what do you think? Isn't that interesting? Of course, you'd better speak to Mr. Kaili if you wish to learn more. If you'd like, I shall write you a letter or recommendation.";
- next;
-
- menu "Sure! Sounds good.",-,"Sorry, I am not that interested.",L_NoInterest;
- mes "[Nelliorde]";
- mes "Excellent..!";
- mes "So you name is...";
- mes "" + strcharinfo(0) + "?";
- next;
- mes "[Nelliorde]";
- mes "Alright, I shall contact him, right away! Oh, and you can find the Monster Organization west of Juno's central plaza. It shouldn't be hard to find. Good luck!";
- set god_brising,1;
- close;
- L_NoInterest:
- mes "[Nelliorde]";
- mes "Ah, it's disappointing to hear that. I thought that you'd be perfect to help out Mr. Kaili. Oh well, talk to you later~";
- close;
- }
- L_Boring:
- mes "[Nelliorde]";
- mes "Boring, you say?";
- mes "Perhaps, but not as";
- mes "boring as an adventurer";
- mes "that passes up a chance";
- mes "for an adventure, yes?";
- next;
- menu "Tell me a story.",-,"Sing a song for me.",L_Sing2;
- mes "[Nelliorde]";
- mes "Hmm. What would be a good story for you this time...? Ah yes, I've got it. Let me tell you about one of my own adventures. It was a pretty amazing experience.";
- next;
- mes "[Nelliorde]";
- mes "I went to Morroc, the city of the desert. On my way there, I became exhausted from the heat. Luckily, I found a hole beneath the shadows and climbed in to rest.";
- next;
- mes "[Nelliorde]";
- mes "Oh my God...";
- mes "If I had known";
- mes "better, I never";
- mes "would have gone";
- mes "inside that place...";
- next;
- mes "[Nelliorde]";
- mes "I actually crawled into the infamous ^FF0000Ant Hell^000000! I don't sound like a coward to you, do I?";
- next;
- mes "[Nelliorde]";
- mes "Well, the ants aren't the only ones living there. I wasn't afraid of them at all. Except, of course, when they attacked in groups.";
- next;
- mes "[Nelliorde]";
- mes "What I was really afraid of was this some sort of strawberry colored... tongue thing. Phreeoni!";
- next;
- mes "[Nelliorde]";
- mes "Fortunately, I survived intact, although I still have nightmares of that man-sized tongue.";
- next;
- mes "[Nelliorde]";
- mes "Once I got out of there, I craved human companionship and to restore my sense of normalcy. The closest place that I knew was Paros Lighthouse.";
- next;
- mes "[Nelliorde]";
- mes "Yet again, I decided to traverse the desert, despite the fact that the Kafra Ladies provide a very convenient teleport service there.";
- next;
- mes "[Nelliorde]";
- mes "Anyway, the fortress of Sandaruman is on the way to Paros Lighthouse. I remember Serutero, a guy I met in south Morroc, telling me about its scenic beauty.";
- next;
- mes "[Nelliorde]";
- mes "I was so excited about seeing it for myself. After all, doesn't 'Sandaruman' sound like the name of a beautiful place?";
- next;
- mes "[Nelliorde]";
- mes "But I immediately regret my decision once I arrived. Of course, the view was breathtaking: the sandy hills near the ocean, as well as the ruins.";
- next;
- mes "[Nelliorde]";
- mes "Of course I forgot Serutero's warning about all the monsters. Argh! It was a nightmare! Instead of enjoying the scenary, I ended up running for my life.";
- next;
- mes "[Nelliorde]";
- mes "I was still trying to escape those monsters when I stumbled upon an old house to the West of Sandaruman, that seemed to be in a state of decay.";
- next;
- mes "[Nelliorde]";
- mes "I recalled that Serutero said that no one was living in that area, so I began to worry a bit. Still, I was desperate and needed refuge.";
- next;
- mes "[Nelliorde]";
- mes "In my panic, I violently knocked on the door and screamed for someone to let me inside. Then do you know what I heard?";
- next;
- mes "[Nelliorde]";
- mes "^FF0000Who's there?!";
- mes "Who would dare";
- mes "intrude my territory?^000000";
- mes "I was freaked out! However owned that house must have been some kind of lunatic!";
- next;
- mes "[Nelliorde]";
- mes "Th-then, with the specter of Death nipping at my heels, he told me to get lost! Luckily, I was saved by a mysterious, wandering SuperNovice, but that's another story.";
- next;
- mes "[Nelliorde]";
- mes "In any case, I finally arrived at Paros Lighthouse. There, I learned that the old house was a secret camp for the Rogue Guild. ";
- next;
- mes "[Nelliorde]";
- mes "It's amazing, how they can live in such dangerous areas. Only Rogues would be able to survive there, you know?";
- next;
- mes "[Nelliorde]";
- mes "Ah...";
- mes "I'm so tired from talking so much. But if I happen to have another adventure, I shall share that tale to you.";
- close;
-
- L_Sing2:
- mes "[Nelliorde]";
- mes "Ah, you wish";
- mes "to hear a song?";
- mes "Okay! I shall then";
- mes "perform my favorite.";
- next;
- mes "[Nelliorde]";
- mes "I chased after fame.";
- mes "It eluded me.";
- mes "I ran after happiness";
- mes "But never caught it.";
- next;
- mes "[Nelliorde]";
- mes "But tomorrow will still";
- mes "Be there, I'm sure.";
- mes "Like the Water Mill";
- mes "In Al De Baran";
- mes "Which turns as";
- mes "Life goes on.";
- next;
- mes "[Nelliorde]";
- mes "Cheer up! Life goes on.";
- mes "As surely as the Water";
- mes "Mill turns, tomorrow";
- mes "Will come.";
- close;
- }
-}
- else
-{
- mes "[Nelliorde]";
- mes "Hello there!";
- mes "Isn't it such";
- mes "a glorious day?";
- mes "You know of me,";
- mes "do you not?";
- next;
- mes "[Nelliorde]";
- if (Sex) mes "Hahahaha, forgive my rudeness, but I fail to remember your name, although your face does seem rather familiar.";
- else
- {
- mes "Oh well well...";
- mes "How could I ever";
- mes "forget the lovely";
- mes ""+ strcharinfo(0) +"?";
- }
- mes "Whatever, hahahaha!";
- next;
- mes "[Nelliorde]";
- mes "So, aren't you curious about me? Feel free to ask me whatever you like! I'm the vagabond that will wander the earth till the end of his days, your friend who loves to sing under the moonlight~";
- next;
- menu "Who are you?",-,"What's new?",L_New,"Can you sing?",L_Sing3;
- mes "[Nelliorde]";
- mes "Why, I am Nelliorde, the Bard. In truth, my real name is Elliorde.";
- next;
- mes "[Nelliorde]";
- mes "However, while I was singing at a Tavern, as per usual, a man with long blonde hair angrily demanded that I change my name!";
- next;
- mes "[Nelliorde]";
- mes "Never before have I seen such a flailing and a fuss over someone coincidentally sharing the same name!";
- next;
- mes "[Nelliorde]";
- mes "And so, that little altercation was settled with me being named Nelliorde.";
- next;
- mes "[Nelliorde]";
- mes "I don't sound like a coward to you, do I? Do you believe I should have fought for the right to keep my original name?";
- next;
- mes "[Nelliorde]";
- mes "If so, you're wrong! I just don't believe that violence can solve anything as the romantic Bard that cherishes peace...";
- next;
- mes "^3355FFSeeing as it's not worth";
- mes "listening to Nelliorde's lies, you decide to simply tune him out.^000000";
- next;
- mes "^3355FF...";
- mes "......^000000";
- next;
- mes "^3355FF...";
- mes "......";
- mes ".........^000000";
- next;
- mes "[Nelliorde]";
- mes "And that's how I convinced wise and benevolent King Tristram III to build a paradise where married lovers could enjo- Hm? Are you even listening?!";
- close;
-
- L_New:
- mes "[Nelliorde]";
- mes "You wish to";
- mes "hear of some news?";
- mes "What kind of news do";
- mes "you wish to know about?";
- next;
-
- menu "About Prontera!",-,"About seaside areas.",L_NewsSea2,"Is the desert still hot?",L_NewsDes2,"How about the borderlands?",L_NewsBord2;
- mes "[Nelliorde]";
- mes "What?! Prontera?!";
- mes "Can you not see that the front gate of Prontera is right before you? You should at least know where you are, adventurer.";
- next;
- mes "[Nelliorde]";
- mes "Anyways, I know one interesting news about Prontera. But, it's a secret. Shh! Are you... Single?";
- next;
- mes "[Nelliorde]";
- mes "If so, go visit the tavern. I met a guy there who took me a nice place. Oh yes. He took me 'the place' where singles are forbidden~!";
- close;
- L_NewsSea2:
- mes "[Nelliorde]";
- mes "Seaside areas?";
- mes "That's a funny question. I mean, there's Alberta and a few other places where you can see the sea.";
- next;
- mes "[Nelliorde]";
- mes "To the SouthWest there's Kokomo Beach. But, I suppose it's too dangerous just to go there to take a stroll.";
- next;
- mes "[Nelliorde]";
- mes "Kokomo beach is a large expanse of sand. The nearby water is filled with sea animals, so you can enjoy catching Shellfishes.";
- next;
- mes "[Nelliorde]";
- mes "However, there are always bullies in that kind of place. Once, I met a threatening looking hoodlum with red spiky hair.";
- next;
- mes "[Nelliorde]";
- mes "He was chewing on something and spat on the ground. He big buffoon managed to intimidate me into giving him all of my Zeny!";
- next;
- mes "[Nelliorde]";
- mes "^333333*Sigh...*^000000";
- mes "This world is too";
- mes "dangerous for a young";
- mes "and fragile Bard.";
- next;
- mes "[Nelliorde]";
- mes "By the way, Alberta doesn't seem to have changed. The Sunken Ship looks the same as well, with all of its Skeleton Pirates and whatnot. You know how it is.";
- next;
- mes "[Nelliorde]";
- mes "The event agency in charge of expeditions into the Sunken Ship is still making tons of money. If you have nothing to do, why don't you hunt for monsters down there?";
- close;
- L_NewsDes2:
- mes "[Nelliorde]";
- mes "Oh, hell yes!";
- mes "When is it not?";
- mes "The desert is hot, has";
- mes "been hot and probably";
- mes "always will be...!";
- next;
- mes "[Nelliorde]";
- mes "Giant worms still jump out of nowhere, freaking out innocent travellers like myself, and the Sandmen still kick people in the ass!";
- next;
- mes "[Nelliorde]";
- mes "Even if the desert is filled with hideous monsters, the view of the ocean there is so magnificent. Hah, it makes me want to play a song.";
- next;
- mes "[Nelliorde]";
- mes "I must say there is";
- mes "one place you may wish";
- mes "to see in the desert.";
- next;
- mes "[Nelliorde]";
- mes "I'm talking about the Assassin Guild. Supposedly, it's hidden behind a sandstorm in the Morroc Desert!";
-
- if (Class == Job_Assassin || Class == Job_Assassin_Cross) mes "But you should know what I am talking about! So when are you gonna take me to the guild, eh?";
- else mes "Have you ever been there before?";
- close;
- L_NewsBord2:
- mes "[Nelliorde]";
- mes "Well, to the north is the Schwaltzwald Republic.";
- mes "There, you'll find Juno,";
- mes "the 'City of Sages.'";
- next;
- mes "[Nelliorde]";
- mes "The people there say that there is one major nuisance, a man known as the 'Mad Scientist.' He's antisocial and creates a lot of public disturbances with his experiments.";
- next;
- mes "[Nelliorde]";
- mes "It seems everyone in Juno hates him with passion. Even one of the Tool Shop owners begged a passing adventurer to stop this Mad Scientist's research!";
- next;
- mes "[Nelliorde]";
- mes "But I have a different opinion about him. I believe it's not a good idea to interrupt the work of any scientist. After all, he might just discover something important, even if his experiments are a little hazardous.";
- next;
- mes "[Nelliorde]";
- mes "Speaking of discoveries, you know how Juno floats in the air, right?";
- next;
- mes "[Nelliorde]";
- mes "It's said that a piece of Ymir's Heart generates enough power to keep the entire city aloft in the sky. Isn't that amazing?";
- next;
- mes "[Nelliorde]";
- mes "Even more recent is the news about the discovery of Ymir's Book. You can read it in Juno's Sage Castle. I hear that it contains the secret to meeting Valkyrie...";
- close;
-
- L_Sing3:
- mes "[Nelliorde]";
- mes "Can I sing, you ask? Certainly, and if I may say so, pleasureably. Which song would you care to hear?";
- next;
- menu "Bragi's Poem",-,"Eternal Chaos",L_Chaos2,"Assassin in the Sunset",L_Sunset2;
-
- if(Zeny > 499)
- {
- mes "[Nelliorde]";
- mes "Bragi's Poem!";
- mes "What a good choice!";
- mes "I must say this song represents the heart of a poet!";
- soundeffect "bragis_poem.wav",1;
- set Zeny,Zeny - 500;
- close;
- }
- else
- {
- mes "[Nelliorde]";
- mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
- close;
- }
-
- L_Chaos2:
- if(Zeny > 499)
- {
- mes "[Nelliorde]";
- mes "You must like robust and energetic music, eh? As you wish~";
- soundeffect "chaos_of_eternity.wav",1;
- set Zeny,Zeny - 500;
- close;
- }
- else
- {
- mes "[Nelliorde]";
- mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
- close;
- }
-
- L_Sunset2:
- if(Zeny > 499)
- {
- mes "[Nelliorde]";
- mes "Excellent choice!";
- mes "Somehow, the image of the setting sun fits well with Assassins. Don't you agree?";
- soundeffect "assassin_of_sunset.wav",1;
- set Zeny,Zeny - 500;
- close;
- }
- else
- {
- mes "[Nelliorde]";
- mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
- close;
- }
-}
-
-}
-
-yuno_in04.gat,47,113,1 script Studying Scholar#1 749,{
-
- if($God3 == 100)
-{
- mes "[Studying Scholar]";
- mes "Hmmm...";
- mes "The highest quality Red Potion ever...";
- next;
- mes "[Studying Scholar]";
- mes "If only I could figure a way to balance the consistency of the ground Red Herbs mixed with the water. That part is most crucial...";
- close;
-}
-
- if($God2 > 49)
-{
- if(god_brising == 50)
- {
- mes "[Enrico Kaili]";
- mes "Ah, " + strcharinfo(0) + ",";
- mes "you've returned.";
- next;
- mes "[Enrico Kaili]";
- mes "Learning about Brisingamen was truly fascinating. But since we've hit a plateau for now, I've started a new research project.";
- next;
- mes "[Enrico Kaili]";
- mes "Hahahaha~";
- mes "I'm sorry, but I cannot tell you about it for now, since it's confidential. But once I get a chance, I'll ask you for help.";
- close;
- }
- else if(god_brising == 49)
- {
- mes "[Enrico Kaili]";
- mes "Ah, I see. So it's true that Berling sealed himself in the ripple where the goddess' tear fell into the waters.";
- next;
- mes "[Enrico Kaili]";
- mes "Oh! I'm so excited! I don't know what to do first! Should I report to His Majesty or publish my findings or...";
- next;
- menu "^333333*Ahem!*^000000 My reward!",-;
- mes "[Enrico Kaili]";
- mes "Oh, right.";
- mes "Thank you for all the trouble you have endured for my sake. You are truly one of the best researchers I've ever met.";
- next;
- mes "[Enrico Kaili]";
- mes "Then as promised...";
- mes "I will give you something from my precious collection! Now, let me see what we have here...";
- next;
- mes "[Enrico Kaili]";
- mes "Please...";
- mes "Take this";
- set @card,rand(1,1210);
- if ((@card > 0 ) && (@card < 11))
- {
- mes "Poring Card.";
- set god_brising,50;
- getitem "Poring_Card",1;
- }
- else if ((@card > 10) && (@card < 21))
- {
- mes "Fabre Card.";
- set god_brising,50;
- getitem "Fabre_Card",1;
- }
- else if ((@card > 20) && (@card < 26))
- {
- mes "Pupa Card.";
- set god_brising,50;
- getitem "Pupa_Card",1;
- }
- else if ((@card > 25) && (@card < 41))
- {
- mes "Drops Card.";
- set god_brising,50;
- getitem "Drops_Card",1;
- }
- else if ((@card > 40) && (@card < 51))
- {
- mes "Lunatic Card.";
- set god_brising,50;
- getitem "Lunatic_Card",1;
- }
- else if ((@card > 50) && (@card < 56))
- {
- mes "Peco Peco Egg Card.";
- set god_brising,50;
- getitem "Pecopeco_Egg_Card",1;
- }
- else if ((@card > 55) && (@card < 71))
- {
- mes "Picky Card.";
- set god_brising,50;
- getitem "Picky_Card",1;
- }
- else if ((@card > 70) && (@card < 81))
- {
- mes "Chonchon Card.";
- set god_brising,50;
- getitem "Chonchon_Card",1;
- }
- else if ((@card > 80) && (@card < 91))
- {
- mes "Willow Card.";
- set god_brising,50;
- getitem "Wilow_Card",1;
- }
- else if ((@card > 90) && (@card < 101))
- {
- mes "Thief Bug Egg Card.";
- set god_brising,50;
- getitem "Thief_Bug_Egg_Card",1;
- }
- else if ((@card > 100) && (@card < 111))
- {
- mes "Andre Egg Card.";
- set god_brising,50;
- getitem "Andre_Egg_Card",1;
- }
- else if ((@card > 110) && (@card < 121))
- {
- mes "Roda Frog Card.";
- set god_brising,50;
- getitem "Roda_Frog_Card",1;
- }
- else if ((@card > 120) && (@card < 131))
- {
- mes "Condor Card.";
- set god_brising,50;
- getitem "Condor_Card",1;
- }
- else if ((@card > 130) && (@card < 141))
- {
- mes "Thief Bug Card.";
- set god_brising,50;
- getitem "Thief_Bug_Card",1;
- }
- else if ((@card > 140) && (@card < 151))
- {
- mes "Savage Bebe Card.";
- set god_brising,50;
- getitem "Savage_Babe_Card",1;
- }
- else if ((@card > 150) && (@card < 161))
- {
- mes "Hornet Card.";
- set god_brising,50;
- getitem "Hornet_Card",1;
- }
- else if ((@card > 160) && (@card < 171))
- {
- mes "Hornet Card.";
- set god_brising,50;
- getitem "Hornet_Card",1;
- }
- else if ((@card > 170) && (@card < 181))
- {
- mes "Familiar Card.";
- set god_brising,50;
- getitem "Farmiliar_Card",1;
- }
- else if ((@card > 180) && (@card < 191))
- {
- mes "Rocker Card.";
- set god_brising,50;
- getitem "Rocker_Card",1;
- }
- else if ((@card > 190) && (@card < 201))
- {
- mes "Spore Card.";
- set god_brising,50;
- getitem "Spore_Card",1;
- }
- else if ((@card > 200) && (@card < 211))
- {
- mes "Baby Desert Wolf Card.";
- set god_brising,50;
- getitem "Desert_Wolf_Babe_Card",1;
- }
- else if ((@card > 210) && (@card < 221))
- {
- mes "Plankton Card.";
- set god_brising,50;
- getitem "Plankton_Card",1;
- }
- else if ((@card > 220) && (@card < 231))
- {
- mes "Skeleton Card.";
- set god_brising,50;
- getitem "Skeleton_Card",1;
- }
- else if ((@card > 230) && (@card < 241))
- {
- mes "Female Thief Bug Card.";
- set god_brising,50;
- getitem "Thief_Bug_Female_Card",1;
- }
- else if ((@card > 240) && (@card < 251))
- {
- mes "Kukre Card.";
- set god_brising,50;
- getitem "Kukre_Card",1;
- }
- else if ((@card > 250) && (@card < 261))
- {
- mes "Tarou Card.";
- set god_brising,50;
- getitem "Tarou_Card",1;
- }
- else if ((@card > 260) && (@card < 271))
- {
- mes "Wolf Card.";
- set god_brising,50;
- getitem "Wolf_Card",1;
- }
- else if ((@card > 270) && (@card < 281))
- {
- mes "Mandragora Card.";
- set god_brising,50;
- getitem "Mandragora_Card",1;
- }
- else if ((@card > 280) && (@card < 291))
- {
- mes "Peco Peco Card.";
- set god_brising,50;
- getitem "Pecopeco_Card",1;
- }
- else if ((@card > 290) && (@card < 301))
- {
- mes "Ambernite Card.";
- set god_brising,50;
- getitem "Ambernite_Card",1;
- }
- else if ((@card > 300) && (@card < 311))
- {
- mes "Poporing Card.";
- set god_brising,50;
- getitem "Poporing_Card",1;
- }
- else if ((@card > 310) && (@card < 321))
- {
- mes "Worm Tail Card.";
- set god_brising,50;
- getitem "Worm_Tail_Card",1;
- }
- else if ((@card > 320) && (@card < 326))
- {
- mes "Hydra Card.";
- set god_brising,50;
- getitem "Hydra_Card",1;
- }
- else if ((@card > 325) && (@card < 341))
- {
- mes "Muka Card.";
- set god_brising,50;
- getitem "Muka_Card",1;
- }
- else if ((@card > 340) && (@card < 351))
- {
- mes "Snake Card.";
- set god_brising,50;
- getitem "Snake_Card",1;
- }
- else if ((@card > 350) && (@card < 361))
- {
- mes "Zombie Card.";
- set god_brising,50;
- getitem "Zombie_Card",1;
- }
- else if ((@card > 360) && (@card < 371))
- {
- mes "Stainer Card.";
- set god_brising,50;
- getitem "Stainer_Card",1;
- }
- else if ((@card > 370) && (@card < 376))
- {
- mes "Creamy Card.";
- set god_brising,50;
- getitem "Creamy_Card",1;
- }
- else if ((@card > 375) && (@card < 391))
- {
- mes "Coco Card.";
- set god_brising,50;
- getitem "Coco_Card",1;
- }
- else if ((@card > 390) && (@card < 401))
- {
- mes "Steel Chonchon Card.";
- set god_brising,50;
- getitem "Steel_Chonchon_Card",1;
- }
- else if ((@card > 400) && (@card < 411))
- {
- mes "Andre Card.";
- set god_brising,50;
- getitem "Andre_Card",1;
- }
- else if ((@card > 410) && (@card < 421))
- {
- mes "Smokie Card.";
- set god_brising,50;
- getitem "Smokie_Card",1;
- }
- else if ((@card > 420) && (@card < 431))
- {
- mes "Horn Card.";
- set god_brising,50;
- getitem "Horn_Card",1;
- }
- else if ((@card > 430) && (@card < 441))
- {
- mes "Martin Card.";
- set god_brising,50;
- getitem "Martin_Card",1;
- }
- else if ((@card > 440) && (@card < 451))
- {
- mes "Poison Spore Card.";
- set god_brising,50;
- getitem "Poison_Spore_Card",1;
- }
- else if ((@card > 450) && (@card < 461))
- {
- mes "Vadon Card.";
- set god_brising,50;
- getitem "Vadon_Card",1;
- }
- else if ((@card > 460) && (@card < 466))
- {
- mes "Male Thief Bug Card.";
- set god_brising,50;
- getitem "Thief_Bug_Male_Card",1;
- }
- else if ((@card > 465) && (@card < 481))
- {
- mes "Yoyo Card.";
- set god_brising,50;
- getitem "Yoyo_Card",1;
- }
- else if ((@card > 480) && (@card < 491))
- {
- mes "Elder Willow Card.";
- set god_brising,50;
- getitem "Elder_Wilow_Card",1;
- }
- else if ((@card > 490) && (@card < 496))
- {
- mes "Vitata Card.";
- set god_brising,50;
- getitem "Vitata_Card",1;
- }
- else if ((@card > 495) && (@card < 511))
- {
- mes "Marina Card.";
- set god_brising,50;
- getitem "Marina_Card",1;
- }
- else if ((@card > 510) && (@card < 521))
- {
- mes "Dustiness Card.";
- set god_brising,50;
- getitem "Dustiness_Card",1;
- }
- else if ((@card > 520) && (@card < 536))
- {
- mes "Metaller Card.";
- set god_brising,50;
- getitem "Metaller_Card",1;
- }
- else if ((@card > 535) && (@card < 541))
- {
- mes "Thara Frog Card.";
- set god_brising,50;
- getitem "Thara_Frog_Card",1;
- }
- else if ((@card > 540) && (@card < 551))
- {
- mes "Drops Card.";
- set god_brising,50;
- getitem "Drops_Card",1;
- }
- else if ((@card > 550) && (@card < 561))
- {
- mes "Goblin Card.";
- set god_brising,50;
- getitem "Goblin_Card",1;
- }
- else if ((@card > 560) && (@card < 571))
- {
- mes "Cornutus Card.";
- set god_brising,50;
- getitem "Cornutus_Card",1;
- }
- else if ((@card > 570) && (@card < 581))
- {
- mes "Anacondaq Card.";
- set god_brising,50;
- getitem "Anacondaq_Card",1;
- }
- else if ((@card > 580) && (@card < 596))
- {
- mes "Caramel Card.";
- set god_brising,50;
- getitem "Caramel_Card",1;
- }
- else if ((@card > 595) && (@card < 601))
- {
- mes "Zerom Card.";
- set god_brising,50;
- getitem "Zerom_Card",1;
- }
- else if ((@card > 600) && (@card < 606))
- {
- mes "Kaho Card.";
- set god_brising,50;
- getitem "Kaho_Card",1;
- }
- else if ((@card > 605) && (@card < 621))
- {
- mes "Orc Warrior Card.";
- set god_brising,50;
- getitem "Orc_Warrior_Card",1;
- }
- else if ((@card > 620) && (@card < 631))
- {
- mes "Megalodon Card.";
- set god_brising,50;
- getitem "Megalodon_Card",1;
- }
- else if ((@card > 630) && (@card < 641))
- {
- mes "Scorpion Card.";
- set god_brising,50;
- getitem "Scorpion_Card",1;
- }
- else if ((@card > 640) && (@card < 651))
- {
- mes "Drainliar Card.";
- set god_brising,50;
- getitem "Drainliar_Card",1;
- }
- else if ((@card > 650) && (@card < 661))
- {
- mes "Orc Zombie Card.";
- set god_brising,50;
- getitem "Orc_Zombie_Card",1;
- }
- else if ((@card > 660) && (@card < 671))
- {
- mes "Golem Card.";
- set god_brising,50;
- getitem "Golem_Card",1;
- }
- else if ((@card > 670) && (@card < 681))
- {
- mes "Pirate Skel Card.";
- set god_brising,50;
- getitem "Pirate_Skel_Card",1;
- }
- else if ((@card > 680) && (@card < 691))
- {
- mes "Bigfoot Card.";
- set god_brising,50;
- getitem "BigFoot_Card",1;
- }
- else if ((@card > 690) && (@card < 701))
- {
- mes "Argos Card.";
- set god_brising,50;
- getitem "Argos_Card",1;
- }
- else if ((@card > 700) && (@card < 716))
- {
- mes "Magnolia Card.";
- set god_brising,50;
- getitem "Magnolia_Card",1;
- }
- else if ((@card > 715) && (@card < 721))
- {
- mes "Phen Card.";
- set god_brising,50;
- getitem "Phen_Card",1;
- }
- else if ((@card > 720) && (@card < 726))
- {
- mes "Mantis Card.";
- set god_brising,50;
- getitem "Mantis_Card",1;
- }
- else if ((@card > 725) && (@card < 741))
- {
- mes "Flora Card.";
- set god_brising,50;
- getitem "Flora_Card",1;
- }
- else if ((@card > 740) && (@card < 751))
- {
- mes "Hode Card.";
- set god_brising,50;
- getitem "Hode_Card",1;
- }
- else if ((@card > 750) && (@card < 761))
- {
- mes "Desert Wolf Card.";
- set god_brising,50;
- getitem "Desert_Wolf_Card",1;
- }
- else if ((@card > 760) && (@card < 766))
- {
- mes "Rafflesia Card.";
- set god_brising,50;
- getitem "Rafflesia_Card",1;
- }
- else if ((@card > 765) && (@card < 781))
- {
- mes "Marine Sphere Card.";
- set god_brising,50;
- getitem "Marine_Sphere_Card",1;
- }
- else if ((@card > 780) && (@card < 791))
- {
- mes "Orc Skeleton Card.";
- set god_brising,50;
- getitem "Orc_Skeleton_Card",1;
- }
- else if ((@card > 790) && (@card < 796))
- {
- mes "Soldier Skeleton Card.";
- set god_brising,50;
- getitem "Soldier_Skeleton_Card",1;
- }
- else if ((@card > 795) && (@card < 811))
- {
- mes "Giearth Card.";
- set god_brising,50;
- getitem "Giearth_Card",1;
- }
- else if ((@card > 810) && (@card < 816))
- {
- mes "Frilldora Card.";
- set god_brising,50;
- getitem "Frilldora_Card",1;
- }
- else if ((@card > 815) && (@card < 831))
- {
- mes "Swordfish Card.";
- set god_brising,50;
- getitem "Sword_Fish_Card",1;
- }
- else if ((@card > 830) && (@card < 841))
- {
- mes "Munak Card.";
- set god_brising,50;
- getitem "Munak_Card",1;
- }
- else if ((@card > 840) && (@card < 851))
- {
- mes "Kobold Card.";
- set god_brising,50;
- getitem "Kobold_Card",1;
- }
- else if ((@card > 850) && (@card < 861))
- {
- mes "Skel Worker Card.";
- set god_brising,50;
- getitem "Skel_Worker_Card",1;
- }
- else if ((@card > 860) && (@card < 871))
- {
- mes "Obeaune Card.";
- set god_brising,50;
- getitem "Obeaune_Card",1;
- }
- else if ((@card > 870) && (@card < 881))
- {
- mes "Archer Skeleton Card.";
- set god_brising,50;
- getitem "Archer_Skeleton_Card",1;
- }
- else if ((@card > 880) && (@card < 891))
- {
- mes "Marse Card.";
- set god_brising,50;
- getitem " Marse_Card",1;
- }
- else if ((@card > 890) && (@card < 901))
- {
- mes "Zenorc Card.";
- set god_brising,50;
- getitem "Zenorc_Card",1;
- }
- else if ((@card > 900) && (@card < 906))
- {
- mes "Matyr Card.";
- set god_brising,50;
- getitem "Matyr_Card",1;
- }
- else if ((@card > 905) && (@card < 921))
- {
- mes "Dokebi Card.";
- set god_brising,50;
- getitem "Dokebi_Card",1;
- }
- else if ((@card > 920) && (@card < 931))
- {
- mes "Pasana Card.";
- set god_brising,50;
- getitem "Pasana_Card",1;
- }
- else if ((@card > 930) && (@card < 941))
- {
- mes "Sohee Card.";
- set god_brising,50;
- getitem "Sohee_Card",1;
- }
- else if ((@card > 940) && (@card < 951))
- {
- mes "Sandman Card.";
- set god_brising,50;
- getitem "Sand_Man_Card",1;
- }
- else if ((@card > 950) && (@card < 956))
- {
- mes "Whisper Card.";
- set god_brising,50;
- getitem "Whisper_Card",1;
- }
- else if ((@card > 965) && (@card < 971))
- {
- mes "Horong Card.";
- set god_brising,50;
- getitem "Horong_Card",1;
- }
- else if ((@card > 970) && (@card < 981))
- {
- mes "Requiem Card.";
- set god_brising,50;
- getitem "Requiem_Card",1;
- }
- else if ((@card > 980) && (@card < 986))
- {
- mes "Marc Card.";
- set god_brising,50;
- getitem "Marc_Card",1;
- }
- else if ((@card > 985) && (@card < 991))
- {
- mes "Mummy Card.";
- set god_brising,50;
- getitem "Mummy_Card",1;
- }
- else if ((@card > 990) && (@card < 996))
- {
- mes "Verit Card.";
- set god_brising,50;
- getitem "Verit_Card",1;
- }
- else if ((@card > 995) && (@card < 1001))
- {
- mes "Myst Card.";
- set god_brising,50;
- getitem "Myst_Card",1;
- }
- else if ((@card > 1000) && (@card < 1011))
- {
- mes "Jakk Card.";
- set god_brising,50;
- getitem "Jakk_Card",1;
- }
- else if ((@card > 1010) && (@card < 1021))
- {
- mes "Ghoul Card.";
- set god_brising,50;
- getitem "Ghoul_Card",1;
- }
- else if ((@card > 1020) && (@card < 1031))
- {
- mes "Strouf Card.";
- set god_brising,50;
- getitem "Strouf_Card",1;
- }
- else if ((@card > 1030) && (@card < 1041))
- {
- mes "Marduk Card.";
- set god_brising,50;
- getitem "Marduk_Card",1;
- }
- else if ((@card > 1040) && (@card < 1051))
- {
- mes "Marionette Card.";
- set god_brising,50;
- getitem "Marionette_Card",1;
- }
- else if ((@card > 1050) && (@card < 1061))
- {
- mes "Here is an Argiope Card.";
- set god_brising,50;
- getitem "Argiope_Card",1;
- }
- else if ((@card > 1060) && (@card < 1071))
- {
- mes "Hunter Fly Card.";
- set god_brising,50;
- getitem "Hunter_Fly_Card",1;
- }
- else if ((@card > 1070) && (@card < 1081))
- {
- mes "Here is an Isis Card.";
- set god_brising,50;
- getitem "Isis_Card",1;
- }
- else if ((@card > 1080) && (@card < 1091))
- {
- mes "Sidewinder Card.";
- set god_brising,50;
- getitem "Side_Winder_Card",1;
- }
- else if ((@card > 1090) && (@card < 1101))
- {
- mes "Walking Petite Card.";
- set god_brising,50;
- getitem "Petit_Card",1;
- }
- else if ((@card > 1100) && (@card < 1111))
- {
- mes "Bathory Card.";
- set god_brising,50;
- getitem "Bathory_Card",1;
- }
- else if ((@card > 1110) && (@card < 1121))
- {
- mes "Flying Petite Card.";
- set god_brising,50;
- getitem "Petit__Card",1;
- }
- else if ((@card > 1120) && (@card < 1131))
- {
- mes "Deviruchi Card.";
- set god_brising,50;
- getitem "Deviruchi_Card",1;
- }
- else if ((@card > 1130) && (@card < 1141))
- {
- mes "Medusa Card.";
- set god_brising,50;
- getitem "Medusa_Card",1;
- }
- else if ((@card > 1140) && (@card < 1151))
- {
- mes "Deviace Card.";
- set god_brising,50;
- getitem "Deviace_Card",1;
- }
- else if ((@card > 1150) && (@card < 1161))
- {
- mes "Minorous Card.";
- set god_brising,50;
- getitem "Minorous_Card",1;
- }
- else if ((@card > 1160) && (@card < 1171))
- {
- mes "Nightmare Card.";
- set god_brising,50;
- getitem "Nightmare_Card",1;
- }
- else if ((@card > 1170) && (@card < 1176))
- {
- mes "Baphomet Jr. Card.";
- set god_brising,50;
- getitem "Baphomet__Card",1;
- }
- else if ((@card > 1175) && (@card < 1181))
- {
- mes "Raydric Card.";
- set god_brising,50;
- getitem "Daydric_Card",1;
- }
- else if ((@card > 1180) && (@card < 1186))
- {
- mes "Khalitzburg Card.";
- set god_brising,50;
- getitem "Khalitzburg_Card",1;
- }
- else if ((@card > 1185) && (@card < 1191))
- {
- mes "Joker Card.";
- set god_brising,50;
- getitem "Joker_Card",1;
- }
- else if ((@card > 1190) && (@card < 1196))
- {
- mes "Abysmal Knight Card.";
- set god_brising,50;
- getitem "Knight_Of_Abyss_Card",1;
- }
- else if ((@card > 1195) && (@card < 1201))
- {
- mes "Druid Card.";
- set god_brising,50;
- getitem "Evil_Druid_Card",1;
- }
- else if ((@card > 1200) && (@card < 1206))
- {
- mes "Santa Poring Card.";
- set god_brising,50;
- getitem "Poring__Card",1;
- }
- else
- {
- mes "Poring Card.";
- set god_brising,50;
- getitem "Poring_Card",1;
- }
- next;
- mes "[Enrico Kaili]";
- mes "Please accept this as my way of thanking you for assisting in my research.";
- next;
- mes "[Enrico Kaili]";
- mes "If the opportunity arises, I would like to ask you for your help once again. Now please, take care.";
-
- if ($God3 < 100) set $God3,$God3 +1;
-
- if ($God3 == 50) announce "The 3rd Seal of [Brisingamen] has appeared.",bc_all;
- else if ($God3 == 100)
- {
- if ($God1 == 100 && $God2 == 100 && $God3 == 100 && $God4 == 100) announce "All 4 Seals of [Brisingamen] have been released.",bc_all;
- else announce "A Seal of [Brisingamen] has been released.",bc_all;
- }
- close;
- }
- else if(god_brising == 48)
- {
- mes "[Enrico Kaili]";
- mes "Why are you still here?";
- mes "I asked you to go find him.";
- mes "Ah~ I cannot wait...";
- emotion e_flash;
- close;
- }
- else if(god_brising == 47)
- {
- mes "[Enrico Kaili]";
- mes "I guess that's true that the four have been awakened. Does this mean that Brisingamen can now be created?";
- next;
- mes "[Enrico Kaili]";
- mes "If such a thing is possible, what do we need in order to create it? Let's review the information you've gathered...";
- next;
- mes "[Enrico Kaili]";
- mes "There's Freya's Tear Drop Crystal, Freya's Jewel, the Never-Melting Snow Crystal found where Alfrik used to stay...";
- next;
- mes "[Enrico Kaili]";
- mes "The Drifting Air from the path where Dvalin slept. Hmm.";
- next;
- mes "[Enrico Kaili]";
- mes "Perhaps we could find something from the pond of Freya's Gold Tears where Berling is sleeping, though I am unsure.";
- next;
- mes "[Enrico Kaili]";
- mes "I also assume that the splendid Silver Ornament constructed by Gher is also needed to create Brisingamen.";
- next;
- mes "[Enrico Kaili]";
- mes "So what";
- mes "do you think?";
- next;
- menu "I'm not sure...",-,"I suppose you're right.",L_Right;
- mes "[" + strcharinfo(0) + "]";
- mes "I...";
- mes "I mean, maybe Alfrik would probably know, bu--";
- next;
- mes "[Enrico Kaili]";
- mes "Of course!";
- mes "That's a great idea! I'll wait here while you go and ask Alfrik. You're my only hope in completing this research!";
- next;
- emotion e_hmm,1;
- mes "[" + strcharinfo(0) + "]";
- mes "(^333333I should've not said anything...^000000)";
- next;
- mes "[Enrico Kaili]";
- mes "Well, what are";
- mes "waiting for? Please";
- mes "come back as soon as";
- mes "possible.";
- set god_brising,48;
- close;
-
- L_Right:
- mes "[" + strcharinfo(0) + "]";
- mes "I suppose";
- mes "you're right.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Still, who knows what exactly is in the Pond of Frey's Golden Tears.";
- next;
- mes "[Enrico Kaili]";
- mes "Yes.";
- mes "Ah! Right.";
- mes "Hm, perhaps it would be best to ask Alfrik first?";
- next;
- mes "[Enrico Kaili]";
- mes "Hurry and seek him";
- mes "out! And I thank you";
- mes "in advance.";
- set god_brising,48;
- close;
- }
- else if(god_brising == 46)
- {
- mes "[Enrico Kaili]";
- mes "I guess he finally sang for you? By the way, why didn't you speak to Grer the Dwarf? Oh right, the mine is heavily populated with monsters.";
- next;
- mes "[Enrico Kaili]";
- mes "I know it won't be easy, but please seek him out and get more information.";
- mes "Thank you in advance.";
- close;
- }
- else if(god_brising == 45)
- {
- mes "[Enrico Kaili]";
- mes "Hm...?";
- mes "Did you forget the words to the song? Well, I didn't write them down either. Hahahaha! I guess there's only one thing you can do~";
- next;
- mes "[Enrico Kaili]";
- mes "You've got to go back to Berling and ask him for the lyrics again. Good luck, and don't forget to memorize them this time.";
- close;
- }
- else if(god_brising == 44)
- {
- mes "[Enrico Kaili]";
- mes "It looks like you were able to answer that riddle. Good work!";
- next;
- mes "[Enrico Kaili]";
- mes "That strange, unearthly feeling of dampness. Ah, you've brought Freya's Tear Drops! That means Grer must have awakened on his own now.";
- next;
- mes "[Enrico Kaili]";
- mes "I suppose your next course of action should be to enter the mine. I'm sorry for the trouble, but I grow more excited with each new thing we learn.";
- next;
- mes "[Enrico Kaili]";
- mes "It's only with your help that I've been able to make such progress with my research. Anyway, I shall share my conclusions with you later.";
- next;
- mes "[Enrico Kaili]";
- mes "So are you heading for the mine now? Be careful around those monsters.";
- close;
- }
- else if(god_brising == 43)
- {
- mes "[Enrico Kaili]";
- mes "Oh...I have not waited in vain.";
- mes "I guess Dvalin meant the endless war by the riddle.";
- next;
- mes "[Enrico Kaili]";
- mes "There were two kings. Each king had 20 knights.";
- mes "Those knights fought until they died and revived to fight again.";
- mes "They repeated the endless war over and over again.";
- next;
- mes "[Enrico Kaili]";
- mes "If they gathered and occurred a war again,";
- mes "there would be enormous dead in the battlefield.";
- mes "Valkyries selected the strongest";
- mes "among warriors in Valhala to organize Einherjar.";
- next;
- mes "[Enrico Kaili]";
- mes "Yes, that's an old story that everyone knows.";
- mes "...and it turned out to be true.";
- mes "Interesting.";
- mes "Anyways...";
- next;
- mes "[Enrico Kaili]";
- mes "I guess it is the time to investigate the story about Berling.";
- mes "There is a stream that starts from north west of Prontera";
- mes "and passes a mine in Mountain Mjolnir.";
- mes "I assume that maybe Berling meant the place.";
- mes "However, stream never stays in a place...";
- mes "he might meant a puddle instead of stream...";
- next;
- mes "[Enrico Kaili]";
- mes "I am so confused.";
- mes "I wonder what the riddle means as well...";
- mes "Anyways, come back as soon as possible!";
- close;
- }
- else if(god_brising == 42)
- {
- mes "[Enrico Kaili]";
- mes "Are you sure?!";
- mes "Were they really for Freya's Necklace...";
- mes "Brisingamen...?!";
- next;
- mes "[Enrico Kaili]";
- mes "If the four dwarves wake up...";
- mes "would Brisingamen appear to people's eyes?!";
- mes "Ah...you...God must send you to me for the research.";
- next;
- mes "[Enrico Kaili]";
- mes "...I cannot believe that I might be able to experience the power of God...";
- mes "Ah......";
- mes ".....anyway...the place where Dvalin is sleeping...";
- next;
- mes "[Enrico Kaili]";
- mes "It says the patch is at the east forest...";
- mes "....I assume maybe it is near the monastic vows...";
- mes "......Ah, it is just my assumption. We don't know until we go find out...";
- next;
- mes "[Enrico Kaili]";
- mes "I hope you can help me for that.";
- mes "I am still not sure about what the research will lead us but";
- mes "I know you want to find out as much as I do.";
- mes "Hahahaha ha...";
- next;
- mes "[Enrico Kaili]";
- mes "Please leave to the monastic vows in the east.";
- mes "The godly power....how it will be to possess it as a human being...?!";
- mes "What if it destroyes the human world....?! Hahahaha...";
- close;
- }
- else if(god_brising == 41)
- {
- mes "[Enrico Kaili]";
- mes "What? What did you just say?";
- mes "You met Alfrik...?";
- mes "Oh my god, you're the chosen one!";
- mes "I cannot believe that legendary Alfrik is still alive...";
- next;
- mes "[Enrico Kaili]";
- mes "Alfrik is one of the four dwarves";
- mes "who made a shining neklace for goddess Freya.";
- mes "Of course, Dvalin is also one of them.";
- mes "Oh my god...";
- mes "I cannot believe we're talking about Brisingamen...";
- next;
- mes "[Enrico Kaili]";
- mes "Now I realise what we have been doing!";
- mes "We have been searching for an item with the power of God!";
- mes "...Dvalin...";
- mes "I am wondering where he is sleeping...";
- next;
- mes "[Enrico Kaili]";
- mes "....by the way,";
- mes "why didn't you ask Alfrik";
- mes "if he knows where Dvalin stays...?";
- mes "Errr...";
- close;
- }
- else if(god_brising == 40)
- {
- mes "[Enrico Kaili]";
- mes "I suggest you to go check Lutie.";
- mes "I am pretty sure you will find a trace of the goddess somewhere.";
- mes "Also you already met Valkyrie.";
- mes "I have no doubt you will find the trace.";
- mes "And...";
- next;
- mes "[Enrico Kaili]";
- mes "I have been thinking about these words...";
- mes "^4d4dff to the steps in";
- mes "to that beautiful hair";
- mes "to those dazzling eyes";
- mes "we gave all of our hearts in^000000";
- next;
- mes "[Enrico Kaili]";
- mes "I have no clue what they means...";
- mes "I seriously started doubting that what I know";
- mes "could be different from the truth.";
- mes "Anyway, I am going to study other stuffs for now.";
- close;
- }
- else if(god_brising == 35)
- {
- mes "[Enrico Kaili]";
- mes "I can tell you have gone through many difficulties.";
- mes "Please come this way.";
- mes "So what did you hear from Hermite?";
- next;
- mes " - You told him what you were told from Hermite -";
- mes " - and from Valkyrie. -";
- next;
- mes "[Enrico Kaili]";
- mes "Great! I cannot believe it actually happened!";
- mes "....hmm....as I guessed";
- mes "it is possible to possess the godly power...";
- next;
- mes "[Enrico Kaili]";
- mes "It is resonant with a thing sent from the royal court";
- mes "for some reason. Now, come closer and look at this.";
- next;
- mes "- Enrico opened a locked chest and -";
- mes "- took out a jewel that was so beautiful to believe its actual existance. -";
- mes "- The jewel dazzling like a tear drop of a goddess -";
- mes "- started responding with the Snow Crystal as it's closer. -";
- next;
- mes "[Enrico Kaili]";
- mes "...so? Isn't it amazing?";
- mes "If what Valkyrie said is true,";
- mes "this jewel must be the crystal of a Freya's tear drop.";
- mes "Hmmmm.....";
- mes "Power of Gods...";
- next;
- mes "[Enrico Kaili]";
- mes "I don't understand why all these indications";
- mes "have appeared in this age...";
- mes "....anyways, I appreciate you for helping me so far.";
- mes "I am going to think about the poem";
- mes "that you have heard from Valkyrie.";
- next;
- mes "[Enrico Kaili]";
- mes "It says...a cold snowy path";
- mes "the blue river that the goddess walked cross";
- mes "a narrow path and four dwarves.";
- next;
- mes "[Enrico Kaili]";
- mes "The four dwarves must mean the four dwarves who were well-known for their craft skill...";
- mes "....I cannot pinpoint what the river and the paths means.";
- next;
- mes "[Enrico Kaili]";
- mes "Now, there is something you can help me again!";
- next;
- menu "Wah? I thought it's already over?",-,"What is it this time?",L_What;
- mes "[Enrico Kaili]";
- mes "Hell no!";
- mes "You are supposed to help me for my research, aren't you?";
- mes "Unfortunately, my research has never been over.";
- mes "Hahahaha.";
- next;
- mes "[Enrico Kaili]";
- mes "Now, you are going to leave to Lutie!";
- mes "Find out some clues there.";
- mes "The legend says,";
- next;
- mes "[Enrico Kaili]";
- mes "Goddess had to walk on the cold snowy path alone";
- mes "without the cat of obedience.";
- mes "She shed tears because of piercing cold.";
- next;
- mes "[Enrico Kaili]";
- mes "As a matter of fact, this Freya's Jewel was";
- mes "firstly founded in Lutie.";
- mes "That shows the legend tells us the truth by indicating the cold snowy path.";
- next;
- mes "[Enrico Kaili]";
- mes "Please go start your journey to find the trace of goddess";
- mes "from Lutie, as what Valkyrie said.";
- mes "I hope we will find out what the goddess";
- mes "left in this world together.";
- set god_brising,40;
- close;
-
- L_What:
- mes "[Enrico Kaili]";
- mes "Hahahaha...I like your attitute!";
- mes "Yes, Nelliorde has an eye to see a man.";
- mes "Somehow you decided to help me out";
- mes "for this research, I hope you will do your best";
- mes "until the last moment.";
- next;
- mes "[Enrico Kaili]";
- mes "Now, you are going to leave to Lutie!";
- mes "Find out some clues there.";
- mes "The legend says,";
- next;
- mes "[Enrico Kaili]";
- mes "Goddess had to walk on the cold snowy path alone";
- mes "without the cat of obedience.";
- mes "She shed tears because of piercing cold.";
- next;
- mes "[Enrico Kaili]";
- mes "As a matter of fact, this Freya's Jewel was";
- mes "firstly founded in Lutie.";
- mes "That shows the legend tells us the truth by indicating the cold snowy path.";
- next;
- mes "[Enrico Kaili]";
- mes "Please go start your journey to find the trace of goddess";
- mes "from Lutie, as what Valkyrie said.";
- mes "I hope we will find out what the goddess";
- mes "left in this world together.";
- set god_brising,40;
- close;
- }
- else if(god_brising > 9 && god_brising < 35)
- {
- mes "[Enrico Kaili]";
- mes "Hmm... I see...";
- mes "I know that I have been such a burden to you.";
- mes "But I will not forget what you have done for me.";
- mes "I will give you one of my precious collections";
- mes "as the token of my gratitude.";
- next;
- mes "[Enrico Kaili]";
- mes "I wish you good luck.";
- mes "And please take care.";
- close;
- }
- else if(god_brising > 3 && god_brising < 10)
- {
- mes "[Enrico Kaili]";
- mes "So, have you met Hermite?";
- mes "What...? Did he really ask you to do that...?";
- mes "....hmmm....I must say...I know it's not an easy thing to do";
- mes "but I hope you will do what he wants.";
- mes "And I will next; for a good news from you for the time being.";
- close;
- }
- else if(god_brising == 3)
- {
- mes "[Enrico Kaili]";
- mes "Hermite? Do you need any information about him?";
- mes "Let me think. Hmm...in my memory";
- mes "he was a young man in an urban atmosphere...";
- next;
- mes "[Enrico Kaili]";
- mes "Oh, that's right! Why don't you go ask";
- mes "the lady ahead?";
- mes "She might have some registration information.";
- next;
- mes "[Enrico Kaili]";
- mes "What? Are you wondering why I don't do it on my own?";
- mes "Because! I am too old to go on an expedition...";
- mes "and also I have some research requests from the royal court.";
- mes "I am not supposed to leave this organization.";
- mes "That was why I had sought";
- mes "for a young and reliable adventurer like you";
- mes "who can do what I am unable to do.";
- next;
- mes "[Enrico Kaili]";
- mes "Ah...of course I will reward you later.";
- mes "Do not think of me as a penny pincher";
- mes "who does not like to 'Hire' professionals.";
- mes "Anyways, thank you in advance.";
- close;
- }
- else if(god_brising == 2)
- {
- mes "[Enrico Kaili]";
- mes "So, have you considered my proposal?";
- mes "If this thing works out,";
- mes "I will pay you back.";
- mes "What do you say?";
- next;
- menu "No, thanks.",-,"Sure, why not.",L_Sure;
- mes "[Enrico Kaili]";
- mes "What...?! You are too mean!";
- mes "Why did you even get bothered to speak to me";
- mes "when you don't want to help me?";
- mes "I do not wish to talk to you.";
- mes "Please leave.";
- close;
- L_Sure:
- mes "[Enrico Kaili]";
- mes "Are you sure you want to help me?";
- mes "That's great.";
- mes "Before we start, would like to see this thing first?";
- next;
- mes "- The old scholar showed you -";
- mes "- a small white crystallization within a box. -";
- mes "- It looked very thin and freezing cold. -";
- next;
- mes "[Enrico Kaili]";
- mes "This is the snow crystal...";
- mes "at least that's what I think.";
- mes "Look at this shape and texture.";
- mes "Doesn't it look like a snow flake?";
- mes "The strange thing is...this never gets molten.";
- next;
- mes "[Enrico Kaili]";
- mes "Few years ago, a young adventurer gave me this.";
- mes "I have not figured out what actually this is...";
- mes "I want to know what this is and where it came from.";
- next;
- mes "[Enrico Kaili]";
- mes "Yes, I am looking for a person.";
- mes "The person who brought me this Snow Crystal.";
- mes "Let me check his name...yes, here it is.";
- mes "His name is ...Hermite Charles.";
- next;
- mes "[Enrico Kaili]";
- mes "When you find him,";
- mes "please give him this letter.";
- next;
- mes "^4d4dff - Enrico gave you -";
- mes "- a thin letter sealed with red wax. -";
- mes "- 'Dear Hermite Charles' was written on the front.-";
- set god_brising,3;
- close;
- }
- else if(god_brising == 1)
- {
- mes "[Enrico Kaili]";
- mes "How are you...ah! It is you, " + strcharinfo(0) + "!";
- mes "Yes, I was told by Nelliorde that you will visit me.";
- mes "He always tells me that he will";
- mes "a good assistance for my research.";
- mes "So, how was your travel?";
- next;
- mes "[Enrico Kaili]";
- mes "Hahaha, I guess you would not have a hard time to come";
- mes "to Juno...since there are various convenience travelling";
- mes "methods as warp portal and kafra teleport service!";
- mes "So, how was my joke? Hahahaha!";
- next;
- mes "[Enrico Kaili]";
- mes "As you were told by Nelliorde,";
- mes "I would like to ask you to help my research...";
- mes "specifically finding a person.";
- next;
- mes "[Enrico Kaili]";
- mes "Since you are an adventurer, I assume";
- mes "you like to travel a lot?";
- mes "Why don't you find the person I am looking for";
- mes "during your travel? It is not that hard.";
- mes "And I was told by Nelliorde that";
- mes "you are a pretty well-experienced adventurer.";
- next;
- menu "I am no good at finding people.",-,"I can do that!",L_Ok;
- mes "[Enrico Kaili]";
- mes "......bah...";
- mes "I was convinced that you would help me for sure...";
- mes "...but I understand if you don't want to do it.";
- mes "I can find another adventurer.";
- mes "...sigh...if I was a little bit younger,";
- mes "I would not have to ask a favor...";
- next;
- mes "[Enrico Kaili]";
- mes "I see. But if you change your mind later";
- mes "please come back.";
- mes "And I am so sorry to make you travel this far.";
- mes "Take care.";
- set god_brising,2;
- close;
- L_Ok:
- mes "[Enrico Kaili]";
- mes "Are you sure you want to help me?";
- mes "That's great.";
- mes "Before we start, would like to see this thing first?";
- next;
- mes "- The old scholar showed you -";
- mes "- a small white crystallization within a box. -";
- mes "- It looked very thin and freezing cold. -";
- next;
- mes "[Enrico Kaili]";
- mes "This is the snow crystal...";
- mes "at least that's what I think.";
- mes "Look at this shape and texture.";
- mes "Doesn't it look like a snow flake?";
- mes "The strange thing is...this never gets molten.";
- next;
- mes "[Enrico Kaili]";
- mes "Few years ago, a young adventurer gave me this.";
- mes "I have not figured out what actually this is...";
- mes "I want to know what this is and where it came from.";
- next;
- mes "[Enrico Kaili]";
- mes "Yes, I am looking for a person.";
- mes "The person who brought me this Snow Crystal.";
- mes "Let me check his name...yes, here it is.";
- mes "His name is ...Hermite Charles.";
- next;
- mes "[Enrico Kaili]";
- mes "When you find him,";
- mes "please give him this letter.";
- next;
- mes "^4d4dff - Enrico gave you -";
- mes "- a thin letter sealed with red wax. -";
- mes "- 'Dear Hermite Charles' was written on the front.-";
- set god_brising,3;
- close;
- }
- else
- {
- mes "[Enrico Kaili]";
- mes "I am not sure what purpose you have in here, but I am busy at this moment.";
- mes "Please leave me with my research.";
- close;
- }
-}
- else
-{
- mes "[Studying Scholar]";
- mes "Do you know how to make red potions?";
- mes "You grind a lot of red herbs";
- mes "and shake the liquid with care until it become a red potion.";
- mes "If I could only shake them faster....";
- mes "I would be able to rich in no time...";
- close;
-}
-
-}
-
-prt_church.gat,113,103,1 script Praying Man 798,{
-
- if($God2 < 50)
-{
- mes "[Praying Man]";
- mes "Let everyone live a life of happiness. Let there be peace in the world...";
- next;
- mes "[Praying Man]";
- mes "May I hit it rich with this Old Blue Box that I spend this month's paycheck on...";
- close;
-}
- if($God3 > 99)
-{
- mes "[Praying Man]";
- mes "Now is the time to reflect upon the past to prepare for the future.";
- next;
- mes "[Praying Man]";
- mes "It is in stillness that we find the wisdom to know which steps we must take to move forward. Let's pray.";
- close;
-}
- if(god_brising > 34)
-{
- mes "^3355FFHermite Charles continues to fervently pray. His eyes are closed and his hands are clasped to his chest. There seems to be an air of faint sadness about him.^000000";
- close;
-}
- else if(god_brising == 34)
-{
- mes "[Hermite Charles]";
- mes "What did you just say? Did she really become an Einherjar? That's the greatest honor for any warrior...";
- next;
- mes "[Hermite Charles]";
- mes "She must be so happy.";
- mes "I guess in the end,";
- mes "I never really had";
- mes "any place in her heart.";
- mes "Lowen...";
- next;
- mes "[Hermite Charles]";
- mes "But I know one thing for sure. She roamed for two years because I made her run away.";
- next;
- mes "[Hermite Charles]";
- mes "She should have blamed me for what happened. Why did she take everything upon herself? It was me...";
- next;
- mes "[Hermite Charles]";
- mes "I guess she just saw me as a little brother. She obviously didn't take me very seriously.";
- next;
- mes "[Hermite Charles]";
- mes "Haha....hahaha...";
- mes "Now I feel better!";
- mes "So, what did you say?";
- next;
- mes "[Hermite Charles]";
- mes "Yes, right.";
- mes "Please tell Enrico this.";
- mes "The object he's interested in was given by His Majesty to a guild that possessed a castle.";
- next;
- mes "[Hermite Charles]";
- mes "It can never be made through just human technology. But I guess that His Majesty will let scholars study it, and let men possess it if they prove capable.";
- next;
- mes "[Hermite Charles]";
- mes "I wasn't powerful enough to earn it. Frankly I stole it. But soon I began to fear its presense and my heart would pound with trepidation when I saw it.";
- next;
- mes "[Hermite Charles]";
- mes "One day, I think it actually possessed me and I ended up going on a journey. I'm not really sure exactly where though...";
- next;
- mes "[Hermite Charles]";
- mes "All I remember was that I was in Lutie, the town of snow. I went over a bridge to a hill to the West...";
- next;
- mes "[Hermite Charles]";
- mes "But once I arrived there, I was seized with this feeling of terror I can't explain.";
- next;
- mes "[Hermite Charles]";
- mes "I ended up running away. That's why I gave it to Mr. Enrico. You can laugh at me for being a coward if you want.";
- next;
- mes "[Hermite Charles]";
- mes "You know everything now.";
- mes "Please leave me alone.";
- mes "^333333*Sigh...*^000000";
- set god_brising,35;
- close;
-}
- else if(god_brising > 19 && god_brising < 34)
-{
- mes "[Hermite Charles]";
- mes "I'll be waiting.";
- mes "For some reason, I believe you'll be able to find some sort of clue about what happened these past two years one of these days.";
- close;
-}
- else if(god_brising == 12)
-{
- mes "[Hermite Charles]";
- mes "Lohen Phelicia?";
- mes "The person I asked you to find is Lowen, not Lohen. Lowen Ellenen.";
- next;
- mes "[Hermite Charles]";
- mes "I'm sorry for the trouble, but I think you better try again.";
- set god_brising,10;
- close;
-}
- else if(god_brising == 11)
-{
- mes "[Hermite Charles]";
- mes "What...?";
- mes "How could you";
- mes "talk to her?!";
- mes "She's dead!";
- next;
- mes "[Hermite Charles]";
- mes "I've heard those rumors, but she's definitely passed away. I was even at her funeral. She can't be alive. That's not true at all.";
- next;
- mes "[Hermite Charles]";
- mes "The last time I saw her alive was in Geffen. Two years after that, I saw her buried in her grave. Didn't I tell you this?";
- next;
- mes "[Hermite Charles]";
- mes "I wanted you to find out what happened in those two years before she died. I wanted to know what led her to her death.";
- next;
- mes "[Hermite Charles]";
- mes "What the hell";
- mes "killed her?!";
- mes "Don't you understand";
- mes "the way I feel?";
- set god_brising,20;
- close;
-}
- else if(god_brising == 10)
-{
- mes "[Hermite Charles]";
- mes "Lowen was a Crusader, a knight in the service of holiness preparing for the Holy War.";
- next;
- mes "[Hermite Charles]";
- mes "I always expected her to become a Knight in the Prontera Chivalry, but suddenly she changed her mind and became a Crusader. I saw her for the last time in Geffen.";
- next;
- mes "[Hermite Charles]";
- mes "I beg you, please learn anything you can about what happened to her.";
- close;
-}
- else if(god_brising == 5)
-{
- set @brising_try,rand(1,4);
- if(@brising_try == 1)
- {
- mes "[Hermite Charles]";
- mes "You're still here.";
- mes "Does that mean you";
- mes "want to hear my";
- mes "story after all?";
- next;
- menu "Yes, I would like to.",-,"No, thanks.",L_NoThx;
- mes "[Hermite Charles]";
- mes "Thank you...";
- mes "Perhaps you're doing this merely out of consideration, but I still appreciate your kindness. The story I will tell you is very old.";
- next;
- mes "[Hermite Charles]";
- mes "Long ago, there was a little boy who never knew his parents. Just to survive, he became a Thief and eventually joined the Rogue Guild.";
- next;
- mes "[Hermite Charles]";
- mes "Without any goals or dreams, his life was pretty aimless. He pretty much only lived so that he could see tomorrow.";
- next;
- mes "[Hermite Charles]";
- mes "However, the little boy met someone who was full of hope and kindess. He admired her and she became his reason for living.";
- next;
- mes "[Hermite Charles]";
- mes "She will never know that the little boy loved her more than anything else. Unlike the boy, her dream was devote her life to God.";
- next;
- mes "[Hermite Charles]";
- mes "Although he never understood that, he knew that he would be happy to just be near her, watching from a distance.";
- next;
- mes "[Hermite Charles]";
- mes "But one day, because of one fatal mistake, he lost her and she never came back.";
- next;
- mes "[Hermite Charles]";
- mes "Ever since, that boy has been coming to the Sanctuary everyday to pray for her safety, even into adulthood.";
- next;
- mes "[Hermite Charles]";
- mes "...";
- mes "......^333333*Sob*^000000";
- mes "Please find";
- mes "her for me.";
- mes "Find Lowen.";
- next;
- mes "[Hermite Charles]";
- mes "I know that Enrico has sent you. I'm guessing he needs something from me. Am I wrong?";
- next;
- mes "[Hermite Charles]";
- mes "I'll do whatever you want if you do what I want you to do. It's simple: find out anything you can about Lowen.";
- next;
- mes "[Hermite Charles]";
- mes "It's doesn't matter how insignificant the traces may be, anything will do. I want to know everything related to her!";
- next;
- menu "Uhhhhh...",-,"Sorry, I can't.",L_Sorry,"When was the last time you saw her?",L_Last;
- mes "[Hermite Charles]";
- mes "Please consider my proposal. If you can find Lowen for me, I'll give you what you want.";
- next;
- mes "[Hermite Charles]";
- mes "Please, I beg you.";
- mes "You are a strong and well-experienced adventurer. Isn't this a simple thing for you to do?";
- next;
- mes "[Hermite Charles]";
- mes "If you've ever dearly loved someone, then you'd know how desperate I am. Please find Lowen for me.";
- next;
- menu "...Alright.",-,"I'm sorry, I don't think I can do it.",L_Think;
- mes "[" + strcharinfo(0) + "]";
- mes "Alright.";
- mes "I'll try my best to find her. Would you tell me more about Lowen?";
- next;
- mes "[Hermite Charles]";
- mes "She is a crusader.";
- mes "The last time I saw her was deep inside Geffen Dungeon.";
- next;
- mes "[Hermite Charles]";
- mes "Long ago, some Crusaders entered the Geffen Dungeon on a monster subjugation expedition.";
- next;
- mes "[Hermite Charles]";
- mes "Please find";
- mes "anything that";
- mes "you can. I beg";
- mes "of you...";
- set god_brising,10;
- close;
- L_Think:
- mes "[Hermite Charles]";
- mes "^333333*Sigh*^000000";
- mes "I understand.";
- mes "But if you don't help me, then Kaili won't get the help he needs...";
- set god_brising,9;
- close;
- L_Sorry:
- mes "[Hermite Charles]";
- mes "You don't understand!";
- mes "If I weren't this much of a coward, I would already have gone out to find out what I could for myself.";
- next;
- mes "[Hermite Charles]";
- mes "I'm not afraid of monsters or dying. It's the fact that she might hate me now. That's what I fear: Lowen's reproach.";
- next;
- mes "[Hermite Charles]";
- mes "I have no idea how she has been and how she would react upon seeing me once more. Go ahead and laugh if you want.";
- mes "how she would react to my appearance.";
- next;
- mes "[Hermite Charles]";
- mes "All I can do for her is just earnestly pray. I had no idea it'd be so horrible not to be able to see her anymore...";
- set god_brising,9;
- close;
- L_Last:
- mes "[Hermite Charles]";
- mes "The last time I saw her was deep inside the Geffen Dungeon.";
- next;
- mes "[Hermite Charles]";
- mes "Although it was created by humans, that dungeon is now cursed and inhabited with horrific monsters.";
- next;
- mes "[Hermite Charles]";
- mes "I'm guessing the Crusaders saw that it was necessary to exterminate the monsters there to keep it from getting even worse.";
- next;
- mes "[Hermite Charles]";
- mes "Lowen accompanied a group of other Crusaders for the good of the people, but I haven't heard from anything about her since...";
- next;
- mes "[Hermite Charles]";
- mes "That was the last time...";
- mes "Please find out anything you can about her...";
- mes "I beg you.";
- set god_brising,10;
- close;
- L_NoThx:
- mes "[Hermite Charles]";
- mes "I misunderstood you.";
- mes "I should have realized that people never really listen unless it's of some benefit to them.";
- next;
- mes "[Hermite Charles]";
- mes "I won't waste any more of your time. I'll accept Kaili's letter and wait until I find someone who'll listen to my story and help me.";
- set god_brising,5;
- close;
- }
- else
- {
- mes "[Hermite Charles]";
- mes "...";
- mes "^333333*Sob...*^000000";
- mes "I'm sorry.";
- mes "I'm so sorry, Lowen.";
- mes "It was all my fault...";
- close;
- }
-}
- else if(god_brising == 4)
-{
- mes "[Hermite Charles]";
- mes "What do you";
- mes "want from me?";
- mes "Were you sent by";
- mes "the Rogue Guild?";
- next;
- mes "[Hermite Charles]";
- mes "Tell them";
- mes "I quit already.";
- mes "Leave me alone!";
- next;
- menu "Leave him alone.",-,"Give him Kaila's Letter.",L_Letter;
- mes "^3355FFYou're not sure why he's so upset, but it doesn't seem to be the best time to try to speak with him. Perhaps later would be better...^000000";
- set god_brising,4;
- close;
- L_Letter:
- mes "[Hermite Charles]";
- mes "Huh...";
- mes "Enrico Kaili.";
- mes "Yeah, I remember";
- mes "him. So what..?";
- next;
- mes "^3355FFHermite nonchalantly tosses the letter back to you.^000000";
- next;
- mes "[Hermite Charles]";
- mes "...";
- mes "^333333*Sigh...*^000000";
- next;
- mes "[Hermite Charles]";
- mes "You...";
- mes "Would you like to";
- mes "listen to my story?";
- next;
- menu "Sure!",-,"I'm busy, actually.",L_Busy;
- mes "[Hermite Charles]";
- mes "Thank you...I know you're just being generous.";
- mes "But still I am glad for your generosity.";
- mes "I am going to tell you an old story.";
- next;
- mes "[Hermite Charles]";
- mes "Long ago, there was a little boy.";
- mes "He lost his parents so there was";
- mes "no home for him. He was just wandering";
- mes "from thie thief guild to that rogue guild";
- mes "...just to survive. He didn't have any goal";
- mes "or any purpose of life other than being alive everyday.";
- next;
- mes "[Hermite Charles]";
- mes "Even so, the little boy";
- mes "had one person who he admired with full of hope.";
- mes ".... ... ";
- next;
- mes "[Hermite Charles]";
- mes "She will never know that";
- mes "the little boy loved her more than anything else.";
- mes "She was totally different from the boy.";
- mes "She had a goal that she would devote her life to God.";
- next;
- mes "[Hermite Charles]";
- mes "...he was just happy...";
- mes "he's just happy for watching her in a distance.";
- mes "One day...";
- mes "because of one mistake, he lost her.";
- next;
- mes "[Hermite Charles]";
- mes "She has never come back.";
- mes "And the boy has been praying for her safety";
- mes "even after he was fully grown up.";
- mes "He always comes to the church and prays for her.";
- next;
- mes "[Hermite Charles]";
- mes "... .. .. .... ... . .";
- mes "...........";
- mes "...";
- next;
- mes "[Hermite Charles]";
- mes "....................";
- mes ".......*sob*.........";
- mes "Please find her for me.";
- mes "...find Lowen for me.......";
- mes "..................*sob*..";
- next;
- mes "[Hermite Charles]";
- mes "You...";
- mes " ";
- mes "I know that Enrico has sent you to me.";
- mes "I guess you must need something from me.";
- mes "......";
- mes "Am I wrong?";
- next;
- mes "[Hermite Charles]";
- mes "....if you do what I want you to do,";
- mes "I will give you what you want.";
- mes "All I want is simple.";
- mes ".......please find Lowen for me.";
- mes "Find anything, anything that are belong to her,";
- mes "her trace and locations where she used to say...";
- mes "I want everything related to her!";
- next;
- menu "... ....umm...",-,"Sorry, I can't.",L_Sorry2,"When was the last time you saw her?",L_Last2;
- mes "[Hermite Charles]";
- mes "....have a heart, I beg you.";
- mes "Please consider my proposal.";
- mes "You find Lowen for me,";
- mes "then I am going to give you what you want.";
- next;
- mes "[Hermite Charles]";
- mes ".......please, I beg you.";
- mes "You are a strong and well-experienced adventurer.";
- mes "Isn't this so easy for you to do?";
- mes "If you have a person in your mind,";
- mes "you will know how desperate I have been.";
- mes "Please, please find Lowen for me.";
- next;
- menu "....alright.",-,"...I am sorry, I don't think I can make it.",L_Think2;
- mes "[" + strcharinfo(0) + "]";
- mes "Alright.";
- mes "I will try my best to find her.";
- mes "Will you tell me more about the lady, Lowen?";
- next;
- mes "[Hermite Charles]";
- mes "She is a crusader.";
- mes "Last time I saw her deep inside of the Geffen dungeon.";
- mes "Long time ago, crusaders went on";
- mes "a monster subjugation to the Geffen dungeon.";
- mes "That was the last time...";
- mes "Please find anything that once used to belong to her...";
- mes "I beg you.";
- set god_brising,10;
- close;
- L_Think2:
- mes "[Hermite Charles]";
- mes "... ... ..";
- mes ".......... .......";
- mes "..........sigh..";
- mes "I understand.";
- mes "Then there will be no help for you now.";
- set god_brising,9;
- close;
- L_Sorry2:
- mes "[Hermite Charles]";
- mes "What a selfish answer!";
- mes "I am this desperate...";
- mes "....if I am not this coward,";
- mes "... .. I would...";
- mes "......";
- mes "I would already go try to find her...";
- next;
- mes "[Hermite Charles]";
- mes "I am not afraid of monsters or anything.";
- mes "But I am for the fact that she might hate me by now...";
- mes "That's what Ifear...";
- mes "I fear that I have no idea how she has been and";
- mes "how she would react to my appearance.";
- next;
- mes "[Hermite Charles]";
- mes "You can mock me as much as you want.";
- mes "Yes, I don't have any guts to do anything.";
- mes "...all I can do for her is";
- mes "....just praying...";
- next;
- mes "[Hermite Charles]";
- mes "I am weak, I am weak.";
- mes "........";
- mes "I had no idea that it would be so horrible not to see her any longer.";
- mes ".....I will continue praying for her.";
- mes "That is all I can do for her at this moment.";
- set god_brising,9;
- close;
- L_Last2:
- mes "[Hermite Charles]";
- mes "She is a crusader.";
- mes "Last time I saw her deep inside of the Geffen dungeon.";
- mes "Long time ago, crusaders went on";
- mes "a monster subjugation to the Geffen dungeon.";
- next;
- mes "[Hermite Charles]";
- mes "The dungeon hidden under the Geffen Tower";
- mes "was so horrible...";
- mes "It must be created by human beings....";
- mes "but now it is conquered by hideous monsters.";
- mes "That place is cursed...that's all I can say.";
- next;
- mes "[Hermite Charles]";
- mes "Maybe that's why other people";
- mes "decided to bring an end to the dreadful place.";
- mes "That's why crusaders went into";
- mes "the dungeon on behalf of other people...";
- next;
- mes "[Hermite Charles]";
- mes "That was the last time...";
- mes "Please find anything that once used to belong to her...";
- mes "I beg you.";
- set god_brising,10;
- close;
- L_Busy:
- mes "[Hermite Charles]";
- mes "....I misunderstood you.";
- mes "I should have realised that people...";
- mes "never listen to other people unless...";
- mes "they have some purpose or they want something from them.";
- next;
- mes "[Hermite Charles]";
- mes "Let's not waste our precious time any longer.";
- mes ".... ... also......";
- mes "I am going to accept Mr. Enrico's letter";
- mes "when I meet a person who is willing to listen to my story";
- mes "and to help me....who is not you.";
- set god_brising,5;
- close;
-}
- else if(god_brising == 3)
-{
- mes "[Sad-looking Man]";
- mes "...";
- mes "^333333*Sob...*^000000";
- mes "I am so";
- mes "sorry, Lowen.";
- mes "It's all fault...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Excuse me.";
- mes "I am looking";
- mes "for someone named...";
- mes "Hermite?";
- next;
- mes "[Hermite Charles]";
- mes "Hm...?";
- mes "Hermite? That's me.";
- mes "But if you don't mind,";
- mes "I want to be alone...";
- next;
- menu "Leave him alone.",-,"Give him Kaili's Letter.",L_Letter2;
- mes "- You were unsure why he's upset - ";
- mes "- but it didn't seem to be a right time to speak to him. -";
- mes "- Let's come back later. -";
- set god_brising,4;
- close;
- L_Letter2:
- mes "[Hermite Charles]";
- mes ".......huh....?!";
- mes "Ah, I remember him.";
- mes "So what..?";
- next;
- mes "- Hermite gave you the letter back - ";
- mes "- as though he didn't care about it. -";
- next;
- mes "[Hermite Charles]";
- mes " .... ... ... ";
- mes " ..... ...... .....";
- mes " .. .. ..*sigh*...";
- next;
- mes "[Hermite Charles]";
- mes " ....... ..........";
- mes "....... .........";
- mes " ....... you..";
- mes "Would you like to listen to my story?";
- next;
- menu "Sure!",-,"No, I am busy.",L_Busy2;
- mes "[Hermite Charles]";
- mes "Thank you...I know you're just being generous.";
- mes "But still I am glad for your generosity.";
- mes "I am going to tell you an old story.";
- next;
- mes "[Hermite Charles]";
- mes "Long ago, there was a little boy.";
- mes "He lost his parents so there was";
- mes "no home for him. He was just wandering";
- mes "from thie thief guild to that rogue guild";
- mes "...just to survive. He didn't have any goal";
- mes "or any purpose of life other than being alive everyday.";
- next;
- mes "[Hermite Charles]";
- mes "Even so, the little boy";
- mes "had one person who he admired with full of hope.";
- mes ".... ... ";
- next;
- mes "[Hermite Charles]";
- mes "She will never know that";
- mes "the little boy loved her more than anything else.";
- mes "She was totally different from the boy.";
- mes "She had a goal that she would devote her life to God.";
- next;
- mes "[Hermite Charles]";
- mes "...he was just happy...";
- mes "he's just happy for watching her in a distance.";
- mes "One day...";
- mes "because of one mistake, he lost her.";
- next;
- mes "[Hermite Charles]";
- mes "She has never come back.";
- mes "And the boy has been praying for her safety";
- mes "even after he was fully grown up.";
- mes "He always comes to the church and prays for her.";
- next;
- mes "[Hermite Charles]";
- mes "... .. .. .... ... . .";
- mes "...........";
- mes "...";
- next;
- mes "[Hermite Charles]";
- mes "....................";
- mes ".......*sob*.........";
- mes "Please find her for me.";
- mes "...find Lowen for me.......";
- mes "..................*sob*..";
- next;
- mes "[Hermite Charles]";
- mes "You...";
- mes " ";
- mes "I know that Enrico has sent you to me.";
- mes "I guess you must need something from me.";
- mes "......";
- mes "Am I wrong?";
- next;
- mes "[Hermite Charles]";
- mes "....if you do what I want you to do,";
- mes "I will give you what you want.";
- mes "All I want is simple.";
- mes ".......please find Lowen for me.";
- mes "Find anything, anything that are belong to her,";
- mes "her trace and locations where she used to say...";
- mes "I want everything related to her!";
- next;
- menu "... ....umm...",-,"Sorry, I can't.",L_Sorry3,"When was the last time you saw her?",L_Last3;
- mes "[Hermite Charles]";
- mes "....have a heart, I beg you.";
- mes "Please consider my proposal.";
- mes "You find Lowen for me,";
- mes "then I am going to give you what you want.";
- next;
- mes "[Hermite Charles]";
- mes ".......please, I beg you.";
- mes "You are a strong and well-experienced adventurer.";
- mes "Isn't this so easy for you to do?";
- mes "If you have a person in your mind,";
- mes "you will know how desperate I have been.";
- mes "Please, please find Lowen for me.";
- next;
- menu "....alright.",-,"...I am sorry, I don't think I can make it.",L_Think3;
- mes "[" + strcharinfo(0) + "]";
- mes "Alright.";
- mes "I will try my best to find her.";
- mes "Will you tell me more about the lady, Lowen?";
- next;
- mes "[Hermite Charles]";
- mes "She is a crusader.";
- mes "Last time I saw her deep inside of the Geffen dungeon.";
- mes "Long time ago, crusaders went on";
- mes "a monster subjugation to the Geffen dungeon.";
- mes "That was the last time...";
- mes "Please find anything that once used to belong to her...";
- mes "I beg you.";
- set god_brising,10;
- close;
- L_Think3:
- mes "[Hermite Charles]";
- mes "... ... ..";
- mes ".......... .......";
- mes "..........sigh..";
- mes "I understand.";
- mes "Then there will be no help for you now.";
- set god_brising,9;
- close;
- L_Sorry3:
- mes "[Hermite Charles]";
- mes "What a selfish answer!";
- mes "I am this desperate...";
- mes "....if I am not this coward,";
- mes "... .. I would...";
- mes "......";
- mes "I would already go try to find her...";
- next;
- mes "[Hermite Charles]";
- mes "I am not afraid of monsters or anything.";
- mes "But I am for the fact that she might hate me by now...";
- mes "That's what Ifear...";
- mes "I fear that I have no idea how she has been and";
- mes "how she would react to my appearance.";
- next;
- mes "[Hermite Charles]";
- mes "You can mock me as much as you want.";
- mes "Yes, I don't have any guts to do anything.";
- mes "...all I can do for her is";
- mes "....just praying...";
- next;
- mes "[Hermite Charles]";
- mes "I am weak, I am weak.";
- mes "........";
- mes "I had no idea that it would be so horrible not to see her any longer.";
- mes ".....I will continue praying for her.";
- mes "That is all I can do for her at this moment.";
- set god_brising,9;
- close;
- L_Last3:
- mes "[Hermite Charles]";
- mes "She is a crusader.";
- mes "Last time I saw her deep inside of the Geffen dungeon.";
- mes "Long time ago, crusaders went on";
- mes "a monster subjugation to the Geffen dungeon.";
- next;
- mes "[Hermite Charles]";
- mes "The dungeon hidden under the Geffen Tower";
- mes "was so horrible...";
- mes "It must be created by human beings....";
- mes "but now it is conquered by hideous monsters.";
- mes "That place is cursed...that's all I can say.";
- next;
- mes "[Hermite Charles]";
- mes "Maybe that's why other people";
- mes "decided to bring an end to the dreadful place.";
- mes "That's why crusaders went into";
- mes "the dungeon on behalf of other people...";
- next;
- mes "[Hermite Charles]";
- mes "That was the last time...";
- mes "Please find anything that once used to belong to her...";
- mes "I beg you.";
- set god_brising,10;
- close;
- L_Busy2:
- mes "[Hermite Charles]";
- mes "....I misunderstood you.";
- mes "I should have realised that people...";
- mes "never listen to other people unless...";
- mes "they have some purpose or they want something from them.";
- next;
- mes "[Hermite Charles]";
- mes "Let's not waste our precious time any longer.";
- mes ".... ... also......";
- mes "I am going to accept Mr. Enrico's letter";
- mes "when I meet a person who is willing to listen to my story";
- mes "and to help me....who is not you.";
- set god_brising,5;
- close;
-}
- else
-{
- mes "[Sad-looking Man]";
- mes "...";
- mes "^333333*Sob...*";
- mes "Lowen...";
- mes "I'm so sorry.";
- mes "It's all my fault.";
- mes "Please be okay...";
- close;
-}
-
-}
-
-prt_castle.gat,80,52,0 script Personnel Record#hiddenbook1 111,{
-
- if($God2 < 50)
-{
- mes "[Librarian]";
- mes "What are you doing now?";
- mes "Don't touch anything, please!";
- close;
-}
-
- if($God3 > 99)
-{
- mes "[Librarian]";
- mes "What are you doing?";
- mes "Don't touch anything!";
- close;
-}
-
- if(god_brising == 26)
-{
- mes "[" + strcharinfo(0) + "]";
- mes "I should read this from the point where I left off...";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "Huh...?";
- mes "What's this mark";
- mes "here at the bottom?";
- mes "A secret?";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "No wonder the librarian seemed to hesitate before saying anything. Now let's see...";
- next;
- set @bookrand,rand(1,3);
- if(@bookrand == 1)
- {
- mes "...(omitted) Lowen, of the 2nd squad, returned to her detachment 3 days after the incident.";
- next;
- mes "A trial was held, and she was judged guilty of fleeing when ordered to fight. Despite the severity of this offense, she was only discharged from the Crusaders and the holy power granted to her was removed...";
- mes "We collected the holy power granted to her...(omitted)";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "She was forced to leave the Crusaders?! That's ridiculous!";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "Did they want to sentence her to death or what? That's almost too cruel. She must have been humiliated...";
- next;
- mes "2 years later after the incident, an expedition team found rusty armor shards, a broken sword and some effects belonging to Lowen Ellenen.";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "However, this information is classified. Officially, Lowen Ellenen died during the mission.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "They thought she brought disgrace to the Crusaders? This sounds messy. Should I try to meet her again?";
- next;
- mes "[Librarian]";
- mes "^666666*Yawn...*^000000";
- mes "What the...?";
- mes "who are you!";
- mes "Get the hell";
- mes "out of here!";
- set god_brising,30;
- close2;
- warp "prt_castle.gat",94,37;
- end;
- }
- else
- {
- mes "[Librarian]";
- mes "^666666*Yawn...*^000000";
- mes "What the...?";
- mes "who are you!";
- mes "Get the hell";
- mes "out of here!";
- close2;
- warp "prt_castle.gat",94,37;
- end;
- }
-}
- else if(god_brising == 25)
-{
- mes "^3355FFYou took the book from the shelf while the librarian was dozing. According to the Crusader Personnel Records, there's only one recruit that was named Lowen Ellenen.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Lowen Ellenen...";
- mes "Member of the";
- mes "2nd squad...";
- mes "Age 22...";
- mes "Female...";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "Became a fugitive?";
- mes "Announced death?";
- mes "This is the same information the soldier told me.";
- next;
- set @bookrand,rand(1,3);
- if(@bookrand == 1)
- {
- mes "[" + strcharinfo(0) + "]";
- mes "...umm let's read again from the page that I read last time.";
- mes "Umm? What is this mark on the bottom?";
- mes "A secret? Ah...now I see why the librarian was hesitating to say something.";
- mes "Let's see...";
- next;
- mes "...(omitted) Lowen in the second squad";
- mes "was sent back to her detachment in 3 days after the accident.";
- mes "In order to interrogate her responsibility on the absence";
- mes "during the mission, a trial was hold.";
- mes "She was supposed to be severely punished";
- mes "however, with a power of the commandant,";
- mes "she was order to be discharged from service.";
- mes "We collected the holy power granted to her...(omitted)";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "...what?! She was taken her ability and forced to be discharged?";
- mes "It was ridiculous.";
- mes "Was she sentenced to death on the trial or what?";
- mes "Jesus christ, that was so mean.";
- mes "...she must feel humiliated when it happened...";
- next;
- mes "...2 years later after the accident,";
- mes "an expedition team found rusty armors, a broken sword and some belongings";
- mes "which were suspected to he Lowen Ellenen's.";
- mes "However, this information was realsed to only members in charge.";
- mes "Officially she died during the mission.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "........ .... did they think she disgraced crusaders?";
- mes "....sounds confusing and messy...";
- mes "Now...what should I do...";
- mes "Should I go ahead and meet her again?";
- next;
- mes "[Librarian]";
- mes "*yawn*...?!";
- mes "What the...who are you!";
- mes "Get the hell out of here!";
- set god_brising,30;
- close2;
- warp "prt_castle.gat",94,37;
- end;
- }
- else
- {
- mes "[Librarian]";
- mes "*yawn*...?!";
- mes "What the...who are you!";
- mes "Get the hell out of here!";
- set god_brising,26;
- mes "["+ strcharinfo(0) +"]";
- mes "(Nuts...!";
- mes "I didn't get";
- mes "to finish reading!)";
- close2;
- warp "prt_castle.gat",94,37;
- end;
- }
-}
- else
-{
- mes "[Librarian]";
- mes "What are you doing here?";
- mes "Don't touch anything!";
- close;
-}
-
-}
-
-//-----------librarian----------------------------------------------------------
-
-prt_castle.gat,84,51,5 script Librarian#2 105,{
-
- if($God2 < 50)
-{
- mes "[Librarian]";
- mes "What are you doing here?";
- mes "Don't touch anything. please!";
- close;
-}
-
- if($God3 > 99)
-{
- mes "[Librarian]";
- mes "What are you doing now?";
- mes "Don't touch anything!";
- close;
-}
-
- if (god_brising > 24 && god_brising < 27)
-{
- mes "[Librarian]";
- mes ".... . ..... ....";
- mes "...........Zzzzz..";
- mes "Zzzz....Zzzzz...";
- next;
- mes "^3355FFThis librarian seems to be deeply asleep. It'd be smarter not to wake him if you want to check the Crusader Personnel Records.^000000";
- close;
-}
- else if(god_brising == 10)
-{
- mes "[Librarian]";
- mes "All confidential personnel records are kept here in the royal library. However, you need authorization for full access.";
- next;
- mes "[Librarian]";
- mes "Did you say that you need to find a person? Please give me that person's name, as well as your relationship with that person.";
- next;
- menu "Lowen, Sibling",-,"Lowen, Spouse",L_Spouse,"Lowen, Enemy",L_Enemy,"Lowen, a Friend",L_Friend;
- if(Sex)
- {
- mes "[Librarian]";
- mes "How dare you lie to the royal librarian!";
- next;
- mes "[Librarian]";
- mes "It says here in the records that Lowen did not have any male siblings!";
- next;
- mes "[Librarian]";
- mes "^333333(Crap! I just disclosed ^666666classified^000000 ^333333info!)^000000.";
- next;
- mes "[Librarian]";
- mes "The Royal Library won't";
- mes "tolerate identity fraud!";
- mes "Please leave!";
- close;
- }
- else
- {
- mes "[Librarian]";
- mes "You're related to Miss Lowen? How have you not received any news about her before?";
- next;
- mes "[Librarian]";
- mes "I see...";
- mes "Separated at birth,";
- mes "that's truly tragic.";
- mes "Okay, let me check.";
- next;
- mes "[Librarian]";
- mes "I feel terrible telling you this, but it's too late to find Lowe Ellenen, according to the records.";
- next;
- mes "[Librarian]";
- mes "During the monster subjugation mission in Geffen dungeon she reportedly disappeared and... um, later pronounced dead.";
- next;
- mes "[Librarian]";
- mes "I'm sorry, but";
- mes "that's all I know.";
- mes "Thank you...";
- set god_brising,11;
- close;
- }
-
- L_Spouse:
- if(Sex)
- {
- mes "[Librarian]";
- mes "Spouse...?";
- mes "Well, I guess you look like a husband. Heh, I've got a girlfriend myself. Well, at least I think so. Anyway...";
- mes "right, give me";
- mes "a minute.";
- next;
- mes "[Librarian]";
- mes "Lowen Ellenen";
- mes "the Crusader, right?";
- mes "I'm so... sorry.";
- mes "You might want";
- mes "to have a seat.";
- next;
- mes "[Librarian]";
- mes "Please listen to me. During the monster subjugation in Geffen Dungeon, she reportedly disappeared. And later, she was pronounced dead.";
- next;
- mes "[Librarian]";
- mes "That's all the information I have, sir. I'm truly sorry for your loss.";
- set god_brising,11;
- close;
- }
- else
- {
- mes "[Librarian]";
- mes "Hmmm...?";
- mes "Spouse?";
- mes "Or ^333333*Ahem*^000000";
- mes "cohabitational partners?";
- next;
- mes "^3355FFThe librarian";
- mes "now seems awfully";
- mes "distracted, as if";
- mes "he were lost in";
- mes "vivid daydream...^000000";
- close;
- }
-
- L_Enemy:
- mes "["+ strcharinfo(0) +"]";
- mes "I'm looking";
- mes "for Ellenen.";
- mes "Lowen Ellenen.";
- mes "My sworn arch-enemy.";
- next;
- mes "[Librarian]";
- mes "Arch-enemy...?";
- mes "Um, uh ^666666*Ahem!*^000000";
- mes "All I can tell you is that there was a Crusader by that name.";
- next;
- mes "[Librarian]";
- mes "I'm sorry, but";
- mes "I can't tell you";
- mes "more than that.";
- next;
- mes "[Librarian]";
- mes "^333333*Cough*^000000";
- mes "^666666Nutcase!^000000";
- close;
-
- L_Friend:
- mes "[Librarian]";
- mes "A friend...?";
- mes "Well, we have record of someone named Lohen Phelica.";
- next;
- mes "[Librarian]";
- mes "He retired from the service a few years ago. I'd like to give you his address, but we don't have any of that information.";
- set god_brising,12;
- close;
-}
- else if(god_brising > 10 && god_brising < 13)
-{
- mes "[Librarian]";
- mes "Now, may";
- mes "I excuse myself?";
- mes "Thank you!";
- close;
-}
- else
-{
- mes "[Librarian]";
- mes "All confidential personnel records are kept here in the royal library. However, you need authorization for full access.";
- close;
-}
-
-}
-
-prontera.gat,260,354,4 script Woman#Rosa Ellenen 101,{
-
- if($God2 < 50)
-{
- mes "[Woman]";
- mes "Hm?";
- mes "What brings";
- mes "you here? It's";
- mes "kind of strange";
- mes "to come just to";
- mes "take a walk.";
- close;
-}
- if($God3 > 99)
-{
- mes "[Woman]";
- mes "Hm?";
- mes "What brings";
- mes "you here? It's";
- mes "kind of strange";
- mes "to come just to";
- mes "take a walk.";
- close;
-}
- if(god_brising > 33)
-{
- mes "[Rosa Ellenen]";
- mes "Are you the one who visited me before? Ah, of course.";
- next;
- mes "[Rosa Ellenen]";
- mes "I'm not sure how to tell you this, but... This is Lowen's grave. Thank you.";
- mes "Ah....I am not sure how I can tell you this...";
- close;
-}
- else if(god_brising == 21)
-{
- mes "[Rosa Ellenen]";
- mes "What are you";
- mes "talking about?";
- mes "A message from Lowen?";
- next;
- mes "[Rosa Ellenen]";
- mes "What?!";
- mes "Why hasn't she";
- mes "gone to heaven yet?";
- next;
- mes "[Rosa Ellenen]";
- mes "I hope you remember everything I'm going to tell you. She should go to heaven now! I still don't understand...";
- next;
- mes "[Rosa Ellenen]";
- mes "And please tell that praying fool that he shouldn't waste his time blaming himself. ^333333*Sigh*^000000 I still don't know why she chose to speak to you.";
- next;
- mes "[Rosa Ellenen]";
- mes "Let me tell you something. Lowen was fencing prodigy. However, she always had trouble enduring the rigorous training and bearing the weight of armor...";
- next;
- mes "[Rosa Ellenen]";
- mes "But she loved fencing and always tried twice as hard to develop her physical strength so that she could serve God in battle.";
- next;
- mes "[Rosa Ellenen]";
- mes "Finally, she became a Crusader. For a while things were great. But then she suddenly disappeared while on a mission to Geffen Dungeon.";
- next;
- mes "[Rosa Ellenen]";
- mes "Two years later, she was buried in this grave after her body was found by some adventurers. I was given the broken shards of armor and a blood stained ribbon she left behind.";
- next;
- mes "[Rosa Ellenen]";
- mes "I never really learned what exactly happened. And Hermite was always following her like she was his real sister. Ever since she died, he's changed. I hope he doesn't hurt himself...";
- next;
- mes "[Rosa Ellenen]";
- mes "But something suspicious seems to have happened in the military, but they won't even talk to me about it.";
- next;
- mes "[Rosa Ellenen]";
- mes "In the end, I gave up trying to find the truth. After all, nothing can bring her back...";
- next;
- mes "[Rosa Ellenen]";
- mes "If you meet her again,";
- mes "please tell her I'm fine and that I hope her soul passes from this realm into heaven.";
- set god_brising,25;
- close;
-}
- else if(god_brising > 9 && god_brising < 20)
-{
- mes "[Rosa Ellenen]";
- mes "This is my little";
- mes "sister's grave...";
- mes "Her name was Lowen.";
- next;
- mes "[Rosa Ellenen]";
- mes "Are you a friend of Lowen's? Hm? The man in the Sanctuary? That must be Hermite.";
- next;
- mes "[Rosa Ellenen]";
- mes "He was shocked when Lowen died, but he doesn't have to blame himself for her death. I don't want him to suffer from the guilt.";
- next;
- mes "[Rosa Ellenen]";
- mes "Anyway, thank you for visiting my little sister. It's good to know she has friends, even after she's passed on.";
- set god_brising,11;
- close;
-}
- else
-{
- mes "[Rosa Ellenen]";
- mes "Oh hello...";
- mes "Have you come";
- mes "to pay your respects";
- mes "to someone here as well?";
- close;
-}
-
-}
-
-prontera.gat,262,353,0 script Gravestone 111,{
-
- if($God2 > 49)
-{
- if(god_brising > 33)
- {
- mes "Lowen Ellenen";
- mes " ";
- mes " XXXX. XX. XX.";
- mes "";
- mes " Her noble spirit";
- mes "was sent to the holy place";
- mes " by will of the Valkyrie.";
- close;
- }
- else
- {
- mes "^3355FFYou couldn't read the rest of the epitaph since the tombstone has been eroded.^000000";
- close;
- }
-}
- else
-{
- mes "^3355FFIt's just an";
- mes "ordinary gravestone.^000000";
- next;
- mes "^3355FFNothing really";
- mes "sets it apart from the rest of the tombstones here in the Prontera cemetary.^000000";
- close;
-}
-
-}
-
-gef_dun01.gat,89,192,0 script #lowentrace 111,3,3,{
-
- if($God2 < 50)
-{
- mes "^3355FFIt's just an old,";
- mes "dry piece of wood.^000000";
- close;
-}
- if($God3 > 99)
-{
- mes "^3355FFIt's just an old,";
- mes "dry piece of wood.^000000";
- close;
-}
- if (god_brising > 20 && god_brising < 34)
-{
- mes "Will you";
- mes "summon her? ";
- next;
- menu "Yes",-,"No",L_No;
- input @lowenstring$;
- if(@lowenstring$ == "Lowen")
- {
- if(god_brising == 30)
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8B...Y-you're...";
- mes "I-I can't stay long,";
- mes "I'm feeling too weak.";
- mes "Come closer, I want";
- mes "to show you something...^000000";
- next;
- mes "^3355FFHer voice grew";
- mes "softer and softer";
- mes "until you could no";
- mes "longer hear her.^000000";
- close;
- }
- else if(god_brising == 21)
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8BPlease tell Rosa";
- mes "not to worry about me anymore. You might be able to find her beside my grave. I don't want her to suffer anymore...^000000";
- close;
- }
- else if(god_brising == 25)
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8BYou've come back.";
- mes "Have you met Rosa?";
- mes "Hm, yes, it sounds like she'd say that. But thank you for sending her my message.^000000";
- next;
- mes "[Lowen Ellenen]";
- mes "^6E7B8BAh, it's too dangero--";
- mes "This place is too dangerous for you. I hate myself for not being able to help protect you from these evil creatures. Please be careful...^000000";
- close;
- }
- else
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8BMy spirit is";
- mes "growing weaker...";
- mes "Please be careful...";
- mes "This place is too dangerous.^000000";
- close;
- }
- }
- else
- {
- close;
- }
- L_No:
- close;
-}
- else if(god_brising == 20)
-{
- mes "[The voice of a female]";
- mes "^6E7B8BI-It's dangerous...";
- mes "Be careful...^000000";
- next;
- menu "Ignore it.",-,"What are you talking about?",L_What;
- close;
- L_What:
- mes "[The voice of a female]";
- mes "^6E7B8B...No way...";
- mes "You can hear me?";
- mes "I can't believe this.";
- mes "It's impossible. But if you don't mind, may I talk to you...?^000000";
- mes "can I talk to you for a while?";
- next;
- menu "Holy...! Run!",-,"What are you?!",L_Who;
- close;
- L_Who:
- mes "[The voice of a female]";
- mes "^6E7B8BI...";
- mes "I don't have my body anymore, so... I think I'm a ghost. Yes, I've been wandering in this place ever since I got here.^000000";
- next;
- mes "[The voice of a female]";
- mes "^6E7B8BI'm still not sure why I'm bound to this realm. If you don't mind, would you visit my sister for me?";
- next;
- mes "[The voice of a female]";
- mes "^6E7B8BPlease tell her...";
- mes "Please tell her that her little sister Lowen is fine.^000000";
- next;
- mes "[The voice of a female]";
- mes "^6E7B8BUm...";
- mes "If you want to meet me again, just say my name out loud. '^000000Lowen^6E7B8B.'^000000";
- set god_brising,21;
- close;
-}
- else
-{
- mes "^3355FFYou find a piece of twisted, dry wood. Looking at it seems to bring out a feeling of sadness within you for some reason.^000000";
- close;
-}
-
-OnTouch:
- if(god_brising > 9 && god_brising < 34)
-{
- emotion e_gasp;
- end;
-}
-
-}
-
-gef_dun01.gat,203,48,0 script #lowentrace1 111,3,3,{
-
- if($God2 < 50)
-{
- mes "^3355FFIt's just an old,";
- mes "dry piece of wood.^000000";
- close;
-}
-
- if($God3 > 99)
-{
- mes "^3355FFIt's just an old,";
- mes "dry piece of wood.^000000";
- close;
-}
-
- if(god_brising > 20 && god_brising < 34)
-{
- mes "Would you";
- mes "like to summon her? ";
- next;
- menu "Yes",-,"No",L_No;
- input @lowenstring$;
- if(@lowenstring$ == "Lowen")
- {
- if(god_brising == 31)
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8BYou came back!";
- mes "You'll be with me";
- mes "...Won't you?^000000";
- next;
- menu "Of course.",-,"Sorry, I don't think I can...",L_Sorry;
- mes "[Lowen Ellenen]";
- mes "^6E7B8BThank you,";
- mes "thank you so much...^000000";
- close2;
- warp "que_god02.gat",47,53;
- end;
- L_Sorry:
- mes "[Lowen Ellenen]";
- mes "^6E7B8BI understand.";
- mes "Please take";
- mes "care of yourself...^000000";
- close;
- }
- else if(god_brising == 30)
- {
- mes "[Lowen Ellenen]";
- mes "^6E7B8BAh yes. This is it.";
- mes "You look very curious about me, yet I am amazed that you can hear my voice. Please let me tell you an old story.^000000";
- close2;
- warp "que_god02.gat",47,53;
- end;
- }
- else if(god_brising == 25)
- {
- mes "[Lowen Ellenen]";
- mes "You came back.";
- mes "....have you met Rosa?";
- mes "...yes...I expected her to say so.....";
- mes "Thank you for sending my message to her.";
- mes "....I wish I could do what she wants me to do...";
- next;
- mes "[Lowen Ellenen]";
- mes "Ah...it's too danger.";
- mes "This place is too dangerous for you.";
- mes "I hate myself for not protecting you from evil creatures.";
- mes "Please be careful.";
- close;
- }
- else
- {
- mes "[Lowen Ellenen]";
- mes "I hope you will not summon me for fun.";
- mes "And please be careful...this place is too dangerous for you.";
- close;
- }
- }
- else
- {
- close;
- }
- L_No:
- close;
-}
- else if(god_brising == 20)
-{
- mes "[The voice of a female]";
- mes "...it's dangerous...be careful.";
- next;
- menu "Ignore it.",-,"What are you talking about?",L_What;
- close;
- L_What:
- mes "[The voice of a female]";
- mes ".... no way........are you...?";
- mes "Can you hear me?";
- mes "...I can't...believe this..";
- mes "I can't belive this...but if you don't mind";
- mes "can I talk to you for a while?";
- next;
- menu "Sorry, I am busy!",-,"What are you?!",L_Who;
- close;
- L_Who:
- mes "[The voice of a female]";
- mes "Ah, no need to be surprised.";
- mes "Actually I am the one who was surprised.";
- mes "Ah...ah...I don't have a physical form...";
- mes "Err...technically I am a ghost.....";
- mes "Yes, I think I am a ghost.";
- mes "Since when I have been wandering around here.";
- next;
- mes "[Lowen]";
- mes "I don't know why I haven't gone beyond the realm.";
- mes "If you don't mind...I hope you can go visit my sister.";
- mes "And please tell her that I am fine.";
- mes "....tell her that Lowen, her little sister is fine...";
- next;
- mes "[Lowen]";
- mes "If you want to meet me again,";
- mes "please call my name out loud.";
- mes " 'Lowen'...";
- set god_brising,21;
- close;
-}
- else
-{
- mes "- You found a twisted and dry wood. -";
- mes "- It looked dismal but sad at the same time. -";
- close;
-}
-
-OnTouch:
- if (god_brising > 9 && god_brising < 34)
-{
- emotion e_gasp;
- end;
-}
-
-}
-
-que_god02.gat,48,55,3 script Lowen Ellenen 745,{
-
- if(god_brising == 30)
-{
- mes "[Lowen Ellenen]";
- mes "Can you see me now?";
- mes "You must be surprised.";
- mes "This is the story I will share with you.";
- next;
- mes "[Lowen Ellenen]";
- mes "Look around.";
- mes "Recognize it?";
- mes "We're still in the same place, except now we're in my past.";
- next;
- mes "[Lowen Ellenen]";
- mes "All of us came here to Geffen to cleanse this area of evil spirits. You asked for the reason I stayed here?";
- next;
- mes "[Lowen Ellenen]";
- mes "I couldn't forgive myself for what I've done to my comrades. They were killed because of me.";
- next;
- menu "You were cursed...?",-,"You still have something to do.",L_Still;
- mes "["+ strcharinfo(0) +"]";
- mes "You're saying...";
- mes "The anger of your";
- mes "comrades manifested";
- mes "into a curse?";
- next;
- mes "[Lowen Ellenen]";
- mes "Cursed by my fallen comrades... Yes, that's what I thought at first. So I tried to redeem myself as well as avenge their deaths.";
- next;
- mes "[Lowen Ellenen]";
- mes "I have been trying my best to comfort their spirits for 2 years.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Ever since you guys failed on a mission, you've spent two years here killing monsters?";
- next;
- mes "[Lowen Ellenen]";
- mes "Yes, that's right.";
- mes "I thought it would bring comfort to the spirits of my comrades.";
- next;
- mes "[Lowen Ellenen]";
- mes "But once I died, I met all of my old friends in Nifflheim, the town of the dead. You've heard of it, haven't you?";
- next;
- mes "[Lowen Ellenen]";
- mes "No one seemed to blame me for what had happened. In fact, they all seemed worried about me.";
- next;
- menu "Then why?",-;
- mes "[Lowen Ellenen]";
- mes "They waited for me in Nifflheim for two years, since they didn't want me to misunderstand them. They never blamed me for what happened.";
- next;
- mes "[Lowen Ellenen]";
- mes "But I still feel like something is wrong. Out of all of us, I'm the only one unable to rest in peace. Everyone else was selected to go to Valhalla.";
- next;
- mes "[Lowen Ellenen]";
- mes "But Valhalla is where all honorable Crusaders are supposed to go. What have I done wrong?";
- close;
- L_Still:
- mes "[Lowen Ellenen]";
- mes "I don't think I have any unfinished business. But who knows, maybe there is something I have to do.";
- next;
- mes "[Lowen Ellenen]";
- mes "All of my late comrades that I met in Nifflheim were selected by Valkyrie and sent to Valhalla. That's how honorable Crusaders spend the afterlife. But it looks like I don't deserve it...";
- next;
- menu "I can help you!",-;
- mes "[Lowen Ellenen]";
- mes "You can";
- mes "help me?";
- mes "How...?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "You said this is the place where the subjugation mission happened, right? I'll fight with you!";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "Now come on, you deserve to feel guilty like this. Let's think about how we're gonna fight these monsters!";
- next;
- mes "[Lowen Ellenen]";
- mes "...";
- mes "Thank you.";
- mes "Thank you so much.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Now,";
- mes "shall we go in?";
- set god_brising,31;
- close;
-}
- else if(god_brising == 31)
-{
- mes "[Lowen Ellenen]";
- mes "Walk down the stairs ahead. From this point on, I can only travel with you in your mind...";
- close;
-}
- else
-{
- mes "[Lowen Ellenen]";
- mes "How come...";
- mes "You're here?";
- close2;
- warp "geffen.gat",120,101;
- end;
-}
-
-}
-
-que_god02.gat,54,64,4 script Soldier#1_brising 105,1,1,{
-
- if(god_brising == 31)
-{
- mes "[Soldier]";
- mes "Have you volunteered for monster subjugation? Would you like to start the mission now?";
- next;
- menu "Yes.",-,"I need more time.",L_Time;
- mes "[Soldier]";
- mes "We're you're ready,";
- mes "come and stand in";
- mes "front of me.";
- close;
-
- L_Time:
- mes "[Soldier]";
- mes "No problem, just come back when your preparations are completed.";
- close;
-}
- else
-{
- mes "[Soldier]";
- mes "Please back away.";
- mes "You are not permitted";
- mes "to enter!";
- close;
-}
-
-OnTouch:
- if(god_brising == 31)
-{
- warp "que_god02.gat",174,49;
- donpcevent "#brisinsold::OnSold1Off";
- donpcevent "#brisinsold2::OnSold2On";
- end;
-}
- else
-{
- mes "[Soldier]";
- mes "Please back away.";
- mes "You are not permitted";
- mes "to enter!";
- close2;
- warp "que_god02.gat",51,59;
- end;
-}
-
-}
-
-que_god02.gat,55,64,4 script Soldier#2_brising 105,1,1,{
-
- mes "[Soldier]";
- mes "Please back away.";
- mes "You are not permitted";
- mes "to enter!";
- close;
-}
-
-que_god02.gat,1,1,1 script #brisinsold1 -1,{
-
-OnSold1On:
- enablenpc "Soldier#1_brising";
- end;
-
-OnSold1Off:
- disablenpc "Soldier#1_brising";
- end;
-}
-
-que_god02.gat,1,1,1 script #brisinsold2 -1,{
-
-OnInit:
- disablenpc "Soldier#2_brising";
- areawarp "que_god02.gat",100,128,85,3,"geffen.gat",120,100;
- end;
-
-OnSold2On:
- enablenpc "Soldier#2_brising";
- initnpctimer;
- end;
-
-OnTimer420000:
- mapannounce "que_god02.gat","Lowen's spirit is beginning to weaken...",0,0x70DBDB;
- end;
-
-OnTimer480000:
- mapannounce "que_god02.gat","Your presense in her past can't be maintained for much longer...",0,0x70DBDB;
- end;
-
-OnTimer540000:
- mapannounce "que_god02.gat","Lowen's spirit can't keep you in the past any longer.",0,0x70DBDB;
- end;
-
-OnTimer542000:
- areawarp "que_god02.gat",1,1,400,400,"geffen.gat",120,100;
- end;
-
-OnTimer550000:
- donpcevent "#brisinsummon::OnReset";
- end;
-
-OnTimer550500:
- stopnpctimer;
- end;
-
-}
-
-que_god02.gat,1,1,1 script #Warp_brising -1,{
-
-OnWarp:
-
- end;
-}
-
-que_god02.gat,1,1,1 script #brisinsummon -1,{
-
-OnInit:
- disablenpc "#doppelganger1";
- disablenpc "#doppelganger2";
- disablenpc "#knight1";
- disablenpc "#knight2";
- disablenpc "#knight3";
- disablenpc "#lowen";
- disablenpc "Valkyrie#1";
- enablenpc "#hermite";
- end;
-
-OnDoppel1On:
- enablenpc "#doppelganger1";
- end;
-
-OnDoppel1Off:
- disablenpc "#doppelganger1";
- end;
-
-OnDoppel2On:
- enablenpc "#doppelganger2";
- end;
-
-OnDoppel2Off:
- disablenpc "#doppelganger2";
- end;
-
-OnKnight1On:
- enablenpc "#knight1";
- end;
-
-OnKnight2On:
- enablenpc "#knight2";
- end;
-
-OnKnight3On:
- enablenpc "#knight3";
- end;
-
-OnKnight1Off:
- disablenpc "#knight1";
- end;
-
-OnKnight2Off:
- disablenpc "#knight2";
- end;
-
-OnKnight3Off:
- disablenpc "#knight3";
- end;
-
-OnLowenOn:
- enablenpc "#lowen";
- end;
-
-OnLowenOff:
- disablenpc "#lowen";
- end;
-
-OnHermiteOff:
- disablenpc "#hermite";
- end;
-
-OnLowen2Off:
- disablenpc "Lowen Ellenen#2";
- end;
-
-OnSummon:
- attachrid $@BrisinRID$;
- monster "que_god02.gat",34,128,"",1015,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",34,127,"",1015,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",80,127,"",1015,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",102,128,"",1036,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",130,128,"",1036,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",62,128,"",1041,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",64,127,"",1041,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",150,127,"",1041,1,"#brisinsummon::OnMobDeath";
- monster "que_god02.gat",176,127,"",1041,1,"#brisinsummon::OnMobDeath";
- set brisinmobdead,9;
- end;
-
-OnMobDeath:
- set brisinmobdead,brisinmobdead -1;
- if(brisinmobdead > 0) end;
- set god_brising,31;
- enablenpc "Valkyrie#1";
- detachrid;
- end;
-
-OnReset:
- disablenpc "#doppelganger1";
- disablenpc "#doppelganger2";
- disablenpc "#knight1";
- disablenpc "#knight2";
- disablenpc "#knight3";
- disablenpc "#lowen";
- enablenpc "Soldier#1_brising";
- disablenpc "Soldier#2_brising";
- enablenpc "#hermite";
- enablenpc "Lowen Ellenen#2";
- disablenpc "Valkyrie#1";
- killmonster "que_god02.gat","#brisinsummon::OnMobDeath";
-}
-
-que_god02.gat,173,58,4 script #doppelganger1 739,{
-
-OnEmoGasp:
- emotion e_gasp;
- end;
-}
-
-que_god02.gat,175,55,4 script #doppelganger2 739,{
-
-OnCast:
- specialeffect 59;
- end;
-}
-
-que_god02.gat,175,54,1 script #lowen 745,{
-
-OnEmoGasp:
- emotion e_gasp;
- end;
-
-OnCast:
- specialeffect 59;
- end;
-}
-
-que_god02.gat,178,49,1 script #knight1 751,{
-
-OnEmoGasp:
- emotion e_gasp;
- end;
-
-OnEmoGo:
- emotion e_go;
- end;
-}
-
-que_god02.gat,168,53,7 script #knight2 734,{
-
-OnEmoGasp:
- emotion e_gasp;
- end;
-
-OnEmoGo:
- emotion e_go;
- end;
-}
-
-que_god02.gat,167,58,4 script #knight3 752,{
-
-OnEmoGasp:
- emotion e_gasp;
- end;
-
-OnEmoGo:
- emotion e_go;
- end;
-}
-
-que_god02.gat,174,49,0 script #lowenone 139,0,0,{
-
-OnTouch:
- donpcevent "brisinsold2::OnSold2On";
- mes "[" + strcharinfo(0) + "]";
- mes "Where am I?";
- mes "Isn't this...?!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Ah, I see.";
- mes "This must be the place where everything happened two years ago. Good, good...";
- next;
- mes "[Lowen Ellenen]";
- mes "Shshh...";
- mes "This is just a reflection of the past. Here, you'll see what happened at the time for yourself.";
- next;
- mes "[Lowen Ellenen]";
- mes "It wasn't any";
- mes "trouble getting down here. But... We've got problems now.";
- next;
- mapannounce "que_god02.gat","D...Doppelganger!!!",0,0x9CFF00;
- mes "[" + strcharinfo(0) + "]";
- mes "What...?!";
- mes "Doppelganger?!";
- next;
- donpcevent "#brisinsummon::OnDoppel1On";
- donpcevent "#brisinsummon::OnKnight1On";
- donpcevent "#brisinsummon::OnKnight2On";
- donpcevent "#brisinsummon::OnKnight3On";
- donpcevent "#brisinsummon::OnLowenOn";
- mes "[" + strcharinfo(0) + "]";
- mes "What's going on?";
- mes "Did you really fight with that creature? H-hey! Answer me!";
- next;
- mes "[Lowen Ellenen]";
- mes "Yes, this was the place...";
- mes "The commendant gave us the order...";
- mes "And then..? And then what happened to me..?";
- next;
- mapannounce "que_god02.gat","Everyone, stay calm! Get into your positions!",0,0x9CFF00;
- mes "^4E2F2F[Crusader Commander]";
- mes "Everyone, get into your positions! Front line, block its movement! Rear line, support the defense!^000000";
- donpcevent "#knight1::OnEmoGo";
- donpcevent "#knight2::OnEmoGo";
- donpcevent "#knight3::OnEmoGo";
- donpcevent "#doppelganger1::OnEmoGasp";
- next;
- mes "[Lowen Ellenen]";
- mes "N-no!";
- mes "I'm not running away!";
- next;
- mes "^3355FFYou're filled with a great anxiety, and you experience for yourself the fear and pressure Lowen felt during those very moments.^000000";
- next;
- mes "^4E2F2F[Crusader Commander]";
- mes "Go, Lowen!";
- mes "Cast Grand Cross, now!^000000";
- next;
- donpcevent "#lowen::OnCast";
- mapannounce "que_god02.gat","Mwahaha! Mortals are such fools...",0,0xA8A8A8;
- donpcevent "#brisinsummon::OnDoppel1Off";
- donpcevent "#brisinsummon::OnDoppel2On";
- donpcevent "#knight1::OnEmoGasp";
- donpcevent "#knight2::OnEmoGasp";
- donpcevent "#knight3::OnEmoGasp";
- donpcevent "#lowen::OnEmoGasp";
- mes "[" + strcharinfo(0) + "]";
- mes " ??!!!";
- next;
- donpcevent "#doppelganger2::OnCast";
- mes "[Male Voice]";
- mes "Lowen!";
- mes "Noooooooooo!!!";
- close2;
- warp "que_god02.gat",120,52;
- donpcevent "#brisinsummon::OnDoppel2Off";
- donpcevent "#brisinsummon::OnKnight1Off";
- donpcevent "#brisinsummon::OnKnight2Off";
- donpcevent "#brisinsummon::OnKnight3Off";
- donpcevent "#brisinsummon::OnLowenOff";
- end;
-}
-
-que_god02.gat,124,59,7 script #hermite 798,{ end; }
-
-que_god02.gat,120,52,0 script #monologue 139,0,0,{
-
-OnTouch:
- mes "[" + strcharinfo(0) + "]";
- mes "Where am I?";
- mes "Isn't that...";
- mes "What's Hermite";
- mes "doing here?!";
- next;
- mes "[Hermite Charles]";
- mes "No, no, no!";
- mes "Lowen don't it!";
- mes "He's gonna kill you!";
- next;
- mes "[Hermite Charles]";
- mes "Grand Cross...";
- mes "Using that's committing suicide! Lowen, don't do it!";
- mes "Don't do that, Lowen!";
- next;
- mapannounce "que_god02.gat","Mwahaha! Mortals are such fools...",0,0xA8A8A8;
- mes "[Hermite Charles]";
- mes "Lowen!";
- mes "Noooooooooo!!!";
- next;
- donpcevent "#brisinsummon::OnHermiteOff";
- mes "[" + strcharinfo(0) + "]";
- mes "Where did he go?";
- mes "Was... Was that";
- mes "from his mind?";
- mapannounce "que_god02.gat","What happened?! L-Lowen's gone!!",0,0xA8A8A8;
- next;
- mes "[Lowen Ellenen]";
- mes "...";
- mes "I see now.";
- mes "I know...";
- mes "What happened...";
- close2;
- warp "que_god02.gat",18,127;
- end;
-
-}
-
-que_god02.gat,21,127,3 script Lowen Ellenen#2 745,{
-
- mes "[Lowen Ellenen]";
- mes "I was a fool.";
- mes "Now I remember Hermite. He must have been the one who rescued me. But when I came to my senses, no one was there.";
- next;
- mes "[Lowen Ellenen]";
- mes "I blamed myself for surviving alone. I should have died there with my friends. I felt so useless.";
- next;
- mes "[Lowen Ellenen]";
- mes "Now I realize that there were many people who loved me. But at the time, I felt only guilt.";
- next;
- mes "[Lowen Ellenen]";
- mes "I returned 3 days later to my commander. It was stupid, but at the moment I couldn't think of anything else.";
- next;
- mes "[Lowen Ellenen]";
- mes "The higher ups and the politicians were looking for a scapegoat for the failure of the mission.";
- next;
- mes "[Lowen Ellenen]";
- mes "So I was the one who was blamed. Then, they took away everything I had. My status, the holy power granted to me...";
- next;
- mes "[Lowen Ellenen]";
- mes "I thought I deserved that punishment. After all, why should I have survived when all my comrades died?";
- next;
- mes "[Lowen Ellenen]";
- mes "It was then that I decided to avenge my friends, and salvage what was left of my sense of honor.";
- next;
- mes "[Lowen Ellenen]";
- mes "I went back to that place. I fought and I fought, trying to make penance for what I had done wrong...";
- next;
- mapannounce "que_god02.gat","If you wish, continue your battle. I promise you the winner will become an Einherjar...",0,0x70DB93;
- mes "[Lowen Ellenen]";
- mes "That voice...";
- mes "Isn't this...?";
- next;
- mes "[Lowen Ellenen]";
- mes "Are you giving me another chance? But I no longer have a body to fight monsters any longer...";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Don't worry,";
- mes "I'm with you!";
- mes "Let's do it!";
- close2;
- set $@BrisinRID$,getcharid(3);
- donpcevent "#brisinsummon::OnSummon";
- donpcevent "#brisinsummon::OnLowen2Off";
- end;
-
-}
-
-que_god02.gat,178,127,3 script Valkyrie#1 811,{
-
- if(god_brising == 31)
-{
- mes "[Valkyrie]";
- mes "You have passed the test, Lowen. I don't have much talk to speak.";
- next;
- mes "[Valkyrie]";
- mes "Have you found the strength to release yourself from the guilt and the pain? I have been waiting for you. Will you accept my invitation to Valhalla?";
- next;
- menu "Yes, I will follow you.",-,"Um... I'm not Lowen.",L_No;
- mes "[Valkyrie]";
- mes "Lowen Ellenen, misunderstood hero. I will now promote you to Einherjar with the will of God.";
- next;
- mes "[Valkyrie]";
- mes "Your soul and spirit will be reborn in Valhalla as a holy warrior preparing for the holy war.";
- specialeffect2 42;
- next;
- mes "[Valkyrie]";
- mes "And...";
- mes ""+ strcharinfo(0) +",";
- mes "Your exploits are known to me. But I am curious as to what has brought you here?";
- next;
- mes "^3355FFYou explained what happened to the Valkyrie, starting from the Snow Crystal which never melts.^000000";
- next;
- mes "[Valkyrie]";
- mes "I understand.";
- mes "The story begins a long, long time ago with Freya, the patron goddess of beauty and love.";
- next;
- mes "[Valkyrie]";
- mes "Her teardrop became a beautiful jewel. The snow on which Freya's teardrops have fallen will always retain its crystalline beauty.";
- next;
- mes "[Valkyrie]";
- mes "You seek traces of the goddess? Perhaps this is a sign of the end of the thousand year peace. When the time comes, I hope humans will not abandon their faith.";
- next;
- mes "[Valkyrie]";
- mes "Perhaps, I was also sent to meet you. I wish that humans will use the power derived from the traces of the gods to protect justice.";
- next;
- mes "[Valkyrie]";
- mes ""+ strcharinfo(0) +"...";
- mes "Listen. This is";
- mes "what you must find.";
- next;
- mes "[Valkyrie]";
- mes "A cold snowy path that the goddess walked across";
- mes "A blue river that the goddess walked across";
- mes "A narrow path that the goddess passed";
- mes "Four dwarves that the goddess met...";
- next;
- mes "[Valkyrie]";
- mes "^4d4dff We lost our hearts";
- mes "to that golden hair";
- mes "and those dazzling eyes.^000000";
- next;
- mes "[Valkyrie]";
- mes "Remember this.";
- mes "I shall send you";
- mes "back to where you";
- mes "belong.";
- set god_brising,34;
- next;
- mes "[Valkyrie]";
- mes "For Odin's honor...";
- close2;
- disablenpc "#doppelganger1";
- disablenpc "#doppelganger2";
- disablenpc "#knight1";
- disablenpc "#knight2";
- disablenpc "#knight3";
- disablenpc "#lowen";
- enablenpc "Soldier#1_brising";
- disablenpc "Soldier#2_brising";
- enablenpc "#hermite";
- enablenpc "Lowen Ellenen#2";
- disablenpc "Valkyrie#1";
- warp "geffen.gat",120,101;
- end;
- L_No:
- mes "[Valkyrie]";
- mes "Hahahaha...";
- mes "It has been";
- mes "a while since";
- mes "a mortal has";
- mes "made me laugh.";
- next;
- mes "[Valkyrie]";
- mes ""+ strcharinfo(0) +",";
- mes "I am speaking to the spirit of the girl that rests within you, the girl to whom you lent your body so that she may learn the truth of the past.";
- next;
- mes "[Valkyrie]";
- mes "Lowen Ellenen, misunderstood hero. I will now promote you to Einherjar with the will of God.";
- next;
- mes "[Valkyrie]";
- mes "Your soul and spirit will be reborn in Valhalla as a holy warrior preparing for the holy war.";
- specialeffect2 42;
- next;
- mes "[Valkyrie]";
- mes "And...";
- mes ""+ strcharinfo(0) +",";
- mes "Your exploits are known to me. But I am curious as to what has brought you here?";
- next;
- mes "^3355FFYou explained what happened to the Valkyrie, starting from the Snow Crystal which never melts.^000000";
- next;
- mes "[Valkyrie]";
- mes "I understand.";
- mes "The story begins a long, long time ago with Freya, the patron goddess of beauty and love.";
- next;
- mes "[Valkyrie]";
- mes "Her teardrop became a beautiful jewel. The snow on which Freya's teardrops have fallen will always retain its crystalline beauty.";
- next;
- mes "[Valkyrie]";
- mes "You seek traces of the goddess? Perhaps this is a sign of the end of the thousand year peace. When the time comes, I hope humans will not abandon their faith.";
- next;
- mes "[Valkyrie]";
- mes "Perhaps, I was also sent to meet you. I wish that humans will use the power derived from the traces of the gods to protect justice.";
- next;
- mes "[Valkyrie]";
- mes ""+ strcharinfo(0) +"...";
- mes "Listen. This is";
- mes "what you must find.";
- next;
- mes "[Valkyrie]";
- mes "A cold snowy path that the goddess walked across";
- mes "A blue river that the goddess walked across";
- mes "A narrow path that the goddess passed";
- mes "Four dwarves that the goddess met...";
- next;
- mes "[Valkyrie]";
- mes "^4d4dffThe beauty of the stars";
- mes "Wanes in comparison.";
- mes "We lost our hearts";
- mes "To that golden hair";
- mes "And those dazzling eyes.^000000";
- next;
- mes "[Valkyrie]";
- mes "Remember this.";
- mes "I shall send you";
- mes "back to where you";
- mes "belong.";
- set god_brising,34;
- next;
- mes "[Valkyrie]";
- mes "For Odin's honor...";
- close2;
- disablenpc "#doppelganger1";
- disablenpc "#doppelganger2";
- disablenpc "#knight1";
- disablenpc "#knight2";
- disablenpc "#knight3";
- disablenpc "#lowen";
- enablenpc "Soldier#1_brising";
- disablenpc "Soldier#2_brising";
- enablenpc "#hermite";
- enablenpc "Lowen Ellenen#2";
- disablenpc "Valkyrie#1";
- warp "geffen.gat",120,101;
- end;
-}
-
-}
-
-xmas.gat,38,105,0 script #brisindwarf1 111,3,3,{
-
- if($God2 < 50)
-{
- mes "^3355FFA lot of snow";
- mes "is heavily piled";
- mes "here on the ground.^000000";
- close;
-}
- if($God3 > 99)
-{
- mes "^3355FFA lot of snow";
- mes "is heavily piled";
- mes "here on the ground.^000000";
- close;
-}
- if (god_brising > 39 && god_brising < 50)
-{
- mes "^3355FFA lot of snow";
- mes "is heavily piled";
- mes "here on the ground.^000000";
- next;
- mes "^3355FFHowever, this particular mound strikes you as curious for some reason.^000000";
- next;
- menu "Sweep the snow away with your hand.",-,"Poke the snow with your finger.",L_Poke,"Cancel.",L_No;
- mes "^3355FFAs you sweep the snow with the palm of your hand, some of the snow melts, revealing a strange puzzle cube. It's multi-faceted, but you can read that each facet is inscribed with a lyric.";
- set @point,0;
- next;
- menu "Adjust the puzzle.",-,"Quit.",L_Quit;
- mes "[" + strcharinfo(0) + "]";
- mes "Okay, um...";
- mes "I guess I should";
- mes "choose a lyric...";
- next;
- Menu1:
- menu "Wanes in comparison",case11,"To that beautiful hair",case12,"All of our hearts",case13,"The beauty of the stars",case14,"to those dazzling eyes",case15;
- case11:
- mes "[" + strcharinfo(0) + "]";
- mes "we gave...";
- goto Menu2;
-
- case12:
- mes "[" + strcharinfo(0) + "]";
- mes "to that beautiful hair";
- goto Menu2;
- case13:
- mes "[" + strcharinfo(0) + "]";
- mes "all of our hearts in";
- goto Menu2;
- case14:
- mes "[" + strcharinfo(0) + "]";
- mes "The beauty of the stars";
- set @point,@point +1;
- goto Menu2;
- case15:
- mes "[" + strcharinfo(0) + "]";
- mes "to those dazzling eyes";
- goto Menu2;
- Menu2:
- menu "we gave",case21,"Wanes in comparison.",case22,"all of our hearts in",case23,"to the steps in",case24,"to those dazzling eyes",case25;
- case21:
- mes "we gave..";
- goto Menu3;
- case22:
- mes "Wanes in comparison.";
- set @point,@point +1;
- goto Menu3;
- case23:
- mes "all of our hearts in";
- goto Menu3;
- case24:
- mes "to the steps in";
- goto Menu3;
- case25:
- mes "to those dazzling eyes";
- goto Menu3;
- Menu3:
- menu "we gave",case31,"to that beautiful hair",case32,"all of our hearts in",case33,"to the steps in",case34,"We lost our hearts",case35;
- case31:
- mes "we gave..";
- goto Menu4;
- case32:
- mes "to that beautiful hair";
- goto Menu4;
- case33 :
- mes "all of our hearts in";
- goto Menu4;
- case34:
- mes "to the steps in";
- goto Menu4;
- case35:
- mes "We lost our hearts";
- set @point,@point +1;
- goto Menu4;
- Menu4:
- menu "To that golden hair",case41,"to that beautiful hair",case42,"all of our hearts in",case43,"to the steps in",case44,"to those dazzling eyes",case45;
- case41:
- mes "To that golden hair";
- set @point,@point +1;
- goto Menu5;
- case42:
- mes "to that beautiful hair";
- goto Menu5;
- case43:
- mes "all of our hearts in";
- goto Menu5;
- case44:
- mes "to the steps in";
- goto Menu5;
- case45:
- mes "to those dazzling eyes";
- goto Menu5;
- Menu5:
- menu "we gave",case51,"to that beautiful hair",case52,"And those dazzling eyes.",case53,"to the steps in",case54,"to those dazzling eyes",case55;
- case51:
- mes "we gave..";
- goto Check;
- case52:
- mes "to that beautiful hair";
- goto Check;
- case53:
- mes "And those dazzling eyes.";
- set @point,@point +1;
- goto Check;
- case54:
- mes "to the steps in";
- goto Check;
- case55:
- mes "to those dazzling eyes";
- goto Check;
- Check:
- next;
- if(@point > 4)
- {
- donpcevent "#brisindwarf1::OnAlfrikOn";
- mes "[Old dwarf]";
- mes "Who are you?!";
- mes "And why the hell";
- mes "did you wake me up?";
- close;
- }
-
- L_Quit:
- mes "[" + strcharinfo(0) + "]";
- mes "Huh...?";
- mes "Nothing happened.";
- mes "Did I do something wrong, or is this just a completely ordinary puzzle cube?";
- close;
- L_No:
- mes "["+ strcharinfo(0) +"]";
- mes "This...";
- mes "This better not";
- mes "be just some regular";
- mes "puzzle cube that someone";
- mes "just dropped in the snow!";
- close;
-
- L_Poke:
- mes "^3355FFYou use your finger to poke the pile of snow. However, you hurt your finger a little bit after hitting something really solid.^000000";
- emotion e_ag,1;
- set Hp,Hp -20;
- close;
-}
- else
-{
- mes "- There was a pile of snow under a tree. -";
- close;
-}
-
-OnTouch:
- if(god_brising > 39) emotion e_gasp,1;
- end;
-
-OnInit:
- disablenpc "Alfrik#1";
- end;
-
-OnAlfrikOn:
- enablenpc "Alfrik#1";
- end;
-
-OnAlfrikOff:
- disablenpc "Alfrik#1";
- end;
-
-}
-
-xmas.gat,36,103,4 script Alfrik#1 826,{
-
- if (god_brising == 49)
-{
- mes "[Alfrik]";
- mes "I've got nothing more to say! Now get out of here! I don't want to be found!";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else if(god_brising == 48)
-{
- mes "[Alfrik]";
- mes "What's up, human?";
- mes "All of us have awakened.";
- next;
- menu "I just wanted to say hello.",-,"What are materials for Brisingamen?",L_Material;
- mes "[Alfrik]";
- mes "Your gesture is appreciated, but I'd rather hide than socialize. I don't want to be found by the crows of Odin!";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
- L_Material:
- mes "[Alfrik]";
- mes "Materials for Brisingamen? For the human imitation, the materials are pretty easy to gather...";
- next;
- mes "[Alfrik]";
- mes "The power of weapons used by gods, when they battled demons a thousand years ago, and everything detached from Brisingamen. That's basically what you need.";
- next;
- mes "[Alfrik]";
- mes "If you want to create a Brisingamen you will need.....";
- mes "^4d4dffFreya's Jewel";
- mes "Silver Ornament";
- mes "Snow Crystal";
- mes "Ripple";
- mes "Drifting Air^000000";
- next;
- mes "[Alfrik]";
- mes "You might need some gems, like Saphire, Peal, Opal, Curse Ruby, and maybe even some Gold to decorate the necklace.";
- next;
- mes "[Alfrik]";
- mes "Although I give freely of my advice, we four dwarves will no longer do smithing work unless it be Freya's command.";
- next;
- mes "[Alfrik]";
- mes "But I can promise you one thing. Since the four of us have awakened, humans will obtain the Brisingamen for sure.";
- next;
- mes "[Alfrik]";
- mes "Now...";
- mes "Leave me";
- mes "in peace.";
- set god_brising,49;
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else if(god_brising == 40)
-{
- mes "[Alfrik]";
- mes "^333333*Yawn...*^000000";
- mes "It's been a long time since I've seen the sun! W-wait! You're not...";
- next;
- mes "[Alfrik]";
- mes "Who sent you?!";
- mes "Loki? Heimdall?";
- mes "Or was it Freya?";
- next;
- menu "No one, it was an accident!",-,"It was Valkyrie.",L_Valkyrie;
- mes "[Alfrik]";
- mes "Don't even think of lying to me, human! There's no way you could have awoken me without knowing the password! Now, speak!";
- next;
- menu "Valkyrie told me.",-,"It was a coincidence!",L_Coincidence;
- mes "[Alfrik]";
- mes "Valkyrie...?";
- mes "Odin's warmonger? What could Odin want, I haven't done anything wrong!";
- next;
- mes "^3355FFYou explained everything to Alfrik, who seems to worry about being targeted by Odin.^000000";
- next;
- mes "[Alfrik]";
- mes "So that's it.";
- mes "Seeking out our masterpiece? You humans must desire the power of the gods. Interesting.";
- next;
- mes "[Alfrik]";
- mes "The time for us to revive may actually have come! Alright then, I Alfrik shall cooperate with you humans.";
- next;
- mes "[Alfrik]";
- mes "After all, getting on Odin's good side like this is much better than being tortured by Loki.";
- next;
- mes "[Alfrik]";
- mes "Now, about the masterpiece we made for Freya. There can only be one in the world.";
- next;
- mes "[Alfrik]";
- mes "However, that doesn't mean an imitation, with the same power as that godly item, can't be made. Isn't it tempting, the power of a god?";
- next;
- mes "[Alfrik]";
- mes "First things first. If you want to make the necklace, you must awaken all four of us. Because of Loki's threat, we all hid ourselves in different places.";
- next;
- mes "[Alfrik]";
- mes "Go wake my brothers! Let's see if the Brisingamen can be made once again!";
- next;
- mes "[Alfrik]";
- mes "Now go and wake Dvalin, before the gods and giants can find out!";
- set god_brising,41;
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
- L_Coincidence:
- mes "[Alfrik]";
- mes "Coincidence?";
- mes "Impossible! How dare you lie! Don't ever come back, or the gods will find me!";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
- L_Valkyrie:
- mes "[Alfrik]";
- mes "...did you just speak of Valkyrie!";
- mes "That Odin's maiden...that war monger..";
- mes "...I see, Odin must want me.";
- mes "...but...but I haven't done anything wrong.";
- mes "I haven't!";
- next;
- mes "- You explained everything -";
- mes "- to Alfrik who seemed to fear Odin. -";
- next;
- mes "[Alfrik]";
- mes "Errr...? Was that it?";
- mes "Do humans desire the power of God?";
- mes "..heheheh....";
- mes "It's interesting.";
- mes "Besides, you're looking for a thing";
- mes "that was made by me and my brothers long time ago.";
- next;
- mes "[Alfrik]";
- mes "....giggle...giggle...giggle...";
- mes "It may be the time for revive!";
- mes "...giggle giggle...okay. Good.";
- mes "I, Alfrik shall cooperate with you humans.";
- mes "After all, it will be way better than being tortured by Loki or Heimdall.";
- next;
- mes "[Alfrik]";
- mes "Giggle...giggle...giggle...oh by the way...";
- mes "I don't think that Freya will like my idea...?";
- mes "Giggle...giggle....";
- mes "Hey, human.";
- mes "Aren't you curious about the Freya's Necklace?";
- next;
- mes "[Alfrik]";
- mes "Of course only one Brisingamen exists in the world.";
- mes "However, you can create a similar thing";
- mes "...which has the same power as the godly item.";
- mes "The power of god...isn't it tempting?";
- next;
- mes "[Alfrik]";
- mes "If you want to make the necklace,";
- mes "you must wake up all of us.";
- mes "....I hate Loki and Odin...";
- mes "My brothers were put into sleep";
- mes "in seperate places.";
- next;
- mes "[Alfrik]";
- mes "Freaking Heimdall...";
- mes "We could not win over the smart and fast guy.";
- mes "Go wake my brothers!";
- mes "Let's see if we can bring up the Brisingamen";
- mes "once again!";
- next;
- mes "[Alfrik]";
- mes "Now, before gods and giants get to know about it,";
- mes "go wake Dvalin!";
- set god_brising,41;
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else if(god_brising == 41)
-{
- mes "[Alfrik]";
- mes "Why are you still here?";
- mes "I told you go wake Dvalin!";
- next;
- menu "Where is he?",-,"Tell me more about Brisingamen.",L_More;
- mes "[Alfrik]";
- mes "Ah. Right.";
- mes "I forgot to tell you. Poor Dvalin. Now, where was it?";
- next;
- mes "[Alfrik]";
- mes "We were afraid that Odin and Heimdall would punish us because, well, in their eyes we disgraced the goddess.";
- next;
- mes "[Alfrik]";
- mes "Oh course, they never would have been angered if it weren't for Loki's trickery.";
- next;
- mes "[Alfrik]";
- mes "We loved Freya so much that we decided to hide ourselves beneath the path that she walked. To be as close to any trace of her as we could.";
- next;
- mes "[Alfrik]";
- mes "Poor Dvalin is sleeping under the path in the East. Once there, you'll feel the scent the goddess.";
- next;
- mes "[Alfrik]";
- mes "I can't remember where the others are sleeping, but you cannot forget these words...";
- next;
- mes "[Alfrik]";
- mes "^4d4dffHer lovely scent";
- mes "Still lingers in the wind.";
- mes "We surrendered our hearts";
- mes "To those tender teardrops";
- mes "Those seductive red lips.^000000";
- set god_brising,42;
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
- L_More:
- mes "[Alfrik]";
- mes "Brisingamen is our masterpiece, a necklace we forged for Freya. Even if we tried making it again, I doubt it would be as good.";
- next;
- mes "[Alfrik]";
- mes "It looked perfect on Freya. Very difficult to create jewelry that actually enhances the attractiveness of the goddess of beauty.";
- next;
- mes "[Alfrik]";
- mes "Perhaps our greatest reward was that beautiful smile of satisfaction she gave us when that we gave her that necklace. We loved her so.";
- next;
- mes "[Alfrik]";
- mes "Is it that wrong for dwarves to love a goddess? Perhaps we were punished because the gods, even Odin, loved her as well.";
- next;
- mes "[Alfrik]";
- mes "In any case, we've never seen the true Brisingamen again. But something very similar to it can be created...";
- next;
- mes "[Alfrik]";
- mes "You'll need materials that have been graced by the goddess' presense. Traces of the goddess in the earth, water and the wind.";
- next;
- mes "[Alfrik]";
- mes "And if the Brisingamen is recreated, the power of a god will be in the hands of a human. That human could be you!";
- next;
- mes "[Alfrik]";
- mes "Poor Dvalin is sleeping under the path in the East. Once there, you'll feel the scent the goddess.";
- next;
- mes "[Alfrik]";
- mes "I can't remember where the others are sleeping, but you cannot forget these words...";
- next;
- mes "[Alfrik]";
- mes "^4d4dffHer lovely scent";
- mes "Still lingers in the wind.";
- mes "We surrendered our hearts";
- mes "To those tender teardrops";
- mes "Those seductive red lips.^000000";
- set god_brising,42;
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else if(god_brising == 42)
-{
- mes "[Alfrik]";
- mes "Will you please!";
- mes "Get lost before Loki and Heimdall find out I've awakened! Now hurry, find Dvalin, and wake him up!";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else if(god_brising > 42 && god_brising < 48)
-{
- mes "[Alfrik]";
- mes "Oh, finally all of us have awakened! Now, the power of the goddess can be retrieved from the earth, water and the wind!";
- next;
- mes "[Alfrik]";
- mes "Hahahahaha!";
- mes "This should be";
- mes "interesting!";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
- else
-{
- mes "[Alfrik]";
- mes "Mmm...?";
- mes "I've got no business with you.";
- close2;
- donpcevent "#brisindwarf1::OnAlfrikOff";
- end;
-}
-
-}
-
-prt_fild02.gat,185,269,0 script #brisindwarf2 111,3,3,{
-
- if($God2 < 50)
-{
- mes "^3355FFIt's just an";
- mes "ordinary rock.^000000";
- close;
-}
-
- if($God3 > 99)
-{
- mes "^3355FFIt's just an";
- mes "ordinary rock.^000000";
- close;
-}
-
- if(god_brising > 41)
-{
- mes "^3355FFIt's just an ordinary rock underneath the shadow of a tree. But on closer inspection, you notice that the moss on top of the rock looks perfectly flat.^000000";
- next;
- menu "Step on it.",-,"Sweep the surface.",L_Sweep,"Scratch the surface.",L_Scratch,"Kick it.",L_Kick;
- mes "^3355FFYou gingerly place your foot on the top of the stone. The entire rock suddenly swings downward into the ground, and you fall downward...^000000";
- close2;
- warp "prt_fild02.gat",165,224;
- end;
- L_Sweep:
- mes "^3355FFAs you sweep away the moss with your hand, you scratch your palm from the sharp edges of the rock.^000000";
- emotion e_gasp,1;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Damn...!";
- mes "I'm bleeding!";
- mes "But why didn't anything else happen?!";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "This rock had";
- mes "better be one of";
- mes "those secret rocks!";
- mes "Or else...!";
- close;
- L_Scratch:
- mes "^3355FFYou scratch away at the moss, and feel that the surface of the rock has even recesses.";
- next;
- mes "^3355FFAfter peeling off the moss, a series of tiles, etched with faint words, are revealed on top of the rock.^000000";
- next;
- mes "^3355FFThese tiles could be moved around, like in a puzzle.^000000";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Another puzzle?";
- mes "This was just like when I had to give Alfrik's password. Okay, let me see...";
- set @point,0;
- next;
- Menu1:
- menu "to the tear drops dripping on the way",case11,"Her lovely scent",case12,"we gave",case13,"to the seducing red lips",case14,"our hearts in",case15;
- case11:
- mes "[" + strcharinfo(0) + "]";
- mes "to the tear drops dripping on the way";
- goto Menu2;
- case12:
- mes "[" + strcharinfo(0) + "]";
- mes "Her lovely scent";
- set @point,@point +1;
- goto Menu2;
- case13:
- mes "[" + strcharinfo(0) + "]";
- mes "we gave";
- goto Menu2;
- case14:
- mes "[" + strcharinfo(0) + "]";
- mes "to the seducing red lips";
- goto Menu2;
- case15:
- mes "[" + strcharinfo(0) + "]";
- mes "our hearts in";
- goto Menu2;
- Menu2:
- menu "Still lingers in the wind.",case21,"to the scent drifted in the wind",case22,"we gave",case23,"to the seducing red lips",case24,"our hearts in",case25;
- case21:
- mes "Still lingers in the wind.";
- set @point,@point +1;
- goto Menu3;
- case22:
- mes "to the scent drifted in the wind";
- goto Menu3;
- case23:
- mes "we gave";
- goto Menu3;
- case24:
- mes "to the seducing red lips";
- goto Menu3;
- case25:
- mes "our hearts in";
- goto Menu3;
- Menu3:
- menu "to the tear drops dripping on the way",case31,"to the scent drifted in the wind",case32,"we gave",case33,"We surrendered our hearts",case34,"our hearts in",case35;
- case31:
- mes "to the tear drops dripping on the way";
- goto Menu4;
- case32:
- mes "to the scent drifted in the wind";
- goto Menu4;
- case33:
- mes "we gave";
- goto Menu4;
- case34:
- mes "We surrendered our hearts";
- set @point,@point +1;
- goto Menu4;
- case35:
- mes "our hearts in";
- goto Menu4;
- Menu4:
- menu "to the tear drops dripping on the way",case41,"to the scent drifted in the wind",case42,"To those tender teardrops",case43,"to the seducing red lips",case44,"our hearts in",case45;
- case41:
- mes "to the tear drops dripping on the way";
- goto Menu5;
- case42:
- mes "to the scent drifted in the wind";
- goto Menu5;
- case43:
- mes "To those tender teardrops";
- set @point,@point +1;
- goto Menu5;
- case44:
- mes "to the seducing red lips";
- goto Menu5;
- case45:
- mes "our hearts in";
- goto Menu5;
- Menu5:
- menu "to the tear drops dripping on the way",case51,"to the scent drifted in the wind",case52,"we gave",case53,"to the seducing red lips",case54,"Those seductive red lips",case55;
- case51:
- mes "to the tear drops dripping on the way";
- goto Check;
- case52:
- mes "to the scent drifted in the wind";
- goto Check;
- case53:
- mes "we gave";
- goto Check;
- case54:
- mes "to the seducing red lips";
- goto Check;
- case55:
- mes "Those seductive red lips";
- set @point,@point +1;
- goto Check;
- Check:
- next;
- if(@point > 4)
- {
- donpcevent "#brisindwarf2::OnDvalinOn";
- mes "[Dvalin]";
- mes "...?";
- mes "Alfrik?";
- mes "Is that you?";
- close;
- }
- L_Kick:
- mes "[" + name + "]";
- mes "^333333*Cough cough!*";
- mes "Aaaack!";
- mes "It's so dusty!";
- close;
-}
- else
-{
- mes "^3355FFJust a normal";
- mes "rock, covered in moss.^000000";
- close;
-}
-
-OnTouch:
- if(god_brising > 41) emotion e_gasp,1;
- end;
-
-OnInit:
- disablenpc "Dvalin#1";
- end;
-
-OnDvalinOn:
- enablenpc "Dvalin#1";
- end;
-
-OnDvalinOff:
- disablenpc "Dvalin#1";
- end;
-}
-
-prt_fild02.gat,185,270,3 script Dvalin#1 826,{
-
- if (god_brising > 43)
-{
- mes "[Dvalin]";
- mes "A human?";
- mes "You woke me up?";
- next;
- mes "[Dvalin]";
- mes "Hmm...";
- mes "And you'd be acting pretty pushy right about now if you were acting on behalf of a god. What could you want...?";
- next;
- mes "[Dvalin]";
- mes "It makes sense that you want a replica of Brisingamen for its power. But remember, we originally made Brisingamen as a necklace fit for a goddess.";
- next;
- mes "[Dvalin]";
- mes "Some might say that we seduced Freya with the necklace, but we really loved her with all of our hearts.";
- close2;
- donpcevent "#brisindwarf2::OnDvalinOff";
- end;
-}
- else if(god_brising == 42)
-{
- mes "[Dvalin]";
- mes "Wah, it's not Alfrik?";
- mes "Who are you to wake Dvalin?";
- mes "Tell me right now, or I am gonna kick your ass!";
- next;
- menu "Help!",-,"Alfrik sent me to wake you up!",L_Alfrik;
- mes "[Dvalin]";
- mes "I don't know what the hell you're doing here,";
- mes "but leave!";
- close2;
- donpcevent "#brisindwarf2::OnDvalinOff";
- end;
- L_Alfrik:
- mes "[Dvalin]";
- mes "Did you just say Alfrik sent you? How do you know my brother?!";
- next;
- mes "[Dvalin]";
- mes "Brisingamen?!";
- mes "Then, that means we could meet Freya again?!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Umm...";
- mes "I'm afraid not.";
- mes "Or, at least, that's";
- mes "not why I'm here.";
- next;
- mes "[Dvalin]";
- mes "Okay. I understand. Sorry, I was just hoping you were a herald of Freya.";
- next;
- mes "[Dvalin]";
- mes "So, an imitation of Brisingamen. Even if it's not the original, I'm sure it can possess power comparable to the original. Yes...";
- next;
- mes "[Dvalin]";
- mes "It's no use trying to predict the future, but I can't help but wonder what would mankind do with the power of the gods?";
- next;
- mes "[Dvalin]";
- mes "If my brother Alfrik already approved of you, then I'll help you out. I'll tell you how to wake my brother Berling.";
- next;
- mes "[Dvalin]";
- mes "We hid ourselves near traces of Freya. The path where I am staying is one that my goddess has walked through.";
- next;
- mes "[Dvalin]";
- mes "The air that quietly drifts here holds her fragrant scent. You can use this wind to borrow her power.";
- next;
- mes "[Dvalin]";
- mes "Aside from Freya, I have no special love for the gods or giants. But I am intrigued by you humans. Your race is one of both love and hatred, life and destruction.";
- next;
- mes "[Dvalin]";
- mes "Go now and seek Berling. He is sleeping near a river connect to Mount Mjolnir. Travel West to find the river were Freya's Teardrops have fallen.";
- next;
- mes "[Dvalin]";
- mes "If the phantom of water gives you a question, answer it. The answer is the punishment that Odin gave to our goddess.";
- next;
- mes "[Dvalin]";
- mes "Until thousands of Valkyries filled up Valhala, they had to repeatedly live, die, then be reborn the next day only to die again.";
- next;
- mes "[Dvalin]";
- mes "Think about who they were. That's all I can tell you.";
- next;
- mes "[Dvalin]";
- mes "Somehow, I know";
- mes "you are the one who";
- mes "can answer the question.";
- mes "Hahahaha!";
- set god_brising,43;
- close2;
- donpcevent "#brisindwarf2::OnDvalinOff";
- end;
-}
- else if(god_brising == 43)
-{
- mes "[Dvalin]";
- mes "Why do you keep calling me? I did everything I can do for you. I even gave you the key of the question.";
- next;
- mes "[Dvalin]";
- mes "From now on,";
- mes "it's all up to you.";
- mes "Now, go wake Berling...";
- close2;
- donpcevent "#brisindwarf2::OnDvalinOff";
- end;
-}
-
-}
-
-mjolnir_09.gat,85,129,0 script #brisindwarf3 111,3,3,{
-
- if($God2 < 50)
-{
- mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
- close;
-}
- if($God3 > 99)
-{
- mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
- close;
-}
- if (god_brising > 42 && god_brising < 50)
-{
- specialeffect 109;
- mes "[Echoing Voice]";
- mes "Alfrik: confirmed.";
- mes "Dvalin: confirmed.";
- next;
- mes "[Echoing Voice]";
- mes "Please answer me.";
- mes "Odin punished beautiful Freya, and made her curse humans with her powers.";
- next;
- mes "[Echoing Voice]";
- mes "Freya cursed many human beings to repeatedly die and be reborn in an eternal battle.";
- mes "How many are they?";
- next;
- switch( select( "20!","How should I know?!","40!","42!" ))
- {
- case 1:
- specialeffect 109;
- mes "[Echoing Voice]";
- mes "Failed.";
- mes "Failed...";
- close;
- break;
- case 2:
- specialeffect 109;
- mes "[Echoing Voice]";
- mes "Failed.";
- mes "Failed...";
- close;
- break;
- case 3:
- specialeffect 109;
- mes "[Echoing Voice]";
- mes "Failed.";
- mes "Failed...";
- close;
- break;
- case 4:
- specialeffect 109;
- mes "[Echoing Voice]";
- mes "...Confirmed.";
- mes "Shutting down barrier. Initiating summoning.";
- next;
- enablenpc "Berling#1";
- mes "[Berling]";
- mes "^333333*Gasp--!*^000000";
- mes "Thought I was";
- mes "gonna drown to death!";
- mes "Who woke me up?";
- close;
- break;
- }
-}
- else
-{
- mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
- close;
-}
-
-OnTouch:
- if(god_brising > 42) emotion e_gasp,1;
- end;
-
-OnInit:
- disablenpc "Berling#1";
- end;
-
-OnBerlingOn:
- enablenpc "Berling#1";
- end;
-
-OnBerlingOff:
- disablenpc "Berling#1";
- end;
-}
-
-mjolnir_09.gat,87,129,3 script Berling#1 826,{
-
- if(god_brising > 44)
-{
- mes "[Berling]";
- mes "You're the one that's awakened us? Hahaha, perhaps that's a sign we may see Freya again! Hahahaha!";
- next;
- mes "[Berling]";
- mes "We are indebted to you for reviving us. Okay, I know what you want, and will help you obtain the power of the gods.";
- close2;
- donpcevent "#brisindwarf3::OnBerlingOff";
- end;
-}
- else if(god_brising == 43)
-{
- mes "[Berling]";
- mes "What the...?";
- mes "It's a human?!";
- mes "What do you want?";
- mes "Wh-who are you?";
- next;
- menu "Dvalin wants you to wake up!",-,"Tell me who you are first!",L_Who;
- mes "[Berling]";
- mes "Dvalin?! You mean my brother! But he can only be revived if Alfrik is revived. What happened?";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Umm...";
- mes "Let me explain...";
- next;
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "["+ strcharinfo(0) +"]";
- mes "...So if I guess I need to wake up all four of you dwarves so that Brisingamen, which holds Freya's power, can be made again.";
- next;
- mes "[Berling]";
- mes "Oh! Say that name once again! Freya, the goddess who took my body and soul! Did you just say you want to make her necklace?";
- next;
- mes "[Berling]";
- mes "Hahahaha, stop joking around. The Brisingamen is a one of a kind masterpiece!";
- next;
- menu "I don't mean the original one, but...",-;
- mes "[Berling]";
- mes "Ah, now I see! You want a replica that has roughly the same power. A Brisingamen used by humans!";
- next;
- mes "[Berling]";
- mes "I, on the other hand, do not desire power. If would be happy to own but a strand of her hair.";
- next;
- mes "[Berling]";
- mes "Oh Freya...";
- mes "The more of her beauty exists in this world, the happier I'll be. I'm more than willing to help you recreate this memento of Freya.";
- next;
- mes "[Berling]";
- mes "Now, please go and find the last one of my brothers! Poor Grer, perhaps he is still digging silver in that mine for her...";
- next;
- mes "[Berling]";
- mes "Go and find Grer. I will give you Freya's golden teardrop, but he might have revived on his own...";
- next;
- mes "[Berling]";
- mes "If he doesn't trust you, sing this song. You must remember each and every word...";
- next;
- mes "[Berling]";
- mes "^4d4dffNo jewel in the world can compare.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffOur masterpiece made from love.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffShe wanted the dazzling necklace.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffWe wanted the goddess of beauty.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffOur happiest times were with her.^000000";
- next;
- mes "[Berling]";
- mes "Memorize all five lines of this song exactly. Now take this golden teardrop and please seek out Grer.";
- specialeffect2 84;
- set god_brising,44;
- close2;
- donpcevent "#brisindwarf3::OnBerlingOff";
- end;
- L_Who:
- mes "[Berling]";
- mes "Where the hell did you come from?";
- mes "I am Berling the greatest dwarf in ages!";
- mes "I regret to tell you this, but I do not have a name";
- mes "to introduce to such an ill-bred lad like you!";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Heh, you just said you're Berling...";
- next;
- mes "[Berling]";
- mes "Baaaaahhh!";
- mes "Quiet you!";
- mes "Mind your own business!";
- close2;
- donpcevent "#brisindwarf3::OnBerlingOff";
- end;
-}
- else if(god_brising == 44)
-{
- mes "[Berling]";
- mes "Did you already forget the lyrics? Let me tell them to you again, so don't forget this time.";
- next;
- mes "[Berling]";
- mes "^4d4dffNo jewel in the world can compare.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffOur masterpiece made from love.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffShe wanted the dazzling necklace.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffWe wanted the goddess of beauty.^000000";
- next;
- mes "[Berling]";
- mes "^4d4dffOur happiest times were with her.^000000";
- close2;
- donpcevent "#brisindwarf3::OnBerlingOff";
- end;
-}
-
-}
-
-mjo_dun02.gat,126,36,0 script #brisindwarf4 111,3,3,{
-
- if($God2 < 50)
-{
- mes "[" + strcharinfo(0) + "]";
- mes "Bah, no way out.";
- close;
-}
- if($God3 > 99)
-{
- mes "[" + strcharinfo(0) + "]";
- mes "Bah, no way out.";
- close;
-}
- if(god_brising > 45 && god_brising < 50)
-{
- mes "[Grer]";
- mes "What!";
- enablenpc "Grer#1";
- close;
-}
- else if(god_brising == 45)
-{
- mes "- A charcoal was dropped from the sky' -";
- mes "- with a voice, 'Show me!'. -";
- mes "- Let's scribble...-";
- set @point,0;
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Let's see.";
- mes "Um, that song.";
- mes "What was the first line...?";
- next;
- input @dwarfsong1$;
- if(@dwarfsong1$ == "No jewel in the world can compare.") set @point,@point +1;
- mes "[" + strcharinfo(0) + "]";
- mes " " + @dwarfsong1$ + "";
- mes "Then...ummm..";
- mes "The second line?";
- next;
- input @dwarfsong2$;
- if(@dwarfsong2$ == "Our masterpiece made from love.") set @point,@point +1;
- mes "[" + strcharinfo(0) + "]";
- mes " " + @dwarfsong2$ + "";
- mes "Now, what was";
- mes "the third line...?";
- next;
- input @dwarfsong3$;
- if(@dwarfsong3$ == "She wanted the dazzling necklace.") set @point,@point +1;
- mes "[" + strcharinfo(0) + "]";
- mes " " + @dwarfsong3$ + "";
- mes "Now, the fourth";
- mes "line after that...";
- next;
- input @dwarfsong4$;
- if(@dwarfsong4$ == "We wanted the goddess of beauty.") set @point,@point +1;
- mes "[" + strcharinfo(0) + "]";
- mes " " + @dwarfsong4$ + "";
- mes "Alright, now";
- mes "for the last line...";
- next;
- input @dwarfsong5$;
- if(@dwarfsong5$ == "Our happiest times were with her.") set @point,@point +1;
- mes "[" + strcharinfo(0) + "]";
- mes " " + @dwarfsong5$ + "";
- mes "Alright, let's give it a try.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "" + @dwarfsong1$ + "";
- mes "" + @dwarfsong2$ + "";
- mes "" + @dwarfsong3$ + "";
- mes "" + @dwarfsong4$ + "";
- mes "" + @dwarfsong5$ + "";
- next;
- if(@point > 4)
- {
- enablenpc "Grer#1";
- mes "[Grer]";
- mes "Wha--?";
- mes "Berling";
- mes "did send you!";
- set god_brising,46;
- stopnpctimer;
- close;
- }
- else
- {
- mes "[Grer]";
- mes "Bah!";
- mes "I knew it!";
- mes "I can't trust you!";
- close2;
- warp "mjo_dun02",118,56;
- end;
- }
-}
- else
-{
- mes "^3355FFYou found a hole filled with some clod and a lump of coal.^000000";
- close;
-}
-
-OnTouch:
- if($God2 < 50)
-{
- mes "[" + strcharinfo(0) + "]";
- mes "Beh, no way out.";
- close;
-}
- if($God3 > 99)
-{
- mes "[" + strcharinfo(0) + "]";
- mes "Beh, no way out.";
- close;
-}
- if(god_brising == 44)
-{
- emotion e_gasp,1;
- mes "[Male Voice]";
- mes "Don't come any closer! How the hell do I feel Freya's presense on you? Tell me who you are!";
- next;
- menu "I am sent by Berling.",-,"Wah, you freaked me out!",L_Freak;
- mes "[Male Voice]";
- mes "Lies! Lies!";
- mes "Prove it!";
- mes "Prove yourself!";
- set god_brising,45;
- initnpctimer;
- close;
- L_Freak:
- mes "[Male Voice]";
- mes "Get out of here!";
- close;
-}
- else if(god_brising == 45)
-{
- mes "[Male Voice]";
- mes "Prove it!";
- mes "Otherwise, leave me alone and let me mine silver. Silver...! Heh heh heh...";
- stopnpctimer;
- startnpctimer;
- close;
-}
- else
-{
- warp "mjo_dun02.gat",118,56;
- end;
-}
-
-OnTimer1000:
- mapannounce "mjo_dun02.gat","Grer: Hurry and show that I can trust you!",0,0x70DBDB;
- end;
-
-OnTimer240000:
- mapannounce "mjo_dun02.gat","Grer: Grrr, I won't wait much longer!",0,0x70DBDB;
- end;
-
-OnTimer298000:
- mapannounce "mjo_dun02.gat","Grer: Farewell, human!",0,0x70DBDB;
- end;
-
-OnTimer300000:
- warp "mjo_dun02.gat",118,56;
- disablenpc "Grer#1";
- end;
-
-OnTimer301000:
- stopnpctimer;
- end;
-
-OnInit:
- disablenpc "Grer#1";
- end;
-
-OnGrerOn:
- enablenpc "Grer#1";
- end;
-
-OnGrerOff:
- disablenpc "Grer#1";
- end;
-}
-
-mjo_dun02.gat,126,34,1 script Grer#1 826,{
-
- if(god_brising > 47)
-{
- mes "[Grer]";
- mes "As we promised,";
- mes "Brisingamen will appear in front of human's eyes. But until then, I shall make jewelry of silver. Mwahahaha~";
- close2;
- donpcevent "#brisindwarf4::OnGrerOff";
- end;
-}
- else if(god_brising == 46)
-{
- mes "[Grer]";
- mes "My name is Grer.";
- mes "I should have been the last one to be awakened. Now I see that I haven't mined as much silver as I may need.";
- next;
- mes "[Grer]";
- mes "You might think gold would better suit a goddess, but no. Silver is what makes her golden hair more beautiful.";
- next;
- mes "[Grer]";
- mes "Human, you must planned something fun. Hmm? You didn't plan anything at all? No matter.";
- next;
- mes "[Grer]";
- mes "Now that we're revived, there's a good chance that we may see her again. I don't really mind anything else.";
- next;
- mes "[Grer]";
- mes "I want her spirit and scent to fill this world. I don't want Odin or Heimdall to know our plan.";
- next;
- mes "[Grer]";
- mes "Now, this doesn't mean that I prefer humans over gods or giants, but if it's for Freya, I'll do anything.";
- next;
- mes "[Grer]";
- mes "Anyway, now my brothers have been revived. For that, I give you my thanks. Someday, you will have the power to challenge the gods.";
- next;
- mes "[Grer]";
- mes "Now, I need to go back to my business. You'll need a silver ornament for the necklace, so I'll continue to mine silver.";
- next;
- mes "[Grer]";
- mes "I shall be working hard to make the most beautiful ornament in the world.";
- next;
- mes "[Grer]";
- mes "Okay, you";
- mes "may go back now!";
- mes "Farewell.";
- set god_brising,47;
- close2;
- donpcevent "#brisindwarf4::OnGrerOff";
- end;
-}
- else if(god_brising == 47)
-{
- mes "[Grer]";
- mes "Heh heh...";
- mes "Why are you still";
- mes "here? Your job is done.";
- mes "Now, go back to where";
- mes "you came from!";
- close2;
- donpcevent "#brisindwarf4::OnGrerOff";
- end;
-}
- else
-{
- mes "[Grer]";
- mes "Who the";
- mes "hell are you?!";
- close2;
- donpcevent "#brisindwarf4::OnGrerOff";
- end;
-}
-
+//===== eAthena Script =======================================
+//= Brisingamen seal unlocking NPCs.
+//===== By: ==================================================
+//= SinSloth
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Quest for breaking the seal of Brisingamen.
+//===== Additional Comments: =================================
+// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
+// 1.0a Removed duplicates [Toms]
+//============================================================
+
+prt_fild08.gat,175,374,3 script Bard#brising 51,{
+
+ if ($God2 > 49 && $God3 < 100)
+{
+ if (god_brising > 49)
+ {
+ mes "[Nelliorde]";
+ mes "Oh, I guess you found what you wanted, huh? So how's it been going lately?";
+ next;
+ mes "[Nelliorde]";
+ mes "Recently I've been feeling strange, like something might happen soon. Aaah, forget, it's no big deal. Maybe I'm just being jumpy.";
+ next;
+ mes "[Nelliorde]";
+ mes "Right, right, let me play a song for you. Would you care to listen?";
+ next;
+ menu "Sure, why not~",L_Song,"How about some news?",L_News,"No thanks.",L_NoThx;
+ L_Song:
+ mes "[Nelliorde]";
+ mes "So, which song";
+ mes "would you like to hear?";
+ mes "Go ahead, pick one~";
+ next;
+ menu "Bragi's Poem",-,"Eternal Chaos",L_Chaos,"Assassin in the Sunset",L_Sunset,"Der Ring des Nibelungen",L_Nibel;
+ mes "[Nelliorde]";
+ mes "Bragi's Poem!";
+ mes "What a good choice!";
+ mes "I must say this song";
+ mes "represents the heart";
+ mes "of a poet!";
+ soundeffect "bragis_poem.wav",1;
+ close;
+
+ L_Chaos:
+ mes "[Nelliorde]";
+ mes "Eternal Chaos...";
+ mes "Sounds too chaotic.";
+ mes "By the way, I wonder";
+ mes "what the title really";
+ mes "means. Is it the chaos";
+ mes "of hell or our own reality?";
+ soundeffect "chaos_of_eternity.wav",1;
+ close;
+ L_Sunset:
+ mes "[Nelliorde]";
+ mes "Assassin in";
+ mes "the Sunset!";
+ mes "Yes, no one looks cooler than an Assassin, the bringer of death, standing alone in the sunset! Heh heh~";
+ soundeffect "assassin_of_sunset.wav",1;
+ close;
+ L_Nibel:
+ mes "[Nelliorde]";
+ mes "Der Ring des Nibelungen.....";
+ mes "Okay, are you ready to listen?";
+ mes "Hum hum hum....";
+ next;
+ soundeffect "ring_of_nibelungen.wav",1;
+ mes "^4D4DFFRheingold...";
+ mes "Hidden in the Rhein river.";
+ mes "If made into a ring,";
+ mes "Could rule the world~^000000";
+ next;
+ mes "^4D4DFFProtected by a spell";
+ mes "Cursing its thief";
+ mes "To never find love.";
+ mes "Alberich had known";
+ mes "Nonetheless stole it.";
+ mes "Love was forsaken for power.^000000";
+ next;
+ mes "^4D4DFFGiants built beautiful Valhalla";
+ mes "Matrimony with Freya";
+ mes "Goddess of beauty";
+ mes "Their supposed payment.";
+ mes "In not receiving it";
+ mes "They forcefully took her.^000000";
+ next;
+ mes "^4D4DFFThe gods would";
+ mes "give Alberich's treasure";
+ mes "To the Giants for Freya's return.";
+ mes "Loki tricked Alberich,";
+ mes "Stealing his ring or power.^000000";
+ next;
+ mes "^4D4DFFBut Alberich cursed his ring";
+ mes "Before it was returned to him,";
+ mes "Envy and death would";
+ mes "befall its wearers.^000000";
+ next;
+ mes "^4D4DFFThe ring was given to the giants";
+ mes "Freya was returned to the gods";
+ mes "The giants killed themselves";
+ mes "Fighting over the rheingold,";
+ mes "Victims of";
+ mes "Alberich's curse~^000000";
+ close;
+
+ L_News:
+ mes "[Nelliorde]";
+ mes "You wish to";
+ mes "hear of some news?";
+ mes "What kind of news do";
+ mes "you wish to know about?";
+ next;
+
+ menu "About Prontera!",-,"About seaside areas.",L_NewsSea,"Is the desert still hot?",L_NewsDes,"How about the borderlands?",L_NewsBord;
+ mes "[Nelliorde]";
+ mes "What?! Prontera?!";
+ mes "Can you not see that the front gate of Prontera is right before you? You should at least know where you are, adventurer.";
+ next;
+ mes "[Nelliorde]";
+ mes "Anyways, I know one interesting news about Prontera. But, it's a secret. Shh! Are you... Single?";
+ next;
+ mes "[Nelliorde]";
+ mes "If so, go visit the tavern. I met a guy there who took me a nice place. Oh yes. He took me 'the place' where singles are forbidden~!";
+ close;
+ L_NewsSea:
+ mes "[Nelliorde]";
+ mes "Seaside areas?";
+ mes "That's a funny question. I mean, there's Alberta and a few other places where you can see the sea.";
+ next;
+ mes "[Nelliorde]";
+ mes "To the SouthWest there's Kokomo Beach. But, I suppose it's too dangerous just to go there to take a stroll.";
+ next;
+ mes "[Nelliorde]";
+ mes "Kokomo beach is a large expanse of sand. The nearby water is filled with sea animals, so you can enjoy catching Shellfishes.";
+ next;
+ mes "[Nelliorde]";
+ mes "However, there are always bullies in that kind of place. Once, I met a threatening looking hoodlum with red spiky hair.";
+ next;
+ mes "[Nelliorde]";
+ mes "He was chewing on something and spat on the ground. He big buffoon managed to intimidate me into giving him all of my Zeny!";
+ next;
+ mes "[Nelliorde]";
+ mes "^333333*Sigh...*^000000";
+ mes "This world is too";
+ mes "dangerous for a young";
+ mes "and fragile Bard.";
+ next;
+ mes "[Nelliorde]";
+ mes "By the way, Alberta doesn't seem to have changed. The Sunken Ship looks the same as well, with all of its Skeleton Pirates and whatnot. You know how it is.";
+ next;
+ mes "[Nelliorde]";
+ mes "The event agency in charge of expeditions into the Sunken Ship is still making tons of money. If you have nothing to do, why don't you hunt for monsters down there?";
+ close;
+ L_NewsDes:
+ mes "[Nelliorde]";
+ mes "Oh, hell yes!";
+ mes "When is it not?";
+ mes "The desert is hot, has";
+ mes "been hot and probably";
+ mes "always will be...!";
+ next;
+ mes "[Nelliorde]";
+ mes "Giant worms still jump out of nowhere, freaking out innocent travellers like myself, and the Sandmen still kick people in the ass!";
+ next;
+ mes "[Nelliorde]";
+ mes "Even if the desert is filled with hideous monsters, the view of the ocean there is so magnificent. Hah, it makes me want to play a song.";
+ next;
+ mes "[Nelliorde]";
+ mes "I must say there is";
+ mes "one place you may wish";
+ mes "to see in the desert.";
+ next;
+ mes "[Nelliorde]";
+ mes "I'm talking about the Assassin Guild. Supposedly, it's hidden behind a sandstorm in the Morroc Desert!";
+
+ if (Class == Job_Assassin || Class == Job_Assassin_Cross) mes "But you should know what I am talking about! So when are you gonna take me to the guild, eh?";
+ else mes "Have you ever been there before?";
+ close;
+ L_NewsBord:
+ mes "[Nelliorde]";
+ mes "Well, to the north is the Schwaltzwald Republic.";
+ mes "There, you'll find Juno,";
+ mes "the 'City of Sages.'";
+ next;
+ mes "[Nelliorde]";
+ mes "The people there say that there is one major nuisance, a man known as the 'Mad Scientist.' He's antisocial and creates a lot of public disturbances with his experiments.";
+ next;
+ mes "[Nelliorde]";
+ mes "It seems everyone in Juno hates him with passion. Even one of the Tool Shop owners begged a passing adventurer to stop this Mad Scientist's research!";
+ next;
+ mes "[Nelliorde]";
+ mes "But I have a different opinion about him. I believe it's not a good idea to interrupt the work of any scientist. After all, he might just discover something important, even if his experiments are a little hazardous.";
+ next;
+ mes "[Nelliorde]";
+ mes "Speaking of discoveries, you know how Juno floats in the air, right?";
+ next;
+ mes "[Nelliorde]";
+ mes "It's said that a piece of Ymir's Heart generates enough power to keep the entire city aloft in the sky. Isn't that amazing?";
+ next;
+ mes "[Nelliorde]";
+ mes "Even more recent is the news about the discovery of Ymir's Book. You can read it in Juno's Sage Castle. I hear that it contains the secret to meeting Valkyrie...";
+ close;
+ L_NoThx:
+ mes "[Nelliorde]";
+ mes "Huh? Okay then, talk to you later. May Bragi bless you on your journeys.";
+ close;
+ }
+ else if(god_brising > 0 && god_brising < 50)
+ {
+ mes "[Nelliorde]";
+ mes "So, have you met Mr. Kaili? Please do your best. After all, I especially recommended you~";
+ next;
+
+ menu "Tell me a story.",-,"Sing a song for me.",L_Sing;
+ mes "[Nelliorde]";
+ mes "Hmm. What would be a good story for you this time...? Ah yes, I've got it. Let me tell you about one of my own adventures. It was a pretty amazing experience.";
+ next;
+ mes "[Nelliorde]";
+ mes "I went to Morroc, the city of the desert. On my way there, I became exhausted from the heat. Luckily, I found a hole beneath the shadows and climbed in to rest.";
+ next;
+ mes "[Nelliorde]";
+ mes "Oh my God...";
+ mes "If I had known";
+ mes "better, I never";
+ mes "would have gone";
+ mes "inside that place...";
+ next;
+ mes "[Nelliorde]";
+ mes "I actually crawled into the infamous ^FF0000Ant Hell^000000! I don't sound like a coward to you, do I?";
+ next;
+ mes "[Nelliorde]";
+ mes "Well, the ants aren't the only ones living there. I wasn't afraid of them at all. Except, of course, when they attacked in groups.";
+ next;
+ mes "[Nelliorde]";
+ mes "What I was really afraid of was this some sort of strawberry colored... tongue thing. Phreeoni!";
+ next;
+ mes "[Nelliorde]";
+ mes "Fortunately, I survived intact, although I still have nightmares of that man-sized tongue.";
+ next;
+ mes "[Nelliorde]";
+ mes "Once I got out of there, I craved human companionship and to restore my sense of normalcy. The closest place that I knew was Paros Lighthouse.";
+ next;
+ mes "[Nelliorde]";
+ mes "Yet again, I decided to traverse the desert, despite the fact that the Kafra Ladies provide a very convenient teleport service there.";
+ next;
+ mes "[Nelliorde]";
+ mes "Anyway, the fortress of Sandaruman is on the way to Paros Lighthouse. I remember Serutero, a guy I met in south Morroc, telling me about its scenic beauty.";
+ next;
+ mes "[Nelliorde]";
+ mes "I was so excited about seeing it for myself. After all, doesn't 'Sandaruman' sound like the name of a beautiful place?";
+ next;
+ mes "[Nelliorde]";
+ mes "But I immediately regret my decision once I arrived. Of course, the view was breathtaking: the sandy hills near the ocean, as well as the ruins.";
+ next;
+ mes "[Nelliorde]";
+ mes "Of course I forgot Serutero's warning about all the monsters. Argh! It was a nightmare! Instead of enjoying the scenary, I ended up running for my life.";
+ next;
+ mes "[Nelliorde]";
+ mes "I was still trying to escape those monsters when I stumbled upon an old house to the West of Sandaruman, that seemed to be in a state of decay.";
+ next;
+ mes "[Nelliorde]";
+ mes "I recalled that Serutero said that no one was living in that area, so I began to worry a bit. Still, I was desperate and needed refuge.";
+ next;
+ mes "[Nelliorde]";
+ mes "In my panic, I violently knocked on the door and screamed for someone to let me inside. Then do you know what I heard?";
+ next;
+ mes "[Nelliorde]";
+ mes "^FF0000Who's there?!";
+ mes "Who would dare";
+ mes "intrude my territory?^000000";
+ mes "I was freaked out! However owned that house must have been some kind of lunatic!";
+ next;
+ mes "[Nelliorde]";
+ mes "Th-then, with the specter of Death nipping at my heels, he told me to get lost! Luckily, I was saved by a mysterious, wandering SuperNovice, but that's another story.";
+ next;
+ mes "[Nelliorde]";
+ mes "In any case, I finally arrived at Paros Lighthouse. There, I learned that the old house was a secret camp for the Rogue Guild. ";
+ next;
+ mes "[Nelliorde]";
+ mes "It's amazing, how they can live in such dangerous areas. Only Rogues would be able to survive there, you know?";
+ next;
+ mes "[Nelliorde]";
+ mes "Ah...";
+ mes "I'm so tired from talking so much. But if I happen to have another adventure, I shall share that tale to you.";
+ close;
+
+ L_Sing:
+ mes "[Nelliorde]";
+ mes "Ah, you wish";
+ mes "to hear a song?";
+ mes "Okay! I shall then";
+ mes "perform my favorite.";
+ next;
+ mes "[Nelliorde]";
+ mes "I chased after fame.";
+ mes "It eluded me.";
+ mes "I ran after happiness";
+ mes "But never caught it.";
+ next;
+ mes "[Nelliorde]";
+ mes "But tomorrow will still";
+ mes "Be there, I'm sure.";
+ mes "Like the Water Mill";
+ mes "In Al De Baran";
+ mes "Which turns as";
+ mes "Life goes on.";
+ next;
+ mes "[Nelliorde]";
+ mes "Cheer up! Life goes on.";
+ mes "As surely as the Water";
+ mes "Mill turns, tomorrow";
+ mes "Will come.";
+ close;
+ }
+ else
+ {
+ mes "[Nelliorde]";
+ mes "Say...";
+ mes "Have we met before?";
+ mes "Hmm? Never? Well...";
+ mes "That's rather odd.";
+ next;
+ mes "[Nelliorde]";
+ mes "I seem to recall that you've asked me to give you some information if I ever have any. Well, now I have and shall share it with you~";
+ next;
+ mes "[Nelliorde]";
+ mes "The usefulness of this information all depends on you. Now, have you heard of the ^3333CCMonster Research Organization^000000?";
+ next;
+ mes "[Nelliorde]";
+ mes "I happened to get this information from its headquarters in Juno. So how does that sound?";
+ next;
+
+ menu "Wee~ I want to hear!",-,"Booooring~",L_Boring;
+ mes "[Nelliorde]";
+ mes "Well...!";
+ mes "You seem to be";
+ mes "very excited about";
+ mes "this new tidbit of";
+ mes "knowledge I have~";
+ next;
+
+ if(BaseLevel < 70)
+ {
+ mes "[Nelliorde]";
+ mes "Alas, this information doesn't seem to be very valuable to someone such as yourself.";
+ next;
+ mes "[Nelliorde]";
+ mes "I'm so very sorry to have excited you, but only people that are strong enough to handle grueling work can benefit from this.";
+ next;
+ mes "[Nelliorde]";
+ mes "Why don't you travel around and gain more experiences? I will let you know when you're ready, you know~";
+ close;
+ }
+ else
+ {
+ mes "[Nelliorde]";
+ mes "Ooh...";
+ mes "And you look";
+ mes "like you can handle";
+ mes "this kind of information.";
+ mes "I'll share everything I know!";
+ next;
+ mes "[Nelliorde]";
+ mes "One day, an adventurer discovered a strange, mysterious object. Unable to figure out what it could do, he visited the Monster Organization.";
+ next;
+ mes "[Nelliorde]";
+ mes "There, it was entrusted to a scholar by the name of Mr. Kaili. He still hasn't uncovered the truth about that item and wishes for assistance in his investigation.";
+ next;
+ mes "[Nelliorde]";
+ mes "Mr. Kaili suspects that the item might be part of an undiscovered ancient relic. Fortunately, he is also researching ancient relics as a project assigned by the royal court.";
+ next;
+ mes "[Nelliorde]";
+ mes "So what do you think? Isn't that interesting? Of course, you'd better speak to Mr. Kaili if you wish to learn more. If you'd like, I shall write you a letter or recommendation.";
+ next;
+
+ menu "Sure! Sounds good.",-,"Sorry, I am not that interested.",L_NoInterest;
+ mes "[Nelliorde]";
+ mes "Excellent..!";
+ mes "So you name is...";
+ mes "" + strcharinfo(0) + "?";
+ next;
+ mes "[Nelliorde]";
+ mes "Alright, I shall contact him, right away! Oh, and you can find the Monster Organization west of Juno's central plaza. It shouldn't be hard to find. Good luck!";
+ set god_brising,1;
+ close;
+ L_NoInterest:
+ mes "[Nelliorde]";
+ mes "Ah, it's disappointing to hear that. I thought that you'd be perfect to help out Mr. Kaili. Oh well, talk to you later~";
+ close;
+ }
+ L_Boring:
+ mes "[Nelliorde]";
+ mes "Boring, you say?";
+ mes "Perhaps, but not as";
+ mes "boring as an adventurer";
+ mes "that passes up a chance";
+ mes "for an adventure, yes?";
+ next;
+ menu "Tell me a story.",-,"Sing a song for me.",L_Sing2;
+ mes "[Nelliorde]";
+ mes "Hmm. What would be a good story for you this time...? Ah yes, I've got it. Let me tell you about one of my own adventures. It was a pretty amazing experience.";
+ next;
+ mes "[Nelliorde]";
+ mes "I went to Morroc, the city of the desert. On my way there, I became exhausted from the heat. Luckily, I found a hole beneath the shadows and climbed in to rest.";
+ next;
+ mes "[Nelliorde]";
+ mes "Oh my God...";
+ mes "If I had known";
+ mes "better, I never";
+ mes "would have gone";
+ mes "inside that place...";
+ next;
+ mes "[Nelliorde]";
+ mes "I actually crawled into the infamous ^FF0000Ant Hell^000000! I don't sound like a coward to you, do I?";
+ next;
+ mes "[Nelliorde]";
+ mes "Well, the ants aren't the only ones living there. I wasn't afraid of them at all. Except, of course, when they attacked in groups.";
+ next;
+ mes "[Nelliorde]";
+ mes "What I was really afraid of was this some sort of strawberry colored... tongue thing. Phreeoni!";
+ next;
+ mes "[Nelliorde]";
+ mes "Fortunately, I survived intact, although I still have nightmares of that man-sized tongue.";
+ next;
+ mes "[Nelliorde]";
+ mes "Once I got out of there, I craved human companionship and to restore my sense of normalcy. The closest place that I knew was Paros Lighthouse.";
+ next;
+ mes "[Nelliorde]";
+ mes "Yet again, I decided to traverse the desert, despite the fact that the Kafra Ladies provide a very convenient teleport service there.";
+ next;
+ mes "[Nelliorde]";
+ mes "Anyway, the fortress of Sandaruman is on the way to Paros Lighthouse. I remember Serutero, a guy I met in south Morroc, telling me about its scenic beauty.";
+ next;
+ mes "[Nelliorde]";
+ mes "I was so excited about seeing it for myself. After all, doesn't 'Sandaruman' sound like the name of a beautiful place?";
+ next;
+ mes "[Nelliorde]";
+ mes "But I immediately regret my decision once I arrived. Of course, the view was breathtaking: the sandy hills near the ocean, as well as the ruins.";
+ next;
+ mes "[Nelliorde]";
+ mes "Of course I forgot Serutero's warning about all the monsters. Argh! It was a nightmare! Instead of enjoying the scenary, I ended up running for my life.";
+ next;
+ mes "[Nelliorde]";
+ mes "I was still trying to escape those monsters when I stumbled upon an old house to the West of Sandaruman, that seemed to be in a state of decay.";
+ next;
+ mes "[Nelliorde]";
+ mes "I recalled that Serutero said that no one was living in that area, so I began to worry a bit. Still, I was desperate and needed refuge.";
+ next;
+ mes "[Nelliorde]";
+ mes "In my panic, I violently knocked on the door and screamed for someone to let me inside. Then do you know what I heard?";
+ next;
+ mes "[Nelliorde]";
+ mes "^FF0000Who's there?!";
+ mes "Who would dare";
+ mes "intrude my territory?^000000";
+ mes "I was freaked out! However owned that house must have been some kind of lunatic!";
+ next;
+ mes "[Nelliorde]";
+ mes "Th-then, with the specter of Death nipping at my heels, he told me to get lost! Luckily, I was saved by a mysterious, wandering SuperNovice, but that's another story.";
+ next;
+ mes "[Nelliorde]";
+ mes "In any case, I finally arrived at Paros Lighthouse. There, I learned that the old house was a secret camp for the Rogue Guild. ";
+ next;
+ mes "[Nelliorde]";
+ mes "It's amazing, how they can live in such dangerous areas. Only Rogues would be able to survive there, you know?";
+ next;
+ mes "[Nelliorde]";
+ mes "Ah...";
+ mes "I'm so tired from talking so much. But if I happen to have another adventure, I shall share that tale to you.";
+ close;
+
+ L_Sing2:
+ mes "[Nelliorde]";
+ mes "Ah, you wish";
+ mes "to hear a song?";
+ mes "Okay! I shall then";
+ mes "perform my favorite.";
+ next;
+ mes "[Nelliorde]";
+ mes "I chased after fame.";
+ mes "It eluded me.";
+ mes "I ran after happiness";
+ mes "But never caught it.";
+ next;
+ mes "[Nelliorde]";
+ mes "But tomorrow will still";
+ mes "Be there, I'm sure.";
+ mes "Like the Water Mill";
+ mes "In Al De Baran";
+ mes "Which turns as";
+ mes "Life goes on.";
+ next;
+ mes "[Nelliorde]";
+ mes "Cheer up! Life goes on.";
+ mes "As surely as the Water";
+ mes "Mill turns, tomorrow";
+ mes "Will come.";
+ close;
+ }
+}
+ else
+{
+ mes "[Nelliorde]";
+ mes "Hello there!";
+ mes "Isn't it such";
+ mes "a glorious day?";
+ mes "You know of me,";
+ mes "do you not?";
+ next;
+ mes "[Nelliorde]";
+ if (Sex) mes "Hahahaha, forgive my rudeness, but I fail to remember your name, although your face does seem rather familiar.";
+ else
+ {
+ mes "Oh well well...";
+ mes "How could I ever";
+ mes "forget the lovely";
+ mes ""+ strcharinfo(0) +"?";
+ }
+ mes "Whatever, hahahaha!";
+ next;
+ mes "[Nelliorde]";
+ mes "So, aren't you curious about me? Feel free to ask me whatever you like! I'm the vagabond that will wander the earth till the end of his days, your friend who loves to sing under the moonlight~";
+ next;
+ menu "Who are you?",-,"What's new?",L_New,"Can you sing?",L_Sing3;
+ mes "[Nelliorde]";
+ mes "Why, I am Nelliorde, the Bard. In truth, my real name is Elliorde.";
+ next;
+ mes "[Nelliorde]";
+ mes "However, while I was singing at a Tavern, as per usual, a man with long blonde hair angrily demanded that I change my name!";
+ next;
+ mes "[Nelliorde]";
+ mes "Never before have I seen such a flailing and a fuss over someone coincidentally sharing the same name!";
+ next;
+ mes "[Nelliorde]";
+ mes "And so, that little altercation was settled with me being named Nelliorde.";
+ next;
+ mes "[Nelliorde]";
+ mes "I don't sound like a coward to you, do I? Do you believe I should have fought for the right to keep my original name?";
+ next;
+ mes "[Nelliorde]";
+ mes "If so, you're wrong! I just don't believe that violence can solve anything as the romantic Bard that cherishes peace...";
+ next;
+ mes "^3355FFSeeing as it's not worth";
+ mes "listening to Nelliorde's lies, you decide to simply tune him out.^000000";
+ next;
+ mes "^3355FF...";
+ mes "......^000000";
+ next;
+ mes "^3355FF...";
+ mes "......";
+ mes ".........^000000";
+ next;
+ mes "[Nelliorde]";
+ mes "And that's how I convinced wise and benevolent King Tristram III to build a paradise where married lovers could enjo- Hm? Are you even listening?!";
+ close;
+
+ L_New:
+ mes "[Nelliorde]";
+ mes "You wish to";
+ mes "hear of some news?";
+ mes "What kind of news do";
+ mes "you wish to know about?";
+ next;
+
+ menu "About Prontera!",-,"About seaside areas.",L_NewsSea2,"Is the desert still hot?",L_NewsDes2,"How about the borderlands?",L_NewsBord2;
+ mes "[Nelliorde]";
+ mes "What?! Prontera?!";
+ mes "Can you not see that the front gate of Prontera is right before you? You should at least know where you are, adventurer.";
+ next;
+ mes "[Nelliorde]";
+ mes "Anyways, I know one interesting news about Prontera. But, it's a secret. Shh! Are you... Single?";
+ next;
+ mes "[Nelliorde]";
+ mes "If so, go visit the tavern. I met a guy there who took me a nice place. Oh yes. He took me 'the place' where singles are forbidden~!";
+ close;
+ L_NewsSea2:
+ mes "[Nelliorde]";
+ mes "Seaside areas?";
+ mes "That's a funny question. I mean, there's Alberta and a few other places where you can see the sea.";
+ next;
+ mes "[Nelliorde]";
+ mes "To the SouthWest there's Kokomo Beach. But, I suppose it's too dangerous just to go there to take a stroll.";
+ next;
+ mes "[Nelliorde]";
+ mes "Kokomo beach is a large expanse of sand. The nearby water is filled with sea animals, so you can enjoy catching Shellfishes.";
+ next;
+ mes "[Nelliorde]";
+ mes "However, there are always bullies in that kind of place. Once, I met a threatening looking hoodlum with red spiky hair.";
+ next;
+ mes "[Nelliorde]";
+ mes "He was chewing on something and spat on the ground. He big buffoon managed to intimidate me into giving him all of my Zeny!";
+ next;
+ mes "[Nelliorde]";
+ mes "^333333*Sigh...*^000000";
+ mes "This world is too";
+ mes "dangerous for a young";
+ mes "and fragile Bard.";
+ next;
+ mes "[Nelliorde]";
+ mes "By the way, Alberta doesn't seem to have changed. The Sunken Ship looks the same as well, with all of its Skeleton Pirates and whatnot. You know how it is.";
+ next;
+ mes "[Nelliorde]";
+ mes "The event agency in charge of expeditions into the Sunken Ship is still making tons of money. If you have nothing to do, why don't you hunt for monsters down there?";
+ close;
+ L_NewsDes2:
+ mes "[Nelliorde]";
+ mes "Oh, hell yes!";
+ mes "When is it not?";
+ mes "The desert is hot, has";
+ mes "been hot and probably";
+ mes "always will be...!";
+ next;
+ mes "[Nelliorde]";
+ mes "Giant worms still jump out of nowhere, freaking out innocent travellers like myself, and the Sandmen still kick people in the ass!";
+ next;
+ mes "[Nelliorde]";
+ mes "Even if the desert is filled with hideous monsters, the view of the ocean there is so magnificent. Hah, it makes me want to play a song.";
+ next;
+ mes "[Nelliorde]";
+ mes "I must say there is";
+ mes "one place you may wish";
+ mes "to see in the desert.";
+ next;
+ mes "[Nelliorde]";
+ mes "I'm talking about the Assassin Guild. Supposedly, it's hidden behind a sandstorm in the Morroc Desert!";
+
+ if (Class == Job_Assassin || Class == Job_Assassin_Cross) mes "But you should know what I am talking about! So when are you gonna take me to the guild, eh?";
+ else mes "Have you ever been there before?";
+ close;
+ L_NewsBord2:
+ mes "[Nelliorde]";
+ mes "Well, to the north is the Schwaltzwald Republic.";
+ mes "There, you'll find Juno,";
+ mes "the 'City of Sages.'";
+ next;
+ mes "[Nelliorde]";
+ mes "The people there say that there is one major nuisance, a man known as the 'Mad Scientist.' He's antisocial and creates a lot of public disturbances with his experiments.";
+ next;
+ mes "[Nelliorde]";
+ mes "It seems everyone in Juno hates him with passion. Even one of the Tool Shop owners begged a passing adventurer to stop this Mad Scientist's research!";
+ next;
+ mes "[Nelliorde]";
+ mes "But I have a different opinion about him. I believe it's not a good idea to interrupt the work of any scientist. After all, he might just discover something important, even if his experiments are a little hazardous.";
+ next;
+ mes "[Nelliorde]";
+ mes "Speaking of discoveries, you know how Juno floats in the air, right?";
+ next;
+ mes "[Nelliorde]";
+ mes "It's said that a piece of Ymir's Heart generates enough power to keep the entire city aloft in the sky. Isn't that amazing?";
+ next;
+ mes "[Nelliorde]";
+ mes "Even more recent is the news about the discovery of Ymir's Book. You can read it in Juno's Sage Castle. I hear that it contains the secret to meeting Valkyrie...";
+ close;
+
+ L_Sing3:
+ mes "[Nelliorde]";
+ mes "Can I sing, you ask? Certainly, and if I may say so, pleasureably. Which song would you care to hear?";
+ next;
+ menu "Bragi's Poem",-,"Eternal Chaos",L_Chaos2,"Assassin in the Sunset",L_Sunset2;
+
+ if(Zeny > 499)
+ {
+ mes "[Nelliorde]";
+ mes "Bragi's Poem!";
+ mes "What a good choice!";
+ mes "I must say this song represents the heart of a poet!";
+ soundeffect "bragis_poem.wav",1;
+ set Zeny,Zeny - 500;
+ close;
+ }
+ else
+ {
+ mes "[Nelliorde]";
+ mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
+ close;
+ }
+
+ L_Chaos2:
+ if(Zeny > 499)
+ {
+ mes "[Nelliorde]";
+ mes "You must like robust and energetic music, eh? As you wish~";
+ soundeffect "chaos_of_eternity.wav",1;
+ set Zeny,Zeny - 500;
+ close;
+ }
+ else
+ {
+ mes "[Nelliorde]";
+ mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
+ close;
+ }
+
+ L_Sunset2:
+ if(Zeny > 499)
+ {
+ mes "[Nelliorde]";
+ mes "Excellent choice!";
+ mes "Somehow, the image of the setting sun fits well with Assassins. Don't you agree?";
+ soundeffect "assassin_of_sunset.wav",1;
+ set Zeny,Zeny - 500;
+ close;
+ }
+ else
+ {
+ mes "[Nelliorde]";
+ mes "Please forgive me, but I cannot play a song for free. The world is harsh, and a frail Bard such as myself must have some means to survive~";
+ close;
+ }
+}
+
+}
+
+yuno_in04.gat,47,113,1 script Studying Scholar#1 749,{
+
+ if($God3 == 100)
+{
+ mes "[Studying Scholar]";
+ mes "Hmmm...";
+ mes "The highest quality Red Potion ever...";
+ next;
+ mes "[Studying Scholar]";
+ mes "If only I could figure a way to balance the consistency of the ground Red Herbs mixed with the water. That part is most crucial...";
+ close;
+}
+
+ if($God2 > 49)
+{
+ if(god_brising == 50)
+ {
+ mes "[Enrico Kaili]";
+ mes "Ah, " + strcharinfo(0) + ",";
+ mes "you've returned.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Learning about Brisingamen was truly fascinating. But since we've hit a plateau for now, I've started a new research project.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Hahahaha~";
+ mes "I'm sorry, but I cannot tell you about it for now, since it's confidential. But once I get a chance, I'll ask you for help.";
+ close;
+ }
+ else if(god_brising == 49)
+ {
+ mes "[Enrico Kaili]";
+ mes "Ah, I see. So it's true that Berling sealed himself in the ripple where the goddess' tear fell into the waters.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Oh! I'm so excited! I don't know what to do first! Should I report to His Majesty or publish my findings or...";
+ next;
+ menu "^333333*Ahem!*^000000 My reward!",-;
+ mes "[Enrico Kaili]";
+ mes "Oh, right.";
+ mes "Thank you for all the trouble you have endured for my sake. You are truly one of the best researchers I've ever met.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Then as promised...";
+ mes "I will give you something from my precious collection! Now, let me see what we have here...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Please...";
+ mes "Take this";
+ set @card,rand(1,1210);
+ if ((@card > 0 ) && (@card < 11))
+ {
+ mes "Poring Card.";
+ set god_brising,50;
+ getitem "Poring_Card",1;
+ }
+ else if ((@card > 10) && (@card < 21))
+ {
+ mes "Fabre Card.";
+ set god_brising,50;
+ getitem "Fabre_Card",1;
+ }
+ else if ((@card > 20) && (@card < 26))
+ {
+ mes "Pupa Card.";
+ set god_brising,50;
+ getitem "Pupa_Card",1;
+ }
+ else if ((@card > 25) && (@card < 41))
+ {
+ mes "Drops Card.";
+ set god_brising,50;
+ getitem "Drops_Card",1;
+ }
+ else if ((@card > 40) && (@card < 51))
+ {
+ mes "Lunatic Card.";
+ set god_brising,50;
+ getitem "Lunatic_Card",1;
+ }
+ else if ((@card > 50) && (@card < 56))
+ {
+ mes "Peco Peco Egg Card.";
+ set god_brising,50;
+ getitem "Pecopeco_Egg_Card",1;
+ }
+ else if ((@card > 55) && (@card < 71))
+ {
+ mes "Picky Card.";
+ set god_brising,50;
+ getitem "Picky_Card",1;
+ }
+ else if ((@card > 70) && (@card < 81))
+ {
+ mes "Chonchon Card.";
+ set god_brising,50;
+ getitem "Chonchon_Card",1;
+ }
+ else if ((@card > 80) && (@card < 91))
+ {
+ mes "Willow Card.";
+ set god_brising,50;
+ getitem "Wilow_Card",1;
+ }
+ else if ((@card > 90) && (@card < 101))
+ {
+ mes "Thief Bug Egg Card.";
+ set god_brising,50;
+ getitem "Thief_Bug_Egg_Card",1;
+ }
+ else if ((@card > 100) && (@card < 111))
+ {
+ mes "Andre Egg Card.";
+ set god_brising,50;
+ getitem "Andre_Egg_Card",1;
+ }
+ else if ((@card > 110) && (@card < 121))
+ {
+ mes "Roda Frog Card.";
+ set god_brising,50;
+ getitem "Roda_Frog_Card",1;
+ }
+ else if ((@card > 120) && (@card < 131))
+ {
+ mes "Condor Card.";
+ set god_brising,50;
+ getitem "Condor_Card",1;
+ }
+ else if ((@card > 130) && (@card < 141))
+ {
+ mes "Thief Bug Card.";
+ set god_brising,50;
+ getitem "Thief_Bug_Card",1;
+ }
+ else if ((@card > 140) && (@card < 151))
+ {
+ mes "Savage Bebe Card.";
+ set god_brising,50;
+ getitem "Savage_Babe_Card",1;
+ }
+ else if ((@card > 150) && (@card < 161))
+ {
+ mes "Hornet Card.";
+ set god_brising,50;
+ getitem "Hornet_Card",1;
+ }
+ else if ((@card > 160) && (@card < 171))
+ {
+ mes "Hornet Card.";
+ set god_brising,50;
+ getitem "Hornet_Card",1;
+ }
+ else if ((@card > 170) && (@card < 181))
+ {
+ mes "Familiar Card.";
+ set god_brising,50;
+ getitem "Farmiliar_Card",1;
+ }
+ else if ((@card > 180) && (@card < 191))
+ {
+ mes "Rocker Card.";
+ set god_brising,50;
+ getitem "Rocker_Card",1;
+ }
+ else if ((@card > 190) && (@card < 201))
+ {
+ mes "Spore Card.";
+ set god_brising,50;
+ getitem "Spore_Card",1;
+ }
+ else if ((@card > 200) && (@card < 211))
+ {
+ mes "Baby Desert Wolf Card.";
+ set god_brising,50;
+ getitem "Desert_Wolf_Babe_Card",1;
+ }
+ else if ((@card > 210) && (@card < 221))
+ {
+ mes "Plankton Card.";
+ set god_brising,50;
+ getitem "Plankton_Card",1;
+ }
+ else if ((@card > 220) && (@card < 231))
+ {
+ mes "Skeleton Card.";
+ set god_brising,50;
+ getitem "Skeleton_Card",1;
+ }
+ else if ((@card > 230) && (@card < 241))
+ {
+ mes "Female Thief Bug Card.";
+ set god_brising,50;
+ getitem "Thief_Bug_Female_Card",1;
+ }
+ else if ((@card > 240) && (@card < 251))
+ {
+ mes "Kukre Card.";
+ set god_brising,50;
+ getitem "Kukre_Card",1;
+ }
+ else if ((@card > 250) && (@card < 261))
+ {
+ mes "Tarou Card.";
+ set god_brising,50;
+ getitem "Tarou_Card",1;
+ }
+ else if ((@card > 260) && (@card < 271))
+ {
+ mes "Wolf Card.";
+ set god_brising,50;
+ getitem "Wolf_Card",1;
+ }
+ else if ((@card > 270) && (@card < 281))
+ {
+ mes "Mandragora Card.";
+ set god_brising,50;
+ getitem "Mandragora_Card",1;
+ }
+ else if ((@card > 280) && (@card < 291))
+ {
+ mes "Peco Peco Card.";
+ set god_brising,50;
+ getitem "Pecopeco_Card",1;
+ }
+ else if ((@card > 290) && (@card < 301))
+ {
+ mes "Ambernite Card.";
+ set god_brising,50;
+ getitem "Ambernite_Card",1;
+ }
+ else if ((@card > 300) && (@card < 311))
+ {
+ mes "Poporing Card.";
+ set god_brising,50;
+ getitem "Poporing_Card",1;
+ }
+ else if ((@card > 310) && (@card < 321))
+ {
+ mes "Worm Tail Card.";
+ set god_brising,50;
+ getitem "Worm_Tail_Card",1;
+ }
+ else if ((@card > 320) && (@card < 326))
+ {
+ mes "Hydra Card.";
+ set god_brising,50;
+ getitem "Hydra_Card",1;
+ }
+ else if ((@card > 325) && (@card < 341))
+ {
+ mes "Muka Card.";
+ set god_brising,50;
+ getitem "Muka_Card",1;
+ }
+ else if ((@card > 340) && (@card < 351))
+ {
+ mes "Snake Card.";
+ set god_brising,50;
+ getitem "Snake_Card",1;
+ }
+ else if ((@card > 350) && (@card < 361))
+ {
+ mes "Zombie Card.";
+ set god_brising,50;
+ getitem "Zombie_Card",1;
+ }
+ else if ((@card > 360) && (@card < 371))
+ {
+ mes "Stainer Card.";
+ set god_brising,50;
+ getitem "Stainer_Card",1;
+ }
+ else if ((@card > 370) && (@card < 376))
+ {
+ mes "Creamy Card.";
+ set god_brising,50;
+ getitem "Creamy_Card",1;
+ }
+ else if ((@card > 375) && (@card < 391))
+ {
+ mes "Coco Card.";
+ set god_brising,50;
+ getitem "Coco_Card",1;
+ }
+ else if ((@card > 390) && (@card < 401))
+ {
+ mes "Steel Chonchon Card.";
+ set god_brising,50;
+ getitem "Steel_Chonchon_Card",1;
+ }
+ else if ((@card > 400) && (@card < 411))
+ {
+ mes "Andre Card.";
+ set god_brising,50;
+ getitem "Andre_Card",1;
+ }
+ else if ((@card > 410) && (@card < 421))
+ {
+ mes "Smokie Card.";
+ set god_brising,50;
+ getitem "Smokie_Card",1;
+ }
+ else if ((@card > 420) && (@card < 431))
+ {
+ mes "Horn Card.";
+ set god_brising,50;
+ getitem "Horn_Card",1;
+ }
+ else if ((@card > 430) && (@card < 441))
+ {
+ mes "Martin Card.";
+ set god_brising,50;
+ getitem "Martin_Card",1;
+ }
+ else if ((@card > 440) && (@card < 451))
+ {
+ mes "Poison Spore Card.";
+ set god_brising,50;
+ getitem "Poison_Spore_Card",1;
+ }
+ else if ((@card > 450) && (@card < 461))
+ {
+ mes "Vadon Card.";
+ set god_brising,50;
+ getitem "Vadon_Card",1;
+ }
+ else if ((@card > 460) && (@card < 466))
+ {
+ mes "Male Thief Bug Card.";
+ set god_brising,50;
+ getitem "Thief_Bug_Male_Card",1;
+ }
+ else if ((@card > 465) && (@card < 481))
+ {
+ mes "Yoyo Card.";
+ set god_brising,50;
+ getitem "Yoyo_Card",1;
+ }
+ else if ((@card > 480) && (@card < 491))
+ {
+ mes "Elder Willow Card.";
+ set god_brising,50;
+ getitem "Elder_Wilow_Card",1;
+ }
+ else if ((@card > 490) && (@card < 496))
+ {
+ mes "Vitata Card.";
+ set god_brising,50;
+ getitem "Vitata_Card",1;
+ }
+ else if ((@card > 495) && (@card < 511))
+ {
+ mes "Marina Card.";
+ set god_brising,50;
+ getitem "Marina_Card",1;
+ }
+ else if ((@card > 510) && (@card < 521))
+ {
+ mes "Dustiness Card.";
+ set god_brising,50;
+ getitem "Dustiness_Card",1;
+ }
+ else if ((@card > 520) && (@card < 536))
+ {
+ mes "Metaller Card.";
+ set god_brising,50;
+ getitem "Metaller_Card",1;
+ }
+ else if ((@card > 535) && (@card < 541))
+ {
+ mes "Thara Frog Card.";
+ set god_brising,50;
+ getitem "Thara_Frog_Card",1;
+ }
+ else if ((@card > 540) && (@card < 551))
+ {
+ mes "Drops Card.";
+ set god_brising,50;
+ getitem "Drops_Card",1;
+ }
+ else if ((@card > 550) && (@card < 561))
+ {
+ mes "Goblin Card.";
+ set god_brising,50;
+ getitem "Goblin_Card",1;
+ }
+ else if ((@card > 560) && (@card < 571))
+ {
+ mes "Cornutus Card.";
+ set god_brising,50;
+ getitem "Cornutus_Card",1;
+ }
+ else if ((@card > 570) && (@card < 581))
+ {
+ mes "Anacondaq Card.";
+ set god_brising,50;
+ getitem "Anacondaq_Card",1;
+ }
+ else if ((@card > 580) && (@card < 596))
+ {
+ mes "Caramel Card.";
+ set god_brising,50;
+ getitem "Caramel_Card",1;
+ }
+ else if ((@card > 595) && (@card < 601))
+ {
+ mes "Zerom Card.";
+ set god_brising,50;
+ getitem "Zerom_Card",1;
+ }
+ else if ((@card > 600) && (@card < 606))
+ {
+ mes "Kaho Card.";
+ set god_brising,50;
+ getitem "Kaho_Card",1;
+ }
+ else if ((@card > 605) && (@card < 621))
+ {
+ mes "Orc Warrior Card.";
+ set god_brising,50;
+ getitem "Orc_Warrior_Card",1;
+ }
+ else if ((@card > 620) && (@card < 631))
+ {
+ mes "Megalodon Card.";
+ set god_brising,50;
+ getitem "Megalodon_Card",1;
+ }
+ else if ((@card > 630) && (@card < 641))
+ {
+ mes "Scorpion Card.";
+ set god_brising,50;
+ getitem "Scorpion_Card",1;
+ }
+ else if ((@card > 640) && (@card < 651))
+ {
+ mes "Drainliar Card.";
+ set god_brising,50;
+ getitem "Drainliar_Card",1;
+ }
+ else if ((@card > 650) && (@card < 661))
+ {
+ mes "Orc Zombie Card.";
+ set god_brising,50;
+ getitem "Orc_Zombie_Card",1;
+ }
+ else if ((@card > 660) && (@card < 671))
+ {
+ mes "Golem Card.";
+ set god_brising,50;
+ getitem "Golem_Card",1;
+ }
+ else if ((@card > 670) && (@card < 681))
+ {
+ mes "Pirate Skel Card.";
+ set god_brising,50;
+ getitem "Pirate_Skel_Card",1;
+ }
+ else if ((@card > 680) && (@card < 691))
+ {
+ mes "Bigfoot Card.";
+ set god_brising,50;
+ getitem "BigFoot_Card",1;
+ }
+ else if ((@card > 690) && (@card < 701))
+ {
+ mes "Argos Card.";
+ set god_brising,50;
+ getitem "Argos_Card",1;
+ }
+ else if ((@card > 700) && (@card < 716))
+ {
+ mes "Magnolia Card.";
+ set god_brising,50;
+ getitem "Magnolia_Card",1;
+ }
+ else if ((@card > 715) && (@card < 721))
+ {
+ mes "Phen Card.";
+ set god_brising,50;
+ getitem "Phen_Card",1;
+ }
+ else if ((@card > 720) && (@card < 726))
+ {
+ mes "Mantis Card.";
+ set god_brising,50;
+ getitem "Mantis_Card",1;
+ }
+ else if ((@card > 725) && (@card < 741))
+ {
+ mes "Flora Card.";
+ set god_brising,50;
+ getitem "Flora_Card",1;
+ }
+ else if ((@card > 740) && (@card < 751))
+ {
+ mes "Hode Card.";
+ set god_brising,50;
+ getitem "Hode_Card",1;
+ }
+ else if ((@card > 750) && (@card < 761))
+ {
+ mes "Desert Wolf Card.";
+ set god_brising,50;
+ getitem "Desert_Wolf_Card",1;
+ }
+ else if ((@card > 760) && (@card < 766))
+ {
+ mes "Rafflesia Card.";
+ set god_brising,50;
+ getitem "Rafflesia_Card",1;
+ }
+ else if ((@card > 765) && (@card < 781))
+ {
+ mes "Marine Sphere Card.";
+ set god_brising,50;
+ getitem "Marine_Sphere_Card",1;
+ }
+ else if ((@card > 780) && (@card < 791))
+ {
+ mes "Orc Skeleton Card.";
+ set god_brising,50;
+ getitem "Orc_Skeleton_Card",1;
+ }
+ else if ((@card > 790) && (@card < 796))
+ {
+ mes "Soldier Skeleton Card.";
+ set god_brising,50;
+ getitem "Soldier_Skeleton_Card",1;
+ }
+ else if ((@card > 795) && (@card < 811))
+ {
+ mes "Giearth Card.";
+ set god_brising,50;
+ getitem "Giearth_Card",1;
+ }
+ else if ((@card > 810) && (@card < 816))
+ {
+ mes "Frilldora Card.";
+ set god_brising,50;
+ getitem "Frilldora_Card",1;
+ }
+ else if ((@card > 815) && (@card < 831))
+ {
+ mes "Swordfish Card.";
+ set god_brising,50;
+ getitem "Sword_Fish_Card",1;
+ }
+ else if ((@card > 830) && (@card < 841))
+ {
+ mes "Munak Card.";
+ set god_brising,50;
+ getitem "Munak_Card",1;
+ }
+ else if ((@card > 840) && (@card < 851))
+ {
+ mes "Kobold Card.";
+ set god_brising,50;
+ getitem "Kobold_Card",1;
+ }
+ else if ((@card > 850) && (@card < 861))
+ {
+ mes "Skel Worker Card.";
+ set god_brising,50;
+ getitem "Skel_Worker_Card",1;
+ }
+ else if ((@card > 860) && (@card < 871))
+ {
+ mes "Obeaune Card.";
+ set god_brising,50;
+ getitem "Obeaune_Card",1;
+ }
+ else if ((@card > 870) && (@card < 881))
+ {
+ mes "Archer Skeleton Card.";
+ set god_brising,50;
+ getitem "Archer_Skeleton_Card",1;
+ }
+ else if ((@card > 880) && (@card < 891))
+ {
+ mes "Marse Card.";
+ set god_brising,50;
+ getitem " Marse_Card",1;
+ }
+ else if ((@card > 890) && (@card < 901))
+ {
+ mes "Zenorc Card.";
+ set god_brising,50;
+ getitem "Zenorc_Card",1;
+ }
+ else if ((@card > 900) && (@card < 906))
+ {
+ mes "Matyr Card.";
+ set god_brising,50;
+ getitem "Matyr_Card",1;
+ }
+ else if ((@card > 905) && (@card < 921))
+ {
+ mes "Dokebi Card.";
+ set god_brising,50;
+ getitem "Dokebi_Card",1;
+ }
+ else if ((@card > 920) && (@card < 931))
+ {
+ mes "Pasana Card.";
+ set god_brising,50;
+ getitem "Pasana_Card",1;
+ }
+ else if ((@card > 930) && (@card < 941))
+ {
+ mes "Sohee Card.";
+ set god_brising,50;
+ getitem "Sohee_Card",1;
+ }
+ else if ((@card > 940) && (@card < 951))
+ {
+ mes "Sandman Card.";
+ set god_brising,50;
+ getitem "Sand_Man_Card",1;
+ }
+ else if ((@card > 950) && (@card < 956))
+ {
+ mes "Whisper Card.";
+ set god_brising,50;
+ getitem "Whisper_Card",1;
+ }
+ else if ((@card > 965) && (@card < 971))
+ {
+ mes "Horong Card.";
+ set god_brising,50;
+ getitem "Horong_Card",1;
+ }
+ else if ((@card > 970) && (@card < 981))
+ {
+ mes "Requiem Card.";
+ set god_brising,50;
+ getitem "Requiem_Card",1;
+ }
+ else if ((@card > 980) && (@card < 986))
+ {
+ mes "Marc Card.";
+ set god_brising,50;
+ getitem "Marc_Card",1;
+ }
+ else if ((@card > 985) && (@card < 991))
+ {
+ mes "Mummy Card.";
+ set god_brising,50;
+ getitem "Mummy_Card",1;
+ }
+ else if ((@card > 990) && (@card < 996))
+ {
+ mes "Verit Card.";
+ set god_brising,50;
+ getitem "Verit_Card",1;
+ }
+ else if ((@card > 995) && (@card < 1001))
+ {
+ mes "Myst Card.";
+ set god_brising,50;
+ getitem "Myst_Card",1;
+ }
+ else if ((@card > 1000) && (@card < 1011))
+ {
+ mes "Jakk Card.";
+ set god_brising,50;
+ getitem "Jakk_Card",1;
+ }
+ else if ((@card > 1010) && (@card < 1021))
+ {
+ mes "Ghoul Card.";
+ set god_brising,50;
+ getitem "Ghoul_Card",1;
+ }
+ else if ((@card > 1020) && (@card < 1031))
+ {
+ mes "Strouf Card.";
+ set god_brising,50;
+ getitem "Strouf_Card",1;
+ }
+ else if ((@card > 1030) && (@card < 1041))
+ {
+ mes "Marduk Card.";
+ set god_brising,50;
+ getitem "Marduk_Card",1;
+ }
+ else if ((@card > 1040) && (@card < 1051))
+ {
+ mes "Marionette Card.";
+ set god_brising,50;
+ getitem "Marionette_Card",1;
+ }
+ else if ((@card > 1050) && (@card < 1061))
+ {
+ mes "Here is an Argiope Card.";
+ set god_brising,50;
+ getitem "Argiope_Card",1;
+ }
+ else if ((@card > 1060) && (@card < 1071))
+ {
+ mes "Hunter Fly Card.";
+ set god_brising,50;
+ getitem "Hunter_Fly_Card",1;
+ }
+ else if ((@card > 1070) && (@card < 1081))
+ {
+ mes "Here is an Isis Card.";
+ set god_brising,50;
+ getitem "Isis_Card",1;
+ }
+ else if ((@card > 1080) && (@card < 1091))
+ {
+ mes "Sidewinder Card.";
+ set god_brising,50;
+ getitem "Side_Winder_Card",1;
+ }
+ else if ((@card > 1090) && (@card < 1101))
+ {
+ mes "Walking Petite Card.";
+ set god_brising,50;
+ getitem "Petit_Card",1;
+ }
+ else if ((@card > 1100) && (@card < 1111))
+ {
+ mes "Bathory Card.";
+ set god_brising,50;
+ getitem "Bathory_Card",1;
+ }
+ else if ((@card > 1110) && (@card < 1121))
+ {
+ mes "Flying Petite Card.";
+ set god_brising,50;
+ getitem "Petit__Card",1;
+ }
+ else if ((@card > 1120) && (@card < 1131))
+ {
+ mes "Deviruchi Card.";
+ set god_brising,50;
+ getitem "Deviruchi_Card",1;
+ }
+ else if ((@card > 1130) && (@card < 1141))
+ {
+ mes "Medusa Card.";
+ set god_brising,50;
+ getitem "Medusa_Card",1;
+ }
+ else if ((@card > 1140) && (@card < 1151))
+ {
+ mes "Deviace Card.";
+ set god_brising,50;
+ getitem "Deviace_Card",1;
+ }
+ else if ((@card > 1150) && (@card < 1161))
+ {
+ mes "Minorous Card.";
+ set god_brising,50;
+ getitem "Minorous_Card",1;
+ }
+ else if ((@card > 1160) && (@card < 1171))
+ {
+ mes "Nightmare Card.";
+ set god_brising,50;
+ getitem "Nightmare_Card",1;
+ }
+ else if ((@card > 1170) && (@card < 1176))
+ {
+ mes "Baphomet Jr. Card.";
+ set god_brising,50;
+ getitem "Baphomet__Card",1;
+ }
+ else if ((@card > 1175) && (@card < 1181))
+ {
+ mes "Raydric Card.";
+ set god_brising,50;
+ getitem "Daydric_Card",1;
+ }
+ else if ((@card > 1180) && (@card < 1186))
+ {
+ mes "Khalitzburg Card.";
+ set god_brising,50;
+ getitem "Khalitzburg_Card",1;
+ }
+ else if ((@card > 1185) && (@card < 1191))
+ {
+ mes "Joker Card.";
+ set god_brising,50;
+ getitem "Joker_Card",1;
+ }
+ else if ((@card > 1190) && (@card < 1196))
+ {
+ mes "Abysmal Knight Card.";
+ set god_brising,50;
+ getitem "Knight_Of_Abyss_Card",1;
+ }
+ else if ((@card > 1195) && (@card < 1201))
+ {
+ mes "Druid Card.";
+ set god_brising,50;
+ getitem "Evil_Druid_Card",1;
+ }
+ else if ((@card > 1200) && (@card < 1206))
+ {
+ mes "Santa Poring Card.";
+ set god_brising,50;
+ getitem "Poring__Card",1;
+ }
+ else
+ {
+ mes "Poring Card.";
+ set god_brising,50;
+ getitem "Poring_Card",1;
+ }
+ next;
+ mes "[Enrico Kaili]";
+ mes "Please accept this as my way of thanking you for assisting in my research.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "If the opportunity arises, I would like to ask you for your help once again. Now please, take care.";
+
+ if ($God3 < 100) set $God3,$God3 +1;
+
+ if ($God3 == 50) announce "The 3rd Seal of [Brisingamen] has appeared.",bc_all;
+ else if ($God3 == 100)
+ {
+ if ($God1 == 100 && $God2 == 100 && $God3 == 100 && $God4 == 100) announce "All 4 Seals of [Brisingamen] have been released.",bc_all;
+ else announce "A Seal of [Brisingamen] has been released.",bc_all;
+ }
+ close;
+ }
+ else if(god_brising == 48)
+ {
+ mes "[Enrico Kaili]";
+ mes "Why are you still here?";
+ mes "I asked you to go find him.";
+ mes "Ah~ I cannot wait...";
+ emotion e_flash;
+ close;
+ }
+ else if(god_brising == 47)
+ {
+ mes "[Enrico Kaili]";
+ mes "I guess that's true that the four have been awakened. Does this mean that Brisingamen can now be created?";
+ next;
+ mes "[Enrico Kaili]";
+ mes "If such a thing is possible, what do we need in order to create it? Let's review the information you've gathered...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "There's Freya's Tear Drop Crystal, Freya's Jewel, the Never-Melting Snow Crystal found where Alfrik used to stay...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "The Drifting Air from the path where Dvalin slept. Hmm.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Perhaps we could find something from the pond of Freya's Gold Tears where Berling is sleeping, though I am unsure.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I also assume that the splendid Silver Ornament constructed by Gher is also needed to create Brisingamen.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "So what";
+ mes "do you think?";
+ next;
+ menu "I'm not sure...",-,"I suppose you're right.",L_Right;
+ mes "[" + strcharinfo(0) + "]";
+ mes "I...";
+ mes "I mean, maybe Alfrik would probably know, bu--";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Of course!";
+ mes "That's a great idea! I'll wait here while you go and ask Alfrik. You're my only hope in completing this research!";
+ next;
+ emotion e_hmm,1;
+ mes "[" + strcharinfo(0) + "]";
+ mes "(^333333I should've not said anything...^000000)";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Well, what are";
+ mes "waiting for? Please";
+ mes "come back as soon as";
+ mes "possible.";
+ set god_brising,48;
+ close;
+
+ L_Right:
+ mes "[" + strcharinfo(0) + "]";
+ mes "I suppose";
+ mes "you're right.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Still, who knows what exactly is in the Pond of Frey's Golden Tears.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Yes.";
+ mes "Ah! Right.";
+ mes "Hm, perhaps it would be best to ask Alfrik first?";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Hurry and seek him";
+ mes "out! And I thank you";
+ mes "in advance.";
+ set god_brising,48;
+ close;
+ }
+ else if(god_brising == 46)
+ {
+ mes "[Enrico Kaili]";
+ mes "I guess he finally sang for you? By the way, why didn't you speak to Grer the Dwarf? Oh right, the mine is heavily populated with monsters.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I know it won't be easy, but please seek him out and get more information.";
+ mes "Thank you in advance.";
+ close;
+ }
+ else if(god_brising == 45)
+ {
+ mes "[Enrico Kaili]";
+ mes "Hm...?";
+ mes "Did you forget the words to the song? Well, I didn't write them down either. Hahahaha! I guess there's only one thing you can do~";
+ next;
+ mes "[Enrico Kaili]";
+ mes "You've got to go back to Berling and ask him for the lyrics again. Good luck, and don't forget to memorize them this time.";
+ close;
+ }
+ else if(god_brising == 44)
+ {
+ mes "[Enrico Kaili]";
+ mes "It looks like you were able to answer that riddle. Good work!";
+ next;
+ mes "[Enrico Kaili]";
+ mes "That strange, unearthly feeling of dampness. Ah, you've brought Freya's Tear Drops! That means Grer must have awakened on his own now.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I suppose your next course of action should be to enter the mine. I'm sorry for the trouble, but I grow more excited with each new thing we learn.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "It's only with your help that I've been able to make such progress with my research. Anyway, I shall share my conclusions with you later.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "So are you heading for the mine now? Be careful around those monsters.";
+ close;
+ }
+ else if(god_brising == 43)
+ {
+ mes "[Enrico Kaili]";
+ mes "Oh...I have not waited in vain.";
+ mes "I guess Dvalin meant the endless war by the riddle.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "There were two kings. Each king had 20 knights.";
+ mes "Those knights fought until they died and revived to fight again.";
+ mes "They repeated the endless war over and over again.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "If they gathered and occurred a war again,";
+ mes "there would be enormous dead in the battlefield.";
+ mes "Valkyries selected the strongest";
+ mes "among warriors in Valhala to organize Einherjar.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Yes, that's an old story that everyone knows.";
+ mes "...and it turned out to be true.";
+ mes "Interesting.";
+ mes "Anyways...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I guess it is the time to investigate the story about Berling.";
+ mes "There is a stream that starts from north west of Prontera";
+ mes "and passes a mine in Mountain Mjolnir.";
+ mes "I assume that maybe Berling meant the place.";
+ mes "However, stream never stays in a place...";
+ mes "he might meant a puddle instead of stream...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I am so confused.";
+ mes "I wonder what the riddle means as well...";
+ mes "Anyways, come back as soon as possible!";
+ close;
+ }
+ else if(god_brising == 42)
+ {
+ mes "[Enrico Kaili]";
+ mes "Are you sure?!";
+ mes "Were they really for Freya's Necklace...";
+ mes "Brisingamen...?!";
+ next;
+ mes "[Enrico Kaili]";
+ mes "If the four dwarves wake up...";
+ mes "would Brisingamen appear to people's eyes?!";
+ mes "Ah...you...God must send you to me for the research.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "...I cannot believe that I might be able to experience the power of God...";
+ mes "Ah......";
+ mes ".....anyway...the place where Dvalin is sleeping...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "It says the patch is at the east forest...";
+ mes "....I assume maybe it is near the monastic vows...";
+ mes "......Ah, it is just my assumption. We don't know until we go find out...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I hope you can help me for that.";
+ mes "I am still not sure about what the research will lead us but";
+ mes "I know you want to find out as much as I do.";
+ mes "Hahahaha ha...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Please leave to the monastic vows in the east.";
+ mes "The godly power....how it will be to possess it as a human being...?!";
+ mes "What if it destroyes the human world....?! Hahahaha...";
+ close;
+ }
+ else if(god_brising == 41)
+ {
+ mes "[Enrico Kaili]";
+ mes "What? What did you just say?";
+ mes "You met Alfrik...?";
+ mes "Oh my god, you're the chosen one!";
+ mes "I cannot believe that legendary Alfrik is still alive...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Alfrik is one of the four dwarves";
+ mes "who made a shining neklace for goddess Freya.";
+ mes "Of course, Dvalin is also one of them.";
+ mes "Oh my god...";
+ mes "I cannot believe we're talking about Brisingamen...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Now I realise what we have been doing!";
+ mes "We have been searching for an item with the power of God!";
+ mes "...Dvalin...";
+ mes "I am wondering where he is sleeping...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "....by the way,";
+ mes "why didn't you ask Alfrik";
+ mes "if he knows where Dvalin stays...?";
+ mes "Errr...";
+ close;
+ }
+ else if(god_brising == 40)
+ {
+ mes "[Enrico Kaili]";
+ mes "I suggest you to go check Lutie.";
+ mes "I am pretty sure you will find a trace of the goddess somewhere.";
+ mes "Also you already met Valkyrie.";
+ mes "I have no doubt you will find the trace.";
+ mes "And...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I have been thinking about these words...";
+ mes "^4d4dff to the steps in";
+ mes "to that beautiful hair";
+ mes "to those dazzling eyes";
+ mes "we gave all of our hearts in^000000";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I have no clue what they means...";
+ mes "I seriously started doubting that what I know";
+ mes "could be different from the truth.";
+ mes "Anyway, I am going to study other stuffs for now.";
+ close;
+ }
+ else if(god_brising == 35)
+ {
+ mes "[Enrico Kaili]";
+ mes "I can tell you have gone through many difficulties.";
+ mes "Please come this way.";
+ mes "So what did you hear from Hermite?";
+ next;
+ mes " - You told him what you were told from Hermite -";
+ mes " - and from Valkyrie. -";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Great! I cannot believe it actually happened!";
+ mes "....hmm....as I guessed";
+ mes "it is possible to possess the godly power...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "It is resonant with a thing sent from the royal court";
+ mes "for some reason. Now, come closer and look at this.";
+ next;
+ mes "- Enrico opened a locked chest and -";
+ mes "- took out a jewel that was so beautiful to believe its actual existance. -";
+ mes "- The jewel dazzling like a tear drop of a goddess -";
+ mes "- started responding with the Snow Crystal as it's closer. -";
+ next;
+ mes "[Enrico Kaili]";
+ mes "...so? Isn't it amazing?";
+ mes "If what Valkyrie said is true,";
+ mes "this jewel must be the crystal of a Freya's tear drop.";
+ mes "Hmmmm.....";
+ mes "Power of Gods...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I don't understand why all these indications";
+ mes "have appeared in this age...";
+ mes "....anyways, I appreciate you for helping me so far.";
+ mes "I am going to think about the poem";
+ mes "that you have heard from Valkyrie.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "It says...a cold snowy path";
+ mes "the blue river that the goddess walked cross";
+ mes "a narrow path and four dwarves.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "The four dwarves must mean the four dwarves who were well-known for their craft skill...";
+ mes "....I cannot pinpoint what the river and the paths means.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Now, there is something you can help me again!";
+ next;
+ menu "Wah? I thought it's already over?",-,"What is it this time?",L_What;
+ mes "[Enrico Kaili]";
+ mes "Hell no!";
+ mes "You are supposed to help me for my research, aren't you?";
+ mes "Unfortunately, my research has never been over.";
+ mes "Hahahaha.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Now, you are going to leave to Lutie!";
+ mes "Find out some clues there.";
+ mes "The legend says,";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Goddess had to walk on the cold snowy path alone";
+ mes "without the cat of obedience.";
+ mes "She shed tears because of piercing cold.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "As a matter of fact, this Freya's Jewel was";
+ mes "firstly founded in Lutie.";
+ mes "That shows the legend tells us the truth by indicating the cold snowy path.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Please go start your journey to find the trace of goddess";
+ mes "from Lutie, as what Valkyrie said.";
+ mes "I hope we will find out what the goddess";
+ mes "left in this world together.";
+ set god_brising,40;
+ close;
+
+ L_What:
+ mes "[Enrico Kaili]";
+ mes "Hahahaha...I like your attitute!";
+ mes "Yes, Nelliorde has an eye to see a man.";
+ mes "Somehow you decided to help me out";
+ mes "for this research, I hope you will do your best";
+ mes "until the last moment.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Now, you are going to leave to Lutie!";
+ mes "Find out some clues there.";
+ mes "The legend says,";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Goddess had to walk on the cold snowy path alone";
+ mes "without the cat of obedience.";
+ mes "She shed tears because of piercing cold.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "As a matter of fact, this Freya's Jewel was";
+ mes "firstly founded in Lutie.";
+ mes "That shows the legend tells us the truth by indicating the cold snowy path.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Please go start your journey to find the trace of goddess";
+ mes "from Lutie, as what Valkyrie said.";
+ mes "I hope we will find out what the goddess";
+ mes "left in this world together.";
+ set god_brising,40;
+ close;
+ }
+ else if(god_brising > 9 && god_brising < 35)
+ {
+ mes "[Enrico Kaili]";
+ mes "Hmm... I see...";
+ mes "I know that I have been such a burden to you.";
+ mes "But I will not forget what you have done for me.";
+ mes "I will give you one of my precious collections";
+ mes "as the token of my gratitude.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I wish you good luck.";
+ mes "And please take care.";
+ close;
+ }
+ else if(god_brising > 3 && god_brising < 10)
+ {
+ mes "[Enrico Kaili]";
+ mes "So, have you met Hermite?";
+ mes "What...? Did he really ask you to do that...?";
+ mes "....hmmm....I must say...I know it's not an easy thing to do";
+ mes "but I hope you will do what he wants.";
+ mes "And I will next; for a good news from you for the time being.";
+ close;
+ }
+ else if(god_brising == 3)
+ {
+ mes "[Enrico Kaili]";
+ mes "Hermite? Do you need any information about him?";
+ mes "Let me think. Hmm...in my memory";
+ mes "he was a young man in an urban atmosphere...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Oh, that's right! Why don't you go ask";
+ mes "the lady ahead?";
+ mes "She might have some registration information.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "What? Are you wondering why I don't do it on my own?";
+ mes "Because! I am too old to go on an expedition...";
+ mes "and also I have some research requests from the royal court.";
+ mes "I am not supposed to leave this organization.";
+ mes "That was why I had sought";
+ mes "for a young and reliable adventurer like you";
+ mes "who can do what I am unable to do.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Ah...of course I will reward you later.";
+ mes "Do not think of me as a penny pincher";
+ mes "who does not like to 'Hire' professionals.";
+ mes "Anyways, thank you in advance.";
+ close;
+ }
+ else if(god_brising == 2)
+ {
+ mes "[Enrico Kaili]";
+ mes "So, have you considered my proposal?";
+ mes "If this thing works out,";
+ mes "I will pay you back.";
+ mes "What do you say?";
+ next;
+ menu "No, thanks.",-,"Sure, why not.",L_Sure;
+ mes "[Enrico Kaili]";
+ mes "What...?! You are too mean!";
+ mes "Why did you even get bothered to speak to me";
+ mes "when you don't want to help me?";
+ mes "I do not wish to talk to you.";
+ mes "Please leave.";
+ close;
+ L_Sure:
+ mes "[Enrico Kaili]";
+ mes "Are you sure you want to help me?";
+ mes "That's great.";
+ mes "Before we start, would like to see this thing first?";
+ next;
+ mes "- The old scholar showed you -";
+ mes "- a small white crystallization within a box. -";
+ mes "- It looked very thin and freezing cold. -";
+ next;
+ mes "[Enrico Kaili]";
+ mes "This is the snow crystal...";
+ mes "at least that's what I think.";
+ mes "Look at this shape and texture.";
+ mes "Doesn't it look like a snow flake?";
+ mes "The strange thing is...this never gets molten.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Few years ago, a young adventurer gave me this.";
+ mes "I have not figured out what actually this is...";
+ mes "I want to know what this is and where it came from.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Yes, I am looking for a person.";
+ mes "The person who brought me this Snow Crystal.";
+ mes "Let me check his name...yes, here it is.";
+ mes "His name is ...Hermite Charles.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "When you find him,";
+ mes "please give him this letter.";
+ next;
+ mes "^4d4dff - Enrico gave you -";
+ mes "- a thin letter sealed with red wax. -";
+ mes "- 'Dear Hermite Charles' was written on the front.-";
+ set god_brising,3;
+ close;
+ }
+ else if(god_brising == 1)
+ {
+ mes "[Enrico Kaili]";
+ mes "How are you...ah! It is you, " + strcharinfo(0) + "!";
+ mes "Yes, I was told by Nelliorde that you will visit me.";
+ mes "He always tells me that he will";
+ mes "a good assistance for my research.";
+ mes "So, how was your travel?";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Hahaha, I guess you would not have a hard time to come";
+ mes "to Juno...since there are various convenience travelling";
+ mes "methods as warp portal and kafra teleport service!";
+ mes "So, how was my joke? Hahahaha!";
+ next;
+ mes "[Enrico Kaili]";
+ mes "As you were told by Nelliorde,";
+ mes "I would like to ask you to help my research...";
+ mes "specifically finding a person.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Since you are an adventurer, I assume";
+ mes "you like to travel a lot?";
+ mes "Why don't you find the person I am looking for";
+ mes "during your travel? It is not that hard.";
+ mes "And I was told by Nelliorde that";
+ mes "you are a pretty well-experienced adventurer.";
+ next;
+ menu "I am no good at finding people.",-,"I can do that!",L_Ok;
+ mes "[Enrico Kaili]";
+ mes "......bah...";
+ mes "I was convinced that you would help me for sure...";
+ mes "...but I understand if you don't want to do it.";
+ mes "I can find another adventurer.";
+ mes "...sigh...if I was a little bit younger,";
+ mes "I would not have to ask a favor...";
+ next;
+ mes "[Enrico Kaili]";
+ mes "I see. But if you change your mind later";
+ mes "please come back.";
+ mes "And I am so sorry to make you travel this far.";
+ mes "Take care.";
+ set god_brising,2;
+ close;
+ L_Ok:
+ mes "[Enrico Kaili]";
+ mes "Are you sure you want to help me?";
+ mes "That's great.";
+ mes "Before we start, would like to see this thing first?";
+ next;
+ mes "- The old scholar showed you -";
+ mes "- a small white crystallization within a box. -";
+ mes "- It looked very thin and freezing cold. -";
+ next;
+ mes "[Enrico Kaili]";
+ mes "This is the snow crystal...";
+ mes "at least that's what I think.";
+ mes "Look at this shape and texture.";
+ mes "Doesn't it look like a snow flake?";
+ mes "The strange thing is...this never gets molten.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Few years ago, a young adventurer gave me this.";
+ mes "I have not figured out what actually this is...";
+ mes "I want to know what this is and where it came from.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "Yes, I am looking for a person.";
+ mes "The person who brought me this Snow Crystal.";
+ mes "Let me check his name...yes, here it is.";
+ mes "His name is ...Hermite Charles.";
+ next;
+ mes "[Enrico Kaili]";
+ mes "When you find him,";
+ mes "please give him this letter.";
+ next;
+ mes "^4d4dff - Enrico gave you -";
+ mes "- a thin letter sealed with red wax. -";
+ mes "- 'Dear Hermite Charles' was written on the front.-";
+ set god_brising,3;
+ close;
+ }
+ else
+ {
+ mes "[Enrico Kaili]";
+ mes "I am not sure what purpose you have in here, but I am busy at this moment.";
+ mes "Please leave me with my research.";
+ close;
+ }
+}
+ else
+{
+ mes "[Studying Scholar]";
+ mes "Do you know how to make red potions?";
+ mes "You grind a lot of red herbs";
+ mes "and shake the liquid with care until it become a red potion.";
+ mes "If I could only shake them faster....";
+ mes "I would be able to rich in no time...";
+ close;
+}
+
+}
+
+prt_church.gat,113,103,1 script Praying Man 798,{
+
+ if($God2 < 50)
+{
+ mes "[Praying Man]";
+ mes "Let everyone live a life of happiness. Let there be peace in the world...";
+ next;
+ mes "[Praying Man]";
+ mes "May I hit it rich with this Old Blue Box that I spend this month's paycheck on...";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "[Praying Man]";
+ mes "Now is the time to reflect upon the past to prepare for the future.";
+ next;
+ mes "[Praying Man]";
+ mes "It is in stillness that we find the wisdom to know which steps we must take to move forward. Let's pray.";
+ close;
+}
+ if(god_brising > 34)
+{
+ mes "^3355FFHermite Charles continues to fervently pray. His eyes are closed and his hands are clasped to his chest. There seems to be an air of faint sadness about him.^000000";
+ close;
+}
+ else if(god_brising == 34)
+{
+ mes "[Hermite Charles]";
+ mes "What did you just say? Did she really become an Einherjar? That's the greatest honor for any warrior...";
+ next;
+ mes "[Hermite Charles]";
+ mes "She must be so happy.";
+ mes "I guess in the end,";
+ mes "I never really had";
+ mes "any place in her heart.";
+ mes "Lowen...";
+ next;
+ mes "[Hermite Charles]";
+ mes "But I know one thing for sure. She roamed for two years because I made her run away.";
+ next;
+ mes "[Hermite Charles]";
+ mes "She should have blamed me for what happened. Why did she take everything upon herself? It was me...";
+ next;
+ mes "[Hermite Charles]";
+ mes "I guess she just saw me as a little brother. She obviously didn't take me very seriously.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Haha....hahaha...";
+ mes "Now I feel better!";
+ mes "So, what did you say?";
+ next;
+ mes "[Hermite Charles]";
+ mes "Yes, right.";
+ mes "Please tell Enrico this.";
+ mes "The object he's interested in was given by His Majesty to a guild that possessed a castle.";
+ next;
+ mes "[Hermite Charles]";
+ mes "It can never be made through just human technology. But I guess that His Majesty will let scholars study it, and let men possess it if they prove capable.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I wasn't powerful enough to earn it. Frankly I stole it. But soon I began to fear its presense and my heart would pound with trepidation when I saw it.";
+ next;
+ mes "[Hermite Charles]";
+ mes "One day, I think it actually possessed me and I ended up going on a journey. I'm not really sure exactly where though...";
+ next;
+ mes "[Hermite Charles]";
+ mes "All I remember was that I was in Lutie, the town of snow. I went over a bridge to a hill to the West...";
+ next;
+ mes "[Hermite Charles]";
+ mes "But once I arrived there, I was seized with this feeling of terror I can't explain.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I ended up running away. That's why I gave it to Mr. Enrico. You can laugh at me for being a coward if you want.";
+ next;
+ mes "[Hermite Charles]";
+ mes "You know everything now.";
+ mes "Please leave me alone.";
+ mes "^333333*Sigh...*^000000";
+ set god_brising,35;
+ close;
+}
+ else if(god_brising > 19 && god_brising < 34)
+{
+ mes "[Hermite Charles]";
+ mes "I'll be waiting.";
+ mes "For some reason, I believe you'll be able to find some sort of clue about what happened these past two years one of these days.";
+ close;
+}
+ else if(god_brising == 12)
+{
+ mes "[Hermite Charles]";
+ mes "Lohen Phelicia?";
+ mes "The person I asked you to find is Lowen, not Lohen. Lowen Ellenen.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I'm sorry for the trouble, but I think you better try again.";
+ set god_brising,10;
+ close;
+}
+ else if(god_brising == 11)
+{
+ mes "[Hermite Charles]";
+ mes "What...?";
+ mes "How could you";
+ mes "talk to her?!";
+ mes "She's dead!";
+ next;
+ mes "[Hermite Charles]";
+ mes "I've heard those rumors, but she's definitely passed away. I was even at her funeral. She can't be alive. That's not true at all.";
+ next;
+ mes "[Hermite Charles]";
+ mes "The last time I saw her alive was in Geffen. Two years after that, I saw her buried in her grave. Didn't I tell you this?";
+ next;
+ mes "[Hermite Charles]";
+ mes "I wanted you to find out what happened in those two years before she died. I wanted to know what led her to her death.";
+ next;
+ mes "[Hermite Charles]";
+ mes "What the hell";
+ mes "killed her?!";
+ mes "Don't you understand";
+ mes "the way I feel?";
+ set god_brising,20;
+ close;
+}
+ else if(god_brising == 10)
+{
+ mes "[Hermite Charles]";
+ mes "Lowen was a Crusader, a knight in the service of holiness preparing for the Holy War.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I always expected her to become a Knight in the Prontera Chivalry, but suddenly she changed her mind and became a Crusader. I saw her for the last time in Geffen.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I beg you, please learn anything you can about what happened to her.";
+ close;
+}
+ else if(god_brising == 5)
+{
+ set @brising_try,rand(1,4);
+ if(@brising_try == 1)
+ {
+ mes "[Hermite Charles]";
+ mes "You're still here.";
+ mes "Does that mean you";
+ mes "want to hear my";
+ mes "story after all?";
+ next;
+ menu "Yes, I would like to.",-,"No, thanks.",L_NoThx;
+ mes "[Hermite Charles]";
+ mes "Thank you...";
+ mes "Perhaps you're doing this merely out of consideration, but I still appreciate your kindness. The story I will tell you is very old.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Long ago, there was a little boy who never knew his parents. Just to survive, he became a Thief and eventually joined the Rogue Guild.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Without any goals or dreams, his life was pretty aimless. He pretty much only lived so that he could see tomorrow.";
+ next;
+ mes "[Hermite Charles]";
+ mes "However, the little boy met someone who was full of hope and kindess. He admired her and she became his reason for living.";
+ next;
+ mes "[Hermite Charles]";
+ mes "She will never know that the little boy loved her more than anything else. Unlike the boy, her dream was devote her life to God.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Although he never understood that, he knew that he would be happy to just be near her, watching from a distance.";
+ next;
+ mes "[Hermite Charles]";
+ mes "But one day, because of one fatal mistake, he lost her and she never came back.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Ever since, that boy has been coming to the Sanctuary everyday to pray for her safety, even into adulthood.";
+ next;
+ mes "[Hermite Charles]";
+ mes "...";
+ mes "......^333333*Sob*^000000";
+ mes "Please find";
+ mes "her for me.";
+ mes "Find Lowen.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I know that Enrico has sent you. I'm guessing he needs something from me. Am I wrong?";
+ next;
+ mes "[Hermite Charles]";
+ mes "I'll do whatever you want if you do what I want you to do. It's simple: find out anything you can about Lowen.";
+ next;
+ mes "[Hermite Charles]";
+ mes "It's doesn't matter how insignificant the traces may be, anything will do. I want to know everything related to her!";
+ next;
+ menu "Uhhhhh...",-,"Sorry, I can't.",L_Sorry,"When was the last time you saw her?",L_Last;
+ mes "[Hermite Charles]";
+ mes "Please consider my proposal. If you can find Lowen for me, I'll give you what you want.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Please, I beg you.";
+ mes "You are a strong and well-experienced adventurer. Isn't this a simple thing for you to do?";
+ next;
+ mes "[Hermite Charles]";
+ mes "If you've ever dearly loved someone, then you'd know how desperate I am. Please find Lowen for me.";
+ next;
+ menu "...Alright.",-,"I'm sorry, I don't think I can do it.",L_Think;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Alright.";
+ mes "I'll try my best to find her. Would you tell me more about Lowen?";
+ next;
+ mes "[Hermite Charles]";
+ mes "She is a crusader.";
+ mes "The last time I saw her was deep inside Geffen Dungeon.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Long ago, some Crusaders entered the Geffen Dungeon on a monster subjugation expedition.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Please find";
+ mes "anything that";
+ mes "you can. I beg";
+ mes "of you...";
+ set god_brising,10;
+ close;
+ L_Think:
+ mes "[Hermite Charles]";
+ mes "^333333*Sigh*^000000";
+ mes "I understand.";
+ mes "But if you don't help me, then Kaili won't get the help he needs...";
+ set god_brising,9;
+ close;
+ L_Sorry:
+ mes "[Hermite Charles]";
+ mes "You don't understand!";
+ mes "If I weren't this much of a coward, I would already have gone out to find out what I could for myself.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I'm not afraid of monsters or dying. It's the fact that she might hate me now. That's what I fear: Lowen's reproach.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I have no idea how she has been and how she would react upon seeing me once more. Go ahead and laugh if you want.";
+ mes "how she would react to my appearance.";
+ next;
+ mes "[Hermite Charles]";
+ mes "All I can do for her is just earnestly pray. I had no idea it'd be so horrible not to be able to see her anymore...";
+ set god_brising,9;
+ close;
+ L_Last:
+ mes "[Hermite Charles]";
+ mes "The last time I saw her was deep inside the Geffen Dungeon.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Although it was created by humans, that dungeon is now cursed and inhabited with horrific monsters.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I'm guessing the Crusaders saw that it was necessary to exterminate the monsters there to keep it from getting even worse.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Lowen accompanied a group of other Crusaders for the good of the people, but I haven't heard from anything about her since...";
+ next;
+ mes "[Hermite Charles]";
+ mes "That was the last time...";
+ mes "Please find out anything you can about her...";
+ mes "I beg you.";
+ set god_brising,10;
+ close;
+ L_NoThx:
+ mes "[Hermite Charles]";
+ mes "I misunderstood you.";
+ mes "I should have realized that people never really listen unless it's of some benefit to them.";
+ next;
+ mes "[Hermite Charles]";
+ mes "I won't waste any more of your time. I'll accept Kaili's letter and wait until I find someone who'll listen to my story and help me.";
+ set god_brising,5;
+ close;
+ }
+ else
+ {
+ mes "[Hermite Charles]";
+ mes "...";
+ mes "^333333*Sob...*^000000";
+ mes "I'm sorry.";
+ mes "I'm so sorry, Lowen.";
+ mes "It was all my fault...";
+ close;
+ }
+}
+ else if(god_brising == 4)
+{
+ mes "[Hermite Charles]";
+ mes "What do you";
+ mes "want from me?";
+ mes "Were you sent by";
+ mes "the Rogue Guild?";
+ next;
+ mes "[Hermite Charles]";
+ mes "Tell them";
+ mes "I quit already.";
+ mes "Leave me alone!";
+ next;
+ menu "Leave him alone.",-,"Give him Kaila's Letter.",L_Letter;
+ mes "^3355FFYou're not sure why he's so upset, but it doesn't seem to be the best time to try to speak with him. Perhaps later would be better...^000000";
+ set god_brising,4;
+ close;
+ L_Letter:
+ mes "[Hermite Charles]";
+ mes "Huh...";
+ mes "Enrico Kaili.";
+ mes "Yeah, I remember";
+ mes "him. So what..?";
+ next;
+ mes "^3355FFHermite nonchalantly tosses the letter back to you.^000000";
+ next;
+ mes "[Hermite Charles]";
+ mes "...";
+ mes "^333333*Sigh...*^000000";
+ next;
+ mes "[Hermite Charles]";
+ mes "You...";
+ mes "Would you like to";
+ mes "listen to my story?";
+ next;
+ menu "Sure!",-,"I'm busy, actually.",L_Busy;
+ mes "[Hermite Charles]";
+ mes "Thank you...I know you're just being generous.";
+ mes "But still I am glad for your generosity.";
+ mes "I am going to tell you an old story.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Long ago, there was a little boy.";
+ mes "He lost his parents so there was";
+ mes "no home for him. He was just wandering";
+ mes "from thie thief guild to that rogue guild";
+ mes "...just to survive. He didn't have any goal";
+ mes "or any purpose of life other than being alive everyday.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Even so, the little boy";
+ mes "had one person who he admired with full of hope.";
+ mes ".... ... ";
+ next;
+ mes "[Hermite Charles]";
+ mes "She will never know that";
+ mes "the little boy loved her more than anything else.";
+ mes "She was totally different from the boy.";
+ mes "She had a goal that she would devote her life to God.";
+ next;
+ mes "[Hermite Charles]";
+ mes "...he was just happy...";
+ mes "he's just happy for watching her in a distance.";
+ mes "One day...";
+ mes "because of one mistake, he lost her.";
+ next;
+ mes "[Hermite Charles]";
+ mes "She has never come back.";
+ mes "And the boy has been praying for her safety";
+ mes "even after he was fully grown up.";
+ mes "He always comes to the church and prays for her.";
+ next;
+ mes "[Hermite Charles]";
+ mes "... .. .. .... ... . .";
+ mes "...........";
+ mes "...";
+ next;
+ mes "[Hermite Charles]";
+ mes "....................";
+ mes ".......*sob*.........";
+ mes "Please find her for me.";
+ mes "...find Lowen for me.......";
+ mes "..................*sob*..";
+ next;
+ mes "[Hermite Charles]";
+ mes "You...";
+ mes " ";
+ mes "I know that Enrico has sent you to me.";
+ mes "I guess you must need something from me.";
+ mes "......";
+ mes "Am I wrong?";
+ next;
+ mes "[Hermite Charles]";
+ mes "....if you do what I want you to do,";
+ mes "I will give you what you want.";
+ mes "All I want is simple.";
+ mes ".......please find Lowen for me.";
+ mes "Find anything, anything that are belong to her,";
+ mes "her trace and locations where she used to say...";
+ mes "I want everything related to her!";
+ next;
+ menu "... ....umm...",-,"Sorry, I can't.",L_Sorry2,"When was the last time you saw her?",L_Last2;
+ mes "[Hermite Charles]";
+ mes "....have a heart, I beg you.";
+ mes "Please consider my proposal.";
+ mes "You find Lowen for me,";
+ mes "then I am going to give you what you want.";
+ next;
+ mes "[Hermite Charles]";
+ mes ".......please, I beg you.";
+ mes "You are a strong and well-experienced adventurer.";
+ mes "Isn't this so easy for you to do?";
+ mes "If you have a person in your mind,";
+ mes "you will know how desperate I have been.";
+ mes "Please, please find Lowen for me.";
+ next;
+ menu "....alright.",-,"...I am sorry, I don't think I can make it.",L_Think2;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Alright.";
+ mes "I will try my best to find her.";
+ mes "Will you tell me more about the lady, Lowen?";
+ next;
+ mes "[Hermite Charles]";
+ mes "She is a crusader.";
+ mes "Last time I saw her deep inside of the Geffen dungeon.";
+ mes "Long time ago, crusaders went on";
+ mes "a monster subjugation to the Geffen dungeon.";
+ mes "That was the last time...";
+ mes "Please find anything that once used to belong to her...";
+ mes "I beg you.";
+ set god_brising,10;
+ close;
+ L_Think2:
+ mes "[Hermite Charles]";
+ mes "... ... ..";
+ mes ".......... .......";
+ mes "..........sigh..";
+ mes "I understand.";
+ mes "Then there will be no help for you now.";
+ set god_brising,9;
+ close;
+ L_Sorry2:
+ mes "[Hermite Charles]";
+ mes "What a selfish answer!";
+ mes "I am this desperate...";
+ mes "....if I am not this coward,";
+ mes "... .. I would...";
+ mes "......";
+ mes "I would already go try to find her...";
+ next;
+ mes "[Hermite Charles]";
+ mes "I am not afraid of monsters or anything.";
+ mes "But I am for the fact that she might hate me by now...";
+ mes "That's what Ifear...";
+ mes "I fear that I have no idea how she has been and";
+ mes "how she would react to my appearance.";
+ next;
+ mes "[Hermite Charles]";
+ mes "You can mock me as much as you want.";
+ mes "Yes, I don't have any guts to do anything.";
+ mes "...all I can do for her is";
+ mes "....just praying...";
+ next;
+ mes "[Hermite Charles]";
+ mes "I am weak, I am weak.";
+ mes "........";
+ mes "I had no idea that it would be so horrible not to see her any longer.";
+ mes ".....I will continue praying for her.";
+ mes "That is all I can do for her at this moment.";
+ set god_brising,9;
+ close;
+ L_Last2:
+ mes "[Hermite Charles]";
+ mes "She is a crusader.";
+ mes "Last time I saw her deep inside of the Geffen dungeon.";
+ mes "Long time ago, crusaders went on";
+ mes "a monster subjugation to the Geffen dungeon.";
+ next;
+ mes "[Hermite Charles]";
+ mes "The dungeon hidden under the Geffen Tower";
+ mes "was so horrible...";
+ mes "It must be created by human beings....";
+ mes "but now it is conquered by hideous monsters.";
+ mes "That place is cursed...that's all I can say.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Maybe that's why other people";
+ mes "decided to bring an end to the dreadful place.";
+ mes "That's why crusaders went into";
+ mes "the dungeon on behalf of other people...";
+ next;
+ mes "[Hermite Charles]";
+ mes "That was the last time...";
+ mes "Please find anything that once used to belong to her...";
+ mes "I beg you.";
+ set god_brising,10;
+ close;
+ L_Busy:
+ mes "[Hermite Charles]";
+ mes "....I misunderstood you.";
+ mes "I should have realised that people...";
+ mes "never listen to other people unless...";
+ mes "they have some purpose or they want something from them.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Let's not waste our precious time any longer.";
+ mes ".... ... also......";
+ mes "I am going to accept Mr. Enrico's letter";
+ mes "when I meet a person who is willing to listen to my story";
+ mes "and to help me....who is not you.";
+ set god_brising,5;
+ close;
+}
+ else if(god_brising == 3)
+{
+ mes "[Sad-looking Man]";
+ mes "...";
+ mes "^333333*Sob...*^000000";
+ mes "I am so";
+ mes "sorry, Lowen.";
+ mes "It's all fault...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Excuse me.";
+ mes "I am looking";
+ mes "for someone named...";
+ mes "Hermite?";
+ next;
+ mes "[Hermite Charles]";
+ mes "Hm...?";
+ mes "Hermite? That's me.";
+ mes "But if you don't mind,";
+ mes "I want to be alone...";
+ next;
+ menu "Leave him alone.",-,"Give him Kaili's Letter.",L_Letter2;
+ mes "- You were unsure why he's upset - ";
+ mes "- but it didn't seem to be a right time to speak to him. -";
+ mes "- Let's come back later. -";
+ set god_brising,4;
+ close;
+ L_Letter2:
+ mes "[Hermite Charles]";
+ mes ".......huh....?!";
+ mes "Ah, I remember him.";
+ mes "So what..?";
+ next;
+ mes "- Hermite gave you the letter back - ";
+ mes "- as though he didn't care about it. -";
+ next;
+ mes "[Hermite Charles]";
+ mes " .... ... ... ";
+ mes " ..... ...... .....";
+ mes " .. .. ..*sigh*...";
+ next;
+ mes "[Hermite Charles]";
+ mes " ....... ..........";
+ mes "....... .........";
+ mes " ....... you..";
+ mes "Would you like to listen to my story?";
+ next;
+ menu "Sure!",-,"No, I am busy.",L_Busy2;
+ mes "[Hermite Charles]";
+ mes "Thank you...I know you're just being generous.";
+ mes "But still I am glad for your generosity.";
+ mes "I am going to tell you an old story.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Long ago, there was a little boy.";
+ mes "He lost his parents so there was";
+ mes "no home for him. He was just wandering";
+ mes "from thie thief guild to that rogue guild";
+ mes "...just to survive. He didn't have any goal";
+ mes "or any purpose of life other than being alive everyday.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Even so, the little boy";
+ mes "had one person who he admired with full of hope.";
+ mes ".... ... ";
+ next;
+ mes "[Hermite Charles]";
+ mes "She will never know that";
+ mes "the little boy loved her more than anything else.";
+ mes "She was totally different from the boy.";
+ mes "She had a goal that she would devote her life to God.";
+ next;
+ mes "[Hermite Charles]";
+ mes "...he was just happy...";
+ mes "he's just happy for watching her in a distance.";
+ mes "One day...";
+ mes "because of one mistake, he lost her.";
+ next;
+ mes "[Hermite Charles]";
+ mes "She has never come back.";
+ mes "And the boy has been praying for her safety";
+ mes "even after he was fully grown up.";
+ mes "He always comes to the church and prays for her.";
+ next;
+ mes "[Hermite Charles]";
+ mes "... .. .. .... ... . .";
+ mes "...........";
+ mes "...";
+ next;
+ mes "[Hermite Charles]";
+ mes "....................";
+ mes ".......*sob*.........";
+ mes "Please find her for me.";
+ mes "...find Lowen for me.......";
+ mes "..................*sob*..";
+ next;
+ mes "[Hermite Charles]";
+ mes "You...";
+ mes " ";
+ mes "I know that Enrico has sent you to me.";
+ mes "I guess you must need something from me.";
+ mes "......";
+ mes "Am I wrong?";
+ next;
+ mes "[Hermite Charles]";
+ mes "....if you do what I want you to do,";
+ mes "I will give you what you want.";
+ mes "All I want is simple.";
+ mes ".......please find Lowen for me.";
+ mes "Find anything, anything that are belong to her,";
+ mes "her trace and locations where she used to say...";
+ mes "I want everything related to her!";
+ next;
+ menu "... ....umm...",-,"Sorry, I can't.",L_Sorry3,"When was the last time you saw her?",L_Last3;
+ mes "[Hermite Charles]";
+ mes "....have a heart, I beg you.";
+ mes "Please consider my proposal.";
+ mes "You find Lowen for me,";
+ mes "then I am going to give you what you want.";
+ next;
+ mes "[Hermite Charles]";
+ mes ".......please, I beg you.";
+ mes "You are a strong and well-experienced adventurer.";
+ mes "Isn't this so easy for you to do?";
+ mes "If you have a person in your mind,";
+ mes "you will know how desperate I have been.";
+ mes "Please, please find Lowen for me.";
+ next;
+ menu "....alright.",-,"...I am sorry, I don't think I can make it.",L_Think3;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Alright.";
+ mes "I will try my best to find her.";
+ mes "Will you tell me more about the lady, Lowen?";
+ next;
+ mes "[Hermite Charles]";
+ mes "She is a crusader.";
+ mes "Last time I saw her deep inside of the Geffen dungeon.";
+ mes "Long time ago, crusaders went on";
+ mes "a monster subjugation to the Geffen dungeon.";
+ mes "That was the last time...";
+ mes "Please find anything that once used to belong to her...";
+ mes "I beg you.";
+ set god_brising,10;
+ close;
+ L_Think3:
+ mes "[Hermite Charles]";
+ mes "... ... ..";
+ mes ".......... .......";
+ mes "..........sigh..";
+ mes "I understand.";
+ mes "Then there will be no help for you now.";
+ set god_brising,9;
+ close;
+ L_Sorry3:
+ mes "[Hermite Charles]";
+ mes "What a selfish answer!";
+ mes "I am this desperate...";
+ mes "....if I am not this coward,";
+ mes "... .. I would...";
+ mes "......";
+ mes "I would already go try to find her...";
+ next;
+ mes "[Hermite Charles]";
+ mes "I am not afraid of monsters or anything.";
+ mes "But I am for the fact that she might hate me by now...";
+ mes "That's what Ifear...";
+ mes "I fear that I have no idea how she has been and";
+ mes "how she would react to my appearance.";
+ next;
+ mes "[Hermite Charles]";
+ mes "You can mock me as much as you want.";
+ mes "Yes, I don't have any guts to do anything.";
+ mes "...all I can do for her is";
+ mes "....just praying...";
+ next;
+ mes "[Hermite Charles]";
+ mes "I am weak, I am weak.";
+ mes "........";
+ mes "I had no idea that it would be so horrible not to see her any longer.";
+ mes ".....I will continue praying for her.";
+ mes "That is all I can do for her at this moment.";
+ set god_brising,9;
+ close;
+ L_Last3:
+ mes "[Hermite Charles]";
+ mes "She is a crusader.";
+ mes "Last time I saw her deep inside of the Geffen dungeon.";
+ mes "Long time ago, crusaders went on";
+ mes "a monster subjugation to the Geffen dungeon.";
+ next;
+ mes "[Hermite Charles]";
+ mes "The dungeon hidden under the Geffen Tower";
+ mes "was so horrible...";
+ mes "It must be created by human beings....";
+ mes "but now it is conquered by hideous monsters.";
+ mes "That place is cursed...that's all I can say.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Maybe that's why other people";
+ mes "decided to bring an end to the dreadful place.";
+ mes "That's why crusaders went into";
+ mes "the dungeon on behalf of other people...";
+ next;
+ mes "[Hermite Charles]";
+ mes "That was the last time...";
+ mes "Please find anything that once used to belong to her...";
+ mes "I beg you.";
+ set god_brising,10;
+ close;
+ L_Busy2:
+ mes "[Hermite Charles]";
+ mes "....I misunderstood you.";
+ mes "I should have realised that people...";
+ mes "never listen to other people unless...";
+ mes "they have some purpose or they want something from them.";
+ next;
+ mes "[Hermite Charles]";
+ mes "Let's not waste our precious time any longer.";
+ mes ".... ... also......";
+ mes "I am going to accept Mr. Enrico's letter";
+ mes "when I meet a person who is willing to listen to my story";
+ mes "and to help me....who is not you.";
+ set god_brising,5;
+ close;
+}
+ else
+{
+ mes "[Sad-looking Man]";
+ mes "...";
+ mes "^333333*Sob...*";
+ mes "Lowen...";
+ mes "I'm so sorry.";
+ mes "It's all my fault.";
+ mes "Please be okay...";
+ close;
+}
+
+}
+
+prt_castle.gat,80,52,0 script Personnel Record#hiddenbook1 111,{
+
+ if($God2 < 50)
+{
+ mes "[Librarian]";
+ mes "What are you doing now?";
+ mes "Don't touch anything, please!";
+ close;
+}
+
+ if($God3 > 99)
+{
+ mes "[Librarian]";
+ mes "What are you doing?";
+ mes "Don't touch anything!";
+ close;
+}
+
+ if(god_brising == 26)
+{
+ mes "[" + strcharinfo(0) + "]";
+ mes "I should read this from the point where I left off...";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "Huh...?";
+ mes "What's this mark";
+ mes "here at the bottom?";
+ mes "A secret?";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "No wonder the librarian seemed to hesitate before saying anything. Now let's see...";
+ next;
+ set @bookrand,rand(1,3);
+ if(@bookrand == 1)
+ {
+ mes "...(omitted) Lowen, of the 2nd squad, returned to her detachment 3 days after the incident.";
+ next;
+ mes "A trial was held, and she was judged guilty of fleeing when ordered to fight. Despite the severity of this offense, she was only discharged from the Crusaders and the holy power granted to her was removed...";
+ mes "We collected the holy power granted to her...(omitted)";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "She was forced to leave the Crusaders?! That's ridiculous!";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "Did they want to sentence her to death or what? That's almost too cruel. She must have been humiliated...";
+ next;
+ mes "2 years later after the incident, an expedition team found rusty armor shards, a broken sword and some effects belonging to Lowen Ellenen.";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "However, this information is classified. Officially, Lowen Ellenen died during the mission.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "They thought she brought disgrace to the Crusaders? This sounds messy. Should I try to meet her again?";
+ next;
+ mes "[Librarian]";
+ mes "^666666*Yawn...*^000000";
+ mes "What the...?";
+ mes "who are you!";
+ mes "Get the hell";
+ mes "out of here!";
+ set god_brising,30;
+ close2;
+ warp "prt_castle.gat",94,37;
+ end;
+ }
+ else
+ {
+ mes "[Librarian]";
+ mes "^666666*Yawn...*^000000";
+ mes "What the...?";
+ mes "who are you!";
+ mes "Get the hell";
+ mes "out of here!";
+ close2;
+ warp "prt_castle.gat",94,37;
+ end;
+ }
+}
+ else if(god_brising == 25)
+{
+ mes "^3355FFYou took the book from the shelf while the librarian was dozing. According to the Crusader Personnel Records, there's only one recruit that was named Lowen Ellenen.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Lowen Ellenen...";
+ mes "Member of the";
+ mes "2nd squad...";
+ mes "Age 22...";
+ mes "Female...";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "Became a fugitive?";
+ mes "Announced death?";
+ mes "This is the same information the soldier told me.";
+ next;
+ set @bookrand,rand(1,3);
+ if(@bookrand == 1)
+ {
+ mes "[" + strcharinfo(0) + "]";
+ mes "...umm let's read again from the page that I read last time.";
+ mes "Umm? What is this mark on the bottom?";
+ mes "A secret? Ah...now I see why the librarian was hesitating to say something.";
+ mes "Let's see...";
+ next;
+ mes "...(omitted) Lowen in the second squad";
+ mes "was sent back to her detachment in 3 days after the accident.";
+ mes "In order to interrogate her responsibility on the absence";
+ mes "during the mission, a trial was hold.";
+ mes "She was supposed to be severely punished";
+ mes "however, with a power of the commandant,";
+ mes "she was order to be discharged from service.";
+ mes "We collected the holy power granted to her...(omitted)";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "...what?! She was taken her ability and forced to be discharged?";
+ mes "It was ridiculous.";
+ mes "Was she sentenced to death on the trial or what?";
+ mes "Jesus christ, that was so mean.";
+ mes "...she must feel humiliated when it happened...";
+ next;
+ mes "...2 years later after the accident,";
+ mes "an expedition team found rusty armors, a broken sword and some belongings";
+ mes "which were suspected to he Lowen Ellenen's.";
+ mes "However, this information was realsed to only members in charge.";
+ mes "Officially she died during the mission.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "........ .... did they think she disgraced crusaders?";
+ mes "....sounds confusing and messy...";
+ mes "Now...what should I do...";
+ mes "Should I go ahead and meet her again?";
+ next;
+ mes "[Librarian]";
+ mes "*yawn*...?!";
+ mes "What the...who are you!";
+ mes "Get the hell out of here!";
+ set god_brising,30;
+ close2;
+ warp "prt_castle.gat",94,37;
+ end;
+ }
+ else
+ {
+ mes "[Librarian]";
+ mes "*yawn*...?!";
+ mes "What the...who are you!";
+ mes "Get the hell out of here!";
+ set god_brising,26;
+ mes "["+ strcharinfo(0) +"]";
+ mes "(Nuts...!";
+ mes "I didn't get";
+ mes "to finish reading!)";
+ close2;
+ warp "prt_castle.gat",94,37;
+ end;
+ }
+}
+ else
+{
+ mes "[Librarian]";
+ mes "What are you doing here?";
+ mes "Don't touch anything!";
+ close;
+}
+
+}
+
+//-----------librarian----------------------------------------------------------
+
+prt_castle.gat,84,51,5 script Librarian#2 105,{
+
+ if($God2 < 50)
+{
+ mes "[Librarian]";
+ mes "What are you doing here?";
+ mes "Don't touch anything. please!";
+ close;
+}
+
+ if($God3 > 99)
+{
+ mes "[Librarian]";
+ mes "What are you doing now?";
+ mes "Don't touch anything!";
+ close;
+}
+
+ if (god_brising > 24 && god_brising < 27)
+{
+ mes "[Librarian]";
+ mes ".... . ..... ....";
+ mes "...........Zzzzz..";
+ mes "Zzzz....Zzzzz...";
+ next;
+ mes "^3355FFThis librarian seems to be deeply asleep. It'd be smarter not to wake him if you want to check the Crusader Personnel Records.^000000";
+ close;
+}
+ else if(god_brising == 10)
+{
+ mes "[Librarian]";
+ mes "All confidential personnel records are kept here in the royal library. However, you need authorization for full access.";
+ next;
+ mes "[Librarian]";
+ mes "Did you say that you need to find a person? Please give me that person's name, as well as your relationship with that person.";
+ next;
+ menu "Lowen, Sibling",-,"Lowen, Spouse",L_Spouse,"Lowen, Enemy",L_Enemy,"Lowen, a Friend",L_Friend;
+ if(Sex)
+ {
+ mes "[Librarian]";
+ mes "How dare you lie to the royal librarian!";
+ next;
+ mes "[Librarian]";
+ mes "It says here in the records that Lowen did not have any male siblings!";
+ next;
+ mes "[Librarian]";
+ mes "^333333(Crap! I just disclosed ^666666classified^000000 ^333333info!)^000000.";
+ next;
+ mes "[Librarian]";
+ mes "The Royal Library won't";
+ mes "tolerate identity fraud!";
+ mes "Please leave!";
+ close;
+ }
+ else
+ {
+ mes "[Librarian]";
+ mes "You're related to Miss Lowen? How have you not received any news about her before?";
+ next;
+ mes "[Librarian]";
+ mes "I see...";
+ mes "Separated at birth,";
+ mes "that's truly tragic.";
+ mes "Okay, let me check.";
+ next;
+ mes "[Librarian]";
+ mes "I feel terrible telling you this, but it's too late to find Lowe Ellenen, according to the records.";
+ next;
+ mes "[Librarian]";
+ mes "During the monster subjugation mission in Geffen dungeon she reportedly disappeared and... um, later pronounced dead.";
+ next;
+ mes "[Librarian]";
+ mes "I'm sorry, but";
+ mes "that's all I know.";
+ mes "Thank you...";
+ set god_brising,11;
+ close;
+ }
+
+ L_Spouse:
+ if(Sex)
+ {
+ mes "[Librarian]";
+ mes "Spouse...?";
+ mes "Well, I guess you look like a husband. Heh, I've got a girlfriend myself. Well, at least I think so. Anyway...";
+ mes "right, give me";
+ mes "a minute.";
+ next;
+ mes "[Librarian]";
+ mes "Lowen Ellenen";
+ mes "the Crusader, right?";
+ mes "I'm so... sorry.";
+ mes "You might want";
+ mes "to have a seat.";
+ next;
+ mes "[Librarian]";
+ mes "Please listen to me. During the monster subjugation in Geffen Dungeon, she reportedly disappeared. And later, she was pronounced dead.";
+ next;
+ mes "[Librarian]";
+ mes "That's all the information I have, sir. I'm truly sorry for your loss.";
+ set god_brising,11;
+ close;
+ }
+ else
+ {
+ mes "[Librarian]";
+ mes "Hmmm...?";
+ mes "Spouse?";
+ mes "Or ^333333*Ahem*^000000";
+ mes "cohabitational partners?";
+ next;
+ mes "^3355FFThe librarian";
+ mes "now seems awfully";
+ mes "distracted, as if";
+ mes "he were lost in";
+ mes "vivid daydream...^000000";
+ close;
+ }
+
+ L_Enemy:
+ mes "["+ strcharinfo(0) +"]";
+ mes "I'm looking";
+ mes "for Ellenen.";
+ mes "Lowen Ellenen.";
+ mes "My sworn arch-enemy.";
+ next;
+ mes "[Librarian]";
+ mes "Arch-enemy...?";
+ mes "Um, uh ^666666*Ahem!*^000000";
+ mes "All I can tell you is that there was a Crusader by that name.";
+ next;
+ mes "[Librarian]";
+ mes "I'm sorry, but";
+ mes "I can't tell you";
+ mes "more than that.";
+ next;
+ mes "[Librarian]";
+ mes "^333333*Cough*^000000";
+ mes "^666666Nutcase!^000000";
+ close;
+
+ L_Friend:
+ mes "[Librarian]";
+ mes "A friend...?";
+ mes "Well, we have record of someone named Lohen Phelica.";
+ next;
+ mes "[Librarian]";
+ mes "He retired from the service a few years ago. I'd like to give you his address, but we don't have any of that information.";
+ set god_brising,12;
+ close;
+}
+ else if(god_brising > 10 && god_brising < 13)
+{
+ mes "[Librarian]";
+ mes "Now, may";
+ mes "I excuse myself?";
+ mes "Thank you!";
+ close;
+}
+ else
+{
+ mes "[Librarian]";
+ mes "All confidential personnel records are kept here in the royal library. However, you need authorization for full access.";
+ close;
+}
+
+}
+
+prontera.gat,260,354,4 script Woman#Rosa Ellenen 101,{
+
+ if($God2 < 50)
+{
+ mes "[Woman]";
+ mes "Hm?";
+ mes "What brings";
+ mes "you here? It's";
+ mes "kind of strange";
+ mes "to come just to";
+ mes "take a walk.";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "[Woman]";
+ mes "Hm?";
+ mes "What brings";
+ mes "you here? It's";
+ mes "kind of strange";
+ mes "to come just to";
+ mes "take a walk.";
+ close;
+}
+ if(god_brising > 33)
+{
+ mes "[Rosa Ellenen]";
+ mes "Are you the one who visited me before? Ah, of course.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "I'm not sure how to tell you this, but... This is Lowen's grave. Thank you.";
+ mes "Ah....I am not sure how I can tell you this...";
+ close;
+}
+ else if(god_brising == 21)
+{
+ mes "[Rosa Ellenen]";
+ mes "What are you";
+ mes "talking about?";
+ mes "A message from Lowen?";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "What?!";
+ mes "Why hasn't she";
+ mes "gone to heaven yet?";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "I hope you remember everything I'm going to tell you. She should go to heaven now! I still don't understand...";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "And please tell that praying fool that he shouldn't waste his time blaming himself. ^333333*Sigh*^000000 I still don't know why she chose to speak to you.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "Let me tell you something. Lowen was fencing prodigy. However, she always had trouble enduring the rigorous training and bearing the weight of armor...";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "But she loved fencing and always tried twice as hard to develop her physical strength so that she could serve God in battle.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "Finally, she became a Crusader. For a while things were great. But then she suddenly disappeared while on a mission to Geffen Dungeon.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "Two years later, she was buried in this grave after her body was found by some adventurers. I was given the broken shards of armor and a blood stained ribbon she left behind.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "I never really learned what exactly happened. And Hermite was always following her like she was his real sister. Ever since she died, he's changed. I hope he doesn't hurt himself...";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "But something suspicious seems to have happened in the military, but they won't even talk to me about it.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "In the end, I gave up trying to find the truth. After all, nothing can bring her back...";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "If you meet her again,";
+ mes "please tell her I'm fine and that I hope her soul passes from this realm into heaven.";
+ set god_brising,25;
+ close;
+}
+ else if(god_brising > 9 && god_brising < 20)
+{
+ mes "[Rosa Ellenen]";
+ mes "This is my little";
+ mes "sister's grave...";
+ mes "Her name was Lowen.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "Are you a friend of Lowen's? Hm? The man in the Sanctuary? That must be Hermite.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "He was shocked when Lowen died, but he doesn't have to blame himself for her death. I don't want him to suffer from the guilt.";
+ next;
+ mes "[Rosa Ellenen]";
+ mes "Anyway, thank you for visiting my little sister. It's good to know she has friends, even after she's passed on.";
+ set god_brising,11;
+ close;
+}
+ else
+{
+ mes "[Rosa Ellenen]";
+ mes "Oh hello...";
+ mes "Have you come";
+ mes "to pay your respects";
+ mes "to someone here as well?";
+ close;
+}
+
+}
+
+prontera.gat,262,353,0 script Gravestone 111,{
+
+ if($God2 > 49)
+{
+ if(god_brising > 33)
+ {
+ mes "Lowen Ellenen";
+ mes " ";
+ mes " XXXX. XX. XX.";
+ mes "";
+ mes " Her noble spirit";
+ mes "was sent to the holy place";
+ mes " by will of the Valkyrie.";
+ close;
+ }
+ else
+ {
+ mes "^3355FFYou couldn't read the rest of the epitaph since the tombstone has been eroded.^000000";
+ close;
+ }
+}
+ else
+{
+ mes "^3355FFIt's just an";
+ mes "ordinary gravestone.^000000";
+ next;
+ mes "^3355FFNothing really";
+ mes "sets it apart from the rest of the tombstones here in the Prontera cemetary.^000000";
+ close;
+}
+
+}
+
+gef_dun01.gat,89,192,0 script #lowentrace 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "^3355FFIt's just an old,";
+ mes "dry piece of wood.^000000";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "^3355FFIt's just an old,";
+ mes "dry piece of wood.^000000";
+ close;
+}
+ if (god_brising > 20 && god_brising < 34)
+{
+ mes "Will you";
+ mes "summon her? ";
+ next;
+ menu "Yes",-,"No",L_No;
+ input @lowenstring$;
+ if(@lowenstring$ == "Lowen")
+ {
+ if(god_brising == 30)
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8B...Y-you're...";
+ mes "I-I can't stay long,";
+ mes "I'm feeling too weak.";
+ mes "Come closer, I want";
+ mes "to show you something...^000000";
+ next;
+ mes "^3355FFHer voice grew";
+ mes "softer and softer";
+ mes "until you could no";
+ mes "longer hear her.^000000";
+ close;
+ }
+ else if(god_brising == 21)
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BPlease tell Rosa";
+ mes "not to worry about me anymore. You might be able to find her beside my grave. I don't want her to suffer anymore...^000000";
+ close;
+ }
+ else if(god_brising == 25)
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BYou've come back.";
+ mes "Have you met Rosa?";
+ mes "Hm, yes, it sounds like she'd say that. But thank you for sending her my message.^000000";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BAh, it's too dangero--";
+ mes "This place is too dangerous for you. I hate myself for not being able to help protect you from these evil creatures. Please be careful...^000000";
+ close;
+ }
+ else
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BMy spirit is";
+ mes "growing weaker...";
+ mes "Please be careful...";
+ mes "This place is too dangerous.^000000";
+ close;
+ }
+ }
+ else
+ {
+ close;
+ }
+ L_No:
+ close;
+}
+ else if(god_brising == 20)
+{
+ mes "[The voice of a female]";
+ mes "^6E7B8BI-It's dangerous...";
+ mes "Be careful...^000000";
+ next;
+ menu "Ignore it.",-,"What are you talking about?",L_What;
+ close;
+ L_What:
+ mes "[The voice of a female]";
+ mes "^6E7B8B...No way...";
+ mes "You can hear me?";
+ mes "I can't believe this.";
+ mes "It's impossible. But if you don't mind, may I talk to you...?^000000";
+ mes "can I talk to you for a while?";
+ next;
+ menu "Holy...! Run!",-,"What are you?!",L_Who;
+ close;
+ L_Who:
+ mes "[The voice of a female]";
+ mes "^6E7B8BI...";
+ mes "I don't have my body anymore, so... I think I'm a ghost. Yes, I've been wandering in this place ever since I got here.^000000";
+ next;
+ mes "[The voice of a female]";
+ mes "^6E7B8BI'm still not sure why I'm bound to this realm. If you don't mind, would you visit my sister for me?";
+ next;
+ mes "[The voice of a female]";
+ mes "^6E7B8BPlease tell her...";
+ mes "Please tell her that her little sister Lowen is fine.^000000";
+ next;
+ mes "[The voice of a female]";
+ mes "^6E7B8BUm...";
+ mes "If you want to meet me again, just say my name out loud. '^000000Lowen^6E7B8B.'^000000";
+ set god_brising,21;
+ close;
+}
+ else
+{
+ mes "^3355FFYou find a piece of twisted, dry wood. Looking at it seems to bring out a feeling of sadness within you for some reason.^000000";
+ close;
+}
+
+OnTouch:
+ if(god_brising > 9 && god_brising < 34)
+{
+ emotion e_gasp;
+ end;
+}
+
+}
+
+gef_dun01.gat,203,48,0 script #lowentrace1 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "^3355FFIt's just an old,";
+ mes "dry piece of wood.^000000";
+ close;
+}
+
+ if($God3 > 99)
+{
+ mes "^3355FFIt's just an old,";
+ mes "dry piece of wood.^000000";
+ close;
+}
+
+ if(god_brising > 20 && god_brising < 34)
+{
+ mes "Would you";
+ mes "like to summon her? ";
+ next;
+ menu "Yes",-,"No",L_No;
+ input @lowenstring$;
+ if(@lowenstring$ == "Lowen")
+ {
+ if(god_brising == 31)
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BYou came back!";
+ mes "You'll be with me";
+ mes "...Won't you?^000000";
+ next;
+ menu "Of course.",-,"Sorry, I don't think I can...",L_Sorry;
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BThank you,";
+ mes "thank you so much...^000000";
+ close2;
+ warp "que_god02.gat",47,53;
+ end;
+ L_Sorry:
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BI understand.";
+ mes "Please take";
+ mes "care of yourself...^000000";
+ close;
+ }
+ else if(god_brising == 30)
+ {
+ mes "[Lowen Ellenen]";
+ mes "^6E7B8BAh yes. This is it.";
+ mes "You look very curious about me, yet I am amazed that you can hear my voice. Please let me tell you an old story.^000000";
+ close2;
+ warp "que_god02.gat",47,53;
+ end;
+ }
+ else if(god_brising == 25)
+ {
+ mes "[Lowen Ellenen]";
+ mes "You came back.";
+ mes "....have you met Rosa?";
+ mes "...yes...I expected her to say so.....";
+ mes "Thank you for sending my message to her.";
+ mes "....I wish I could do what she wants me to do...";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Ah...it's too danger.";
+ mes "This place is too dangerous for you.";
+ mes "I hate myself for not protecting you from evil creatures.";
+ mes "Please be careful.";
+ close;
+ }
+ else
+ {
+ mes "[Lowen Ellenen]";
+ mes "I hope you will not summon me for fun.";
+ mes "And please be careful...this place is too dangerous for you.";
+ close;
+ }
+ }
+ else
+ {
+ close;
+ }
+ L_No:
+ close;
+}
+ else if(god_brising == 20)
+{
+ mes "[The voice of a female]";
+ mes "...it's dangerous...be careful.";
+ next;
+ menu "Ignore it.",-,"What are you talking about?",L_What;
+ close;
+ L_What:
+ mes "[The voice of a female]";
+ mes ".... no way........are you...?";
+ mes "Can you hear me?";
+ mes "...I can't...believe this..";
+ mes "I can't belive this...but if you don't mind";
+ mes "can I talk to you for a while?";
+ next;
+ menu "Sorry, I am busy!",-,"What are you?!",L_Who;
+ close;
+ L_Who:
+ mes "[The voice of a female]";
+ mes "Ah, no need to be surprised.";
+ mes "Actually I am the one who was surprised.";
+ mes "Ah...ah...I don't have a physical form...";
+ mes "Err...technically I am a ghost.....";
+ mes "Yes, I think I am a ghost.";
+ mes "Since when I have been wandering around here.";
+ next;
+ mes "[Lowen]";
+ mes "I don't know why I haven't gone beyond the realm.";
+ mes "If you don't mind...I hope you can go visit my sister.";
+ mes "And please tell her that I am fine.";
+ mes "....tell her that Lowen, her little sister is fine...";
+ next;
+ mes "[Lowen]";
+ mes "If you want to meet me again,";
+ mes "please call my name out loud.";
+ mes " 'Lowen'...";
+ set god_brising,21;
+ close;
+}
+ else
+{
+ mes "- You found a twisted and dry wood. -";
+ mes "- It looked dismal but sad at the same time. -";
+ close;
+}
+
+OnTouch:
+ if (god_brising > 9 && god_brising < 34)
+{
+ emotion e_gasp;
+ end;
+}
+
+}
+
+que_god02.gat,48,55,3 script Lowen Ellenen 745,{
+
+ if(god_brising == 30)
+{
+ mes "[Lowen Ellenen]";
+ mes "Can you see me now?";
+ mes "You must be surprised.";
+ mes "This is the story I will share with you.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Look around.";
+ mes "Recognize it?";
+ mes "We're still in the same place, except now we're in my past.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "All of us came here to Geffen to cleanse this area of evil spirits. You asked for the reason I stayed here?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I couldn't forgive myself for what I've done to my comrades. They were killed because of me.";
+ next;
+ menu "You were cursed...?",-,"You still have something to do.",L_Still;
+ mes "["+ strcharinfo(0) +"]";
+ mes "You're saying...";
+ mes "The anger of your";
+ mes "comrades manifested";
+ mes "into a curse?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Cursed by my fallen comrades... Yes, that's what I thought at first. So I tried to redeem myself as well as avenge their deaths.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I have been trying my best to comfort their spirits for 2 years.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Ever since you guys failed on a mission, you've spent two years here killing monsters?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Yes, that's right.";
+ mes "I thought it would bring comfort to the spirits of my comrades.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "But once I died, I met all of my old friends in Nifflheim, the town of the dead. You've heard of it, haven't you?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "No one seemed to blame me for what had happened. In fact, they all seemed worried about me.";
+ next;
+ menu "Then why?",-;
+ mes "[Lowen Ellenen]";
+ mes "They waited for me in Nifflheim for two years, since they didn't want me to misunderstand them. They never blamed me for what happened.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "But I still feel like something is wrong. Out of all of us, I'm the only one unable to rest in peace. Everyone else was selected to go to Valhalla.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "But Valhalla is where all honorable Crusaders are supposed to go. What have I done wrong?";
+ close;
+ L_Still:
+ mes "[Lowen Ellenen]";
+ mes "I don't think I have any unfinished business. But who knows, maybe there is something I have to do.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "All of my late comrades that I met in Nifflheim were selected by Valkyrie and sent to Valhalla. That's how honorable Crusaders spend the afterlife. But it looks like I don't deserve it...";
+ next;
+ menu "I can help you!",-;
+ mes "[Lowen Ellenen]";
+ mes "You can";
+ mes "help me?";
+ mes "How...?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "You said this is the place where the subjugation mission happened, right? I'll fight with you!";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "Now come on, you deserve to feel guilty like this. Let's think about how we're gonna fight these monsters!";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "...";
+ mes "Thank you.";
+ mes "Thank you so much.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Now,";
+ mes "shall we go in?";
+ set god_brising,31;
+ close;
+}
+ else if(god_brising == 31)
+{
+ mes "[Lowen Ellenen]";
+ mes "Walk down the stairs ahead. From this point on, I can only travel with you in your mind...";
+ close;
+}
+ else
+{
+ mes "[Lowen Ellenen]";
+ mes "How come...";
+ mes "You're here?";
+ close2;
+ warp "geffen.gat",120,101;
+ end;
+}
+
+}
+
+que_god02.gat,54,64,4 script Soldier#1_brising 105,1,1,{
+
+ if(god_brising == 31)
+{
+ mes "[Soldier]";
+ mes "Have you volunteered for monster subjugation? Would you like to start the mission now?";
+ next;
+ menu "Yes.",-,"I need more time.",L_Time;
+ mes "[Soldier]";
+ mes "We're you're ready,";
+ mes "come and stand in";
+ mes "front of me.";
+ close;
+
+ L_Time:
+ mes "[Soldier]";
+ mes "No problem, just come back when your preparations are completed.";
+ close;
+}
+ else
+{
+ mes "[Soldier]";
+ mes "Please back away.";
+ mes "You are not permitted";
+ mes "to enter!";
+ close;
+}
+
+OnTouch:
+ if(god_brising == 31)
+{
+ warp "que_god02.gat",174,49;
+ donpcevent "#brisinsold::OnSold1Off";
+ donpcevent "#brisinsold2::OnSold2On";
+ end;
+}
+ else
+{
+ mes "[Soldier]";
+ mes "Please back away.";
+ mes "You are not permitted";
+ mes "to enter!";
+ close2;
+ warp "que_god02.gat",51,59;
+ end;
+}
+
+}
+
+que_god02.gat,55,64,4 script Soldier#2_brising 105,1,1,{
+
+ mes "[Soldier]";
+ mes "Please back away.";
+ mes "You are not permitted";
+ mes "to enter!";
+ close;
+}
+
+que_god02.gat,1,1,1 script #brisinsold1 -1,{
+
+OnSold1On:
+ enablenpc "Soldier#1_brising";
+ end;
+
+OnSold1Off:
+ disablenpc "Soldier#1_brising";
+ end;
+}
+
+que_god02.gat,1,1,1 script #brisinsold2 -1,{
+
+OnInit:
+ disablenpc "Soldier#2_brising";
+ areawarp "que_god02.gat",100,128,85,3,"geffen.gat",120,100;
+ end;
+
+OnSold2On:
+ enablenpc "Soldier#2_brising";
+ initnpctimer;
+ end;
+
+OnTimer420000:
+ mapannounce "que_god02.gat","Lowen's spirit is beginning to weaken...",0,0x70DBDB;
+ end;
+
+OnTimer480000:
+ mapannounce "que_god02.gat","Your presense in her past can't be maintained for much longer...",0,0x70DBDB;
+ end;
+
+OnTimer540000:
+ mapannounce "que_god02.gat","Lowen's spirit can't keep you in the past any longer.",0,0x70DBDB;
+ end;
+
+OnTimer542000:
+ areawarp "que_god02.gat",1,1,400,400,"geffen.gat",120,100;
+ end;
+
+OnTimer550000:
+ donpcevent "#brisinsummon::OnReset";
+ end;
+
+OnTimer550500:
+ stopnpctimer;
+ end;
+
+}
+
+que_god02.gat,1,1,1 script #Warp_brising -1,{
+
+OnWarp:
+
+ end;
+}
+
+que_god02.gat,1,1,1 script #brisinsummon -1,{
+
+OnInit:
+ disablenpc "#doppelganger1";
+ disablenpc "#doppelganger2";
+ disablenpc "#knight1";
+ disablenpc "#knight2";
+ disablenpc "#knight3";
+ disablenpc "#lowen";
+ disablenpc "Valkyrie#1";
+ enablenpc "#hermite";
+ end;
+
+OnDoppel1On:
+ enablenpc "#doppelganger1";
+ end;
+
+OnDoppel1Off:
+ disablenpc "#doppelganger1";
+ end;
+
+OnDoppel2On:
+ enablenpc "#doppelganger2";
+ end;
+
+OnDoppel2Off:
+ disablenpc "#doppelganger2";
+ end;
+
+OnKnight1On:
+ enablenpc "#knight1";
+ end;
+
+OnKnight2On:
+ enablenpc "#knight2";
+ end;
+
+OnKnight3On:
+ enablenpc "#knight3";
+ end;
+
+OnKnight1Off:
+ disablenpc "#knight1";
+ end;
+
+OnKnight2Off:
+ disablenpc "#knight2";
+ end;
+
+OnKnight3Off:
+ disablenpc "#knight3";
+ end;
+
+OnLowenOn:
+ enablenpc "#lowen";
+ end;
+
+OnLowenOff:
+ disablenpc "#lowen";
+ end;
+
+OnHermiteOff:
+ disablenpc "#hermite";
+ end;
+
+OnLowen2Off:
+ disablenpc "Lowen Ellenen#2";
+ end;
+
+OnSummon:
+ attachrid $@BrisinRID$;
+ monster "que_god02.gat",34,128,"",1015,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",34,127,"",1015,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",80,127,"",1015,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",102,128,"",1036,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",130,128,"",1036,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",62,128,"",1041,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",64,127,"",1041,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",150,127,"",1041,1,"#brisinsummon::OnMobDeath";
+ monster "que_god02.gat",176,127,"",1041,1,"#brisinsummon::OnMobDeath";
+ set brisinmobdead,9;
+ end;
+
+OnMobDeath:
+ set brisinmobdead,brisinmobdead -1;
+ if(brisinmobdead > 0) end;
+ set god_brising,31;
+ enablenpc "Valkyrie#1";
+ detachrid;
+ end;
+
+OnReset:
+ disablenpc "#doppelganger1";
+ disablenpc "#doppelganger2";
+ disablenpc "#knight1";
+ disablenpc "#knight2";
+ disablenpc "#knight3";
+ disablenpc "#lowen";
+ enablenpc "Soldier#1_brising";
+ disablenpc "Soldier#2_brising";
+ enablenpc "#hermite";
+ enablenpc "Lowen Ellenen#2";
+ disablenpc "Valkyrie#1";
+ killmonster "que_god02.gat","#brisinsummon::OnMobDeath";
+}
+
+que_god02.gat,173,58,4 script #doppelganger1 739,{
+
+OnEmoGasp:
+ emotion e_gasp;
+ end;
+}
+
+que_god02.gat,175,55,4 script #doppelganger2 739,{
+
+OnCast:
+ specialeffect 59;
+ end;
+}
+
+que_god02.gat,175,54,1 script #lowen 745,{
+
+OnEmoGasp:
+ emotion e_gasp;
+ end;
+
+OnCast:
+ specialeffect 59;
+ end;
+}
+
+que_god02.gat,178,49,1 script #knight1 751,{
+
+OnEmoGasp:
+ emotion e_gasp;
+ end;
+
+OnEmoGo:
+ emotion e_go;
+ end;
+}
+
+que_god02.gat,168,53,7 script #knight2 734,{
+
+OnEmoGasp:
+ emotion e_gasp;
+ end;
+
+OnEmoGo:
+ emotion e_go;
+ end;
+}
+
+que_god02.gat,167,58,4 script #knight3 752,{
+
+OnEmoGasp:
+ emotion e_gasp;
+ end;
+
+OnEmoGo:
+ emotion e_go;
+ end;
+}
+
+que_god02.gat,174,49,0 script #lowenone 139,0,0,{
+
+OnTouch:
+ donpcevent "brisinsold2::OnSold2On";
+ mes "[" + strcharinfo(0) + "]";
+ mes "Where am I?";
+ mes "Isn't this...?!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Ah, I see.";
+ mes "This must be the place where everything happened two years ago. Good, good...";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Shshh...";
+ mes "This is just a reflection of the past. Here, you'll see what happened at the time for yourself.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "It wasn't any";
+ mes "trouble getting down here. But... We've got problems now.";
+ next;
+ mapannounce "que_god02.gat","D...Doppelganger!!!",0,0x9CFF00;
+ mes "[" + strcharinfo(0) + "]";
+ mes "What...?!";
+ mes "Doppelganger?!";
+ next;
+ donpcevent "#brisinsummon::OnDoppel1On";
+ donpcevent "#brisinsummon::OnKnight1On";
+ donpcevent "#brisinsummon::OnKnight2On";
+ donpcevent "#brisinsummon::OnKnight3On";
+ donpcevent "#brisinsummon::OnLowenOn";
+ mes "[" + strcharinfo(0) + "]";
+ mes "What's going on?";
+ mes "Did you really fight with that creature? H-hey! Answer me!";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Yes, this was the place...";
+ mes "The commendant gave us the order...";
+ mes "And then..? And then what happened to me..?";
+ next;
+ mapannounce "que_god02.gat","Everyone, stay calm! Get into your positions!",0,0x9CFF00;
+ mes "^4E2F2F[Crusader Commander]";
+ mes "Everyone, get into your positions! Front line, block its movement! Rear line, support the defense!^000000";
+ donpcevent "#knight1::OnEmoGo";
+ donpcevent "#knight2::OnEmoGo";
+ donpcevent "#knight3::OnEmoGo";
+ donpcevent "#doppelganger1::OnEmoGasp";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "N-no!";
+ mes "I'm not running away!";
+ next;
+ mes "^3355FFYou're filled with a great anxiety, and you experience for yourself the fear and pressure Lowen felt during those very moments.^000000";
+ next;
+ mes "^4E2F2F[Crusader Commander]";
+ mes "Go, Lowen!";
+ mes "Cast Grand Cross, now!^000000";
+ next;
+ donpcevent "#lowen::OnCast";
+ mapannounce "que_god02.gat","Mwahaha! Mortals are such fools...",0,0xA8A8A8;
+ donpcevent "#brisinsummon::OnDoppel1Off";
+ donpcevent "#brisinsummon::OnDoppel2On";
+ donpcevent "#knight1::OnEmoGasp";
+ donpcevent "#knight2::OnEmoGasp";
+ donpcevent "#knight3::OnEmoGasp";
+ donpcevent "#lowen::OnEmoGasp";
+ mes "[" + strcharinfo(0) + "]";
+ mes " ??!!!";
+ next;
+ donpcevent "#doppelganger2::OnCast";
+ mes "[Male Voice]";
+ mes "Lowen!";
+ mes "Noooooooooo!!!";
+ close2;
+ warp "que_god02.gat",120,52;
+ donpcevent "#brisinsummon::OnDoppel2Off";
+ donpcevent "#brisinsummon::OnKnight1Off";
+ donpcevent "#brisinsummon::OnKnight2Off";
+ donpcevent "#brisinsummon::OnKnight3Off";
+ donpcevent "#brisinsummon::OnLowenOff";
+ end;
+}
+
+que_god02.gat,124,59,7 script #hermite 798,{ end; }
+
+que_god02.gat,120,52,0 script #monologue 139,0,0,{
+
+OnTouch:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Where am I?";
+ mes "Isn't that...";
+ mes "What's Hermite";
+ mes "doing here?!";
+ next;
+ mes "[Hermite Charles]";
+ mes "No, no, no!";
+ mes "Lowen don't it!";
+ mes "He's gonna kill you!";
+ next;
+ mes "[Hermite Charles]";
+ mes "Grand Cross...";
+ mes "Using that's committing suicide! Lowen, don't do it!";
+ mes "Don't do that, Lowen!";
+ next;
+ mapannounce "que_god02.gat","Mwahaha! Mortals are such fools...",0,0xA8A8A8;
+ mes "[Hermite Charles]";
+ mes "Lowen!";
+ mes "Noooooooooo!!!";
+ next;
+ donpcevent "#brisinsummon::OnHermiteOff";
+ mes "[" + strcharinfo(0) + "]";
+ mes "Where did he go?";
+ mes "Was... Was that";
+ mes "from his mind?";
+ mapannounce "que_god02.gat","What happened?! L-Lowen's gone!!",0,0xA8A8A8;
+ next;
+ mes "[Lowen Ellenen]";
+ mes "...";
+ mes "I see now.";
+ mes "I know...";
+ mes "What happened...";
+ close2;
+ warp "que_god02.gat",18,127;
+ end;
+
+}
+
+que_god02.gat,21,127,3 script Lowen Ellenen#2 745,{
+
+ mes "[Lowen Ellenen]";
+ mes "I was a fool.";
+ mes "Now I remember Hermite. He must have been the one who rescued me. But when I came to my senses, no one was there.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I blamed myself for surviving alone. I should have died there with my friends. I felt so useless.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Now I realize that there were many people who loved me. But at the time, I felt only guilt.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I returned 3 days later to my commander. It was stupid, but at the moment I couldn't think of anything else.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "The higher ups and the politicians were looking for a scapegoat for the failure of the mission.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "So I was the one who was blamed. Then, they took away everything I had. My status, the holy power granted to me...";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I thought I deserved that punishment. After all, why should I have survived when all my comrades died?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "It was then that I decided to avenge my friends, and salvage what was left of my sense of honor.";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "I went back to that place. I fought and I fought, trying to make penance for what I had done wrong...";
+ next;
+ mapannounce "que_god02.gat","If you wish, continue your battle. I promise you the winner will become an Einherjar...",0,0x70DB93;
+ mes "[Lowen Ellenen]";
+ mes "That voice...";
+ mes "Isn't this...?";
+ next;
+ mes "[Lowen Ellenen]";
+ mes "Are you giving me another chance? But I no longer have a body to fight monsters any longer...";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Don't worry,";
+ mes "I'm with you!";
+ mes "Let's do it!";
+ close2;
+ set $@BrisinRID$,getcharid(3);
+ donpcevent "#brisinsummon::OnSummon";
+ donpcevent "#brisinsummon::OnLowen2Off";
+ end;
+
+}
+
+que_god02.gat,178,127,3 script Valkyrie#1 811,{
+
+ if(god_brising == 31)
+{
+ mes "[Valkyrie]";
+ mes "You have passed the test, Lowen. I don't have much talk to speak.";
+ next;
+ mes "[Valkyrie]";
+ mes "Have you found the strength to release yourself from the guilt and the pain? I have been waiting for you. Will you accept my invitation to Valhalla?";
+ next;
+ menu "Yes, I will follow you.",-,"Um... I'm not Lowen.",L_No;
+ mes "[Valkyrie]";
+ mes "Lowen Ellenen, misunderstood hero. I will now promote you to Einherjar with the will of God.";
+ next;
+ mes "[Valkyrie]";
+ mes "Your soul and spirit will be reborn in Valhalla as a holy warrior preparing for the holy war.";
+ specialeffect2 42;
+ next;
+ mes "[Valkyrie]";
+ mes "And...";
+ mes ""+ strcharinfo(0) +",";
+ mes "Your exploits are known to me. But I am curious as to what has brought you here?";
+ next;
+ mes "^3355FFYou explained what happened to the Valkyrie, starting from the Snow Crystal which never melts.^000000";
+ next;
+ mes "[Valkyrie]";
+ mes "I understand.";
+ mes "The story begins a long, long time ago with Freya, the patron goddess of beauty and love.";
+ next;
+ mes "[Valkyrie]";
+ mes "Her teardrop became a beautiful jewel. The snow on which Freya's teardrops have fallen will always retain its crystalline beauty.";
+ next;
+ mes "[Valkyrie]";
+ mes "You seek traces of the goddess? Perhaps this is a sign of the end of the thousand year peace. When the time comes, I hope humans will not abandon their faith.";
+ next;
+ mes "[Valkyrie]";
+ mes "Perhaps, I was also sent to meet you. I wish that humans will use the power derived from the traces of the gods to protect justice.";
+ next;
+ mes "[Valkyrie]";
+ mes ""+ strcharinfo(0) +"...";
+ mes "Listen. This is";
+ mes "what you must find.";
+ next;
+ mes "[Valkyrie]";
+ mes "A cold snowy path that the goddess walked across";
+ mes "A blue river that the goddess walked across";
+ mes "A narrow path that the goddess passed";
+ mes "Four dwarves that the goddess met...";
+ next;
+ mes "[Valkyrie]";
+ mes "^4d4dff We lost our hearts";
+ mes "to that golden hair";
+ mes "and those dazzling eyes.^000000";
+ next;
+ mes "[Valkyrie]";
+ mes "Remember this.";
+ mes "I shall send you";
+ mes "back to where you";
+ mes "belong.";
+ set god_brising,34;
+ next;
+ mes "[Valkyrie]";
+ mes "For Odin's honor...";
+ close2;
+ disablenpc "#doppelganger1";
+ disablenpc "#doppelganger2";
+ disablenpc "#knight1";
+ disablenpc "#knight2";
+ disablenpc "#knight3";
+ disablenpc "#lowen";
+ enablenpc "Soldier#1_brising";
+ disablenpc "Soldier#2_brising";
+ enablenpc "#hermite";
+ enablenpc "Lowen Ellenen#2";
+ disablenpc "Valkyrie#1";
+ warp "geffen.gat",120,101;
+ end;
+ L_No:
+ mes "[Valkyrie]";
+ mes "Hahahaha...";
+ mes "It has been";
+ mes "a while since";
+ mes "a mortal has";
+ mes "made me laugh.";
+ next;
+ mes "[Valkyrie]";
+ mes ""+ strcharinfo(0) +",";
+ mes "I am speaking to the spirit of the girl that rests within you, the girl to whom you lent your body so that she may learn the truth of the past.";
+ next;
+ mes "[Valkyrie]";
+ mes "Lowen Ellenen, misunderstood hero. I will now promote you to Einherjar with the will of God.";
+ next;
+ mes "[Valkyrie]";
+ mes "Your soul and spirit will be reborn in Valhalla as a holy warrior preparing for the holy war.";
+ specialeffect2 42;
+ next;
+ mes "[Valkyrie]";
+ mes "And...";
+ mes ""+ strcharinfo(0) +",";
+ mes "Your exploits are known to me. But I am curious as to what has brought you here?";
+ next;
+ mes "^3355FFYou explained what happened to the Valkyrie, starting from the Snow Crystal which never melts.^000000";
+ next;
+ mes "[Valkyrie]";
+ mes "I understand.";
+ mes "The story begins a long, long time ago with Freya, the patron goddess of beauty and love.";
+ next;
+ mes "[Valkyrie]";
+ mes "Her teardrop became a beautiful jewel. The snow on which Freya's teardrops have fallen will always retain its crystalline beauty.";
+ next;
+ mes "[Valkyrie]";
+ mes "You seek traces of the goddess? Perhaps this is a sign of the end of the thousand year peace. When the time comes, I hope humans will not abandon their faith.";
+ next;
+ mes "[Valkyrie]";
+ mes "Perhaps, I was also sent to meet you. I wish that humans will use the power derived from the traces of the gods to protect justice.";
+ next;
+ mes "[Valkyrie]";
+ mes ""+ strcharinfo(0) +"...";
+ mes "Listen. This is";
+ mes "what you must find.";
+ next;
+ mes "[Valkyrie]";
+ mes "A cold snowy path that the goddess walked across";
+ mes "A blue river that the goddess walked across";
+ mes "A narrow path that the goddess passed";
+ mes "Four dwarves that the goddess met...";
+ next;
+ mes "[Valkyrie]";
+ mes "^4d4dffThe beauty of the stars";
+ mes "Wanes in comparison.";
+ mes "We lost our hearts";
+ mes "To that golden hair";
+ mes "And those dazzling eyes.^000000";
+ next;
+ mes "[Valkyrie]";
+ mes "Remember this.";
+ mes "I shall send you";
+ mes "back to where you";
+ mes "belong.";
+ set god_brising,34;
+ next;
+ mes "[Valkyrie]";
+ mes "For Odin's honor...";
+ close2;
+ disablenpc "#doppelganger1";
+ disablenpc "#doppelganger2";
+ disablenpc "#knight1";
+ disablenpc "#knight2";
+ disablenpc "#knight3";
+ disablenpc "#lowen";
+ enablenpc "Soldier#1_brising";
+ disablenpc "Soldier#2_brising";
+ enablenpc "#hermite";
+ enablenpc "Lowen Ellenen#2";
+ disablenpc "Valkyrie#1";
+ warp "geffen.gat",120,101;
+ end;
+}
+
+}
+
+xmas.gat,38,105,0 script #brisindwarf1 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "^3355FFA lot of snow";
+ mes "is heavily piled";
+ mes "here on the ground.^000000";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "^3355FFA lot of snow";
+ mes "is heavily piled";
+ mes "here on the ground.^000000";
+ close;
+}
+ if (god_brising > 39 && god_brising < 50)
+{
+ mes "^3355FFA lot of snow";
+ mes "is heavily piled";
+ mes "here on the ground.^000000";
+ next;
+ mes "^3355FFHowever, this particular mound strikes you as curious for some reason.^000000";
+ next;
+ menu "Sweep the snow away with your hand.",-,"Poke the snow with your finger.",L_Poke,"Cancel.",L_No;
+ mes "^3355FFAs you sweep the snow with the palm of your hand, some of the snow melts, revealing a strange puzzle cube. It's multi-faceted, but you can read that each facet is inscribed with a lyric.";
+ set @point,0;
+ next;
+ menu "Adjust the puzzle.",-,"Quit.",L_Quit;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Okay, um...";
+ mes "I guess I should";
+ mes "choose a lyric...";
+ next;
+ Menu1:
+ menu "Wanes in comparison",case11,"To that beautiful hair",case12,"All of our hearts",case13,"The beauty of the stars",case14,"to those dazzling eyes",case15;
+ case11:
+ mes "[" + strcharinfo(0) + "]";
+ mes "we gave...";
+ goto Menu2;
+
+ case12:
+ mes "[" + strcharinfo(0) + "]";
+ mes "to that beautiful hair";
+ goto Menu2;
+ case13:
+ mes "[" + strcharinfo(0) + "]";
+ mes "all of our hearts in";
+ goto Menu2;
+ case14:
+ mes "[" + strcharinfo(0) + "]";
+ mes "The beauty of the stars";
+ set @point,@point +1;
+ goto Menu2;
+ case15:
+ mes "[" + strcharinfo(0) + "]";
+ mes "to those dazzling eyes";
+ goto Menu2;
+ Menu2:
+ menu "we gave",case21,"Wanes in comparison.",case22,"all of our hearts in",case23,"to the steps in",case24,"to those dazzling eyes",case25;
+ case21:
+ mes "we gave..";
+ goto Menu3;
+ case22:
+ mes "Wanes in comparison.";
+ set @point,@point +1;
+ goto Menu3;
+ case23:
+ mes "all of our hearts in";
+ goto Menu3;
+ case24:
+ mes "to the steps in";
+ goto Menu3;
+ case25:
+ mes "to those dazzling eyes";
+ goto Menu3;
+ Menu3:
+ menu "we gave",case31,"to that beautiful hair",case32,"all of our hearts in",case33,"to the steps in",case34,"We lost our hearts",case35;
+ case31:
+ mes "we gave..";
+ goto Menu4;
+ case32:
+ mes "to that beautiful hair";
+ goto Menu4;
+ case33 :
+ mes "all of our hearts in";
+ goto Menu4;
+ case34:
+ mes "to the steps in";
+ goto Menu4;
+ case35:
+ mes "We lost our hearts";
+ set @point,@point +1;
+ goto Menu4;
+ Menu4:
+ menu "To that golden hair",case41,"to that beautiful hair",case42,"all of our hearts in",case43,"to the steps in",case44,"to those dazzling eyes",case45;
+ case41:
+ mes "To that golden hair";
+ set @point,@point +1;
+ goto Menu5;
+ case42:
+ mes "to that beautiful hair";
+ goto Menu5;
+ case43:
+ mes "all of our hearts in";
+ goto Menu5;
+ case44:
+ mes "to the steps in";
+ goto Menu5;
+ case45:
+ mes "to those dazzling eyes";
+ goto Menu5;
+ Menu5:
+ menu "we gave",case51,"to that beautiful hair",case52,"And those dazzling eyes.",case53,"to the steps in",case54,"to those dazzling eyes",case55;
+ case51:
+ mes "we gave..";
+ goto Check;
+ case52:
+ mes "to that beautiful hair";
+ goto Check;
+ case53:
+ mes "And those dazzling eyes.";
+ set @point,@point +1;
+ goto Check;
+ case54:
+ mes "to the steps in";
+ goto Check;
+ case55:
+ mes "to those dazzling eyes";
+ goto Check;
+ Check:
+ next;
+ if(@point > 4)
+ {
+ donpcevent "#brisindwarf1::OnAlfrikOn";
+ mes "[Old dwarf]";
+ mes "Who are you?!";
+ mes "And why the hell";
+ mes "did you wake me up?";
+ close;
+ }
+
+ L_Quit:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Huh...?";
+ mes "Nothing happened.";
+ mes "Did I do something wrong, or is this just a completely ordinary puzzle cube?";
+ close;
+ L_No:
+ mes "["+ strcharinfo(0) +"]";
+ mes "This...";
+ mes "This better not";
+ mes "be just some regular";
+ mes "puzzle cube that someone";
+ mes "just dropped in the snow!";
+ close;
+
+ L_Poke:
+ mes "^3355FFYou use your finger to poke the pile of snow. However, you hurt your finger a little bit after hitting something really solid.^000000";
+ emotion e_ag,1;
+ set Hp,Hp -20;
+ close;
+}
+ else
+{
+ mes "- There was a pile of snow under a tree. -";
+ close;
+}
+
+OnTouch:
+ if(god_brising > 39) emotion e_gasp,1;
+ end;
+
+OnInit:
+ disablenpc "Alfrik#1";
+ end;
+
+OnAlfrikOn:
+ enablenpc "Alfrik#1";
+ end;
+
+OnAlfrikOff:
+ disablenpc "Alfrik#1";
+ end;
+
+}
+
+xmas.gat,36,103,4 script Alfrik#1 826,{
+
+ if (god_brising == 49)
+{
+ mes "[Alfrik]";
+ mes "I've got nothing more to say! Now get out of here! I don't want to be found!";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else if(god_brising == 48)
+{
+ mes "[Alfrik]";
+ mes "What's up, human?";
+ mes "All of us have awakened.";
+ next;
+ menu "I just wanted to say hello.",-,"What are materials for Brisingamen?",L_Material;
+ mes "[Alfrik]";
+ mes "Your gesture is appreciated, but I'd rather hide than socialize. I don't want to be found by the crows of Odin!";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+ L_Material:
+ mes "[Alfrik]";
+ mes "Materials for Brisingamen? For the human imitation, the materials are pretty easy to gather...";
+ next;
+ mes "[Alfrik]";
+ mes "The power of weapons used by gods, when they battled demons a thousand years ago, and everything detached from Brisingamen. That's basically what you need.";
+ next;
+ mes "[Alfrik]";
+ mes "If you want to create a Brisingamen you will need.....";
+ mes "^4d4dffFreya's Jewel";
+ mes "Silver Ornament";
+ mes "Snow Crystal";
+ mes "Ripple";
+ mes "Drifting Air^000000";
+ next;
+ mes "[Alfrik]";
+ mes "You might need some gems, like Saphire, Peal, Opal, Curse Ruby, and maybe even some Gold to decorate the necklace.";
+ next;
+ mes "[Alfrik]";
+ mes "Although I give freely of my advice, we four dwarves will no longer do smithing work unless it be Freya's command.";
+ next;
+ mes "[Alfrik]";
+ mes "But I can promise you one thing. Since the four of us have awakened, humans will obtain the Brisingamen for sure.";
+ next;
+ mes "[Alfrik]";
+ mes "Now...";
+ mes "Leave me";
+ mes "in peace.";
+ set god_brising,49;
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else if(god_brising == 40)
+{
+ mes "[Alfrik]";
+ mes "^333333*Yawn...*^000000";
+ mes "It's been a long time since I've seen the sun! W-wait! You're not...";
+ next;
+ mes "[Alfrik]";
+ mes "Who sent you?!";
+ mes "Loki? Heimdall?";
+ mes "Or was it Freya?";
+ next;
+ menu "No one, it was an accident!",-,"It was Valkyrie.",L_Valkyrie;
+ mes "[Alfrik]";
+ mes "Don't even think of lying to me, human! There's no way you could have awoken me without knowing the password! Now, speak!";
+ next;
+ menu "Valkyrie told me.",-,"It was a coincidence!",L_Coincidence;
+ mes "[Alfrik]";
+ mes "Valkyrie...?";
+ mes "Odin's warmonger? What could Odin want, I haven't done anything wrong!";
+ next;
+ mes "^3355FFYou explained everything to Alfrik, who seems to worry about being targeted by Odin.^000000";
+ next;
+ mes "[Alfrik]";
+ mes "So that's it.";
+ mes "Seeking out our masterpiece? You humans must desire the power of the gods. Interesting.";
+ next;
+ mes "[Alfrik]";
+ mes "The time for us to revive may actually have come! Alright then, I Alfrik shall cooperate with you humans.";
+ next;
+ mes "[Alfrik]";
+ mes "After all, getting on Odin's good side like this is much better than being tortured by Loki.";
+ next;
+ mes "[Alfrik]";
+ mes "Now, about the masterpiece we made for Freya. There can only be one in the world.";
+ next;
+ mes "[Alfrik]";
+ mes "However, that doesn't mean an imitation, with the same power as that godly item, can't be made. Isn't it tempting, the power of a god?";
+ next;
+ mes "[Alfrik]";
+ mes "First things first. If you want to make the necklace, you must awaken all four of us. Because of Loki's threat, we all hid ourselves in different places.";
+ next;
+ mes "[Alfrik]";
+ mes "Go wake my brothers! Let's see if the Brisingamen can be made once again!";
+ next;
+ mes "[Alfrik]";
+ mes "Now go and wake Dvalin, before the gods and giants can find out!";
+ set god_brising,41;
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+ L_Coincidence:
+ mes "[Alfrik]";
+ mes "Coincidence?";
+ mes "Impossible! How dare you lie! Don't ever come back, or the gods will find me!";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+ L_Valkyrie:
+ mes "[Alfrik]";
+ mes "...did you just speak of Valkyrie!";
+ mes "That Odin's maiden...that war monger..";
+ mes "...I see, Odin must want me.";
+ mes "...but...but I haven't done anything wrong.";
+ mes "I haven't!";
+ next;
+ mes "- You explained everything -";
+ mes "- to Alfrik who seemed to fear Odin. -";
+ next;
+ mes "[Alfrik]";
+ mes "Errr...? Was that it?";
+ mes "Do humans desire the power of God?";
+ mes "..heheheh....";
+ mes "It's interesting.";
+ mes "Besides, you're looking for a thing";
+ mes "that was made by me and my brothers long time ago.";
+ next;
+ mes "[Alfrik]";
+ mes "....giggle...giggle...giggle...";
+ mes "It may be the time for revive!";
+ mes "...giggle giggle...okay. Good.";
+ mes "I, Alfrik shall cooperate with you humans.";
+ mes "After all, it will be way better than being tortured by Loki or Heimdall.";
+ next;
+ mes "[Alfrik]";
+ mes "Giggle...giggle...giggle...oh by the way...";
+ mes "I don't think that Freya will like my idea...?";
+ mes "Giggle...giggle....";
+ mes "Hey, human.";
+ mes "Aren't you curious about the Freya's Necklace?";
+ next;
+ mes "[Alfrik]";
+ mes "Of course only one Brisingamen exists in the world.";
+ mes "However, you can create a similar thing";
+ mes "...which has the same power as the godly item.";
+ mes "The power of god...isn't it tempting?";
+ next;
+ mes "[Alfrik]";
+ mes "If you want to make the necklace,";
+ mes "you must wake up all of us.";
+ mes "....I hate Loki and Odin...";
+ mes "My brothers were put into sleep";
+ mes "in seperate places.";
+ next;
+ mes "[Alfrik]";
+ mes "Freaking Heimdall...";
+ mes "We could not win over the smart and fast guy.";
+ mes "Go wake my brothers!";
+ mes "Let's see if we can bring up the Brisingamen";
+ mes "once again!";
+ next;
+ mes "[Alfrik]";
+ mes "Now, before gods and giants get to know about it,";
+ mes "go wake Dvalin!";
+ set god_brising,41;
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else if(god_brising == 41)
+{
+ mes "[Alfrik]";
+ mes "Why are you still here?";
+ mes "I told you go wake Dvalin!";
+ next;
+ menu "Where is he?",-,"Tell me more about Brisingamen.",L_More;
+ mes "[Alfrik]";
+ mes "Ah. Right.";
+ mes "I forgot to tell you. Poor Dvalin. Now, where was it?";
+ next;
+ mes "[Alfrik]";
+ mes "We were afraid that Odin and Heimdall would punish us because, well, in their eyes we disgraced the goddess.";
+ next;
+ mes "[Alfrik]";
+ mes "Oh course, they never would have been angered if it weren't for Loki's trickery.";
+ next;
+ mes "[Alfrik]";
+ mes "We loved Freya so much that we decided to hide ourselves beneath the path that she walked. To be as close to any trace of her as we could.";
+ next;
+ mes "[Alfrik]";
+ mes "Poor Dvalin is sleeping under the path in the East. Once there, you'll feel the scent the goddess.";
+ next;
+ mes "[Alfrik]";
+ mes "I can't remember where the others are sleeping, but you cannot forget these words...";
+ next;
+ mes "[Alfrik]";
+ mes "^4d4dffHer lovely scent";
+ mes "Still lingers in the wind.";
+ mes "We surrendered our hearts";
+ mes "To those tender teardrops";
+ mes "Those seductive red lips.^000000";
+ set god_brising,42;
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+ L_More:
+ mes "[Alfrik]";
+ mes "Brisingamen is our masterpiece, a necklace we forged for Freya. Even if we tried making it again, I doubt it would be as good.";
+ next;
+ mes "[Alfrik]";
+ mes "It looked perfect on Freya. Very difficult to create jewelry that actually enhances the attractiveness of the goddess of beauty.";
+ next;
+ mes "[Alfrik]";
+ mes "Perhaps our greatest reward was that beautiful smile of satisfaction she gave us when that we gave her that necklace. We loved her so.";
+ next;
+ mes "[Alfrik]";
+ mes "Is it that wrong for dwarves to love a goddess? Perhaps we were punished because the gods, even Odin, loved her as well.";
+ next;
+ mes "[Alfrik]";
+ mes "In any case, we've never seen the true Brisingamen again. But something very similar to it can be created...";
+ next;
+ mes "[Alfrik]";
+ mes "You'll need materials that have been graced by the goddess' presense. Traces of the goddess in the earth, water and the wind.";
+ next;
+ mes "[Alfrik]";
+ mes "And if the Brisingamen is recreated, the power of a god will be in the hands of a human. That human could be you!";
+ next;
+ mes "[Alfrik]";
+ mes "Poor Dvalin is sleeping under the path in the East. Once there, you'll feel the scent the goddess.";
+ next;
+ mes "[Alfrik]";
+ mes "I can't remember where the others are sleeping, but you cannot forget these words...";
+ next;
+ mes "[Alfrik]";
+ mes "^4d4dffHer lovely scent";
+ mes "Still lingers in the wind.";
+ mes "We surrendered our hearts";
+ mes "To those tender teardrops";
+ mes "Those seductive red lips.^000000";
+ set god_brising,42;
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else if(god_brising == 42)
+{
+ mes "[Alfrik]";
+ mes "Will you please!";
+ mes "Get lost before Loki and Heimdall find out I've awakened! Now hurry, find Dvalin, and wake him up!";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else if(god_brising > 42 && god_brising < 48)
+{
+ mes "[Alfrik]";
+ mes "Oh, finally all of us have awakened! Now, the power of the goddess can be retrieved from the earth, water and the wind!";
+ next;
+ mes "[Alfrik]";
+ mes "Hahahahaha!";
+ mes "This should be";
+ mes "interesting!";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+ else
+{
+ mes "[Alfrik]";
+ mes "Mmm...?";
+ mes "I've got no business with you.";
+ close2;
+ donpcevent "#brisindwarf1::OnAlfrikOff";
+ end;
+}
+
+}
+
+prt_fild02.gat,185,269,0 script #brisindwarf2 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "^3355FFIt's just an";
+ mes "ordinary rock.^000000";
+ close;
+}
+
+ if($God3 > 99)
+{
+ mes "^3355FFIt's just an";
+ mes "ordinary rock.^000000";
+ close;
+}
+
+ if(god_brising > 41)
+{
+ mes "^3355FFIt's just an ordinary rock underneath the shadow of a tree. But on closer inspection, you notice that the moss on top of the rock looks perfectly flat.^000000";
+ next;
+ menu "Step on it.",-,"Sweep the surface.",L_Sweep,"Scratch the surface.",L_Scratch,"Kick it.",L_Kick;
+ mes "^3355FFYou gingerly place your foot on the top of the stone. The entire rock suddenly swings downward into the ground, and you fall downward...^000000";
+ close2;
+ warp "prt_fild02.gat",165,224;
+ end;
+ L_Sweep:
+ mes "^3355FFAs you sweep away the moss with your hand, you scratch your palm from the sharp edges of the rock.^000000";
+ emotion e_gasp,1;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Damn...!";
+ mes "I'm bleeding!";
+ mes "But why didn't anything else happen?!";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "This rock had";
+ mes "better be one of";
+ mes "those secret rocks!";
+ mes "Or else...!";
+ close;
+ L_Scratch:
+ mes "^3355FFYou scratch away at the moss, and feel that the surface of the rock has even recesses.";
+ next;
+ mes "^3355FFAfter peeling off the moss, a series of tiles, etched with faint words, are revealed on top of the rock.^000000";
+ next;
+ mes "^3355FFThese tiles could be moved around, like in a puzzle.^000000";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Another puzzle?";
+ mes "This was just like when I had to give Alfrik's password. Okay, let me see...";
+ set @point,0;
+ next;
+ Menu1:
+ menu "to the tear drops dripping on the way",case11,"Her lovely scent",case12,"we gave",case13,"to the seducing red lips",case14,"our hearts in",case15;
+ case11:
+ mes "[" + strcharinfo(0) + "]";
+ mes "to the tear drops dripping on the way";
+ goto Menu2;
+ case12:
+ mes "[" + strcharinfo(0) + "]";
+ mes "Her lovely scent";
+ set @point,@point +1;
+ goto Menu2;
+ case13:
+ mes "[" + strcharinfo(0) + "]";
+ mes "we gave";
+ goto Menu2;
+ case14:
+ mes "[" + strcharinfo(0) + "]";
+ mes "to the seducing red lips";
+ goto Menu2;
+ case15:
+ mes "[" + strcharinfo(0) + "]";
+ mes "our hearts in";
+ goto Menu2;
+ Menu2:
+ menu "Still lingers in the wind.",case21,"to the scent drifted in the wind",case22,"we gave",case23,"to the seducing red lips",case24,"our hearts in",case25;
+ case21:
+ mes "Still lingers in the wind.";
+ set @point,@point +1;
+ goto Menu3;
+ case22:
+ mes "to the scent drifted in the wind";
+ goto Menu3;
+ case23:
+ mes "we gave";
+ goto Menu3;
+ case24:
+ mes "to the seducing red lips";
+ goto Menu3;
+ case25:
+ mes "our hearts in";
+ goto Menu3;
+ Menu3:
+ menu "to the tear drops dripping on the way",case31,"to the scent drifted in the wind",case32,"we gave",case33,"We surrendered our hearts",case34,"our hearts in",case35;
+ case31:
+ mes "to the tear drops dripping on the way";
+ goto Menu4;
+ case32:
+ mes "to the scent drifted in the wind";
+ goto Menu4;
+ case33:
+ mes "we gave";
+ goto Menu4;
+ case34:
+ mes "We surrendered our hearts";
+ set @point,@point +1;
+ goto Menu4;
+ case35:
+ mes "our hearts in";
+ goto Menu4;
+ Menu4:
+ menu "to the tear drops dripping on the way",case41,"to the scent drifted in the wind",case42,"To those tender teardrops",case43,"to the seducing red lips",case44,"our hearts in",case45;
+ case41:
+ mes "to the tear drops dripping on the way";
+ goto Menu5;
+ case42:
+ mes "to the scent drifted in the wind";
+ goto Menu5;
+ case43:
+ mes "To those tender teardrops";
+ set @point,@point +1;
+ goto Menu5;
+ case44:
+ mes "to the seducing red lips";
+ goto Menu5;
+ case45:
+ mes "our hearts in";
+ goto Menu5;
+ Menu5:
+ menu "to the tear drops dripping on the way",case51,"to the scent drifted in the wind",case52,"we gave",case53,"to the seducing red lips",case54,"Those seductive red lips",case55;
+ case51:
+ mes "to the tear drops dripping on the way";
+ goto Check;
+ case52:
+ mes "to the scent drifted in the wind";
+ goto Check;
+ case53:
+ mes "we gave";
+ goto Check;
+ case54:
+ mes "to the seducing red lips";
+ goto Check;
+ case55:
+ mes "Those seductive red lips";
+ set @point,@point +1;
+ goto Check;
+ Check:
+ next;
+ if(@point > 4)
+ {
+ donpcevent "#brisindwarf2::OnDvalinOn";
+ mes "[Dvalin]";
+ mes "...?";
+ mes "Alfrik?";
+ mes "Is that you?";
+ close;
+ }
+ L_Kick:
+ mes "[" + name + "]";
+ mes "^333333*Cough cough!*";
+ mes "Aaaack!";
+ mes "It's so dusty!";
+ close;
+}
+ else
+{
+ mes "^3355FFJust a normal";
+ mes "rock, covered in moss.^000000";
+ close;
+}
+
+OnTouch:
+ if(god_brising > 41) emotion e_gasp,1;
+ end;
+
+OnInit:
+ disablenpc "Dvalin#1";
+ end;
+
+OnDvalinOn:
+ enablenpc "Dvalin#1";
+ end;
+
+OnDvalinOff:
+ disablenpc "Dvalin#1";
+ end;
+}
+
+prt_fild02.gat,185,270,3 script Dvalin#1 826,{
+
+ if (god_brising > 43)
+{
+ mes "[Dvalin]";
+ mes "A human?";
+ mes "You woke me up?";
+ next;
+ mes "[Dvalin]";
+ mes "Hmm...";
+ mes "And you'd be acting pretty pushy right about now if you were acting on behalf of a god. What could you want...?";
+ next;
+ mes "[Dvalin]";
+ mes "It makes sense that you want a replica of Brisingamen for its power. But remember, we originally made Brisingamen as a necklace fit for a goddess.";
+ next;
+ mes "[Dvalin]";
+ mes "Some might say that we seduced Freya with the necklace, but we really loved her with all of our hearts.";
+ close2;
+ donpcevent "#brisindwarf2::OnDvalinOff";
+ end;
+}
+ else if(god_brising == 42)
+{
+ mes "[Dvalin]";
+ mes "Wah, it's not Alfrik?";
+ mes "Who are you to wake Dvalin?";
+ mes "Tell me right now, or I am gonna kick your ass!";
+ next;
+ menu "Help!",-,"Alfrik sent me to wake you up!",L_Alfrik;
+ mes "[Dvalin]";
+ mes "I don't know what the hell you're doing here,";
+ mes "but leave!";
+ close2;
+ donpcevent "#brisindwarf2::OnDvalinOff";
+ end;
+ L_Alfrik:
+ mes "[Dvalin]";
+ mes "Did you just say Alfrik sent you? How do you know my brother?!";
+ next;
+ mes "[Dvalin]";
+ mes "Brisingamen?!";
+ mes "Then, that means we could meet Freya again?!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Umm...";
+ mes "I'm afraid not.";
+ mes "Or, at least, that's";
+ mes "not why I'm here.";
+ next;
+ mes "[Dvalin]";
+ mes "Okay. I understand. Sorry, I was just hoping you were a herald of Freya.";
+ next;
+ mes "[Dvalin]";
+ mes "So, an imitation of Brisingamen. Even if it's not the original, I'm sure it can possess power comparable to the original. Yes...";
+ next;
+ mes "[Dvalin]";
+ mes "It's no use trying to predict the future, but I can't help but wonder what would mankind do with the power of the gods?";
+ next;
+ mes "[Dvalin]";
+ mes "If my brother Alfrik already approved of you, then I'll help you out. I'll tell you how to wake my brother Berling.";
+ next;
+ mes "[Dvalin]";
+ mes "We hid ourselves near traces of Freya. The path where I am staying is one that my goddess has walked through.";
+ next;
+ mes "[Dvalin]";
+ mes "The air that quietly drifts here holds her fragrant scent. You can use this wind to borrow her power.";
+ next;
+ mes "[Dvalin]";
+ mes "Aside from Freya, I have no special love for the gods or giants. But I am intrigued by you humans. Your race is one of both love and hatred, life and destruction.";
+ next;
+ mes "[Dvalin]";
+ mes "Go now and seek Berling. He is sleeping near a river connect to Mount Mjolnir. Travel West to find the river were Freya's Teardrops have fallen.";
+ next;
+ mes "[Dvalin]";
+ mes "If the phantom of water gives you a question, answer it. The answer is the punishment that Odin gave to our goddess.";
+ next;
+ mes "[Dvalin]";
+ mes "Until thousands of Valkyries filled up Valhala, they had to repeatedly live, die, then be reborn the next day only to die again.";
+ next;
+ mes "[Dvalin]";
+ mes "Think about who they were. That's all I can tell you.";
+ next;
+ mes "[Dvalin]";
+ mes "Somehow, I know";
+ mes "you are the one who";
+ mes "can answer the question.";
+ mes "Hahahaha!";
+ set god_brising,43;
+ close2;
+ donpcevent "#brisindwarf2::OnDvalinOff";
+ end;
+}
+ else if(god_brising == 43)
+{
+ mes "[Dvalin]";
+ mes "Why do you keep calling me? I did everything I can do for you. I even gave you the key of the question.";
+ next;
+ mes "[Dvalin]";
+ mes "From now on,";
+ mes "it's all up to you.";
+ mes "Now, go wake Berling...";
+ close2;
+ donpcevent "#brisindwarf2::OnDvalinOff";
+ end;
+}
+
+}
+
+mjolnir_09.gat,85,129,0 script #brisindwarf3 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
+ close;
+}
+ if (god_brising > 42 && god_brising < 50)
+{
+ specialeffect 109;
+ mes "[Echoing Voice]";
+ mes "Alfrik: confirmed.";
+ mes "Dvalin: confirmed.";
+ next;
+ mes "[Echoing Voice]";
+ mes "Please answer me.";
+ mes "Odin punished beautiful Freya, and made her curse humans with her powers.";
+ next;
+ mes "[Echoing Voice]";
+ mes "Freya cursed many human beings to repeatedly die and be reborn in an eternal battle.";
+ mes "How many are they?";
+ next;
+ switch( select( "20!","How should I know?!","40!","42!" ))
+ {
+ case 1:
+ specialeffect 109;
+ mes "[Echoing Voice]";
+ mes "Failed.";
+ mes "Failed...";
+ close;
+ break;
+ case 2:
+ specialeffect 109;
+ mes "[Echoing Voice]";
+ mes "Failed.";
+ mes "Failed...";
+ close;
+ break;
+ case 3:
+ specialeffect 109;
+ mes "[Echoing Voice]";
+ mes "Failed.";
+ mes "Failed...";
+ close;
+ break;
+ case 4:
+ specialeffect 109;
+ mes "[Echoing Voice]";
+ mes "...Confirmed.";
+ mes "Shutting down barrier. Initiating summoning.";
+ next;
+ enablenpc "Berling#1";
+ mes "[Berling]";
+ mes "^333333*Gasp--!*^000000";
+ mes "Thought I was";
+ mes "gonna drown to death!";
+ mes "Who woke me up?";
+ close;
+ break;
+ }
+}
+ else
+{
+ mes "^3355FFThe sight of this bubbling stream refreshes you just by looking at it.^000000";
+ close;
+}
+
+OnTouch:
+ if(god_brising > 42) emotion e_gasp,1;
+ end;
+
+OnInit:
+ disablenpc "Berling#1";
+ end;
+
+OnBerlingOn:
+ enablenpc "Berling#1";
+ end;
+
+OnBerlingOff:
+ disablenpc "Berling#1";
+ end;
+}
+
+mjolnir_09.gat,87,129,3 script Berling#1 826,{
+
+ if(god_brising > 44)
+{
+ mes "[Berling]";
+ mes "You're the one that's awakened us? Hahaha, perhaps that's a sign we may see Freya again! Hahahaha!";
+ next;
+ mes "[Berling]";
+ mes "We are indebted to you for reviving us. Okay, I know what you want, and will help you obtain the power of the gods.";
+ close2;
+ donpcevent "#brisindwarf3::OnBerlingOff";
+ end;
+}
+ else if(god_brising == 43)
+{
+ mes "[Berling]";
+ mes "What the...?";
+ mes "It's a human?!";
+ mes "What do you want?";
+ mes "Wh-who are you?";
+ next;
+ menu "Dvalin wants you to wake up!",-,"Tell me who you are first!",L_Who;
+ mes "[Berling]";
+ mes "Dvalin?! You mean my brother! But he can only be revived if Alfrik is revived. What happened?";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Umm...";
+ mes "Let me explain...";
+ next;
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "["+ strcharinfo(0) +"]";
+ mes "...So if I guess I need to wake up all four of you dwarves so that Brisingamen, which holds Freya's power, can be made again.";
+ next;
+ mes "[Berling]";
+ mes "Oh! Say that name once again! Freya, the goddess who took my body and soul! Did you just say you want to make her necklace?";
+ next;
+ mes "[Berling]";
+ mes "Hahahaha, stop joking around. The Brisingamen is a one of a kind masterpiece!";
+ next;
+ menu "I don't mean the original one, but...",-;
+ mes "[Berling]";
+ mes "Ah, now I see! You want a replica that has roughly the same power. A Brisingamen used by humans!";
+ next;
+ mes "[Berling]";
+ mes "I, on the other hand, do not desire power. If would be happy to own but a strand of her hair.";
+ next;
+ mes "[Berling]";
+ mes "Oh Freya...";
+ mes "The more of her beauty exists in this world, the happier I'll be. I'm more than willing to help you recreate this memento of Freya.";
+ next;
+ mes "[Berling]";
+ mes "Now, please go and find the last one of my brothers! Poor Grer, perhaps he is still digging silver in that mine for her...";
+ next;
+ mes "[Berling]";
+ mes "Go and find Grer. I will give you Freya's golden teardrop, but he might have revived on his own...";
+ next;
+ mes "[Berling]";
+ mes "If he doesn't trust you, sing this song. You must remember each and every word...";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffNo jewel in the world can compare.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffOur masterpiece made from love.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffShe wanted the dazzling necklace.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffWe wanted the goddess of beauty.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffOur happiest times were with her.^000000";
+ next;
+ mes "[Berling]";
+ mes "Memorize all five lines of this song exactly. Now take this golden teardrop and please seek out Grer.";
+ specialeffect2 84;
+ set god_brising,44;
+ close2;
+ donpcevent "#brisindwarf3::OnBerlingOff";
+ end;
+ L_Who:
+ mes "[Berling]";
+ mes "Where the hell did you come from?";
+ mes "I am Berling the greatest dwarf in ages!";
+ mes "I regret to tell you this, but I do not have a name";
+ mes "to introduce to such an ill-bred lad like you!";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Heh, you just said you're Berling...";
+ next;
+ mes "[Berling]";
+ mes "Baaaaahhh!";
+ mes "Quiet you!";
+ mes "Mind your own business!";
+ close2;
+ donpcevent "#brisindwarf3::OnBerlingOff";
+ end;
+}
+ else if(god_brising == 44)
+{
+ mes "[Berling]";
+ mes "Did you already forget the lyrics? Let me tell them to you again, so don't forget this time.";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffNo jewel in the world can compare.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffOur masterpiece made from love.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffShe wanted the dazzling necklace.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffWe wanted the goddess of beauty.^000000";
+ next;
+ mes "[Berling]";
+ mes "^4d4dffOur happiest times were with her.^000000";
+ close2;
+ donpcevent "#brisindwarf3::OnBerlingOff";
+ end;
+}
+
+}
+
+mjo_dun02.gat,126,36,0 script #brisindwarf4 111,3,3,{
+
+ if($God2 < 50)
+{
+ mes "[" + strcharinfo(0) + "]";
+ mes "Bah, no way out.";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "[" + strcharinfo(0) + "]";
+ mes "Bah, no way out.";
+ close;
+}
+ if(god_brising > 45 && god_brising < 50)
+{
+ mes "[Grer]";
+ mes "What!";
+ enablenpc "Grer#1";
+ close;
+}
+ else if(god_brising == 45)
+{
+ mes "- A charcoal was dropped from the sky' -";
+ mes "- with a voice, 'Show me!'. -";
+ mes "- Let's scribble...-";
+ set @point,0;
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Let's see.";
+ mes "Um, that song.";
+ mes "What was the first line...?";
+ next;
+ input @dwarfsong1$;
+ if(@dwarfsong1$ == "No jewel in the world can compare.") set @point,@point +1;
+ mes "[" + strcharinfo(0) + "]";
+ mes " " + @dwarfsong1$ + "";
+ mes "Then...ummm..";
+ mes "The second line?";
+ next;
+ input @dwarfsong2$;
+ if(@dwarfsong2$ == "Our masterpiece made from love.") set @point,@point +1;
+ mes "[" + strcharinfo(0) + "]";
+ mes " " + @dwarfsong2$ + "";
+ mes "Now, what was";
+ mes "the third line...?";
+ next;
+ input @dwarfsong3$;
+ if(@dwarfsong3$ == "She wanted the dazzling necklace.") set @point,@point +1;
+ mes "[" + strcharinfo(0) + "]";
+ mes " " + @dwarfsong3$ + "";
+ mes "Now, the fourth";
+ mes "line after that...";
+ next;
+ input @dwarfsong4$;
+ if(@dwarfsong4$ == "We wanted the goddess of beauty.") set @point,@point +1;
+ mes "[" + strcharinfo(0) + "]";
+ mes " " + @dwarfsong4$ + "";
+ mes "Alright, now";
+ mes "for the last line...";
+ next;
+ input @dwarfsong5$;
+ if(@dwarfsong5$ == "Our happiest times were with her.") set @point,@point +1;
+ mes "[" + strcharinfo(0) + "]";
+ mes " " + @dwarfsong5$ + "";
+ mes "Alright, let's give it a try.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "" + @dwarfsong1$ + "";
+ mes "" + @dwarfsong2$ + "";
+ mes "" + @dwarfsong3$ + "";
+ mes "" + @dwarfsong4$ + "";
+ mes "" + @dwarfsong5$ + "";
+ next;
+ if(@point > 4)
+ {
+ enablenpc "Grer#1";
+ mes "[Grer]";
+ mes "Wha--?";
+ mes "Berling";
+ mes "did send you!";
+ set god_brising,46;
+ stopnpctimer;
+ close;
+ }
+ else
+ {
+ mes "[Grer]";
+ mes "Bah!";
+ mes "I knew it!";
+ mes "I can't trust you!";
+ close2;
+ warp "mjo_dun02",118,56;
+ end;
+ }
+}
+ else
+{
+ mes "^3355FFYou found a hole filled with some clod and a lump of coal.^000000";
+ close;
+}
+
+OnTouch:
+ if($God2 < 50)
+{
+ mes "[" + strcharinfo(0) + "]";
+ mes "Beh, no way out.";
+ close;
+}
+ if($God3 > 99)
+{
+ mes "[" + strcharinfo(0) + "]";
+ mes "Beh, no way out.";
+ close;
+}
+ if(god_brising == 44)
+{
+ emotion e_gasp,1;
+ mes "[Male Voice]";
+ mes "Don't come any closer! How the hell do I feel Freya's presense on you? Tell me who you are!";
+ next;
+ menu "I am sent by Berling.",-,"Wah, you freaked me out!",L_Freak;
+ mes "[Male Voice]";
+ mes "Lies! Lies!";
+ mes "Prove it!";
+ mes "Prove yourself!";
+ set god_brising,45;
+ initnpctimer;
+ close;
+ L_Freak:
+ mes "[Male Voice]";
+ mes "Get out of here!";
+ close;
+}
+ else if(god_brising == 45)
+{
+ mes "[Male Voice]";
+ mes "Prove it!";
+ mes "Otherwise, leave me alone and let me mine silver. Silver...! Heh heh heh...";
+ stopnpctimer;
+ startnpctimer;
+ close;
+}
+ else
+{
+ warp "mjo_dun02.gat",118,56;
+ end;
+}
+
+OnTimer1000:
+ mapannounce "mjo_dun02.gat","Grer: Hurry and show that I can trust you!",0,0x70DBDB;
+ end;
+
+OnTimer240000:
+ mapannounce "mjo_dun02.gat","Grer: Grrr, I won't wait much longer!",0,0x70DBDB;
+ end;
+
+OnTimer298000:
+ mapannounce "mjo_dun02.gat","Grer: Farewell, human!",0,0x70DBDB;
+ end;
+
+OnTimer300000:
+ warp "mjo_dun02.gat",118,56;
+ disablenpc "Grer#1";
+ end;
+
+OnTimer301000:
+ stopnpctimer;
+ end;
+
+OnInit:
+ disablenpc "Grer#1";
+ end;
+
+OnGrerOn:
+ enablenpc "Grer#1";
+ end;
+
+OnGrerOff:
+ disablenpc "Grer#1";
+ end;
+}
+
+mjo_dun02.gat,126,34,1 script Grer#1 826,{
+
+ if(god_brising > 47)
+{
+ mes "[Grer]";
+ mes "As we promised,";
+ mes "Brisingamen will appear in front of human's eyes. But until then, I shall make jewelry of silver. Mwahahaha~";
+ close2;
+ donpcevent "#brisindwarf4::OnGrerOff";
+ end;
+}
+ else if(god_brising == 46)
+{
+ mes "[Grer]";
+ mes "My name is Grer.";
+ mes "I should have been the last one to be awakened. Now I see that I haven't mined as much silver as I may need.";
+ next;
+ mes "[Grer]";
+ mes "You might think gold would better suit a goddess, but no. Silver is what makes her golden hair more beautiful.";
+ next;
+ mes "[Grer]";
+ mes "Human, you must planned something fun. Hmm? You didn't plan anything at all? No matter.";
+ next;
+ mes "[Grer]";
+ mes "Now that we're revived, there's a good chance that we may see her again. I don't really mind anything else.";
+ next;
+ mes "[Grer]";
+ mes "I want her spirit and scent to fill this world. I don't want Odin or Heimdall to know our plan.";
+ next;
+ mes "[Grer]";
+ mes "Now, this doesn't mean that I prefer humans over gods or giants, but if it's for Freya, I'll do anything.";
+ next;
+ mes "[Grer]";
+ mes "Anyway, now my brothers have been revived. For that, I give you my thanks. Someday, you will have the power to challenge the gods.";
+ next;
+ mes "[Grer]";
+ mes "Now, I need to go back to my business. You'll need a silver ornament for the necklace, so I'll continue to mine silver.";
+ next;
+ mes "[Grer]";
+ mes "I shall be working hard to make the most beautiful ornament in the world.";
+ next;
+ mes "[Grer]";
+ mes "Okay, you";
+ mes "may go back now!";
+ mes "Farewell.";
+ set god_brising,47;
+ close2;
+ donpcevent "#brisindwarf4::OnGrerOff";
+ end;
+}
+ else if(god_brising == 47)
+{
+ mes "[Grer]";
+ mes "Heh heh...";
+ mes "Why are you still";
+ mes "here? Your job is done.";
+ mes "Now, go back to where";
+ mes "you came from!";
+ close2;
+ donpcevent "#brisindwarf4::OnGrerOff";
+ end;
+}
+ else
+{
+ mes "[Grer]";
+ mes "Who the";
+ mes "hell are you?!";
+ close2;
+ donpcevent "#brisindwarf4::OnGrerOff";
+ end;
+}
+
} \ No newline at end of file
diff --git a/npc/quests/seals/god_global.txt b/npc/quests/seals/god_global.txt
index 863b99ab4..1a367e13d 100644
--- a/npc/quests/seals/god_global.txt
+++ b/npc/quests/seals/god_global.txt
@@ -1,123 +1,123 @@
-//===== eAthena Script =======================================
-//= Variable Management NPC for the god item quest
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Use this NPC if the seals quest variables get messed up.
-//===== Additional Comments: =================================
-// 1.0 First version. [MasterOfMuppets]
-//============================================================
-
-sec_in02.gat,15,170,0 script Seals Quest Vars 817,{
-
- if(getgmlevel() > 98)
- {
- mes "[Variable Management]";
- mes "Welcome to the God Item Quest";
- mes "Global Variable Management";
- mes "function.";
- next;
- while(1)
- {
- menu "Check current variable values",s_Values,"Change variable values",s_Change,"Cancel",-;
- close;
-
-s_Change:
- mes "[Variable Management]";
- mes "Which variable would you";
- mes "like to change?";
- next;
- menu "$God1",-,"$God2",s_2,"$God3",s_3,"$God4",s_4;
-
- mes "[Variable Management]";
- mes "^0000FF$God1^000000 is currently ^FF0000" + $God1 + "^000000.";
- mes "What would you like to";
- mes "change it to? (Enter";
- mes "101 to cancel)";
- next;
- input @temp;
- if(@temp == 101)goto s_Canceled;
- if(@temp < 0 || @temp > 100)goto s_BadValue;
- set $God1,@temp;
- mes "[Variable Management]";
- mes "^0000FF$God1^000000 was changed to ^FF0000" + $God1 + "^000000.";
- close;
-
-s_2:
- mes "[Variable Management]";
- mes "^0000FF$God2^000000 is currently ^FF0000" + $God2 + "^000000.";
- mes "What would you like to";
- mes "change it to? (Enter";
- mes "101 to cancel)";
- next;
- input @temp;
- if(@temp == 101)goto s_Canceled;
- if(@temp < 0 || @temp > 100)goto s_BadValue;
- set $God2,@temp;
- mes "[Variable Management]";
- mes "^0000FF$God2^000000 was changed to ^FF0000" + $God2 + "^000000.";
- close;
-
-s_3:
- mes "[Variable Management]";
- mes "^0000FF$God3^000000 is currently ^FF0000" + $God3 + "^000000.";
- mes "What would you like to";
- mes "change it to? (Enter";
- mes "101 to cancel)";
- next;
- input @temp;
- if(@temp == 101)goto s_Canceled;
- if(@temp < 0 || @temp > 100)goto s_BadValue;
- set $God3,@temp;
- mes "[Variable Management]";
- mes "^0000FF$God3^000000 was changed to ^FF0000" + $God3 + "^000000.";
- close;
-
-s_4:
- mes "[Variable Management]";
- mes "^0000FF$God4^000000 is currently ^FF0000" + $God4 + "^000000.";
- mes "What would you like to";
- mes "change it to? (Enter";
- mes "101 to cancel)";
- next;
- input @temp;
- if(@temp == 101)goto s_Canceled;
- if(@temp < 0 || @temp > 100)goto s_BadValue;
- set $God4,@temp;
- mes "[Variable Management]";
- mes "^0000FF$God4^000000 was changed to ^FF0000" + $God4 + "^000000.";
- close;
-
-s_Canceled:
- close;
-
-s_BadValue:
- mes "[Variable Management]";
- mes "Please enter a value";
- mes "between 0-100.";
- close;
-
-s_Values:
- mes "[Variable Management]";
- mes "Current variable values are:";
- mes "^0000FF$God1^000000 = ^FF0000" + $God1 + "^000000.";
- mes "^0000FF$God2^000000 = ^FF0000" + $God2 + "^000000.";
- mes "^0000FF$God3^000000 = ^FF0000" + $God3 + "^000000.";
- mes "^0000FF$God4^000000 = ^FF0000" + $God4 + "^000000.";
- next;
- }
- }
- else
- {
- mes "[Variable Management]";
- mes "Sorry. You don't have";
- mes "authorization to use this";
- mes "npc.";
- close;
- }
-
-}
+//===== eAthena Script =======================================
+//= Variable Management NPC for the god item quest
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Use this NPC if the seals quest variables get messed up.
+//===== Additional Comments: =================================
+// 1.0 First version. [MasterOfMuppets]
+//============================================================
+
+sec_in02.gat,15,170,0 script Seals Quest Vars 817,{
+
+ if(getgmlevel() > 98)
+ {
+ mes "[Variable Management]";
+ mes "Welcome to the God Item Quest";
+ mes "Global Variable Management";
+ mes "function.";
+ next;
+ while(1)
+ {
+ menu "Check current variable values",s_Values,"Change variable values",s_Change,"Cancel",-;
+ close;
+
+s_Change:
+ mes "[Variable Management]";
+ mes "Which variable would you";
+ mes "like to change?";
+ next;
+ menu "$God1",-,"$God2",s_2,"$God3",s_3,"$God4",s_4;
+
+ mes "[Variable Management]";
+ mes "^0000FF$God1^000000 is currently ^FF0000" + $God1 + "^000000.";
+ mes "What would you like to";
+ mes "change it to? (Enter";
+ mes "101 to cancel)";
+ next;
+ input @temp;
+ if(@temp == 101)goto s_Canceled;
+ if(@temp < 0 || @temp > 100)goto s_BadValue;
+ set $God1,@temp;
+ mes "[Variable Management]";
+ mes "^0000FF$God1^000000 was changed to ^FF0000" + $God1 + "^000000.";
+ close;
+
+s_2:
+ mes "[Variable Management]";
+ mes "^0000FF$God2^000000 is currently ^FF0000" + $God2 + "^000000.";
+ mes "What would you like to";
+ mes "change it to? (Enter";
+ mes "101 to cancel)";
+ next;
+ input @temp;
+ if(@temp == 101)goto s_Canceled;
+ if(@temp < 0 || @temp > 100)goto s_BadValue;
+ set $God2,@temp;
+ mes "[Variable Management]";
+ mes "^0000FF$God2^000000 was changed to ^FF0000" + $God2 + "^000000.";
+ close;
+
+s_3:
+ mes "[Variable Management]";
+ mes "^0000FF$God3^000000 is currently ^FF0000" + $God3 + "^000000.";
+ mes "What would you like to";
+ mes "change it to? (Enter";
+ mes "101 to cancel)";
+ next;
+ input @temp;
+ if(@temp == 101)goto s_Canceled;
+ if(@temp < 0 || @temp > 100)goto s_BadValue;
+ set $God3,@temp;
+ mes "[Variable Management]";
+ mes "^0000FF$God3^000000 was changed to ^FF0000" + $God3 + "^000000.";
+ close;
+
+s_4:
+ mes "[Variable Management]";
+ mes "^0000FF$God4^000000 is currently ^FF0000" + $God4 + "^000000.";
+ mes "What would you like to";
+ mes "change it to? (Enter";
+ mes "101 to cancel)";
+ next;
+ input @temp;
+ if(@temp == 101)goto s_Canceled;
+ if(@temp < 0 || @temp > 100)goto s_BadValue;
+ set $God4,@temp;
+ mes "[Variable Management]";
+ mes "^0000FF$God4^000000 was changed to ^FF0000" + $God4 + "^000000.";
+ close;
+
+s_Canceled:
+ close;
+
+s_BadValue:
+ mes "[Variable Management]";
+ mes "Please enter a value";
+ mes "between 0-100.";
+ close;
+
+s_Values:
+ mes "[Variable Management]";
+ mes "Current variable values are:";
+ mes "^0000FF$God1^000000 = ^FF0000" + $God1 + "^000000.";
+ mes "^0000FF$God2^000000 = ^FF0000" + $God2 + "^000000.";
+ mes "^0000FF$God3^000000 = ^FF0000" + $God3 + "^000000.";
+ mes "^0000FF$God4^000000 = ^FF0000" + $God4 + "^000000.";
+ next;
+ }
+ }
+ else
+ {
+ mes "[Variable Management]";
+ mes "Sorry. You don't have";
+ mes "authorization to use this";
+ mes "npc.";
+ close;
+ }
+
+}
diff --git a/npc/quests/seals/god_weapon_creation.txt b/npc/quests/seals/god_weapon_creation.txt
index aabf1a86d..f062051f7 100644
--- a/npc/quests/seals/god_weapon_creation.txt
+++ b/npc/quests/seals/god_weapon_creation.txt
@@ -1,1595 +1,1595 @@
-//===== eAthena Script =======================================
-//= God items creation NPCs
-//===== By: ==================================================
-//= SinSloth
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
-//============================================================
-
-gld_dun01.gat,28,85,0 script Grunburti 826,{
-
- mes "[Dwarf Grunburti]";
- mes "Hmmhah! What brought you here, human!";
- mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
- next;
- switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
- {
-
- case 1:
- mes "[Dwarf Grunburti]";
- mes "Ah, what an annoying human! What do you want to know about us, huh?";
- mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
- next;
- mes "[Dwarf Grunburti]";
- mes "All the knowledge and skills that you are proud of were used to be ours.";
- mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
- next;
- mes "[Dwarf Grunburti]";
- mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Did you just ask what I am doing here?";
- mes "Muhahahaha....I was waiting for the time to kick your ass!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
- mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
- next;
- mes "[Dwarf Grunburti]";
- mes "My home town....I will never be able to go back...from this Midgard.";
- mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
- next;
- mes "[Dwarf Grunburti]";
- mes "That is why I have been staying in Midgard!";
- mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
- close;
- break;
-
- case 3:
- set @god_guild,getcharid(2);
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm...I need some materials to make a weapon.";
- mes "Which weapon do you want to have?";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
- }
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "We, dwarves have too high pride to share own skills with such a low race like human!";
- mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
- close;
- }
- }
- if (strcharinfo(0) != getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "I will only present my significant skills to humans of high social standing!";
- mes "Go bring your ^0000FFguildmaster^000000!";
- close;
- }
- mes "[Dwarf Grunburti]";
- mes "Although it is very humiliating to present my valuable skills to a human being...";
- next;
- mes "[Dwarf Grunburti]";
- mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
- next;
- mes "[Dwarf Grunburti]";
- mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
- mes "I hate to see humans wandering about my home without any purpose!";
- next;
- if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
- mes "Okay...then.";
- next;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "...........";
- next;
- mes "[Dwarf Grunburti]";
- mes "........";
- next;
- mes "[Dwarf Grunburti]";
- mes "....";
- next;
- mes "[Dwarf Grunburti]";
- mes "?! You have not brought all the necessary materials!";
- mes "...did you forget what you need?";
- mes "Listen carefully this time!";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
- }
- }
- mes "[Dwarf Grunburti]";
- mes "I will do a favor for you this time.";
- mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
- close2;
- warp "que_god01.gat",214,63;
- end;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "Muhahahahahaha!";
- mes "Go grow up first!";
- close;
- break;
-
- }
-}
-
-gld_dun02.gat,85,84,0 script Grunburti#2 826,{
-
- mes "[Dwarf Grunburti]";
- mes "Hmmhah! What brought you here, human!";
- mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
- next;
- switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
- {
-
- case 1:
- mes "[Dwarf Grunburti]";
- mes "Ah, what an annoying human! What do you want to know about us, huh?";
- mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
- next;
- mes "[Dwarf Grunburti]";
- mes "All the knowledge and skills that you are proud of were used to be ours.";
- mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
- next;
- mes "[Dwarf Grunburti]";
- mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Did you just ask what I am doing here?";
- mes "Muhahahaha....I was waiting for the time to kick your ass!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
- mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
- next;
- mes "[Dwarf Grunburti]";
- mes "My home town....I will never be able to go back...from this Midgard.";
- mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
- next;
- mes "[Dwarf Grunburti]";
- mes "That is why I have been staying in Midgard!";
- mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
- close;
- break;
-
- case 3:
- set @god_guild,getcharid(2);
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm...I need some materials to make a weapon.";
- mes "Which weapon do you want to have?";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
- }
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "We, dwarves have too high pride to share own skills with such a low race like human!";
- mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
- close;
- }
- }
- if (strcharinfo(0) != getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "I will only present my significant skills to humans of high social standing!";
- mes "Go bring your ^0000FFguildmaster^000000!";
- close;
- }
- mes "[Dwarf Grunburti]";
- mes "Although it is very humiliating to present my valuable skills to a human being...";
- next;
- mes "[Dwarf Grunburti]";
- mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
- next;
- mes "[Dwarf Grunburti]";
- mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
- mes "I hate to see humans wandering about my home without any purpose!";
- next;
- if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
- mes "Okay...then.";
- next;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "...........";
- next;
- mes "[Dwarf Grunburti]";
- mes "........";
- next;
- mes "[Dwarf Grunburti]";
- mes "....";
- next;
- mes "[Dwarf Grunburti]";
- mes "?! You have not brought all the necessary materials!";
- mes "...did you forget what you need?";
- mes "Listen carefully this time!";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
- }
- }
- mes "[Dwarf Grunburti]";
- mes "I will do a favor for you this time.";
- mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
- close2;
- warp "que_god01.gat",214,63;
- end;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "Muhahahahahaha!";
- mes "Go grow up first!";
- close;
- break;
-
- }
-}
-
-gld_dun03.gat,92,105,0 script Grunburti#3 826,{
-
- mes "[Dwarf Grunburti]";
- mes "Hmmhah! What brought you here, human!";
- mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
- next;
- switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
- {
-
- case 1:
- mes "[Dwarf Grunburti]";
- mes "Ah, what an annoying human! What do you want to know about us, huh?";
- mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
- next;
- mes "[Dwarf Grunburti]";
- mes "All the knowledge and skills that you are proud of were used to be ours.";
- mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
- next;
- mes "[Dwarf Grunburti]";
- mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Did you just ask what I am doing here?";
- mes "Muhahahaha....I was waiting for the time to kick your ass!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
- mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
- next;
- mes "[Dwarf Grunburti]";
- mes "My home town....I will never be able to go back...from this Midgard.";
- mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
- next;
- mes "[Dwarf Grunburti]";
- mes "That is why I have been staying in Midgard!";
- mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
- close;
- break;
-
- case 3:
- set @god_guild,getcharid(2);
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm...I need some materials to make a weapon.";
- mes "Which weapon do you want to have?";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
- }
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "We, dwarves have too high pride to share own skills with such a low race like human!";
- mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
- close;
- }
- }
- if (strcharinfo(0) != getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "I will only present my significant skills to humans of high social standing!";
- mes "Go bring your ^0000FFguildmaster^000000!";
- close;
- }
- mes "[Dwarf Grunburti]";
- mes "Although it is very humiliating to present my valuable skills to a human being...";
- next;
- mes "[Dwarf Grunburti]";
- mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
- next;
- mes "[Dwarf Grunburti]";
- mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
- mes "I hate to see humans wandering about my home without any purpose!";
- next;
- if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
- mes "Okay...then.";
- next;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "...........";
- next;
- mes "[Dwarf Grunburti]";
- mes "........";
- next;
- mes "[Dwarf Grunburti]";
- mes "....";
- next;
- mes "[Dwarf Grunburti]";
- mes "?! You have not brought all the necessary materials!";
- mes "...did you forget what you need?";
- mes "Listen carefully this time!";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
- }
- }
- mes "[Dwarf Grunburti]";
- mes "I will do a favor for you this time.";
- mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
- close2;
- warp "que_god01.gat",214,63;
- end;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "Muhahahahahaha!";
- mes "Go grow up first!";
- close;
- break;
-
- }
-}
-
-gld_dun04.gat,268,230,0 script Grunburti#4 826,{
-
- mes "[Dwarf Grunburti]";
- mes "Hmmhah! What brought you here, human!";
- mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
- next;
- switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
- {
-
- case 1:
- mes "[Dwarf Grunburti]";
- mes "Ah, what an annoying human! What do you want to know about us, huh?";
- mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
- next;
- mes "[Dwarf Grunburti]";
- mes "All the knowledge and skills that you are proud of were used to be ours.";
- mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
- next;
- mes "[Dwarf Grunburti]";
- mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Did you just ask what I am doing here?";
- mes "Muhahahaha....I was waiting for the time to kick your ass!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
- mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
- next;
- mes "[Dwarf Grunburti]";
- mes "My home town....I will never be able to go back...from this Midgard.";
- mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
- next;
- mes "[Dwarf Grunburti]";
- mes "That is why I have been staying in Midgard!";
- mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
- close;
- break;
-
- case 3:
- set @god_guild,getcharid(2);
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm...I need some materials to make a weapon.";
- mes "Which weapon do you want to have?";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "...";
- mes "However, the time has not come yet. So wait until then. Muhahaha!";
- close;
- break;
- }
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "We, dwarves have too high pride to share own skills with such a low race like human!";
- mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
- close;
- }
- }
- if (strcharinfo(0) != getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "I will only present my significant skills to humans of high social standing!";
- mes "Go bring your ^0000FFguildmaster^000000!";
- close;
- }
- mes "[Dwarf Grunburti]";
- mes "Although it is very humiliating to present my valuable skills to a human being...";
- next;
- mes "[Dwarf Grunburti]";
- mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
- next;
- mes "[Dwarf Grunburti]";
- mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
- mes "I hate to see humans wandering about my home without any purpose!";
- next;
- if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
- mes "Okay...then.";
- next;
- }
- else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
- mes "Okay...then.";
- next;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "...........";
- next;
- mes "[Dwarf Grunburti]";
- mes "........";
- next;
- mes "[Dwarf Grunburti]";
- mes "....";
- next;
- mes "[Dwarf Grunburti]";
- mes "?! You have not brought all the necessary materials!";
- mes "...did you forget what you need?";
- mes "Listen carefully this time!";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
- case 1:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Sprit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "I will need...";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- mes "[Dwarf Grunburti]";
- mes "....however, you seem to be slower than other human...";
- mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
- close;
- break;
- }
- }
- mes "[Dwarf Grunburti]";
- mes "I will do a favor for you this time.";
- mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
- close2;
- warp "que_god01.gat",214,63;
- end;
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "Muhahahahahaha!";
- mes "Go grow up first!";
- close;
- break;
-
- }
-}
-
-que_god01.gat,215,127,0 script #god_hopewarp1 111,{
- end;
-
- OnInit:
- waitingroom "Laboratory Entrance",2,"#god_hopewarp1::OnWarp",1;
- end;
-
- OnWarp:
- warpwaitingpc "que_god01.gat",155,63;
- donpcevent "Grunburti#god::OnRun";
- delwaitingroom;
- end;
-}
-
-que_god01.gat,214,128,0 script #que_godnpc1 111,{
-
- mes "[Entrance Notice]";
- mes "Only the quickest human being will possess the power of God.";
- close;
-
-}
-
-que_god01.gat,215,128,0 script #que_godnpc2" 111,{
-
- mes "[Entrance Notice]";
- mes "Only the quickest human being will possess the power of God.";
- close;
-
-}
-
-que_god01.gat,213,128,0 script #que_godnpc3 111,{
-
- mes "[Entrance Notice]";
- mes "Only the quickest human being will possess the power of God.";
- close;
-
-}
-
-que_god01.gat,154,112,4 script Grunburti#god 826,{
-
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- mes "[Dwarf Grunburti]";
- mes "The godly item has been created already.";
- mes "You must wait until all the seals are released again! Hahahaha!";
- close;
- }
- set @god_guild,getcharid(2);
- if (strcharinfo(0) != getguildmaster(@god_guild))
- {
- mes "[Dwarf Grunburti]";
- mes "?! How did you come in here?";
- mes "Get out immediately! I will only speak to humans of high social standing!";
- close;
- }
- mes "[Dwarf Grunburti]";
- mes "Although it is very humiliating to present my valuable skills to a human being...";
- mes "I will do a favor for you this time.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Now! Choose an item that you wish to have! You have only ^FF000010 minutes to complete the weapon creation process^000000!";
- mes "I am busy of course, also ^0000FFall the seals will be sealed up again shortly^000000!";
- mes "^FF0000Don't be too slow^000000, otherwise ^FF0000I will give the chance to another human^000000 right away!";
- next;
- switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
- {
-
- case 1:
- mes "[Dwarf Grunburti]";
- mes "Brisingamen!";
- mes "How dare an insignificant man to own such a precious treasure!";
- next;
- mes "[Dwarf Grunburti]";
- mes "I must say, this necklace will possess no meaning unless it is worn by the goddess Freya!";
- mes "Treasure will select its owner with its will. Let's see if it recognizes you as the owner or not!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Once again, I need following materials in order to reproduce the godly item.";
- mes "^0000FF4 Freya's Jewel";
- mes "4 Silver Ornament";
- mes "3 Snow Crystal";
- mes "3 Ripple";
- mes "3 Drifting Air";
- mes "2 Sapphire";
- mes "3 Pearl";
- mes "10 Opal";
- mes "5 Cursed Ruby";
- mes "20 Gold and";
- mes "1 Necklace^000000...";
- next;
-
- switch( select( "Make Brisingamen.", "Cancel." ) )
- {
-
- case 1:
- if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Muhahahahaha!";
- mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
- next;
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- mes "[Dwarf Grunburti]";
- mes "The godly item has been created already.";
- mes "You must wait until all the seals are released again! Hahahaha!";
- close;
- }
- delitem 7073,4;
- delitem 7077,4;
- delitem 7088,3;
- delitem 7090,3;
- delitem 7092,3;
- delitem 726,2;
- delitem 722,3;
- delitem 726,10;
- delitem 724,5;
- delitem 969,20;
- delitem 2603,1;
- getitem 2630,1;
- set $God1,0;
- set $God2,0;
- set $God3,0;
- set $God4,0;
- announce "[Brisingamen] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
- mes "[Dwarf Grunburti]";
- mes "Look at this dazzling necklace, isn't it beautiful!";
- mes "Ah~ surely there is no existance that can compete this item in this world.";
- close;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
- close;
- }
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Muhahahaha~ somehow I figured that!";
- close;
- break;
-
- }
-
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Me.. Megingjard!";
- mes "How dare an insignificant man to own such a precious treasure!";
- next;
- mes "[Dwarf Grunburti]";
- mes "This belt used to be worn by the greatest warrior Thor long time ago!";
- mes "Treasure will select its owner with its will. Let's see if it recognizes you as the owner or not!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Once again, I need following materials in order to reproduce the godly item.";
- mes "^0000FF1 Gleipnir";
- mes "20 Gold";
- mes "10 Sapphire";
- mes "10 Oridecon";
- mes "and 1 Belt^000000...";
- next;
-
- switch( select( "Make Megingjard.", "Cancel." ) )
- {
-
- case 1:
- if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Muhahahahaha!";
- mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
- next;
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- mes "[Dwarf Grunburti]";
- mes "The godly item has been created already.";
- mes "You must wait until all the seals are released again! Hahahaha!";
- close;
- }
-
- delitem 7058,1;
- delitem 969,20;
- delitem 726,10;
- delitem 984,10;
- delitem 2627,1;
- getitem 2629,1;
- set $God1,0;
- set $God2,0;
- set $God3,0;
- set $God4,0;
- announce "[Megingjard] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
- mes "[Dwarf Grunburti]";
- mes "Here you go!";
- mes "Ah~ look at this majestic appearance...! I am overwhelmed already...";
- close;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
- close;
- }
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Muhahahaha~ somehow I figured that!";
- close;
- break;
-
- }
-
- break;
-
- case 3:
- mes "[Dwarf Grunburti]";
- mes "....the eight legged stallion, Sleipnir?!";
- mes "How dare an insignificant man to own such a precious treasure!";
- next;
- mes "[Dwarf Grunburti]";
- mes "Unfortunately I can only produce an object...not a life.";
- mes "However, I can craft a pair of shoes that possess the power of Sleipnir.";
- next;
- mes "[Dwarf Grunburti]";
- mes "Of course, even the shoes are too valuable to be given out to a human.";
- mes "Once again, I need following materials in order to reproduce the godly item.";
- next;
- mes "[Dwarf Grunburti]";
- mes "^0000FF3 Wheel of the Unknown";
- mes "5 Feather of Angel Wing";
- mes "3 Spirit of Fish";
- mes "4 Emblem of the Sun God";
- mes "3 Breath of Spirit";
- mes "20 Gold";
- mes "10 Elunium";
- mes "and 1 Slotted Boots^000000...";
- next;
- switch( select( "Make Sleipnir.", "Cancel." ) )
- {
-
- case 1:
- if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Muhahahahaha!";
- mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
- next;
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- mes "[Dwarf Grunburti]";
- mes "The godly item has been created already.";
- mes "You must wait until all the seals are released again! Hahahaha!";
- close;
- }
- delitem 7076,3;
- delitem 7079,5;
- delitem 7083,3;
- delitem 7086,4;
- delitem 7087,3;
- delitem 969,20;
- delitem 985,10;
- delitem 2406,1;
- getitem 2410,1;
- set $God1,0;
- set $God2,0;
- set $God3,0;
- set $God4,0;
- announce "[Sleipnir] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
- mes "[Dwarf Grunburti]";
- mes "Here you go!";
- mes "This pair of shoes are so light, you will never feel like wearing anything on your feet with this shoes!";
- close;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
- close;
- }
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Muhahahaha~ somehow I figured that!";
- close;
- break;
-
- }
-
- break;
-
- case 4:
- mes "[Dwarf Grunburti]";
- mes "Mjo!...Mjo....Mjolnir!";
- mes "How dare an insignificant man to own such a precious treasure!";
- next;
- mes "[Dwarf Grunburti]";
- mes "I haven't assured if you are qualified to possess this yet.";
- mes "Are you confident that you would not disgrace Thor, the greatest warrior?";
- next;
- mes "[Dwarf Grunburti]";
- mes "....sigh...";
- mes "Somehow humans are too greedy to listen to my concern.";
- mes "I will create it for you though. However you will realise how limitted you are to handle this item...";
- mes "Once again, I need following materials in order to reproduce the godly item.";
- next;
- mes "[Dwarf Grunburti]";
- mes "^0000FF2 Thor's Gauntlets";
- mes "4 Iron Maiden";
- mes "5 Wrath of Valkyrie";
- mes "5 Omen of Tempest";
- mes "5 Billow";
- mes "20 Oridecon";
- mes "5 Elunium";
- mes "40 Gold and";
- mes "1 Stunner^000000...";
- next;
- switch( select( "Make Mjolnir.", "Cancel." ) )
- {
-
- case 1:
- if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
- {
- mes "[Dwarf Grunburti]";
- mes "Muhahahahaha!";
- mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
- next;
- if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
- {
- mes "[Dwarf Grunburti]";
- mes "The godly item has been created already.";
- mes "You must wait until all the seals are released again! Hahahaha!";
- close;
- }
- delitem 7074,2;
- delitem 7075,4;
- delitem 7078,5;
- delitem 7089,5;
- delitem 7091,5;
- delitem 984,20;
- delitem 985,5;
- delitem 969,40;
- delitem 1522,1;
- getitem 1530,1;
- set $God1,0;
- set $God2,0;
- set $God3,0;
- set $God4,0;
- announce "[Mjolnir] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
- mes "[Dwarf Grunburti]";
- mes "Here you go!";
- mes "Although it may appear too small to be such a powerful hammer, there is no weapon that can compete to Mjolnir!";
- close;
- }
- else
- {
- mes "[Dwarf Grunburti]";
- mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
- close;
- }
- break;
-
- case 2:
- mes "[Dwarf Grunburti]";
- mes "Muhahahaha~ somehow I figured that!";
- close;
- break;
-
- }
-
- break;
-
- }
-
-OnRun:
- initnpctimer;
- end;
-
-OnTimer10000:
- mapannounce "que_god01.gat","Remember that you only have 10 minutes for this! Hurry up!",0;
- end;
-
-OnTimer610000:
- mapannounce "que_god01.gat","You are too slow! I am going to give the chance to the other! Next!",0;
- end;
-
-OnTimer612000:
- areawarp "que_god01.gat",154,67,4,7,"prontera.gat",156,324;
- areawarp "que_god01.gat",154,82,4,7,"prontera.gat",156,324;
- areawarp "que_god01.gat",145,99,9,9,"prontera.gat",156,324;
- areawarp "que_god01.gat",164,99,9,9,"prontera.gat",156,324;
- areawarp "que_god01.gat",145,118,9,9,"prontera.gat",156,324;
- areawarp "que_god01.gat",164,118,9,9,"prontera.gat",156,324;
- end;
-
-OnTimer615000:
- donpcevent "#god_hopewarp1::OnInit";
- stopnpctimer;
- end;
-
+//===== eAthena Script =======================================
+//= God items creation NPCs
+//===== By: ==================================================
+//= SinSloth
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
+//============================================================
+
+gld_dun01.gat,28,85,0 script Grunburti 826,{
+
+ mes "[Dwarf Grunburti]";
+ mes "Hmmhah! What brought you here, human!";
+ mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
+ next;
+ switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
+ {
+
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "Ah, what an annoying human! What do you want to know about us, huh?";
+ mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "All the knowledge and skills that you are proud of were used to be ours.";
+ mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Did you just ask what I am doing here?";
+ mes "Muhahahaha....I was waiting for the time to kick your ass!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
+ mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "My home town....I will never be able to go back...from this Midgard.";
+ mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "That is why I have been staying in Midgard!";
+ mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
+ close;
+ break;
+
+ case 3:
+ set @god_guild,getcharid(2);
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm...I need some materials to make a weapon.";
+ mes "Which weapon do you want to have?";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "We, dwarves have too high pride to share own skills with such a low race like human!";
+ mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
+ close;
+ }
+ }
+ if (strcharinfo(0) != getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "I will only present my significant skills to humans of high social standing!";
+ mes "Go bring your ^0000FFguildmaster^000000!";
+ close;
+ }
+ mes "[Dwarf Grunburti]";
+ mes "Although it is very humiliating to present my valuable skills to a human being...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
+ mes "I hate to see humans wandering about my home without any purpose!";
+ next;
+ if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "...........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "?! You have not brought all the necessary materials!";
+ mes "...did you forget what you need?";
+ mes "Listen carefully this time!";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+ }
+ }
+ mes "[Dwarf Grunburti]";
+ mes "I will do a favor for you this time.";
+ mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
+ close2;
+ warp "que_god01.gat",214,63;
+ end;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahahaha!";
+ mes "Go grow up first!";
+ close;
+ break;
+
+ }
+}
+
+gld_dun02.gat,85,84,0 script Grunburti#2 826,{
+
+ mes "[Dwarf Grunburti]";
+ mes "Hmmhah! What brought you here, human!";
+ mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
+ next;
+ switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
+ {
+
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "Ah, what an annoying human! What do you want to know about us, huh?";
+ mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "All the knowledge and skills that you are proud of were used to be ours.";
+ mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Did you just ask what I am doing here?";
+ mes "Muhahahaha....I was waiting for the time to kick your ass!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
+ mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "My home town....I will never be able to go back...from this Midgard.";
+ mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "That is why I have been staying in Midgard!";
+ mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
+ close;
+ break;
+
+ case 3:
+ set @god_guild,getcharid(2);
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm...I need some materials to make a weapon.";
+ mes "Which weapon do you want to have?";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "We, dwarves have too high pride to share own skills with such a low race like human!";
+ mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
+ close;
+ }
+ }
+ if (strcharinfo(0) != getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "I will only present my significant skills to humans of high social standing!";
+ mes "Go bring your ^0000FFguildmaster^000000!";
+ close;
+ }
+ mes "[Dwarf Grunburti]";
+ mes "Although it is very humiliating to present my valuable skills to a human being...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
+ mes "I hate to see humans wandering about my home without any purpose!";
+ next;
+ if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "...........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "?! You have not brought all the necessary materials!";
+ mes "...did you forget what you need?";
+ mes "Listen carefully this time!";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+ }
+ }
+ mes "[Dwarf Grunburti]";
+ mes "I will do a favor for you this time.";
+ mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
+ close2;
+ warp "que_god01.gat",214,63;
+ end;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahahaha!";
+ mes "Go grow up first!";
+ close;
+ break;
+
+ }
+}
+
+gld_dun03.gat,92,105,0 script Grunburti#3 826,{
+
+ mes "[Dwarf Grunburti]";
+ mes "Hmmhah! What brought you here, human!";
+ mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
+ next;
+ switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
+ {
+
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "Ah, what an annoying human! What do you want to know about us, huh?";
+ mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "All the knowledge and skills that you are proud of were used to be ours.";
+ mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Did you just ask what I am doing here?";
+ mes "Muhahahaha....I was waiting for the time to kick your ass!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
+ mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "My home town....I will never be able to go back...from this Midgard.";
+ mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "That is why I have been staying in Midgard!";
+ mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
+ close;
+ break;
+
+ case 3:
+ set @god_guild,getcharid(2);
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm...I need some materials to make a weapon.";
+ mes "Which weapon do you want to have?";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "We, dwarves have too high pride to share own skills with such a low race like human!";
+ mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
+ close;
+ }
+ }
+ if (strcharinfo(0) != getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "I will only present my significant skills to humans of high social standing!";
+ mes "Go bring your ^0000FFguildmaster^000000!";
+ close;
+ }
+ mes "[Dwarf Grunburti]";
+ mes "Although it is very humiliating to present my valuable skills to a human being...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
+ mes "I hate to see humans wandering about my home without any purpose!";
+ next;
+ if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "...........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "?! You have not brought all the necessary materials!";
+ mes "...did you forget what you need?";
+ mes "Listen carefully this time!";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+ }
+ }
+ mes "[Dwarf Grunburti]";
+ mes "I will do a favor for you this time.";
+ mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
+ close2;
+ warp "que_god01.gat",214,63;
+ end;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahahaha!";
+ mes "Go grow up first!";
+ close;
+ break;
+
+ }
+}
+
+gld_dun04.gat,268,230,0 script Grunburti#4 826,{
+
+ mes "[Dwarf Grunburti]";
+ mes "Hmmhah! What brought you here, human!";
+ mes "Living in Midgard and away from my home town is painful enough, let alone facing a whiney human. Leave me alone!";
+ next;
+ switch( select( "Ask him about dwarves.", "Ask him what he is doing.", "Request a weapon creation.", "Cancel." ) )
+ {
+
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "Ah, what an annoying human! What do you want to know about us, huh?";
+ mes "We are the toughest race that have bare to live in the barren land. Feeble-minded midgardians can not imagine how sterile our land is!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "All the knowledge and skills that you are proud of were used to be ours.";
+ mes "Even weapons used by ancient Gods were made by our ancestors. Do you know that?";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "We have the greatest knowlege and skills yet we have taken our fate to live in the barren land of Giants, that's who we are!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Did you just ask what I am doing here?";
+ mes "Muhahahaha....I was waiting for the time to kick your ass!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Heheheheh, don't you worry. In fact, I will only humiliate myself by fighting with such a weakling like you.";
+ mes "Humans are so weak yet are too arrogant and love power struggling each other. You are just helpless...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "My home town....I will never be able to go back...from this Midgard.";
+ mes "Because Yggdrasil tree, the only way to my home town have dissappeared during the war in 1000 years ago.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "That is why I have been staying in Midgard!";
+ mes "At least I am lucky because I found this cave where the environment is similar as my home town...";
+ close;
+ break;
+
+ case 3:
+ set @god_guild,getcharid(2);
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ if ($God1 > 49 && $God2 > 49 && $God3 > 49 && $God4 > 49 && strcharinfo(0) == getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm...I need some materials to make a weapon.";
+ mes "Which weapon do you want to have?";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "...";
+ mes "However, the time has not come yet. So wait until then. Muhahaha!";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "We, dwarves have too high pride to share own skills with such a low race like human!";
+ mes "Stop interrupting me and leave immediately! Go play with monsters, your favorite toys!";
+ close;
+ }
+ }
+ if (strcharinfo(0) != getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "I will only present my significant skills to humans of high social standing!";
+ mes "Go bring your ^0000FFguildmaster^000000!";
+ close;
+ }
+ mes "[Dwarf Grunburti]";
+ mes "Although it is very humiliating to present my valuable skills to a human being...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "since you are a master of guild and all the seals have been released, I think I can give you a chance to look at.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "First of all, I shall confirm if you have brought all the necessary materials to forge a godly item or not!";
+ mes "I hate to see humans wandering about my home without any purpose!";
+ next;
+ if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFBrisingamen^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMegingjard^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFSleipnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Hmm, I guess you want to have ^0000FFMjolnir^000000!";
+ mes "Okay...then.";
+ next;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "...........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "........";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "?! You have not brought all the necessary materials!";
+ mes "...did you forget what you need?";
+ mes "Listen carefully this time!";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Sprit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "I will need...";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....however, you seem to be slower than other human...";
+ mes "I start to wonder if you can have the godly item this time or not. Anyways, go for it!";
+ close;
+ break;
+ }
+ }
+ mes "[Dwarf Grunburti]";
+ mes "I will do a favor for you this time.";
+ mes "I cannot start to work in here. Come to ^0000FFthe underground laboratory^000000.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Now, you must hurry up! ^0000FFOnly one of each godly item^000000 will be given to humans ^FF0000right after all the seals are released^000000!";
+ close2;
+ warp "que_god01.gat",214,63;
+ end;
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahahaha!";
+ mes "Go grow up first!";
+ close;
+ break;
+
+ }
+}
+
+que_god01.gat,215,127,0 script #god_hopewarp1 111,{
+ end;
+
+ OnInit:
+ waitingroom "Laboratory Entrance",2,"#god_hopewarp1::OnWarp",1;
+ end;
+
+ OnWarp:
+ warpwaitingpc "que_god01.gat",155,63;
+ donpcevent "Grunburti#god::OnRun";
+ delwaitingroom;
+ end;
+}
+
+que_god01.gat,214,128,0 script #que_godnpc1 111,{
+
+ mes "[Entrance Notice]";
+ mes "Only the quickest human being will possess the power of God.";
+ close;
+
+}
+
+que_god01.gat,215,128,0 script #que_godnpc2" 111,{
+
+ mes "[Entrance Notice]";
+ mes "Only the quickest human being will possess the power of God.";
+ close;
+
+}
+
+que_god01.gat,213,128,0 script #que_godnpc3 111,{
+
+ mes "[Entrance Notice]";
+ mes "Only the quickest human being will possess the power of God.";
+ close;
+
+}
+
+que_god01.gat,154,112,4 script Grunburti#god 826,{
+
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "The godly item has been created already.";
+ mes "You must wait until all the seals are released again! Hahahaha!";
+ close;
+ }
+ set @god_guild,getcharid(2);
+ if (strcharinfo(0) != getguildmaster(@god_guild))
+ {
+ mes "[Dwarf Grunburti]";
+ mes "?! How did you come in here?";
+ mes "Get out immediately! I will only speak to humans of high social standing!";
+ close;
+ }
+ mes "[Dwarf Grunburti]";
+ mes "Although it is very humiliating to present my valuable skills to a human being...";
+ mes "I will do a favor for you this time.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Now! Choose an item that you wish to have! You have only ^FF000010 minutes to complete the weapon creation process^000000!";
+ mes "I am busy of course, also ^0000FFall the seals will be sealed up again shortly^000000!";
+ mes "^FF0000Don't be too slow^000000, otherwise ^FF0000I will give the chance to another human^000000 right away!";
+ next;
+ switch( select( "Brisingamen", "Megingjard", "Sleipnir", "Mjolnir" ) )
+ {
+
+ case 1:
+ mes "[Dwarf Grunburti]";
+ mes "Brisingamen!";
+ mes "How dare an insignificant man to own such a precious treasure!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "I must say, this necklace will possess no meaning unless it is worn by the goddess Freya!";
+ mes "Treasure will select its owner with its will. Let's see if it recognizes you as the owner or not!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Once again, I need following materials in order to reproduce the godly item.";
+ mes "^0000FF4 Freya's Jewel";
+ mes "4 Silver Ornament";
+ mes "3 Snow Crystal";
+ mes "3 Ripple";
+ mes "3 Drifting Air";
+ mes "2 Sapphire";
+ mes "3 Pearl";
+ mes "10 Opal";
+ mes "5 Cursed Ruby";
+ mes "20 Gold and";
+ mes "1 Necklace^000000...";
+ next;
+
+ switch( select( "Make Brisingamen.", "Cancel." ) )
+ {
+
+ case 1:
+ if (countitem(7073) > 3 && countitem(7077) > 3 && countitem(7088) > 2 && countitem(7090) > 2 && countitem(7092) > 2 && countitem(726) > 1 && countitem(722) > 2 && countitem(727) > 9 && countitem(724) > 4 && countitem(969) > 19 && countitem(2603) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahaha!";
+ mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
+ next;
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "The godly item has been created already.";
+ mes "You must wait until all the seals are released again! Hahahaha!";
+ close;
+ }
+ delitem 7073,4;
+ delitem 7077,4;
+ delitem 7088,3;
+ delitem 7090,3;
+ delitem 7092,3;
+ delitem 726,2;
+ delitem 722,3;
+ delitem 726,10;
+ delitem 724,5;
+ delitem 969,20;
+ delitem 2603,1;
+ getitem 2630,1;
+ set $God1,0;
+ set $God2,0;
+ set $God3,0;
+ set $God4,0;
+ announce "[Brisingamen] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
+ mes "[Dwarf Grunburti]";
+ mes "Look at this dazzling necklace, isn't it beautiful!";
+ mes "Ah~ surely there is no existance that can compete this item in this world.";
+ close;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahaha~ somehow I figured that!";
+ close;
+ break;
+
+ }
+
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Me.. Megingjard!";
+ mes "How dare an insignificant man to own such a precious treasure!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "This belt used to be worn by the greatest warrior Thor long time ago!";
+ mes "Treasure will select its owner with its will. Let's see if it recognizes you as the owner or not!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Once again, I need following materials in order to reproduce the godly item.";
+ mes "^0000FF1 Gleipnir";
+ mes "20 Gold";
+ mes "10 Sapphire";
+ mes "10 Oridecon";
+ mes "and 1 Belt^000000...";
+ next;
+
+ switch( select( "Make Megingjard.", "Cancel." ) )
+ {
+
+ case 1:
+ if (countitem(7058) > 0 && countitem(969) > 19 && countitem(726) > 9 && countitem(984) > 9 && countitem(2627) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahaha!";
+ mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
+ next;
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "The godly item has been created already.";
+ mes "You must wait until all the seals are released again! Hahahaha!";
+ close;
+ }
+
+ delitem 7058,1;
+ delitem 969,20;
+ delitem 726,10;
+ delitem 984,10;
+ delitem 2627,1;
+ getitem 2629,1;
+ set $God1,0;
+ set $God2,0;
+ set $God3,0;
+ set $God4,0;
+ announce "[Megingjard] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
+ mes "[Dwarf Grunburti]";
+ mes "Here you go!";
+ mes "Ah~ look at this majestic appearance...! I am overwhelmed already...";
+ close;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahaha~ somehow I figured that!";
+ close;
+ break;
+
+ }
+
+ break;
+
+ case 3:
+ mes "[Dwarf Grunburti]";
+ mes "....the eight legged stallion, Sleipnir?!";
+ mes "How dare an insignificant man to own such a precious treasure!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Unfortunately I can only produce an object...not a life.";
+ mes "However, I can craft a pair of shoes that possess the power of Sleipnir.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "Of course, even the shoes are too valuable to be given out to a human.";
+ mes "Once again, I need following materials in order to reproduce the godly item.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "^0000FF3 Wheel of the Unknown";
+ mes "5 Feather of Angel Wing";
+ mes "3 Spirit of Fish";
+ mes "4 Emblem of the Sun God";
+ mes "3 Breath of Spirit";
+ mes "20 Gold";
+ mes "10 Elunium";
+ mes "and 1 Slotted Boots^000000...";
+ next;
+ switch( select( "Make Sleipnir.", "Cancel." ) )
+ {
+
+ case 1:
+ if (countitem(7076) > 2 && countitem(7079) > 4 && countitem(7083) > 2 && countitem(7086) > 3 && countitem(7087) > 2 && countitem(969) > 19 && countitem(985) > 9 && countitem(2406) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahaha!";
+ mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
+ next;
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "The godly item has been created already.";
+ mes "You must wait until all the seals are released again! Hahahaha!";
+ close;
+ }
+ delitem 7076,3;
+ delitem 7079,5;
+ delitem 7083,3;
+ delitem 7086,4;
+ delitem 7087,3;
+ delitem 969,20;
+ delitem 985,10;
+ delitem 2406,1;
+ getitem 2410,1;
+ set $God1,0;
+ set $God2,0;
+ set $God3,0;
+ set $God4,0;
+ announce "[Sleipnir] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
+ mes "[Dwarf Grunburti]";
+ mes "Here you go!";
+ mes "This pair of shoes are so light, you will never feel like wearing anything on your feet with this shoes!";
+ close;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahaha~ somehow I figured that!";
+ close;
+ break;
+
+ }
+
+ break;
+
+ case 4:
+ mes "[Dwarf Grunburti]";
+ mes "Mjo!...Mjo....Mjolnir!";
+ mes "How dare an insignificant man to own such a precious treasure!";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "I haven't assured if you are qualified to possess this yet.";
+ mes "Are you confident that you would not disgrace Thor, the greatest warrior?";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "....sigh...";
+ mes "Somehow humans are too greedy to listen to my concern.";
+ mes "I will create it for you though. However you will realise how limitted you are to handle this item...";
+ mes "Once again, I need following materials in order to reproduce the godly item.";
+ next;
+ mes "[Dwarf Grunburti]";
+ mes "^0000FF2 Thor's Gauntlets";
+ mes "4 Iron Maiden";
+ mes "5 Wrath of Valkyrie";
+ mes "5 Omen of Tempest";
+ mes "5 Billow";
+ mes "20 Oridecon";
+ mes "5 Elunium";
+ mes "40 Gold and";
+ mes "1 Stunner^000000...";
+ next;
+ switch( select( "Make Mjolnir.", "Cancel." ) )
+ {
+
+ case 1:
+ if (countitem(7074) > 1 && countitem(7075) > 3 && countitem(7078) > 4 && countitem(7089) > 4 && countitem(7091) > 4 && countitem(984) > 19 && countitem(985) > 4 && countitem(969) > 39 && countitem(1522) > 0)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahahaha!";
+ mes "I didn't imagine that I would use my skills for a human being...give me a moment!";
+ next;
+ if ($God1 < 100 || $God2 < 100 || $God3 < 100 || $God4 < 100)
+ {
+ mes "[Dwarf Grunburti]";
+ mes "The godly item has been created already.";
+ mes "You must wait until all the seals are released again! Hahahaha!";
+ close;
+ }
+ delitem 7074,2;
+ delitem 7075,4;
+ delitem 7078,5;
+ delitem 7089,5;
+ delitem 7091,5;
+ delitem 984,20;
+ delitem 985,5;
+ delitem 969,40;
+ delitem 1522,1;
+ getitem 1530,1;
+ set $God1,0;
+ set $God2,0;
+ set $God3,0;
+ set $God4,0;
+ announce "[Mjolnir] the godly item has been given to [" + strcharinfo(0) + "], the master of the guild [" + getguildname(@god_guild) + "].",bc_all;
+ mes "[Dwarf Grunburti]";
+ mes "Here you go!";
+ mes "Although it may appear too small to be such a powerful hammer, there is no weapon that can compete to Mjolnir!";
+ close;
+ }
+ else
+ {
+ mes "[Dwarf Grunburti]";
+ mes "Bah! You idiotic human being! You have not brought all the necessary materials! Go hurry up, be quick!";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Dwarf Grunburti]";
+ mes "Muhahahaha~ somehow I figured that!";
+ close;
+ break;
+
+ }
+
+ break;
+
+ }
+
+OnRun:
+ initnpctimer;
+ end;
+
+OnTimer10000:
+ mapannounce "que_god01.gat","Remember that you only have 10 minutes for this! Hurry up!",0;
+ end;
+
+OnTimer610000:
+ mapannounce "que_god01.gat","You are too slow! I am going to give the chance to the other! Next!",0;
+ end;
+
+OnTimer612000:
+ areawarp "que_god01.gat",154,67,4,7,"prontera.gat",156,324;
+ areawarp "que_god01.gat",154,82,4,7,"prontera.gat",156,324;
+ areawarp "que_god01.gat",145,99,9,9,"prontera.gat",156,324;
+ areawarp "que_god01.gat",164,99,9,9,"prontera.gat",156,324;
+ areawarp "que_god01.gat",145,118,9,9,"prontera.gat",156,324;
+ areawarp "que_god01.gat",164,118,9,9,"prontera.gat",156,324;
+ end;
+
+OnTimer615000:
+ donpcevent "#god_hopewarp1::OnInit";
+ stopnpctimer;
+ end;
+
} \ No newline at end of file
diff --git a/npc/quests/seals/megingard_seal.txt b/npc/quests/seals/megingard_seal.txt
index 48d427c07..d0b1c5d00 100644
--- a/npc/quests/seals/megingard_seal.txt
+++ b/npc/quests/seals/megingard_seal.txt
@@ -1,3458 +1,3458 @@
-//===== eAthena Script =======================================
-//= Megingjard seal unlocking NPCs.
-//===== By: ==================================================
-//= SinSloth
-//===== Current Version: =====================================
-//= 1.01
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Quest for breaking the seal of Megingjard.
-//===== Additional Comments: =================================
-// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
-// 1.1 fixed exploit [Lupus]
-//============================================================
-
-prt_castle.gat,44,151,0 script Rebarev Doug 56,{
-
-if(countitem(7080) > 3 && countitem(7081) > 4 && countitem(7082) > 3 && countitem(7084) > 2 && countitem(7085) > 2)
-{
- mes "[Rebarev Doug]";
- mes "What's this?";
- mes "You...! You have";
- mes "everything I need to";
- mes "create Gleipnir!";
- next;
- switch( select( "Make Gleipnir.", "Cancel." ) )
- {
-
- case 1:
- mes "[Rebarev Doug]";
- mes "I'm the only human on earth blessed with the ability to create Gleipnir. Aside from Dwarves, I'm the only person that can make this item!";
- next;
- delitem 7080,4;
- delitem 7081,5;
- delitem 7082,4;
- delitem 7084,3;
- delitem 7085,3;
- getitem 7058,1;
- mes "[Rebarev Doug]";
- mes "There you go!";
- next;
- mes "[Rebarev Doug]";
- mes "Gleipnir is said to be so strong that not even the Fenrir Wolf could break it! I'm so proud that I could make this item!";
- close;
- break;
-
- case 2:
- close;
- break;
-
- }
-}
-
-if($God1 < 50)
-{
- mes "[Rebarev Doug]";
- mes "We are Crusaders that have been training in preparation for the Holy War that is to come.";
- next;
- mes "[Rebarev Doug]";
- mes "As we our forefathers have done a thousand years ago, we shall vanquish the hordes of Demons when the day comes.";
- next;
- mes "[Rebarev Doug]";
- mes "If you have any questions about Crusaders, feel free to ask me. I may be too old and weak for fighting, but I will spread our message as much as I can.";
- mes "feel free to ask me.";
- next;
- switch( select( "What is Holy Cross?", "What is Grand Cross?", "What is Sacrifice?", "What is Gleipnir?" ) )
- {
- case 1:
- mes "[Rebarev Doug]";
- mes "Holy Cross is the first manifestation of a Crusader's faith. By making the sign of the cross, Crusader's can inflict a holy attack on their enemies.";
- next;
- mes "[Rebarev Doug]";
- mes "Monsters that are weak against holiness, particularly the Undead, will be blinded by the light of the Holy Cross. All they can do is next; for holy judgment.";
- next;
- mes "[Rebarev Doug]";
- mes "Based on our latest research, the Holy Cross can inflict 4.5 times more damage than a normal attack once it is mastered.";
- close;
- break;
-
- case 2:
- mes "[Rebarev Doug]";
- mes "Grand Cross...!";
- mes "The righteous fury of God is given form in this destructive skill.";
- next;
- mes "[Rebarev Doug]";
- mes "God grants us his power so that we may punish the forces of evil, and one's rage is embodied in a giant crucifix of power.";
- next;
- mes "[Rebarev Doug]";
- mes "The power of the crucifix of light can damage the enemy three times. Each strike will have five times the strength of your normal attacks.";
- next;
- mes "[Rebarev Doug]";
- mes "However, when Crusaders use Grand Cross, they must exercise extreme caution. The human body is too weak to fully embrace the will of God.";
- next;
- mes "[Rebarev Doug]";
- mes "Therefore, using this skill, will cause the Crusader to suffer from damage. However, this damage can be reduced to half with Faith.";
- close;
- break;
-
- case 3:
- mes "[Rebarev Doug]";
- mes "In practicing what we preach, Crusaders choose to protect others by bearing the suffering of others.";
- next;
- mes "[Rebarev Doug]";
- mes "The Sacrifice skill allows Crusaders to keep their comrades safe from harm by receiving the damage that was intended for them.";
- next;
- mes "[Rebarev Doug]";
- mes "It is the greatest demonstration of faith, as well as of love for your fellow man. Such an attitude is essential for a servant of God!";
- next;
- mes "[Rebarev Doug]";
- mes "However, if the people you want to protect become stray away from you, you cannot use the Sacrifice skill for them unless they are close to you again.";
- next;
- mes "[Rebarev Doug]";
- mes "As you visualize the suffering of those you want to protect, you'll never hesitate to sacrifice yourself.";
- next;
- mes "[Rebarev Doug]";
- mes "Thank you, God, for granting me with a power to protect my people.";
- close;
- break;
-
- case 4:
- mes "[Rebarev Doug]";
- mes "Gleipnir is the essence of Megingjard which I have been researching.";
- next;
- mes "[Rebarev Doug]";
- mes "It's the only binding strong enough that will allow a human to wear Megingjard around his waist.";
- next;
- mes "[Rebarev Doug]";
- mes "Although I can no longer fight, I've been studying how to create Gleipnir for years. I will be more than willing to create it for you if you can bring me...";
- next;
- mes "[Rebarev Doug]";
- mes "^0000FF4 Cat Tread^000000,";
- mes "^0000FF5 Woman's Moustache^000000,";
- mes "^0000FF4 Root of Stone^000000,";
- mes "^0000FF3 Sputum of Bird^000000 and";
- mes "^0000FF3 Sinew of Bear^000000,";
- close;
- break;
- }
-}
-else if($God1 > 49 && $God2 < 100)
-{
- if(BaseLevel > 59)
- {
- if(god_eremes == 0)
- {
- mes "[Rebarev Doug]";
- mes "...";
- next;
- mes "[Rebarev Doug]";
- mes "Why are you wandering around this sacred place? Do you not understand that we must prepare for the Holy War?";
- next;
- mes "[Rebarev Doug]";
- mes "No matter how much I explain, the ignorant never fully understand the importance of our task. The balance of power will shift when we least expect it!";
- next;
- mes "[Rebarev Doug]";
- mes "I wish I could go back to those times when I would train Crusaders, rather than preach to the ignorant.";
- next;
- mes "[Rebarev Doug]";
- mes "I miss my Crusaders who were enthusiastic to listen to what I had to say, and carried out their orders with loyalty.";
- next;
- mes "[Rebarev Doug]";
- mes "I am wonder";
- mes "where they have";
- mes "all gone now...";
- next;
- mes "[Rebarev Doug]";
- mes "...";
- mes "......";
- mes ".........";
- next;
- mes "[Rebarev Doug]";
- mes "Adventurer, if you the time to listen to me speak to myself, why don't you perform a task for me?";
- next;
- mes "[Rebarev Doug]";
- mes "If may be an enriching experience for you. It's possible that you'll even have a greater appreciation for Crusaders.";
- next;
- switch( select( "What is it?", "I'm sick and tired of doin' favors." ) )
- {
- case 1:
- mes "[Rebarev Doug]";
- mes "I want you to find the members of the 3rd squad in the 1st platoon of the 3rd company. If you happen to encounter them in your travels, please ask them how they are doing.";
- next;
- mes "[Rebarev Doug]";
- mes "It shouldn't be that difficult to do, and won't be a waste of your time if you are already planning to explore the world.";
- next;
- switch( select( "Sure, why not.", "I'm sorry, but no." ) )
- {
- case 1:
- mes "[Rebarev Doug]";
- mes "Excellent!";
- mes "All I want you to do is find my old comrades, and inform me of how they are doing.";
- next;
- mes "[Rebarev Doug]";
- mes "However...";
- mes "There is one problem.";
- mes "I don't know where they are.";
- next;
- mes "[Rebarev Doug]";
- mes "You could try to find a record of residency changes by citizens of the Rune-Midgarts Kingdom in the Prontera Library...";
- next;
- mes "[Rebarev Doug]";
- mes "However, the records of Crusader personnel is considered confidential, so I am not sure of whether or not you can view them.";
- next;
- mes "[Rebarev Doug]";
- mes "Thank you in advance anyways.";
- mes ".........";
- next;
- mes "[Rebarev Doug]";
- mes "You must understand, my position requires me to remain in this area 24 hours, 7 days a week. I cannot leave without the consent of the upper hierarchy.";
- next;
- mes "[Rebarev Doug]";
- mes "However, I know you have the freedom and the time to go wherever you please. I'd appreciate if you would do this for me.";
- next;
- mes "[Rebarev Doug]";
- mes "My old comrades in arms. You have no idea how much I miss them...";
- set god_eremes,1;
- close;
- break;
-
- case 2:
- mes "[Rebarev Doug]";
- mes "^333333*Sigh...*^000000";
- mes "Please understand that I would not be asking this of you if it were not for the restraints of my position.";
- next;
- mes "[Rebarev Doug]";
- mes "I have an obligation to this Kingdom to keep my post and inform adventurers about the Crusader class. Because of this awesome responsibility, I must remain here, ever vigilant.";
- next;
- mes "[Rebarev Doug]";
- mes "If you can't understand, then you must be taking your freedom for granted...";
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Rebarev Doug]";
- mes "As far as I remember, this is the first time I have asked you to do me a favor.";
- next;
- mes "[Rebarev Doug]";
- mes "Unlike you, I know the meaning of responsibility. I remain here, helping inquisitive adventurers for the sake of King and country.";
- next;
- mes "[Rebarev Doug]";
- mes "Still...";
- mes "Know this.";
- mes "Although the results may not be immediate, you will always be rewarded when you help others.";
- next;
- mes "[Rebarev Doug]";
- mes "Please reconsider when you get the chance.";
- close;
- break;
- }
- }
- else if(god_eremes > 0 && god_eremes < 4)
- {
-
- if(rand(1,10) > 6 && god_eremes == 2)
- {
- mes "[Rebarev Doug]";
- mes "I am wondering how my members are doing by now...";
- mes "I cannot even remember when was the last time I saw them...";
- next;
- mes "[Rebarev Doug]";
- mes "Hmm? Why are you still here?";
- next;
- switch( select( "Where should I go?", "I am about to leave.", "What do you mean by the last mission?" ) )
- {
- case 1:
- mes "[Rebarev Doug]";
- mes "Well...I have no clue where they are.";
- mes "You might be able to find the information from";
- mes "^0000FFThe 3rd company personnel in&out record crews^000000 in the library?";
- close;
- break;
-
- case 2:
- mes "[Rebarev Doug]";
- mes "Oh, are you? I see... I am wondering what they have been doing ever since we're disbanded after the ^0000FFlast mission^000000...";
- close;
- break;
-
- case 3:
- mes "[Rebarev Doug]";
- mes "The last mission...? That gave the reason to disband the 1st squad of the 3rd platoon...";
- mes "I cannot think of this seprately from the memory...bah..";
- next;
- mes "[Rebarev Doug]";
- mes "You know, hmm.";
- mes "We crusaders have heirarchy...basically we have to listen to higher officers.";
- next;
- mes "[Rebarev Doug]";
- mes "............";
- mes "...If......there wasn't him at the time...";
- next;
- mes "[Rebarev Doug]";
- mes ".............";
- next;
- mes "";
- mes "- After a while, he spoke to me as if he was mad. -";
- next;
- mes "[Rebarev Doug]";
- mes "Let's not talk about it. Just remember it as the reason to disband my squad.";
- next;
- mes "[Rebarev Doug]";
- mes "Now, will you please go find ^0000FFThe 3rd company personnel in&out record crews^000000 in the library for me?";
- set god_eremes,3;
- close;
- break;
- }
- }
- else
- {
- mes "[Rebarev Doug]";
- mes "I am wondering how my members are doing by now...";
- mes "I cannot even remember when was the last time I saw them...";
- next;
- mes "[Rebarev Doug]";
- mes "Hmm? Why are you still here?";
- next;
- switch( select( "Where should I go?", "I am about to leave." ) )
- {
- case 1:
- mes "[Rebarev Doug]";
- mes "Well...I have no clue where they are.";
- mes "You might be able to find the information from the library.";
- close;
- break;
-
- case 2:
- mes "[Rebarev Doug]";
- mes "Oh, are you? I see... I am wondering what they have been doing ever since we're disbanded after the ^0000FFlast mission^000000...";
- set god_eremes,2;
- close;
- break;
- }
- }
- }
- else if(god_eremes > 3 && god_eremes < 18)
- {
- mes "[Rebarev Doug]";
- mes "Huh? Librarian didn't let you read the record?";
- mes "Umm...I guess if you try your best to convince him, he might change his mind.";
- next;
- mes "[Rebarev Doug]";
- mes "Even if things are tough nowadays, he's just a man with a heart...";
- next;
- mes "[Rebarev Doug]";
- mes "Please I beg you, please find how my members are doing...";
- close;
- }
- else if(god_eremes > 17 && god_eremes < 20)
- {
- if(god_megin_1 > 0 || god_megin_2 > 0 || god_megin_3 > 0 || god_megin_4 > 0 || god_megin_5 > 0 || god_megin_6 > 0)
- {
- mes "[Rebarev Doug]";
- mes "Oh...";
- mes "So did you meet them?";
- mes "Are they all okay?";
- next;
- mes "- You told him they are all okay other than lost their meomory and having migraines.-";
- close;
- }
- mes "- You told him what you have read from the record -";
- next;
- mes "- that where they are and how they are. -";
- next;
- mes "[Rebarev Doug]";
- mes "Oh! Have you read the record? I am glad to hear that!";
- mes "By the way...I don't trust what was wrote on paper since it's out of date...";
- next;
- mes "[Rebarev Doug]";
- mes "If it's possible, I hope you could go meet my members to find the latest news about them...";
- mes "I mean with your ^0000FFown eyes^000000!";
- next;
- mes "[Rebarev Doug]";
- mes "Please I beg you...please go find them.";
- next;
- mes "[Rebarev Doug]";
- mes "I beg you...please go find them.";
- mes "I cannot trust the old record...I am just being a poor old man who misses his friends.";
- close;
- }
- else if(god_eremes > 19 && god_eremes < 23)
- {
- mes "[Rebarev Doug]";
- mes "Oh~ welcome back.";
- mes "So did you see them all? It's been a while since I saw you last time.";
- mes "Umm? What? Why are you looking at me strange?";
- next;
- switch( select( "Ask him about the suspicion.", "This is not a right time to ask about the suspicion. wait." ) )
- {
- case 1:
- mes "- You tried to organize your thoughts about all those suspicions you have had -";
- next;
- mes "- such as all the members are not on the normal condition, -";
- next;
- mes "- they lost their memory partially -";
- next;
- mes "- and about Royal Myst's comment...-";
- next;
- mes "- Or who is Egnigem that all members talked about? -";
- next;
- mes "- All these thoughts clogged your brain so you were just talking aboutissues regarding the members that were not that important.-";
- next;
- mes "[Rebarev Doug]";
- mes "?!...I cannot understand what you're talking about...you're all over the place.";
- next;
- mes "[Rebarev Doug]";
- mes "Stop looking at me like that, talk to me something!";
- mes "If you are done with talking, let me excuse myself. I need to think of something.";
- next;
- mes "[Rebarev Doug]";
- mes "I appreciate you for delivering me the news of my members -";
- mes "Now, I need to go continue my research...under the commend of His Majesty.";
- mes "May God bless you.";
- set god_eremes,21;
- close;
- break;
-
- case 2:
- mes "- You pretended as nothing happened -";
- next;
- mes "- and told him about the members of the 1st squad in the 3rd platoon.-";
- next;
- mes "- Of course, you didn't tell him the whole truth but the stuffs you have read from the record plus some real news. -";
- next;
- mes "[Rebarev Doug]";
- mes "Hmm~ I see. I am so relieved to hear they are doing okay! Hahaha...";
- next;
- mes "- You felt the way of him looking at you have been slightly changed. It seemed he started guarding against you?-";
- next;
- mes "[Rebarev Doug]";
- mes "I appreciate you for delivering me the news of my members -";
- mes "Now, I need to go continue my research...under the commend of His Majesty.";
- mes "May God bless you.";
- next;
- mes "- You felt detestableness from his smile.-";
- set god_eremes,22;
- close;
- break;
- }
- }
- else if(god_eremes > 22 && god_eremes < 25)
- {
- mes "- While you were talking about the result of your travel, you mentioned of Egnigem.-";
- next;
- mes "- He didn't seem to be agitated as though he knew something more than I did.-";
- next;
- mes "[Rebarev Doug]";
- mes "It is too late to talk about the issue...";
- mes "even if I felt sorry for you to know that...?";
- mes "However...there is nothing left that you can prove.";
- mes "Giggle giggle giggle....";
- next;
- mes "[Rebarev Doug]";
- mes "No matter how hard you struggle,";
- mes "after all, the elite as me rules the world.";
- mes "Giggle giggle...let them roll over the floor as cold and rotten corpses! I do not care about the low!";
- next;
- mes "[Rebarev Doug]";
- mes "Do you hate me? Do you really hate me?";
- mes "Let me tell you what you can do.";
- next;
- mes "[Rebarev Doug]";
- mes "Take a look at my back. You will see a judge who is in charge of all the military crimes.";
- next;
- mes "[Rebarev Doug]";
- mes "It seems he will hold a trial if at least 100 people report a same crime...";
- mes "So, you can do it if you really want to reveal the issue to the public!";
- mes "Muhahahahaha!";
- close;
- }
- else if(god_eremes > 23 && god_eremes < 26)
- {
- mes "[Rebarev Doug]";
- mes "Bah...I didn't know you would actually did it.";
- mes "Hey...you will be sorry later...";
- mes "After all, the elite as me rules the world.";
- close;
- }
- else
- {
- mes "[Rebarev Doug]";
- mes "No matter how hard you struggle,";
- mes "after all, the elite as me rules the world.";
- mes "Giggle giggle...let them roll over the floor as cold and rotten corpses! I do not care about the low!";
- close;
- }
- }
- else
- {
- mes "[Rebarev Doug]";
- mes "You are not even at a level to speak to me.";
- mes "Even if you are an adventurer, you are supposed to have some experience and knowledge to have a conversation with me.";
- mes "don't you agree?";
- close;
- }
-}
-else
-{
- mes "[Rebarev Doug]";
- mes "We are crusaders who prepare a holy war under the will of Odin.";
- mes "As we did a thousand years ago, we are waiting for the day to eliminate demons from the world.";
- close;
-}
-
-}
-
-prt_castle.gat,48,164,0 script Crusader#God 734,{
-
-if($God1 > 49 && $God2 < 100)
-{
- if(god_eremes > 22 && god_eremes < 25)
- {
- mes "[Max Von Shedough]";
- mes "Welcome, friend!";
- mes "Here in the Prontera Castle, we Crusaders are busily preparing for the Holy War that is to come.";
- next;
- mes "[Max Von Shedough]";
- mes "Let me introduce myself. My name is Max Von Shedough, the military judge! Do you have any business with me?";
- next;
- mes "^3355FFYou handed Max Von Shedough the petition against Rebarev Doug based on your investigation with Egnigem.^000000";
- next;
- mes "[Max Von Shedough]";
- mes "Hm? This is serious.";
- mes "Alright, I will investigate your claim to the best of my ability.";
- next;
- mes "[Max Von Shedough]";
- mes "However, as of now, the petition you've just given me is considered classified information. Please keep this a military secret.";
-
- set $God2,$God2+1;
-
- if($God2 == 50)
- announce "The 2nd seal of [Megingjard] has appeared.",bc_all;
- else if($God1 > 99 && $God2 > 99 && $God3 > 99 && $God4 > 99)
- announce "The four seals have been released at the same time with the seals of [Megingjard].",bc_all;
- else if($God2 > 99)
- announce "The seals of [Megingjard] have been released.",bc_all;
-
- if(god_eremes == 23)
- set god_eremes,25;
- else if(god_eremes == 24)
- set god_eremes,26;
- close;
- }
- else if(god_eremes > 26)
- {
- mes "[Max Von Shedough]";
- mes "Unfortunately, I'm not sure if it's possible to hold a trial against Rebarev Doug.";
- next;
- mes "[Max Von Shedough]";
- mes "Regrettably, it seems that he still has too much influence. Still, let me assure you that I will be trying my best I am not sure if we will hold a trial with the document you have submitted or not...";
- next;
- mes "[Max Von Shedough]";
- mes "But count on me, I am trying my best to get him indicted.";
- close;
- }
- else
- {
- mes "[Max Von Shedough]";
- mes "Welcome, my friend! This is a sacred place to prepare the holy war, the crusader commander's room.";
- mes "Anyone who wishes to participate in the holy war will be welcomed!";
- close;
- }
-}
-else
-{
- mes "[Max Von Shedough]";
- mes "Welcome, my friend! This is a sacred place to prepare the holy war, the crusader commander's room.";
- mes "Anyone who wishes to participate in the holy war will be welcomed!";
- close;
-}
-
-}
-
-prt_in.gat,172,109,0 script A File#God1 111,{
-
-if(god_eremes == 12)
-{
- mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
- close;
-}
-else if(god_eremes > 6 && god_eremes < 12)
-{
- if(rand(1,10) > 6 && god_eremes > 6)
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- set god_eremes,god_eremes+1;
- close;
- }
- else
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- close;
- }
-}
-else if(god_eremes < 7)
-{
- mes "[Librarian Jekan]";
- if(Sex)
- mes "I'm sorry sir,";
- else
- mes "I'm sorry ma'am,";
- mes "but special authorization is required to browse that section. Otherwise, it's off limits.";
- close;
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-
-}
-
-prt_in.gat,170,109,0 script A File#God2 111,{
-
-if(god_eremes == 12)
-{
- mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
- close;
-}
-else if(god_eremes > 6 && god_eremes < 12)
-{
- if (rand(1,10) > 6 && god_eremes > 6)
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- set god_eremes,god_eremes+1;
- close;
- }
- else
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- close;
- }
-}
-else if(god_eremes < 7)
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-
-}
-
-prt_in.gat,168,109,0 script A File#God3 111,{
-
-if(god_eremes == 12)
-{
- mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
- close;
-}
-else if(god_eremes > 6 && god_eremes < 12)
-{
- if (rand(1,10) > 6 && god_eremes > 6)
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- set god_eremes,god_eremes+1;
- close;
- }
- else
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- close;
- }
-}
-else if(god_eremes < 7)
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-
-}
-
-prt_in.gat,169,109,0 script A File#God4 111,{
-
-if(god_eremes == 12)
-{
- mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
- close;
-}
-else if(god_eremes > 6 && god_eremes < 12)
-{
- if (rand(1,10) > 6 && god_eremes > 6)
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- set god_eremes,god_eremes+1;
- close;
- }
- else
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- close;
- }
-}
-else if(god_eremes < 7)
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-
-}
-
-prt_in.gat,166,109,0 script A File#God5 111,{
-
-if(god_eremes == 12)
-{
- mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
- close;
-}
-else if(god_eremes > 6 && god_eremes < 12)
-{
- if (rand(1,10) > 6 && god_eremes > 6)
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- set god_eremes,god_eremes+1;
- close;
- }
- else
- {
- mes "You found a shelf filled with many files.";
- mes "You started searching files one by one.";
- close;
- }
-}
-else if(god_eremes < 7)
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Please do not enter that section.";
- next;
- mes "- You stepped back as he told you to -";
- close;
-}
-
-}
-
-prt_in.gat,172,106,0 script Librarian#God 833,{
-
-if($God1 > 49 && $God2 < 100)
-{
- if(god_eremes > 2 && god_eremes < 7)
- {
- mes "[Librarian Jekan]";
- mes "Ah, please do not touch the files at this section.";
- next;
- mes "[Librarian Jekan]";
- mes "Some of the information there is classified, and it is therefore prohibited by the Prontera Military to browse through them.";
- next;
- mes "[Librarian Jekan]";
- mes "I'm currently in the process of searching for the classified files in that section, so that I can separate it from the information that is public domain, so I'd appreciate it if you didn't interfere with my work.";
- next;
- mes "[Librarian Jekan]";
- mes "Darn it! I can't read anything when the light is this dim! It's bad enough my eyes have gone bad...";
- next;
- mes "[Librarian Jekan]";
- mes "If you're looking for a book, you ought to go search through another section.";
- next;
- switch( select( "You have bad eyes?", "I want to read some documents.", "Let me help you find those files...", "What kind of files are you looking for?" ) )
- {
- case 1:
- mes "[Librarian Jekan]";
- mes "Since I have worked under a dim light for a long time, my eyes have gone bad.";
- mes "They should get me ^0000FFa new light^000000, otherwise I will be gone blind sooner or later...";
- if(god_eremes == 5 && ( countitem(2203) > 0 || countitem(1041) > 0 ) )
- {
- next;
- mes "[Librarian Jekan]";
- mes "?! Oh~ you have very useful stuff with you!";
- mes "Do you mind if I use the stuff for a while? It will be very helpful for me to find the files!";
- next;
- switch( select( "Yes, I do mind.", "No, I don't mind." ) )
- {
- case 1:
- mes "[Librarian Jekan]";
- mes "...bah. Never mind then.";
- close;
- break;
-
- case 2:
- mes "[Librarian Jekan]";
- mes "What a kind person you are!";
- mes "Now I can believe that you really meant to help me!";
- if(countitem(2203) && countitem(1041))
- {
- delitem 1041,countitem(1041);
- delitem 2203,1;
- }
- else if(countitem(2203))
- delitem 2203,1;
- else if(countitem(1041))
- delitem 1041,countitem(1041);
- set god_eremes,6;
- next;
- mes "[Librarian Jekan]";
- mes "Thank you, thank you so much. Now I can find the file with less worry.";
- mes "...if it's possible, I wish you could help me to find the file...can you?";
- break;
-
- }
- }
- else if(god_eremes > 5)
- {
- mes "[Librarian Jekan]";
- mes "Thank you. It will be a good help to find the file.";
- }
- close;
- break;
-
- case 2:
- if(god_eremes == 6)
- {
- mes "[Librarian Jekan]";
- mes "Read some documents? Well, you've come here to the Library. That's a good start.";
- next;
- mes "[Librarian Jekan]";
- mes "Well, as long as you know what kind of document you're looking for, you might be able to find it.";
- next;
- mes "[Librarian Jekin]";
- mes "Just keep in mind that this particular section is off limits for now. Why don't you check the files at the front?";
- next;
- mes "[Librarian Jekin]";
- mes "I've got to find that classified file as soon as I can!";
- set god_eremes,7;
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Hmm...?";
- mes "Hey, haven't";
- mes "I told you already?";
- next;
- mes "[Librarian Jekan]";
- mes "The public is prohibited from browsing the files in this section! How many times do I need to repeat myself?";
- close;
- }
- break;
-
- case 3:
- if(god_eremes == 4)
- {
- mes "[Librarian Jekan]";
- mes "Hmm. Well, I'd gladly accept your help if it weren't for the fact that I cannot allow classified information to be released to the public.";
- next;
- mes "[Librarian Jekan]";
- mes "I have no idea how something so important was shuffled into the files here in Prontera Library, but we can't allow the public to access it.";
- next;
- mes "[Librarian Jekan]";
- mes "Still, that file doesn't seem to be that important, but I still have to waste my time on finding it...";
- next;
- mes "[Librarian Jekan]";
- mes "Damn, my eyes are sore. Working as a government official is easy except for the times when the bureaucrats make you do stuff like this.";
- set god_eremes,5;
- close;
- }
- else if(god_eremes > 4)
- {
- mes "[Librarian Jekan]";
- mes "I think I'm going to go insane looking for this file...!";
- next;
- mes "[Librarian Jekan]";
- mes "Huh...?";
- mes "Did you just say that you wanted to help me? Sure, I'd appreciate it.";
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Um, you're not even supposed to know what kind of file I'm looking for. Even if you did, I'm not allowed to show you what's inside!";
- close;
- }
- break;
-
- case 4:
- mes "[Librarian Jekan]";
- mes "Hmm. I'm not really allowed to disclose any information related to that file. I'm sorry about that.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "But isn't";
- mes "the file about...";
- input @str$;
- mes "^0000FF" + @str$ + "?";
- next;
- if (@str$ == "The 3rd company personnel in&out record crews" || @str$ == "the 3rd company personnel in&out record crews")
- {
- mes "[Librarian Jekan]";
- mes "Hmm...?";
- mes "How did you";
- mes "know about that?";
- set god_eremes,4;
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Errmmm...";
- mes "I don't think so....?";
- close;
- }
- break;
- }
- }
- else if(god_eremes == 2)
- {
- mes "[Librarian Jekan]";
- mes "Ah, please do not touch files in this section. Usually, it's public domain but it seems that a classified file managed to get misplaced there.";
- next;
- mes "[Librarian Jekan]";
- mes "For now, I cannot let anyone without special authorization to look through that section. I must find that file and send it to the Prontera military as soon as I can.";
- next;
- mes "[Librarian Jekan]";
- mes "Ergh! This light isn't bright enough for my eyes. They're starting to get sore again...";
- next;
- mes "[Librarian Jekan]";
- mes "So what brings you here? If you're looking for something in particular, you should try another section.";
- next;
- switch( select( "I want to read some documents.", "Do you have bad eyes?", "Let me help you to find the files.", "What kind of files are you looking for?" ) )
- {
- case 1:
- mes "[Librarian Jekan]";
- mes "Grrrrrrr~ I told you already!";
- mes "Files at this section are not for public exhibition, okay?";
- mes "Why do you make me repeat the same thing over and over again?";
- close;
- break;
-
- case 2:
- mes "[Librarian Jekan]";
- mes "Since I have worked under a dim light for a long time, my eyes have gone bad.";
- mes "They should get me a new light, otherwise I will be gone blind sooner or later...";
- close;
- break;
-
- case 3:
- mes "[Librarian Jekan]";
- mes "Um? How do you know what file I am looking for?";
- mes "You don't even know what is written inside?";
- mes "Stop interrupting me, leave!";
- close;
- break;
-
- case 4:
- mes "[Librarian Jekan]";
- mes "Hmm. I am not supposed to reveal anything related to the file.";
- next;
- mes "[" + strcharinfo(0) + "]";
- mes "Isn't the file about...";
- input @str$;
- mes "[" + strcharinfo(0) + "]";
- mes "^0000FF" + @str$ + "?";
- next;
- mes "[Librarian Jekan]";
- mes "Maybe...";
- mes "Maybe not~";
- close;
- break;
-
- }
- }
- else if(god_eremes > 6 && god_eremes < 12)
- {
- if(rand(1,10) > 4)
- {
- mes "[Librarian Jekan]";
- mes "Hmm? So did you find it? I've been searching for that file for a long time, but I haven't been able to find it.";
- next;
- mes "[Librarian Jekan]";
- mes "I'll go ahead and search the right side, so do you think you could search the left?";
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Did you find it yet? All this time, and I still haven't been able to dig up that file.";
- next;
- mes "[Librarian Jekan]";
- mes "I'll go ahead and check the left side, so would you look for it in the middle or the right side?";
- close;
- }
- }
- else if(god_eremes == 12)
- {
- mes "[Librarian Jekan]";
- mes "Ah! There it is!";
- mes "Thank you so much! I'm glad to see that there are still kind and thoughtful people like you in the world.";
- next;
- mes "[Librarian Jekan]";
- mes "I really want to give you something to show you my gratitude, but I've got to send this back to the Prontera Military right away.";
- next;
- menu "I want to read the document.",-;
-
- mes "[Librarian Jekan]";
- mes "Oh, right, you mentioned that, didn't you? It doesn't seem seem so important, but I'm not really quite sure...";
- next;
- mes "[Librarian Jekan]";
- mes "Well, it couldn't hurt if I made a copy of this first for you to read, but first I'll need some materials.";
- next;
- mes "[Librarian Jekan]";
- mes "I'll even cast the search magic on it, so that it'll be just like the original. All right, I need the following things to make a copy...";
- next;
- mes "[Librarian Jekan]";
- mes "2 Slick Paper,";
- mes "1 Oil Paper,";
- mes "3 Squid Ink,";
- mes "3 Feather of Birds and";
- mes "20 Blue Gemstones.";
- next;
- mes "[Librarian Jekan]";
- mes "Please get those as soon as possible, and I'll be here making the other preparations to make a copy.";
- next;
- mes "[Librarian Jekan]";
- mes "Also, I'll keep this copy in the Library for you to read, and to prevent it from being leaked to the public. So you'll have to come visit each time you wish to read it.";
- next;
- mes "[Librarian Jekan]";
- mes "Okay, now...";
- mes "Come back here";
- mes "as soon as you can.";
- set god_eremes,13;
- close;
- }
- else if(god_eremes == 13)
- {
- if(countitem(7111) > 1 && countitem(7151) && countitem(1024) > 2 && countitem(916) > 2 && countitem(717) > 19)
- {
- mes "[Librarian Jekan]";
- mes "Oh, you came back. I didn't expect you to return here so quickly. Whatever's inside must be really important for you to know.";
- next;
- mes "[Librarian Jekan]";
- mes "Anyway, please give me a moment while I make that copy for you.";
- delitem 7111,2;
- delitem 7151,1;
- delitem 1024,3;
- delitem 916,3;
- delitem 717,20;
- set god_eremes,14;
- next;
- mes "[Librarian Jekan]";
- mes "Alright then...";
- mes "I'll see you in a bit.";
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Have you forgotten what you need to make a copy? Alright, let me tell you again...";
- next;
- mes "[Librarian Jekan]";
- mes "2 Slick Paper,";
- mes "1 Oil Paper,";
- mes "3 Squid Ink,";
- mes "3 Feather of Birds and";
- mes "20 Blue Gemstones.";
- next;
- mes "[Librarian Jekan]";
- mes "Please come back with those items as soon as you can.";
- close;
- }
- }
- else if(god_eremes > 13 && god_eremes < 16)
- {
- if(rand(1,10) > 4)
- {
- mes "[Librarian Jekan]";
- mes "Let me go over and review the document before I make a copy.";
- close;
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Let me go over and review the document before I make a copy.";
- set god_eremes,god_eremes+1;
- close;
- }
- }
- else if(god_eremes == 16)
- {
- mes "[Librarian Jekan]";
- mes "There you go. As I thought, the document didn't seem to contain any crucially important data.";
- next;
- mes "[Librarian Jekan]";
- mes "Just remember, this copy needs to stay in the Prontera Library. That means you have to come back if you need to read the document again.";
- set god_eremes,17;
- close;
- }
- else if(god_eremes > 16)
- {
- mes "[Librarian Jekan]";
- mes "Welcome, my friend!";
- mes "So, what do you need today?";
- next;
- switch( select( "Search words on the document.", "Quit searching.", "Converse." ) )
- {
- case 1:
- mes "- Search Magic Initiated -";
- mes "- Please enter a keyword. -";
- next;
- input @str$;
- if(@str$ == "Crusader" || @str$ == "crusader")
- {
- mes "- search with the keyword : Crusader -";
- mes "Crusader : Warriors that prepare themselves for a holy war. They are selected from well-experienced and religious swordsmen.";
- mes "Any data regarding the military power is confidential, cannot be searched.";
- next;
- mes "This document is specified with the personnel in&out record of the 3rd company.";
- set @godtemplib4,1;
- close;
- }
- else if((@str$ == "The 3rd company" || @str$ == "the 3rd company" || @str$ == "The third company") && @godtemplib4)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 3rd company : Crusaders.";
- mes "The 3rd comany is known as organized with the best members of crusaders,";
- mes "there have been no report regarding the personnel in&out record of this company. However,";
- next;
- mes "The 3rd squad in the 1st platoon of the 3rd comany was an exception of that case,";
- mes "the members of the 1st squad were all retired or transfered to other forces.";
- mes "Specific information can be searched within the article about the 1st platoon.";
- set @godtemplib1,1;
- close;
- }
- else if((@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon") && @godtemplib1)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 1st platoon : The 1st platoon of the 3rd company, Crusaders.";
- mes "Each company consists of 4 platoons, and this is only one record regarding the 3rd squad of the 1st platoon.";
- next;
- mes "Specific information can be searched within the article about the 3rd squad.";
- set @godtemplib2,1;
- close;
- }
- else if((@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad") && @godtemplib2)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 3rd squad : Crusaders.";
- mes "Member list who participated in ^0000FFthe last mission^000000.";
- next;
- mes "^0000FF : Rebarev Doug";
- mes " : Jack O";
- mes " : Zan.Huadoku";
- mes " : Cuaque Donon";
- mes " : Emma Searth";
- mes " : Royal Myst";
- mes " : The Nineball^000000";
- set @godtemplib3,1;
- if(god_eremes == 17)set god_eremes,18;
- close;
- }
- else if((@str$ == "The last mission" || @str$ == "the last mission") && @godtemplib3)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
- next;
- mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
- next;
- mes "During the mission, an unexpected incident happened.";
- mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
- next;
- mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
- mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
- next;
- mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
- next;
- mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
- mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
- next;
- mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
- mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
- next;
- mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
- mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
- close2;
- if(god_eremes == 18)set god_eremes,19;
- end;
- }
-
- else if((@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon") && @godtemplib4)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 1st platoon : The 1st platoon of the 3rd company, Crusaders.";
- mes "Each company consists of 4 platoons and this is the first of the four.";
- next;
- mes "The 1st platoon of the 1st company, Crusader force.";
- mes "Suggested to search 'Company' a higher rank keyword.";
- next;
- mes "Other information is confidential, cannot be searched on this document.";
- close;
- }
- else if((@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad") && @godtemplib1)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 3rd squad : Crusaders.";
- mes "Each platoon consists of 4 squads and this is the third of the four.";
- mes "Suggested to search 'Platoon' a higher rank keyword.";
- next;
- mes "Generally a squad has 8 members within.";
- mes "Other information is confidential, cannot be searched on this document.";
- close;
- }
- else if(@str$ == "The last mission" || @str$ == "the last mission")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "- No result has been found.-";
- mes "- Suggested to enter a specific name of the force for a better research.-";
- close;
- }
- else if((@str$ == "Crusader" || @str$ == "crusader") && @godtemplib4)
- {
- mes "- search with a keyword : " + @str$ + " -";
- mes "The 3rd company : Crusaders.";
- mes "The 3rd comany is known as organized with the best members of crusaders,";
- mes "there have been no report regarding the personnel in&out record of this company. However,";
- next;
- mes "The 3rd squad in the 1st platoon of the 3rd comany was an exception of that case,";
- mes "the members of the 1st squad were all retired or transfered to other forces.";
- mes "Specific information can be searched within the article about the 1st platoon.";
- close;
- }
- else if(@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 1st platoon : ";
- mes "- No result has been found.-";
- mes "- Suggested to enter a more specific keyword.-";
- close;
- }
- else if(@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The 3rd company : ";
- mes "- No result has been found.-";
- mes "- Suggested to enter a more specific keyword.-";
- close;
- }
- else if((@str$ == "The last mission" || @str$ == "the last mission") && god_eremes > 17) // ¸¶Áö¸· ÀÓ¹«
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "- No result has been found.-";
- mes "- Suggested to enter a specific name of the force for a better research.-";
- next;
- close;
- }
- else if(@str$ == "Rebarev Doug")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former leader of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Has been in service as an instructor of crusader boot camp with the Prontera Castle.";
- mes "Also he's in charge of a research under a command from the royal court.";
- close;
- }
- else if(@str$ == Egnigem)
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "No result has been found.";
- mes "No result has been found.";
- mes "No result has been found.";
- mes "No result has been found.";
- mes "No result has been found.";
- mes "No result has been found.";
- mes "^FF0000This word is prohibited to research.^000000";
- close;
- }
- else if(@str$ == "Zan.Huadoku")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Has been in service as a weapon quartermaster in Geffen ever since the squad was disbanded.";
- mes "Current location : Blacksmith guild, Geffen.";
- close;
- }
- else if(@str$ == "Cuaque Donon")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Retired from service and went back to his home town, Morroc ever since the squad was disbanded.";
- mes "Reported to work for an inn in Morroc.";
- close;
- }
- else if(@str$ == "Jack O")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Has been in service as a recruiting officer in Alberta ever since the squad was disbanded.";
- mes "Current location : Near Alberta port.";
- close;
- }
- else if(@str$ == "Emma Searth")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Retired from service and went to Al De Baran to do something different ever since the squad was disbanded.";
- mes "Reported to submit a resume to the Kafra corporation.";
- close;
- }
- else if(@str$ == "Royal Myst")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Has been in service in Comodo ever since the squad was disbanded.";
- mes "Current duty is unknown.";
- mes "Current lcation : A casino in Comodo.";
- close;
- }
- else if(@str$ == "The Nineball")
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
- mes "Has been in service as the security officer of Jawaii ever since the squad was disbanded.";
- mes "Current location : A tavern in Jawaii.";
- close;
- }
- else
- {
- mes "- search with the keyword : " + @str$ + " -";
- mes "- No result has been found.-";
- close;
- }
- break;
-
- case 2:
- mes "- Search magic is being shut down.-";
- next;
- mes "- There is no response from the search magic.-";
- mes "- Would you like to shut down immediately?-";
- next;
- mes " - If you shut down without properly closing the magic -";
- mes "- there is a high possibility to damage unsaved data. -";
- next;
- mes "- ... -";
- next;
- mes "- ...... -";
- next;
- mes "- ........search magic is being shut down. -";
- close;
- break;
-
- case 3:
- mes "[Librarian Jekan]";
- mes "You can tell our government doesn't really know how to allocate its funds and resources.";
- next;
- mes "[Librarian Jekan]";
- mes "First, there's Jawaii. Do newlyweds really need an entire island for themselves? Then again, I am single so I'm probably biased.";
- next;
- mes "[Librarian Jekan]";
- mes "And look at me. Geniuses aren't supposed to waste their precious time doing useless things for libraries!";
- close;
- break;
- }
- }
- else
- {
- mes "[Librarian Jekan]";
- mes "Ah, please do not touch any books in that section. ...I'm sure there's nothing there that could be useful to you.";
- next;
- switch( select( "Ignore him and check books.", "Step back." ) )
- {
- case 1:
- mes "[Librarian Jekan]";
- mes "Hey...!";
- mes "I thought I said";
- mes "not to touch those!";
- close2;
- warp "prontera.gat",120,264;
- end;
- break;
-
- case 2:
- mes "[Librarian Jekan]";
- mes "Thank you. Feel free to browse through the other sections.";
- next;
- mes "[Librarian Jekan]";
- mes "It's really nice to have visitors in the Library, especially when so many people don't read books nowadays.";
- close;
- break;
- }
- }
-}
-else
-{
- mes "[Librarian Jekan]";
- mes "Ah, please do not touch any books in that section.";
- mes "....there is nothing much useful for you there.";
- next;
- switch( select( "Ignore him and check books.", "Step back." ) )
- {
- case 1:
- mes "[Librarian Jekan]";
- mes "I told you not to touch books there!";
- close2;
- warp "prontera.gat",120,264;
- end;
- break;
-
- case 2:
- mes "[Librarian Jekan]";
- mes "Good, you may go check other sections though.";
- mes "It's good to see a man visiting a library when people don't read books nowadays.";
- close;
- break;
- }
-}
-
-}
-
-geffen_in.gat,109,161,3 script Crusader#God1 751,{
-
-if($God1 > 49 && $God2 < 100)
-{
- if(god_eremes > 17 && god_megin_1 < 2)
- {
- mes "[Zan.Huadoku]";
- mes "^333333*Phew...*^000000";
- mes "This work is really getting to me. Going on a mission with my war buddies sounds a lot better than this.";
- next;
- mes "[Zan.Huadoku]";
- mes "At least in those days, I felt like I was actually doing something useful!";
- next;
- mes "[Zan.Huadoku]";
- mes "Hey...";
- mes "Can I help you";
- mes "with anything?";
- next;
- switch( select( "Ask him about the 3rd squad.", "Ask him how he's been doing.", "Ask him about the 3rd Squad's last mission." ) )
- {
- case 1:
- if(god_eremes == 18)
- {
- mes "[Zan.Huadoku]";
- mes "Yeah, I was a member of the 3rd squad in the 1st platoon a long time ago. How did you know that?";
- next;
- mes "[Zan.Huadoku]";
- mes "I miss the guys back in the squad. I wonder how our leader's been doing recently...";
- next;
- mes "^3355FFYou tell Zan about Rebarev Doug, and about how he is now an instructor for Crusader Boot Camp. He seems to be absorbed in his thoughts of the past.^000000";
- close;
- }
- else if(god_eremes > 18)
- {
- mes "[Zan.Huadoku]";
- mes "Yeah, I was a member of the 3rd squad in the 1st platoon a long time ago. How did you know that?";
- next;
- mes "[Zan.Huadoku]";
- mes "I miss the guys back in the squad. I wonder how our leader's been doing recently...";
- next;
- mes "^3355FFYou tell Zan about Rebarev Doug, and about how he is now an instructor for Crusader Boot Camp. He seems to be absorbed in his thoughts of the past.^000000";
- next;
- mes "[Zan.Huadoku]";
- mes "...";
- mes "......";
- next;
- mes "[Zan.Huadoku]";
- mes "Before we went out on our last mission, the seven of us were like brothers and sisters. If ^FF0000he^000000 didn't disobey the order, we'd still be together today.";
- next;
- mes "[Zan.Huadoku]";
- mes "Wait, what was his name...? That's weird. There's no way I could forget something like that...";
- next;
- mes "[Zan.Huadoku]";
- mes "H-how can I not remember his name! He's the reason my life is...!";
- next;
- mes "[Zan.Huadoku]";
- mes "^333333*Groan...*^000000";
- mes "I.... My head...";
- mes "My head hurts...";
- next;
- mes "[Zan.Huadoku]";
- mes "^3355FFZan looks very confused and his eyes begin to glaze with a dazed look. You try speaking to him again, but he doesn't respond at all.^000000";
- if(!god_megin_1)set god_megin_1,1;
- close;
- }
- break;
-
- case 2:
- mes "[Zan.Huadoku]";
- mes "How am I been doing?";
- mes "Well, I work for the Blacksmith Guild, picking out good weapons to supply the Crusaders.";
- next;
- mes "[Zan.Huadoku]";
- mes "Sometimes, I get really bored with what I'm doing. I keep trying to convince myself that my job's important to future Crusaders, but...";
- next;
- mes "[Zan.Huadoku]";
- mes "You know what? A lot of people have been asking me weird questions about me recently. I feel like I'm getting spied on, but maybe I'm just getting paranoid.";
- close;
- break;
-
- case 3:
- if(god_eremes == 18)
- {
- mes "[Zan.Huadoku]";
- mes "Yeah, on our";
- mes "final mission...";
- next;
- mes "[Zan.Huadoku]";
- mes "Final...? What the? I know it happened, but for some reason, all I can envision is a complete blank when I try to think about it.";
- next;
- mes "[Zan.Huadoku]";
- mes "I...";
- mes "I guess I need something to remind me? I know it happened, but... I'm so confused.";
- next;
- mes "^3355FFZan seems to be having a very difficult time recalling that specific memory of his past.^000000";
- close;
- }
- else if(god_eremes > 18 && god_megin_1 > 0)
- {
- mes "[Zan.Huadoku]";
- mes "The last mission...";
- next;
- mes "[Zan.Huadoku]";
- mes "Umm...I cannot recall any memory about the mission...maybe I need a clue.";
- next;
- mes "- He seemed to have a hard time to remember something. -";
- next;
- mes "- You started telling him what you have read from the document.-";
- next;
- mes ".....";
- next;
- mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
- next;
- mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
- next;
- mes "During the mission, an unexpected incident happened.";
- mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
- next;
- mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
- mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
- next;
- mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
- next;
- mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
- mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
- next;
- mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
- mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
- next;
- mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
- mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
- next;
- mes ".....................";
- next;
- mes "............";
- next;
- mes ".....";
- next;
- mes "[Zan.Huadoku]";
- mes "Y-yeah that's right! And then three days after we started the mission, we found some kind of...";
- next;
- mes "[Zan.Huadoku]";
- mes "Well, I'm not sure what it was. But we found an ^0000FFunknown fragment^000000 that was a sign from God! And then...!";
- next;
- mes "[Zan.Huadoku]";
- mes "And then...";
- mes "Oh. Oh God.";
- mes "I can't remember...";
- next;
- mes "[Zan.Huadoku]";
- mes "I can't think about anything further than that. I can't even remember what we found. But I'm sure it was damned important.";
- next;
- mes "^3355FFZan stood still in silence, with a pained look on his face.^000000";
- if(god_megin_1 == 1)set god_megin_1,2;
- close;
- }
- else
- {
- mes "[Zan.Huadoku]";
- mes "The last mission...";
- next;
- mes "[Zan.Huadoku]";
- mes "Umm...I cannot recall any memory about the mission...maybe I need a clue.";
- next;
- mes "- He seemed to have a hard time to remember something. -";
- close;
- }
- break;
- }
- }
- else if(god_megin_1 > 1 && god_megin_1 < 3)
- {
- mes ".....................";
- next;
- mes "............";
- next;
- mes ".....";
- next;
- mes "[Zan.Huadoku]";
- mes "I recalled something.";
- mes "3 days later from the day we started our mission, we found ^0000FFan unknown fragment^000000 that was a sign of God!";
- mes "And then...";
- mes "And then...";
- mes "And then...";
- next;
- mes "[Zan.Huadoku]";
- mes "I am sorry...I cannot remember more than that...";
- mes "I cannot even remember what it was that we found...";
- mes "I have been suffering ^0000FFever since the 3 months^000000 later...";
- next;
- mes "- He stood still with a painful look on his face.-";
- set god_megin_1,3;
- close;
- }
- else if(god_megin_1 > 2)
- {
- mes "^3355FFGrabbing his head, tearing his hair and writhing in Agony, Zan kept repeating the same words over and over again...^000000";
- next;
- mes "[Zan.Huadoku]";
- mes "3 days later! We f-found some ^0000FFfragment^000000! It was G-God's sign! But why can't I remember?! Why?!";
- close;
- }
- else
- {
- mes "[Zan.Huadoku]";
- mes "Hey yo.";
- mes "Can I help you?";
- close;
- }
-}
-else
-{
- mes "[Zan.Huadoku]";
- mes "Good day!";
- mes "Do you know the";
- mes "importance of supply?";
- next;
- switch( select( "No.", "Yes!" ) )
- {
- case 1:
- mes "[Zan.Huadoku]";
- mes "Any military force or party needs their supplies to be replenished if they are to continue battling for a prolonged period of time.";
- next;
- mes "[Zan.Huadoku]";
- mes "For instance, let's say your group go on hunting without a healer. In this case, everyone would consume health restoration items, like potions.";
- next;
- mes "[Zan.Huadoku]";
- mes "Since you can only carry so many items at once, you'll eventually run out of potions.";
- next;
- mes "[Zan.Huadoku]";
- mes "But if one of your party members traveled between town and the hunting area, he could supply your party with new healing items.";
- next;
- mes "[Zan.Huadoku]";
- mes "Supplying your party in this way would let you hunt with less worry. For that duty, the Merchant class would be the best by using their Carts.";
- next;
- mes "[Zan.Huadoku]";
- mes "I suppose that's why I'm working here in the Blacksmith Guild. As weapon quartermaster, I'm obligated to provide supplies for the Crusader forces.";
- next;
- mes "[Zan.Huadoku]";
- mes "The Blacksmiths in this guild also help me provide high quality weapons for the Crusades as well.";
- next;
- mes "[Zan.Huadoku]";
- mes "If you happen to run out of health items while hunting, why don't you ask a Merchant for help?";
- next;
- mes "[Zan.Huadoku]";
- mes "Most likely, they will have some spare items and would be willing to share with you if you ask nicely enough.";
- next;
- mes "[Zan.Huadoku]";
- mes "I hope to see you later again! May Odin protect you on your journeys.";
- close;
- break;
-
- case 2:
- mes "[Zan.Huadoku]";
- mes "Oh...";
- mes "Well then.";
- mes "In that case.";
- next;
- mes "[Zan.Huadoku]";
- mes "Let me tell you about some useful knowledge I learned while working with the Blacksmiths.";
- next;
- mes "[Zan.Huadoku]";
- mes "A Blacksmith character's forging skills are affected by the DEX and LUK stats. DEX and LUK also affect the item creation skills for Alchemists.";
- next;
- mes "[Zan.Huadoku]";
- mes "Since I've been staying here in the Blacksmith guild, I'm trying to better understand Blacksmiths and develop a deeper appreciation of their work.";
- next;
- mes "[Zan.Huadoku]";
- mes "Alright then...";
- mes "Take it easy.";
- close;
- break;
- }
-}
-
-}
-
-morocc_in.gat,146,179,0 script Employee#God1 66,{
-
-if($God1 > 49 && $God2 < 100)
-{
- if(god_eremes > 17 && god_megin_2 < 1)
- {
- mes "^3355FFThe Inn Employee eyes you suspiciously.^000000";
- next;
- mes "[Inn Employee]";
- mes "May I help you?";
- next;
- mes "[Inn Employee]";
- mes "Excuse me.";
- mes "How can I help you?";
- next;
- input @str$;
- if (@str$ == "Cuaque Donon" || @str$ == "Cuaque" || @str$ == "Donon")
- {
- mes "[" + strcharinfo(0) + "]";
- mes "Do you happen to know a person named " + @str$ + " ...?";
- if (god_eremes == 18)
- {
- mes "[Inn Employee]";
- mes "I don't think I know that person. I guess that guy left before I started working here, maybe?";
- close;
- }
- else if(god_eremes > 18)
- {
- next;
- mes "^3355FFOnce you said that name, she immediately drew closer to you and began speaking in a low, threatening tone.^000000";
- next;
- mes "[Scary Inn Employee]";
- mes "Who the hell are you? If you try anything funny, I'll rip your heart out!";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "Why are you so curious?! Are you one of them?! How the hell did you find me?!";
- next;
- switch( select( "Rebarev Doug is wondering about you.", "I am wondering why he's hiding.", "Just a curiosity." ) )
- {
- case 1:
- if(rand(1,10) > 3)
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Hah!...yeah, I was told thousand times about that.";
- mes "That old must be afraid of the rumor spreaded to public...";
- mes "...he must be that desperate to send men to find me.";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "However!";
- mes "I am not in the mood for guiding you to him today!";
- next;
- mes "- As she released the grip of a sword, -";
- mes "- she hit you with might by the nape of your neck. -";
- close2;
- percentheal -100,0;
- end;
- }
- else
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Hah!...yeah, I was told thousand times about that.";
- mes "That old must be afraid of the rumor spreaded to public...";
- mes "...he must be that desperate to send men to find me.";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "Okay, I think it's the time to give out a hint to the old dog. But, you got only one chance to listen to me.";
- next;
- mes "- She whispered to your ears.-";
- mes "^0000FFAragham never hoarded upgrade items.^000000";
- set god_megin_2,1;
- close;
- }
- break;
-
- case 2:
- if(rand(1,10) > 4)
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Bah...since you are here, that means you know why he has hid himself in here.";
- mes "I cannot trust you as I saw you lying.";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "It's the time to go to bed!";
- mes "I am not in the mood for guiding you to him today!";
- next;
- mes "- As she released the grip of a sword, -";
- mes "- she hit you with might by the nape of your neck. -";
- close2;
- percentheal -100,0;
- }
- else
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Bah...since you are here, that means you know why he has hid himself in here.";
- mes "You're a sly dog, aren't you?";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "Well, I don't think a hint will do any harm. Somehow you don't look that dangerous.";
- next;
- mes "- She whispered to your ears.-";
- mes "^0000FFAragham never hoarded upgrade items.^000000";
- set god_megin_2,1;
- close;
- }
- break;
-
- case 3:
- if (rand(1,10) > 3)
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Just a curiosity? Hahaha!";
- mes "You have a lot of guts, don't you?";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "I am sorry to tell you this...but";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "You are the type of a man that";
- mes "I hate the most!";
- next;
- mes "- As she released the grip of a sword, -";
- mes "- she hit you with might by the nape of your neck. -";
- close2;
- percentheal -100,0;
- end;
- }
- else
- {
- mes "[Ms. Scary Inn Employee]";
- mes "Just a curiosity? Hahaha!";
- mes "You have a lot of guts, don't you?";
- next;
- mes "[Ms. Scary Inn Employee]";
- mes "Oh well, sometimes that can be looked as cute.";
- mes "Listen to me well, I am giving you only one chance.";
- next;
- mes "- She whispered to your ears.-";
- mes "^0000FFAragham never hoarded upgrade items.^000000";
- set god_megin_2,1;
- close;
- }
- break;
- }
- }
- }
- else
- {
- mes "[Inn Employee]";
- mes "......?";
- mes "I am sorry but I think you misunderstood something here.";
- close;
- }
- }
- else if(god_megin_2 > 0)
- {
- mes "[Inn Employee]";
- mes "How can I help you?";
- next;
- mes "[Inn Employee]";
- mes "Welcome to the inn.";
- mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
- next;
- mes "[Inn Employee]";
- mes "Usually you can visit inns in big towns.";
- mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
- next;
- mes "- She welcomed you with professional manner as though there was nothing happened. -";
- close;
- }
- else
- {
- mes "[Inn Employee]";
- mes "How can I help you?";
- next;
- mes "[Inn Employee]";
- mes "Welcome to the inn.";
- mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
- next;
- mes "[Inn Employee]";
- mes "Usually you can visit inns in big towns.";
- mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
- close;
- }
-}
-else
-{
- mes "[Inn Employee]";
- mes "How can I help you?";
- next;
- mes "[Inn Employee]";
- mes "Welcome to the inn.";
- mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
- next;
- mes "[Inn Employee]";
- mes "Usually you can visit inns in big towns.";
- mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
- next;
- mes "[Inn Employee]";
- mes "Oh, also I have a secret to tell you...";
- mes "I was told that the inn master is planning some kind of shady business.";
- next;
- mes "[Inn Employee]";
- mes " - I think it was called as 'the rest project for all' or something...";
- next;
- mes "[Inn Employee]";
- mes "But don't tell anyone that I told you this, please!";
- close;
-}
-
-}
-
-in_rogue.gat,243,61,0 script Suspicious Man#God 748,{
-
- if($God1 > 49 && $God2 < 100)
-{
- if(god_eremes == 18)
- {
- mes "[Cuaque Donon]";
- mes "Wha...what are you! How the hell did you come in here!";
- mes "Get away, get away from me!";
- mes "Geeeet awwwway!";
- close;
- }
- else if(god_eremes > 18)
- {
- if(god_megin_2 > 0 && god_megin_2 < 4)
- {
- mes "[Cuaque Donon]";
- mes "Wha...what are you! How the hell did you come in here!";
- mes "Get away, get away from me!";
- mes "Geeeet awwwway!";
- next;
- mes "- You tried your best to make him calm down and told him what you have found from the document.-";
- next;
- if (countitem(740) > 0 || countitem(741) > 0 || countitem(742) > 0 || countitem(743) > 0 || countitem(750) > 0 || countitem(751) > 0 || countitem(752) > 0 || countitem(753) > 0 || countitem(754) > 0 || countitem(7206) > 0 || countitem(7212) > 0)
- {
- mes "- You pulled out a doll and used it as though it spoke to him a story. -";
- }
- else
- {
- mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
- next;
- mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
- next;
- mes "During the mission, an unexpected incident happened.";
- mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
- next;
- mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
- mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
- next;
- mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
- next;
- mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
- mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
- next;
- mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
- mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
- next;
- mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
- mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
- next;
- mes "-You must find something that can make him calm down.-";
- next;
- mes "- As you saw him acting like a child, it would be a good idea to bring something that is attractive to children. -";
- close;
- }
-
- next;
- mes "- He was nodded his head and chewing his finger happily just like children do when they're happy. -";
- next;
- mes "- He seemed to be fine enough to be asked few questions.-";
- next;
- switch( select( "Ask him about the inn maid.", "Ask him how he's been doing.", "Ask him about the last mission of the 3rd squad." ) )
- {
- case 1:
- mes "[Cuaque Donon]";
- mes "She...she's my sister.";
- mes "And she's also a rogue.";
- mes "When I was retired from service....";
- next;
- mes "[Cuaque Donon]";
- mes ".................";
- next;
- mes "[Cuaque Donon]";
- mes "My family always expected more than I could do from me ever since I was born.";
- mes "That was why I volunteered to be a crusader.";
- mes "Crusader is not only a highly respectable but also a well-paying job...";
- mes "And I was retired from service.";
- next;
- mes "[Cuaque Donon]";
- mes "My sister was so upset at me...at that time.";
- mes "She is the only one I have...she was so upset";
- mes "at the fact that I messed up...";
- next;
- mes "[Cuaque Donon]";
- mes "And she got me a job in the inn";
- mes "even after yelling at me that I am worthless, she got me a job anyway.";
- next;
- mes "[Cuaque Donon]";
- mes "Since when, I have noticed that there have been many people visiting me for some reason.";
- mes "It seemed they wanted something from me...awwwwwwwwwww....my head..! My head is hurt!";
- next;
- mes "[Cuaque Donon]";
- mes "...I don't know what I have said to them.";
- mes "They were all excited at what I said and they tried to hurt me.";
- next;
- mes "[Cuaque Donon]";
- mes "So, she hid me here.";
- mes "But, I am so bored to be alone. A guy in the downstairs always do nothing but yelling at me...";
- mes "He always yells at me to leave.";
- next;
- mes "[Cuaque Donon]";
- mes "Even the rogue guild where my sister is in sometimes come to listen to me.";
- mes "And they are always excited just like the others and yell at me to say something I am supposed to know.";
- next;
- mes "[Cuaque Donon]";
- mes "I am telling you, I cannot remember anything!";
- mes "I know this place is safe from those dangerous people.";
- next;
- mes "[Cuaque Donon]";
- mes "She is the only one I have now...still I don't want her to be upset at me.";
- next;
- mes "[Cuaque Donon]";
- mes "She said I must tell the rogue guild guys what I know...otherwise they will not protect her and me any longer.";
- mes "She looked sad when she sad that...";
- if (god_megin_2 == 2)
- {
- next;
- mes "[Cuaque Donon]";
- mes "Oh, I remember something.";
- mes "She told me not to tell anyone but I am gonna tell you...";
- next;
- mes "- He whispered to your ears.-";
- next;
- mes "[Cuaque Donon]";
- mes "She said...it seems rogue guild wants something from me.";
- mes "So she's gonna send me good people that she trust and that can help me.";
- next;
- mes "[Cuaque Donon]";
- mes "But still this is the safest place to stay for a while.";
- mes "At the same time, I am always ready to run...";
- set god_megin_2,3;
- close;
- }
- close;
- break;
-
- case 2:
- mes "[Cuaque Donon]";
- mes "How have I been doing?";
- mes "I am afraid of the people visiting me with purpose.";
- next;
- mes "[Cuaque Donon]";
- mes "Rogue guild promised to protect me...but they scared the hell out of me sometimes by coming out of the floor without a warning.";
- mes "Ah, and my sister said she's gonna complain to my ex boss about something.";
- next;
- mes "[Cuaque Donon]";
- mes "She said I was okay before. But ever since I was retired from the service, I have acted strange...";
- next;
- mes "[Cuaque Donon]";
- mes "But he doesn't want to meet my sister...that's what she said. So she's gonna ask a help to her rogue guild to spread some kind of rumors...";
- mes "Like a rumor that anyone who volunteers to crusader through my ex boss will become retarded....";
- next;
- mes "[Cuaque Donon]";
- mes "That's how I have been recently.";
- if (god_megin_2 == 1) set god_megin_2,2;
- close;
- break;
-
- case 3:
- mes "[Cuaque Donon]";
- mes "I don't know...I cannot remember it...";
- if (god_megin_2 == 3)
- {
- next;
- mes "[Cuaque Donon]";
- mes "?!... Wait, I just remembered a thing...";
- mes "I saw ^0000FFMegingjard^000000. That thing looked like a fragment of something, but I knew its name was Megingjard without being told.";
- next;
- if (rand(1,10) > 4)
- {
- switch( select( "^FF0000Megingjard^000000!", "^FFFFFFListen to him quitely^000000." ) )
- {
- case 1:
- mes "[Cuaque Donon]";
- mes "Waaaaaaaaaaaaahhhhhhh!";
- mes "You are same as others! Go away from me!";
- set god_megin_2,0;
- close;
- break;
-
- case 2:
- mes "[Cuaque Donon]";
- mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
- mes "I was keeping a night watch and happened to hear thm arguing.";
- next;
- mes "[Cuaque Donon]";
- mes "I cannot remember anything other than that.";
- set god_megin_2,4;
- close;
- break;
- }
- }
- else
- {
- switch( select( "^FF0000Megingjard^000000!", "^FFFFFFMegingjard!^000000.", "^FFFFFFListen to him quitely^000000" ) )
- {
- case 1:
- mes "[Cuaque Donon]";
- mes "Waaaaaaaaaaaaahhhhhhh!";
- mes "You are same as others! Go away from me!";
- set god_megin_2,0;
- close;
- break;
-
- case 2:
- mes "[Cuaque Donon]";
- mes "Waaaaaaaaaaaaahhhhhhh!";
- mes "You are same as others! Go away from me!";
- set god_megin_2,0;
- close;
- break;
- case 3:
- mes "[Cuaque Donon]";
- mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
- mes "I was keeping a night watch and happened to hear thm arguing.";
- next;
- mes "[Cuaque Donon]";
- mes "I cannot remember anything other than that.";
- set god_megin_2,4;
- close;
- break;
- }
- }
- }
- close;
- break;
- }
- }
- else if(god_megin_2 == 4)
- {
- mes "[Cuaque Donon]";
- mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
- mes "I was keeping a night watch and happened to hear thm arguing.";
- next;
- mes "[Cuaque Donon]";
- mes "I cannot remember anything other than that.";
- next;
- mes "[Cuaque Donon]";
- mes "Sleepy...my head is hurting. I want to rest now...";
- close;
- }
- else
- {
- mes "[Cuaque Donon]";
- mes "Wha...what are you! How the hell did you come in here!";
- mes "Get away, get away from me!";
- mes "Geeeet awwwway!";
- close;
- }
- }
-}
- else
-{
- mes "[Cuaque Donon]";
- mes "Wha...what are you! How the hell did you come in here!";
- mes "Wahhhhh! My head...my head is hurting so bad!";
- mes "I am scared! I am scared!";
- close;
-}
-
-}
-
-alberta.gat,196,146,0 script Crusader#megin2 751,{
-
- if ($God1 > 49 && $God2 < 100)
-{
- if(god_eremes == 18)
- {
- mes "[Jack O]";
- mes "^333333*Yawn...*^000000";
- mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
- next;
- mes "[Jack O]";
- mes "Eh...?";
- next;
- switch( select( "Ask him about Rebarev Doug.", "Ask him how he's been doing.", "Ask him about the last mission of the 3rd squad." ) )
- {
- case 1:
- mes "[Jack O]";
- mes "Ah! Yeah, our old leader back in the 3rd Squad. Heh. I haven't seen him since we were disbanded.";
- close;
- break;
-
- case 2:
- mes "[Jack O]";
- mes "Me? Yeah, I'm always busy recruiting future Crusaders.";
- mes "We always welcome Swordmen";
- mes "of great ability!";
- next;
- mes "[Jack O]";
- mes "How does it sound? Why don't you volunteer to become a Crusader?";
- close;
- break;
-
- case 3:
- mes "[Jack O]";
- mes "Last mission?";
- mes "Eh, I don't really remember it.";
- close;
- break;
- }
- }
- else if(god_eremes > 18)
- {
- if (god_megin_3 == 0 || god_megin_3 == 1)
- {
- mes "[Jack O]";
- mes "*yawn*...so boring.";
- mes "Let's see...if there is any swordsman I can recruit...?";
- next;
- mes "[Jack O]";
- mes "Umm...?";
- next;
- switch( select( "Ask him about Rebarev Doug.", "Ask him how he's been doing.", "Ask about 3rd Squad's final mission." ) )
- {
- case 1:
- if (god_megin_3 == 1)
- {
- mes "[Jack O]";
- mes "Ah right. Our old leader.";
- mes "Now I remember: He was";
- mes "a pretty self righteous jerk";
- mes "now that I think about it!";
- next;
- mes "[Jack O]";
- mes "Can you believe he used to say that ^0000FFno one is more religious than him in this world^000000?! That's egoism right there. And maybe insanity.";
- next;
- mes "[Jack O]";
- mes "Anyway, everyone in the squad";
- mes "took pride in their faith. When";
- mes "you're having a rough time in the";
- mes "real world, you depend on religion, you know?";
- next;
- mes "[Jack O]";
- mes "Anyways, in the records about";
- mes "our squad, it says that one of us was punished for insubordination, rebelling or something. That's";
- mes "a complete lie.";
- next;
- mes "[Jack O]";
- mes "During our final mission,";
- mes "our old leader had a huge argument with one us over something we found. I remember it being some kind of godly artifact, but I can't clearly remember what it was.";
- next;
- mes "[Jack O]";
- mes "Although there was an obvious dispute, I think it was our squad leader who was out of line.";
- mes "I... I can't really say...";
- next;
- mes "[Jack O]";
- mes "I can't for the life of me";
- mes "remember how the guy who";
- mes "argued with the squad leader";
- mes "looked like. The higher-ups";
- mes "musta did something to me...";
- next;
- mes "[Jack O]";
- mes "Anyway, I know for sure that whatever that guy did, it wasn't insubordination. In fact, I think he might've been right!";
- next;
- mes "[Jack O]";
- mes "That's all I can remember.";
- mes "I better take some Green Herbs now. My head throbs like crazy whenever I think about that time.";
- set god_megin_3,2;
- close;
- }
- else
- {
- mes "[Jack O]";
- mes "Ah! Yeah, our old leader back in the 3rd Squad. Heh. I haven't seen him since we were disbanded.";
- close;
- }
- break;
-
- case 2:
- mes "[Jack O]";
- mes "Me? Yeah, I'm not doing so bad. Keeping busy recruiting future Crusaders. We welcome all";
- mes "Swordmen if they show potential~";
- close;
- break;
-
- case 3:
- mes "[Jack O]";
- mes "Huh...?";
- mes "Why would";
- mes "you want to know?";
- next;
- mes "- You told him what you have found from the document. -";
- next;
- mes "^0000FFThe last mission of the 3rd squad^000000";
- mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
- next;
- mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
- next;
- mes "During the mission, an unexpected incident happened.";
- mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
- next;
- mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
- mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
- next;
- mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
- next;
- mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
- mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
- next;
- mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
- mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
- next;
- mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
- mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
- next;
- mes "^3355FFAs he listened to the record of the 3rd Squad, Jack O looked a little confused.^000000";
- next;
- mes "[Jack O]";
- mes "Huh...?";
- mes "I might not be able to remember";
- mes "a whole lot from back then, but the part about ^0000FFinsubordination^000000 can't be right. I'm sure of that.";
- if (god_megin_3 == 0) set god_megin_3,1;
- close;
- break;
- }
- }
- else if (god_megin_3 == 2)
- {
- mes "[Jack O]";
- mes "Our old leader was";
- mes "so arrogant to the point";
- mes "of being a little off his rocker.";
- next;
- mes "[Jack O]";
- mes "I mean, normal people";
- mes "don't say things like '^0000FFI am the most religious man in the universe! Kneel before me!^000000' Yeah. Not a normal thing to say.";
- next;
- mes "[Jack O]";
- mes "Anyway, if the squad";
- mes "leader punished anyone for insubordination, I'm sure that it was unwarranted. I don't remember too much, but I'm sure of that.";
- next;
- mes "[Jack O]";
- mes "Excuse me, I need to take some Green Herbs. Taking these seems";
- mes "to be the only thing that works for my headache.";
- next;
- mes "^3355FFJack O busily chewed";
- mes "on some Green Herbs.";
- mes "It seemed to greatly relieve him from the pain of his headaches.^000000";
- close;
- }
- else
- {
- mes "[Jack O]";
- mes "^333333*Yawn...*^000000";
- mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
- close;
- }
- }
- else
- {
- mes "[Jack O]";
- mes "Hey kid!";
- mes "Ever think about";
- mes "bein' a Crusader?";
- close;
- }
-}
- else
-{
- if (Class == Job_Swordman)
- {
- mes "[Jack O]";
- mes "Hey kid!";
- mes "Ever think about";
- mes "bein' a Crusader?";
- next;
- mes "[Jack O]";
- mes "Basically, you'd be volunteering to be part of our military, as well as train for the Holy War.";
- next;
- mes "[Jack O]";
- mes "If you have some faith and know how to wield a sword, you'll be more than welcome here.";
- next;
- mes "[Jack O]";
- mes "Just think about my suggestion";
- mes "and come back if you're interested. Alright then, see you later~";
- close;
- }
- else
- {
- mes "[Jack O]";
- mes "^333333*Yawn...*^000000";
- mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
- next;
- mes "[Jack O]";
- mes "Huh...?";
- mes "Are you interested in knowing more about Crusaders? Hahaha, I guess that must be the case.";
- next;
- mes "[Jack O]";
- mes "By the way, bring a doll to";
- mes "the kid in front of me. If you're lucky, she'll give you something neat in return. What it is, I don't know. I've got no dolls.";
- next;
- mes "[Jack O]";
- mes "In accordance with the Crusader code, I'm not supposed to lie. So yeah, you can trust me!";
- close;
- }
-}
-
-}
-
-aldebaran.gat,66,213,0 script Lady#megin 69,{
-
- if ($God1 > 49 && $God2 < 100)
-{
- if(god_eremes == 18)
- {
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
- mes "if I can wait much longer to join the Kafra Corporation.";
- close;
- }
- else if(god_eremes > 18 && god_eremes < 26)
- {
- if (god_megin_4 < 2)
- {
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
- mes "if I can wait much longer to join the Kafra Corporation.";
- next;
- mes "[Emma Searth]";
- mes "Oh, an adventurer! I actually used to work in the same field that you do. More specifically, I used to be a Crusader.";
- next;
- mes "[Emma Searth]";
- mes "My name is Emma Searth. Right now, I'm following my dream and applying to be a Kafra Lady. So my days of wielding a sword are over.";
- next;
- mes "[Emma Searth]";
- mes "Sadly, I haven't succeeded yet because I was diagnosed with";
- mes "some weird ^0000FFamnesia^000000.";
- next;
- mes "[Emma Searth]";
- mes "Of course, I understand that";
- mes "Kafra Corporation is a large, professional company, but";
- mes "if I can work for them even if it's just part-time...";
- next;
- mes "[Emma Searth]";
- mes "Is it that big of a problem?";
- mes "I suppose they're worried";
- mes "that I'd forget important customer information once I'm hired.";
- next;
- mes "[Emma Searth]";
- mes "It's strange. When I was";
- mes "a Crusader, I remembered";
- mes "everything lucidly, and I never had any problems recalling the past.";
- next;
- mes "[Emma Searth]";
- mes "But now I get these migraines whenever I try to focus on my memories from those times";
- mes "when I used to fight in the Prontera Military.";
- next;
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000";
- next;
- switch( select( "About her past.", "Why be a Kafra Lady?", "About memories she can remember." ) )
- {
- case 1:
- if (countitem(7015) > 0)
- {
- mes "^3355FFThe scent of your";
- mes "Memory Bookmark";
- mes "seems to bring clarity";
- mes "to her thoughts.^000000";
- next;
- mes "[Emma Searth]";
- mes "I was born in a wealthy family where I was raised to learn etiquette, fencing, Peco riding, and music lessons since I was";
- mes "born. I suppose you can say I'm pretty well educated.";
- next;
- mes "[Emma Searth]";
- mes "However, my parents weren't";
- mes "pleased when they learned that I wanted to become a Kafra Lady.";
- next;
- mes "[Emma Searth]";
- mes "My parents insisted that";
- mes "I become a Sage or a Scholar.";
- mes "In the end, I ended up running";
- mes "away from them by joining the Crusaders.";
- next;
- mes "[Emma Searth]";
- mes "Luckily, the Crusaders were advertising their recruitment at the time, so I took that chance. Plus, having military experience might even help me join Kafra!";
- next;
- mes "[Emma Searth]";
- mes "Since I did so well in Boot Camp,";
- mes "I got the chance to join an elite squad. My squad was often assigned difficult missions, and we never failed to complete those.";
- next;
- mes "[Emma Searth]";
- mes "Eventually, my reputation as a female Crusader, and being in a respectable military position, was enough to satisfy my family.";
- next;
- mes "[Emma Searth]";
- mes "But after that day,";
- mes "everything went wrong.";
- mes "I only remember that it";
- mes "was very sad and depressing.";
- mes "Somehow, I feel like we were";
- mes "even betrayed...";
- next;
- mes "[Emma Searth]";
- mes "I think I can";
- mes "try to remember";
- mes "my comrades...";
- set god_megin_4,1;
- close;
- }
- else
- {
- mes "[Emma Searth]";
- mes "Ah, let's not talk about it. It's too depressing. Maybe if you had some sort of ^0000FFmemory^000000 aid, I might be able to recall my forgotten past. Anything, like a reminder, a scheduler, a bookmark, a string...";
- close;
- }
- break;
-
- case 2:
- mes "[Emma Searth]";
- mes "One day, I happened to see Ms. Leilah at work here in Al De Baran. She was shining with confidence and commanded respect, even from her customers!";
- next;
- mes "[Emma Searth]";
- mes "She carried herself like a professional, no matter what the situation. Even though I knew she was tired from working in the summer heat, she made everything look effortless!";
- next;
- mes "[Emma Searth]";
- mes "When the male customers try to flirt with her, she never loses her poise. She just adjusts her glasses and does what she needs to do.";
- next;
- mes "[Emma Searth]";
- mes "To me, she's like a lone, guardian angel. At that moment, it seemed the world existed just to be mocked by Ms. Leila.";
- next;
- mes "[Emma Searth]";
- mes "I've also heard that Kafra Ladies are always traveling around the world, which is something I've always dreamed of doing.";
- next;
- mes "[Emma Searth]";
- mes "Ms. Leilah is my idol,";
- mes "and she's the reason why";
- mes "I want to become a Kafra Lady.";
- close;
- break;
-
- case 3:
- if (countitem(511) > 0 && god_megin_3 > 1)
- {
- mes "^3355FFEmma Searth clutches her head and winces as she suffers from another migraine.^000000";
- next;
- mes "^3355FFRemembering that a Green Herb was able to relieve Jack O, you gave a Green Herb to Emma. She takes it, and looks a little more relaxed.^000000";
- next;
- mes "[Emma Searth]";
- mes "I'm not even sure";
- mes "how much I can remember";
- mes "and how much I've actually";
- mes "forgotten.";
- next;
- mes "[Emma Searth]";
- mes "Let me...";
- mes "Try to remember every one in our squad. Let's see, there was Jack O, The Nineball. Z-Zan. Zan.H-Huadoku. C-Cuaque Donon. Myself. Um, E... Eni... Egni... Um...";
- next;
- mes "[Emma Searth]";
- mes "Egni...";
- mes "Egnigem?^000000";
- mes "Who was that?";
- mes "Oh no. I'm sure he might";
- mes "have, no, was there someone";
- mes "named that with us?";
- close2;
- set god_megin_4,2;
- end;
- }
- else
- {
- mes "^3355FFEmma Searth clutches her head and winces as she suffers from another migraine.^000000";
- next;
- mes "[Emma Searth]";
- mes "I'm not even sure";
- mes "how much I can remember";
- mes "and how much I've actually";
- mes "forgotten.";
- close;
- }
- break;
- }
- }
- else if(god_megin_4 > 1)
- {
- mes "[Emma Searth]";
- mes "^0000FFJack O, The Nineball, Zan.Huadoku, Cuaque Donon, Egnigem.^000000 Oh, I really miss those guys...";
- close;
- }
- else
- {
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
- mes "if I can wait much longer to join the Kafra Corporation.";
- close;
- }
- }
- else if (god_eremes == 25)
- {
- mes "[Emma Searth]";
- mes "Egnigem...";
- mes "That name makes";
- mes "me so sad. I'm not";
- mes "quite sure why, but...";
- close;
- }
- else if (god_eremes == 26 || god_eremes == 27)
- {
- mes "[Emma Searth]";
- mes "Egnigem...";
- mes "That name makes";
- mes "me so sad. I'm not";
- mes "quite sure why, but...";
- next;
- mes "^3355FFEmma turns away before you can see her cry. Still, her shoulders heave with each sob as you imagine the hardship she's had to endure.^000000";
- next;
- mes "[Emma Searth]";
- mes "I wish I knew what that name really means. I'm sure it's linked to an important memory from my past.";
- next;
- mes "[Emma Searth]";
- mes "I really appreciate you coming here to talk to me about the old days. I, I want you to have this.";
- set god_eremes,28;
- getitem 603,1;
- if (BaseLevel < 56)
- set BaseExp,BaseExp + 27000;
- else if (BaseLevel > 55 && BaseLevel < 61)
- set BaseExp,BaseExp + 30000;
- else if (BaseLevel > 60 && BaseLevel < 66)
- set BaseExp,BaseExp + 56052;
- else if (BaseLevel > 65 && BaseLevel < 71)
- set BaseExp,BaseExp + 82233;
- else if (BaseLevel > 70 && BaseLevel < 76)
- set BaseExp,BaseExp + 212271;
- else if (BaseLevel > 75 && BaseLevel < 81)
- set BaseExp,BaseExp + 390738;
- else if (BaseLevel > 80 && BaseLevel < 86)
- set BaseExp,BaseExp + 451020;
- else if (BaseLevel > 85 && BaseLevel < 91)
- set BaseExp,BaseExp + 546156;
- else if (BaseLevel > 90)
- set BaseExp,BaseExp + 1220358;
- close;
- }
- else if (god_eremes == 28)
- {
- mes "[Emma Searth]";
- mes "Egnigem...";
- mes "That name makes";
- mes "me so sad. I'm not";
- mes "quite sure why, but...";
- next;
- mes "^3355FFEmma turns away before you can see her cry. Still, her shoulders heave with each sob as you imagine the hardship she's had to endure.^000000";
- close;
- }
- else
- {
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
- mes "if I can wait much longer to join the Kafra Corporation.";
- close;
- }
-}
- else
-{
- mes "[Emma Searth]";
- mes "I hear the Kafra Ladies always travel around the world, something I've always dreamed of doing! Hopefully, one of these days, I'll be able to work for the Kafra Corporation too.";
- next;
- mes "[Emma Searth]";
- mes "^333333*Sigh...*^000000";
- mes "Still, it's discouraging. I haven't heard anything from them...";
- close;
-}
-
-}
-
-cmd_in02.gat,190,94,3 script Man#megin 828,{
-
- if ($God1 > 49 && $God2 < 100)
-{
- if (god_eremes == 18)
- {
- mes "[Royal Myst]";
- mes "Wha...?";
- mes "You wanna talk?";
- next;
- mes "[Royal Myst]";
- mes "What am I, your personal psychiatrist?! Lemme alone,";
- mes "I'm busy here! Awright, now";
- mes "which one do I bet on...?";
- next;
- switch( select("Speak of Rebarev Doug.", "Speak of the 3rd squad.", "Talk about gambling.", "Discuss hobbies.") )
- {
- case 1:
- mes "[Royal Myst]";
- mes "Wha--? Him again?! Tell him I'm fine! Dandy, even! Why's he gotta send all these people just to ask";
- mes "a silly question?";
- close;
- break;
- case 2:
- mes "[Royal Myst]";
- mes "3rd squad? Yeah, I used to be in that. All of us in the squad used to be real good buddies too.";
- next;
- mes "[Royal Myst]";
- mes "Zan.Huadoku, Cuaque Donon,";
- mes "Jack O, Emma Searth and The Nineball. Yeah... I wonder what they're all up to?";
- close;
- break;
- case 3:
- mes "[Royal Myst]";
- mes "Gambling? I love it, you";
- mes "know? Eh, I don't win all the time, but I love it the most when I leave with more Zeny than I came in with! Hahaha!";
- close;
- break;
- case 4:
- mes "[Royal Myst]";
- mes "Hobbies?";
- mes "What, you comin'";
- mes "on to me?";
- next;
- mes "[Royal Myst]";
- mes "A man's hobby is drinking, or didn't you know that? I happen to be real good at it too! Mwahahaha!";
- close;
- break;
- }
- }
- else if (god_eremes > 18 && god_eremes < 21)
- {
- if (god_megin_6 == 0 && god_megin_5 > 4 && god_megin_4 > 1 && god_megin_3 > 1 && god_megin_2 > 3 && god_megin_1 > 2)
- {
- mes "[Royal Myst]";
- mes "Wha...?";
- mes "You wanna talk?";
- next;
- mes "[Royal Myst]";
- mes "What am I, your personal psychiatrist?! Lemme alone,";
- mes "I'm busy here! Awright, now";
- mes "which one do I bet on...?";
- next;
- }
- else if(god_megin_6 > 0)
- {
- mes "[Royal Myst]";
- mes "Hmm?";
- mes "What's up?";
- next;
- }
- else
- {
- mes "[Royal Myst]";
- mes "Wha...?";
- mes "You wanna talk?";
- next;
- mes "[Royal Myst]";
- mes "What am I, your personal psychiatrist?! Lemme alone,";
- mes "I'm busy here! Awright, now";
- mes "which one do I bet on...?";
- close;
- }
- if (god_megin_6 < 16)
- {
- switch( select("Speak of Rebarev Doug.", "Speak of the 3rd squad.", "Talk about gambling.", "Discuss hobbies.") )
- {
- case 1:
- if (god_megin_6 == 0)
- {
- mes "[Royal Myst]";
- mes "Huh? What's that old geezer want this time? Tell 'em I'm fine, dandy even! Why the hell does he keep sending people...";
- set god_megin_6,1;
- close;
- }
- else if (god_megin_6 > 0 && god_megin_6 < 15)
- {
- mes "[Royal Myst]";
- mes "What the hell!? Stop talking about him! I never wanna see his face again! Tell him to leave me the hell alone!";
- close;
- }
- else if (god_megin_6 > 14)
- {
- mes "[Royal Myst]";
- mes "Damn geezer...";
- mes "How much is he being paid for studying what we all found?! Eh, somehow, I don't care as long as";
- mes "he pays me...";
- next;
- mes "[Royal Myst]";
- mes "Yeah...";
- mes "I just don't";
- mes "care anymore.";
- close;
- }
- break;
- case 2:
- if (god_megin_6 < 15)
- {
- mes "[Royal Myst]";
- mes "3rd squad? Yeah, I used to be in that. All of us in the squad used to be real good buddies too.";
- next;
- mes "[Royal Myst]";
- mes "Zan.Huadoku, Cuaque Donon,";
- mes "Jack O, Emma Searth and The Nineball. Yeah... I wonder what they're all up to?";
- close;
- }
- else if (god_megin_6 > 14)
- {
- mes "[Royal Myst]";
- mes "3rd squad?";
- mes "Don't know, don't care~";
- mes "Do I look like a stupid Crusader?";
- close;
- }
- else
- break;
- case 3:
- if (god_megin_6 < 15)
- {
- mes "[Royal Myst]";
- mes "Gambling? ! Oh man...";
- mes "I love gambling, you know!";
- mes "Heh, but I haven't been lucky enough to win yet. Hahaha~!";
- close;
- }
- else if (god_megin_6 > 14)
- {
- mes "[Royal Myst]";
- mes "Gambling...!";
- mes "Heh heh! Some risks you take,";
- mes "and others you really shouldn't.";
- mes "I can't help but feel sorry for that guy, E--";
- next;
- mes "[Royal Myst]";
- mes "Ergh...?";
- mes "Damn, I can never remember his name. You'd think I wouldn't forget the guy whose rap I'm taking but... Eh, I'll remember once I sober up.";
- next;
- mes "[Royal Myst]";
- mes "Hey, what do you think happens to Crusaders when they're framed and killed, huh? Where exactly do they go? Niflheim, Vahalla...?";
- set god_eremes,20;
- close;
- }
- break;
- case 4:
- if (god_megin_6 == 0)
- {
- mes "Hobbies?";
- mes "What, you comin'";
- mes "on to me?";
- next;
- mes "[Royal Myst]";
- mes "A man's hobby is drinking, or didn't you know that? I happen to be real good at it too! Mwahahaha!";
- close;
- }
- else if (god_megin_6 > 0 && god_megin_6 < 15)
- {
- if (countitem(970) > 0)
- {
- mes "[Royal Myst]";
- mes "Speaking of which,";
- mes "I haven't had a drink";
- mes "for a looong time. Almost";
- mes "a couple hours now.";
- next;
- mes "[Royal Myst]";
- mes "Oooh, looks like you've got a tasty beverage I can enjoy. Bwahahaha! Gimmie~!";
- next;
- mes "^3355FFBefore you can even think,";
- mes "Royal Myst dips his hand into your inventory and helps himself to an Alcohol.^000000";
- delitem 970,1;
- set god_megin_6,god_megin_6 +2;
- close;
- }
- else
- {
- mes "[Royal Myst]";
- mes "Why mention it? You gonna bring me something I'll like? Cuz I'm more than willing to take it! Bwahahaha!";
- close;
- }
- }
- else if (god_megin_6 > 14)
- {
- mes "[Royal Myst]";
- mes "^333333*Hiccup*^000000 Oh yeah, this is the stuff. Not like that imitation junk they've been serving at the Bars nowadays...";
- next;
- mes "[Royal Myst]";
- mes "Hey! There anything you wanna";
- mes "know about me? You did me a favor, so I'll tell you anything! Eeeeeverythiiing~~!!";
- close;
- }
- break;
- }
- }
- }
- else
- {
- mes "[Royal Myst]";
- mes "Eh heh heh~";
- mes "I just know";
- mes "I'm gonna win";
- mes "this time!";
- close;
- }
-}
- else
-{
- mes "[Royal Myst]";
- mes "Wha...?";
- mes "You wanna talk?";
- next;
- mes "[Royal Myst]";
- mes "What am I, your personal psychiatrist?! Lemme alone,";
- mes "I'm busy here! Awright, now";
- mes "which one do I bet on...?";
- close;
-}
-
-}
-
-jawaii_in.gat,44,110,0 script Security Officer#megin 734,{
-
- if ($God1 > 49 && $God2 < 100)
-{
- if (god_eremes == 18)
- {
- mes "[The Nineball]";
- mes "Welcome to Jawaii,";
- mes "the paradise resort!";
- next;
- mes "[The Nineball]";
- mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
- next;
- mes "[The Nineball]";
- mes "I've been told that there have";
- mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
- close;
- }
- else if (god_eremes > 18)
- {
- if (god_megin_5 < 5)
- {
- mes "[The Nineball]";
- mes "Welcome to Jawaii,";
- mes "the paradise resort!";
- next;
- mes "[The Nineball]";
- mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
- next;
- mes "[The Nineball]";
- mes "I've been told that there have";
- mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
- set god_megin_5,god_megin_5 +1;
- close;
- }
- else if (god_megin_5 == 5)
- {
- mes "^3355FFHe acted very bright and friendly, but for a fleeting moment, you were able to glimpse a hint of sadness in his eyes.^000000";
- next;
- mes "^3355FFIt doesn't seem that";
- mes "you'll be able to get him";
- mes "to talk about what exactly";
- mes "happened in the 3rd Squad...^000000";
- close;
- }
- }
-}
- else
-{
- mes "[The Nineball]";
- mes "Welcome to Jawaii,";
- mes "the paradise resort!";
- next;
- mes "[The Nineball]";
- mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
- next;
- mes "[The Nineball]";
- mes "I've been told that there have";
- mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
- close;
-}
-
-}
-
-niflheim.gat,109,254,0 script Egnigem 796,{
-
- if ($God1 > 49 && $God2 < 100)
-{
- if (god_eremes > 19 && god_eremes < 25)
- {
- if (god_eremes > 22)
- {
- mes "[Egnigem]";
- mes "Why have you returned to";
- mes "this lonely place of darkness?";
- next;
- mes "[Egnigem]";
- mes "Please go back to the world";
- mes "of the living. To be here is to suffer, such is the nature of Nifflheim.";
- close;
- }
- else
- {
- mes "[Egnigem]";
- mes "Greetings...";
- mes ""+ strcharinfo(0) +".";
- mes "I've been watching you in the";
- mes "world of the living. I see you've been busy looking for the truth about the 3rd Squad, haven't you?";
- next;
- mes "[Egnigem]";
- mes "I can provide you with the answers. After all, I'm the only member of the 3rd Squad to retain all of my memories...";
- next;
- mes "[Egnigem]";
- mes "Heh heh...";
- mes "Let me tell you everything";
- mes "about the 3rd Squad that's";
- mes "been forgotten...";
- L_Menu:
- next;
- switch( select( "The Mission", "Fate of the 3rd Squad", "Why are you in Nifflheim?", "Thanks, I've heard enough." ) )
- {
- case 1:
- mes "[Egnigem]";
- mes "First of all, the official record of our mission is misleading.";
- mes "It contains some truth, based";
- mes "on verbal evidence, but the most important details have been left out or changed.";
- next;
- mes "[Egnigem]";
- mes "Now, we were secretly assigned";
- mes "to find ^0000FFgodly artifacts^000000 by royal decree. In only three days, we succeeded and found Megingjard!";
- next;
- mes "[Egnigem]";
- mes "Now, the records say the mission was unsatisfactory, correct? That would be because of me.";
- next;
- mes "[Egnigem]";
- mes "Are you aware that Megingjard";
- mes "was a belt worn by gods? It was actually one of the keys to Thor's great strength. Another name for it is the 'Girdle of Might.'";
- next;
- mes "[Egnigem]";
- mes "Now, if a human were to wear";
- mes "that, there's a possibility that Megingjard would give him strength comparable to a god. Naturally, you'd be afraid of such a thing falling into the wrong hands.";
- next;
- mes "[Egnigem]";
- mes "In Rebarev Doug's mind, he";
- mes "was the only person worthy of the belt since he considered himself the most religious person alive, and thus, closest to the gods.";
- next;
- mes "[Egnigem]";
- mes "He made it clear to us that only he would wear Megingjard. Although he was our leader, some of us felt uneasy about him wearing the belt and not giving it to his superiors, our mission objective.";
- next;
- mes "[Egnigem]";
- mes "Naturally, I opposed him. He was clearly unbalanced, and it would be dangerous to give him control of such power. It led to something of a fist fight between us.";
- next;
- mes "[Egnigem]";
- mes "The rest of the squad couldn't";
- mes "agree on whether or not we should simply obey our leader and let him have the belt. Some just wanted to complete the mission, while others were afraid of what might happen.";
- next;
- mes "[Egnigem]";
- mes "But Rebarev didn't wait for us to decide. He destroyed Megingjard into pieces, intending to keep most of it and somehow reconstruct it later, and only bring one piece to the Prontera Military.";
- next;
- mes "[Egnigem]";
- mes "He knew that he couldn't get";
- mes "away with keeping all of Megingjard to himself, as the entire squad could easily discredit him.";
- next;
- mes "[Egnigem]";
- mes "But Rebarev knew";
- mes "that he could deceive his";
- mes "superiors by giving them just a fragment of the artifact, and say that the rest of it was destroyed.";
- next;
- mes "[Egnigem]";
- mes "I discovered his intention when";
- mes "I found him taking Megingjard apart. Before I could stop him,";
- mes "I was killed. That bastard had";
- mes "a trap ready for me...";
- next;
- mes "[Egnigem]";
- mes "After the mission, Rebarev Doug only gave a piece of the belt back to the higher-ups, and gave them";
- mes "a different account than what had actually happened...";
- goto L_Menu;
- break;
- case 2:
- mes "[Egnigem]";
- mes "Once the mission was completed, Rebarev Doug reported back to the Prontera Military with the intent of keeping most of Megingjard for himself.";
- next;
- mes "[Egnigem]";
- mes "For some reason, he has a very strong influence in the military hierarchy. Now, by this time, I'm sure the squad pretty much figured out that he killed me.";
- next;
- mes "[Egnigem]";
- mes "But Rebarev Doug expected this, and explained to his superiors that the squad was tempted by Megingjard's power and that I led some of us in a mutiny against him.";
- next;
- mes "[Egnigem]";
- mes "He told his superiors that Megingjard was damaged as we";
- mes "fought amongst each other, and that the fragment he gave them was all that remained.";
- next;
- mes "[Egnigem]";
- mes "Because of the confidential nature of our mission, the 3rd squad was disbanded and we weren't given the story Rebarev fed the beaureaucrats until it was too late.";
- next;
- mes "[Egnigem]";
- mes "The squad was punished and";
- mes "sent for disciplinary retraining for three months. During this time, specific memories were unnaturally erased from the squad members.";
- next;
- mes "[Egnigem]";
- mes "In the end, everyone was transferred to other squads and positions. My name had to be removed from all the records since hearing or reading my name might undo the brain washing.";
- next;
- mes "[Egnigem]";
- mes "However, they still needed an official scapegoat, so they used Royal Myst's name in the records. That's probably why he's been going through hard times right now.";
- next;
- mes "[Egnigem]";
- mes "And now Rebarev Doug has been studying godly artifacts based on the pieces of Megingjard that we found on that mission using kingdom research funds. Someday, he might be able to reconstruct the belt.";
- next;
- mes "[Egnigem]";
- mes "There are also";
- mes "a few questions that";
- mes "I've never been able";
- mes "to answer.";
- next;
- mes "[Egnigem]";
- mes "I've never known why the King Tristram III ordered the research of godly artifacts. It also bothers me that Rebarev Doug is in charge of Megingjard's research. There must be some reason.";
- next;
- mes "[Egnigem]";
- mes "In any case, for the sake of Rune-Midgard, it will be your responsibility to find the answers.";
- next;
- mes "[Egnigem]";
- mes "There's not much a dead man";
- mes "can do. But what's worse is that no one remembers me any more. I died alone and I'm still lonely in this place for the dead.";
- goto L_Menu;
- break;
- case 3:
- mes "[Egnigem]";
- mes "The worst part of the squad";
- mes "having their memories erased is";
- mes "that Emma Searth has absolutely";
- mes "no recollection of me.";
- next;
- mes "[Egnigem]";
- mes "Do you mind listening";
- mes "to me for a while? You're";
- mes "the only person with whom";
- mes "I can talk about this...";
- next;
- mes "[Egnigem]";
- mes "From here, I've seen that Emma";
- mes "is chasing her dream again, and";
- mes "I'm happy for her. But it's still";
- mes "not easy, knowing the woman you";
- mes "love has totally forgotten you.";
- next;
- mes "[Egnigem]";
- mes "I remember the first time I met her. I guess it was love at first sight. But I was too cowardly to confess my love, so I despaired when she joined the Crusaders.";
- next;
- mes "[Egnigem]";
- mes "It took me a while, but I made up my mind to enlist as a Crusader";
- mes "as well. I wanted to be closer to her so much.";
- next;
- mes "[Egnigem]";
- mes "Now, after all our adventures and good times together, I'm in the worst possible scenario.";
- next;
- mes "[Egnigem]";
- mes "I'm dead...";
- mes "But I don't even have the consolation that she is";
- mes "mourning my loss.";
- next;
- mes "[Egnigem]";
- mes "I suppose that's why I'm here";
- mes "in Nifflheim. I can't quite move on to heaven, Valhalla or anywhere else without her.";
- next;
- mes "[Egnigem]";
- mes "Anyway, go and visit the Crusader Headquarters. You might be able to learn more about Rebarev Doug and stop any new shadiness he might be plotting. Good luck, my friend.";
- goto L_Menu;
- break;
- case 4:
- mes "[Egnigem]";
- mes "Thank you for";
- mes "listening to me...";
- if (god_eremes == 21) set god_eremes,23;
- else if(god_eremes == 22) set god_eremes,24;
- close;
- break;
- }
- }
- }
- else if (god_eremes == 25)
- {
- mes "[Egnigem]";
- mes "Listen...";
- mes "I'm going to imbue you with the ^FF0000last vestiges of my strength^000000...";
- next;
- mes "[Egnigem]";
- mes "This is all I can do for you in return...";
- set god_eremes,27;
- if (BaseLevel < 56)
- set BaseExp,BaseExp + 27000;
- else if (BaseLevel > 55 && BaseLevel < 61)
- set BaseExp,BaseExp + 30000;
- else if (BaseLevel > 60 && BaseLevel < 66)
- set BaseExp,BaseExp + 56052;
- else if (BaseLevel > 65 && BaseLevel < 71)
- set BaseExp,BaseExp + 82233;
- else if (BaseLevel > 70 && BaseLevel < 76)
- set BaseExp,BaseExp + 212271;
- else if (BaseLevel > 75 && BaseLevel < 81)
- set BaseExp,BaseExp + 390738;
- else if (BaseLevel > 80 && BaseLevel < 86)
- set BaseExp,BaseExp + 451020;
- else if (BaseLevel > 85 && BaseLevel < 91)
- set BaseExp,BaseExp + 546156;
- else if (BaseLevel > 90)
- set BaseExp,BaseExp + 1220358;
- close;
- }
- else if (god_eremes == 26)
- {
- mes "[Egnigem]";
- mes "As a Crusader...";
- mes "This is the best thing";
- mes "I can do in return for";
- mes "what you have done for me.";
- next;
- mes "[Egnigem]";
- mes "Listen...";
- mes "I'm going to";
- mes "imbue you with the";
- mes "^666666last vestiges of my strength^000000...";
- specialeffect 57;
- specialeffect2 152;
- next;
- mes "[Egnigem]";
- mes "May the heavens";
- mes "answer me as I call upon the";
- mes "light of justice that empowers the defenders of truth, and threaten the enemies of peace.";
- specialeffect 58;
- specialeffect2 152;
- next;
- mes "[Egnigem]";
- mes "May you always shine with";
- mes "the light of truth. Let the light within you eradicate the shadows";
- mes "of deception, fear and malice.";
- specialeffect 58;
- specialeffect2 152;
- next;
- mes "[Egnigem]";
- mes "By the holy power";
- mes "invested in me, I humbly bestow upon you my remaining strength. Fight honorably, and do not lose sight of righteousness.";
- specialeffect 60;
- specialeffect2 245;
- set god_eremes,27;
- if (BaseLevel < 56)
- set BaseExp,BaseExp + 27000;
- else if (BaseLevel > 55 && BaseLevel < 61)
- set BaseExp,BaseExp + 30000;
- else if (BaseLevel > 60 && BaseLevel < 66)
- set BaseExp,BaseExp + 56052;
- else if (BaseLevel > 65 && BaseLevel < 71)
- set BaseExp,BaseExp + 82233;
- else if (BaseLevel > 70 && BaseLevel < 76)
- set BaseExp,BaseExp + 212271;
- else if (BaseLevel > 75 && BaseLevel < 81)
- set BaseExp,BaseExp + 390738;
- else if (BaseLevel > 80 && BaseLevel < 86)
- set BaseExp,BaseExp + 451020;
- else if (BaseLevel > 85 && BaseLevel < 91)
- set BaseExp,BaseExp + 546156;
- else if (BaseLevel > 90)
- set BaseExp,BaseExp + 1220358;
- close;
- }
- else if (god_eremes < 20)
- {
- mes "[Egnigem]";
- mes "Were you betrayed by fate as well, or are you simply a wanderer that's stumbled into this land of darkness?";
- next;
- mes "[Egnigem]";
- mes "Hmm, the living don't deserve";
- mes "to be in this realm of cold and suffering. But I can only help you escape by telling you what little";
- mes "I know.";
- next;
- switch( select( "Ask him about buildings.", "Remove marks on mini-map.", "Cancel." ) )
- {
- case 1:
- mes "[Egnigem]";
- mes "I see. If you better understand Niflheim's layout, you have a greater chance of surviving and escaping.";
- next;
- switch( select( "Witch's Castle", "Tool Shop", "Weapon Shop", "Tavern", "Cancel" ) )
- {
- case 1:
- mes "[Egnigem]";
- mes "The witch of Nifflheim...";
- mes "You can find her castle at the ^FF3355+^000000 mark I've made on your mini-map.";
- next;
- mes "[Egnigem]";
- mes "Hrrrm...";
- mes "It seems that the living who wind up in Nifflheim are seeking out the witch. But I don't quite understand what's so important about her.";
- viewpoint 1,253,191,2,0xFFFF33;
- break;
- case 2:
- mes "[Egnigem]";
- mes "The Tool shop? Here in Nifflheim, they sell some unique items that";
- mes "you can't buy anywhere else.";
- next;
- mes "[Egnigem]";
- mes "You might want to see their";
- mes "wares for yourself. I've drawn";
- mes "a ^CE6300+^000000 on your mini-map to mark";
- mes "its location.";
- viewpoint 1,217,196,3,0xFFCE63;
- break;
- case 3:
- mes "[Egnigem]";
- mes "I've marked the location of the Weapon Shop at ^55FF33+^000000. There's nothing too special over there, though.";
- viewpoint 1,216,171,4,0xFF55FF;
- break;
- case 4:
- mes "[Egnigem]";
- mes "Tavern is at ^3355FF+^000000. They only sell drinks to the dead, though...";
- viewpoint 1,189,207,5,0xFF3355;
- break;
- case 5:
- mes "[Egnigem]";
- mes "Choose 'Remove marks on mini-map' from the menu to remove all the building location marks I've made.";
- close;
- break;
- }
- close;
- break;
- case 2:
- viewpoint 2,253,191,2,0xFF00FF;
- viewpoint 2,217,196,3,0xFF00FF;
- viewpoint 2,216,171,4,0xFF00FF;
- viewpoint 2,189,207,5,0xFF00FF;
- mes "[Egnigem]";
- mes "Alright, all the marks I've made have been removed from your mini-map. If you want to check the locations in Nifflheim again, go ahead and ask me.";
- close;
- break;
- case 3:
- mes "[Egnigem]";
- mes "You're gonna explore this place on your own? Pretty brave, aren't you? Just be careful: here in Nifflheim, darkness reigns supreme.";
- close;
- break;
- }
- }
- else
- {
- mes "[Egnigem]";
- mes "I really wish that";
- mes "Emma Searth could";
- mes "remember me...";
- next;
- mes "^3355FFHis eyes seemed";
- mes "to moisten with sadness.";
- mes "Is it really possible for the";
- mes "dead to shed tears?^000000";
- close;
- }
-}
- else
-{
- mes "[Egnigem]";
- mes "Were you betrayed by fate as well, or are you simply a wanderer that's stumbled into this land of darkness?";
- next;
- mes "[Egnigem]";
- mes "Hmm, the living don't deserve";
- mes "to be in this realm of cold and suffering. But I can only help you escape by telling you what little";
- mes "I know.";
- next;
- switch( select( "Ask him about buildings.", "Remove marks on mini-map.", "Cancel." ) )
- {
- case 1:
- mes "[Egnigem]";
- mes "...I see. Now, let me introduce you all buildings in Nifflheim!";
- next;
- switch( select( "Witch's Castle", "Tool Shop", "Weapon Shop", "Tavern", "Cancel" ) )
- {
- case 1:
- mes "[Egnigem]";
- mes "The witch of Nifflheim...";
- mes "You can find her castle at the ^FF3355+^000000 mark I've made on your mini-map.";
- next;
- mes "[Egnigem]";
- mes "Hrrrm...";
- mes "It seems that the living who wind up in Nifflheim are seeking out the witch. But I don't quite understand what's so important about her.";
- viewpoint 1,253,191,6,0xFFFF33;
- break;
- case 2:
- mes "[Egnigem]";
- mes "The Tool shop? Here in Nifflheim, they sell some unique items that";
- mes "you can't buy anywhere else.";
- next;
- mes "[Egnigem]";
- mes "You might want to see their";
- mes "wares for yourself. I've drawn";
- mes "a ^CE6300+^000000 on your mini-map to mark";
- mes "its location.";
- viewpoint 1,217,196,7,0xFFCE63;
- break;
- case 3:
- mes "[Egnigem]";
- mes "I've marked the location of the Weapon Shop at ^55FF33+^000000. There's nothing too special over there, though.";
- viewpoint 1,216,171,8,0xFF55FF;
- break;
- case 4:
- mes "[Egnigem]";
- mes "Tavern is at ^3355FF+^000000. They only sell drinks to the dead, though...";
- viewpoint 1,189,207,9,0xFF3355;
- break;
- case 5:
- mes "[Egnigem]";
- mes "Choose 'Remove marks on mini-map' from the menu to remove all the building location marks I've made.";
- close;
- break;
- }
- close;
- break;
- case 2:
- viewpoint 2,253,191,6,0xFF00FF;
- viewpoint 2,217,196,7,0xFF00FF;
- viewpoint 2,216,171,8,0xFF00FF;
- viewpoint 2,189,207,9,0xFF00FF;
- mes "[Egnigem]";
- mes "Alright, all the marks I've made have been removed from your mini-map. If you want to check the locations in Nifflheim again, go ahead and ask me.";
- close;
- break;
- case 3:
- mes "[Egnigem]";
- mes "You're gonna explore this place on your own? Pretty brave, aren't you? Just be careful: here in Nifflheim, darkness reigns supreme.";
- close;
- break;
- }
- close;
-}
-
-}
-
-
+//===== eAthena Script =======================================
+//= Megingjard seal unlocking NPCs.
+//===== By: ==================================================
+//= SinSloth
+//===== Current Version: =====================================
+//= 1.01
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Quest for breaking the seal of Megingjard.
+//===== Additional Comments: =================================
+// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
+// 1.1 fixed exploit [Lupus]
+//============================================================
+
+prt_castle.gat,44,151,0 script Rebarev Doug 56,{
+
+if(countitem(7080) > 3 && countitem(7081) > 4 && countitem(7082) > 3 && countitem(7084) > 2 && countitem(7085) > 2)
+{
+ mes "[Rebarev Doug]";
+ mes "What's this?";
+ mes "You...! You have";
+ mes "everything I need to";
+ mes "create Gleipnir!";
+ next;
+ switch( select( "Make Gleipnir.", "Cancel." ) )
+ {
+
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "I'm the only human on earth blessed with the ability to create Gleipnir. Aside from Dwarves, I'm the only person that can make this item!";
+ next;
+ delitem 7080,4;
+ delitem 7081,5;
+ delitem 7082,4;
+ delitem 7084,3;
+ delitem 7085,3;
+ getitem 7058,1;
+ mes "[Rebarev Doug]";
+ mes "There you go!";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Gleipnir is said to be so strong that not even the Fenrir Wolf could break it! I'm so proud that I could make this item!";
+ close;
+ break;
+
+ case 2:
+ close;
+ break;
+
+ }
+}
+
+if($God1 < 50)
+{
+ mes "[Rebarev Doug]";
+ mes "We are Crusaders that have been training in preparation for the Holy War that is to come.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "As we our forefathers have done a thousand years ago, we shall vanquish the hordes of Demons when the day comes.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "If you have any questions about Crusaders, feel free to ask me. I may be too old and weak for fighting, but I will spread our message as much as I can.";
+ mes "feel free to ask me.";
+ next;
+ switch( select( "What is Holy Cross?", "What is Grand Cross?", "What is Sacrifice?", "What is Gleipnir?" ) )
+ {
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "Holy Cross is the first manifestation of a Crusader's faith. By making the sign of the cross, Crusader's can inflict a holy attack on their enemies.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Monsters that are weak against holiness, particularly the Undead, will be blinded by the light of the Holy Cross. All they can do is next; for holy judgment.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Based on our latest research, the Holy Cross can inflict 4.5 times more damage than a normal attack once it is mastered.";
+ close;
+ break;
+
+ case 2:
+ mes "[Rebarev Doug]";
+ mes "Grand Cross...!";
+ mes "The righteous fury of God is given form in this destructive skill.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "God grants us his power so that we may punish the forces of evil, and one's rage is embodied in a giant crucifix of power.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "The power of the crucifix of light can damage the enemy three times. Each strike will have five times the strength of your normal attacks.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "However, when Crusaders use Grand Cross, they must exercise extreme caution. The human body is too weak to fully embrace the will of God.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Therefore, using this skill, will cause the Crusader to suffer from damage. However, this damage can be reduced to half with Faith.";
+ close;
+ break;
+
+ case 3:
+ mes "[Rebarev Doug]";
+ mes "In practicing what we preach, Crusaders choose to protect others by bearing the suffering of others.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "The Sacrifice skill allows Crusaders to keep their comrades safe from harm by receiving the damage that was intended for them.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "It is the greatest demonstration of faith, as well as of love for your fellow man. Such an attitude is essential for a servant of God!";
+ next;
+ mes "[Rebarev Doug]";
+ mes "However, if the people you want to protect become stray away from you, you cannot use the Sacrifice skill for them unless they are close to you again.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "As you visualize the suffering of those you want to protect, you'll never hesitate to sacrifice yourself.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Thank you, God, for granting me with a power to protect my people.";
+ close;
+ break;
+
+ case 4:
+ mes "[Rebarev Doug]";
+ mes "Gleipnir is the essence of Megingjard which I have been researching.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "It's the only binding strong enough that will allow a human to wear Megingjard around his waist.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Although I can no longer fight, I've been studying how to create Gleipnir for years. I will be more than willing to create it for you if you can bring me...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "^0000FF4 Cat Tread^000000,";
+ mes "^0000FF5 Woman's Moustache^000000,";
+ mes "^0000FF4 Root of Stone^000000,";
+ mes "^0000FF3 Sputum of Bird^000000 and";
+ mes "^0000FF3 Sinew of Bear^000000,";
+ close;
+ break;
+ }
+}
+else if($God1 > 49 && $God2 < 100)
+{
+ if(BaseLevel > 59)
+ {
+ if(god_eremes == 0)
+ {
+ mes "[Rebarev Doug]";
+ mes "...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Why are you wandering around this sacred place? Do you not understand that we must prepare for the Holy War?";
+ next;
+ mes "[Rebarev Doug]";
+ mes "No matter how much I explain, the ignorant never fully understand the importance of our task. The balance of power will shift when we least expect it!";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I wish I could go back to those times when I would train Crusaders, rather than preach to the ignorant.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I miss my Crusaders who were enthusiastic to listen to what I had to say, and carried out their orders with loyalty.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I am wonder";
+ mes "where they have";
+ mes "all gone now...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "...";
+ mes "......";
+ mes ".........";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Adventurer, if you the time to listen to me speak to myself, why don't you perform a task for me?";
+ next;
+ mes "[Rebarev Doug]";
+ mes "If may be an enriching experience for you. It's possible that you'll even have a greater appreciation for Crusaders.";
+ next;
+ switch( select( "What is it?", "I'm sick and tired of doin' favors." ) )
+ {
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "I want you to find the members of the 3rd squad in the 1st platoon of the 3rd company. If you happen to encounter them in your travels, please ask them how they are doing.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "It shouldn't be that difficult to do, and won't be a waste of your time if you are already planning to explore the world.";
+ next;
+ switch( select( "Sure, why not.", "I'm sorry, but no." ) )
+ {
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "Excellent!";
+ mes "All I want you to do is find my old comrades, and inform me of how they are doing.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "However...";
+ mes "There is one problem.";
+ mes "I don't know where they are.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "You could try to find a record of residency changes by citizens of the Rune-Midgarts Kingdom in the Prontera Library...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "However, the records of Crusader personnel is considered confidential, so I am not sure of whether or not you can view them.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Thank you in advance anyways.";
+ mes ".........";
+ next;
+ mes "[Rebarev Doug]";
+ mes "You must understand, my position requires me to remain in this area 24 hours, 7 days a week. I cannot leave without the consent of the upper hierarchy.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "However, I know you have the freedom and the time to go wherever you please. I'd appreciate if you would do this for me.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "My old comrades in arms. You have no idea how much I miss them...";
+ set god_eremes,1;
+ close;
+ break;
+
+ case 2:
+ mes "[Rebarev Doug]";
+ mes "^333333*Sigh...*^000000";
+ mes "Please understand that I would not be asking this of you if it were not for the restraints of my position.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I have an obligation to this Kingdom to keep my post and inform adventurers about the Crusader class. Because of this awesome responsibility, I must remain here, ever vigilant.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "If you can't understand, then you must be taking your freedom for granted...";
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Rebarev Doug]";
+ mes "As far as I remember, this is the first time I have asked you to do me a favor.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Unlike you, I know the meaning of responsibility. I remain here, helping inquisitive adventurers for the sake of King and country.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Still...";
+ mes "Know this.";
+ mes "Although the results may not be immediate, you will always be rewarded when you help others.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Please reconsider when you get the chance.";
+ close;
+ break;
+ }
+ }
+ else if(god_eremes > 0 && god_eremes < 4)
+ {
+
+ if(rand(1,10) > 6 && god_eremes == 2)
+ {
+ mes "[Rebarev Doug]";
+ mes "I am wondering how my members are doing by now...";
+ mes "I cannot even remember when was the last time I saw them...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Hmm? Why are you still here?";
+ next;
+ switch( select( "Where should I go?", "I am about to leave.", "What do you mean by the last mission?" ) )
+ {
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "Well...I have no clue where they are.";
+ mes "You might be able to find the information from";
+ mes "^0000FFThe 3rd company personnel in&out record crews^000000 in the library?";
+ close;
+ break;
+
+ case 2:
+ mes "[Rebarev Doug]";
+ mes "Oh, are you? I see... I am wondering what they have been doing ever since we're disbanded after the ^0000FFlast mission^000000...";
+ close;
+ break;
+
+ case 3:
+ mes "[Rebarev Doug]";
+ mes "The last mission...? That gave the reason to disband the 1st squad of the 3rd platoon...";
+ mes "I cannot think of this seprately from the memory...bah..";
+ next;
+ mes "[Rebarev Doug]";
+ mes "You know, hmm.";
+ mes "We crusaders have heirarchy...basically we have to listen to higher officers.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "............";
+ mes "...If......there wasn't him at the time...";
+ next;
+ mes "[Rebarev Doug]";
+ mes ".............";
+ next;
+ mes "";
+ mes "- After a while, he spoke to me as if he was mad. -";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Let's not talk about it. Just remember it as the reason to disband my squad.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Now, will you please go find ^0000FFThe 3rd company personnel in&out record crews^000000 in the library for me?";
+ set god_eremes,3;
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Rebarev Doug]";
+ mes "I am wondering how my members are doing by now...";
+ mes "I cannot even remember when was the last time I saw them...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Hmm? Why are you still here?";
+ next;
+ switch( select( "Where should I go?", "I am about to leave." ) )
+ {
+ case 1:
+ mes "[Rebarev Doug]";
+ mes "Well...I have no clue where they are.";
+ mes "You might be able to find the information from the library.";
+ close;
+ break;
+
+ case 2:
+ mes "[Rebarev Doug]";
+ mes "Oh, are you? I see... I am wondering what they have been doing ever since we're disbanded after the ^0000FFlast mission^000000...";
+ set god_eremes,2;
+ close;
+ break;
+ }
+ }
+ }
+ else if(god_eremes > 3 && god_eremes < 18)
+ {
+ mes "[Rebarev Doug]";
+ mes "Huh? Librarian didn't let you read the record?";
+ mes "Umm...I guess if you try your best to convince him, he might change his mind.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Even if things are tough nowadays, he's just a man with a heart...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Please I beg you, please find how my members are doing...";
+ close;
+ }
+ else if(god_eremes > 17 && god_eremes < 20)
+ {
+ if(god_megin_1 > 0 || god_megin_2 > 0 || god_megin_3 > 0 || god_megin_4 > 0 || god_megin_5 > 0 || god_megin_6 > 0)
+ {
+ mes "[Rebarev Doug]";
+ mes "Oh...";
+ mes "So did you meet them?";
+ mes "Are they all okay?";
+ next;
+ mes "- You told him they are all okay other than lost their meomory and having migraines.-";
+ close;
+ }
+ mes "- You told him what you have read from the record -";
+ next;
+ mes "- that where they are and how they are. -";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Oh! Have you read the record? I am glad to hear that!";
+ mes "By the way...I don't trust what was wrote on paper since it's out of date...";
+ next;
+ mes "[Rebarev Doug]";
+ mes "If it's possible, I hope you could go meet my members to find the latest news about them...";
+ mes "I mean with your ^0000FFown eyes^000000!";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Please I beg you...please go find them.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I beg you...please go find them.";
+ mes "I cannot trust the old record...I am just being a poor old man who misses his friends.";
+ close;
+ }
+ else if(god_eremes > 19 && god_eremes < 23)
+ {
+ mes "[Rebarev Doug]";
+ mes "Oh~ welcome back.";
+ mes "So did you see them all? It's been a while since I saw you last time.";
+ mes "Umm? What? Why are you looking at me strange?";
+ next;
+ switch( select( "Ask him about the suspicion.", "This is not a right time to ask about the suspicion. wait." ) )
+ {
+ case 1:
+ mes "- You tried to organize your thoughts about all those suspicions you have had -";
+ next;
+ mes "- such as all the members are not on the normal condition, -";
+ next;
+ mes "- they lost their memory partially -";
+ next;
+ mes "- and about Royal Myst's comment...-";
+ next;
+ mes "- Or who is Egnigem that all members talked about? -";
+ next;
+ mes "- All these thoughts clogged your brain so you were just talking aboutissues regarding the members that were not that important.-";
+ next;
+ mes "[Rebarev Doug]";
+ mes "?!...I cannot understand what you're talking about...you're all over the place.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Stop looking at me like that, talk to me something!";
+ mes "If you are done with talking, let me excuse myself. I need to think of something.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I appreciate you for delivering me the news of my members -";
+ mes "Now, I need to go continue my research...under the commend of His Majesty.";
+ mes "May God bless you.";
+ set god_eremes,21;
+ close;
+ break;
+
+ case 2:
+ mes "- You pretended as nothing happened -";
+ next;
+ mes "- and told him about the members of the 1st squad in the 3rd platoon.-";
+ next;
+ mes "- Of course, you didn't tell him the whole truth but the stuffs you have read from the record plus some real news. -";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Hmm~ I see. I am so relieved to hear they are doing okay! Hahaha...";
+ next;
+ mes "- You felt the way of him looking at you have been slightly changed. It seemed he started guarding against you?-";
+ next;
+ mes "[Rebarev Doug]";
+ mes "I appreciate you for delivering me the news of my members -";
+ mes "Now, I need to go continue my research...under the commend of His Majesty.";
+ mes "May God bless you.";
+ next;
+ mes "- You felt detestableness from his smile.-";
+ set god_eremes,22;
+ close;
+ break;
+ }
+ }
+ else if(god_eremes > 22 && god_eremes < 25)
+ {
+ mes "- While you were talking about the result of your travel, you mentioned of Egnigem.-";
+ next;
+ mes "- He didn't seem to be agitated as though he knew something more than I did.-";
+ next;
+ mes "[Rebarev Doug]";
+ mes "It is too late to talk about the issue...";
+ mes "even if I felt sorry for you to know that...?";
+ mes "However...there is nothing left that you can prove.";
+ mes "Giggle giggle giggle....";
+ next;
+ mes "[Rebarev Doug]";
+ mes "No matter how hard you struggle,";
+ mes "after all, the elite as me rules the world.";
+ mes "Giggle giggle...let them roll over the floor as cold and rotten corpses! I do not care about the low!";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Do you hate me? Do you really hate me?";
+ mes "Let me tell you what you can do.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "Take a look at my back. You will see a judge who is in charge of all the military crimes.";
+ next;
+ mes "[Rebarev Doug]";
+ mes "It seems he will hold a trial if at least 100 people report a same crime...";
+ mes "So, you can do it if you really want to reveal the issue to the public!";
+ mes "Muhahahahaha!";
+ close;
+ }
+ else if(god_eremes > 23 && god_eremes < 26)
+ {
+ mes "[Rebarev Doug]";
+ mes "Bah...I didn't know you would actually did it.";
+ mes "Hey...you will be sorry later...";
+ mes "After all, the elite as me rules the world.";
+ close;
+ }
+ else
+ {
+ mes "[Rebarev Doug]";
+ mes "No matter how hard you struggle,";
+ mes "after all, the elite as me rules the world.";
+ mes "Giggle giggle...let them roll over the floor as cold and rotten corpses! I do not care about the low!";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Rebarev Doug]";
+ mes "You are not even at a level to speak to me.";
+ mes "Even if you are an adventurer, you are supposed to have some experience and knowledge to have a conversation with me.";
+ mes "don't you agree?";
+ close;
+ }
+}
+else
+{
+ mes "[Rebarev Doug]";
+ mes "We are crusaders who prepare a holy war under the will of Odin.";
+ mes "As we did a thousand years ago, we are waiting for the day to eliminate demons from the world.";
+ close;
+}
+
+}
+
+prt_castle.gat,48,164,0 script Crusader#God 734,{
+
+if($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes > 22 && god_eremes < 25)
+ {
+ mes "[Max Von Shedough]";
+ mes "Welcome, friend!";
+ mes "Here in the Prontera Castle, we Crusaders are busily preparing for the Holy War that is to come.";
+ next;
+ mes "[Max Von Shedough]";
+ mes "Let me introduce myself. My name is Max Von Shedough, the military judge! Do you have any business with me?";
+ next;
+ mes "^3355FFYou handed Max Von Shedough the petition against Rebarev Doug based on your investigation with Egnigem.^000000";
+ next;
+ mes "[Max Von Shedough]";
+ mes "Hm? This is serious.";
+ mes "Alright, I will investigate your claim to the best of my ability.";
+ next;
+ mes "[Max Von Shedough]";
+ mes "However, as of now, the petition you've just given me is considered classified information. Please keep this a military secret.";
+
+ set $God2,$God2+1;
+
+ if($God2 == 50)
+ announce "The 2nd seal of [Megingjard] has appeared.",bc_all;
+ else if($God1 > 99 && $God2 > 99 && $God3 > 99 && $God4 > 99)
+ announce "The four seals have been released at the same time with the seals of [Megingjard].",bc_all;
+ else if($God2 > 99)
+ announce "The seals of [Megingjard] have been released.",bc_all;
+
+ if(god_eremes == 23)
+ set god_eremes,25;
+ else if(god_eremes == 24)
+ set god_eremes,26;
+ close;
+ }
+ else if(god_eremes > 26)
+ {
+ mes "[Max Von Shedough]";
+ mes "Unfortunately, I'm not sure if it's possible to hold a trial against Rebarev Doug.";
+ next;
+ mes "[Max Von Shedough]";
+ mes "Regrettably, it seems that he still has too much influence. Still, let me assure you that I will be trying my best I am not sure if we will hold a trial with the document you have submitted or not...";
+ next;
+ mes "[Max Von Shedough]";
+ mes "But count on me, I am trying my best to get him indicted.";
+ close;
+ }
+ else
+ {
+ mes "[Max Von Shedough]";
+ mes "Welcome, my friend! This is a sacred place to prepare the holy war, the crusader commander's room.";
+ mes "Anyone who wishes to participate in the holy war will be welcomed!";
+ close;
+ }
+}
+else
+{
+ mes "[Max Von Shedough]";
+ mes "Welcome, my friend! This is a sacred place to prepare the holy war, the crusader commander's room.";
+ mes "Anyone who wishes to participate in the holy war will be welcomed!";
+ close;
+}
+
+}
+
+prt_in.gat,172,109,0 script A File#God1 111,{
+
+if(god_eremes == 12)
+{
+ mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
+ close;
+}
+else if(god_eremes > 6 && god_eremes < 12)
+{
+ if(rand(1,10) > 6 && god_eremes > 6)
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ else
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ close;
+ }
+}
+else if(god_eremes < 7)
+{
+ mes "[Librarian Jekan]";
+ if(Sex)
+ mes "I'm sorry sir,";
+ else
+ mes "I'm sorry ma'am,";
+ mes "but special authorization is required to browse that section. Otherwise, it's off limits.";
+ close;
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+
+}
+
+prt_in.gat,170,109,0 script A File#God2 111,{
+
+if(god_eremes == 12)
+{
+ mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
+ close;
+}
+else if(god_eremes > 6 && god_eremes < 12)
+{
+ if (rand(1,10) > 6 && god_eremes > 6)
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ else
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ close;
+ }
+}
+else if(god_eremes < 7)
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+
+}
+
+prt_in.gat,168,109,0 script A File#God3 111,{
+
+if(god_eremes == 12)
+{
+ mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
+ close;
+}
+else if(god_eremes > 6 && god_eremes < 12)
+{
+ if (rand(1,10) > 6 && god_eremes > 6)
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ else
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ close;
+ }
+}
+else if(god_eremes < 7)
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+
+}
+
+prt_in.gat,169,109,0 script A File#God4 111,{
+
+if(god_eremes == 12)
+{
+ mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
+ close;
+}
+else if(god_eremes > 6 && god_eremes < 12)
+{
+ if (rand(1,10) > 6 && god_eremes > 6)
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ else
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ close;
+ }
+}
+else if(god_eremes < 7)
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+
+}
+
+prt_in.gat,166,109,0 script A File#God5 111,{
+
+if(god_eremes == 12)
+{
+ mes "You have found ^0000FF- The 3rd company personnel in&out record crews -^000000!";
+ close;
+}
+else if(god_eremes > 6 && god_eremes < 12)
+{
+ if (rand(1,10) > 6 && god_eremes > 6)
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ else
+ {
+ mes "You found a shelf filled with many files.";
+ mes "You started searching files one by one.";
+ close;
+ }
+}
+else if(god_eremes < 7)
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Please do not enter that section.";
+ next;
+ mes "- You stepped back as he told you to -";
+ close;
+}
+
+}
+
+prt_in.gat,172,106,0 script Librarian#God 833,{
+
+if($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes > 2 && god_eremes < 7)
+ {
+ mes "[Librarian Jekan]";
+ mes "Ah, please do not touch the files at this section.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Some of the information there is classified, and it is therefore prohibited by the Prontera Military to browse through them.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I'm currently in the process of searching for the classified files in that section, so that I can separate it from the information that is public domain, so I'd appreciate it if you didn't interfere with my work.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Darn it! I can't read anything when the light is this dim! It's bad enough my eyes have gone bad...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "If you're looking for a book, you ought to go search through another section.";
+ next;
+ switch( select( "You have bad eyes?", "I want to read some documents.", "Let me help you find those files...", "What kind of files are you looking for?" ) )
+ {
+ case 1:
+ mes "[Librarian Jekan]";
+ mes "Since I have worked under a dim light for a long time, my eyes have gone bad.";
+ mes "They should get me ^0000FFa new light^000000, otherwise I will be gone blind sooner or later...";
+ if(god_eremes == 5 && ( countitem(2203) > 0 || countitem(1041) > 0 ) )
+ {
+ next;
+ mes "[Librarian Jekan]";
+ mes "?! Oh~ you have very useful stuff with you!";
+ mes "Do you mind if I use the stuff for a while? It will be very helpful for me to find the files!";
+ next;
+ switch( select( "Yes, I do mind.", "No, I don't mind." ) )
+ {
+ case 1:
+ mes "[Librarian Jekan]";
+ mes "...bah. Never mind then.";
+ close;
+ break;
+
+ case 2:
+ mes "[Librarian Jekan]";
+ mes "What a kind person you are!";
+ mes "Now I can believe that you really meant to help me!";
+ if(countitem(2203) && countitem(1041))
+ {
+ delitem 1041,countitem(1041);
+ delitem 2203,1;
+ }
+ else if(countitem(2203))
+ delitem 2203,1;
+ else if(countitem(1041))
+ delitem 1041,countitem(1041);
+ set god_eremes,6;
+ next;
+ mes "[Librarian Jekan]";
+ mes "Thank you, thank you so much. Now I can find the file with less worry.";
+ mes "...if it's possible, I wish you could help me to find the file...can you?";
+ break;
+
+ }
+ }
+ else if(god_eremes > 5)
+ {
+ mes "[Librarian Jekan]";
+ mes "Thank you. It will be a good help to find the file.";
+ }
+ close;
+ break;
+
+ case 2:
+ if(god_eremes == 6)
+ {
+ mes "[Librarian Jekan]";
+ mes "Read some documents? Well, you've come here to the Library. That's a good start.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Well, as long as you know what kind of document you're looking for, you might be able to find it.";
+ next;
+ mes "[Librarian Jekin]";
+ mes "Just keep in mind that this particular section is off limits for now. Why don't you check the files at the front?";
+ next;
+ mes "[Librarian Jekin]";
+ mes "I've got to find that classified file as soon as I can!";
+ set god_eremes,7;
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Hmm...?";
+ mes "Hey, haven't";
+ mes "I told you already?";
+ next;
+ mes "[Librarian Jekan]";
+ mes "The public is prohibited from browsing the files in this section! How many times do I need to repeat myself?";
+ close;
+ }
+ break;
+
+ case 3:
+ if(god_eremes == 4)
+ {
+ mes "[Librarian Jekan]";
+ mes "Hmm. Well, I'd gladly accept your help if it weren't for the fact that I cannot allow classified information to be released to the public.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I have no idea how something so important was shuffled into the files here in Prontera Library, but we can't allow the public to access it.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Still, that file doesn't seem to be that important, but I still have to waste my time on finding it...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Damn, my eyes are sore. Working as a government official is easy except for the times when the bureaucrats make you do stuff like this.";
+ set god_eremes,5;
+ close;
+ }
+ else if(god_eremes > 4)
+ {
+ mes "[Librarian Jekan]";
+ mes "I think I'm going to go insane looking for this file...!";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Huh...?";
+ mes "Did you just say that you wanted to help me? Sure, I'd appreciate it.";
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Um, you're not even supposed to know what kind of file I'm looking for. Even if you did, I'm not allowed to show you what's inside!";
+ close;
+ }
+ break;
+
+ case 4:
+ mes "[Librarian Jekan]";
+ mes "Hmm. I'm not really allowed to disclose any information related to that file. I'm sorry about that.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "But isn't";
+ mes "the file about...";
+ input @str$;
+ mes "^0000FF" + @str$ + "?";
+ next;
+ if (@str$ == "The 3rd company personnel in&out record crews" || @str$ == "the 3rd company personnel in&out record crews")
+ {
+ mes "[Librarian Jekan]";
+ mes "Hmm...?";
+ mes "How did you";
+ mes "know about that?";
+ set god_eremes,4;
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Errmmm...";
+ mes "I don't think so....?";
+ close;
+ }
+ break;
+ }
+ }
+ else if(god_eremes == 2)
+ {
+ mes "[Librarian Jekan]";
+ mes "Ah, please do not touch files in this section. Usually, it's public domain but it seems that a classified file managed to get misplaced there.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "For now, I cannot let anyone without special authorization to look through that section. I must find that file and send it to the Prontera military as soon as I can.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Ergh! This light isn't bright enough for my eyes. They're starting to get sore again...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "So what brings you here? If you're looking for something in particular, you should try another section.";
+ next;
+ switch( select( "I want to read some documents.", "Do you have bad eyes?", "Let me help you to find the files.", "What kind of files are you looking for?" ) )
+ {
+ case 1:
+ mes "[Librarian Jekan]";
+ mes "Grrrrrrr~ I told you already!";
+ mes "Files at this section are not for public exhibition, okay?";
+ mes "Why do you make me repeat the same thing over and over again?";
+ close;
+ break;
+
+ case 2:
+ mes "[Librarian Jekan]";
+ mes "Since I have worked under a dim light for a long time, my eyes have gone bad.";
+ mes "They should get me a new light, otherwise I will be gone blind sooner or later...";
+ close;
+ break;
+
+ case 3:
+ mes "[Librarian Jekan]";
+ mes "Um? How do you know what file I am looking for?";
+ mes "You don't even know what is written inside?";
+ mes "Stop interrupting me, leave!";
+ close;
+ break;
+
+ case 4:
+ mes "[Librarian Jekan]";
+ mes "Hmm. I am not supposed to reveal anything related to the file.";
+ next;
+ mes "[" + strcharinfo(0) + "]";
+ mes "Isn't the file about...";
+ input @str$;
+ mes "[" + strcharinfo(0) + "]";
+ mes "^0000FF" + @str$ + "?";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Maybe...";
+ mes "Maybe not~";
+ close;
+ break;
+
+ }
+ }
+ else if(god_eremes > 6 && god_eremes < 12)
+ {
+ if(rand(1,10) > 4)
+ {
+ mes "[Librarian Jekan]";
+ mes "Hmm? So did you find it? I've been searching for that file for a long time, but I haven't been able to find it.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I'll go ahead and search the right side, so do you think you could search the left?";
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Did you find it yet? All this time, and I still haven't been able to dig up that file.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I'll go ahead and check the left side, so would you look for it in the middle or the right side?";
+ close;
+ }
+ }
+ else if(god_eremes == 12)
+ {
+ mes "[Librarian Jekan]";
+ mes "Ah! There it is!";
+ mes "Thank you so much! I'm glad to see that there are still kind and thoughtful people like you in the world.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I really want to give you something to show you my gratitude, but I've got to send this back to the Prontera Military right away.";
+ next;
+ menu "I want to read the document.",-;
+
+ mes "[Librarian Jekan]";
+ mes "Oh, right, you mentioned that, didn't you? It doesn't seem seem so important, but I'm not really quite sure...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Well, it couldn't hurt if I made a copy of this first for you to read, but first I'll need some materials.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "I'll even cast the search magic on it, so that it'll be just like the original. All right, I need the following things to make a copy...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "2 Slick Paper,";
+ mes "1 Oil Paper,";
+ mes "3 Squid Ink,";
+ mes "3 Feather of Birds and";
+ mes "20 Blue Gemstones.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Please get those as soon as possible, and I'll be here making the other preparations to make a copy.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Also, I'll keep this copy in the Library for you to read, and to prevent it from being leaked to the public. So you'll have to come visit each time you wish to read it.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Okay, now...";
+ mes "Come back here";
+ mes "as soon as you can.";
+ set god_eremes,13;
+ close;
+ }
+ else if(god_eremes == 13)
+ {
+ if(countitem(7111) > 1 && countitem(7151) && countitem(1024) > 2 && countitem(916) > 2 && countitem(717) > 19)
+ {
+ mes "[Librarian Jekan]";
+ mes "Oh, you came back. I didn't expect you to return here so quickly. Whatever's inside must be really important for you to know.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Anyway, please give me a moment while I make that copy for you.";
+ delitem 7111,2;
+ delitem 7151,1;
+ delitem 1024,3;
+ delitem 916,3;
+ delitem 717,20;
+ set god_eremes,14;
+ next;
+ mes "[Librarian Jekan]";
+ mes "Alright then...";
+ mes "I'll see you in a bit.";
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Have you forgotten what you need to make a copy? Alright, let me tell you again...";
+ next;
+ mes "[Librarian Jekan]";
+ mes "2 Slick Paper,";
+ mes "1 Oil Paper,";
+ mes "3 Squid Ink,";
+ mes "3 Feather of Birds and";
+ mes "20 Blue Gemstones.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Please come back with those items as soon as you can.";
+ close;
+ }
+ }
+ else if(god_eremes > 13 && god_eremes < 16)
+ {
+ if(rand(1,10) > 4)
+ {
+ mes "[Librarian Jekan]";
+ mes "Let me go over and review the document before I make a copy.";
+ close;
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Let me go over and review the document before I make a copy.";
+ set god_eremes,god_eremes+1;
+ close;
+ }
+ }
+ else if(god_eremes == 16)
+ {
+ mes "[Librarian Jekan]";
+ mes "There you go. As I thought, the document didn't seem to contain any crucially important data.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "Just remember, this copy needs to stay in the Prontera Library. That means you have to come back if you need to read the document again.";
+ set god_eremes,17;
+ close;
+ }
+ else if(god_eremes > 16)
+ {
+ mes "[Librarian Jekan]";
+ mes "Welcome, my friend!";
+ mes "So, what do you need today?";
+ next;
+ switch( select( "Search words on the document.", "Quit searching.", "Converse." ) )
+ {
+ case 1:
+ mes "- Search Magic Initiated -";
+ mes "- Please enter a keyword. -";
+ next;
+ input @str$;
+ if(@str$ == "Crusader" || @str$ == "crusader")
+ {
+ mes "- search with the keyword : Crusader -";
+ mes "Crusader : Warriors that prepare themselves for a holy war. They are selected from well-experienced and religious swordsmen.";
+ mes "Any data regarding the military power is confidential, cannot be searched.";
+ next;
+ mes "This document is specified with the personnel in&out record of the 3rd company.";
+ set @godtemplib4,1;
+ close;
+ }
+ else if((@str$ == "The 3rd company" || @str$ == "the 3rd company" || @str$ == "The third company") && @godtemplib4)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 3rd company : Crusaders.";
+ mes "The 3rd comany is known as organized with the best members of crusaders,";
+ mes "there have been no report regarding the personnel in&out record of this company. However,";
+ next;
+ mes "The 3rd squad in the 1st platoon of the 3rd comany was an exception of that case,";
+ mes "the members of the 1st squad were all retired or transfered to other forces.";
+ mes "Specific information can be searched within the article about the 1st platoon.";
+ set @godtemplib1,1;
+ close;
+ }
+ else if((@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon") && @godtemplib1)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 1st platoon : The 1st platoon of the 3rd company, Crusaders.";
+ mes "Each company consists of 4 platoons, and this is only one record regarding the 3rd squad of the 1st platoon.";
+ next;
+ mes "Specific information can be searched within the article about the 3rd squad.";
+ set @godtemplib2,1;
+ close;
+ }
+ else if((@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad") && @godtemplib2)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 3rd squad : Crusaders.";
+ mes "Member list who participated in ^0000FFthe last mission^000000.";
+ next;
+ mes "^0000FF : Rebarev Doug";
+ mes " : Jack O";
+ mes " : Zan.Huadoku";
+ mes " : Cuaque Donon";
+ mes " : Emma Searth";
+ mes " : Royal Myst";
+ mes " : The Nineball^000000";
+ set @godtemplib3,1;
+ if(god_eremes == 17)set god_eremes,18;
+ close;
+ }
+ else if((@str$ == "The last mission" || @str$ == "the last mission") && @godtemplib3)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
+ next;
+ mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
+ next;
+ mes "During the mission, an unexpected incident happened.";
+ mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
+ next;
+ mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
+ mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
+ next;
+ mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
+ next;
+ mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
+ mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
+ next;
+ mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
+ mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
+ next;
+ mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
+ mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
+ close2;
+ if(god_eremes == 18)set god_eremes,19;
+ end;
+ }
+
+ else if((@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon") && @godtemplib4)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 1st platoon : The 1st platoon of the 3rd company, Crusaders.";
+ mes "Each company consists of 4 platoons and this is the first of the four.";
+ next;
+ mes "The 1st platoon of the 1st company, Crusader force.";
+ mes "Suggested to search 'Company' a higher rank keyword.";
+ next;
+ mes "Other information is confidential, cannot be searched on this document.";
+ close;
+ }
+ else if((@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad") && @godtemplib1)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 3rd squad : Crusaders.";
+ mes "Each platoon consists of 4 squads and this is the third of the four.";
+ mes "Suggested to search 'Platoon' a higher rank keyword.";
+ next;
+ mes "Generally a squad has 8 members within.";
+ mes "Other information is confidential, cannot be searched on this document.";
+ close;
+ }
+ else if(@str$ == "The last mission" || @str$ == "the last mission")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "- No result has been found.-";
+ mes "- Suggested to enter a specific name of the force for a better research.-";
+ close;
+ }
+ else if((@str$ == "Crusader" || @str$ == "crusader") && @godtemplib4)
+ {
+ mes "- search with a keyword : " + @str$ + " -";
+ mes "The 3rd company : Crusaders.";
+ mes "The 3rd comany is known as organized with the best members of crusaders,";
+ mes "there have been no report regarding the personnel in&out record of this company. However,";
+ next;
+ mes "The 3rd squad in the 1st platoon of the 3rd comany was an exception of that case,";
+ mes "the members of the 1st squad were all retired or transfered to other forces.";
+ mes "Specific information can be searched within the article about the 1st platoon.";
+ close;
+ }
+ else if(@str$ == "The 1st platoon" || @str$ == "the 1st platoon" || @str$ == "The first platoon")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 1st platoon : ";
+ mes "- No result has been found.-";
+ mes "- Suggested to enter a more specific keyword.-";
+ close;
+ }
+ else if(@str$ == "The 3rd squad" || @str$ == "the 3rd squad" || @str$ == "The third squad")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The 3rd company : ";
+ mes "- No result has been found.-";
+ mes "- Suggested to enter a more specific keyword.-";
+ close;
+ }
+ else if((@str$ == "The last mission" || @str$ == "the last mission") && god_eremes > 17) // ¸¶Áö¸· ÀÓ¹«
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "- No result has been found.-";
+ mes "- Suggested to enter a specific name of the force for a better research.-";
+ next;
+ close;
+ }
+ else if(@str$ == "Rebarev Doug")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former leader of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Has been in service as an instructor of crusader boot camp with the Prontera Castle.";
+ mes "Also he's in charge of a research under a command from the royal court.";
+ close;
+ }
+ else if(@str$ == Egnigem)
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "No result has been found.";
+ mes "No result has been found.";
+ mes "No result has been found.";
+ mes "No result has been found.";
+ mes "No result has been found.";
+ mes "No result has been found.";
+ mes "^FF0000This word is prohibited to research.^000000";
+ close;
+ }
+ else if(@str$ == "Zan.Huadoku")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Has been in service as a weapon quartermaster in Geffen ever since the squad was disbanded.";
+ mes "Current location : Blacksmith guild, Geffen.";
+ close;
+ }
+ else if(@str$ == "Cuaque Donon")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Retired from service and went back to his home town, Morroc ever since the squad was disbanded.";
+ mes "Reported to work for an inn in Morroc.";
+ close;
+ }
+ else if(@str$ == "Jack O")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Has been in service as a recruiting officer in Alberta ever since the squad was disbanded.";
+ mes "Current location : Near Alberta port.";
+ close;
+ }
+ else if(@str$ == "Emma Searth")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Retired from service and went to Al De Baran to do something different ever since the squad was disbanded.";
+ mes "Reported to submit a resume to the Kafra corporation.";
+ close;
+ }
+ else if(@str$ == "Royal Myst")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Has been in service in Comodo ever since the squad was disbanded.";
+ mes "Current duty is unknown.";
+ mes "Current lcation : A casino in Comodo.";
+ close;
+ }
+ else if(@str$ == "The Nineball")
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "The former member of the 3rd squad in the 1st platoon of the 3rd company.";
+ mes "Has been in service as the security officer of Jawaii ever since the squad was disbanded.";
+ mes "Current location : A tavern in Jawaii.";
+ close;
+ }
+ else
+ {
+ mes "- search with the keyword : " + @str$ + " -";
+ mes "- No result has been found.-";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "- Search magic is being shut down.-";
+ next;
+ mes "- There is no response from the search magic.-";
+ mes "- Would you like to shut down immediately?-";
+ next;
+ mes " - If you shut down without properly closing the magic -";
+ mes "- there is a high possibility to damage unsaved data. -";
+ next;
+ mes "- ... -";
+ next;
+ mes "- ...... -";
+ next;
+ mes "- ........search magic is being shut down. -";
+ close;
+ break;
+
+ case 3:
+ mes "[Librarian Jekan]";
+ mes "You can tell our government doesn't really know how to allocate its funds and resources.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "First, there's Jawaii. Do newlyweds really need an entire island for themselves? Then again, I am single so I'm probably biased.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "And look at me. Geniuses aren't supposed to waste their precious time doing useless things for libraries!";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Librarian Jekan]";
+ mes "Ah, please do not touch any books in that section. ...I'm sure there's nothing there that could be useful to you.";
+ next;
+ switch( select( "Ignore him and check books.", "Step back." ) )
+ {
+ case 1:
+ mes "[Librarian Jekan]";
+ mes "Hey...!";
+ mes "I thought I said";
+ mes "not to touch those!";
+ close2;
+ warp "prontera.gat",120,264;
+ end;
+ break;
+
+ case 2:
+ mes "[Librarian Jekan]";
+ mes "Thank you. Feel free to browse through the other sections.";
+ next;
+ mes "[Librarian Jekan]";
+ mes "It's really nice to have visitors in the Library, especially when so many people don't read books nowadays.";
+ close;
+ break;
+ }
+ }
+}
+else
+{
+ mes "[Librarian Jekan]";
+ mes "Ah, please do not touch any books in that section.";
+ mes "....there is nothing much useful for you there.";
+ next;
+ switch( select( "Ignore him and check books.", "Step back." ) )
+ {
+ case 1:
+ mes "[Librarian Jekan]";
+ mes "I told you not to touch books there!";
+ close2;
+ warp "prontera.gat",120,264;
+ end;
+ break;
+
+ case 2:
+ mes "[Librarian Jekan]";
+ mes "Good, you may go check other sections though.";
+ mes "It's good to see a man visiting a library when people don't read books nowadays.";
+ close;
+ break;
+ }
+}
+
+}
+
+geffen_in.gat,109,161,3 script Crusader#God1 751,{
+
+if($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes > 17 && god_megin_1 < 2)
+ {
+ mes "[Zan.Huadoku]";
+ mes "^333333*Phew...*^000000";
+ mes "This work is really getting to me. Going on a mission with my war buddies sounds a lot better than this.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "At least in those days, I felt like I was actually doing something useful!";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Hey...";
+ mes "Can I help you";
+ mes "with anything?";
+ next;
+ switch( select( "Ask him about the 3rd squad.", "Ask him how he's been doing.", "Ask him about the 3rd Squad's last mission." ) )
+ {
+ case 1:
+ if(god_eremes == 18)
+ {
+ mes "[Zan.Huadoku]";
+ mes "Yeah, I was a member of the 3rd squad in the 1st platoon a long time ago. How did you know that?";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I miss the guys back in the squad. I wonder how our leader's been doing recently...";
+ next;
+ mes "^3355FFYou tell Zan about Rebarev Doug, and about how he is now an instructor for Crusader Boot Camp. He seems to be absorbed in his thoughts of the past.^000000";
+ close;
+ }
+ else if(god_eremes > 18)
+ {
+ mes "[Zan.Huadoku]";
+ mes "Yeah, I was a member of the 3rd squad in the 1st platoon a long time ago. How did you know that?";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I miss the guys back in the squad. I wonder how our leader's been doing recently...";
+ next;
+ mes "^3355FFYou tell Zan about Rebarev Doug, and about how he is now an instructor for Crusader Boot Camp. He seems to be absorbed in his thoughts of the past.^000000";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "...";
+ mes "......";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Before we went out on our last mission, the seven of us were like brothers and sisters. If ^FF0000he^000000 didn't disobey the order, we'd still be together today.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Wait, what was his name...? That's weird. There's no way I could forget something like that...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "H-how can I not remember his name! He's the reason my life is...!";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "^333333*Groan...*^000000";
+ mes "I.... My head...";
+ mes "My head hurts...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "^3355FFZan looks very confused and his eyes begin to glaze with a dazed look. You try speaking to him again, but he doesn't respond at all.^000000";
+ if(!god_megin_1)set god_megin_1,1;
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Zan.Huadoku]";
+ mes "How am I been doing?";
+ mes "Well, I work for the Blacksmith Guild, picking out good weapons to supply the Crusaders.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Sometimes, I get really bored with what I'm doing. I keep trying to convince myself that my job's important to future Crusaders, but...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "You know what? A lot of people have been asking me weird questions about me recently. I feel like I'm getting spied on, but maybe I'm just getting paranoid.";
+ close;
+ break;
+
+ case 3:
+ if(god_eremes == 18)
+ {
+ mes "[Zan.Huadoku]";
+ mes "Yeah, on our";
+ mes "final mission...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Final...? What the? I know it happened, but for some reason, all I can envision is a complete blank when I try to think about it.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I...";
+ mes "I guess I need something to remind me? I know it happened, but... I'm so confused.";
+ next;
+ mes "^3355FFZan seems to be having a very difficult time recalling that specific memory of his past.^000000";
+ close;
+ }
+ else if(god_eremes > 18 && god_megin_1 > 0)
+ {
+ mes "[Zan.Huadoku]";
+ mes "The last mission...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Umm...I cannot recall any memory about the mission...maybe I need a clue.";
+ next;
+ mes "- He seemed to have a hard time to remember something. -";
+ next;
+ mes "- You started telling him what you have read from the document.-";
+ next;
+ mes ".....";
+ next;
+ mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
+ next;
+ mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
+ next;
+ mes "During the mission, an unexpected incident happened.";
+ mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
+ next;
+ mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
+ mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
+ next;
+ mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
+ next;
+ mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
+ mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
+ next;
+ mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
+ mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
+ next;
+ mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
+ mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
+ next;
+ mes ".....................";
+ next;
+ mes "............";
+ next;
+ mes ".....";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Y-yeah that's right! And then three days after we started the mission, we found some kind of...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Well, I'm not sure what it was. But we found an ^0000FFunknown fragment^000000 that was a sign from God! And then...!";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "And then...";
+ mes "Oh. Oh God.";
+ mes "I can't remember...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I can't think about anything further than that. I can't even remember what we found. But I'm sure it was damned important.";
+ next;
+ mes "^3355FFZan stood still in silence, with a pained look on his face.^000000";
+ if(god_megin_1 == 1)set god_megin_1,2;
+ close;
+ }
+ else
+ {
+ mes "[Zan.Huadoku]";
+ mes "The last mission...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Umm...I cannot recall any memory about the mission...maybe I need a clue.";
+ next;
+ mes "- He seemed to have a hard time to remember something. -";
+ close;
+ }
+ break;
+ }
+ }
+ else if(god_megin_1 > 1 && god_megin_1 < 3)
+ {
+ mes ".....................";
+ next;
+ mes "............";
+ next;
+ mes ".....";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I recalled something.";
+ mes "3 days later from the day we started our mission, we found ^0000FFan unknown fragment^000000 that was a sign of God!";
+ mes "And then...";
+ mes "And then...";
+ mes "And then...";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I am sorry...I cannot remember more than that...";
+ mes "I cannot even remember what it was that we found...";
+ mes "I have been suffering ^0000FFever since the 3 months^000000 later...";
+ next;
+ mes "- He stood still with a painful look on his face.-";
+ set god_megin_1,3;
+ close;
+ }
+ else if(god_megin_1 > 2)
+ {
+ mes "^3355FFGrabbing his head, tearing his hair and writhing in Agony, Zan kept repeating the same words over and over again...^000000";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "3 days later! We f-found some ^0000FFfragment^000000! It was G-God's sign! But why can't I remember?! Why?!";
+ close;
+ }
+ else
+ {
+ mes "[Zan.Huadoku]";
+ mes "Hey yo.";
+ mes "Can I help you?";
+ close;
+ }
+}
+else
+{
+ mes "[Zan.Huadoku]";
+ mes "Good day!";
+ mes "Do you know the";
+ mes "importance of supply?";
+ next;
+ switch( select( "No.", "Yes!" ) )
+ {
+ case 1:
+ mes "[Zan.Huadoku]";
+ mes "Any military force or party needs their supplies to be replenished if they are to continue battling for a prolonged period of time.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "For instance, let's say your group go on hunting without a healer. In this case, everyone would consume health restoration items, like potions.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Since you can only carry so many items at once, you'll eventually run out of potions.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "But if one of your party members traveled between town and the hunting area, he could supply your party with new healing items.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Supplying your party in this way would let you hunt with less worry. For that duty, the Merchant class would be the best by using their Carts.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I suppose that's why I'm working here in the Blacksmith Guild. As weapon quartermaster, I'm obligated to provide supplies for the Crusader forces.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "The Blacksmiths in this guild also help me provide high quality weapons for the Crusades as well.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "If you happen to run out of health items while hunting, why don't you ask a Merchant for help?";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Most likely, they will have some spare items and would be willing to share with you if you ask nicely enough.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "I hope to see you later again! May Odin protect you on your journeys.";
+ close;
+ break;
+
+ case 2:
+ mes "[Zan.Huadoku]";
+ mes "Oh...";
+ mes "Well then.";
+ mes "In that case.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Let me tell you about some useful knowledge I learned while working with the Blacksmiths.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "A Blacksmith character's forging skills are affected by the DEX and LUK stats. DEX and LUK also affect the item creation skills for Alchemists.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Since I've been staying here in the Blacksmith guild, I'm trying to better understand Blacksmiths and develop a deeper appreciation of their work.";
+ next;
+ mes "[Zan.Huadoku]";
+ mes "Alright then...";
+ mes "Take it easy.";
+ close;
+ break;
+ }
+}
+
+}
+
+morocc_in.gat,146,179,0 script Employee#God1 66,{
+
+if($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes > 17 && god_megin_2 < 1)
+ {
+ mes "^3355FFThe Inn Employee eyes you suspiciously.^000000";
+ next;
+ mes "[Inn Employee]";
+ mes "May I help you?";
+ next;
+ mes "[Inn Employee]";
+ mes "Excuse me.";
+ mes "How can I help you?";
+ next;
+ input @str$;
+ if (@str$ == "Cuaque Donon" || @str$ == "Cuaque" || @str$ == "Donon")
+ {
+ mes "[" + strcharinfo(0) + "]";
+ mes "Do you happen to know a person named " + @str$ + " ...?";
+ if (god_eremes == 18)
+ {
+ mes "[Inn Employee]";
+ mes "I don't think I know that person. I guess that guy left before I started working here, maybe?";
+ close;
+ }
+ else if(god_eremes > 18)
+ {
+ next;
+ mes "^3355FFOnce you said that name, she immediately drew closer to you and began speaking in a low, threatening tone.^000000";
+ next;
+ mes "[Scary Inn Employee]";
+ mes "Who the hell are you? If you try anything funny, I'll rip your heart out!";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "Why are you so curious?! Are you one of them?! How the hell did you find me?!";
+ next;
+ switch( select( "Rebarev Doug is wondering about you.", "I am wondering why he's hiding.", "Just a curiosity." ) )
+ {
+ case 1:
+ if(rand(1,10) > 3)
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Hah!...yeah, I was told thousand times about that.";
+ mes "That old must be afraid of the rumor spreaded to public...";
+ mes "...he must be that desperate to send men to find me.";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "However!";
+ mes "I am not in the mood for guiding you to him today!";
+ next;
+ mes "- As she released the grip of a sword, -";
+ mes "- she hit you with might by the nape of your neck. -";
+ close2;
+ percentheal -100,0;
+ end;
+ }
+ else
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Hah!...yeah, I was told thousand times about that.";
+ mes "That old must be afraid of the rumor spreaded to public...";
+ mes "...he must be that desperate to send men to find me.";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "Okay, I think it's the time to give out a hint to the old dog. But, you got only one chance to listen to me.";
+ next;
+ mes "- She whispered to your ears.-";
+ mes "^0000FFAragham never hoarded upgrade items.^000000";
+ set god_megin_2,1;
+ close;
+ }
+ break;
+
+ case 2:
+ if(rand(1,10) > 4)
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Bah...since you are here, that means you know why he has hid himself in here.";
+ mes "I cannot trust you as I saw you lying.";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "It's the time to go to bed!";
+ mes "I am not in the mood for guiding you to him today!";
+ next;
+ mes "- As she released the grip of a sword, -";
+ mes "- she hit you with might by the nape of your neck. -";
+ close2;
+ percentheal -100,0;
+ }
+ else
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Bah...since you are here, that means you know why he has hid himself in here.";
+ mes "You're a sly dog, aren't you?";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "Well, I don't think a hint will do any harm. Somehow you don't look that dangerous.";
+ next;
+ mes "- She whispered to your ears.-";
+ mes "^0000FFAragham never hoarded upgrade items.^000000";
+ set god_megin_2,1;
+ close;
+ }
+ break;
+
+ case 3:
+ if (rand(1,10) > 3)
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Just a curiosity? Hahaha!";
+ mes "You have a lot of guts, don't you?";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "I am sorry to tell you this...but";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "You are the type of a man that";
+ mes "I hate the most!";
+ next;
+ mes "- As she released the grip of a sword, -";
+ mes "- she hit you with might by the nape of your neck. -";
+ close2;
+ percentheal -100,0;
+ end;
+ }
+ else
+ {
+ mes "[Ms. Scary Inn Employee]";
+ mes "Just a curiosity? Hahaha!";
+ mes "You have a lot of guts, don't you?";
+ next;
+ mes "[Ms. Scary Inn Employee]";
+ mes "Oh well, sometimes that can be looked as cute.";
+ mes "Listen to me well, I am giving you only one chance.";
+ next;
+ mes "- She whispered to your ears.-";
+ mes "^0000FFAragham never hoarded upgrade items.^000000";
+ set god_megin_2,1;
+ close;
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ mes "[Inn Employee]";
+ mes "......?";
+ mes "I am sorry but I think you misunderstood something here.";
+ close;
+ }
+ }
+ else if(god_megin_2 > 0)
+ {
+ mes "[Inn Employee]";
+ mes "How can I help you?";
+ next;
+ mes "[Inn Employee]";
+ mes "Welcome to the inn.";
+ mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
+ next;
+ mes "[Inn Employee]";
+ mes "Usually you can visit inns in big towns.";
+ mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
+ next;
+ mes "- She welcomed you with professional manner as though there was nothing happened. -";
+ close;
+ }
+ else
+ {
+ mes "[Inn Employee]";
+ mes "How can I help you?";
+ next;
+ mes "[Inn Employee]";
+ mes "Welcome to the inn.";
+ mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
+ next;
+ mes "[Inn Employee]";
+ mes "Usually you can visit inns in big towns.";
+ mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
+ close;
+ }
+}
+else
+{
+ mes "[Inn Employee]";
+ mes "How can I help you?";
+ next;
+ mes "[Inn Employee]";
+ mes "Welcome to the inn.";
+ mes "When you move to the entrance, you can also enter a PvP zone though a PvP doorman.";
+ next;
+ mes "[Inn Employee]";
+ mes "Usually you can visit inns in big towns.";
+ mes "If you want to take some rest or to compete your power with others, this is the place where you come.";
+ next;
+ mes "[Inn Employee]";
+ mes "Oh, also I have a secret to tell you...";
+ mes "I was told that the inn master is planning some kind of shady business.";
+ next;
+ mes "[Inn Employee]";
+ mes " - I think it was called as 'the rest project for all' or something...";
+ next;
+ mes "[Inn Employee]";
+ mes "But don't tell anyone that I told you this, please!";
+ close;
+}
+
+}
+
+in_rogue.gat,243,61,0 script Suspicious Man#God 748,{
+
+ if($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes == 18)
+ {
+ mes "[Cuaque Donon]";
+ mes "Wha...what are you! How the hell did you come in here!";
+ mes "Get away, get away from me!";
+ mes "Geeeet awwwway!";
+ close;
+ }
+ else if(god_eremes > 18)
+ {
+ if(god_megin_2 > 0 && god_megin_2 < 4)
+ {
+ mes "[Cuaque Donon]";
+ mes "Wha...what are you! How the hell did you come in here!";
+ mes "Get away, get away from me!";
+ mes "Geeeet awwwway!";
+ next;
+ mes "- You tried your best to make him calm down and told him what you have found from the document.-";
+ next;
+ if (countitem(740) > 0 || countitem(741) > 0 || countitem(742) > 0 || countitem(743) > 0 || countitem(750) > 0 || countitem(751) > 0 || countitem(752) > 0 || countitem(753) > 0 || countitem(754) > 0 || countitem(7206) > 0 || countitem(7212) > 0)
+ {
+ mes "- You pulled out a doll and used it as though it spoke to him a story. -";
+ }
+ else
+ {
+ mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
+ next;
+ mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
+ next;
+ mes "During the mission, an unexpected incident happened.";
+ mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
+ next;
+ mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
+ mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
+ next;
+ mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
+ next;
+ mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
+ mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
+ next;
+ mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
+ mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
+ next;
+ mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
+ mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
+ next;
+ mes "-You must find something that can make him calm down.-";
+ next;
+ mes "- As you saw him acting like a child, it would be a good idea to bring something that is attractive to children. -";
+ close;
+ }
+
+ next;
+ mes "- He was nodded his head and chewing his finger happily just like children do when they're happy. -";
+ next;
+ mes "- He seemed to be fine enough to be asked few questions.-";
+ next;
+ switch( select( "Ask him about the inn maid.", "Ask him how he's been doing.", "Ask him about the last mission of the 3rd squad." ) )
+ {
+ case 1:
+ mes "[Cuaque Donon]";
+ mes "She...she's my sister.";
+ mes "And she's also a rogue.";
+ mes "When I was retired from service....";
+ next;
+ mes "[Cuaque Donon]";
+ mes ".................";
+ next;
+ mes "[Cuaque Donon]";
+ mes "My family always expected more than I could do from me ever since I was born.";
+ mes "That was why I volunteered to be a crusader.";
+ mes "Crusader is not only a highly respectable but also a well-paying job...";
+ mes "And I was retired from service.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "My sister was so upset at me...at that time.";
+ mes "She is the only one I have...she was so upset";
+ mes "at the fact that I messed up...";
+ next;
+ mes "[Cuaque Donon]";
+ mes "And she got me a job in the inn";
+ mes "even after yelling at me that I am worthless, she got me a job anyway.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "Since when, I have noticed that there have been many people visiting me for some reason.";
+ mes "It seemed they wanted something from me...awwwwwwwwwww....my head..! My head is hurt!";
+ next;
+ mes "[Cuaque Donon]";
+ mes "...I don't know what I have said to them.";
+ mes "They were all excited at what I said and they tried to hurt me.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "So, she hid me here.";
+ mes "But, I am so bored to be alone. A guy in the downstairs always do nothing but yelling at me...";
+ mes "He always yells at me to leave.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "Even the rogue guild where my sister is in sometimes come to listen to me.";
+ mes "And they are always excited just like the others and yell at me to say something I am supposed to know.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "I am telling you, I cannot remember anything!";
+ mes "I know this place is safe from those dangerous people.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "She is the only one I have now...still I don't want her to be upset at me.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "She said I must tell the rogue guild guys what I know...otherwise they will not protect her and me any longer.";
+ mes "She looked sad when she sad that...";
+ if (god_megin_2 == 2)
+ {
+ next;
+ mes "[Cuaque Donon]";
+ mes "Oh, I remember something.";
+ mes "She told me not to tell anyone but I am gonna tell you...";
+ next;
+ mes "- He whispered to your ears.-";
+ next;
+ mes "[Cuaque Donon]";
+ mes "She said...it seems rogue guild wants something from me.";
+ mes "So she's gonna send me good people that she trust and that can help me.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "But still this is the safest place to stay for a while.";
+ mes "At the same time, I am always ready to run...";
+ set god_megin_2,3;
+ close;
+ }
+ close;
+ break;
+
+ case 2:
+ mes "[Cuaque Donon]";
+ mes "How have I been doing?";
+ mes "I am afraid of the people visiting me with purpose.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "Rogue guild promised to protect me...but they scared the hell out of me sometimes by coming out of the floor without a warning.";
+ mes "Ah, and my sister said she's gonna complain to my ex boss about something.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "She said I was okay before. But ever since I was retired from the service, I have acted strange...";
+ next;
+ mes "[Cuaque Donon]";
+ mes "But he doesn't want to meet my sister...that's what she said. So she's gonna ask a help to her rogue guild to spread some kind of rumors...";
+ mes "Like a rumor that anyone who volunteers to crusader through my ex boss will become retarded....";
+ next;
+ mes "[Cuaque Donon]";
+ mes "That's how I have been recently.";
+ if (god_megin_2 == 1) set god_megin_2,2;
+ close;
+ break;
+
+ case 3:
+ mes "[Cuaque Donon]";
+ mes "I don't know...I cannot remember it...";
+ if (god_megin_2 == 3)
+ {
+ next;
+ mes "[Cuaque Donon]";
+ mes "?!... Wait, I just remembered a thing...";
+ mes "I saw ^0000FFMegingjard^000000. That thing looked like a fragment of something, but I knew its name was Megingjard without being told.";
+ next;
+ if (rand(1,10) > 4)
+ {
+ switch( select( "^FF0000Megingjard^000000!", "^FFFFFFListen to him quitely^000000." ) )
+ {
+ case 1:
+ mes "[Cuaque Donon]";
+ mes "Waaaaaaaaaaaaahhhhhhh!";
+ mes "You are same as others! Go away from me!";
+ set god_megin_2,0;
+ close;
+ break;
+
+ case 2:
+ mes "[Cuaque Donon]";
+ mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
+ mes "I was keeping a night watch and happened to hear thm arguing.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "I cannot remember anything other than that.";
+ set god_megin_2,4;
+ close;
+ break;
+ }
+ }
+ else
+ {
+ switch( select( "^FF0000Megingjard^000000!", "^FFFFFFMegingjard!^000000.", "^FFFFFFListen to him quitely^000000" ) )
+ {
+ case 1:
+ mes "[Cuaque Donon]";
+ mes "Waaaaaaaaaaaaahhhhhhh!";
+ mes "You are same as others! Go away from me!";
+ set god_megin_2,0;
+ close;
+ break;
+
+ case 2:
+ mes "[Cuaque Donon]";
+ mes "Waaaaaaaaaaaaahhhhhhh!";
+ mes "You are same as others! Go away from me!";
+ set god_megin_2,0;
+ close;
+ break;
+ case 3:
+ mes "[Cuaque Donon]";
+ mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
+ mes "I was keeping a night watch and happened to hear thm arguing.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "I cannot remember anything other than that.";
+ set god_megin_2,4;
+ close;
+ break;
+ }
+ }
+ }
+ close;
+ break;
+ }
+ }
+ else if(god_megin_2 == 4)
+ {
+ mes "[Cuaque Donon]";
+ mes "And...that night...I heard ^0000FFhe^000000 had an argue with the leader.";
+ mes "I was keeping a night watch and happened to hear thm arguing.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "I cannot remember anything other than that.";
+ next;
+ mes "[Cuaque Donon]";
+ mes "Sleepy...my head is hurting. I want to rest now...";
+ close;
+ }
+ else
+ {
+ mes "[Cuaque Donon]";
+ mes "Wha...what are you! How the hell did you come in here!";
+ mes "Get away, get away from me!";
+ mes "Geeeet awwwway!";
+ close;
+ }
+ }
+}
+ else
+{
+ mes "[Cuaque Donon]";
+ mes "Wha...what are you! How the hell did you come in here!";
+ mes "Wahhhhh! My head...my head is hurting so bad!";
+ mes "I am scared! I am scared!";
+ close;
+}
+
+}
+
+alberta.gat,196,146,0 script Crusader#megin2 751,{
+
+ if ($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes == 18)
+ {
+ mes "[Jack O]";
+ mes "^333333*Yawn...*^000000";
+ mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
+ next;
+ mes "[Jack O]";
+ mes "Eh...?";
+ next;
+ switch( select( "Ask him about Rebarev Doug.", "Ask him how he's been doing.", "Ask him about the last mission of the 3rd squad." ) )
+ {
+ case 1:
+ mes "[Jack O]";
+ mes "Ah! Yeah, our old leader back in the 3rd Squad. Heh. I haven't seen him since we were disbanded.";
+ close;
+ break;
+
+ case 2:
+ mes "[Jack O]";
+ mes "Me? Yeah, I'm always busy recruiting future Crusaders.";
+ mes "We always welcome Swordmen";
+ mes "of great ability!";
+ next;
+ mes "[Jack O]";
+ mes "How does it sound? Why don't you volunteer to become a Crusader?";
+ close;
+ break;
+
+ case 3:
+ mes "[Jack O]";
+ mes "Last mission?";
+ mes "Eh, I don't really remember it.";
+ close;
+ break;
+ }
+ }
+ else if(god_eremes > 18)
+ {
+ if (god_megin_3 == 0 || god_megin_3 == 1)
+ {
+ mes "[Jack O]";
+ mes "*yawn*...so boring.";
+ mes "Let's see...if there is any swordsman I can recruit...?";
+ next;
+ mes "[Jack O]";
+ mes "Umm...?";
+ next;
+ switch( select( "Ask him about Rebarev Doug.", "Ask him how he's been doing.", "Ask about 3rd Squad's final mission." ) )
+ {
+ case 1:
+ if (god_megin_3 == 1)
+ {
+ mes "[Jack O]";
+ mes "Ah right. Our old leader.";
+ mes "Now I remember: He was";
+ mes "a pretty self righteous jerk";
+ mes "now that I think about it!";
+ next;
+ mes "[Jack O]";
+ mes "Can you believe he used to say that ^0000FFno one is more religious than him in this world^000000?! That's egoism right there. And maybe insanity.";
+ next;
+ mes "[Jack O]";
+ mes "Anyway, everyone in the squad";
+ mes "took pride in their faith. When";
+ mes "you're having a rough time in the";
+ mes "real world, you depend on religion, you know?";
+ next;
+ mes "[Jack O]";
+ mes "Anyways, in the records about";
+ mes "our squad, it says that one of us was punished for insubordination, rebelling or something. That's";
+ mes "a complete lie.";
+ next;
+ mes "[Jack O]";
+ mes "During our final mission,";
+ mes "our old leader had a huge argument with one us over something we found. I remember it being some kind of godly artifact, but I can't clearly remember what it was.";
+ next;
+ mes "[Jack O]";
+ mes "Although there was an obvious dispute, I think it was our squad leader who was out of line.";
+ mes "I... I can't really say...";
+ next;
+ mes "[Jack O]";
+ mes "I can't for the life of me";
+ mes "remember how the guy who";
+ mes "argued with the squad leader";
+ mes "looked like. The higher-ups";
+ mes "musta did something to me...";
+ next;
+ mes "[Jack O]";
+ mes "Anyway, I know for sure that whatever that guy did, it wasn't insubordination. In fact, I think he might've been right!";
+ next;
+ mes "[Jack O]";
+ mes "That's all I can remember.";
+ mes "I better take some Green Herbs now. My head throbs like crazy whenever I think about that time.";
+ set god_megin_3,2;
+ close;
+ }
+ else
+ {
+ mes "[Jack O]";
+ mes "Ah! Yeah, our old leader back in the 3rd Squad. Heh. I haven't seen him since we were disbanded.";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Jack O]";
+ mes "Me? Yeah, I'm not doing so bad. Keeping busy recruiting future Crusaders. We welcome all";
+ mes "Swordmen if they show potential~";
+ close;
+ break;
+
+ case 3:
+ mes "[Jack O]";
+ mes "Huh...?";
+ mes "Why would";
+ mes "you want to know?";
+ next;
+ mes "- You told him what you have found from the document. -";
+ next;
+ mes "^0000FFThe last mission of the 3rd squad^000000";
+ mes "The upper part decided to disband the 3rd squad which was the best search party of the crusader force after the following mission.";
+ next;
+ mes "The 3rd squad was secretly assigned to track down ^0000FFthe signs of God^000000 under a command from the royal court.";
+ next;
+ mes "During the mission, an unexpected incident happened.";
+ mes "A member started second guessing the squad leader's leadership and ^0000FFacting on his own authority^000000.";
+ next;
+ mes "It resulted in a factional dispute. In order to solve the problem, the leader held a meeting with the others.";
+ mes "Based on other's opinions, the squad leader concluded the member's behaviour as ^0000FFinsubordination^000000,";
+ next;
+ mes "and he and other members did a physical punishment onto the member. The member was reported to be injured and dropped from the squad during the mission.";
+ next;
+ mes "Due to this disgraceful incident, the 3rd squad could not complete the mission.";
+ mes "And because of the unsatisfying mission result, the 3rd squad leader was pressed hard by the 1st platoon leader and the 3rd company commendant.";
+ next;
+ mes "The 3rd company commandant proposed disband of the 3rd squad to upper hierarchy and his proposal was accepted.";
+ mes "After the 3rd squad was disbanded, the members including the squad leader were sent to diciplinary retraining for 3 moths. After that retraining, all of them were transfered to the other squad.";
+ next;
+ mes "Currently Rebarev Doug who was the 3rd squad leader at the time have been researching the signs of God based on the mission result.";
+ mes "And the research was ordered by the King of Rune-Midgarts Kingdom.";
+ next;
+ mes "^3355FFAs he listened to the record of the 3rd Squad, Jack O looked a little confused.^000000";
+ next;
+ mes "[Jack O]";
+ mes "Huh...?";
+ mes "I might not be able to remember";
+ mes "a whole lot from back then, but the part about ^0000FFinsubordination^000000 can't be right. I'm sure of that.";
+ if (god_megin_3 == 0) set god_megin_3,1;
+ close;
+ break;
+ }
+ }
+ else if (god_megin_3 == 2)
+ {
+ mes "[Jack O]";
+ mes "Our old leader was";
+ mes "so arrogant to the point";
+ mes "of being a little off his rocker.";
+ next;
+ mes "[Jack O]";
+ mes "I mean, normal people";
+ mes "don't say things like '^0000FFI am the most religious man in the universe! Kneel before me!^000000' Yeah. Not a normal thing to say.";
+ next;
+ mes "[Jack O]";
+ mes "Anyway, if the squad";
+ mes "leader punished anyone for insubordination, I'm sure that it was unwarranted. I don't remember too much, but I'm sure of that.";
+ next;
+ mes "[Jack O]";
+ mes "Excuse me, I need to take some Green Herbs. Taking these seems";
+ mes "to be the only thing that works for my headache.";
+ next;
+ mes "^3355FFJack O busily chewed";
+ mes "on some Green Herbs.";
+ mes "It seemed to greatly relieve him from the pain of his headaches.^000000";
+ close;
+ }
+ else
+ {
+ mes "[Jack O]";
+ mes "^333333*Yawn...*^000000";
+ mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Jack O]";
+ mes "Hey kid!";
+ mes "Ever think about";
+ mes "bein' a Crusader?";
+ close;
+ }
+}
+ else
+{
+ if (Class == Job_Swordman)
+ {
+ mes "[Jack O]";
+ mes "Hey kid!";
+ mes "Ever think about";
+ mes "bein' a Crusader?";
+ next;
+ mes "[Jack O]";
+ mes "Basically, you'd be volunteering to be part of our military, as well as train for the Holy War.";
+ next;
+ mes "[Jack O]";
+ mes "If you have some faith and know how to wield a sword, you'll be more than welcome here.";
+ next;
+ mes "[Jack O]";
+ mes "Just think about my suggestion";
+ mes "and come back if you're interested. Alright then, see you later~";
+ close;
+ }
+ else
+ {
+ mes "[Jack O]";
+ mes "^333333*Yawn...*^000000";
+ mes "It's quiet and boring, as per usual. Let's see if there's any Swordmen I can recruit today.";
+ next;
+ mes "[Jack O]";
+ mes "Huh...?";
+ mes "Are you interested in knowing more about Crusaders? Hahaha, I guess that must be the case.";
+ next;
+ mes "[Jack O]";
+ mes "By the way, bring a doll to";
+ mes "the kid in front of me. If you're lucky, she'll give you something neat in return. What it is, I don't know. I've got no dolls.";
+ next;
+ mes "[Jack O]";
+ mes "In accordance with the Crusader code, I'm not supposed to lie. So yeah, you can trust me!";
+ close;
+ }
+}
+
+}
+
+aldebaran.gat,66,213,0 script Lady#megin 69,{
+
+ if ($God1 > 49 && $God2 < 100)
+{
+ if(god_eremes == 18)
+ {
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
+ mes "if I can wait much longer to join the Kafra Corporation.";
+ close;
+ }
+ else if(god_eremes > 18 && god_eremes < 26)
+ {
+ if (god_megin_4 < 2)
+ {
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
+ mes "if I can wait much longer to join the Kafra Corporation.";
+ next;
+ mes "[Emma Searth]";
+ mes "Oh, an adventurer! I actually used to work in the same field that you do. More specifically, I used to be a Crusader.";
+ next;
+ mes "[Emma Searth]";
+ mes "My name is Emma Searth. Right now, I'm following my dream and applying to be a Kafra Lady. So my days of wielding a sword are over.";
+ next;
+ mes "[Emma Searth]";
+ mes "Sadly, I haven't succeeded yet because I was diagnosed with";
+ mes "some weird ^0000FFamnesia^000000.";
+ next;
+ mes "[Emma Searth]";
+ mes "Of course, I understand that";
+ mes "Kafra Corporation is a large, professional company, but";
+ mes "if I can work for them even if it's just part-time...";
+ next;
+ mes "[Emma Searth]";
+ mes "Is it that big of a problem?";
+ mes "I suppose they're worried";
+ mes "that I'd forget important customer information once I'm hired.";
+ next;
+ mes "[Emma Searth]";
+ mes "It's strange. When I was";
+ mes "a Crusader, I remembered";
+ mes "everything lucidly, and I never had any problems recalling the past.";
+ next;
+ mes "[Emma Searth]";
+ mes "But now I get these migraines whenever I try to focus on my memories from those times";
+ mes "when I used to fight in the Prontera Military.";
+ next;
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000";
+ next;
+ switch( select( "About her past.", "Why be a Kafra Lady?", "About memories she can remember." ) )
+ {
+ case 1:
+ if (countitem(7015) > 0)
+ {
+ mes "^3355FFThe scent of your";
+ mes "Memory Bookmark";
+ mes "seems to bring clarity";
+ mes "to her thoughts.^000000";
+ next;
+ mes "[Emma Searth]";
+ mes "I was born in a wealthy family where I was raised to learn etiquette, fencing, Peco riding, and music lessons since I was";
+ mes "born. I suppose you can say I'm pretty well educated.";
+ next;
+ mes "[Emma Searth]";
+ mes "However, my parents weren't";
+ mes "pleased when they learned that I wanted to become a Kafra Lady.";
+ next;
+ mes "[Emma Searth]";
+ mes "My parents insisted that";
+ mes "I become a Sage or a Scholar.";
+ mes "In the end, I ended up running";
+ mes "away from them by joining the Crusaders.";
+ next;
+ mes "[Emma Searth]";
+ mes "Luckily, the Crusaders were advertising their recruitment at the time, so I took that chance. Plus, having military experience might even help me join Kafra!";
+ next;
+ mes "[Emma Searth]";
+ mes "Since I did so well in Boot Camp,";
+ mes "I got the chance to join an elite squad. My squad was often assigned difficult missions, and we never failed to complete those.";
+ next;
+ mes "[Emma Searth]";
+ mes "Eventually, my reputation as a female Crusader, and being in a respectable military position, was enough to satisfy my family.";
+ next;
+ mes "[Emma Searth]";
+ mes "But after that day,";
+ mes "everything went wrong.";
+ mes "I only remember that it";
+ mes "was very sad and depressing.";
+ mes "Somehow, I feel like we were";
+ mes "even betrayed...";
+ next;
+ mes "[Emma Searth]";
+ mes "I think I can";
+ mes "try to remember";
+ mes "my comrades...";
+ set god_megin_4,1;
+ close;
+ }
+ else
+ {
+ mes "[Emma Searth]";
+ mes "Ah, let's not talk about it. It's too depressing. Maybe if you had some sort of ^0000FFmemory^000000 aid, I might be able to recall my forgotten past. Anything, like a reminder, a scheduler, a bookmark, a string...";
+ close;
+ }
+ break;
+
+ case 2:
+ mes "[Emma Searth]";
+ mes "One day, I happened to see Ms. Leilah at work here in Al De Baran. She was shining with confidence and commanded respect, even from her customers!";
+ next;
+ mes "[Emma Searth]";
+ mes "She carried herself like a professional, no matter what the situation. Even though I knew she was tired from working in the summer heat, she made everything look effortless!";
+ next;
+ mes "[Emma Searth]";
+ mes "When the male customers try to flirt with her, she never loses her poise. She just adjusts her glasses and does what she needs to do.";
+ next;
+ mes "[Emma Searth]";
+ mes "To me, she's like a lone, guardian angel. At that moment, it seemed the world existed just to be mocked by Ms. Leila.";
+ next;
+ mes "[Emma Searth]";
+ mes "I've also heard that Kafra Ladies are always traveling around the world, which is something I've always dreamed of doing.";
+ next;
+ mes "[Emma Searth]";
+ mes "Ms. Leilah is my idol,";
+ mes "and she's the reason why";
+ mes "I want to become a Kafra Lady.";
+ close;
+ break;
+
+ case 3:
+ if (countitem(511) > 0 && god_megin_3 > 1)
+ {
+ mes "^3355FFEmma Searth clutches her head and winces as she suffers from another migraine.^000000";
+ next;
+ mes "^3355FFRemembering that a Green Herb was able to relieve Jack O, you gave a Green Herb to Emma. She takes it, and looks a little more relaxed.^000000";
+ next;
+ mes "[Emma Searth]";
+ mes "I'm not even sure";
+ mes "how much I can remember";
+ mes "and how much I've actually";
+ mes "forgotten.";
+ next;
+ mes "[Emma Searth]";
+ mes "Let me...";
+ mes "Try to remember every one in our squad. Let's see, there was Jack O, The Nineball. Z-Zan. Zan.H-Huadoku. C-Cuaque Donon. Myself. Um, E... Eni... Egni... Um...";
+ next;
+ mes "[Emma Searth]";
+ mes "Egni...";
+ mes "Egnigem?^000000";
+ mes "Who was that?";
+ mes "Oh no. I'm sure he might";
+ mes "have, no, was there someone";
+ mes "named that with us?";
+ close2;
+ set god_megin_4,2;
+ end;
+ }
+ else
+ {
+ mes "^3355FFEmma Searth clutches her head and winces as she suffers from another migraine.^000000";
+ next;
+ mes "[Emma Searth]";
+ mes "I'm not even sure";
+ mes "how much I can remember";
+ mes "and how much I've actually";
+ mes "forgotten.";
+ close;
+ }
+ break;
+ }
+ }
+ else if(god_megin_4 > 1)
+ {
+ mes "[Emma Searth]";
+ mes "^0000FFJack O, The Nineball, Zan.Huadoku, Cuaque Donon, Egnigem.^000000 Oh, I really miss those guys...";
+ close;
+ }
+ else
+ {
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
+ mes "if I can wait much longer to join the Kafra Corporation.";
+ close;
+ }
+ }
+ else if (god_eremes == 25)
+ {
+ mes "[Emma Searth]";
+ mes "Egnigem...";
+ mes "That name makes";
+ mes "me so sad. I'm not";
+ mes "quite sure why, but...";
+ close;
+ }
+ else if (god_eremes == 26 || god_eremes == 27)
+ {
+ mes "[Emma Searth]";
+ mes "Egnigem...";
+ mes "That name makes";
+ mes "me so sad. I'm not";
+ mes "quite sure why, but...";
+ next;
+ mes "^3355FFEmma turns away before you can see her cry. Still, her shoulders heave with each sob as you imagine the hardship she's had to endure.^000000";
+ next;
+ mes "[Emma Searth]";
+ mes "I wish I knew what that name really means. I'm sure it's linked to an important memory from my past.";
+ next;
+ mes "[Emma Searth]";
+ mes "I really appreciate you coming here to talk to me about the old days. I, I want you to have this.";
+ set god_eremes,28;
+ getitem 603,1;
+ if (BaseLevel < 56)
+ set BaseExp,BaseExp + 27000;
+ else if (BaseLevel > 55 && BaseLevel < 61)
+ set BaseExp,BaseExp + 30000;
+ else if (BaseLevel > 60 && BaseLevel < 66)
+ set BaseExp,BaseExp + 56052;
+ else if (BaseLevel > 65 && BaseLevel < 71)
+ set BaseExp,BaseExp + 82233;
+ else if (BaseLevel > 70 && BaseLevel < 76)
+ set BaseExp,BaseExp + 212271;
+ else if (BaseLevel > 75 && BaseLevel < 81)
+ set BaseExp,BaseExp + 390738;
+ else if (BaseLevel > 80 && BaseLevel < 86)
+ set BaseExp,BaseExp + 451020;
+ else if (BaseLevel > 85 && BaseLevel < 91)
+ set BaseExp,BaseExp + 546156;
+ else if (BaseLevel > 90)
+ set BaseExp,BaseExp + 1220358;
+ close;
+ }
+ else if (god_eremes == 28)
+ {
+ mes "[Emma Searth]";
+ mes "Egnigem...";
+ mes "That name makes";
+ mes "me so sad. I'm not";
+ mes "quite sure why, but...";
+ next;
+ mes "^3355FFEmma turns away before you can see her cry. Still, her shoulders heave with each sob as you imagine the hardship she's had to endure.^000000";
+ close;
+ }
+ else
+ {
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000 I haven't gotten any response from them. I don't know";
+ mes "if I can wait much longer to join the Kafra Corporation.";
+ close;
+ }
+}
+ else
+{
+ mes "[Emma Searth]";
+ mes "I hear the Kafra Ladies always travel around the world, something I've always dreamed of doing! Hopefully, one of these days, I'll be able to work for the Kafra Corporation too.";
+ next;
+ mes "[Emma Searth]";
+ mes "^333333*Sigh...*^000000";
+ mes "Still, it's discouraging. I haven't heard anything from them...";
+ close;
+}
+
+}
+
+cmd_in02.gat,190,94,3 script Man#megin 828,{
+
+ if ($God1 > 49 && $God2 < 100)
+{
+ if (god_eremes == 18)
+ {
+ mes "[Royal Myst]";
+ mes "Wha...?";
+ mes "You wanna talk?";
+ next;
+ mes "[Royal Myst]";
+ mes "What am I, your personal psychiatrist?! Lemme alone,";
+ mes "I'm busy here! Awright, now";
+ mes "which one do I bet on...?";
+ next;
+ switch( select("Speak of Rebarev Doug.", "Speak of the 3rd squad.", "Talk about gambling.", "Discuss hobbies.") )
+ {
+ case 1:
+ mes "[Royal Myst]";
+ mes "Wha--? Him again?! Tell him I'm fine! Dandy, even! Why's he gotta send all these people just to ask";
+ mes "a silly question?";
+ close;
+ break;
+ case 2:
+ mes "[Royal Myst]";
+ mes "3rd squad? Yeah, I used to be in that. All of us in the squad used to be real good buddies too.";
+ next;
+ mes "[Royal Myst]";
+ mes "Zan.Huadoku, Cuaque Donon,";
+ mes "Jack O, Emma Searth and The Nineball. Yeah... I wonder what they're all up to?";
+ close;
+ break;
+ case 3:
+ mes "[Royal Myst]";
+ mes "Gambling? I love it, you";
+ mes "know? Eh, I don't win all the time, but I love it the most when I leave with more Zeny than I came in with! Hahaha!";
+ close;
+ break;
+ case 4:
+ mes "[Royal Myst]";
+ mes "Hobbies?";
+ mes "What, you comin'";
+ mes "on to me?";
+ next;
+ mes "[Royal Myst]";
+ mes "A man's hobby is drinking, or didn't you know that? I happen to be real good at it too! Mwahahaha!";
+ close;
+ break;
+ }
+ }
+ else if (god_eremes > 18 && god_eremes < 21)
+ {
+ if (god_megin_6 == 0 && god_megin_5 > 4 && god_megin_4 > 1 && god_megin_3 > 1 && god_megin_2 > 3 && god_megin_1 > 2)
+ {
+ mes "[Royal Myst]";
+ mes "Wha...?";
+ mes "You wanna talk?";
+ next;
+ mes "[Royal Myst]";
+ mes "What am I, your personal psychiatrist?! Lemme alone,";
+ mes "I'm busy here! Awright, now";
+ mes "which one do I bet on...?";
+ next;
+ }
+ else if(god_megin_6 > 0)
+ {
+ mes "[Royal Myst]";
+ mes "Hmm?";
+ mes "What's up?";
+ next;
+ }
+ else
+ {
+ mes "[Royal Myst]";
+ mes "Wha...?";
+ mes "You wanna talk?";
+ next;
+ mes "[Royal Myst]";
+ mes "What am I, your personal psychiatrist?! Lemme alone,";
+ mes "I'm busy here! Awright, now";
+ mes "which one do I bet on...?";
+ close;
+ }
+ if (god_megin_6 < 16)
+ {
+ switch( select("Speak of Rebarev Doug.", "Speak of the 3rd squad.", "Talk about gambling.", "Discuss hobbies.") )
+ {
+ case 1:
+ if (god_megin_6 == 0)
+ {
+ mes "[Royal Myst]";
+ mes "Huh? What's that old geezer want this time? Tell 'em I'm fine, dandy even! Why the hell does he keep sending people...";
+ set god_megin_6,1;
+ close;
+ }
+ else if (god_megin_6 > 0 && god_megin_6 < 15)
+ {
+ mes "[Royal Myst]";
+ mes "What the hell!? Stop talking about him! I never wanna see his face again! Tell him to leave me the hell alone!";
+ close;
+ }
+ else if (god_megin_6 > 14)
+ {
+ mes "[Royal Myst]";
+ mes "Damn geezer...";
+ mes "How much is he being paid for studying what we all found?! Eh, somehow, I don't care as long as";
+ mes "he pays me...";
+ next;
+ mes "[Royal Myst]";
+ mes "Yeah...";
+ mes "I just don't";
+ mes "care anymore.";
+ close;
+ }
+ break;
+ case 2:
+ if (god_megin_6 < 15)
+ {
+ mes "[Royal Myst]";
+ mes "3rd squad? Yeah, I used to be in that. All of us in the squad used to be real good buddies too.";
+ next;
+ mes "[Royal Myst]";
+ mes "Zan.Huadoku, Cuaque Donon,";
+ mes "Jack O, Emma Searth and The Nineball. Yeah... I wonder what they're all up to?";
+ close;
+ }
+ else if (god_megin_6 > 14)
+ {
+ mes "[Royal Myst]";
+ mes "3rd squad?";
+ mes "Don't know, don't care~";
+ mes "Do I look like a stupid Crusader?";
+ close;
+ }
+ else
+ break;
+ case 3:
+ if (god_megin_6 < 15)
+ {
+ mes "[Royal Myst]";
+ mes "Gambling? ! Oh man...";
+ mes "I love gambling, you know!";
+ mes "Heh, but I haven't been lucky enough to win yet. Hahaha~!";
+ close;
+ }
+ else if (god_megin_6 > 14)
+ {
+ mes "[Royal Myst]";
+ mes "Gambling...!";
+ mes "Heh heh! Some risks you take,";
+ mes "and others you really shouldn't.";
+ mes "I can't help but feel sorry for that guy, E--";
+ next;
+ mes "[Royal Myst]";
+ mes "Ergh...?";
+ mes "Damn, I can never remember his name. You'd think I wouldn't forget the guy whose rap I'm taking but... Eh, I'll remember once I sober up.";
+ next;
+ mes "[Royal Myst]";
+ mes "Hey, what do you think happens to Crusaders when they're framed and killed, huh? Where exactly do they go? Niflheim, Vahalla...?";
+ set god_eremes,20;
+ close;
+ }
+ break;
+ case 4:
+ if (god_megin_6 == 0)
+ {
+ mes "Hobbies?";
+ mes "What, you comin'";
+ mes "on to me?";
+ next;
+ mes "[Royal Myst]";
+ mes "A man's hobby is drinking, or didn't you know that? I happen to be real good at it too! Mwahahaha!";
+ close;
+ }
+ else if (god_megin_6 > 0 && god_megin_6 < 15)
+ {
+ if (countitem(970) > 0)
+ {
+ mes "[Royal Myst]";
+ mes "Speaking of which,";
+ mes "I haven't had a drink";
+ mes "for a looong time. Almost";
+ mes "a couple hours now.";
+ next;
+ mes "[Royal Myst]";
+ mes "Oooh, looks like you've got a tasty beverage I can enjoy. Bwahahaha! Gimmie~!";
+ next;
+ mes "^3355FFBefore you can even think,";
+ mes "Royal Myst dips his hand into your inventory and helps himself to an Alcohol.^000000";
+ delitem 970,1;
+ set god_megin_6,god_megin_6 +2;
+ close;
+ }
+ else
+ {
+ mes "[Royal Myst]";
+ mes "Why mention it? You gonna bring me something I'll like? Cuz I'm more than willing to take it! Bwahahaha!";
+ close;
+ }
+ }
+ else if (god_megin_6 > 14)
+ {
+ mes "[Royal Myst]";
+ mes "^333333*Hiccup*^000000 Oh yeah, this is the stuff. Not like that imitation junk they've been serving at the Bars nowadays...";
+ next;
+ mes "[Royal Myst]";
+ mes "Hey! There anything you wanna";
+ mes "know about me? You did me a favor, so I'll tell you anything! Eeeeeverythiiing~~!!";
+ close;
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ mes "[Royal Myst]";
+ mes "Eh heh heh~";
+ mes "I just know";
+ mes "I'm gonna win";
+ mes "this time!";
+ close;
+ }
+}
+ else
+{
+ mes "[Royal Myst]";
+ mes "Wha...?";
+ mes "You wanna talk?";
+ next;
+ mes "[Royal Myst]";
+ mes "What am I, your personal psychiatrist?! Lemme alone,";
+ mes "I'm busy here! Awright, now";
+ mes "which one do I bet on...?";
+ close;
+}
+
+}
+
+jawaii_in.gat,44,110,0 script Security Officer#megin 734,{
+
+ if ($God1 > 49 && $God2 < 100)
+{
+ if (god_eremes == 18)
+ {
+ mes "[The Nineball]";
+ mes "Welcome to Jawaii,";
+ mes "the paradise resort!";
+ next;
+ mes "[The Nineball]";
+ mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
+ next;
+ mes "[The Nineball]";
+ mes "I've been told that there have";
+ mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
+ close;
+ }
+ else if (god_eremes > 18)
+ {
+ if (god_megin_5 < 5)
+ {
+ mes "[The Nineball]";
+ mes "Welcome to Jawaii,";
+ mes "the paradise resort!";
+ next;
+ mes "[The Nineball]";
+ mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
+ next;
+ mes "[The Nineball]";
+ mes "I've been told that there have";
+ mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
+ set god_megin_5,god_megin_5 +1;
+ close;
+ }
+ else if (god_megin_5 == 5)
+ {
+ mes "^3355FFHe acted very bright and friendly, but for a fleeting moment, you were able to glimpse a hint of sadness in his eyes.^000000";
+ next;
+ mes "^3355FFIt doesn't seem that";
+ mes "you'll be able to get him";
+ mes "to talk about what exactly";
+ mes "happened in the 3rd Squad...^000000";
+ close;
+ }
+ }
+}
+ else
+{
+ mes "[The Nineball]";
+ mes "Welcome to Jawaii,";
+ mes "the paradise resort!";
+ next;
+ mes "[The Nineball]";
+ mes "I'm the 'The Nineball, the security officer of Jawaii! If you encounter any trouble, or find any Singles, please dont hesitate to report to me as soon as you can~";
+ next;
+ mes "[The Nineball]";
+ mes "I've been told that there have";
+ mes "been many unruly drunkards here lately, but it is in our best interest to make your experience here as enjoyable as possible.";
+ close;
+}
+
+}
+
+niflheim.gat,109,254,0 script Egnigem 796,{
+
+ if ($God1 > 49 && $God2 < 100)
+{
+ if (god_eremes > 19 && god_eremes < 25)
+ {
+ if (god_eremes > 22)
+ {
+ mes "[Egnigem]";
+ mes "Why have you returned to";
+ mes "this lonely place of darkness?";
+ next;
+ mes "[Egnigem]";
+ mes "Please go back to the world";
+ mes "of the living. To be here is to suffer, such is the nature of Nifflheim.";
+ close;
+ }
+ else
+ {
+ mes "[Egnigem]";
+ mes "Greetings...";
+ mes ""+ strcharinfo(0) +".";
+ mes "I've been watching you in the";
+ mes "world of the living. I see you've been busy looking for the truth about the 3rd Squad, haven't you?";
+ next;
+ mes "[Egnigem]";
+ mes "I can provide you with the answers. After all, I'm the only member of the 3rd Squad to retain all of my memories...";
+ next;
+ mes "[Egnigem]";
+ mes "Heh heh...";
+ mes "Let me tell you everything";
+ mes "about the 3rd Squad that's";
+ mes "been forgotten...";
+ L_Menu:
+ next;
+ switch( select( "The Mission", "Fate of the 3rd Squad", "Why are you in Nifflheim?", "Thanks, I've heard enough." ) )
+ {
+ case 1:
+ mes "[Egnigem]";
+ mes "First of all, the official record of our mission is misleading.";
+ mes "It contains some truth, based";
+ mes "on verbal evidence, but the most important details have been left out or changed.";
+ next;
+ mes "[Egnigem]";
+ mes "Now, we were secretly assigned";
+ mes "to find ^0000FFgodly artifacts^000000 by royal decree. In only three days, we succeeded and found Megingjard!";
+ next;
+ mes "[Egnigem]";
+ mes "Now, the records say the mission was unsatisfactory, correct? That would be because of me.";
+ next;
+ mes "[Egnigem]";
+ mes "Are you aware that Megingjard";
+ mes "was a belt worn by gods? It was actually one of the keys to Thor's great strength. Another name for it is the 'Girdle of Might.'";
+ next;
+ mes "[Egnigem]";
+ mes "Now, if a human were to wear";
+ mes "that, there's a possibility that Megingjard would give him strength comparable to a god. Naturally, you'd be afraid of such a thing falling into the wrong hands.";
+ next;
+ mes "[Egnigem]";
+ mes "In Rebarev Doug's mind, he";
+ mes "was the only person worthy of the belt since he considered himself the most religious person alive, and thus, closest to the gods.";
+ next;
+ mes "[Egnigem]";
+ mes "He made it clear to us that only he would wear Megingjard. Although he was our leader, some of us felt uneasy about him wearing the belt and not giving it to his superiors, our mission objective.";
+ next;
+ mes "[Egnigem]";
+ mes "Naturally, I opposed him. He was clearly unbalanced, and it would be dangerous to give him control of such power. It led to something of a fist fight between us.";
+ next;
+ mes "[Egnigem]";
+ mes "The rest of the squad couldn't";
+ mes "agree on whether or not we should simply obey our leader and let him have the belt. Some just wanted to complete the mission, while others were afraid of what might happen.";
+ next;
+ mes "[Egnigem]";
+ mes "But Rebarev didn't wait for us to decide. He destroyed Megingjard into pieces, intending to keep most of it and somehow reconstruct it later, and only bring one piece to the Prontera Military.";
+ next;
+ mes "[Egnigem]";
+ mes "He knew that he couldn't get";
+ mes "away with keeping all of Megingjard to himself, as the entire squad could easily discredit him.";
+ next;
+ mes "[Egnigem]";
+ mes "But Rebarev knew";
+ mes "that he could deceive his";
+ mes "superiors by giving them just a fragment of the artifact, and say that the rest of it was destroyed.";
+ next;
+ mes "[Egnigem]";
+ mes "I discovered his intention when";
+ mes "I found him taking Megingjard apart. Before I could stop him,";
+ mes "I was killed. That bastard had";
+ mes "a trap ready for me...";
+ next;
+ mes "[Egnigem]";
+ mes "After the mission, Rebarev Doug only gave a piece of the belt back to the higher-ups, and gave them";
+ mes "a different account than what had actually happened...";
+ goto L_Menu;
+ break;
+ case 2:
+ mes "[Egnigem]";
+ mes "Once the mission was completed, Rebarev Doug reported back to the Prontera Military with the intent of keeping most of Megingjard for himself.";
+ next;
+ mes "[Egnigem]";
+ mes "For some reason, he has a very strong influence in the military hierarchy. Now, by this time, I'm sure the squad pretty much figured out that he killed me.";
+ next;
+ mes "[Egnigem]";
+ mes "But Rebarev Doug expected this, and explained to his superiors that the squad was tempted by Megingjard's power and that I led some of us in a mutiny against him.";
+ next;
+ mes "[Egnigem]";
+ mes "He told his superiors that Megingjard was damaged as we";
+ mes "fought amongst each other, and that the fragment he gave them was all that remained.";
+ next;
+ mes "[Egnigem]";
+ mes "Because of the confidential nature of our mission, the 3rd squad was disbanded and we weren't given the story Rebarev fed the beaureaucrats until it was too late.";
+ next;
+ mes "[Egnigem]";
+ mes "The squad was punished and";
+ mes "sent for disciplinary retraining for three months. During this time, specific memories were unnaturally erased from the squad members.";
+ next;
+ mes "[Egnigem]";
+ mes "In the end, everyone was transferred to other squads and positions. My name had to be removed from all the records since hearing or reading my name might undo the brain washing.";
+ next;
+ mes "[Egnigem]";
+ mes "However, they still needed an official scapegoat, so they used Royal Myst's name in the records. That's probably why he's been going through hard times right now.";
+ next;
+ mes "[Egnigem]";
+ mes "And now Rebarev Doug has been studying godly artifacts based on the pieces of Megingjard that we found on that mission using kingdom research funds. Someday, he might be able to reconstruct the belt.";
+ next;
+ mes "[Egnigem]";
+ mes "There are also";
+ mes "a few questions that";
+ mes "I've never been able";
+ mes "to answer.";
+ next;
+ mes "[Egnigem]";
+ mes "I've never known why the King Tristram III ordered the research of godly artifacts. It also bothers me that Rebarev Doug is in charge of Megingjard's research. There must be some reason.";
+ next;
+ mes "[Egnigem]";
+ mes "In any case, for the sake of Rune-Midgard, it will be your responsibility to find the answers.";
+ next;
+ mes "[Egnigem]";
+ mes "There's not much a dead man";
+ mes "can do. But what's worse is that no one remembers me any more. I died alone and I'm still lonely in this place for the dead.";
+ goto L_Menu;
+ break;
+ case 3:
+ mes "[Egnigem]";
+ mes "The worst part of the squad";
+ mes "having their memories erased is";
+ mes "that Emma Searth has absolutely";
+ mes "no recollection of me.";
+ next;
+ mes "[Egnigem]";
+ mes "Do you mind listening";
+ mes "to me for a while? You're";
+ mes "the only person with whom";
+ mes "I can talk about this...";
+ next;
+ mes "[Egnigem]";
+ mes "From here, I've seen that Emma";
+ mes "is chasing her dream again, and";
+ mes "I'm happy for her. But it's still";
+ mes "not easy, knowing the woman you";
+ mes "love has totally forgotten you.";
+ next;
+ mes "[Egnigem]";
+ mes "I remember the first time I met her. I guess it was love at first sight. But I was too cowardly to confess my love, so I despaired when she joined the Crusaders.";
+ next;
+ mes "[Egnigem]";
+ mes "It took me a while, but I made up my mind to enlist as a Crusader";
+ mes "as well. I wanted to be closer to her so much.";
+ next;
+ mes "[Egnigem]";
+ mes "Now, after all our adventures and good times together, I'm in the worst possible scenario.";
+ next;
+ mes "[Egnigem]";
+ mes "I'm dead...";
+ mes "But I don't even have the consolation that she is";
+ mes "mourning my loss.";
+ next;
+ mes "[Egnigem]";
+ mes "I suppose that's why I'm here";
+ mes "in Nifflheim. I can't quite move on to heaven, Valhalla or anywhere else without her.";
+ next;
+ mes "[Egnigem]";
+ mes "Anyway, go and visit the Crusader Headquarters. You might be able to learn more about Rebarev Doug and stop any new shadiness he might be plotting. Good luck, my friend.";
+ goto L_Menu;
+ break;
+ case 4:
+ mes "[Egnigem]";
+ mes "Thank you for";
+ mes "listening to me...";
+ if (god_eremes == 21) set god_eremes,23;
+ else if(god_eremes == 22) set god_eremes,24;
+ close;
+ break;
+ }
+ }
+ }
+ else if (god_eremes == 25)
+ {
+ mes "[Egnigem]";
+ mes "Listen...";
+ mes "I'm going to imbue you with the ^FF0000last vestiges of my strength^000000...";
+ next;
+ mes "[Egnigem]";
+ mes "This is all I can do for you in return...";
+ set god_eremes,27;
+ if (BaseLevel < 56)
+ set BaseExp,BaseExp + 27000;
+ else if (BaseLevel > 55 && BaseLevel < 61)
+ set BaseExp,BaseExp + 30000;
+ else if (BaseLevel > 60 && BaseLevel < 66)
+ set BaseExp,BaseExp + 56052;
+ else if (BaseLevel > 65 && BaseLevel < 71)
+ set BaseExp,BaseExp + 82233;
+ else if (BaseLevel > 70 && BaseLevel < 76)
+ set BaseExp,BaseExp + 212271;
+ else if (BaseLevel > 75 && BaseLevel < 81)
+ set BaseExp,BaseExp + 390738;
+ else if (BaseLevel > 80 && BaseLevel < 86)
+ set BaseExp,BaseExp + 451020;
+ else if (BaseLevel > 85 && BaseLevel < 91)
+ set BaseExp,BaseExp + 546156;
+ else if (BaseLevel > 90)
+ set BaseExp,BaseExp + 1220358;
+ close;
+ }
+ else if (god_eremes == 26)
+ {
+ mes "[Egnigem]";
+ mes "As a Crusader...";
+ mes "This is the best thing";
+ mes "I can do in return for";
+ mes "what you have done for me.";
+ next;
+ mes "[Egnigem]";
+ mes "Listen...";
+ mes "I'm going to";
+ mes "imbue you with the";
+ mes "^666666last vestiges of my strength^000000...";
+ specialeffect 57;
+ specialeffect2 152;
+ next;
+ mes "[Egnigem]";
+ mes "May the heavens";
+ mes "answer me as I call upon the";
+ mes "light of justice that empowers the defenders of truth, and threaten the enemies of peace.";
+ specialeffect 58;
+ specialeffect2 152;
+ next;
+ mes "[Egnigem]";
+ mes "May you always shine with";
+ mes "the light of truth. Let the light within you eradicate the shadows";
+ mes "of deception, fear and malice.";
+ specialeffect 58;
+ specialeffect2 152;
+ next;
+ mes "[Egnigem]";
+ mes "By the holy power";
+ mes "invested in me, I humbly bestow upon you my remaining strength. Fight honorably, and do not lose sight of righteousness.";
+ specialeffect 60;
+ specialeffect2 245;
+ set god_eremes,27;
+ if (BaseLevel < 56)
+ set BaseExp,BaseExp + 27000;
+ else if (BaseLevel > 55 && BaseLevel < 61)
+ set BaseExp,BaseExp + 30000;
+ else if (BaseLevel > 60 && BaseLevel < 66)
+ set BaseExp,BaseExp + 56052;
+ else if (BaseLevel > 65 && BaseLevel < 71)
+ set BaseExp,BaseExp + 82233;
+ else if (BaseLevel > 70 && BaseLevel < 76)
+ set BaseExp,BaseExp + 212271;
+ else if (BaseLevel > 75 && BaseLevel < 81)
+ set BaseExp,BaseExp + 390738;
+ else if (BaseLevel > 80 && BaseLevel < 86)
+ set BaseExp,BaseExp + 451020;
+ else if (BaseLevel > 85 && BaseLevel < 91)
+ set BaseExp,BaseExp + 546156;
+ else if (BaseLevel > 90)
+ set BaseExp,BaseExp + 1220358;
+ close;
+ }
+ else if (god_eremes < 20)
+ {
+ mes "[Egnigem]";
+ mes "Were you betrayed by fate as well, or are you simply a wanderer that's stumbled into this land of darkness?";
+ next;
+ mes "[Egnigem]";
+ mes "Hmm, the living don't deserve";
+ mes "to be in this realm of cold and suffering. But I can only help you escape by telling you what little";
+ mes "I know.";
+ next;
+ switch( select( "Ask him about buildings.", "Remove marks on mini-map.", "Cancel." ) )
+ {
+ case 1:
+ mes "[Egnigem]";
+ mes "I see. If you better understand Niflheim's layout, you have a greater chance of surviving and escaping.";
+ next;
+ switch( select( "Witch's Castle", "Tool Shop", "Weapon Shop", "Tavern", "Cancel" ) )
+ {
+ case 1:
+ mes "[Egnigem]";
+ mes "The witch of Nifflheim...";
+ mes "You can find her castle at the ^FF3355+^000000 mark I've made on your mini-map.";
+ next;
+ mes "[Egnigem]";
+ mes "Hrrrm...";
+ mes "It seems that the living who wind up in Nifflheim are seeking out the witch. But I don't quite understand what's so important about her.";
+ viewpoint 1,253,191,2,0xFFFF33;
+ break;
+ case 2:
+ mes "[Egnigem]";
+ mes "The Tool shop? Here in Nifflheim, they sell some unique items that";
+ mes "you can't buy anywhere else.";
+ next;
+ mes "[Egnigem]";
+ mes "You might want to see their";
+ mes "wares for yourself. I've drawn";
+ mes "a ^CE6300+^000000 on your mini-map to mark";
+ mes "its location.";
+ viewpoint 1,217,196,3,0xFFCE63;
+ break;
+ case 3:
+ mes "[Egnigem]";
+ mes "I've marked the location of the Weapon Shop at ^55FF33+^000000. There's nothing too special over there, though.";
+ viewpoint 1,216,171,4,0xFF55FF;
+ break;
+ case 4:
+ mes "[Egnigem]";
+ mes "Tavern is at ^3355FF+^000000. They only sell drinks to the dead, though...";
+ viewpoint 1,189,207,5,0xFF3355;
+ break;
+ case 5:
+ mes "[Egnigem]";
+ mes "Choose 'Remove marks on mini-map' from the menu to remove all the building location marks I've made.";
+ close;
+ break;
+ }
+ close;
+ break;
+ case 2:
+ viewpoint 2,253,191,2,0xFF00FF;
+ viewpoint 2,217,196,3,0xFF00FF;
+ viewpoint 2,216,171,4,0xFF00FF;
+ viewpoint 2,189,207,5,0xFF00FF;
+ mes "[Egnigem]";
+ mes "Alright, all the marks I've made have been removed from your mini-map. If you want to check the locations in Nifflheim again, go ahead and ask me.";
+ close;
+ break;
+ case 3:
+ mes "[Egnigem]";
+ mes "You're gonna explore this place on your own? Pretty brave, aren't you? Just be careful: here in Nifflheim, darkness reigns supreme.";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Egnigem]";
+ mes "I really wish that";
+ mes "Emma Searth could";
+ mes "remember me...";
+ next;
+ mes "^3355FFHis eyes seemed";
+ mes "to moisten with sadness.";
+ mes "Is it really possible for the";
+ mes "dead to shed tears?^000000";
+ close;
+ }
+}
+ else
+{
+ mes "[Egnigem]";
+ mes "Were you betrayed by fate as well, or are you simply a wanderer that's stumbled into this land of darkness?";
+ next;
+ mes "[Egnigem]";
+ mes "Hmm, the living don't deserve";
+ mes "to be in this realm of cold and suffering. But I can only help you escape by telling you what little";
+ mes "I know.";
+ next;
+ switch( select( "Ask him about buildings.", "Remove marks on mini-map.", "Cancel." ) )
+ {
+ case 1:
+ mes "[Egnigem]";
+ mes "...I see. Now, let me introduce you all buildings in Nifflheim!";
+ next;
+ switch( select( "Witch's Castle", "Tool Shop", "Weapon Shop", "Tavern", "Cancel" ) )
+ {
+ case 1:
+ mes "[Egnigem]";
+ mes "The witch of Nifflheim...";
+ mes "You can find her castle at the ^FF3355+^000000 mark I've made on your mini-map.";
+ next;
+ mes "[Egnigem]";
+ mes "Hrrrm...";
+ mes "It seems that the living who wind up in Nifflheim are seeking out the witch. But I don't quite understand what's so important about her.";
+ viewpoint 1,253,191,6,0xFFFF33;
+ break;
+ case 2:
+ mes "[Egnigem]";
+ mes "The Tool shop? Here in Nifflheim, they sell some unique items that";
+ mes "you can't buy anywhere else.";
+ next;
+ mes "[Egnigem]";
+ mes "You might want to see their";
+ mes "wares for yourself. I've drawn";
+ mes "a ^CE6300+^000000 on your mini-map to mark";
+ mes "its location.";
+ viewpoint 1,217,196,7,0xFFCE63;
+ break;
+ case 3:
+ mes "[Egnigem]";
+ mes "I've marked the location of the Weapon Shop at ^55FF33+^000000. There's nothing too special over there, though.";
+ viewpoint 1,216,171,8,0xFF55FF;
+ break;
+ case 4:
+ mes "[Egnigem]";
+ mes "Tavern is at ^3355FF+^000000. They only sell drinks to the dead, though...";
+ viewpoint 1,189,207,9,0xFF3355;
+ break;
+ case 5:
+ mes "[Egnigem]";
+ mes "Choose 'Remove marks on mini-map' from the menu to remove all the building location marks I've made.";
+ close;
+ break;
+ }
+ close;
+ break;
+ case 2:
+ viewpoint 2,253,191,6,0xFF00FF;
+ viewpoint 2,217,196,7,0xFF00FF;
+ viewpoint 2,216,171,8,0xFF00FF;
+ viewpoint 2,189,207,9,0xFF00FF;
+ mes "[Egnigem]";
+ mes "Alright, all the marks I've made have been removed from your mini-map. If you want to check the locations in Nifflheim again, go ahead and ask me.";
+ close;
+ break;
+ case 3:
+ mes "[Egnigem]";
+ mes "You're gonna explore this place on your own? Pretty brave, aren't you? Just be careful: here in Nifflheim, darkness reigns supreme.";
+ close;
+ break;
+ }
+ close;
+}
+
+}
+
+
diff --git a/npc/quests/seals/mjolnir_seal.txt b/npc/quests/seals/mjolnir_seal.txt
index adb6b1a5f..424aafca5 100644
--- a/npc/quests/seals/mjolnir_seal.txt
+++ b/npc/quests/seals/mjolnir_seal.txt
@@ -1,3159 +1,3159 @@
-//===== eAthena Script =======================================
-//= Mjolnir seal unlocking NPCs.
-//===== By: ==================================================
-//= SinSloth
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Quest for breaking the seal of Mjolnir.
-//===== Additional Comments: =================================
-// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
-// 1.1 Fixed wrong label names [Luups]
-//============================================================
-
-prontera.gat,124,297,3 script Tialfi 706,{
-
- if ($God3 < 50)
-{
- mes "[Tialfi]";
- mes "Hmmm...";
- mes "I can feel a strange force";
- mes "growing stronger and stronger,";
- mes "somewhere on in Rune-Midgard.";
- next;
- mes "[Tialfi]";
- mes "Can you feel it?";
- mes "Something must be";
- mes "going on!";
- close;
-}
- else
-{
- if(god_mjo_0 == 11)
- {
- mes "[Tialfi]";
- mes "I'm waiting for the day";
- mes "when I'll finally get to";
- mes "see Thor's thunder for myself.";
- mes "I believe that one of these days,";
- mes "my dream will become reality.";
- close;
- }
- else if(god_mjo_1 == 2 && god_mjo_2 == 2 && god_mjo_3 == 2 && god_mjo_4 == 2)
- {
- if (god_mjo_0 == 10)
- {
- if (countitem(756) > 49 && countitem(757) > 49)
- {
- if (Class == Job_Knight || Class == Job_Lord_Knight) set @gift,1;
- if (Class == Job_Priest || Class == Job_High_Priest) set @gift,2;
- if (Class == Job_Wizard || Class == Job_High_Wizard) set @gift,3;
- if (Class == Job_Blacksmith || Class == Job_Whitesmith) set @gift,4;
- if (Class == Job_Hunter || Class == Job_Sniper) set @gift,5;
- if (Class == Job_Assassin || Class == Job_Assassin_Cross) set @gift,6;
- if (Class == Job_Crusader || Class == Job_Paladin) set @gift,7;
- if (Class == Job_Monk || Class == Job_Champion) set @gift,8;
- if (Class == Job_Sage || Class == Job_Professor) set @gift,9;
- if (Class == Job_Alchemist || Class == Job_Creator) set @gift,10;
- if (Class == Job_Rogue || Class == Job_Stalker) set @gift,11;
- if (Class == Job_Bard || Class == Job_Clown) set @gift,12;
- if (Class == Job_Dancer || Class == Job_Gypsy) set @gift,13;
- mes "[Tialfi]";
- mes "You came back.";
- mes "In exchange for the ores that";
- mes "you have brought me, I will";
- mes "give you one of my family";
- mes "treasures.";
- next;
- mes "[Tialfi]";
- mes "My ancestors will be glad";
- mes "that that their treasure was";
- mes "used for a good purpose.";
- next;
- mes "[Tialfi]";
- mes "You have two options in";
- mes "choosing a treasure. You can";
- mes "have a treasure that will be";
- mes "useful to yourself, or something";
- mes "that may suit one of your friends.";
- next;
- mes "[Tialfi]";
- mes "So which treasure";
- mes "would you like to have?";
- next;
- menu "An item that I can use.",-,"An item that my friend can use.",L_Friend;
- mes "[Tialfi]";
- mes "I see. Give me a moment";
- mes "to find a suitable item";
- mes "for you.";
- next;
- goto L_Gift;
-
- L_Friend:
- mes "[Tialfi]";
- mes "I see. Give me a moment";
- mes "to find a suitable item";
- mes "for your friend.";
- set @gift,rand(1,13);
- next;
- L_Gift:
- mes "[Tialfi]";
- mes "Okay, let's see...";
- mes "I seem to recall that I put";
- mes "it somewhere around... Hmm.";
- mes "It must be around--Ah!";
- mes "Here we are~";
- next;
- delitem 756,50;
- delitem 757,50;
- set god_mjo_0,11;
- if (@gift == 1) getitem 1471,1;
- if (@gift == 2) getitem 1526,1;
- if (@gift == 3) getitem 1231,1;
- if (@gift == 4) getitem 1367,1;
- if (@gift == 5) getitem 1722,1;
- if (@gift == 6) getitem 1230,1;
- if (@gift == 7) getitem 1141,1;
- if (@gift == 8) getitem 1813,1;
- if (@gift == 9) getitem 1557,1;
- if (@gift == 10) getitem 1235,1;
- if (@gift == 11) getitem 1227,1;
- if (@gift == 12) getitem 1913,1;
- if (@gift == 13) getitem 1963,1;
- mes "[Tialfi]";
- mes "Once again, I thank you";
- mes "for the trouble you've gone";
- mes "through on my behalf.";
- next;
- mes "[Tialfi]";
- mes "I'm unsure of how this";
- mes "treasure works, but I hope it";
- mes "will be useful to you. From";
- mes "what I know, I believe this";
- mes "is a rare item.";
- next;
- mes "[Tialfi]";
- mes "I'll be waiting for the day";
- mes "when I'll see Thor's thunder";
- mes "for myself. I believe that,";
- mes "one of these days, the dream";
- mes "I've had will come true.";
- close;
- }
- else
- {
- mes "[Tialfi]";
- mes "I need";
- mes "50 Rough Oridecon";
- mes "and 50 Rough Elunium.";
- next;
- mes "[Tialfi]";
- mes "I don't have much time, so";
- mes "go ahead and continue on";
- mes "your journeys if you can't";
- mes "bring those to me.";
- close;
- }
- }
- else
- {
- if ($God4 > 99)
- {
- mes "[Tialfi]";
- mes "I sense a strange energy";
- mes "growing more powerful";
- mes "somewhere on this continent...";
- next;
- mes "[Tialfi]";
- mes "Can you feel it?";
- mes "Something must be going on!";
- next;
- mes "[Tialfi]";
- mes "I think we'd better wait and";
- mes "see what's happening. Someone";
- mes "will deliver the news to us.";
- mes "Though, I am unsure of whether";
- mes "or not it will be good news or bad...";
- close;
- }
- else
- {
- set $God4,$God4 +1;
- if($God4 == 50)
- {
- announce "The Fourth Seal of [Mjolnir] has appeared.",bc_all;
- }
- else if($God4 == 100 && $God2 == 100 && $God3 == 100 && $God1 == 100)
- {
- announce "All four seals have been released.",bc_all;
- }
- else if($God4 == 100)
- {
- announce "[Mjolnir] has been released.",bc_all;
- }
- set god_mjo_0,10;
- mes "[Tialfi]";
- mes "You've met the four Dwarven";
- mes "Blacksmiths. I've heard that";
- mes "they will rarely speak to humans.";
- mes "So you must be special if you";
- mes "were able to talk to them.";
- next;
- mes "[Tialfi]";
- mes "Do you think that my dream";
- mes "will come true? Do you believe";
- mes "Thor's Mjolnir will appear before";
- mes "the eyes of humans? I'm afraid great";
- mes "change will come to this world.";
- next;
- mes "[Tialfi]";
- mes "Thank you for going through such";
- mes "trouble on my behalf. I wish to";
- mes "give you one of my family";
- mes "treasures as a token of my";
- mes "gratitude.";
- next;
- mes "[Tialfi]";
- mes "However, I hope you understand";
- mes "that my family would grow suspicious";
- mes "if one of the treasures were to";
- mes "just go missing.";
- next;
- mes "[Tialfi]";
- mes "Hmm, however, I don't think they'll";
- mes "complain if I exchanged one of";
- mes "the treasures for something else.";
- mes "Let me think...";
- next;
- mes "[Tialfi]";
- mes "I should be able to give you one";
- mes "of our family heirlooms if you";
- mes "can bring be 50 Rough Oridecons";
- mes "and 50 Rough Eluniums.";
- next;
- mes "[Tialfi]";
- mes "You don't have to do that if";
- mes "you don't want to. But it seems";
- mes "our family heirlooms would be";
- mes "more useful to an adventurer";
- mes "such as yourself...";
- close;
- }
- }
- }
- else if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Tialfi]";
- mes "Hmm...";
- mes "The Dwarven Blacksmiths must be";
- mes "upset at you for some reason.";
- next;
- mes "[Tialfi]";
- mes "Remember my sister's suggestion";
- mes "and speak to them with great";
- mes "courtesy. Carefully choose";
- mes "words of respect lest they be";
- mes "insulted.";
- next;
- set god_mjo_1,0;
- set god_mjo_2,0;
- set god_mjo_3,0;
- set god_mjo_4,0;
- mes "[Tialfi]";
- mes "You should be okay now. By";
- mes "this time, they've probably";
- mes "forgotten the insult. But make";
- mes "sure you speak to my sister";
- mes "for advice first.";
- close;
- }
- else if(god_mjo_0 == 2 || god_mjo_0 == 1)
- {
- mes "[Tialfi]";
- mes "Sorry for the trouble.";
- mes "I wish you good luck.";
- close;
- }
- else if(god_mjo_0 == 0)
- {
- if($God4 > 99)
- {
- mes "[Tialfi]";
- mes "Listen...I can feel unknown";
- mes "energy arising somewhere in";
- mes "this continent.";
- mes "Can you feel it? There must";
- mes "be something going on...!";
- next;
- mes "[Tialfi]";
- mes "I think we'd better wait to";
- mes "see what's happening. Someone";
- mes "will deliver the news to us.";
- mes "I am not sure if it will be a";
- mes "good news or a bad news.";
- close;
- }
- else if(BaseLevel < 70)
- {
- mes "[Tialfi]";
- mes "One of my ancestors supposedly";
- mes "was a servant of Thor. Still,";
- mes "I find it difficult to believe.";
- next;
- mes "[Tialfi]";
- mes "If the gods have all these";
- mes "powers, how could a mere human";
- mes "be of any real assistance?";
- close;
- }
- mes "[Tialfi]";
- mes "Adventurer, I have an interesting";
- mes "story to tell you. Last night,";
- mes "I had the most amazing dream";
- mes "where I was the servant of Thor,";
- mes "god of thunder.";
- next;
- mes "[Tialfi]";
- mes "In this dream, I traveled with";
- mes "Thor to Jotunnheim, land of giants.";
- mes "During our journey, he told me";
- mes "many interesting stories about";
- mes "gods and heroes.";
- next;
- mes "[Tialfi]";
- mes "Of course, I can't remember";
- mes "everything clearly, but it was";
- mes "truly fantastic.";
- next;
- mes "[Tialfi]";
- mes "For some reason, I can vividly";
- mes "recall what Thor told me about";
- mes "his weapon, Mjolnir. Mjolnir is";
- mes "a Dwarven masterpiece.";
- next;
- mes "[Tialfi]";
- mes "Thor told me that Dwarves are";
- mes "extremely talented artisans, and";
- mes "their works are supreme. So as";
- mes "I was thinking about my dream,";
- mes "I remembered...";
- next;
- mes "[Tialfi]";
- mes "There is a mountain that has the";
- mes "same name as Thor's weapon. Surely,";
- mes "the two have some relation to";
- mes "each other.";
- next;
- mes "[Tialfi]";
- mes "I've also recently heard a rumor";
- mes "that Dwarven Blacksmiths also";
- mes "reside on Mount Mjolnir.";
- next;
- mes "[Tialfi]";
- mes "I understand the mountain is";
- mes "dangerous, and that I'm in no";
- mes "position to ask such a thing...";
- next;
- mes "[Tialfi]";
- mes "I can't help wanting to know";
- mes "for myself whether or not there";
- mes "is truth to my dream. Is it";
- mes "possible for Mjolnir to resurface?";
- next;
- mes "[Tialfi]";
- mes "If you don't mind, I'd like to ask";
- mes "you to explore this mountain and";
- mes "search for these Dwarven Blacksmiths.";
- next;
- menu "No.",-,"Okay.",L_Ok;
- mes "[Tialfi]";
- mes "I see. But I still appreciate";
- mes "that you took the time to";
- mes "listen to me.";
- next;
- mes "[Tialfi]";
- mes "Hopefully someday I'll learn";
- mes "the truth about my dreams and";
- mes "about Mjolnir itself.";
- close;
-
- L_Ok:
- mes "[Tialfi]";
- mes "Thank you, thank you so much!";
- mes "Even though it won't be easy,";
- mes "I have faith that if the Dwarven";
- mes "Blacksmiths do exist, you'll be";
- mes "able to find them.";
- next;
- mes "[Tialfi]";
- mes "Oh, and please speak to my";
- mes "sister Roskva first. She is";
- mes "outside the North entrance";
- mes "of Prontera.";
- next;
- mes "[Tialfi]";
- mes "I'm sure that she can give";
- mes "you useful information if";
- mes "you're fortunate enough to";
- mes "encounter the Dwarves.";
- next;
- set god_mjo_0,rand(1,2);
- mes "[Tialfi]";
- mes "I'm truly lucky to meet such";
- mes "an adventurer like yourself.";
- mes "I wish you the best of luck.";
- close;
-
- }
- else
- {
- mes "[Tialfi]";
- mes "I believe in you.";
- mes "Just be courageous.";
- close;
- }
-
-}
-
-}
-
-prt_fild01.gat,196,47,3 script Roskva 703,{
-
-
- if(god_mjo_0 == 1)
-{
- mes "[Roskva]";
- mes "You should know that Dwarven";
- mes "Blacksmiths are extremely";
- mes "offended if you do not speak";
- mes "to them with the utmost respect.";
- next;
- mes "[Roskva]";
- mes "So it's really";
- mes "important that you";
- mes "speak to the Dwarves";
- mes "as courteously as you can.";
- mes "The first Dwarf you must visit";
- mes "can be found to the East.";
- next;
- mes "[Roskva]";
- mes "Travel in a clock wise direction";
- mes "around Rune-Midgard and seek";
- mes "out the other Dwarves in order.";
- mes "Your final destination will be";
- mes "to the North.";
- next;
- mes "[Roskva]";
- mes "If you happen to speak to them";
- mes "in the wrong order, please go";
- mes "talk to my brother Tialfi again.";
- close;
-}
- else if(god_mjo_0 == 2)
-{
- mes "[Roskva]";
- mes "You should know that Dwarven";
- mes "Blacksmiths are extremely";
- mes "offended if you do not speak";
- mes "to them with the utmost respect.";
- next;
- mes "[Roskva]";
- mes "So it's really";
- mes "important that you";
- mes "speak to the Dwarves";
- mes "as courteously as you can.";
- mes "The first Dwarf you must visit";
- mes "can be found to the North.";
- next;
- mes "[Roskva]";
- mes "Travel in a counter clock wise";
- mes "direction around Rune-Midgard";
- mes "and seek out the other Dwarves";
- mes "in order. Your final destination";
- mes "will be to the East.";
- next;
- mes "[Roskva]";
- mes "If you happen to speak to them";
- mes "in the wrong order, please go";
- mes "talk to my brother Tialfi again.";
- close;
-}
- else
-{
- mes "[Roskva]";
- mes "A long long time ago, many";
- mes "people used to frequent this";
- mes "area. Friends and families";
- mes "would live here, sharing";
- mes "happiness and sadness.";
- next;
- mes "[Roskva]";
- mes "But they're all gone now.";
- mes "My parents and my friends";
- mes "have all gone to a place";
- mes " whose name I don't even know.";
- next;
- mes "[Roskva]";
- mes "I can't help";
- mes "but feel lonesome...";
- close;
-}
-
-}
-
-mjolnir_11.gat,149,247,5 script Dwarf Blacksmith#east 826,{
-
- if ($God3 < 50)
-{
- mes "[Austri]";
- mes "Something is happening";
- mes "somewhere on this continent.";
- mes "You might not believe me,";
- mes "but keep getting visions of";
- mes "the Fenrir-Wolf.";
- close;
-}
- else
-{
- if($God4 > 99)
- {
- mes "[Austri]";
- mes "Something is happening";
- mes "somewhere on this continent.";
- mes "You might not believe me,";
- mes "but keep getting visions of";
- mes "the Fenrir-Wolf.";
- close;
- }
- else if(god_mjo_0 == 11)
- {
- mes "[Austri]";
- mes "One day, when my people";
- mes "retrieve their memories of";
- mes "the past, we will be able to";
- mes "grant the power of the gods";
- mes "to humans.";
- next;
- mes "[Austri]";
- mes "I believe that";
- mes "time is coming...";
- close;
- }
- else if(god_mjo_0 == 10)
- {
- mes "[Austri]";
- mes "Ho~ you might be asked";
- mes "something from the human child.";
- mes "If I were you, I would do the";
- mes "kid a favor right away. Somehow";
- mes "he is related to us in some sense.";
- close;
- }
- else if(god_mjo_0 == 1)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Austri]";
- mes "What is it?! I refuse to";
- mes "speak to human as rude";
- mes "and contemptible as you!";
- mes "Leave!";
- close;
- }
- else if(god_mjo_1 == 2)
- {
- mes "[Austri]";
- mes "What? I don't have anything";
- mes "to talk to you.";
- close;
- }
- else if (god_mjo_2 != 0 || god_mjo_3 != 0 || god_mjo_4 != 0)
- {
- mes "[Austri]";
- mes "Hm...?";
- mes "Why have you";
- mes "come to me, human?";
- next;
- menu "Nothing.",-,"Hey, 'sup!",L_Sup;
- mes "[Austri]";
- mes "...";
- close;
-
- L_Sup:
- set god_mjo_1,3;
- mes "[Austri]";
- mes "What...?!";
- mes "Do not greet the";
- mes "Dwarves lightly,";
- mes "mortal!";
- close;
- }
- else if(god_mjo_1 == 1)
- {
- mes "[Austri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse;
- mes "[Austri]";
- mes "...";
- close;
-
- L_Excuse:
- if(countitem(1005) > 0)
- {
- mes "[Austri]";
- mes "Ah, I see that the entire human";
- mes "race is not worthy of scorn.";
- mes "Unlike many of your kind,";
- mes "I see that you respect your";
- mes "elders.";
- next;
- set @mjo_east,0;
- L_EastTalk:
- switch(@mjo_east)
- {
- case 0:
- mes "[Austri]";
- mes "So what have";
- mes "you come to";
- mes "ask of me?";
- next;
- menu "...",-,"About Mjolnir.",L_Speak;
- goto L_Listen;
-
- case 1:
- mes "[Austri]";
- mes "Mjolnir...?";
- mes "Thor's legendary weapon?";
- mes "The hammer than can shake the";
- mes "earth and tear the sky asunder?";
- mes "All of legendary weapons,";
- mes "Mjolnir is perhaps greatest.";
- next;
- mes "[Austri]";
- mes "As a matter of fact, it was forged";
- mes "by my ancestor. Mjolnir was the";
- mes "perfect weapon, except for one";
- mes "minor flaw.";
- next;
- mes "[Austri]";
- mes "The hilt of Mjolnir was forged";
- mes "shorter than intended. Are you";
- mes "still listening to me?";
- next;
- menu "...",-,"Yes, sir!",L_Speak,"Huh?",-;
- goto L_Listen;
-
- case 2:
- mes "[Austri]";
- mes "One day, Loki came to our";
- mes "village and showed off his";
- mes "treasures. He boasted that we";
- mes "couldn't possibly create something";
- mes "to surpass their quality.";
- next;
- mes "[Austri]";
- mes "Frankly his treasures were made";
- mes "by another Dwarf tribe, but we";
- mes "couldn't tolerate his insult. So";
- mes "my ancestors created three";
- mes "treasures of their own.";
- next;
- menu "...",-,"Yes, sir!",L_Speak,"Yes?",-;
- goto L_Listen;
-
- case 3:
- mes "[Austri]";
- mes "Of the three treasures my";
- mes "ancestors created, Mjolnir was";
- mes "the last and greatest.";
- next;
- mes "[Austri]";
- mes "However, while it was created,";
- mes "a strange fly bit my ancestor";
- mes "on the hand. Because of this";
- mes "interruption, Mjolnir's hilt";
- mes "is a little flawed.";
- next;
- mes "[Austri]";
- mes "It's very sad. Although Mjolnir";
- mes "is the greatest weapon ever, it";
- mes "was very close to being the";
- mes "epitome of craftsmanship.";
- next;
- menu "...",-,"Epito--what?",-,"Yes sir, I agree.",L_Speak;
- goto L_Listen;
-
- case 4:
- mes "[Austri]";
- mes "Despite this minor flaw,";
- mes "Mjolnir is still considered";
- mes "the greatest of legendary weapons.";
- next;
- mes "[Austri]";
- mes "Mjolnir was the trusted weapon";
- mes "Thor wielded on the battlefield";
- mes "and every giant feared its power.";
- next;
- mes "[Austri]";
- mes "I must say, a Blacksmith's";
- mes "greatest pride comes when he";
- mes "creates the weapon and armor";
- mes "that can be considered his";
- mes "life's work.";
- next;
- menu "...",-,"I agree, sir!",L_Speak,"Um, yeah.",-;
- goto L_Listen;
-
- case 5:
- mes "[Austri]";
- mes "The reason this mountain is";
- mes "called Mount Mjolnir is because";
- mes "it was actually created by the";
- mes "hammer.";
- next;
- mes "[Austri]";
- mes "In a battle against demons a";
- mes "thousand years ago, Thor struck";
- mes "the earth with Mjolnir. The impact";
- mes "caused the ground to rise,";
- mes "creating this mountain.";
- next;
- mes "[Austri]";
- mes "You can imagine just how";
- mes "unfathomly powerful Mjolnir is.";
- mes "However, humans can never hope";
- mes "to see or even wield Mjolnir. Only";
- mes "a god can handle that kind of force.";
- next;
- menu "...",-,"Wah wah wah~!",-,"Ah, I understand sir!",L_Speak;
- goto L_Listen;
-
- case 6:
- mes "[Austri]";
- mes "Hmm... But perhaps an ambitious";
- mes "dwarf can forge something similar";
- mes "to Mjolnir so that it can actually";
- mes "be used by humans. It would have less";
- mes "power, but it'd be perfectly crafted.";
- next;
- mes "[Austri]";
- mes "Yes, it's possible to create a";
- mes "Mjolnir suited to humans. Still,";
- mes "it wouldn't be very easy.";
- next;
- menu "...",-,"Yes, sir!",L_Speak,"Yeah, whatever.",-;
- goto L_Listen;
-
- case 7:
- mes "[Austri]";
- mes "Well, I happened to speak much";
- mes "longer than I intended. But I hope";
- mes "you learned what you wished to";
- mes "know about Mjolnir.";
- next;
- mes "[Austri]";
- mes "I feel that a great change is";
- mes "coming. I do not know what kind of";
- mes "effect it will have on our world,";
- mes "but something important will happen...";
- next;
- mes "[Austri]";
- mes "Perhaps only the gods can be sure";
- mes "as to what the future will bring.";
- mes "In any case, we must prepare ourselves";
- mes "for what will happen.";
- next;
- menu "...",-,"Yes?",-,"Yes, sir!",L_Speak;
- goto L_Listen;
-
- case 8:
- set god_mjo_1,2;
- mes "[Austri]";
- mes "Alright then...";
- mes "If you wish to learn more, you should";
- mes "speak to my brothers. Take care, human.";
- close;
- }
- L_Listen:
- set god_mjo_1,3;
- mes "[Austri]";
- mes "...you didn't listen to me, did you?";
- mes "Why did you make me waste my time? Leave!";
- mes "This is why I don't want to associate";
- mes "with human beings. They always pay little";
- mes "attention to the conversation with me.";
- close;
- }
- else
- {
- mes "[Austri]";
- mes "You don't seem to understand.";
- mes "If you wish to prove to me that";
- mes "you understand blacksmiths, you";
- mes "should bring something related";
- mes "to my work!";
- close;
- }
- }
- else if(god_mjo_1 == 0)
- {
- mes "[Austri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse2;
- mes "[Austri]";
- mes "...";
- close;
-
- L_Excuse2:
- mes "[Austri]";
- mes "A respectable blacksmith cherishes";
- mes "his tools and crafts with diligence";
- mes "and care.";
- next;
- mes "[Austri]";
- mes "When it comes to humans, I believe";
- mes "the ones who can appreciate my line";
- mes "of work are the only ones worth";
- mes "talking to.";
- next;
- set god_mjo_1,1;
- mes "[Austri]";
- mes "Every good blacksmith knows the";
- mes "value of a good hammer. If you can";
- mes "understand that, I shall consider";
- mes "speaking with you.";
- next;
- mes "[Austri]";
- mes "Now go, human.";
- mes "I wish you safety";
- mes "in your travels.";
- close;
- }
- else
- {
- mes "[Austri]";
- mes "Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 2)
- {
- if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Austri]";
- mes "What is it! I do not have anything to";
- mes "to such a rude human as you!";
- mes "Go back to where you are from!";
- close;
- }
- else if(god_mjo_4 == 2)
- {
- mes "[Austri]";
- mes "What? I don't have anything";
- mes "to talk to you.";
- close;
- }
- else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_3 == 0 || god_mjo_3 == 1)
- {
- mes "[Austri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Hey, sup!",L_Sup2;
- mes "[Austri]";
- mes "...";
- close;
- L_Sup2:
- set god_mjo_4,3;
- mes "[Austri]";
- mes "What?!";
- mes "Leave immediately and go study";
- mes "your english properly!";
- close;
- }
- else if(god_mjo_4 == 1)
- {
- mes "[Austri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse3;
- mes "[Austri]";
- mes "...";
- close;
- L_Excuse3:
- if(countitem(1005) > 0)
- {
- mes "[Austri]";
- mes "Hmm, I like your polite manners.";
- mes "Okay, I am willing to talk to you.";
- mes "So ask me if you have any questions.";
- next;
- set @mjo_east,0;
- L_EastTalk2:
- switch(@mjo_east)
- {
- case 0:
- mes "[Austri]";
- mes "So, what would you like to ask?";
- next;
- menu "...",-,"About Mjolnir.",L_Speak2;
- goto L_Listen2;
- case 1:
- mes "[Austri]";
- mes "Mjolnir...you mean the Thor's legendary weapon?";
- mes "There has a rumor that Mjolnir slashed the sky";
- mes "and stunned the earth by one blow.";
- mes "That is the greatest weapon in the legend.";
- next;
- mes "[Austri]";
- mes "As a matter of fact, it was forged by my ancestor.";
- mes "Do you know the reason why the hilt of Mjolnir";
- mes "was forged that short...?";
- mes "Are you listening to me?";
- next;
- menu "...",-,"Yes?",-,"Yes, sir!",L_Speak2;
- goto L_Listen2;
- case 2:
- mes "[Austri]";
- mes "One day, Loki came to dwarf's town";
- mes "and showed off his three treasure.";
- mes "He provoked us by saying";
- mes "nobody would make better things";
- mes "than his treasures.";
- next;
- mes "[Austri]";
- mes "Frankly his treasures were made by other dwarf tribe...";
- mes "but anyway, we could not put up with the insult.";
- mes "So my ancestor made three treasures of our own...";
- mes "Are you still listening to me?";
- next;
- menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
- goto L_Listen2;
- case 3:
- mes "[Austri]";
- mes "Mjolnir was the last treasure among the three.";
- mes "While blowing the bellows,";
- mes "my ancerstor was bitten by a strange insect on his hand.";
- mes "So he could not continue working.";
- mes "That's how the hilt of Mjolnir became that short.";
- mes "Ah, what a sad story!";
- next;
- menu "...",-,"I agree, sir!",L_Speak2,"Yes?",-;
- goto L_Listen2;
- case 4:
- mes "[Austri]";
- mes "Despite of the sad incident,";
- mes "my ancerstor created the greatest weapon";
- mes "in the legend. Mjolnir became Thor's the most reliable comrade";
- mes "in the battlefield. Even giants in Utgard feared";
- mes "the power of the godly weapon.";
- next;
- mes "[Austri]";
- mes "However, since the weapon had the abnormally short hilt,";
- mes "Thor had to wear iron gauntlets to compensate the weakness.";
- mes "I must say, blacksmiths feel most proud when they";
- mes "achieve to create the best weapons and armors of their life.";
- next;
- menu "...",-,"Yes?",-,"I agree, sir!",L_Speak2;
- goto L_Listen2;
- case 5:
- mes "[Austri]";
- mes "And I am going to tell you";
- mes "the reason why this mountain has been called";
- mes "as Mountain Mjolnir... during the battle against demons";
- mes "occurred a thousand years ago, he hammered down";
- mes "the earth using Mjolnir. Because of the impact,";
- mes "the ground around the spot rose high";
- mes "and formed a mountain.";
- next;
- mes "[Austri]";
- mes "You can imagine how powerful Mjolnir would be.";
- mes "It made a new mountain by one hammering.";
- mes "Unfortunately, you wouldn't be able to see";
- mes "the weapon in your life. Somehow it is belong to God.";
- next;
- menu "...",-,"I can understand, sir!",L_Speak2,"Yes?",-;
- goto L_Listen2;
- case 6:
- mes "[Austri]";
- mes "Perhaps an ambitious dwarf could forge";
- mes "a treasure is similar to Mjolnir.";
- mes "But it will not happen to be exactly the same as the original Mjolnir.";
- mes "The original one cannot be held by a human being";
- mes "due to the unimaginable power it holds within.";
- next;
- mes "[Austri]";
- mes "Let's say, a modified Mjolnir which would be suited to human's power";
- mes "can be made possibly...? But still, it will not";
- mes "easily happen.";
- mes "Just, never mind.";
- next;
- menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
- goto L_Listen2;
- case 7:
- mes "[Austri]";
- mes "I happened to speak longer than I planned.";
- mes "But this is it. I hope you will have a better understanding";
- mes "about Mjolnir by now.";
- mes "And obviously something has been happening";
- mes "in this world...I can feel that.";
- next;
- mes "[Austri]";
- mes "I cannot tell it will bring a good effect or a bad one to";
- mes "the continent...";
- mes "Maybe Gods would know.";
- mes "We must prepare to survive in the changes.";
- next;
- menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
- goto L_Listen2;
- case 8:
- set god_mjo_4,2;
- mes "[Austri]";
- mes "Ok, you may leave me and visit my brothers now.";
- mes "Take care.";
- close;
- }
- L_Listen2:
- set god_mjo_4,3;
- mes "[Austri]";
- mes "...you didn't listen to me, did you?";
- mes "Why did you make me waste my time? Leave!";
- mes "This is why I don't want to associate with human beings.";
- mes "They always pay little attention to the conversation with me.";
- close;
-
- }
- else
- {
- mes "[Austri]";
- mes "You don't seem to understand.....";
- mes "If you want to prove me that you understand how blacksmiths feel,";
- mes "bring a thing related to blacksmiths!";
- close;
- }
- }
- else if(god_mjo_4 == 0)
- {
- mes "[Austri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse4;
- mes "[Austri]";
- mes "...";
- close;
-
- L_Excuse4:
- mes "[Austri]";
- mes "A respectable blacksmith cherishes his hammer and anvil.";
- mes "If you wish to continue a conversation with me,";
- mes "you should understand blacksmiths.";
- mes "Every blacksmith knows what hammer is good for themselves.";
- next;
- set god_mjo_4,1;
- mes "[Austri]";
- mes "If you understand what I meant,";
- mes "I will consider speaking to you next time.";
- mes "Have a good travel.";
- close;
- }
- else
- {
- mes "[Austri]";
- mes "Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 0)
- {
- mes "[Austri]";
- mes "Ah...";
- mes "It feels like today's going to be a great day.";
- next;
- mes "[Austri]";
- mes "I've got the warm sun, fresh forest air, and my hammer and anvil are at the ready. It's a perfect day for smithing!";
- close;
- }
- else
- {
- mes "[Austri]";
- mes "Zzzz Zzzz...";
- close;
- }
-}
-
-L_Speak:
- set @mjo_east,@mjo_east +1;
- goto L_EastTalk;
-
-L_Speak2:
- set @mjo_east,@mjo_east +1;
- goto L_EastTalk2;
-
-}
-
-mjolnir_09.gat,209,341,3 script Dwarf Blacksmith#south 826,{
-
- if ($God3 < 50)
-{
- mes "[Sudri]";
- mes "I want to compete";
- mes "and fight with stronger";
- mes "and stronger opponents!";
- next;
- mes "[Sudri]";
- mes "One day, I'll return to";
- mes "Svartalfaheimr and defeat";
- mes "Ivaldi! Mwahahaha!";
- close;
-}
- else
-{
- if ($God4 > 99)
- {
- mes "[Sudri]";
- mes "Wait, this is not the";
- mes "right time to fighting...";
- next;
- mes "[Sudri]";
- mes "Something that has been hidden";
- mes "is about to be born out of the";
- mes "sweat of determination and";
- mes "tears of sacrifice. We must";
- mes "wait until then.";
- close;
- }
- else if(god_mjo_0 == 11)
- {
- mes "[Sudri]";
- mes "I want to compete with a stronger one!";
- mes "I will be stronger and stronger,";
- mes "one day when I get back to Svartalfaheimr";
- mes "I shall defeat Ivaldi!";
- mes "Muhahahaha...!";
- close;
- }
- else if(god_mjo_10 == 10)
- {
- mes "[Sudri]";
- mes "I must admit that you're a";
- mes "really strong human. Let us";
- mes "fight again when we have a chance.";
- mes "The next time, you may not be";
- mes "so lucky!";
- close;
- }
- else if(god_mjo_0 == 1)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Sudri]";
- mes "Go back to where you belong";
- mes "before I beat you to death!";
- next;
- mes "[Sudri]";
- mes "All you can gain here are";
- mes "a few herbs.";
- close;
- }
- else if(god_mjo_2 == 2)
- {
- mes "[Sudri]";
- mes "That was a great fight!";
- mes "Mwahahaha! I'm satisfied with";
- mes "the results. I may have lost,";
- mes "but we fought honorably with";
- mes "everything we had.";
- close;
- }
- else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_3 != 0 || god_mjo_4 != 0)
- {
- mes "[Sudri]";
- mes "So...";
- mes "What brings";
- mes "you here?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse;
- mes "[Sudri]";
- mes "You have too much time on";
- mes "your hands. Why don't you";
- mes "log out and hang out with";
- mes "your friends instead?";
- close;
-
- L_Excuse:
- set god_mjo_2,3;
- mes "[Sudri]";
- mes "Why should";
- mes "I excuse you?";
- next;
- mes "[Sudri]";
- mes "If there's anything I hate,";
- mes "it's insincerity and sarcasm.";
- mes "What, you wanna fight?!";
- close;
- }
- else if(god_mjo_2 == 1)
- {
- set @sudri_vit,200;
- set @player_vit,100;
- set @sudri_def,0;
- set @player_def,0;
- set @sudri_atk,0;
- set @player_atk,0;
- set @counter,0;
- set @damage,0;
- mes "[Sudri]";
- mes "Fine, let's fight!";
- mes "Old school rules!";
- next;
-
- L_Fight:
- mes "Sudri : HP " + @sudri_vit + " left.";
- mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " initiated an attack!";
- next;
- menu "...?!",case11,"Strike Head!",case12,"Strike Chest!",case13,"Strike Legs!",case14,"Take a break.",case15;
- case11:
- set @player_atk,0;
- goto L_DefSudri;
- case12:
- set @player_atk,1;
- goto L_DefSudri;
- case13:
- set @player_atk,2;
- goto L_DefSudri;
- case14:
- set @player_atk,3;
- goto L_DefSudri;
- case15:
- set @player_atk,4;
- goto L_DefSudri;
- L_DefSudri:
- set @sudri_def,rand(1,3);
- set @damage,rand(15,25);
- if(@player_atk == 1) mes "" + strcharinfo(0) + " attacks Sudri's head!";
- else if(@player_atk == 2) mes "" + strcharinfo(0) + " strikes Sudri's chest!";
- else if(@player_atk == 3) mes "" + strcharinfo(0) + " aims for Sudri's legs!";
- else if(@player_atk == 4) mes "" + strcharinfo(0) + " requests a break!";
- else mes "" + strcharinfo(0) + "'s weak point revealed!";
- if(@player_atk == @sudri_def)
- {
- specialeffect 336;
- if(@sudri_def == 1)
- {
- mes "--------------------";
- mes "Sudri easily dodges";
- mes "your attack by twisting";
- mes "his small, yet svelte, body.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " misses!";
- }
- else if(@sudri_def == 2)
- {
- mes "--------------------";
- mes "Sudri blocks your";
- mes "attack by crossing";
- mes "his stout arms.";
- mes "--------------------";
- mes "" + strcharinfo(0) + "'s attack is blocked!";
- }
- else if(@sudri_def == 3)
- {
- mes "--------------------";
- mes "Sudri dodges your";
- mes "attack with a graceful";
- mes "leap to the heavens.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " misses!";
- }
- }
- else if(@player_atk == 4)
- {
- skilleffect 28,10;
- set @player_vit,@player_vit + 10;
- mes "--------------------";
- mes "" + strcharinfo(0) + " has gained 10 HP!";
- }
- else if(@player_atk == 1)
- {
- specialeffect 5;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the head!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 2)
- {
- specialeffect 2;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the chest!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 3)
- {
- specialeffect 3;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the legs!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 0)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - 10;
- mes "--------------------";
- mes "You were hit by";
- mes "Sudri's counter attack!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost 10 HP!";
- if(@player_vit < 1)
- {
- mes "Defeated...";
- next;
- goto L_Lost;
- }
- }
- else
- {
- mes "--------------------";
- mes "Something happened and the fight has stopped!";
- close;
- }
- if(@sudri_vit < 1)
- {
- mes "" + strcharinfo(0) + " wins!";
- next;
- goto L_Win;
- }
- next;
- mes "Sudri : HP " + @sudri_vit + " left.";
- mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
- mes "--------------------";
- mes "Sudri attacks...!";
- next;
- menu "...?!",case21,"Dodge!",case22,"Block!",case23,"Jump!",case24,"Counter back!",case25;
- case21:
- set @player_def,0;
- goto L_DefPlayer;
- case22:
- set @player_def,1;
- goto L_DefPlayer;
- case23:
- set @player_def,2;
- goto L_DefPlayer;
- case24:
- set @player_def,3;
- goto L_DefPlayer;
- case25:
- set @player_def,4;
- goto L_DefPlayer;
- L_DefPlayer:
- set @sudri_atk,rand(1,3);
- set @damage,rand(20,25);
- if(@sudri_atk == 1) mes "Sudri aims for the head!";
- else if(@sudri_atk == 2) mes "Sudri strikes the chest!";
- else mes "Sudri attacks the legs!";
- if(@sudri_atk == @player_def)
- {
- specialeffect2 336;
- if(@player_def == 1)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " quickly dodged,";
- mes "Sudri's arms were too short to reach at you.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- else if(@player_def == 2)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " barely blocked";
- mes "Sudri's attack.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- else if(@player_def == 3)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " jumped,";
- mes "dodged Sudri's attack at ease.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- }
- else if(@player_def == 4)
- {
- set @counter,rand(1,4);
- mes "--------------------";
- mes "" + strcharinfo(0) + " countered back!";
- if(@counter == 1)
- {
- specialeffect2 131;
- specialeffect 17;
- set @sudri_vit,@sudri_vit - 20;
- mes "You successfully countered back!";
- mes "--------------------";
- mes "Sudri has lost 20 HP!";
- if(@sudri_vit < 1)
- {
- mes "" + strcharinfo(0) + " won!";
- next;
- goto L_Win;
- }
- }
- else
- {
- specialeffect2 1;
- set @player_vit,@player_vit - 30;
- mes "You were taken a great damage on your weak spot!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost 30 HP!";
- }
- }
- else if(@sudri_atk == 1)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the head!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 2)
- {
- specialeffect2 3;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the chest!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 3)
- {
- specialeffect2 4;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the legs!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 0)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hits "+ strcharinfo(0) +"";
- mes "during a moment of";
- mes "absent-mindedness!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else
- {
- mes "--------------------";
- mes "Something happened and the fight has stopped!";
- close;
- }
- if(@player_vit < 1)
- {
- mes "Sudri won!";
- next;
- goto L_Lost;
- }
- next;
- goto L_Fight;
-
- L_Lost:
- mes "[Sudri]";
- mes "Muhahahaha!";
- mes "You're not strong enough";
- mes "to beat me! I want someone";
- mes "who can offer me a challenge!";
- next;
- mes "[Sudri]";
- mes "Go out, train some and get";
- mes "stronger before you even";
- mes "think about coming back!";
- close;
-
- L_Win:
- set god_mjo_2,2;
- mes "[Sudri]";
- mes "You're stronger than me.";
- mes "I never thought I'd meet";
- mes "a human as strong as you.";
- next;
- mes "[Sudri]";
- mes "I'm impressed. Alright,";
- mes "I'll tell my friends good";
- mes "things about you. Hopefully,";
- mes "my brothers will give you";
- mes "the help you're looking for.";
- next;
- mes "[Sudri]";
- mes "Okay then,";
- mes "be safe on";
- mes "your travels!";
- close;
- }
- else if(god_mjo_2 == 0)
- {
- mes "[Sudri]";
- mes "So...";
- mes "What brings";
- mes "you here, human?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse2;
- mes "[Sudri]";
- mes "You have too much";
- mes "time on your hand.";
- mes "Why don't you log out";
- mes "and go out with your";
- mes "friends instead?";
- close;
-
- L_Excuse2:
- mes "[Sudri]";
- mes "Huh. You're different than other";
- mes "humans. But still, trusting you";
- mes "because you know how to speak";
- mes "isn't very wise.";
- next;
- mes "[Sudri]";
- mes "If there's anything I love,";
- mes "it's bare knuckle brawling,";
- mes "old school style.";
- next;
- mes "[Sudri]";
- mes "Words can be deceptive,";
- mes "but if you can beat me in a";
- mes "fight, I think I might just";
- mes "talk to you. How about it?";
- next;
- menu ".....",-,"Yes, I accept your challenge.",L_Accept,"No, I'm scared!",L_Scared;
- set god_mjo_2,3;
- mes "[Sudri]";
- mes "You didn't even answer me!";
- mes "Fine, whatever.";
- close;
-
- L_Accept:
- set god_mjo_2,1;
- mes "[Sudri]";
- mes "Ah, I like you already, human!";
- mes "Now why don't you go do some";
- mes "warm ups, and we'll fight";
- mes "when you're ready?";
- close;
-
- L_Scared:
- set god_mjo_2,1;
- mes "[Sudri]";
- mes "Eh...?";
- mes "Why are you being such a coward?";
- mes "Are you afraid of this old";
- mes "and tiny Dwarf?";
- next;
- mes "[Sudri]";
- mes "Come on, I'll even let you";
- mes "have the first hit. Just come";
- mes "to me when you're ready to fight!";
- close;
- }
- else
- {
- mes "[Sudri]";
- mes "Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 2)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Sudri]";
- mes "Go back before I beat you to death.";
- mes "All you can gain here are few herbs.";
- close;
- }
- else if(god_mjo_3 == 2)
- {
- mes "[Sudri]";
- mes "That was a great fight....hahahaha...";
- mes "I don't regret about the result.";
- mes "I lost but I kept my dignity.";
- close;
- }
- else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_4 != 0)
- {
- mes "[Sudri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse3;
- mes "[Sudri]";
- mes "You have too much time";
- mes "on your hand.";
- mes "Why don't you log out";
- mes "and go out with your";
- mes "friends instead?";
- close;
-
- L_Excuse3:
- set god_mjo_3,3;
- mes "[Sudri]";
- mes "Why should I excuse you?";
- mes "What, are you challenging me now?";
- mes "Do you want to fight with me huh?";
- close;
- }
- else if(god_mjo_3 == 1)
- {
- set @sudri_vit,200;
- set @player_vit,100;
- set @sudri_def,0;
- set @player_def,0;
- set @sudri_atk,0;
- set @player_atk,0;
- set @counter,0;
- set @damage,0;
- mes "[Sudri]";
- mes "Fine, let's fight!";
- mes "Old school rules!";
- next;
-
- L_Fight2:
- mes "Sudri : HP " + @sudri_vit + " left.";
- mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " initiated an attack!";
- next;
- menu "...?!",case31,"Strike Head!",case32,"Strike Chest!",case33,"Strike Legs!",case34,"Take a break.",case35;
- case31:
- set @player_atk,0;
- goto L_DefSudri2;
- case32:
- set @player_atk,1;
- goto L_DefSudri2;
- case33:
- set @player_atk,2;
- goto L_DefSudri2;
- case34:
- set @player_atk,3;
- goto L_DefSudri2;
- case35:
- set @player_atk,4;
- goto L_DefSudri2;
- L_DefSudri2:
- set @sudri_def,rand(1,3);
- set @damage,rand(15,25);
- if(@player_atk == 1) mes "" + strcharinfo(0) + " attacks Sudri's head!";
- else if(@player_atk == 2) mes "" + strcharinfo(0) + " strikes Sudri's chest!";
- else if(@player_atk == 3) mes "" + strcharinfo(0) + " aims for Sudri's legs!";
- else if(@player_atk == 4) mes "" + strcharinfo(0) + " requests a break!";
- else mes "" + strcharinfo(0) + "'s weak point revealed!";
- if(@player_atk == @sudri_def)
- {
- specialeffect 336;
- if(@sudri_def == 1)
- {
- mes "--------------------";
- mes "Sudri easily dodges";
- mes "your attack by twisting";
- mes "his small, yet svelte, body.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " misses!";
- }
- else if(@sudri_def == 2)
- {
- mes "--------------------";
- mes "Sudri blocks your";
- mes "attack by crossing";
- mes "his stout arms.";
- mes "--------------------";
- mes "" + strcharinfo(0) + "'s attack is blocked!";
- }
- else if(@sudri_def == 3)
- {
- mes "--------------------";
- mes "Sudri dodges your";
- mes "attack with a graceful";
- mes "leap to the heavens.";
- mes "--------------------";
- mes "" + strcharinfo(0) + " misses!";
- }
- }
- else if(@player_atk == 4)
- {
- skilleffect 28,10;
- set @player_vit,@player_vit + 10;
- mes "--------------------";
- mes "" + strcharinfo(0) + " has gained 10 HP!";
- }
- else if(@player_atk == 1)
- {
- specialeffect 5;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the head!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 2)
- {
- specialeffect 2;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the chest!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 3)
- {
- specialeffect 3;
- set @sudri_vit,@sudri_vit - @damage;
- mes "--------------------";
- mes "You successfully hit";
- mes "Sudri on the legs!";
- mes "--------------------";
- mes "Sudri has lost " + @damage + " HP!";
- }
- else if(@player_atk == 0)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - 10;
- mes "--------------------";
- mes "You were hit by";
- mes "Sudri's counter attack!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost 10 HP!";
- if(@player_vit < 1)
- {
- mes "Defeated...";
- next;
- goto L_Lost2;
- }
- }
- else
- {
- mes "--------------------";
- mes "Something happened and the fight has stopped!";
- close;
- }
- if(@sudri_vit < 1)
- {
- mes "" + strcharinfo(0) + " wins!";
- next;
- goto L_Win2;
- }
- next;
- mes "Sudri : HP " + @sudri_vit + " left.";
- mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
- mes "--------------------";
- mes "Sudri attacks...!";
- next;
- menu "...?!",case41,"Dodge!",case42,"Block!",case43,"Jump!",case44,"Counter back!",case45;
- case41:
- set @player_def,0;
- goto L_DefPlayer2;
- case42:
- set @player_def,1;
- goto L_DefPlayer2;
- case43:
- set @player_def,2;
- goto L_DefPlayer2;
- case44:
- set @player_def,3;
- goto L_DefPlayer2;
- case45:
- set @player_def,4;
- goto L_DefPlayer2;
- L_DefPlayer2:
- set @sudri_atk,rand(1,3);
- set @damage,rand(20,25);
- if(@sudri_atk == 1) mes "Sudri aims for the head!";
- else if(@sudri_atk == 2) mes "Sudri strikes the chest!";
- else mes "Sudri attacks the legs!";
- if(@sudri_atk == @player_def)
- {
- specialeffect2 336;
- if(@player_def == 1)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " quickly dodged,";
- mes "Sudri's arms were too short to reach at you.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- else if(@player_def == 2)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " barely blocked";
- mes "Sudri's attack.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- else if(@player_def == 3)
- {
- mes "--------------------";
- mes "" + strcharinfo(0) + " jumped,";
- mes "dodged Sudri's attack at ease.";
- mes "--------------------";
- mes "Sudri has failed to attack.";
- }
- }
- else if(@player_def == 4)
- {
- set @counter,rand(1,4);
- mes "--------------------";
- mes "" + strcharinfo(0) + " countered back!";
- if(@counter == 1)
- {
- specialeffect2 131;
- specialeffect 17;
- set @sudri_vit,@sudri_vit - 20;
- mes "You successfully countered back!";
- mes "--------------------";
- mes "Sudri has lost 20 HP!";
- if(@sudri_vit < 1)
- {
- mes "" + strcharinfo(0) + " won!";
- next;
- goto L_Win2;
- }
- }
- else
- {
- specialeffect2 1;
- set @player_vit,@player_vit - 30;
- mes "You were taken a great damage on your weak spot!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost 30 HP!";
- }
- }
- else if(@sudri_atk == 1)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the head!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 2)
- {
- specialeffect2 3;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the chest!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 3)
- {
- specialeffect2 4;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hit " + strcharinfo(0) + "";
- mes "on the legs!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else if(@sudri_atk == 0)
- {
- specialeffect2 5;
- set @player_vit,@player_vit - @damage;
- mes "--------------------";
- mes "Sudri successfully";
- mes "hits "+ strcharinfo(0) +"";
- mes "during a moment of";
- mes "absent-mindedness!";
- mes "--------------------";
- mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
- }
- else
- {
- mes "--------------------";
- mes "Something happened and the fight has stopped!";
- close;
- }
- if(@player_vit < 1)
- {
- mes "Sudri won!";
- next;
- goto L_Lost2;
- }
- next;
- goto L_Fight2;
-
- L_Lost2:
- mes "[Sudri]";
- mes "Muhahahaha, you are not strong";
- mes "enough to beat me! I want someone";
- mes "who I can make an even match!";
- mes "Go practice more and come back!";
- close;
-
- L_Win2:
- set god_mjo_3,2;
- mes "[Sudri]";
- mes "Ah...you are stronger than me...I haven't thought";
- mes "that there would be a strong human as you...I am impressed.";
- mes "Great, great.";
- mes "Okay, I will tell good things of you to my friend.";
- mes "But don't forget the order to visit my friends and brothers.";
- next;
- mes "[Sudri]";
- mes "Okay then, have a good travel!";
- close;
- }
- else if(god_mjo_3 == 0)
- {
- mes "[Sudri]";
- mes "What made you come to me?";
- next;
- menu "Nothing.",-,"Excuse me, sir.",L_Excuse4;
- mes "[Sudri]";
- mes "You have too much time on your hand.";
- mes "Why don't you log out and go out";
- mes "with your friends instead?";
- close;
-
- L_Excuse4:
- mes "[Sudri]";
- mes "You have very sharp eyes.";
- mes "I can tell you are different from other humans.";
- mes "Do you want something from me?";
- mes "I don't talk to humans.";
- next;
- mes "[Sudri]";
- mes "I love bare hands fighting!";
- mes "I believe the action comes before the words!";
- mes "So, how about a fight with me, huh?";
- next;
- menu ".....",-,"Sure, please teach me well.",L_Accept2,"No, I am scared.",L_Scared2;
- set god_mjo_3,3;
- mes "[Sudri]";
- mes "You didn't even answer me!";
- mes "Fine, whatever.";
- close;
-
- L_Accept2:
- set god_mjo_3,1;
- mes "[Sudri]";
- mes "What a quick answer! I like you already, human!";
- mes "Why don't you go do some warm-ups?";
- mes "Let's start a fight when you're ready!";
- close;
-
- L_Scared2:
- set god_mjo_3,1;
- mes "[Sudri]";
- mes "Bah, you are a hot-blooded young man!";
- mes "Why are you being so coward?";
- mes "Do you fear this old and tiny dwarf man?";
- mes "I don't mind, I will yield you first hit.";
- mes "Come back when you are ready.";
- close;
- }
- else
- {
- mes "[Sudri]";
- mes "Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 0)
- {
- mes "[Sudri]";
- mes "In a one on one fight,";
- mes "you put everything on the";
- mes "line to show your might";
- mes "to your opponent.";
- next;
- mes "[Sudri]";
- mes "Have you ever felt the";
- mes "same way I do, human? Win";
- mes "or lose, just giving your";
- mes "all is the most satisfying accomplishment.";
- close;
- }
- else
- {
- mes "[Sudri]";
- mes "Zzzz Zzzz...";
- close;
- }
-}
-
-}
-
-mjolnir_01.gat,35,136,7 script Dwarf Blacksmith#west 826,{
-
- if($God3 < 50)
-{
- mes "[Vestri]";
- mes "If you want something,";
- mes "you should earn it through";
- mes "your own efforts.";
- next;
- mes "[Vestri]";
- mes "No matter what other people say,";
- mes "if you're confident and your";
- mes "will is unwavering, you'll always";
- mes "be satisfied with the results.";
- next;
- mes "[Vestri]";
- mes "What do you think?";
- mes "The youth these days...";
- close;
-}
- else
-{
-
- if($God4 > 99)
- {
- mes "[Vestri]";
- mes "I don't feel like doing anything today.";
- next;
- mes "[Vestri]";
- mes "Someone must have forged something";
- mes "really monstrous, otherwise I";
- mes "wouldn't be feeling so worthless!";
- next;
- mes "[Vestri]";
- mes "Yeah, I think I need a break!";
- mes "Don't you think I need a break,";
- mes "human?";
- close;
- }
- else if(god_mjo_0 == 11)
- {
- mes "[Vestri]";
- mes "There's nothing like taking";
- mes "a relaxing break after putting";
- mes "your heart into your work.";
- next;
- mes "[Vestri]";
- mes "What do you think, human?";
- mes "Isn't that one of life's";
- mes "simple pleasures?";
- close;
- }
- else if(god_mjo_0 == 10)
- {
- mes "[Vestri]";
- mes "If you need something, you must get it";
- mes "on your own...no matter what people say";
- mes "if you are confident about your will,";
- mes "it is already good regardless of the result of your action.";
- mes "What do you think?";
- mes "Young generations in thesedays....";
- close;
- }
- else if(god_mjo_0 == 1)
- {
- if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Vestri]";
- mes "I really hope I meet a decent";
- mes "human being next time. So far,";
- mes "I haven't met one useful human.";
- close;
- }
- else if(god_mjo_3 == 2)
- {
- mes "[Vestri]";
- mes "Perfect preparation does not";
- mes "always result in success.";
- mes "There's a point when you've";
- mes "got to just go out and do it.";
- next;
- mes "[Vestri]";
- mes "I don't know how far you'll";
- mes "go, but put all your strength";
- mes "into it anyway~";
- close;
- }
- else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_4 != 0)
- {
- mes "[Vestri]";
- mes "What do you want?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse;
- mes "[Vestri]";
- mes "If you need anything, try to";
- mes "get it on your own!";
- mes "Nobody is responsible on you";
- mes "but yourself!";
- close;
-
- L_Excuse:
- set god_mjo_3,3;
- mes "[Vestri]";
- mes "You didn't answer the question!";
- mes "Now, you've probably got the";
- mes "wrong Dwarf here.";
- next;
- mes "[Vestri]";
- mes "Get out of here, and go to your";
- mes "human Blacksmiths if you want";
- mes "equipment upgrades!";
- close;
- }
- else if(god_mjo_3 == 1)
- {
- disable_items;
- mes "[Vestri]";
- mes "Great! Which one should";
- mes "I upgrade first, huh? My heart";
- mes "is pounding with anticipation...";
- next;
- M_Menu:
- menu getequipname(1),PART1,getequipname(2),PART2,getequipname(3),PART3,getequipname(4),PART4,getequipname(5),PART5,
- getequipname(6),PART6,getequipname(7),PART7,getequipname(8),PART8,getequipname(9),PART9,getequipname(10),PART10;
-
- PART1:
- set @vestripart,1;
- if (getequipisequiped(1)) goto L_Check11;
- goto M_Menu;
- PART2:
- set @vestripart,2;
- if (getequipisequiped(2)) goto L_Check11;
- goto M_Menu;
-
- PART3:
- set @vestripart,3;
- if (getequipisequiped(3)) goto L_Check11;
- goto M_Menu;
-
- PART4:
- set @vestripart,4;
- if (getequipisequiped(4)) goto L_Check11;
- goto M_Menu;
- PART5:
- set @vestripart,5;
- if (getequipisequiped(5)) goto L_Check11;
- goto M_Menu;
-
- PART6:
- set @vestripart,6;
- if (getequipisequiped(6)) goto L_Check11;
- goto M_Menu;
-
- PART7:
- set @vestripart,7;
- if (getequipisequiped(7)) goto L_Check11;
- goto M_Menu;
-
- PART8:
- set @vestripart,8;
- if (getequipisequiped(8)) goto L_Check11;
- goto M_Menu;
-
- PART9:
- set @vestripart,9;
- if (getequipisequiped(9)) goto L_Check11;
- goto M_Menu;
-
- PART10:
- set @vestripart,10;
- if (getequipisequiped(10)) goto L_Check11;
- goto M_Menu;
-
- L_Check11:
- if(getequipisenableref(@vestripart)) goto L_Check12;
- mes "[Vestri]";
- mes "What, this isn't upgradable!";
- mes "What the hell do you want me";
- mes "to do with this?";
- close2;
- enable_items;
- end;
-
- L_Check12:
- if(getequipisidentify(@vestripart)) goto L_Check13;
- mes "[Vestri]";
- mes "You'd better identify this item";
- mes "first. If we don't know what it";
- mes "is, what's the point of upgrading it?";
- close2;
- enable_items;
- end;
-
- L_Check13:
- if(getequiprefinerycnt(@vestripart) < 10) goto L_Check14;
- mes "[Vestri]";
- mes "Oh, this is excellent!";
- mes "This piece here has been";
- mes "perfectly refined!";
- next;
- mes "[Vestri]";
- mes "But this isn't what I want.";
- mes "I can't do any work on this at all.";
- close2;
- enable_items;
- end;
-
- L_Check14:
- if (getequippercentrefinery(@vestripart) != 100) goto L_Check15;
- mes "[Vestri]";
- mes "This item isn't even a challenge";
- mes "to upgrade. You can get humans";
- mes "to do this kind of beginner's stuff.";
- next;
- mes "[Vestri]";
- mes "Come on...";
- mes "Bring me something that presents";
- mes "an element of risk!";
- close2;
- enable_items;
- end;
-
- L_Check15:
- if (getequipweaponlv(@vestripart) == 1 || getequipweaponlv(@vestripart) == 2 || getequipweaponlv(@vestripart) == 3)
- {
- mes "[Vestri]";
- mes "Hey...";
- mes "Don't insult me by expecting me";
- mes "to work on anything less than";
- mes "a Level 4 weapon.";
- next;
- mes "[Vestri]";
- mes "Bring me a Level 4 weapon for";
- mes "me to work on next time, got it?";
- close2;
- enable_items;
- end;
- }
-
- if(getequipweaponlv(@vestripart) == 0)
- {
- mes "[Vestri]";
- mes "Armor?!";
- mes "Didn't I tell you that I only";
- mes "work on Level 4 weapons?";
- next;
- mes "[Vestri]";
- mes "You can have a human Blacksmith";
- mes "work on that kind of stuff! Now,";
- mes "a Dwarf like me needs something";
- mes "that's more of a challenge!";
- close2;
- enable_items;
- end;
- }
-
- mes "[Vestri]";
- mes "Okay, let me give you the mandatory";
- mes "warning. If your weapon happens";
- mes "to be destroyed by chance during";
- mes "the upgrade, you'll never see";
- mes "the weapon again.";
- next;
- mes "[Vestri]";
- mes "That also means that if the weapon";
- mes "is destroyed, any ^FF0000Cards^000000";
- mes "inserted into the weapon will also";
- mes "be gone.";
- next;
- mes "[Vestri]";
- mes "If you understand,";
- mes "then let's get on with it!";
- next;
- menu "Sure, let's do it!",L_Go,"N-no, I changed my mind!",-;
- mes "[Vestri]";
- mes "Bah! How do you survive in this";
- mes "world with that kind of cowardice?!";
- next;
- mes "[Vestri]";
- mes "Oh, forget it.";
- mes "I know you're just being careful.";
- mes "Damn, I was just so eager to";
- mes "get to work!";
- close2;
- enable_items;
- end;
-
- L_Go:
- if(countitem(984) > 0) delitem 984,1;
- else
- {
- mes "[Vestri]";
- mes "Huh...";
- mes "You forgot to";
- mes "bring an Oridecon.";
- mes "Hurry up and get one.";
- close;
- }
-
- if (getequippercentrefinery(@vestripart) > rand(100))
- {
- mes "^3355FF*Clang Clang!*^000000";
- successrefitem @vestripart;
- next;
- emotion e_no1;
- mes "[Vestri]";
- mes "Mwahahaha~";
- mes "I've still got it!";
- mes "So aren't you happy with an";
- mes "even more powerful weapon?";
- next;
- }
- else
- {
- mes "[Vestri]";
- mes "^3355FF*Clang Clang!*^000000";
- failedrefitem @vestripart;
- next;
- emotion e_omg;
- mes "[Vestri]";
- mes "Waaahhhhh!";
- mes "Dear God, no!";
- next;
- mes "[Vestri]";
- mes "I-It's alright!";
- mes "Bad things happen sometimes.";
- mes "Let's just think of it as both";
- mes "of us having a bad day.";
- mes "Yeah, not regrets!";
- next;
- }
- set god_mjo_3,2;
- enable_items;
- mes "[Vestri]";
- mes "Well, my friend,";
- mes "if you ever visit my brothers,";
- mes "please give them my regards.";
- mes "Take care.";
- close;
- }
- else if(god_mjo_3 == 0)
- {
- mes "[Vestri]";
- mes "What do you want?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse2;
- mes "[Vestri]";
- mes "If you need anything, try to";
- mes "get it on your own!";
- mes "Nobody is responsible on you";
- mes "but yourself!";
- close;
-
- L_Excuse2:
- mes "[Vestri]";
- mes "Hmm, I am not sure if there is things";
- mes "that I can help you with.";
- mes "As you see, I am a blacksmith.";
- next;
- mes "[Vestri]";
- mes "I prefer upgrading weapns more than anything else!";
- mes "Especially I like to upgrade a weapon that has been";
- mes "forged many times already or a high level one.";
- mes "Because they're challengeable!";
- next;
- mes "[Vestri]";
- mes "Don't you like the idea of challenging to";
- mes "a limit? To me, upgrading items makes me feel like";
- mes "climbing the top of a mountain that has never been touched by dwarves!";
- next;
- mes "[Vestri]";
- mes "Okay, I think we're meant to meet today.";
- mes "For that, I am going to upgrade a weapon";
- mes "with a free of charge";
- mes "if you bring me a weapon and a forging material.";
- mes "Isn't it a great offer?";
- next;
- set god_mjo_3,1;
- mes "[Vestri]";
- mes "But here's a condition.";
- mes "You must bring me a level 4 weapon.";
- mes "Just like I said, I want something to challenge.";
- mes "Oh, don't forget an oridecon, too!";
- close;
- }
- else
- {
- mes "[Vestri]";
- mes "Zzzz Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 2)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Vestri]";
- mes "I really hope I will meet a";
- mes "decent human being next time";
- mes "...so far there has never been";
- mes "at least one human useful.";
- close;
- }
- else if(god_mjo_2 == 2)
- {
- mes "[Vestri]";
- mes "Prefect preparation does not";
- mes "always result in success.";
- mes "I am not sure how far you can go,";
- mes "but put forth your strength anyway.";
- close;
- }
- else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_3 != 0 || god_mjo_4 != 0)
- {
- mes "[Vestri]";
- mes "What do you want?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse3;
- mes "[Vestri]";
- mes "If you need anything, try to";
- mes "get it on your own!";
- mes "Nobody is responsible on you";
- mes "but yourself!";
- close;
-
- L_Excuse3:
- set god_mjo_2,3;
- mes "[Vestri]";
- mes "You didn't listen to me and you don't even know who I am.";
- mes "I am not excusing you!";
- mes "You got a wrong dwarf here. Go back.";
- mes "Ask to your human blacksmiths for item upgrade!";
- close;
- }
- else if(god_mjo_2 == 1)
- {
- disable_items;
- mes "[Vestri]";
- mes "Great! Which one should I";
- mes "upgrade first, huh?";
- mes "My heart is throbbing with";
- mes "excitement...";
- next;
- M_Menu2:
- menu getequipname(1),PART11,getequipname(2),PART12,getequipname(3),PART13,getequipname(4),PART14,getequipname(5),PART15,
- getequipname(6),PART16,getequipname(7),PART17,getequipname(8),PART18,getequipname(9),PART19,getequipname(10),PART20;
-
- PART11:
- set @vestripart,1;
- if (getequipisequiped(1)) goto L_Check21;
- goto M_Menu2;
- PART12:
- set @vestripart,2;
- if (getequipisequiped(2)) goto L_Check21;
- goto M_Menu2;
-
- PART13:
- set @vestripart,3;
- if (getequipisequiped(3)) goto L_Check21;
- goto M_Menu2;
-
- PART14:
- set @vestripart,4;
- if (getequipisequiped(4)) goto L_Check21;
- goto M_Menu2;
- PART15:
- set @vestripart,5;
- if (getequipisequiped(5)) goto L_Check21;
- goto M_Menu2;
-
- PART16:
- set @vestripart,6;
- if (getequipisequiped(6)) goto L_Check21;
- goto M_Menu2;
-
- PART17:
- set @vestripart,7;
- if (getequipisequiped(7)) goto L_Check21;
- goto M_Menu2;
-
- PART18:
- set @vestripart,8;
- if (getequipisequiped(8)) goto L_Check21;
- goto M_Menu2;
-
- PART19:
- set @vestripart,9;
- if (getequipisequiped(9)) goto L_Check21;
- goto M_Menu2;
-
- PART20:
- set @vestripart,10;
- if (getequipisequiped(10)) goto L_Check21;
- goto M_Menu2;
-
- L_Check21:
- if(getequipisenableref(@vestripart)) goto L_Check22;
- mes "[Vestri]";
- mes "What, this isn't upgradable!";
- mes "What the hell do you want me";
- mes "to do with this?";
- close2;
- enable_items;
- end;
-
- L_Check22:
- if(getequipisidentify(@vestripart)) goto L_Check23;
- mes "[Vestri]";
- mes "You'd better identify this item";
- mes "first. If we don't know what it";
- mes "is, what's the point of upgrading it?";
- close2;
- enable_items;
- end;
-
- L_Check23:
- if(getequiprefinerycnt(@vestripart) < 10) goto L_Check24;
- mes "[Vestri]";
- mes "Oh, this is excellent!";
- mes "This piece here has been";
- mes "perfectly refined!";
- next;
- mes "[Vestri]";
- mes "But this isn't what I want.";
- mes "I can't do any work on this at all.";
- close2;
- enable_items;
- end;
-
- L_Check24:
- if (getequippercentrefinery(@vestripart) != 100) goto L_Check25;
- mes "[Vestri]";
- mes "This item isn't even a challenge";
- mes "to upgrade. You can get humans";
- mes "to do this kind of beginner's stuff.";
- next;
- mes "[Vestri]";
- mes "Come on...";
- mes "Bring me something that presents";
- mes "an element of risk!";
- close2;
- enable_items;
- end;
-
- L_Check25:
- if (getequipweaponlv(@vestripart) == 1 || getequipweaponlv(@vestripart) == 2 || getequipweaponlv(@vestripart) == 3)
- {
- mes "[Vestri]";
- mes "Hey...";
- mes "Don't insult me by expecting me";
- mes "to work on anything less than";
- mes "a Level 4 weapon.";
- next;
- mes "[Vestri]";
- mes "Bring me a Level 4 weapon for";
- mes "me to work on next time, got it?";
- close2;
- enable_items;
- end;
- }
-
- if(getequipweaponlv(@vestripart) == 0)
- {
- mes "[Vestri]";
- mes "Armor?!";
- mes "Didn't I tell you that I only";
- mes "work on Level 4 weapons?";
- next;
- mes "[Vestri]";
- mes "You can have a human Blacksmith";
- mes "work on that kind of stuff! Now,";
- mes "a Dwarf like me needs something";
- mes "that's more of a challenge!";
- close2;
- enable_items;
- end;
- }
-
- mes "[Vestri]";
- mes "Okay, let's check this before I start.";
- mes "If your weapon happens to be destroyed while upgraded,";
- mes "you will not see the weapon ever again. You know that, don't you?";
- mes "That also applies to any item inserted to the weapon such as";
- mes "^ff0000a monster card^000000!";
- mes "^ff0000Your weapon will be just gone^000000, do you understand?";
- mes "If you do, let's get it on!";
- next;
- menu "Sure, let's do it!",L_Go2,"...no, I am out.",-;
- mes "[Vestri]";
- mes "Bah, how are you gonna survive in this tough world";
- mes "with that kind of timid attitude?";
- mes "Yeah, yeah, yeah, forget it.";
- mes "Forget it!";
- close;
- enable_items;
- end;
-
- L_Go2:
- if(countitem(984) > 0) delitem 984,1;
- else
- {
- mes "[Vestri]";
- mes "Hmm, yeah you forgot to bring one thing...";
- mes "That is an oridecon.";
- mes "Now go bring it.";
- close;
- }
-
- if (getequippercentrefinery(@vestripart) > rand(100))
- {
- mes "[Vestri]";
- mes "Clang! Clang! Clang!";
- successrefitem @vestripart;
- next;
- emotion e_no1;
- mes "[Vestri]";
- mes "Muhahaha, I am still good!";
- mes "So, aren't you happy to have a more powerful weapon?";
- next;
- }
- else
- {
- mes "[Vestri]";
- mes "Clang! Clang! Clang!";
- failedrefitem @vestripart;
- next;
- emotion e_omg;
- mes "[Vestri]";
- mes "Waaahhhhhhhhhhhhhh!";
- next;
- mes "[Vestri]";
- mes "Umm, it's alright. Bad thing happens.";
- mes "Let's think of it as we're having a bad day.";
- mes "Yeah, I have no regrets!";
- next;
- }
- set god_mjo_2,2;
- enable_items;
- mes "[Vestri]";
- mes "This is it, my friend.";
- mes "If you have a chance to meet my brothers,";
- mes "please send my regard to them.";
- mes "Take care.";
- close;
- }
- else if(god_mjo_2 == 0)
- {
- mes "[Vestri]";
- mes "What do you want?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse4;
- mes "[Vestri]";
- mes "If you need anything, try to get it on your own!";
- mes "Nobody is responsible on you but yourself!";
- close;
-
- L_Excuse4:
- mes "[Vestri]";
- mes "Hmm, I am not sure if there is things";
- mes "that I can help you with.";
- mes "As you see, I am a blacksmith.";
- next;
- mes "[Vestri]";
- mes "I prefer upgrading weapns more than anything else!";
- mes "Especially I like to upgrade a weapon that has been";
- mes "forged many times already or a high level one.";
- mes "Because they're challengeable!";
- next;
- mes "[Vestri]";
- mes "Don't you like the idea of challenging to";
- mes "a limit? To me, upgrading items makes me feel like";
- mes "climbing the top of a mountain that has never been touched by dwarves!";
- next;
- mes "[Vestri]";
- mes "Okay, I think we're meant to meet today.";
- mes "For that, I am going to upgrade a weapon";
- mes "with a free of charge";
- mes "if you bring me a weapon and a forging material.";
- mes "Isn't it a great offer?";
- next;
- set god_mjo_2,1;
- mes "[Vestri]";
- mes "But here's a condition.";
- mes "You must bring me a level 4 weapon.";
- mes "Just like I said, I want something to challenge.";
- mes "Oh, don't forget an oridecon, too!";
- close;
- }
- else
- {
- mes "[Vestri]";
- mes "Zzzz Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 0)
- {
- mes "[Vestri]";
- mes "It's always a pleasure to engage";
- mes "myself in hard work, especially";
- mes "smithing.";
- next;
- mes "[Vestri]";
- mes "Upgrading is always enjoyable!";
- mes "I have no regrets when failure,";
- mes "and I'm always pleased when I'm";
- mes "successful. I'll upgrade everyday";
- mes "o make the best of my life~";
- close;
- }
- else
- {
- mes "[Vestri]";
- mes "Zzzz Zzzz Zzzz...";
- close;
- }
-}
-
-}
-
-mjolnir_12.gat,18,18,7 script Dwarf Blacksmith#north 826,{
-
- if ($God3 < 50)
-{
- mes "[Nordri]";
- mes "What, I don't have any Eluniums";
- mes "or Oridecons!";
- next;
- mes "[Nordri]";
- mes "Vestri took them all. ^333333*Sigh*^000000";
- mes "Those were my treasures, you know...";
- close;
-}
- else
-{
- if($God4 > 99)
- {
- mes "[Nordri]";
- mes "What's happening?";
- mes "I smell something different from";
- mes "the wind...I cannot tell what it is.";
- mes "Should I go into a cave to fiture it out...?";
- mes "Hmmm....this is odd.";
- close;
- }
- else if(god_mjo_0 == 11)
- {
- mes "[Nordri]";
- mes "Hahahahah, even Gods know that we dwarves";
- mes "are the most talented artisans among all the existing races.";
- mes "Maybe we don't look that way for now,";
- mes "one day we will start our business again.";
- close;
- }
- else if(god_mjo_0 == 10)
- {
- mes "[Nordri]";
- mes "What, I don't have any Eluniums";
- mes "or Oridecons!";
- mes "Vestri took all of them....";
- mes "Do you understand?";
- close;
- }
- else if(god_mjo_0 == 1)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Nordri]";
- mes "La la la la~ La la la la~";
- mes "It is happy to be in the Mjolnir forest~";
- mes "I am surrounded by a peaceful and quiet air~ La la la~";
- mes "I do not worry about anything~ La la la~";
- close;
- }
- else if(god_mjo_4 == 2)
- {
- mes "[Nordri]";
- mes "Aren't you supposed to be going back by now...? Heh,";
- mes "Oh well, none of my business.";
- mes "If you have some spare zeny, have some banana on the way...";
- mes "Isn't a pumpkin the best taste though?";
- close;
- }
- else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_3 == 0 || god_mjo_3 == 1)
- {
- mes "[Nordri]";
- mes "What kind of business do";
- mes "you have with me?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse;
- mes "[Nordri]";
- mes "You're funny, leave me alone.";
- close;
-
- L_Excuse:
- set god_mjo_4,3;
- mes "[Nordri]";
- mes "What? I am sorry, I cannot hear";
- mes "you at this moment.";
- mes "I want to sing a song really loud!";
- mes "La la la~ La la la~";
- close;
- }
- else if(god_mjo_4 == 1)
- {
- if(countitem(501) > 0)
- {
- delitem 501,1;
- mes "[Nordri]";
- mes "Heheh, thank you. Since you gave me";
- mes "your precious red potion, I shall";
- mes "tell you an old story";
- mes "in return. You will like it.";
- next;
- set @mjo_north,0;
- L_NorthTalk:
- switch(@mjo_north)
- {
- case 0:
- mes "[Nordri]";
- mes "A legend says that Thor went on an adventure to Utgard,";
- mes "the land of giants.";
- mes "He made a bet with the king of giants.";
- next;
- mes "[Nordri]";
- mes "The first step of the bet was who ate more food than the other.";
- mes "Thor ate all of meats on the table";
- mes "Utgardaloki, the king ate not only meats but bones and plates as well.";
- next;
- mes "[Nordri]";
- mes "The truth was Thor was hallucinated by a magic at the time,";
- mes "so he couldn't realise that the king was not actually the king but a creature...";
- mes "it was the thing which could eat up everything in the world...";
- mes "I cannot remember what it was...do you?";
- next;
- menu "Greed",-,"Sea",-,"Blaze",L_Speak,"Hog",-;
- goto L_Listen;
-
- case 1:
- mes "[Nordri]";
- mes "Yes, I remember now, it was the 'Blaze'.";
- mes "After that, there was another match which competed who ran faster than the other.";
- mes "For the match, Thor let his servant Tialfi compte with";
- mes "the king's servant Hugi.";
- next;
- mes "[Nordri]";
- mes "However, no matter how many matches they did,";
- mes "Hugi won everytime. Thor was once again hallucinated by a magic";
- mes "so he could not realise Hugi was as a matter of fact";
- mes "the....do you know what it truely was?";
- next;
- menu "Language",-,"Thoughts",L_Speak,"Wind",-,"Wolf",-;
- goto L_Listen;
-
- case 2:
- mes "[Nordri]";
- mes "Yes, you're right! It was the 'thoughts'!";
- mes "That defiant giants gave an order to Thor to fight with his grand mother.";
- mes "Thor was happy for that he would finally win this time by defeating";
- mes "an old woman....but he could not.";
- mes "No matter how hard he tried, he could not win over the old woman.";
- next;
- mes "[Nordri]";
- mes "Thor was again hallucinated by a magic";
- mes "so he could not realise the old woman was as a matter of fact";
- mes "the....do you know what it truely was?";
- next;
- menu "Curse",-,"Earth",-,"Heart",-,"Age",L_Speak;
- goto L_Listen;
-
- case 3:
- mes "[Nordri]";
- mes "Yes, it was the 'age'! No one can stop their time!";
- mes "After Thor was lost every match, the king told him";
- mes "the truth about the betting. And Thor became furious.";
- mes "But it was no use, because the king and other giants were all gone";
- mes "by then....";
- next;
- mes "[Nordri]";
- mes "There are two things that give us lessons.";
- mes "First, don't believe things as you see.";
- mes "Second, don't be so sure of your power,";
- mes "there are men who are more powerful than you. So you shall do your best and be humble.";
- mes "Do you understand?";
- next;
- mes "[Nordri]";
- mes "Living properly will be the most important thing.";
- mes "You cannot have everything what you want.";
- mes "Besides, when you're obssessive about something,";
- mes "you cannot think rationally about the thing.";
- next;;
- set god_mjo_4,2;
- mes "[Nordri]";
- mes "Thank you for listening to my long story.";
- mes "If you meet anyone dreaming something that cannot be true,";
- mes "please share this story with him.";
- mes "The story about Thor that he fought against hallucination created by the giant king.";
- close;
-
- }
- L_Listen:
- mes "[Nordri]";
- mes "...umm? I don't think that it was...hmm.";
- mes "Let me think about it more.";
- mes "Maybe I can remember it later....";
- mes "shall we talk again with drinking a red potion?";
- mes "Hahahahaha.";
- close;
- }
- else
- {
- mes "[Nordri]";
- mes "Woah, I am so thirsty. Didn't I ask you to give a red potion!?";
- mes "I am not gonna tell you unless you bring me one.";
- close;
- }
- }
- else if(god_mjo_4 == 0)
- {
- mes "[Nordri]";
- mes "What kind of business";
- mes "do you have with me?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse2;
- mes "[Nordri]";
- mes "You're funny, leave me alone.";
- close;
-
- L_Excuse2:
- mes "[Nordri]";
- mes "This is odd. Recently, there have been too many";
- mes "humans interested in dwarves.";
- mes "Haha, of course, I am having a good time with them though.";
- next;
- set god_mjo_4,1;
- mes "[Nordri]";
- mes "I am kind of thirsty.";
- mes "Bring me a red potion, would you?";
- mes "If you do, I am gonna tell you an important story.";
- mes "Heheheheh.";
- close;
- }
- else
- {
- mes "[Nordri]";
- mes "Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 2)
- {
- if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
- {
- mes "[Nordri]";
- mes "La la la la~ La la la la~";
- mes "It is happy to be in the Mjolnir forest~";
- mes "I am surrounded by a peaceful and quiet air~ La la la~";
- mes "I do not worry about anything~ La la la~";
- close;
- }
- else if(god_mjo_1 == 2)
- {
- mes "[Nordri]";
- mes "Aren't you supposed to be going back by now...? Heh,";
- mes "Oh well, none of my business.";
- mes "If you have some spare zeny, have some banana on the way...";
- mes "Isn't a pumpkin the best taste though?";
- close;
- }
- else if (god_mjo_2 != 0 || god_mjo_3 != 0 || god_mjo_4 != 0)
- {
- mes "[Nordri]";
- mes "What kind of business do you have with me?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse3;
- mes "[Nordri]";
- mes "You're funny, leave me alone.";
- close;
-
- L_Excuse3:
- set god_mjo_1,3;
- mes "[Nordri]";
- mes "What? I am sorry, I cannot hear you at this moment.";
- mes "I want to sing a song really loud!";
- mes "La la la~ La la la~";
- close;
- }
- else if(god_mjo_1 == 1)
- {
- if(countitem(501) > 0)
- {
- delitem 501,1;
- mes "[Nordri]";
- mes "Heheh, thank you. Since you gave me";
- mes "your precious red potion, I shall tell you an old story";
- mes "in return. You will like it.";
- next;
- set @mjo_north,0;
- L_NorthTalk2:
- switch(@mjo_north)
- {
- case 0:
- mes "[Nordri]";
- mes "A legend says that there was a brave and wise dwarf";
- mes "named Alvis long time ago.";
- mes "He possessed broad knowledge as a library";
- mes "and was brave as Siegfried.";
- next;
- mes "[Nordri]";
- mes "Unfortunately he was too ambitious.";
- mes "He was in love with Thrud who was Thor's daughter at first sight.";
- mes "So he proposed to Thor to marry with Thrud.";
- mes "As you expected, Thor refused his proposal.";
- mes "Alvis should have stopped there but he didn't.";
- next;
- mes "[Nordri]";
- mes "So Thor asked him few questions to test him.";
- mes "What was the first question....there was a question like this...";
- mes "What was the name of the ground in a human's term?";
- next;
- menu "Ymir's body",-,"Earth",L_Speak2,"Lane",-,"Universe",-;
- goto L_Listen2;
-
- case 1:
- mes "[Nordri]";
- mes "Yes, it is the 'Earth'. So Thor gave him another question.";
- mes "What is a giant's term for a round shell that covers the earth?";
- next;
- menu "Ymir's Head",-,"Sky",-,"Cloud Factory",-,"High House",L_Speak2;
- goto L_Listen2;
-
- case 2:
- mes "[Nordri]";
- mes "That's it, 'High House'...since they're so gigantic,";
- mes "it might looked that way.";
- mes "So Thor gave him another question.";
- mes "What is the god's term for a ball that arise in the night?";
- next;
- menu "Circling Wheel",-,"Moon",-,"False Sun",L_Speak2,"Fast Stranger",-;
- goto L_Listen2;
-
- case 3:
- mes "[Nordri]";
- mes "Yes! Gods call the moon as the 'false sun'.";
- mes "Alvis knew every answer but he was too defiant";
- mes "so he didn't notice that the sun was arising.";
- mes "So he was turned into a stone statue.";
- next;
- mes "[Nordri]";
- mes "There are two things we can learn from this story.";
- mes "First, do not desire something that cannot be true.";
- mes "Secone, do not be so proud of yourself...";
- mes "You cannot have everything in the world.";
- next;
- mes "[Nordri]";
- mes "Living properly is the most important thing.";
- mes "Even if you wish something to be yours,";
- mes "that does not happen every time, you know.";
- mes "Thread of fate is of course long, but it can be cut off any time.";
- next;
- set god_mjo_1,2;
- mes "[Nordri]";
- mes "Thank you for listening to my long story.";
- mes "If you meet anyone dreaming something that cannot be true,";
- mes "please share this story with him.";
- mes "The story about Alvis who was a wise and";
- mes "brave ma but who was too defiant at the same time.";
- }
- L_Listen2:
- mes "[Nordri]";
- mes "...umm? I don't think that it was...hmm.";
- mes "Let me think about it more.";
- mes "Maybe I can remember it later....";
- mes "shall we talk again with drinking a red potion?";
- mes "Hahahahaha.";
- close;
- }
- else
- {
- mes "[Nordri]";
- mes "Woah, I am so thirsty. Didn't I ask you to give a red potion!?";
- mes "I am not gonna tell you unless you bring me one.";
- close;
- }
- }
- else if(god_mjo_1 == 0)
- {
- mes "[Nordri]";
- mes "What kind of business do you have with me?";
- next;
- menu "Nothing.",-,"Excuse me.",L_Excuse4;
- mes "[Nordri]";
- mes "You're funny, leave me alone.";
- close;
-
- L_Excuse4:
- mes "[Nordri]";
- mes "This is odd. Recently, there have been too many";
- mes "humans interested in dwarves.";
- mes "Haha, of course, I am having a good time with them though.";
- next;
- set god_mjo_1,1;
- mes "[Nordri]";
- mes "I am kind of thirsty.";
- mes "Bring me a red potion, would you?";
- mes "If you do, I am gonna tell you an important story.";
- mes "Heheheheh.";
- close;
- }
- else
- {
- mes "[Nordri]";
- mes "Zzzz Zzzz Zzzz...";
- close;
- }
- }
- else if(god_mjo_0 == 0)
- {
- mes "[Nordri]";
- mes "I am Nordri the dwarf blacksmith.";
- mes "I am in charge of the north part of mountain Mjolnir.";
- mes "If you want to pass me, you must ask";
- mes "an approval to me.";
- next;
- mes "[Nordri]";
- mes "Calm down, it was a joke. Hahahahaha!";
- close;
- }
- else
- {
- mes "[Nordri]";
- mes "Zzzz Zzzz Zzzz...";
- close;
- }
-
-L_Speak:
- set @mjo_north,@mjo_north +1;
- goto L_NorthTalk;
-
-L_Speak2:
- set @mjo_north,@mjo_north +1;
- goto L_NorthTalk2;
-}
-
+//===== eAthena Script =======================================
+//= Mjolnir seal unlocking NPCs.
+//===== By: ==================================================
+//= SinSloth
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Quest for breaking the seal of Mjolnir.
+//===== Additional Comments: =================================
+// 1.0 First version. Thanks to SinSloth for scripting it. [MasterOfMuppets]
+// 1.1 Fixed wrong label names [Luups]
+//============================================================
+
+prontera.gat,124,297,3 script Tialfi 706,{
+
+ if ($God3 < 50)
+{
+ mes "[Tialfi]";
+ mes "Hmmm...";
+ mes "I can feel a strange force";
+ mes "growing stronger and stronger,";
+ mes "somewhere on in Rune-Midgard.";
+ next;
+ mes "[Tialfi]";
+ mes "Can you feel it?";
+ mes "Something must be";
+ mes "going on!";
+ close;
+}
+ else
+{
+ if(god_mjo_0 == 11)
+ {
+ mes "[Tialfi]";
+ mes "I'm waiting for the day";
+ mes "when I'll finally get to";
+ mes "see Thor's thunder for myself.";
+ mes "I believe that one of these days,";
+ mes "my dream will become reality.";
+ close;
+ }
+ else if(god_mjo_1 == 2 && god_mjo_2 == 2 && god_mjo_3 == 2 && god_mjo_4 == 2)
+ {
+ if (god_mjo_0 == 10)
+ {
+ if (countitem(756) > 49 && countitem(757) > 49)
+ {
+ if (Class == Job_Knight || Class == Job_Lord_Knight) set @gift,1;
+ if (Class == Job_Priest || Class == Job_High_Priest) set @gift,2;
+ if (Class == Job_Wizard || Class == Job_High_Wizard) set @gift,3;
+ if (Class == Job_Blacksmith || Class == Job_Whitesmith) set @gift,4;
+ if (Class == Job_Hunter || Class == Job_Sniper) set @gift,5;
+ if (Class == Job_Assassin || Class == Job_Assassin_Cross) set @gift,6;
+ if (Class == Job_Crusader || Class == Job_Paladin) set @gift,7;
+ if (Class == Job_Monk || Class == Job_Champion) set @gift,8;
+ if (Class == Job_Sage || Class == Job_Professor) set @gift,9;
+ if (Class == Job_Alchemist || Class == Job_Creator) set @gift,10;
+ if (Class == Job_Rogue || Class == Job_Stalker) set @gift,11;
+ if (Class == Job_Bard || Class == Job_Clown) set @gift,12;
+ if (Class == Job_Dancer || Class == Job_Gypsy) set @gift,13;
+ mes "[Tialfi]";
+ mes "You came back.";
+ mes "In exchange for the ores that";
+ mes "you have brought me, I will";
+ mes "give you one of my family";
+ mes "treasures.";
+ next;
+ mes "[Tialfi]";
+ mes "My ancestors will be glad";
+ mes "that that their treasure was";
+ mes "used for a good purpose.";
+ next;
+ mes "[Tialfi]";
+ mes "You have two options in";
+ mes "choosing a treasure. You can";
+ mes "have a treasure that will be";
+ mes "useful to yourself, or something";
+ mes "that may suit one of your friends.";
+ next;
+ mes "[Tialfi]";
+ mes "So which treasure";
+ mes "would you like to have?";
+ next;
+ menu "An item that I can use.",-,"An item that my friend can use.",L_Friend;
+ mes "[Tialfi]";
+ mes "I see. Give me a moment";
+ mes "to find a suitable item";
+ mes "for you.";
+ next;
+ goto L_Gift;
+
+ L_Friend:
+ mes "[Tialfi]";
+ mes "I see. Give me a moment";
+ mes "to find a suitable item";
+ mes "for your friend.";
+ set @gift,rand(1,13);
+ next;
+ L_Gift:
+ mes "[Tialfi]";
+ mes "Okay, let's see...";
+ mes "I seem to recall that I put";
+ mes "it somewhere around... Hmm.";
+ mes "It must be around--Ah!";
+ mes "Here we are~";
+ next;
+ delitem 756,50;
+ delitem 757,50;
+ set god_mjo_0,11;
+ if (@gift == 1) getitem 1471,1;
+ if (@gift == 2) getitem 1526,1;
+ if (@gift == 3) getitem 1231,1;
+ if (@gift == 4) getitem 1367,1;
+ if (@gift == 5) getitem 1722,1;
+ if (@gift == 6) getitem 1230,1;
+ if (@gift == 7) getitem 1141,1;
+ if (@gift == 8) getitem 1813,1;
+ if (@gift == 9) getitem 1557,1;
+ if (@gift == 10) getitem 1235,1;
+ if (@gift == 11) getitem 1227,1;
+ if (@gift == 12) getitem 1913,1;
+ if (@gift == 13) getitem 1963,1;
+ mes "[Tialfi]";
+ mes "Once again, I thank you";
+ mes "for the trouble you've gone";
+ mes "through on my behalf.";
+ next;
+ mes "[Tialfi]";
+ mes "I'm unsure of how this";
+ mes "treasure works, but I hope it";
+ mes "will be useful to you. From";
+ mes "what I know, I believe this";
+ mes "is a rare item.";
+ next;
+ mes "[Tialfi]";
+ mes "I'll be waiting for the day";
+ mes "when I'll see Thor's thunder";
+ mes "for myself. I believe that,";
+ mes "one of these days, the dream";
+ mes "I've had will come true.";
+ close;
+ }
+ else
+ {
+ mes "[Tialfi]";
+ mes "I need";
+ mes "50 Rough Oridecon";
+ mes "and 50 Rough Elunium.";
+ next;
+ mes "[Tialfi]";
+ mes "I don't have much time, so";
+ mes "go ahead and continue on";
+ mes "your journeys if you can't";
+ mes "bring those to me.";
+ close;
+ }
+ }
+ else
+ {
+ if ($God4 > 99)
+ {
+ mes "[Tialfi]";
+ mes "I sense a strange energy";
+ mes "growing more powerful";
+ mes "somewhere on this continent...";
+ next;
+ mes "[Tialfi]";
+ mes "Can you feel it?";
+ mes "Something must be going on!";
+ next;
+ mes "[Tialfi]";
+ mes "I think we'd better wait and";
+ mes "see what's happening. Someone";
+ mes "will deliver the news to us.";
+ mes "Though, I am unsure of whether";
+ mes "or not it will be good news or bad...";
+ close;
+ }
+ else
+ {
+ set $God4,$God4 +1;
+ if($God4 == 50)
+ {
+ announce "The Fourth Seal of [Mjolnir] has appeared.",bc_all;
+ }
+ else if($God4 == 100 && $God2 == 100 && $God3 == 100 && $God1 == 100)
+ {
+ announce "All four seals have been released.",bc_all;
+ }
+ else if($God4 == 100)
+ {
+ announce "[Mjolnir] has been released.",bc_all;
+ }
+ set god_mjo_0,10;
+ mes "[Tialfi]";
+ mes "You've met the four Dwarven";
+ mes "Blacksmiths. I've heard that";
+ mes "they will rarely speak to humans.";
+ mes "So you must be special if you";
+ mes "were able to talk to them.";
+ next;
+ mes "[Tialfi]";
+ mes "Do you think that my dream";
+ mes "will come true? Do you believe";
+ mes "Thor's Mjolnir will appear before";
+ mes "the eyes of humans? I'm afraid great";
+ mes "change will come to this world.";
+ next;
+ mes "[Tialfi]";
+ mes "Thank you for going through such";
+ mes "trouble on my behalf. I wish to";
+ mes "give you one of my family";
+ mes "treasures as a token of my";
+ mes "gratitude.";
+ next;
+ mes "[Tialfi]";
+ mes "However, I hope you understand";
+ mes "that my family would grow suspicious";
+ mes "if one of the treasures were to";
+ mes "just go missing.";
+ next;
+ mes "[Tialfi]";
+ mes "Hmm, however, I don't think they'll";
+ mes "complain if I exchanged one of";
+ mes "the treasures for something else.";
+ mes "Let me think...";
+ next;
+ mes "[Tialfi]";
+ mes "I should be able to give you one";
+ mes "of our family heirlooms if you";
+ mes "can bring be 50 Rough Oridecons";
+ mes "and 50 Rough Eluniums.";
+ next;
+ mes "[Tialfi]";
+ mes "You don't have to do that if";
+ mes "you don't want to. But it seems";
+ mes "our family heirlooms would be";
+ mes "more useful to an adventurer";
+ mes "such as yourself...";
+ close;
+ }
+ }
+ }
+ else if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Tialfi]";
+ mes "Hmm...";
+ mes "The Dwarven Blacksmiths must be";
+ mes "upset at you for some reason.";
+ next;
+ mes "[Tialfi]";
+ mes "Remember my sister's suggestion";
+ mes "and speak to them with great";
+ mes "courtesy. Carefully choose";
+ mes "words of respect lest they be";
+ mes "insulted.";
+ next;
+ set god_mjo_1,0;
+ set god_mjo_2,0;
+ set god_mjo_3,0;
+ set god_mjo_4,0;
+ mes "[Tialfi]";
+ mes "You should be okay now. By";
+ mes "this time, they've probably";
+ mes "forgotten the insult. But make";
+ mes "sure you speak to my sister";
+ mes "for advice first.";
+ close;
+ }
+ else if(god_mjo_0 == 2 || god_mjo_0 == 1)
+ {
+ mes "[Tialfi]";
+ mes "Sorry for the trouble.";
+ mes "I wish you good luck.";
+ close;
+ }
+ else if(god_mjo_0 == 0)
+ {
+ if($God4 > 99)
+ {
+ mes "[Tialfi]";
+ mes "Listen...I can feel unknown";
+ mes "energy arising somewhere in";
+ mes "this continent.";
+ mes "Can you feel it? There must";
+ mes "be something going on...!";
+ next;
+ mes "[Tialfi]";
+ mes "I think we'd better wait to";
+ mes "see what's happening. Someone";
+ mes "will deliver the news to us.";
+ mes "I am not sure if it will be a";
+ mes "good news or a bad news.";
+ close;
+ }
+ else if(BaseLevel < 70)
+ {
+ mes "[Tialfi]";
+ mes "One of my ancestors supposedly";
+ mes "was a servant of Thor. Still,";
+ mes "I find it difficult to believe.";
+ next;
+ mes "[Tialfi]";
+ mes "If the gods have all these";
+ mes "powers, how could a mere human";
+ mes "be of any real assistance?";
+ close;
+ }
+ mes "[Tialfi]";
+ mes "Adventurer, I have an interesting";
+ mes "story to tell you. Last night,";
+ mes "I had the most amazing dream";
+ mes "where I was the servant of Thor,";
+ mes "god of thunder.";
+ next;
+ mes "[Tialfi]";
+ mes "In this dream, I traveled with";
+ mes "Thor to Jotunnheim, land of giants.";
+ mes "During our journey, he told me";
+ mes "many interesting stories about";
+ mes "gods and heroes.";
+ next;
+ mes "[Tialfi]";
+ mes "Of course, I can't remember";
+ mes "everything clearly, but it was";
+ mes "truly fantastic.";
+ next;
+ mes "[Tialfi]";
+ mes "For some reason, I can vividly";
+ mes "recall what Thor told me about";
+ mes "his weapon, Mjolnir. Mjolnir is";
+ mes "a Dwarven masterpiece.";
+ next;
+ mes "[Tialfi]";
+ mes "Thor told me that Dwarves are";
+ mes "extremely talented artisans, and";
+ mes "their works are supreme. So as";
+ mes "I was thinking about my dream,";
+ mes "I remembered...";
+ next;
+ mes "[Tialfi]";
+ mes "There is a mountain that has the";
+ mes "same name as Thor's weapon. Surely,";
+ mes "the two have some relation to";
+ mes "each other.";
+ next;
+ mes "[Tialfi]";
+ mes "I've also recently heard a rumor";
+ mes "that Dwarven Blacksmiths also";
+ mes "reside on Mount Mjolnir.";
+ next;
+ mes "[Tialfi]";
+ mes "I understand the mountain is";
+ mes "dangerous, and that I'm in no";
+ mes "position to ask such a thing...";
+ next;
+ mes "[Tialfi]";
+ mes "I can't help wanting to know";
+ mes "for myself whether or not there";
+ mes "is truth to my dream. Is it";
+ mes "possible for Mjolnir to resurface?";
+ next;
+ mes "[Tialfi]";
+ mes "If you don't mind, I'd like to ask";
+ mes "you to explore this mountain and";
+ mes "search for these Dwarven Blacksmiths.";
+ next;
+ menu "No.",-,"Okay.",L_Ok;
+ mes "[Tialfi]";
+ mes "I see. But I still appreciate";
+ mes "that you took the time to";
+ mes "listen to me.";
+ next;
+ mes "[Tialfi]";
+ mes "Hopefully someday I'll learn";
+ mes "the truth about my dreams and";
+ mes "about Mjolnir itself.";
+ close;
+
+ L_Ok:
+ mes "[Tialfi]";
+ mes "Thank you, thank you so much!";
+ mes "Even though it won't be easy,";
+ mes "I have faith that if the Dwarven";
+ mes "Blacksmiths do exist, you'll be";
+ mes "able to find them.";
+ next;
+ mes "[Tialfi]";
+ mes "Oh, and please speak to my";
+ mes "sister Roskva first. She is";
+ mes "outside the North entrance";
+ mes "of Prontera.";
+ next;
+ mes "[Tialfi]";
+ mes "I'm sure that she can give";
+ mes "you useful information if";
+ mes "you're fortunate enough to";
+ mes "encounter the Dwarves.";
+ next;
+ set god_mjo_0,rand(1,2);
+ mes "[Tialfi]";
+ mes "I'm truly lucky to meet such";
+ mes "an adventurer like yourself.";
+ mes "I wish you the best of luck.";
+ close;
+
+ }
+ else
+ {
+ mes "[Tialfi]";
+ mes "I believe in you.";
+ mes "Just be courageous.";
+ close;
+ }
+
+}
+
+}
+
+prt_fild01.gat,196,47,3 script Roskva 703,{
+
+
+ if(god_mjo_0 == 1)
+{
+ mes "[Roskva]";
+ mes "You should know that Dwarven";
+ mes "Blacksmiths are extremely";
+ mes "offended if you do not speak";
+ mes "to them with the utmost respect.";
+ next;
+ mes "[Roskva]";
+ mes "So it's really";
+ mes "important that you";
+ mes "speak to the Dwarves";
+ mes "as courteously as you can.";
+ mes "The first Dwarf you must visit";
+ mes "can be found to the East.";
+ next;
+ mes "[Roskva]";
+ mes "Travel in a clock wise direction";
+ mes "around Rune-Midgard and seek";
+ mes "out the other Dwarves in order.";
+ mes "Your final destination will be";
+ mes "to the North.";
+ next;
+ mes "[Roskva]";
+ mes "If you happen to speak to them";
+ mes "in the wrong order, please go";
+ mes "talk to my brother Tialfi again.";
+ close;
+}
+ else if(god_mjo_0 == 2)
+{
+ mes "[Roskva]";
+ mes "You should know that Dwarven";
+ mes "Blacksmiths are extremely";
+ mes "offended if you do not speak";
+ mes "to them with the utmost respect.";
+ next;
+ mes "[Roskva]";
+ mes "So it's really";
+ mes "important that you";
+ mes "speak to the Dwarves";
+ mes "as courteously as you can.";
+ mes "The first Dwarf you must visit";
+ mes "can be found to the North.";
+ next;
+ mes "[Roskva]";
+ mes "Travel in a counter clock wise";
+ mes "direction around Rune-Midgard";
+ mes "and seek out the other Dwarves";
+ mes "in order. Your final destination";
+ mes "will be to the East.";
+ next;
+ mes "[Roskva]";
+ mes "If you happen to speak to them";
+ mes "in the wrong order, please go";
+ mes "talk to my brother Tialfi again.";
+ close;
+}
+ else
+{
+ mes "[Roskva]";
+ mes "A long long time ago, many";
+ mes "people used to frequent this";
+ mes "area. Friends and families";
+ mes "would live here, sharing";
+ mes "happiness and sadness.";
+ next;
+ mes "[Roskva]";
+ mes "But they're all gone now.";
+ mes "My parents and my friends";
+ mes "have all gone to a place";
+ mes " whose name I don't even know.";
+ next;
+ mes "[Roskva]";
+ mes "I can't help";
+ mes "but feel lonesome...";
+ close;
+}
+
+}
+
+mjolnir_11.gat,149,247,5 script Dwarf Blacksmith#east 826,{
+
+ if ($God3 < 50)
+{
+ mes "[Austri]";
+ mes "Something is happening";
+ mes "somewhere on this continent.";
+ mes "You might not believe me,";
+ mes "but keep getting visions of";
+ mes "the Fenrir-Wolf.";
+ close;
+}
+ else
+{
+ if($God4 > 99)
+ {
+ mes "[Austri]";
+ mes "Something is happening";
+ mes "somewhere on this continent.";
+ mes "You might not believe me,";
+ mes "but keep getting visions of";
+ mes "the Fenrir-Wolf.";
+ close;
+ }
+ else if(god_mjo_0 == 11)
+ {
+ mes "[Austri]";
+ mes "One day, when my people";
+ mes "retrieve their memories of";
+ mes "the past, we will be able to";
+ mes "grant the power of the gods";
+ mes "to humans.";
+ next;
+ mes "[Austri]";
+ mes "I believe that";
+ mes "time is coming...";
+ close;
+ }
+ else if(god_mjo_0 == 10)
+ {
+ mes "[Austri]";
+ mes "Ho~ you might be asked";
+ mes "something from the human child.";
+ mes "If I were you, I would do the";
+ mes "kid a favor right away. Somehow";
+ mes "he is related to us in some sense.";
+ close;
+ }
+ else if(god_mjo_0 == 1)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Austri]";
+ mes "What is it?! I refuse to";
+ mes "speak to human as rude";
+ mes "and contemptible as you!";
+ mes "Leave!";
+ close;
+ }
+ else if(god_mjo_1 == 2)
+ {
+ mes "[Austri]";
+ mes "What? I don't have anything";
+ mes "to talk to you.";
+ close;
+ }
+ else if (god_mjo_2 != 0 || god_mjo_3 != 0 || god_mjo_4 != 0)
+ {
+ mes "[Austri]";
+ mes "Hm...?";
+ mes "Why have you";
+ mes "come to me, human?";
+ next;
+ menu "Nothing.",-,"Hey, 'sup!",L_Sup;
+ mes "[Austri]";
+ mes "...";
+ close;
+
+ L_Sup:
+ set god_mjo_1,3;
+ mes "[Austri]";
+ mes "What...?!";
+ mes "Do not greet the";
+ mes "Dwarves lightly,";
+ mes "mortal!";
+ close;
+ }
+ else if(god_mjo_1 == 1)
+ {
+ mes "[Austri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse;
+ mes "[Austri]";
+ mes "...";
+ close;
+
+ L_Excuse:
+ if(countitem(1005) > 0)
+ {
+ mes "[Austri]";
+ mes "Ah, I see that the entire human";
+ mes "race is not worthy of scorn.";
+ mes "Unlike many of your kind,";
+ mes "I see that you respect your";
+ mes "elders.";
+ next;
+ set @mjo_east,0;
+ L_EastTalk:
+ switch(@mjo_east)
+ {
+ case 0:
+ mes "[Austri]";
+ mes "So what have";
+ mes "you come to";
+ mes "ask of me?";
+ next;
+ menu "...",-,"About Mjolnir.",L_Speak;
+ goto L_Listen;
+
+ case 1:
+ mes "[Austri]";
+ mes "Mjolnir...?";
+ mes "Thor's legendary weapon?";
+ mes "The hammer than can shake the";
+ mes "earth and tear the sky asunder?";
+ mes "All of legendary weapons,";
+ mes "Mjolnir is perhaps greatest.";
+ next;
+ mes "[Austri]";
+ mes "As a matter of fact, it was forged";
+ mes "by my ancestor. Mjolnir was the";
+ mes "perfect weapon, except for one";
+ mes "minor flaw.";
+ next;
+ mes "[Austri]";
+ mes "The hilt of Mjolnir was forged";
+ mes "shorter than intended. Are you";
+ mes "still listening to me?";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak,"Huh?",-;
+ goto L_Listen;
+
+ case 2:
+ mes "[Austri]";
+ mes "One day, Loki came to our";
+ mes "village and showed off his";
+ mes "treasures. He boasted that we";
+ mes "couldn't possibly create something";
+ mes "to surpass their quality.";
+ next;
+ mes "[Austri]";
+ mes "Frankly his treasures were made";
+ mes "by another Dwarf tribe, but we";
+ mes "couldn't tolerate his insult. So";
+ mes "my ancestors created three";
+ mes "treasures of their own.";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak,"Yes?",-;
+ goto L_Listen;
+
+ case 3:
+ mes "[Austri]";
+ mes "Of the three treasures my";
+ mes "ancestors created, Mjolnir was";
+ mes "the last and greatest.";
+ next;
+ mes "[Austri]";
+ mes "However, while it was created,";
+ mes "a strange fly bit my ancestor";
+ mes "on the hand. Because of this";
+ mes "interruption, Mjolnir's hilt";
+ mes "is a little flawed.";
+ next;
+ mes "[Austri]";
+ mes "It's very sad. Although Mjolnir";
+ mes "is the greatest weapon ever, it";
+ mes "was very close to being the";
+ mes "epitome of craftsmanship.";
+ next;
+ menu "...",-,"Epito--what?",-,"Yes sir, I agree.",L_Speak;
+ goto L_Listen;
+
+ case 4:
+ mes "[Austri]";
+ mes "Despite this minor flaw,";
+ mes "Mjolnir is still considered";
+ mes "the greatest of legendary weapons.";
+ next;
+ mes "[Austri]";
+ mes "Mjolnir was the trusted weapon";
+ mes "Thor wielded on the battlefield";
+ mes "and every giant feared its power.";
+ next;
+ mes "[Austri]";
+ mes "I must say, a Blacksmith's";
+ mes "greatest pride comes when he";
+ mes "creates the weapon and armor";
+ mes "that can be considered his";
+ mes "life's work.";
+ next;
+ menu "...",-,"I agree, sir!",L_Speak,"Um, yeah.",-;
+ goto L_Listen;
+
+ case 5:
+ mes "[Austri]";
+ mes "The reason this mountain is";
+ mes "called Mount Mjolnir is because";
+ mes "it was actually created by the";
+ mes "hammer.";
+ next;
+ mes "[Austri]";
+ mes "In a battle against demons a";
+ mes "thousand years ago, Thor struck";
+ mes "the earth with Mjolnir. The impact";
+ mes "caused the ground to rise,";
+ mes "creating this mountain.";
+ next;
+ mes "[Austri]";
+ mes "You can imagine just how";
+ mes "unfathomly powerful Mjolnir is.";
+ mes "However, humans can never hope";
+ mes "to see or even wield Mjolnir. Only";
+ mes "a god can handle that kind of force.";
+ next;
+ menu "...",-,"Wah wah wah~!",-,"Ah, I understand sir!",L_Speak;
+ goto L_Listen;
+
+ case 6:
+ mes "[Austri]";
+ mes "Hmm... But perhaps an ambitious";
+ mes "dwarf can forge something similar";
+ mes "to Mjolnir so that it can actually";
+ mes "be used by humans. It would have less";
+ mes "power, but it'd be perfectly crafted.";
+ next;
+ mes "[Austri]";
+ mes "Yes, it's possible to create a";
+ mes "Mjolnir suited to humans. Still,";
+ mes "it wouldn't be very easy.";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak,"Yeah, whatever.",-;
+ goto L_Listen;
+
+ case 7:
+ mes "[Austri]";
+ mes "Well, I happened to speak much";
+ mes "longer than I intended. But I hope";
+ mes "you learned what you wished to";
+ mes "know about Mjolnir.";
+ next;
+ mes "[Austri]";
+ mes "I feel that a great change is";
+ mes "coming. I do not know what kind of";
+ mes "effect it will have on our world,";
+ mes "but something important will happen...";
+ next;
+ mes "[Austri]";
+ mes "Perhaps only the gods can be sure";
+ mes "as to what the future will bring.";
+ mes "In any case, we must prepare ourselves";
+ mes "for what will happen.";
+ next;
+ menu "...",-,"Yes?",-,"Yes, sir!",L_Speak;
+ goto L_Listen;
+
+ case 8:
+ set god_mjo_1,2;
+ mes "[Austri]";
+ mes "Alright then...";
+ mes "If you wish to learn more, you should";
+ mes "speak to my brothers. Take care, human.";
+ close;
+ }
+ L_Listen:
+ set god_mjo_1,3;
+ mes "[Austri]";
+ mes "...you didn't listen to me, did you?";
+ mes "Why did you make me waste my time? Leave!";
+ mes "This is why I don't want to associate";
+ mes "with human beings. They always pay little";
+ mes "attention to the conversation with me.";
+ close;
+ }
+ else
+ {
+ mes "[Austri]";
+ mes "You don't seem to understand.";
+ mes "If you wish to prove to me that";
+ mes "you understand blacksmiths, you";
+ mes "should bring something related";
+ mes "to my work!";
+ close;
+ }
+ }
+ else if(god_mjo_1 == 0)
+ {
+ mes "[Austri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse2;
+ mes "[Austri]";
+ mes "...";
+ close;
+
+ L_Excuse2:
+ mes "[Austri]";
+ mes "A respectable blacksmith cherishes";
+ mes "his tools and crafts with diligence";
+ mes "and care.";
+ next;
+ mes "[Austri]";
+ mes "When it comes to humans, I believe";
+ mes "the ones who can appreciate my line";
+ mes "of work are the only ones worth";
+ mes "talking to.";
+ next;
+ set god_mjo_1,1;
+ mes "[Austri]";
+ mes "Every good blacksmith knows the";
+ mes "value of a good hammer. If you can";
+ mes "understand that, I shall consider";
+ mes "speaking with you.";
+ next;
+ mes "[Austri]";
+ mes "Now go, human.";
+ mes "I wish you safety";
+ mes "in your travels.";
+ close;
+ }
+ else
+ {
+ mes "[Austri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 2)
+ {
+ if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Austri]";
+ mes "What is it! I do not have anything to";
+ mes "to such a rude human as you!";
+ mes "Go back to where you are from!";
+ close;
+ }
+ else if(god_mjo_4 == 2)
+ {
+ mes "[Austri]";
+ mes "What? I don't have anything";
+ mes "to talk to you.";
+ close;
+ }
+ else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_3 == 0 || god_mjo_3 == 1)
+ {
+ mes "[Austri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Hey, sup!",L_Sup2;
+ mes "[Austri]";
+ mes "...";
+ close;
+ L_Sup2:
+ set god_mjo_4,3;
+ mes "[Austri]";
+ mes "What?!";
+ mes "Leave immediately and go study";
+ mes "your english properly!";
+ close;
+ }
+ else if(god_mjo_4 == 1)
+ {
+ mes "[Austri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse3;
+ mes "[Austri]";
+ mes "...";
+ close;
+ L_Excuse3:
+ if(countitem(1005) > 0)
+ {
+ mes "[Austri]";
+ mes "Hmm, I like your polite manners.";
+ mes "Okay, I am willing to talk to you.";
+ mes "So ask me if you have any questions.";
+ next;
+ set @mjo_east,0;
+ L_EastTalk2:
+ switch(@mjo_east)
+ {
+ case 0:
+ mes "[Austri]";
+ mes "So, what would you like to ask?";
+ next;
+ menu "...",-,"About Mjolnir.",L_Speak2;
+ goto L_Listen2;
+ case 1:
+ mes "[Austri]";
+ mes "Mjolnir...you mean the Thor's legendary weapon?";
+ mes "There has a rumor that Mjolnir slashed the sky";
+ mes "and stunned the earth by one blow.";
+ mes "That is the greatest weapon in the legend.";
+ next;
+ mes "[Austri]";
+ mes "As a matter of fact, it was forged by my ancestor.";
+ mes "Do you know the reason why the hilt of Mjolnir";
+ mes "was forged that short...?";
+ mes "Are you listening to me?";
+ next;
+ menu "...",-,"Yes?",-,"Yes, sir!",L_Speak2;
+ goto L_Listen2;
+ case 2:
+ mes "[Austri]";
+ mes "One day, Loki came to dwarf's town";
+ mes "and showed off his three treasure.";
+ mes "He provoked us by saying";
+ mes "nobody would make better things";
+ mes "than his treasures.";
+ next;
+ mes "[Austri]";
+ mes "Frankly his treasures were made by other dwarf tribe...";
+ mes "but anyway, we could not put up with the insult.";
+ mes "So my ancestor made three treasures of our own...";
+ mes "Are you still listening to me?";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
+ goto L_Listen2;
+ case 3:
+ mes "[Austri]";
+ mes "Mjolnir was the last treasure among the three.";
+ mes "While blowing the bellows,";
+ mes "my ancerstor was bitten by a strange insect on his hand.";
+ mes "So he could not continue working.";
+ mes "That's how the hilt of Mjolnir became that short.";
+ mes "Ah, what a sad story!";
+ next;
+ menu "...",-,"I agree, sir!",L_Speak2,"Yes?",-;
+ goto L_Listen2;
+ case 4:
+ mes "[Austri]";
+ mes "Despite of the sad incident,";
+ mes "my ancerstor created the greatest weapon";
+ mes "in the legend. Mjolnir became Thor's the most reliable comrade";
+ mes "in the battlefield. Even giants in Utgard feared";
+ mes "the power of the godly weapon.";
+ next;
+ mes "[Austri]";
+ mes "However, since the weapon had the abnormally short hilt,";
+ mes "Thor had to wear iron gauntlets to compensate the weakness.";
+ mes "I must say, blacksmiths feel most proud when they";
+ mes "achieve to create the best weapons and armors of their life.";
+ next;
+ menu "...",-,"Yes?",-,"I agree, sir!",L_Speak2;
+ goto L_Listen2;
+ case 5:
+ mes "[Austri]";
+ mes "And I am going to tell you";
+ mes "the reason why this mountain has been called";
+ mes "as Mountain Mjolnir... during the battle against demons";
+ mes "occurred a thousand years ago, he hammered down";
+ mes "the earth using Mjolnir. Because of the impact,";
+ mes "the ground around the spot rose high";
+ mes "and formed a mountain.";
+ next;
+ mes "[Austri]";
+ mes "You can imagine how powerful Mjolnir would be.";
+ mes "It made a new mountain by one hammering.";
+ mes "Unfortunately, you wouldn't be able to see";
+ mes "the weapon in your life. Somehow it is belong to God.";
+ next;
+ menu "...",-,"I can understand, sir!",L_Speak2,"Yes?",-;
+ goto L_Listen2;
+ case 6:
+ mes "[Austri]";
+ mes "Perhaps an ambitious dwarf could forge";
+ mes "a treasure is similar to Mjolnir.";
+ mes "But it will not happen to be exactly the same as the original Mjolnir.";
+ mes "The original one cannot be held by a human being";
+ mes "due to the unimaginable power it holds within.";
+ next;
+ mes "[Austri]";
+ mes "Let's say, a modified Mjolnir which would be suited to human's power";
+ mes "can be made possibly...? But still, it will not";
+ mes "easily happen.";
+ mes "Just, never mind.";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
+ goto L_Listen2;
+ case 7:
+ mes "[Austri]";
+ mes "I happened to speak longer than I planned.";
+ mes "But this is it. I hope you will have a better understanding";
+ mes "about Mjolnir by now.";
+ mes "And obviously something has been happening";
+ mes "in this world...I can feel that.";
+ next;
+ mes "[Austri]";
+ mes "I cannot tell it will bring a good effect or a bad one to";
+ mes "the continent...";
+ mes "Maybe Gods would know.";
+ mes "We must prepare to survive in the changes.";
+ next;
+ menu "...",-,"Yes, sir!",L_Speak2,"Yes?",-;
+ goto L_Listen2;
+ case 8:
+ set god_mjo_4,2;
+ mes "[Austri]";
+ mes "Ok, you may leave me and visit my brothers now.";
+ mes "Take care.";
+ close;
+ }
+ L_Listen2:
+ set god_mjo_4,3;
+ mes "[Austri]";
+ mes "...you didn't listen to me, did you?";
+ mes "Why did you make me waste my time? Leave!";
+ mes "This is why I don't want to associate with human beings.";
+ mes "They always pay little attention to the conversation with me.";
+ close;
+
+ }
+ else
+ {
+ mes "[Austri]";
+ mes "You don't seem to understand.....";
+ mes "If you want to prove me that you understand how blacksmiths feel,";
+ mes "bring a thing related to blacksmiths!";
+ close;
+ }
+ }
+ else if(god_mjo_4 == 0)
+ {
+ mes "[Austri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse4;
+ mes "[Austri]";
+ mes "...";
+ close;
+
+ L_Excuse4:
+ mes "[Austri]";
+ mes "A respectable blacksmith cherishes his hammer and anvil.";
+ mes "If you wish to continue a conversation with me,";
+ mes "you should understand blacksmiths.";
+ mes "Every blacksmith knows what hammer is good for themselves.";
+ next;
+ set god_mjo_4,1;
+ mes "[Austri]";
+ mes "If you understand what I meant,";
+ mes "I will consider speaking to you next time.";
+ mes "Have a good travel.";
+ close;
+ }
+ else
+ {
+ mes "[Austri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 0)
+ {
+ mes "[Austri]";
+ mes "Ah...";
+ mes "It feels like today's going to be a great day.";
+ next;
+ mes "[Austri]";
+ mes "I've got the warm sun, fresh forest air, and my hammer and anvil are at the ready. It's a perfect day for smithing!";
+ close;
+ }
+ else
+ {
+ mes "[Austri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+}
+
+L_Speak:
+ set @mjo_east,@mjo_east +1;
+ goto L_EastTalk;
+
+L_Speak2:
+ set @mjo_east,@mjo_east +1;
+ goto L_EastTalk2;
+
+}
+
+mjolnir_09.gat,209,341,3 script Dwarf Blacksmith#south 826,{
+
+ if ($God3 < 50)
+{
+ mes "[Sudri]";
+ mes "I want to compete";
+ mes "and fight with stronger";
+ mes "and stronger opponents!";
+ next;
+ mes "[Sudri]";
+ mes "One day, I'll return to";
+ mes "Svartalfaheimr and defeat";
+ mes "Ivaldi! Mwahahaha!";
+ close;
+}
+ else
+{
+ if ($God4 > 99)
+ {
+ mes "[Sudri]";
+ mes "Wait, this is not the";
+ mes "right time to fighting...";
+ next;
+ mes "[Sudri]";
+ mes "Something that has been hidden";
+ mes "is about to be born out of the";
+ mes "sweat of determination and";
+ mes "tears of sacrifice. We must";
+ mes "wait until then.";
+ close;
+ }
+ else if(god_mjo_0 == 11)
+ {
+ mes "[Sudri]";
+ mes "I want to compete with a stronger one!";
+ mes "I will be stronger and stronger,";
+ mes "one day when I get back to Svartalfaheimr";
+ mes "I shall defeat Ivaldi!";
+ mes "Muhahahaha...!";
+ close;
+ }
+ else if(god_mjo_10 == 10)
+ {
+ mes "[Sudri]";
+ mes "I must admit that you're a";
+ mes "really strong human. Let us";
+ mes "fight again when we have a chance.";
+ mes "The next time, you may not be";
+ mes "so lucky!";
+ close;
+ }
+ else if(god_mjo_0 == 1)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Sudri]";
+ mes "Go back to where you belong";
+ mes "before I beat you to death!";
+ next;
+ mes "[Sudri]";
+ mes "All you can gain here are";
+ mes "a few herbs.";
+ close;
+ }
+ else if(god_mjo_2 == 2)
+ {
+ mes "[Sudri]";
+ mes "That was a great fight!";
+ mes "Mwahahaha! I'm satisfied with";
+ mes "the results. I may have lost,";
+ mes "but we fought honorably with";
+ mes "everything we had.";
+ close;
+ }
+ else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_3 != 0 || god_mjo_4 != 0)
+ {
+ mes "[Sudri]";
+ mes "So...";
+ mes "What brings";
+ mes "you here?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse;
+ mes "[Sudri]";
+ mes "You have too much time on";
+ mes "your hands. Why don't you";
+ mes "log out and hang out with";
+ mes "your friends instead?";
+ close;
+
+ L_Excuse:
+ set god_mjo_2,3;
+ mes "[Sudri]";
+ mes "Why should";
+ mes "I excuse you?";
+ next;
+ mes "[Sudri]";
+ mes "If there's anything I hate,";
+ mes "it's insincerity and sarcasm.";
+ mes "What, you wanna fight?!";
+ close;
+ }
+ else if(god_mjo_2 == 1)
+ {
+ set @sudri_vit,200;
+ set @player_vit,100;
+ set @sudri_def,0;
+ set @player_def,0;
+ set @sudri_atk,0;
+ set @player_atk,0;
+ set @counter,0;
+ set @damage,0;
+ mes "[Sudri]";
+ mes "Fine, let's fight!";
+ mes "Old school rules!";
+ next;
+
+ L_Fight:
+ mes "Sudri : HP " + @sudri_vit + " left.";
+ mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " initiated an attack!";
+ next;
+ menu "...?!",case11,"Strike Head!",case12,"Strike Chest!",case13,"Strike Legs!",case14,"Take a break.",case15;
+ case11:
+ set @player_atk,0;
+ goto L_DefSudri;
+ case12:
+ set @player_atk,1;
+ goto L_DefSudri;
+ case13:
+ set @player_atk,2;
+ goto L_DefSudri;
+ case14:
+ set @player_atk,3;
+ goto L_DefSudri;
+ case15:
+ set @player_atk,4;
+ goto L_DefSudri;
+ L_DefSudri:
+ set @sudri_def,rand(1,3);
+ set @damage,rand(15,25);
+ if(@player_atk == 1) mes "" + strcharinfo(0) + " attacks Sudri's head!";
+ else if(@player_atk == 2) mes "" + strcharinfo(0) + " strikes Sudri's chest!";
+ else if(@player_atk == 3) mes "" + strcharinfo(0) + " aims for Sudri's legs!";
+ else if(@player_atk == 4) mes "" + strcharinfo(0) + " requests a break!";
+ else mes "" + strcharinfo(0) + "'s weak point revealed!";
+ if(@player_atk == @sudri_def)
+ {
+ specialeffect 336;
+ if(@sudri_def == 1)
+ {
+ mes "--------------------";
+ mes "Sudri easily dodges";
+ mes "your attack by twisting";
+ mes "his small, yet svelte, body.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " misses!";
+ }
+ else if(@sudri_def == 2)
+ {
+ mes "--------------------";
+ mes "Sudri blocks your";
+ mes "attack by crossing";
+ mes "his stout arms.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + "'s attack is blocked!";
+ }
+ else if(@sudri_def == 3)
+ {
+ mes "--------------------";
+ mes "Sudri dodges your";
+ mes "attack with a graceful";
+ mes "leap to the heavens.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " misses!";
+ }
+ }
+ else if(@player_atk == 4)
+ {
+ skilleffect 28,10;
+ set @player_vit,@player_vit + 10;
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has gained 10 HP!";
+ }
+ else if(@player_atk == 1)
+ {
+ specialeffect 5;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the head!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 2)
+ {
+ specialeffect 2;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the chest!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 3)
+ {
+ specialeffect 3;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the legs!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 0)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - 10;
+ mes "--------------------";
+ mes "You were hit by";
+ mes "Sudri's counter attack!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost 10 HP!";
+ if(@player_vit < 1)
+ {
+ mes "Defeated...";
+ next;
+ goto L_Lost;
+ }
+ }
+ else
+ {
+ mes "--------------------";
+ mes "Something happened and the fight has stopped!";
+ close;
+ }
+ if(@sudri_vit < 1)
+ {
+ mes "" + strcharinfo(0) + " wins!";
+ next;
+ goto L_Win;
+ }
+ next;
+ mes "Sudri : HP " + @sudri_vit + " left.";
+ mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
+ mes "--------------------";
+ mes "Sudri attacks...!";
+ next;
+ menu "...?!",case21,"Dodge!",case22,"Block!",case23,"Jump!",case24,"Counter back!",case25;
+ case21:
+ set @player_def,0;
+ goto L_DefPlayer;
+ case22:
+ set @player_def,1;
+ goto L_DefPlayer;
+ case23:
+ set @player_def,2;
+ goto L_DefPlayer;
+ case24:
+ set @player_def,3;
+ goto L_DefPlayer;
+ case25:
+ set @player_def,4;
+ goto L_DefPlayer;
+ L_DefPlayer:
+ set @sudri_atk,rand(1,3);
+ set @damage,rand(20,25);
+ if(@sudri_atk == 1) mes "Sudri aims for the head!";
+ else if(@sudri_atk == 2) mes "Sudri strikes the chest!";
+ else mes "Sudri attacks the legs!";
+ if(@sudri_atk == @player_def)
+ {
+ specialeffect2 336;
+ if(@player_def == 1)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " quickly dodged,";
+ mes "Sudri's arms were too short to reach at you.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ else if(@player_def == 2)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " barely blocked";
+ mes "Sudri's attack.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ else if(@player_def == 3)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " jumped,";
+ mes "dodged Sudri's attack at ease.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ }
+ else if(@player_def == 4)
+ {
+ set @counter,rand(1,4);
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " countered back!";
+ if(@counter == 1)
+ {
+ specialeffect2 131;
+ specialeffect 17;
+ set @sudri_vit,@sudri_vit - 20;
+ mes "You successfully countered back!";
+ mes "--------------------";
+ mes "Sudri has lost 20 HP!";
+ if(@sudri_vit < 1)
+ {
+ mes "" + strcharinfo(0) + " won!";
+ next;
+ goto L_Win;
+ }
+ }
+ else
+ {
+ specialeffect2 1;
+ set @player_vit,@player_vit - 30;
+ mes "You were taken a great damage on your weak spot!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost 30 HP!";
+ }
+ }
+ else if(@sudri_atk == 1)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the head!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 2)
+ {
+ specialeffect2 3;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the chest!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 3)
+ {
+ specialeffect2 4;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the legs!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 0)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hits "+ strcharinfo(0) +"";
+ mes "during a moment of";
+ mes "absent-mindedness!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else
+ {
+ mes "--------------------";
+ mes "Something happened and the fight has stopped!";
+ close;
+ }
+ if(@player_vit < 1)
+ {
+ mes "Sudri won!";
+ next;
+ goto L_Lost;
+ }
+ next;
+ goto L_Fight;
+
+ L_Lost:
+ mes "[Sudri]";
+ mes "Muhahahaha!";
+ mes "You're not strong enough";
+ mes "to beat me! I want someone";
+ mes "who can offer me a challenge!";
+ next;
+ mes "[Sudri]";
+ mes "Go out, train some and get";
+ mes "stronger before you even";
+ mes "think about coming back!";
+ close;
+
+ L_Win:
+ set god_mjo_2,2;
+ mes "[Sudri]";
+ mes "You're stronger than me.";
+ mes "I never thought I'd meet";
+ mes "a human as strong as you.";
+ next;
+ mes "[Sudri]";
+ mes "I'm impressed. Alright,";
+ mes "I'll tell my friends good";
+ mes "things about you. Hopefully,";
+ mes "my brothers will give you";
+ mes "the help you're looking for.";
+ next;
+ mes "[Sudri]";
+ mes "Okay then,";
+ mes "be safe on";
+ mes "your travels!";
+ close;
+ }
+ else if(god_mjo_2 == 0)
+ {
+ mes "[Sudri]";
+ mes "So...";
+ mes "What brings";
+ mes "you here, human?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse2;
+ mes "[Sudri]";
+ mes "You have too much";
+ mes "time on your hand.";
+ mes "Why don't you log out";
+ mes "and go out with your";
+ mes "friends instead?";
+ close;
+
+ L_Excuse2:
+ mes "[Sudri]";
+ mes "Huh. You're different than other";
+ mes "humans. But still, trusting you";
+ mes "because you know how to speak";
+ mes "isn't very wise.";
+ next;
+ mes "[Sudri]";
+ mes "If there's anything I love,";
+ mes "it's bare knuckle brawling,";
+ mes "old school style.";
+ next;
+ mes "[Sudri]";
+ mes "Words can be deceptive,";
+ mes "but if you can beat me in a";
+ mes "fight, I think I might just";
+ mes "talk to you. How about it?";
+ next;
+ menu ".....",-,"Yes, I accept your challenge.",L_Accept,"No, I'm scared!",L_Scared;
+ set god_mjo_2,3;
+ mes "[Sudri]";
+ mes "You didn't even answer me!";
+ mes "Fine, whatever.";
+ close;
+
+ L_Accept:
+ set god_mjo_2,1;
+ mes "[Sudri]";
+ mes "Ah, I like you already, human!";
+ mes "Now why don't you go do some";
+ mes "warm ups, and we'll fight";
+ mes "when you're ready?";
+ close;
+
+ L_Scared:
+ set god_mjo_2,1;
+ mes "[Sudri]";
+ mes "Eh...?";
+ mes "Why are you being such a coward?";
+ mes "Are you afraid of this old";
+ mes "and tiny Dwarf?";
+ next;
+ mes "[Sudri]";
+ mes "Come on, I'll even let you";
+ mes "have the first hit. Just come";
+ mes "to me when you're ready to fight!";
+ close;
+ }
+ else
+ {
+ mes "[Sudri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 2)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Sudri]";
+ mes "Go back before I beat you to death.";
+ mes "All you can gain here are few herbs.";
+ close;
+ }
+ else if(god_mjo_3 == 2)
+ {
+ mes "[Sudri]";
+ mes "That was a great fight....hahahaha...";
+ mes "I don't regret about the result.";
+ mes "I lost but I kept my dignity.";
+ close;
+ }
+ else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_4 != 0)
+ {
+ mes "[Sudri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse3;
+ mes "[Sudri]";
+ mes "You have too much time";
+ mes "on your hand.";
+ mes "Why don't you log out";
+ mes "and go out with your";
+ mes "friends instead?";
+ close;
+
+ L_Excuse3:
+ set god_mjo_3,3;
+ mes "[Sudri]";
+ mes "Why should I excuse you?";
+ mes "What, are you challenging me now?";
+ mes "Do you want to fight with me huh?";
+ close;
+ }
+ else if(god_mjo_3 == 1)
+ {
+ set @sudri_vit,200;
+ set @player_vit,100;
+ set @sudri_def,0;
+ set @player_def,0;
+ set @sudri_atk,0;
+ set @player_atk,0;
+ set @counter,0;
+ set @damage,0;
+ mes "[Sudri]";
+ mes "Fine, let's fight!";
+ mes "Old school rules!";
+ next;
+
+ L_Fight2:
+ mes "Sudri : HP " + @sudri_vit + " left.";
+ mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " initiated an attack!";
+ next;
+ menu "...?!",case31,"Strike Head!",case32,"Strike Chest!",case33,"Strike Legs!",case34,"Take a break.",case35;
+ case31:
+ set @player_atk,0;
+ goto L_DefSudri2;
+ case32:
+ set @player_atk,1;
+ goto L_DefSudri2;
+ case33:
+ set @player_atk,2;
+ goto L_DefSudri2;
+ case34:
+ set @player_atk,3;
+ goto L_DefSudri2;
+ case35:
+ set @player_atk,4;
+ goto L_DefSudri2;
+ L_DefSudri2:
+ set @sudri_def,rand(1,3);
+ set @damage,rand(15,25);
+ if(@player_atk == 1) mes "" + strcharinfo(0) + " attacks Sudri's head!";
+ else if(@player_atk == 2) mes "" + strcharinfo(0) + " strikes Sudri's chest!";
+ else if(@player_atk == 3) mes "" + strcharinfo(0) + " aims for Sudri's legs!";
+ else if(@player_atk == 4) mes "" + strcharinfo(0) + " requests a break!";
+ else mes "" + strcharinfo(0) + "'s weak point revealed!";
+ if(@player_atk == @sudri_def)
+ {
+ specialeffect 336;
+ if(@sudri_def == 1)
+ {
+ mes "--------------------";
+ mes "Sudri easily dodges";
+ mes "your attack by twisting";
+ mes "his small, yet svelte, body.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " misses!";
+ }
+ else if(@sudri_def == 2)
+ {
+ mes "--------------------";
+ mes "Sudri blocks your";
+ mes "attack by crossing";
+ mes "his stout arms.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + "'s attack is blocked!";
+ }
+ else if(@sudri_def == 3)
+ {
+ mes "--------------------";
+ mes "Sudri dodges your";
+ mes "attack with a graceful";
+ mes "leap to the heavens.";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " misses!";
+ }
+ }
+ else if(@player_atk == 4)
+ {
+ skilleffect 28,10;
+ set @player_vit,@player_vit + 10;
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has gained 10 HP!";
+ }
+ else if(@player_atk == 1)
+ {
+ specialeffect 5;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the head!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 2)
+ {
+ specialeffect 2;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the chest!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 3)
+ {
+ specialeffect 3;
+ set @sudri_vit,@sudri_vit - @damage;
+ mes "--------------------";
+ mes "You successfully hit";
+ mes "Sudri on the legs!";
+ mes "--------------------";
+ mes "Sudri has lost " + @damage + " HP!";
+ }
+ else if(@player_atk == 0)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - 10;
+ mes "--------------------";
+ mes "You were hit by";
+ mes "Sudri's counter attack!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost 10 HP!";
+ if(@player_vit < 1)
+ {
+ mes "Defeated...";
+ next;
+ goto L_Lost2;
+ }
+ }
+ else
+ {
+ mes "--------------------";
+ mes "Something happened and the fight has stopped!";
+ close;
+ }
+ if(@sudri_vit < 1)
+ {
+ mes "" + strcharinfo(0) + " wins!";
+ next;
+ goto L_Win2;
+ }
+ next;
+ mes "Sudri : HP " + @sudri_vit + " left.";
+ mes "" + strcharinfo(0) + " : HP " + @player_vit + " left.";
+ mes "--------------------";
+ mes "Sudri attacks...!";
+ next;
+ menu "...?!",case41,"Dodge!",case42,"Block!",case43,"Jump!",case44,"Counter back!",case45;
+ case41:
+ set @player_def,0;
+ goto L_DefPlayer2;
+ case42:
+ set @player_def,1;
+ goto L_DefPlayer2;
+ case43:
+ set @player_def,2;
+ goto L_DefPlayer2;
+ case44:
+ set @player_def,3;
+ goto L_DefPlayer2;
+ case45:
+ set @player_def,4;
+ goto L_DefPlayer2;
+ L_DefPlayer2:
+ set @sudri_atk,rand(1,3);
+ set @damage,rand(20,25);
+ if(@sudri_atk == 1) mes "Sudri aims for the head!";
+ else if(@sudri_atk == 2) mes "Sudri strikes the chest!";
+ else mes "Sudri attacks the legs!";
+ if(@sudri_atk == @player_def)
+ {
+ specialeffect2 336;
+ if(@player_def == 1)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " quickly dodged,";
+ mes "Sudri's arms were too short to reach at you.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ else if(@player_def == 2)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " barely blocked";
+ mes "Sudri's attack.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ else if(@player_def == 3)
+ {
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " jumped,";
+ mes "dodged Sudri's attack at ease.";
+ mes "--------------------";
+ mes "Sudri has failed to attack.";
+ }
+ }
+ else if(@player_def == 4)
+ {
+ set @counter,rand(1,4);
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " countered back!";
+ if(@counter == 1)
+ {
+ specialeffect2 131;
+ specialeffect 17;
+ set @sudri_vit,@sudri_vit - 20;
+ mes "You successfully countered back!";
+ mes "--------------------";
+ mes "Sudri has lost 20 HP!";
+ if(@sudri_vit < 1)
+ {
+ mes "" + strcharinfo(0) + " won!";
+ next;
+ goto L_Win2;
+ }
+ }
+ else
+ {
+ specialeffect2 1;
+ set @player_vit,@player_vit - 30;
+ mes "You were taken a great damage on your weak spot!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost 30 HP!";
+ }
+ }
+ else if(@sudri_atk == 1)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the head!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 2)
+ {
+ specialeffect2 3;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the chest!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 3)
+ {
+ specialeffect2 4;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hit " + strcharinfo(0) + "";
+ mes "on the legs!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else if(@sudri_atk == 0)
+ {
+ specialeffect2 5;
+ set @player_vit,@player_vit - @damage;
+ mes "--------------------";
+ mes "Sudri successfully";
+ mes "hits "+ strcharinfo(0) +"";
+ mes "during a moment of";
+ mes "absent-mindedness!";
+ mes "--------------------";
+ mes "" + strcharinfo(0) + " has lost " + @damage + " HP!";
+ }
+ else
+ {
+ mes "--------------------";
+ mes "Something happened and the fight has stopped!";
+ close;
+ }
+ if(@player_vit < 1)
+ {
+ mes "Sudri won!";
+ next;
+ goto L_Lost2;
+ }
+ next;
+ goto L_Fight2;
+
+ L_Lost2:
+ mes "[Sudri]";
+ mes "Muhahahaha, you are not strong";
+ mes "enough to beat me! I want someone";
+ mes "who I can make an even match!";
+ mes "Go practice more and come back!";
+ close;
+
+ L_Win2:
+ set god_mjo_3,2;
+ mes "[Sudri]";
+ mes "Ah...you are stronger than me...I haven't thought";
+ mes "that there would be a strong human as you...I am impressed.";
+ mes "Great, great.";
+ mes "Okay, I will tell good things of you to my friend.";
+ mes "But don't forget the order to visit my friends and brothers.";
+ next;
+ mes "[Sudri]";
+ mes "Okay then, have a good travel!";
+ close;
+ }
+ else if(god_mjo_3 == 0)
+ {
+ mes "[Sudri]";
+ mes "What made you come to me?";
+ next;
+ menu "Nothing.",-,"Excuse me, sir.",L_Excuse4;
+ mes "[Sudri]";
+ mes "You have too much time on your hand.";
+ mes "Why don't you log out and go out";
+ mes "with your friends instead?";
+ close;
+
+ L_Excuse4:
+ mes "[Sudri]";
+ mes "You have very sharp eyes.";
+ mes "I can tell you are different from other humans.";
+ mes "Do you want something from me?";
+ mes "I don't talk to humans.";
+ next;
+ mes "[Sudri]";
+ mes "I love bare hands fighting!";
+ mes "I believe the action comes before the words!";
+ mes "So, how about a fight with me, huh?";
+ next;
+ menu ".....",-,"Sure, please teach me well.",L_Accept2,"No, I am scared.",L_Scared2;
+ set god_mjo_3,3;
+ mes "[Sudri]";
+ mes "You didn't even answer me!";
+ mes "Fine, whatever.";
+ close;
+
+ L_Accept2:
+ set god_mjo_3,1;
+ mes "[Sudri]";
+ mes "What a quick answer! I like you already, human!";
+ mes "Why don't you go do some warm-ups?";
+ mes "Let's start a fight when you're ready!";
+ close;
+
+ L_Scared2:
+ set god_mjo_3,1;
+ mes "[Sudri]";
+ mes "Bah, you are a hot-blooded young man!";
+ mes "Why are you being so coward?";
+ mes "Do you fear this old and tiny dwarf man?";
+ mes "I don't mind, I will yield you first hit.";
+ mes "Come back when you are ready.";
+ close;
+ }
+ else
+ {
+ mes "[Sudri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 0)
+ {
+ mes "[Sudri]";
+ mes "In a one on one fight,";
+ mes "you put everything on the";
+ mes "line to show your might";
+ mes "to your opponent.";
+ next;
+ mes "[Sudri]";
+ mes "Have you ever felt the";
+ mes "same way I do, human? Win";
+ mes "or lose, just giving your";
+ mes "all is the most satisfying accomplishment.";
+ close;
+ }
+ else
+ {
+ mes "[Sudri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+}
+
+}
+
+mjolnir_01.gat,35,136,7 script Dwarf Blacksmith#west 826,{
+
+ if($God3 < 50)
+{
+ mes "[Vestri]";
+ mes "If you want something,";
+ mes "you should earn it through";
+ mes "your own efforts.";
+ next;
+ mes "[Vestri]";
+ mes "No matter what other people say,";
+ mes "if you're confident and your";
+ mes "will is unwavering, you'll always";
+ mes "be satisfied with the results.";
+ next;
+ mes "[Vestri]";
+ mes "What do you think?";
+ mes "The youth these days...";
+ close;
+}
+ else
+{
+
+ if($God4 > 99)
+ {
+ mes "[Vestri]";
+ mes "I don't feel like doing anything today.";
+ next;
+ mes "[Vestri]";
+ mes "Someone must have forged something";
+ mes "really monstrous, otherwise I";
+ mes "wouldn't be feeling so worthless!";
+ next;
+ mes "[Vestri]";
+ mes "Yeah, I think I need a break!";
+ mes "Don't you think I need a break,";
+ mes "human?";
+ close;
+ }
+ else if(god_mjo_0 == 11)
+ {
+ mes "[Vestri]";
+ mes "There's nothing like taking";
+ mes "a relaxing break after putting";
+ mes "your heart into your work.";
+ next;
+ mes "[Vestri]";
+ mes "What do you think, human?";
+ mes "Isn't that one of life's";
+ mes "simple pleasures?";
+ close;
+ }
+ else if(god_mjo_0 == 10)
+ {
+ mes "[Vestri]";
+ mes "If you need something, you must get it";
+ mes "on your own...no matter what people say";
+ mes "if you are confident about your will,";
+ mes "it is already good regardless of the result of your action.";
+ mes "What do you think?";
+ mes "Young generations in thesedays....";
+ close;
+ }
+ else if(god_mjo_0 == 1)
+ {
+ if(god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Vestri]";
+ mes "I really hope I meet a decent";
+ mes "human being next time. So far,";
+ mes "I haven't met one useful human.";
+ close;
+ }
+ else if(god_mjo_3 == 2)
+ {
+ mes "[Vestri]";
+ mes "Perfect preparation does not";
+ mes "always result in success.";
+ mes "There's a point when you've";
+ mes "got to just go out and do it.";
+ next;
+ mes "[Vestri]";
+ mes "I don't know how far you'll";
+ mes "go, but put all your strength";
+ mes "into it anyway~";
+ close;
+ }
+ else if(god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_4 != 0)
+ {
+ mes "[Vestri]";
+ mes "What do you want?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse;
+ mes "[Vestri]";
+ mes "If you need anything, try to";
+ mes "get it on your own!";
+ mes "Nobody is responsible on you";
+ mes "but yourself!";
+ close;
+
+ L_Excuse:
+ set god_mjo_3,3;
+ mes "[Vestri]";
+ mes "You didn't answer the question!";
+ mes "Now, you've probably got the";
+ mes "wrong Dwarf here.";
+ next;
+ mes "[Vestri]";
+ mes "Get out of here, and go to your";
+ mes "human Blacksmiths if you want";
+ mes "equipment upgrades!";
+ close;
+ }
+ else if(god_mjo_3 == 1)
+ {
+ disable_items;
+ mes "[Vestri]";
+ mes "Great! Which one should";
+ mes "I upgrade first, huh? My heart";
+ mes "is pounding with anticipation...";
+ next;
+ M_Menu:
+ menu getequipname(1),PART1,getequipname(2),PART2,getequipname(3),PART3,getequipname(4),PART4,getequipname(5),PART5,
+ getequipname(6),PART6,getequipname(7),PART7,getequipname(8),PART8,getequipname(9),PART9,getequipname(10),PART10;
+
+ PART1:
+ set @vestripart,1;
+ if (getequipisequiped(1)) goto L_Check11;
+ goto M_Menu;
+ PART2:
+ set @vestripart,2;
+ if (getequipisequiped(2)) goto L_Check11;
+ goto M_Menu;
+
+ PART3:
+ set @vestripart,3;
+ if (getequipisequiped(3)) goto L_Check11;
+ goto M_Menu;
+
+ PART4:
+ set @vestripart,4;
+ if (getequipisequiped(4)) goto L_Check11;
+ goto M_Menu;
+ PART5:
+ set @vestripart,5;
+ if (getequipisequiped(5)) goto L_Check11;
+ goto M_Menu;
+
+ PART6:
+ set @vestripart,6;
+ if (getequipisequiped(6)) goto L_Check11;
+ goto M_Menu;
+
+ PART7:
+ set @vestripart,7;
+ if (getequipisequiped(7)) goto L_Check11;
+ goto M_Menu;
+
+ PART8:
+ set @vestripart,8;
+ if (getequipisequiped(8)) goto L_Check11;
+ goto M_Menu;
+
+ PART9:
+ set @vestripart,9;
+ if (getequipisequiped(9)) goto L_Check11;
+ goto M_Menu;
+
+ PART10:
+ set @vestripart,10;
+ if (getequipisequiped(10)) goto L_Check11;
+ goto M_Menu;
+
+ L_Check11:
+ if(getequipisenableref(@vestripart)) goto L_Check12;
+ mes "[Vestri]";
+ mes "What, this isn't upgradable!";
+ mes "What the hell do you want me";
+ mes "to do with this?";
+ close2;
+ enable_items;
+ end;
+
+ L_Check12:
+ if(getequipisidentify(@vestripart)) goto L_Check13;
+ mes "[Vestri]";
+ mes "You'd better identify this item";
+ mes "first. If we don't know what it";
+ mes "is, what's the point of upgrading it?";
+ close2;
+ enable_items;
+ end;
+
+ L_Check13:
+ if(getequiprefinerycnt(@vestripart) < 10) goto L_Check14;
+ mes "[Vestri]";
+ mes "Oh, this is excellent!";
+ mes "This piece here has been";
+ mes "perfectly refined!";
+ next;
+ mes "[Vestri]";
+ mes "But this isn't what I want.";
+ mes "I can't do any work on this at all.";
+ close2;
+ enable_items;
+ end;
+
+ L_Check14:
+ if (getequippercentrefinery(@vestripart) != 100) goto L_Check15;
+ mes "[Vestri]";
+ mes "This item isn't even a challenge";
+ mes "to upgrade. You can get humans";
+ mes "to do this kind of beginner's stuff.";
+ next;
+ mes "[Vestri]";
+ mes "Come on...";
+ mes "Bring me something that presents";
+ mes "an element of risk!";
+ close2;
+ enable_items;
+ end;
+
+ L_Check15:
+ if (getequipweaponlv(@vestripart) == 1 || getequipweaponlv(@vestripart) == 2 || getequipweaponlv(@vestripart) == 3)
+ {
+ mes "[Vestri]";
+ mes "Hey...";
+ mes "Don't insult me by expecting me";
+ mes "to work on anything less than";
+ mes "a Level 4 weapon.";
+ next;
+ mes "[Vestri]";
+ mes "Bring me a Level 4 weapon for";
+ mes "me to work on next time, got it?";
+ close2;
+ enable_items;
+ end;
+ }
+
+ if(getequipweaponlv(@vestripart) == 0)
+ {
+ mes "[Vestri]";
+ mes "Armor?!";
+ mes "Didn't I tell you that I only";
+ mes "work on Level 4 weapons?";
+ next;
+ mes "[Vestri]";
+ mes "You can have a human Blacksmith";
+ mes "work on that kind of stuff! Now,";
+ mes "a Dwarf like me needs something";
+ mes "that's more of a challenge!";
+ close2;
+ enable_items;
+ end;
+ }
+
+ mes "[Vestri]";
+ mes "Okay, let me give you the mandatory";
+ mes "warning. If your weapon happens";
+ mes "to be destroyed by chance during";
+ mes "the upgrade, you'll never see";
+ mes "the weapon again.";
+ next;
+ mes "[Vestri]";
+ mes "That also means that if the weapon";
+ mes "is destroyed, any ^FF0000Cards^000000";
+ mes "inserted into the weapon will also";
+ mes "be gone.";
+ next;
+ mes "[Vestri]";
+ mes "If you understand,";
+ mes "then let's get on with it!";
+ next;
+ menu "Sure, let's do it!",L_Go,"N-no, I changed my mind!",-;
+ mes "[Vestri]";
+ mes "Bah! How do you survive in this";
+ mes "world with that kind of cowardice?!";
+ next;
+ mes "[Vestri]";
+ mes "Oh, forget it.";
+ mes "I know you're just being careful.";
+ mes "Damn, I was just so eager to";
+ mes "get to work!";
+ close2;
+ enable_items;
+ end;
+
+ L_Go:
+ if(countitem(984) > 0) delitem 984,1;
+ else
+ {
+ mes "[Vestri]";
+ mes "Huh...";
+ mes "You forgot to";
+ mes "bring an Oridecon.";
+ mes "Hurry up and get one.";
+ close;
+ }
+
+ if (getequippercentrefinery(@vestripart) > rand(100))
+ {
+ mes "^3355FF*Clang Clang!*^000000";
+ successrefitem @vestripart;
+ next;
+ emotion e_no1;
+ mes "[Vestri]";
+ mes "Mwahahaha~";
+ mes "I've still got it!";
+ mes "So aren't you happy with an";
+ mes "even more powerful weapon?";
+ next;
+ }
+ else
+ {
+ mes "[Vestri]";
+ mes "^3355FF*Clang Clang!*^000000";
+ failedrefitem @vestripart;
+ next;
+ emotion e_omg;
+ mes "[Vestri]";
+ mes "Waaahhhhh!";
+ mes "Dear God, no!";
+ next;
+ mes "[Vestri]";
+ mes "I-It's alright!";
+ mes "Bad things happen sometimes.";
+ mes "Let's just think of it as both";
+ mes "of us having a bad day.";
+ mes "Yeah, not regrets!";
+ next;
+ }
+ set god_mjo_3,2;
+ enable_items;
+ mes "[Vestri]";
+ mes "Well, my friend,";
+ mes "if you ever visit my brothers,";
+ mes "please give them my regards.";
+ mes "Take care.";
+ close;
+ }
+ else if(god_mjo_3 == 0)
+ {
+ mes "[Vestri]";
+ mes "What do you want?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse2;
+ mes "[Vestri]";
+ mes "If you need anything, try to";
+ mes "get it on your own!";
+ mes "Nobody is responsible on you";
+ mes "but yourself!";
+ close;
+
+ L_Excuse2:
+ mes "[Vestri]";
+ mes "Hmm, I am not sure if there is things";
+ mes "that I can help you with.";
+ mes "As you see, I am a blacksmith.";
+ next;
+ mes "[Vestri]";
+ mes "I prefer upgrading weapns more than anything else!";
+ mes "Especially I like to upgrade a weapon that has been";
+ mes "forged many times already or a high level one.";
+ mes "Because they're challengeable!";
+ next;
+ mes "[Vestri]";
+ mes "Don't you like the idea of challenging to";
+ mes "a limit? To me, upgrading items makes me feel like";
+ mes "climbing the top of a mountain that has never been touched by dwarves!";
+ next;
+ mes "[Vestri]";
+ mes "Okay, I think we're meant to meet today.";
+ mes "For that, I am going to upgrade a weapon";
+ mes "with a free of charge";
+ mes "if you bring me a weapon and a forging material.";
+ mes "Isn't it a great offer?";
+ next;
+ set god_mjo_3,1;
+ mes "[Vestri]";
+ mes "But here's a condition.";
+ mes "You must bring me a level 4 weapon.";
+ mes "Just like I said, I want something to challenge.";
+ mes "Oh, don't forget an oridecon, too!";
+ close;
+ }
+ else
+ {
+ mes "[Vestri]";
+ mes "Zzzz Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 2)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Vestri]";
+ mes "I really hope I will meet a";
+ mes "decent human being next time";
+ mes "...so far there has never been";
+ mes "at least one human useful.";
+ close;
+ }
+ else if(god_mjo_2 == 2)
+ {
+ mes "[Vestri]";
+ mes "Prefect preparation does not";
+ mes "always result in success.";
+ mes "I am not sure how far you can go,";
+ mes "but put forth your strength anyway.";
+ close;
+ }
+ else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_3 != 0 || god_mjo_4 != 0)
+ {
+ mes "[Vestri]";
+ mes "What do you want?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse3;
+ mes "[Vestri]";
+ mes "If you need anything, try to";
+ mes "get it on your own!";
+ mes "Nobody is responsible on you";
+ mes "but yourself!";
+ close;
+
+ L_Excuse3:
+ set god_mjo_2,3;
+ mes "[Vestri]";
+ mes "You didn't listen to me and you don't even know who I am.";
+ mes "I am not excusing you!";
+ mes "You got a wrong dwarf here. Go back.";
+ mes "Ask to your human blacksmiths for item upgrade!";
+ close;
+ }
+ else if(god_mjo_2 == 1)
+ {
+ disable_items;
+ mes "[Vestri]";
+ mes "Great! Which one should I";
+ mes "upgrade first, huh?";
+ mes "My heart is throbbing with";
+ mes "excitement...";
+ next;
+ M_Menu2:
+ menu getequipname(1),PART11,getequipname(2),PART12,getequipname(3),PART13,getequipname(4),PART14,getequipname(5),PART15,
+ getequipname(6),PART16,getequipname(7),PART17,getequipname(8),PART18,getequipname(9),PART19,getequipname(10),PART20;
+
+ PART11:
+ set @vestripart,1;
+ if (getequipisequiped(1)) goto L_Check21;
+ goto M_Menu2;
+ PART12:
+ set @vestripart,2;
+ if (getequipisequiped(2)) goto L_Check21;
+ goto M_Menu2;
+
+ PART13:
+ set @vestripart,3;
+ if (getequipisequiped(3)) goto L_Check21;
+ goto M_Menu2;
+
+ PART14:
+ set @vestripart,4;
+ if (getequipisequiped(4)) goto L_Check21;
+ goto M_Menu2;
+ PART15:
+ set @vestripart,5;
+ if (getequipisequiped(5)) goto L_Check21;
+ goto M_Menu2;
+
+ PART16:
+ set @vestripart,6;
+ if (getequipisequiped(6)) goto L_Check21;
+ goto M_Menu2;
+
+ PART17:
+ set @vestripart,7;
+ if (getequipisequiped(7)) goto L_Check21;
+ goto M_Menu2;
+
+ PART18:
+ set @vestripart,8;
+ if (getequipisequiped(8)) goto L_Check21;
+ goto M_Menu2;
+
+ PART19:
+ set @vestripart,9;
+ if (getequipisequiped(9)) goto L_Check21;
+ goto M_Menu2;
+
+ PART20:
+ set @vestripart,10;
+ if (getequipisequiped(10)) goto L_Check21;
+ goto M_Menu2;
+
+ L_Check21:
+ if(getequipisenableref(@vestripart)) goto L_Check22;
+ mes "[Vestri]";
+ mes "What, this isn't upgradable!";
+ mes "What the hell do you want me";
+ mes "to do with this?";
+ close2;
+ enable_items;
+ end;
+
+ L_Check22:
+ if(getequipisidentify(@vestripart)) goto L_Check23;
+ mes "[Vestri]";
+ mes "You'd better identify this item";
+ mes "first. If we don't know what it";
+ mes "is, what's the point of upgrading it?";
+ close2;
+ enable_items;
+ end;
+
+ L_Check23:
+ if(getequiprefinerycnt(@vestripart) < 10) goto L_Check24;
+ mes "[Vestri]";
+ mes "Oh, this is excellent!";
+ mes "This piece here has been";
+ mes "perfectly refined!";
+ next;
+ mes "[Vestri]";
+ mes "But this isn't what I want.";
+ mes "I can't do any work on this at all.";
+ close2;
+ enable_items;
+ end;
+
+ L_Check24:
+ if (getequippercentrefinery(@vestripart) != 100) goto L_Check25;
+ mes "[Vestri]";
+ mes "This item isn't even a challenge";
+ mes "to upgrade. You can get humans";
+ mes "to do this kind of beginner's stuff.";
+ next;
+ mes "[Vestri]";
+ mes "Come on...";
+ mes "Bring me something that presents";
+ mes "an element of risk!";
+ close2;
+ enable_items;
+ end;
+
+ L_Check25:
+ if (getequipweaponlv(@vestripart) == 1 || getequipweaponlv(@vestripart) == 2 || getequipweaponlv(@vestripart) == 3)
+ {
+ mes "[Vestri]";
+ mes "Hey...";
+ mes "Don't insult me by expecting me";
+ mes "to work on anything less than";
+ mes "a Level 4 weapon.";
+ next;
+ mes "[Vestri]";
+ mes "Bring me a Level 4 weapon for";
+ mes "me to work on next time, got it?";
+ close2;
+ enable_items;
+ end;
+ }
+
+ if(getequipweaponlv(@vestripart) == 0)
+ {
+ mes "[Vestri]";
+ mes "Armor?!";
+ mes "Didn't I tell you that I only";
+ mes "work on Level 4 weapons?";
+ next;
+ mes "[Vestri]";
+ mes "You can have a human Blacksmith";
+ mes "work on that kind of stuff! Now,";
+ mes "a Dwarf like me needs something";
+ mes "that's more of a challenge!";
+ close2;
+ enable_items;
+ end;
+ }
+
+ mes "[Vestri]";
+ mes "Okay, let's check this before I start.";
+ mes "If your weapon happens to be destroyed while upgraded,";
+ mes "you will not see the weapon ever again. You know that, don't you?";
+ mes "That also applies to any item inserted to the weapon such as";
+ mes "^ff0000a monster card^000000!";
+ mes "^ff0000Your weapon will be just gone^000000, do you understand?";
+ mes "If you do, let's get it on!";
+ next;
+ menu "Sure, let's do it!",L_Go2,"...no, I am out.",-;
+ mes "[Vestri]";
+ mes "Bah, how are you gonna survive in this tough world";
+ mes "with that kind of timid attitude?";
+ mes "Yeah, yeah, yeah, forget it.";
+ mes "Forget it!";
+ close;
+ enable_items;
+ end;
+
+ L_Go2:
+ if(countitem(984) > 0) delitem 984,1;
+ else
+ {
+ mes "[Vestri]";
+ mes "Hmm, yeah you forgot to bring one thing...";
+ mes "That is an oridecon.";
+ mes "Now go bring it.";
+ close;
+ }
+
+ if (getequippercentrefinery(@vestripart) > rand(100))
+ {
+ mes "[Vestri]";
+ mes "Clang! Clang! Clang!";
+ successrefitem @vestripart;
+ next;
+ emotion e_no1;
+ mes "[Vestri]";
+ mes "Muhahaha, I am still good!";
+ mes "So, aren't you happy to have a more powerful weapon?";
+ next;
+ }
+ else
+ {
+ mes "[Vestri]";
+ mes "Clang! Clang! Clang!";
+ failedrefitem @vestripart;
+ next;
+ emotion e_omg;
+ mes "[Vestri]";
+ mes "Waaahhhhhhhhhhhhhh!";
+ next;
+ mes "[Vestri]";
+ mes "Umm, it's alright. Bad thing happens.";
+ mes "Let's think of it as we're having a bad day.";
+ mes "Yeah, I have no regrets!";
+ next;
+ }
+ set god_mjo_2,2;
+ enable_items;
+ mes "[Vestri]";
+ mes "This is it, my friend.";
+ mes "If you have a chance to meet my brothers,";
+ mes "please send my regard to them.";
+ mes "Take care.";
+ close;
+ }
+ else if(god_mjo_2 == 0)
+ {
+ mes "[Vestri]";
+ mes "What do you want?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse4;
+ mes "[Vestri]";
+ mes "If you need anything, try to get it on your own!";
+ mes "Nobody is responsible on you but yourself!";
+ close;
+
+ L_Excuse4:
+ mes "[Vestri]";
+ mes "Hmm, I am not sure if there is things";
+ mes "that I can help you with.";
+ mes "As you see, I am a blacksmith.";
+ next;
+ mes "[Vestri]";
+ mes "I prefer upgrading weapns more than anything else!";
+ mes "Especially I like to upgrade a weapon that has been";
+ mes "forged many times already or a high level one.";
+ mes "Because they're challengeable!";
+ next;
+ mes "[Vestri]";
+ mes "Don't you like the idea of challenging to";
+ mes "a limit? To me, upgrading items makes me feel like";
+ mes "climbing the top of a mountain that has never been touched by dwarves!";
+ next;
+ mes "[Vestri]";
+ mes "Okay, I think we're meant to meet today.";
+ mes "For that, I am going to upgrade a weapon";
+ mes "with a free of charge";
+ mes "if you bring me a weapon and a forging material.";
+ mes "Isn't it a great offer?";
+ next;
+ set god_mjo_2,1;
+ mes "[Vestri]";
+ mes "But here's a condition.";
+ mes "You must bring me a level 4 weapon.";
+ mes "Just like I said, I want something to challenge.";
+ mes "Oh, don't forget an oridecon, too!";
+ close;
+ }
+ else
+ {
+ mes "[Vestri]";
+ mes "Zzzz Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 0)
+ {
+ mes "[Vestri]";
+ mes "It's always a pleasure to engage";
+ mes "myself in hard work, especially";
+ mes "smithing.";
+ next;
+ mes "[Vestri]";
+ mes "Upgrading is always enjoyable!";
+ mes "I have no regrets when failure,";
+ mes "and I'm always pleased when I'm";
+ mes "successful. I'll upgrade everyday";
+ mes "o make the best of my life~";
+ close;
+ }
+ else
+ {
+ mes "[Vestri]";
+ mes "Zzzz Zzzz Zzzz...";
+ close;
+ }
+}
+
+}
+
+mjolnir_12.gat,18,18,7 script Dwarf Blacksmith#north 826,{
+
+ if ($God3 < 50)
+{
+ mes "[Nordri]";
+ mes "What, I don't have any Eluniums";
+ mes "or Oridecons!";
+ next;
+ mes "[Nordri]";
+ mes "Vestri took them all. ^333333*Sigh*^000000";
+ mes "Those were my treasures, you know...";
+ close;
+}
+ else
+{
+ if($God4 > 99)
+ {
+ mes "[Nordri]";
+ mes "What's happening?";
+ mes "I smell something different from";
+ mes "the wind...I cannot tell what it is.";
+ mes "Should I go into a cave to fiture it out...?";
+ mes "Hmmm....this is odd.";
+ close;
+ }
+ else if(god_mjo_0 == 11)
+ {
+ mes "[Nordri]";
+ mes "Hahahahah, even Gods know that we dwarves";
+ mes "are the most talented artisans among all the existing races.";
+ mes "Maybe we don't look that way for now,";
+ mes "one day we will start our business again.";
+ close;
+ }
+ else if(god_mjo_0 == 10)
+ {
+ mes "[Nordri]";
+ mes "What, I don't have any Eluniums";
+ mes "or Oridecons!";
+ mes "Vestri took all of them....";
+ mes "Do you understand?";
+ close;
+ }
+ else if(god_mjo_0 == 1)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Nordri]";
+ mes "La la la la~ La la la la~";
+ mes "It is happy to be in the Mjolnir forest~";
+ mes "I am surrounded by a peaceful and quiet air~ La la la~";
+ mes "I do not worry about anything~ La la la~";
+ close;
+ }
+ else if(god_mjo_4 == 2)
+ {
+ mes "[Nordri]";
+ mes "Aren't you supposed to be going back by now...? Heh,";
+ mes "Oh well, none of my business.";
+ mes "If you have some spare zeny, have some banana on the way...";
+ mes "Isn't a pumpkin the best taste though?";
+ close;
+ }
+ else if (god_mjo_1 == 0 || god_mjo_1 == 1 || god_mjo_2 == 0 || god_mjo_2 == 1 || god_mjo_3 == 0 || god_mjo_3 == 1)
+ {
+ mes "[Nordri]";
+ mes "What kind of business do";
+ mes "you have with me?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse;
+ mes "[Nordri]";
+ mes "You're funny, leave me alone.";
+ close;
+
+ L_Excuse:
+ set god_mjo_4,3;
+ mes "[Nordri]";
+ mes "What? I am sorry, I cannot hear";
+ mes "you at this moment.";
+ mes "I want to sing a song really loud!";
+ mes "La la la~ La la la~";
+ close;
+ }
+ else if(god_mjo_4 == 1)
+ {
+ if(countitem(501) > 0)
+ {
+ delitem 501,1;
+ mes "[Nordri]";
+ mes "Heheh, thank you. Since you gave me";
+ mes "your precious red potion, I shall";
+ mes "tell you an old story";
+ mes "in return. You will like it.";
+ next;
+ set @mjo_north,0;
+ L_NorthTalk:
+ switch(@mjo_north)
+ {
+ case 0:
+ mes "[Nordri]";
+ mes "A legend says that Thor went on an adventure to Utgard,";
+ mes "the land of giants.";
+ mes "He made a bet with the king of giants.";
+ next;
+ mes "[Nordri]";
+ mes "The first step of the bet was who ate more food than the other.";
+ mes "Thor ate all of meats on the table";
+ mes "Utgardaloki, the king ate not only meats but bones and plates as well.";
+ next;
+ mes "[Nordri]";
+ mes "The truth was Thor was hallucinated by a magic at the time,";
+ mes "so he couldn't realise that the king was not actually the king but a creature...";
+ mes "it was the thing which could eat up everything in the world...";
+ mes "I cannot remember what it was...do you?";
+ next;
+ menu "Greed",-,"Sea",-,"Blaze",L_Speak,"Hog",-;
+ goto L_Listen;
+
+ case 1:
+ mes "[Nordri]";
+ mes "Yes, I remember now, it was the 'Blaze'.";
+ mes "After that, there was another match which competed who ran faster than the other.";
+ mes "For the match, Thor let his servant Tialfi compte with";
+ mes "the king's servant Hugi.";
+ next;
+ mes "[Nordri]";
+ mes "However, no matter how many matches they did,";
+ mes "Hugi won everytime. Thor was once again hallucinated by a magic";
+ mes "so he could not realise Hugi was as a matter of fact";
+ mes "the....do you know what it truely was?";
+ next;
+ menu "Language",-,"Thoughts",L_Speak,"Wind",-,"Wolf",-;
+ goto L_Listen;
+
+ case 2:
+ mes "[Nordri]";
+ mes "Yes, you're right! It was the 'thoughts'!";
+ mes "That defiant giants gave an order to Thor to fight with his grand mother.";
+ mes "Thor was happy for that he would finally win this time by defeating";
+ mes "an old woman....but he could not.";
+ mes "No matter how hard he tried, he could not win over the old woman.";
+ next;
+ mes "[Nordri]";
+ mes "Thor was again hallucinated by a magic";
+ mes "so he could not realise the old woman was as a matter of fact";
+ mes "the....do you know what it truely was?";
+ next;
+ menu "Curse",-,"Earth",-,"Heart",-,"Age",L_Speak;
+ goto L_Listen;
+
+ case 3:
+ mes "[Nordri]";
+ mes "Yes, it was the 'age'! No one can stop their time!";
+ mes "After Thor was lost every match, the king told him";
+ mes "the truth about the betting. And Thor became furious.";
+ mes "But it was no use, because the king and other giants were all gone";
+ mes "by then....";
+ next;
+ mes "[Nordri]";
+ mes "There are two things that give us lessons.";
+ mes "First, don't believe things as you see.";
+ mes "Second, don't be so sure of your power,";
+ mes "there are men who are more powerful than you. So you shall do your best and be humble.";
+ mes "Do you understand?";
+ next;
+ mes "[Nordri]";
+ mes "Living properly will be the most important thing.";
+ mes "You cannot have everything what you want.";
+ mes "Besides, when you're obssessive about something,";
+ mes "you cannot think rationally about the thing.";
+ next;;
+ set god_mjo_4,2;
+ mes "[Nordri]";
+ mes "Thank you for listening to my long story.";
+ mes "If you meet anyone dreaming something that cannot be true,";
+ mes "please share this story with him.";
+ mes "The story about Thor that he fought against hallucination created by the giant king.";
+ close;
+
+ }
+ L_Listen:
+ mes "[Nordri]";
+ mes "...umm? I don't think that it was...hmm.";
+ mes "Let me think about it more.";
+ mes "Maybe I can remember it later....";
+ mes "shall we talk again with drinking a red potion?";
+ mes "Hahahahaha.";
+ close;
+ }
+ else
+ {
+ mes "[Nordri]";
+ mes "Woah, I am so thirsty. Didn't I ask you to give a red potion!?";
+ mes "I am not gonna tell you unless you bring me one.";
+ close;
+ }
+ }
+ else if(god_mjo_4 == 0)
+ {
+ mes "[Nordri]";
+ mes "What kind of business";
+ mes "do you have with me?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse2;
+ mes "[Nordri]";
+ mes "You're funny, leave me alone.";
+ close;
+
+ L_Excuse2:
+ mes "[Nordri]";
+ mes "This is odd. Recently, there have been too many";
+ mes "humans interested in dwarves.";
+ mes "Haha, of course, I am having a good time with them though.";
+ next;
+ set god_mjo_4,1;
+ mes "[Nordri]";
+ mes "I am kind of thirsty.";
+ mes "Bring me a red potion, would you?";
+ mes "If you do, I am gonna tell you an important story.";
+ mes "Heheheheh.";
+ close;
+ }
+ else
+ {
+ mes "[Nordri]";
+ mes "Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 2)
+ {
+ if (god_mjo_1 == 3 || god_mjo_2 == 3 || god_mjo_3 == 3 || god_mjo_4 == 3)
+ {
+ mes "[Nordri]";
+ mes "La la la la~ La la la la~";
+ mes "It is happy to be in the Mjolnir forest~";
+ mes "I am surrounded by a peaceful and quiet air~ La la la~";
+ mes "I do not worry about anything~ La la la~";
+ close;
+ }
+ else if(god_mjo_1 == 2)
+ {
+ mes "[Nordri]";
+ mes "Aren't you supposed to be going back by now...? Heh,";
+ mes "Oh well, none of my business.";
+ mes "If you have some spare zeny, have some banana on the way...";
+ mes "Isn't a pumpkin the best taste though?";
+ close;
+ }
+ else if (god_mjo_2 != 0 || god_mjo_3 != 0 || god_mjo_4 != 0)
+ {
+ mes "[Nordri]";
+ mes "What kind of business do you have with me?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse3;
+ mes "[Nordri]";
+ mes "You're funny, leave me alone.";
+ close;
+
+ L_Excuse3:
+ set god_mjo_1,3;
+ mes "[Nordri]";
+ mes "What? I am sorry, I cannot hear you at this moment.";
+ mes "I want to sing a song really loud!";
+ mes "La la la~ La la la~";
+ close;
+ }
+ else if(god_mjo_1 == 1)
+ {
+ if(countitem(501) > 0)
+ {
+ delitem 501,1;
+ mes "[Nordri]";
+ mes "Heheh, thank you. Since you gave me";
+ mes "your precious red potion, I shall tell you an old story";
+ mes "in return. You will like it.";
+ next;
+ set @mjo_north,0;
+ L_NorthTalk2:
+ switch(@mjo_north)
+ {
+ case 0:
+ mes "[Nordri]";
+ mes "A legend says that there was a brave and wise dwarf";
+ mes "named Alvis long time ago.";
+ mes "He possessed broad knowledge as a library";
+ mes "and was brave as Siegfried.";
+ next;
+ mes "[Nordri]";
+ mes "Unfortunately he was too ambitious.";
+ mes "He was in love with Thrud who was Thor's daughter at first sight.";
+ mes "So he proposed to Thor to marry with Thrud.";
+ mes "As you expected, Thor refused his proposal.";
+ mes "Alvis should have stopped there but he didn't.";
+ next;
+ mes "[Nordri]";
+ mes "So Thor asked him few questions to test him.";
+ mes "What was the first question....there was a question like this...";
+ mes "What was the name of the ground in a human's term?";
+ next;
+ menu "Ymir's body",-,"Earth",L_Speak2,"Lane",-,"Universe",-;
+ goto L_Listen2;
+
+ case 1:
+ mes "[Nordri]";
+ mes "Yes, it is the 'Earth'. So Thor gave him another question.";
+ mes "What is a giant's term for a round shell that covers the earth?";
+ next;
+ menu "Ymir's Head",-,"Sky",-,"Cloud Factory",-,"High House",L_Speak2;
+ goto L_Listen2;
+
+ case 2:
+ mes "[Nordri]";
+ mes "That's it, 'High House'...since they're so gigantic,";
+ mes "it might looked that way.";
+ mes "So Thor gave him another question.";
+ mes "What is the god's term for a ball that arise in the night?";
+ next;
+ menu "Circling Wheel",-,"Moon",-,"False Sun",L_Speak2,"Fast Stranger",-;
+ goto L_Listen2;
+
+ case 3:
+ mes "[Nordri]";
+ mes "Yes! Gods call the moon as the 'false sun'.";
+ mes "Alvis knew every answer but he was too defiant";
+ mes "so he didn't notice that the sun was arising.";
+ mes "So he was turned into a stone statue.";
+ next;
+ mes "[Nordri]";
+ mes "There are two things we can learn from this story.";
+ mes "First, do not desire something that cannot be true.";
+ mes "Secone, do not be so proud of yourself...";
+ mes "You cannot have everything in the world.";
+ next;
+ mes "[Nordri]";
+ mes "Living properly is the most important thing.";
+ mes "Even if you wish something to be yours,";
+ mes "that does not happen every time, you know.";
+ mes "Thread of fate is of course long, but it can be cut off any time.";
+ next;
+ set god_mjo_1,2;
+ mes "[Nordri]";
+ mes "Thank you for listening to my long story.";
+ mes "If you meet anyone dreaming something that cannot be true,";
+ mes "please share this story with him.";
+ mes "The story about Alvis who was a wise and";
+ mes "brave ma but who was too defiant at the same time.";
+ }
+ L_Listen2:
+ mes "[Nordri]";
+ mes "...umm? I don't think that it was...hmm.";
+ mes "Let me think about it more.";
+ mes "Maybe I can remember it later....";
+ mes "shall we talk again with drinking a red potion?";
+ mes "Hahahahaha.";
+ close;
+ }
+ else
+ {
+ mes "[Nordri]";
+ mes "Woah, I am so thirsty. Didn't I ask you to give a red potion!?";
+ mes "I am not gonna tell you unless you bring me one.";
+ close;
+ }
+ }
+ else if(god_mjo_1 == 0)
+ {
+ mes "[Nordri]";
+ mes "What kind of business do you have with me?";
+ next;
+ menu "Nothing.",-,"Excuse me.",L_Excuse4;
+ mes "[Nordri]";
+ mes "You're funny, leave me alone.";
+ close;
+
+ L_Excuse4:
+ mes "[Nordri]";
+ mes "This is odd. Recently, there have been too many";
+ mes "humans interested in dwarves.";
+ mes "Haha, of course, I am having a good time with them though.";
+ next;
+ set god_mjo_1,1;
+ mes "[Nordri]";
+ mes "I am kind of thirsty.";
+ mes "Bring me a red potion, would you?";
+ mes "If you do, I am gonna tell you an important story.";
+ mes "Heheheheh.";
+ close;
+ }
+ else
+ {
+ mes "[Nordri]";
+ mes "Zzzz Zzzz Zzzz...";
+ close;
+ }
+ }
+ else if(god_mjo_0 == 0)
+ {
+ mes "[Nordri]";
+ mes "I am Nordri the dwarf blacksmith.";
+ mes "I am in charge of the north part of mountain Mjolnir.";
+ mes "If you want to pass me, you must ask";
+ mes "an approval to me.";
+ next;
+ mes "[Nordri]";
+ mes "Calm down, it was a joke. Hahahahaha!";
+ close;
+ }
+ else
+ {
+ mes "[Nordri]";
+ mes "Zzzz Zzzz Zzzz...";
+ close;
+ }
+
+L_Speak:
+ set @mjo_north,@mjo_north +1;
+ goto L_NorthTalk;
+
+L_Speak2:
+ set @mjo_north,@mjo_north +1;
+ goto L_NorthTalk2;
+}
+
} \ No newline at end of file
diff --git a/npc/quests/seals/sleipnir_seal.txt b/npc/quests/seals/sleipnir_seal.txt
index f6052e2fb..788a41702 100644
--- a/npc/quests/seals/sleipnir_seal.txt
+++ b/npc/quests/seals/sleipnir_seal.txt
@@ -1,2295 +1,2295 @@
-//===== eAthena Script =======================================
-//= Sleipnir seal unlocking NPCs.
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena
-//===== Description: =========================================
-//= Quest for breaking the seal of Sleipnir.
-//===== Additional Comments: =================================
-// 1.0 First version. [MasterOfMuppets]
-//============================================================
-// Juno citizen Noyee
-yuno.gat,164,200,4 script Noyee#God 101,{
-
- if(BaseLevel < 70)
- {
- mes "[Noyee]";
- mes "Do you know that there are two different types of armor?";
- mes "There are general armors that you can purchase from NPC shops";
- next;
- mes "[Noyee]";
- mes "and ones that you can obtain by hunting monsters.";
- mes "The difference between the two is if they're slotted or not.";
- next;
- mes "[Noyee]";
- mes "Defence wise, both of them possess the same rate.";
- mes "However, since a slotted armor allows you to put 'a monster card' in the slot,";
- mes "it will enhance the armor with a different ability.";
- next;
- mes "[Noyee]";
- mes "At the same time, both of slotted armors or monster cards";
- mes "are very rare to obtain. Therefore, you seldom see";
- mes "those kinds in the market.";
- close;
- }
- if($God1 > 99)
- {
- mes "[Noyee]";
- mes "Do you know that there are two different types of armor?";
- mes "There are general armors that you can purchase from NPC shops";
- next;
- mes "[Noyee]";
- mes "and ones that you can obtain by hunting monsters.";
- mes "The difference between the two is if they're slotted or not.";
- next;
- mes "[Noyee]";
- mes "Defence wise, both of them possess the same rate.";
- mes "However, since a slotted armor allows you to put 'a monster card' in the slot,";
- mes "it will enhance the armor with a different ability.";
- next;
- mes "[Noyee]";
- mes "At the same time, both of slotted armors or monster cards";
- mes "are very rare to obtain. Therefore, you seldom see";
- mes "those kinds in the market.";
- close;
- }
- mes "[Noyee]";
- mes "Ah, I just remembered something.";
- mes "There is a very interesting place in ...";
- mes "It looks like a kind of laboratory but nobody knows";
- mes "what it is....";
- next;
- mes "[Noyee]";
- mes "Recently there have been many rumors going around";
- mes "the place...? I have no idea what people are talking about.";
- mes "Anyways, that place looks very interesting.";
- if(god_sl_1 == 0)set god_sl_1,1;
- close;
-
-}
-
-//Cukure Kirin
-que_god01.gat,98,98,4 script Manager#God 69,{
-
- set @NowWeight, MaxWeight - Weight;
- if (@NowWeight >= 5000) goto NOT_OW;
- mes "- Wait a minute! -";
- mes "- Currently you are overweight. -";
- mes "- Please lighten your weight -";
- mes "- and try again. -";
- close;
-
-NOT_OW:
- if(BaseLevel < 70)
- {
- mes "[Cukure]";
- mes "Awww...";
- mes "I get too busy nowadays.";
- mes "I don't even have times for a date.";
- mes "Damn it....";
- next;
- mes "[Cukure]";
- mes "Wait, when was the last time I went on a date...?";
- mes "Umm....";
- mes "Awww....I am so busy...busy!";
- emotion 19;
- close;
- }
-
- if($God1 < 100)
- {
- if(god_sl_1 == 0)
- {
- mes "[Cukure]";
- mes "Awww...";
- mes "I get too busy nowadays.";
- mes "I don't even have times for a date.";
- mes "Damn it....";
- next;
- mes "[Cukure]";
- mes "Wait, when was the last time I went on a date...?";
- mes "Umm....";
- mes "Awww....I am so busy...busy!";
- emotion 19;
- close;
- }
- else if(god_sl_1 == 1)
- {
- mes "[Cukure]";
- mes "We research signs of Gods that were left behind in this world long time ago.";
- mes "Specifically, we are studying tools that represent the power of God.";
- next;
- mes "[Cukure]";
- mes "...";
- mes "Recently many of members except leaders";
- mes "have retired due to their personal matters and whatsoever.";
- mes "So we are running out of manpower.";
- next;
- mes "[Cukure]";
- mes "Because of the problem, we have stopped";
- mes "the most of researches on the progress.";
- mes "Speaking of which...";
- next;
- mes "[Cukure]";
- mes "Do you mind if I ask you to help our research?";
- mes "I will reward you afterwards.";
- next;
- switch( select( "I am kind of busy...", "Sure, why not." ) )
- {
- case 1:
- mes "[Cukure]";
- mes "Oh...are you?";
- mes "I see.";
- mes "Then, would you like to recommend someone";
- mes "who can help us to continue researches?";
- next;
- mes "[Cukure]";
- mes "I am so sorry to ask you of this, but....";
- mes "we are that understaffed...I hope you will understand.";
- mes ".......";
- close;
- break;
-
- case 2:
- mes "[Cukure]";
- mes "?! Are you sure?";
- mes "Hahahahaha~";
- mes "I am so glad to hear that.";
- next;
- mes "[Cukure]";
- mes "There are investigators inside.";
- mes "They will need your help, please go visit them.";
- next;
- mes "[Cukure]";
- mes "Oh, wait...";
- mes "Let me give you a temporary admission pass.";
- mes "Thank you so much for your help.";
- next;
- mes "^ff0000You have received a temporary admission pass.^000000";
- set god_sl_1,2;
- close;
- break;
-
- }
-
- }
- else if(god_sl_1 < 10)
- {
- mes "[Cukure]";
- mes "It seems very difficult to manage a laboratory.";
- mes "Other laboratories always try to take our members away or to interrupt our business...";
- mes "So I donnot have a personal life because of my job...";
- mes ".......";
- next;
- mes "[Cukure]";
- mes "Ah...umm....";
- mes "Hahahaha...";
- mes "What am I doing with a visitor...";
- mes "Heh, please disregard what I said.";
- mes "Hahahahaha...";
- close;
- }
- else if(god_sl_1 < 50)
- {
- mes "[Cukure]";
- mes "Ah, thank you for your help so far.";
- mes "I hope you will continue to help us.";
- mes "Although our investigators are kind of strange";
- mes "they are all nice. I hope you will understand even if they treat you rudely.";
- close;
- }
- else if(god_sl_1 == 50)
- {
- mes "[Cukure]";
- mes "Ah...~";
- mes "You gave us a great help.";
- mes "Hahahaha...";
- mes "We would have a harder time if you didn't help us.";
- next;
- mes "[Cukure]";
- mes "As you have noticed already,";
- mes "we have researched 'Sleipnir'";
- mes "if we can reproduct this 'godly item' or not.";
- next;
- mes "[Cukure]";
- mes "However....";
- mes "so far, the result shows that it is almost impossible with";
- mes "the technology we have.";
- mes "Hmmm...";
- next;
- mes "[Cukure]";
- mes "Anyways, we will continue to research";
- mes "with a hope.";
- next;
- mes "[Cukure]";
- mes "With your help, we succeeded to complete the basic reserach.";
- mes "From now on, we will plan out further research";
- mes "based on the result we made this time.";
- next;
- mes "[Cukure]";
- mes "Oh, since you helped us, I am going to reward you.";
- mes "Please give me a minute...";
- next;
- mes "[Cukure]";
- mes "There it is.";
- mes "It might not be a great reward but";
- mes "I hope you will take it as a token of my gratitute.";
- mes "Have a good travel!";
- if($God1 < 100)set $God1,$God1+1;
-
- if($God1 == 50)
- announce "The first seal of [Sleipnir] has appeared.",bc_all;
- else if($God1 == 100)
- {
- if ($God1 == 100 && $God2 == 100 && $God3 == 100 && $God4 == 100)
- announce "Four seals have been released at the same time with the seal of [Sleipnir].",bc_all;
- else
- announce "The seal of [Sleipnir] has been released.",bc_all;
- }
-
- set god_sl_1,51;
- set @god_treasure,rand(1,900);
- set @god_treasure1,rand(1,1000);
-
- if(@god_treasure < 101)
- {
- if(@god_treasure1 < 210)
- getitem 2102,1;
- else if(@god_treasure1 < 420)
- getitem 2104,1;
- else if(@god_treasure1 < 630)
- getitem 2106,1;
- else if(@god_treasure1 < 840)
- getitem 2108,1;
- else
- getitem 2109,1;
- }
-
- else if(@god_treasure < 201)
- {
- if(@god_treasure1 < 48)
- getitem 2207,1;
- else if(@god_treasure1 < 96)
- getitem 2210,1;
- else if(@god_treasure1 < 150)
- getitem 2213,1;
- else if(@god_treasure1 < 190)
- getitem 2215,1;
- else if(@god_treasure1 < 238)
- getitem 2217,1;
- else if(@god_treasure1 < 290)
- getitem 2223,1;
- else if(@god_treasure1 < 340)
- getitem 2227,1;
- else if(@god_treasure1 < 348)
- getitem 2229,1;
- else if(@god_treasure1 < 400)
- getitem 2231,1;
- else if(@god_treasure1 < 448)
- getitem 2233,1;
- else if(@god_treasure1 < 496)
- getitem 2236,1;
- else if(@god_treasure1 < 544)
- getitem 2244,1;
- else if(@god_treasure1 < 592)
- getitem 2245,1;
- else if(@god_treasure1 < 640)
- getitem 2247,1;
- else if(@god_treasure1 < 688)
- getitem 2248,1;
- else if(@god_treasure1 < 736)
- getitem 2250,1;
- else if(@god_treasure1 < 784)
- getitem 2251,1;
- else if(@god_treasure1 < 832)
- getitem 2252,1;
- else if(@god_treasure1 < 880)
- getitem 2253,1;
- else if(@god_treasure1 < 940)
- getitem 2257,1;
- else
- getitem 2259,1;
- }
-
- else if(@god_treasure < 301)
- {
- if(@god_treasure1 < 160)
- getitem 2267,1;
- else if(@god_treasure1 < 320)
- getitem 2262,1;
- else if(@god_treasure1 < 480)
- getitem 2263,1;
- else if(@god_treasure1 < 540)
- getitem 2265,1;
- else if(@god_treasure1 < 700)
- getitem 2266,1;
- else if(@god_treasure1 < 800)
- getitem 2260,1;
- else if(@god_treasure1 < 900)
- getitem 2269,1;
- else
- getitem 2270,1;
- }
-
- else if(@god_treasure < 401)
- {
- if(@god_treasure1 < 70)
- getitem 2298,1;
- else if(@god_treasure1 < 140)
- getitem 2275,1;
- else if(@god_treasure1 < 210)
- getitem 2276,1;
- else if(@god_treasure1 < 280)
- getitem 2277,1;
- else if(@god_treasure1 < 350)
- getitem 2279,1;
- else if(@god_treasure1 < 420)
- getitem 2254,1;
- else if(@god_treasure1 < 490)
- getitem 2299,1;
- else if(@god_treasure1 < 560)
- getitem 2287,1;
- else if(@god_treasure1 < 630)
- getitem 2289,1;
- else if(@god_treasure1 < 700)
- getitem 2290,1;
- else if(@god_treasure1 < 770)
- getitem 2291,1;
- else if(@god_treasure1 < 840)
- getitem 2294,1;
- else if(@god_treasure1 < 900)
- getitem 2295,1;
- else if(@god_treasure1 < 950)
- getitem 2271,1;
- else
- getitem 2285,1;
- }
-
- else if(@god_treasure < 501)
- {
- if(@god_treasure1 < 80)
- getitem 2306,1;
- else if(@god_treasure1 < 160)
- getitem 2308,1;
- else if(@god_treasure1 < 240)
- getitem 2310,1;
- else if(@god_treasure1 < 320)
- getitem 2311,1;
- else if(@god_treasure1 < 400)
- getitem 2313,1;
- else if(@god_treasure1 < 480)
- getitem 2315,1;
- else if(@god_treasure1 < 560)
- getitem 2329,1;
- else if(@god_treasure1 < 630)
- getitem 2320,1;
- else if(@god_treasure1 < 700)
- getitem 2322,1;
- else if(@god_treasure1 < 760)
- getitem 2324,1;
- else if(@god_treasure1 < 810)
- getitem 2326,1;
- else if(@god_treasure1 < 850)
- getitem 2317,1;
- else if(@god_treasure1 < 900)
- getitem 2331,1;
- else if(@god_treasure1 < 950)
- getitem 2333,1;
- else
- getitem 2336,1;
- }
-
- else if(@god_treasure < 601)
- {
- if(@god_treasure1 < 200)
- getitem 2402,1;
- else if(@god_treasure1 < 400)
- getitem 2404,1;
- else if(@god_treasure1 < 600)
- getitem 2406,1;
- else if(@god_treasure1 < 800)
- getitem 2407,1;
- else
- getitem 2409,1;
- }
-
- else if(@god_treasure < 701)
- {
- if(@god_treasure1 < 300)
- getitem 2502,1;
- else if(@god_treasure1 < 550)
- getitem 2504,1;
- else if(@god_treasure1 < 750)
- getitem 2506,1;
- else
- getitem 2508,1;
- }
-
- else if(@god_treasure < 801)
- {
- if(@god_treasure1 < 110)
- getitem 2601,1;
- else if(@god_treasure1 < 220)
- getitem 2602,1;
- else if(@god_treasure1 < 330)
- getitem 2603,1;
- else if(@god_treasure1 < 440)
- getitem 2604,1;
- else if(@god_treasure1 < 550)
- getitem 2605,1;
- else if(@god_treasure1 < 660)
- getitem 2607,1;
- else if(@god_treasure1 < 770)
- getitem 2608,1;
- else if(@god_treasure1 < 880)
- getitem 2617,1;
- else
- getitem 2618,1;
- }
-
- else
- {
- if(@god_treasure1 < 150)
- getitem 2288,1;
- else if(@god_treasure1 < 260)
- getitem 2297,1;
- else if(@god_treasure1 < 370)
- getitem 5087,1;
- else if(@god_treasure1 < 480)
- getitem 5088,1;
- else if(@god_treasure1 < 590)
- getitem 5089,1;
- else if(@god_treasure1 < 700)
- getitem 5090,1;
- else if(@god_treasure1 < 810)
- getitem 5046,1;
- else if(@god_treasure1 < 920)
- getitem 2264,1;
- else
- getitem 2225,1;
- }
- //endif
- next;
- mes "[Cukure]";
- mes "Ah....also,";
- mes "let me retrieve the temporary pass given to you.";
- mes "Well...";
- close;
- }
- else
- {
- mes "[Cukure]";
- mes "With your help, we succeeded to complete the basic reserach.";
- mes "From now on, we will plan out further research";
- mes "based on the result we made this time.";
- mes "That means I can go on a date...hahaha...";
- close;
- }
- }
- else
- {
- if(god_sl_1 == 0)
- {
- mes "[Cukure]";
- mes "Awww...";
- mes "I get too busy nowadays.";
- mes "I don't even have times for a date.";
- mes "Damn it....";
- next;
- mes "[Cukure]";
- mes "next;, when was the last time I went on a date...?";
- mes "Umm....";
- mes "Awww....I am so busy...busy!";
- emotion 19;
- close;
- }
- else if(god_sl_1 < 51)
- {
- mes "[Cukure]";
- mes "Ah, you came back.";
- mes "I know you were going to help us...";
- mes "but someone already did the job and";
- mes "we successfully finished the research.";
- next;
- mes "[Cukure]";
- mes "Thank you anways though.";
- mes "I hope you will come help us for the next research.";
- close;
- }
- else
- {
- mes "[Cukure]";
- mes "We have succeeded to complete the basic reserach.";
- mes "From now on, we will plan out further research";
- mes "based on the result we made this time.";
- mes "That means I can go on a date...hahaha...";
- close;
- }
- }
-
-}
-
-// Hallandaute Lagunis - Wheel of the Unknown
-que_god01.gat,66,125,6 script Investigator#God1 89,{
-
- if($God2 < 100)
- {
- if(god_sl_1 == 2)set god_sl_1,11;
-
- if(god_sl_1 == 11 || god_sl_1 == 22 || god_sl_1 == 33 || god_sl_1 == 44)
- {
- if(god_sl_2 == 0)
- {
- mes "[Hallandaute]";
- mes "Ah...are you the one who Ms. Kirin was talking about?";
- mes "Yes, she said you are going to assist us for the research.";
- mes "Hmmm...";
- next;
- mes "[Hallandaute]";
- mes "Frankly, we donnot need people who are not specialised in this field";
- mes "even if we are running out of manpower.";
- mes "But you can support us through doing stuffs that we are too lazy to do";
- mes "on our own....if you don't mind.";
- next;
- mes "[Hallandaute]";
- mes "Oh well...";
- mes "What would be a good job for you....";
- mes "Let me think...";
- mes "Ah...";
- next;
- mes "[Hallandaute]";
- mes "I got it.";
- mes "Can you go visit ^ff0000Metto^000000 for me?";
- mes "Please bring me his news.";
- next;
- mes "[Hallandaute]";
- mes "Since he is working on a similar subject as mine,";
- mes "I guess that he might be able to help me.";
- mes "He's in Juno, you can easily find him.";
- set god_sl_2,1;
- close;
- }
- else if(god_sl_2 == 1)
- {
- if (metto_q == 0)
- {
- mes "[Hallandaute]";
- mes "I guess you haven't seen him yet.";
- mes "Although he is kind of fastidious, he is not a bad guy at all.";
- mes "We have been friends for a long time";
- mes "since we work in the similar field.";
- next;
- mes "[Hallandaute]";
- mes "I am wondering how he has been doing.";
- mes "You can just ask him about his research progress.";
- mes "Thank you for your trouble.";
- close;
- }
- else if(metto_q < 9)
- {
- mes "[Hallandaute]";
- mes "Hmmm....";
- mes "I see....";
- mes "Thank you for your trouble...";
- mes "Hmmm...it seems he changed...";
- mes "hmmm..";
- close;
- }
- else
- {
- mes "[Hallandaute]";
- mes "?!";
- mes "...........";
- mes "Oh well.....";
- mes "I have never expected that the situation would turn into this way.";
- mes "Ummm....";
- emotion 20; //ET_SCRATCH
- next;
- mes "[Hallandaute]";
- mes "Oh well, it happened already. Okay, thank you for the help.";
- mes "Please wait for a moment.";
- mes "I have something to think about.";
- mes "Ummmmm...";
- emotion 9; //ET_THINK
- set god_sl_2,2;
- close;
- }
- }
- else if(god_sl_2 == 2)
- {
- if(rand(1,10) == 7)
- {
- mes "[Hallandaute]";
- mes "Ah...";
- mes "You came back.";
- mes "...Let me give you the gist of research I am working on.";
- next;
- mes "[Hallandaute]";
- mes "I am working on";
- mes "'^ff0000a Wheel of the Unknown^000000' that was discovered to be a peace";
- mes "of '^ff0000Sleipnir^000000'.";
- mes "It looks like a normal cogwheel but";
- mes "I cannot figure out how it works.";
- next;
- mes "[Hallandaute]";
- mes "The most strange thing about this cogwheel is";
- mes "its material.";
- next;
- mes "[Hallandaute]";
- mes "It seems to be made out of steel but";
- mes "no matter how long I heated it up,";
- mes "it never responded to the heat.";
- mes "It worked the same when I tried to freeze it.";
- next;
- mes "[Hallandaute]";
- mes "Besides, it never responds to any kinds of impact either.";
- mes "No matter how hard it was crashed or dropped,";
- mes "it does not seem to be influenced.";
- next;
- mes "[Hallandaute]";
- mes "But I found out that this thing seems to be resonant with";
- mes "certain objects.";
- mes "Then again, it does not seem to work the same all the time.";
- next;
- mes "[Hallandaute]";
- mes "Let's say, it was resonant with an object 'A' but";
- mes "when I try again, it does not work at all with A.";
- mes "Surely, there should be some kind of conditions to satisfy";
- mes "in order to make it resonant...";
- mes "Hmm hmmm...";
- next;
- mes "[Hallandaute]";
- mes "Ah....";
- mes "I apologize for speaking things that are not important.";
- mes "Please disregard words I said.";
- mes "Thank you for your help anyways.";
- mes "Other investigators might need your help as well.";
- mes "Hmmm...";
- set god_sl_2,0;
- if(god_sl_1 == 11)
- set god_sl_1,12;
- if(god_sl_1 == 22)
- set god_sl_1,23;
- if(god_sl_1 == 33)
- set god_sl_1,34;
- if(god_sl_1 == 44)
- set god_sl_1,50;
- close;
- }
- else
- {
- mes "[Hallandaute]";
- mes "Oh, please give me a moment.";
- mes "I have something to organize.";
- mes "Ummm....";
- mes "Therefore...";
- mes "Mumble mumble...";
- close;
- }
- }
- else
- {
- mes "[Hallandaute]";
- mes "Hmmm...";
- mes "Therefore....";
- mes "It works this way...";
- mes "Umm....that is...";
- mes "Oh well, it would be better if it was in a good shape...";
- mes "Sigh...";
- close;
- }
- }
- else
- {
- mes "[Hallandaute]";
- mes "Ummm....";
- mes "So it will be......";
- mes "Bah! It is not easy to work on this by myself!";
- mes "It is always good to have an assistant.";
- next;
- mes "[Hallandaute]";
- mes "I can share the load of work with him.";
- mes "However, types of work affects on the types of assistant I need.";
- next;
- mes "[Hallandaute]";
- mes "For instance, if I am working on a project called 'A'";
- mes "I will need an assistant named 'G' who is specialised in the project.";
- mes "But if I am working on a project called 'B'";
- mes "I will need 'H' who is specialised in the project.";
- next;
- mes "[Hallandaute]";
- mes "Of course, there could be people who are good at everything.";
- mes "But since they are hard to find, we must choose right people for each project.";
- close;
- }
- }
- else
- {
- mes "[Hallandaute]";
- mes "Ummm....";
- mes "So it will be......";
- mes "Bah! It is not easy to work on this by myself!";
- mes "It is always good to have an assistant.";
- next;
- mes "[Hallandaute]";
- mes "I can share the load of work with him.";
- mes "However, types of work affects on the types of assistant I need.";
- next;
- mes "[Hallandaute]";
- mes "For instance, if I am working on a project called 'A'";
- mes "I will need an assistant named 'G' who is specialised in the project.";
- mes "But if I am working on a project called 'B'";
- mes "I will need 'H' who is specialised in the project.";
- next;
- mes "[Hallandaute]";
- mes "Of course, there could be people who are good at everything.";
- mes "But since they are hard to find, we must choose right people for each project.";
- close;
- }
-}
-
-//Aadin Keil - Feather of Angel Wing
-que_god01.gat,11,136,6 script Investigator#God2 742,{
-
- if($God1 < 100)
- {
- if(god_sl_1 == 2)set god_sl_1,21;
-
- if(god_sl_1 == 21 || god_sl_1 == 32 || god_sl_1 == 43 || god_sl_1 == 14)
- {
- if(god_sl_2 == 0)
- {
- mes "[Aadin]";
- mes "*yawn*~";
- mes "Umm?";
- mes "Hmmmm....";
- next;
- mes "[Aadin]";
- mes "Nice to meet you.";
- mes "I know you are the temporary assistant joined this time.";
- mes "That's great, I was having a hard time to do something on my own.";
- next;
- mes "[Aadin]";
- mes "Okay...";
- mes "Let me explain what I am doing at this moment.";
- mes "I am studying 'Feather of Angel Wing' which is";
- mes "revealed to be the material of 'Sleipnir'.";
- next;
- mes "[Aadin]";
- mes "Especially I am focusing on the behind story";
- mes "of this feather like how it became the material of 'Sleipnir'.";
- mes "I was told that there is a person in 'Payon'";
- mes "who knows about the story.";
- mes "So I tried to send a staff to the village in order to";
- mes "gather information from him....";
- next;
- mes "[Aadin]";
- mes "But the situation does not allow me to use any of manpower in the laboratory...";
- mes "so I have been debating myself if I should go there on my own or not.";
- mes "Because I don't feel safe to leave this studying room with this feather alone.";
- next;
- mes "[Aadin]";
- mes "Therefore...";
- mes "as you might guessed already....";
- mes "I would like to ask you to go talk to the person in Payon";
- mes "about the story and come back to me.";
- next;
- mes "[Aadin]";
- mes "I assume that it should not be that difficult to find the person.";
- mes "But you must memorize every single word from him.";
- mes "The result of research could be affected by words you delievered to me.";
- next;
- mes "[Aadin]";
- mes "Thank you in advance.";
- mes "There is no time limit for this, but faster will be better...";
- mes "Have a good travel!";
- set god_sl_2,1;
- close;
- }
- else if(god_sl_2 == 1)
- {
- mes "[Aadin]";
- mes "You have not gone to Payon yet.";
- mes "Please leave to Payon as soon as possible.";
- mes "Have a good travel!";
- close;
- }
- else if(god_sl_2 == 2)
- {
- mes "[Aadin]";
- mes "Ah, you came back.";
- mes "So, have you memorized the story?";
- mes "Yes, I know it would be really convenient";
- mes "if they kept the story as a book.";
- mes "But it seems that they have some kind of rules that do not allow them";
- mes "to write down the story but to tell people by word of mouth.";
- next;
- mes "[Aadin]";
- mes "Okay, I am ready to listen.";
- mes "Please go ahead.";
- mes ".......";
- next;
- mes "[Aadin]";
- mes ".";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- mes ".........";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- mes ".........";
- mes "..........";
- next;
- mes "[Aadin]";
- mes "Hmm......";
- mes "I see.";
- mes "Now I have a better understanding about it.";
- mes "Oh next;...";
- next;
- mes "[Aadin]";
- mes "It seems you missed some important part of the story!";
- mes "I am so sorry to tell you this but do you mind going back to Payon";
- mes "and listening the story again? I would like to listen to the story again.";
- set god_sl_2,3;
- close;
- }
- else if(god_sl_2 == 3)
- {
- mes "[Aadin]";
- mes "You haven't left to Payon yet.";
- mes "I hope you will leave as soon as possible.";
- mes "Even with the story you have brought, I think I can";
- mes "complete most part of the research.";
- close;
- }
- else if(god_sl_2 == 4)
- {
- mes "[Aadin]";
- mes "Oh, you came back.";
- mes "Okay, I am ready to listen.";
- mes "Please go ahead.";
- mes ".......";
- next;
- mes "[Aadin]";
- mes ".";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- mes ".........";
- next;
- mes "[Aadin]";
- mes ".";
- mes "..";
- mes "...";
- mes "....";
- mes ".....";
- mes "......";
- mes ".......";
- mes "........";
- mes ".........";
- mes "..........";
- next;
- mes "[Aadin]";
- mes "Hmm...I see.";
- mes "It seems your story is almost accurate as the original one.";
- mes "It is understandable that the story is differentiated by the person";
- mes "who is telling it since we share the story by word of mouth.";
- next;
- mes "[Aadin]";
- mes "Yes, most of my questions finally found their answers.";
- mes "At the same time, the story gave me new questions.";
- mes "Hmmm...this is not easy at all.";
- mes "Thank you for your help though.";
- set god_sl_2,0;
- if(god_sl_1 == 21)
- set god_sl_1,22;
- else if(god_sl_1 == 32)
- set god_sl_1,33;
- else if(god_sl_1 == 43)
- set god_sl_1,44;
- else if(god_sl_1 == 14)
- set god_sl_1,50;
- close;
- }
- }
- else
- {
- mes "[Aadin]";
- mes "Hmmm....";
- mes "Sometimes a legend or a myth";
- mes "tells two different stories within that are totally conflicting each other.";
- mes "You can find the reason by finding the origin of the stories.";
- close;
- }
- }
- else
- {
- mes "[Aadin]";
- mes "Hmmm....";
- mes "Sometimes a legend or a myth";
- mes "tells two different stories within that are totally conflicting each other.";
- mes "You can find the reason by finding the origin of the stories.";
- close;
- }
-
-}
-
-//Kurdt Jerremant - Spirit of Fish
-que_god01.gat,55,47,3 script Investigator#God3 803,{
-
- if ($God1 < 100)
- {
- if(god_sl_1 == 2)set god_sl_1,31;
-
- if(god_sl_1 == 31 || god_sl_1 == 42 || god_sl_1 == 13 || god_sl_1 == 24)
- {
- if(god_sl_2 == 0)
- {
- mes "[Kurdt]";
- mes "Ah, you must be the new assistant.";
- mes "I am pleased to meet you.";
- next;
- mes "[Kurdt]";
- mes "I was kind of expecting a professional assistant";
- mes "but it is understandable since the situation does not allow us.";
- mes "Also, sometimes ordinary people";
- mes "make a better result than professional assistants.";
- mes "So I hope we will make a good team together.";
- next;
- mes "[Kurdt]";
- mes "In fact, I am almost at the end of the research,";
- mes "therefore I do not need that much of help...";
- mes "However, the last thing I need to do is pretty difficult";
- mes "for one to do alone...I was thinking to hire an agency from outside.";
- next;
- mes "[Kurdt]";
- mes "But! I don't need to do that now, since you are here.";
- mes "What I need now are materials to reproduce";
- mes "'Spirit of Fish'.";
- next;
- mes "[Kurdt]";
- mes "I am not sure yet if I can actually reproduce it or not.";
- mes "But we can at least try it.";
- next;
- mes "[Kurdt]";
- mes "Basically, you can go ahead and gather stuffs like";
- mes "'Fish Scales' or 'Fish Tails'";
- mes "or anything that you can obtain from marine life.";
- mes "I donnot need too many but about 10 of them.";
- next;
- mes "[Kurdt]";
- mes "I hope you will not have a hard time to gather them.";
- mes "Thank you for your trouble and have a good travel!";
- set god_sl_2,1;
- close;
- }
- else if(god_sl_2 == 1)
- {
- mes "[Kurdt]";
- mes "Ah, you came back.";
- mes "Okay, let me check what you have brought to me.";
- mes "Hmmm....";
- mes ".........";
- next;
- mes "[Kurdt]";
- mes "Hmmm......";
- mes "I could use these...";
- mes "and these too.....";
- mes "aaand those too......";
- mes "Umm.....";
- set @itemcount,0;
- if(countitem(918) > 8)set @itemcount,1;
- if(countitem(950) > 8)set @itemcount,@itemcount + 1;
- if(countitem(951) > 8)set @itemcount,@itemcount + 1;
- if(countitem(956) > 8)set @itemcount,@itemcount + 1;
- if(countitem(959) > 8)set @itemcount,@itemcount + 1;
- if(countitem(960) > 8)set @itemcount,@itemcount + 1;
- if(countitem(961) > 8)set @itemcount,@itemcount + 1;
- if(countitem(962) > 8)set @itemcount,@itemcount + 1;
- if(countitem(963) > 8)set @itemcount,@itemcount + 1;
- if(countitem(964) > 8)set @itemcount,@itemcount + 1;
- if(countitem(965) > 8)set @itemcount,@itemcount + 1;
- if(countitem(966) > 8)set @itemcount,@itemcount + 1;
- if(countitem(7013) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1054) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1053) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1052) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1051) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1050) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1024) > 8)set @itemcount,@itemcount + 1;
- if(countitem(1023) > 8)set @itemcount,@itemcount + 1;
- next;
- if(@itemcount > 14)
- {
- mes "[Kurdt]";
- mes "Ah....!";
- mes "You gathered everything I need.";
- mes "Thank you so much.";
- mes "With these, I can continue my research with no problem.";
- next;
- mes "[Kurdt]";
- mes "I didn't expect you to do such a good job...";
- mes "you are great!";
- mes "Thank you so much!";
- mes "Hahaha....";
- mes "Just like me, other investigator might need you to help them.";
-
- if(countitem(918) > 8)delitem 918,9;
- if(countitem(950) > 8)delitem 950,9;
- if(countitem(951) > 8)delitem 951,9;
- if(countitem(956) > 8)delitem 956,9;
- if(countitem(959) > 8)delitem 959,9;
- if(countitem(960) > 8)delitem 960,9;
- if(countitem(961) > 8)delitem 961,9;
- if(countitem(962) > 8)delitem 962,9;
- if(countitem(963) > 8)delitem 963,9;
- if(countitem(964) > 8)delitem 964,9;
- if(countitem(965) > 8)delitem 965,9;
- if(countitem(966) > 8)delitem 966,9;
- if(countitem(7013) > 8)delitem 7013,9;
- if(countitem(1054) > 8)delitem 1054,9;
- if(countitem(1053) > 8)delitem 1053,9;
- if(countitem(1052) > 8)delitem 1052,9;
- if(countitem(1051) > 8)delitem 1051,9;
- if(countitem(1050) > 8)delitem 1050,9;
- if(countitem(1024) > 8)delitem 1024,9;
- if(countitem(1023) > 8)delitem 1023,9;
-
- set god_sl_2,0;
- if(god_sl_1 == 31)
- set god_sl_1,32;
- if(god_sl_1 == 42)
- set god_sl_1,43;
- if(god_sl_1 == 13)
- set god_sl_1,14;
- if(god_sl_1 == 24)
- set god_sl_1,50;
- close;
- }
- else
- {
- mes "[Kurdt]";
- mes "Errr.........";
- mes "It does not seem to be enough for the research.";
- mes "Sorry for the trouble, please go gather some more.";
- close;
- }
- }
- }
- else
- {
- mes "[Kurdt]";
- mes "Hmmm....";
- mes "Studying somthing does not only require";
- mes "funds and manpower but enthusiasm and passion as well.";
- next;
- mes "[Kurdt]";
- mes "Some financiers are so ignorant that they think";
- mes "study only takes money and manpower.";
- mes "However, even if they have enough funds and much of manpower";
- mes "but they donnot give any motivation to the people who study";
- mes "then the study cannot be succeeded.";
- close;
- }
- }
- else
- {
- mes "[Kurdt]";
- mes "Hmmm....";
- mes "Studying somthing does not only require";
- mes "funds and manpower but enthusiasm and passion as well.";
- next;
- mes "[Kurdt]";
- mes "Some financiers are so ignorant that they think";
- mes "study only takes money and manpower.";
- mes "However, even if they have enough funds and much of manpower";
- mes "but they donnot give any motivation to the people who study";
- mes "then the study cannot be succeeded.";
- close;
- }
-
-}
-
-//Pavel Stheinus Breath of Spirit
-que_god01.gat,14,47,3 script Investigator#God4 713,{
-
- if($God1 < 100)
- {
- if(god_sl_1 == 2)set god_sl_1,41;
-
- if(god_sl_1 == 41 || god_sl_1 == 12 || god_sl_1 == 23 || god_sl_1 == 34)
- {
- if(god_sl_2 == 0)
- {
- mes "[Pavel]";
- mes "*sniff sniff*...";
- mes "Achoo!";
- mes "Huh?";
- mes "Who are you....?";
- mes "....";
- next;
- mes "[Pavel]";
- mes "Ah, my apology.";
- mes "You must be the new assistant...Aaachoo!";
- mes "Hmm hmm *sniff sniff*...I am sorry, I am having a flu...";
- mes "*sniff sniff*...";
- mes "*sniff*...hmmm...";
- next;
- mes "[Pavel]";
- mes "Umm....";
- mes "It is good to know that you are here to help me....";
- mes "However...Aaaachooo!";
- mes "*sniff sniff*...";
- next;
- mes "[Pavel]";
- mes "Hmm...Aaachooo!";
- mes "Anyways, go look at...Aaachoo! that...Aaachoo!";
- mes "thing...*sniff sniff*~";
- set god_sl_2,1;
- close;
- }
- else if(god_sl_2 == 1)
- {
- mes "[Pavel]";
- mes "I told you to go look at Aaachhoooo! that...Aaachoooo! Achoo!";
- mes "*glhk glhk*...";
- mes "Hmm hmm..";
- close;
- }
- else if(god_sl_2 == 2)
- {
- mes "[Pavel]";
- mes "*cough cough*...";
- mes "*sniff sniff*...";
- mes "So did you go look at that?";
- mes "Yeah, I don't think you understand even if you saw it.";
- mes "*glhk glhk*...";
- next;
- mes "[Pavel]";
- mes "AAAAACHHHOOO!";
- mes "That slab of stone...no wait...Achoo!";
- mes "The letters engaraved on the indescribable thing";
- mes "are ancient....Achoo! ...language that are....Achoo!";
- mes "no longer used nowadays.";
- next;
- mes "[Pavel]";
- mes "I cannot ...*glhk glhk* tell what ancient";
- mes "language..Achoo! it is...Achoo!";
- mes "So...err...hmm hmm *sniff sniff*";
- next;
- mes "[Pavel]";
- mes "Considering...Achoo! *sniff sniff* the material";
- mes "Achoo! Achoo! used for the slab...*sniff sniff*,";
- mes "it is not an Achoo! Achoo! *sniff sniff*ordinary slab of stone...";
- mes "I guess...Aaaachoo!!!!! there must be some kind of";
- mes "device installed on *sniff sniff*...";
- next;
- mes "[Pavel]";
- mes "Aachoooo!! *sniff sniff* Not only that...*sniff sniff*";
- mes "letters are not just engraved...*sniff sniff* Achhoo!!";
- mes "but something Achooo!! covers...Achooo!";
- mes "AAACHHHOOOO~~ the surfaces...*sniff sniff*";
- next;
- mes "[Pavel]";
- mes "I must *cough cough* remove the device for...*cough cough*";
- mes "further research...*cough cough*...but look at me.";
- mes "I cannot even talk...*ghlk ghlk* clearly...";
- next;
- mes "[Pavel]";
- mes "Hmm *sniff sniff*...so I hope you don't";
- mes "mind Achoo!...helping me to remove Achoo!!...the device...";
- mes "Achoo! ~ Thank you....";
- mes "AAAACHHHOOOO~";
- set god_sl_2,3;
- close;
- }
- else if(god_sl_2 == 3)
- {
- mes "[Pavel]";
- mes "Aaaaa...Cccccchhhh...oooo..!";
- mes "*sniff sniff*...";
- mes "Err...what I meant was..AAACHHOOO!...";
- mes "*sniff sniff*...";
- close;
- }
- else if(god_sl_2 == 4)
- {
- mes "[Pavel]";
- mes "*cough*...";
- mes "......!!";
- mes "Oh...Acchhhoo!~";
- mes "Now I see...";
- mes "*sniff sniff*...";
- next;
- mes "[Pavel]";
- mes "I was~Achoo! right, Achoo!";
- mes "there was a device installed...Achoo! on it.";
- mes "I could...*cough cough* not...*sniff sniff*";
- mes "investigate...Achoo! the slab thoroughly...Achoo!";
- mes "because of this god damn flu making me sneeze.";
- next;
- mes "[Pavel]";
- mes "Achoo! Achoo! ~ thank you for your help....*sniff sniff*";
- mes "Haha....*ghlk ghlk*...you did a good job.";
- mes "*cough cough*..";
- set god_sl_2,0;
- if(god_sl_1 == 41)
- set god_sl_1,42;
- if(god_sl_1 == 12)
- set god_sl_1,13;
- if(god_sl_1 == 23)
- set god_sl_1,24;
- if(god_sl_1 == 34)
- set god_sl_1,50;
- close;
- }
- }
- else
- {
- mes "[Pavel]";
- mes "Umm....";
- mes "It is not that important whether or not";
- mes "we can embody a spirit into a shape.";
- mes "It is important whether we";
- mes "can prove the existance of spirit or not.";
- close;
- }
- }
- else
- {
- mes "[Pavel]";
- mes "Umm....";
- mes "It is not that important whether or not";
- mes "we can embody a spirit into a shape.";
- mes "It is important whether we";
- mes "can prove the existance of spirit or not.";
- close;
- }
-
-}
-
-que_god01.gat,20,48,0 script Slab#God 111,{
-
- if($God1 < 100)
- {
- if(god_sl_1 == 41 || god_sl_1 == 12 || god_sl_1 == 23 || god_sl_1 == 34)
- {
- if(god_sl_2 == 1 || god_sl_2 == 2)
- {
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
- set god_sl_2,2;
- next;
- mes "Unknown letters are engraved on the slab of stone.";
- mes "They look like an ancient language.";
- mes "The slab of stone has been severely damaged";
- mes "to recognize every letter.";
- mes "As you touched the surface, it was warm.";
- mes "Definately, the slab didn't seem to be made of an ordinary stone.";
- close;
- }
- else if(god_sl_2 == 3)
- {
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfn";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks.........fusjs tmld.........";
- next;
- mes "As you took a close look, you found strange traces on each letter.";
- mes "It seemed there was a kind of device installed on letters.";
- next;
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
- next;
- input @str$;
- if (@str$ == "dirdnl")
- {
- mes "Zap~";
- mes "As you pressed a word '^ff0000dirdnl^000000',";
- mes "the slab made a strange noise.";
- mes "However, there were no other changes other than the noise.";
- mes "You decided to touch other words.";
- next;
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
- next;
- }
- else
- {
- mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
- mes "You decided to think up something different.";
- close;
- }
- input @str$;
- if (@str$ == "tkaryf")
- {
- mes "Zap~";
- mes "As you pressed a word '^ff0000tkaryf^000000',";
- mes "the slab made a strange noise.";
- mes "However, there were no other changes other than the noise.";
- mes "You decided to touch other words.";
- next;
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
- next;
- }
- else
- {
- mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
- mes "You decided to think up something different.";
- close;
- }
- input @str$;
- if (@str$ == "ghswka")
- {
- mes "Zap~";
- mes "As you pressed a word '^ff0000ghswka^000000',";
- mes "the slab made a strange noise.";
- mes "However, there were no other changes other than the noise.";
- mes "You decided to touch other words.";
- next;
- mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
- next;
- }
- else
- {
- mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
- mes "You decided to think up something different.";
- close;
- }
- mes "Eeeeeeeeee~";
- mes "As you pressed the three words in order,";
- mes "the slab started vibrating with a strange noise.";
- mes "At the same time, the strange traces on letters slowly dissappeared";
- mes "and different letters appeared from underneath them.";
- next;
- mes "wkrdjswhgks dirdnlsjs wkrdjswhgks whdtnfh";
- mes "wkrdjswhgks dldgnsdjs wkrdjswhgks wkdusdnlrnlfn";
- mes "thfdh duTsjswhsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks tkatnfu";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkrdjswhgks dldgns";
- mes "ghswkagks tkatnfusjs tmldaldgks akrnl";
- next;
- mes "..........";
- mes "You still could not understand what those letters meant.";
- mes ".........";
- set god_sl_2,4;
- next;
- mes "After a while, those new letters dissappeared.";
- mes "It seemed that you could only cancel";
- mes "the device on the letters for a duration.";
- close;
- }
- else
- {
- mes "....whgks dirdnlsjs wkrdjswhgks whdtnfn";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "ghswkagks .........fusjs tmld.........";
- next;
- mes "The slab of stone has been severely damaged";
- mes "to recognize every letter.";
- mes "As you touched the surface, it was warm.";
- mes "Definately, the slab didn't seem to be made of an ordinary stone.";
- mes "You decided to not care about the stone any longer.";
- close;
- }
- }
- else
- {
- mes "....whgks dirdnlsjs wkrdjswhgks whdtnfn";
- mes "............djswhgks wkdusdnlrnlfn";
- mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
- mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks ......";
- mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
- mes "ghswkagks .........fusjs tmld.........";
- next;
- mes "The slab of stone has been severely damaged";
- mes "to recognize every letter.";
- mes "As you touched the surface, it was warm.";
- mes "Definately, the slab didn't seem to be made of an ordinary stone.";
- close;
- }
- }
- else
- {
- mes "You found a slab of stone with strange letters engraved on the surface.";
- mes "You could not identify what language it was.";
- close;
- }
-
-}
-
-//Lania Grunkurque
-payon.gat,79,171,4 script Friar#God5 95,{
-
- if($God1 < 100)
- {
- if(god_sl_1 == 21 || god_sl_1 == 32 || god_sl_1 == 43 || god_sl_1 == 14)
- {
- if(god_sl_2 == 1 || god_sl_2 == 3)
- {
- mes "[Lania]";
- mes "You can find good advice for yourself from folklores and legends.";
- mes "No matter how many years have passed and how improved people have,";
- mes "the basic of life will never change.";
- next;
- switch( select( "Umm.....", "I see." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "Well......";
- mes "You seem to have a business with me, may I ask?";
- mes "I will help you as much as I can.";
- next;
- mes "[Lania]";
- mes "It is no use to have a power to help others";
- mes "unless you use the power in a right purpose.";
- next;
-
- switch( select( "Nothing. Your words helped me already.","Regarding Sleipnir." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "I must misunderstood.";
- mes "However, feel free to ask me a help whenever you need it.";
- mes "It is also a training for me to help others.";
- mes "I hope you will be generous to others as well...";
- close;
- break;
-
- case 2:
- mes "[Lania]";
- mes "Umm.........";
- mes "I see.";
- mes "I think I can help you for that.";
- mes "Please give me some time to remember it....Sleipnir...";
- mes "Hmmm....";
- mes "..........";
- mes "...................";
- next;
- mes "[Lania]";
- mes "Ah.........";
- mes "I remember it now...";
- mes "Yes, Sleipnir was the name of Odin's stallion.";
- next;
- mes "[Lania]";
- mes "In the world of Gods, there were three legendary stallions.";
- mes "They were ^ff0000'Sleipnir (A thing that ride as sliding)'";
- mes "'Svadilfari (An unfortunate traveller)'";
- mes "'Gullfaxi (Golden Mane)'^000000.";
- next;
- mes "[Lania]";
- mes "Gullfaxi was owned by Hrungnir, the giant king and";
- mes "Svadilfari was owned by Hrimthurs.";
- mes "Also, 'Svadilfari' was the father of 'Sleipnir'.";
- next;
- mes "[Lania]";
- mes "Okay, now let's talk about how 'Sleipnir' was born.";
- mes "Well...we can see even Gods made mistakes";
- mes "through this story.";
- next;
- mes "[Lania]";
- mes "In Asgard the world of Gods,";
- mes "there was a huge rampart.";
- mes "Something happened and the rampart was destroyed.";
- mes "Since this castle wall was too huge, Gods could";
- mes "not dare to start mending it.";
- next;
- mes "[Lania]";
- mes "One day, a very skinny man rode a dark horse into Asgard.";
- mes "The man told Heimdall who was patrolling the wall";
- mes "that he had something to tell Odin regarding the rampart.";
- next;
- mes "[Lania]";
- mes "Since he was greatly concerned about the wall";
- mes "Heimdall didn't hesitate to report it to Odin.";
- mes "At the time, Odin was with other Gods in Valhala.";
- next;
- mes "[Lania]";
- mes "Man promised to Odin that he could";
- mes "build the rampart just like a new one";
- mes "in 18 months.";
- next;
- mes "[Lania]";
- mes "Although Odin felt something suspicious about the man,";
- mes "Gods needed to repair the wall as soon as possible.";
- mes "So, Odin asked him what he needed in return.";
- mes "He asked to give him the goddess 'Freya' and";
- mes "'the Sun and the Moon' as the payment.";
- next;
- mes "[Lania]";
- mes ".....";
- mes "Are you bored?";
- mes "If you are, let's talk about this later.";
- next;
- switch( select( "See you later.", "No, please go ahead." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "I understand that my story was not that interesting.";
- mes "I will try my best to satisfy you next time.";
- mes "Have a good travel.";
- close;
- break;
-
- case 2:
- mes "[Lania]";
- mes "Oh ok.";
- mes "Then let me continue the story.";
- next;
- break;
-
- }
-
- mes "[Lania]";
- mes "Gods were all stunned and became furious";
- mes "due to the man's request.";
- mes "He was asking everything that Gods have.";
- next;
- mes "[Lania]";
- mes "At this time, a God approached to Odin.";
- mes "It was the infamous Loki.";
- mes "Loki said to Odin that";
- mes "they could manipulate the man to repair";
- mes "the rampart without paying him anything in return.";
- next;
- mes "[Lania]";
- mes "Odin decided to follow Loki's suggestion.";
- mes "So Odin told the man that he must";
- mes "complete to repair the wall within 6 months";
- mes "not 18 months in order to have 'Freya' and 'the Sun and the Moon'.";
- next;
- mes "[Lania]";
- mes ".....";
- mes "Are you bored?";
- mes "If you are, let's talk about this later.";
- next;
- switch( select( "Let me organize the story first.", "See you later.", "No, please go ahead." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "Ah....";
- mes "The story must be too long.";
- mes "My apology...";
- mes "Okay, I will next; for you to finish organizing the story...";
- next;
- mes "......................";
- mes "..................";
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "..................";
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes ".........";
- mes "......";
- next;
- mes "......";
- next;
- mes "[Lania]";
- mes "May I continue the story now?";
- next;
- menu "Yes, please.",-;
- mes "[Lania]";
- mes "Okay, here it goes.";
- next;
- break;
-
- case 2:
- mes "[Lania]";
- mes "I understand that my story was not that interesting.";
- mes "I will try my best to satisfy you next time.";
- mes "Have a good travel.";
- close;
- break;
-
- case 3:
- mes "[Lania]";
- mes "Oh ok.";
- mes "Then let me continue the story.";
- next;
- break;
-
- }
-
- mes "[Lania]";
- mes "Then the man asked Odin to let him";
- mes "use his horse for the reconstruction work.";
- mes "Because the horse looked very base and contemptible,";
- mes "Odin didn't think twice about his request but accepted it on right the second.";
- next;
- mes "[Lania]";
- mes "However, the man and the horse started repairing";
- mes "the rampart in an amazing speed.";
- mes "His skill was great but the horse's skill was greater than its owner";
- mes "to mend the wall.";
- mes "It was the legendary horse, Svadilfari.";
- next;
- mes "[Lania]";
- mes "As more time went by, more anxious Gods were.";
- mes "Because both of the castle wall menders";
- mes "looked like they would complete the reconstruction work";
- mes "even before the 6 months passed.";
- mes "So Gods took their anger and axiouty on Loki";
- mes "for his silly suggestion.";
- next;
- mes "[Lania]";
- mes "However, Loki seemed confident.";
- mes "He assured Gods to count on him.";
- mes "Although Gods didn't trust Loki for his slyness and wickedness,";
- mes "they decided to give him a chance since";
- mes "the situation was desperate.";
- next;
- mes "[Lania]";
- mes "And a strange thing happened. Ever since Loki";
- mes "assurred Gods for the result, the progress of the reconstruction";
- mes "had stopped. Just like a magic.";
- next;
- mes "[Lania]";
- mes ".....";
- mes "Are you bored?";
- mes "If you are, let's talk about this later.";
- next;
- switch( select( "See you later.", "No, please go ahead." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "I understand that my story was not that interesting.";
- mes "I will try my best to satisfy you next time.";
- mes "Have a good travel.";
- close;
- break;
-
- case 2:
- mes "[Lania]";
- mes "Oh ok.";
- mes "Then let me continue the story.";
- next;
- break;
-
- }
-
- mes "[Lania]";
- mes "Gods became curious so they decided to investigate the reason.";
- mes "The found Svadilfari fell in love with a beautiful mare";
- mes "and didn't work on repairing the rampart.";
- mes "So when the 6 months passed, the man";
- mes "finished everything but the castle gate to repair.";
- next;
- mes "[Lania]";
- mes "Gods were so happy to tell the man";
- mes "that they could not accept his payment request";
- mes "since he could not keep the contract.";
- mes "Man got into rage and claimed";
- mes "that Gods tricked him in order to avoid giving him";
- mes "'Freya' and 'the Sun and the Moon'.";
- next;
- mes "[Lania]";
- mes "And he revealed his true identity.";
- mes "He was a giant from Jotunnheim.";
- mes "He was so angry and started committing an outrage.";
- next;
- mes "[Lania]";
- mes ".....";
- mes "Are you bored?";
- mes "If you are, let's talk about this later.";
- next;
- switch( select( "See you later.", "No, please go ahead." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "I understand that my story was not that interesting.";
- mes "I will try my best to satisfy you next time.";
- mes "Have a good travel.";
- close;
- break;
-
- case 2:
- mes "[Lania]";
- mes "Oh ok.";
- mes "Then let me continue the story.";
- next;
- break;
-
- }
-
- mes "[Lania]";
- mes "Later on, this giant turned out to be Hrimthurs.";
- mes "However, even if Hrimthurs was commiting an outrage";
- mes "Gods did not worry about him at all.";
- mes "Because they had Thor, the giant hunter.";
- next;
- mes "[Lania]";
- mes "As Thor hurled his legendary hammer 'Mjolnir'";
- mes "at Hrimthurs, the giant's head was bursted into fragments";
- mes "and he fell to the hell.";
- next;
- mes "[Lania]";
- mes ".....";
- mes "Are you bored?";
- mes "If you are, let's talk about this later.";
- next;
- switch( select( "Let me organize the story first.", "See you later.", "No, please go ahead." ) )
- {
-
- case 1:
- mes "[Lania]";
- mes "Ah....";
- mes "The story must be too complicated for you to understand.";
- mes "My apology...";
- mes "Okay, I will wait for you to finish organizing the story...";
- next;
- mes "......................";
- mes "..................";
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "..................";
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "...............";
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes "............";
- mes ".........";
- mes "......";
- next;
- mes ".........";
- mes "......";
- next;
- mes "......";
- next;
- mes "[Lania]";
- mes "May I continue the story now?";
- next;
- menu "Yes, please.",-;
- mes "[Lania]";
- mes "Okay, here it goes.";
- next;
- break;
-
- case 2:
- mes "[Lania]";
- mes "I understand that my story was not that interesting.";
- mes "I will try my best to satisfy you next time.";
- mes "Have a good travel.";
- close;
- break;
-
- case 3:
- mes "[Lania]";
- mes "Oh ok.";
- mes "Then let me continue the story.";
- next;
- break;
-
- }
- mes "[Lania]";
- mes "After a while, Loki who looked tattered and worn out";
- mes "brought a strange looking pony with eight leggs to Asgard.";
- mes "And Loki introduced the pony as 'Sleipnir' and";
- mes "presented it to Odin.";
- mes "Odin thankfully accepted Loki's present.";
- next;
- mes "[Lania]";
- mes "The fact was Loki transformed into the mare that";
- mes "attracted Svadilfari and eventually he was impregnated";
- mes "of the pony. That was the story of";
- mes "how 'Sleipnir' was born.";
- next;
- mes "[Lania]";
- mes "We, friars only hand down this story by word of mouth.";
- mes "Therefore, small details might be different from the other.";
- mes "However, the fundamental story line should not be different.";
- next;
- mes "[Lania]";
- mes "I have not been able to practice myself that well,";
- mes "I am not that confident if I told you the story as much as the original story.";
- mes "But I hope you will understand that I did my best.";
- mes "That was all I could help you.";
- next;
- mes "[Lania]";
- mes "If you wish to listen to the story again,";
- mes "you are always welcomed.";
- mes "Have a safe travel.";
- if(god_sl_2 == 1)
- set god_sl_2,2;
- else if(god_sl_2 == 3)
- set god_sl_2,4;
- close;
- break;
- }
- break;
-
- case 2:
- mes "[Lania]";
- mes "When you are in agony,";
- mes "please look back on your past.";
- mes "Just like legends or myths,";
- mes "yours is also a story of the past.";
- mes "You will find out a right solution from your past.";
- close;
- break;
- }
- }
- else
- {
- mes "[Lania]";
- mes "I told you everything I know.";
- mes "I hope it will be a help for you.";
- mes "Please be helpful for others...";
- close;
- }
- }
- else
- {
- mes "[Lania]";
- mes "............";
- mes "Training does not include only physical or mental practice.";
- mes "Leading a life and meeting people are also considered";
- mes "as a part of practice. Of course, everyone will have a different result.";
- close;
- }
- }
- else
- {
- mes "[Lania]";
- mes "............";
- mes "Training does not include only physical or mental practice.";
- mes "Leading a life and meeting people are also considered";
- mes "as a part of practice. Of course, everyone will have a different result.";
- close;
- }
-
-}
-
-// warp 0 -laboratory entrance
-que_god01.gat,84,95,0 script Switch#God0 111,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- close2;
- warp "que_god01.gat",60,88;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,84,92,0 script god_sl_w0 45,1,1,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",60,88;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-// ¿öÇÁ 1¹ø -Ç϶õµµÆ®
-que_god01.gat,49,97,0 script Switch#God1 111,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",62,119;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,46,97,0 script god_sl_w1 45,1,1,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",62,119;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-
-// ¿öÇÁ 2¹ø -¾Æµò
-que_god01.gat,19,97,0 script Switch#God2 111,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",12,119;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,16,97,0 script god_sl_w2 45,1,1,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",12,119;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,14,80,0 script Switch#God3 111,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01",12,52;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,17,80,0 script god_sl_w3 45,1,1,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",12,52;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-// ¿öÇÁ 4¹ø Äí¸£Æ®
-que_god01.gat,44,80,0 script Switch#God4 111,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",50,52;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
-
-que_god01.gat,47,80,0 script god_sl_w4 45,1,1,{
-
- if(god_sl_1 > 1 && god_sl_1 < 51)
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "As you put your temporary pass onto the detector,";
- mes "the door was open.";
- next;
- warp "que_god01.gat",50,52;
- end;
- }
- else
- {
- mes "The door was locked.";
- mes "You looked around and found out a detector";
- mes "at the right side of the door.";
- mes "It seemed you need to put something onto";
- mes "the detector in order to open the door.";
- close;
- }
-
-}
+//===== eAthena Script =======================================
+//= Sleipnir seal unlocking NPCs.
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena
+//===== Description: =========================================
+//= Quest for breaking the seal of Sleipnir.
+//===== Additional Comments: =================================
+// 1.0 First version. [MasterOfMuppets]
+//============================================================
+// Juno citizen Noyee
+yuno.gat,164,200,4 script Noyee#God 101,{
+
+ if(BaseLevel < 70)
+ {
+ mes "[Noyee]";
+ mes "Do you know that there are two different types of armor?";
+ mes "There are general armors that you can purchase from NPC shops";
+ next;
+ mes "[Noyee]";
+ mes "and ones that you can obtain by hunting monsters.";
+ mes "The difference between the two is if they're slotted or not.";
+ next;
+ mes "[Noyee]";
+ mes "Defence wise, both of them possess the same rate.";
+ mes "However, since a slotted armor allows you to put 'a monster card' in the slot,";
+ mes "it will enhance the armor with a different ability.";
+ next;
+ mes "[Noyee]";
+ mes "At the same time, both of slotted armors or monster cards";
+ mes "are very rare to obtain. Therefore, you seldom see";
+ mes "those kinds in the market.";
+ close;
+ }
+ if($God1 > 99)
+ {
+ mes "[Noyee]";
+ mes "Do you know that there are two different types of armor?";
+ mes "There are general armors that you can purchase from NPC shops";
+ next;
+ mes "[Noyee]";
+ mes "and ones that you can obtain by hunting monsters.";
+ mes "The difference between the two is if they're slotted or not.";
+ next;
+ mes "[Noyee]";
+ mes "Defence wise, both of them possess the same rate.";
+ mes "However, since a slotted armor allows you to put 'a monster card' in the slot,";
+ mes "it will enhance the armor with a different ability.";
+ next;
+ mes "[Noyee]";
+ mes "At the same time, both of slotted armors or monster cards";
+ mes "are very rare to obtain. Therefore, you seldom see";
+ mes "those kinds in the market.";
+ close;
+ }
+ mes "[Noyee]";
+ mes "Ah, I just remembered something.";
+ mes "There is a very interesting place in ...";
+ mes "It looks like a kind of laboratory but nobody knows";
+ mes "what it is....";
+ next;
+ mes "[Noyee]";
+ mes "Recently there have been many rumors going around";
+ mes "the place...? I have no idea what people are talking about.";
+ mes "Anyways, that place looks very interesting.";
+ if(god_sl_1 == 0)set god_sl_1,1;
+ close;
+
+}
+
+//Cukure Kirin
+que_god01.gat,98,98,4 script Manager#God 69,{
+
+ set @NowWeight, MaxWeight - Weight;
+ if (@NowWeight >= 5000) goto NOT_OW;
+ mes "- Wait a minute! -";
+ mes "- Currently you are overweight. -";
+ mes "- Please lighten your weight -";
+ mes "- and try again. -";
+ close;
+
+NOT_OW:
+ if(BaseLevel < 70)
+ {
+ mes "[Cukure]";
+ mes "Awww...";
+ mes "I get too busy nowadays.";
+ mes "I don't even have times for a date.";
+ mes "Damn it....";
+ next;
+ mes "[Cukure]";
+ mes "Wait, when was the last time I went on a date...?";
+ mes "Umm....";
+ mes "Awww....I am so busy...busy!";
+ emotion 19;
+ close;
+ }
+
+ if($God1 < 100)
+ {
+ if(god_sl_1 == 0)
+ {
+ mes "[Cukure]";
+ mes "Awww...";
+ mes "I get too busy nowadays.";
+ mes "I don't even have times for a date.";
+ mes "Damn it....";
+ next;
+ mes "[Cukure]";
+ mes "Wait, when was the last time I went on a date...?";
+ mes "Umm....";
+ mes "Awww....I am so busy...busy!";
+ emotion 19;
+ close;
+ }
+ else if(god_sl_1 == 1)
+ {
+ mes "[Cukure]";
+ mes "We research signs of Gods that were left behind in this world long time ago.";
+ mes "Specifically, we are studying tools that represent the power of God.";
+ next;
+ mes "[Cukure]";
+ mes "...";
+ mes "Recently many of members except leaders";
+ mes "have retired due to their personal matters and whatsoever.";
+ mes "So we are running out of manpower.";
+ next;
+ mes "[Cukure]";
+ mes "Because of the problem, we have stopped";
+ mes "the most of researches on the progress.";
+ mes "Speaking of which...";
+ next;
+ mes "[Cukure]";
+ mes "Do you mind if I ask you to help our research?";
+ mes "I will reward you afterwards.";
+ next;
+ switch( select( "I am kind of busy...", "Sure, why not." ) )
+ {
+ case 1:
+ mes "[Cukure]";
+ mes "Oh...are you?";
+ mes "I see.";
+ mes "Then, would you like to recommend someone";
+ mes "who can help us to continue researches?";
+ next;
+ mes "[Cukure]";
+ mes "I am so sorry to ask you of this, but....";
+ mes "we are that understaffed...I hope you will understand.";
+ mes ".......";
+ close;
+ break;
+
+ case 2:
+ mes "[Cukure]";
+ mes "?! Are you sure?";
+ mes "Hahahahaha~";
+ mes "I am so glad to hear that.";
+ next;
+ mes "[Cukure]";
+ mes "There are investigators inside.";
+ mes "They will need your help, please go visit them.";
+ next;
+ mes "[Cukure]";
+ mes "Oh, wait...";
+ mes "Let me give you a temporary admission pass.";
+ mes "Thank you so much for your help.";
+ next;
+ mes "^ff0000You have received a temporary admission pass.^000000";
+ set god_sl_1,2;
+ close;
+ break;
+
+ }
+
+ }
+ else if(god_sl_1 < 10)
+ {
+ mes "[Cukure]";
+ mes "It seems very difficult to manage a laboratory.";
+ mes "Other laboratories always try to take our members away or to interrupt our business...";
+ mes "So I donnot have a personal life because of my job...";
+ mes ".......";
+ next;
+ mes "[Cukure]";
+ mes "Ah...umm....";
+ mes "Hahahaha...";
+ mes "What am I doing with a visitor...";
+ mes "Heh, please disregard what I said.";
+ mes "Hahahahaha...";
+ close;
+ }
+ else if(god_sl_1 < 50)
+ {
+ mes "[Cukure]";
+ mes "Ah, thank you for your help so far.";
+ mes "I hope you will continue to help us.";
+ mes "Although our investigators are kind of strange";
+ mes "they are all nice. I hope you will understand even if they treat you rudely.";
+ close;
+ }
+ else if(god_sl_1 == 50)
+ {
+ mes "[Cukure]";
+ mes "Ah...~";
+ mes "You gave us a great help.";
+ mes "Hahahaha...";
+ mes "We would have a harder time if you didn't help us.";
+ next;
+ mes "[Cukure]";
+ mes "As you have noticed already,";
+ mes "we have researched 'Sleipnir'";
+ mes "if we can reproduct this 'godly item' or not.";
+ next;
+ mes "[Cukure]";
+ mes "However....";
+ mes "so far, the result shows that it is almost impossible with";
+ mes "the technology we have.";
+ mes "Hmmm...";
+ next;
+ mes "[Cukure]";
+ mes "Anyways, we will continue to research";
+ mes "with a hope.";
+ next;
+ mes "[Cukure]";
+ mes "With your help, we succeeded to complete the basic reserach.";
+ mes "From now on, we will plan out further research";
+ mes "based on the result we made this time.";
+ next;
+ mes "[Cukure]";
+ mes "Oh, since you helped us, I am going to reward you.";
+ mes "Please give me a minute...";
+ next;
+ mes "[Cukure]";
+ mes "There it is.";
+ mes "It might not be a great reward but";
+ mes "I hope you will take it as a token of my gratitute.";
+ mes "Have a good travel!";
+ if($God1 < 100)set $God1,$God1+1;
+
+ if($God1 == 50)
+ announce "The first seal of [Sleipnir] has appeared.",bc_all;
+ else if($God1 == 100)
+ {
+ if ($God1 == 100 && $God2 == 100 && $God3 == 100 && $God4 == 100)
+ announce "Four seals have been released at the same time with the seal of [Sleipnir].",bc_all;
+ else
+ announce "The seal of [Sleipnir] has been released.",bc_all;
+ }
+
+ set god_sl_1,51;
+ set @god_treasure,rand(1,900);
+ set @god_treasure1,rand(1,1000);
+
+ if(@god_treasure < 101)
+ {
+ if(@god_treasure1 < 210)
+ getitem 2102,1;
+ else if(@god_treasure1 < 420)
+ getitem 2104,1;
+ else if(@god_treasure1 < 630)
+ getitem 2106,1;
+ else if(@god_treasure1 < 840)
+ getitem 2108,1;
+ else
+ getitem 2109,1;
+ }
+
+ else if(@god_treasure < 201)
+ {
+ if(@god_treasure1 < 48)
+ getitem 2207,1;
+ else if(@god_treasure1 < 96)
+ getitem 2210,1;
+ else if(@god_treasure1 < 150)
+ getitem 2213,1;
+ else if(@god_treasure1 < 190)
+ getitem 2215,1;
+ else if(@god_treasure1 < 238)
+ getitem 2217,1;
+ else if(@god_treasure1 < 290)
+ getitem 2223,1;
+ else if(@god_treasure1 < 340)
+ getitem 2227,1;
+ else if(@god_treasure1 < 348)
+ getitem 2229,1;
+ else if(@god_treasure1 < 400)
+ getitem 2231,1;
+ else if(@god_treasure1 < 448)
+ getitem 2233,1;
+ else if(@god_treasure1 < 496)
+ getitem 2236,1;
+ else if(@god_treasure1 < 544)
+ getitem 2244,1;
+ else if(@god_treasure1 < 592)
+ getitem 2245,1;
+ else if(@god_treasure1 < 640)
+ getitem 2247,1;
+ else if(@god_treasure1 < 688)
+ getitem 2248,1;
+ else if(@god_treasure1 < 736)
+ getitem 2250,1;
+ else if(@god_treasure1 < 784)
+ getitem 2251,1;
+ else if(@god_treasure1 < 832)
+ getitem 2252,1;
+ else if(@god_treasure1 < 880)
+ getitem 2253,1;
+ else if(@god_treasure1 < 940)
+ getitem 2257,1;
+ else
+ getitem 2259,1;
+ }
+
+ else if(@god_treasure < 301)
+ {
+ if(@god_treasure1 < 160)
+ getitem 2267,1;
+ else if(@god_treasure1 < 320)
+ getitem 2262,1;
+ else if(@god_treasure1 < 480)
+ getitem 2263,1;
+ else if(@god_treasure1 < 540)
+ getitem 2265,1;
+ else if(@god_treasure1 < 700)
+ getitem 2266,1;
+ else if(@god_treasure1 < 800)
+ getitem 2260,1;
+ else if(@god_treasure1 < 900)
+ getitem 2269,1;
+ else
+ getitem 2270,1;
+ }
+
+ else if(@god_treasure < 401)
+ {
+ if(@god_treasure1 < 70)
+ getitem 2298,1;
+ else if(@god_treasure1 < 140)
+ getitem 2275,1;
+ else if(@god_treasure1 < 210)
+ getitem 2276,1;
+ else if(@god_treasure1 < 280)
+ getitem 2277,1;
+ else if(@god_treasure1 < 350)
+ getitem 2279,1;
+ else if(@god_treasure1 < 420)
+ getitem 2254,1;
+ else if(@god_treasure1 < 490)
+ getitem 2299,1;
+ else if(@god_treasure1 < 560)
+ getitem 2287,1;
+ else if(@god_treasure1 < 630)
+ getitem 2289,1;
+ else if(@god_treasure1 < 700)
+ getitem 2290,1;
+ else if(@god_treasure1 < 770)
+ getitem 2291,1;
+ else if(@god_treasure1 < 840)
+ getitem 2294,1;
+ else if(@god_treasure1 < 900)
+ getitem 2295,1;
+ else if(@god_treasure1 < 950)
+ getitem 2271,1;
+ else
+ getitem 2285,1;
+ }
+
+ else if(@god_treasure < 501)
+ {
+ if(@god_treasure1 < 80)
+ getitem 2306,1;
+ else if(@god_treasure1 < 160)
+ getitem 2308,1;
+ else if(@god_treasure1 < 240)
+ getitem 2310,1;
+ else if(@god_treasure1 < 320)
+ getitem 2311,1;
+ else if(@god_treasure1 < 400)
+ getitem 2313,1;
+ else if(@god_treasure1 < 480)
+ getitem 2315,1;
+ else if(@god_treasure1 < 560)
+ getitem 2329,1;
+ else if(@god_treasure1 < 630)
+ getitem 2320,1;
+ else if(@god_treasure1 < 700)
+ getitem 2322,1;
+ else if(@god_treasure1 < 760)
+ getitem 2324,1;
+ else if(@god_treasure1 < 810)
+ getitem 2326,1;
+ else if(@god_treasure1 < 850)
+ getitem 2317,1;
+ else if(@god_treasure1 < 900)
+ getitem 2331,1;
+ else if(@god_treasure1 < 950)
+ getitem 2333,1;
+ else
+ getitem 2336,1;
+ }
+
+ else if(@god_treasure < 601)
+ {
+ if(@god_treasure1 < 200)
+ getitem 2402,1;
+ else if(@god_treasure1 < 400)
+ getitem 2404,1;
+ else if(@god_treasure1 < 600)
+ getitem 2406,1;
+ else if(@god_treasure1 < 800)
+ getitem 2407,1;
+ else
+ getitem 2409,1;
+ }
+
+ else if(@god_treasure < 701)
+ {
+ if(@god_treasure1 < 300)
+ getitem 2502,1;
+ else if(@god_treasure1 < 550)
+ getitem 2504,1;
+ else if(@god_treasure1 < 750)
+ getitem 2506,1;
+ else
+ getitem 2508,1;
+ }
+
+ else if(@god_treasure < 801)
+ {
+ if(@god_treasure1 < 110)
+ getitem 2601,1;
+ else if(@god_treasure1 < 220)
+ getitem 2602,1;
+ else if(@god_treasure1 < 330)
+ getitem 2603,1;
+ else if(@god_treasure1 < 440)
+ getitem 2604,1;
+ else if(@god_treasure1 < 550)
+ getitem 2605,1;
+ else if(@god_treasure1 < 660)
+ getitem 2607,1;
+ else if(@god_treasure1 < 770)
+ getitem 2608,1;
+ else if(@god_treasure1 < 880)
+ getitem 2617,1;
+ else
+ getitem 2618,1;
+ }
+
+ else
+ {
+ if(@god_treasure1 < 150)
+ getitem 2288,1;
+ else if(@god_treasure1 < 260)
+ getitem 2297,1;
+ else if(@god_treasure1 < 370)
+ getitem 5087,1;
+ else if(@god_treasure1 < 480)
+ getitem 5088,1;
+ else if(@god_treasure1 < 590)
+ getitem 5089,1;
+ else if(@god_treasure1 < 700)
+ getitem 5090,1;
+ else if(@god_treasure1 < 810)
+ getitem 5046,1;
+ else if(@god_treasure1 < 920)
+ getitem 2264,1;
+ else
+ getitem 2225,1;
+ }
+ //endif
+ next;
+ mes "[Cukure]";
+ mes "Ah....also,";
+ mes "let me retrieve the temporary pass given to you.";
+ mes "Well...";
+ close;
+ }
+ else
+ {
+ mes "[Cukure]";
+ mes "With your help, we succeeded to complete the basic reserach.";
+ mes "From now on, we will plan out further research";
+ mes "based on the result we made this time.";
+ mes "That means I can go on a date...hahaha...";
+ close;
+ }
+ }
+ else
+ {
+ if(god_sl_1 == 0)
+ {
+ mes "[Cukure]";
+ mes "Awww...";
+ mes "I get too busy nowadays.";
+ mes "I don't even have times for a date.";
+ mes "Damn it....";
+ next;
+ mes "[Cukure]";
+ mes "next;, when was the last time I went on a date...?";
+ mes "Umm....";
+ mes "Awww....I am so busy...busy!";
+ emotion 19;
+ close;
+ }
+ else if(god_sl_1 < 51)
+ {
+ mes "[Cukure]";
+ mes "Ah, you came back.";
+ mes "I know you were going to help us...";
+ mes "but someone already did the job and";
+ mes "we successfully finished the research.";
+ next;
+ mes "[Cukure]";
+ mes "Thank you anways though.";
+ mes "I hope you will come help us for the next research.";
+ close;
+ }
+ else
+ {
+ mes "[Cukure]";
+ mes "We have succeeded to complete the basic reserach.";
+ mes "From now on, we will plan out further research";
+ mes "based on the result we made this time.";
+ mes "That means I can go on a date...hahaha...";
+ close;
+ }
+ }
+
+}
+
+// Hallandaute Lagunis - Wheel of the Unknown
+que_god01.gat,66,125,6 script Investigator#God1 89,{
+
+ if($God2 < 100)
+ {
+ if(god_sl_1 == 2)set god_sl_1,11;
+
+ if(god_sl_1 == 11 || god_sl_1 == 22 || god_sl_1 == 33 || god_sl_1 == 44)
+ {
+ if(god_sl_2 == 0)
+ {
+ mes "[Hallandaute]";
+ mes "Ah...are you the one who Ms. Kirin was talking about?";
+ mes "Yes, she said you are going to assist us for the research.";
+ mes "Hmmm...";
+ next;
+ mes "[Hallandaute]";
+ mes "Frankly, we donnot need people who are not specialised in this field";
+ mes "even if we are running out of manpower.";
+ mes "But you can support us through doing stuffs that we are too lazy to do";
+ mes "on our own....if you don't mind.";
+ next;
+ mes "[Hallandaute]";
+ mes "Oh well...";
+ mes "What would be a good job for you....";
+ mes "Let me think...";
+ mes "Ah...";
+ next;
+ mes "[Hallandaute]";
+ mes "I got it.";
+ mes "Can you go visit ^ff0000Metto^000000 for me?";
+ mes "Please bring me his news.";
+ next;
+ mes "[Hallandaute]";
+ mes "Since he is working on a similar subject as mine,";
+ mes "I guess that he might be able to help me.";
+ mes "He's in Juno, you can easily find him.";
+ set god_sl_2,1;
+ close;
+ }
+ else if(god_sl_2 == 1)
+ {
+ if (metto_q == 0)
+ {
+ mes "[Hallandaute]";
+ mes "I guess you haven't seen him yet.";
+ mes "Although he is kind of fastidious, he is not a bad guy at all.";
+ mes "We have been friends for a long time";
+ mes "since we work in the similar field.";
+ next;
+ mes "[Hallandaute]";
+ mes "I am wondering how he has been doing.";
+ mes "You can just ask him about his research progress.";
+ mes "Thank you for your trouble.";
+ close;
+ }
+ else if(metto_q < 9)
+ {
+ mes "[Hallandaute]";
+ mes "Hmmm....";
+ mes "I see....";
+ mes "Thank you for your trouble...";
+ mes "Hmmm...it seems he changed...";
+ mes "hmmm..";
+ close;
+ }
+ else
+ {
+ mes "[Hallandaute]";
+ mes "?!";
+ mes "...........";
+ mes "Oh well.....";
+ mes "I have never expected that the situation would turn into this way.";
+ mes "Ummm....";
+ emotion 20; //ET_SCRATCH
+ next;
+ mes "[Hallandaute]";
+ mes "Oh well, it happened already. Okay, thank you for the help.";
+ mes "Please wait for a moment.";
+ mes "I have something to think about.";
+ mes "Ummmmm...";
+ emotion 9; //ET_THINK
+ set god_sl_2,2;
+ close;
+ }
+ }
+ else if(god_sl_2 == 2)
+ {
+ if(rand(1,10) == 7)
+ {
+ mes "[Hallandaute]";
+ mes "Ah...";
+ mes "You came back.";
+ mes "...Let me give you the gist of research I am working on.";
+ next;
+ mes "[Hallandaute]";
+ mes "I am working on";
+ mes "'^ff0000a Wheel of the Unknown^000000' that was discovered to be a peace";
+ mes "of '^ff0000Sleipnir^000000'.";
+ mes "It looks like a normal cogwheel but";
+ mes "I cannot figure out how it works.";
+ next;
+ mes "[Hallandaute]";
+ mes "The most strange thing about this cogwheel is";
+ mes "its material.";
+ next;
+ mes "[Hallandaute]";
+ mes "It seems to be made out of steel but";
+ mes "no matter how long I heated it up,";
+ mes "it never responded to the heat.";
+ mes "It worked the same when I tried to freeze it.";
+ next;
+ mes "[Hallandaute]";
+ mes "Besides, it never responds to any kinds of impact either.";
+ mes "No matter how hard it was crashed or dropped,";
+ mes "it does not seem to be influenced.";
+ next;
+ mes "[Hallandaute]";
+ mes "But I found out that this thing seems to be resonant with";
+ mes "certain objects.";
+ mes "Then again, it does not seem to work the same all the time.";
+ next;
+ mes "[Hallandaute]";
+ mes "Let's say, it was resonant with an object 'A' but";
+ mes "when I try again, it does not work at all with A.";
+ mes "Surely, there should be some kind of conditions to satisfy";
+ mes "in order to make it resonant...";
+ mes "Hmm hmmm...";
+ next;
+ mes "[Hallandaute]";
+ mes "Ah....";
+ mes "I apologize for speaking things that are not important.";
+ mes "Please disregard words I said.";
+ mes "Thank you for your help anyways.";
+ mes "Other investigators might need your help as well.";
+ mes "Hmmm...";
+ set god_sl_2,0;
+ if(god_sl_1 == 11)
+ set god_sl_1,12;
+ if(god_sl_1 == 22)
+ set god_sl_1,23;
+ if(god_sl_1 == 33)
+ set god_sl_1,34;
+ if(god_sl_1 == 44)
+ set god_sl_1,50;
+ close;
+ }
+ else
+ {
+ mes "[Hallandaute]";
+ mes "Oh, please give me a moment.";
+ mes "I have something to organize.";
+ mes "Ummm....";
+ mes "Therefore...";
+ mes "Mumble mumble...";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Hallandaute]";
+ mes "Hmmm...";
+ mes "Therefore....";
+ mes "It works this way...";
+ mes "Umm....that is...";
+ mes "Oh well, it would be better if it was in a good shape...";
+ mes "Sigh...";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Hallandaute]";
+ mes "Ummm....";
+ mes "So it will be......";
+ mes "Bah! It is not easy to work on this by myself!";
+ mes "It is always good to have an assistant.";
+ next;
+ mes "[Hallandaute]";
+ mes "I can share the load of work with him.";
+ mes "However, types of work affects on the types of assistant I need.";
+ next;
+ mes "[Hallandaute]";
+ mes "For instance, if I am working on a project called 'A'";
+ mes "I will need an assistant named 'G' who is specialised in the project.";
+ mes "But if I am working on a project called 'B'";
+ mes "I will need 'H' who is specialised in the project.";
+ next;
+ mes "[Hallandaute]";
+ mes "Of course, there could be people who are good at everything.";
+ mes "But since they are hard to find, we must choose right people for each project.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Hallandaute]";
+ mes "Ummm....";
+ mes "So it will be......";
+ mes "Bah! It is not easy to work on this by myself!";
+ mes "It is always good to have an assistant.";
+ next;
+ mes "[Hallandaute]";
+ mes "I can share the load of work with him.";
+ mes "However, types of work affects on the types of assistant I need.";
+ next;
+ mes "[Hallandaute]";
+ mes "For instance, if I am working on a project called 'A'";
+ mes "I will need an assistant named 'G' who is specialised in the project.";
+ mes "But if I am working on a project called 'B'";
+ mes "I will need 'H' who is specialised in the project.";
+ next;
+ mes "[Hallandaute]";
+ mes "Of course, there could be people who are good at everything.";
+ mes "But since they are hard to find, we must choose right people for each project.";
+ close;
+ }
+}
+
+//Aadin Keil - Feather of Angel Wing
+que_god01.gat,11,136,6 script Investigator#God2 742,{
+
+ if($God1 < 100)
+ {
+ if(god_sl_1 == 2)set god_sl_1,21;
+
+ if(god_sl_1 == 21 || god_sl_1 == 32 || god_sl_1 == 43 || god_sl_1 == 14)
+ {
+ if(god_sl_2 == 0)
+ {
+ mes "[Aadin]";
+ mes "*yawn*~";
+ mes "Umm?";
+ mes "Hmmmm....";
+ next;
+ mes "[Aadin]";
+ mes "Nice to meet you.";
+ mes "I know you are the temporary assistant joined this time.";
+ mes "That's great, I was having a hard time to do something on my own.";
+ next;
+ mes "[Aadin]";
+ mes "Okay...";
+ mes "Let me explain what I am doing at this moment.";
+ mes "I am studying 'Feather of Angel Wing' which is";
+ mes "revealed to be the material of 'Sleipnir'.";
+ next;
+ mes "[Aadin]";
+ mes "Especially I am focusing on the behind story";
+ mes "of this feather like how it became the material of 'Sleipnir'.";
+ mes "I was told that there is a person in 'Payon'";
+ mes "who knows about the story.";
+ mes "So I tried to send a staff to the village in order to";
+ mes "gather information from him....";
+ next;
+ mes "[Aadin]";
+ mes "But the situation does not allow me to use any of manpower in the laboratory...";
+ mes "so I have been debating myself if I should go there on my own or not.";
+ mes "Because I don't feel safe to leave this studying room with this feather alone.";
+ next;
+ mes "[Aadin]";
+ mes "Therefore...";
+ mes "as you might guessed already....";
+ mes "I would like to ask you to go talk to the person in Payon";
+ mes "about the story and come back to me.";
+ next;
+ mes "[Aadin]";
+ mes "I assume that it should not be that difficult to find the person.";
+ mes "But you must memorize every single word from him.";
+ mes "The result of research could be affected by words you delievered to me.";
+ next;
+ mes "[Aadin]";
+ mes "Thank you in advance.";
+ mes "There is no time limit for this, but faster will be better...";
+ mes "Have a good travel!";
+ set god_sl_2,1;
+ close;
+ }
+ else if(god_sl_2 == 1)
+ {
+ mes "[Aadin]";
+ mes "You have not gone to Payon yet.";
+ mes "Please leave to Payon as soon as possible.";
+ mes "Have a good travel!";
+ close;
+ }
+ else if(god_sl_2 == 2)
+ {
+ mes "[Aadin]";
+ mes "Ah, you came back.";
+ mes "So, have you memorized the story?";
+ mes "Yes, I know it would be really convenient";
+ mes "if they kept the story as a book.";
+ mes "But it seems that they have some kind of rules that do not allow them";
+ mes "to write down the story but to tell people by word of mouth.";
+ next;
+ mes "[Aadin]";
+ mes "Okay, I am ready to listen.";
+ mes "Please go ahead.";
+ mes ".......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ mes ".........";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ mes ".........";
+ mes "..........";
+ next;
+ mes "[Aadin]";
+ mes "Hmm......";
+ mes "I see.";
+ mes "Now I have a better understanding about it.";
+ mes "Oh next;...";
+ next;
+ mes "[Aadin]";
+ mes "It seems you missed some important part of the story!";
+ mes "I am so sorry to tell you this but do you mind going back to Payon";
+ mes "and listening the story again? I would like to listen to the story again.";
+ set god_sl_2,3;
+ close;
+ }
+ else if(god_sl_2 == 3)
+ {
+ mes "[Aadin]";
+ mes "You haven't left to Payon yet.";
+ mes "I hope you will leave as soon as possible.";
+ mes "Even with the story you have brought, I think I can";
+ mes "complete most part of the research.";
+ close;
+ }
+ else if(god_sl_2 == 4)
+ {
+ mes "[Aadin]";
+ mes "Oh, you came back.";
+ mes "Okay, I am ready to listen.";
+ mes "Please go ahead.";
+ mes ".......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ mes ".........";
+ next;
+ mes "[Aadin]";
+ mes ".";
+ mes "..";
+ mes "...";
+ mes "....";
+ mes ".....";
+ mes "......";
+ mes ".......";
+ mes "........";
+ mes ".........";
+ mes "..........";
+ next;
+ mes "[Aadin]";
+ mes "Hmm...I see.";
+ mes "It seems your story is almost accurate as the original one.";
+ mes "It is understandable that the story is differentiated by the person";
+ mes "who is telling it since we share the story by word of mouth.";
+ next;
+ mes "[Aadin]";
+ mes "Yes, most of my questions finally found their answers.";
+ mes "At the same time, the story gave me new questions.";
+ mes "Hmmm...this is not easy at all.";
+ mes "Thank you for your help though.";
+ set god_sl_2,0;
+ if(god_sl_1 == 21)
+ set god_sl_1,22;
+ else if(god_sl_1 == 32)
+ set god_sl_1,33;
+ else if(god_sl_1 == 43)
+ set god_sl_1,44;
+ else if(god_sl_1 == 14)
+ set god_sl_1,50;
+ close;
+ }
+ }
+ else
+ {
+ mes "[Aadin]";
+ mes "Hmmm....";
+ mes "Sometimes a legend or a myth";
+ mes "tells two different stories within that are totally conflicting each other.";
+ mes "You can find the reason by finding the origin of the stories.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Aadin]";
+ mes "Hmmm....";
+ mes "Sometimes a legend or a myth";
+ mes "tells two different stories within that are totally conflicting each other.";
+ mes "You can find the reason by finding the origin of the stories.";
+ close;
+ }
+
+}
+
+//Kurdt Jerremant - Spirit of Fish
+que_god01.gat,55,47,3 script Investigator#God3 803,{
+
+ if ($God1 < 100)
+ {
+ if(god_sl_1 == 2)set god_sl_1,31;
+
+ if(god_sl_1 == 31 || god_sl_1 == 42 || god_sl_1 == 13 || god_sl_1 == 24)
+ {
+ if(god_sl_2 == 0)
+ {
+ mes "[Kurdt]";
+ mes "Ah, you must be the new assistant.";
+ mes "I am pleased to meet you.";
+ next;
+ mes "[Kurdt]";
+ mes "I was kind of expecting a professional assistant";
+ mes "but it is understandable since the situation does not allow us.";
+ mes "Also, sometimes ordinary people";
+ mes "make a better result than professional assistants.";
+ mes "So I hope we will make a good team together.";
+ next;
+ mes "[Kurdt]";
+ mes "In fact, I am almost at the end of the research,";
+ mes "therefore I do not need that much of help...";
+ mes "However, the last thing I need to do is pretty difficult";
+ mes "for one to do alone...I was thinking to hire an agency from outside.";
+ next;
+ mes "[Kurdt]";
+ mes "But! I don't need to do that now, since you are here.";
+ mes "What I need now are materials to reproduce";
+ mes "'Spirit of Fish'.";
+ next;
+ mes "[Kurdt]";
+ mes "I am not sure yet if I can actually reproduce it or not.";
+ mes "But we can at least try it.";
+ next;
+ mes "[Kurdt]";
+ mes "Basically, you can go ahead and gather stuffs like";
+ mes "'Fish Scales' or 'Fish Tails'";
+ mes "or anything that you can obtain from marine life.";
+ mes "I donnot need too many but about 10 of them.";
+ next;
+ mes "[Kurdt]";
+ mes "I hope you will not have a hard time to gather them.";
+ mes "Thank you for your trouble and have a good travel!";
+ set god_sl_2,1;
+ close;
+ }
+ else if(god_sl_2 == 1)
+ {
+ mes "[Kurdt]";
+ mes "Ah, you came back.";
+ mes "Okay, let me check what you have brought to me.";
+ mes "Hmmm....";
+ mes ".........";
+ next;
+ mes "[Kurdt]";
+ mes "Hmmm......";
+ mes "I could use these...";
+ mes "and these too.....";
+ mes "aaand those too......";
+ mes "Umm.....";
+ set @itemcount,0;
+ if(countitem(918) > 8)set @itemcount,1;
+ if(countitem(950) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(951) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(956) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(959) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(960) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(961) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(962) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(963) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(964) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(965) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(966) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(7013) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1054) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1053) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1052) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1051) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1050) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1024) > 8)set @itemcount,@itemcount + 1;
+ if(countitem(1023) > 8)set @itemcount,@itemcount + 1;
+ next;
+ if(@itemcount > 14)
+ {
+ mes "[Kurdt]";
+ mes "Ah....!";
+ mes "You gathered everything I need.";
+ mes "Thank you so much.";
+ mes "With these, I can continue my research with no problem.";
+ next;
+ mes "[Kurdt]";
+ mes "I didn't expect you to do such a good job...";
+ mes "you are great!";
+ mes "Thank you so much!";
+ mes "Hahaha....";
+ mes "Just like me, other investigator might need you to help them.";
+
+ if(countitem(918) > 8)delitem 918,9;
+ if(countitem(950) > 8)delitem 950,9;
+ if(countitem(951) > 8)delitem 951,9;
+ if(countitem(956) > 8)delitem 956,9;
+ if(countitem(959) > 8)delitem 959,9;
+ if(countitem(960) > 8)delitem 960,9;
+ if(countitem(961) > 8)delitem 961,9;
+ if(countitem(962) > 8)delitem 962,9;
+ if(countitem(963) > 8)delitem 963,9;
+ if(countitem(964) > 8)delitem 964,9;
+ if(countitem(965) > 8)delitem 965,9;
+ if(countitem(966) > 8)delitem 966,9;
+ if(countitem(7013) > 8)delitem 7013,9;
+ if(countitem(1054) > 8)delitem 1054,9;
+ if(countitem(1053) > 8)delitem 1053,9;
+ if(countitem(1052) > 8)delitem 1052,9;
+ if(countitem(1051) > 8)delitem 1051,9;
+ if(countitem(1050) > 8)delitem 1050,9;
+ if(countitem(1024) > 8)delitem 1024,9;
+ if(countitem(1023) > 8)delitem 1023,9;
+
+ set god_sl_2,0;
+ if(god_sl_1 == 31)
+ set god_sl_1,32;
+ if(god_sl_1 == 42)
+ set god_sl_1,43;
+ if(god_sl_1 == 13)
+ set god_sl_1,14;
+ if(god_sl_1 == 24)
+ set god_sl_1,50;
+ close;
+ }
+ else
+ {
+ mes "[Kurdt]";
+ mes "Errr.........";
+ mes "It does not seem to be enough for the research.";
+ mes "Sorry for the trouble, please go gather some more.";
+ close;
+ }
+ }
+ }
+ else
+ {
+ mes "[Kurdt]";
+ mes "Hmmm....";
+ mes "Studying somthing does not only require";
+ mes "funds and manpower but enthusiasm and passion as well.";
+ next;
+ mes "[Kurdt]";
+ mes "Some financiers are so ignorant that they think";
+ mes "study only takes money and manpower.";
+ mes "However, even if they have enough funds and much of manpower";
+ mes "but they donnot give any motivation to the people who study";
+ mes "then the study cannot be succeeded.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Kurdt]";
+ mes "Hmmm....";
+ mes "Studying somthing does not only require";
+ mes "funds and manpower but enthusiasm and passion as well.";
+ next;
+ mes "[Kurdt]";
+ mes "Some financiers are so ignorant that they think";
+ mes "study only takes money and manpower.";
+ mes "However, even if they have enough funds and much of manpower";
+ mes "but they donnot give any motivation to the people who study";
+ mes "then the study cannot be succeeded.";
+ close;
+ }
+
+}
+
+//Pavel Stheinus Breath of Spirit
+que_god01.gat,14,47,3 script Investigator#God4 713,{
+
+ if($God1 < 100)
+ {
+ if(god_sl_1 == 2)set god_sl_1,41;
+
+ if(god_sl_1 == 41 || god_sl_1 == 12 || god_sl_1 == 23 || god_sl_1 == 34)
+ {
+ if(god_sl_2 == 0)
+ {
+ mes "[Pavel]";
+ mes "*sniff sniff*...";
+ mes "Achoo!";
+ mes "Huh?";
+ mes "Who are you....?";
+ mes "....";
+ next;
+ mes "[Pavel]";
+ mes "Ah, my apology.";
+ mes "You must be the new assistant...Aaachoo!";
+ mes "Hmm hmm *sniff sniff*...I am sorry, I am having a flu...";
+ mes "*sniff sniff*...";
+ mes "*sniff*...hmmm...";
+ next;
+ mes "[Pavel]";
+ mes "Umm....";
+ mes "It is good to know that you are here to help me....";
+ mes "However...Aaaachooo!";
+ mes "*sniff sniff*...";
+ next;
+ mes "[Pavel]";
+ mes "Hmm...Aaachooo!";
+ mes "Anyways, go look at...Aaachoo! that...Aaachoo!";
+ mes "thing...*sniff sniff*~";
+ set god_sl_2,1;
+ close;
+ }
+ else if(god_sl_2 == 1)
+ {
+ mes "[Pavel]";
+ mes "I told you to go look at Aaachhoooo! that...Aaachoooo! Achoo!";
+ mes "*glhk glhk*...";
+ mes "Hmm hmm..";
+ close;
+ }
+ else if(god_sl_2 == 2)
+ {
+ mes "[Pavel]";
+ mes "*cough cough*...";
+ mes "*sniff sniff*...";
+ mes "So did you go look at that?";
+ mes "Yeah, I don't think you understand even if you saw it.";
+ mes "*glhk glhk*...";
+ next;
+ mes "[Pavel]";
+ mes "AAAAACHHHOOO!";
+ mes "That slab of stone...no wait...Achoo!";
+ mes "The letters engaraved on the indescribable thing";
+ mes "are ancient....Achoo! ...language that are....Achoo!";
+ mes "no longer used nowadays.";
+ next;
+ mes "[Pavel]";
+ mes "I cannot ...*glhk glhk* tell what ancient";
+ mes "language..Achoo! it is...Achoo!";
+ mes "So...err...hmm hmm *sniff sniff*";
+ next;
+ mes "[Pavel]";
+ mes "Considering...Achoo! *sniff sniff* the material";
+ mes "Achoo! Achoo! used for the slab...*sniff sniff*,";
+ mes "it is not an Achoo! Achoo! *sniff sniff*ordinary slab of stone...";
+ mes "I guess...Aaaachoo!!!!! there must be some kind of";
+ mes "device installed on *sniff sniff*...";
+ next;
+ mes "[Pavel]";
+ mes "Aachoooo!! *sniff sniff* Not only that...*sniff sniff*";
+ mes "letters are not just engraved...*sniff sniff* Achhoo!!";
+ mes "but something Achooo!! covers...Achooo!";
+ mes "AAACHHHOOOO~~ the surfaces...*sniff sniff*";
+ next;
+ mes "[Pavel]";
+ mes "I must *cough cough* remove the device for...*cough cough*";
+ mes "further research...*cough cough*...but look at me.";
+ mes "I cannot even talk...*ghlk ghlk* clearly...";
+ next;
+ mes "[Pavel]";
+ mes "Hmm *sniff sniff*...so I hope you don't";
+ mes "mind Achoo!...helping me to remove Achoo!!...the device...";
+ mes "Achoo! ~ Thank you....";
+ mes "AAAACHHHOOOO~";
+ set god_sl_2,3;
+ close;
+ }
+ else if(god_sl_2 == 3)
+ {
+ mes "[Pavel]";
+ mes "Aaaaa...Cccccchhhh...oooo..!";
+ mes "*sniff sniff*...";
+ mes "Err...what I meant was..AAACHHOOO!...";
+ mes "*sniff sniff*...";
+ close;
+ }
+ else if(god_sl_2 == 4)
+ {
+ mes "[Pavel]";
+ mes "*cough*...";
+ mes "......!!";
+ mes "Oh...Acchhhoo!~";
+ mes "Now I see...";
+ mes "*sniff sniff*...";
+ next;
+ mes "[Pavel]";
+ mes "I was~Achoo! right, Achoo!";
+ mes "there was a device installed...Achoo! on it.";
+ mes "I could...*cough cough* not...*sniff sniff*";
+ mes "investigate...Achoo! the slab thoroughly...Achoo!";
+ mes "because of this god damn flu making me sneeze.";
+ next;
+ mes "[Pavel]";
+ mes "Achoo! Achoo! ~ thank you for your help....*sniff sniff*";
+ mes "Haha....*ghlk ghlk*...you did a good job.";
+ mes "*cough cough*..";
+ set god_sl_2,0;
+ if(god_sl_1 == 41)
+ set god_sl_1,42;
+ if(god_sl_1 == 12)
+ set god_sl_1,13;
+ if(god_sl_1 == 23)
+ set god_sl_1,24;
+ if(god_sl_1 == 34)
+ set god_sl_1,50;
+ close;
+ }
+ }
+ else
+ {
+ mes "[Pavel]";
+ mes "Umm....";
+ mes "It is not that important whether or not";
+ mes "we can embody a spirit into a shape.";
+ mes "It is important whether we";
+ mes "can prove the existance of spirit or not.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Pavel]";
+ mes "Umm....";
+ mes "It is not that important whether or not";
+ mes "we can embody a spirit into a shape.";
+ mes "It is important whether we";
+ mes "can prove the existance of spirit or not.";
+ close;
+ }
+
+}
+
+que_god01.gat,20,48,0 script Slab#God 111,{
+
+ if($God1 < 100)
+ {
+ if(god_sl_1 == 41 || god_sl_1 == 12 || god_sl_1 == 23 || god_sl_1 == 34)
+ {
+ if(god_sl_2 == 1 || god_sl_2 == 2)
+ {
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
+ set god_sl_2,2;
+ next;
+ mes "Unknown letters are engraved on the slab of stone.";
+ mes "They look like an ancient language.";
+ mes "The slab of stone has been severely damaged";
+ mes "to recognize every letter.";
+ mes "As you touched the surface, it was warm.";
+ mes "Definately, the slab didn't seem to be made of an ordinary stone.";
+ close;
+ }
+ else if(god_sl_2 == 3)
+ {
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfn";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks.........fusjs tmld.........";
+ next;
+ mes "As you took a close look, you found strange traces on each letter.";
+ mes "It seemed there was a kind of device installed on letters.";
+ next;
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
+ next;
+ input @str$;
+ if (@str$ == "dirdnl")
+ {
+ mes "Zap~";
+ mes "As you pressed a word '^ff0000dirdnl^000000',";
+ mes "the slab made a strange noise.";
+ mes "However, there were no other changes other than the noise.";
+ mes "You decided to touch other words.";
+ next;
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
+ next;
+ }
+ else
+ {
+ mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
+ mes "You decided to think up something different.";
+ close;
+ }
+ input @str$;
+ if (@str$ == "tkaryf")
+ {
+ mes "Zap~";
+ mes "As you pressed a word '^ff0000tkaryf^000000',";
+ mes "the slab made a strange noise.";
+ mes "However, there were no other changes other than the noise.";
+ mes "You decided to touch other words.";
+ next;
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
+ next;
+ }
+ else
+ {
+ mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
+ mes "You decided to think up something different.";
+ close;
+ }
+ input @str$;
+ if (@str$ == "ghswka")
+ {
+ mes "Zap~";
+ mes "As you pressed a word '^ff0000ghswka^000000',";
+ mes "the slab made a strange noise.";
+ mes "However, there were no other changes other than the noise.";
+ mes "You decided to touch other words.";
+ next;
+ mes "....whgks ^ff00ffdirdnl^000000sjs wkrdjswhgks whdtnfb";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks ^ff00fftkaryf^000000dnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "^ff00ffghswka^000000gks ........fusjs tmld.........";
+ next;
+ }
+ else
+ {
+ mes "You touched a word ^ff0000"+@str$+"^000000, nothing happened.";
+ mes "You decided to think up something different.";
+ close;
+ }
+ mes "Eeeeeeeeee~";
+ mes "As you pressed the three words in order,";
+ mes "the slab started vibrating with a strange noise.";
+ mes "At the same time, the strange traces on letters slowly dissappeared";
+ mes "and different letters appeared from underneath them.";
+ next;
+ mes "wkrdjswhgks dirdnlsjs wkrdjswhgks whdtnfh";
+ mes "wkrdjswhgks dldgnsdjs wkrdjswhgks wkdusdnlrnlfn";
+ mes "thfdh duTsjswhsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks tkatnfu";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkrdjswhgks dldgns";
+ mes "ghswkagks tkatnfusjs tmldaldgks akrnl";
+ next;
+ mes "..........";
+ mes "You still could not understand what those letters meant.";
+ mes ".........";
+ set god_sl_2,4;
+ next;
+ mes "After a while, those new letters dissappeared.";
+ mes "It seemed that you could only cancel";
+ mes "the device on the letters for a duration.";
+ close;
+ }
+ else
+ {
+ mes "....whgks dirdnlsjs wkrdjswhgks whdtnfn";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "ghswkagks .........fusjs tmld.........";
+ next;
+ mes "The slab of stone has been severely damaged";
+ mes "to recognize every letter.";
+ mes "As you touched the surface, it was warm.";
+ mes "Definately, the slab didn't seem to be made of an ordinary stone.";
+ mes "You decided to not care about the stone any longer.";
+ close;
+ }
+ }
+ else
+ {
+ mes "....whgks dirdnlsjs wkrdjswhgks whdtnfn";
+ mes "............djswhgks wkdusdnlrnlfn";
+ mes ".......whsjs rhf tk dmqsjs rj ehddjfn";
+ mes "wkdusgks tkaryfdnl durjfflrhsjs wkrdjswhgks ......";
+ mes "wkrdjswhgks shfh wkrdjswhgks wkdus wkr...";
+ mes "ghswkagks .........fusjs tmld.........";
+ next;
+ mes "The slab of stone has been severely damaged";
+ mes "to recognize every letter.";
+ mes "As you touched the surface, it was warm.";
+ mes "Definately, the slab didn't seem to be made of an ordinary stone.";
+ close;
+ }
+ }
+ else
+ {
+ mes "You found a slab of stone with strange letters engraved on the surface.";
+ mes "You could not identify what language it was.";
+ close;
+ }
+
+}
+
+//Lania Grunkurque
+payon.gat,79,171,4 script Friar#God5 95,{
+
+ if($God1 < 100)
+ {
+ if(god_sl_1 == 21 || god_sl_1 == 32 || god_sl_1 == 43 || god_sl_1 == 14)
+ {
+ if(god_sl_2 == 1 || god_sl_2 == 3)
+ {
+ mes "[Lania]";
+ mes "You can find good advice for yourself from folklores and legends.";
+ mes "No matter how many years have passed and how improved people have,";
+ mes "the basic of life will never change.";
+ next;
+ switch( select( "Umm.....", "I see." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "Well......";
+ mes "You seem to have a business with me, may I ask?";
+ mes "I will help you as much as I can.";
+ next;
+ mes "[Lania]";
+ mes "It is no use to have a power to help others";
+ mes "unless you use the power in a right purpose.";
+ next;
+
+ switch( select( "Nothing. Your words helped me already.","Regarding Sleipnir." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "I must misunderstood.";
+ mes "However, feel free to ask me a help whenever you need it.";
+ mes "It is also a training for me to help others.";
+ mes "I hope you will be generous to others as well...";
+ close;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "Umm.........";
+ mes "I see.";
+ mes "I think I can help you for that.";
+ mes "Please give me some time to remember it....Sleipnir...";
+ mes "Hmmm....";
+ mes "..........";
+ mes "...................";
+ next;
+ mes "[Lania]";
+ mes "Ah.........";
+ mes "I remember it now...";
+ mes "Yes, Sleipnir was the name of Odin's stallion.";
+ next;
+ mes "[Lania]";
+ mes "In the world of Gods, there were three legendary stallions.";
+ mes "They were ^ff0000'Sleipnir (A thing that ride as sliding)'";
+ mes "'Svadilfari (An unfortunate traveller)'";
+ mes "'Gullfaxi (Golden Mane)'^000000.";
+ next;
+ mes "[Lania]";
+ mes "Gullfaxi was owned by Hrungnir, the giant king and";
+ mes "Svadilfari was owned by Hrimthurs.";
+ mes "Also, 'Svadilfari' was the father of 'Sleipnir'.";
+ next;
+ mes "[Lania]";
+ mes "Okay, now let's talk about how 'Sleipnir' was born.";
+ mes "Well...we can see even Gods made mistakes";
+ mes "through this story.";
+ next;
+ mes "[Lania]";
+ mes "In Asgard the world of Gods,";
+ mes "there was a huge rampart.";
+ mes "Something happened and the rampart was destroyed.";
+ mes "Since this castle wall was too huge, Gods could";
+ mes "not dare to start mending it.";
+ next;
+ mes "[Lania]";
+ mes "One day, a very skinny man rode a dark horse into Asgard.";
+ mes "The man told Heimdall who was patrolling the wall";
+ mes "that he had something to tell Odin regarding the rampart.";
+ next;
+ mes "[Lania]";
+ mes "Since he was greatly concerned about the wall";
+ mes "Heimdall didn't hesitate to report it to Odin.";
+ mes "At the time, Odin was with other Gods in Valhala.";
+ next;
+ mes "[Lania]";
+ mes "Man promised to Odin that he could";
+ mes "build the rampart just like a new one";
+ mes "in 18 months.";
+ next;
+ mes "[Lania]";
+ mes "Although Odin felt something suspicious about the man,";
+ mes "Gods needed to repair the wall as soon as possible.";
+ mes "So, Odin asked him what he needed in return.";
+ mes "He asked to give him the goddess 'Freya' and";
+ mes "'the Sun and the Moon' as the payment.";
+ next;
+ mes "[Lania]";
+ mes ".....";
+ mes "Are you bored?";
+ mes "If you are, let's talk about this later.";
+ next;
+ switch( select( "See you later.", "No, please go ahead." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "I understand that my story was not that interesting.";
+ mes "I will try my best to satisfy you next time.";
+ mes "Have a good travel.";
+ close;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "Oh ok.";
+ mes "Then let me continue the story.";
+ next;
+ break;
+
+ }
+
+ mes "[Lania]";
+ mes "Gods were all stunned and became furious";
+ mes "due to the man's request.";
+ mes "He was asking everything that Gods have.";
+ next;
+ mes "[Lania]";
+ mes "At this time, a God approached to Odin.";
+ mes "It was the infamous Loki.";
+ mes "Loki said to Odin that";
+ mes "they could manipulate the man to repair";
+ mes "the rampart without paying him anything in return.";
+ next;
+ mes "[Lania]";
+ mes "Odin decided to follow Loki's suggestion.";
+ mes "So Odin told the man that he must";
+ mes "complete to repair the wall within 6 months";
+ mes "not 18 months in order to have 'Freya' and 'the Sun and the Moon'.";
+ next;
+ mes "[Lania]";
+ mes ".....";
+ mes "Are you bored?";
+ mes "If you are, let's talk about this later.";
+ next;
+ switch( select( "Let me organize the story first.", "See you later.", "No, please go ahead." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "Ah....";
+ mes "The story must be too long.";
+ mes "My apology...";
+ mes "Okay, I will next; for you to finish organizing the story...";
+ next;
+ mes "......................";
+ mes "..................";
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "..................";
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes ".........";
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "[Lania]";
+ mes "May I continue the story now?";
+ next;
+ menu "Yes, please.",-;
+ mes "[Lania]";
+ mes "Okay, here it goes.";
+ next;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "I understand that my story was not that interesting.";
+ mes "I will try my best to satisfy you next time.";
+ mes "Have a good travel.";
+ close;
+ break;
+
+ case 3:
+ mes "[Lania]";
+ mes "Oh ok.";
+ mes "Then let me continue the story.";
+ next;
+ break;
+
+ }
+
+ mes "[Lania]";
+ mes "Then the man asked Odin to let him";
+ mes "use his horse for the reconstruction work.";
+ mes "Because the horse looked very base and contemptible,";
+ mes "Odin didn't think twice about his request but accepted it on right the second.";
+ next;
+ mes "[Lania]";
+ mes "However, the man and the horse started repairing";
+ mes "the rampart in an amazing speed.";
+ mes "His skill was great but the horse's skill was greater than its owner";
+ mes "to mend the wall.";
+ mes "It was the legendary horse, Svadilfari.";
+ next;
+ mes "[Lania]";
+ mes "As more time went by, more anxious Gods were.";
+ mes "Because both of the castle wall menders";
+ mes "looked like they would complete the reconstruction work";
+ mes "even before the 6 months passed.";
+ mes "So Gods took their anger and axiouty on Loki";
+ mes "for his silly suggestion.";
+ next;
+ mes "[Lania]";
+ mes "However, Loki seemed confident.";
+ mes "He assured Gods to count on him.";
+ mes "Although Gods didn't trust Loki for his slyness and wickedness,";
+ mes "they decided to give him a chance since";
+ mes "the situation was desperate.";
+ next;
+ mes "[Lania]";
+ mes "And a strange thing happened. Ever since Loki";
+ mes "assurred Gods for the result, the progress of the reconstruction";
+ mes "had stopped. Just like a magic.";
+ next;
+ mes "[Lania]";
+ mes ".....";
+ mes "Are you bored?";
+ mes "If you are, let's talk about this later.";
+ next;
+ switch( select( "See you later.", "No, please go ahead." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "I understand that my story was not that interesting.";
+ mes "I will try my best to satisfy you next time.";
+ mes "Have a good travel.";
+ close;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "Oh ok.";
+ mes "Then let me continue the story.";
+ next;
+ break;
+
+ }
+
+ mes "[Lania]";
+ mes "Gods became curious so they decided to investigate the reason.";
+ mes "The found Svadilfari fell in love with a beautiful mare";
+ mes "and didn't work on repairing the rampart.";
+ mes "So when the 6 months passed, the man";
+ mes "finished everything but the castle gate to repair.";
+ next;
+ mes "[Lania]";
+ mes "Gods were so happy to tell the man";
+ mes "that they could not accept his payment request";
+ mes "since he could not keep the contract.";
+ mes "Man got into rage and claimed";
+ mes "that Gods tricked him in order to avoid giving him";
+ mes "'Freya' and 'the Sun and the Moon'.";
+ next;
+ mes "[Lania]";
+ mes "And he revealed his true identity.";
+ mes "He was a giant from Jotunnheim.";
+ mes "He was so angry and started committing an outrage.";
+ next;
+ mes "[Lania]";
+ mes ".....";
+ mes "Are you bored?";
+ mes "If you are, let's talk about this later.";
+ next;
+ switch( select( "See you later.", "No, please go ahead." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "I understand that my story was not that interesting.";
+ mes "I will try my best to satisfy you next time.";
+ mes "Have a good travel.";
+ close;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "Oh ok.";
+ mes "Then let me continue the story.";
+ next;
+ break;
+
+ }
+
+ mes "[Lania]";
+ mes "Later on, this giant turned out to be Hrimthurs.";
+ mes "However, even if Hrimthurs was commiting an outrage";
+ mes "Gods did not worry about him at all.";
+ mes "Because they had Thor, the giant hunter.";
+ next;
+ mes "[Lania]";
+ mes "As Thor hurled his legendary hammer 'Mjolnir'";
+ mes "at Hrimthurs, the giant's head was bursted into fragments";
+ mes "and he fell to the hell.";
+ next;
+ mes "[Lania]";
+ mes ".....";
+ mes "Are you bored?";
+ mes "If you are, let's talk about this later.";
+ next;
+ switch( select( "Let me organize the story first.", "See you later.", "No, please go ahead." ) )
+ {
+
+ case 1:
+ mes "[Lania]";
+ mes "Ah....";
+ mes "The story must be too complicated for you to understand.";
+ mes "My apology...";
+ mes "Okay, I will wait for you to finish organizing the story...";
+ next;
+ mes "......................";
+ mes "..................";
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "..................";
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "...............";
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes "............";
+ mes ".........";
+ mes "......";
+ next;
+ mes ".........";
+ mes "......";
+ next;
+ mes "......";
+ next;
+ mes "[Lania]";
+ mes "May I continue the story now?";
+ next;
+ menu "Yes, please.",-;
+ mes "[Lania]";
+ mes "Okay, here it goes.";
+ next;
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "I understand that my story was not that interesting.";
+ mes "I will try my best to satisfy you next time.";
+ mes "Have a good travel.";
+ close;
+ break;
+
+ case 3:
+ mes "[Lania]";
+ mes "Oh ok.";
+ mes "Then let me continue the story.";
+ next;
+ break;
+
+ }
+ mes "[Lania]";
+ mes "After a while, Loki who looked tattered and worn out";
+ mes "brought a strange looking pony with eight leggs to Asgard.";
+ mes "And Loki introduced the pony as 'Sleipnir' and";
+ mes "presented it to Odin.";
+ mes "Odin thankfully accepted Loki's present.";
+ next;
+ mes "[Lania]";
+ mes "The fact was Loki transformed into the mare that";
+ mes "attracted Svadilfari and eventually he was impregnated";
+ mes "of the pony. That was the story of";
+ mes "how 'Sleipnir' was born.";
+ next;
+ mes "[Lania]";
+ mes "We, friars only hand down this story by word of mouth.";
+ mes "Therefore, small details might be different from the other.";
+ mes "However, the fundamental story line should not be different.";
+ next;
+ mes "[Lania]";
+ mes "I have not been able to practice myself that well,";
+ mes "I am not that confident if I told you the story as much as the original story.";
+ mes "But I hope you will understand that I did my best.";
+ mes "That was all I could help you.";
+ next;
+ mes "[Lania]";
+ mes "If you wish to listen to the story again,";
+ mes "you are always welcomed.";
+ mes "Have a safe travel.";
+ if(god_sl_2 == 1)
+ set god_sl_2,2;
+ else if(god_sl_2 == 3)
+ set god_sl_2,4;
+ close;
+ break;
+ }
+ break;
+
+ case 2:
+ mes "[Lania]";
+ mes "When you are in agony,";
+ mes "please look back on your past.";
+ mes "Just like legends or myths,";
+ mes "yours is also a story of the past.";
+ mes "You will find out a right solution from your past.";
+ close;
+ break;
+ }
+ }
+ else
+ {
+ mes "[Lania]";
+ mes "I told you everything I know.";
+ mes "I hope it will be a help for you.";
+ mes "Please be helpful for others...";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Lania]";
+ mes "............";
+ mes "Training does not include only physical or mental practice.";
+ mes "Leading a life and meeting people are also considered";
+ mes "as a part of practice. Of course, everyone will have a different result.";
+ close;
+ }
+ }
+ else
+ {
+ mes "[Lania]";
+ mes "............";
+ mes "Training does not include only physical or mental practice.";
+ mes "Leading a life and meeting people are also considered";
+ mes "as a part of practice. Of course, everyone will have a different result.";
+ close;
+ }
+
+}
+
+// warp 0 -laboratory entrance
+que_god01.gat,84,95,0 script Switch#God0 111,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ close2;
+ warp "que_god01.gat",60,88;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,84,92,0 script god_sl_w0 45,1,1,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",60,88;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+// ¿öÇÁ 1¹ø -Ç϶õµµÆ®
+que_god01.gat,49,97,0 script Switch#God1 111,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",62,119;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,46,97,0 script god_sl_w1 45,1,1,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",62,119;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+
+// ¿öÇÁ 2¹ø -¾Æµò
+que_god01.gat,19,97,0 script Switch#God2 111,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",12,119;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,16,97,0 script god_sl_w2 45,1,1,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",12,119;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,14,80,0 script Switch#God3 111,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01",12,52;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,17,80,0 script god_sl_w3 45,1,1,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",12,52;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+// ¿öÇÁ 4¹ø Äí¸£Æ®
+que_god01.gat,44,80,0 script Switch#God4 111,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",50,52;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
+
+que_god01.gat,47,80,0 script god_sl_w4 45,1,1,{
+
+ if(god_sl_1 > 1 && god_sl_1 < 51)
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "As you put your temporary pass onto the detector,";
+ mes "the door was open.";
+ next;
+ warp "que_god01.gat",50,52;
+ end;
+ }
+ else
+ {
+ mes "The door was locked.";
+ mes "You looked around and found out a detector";
+ mes "at the right side of the door.";
+ mes "It seemed you need to put something onto";
+ mes "the detector in order to open the door.";
+ close;
+ }
+
+}
diff --git a/npc/quests/skills/acolyte_skills.txt b/npc/quests/skills/acolyte_skills.txt
index 584207fc7..06f198aa2 100644
--- a/npc/quests/skills/acolyte_skills.txt
+++ b/npc/quests/skills/acolyte_skills.txt
@@ -1,129 +1,129 @@
-//===== eAthena Script =======================================
-//= Acolyte Skill Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Fixed an exploit [Lupus]
-//= 1.4a changed perm. variables to temp ones [Lupus]
-//============================================================
-
-
-prt_church.gat,173,23,4 script Acolyte Klift 79,{
- mes "[Acolyte Klift]";
- if (baseClass == Job_Acolyte) goto L_Start;
-
-L_Other:
- mes "Ah, welcome to the Prontera Church also known as the Sanctuary.";
- mes "Unfortunately I cannot be of much help to you. For my fellow";
- mes "Priests and Acolytes however, I can help them to find their ^5555FF'hidden";
- mes "ability'^000000.";
- close;
-
-L_Start:
- if(@HOLYLIGHT) goto L_Check;
- if(getskilllv(156)>0) goto L_GotSkill;
- if(sex==1) mes "Ahh... Brother!";
- if(sex==0) mes "Ahh... Sister!";
- mes "Does the task of caring for our lost sheep tire you out? Is it too";
- mes "much of a burden? Do not despair, I am here to assist you.";
- next;
- menu "About an Acolyte's ^5555FF'hidden ablitiy'^000000...",M_0, "End Conversation.",M_End;
-
- M_0:
- mes "[Acolyte Klift]";
- mes "Faced with great danger in an endless struggle with evil, our";
- mes "brethren are in much need of assistance.";
- next;
- mes "[Acolyte Klift]";
- mes "As acolytes approach their senior years in the clergy, they learn to";
- mes "call upon their inner power to use a special skill to aid them in";
- mes "battle.";
- next;
- mes "[Acolyte Klift]";
- mes "That skill is ^5555FF'Holy Light'^000000. Holy Light does damage to";
- mes "all foes but is even more effective on the undead.";
- next;
- mes "[Acolyte Klift]";
- mes "For someone like yourself to learn this skill, takes some hard work.";
- mes "Would you like to learn this skill?";
- next;
- menu "Yes, please.",-, "Let me think about it.",M_End;
-
- mes "[Acolyte Klift]";
- mes "Very good. You will need to find these items in order to learn the";
- mes "skill:";
- mes "^5555FF1 Opal^000000,";
- mes "^5555FF1 Crystal Blue^000000,";
- mes "and ^5555FF1 Rosary^000000.";
- next;
- mes "[Acolyte Klift]";
- mes "Of course you will also need to have a sufficient level of";
- mes "experience. Namely a ^5555FFjob level of at least 30^000000. This does";
- mes "not apply to Priests or Monks however, because of the vast amount of";
- mes "experience they already have.";
- next;
- mes "[Acolyte Klift]";
- mes "Come back when you are ready. I will be here.";
- set @HOLYLIGHT, 1;
- close;
- M_End:
- mes "[Acolyte Klift]";
- mes "I understand your zeal. You have much time yet to practice and gain";
- mes "experience. Go forth with many blessings...";
- close;
-
-L_Check:
- mes "So, are you ready for the Holy Light training? Let me check....";
- next;
- mes "[Acolyte Klift]";
- if(BaseJob==Job_Acolyte && JobLevel<30) goto L_LowLvl;
- if(countitem(727)<1 || countitem(991)<1 || countitem(2608)<1) goto L_NoItems;
- delitem 727,1;
- delitem 991,1;
- delitem 2608,1;
- mes "Oh! Very good. You have brought back all of the items I asked for.";
- next;
- mes "[Acolyte Klift]";
- mes "Ok lets get started...";
- next;
- mes "(after hours of praying and meditation)";
- next;
- mes "[Acolyte Klift]";
- mes "Yes! I feel it. You have released your hidden abilities and can now";
- mes "use ^5555FFHoly Light^000000!";
- skill 156,1,0;
- set @HOLYLIGHT, 0;
- next;
- mes "[Priest]";
- mes "You have done well. May God bless you!";
- emotion e_no1;
- close;
-
- L_LowLvl:
- mes "I'm sorry but you need more training before I can teach you Holy";
- mes "Light. Come back when your job level is at least 30.";
- close;
- L_NoItems:
- mes "I'm sorry but you don't have the required items for Holy Light.";
- mes "You need:";
- mes "^5555FF1 Opal^000000,";
- mes "^5555FF1 Crystal Blue^000000,";
- mes "and ^5555FF1 Rosary^000000.";
- close;
-
-L_GotSkill:
- mes "Ah, I see you have been using Holy Light. It is such a great skill";
- mes "that I truly believe it to be a gift from the lord himself. May";
- mes "God be with you always.";
- close;
-}
+//===== eAthena Script =======================================
+//= Acolyte Skill Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Fixed an exploit [Lupus]
+//= 1.4a changed perm. variables to temp ones [Lupus]
+//============================================================
+
+
+prt_church.gat,173,23,4 script Acolyte Klift 79,{
+ mes "[Acolyte Klift]";
+ if (baseClass == Job_Acolyte) goto L_Start;
+
+L_Other:
+ mes "Ah, welcome to the Prontera Church also known as the Sanctuary.";
+ mes "Unfortunately I cannot be of much help to you. For my fellow";
+ mes "Priests and Acolytes however, I can help them to find their ^5555FF'hidden";
+ mes "ability'^000000.";
+ close;
+
+L_Start:
+ if(@HOLYLIGHT) goto L_Check;
+ if(getskilllv(156)>0) goto L_GotSkill;
+ if(sex==1) mes "Ahh... Brother!";
+ if(sex==0) mes "Ahh... Sister!";
+ mes "Does the task of caring for our lost sheep tire you out? Is it too";
+ mes "much of a burden? Do not despair, I am here to assist you.";
+ next;
+ menu "About an Acolyte's ^5555FF'hidden ablitiy'^000000...",M_0, "End Conversation.",M_End;
+
+ M_0:
+ mes "[Acolyte Klift]";
+ mes "Faced with great danger in an endless struggle with evil, our";
+ mes "brethren are in much need of assistance.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "As acolytes approach their senior years in the clergy, they learn to";
+ mes "call upon their inner power to use a special skill to aid them in";
+ mes "battle.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "That skill is ^5555FF'Holy Light'^000000. Holy Light does damage to";
+ mes "all foes but is even more effective on the undead.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "For someone like yourself to learn this skill, takes some hard work.";
+ mes "Would you like to learn this skill?";
+ next;
+ menu "Yes, please.",-, "Let me think about it.",M_End;
+
+ mes "[Acolyte Klift]";
+ mes "Very good. You will need to find these items in order to learn the";
+ mes "skill:";
+ mes "^5555FF1 Opal^000000,";
+ mes "^5555FF1 Crystal Blue^000000,";
+ mes "and ^5555FF1 Rosary^000000.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "Of course you will also need to have a sufficient level of";
+ mes "experience. Namely a ^5555FFjob level of at least 30^000000. This does";
+ mes "not apply to Priests or Monks however, because of the vast amount of";
+ mes "experience they already have.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "Come back when you are ready. I will be here.";
+ set @HOLYLIGHT, 1;
+ close;
+ M_End:
+ mes "[Acolyte Klift]";
+ mes "I understand your zeal. You have much time yet to practice and gain";
+ mes "experience. Go forth with many blessings...";
+ close;
+
+L_Check:
+ mes "So, are you ready for the Holy Light training? Let me check....";
+ next;
+ mes "[Acolyte Klift]";
+ if(BaseJob==Job_Acolyte && JobLevel<30) goto L_LowLvl;
+ if(countitem(727)<1 || countitem(991)<1 || countitem(2608)<1) goto L_NoItems;
+ delitem 727,1;
+ delitem 991,1;
+ delitem 2608,1;
+ mes "Oh! Very good. You have brought back all of the items I asked for.";
+ next;
+ mes "[Acolyte Klift]";
+ mes "Ok lets get started...";
+ next;
+ mes "(after hours of praying and meditation)";
+ next;
+ mes "[Acolyte Klift]";
+ mes "Yes! I feel it. You have released your hidden abilities and can now";
+ mes "use ^5555FFHoly Light^000000!";
+ skill 156,1,0;
+ set @HOLYLIGHT, 0;
+ next;
+ mes "[Priest]";
+ mes "You have done well. May God bless you!";
+ emotion e_no1;
+ close;
+
+ L_LowLvl:
+ mes "I'm sorry but you need more training before I can teach you Holy";
+ mes "Light. Come back when your job level is at least 30.";
+ close;
+ L_NoItems:
+ mes "I'm sorry but you don't have the required items for Holy Light.";
+ mes "You need:";
+ mes "^5555FF1 Opal^000000,";
+ mes "^5555FF1 Crystal Blue^000000,";
+ mes "and ^5555FF1 Rosary^000000.";
+ close;
+
+L_GotSkill:
+ mes "Ah, I see you have been using Holy Light. It is such a great skill";
+ mes "that I truly believe it to be a gift from the lord himself. May";
+ mes "God be with you always.";
+ close;
+}
diff --git a/npc/quests/skills/alchemist_skills.txt b/npc/quests/skills/alchemist_skills.txt
index 5e1cf0f1f..6aacfbdb2 100644
--- a/npc/quests/skills/alchemist_skills.txt
+++ b/npc/quests/skills/alchemist_skills.txt
@@ -1,453 +1,453 @@
-//===== eAthena Script =======================================
-//= Alchemist Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.5a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//= 1.4 Added Creators + Baby Alchemists can pass Bio Ethics
-//= Quest too [Lupus]
-//= 1.5 Removed duplicates [Toms] 1.5a fixed typo [Lupus]
-//============================================================
-
-
-//============================================================
-// ALCHEMIST - ELEMENTAL POTION CREATION
-//============================================================
-yuno_in04.gat,33,108,5 script Pislik 750,{
- mes "[Pislik]";
- if(BaseJob != Job_Alchem) goto L_noalche;
- if(countitem(7434)) goto L_alreadyhave;//Items: Elemental_Potion_Creation_Guide,
- if(JobLevel<40) goto L_nojob;
-
- mes "I'll teach you all I know, but";
- mes "you have to bring me some things";
- mes "first.";
- mes "5 Yellow Gemstones,";
- mes "4 Empty Potion Bottles,";
- mes "10 Hearts of Mermaid,";
- mes "10 Moth Dust,";
- mes "20 Maneater Blossoms and";
- mes "1 Geek Glasses";
- next;
-
- mes "[Pislik]";
- mes "Let me check your items.";
- next;
-
- if(countitem(715)<5 || countitem(1093)<4 || countitem(950)<10 || countitem(1057)<10 || countitem(1032)<20 || countitem(2243)<1) goto L_noitems;//Items: Yellow_Gemstone, Empty_Potion_Bottle, Heart_of_Mermaid, Moth_Dust, Maneater_Blossom, Geek_Glasses,
- delitem 715, 5;//Items: Yellow_Gemstone,
- delitem 1093, 4;//Items: Empty_Potion_Bottle,
- delitem 950, 10;//Items: Heart_of_Mermaid,
- delitem 1057, 10;//Items: Moth_Dust,
- delitem 1032, 20;//Items: Maneater_Blossom,
- delitem 2243, 1;//Items: Geek_Glasses,
- getitem 7434, 1;//Items: Elemental_Potion_Creation_Guide,
-
- mes "[Pislik]";
- mes "I see you have what you need,";
- mes "so I'll give you my manual.";
- close;
-
-L_noitems:
- mes "[Pislik]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_noalche:
- mes "Sorry, but my knowledge is only about alchemy.";
- mes "I can't help you.";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already given you";
- mes "my Elemental Potion Creation Guide...";
- close;
-
-L_nojob:
- mes "Come back when you've learned";
- mes "more about being an Alchemist.";
- close;
-}
-
-//============================================================
-// ALCHEMIST - Bio Ethics Quest (Homunculi Skill Branch)
-//============================================================
-
-//=====================Requires Bug Testing=====================
-lhz_in01.gat,46,125,6 script Rekenber Guard 867,{
- mes "[Rekenber Guard]";
- if(isequipped(2241) && isequipped(2243)){
- mes "......................";
- next;
- switch(select("Nice day, huh?","Cancel")){
- case 1:
- mes "[Rekenber Guard]";
- mes "...";
- close2;
- warp "lhz_in01.gat",282,172;
- end;
- break;
- case 2:
- close;
- break;
- }
- }
- else{
- mes "...";
- close;
- }
-}
-lhz_in01.gat,282,172,0 script BioEthTrg1::BETrg1 -1,1,1{
- OnTouch:
- mes "[Researcher]";
- mes "This is a restricted";
- mes "area. Please leave";
- mes "immediately.";
- close2;
- warp "lhz_in01.gat",199,131;
- end;
-}
-
-lhz_in01.gat,285,169,7 script Researcher#2 865,{
-//Unknown Text
- mes "[Researcher]";
- mes "Hmm... I wonder...";
- close;
-}
-lhz_in01.gat,199,137,8 script Scientist#2 865,{
- mes "[Scientist]";
- mes "Whoa whoa~!";
- mes "Please! Don't";
- mes "touch anything!";
- mes "I'm dealing with highly";
- mes "volatile chemicals here!";
- close;
-}
-lhz_in01.gat,204,138,6 script Keshibien 750,{
- if(bioeth >= 2){
- //Unofficial text
- mes "[Keshibien]";
- mes "Hello there~";
- mes "Are you looking for";
- mes "more information about";
- mes "homunculus?";
- next;
- mes "[Keshibien]";
- mes "I shouldn't say";
- mes "anything, but look";
- mes "for someone named";
- mes "Bringel in Lighthalzen.";
- if(bioeth == 2) set bioeth,3;
- close;
- //Unofficial text end
- }
- mes "[Keshibien]";
- mes "Hello there~";
- mes "You must be from";
- mes "Rune-Midgarts, right?";
- mes "It's nice to meet you.";
- next;
- mes "[Keshibien]";
- mes "I hear that the";
- mes "Alchemists from";
- mes "over there are pretty";
- mes "skilled. I wonder if I'll";
- mes "ever get the change to";
- mes "collaborate with any of them...";
- close;
-}
-lhz_in01.gat,203,123,8 script Scientist#3 750,{
- mes "[Scientist]";
- mes "Alright. Pull one test";
- mes "tube out of the machine,";
- mes "replace the other test";
- mes "tube over here and then";
- mes "clean the first test tube?";
- next;
- mes "[Scientist]";
- mes "Or do I clean the test tube,";
- mes "put it into the machine and";
- mes "then replace the other one?";
- mes "I'm so confused with this";
- mes "procedure! If only I didn't";
- mes "lose the instructions...";
- close;
-}
-lhz_in01.gat,221,131,3 script Scientist#4 865,{
- mes "[Scientist]";
- mes "It takes so long for";
- mes "this device to process";
- mes "all the data and give me";
- mes "the results. Still, the wait";
- mes "heightens my anticipation...";
- close;
-}
-lhz_in01.gat,218,141,0 script Alchemist#2 98,{
- mes "[Alchemist]";
- mes "Out of all humans,";
- mes "I believe Kellasus is";
- mes "the one who has come";
- mes "closest to discovering";
- mes "the secrets of life. He";
- mes "never fails to amaze me...";
- next;
- mes "[Alchemist]";
- mes "I'm also impressed by the";
- mes "fact that he doesn't let his";
- mes "work keep him from being the";
- mes "best father and husband that";
- mes "he can for his family. He's";
- mes "an example for all of us.";
- next;
- mes "[Alchemist]";
- mes "Kellasus really is";
- mes "an amazing person.";
- mes "There isn't one Alchemist";
- mes "that I know who doesn't look";
- mes "up to him in the realms of";
- mes "both science and personal life.";
- close;
-}
-lhz_in01.gat,224,140,8 script Kellasus 57,{
- if(MISC_QUEST&64){
- mes "[Kellasus]";
- mes "I already taught you";
- mes "skills of the homunculus...";
- if(getskilllv(238) == 0 && BaseJob == Job_Alchem) skill 238,1,0;
- close;
- }
- switch(bioeth){
- case 4:
- mes "[Kellasus]";
- mes "...You're really hard to handle.";
- mes "I don't think I should";
- mes "teach you biotechnology.";
- mes "Besides that, you know";
- mes "nothing about homunculus!";
- next;
- menu "I've learned that",-;
- mes "[Kellasus]";
- mes "Oh really?";
- mes "I will have to test you";
- mes "on your knowledge of";
- mes "homunculus then.";
- next;
- mes "[Kellasus]";
- mes "First question.";
- mes "What is the skill that lets the";
- mes "homunculus stay in peace?";
- input @kelques$;
- next;
- mes "[Kellasus]";
- if(@kelques$ != "Vaporize"){
- mes "Hmpf. I knew you had";
- mes "no knowledge on";
- mes "homunculus.";
- close;
- }
- mes "That's right. Second question.";
- mes "What is the item";
- mes "that is required to";
- mes "summon or create";
- mes "a homunculus?";
- input @kelques$;
- next;
- mes "[Kellasus]";
- if(@kelques$ != "Embryo"){
- mes "Hmpf. I knew you had";
- mes "no knowledge on";
- mes "homunculus.";
- close;
- }
- mes "Correct. But this is not the end yet.";
- mes "What is the name";
- mes "of a skill";
- mes "that could let you";
- mes "revive a homunculus?";
- input @kelques$;
- next;
- mes "[Kellasus]";
- if(@kelques$ != "Homunculus Resurrection"){
- mes "Hmpf. I knew you had";
- mes "no knowledge on";
- mes "homunculus.";
- close;
- }
- mes "After all these discussions,";
- mes "I won't teach anyone";
- mes "the skills of homunculus.";
- mes "The decision is final";
- mes "and that's it!";
- set bioeth,5;
- close;
- break;
- case 5:
- mes "[Kellasus]";
- mes "After all these discussions,";
- mes "I won't teach anyone";
- mes "the skills of homunculus.";
- mes "The decision is final";
- mes "and that's it!";
- close;
- break;
- case 6:
- //Unofficial text and story -.-;
- mes "[Kellasus]";
- mes "Oh it's you again? You're really determined.";
- mes "Well most of the Alchemist";
- mes "are people who never";
- mes "let go of their dreams";
- next;
- menu "Let's talk about others",-;
- mes "[Kellasus]";
- mes "You've spoke to my son?";
- mes "What did he say?";
- next;
- mes "[Kellasus]";
- mes "...";
- next;
- mes "[Kellasus]";
- mes "He wants me to get back? Okay, well...";
- mes "I guess you've deserved it.";
- mes "Here you are, secrets of homunculus are yours now~";
- if(BaseJob == Job_Alchem) skill 238,1,0;
- set MISC_QUEST,MISC_QUEST|64;
- set bioeth,0;
- close;
- default:
- break;
- }
- switch(@keltalk){
- case 1:
- //No official text to put here, so I just repeated first text
- mes "[Kellasus]";
- mes "Hmm. Who decides what";
- mes "is right and wrong? What is";
- mes "meant to be known and what";
- mes "secrets were never intended";
- mes "for mankind to understand?";
- set @keltalk,2;
- close;
- break;
- case 2:
- mes "[Kellasus]";
- mes "Haven't I told you not to come back again?";
- mes "Please leave now!";
- mes "No matter what you do.";
- mes "I won't teach you anything about homunculus";
- set @keltalk,3;
- set bioeth,1;
- close;
- break;
- case 3:
- mes "[Kellasus]";
- mes "Haven't I told you not to come back again?";
- mes "Please leave now!";
- mes "No matter what you do.";
- mes "I won't teach you anything about homunculus";
- close;
- break;
- default:
- mes "[Kellasus]";
- mes "Hmm. Who decides what";
- mes "is right and wrong? What is";
- mes "meant to be known and what";
- mes "secrets were never intended";
- mes "for mankind to understand?";
- if(BaseJob == Job_Alchem) set @keltalk,1;
- close;
- break;
- }
-}
-lhz_in01.gat,217,121,6 script Repairman 851,{
- mes "[Repairman]";
- mes "No wonder these things";
- mes "break all the time! These";
- mes "machines have been totally";
- mes "abused! Ugh, there's no";
- mes "appreciation for all of this";
- mes "convenient technology...";
- next;
- mes "[Repairman]";
- mes "Yeah, all of this lab";
- mes "equipment is really sensitive,";
- mes "not to mention expensive. If";
- mes "you ever handle this stuff, you";
- mes "need to be extra cautious.";
- close;
-}
-lhz_in01.gat,225,122,4 script Skrajiad 754,{
- mes "[Skrajiad]";
- mes "Alchemy is wondrous...";
- mes "It incorporates every";
- mes "science and many other";
- mes "fields of knowledge that";
- mes "it's not enough to be jack";
- mes "of all trades... No...";
- next;
- mes "[Skrajiad]";
- mes "In a sense, you must";
- mes "be a master of all trades";
- mes "to be proficient in Alchemy";
- mes "But it's incredibly rewarding to";
- mes "those of us who never stop asking";
- mes "how and why our world works.";
- if(bioeth == 1) set bioeth,2;
- close;
-}
-lhz_in02.gat,269,273,4 script Bringel 709,{
-//Unofficial Text
- if(bioeth == 3){
- mes "[Bringel]";
- mes "Oh, you're here to learn about Homunculus?";
- mes "Well, I can't really help you...";
- next;
- mes "[Bringel]";
- mes "However, I've heard about a skill named";
- mes "Homunculus Resurrection.";
- mes "It seems it is a very important thing";
- mes "for people working on them.";
- set bioeth,4;
- close;
- }
- mes "[Bringel]";
- mes "Isn't this hotel great?";
- mes "I can relax on the couch";
- mes "And not care about what I";
- mes "did in the past...";
- close;
-}
-lhz_in03.gat,106,34,4 script Golin 706,{
-//Unofficial text
- if(bioeth == 5){
- mes "[Golin]";
- mes "Did you see my";
- mes "daddy at the lab?";
- mes "Tell him I said hi!";
- set bioeth,6;
- close;
- }
- mes "[Golin]";
- mes "Where's daddy?";
- mes "I really want";
- mes "daddy to come back";
- mes "from the lab.";
- close;
+//===== eAthena Script =======================================
+//= Alchemist Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.5a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//= 1.4 Added Creators + Baby Alchemists can pass Bio Ethics
+//= Quest too [Lupus]
+//= 1.5 Removed duplicates [Toms] 1.5a fixed typo [Lupus]
+//============================================================
+
+
+//============================================================
+// ALCHEMIST - ELEMENTAL POTION CREATION
+//============================================================
+yuno_in04.gat,33,108,5 script Pislik 750,{
+ mes "[Pislik]";
+ if(BaseJob != Job_Alchem) goto L_noalche;
+ if(countitem(7434)) goto L_alreadyhave;//Items: Elemental_Potion_Creation_Guide,
+ if(JobLevel<40) goto L_nojob;
+
+ mes "I'll teach you all I know, but";
+ mes "you have to bring me some things";
+ mes "first.";
+ mes "5 Yellow Gemstones,";
+ mes "4 Empty Potion Bottles,";
+ mes "10 Hearts of Mermaid,";
+ mes "10 Moth Dust,";
+ mes "20 Maneater Blossoms and";
+ mes "1 Geek Glasses";
+ next;
+
+ mes "[Pislik]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(715)<5 || countitem(1093)<4 || countitem(950)<10 || countitem(1057)<10 || countitem(1032)<20 || countitem(2243)<1) goto L_noitems;//Items: Yellow_Gemstone, Empty_Potion_Bottle, Heart_of_Mermaid, Moth_Dust, Maneater_Blossom, Geek_Glasses,
+ delitem 715, 5;//Items: Yellow_Gemstone,
+ delitem 1093, 4;//Items: Empty_Potion_Bottle,
+ delitem 950, 10;//Items: Heart_of_Mermaid,
+ delitem 1057, 10;//Items: Moth_Dust,
+ delitem 1032, 20;//Items: Maneater_Blossom,
+ delitem 2243, 1;//Items: Geek_Glasses,
+ getitem 7434, 1;//Items: Elemental_Potion_Creation_Guide,
+
+ mes "[Pislik]";
+ mes "I see you have what you need,";
+ mes "so I'll give you my manual.";
+ close;
+
+L_noitems:
+ mes "[Pislik]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_noalche:
+ mes "Sorry, but my knowledge is only about alchemy.";
+ mes "I can't help you.";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already given you";
+ mes "my Elemental Potion Creation Guide...";
+ close;
+
+L_nojob:
+ mes "Come back when you've learned";
+ mes "more about being an Alchemist.";
+ close;
+}
+
+//============================================================
+// ALCHEMIST - Bio Ethics Quest (Homunculi Skill Branch)
+//============================================================
+
+//=====================Requires Bug Testing=====================
+lhz_in01.gat,46,125,6 script Rekenber Guard 867,{
+ mes "[Rekenber Guard]";
+ if(isequipped(2241) && isequipped(2243)){
+ mes "......................";
+ next;
+ switch(select("Nice day, huh?","Cancel")){
+ case 1:
+ mes "[Rekenber Guard]";
+ mes "...";
+ close2;
+ warp "lhz_in01.gat",282,172;
+ end;
+ break;
+ case 2:
+ close;
+ break;
+ }
+ }
+ else{
+ mes "...";
+ close;
+ }
+}
+lhz_in01.gat,282,172,0 script BioEthTrg1::BETrg1 -1,1,1{
+ OnTouch:
+ mes "[Researcher]";
+ mes "This is a restricted";
+ mes "area. Please leave";
+ mes "immediately.";
+ close2;
+ warp "lhz_in01.gat",199,131;
+ end;
+}
+
+lhz_in01.gat,285,169,7 script Researcher#2 865,{
+//Unknown Text
+ mes "[Researcher]";
+ mes "Hmm... I wonder...";
+ close;
+}
+lhz_in01.gat,199,137,8 script Scientist#2 865,{
+ mes "[Scientist]";
+ mes "Whoa whoa~!";
+ mes "Please! Don't";
+ mes "touch anything!";
+ mes "I'm dealing with highly";
+ mes "volatile chemicals here!";
+ close;
+}
+lhz_in01.gat,204,138,6 script Keshibien 750,{
+ if(bioeth >= 2){
+ //Unofficial text
+ mes "[Keshibien]";
+ mes "Hello there~";
+ mes "Are you looking for";
+ mes "more information about";
+ mes "homunculus?";
+ next;
+ mes "[Keshibien]";
+ mes "I shouldn't say";
+ mes "anything, but look";
+ mes "for someone named";
+ mes "Bringel in Lighthalzen.";
+ if(bioeth == 2) set bioeth,3;
+ close;
+ //Unofficial text end
+ }
+ mes "[Keshibien]";
+ mes "Hello there~";
+ mes "You must be from";
+ mes "Rune-Midgarts, right?";
+ mes "It's nice to meet you.";
+ next;
+ mes "[Keshibien]";
+ mes "I hear that the";
+ mes "Alchemists from";
+ mes "over there are pretty";
+ mes "skilled. I wonder if I'll";
+ mes "ever get the change to";
+ mes "collaborate with any of them...";
+ close;
+}
+lhz_in01.gat,203,123,8 script Scientist#3 750,{
+ mes "[Scientist]";
+ mes "Alright. Pull one test";
+ mes "tube out of the machine,";
+ mes "replace the other test";
+ mes "tube over here and then";
+ mes "clean the first test tube?";
+ next;
+ mes "[Scientist]";
+ mes "Or do I clean the test tube,";
+ mes "put it into the machine and";
+ mes "then replace the other one?";
+ mes "I'm so confused with this";
+ mes "procedure! If only I didn't";
+ mes "lose the instructions...";
+ close;
+}
+lhz_in01.gat,221,131,3 script Scientist#4 865,{
+ mes "[Scientist]";
+ mes "It takes so long for";
+ mes "this device to process";
+ mes "all the data and give me";
+ mes "the results. Still, the wait";
+ mes "heightens my anticipation...";
+ close;
+}
+lhz_in01.gat,218,141,0 script Alchemist#2 98,{
+ mes "[Alchemist]";
+ mes "Out of all humans,";
+ mes "I believe Kellasus is";
+ mes "the one who has come";
+ mes "closest to discovering";
+ mes "the secrets of life. He";
+ mes "never fails to amaze me...";
+ next;
+ mes "[Alchemist]";
+ mes "I'm also impressed by the";
+ mes "fact that he doesn't let his";
+ mes "work keep him from being the";
+ mes "best father and husband that";
+ mes "he can for his family. He's";
+ mes "an example for all of us.";
+ next;
+ mes "[Alchemist]";
+ mes "Kellasus really is";
+ mes "an amazing person.";
+ mes "There isn't one Alchemist";
+ mes "that I know who doesn't look";
+ mes "up to him in the realms of";
+ mes "both science and personal life.";
+ close;
+}
+lhz_in01.gat,224,140,8 script Kellasus 57,{
+ if(MISC_QUEST&64){
+ mes "[Kellasus]";
+ mes "I already taught you";
+ mes "skills of the homunculus...";
+ if(getskilllv(238) == 0 && BaseJob == Job_Alchem) skill 238,1,0;
+ close;
+ }
+ switch(bioeth){
+ case 4:
+ mes "[Kellasus]";
+ mes "...You're really hard to handle.";
+ mes "I don't think I should";
+ mes "teach you biotechnology.";
+ mes "Besides that, you know";
+ mes "nothing about homunculus!";
+ next;
+ menu "I've learned that",-;
+ mes "[Kellasus]";
+ mes "Oh really?";
+ mes "I will have to test you";
+ mes "on your knowledge of";
+ mes "homunculus then.";
+ next;
+ mes "[Kellasus]";
+ mes "First question.";
+ mes "What is the skill that lets the";
+ mes "homunculus stay in peace?";
+ input @kelques$;
+ next;
+ mes "[Kellasus]";
+ if(@kelques$ != "Vaporize"){
+ mes "Hmpf. I knew you had";
+ mes "no knowledge on";
+ mes "homunculus.";
+ close;
+ }
+ mes "That's right. Second question.";
+ mes "What is the item";
+ mes "that is required to";
+ mes "summon or create";
+ mes "a homunculus?";
+ input @kelques$;
+ next;
+ mes "[Kellasus]";
+ if(@kelques$ != "Embryo"){
+ mes "Hmpf. I knew you had";
+ mes "no knowledge on";
+ mes "homunculus.";
+ close;
+ }
+ mes "Correct. But this is not the end yet.";
+ mes "What is the name";
+ mes "of a skill";
+ mes "that could let you";
+ mes "revive a homunculus?";
+ input @kelques$;
+ next;
+ mes "[Kellasus]";
+ if(@kelques$ != "Homunculus Resurrection"){
+ mes "Hmpf. I knew you had";
+ mes "no knowledge on";
+ mes "homunculus.";
+ close;
+ }
+ mes "After all these discussions,";
+ mes "I won't teach anyone";
+ mes "the skills of homunculus.";
+ mes "The decision is final";
+ mes "and that's it!";
+ set bioeth,5;
+ close;
+ break;
+ case 5:
+ mes "[Kellasus]";
+ mes "After all these discussions,";
+ mes "I won't teach anyone";
+ mes "the skills of homunculus.";
+ mes "The decision is final";
+ mes "and that's it!";
+ close;
+ break;
+ case 6:
+ //Unofficial text and story -.-;
+ mes "[Kellasus]";
+ mes "Oh it's you again? You're really determined.";
+ mes "Well most of the Alchemist";
+ mes "are people who never";
+ mes "let go of their dreams";
+ next;
+ menu "Let's talk about others",-;
+ mes "[Kellasus]";
+ mes "You've spoke to my son?";
+ mes "What did he say?";
+ next;
+ mes "[Kellasus]";
+ mes "...";
+ next;
+ mes "[Kellasus]";
+ mes "He wants me to get back? Okay, well...";
+ mes "I guess you've deserved it.";
+ mes "Here you are, secrets of homunculus are yours now~";
+ if(BaseJob == Job_Alchem) skill 238,1,0;
+ set MISC_QUEST,MISC_QUEST|64;
+ set bioeth,0;
+ close;
+ default:
+ break;
+ }
+ switch(@keltalk){
+ case 1:
+ //No official text to put here, so I just repeated first text
+ mes "[Kellasus]";
+ mes "Hmm. Who decides what";
+ mes "is right and wrong? What is";
+ mes "meant to be known and what";
+ mes "secrets were never intended";
+ mes "for mankind to understand?";
+ set @keltalk,2;
+ close;
+ break;
+ case 2:
+ mes "[Kellasus]";
+ mes "Haven't I told you not to come back again?";
+ mes "Please leave now!";
+ mes "No matter what you do.";
+ mes "I won't teach you anything about homunculus";
+ set @keltalk,3;
+ set bioeth,1;
+ close;
+ break;
+ case 3:
+ mes "[Kellasus]";
+ mes "Haven't I told you not to come back again?";
+ mes "Please leave now!";
+ mes "No matter what you do.";
+ mes "I won't teach you anything about homunculus";
+ close;
+ break;
+ default:
+ mes "[Kellasus]";
+ mes "Hmm. Who decides what";
+ mes "is right and wrong? What is";
+ mes "meant to be known and what";
+ mes "secrets were never intended";
+ mes "for mankind to understand?";
+ if(BaseJob == Job_Alchem) set @keltalk,1;
+ close;
+ break;
+ }
+}
+lhz_in01.gat,217,121,6 script Repairman 851,{
+ mes "[Repairman]";
+ mes "No wonder these things";
+ mes "break all the time! These";
+ mes "machines have been totally";
+ mes "abused! Ugh, there's no";
+ mes "appreciation for all of this";
+ mes "convenient technology...";
+ next;
+ mes "[Repairman]";
+ mes "Yeah, all of this lab";
+ mes "equipment is really sensitive,";
+ mes "not to mention expensive. If";
+ mes "you ever handle this stuff, you";
+ mes "need to be extra cautious.";
+ close;
+}
+lhz_in01.gat,225,122,4 script Skrajiad 754,{
+ mes "[Skrajiad]";
+ mes "Alchemy is wondrous...";
+ mes "It incorporates every";
+ mes "science and many other";
+ mes "fields of knowledge that";
+ mes "it's not enough to be jack";
+ mes "of all trades... No...";
+ next;
+ mes "[Skrajiad]";
+ mes "In a sense, you must";
+ mes "be a master of all trades";
+ mes "to be proficient in Alchemy";
+ mes "But it's incredibly rewarding to";
+ mes "those of us who never stop asking";
+ mes "how and why our world works.";
+ if(bioeth == 1) set bioeth,2;
+ close;
+}
+lhz_in02.gat,269,273,4 script Bringel 709,{
+//Unofficial Text
+ if(bioeth == 3){
+ mes "[Bringel]";
+ mes "Oh, you're here to learn about Homunculus?";
+ mes "Well, I can't really help you...";
+ next;
+ mes "[Bringel]";
+ mes "However, I've heard about a skill named";
+ mes "Homunculus Resurrection.";
+ mes "It seems it is a very important thing";
+ mes "for people working on them.";
+ set bioeth,4;
+ close;
+ }
+ mes "[Bringel]";
+ mes "Isn't this hotel great?";
+ mes "I can relax on the couch";
+ mes "And not care about what I";
+ mes "did in the past...";
+ close;
+}
+lhz_in03.gat,106,34,4 script Golin 706,{
+//Unofficial text
+ if(bioeth == 5){
+ mes "[Golin]";
+ mes "Did you see my";
+ mes "daddy at the lab?";
+ mes "Tell him I said hi!";
+ set bioeth,6;
+ close;
+ }
+ mes "[Golin]";
+ mes "Where's daddy?";
+ mes "I really want";
+ mes "daddy to come back";
+ mes "from the lab.";
+ close;
} \ No newline at end of file
diff --git a/npc/quests/skills/archer_skills.txt b/npc/quests/skills/archer_skills.txt
index 42b012fa4..934916cf0 100644
--- a/npc/quests/skills/archer_skills.txt
+++ b/npc/quests/skills/archer_skills.txt
@@ -1,213 +1,213 @@
-//===== eAthena Script =======================================
-//= Archer Skill Quest
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Arrow crafting, Arrow Repel skills
-//===== Additional Comments: =================================
-//= v1.0 Roberto message text is based off RO npc. Jason message
-//= text is custom from old version.
-//= All items are from official quests though.[kobra_k88]
-//= v1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.[kobra_k88]
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Fixed exploits [Lupus]
-//= 1.4a Fixed some typos [IVBela]
-//= 1.4b changed perm. variables to temp ones [Lupus]
-//============================================================
-
-
-
-//<======================== Roberto: Arrow crafting =========================>\\
-morocc.gat,121,109,5 script Roberto 88,{
- mes "[Roberto]";
- if(baseClass == Job_Archer) goto L_Start;
-
-L_Other:
- mes "Eh?... First time seeing an archer or something? Why don't you just";
- mes "go about your business and leave me be. I only talk to high level";
- mes "Archer types........";
- emotion e_what;
- close;
-L_Start:
- if(BaseJob==Job_Archer && JobLevel<30) goto L_LowLvl;
- if(getskilllv(147)>0) goto L_GotSkill;
- if(@ARWCRFT) goto L_GetSkill;
- mes "Hmmm?.... Oh you seem to be a high level Archer type. Why don't we";
- mes "converse for a while, eh? Let me start off by talking about my";
- mes "childhood.... . . . . . . . . . . .";
- next;
- mes "[Roberto]";
- mes "When I turned 15, I decided I'd work for a Blacksmith........";
- next;
- mes "[Roberto]";
- mes "............... ~(blah blah blah)~...................";
- next;
- mes "[Roberto]";
- mes ".... man was my Junior Prom a mess...........";
- next;
- mes "[Roberto]";
- mes "..~(blah blah)~........ ~(blah blah)~.........";
- next;
- mes "(many grueling hours later.....)";
- next;
- mes "[Roberto]";
- mes "So that's how I found out how to create all of these different";
- mes "kinds of arrows for myself. It definitely comes in handy.";
- next;
- mes "[Roberto]";
- mes "Say, would you like me to teach you? We've had such a nice talk";
- mes "that I feel like can trust you with this knowledge.......";
- next;
- menu "Zzz... Eh!! Uh, Arrows... making... yes, teach.",M_0, "Zzzzz... Eh! Uh... where am I????",M_1;
-
- M_0:
- mes "[Roberto]";
- mes "Alright then! In order for me to teach you the art of ^5533FF'Arrow";
- mes "Crafting'^000000, you must first bring me these items:";
- mes "^FF335520 Resin,";
- mes "7 Poison Spores,";
- mes "41 Pointed Scales,";
- mes "13 Trunks,";
- mes "1 Red potion^000000";
- set @ARWCRFT, 1;
- emotion e_ic;
- close;
- M_1:
- mes "[Roberto]";
- mes "................................................................";
- emotion e_ag;
- next;
- mes "[Roberto]";
- mes "Let me teach you this special skill.... It's called, my boot up";
- mes "your A........";
- emotion e_pif;
- next;
- mes "!!!!SMACK!!!!";
- percentheal -5,0;
- close;
-
-L_GetSkill:
- if((countitem(907)<20) || (countitem(7033)<7) || (countitem(906)<41) || (countitem(1019)<13) || (countitem(501)<1)) goto L_NotEnuf;
- delitem 907, 20;
- delitem 7033, 7;
- delitem 906, 41;
- delitem 1019, 13;
- delitem 501, 1;
- mes "You've brought all of the items... very good. Lets begin.....";
- next;
- mes "~ hands you a very long list of ingredients ~";
- next;
- mes "[Roberto]";
- mes "There you are. You're all set.";
- next;
- mes ".......................";
- next;
- mes "[Roberto]";
- mes "Hmm?...... What do you mean 'that's it'?....... What else were you";
- mes "expecting...... With that list you will be able to make any kind of";
- mes "arrows you want.......";
- next;
- mes "[Roberto]";
- mes "I hope you didn't expect some kind of elaborate ceremony or some";
- mes "kind of unique and lengthy training.......";
- next;
- skill 147,1,0;
- set @ARWCRFT, 0;
- mes "[Roberto]";
- mes "...... Well good luck and have fun making arrows. I've got other";
- mes "things to do if you don't mind.......";
- close;
-
- L_NotEnuf:
- mes "You don't have everything I need.";
- next;
- goto M_0;
-L_GotSkill:
- mes "Hmmm?.... Sorry but I've got nothing left to teach you. Just keep";
- mes "on making those arrows..... For us Archer types there can never be";
- mes "too many arrows.....";
- close;
-L_LowLvl:
- mes "Hmm?... Do you have something to say to me? Unfortunately I have";
- mes "nothing to say to you.....";
- emotion e_what;
- next;
- mes "[Roberto]";
- mes "It's sad but conversations with people who have ^5533FFlow job levels^000000 such";
- mes "as yourself always seem to end abruptly..... Maybe if you trained a";
- mes "little bit longer we would have more to talk about............";
- close;
-}
-
-
-//<============================== Arrow Repel ===============================>\\
-payon.gat,103,63,5 script Jason 88,{
- mes "[Jason]";
- if(baseClass == Job_Archer) goto L_Start;
-
-L_Other:
- mes "What does life need from a lonely lad like me?";
- close;
-L_Start:
- if(getskilllv(148)>0) goto L_GotSkill;
- if(BaseJob == Job_Archer && JobLevel < 35) goto L_LowLvl;
- if(@ARWREP) goto L_Check;
- mes "Hi, I'm the master of the skill ^0033FFArrow Repel^000000. I might be able to";
- mes "teach you the skill, but only if you help me get the ingredients";
- mes "for my Grandma's soup.";
- next;
- mes "[Jason]";
- mes "Arrow Repel allows you to use your arrows to repel, push back, an";
- mes "enemy and keep them at a distance. This is a great skill for us";
- mes "Archer types.";
- next;
-
- L_List:
- mes "[Jason]";
- mes "I need the following:";
- mes "- 2 ^FF0000Emeralds^000000";
- mes "- 3 ^FF0000Yoyo tails^000000";
- mes "- 10 ^FF0000Tentacles^000000";
- mes "- 10 ^FF0000Bill of birds^000000";
- mes "- 36 ^FF0000Banana Juices^000000";
- next;
- mes "[Jason]";
- mes "Hurry hurry!";
- set @ARWREP, 1;
- close;
-
-L_LowLvl:
- mes "Oh I think you're a bit inexperienced to learn anything from me,";
- mes "come back later! Maybe around ^5533FFjob level 35^000000 or so.....";
- close;
-
-L_Check:
- if((countitem(721)<2) || (countitem(942)<3) || (countitem(962)<10) || (countitem(925)<10) || (countitem(532)<36)) goto L_NotEnuf;
- delitem 721,2;
- delitem 942,3;
- delitem 962,10;
- delitem 925,10;
- delitem 532,36;
- mes "OH! Marvelous you brought me all the ingredients!";
- mes "Now it'll be my pleasure to teach you the skill ^0033FFArrow Repel^000000";
- next;
- skill 148,1,0;
- set @ARWREP, 0;
- mes "[Jason]";
- mes "There you go! Happy hunting in the future.";
- close;
-
- L_NotEnuf:
- mes "You don't have everything I need.";
- next;
- goto L_List;
-L_GotSkill:
- mes "Hey! It's you again? I'm afraid I've taught you everything I know.";
- close;
-}
+//===== eAthena Script =======================================
+//= Archer Skill Quest
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Arrow crafting, Arrow Repel skills
+//===== Additional Comments: =================================
+//= v1.0 Roberto message text is based off RO npc. Jason message
+//= text is custom from old version.
+//= All items are from official quests though.[kobra_k88]
+//= v1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.[kobra_k88]
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Fixed exploits [Lupus]
+//= 1.4a Fixed some typos [IVBela]
+//= 1.4b changed perm. variables to temp ones [Lupus]
+//============================================================
+
+
+
+//<======================== Roberto: Arrow crafting =========================>\\
+morocc.gat,121,109,5 script Roberto 88,{
+ mes "[Roberto]";
+ if(baseClass == Job_Archer) goto L_Start;
+
+L_Other:
+ mes "Eh?... First time seeing an archer or something? Why don't you just";
+ mes "go about your business and leave me be. I only talk to high level";
+ mes "Archer types........";
+ emotion e_what;
+ close;
+L_Start:
+ if(BaseJob==Job_Archer && JobLevel<30) goto L_LowLvl;
+ if(getskilllv(147)>0) goto L_GotSkill;
+ if(@ARWCRFT) goto L_GetSkill;
+ mes "Hmmm?.... Oh you seem to be a high level Archer type. Why don't we";
+ mes "converse for a while, eh? Let me start off by talking about my";
+ mes "childhood.... . . . . . . . . . . .";
+ next;
+ mes "[Roberto]";
+ mes "When I turned 15, I decided I'd work for a Blacksmith........";
+ next;
+ mes "[Roberto]";
+ mes "............... ~(blah blah blah)~...................";
+ next;
+ mes "[Roberto]";
+ mes ".... man was my Junior Prom a mess...........";
+ next;
+ mes "[Roberto]";
+ mes "..~(blah blah)~........ ~(blah blah)~.........";
+ next;
+ mes "(many grueling hours later.....)";
+ next;
+ mes "[Roberto]";
+ mes "So that's how I found out how to create all of these different";
+ mes "kinds of arrows for myself. It definitely comes in handy.";
+ next;
+ mes "[Roberto]";
+ mes "Say, would you like me to teach you? We've had such a nice talk";
+ mes "that I feel like can trust you with this knowledge.......";
+ next;
+ menu "Zzz... Eh!! Uh, Arrows... making... yes, teach.",M_0, "Zzzzz... Eh! Uh... where am I????",M_1;
+
+ M_0:
+ mes "[Roberto]";
+ mes "Alright then! In order for me to teach you the art of ^5533FF'Arrow";
+ mes "Crafting'^000000, you must first bring me these items:";
+ mes "^FF335520 Resin,";
+ mes "7 Poison Spores,";
+ mes "41 Pointed Scales,";
+ mes "13 Trunks,";
+ mes "1 Red potion^000000";
+ set @ARWCRFT, 1;
+ emotion e_ic;
+ close;
+ M_1:
+ mes "[Roberto]";
+ mes "................................................................";
+ emotion e_ag;
+ next;
+ mes "[Roberto]";
+ mes "Let me teach you this special skill.... It's called, my boot up";
+ mes "your A........";
+ emotion e_pif;
+ next;
+ mes "!!!!SMACK!!!!";
+ percentheal -5,0;
+ close;
+
+L_GetSkill:
+ if((countitem(907)<20) || (countitem(7033)<7) || (countitem(906)<41) || (countitem(1019)<13) || (countitem(501)<1)) goto L_NotEnuf;
+ delitem 907, 20;
+ delitem 7033, 7;
+ delitem 906, 41;
+ delitem 1019, 13;
+ delitem 501, 1;
+ mes "You've brought all of the items... very good. Lets begin.....";
+ next;
+ mes "~ hands you a very long list of ingredients ~";
+ next;
+ mes "[Roberto]";
+ mes "There you are. You're all set.";
+ next;
+ mes ".......................";
+ next;
+ mes "[Roberto]";
+ mes "Hmm?...... What do you mean 'that's it'?....... What else were you";
+ mes "expecting...... With that list you will be able to make any kind of";
+ mes "arrows you want.......";
+ next;
+ mes "[Roberto]";
+ mes "I hope you didn't expect some kind of elaborate ceremony or some";
+ mes "kind of unique and lengthy training.......";
+ next;
+ skill 147,1,0;
+ set @ARWCRFT, 0;
+ mes "[Roberto]";
+ mes "...... Well good luck and have fun making arrows. I've got other";
+ mes "things to do if you don't mind.......";
+ close;
+
+ L_NotEnuf:
+ mes "You don't have everything I need.";
+ next;
+ goto M_0;
+L_GotSkill:
+ mes "Hmmm?.... Sorry but I've got nothing left to teach you. Just keep";
+ mes "on making those arrows..... For us Archer types there can never be";
+ mes "too many arrows.....";
+ close;
+L_LowLvl:
+ mes "Hmm?... Do you have something to say to me? Unfortunately I have";
+ mes "nothing to say to you.....";
+ emotion e_what;
+ next;
+ mes "[Roberto]";
+ mes "It's sad but conversations with people who have ^5533FFlow job levels^000000 such";
+ mes "as yourself always seem to end abruptly..... Maybe if you trained a";
+ mes "little bit longer we would have more to talk about............";
+ close;
+}
+
+
+//<============================== Arrow Repel ===============================>\\
+payon.gat,103,63,5 script Jason 88,{
+ mes "[Jason]";
+ if(baseClass == Job_Archer) goto L_Start;
+
+L_Other:
+ mes "What does life need from a lonely lad like me?";
+ close;
+L_Start:
+ if(getskilllv(148)>0) goto L_GotSkill;
+ if(BaseJob == Job_Archer && JobLevel < 35) goto L_LowLvl;
+ if(@ARWREP) goto L_Check;
+ mes "Hi, I'm the master of the skill ^0033FFArrow Repel^000000. I might be able to";
+ mes "teach you the skill, but only if you help me get the ingredients";
+ mes "for my Grandma's soup.";
+ next;
+ mes "[Jason]";
+ mes "Arrow Repel allows you to use your arrows to repel, push back, an";
+ mes "enemy and keep them at a distance. This is a great skill for us";
+ mes "Archer types.";
+ next;
+
+ L_List:
+ mes "[Jason]";
+ mes "I need the following:";
+ mes "- 2 ^FF0000Emeralds^000000";
+ mes "- 3 ^FF0000Yoyo tails^000000";
+ mes "- 10 ^FF0000Tentacles^000000";
+ mes "- 10 ^FF0000Bill of birds^000000";
+ mes "- 36 ^FF0000Banana Juices^000000";
+ next;
+ mes "[Jason]";
+ mes "Hurry hurry!";
+ set @ARWREP, 1;
+ close;
+
+L_LowLvl:
+ mes "Oh I think you're a bit inexperienced to learn anything from me,";
+ mes "come back later! Maybe around ^5533FFjob level 35^000000 or so.....";
+ close;
+
+L_Check:
+ if((countitem(721)<2) || (countitem(942)<3) || (countitem(962)<10) || (countitem(925)<10) || (countitem(532)<36)) goto L_NotEnuf;
+ delitem 721,2;
+ delitem 942,3;
+ delitem 962,10;
+ delitem 925,10;
+ delitem 532,36;
+ mes "OH! Marvelous you brought me all the ingredients!";
+ mes "Now it'll be my pleasure to teach you the skill ^0033FFArrow Repel^000000";
+ next;
+ skill 148,1,0;
+ set @ARWREP, 0;
+ mes "[Jason]";
+ mes "There you go! Happy hunting in the future.";
+ close;
+
+ L_NotEnuf:
+ mes "You don't have everything I need.";
+ next;
+ goto L_List;
+L_GotSkill:
+ mes "Hey! It's you again? I'm afraid I've taught you everything I know.";
+ close;
+}
diff --git a/npc/quests/skills/assassin_skills.txt b/npc/quests/skills/assassin_skills.txt
index a48cdbb47..7b5e4fda1 100644
--- a/npc/quests/skills/assassin_skills.txt
+++ b/npc/quests/skills/assassin_skills.txt
@@ -1,71 +1,71 @@
-//===== eAthena Script =======================================
-//= Assassin Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// ASSASSIN - SONIC ACCELERATION + THROW VENOM KNIFE
-//============================================================
-in_moc_16.gat,14,21,3 script Kiltin 884,{
- mes "[Kiltin]";
- if(BaseJob!=Job_Assassin) goto L_nosin;
- if(getskilllv(1003) && getskilllv(1004)) goto L_alreadyhave;
-
- mes "I'll teach you all I know, but";
- mes "you need to steal some things";
- mes "for me:";
- mes "3 Sapphires";
- mes "1 Ruby";
- next;
-
- mes "[Kiltin]";
- mes "Let me check your items.";
- next;
-
- if(countitem(726)<3 || countitem(723)<1) goto L_noitems;//Items: Sapphire, Ruby,
- delitem 726, 3;//Items: Sapphire,
- delitem 723, 1;//Items: Ruby,
-
- mes "[Kiltin]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1003,1,0;
- skill 1004,1,0;
- close;
-
-L_noitems:
- mes "[Kiltin]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nosin:
- mes "Sorry, but I'm on service of Shadowmen.";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-}
-
+//===== eAthena Script =======================================
+//= Assassin Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// ASSASSIN - SONIC ACCELERATION + THROW VENOM KNIFE
+//============================================================
+in_moc_16.gat,14,21,3 script Kiltin 884,{
+ mes "[Kiltin]";
+ if(BaseJob!=Job_Assassin) goto L_nosin;
+ if(getskilllv(1003) && getskilllv(1004)) goto L_alreadyhave;
+
+ mes "I'll teach you all I know, but";
+ mes "you need to steal some things";
+ mes "for me:";
+ mes "3 Sapphires";
+ mes "1 Ruby";
+ next;
+
+ mes "[Kiltin]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(726)<3 || countitem(723)<1) goto L_noitems;//Items: Sapphire, Ruby,
+ delitem 726, 3;//Items: Sapphire,
+ delitem 723, 1;//Items: Ruby,
+
+ mes "[Kiltin]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1003,1,0;
+ skill 1004,1,0;
+ close;
+
+L_noitems:
+ mes "[Kiltin]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nosin:
+ mes "Sorry, but I'm on service of Shadowmen.";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+}
+
diff --git a/npc/quests/skills/bard_skills.txt b/npc/quests/skills/bard_skills.txt
index 713d4d051..0dfb3b7ef 100644
--- a/npc/quests/skills/bard_skills.txt
+++ b/npc/quests/skills/bard_skills.txt
@@ -1,71 +1,71 @@
-//===== eAthena Script =======================================
-//= Bard Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// BARD - PANG VOICE
-//============================================================
-prontera.gat,134,328,7 script Timid man 89,{
- mes "[Timid man]";
- if(BaseJob!=Job_Bard) goto L_nobard;
- if(getskilllv(1010)) goto L_alreadyhave;
- if(JobLevel<40) goto L_nojob;
-
- mes "I'll teach you all I know, but";
- mes "I'm a little thirsty. Bring me";
- mes "1 Tropical Sograt";
- next;
-
- mes "[Timid man]";
- mes "Let me check your items.";
- next;
-
- if (countitem(12112)<1) goto L_noitems;//Items: Tropical_Sograt,
- delitem 12112, 1;//Items: Tropical_Sograt,
- mes "[Timid man]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1010,1,0;
- close;
-
-L_noitems:
- mes "[Timid man]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nobard:
- mes "Hum... you don't seem to be a musician";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-
-L_nojob:
- mes "Come back when you've learned";
- mes "more about being a Bard.";
- close;
-}
+//===== eAthena Script =======================================
+//= Bard Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// BARD - PANG VOICE
+//============================================================
+prontera.gat,134,328,7 script Timid man 89,{
+ mes "[Timid man]";
+ if(BaseJob!=Job_Bard) goto L_nobard;
+ if(getskilllv(1010)) goto L_alreadyhave;
+ if(JobLevel<40) goto L_nojob;
+
+ mes "I'll teach you all I know, but";
+ mes "I'm a little thirsty. Bring me";
+ mes "1 Tropical Sograt";
+ next;
+
+ mes "[Timid man]";
+ mes "Let me check your items.";
+ next;
+
+ if (countitem(12112)<1) goto L_noitems;//Items: Tropical_Sograt,
+ delitem 12112, 1;//Items: Tropical_Sograt,
+ mes "[Timid man]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1010,1,0;
+ close;
+
+L_noitems:
+ mes "[Timid man]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nobard:
+ mes "Hum... you don't seem to be a musician";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+
+L_nojob:
+ mes "Come back when you've learned";
+ mes "more about being a Bard.";
+ close;
+}
diff --git a/npc/quests/skills/blacksmith_skills.txt b/npc/quests/skills/blacksmith_skills.txt
index e0e6d305c..e46455771 100644
--- a/npc/quests/skills/blacksmith_skills.txt
+++ b/npc/quests/skills/blacksmith_skills.txt
@@ -1,141 +1,141 @@
-//===== eAthena Script =======================================
-//= Blacksmith Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// BLACKSMITH SKILL - GREED + UNFAIR TRICK
-//============================================================
-//== GOODDAY - GREED SKILL ===================================
-geffen.gat,172,53,7 script Goodday 826,{
- mes "[Goodday]";
- if(BaseJob!=Job_Blacksmith) goto L_nosmith;
- if(getskilllv(1013)) goto L_alreadyhave;
- if(Weight < 5000 || (Weight > MaxWeight-MaxWeight/10)) goto L_notstrong;
-
- mes "You look pretty strong, so I'll";
- mes "teach you a little trick I found";
- mes "while watching some wizards move";
- mes "things around without lifting a";
- mes "finger!";
- skill 1013,1,0;
- close;
-
-L_notstrong:
- mes "Come back when you're strong";
- mes "enough to handle the weight";
- mes "of my ability. You will need";
- mes "to be able to carry over 5000";
- mes "weight, and not be over 90%.";
- close;
-
-L_nosmith:
- mes "Geffen is such a great town.";
- mes "Don't you think so too?";
- next;
- emotion e_omg;
- mes "[Goodday]";
- mes "WHAT...";
- mes "You don't!";
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know, so I";
- mes "need to get back to my";
- mes "work.";
- close;
-}
-
-//== AKI - UNFAIR TRICK SKILL ==================================
-geffen.gat,178,72,7 script Aki 726,{
- mes "[Aki]";
- if(BaseJob!=Job_Blacksmith) goto L_nosmith;
- if(getskilllv(1012)) goto L_alreadyhave;
- if(getskilllv(1013)<1) goto L_nogreed;
- if(JobLevel<30) goto L_nojob;
- mes "We're going to need a few things";
- mes "for this lesson. Bring me:";
- mes "2 Steel";
- mes "8 Coal";
- mes "2 Iron Hammers";
- mes "1 Detrimindexta";
- mes "500 Zeny";
- next;
-
- mes "[Aki]";
- mes "Let me check your items.";
- next;
-
- if(countitem(999)<2 || countitem(1003)<8 || countitem(613)<2 || countitem(971)<1 || zeny<500) goto L_noitems;//Items: Steel, Coal, Iron_Hammer, Detrimindexta,
- delitem 999, 2;//Items: Steel,
- delitem 1003, 8;//Items: Coal,
- delitem 613, 2;//Items: Iron_Hammer,
- delitem 971, 1;//Items: Detrimindexta,
- set zeny, zeny-500;
-
- mes "[Aki]";
- mes "Good, You brought everything";
- mes "with you already! We'll start";
- mes "the process now.";
- skill 1012,1,0;
- next;
-
- specialeffect 183;
- mes "Wow, you're a fast learner.";
- mes "Enjoy your new talents!";
- close;
-
-L_noitems:
- mes "[Aki]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nosmith:
- mes "Don't mind Goodday over there.";
- mes "He thinks everyone should like";
- mes "this boring place!";
- emotion e_laugh;
- close;
-
-L_nogreed:
- mes "If you're looking for more";
- mes "to learn, then you should";
- mes "talk to Goodday over there";
- close;
-
-L_alreadyhave:
- mes "WOW, I guess you've learned";
- mes "all that the Blacksmiths of";
- mes "Geffen can teach. Good luck";
- mes "with your travels.";
- close;
-
-L_nojob:
- mes "Come back when you've learned";
- mes "more about being a Blacksmith.";
- mes "You will need a Job level of at";
- mes "least lv 30 to learn what I";
- mes "know.";
- close;
-}
+//===== eAthena Script =======================================
+//= Blacksmith Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// BLACKSMITH SKILL - GREED + UNFAIR TRICK
+//============================================================
+//== GOODDAY - GREED SKILL ===================================
+geffen.gat,172,53,7 script Goodday 826,{
+ mes "[Goodday]";
+ if(BaseJob!=Job_Blacksmith) goto L_nosmith;
+ if(getskilllv(1013)) goto L_alreadyhave;
+ if(Weight < 5000 || (Weight > MaxWeight-MaxWeight/10)) goto L_notstrong;
+
+ mes "You look pretty strong, so I'll";
+ mes "teach you a little trick I found";
+ mes "while watching some wizards move";
+ mes "things around without lifting a";
+ mes "finger!";
+ skill 1013,1,0;
+ close;
+
+L_notstrong:
+ mes "Come back when you're strong";
+ mes "enough to handle the weight";
+ mes "of my ability. You will need";
+ mes "to be able to carry over 5000";
+ mes "weight, and not be over 90%.";
+ close;
+
+L_nosmith:
+ mes "Geffen is such a great town.";
+ mes "Don't you think so too?";
+ next;
+ emotion e_omg;
+ mes "[Goodday]";
+ mes "WHAT...";
+ mes "You don't!";
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know, so I";
+ mes "need to get back to my";
+ mes "work.";
+ close;
+}
+
+//== AKI - UNFAIR TRICK SKILL ==================================
+geffen.gat,178,72,7 script Aki 726,{
+ mes "[Aki]";
+ if(BaseJob!=Job_Blacksmith) goto L_nosmith;
+ if(getskilllv(1012)) goto L_alreadyhave;
+ if(getskilllv(1013)<1) goto L_nogreed;
+ if(JobLevel<30) goto L_nojob;
+ mes "We're going to need a few things";
+ mes "for this lesson. Bring me:";
+ mes "2 Steel";
+ mes "8 Coal";
+ mes "2 Iron Hammers";
+ mes "1 Detrimindexta";
+ mes "500 Zeny";
+ next;
+
+ mes "[Aki]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(999)<2 || countitem(1003)<8 || countitem(613)<2 || countitem(971)<1 || zeny<500) goto L_noitems;//Items: Steel, Coal, Iron_Hammer, Detrimindexta,
+ delitem 999, 2;//Items: Steel,
+ delitem 1003, 8;//Items: Coal,
+ delitem 613, 2;//Items: Iron_Hammer,
+ delitem 971, 1;//Items: Detrimindexta,
+ set zeny, zeny-500;
+
+ mes "[Aki]";
+ mes "Good, You brought everything";
+ mes "with you already! We'll start";
+ mes "the process now.";
+ skill 1012,1,0;
+ next;
+
+ specialeffect 183;
+ mes "Wow, you're a fast learner.";
+ mes "Enjoy your new talents!";
+ close;
+
+L_noitems:
+ mes "[Aki]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nosmith:
+ mes "Don't mind Goodday over there.";
+ mes "He thinks everyone should like";
+ mes "this boring place!";
+ emotion e_laugh;
+ close;
+
+L_nogreed:
+ mes "If you're looking for more";
+ mes "to learn, then you should";
+ mes "talk to Goodday over there";
+ close;
+
+L_alreadyhave:
+ mes "WOW, I guess you've learned";
+ mes "all that the Blacksmiths of";
+ mes "Geffen can teach. Good luck";
+ mes "with your travels.";
+ close;
+
+L_nojob:
+ mes "Come back when you've learned";
+ mes "more about being a Blacksmith.";
+ mes "You will need a Job level of at";
+ mes "least lv 30 to learn what I";
+ mes "know.";
+ close;
+}
diff --git a/npc/quests/skills/crusader_skills.txt b/npc/quests/skills/crusader_skills.txt
index fd215d761..33f16e981 100644
--- a/npc/quests/skills/crusader_skills.txt
+++ b/npc/quests/skills/crusader_skills.txt
@@ -1,107 +1,107 @@
-//===== eAthena Script =======================================
-//= Crusader Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// CRUSADER SKILL - SHRINK
-//============================================================
-geffen.gat,110,118,3 script Ford 752,{
- mes "[Ford]";
- if(BaseJob!=Job_Crusader) goto L_nocruz;
- if(getskilllv(1002)) goto L_alreadyhave;
- mes "Maybe I'll teach you a little skill";
- mes "if you bring me a few things...";
- mes "Bring me these items and we'll";
- mes "see if I feel like giving it to you.";
- next;
- mes "[Ford]";
- mes "1 Red Potion";
- mes "20 Sticky Mucus";
- mes "3 Empty Bottles";
- mes "5 Jellopies";
- mes "1 Unripe Apple";
- mes "1 Grape";
- mes "1 Coal";
- mes "3 Cyfars";
- next;
-
- mes "[Ford]";
- mes "Let me check your items.";
- next;
-
- if(countitem(501)<1 || countitem(938)<20 || countitem(713)<3 || countitem(909)<5 || countitem(619)<1 || countitem(514)<1 || countitem(1003)<1 || countitem(7053)<3)goto L_noitems;//Items: Red_Potion, Sticky_Mucus, Empty_Bottle, Jellopy, Unripe_Apple, Grape, Coal, Cyfar,
- delitem 501, 1;//Items: Red_Potion,
- delitem 938, 20;//Items: Sticky_Mucus,
- delitem 713, 3;//Items: Empty_Bottle,
- delitem 909, 5;//Items: Jellopy,
- delitem 619, 1;//Items: Unripe_Apple,
- delitem 514, 1;//Items: Grape,
- delitem 1003, 1;//Items: Coal,
- delitem 7053, 3;//Items: Cyfar,
- mes "[Ford]";
- mes "Time to roll my lucky dice.";
- mes "Good luck, I almost never lose.";
-//TODO: add DICE emotions? 8)
- emotion e_gg;
- next;
- if(rand(1,6)!=3) goto L_lose;
- emotion 58;
- next;
-
- skill 1002,1,0;
- mes "[Ford]";
- mes "I can't believe I lost!";
- mes "I NEVER lose...";
- emotion e_sob;
- close;
-
-L_noitems:
- mes "[Ford]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_lose:
- emotion 63;
- next;
- mes "[Ford]";
- mes "I win again!!";
- mes "I'm not teaching you";
- mes "anything this time. Come";
- mes "back if you want to Try";
- mes "again";
- close;
-
-L_nocruz:
- mes "If you are not a Crusader,";
- mes "then you have no business";
- mes "with me...";
- close;
-
-L_alreadyhave:
- mes "Hey, you were lucky I";
- mes "even taught you the";
- mes "skill I did! Don't press";
- mes "your luck.";
- close;
-}
+//===== eAthena Script =======================================
+//= Crusader Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// CRUSADER SKILL - SHRINK
+//============================================================
+geffen.gat,110,118,3 script Ford 752,{
+ mes "[Ford]";
+ if(BaseJob!=Job_Crusader) goto L_nocruz;
+ if(getskilllv(1002)) goto L_alreadyhave;
+ mes "Maybe I'll teach you a little skill";
+ mes "if you bring me a few things...";
+ mes "Bring me these items and we'll";
+ mes "see if I feel like giving it to you.";
+ next;
+ mes "[Ford]";
+ mes "1 Red Potion";
+ mes "20 Sticky Mucus";
+ mes "3 Empty Bottles";
+ mes "5 Jellopies";
+ mes "1 Unripe Apple";
+ mes "1 Grape";
+ mes "1 Coal";
+ mes "3 Cyfars";
+ next;
+
+ mes "[Ford]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(501)<1 || countitem(938)<20 || countitem(713)<3 || countitem(909)<5 || countitem(619)<1 || countitem(514)<1 || countitem(1003)<1 || countitem(7053)<3)goto L_noitems;//Items: Red_Potion, Sticky_Mucus, Empty_Bottle, Jellopy, Unripe_Apple, Grape, Coal, Cyfar,
+ delitem 501, 1;//Items: Red_Potion,
+ delitem 938, 20;//Items: Sticky_Mucus,
+ delitem 713, 3;//Items: Empty_Bottle,
+ delitem 909, 5;//Items: Jellopy,
+ delitem 619, 1;//Items: Unripe_Apple,
+ delitem 514, 1;//Items: Grape,
+ delitem 1003, 1;//Items: Coal,
+ delitem 7053, 3;//Items: Cyfar,
+ mes "[Ford]";
+ mes "Time to roll my lucky dice.";
+ mes "Good luck, I almost never lose.";
+//TODO: add DICE emotions? 8)
+ emotion e_gg;
+ next;
+ if(rand(1,6)!=3) goto L_lose;
+ emotion 58;
+ next;
+
+ skill 1002,1,0;
+ mes "[Ford]";
+ mes "I can't believe I lost!";
+ mes "I NEVER lose...";
+ emotion e_sob;
+ close;
+
+L_noitems:
+ mes "[Ford]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_lose:
+ emotion 63;
+ next;
+ mes "[Ford]";
+ mes "I win again!!";
+ mes "I'm not teaching you";
+ mes "anything this time. Come";
+ mes "back if you want to Try";
+ mes "again";
+ close;
+
+L_nocruz:
+ mes "If you are not a Crusader,";
+ mes "then you have no business";
+ mes "with me...";
+ close;
+
+L_alreadyhave:
+ mes "Hey, you were lucky I";
+ mes "even taught you the";
+ mes "skill I did! Don't press";
+ mes "your luck.";
+ close;
+}
diff --git a/npc/quests/skills/dancer_skills.txt b/npc/quests/skills/dancer_skills.txt
index 8c933a50c..0f5916094 100644
--- a/npc/quests/skills/dancer_skills.txt
+++ b/npc/quests/skills/dancer_skills.txt
@@ -1,74 +1,74 @@
-//===== eAthena Script =======================================
-//= Dancer Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// DANCER - WINK OF CHARM
-//============================================================
-comodo.gat,205,171,7 script Chanel 724,{
- mes "[Chanel]";
- if(BaseJob!=Job_Dancer) goto L_nodancer;
- if(getskilllv(1011)) goto L_alreadyhave;
- mes "I'll teach you all I know for:";
- mes "1 Crystal Mirror";
- mes "1 Alcohol";
- mes "1 China";
- mes "1 Apple";
- mes "3 Bananas";
- mes "5 Well-baked Cookies";
- next;
-
- mes "[Chanel]";
- mes "Let me check your items.";
- next;
-
- if(countitem(747)<1 || countitem(970)<1 || countitem(736)<1 || countitem(512)<1 || countitem(513)<3 || countitem(538)<5) goto L_noitems;//Items: Crystal_Mirror, Alcohol, China, Apple, Banana, Well-baked_Cookie,
- delitem 747, 1;//Items: Crystal_Mirror,
- delitem 970, 1;//Items: Alcohol,
- delitem 736, 1;//Items: China,
- delitem 512, 1;//Items: Apple,
- delitem 513, 3;//Items: Banana,
- delitem 538, 5;//Items: Well-baked_Cookie,
-
- mes "[Chanel]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1011,1,0;
- close;
-
-L_noitems:
- mes "[Chanel]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nodancer:
- mes "Hum... you don't seem to be a musician";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-}
+//===== eAthena Script =======================================
+//= Dancer Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// DANCER - WINK OF CHARM
+//============================================================
+comodo.gat,205,171,7 script Chanel 724,{
+ mes "[Chanel]";
+ if(BaseJob!=Job_Dancer) goto L_nodancer;
+ if(getskilllv(1011)) goto L_alreadyhave;
+ mes "I'll teach you all I know for:";
+ mes "1 Crystal Mirror";
+ mes "1 Alcohol";
+ mes "1 China";
+ mes "1 Apple";
+ mes "3 Bananas";
+ mes "5 Well-baked Cookies";
+ next;
+
+ mes "[Chanel]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(747)<1 || countitem(970)<1 || countitem(736)<1 || countitem(512)<1 || countitem(513)<3 || countitem(538)<5) goto L_noitems;//Items: Crystal_Mirror, Alcohol, China, Apple, Banana, Well-baked_Cookie,
+ delitem 747, 1;//Items: Crystal_Mirror,
+ delitem 970, 1;//Items: Alcohol,
+ delitem 736, 1;//Items: China,
+ delitem 512, 1;//Items: Apple,
+ delitem 513, 3;//Items: Banana,
+ delitem 538, 5;//Items: Well-baked_Cookie,
+
+ mes "[Chanel]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1011,1,0;
+ close;
+
+L_noitems:
+ mes "[Chanel]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nodancer:
+ mes "Hum... you don't seem to be a musician";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+}
diff --git a/npc/quests/skills/hunter_skills.txt b/npc/quests/skills/hunter_skills.txt
index e2e639c2a..eaed585d6 100644
--- a/npc/quests/skills/hunter_skills.txt
+++ b/npc/quests/skills/hunter_skills.txt
@@ -1,88 +1,88 @@
-//===== eAthena Script =======================================
-//= Hunter Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//= 1.3c Fixed some typos [IVBela]
-//============================================================
-
-
-//============================================================
-// HUNTER SKILL - PHANTASMIC ARROW
-//============================================================
-payon_in02.gat,54,13,7 script Master Kabac 55,{
- mes "[Master Kabac]";
- if(BaseJob!=Job_Hunter) goto L_hunterno;
- if(getskilllv(1009)) goto L_alreadyhave;
- if(JobLevel<40) goto L_nojob;
-
- mes "I can teach you a secret";
- mes "technique passed down through";
- mes "my family for generations. My";
- mes "family has guarded this secret";
- mes "for years, but I could teach";
- mes "for a few supplies.";
- next;
- mes "[Master Kabac]";
- mes "I am running low on on a few";
- mes "things. Here is my list:";
- mes "5 Cursed Rubys";
- mes "5 Harpy's Feathers";
- mes "30 Pet Food";
- next;
-
- mes "[Master Kabac]";
- mes "Let me check your items.";
- next;
-
- if(countitem(724)<5 || countitem(7115)<5 || countitem(537)<30) goto L_noitems;//Items: Cursed_Ruby, Harpy_Feather, Pet_Food,
- delitem 724, 5;//Items: Cursed_Ruby,
- delitem 7115, 5;//Items: Harpy_Feather,
- delitem 537, 30;//Items: Pet_Food,
-
- mes "[Master Kabac]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1009,1,0;
- close;
-
-L_noitems:
- mes "[Master Kabac]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nojob:
- mes "Come back when you've Learned";
- mes "more about being a Hunter.";
- mes "You need to have at least 40";
- mes "levels as a hunter first.";
- close;
-
-L_alreadyhave:
- mes "Ahh, my apprentice, you";
- mes "came to visit me...";
- close;
-
-L_hunterno:
- mes "Is there something I can";
- mes "help you with? I believe";
- mes "you have the wrong old man.";
- close;
-}
+//===== eAthena Script =======================================
+//= Hunter Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//= 1.3c Fixed some typos [IVBela]
+//============================================================
+
+
+//============================================================
+// HUNTER SKILL - PHANTASMIC ARROW
+//============================================================
+payon_in02.gat,54,13,7 script Master Kabac 55,{
+ mes "[Master Kabac]";
+ if(BaseJob!=Job_Hunter) goto L_hunterno;
+ if(getskilllv(1009)) goto L_alreadyhave;
+ if(JobLevel<40) goto L_nojob;
+
+ mes "I can teach you a secret";
+ mes "technique passed down through";
+ mes "my family for generations. My";
+ mes "family has guarded this secret";
+ mes "for years, but I could teach";
+ mes "for a few supplies.";
+ next;
+ mes "[Master Kabac]";
+ mes "I am running low on on a few";
+ mes "things. Here is my list:";
+ mes "5 Cursed Rubys";
+ mes "5 Harpy's Feathers";
+ mes "30 Pet Food";
+ next;
+
+ mes "[Master Kabac]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(724)<5 || countitem(7115)<5 || countitem(537)<30) goto L_noitems;//Items: Cursed_Ruby, Harpy_Feather, Pet_Food,
+ delitem 724, 5;//Items: Cursed_Ruby,
+ delitem 7115, 5;//Items: Harpy_Feather,
+ delitem 537, 30;//Items: Pet_Food,
+
+ mes "[Master Kabac]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1009,1,0;
+ close;
+
+L_noitems:
+ mes "[Master Kabac]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nojob:
+ mes "Come back when you've Learned";
+ mes "more about being a Hunter.";
+ mes "You need to have at least 40";
+ mes "levels as a hunter first.";
+ close;
+
+L_alreadyhave:
+ mes "Ahh, my apprentice, you";
+ mes "came to visit me...";
+ close;
+
+L_hunterno:
+ mes "Is there something I can";
+ mes "help you with? I believe";
+ mes "you have the wrong old man.";
+ close;
+}
diff --git a/npc/quests/skills/knight_skills.txt b/npc/quests/skills/knight_skills.txt
index e5e29d781..b8431e718 100644
--- a/npc/quests/skills/knight_skills.txt
+++ b/npc/quests/skills/knight_skills.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= Knight Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// KNIGHT - CHARGE ATTACK
-//============================================================
-prt_in.gat,84,98,3 script Esope 734,{
- mes "[Esope]";
- if(BaseJob!=Job_Knight) goto L_noknight;
- if(getskilllv(1001)) goto L_alreadyhave;
-
- mes "I'll teach you all I know for:";
- mes "5 Candy canes";
- mes "3 Witherless Roses";
- next;
-
- mes "[Esope]";
- mes "Let me check your items.";
- next;
-
- if(countitem(530)<5 || countitem(748)<3)goto L_noitems;//Items: Candy_Cane, Witherless_Rose,
- delitem 530, 5;//Items: Candy_Cane,
- delitem 748, 3;//Items: Witherless_Rose,
-
- mes "[Esope]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1001,1,0;
- close;
-
-L_noitems:
- mes "[Esope]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_noknight:
- mes "Looking for your master?";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-}
+//===== eAthena Script =======================================
+//= Knight Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// KNIGHT - CHARGE ATTACK
+//============================================================
+prt_in.gat,84,98,3 script Esope 734,{
+ mes "[Esope]";
+ if(BaseJob!=Job_Knight) goto L_noknight;
+ if(getskilllv(1001)) goto L_alreadyhave;
+
+ mes "I'll teach you all I know for:";
+ mes "5 Candy canes";
+ mes "3 Witherless Roses";
+ next;
+
+ mes "[Esope]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(530)<5 || countitem(748)<3)goto L_noitems;//Items: Candy_Cane, Witherless_Rose,
+ delitem 530, 5;//Items: Candy_Cane,
+ delitem 748, 3;//Items: Witherless_Rose,
+
+ mes "[Esope]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1001,1,0;
+ close;
+
+L_noitems:
+ mes "[Esope]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_noknight:
+ mes "Looking for your master?";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+}
diff --git a/npc/quests/skills/mage_skills.txt b/npc/quests/skills/mage_skills.txt
index 7b94c3deb..608c2a9b5 100644
--- a/npc/quests/skills/mage_skills.txt
+++ b/npc/quests/skills/mage_skills.txt
@@ -1,118 +1,118 @@
-//===== eAthena Script =======================================
-//= Mage Skill Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.[kobra_k88]
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Fixed exploit [Lupus]
-//= 1.4a Fixed some typos [IVBela]
-//= 1.4b changed perm. variables to temp ones [Lupus]
-//============================================================
-
-
-
-geffen_in.gat,151,119,4 script BLIZZARDRISS 71,{
- mes "[BLIZZARDRISS]";
- if(baseClass == Job_Mage) goto L_Start;
-
-L_Other:
- mes "What new magic spells will I discover today......??";
- emotion e_hmm;
- close;
-
-L_Start:
- if(@ENRGYCOAT) goto L_GetSkill;
- if(getskilllv(157)>0) goto L_GotSkill;
- mes "Hey! My friend! I see that you are a magic user. If you look within yourself, you'll find that you have... 'HIDDEN ABILITIES'!!";
- next;
- menu "'Hidden Abilities'.....?",M_0, "End Conversation.",M_End;
-
- M_0:
- mes "[BLIZZARDRISS]";
- mes "For many years I studied the ancient magic of Geffen, and I recently re-discovered a forgotten magic spell that is quite useful.";
- next;
- mes "[BLIZZARDRISS]";
- mes "The spell uses your 'pyschokinetic energy' to 'coat' your body in a magical shield, protecting you from enemy attacks.";
- next;
- mes "[BLIZZARDRISS]";
- mes "Only highly trained magic users can learn this amazing spell.";
- mes "Those who want to use this spell must tap into the hidden energies and abilities buried deep within!";
- next;
- mes "[BLIZZARDRISS]";
- mes "The spell is called ^5555FF'Energy Coat'^000000!. Would you like me to teach it to you?";
- next;
- menu "Wow! Sounds great!",sM_0, "Meh... not interested.",sM_End;
-
- sM_0:
- mes "[BLIZZARDRISS]";
- mes "In order for me to teach you this spell I will need the following items:";
- mes "^5533FF 3 Glass Beads,";
- mes " 1 One Carat Diamond,";
- mes " 5 Shells,^000000";
- mes " and ^5533FF1 Solid shell^000000.";
- next;
- mes "[BLIZZARDRISS]";
- mes "You will also need to have a sufficient amount of experience. For Mages, a job level of at least 35 is needed.";
- mes "Wizards and Sages are high level magic users and can learn the skill at any job level.";
- next;
- mes "[BLIZZARDRISS]";
- mes "When you are fully trained and have all of the required items come back and see me.";
- set @ENRGYCOAT, 1;
- close;
-
- sM_End:
- mes "[BLIZZARDRISS]";
- mes "Hmf! Suit yourself. Don't come complaining to me when get beat up by a bunch of spores!!";
- emotion e_an;
- close;
-
- M_End:
- mes "[BLIZZARDRISS]";
- mes "The wise man must have patience! Prepare yourself and return when you are ready.";
- close;
-
-L_GetSkill:
- if(BaseJob==Job_Mage && JobLevel < 35) goto L_JobLvl;
- if(countitem(746)<3 || countitem(730)<1 || countitem(935)<5 || countitem(943)<1) goto L_Items;
- delitem 746,3;
- delitem 730,1;
- delitem 935,5;
- delitem 943,1;
- mes "Ohh my, ohh my...... This is going to be swell. Hand over the items... Thank you.";
- next;
- mes "~ several hours later ~";
- next;
- skill 157,1,0;
- set @ENRGYCOAT,0;
- mes "[BLIZZARDRISS]";
- mes "You can now use the spell, 'Energy Coat'!! Use it wisely my friend!";
- emotion e_no1;
- close;
-
- L_JobLvl:
- mes "Didn't you listen to my explanation? You need a job level of at least 35 to learn 'Energy Coat'.";
- emotion e_what;
- close;
-
- L_Items:
- mes "Didn't you listen to my explanation? You need the following items for me to teach you 'Energy Coat':";
- mes "^5533FF 3 Glass Beads,";
- mes " 1 One Carat Diamond,";
- mes " 5 Shells,^000000";
- mes " and ^5533FF1 Solid shell^000000.";
- emotion e_what;
- close;
-
-L_GotSkill:
- mes "Well hello there. The 'Energy Coat' skill is great, isn't it? Anyway, good luck with your journey.";
- close;
-}
+//===== eAthena Script =======================================
+//= Mage Skill Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.[kobra_k88]
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Fixed exploit [Lupus]
+//= 1.4a Fixed some typos [IVBela]
+//= 1.4b changed perm. variables to temp ones [Lupus]
+//============================================================
+
+
+
+geffen_in.gat,151,119,4 script BLIZZARDRISS 71,{
+ mes "[BLIZZARDRISS]";
+ if(baseClass == Job_Mage) goto L_Start;
+
+L_Other:
+ mes "What new magic spells will I discover today......??";
+ emotion e_hmm;
+ close;
+
+L_Start:
+ if(@ENRGYCOAT) goto L_GetSkill;
+ if(getskilllv(157)>0) goto L_GotSkill;
+ mes "Hey! My friend! I see that you are a magic user. If you look within yourself, you'll find that you have... 'HIDDEN ABILITIES'!!";
+ next;
+ menu "'Hidden Abilities'.....?",M_0, "End Conversation.",M_End;
+
+ M_0:
+ mes "[BLIZZARDRISS]";
+ mes "For many years I studied the ancient magic of Geffen, and I recently re-discovered a forgotten magic spell that is quite useful.";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "The spell uses your 'pyschokinetic energy' to 'coat' your body in a magical shield, protecting you from enemy attacks.";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "Only highly trained magic users can learn this amazing spell.";
+ mes "Those who want to use this spell must tap into the hidden energies and abilities buried deep within!";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "The spell is called ^5555FF'Energy Coat'^000000!. Would you like me to teach it to you?";
+ next;
+ menu "Wow! Sounds great!",sM_0, "Meh... not interested.",sM_End;
+
+ sM_0:
+ mes "[BLIZZARDRISS]";
+ mes "In order for me to teach you this spell I will need the following items:";
+ mes "^5533FF 3 Glass Beads,";
+ mes " 1 One Carat Diamond,";
+ mes " 5 Shells,^000000";
+ mes " and ^5533FF1 Solid shell^000000.";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "You will also need to have a sufficient amount of experience. For Mages, a job level of at least 35 is needed.";
+ mes "Wizards and Sages are high level magic users and can learn the skill at any job level.";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "When you are fully trained and have all of the required items come back and see me.";
+ set @ENRGYCOAT, 1;
+ close;
+
+ sM_End:
+ mes "[BLIZZARDRISS]";
+ mes "Hmf! Suit yourself. Don't come complaining to me when get beat up by a bunch of spores!!";
+ emotion e_an;
+ close;
+
+ M_End:
+ mes "[BLIZZARDRISS]";
+ mes "The wise man must have patience! Prepare yourself and return when you are ready.";
+ close;
+
+L_GetSkill:
+ if(BaseJob==Job_Mage && JobLevel < 35) goto L_JobLvl;
+ if(countitem(746)<3 || countitem(730)<1 || countitem(935)<5 || countitem(943)<1) goto L_Items;
+ delitem 746,3;
+ delitem 730,1;
+ delitem 935,5;
+ delitem 943,1;
+ mes "Ohh my, ohh my...... This is going to be swell. Hand over the items... Thank you.";
+ next;
+ mes "~ several hours later ~";
+ next;
+ skill 157,1,0;
+ set @ENRGYCOAT,0;
+ mes "[BLIZZARDRISS]";
+ mes "You can now use the spell, 'Energy Coat'!! Use it wisely my friend!";
+ emotion e_no1;
+ close;
+
+ L_JobLvl:
+ mes "Didn't you listen to my explanation? You need a job level of at least 35 to learn 'Energy Coat'.";
+ emotion e_what;
+ close;
+
+ L_Items:
+ mes "Didn't you listen to my explanation? You need the following items for me to teach you 'Energy Coat':";
+ mes "^5533FF 3 Glass Beads,";
+ mes " 1 One Carat Diamond,";
+ mes " 5 Shells,^000000";
+ mes " and ^5533FF1 Solid shell^000000.";
+ emotion e_what;
+ close;
+
+L_GotSkill:
+ mes "Well hello there. The 'Energy Coat' skill is great, isn't it? Anyway, good luck with your journey.";
+ close;
+}
diff --git a/npc/quests/skills/merchant_skills.txt b/npc/quests/skills/merchant_skills.txt
index fb25388b0..15e1ba000 100644
--- a/npc/quests/skills/merchant_skills.txt
+++ b/npc/quests/skills/merchant_skills.txt
@@ -1,307 +1,307 @@
-//===== eAthena Script =======================================
-//= Merchant Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Bug fixes
-//= v1.a Now using functions found in "Global_Functions.txt"
-//= for class checks.[kobra_k88]
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Fixed exploits [Lupus]
-//= 1.4a Fixed some typos [IVBela] 1.4b Gershaun -> Gershuan
-//= changed perm. variables to temp ones [Lupus]
-//============================================================
-
-
-
-//--------------------------------------- Necko: Crazy Uproar--------------------------------\\
-alberta.gat,89,96,5 script Necko#01 139,0,4,{
- mes "[!?]";
- mes "Muahahahahhhahahahahhahah!!";
- mes "Pukakakakakkakakakakakakaka!!";
- close;
-}
-
-alberta.gat,83,96,5 script Necko#02 98,{
- mes "[Necko]";
- if(baseClass == Job_Merchant) goto L_Start;
-
-L_Other:
- mes "Necko's store is closed right now. Come back later..... Hehe....";
- close;
-
-L_Start:
- if(getskilllv(155)>0) goto L_GotSkill;
- if(@CRAZYROAR) goto L_GetSkill;
- mes "Oh! Did you come here because you were intrigued by my boisterous voice? My voice is quite loud, isn't it?";
- mes "After all you heared it from a far off distance.";
- emotion e_what;
- next;
- mes "[Necko]";
- mes "I'll let you in on something....... My voice is more than just loud..... it's actually quite unique......";
- next;
- mes "[Necko]";
- if(BaseJob==Job_Merchant && JobLevel < 15) goto L_JobLvl;
- mes "You see, I know a skill that lets me shout in a way that actually helps me.... It is the ^3355FFCrazy Uproar^000000 skill!!!";
- emotion e_ic;
- next;
- mes "[Necko]";
- mes "Crazy Uproar uses your loud voice to boost your battle spirit!";
- mes "The skill requires ^FF55338 sp^000000 to use and in turn you will receive an additional ^3355FF4 STR for 5 min^000000!!";
- next;
- mes "[Necko]";
- mes "This skill is very useful. To learn it you must learn the essentials of sound. There was a singer in Payon that taught sound theory.......";
- next;
- mes "[Necko]";
- mes "Unfortunately that person passed away so you can no longer learn those essentials..............";
- mes "Aww.... you look disappointed.... Do you really want to learn Crazy Uproar??";
- next;
- mes "[Necko]";
- mes "Hmm..... I will teach you then, that is, if you truly wish to learn. You will have to train your vocal cords.";
- mes "You will also need to gather these items:";
- next;
- mes "[Necko]";
- mes "- ^3355FF7 Pearls,";
- mes "- 1 Banana juice,";
- mes "- 50 Mushroom spores^000000.";
- next;
- mes "[Necko]";
- mes "Come back when you are ready! I think I shall do a little vocal training myself........";
- mes "Bbooowuuuuuuuuuuuuuuuuuuuuuuuuuh!!";
- set @CRAZYROAR, 1;
- close;
-
- L_JobLvl:
- mes "Once you've reached a ^3355FFjob level of 15^000000 come back and see me. I'll tell you all about the secret to my voice.....";
- next;
- mes "[Necko]";
- mes "Uahahahahahahhahahahahahaha!";
- mes "Kyukwakakakakkakakakakakkakaka!";
- close;
-
-L_GetSkill:
- if((countitem(722)<7) || (countitem(532)<1) || (countitem(921)<50)) goto L_Items;
- delitem 722,7;
- delitem 532,1;
- delitem 921,50;
- mes "Oh You've gathered the items! Very good, very good. Now it's time to start your training.....";
- next;
- mes "[Necko]";
- mes "Repeat after me: Fa fa fa fa fa.... So so so so so..... La la la la la.... Mi mi mi mi mi mi......";
- next;
- mes "~several hours later~";
- next;
- mes "[Necko]";
- mes "Raaaaaawwwwrrrrrrrrrrr!....... Ha ha!! Excellent. Your voice is now finely tuned for ^3355FFCrazy Uproar^000000. Good job.";
- skill 155,1,0;
- set @CRAZYROAR, 0;
- emotion e_no1;
- close;
-
- L_Items:
- mes "You need to get these items for Crazy Uproar:";
- mes "- ^3355FF7 Pearls,";
- mes "- 1 Banana juice,";
- mes "- 50 Mushroom spores^000000.";
- close;
-
-L_GotSkill:
- mes "Hello again. I can tell by the sound of your mighty voice that you are becoming very good at Crazy Uproar.";
- close;
-}
-
-
-//----------------------------------------- Charlron: Change cart ---------------------------------\\
-alberta.gat,119,221,6 script Charlron 107,{
- mes "[Charlron]";
- if(baseClass == Job_Merchant) goto L_Start;
-L_Other:
- mes "I am a merchant that deals with many things. My name is Charlron. If you ever find anything interesting, come back and try to negotiate a deal with me.";
- close;
-L_Start:
- if(getskilllv(154)>0) goto L_GotSkill;
- if(@CHANGECART) goto L_GetSkill;
- mes "Welcome young one. Is selling fun for you? I am the merchant Charlron.";
- next;
- mes "[Charlron]";
- mes "Aren't you tired of your old, and plain looking cart? Well I can help.";
- next;
- mes "[Charlon]";
- mes "I have been doing some research on cart design recently and have come up with some new and interesting designs for the cart.";
- next;
- mes "[Charlon]";
- mes "I can change the way your cart looks for you. Of course some conditions need to be met......";
- next;
- mes "[Charlron]";
- if(BaseJob==Job_Merchant && JobLevel < 30) goto L_JobLvl;
- mes "First you will need to bring me these items:";
- mes "^3355FF50 Trunks,";
- mes "20 Animal Skin,";
- mes "10 Iron^000000.";
- set @CHANGECART, 1;
- close;
-
- L_JobLvl:
- mes "I'm a pretty famous merchant, so I don't really do business with beginners but..........";
- mes "Once you've reached ^3355FFjob level 30^000000 I may consider doing business with you.";
- close;
-
-L_GetSkill:
- if((countitem(1019)<50) || (countitem(998)<10) || (countitem(919)<20)) goto L_Items;
- mes "Oh good, you have all of the items. Well here you are..... Hmm?... Oh these are the design sheets for your cart.";
- mes "Now that you have the proper materials, just follow these guides to make your cart look spectacular.";
-// Note: It is not supposed to take these items, just check you have collected them
- skill 154,1,0;
- set @CHANGECART, 0;
- next;
- mes "[Charlron]";
- mes "Good luck, see you around";
- close;
-
- L_Items:
- mes "Come back when you've brought me these items:";
- mes "^3355FF50 Trunks,";
- mes "20 Animal Skin,";
- mes "10 Iron^000000.";
- close;
-L_GotSkill:
- mes "Heh heh... It's nice to see fancy looking carts like yours on the streets of town. Well back to the drawing board....";
- close;
-
-}
-
-
-//-------------------------====-------- Gershaun: Cart Revolution ---------------------------------\\
-alberta.gat,232,106,6 script Gershuan 57,{
- if(baseClass == Job_Merchant) goto L_Start;
-
-L_Other:
- mes "[Gershuan]";
- mes "If it doesn't work, make it work!";
- mes "If it doesn't work, make it work!";
- mes "If it doesn't work, make it work!";
- close;
-
-L_Start:
- if(getskilllv(153)>0) goto L_GotSkill;
- if(@CARTREVO) goto L_GetSkill;
- mes "[Gershuan]";
- mes "Hmm... a young merchant. You must use carts too right? Since you have to do all of that vending..... But is that all you use your cart for?";
- emotion e_hmm;
- next;
- mes "[Gershuan]";
- mes "I researched some ways of using the cart differently. One way involved cooking ramen and another involved jump-roping (don't ask).";
- mes "Still none of my new ideas were satisfactory.";
- next;
- menu "I know what you mean.",M_0, "......???",M_1;
-
- M_0:
- mes "[Gershuan]";
- mes "You KNOW what I MEAN!! HOW the HECK would YOU KNOW what I MEAN????";
- emotion e_omg;
- close;
- M_1:
- mes "[Gershuan]";
- mes "In despair, I wandered through the fields with my cart. Day after day I did this.... I was in a daze....";
- next;
- mes "[Gershuan]";
- mes "Then I crossed paths with a very strong monster! I knew immediately that my life was in danger!";
- mes "I thought to myself, 'Why me! A weaponless, armorless merchant!?'";
- emotion e_gasp;
- next;
- mes "[Gershuan]";
- mes "I was scared to death... hoping that this would not be the end of me. With what strength I had left, I tried a desperation move.....";
- emotion e_swt2;
- next;
- mes "[Gershuan]";
- mes "I used my cart to attack the monster!!";
- emotion e_gasp;
- next;
- mes "[Gershuan]";
- mes "Just like that the monster was defeated!! Finally I had found another excellent use for the cart! A WEAPON!!!";
- next;
- mes "[Gershuan]";
- mes "I called my newly found discovery ^3355FF'Cart Revolution'^000000!";
- mes "By using ^FF553312 sp^000000 you can spin your cart around your body doing major damage to an enemy!";
- emotion e_ic;
- next;
- mes "[Gershuan]";
- mes "The heavier your cart is, the more damage it will do. Would you like to learn this skill?";
- next;
- menu "Yes!!",sM_0, "Actually I want to learn some sushi skills...",sM_1;
-
- sM_0:
- mes "[Gershuan]";
- if(BaseJob==Job_Merchant && JobLevel < 35) goto ssL_LowLvl;
- mes "OK! I will give you the special training for Cart Revolution. The first thing you will have to do is bring me these items:";
- mes "^3355FF30 Sticky Mucus,";
- mes "20 Fly wings,";
- mes "15 Iron,";
- mes "5 Tentacles,";
- mes "2 Grape Juice^000000.";
- next;
- mes "[Gershuan]";
- mes "Come back when you have all of these items. Good luck.";
- set @CARTREVO, 1;
- close;
-
- ssL_LowLvl:
- mes "[Gershuan]";
- mes "OK! I will give you the special training for Cart Revolution.";
- mes "But first you will have to get yourself to a ^3355FFjob level of 35^000000! After you've done that, then we can talk.";
- close;
-
- sM_1:
- mes "[Sushi King Gershuan]";
- mes "Stupid!! You're waaay to young to even try your hand at sushi!!";
- emotion e_an;
- close;
-
-L_GetSkill:
- if((countitem(533)<2) || (countitem(998)<15) || (countitem(938)<30) || (countitem(601)<20) || (countitem(962)<5)) goto sM_0;
- delitem 533,2;
- delitem 998,15;
- delitem 938,30;
- delitem 601,20;
- delitem 962,5;
- mes "[Gershuan]";
- mes "It's good to see you again. I'm glad you were able to get all of the items. Take a minute to prepare, for your training is about to take place....";
- next;
- mes "[Gershuan]";
- mes "First make sure your feet are shoulder width apart. Balance is key! Now get into a good crouch... grasp the handles of the cart firmly but not too tight...";
- next;
- mes "[Gershuan]";
- mes "NOW SWING!!!";
- next;
- mes "[Gershuan]";
- mes "Eh....... that was terrible.... Okay, lets try again.....";
- emotion e_swt;
- next;
- mes "~many hours later~";
- next;
- mes "[Gershuan]";
- mes "YES!!! FINALLY! I could REALLY FEEL the power in that swing!";
- mes "Give yourself a good pat on the back because you have just mastered Cart Revolution!";
- emotion e_no1;
- next;
- skill 153,1,0;
- set @CARTREVO, 0;
- mes "[Gershuan]";
- mes "Take care of yourself and remember to fill that cart up so that it can do some major damage.";
- emotion e_gg;
- close;
-
-L_GotSkill:
- mes "[Gershuan]";
- mes "So how do you like cart revolution? Remember, the ^3355FFheavier^000000 the cart, the ^3355FFgreater^000000 the damage.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Merchant Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Bug fixes
+//= v1.a Now using functions found in "Global_Functions.txt"
+//= for class checks.[kobra_k88]
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Fixed exploits [Lupus]
+//= 1.4a Fixed some typos [IVBela] 1.4b Gershaun -> Gershuan
+//= changed perm. variables to temp ones [Lupus]
+//============================================================
+
+
+
+//--------------------------------------- Necko: Crazy Uproar--------------------------------\\
+alberta.gat,89,96,5 script Necko#01 139,0,4,{
+ mes "[!?]";
+ mes "Muahahahahhhahahahahhahah!!";
+ mes "Pukakakakakkakakakakakakaka!!";
+ close;
+}
+
+alberta.gat,83,96,5 script Necko#02 98,{
+ mes "[Necko]";
+ if(baseClass == Job_Merchant) goto L_Start;
+
+L_Other:
+ mes "Necko's store is closed right now. Come back later..... Hehe....";
+ close;
+
+L_Start:
+ if(getskilllv(155)>0) goto L_GotSkill;
+ if(@CRAZYROAR) goto L_GetSkill;
+ mes "Oh! Did you come here because you were intrigued by my boisterous voice? My voice is quite loud, isn't it?";
+ mes "After all you heared it from a far off distance.";
+ emotion e_what;
+ next;
+ mes "[Necko]";
+ mes "I'll let you in on something....... My voice is more than just loud..... it's actually quite unique......";
+ next;
+ mes "[Necko]";
+ if(BaseJob==Job_Merchant && JobLevel < 15) goto L_JobLvl;
+ mes "You see, I know a skill that lets me shout in a way that actually helps me.... It is the ^3355FFCrazy Uproar^000000 skill!!!";
+ emotion e_ic;
+ next;
+ mes "[Necko]";
+ mes "Crazy Uproar uses your loud voice to boost your battle spirit!";
+ mes "The skill requires ^FF55338 sp^000000 to use and in turn you will receive an additional ^3355FF4 STR for 5 min^000000!!";
+ next;
+ mes "[Necko]";
+ mes "This skill is very useful. To learn it you must learn the essentials of sound. There was a singer in Payon that taught sound theory.......";
+ next;
+ mes "[Necko]";
+ mes "Unfortunately that person passed away so you can no longer learn those essentials..............";
+ mes "Aww.... you look disappointed.... Do you really want to learn Crazy Uproar??";
+ next;
+ mes "[Necko]";
+ mes "Hmm..... I will teach you then, that is, if you truly wish to learn. You will have to train your vocal cords.";
+ mes "You will also need to gather these items:";
+ next;
+ mes "[Necko]";
+ mes "- ^3355FF7 Pearls,";
+ mes "- 1 Banana juice,";
+ mes "- 50 Mushroom spores^000000.";
+ next;
+ mes "[Necko]";
+ mes "Come back when you are ready! I think I shall do a little vocal training myself........";
+ mes "Bbooowuuuuuuuuuuuuuuuuuuuuuuuuuh!!";
+ set @CRAZYROAR, 1;
+ close;
+
+ L_JobLvl:
+ mes "Once you've reached a ^3355FFjob level of 15^000000 come back and see me. I'll tell you all about the secret to my voice.....";
+ next;
+ mes "[Necko]";
+ mes "Uahahahahahahhahahahahahaha!";
+ mes "Kyukwakakakakkakakakakakkakaka!";
+ close;
+
+L_GetSkill:
+ if((countitem(722)<7) || (countitem(532)<1) || (countitem(921)<50)) goto L_Items;
+ delitem 722,7;
+ delitem 532,1;
+ delitem 921,50;
+ mes "Oh You've gathered the items! Very good, very good. Now it's time to start your training.....";
+ next;
+ mes "[Necko]";
+ mes "Repeat after me: Fa fa fa fa fa.... So so so so so..... La la la la la.... Mi mi mi mi mi mi......";
+ next;
+ mes "~several hours later~";
+ next;
+ mes "[Necko]";
+ mes "Raaaaaawwwwrrrrrrrrrrr!....... Ha ha!! Excellent. Your voice is now finely tuned for ^3355FFCrazy Uproar^000000. Good job.";
+ skill 155,1,0;
+ set @CRAZYROAR, 0;
+ emotion e_no1;
+ close;
+
+ L_Items:
+ mes "You need to get these items for Crazy Uproar:";
+ mes "- ^3355FF7 Pearls,";
+ mes "- 1 Banana juice,";
+ mes "- 50 Mushroom spores^000000.";
+ close;
+
+L_GotSkill:
+ mes "Hello again. I can tell by the sound of your mighty voice that you are becoming very good at Crazy Uproar.";
+ close;
+}
+
+
+//----------------------------------------- Charlron: Change cart ---------------------------------\\
+alberta.gat,119,221,6 script Charlron 107,{
+ mes "[Charlron]";
+ if(baseClass == Job_Merchant) goto L_Start;
+L_Other:
+ mes "I am a merchant that deals with many things. My name is Charlron. If you ever find anything interesting, come back and try to negotiate a deal with me.";
+ close;
+L_Start:
+ if(getskilllv(154)>0) goto L_GotSkill;
+ if(@CHANGECART) goto L_GetSkill;
+ mes "Welcome young one. Is selling fun for you? I am the merchant Charlron.";
+ next;
+ mes "[Charlron]";
+ mes "Aren't you tired of your old, and plain looking cart? Well I can help.";
+ next;
+ mes "[Charlon]";
+ mes "I have been doing some research on cart design recently and have come up with some new and interesting designs for the cart.";
+ next;
+ mes "[Charlon]";
+ mes "I can change the way your cart looks for you. Of course some conditions need to be met......";
+ next;
+ mes "[Charlron]";
+ if(BaseJob==Job_Merchant && JobLevel < 30) goto L_JobLvl;
+ mes "First you will need to bring me these items:";
+ mes "^3355FF50 Trunks,";
+ mes "20 Animal Skin,";
+ mes "10 Iron^000000.";
+ set @CHANGECART, 1;
+ close;
+
+ L_JobLvl:
+ mes "I'm a pretty famous merchant, so I don't really do business with beginners but..........";
+ mes "Once you've reached ^3355FFjob level 30^000000 I may consider doing business with you.";
+ close;
+
+L_GetSkill:
+ if((countitem(1019)<50) || (countitem(998)<10) || (countitem(919)<20)) goto L_Items;
+ mes "Oh good, you have all of the items. Well here you are..... Hmm?... Oh these are the design sheets for your cart.";
+ mes "Now that you have the proper materials, just follow these guides to make your cart look spectacular.";
+// Note: It is not supposed to take these items, just check you have collected them
+ skill 154,1,0;
+ set @CHANGECART, 0;
+ next;
+ mes "[Charlron]";
+ mes "Good luck, see you around";
+ close;
+
+ L_Items:
+ mes "Come back when you've brought me these items:";
+ mes "^3355FF50 Trunks,";
+ mes "20 Animal Skin,";
+ mes "10 Iron^000000.";
+ close;
+L_GotSkill:
+ mes "Heh heh... It's nice to see fancy looking carts like yours on the streets of town. Well back to the drawing board....";
+ close;
+
+}
+
+
+//-------------------------====-------- Gershaun: Cart Revolution ---------------------------------\\
+alberta.gat,232,106,6 script Gershuan 57,{
+ if(baseClass == Job_Merchant) goto L_Start;
+
+L_Other:
+ mes "[Gershuan]";
+ mes "If it doesn't work, make it work!";
+ mes "If it doesn't work, make it work!";
+ mes "If it doesn't work, make it work!";
+ close;
+
+L_Start:
+ if(getskilllv(153)>0) goto L_GotSkill;
+ if(@CARTREVO) goto L_GetSkill;
+ mes "[Gershuan]";
+ mes "Hmm... a young merchant. You must use carts too right? Since you have to do all of that vending..... But is that all you use your cart for?";
+ emotion e_hmm;
+ next;
+ mes "[Gershuan]";
+ mes "I researched some ways of using the cart differently. One way involved cooking ramen and another involved jump-roping (don't ask).";
+ mes "Still none of my new ideas were satisfactory.";
+ next;
+ menu "I know what you mean.",M_0, "......???",M_1;
+
+ M_0:
+ mes "[Gershuan]";
+ mes "You KNOW what I MEAN!! HOW the HECK would YOU KNOW what I MEAN????";
+ emotion e_omg;
+ close;
+ M_1:
+ mes "[Gershuan]";
+ mes "In despair, I wandered through the fields with my cart. Day after day I did this.... I was in a daze....";
+ next;
+ mes "[Gershuan]";
+ mes "Then I crossed paths with a very strong monster! I knew immediately that my life was in danger!";
+ mes "I thought to myself, 'Why me! A weaponless, armorless merchant!?'";
+ emotion e_gasp;
+ next;
+ mes "[Gershuan]";
+ mes "I was scared to death... hoping that this would not be the end of me. With what strength I had left, I tried a desperation move.....";
+ emotion e_swt2;
+ next;
+ mes "[Gershuan]";
+ mes "I used my cart to attack the monster!!";
+ emotion e_gasp;
+ next;
+ mes "[Gershuan]";
+ mes "Just like that the monster was defeated!! Finally I had found another excellent use for the cart! A WEAPON!!!";
+ next;
+ mes "[Gershuan]";
+ mes "I called my newly found discovery ^3355FF'Cart Revolution'^000000!";
+ mes "By using ^FF553312 sp^000000 you can spin your cart around your body doing major damage to an enemy!";
+ emotion e_ic;
+ next;
+ mes "[Gershuan]";
+ mes "The heavier your cart is, the more damage it will do. Would you like to learn this skill?";
+ next;
+ menu "Yes!!",sM_0, "Actually I want to learn some sushi skills...",sM_1;
+
+ sM_0:
+ mes "[Gershuan]";
+ if(BaseJob==Job_Merchant && JobLevel < 35) goto ssL_LowLvl;
+ mes "OK! I will give you the special training for Cart Revolution. The first thing you will have to do is bring me these items:";
+ mes "^3355FF30 Sticky Mucus,";
+ mes "20 Fly wings,";
+ mes "15 Iron,";
+ mes "5 Tentacles,";
+ mes "2 Grape Juice^000000.";
+ next;
+ mes "[Gershuan]";
+ mes "Come back when you have all of these items. Good luck.";
+ set @CARTREVO, 1;
+ close;
+
+ ssL_LowLvl:
+ mes "[Gershuan]";
+ mes "OK! I will give you the special training for Cart Revolution.";
+ mes "But first you will have to get yourself to a ^3355FFjob level of 35^000000! After you've done that, then we can talk.";
+ close;
+
+ sM_1:
+ mes "[Sushi King Gershuan]";
+ mes "Stupid!! You're waaay to young to even try your hand at sushi!!";
+ emotion e_an;
+ close;
+
+L_GetSkill:
+ if((countitem(533)<2) || (countitem(998)<15) || (countitem(938)<30) || (countitem(601)<20) || (countitem(962)<5)) goto sM_0;
+ delitem 533,2;
+ delitem 998,15;
+ delitem 938,30;
+ delitem 601,20;
+ delitem 962,5;
+ mes "[Gershuan]";
+ mes "It's good to see you again. I'm glad you were able to get all of the items. Take a minute to prepare, for your training is about to take place....";
+ next;
+ mes "[Gershuan]";
+ mes "First make sure your feet are shoulder width apart. Balance is key! Now get into a good crouch... grasp the handles of the cart firmly but not too tight...";
+ next;
+ mes "[Gershuan]";
+ mes "NOW SWING!!!";
+ next;
+ mes "[Gershuan]";
+ mes "Eh....... that was terrible.... Okay, lets try again.....";
+ emotion e_swt;
+ next;
+ mes "~many hours later~";
+ next;
+ mes "[Gershuan]";
+ mes "YES!!! FINALLY! I could REALLY FEEL the power in that swing!";
+ mes "Give yourself a good pat on the back because you have just mastered Cart Revolution!";
+ emotion e_no1;
+ next;
+ skill 153,1,0;
+ set @CARTREVO, 0;
+ mes "[Gershuan]";
+ mes "Take care of yourself and remember to fill that cart up so that it can do some major damage.";
+ emotion e_gg;
+ close;
+
+L_GotSkill:
+ mes "[Gershuan]";
+ mes "So how do you like cart revolution? Remember, the ^3355FFheavier^000000 the cart, the ^3355FFgreater^000000 the damage.";
+ close;
+
+}
diff --git a/npc/quests/skills/monk_skills.txt b/npc/quests/skills/monk_skills.txt
index 48e50445e..a3ab0c539 100644
--- a/npc/quests/skills/monk_skills.txt
+++ b/npc/quests/skills/monk_skills.txt
@@ -1,77 +1,77 @@
-//===== eAthena Script =======================================
-//= Monk Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// MONK - KI TRANSLATION + KI EXPLOSION
-//============================================================
-monk_test.gat,316,69,3 script Krate 823,{
- mes "[Krate]";
- if(BaseJob!=Job_Monk) goto L_nomonk;
- if(getskilllv(1015) && getskilllv(1016)) goto L_alreadyhave;
- if(monk_skill) goto L_verif;
- if(Weight>0) goto L_heavymonk;
- mes "I'll teach you all I know, but you must bring me:";
- mes "40 Stems";
- mes "3 Shoots";
- set monk_skill, 1;
- next;
- goto L_verif;
-
-L_verif:
- mes "Let me check your items.";
- next;
- if(countitem(711)<3 || countitem(905)<40) goto L_noitems;//Items: Shoot, Stem,
- delitem 711, 3;//Items: Shoot,
- delitem 905, 40;//Items: Stem,
- next;
- mes "[Krate]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1015,1,0;
- skill 1016,1,0;
- set monk_skill, 0;
- close;
-
-L_noitems:
- mes "[Krate]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nomonk:
- mes "It seems that your soul is disagree with your body.";
- mes "Come back when your body and your soul will be like Yin and Yang.";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-
-L_heavymonk:
- mes "Come back when you've cleansed";
- mes "yourself of your worldly possessions.";
- close;
-}
+//===== eAthena Script =======================================
+//= Monk Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// MONK - KI TRANSLATION + KI EXPLOSION
+//============================================================
+monk_test.gat,316,69,3 script Krate 823,{
+ mes "[Krate]";
+ if(BaseJob!=Job_Monk) goto L_nomonk;
+ if(getskilllv(1015) && getskilllv(1016)) goto L_alreadyhave;
+ if(monk_skill) goto L_verif;
+ if(Weight>0) goto L_heavymonk;
+ mes "I'll teach you all I know, but you must bring me:";
+ mes "40 Stems";
+ mes "3 Shoots";
+ set monk_skill, 1;
+ next;
+ goto L_verif;
+
+L_verif:
+ mes "Let me check your items.";
+ next;
+ if(countitem(711)<3 || countitem(905)<40) goto L_noitems;//Items: Shoot, Stem,
+ delitem 711, 3;//Items: Shoot,
+ delitem 905, 40;//Items: Stem,
+ next;
+ mes "[Krate]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1015,1,0;
+ skill 1016,1,0;
+ set monk_skill, 0;
+ close;
+
+L_noitems:
+ mes "[Krate]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nomonk:
+ mes "It seems that your soul is disagree with your body.";
+ mes "Come back when your body and your soul will be like Yin and Yang.";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+
+L_heavymonk:
+ mes "Come back when you've cleansed";
+ mes "yourself of your worldly possessions.";
+ close;
+}
diff --git a/npc/quests/skills/novice_skills.txt b/npc/quests/skills/novice_skills.txt
index 6009f9009..f23176e5a 100644
--- a/npc/quests/skills/novice_skills.txt
+++ b/npc/quests/skills/novice_skills.txt
@@ -1,246 +1,246 @@
-//===== eAthena Script =======================================
-//= Novice Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Customized novice skills quest
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Fixed a Zeny exploit, made more variables clear
-//= on finishing quests. [Lupus]
-//= 1.4 Fixed exploits [Lupus]
-//= 1.4a Fixed some typos [IVBela]
-//============================================================
-
-
-
-//<---------------------------------------------------------------------------------------------- Nurse Aid: First Aid NPC ---------------------------------------------------------------------------->\\
-prt_in.gat,235,133,4 script Nurse Aid 90,{
- mes "[Nurse Aid]";
- if(FIRSTAID){
- if((JobLevel < 3) || (countitem(507) < 5 ) || (countitem(705) < 5) || (countitem(930) < 1)) goto sM_Yes;
- delitem 507,5;
- delitem 705,5;
- delitem 930,1;
- mes "Oh good. You have everything needed for me to teach you first aid. Here we go...";
- next;
- mes "....... 1 hour later.......";
- next;
- skill 142,1,0;
- set FIRSTAID,0;
- set got_bandage,0;
- mes "[Nurse Aid]";
- mes "YES! You finally got it. Now you can heal yourself and continue fighting those bad monsters. Well, take care.";
- emotion e_no1;
- close;
- }
- if(getskilllv(142)>0){
- mes "Well hello again. I really hope the First Aid skill has been helpful to you. Make sure to continue your hard work and don't forget to rest and heal!";
- close;
- }
- mes "Oh hello there! You look tired and a little worn out. Have the monsters outside of town been giving you trouble?";
- next;
- menu "Ha! Me strong like BULL!!",-, "Well..um..kinda..",M_Yep;
-
- mes "[Nurse Aid]";
- mes "Oh I see. You must be a mighty warrior. Well, come back anytime if you do ever feel overwhelmed by the monsters. I'll be able to help.";
- close;
- M_Yep:
- mes "[Nurse Aid]";
- mes "Well don't feel bad. It can be very difficult fighting those nasty monsters in the beginning.";
- next;
- mes "[Nurse Aid]";
- mes "I know because I've been treating a lot people lately who have been fighting them.";
- mes "There are so many injured now that I don't think I can continue treating anyone.";
- next;
- mes "[Nurse Aid]";
- mes "~Sigh~";
- next;
- mes "[Nurse Aid]";
- mes "That's why I've decided to teach people how to heal themselves! Would you like me to teach you?";
- emotion e_ic;
- next;
- menu "Would you??",sM_Yes, "(...she's nuts!...run!!!)",-;
-
- mes "[Nurse Aid]";
- mes "Hey!...Where are you running too??...";
- emotion e_swt;
- close;
- sM_Yes:
- mes "[Nurse Aid]";
- mes "In order for me to teach you First Aid you need to have at least a^0000ff Job Level of 3^000000.";
- mes "You then need to give me:^ff0000 5 Red Herbs^000000,^00bb00 5 Clovers^000000, and an^aaaa00 Old Bandage^000000.";
- next;
- mes "[Nurse Aid]";
- mes "You can get the bandage from the^0000ff 'Newbie Assistant'^000000 located on the second floor of the Castle.";
- next;
- mes "[Nurse Aid]";
- mes "Once you get Job Level 3 and have all of the items come back and see me, OK?";
- set FIRSTAID,1;
- close;
-}
-
-
-//<-------------------------------------------------------------------------------------------------- Bulma: Play Dead -------------------------------------------------------------------------------------------->\\
-prt_in.gat,73,87,2 script Bulma 98,{
- mes "[Bulma]";
- if(BaseJob != Job_Novice){
- mes "Yeah... I look great.... After all, I'm a Knight of the Prontera Chivalry. Kuhahahaha!";
- emotion e_heh;
- next;
- mes "[Bulma]";
- mes "It hasn't been that long since I became a Knight, but I still look good as one right? What do you think???";
- emotion e_hmm;
- close;
- }
- if(JobLevel < 7){
- mes "Hello my young friend. You remind me of myself when I was young.....";
- mes "Heh heh, I really miss those days..... Wow... It's funny to think about those years now......";
- next;
- mes "[Bulma]";
- mes "They were difficult.... thankfully you can use the ^5555FFPlay Dead^000000 skill when you reach a ^5555FFJob Level of 7^000000.";
- mes "If you're interested in it come back and talk to me when you've leveled up a bit more.";
- close;
- }
- if(PLAYDEAD){
- if(countitem(7039)<1){
- mes "HEY! What are you doing here? It's irresponsible of you to still be here while your time is running out.........";
- emotion e_gasp;
- next;
- mes "[Bulma]";
- mes "Now GO! Run! Run! RUN!!";
- emotion e_go;
- close;
- }
- delitem 7039, 1;
- mes "Good to see you again. Alright, lets start your training....";
- next;
- mes "[Bulma]";
- mes "Let me first introduce to you the concept of 'Method Acting'. Method Acting stresses the need to understand every aspect of the role you are playing.";
- next;
- mes "[Bulma]";
- mes "You must learn to think, feel, and even live like your character so that you can understand his/her motivation in any given moment.";
- next;
- mes "[Bulma]";
- mes "Now let us use this technique to develop your ability to Play Dead!";
- mes "I want you to think like a dead person, feel like a dead person, eat, breath, sleep, kiss, etc. like a person who is dead!!!";
- next;
- mes "[Bulma]";
- mes "Don't just stand there! Lay down on the ground and live life through the eyes of a dead person.... errr or don't live.... anyways just do it!!";
- next;
- mes "~ several hours later ~";
- next;
- mes "[Bulma]";
- mes "OK, lights, camera, ACTION! Yes... yes... YES!! That's it!! As I watch you laying there I TRULY believe that you are dead.";
- mes "What a wonderful performance! BRAVO! BRAVO!";
- emotion e_gasp;
- next;
- mes "[Bulma]";
- mes "With the right motivation and focus you will be able to play dead anywhere at any given moment. Congratulations on mastering this skill.";
- emotion e_no1;
- skill 143,1,0;
- set PLAYDEAD, 0;
- set got_novnametag,0;
- close;
- }
- if(getskilllv(143)>0){
- mes "Yeah.... I remember back then..... especially those embarrassing novice years... heh. Luckily there was Play Dead.";
- mes "That saved me many times in the past. I'm sure it has been saving you too.";
- next;
- mes "[Bulma]";
- mes "Hopefully it is something you have been using well. If you have any friends who are novices, tell them about me. I will help them out as good as I can.";
- close;
- }
- mes "Hello my young friend. You remind me of myself when I was young..... Heh heh, I really miss those days.....";
- mes "Look at me acting all sentimental like some old man........";
- next;
- mes "[Bulma]";
- mes "Sorry about that. Anyhow, I just want you to know that if you work hard and are patient, you too will receive the job you desire.";
- mes "It may take some time but stay focused and never loose your determination.";
- next;
- mes "[Bulma]";
- mes "Hmm..... actually I might be able to help you out........";
- emotion e_hmm;
- next;
- mes "[Bulma]";
- mes "What's this? Ha ha, don't look so surprised. What I have to offer will be very useful to you.";
- next;
- mes "[Bulma]";
- mes "You see I can teach you the skill ^5555FF'Play Dead'^000000.";
- mes "This skill allows you to act like you just died making any monster that is currently attacking you leave you alone.";
- next;
- mes "[Bulma]";
- mes "I myself have used it as a novice and found it to be very useful.";
- mes "It may sound easy enough, but it takes a lot of hard work and practice to make your performance look believable.";
- next;
- mes "[Bulma]";
- mes "You MUST look perfectly DEAD in order for this skill to work. Even the slightest movement will give you away.";
- next;
- mes "[Bulma]";
- mes "I think I've done enough explaining..... The look in your eyes tells me that you are ready to learn this skill.";
- next;
- mes "[Bulma]";
- mes "First take this pill....";
- next;
- mes "(you take the pill) ~gulp~";
- next;
- mes "[Bulma]";
- mes "Good. Now go to the 2nd floor on the East side of the Prontera Castle.";
- mes "Speak with the ^5555FFNewbie Assistant^000000 and he will give you a ^5555FFNewbie Tag^000000.";
- next;
- mes "[Bulma]";
- mes "Once you have the tag come back here. You MUST make it back here WITHIN ^FF555510 minutes^000000!";
- mes "If you don't, then the pill you just swallowed will start making it hard for you to breath!.....";
- next;
- mes "[Bulma]";
- mes "Kekekeke..... Just kidding! The pill actually helps you stay calm, nothing more.";
- emotion e_heh;
- next;
- mes "[Bulma]";
- mes "Well get going... GO! GO! GO! RUN!!!";
- emotion e_go;
- set PLAYDEAD, 1;
- close;
-}
-
-
-//Newbie Assistant------------------------------------------------------------------------------
-prt_castle.gat,174,147,2 script Newbie Assistant 84,{
- mes "[Newbie Assistant]";
- if(BaseJob != Job_Novice){
- mes "What am I doing here? I'm just trying to help out young newbies. You remember how it was to be a newbie... confused.... lost.... heh heh.";
- emotion e_what;
- close;
- }
- if(FIRSTAID && countitem(930)==0 && !got_bandage){
- mes "So Nurse Aid sent you huh. She's a great nurse, you should feel very fortunate that she is helping you out. Here take this.";
- next;
- getitem 930,1;
- set got_bandage,1;
- mes "[Newbie Assistant]";
- mes "You'll need it in order for her to teach you her excellent healing technique.";
- next;
- mes "[Newbie Assistant]";
- mes "When I watch her work it is like watching an angel that has descended down from the heavens.....";
- next;
- mes "[Newbie Assistant]";
- mes "Her beauty, her grace, sometimes I wish........ (blushes).......... um.... well... err... tell her I said hello.";
- emotion e_lv;
- close;
- }
- if(PLAYDEAD && countitem(7039)==0 && !got_novnametag){
- mes "So Bulma sent you uh.... okay here you go.";
- getitem 7039,1;
- set got_novnametag,1;
- next;
- mes "Good luck on your adventure.";
- close;
- }
- mes "Hello. I'm here to provide help to newbies like you. If there is anything in particular that you need assistance with just let me know.";
- close;
-}
+//===== eAthena Script =======================================
+//= Novice Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Customized novice skills quest
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Fixed a Zeny exploit, made more variables clear
+//= on finishing quests. [Lupus]
+//= 1.4 Fixed exploits [Lupus]
+//= 1.4a Fixed some typos [IVBela]
+//============================================================
+
+
+
+//<---------------------------------------------------------------------------------------------- Nurse Aid: First Aid NPC ---------------------------------------------------------------------------->\\
+prt_in.gat,235,133,4 script Nurse Aid 90,{
+ mes "[Nurse Aid]";
+ if(FIRSTAID){
+ if((JobLevel < 3) || (countitem(507) < 5 ) || (countitem(705) < 5) || (countitem(930) < 1)) goto sM_Yes;
+ delitem 507,5;
+ delitem 705,5;
+ delitem 930,1;
+ mes "Oh good. You have everything needed for me to teach you first aid. Here we go...";
+ next;
+ mes "....... 1 hour later.......";
+ next;
+ skill 142,1,0;
+ set FIRSTAID,0;
+ set got_bandage,0;
+ mes "[Nurse Aid]";
+ mes "YES! You finally got it. Now you can heal yourself and continue fighting those bad monsters. Well, take care.";
+ emotion e_no1;
+ close;
+ }
+ if(getskilllv(142)>0){
+ mes "Well hello again. I really hope the First Aid skill has been helpful to you. Make sure to continue your hard work and don't forget to rest and heal!";
+ close;
+ }
+ mes "Oh hello there! You look tired and a little worn out. Have the monsters outside of town been giving you trouble?";
+ next;
+ menu "Ha! Me strong like BULL!!",-, "Well..um..kinda..",M_Yep;
+
+ mes "[Nurse Aid]";
+ mes "Oh I see. You must be a mighty warrior. Well, come back anytime if you do ever feel overwhelmed by the monsters. I'll be able to help.";
+ close;
+ M_Yep:
+ mes "[Nurse Aid]";
+ mes "Well don't feel bad. It can be very difficult fighting those nasty monsters in the beginning.";
+ next;
+ mes "[Nurse Aid]";
+ mes "I know because I've been treating a lot people lately who have been fighting them.";
+ mes "There are so many injured now that I don't think I can continue treating anyone.";
+ next;
+ mes "[Nurse Aid]";
+ mes "~Sigh~";
+ next;
+ mes "[Nurse Aid]";
+ mes "That's why I've decided to teach people how to heal themselves! Would you like me to teach you?";
+ emotion e_ic;
+ next;
+ menu "Would you??",sM_Yes, "(...she's nuts!...run!!!)",-;
+
+ mes "[Nurse Aid]";
+ mes "Hey!...Where are you running too??...";
+ emotion e_swt;
+ close;
+ sM_Yes:
+ mes "[Nurse Aid]";
+ mes "In order for me to teach you First Aid you need to have at least a^0000ff Job Level of 3^000000.";
+ mes "You then need to give me:^ff0000 5 Red Herbs^000000,^00bb00 5 Clovers^000000, and an^aaaa00 Old Bandage^000000.";
+ next;
+ mes "[Nurse Aid]";
+ mes "You can get the bandage from the^0000ff 'Newbie Assistant'^000000 located on the second floor of the Castle.";
+ next;
+ mes "[Nurse Aid]";
+ mes "Once you get Job Level 3 and have all of the items come back and see me, OK?";
+ set FIRSTAID,1;
+ close;
+}
+
+
+//<-------------------------------------------------------------------------------------------------- Bulma: Play Dead -------------------------------------------------------------------------------------------->\\
+prt_in.gat,73,87,2 script Bulma 98,{
+ mes "[Bulma]";
+ if(BaseJob != Job_Novice){
+ mes "Yeah... I look great.... After all, I'm a Knight of the Prontera Chivalry. Kuhahahaha!";
+ emotion e_heh;
+ next;
+ mes "[Bulma]";
+ mes "It hasn't been that long since I became a Knight, but I still look good as one right? What do you think???";
+ emotion e_hmm;
+ close;
+ }
+ if(JobLevel < 7){
+ mes "Hello my young friend. You remind me of myself when I was young.....";
+ mes "Heh heh, I really miss those days..... Wow... It's funny to think about those years now......";
+ next;
+ mes "[Bulma]";
+ mes "They were difficult.... thankfully you can use the ^5555FFPlay Dead^000000 skill when you reach a ^5555FFJob Level of 7^000000.";
+ mes "If you're interested in it come back and talk to me when you've leveled up a bit more.";
+ close;
+ }
+ if(PLAYDEAD){
+ if(countitem(7039)<1){
+ mes "HEY! What are you doing here? It's irresponsible of you to still be here while your time is running out.........";
+ emotion e_gasp;
+ next;
+ mes "[Bulma]";
+ mes "Now GO! Run! Run! RUN!!";
+ emotion e_go;
+ close;
+ }
+ delitem 7039, 1;
+ mes "Good to see you again. Alright, lets start your training....";
+ next;
+ mes "[Bulma]";
+ mes "Let me first introduce to you the concept of 'Method Acting'. Method Acting stresses the need to understand every aspect of the role you are playing.";
+ next;
+ mes "[Bulma]";
+ mes "You must learn to think, feel, and even live like your character so that you can understand his/her motivation in any given moment.";
+ next;
+ mes "[Bulma]";
+ mes "Now let us use this technique to develop your ability to Play Dead!";
+ mes "I want you to think like a dead person, feel like a dead person, eat, breath, sleep, kiss, etc. like a person who is dead!!!";
+ next;
+ mes "[Bulma]";
+ mes "Don't just stand there! Lay down on the ground and live life through the eyes of a dead person.... errr or don't live.... anyways just do it!!";
+ next;
+ mes "~ several hours later ~";
+ next;
+ mes "[Bulma]";
+ mes "OK, lights, camera, ACTION! Yes... yes... YES!! That's it!! As I watch you laying there I TRULY believe that you are dead.";
+ mes "What a wonderful performance! BRAVO! BRAVO!";
+ emotion e_gasp;
+ next;
+ mes "[Bulma]";
+ mes "With the right motivation and focus you will be able to play dead anywhere at any given moment. Congratulations on mastering this skill.";
+ emotion e_no1;
+ skill 143,1,0;
+ set PLAYDEAD, 0;
+ set got_novnametag,0;
+ close;
+ }
+ if(getskilllv(143)>0){
+ mes "Yeah.... I remember back then..... especially those embarrassing novice years... heh. Luckily there was Play Dead.";
+ mes "That saved me many times in the past. I'm sure it has been saving you too.";
+ next;
+ mes "[Bulma]";
+ mes "Hopefully it is something you have been using well. If you have any friends who are novices, tell them about me. I will help them out as good as I can.";
+ close;
+ }
+ mes "Hello my young friend. You remind me of myself when I was young..... Heh heh, I really miss those days.....";
+ mes "Look at me acting all sentimental like some old man........";
+ next;
+ mes "[Bulma]";
+ mes "Sorry about that. Anyhow, I just want you to know that if you work hard and are patient, you too will receive the job you desire.";
+ mes "It may take some time but stay focused and never loose your determination.";
+ next;
+ mes "[Bulma]";
+ mes "Hmm..... actually I might be able to help you out........";
+ emotion e_hmm;
+ next;
+ mes "[Bulma]";
+ mes "What's this? Ha ha, don't look so surprised. What I have to offer will be very useful to you.";
+ next;
+ mes "[Bulma]";
+ mes "You see I can teach you the skill ^5555FF'Play Dead'^000000.";
+ mes "This skill allows you to act like you just died making any monster that is currently attacking you leave you alone.";
+ next;
+ mes "[Bulma]";
+ mes "I myself have used it as a novice and found it to be very useful.";
+ mes "It may sound easy enough, but it takes a lot of hard work and practice to make your performance look believable.";
+ next;
+ mes "[Bulma]";
+ mes "You MUST look perfectly DEAD in order for this skill to work. Even the slightest movement will give you away.";
+ next;
+ mes "[Bulma]";
+ mes "I think I've done enough explaining..... The look in your eyes tells me that you are ready to learn this skill.";
+ next;
+ mes "[Bulma]";
+ mes "First take this pill....";
+ next;
+ mes "(you take the pill) ~gulp~";
+ next;
+ mes "[Bulma]";
+ mes "Good. Now go to the 2nd floor on the East side of the Prontera Castle.";
+ mes "Speak with the ^5555FFNewbie Assistant^000000 and he will give you a ^5555FFNewbie Tag^000000.";
+ next;
+ mes "[Bulma]";
+ mes "Once you have the tag come back here. You MUST make it back here WITHIN ^FF555510 minutes^000000!";
+ mes "If you don't, then the pill you just swallowed will start making it hard for you to breath!.....";
+ next;
+ mes "[Bulma]";
+ mes "Kekekeke..... Just kidding! The pill actually helps you stay calm, nothing more.";
+ emotion e_heh;
+ next;
+ mes "[Bulma]";
+ mes "Well get going... GO! GO! GO! RUN!!!";
+ emotion e_go;
+ set PLAYDEAD, 1;
+ close;
+}
+
+
+//Newbie Assistant------------------------------------------------------------------------------
+prt_castle.gat,174,147,2 script Newbie Assistant 84,{
+ mes "[Newbie Assistant]";
+ if(BaseJob != Job_Novice){
+ mes "What am I doing here? I'm just trying to help out young newbies. You remember how it was to be a newbie... confused.... lost.... heh heh.";
+ emotion e_what;
+ close;
+ }
+ if(FIRSTAID && countitem(930)==0 && !got_bandage){
+ mes "So Nurse Aid sent you huh. She's a great nurse, you should feel very fortunate that she is helping you out. Here take this.";
+ next;
+ getitem 930,1;
+ set got_bandage,1;
+ mes "[Newbie Assistant]";
+ mes "You'll need it in order for her to teach you her excellent healing technique.";
+ next;
+ mes "[Newbie Assistant]";
+ mes "When I watch her work it is like watching an angel that has descended down from the heavens.....";
+ next;
+ mes "[Newbie Assistant]";
+ mes "Her beauty, her grace, sometimes I wish........ (blushes).......... um.... well... err... tell her I said hello.";
+ emotion e_lv;
+ close;
+ }
+ if(PLAYDEAD && countitem(7039)==0 && !got_novnametag){
+ mes "So Bulma sent you uh.... okay here you go.";
+ getitem 7039,1;
+ set got_novnametag,1;
+ next;
+ mes "Good luck on your adventure.";
+ close;
+ }
+ mes "Hello. I'm here to provide help to newbies like you. If there is anything in particular that you need assistance with just let me know.";
+ close;
+}
diff --git a/npc/quests/skills/priest_skills.txt b/npc/quests/skills/priest_skills.txt
index 32c589428..927d4e8da 100644
--- a/npc/quests/skills/priest_skills.txt
+++ b/npc/quests/skills/priest_skills.txt
@@ -1,88 +1,88 @@
-//===== eAthena Script =======================================
-//= Priest Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// PRIEST - REDEMPTIO
-//============================================================
-prt_church.gat,111,112,3 script Nun Linus 79,{
- mes "[Nun Linus]";
- if(BaseJob!=Job_Priest) goto L_nopriest;
- if(getskilllv(1014)) goto L_alreadyhave;
- if(getskilllv(54)<1) goto L_norez;
-
- mes "I can teach you the mercy of God";
- mes "if you bring me a couple things,";
- mes "and if God finds you worthy!";
- mes "1 Blue Gemstone";
- mes "1 Holy Water";
- next;
-
- mes "[Nun Linus]";
- mes "Let me check your items.";
- next;
-
- if(countitem(717)<1 || countitem(523)<1) goto L_noitems;//Items: Blue_Gemstone, Holy_Water,
- delitem 717, 1;//Items: Blue_Gemstone,
- delitem 523, 1;//Items: Holy_Water,
-
- mes "[Nun Linus]";
- mes "I see you have what you need,";
- mes "so we shall see if God finds";
- mes "you worthy yet!";
- next;
- if(rand(100)<JobLevel+25) goto L_bless;
- mes "[Nun Linus]";
- mes "Sorry, but God has not";
- mes "shined on you as of yet.";
- mes "Try again when you are a";
- mes "stronger Priest.";
- close;
-
-L_bless:
- mes "[Nun Linus]";
- mes "Hum... I see God has shined on you this time";
- skill 1014,1,0;
- close;
-
-L_noitems:
- mes "[Nun Linus]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nopriest:
- mes "Sorry, you need to have some faith in God.";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-
-L_norez:
- mes "Come back when you've learned";
- mes "more about priest and God.";
- close;
-}
+//===== eAthena Script =======================================
+//= Priest Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// PRIEST - REDEMPTIO
+//============================================================
+prt_church.gat,111,112,3 script Nun Linus 79,{
+ mes "[Nun Linus]";
+ if(BaseJob!=Job_Priest) goto L_nopriest;
+ if(getskilllv(1014)) goto L_alreadyhave;
+ if(getskilllv(54)<1) goto L_norez;
+
+ mes "I can teach you the mercy of God";
+ mes "if you bring me a couple things,";
+ mes "and if God finds you worthy!";
+ mes "1 Blue Gemstone";
+ mes "1 Holy Water";
+ next;
+
+ mes "[Nun Linus]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(717)<1 || countitem(523)<1) goto L_noitems;//Items: Blue_Gemstone, Holy_Water,
+ delitem 717, 1;//Items: Blue_Gemstone,
+ delitem 523, 1;//Items: Holy_Water,
+
+ mes "[Nun Linus]";
+ mes "I see you have what you need,";
+ mes "so we shall see if God finds";
+ mes "you worthy yet!";
+ next;
+ if(rand(100)<JobLevel+25) goto L_bless;
+ mes "[Nun Linus]";
+ mes "Sorry, but God has not";
+ mes "shined on you as of yet.";
+ mes "Try again when you are a";
+ mes "stronger Priest.";
+ close;
+
+L_bless:
+ mes "[Nun Linus]";
+ mes "Hum... I see God has shined on you this time";
+ skill 1014,1,0;
+ close;
+
+L_noitems:
+ mes "[Nun Linus]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nopriest:
+ mes "Sorry, you need to have some faith in God.";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+
+L_norez:
+ mes "Come back when you've learned";
+ mes "more about priest and God.";
+ close;
+}
diff --git a/npc/quests/skills/rogue_skills.txt b/npc/quests/skills/rogue_skills.txt
index 41395f0b9..810fc7d62 100644
--- a/npc/quests/skills/rogue_skills.txt
+++ b/npc/quests/skills/rogue_skills.txt
@@ -1,71 +1,71 @@
-//===== eAthena Script =======================================
-//= Rogue Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//============================================================
-
-
-//============================================================
-// ROGUE - CLOSE CONFINE
-//============================================================
-in_rogue.gat,387,94,3 script Hyzaragrack 84,{
- mes "[Hyzaragrack]";
- if(BaseJob!=Job_Rogue) goto L_norogue;
- if(getskilllv(1005)) goto L_alreadyhave;
-
- mes "I'll teach you all I know, but";
- mes "you'll have to steal some things";
- mes "for me first...";
- mes "5 Immortal Hearts";
- mes "5 Stone Hearts";
- mes "2 Burning hearts";
- next;
-
- mes "[Hyzaragrack]";
- mes "Let me check your items.";
- next;
-
- if(countitem(929)<5 || countitem(953)<5 || countitem(7097)<2) goto L_noitems;//Items: Immortal_Heart, Stone_Heart, Burning_Heart,
- delitem 929, 5;//Items: Immortal_Heart,
- delitem 953, 5;//Items: Stone_Heart,
- delitem 7097, 2;//Items: Burning_Heart,
-
- mes "[Hyzaragrack]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1005,1,0;
- close;
-
-L_noitems:
- mes "[Hyzaragrack]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_norogue:
- mes "Looking for your master?";
- emotion e_gasp;
- close;
-
-L_alreadyhave:
- mes "I've already taught you";
- mes "everything I know...";
- close;
-}
+//===== eAthena Script =======================================
+//= Rogue Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//============================================================
+
+
+//============================================================
+// ROGUE - CLOSE CONFINE
+//============================================================
+in_rogue.gat,387,94,3 script Hyzaragrack 84,{
+ mes "[Hyzaragrack]";
+ if(BaseJob!=Job_Rogue) goto L_norogue;
+ if(getskilllv(1005)) goto L_alreadyhave;
+
+ mes "I'll teach you all I know, but";
+ mes "you'll have to steal some things";
+ mes "for me first...";
+ mes "5 Immortal Hearts";
+ mes "5 Stone Hearts";
+ mes "2 Burning hearts";
+ next;
+
+ mes "[Hyzaragrack]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(929)<5 || countitem(953)<5 || countitem(7097)<2) goto L_noitems;//Items: Immortal_Heart, Stone_Heart, Burning_Heart,
+ delitem 929, 5;//Items: Immortal_Heart,
+ delitem 953, 5;//Items: Stone_Heart,
+ delitem 7097, 2;//Items: Burning_Heart,
+
+ mes "[Hyzaragrack]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1005,1,0;
+ close;
+
+L_noitems:
+ mes "[Hyzaragrack]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_norogue:
+ mes "Looking for your master?";
+ emotion e_gasp;
+ close;
+
+L_alreadyhave:
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+}
diff --git a/npc/quests/skills/sage_skills.txt b/npc/quests/skills/sage_skills.txt
index 2697c78c2..4d391e34b 100644
--- a/npc/quests/skills/sage_skills.txt
+++ b/npc/quests/skills/sage_skills.txt
@@ -1,148 +1,148 @@
-//===== eAthena Script =======================================
-//= Sage Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3c
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//= 1.3c Fixed some typos [IVBela]
-//============================================================
-
-
-//============================================================
-// SAGE SKILL - CREATE CONVERTER + ELEMENTAL CHANGE
-//============================================================
-yuno_in03.gat,176,24,3 script Mischna 755,{
- mes "[Mischna]";
- if(BaseJob!=Job_Sage) goto L_sageno;
- if(getskilllv(1007)) goto L_elemental;
-
- mes "I can teach you a new skill";
- mes "that I discovered, but you";
- mes "will need to bring me a few";
- mes "things to complete the";
- mes "process.";
- next;
-
- mes "[Mischna]";
- mes "We will need:";
- mes "10 Scorpion Tails";
- mes "7 Horns";
- mes "12 Rainbow Shells";
- mes "10 Snail Shells";
- mes "4 Blank Scrolls";
- next;
-
- mes "[Mischna]";
- mes "Let me check your items.";
- next;
-
- if(countitem(904)<10 || countitem(947)<7 || countitem(1013)<12 || countitem(946)<10 || countitem(7433)<4) goto L_noitems;//Items: Scorpion_Tail, Horn, Rainbow_Shell, Snail's_Shell, Blank_Scroll,
- delitem 904, 10;//Items: Scorpion_Tail,
- delitem 947, 7;//Items: Horn,
- delitem 1013, 12;//Items: Rainbow_Shell,
- delitem 946, 10;//Items: Snail's_Shell,
- delitem 7433, 4;//Items: Blank_Scroll,
-
- mes "[Mischna]";
- mes "I see you have what we need,";
- mes "so I'll teach you this new";
- mes "talent of mine!";
- skill 1007,1,0;
- next;
-
- mes "[Mischna]";
- mes "Do you feel more in tune";
- mes "with nature?";
- close;
-
-L_noitems:
- mes "[Mischna]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_sageno:
- mes "Hi I'm Mischna. How are you?";
- mes "Please enjoy your stay here";
- mes "within the walls of the great";
- mes "Sage's guild.";
- close;
-
-L_sagefail:
- mes "[Mischna]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me";
- mes "to give you this power over";
- mes "the elements.";
- close;
-
-L_alreadyhave:
- mes "You are such a wonderful";
- mes "student. It's too bad I have";
- mes "nothing more to teach you.";
- close;
-
-L_elemental:
- if(getskilllv(1008) || getskilllv(1017) || getskilllv(1018) || getskilllv(1019)) goto L_alreadyhave;
-
- mes "I have one more skill that";
- mes "I can teach you, but you";
- mes "will need to bring me one of";
- mes "these sets in return...";
- next;
-
- mes "[Mischna]";
- mes "I can only accept one set.";
- mes "20 Red blood (fire)";
- mes "20 Crystal Blue (water)";
- mes "20 Wind of Verdure (Wind)";
- mes "20 Green Live (Earth)";
- next;
-
- mes "[Mischna]";
- mes "Remember that I can only teach";
- mes "you one, so choose carefully!";
- next;
-
- menu "Elemental Change Water",sage_1, "Elemental Change Earth",sage_2, "Elemental Change Fire",sage_3, "Elemental Change Wind",sage_4;
-
- sage_1:
- if(countitem(991)<20)goto L_sagefail;//Items: Crystal_Blue,
- delitem 991, 20; //Items: Crystal_Blue,
- skill 1008,1,0;
- goto L_alreadyhave;
-
- sage_2:
- if(countitem(993)<20)goto L_sagefail;//Items: Green_Live,
- delitem 993, 20;//Items: Green_Live,
- skill 1017,1,0;
- goto L_alreadyhave;
-
- sage_3:
- if(countitem(990)<20)goto L_sagefail;//Items: Red_Blood,
- delitem 990, 20;//Items: Red_Blood,
- skill 1018,1,0;
- goto L_alreadyhave;
-
- sage_4:
- if(countitem(992)<20)goto L_sagefail;//Items: Wind_of_Verdure,
- delitem 992, 20;//Items: Wind_of_Verdure,
- skill 1019,1,0;
- goto L_alreadyhave;
-}
+//===== eAthena Script =======================================
+//= Sage Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3c
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//= 1.3c Fixed some typos [IVBela]
+//============================================================
+
+
+//============================================================
+// SAGE SKILL - CREATE CONVERTER + ELEMENTAL CHANGE
+//============================================================
+yuno_in03.gat,176,24,3 script Mischna 755,{
+ mes "[Mischna]";
+ if(BaseJob!=Job_Sage) goto L_sageno;
+ if(getskilllv(1007)) goto L_elemental;
+
+ mes "I can teach you a new skill";
+ mes "that I discovered, but you";
+ mes "will need to bring me a few";
+ mes "things to complete the";
+ mes "process.";
+ next;
+
+ mes "[Mischna]";
+ mes "We will need:";
+ mes "10 Scorpion Tails";
+ mes "7 Horns";
+ mes "12 Rainbow Shells";
+ mes "10 Snail Shells";
+ mes "4 Blank Scrolls";
+ next;
+
+ mes "[Mischna]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(904)<10 || countitem(947)<7 || countitem(1013)<12 || countitem(946)<10 || countitem(7433)<4) goto L_noitems;//Items: Scorpion_Tail, Horn, Rainbow_Shell, Snail's_Shell, Blank_Scroll,
+ delitem 904, 10;//Items: Scorpion_Tail,
+ delitem 947, 7;//Items: Horn,
+ delitem 1013, 12;//Items: Rainbow_Shell,
+ delitem 946, 10;//Items: Snail's_Shell,
+ delitem 7433, 4;//Items: Blank_Scroll,
+
+ mes "[Mischna]";
+ mes "I see you have what we need,";
+ mes "so I'll teach you this new";
+ mes "talent of mine!";
+ skill 1007,1,0;
+ next;
+
+ mes "[Mischna]";
+ mes "Do you feel more in tune";
+ mes "with nature?";
+ close;
+
+L_noitems:
+ mes "[Mischna]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_sageno:
+ mes "Hi I'm Mischna. How are you?";
+ mes "Please enjoy your stay here";
+ mes "within the walls of the great";
+ mes "Sage's guild.";
+ close;
+
+L_sagefail:
+ mes "[Mischna]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me";
+ mes "to give you this power over";
+ mes "the elements.";
+ close;
+
+L_alreadyhave:
+ mes "You are such a wonderful";
+ mes "student. It's too bad I have";
+ mes "nothing more to teach you.";
+ close;
+
+L_elemental:
+ if(getskilllv(1008) || getskilllv(1017) || getskilllv(1018) || getskilllv(1019)) goto L_alreadyhave;
+
+ mes "I have one more skill that";
+ mes "I can teach you, but you";
+ mes "will need to bring me one of";
+ mes "these sets in return...";
+ next;
+
+ mes "[Mischna]";
+ mes "I can only accept one set.";
+ mes "20 Red blood (fire)";
+ mes "20 Crystal Blue (water)";
+ mes "20 Wind of Verdure (Wind)";
+ mes "20 Green Live (Earth)";
+ next;
+
+ mes "[Mischna]";
+ mes "Remember that I can only teach";
+ mes "you one, so choose carefully!";
+ next;
+
+ menu "Elemental Change Water",sage_1, "Elemental Change Earth",sage_2, "Elemental Change Fire",sage_3, "Elemental Change Wind",sage_4;
+
+ sage_1:
+ if(countitem(991)<20)goto L_sagefail;//Items: Crystal_Blue,
+ delitem 991, 20; //Items: Crystal_Blue,
+ skill 1008,1,0;
+ goto L_alreadyhave;
+
+ sage_2:
+ if(countitem(993)<20)goto L_sagefail;//Items: Green_Live,
+ delitem 993, 20;//Items: Green_Live,
+ skill 1017,1,0;
+ goto L_alreadyhave;
+
+ sage_3:
+ if(countitem(990)<20)goto L_sagefail;//Items: Red_Blood,
+ delitem 990, 20;//Items: Red_Blood,
+ skill 1018,1,0;
+ goto L_alreadyhave;
+
+ sage_4:
+ if(countitem(992)<20)goto L_sagefail;//Items: Wind_of_Verdure,
+ delitem 992, 20;//Items: Wind_of_Verdure,
+ skill 1019,1,0;
+ goto L_alreadyhave;
+}
diff --git a/npc/quests/skills/swordman_skills.txt b/npc/quests/skills/swordman_skills.txt
index d1a915ece..618c93db7 100644
--- a/npc/quests/skills/swordman_skills.txt
+++ b/npc/quests/skills/swordman_skills.txt
@@ -1,374 +1,374 @@
-//===== eAthena Script =======================================
-//= Swordsman Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.5a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.
-//= 1.1 Added missing delitem [Lupus]
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Updated the NPC to allow subclasses of swordsman to learn the skills, [MasterOfMuppets]
-//= 1.5 Fixed exploits [Lupus]
-//= 1.5a Fixed some typos [IVBela]
-//============================================================
-
-
-
-//<-------------------------------------- Fatal Blow------------------------------------>\\
-prt_in.gat,75,88,5 script Leon 85,{
- mes "[Leon]";
- if(baseClass == Job_Swordman) goto L_Start;
- if(BaseJob == Job_Novice) goto L_Novice;
-
- mes "Hello there. I am Leon, a well known and well respected member of the famous Prontera Chivalry.";
- next;
- mes "[Leon]";
- mes "Are you here to learn more about the Chivalry, or are you hear to bask in the glory of us Knights? Hahahaha!";
- emotion e_heh;
- close;
-
-L_Novice:
- mes "Oh a novice.... I'm afraid I have nothing to offer you.";
- mes "I have no fun or nice things to say to anyone other then Swordsmen.";
- next;
- mes "[Leon]";
- mes "See you in a better world!";
- close;
-
-L_Start:
- if (FATALBLOW == 1) goto L_Check;
- if (getskilllv(145)>0) goto L_Done;
-
- if(sex==1)mes "Oooh! I see that you are quite a strong Swordsman.";
- if(sex==0)mes "Oooh! I see that you are quite a strong Swordswoman.";
- mes "How did I know? Hahaha! Just look at that strong arm of yours!";
- next;
- mes "[Leon]";
- mes "You must enjoy using ^0000ff'Bash'^000000, huh? Hahaha!";
- emotion e_heh;
- next;
- mes "[Leon]";
- if(sex==1)mes "I like a Swordsman who isn't afraid to use a powerful skill such as that.";
- if(sex==0)mes "Now, now, don't be shy. It's OK for girls to like Bash.";
- if(sex==0)mes "After all, whether your a Swordsman or Swordswoman, there's no denying the power of Bash!";
- next;
- mes "[Leon]";
- mes "As great as Bash is though, I often felt that it could be even better if there was some way to stun an opponent with it.";
- mes "I decided to withdraw from the battlefield and research ways of making bash more powerful.";
- next;
- mes "[Leon]";
- mes "I discovered that if one could strike an enemy's weak point with a precisely placed Bash, an opponent would be left utterly paralyzed!!";
- next;
- mes "[Leon]";
- mes "I then went on to develop the skill, ^ff0000'Fatal Blow'^000000, which allows you to do just that!";
- mes "With rigorous training, one can learn to stun an opponent with a mighty Bash.";
- next;
- mes "[Leon]";
- mes "Since you seem to be so fond of Bash, I'd be willing to teach you the skill.";
- mes "However, I must warn you that a lot of hard work will be required.";
- next;
- mes "[Leon]";
- mes "So what do you think? Are you interested?";
- next;
- menu "You betcha!!",M_0, "Nah.... Not really.",M_1, "Any advice on how to eat sushi?",M_2;
-
- M_0:
- set FATALBLOW,1;
- mes "[Leon]";
- mes "Hahaha! I knew you love Bash as much as I do.";
- next;
- mes "[Leon]";
- mes "In order for me to teach you Fatal Blow, you must have at least ^5555FFlevel 5 Bash^000000. You then need to give me these items:";
- mes "- 10 ^FF0000Fire Arrows^000000,";
- mes "- 10 ^FF0000Silver Arrows^000000,";
- mes "- 1 ^FF0000Banana Juice^000000,";
- mes "- 30 ^FF0000Tentacles^000000,";
- mes "- and 5 ^FF0000Royal Jelly^000000.";
- next;
- mes "[Leon]";
- mes "When you have gathered all of these items come back and see me.";
- close;
- M_1:
- mes "[Leon]";
- mes "I see... I must have misjudged you...";
- close;
- M_2:
- mes "[*Sushi King* Leon]";
- mes "The best way to eat sushi is with your hands. That is the basic method. Oh, and dip the FISH, NOT the RICE, into the soy sauce.";
- next;
- mes "[*Sushi King* Leon]";
- mes "That way you get a richer flavor. Also, always eat the kind that is in season.";
- mes "Eating in the order of white fish, then blue fish, will make it taste even better!";
- next;
- mes "[*Sushi King* Leon]";
- mes "Mmmmm..... I love sushi!!!";
- emotion e_ok;
- close;
-
-L_Check:
- mes "So you're back. Did you get what I asked for?";
- next;
- mes "[Leon]";
- if(countitem(1752)<10 || countitem(1751)<10 || countitem(532)<1 || countitem(962)<30 || countitem(526)<5) goto L_NoItems;
- if(getskilllv(5)<5) goto L_BashLvl;
- delitem 1752,10;
- delitem 1751,10;
- delitem 532,1;
- delitem 962,30;
- delitem 526,5;
- mes "Great work. You have everything I need for me to teach you Fatal Blow.";
- next;
- mes "[Leon]";
- mes "OK, lets get started.";
- next;
- mes "!SMACK!~!CRACK!~!THWACK!~!BASH!.......... !SMACK!~!CRACK!~!THWACK!~!BASH!..........";
- next;
- mes "(5 hours later)";
- next;
- mes "[Leon]";
- mes "Yes! That's it! You have just mastered Fatal Blow!";
- emotion e_no1;
- next;
- skill 145,1,0;
- set FATALBLOW,0;
- mes "[Leon]";
- mes "Use it wisely young warrior!!";
- close;
-
- L_NoItems:
- mes "Hmm... you still don't have enough items. Come back when you do.";
- close;
- L_BashLvl:
- mes "Wait a minute... you have to train a little more before learning this skill.";
- mes "You need to have at least a ^5555FFlevel 5 Bash^000000.";
- close;
-
-L_Done:
- mes "So how is Fatal Blow? Isn't it great!! Hahaha! I knew you'd like it.";
- next;
- mes "[Leon]";
- mes "Go on and Bash the heck out of those monsters! Hahaha.";
- emotion e_heh;
- close;
-
-}
-
-
-//<---------------------------------- Moving HP Recovery ---------------------------------->\\
-izlude_in.gat,175,130,2 script Knight De Thomas 98,{
- mes "[Knight De Thomas]";
- if(baseClass == Job_Swordman) goto L_Start;
-
-L_Other:
- mes "I am Thomas De Knight of the Prontera Chivalry. I am very busy now so please leave me alone.";
- close;
-
-L_Start:
- if (MOVHPREC == 1) goto L_Check;
- if (getskilllv(144)>0) goto L_GotSkill;
- mes "Oh no! You must have been hurt in battle! Are you OK?";
- mes "It must have been a hard fought battle for you to receive such serious injuries....";
- emotion e_swt2;
- next;
- mes "[Knight De Thomas]";
- mes "Being a Swordsman or Knight comes with a lot of responsibility and requires a great deal of self sacrifice.";
- mes "For Swordsmen and Knights there is a wonderful skill that can aid in the recovery of HP.";
- next;
- mes "[Knight De Thomas]";
- mes "I present to you..... ^5555FF'Moving HP Recovery'^000000!! This skill allows you to recover HP while moving!";
- next;
- mes "[Knight De Thomas]";
- mes "The skill has not been perfected yet so the amount of HP recovered is a little low. Still, it is helpful.";
- mes "What do you think? Would you like to learn this skill?";
- next;
- menu "What a great skill! I would like to learn it!!",M_0, "No thank you.",M_End;
-
- M_0:
- mes "[Knight De Thomas]";
- mes "Very well. I will tell you what is needed to learn this skill. First you must have a job level of 35 or greater.";
- mes "This however doesn't apply to Knights or Crusaders. You will also need:";
- mes "^5555FF200 Empty Bottles^000000,";
- mes "^5555FF1 Padded Armour^000000,";
- mes "and ^5555FF1 Moth Wings^000000.";
- next;
- mes "[Knight De Thomas]";
- mes "The bottles are proof that you have fought fiercely and have used many potions. The Padded Armor is proof of an experienced fighter.";
- mes "The Moth Wings..... well... really aren't necessary. It's just that my niece received a bug hunting assignment for summer vacation.......";
- next;
- mes "[Knight De Thomas]";
- mes "I would get them myself... it's just... I must work here all day long so I don't have any time to go out and get them.......";
- next;
- mes "[Knight De Thomas]";
- mes "Don't you think it's sad that I have to stay in once place everyday without even being able to go outside??";
- mes "Please.... find a pair of Moth Wings for my niece?.... (~sniff~sniff~)....";
- emotion e_sob;
- next;
- mes "[Knight De Thomas]";
- mes "If you don't..... I won't teach you anything!! Muahahahaha!!";
- emotion e_gg;
- set MOVHPREC, 1;
- close;
- M_End:
- mes "[Knight De Thomas]";
- mes "What?? What did you say?.....";
- emotion e_what;
- close;
-
-L_Check:
- mes "Ah, you've come back. Let's, see... are you ready for HP Moving Recovery?....";
- next;
- mes "[Knight De Thomas]";
- if ((countitem(713)<200) || (countitem(1058)<1) || (countitem(2312)<1)) goto L_NoItems;
- if (baseClass==Job_Swordman && JobLevel < 35) goto L_LowLvl;
- delitem 713,200;
- delitem 1058,1;
- mes "Great! You have everything needed to learn this skill. Take a deep breath.... let us begin.";
- next;
- mes "(2 hours later)";
- next;
- mes "[Knight De Thomas]";
- mes "Can you feel it? Can you feel the energy flowing in you while you move around?";
- mes "Haha! You have just learned HP Moving Recovery!";
-//-- Padded armor does not have to be deleted! --
-// delitem 2312,1;
- skill 144,1,0;
- set MOVHPREC, 0;
- next;
- mes "[Knight De Thomas]";
- mes "Congratulations on learning the new skill and thank you for the Moth Wings! ^_^";
- emotion e_no1;
- close;
-
- L_NoItems:
- mes "As I said before you need to bring me these items:";
- mes "^5555FF200 Empty Bottles^000000,";
- mes "^5555FF1 Padded Armour^000000,";
- mes "and ^5555FF1 Moth Wings^000000.";
- close;
- L_LowLvl:
- mes "You are not yet experienced enough to learn this skill. Come back when you have a job level of at least 35.";
- close;
- L_GotSkill:
- mes "Ah, you're looking well. That HP Moving Recovery skill must be very helpful.";
- mes "Well, continued success on your adventure!";
- close;
-
-}
-
-
-//<----------------------------------------- Auto-Berserk --------------------------------->\\
-prt_in.gat,94,57,3 script Juan 85,{
- mes "[Juan]";
- if(baseClass == Job_Swordman) goto L_Start;
-
-L_Other:
- mes "So how's your adventure going? I hope there will be good days ahead of you.";
- next;
- mes "[Juan]";
- mes "Who am I? Oh, I'm just a kind knight named Juan. Don't mind me. Hahahaha....";
- emotion e_heh;
- close;
-
-L_Start:
- if (baseClass == Job_Swordman && JobLevel<30) goto L_LowLvl;
- if (BERSERK == 1) goto L_Check;
- if (getskilllv(146)>0) goto L_GotSkill;
-
- mes "Oh no! You have more injuries since the last time I saw you.";
- mes "You went into battle like this? It seems like you're straining yourself.";
- next;
- mes "[Juan]";
- mes "Even though you may have a lot of strength, there is only so much you can do when you have reached your limits.";
- mes "So don't overestimate your own power.";
- next;
- mes "[Juan]";
- mes "Of course you could always use the ^5555FF'skill'^000000 we developed to overcome these limits.....";
- next;
- menu "Eh! What are you talking about?",M_0, "Haha! There's no such thing....",M_1, "Keuuuuuhhh!",M_3;
-
- M_0:
- mes "[Juan]";
- mes "The skill is called ^5555FFBerserk^000000. It has been deemed the flower of the battlefield!";
- mes "When your health is low, you can call upon your hidden potential by provoking yourself.";
- next;
- mes "[Juan]";
- mes "A surge of energy will flow through your body giving you greater attack power at the cost of defensive strength.";
- mes "With this you will be able to fight on with a FIERY RAGE and an absolute disregard to your own safety!!";
- next;
- mes "[Juan]";
- mes "The enemy will be shocked by your new found strength!!";
- mes "This skill is especially great for those who fight with a no-holds-bar mentality.";
- next;
- mes "[Juan]";
- mes "In order to learn this skill you will need to bring me the following items:";
- mes "^5555FF35 Powder of Butterfly,";
- mes "10 Horrendous Mouth,";
- mes "10 Decayed Nail^000000,";
- mes "and ^5555FF10 Honeys^000000!";
- next;
- mes "[Juan]";
- mes "Did you get all of that down? Please come back when you are ready. I look forward to seeing you again.";
- set BERSERK, 1;
- close;
- M_1:
- mes "[Juan]";
- mes "Bleh! Have you been a fool all of your life?? Go away and don't talk to me.";
- emotion e_pif;
- close;
- M_3:
- mes "[Juan]";
- mes "Keuuuuuuuuuuuuuuuuuuh!";
- mes "Oooowwwwwwwwuuuuuuuuuuhhhhhh!";
- mes "Keuaaaaaaaaaaaaaaaaaah!";
- close;
-
- L_LowLvl:
- mes "Oh, nice to meet you.";
- next;
- mes "[Juan]";
- mes "You can go on your way now.";
- emotion e_ok;
- close;
-
-L_Check:
- if ((countitem(924)<35) && (countitem(957)<10) && (countitem(958)<10) && (countitem(518)<10)) goto L_NoItems;
- delitem 924,35;
- delitem 958,10;
- delitem 957,10;
- delitem 518,10;
- mes "Good job my dear friend. You have all 4 of the items I asked for.";
- mes "In return I will now teach you the skill: ^FF0000Berserk^000000.";
- next;
- mes "[Juan]";
- mes "Great job you have done well and deserve this skill.";
- skill 146,1,0;
- set BERSERK, 0;
- next;
- mes "[Juan]";
- mes "Muhahahaha!! Don't hold back young warrior, fight without any fears or regrets!!";
- emotion e_gg;
- close;
-
- L_NoItems:
- mes "[Juan]";
- mes "In order to learn this skill you will need to bring me the following items:";
- mes "^5555FF35 Powder of Butterfly,";
- mes "10 Horrendous Mouth,";
- mes "10 Decayed Nail^000000,";
- mes "and ^5555FF10 Honeys^000000!";
- close;
-L_GotSkill:
-
- mes "You have the eyes of a person who has seen death first hand!!";
- mes "But, because of Berserk, I'm sure you have been able to escape it many times as well.";
- emotion e_gasp;
- close;
-}
+//===== eAthena Script =======================================
+//= Swordsman Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.5a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.
+//= 1.1 Added missing delitem [Lupus]
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Updated the NPC to allow subclasses of swordsman to learn the skills, [MasterOfMuppets]
+//= 1.5 Fixed exploits [Lupus]
+//= 1.5a Fixed some typos [IVBela]
+//============================================================
+
+
+
+//<-------------------------------------- Fatal Blow------------------------------------>\\
+prt_in.gat,75,88,5 script Leon 85,{
+ mes "[Leon]";
+ if(baseClass == Job_Swordman) goto L_Start;
+ if(BaseJob == Job_Novice) goto L_Novice;
+
+ mes "Hello there. I am Leon, a well known and well respected member of the famous Prontera Chivalry.";
+ next;
+ mes "[Leon]";
+ mes "Are you here to learn more about the Chivalry, or are you hear to bask in the glory of us Knights? Hahahaha!";
+ emotion e_heh;
+ close;
+
+L_Novice:
+ mes "Oh a novice.... I'm afraid I have nothing to offer you.";
+ mes "I have no fun or nice things to say to anyone other then Swordsmen.";
+ next;
+ mes "[Leon]";
+ mes "See you in a better world!";
+ close;
+
+L_Start:
+ if (FATALBLOW == 1) goto L_Check;
+ if (getskilllv(145)>0) goto L_Done;
+
+ if(sex==1)mes "Oooh! I see that you are quite a strong Swordsman.";
+ if(sex==0)mes "Oooh! I see that you are quite a strong Swordswoman.";
+ mes "How did I know? Hahaha! Just look at that strong arm of yours!";
+ next;
+ mes "[Leon]";
+ mes "You must enjoy using ^0000ff'Bash'^000000, huh? Hahaha!";
+ emotion e_heh;
+ next;
+ mes "[Leon]";
+ if(sex==1)mes "I like a Swordsman who isn't afraid to use a powerful skill such as that.";
+ if(sex==0)mes "Now, now, don't be shy. It's OK for girls to like Bash.";
+ if(sex==0)mes "After all, whether your a Swordsman or Swordswoman, there's no denying the power of Bash!";
+ next;
+ mes "[Leon]";
+ mes "As great as Bash is though, I often felt that it could be even better if there was some way to stun an opponent with it.";
+ mes "I decided to withdraw from the battlefield and research ways of making bash more powerful.";
+ next;
+ mes "[Leon]";
+ mes "I discovered that if one could strike an enemy's weak point with a precisely placed Bash, an opponent would be left utterly paralyzed!!";
+ next;
+ mes "[Leon]";
+ mes "I then went on to develop the skill, ^ff0000'Fatal Blow'^000000, which allows you to do just that!";
+ mes "With rigorous training, one can learn to stun an opponent with a mighty Bash.";
+ next;
+ mes "[Leon]";
+ mes "Since you seem to be so fond of Bash, I'd be willing to teach you the skill.";
+ mes "However, I must warn you that a lot of hard work will be required.";
+ next;
+ mes "[Leon]";
+ mes "So what do you think? Are you interested?";
+ next;
+ menu "You betcha!!",M_0, "Nah.... Not really.",M_1, "Any advice on how to eat sushi?",M_2;
+
+ M_0:
+ set FATALBLOW,1;
+ mes "[Leon]";
+ mes "Hahaha! I knew you love Bash as much as I do.";
+ next;
+ mes "[Leon]";
+ mes "In order for me to teach you Fatal Blow, you must have at least ^5555FFlevel 5 Bash^000000. You then need to give me these items:";
+ mes "- 10 ^FF0000Fire Arrows^000000,";
+ mes "- 10 ^FF0000Silver Arrows^000000,";
+ mes "- 1 ^FF0000Banana Juice^000000,";
+ mes "- 30 ^FF0000Tentacles^000000,";
+ mes "- and 5 ^FF0000Royal Jelly^000000.";
+ next;
+ mes "[Leon]";
+ mes "When you have gathered all of these items come back and see me.";
+ close;
+ M_1:
+ mes "[Leon]";
+ mes "I see... I must have misjudged you...";
+ close;
+ M_2:
+ mes "[*Sushi King* Leon]";
+ mes "The best way to eat sushi is with your hands. That is the basic method. Oh, and dip the FISH, NOT the RICE, into the soy sauce.";
+ next;
+ mes "[*Sushi King* Leon]";
+ mes "That way you get a richer flavor. Also, always eat the kind that is in season.";
+ mes "Eating in the order of white fish, then blue fish, will make it taste even better!";
+ next;
+ mes "[*Sushi King* Leon]";
+ mes "Mmmmm..... I love sushi!!!";
+ emotion e_ok;
+ close;
+
+L_Check:
+ mes "So you're back. Did you get what I asked for?";
+ next;
+ mes "[Leon]";
+ if(countitem(1752)<10 || countitem(1751)<10 || countitem(532)<1 || countitem(962)<30 || countitem(526)<5) goto L_NoItems;
+ if(getskilllv(5)<5) goto L_BashLvl;
+ delitem 1752,10;
+ delitem 1751,10;
+ delitem 532,1;
+ delitem 962,30;
+ delitem 526,5;
+ mes "Great work. You have everything I need for me to teach you Fatal Blow.";
+ next;
+ mes "[Leon]";
+ mes "OK, lets get started.";
+ next;
+ mes "!SMACK!~!CRACK!~!THWACK!~!BASH!.......... !SMACK!~!CRACK!~!THWACK!~!BASH!..........";
+ next;
+ mes "(5 hours later)";
+ next;
+ mes "[Leon]";
+ mes "Yes! That's it! You have just mastered Fatal Blow!";
+ emotion e_no1;
+ next;
+ skill 145,1,0;
+ set FATALBLOW,0;
+ mes "[Leon]";
+ mes "Use it wisely young warrior!!";
+ close;
+
+ L_NoItems:
+ mes "Hmm... you still don't have enough items. Come back when you do.";
+ close;
+ L_BashLvl:
+ mes "Wait a minute... you have to train a little more before learning this skill.";
+ mes "You need to have at least a ^5555FFlevel 5 Bash^000000.";
+ close;
+
+L_Done:
+ mes "So how is Fatal Blow? Isn't it great!! Hahaha! I knew you'd like it.";
+ next;
+ mes "[Leon]";
+ mes "Go on and Bash the heck out of those monsters! Hahaha.";
+ emotion e_heh;
+ close;
+
+}
+
+
+//<---------------------------------- Moving HP Recovery ---------------------------------->\\
+izlude_in.gat,175,130,2 script Knight De Thomas 98,{
+ mes "[Knight De Thomas]";
+ if(baseClass == Job_Swordman) goto L_Start;
+
+L_Other:
+ mes "I am Thomas De Knight of the Prontera Chivalry. I am very busy now so please leave me alone.";
+ close;
+
+L_Start:
+ if (MOVHPREC == 1) goto L_Check;
+ if (getskilllv(144)>0) goto L_GotSkill;
+ mes "Oh no! You must have been hurt in battle! Are you OK?";
+ mes "It must have been a hard fought battle for you to receive such serious injuries....";
+ emotion e_swt2;
+ next;
+ mes "[Knight De Thomas]";
+ mes "Being a Swordsman or Knight comes with a lot of responsibility and requires a great deal of self sacrifice.";
+ mes "For Swordsmen and Knights there is a wonderful skill that can aid in the recovery of HP.";
+ next;
+ mes "[Knight De Thomas]";
+ mes "I present to you..... ^5555FF'Moving HP Recovery'^000000!! This skill allows you to recover HP while moving!";
+ next;
+ mes "[Knight De Thomas]";
+ mes "The skill has not been perfected yet so the amount of HP recovered is a little low. Still, it is helpful.";
+ mes "What do you think? Would you like to learn this skill?";
+ next;
+ menu "What a great skill! I would like to learn it!!",M_0, "No thank you.",M_End;
+
+ M_0:
+ mes "[Knight De Thomas]";
+ mes "Very well. I will tell you what is needed to learn this skill. First you must have a job level of 35 or greater.";
+ mes "This however doesn't apply to Knights or Crusaders. You will also need:";
+ mes "^5555FF200 Empty Bottles^000000,";
+ mes "^5555FF1 Padded Armour^000000,";
+ mes "and ^5555FF1 Moth Wings^000000.";
+ next;
+ mes "[Knight De Thomas]";
+ mes "The bottles are proof that you have fought fiercely and have used many potions. The Padded Armor is proof of an experienced fighter.";
+ mes "The Moth Wings..... well... really aren't necessary. It's just that my niece received a bug hunting assignment for summer vacation.......";
+ next;
+ mes "[Knight De Thomas]";
+ mes "I would get them myself... it's just... I must work here all day long so I don't have any time to go out and get them.......";
+ next;
+ mes "[Knight De Thomas]";
+ mes "Don't you think it's sad that I have to stay in once place everyday without even being able to go outside??";
+ mes "Please.... find a pair of Moth Wings for my niece?.... (~sniff~sniff~)....";
+ emotion e_sob;
+ next;
+ mes "[Knight De Thomas]";
+ mes "If you don't..... I won't teach you anything!! Muahahahaha!!";
+ emotion e_gg;
+ set MOVHPREC, 1;
+ close;
+ M_End:
+ mes "[Knight De Thomas]";
+ mes "What?? What did you say?.....";
+ emotion e_what;
+ close;
+
+L_Check:
+ mes "Ah, you've come back. Let's, see... are you ready for HP Moving Recovery?....";
+ next;
+ mes "[Knight De Thomas]";
+ if ((countitem(713)<200) || (countitem(1058)<1) || (countitem(2312)<1)) goto L_NoItems;
+ if (baseClass==Job_Swordman && JobLevel < 35) goto L_LowLvl;
+ delitem 713,200;
+ delitem 1058,1;
+ mes "Great! You have everything needed to learn this skill. Take a deep breath.... let us begin.";
+ next;
+ mes "(2 hours later)";
+ next;
+ mes "[Knight De Thomas]";
+ mes "Can you feel it? Can you feel the energy flowing in you while you move around?";
+ mes "Haha! You have just learned HP Moving Recovery!";
+//-- Padded armor does not have to be deleted! --
+// delitem 2312,1;
+ skill 144,1,0;
+ set MOVHPREC, 0;
+ next;
+ mes "[Knight De Thomas]";
+ mes "Congratulations on learning the new skill and thank you for the Moth Wings! ^_^";
+ emotion e_no1;
+ close;
+
+ L_NoItems:
+ mes "As I said before you need to bring me these items:";
+ mes "^5555FF200 Empty Bottles^000000,";
+ mes "^5555FF1 Padded Armour^000000,";
+ mes "and ^5555FF1 Moth Wings^000000.";
+ close;
+ L_LowLvl:
+ mes "You are not yet experienced enough to learn this skill. Come back when you have a job level of at least 35.";
+ close;
+ L_GotSkill:
+ mes "Ah, you're looking well. That HP Moving Recovery skill must be very helpful.";
+ mes "Well, continued success on your adventure!";
+ close;
+
+}
+
+
+//<----------------------------------------- Auto-Berserk --------------------------------->\\
+prt_in.gat,94,57,3 script Juan 85,{
+ mes "[Juan]";
+ if(baseClass == Job_Swordman) goto L_Start;
+
+L_Other:
+ mes "So how's your adventure going? I hope there will be good days ahead of you.";
+ next;
+ mes "[Juan]";
+ mes "Who am I? Oh, I'm just a kind knight named Juan. Don't mind me. Hahahaha....";
+ emotion e_heh;
+ close;
+
+L_Start:
+ if (baseClass == Job_Swordman && JobLevel<30) goto L_LowLvl;
+ if (BERSERK == 1) goto L_Check;
+ if (getskilllv(146)>0) goto L_GotSkill;
+
+ mes "Oh no! You have more injuries since the last time I saw you.";
+ mes "You went into battle like this? It seems like you're straining yourself.";
+ next;
+ mes "[Juan]";
+ mes "Even though you may have a lot of strength, there is only so much you can do when you have reached your limits.";
+ mes "So don't overestimate your own power.";
+ next;
+ mes "[Juan]";
+ mes "Of course you could always use the ^5555FF'skill'^000000 we developed to overcome these limits.....";
+ next;
+ menu "Eh! What are you talking about?",M_0, "Haha! There's no such thing....",M_1, "Keuuuuuhhh!",M_3;
+
+ M_0:
+ mes "[Juan]";
+ mes "The skill is called ^5555FFBerserk^000000. It has been deemed the flower of the battlefield!";
+ mes "When your health is low, you can call upon your hidden potential by provoking yourself.";
+ next;
+ mes "[Juan]";
+ mes "A surge of energy will flow through your body giving you greater attack power at the cost of defensive strength.";
+ mes "With this you will be able to fight on with a FIERY RAGE and an absolute disregard to your own safety!!";
+ next;
+ mes "[Juan]";
+ mes "The enemy will be shocked by your new found strength!!";
+ mes "This skill is especially great for those who fight with a no-holds-bar mentality.";
+ next;
+ mes "[Juan]";
+ mes "In order to learn this skill you will need to bring me the following items:";
+ mes "^5555FF35 Powder of Butterfly,";
+ mes "10 Horrendous Mouth,";
+ mes "10 Decayed Nail^000000,";
+ mes "and ^5555FF10 Honeys^000000!";
+ next;
+ mes "[Juan]";
+ mes "Did you get all of that down? Please come back when you are ready. I look forward to seeing you again.";
+ set BERSERK, 1;
+ close;
+ M_1:
+ mes "[Juan]";
+ mes "Bleh! Have you been a fool all of your life?? Go away and don't talk to me.";
+ emotion e_pif;
+ close;
+ M_3:
+ mes "[Juan]";
+ mes "Keuuuuuuuuuuuuuuuuuuh!";
+ mes "Oooowwwwwwwwuuuuuuuuuuhhhhhh!";
+ mes "Keuaaaaaaaaaaaaaaaaaah!";
+ close;
+
+ L_LowLvl:
+ mes "Oh, nice to meet you.";
+ next;
+ mes "[Juan]";
+ mes "You can go on your way now.";
+ emotion e_ok;
+ close;
+
+L_Check:
+ if ((countitem(924)<35) && (countitem(957)<10) && (countitem(958)<10) && (countitem(518)<10)) goto L_NoItems;
+ delitem 924,35;
+ delitem 958,10;
+ delitem 957,10;
+ delitem 518,10;
+ mes "Good job my dear friend. You have all 4 of the items I asked for.";
+ mes "In return I will now teach you the skill: ^FF0000Berserk^000000.";
+ next;
+ mes "[Juan]";
+ mes "Great job you have done well and deserve this skill.";
+ skill 146,1,0;
+ set BERSERK, 0;
+ next;
+ mes "[Juan]";
+ mes "Muhahahaha!! Don't hold back young warrior, fight without any fears or regrets!!";
+ emotion e_gg;
+ close;
+
+ L_NoItems:
+ mes "[Juan]";
+ mes "In order to learn this skill you will need to bring me the following items:";
+ mes "^5555FF35 Powder of Butterfly,";
+ mes "10 Horrendous Mouth,";
+ mes "10 Decayed Nail^000000,";
+ mes "and ^5555FF10 Honeys^000000!";
+ close;
+L_GotSkill:
+
+ mes "You have the eyes of a person who has seen death first hand!!";
+ mes "But, because of Berserk, I'm sure you have been able to escape it many times as well.";
+ emotion e_gasp;
+ close;
+}
diff --git a/npc/quests/skills/thief_skills.txt b/npc/quests/skills/thief_skills.txt
index 965c58591..39f3c3a0c 100644
--- a/npc/quests/skills/thief_skills.txt
+++ b/npc/quests/skills/thief_skills.txt
@@ -1,387 +1,387 @@
-//===== eAthena Script =======================================
-//= Thief Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.4b
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Sand Attack, Back Slide, Find Stone, Stone Fling skill quests.
-//===== Additional Comments: =================================
-//= v1.0 Fully working
-//= v1.1 Changed Sand Attack requirements from 5 Grit to 5 Fine Grit and a
-//= Leather Bag of Infinity. These are the official RO requirements
-//= Added npc RuRumuni, maker of Leather Bag of Infinity. [kobra_k88]
-//= v1.1a Now using functions found in "Global_Functions.txt" for
-//= class checks.[kobra_k88]
-//= 1.2 Added Baby Class Support [Lupus]
-//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
-//= 1.4 Fixed exploit [Lupus]
-//= 1.4a Fixed some typos [IVBela]
-//= 1.4b changed perm. variables to temp ones [Lupus]
-//============================================================
-
-
-
-//======================================================================================================
-moc_prydb1.gat,154,128,4 script Alcouskou 118,{
- mes "[Alcouskou]";
- if(baseClass == Job_Thief) goto L_Start;
- if(BaseJob==Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Your kind isn't welcome here.";
- close;
-
-L_Novice:
- mes "Although thieves and assassins have basic skills which aid them in their jobs, most don't have the 'special' skills which can make them truly great!";
- next;
- mes "[Alcouskou]";
- mes "I just happen to be the ONLY one who can teach them these skills!";
- mes "If you ever decide to become a Thief or an Assassin, come back here and I'll teach you these cool skills.";
- next;
- mes "[Alcouskou]";
- mes "And if you know anyone who already is one, send them to me. I'm willing to teach anyone who's interested.";
- close;
-
-L_Start:
- mes "During the course of your life you will experience many things.";
- mes "You many have trouble understanding the importance of some of these experiences, and may even consider them to be useless to you.";
- next;
- mes "[Alcouskou]";
- mes "But do not be to hasty with your judgement of them, for some of these experience may actually prove to be beneficial for you.";
- next;
- mes "[Alcouskou]";
- mes "Let me explain:";
-M_Menu:
- next;
- menu "-Sand Attack",M_Sand, "-Back Slide",M_Back, "-Find Stone",M_Find, "-Stone Fling",M_Fling, "-I will be back later.",M_End;
-
- M_Sand:
- mes "[Alcouskou]";
- if(@SANDATTACK) goto L_Sand;
- if(getskilllv(149) > 0) goto L_GotSand;
- mes "The most important aspect of being a good Thief/Assassin is stealth. One should never be seen or touched unless he/she wants to be";
- next;
- mes "[Alcouskou]";
- mes "Some may consider this cowardly but I don't see it that way.";
- mes "We live in a world where it is the survival of the fittest and you must do whatever it takes to survive.....";
- next;
- mes "[Alcouskou]";
- mes "Even if this means throwing sand in an enemy's face. That is why the skill, ^5555FFSand Attack^000000, was created.";
- next;
- mes "[Alcouskou]";
- mes "This skill allows the user to throw and kick sand in the eyes of an opponent, temporarily blinding them.";
- mes "This effectively impairs the opponent's ability to defend or attack giving the user a brief but great advantage.";
- next;
- mes "[Alcouskou]";
- mes "In order to learn this skill you will need to gather ^5555FF5 Fine Grit^000000 and a ^FF3355'Leather Bag of Infinity'^000000.";
- if(BaseJob == Job_Thief) mes "You will also need a job level of at least ^5555FF25^000000.";
- next;
- mes "[Alcouskou]";
- mes "You can find the Leather Bag of Infinity by talking to a merchant by the name of ^5533FFRuRumuni^000000.";
- mes "He can be found in the ^009500West end of Payon^000000.";
- next;
- mes "[Alcouskou]";
- mes "Come back when you are ready.";
- set @SANDATTACK, 1;
- goto M_Menu;
- M_Back:
- mes "[Alcouskou]";
- if(@BACKSLIDE)goto L_Back;
- if(getskilllv(150)>0) goto L_GotBack;
- mes "People tend to focus on attack and damage, but it's necessary to understand that FLEEING is JUST AS IMPORTANT as attacking!";
- next;
- mes "[Alcouskou]";
- mes "We thieves/assassins pride ourselves on our speed and ability to quickly dodge.";
- mes "Of course I'm sure you've noticed that there is a downside to that speed and quickness.....";
- next;
- mes "[Alcouskou]";
- mes "If we DO get hit, depending on the monster, that single hit could put us in serious danger!";
- next;
- mes "[Alcouskou]";
- mes "I can understand how funny it is to watch a monster constantly miss while its attacking you, but......";
- next;
- mes "[Alcouskou]";
- mes "If you get attacked by a large group of monsters..... you may not even have room to dodge and that won't be at all funny.";
- next;
- mes "[Alcouskou]";
- mes "That's why most Thieves/Assassins fear large mobs and will flee at the first sign of them.";
- mes "There are those however, that do not fear being overwhelmed by a large mob.";
- next;
- mes "[Alcouskou]";
- mes "These are the people who have learned a unique skill that allows them to deal with mob situations.";
- mes "The skill enables the user to quickly 'back' out of the way of a mob, putting a great deal of distance between the two.";
- next;
- mes "[Alcouskou]";
- mes "The skill is called ^5555FFBack Slide^000000 and requires a lot of practice to master.";
- mes "If you wish to learn this skill you will first need to bring in ^5555FF20 Grasshopper's Legs^000000.";
- next;
- mes "[Alcouskou]";
- mes "Think of it as the first part of your training.";
- if(BaseJob == Job_Thief) mes "If you are a Thief, you will also need to have a job level of at least ^5555FF35^000000.";
- set @BACKSLIDE, 1;
- goto M_Menu;
- M_Find:
- mes "[Alcouskou]";
- if(@FINDSTONE) goto L_Find;
- if(getskilllv(151)>0) goto L_GotFind;
- mes "The more experienced and better skilled members of our guild are quite handy.";
- mes "They can turn something as common as a rock on the ground into a very effective weapon.";
- next;
- mes "[Alcouskou]";
- mes "They can throw a rock at a far away target with great accuracy and strength.";
- mes "They can throw it so powerfully that sometimes an enemy will become stunned by it.";
- next;
- mes "[Alcouskou]";
- mes "Of course not every stone can be used as a weapon. That is why the skill, ^5555FFFind Sone^000000, was developed.";
- mes "With practice one can learn to pick out a stone that has a weight and shape that is fit for 'flinging'.";
- next;
- mes "[Alcouskou]";
- mes "Once mastered a Thieve/Assassin will be able to pick up stones from any location.";
- mes "Think about it... the ability to use a long range weapon without spending any zeny.... isn't it great?";
- next;
- mes "[Alcouskou]";
- mes "If you want to learn this skill you must do a little training first. Start by picking up ^5555FF1 Bear's Footskin^000000.";
- mes "Then try to find ^5555FF1 Zargon^000000. Next pick out ^5555FF5 Spawn^000000. Once you've done all this come back and see me.";
- next;
- mes "[Alcouskou]";
- mes "Collecting those items will help you develop the skills necessary to learn Find Stone.";
- set @FINDSTONE, 1;
- goto M_Menu;
- M_Fling:
- mes "[Alcouskou]";
- if(@STONEFLING) goto L_Fling;
- if(getskilllv(152)>0) goto L_GotFling;
- mes "The more experienced and better skilled members of our guild are quite handy.";
- mes "They can turn something as common as a rock on the ground into a very effective weapon.";
- next;
- mes "[Alcouskou]";
- mes "They can throw a stone at a target far away with great accuracy and strength.";
- mes "They can throw it so powerfully that sometimes an enemy will become stunned by it.";
- next;
- mes "[Alcouskou]";
- mes "These guild members call this skill ^5555FFStone Fling^000000. It is extremely useful and doesn't cost any zeny.";
- next;
- mes "[Alcouskou]";
- mes "If you wish to learn Stone Fling you must first bring me ^5555FF2 Garlet and 2 Scell^000000.";
- mes "You will also need to have mastered ^5555FFFind Stone^000000 as well.";
- set @STONEFLING, 1;
- goto M_Menu;
- M_End:
- mes "[Alcouskou]";
- mes "It seems that you are not experienced enough yet....";
- close;
-
-L_Sand:
- if(countitem(7041)<5 || countitem(7042)<1) goto L_NotRdy1;
- if(BaseJob==Job_Thief && JobLevel<25) goto L_LowLvl1;
- delitem 7041, 5;
- delitem 7042, 1;
- mes "Alright, you've got all the items. Now it's time to learn.... the... ultimate.... attack.... Sand Attack!!!";
- next;
- mes "[Alcouskou]";
- mes "Look down at your feet. See that? The very thing your stepping on is the secret behind this skill......... SAND!!";
- next;
- mes "[Alcouskou]";
- mes "Okay, grab a handful....... yep, that much will do....... now.........";
- next;
- mes "[Alcouskou]";
- mes "THROW IT AT ME!!!";
- emotion e_go;
- next;
- mes "[Alcouskou]";
- mes "(AHHH!! My EYES!!! Son of a)......... ya see how effective that was........ (JEEZE that STINGS!!).......";
- emotion e_omg;
- next;
- mes "[Alcouskou]";
- mes "Anyways that's all there is too it....... (CRAP that's a lot of sand!!).... So yeah, Sand Attack, use it as a last resort...... (AWW MAN!!)";
- next;
- mes "[Alcouskou]";
- mes "Oh and it does Earth Property damage....... (I gotta find a better way to teach this).........";
- emotion e_swt;
- skill 149,1,0;
- set @SANDATTACK, 0;
- close;
-
- L_NotRdy1:
- mes "You need ^5555FF5 Fine Grit^000000 and a ^FF3355'Leather Bag of Infinity'^000000.";
- next;
- mes "[Alcouskou]";
- mes "You can find the Leather Bag of Infinity by talking to a merchant by the name of ^5533FFRuRumuni^000000.";
- mes "He can be found in the ^009500West end of Payon^000000.";
- close;
- L_LowLvl1:
- mes "You need to have a ^5555FFJob level of 25^000000 to learn Sand Attack.";
- close;
- L_GotSand:
- mes "Oh you're back... hopefully not to throw any more sand in my eyes, heh heh.... heh........ heh..............";
- emotion e_swt;
- close;
-
-L_Back:
- if(countitem(940)<20) goto L_NotRdy2;
- if(BaseJob==Thief && JobLevel<35) goto L_LowLvl2;
- delitem 940,20;
- mes "Great, you have the grasshopper legs. While you were collecting them I'm sure you picked up on many of the characteristics of grasshoppers.";
- next;
- mes "[Alcouskou]";
- mes "You will need that knowledge because this skill is based on the movement of the grasshopper. Like it you will become quick, agile, and have a keen eyesight.";
- next;
- mes "[Alcouskou]";
- mes "Okay, lets begin........";
- next;
- mes "~fwoosh~";
- next;
- mes "~fwooooosh~";
- next;
- mes "~fwoooooooooooooooosh~";
- next;
- mes "[Alcouskou]";
- mes "Ah! You've got it. Just like a pro. With this skill being overwhelmed by mobs is a thing of the past.";
- skill 150,1,0;
- set @BACKSLIDE, 0;
- close;
-
- L_NotRdy2:
- mes "You need ^5555FF20 Grasshopper's Legs^000000.";
- close;
- L_LowLvl2:
- mes "You need a ^5555FFJob level of 35^000000 to learn Back Slide.";
- close;
- L_GotBack:
- mes "Seeing as you already have Back Slide..... why don't you 'Back' on outta here.....";
- close;
-
-L_Find:
- if(countitem(912)<1 || countitem(948)<1 || countitem(908)<5) goto L_NotRdy3;
- delitem 912,1;
- delitem 948,1;
- delitem 908,5;
- mes "Ah! I see that you're fully prepared to learn this skill. Let us begin....";
- next;
- mes "[Alcouskou]";
- mes "There are many stones on the floor here. Pick them all up one by one and examine each one carefully.";
- mes "Get a feel for how much each one weighs and become aware of how each one has a different texture.";
- next;
- mes "[Alcouskou]";
- mes "You must become one with the stone... it is the only way you will be able to use it effectively...";
- next;
- mes "~ an hour later... ~";
- next;
- mes "[Alcouskou]";
- mes "Very good. You have chosen some fine stones. This tells me that you have now perfected the Find Stone skill.";
- emotion e_no1;
- skill 151,1,0;
- set @FINDSTONE, 0;
- next;
- mes "[Alcouskou]";
- mes "Have fun using it.";
- close;
-
- L_NotRdy3:
- mes "You need ^5555FF1 Bear's Footskin, 1 Zargon, and 5 Spawns^000000 to learn Find Stone.";
- close;
- L_GotFind:
- mes "Picking up stones can be fun but...... don't spend all day doing it OK?.....";
- close;
-
-L_Fling:
- if(getskilllv(151) == 0) goto L_NotRdy4;
- if((countitem(910)<2) || (countitem(911)<2)) goto L_NotRdy4;
- delitem 910,2;
- delitem 911,2;
- mes "Good! You look like you're ready for me to teach you the Stone Fling skill. Let us begin....";
- next;
- mes "[Alcouskou]";
- mes "First, loosen up your arm. Next, find a good quality stone using Find Stone. Now close your eyes and visualize the target in your mind.";
- next;
- mes "[Alcouskou]";
- mes "Now imagine yourself going straight through the target! Continue to visualize this!";
- next;
- mes "~ 1/2 hour later... ~";
- next;
- mes "[Alcouskou]";
- mes "Think of the stone as an extension of your body. Keep the target clear in your mind! You are one with the stone, the stone is one with you.....";
- next;
- mes "[Alcouskou]";
- mes "Open your eyes! SEE THE TARGET!! Throw the stone at the target as if you were hurling yourself towards it! DO IT NOW!!";
- emotion e_go;
- next;
- mes "!!Whooooossshh!!................. !!Thwack!!";
- next;
- mes "[Alcouskou]";
- mes "Haha! Excellent! It's a bullseye. You have now mastered Stone Fling, congratulations.";
- emotion e_no1;
- skill 152,1,0;
- set @STONEFLING, 0;
- next;
- mes "[Alcouskou]";
- mes "As you can see this is a skill that relies heavily on concentration.";
- mes "As long as you keep your mind focused you will have on problems using this skill.";
- close;
-
- L_NotRdy4:
- mes "You need ^5555FF2 Scell and 2 Garlet^000000, and the ability to use ^5555FFFind Stone^000000 to learn Stone Fling.";
- close;
- L_GotFling:
- mes "So Stone Fling is coming in handy huh? Just make sure you don't hit the wrong monster";
- close;
-}
-
-
-//====================================================================================
-payon.gat,91,77,4 script RuRumuni 99,{
- mes "[RuRumuni]";
- if(@SANDATTACK && !countitem(7042)) goto L_Start;
-
- mes "I am a humble merchant here in Payon. I buy leather hides, brought in by the hunters, to make leather pouches to sell.";
- mes "I grew up around leather and am quite good at working with it.";
- next;
- mes "[RuRumuni]";
- mes "There is a Thief guild in the Morroc area.";
- mes "I know someone there that sends me Thieves in need of the items I make, such as the ^5533FF'Leather Bag of Infinity'^000000.";
- close;
-
-L_Start:
- if(@BAGNFNTY == 1) goto L_Check;
- mes "Hello. So you were sent by Alcouskou to obtain a ^5533FF'Leather Bag of Infinity'^000000........";
- mes "I will be more than happy to make one for you............";
- next;
- mes "[RuRumuni]";
- mes "But this bag is very special, and I will need some special items in order to make it.";
- next;
- set @BAGNFNTY, 1;
-
-L_List:
- mes "[RuRumuni]";
- mes "Here are the items that I will need:";
- mes "- 5 ^5533FFScorpion Tails^000000";
- mes "- 1 ^5533FFCobweb^000000";
- mes "- 1 ^5533FFCactus Needle^000000";
- mes "- 1 ^5533FFEarthworm Peeling^000000.";
- next;
- mes "[RuRumuni]";
- mes "Once you have all of these items I will be able to make the Bag of Infinity for you.";
- close;
-
-L_Check:
- mes "Nice to see you again. Do you have all of the items? Lets see........";
- next;
- if(countitem(904)<5 || countitem(1025)<1 || countitem(952)<1 || countitem(1055)<1) goto L_List;
- delitem 904, 5;
- delitem 1025, 1;
- delitem 952, 1;
- delitem 1055, 1;
- mes "[RuRumuni]";
- mes "Great you have everything I asked for. Let me start making the bag right away.......";
- next;
- mes "~( 30 minutes later )~";
- next;
- mes "[RuRumuni]";
- mes "Here you go, one Leather Bag of Infinity. Enjoy!";
- getitem 7042, 1;
- set @BAGNFNTY, 0;
- close;
-}
+//===== eAthena Script =======================================
+//= Thief Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.4b
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Sand Attack, Back Slide, Find Stone, Stone Fling skill quests.
+//===== Additional Comments: =================================
+//= v1.0 Fully working
+//= v1.1 Changed Sand Attack requirements from 5 Grit to 5 Fine Grit and a
+//= Leather Bag of Infinity. These are the official RO requirements
+//= Added npc RuRumuni, maker of Leather Bag of Infinity. [kobra_k88]
+//= v1.1a Now using functions found in "Global_Functions.txt" for
+//= class checks.[kobra_k88]
+//= 1.2 Added Baby Class Support [Lupus]
+//= 1.3 Removed callfunc Is_####_Class in favor of baseClass [Silentdragon]
+//= 1.4 Fixed exploit [Lupus]
+//= 1.4a Fixed some typos [IVBela]
+//= 1.4b changed perm. variables to temp ones [Lupus]
+//============================================================
+
+
+
+//======================================================================================================
+moc_prydb1.gat,154,128,4 script Alcouskou 118,{
+ mes "[Alcouskou]";
+ if(baseClass == Job_Thief) goto L_Start;
+ if(BaseJob==Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Your kind isn't welcome here.";
+ close;
+
+L_Novice:
+ mes "Although thieves and assassins have basic skills which aid them in their jobs, most don't have the 'special' skills which can make them truly great!";
+ next;
+ mes "[Alcouskou]";
+ mes "I just happen to be the ONLY one who can teach them these skills!";
+ mes "If you ever decide to become a Thief or an Assassin, come back here and I'll teach you these cool skills.";
+ next;
+ mes "[Alcouskou]";
+ mes "And if you know anyone who already is one, send them to me. I'm willing to teach anyone who's interested.";
+ close;
+
+L_Start:
+ mes "During the course of your life you will experience many things.";
+ mes "You many have trouble understanding the importance of some of these experiences, and may even consider them to be useless to you.";
+ next;
+ mes "[Alcouskou]";
+ mes "But do not be to hasty with your judgement of them, for some of these experience may actually prove to be beneficial for you.";
+ next;
+ mes "[Alcouskou]";
+ mes "Let me explain:";
+M_Menu:
+ next;
+ menu "-Sand Attack",M_Sand, "-Back Slide",M_Back, "-Find Stone",M_Find, "-Stone Fling",M_Fling, "-I will be back later.",M_End;
+
+ M_Sand:
+ mes "[Alcouskou]";
+ if(@SANDATTACK) goto L_Sand;
+ if(getskilllv(149) > 0) goto L_GotSand;
+ mes "The most important aspect of being a good Thief/Assassin is stealth. One should never be seen or touched unless he/she wants to be";
+ next;
+ mes "[Alcouskou]";
+ mes "Some may consider this cowardly but I don't see it that way.";
+ mes "We live in a world where it is the survival of the fittest and you must do whatever it takes to survive.....";
+ next;
+ mes "[Alcouskou]";
+ mes "Even if this means throwing sand in an enemy's face. That is why the skill, ^5555FFSand Attack^000000, was created.";
+ next;
+ mes "[Alcouskou]";
+ mes "This skill allows the user to throw and kick sand in the eyes of an opponent, temporarily blinding them.";
+ mes "This effectively impairs the opponent's ability to defend or attack giving the user a brief but great advantage.";
+ next;
+ mes "[Alcouskou]";
+ mes "In order to learn this skill you will need to gather ^5555FF5 Fine Grit^000000 and a ^FF3355'Leather Bag of Infinity'^000000.";
+ if(BaseJob == Job_Thief) mes "You will also need a job level of at least ^5555FF25^000000.";
+ next;
+ mes "[Alcouskou]";
+ mes "You can find the Leather Bag of Infinity by talking to a merchant by the name of ^5533FFRuRumuni^000000.";
+ mes "He can be found in the ^009500West end of Payon^000000.";
+ next;
+ mes "[Alcouskou]";
+ mes "Come back when you are ready.";
+ set @SANDATTACK, 1;
+ goto M_Menu;
+ M_Back:
+ mes "[Alcouskou]";
+ if(@BACKSLIDE)goto L_Back;
+ if(getskilllv(150)>0) goto L_GotBack;
+ mes "People tend to focus on attack and damage, but it's necessary to understand that FLEEING is JUST AS IMPORTANT as attacking!";
+ next;
+ mes "[Alcouskou]";
+ mes "We thieves/assassins pride ourselves on our speed and ability to quickly dodge.";
+ mes "Of course I'm sure you've noticed that there is a downside to that speed and quickness.....";
+ next;
+ mes "[Alcouskou]";
+ mes "If we DO get hit, depending on the monster, that single hit could put us in serious danger!";
+ next;
+ mes "[Alcouskou]";
+ mes "I can understand how funny it is to watch a monster constantly miss while its attacking you, but......";
+ next;
+ mes "[Alcouskou]";
+ mes "If you get attacked by a large group of monsters..... you may not even have room to dodge and that won't be at all funny.";
+ next;
+ mes "[Alcouskou]";
+ mes "That's why most Thieves/Assassins fear large mobs and will flee at the first sign of them.";
+ mes "There are those however, that do not fear being overwhelmed by a large mob.";
+ next;
+ mes "[Alcouskou]";
+ mes "These are the people who have learned a unique skill that allows them to deal with mob situations.";
+ mes "The skill enables the user to quickly 'back' out of the way of a mob, putting a great deal of distance between the two.";
+ next;
+ mes "[Alcouskou]";
+ mes "The skill is called ^5555FFBack Slide^000000 and requires a lot of practice to master.";
+ mes "If you wish to learn this skill you will first need to bring in ^5555FF20 Grasshopper's Legs^000000.";
+ next;
+ mes "[Alcouskou]";
+ mes "Think of it as the first part of your training.";
+ if(BaseJob == Job_Thief) mes "If you are a Thief, you will also need to have a job level of at least ^5555FF35^000000.";
+ set @BACKSLIDE, 1;
+ goto M_Menu;
+ M_Find:
+ mes "[Alcouskou]";
+ if(@FINDSTONE) goto L_Find;
+ if(getskilllv(151)>0) goto L_GotFind;
+ mes "The more experienced and better skilled members of our guild are quite handy.";
+ mes "They can turn something as common as a rock on the ground into a very effective weapon.";
+ next;
+ mes "[Alcouskou]";
+ mes "They can throw a rock at a far away target with great accuracy and strength.";
+ mes "They can throw it so powerfully that sometimes an enemy will become stunned by it.";
+ next;
+ mes "[Alcouskou]";
+ mes "Of course not every stone can be used as a weapon. That is why the skill, ^5555FFFind Sone^000000, was developed.";
+ mes "With practice one can learn to pick out a stone that has a weight and shape that is fit for 'flinging'.";
+ next;
+ mes "[Alcouskou]";
+ mes "Once mastered a Thieve/Assassin will be able to pick up stones from any location.";
+ mes "Think about it... the ability to use a long range weapon without spending any zeny.... isn't it great?";
+ next;
+ mes "[Alcouskou]";
+ mes "If you want to learn this skill you must do a little training first. Start by picking up ^5555FF1 Bear's Footskin^000000.";
+ mes "Then try to find ^5555FF1 Zargon^000000. Next pick out ^5555FF5 Spawn^000000. Once you've done all this come back and see me.";
+ next;
+ mes "[Alcouskou]";
+ mes "Collecting those items will help you develop the skills necessary to learn Find Stone.";
+ set @FINDSTONE, 1;
+ goto M_Menu;
+ M_Fling:
+ mes "[Alcouskou]";
+ if(@STONEFLING) goto L_Fling;
+ if(getskilllv(152)>0) goto L_GotFling;
+ mes "The more experienced and better skilled members of our guild are quite handy.";
+ mes "They can turn something as common as a rock on the ground into a very effective weapon.";
+ next;
+ mes "[Alcouskou]";
+ mes "They can throw a stone at a target far away with great accuracy and strength.";
+ mes "They can throw it so powerfully that sometimes an enemy will become stunned by it.";
+ next;
+ mes "[Alcouskou]";
+ mes "These guild members call this skill ^5555FFStone Fling^000000. It is extremely useful and doesn't cost any zeny.";
+ next;
+ mes "[Alcouskou]";
+ mes "If you wish to learn Stone Fling you must first bring me ^5555FF2 Garlet and 2 Scell^000000.";
+ mes "You will also need to have mastered ^5555FFFind Stone^000000 as well.";
+ set @STONEFLING, 1;
+ goto M_Menu;
+ M_End:
+ mes "[Alcouskou]";
+ mes "It seems that you are not experienced enough yet....";
+ close;
+
+L_Sand:
+ if(countitem(7041)<5 || countitem(7042)<1) goto L_NotRdy1;
+ if(BaseJob==Job_Thief && JobLevel<25) goto L_LowLvl1;
+ delitem 7041, 5;
+ delitem 7042, 1;
+ mes "Alright, you've got all the items. Now it's time to learn.... the... ultimate.... attack.... Sand Attack!!!";
+ next;
+ mes "[Alcouskou]";
+ mes "Look down at your feet. See that? The very thing your stepping on is the secret behind this skill......... SAND!!";
+ next;
+ mes "[Alcouskou]";
+ mes "Okay, grab a handful....... yep, that much will do....... now.........";
+ next;
+ mes "[Alcouskou]";
+ mes "THROW IT AT ME!!!";
+ emotion e_go;
+ next;
+ mes "[Alcouskou]";
+ mes "(AHHH!! My EYES!!! Son of a)......... ya see how effective that was........ (JEEZE that STINGS!!).......";
+ emotion e_omg;
+ next;
+ mes "[Alcouskou]";
+ mes "Anyways that's all there is too it....... (CRAP that's a lot of sand!!).... So yeah, Sand Attack, use it as a last resort...... (AWW MAN!!)";
+ next;
+ mes "[Alcouskou]";
+ mes "Oh and it does Earth Property damage....... (I gotta find a better way to teach this).........";
+ emotion e_swt;
+ skill 149,1,0;
+ set @SANDATTACK, 0;
+ close;
+
+ L_NotRdy1:
+ mes "You need ^5555FF5 Fine Grit^000000 and a ^FF3355'Leather Bag of Infinity'^000000.";
+ next;
+ mes "[Alcouskou]";
+ mes "You can find the Leather Bag of Infinity by talking to a merchant by the name of ^5533FFRuRumuni^000000.";
+ mes "He can be found in the ^009500West end of Payon^000000.";
+ close;
+ L_LowLvl1:
+ mes "You need to have a ^5555FFJob level of 25^000000 to learn Sand Attack.";
+ close;
+ L_GotSand:
+ mes "Oh you're back... hopefully not to throw any more sand in my eyes, heh heh.... heh........ heh..............";
+ emotion e_swt;
+ close;
+
+L_Back:
+ if(countitem(940)<20) goto L_NotRdy2;
+ if(BaseJob==Thief && JobLevel<35) goto L_LowLvl2;
+ delitem 940,20;
+ mes "Great, you have the grasshopper legs. While you were collecting them I'm sure you picked up on many of the characteristics of grasshoppers.";
+ next;
+ mes "[Alcouskou]";
+ mes "You will need that knowledge because this skill is based on the movement of the grasshopper. Like it you will become quick, agile, and have a keen eyesight.";
+ next;
+ mes "[Alcouskou]";
+ mes "Okay, lets begin........";
+ next;
+ mes "~fwoosh~";
+ next;
+ mes "~fwooooosh~";
+ next;
+ mes "~fwoooooooooooooooosh~";
+ next;
+ mes "[Alcouskou]";
+ mes "Ah! You've got it. Just like a pro. With this skill being overwhelmed by mobs is a thing of the past.";
+ skill 150,1,0;
+ set @BACKSLIDE, 0;
+ close;
+
+ L_NotRdy2:
+ mes "You need ^5555FF20 Grasshopper's Legs^000000.";
+ close;
+ L_LowLvl2:
+ mes "You need a ^5555FFJob level of 35^000000 to learn Back Slide.";
+ close;
+ L_GotBack:
+ mes "Seeing as you already have Back Slide..... why don't you 'Back' on outta here.....";
+ close;
+
+L_Find:
+ if(countitem(912)<1 || countitem(948)<1 || countitem(908)<5) goto L_NotRdy3;
+ delitem 912,1;
+ delitem 948,1;
+ delitem 908,5;
+ mes "Ah! I see that you're fully prepared to learn this skill. Let us begin....";
+ next;
+ mes "[Alcouskou]";
+ mes "There are many stones on the floor here. Pick them all up one by one and examine each one carefully.";
+ mes "Get a feel for how much each one weighs and become aware of how each one has a different texture.";
+ next;
+ mes "[Alcouskou]";
+ mes "You must become one with the stone... it is the only way you will be able to use it effectively...";
+ next;
+ mes "~ an hour later... ~";
+ next;
+ mes "[Alcouskou]";
+ mes "Very good. You have chosen some fine stones. This tells me that you have now perfected the Find Stone skill.";
+ emotion e_no1;
+ skill 151,1,0;
+ set @FINDSTONE, 0;
+ next;
+ mes "[Alcouskou]";
+ mes "Have fun using it.";
+ close;
+
+ L_NotRdy3:
+ mes "You need ^5555FF1 Bear's Footskin, 1 Zargon, and 5 Spawns^000000 to learn Find Stone.";
+ close;
+ L_GotFind:
+ mes "Picking up stones can be fun but...... don't spend all day doing it OK?.....";
+ close;
+
+L_Fling:
+ if(getskilllv(151) == 0) goto L_NotRdy4;
+ if((countitem(910)<2) || (countitem(911)<2)) goto L_NotRdy4;
+ delitem 910,2;
+ delitem 911,2;
+ mes "Good! You look like you're ready for me to teach you the Stone Fling skill. Let us begin....";
+ next;
+ mes "[Alcouskou]";
+ mes "First, loosen up your arm. Next, find a good quality stone using Find Stone. Now close your eyes and visualize the target in your mind.";
+ next;
+ mes "[Alcouskou]";
+ mes "Now imagine yourself going straight through the target! Continue to visualize this!";
+ next;
+ mes "~ 1/2 hour later... ~";
+ next;
+ mes "[Alcouskou]";
+ mes "Think of the stone as an extension of your body. Keep the target clear in your mind! You are one with the stone, the stone is one with you.....";
+ next;
+ mes "[Alcouskou]";
+ mes "Open your eyes! SEE THE TARGET!! Throw the stone at the target as if you were hurling yourself towards it! DO IT NOW!!";
+ emotion e_go;
+ next;
+ mes "!!Whooooossshh!!................. !!Thwack!!";
+ next;
+ mes "[Alcouskou]";
+ mes "Haha! Excellent! It's a bullseye. You have now mastered Stone Fling, congratulations.";
+ emotion e_no1;
+ skill 152,1,0;
+ set @STONEFLING, 0;
+ next;
+ mes "[Alcouskou]";
+ mes "As you can see this is a skill that relies heavily on concentration.";
+ mes "As long as you keep your mind focused you will have on problems using this skill.";
+ close;
+
+ L_NotRdy4:
+ mes "You need ^5555FF2 Scell and 2 Garlet^000000, and the ability to use ^5555FFFind Stone^000000 to learn Stone Fling.";
+ close;
+ L_GotFling:
+ mes "So Stone Fling is coming in handy huh? Just make sure you don't hit the wrong monster";
+ close;
+}
+
+
+//====================================================================================
+payon.gat,91,77,4 script RuRumuni 99,{
+ mes "[RuRumuni]";
+ if(@SANDATTACK && !countitem(7042)) goto L_Start;
+
+ mes "I am a humble merchant here in Payon. I buy leather hides, brought in by the hunters, to make leather pouches to sell.";
+ mes "I grew up around leather and am quite good at working with it.";
+ next;
+ mes "[RuRumuni]";
+ mes "There is a Thief guild in the Morroc area.";
+ mes "I know someone there that sends me Thieves in need of the items I make, such as the ^5533FF'Leather Bag of Infinity'^000000.";
+ close;
+
+L_Start:
+ if(@BAGNFNTY == 1) goto L_Check;
+ mes "Hello. So you were sent by Alcouskou to obtain a ^5533FF'Leather Bag of Infinity'^000000........";
+ mes "I will be more than happy to make one for you............";
+ next;
+ mes "[RuRumuni]";
+ mes "But this bag is very special, and I will need some special items in order to make it.";
+ next;
+ set @BAGNFNTY, 1;
+
+L_List:
+ mes "[RuRumuni]";
+ mes "Here are the items that I will need:";
+ mes "- 5 ^5533FFScorpion Tails^000000";
+ mes "- 1 ^5533FFCobweb^000000";
+ mes "- 1 ^5533FFCactus Needle^000000";
+ mes "- 1 ^5533FFEarthworm Peeling^000000.";
+ next;
+ mes "[RuRumuni]";
+ mes "Once you have all of these items I will be able to make the Bag of Infinity for you.";
+ close;
+
+L_Check:
+ mes "Nice to see you again. Do you have all of the items? Lets see........";
+ next;
+ if(countitem(904)<5 || countitem(1025)<1 || countitem(952)<1 || countitem(1055)<1) goto L_List;
+ delitem 904, 5;
+ delitem 1025, 1;
+ delitem 952, 1;
+ delitem 1055, 1;
+ mes "[RuRumuni]";
+ mes "Great you have everything I asked for. Let me start making the bag right away.......";
+ next;
+ mes "~( 30 minutes later )~";
+ next;
+ mes "[RuRumuni]";
+ mes "Here you go, one Leather Bag of Infinity. Enjoy!";
+ getitem 7042, 1;
+ set @BAGNFNTY, 0;
+ close;
+}
diff --git a/npc/quests/skills/wizard_skills.txt b/npc/quests/skills/wizard_skills.txt
index 6d4b56d6d..af5669125 100644
--- a/npc/quests/skills/wizard_skills.txt
+++ b/npc/quests/skills/wizard_skills.txt
@@ -1,184 +1,184 @@
-//===== eAthena Script =======================================
-//= Wizard Skills Quests
-//===== By: ==================================================
-//= Lupus, Reddozen
-//===== Current Version: =====================================
-//= 1.3c
-//===== Compatible With: =====================================
-//= eAthena Revision 3800+
-//===== Description: =========================================
-//= Temp quests for new skills for 2nd classes
-//===== Additional Comments: =================================
-//= 1.0 for fully working skills only [Lupus]
-//= 1.1 Added more new skill quests for more classes [Lupus]
-//= Somehow eA engine doesn't let you keep learn't skill V_V'
-//= 1.2 Added to correct locations, correct NPC's, fixed
-//= some of the items required and made them into real
-//= quests. [Reddozen]
-//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
-//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
-//= 1.3b Splitted into different files [DracoRPG]
-//= 1.3c Removed duplicates [Toms]
-//============================================================
-
-
-//============================================================
-// WIZARD - SIGHTBLASTER
-//============================================================
-gef_tower.gat,116,37,1 script Enoz#2 748,{
- if(HELLIONQ == 22)goto L_remember;
- if(HELLIONQ == 21)goto L_joke;
- if(HELLIONQ == 20)goto L_take;
- if(BaseJob!=Job_Wizard) goto L_nowiz;
- if(getskilllv(1006)) goto L_alreadyhave;
-
- mes "[Enoz]";
- mes "I'll teach you all I know for:";
- mes "10 Crystal Blue";
- mes "10 Green Live";
- mes "10 Red Blood";
- mes "10 Wind of Verdure";
- next;
-
- mes "[Enoz]";
- mes "Let me check your items.";
- next;
-
- if(countitem(990)<10 || countitem(991)<10 || countitem(992)<10 || countitem(993)<10) goto L_noitems;//Items: Red_Blood, Crystal_Blue, Wind_of_Verdure, Green_Live,
- delitem 990, 10;//Items: Red_Blood,
- delitem 991, 10;//Items: Crystal_Blue,
- delitem 992, 10;//Items: Wind_of_Verdure,
- delitem 993, 10;//Items: Green_Live,
-
- mes "[Enoz]";
- mes "I see you have what you need,";
- mes "so I'll teach you my talent.";
- skill 1006,1,0;
- close;
-
-L_take:
- mes "[Enoz]";
- mes "It's gone, it's gone!";
- mes "Where the hell did it go?!";
- mes "Oh man, who could have";
- mes "taken it? Wait, was it... You?!";
- next;
- menu "Actually, Welshyun sent me.",L_sent,"No way man, don't go nuts.",-;
-
- mes "[Enoz]";
- mes "Nuts?! Oh, you wanna";
- mes "see crazy, is that it?! You";
- mes "wanna see insaaaane?!";
- mes "Cuz I'll go freakin' medieval";
- mes "if you keep bothering me!!";
- close;
-
-L_sent:
- mes "[Enoz]";
- mes "My mentor, Welshyun?";
- mes "Huh. Is there a report";
- mes "I haven't submitted to him";
- mes "yet? So what was it called?";
- next;
- input @tempstr$;
- if(@tempstr$ != "Monster Life in the Geffen Area")goto L_wrongstr;
-
- mes "[Enoz]";
- mes "\"Monster Life in";
- mes "the Geffen Area\"?";
- mes "Oh no. My mentor took";
- mes "that three days ago!";
- mes "Is he still up to his";
- mes "old tricks again?";
- next;
- mes "[Enoz]";
- mes "Awww nuts!";
- mes "Where the heck is";
- mes "my Master Science";
- mes "Reference Book?";
- mes "It was right here";
- mes "three days ago...";
- set HELLIONQ,21;
- close;
-
-L_joke:
- mes "[Enoz]";
- mes "My mentor Welshyun's";
- mes "been playing jokes again,";
- mes "so you better go talk to him.";
- mes "Damn. Where is that Master";
- mes "Science Reference Book?";
- close;
-
-L_wrongstr:
- mes "[Enoz]";
- mes @tempstr$ + "?";
- mes "I haven't completed";
- mes "any research related";
- mes "to that subject. Or did I?";
- mes "Anyway, I need the exact";
- mes "name of the report you want!";
- close;
-
-L_remember:
- mes "[Enoz]";
- mes "Oh hey, I remember you~";
- mes "So did my mentor send you";
- mes "to me again for some reason?";
- next;
- mes "^3151FFYou cautiously hand Enoz the";
- mes "Master Science Reference Book.";
- next;
- mes "[Enoz]";
- mes "Yes! Oh yes!";
- mes "This is the book";
- mes "I lost three days";
- mes "ago! Thanks so much!";
- mes "Now I can finally finish";
- mes "this research project that--";
- next;
- mes "[Enoz]";
- mes "Wait, the page I really";
- mes "need is missing! And there's";
- mes "some sort of note... Umm...";
- mes "^111111\"Enoz I think this page";
- mes "is worth at least one Apple";
- mes "Juice. Right? --Welshyun\"^000000.";
- next;
- mes "[Enoz]";
- mes "NOooOOoOo!";
- mes "Not agaaaaain!";
- mes "WHy is he always";
- mes "playing these pranks?!";
- mes "Apple Juice! I need";
- mes "some Apple Juice!";
- next;
- mes "^3151FFIt looks like it's time";
- mes "to get 1 Blue Gemstone,";
- mes "and then bring it back";
- mes "to Welshyun the Sage.";
- set HELLIONQ,23;
- close;
-
-L_noitems:
- mes "[Enoz]";
- mes "You don't have enough items.";
- mes "Come back when you have all";
- mes "the required items for me.";
- close;
-
-L_nowiz:
- mes "[Enoz]";
- mes "Gone! It's gone!";
- mes "Where did the book";
- mes "I really need go to?";
- mes "Oh no oh no oh no oh no!";
- mes "Waaaaah, I'm gonna cry!";
- close;
-
-L_alreadyhave:
- mes "[Enoz]";
- mes "I've already taught you";
- mes "everything I know...";
- close;
-}
+//===== eAthena Script =======================================
+//= Wizard Skills Quests
+//===== By: ==================================================
+//= Lupus, Reddozen
+//===== Current Version: =====================================
+//= 1.3c
+//===== Compatible With: =====================================
+//= eAthena Revision 3800+
+//===== Description: =========================================
+//= Temp quests for new skills for 2nd classes
+//===== Additional Comments: =================================
+//= 1.0 for fully working skills only [Lupus]
+//= 1.1 Added more new skill quests for more classes [Lupus]
+//= Somehow eA engine doesn't let you keep learn't skill V_V'
+//= 1.2 Added to correct locations, correct NPC's, fixed
+//= some of the items required and made them into real
+//= quests. [Reddozen]
+//= 1.3 Fixed bugs and minor typos. Optimized [Lupus]
+//= 1.3a fixed an item ID typo, thx 2Spiritual Kid
+//= 1.3b Splitted into different files [DracoRPG]
+//= 1.3c Removed duplicates [Toms]
+//============================================================
+
+
+//============================================================
+// WIZARD - SIGHTBLASTER
+//============================================================
+gef_tower.gat,116,37,1 script Enoz#2 748,{
+ if(HELLIONQ == 22)goto L_remember;
+ if(HELLIONQ == 21)goto L_joke;
+ if(HELLIONQ == 20)goto L_take;
+ if(BaseJob!=Job_Wizard) goto L_nowiz;
+ if(getskilllv(1006)) goto L_alreadyhave;
+
+ mes "[Enoz]";
+ mes "I'll teach you all I know for:";
+ mes "10 Crystal Blue";
+ mes "10 Green Live";
+ mes "10 Red Blood";
+ mes "10 Wind of Verdure";
+ next;
+
+ mes "[Enoz]";
+ mes "Let me check your items.";
+ next;
+
+ if(countitem(990)<10 || countitem(991)<10 || countitem(992)<10 || countitem(993)<10) goto L_noitems;//Items: Red_Blood, Crystal_Blue, Wind_of_Verdure, Green_Live,
+ delitem 990, 10;//Items: Red_Blood,
+ delitem 991, 10;//Items: Crystal_Blue,
+ delitem 992, 10;//Items: Wind_of_Verdure,
+ delitem 993, 10;//Items: Green_Live,
+
+ mes "[Enoz]";
+ mes "I see you have what you need,";
+ mes "so I'll teach you my talent.";
+ skill 1006,1,0;
+ close;
+
+L_take:
+ mes "[Enoz]";
+ mes "It's gone, it's gone!";
+ mes "Where the hell did it go?!";
+ mes "Oh man, who could have";
+ mes "taken it? Wait, was it... You?!";
+ next;
+ menu "Actually, Welshyun sent me.",L_sent,"No way man, don't go nuts.",-;
+
+ mes "[Enoz]";
+ mes "Nuts?! Oh, you wanna";
+ mes "see crazy, is that it?! You";
+ mes "wanna see insaaaane?!";
+ mes "Cuz I'll go freakin' medieval";
+ mes "if you keep bothering me!!";
+ close;
+
+L_sent:
+ mes "[Enoz]";
+ mes "My mentor, Welshyun?";
+ mes "Huh. Is there a report";
+ mes "I haven't submitted to him";
+ mes "yet? So what was it called?";
+ next;
+ input @tempstr$;
+ if(@tempstr$ != "Monster Life in the Geffen Area")goto L_wrongstr;
+
+ mes "[Enoz]";
+ mes "\"Monster Life in";
+ mes "the Geffen Area\"?";
+ mes "Oh no. My mentor took";
+ mes "that three days ago!";
+ mes "Is he still up to his";
+ mes "old tricks again?";
+ next;
+ mes "[Enoz]";
+ mes "Awww nuts!";
+ mes "Where the heck is";
+ mes "my Master Science";
+ mes "Reference Book?";
+ mes "It was right here";
+ mes "three days ago...";
+ set HELLIONQ,21;
+ close;
+
+L_joke:
+ mes "[Enoz]";
+ mes "My mentor Welshyun's";
+ mes "been playing jokes again,";
+ mes "so you better go talk to him.";
+ mes "Damn. Where is that Master";
+ mes "Science Reference Book?";
+ close;
+
+L_wrongstr:
+ mes "[Enoz]";
+ mes @tempstr$ + "?";
+ mes "I haven't completed";
+ mes "any research related";
+ mes "to that subject. Or did I?";
+ mes "Anyway, I need the exact";
+ mes "name of the report you want!";
+ close;
+
+L_remember:
+ mes "[Enoz]";
+ mes "Oh hey, I remember you~";
+ mes "So did my mentor send you";
+ mes "to me again for some reason?";
+ next;
+ mes "^3151FFYou cautiously hand Enoz the";
+ mes "Master Science Reference Book.";
+ next;
+ mes "[Enoz]";
+ mes "Yes! Oh yes!";
+ mes "This is the book";
+ mes "I lost three days";
+ mes "ago! Thanks so much!";
+ mes "Now I can finally finish";
+ mes "this research project that--";
+ next;
+ mes "[Enoz]";
+ mes "Wait, the page I really";
+ mes "need is missing! And there's";
+ mes "some sort of note... Umm...";
+ mes "^111111\"Enoz I think this page";
+ mes "is worth at least one Apple";
+ mes "Juice. Right? --Welshyun\"^000000.";
+ next;
+ mes "[Enoz]";
+ mes "NOooOOoOo!";
+ mes "Not agaaaaain!";
+ mes "WHy is he always";
+ mes "playing these pranks?!";
+ mes "Apple Juice! I need";
+ mes "some Apple Juice!";
+ next;
+ mes "^3151FFIt looks like it's time";
+ mes "to get 1 Blue Gemstone,";
+ mes "and then bring it back";
+ mes "to Welshyun the Sage.";
+ set HELLIONQ,23;
+ close;
+
+L_noitems:
+ mes "[Enoz]";
+ mes "You don't have enough items.";
+ mes "Come back when you have all";
+ mes "the required items for me.";
+ close;
+
+L_nowiz:
+ mes "[Enoz]";
+ mes "Gone! It's gone!";
+ mes "Where did the book";
+ mes "I really need go to?";
+ mes "Oh no oh no oh no oh no!";
+ mes "Waaaaah, I'm gonna cry!";
+ close;
+
+L_alreadyhave:
+ mes "[Enoz]";
+ mes "I've already taught you";
+ mes "everything I know...";
+ close;
+}
diff --git a/npc/quests/thana_quest.txt b/npc/quests/thana_quest.txt
index 5a6e455a6..d9f28ff17 100644
--- a/npc/quests/thana_quest.txt
+++ b/npc/quests/thana_quest.txt
@@ -1,1633 +1,1633 @@
-//===== eAthena Script =======================================
-//= Thanatos Tower Quest
-//===== By: ==================================================
-//= [Ishizu-chan]
-//===== Current Version: =====================================
-//= 1.0 Beta
-//===== Compatible With: =====================================
-//= Any eAthena Version i guess?
-//===== Description: =========================================
-//= It's the Thanatos Tower Quest...
-//===== Additional Comments: =================================
-//= 1.0 - First Release [Ishizu-chan]
-//============================================================
-
-
-// Tour Guide - 1st Floor
-tha_t01.gat,149,78,3 script Tour Guide#1 90,{
-
- if (ThanaQuest & 1) {
-
- mes "[Tour Guide]";
- mes "Hello my friend.";
- mes "How are you? Do you enjoy working for the Rekkenber Corporation?";
- close;
-
- }
-
- mes "[Tour Guide]";
- mes "Hello there.";
- mes "So you came all the way to investigate the ^777777Thanatos Tower^000000, huh?";
- next;
-
- mes "[Tour Guide]";
- mes "I'm with the Rekkenber Corporation.";
- mes "We are still searching brave people, who would like to work for us and discover the deeper levels of the ^777777Thanatos Tower^000000.";
- next;
-
- mes "[Tour Guide]";
- mes "Are you by chance interested to volunteer to the ^777777Thanatos Tower Task Force^000000?";
- next;
- menu "No thanks.",L_End,
- "Yes, sign me up!",-;
-
- mes "[Tour Guide]";
- mes "Please sign your name here...";
- next;
-
- set ThanaQuest, ThanaQuest | 1;
-
- mes "[Tour Guide]";
- mes "Ok, ^000077"+strcharinfo(0)+"^000000, isn't it?";
- mes "Welcome to the ^777777Thanatos Tower Task Force^000000!";
- next;
-
- mes "[Tour Guide]";
- mes "Please be carefull when investigating the deeper levels of the ^777777Thanatos Tower^000000.";
- mes "The deeper you get, the less is known about it's dangers...";
- close;
-
- L_End:
- mes "[Tour Guide]";
- mes "Ok, but it was worth a try, wasn't it.";
- mes "Come back when you're interested.";
- close;
-
-}
-
-
-// Tour Guide - 2nd Floor
-tha_t02.gat,231,161,5 script Tour Guide#2 874,{
-
- if (ThanaQuest < 1) {
-
- mes "[Tour Guide]";
- mes "Hello there.";
- mes "Nice day, isn't it?";
- next;
-
- mes "[Tour Guide]";
- mes "If you want to visit the higher levels, you'll need to volunteer to the ^777777Thanatos Tower Task Force^000000.";
- next;
-
- mes "[Tour Guide]";
- mes "You can do so by speaking with the nice woman at the counter, near the entrance.";
- mes "See you later~";
- close;
-
- }
-
- mes "[Tour Guide]";
- mes "Hello my friend.";
- mes "Oh, you're one of the new volunteers from the ^777777Thanatos Tower Task Force^000000.";
- next;
-
- mes "[Tour Guide]";
- mes "If you wish to enter the next level, you'll need to form a party.";
- mes "Please gather at least 5 of your Friends around me, so that I can warp you towards the next level.";
- next;
-
- mes "[Tour Guide]";
- mes "I will warp your whole party, so tell your comrades to stand by.";
- mes "Shall I warp you now?";
- next;
- menu "No, I need some time...",L_End,
- "Yes, please warp us!",-;
-
- set @partyid, getcharid(1);
-
- if (@partyid == 0) goto L_NoParty;
-
- getpartymember(@partyid);
- set @partymembercount,$@partymembercount;
- copyarray @partymembername$[0],$@partymembername$[0],@partymembercount;
-
- if (@partymembercount < 6) goto L_NotEnough;
-
- for(set @i, 0; @i < @partymembercount; set @i, @i + 1) {
- if (getmapxy(@mapname$,@mapx,@mapy,0,@partymembername$[@i]) != 0) goto L_Offline;
- if (@mapname$ != "tha_t02.gat" || @mapx < 223 || @mapx > 239 || @mapy < 153 || @mapy > 169) goto L_Away;
- }
-
- warpparty "tha_t03.gat",220,165,@partyid;
- end;
-
- L_NoParty:
- mes "[Tour Guide]";
- mes "Erm, you need to form a party first.";
- close;
-
- L_NotEnough:
- mes "[Tour Guide]";
- mes "You'll need to bring at least 5 friends, if you want to enter the next level.";
- close;
-
- L_Offline:
- mes "[Tour Guide]";
- mes "Hmm, it seems some of your friends aren't online.";
- close;
-
- L_Away:
- mes "[Tour Guide]";
- mes "I can't find some of your friends.";
- mes "Please tell them to come close to me, so I can see them.";
- close;
-
- L_End:
- mes "[Tour Guide]";
- mes "Ok, come back whenever you're ready to go.";
- close;
-
-}
-
-
-// Mechanical Device - Red Key
-tha_t03.gat,67,70,0 script Mechanical Device#1 111,{
-
- if (ThanaQuest & 2) {
-
- mes "[Mechanical Device]";
- mes "This is where you found the";
- mes "^EF797BRed Key^000000.";
- close;
-
- }
-
- mes "[Mechanical Device]";
- mes "There's a strange mechanical device here.";
- next;
- menu "Investigate the device.",-,
- "Leave it alone.",L_End;
-
- mes "[Mechanical Device]";
- mes "...";
- next;
-
- mes "[Mechanical Device]";
- mes "It seems there is something inside, but the device is protected by a mysterious strong power.";
- next;
- menu "Try to get whats inside.",L_Denied,
- "Get rid of the strong power",-,
- "Leave it alone.",L_End;
-
- if (getequipweaponlv(4) < 4) goto L_NoWeapon;
-
- mes "[Mechanical Device]";
- mes "As you point your weapon towards the device, the magic power seems to fade.";
- mes "You now can get inside the device.";
- next;
-
- set ThanaQuest, ThanaQuest | 2;
- getitem 7421,1; // Red Key
-
- mes "[Mechanical Device]";
- mes "You found the ^EF797BRed Key^000000.";
- close;
-
- L_Denied:
- mes "[Mechanical Device]";
- mes "You were pushed away as you tried to get inside.";
- mes "It seems the device is protected by a strong magical force.";
- close;
-
- L_NoWeapon:
- mes "[Mechanical Device]";
- mes "You tried to get rid of the mysterious power, but your weapon doesn't seem to be strong enough...";
- close;
-
- L_End:
- mes "[Mechanical Device]";
- mes "You left the mechanical device alone.";
- close;
-
-}
-
-
-// Mechanical Device - Yellow Key
-tha_t04.gat,195,195,0 script Mechanical Device#2 111,{
-
- if (ThanaQuest & 4) {
-
- mes "[Mechanical Device]";
- mes "This is where you found the";
- mes "^DE9673Yellow Key^000000.";
- close;
-
- }
-
- mes "[Mechanical Device]";
- mes "There's a strange mechanical device here.";
- next;
- menu "Investigate the device.",-,
- "Leave it alone.",L_End;
-
- mes "[Mechanical Device]";
- mes "The device started to make a certain noise since you approached to it.";
- mes "Theres a terminal in front of it, where you could enter a number with 3 digits.";
- next;
-
- mes "[Mechanical Device]";
- mes "The noise sounds very strange, and it seems as if the device doesn't work the way it should.";
- next;
- menu "Use the terminal",-,
- "Leave it alone.",L_End;
-
- set @number, rand(100,999);
- set @count, 0;
-
- L_Input:
- set @count, @count + 1;
- if (@count > 10) goto L_Broken;
-
- input @input;
-
- if (@input < 100 || @input > 999) goto L_Wrong;
-
- if (@input > @number) goto L_TooBig;
- if (@input < @number) goto L_TooSmall;
-
- mes "[Mechanical Device]";
- mes "As you use the terminal to adjust the number on it, the strange noise changed into a pleasant working sound, and a small box near the terminal opened.";
- mes "There's something in that box.";
- next;
-
- set ThanaQuest, ThanaQuest | 4;
- getitem 7422,1; // Yellow Key
-
- mes "[Mechanical Device]";
- mes "You found the ^DE9673Yellow Key^000000.";
- close;
-
- L_TooBig:
- mes "[Mechanical Device]";
- mes "As you use the terminal to adjust the number on it, the strange noise changed.";
- mes "However, it still sounds wrong. It's a very high sound now.";
- next;
-
- mes "[Mechanical Device]";
- mes "It seems the number you entered was too big.";
- next;
-
- goto L_Input;
-
- L_TooSmall:
- mes "[Mechanical Device]";
- mes "As you use the terminal to adjust the number on it, the strange noise changed.";
- mes "However, it still sounds wrong. It's a very deep sound now.";
- next;
-
- mes "[Mechanical Device]";
- mes "It seems the number you entered was too small.";
- next;
-
- goto L_Input;
-
- L_Broken:
- mes "[Mechanical Device]";
- mes "The Device stoped with an akward sound.";
- mes "It seems the device doesn't work anymore...";
- close;
-
- L_Wrong:
- mes "[Mechanical Device]";
- mes "You tried to enter the number, but the terminal wasn't able to handle it.";
- mes "It seems the device doesn't work anymore...";
- close;
-
- L_End:
- mes "[Mechanical Device]";
- mes "You left the mechanical device alone.";
- close;
-
-}
-
-
-// Mechanical Device - Blue Key
-tha_t05.gat,101,37,0 script Mechanical Device#3 111,{
-
- if (ThanaQuest & 8) {
-
- mes "[Mechanical Device]";
- mes "This is where you found the";
- mes "^8CA6EFBlue Key^000000.";
- close;
-
- }
-
- mes "[Mechanical Device]";
- mes "There's a strange mechanical device here.";
- next;
- menu "Investigate the device.",-,
- "Leave it alone.",L_End;
-
- mes "[Mechanical Device]";
- mes "It seems there's something hidden under the device. However, the device is too heavy to lift it up alone.";
- next;
- menu "Try it anyways.",L_Alone,
- "Try it together.",-,
- "Leave it alone.",L_End;
-
- getmapxy @mapname$,@mapx,@mapy,0,strcharinfo(0);
- if (@mapx < 101 || @mapx > 104 || @mapy < 37 || @mapy > 40) goto L_Away;
-
- set @help, getareausers("tha_t05.gat",101,40,104,37);
- if (@help == 1) goto L_Alone;
- if (@help < 3) goto L_NotEnough;
-
- mes "[Mechanical Device]";
- mes "As you manage to lift the device with the help of your friends, you find something underneath, covered in dirt.";
- next;
-
- set ThanaQuest, ThanaQuest | 8;
- getitem 7423,1; // Blue Key
-
- mes "[Mechanical Device]";
- mes "You found a ^8CA6EFBlue Key^000000.";
- close;
-
- L_Alone:
- getmapxy @mapname$,@mapx,@mapy,0;
- if (@mapx < 101 || @mapx > 104 || @mapy < 37 || @mapy > 40) goto L_Away;
-
- mes "[Mechanical Device]";
- mes "You coudn't move the device at all...";
- close;
-
- L_Away:
- mes "[Mechanical Device]";
- mes "You are too far away to move the device...";
- close;
-
- L_NotEnough:
- mes "[Mechanical Device]";
- mes "Even with some help you coudn't move the device.";
- mes "It seem you'll need more help...";
- close;
-
- L_End:
- mes "[Mechanical Device]";
- mes "You left the mechanical device alone.";
- close;
-
-}
-
-
-// Mechanical Device - Green Key
-tha_t06.gat,43,152,0 script Mechanical Device#4 111,{
-
- setarray @directions$[0],"up","right","down","left";
-
- if (ThanaQuest & 16) {
-
- mes "[Mechanical Device]";
- mes "This is where you found the";
- mes "^84A684Green Key^000000.";
- close;
-
- }
-
- mes "[Mechanical Device]";
- mes "There's a strange mechanical device here.";
- next;
- menu "Investigate the device.",-,
- "Leave it alone.",L_End;
-
- mes "[Mechanical Device]";
- mes "There are several switches, cogwheels, tubes and wires.";
- next;
- menu "Investigate the switches.",L_Switches,
- "Investigate the cogwheels.",-,
- "Investigate the tubes and wires.",L_Tubes,
- "Leave it alone.",L_End;
-
- set @wheel1, rand(1,3);
- if (@wheel1 == 1) set @wheel2,1;
- if (@wheel1 == 2) set @wheel2,0;
- if (@wheel1 == 3) set @wheel2,3;
-
- set @wheel3, rand(0,3);
- set @wheel4, rand(1,3);
- if (@wheel4 == 1) set @wheel5,3;
- if (@wheel4 == 2) set @wheel5,2;
- if (@wheel4 == 3) set @wheel5,1;
-
- L_Cogwheels:
- if (@wheel1 == 0 && @wheel2 == 2 && @wheel4 == 0 && @wheel5 == 0) goto L_Work;
- mes "[Mechanical Device]";
- mes "There are five cogwheels here, two small ones and three big ones.";
- mes "They seem to activate the device if they are adjusted the right way.";
- next;
- menu "Adjust the small ones.",L_Small,
- "Adjust the big ones.",L_Big,
- "Leave it alone.",L_End;
-
- L_Small:
- mes "[Mechanical Device]";
- mes "The first wheel points ^0000AA"+@directions$[@wheel1]+"^000000,";
- mes "the second one points ^0000AA"+@directions$[@wheel2]+"^000000.";
- next;
- menu "Spin them clockwise.",L_Small_Clock,
- "Spin them counterclockwise.",L_Small_Counter,
- "Adjust the other ones.",L_Big,
- "Go back.",L_Cogwheels;
-
- L_Small_Clock:
- set @wheel1, @wheel1 + 1;
- if (@wheel1 > 3) set @wheel1, @wheel1 - 4;
- set @wheel2, @wheel2 - 1;
- if (@wheel2 < 0) set @wheel2, @wheel2 + 4;
- goto L_Small;
-
- L_Small_Counter:
- set @wheel1, @wheel1 - 1;
- if (@wheel1 < 0) set @wheel1, @wheel1 + 4;
- set @wheel2, @wheel2 + 1;
- if (@wheel2 > 3) set @wheel2, @wheel2 - 4;
- goto L_Small;
-
- L_Big:
- mes "[Mechanical Device]";
- mes "The first wheel points ^0000AA"+@directions$[@wheel3]+"^000000,";
- mes "the second one points ^0000AA"+@directions$[@wheel4]+"^000000 and";
- mes "the third one points ^0000AA"+@directions$[@wheel5]+"^000000.";
- next;
- menu "Spin them clockwise.",L_Big_Clock,
- "Spin them counterclockwise.",L_Big_Counter,
- "Adjust the other ones.",L_Small,
- "Go back.",L_Cogwheels;
-
- L_Big_Clock:
- set @wheel3, @wheel3 + 1;
- if (@wheel3 > 3) set @wheel3, @wheel3 - 4;
- set @wheel4, @wheel4 - 1;
- if (@wheel4 < 0) set @wheel4, @wheel4 + 4;
- set @wheel5, @wheel5 + 1;
- if (@wheel5 > 3) set @wheel5, @wheel5 - 4;
- goto L_Big;
-
- L_Big_Counter:
- set @wheel3, @wheel3 - 1;
- if (@wheel3 < 0) set @wheel3, @wheel3 + 4;
- set @wheel4, @wheel4 + 1;
- if (@wheel4 > 3) set @wheel4, @wheel4 - 4;
- set @wheel5, @wheel5 - 1;
- if (@wheel5 < 0) set @wheel5, @wheel5 + 4;
- goto L_Big;
-
- L_Work:
- mes "[Mechanical Device]";
- mes "After you've adjusted the cogwheels this way, the device started to work.";
- mes "It produced a small metal object.";
- next;
-
- set ThanaQuest, ThanaQuest | 16;
- getitem 7424,1; // Green Key
-
- mes "[Mechanical Device]";
- mes "You found the ^84A684Green Key^000000.";
- close;
-
- L_Switches:
- mes "[Mechanical Device]";
- mes "There are many switches, but most of them are stuck or seem to have no effect on the device.";
- close;
-
- L_Tubes:
- mes "[Mechanical Device]";
- mes "There are some tubes and wires which are connected to the other parts of the device.";
- mes "It seems all tubes and wires are as they are supposed to be.";
- close;
-
- L_End:
- mes "[Mechanical Device]";
- mes "You left the mechanical device alone.";
- close;
-
-}
-
-
-// Mechanical Device - Black Key
-tha_t09.gat,19,158,0 script Mechanical Device#5 111,{
-
- if (ThanaQuest & 32) {
-
- mes "[Mechanical Device]";
- mes "This is where you found the";
- mes "^9C716BBlack Key^000000.";
- close;
-
- }
-
- mes "[Mechanical Device]";
- mes "There's a small mechanical device here.";
- next;
- menu "Investigate the device.",-,
- "Leave it alone.",L_End;
-
- mes "[Mechanical Device]";
- mes "After investigating it closely, you find a small drawer with something in it.";
- mes "You take it out of the drawer.";
- next;
-
- set ThanaQuest, ThanaQuest | 32;
- getitem 7425,1; // Black Key
-
- mes "[Mechanical Device]";
- mes "You found the ^84A684Black Key^000000.";
- close;
-
- L_End:
- mes "[Mechanical Device]";
- mes "You left the mechanical device alone.";
- close;
-
-}
-
-
-// Seal - Blue Magical Stone
-tha_t04.gat,150,44,0 script Seal#1 111,{
-
- if (ThanaQuest < 63) {
-
- mes "[Seal]";
- mes "There is a seal here, but it seems it cannot be revealed.";
- close;
-
- }
-
- if (ThanaQuest & 64) {
-
- mes "[Seal]";
- mes "This is where you found the";
- mes "^738EE7Blue Magical Stone^000000.";
- close;
-
- }
-
- mes "[Seal]";
- mes "There's a seal here.";
- next;
-
- mes "[Seal]";
- mes "It seems it can be revealed with a certain ^8CA6EFKey^000000...";
- next;
-
- input @input$;
-
- if (@input$ != "Blue Key" || countitem(7423) < 1) goto L_Wrong;
-
- mes "[Seal]";
- mes "After you've inserted the ^8CA6EFBlue Key^000000, the seal opened and revealed a beautiful Crystal.";
- next;
-
- set ThanaQuest, ThanaQuest | 64;
- delitem 7423,1; // Blue Key
- getitem 7428,1; // Blue Magical Stone
-
- mes "[Seal]";
- mes "You found the ^738EE7Blue Magical Stone^000000.";
- close;
-
- L_Wrong:
- mes "[Seal]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Seal - Red Magical Stone
-tha_t05.gat,218,116,0 script Seal#2 111,{
-
- if (ThanaQuest < 63) {
-
- mes "[Seal]";
- mes "There is a seal here, but it seems it cannot be revealed.";
- close;
-
- }
-
- if (ThanaQuest & 128) {
-
- mes "[Seal]";
- mes "This is where you found the";
- mes "^CE6163Red Magical Stone^000000.";
- close;
-
- }
-
- mes "[Seal]";
- mes "There's a seal here.";
- next;
-
- mes "[Seal]";
- mes "It seems it can be revealed with a certain ^EF797BKey^000000...";
- next;
-
- input @input$;
-
- if (@input$ != "Red Key" || countitem(7421) < 1) goto L_Wrong;
-
- mes "[Seal]";
- mes "After you've inserted the ^EF797BRed Key^000000, the seal opened and revealed a beautiful Crystal.";
- next;
-
- set ThanaQuest, ThanaQuest | 128;
- delitem 7421,1; // Red Key
- getitem 7426,1; // Red Magical Stone
-
- mes "[Seal]";
- mes "You found the ^CE6163Red Magical Stone^000000.";
- close;
-
- L_Wrong:
- mes "[Seal]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Seal - Black Magical Stone
-tha_t06.gat,226,230,0 script Seal#3 111,{
-
- if (ThanaQuest < 63) {
-
- mes "[Seal]";
- mes "There is a seal here, but it seems it cannot be revealed.";
- close;
-
- }
-
- if (ThanaQuest & 256) {
-
- mes "[Seal]";
- mes "This is where you found the";
- mes "^7B698CBlack Magical Stone^000000.";
- close;
-
- }
-
- mes "[Seal]";
- mes "There's a seal here.";
- next;
-
- mes "[Seal]";
- mes "It seems it can be revealed with a certain ^84A684Key^000000...";
- next;
-
- input @input$;
-
- if (@input$ != "Black Key" || countitem(7425) < 1) goto L_Wrong;
-
- mes "[Seal]";
- mes "After you've inserted the ^84A684Black Key^000000, the seal opened and revealed a beautiful Crystal.";
- next;
-
- set ThanaQuest, ThanaQuest | 256;
- delitem 7425,1; // Black Key
- getitem 7430,1; // Black Magical Stone
-
- mes "[Seal]";
- mes "You found the ^7B698CBlack Magical Stone^000000.";
- close;
-
- L_Wrong:
- mes "[Seal]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Seal - Yellow Magical Stone
-tha_t07.gat,113,129,0 script Seal#4 111,{
-
- if (ThanaQuest < 63) {
-
- mes "[Seal]";
- mes "There is a seal here, but it seems it cannot be revealed.";
- close;
-
- }
-
- if (ThanaQuest & 512) {
-
- mes "[Seal]";
- mes "This is where you found the";
- mes "^EFA673Yellow Magical Stone^000000.";
- close;
-
- }
-
- mes "[Seal]";
- mes "There's a seal here.";
- next;
-
- mes "[Seal]";
- mes "It seems it can be revealed with a certain ^DE9673Key^000000...";
- next;
-
- input @input$;
-
- if (@input$ != "Yellow Key" || countitem(7422) < 1) goto L_Wrong;
-
- mes "[Seal]";
- mes "After you've inserted the ^DE9673Yellow Key^000000, the seal opened and revealed a beautiful Crystal.";
- next;
-
- set ThanaQuest, ThanaQuest | 512;
- delitem 7422,1; // Yellow Key
- getitem 7427,1; // Yellow Magical Stone
-
- mes "[Seal]";
- mes "You found the ^EFA673Yellow Magical Stone^000000.";
- close;
-
- L_Wrong:
- mes "[Seal]";
- mes "Nothing happened.";
- close;
-
-}
-
-// Seal - Green Magical Stone
-tha_t10.gat,129,159,0 script Seal#5 111,{
-
- if (ThanaQuest < 63) {
-
- mes "[Seal]";
- mes "There is a seal here, but it seems it cannot be revealed.";
- close;
-
- }
-
- if (ThanaQuest & 1024) {
-
- mes "[Seal]";
- mes "This is where you found the";
- mes "^738652Green Magical Stone^000000.";
- close;
-
- }
-
- mes "[Seal]";
- mes "There's a seal here.";
- next;
-
- mes "[Seal]";
- mes "It seems it can be revealed with a certain ^84A684Key^000000...";
- next;
-
- input @input$;
-
- if (@input$ != "Green Key" || countitem(7424) < 1) goto L_Wrong;
-
- mes "[Seal]";
- mes "After you've inserted the ^84A684Green Key^000000, the seal opened and revealed a beautiful Crystal.";
- next;
-
- set ThanaQuest, ThanaQuest | 1024;
- delitem 7424,1; // Green Key
- getitem 7429,1; // Green Magical Stone
-
- mes "[Seal]";
- mes "You found the ^738652Green Magical Stone^000000.";
- close;
-
- L_Wrong:
- mes "[Seal]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Stone Statue - Floor 9
-tha_t09.gat,82,99,0 script Stone Statue#09a 111,{
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 1) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- set ThanaSteps, ThanaSteps ^ 1;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 10 (A)
-tha_t10.gat,159,97,0 script Stone Statue#10a 111,{
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 2) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- set ThanaSteps, ThanaSteps ^ 2;
- if (ThanaSteps & 4) set ThanaSteps, ThanaSteps ^ 4;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 10 (B)
-tha_t10.gat,97,97,0 script Stone Statue#10b 111,{
-
- if (ThanaSteps & 2) {
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 4) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- if (ThanaSteps & 4) set ThanaSteps, ThanaSteps ^ 2;
- set ThanaSteps, ThanaSteps ^ 4;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There is a lever here, but it cannot be moved.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 11 (A)
-tha_t11.gat,85,85,0 script Stone Statue#11a 111,{
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 8) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- if (ThanaSteps & 8) {
- if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
- if (ThanaSteps & 32) set ThanaSteps, ThanaSteps ^ 32;
- if (ThanaSteps & 16) set ThanaSteps, ThanaSteps ^ 16;
- }
- set ThanaSteps, ThanaSteps ^ 8;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 11 (B)
-tha_t11.gat,16,16,0 script Stone Statue#11b 111,{
-
- if (ThanaSteps & 8) {
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 16) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- if (ThanaSteps & 16) {
- if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
- if (ThanaSteps & 32) set ThanaSteps, ThanaSteps ^ 32;
- set ThanaSteps, ThanaSteps ^ 8;
- }
- set ThanaSteps, ThanaSteps ^ 16;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There is a lever here, but it cannot be moved.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 11 (C)
-tha_t11.gat,85,16,0 script Stone Statue#11c 111,{
-
- if (ThanaSteps & 16) {
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 32) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- if (ThanaSteps & 32) {
- if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
- set ThanaSteps, ThanaSteps ^ 16;
- set ThanaSteps, ThanaSteps ^ 8;
- }
- set ThanaSteps, ThanaSteps ^ 32;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There is a lever here, but it cannot be moved.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Floor 11 (D)
-tha_t11.gat,16,85,0 script Stone Statue#11d 111,{
-
- if (ThanaSteps & 32) {
-
- mes "[Stone Statue]";
- mes "There is a lever here.";
- if (ThanaSteps & 64) mes "It is pointing up.";
- else mes "It is pointing down.";
- next;
- menu "Pull the lever.",-,
- "Leave it as it is.",L_End;
-
- if (ThanaSteps & 64) {
- set ThanaSteps, ThanaSteps ^ 32;
- set ThanaSteps, ThanaSteps ^ 16;
- set ThanaSteps, ThanaSteps ^ 8;
- }
- set ThanaSteps, ThanaSteps ^ 64;
-
- mes "[Stone Statue]";
- mes "You decided to pull the lever.";
- mes "It sounded as if it started some mechanical process.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There is a lever here, but it cannot be moved.";
- close;
-
- L_End:
- mes "[Stone Statue]";
- mes "You decided to leave the lever as it is.";
- close;
-
-}
-
-
-// Stone Statue - Red Magical Stone
-tha_t12.gat,96,58,0 script Stone Statue#12a 111,{
-
- if (ThanaQuest < 2047) {
-
- mes "[Stone Statue]";
- mes "There is a socket here, but you don't know what to do.";
- close;
-
- }
-
- if (ThanaQuest & 2048) {
-
- mes "[Stone Statue]";
- mes "This is where you inserted the ^CE6163Red Magical Stone^000000.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There's a socket here.";
- next;
-
- input @input$;
-
- if (@input$ != "Red Magical Stone" || countitem(7426) < 1) goto L_Wrong;
-
- set ThanaQuest, ThanaQuest | 2048;
- delitem 7426,1; // Red Magical Stone
-
- mes "[Stone Statue]";
- mes "You've inserted the ^CE6163Red Magical Stone^000000 into the socket and it fits perfectly.";
- close;
-
- L_Wrong:
- mes "[Stone Statue]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Stone Statue - Yellow Magical Stone
-tha_t12.gat,161,58,0 script Stone Statue#12b 111,{
-
- if (ThanaQuest < 2047) {
-
- mes "[Stone Statue]";
- mes "There is a socket here, but you don't know what to do.";
- close;
-
- }
-
- if (ThanaQuest & 4096) {
-
- mes "[Stone Statue]";
- mes "This is where you inserted the ^EFA673Yellow Magical Stone^000000.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There's a socket here.";
- next;
-
- input @input$;
-
- if (@input$ != "Yellow Magical Stone" || countitem(7427) < 1) goto L_Wrong;
-
- set ThanaQuest, ThanaQuest | 4096;
- delitem 7427,1; // Yellow Magical Stone
-
- mes "[Stone Statue]";
- mes "You've inserted the ^EFA673Yellow Magical Stone^000000 into the socket and it fits perfectly.";
- close;
-
- L_Wrong:
- mes "[Stone Statue]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Stone Statue - Blue Magical Stone
-tha_t12.gat,104,18,0 script Stone Statue#12c 111,{
-
- if (ThanaQuest < 2047) {
-
- mes "[Stone Statue]";
- mes "There is a socket here, but you don't know what to do.";
- close;
-
- }
-
- if (ThanaQuest & 8192) {
-
- mes "[Stone Statue]";
- mes "This is where you inserted the ^738EE7Blue Magical Stone^000000.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There's a socket here.";
- next;
-
- input @input$;
-
- if (@input$ != "Blue Magical Stone" || countitem(7428) < 1) goto L_Wrong;
-
- set ThanaQuest, ThanaQuest | 8192;
- delitem 7428,1; // Blue Magical Stone
-
- mes "[Stone Statue]";
- mes "You've inserted the ^738EE7Blue Magical Stone^000000 into the socket and it fits perfectly.";
- close;
-
- L_Wrong:
- mes "[Stone Statue]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Stone Statue - Green Magical Stone
-tha_t12.gat,154,18,0 script Stone Statue#12d 111,{
-
- if (ThanaQuest < 2047) {
-
- mes "[Stone Statue]";
- mes "There is a socket here, but you don't know what to do.";
- close;
-
- }
-
- if (ThanaQuest & 16384) {
-
- mes "[Stone Statue]";
- mes "This is where you inserted the ^738652Green Magical Stone^000000.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There's a socket here.";
- next;
-
- input @input$;
-
- if (@input$ != "Green Magical Stone" || countitem(7429) < 1) goto L_Wrong;
-
- set ThanaQuest, ThanaQuest | 16384;
- delitem 7429,1; // Green Magical Stone
-
- mes "[Stone Statue]";
- mes "You've inserted the ^738652Green Magical Stone^000000 into the socket and it fits perfectly.";
- close;
-
- L_Wrong:
- mes "[Stone Statue]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Stone Statue - Black Magical Stone
-tha_t12.gat,128,86,0 script Stone Statue#12e 111,{
-
- if (ThanaQuest < 2047) {
-
- mes "[Stone Statue]";
- mes "There is a socket here, but you don't know what to do.";
- close;
-
- }
-
- if (ThanaQuest & 32768) {
-
- mes "[Stone Statue]";
- mes "This is where you inserted the ^7B698CBlack Magical Stone^000000.";
- close;
-
- }
-
- mes "[Stone Statue]";
- mes "There's a socket here.";
- next;
-
- input @input$;
-
- if (@input$ != "Black Magical Stone" || countitem(7430) < 1) goto L_Wrong;
-
- set ThanaQuest, ThanaQuest | 32768;
- delitem 7430,1; // Black Magical Stone
-
- mes "[Stone Statue]";
- mes "You've inserted the ^7B698CBlack Magical Stone^000000 into the socket and it fits perfectly.";
- close;
-
- L_Wrong:
- mes "[Stone Statue]";
- mes "Nothing happened.";
- close;
-
-}
-
-
-// Carvings
-tha_t12.gat,130,52,0 script Carvings#1 111,{
-
- mes "[Carvings]";
- mes "There are some beautifull carvings here.";
- next;
-
- mes "[Carvings]";
- mes "As you look closer at the carvings, a portal opens and takes you away...";
- next;
-
- if (ThanaQuest < 65535) {
-
- warp "thana_step.gat",185,15;
- end;
-
- }
-
- warp "thana_step.gat",73,288;
- end;
-
-}
-
-
-// Seal of Sorrow
-thana_boss.gat,217,167,0 script Carvings#2 111,{
-
- if ($Thana & 1) {
-
- mes "[Carvings]";
- mes "This is where you inserted the ^CE86C6Fragment of Sorrow^000000.";
- close;
-
- }
-
- mes "[Carvings]";
- mes "There's a hole in the floor, which seems to be made for something to fit in.";
- mes "It twinkles in ^CE86C6violet color^000000.";
- next;
-
- menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
- "Insert ^7B9663Fragment of Agony^000000",L_Agony,
- "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
- "Insert ^F7865AFragment of Despair^000000",L_Despair,
- "Don't insert something.",L_End;
-
- L_Sorrow:
- if (countitem(7437) == 0) goto L_NoFragment;
-
- delitem 7437,1;
- stopnpctimer "TimerThana";
- set $Thana, $Thana | 1;
- initnpctimer "TimerThana";
- mapannounce "thana_boss.gat", "The Seal of Sorrow has been broken.",bc_npc;
-
- mes "[Carvings]";
- mes "You've inserted the ^CE86C6Fragment of Sorrow^000000 into the hole and it fits perfectly.";
- mes "It now glows in bright ^CE86C6violet color^000000.";
- if ($Thana >= 15) close;
- next;
-
- mes "[Carvings]";
- mes "Hurry now, tell your comrades to insert the other fragments.";
- close;
-
- L_Agony:
- if (countitem(7436) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
- close;
-
- L_Hatred:
- if (countitem(7438) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
- close;
-
- L_Despair:
- if (countitem(7439) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
- close;
-
- L_NoFragment:
- mes "[Carvings]";
- mes "You don't have this fragment.";
- close;
-
- L_End:
- mes "[Carvings]";
- mes "You left the cravings alone.";
- close;
-
- OnInit:
- set $Thana, 0;
- end;
-
-}
-
-
-// Seal of Agony
-thana_boss.gat,202,75,0 script Carvings#3 111,{
-
- if ($Thana & 2) {
-
- mes "[Carvings]";
- mes "This is where you inserted the ^7B9663Fragment of Agony^000000.";
- close;
-
- }
-
- mes "[Carvings]";
- mes "There's a hole in the floor, which seems to be made for something to fit in.";
- mes "It twinkles in ^7B9663green color^000000.";
- next;
-
- menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
- "Insert ^7B9663Fragment of Agony^000000",L_Agony,
- "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
- "Insert ^F7865AFragment of Despair^000000",L_Despair,
- "Don't insert something.",L_End;
-
- L_Sorrow:
- if (countitem(7437) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
- close;
-
- L_Agony:
- if (countitem(7436) == 0) goto L_NoFragment;
-
- delitem 7436,1;
- stopnpctimer "TimerThana";
- set $Thana, $Thana | 2;
- initnpctimer "TimerThana";
- mapannounce "thana_boss.gat", "The Seal of Agony has been broken.",bc_npc;
-
- mes "[Carvings]";
- mes "You've inserted the ^7B9663Fragment of Agony^000000 into the hole and it fits perfectly.";
- mes "It now glows in bright ^7B9663green color^000000.";
- if ($Thana >= 15) close;
- next;
-
- mes "[Carvings]";
- mes "Hurry now, tell your comrades to insert the other fragments.";
- close;
-
- L_Hatred:
- if (countitem(7438) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
- close;
-
- L_Despair:
- if (countitem(7439) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
- close;
-
- L_NoFragment:
- mes "[Carvings]";
- mes "You don't have this fragment.";
- close;
-
- L_End:
- mes "[Carvings]";
- mes "You left the cravings alone.";
- close;
-
-}
-
-
-// Seal of Hatred
-thana_boss.gat,80,76,0 script Carvings#4 111,{
-
- if ($Thana & 4) {
-
- mes "[Carvings]";
- mes "This is where you inserted the ^8C79ADFragment of Hatred^000000.";
- close;
-
- }
-
- mes "[Carvings]";
- mes "There's a hole in the floor, which seems to be made for something to fit in.";
- mes "It twinkles in ^8C79ADblue color^000000.";
- next;
-
- menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
- "Insert ^7B9663Fragment of Agony^000000",L_Agony,
- "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
- "Insert ^F7865AFragment of Despair^000000",L_Despair,
- "Don't insert something.",L_End;
-
- L_Sorrow:
- if (countitem(7437) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
- close;
-
- L_Agony:
- if (countitem(7436) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
- close;
-
- L_Hatred:
- if (countitem(7438) == 0) goto L_NoFragment;
-
- delitem 7438,1;
- stopnpctimer "TimerThana";
- set $Thana, $Thana | 4;
- initnpctimer "TimerThana";
- mapannounce "thana_boss.gat", "The Seal of Hatred has been broken.",bc_npc;
-
- mes "[Carvings]";
- mes "You've inserted the ^8C79ADFragment of Hatred^000000 into the hole and it fits perfectly.";
- mes "It now glows in bright ^8C79ADblue color^000000.";
- if ($Thana >= 15) close;
- next;
-
- mes "[Carvings]";
- mes "Hurry now, tell your comrades to insert the other fragments.";
- close;
-
- L_Despair:
- if (countitem(7439) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
- close;
-
- L_NoFragment:
- mes "[Carvings]";
- mes "You don't have this fragment.";
- close;
-
- L_End:
- mes "[Carvings]";
- mes "You left the cravings alone.";
- close;
-
-}
-
-
-// Seal of Despair
-thana_boss.gat,62,171,0 script Carvings#5 111,{
-
- if ($Thana & 8) {
-
- mes "[Carvings]";
- mes "This is where you inserted the ^F7865AFragment of Despair^000000.";
- close;
-
- }
-
- mes "[Carvings]";
- mes "There's a hole in the floor, which seems to be made for something to fit in.";
- mes "It twinkles in ^F7865Ared color^000000.";
- next;
-
- menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
- "Insert ^7B9663Fragment of Agony^000000",L_Agony,
- "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
- "Insert ^F7865AFragment of Despair^000000",L_Despair,
- "Don't insert something.",L_End;
-
- L_Sorrow:
- if (countitem(7437) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
- close;
-
- L_Agony:
- if (countitem(7436) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
- close;
-
- L_Hatred:
- if (countitem(7438) == 0) goto L_NoFragment;
- mes "[Carvings]";
- mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
- close;
-
- L_Despair:
- if (countitem(7439) == 0) goto L_NoFragment;
-
- delitem 7439,1;
- stopnpctimer "TimerThana";
- set $Thana, $Thana | 8;
- initnpctimer "TimerThana";
- mapannounce "thana_boss.gat", "The Seal of Despair has been broken.",bc_npc;
-
- mes "[Carvings]";
- mes "You've inserted the ^F7865AFragment of Despair^000000 into the hole and it fits perfectly.";
- mes "It now glows in bright ^F7865Ared color^000000.";
- if ($Thana >= 15) close;
- next;
-
- mes "[Carvings]";
- mes "Hurry now, tell your comrades to insert the other fragments.";
- close;
-
- L_NoFragment:
- mes "[Carvings]";
- mes "You don't have this fragment.";
- close;
-
- L_End:
- mes "[Carvings]";
- mes "You left the cravings alone.";
- close;
-
-}
-
-
-// Seal of Thanatos
-thana_boss.gat,141,217,0 script Carvings#6 111,{
-
- if ($Thana == 15) {
-
- mes "[Carvings]";
- mes "You stepped on the plate, and it seems it activated some sort of mechanism.";
- next;
-
- if (!getmapmobs("thana_boss.gat")) {
- monster "thana_boss.gat",135,119,"Thanatos",1708,1,"TimerThana::OnThanaDead";
- stopnpctimer "TimerThana";
- set $Thana, $Thana | 16;
- mapannounce "thana_boss.gat", "The Seal of Thanatos has been broken.",bc_npc;
- mes "[Carvings]";
- mes "You hear the screams of the undead coming from below...";
- close;
- } else {
- mes "[Carvings]";
- mes "But nothing happened...";
- close;
- }
- }
-
- mes "[Carvings]";
- mes "There is a plate here, which seems to be some sort of switch, but it doesn't move.";
- close;
-
-}
-
-
-// NPC Timer
-thana_boss.gat,1,1,1 script TimerThana -1,{
-
- // 10 secs
- OnTimer10000:
-
- if ($Thana >= 15) end;
- stopnpctimer;
- mapannounce "thana_boss.gat", "You didn't manage to break all four Seals in time...",bc_npc;
- set $Thana, 0;
- end;
-
- OnThanaDead:
-
- initnpctimer;
- end;
-
- // 600 secs = 10 mins
- OnTimer600000:
-
- stopnpctimer;
- set $Thana, 0;
- end;
-
-}
+//===== eAthena Script =======================================
+//= Thanatos Tower Quest
+//===== By: ==================================================
+//= [Ishizu-chan]
+//===== Current Version: =====================================
+//= 1.0 Beta
+//===== Compatible With: =====================================
+//= Any eAthena Version i guess?
+//===== Description: =========================================
+//= It's the Thanatos Tower Quest...
+//===== Additional Comments: =================================
+//= 1.0 - First Release [Ishizu-chan]
+//============================================================
+
+
+// Tour Guide - 1st Floor
+tha_t01.gat,149,78,3 script Tour Guide#1 90,{
+
+ if (ThanaQuest & 1) {
+
+ mes "[Tour Guide]";
+ mes "Hello my friend.";
+ mes "How are you? Do you enjoy working for the Rekkenber Corporation?";
+ close;
+
+ }
+
+ mes "[Tour Guide]";
+ mes "Hello there.";
+ mes "So you came all the way to investigate the ^777777Thanatos Tower^000000, huh?";
+ next;
+
+ mes "[Tour Guide]";
+ mes "I'm with the Rekkenber Corporation.";
+ mes "We are still searching brave people, who would like to work for us and discover the deeper levels of the ^777777Thanatos Tower^000000.";
+ next;
+
+ mes "[Tour Guide]";
+ mes "Are you by chance interested to volunteer to the ^777777Thanatos Tower Task Force^000000?";
+ next;
+ menu "No thanks.",L_End,
+ "Yes, sign me up!",-;
+
+ mes "[Tour Guide]";
+ mes "Please sign your name here...";
+ next;
+
+ set ThanaQuest, ThanaQuest | 1;
+
+ mes "[Tour Guide]";
+ mes "Ok, ^000077"+strcharinfo(0)+"^000000, isn't it?";
+ mes "Welcome to the ^777777Thanatos Tower Task Force^000000!";
+ next;
+
+ mes "[Tour Guide]";
+ mes "Please be carefull when investigating the deeper levels of the ^777777Thanatos Tower^000000.";
+ mes "The deeper you get, the less is known about it's dangers...";
+ close;
+
+ L_End:
+ mes "[Tour Guide]";
+ mes "Ok, but it was worth a try, wasn't it.";
+ mes "Come back when you're interested.";
+ close;
+
+}
+
+
+// Tour Guide - 2nd Floor
+tha_t02.gat,231,161,5 script Tour Guide#2 874,{
+
+ if (ThanaQuest < 1) {
+
+ mes "[Tour Guide]";
+ mes "Hello there.";
+ mes "Nice day, isn't it?";
+ next;
+
+ mes "[Tour Guide]";
+ mes "If you want to visit the higher levels, you'll need to volunteer to the ^777777Thanatos Tower Task Force^000000.";
+ next;
+
+ mes "[Tour Guide]";
+ mes "You can do so by speaking with the nice woman at the counter, near the entrance.";
+ mes "See you later~";
+ close;
+
+ }
+
+ mes "[Tour Guide]";
+ mes "Hello my friend.";
+ mes "Oh, you're one of the new volunteers from the ^777777Thanatos Tower Task Force^000000.";
+ next;
+
+ mes "[Tour Guide]";
+ mes "If you wish to enter the next level, you'll need to form a party.";
+ mes "Please gather at least 5 of your Friends around me, so that I can warp you towards the next level.";
+ next;
+
+ mes "[Tour Guide]";
+ mes "I will warp your whole party, so tell your comrades to stand by.";
+ mes "Shall I warp you now?";
+ next;
+ menu "No, I need some time...",L_End,
+ "Yes, please warp us!",-;
+
+ set @partyid, getcharid(1);
+
+ if (@partyid == 0) goto L_NoParty;
+
+ getpartymember(@partyid);
+ set @partymembercount,$@partymembercount;
+ copyarray @partymembername$[0],$@partymembername$[0],@partymembercount;
+
+ if (@partymembercount < 6) goto L_NotEnough;
+
+ for(set @i, 0; @i < @partymembercount; set @i, @i + 1) {
+ if (getmapxy(@mapname$,@mapx,@mapy,0,@partymembername$[@i]) != 0) goto L_Offline;
+ if (@mapname$ != "tha_t02.gat" || @mapx < 223 || @mapx > 239 || @mapy < 153 || @mapy > 169) goto L_Away;
+ }
+
+ warpparty "tha_t03.gat",220,165,@partyid;
+ end;
+
+ L_NoParty:
+ mes "[Tour Guide]";
+ mes "Erm, you need to form a party first.";
+ close;
+
+ L_NotEnough:
+ mes "[Tour Guide]";
+ mes "You'll need to bring at least 5 friends, if you want to enter the next level.";
+ close;
+
+ L_Offline:
+ mes "[Tour Guide]";
+ mes "Hmm, it seems some of your friends aren't online.";
+ close;
+
+ L_Away:
+ mes "[Tour Guide]";
+ mes "I can't find some of your friends.";
+ mes "Please tell them to come close to me, so I can see them.";
+ close;
+
+ L_End:
+ mes "[Tour Guide]";
+ mes "Ok, come back whenever you're ready to go.";
+ close;
+
+}
+
+
+// Mechanical Device - Red Key
+tha_t03.gat,67,70,0 script Mechanical Device#1 111,{
+
+ if (ThanaQuest & 2) {
+
+ mes "[Mechanical Device]";
+ mes "This is where you found the";
+ mes "^EF797BRed Key^000000.";
+ close;
+
+ }
+
+ mes "[Mechanical Device]";
+ mes "There's a strange mechanical device here.";
+ next;
+ menu "Investigate the device.",-,
+ "Leave it alone.",L_End;
+
+ mes "[Mechanical Device]";
+ mes "...";
+ next;
+
+ mes "[Mechanical Device]";
+ mes "It seems there is something inside, but the device is protected by a mysterious strong power.";
+ next;
+ menu "Try to get whats inside.",L_Denied,
+ "Get rid of the strong power",-,
+ "Leave it alone.",L_End;
+
+ if (getequipweaponlv(4) < 4) goto L_NoWeapon;
+
+ mes "[Mechanical Device]";
+ mes "As you point your weapon towards the device, the magic power seems to fade.";
+ mes "You now can get inside the device.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 2;
+ getitem 7421,1; // Red Key
+
+ mes "[Mechanical Device]";
+ mes "You found the ^EF797BRed Key^000000.";
+ close;
+
+ L_Denied:
+ mes "[Mechanical Device]";
+ mes "You were pushed away as you tried to get inside.";
+ mes "It seems the device is protected by a strong magical force.";
+ close;
+
+ L_NoWeapon:
+ mes "[Mechanical Device]";
+ mes "You tried to get rid of the mysterious power, but your weapon doesn't seem to be strong enough...";
+ close;
+
+ L_End:
+ mes "[Mechanical Device]";
+ mes "You left the mechanical device alone.";
+ close;
+
+}
+
+
+// Mechanical Device - Yellow Key
+tha_t04.gat,195,195,0 script Mechanical Device#2 111,{
+
+ if (ThanaQuest & 4) {
+
+ mes "[Mechanical Device]";
+ mes "This is where you found the";
+ mes "^DE9673Yellow Key^000000.";
+ close;
+
+ }
+
+ mes "[Mechanical Device]";
+ mes "There's a strange mechanical device here.";
+ next;
+ menu "Investigate the device.",-,
+ "Leave it alone.",L_End;
+
+ mes "[Mechanical Device]";
+ mes "The device started to make a certain noise since you approached to it.";
+ mes "Theres a terminal in front of it, where you could enter a number with 3 digits.";
+ next;
+
+ mes "[Mechanical Device]";
+ mes "The noise sounds very strange, and it seems as if the device doesn't work the way it should.";
+ next;
+ menu "Use the terminal",-,
+ "Leave it alone.",L_End;
+
+ set @number, rand(100,999);
+ set @count, 0;
+
+ L_Input:
+ set @count, @count + 1;
+ if (@count > 10) goto L_Broken;
+
+ input @input;
+
+ if (@input < 100 || @input > 999) goto L_Wrong;
+
+ if (@input > @number) goto L_TooBig;
+ if (@input < @number) goto L_TooSmall;
+
+ mes "[Mechanical Device]";
+ mes "As you use the terminal to adjust the number on it, the strange noise changed into a pleasant working sound, and a small box near the terminal opened.";
+ mes "There's something in that box.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 4;
+ getitem 7422,1; // Yellow Key
+
+ mes "[Mechanical Device]";
+ mes "You found the ^DE9673Yellow Key^000000.";
+ close;
+
+ L_TooBig:
+ mes "[Mechanical Device]";
+ mes "As you use the terminal to adjust the number on it, the strange noise changed.";
+ mes "However, it still sounds wrong. It's a very high sound now.";
+ next;
+
+ mes "[Mechanical Device]";
+ mes "It seems the number you entered was too big.";
+ next;
+
+ goto L_Input;
+
+ L_TooSmall:
+ mes "[Mechanical Device]";
+ mes "As you use the terminal to adjust the number on it, the strange noise changed.";
+ mes "However, it still sounds wrong. It's a very deep sound now.";
+ next;
+
+ mes "[Mechanical Device]";
+ mes "It seems the number you entered was too small.";
+ next;
+
+ goto L_Input;
+
+ L_Broken:
+ mes "[Mechanical Device]";
+ mes "The Device stoped with an akward sound.";
+ mes "It seems the device doesn't work anymore...";
+ close;
+
+ L_Wrong:
+ mes "[Mechanical Device]";
+ mes "You tried to enter the number, but the terminal wasn't able to handle it.";
+ mes "It seems the device doesn't work anymore...";
+ close;
+
+ L_End:
+ mes "[Mechanical Device]";
+ mes "You left the mechanical device alone.";
+ close;
+
+}
+
+
+// Mechanical Device - Blue Key
+tha_t05.gat,101,37,0 script Mechanical Device#3 111,{
+
+ if (ThanaQuest & 8) {
+
+ mes "[Mechanical Device]";
+ mes "This is where you found the";
+ mes "^8CA6EFBlue Key^000000.";
+ close;
+
+ }
+
+ mes "[Mechanical Device]";
+ mes "There's a strange mechanical device here.";
+ next;
+ menu "Investigate the device.",-,
+ "Leave it alone.",L_End;
+
+ mes "[Mechanical Device]";
+ mes "It seems there's something hidden under the device. However, the device is too heavy to lift it up alone.";
+ next;
+ menu "Try it anyways.",L_Alone,
+ "Try it together.",-,
+ "Leave it alone.",L_End;
+
+ getmapxy @mapname$,@mapx,@mapy,0,strcharinfo(0);
+ if (@mapx < 101 || @mapx > 104 || @mapy < 37 || @mapy > 40) goto L_Away;
+
+ set @help, getareausers("tha_t05.gat",101,40,104,37);
+ if (@help == 1) goto L_Alone;
+ if (@help < 3) goto L_NotEnough;
+
+ mes "[Mechanical Device]";
+ mes "As you manage to lift the device with the help of your friends, you find something underneath, covered in dirt.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 8;
+ getitem 7423,1; // Blue Key
+
+ mes "[Mechanical Device]";
+ mes "You found a ^8CA6EFBlue Key^000000.";
+ close;
+
+ L_Alone:
+ getmapxy @mapname$,@mapx,@mapy,0;
+ if (@mapx < 101 || @mapx > 104 || @mapy < 37 || @mapy > 40) goto L_Away;
+
+ mes "[Mechanical Device]";
+ mes "You coudn't move the device at all...";
+ close;
+
+ L_Away:
+ mes "[Mechanical Device]";
+ mes "You are too far away to move the device...";
+ close;
+
+ L_NotEnough:
+ mes "[Mechanical Device]";
+ mes "Even with some help you coudn't move the device.";
+ mes "It seem you'll need more help...";
+ close;
+
+ L_End:
+ mes "[Mechanical Device]";
+ mes "You left the mechanical device alone.";
+ close;
+
+}
+
+
+// Mechanical Device - Green Key
+tha_t06.gat,43,152,0 script Mechanical Device#4 111,{
+
+ setarray @directions$[0],"up","right","down","left";
+
+ if (ThanaQuest & 16) {
+
+ mes "[Mechanical Device]";
+ mes "This is where you found the";
+ mes "^84A684Green Key^000000.";
+ close;
+
+ }
+
+ mes "[Mechanical Device]";
+ mes "There's a strange mechanical device here.";
+ next;
+ menu "Investigate the device.",-,
+ "Leave it alone.",L_End;
+
+ mes "[Mechanical Device]";
+ mes "There are several switches, cogwheels, tubes and wires.";
+ next;
+ menu "Investigate the switches.",L_Switches,
+ "Investigate the cogwheels.",-,
+ "Investigate the tubes and wires.",L_Tubes,
+ "Leave it alone.",L_End;
+
+ set @wheel1, rand(1,3);
+ if (@wheel1 == 1) set @wheel2,1;
+ if (@wheel1 == 2) set @wheel2,0;
+ if (@wheel1 == 3) set @wheel2,3;
+
+ set @wheel3, rand(0,3);
+ set @wheel4, rand(1,3);
+ if (@wheel4 == 1) set @wheel5,3;
+ if (@wheel4 == 2) set @wheel5,2;
+ if (@wheel4 == 3) set @wheel5,1;
+
+ L_Cogwheels:
+ if (@wheel1 == 0 && @wheel2 == 2 && @wheel4 == 0 && @wheel5 == 0) goto L_Work;
+ mes "[Mechanical Device]";
+ mes "There are five cogwheels here, two small ones and three big ones.";
+ mes "They seem to activate the device if they are adjusted the right way.";
+ next;
+ menu "Adjust the small ones.",L_Small,
+ "Adjust the big ones.",L_Big,
+ "Leave it alone.",L_End;
+
+ L_Small:
+ mes "[Mechanical Device]";
+ mes "The first wheel points ^0000AA"+@directions$[@wheel1]+"^000000,";
+ mes "the second one points ^0000AA"+@directions$[@wheel2]+"^000000.";
+ next;
+ menu "Spin them clockwise.",L_Small_Clock,
+ "Spin them counterclockwise.",L_Small_Counter,
+ "Adjust the other ones.",L_Big,
+ "Go back.",L_Cogwheels;
+
+ L_Small_Clock:
+ set @wheel1, @wheel1 + 1;
+ if (@wheel1 > 3) set @wheel1, @wheel1 - 4;
+ set @wheel2, @wheel2 - 1;
+ if (@wheel2 < 0) set @wheel2, @wheel2 + 4;
+ goto L_Small;
+
+ L_Small_Counter:
+ set @wheel1, @wheel1 - 1;
+ if (@wheel1 < 0) set @wheel1, @wheel1 + 4;
+ set @wheel2, @wheel2 + 1;
+ if (@wheel2 > 3) set @wheel2, @wheel2 - 4;
+ goto L_Small;
+
+ L_Big:
+ mes "[Mechanical Device]";
+ mes "The first wheel points ^0000AA"+@directions$[@wheel3]+"^000000,";
+ mes "the second one points ^0000AA"+@directions$[@wheel4]+"^000000 and";
+ mes "the third one points ^0000AA"+@directions$[@wheel5]+"^000000.";
+ next;
+ menu "Spin them clockwise.",L_Big_Clock,
+ "Spin them counterclockwise.",L_Big_Counter,
+ "Adjust the other ones.",L_Small,
+ "Go back.",L_Cogwheels;
+
+ L_Big_Clock:
+ set @wheel3, @wheel3 + 1;
+ if (@wheel3 > 3) set @wheel3, @wheel3 - 4;
+ set @wheel4, @wheel4 - 1;
+ if (@wheel4 < 0) set @wheel4, @wheel4 + 4;
+ set @wheel5, @wheel5 + 1;
+ if (@wheel5 > 3) set @wheel5, @wheel5 - 4;
+ goto L_Big;
+
+ L_Big_Counter:
+ set @wheel3, @wheel3 - 1;
+ if (@wheel3 < 0) set @wheel3, @wheel3 + 4;
+ set @wheel4, @wheel4 + 1;
+ if (@wheel4 > 3) set @wheel4, @wheel4 - 4;
+ set @wheel5, @wheel5 - 1;
+ if (@wheel5 < 0) set @wheel5, @wheel5 + 4;
+ goto L_Big;
+
+ L_Work:
+ mes "[Mechanical Device]";
+ mes "After you've adjusted the cogwheels this way, the device started to work.";
+ mes "It produced a small metal object.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 16;
+ getitem 7424,1; // Green Key
+
+ mes "[Mechanical Device]";
+ mes "You found the ^84A684Green Key^000000.";
+ close;
+
+ L_Switches:
+ mes "[Mechanical Device]";
+ mes "There are many switches, but most of them are stuck or seem to have no effect on the device.";
+ close;
+
+ L_Tubes:
+ mes "[Mechanical Device]";
+ mes "There are some tubes and wires which are connected to the other parts of the device.";
+ mes "It seems all tubes and wires are as they are supposed to be.";
+ close;
+
+ L_End:
+ mes "[Mechanical Device]";
+ mes "You left the mechanical device alone.";
+ close;
+
+}
+
+
+// Mechanical Device - Black Key
+tha_t09.gat,19,158,0 script Mechanical Device#5 111,{
+
+ if (ThanaQuest & 32) {
+
+ mes "[Mechanical Device]";
+ mes "This is where you found the";
+ mes "^9C716BBlack Key^000000.";
+ close;
+
+ }
+
+ mes "[Mechanical Device]";
+ mes "There's a small mechanical device here.";
+ next;
+ menu "Investigate the device.",-,
+ "Leave it alone.",L_End;
+
+ mes "[Mechanical Device]";
+ mes "After investigating it closely, you find a small drawer with something in it.";
+ mes "You take it out of the drawer.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 32;
+ getitem 7425,1; // Black Key
+
+ mes "[Mechanical Device]";
+ mes "You found the ^84A684Black Key^000000.";
+ close;
+
+ L_End:
+ mes "[Mechanical Device]";
+ mes "You left the mechanical device alone.";
+ close;
+
+}
+
+
+// Seal - Blue Magical Stone
+tha_t04.gat,150,44,0 script Seal#1 111,{
+
+ if (ThanaQuest < 63) {
+
+ mes "[Seal]";
+ mes "There is a seal here, but it seems it cannot be revealed.";
+ close;
+
+ }
+
+ if (ThanaQuest & 64) {
+
+ mes "[Seal]";
+ mes "This is where you found the";
+ mes "^738EE7Blue Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Seal]";
+ mes "There's a seal here.";
+ next;
+
+ mes "[Seal]";
+ mes "It seems it can be revealed with a certain ^8CA6EFKey^000000...";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Blue Key" || countitem(7423) < 1) goto L_Wrong;
+
+ mes "[Seal]";
+ mes "After you've inserted the ^8CA6EFBlue Key^000000, the seal opened and revealed a beautiful Crystal.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 64;
+ delitem 7423,1; // Blue Key
+ getitem 7428,1; // Blue Magical Stone
+
+ mes "[Seal]";
+ mes "You found the ^738EE7Blue Magical Stone^000000.";
+ close;
+
+ L_Wrong:
+ mes "[Seal]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Seal - Red Magical Stone
+tha_t05.gat,218,116,0 script Seal#2 111,{
+
+ if (ThanaQuest < 63) {
+
+ mes "[Seal]";
+ mes "There is a seal here, but it seems it cannot be revealed.";
+ close;
+
+ }
+
+ if (ThanaQuest & 128) {
+
+ mes "[Seal]";
+ mes "This is where you found the";
+ mes "^CE6163Red Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Seal]";
+ mes "There's a seal here.";
+ next;
+
+ mes "[Seal]";
+ mes "It seems it can be revealed with a certain ^EF797BKey^000000...";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Red Key" || countitem(7421) < 1) goto L_Wrong;
+
+ mes "[Seal]";
+ mes "After you've inserted the ^EF797BRed Key^000000, the seal opened and revealed a beautiful Crystal.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 128;
+ delitem 7421,1; // Red Key
+ getitem 7426,1; // Red Magical Stone
+
+ mes "[Seal]";
+ mes "You found the ^CE6163Red Magical Stone^000000.";
+ close;
+
+ L_Wrong:
+ mes "[Seal]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Seal - Black Magical Stone
+tha_t06.gat,226,230,0 script Seal#3 111,{
+
+ if (ThanaQuest < 63) {
+
+ mes "[Seal]";
+ mes "There is a seal here, but it seems it cannot be revealed.";
+ close;
+
+ }
+
+ if (ThanaQuest & 256) {
+
+ mes "[Seal]";
+ mes "This is where you found the";
+ mes "^7B698CBlack Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Seal]";
+ mes "There's a seal here.";
+ next;
+
+ mes "[Seal]";
+ mes "It seems it can be revealed with a certain ^84A684Key^000000...";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Black Key" || countitem(7425) < 1) goto L_Wrong;
+
+ mes "[Seal]";
+ mes "After you've inserted the ^84A684Black Key^000000, the seal opened and revealed a beautiful Crystal.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 256;
+ delitem 7425,1; // Black Key
+ getitem 7430,1; // Black Magical Stone
+
+ mes "[Seal]";
+ mes "You found the ^7B698CBlack Magical Stone^000000.";
+ close;
+
+ L_Wrong:
+ mes "[Seal]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Seal - Yellow Magical Stone
+tha_t07.gat,113,129,0 script Seal#4 111,{
+
+ if (ThanaQuest < 63) {
+
+ mes "[Seal]";
+ mes "There is a seal here, but it seems it cannot be revealed.";
+ close;
+
+ }
+
+ if (ThanaQuest & 512) {
+
+ mes "[Seal]";
+ mes "This is where you found the";
+ mes "^EFA673Yellow Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Seal]";
+ mes "There's a seal here.";
+ next;
+
+ mes "[Seal]";
+ mes "It seems it can be revealed with a certain ^DE9673Key^000000...";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Yellow Key" || countitem(7422) < 1) goto L_Wrong;
+
+ mes "[Seal]";
+ mes "After you've inserted the ^DE9673Yellow Key^000000, the seal opened and revealed a beautiful Crystal.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 512;
+ delitem 7422,1; // Yellow Key
+ getitem 7427,1; // Yellow Magical Stone
+
+ mes "[Seal]";
+ mes "You found the ^EFA673Yellow Magical Stone^000000.";
+ close;
+
+ L_Wrong:
+ mes "[Seal]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+// Seal - Green Magical Stone
+tha_t10.gat,129,159,0 script Seal#5 111,{
+
+ if (ThanaQuest < 63) {
+
+ mes "[Seal]";
+ mes "There is a seal here, but it seems it cannot be revealed.";
+ close;
+
+ }
+
+ if (ThanaQuest & 1024) {
+
+ mes "[Seal]";
+ mes "This is where you found the";
+ mes "^738652Green Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Seal]";
+ mes "There's a seal here.";
+ next;
+
+ mes "[Seal]";
+ mes "It seems it can be revealed with a certain ^84A684Key^000000...";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Green Key" || countitem(7424) < 1) goto L_Wrong;
+
+ mes "[Seal]";
+ mes "After you've inserted the ^84A684Green Key^000000, the seal opened and revealed a beautiful Crystal.";
+ next;
+
+ set ThanaQuest, ThanaQuest | 1024;
+ delitem 7424,1; // Green Key
+ getitem 7429,1; // Green Magical Stone
+
+ mes "[Seal]";
+ mes "You found the ^738652Green Magical Stone^000000.";
+ close;
+
+ L_Wrong:
+ mes "[Seal]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 9
+tha_t09.gat,82,99,0 script Stone Statue#09a 111,{
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 1) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ set ThanaSteps, ThanaSteps ^ 1;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 10 (A)
+tha_t10.gat,159,97,0 script Stone Statue#10a 111,{
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 2) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ set ThanaSteps, ThanaSteps ^ 2;
+ if (ThanaSteps & 4) set ThanaSteps, ThanaSteps ^ 4;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 10 (B)
+tha_t10.gat,97,97,0 script Stone Statue#10b 111,{
+
+ if (ThanaSteps & 2) {
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 4) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ if (ThanaSteps & 4) set ThanaSteps, ThanaSteps ^ 2;
+ set ThanaSteps, ThanaSteps ^ 4;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There is a lever here, but it cannot be moved.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 11 (A)
+tha_t11.gat,85,85,0 script Stone Statue#11a 111,{
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 8) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ if (ThanaSteps & 8) {
+ if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
+ if (ThanaSteps & 32) set ThanaSteps, ThanaSteps ^ 32;
+ if (ThanaSteps & 16) set ThanaSteps, ThanaSteps ^ 16;
+ }
+ set ThanaSteps, ThanaSteps ^ 8;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 11 (B)
+tha_t11.gat,16,16,0 script Stone Statue#11b 111,{
+
+ if (ThanaSteps & 8) {
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 16) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ if (ThanaSteps & 16) {
+ if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
+ if (ThanaSteps & 32) set ThanaSteps, ThanaSteps ^ 32;
+ set ThanaSteps, ThanaSteps ^ 8;
+ }
+ set ThanaSteps, ThanaSteps ^ 16;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There is a lever here, but it cannot be moved.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 11 (C)
+tha_t11.gat,85,16,0 script Stone Statue#11c 111,{
+
+ if (ThanaSteps & 16) {
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 32) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ if (ThanaSteps & 32) {
+ if (ThanaSteps & 64) set ThanaSteps, ThanaSteps ^ 64;
+ set ThanaSteps, ThanaSteps ^ 16;
+ set ThanaSteps, ThanaSteps ^ 8;
+ }
+ set ThanaSteps, ThanaSteps ^ 32;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There is a lever here, but it cannot be moved.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Floor 11 (D)
+tha_t11.gat,16,85,0 script Stone Statue#11d 111,{
+
+ if (ThanaSteps & 32) {
+
+ mes "[Stone Statue]";
+ mes "There is a lever here.";
+ if (ThanaSteps & 64) mes "It is pointing up.";
+ else mes "It is pointing down.";
+ next;
+ menu "Pull the lever.",-,
+ "Leave it as it is.",L_End;
+
+ if (ThanaSteps & 64) {
+ set ThanaSteps, ThanaSteps ^ 32;
+ set ThanaSteps, ThanaSteps ^ 16;
+ set ThanaSteps, ThanaSteps ^ 8;
+ }
+ set ThanaSteps, ThanaSteps ^ 64;
+
+ mes "[Stone Statue]";
+ mes "You decided to pull the lever.";
+ mes "It sounded as if it started some mechanical process.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There is a lever here, but it cannot be moved.";
+ close;
+
+ L_End:
+ mes "[Stone Statue]";
+ mes "You decided to leave the lever as it is.";
+ close;
+
+}
+
+
+// Stone Statue - Red Magical Stone
+tha_t12.gat,96,58,0 script Stone Statue#12a 111,{
+
+ if (ThanaQuest < 2047) {
+
+ mes "[Stone Statue]";
+ mes "There is a socket here, but you don't know what to do.";
+ close;
+
+ }
+
+ if (ThanaQuest & 2048) {
+
+ mes "[Stone Statue]";
+ mes "This is where you inserted the ^CE6163Red Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There's a socket here.";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Red Magical Stone" || countitem(7426) < 1) goto L_Wrong;
+
+ set ThanaQuest, ThanaQuest | 2048;
+ delitem 7426,1; // Red Magical Stone
+
+ mes "[Stone Statue]";
+ mes "You've inserted the ^CE6163Red Magical Stone^000000 into the socket and it fits perfectly.";
+ close;
+
+ L_Wrong:
+ mes "[Stone Statue]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Stone Statue - Yellow Magical Stone
+tha_t12.gat,161,58,0 script Stone Statue#12b 111,{
+
+ if (ThanaQuest < 2047) {
+
+ mes "[Stone Statue]";
+ mes "There is a socket here, but you don't know what to do.";
+ close;
+
+ }
+
+ if (ThanaQuest & 4096) {
+
+ mes "[Stone Statue]";
+ mes "This is where you inserted the ^EFA673Yellow Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There's a socket here.";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Yellow Magical Stone" || countitem(7427) < 1) goto L_Wrong;
+
+ set ThanaQuest, ThanaQuest | 4096;
+ delitem 7427,1; // Yellow Magical Stone
+
+ mes "[Stone Statue]";
+ mes "You've inserted the ^EFA673Yellow Magical Stone^000000 into the socket and it fits perfectly.";
+ close;
+
+ L_Wrong:
+ mes "[Stone Statue]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Stone Statue - Blue Magical Stone
+tha_t12.gat,104,18,0 script Stone Statue#12c 111,{
+
+ if (ThanaQuest < 2047) {
+
+ mes "[Stone Statue]";
+ mes "There is a socket here, but you don't know what to do.";
+ close;
+
+ }
+
+ if (ThanaQuest & 8192) {
+
+ mes "[Stone Statue]";
+ mes "This is where you inserted the ^738EE7Blue Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There's a socket here.";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Blue Magical Stone" || countitem(7428) < 1) goto L_Wrong;
+
+ set ThanaQuest, ThanaQuest | 8192;
+ delitem 7428,1; // Blue Magical Stone
+
+ mes "[Stone Statue]";
+ mes "You've inserted the ^738EE7Blue Magical Stone^000000 into the socket and it fits perfectly.";
+ close;
+
+ L_Wrong:
+ mes "[Stone Statue]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Stone Statue - Green Magical Stone
+tha_t12.gat,154,18,0 script Stone Statue#12d 111,{
+
+ if (ThanaQuest < 2047) {
+
+ mes "[Stone Statue]";
+ mes "There is a socket here, but you don't know what to do.";
+ close;
+
+ }
+
+ if (ThanaQuest & 16384) {
+
+ mes "[Stone Statue]";
+ mes "This is where you inserted the ^738652Green Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There's a socket here.";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Green Magical Stone" || countitem(7429) < 1) goto L_Wrong;
+
+ set ThanaQuest, ThanaQuest | 16384;
+ delitem 7429,1; // Green Magical Stone
+
+ mes "[Stone Statue]";
+ mes "You've inserted the ^738652Green Magical Stone^000000 into the socket and it fits perfectly.";
+ close;
+
+ L_Wrong:
+ mes "[Stone Statue]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Stone Statue - Black Magical Stone
+tha_t12.gat,128,86,0 script Stone Statue#12e 111,{
+
+ if (ThanaQuest < 2047) {
+
+ mes "[Stone Statue]";
+ mes "There is a socket here, but you don't know what to do.";
+ close;
+
+ }
+
+ if (ThanaQuest & 32768) {
+
+ mes "[Stone Statue]";
+ mes "This is where you inserted the ^7B698CBlack Magical Stone^000000.";
+ close;
+
+ }
+
+ mes "[Stone Statue]";
+ mes "There's a socket here.";
+ next;
+
+ input @input$;
+
+ if (@input$ != "Black Magical Stone" || countitem(7430) < 1) goto L_Wrong;
+
+ set ThanaQuest, ThanaQuest | 32768;
+ delitem 7430,1; // Black Magical Stone
+
+ mes "[Stone Statue]";
+ mes "You've inserted the ^7B698CBlack Magical Stone^000000 into the socket and it fits perfectly.";
+ close;
+
+ L_Wrong:
+ mes "[Stone Statue]";
+ mes "Nothing happened.";
+ close;
+
+}
+
+
+// Carvings
+tha_t12.gat,130,52,0 script Carvings#1 111,{
+
+ mes "[Carvings]";
+ mes "There are some beautifull carvings here.";
+ next;
+
+ mes "[Carvings]";
+ mes "As you look closer at the carvings, a portal opens and takes you away...";
+ next;
+
+ if (ThanaQuest < 65535) {
+
+ warp "thana_step.gat",185,15;
+ end;
+
+ }
+
+ warp "thana_step.gat",73,288;
+ end;
+
+}
+
+
+// Seal of Sorrow
+thana_boss.gat,217,167,0 script Carvings#2 111,{
+
+ if ($Thana & 1) {
+
+ mes "[Carvings]";
+ mes "This is where you inserted the ^CE86C6Fragment of Sorrow^000000.";
+ close;
+
+ }
+
+ mes "[Carvings]";
+ mes "There's a hole in the floor, which seems to be made for something to fit in.";
+ mes "It twinkles in ^CE86C6violet color^000000.";
+ next;
+
+ menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
+ "Insert ^7B9663Fragment of Agony^000000",L_Agony,
+ "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
+ "Insert ^F7865AFragment of Despair^000000",L_Despair,
+ "Don't insert something.",L_End;
+
+ L_Sorrow:
+ if (countitem(7437) == 0) goto L_NoFragment;
+
+ delitem 7437,1;
+ stopnpctimer "TimerThana";
+ set $Thana, $Thana | 1;
+ initnpctimer "TimerThana";
+ mapannounce "thana_boss.gat", "The Seal of Sorrow has been broken.",bc_npc;
+
+ mes "[Carvings]";
+ mes "You've inserted the ^CE86C6Fragment of Sorrow^000000 into the hole and it fits perfectly.";
+ mes "It now glows in bright ^CE86C6violet color^000000.";
+ if ($Thana >= 15) close;
+ next;
+
+ mes "[Carvings]";
+ mes "Hurry now, tell your comrades to insert the other fragments.";
+ close;
+
+ L_Agony:
+ if (countitem(7436) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Hatred:
+ if (countitem(7438) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Despair:
+ if (countitem(7439) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_NoFragment:
+ mes "[Carvings]";
+ mes "You don't have this fragment.";
+ close;
+
+ L_End:
+ mes "[Carvings]";
+ mes "You left the cravings alone.";
+ close;
+
+ OnInit:
+ set $Thana, 0;
+ end;
+
+}
+
+
+// Seal of Agony
+thana_boss.gat,202,75,0 script Carvings#3 111,{
+
+ if ($Thana & 2) {
+
+ mes "[Carvings]";
+ mes "This is where you inserted the ^7B9663Fragment of Agony^000000.";
+ close;
+
+ }
+
+ mes "[Carvings]";
+ mes "There's a hole in the floor, which seems to be made for something to fit in.";
+ mes "It twinkles in ^7B9663green color^000000.";
+ next;
+
+ menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
+ "Insert ^7B9663Fragment of Agony^000000",L_Agony,
+ "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
+ "Insert ^F7865AFragment of Despair^000000",L_Despair,
+ "Don't insert something.",L_End;
+
+ L_Sorrow:
+ if (countitem(7437) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Agony:
+ if (countitem(7436) == 0) goto L_NoFragment;
+
+ delitem 7436,1;
+ stopnpctimer "TimerThana";
+ set $Thana, $Thana | 2;
+ initnpctimer "TimerThana";
+ mapannounce "thana_boss.gat", "The Seal of Agony has been broken.",bc_npc;
+
+ mes "[Carvings]";
+ mes "You've inserted the ^7B9663Fragment of Agony^000000 into the hole and it fits perfectly.";
+ mes "It now glows in bright ^7B9663green color^000000.";
+ if ($Thana >= 15) close;
+ next;
+
+ mes "[Carvings]";
+ mes "Hurry now, tell your comrades to insert the other fragments.";
+ close;
+
+ L_Hatred:
+ if (countitem(7438) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Despair:
+ if (countitem(7439) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_NoFragment:
+ mes "[Carvings]";
+ mes "You don't have this fragment.";
+ close;
+
+ L_End:
+ mes "[Carvings]";
+ mes "You left the cravings alone.";
+ close;
+
+}
+
+
+// Seal of Hatred
+thana_boss.gat,80,76,0 script Carvings#4 111,{
+
+ if ($Thana & 4) {
+
+ mes "[Carvings]";
+ mes "This is where you inserted the ^8C79ADFragment of Hatred^000000.";
+ close;
+
+ }
+
+ mes "[Carvings]";
+ mes "There's a hole in the floor, which seems to be made for something to fit in.";
+ mes "It twinkles in ^8C79ADblue color^000000.";
+ next;
+
+ menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
+ "Insert ^7B9663Fragment of Agony^000000",L_Agony,
+ "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
+ "Insert ^F7865AFragment of Despair^000000",L_Despair,
+ "Don't insert something.",L_End;
+
+ L_Sorrow:
+ if (countitem(7437) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Agony:
+ if (countitem(7436) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Hatred:
+ if (countitem(7438) == 0) goto L_NoFragment;
+
+ delitem 7438,1;
+ stopnpctimer "TimerThana";
+ set $Thana, $Thana | 4;
+ initnpctimer "TimerThana";
+ mapannounce "thana_boss.gat", "The Seal of Hatred has been broken.",bc_npc;
+
+ mes "[Carvings]";
+ mes "You've inserted the ^8C79ADFragment of Hatred^000000 into the hole and it fits perfectly.";
+ mes "It now glows in bright ^8C79ADblue color^000000.";
+ if ($Thana >= 15) close;
+ next;
+
+ mes "[Carvings]";
+ mes "Hurry now, tell your comrades to insert the other fragments.";
+ close;
+
+ L_Despair:
+ if (countitem(7439) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^F7865AFragment of Despair^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_NoFragment:
+ mes "[Carvings]";
+ mes "You don't have this fragment.";
+ close;
+
+ L_End:
+ mes "[Carvings]";
+ mes "You left the cravings alone.";
+ close;
+
+}
+
+
+// Seal of Despair
+thana_boss.gat,62,171,0 script Carvings#5 111,{
+
+ if ($Thana & 8) {
+
+ mes "[Carvings]";
+ mes "This is where you inserted the ^F7865AFragment of Despair^000000.";
+ close;
+
+ }
+
+ mes "[Carvings]";
+ mes "There's a hole in the floor, which seems to be made for something to fit in.";
+ mes "It twinkles in ^F7865Ared color^000000.";
+ next;
+
+ menu "Insert ^CE86C6Fragment of Sorrow^000000",L_Sorrow,
+ "Insert ^7B9663Fragment of Agony^000000",L_Agony,
+ "Insert ^8C79ADFragment of Hatred^000000",L_Hatred,
+ "Insert ^F7865AFragment of Despair^000000",L_Despair,
+ "Don't insert something.",L_End;
+
+ L_Sorrow:
+ if (countitem(7437) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^CE86C6Fragment of Sorrow^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Agony:
+ if (countitem(7436) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^7B9663Fragment of Agony^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Hatred:
+ if (countitem(7438) == 0) goto L_NoFragment;
+ mes "[Carvings]";
+ mes "You've tried to insert the ^8C79ADFragment of Hatred^000000 into the hole, but it didn't fit.";
+ close;
+
+ L_Despair:
+ if (countitem(7439) == 0) goto L_NoFragment;
+
+ delitem 7439,1;
+ stopnpctimer "TimerThana";
+ set $Thana, $Thana | 8;
+ initnpctimer "TimerThana";
+ mapannounce "thana_boss.gat", "The Seal of Despair has been broken.",bc_npc;
+
+ mes "[Carvings]";
+ mes "You've inserted the ^F7865AFragment of Despair^000000 into the hole and it fits perfectly.";
+ mes "It now glows in bright ^F7865Ared color^000000.";
+ if ($Thana >= 15) close;
+ next;
+
+ mes "[Carvings]";
+ mes "Hurry now, tell your comrades to insert the other fragments.";
+ close;
+
+ L_NoFragment:
+ mes "[Carvings]";
+ mes "You don't have this fragment.";
+ close;
+
+ L_End:
+ mes "[Carvings]";
+ mes "You left the cravings alone.";
+ close;
+
+}
+
+
+// Seal of Thanatos
+thana_boss.gat,141,217,0 script Carvings#6 111,{
+
+ if ($Thana == 15) {
+
+ mes "[Carvings]";
+ mes "You stepped on the plate, and it seems it activated some sort of mechanism.";
+ next;
+
+ if (!getmapmobs("thana_boss.gat")) {
+ monster "thana_boss.gat",135,119,"Thanatos",1708,1,"TimerThana::OnThanaDead";
+ stopnpctimer "TimerThana";
+ set $Thana, $Thana | 16;
+ mapannounce "thana_boss.gat", "The Seal of Thanatos has been broken.",bc_npc;
+ mes "[Carvings]";
+ mes "You hear the screams of the undead coming from below...";
+ close;
+ } else {
+ mes "[Carvings]";
+ mes "But nothing happened...";
+ close;
+ }
+ }
+
+ mes "[Carvings]";
+ mes "There is a plate here, which seems to be some sort of switch, but it doesn't move.";
+ close;
+
+}
+
+
+// NPC Timer
+thana_boss.gat,1,1,1 script TimerThana -1,{
+
+ // 10 secs
+ OnTimer10000:
+
+ if ($Thana >= 15) end;
+ stopnpctimer;
+ mapannounce "thana_boss.gat", "You didn't manage to break all four Seals in time...",bc_npc;
+ set $Thana, 0;
+ end;
+
+ OnThanaDead:
+
+ initnpctimer;
+ end;
+
+ // 600 secs = 10 mins
+ OnTimer600000:
+
+ stopnpctimer;
+ set $Thana, 0;
+ end;
+
+}
diff --git a/npc/sample/PCLoginEvent.txt b/npc/sample/PCLoginEvent.txt
index 79fb278e4..23c97ebfc 100644
--- a/npc/sample/PCLoginEvent.txt
+++ b/npc/sample/PCLoginEvent.txt
@@ -1,53 +1,53 @@
-// eAthena Special NPC
-
-// PCLoginEvent NPC (davidsiaw)
-//==============================================================================
-// How it works:
-// When a player logs in, the NPC will run as if he just clicked it. Which means
-// if the script is like this:
-//
-// [code]
-// prontera.gat,0,0,0 script OnPCLoginEvent -1,{
-// mes "lmao";
-// close;
-// }
-// [/code]
-//
-// every player who logs in will recieve a message 'lmao' in their face as soon
-// as they can see the map.
-//-----------------------------------------------------------------------------
-// Note:
-// 1) This NPC will only run if its name is 'PCLoginEvent'
-// 2) I made it invisible because you don't need to see it. Its an abstract NPC
-// 3) If you don't want it, simply delete it
-// 4) If you have more than one PCLoginEvent NPC, strange things will happen.
-// 5) You can put this script in ANY file.
-// 6) I put an end; there because that just makes it do nothing.
-// 7) Modify this script to your liking and give your players a surprise
-// 8) Remember: IT RUNS LIKE A NORMAL NPC. BUT THE ONLY WAY TO 'CLICK' IT IS BY
-// LOGGING ON
-// 9) There are 2 ways to use this - check the examples below!
-
-//
-// The 1st type -- with 'event_script_type' set to 0
-//
-prontera.gat,0,0,0 script OnPCLoginEvent -1,{
- end;
-}
-
-//
-// The 2nd type -- with 'event_script_type' set to 1
-//
-prontera.gat,155,175,0 script An NPC 46,{
- close;
-OnPCLoginEvent:
- // this part will run
- close;
-}
-
-prontera.gat,156,176,0 script Another NPC 46,{
- close;
-OnPCLoginEvent:
- // this part runs AS WELL
- close;
+// eAthena Special NPC
+
+// PCLoginEvent NPC (davidsiaw)
+//==============================================================================
+// How it works:
+// When a player logs in, the NPC will run as if he just clicked it. Which means
+// if the script is like this:
+//
+// [code]
+// prontera.gat,0,0,0 script OnPCLoginEvent -1,{
+// mes "lmao";
+// close;
+// }
+// [/code]
+//
+// every player who logs in will recieve a message 'lmao' in their face as soon
+// as they can see the map.
+//-----------------------------------------------------------------------------
+// Note:
+// 1) This NPC will only run if its name is 'PCLoginEvent'
+// 2) I made it invisible because you don't need to see it. Its an abstract NPC
+// 3) If you don't want it, simply delete it
+// 4) If you have more than one PCLoginEvent NPC, strange things will happen.
+// 5) You can put this script in ANY file.
+// 6) I put an end; there because that just makes it do nothing.
+// 7) Modify this script to your liking and give your players a surprise
+// 8) Remember: IT RUNS LIKE A NORMAL NPC. BUT THE ONLY WAY TO 'CLICK' IT IS BY
+// LOGGING ON
+// 9) There are 2 ways to use this - check the examples below!
+
+//
+// The 1st type -- with 'event_script_type' set to 0
+//
+prontera.gat,0,0,0 script OnPCLoginEvent -1,{
+ end;
+}
+
+//
+// The 2nd type -- with 'event_script_type' set to 1
+//
+prontera.gat,155,175,0 script An NPC 46,{
+ close;
+OnPCLoginEvent:
+ // this part will run
+ close;
+}
+
+prontera.gat,156,176,0 script Another NPC 46,{
+ close;
+OnPCLoginEvent:
+ // this part runs AS WELL
+ close;
} \ No newline at end of file
diff --git a/npc/sample/bank_test.txt b/npc/sample/bank_test.txt
index cea5a1946..84a5e599d 100644
--- a/npc/sample/bank_test.txt
+++ b/npc/sample/bank_test.txt
@@ -1,58 +1,58 @@
-// Bank Test
-prontera.gat,162,188,1 script Bank Test 112,{
- cutin "kafra_06",2;
-
- mes "[Bank Test]";
- mes "Welcome to Prontera's Bank Test.";
- mes "You can only deposit a minimal of";
- mes "1000z. What do you want to do?";
- next;
- menu "Deposit",BANK_IN,"Withdraw",BANK_OUT,"Exit",B_EXIT2;
-BANK_IN:
- mes "[Bank Test]";
- mes "You must deposit the same of less";
- mes "amount of zeny that you carry.";
- mes "How much do you want to deposit?";
- next;
- input @kafrabank;
-
- if(@kafrabank<1000) goto B_EXIT2;
- set @kafrabank2,@kafrabank*1/100;
- if(@kafrabank+@kafrabank2>Zeny) goto BANK_F;
- set Zeny,Zeny-@kafrabank-@kafrabank2;
- set #kafrabank,#kafrabank+@kafrabank;
- mes "You now have: ^135445" + @kafrabank2 + "z^000000";
-
- goto B_EXIT;
-BANK_OUT:
- if(#kafrabank==0) goto BANK_F2;
- mes "[Bank Test]";
- mes "You can only withdraw equally or below this quantity:";
- mes "^135445" + #kafrabank + "^000000z";
- mes "How much do you want to withdraw?";
- next;
- input @kafrabank;
-
- if(@kafrabank<1) goto B_EXIT2;
- if(@kafrabank>#kafrabank) goto BANK_F;
- set #kafrabank,#kafrabank-@kafrabank;
- set Zeny,Zeny+@kafrabank;
-
- goto B_EXIT;
-
-BANK_F:
- mes "[Bank Test]";
- mes "You can't withdraw more than ^135445"+ #kafrabank + "^000000z.";
- goto B_EXIT2;
-BANK_F2:
- mes "[Bank Test]";
- mes "Your account is empty, you may not withdraw at this time.";
- goto B_EXIT2;
-
-B_EXIT:
- mes "Thanks for using depositing";
-B_EXIT2:
- mes "Good bye!";
- cutin "kafra_06",255;
- close;
-}
+// Bank Test
+prontera.gat,162,188,1 script Bank Test 112,{
+ cutin "kafra_06",2;
+
+ mes "[Bank Test]";
+ mes "Welcome to Prontera's Bank Test.";
+ mes "You can only deposit a minimal of";
+ mes "1000z. What do you want to do?";
+ next;
+ menu "Deposit",BANK_IN,"Withdraw",BANK_OUT,"Exit",B_EXIT2;
+BANK_IN:
+ mes "[Bank Test]";
+ mes "You must deposit the same of less";
+ mes "amount of zeny that you carry.";
+ mes "How much do you want to deposit?";
+ next;
+ input @kafrabank;
+
+ if(@kafrabank<1000) goto B_EXIT2;
+ set @kafrabank2,@kafrabank*1/100;
+ if(@kafrabank+@kafrabank2>Zeny) goto BANK_F;
+ set Zeny,Zeny-@kafrabank-@kafrabank2;
+ set #kafrabank,#kafrabank+@kafrabank;
+ mes "You now have: ^135445" + @kafrabank2 + "z^000000";
+
+ goto B_EXIT;
+BANK_OUT:
+ if(#kafrabank==0) goto BANK_F2;
+ mes "[Bank Test]";
+ mes "You can only withdraw equally or below this quantity:";
+ mes "^135445" + #kafrabank + "^000000z";
+ mes "How much do you want to withdraw?";
+ next;
+ input @kafrabank;
+
+ if(@kafrabank<1) goto B_EXIT2;
+ if(@kafrabank>#kafrabank) goto BANK_F;
+ set #kafrabank,#kafrabank-@kafrabank;
+ set Zeny,Zeny+@kafrabank;
+
+ goto B_EXIT;
+
+BANK_F:
+ mes "[Bank Test]";
+ mes "You can't withdraw more than ^135445"+ #kafrabank + "^000000z.";
+ goto B_EXIT2;
+BANK_F2:
+ mes "[Bank Test]";
+ mes "Your account is empty, you may not withdraw at this time.";
+ goto B_EXIT2;
+
+B_EXIT:
+ mes "Thanks for using depositing";
+B_EXIT2:
+ mes "Good bye!";
+ cutin "kafra_06",255;
+ close;
+}
diff --git a/npc/sample/basejob_baseclass_upper.txt b/npc/sample/basejob_baseclass_upper.txt
index 5d77c7412..790f36daf 100644
--- a/npc/sample/basejob_baseclass_upper.txt
+++ b/npc/sample/basejob_baseclass_upper.txt
@@ -1,7 +1,7 @@
-prontera.gat,155,177,1 script Tell Me 725,{
- mes "[Tell Me]";
- mes "Class: " + Class;
- mes "BaseClass: " + BaseClass;
- mes "BaseJob: " + BaseJob;
- mes "Upper: " + Uppser;
-}
+prontera.gat,155,177,1 script Tell Me 725,{
+ mes "[Tell Me]";
+ mes "Class: " + Class;
+ mes "BaseClass: " + BaseClass;
+ mes "BaseJob: " + BaseJob;
+ mes "Upper: " + Uppser;
+}
diff --git a/npc/sample/delitem2.txt b/npc/sample/delitem2.txt
index 3c93a37f5..6f5f1be48 100644
--- a/npc/sample/delitem2.txt
+++ b/npc/sample/delitem2.txt
@@ -1,29 +1,29 @@
-prontera.gat,160,182,5 script Deleter2 51,{
- mes "Input item ID";
- next;
- input @nameid;
- mes "Amount?";
- next;
- input @amount;
- mes "Identified?";
- next;
- input @iden;
- mes "How many times refined?";
- next;
- input @ref;
- mes "Attribute?";
- next;
- input @attr;
- mes "4 cards (one after another):";
- next;
- input @c1;
- input @c2;
- input @c3;
- input @c4;
- mes "Your command is:";
- mes "delitem2 "+@nameid+","+@amount+","+@iden+","+@ref+","+@attr+","+@c1+","+@c2+","+@c3+","+@c4;
- next;
- delitem2 @nameid,@amount,@iden,@ref,@attr,@c1,@c2,@c3,@c4;
- mes "And here is the moment when Your item should disappear :P";
- close;
-}
+prontera.gat,160,182,5 script Deleter2 51,{
+ mes "Input item ID";
+ next;
+ input @nameid;
+ mes "Amount?";
+ next;
+ input @amount;
+ mes "Identified?";
+ next;
+ input @iden;
+ mes "How many times refined?";
+ next;
+ input @ref;
+ mes "Attribute?";
+ next;
+ input @attr;
+ mes "4 cards (one after another):";
+ next;
+ input @c1;
+ input @c2;
+ input @c3;
+ input @c4;
+ mes "Your command is:";
+ mes "delitem2 "+@nameid+","+@amount+","+@iden+","+@ref+","+@attr+","+@c1+","+@c2+","+@c3+","+@c4;
+ next;
+ delitem2 @nameid,@amount,@iden,@ref,@attr,@c1,@c2,@c3,@c4;
+ mes "And here is the moment when Your item should disappear :P";
+ close;
+}
diff --git a/npc/sample/getequipcardid.txt b/npc/sample/getequipcardid.txt
index 0dcec60d8..da5395c8f 100644
--- a/npc/sample/getequipcardid.txt
+++ b/npc/sample/getequipcardid.txt
@@ -1,34 +1,34 @@
-//===== eAthena Script =======================================
-//===== By: ==================================================
-//= Lupus
-//= Shows your HAT's slots IDs
-//= Use it for some checks... e.g.
-//= is your EQUPPED weapon has FIRE property?
-//= is your EQUPPED item produced?
-//============================================================
-
-prontera.gat,155,177,4 script Check My Hat 810,{
- mes "Checking your head...";
- set @ref,0;
-
- if (getequipisequiped(1)) goto L_CHECK1;
- mes "Nothing?";
- emotion e_hmm;
- close;
-
-L_CHECK1:
- set @id,getequipid(1);
- if(getequipisidentify(1)) goto L_CHECK2;
- mes "How can you wear not identified hats?";
- npctalk "You're a cheater!";
- emotion e_wah;
- close;
-
-L_CHECK2:
- set @ref,getequiprefinerycnt(1);
- mes "Your hat is... "+getitemname(@id)+"...";
- if(@ref)mes "It has been refined "+@ref+" times.";
- mes "Card Slot 0:"+getequipcardid(1,0)+" 1:"+getequipcardid(1,1);
- mes "Card Slot 2:"+getequipcardid(1,2)+" 3:"+getequipcardid(1,3);
- close;
-}
+//===== eAthena Script =======================================
+//===== By: ==================================================
+//= Lupus
+//= Shows your HAT's slots IDs
+//= Use it for some checks... e.g.
+//= is your EQUPPED weapon has FIRE property?
+//= is your EQUPPED item produced?
+//============================================================
+
+prontera.gat,155,177,4 script Check My Hat 810,{
+ mes "Checking your head...";
+ set @ref,0;
+
+ if (getequipisequiped(1)) goto L_CHECK1;
+ mes "Nothing?";
+ emotion e_hmm;
+ close;
+
+L_CHECK1:
+ set @id,getequipid(1);
+ if(getequipisidentify(1)) goto L_CHECK2;
+ mes "How can you wear not identified hats?";
+ npctalk "You're a cheater!";
+ emotion e_wah;
+ close;
+
+L_CHECK2:
+ set @ref,getequiprefinerycnt(1);
+ mes "Your hat is... "+getitemname(@id)+"...";
+ if(@ref)mes "It has been refined "+@ref+" times.";
+ mes "Card Slot 0:"+getequipcardid(1,0)+" 1:"+getequipcardid(1,1);
+ mes "Card Slot 2:"+getequipcardid(1,2)+" 3:"+getequipcardid(1,3);
+ close;
+}
diff --git a/npc/sample/getiteminfo.txt b/npc/sample/getiteminfo.txt
index 338c5e946..d3f7718ac 100644
--- a/npc/sample/getiteminfo.txt
+++ b/npc/sample/getiteminfo.txt
@@ -1,16 +1,16 @@
-//by Lupus
-
-prontera.gat,156,179,6 script test_getiteminfo 117,{
- mes "Please enter an item ID (501 ... 14000)";
- input @value;
-//WOW! this line uses INTERNAL function of your client to show item name by its ID!
-// ^nItemID^XXXX -> Item Name
- mes "Item ID: "+@value+" ^nItemID^"+@value;
- mes "Current Item info:";
- set @id,0;
-L_LOOP:
- mes " getiteminfo("+@value+","+@id+") = "+getiteminfo(@value,@id);
- set @id,@id+1;
- if(@id<14) goto L_LOOP;
- close;
+//by Lupus
+
+prontera.gat,156,179,6 script test_getiteminfo 117,{
+ mes "Please enter an item ID (501 ... 14000)";
+ input @value;
+//WOW! this line uses INTERNAL function of your client to show item name by its ID!
+// ^nItemID^XXXX -> Item Name
+ mes "Item ID: "+@value+" ^nItemID^"+@value;
+ mes "Current Item info:";
+ set @id,0;
+L_LOOP:
+ mes " getiteminfo("+@value+","+@id+") = "+getiteminfo(@value,@id);
+ set @id,@id+1;
+ if(@id<14) goto L_LOOP;
+ close;
} \ No newline at end of file
diff --git a/npc/sample/getmonsterinfo.txt b/npc/sample/getmonsterinfo.txt
index a935771c7..871e0f385 100644
--- a/npc/sample/getmonsterinfo.txt
+++ b/npc/sample/getmonsterinfo.txt
@@ -1,18 +1,18 @@
-//by Lupus
-
-prontera.gat,156,179,6 script test_getmonsterinfo 117,{
- mes "Please enter a monster ID (1001 ... 2000)";
- input @value;
- if(getmonsterinfo(@value,MOB_LV)<0 || getmonsterinfo(@value,MOB_NAME)=="Dummy") {
- mes "Wrong MOB ID.";
- close;
- }
- mes "Monster ID: "+@value+" '"+getmonsterinfo(@value,MOB_NAME)+"'";
- mes "Current Monster info:";
- set @id,0;
-L_LOOP:
- mes " getmonsterinfo("+@value+","+@id+") = "+getmonsterinfo(@value,@id);
- set @id,@id+1;
- if(@id<22) goto L_LOOP;
- close;
+//by Lupus
+
+prontera.gat,156,179,6 script test_getmonsterinfo 117,{
+ mes "Please enter a monster ID (1001 ... 2000)";
+ input @value;
+ if(getmonsterinfo(@value,MOB_LV)<0 || getmonsterinfo(@value,MOB_NAME)=="Dummy") {
+ mes "Wrong MOB ID.";
+ close;
+ }
+ mes "Monster ID: "+@value+" '"+getmonsterinfo(@value,MOB_NAME)+"'";
+ mes "Current Monster info:";
+ set @id,0;
+L_LOOP:
+ mes " getmonsterinfo("+@value+","+@id+") = "+getmonsterinfo(@value,@id);
+ set @id,@id+1;
+ if(@id<22) goto L_LOOP;
+ close;
} \ No newline at end of file
diff --git a/npc/sample/gstorage_test.txt b/npc/sample/gstorage_test.txt
index 88ab05b96..98761ea35 100644
--- a/npc/sample/gstorage_test.txt
+++ b/npc/sample/gstorage_test.txt
@@ -1,70 +1,70 @@
-/* Guild Warehouse Service Test-Script
-prontera.gat,165,188,4 script Guild Warehouse 112,{
- cutin "kafra_06",2;
-
- mes "[Guild Warehouse Coupler]";
- mes "This is the guild warehouse coupler service.";
- mes "You will not receive zeny for this is a test.";
- next;
- menu "Access Guild Warehouse", GS_OPEN, "Exit", GS_EXIT3;
-
-GS_OPEN:
- set @flag,guildopenstorage(0);
- if(@flag == 1) goto GS_EXIT1;
- if(@flag == 2) goto GS_EXIT2;
- goto GS_EXIT4;
-
-GS_EXIT1:
- mes "[Guild Warehouse]";
- mes "The guild warehouse is being used right now.";
- mes "Please wait a while, then come back.";
- goto GS_EXIT4;
-
-GS_EXIT2:
- mes "[Guild Warehouse]";
- mes "You can't use this service if you're not in a guild!";
- goto GS_EXIT4;
-
-GS_EXIT3:
- mes "[Guild Warehouser]";
- mes "Come back whenever you want.";
-
-GS_EXIT4:
- cutin "kafra_06",255;
- close;
-}
-*/
-
-// ƒJƒvƒ‰ƒMƒ‹ƒh‘qŒÉƒT[ƒrƒX ƒeƒXƒgƒXƒNƒŠƒvƒg
-prontera.gat,165,188,4 script ƒMƒ‹ƒh‘qŒÉƒJƒvƒ‰ 112,{
- cutin "kafra_06",2;
-
- mes"[ƒMƒ‹ƒh‘qŒÉƒJƒvƒ‰]";
- mes "ƒJƒvƒ‰ƒMƒ‹ƒh‘qŒÉƒT[ƒrƒX‚Å‚·B";
- mes "–ˆ“x‚²—˜—p‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·ô";
- mes "ƒeƒXƒg—p‚È‚Ì‚Å‹à‚Í–á‚¢‚Ü‚¹‚ñB";
- next;
- menu "ƒMƒ‹ƒh‘qŒÉ‚ð—˜—p‚·‚é",GS_OPEN,"‚â‚Á‚Ï‚â‚ß‚é",GS_EXIT3;
-
-GS_OPEN:
- set @flag,guildopenstorage(0);
- if(@flag == 1) goto GS_EXIT1;
- if(@flag == 2) goto GS_EXIT2;
- goto GS_EXIT4;
-
-GS_EXIT1:
- mes "ƒMƒ‹ƒhƒƒ“ƒo[‚ª‘qŒÉ‚ðŽg—p’†‚Å‚·B";
- mes "‚µ‚΂炭‘Ò‚Á‚Ä‚©‚ç—˜—p‚µ‚Ä‚­‚¾‚³‚¢B";
- goto GS_EXIT4;
-
-GS_EXIT2:
- mes "ƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢•û‚Í—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB";
- goto GS_EXIT4;
-
-GS_EXIT3:
- mes "‚Ü‚½‚Ì‚²—˜—p‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·ô";
-
-GS_EXIT4:
- cutin "kafra_06",255;
- close;
-}
+/* Guild Warehouse Service Test-Script
+prontera.gat,165,188,4 script Guild Warehouse 112,{
+ cutin "kafra_06",2;
+
+ mes "[Guild Warehouse Coupler]";
+ mes "This is the guild warehouse coupler service.";
+ mes "You will not receive zeny for this is a test.";
+ next;
+ menu "Access Guild Warehouse", GS_OPEN, "Exit", GS_EXIT3;
+
+GS_OPEN:
+ set @flag,guildopenstorage(0);
+ if(@flag == 1) goto GS_EXIT1;
+ if(@flag == 2) goto GS_EXIT2;
+ goto GS_EXIT4;
+
+GS_EXIT1:
+ mes "[Guild Warehouse]";
+ mes "The guild warehouse is being used right now.";
+ mes "Please wait a while, then come back.";
+ goto GS_EXIT4;
+
+GS_EXIT2:
+ mes "[Guild Warehouse]";
+ mes "You can't use this service if you're not in a guild!";
+ goto GS_EXIT4;
+
+GS_EXIT3:
+ mes "[Guild Warehouser]";
+ mes "Come back whenever you want.";
+
+GS_EXIT4:
+ cutin "kafra_06",255;
+ close;
+}
+*/
+
+// ƒJƒvƒ‰ƒMƒ‹ƒh‘qŒÉƒT[ƒrƒX ƒeƒXƒgƒXƒNƒŠƒvƒg
+prontera.gat,165,188,4 script ƒMƒ‹ƒh‘qŒÉƒJƒvƒ‰ 112,{
+ cutin "kafra_06",2;
+
+ mes"[ƒMƒ‹ƒh‘qŒÉƒJƒvƒ‰]";
+ mes "ƒJƒvƒ‰ƒMƒ‹ƒh‘qŒÉƒT[ƒrƒX‚Å‚·B";
+ mes "–ˆ“x‚²—˜—p‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·ô";
+ mes "ƒeƒXƒg—p‚È‚Ì‚Å‹à‚Í–á‚¢‚Ü‚¹‚ñB";
+ next;
+ menu "ƒMƒ‹ƒh‘qŒÉ‚ð—˜—p‚·‚é",GS_OPEN,"‚â‚Á‚Ï‚â‚ß‚é",GS_EXIT3;
+
+GS_OPEN:
+ set @flag,guildopenstorage(0);
+ if(@flag == 1) goto GS_EXIT1;
+ if(@flag == 2) goto GS_EXIT2;
+ goto GS_EXIT4;
+
+GS_EXIT1:
+ mes "ƒMƒ‹ƒhƒƒ“ƒo[‚ª‘qŒÉ‚ðŽg—p’†‚Å‚·B";
+ mes "‚µ‚΂炭‘Ò‚Á‚Ä‚©‚ç—˜—p‚µ‚Ä‚­‚¾‚³‚¢B";
+ goto GS_EXIT4;
+
+GS_EXIT2:
+ mes "ƒMƒ‹ƒh‚ÉŠ‘®‚µ‚Ä‚È‚¢•û‚Í—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB";
+ goto GS_EXIT4;
+
+GS_EXIT3:
+ mes "‚Ü‚½‚Ì‚²—˜—p‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·ô";
+
+GS_EXIT4:
+ cutin "kafra_06",255;
+ close;
+}
diff --git a/npc/sample/npc_card_remover.txt b/npc/sample/npc_card_remover.txt
index c341c4d1b..f991bc32c 100644
--- a/npc/sample/npc_card_remover.txt
+++ b/npc/sample/npc_card_remover.txt
@@ -1,197 +1,197 @@
-// Card removal NPC by TyrNemesis^ “ú–{Œê–óFŒÓ’±—–
-prt_in.gat,28,73,4 script Œ«‚¢˜V— 78,{
-
-UPGRADEROOT:
-// mes "[Wise Old Woman]";
-// mes "Good day, young one. I have the power to remove cards that you have compounded onto your equipment. Does this idea please you?";
- mes "[Œ«‚¢˜V—]";
- mes "‚¢‚¢“V‹C‚¾‚ËAŽá‚¢‚ÌB";
- mes "‚Æ‚±‚ë‚ÅAƒAƒ^ƒV‚Í•‹ï‚É‘•’…‚µ‚Ä‚¢‚é";
- mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·—Í‚ðŽ‚Á‚Ä‚¢‚邯‚ÇA";
- mes "—Í‚ð‘Ý‚»‚¤‚©‚ËH";
- next;
-// menu "Yes, it does.",REMOVEMENU,
-// "What do you charge?",REMOVEPRICE,
-// "No thanks.",CLOSEOUT;
- menu "‚¨Šè‚¢‚µ‚Ü‚·B",REMOVEMENU,
- "‚¢‚­‚ç‚©‚©‚é‚ñ‚Å‚·‚©H",REMOVEPRICE,
- "•K—v‚È‚¢‚Å‚·B",CLOSEOUT;
-
-REMOVEPRICE:
-// mes "[Wise Old Woman]";
-// mes "I charge a flat fee of 200000 zeny, plus 25000 zeny for each card I remove from the item. In addition, I need a star crumb and a yellow gemstone to work my magic.";
- mes "[Œ«‚¢˜V—]";
- mes "‚»‚¤‚¾‚ËA";
- mes "‚Ü‚¸Šî–{—¿‹à‚Æ‚µ‚Ä^4040FF200000z^000000B";
- mes "‚»‚µ‚ăJ[ƒh‚P–‡‚ɂ‚«^4040FF25000z^000000–Ⴄ‚æB";
- mes "‚ ‚Æ‚ÍA–‚–@‚ðŽg‚¤‚½‚ß‚É^4040FF¯‚Ì‚©‚¯‚ç^000000‚Æ";
- mes "^4040FFƒCƒGƒ[ƒWƒFƒ€ƒXƒg[ƒ“^000000‚ª‚P‚‚¸‚•K—v‚¾‚æB";
- next;
-// menu "Very well. Let's do it.",REMOVEMENU,
-// "No thanks.",CLOSEOUT;
- menu "‚¨Šè‚¢‚µ‚Ü‚·B",REMOVEMENU,
- "•K—v‚È‚¢‚Å‚·B",CLOSEOUT;
-
-REMOVEMENU:
-// mes "[Wise Old Woman]";
-// mes "Very well. Which item shall I examine for you?";
- mes "[Œ«‚¢˜V—]";
- mes "‚悵‚悵B";
- mes "‚Ç‚Ì•‹ï‚̃J[ƒh‚ðŽæ‚èŠO‚·‚ñ‚¾‚ËH";
- next;
-// menu "I changed my mind.",CLOSEOUT,
- menu "‚â‚Á‚Ï‚è‚â‚ß‚Ü‚·B",CLOSEOUT,
- getequipname(1),-,
- getequipname(2),-,
- getequipname(3),-,
- getequipname(4),-,
- getequipname(5),-,
- getequipname(6),-,
- getequipname(7),-,
- getequipname(8),-,
- getequipname(9),-,
- getequipname(10),-;
- set @part,@menu-1;
- if(getequipcardcnt(@part) == 0) goto DENYCARDCOUNT;
- set @cardcount,getequipcardcnt(@part);
-// if(@cardcount > 1) goto CARDNUMMULTIMSG;
-// mes "[Wise Old Woman]";
-// mes "This item has " + @cardcount + " card compounded on it. To perform my magic, I will need 225000 zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
-// goto CARDNUMPOSTMSG;
-//CARDNUMMULTIMSG:
-// mes "[Wise Old Woman]";
-// mes "This item has " + @cardcount + " cards compounded on it. To perform my magic, I will need " + (200000+(@cardcount * 25000)) + " zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
- mes "[Œ«‚¢˜V—]";
- mes "‚±‚Ì•‹ï‚É‚Í" + @cardcount + "‚ƒJ[ƒh‚ª‚‚¢‚Ä‚é‚ËB";
- mes "^0000FF" + (200000+(@cardcount * 25000)) + "z^000000‚Æ^0000FF¯‚Ì‚©‚¯‚ç^000000‚Æ^0000FFƒCƒGƒ[ƒWƒFƒ€ƒXƒg[ƒ“^000000‚ª•K—v‚¾‚æB";
-//CARDNUMPOSTMSG:
- next;
-// menu "Very well. Do it.",REMOVECARDWARNING,
-// "Never mind.",CLOSEOUT;
- menu "‚í‚©‚è‚Ü‚µ‚½A‚¨Šè‚¢‚µ‚Ü‚·B",REMOVECARDWARNING,
- "‚â‚Á‚Ï‚è‚â‚ß‚Ü‚·B",CLOSEOUT;
-
-REMOVECARDWARNING:
-// mes "[Wise Old Woman]";
-// mes "Before I begin, I must warn you--I may fail. If I do, I may destroy the cards, the item, or both. I do not give refunds. That being said, which is more important to you: The cards, or the item?";
- mes "[Œ«‚¢˜V—]";
- mes "‚¨‚Á‚ÆŒ¾‚¢–Y‚ê‚é‚Æ‚±‚낾‚Á‚½‚ËB";
- mes "‚±‚Ì–‚–@‚Í‚Æ‚Ä‚à“‚¢‚©‚çA";
- mes "^FF4040Ž¸”s‚·‚é‚©‚à‚µ‚ê‚È‚¢^000000‚Ì‚³B";
- mes "Ž¸”s‚µ‚½‚çƒJ[ƒh‚©•‹ïA‚ ‚é‚¢‚Í";
- mes "‚»‚Ì—¼•û‚ª^FF4040”j‰ó‚³‚ê‚Ä‚µ‚Ü‚¤^000000‚©‚à";
- mes "‚µ‚ê‚È‚¢‚ñ‚¾‚æB";
- next;
- mes "[Œ«‚¢˜V—]";
- mes "Ž¸”s‚µ‚Ä‚à^FF4040•Ô‹à‚Í‚µ‚È‚¢^000000‚©‚çA";
- mes "ˆê‰ž•·‚¢‚Ä’u‚­‚¯‚ÇA”ä‚ׂé‚È‚ç";
- mes "ƒJ[ƒh‚Æ•‹ï‚Ì‚Ç‚Á‚¿‚ª‘åØ‚¾‚¢H";
- next;
-// menu "I changed my mind about this.",CLOSEOUT,
-// "The item.",PRIORITYITEM,
-// "The cards.",PRIORITYCARD;
- menu "‚»‚ê‚È‚ç‚â‚ß‚Ü‚·B",CLOSEOUT,
- "•‹ï‚Ì•û‚ª‘åØ‚Å‚·B",PRIORITYITEM,
- "ƒJ[ƒh‚Ì•û‚ª‘åØ‚Å‚·",PRIORITYCARD;
-
-PRIORITYITEM:
- set @failtype,1;
- goto REMOVECARD;
-
-PRIORITYCARD:
- set @failtype,2;
- goto REMOVECARD;
-
-REMOVECARD:
-// mes "[Wise Old Woman]";
-// mes "Very well. I shall begin.";
- mes "[Œ«‚¢˜V—]";
- mes "‚悵AŽn‚ß‚é‚æB";
- next;
- if((zeny < (200000+(@cardcount * 25000))) || (countitem(1000) < 1) || (countitem(715) < 1)) goto DENYMATERIAL;
- set zeny,zeny - (200000+(@cardcount * 25000));
- delitem 1000,1;
- delitem 715,1;
-
-// Replace the constants in the next 3 lines with failure chance values defined in refine_db.txt
-// First value = Total failure chance (item and cards destroyed)
-// Second value = Partial failure chance (one or the other is destroyed, player decides which one is safe)
-// Third value = Harmless failure chance (all that's lost is your investment)
-
- set @failchance,rand(100);
- if(@failchance < 2) goto FAILREMOVECARD0;
- if((@failchance < 6) && (@failtype == 1)) goto FAILREMOVECARD1;
- if((@failchance < 6) && (@failtype == 2)) goto FAILREMOVECARD2;
- if(@failchance < 10) goto FAILREMOVECARD3;
- successremovecards @part;
-// mes "[Wise Old Woman]";
-// mes "The process was a success. Here are your cards and your item. Farewell.";
- mes "[Œ«‚¢˜V—]";
- mes "‚¤‚Ü‚­‚¢‚Á‚½‚æB";
- mes "‚±‚ê‚炪•‹ï‚ƃAƒCƒeƒ€‚³B‚¶‚á‚ ‚ËB";
- close;
-
-FAILREMOVECARD0:
-// mes "[Wise Old Woman]";
-// mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
- mes "[Œ«‚¢˜V—]";
- mes "Žc”O‚¾‚¯‚ÇŠ®‘S‚ÉŽ¸”s‚µ‚½‚æB";
- mes "•‹ï‚àƒJ[ƒh‚à‰ó‚ê‚Ä‚µ‚Ü‚Á‚½B";
- failedremovecards @part,0;
- close;
-
-FAILREMOVECARD1:
-// mes "[Wise Old Woman]";
-// mes "While I have managed to remove the cards from the item, they were destroyed in the process. The item, however, is okay.";
- mes "[Œ«‚¢˜V—]";
- mes "Šæ’£‚Á‚½‚¯‚Ç‚ËA";
- mes "ƒJ[ƒh‚Ì‚Ù‚¤‚Í‘S•”‰ó‚ê‚Ä‚µ‚Ü‚Á‚½‚æB";
- mes "‚Å‚à•‹ï‚Ì•û‚Í–³Ž–‚¾‚Á‚½‚æB";
- failedremovecards @part,1;
- close;
-
-FAILREMOVECARD2:
-// mes "[Wise Old Woman]";
-// mes "Most unfortunate. I succeeded at removing the cards, but the item itself was destroyed in the process.";
- mes "[Œ«‚¢˜V—]";
- mes "•s‰^‚¾‚Á‚½‚ËB";
- mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·‚Ì‚Í‚¤‚Ü‚­‚¢‚Á‚½‚¯‚Ç";
- mes "•‹ï‚ª‰ó‚ê‚Ä‚µ‚Ü‚Á‚½‚æB";
- failedremovecards @part,2;
- close;
-
-FAILREMOVECARD3:
-// mes "[Wise Old Woman]";
-// mes "I have failed to remove the cards. Luckily, however, both the item and the cards are still okay.";
- mes "[Œ«‚¢˜V—]";
- mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·‚Ì‚ÉŽ¸”s‚µ‚½‚æB";
- mes "‚Å‚àA•sK’†‚ÌK‚¢‚³B";
- mes "•‹ï‚àƒJ[ƒh‚à–³Ž–‚¾‚æB";
- failedremovecards @part,3;
- close;
-
-DENYCARDCOUNT:
-// mes "[Wise Old Woman]";
-// mes "Young one... There are no cards compounded on this item. I can do nothing with it, I'm afraid.";
- mes "[Œ«‚¢˜V—]";
- mes "Žá‚¢‚ÌAƒJ[ƒh‚ª‚‚¢‚Ä‚È‚¢‚æB";
- mes "‚»‚ꂶ‚áƒAƒ^ƒV‚Ìo”Ô‚Í‚È‚¢‚³B";
- close;
-
-DENYMATERIAL:
-// mes "[Wise Old Woman]";
-// mes "You do not have all the items I require to work my magic, child. Come again when you do.";
- mes "[Œ«‚¢˜V—]";
- mes "•K—v‚ȃAƒCƒeƒ€‚ª‘«‚è‚È‚¢‚悤‚¾‚ËB";
- mes "ƒAƒCƒeƒ€‚𑵂¦‚Ä‚à‚¤ˆê“x—ˆ‚ÈB";
- close;
-
-CLOSEOUT:
-// mes "[Wise Old Woman]";
-// mes "Very well. Return at once if you seek my services.";
- mes "[Œ«‚¢˜V—]";
- mes "‚í‚©‚Á‚½‚æB";
- mes "ƒAƒ^ƒV‚Ì—Í‚ª•K—v‚È‚ç‚¢‚Â‚Å‚à—ˆ‚ÈB";
- close;
-
-}
+// Card removal NPC by TyrNemesis^ “ú–{Œê–óFŒÓ’±—–
+prt_in.gat,28,73,4 script Œ«‚¢˜V— 78,{
+
+UPGRADEROOT:
+// mes "[Wise Old Woman]";
+// mes "Good day, young one. I have the power to remove cards that you have compounded onto your equipment. Does this idea please you?";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚¢‚¢“V‹C‚¾‚ËAŽá‚¢‚ÌB";
+ mes "‚Æ‚±‚ë‚ÅAƒAƒ^ƒV‚Í•‹ï‚É‘•’…‚µ‚Ä‚¢‚é";
+ mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·—Í‚ðŽ‚Á‚Ä‚¢‚邯‚ÇA";
+ mes "—Í‚ð‘Ý‚»‚¤‚©‚ËH";
+ next;
+// menu "Yes, it does.",REMOVEMENU,
+// "What do you charge?",REMOVEPRICE,
+// "No thanks.",CLOSEOUT;
+ menu "‚¨Šè‚¢‚µ‚Ü‚·B",REMOVEMENU,
+ "‚¢‚­‚ç‚©‚©‚é‚ñ‚Å‚·‚©H",REMOVEPRICE,
+ "•K—v‚È‚¢‚Å‚·B",CLOSEOUT;
+
+REMOVEPRICE:
+// mes "[Wise Old Woman]";
+// mes "I charge a flat fee of 200000 zeny, plus 25000 zeny for each card I remove from the item. In addition, I need a star crumb and a yellow gemstone to work my magic.";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚»‚¤‚¾‚ËA";
+ mes "‚Ü‚¸Šî–{—¿‹à‚Æ‚µ‚Ä^4040FF200000z^000000B";
+ mes "‚»‚µ‚ăJ[ƒh‚P–‡‚ɂ‚«^4040FF25000z^000000–Ⴄ‚æB";
+ mes "‚ ‚Æ‚ÍA–‚–@‚ðŽg‚¤‚½‚ß‚É^4040FF¯‚Ì‚©‚¯‚ç^000000‚Æ";
+ mes "^4040FFƒCƒGƒ[ƒWƒFƒ€ƒXƒg[ƒ“^000000‚ª‚P‚‚¸‚•K—v‚¾‚æB";
+ next;
+// menu "Very well. Let's do it.",REMOVEMENU,
+// "No thanks.",CLOSEOUT;
+ menu "‚¨Šè‚¢‚µ‚Ü‚·B",REMOVEMENU,
+ "•K—v‚È‚¢‚Å‚·B",CLOSEOUT;
+
+REMOVEMENU:
+// mes "[Wise Old Woman]";
+// mes "Very well. Which item shall I examine for you?";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚悵‚悵B";
+ mes "‚Ç‚Ì•‹ï‚̃J[ƒh‚ðŽæ‚èŠO‚·‚ñ‚¾‚ËH";
+ next;
+// menu "I changed my mind.",CLOSEOUT,
+ menu "‚â‚Á‚Ï‚è‚â‚ß‚Ü‚·B",CLOSEOUT,
+ getequipname(1),-,
+ getequipname(2),-,
+ getequipname(3),-,
+ getequipname(4),-,
+ getequipname(5),-,
+ getequipname(6),-,
+ getequipname(7),-,
+ getequipname(8),-,
+ getequipname(9),-,
+ getequipname(10),-;
+ set @part,@menu-1;
+ if(getequipcardcnt(@part) == 0) goto DENYCARDCOUNT;
+ set @cardcount,getequipcardcnt(@part);
+// if(@cardcount > 1) goto CARDNUMMULTIMSG;
+// mes "[Wise Old Woman]";
+// mes "This item has " + @cardcount + " card compounded on it. To perform my magic, I will need 225000 zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
+// goto CARDNUMPOSTMSG;
+//CARDNUMMULTIMSG:
+// mes "[Wise Old Woman]";
+// mes "This item has " + @cardcount + " cards compounded on it. To perform my magic, I will need " + (200000+(@cardcount * 25000)) + " zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000.";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚±‚Ì•‹ï‚É‚Í" + @cardcount + "‚ƒJ[ƒh‚ª‚‚¢‚Ä‚é‚ËB";
+ mes "^0000FF" + (200000+(@cardcount * 25000)) + "z^000000‚Æ^0000FF¯‚Ì‚©‚¯‚ç^000000‚Æ^0000FFƒCƒGƒ[ƒWƒFƒ€ƒXƒg[ƒ“^000000‚ª•K—v‚¾‚æB";
+//CARDNUMPOSTMSG:
+ next;
+// menu "Very well. Do it.",REMOVECARDWARNING,
+// "Never mind.",CLOSEOUT;
+ menu "‚í‚©‚è‚Ü‚µ‚½A‚¨Šè‚¢‚µ‚Ü‚·B",REMOVECARDWARNING,
+ "‚â‚Á‚Ï‚è‚â‚ß‚Ü‚·B",CLOSEOUT;
+
+REMOVECARDWARNING:
+// mes "[Wise Old Woman]";
+// mes "Before I begin, I must warn you--I may fail. If I do, I may destroy the cards, the item, or both. I do not give refunds. That being said, which is more important to you: The cards, or the item?";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚¨‚Á‚ÆŒ¾‚¢–Y‚ê‚é‚Æ‚±‚낾‚Á‚½‚ËB";
+ mes "‚±‚Ì–‚–@‚Í‚Æ‚Ä‚à“‚¢‚©‚çA";
+ mes "^FF4040Ž¸”s‚·‚é‚©‚à‚µ‚ê‚È‚¢^000000‚Ì‚³B";
+ mes "Ž¸”s‚µ‚½‚çƒJ[ƒh‚©•‹ïA‚ ‚é‚¢‚Í";
+ mes "‚»‚Ì—¼•û‚ª^FF4040”j‰ó‚³‚ê‚Ä‚µ‚Ü‚¤^000000‚©‚à";
+ mes "‚µ‚ê‚È‚¢‚ñ‚¾‚æB";
+ next;
+ mes "[Œ«‚¢˜V—]";
+ mes "Ž¸”s‚µ‚Ä‚à^FF4040•Ô‹à‚Í‚µ‚È‚¢^000000‚©‚çA";
+ mes "ˆê‰ž•·‚¢‚Ä’u‚­‚¯‚ÇA”ä‚ׂé‚È‚ç";
+ mes "ƒJ[ƒh‚Æ•‹ï‚Ì‚Ç‚Á‚¿‚ª‘åØ‚¾‚¢H";
+ next;
+// menu "I changed my mind about this.",CLOSEOUT,
+// "The item.",PRIORITYITEM,
+// "The cards.",PRIORITYCARD;
+ menu "‚»‚ê‚È‚ç‚â‚ß‚Ü‚·B",CLOSEOUT,
+ "•‹ï‚Ì•û‚ª‘åØ‚Å‚·B",PRIORITYITEM,
+ "ƒJ[ƒh‚Ì•û‚ª‘åØ‚Å‚·",PRIORITYCARD;
+
+PRIORITYITEM:
+ set @failtype,1;
+ goto REMOVECARD;
+
+PRIORITYCARD:
+ set @failtype,2;
+ goto REMOVECARD;
+
+REMOVECARD:
+// mes "[Wise Old Woman]";
+// mes "Very well. I shall begin.";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚悵AŽn‚ß‚é‚æB";
+ next;
+ if((zeny < (200000+(@cardcount * 25000))) || (countitem(1000) < 1) || (countitem(715) < 1)) goto DENYMATERIAL;
+ set zeny,zeny - (200000+(@cardcount * 25000));
+ delitem 1000,1;
+ delitem 715,1;
+
+// Replace the constants in the next 3 lines with failure chance values defined in refine_db.txt
+// First value = Total failure chance (item and cards destroyed)
+// Second value = Partial failure chance (one or the other is destroyed, player decides which one is safe)
+// Third value = Harmless failure chance (all that's lost is your investment)
+
+ set @failchance,rand(100);
+ if(@failchance < 2) goto FAILREMOVECARD0;
+ if((@failchance < 6) && (@failtype == 1)) goto FAILREMOVECARD1;
+ if((@failchance < 6) && (@failtype == 2)) goto FAILREMOVECARD2;
+ if(@failchance < 10) goto FAILREMOVECARD3;
+ successremovecards @part;
+// mes "[Wise Old Woman]";
+// mes "The process was a success. Here are your cards and your item. Farewell.";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚¤‚Ü‚­‚¢‚Á‚½‚æB";
+ mes "‚±‚ê‚炪•‹ï‚ƃAƒCƒeƒ€‚³B‚¶‚á‚ ‚ËB";
+ close;
+
+FAILREMOVECARD0:
+// mes "[Wise Old Woman]";
+// mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
+ mes "[Œ«‚¢˜V—]";
+ mes "Žc”O‚¾‚¯‚ÇŠ®‘S‚ÉŽ¸”s‚µ‚½‚æB";
+ mes "•‹ï‚àƒJ[ƒh‚à‰ó‚ê‚Ä‚µ‚Ü‚Á‚½B";
+ failedremovecards @part,0;
+ close;
+
+FAILREMOVECARD1:
+// mes "[Wise Old Woman]";
+// mes "While I have managed to remove the cards from the item, they were destroyed in the process. The item, however, is okay.";
+ mes "[Œ«‚¢˜V—]";
+ mes "Šæ’£‚Á‚½‚¯‚Ç‚ËA";
+ mes "ƒJ[ƒh‚Ì‚Ù‚¤‚Í‘S•”‰ó‚ê‚Ä‚µ‚Ü‚Á‚½‚æB";
+ mes "‚Å‚à•‹ï‚Ì•û‚Í–³Ž–‚¾‚Á‚½‚æB";
+ failedremovecards @part,1;
+ close;
+
+FAILREMOVECARD2:
+// mes "[Wise Old Woman]";
+// mes "Most unfortunate. I succeeded at removing the cards, but the item itself was destroyed in the process.";
+ mes "[Œ«‚¢˜V—]";
+ mes "•s‰^‚¾‚Á‚½‚ËB";
+ mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·‚Ì‚Í‚¤‚Ü‚­‚¢‚Á‚½‚¯‚Ç";
+ mes "•‹ï‚ª‰ó‚ê‚Ä‚µ‚Ü‚Á‚½‚æB";
+ failedremovecards @part,2;
+ close;
+
+FAILREMOVECARD3:
+// mes "[Wise Old Woman]";
+// mes "I have failed to remove the cards. Luckily, however, both the item and the cards are still okay.";
+ mes "[Œ«‚¢˜V—]";
+ mes "ƒJ[ƒh‚ðŽæ‚èŠO‚·‚Ì‚ÉŽ¸”s‚µ‚½‚æB";
+ mes "‚Å‚àA•sK’†‚ÌK‚¢‚³B";
+ mes "•‹ï‚àƒJ[ƒh‚à–³Ž–‚¾‚æB";
+ failedremovecards @part,3;
+ close;
+
+DENYCARDCOUNT:
+// mes "[Wise Old Woman]";
+// mes "Young one... There are no cards compounded on this item. I can do nothing with it, I'm afraid.";
+ mes "[Œ«‚¢˜V—]";
+ mes "Žá‚¢‚ÌAƒJ[ƒh‚ª‚‚¢‚Ä‚È‚¢‚æB";
+ mes "‚»‚ꂶ‚áƒAƒ^ƒV‚Ìo”Ô‚Í‚È‚¢‚³B";
+ close;
+
+DENYMATERIAL:
+// mes "[Wise Old Woman]";
+// mes "You do not have all the items I require to work my magic, child. Come again when you do.";
+ mes "[Œ«‚¢˜V—]";
+ mes "•K—v‚ȃAƒCƒeƒ€‚ª‘«‚è‚È‚¢‚悤‚¾‚ËB";
+ mes "ƒAƒCƒeƒ€‚𑵂¦‚Ä‚à‚¤ˆê“x—ˆ‚ÈB";
+ close;
+
+CLOSEOUT:
+// mes "[Wise Old Woman]";
+// mes "Very well. Return at once if you seek my services.";
+ mes "[Œ«‚¢˜V—]";
+ mes "‚í‚©‚Á‚½‚æB";
+ mes "ƒAƒ^ƒV‚Ì—Í‚ª•K—v‚È‚ç‚¢‚Â‚Å‚à—ˆ‚ÈB";
+ close;
+
+}
diff --git a/npc/sample/npc_dynamic_shop.txt b/npc/sample/npc_dynamic_shop.txt
index 59e76c72c..c580b2847 100644
--- a/npc/sample/npc_dynamic_shop.txt
+++ b/npc/sample/npc_dynamic_shop.txt
@@ -1,84 +1,84 @@
-- shop dyn_shop1 -1,501:50
-
-prontera.gat,181,200,4 script Dynamic Shop 123,{
-callshop "dyn_shop1",0;
-end;
-
-OnSellItem:
-for(set @i, 0; @i < getarraysize(@sold_nameid); set @i, @i + 1){
- if(countitem(@sold_nameid[@i]) < @sold_quantity[@i] || @sold_quantity[@i] <= 0){
- mes "omgh4x!";
- end;
- }
- if(@sold_nameid[@i] == 501){
- set $@rpotsleft, $@rpotsleft + @sold_quantity[@i];
- set Zeny, Zeny + @sold_quantity[@i]*20;
- delitem 501, @sold_quantity[@i];
- } else {
- if(@sold_nameid[@i] == 502){
- set $@opotsleft, $@opotsleft + @sold_quantity[@i];
- set Zeny, Zeny + @sold_quantity[@i]*100;
- delitem 502, @sold_quantity[@i];
- } else {
- mes "Sorry, I don't need your items.";
- }
- }
-}
-deletearray @sold_quantity, getarraysize(@sold_quantity);
-deletearray @sold_nameid, getarraysize(@sold_nameid);
-mes "Deal completed.";
-close;
-
-OnBuyItem:
-for(set @i, 0; @i < getarraysize(@bought_nameid); set @i, @i + 1){
- if(@bought_quantity[@i] <= 0){
- mes "omgh4x!";
- end;
- }
- if(@bought_nameid[@i] == 501){
- if(@bought_quantity[@i] > $@rpotsleft){
- if($@rpotsleft > 0){
- set @bought_quantity[@i], $@rpotsleft;
- } else {
- mes "We are out of red potions!";
- close;
- }
- }
- if(Zeny >= 40*@bought_quantity[@i]){
- set Zeny, Zeny - 40*@bought_quantity[@i];
- getitem 501, @bought_quantity[@i];
- set $@rpotsleft, $@rpotsleft - @bought_quantity[@i];
- } else {
- mes "You have insufficient cash.";
- close;
- }
- } else {
- if(@bought_quantity[@i] > $@opotsleft){
- if($@opotsleft > 0){
- set @bought_quantity[@i], $@opotsleft;
- } else {
- mes "We are out of orange potions!";
- close;
- }
- }
- if(Zeny >= 200*@bought_quantity[@i]){
- set Zeny, Zeny - 200*@bought_quantity[@i];
- getitem 502, @bought_quantity[@i];
- set $@opotsleft, $@opotsleft - @bought_quantity[@i];
- } else {
- mes "You have insufficient cash.";
- close;
- }
- }
-}
-deletearray @bought_quantity, getarraysize(@bought_quantity);
-deletearray @bought_nameid, getarraysize(@bought_nameid);
-mes "Trade done.";
-close;
-
-OnInit:
-npcshopitem "dyn_shop1", 501,40,502,200;
-set $@rpotsleft, 10;
-set $@opotsleft, 10;
-end;
+- shop dyn_shop1 -1,501:50
+
+prontera.gat,181,200,4 script Dynamic Shop 123,{
+callshop "dyn_shop1",0;
+end;
+
+OnSellItem:
+for(set @i, 0; @i < getarraysize(@sold_nameid); set @i, @i + 1){
+ if(countitem(@sold_nameid[@i]) < @sold_quantity[@i] || @sold_quantity[@i] <= 0){
+ mes "omgh4x!";
+ end;
+ }
+ if(@sold_nameid[@i] == 501){
+ set $@rpotsleft, $@rpotsleft + @sold_quantity[@i];
+ set Zeny, Zeny + @sold_quantity[@i]*20;
+ delitem 501, @sold_quantity[@i];
+ } else {
+ if(@sold_nameid[@i] == 502){
+ set $@opotsleft, $@opotsleft + @sold_quantity[@i];
+ set Zeny, Zeny + @sold_quantity[@i]*100;
+ delitem 502, @sold_quantity[@i];
+ } else {
+ mes "Sorry, I don't need your items.";
+ }
+ }
+}
+deletearray @sold_quantity, getarraysize(@sold_quantity);
+deletearray @sold_nameid, getarraysize(@sold_nameid);
+mes "Deal completed.";
+close;
+
+OnBuyItem:
+for(set @i, 0; @i < getarraysize(@bought_nameid); set @i, @i + 1){
+ if(@bought_quantity[@i] <= 0){
+ mes "omgh4x!";
+ end;
+ }
+ if(@bought_nameid[@i] == 501){
+ if(@bought_quantity[@i] > $@rpotsleft){
+ if($@rpotsleft > 0){
+ set @bought_quantity[@i], $@rpotsleft;
+ } else {
+ mes "We are out of red potions!";
+ close;
+ }
+ }
+ if(Zeny >= 40*@bought_quantity[@i]){
+ set Zeny, Zeny - 40*@bought_quantity[@i];
+ getitem 501, @bought_quantity[@i];
+ set $@rpotsleft, $@rpotsleft - @bought_quantity[@i];
+ } else {
+ mes "You have insufficient cash.";
+ close;
+ }
+ } else {
+ if(@bought_quantity[@i] > $@opotsleft){
+ if($@opotsleft > 0){
+ set @bought_quantity[@i], $@opotsleft;
+ } else {
+ mes "We are out of orange potions!";
+ close;
+ }
+ }
+ if(Zeny >= 200*@bought_quantity[@i]){
+ set Zeny, Zeny - 200*@bought_quantity[@i];
+ getitem 502, @bought_quantity[@i];
+ set $@opotsleft, $@opotsleft - @bought_quantity[@i];
+ } else {
+ mes "You have insufficient cash.";
+ close;
+ }
+ }
+}
+deletearray @bought_quantity, getarraysize(@bought_quantity);
+deletearray @bought_nameid, getarraysize(@bought_nameid);
+mes "Trade done.";
+close;
+
+OnInit:
+npcshopitem "dyn_shop1", 501,40,502,200;
+set $@rpotsleft, 10;
+set $@opotsleft, 10;
+end;
} \ No newline at end of file
diff --git a/npc/sample/npc_equip_sample.txt b/npc/sample/npc_equip_sample.txt
index 942ec47eb..ce429d924 100644
--- a/npc/sample/npc_equip_sample.txt
+++ b/npc/sample/npc_equip_sample.txt
@@ -1,17 +1,17 @@
-
-prontera.gat,161,181,6 script GetEquipID Sample 105,{
- mes "[GetEquipID Sample]";
- mes " GetEquipID(01) : " + getequipid(1);
- mes " GetEquipID(02) : " + getequipid(2);
- mes " GetEquipID(03) : " + getequipid(3);
- mes " GetEquipID(04) : " + getequipid(4);
- mes " GetEquipID(05) : " + getequipid(5);
- mes " GetEquipID(06) : " + getequipid(6);
- mes " GetEquipID(07) : " + getequipid(7);
- mes " GetEquipID(08) : " + getequipid(8);
- mes " GetEquipID(09) : " + getequipid(9);
- mes " GetEquipID(10) : " + getequipid(10);
- close;
- end;
-}
-
+
+prontera.gat,161,181,6 script GetEquipID Sample 105,{
+ mes "[GetEquipID Sample]";
+ mes " GetEquipID(01) : " + getequipid(1);
+ mes " GetEquipID(02) : " + getequipid(2);
+ mes " GetEquipID(03) : " + getequipid(3);
+ mes " GetEquipID(04) : " + getequipid(4);
+ mes " GetEquipID(05) : " + getequipid(5);
+ mes " GetEquipID(06) : " + getequipid(6);
+ mes " GetEquipID(07) : " + getequipid(7);
+ mes " GetEquipID(08) : " + getequipid(8);
+ mes " GetEquipID(09) : " + getequipid(9);
+ mes " GetEquipID(10) : " + getequipid(10);
+ close;
+ end;
+}
+
diff --git a/npc/sample/npc_extend_shop.txt b/npc/sample/npc_extend_shop.txt
index 015973ed2..41ea5c112 100644
--- a/npc/sample/npc_extend_shop.txt
+++ b/npc/sample/npc_extend_shop.txt
@@ -1,60 +1,60 @@
-//SuperNovice
-prontera.gat,182,213,3 shop Super Novice Shop 716,1243:-1,2112:-1,2340:-1,2352:-1,2414:-1,2510:-1,2628:-1,5055:-1
-
-//Whips
-prontera.gat,149,139,5 shop Whips Merchant 58,1951:-1,1953:-1,1955:-1,1957:-1,1959:-1,1961:-1,1962:-1,1963:-1,1964:-1
-
-//Headgears
-prontera.gat,162,175,3 shop Headgears Merchant 1 73,2209:-1,2210:-1,2211:-1,2221:-1,2223:-1,2217:-1,2227:-1,2231:-1,2225:-1,2229:-1
-
-//Headgears
-prontera.gat,162,172,3 shop Headgears Merchant 2 73,2203:-1,2212:-1,2218:-1,2239:-1,2241:-1,2242:-1,2243:-1,2263:-1,2265:-1,2276:-1,2288:-1,2291:-1,2297:-1
-
-//Armor
-prontera.gat,162,169,3 shop Armours Merchant 73,2311:-1,2313:-1,2315:-1,2317:-1,2318:-1,2320:-1,2322:-1,2324:-1,2326:-1,2327:-1,2329:-1,2331:-1,2334:-1,2336:-1,2337:-1,2342:-1
-
-//Shields
-prontera.gat,162,166,3 shop Shields Merchant 73,2102:-1,2104:-1,2106:-1,2108:-1,2109:-1,2110:-1,2111:-1
-
-//Boots
-prontera.gat,162,163,3 shop Boots Merchant 73,2402:-1,2404:-1,2406:-1,2407:-1,2412:-1,2413:-1
-
-//Robes
-prontera.gat,162,160,3 shop Robes Merchant 73,2502:-1,2504:-1,2506:-1,2507:-1,2508:-1,2509:-1
-
-//Accessory
-prontera.gat,162,157,3 shop Accessory Merchant 73,2601:-1,2602:-1,2603:-1,2604:-1,2605:-1,2607:-1,2608:-1,2615:-1,2616:-1,2618:-1,2619:-1
-
-//Arrows
-prontera.gat,162,154,3 shop Arrows Merchant 73,1750:-1,1751:-1,1752:-1,1753:-1,1754:-1,1755:-1,1756:-1,1757:-1,1758:-1,1759:-1,1760:-1,1761:-1,1762:-1,1763:-1,1764:-1,1765:-1,1766:-1,1767:-1,1768:-1,1769:-1
-
-//Alchemist
-prontera.gat,162,151,3 shop Alchemist Shop 73.7127:-1,7128:-1,7129:-1,7130:-1,7131:-1,7132:-1,7133:-1,7144:-1,7134:-1,1093:-1
-
-//Taming Merchant
-prontera.gat,162,148,3 shop Taming Merchant 73,619:-1,620:-1,621:-1,623:-1,624:-1,625:-1,626:-1,627:-1,628:-1,629:-1,630:-1,631:-1,632:-1,633:-1,634:-1,635:-1,636:-1,637:-1,638:-1,639:-1,640:-1,641:-1,642:-1,659:-1
-
-//Pet Equipment
-prontera.gat,162,145,3 shop Pet Equipment 73,10001:-1,10002:-1,10003:-1,10004:-1,10005:-1,10006:-1,10007:-1,10008:-1,10009:-1,10010:-1,10011:-1,10012:-1,10013:-1,10014:-1,10015:-1,10016:-1,10017:-1,10018:-1,10019:-1,10020:-1
-
-
-//Weapon Cards
-prontera.gat,148,234,5 shop Weapon Card's Merchant 80,4004:100000,4018:100000,4025:100000,4026:100000,4019:100000,4029:100000,4043:100000,4017:100000,4020:100000,4024:100000,4037:100000,4055:100000,4057:100000,4076:100000,4096:100000,4104:100000,4030:100000,4049:100000,4062:100000,4069:100000,4085:100000,4007:100000,4060:100000,4063:100000,4068:100000,4080:100000,4094:100000,4111:100000,4118:100000,4082:20700,4092:100000,4126:100000,4072:100000,4115:100000,4035:100000,4086:100000,4106:100000,4117:100000,4125:100000
-
-//Headgear Cards
-prontera.gat,148,231,5 shop Headgear Card's Merchant 80,4010:100000,4039:100000,4046:100000,4052:100000,4087:100000,4110:100000,4112:100000,4122:100000,4127:100000
-
-//Armor Cards
-prontera.gat,146,229,5 shop Armor Card's Merchant 80,4003:100000,4008:100000,4011:100000,4014:100000,4016:100000,4021:100000,4023:100000,4031:100000,4078:100000,4089:100000,4098:100000,4099:100000,4101:100000,4114:100000,4119:100000,4141:100000,4061:100000,4105:100000
-
-//Shield Cards
-prontera.gat,144,227,5 shop Shield Card's Merchant 80,4013:100000,4032:100000,4058:100000,4059:100000,4066:100000,4074:100000,4083:100000,4120:100000,4124:100000,4136:100000,4138:100000,4045:100000,4067:100000,4075:100000,4090:100000
-
-//Robe Cards
-prontera.gat,142,225,5 shop Robe Card's Merchant 80,4056:100000,4071:100000,4081:100000,4095:100000,4108:100000,4109:100000,4113:100000,4116:100000,4133:100000,4015:100000,4088:100000,4102:100000,4129:100000
-
-//Shoe Cards
-prontera.gat,140,223,5 shop Shoes Card's Merchant 80,4009:100000,4038:100000,4050:100000,4070:100000,4097:100000,4100:100000,4107:100000
-
-//Accessory Cards
+//SuperNovice
+prontera.gat,182,213,3 shop Super Novice Shop 716,1243:-1,2112:-1,2340:-1,2352:-1,2414:-1,2510:-1,2628:-1,5055:-1
+
+//Whips
+prontera.gat,149,139,5 shop Whips Merchant 58,1951:-1,1953:-1,1955:-1,1957:-1,1959:-1,1961:-1,1962:-1,1963:-1,1964:-1
+
+//Headgears
+prontera.gat,162,175,3 shop Headgears Merchant 1 73,2209:-1,2210:-1,2211:-1,2221:-1,2223:-1,2217:-1,2227:-1,2231:-1,2225:-1,2229:-1
+
+//Headgears
+prontera.gat,162,172,3 shop Headgears Merchant 2 73,2203:-1,2212:-1,2218:-1,2239:-1,2241:-1,2242:-1,2243:-1,2263:-1,2265:-1,2276:-1,2288:-1,2291:-1,2297:-1
+
+//Armor
+prontera.gat,162,169,3 shop Armours Merchant 73,2311:-1,2313:-1,2315:-1,2317:-1,2318:-1,2320:-1,2322:-1,2324:-1,2326:-1,2327:-1,2329:-1,2331:-1,2334:-1,2336:-1,2337:-1,2342:-1
+
+//Shields
+prontera.gat,162,166,3 shop Shields Merchant 73,2102:-1,2104:-1,2106:-1,2108:-1,2109:-1,2110:-1,2111:-1
+
+//Boots
+prontera.gat,162,163,3 shop Boots Merchant 73,2402:-1,2404:-1,2406:-1,2407:-1,2412:-1,2413:-1
+
+//Robes
+prontera.gat,162,160,3 shop Robes Merchant 73,2502:-1,2504:-1,2506:-1,2507:-1,2508:-1,2509:-1
+
+//Accessory
+prontera.gat,162,157,3 shop Accessory Merchant 73,2601:-1,2602:-1,2603:-1,2604:-1,2605:-1,2607:-1,2608:-1,2615:-1,2616:-1,2618:-1,2619:-1
+
+//Arrows
+prontera.gat,162,154,3 shop Arrows Merchant 73,1750:-1,1751:-1,1752:-1,1753:-1,1754:-1,1755:-1,1756:-1,1757:-1,1758:-1,1759:-1,1760:-1,1761:-1,1762:-1,1763:-1,1764:-1,1765:-1,1766:-1,1767:-1,1768:-1,1769:-1
+
+//Alchemist
+prontera.gat,162,151,3 shop Alchemist Shop 73.7127:-1,7128:-1,7129:-1,7130:-1,7131:-1,7132:-1,7133:-1,7144:-1,7134:-1,1093:-1
+
+//Taming Merchant
+prontera.gat,162,148,3 shop Taming Merchant 73,619:-1,620:-1,621:-1,623:-1,624:-1,625:-1,626:-1,627:-1,628:-1,629:-1,630:-1,631:-1,632:-1,633:-1,634:-1,635:-1,636:-1,637:-1,638:-1,639:-1,640:-1,641:-1,642:-1,659:-1
+
+//Pet Equipment
+prontera.gat,162,145,3 shop Pet Equipment 73,10001:-1,10002:-1,10003:-1,10004:-1,10005:-1,10006:-1,10007:-1,10008:-1,10009:-1,10010:-1,10011:-1,10012:-1,10013:-1,10014:-1,10015:-1,10016:-1,10017:-1,10018:-1,10019:-1,10020:-1
+
+
+//Weapon Cards
+prontera.gat,148,234,5 shop Weapon Card's Merchant 80,4004:100000,4018:100000,4025:100000,4026:100000,4019:100000,4029:100000,4043:100000,4017:100000,4020:100000,4024:100000,4037:100000,4055:100000,4057:100000,4076:100000,4096:100000,4104:100000,4030:100000,4049:100000,4062:100000,4069:100000,4085:100000,4007:100000,4060:100000,4063:100000,4068:100000,4080:100000,4094:100000,4111:100000,4118:100000,4082:20700,4092:100000,4126:100000,4072:100000,4115:100000,4035:100000,4086:100000,4106:100000,4117:100000,4125:100000
+
+//Headgear Cards
+prontera.gat,148,231,5 shop Headgear Card's Merchant 80,4010:100000,4039:100000,4046:100000,4052:100000,4087:100000,4110:100000,4112:100000,4122:100000,4127:100000
+
+//Armor Cards
+prontera.gat,146,229,5 shop Armor Card's Merchant 80,4003:100000,4008:100000,4011:100000,4014:100000,4016:100000,4021:100000,4023:100000,4031:100000,4078:100000,4089:100000,4098:100000,4099:100000,4101:100000,4114:100000,4119:100000,4141:100000,4061:100000,4105:100000
+
+//Shield Cards
+prontera.gat,144,227,5 shop Shield Card's Merchant 80,4013:100000,4032:100000,4058:100000,4059:100000,4066:100000,4074:100000,4083:100000,4120:100000,4124:100000,4136:100000,4138:100000,4045:100000,4067:100000,4075:100000,4090:100000
+
+//Robe Cards
+prontera.gat,142,225,5 shop Robe Card's Merchant 80,4056:100000,4071:100000,4081:100000,4095:100000,4108:100000,4109:100000,4113:100000,4116:100000,4133:100000,4015:100000,4088:100000,4102:100000,4129:100000
+
+//Shoe Cards
+prontera.gat,140,223,5 shop Shoes Card's Merchant 80,4009:100000,4038:100000,4050:100000,4070:100000,4097:100000,4100:100000,4107:100000
+
+//Accessory Cards
prontera.gat,138,221,5 shop Accessory Card's Merchant 80,4022:100500,4027:100500,4028:100500,4034:100500,4051:100500,4064:100500,4091:100500,4079:100500,4033:100500,4040:100500,4044:100500,4048:100500,4053:100500,4073:100500,4077:100500,4084:100500,4093:100500,4103:100500,4139:100500 \ No newline at end of file
diff --git a/npc/sample/npc_sample.txt b/npc/sample/npc_sample.txt
index f589ef370..390e5db28 100644
--- a/npc/sample/npc_sample.txt
+++ b/npc/sample/npc_sample.txt
@@ -1,457 +1,457 @@
-//
-// Athena Sample Script
-// (c) 2003 Athena Project.
-//
-// $Id: npc_sample.txt,v 1.1.1.1 2004/09/10 17:26:47 MagicalTux Exp $
-
-// ‚±‚̃tƒ@ƒCƒ‹‚ÍAAthena‚ÅŽg—p‚³‚ê‚éƒXƒNƒŠƒvƒg‚̉ðà‚ÆŽg—p—á‚̃Tƒ“ƒvƒ‹‚Æ
-// ‚È‚Á‚Ä‚¢‚Ü‚·B
-
-// =============
-// *Šî–{“I‚È‘Ž®
-// =============
-// <parameters_1>\t<command>\t<displayname>\t<parameters_2>
-// \t‚ÍTAB‚ð‚ ‚ç‚킵‚Ü‚·B
-// command ‚Í "warp" / "monster" / "shop" / "script" ‚Ì‚¢‚¸‚ê‚©‚É‚È‚è‚Ü‚·B
-// Šes‚É‚¨‚¢‚Ä"//"ˆÈ~‚̓Rƒƒ“ƒg‚Æ‚µ‚Ä–³Ž‹‚³‚ê‚Ü‚·B
-// ˆÈ‰ºAŒÂX‚ɂ‚¢‚ĉðà‚ð‚µ‚Ä‚¢‚«‚Ü‚·B
-//
-// ‘Ž®’†<n>‚Æ‚©‚©‚ê‚Ä‚¢‚é•”•ª‚Ín‚Æ‚¢‚¤•¶Žš‚Å‚Í‚È‚­A”CˆÓ‚Ì•¶Žš—ñ/’l‚ðŽ¦‚µ‚Ü‚·B
-// ‚Ü‚½A[n]‚Í•K—v‚ɉž‚¶‚ÄŽw’è‚·‚é”CˆÓ‚Ì•¶Žš—ñ/’l‚Æ‚È‚Á‚Ä‚¢‚Ü‚·B
-
-// ========
-// *command
-// ========
-//
-// ---------------
-// *’Êíwarp(warp)
-// ---------------
-// ‘Ž® : <gatname>,<x>,<y> warp <displayname(hidden)> <dx>,<dy>,<destination_gatname>[.gat],<destination_x>,<destination_y>
-//
-// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
-// <x>,<y> - ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì’†SÀ•W(x,y)
-// <displayname(hidden)> - npc–¼Bˆê•¶ŽšˆÈã‚Ì”CˆÓ‚Ì•¶Žš‚ÅŽw’肵‚Ü‚·Bƒ†ƒj[ƒN‚È–¼‘O‚Å‚ ‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB
-// ŽÀÛ‚É‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñB
-// <dx>,<dy> - “®ì”͈Í(x,y) <x,y>‚ð’†S‚É(dx+1,dy+1)‚͈̔͂ÉPC‚ª—ˆ‚é‚Æ”­“®‚µ‚Ü‚·
-// <destination_gatname>,<destination_x>,<destination_y> -
-// ˆÚ“®æ‚̃}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼,À•W(x,y)
-// destination_gatname‚ɂ‚¢‚Ä‚ÍŠg’£Žq".gat"‚Í‚ ‚Á‚Ä‚à–³‚­‚Ä‚à\‚¢‚Ü‚¹‚ñB
-// ˆÚ“®æ‚Ìmapƒf[ƒ^ƒtƒ@ƒCƒ‹‚ª‘¶Ý‚µ‚È‚¢(‚ ‚é‚¢‚Ímap_config‚ÅŽw’肳‚ê‚Ä‚¢‚È‚¢)ꇂ͔­“®‚µ‚Ü‚¹‚ñB
-// ˆÚ“®æ‚ÌÀ•W‚ªi“ü‹ÖŽ~‹æˆæ‚Å‚ ‚Á‚½ê‡‚ÍAƒ‰ƒ“ƒ_ƒ€‚ÈÀ•W‚Ƀ[ƒv‚µ‚Ü‚·B
-// ‚Ü‚½A“¯ˆêÀ•W‚É•¡”‚Ìwarp‚ª’u‚©‚ê‚Ä‚¢‚½ê‡Aæ‚É‹Lq‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ª—LŒø‚É‚È‚è‚Ü‚·
-// ‚±‚ê‚ÍAconfƒtƒ@ƒCƒ‹“à‚ÅŽw’肳‚ê‚éAnpc*.txtƒtƒ@ƒCƒ‹‚ð‚Ü‚½‚¢‚Åwarp‚ð‹Lq‚·‚é‚Æ‚«‚à“¯‚¶‚±‚Æ‚ª‚¢‚¦‚Ü‚·B
-// —á:
-prontera.gat,156,185,4 warp sample1 0,0,prontera.gat,156,225
-prontera.gat,156,185,4 warp sample1a 0,0,prontera.gat,156,230
-// sample1‚Ì•û‚ªæ‚É‹Lq‚³‚ê‚Ä‚¢‚é‚Ì‚ÅA156,225‚Ɉړ®‚µ‚Ü‚·
-prontera.gat,156,220,4 warp sample1-1 0,0,prontera.gat,156,180
-
-// --------------------
-// *ƒ‚ƒ“ƒXƒ^[(monster)
-// --------------------
-// ‘Ž®:<gatname>,<x>,<y>[,<xs>,<ys>] monster <displayname> <npcid>,<number>[,<spawn_delay1>,<spawn_delay2>]
-// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
-// <x>,<y> - ‰Šú”z’uÀ•W(x,y) 0,0‚Å‚ ‚ê‚΃‰ƒ“ƒ_ƒ€‚Ȉʒu‚É”z’u‚³‚ê‚Ü‚·B
-// [,<xs>,<ys>] - “Á’è”͈͓à‚É”z’u‚·‚鎞‚ÉŽw’肵‚Ü‚·B
-// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
-// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢(db/mob_db.txt‚ªŽQl‚É‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª...)
-// <number> - ”z’u”
-// [,<spawn_delay1>,<spawn_delay2>] - “¯ˆêpc_id‚ð‚à‚ƒ‚ƒ“ƒXƒ^[‚̶¬ŽžŠÔ‚ɂ‚¢‚Ä‚Ì’è‹`
-// ‘O‰ñoŒ»ŽžŠÔ+oŒ»’x‰„1,“|‚³‚ꂽŽžŠÔ+oŒ»’x‰„2,“|‚³‚ꂽŽžŠÔ+5•b ‚ÅŽZo‚³‚ê‚é’l‚Ì‚¤‚¿AÅ‚à‘å‚«‚¢•¨‚ð
-// oŒ»ŽžŠÔ‚Æ‚µ‚Ü‚·
-// —á:
-prontera.gat,0,0 monster ƒ|ƒŠƒ“ 1002,5
-
-// ---------
-// *“X(shop)
-// ---------
-// ‘Ž®:<gatname>,<x>,<y>,<direction> shop <displayname> <npcid>,<item_id1>:<price1>[,<item_id2>:<price2>[,.....<item_id_N>:<priceN>]]
-// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
-// <x>,<y> - NPC‚Ì”z’uÀ•W(x,y)
-// <direction> - npc‚ÌŒü‚¢‚Ä‚¢‚é•ûŒüB0‚ð–k(yÀ•W•ûŒü+)‚Æ‚µ‚ÄA”½ŽžŒv‰ñ‚è45“x‚«‚´‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·
-// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
-// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢
-// <item_id_N>:<price_N> - item_id_N‚̤•i‚ð‰¿Šiprice_N‚Æ‚µ‚Ĕ̔„•¨ƒEƒCƒ“ƒhƒE‚É•\Ž¦‚µ‚Ü‚·B
-// item_id‚ɂ‚¢‚Ä‚Ídb/item_db.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-// —á:
-prontera.gat,136,203,6 shop “¹‹ï¤l 73,501:5,502:20,503:55,504:120,506:20,645:80,656:150,601:30,602:30,611:20,610:400
-
-// -====================-
-// *NPCƒXƒNƒŠƒvƒg(script)
-// -====================-
-// ‘Ž®:
-// <gatname>,<x>,<y>,<direction> script <displayname> <npcid>[,<xs>,<ys>],{ <script> ... }
-// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
-// <x>,<y> - NPC‚Ì”z’uÀ•W(x,y)
-// <direction> - npc‚ÌŒü‚¢‚Ä‚¢‚é•ûŒüB0‚ð–k(yÀ•W•ûŒü+)‚Æ‚µ‚ÄA”½ŽžŒv‰ñ‚è45“x‚«‚´‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·
-// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
-// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢
-// [,<xs>,<ys>] - (x,y)‚ð’†S‚Æ‚µ‚Ä(xs,ys)ˆÈ“à‚ÉPC‚ª‹ßŠñ‚é‚ƃXƒNƒŠƒvƒg‚ª”­“®‚µ‚Ü‚·
-// (warp‚Æ“¯‚¶‚悤‚È”­“®‚Ì‚µ‚©‚½‚É‚È‚è‚Ü‚·)
-//
-// ‚±‚ÌŒã‚É‘±‚­{}“à‚ªƒXƒNƒŠƒvƒg‚Æ‚µ‚Ä”FŽ¯‚³‚ê‚Ü‚·‚ª
-// }(s––) ‚ŃXƒNƒŠƒvƒg‚ÌI—¹‚Æ”»’f‚µ‚Ä‚¢‚Ü‚·B
-// ‚»‚Ì‚½‚ßA}‚ÌŒã‚ɂ̓Rƒƒ“ƒg(//`)‚Í•t‚¯‚È‚¢‚Å‚­‚¾‚³‚¢B
-// (Œã“ú‚±‚ÌŽd—l‚Í•ÏX—\’è‚Å‚·)
-//
-// ------------------------
-// *{}“à‚̃XƒNƒŠƒvƒg‚ɂ‚¢‚Ä
-// ------------------------
-// ŒÂX‚Ì–½—ߌê‚┎š,•¶Žš—ñ,ƒ‰ƒxƒ‹,‰‰ŽZŽq“™‚ÌŠÔ‚Í
-// ƒXƒy[ƒX‚âƒ^ƒuA‰üsA/* */‚É‚æ‚èˆÍ‚܂ꂽƒRƒƒ“ƒgA//‚©‚ç‰üs‚܂ł̃Rƒƒ“ƒg‚ð
-// Ž©—R‚É“ü‚ê‚鎖‚ªo—ˆ‚Ü‚· (C•—–¡)
-// Še–½—ß‚ÍÅŒã‚É";"‚ð‚‚¯‚Ü‚· (C•—–¡)
-//
-// ---
-// *’l
-// ---
-// script“à‚ÅŽg—p‚³‚ê‚é’l‚Í ”Žš / •¶Žš—ñ / •Ï”–¼ / ƒ‰ƒxƒ‹ ‚Ì4Ží—Þ‚É•ª‚©‚ê‚Ü‚·B
-//
-// *”Žš [0-9]‚Ì—ñ‚Å•\‚킳‚ê‚é10i”‚©A0x‚ÅŽn‚Ü‚é16i”
-// ”’l‚Æ‚µ‚Ĉµ‚¦‚é‚Ì‚Í•„†•t32bit®”‚Ì‚Ý‚ÅA¬”‚͈µ‚¦‚Ü‚¹‚ñ
-// *•¶Žš—ñ ""‚ň͂܂ꂽˆê’Ê‚è‚Ì•¶Žš—ñ‚ªŽg‚¦‚Ü‚·B
-// •¶Žš—ñ’†‚É"‚ð“ü‚ꂽ‚¢ê‡‚Í\"A\‚ð“ü‚ꂽ‚¢ê‡‚Í\\‚Æ‚µ‚Ü‚·
-// *•Ï”–¼/ƒ‰ƒxƒ‹–¼ [A-Za-z0-9_]‚Æ@(ˆê•¶Žš–Ú‚Ì‚Ý)‚ªŽg‚¦‚Ü‚·B
-// “ÁŽê‚ȃ‰ƒxƒ‹‚Æ‚µ‚Ä-‚ª‘¶Ý‚µ‚Ü‚·B‚±‚ê‚ÍŽŸ‚Ì–½—ß‚ðˆÓ–¡‚µ‚Ü‚·
-// ˆÈ‰º‚Åà–¾‚·‚é’蔂▄‚ßž‚Ý•Ï”‚à‚±‚ê‚É‚ ‚½‚è‚Ü‚·
-//
-// -----------------------
-// *’蔂܂½‚Í–„‚ßž‚Ý•Ï”
-// -----------------------
-// db/const.txt‚É<’è”–¼> <”’l>‚Æ‹Lq‚·‚鎖‚Å
-// ƒXƒNƒŠƒvƒg“à‚Å—˜—p‰Â”\‚Ȓ蔂ð錾o—ˆ‚Ü‚·B
-// (NPC“X‚̤•iƒŠƒXƒg,Œ©‚½–Ú‚ÌÝ’è•”•ª“™‚É‚Í—˜—po—ˆ‚Ü‚¹‚ñ)
-//
-// ‚Ü‚½A‚±‚Ì’†‚ŃLƒƒƒ‰ƒNƒ^[‚̃Xƒe[ƒ^ƒX‚ðŽQÆ‚·‚é
-// –„‚ßž‚Ý•Ï”‚Ì’è‹`‚à‚µ‚Ä‚¢‚Ü‚·BŒ»Ý—LŒø‚È•¨‚͈ȉº‚Ì7‚‚ł·
-//
-// BaseLevel : ƒx[ƒXƒŒƒxƒ‹
-// JobLevel : ƒWƒ‡ƒuƒŒƒxƒ‹
-// StatusPoint : U‚蕪‚¯‰Â”\‚ȃXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg”
-// SkillPoint : U‚蕪‚¯‰Â”\‚ȃXƒLƒ‹ƒ|ƒCƒ“ƒg”
-// Class : ƒLƒƒƒ‰ƒNƒ^[‚ÌE‹Æ‚ÌŽí—Þ
-// Class’l‚ɂ‚¢‚Ä‚ÍJob_Novice“™db/const.txt‚Å’è”’è‹`‚³‚ê‚Ä‚Ü‚·‚Ì‚Å‚±‚¿‚ç‚ðŽg‚¤‚Æ—Ç‚¢‚Å‚µ‚傤
-// Zeny : ‚¨‹à
-// Sex : «•Ê[0=‰, 1=Š]
-//
-// ‚±‚ê‚ç‚Ì•Ï”‚ÍAif–½—ß‚âset–½—ß‚ÅŽ©—R‚ÉŽQÆ‚ªo—ˆ‚Ü‚·‚ªA
-// •ÏX‚ÍStatusPoint‚ÆSkillPoint‚ÆZeny‚Ì‚Ý‚Å‘¼‚Ì–„‚ßž‚Ý•Ï”‚Í•ÏX‚µ‚Ä‚àˆÓ–¡‚ðŽ‚¿‚Ü‚¹‚ñB
-// ‚Ü‚½A‚±‚Ì‚R‚‚̖„‚ßž‚Ý•Ï”‚ð•ÏX‚µ‚½ê‡A•ÏX‚̓Nƒ‰ƒCƒAƒ“ƒg‚É‘¦À‚É”½‰f‚³‚ê‚Ü‚·B
-//
-// -------
-// *ƒ‰ƒxƒ‹
-// -------
-// ƒ‰ƒxƒ‹‚ÍAƒ‰ƒxƒ‹–¼‚ÌŒã‚É:‚ð•t‚¯
-// label:
-// ‚̂悤‚É‹Lq‚µ‚Ü‚·B
-// goto•¶‚âmenu•¶Aif•¶“™‚Ì”ò‚Ñæ‚Æ‚µ‚ÄŽg‚í‚ê‚Ü‚·B
-//
-// ---
-// *Ž®
-// ---
-// –½—߂̈ø”‚Æ‚µ‚Ä”’l‚ª—v‹‚³‚ê‚Ä‚¢‚銂ÍA‘S‚Ä‚ÌŠ‚ÅŽ®‚ª—˜—p‰Â”\‚Å‚·B
-// ®”‰‰ŽZ‚Ì‚Ý‚Å‚·‚ªAC‚ÌŽ®‚̃TƒuƒZƒbƒg‚É‚È‚Á‚Ä‚¢‚Ü‚·
-// —˜—p‰Â”\‚ȉ‰ŽZŽq‚Í()A’P€‰‰ŽZŽq - ! ~A2€‰‰ŽZŽq + - * / % & | ^ && || == != > >= < <= ‚Å‚·
-//
-// •¶Žš—ñ‚Ìê‡‚Í + ‚ŘAŒ‹‚ª‰Â”\‚Å‚·B
-// •¶Žš—ñ + ”’l ‚â ”’l + •¶Žš—ñ ‚Æ‚µ‚½ê‡‚Í”’l‚𕶎š—ñ‚Ö‚Æ•ÏŠ·‚µ˜AŒ‹‚µ‚Ü‚·B
-//
-// -----------------
-// *{}“à‚ÅŽg‚¦‚é–½—ß
-// -----------------
-//
-// mes "<message>";
-// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚Émessage‚ð•\Ž¦‚µ‚Ü‚·
-// •¶Žš‚ÌF‚Í^000000“™^‚É‘±‚¯‚Ä16i”6Œ…‚ÅŽw’肵‚Ü‚·(‰ŠúF‚Í•(^000000)‚Å‚·)
-//
-// next;
-// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚É"next"‚̃{ƒ^ƒ“‚ð•\Ž¦‚µ‚Ü‚·
-//
-// close;
-// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚É"close"‚̃{ƒ^ƒ“‚ð•\Ž¦‚µAƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·
-//
-// menu "<choice1>",<Label1>[,"<choice2>",<Label2>....];
-// ‘I‘ðŽˆƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚µ‚Ü‚·B"choice1","choice2"“™‚©‘I‘ðŽˆ‚É•\Ž¦‚³‚ê
-// ƒƒjƒ…[‚Å‘I‚ñ‚¾ê‡‚ÍA‚»‚ÌŒã‚É‹Lq‚³‚ê‚郉ƒxƒ‹‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
-// ‚Ü‚½A‘I‘ð‚µ‚½€–ڂ̓[ƒJƒ‹•Ï”l15‚É‚ÄŽQÆ‚Å‚«‚Ü‚·B
-// ã‚Ì—á‚Å‚·‚Æ‘I‘ðŽˆ‚É"choice1"‚ªŒ»‚êA‚±‚ê‚ð‘I‚Ô‚ÆLabel1:‚ÅŽn‚Ü‚és‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
-// ‚»‚µ‚ÄA•Ï”l15‚É‚Í1‚Æ‚¢‚¤’l‚ªƒZƒbƒg‚³‚ê‚Ü‚·
-// cancel‚ð‘I‚ñ‚¾ê‡AƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·
-//
-// goto <Label>;
-// Label:‚ÅŽn‚Ü‚és‚©‚瑱‚«‚ðŽÀs‚µ‚Ü‚·
-//
-// cutin "<filename>[.bmp]",<pos>;
-// ‰æ–Êã‚Éfilename‚ÅŽw’è‚·‚é‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
-// filename - •\Ž¦‚·‚ébmpƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í–³‚­‚Ä‚à\‚¢‚Ü‚¹‚ñ
-// pos - •\Ž¦ˆÊ’u 0-¶‰º 1-’†‰›‰º 2-‰E‰º 3-? 4-? 255-”ñ•\Ž¦
-// Œ»Ý‚̃Nƒ‰ƒCƒAƒ“ƒg‚Å‚ÍAcutin‚ðŽÀs‚·‚é‚Æ‚«‚ɈȑOcutin‚ªŽÀs‚³‚ê‚Ä‚¨‚è‰æ‘œ‚ª•\Ž¦‚³‚ê‚Ä‚¢‚éꇂÍA
-// æ‚É•\Ž¦‚µ‚Ä‚ ‚é‰æ‘œ‚ðÁ‹Ž‚µ‚Ä‚©‚çŒã‚ÅŽw’肳‚ê‚é‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
-//
-// jobchange <Jobid>;
-// PC‚ÌE‚ðJobname‚ÅŽw’肵‚½E‚É•ÏX‚µ‚Ü‚·BŽw’è‚Å‚«‚éJobid‚ɂ‚¢‚Ä‚Ídb/const.txt‚ÌJob_‚Å‚Í‚¶‚Ü‚és‚ð
-// ŽQÆ‚µ‚Ä‚­‚¾‚³‚¢Bconst‚ÅŽw’肵‚Ä‚¢‚é–„‚ß‚±‚Ý•Ï”–¼‚àŽg—p‚Å‚«‚Ü‚·B
-// jobchange‚ðs‚¤‚ÆAJobLv‚Í1‚ÉAƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚Í‚»‚ÌE‚É
-// ‡‚킹‚½•¨‚ɕω»‚µ‚Ü‚·BAthena-d2.1‚ł̓XƒLƒ‹‚ÍŽg‚¦‚È‚¢‚Ì‚ÅAŒ©‚½–Ú•ÏX‚¾‚¯‚ÆŽv‚Á‚Ä‚­‚¾‚³‚¢B
-// [’ˆÓ]
-// 1.’ljÁ2ŽŸE(ƒNƒ‹ƒZƒCƒ_[“™)‚Éjobchange‚ð‚·‚éê‡A•žFƒpƒŒƒbƒg‚ð•ÏX‚µ‚Ä‚¢‚éꇂ̓Šƒ\[ƒXƒGƒ‰[‚ª
-// ‹N‚«‚Ü‚·‚Ì‚ÅAŽÀs‚µ‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
-// 2.ƒo[ƒh‚ƃ_ƒ“ƒT[‚ÌJobname‚Í•Ê‚É‚È‚Á‚Ä‚¢‚Ü‚·B
-// ‚±‚Ì‚½‚ßA’j«PC‚ɑ΂µ‚ÄJob_Dancer‚ðŽÀs‚µ‚½‚èA—«PC‚ɑ΂µ‚Äjob_Bird‚ðŽÀs‚µ‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
-// ƒNƒ‰ƒCƒAƒ“ƒg‚É‚æ‚Á‚Ă̓Šƒ\[ƒXƒGƒ‰[‚Å—Ž‚¿‚Ü‚·B
-// map‘¤‚Å‚Í®‡ƒ`ƒFƒbƒN‚ðs‚Á‚Ä‚¢‚È‚¢‚½‚ßAƒXƒNƒŠƒvƒg‘¤‚Ń`ƒFƒbƒN‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
-// npc_testJ.txt‚Ì—á‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-// 3.db/const.txt‚É‚Íknight2/crusader2‚Ì‹Lq‚ª‚ ‚è‚Ü‚·‚ªA‚±‚Ìjob‚Ö‚Ìjobchange‚Ís‚í‚È‚¢‚Ù‚¤‚ª–³“ï‚Å‚·B
-// ŽÀۂ̃Q[ƒ€‚Å‚à‚±‚Ìjob‚ÍŽg—p‚³‚ê‚Ä‚¢‚È‚¢‚悤‚Å‚·B
-//
-// input [<variable>];
-// ”Žš“ü—̓EƒCƒ“ƒhƒE‚ðŠJ‚«‚Ü‚·B
-// “ü—Í‚³‚ꂽ”Žš‚Ívariable‚ª‚ ‚Á‚½ê‡‚»‚Ì•Ï”‚ÉA
-// –³‚©‚Á‚½ê‡‚̓[ƒJƒ‹•Ï”l14‚ɃZƒbƒg‚³‚ê‚Ü‚·B
-//
-// warp "<destination_gatname>",<destination_x>,<destination_y>;
-// Žw’肵‚½ƒ}ƒbƒv‚Ìx,yÀ•W‚Ƀ[ƒv‚µ‚Ü‚·BÚׂÍã‹Lwarp(NPC)‚Ì€‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
-//
-// setlook <n1>,<n2>;
-// PC‚ÌŠOŒ©‚ðݒ肵‚Ü‚·B
-// <n1> - (1 .. 8)
-// 1-”¯Œ^
-// 2-•Ší
-// 3-“ª‰º
-// 4-“ªã
-// 5-һՠ
-// 6-”¯F
-// 7-•žF
-// 8-‚
-// <n2> - ”CˆÓ
-// ŠOŒ©Ý’è‚ÍŠY“–ƒAƒCƒeƒ€‚ð‘•”õ‚µ‚Ä‚¢‚È‚­‚Ä‚à•t‰Á‚³‚ê‚Ü‚·B
-// ‘z’èŠO‚̔Ԇ‚ðÝ’è‚·‚é‚ÆAƒNƒ‰ƒCƒAƒ“ƒg‚ªƒŠƒ\[ƒXƒGƒ‰[‚Å—Ž‚¿‚Ü‚·B
-// ƒAƒTƒVƒ“’j,’ljÁ2ŽŸE‚ÉŠÖ‚µ‚Ä‚Í•žF‚Ì•ÏX‚Ís‚í‚È‚¢‚Å‚­‚¾‚³‚¢(‚â‚͂胊ƒ\[ƒXƒGƒ‰[—Ž‚¿‚µ‚Ü‚·)
-// •Ší‚⓪‘•”õ,‚‚ÌÝ’è‚̓Xƒe[ƒ^ƒXÄŒvŽZŽž‚Éã‘‚«‚³‚ê‚Ä‚µ‚Ü‚¤‚½‚ßA
-// ŽÀŒ±“I‚È—p“r‚É‚Ì‚Ý—˜—p‰Â”\‚Å‚·B
-//
-// set <variable>,<n>;
-// •Ï”<variable>‚Ì’l‚ð<n>‚ɃZƒbƒg‚µ‚Ü‚·B
-// Œ»Ý<n>‚Í”’l‚Ì‚Ý‚Å•¶Žš—ñ‚ªˆµ‚¦‚Ü‚¹‚ñ‚ªAŒã“ú‘Ήž—\’è‚Å‚·B
-//
-// if (<cond>) goto <Label>;
-// ðŒ•ªŠò‚Å‚·B<cond>‚ÌŒvŽZŒ‹‰Ê‚ª0ˆÈŠO‚Ìê‡ALabel‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
-//
-// getitem <item_id>,<num>;
-// PC‚ÌŠŽ•iƒŠƒXƒg‚Éitem_id‚ÅŽw’肳‚ê‚éƒAƒCƒeƒ€‚ðnum‚¾‚¯’ljÁ‚µ‚Ü‚·B
-//
-// delitem <item_id>,<num>;
-// PC‚ÌŠŽ•iƒŠƒXƒg‚©‚çitem_id‚ÅŽw’肳‚ê‚éƒAƒCƒeƒ€‚ðnum‚¾‚¯íœ‚µ‚Ü‚·B
-//
-// viewpoint <type>,<x>,<y>,<id>,<color>;
-// ƒ~ƒjƒ}ƒbƒv‚Ìx,y‚ÌÀ•W‚Ƀ}[ƒN(colorF‚ðŽw’è)‚ð•t‚¯‚Ü‚·B
-// <type> 1-•\Ž¦
-// 2-íœ
-//
-// heal <hp>,<sp>;
-// PC‚ÌHP/SP‚ðhp,sp‚ÅŽw’肵‚½’l‚¾‚¯‰ñ•œ‚³‚¹‚Ü‚·B
-//
-// end;
-// ‚±‚±‚ŃXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·B
-//
-// setoption <str>;
-// PC‚Ɉȉº‚ÅŽ¦‚·•t‘®•i(?)‚ð•t‚¯‚Ü‚·B
-// 0x0000 - •t‘®•iíœ
-// 0x0001 - ?
-// 0x0002 - ƒnƒCƒh(‰e•t‚«)
-// 0x0004 - ??
-// 0x0008 - ƒJ[ƒg
-// 0x0010 - ‘é
-// 0x0020 - ƒyƒRƒyƒR(ƒiƒCƒg,ƒNƒ‹ƒZƒCƒ_[‚ÌŽž‚Ì‚Ý—LŒø)
-// 0x0040 - ƒnƒCƒh(‰e–³‚µ)
-// 0x0080 - ƒJ[ƒg2
-// 0x0100 - ƒJ[ƒg3
-// 0x0200 - ƒJ[ƒg4
-// 0x0400 - ƒJ[ƒg5
-// 0x0800 - “ª‚ªƒI[ƒN(Sage‚̃XƒLƒ‹AƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…‚ª‚©‚©‚Á‚½ó‘Ô‚É‚È‚é)
-// setoption‚ðŽÀs‚·‚é‚Æ‚«AŒ³XƒZƒbƒg‚³‚ê‚Ä‚¢‚½’l‚̓NƒŠƒA‚³‚ê‚Ü‚·B
-// ‚»‚ꂼ‚ê‚Ì’l‚͉ÁŽZ‚µ‚½’l‚ðÝ’è‚·‚邱‚Æ‚É‚æ‚èA“¯Žž‚É•t‘®•i‚ª•t‚¯‚ç‚ê‚Ü‚·B
-// —Ⴆ‚ÎA0x38‚ŃJ[ƒg‚ðˆø‚¢‚ÄA‘é‚ð˜A‚ꂽƒyƒRæ‚èƒiƒCƒg‚Æ‚¢‚Á‚½‚à‚Ì‚à‚Å‚«‚Ü‚·B
-// setoption‚ŃZƒbƒg‚³‚ꂽ’l‚̓Nƒ‰ƒCƒAƒ“ƒgI—¹Œã‚à‹L‰¯‚³‚ê‚Ü‚·B
-// [memo]Žb’è“I‚È‚Ì‚ÅŽd—l•ÏX‚̉”\«‚ª‚ ‚è‚Ü‚·B
-//
-// savepoint "<gatname>",<x>,<y>;
-// ƒZ[ƒuƒ|ƒCƒ“ƒg‚ðgatname,x,y‚Éݒ肵‚Ü‚·
-//
-// -----
-// *ŠÖ”
-// -----
-// ðŒ–½—߂Ȃǂňȉº‚ÌŠÖ”‚ªŽg—p‚Å‚«‚Ü‚·B
-//
-// rand(<n>[,n2])
-// n‚Ì‚Ý‚Ìê‡A0‚©‚ç(n-1)‚Ü‚Å‚Ì”‚ðƒ‰ƒ“ƒ_ƒ€‚É•Ô‚µ‚Ü‚·B
-// n2‚ª—^‚¦‚ç‚ê‚Ä‚¢‚½ê‡‚Í n ‚©‚ç n2 ‚Ü‚Å‚Ì”‚ðƒ‰ƒ“ƒ_ƒ€‚É•Ô‚µ‚Ü‚·
-//
-// countitem(<item_id>)
-// ƒvƒŒƒCƒ„[‚ÌŠŽ‚·‚éAitem_id‚ÅŽw’è‚·‚éƒAƒCƒeƒ€‚Ì”‚ð•Ô‚µ‚Ü‚·
-//
-// [memo]
-// ƒ‰ƒ“ƒ_ƒ€ƒ[ƒv‚ðŽÀ‘•‚µ‚½‚¢ê‡A”͈͎Às‚Èscript‚ð—˜—p‚µ‚Ü‚·(npc_warp.txt‚ðŽQÆ)
-//
-
-// script‚Ì—á:
-prontera.gat,146,203,2 script ƒfƒoƒbƒK[—vˆõ 116,{
- cutin "kafra_02",2;
- if(countitem(515)<10) goto Llesscarrot;
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "‚ ‚ç‚ ‚çA‚É‚ñ‚¶‚ñ‚ð‘òŽRŽ‚Á‚Ä‚Ü‚·‚ËB";
- mes "‚Æ‚¢‚¤Ž–‚ÅA‚¤‚³‚¤‚³D‚«‚ÆŸŽè‚ɂ킽‚µ‚ª”F’肵‚Ü‚µ‚½B";
- mes "‚É‚ñ‚¶‚ñ10–{‚ÆŒðŠ·‚Å‚¤‚³‚݂݃wƒAƒoƒ“ƒh‚ð‚³‚µ‚ ‚°‚Ü‚·‚ËB";
- next;
- if(countitem(515)<10) goto Llesscarrot_err;
- delitem 515,10;
- getitem 2214,1;
- goto Llesscarrot;
-Llesscarrot_err:
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "‚ ‚çH‚É‚ñ‚¶‚ñ‚ª‘«‚è‚È‚­‚È‚Á‚Ä‚Ü‚·‚ËB";
- mes "‚Æ‚¢‚¤Ž–‚Å¡‰ñ‚ÌŽ–‚Í–³‚©‚Á‚½Ž–‚É‚µ‚Ü‚·B";
- next;
-// ’Êí‚Í‚±‚±‚©‚ç
-Llesscarrot:
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
- mes "‰½‚ð‚µ‚Ü‚·‚©?";
- next;
- menu "ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ð200‘‚â‚·",Lstp,"ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ð20‘‚â‚·",Lskill,
- "‚¨‹à‚ª—~‚µ‚¢‚Å‚·",Lzeny,"ˆÄ“à‚̃eƒXƒg",Lviewpoint,"“]E‚·‚é",Ljobchange,"ƒJ[ƒg‚ð‚‚¯‚é",Lcart,"‚â‚ß‚é",Lend;
-Lstp: set StatusPoint,StatusPoint+200;
- goto Lend;
-Lskill: set SkillPoint,SkillPoint+20;
- goto Lend;
-Lzeny: set Zeny,Zeny+1000;
- goto Lend;
-Lviewpoint:
- viewpoint 1,156,360,1,0x0000ff;
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "ƒvƒƒ“ƒeƒ‰é";
- next;
- viewpoint 2,156,360,1,0x0000ff;
- viewpoint 1,156,22,2,0x00ff00;
- viewpoint 1,22,203,3,0x00ff00;
- viewpoint 1,289,203,4,0x00ff00;
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "‚±‚Ì3‰ÓŠ‚©‚çŠO‚Éo‚ç‚ê‚Ü‚·B";
- next;
- viewpoint 2,156,22,2,0x00ff00;
- viewpoint 2,22,203,3,0x00ff00;
- viewpoint 2,289,203,4,0x00ff00;
- goto Lend;
-Ljobchange:
- cutin "kafra_02",255;
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "Œ©‚½–Ú‚Ì‚Ý‚Å‚·‚ª";
- mes "“]E‰Â”\‚Å‚·B";
- mes "“]E‚µ‚Ä‚àAƒXƒLƒ‹“™‚Í";
- mes "–¢ŽÀ‘•‚Ì‚½‚ߎg‚¦‚Ü‚¹‚ñB";
- mes "‚Ç‚ÌE‹Æ‚É“]E‚³‚¹‚Ü‚·‚©?";
- next;
- menu "‰SŽÒ",Lnv,
- "Œ•Žm",Lsm,
- "ƒ}ƒWƒVƒƒƒ“",Lmg,
- "ƒA[ƒ`ƒƒ[",Lac,
- "ƒAƒRƒ‰ƒCƒg",Lal,
- "¤l",Lmc,
- "ƒV[ƒt",Ltf,
- "ƒiƒCƒg",Lkn,
- "ƒvƒŠ[ƒXƒg",Lpr,
- "ƒEƒBƒU[ƒh",Lwz,
- "’b–艮",Lbs,
- "ƒnƒ“ƒ^[",Lht,
- "ƒAƒTƒVƒ“",Las,
- "‚¨‚Ü‚©‚¹",Lrandom,
- "‚â‚ß‚é",Ljchcancel;
-Lnv: jobchange Job_Novice; goto Lend;
-Lsm: jobchange Job_Swordman; goto Lend;
-Lmg: jobchange Job_Mage; goto Lend;
-Lac: jobchange Job_Archer; goto Lend;
-Lal: jobchange Job_Acolyte; goto Lend;
-Lmc: jobchange Job_Merchant; goto Lend;
-Ltf: jobchange Job_Thief; goto Lend;
-Lkn: jobchange Job_Knight; goto Lend;
-Lpr: jobchange Job_Priest; goto Lend;
-Lwz: jobchange Job_Wizard; goto Lend;
-Lbs: jobchange Job_Blacksmith; goto Lend;
-Lht: jobchange Job_Hunter; goto Lend;
-Las: jobchange Job_Assassin; goto Lend;
-Lrandom:
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "‚Å‚Íc";
- set l0,rand(13);
- jobchange l0;
- mes "‚±‚ÌE‹Æ‚ÅŠæ’£‚Á‚Ä‚­‚¾‚³‚¢‚ËB";
- goto Lend;
-Ljchcancel: mes "‚ ‚çA‚â‚ß‚é‚Ì‚Å‚·‚©c";
- mes "“]E‚³‚ê‚é‚Æ‚«‚Í";
- mes "‹CŒy‚ɺ‚ð‚©‚¯‚Ä‚­‚¾‚³‚¢‚Ë"; close;
- goto Lend;
-Lcart:
- mes "[ƒfƒoƒbƒK[—vˆõ]";
- mes "ƒJ[ƒg‚Å‚·‚ËB";
- mes "•t‚¯‚Ü‚·‚©H‚»‚ê‚Æ‚àŠO‚µ‚Ü‚·‚©H";
- menu "‚‚¯‚é",LattachC,"ŠO‚·",LremoveC;
-LattachC:
- mes "‚Í‚¢A‚Ç‚¤‚¼B";
- setoption 0x08;
- goto Lend;
-LremoveC:
- mes "‚Å‚ÍAŠO‚µ‚Ü‚·‚ËB";
- setoption 0x00;
- goto Lend;
-Lend: cutin "kafra_02",255;
- close;
- end; }
-
-prontera.gat,156,195,4 script ƒJƒvƒ‰Eˆõ 112,{
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹";
- mes "‚±‚¿‚ç‚Å‚ÍAŒ»Ý‚ÌAthena‚Ì󋵂ðà–¾‚¢‚½‚µ‚Ü‚·B";
- next;
- menu "•·‚­",Lcont,"•·‚©‚È‚¢",Lend;
-Lcont: mes "[ƒJƒvƒ‰Eˆõ]";
- mes "Athena‚Å‚ÍROƒGƒ~ƒ…ŽIŠJ”­ƒXƒŒ35‚³‚ñ‚̃vƒƒOƒ‰ƒ€‚ðƒx[ƒX‚Æ‚µ‚ÄŠJ”­‚ª‚Í‚¶‚Ü‚è‚Ü‚µ‚½"
- mes "“r’†Aƒ\[ƒX‚Ì•ªŠ„‰»‚ª}‚ç‚êAŒ»Ý‚Ìó‘Ô‚É‚È‚Á‚Ä‚¢‚Ü‚·B";
- next;
- mes "Œ»ÝŽÀ‘•‚³‚ê‚Ä‚¢‚é‚à‚̂͂‚¬‚Ì’Ê‚è‚Å‚·";
- mes "Eƒ}ƒbƒvŠÔˆÚ“®ƒ|ƒCƒ“ƒg";
- mes "E¤lNPC";
- mes "E‰ï˜bNPC@(ðŒ•ªŠò,ƒ‰ƒxƒ‹ƒWƒƒƒ“ƒvAƒ‰ƒ“ƒ_ƒ€•Ï”AƒAƒCƒeƒ€Žó‚¯“n‚µA•Ï”ŽQÆAcutin“™";
- mes "E•Ï”•Û‘¶";
- mes "E°ƒAƒCƒeƒ€";
- mes "Eƒ`ƒƒƒbƒg";
- mes "E퓬(‰£‚è)";
- mes "EEpisode 4ˆÈ~ƒ^ƒCƒv‚̃pƒPƒbƒgŽd—l";
- mes "EŒoŒ±’l,lvã¸";
- mes "EƒAƒCƒeƒ€‚Ì—˜—p‚̈ꕔ";
- next;
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "‹t‚ÉŒ»óŽÀ‘•‚³‚ê‚Ä‚¢‚È‚¢‚à‚Ì‚Í‘å‘̈ȉº‚Ì’Ê‚è‚Å‚·B";
- mes "EƒXƒLƒ‹";
- mes "E‘•”õ‚É‚æ‚éƒpƒ‰ƒ[ƒ^•Ï‰»";
- mes "Eƒp[ƒeƒB/ƒMƒ‹ƒh";
- mes "Eƒyƒbƒg";
- mes "E¸˜B/•Šíì¬";
- next;
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "‚»‚ê‚Æ’ˆÓ“_‚Å‚·‚ªAAthena‚Å‚ÍID‚ÌÅŒã‚É_F‚Ü‚½‚Í_M‚ð•t‚¯‚é‚ÆV‹KID‚ª”­s‚³‚ê‚éŽd‘g‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA";
-Lcont2: mes "2‰ñ–ÚˆÈ~‚Í_F,_M‚ð•t‚¯‚Ä‚¢‚é‚ƃpƒXƒ[ƒhƒGƒ‰[ˆµ‚¢‚É‚È‚è‚Ü‚·B";
- next;
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "—Ⴆ‚ÎA‰‰ñ‚ÉID:^ff0000hoge^0000ff_F^000000@pass:0123‚Ælogin‚µ‚½ê‡Ahoge‚ªID‚Æ‚µ‚Ä“o˜^‚³‚ê‚Ü‚·B";
- mes "‚æ‚Á‚ÄA2‰ñ–ÚˆÈ~‚ÍID:^ff0000hoge^000000@pass:0123‚Æ‚µ‚Älogin‚µ‚ĉº‚³‚¢B";
- next;
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "keep‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ä‚¢‚éê‡AŽáŠ±•s•Ö‚ÈŽd—l‚Å‚·‚ªAˆÈã‚Ì“_‚ð‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B";
- close;
-Lend: mes "[ƒJƒvƒ‰Eˆõ]";
- mes "‚Å‚Í’ˆÓ“_‚Ì‚ÝAà–¾‚³‚¹‚Ä’¸‚«‚Ü‚·B";
- next;
- mes "[ƒJƒvƒ‰Eˆõ]";
- mes "Athena‚Å‚ÍID‚ÌÅŒã‚É_F‚Ü‚½‚Í_M‚ð•t‚¯‚é‚ÆV‹KID‚ª”­s‚³‚ê‚éŽd‘g‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA";
- goto Lcont2; }
-
+//
+// Athena Sample Script
+// (c) 2003 Athena Project.
+//
+// $Id: npc_sample.txt,v 1.1.1.1 2004/09/10 17:26:47 MagicalTux Exp $
+
+// ‚±‚̃tƒ@ƒCƒ‹‚ÍAAthena‚ÅŽg—p‚³‚ê‚éƒXƒNƒŠƒvƒg‚̉ðà‚ÆŽg—p—á‚̃Tƒ“ƒvƒ‹‚Æ
+// ‚È‚Á‚Ä‚¢‚Ü‚·B
+
+// =============
+// *Šî–{“I‚È‘Ž®
+// =============
+// <parameters_1>\t<command>\t<displayname>\t<parameters_2>
+// \t‚ÍTAB‚ð‚ ‚ç‚킵‚Ü‚·B
+// command ‚Í "warp" / "monster" / "shop" / "script" ‚Ì‚¢‚¸‚ê‚©‚É‚È‚è‚Ü‚·B
+// Šes‚É‚¨‚¢‚Ä"//"ˆÈ~‚̓Rƒƒ“ƒg‚Æ‚µ‚Ä–³Ž‹‚³‚ê‚Ü‚·B
+// ˆÈ‰ºAŒÂX‚ɂ‚¢‚ĉðà‚ð‚µ‚Ä‚¢‚«‚Ü‚·B
+//
+// ‘Ž®’†<n>‚Æ‚©‚©‚ê‚Ä‚¢‚é•”•ª‚Ín‚Æ‚¢‚¤•¶Žš‚Å‚Í‚È‚­A”CˆÓ‚Ì•¶Žš—ñ/’l‚ðŽ¦‚µ‚Ü‚·B
+// ‚Ü‚½A[n]‚Í•K—v‚ɉž‚¶‚ÄŽw’è‚·‚é”CˆÓ‚Ì•¶Žš—ñ/’l‚Æ‚È‚Á‚Ä‚¢‚Ü‚·B
+
+// ========
+// *command
+// ========
+//
+// ---------------
+// *’Êíwarp(warp)
+// ---------------
+// ‘Ž® : <gatname>,<x>,<y> warp <displayname(hidden)> <dx>,<dy>,<destination_gatname>[.gat],<destination_x>,<destination_y>
+//
+// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
+// <x>,<y> - ƒ[ƒvƒ|ƒCƒ“ƒg‚Ì’†SÀ•W(x,y)
+// <displayname(hidden)> - npc–¼Bˆê•¶ŽšˆÈã‚Ì”CˆÓ‚Ì•¶Žš‚ÅŽw’肵‚Ü‚·Bƒ†ƒj[ƒN‚È–¼‘O‚Å‚ ‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB
+// ŽÀÛ‚É‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñB
+// <dx>,<dy> - “®ì”͈Í(x,y) <x,y>‚ð’†S‚É(dx+1,dy+1)‚͈̔͂ÉPC‚ª—ˆ‚é‚Æ”­“®‚µ‚Ü‚·
+// <destination_gatname>,<destination_x>,<destination_y> -
+// ˆÚ“®æ‚̃}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼,À•W(x,y)
+// destination_gatname‚ɂ‚¢‚Ä‚ÍŠg’£Žq".gat"‚Í‚ ‚Á‚Ä‚à–³‚­‚Ä‚à\‚¢‚Ü‚¹‚ñB
+// ˆÚ“®æ‚Ìmapƒf[ƒ^ƒtƒ@ƒCƒ‹‚ª‘¶Ý‚µ‚È‚¢(‚ ‚é‚¢‚Ímap_config‚ÅŽw’肳‚ê‚Ä‚¢‚È‚¢)ꇂ͔­“®‚µ‚Ü‚¹‚ñB
+// ˆÚ“®æ‚ÌÀ•W‚ªi“ü‹ÖŽ~‹æˆæ‚Å‚ ‚Á‚½ê‡‚ÍAƒ‰ƒ“ƒ_ƒ€‚ÈÀ•W‚Ƀ[ƒv‚µ‚Ü‚·B
+// ‚Ü‚½A“¯ˆêÀ•W‚É•¡”‚Ìwarp‚ª’u‚©‚ê‚Ä‚¢‚½ê‡Aæ‚É‹Lq‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ª—LŒø‚É‚È‚è‚Ü‚·
+// ‚±‚ê‚ÍAconfƒtƒ@ƒCƒ‹“à‚ÅŽw’肳‚ê‚éAnpc*.txtƒtƒ@ƒCƒ‹‚ð‚Ü‚½‚¢‚Åwarp‚ð‹Lq‚·‚é‚Æ‚«‚à“¯‚¶‚±‚Æ‚ª‚¢‚¦‚Ü‚·B
+// —á:
+prontera.gat,156,185,4 warp sample1 0,0,prontera.gat,156,225
+prontera.gat,156,185,4 warp sample1a 0,0,prontera.gat,156,230
+// sample1‚Ì•û‚ªæ‚É‹Lq‚³‚ê‚Ä‚¢‚é‚Ì‚ÅA156,225‚Ɉړ®‚µ‚Ü‚·
+prontera.gat,156,220,4 warp sample1-1 0,0,prontera.gat,156,180
+
+// --------------------
+// *ƒ‚ƒ“ƒXƒ^[(monster)
+// --------------------
+// ‘Ž®:<gatname>,<x>,<y>[,<xs>,<ys>] monster <displayname> <npcid>,<number>[,<spawn_delay1>,<spawn_delay2>]
+// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
+// <x>,<y> - ‰Šú”z’uÀ•W(x,y) 0,0‚Å‚ ‚ê‚΃‰ƒ“ƒ_ƒ€‚Ȉʒu‚É”z’u‚³‚ê‚Ü‚·B
+// [,<xs>,<ys>] - “Á’è”͈͓à‚É”z’u‚·‚鎞‚ÉŽw’肵‚Ü‚·B
+// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
+// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢(db/mob_db.txt‚ªŽQl‚É‚È‚é‚ÆŽv‚¢‚Ü‚·‚ª...)
+// <number> - ”z’u”
+// [,<spawn_delay1>,<spawn_delay2>] - “¯ˆêpc_id‚ð‚à‚ƒ‚ƒ“ƒXƒ^[‚̶¬ŽžŠÔ‚ɂ‚¢‚Ä‚Ì’è‹`
+// ‘O‰ñoŒ»ŽžŠÔ+oŒ»’x‰„1,“|‚³‚ꂽŽžŠÔ+oŒ»’x‰„2,“|‚³‚ꂽŽžŠÔ+5•b ‚ÅŽZo‚³‚ê‚é’l‚Ì‚¤‚¿AÅ‚à‘å‚«‚¢•¨‚ð
+// oŒ»ŽžŠÔ‚Æ‚µ‚Ü‚·
+// —á:
+prontera.gat,0,0 monster ƒ|ƒŠƒ“ 1002,5
+
+// ---------
+// *“X(shop)
+// ---------
+// ‘Ž®:<gatname>,<x>,<y>,<direction> shop <displayname> <npcid>,<item_id1>:<price1>[,<item_id2>:<price2>[,.....<item_id_N>:<priceN>]]
+// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
+// <x>,<y> - NPC‚Ì”z’uÀ•W(x,y)
+// <direction> - npc‚ÌŒü‚¢‚Ä‚¢‚é•ûŒüB0‚ð–k(yÀ•W•ûŒü+)‚Æ‚µ‚ÄA”½ŽžŒv‰ñ‚è45“x‚«‚´‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·
+// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
+// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢
+// <item_id_N>:<price_N> - item_id_N‚̤•i‚ð‰¿Šiprice_N‚Æ‚µ‚Ĕ̔„•¨ƒEƒCƒ“ƒhƒE‚É•\Ž¦‚µ‚Ü‚·B
+// item_id‚ɂ‚¢‚Ä‚Ídb/item_db.txt‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+// —á:
+prontera.gat,136,203,6 shop “¹‹ï¤l 73,501:5,502:20,503:55,504:120,506:20,645:80,656:150,601:30,602:30,611:20,610:400
+
+// -====================-
+// *NPCƒXƒNƒŠƒvƒg(script)
+// -====================-
+// ‘Ž®:
+// <gatname>,<x>,<y>,<direction> script <displayname> <npcid>[,<xs>,<ys>],{ <script> ... }
+// <gatname> - ƒ}ƒbƒvƒf[ƒ^ƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í•K{‚Å‚·B
+// <x>,<y> - NPC‚Ì”z’uÀ•W(x,y)
+// <direction> - npc‚ÌŒü‚¢‚Ä‚¢‚é•ûŒüB0‚ð–k(yÀ•W•ûŒü+)‚Æ‚µ‚ÄA”½ŽžŒv‰ñ‚è45“x‚«‚´‚Ý‚É‚È‚Á‚Ä‚¢‚Ü‚·
+// <displayname> - ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð‡‚킹‚½‚Æ‚«‚É•\Ž¦‚³‚ê‚é–¼‘OB–¼‘O‚͈ꕶŽšˆÈãŽw’肵‚Ä‚­‚¾‚³‚¢
+// <npcid> - ƒLƒƒƒ‰ƒNƒ^[ŽíBÚׂɂ‚¢‚Ä‚Í‚¨Ž@‚µ‚­‚¾‚³‚¢
+// [,<xs>,<ys>] - (x,y)‚ð’†S‚Æ‚µ‚Ä(xs,ys)ˆÈ“à‚ÉPC‚ª‹ßŠñ‚é‚ƃXƒNƒŠƒvƒg‚ª”­“®‚µ‚Ü‚·
+// (warp‚Æ“¯‚¶‚悤‚È”­“®‚Ì‚µ‚©‚½‚É‚È‚è‚Ü‚·)
+//
+// ‚±‚ÌŒã‚É‘±‚­{}“à‚ªƒXƒNƒŠƒvƒg‚Æ‚µ‚Ä”FŽ¯‚³‚ê‚Ü‚·‚ª
+// }(s––) ‚ŃXƒNƒŠƒvƒg‚ÌI—¹‚Æ”»’f‚µ‚Ä‚¢‚Ü‚·B
+// ‚»‚Ì‚½‚ßA}‚ÌŒã‚ɂ̓Rƒƒ“ƒg(//`)‚Í•t‚¯‚È‚¢‚Å‚­‚¾‚³‚¢B
+// (Œã“ú‚±‚ÌŽd—l‚Í•ÏX—\’è‚Å‚·)
+//
+// ------------------------
+// *{}“à‚̃XƒNƒŠƒvƒg‚ɂ‚¢‚Ä
+// ------------------------
+// ŒÂX‚Ì–½—ߌê‚┎š,•¶Žš—ñ,ƒ‰ƒxƒ‹,‰‰ŽZŽq“™‚ÌŠÔ‚Í
+// ƒXƒy[ƒX‚âƒ^ƒuA‰üsA/* */‚É‚æ‚èˆÍ‚܂ꂽƒRƒƒ“ƒgA//‚©‚ç‰üs‚܂ł̃Rƒƒ“ƒg‚ð
+// Ž©—R‚É“ü‚ê‚鎖‚ªo—ˆ‚Ü‚· (C•—–¡)
+// Še–½—ß‚ÍÅŒã‚É";"‚ð‚‚¯‚Ü‚· (C•—–¡)
+//
+// ---
+// *’l
+// ---
+// script“à‚ÅŽg—p‚³‚ê‚é’l‚Í ”Žš / •¶Žš—ñ / •Ï”–¼ / ƒ‰ƒxƒ‹ ‚Ì4Ží—Þ‚É•ª‚©‚ê‚Ü‚·B
+//
+// *”Žš [0-9]‚Ì—ñ‚Å•\‚킳‚ê‚é10i”‚©A0x‚ÅŽn‚Ü‚é16i”
+// ”’l‚Æ‚µ‚Ĉµ‚¦‚é‚Ì‚Í•„†•t32bit®”‚Ì‚Ý‚ÅA¬”‚͈µ‚¦‚Ü‚¹‚ñ
+// *•¶Žš—ñ ""‚ň͂܂ꂽˆê’Ê‚è‚Ì•¶Žš—ñ‚ªŽg‚¦‚Ü‚·B
+// •¶Žš—ñ’†‚É"‚ð“ü‚ꂽ‚¢ê‡‚Í\"A\‚ð“ü‚ꂽ‚¢ê‡‚Í\\‚Æ‚µ‚Ü‚·
+// *•Ï”–¼/ƒ‰ƒxƒ‹–¼ [A-Za-z0-9_]‚Æ@(ˆê•¶Žš–Ú‚Ì‚Ý)‚ªŽg‚¦‚Ü‚·B
+// “ÁŽê‚ȃ‰ƒxƒ‹‚Æ‚µ‚Ä-‚ª‘¶Ý‚µ‚Ü‚·B‚±‚ê‚ÍŽŸ‚Ì–½—ß‚ðˆÓ–¡‚µ‚Ü‚·
+// ˆÈ‰º‚Åà–¾‚·‚é’蔂▄‚ßž‚Ý•Ï”‚à‚±‚ê‚É‚ ‚½‚è‚Ü‚·
+//
+// -----------------------
+// *’蔂܂½‚Í–„‚ßž‚Ý•Ï”
+// -----------------------
+// db/const.txt‚É<’è”–¼> <”’l>‚Æ‹Lq‚·‚鎖‚Å
+// ƒXƒNƒŠƒvƒg“à‚Å—˜—p‰Â”\‚Ȓ蔂ð錾o—ˆ‚Ü‚·B
+// (NPC“X‚̤•iƒŠƒXƒg,Œ©‚½–Ú‚ÌÝ’è•”•ª“™‚É‚Í—˜—po—ˆ‚Ü‚¹‚ñ)
+//
+// ‚Ü‚½A‚±‚Ì’†‚ŃLƒƒƒ‰ƒNƒ^[‚̃Xƒe[ƒ^ƒX‚ðŽQÆ‚·‚é
+// –„‚ßž‚Ý•Ï”‚Ì’è‹`‚à‚µ‚Ä‚¢‚Ü‚·BŒ»Ý—LŒø‚È•¨‚͈ȉº‚Ì7‚‚ł·
+//
+// BaseLevel : ƒx[ƒXƒŒƒxƒ‹
+// JobLevel : ƒWƒ‡ƒuƒŒƒxƒ‹
+// StatusPoint : U‚蕪‚¯‰Â”\‚ȃXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg”
+// SkillPoint : U‚蕪‚¯‰Â”\‚ȃXƒLƒ‹ƒ|ƒCƒ“ƒg”
+// Class : ƒLƒƒƒ‰ƒNƒ^[‚ÌE‹Æ‚ÌŽí—Þ
+// Class’l‚ɂ‚¢‚Ä‚ÍJob_Novice“™db/const.txt‚Å’è”’è‹`‚³‚ê‚Ä‚Ü‚·‚Ì‚Å‚±‚¿‚ç‚ðŽg‚¤‚Æ—Ç‚¢‚Å‚µ‚傤
+// Zeny : ‚¨‹à
+// Sex : «•Ê[0=‰, 1=Š]
+//
+// ‚±‚ê‚ç‚Ì•Ï”‚ÍAif–½—ß‚âset–½—ß‚ÅŽ©—R‚ÉŽQÆ‚ªo—ˆ‚Ü‚·‚ªA
+// •ÏX‚ÍStatusPoint‚ÆSkillPoint‚ÆZeny‚Ì‚Ý‚Å‘¼‚Ì–„‚ßž‚Ý•Ï”‚Í•ÏX‚µ‚Ä‚àˆÓ–¡‚ðŽ‚¿‚Ü‚¹‚ñB
+// ‚Ü‚½A‚±‚Ì‚R‚‚̖„‚ßž‚Ý•Ï”‚ð•ÏX‚µ‚½ê‡A•ÏX‚̓Nƒ‰ƒCƒAƒ“ƒg‚É‘¦À‚É”½‰f‚³‚ê‚Ü‚·B
+//
+// -------
+// *ƒ‰ƒxƒ‹
+// -------
+// ƒ‰ƒxƒ‹‚ÍAƒ‰ƒxƒ‹–¼‚ÌŒã‚É:‚ð•t‚¯
+// label:
+// ‚̂悤‚É‹Lq‚µ‚Ü‚·B
+// goto•¶‚âmenu•¶Aif•¶“™‚Ì”ò‚Ñæ‚Æ‚µ‚ÄŽg‚í‚ê‚Ü‚·B
+//
+// ---
+// *Ž®
+// ---
+// –½—߂̈ø”‚Æ‚µ‚Ä”’l‚ª—v‹‚³‚ê‚Ä‚¢‚銂ÍA‘S‚Ä‚ÌŠ‚ÅŽ®‚ª—˜—p‰Â”\‚Å‚·B
+// ®”‰‰ŽZ‚Ì‚Ý‚Å‚·‚ªAC‚ÌŽ®‚̃TƒuƒZƒbƒg‚É‚È‚Á‚Ä‚¢‚Ü‚·
+// —˜—p‰Â”\‚ȉ‰ŽZŽq‚Í()A’P€‰‰ŽZŽq - ! ~A2€‰‰ŽZŽq + - * / % & | ^ && || == != > >= < <= ‚Å‚·
+//
+// •¶Žš—ñ‚Ìê‡‚Í + ‚ŘAŒ‹‚ª‰Â”\‚Å‚·B
+// •¶Žš—ñ + ”’l ‚â ”’l + •¶Žš—ñ ‚Æ‚µ‚½ê‡‚Í”’l‚𕶎š—ñ‚Ö‚Æ•ÏŠ·‚µ˜AŒ‹‚µ‚Ü‚·B
+//
+// -----------------
+// *{}“à‚ÅŽg‚¦‚é–½—ß
+// -----------------
+//
+// mes "<message>";
+// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚Émessage‚ð•\Ž¦‚µ‚Ü‚·
+// •¶Žš‚ÌF‚Í^000000“™^‚É‘±‚¯‚Ä16i”6Œ…‚ÅŽw’肵‚Ü‚·(‰ŠúF‚Í•(^000000)‚Å‚·)
+//
+// next;
+// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚É"next"‚̃{ƒ^ƒ“‚ð•\Ž¦‚µ‚Ü‚·
+//
+// close;
+// ƒƒbƒZ[ƒWƒEƒCƒ“ƒhƒE‚É"close"‚̃{ƒ^ƒ“‚ð•\Ž¦‚µAƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·
+//
+// menu "<choice1>",<Label1>[,"<choice2>",<Label2>....];
+// ‘I‘ðŽˆƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚µ‚Ü‚·B"choice1","choice2"“™‚©‘I‘ðŽˆ‚É•\Ž¦‚³‚ê
+// ƒƒjƒ…[‚Å‘I‚ñ‚¾ê‡‚ÍA‚»‚ÌŒã‚É‹Lq‚³‚ê‚郉ƒxƒ‹‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
+// ‚Ü‚½A‘I‘ð‚µ‚½€–ڂ̓[ƒJƒ‹•Ï”l15‚É‚ÄŽQÆ‚Å‚«‚Ü‚·B
+// ã‚Ì—á‚Å‚·‚Æ‘I‘ðŽˆ‚É"choice1"‚ªŒ»‚êA‚±‚ê‚ð‘I‚Ô‚ÆLabel1:‚ÅŽn‚Ü‚és‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
+// ‚»‚µ‚ÄA•Ï”l15‚É‚Í1‚Æ‚¢‚¤’l‚ªƒZƒbƒg‚³‚ê‚Ü‚·
+// cancel‚ð‘I‚ñ‚¾ê‡AƒXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·
+//
+// goto <Label>;
+// Label:‚ÅŽn‚Ü‚és‚©‚瑱‚«‚ðŽÀs‚µ‚Ü‚·
+//
+// cutin "<filename>[.bmp]",<pos>;
+// ‰æ–Êã‚Éfilename‚ÅŽw’è‚·‚é‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
+// filename - •\Ž¦‚·‚ébmpƒtƒ@ƒCƒ‹–¼BŠg’£Žq‚Í–³‚­‚Ä‚à\‚¢‚Ü‚¹‚ñ
+// pos - •\Ž¦ˆÊ’u 0-¶‰º 1-’†‰›‰º 2-‰E‰º 3-? 4-? 255-”ñ•\Ž¦
+// Œ»Ý‚̃Nƒ‰ƒCƒAƒ“ƒg‚Å‚ÍAcutin‚ðŽÀs‚·‚é‚Æ‚«‚ɈȑOcutin‚ªŽÀs‚³‚ê‚Ä‚¨‚è‰æ‘œ‚ª•\Ž¦‚³‚ê‚Ä‚¢‚éꇂÍA
+// æ‚É•\Ž¦‚µ‚Ä‚ ‚é‰æ‘œ‚ðÁ‹Ž‚µ‚Ä‚©‚çŒã‚ÅŽw’肳‚ê‚é‰æ‘œ‚ð•\Ž¦‚µ‚Ü‚·
+//
+// jobchange <Jobid>;
+// PC‚ÌE‚ðJobname‚ÅŽw’肵‚½E‚É•ÏX‚µ‚Ü‚·BŽw’è‚Å‚«‚éJobid‚ɂ‚¢‚Ä‚Ídb/const.txt‚ÌJob_‚Å‚Í‚¶‚Ü‚és‚ð
+// ŽQÆ‚µ‚Ä‚­‚¾‚³‚¢Bconst‚ÅŽw’肵‚Ä‚¢‚é–„‚ß‚±‚Ý•Ï”–¼‚àŽg—p‚Å‚«‚Ü‚·B
+// jobchange‚ðs‚¤‚ÆAJobLv‚Í1‚ÉAƒXƒe[ƒ^ƒXƒ{[ƒiƒX‚Í‚»‚ÌE‚É
+// ‡‚킹‚½•¨‚ɕω»‚µ‚Ü‚·BAthena-d2.1‚ł̓XƒLƒ‹‚ÍŽg‚¦‚È‚¢‚Ì‚ÅAŒ©‚½–Ú•ÏX‚¾‚¯‚ÆŽv‚Á‚Ä‚­‚¾‚³‚¢B
+// [’ˆÓ]
+// 1.’ljÁ2ŽŸE(ƒNƒ‹ƒZƒCƒ_[“™)‚Éjobchange‚ð‚·‚éê‡A•žFƒpƒŒƒbƒg‚ð•ÏX‚µ‚Ä‚¢‚éꇂ̓Šƒ\[ƒXƒGƒ‰[‚ª
+// ‹N‚«‚Ü‚·‚Ì‚ÅAŽÀs‚µ‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
+// 2.ƒo[ƒh‚ƃ_ƒ“ƒT[‚ÌJobname‚Í•Ê‚É‚È‚Á‚Ä‚¢‚Ü‚·B
+// ‚±‚Ì‚½‚ßA’j«PC‚ɑ΂µ‚ÄJob_Dancer‚ðŽÀs‚µ‚½‚èA—«PC‚ɑ΂µ‚Äjob_Bird‚ðŽÀs‚µ‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B
+// ƒNƒ‰ƒCƒAƒ“ƒg‚É‚æ‚Á‚Ă̓Šƒ\[ƒXƒGƒ‰[‚Å—Ž‚¿‚Ü‚·B
+// map‘¤‚Å‚Í®‡ƒ`ƒFƒbƒN‚ðs‚Á‚Ä‚¢‚È‚¢‚½‚ßAƒXƒNƒŠƒvƒg‘¤‚Ń`ƒFƒbƒN‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
+// npc_testJ.txt‚Ì—á‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+// 3.db/const.txt‚É‚Íknight2/crusader2‚Ì‹Lq‚ª‚ ‚è‚Ü‚·‚ªA‚±‚Ìjob‚Ö‚Ìjobchange‚Ís‚í‚È‚¢‚Ù‚¤‚ª–³“ï‚Å‚·B
+// ŽÀۂ̃Q[ƒ€‚Å‚à‚±‚Ìjob‚ÍŽg—p‚³‚ê‚Ä‚¢‚È‚¢‚悤‚Å‚·B
+//
+// input [<variable>];
+// ”Žš“ü—̓EƒCƒ“ƒhƒE‚ðŠJ‚«‚Ü‚·B
+// “ü—Í‚³‚ꂽ”Žš‚Ívariable‚ª‚ ‚Á‚½ê‡‚»‚Ì•Ï”‚ÉA
+// –³‚©‚Á‚½ê‡‚̓[ƒJƒ‹•Ï”l14‚ɃZƒbƒg‚³‚ê‚Ü‚·B
+//
+// warp "<destination_gatname>",<destination_x>,<destination_y>;
+// Žw’肵‚½ƒ}ƒbƒv‚Ìx,yÀ•W‚Ƀ[ƒv‚µ‚Ü‚·BÚׂÍã‹Lwarp(NPC)‚Ì€‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+//
+// setlook <n1>,<n2>;
+// PC‚ÌŠOŒ©‚ðݒ肵‚Ü‚·B
+// <n1> - (1 .. 8)
+// 1-”¯Œ^
+// 2-•Ší
+// 3-“ª‰º
+// 4-“ªã
+// 5-һՠ
+// 6-”¯F
+// 7-•žF
+// 8-‚
+// <n2> - ”CˆÓ
+// ŠOŒ©Ý’è‚ÍŠY“–ƒAƒCƒeƒ€‚ð‘•”õ‚µ‚Ä‚¢‚È‚­‚Ä‚à•t‰Á‚³‚ê‚Ü‚·B
+// ‘z’èŠO‚̔Ԇ‚ðÝ’è‚·‚é‚ÆAƒNƒ‰ƒCƒAƒ“ƒg‚ªƒŠƒ\[ƒXƒGƒ‰[‚Å—Ž‚¿‚Ü‚·B
+// ƒAƒTƒVƒ“’j,’ljÁ2ŽŸE‚ÉŠÖ‚µ‚Ä‚Í•žF‚Ì•ÏX‚Ís‚í‚È‚¢‚Å‚­‚¾‚³‚¢(‚â‚͂胊ƒ\[ƒXƒGƒ‰[—Ž‚¿‚µ‚Ü‚·)
+// •Ší‚⓪‘•”õ,‚‚ÌÝ’è‚̓Xƒe[ƒ^ƒXÄŒvŽZŽž‚Éã‘‚«‚³‚ê‚Ä‚µ‚Ü‚¤‚½‚ßA
+// ŽÀŒ±“I‚È—p“r‚É‚Ì‚Ý—˜—p‰Â”\‚Å‚·B
+//
+// set <variable>,<n>;
+// •Ï”<variable>‚Ì’l‚ð<n>‚ɃZƒbƒg‚µ‚Ü‚·B
+// Œ»Ý<n>‚Í”’l‚Ì‚Ý‚Å•¶Žš—ñ‚ªˆµ‚¦‚Ü‚¹‚ñ‚ªAŒã“ú‘Ήž—\’è‚Å‚·B
+//
+// if (<cond>) goto <Label>;
+// ðŒ•ªŠò‚Å‚·B<cond>‚ÌŒvŽZŒ‹‰Ê‚ª0ˆÈŠO‚Ìê‡ALabel‚ɃWƒƒƒ“ƒv‚µ‚Ü‚·B
+//
+// getitem <item_id>,<num>;
+// PC‚ÌŠŽ•iƒŠƒXƒg‚Éitem_id‚ÅŽw’肳‚ê‚éƒAƒCƒeƒ€‚ðnum‚¾‚¯’ljÁ‚µ‚Ü‚·B
+//
+// delitem <item_id>,<num>;
+// PC‚ÌŠŽ•iƒŠƒXƒg‚©‚çitem_id‚ÅŽw’肳‚ê‚éƒAƒCƒeƒ€‚ðnum‚¾‚¯íœ‚µ‚Ü‚·B
+//
+// viewpoint <type>,<x>,<y>,<id>,<color>;
+// ƒ~ƒjƒ}ƒbƒv‚Ìx,y‚ÌÀ•W‚Ƀ}[ƒN(colorF‚ðŽw’è)‚ð•t‚¯‚Ü‚·B
+// <type> 1-•\Ž¦
+// 2-íœ
+//
+// heal <hp>,<sp>;
+// PC‚ÌHP/SP‚ðhp,sp‚ÅŽw’肵‚½’l‚¾‚¯‰ñ•œ‚³‚¹‚Ü‚·B
+//
+// end;
+// ‚±‚±‚ŃXƒNƒŠƒvƒg‚ÌŽÀs‚ðI—¹‚µ‚Ü‚·B
+//
+// setoption <str>;
+// PC‚Ɉȉº‚ÅŽ¦‚·•t‘®•i(?)‚ð•t‚¯‚Ü‚·B
+// 0x0000 - •t‘®•iíœ
+// 0x0001 - ?
+// 0x0002 - ƒnƒCƒh(‰e•t‚«)
+// 0x0004 - ??
+// 0x0008 - ƒJ[ƒg
+// 0x0010 - ‘é
+// 0x0020 - ƒyƒRƒyƒR(ƒiƒCƒg,ƒNƒ‹ƒZƒCƒ_[‚ÌŽž‚Ì‚Ý—LŒø)
+// 0x0040 - ƒnƒCƒh(‰e–³‚µ)
+// 0x0080 - ƒJ[ƒg2
+// 0x0100 - ƒJ[ƒg3
+// 0x0200 - ƒJ[ƒg4
+// 0x0400 - ƒJ[ƒg5
+// 0x0800 - “ª‚ªƒI[ƒN(Sage‚̃XƒLƒ‹AƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…‚ª‚©‚©‚Á‚½ó‘Ô‚É‚È‚é)
+// setoption‚ðŽÀs‚·‚é‚Æ‚«AŒ³XƒZƒbƒg‚³‚ê‚Ä‚¢‚½’l‚̓NƒŠƒA‚³‚ê‚Ü‚·B
+// ‚»‚ꂼ‚ê‚Ì’l‚͉ÁŽZ‚µ‚½’l‚ðÝ’è‚·‚邱‚Æ‚É‚æ‚èA“¯Žž‚É•t‘®•i‚ª•t‚¯‚ç‚ê‚Ü‚·B
+// —Ⴆ‚ÎA0x38‚ŃJ[ƒg‚ðˆø‚¢‚ÄA‘é‚ð˜A‚ꂽƒyƒRæ‚èƒiƒCƒg‚Æ‚¢‚Á‚½‚à‚Ì‚à‚Å‚«‚Ü‚·B
+// setoption‚ŃZƒbƒg‚³‚ꂽ’l‚̓Nƒ‰ƒCƒAƒ“ƒgI—¹Œã‚à‹L‰¯‚³‚ê‚Ü‚·B
+// [memo]Žb’è“I‚È‚Ì‚ÅŽd—l•ÏX‚̉”\«‚ª‚ ‚è‚Ü‚·B
+//
+// savepoint "<gatname>",<x>,<y>;
+// ƒZ[ƒuƒ|ƒCƒ“ƒg‚ðgatname,x,y‚Éݒ肵‚Ü‚·
+//
+// -----
+// *ŠÖ”
+// -----
+// ðŒ–½—߂Ȃǂňȉº‚ÌŠÖ”‚ªŽg—p‚Å‚«‚Ü‚·B
+//
+// rand(<n>[,n2])
+// n‚Ì‚Ý‚Ìê‡A0‚©‚ç(n-1)‚Ü‚Å‚Ì”‚ðƒ‰ƒ“ƒ_ƒ€‚É•Ô‚µ‚Ü‚·B
+// n2‚ª—^‚¦‚ç‚ê‚Ä‚¢‚½ê‡‚Í n ‚©‚ç n2 ‚Ü‚Å‚Ì”‚ðƒ‰ƒ“ƒ_ƒ€‚É•Ô‚µ‚Ü‚·
+//
+// countitem(<item_id>)
+// ƒvƒŒƒCƒ„[‚ÌŠŽ‚·‚éAitem_id‚ÅŽw’è‚·‚éƒAƒCƒeƒ€‚Ì”‚ð•Ô‚µ‚Ü‚·
+//
+// [memo]
+// ƒ‰ƒ“ƒ_ƒ€ƒ[ƒv‚ðŽÀ‘•‚µ‚½‚¢ê‡A”͈͎Às‚Èscript‚ð—˜—p‚µ‚Ü‚·(npc_warp.txt‚ðŽQÆ)
+//
+
+// script‚Ì—á:
+prontera.gat,146,203,2 script ƒfƒoƒbƒK[—vˆõ 116,{
+ cutin "kafra_02",2;
+ if(countitem(515)<10) goto Llesscarrot;
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "‚ ‚ç‚ ‚çA‚É‚ñ‚¶‚ñ‚ð‘òŽRŽ‚Á‚Ä‚Ü‚·‚ËB";
+ mes "‚Æ‚¢‚¤Ž–‚ÅA‚¤‚³‚¤‚³D‚«‚ÆŸŽè‚ɂ킽‚µ‚ª”F’肵‚Ü‚µ‚½B";
+ mes "‚É‚ñ‚¶‚ñ10–{‚ÆŒðŠ·‚Å‚¤‚³‚݂݃wƒAƒoƒ“ƒh‚ð‚³‚µ‚ ‚°‚Ü‚·‚ËB";
+ next;
+ if(countitem(515)<10) goto Llesscarrot_err;
+ delitem 515,10;
+ getitem 2214,1;
+ goto Llesscarrot;
+Llesscarrot_err:
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "‚ ‚çH‚É‚ñ‚¶‚ñ‚ª‘«‚è‚È‚­‚È‚Á‚Ä‚Ü‚·‚ËB";
+ mes "‚Æ‚¢‚¤Ž–‚Å¡‰ñ‚ÌŽ–‚Í–³‚©‚Á‚½Ž–‚É‚µ‚Ü‚·B";
+ next;
+// ’Êí‚Í‚±‚±‚©‚ç
+Llesscarrot:
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
+ mes "‰½‚ð‚µ‚Ü‚·‚©?";
+ next;
+ menu "ƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒg‚ð200‘‚â‚·",Lstp,"ƒXƒLƒ‹ƒ|ƒCƒ“ƒg‚ð20‘‚â‚·",Lskill,
+ "‚¨‹à‚ª—~‚µ‚¢‚Å‚·",Lzeny,"ˆÄ“à‚̃eƒXƒg",Lviewpoint,"“]E‚·‚é",Ljobchange,"ƒJ[ƒg‚ð‚‚¯‚é",Lcart,"‚â‚ß‚é",Lend;
+Lstp: set StatusPoint,StatusPoint+200;
+ goto Lend;
+Lskill: set SkillPoint,SkillPoint+20;
+ goto Lend;
+Lzeny: set Zeny,Zeny+1000;
+ goto Lend;
+Lviewpoint:
+ viewpoint 1,156,360,1,0x0000ff;
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "ƒvƒƒ“ƒeƒ‰é";
+ next;
+ viewpoint 2,156,360,1,0x0000ff;
+ viewpoint 1,156,22,2,0x00ff00;
+ viewpoint 1,22,203,3,0x00ff00;
+ viewpoint 1,289,203,4,0x00ff00;
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "‚±‚Ì3‰ÓŠ‚©‚çŠO‚Éo‚ç‚ê‚Ü‚·B";
+ next;
+ viewpoint 2,156,22,2,0x00ff00;
+ viewpoint 2,22,203,3,0x00ff00;
+ viewpoint 2,289,203,4,0x00ff00;
+ goto Lend;
+Ljobchange:
+ cutin "kafra_02",255;
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "Œ©‚½–Ú‚Ì‚Ý‚Å‚·‚ª";
+ mes "“]E‰Â”\‚Å‚·B";
+ mes "“]E‚µ‚Ä‚àAƒXƒLƒ‹“™‚Í";
+ mes "–¢ŽÀ‘•‚Ì‚½‚ߎg‚¦‚Ü‚¹‚ñB";
+ mes "‚Ç‚ÌE‹Æ‚É“]E‚³‚¹‚Ü‚·‚©?";
+ next;
+ menu "‰SŽÒ",Lnv,
+ "Œ•Žm",Lsm,
+ "ƒ}ƒWƒVƒƒƒ“",Lmg,
+ "ƒA[ƒ`ƒƒ[",Lac,
+ "ƒAƒRƒ‰ƒCƒg",Lal,
+ "¤l",Lmc,
+ "ƒV[ƒt",Ltf,
+ "ƒiƒCƒg",Lkn,
+ "ƒvƒŠ[ƒXƒg",Lpr,
+ "ƒEƒBƒU[ƒh",Lwz,
+ "’b–艮",Lbs,
+ "ƒnƒ“ƒ^[",Lht,
+ "ƒAƒTƒVƒ“",Las,
+ "‚¨‚Ü‚©‚¹",Lrandom,
+ "‚â‚ß‚é",Ljchcancel;
+Lnv: jobchange Job_Novice; goto Lend;
+Lsm: jobchange Job_Swordman; goto Lend;
+Lmg: jobchange Job_Mage; goto Lend;
+Lac: jobchange Job_Archer; goto Lend;
+Lal: jobchange Job_Acolyte; goto Lend;
+Lmc: jobchange Job_Merchant; goto Lend;
+Ltf: jobchange Job_Thief; goto Lend;
+Lkn: jobchange Job_Knight; goto Lend;
+Lpr: jobchange Job_Priest; goto Lend;
+Lwz: jobchange Job_Wizard; goto Lend;
+Lbs: jobchange Job_Blacksmith; goto Lend;
+Lht: jobchange Job_Hunter; goto Lend;
+Las: jobchange Job_Assassin; goto Lend;
+Lrandom:
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "‚Å‚Íc";
+ set l0,rand(13);
+ jobchange l0;
+ mes "‚±‚ÌE‹Æ‚ÅŠæ’£‚Á‚Ä‚­‚¾‚³‚¢‚ËB";
+ goto Lend;
+Ljchcancel: mes "‚ ‚çA‚â‚ß‚é‚Ì‚Å‚·‚©c";
+ mes "“]E‚³‚ê‚é‚Æ‚«‚Í";
+ mes "‹CŒy‚ɺ‚ð‚©‚¯‚Ä‚­‚¾‚³‚¢‚Ë"; close;
+ goto Lend;
+Lcart:
+ mes "[ƒfƒoƒbƒK[—vˆõ]";
+ mes "ƒJ[ƒg‚Å‚·‚ËB";
+ mes "•t‚¯‚Ü‚·‚©H‚»‚ê‚Æ‚àŠO‚µ‚Ü‚·‚©H";
+ menu "‚‚¯‚é",LattachC,"ŠO‚·",LremoveC;
+LattachC:
+ mes "‚Í‚¢A‚Ç‚¤‚¼B";
+ setoption 0x08;
+ goto Lend;
+LremoveC:
+ mes "‚Å‚ÍAŠO‚µ‚Ü‚·‚ËB";
+ setoption 0x00;
+ goto Lend;
+Lend: cutin "kafra_02",255;
+ close;
+ end; }
+
+prontera.gat,156,195,4 script ƒJƒvƒ‰Eˆõ 112,{
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹";
+ mes "‚±‚¿‚ç‚Å‚ÍAŒ»Ý‚ÌAthena‚Ì󋵂ðà–¾‚¢‚½‚µ‚Ü‚·B";
+ next;
+ menu "•·‚­",Lcont,"•·‚©‚È‚¢",Lend;
+Lcont: mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "Athena‚Å‚ÍROƒGƒ~ƒ…ŽIŠJ”­ƒXƒŒ35‚³‚ñ‚̃vƒƒOƒ‰ƒ€‚ðƒx[ƒX‚Æ‚µ‚ÄŠJ”­‚ª‚Í‚¶‚Ü‚è‚Ü‚µ‚½"
+ mes "“r’†Aƒ\[ƒX‚Ì•ªŠ„‰»‚ª}‚ç‚êAŒ»Ý‚Ìó‘Ô‚É‚È‚Á‚Ä‚¢‚Ü‚·B";
+ next;
+ mes "Œ»ÝŽÀ‘•‚³‚ê‚Ä‚¢‚é‚à‚̂͂‚¬‚Ì’Ê‚è‚Å‚·";
+ mes "Eƒ}ƒbƒvŠÔˆÚ“®ƒ|ƒCƒ“ƒg";
+ mes "E¤lNPC";
+ mes "E‰ï˜bNPC@(ðŒ•ªŠò,ƒ‰ƒxƒ‹ƒWƒƒƒ“ƒvAƒ‰ƒ“ƒ_ƒ€•Ï”AƒAƒCƒeƒ€Žó‚¯“n‚µA•Ï”ŽQÆAcutin“™";
+ mes "E•Ï”•Û‘¶";
+ mes "E°ƒAƒCƒeƒ€";
+ mes "Eƒ`ƒƒƒbƒg";
+ mes "E퓬(‰£‚è)";
+ mes "EEpisode 4ˆÈ~ƒ^ƒCƒv‚̃pƒPƒbƒgŽd—l";
+ mes "EŒoŒ±’l,lvã¸";
+ mes "EƒAƒCƒeƒ€‚Ì—˜—p‚̈ꕔ";
+ next;
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "‹t‚ÉŒ»óŽÀ‘•‚³‚ê‚Ä‚¢‚È‚¢‚à‚Ì‚Í‘å‘̈ȉº‚Ì’Ê‚è‚Å‚·B";
+ mes "EƒXƒLƒ‹";
+ mes "E‘•”õ‚É‚æ‚éƒpƒ‰ƒ[ƒ^•Ï‰»";
+ mes "Eƒp[ƒeƒB/ƒMƒ‹ƒh";
+ mes "Eƒyƒbƒg";
+ mes "E¸˜B/•Šíì¬";
+ next;
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "‚»‚ê‚Æ’ˆÓ“_‚Å‚·‚ªAAthena‚Å‚ÍID‚ÌÅŒã‚É_F‚Ü‚½‚Í_M‚ð•t‚¯‚é‚ÆV‹KID‚ª”­s‚³‚ê‚éŽd‘g‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA";
+Lcont2: mes "2‰ñ–ÚˆÈ~‚Í_F,_M‚ð•t‚¯‚Ä‚¢‚é‚ƃpƒXƒ[ƒhƒGƒ‰[ˆµ‚¢‚É‚È‚è‚Ü‚·B";
+ next;
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "—Ⴆ‚ÎA‰‰ñ‚ÉID:^ff0000hoge^0000ff_F^000000@pass:0123‚Ælogin‚µ‚½ê‡Ahoge‚ªID‚Æ‚µ‚Ä“o˜^‚³‚ê‚Ü‚·B";
+ mes "‚æ‚Á‚ÄA2‰ñ–ÚˆÈ~‚ÍID:^ff0000hoge^000000@pass:0123‚Æ‚µ‚Älogin‚µ‚ĉº‚³‚¢B";
+ next;
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "keep‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ä‚¢‚éê‡AŽáŠ±•s•Ö‚ÈŽd—l‚Å‚·‚ªAˆÈã‚Ì“_‚ð‚æ‚낵‚­‚¨Šè‚¢‚µ‚Ü‚·B";
+ close;
+Lend: mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "‚Å‚Í’ˆÓ“_‚Ì‚ÝAà–¾‚³‚¹‚Ä’¸‚«‚Ü‚·B";
+ next;
+ mes "[ƒJƒvƒ‰Eˆõ]";
+ mes "Athena‚Å‚ÍID‚ÌÅŒã‚É_F‚Ü‚½‚Í_M‚ð•t‚¯‚é‚ÆV‹KID‚ª”­s‚³‚ê‚éŽd‘g‚É‚È‚Á‚Ä‚¢‚Ü‚·‚ªA";
+ goto Lcont2; }
+
diff --git a/npc/sample/npc_shop_test.txt b/npc/sample/npc_shop_test.txt
index e8075b1c8..f619cbdb1 100644
--- a/npc/sample/npc_shop_test.txt
+++ b/npc/sample/npc_shop_test.txt
@@ -1,31 +1,31 @@
-// ƒvƒƒ“ƒeƒ‰•¬…Žü•Ó
-prontera.gat,156,192,3 shop ƒJ[ƒhƒVƒ‡ƒbƒv1 95,4001:100,4002:100,4003:100,4004:100,4005:100,4006:100,4007:100,4008:100,4009:100,4010:100,4011:100,4012:100,4013:100,4014:100,4015:100,4016:100,4017:100,4018:100,4019:100,4020:100,4021:100,4022:100,4023:100,4024:100,4025:100,4026:100,4027:100,4028:100,4029:100,4030:100,4031:100,4032:100,4033:100,4034:100,4035:100,4036:100,4037:100,4038:100,4039:100,4040:100,4041:100,4042:100,4043:100,4044:100,4045:100,4046:100,4047:100,4048:100,4049:100,4050:100
-prontera.gat,154,192,1 shop ƒJ[ƒhƒVƒ‡ƒbƒv2 123,4051:100,4052:100,4053:100,4054:100,4055:100,4056:100,4057:100,4058:100,4059:100,4060:100,4061:100,4062:100,4063:100,4064:100,4065:100,4066:100,4067:100,4068:100,4069:100,4070:100,4071:100,4072:100,4073:100,4074:100,4075:100,4076:100,4077:100,4078:100,4079:100,4080:100,4081:100,4082:100,4083:100,4084:100,4085:100,4086:100,4087:100,4088:100,4089:100,4090:100,4091:100,4092:100,4093:100,4094:100,4095:100,4096:100,4097:100,4098:100,4099:100,4100:100
-prontera.gat,158,192,1 shop ƒJ[ƒhƒVƒ‡ƒbƒv3 67,4101:100,4102:100,4103:100,4104:100,4105:100,4106:100,4107:100,4108:100,4109:100,4110:100,4111:100,4112:100,4113:100,4114:100,4115:100,4116:100,4117:100,4118:100,4119:100,4120:100,4121:100,4122:100,4123:100,4124:100,4125:100,4126:100,4127:100,4128:100,4129:100,4130:100,4131:100,4132:100,4133:100,4134:100,4135:100,4136:100,4137:100,4138:100,4139:100,4140:100,4141:100,4142:100,4143:100,4144:100,4145:100,4146:100,4147:100,4148:100
-prontera.gat,144,205,1 shop “ª‘•”õ‰®1 71,2201:100,2202:100,2203:100,2204:100,2205:100,2206:100,2207:100,2208:100,2209:100,2210:100,2211:100,2212:100,2213:100,2214:100,2215:100,2216:100,2217:100,2218:100,2219:100,2220:100,2221:100,2222:100,2223:100,2224:100,2225:100,2226:100,2227:100,2228:100,2229:100,2230:100,2231:100,2232:100,2233:100,2234:100,2235:100,2236:100,2237:100,2239:100,2240:100,2241:100,2242:100,2243:100,2244:100,2245:100,2246:100,2247:100,2248:100,2249:100,2250:100
-prontera.gat,144,203,3 shop “ª‘•”õ‰®2 101,2251:100,2252:100,2253:100,2254:100,2255:100,2256:100,2257:100,2258:100,2259:100,2260:100,2261:100,2262:100,2263:100,2264:100,2265:100,2266:100,2267:100,2268:100,2269:100,2270:100,2271:100,2272:100,2273:100,2274:100,2275:100,2276:100,2277:100,2278:100,2279:100,2280:100,2281:100,2282:100,2283:100,2284:100,2285:100,2286:100,2287:100,2288:100,2289:100,2290:100,2291:100,2292:100,2293:100,2294:100,2295:100,2296:100,2297:100,2298:100,2299:100
-prontera.gat,144,201,3 shop “ª‘•”õ‰®3 69,5001:100,5002:100,5003:100,5004:100,5005:100,5006:100,5007:100,5008:100,5009:100,5010:100,5011:100,5012:100,5013:100,5014:100,5015:100,5016:100,5017:100,5018:100,5019:100
-prontera.gat,167,202,5 shop ƒAƒNƒZƒTƒŠ[ƒVƒ‡ƒbƒv 102,2601:100,2602:100,2603:100,2604:100,2605:100,2607:100,2608:100,2609:100,2610:100,2611:100,2612:100,2613:100,2614:100,2615:100,2616:100,2617:100,2618:100,2619:100,2620:100,2621:100,2622:100,2623:100,2624:100,2625:100,2626:100,2627:100,2628:100
-prontera.gat,167,204,6 shop ŽG‰Ý‰® 96,501:100,502:100,503:100,504:100,505:100,506:100,507:100,508:100,509:100,510:100,511:100,512:100,513:100,514:100,515:100,516:100,517:100,518:100,519:100,520:100,521:100,522:100,523:100,525:100,526:100,528:100,529:100,530:100,531:100,532:100,533:100,534:100,535:100,536:100,537:100,538:100,539:100,601:100,602:100,603:100,604:100,605:100,606:100,607:100,608:100,609:100,610:100
-prontera.gat,167,206,6 shop ’b–艮ê–å“X 90,714:100,715:100,716:100,717:100,718:100,719:100,720:100,721:100,722:100,723:100,724:100,725:100,726:100,727:100,728:100,729:100,730:100,731:100,732:100,733:100,756:100,757:100,984:100,985:100,990:100,991:100,992:100,993:100,994:100,995:100,996:100,997:100,1010:100,1011:100,998:100,999:100,1000:100,1001:100,1002:100,1003:100,913:100,920:100,718:100,958:100,957:100,922:100,963:100,923:100,968:100,1005:100,612:100,615:100,989:100
-prontera.gat,164,204,5 shop “ú–{ŒÀ’è•i“X 81,542:100,543:100,1766:100
-// ƒvƒƒ“ƒeƒ‰’†‰›“ì
-prontera.gat,141,175,5 shop ‹|‰® 102,1705:100,1711:100,1716:100,1719:100,1720:100,1750:1,1751:1,1752:1,1753:1,1754:1,1755:1,1756:1,1766:1,1065:1
-prontera.gat,141,173,5 shop Œ•‰® 102,1117:100,1125:100,1155:100,1162:100,1130:100,1131:100,1132:100,1133:100,1134:100,1135:100,1136:100,1137:100,1138:100,1139:100,1140:100,1141:100,1161:100,1162:100,1163:100,1164:100,1165:100,1166:100,1167:100,1168:100,1169:100,1170:100
-prontera.gat,141,171,5 shop ‘„‰® 102,1408:100,1461:100,1464:100,1413:100,1414:100,1415:100,1416:100,1466:100,1467:100,1468:100,1469:100,1470:100,1471:100
-prontera.gat,141,169,5 shop •€‰® 102,1352:100,1355:100,1361:100,1363:100,1364:100,1365:100,1366:100,1367:100,1368:100,1369:100
-prontera.gat,141,167,5 shop ’ZŒ•‰® 102,1208:100,1220:100,1223:100,1224:100,1225:100,1226:100,1227:100,1228:100,1229:100,1230:100,1231:100,1232:100,1233:100,1234:100,1235:100,1236:100,1237:100
-prontera.gat,141,165,5 shop “݊퉮 102,1505:100,1520:100,1514:100,1517:100,1522:100,1523:100,1524:100,1525:100,1526:100,1527:100,1528:100
-prontera.gat,141,163,5 shop ƒJƒ^[ƒ‹‰® 102,1251:100,1253:100,1255:100,1256:100,1257:100,1258:100,1259:100,1260:100,1261:100
-prontera.gat,141,161,5 shop ñ‰® 102,1602:100,1608:100,1611:100,1613:100,1614:100,1615:100
-prontera.gat,141,159,5 shop –{‰® 102,1550:100,1551:100,1552:100,1553:100,1554:100,1555:100,1556:100,1557:100,1558:100
-prontera.gat,141,177,5 shop –h‹ï‰® 102,2306:100,2339:100,2311:100,2331:100,2336:100,2337:100,2326:100,2327:100,2315:100,2317:100,2102:100,2104:100,2106:100,2108:100,2402:100,2404:100,2406:100,2407:100,2408:100,2409:100,2502:100,2504:100,2506:100,2507:100,2508:100
-
-// ƒeƒCƒ~ƒ“ƒO¤l
-prontera.gat,218,211,4 shop ƒeƒCƒ~ƒ“ƒO¤l 125,537:2500,643:3000,10013:1500,10014:2000
-izlude.gat,164,138,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
-morocc.gat,269,167,4 shop ƒeƒCƒ~ƒ“ƒO¤l 125,537:2500,643:3000,10013:1500,10014:2000
-geffen.gat,193,152,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
-payon.gat,142,104,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
-
-// EOF //
+// ƒvƒƒ“ƒeƒ‰•¬…Žü•Ó
+prontera.gat,156,192,3 shop ƒJ[ƒhƒVƒ‡ƒbƒv1 95,4001:100,4002:100,4003:100,4004:100,4005:100,4006:100,4007:100,4008:100,4009:100,4010:100,4011:100,4012:100,4013:100,4014:100,4015:100,4016:100,4017:100,4018:100,4019:100,4020:100,4021:100,4022:100,4023:100,4024:100,4025:100,4026:100,4027:100,4028:100,4029:100,4030:100,4031:100,4032:100,4033:100,4034:100,4035:100,4036:100,4037:100,4038:100,4039:100,4040:100,4041:100,4042:100,4043:100,4044:100,4045:100,4046:100,4047:100,4048:100,4049:100,4050:100
+prontera.gat,154,192,1 shop ƒJ[ƒhƒVƒ‡ƒbƒv2 123,4051:100,4052:100,4053:100,4054:100,4055:100,4056:100,4057:100,4058:100,4059:100,4060:100,4061:100,4062:100,4063:100,4064:100,4065:100,4066:100,4067:100,4068:100,4069:100,4070:100,4071:100,4072:100,4073:100,4074:100,4075:100,4076:100,4077:100,4078:100,4079:100,4080:100,4081:100,4082:100,4083:100,4084:100,4085:100,4086:100,4087:100,4088:100,4089:100,4090:100,4091:100,4092:100,4093:100,4094:100,4095:100,4096:100,4097:100,4098:100,4099:100,4100:100
+prontera.gat,158,192,1 shop ƒJ[ƒhƒVƒ‡ƒbƒv3 67,4101:100,4102:100,4103:100,4104:100,4105:100,4106:100,4107:100,4108:100,4109:100,4110:100,4111:100,4112:100,4113:100,4114:100,4115:100,4116:100,4117:100,4118:100,4119:100,4120:100,4121:100,4122:100,4123:100,4124:100,4125:100,4126:100,4127:100,4128:100,4129:100,4130:100,4131:100,4132:100,4133:100,4134:100,4135:100,4136:100,4137:100,4138:100,4139:100,4140:100,4141:100,4142:100,4143:100,4144:100,4145:100,4146:100,4147:100,4148:100
+prontera.gat,144,205,1 shop “ª‘•”õ‰®1 71,2201:100,2202:100,2203:100,2204:100,2205:100,2206:100,2207:100,2208:100,2209:100,2210:100,2211:100,2212:100,2213:100,2214:100,2215:100,2216:100,2217:100,2218:100,2219:100,2220:100,2221:100,2222:100,2223:100,2224:100,2225:100,2226:100,2227:100,2228:100,2229:100,2230:100,2231:100,2232:100,2233:100,2234:100,2235:100,2236:100,2237:100,2239:100,2240:100,2241:100,2242:100,2243:100,2244:100,2245:100,2246:100,2247:100,2248:100,2249:100,2250:100
+prontera.gat,144,203,3 shop “ª‘•”õ‰®2 101,2251:100,2252:100,2253:100,2254:100,2255:100,2256:100,2257:100,2258:100,2259:100,2260:100,2261:100,2262:100,2263:100,2264:100,2265:100,2266:100,2267:100,2268:100,2269:100,2270:100,2271:100,2272:100,2273:100,2274:100,2275:100,2276:100,2277:100,2278:100,2279:100,2280:100,2281:100,2282:100,2283:100,2284:100,2285:100,2286:100,2287:100,2288:100,2289:100,2290:100,2291:100,2292:100,2293:100,2294:100,2295:100,2296:100,2297:100,2298:100,2299:100
+prontera.gat,144,201,3 shop “ª‘•”õ‰®3 69,5001:100,5002:100,5003:100,5004:100,5005:100,5006:100,5007:100,5008:100,5009:100,5010:100,5011:100,5012:100,5013:100,5014:100,5015:100,5016:100,5017:100,5018:100,5019:100
+prontera.gat,167,202,5 shop ƒAƒNƒZƒTƒŠ[ƒVƒ‡ƒbƒv 102,2601:100,2602:100,2603:100,2604:100,2605:100,2607:100,2608:100,2609:100,2610:100,2611:100,2612:100,2613:100,2614:100,2615:100,2616:100,2617:100,2618:100,2619:100,2620:100,2621:100,2622:100,2623:100,2624:100,2625:100,2626:100,2627:100,2628:100
+prontera.gat,167,204,6 shop ŽG‰Ý‰® 96,501:100,502:100,503:100,504:100,505:100,506:100,507:100,508:100,509:100,510:100,511:100,512:100,513:100,514:100,515:100,516:100,517:100,518:100,519:100,520:100,521:100,522:100,523:100,525:100,526:100,528:100,529:100,530:100,531:100,532:100,533:100,534:100,535:100,536:100,537:100,538:100,539:100,601:100,602:100,603:100,604:100,605:100,606:100,607:100,608:100,609:100,610:100
+prontera.gat,167,206,6 shop ’b–艮ê–å“X 90,714:100,715:100,716:100,717:100,718:100,719:100,720:100,721:100,722:100,723:100,724:100,725:100,726:100,727:100,728:100,729:100,730:100,731:100,732:100,733:100,756:100,757:100,984:100,985:100,990:100,991:100,992:100,993:100,994:100,995:100,996:100,997:100,1010:100,1011:100,998:100,999:100,1000:100,1001:100,1002:100,1003:100,913:100,920:100,718:100,958:100,957:100,922:100,963:100,923:100,968:100,1005:100,612:100,615:100,989:100
+prontera.gat,164,204,5 shop “ú–{ŒÀ’è•i“X 81,542:100,543:100,1766:100
+// ƒvƒƒ“ƒeƒ‰’†‰›“ì
+prontera.gat,141,175,5 shop ‹|‰® 102,1705:100,1711:100,1716:100,1719:100,1720:100,1750:1,1751:1,1752:1,1753:1,1754:1,1755:1,1756:1,1766:1,1065:1
+prontera.gat,141,173,5 shop Œ•‰® 102,1117:100,1125:100,1155:100,1162:100,1130:100,1131:100,1132:100,1133:100,1134:100,1135:100,1136:100,1137:100,1138:100,1139:100,1140:100,1141:100,1161:100,1162:100,1163:100,1164:100,1165:100,1166:100,1167:100,1168:100,1169:100,1170:100
+prontera.gat,141,171,5 shop ‘„‰® 102,1408:100,1461:100,1464:100,1413:100,1414:100,1415:100,1416:100,1466:100,1467:100,1468:100,1469:100,1470:100,1471:100
+prontera.gat,141,169,5 shop •€‰® 102,1352:100,1355:100,1361:100,1363:100,1364:100,1365:100,1366:100,1367:100,1368:100,1369:100
+prontera.gat,141,167,5 shop ’ZŒ•‰® 102,1208:100,1220:100,1223:100,1224:100,1225:100,1226:100,1227:100,1228:100,1229:100,1230:100,1231:100,1232:100,1233:100,1234:100,1235:100,1236:100,1237:100
+prontera.gat,141,165,5 shop “݊퉮 102,1505:100,1520:100,1514:100,1517:100,1522:100,1523:100,1524:100,1525:100,1526:100,1527:100,1528:100
+prontera.gat,141,163,5 shop ƒJƒ^[ƒ‹‰® 102,1251:100,1253:100,1255:100,1256:100,1257:100,1258:100,1259:100,1260:100,1261:100
+prontera.gat,141,161,5 shop ñ‰® 102,1602:100,1608:100,1611:100,1613:100,1614:100,1615:100
+prontera.gat,141,159,5 shop –{‰® 102,1550:100,1551:100,1552:100,1553:100,1554:100,1555:100,1556:100,1557:100,1558:100
+prontera.gat,141,177,5 shop –h‹ï‰® 102,2306:100,2339:100,2311:100,2331:100,2336:100,2337:100,2326:100,2327:100,2315:100,2317:100,2102:100,2104:100,2106:100,2108:100,2402:100,2404:100,2406:100,2407:100,2408:100,2409:100,2502:100,2504:100,2506:100,2507:100,2508:100
+
+// ƒeƒCƒ~ƒ“ƒO¤l
+prontera.gat,218,211,4 shop ƒeƒCƒ~ƒ“ƒO¤l 125,537:2500,643:3000,10013:1500,10014:2000
+izlude.gat,164,138,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
+morocc.gat,269,167,4 shop ƒeƒCƒ~ƒ“ƒO¤l 125,537:2500,643:3000,10013:1500,10014:2000
+geffen.gat,193,152,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
+payon.gat,142,104,4 shop ƒeƒCƒ~ƒ“ƒO¤l 124,537:2500,643:3000,10013:1500,10014:2000
+
+// EOF //
diff --git a/npc/sample/npc_test_arena.txt b/npc/sample/npc_test_arena.txt
index 52766e750..1704c57bf 100644
--- a/npc/sample/npc_test_arena.txt
+++ b/npc/sample/npc_test_arena.txt
@@ -1,104 +1,104 @@
-// ------------------------------------------------------------------
-// ƒAƒŠ|ƒi‚ÌÝ’è
-// ------------------------------------------------------------------
-
-// ŽŸ‚̃}ƒbƒv‚ðŽg‚¢‚Ü‚·
-//map: prontera.gat
-//map: prt_are_in.gat
-//map: force_1-1.gat
-
-// ƒeƒŒƒ|‚È‚Ç‚Ì‹ÖŽ~ˆ—
-prt_are_in.gat mapflag nomemo dummy
-prt_are_in.gat mapflag noteleport dummy
-prt_are_in.gat mapflag nosave prontera.gat,156,191
-force_1-1.gat mapflag nomemo dummy
-force_1-1.gat mapflag noteleport dummy
-force_1-1.gat mapflag nosave prontera.gat,156,191
-
-// ƒvƒƒ“ƒeƒ‰‚É“ü‚èŒû‚ð’u‚­
-prontera.gat,160,185,0 script ƒAƒŠ[ƒi“ü‚èŒû 116,{
- mes "ƒAƒŠ[ƒi“ü‚èŒû‚É”ò‚Ñ‚Ü‚·‚©H";
- next;
- menu "”ò‚Ô",L_GOARENA,"‚â‚ß‚é",L_YAME;
-L_GOARENA:
- warp "prt_are_in.gat",31,82;
- close;
-L_YAME:
- close;
-}
-
-// ‘Ò‹@Žº‚©‚瀔õŽº‚Ö‚Ì“]‘—
-prt_are_in.gat,29,79,0 script ƒ^ƒCƒ€ƒAƒ^ƒbƒN‚P 116,{
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
- mes "‚±‚±‚̓^ƒCƒ€ƒAƒ^ƒbƒNLv1‚Å‚·";
- mes "’§í‚µ‚Ü‚·‚©H";
- menu "‚Í‚¢",L_GOLV1,"‚â‚ß‚é",L_YAME;
-L_GOLV1:
- if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
- disablenpc "fc103-1";
- disablenpc "fc105";
- disablenpc "fc107";
- addtimer 5000,"arenatestev0000";
- warp "force_1-1.gat",99,12;
- end;
-L_WAIT:
- mes "Œ»Ý’§í’†‚Ì•û‚ª‚¢‚Ü‚·‚Ì‚ÅA";
- mes "‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢B";
-L_YAME:
- close;
-}
-
-// €”õŽºi‚P‚O•b€”õŠúŠÔj
-force_1-1.gat,99,12,0 script arenatestev0000 -1,{
- announce "‚P‚O•bŒã‚ÉŠJŽn‚µ‚Ü‚·",3;
- addtimer 10000,"arenatestev0001";
-}
-
-// ŽÀÛ‚Ì•”‰®‚Ö‚Ì“]‘—‚ÆMOB‚ÌÝ’è
-force_1-1.gat,99,12,0 script arenatestev0001 -1,{
- killmonster "force_1-1.gat","arenatestev1000";
- monster "force_1-1.gat",25,25,"--ja--",1002,1,"arenatestev1000";
- monster "force_1-1.gat",20,25,"--ja--",1002,1,"arenatestev1000";
- monster "force_1-1.gat",25,20,"--ja--",1002,1,"arenatestev1000";
- monster "force_1-1.gat",30,25,"--ja--",1002,1,"arenatestev1000";
- monster "force_1-1.gat",25,30,"--ja--",1002,1,"arenatestev1000";
- set $arenatest00,5;
- disablenpc "fc101";
- disablenpc "fc103";
- warp "force_1-1.gat",25,26;
- enablenpc "fc103-1";
- enablenpc "fc105";
- enablenpc "fc107";
- announce "30•bˆÈ“à‚ÉŸr–Å‚¹‚æ",19;
- addtimer 30000,"arenatestev8000";
-}
-
-// “|‚µ‚½ˆ—
-force_1-1.gat,25,26,0 script arenatestev1000 -1,{
- set $arenatest00, $arenatest00 - 1;
- if( $arenatest00 > 0 ) goto L_CONT;
- deltimer "arenatestev8000";
- announce "ƒNƒ‰ƒbƒVƒ…!!",3;
- enablenpc "fc101";
- enablenpc "fc103";
- areaannounce "prt_are_in.gat",25,75,40,90,
- strcharinfo(0) + " ‚ªƒ^ƒCƒ€ƒAƒ^ƒbƒNLv1‚ðƒNƒŠƒA‚µ‚Ü‚µ‚½",0;
- addtimer 5000,"arenatestev9000";
-L_CONT:
- end;
-}
-
-// ƒ^ƒCƒ€ƒAƒEƒg
-force_1-1.gat,25,26,0 script arenatestev8000 -1,{
- set $arenatest00,99;
- killmonster "force_1-1.gat","arenatestev1000";
- announce "ƒ^ƒCƒ€ƒI[ƒo[!!",3;
- areaannounce "prt_are_in.gat",25,75,40,90,
- strcharinfo(0) + " ‚ªƒ^ƒCƒ€ƒAƒ^ƒbƒNLv1‚ÉŽ¸”s‚µ‚Ü‚µ‚½",0;
- addtimer 5000,"arenatestev9000";
-}
-
-// ƒvƒƒ“ƒeƒ‰‚É‹A‚é
-force_1-1.gat,25,26,0 script arenatestev9000 -1,{
- warp "prontera.gat",156,191;
-}
+// ------------------------------------------------------------------
+// ƒAƒŠ|ƒi‚ÌÝ’è
+// ------------------------------------------------------------------
+
+// ŽŸ‚̃}ƒbƒv‚ðŽg‚¢‚Ü‚·
+//map: prontera.gat
+//map: prt_are_in.gat
+//map: force_1-1.gat
+
+// ƒeƒŒƒ|‚È‚Ç‚Ì‹ÖŽ~ˆ—
+prt_are_in.gat mapflag nomemo dummy
+prt_are_in.gat mapflag noteleport dummy
+prt_are_in.gat mapflag nosave prontera.gat,156,191
+force_1-1.gat mapflag nomemo dummy
+force_1-1.gat mapflag noteleport dummy
+force_1-1.gat mapflag nosave prontera.gat,156,191
+
+// ƒvƒƒ“ƒeƒ‰‚É“ü‚èŒû‚ð’u‚­
+prontera.gat,160,185,0 script ƒAƒŠ[ƒi“ü‚èŒû 116,{
+ mes "ƒAƒŠ[ƒi“ü‚èŒû‚É”ò‚Ñ‚Ü‚·‚©H";
+ next;
+ menu "”ò‚Ô",L_GOARENA,"‚â‚ß‚é",L_YAME;
+L_GOARENA:
+ warp "prt_are_in.gat",31,82;
+ close;
+L_YAME:
+ close;
+}
+
+// ‘Ò‹@Žº‚©‚瀔õŽº‚Ö‚Ì“]‘—
+prt_are_in.gat,29,79,0 script ƒ^ƒCƒ€ƒAƒ^ƒbƒN‚P 116,{
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+ mes "‚±‚±‚̓^ƒCƒ€ƒAƒ^ƒbƒNLv1‚Å‚·";
+ mes "’§í‚µ‚Ü‚·‚©H";
+ menu "‚Í‚¢",L_GOLV1,"‚â‚ß‚é",L_YAME;
+L_GOLV1:
+ if( getmapusers("force_1-1.gat")>0 ) goto L_WAIT;
+ disablenpc "fc103-1";
+ disablenpc "fc105";
+ disablenpc "fc107";
+ addtimer 5000,"arenatestev0000";
+ warp "force_1-1.gat",99,12;
+ end;
+L_WAIT:
+ mes "Œ»Ý’§í’†‚Ì•û‚ª‚¢‚Ü‚·‚Ì‚ÅA";
+ mes "‚µ‚΂炭‚¨‘Ò‚¿‚­‚¾‚³‚¢B";
+L_YAME:
+ close;
+}
+
+// €”õŽºi‚P‚O•b€”õŠúŠÔj
+force_1-1.gat,99,12,0 script arenatestev0000 -1,{
+ announce "‚P‚O•bŒã‚ÉŠJŽn‚µ‚Ü‚·",3;
+ addtimer 10000,"arenatestev0001";
+}
+
+// ŽÀÛ‚Ì•”‰®‚Ö‚Ì“]‘—‚ÆMOB‚ÌÝ’è
+force_1-1.gat,99,12,0 script arenatestev0001 -1,{
+ killmonster "force_1-1.gat","arenatestev1000";
+ monster "force_1-1.gat",25,25,"--ja--",1002,1,"arenatestev1000";
+ monster "force_1-1.gat",20,25,"--ja--",1002,1,"arenatestev1000";
+ monster "force_1-1.gat",25,20,"--ja--",1002,1,"arenatestev1000";
+ monster "force_1-1.gat",30,25,"--ja--",1002,1,"arenatestev1000";
+ monster "force_1-1.gat",25,30,"--ja--",1002,1,"arenatestev1000";
+ set $arenatest00,5;
+ disablenpc "fc101";
+ disablenpc "fc103";
+ warp "force_1-1.gat",25,26;
+ enablenpc "fc103-1";
+ enablenpc "fc105";
+ enablenpc "fc107";
+ announce "30•bˆÈ“à‚ÉŸr–Å‚¹‚æ",19;
+ addtimer 30000,"arenatestev8000";
+}
+
+// “|‚µ‚½ˆ—
+force_1-1.gat,25,26,0 script arenatestev1000 -1,{
+ set $arenatest00, $arenatest00 - 1;
+ if( $arenatest00 > 0 ) goto L_CONT;
+ deltimer "arenatestev8000";
+ announce "ƒNƒ‰ƒbƒVƒ…!!",3;
+ enablenpc "fc101";
+ enablenpc "fc103";
+ areaannounce "prt_are_in.gat",25,75,40,90,
+ strcharinfo(0) + " ‚ªƒ^ƒCƒ€ƒAƒ^ƒbƒNLv1‚ðƒNƒŠƒA‚µ‚Ü‚µ‚½",0;
+ addtimer 5000,"arenatestev9000";
+L_CONT:
+ end;
+}
+
+// ƒ^ƒCƒ€ƒAƒEƒg
+force_1-1.gat,25,26,0 script arenatestev8000 -1,{
+ set $arenatest00,99;
+ killmonster "force_1-1.gat","arenatestev1000";
+ announce "ƒ^ƒCƒ€ƒI[ƒo[!!",3;
+ areaannounce "prt_are_in.gat",25,75,40,90,
+ strcharinfo(0) + " ‚ªƒ^ƒCƒ€ƒAƒ^ƒbƒNLv1‚ÉŽ¸”s‚µ‚Ü‚µ‚½",0;
+ addtimer 5000,"arenatestev9000";
+}
+
+// ƒvƒƒ“ƒeƒ‰‚É‹A‚é
+force_1-1.gat,25,26,0 script arenatestev9000 -1,{
+ warp "prontera.gat",156,191;
+}
diff --git a/npc/sample/npc_test_array.txt b/npc/sample/npc_test_array.txt
index 9d77843c8..9f1fd219c 100644
--- a/npc/sample/npc_test_array.txt
+++ b/npc/sample/npc_test_array.txt
@@ -1,35 +1,35 @@
-// ”z—ñ‚̃eƒXƒg
-prontera.gat,164,190,1 script ”z—ñƒeƒXƒg 112,{
- set @hoge[0],1;
- set @hoge[1],5;
- mes "hoge[2]‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢";
- next;
- input @hoge[2];
- mes "hoge => " + @hoge;
- mes "hoge[0]=> " + @hoge[0];
- mes "hoge[1]=> " + @hoge[1];
- mes "hoge[2]=> " + @hoge[2];
- next;
- setarray @hoge[1],2,3,4,5;
- mes "true: 5,1,2,3,4";
- mes "hoge size = "+ getarraysize(@hoge);
- mes "hoge[0]=> " + @hoge[0];
- mes "hoge[1]=> " + @hoge[1];
- mes "hoge[2]=> " + @hoge[2];
- mes "hoge[3]=> " + @hoge[3];
- next;
- copyarray @fuga[0],@hoge[2],2;
- mes "true: 3,4,0";
- mes "fuga[0]=> " + @fuga[0];
- mes "fuga[1]=> " + @fuga[1];
- mes "fuga[2]=> " + @fuga[2];
- next;
- deletearray @hoge[1],2;
- mes "true: 1,4,5,0";
- mes "hoge[0]=> " + @hoge[0];
- mes "hoge[1]=> " + @hoge[1];
- mes "hoge[2]=> " + @hoge[2];
- mes "hoge[3]=> " + @hoge[3];
-
- close;
-}
+// ”z—ñ‚̃eƒXƒg
+prontera.gat,164,190,1 script ”z—ñƒeƒXƒg 112,{
+ set @hoge[0],1;
+ set @hoge[1],5;
+ mes "hoge[2]‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢";
+ next;
+ input @hoge[2];
+ mes "hoge => " + @hoge;
+ mes "hoge[0]=> " + @hoge[0];
+ mes "hoge[1]=> " + @hoge[1];
+ mes "hoge[2]=> " + @hoge[2];
+ next;
+ setarray @hoge[1],2,3,4,5;
+ mes "true: 5,1,2,3,4";
+ mes "hoge size = "+ getarraysize(@hoge);
+ mes "hoge[0]=> " + @hoge[0];
+ mes "hoge[1]=> " + @hoge[1];
+ mes "hoge[2]=> " + @hoge[2];
+ mes "hoge[3]=> " + @hoge[3];
+ next;
+ copyarray @fuga[0],@hoge[2],2;
+ mes "true: 3,4,0";
+ mes "fuga[0]=> " + @fuga[0];
+ mes "fuga[1]=> " + @fuga[1];
+ mes "fuga[2]=> " + @fuga[2];
+ next;
+ deletearray @hoge[1],2;
+ mes "true: 1,4,5,0";
+ mes "hoge[0]=> " + @hoge[0];
+ mes "hoge[1]=> " + @hoge[1];
+ mes "hoge[2]=> " + @hoge[2];
+ mes "hoge[3]=> " + @hoge[3];
+
+ close;
+}
diff --git a/npc/sample/npc_test_chat.txt b/npc/sample/npc_test_chat.txt
index 267dc4b66..6f29a2718 100644
--- a/npc/sample/npc_test_chat.txt
+++ b/npc/sample/npc_test_chat.txt
@@ -1,28 +1,28 @@
-
-
-prontera.gat,158,182,0 script chatƒeƒXƒg::test0001 116,{
- mes "ƒgƒŠƒK[l”" + getwaitingroomstate(2);
- mes "ƒgƒŠƒK[ó‘Ô" + getwaitingroomstate(3);
- menu "—LŒø‰»",L_ENA,"–³Œø‰»",L_DISA,"íœ",L_DEL,"ì¬",L_MAKE;
- close;
-L_ENA:
- enablewaitingroomevent;
- close;
-L_DISA:
- disablewaitingroomevent;
- close;
-L_DEL:
- delwaitingroom;
- close;
-L_MAKE:
- waitingroom "ƒeƒXƒg",15,"test0001::OnChatEvent",1;
- close;
-OnInit:
- waitingroom "ƒeƒXƒg",15,"test0001::OnChatEvent",1;
- end;
-OnChatEvent:
- disablewaitingroomevent;
- warpwaitingpc "prontera.gat",160,180;
- end;
-
-}
+
+
+prontera.gat,158,182,0 script chatƒeƒXƒg::test0001 116,{
+ mes "ƒgƒŠƒK[l”" + getwaitingroomstate(2);
+ mes "ƒgƒŠƒK[ó‘Ô" + getwaitingroomstate(3);
+ menu "—LŒø‰»",L_ENA,"–³Œø‰»",L_DISA,"íœ",L_DEL,"ì¬",L_MAKE;
+ close;
+L_ENA:
+ enablewaitingroomevent;
+ close;
+L_DISA:
+ disablewaitingroomevent;
+ close;
+L_DEL:
+ delwaitingroom;
+ close;
+L_MAKE:
+ waitingroom "ƒeƒXƒg",15,"test0001::OnChatEvent",1;
+ close;
+OnInit:
+ waitingroom "ƒeƒXƒg",15,"test0001::OnChatEvent",1;
+ end;
+OnChatEvent:
+ disablewaitingroomevent;
+ warpwaitingpc "prontera.gat",160,180;
+ end;
+
+}
diff --git a/npc/sample/npc_test_ev.txt b/npc/sample/npc_test_ev.txt
index a324f8800..e0303a61f 100644
--- a/npc/sample/npc_test_ev.txt
+++ b/npc/sample/npc_test_ev.txt
@@ -1,146 +1,146 @@
-// ƒCƒxƒ“ƒg‚̃eƒXƒg‚Ɖðà
-//
-
-
-// * NPC‚Ì•\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒg‚É‚È‚èAŽÀs‰Â”\‚É‚È‚è‚Ü‚·B
-// * ’Êí‚ÌNPC‚Å‚àˆÈ‰º‚̃‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚ðŽg‚¤‚±‚ƂŃCƒxƒ“ƒg‚É‚È‚ê‚Ü‚·B
-// * NPCƒXƒNƒŠƒvƒg‚ÅOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚·‚é‚ÆA
-// ƒ‰ƒxƒ‹•t‚«‚̃Cƒxƒ“ƒg‚Æ‚µ‚ăGƒNƒXƒ|[ƒg‚µAŽÀs‰Â”\‚É‚È‚è‚Ü‚·B
-// * NPCƒCƒxƒ“ƒg‚Å"NPC–¼(orƒCƒxƒ“ƒg–¼)::ƒ‰ƒxƒ‹–¼"‚Æ‚·‚é‚ÆA
-// Žw’肵‚½ƒ‰ƒxƒ‹‚©‚çŽÀs‚Å‚«‚Ü‚·B
-// * ƒ‰ƒxƒ‹–¼‚Í24ƒoƒCƒgˆÈ“à‚É‚µ‚ĉº‚³‚¢B
-
-
-// ------------------------------------------------------------------
-// ƒCƒxƒ“ƒg‚Ì‹N‚±‚µ•û/‹N‚±‚è•û
-// ------------------------------------------------------------------
-
-// 1.doeventƒRƒ}ƒ“ƒh‚Å‹N‚±‚·
-// 2.MOB‚ð“|‚µ‚½‚Æ‚«‚É‹N‚±‚·
-// @a. ƒXƒNƒŠƒvƒgmonsterƒRƒ}ƒ“ƒh‚Ì‘æ‚Vˆø”‚ŃCƒxƒ“ƒg–¼‚ðÝ’è
-// b. monster‚Ì”z’u‚ÌÅŒã‚̈ø”‚ŃCƒxƒ“ƒg–¼‚ðÝ’è
-// 3.ƒ}ƒbƒv‰Šú‰»Žž‚É‹N‚±‚éiOnInitj
-// 4.NPCƒ`ƒƒƒbƒgƒ‹[ƒ€‚ª–žˆõ‚É‚È‚Á‚½‚Æ‚«‚É‹N‚±‚é
-// 5.ŽžŒv‚É‚æ‚Á‚Ä‹N‚±‚é
-// (OnMinute??,OnHour??,OnClock????,OnDate????) : ?‚Í”Žš
-
-// 3,5‚̉Šú‰»ƒCƒxƒ“ƒgAŽžŒvƒCƒxƒ“ƒg‚ÍA‘ÎÛ‚ÌPC‚ðŽ‚½‚È‚¢ƒCƒxƒ“ƒg‚É‚È‚è‚Ü‚·
-// ‚æ‚Á‚ÄPC‚ð‘ÎÛ‚Æ‚·‚éƒXƒNƒŠƒvƒg‚ðŽg‚¤‚±‚Æ‚Ío—ˆ‚Ü‚¹‚ñB
-// ‚Ü‚½AannounceƒRƒ}ƒ“ƒh‚È‚Ç‚Í0x08ƒtƒ‰ƒO‚ðŽw’肵‚ÄNPCŽå‘Ì‚É‚·‚é•K—v‚ª‚ ‚è‚Ü‚·
-
-// ----------ƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
-// ƒNƒŠƒbƒN‚·‚é‚ƃCƒxƒ“ƒguevent_test2v‚ð‹N‚±‚·NPC
-prontera.gat,155,180,0 script ev_doƒeƒXƒg 116,{
- doevent "event_test2";
-}
-
-// ----------MOB‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
-// “|‚·‚ƃCƒxƒ“ƒguevent_testv‚ð‹N‚±‚·ƒ‚ƒ“ƒXƒ^[‚Ì[¢Š«]
-prontera.gat,150,185,0 script ev_mobƒeƒXƒg 116,{
- monster "this",0,0,"Event_Mob2",1002,1,"event_test";
-}
-
-// ----------MOB‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹2-------------
-// “|‚·‚ƃCƒxƒ“ƒguevent_test3v‚ð‹N‚±‚·ƒ‚ƒ“ƒXƒ^[‚Ì[”z’u]
-prontera.gat,150,180,0 monster Event_Mob 1008,1,0,0,event_test3
-
-// ----------ƒ^ƒCƒ}‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
-// ƒNƒŠƒbƒN‚·‚é‚Æ‚T•bŒã‚Ƀ‰ƒxƒ‹uOnTimerv‚ðŽÀs‚·‚éNPC
-// iƒCƒxƒ“ƒg–¼‚ÉuNPC–¼::On`‚ÅŽn‚܂郉ƒxƒ‹v‚ðŽw’è‚·‚é‚ƃ‰ƒxƒ‹‚ðŽÀs‚Å‚«‚éj
-prontera.gat,155,185,0 script ev_timerƒeƒXƒg 116,{
- addtimer 5000,"ev_timerƒeƒXƒg::OnTimer";
- end;
-OnTimer:
- mes "‚T•bŒo‚¿‚Ü‚µ‚½";
- close;
-}
-
-// ----------OnInit/ƒ`ƒƒƒbƒgƒ‹[ƒ€‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
-// ƒ}ƒbƒvƒT[ƒo[‹N“®Žž‚Ƀ‰ƒxƒ‹uOnInitv‚ªŽÀs‚³‚êAƒ`ƒƒƒbƒg‚ðì‚é
-// ‚Ü‚½Awaitingroom‚Ì‘æ3ˆø”‚ɃCƒxƒ“ƒg‚ðÝ’è‚·‚é
-prontera.gat,145,180,0 script ev_initƒeƒXƒg 116,{
- end;
-OnInit:
- waitingroom "OnInitƒeƒXƒg",1,"ev_initƒeƒXƒg::OnMax";
- end;
-OnMax:
- warpwaitingpc "prontera.gat",155,190;
- end;
-
-}
-
-// ----------ŽžŒv‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
-// Žw’è‚ÌŽž‚â“ú•t‚ŃCƒxƒ“ƒg‚ðŽÀs‚·‚é
-// announce‚É0x08ƒtƒ‰ƒO‚ðŽw’肵‚Ä‚¢‚é‚Æ‚±‚ë‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
-prontera.gat,145,185,0 script ev_clockƒeƒXƒg 116,{
- end;
-// –ˆŽž5•ª
-OnMinute05:
- announce "–ˆŽž‚T•ª‚ð‚¨’m‚点‚µ‚Ü‚·",8;
- end;
-// –ˆ“ú12Žž(24H)
-OnHour12:
- announce "³Œß‚̃jƒ…[ƒX‚Å‚·",8;
- end;
-// 23Žž59•ª
-OnClock2359:
- announce "‚ ‚Æ‚P•ª‚Å–¾“ú‚Å‚·",8;
- end;
-// ‚PŒŽ‚P“ú
-OnDate0101:
- announce "‚ ‚¯‚Ü‚µ‚Ä‚¨‚ß‚Å‚Æ‚¤‚²‚´‚¢‚Ü‚·",8;
- end;
-}
-
-
-// ------------------------------------------------------------------
-// ƒCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚Ìì‚è•û
-// ------------------------------------------------------------------
-// •\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒgˆµ‚¢‚É‚È‚èA–¼‘O‚ªƒCƒxƒ“ƒg–¼‚É‚È‚éB
-// ƒGƒŠƒA‚ðŽw’肵‚È‚¢ê‡A“¯‚¶ƒ}ƒbƒv“à‚ªƒCƒxƒ“ƒg‚ð‹N‚±‚·”͈͂ɂȂéB
-// ƒGƒŠƒA‚ðŽw’è‚·‚éê‡A‹¤‚É-1‚É‚·‚é‚Æ“¯‚¶ƒ}ƒbƒvŽI‚È‚çƒ}ƒbƒv‚ªˆá‚Á‚Ä‚à
-// ‹ì“®‚·‚éBƒGƒŠƒA‚Í”¼Œa‚Å‚ ‚éB‚È‚¨AƒCƒxƒ“ƒg‚Ì‹N‚±‚éˆÊ’u‚Æ‚¢‚¤‚Ì‚ÍA
-// ‘ÎÛ‚Æ‚È‚éPC‚ÌÀ•W‚Å‚ ‚éB‚½‚Æ‚¦‚ÎA‰“‹——£UŒ‚‚ÅMOB‚ð“|‚µ‚½‚Æ‚«‚É
-// ‹N‚±‚éƒCƒxƒ“ƒg‚ÍMOB‚ÌÀ•W‚Å‚Í‚È‚­APC‚ÌÀ•W‚È‚Ì‚Å’ˆÓB
-
-// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ÍŽw’肵‚Ä‚¢‚È‚¢ƒTƒ“ƒvƒ‹------------
-// “¯‚¶ƒ}ƒbƒv“à‚ŃCƒxƒ“ƒguevent_testv‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
-prontera.gat,150,185,0 script event_test -1,{
- announce strcharinfo(0) + " ‚ª¢Š«MOB‚ð“|‚µ‚Ü‚µ‚½",2;
- close;
-}
-
-// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ðŽw’肵‚½ƒTƒ“ƒvƒ‹------------
-// (155,185)‚©‚甼Œa5ƒZƒ‹ˆÈ“à‚ŃCƒxƒ“ƒguevent_test2v‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
-prontera.gat,155,180,0 script event_test2 -1,5,5 {
- announce "‚TƒZƒ‹ˆÈ“à‚ŃNƒŠƒbƒN‚µ‚Ü‚µ‚½‚Ë",19;
- close;
-}
-
-// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ð-1‚É‚µ‚½ƒTƒ“ƒvƒ‹------------
-// “¯‚¶ƒ}ƒbƒvŽI‚ŃCƒxƒ“ƒguevent_test3v‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
-prontera.gat,150,180,0 script event_test3 -1,-1,-1 {
- mes "”z’uMOB“|‚µ‚Ü‚µ‚½‚Ë";
- close;
-}
-
-
-
-// ------------------------------------------------------------------
-// ƒCƒxƒ“ƒgƒ}ƒbƒv—p‚ÌÝ’è
-// ------------------------------------------------------------------
-// i‘S‚ăRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚Ü‚·j
-
-// ----------ƒZ[ƒu‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
-// ‚±‚̃}ƒbƒv‚ŃƒOƒAƒEƒg‚·‚é‚ÆA•K‚¸ ƒvƒƒ“ƒeƒ‰ ‚ÌÀ•W(156,190)‚É
-// ƒZ[ƒu‚³‚ê‚é
-//prontera.gat mapflag nosave prontera.gat,156,190
-
-// ----------ƒƒ‚‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
-// ‚±‚̃}ƒbƒv‚ł̓ƒ‚‚ª‚Æ‚ê‚È‚¢
-//prontera.gat mapflag nomemo dummy
-
-// ----------ƒeƒŒƒ|‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
-// ‚±‚̃}ƒbƒv‚Å‚Í”ˆA’±AƒeƒŒƒ|Aƒ|ƒ^‚ªŽg‚¦‚È‚¢
-// ’ˆÓFƒXƒNƒŠƒvƒg‚Ìwarp‚Ì"Random","SavePoint"‚ª–³Œø‚É‚È‚è‚Ü‚·
-//prontera.gat mapflag noteleport dummy
+// ƒCƒxƒ“ƒg‚̃eƒXƒg‚Ɖðà
+//
+
+
+// * NPC‚Ì•\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒg‚É‚È‚èAŽÀs‰Â”\‚É‚È‚è‚Ü‚·B
+// * ’Êí‚ÌNPC‚Å‚àˆÈ‰º‚̃‰ƒxƒ‹•t‚«ƒCƒxƒ“ƒg‚ðŽg‚¤‚±‚ƂŃCƒxƒ“ƒg‚É‚È‚ê‚Ü‚·B
+// * NPCƒXƒNƒŠƒvƒg‚ÅOn`‚ÅŽn‚܂郉ƒxƒ‹‚ð’è‹`‚·‚é‚ÆA
+// ƒ‰ƒxƒ‹•t‚«‚̃Cƒxƒ“ƒg‚Æ‚µ‚ăGƒNƒXƒ|[ƒg‚µAŽÀs‰Â”\‚É‚È‚è‚Ü‚·B
+// * NPCƒCƒxƒ“ƒg‚Å"NPC–¼(orƒCƒxƒ“ƒg–¼)::ƒ‰ƒxƒ‹–¼"‚Æ‚·‚é‚ÆA
+// Žw’肵‚½ƒ‰ƒxƒ‹‚©‚çŽÀs‚Å‚«‚Ü‚·B
+// * ƒ‰ƒxƒ‹–¼‚Í24ƒoƒCƒgˆÈ“à‚É‚µ‚ĉº‚³‚¢B
+
+
+// ------------------------------------------------------------------
+// ƒCƒxƒ“ƒg‚Ì‹N‚±‚µ•û/‹N‚±‚è•û
+// ------------------------------------------------------------------
+
+// 1.doeventƒRƒ}ƒ“ƒh‚Å‹N‚±‚·
+// 2.MOB‚ð“|‚µ‚½‚Æ‚«‚É‹N‚±‚·
+// @a. ƒXƒNƒŠƒvƒgmonsterƒRƒ}ƒ“ƒh‚Ì‘æ‚Vˆø”‚ŃCƒxƒ“ƒg–¼‚ðÝ’è
+// b. monster‚Ì”z’u‚ÌÅŒã‚̈ø”‚ŃCƒxƒ“ƒg–¼‚ðÝ’è
+// 3.ƒ}ƒbƒv‰Šú‰»Žž‚É‹N‚±‚éiOnInitj
+// 4.NPCƒ`ƒƒƒbƒgƒ‹[ƒ€‚ª–žˆõ‚É‚È‚Á‚½‚Æ‚«‚É‹N‚±‚é
+// 5.ŽžŒv‚É‚æ‚Á‚Ä‹N‚±‚é
+// (OnMinute??,OnHour??,OnClock????,OnDate????) : ?‚Í”Žš
+
+// 3,5‚̉Šú‰»ƒCƒxƒ“ƒgAŽžŒvƒCƒxƒ“ƒg‚ÍA‘ÎÛ‚ÌPC‚ðŽ‚½‚È‚¢ƒCƒxƒ“ƒg‚É‚È‚è‚Ü‚·
+// ‚æ‚Á‚ÄPC‚ð‘ÎÛ‚Æ‚·‚éƒXƒNƒŠƒvƒg‚ðŽg‚¤‚±‚Æ‚Ío—ˆ‚Ü‚¹‚ñB
+// ‚Ü‚½AannounceƒRƒ}ƒ“ƒh‚È‚Ç‚Í0x08ƒtƒ‰ƒO‚ðŽw’肵‚ÄNPCŽå‘Ì‚É‚·‚é•K—v‚ª‚ ‚è‚Ü‚·
+
+// ----------ƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
+// ƒNƒŠƒbƒN‚·‚é‚ƃCƒxƒ“ƒguevent_test2v‚ð‹N‚±‚·NPC
+prontera.gat,155,180,0 script ev_doƒeƒXƒg 116,{
+ doevent "event_test2";
+}
+
+// ----------MOB‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
+// “|‚·‚ƃCƒxƒ“ƒguevent_testv‚ð‹N‚±‚·ƒ‚ƒ“ƒXƒ^[‚Ì[¢Š«]
+prontera.gat,150,185,0 script ev_mobƒeƒXƒg 116,{
+ monster "this",0,0,"Event_Mob2",1002,1,"event_test";
+}
+
+// ----------MOB‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹2-------------
+// “|‚·‚ƃCƒxƒ“ƒguevent_test3v‚ð‹N‚±‚·ƒ‚ƒ“ƒXƒ^[‚Ì[”z’u]
+prontera.gat,150,180,0 monster Event_Mob 1008,1,0,0,event_test3
+
+// ----------ƒ^ƒCƒ}‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
+// ƒNƒŠƒbƒN‚·‚é‚Æ‚T•bŒã‚Ƀ‰ƒxƒ‹uOnTimerv‚ðŽÀs‚·‚éNPC
+// iƒCƒxƒ“ƒg–¼‚ÉuNPC–¼::On`‚ÅŽn‚܂郉ƒxƒ‹v‚ðŽw’è‚·‚é‚ƃ‰ƒxƒ‹‚ðŽÀs‚Å‚«‚éj
+prontera.gat,155,185,0 script ev_timerƒeƒXƒg 116,{
+ addtimer 5000,"ev_timerƒeƒXƒg::OnTimer";
+ end;
+OnTimer:
+ mes "‚T•bŒo‚¿‚Ü‚µ‚½";
+ close;
+}
+
+// ----------OnInit/ƒ`ƒƒƒbƒgƒ‹[ƒ€‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
+// ƒ}ƒbƒvƒT[ƒo[‹N“®Žž‚Ƀ‰ƒxƒ‹uOnInitv‚ªŽÀs‚³‚êAƒ`ƒƒƒbƒg‚ðì‚é
+// ‚Ü‚½Awaitingroom‚Ì‘æ3ˆø”‚ɃCƒxƒ“ƒg‚ðÝ’è‚·‚é
+prontera.gat,145,180,0 script ev_initƒeƒXƒg 116,{
+ end;
+OnInit:
+ waitingroom "OnInitƒeƒXƒg",1,"ev_initƒeƒXƒg::OnMax";
+ end;
+OnMax:
+ warpwaitingpc "prontera.gat",155,190;
+ end;
+
+}
+
+// ----------ŽžŒv‚É‚æ‚éƒCƒxƒ“ƒg‹ì“®‚̃Tƒ“ƒvƒ‹ -------------
+// Žw’è‚ÌŽž‚â“ú•t‚ŃCƒxƒ“ƒg‚ðŽÀs‚·‚é
+// announce‚É0x08ƒtƒ‰ƒO‚ðŽw’肵‚Ä‚¢‚é‚Æ‚±‚ë‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B
+prontera.gat,145,185,0 script ev_clockƒeƒXƒg 116,{
+ end;
+// –ˆŽž5•ª
+OnMinute05:
+ announce "–ˆŽž‚T•ª‚ð‚¨’m‚点‚µ‚Ü‚·",8;
+ end;
+// –ˆ“ú12Žž(24H)
+OnHour12:
+ announce "³Œß‚̃jƒ…[ƒX‚Å‚·",8;
+ end;
+// 23Žž59•ª
+OnClock2359:
+ announce "‚ ‚Æ‚P•ª‚Å–¾“ú‚Å‚·",8;
+ end;
+// ‚PŒŽ‚P“ú
+OnDate0101:
+ announce "‚ ‚¯‚Ü‚µ‚Ä‚¨‚ß‚Å‚Æ‚¤‚²‚´‚¢‚Ü‚·",8;
+ end;
+}
+
+
+// ------------------------------------------------------------------
+// ƒCƒxƒ“ƒgƒXƒNƒŠƒvƒg‚Ìì‚è•û
+// ------------------------------------------------------------------
+// •\Ž¦ƒNƒ‰ƒX‚ð-1‚É‚·‚é‚ƃCƒxƒ“ƒgˆµ‚¢‚É‚È‚èA–¼‘O‚ªƒCƒxƒ“ƒg–¼‚É‚È‚éB
+// ƒGƒŠƒA‚ðŽw’肵‚È‚¢ê‡A“¯‚¶ƒ}ƒbƒv“à‚ªƒCƒxƒ“ƒg‚ð‹N‚±‚·”͈͂ɂȂéB
+// ƒGƒŠƒA‚ðŽw’è‚·‚éê‡A‹¤‚É-1‚É‚·‚é‚Æ“¯‚¶ƒ}ƒbƒvŽI‚È‚çƒ}ƒbƒv‚ªˆá‚Á‚Ä‚à
+// ‹ì“®‚·‚éBƒGƒŠƒA‚Í”¼Œa‚Å‚ ‚éB‚È‚¨AƒCƒxƒ“ƒg‚Ì‹N‚±‚éˆÊ’u‚Æ‚¢‚¤‚Ì‚ÍA
+// ‘ÎÛ‚Æ‚È‚éPC‚ÌÀ•W‚Å‚ ‚éB‚½‚Æ‚¦‚ÎA‰“‹——£UŒ‚‚ÅMOB‚ð“|‚µ‚½‚Æ‚«‚É
+// ‹N‚±‚éƒCƒxƒ“ƒg‚ÍMOB‚ÌÀ•W‚Å‚Í‚È‚­APC‚ÌÀ•W‚È‚Ì‚Å’ˆÓB
+
+// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ÍŽw’肵‚Ä‚¢‚È‚¢ƒTƒ“ƒvƒ‹------------
+// “¯‚¶ƒ}ƒbƒv“à‚ŃCƒxƒ“ƒguevent_testv‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
+prontera.gat,150,185,0 script event_test -1,{
+ announce strcharinfo(0) + " ‚ª¢Š«MOB‚ð“|‚µ‚Ü‚µ‚½",2;
+ close;
+}
+
+// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ðŽw’肵‚½ƒTƒ“ƒvƒ‹------------
+// (155,185)‚©‚甼Œa5ƒZƒ‹ˆÈ“à‚ŃCƒxƒ“ƒguevent_test2v‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
+prontera.gat,155,180,0 script event_test2 -1,5,5 {
+ announce "‚TƒZƒ‹ˆÈ“à‚ŃNƒŠƒbƒN‚µ‚Ü‚µ‚½‚Ë",19;
+ close;
+}
+
+// ----------ƒCƒxƒ“ƒg‚ÅAƒGƒŠƒA‚ð-1‚É‚µ‚½ƒTƒ“ƒvƒ‹------------
+// “¯‚¶ƒ}ƒbƒvŽI‚ŃCƒxƒ“ƒguevent_test3v‚ª‹N‚±‚é‚ÆŽÀs‚³‚ê‚é
+prontera.gat,150,180,0 script event_test3 -1,-1,-1 {
+ mes "”z’uMOB“|‚µ‚Ü‚µ‚½‚Ë";
+ close;
+}
+
+
+
+// ------------------------------------------------------------------
+// ƒCƒxƒ“ƒgƒ}ƒbƒv—p‚ÌÝ’è
+// ------------------------------------------------------------------
+// i‘S‚ăRƒƒ“ƒgƒAƒEƒg‚µ‚Ä‚Ü‚·j
+
+// ----------ƒZ[ƒu‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
+// ‚±‚̃}ƒbƒv‚ŃƒOƒAƒEƒg‚·‚é‚ÆA•K‚¸ ƒvƒƒ“ƒeƒ‰ ‚ÌÀ•W(156,190)‚É
+// ƒZ[ƒu‚³‚ê‚é
+//prontera.gat mapflag nosave prontera.gat,156,190
+
+// ----------ƒƒ‚‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
+// ‚±‚̃}ƒbƒv‚ł̓ƒ‚‚ª‚Æ‚ê‚È‚¢
+//prontera.gat mapflag nomemo dummy
+
+// ----------ƒeƒŒƒ|‹ÖŽ~‚̃Tƒ“ƒvƒ‹---------
+// ‚±‚̃}ƒbƒv‚Å‚Í”ˆA’±AƒeƒŒƒ|Aƒ|ƒ^‚ªŽg‚¦‚È‚¢
+// ’ˆÓFƒXƒNƒŠƒvƒg‚Ìwarp‚Ì"Random","SavePoint"‚ª–³Œø‚É‚È‚è‚Ü‚·
+//prontera.gat mapflag noteleport dummy
diff --git a/npc/sample/npc_test_func.txt b/npc/sample/npc_test_func.txt
index db659fc1b..a484ccb48 100644
--- a/npc/sample/npc_test_func.txt
+++ b/npc/sample/npc_test_func.txt
@@ -1,27 +1,27 @@
-
-// ’l‚ð•Ô‚³‚È‚¢ŠÖ”
-function script func001 {
- mes "ƒ†[ƒU[’è‹`ŠÖ”";
- next;
- return; // È—ª‚Å‚«‚È‚¢
-}
-
-// ’l‚ð•Ô‚·ŠÖ”
-function script func002 {
- return "ƒ†[ƒU[’è‹`ŠÖ”‚Q";
-}
-
-// ŠÖ”‚̌ĂÑo‚µ‚ƃTƒuƒ‹[ƒeƒBƒ“‚̃eƒXƒg
-prontera.gat,168,189,1 script ŠÖ”ƒeƒXƒg 112,{
- callfunc "func001"; // ƒ†[ƒU[’è‹`ŠÖ”‚Í•¶Žš—ñ‚ÅŽw’è
- mes callfunc("func002");
- next;
- callsub L_SUB001; // ƒTƒuƒ‹[ƒeƒBƒ“‚̓‰ƒxƒ‹‚ð’¼ÚŽw’è
- close;
- end;
-
-L_SUB001:
- mes "ƒTƒuƒ‹[ƒeƒBƒ“";
- return; // È—ª‚Å‚«‚È‚¢
-}
-
+
+// ’l‚ð•Ô‚³‚È‚¢ŠÖ”
+function script func001 {
+ mes "ƒ†[ƒU[’è‹`ŠÖ”";
+ next;
+ return; // È—ª‚Å‚«‚È‚¢
+}
+
+// ’l‚ð•Ô‚·ŠÖ”
+function script func002 {
+ return "ƒ†[ƒU[’è‹`ŠÖ”‚Q";
+}
+
+// ŠÖ”‚̌ĂÑo‚µ‚ƃTƒuƒ‹[ƒeƒBƒ“‚̃eƒXƒg
+prontera.gat,168,189,1 script ŠÖ”ƒeƒXƒg 112,{
+ callfunc "func001"; // ƒ†[ƒU[’è‹`ŠÖ”‚Í•¶Žš—ñ‚ÅŽw’è
+ mes callfunc("func002");
+ next;
+ callsub L_SUB001; // ƒTƒuƒ‹[ƒeƒBƒ“‚̓‰ƒxƒ‹‚ð’¼ÚŽw’è
+ close;
+ end;
+
+L_SUB001:
+ mes "ƒTƒuƒ‹[ƒeƒBƒ“";
+ return; // È—ª‚Å‚«‚È‚¢
+}
+
diff --git a/npc/sample/npc_test_npctimer.txt b/npc/sample/npc_test_npctimer.txt
index f40d36847..d35c7d4c3 100644
--- a/npc/sample/npc_test_npctimer.txt
+++ b/npc/sample/npc_test_npctimer.txt
@@ -1,33 +1,33 @@
-
-prontera.gat,156,183,0 script NPCtimerƒeƒXƒg::npctimerX0000 116,{
- mes "ƒ^ƒCƒ}[’l" + getnpctimer(0);
- mes "ƒ^ƒCƒ}[ó‘Ô" + getnpctimer(1,"npctimerX0000");
- mes "ƒCƒxƒ“ƒgŒÂ”" + getnpctimer(2);
- menu "‰Šú‰»",L_INIT,"’âŽ~",L_STOP,"ÄŠJ",L_START,"Ý’è",L_SET;
- close;
-L_INIT:
- initnpctimer;
- close;
-L_STOP:
- stopnpctimer;
- close;
-L_START:
- startnpctimer;
- close;
-L_SET:
- input @temp;
- setnpctimer @temp;
- close;
-
-OnTimer1000:
- announce "1•bŒo‰ß",0;
- end;
-
-OnTimer5000:
- announce "5•bŒo‰ß",0;
- end;
-
-OnTimer10000:
- announce "10•bŒo‰ß",0;
- end;
-}
+
+prontera.gat,156,183,0 script NPCtimerƒeƒXƒg::npctimerX0000 116,{
+ mes "ƒ^ƒCƒ}[’l" + getnpctimer(0);
+ mes "ƒ^ƒCƒ}[ó‘Ô" + getnpctimer(1,"npctimerX0000");
+ mes "ƒCƒxƒ“ƒgŒÂ”" + getnpctimer(2);
+ menu "‰Šú‰»",L_INIT,"’âŽ~",L_STOP,"ÄŠJ",L_START,"Ý’è",L_SET;
+ close;
+L_INIT:
+ initnpctimer;
+ close;
+L_STOP:
+ stopnpctimer;
+ close;
+L_START:
+ startnpctimer;
+ close;
+L_SET:
+ input @temp;
+ setnpctimer @temp;
+ close;
+
+OnTimer1000:
+ announce "1•bŒo‰ß",0;
+ end;
+
+OnTimer5000:
+ announce "5•bŒo‰ß",0;
+ end;
+
+OnTimer10000:
+ announce "10•bŒo‰ß",0;
+ end;
+}
diff --git a/npc/sample/npc_test_npctimer2.txt b/npc/sample/npc_test_npctimer2.txt
index de9895f3c..d426e1e81 100644
--- a/npc/sample/npc_test_npctimer2.txt
+++ b/npc/sample/npc_test_npctimer2.txt
@@ -1,16 +1,16 @@
-prontera.gat,156,183,0 script NPCtimerƒeƒXƒg::npctimerX0000 116,{
-L_INIT:
- mes "What would you like to know?";
- menu "Tell me my level",L_WAIT;
-
-L_WAIT:
- mes "I need time to think...";
- initnpctimer;
- attachnpctimer;
- close;
-
-OnTimer5000:
- mes "Ah, your level is " + readparam(11);
- detachnpctimer;
- close;
+prontera.gat,156,183,0 script NPCtimerƒeƒXƒg::npctimerX0000 116,{
+L_INIT:
+ mes "What would you like to know?";
+ menu "Tell me my level",L_WAIT;
+
+L_WAIT:
+ mes "I need time to think...";
+ initnpctimer;
+ attachnpctimer;
+ close;
+
+OnTimer5000:
+ mes "Ah, your level is " + readparam(11);
+ detachnpctimer;
+ close;
} \ No newline at end of file
diff --git a/npc/sample/npc_test_skill.txt b/npc/sample/npc_test_skill.txt
index 969c1ca77..94b2195bb 100644
--- a/npc/sample/npc_test_skill.txt
+++ b/npc/sample/npc_test_skill.txt
@@ -1,19 +1,19 @@
-// ƒXƒLƒ‹Š“¾ƒeƒXƒg
-
-// skill ƒXƒLƒ‹ID ,ƒXƒLƒ‹LV [,ƒtƒ‰ƒO];
-// ƒtƒ‰ƒO‚ÍÈ—ª‰Â”\AÈ—ªŽž‚Í‚PB
-// ƒtƒ‰ƒO=1‚ŃJ[ƒh‚Ȃǂ̈ꎞ“I‚ÈŠ“¾A
-// ƒtƒ‰ƒO=2‚ŃNƒGƒXƒg‚È‚Ç‚É‚æ‚éP‹v“I‚ÈŠ“¾(skill_tree.txt‚Ɉˑ¶)
-
-prontera.gat,157,182,0 script ƒXƒLƒ‹Š“¾ƒeƒXƒg 116,{
- mes "ƒXƒLƒ‹Š“¾ƒeƒXƒg";
- menu "‰ž‹}ˆ’uŠ“¾",L_GETSKILL142,"Ž€‚ñ‚¾U‚芓¾",L_GETSKILL143,"‚â‚ß‚é",L_YAME;
-L_GETSKILL142:
- skill 142,1,0;
- close;
-L_GETSKILL143:
- skill 143,1,0;
- close;
-L_YAME:
- close;
-}
+// ƒXƒLƒ‹Š“¾ƒeƒXƒg
+
+// skill ƒXƒLƒ‹ID ,ƒXƒLƒ‹LV [,ƒtƒ‰ƒO];
+// ƒtƒ‰ƒO‚ÍÈ—ª‰Â”\AÈ—ªŽž‚Í‚PB
+// ƒtƒ‰ƒO=1‚ŃJ[ƒh‚Ȃǂ̈ꎞ“I‚ÈŠ“¾A
+// ƒtƒ‰ƒO=2‚ŃNƒGƒXƒg‚È‚Ç‚É‚æ‚éP‹v“I‚ÈŠ“¾(skill_tree.txt‚Ɉˑ¶)
+
+prontera.gat,157,182,0 script ƒXƒLƒ‹Š“¾ƒeƒXƒg 116,{
+ mes "ƒXƒLƒ‹Š“¾ƒeƒXƒg";
+ menu "‰ž‹}ˆ’uŠ“¾",L_GETSKILL142,"Ž€‚ñ‚¾U‚芓¾",L_GETSKILL143,"‚â‚ß‚é",L_YAME;
+L_GETSKILL142:
+ skill 142,1,0;
+ close;
+L_GETSKILL143:
+ skill 143,1,0;
+ close;
+L_YAME:
+ close;
+}
diff --git a/npc/sample/npc_test_str.txt b/npc/sample/npc_test_str.txt
index cc50124ab..1c04927dd 100644
--- a/npc/sample/npc_test_str.txt
+++ b/npc/sample/npc_test_str.txt
@@ -1,17 +1,17 @@
-// Some Test Example
-prontera.gat,164,188,1 script sTrInG2compare 112,{
- set @str$, "StRiNg1";
- mes "sTrInG2 isn't equal to " + @str$ ;
- mes "Our Var is equal to " + @str$ + " ...OK?";
- next;
- mes "Comparision eqOKF" + (@str$=="StRiNg1");
- mes "Comparision eqNGF" + (@str$=="sTrInG2");
- mes "Comparision neOKF" + (@str$!="00000");
- mes "Comparision neNGF" + (@str$!="StRiNg1");
- mes "Comparision gtOKF" + ("aab">"aaa");
- mes "Comparision ltNGF" + ("aab"<"aaa");
- next;
- input @str2$;
- mes "You've entered '" + @str2$ + "' string.";
- close;
-}
+// Some Test Example
+prontera.gat,164,188,1 script sTrInG2compare 112,{
+ set @str$, "StRiNg1";
+ mes "sTrInG2 isn't equal to " + @str$ ;
+ mes "Our Var is equal to " + @str$ + " ...OK?";
+ next;
+ mes "Comparision eqOKF" + (@str$=="StRiNg1");
+ mes "Comparision eqNGF" + (@str$=="sTrInG2");
+ mes "Comparision neOKF" + (@str$!="00000");
+ mes "Comparision neNGF" + (@str$!="StRiNg1");
+ mes "Comparision gtOKF" + ("aab">"aaa");
+ mes "Comparision ltNGF" + ("aab"<"aaa");
+ next;
+ input @str2$;
+ mes "You've entered '" + @str2$ + "' string.";
+ close;
+}
diff --git a/npc/sample/npc_testchkoption.txt b/npc/sample/npc_testchkoption.txt
index 970da233f..07c18bf59 100644
--- a/npc/sample/npc_testchkoption.txt
+++ b/npc/sample/npc_testchkoption.txt
@@ -1,15 +1,15 @@
-prontera.gat,156,89,6 script test_chkoption 117,{
- mes "Please enter a value of type!";
- input @value;
- if(checkoption(@value) == 1) goto L1;
- if(checkoption(@value) == 0) goto L0;
- end;
- L1:
- mes "True!";
- close;
- end;
- L0:
- mes "False!";
- close;
- end;
+prontera.gat,156,89,6 script test_chkoption 117,{
+ mes "Please enter a value of type!";
+ input @value;
+ if(checkoption(@value) == 1) goto L1;
+ if(checkoption(@value) == 0) goto L0;
+ end;
+ L1:
+ mes "True!";
+ close;
+ end;
+ L0:
+ mes "False!";
+ close;
+ end;
} \ No newline at end of file
diff --git a/npc/sample/npc_time_sample.txt b/npc/sample/npc_time_sample.txt
index 56d442c7a..ec620ecd9 100644
--- a/npc/sample/npc_time_sample.txt
+++ b/npc/sample/npc_time_sample.txt
@@ -1,19 +1,19 @@
-
-prontera.gat,157,181,6 script Time Sample 105,{
- mes "[Time Sample]";
- mes "System Tick : " + gettimetick(0);
- mes " Time Tick : " + gettimetick(1);
- mes " GetTime(0) : " + gettime(0);
- mes " GetTime(1) : " + gettime(1) + " (Sec)";
- mes " GetTime(2) : " + gettime(2) + " (Min)";
- mes " GetTime(3) : " + gettime(3) + " (Hour)";
- mes " GetTime(4) : " + gettime(4) + " (WeekDay)";
- mes " GetTime(5) : " + gettime(5) + " (MonthDay)";
- mes " GetTime(6) : " + gettime(6) + " (Month)";
- mes " GetTime(7) : " + gettime(7) + " (Year)";
- mes " GetTimeStr : " + gettimestr("%Y-%m/%d %H:%M:%S",19);
- close;
- end;
-}
-
-
+
+prontera.gat,157,181,6 script Time Sample 105,{
+ mes "[Time Sample]";
+ mes "System Tick : " + gettimetick(0);
+ mes " Time Tick : " + gettimetick(1);
+ mes " GetTime(0) : " + gettime(0);
+ mes " GetTime(1) : " + gettime(1) + " (Sec)";
+ mes " GetTime(2) : " + gettime(2) + " (Min)";
+ mes " GetTime(3) : " + gettime(3) + " (Hour)";
+ mes " GetTime(4) : " + gettime(4) + " (WeekDay)";
+ mes " GetTime(5) : " + gettime(5) + " (MonthDay)";
+ mes " GetTime(6) : " + gettime(6) + " (Month)";
+ mes " GetTime(7) : " + gettime(7) + " (Year)";
+ mes " GetTimeStr : " + gettimestr("%Y-%m/%d %H:%M:%S",19);
+ close;
+ end;
+}
+
+
diff --git a/npc/scripts_athena.conf b/npc/scripts_athena.conf
index 8d18c5eb5..e7d37320e 100644
--- a/npc/scripts_athena.conf
+++ b/npc/scripts_athena.conf
@@ -1,200 +1,200 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------- Cities ---------------------------
-npc: npc/cities/alberta.txt
-npc: npc/cities/aldebaran.txt
-npc: npc/cities/amatsu.txt
-npc: npc/cities/ayothaya.txt
-npc: npc/cities/comodo.txt
-npc: npc/cities/einbech.txt
-npc: npc/cities/einbroch.txt
-npc: npc/cities/geffen.txt
-npc: npc/cities/gonryun.txt
-npc: npc/cities/hugel.txt
-npc: npc/cities/izlude.txt
-npc: npc/cities/jawaii.txt
-npc: npc/cities/lighthalzen.txt
-npc: npc/cities/louyang.txt
-npc: npc/cities/lutie.txt
-npc: npc/cities/morocc.txt
-npc: npc/cities/niflheim.txt
-npc: npc/cities/payon.txt
-npc: npc/cities/prontera.txt
-npc: npc/cities/rachel.txt
-npc: npc/cities/umbala.txt
-npc: npc/cities/valkyrie.txt
-npc: npc/cities/yuno.txt
-// --------------------------------------------------------------
-// -------------------------- Merchant --------------------------
-npc: npc/merchants/shops.txt
-npc: npc/merchants/refine.txt
-npc: npc/merchants/dye_maker.txt
-npc: npc/merchants/clothes_dyer.txt
-npc: npc/merchants/hair_dyer.txt
-npc: npc/merchants/hair_style.txt
-npc: npc/merchants/grandpa_pharmacist.txt
-npc: npc/merchants/inn.txt
-npc: npc/merchants/milk_trader.txt
-npc: npc/merchants/renters.txt
-npc: npc/merchants/alchemist.txt
-npc: npc/merchants/icecream.txt
-npc: npc/merchants/quivers.txt
-npc: npc/merchants/kunai_maker.txt
-npc: npc/merchants/shuriken_maker.txt
-npc: npc/merchants/socket_enchant.txt
-npc: npc/merchants/ammo_boxes.txt
-npc: npc/merchants/ammo_dealer.txt
-npc: npc/merchants/novice_exchange.txt
-// --------------------------------------------------------------
-// -------------------------- Airport ---------------------------
-npc: npc/airports/airships.txt
-npc: npc/airports/einbroch.txt
-npc: npc/airports/lighthalzen.txt
-npc: npc/airports/yuno.txt
-// --------------------------------------------------------------
-// --------------------------- Quests ---------------------------
-npc: npc/quests/metto_quest.txt
-npc: npc/quests/quests_alberta.txt
-npc: npc/quests/quests_aldebaran.txt
-npc: npc/quests/quests_amatsu.txt
-npc: npc/quests/quests_ayothaya.txt
-npc: npc/quests/quests_comodo.txt
-npc: npc/quests/quests_ein.txt
-npc: npc/quests/quests_geffen.txt
-npc: npc/quests/quests_gonryun.txt
-npc: npc/quests/quests_izlude.txt
-npc: npc/quests/quests_lighthalzen.txt
-npc: npc/quests/quests_louyang.txt
-npc: npc/quests/quests_lutie.txt
-npc: npc/quests/quests_morocc.txt
-npc: npc/quests/quests_niflheim.txt
-npc: npc/quests/quests_payon.txt
-npc: npc/quests/quests_prontera.txt
-npc: npc/quests/quests_umbala.txt
-npc: npc/quests/quests_yuno.txt
-npc: npc/quests/mrsmile.txt
-npc: npc/quests/bunnyband.txt
-npc: npc/quests/juice_maker.txt
-npc: npc/quests/counteragent_mixture.txt
-npc: npc/quests/doomed_swords.txt
-npc: npc/quests/bongunsword.txt
-npc: npc/quests/monstertamers.txt
-npc: npc/quests/Lvl4_weapon_quest.txt
-npc: npc/quests/juperos.txt
-npc: npc/quests/thana_quest.txt
-npc: npc/quests/eye_of_hellion.txt
-//The Sign Quest will be "enable only".
-//There are some things you might consider doing before implementing it,
-//For more info, read the comments in npc/quests/The_Sign_Quest.txt
-//npc: npc/quests/The_Sign_Quest.txt
-//The God Item Quest Files
-npc: npc/quests/seals/brisingamen_seal.txt
-npc: npc/quests/seals/god_global.txt
-npc: npc/quests/seals/god_weapon_creation.txt
-npc: npc/quests/seals/megingard_seal.txt
-npc: npc/quests/seals/mjolnir_seal.txt
-npc: npc/quests/seals/sleipnir_seal.txt
-//
-npc: npc/quests/newgears/2004_headgears.txt
-npc: npc/quests/newgears/2005_headgears.txt
-//it's iRO script, uncomment it if you want to soil your economics with cheap OBBs
-//npc: npc/quests/obb_quest.txt
-npc: npc/quests/cooking_quest.txt
-npc: npc/quests/newgears/2006_headgear.txt
-npc: npc/quests/gunslinger_quests.txt
-//Quests-Tutorials for basic classes (1st class quests)
-npc: npc/quests/first_class/tu_acolyte.txt
-npc: npc/quests/first_class/tu_archer.txt
-npc: npc/quests/first_class/tu_magician01.txt
-npc: npc/quests/first_class/tu_ma_th01.txt
-npc: npc/quests/first_class/tu_merchant.txt
-npc: npc/quests/first_class/tu_sword.txt
-npc: npc/quests/first_class/tu_thief01.txt
-
-// --------------------------------------------------------------
-// --------------------------- Guides ---------------------------
-npc: npc/guides/guides_alb.txt
-npc: npc/guides/guides_alde.txt
-npc: npc/guides/guides_ama.txt
-npc: npc/guides/guides_com.txt
-npc: npc/guides/guides_einbe.txt
-npc: npc/guides/guides_einbr.txt
-npc: npc/guides/guides_gef.txt
-npc: npc/guides/guides_izl.txt
-npc: npc/guides/guides_louyang.txt
-npc: npc/guides/guides_lhz.txt
-npc: npc/guides/guides_mor.txt
-npc: npc/guides/guides_pay.txt
-npc: npc/guides/guides_pron.txt
-npc: npc/guides/guides_yun.txt
-npc: npc/guides/guides_umb.txt
-npc: npc/guides/guides_nif.txt
-npc: npc/guides/guides_hu.txt
-// --------------------------------------------------------------
-// --------------------------- Kafras ---------------------------
-npc: npc/kafras/functions_kafras.txt
-npc: npc/kafras/kafras_alb.txt
-npc: npc/kafras/kafras_alde.txt
-npc: npc/kafras/kafras_com.txt
-npc: npc/kafras/kafras_dungeons.txt
-npc: npc/kafras/kafras_gef.txt
-npc: npc/kafras/kafras_izl.txt
-npc: npc/kafras/kafras_mor.txt
-npc: npc/kafras/kafras_pay.txt
-npc: npc/kafras/kafras_pron.txt
-npc: npc/kafras/kafras_yun.txt
-npc: npc/kafras/kafras_new.txt
-// --------------------------------------------------------------
-// --------------------------- Events ---------------------------
-//npc: npc/events/easter.txt
-//npc: npc/events/valentinesday.txt
-//npc: npc/events/xmas.txt
-//Official idRO Idul Fitri Event
-//npc: npc/events/idul_fitri.txt
-//npc: npc/events/dumplingfestival.txt
-//Official kRO, idRO Skill Reset Event
-//npc: npc/events/event_skill_reset.txt
-
-//A custom event for 3 holidays: X-Mas, Karachun and New Year
-//Should be activated between 8 December and 8 January
-//npc: npc/events/custom/xmas_rings_event.txt
-//npc: npc/events/alchemist.txt
-//npc: npc/events/whiteday.txt
-//npc: npc/events/twintowers.txt
-//npc: npc/events/custom/uneasy_cemetery.txt
-//npc: npc/events/custom/draculax.txt
-//npc: npc/events/custom/event_gefenia.txt
-//npc: npc/events/custom/npc_event_thesign.txt
-//npc: npc/events/custom/2006_dogs_year.txt
-//npc: npc/events/custom/valentinesdayexp.txt
-//| Poring track files
-//npc: npc/events/custom/p_track/p_track_core.txt
-//npc: npc/events/custom/p_track/p_track_warpers.txt
-// --------------------------------------------------------------
-// --------------------------- Others ---------------------------
-npc: npc/other/pvp.txt
-npc: npc/other/books.txt
-npc: npc/other/msg_boards.txt
-npc: npc/other/bulletin_boards.txt
-npc: npc/other/monster_museum.txt
-npc: npc/other/marriage.txt
-npc: npc/other/divorce.txt
-npc: npc/other/dts_warper.txt
-npc: npc/other/comodo_gambling.txt
-npc: npc/other/lighthalzen_bank.txt
-npc: npc/other/lighthalzen_prison.txt
-npc: npc/other/lighthalzen_auction.txt
-npc: npc/other/powernpc.txt
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------- Cities ---------------------------
+npc: npc/cities/alberta.txt
+npc: npc/cities/aldebaran.txt
+npc: npc/cities/amatsu.txt
+npc: npc/cities/ayothaya.txt
+npc: npc/cities/comodo.txt
+npc: npc/cities/einbech.txt
+npc: npc/cities/einbroch.txt
+npc: npc/cities/geffen.txt
+npc: npc/cities/gonryun.txt
+npc: npc/cities/hugel.txt
+npc: npc/cities/izlude.txt
+npc: npc/cities/jawaii.txt
+npc: npc/cities/lighthalzen.txt
+npc: npc/cities/louyang.txt
+npc: npc/cities/lutie.txt
+npc: npc/cities/morocc.txt
+npc: npc/cities/niflheim.txt
+npc: npc/cities/payon.txt
+npc: npc/cities/prontera.txt
+npc: npc/cities/rachel.txt
+npc: npc/cities/umbala.txt
+npc: npc/cities/valkyrie.txt
+npc: npc/cities/yuno.txt
+// --------------------------------------------------------------
+// -------------------------- Merchant --------------------------
+npc: npc/merchants/shops.txt
+npc: npc/merchants/refine.txt
+npc: npc/merchants/dye_maker.txt
+npc: npc/merchants/clothes_dyer.txt
+npc: npc/merchants/hair_dyer.txt
+npc: npc/merchants/hair_style.txt
+npc: npc/merchants/grandpa_pharmacist.txt
+npc: npc/merchants/inn.txt
+npc: npc/merchants/milk_trader.txt
+npc: npc/merchants/renters.txt
+npc: npc/merchants/alchemist.txt
+npc: npc/merchants/icecream.txt
+npc: npc/merchants/quivers.txt
+npc: npc/merchants/kunai_maker.txt
+npc: npc/merchants/shuriken_maker.txt
+npc: npc/merchants/socket_enchant.txt
+npc: npc/merchants/ammo_boxes.txt
+npc: npc/merchants/ammo_dealer.txt
+npc: npc/merchants/novice_exchange.txt
+// --------------------------------------------------------------
+// -------------------------- Airport ---------------------------
+npc: npc/airports/airships.txt
+npc: npc/airports/einbroch.txt
+npc: npc/airports/lighthalzen.txt
+npc: npc/airports/yuno.txt
+// --------------------------------------------------------------
+// --------------------------- Quests ---------------------------
+npc: npc/quests/metto_quest.txt
+npc: npc/quests/quests_alberta.txt
+npc: npc/quests/quests_aldebaran.txt
+npc: npc/quests/quests_amatsu.txt
+npc: npc/quests/quests_ayothaya.txt
+npc: npc/quests/quests_comodo.txt
+npc: npc/quests/quests_ein.txt
+npc: npc/quests/quests_geffen.txt
+npc: npc/quests/quests_gonryun.txt
+npc: npc/quests/quests_izlude.txt
+npc: npc/quests/quests_lighthalzen.txt
+npc: npc/quests/quests_louyang.txt
+npc: npc/quests/quests_lutie.txt
+npc: npc/quests/quests_morocc.txt
+npc: npc/quests/quests_niflheim.txt
+npc: npc/quests/quests_payon.txt
+npc: npc/quests/quests_prontera.txt
+npc: npc/quests/quests_umbala.txt
+npc: npc/quests/quests_yuno.txt
+npc: npc/quests/mrsmile.txt
+npc: npc/quests/bunnyband.txt
+npc: npc/quests/juice_maker.txt
+npc: npc/quests/counteragent_mixture.txt
+npc: npc/quests/doomed_swords.txt
+npc: npc/quests/bongunsword.txt
+npc: npc/quests/monstertamers.txt
+npc: npc/quests/Lvl4_weapon_quest.txt
+npc: npc/quests/juperos.txt
+npc: npc/quests/thana_quest.txt
+npc: npc/quests/eye_of_hellion.txt
+//The Sign Quest will be "enable only".
+//There are some things you might consider doing before implementing it,
+//For more info, read the comments in npc/quests/The_Sign_Quest.txt
+//npc: npc/quests/The_Sign_Quest.txt
+//The God Item Quest Files
+npc: npc/quests/seals/brisingamen_seal.txt
+npc: npc/quests/seals/god_global.txt
+npc: npc/quests/seals/god_weapon_creation.txt
+npc: npc/quests/seals/megingard_seal.txt
+npc: npc/quests/seals/mjolnir_seal.txt
+npc: npc/quests/seals/sleipnir_seal.txt
+//
+npc: npc/quests/newgears/2004_headgears.txt
+npc: npc/quests/newgears/2005_headgears.txt
+//it's iRO script, uncomment it if you want to soil your economics with cheap OBBs
+//npc: npc/quests/obb_quest.txt
+npc: npc/quests/cooking_quest.txt
+npc: npc/quests/newgears/2006_headgear.txt
+npc: npc/quests/gunslinger_quests.txt
+//Quests-Tutorials for basic classes (1st class quests)
+npc: npc/quests/first_class/tu_acolyte.txt
+npc: npc/quests/first_class/tu_archer.txt
+npc: npc/quests/first_class/tu_magician01.txt
+npc: npc/quests/first_class/tu_ma_th01.txt
+npc: npc/quests/first_class/tu_merchant.txt
+npc: npc/quests/first_class/tu_sword.txt
+npc: npc/quests/first_class/tu_thief01.txt
+
+// --------------------------------------------------------------
+// --------------------------- Guides ---------------------------
+npc: npc/guides/guides_alb.txt
+npc: npc/guides/guides_alde.txt
+npc: npc/guides/guides_ama.txt
+npc: npc/guides/guides_com.txt
+npc: npc/guides/guides_einbe.txt
+npc: npc/guides/guides_einbr.txt
+npc: npc/guides/guides_gef.txt
+npc: npc/guides/guides_izl.txt
+npc: npc/guides/guides_louyang.txt
+npc: npc/guides/guides_lhz.txt
+npc: npc/guides/guides_mor.txt
+npc: npc/guides/guides_pay.txt
+npc: npc/guides/guides_pron.txt
+npc: npc/guides/guides_yun.txt
+npc: npc/guides/guides_umb.txt
+npc: npc/guides/guides_nif.txt
+npc: npc/guides/guides_hu.txt
+// --------------------------------------------------------------
+// --------------------------- Kafras ---------------------------
+npc: npc/kafras/functions_kafras.txt
+npc: npc/kafras/kafras_alb.txt
+npc: npc/kafras/kafras_alde.txt
+npc: npc/kafras/kafras_com.txt
+npc: npc/kafras/kafras_dungeons.txt
+npc: npc/kafras/kafras_gef.txt
+npc: npc/kafras/kafras_izl.txt
+npc: npc/kafras/kafras_mor.txt
+npc: npc/kafras/kafras_pay.txt
+npc: npc/kafras/kafras_pron.txt
+npc: npc/kafras/kafras_yun.txt
+npc: npc/kafras/kafras_new.txt
+// --------------------------------------------------------------
+// --------------------------- Events ---------------------------
+//npc: npc/events/easter.txt
+//npc: npc/events/valentinesday.txt
+//npc: npc/events/xmas.txt
+//Official idRO Idul Fitri Event
+//npc: npc/events/idul_fitri.txt
+//npc: npc/events/dumplingfestival.txt
+//Official kRO, idRO Skill Reset Event
+//npc: npc/events/event_skill_reset.txt
+
+//A custom event for 3 holidays: X-Mas, Karachun and New Year
+//Should be activated between 8 December and 8 January
+//npc: npc/events/custom/xmas_rings_event.txt
+//npc: npc/events/alchemist.txt
+//npc: npc/events/whiteday.txt
+//npc: npc/events/twintowers.txt
+//npc: npc/events/custom/uneasy_cemetery.txt
+//npc: npc/events/custom/draculax.txt
+//npc: npc/events/custom/event_gefenia.txt
+//npc: npc/events/custom/npc_event_thesign.txt
+//npc: npc/events/custom/2006_dogs_year.txt
+//npc: npc/events/custom/valentinesdayexp.txt
+//| Poring track files
+//npc: npc/events/custom/p_track/p_track_core.txt
+//npc: npc/events/custom/p_track/p_track_warpers.txt
+// --------------------------------------------------------------
+// --------------------------- Others ---------------------------
+npc: npc/other/pvp.txt
+npc: npc/other/books.txt
+npc: npc/other/msg_boards.txt
+npc: npc/other/bulletin_boards.txt
+npc: npc/other/monster_museum.txt
+npc: npc/other/marriage.txt
+npc: npc/other/divorce.txt
+npc: npc/other/dts_warper.txt
+npc: npc/other/comodo_gambling.txt
+npc: npc/other/lighthalzen_bank.txt
+npc: npc/other/lighthalzen_prison.txt
+npc: npc/other/lighthalzen_auction.txt
+npc: npc/other/powernpc.txt
+// --------------------------------------------------------------
diff --git a/npc/scripts_custom.conf b/npc/scripts_custom.conf
index 6972a7874..4287e3c45 100644
--- a/npc/scripts_custom.conf
+++ b/npc/scripts_custom.conf
@@ -1,144 +1,144 @@
-// --------------------------------------------------------------
-// - Custom Scripts -
-// --------------------------------------------------------------
-// All the custom scripts, remove the '//' to active...
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// ------------------------- My Scripts -------------------------
-//npc: npc/location/to/script.txt
-// Your scripts go here!!
-// --------------------------------------------------------------
-// ----------------------- Basic Scripts -----------------------
-// -- Adoption NPC [Fredzilla]
-npc: npc/custom/adoption.txt
-// -- Auctioneer - Use at own risk [Fredzilla]
-// Warning: It dupe items.
-//npc: npc/custom/Auctioneer.txt
-// -- Card Remover
-//npc: npc/custom/card_remover.txt
-// -- Write your name on your equipment/weapon (mini-quest)
-//npc: npc/custom/sign_your_items.txt
-// -- Banks
-//npc: npc/custom/banks/kafra_bank.txt
-//npc: npc/custom/banks/bank.txt
-// -- Reset NPC
-//npc: npc/custom/jobs/reset.txt
-// -- Job Changer
-//npc: npc/custom/jobs/jobmaster.txt
-// -- Healer(s)
-//npc: npc/custom/healers/heal.txt
-//npc: npc/custom/healers/heal_payment.txt
-// -- Black Jack
-//npc: npc/custom/blackjack.txt
-// -- Gefenia
-//npc: npc/custom/gefenia.txt
-// -- City and Dungeon Warper
-//npc: npc/custom/warper/warper.txt
-// -- Stylist
-//npc: npc/custom/dye.txt
-// -- Custom Penal Servitude (Jails Quest)
-//npc: npc/custom/penal_servitude.txt
-// -- Dev NPCs (NPCs named after devs...)
-//npc: npc/custom/devnpc.txt
-// -- Unofficial poetry
-//npc: npc/custom/poetry/ayothaya.txt
-// -- Platinum Skills
-//npc: npc/custom/platinum_skills.txt
-// -- Custom Shops
-//npc: npc/custom/2-2shop.txt
-// -- Free Falcon & Peco breeder, Free Carts
-//npc: npc/custom/breeder.txt
-// -- Unofficial Airplane Script
-//npc: npc/custom/airplane.txt
-// -- MVP Arena
-//npc: npc/custom/MVP_arena/arena_mvp.txt
-//npc: npc/custom/MVP_arena/amvp_func.txt
-// ~ If you wish to have the mvp arena in your server,
-// ~ please enable the mvp funtion too.
-// -- WoE Time Setter - Lets you set War of Emperium time easily from inside the game [Fredzilla]
-//npc: npc/custom/WoE_Setter.txt
-//
-// Stock Market (Play on it, earn money, very flexible)
-//npc: npc/custom/stock_market.txt
-// Russian Roulette + Rock Scissors Paper (contains some OBB / OVB / OCA etc dangerous!!! prizes!)
-//npc: npc/custom/rpsroulette.txt
-// Hire your Ninjas Squad and assassinate some enemy
-//npc: npc/custom/shifty_assassin.txt
-// Train your Monsters to fight against other players' monsters
-//npc: npc/custom/mvm.txt
-// A simply Raceway mini-game
-//npc: npc/custom/morroc_raceway.txt
-// A nice lottery (very flexible)
-//npc: npc/custom/lottery.txt
-
-// --------------------------------------------------------------
-// Lance's Scripts (coded before joining eA Dev team)
-// --------------------------------------------------------------
-//npc: npc/custom/Lance/FR_HallOfFame.c
-//npc: npc/custom/Lance/FR_WeatherController.c
-//npc: npc/custom/Lance/FR_MailSystem.c
-//npc: npc/sample/npc_dynamic_shop.txt
-//npc: npc/sample/monster_controller.cpp
-//npc: npc/custom/Lance/Sentry.cpp
-// --------------------------------------------------------------
-
-// --------------------------------------------------------------
-// ----------------------- Quests Scripts -----------------------
-// -- Treasure Hunters Guild Quests (40 Quests + Special Guild Shop)
-//npc: npc/custom/quests/thq/THQS_ChatingNPC.txt
-//npc: npc/custom/quests/thq/THQS_GuildNPC.txt
-//npc: npc/custom/quests/thq/THQS_QuestNPC.txt
-//npc: npc/custom/quests/thq/THQS_Quests.txt
-//npc: npc/custom/quests/thq/THQS_TTShop.txt
-// -- Godly Equipments Quests
-//npc: npc/custom/quests/valhallen.txt
-// -- Misc
-//npc: npc/custom/quests/magicalhatquest.txt
-//npc: npc/custom/quests/fashion.txt
-//npc: npc/custom/quests/elvenear.txt
-//npc: npc/custom/quests/ironcane.txt
-//npc: npc/custom/quests/sunglasses.txt
-//npc: npc/custom/quests/berzebub.txt
-// Bandit Beard headgear quest (very long and safe quest)
-//npc: npc/custom/quests/bandit_beard.txt
-// Dead Branch (and Bloody Branch) quest (safe to use)
-//npc: npc/custom/quests/dead_branch.txt
-// -- Removed Hats with official quests. Only 6 hats are left
-//npc: npc/custom/quests/event_6_new_hats.txt
-// (both Lord Kaho (GM Item), but different and quest.txt has Balmung (GM Item) too)
-// Warning! It might break your server balance.
-//npc: npc/custom/quests/kaho_balmung.txt
-//npc: npc/custom/quests/kahohorn.txt
-// -- ?? Event
-//npc: npc/custom/tougijou.txt
-//Nice Custom thanatos Tower Statues Quest
-//npc: npc/custom/quests/tha_statues.txt
-// -- A quest for Jewel Case for 99 Level Players of any 2nd Class
-//npc: npc/custom/quests/lvl99_quest.txt
-// Disable shops in the Prontera streets and open a special market place.
-//npc/custom/market.txt
-// Quest for: Bird Nest,Lion Mask,Skeleton Manteau,Fashion Hip Sack,Sales Banner
-//npc: npc/custom/quests/may_hats.txt
-// Random change of Drop/Exp rates 1x ~ 1.5x every 6 hours on your server
-//npc: npc/custom/floating_rates.txt
-// Extracted custom quests from the official Umbalian Quests (better, don't use)
-//npc: npc/custom/quests/sphinx_mask.txt
-//npc: npc/custom/quests/umbalian_language.txt
-// Custom Kiel Mansion Dungeon Quest
-//npc: npc/custom/quests/kiel_quest.txt
-//Grand Circlet Quest combined with Excalibur Quest
-//npc: npc/events/custom/kings_items.txt
-//Custom Halloween Event (gives )
+// --------------------------------------------------------------
+// - Custom Scripts -
+// --------------------------------------------------------------
+// All the custom scripts, remove the '//' to active...
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// ------------------------- My Scripts -------------------------
+//npc: npc/location/to/script.txt
+// Your scripts go here!!
+// --------------------------------------------------------------
+// ----------------------- Basic Scripts -----------------------
+// -- Adoption NPC [Fredzilla]
+npc: npc/custom/adoption.txt
+// -- Auctioneer - Use at own risk [Fredzilla]
+// Warning: It dupe items.
+//npc: npc/custom/Auctioneer.txt
+// -- Card Remover
+//npc: npc/custom/card_remover.txt
+// -- Write your name on your equipment/weapon (mini-quest)
+//npc: npc/custom/sign_your_items.txt
+// -- Banks
+//npc: npc/custom/banks/kafra_bank.txt
+//npc: npc/custom/banks/bank.txt
+// -- Reset NPC
+//npc: npc/custom/jobs/reset.txt
+// -- Job Changer
+//npc: npc/custom/jobs/jobmaster.txt
+// -- Healer(s)
+//npc: npc/custom/healers/heal.txt
+//npc: npc/custom/healers/heal_payment.txt
+// -- Black Jack
+//npc: npc/custom/blackjack.txt
+// -- Gefenia
+//npc: npc/custom/gefenia.txt
+// -- City and Dungeon Warper
+//npc: npc/custom/warper/warper.txt
+// -- Stylist
+//npc: npc/custom/dye.txt
+// -- Custom Penal Servitude (Jails Quest)
+//npc: npc/custom/penal_servitude.txt
+// -- Dev NPCs (NPCs named after devs...)
+//npc: npc/custom/devnpc.txt
+// -- Unofficial poetry
+//npc: npc/custom/poetry/ayothaya.txt
+// -- Platinum Skills
+//npc: npc/custom/platinum_skills.txt
+// -- Custom Shops
+//npc: npc/custom/2-2shop.txt
+// -- Free Falcon & Peco breeder, Free Carts
+//npc: npc/custom/breeder.txt
+// -- Unofficial Airplane Script
+//npc: npc/custom/airplane.txt
+// -- MVP Arena
+//npc: npc/custom/MVP_arena/arena_mvp.txt
+//npc: npc/custom/MVP_arena/amvp_func.txt
+// ~ If you wish to have the mvp arena in your server,
+// ~ please enable the mvp funtion too.
+// -- WoE Time Setter - Lets you set War of Emperium time easily from inside the game [Fredzilla]
+//npc: npc/custom/WoE_Setter.txt
+//
+// Stock Market (Play on it, earn money, very flexible)
+//npc: npc/custom/stock_market.txt
+// Russian Roulette + Rock Scissors Paper (contains some OBB / OVB / OCA etc dangerous!!! prizes!)
+//npc: npc/custom/rpsroulette.txt
+// Hire your Ninjas Squad and assassinate some enemy
+//npc: npc/custom/shifty_assassin.txt
+// Train your Monsters to fight against other players' monsters
+//npc: npc/custom/mvm.txt
+// A simply Raceway mini-game
+//npc: npc/custom/morroc_raceway.txt
+// A nice lottery (very flexible)
+//npc: npc/custom/lottery.txt
+
+// --------------------------------------------------------------
+// Lance's Scripts (coded before joining eA Dev team)
+// --------------------------------------------------------------
+//npc: npc/custom/Lance/FR_HallOfFame.c
+//npc: npc/custom/Lance/FR_WeatherController.c
+//npc: npc/custom/Lance/FR_MailSystem.c
+//npc: npc/sample/npc_dynamic_shop.txt
+//npc: npc/sample/monster_controller.cpp
+//npc: npc/custom/Lance/Sentry.cpp
+// --------------------------------------------------------------
+
+// --------------------------------------------------------------
+// ----------------------- Quests Scripts -----------------------
+// -- Treasure Hunters Guild Quests (40 Quests + Special Guild Shop)
+//npc: npc/custom/quests/thq/THQS_ChatingNPC.txt
+//npc: npc/custom/quests/thq/THQS_GuildNPC.txt
+//npc: npc/custom/quests/thq/THQS_QuestNPC.txt
+//npc: npc/custom/quests/thq/THQS_Quests.txt
+//npc: npc/custom/quests/thq/THQS_TTShop.txt
+// -- Godly Equipments Quests
+//npc: npc/custom/quests/valhallen.txt
+// -- Misc
+//npc: npc/custom/quests/magicalhatquest.txt
+//npc: npc/custom/quests/fashion.txt
+//npc: npc/custom/quests/elvenear.txt
+//npc: npc/custom/quests/ironcane.txt
+//npc: npc/custom/quests/sunglasses.txt
+//npc: npc/custom/quests/berzebub.txt
+// Bandit Beard headgear quest (very long and safe quest)
+//npc: npc/custom/quests/bandit_beard.txt
+// Dead Branch (and Bloody Branch) quest (safe to use)
+//npc: npc/custom/quests/dead_branch.txt
+// -- Removed Hats with official quests. Only 6 hats are left
+//npc: npc/custom/quests/event_6_new_hats.txt
+// (both Lord Kaho (GM Item), but different and quest.txt has Balmung (GM Item) too)
+// Warning! It might break your server balance.
+//npc: npc/custom/quests/kaho_balmung.txt
+//npc: npc/custom/quests/kahohorn.txt
+// -- ?? Event
+//npc: npc/custom/tougijou.txt
+//Nice Custom thanatos Tower Statues Quest
+//npc: npc/custom/quests/tha_statues.txt
+// -- A quest for Jewel Case for 99 Level Players of any 2nd Class
+//npc: npc/custom/quests/lvl99_quest.txt
+// Disable shops in the Prontera streets and open a special market place.
+//npc/custom/market.txt
+// Quest for: Bird Nest,Lion Mask,Skeleton Manteau,Fashion Hip Sack,Sales Banner
+//npc: npc/custom/quests/may_hats.txt
+// Random change of Drop/Exp rates 1x ~ 1.5x every 6 hours on your server
+//npc: npc/custom/floating_rates.txt
+// Extracted custom quests from the official Umbalian Quests (better, don't use)
+//npc: npc/custom/quests/sphinx_mask.txt
+//npc: npc/custom/quests/umbalian_language.txt
+// Custom Kiel Mansion Dungeon Quest
+//npc: npc/custom/quests/kiel_quest.txt
+//Grand Circlet Quest combined with Excalibur Quest
+//npc: npc/events/custom/kings_items.txt
+//Custom Halloween Event (gives )
//npc: npc/events/custom/hallow06.txt \ No newline at end of file
diff --git a/npc/scripts_eaac.conf b/npc/scripts_eaac.conf
index 43c29b293..09b75b150 100644
--- a/npc/scripts_eaac.conf
+++ b/npc/scripts_eaac.conf
@@ -1,84 +1,84 @@
-// --------------------------------------------------------------
-// - eAAC Scripts -
-// --------------------------------------------------------------
-// All the custom scripts, remove the '//' to active...
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// - Files organized, sorted and compiled together by erKURITA -
-// - To activate a script, simply remove the // in the -
-// - corresponding npc: line. In case of the Kafra Express, -
-// - just remove the // in the import: line -
-
-// --------------------------------------------------------------
-// ----------------------- Kafra Express ------------------------
-// Kafra Express scripts are all enabled by default in the conf.
-// All you have to do is enable/uncomment the following line and
-// edit the confi.txt file inside the kafraExpress folder. Read
-// the readme.txt for further information. Also before enabling
-// this, open and read the following conf file, since you have
-// to de-activate the default Global_Functions.txt file and
-// enable the custom global_functionsKE.txt files made by Skotlex
-// Script made by Skotlex.
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=20290
-//import: npc/custom/eAAC_Scripts/Kafra_Express_files.conf
-
-// --------------------------------------------------------------
-// -------------------- Disguiser Quest NPC ---------------------
-// Script made by palasx.
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=55584
-//npc: npc/custom/eAAC_Scripts/disguiser.txt
-
-// --------------------------------------------------------------
-// ---------------------- Roll A Dice NPC -----------------------
-// Script made by birkiczd.
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=62483
-//npc: npc/custom/eAAC_Scripts/roll_a_dice.txt
-
-// --------------------------------------------------------------
-// ---------------------- Message Boards ------------------------
-// Script made by cold
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=51051
-//npc: npc/custom/eAAC_Scripts/messageboards.txt
-
-// --------------------------------------------------------------
-// ---------------------- Donation Girl -------------------------
-// Script made by joshuaali
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=71464
-//npc: npc/custom/eAAC_Scripts/DonationGirl/donate.txt
-
-// --------------------------------------------------------------
-// ----------------------- Quest Warper -------------------------
-// Script made by Neouni
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=83352
-//npc: npc/custom/eAAC_Scripts/quest_warper.txt
-
-// --------------------------------------------------------------
-// ----------------------- Coin Banker --------------------------
-// Script made by erKURITA
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=80615
-//npc: npc/custom/eAAC_Scripts/banker.txt
-
-// --------------------------------------------------------------
-// ---------------------- Vending Machine------------------------
-// Script made by Celestria
-// Forum topic for support:
-//| http://www.eathena.ws/board/index.php?showtopic=91261
-//npc: npc/custom/eAAC_Scripts/vendmachine.txt
+// --------------------------------------------------------------
+// - eAAC Scripts -
+// --------------------------------------------------------------
+// All the custom scripts, remove the '//' to active...
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// - Files organized, sorted and compiled together by erKURITA -
+// - To activate a script, simply remove the // in the -
+// - corresponding npc: line. In case of the Kafra Express, -
+// - just remove the // in the import: line -
+
+// --------------------------------------------------------------
+// ----------------------- Kafra Express ------------------------
+// Kafra Express scripts are all enabled by default in the conf.
+// All you have to do is enable/uncomment the following line and
+// edit the confi.txt file inside the kafraExpress folder. Read
+// the readme.txt for further information. Also before enabling
+// this, open and read the following conf file, since you have
+// to de-activate the default Global_Functions.txt file and
+// enable the custom global_functionsKE.txt files made by Skotlex
+// Script made by Skotlex.
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=20290
+//import: npc/custom/eAAC_Scripts/Kafra_Express_files.conf
+
+// --------------------------------------------------------------
+// -------------------- Disguiser Quest NPC ---------------------
+// Script made by palasx.
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=55584
+//npc: npc/custom/eAAC_Scripts/disguiser.txt
+
+// --------------------------------------------------------------
+// ---------------------- Roll A Dice NPC -----------------------
+// Script made by birkiczd.
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=62483
+//npc: npc/custom/eAAC_Scripts/roll_a_dice.txt
+
+// --------------------------------------------------------------
+// ---------------------- Message Boards ------------------------
+// Script made by cold
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=51051
+//npc: npc/custom/eAAC_Scripts/messageboards.txt
+
+// --------------------------------------------------------------
+// ---------------------- Donation Girl -------------------------
+// Script made by joshuaali
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=71464
+//npc: npc/custom/eAAC_Scripts/DonationGirl/donate.txt
+
+// --------------------------------------------------------------
+// ----------------------- Quest Warper -------------------------
+// Script made by Neouni
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=83352
+//npc: npc/custom/eAAC_Scripts/quest_warper.txt
+
+// --------------------------------------------------------------
+// ----------------------- Coin Banker --------------------------
+// Script made by erKURITA
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=80615
+//npc: npc/custom/eAAC_Scripts/banker.txt
+
+// --------------------------------------------------------------
+// ---------------------- Vending Machine------------------------
+// Script made by Celestria
+// Forum topic for support:
+//| http://www.eathena.ws/board/index.php?showtopic=91261
+//npc: npc/custom/eAAC_Scripts/vendmachine.txt
diff --git a/npc/scripts_eamonsters.conf b/npc/scripts_eamonsters.conf
index 83dab19b0..b0333e441 100644
--- a/npc/scripts_eamonsters.conf
+++ b/npc/scripts_eamonsters.conf
@@ -1,78 +1,78 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Monster Scripts -
-// --------------------------------------------------------------
-npc: npc/mobs/citycleaners.txt
-npc: npc/mobs/pvp.txt
-npc: npc/mobs/airplane.txt
-
-npc: npc/eamobs/fields/comodo.txt
-npc: npc/eamobs/fields/mjolnir.txt
-npc: npc/eamobs/fields/umbala.txt
-
-npc: npc/mobs/fields/amatsu.txt
-npc: npc/mobs/fields/ayothaya.txt
-npc: npc/mobs/fields/einbroch.txt
-npc: npc/mobs/fields/geffen.txt
-npc: npc/mobs/fields/gonryun.txt
-npc: npc/mobs/fields/hugel.txt
-npc: npc/mobs/fields/jawaii.txt
-npc: npc/mobs/fields/lighthalzen.txt
-npc: npc/mobs/fields/louyang.txt
-npc: npc/mobs/fields/lutie.txt
-npc: npc/mobs/fields/morocc.txt
-npc: npc/mobs/fields/niflheim.txt
-npc: npc/mobs/fields/odin.txt
-npc: npc/mobs/fields/payon.txt
-npc: npc/mobs/fields/prontera.txt
-npc: npc/mobs/fields/rachel.txt
-npc: npc/mobs/fields/yuno.txt
-
-npc: npc/eamobs/dungeons/byalan.txt
-npc: npc/eamobs/dungeons/clocktower.txt
-npc: npc/eamobs/dungeons/coalmine.txt
-npc: npc/eamobs/dungeons/geftower.txt
-npc: npc/eamobs/dungeons/glastheim.txt
-npc: npc/eamobs/dungeons/jupedun.txt
-npc: npc/eamobs/dungeons/moc_pyramid.txt
-npc: npc/eamobs/dungeons/moc_sphinx.txt
-npc: npc/eamobs/dungeons/sunkenship.txt
-
-npc: npc/mobs/dungeons/amatdun.txt
-npc: npc/mobs/dungeons/anthell.txt
-npc: npc/mobs/dungeons/ayodun.txt
-npc: npc/mobs/dungeons/abyss.txt
-npc: npc/mobs/dungeons/beachdun.txt
-npc: npc/mobs/dungeons/eindun.txt
-npc: npc/mobs/dungeons/gefenia.txt
-npc: npc/mobs/dungeons/gondun.txt
-npc: npc/mobs/dungeons/guilddun.txt
-npc: npc/mobs/dungeons/icedun.txt
-npc: npc/mobs/dungeons/kiel.txt
-npc: npc/mobs/dungeons/lhzdun.txt
-npc: npc/mobs/dungeons/louydun.txt
-npc: npc/mobs/dungeons/magmadun.txt
-npc: npc/mobs/dungeons/orcdun.txt
-npc: npc/mobs/dungeons/payoncave.txt
-npc: npc/mobs/dungeons/pront_maze.txt
-npc: npc/mobs/dungeons/pront_sewers.txt
-//npc: npc/mobs/dungeons/racheldun.txt
-npc: npc/mobs/dungeons/thanatos.txt
-npc: npc/mobs/dungeons/toyfactory.txt
-npc: npc/mobs/dungeons/turtleisland.txt
-npc: npc/mobs/dungeons/umbaladun.txt
-npc: npc/mobs/dungeons/yggdrasil.txt
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Monster Scripts -
+// --------------------------------------------------------------
+npc: npc/mobs/citycleaners.txt
+npc: npc/mobs/pvp.txt
+npc: npc/mobs/airplane.txt
+
+npc: npc/eamobs/fields/comodo.txt
+npc: npc/eamobs/fields/mjolnir.txt
+npc: npc/eamobs/fields/umbala.txt
+
+npc: npc/mobs/fields/amatsu.txt
+npc: npc/mobs/fields/ayothaya.txt
+npc: npc/mobs/fields/einbroch.txt
+npc: npc/mobs/fields/geffen.txt
+npc: npc/mobs/fields/gonryun.txt
+npc: npc/mobs/fields/hugel.txt
+npc: npc/mobs/fields/jawaii.txt
+npc: npc/mobs/fields/lighthalzen.txt
+npc: npc/mobs/fields/louyang.txt
+npc: npc/mobs/fields/lutie.txt
+npc: npc/mobs/fields/morocc.txt
+npc: npc/mobs/fields/niflheim.txt
+npc: npc/mobs/fields/odin.txt
+npc: npc/mobs/fields/payon.txt
+npc: npc/mobs/fields/prontera.txt
+npc: npc/mobs/fields/rachel.txt
+npc: npc/mobs/fields/yuno.txt
+
+npc: npc/eamobs/dungeons/byalan.txt
+npc: npc/eamobs/dungeons/clocktower.txt
+npc: npc/eamobs/dungeons/coalmine.txt
+npc: npc/eamobs/dungeons/geftower.txt
+npc: npc/eamobs/dungeons/glastheim.txt
+npc: npc/eamobs/dungeons/jupedun.txt
+npc: npc/eamobs/dungeons/moc_pyramid.txt
+npc: npc/eamobs/dungeons/moc_sphinx.txt
+npc: npc/eamobs/dungeons/sunkenship.txt
+
+npc: npc/mobs/dungeons/amatdun.txt
+npc: npc/mobs/dungeons/anthell.txt
+npc: npc/mobs/dungeons/ayodun.txt
+npc: npc/mobs/dungeons/abyss.txt
+npc: npc/mobs/dungeons/beachdun.txt
+npc: npc/mobs/dungeons/eindun.txt
+npc: npc/mobs/dungeons/gefenia.txt
+npc: npc/mobs/dungeons/gondun.txt
+npc: npc/mobs/dungeons/guilddun.txt
+npc: npc/mobs/dungeons/icedun.txt
+npc: npc/mobs/dungeons/kiel.txt
+npc: npc/mobs/dungeons/lhzdun.txt
+npc: npc/mobs/dungeons/louydun.txt
+npc: npc/mobs/dungeons/magmadun.txt
+npc: npc/mobs/dungeons/orcdun.txt
+npc: npc/mobs/dungeons/payoncave.txt
+npc: npc/mobs/dungeons/pront_maze.txt
+npc: npc/mobs/dungeons/pront_sewers.txt
+//npc: npc/mobs/dungeons/racheldun.txt
+npc: npc/mobs/dungeons/thanatos.txt
+npc: npc/mobs/dungeons/toyfactory.txt
+npc: npc/mobs/dungeons/turtleisland.txt
+npc: npc/mobs/dungeons/umbaladun.txt
+npc: npc/mobs/dungeons/yggdrasil.txt
+// --------------------------------------------------------------
diff --git a/npc/scripts_guild.conf b/npc/scripts_guild.conf
index ecfebae3f..c4cc738de 100644
--- a/npc/scripts_guild.conf
+++ b/npc/scripts_guild.conf
@@ -1,67 +1,67 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// ------------------------- Guild Wars -------------------------
-// -- Guild Wars: General
-npc: npc/guild/gldfunc_manager.txt
-npc: npc/guild/gldfunc_dunsw.txt
-npc: npc/guild/gldfunc_flag.txt
-npc: npc/guild/gldfunc_treasure.txt
-npc: npc/guild/gldfunc_kafra.txt
-npc: npc/guild/gldfunc_ev_agit.txt
-npc: npc/guild/ev_agit_event.txt
-// -- Guild Wars: Al De Baran
-npc: npc/guild/aldeg/aldeg_ev_agit.txt
-npc: npc/guild/aldeg/aldeg_flags.txt
-npc: npc/guild/aldeg/aldeg_managers.txt
-npc: npc/guild/aldeg/aldeg_kafras.txt
-npc: npc/guild/aldeg/aldeg_treas.txt
-npc: npc/guild/aldeg/aldeg_dunsw.txt
-npc: npc/guild/aldeg/aldeg_guardians.txt
-// -- Guild Wars: Geffen
-npc: npc/guild/gefg/gefg_ev_agit.txt
-npc: npc/guild/gefg/gefg_flags.txt
-npc: npc/guild/gefg/gefg_managers.txt
-npc: npc/guild/gefg/gefg_kafras.txt
-npc: npc/guild/gefg/gefg_treas.txt
-npc: npc/guild/gefg/gefg_dunsw.txt
-npc: npc/guild/gefg/gefg_guardians.txt
-// -- Guild Wars: Payon
-npc: npc/guild/payg/payg_ev_agit.txt
-npc: npc/guild/payg/payg_flags.txt
-npc: npc/guild/payg/payg_managers.txt
-npc: npc/guild/payg/payg_kafras.txt
-npc: npc/guild/payg/payg_dunsw.txt
-npc: npc/guild/payg/payg_treas.txt
-npc: npc/guild/payg/payg_guardians.txt
-// -- Guild Wars: Prontera
-npc: npc/guild/prtg/prtg_ev_agit.txt
-npc: npc/guild/prtg/prtg_flags.txt
-npc: npc/guild/prtg/prtg_managers.txt
-npc: npc/guild/prtg/prtg_kafras.txt
-npc: npc/guild/prtg/prtg_dunsw.txt
-npc: npc/guild/prtg/prtg_treas.txt
-npc: npc/guild/prtg/prtg_guardians.txt
-// -- Guild Wars: NGuild
-npc: npc/guild/nguild/nguild_ev_agit.txt
-npc: npc/guild/nguild/nguild_flags.txt
-npc: npc/guild/nguild/nguild_managers.txt
-npc: npc/guild/nguild/nguild_kafras.txt
-//N Guild doesn't have REAL dungeons. They are connected to the common ones.
-//So better don't uncomment this line.
-//npc: npc/guild/nguild/nguild_dunsw.txt
-npc: npc/guild/nguild/nguild_treas.txt
-npc: npc/guild/nguild/nguild_guardians.txt
-npc: npc/guild/nguild/nguild_warper.txt
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// ------------------------- Guild Wars -------------------------
+// -- Guild Wars: General
+npc: npc/guild/gldfunc_manager.txt
+npc: npc/guild/gldfunc_dunsw.txt
+npc: npc/guild/gldfunc_flag.txt
+npc: npc/guild/gldfunc_treasure.txt
+npc: npc/guild/gldfunc_kafra.txt
+npc: npc/guild/gldfunc_ev_agit.txt
+npc: npc/guild/ev_agit_event.txt
+// -- Guild Wars: Al De Baran
+npc: npc/guild/aldeg/aldeg_ev_agit.txt
+npc: npc/guild/aldeg/aldeg_flags.txt
+npc: npc/guild/aldeg/aldeg_managers.txt
+npc: npc/guild/aldeg/aldeg_kafras.txt
+npc: npc/guild/aldeg/aldeg_treas.txt
+npc: npc/guild/aldeg/aldeg_dunsw.txt
+npc: npc/guild/aldeg/aldeg_guardians.txt
+// -- Guild Wars: Geffen
+npc: npc/guild/gefg/gefg_ev_agit.txt
+npc: npc/guild/gefg/gefg_flags.txt
+npc: npc/guild/gefg/gefg_managers.txt
+npc: npc/guild/gefg/gefg_kafras.txt
+npc: npc/guild/gefg/gefg_treas.txt
+npc: npc/guild/gefg/gefg_dunsw.txt
+npc: npc/guild/gefg/gefg_guardians.txt
+// -- Guild Wars: Payon
+npc: npc/guild/payg/payg_ev_agit.txt
+npc: npc/guild/payg/payg_flags.txt
+npc: npc/guild/payg/payg_managers.txt
+npc: npc/guild/payg/payg_kafras.txt
+npc: npc/guild/payg/payg_dunsw.txt
+npc: npc/guild/payg/payg_treas.txt
+npc: npc/guild/payg/payg_guardians.txt
+// -- Guild Wars: Prontera
+npc: npc/guild/prtg/prtg_ev_agit.txt
+npc: npc/guild/prtg/prtg_flags.txt
+npc: npc/guild/prtg/prtg_managers.txt
+npc: npc/guild/prtg/prtg_kafras.txt
+npc: npc/guild/prtg/prtg_dunsw.txt
+npc: npc/guild/prtg/prtg_treas.txt
+npc: npc/guild/prtg/prtg_guardians.txt
+// -- Guild Wars: NGuild
+npc: npc/guild/nguild/nguild_ev_agit.txt
+npc: npc/guild/nguild/nguild_flags.txt
+npc: npc/guild/nguild/nguild_managers.txt
+npc: npc/guild/nguild/nguild_kafras.txt
+//N Guild doesn't have REAL dungeons. They are connected to the common ones.
+//So better don't uncomment this line.
+//npc: npc/guild/nguild/nguild_dunsw.txt
+npc: npc/guild/nguild/nguild_treas.txt
+npc: npc/guild/nguild/nguild_guardians.txt
+npc: npc/guild/nguild/nguild_warper.txt
// -------------------------------------------------------------- \ No newline at end of file
diff --git a/npc/scripts_jmonsters.conf b/npc/scripts_jmonsters.conf
index a411bf5ad..88883364d 100644
--- a/npc/scripts_jmonsters.conf
+++ b/npc/scripts_jmonsters.conf
@@ -1,30 +1,30 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Monster Scripts -
-// --------------------------------------------------------------
-
-npc: npc/eamobs/jro/jro.txt
-
-// -- Those maps are missing in jRO X.3 spawns
-// -- Uncomment them if you want to have monsters on the
-// -- missing maps as well
-//npc: npc/eamobs/jro/other.txt
-//npc: npc/mobs/airplane.txt
-//npc: npc/mobs/fields/odin.txt
-//npc: npc/mobs/fields/rachel.txt
-//npc: npc/mobs/dungeons/kiel.txt
-//npc: npc/mobs/dungeons/icedun.txt
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Monster Scripts -
+// --------------------------------------------------------------
+
+npc: npc/eamobs/jro/jro.txt
+
+// -- Those maps are missing in jRO X.3 spawns
+// -- Uncomment them if you want to have monsters on the
+// -- missing maps as well
+//npc: npc/eamobs/jro/other.txt
+//npc: npc/mobs/airplane.txt
+//npc: npc/mobs/fields/odin.txt
+//npc: npc/mobs/fields/rachel.txt
+//npc: npc/mobs/dungeons/kiel.txt
+//npc: npc/mobs/dungeons/icedun.txt
// -------------------------------------------------------------- \ No newline at end of file
diff --git a/npc/scripts_jobs.conf b/npc/scripts_jobs.conf
index 06d1b6f60..49d9a31fe 100644
--- a/npc/scripts_jobs.conf
+++ b/npc/scripts_jobs.conf
@@ -1,90 +1,90 @@
-// --------------------------------------------------------------
-// - Job Scripts -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// ------------------------- Job Quests -------------------------
-
-// -- Novice
-npc: npc/jobs/novice/novice.txt
-npc: npc/jobs/novice/supernovice.txt
-// -- 1-1
-npc: npc/jobs/1-1/thief.txt
-npc: npc/jobs/1-1/archer.txt
-npc: npc/jobs/1-1/mage.txt
-npc: npc/jobs/1-1/merchant.txt
-npc: npc/jobs/1-1/acolyte.txt
-npc: npc/jobs/1-1/swordman.txt
-// -- 2-1
-npc: npc/jobs/2-1/blacksmith.txt
-npc: npc/jobs/2-1/knight.txt
-npc: npc/jobs/2-1/hunter.txt
-npc: npc/jobs/2-1/priest.txt
-npc: npc/jobs/2-1/wizard.txt
-npc: npc/jobs/2-1/assassin.txt
-// -- 2-2
-npc: npc/jobs/2-2/rogue.txt
-npc: npc/jobs/2-2/alchemist.txt
-npc: npc/jobs/2-2/sage.txt
-npc: npc/jobs/2-2/crusader.txt
-npc: npc/jobs/2-2/monk.txt
-npc: npc/jobs/2-2/dancer.txt
-npc: npc/jobs/2-2/bard.txt
-// -- 2-1A (Without Quest)
-npc: npc/jobs/2-1a/AssassinCross.txt
-npc: npc/jobs/2-1a/LordKnight.txt
-npc: npc/jobs/2-1a/HighPriest.txt
-npc: npc/jobs/2-1a/HighWizard.txt
-npc: npc/jobs/2-1a/WhiteSmith.txt
-npc: npc/jobs/2-1a/Sniper.txt
-// -- 2-2A (Without Quest)
-npc: npc/jobs/2-2a/Champion.txt
-npc: npc/jobs/2-2a/Clown.txt
-npc: npc/jobs/2-2a/Creator.txt
-npc: npc/jobs/2-2a/Gypsy.txt
-npc: npc/jobs/2-2a/Paladin.txt
-npc: npc/jobs/2-2a/Professor.txt
-npc: npc/jobs/2-2a/Stalker.txt
-// -- 1-1E (Without Quest)
-npc: npc/jobs/1-1e/gunslinger.txt
-npc: npc/jobs/1-1e/ninja.txt
-npc: npc/jobs/1-1e/taekwon.txt
-// -- 2-1E (Place Holder)
-npc: npc/jobs/2-1e/StarGladiator.txt
-// -- 2-2E (Place Holder)
-npc: npc/jobs/2-2e/SoulLinker.txt
-// --------------------------------------------------------------
-// ------------------------ Skill Quests ------------------------
-npc: npc/quests/skills/acolyte_skills.txt
-npc: npc/quests/skills/alchemist_skills.txt
-npc: npc/quests/skills/archer_skills.txt
-npc: npc/quests/skills/assassin_skills.txt
-npc: npc/quests/skills/bard_skills.txt
-npc: npc/quests/skills/blacksmith_skills.txt
-npc: npc/quests/skills/crusader_skills.txt
-npc: npc/quests/skills/dancer_skills.txt
-npc: npc/quests/skills/hunter_skills.txt
-npc: npc/quests/skills/knight_skills.txt
-npc: npc/quests/skills/mage_skills.txt
-npc: npc/quests/skills/merchant_skills.txt
-npc: npc/quests/skills/monk_skills.txt
-npc: npc/quests/skills/novice_skills.txt
-npc: npc/quests/skills/priest_skills.txt
-npc: npc/quests/skills/rogue_skills.txt
-npc: npc/quests/skills/sage_skills.txt
-npc: npc/quests/skills/swordman_skills.txt
-npc: npc/quests/skills/thief_skills.txt
-npc: npc/quests/skills/wizard_skills.txt
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Job Scripts -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! ÂûGEûGE -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// ------------------------- Job Quests -------------------------
+
+// -- Novice
+npc: npc/jobs/novice/novice.txt
+npc: npc/jobs/novice/supernovice.txt
+// -- 1-1
+npc: npc/jobs/1-1/thief.txt
+npc: npc/jobs/1-1/archer.txt
+npc: npc/jobs/1-1/mage.txt
+npc: npc/jobs/1-1/merchant.txt
+npc: npc/jobs/1-1/acolyte.txt
+npc: npc/jobs/1-1/swordman.txt
+// -- 2-1
+npc: npc/jobs/2-1/blacksmith.txt
+npc: npc/jobs/2-1/knight.txt
+npc: npc/jobs/2-1/hunter.txt
+npc: npc/jobs/2-1/priest.txt
+npc: npc/jobs/2-1/wizard.txt
+npc: npc/jobs/2-1/assassin.txt
+// -- 2-2
+npc: npc/jobs/2-2/rogue.txt
+npc: npc/jobs/2-2/alchemist.txt
+npc: npc/jobs/2-2/sage.txt
+npc: npc/jobs/2-2/crusader.txt
+npc: npc/jobs/2-2/monk.txt
+npc: npc/jobs/2-2/dancer.txt
+npc: npc/jobs/2-2/bard.txt
+// -- 2-1A (Without Quest)
+npc: npc/jobs/2-1a/AssassinCross.txt
+npc: npc/jobs/2-1a/LordKnight.txt
+npc: npc/jobs/2-1a/HighPriest.txt
+npc: npc/jobs/2-1a/HighWizard.txt
+npc: npc/jobs/2-1a/WhiteSmith.txt
+npc: npc/jobs/2-1a/Sniper.txt
+// -- 2-2A (Without Quest)
+npc: npc/jobs/2-2a/Champion.txt
+npc: npc/jobs/2-2a/Clown.txt
+npc: npc/jobs/2-2a/Creator.txt
+npc: npc/jobs/2-2a/Gypsy.txt
+npc: npc/jobs/2-2a/Paladin.txt
+npc: npc/jobs/2-2a/Professor.txt
+npc: npc/jobs/2-2a/Stalker.txt
+// -- 1-1E (Without Quest)
+npc: npc/jobs/1-1e/gunslinger.txt
+npc: npc/jobs/1-1e/ninja.txt
+npc: npc/jobs/1-1e/taekwon.txt
+// -- 2-1E (Place Holder)
+npc: npc/jobs/2-1e/StarGladiator.txt
+// -- 2-2E (Place Holder)
+npc: npc/jobs/2-2e/SoulLinker.txt
+// --------------------------------------------------------------
+// ------------------------ Skill Quests ------------------------
+npc: npc/quests/skills/acolyte_skills.txt
+npc: npc/quests/skills/alchemist_skills.txt
+npc: npc/quests/skills/archer_skills.txt
+npc: npc/quests/skills/assassin_skills.txt
+npc: npc/quests/skills/bard_skills.txt
+npc: npc/quests/skills/blacksmith_skills.txt
+npc: npc/quests/skills/crusader_skills.txt
+npc: npc/quests/skills/dancer_skills.txt
+npc: npc/quests/skills/hunter_skills.txt
+npc: npc/quests/skills/knight_skills.txt
+npc: npc/quests/skills/mage_skills.txt
+npc: npc/quests/skills/merchant_skills.txt
+npc: npc/quests/skills/monk_skills.txt
+npc: npc/quests/skills/novice_skills.txt
+npc: npc/quests/skills/priest_skills.txt
+npc: npc/quests/skills/rogue_skills.txt
+npc: npc/quests/skills/sage_skills.txt
+npc: npc/quests/skills/swordman_skills.txt
+npc: npc/quests/skills/thief_skills.txt
+npc: npc/quests/skills/wizard_skills.txt
+// --------------------------------------------------------------
diff --git a/npc/scripts_main.conf b/npc/scripts_main.conf
index 4544037d9..87773c191 100644
--- a/npc/scripts_main.conf
+++ b/npc/scripts_main.conf
@@ -1,57 +1,57 @@
-// --------------------------------------------------------------
-// - eAthena Primary Scripts File -
-// --------------------------------------------------------------
-// The idea of this new system is to make scripts more organized
-// since the old system was rather messy with all the NPCs in one
-// file. Now scripts are organized in to files arraged by type.
-// Custom scripts are now in scripts_custom.conf, all other
-// scripts are deemed as 'official'. You should place your NPCs
-// in to scripts_custom.conf to follow the trend.
-//
-// Thanks,
-// Ancyker and the rest of the eAthena Team
-//
-// Note: "Comments" are all text on the right side of a double slash "//"
-// Whatever text is commented will not be parsed by the servers, and serves
-// only as information/reference.
-//
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// ------------------ Global Scripts Functions ------------------
-// !! Warning! Do NOT remove there or it breaks a lot of items !!
-npc: npc/other/Global_Functions.txt
-// --------------------------------------------------------------
-// ------------------------ PCLoginEvent ------------------------
-// NPC which is activated for every player who logs in.
-//npc: npc/sample/PCLoginEvent.txt
-// --------------------------------------------------------------
-// ------------------------ Script Files ------------------------
-import: npc/scripts_mapflags.conf
-import: npc/scripts_warps.conf
-// -- scripts_monsters.conf is official spawns
-// -- scripts_eamonsters.conf is modified for eAthena in an attempt to have more balanced/fair spawns
-// -- script_jmonsters.conf is the official jRO spawns which differ from kRO ones
-import: npc/scripts_monsters.conf
-//import: npc/scripts_eamonsters.conf
-//import: npc/scripts_jmonsters.conf
-import: npc/scripts_athena.conf
-import: npc/scripts_jobs.conf
-import: npc/scripts_guild.conf
-// -- Your NPCs go in this file!
-import: npc/scripts_custom.conf
-// -- eAAC Scripts
-import: npc/scripts_eaac.conf
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - eAthena Primary Scripts File -
+// --------------------------------------------------------------
+// The idea of this new system is to make scripts more organized
+// since the old system was rather messy with all the NPCs in one
+// file. Now scripts are organized in to files arraged by type.
+// Custom scripts are now in scripts_custom.conf, all other
+// scripts are deemed as 'official'. You should place your NPCs
+// in to scripts_custom.conf to follow the trend.
+//
+// Thanks,
+// Ancyker and the rest of the eAthena Team
+//
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+//
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// ------------------ Global Scripts Functions ------------------
+// !! Warning! Do NOT remove there or it breaks a lot of items !!
+npc: npc/other/Global_Functions.txt
+// --------------------------------------------------------------
+// ------------------------ PCLoginEvent ------------------------
+// NPC which is activated for every player who logs in.
+//npc: npc/sample/PCLoginEvent.txt
+// --------------------------------------------------------------
+// ------------------------ Script Files ------------------------
+import: npc/scripts_mapflags.conf
+import: npc/scripts_warps.conf
+// -- scripts_monsters.conf is official spawns
+// -- scripts_eamonsters.conf is modified for eAthena in an attempt to have more balanced/fair spawns
+// -- script_jmonsters.conf is the official jRO spawns which differ from kRO ones
+import: npc/scripts_monsters.conf
+//import: npc/scripts_eamonsters.conf
+//import: npc/scripts_jmonsters.conf
+import: npc/scripts_athena.conf
+import: npc/scripts_jobs.conf
+import: npc/scripts_guild.conf
+// -- Your NPCs go in this file!
+import: npc/scripts_custom.conf
+// -- eAAC Scripts
+import: npc/scripts_eaac.conf
+// --------------------------------------------------------------
diff --git a/npc/scripts_mapflags.conf b/npc/scripts_mapflags.conf
index f73218d3e..e71f75176 100644
--- a/npc/scripts_mapflags.conf
+++ b/npc/scripts_mapflags.conf
@@ -1,39 +1,39 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Map Flags -
-// --------------------------------------------------------------
-npc: conf/mapflag/gvg.txt
-npc: conf/mapflag/indoors.txt
-npc: conf/mapflag/jail.txt
-npc: conf/mapflag/nightmare.txt
-npc: conf/mapflag/nobranch.txt
-npc: conf/mapflag/noexp.txt
-npc: conf/mapflag/noicewall.txt
-npc: conf/mapflag/noloot.txt
-npc: conf/mapflag/nomemo.txt
-npc: conf/mapflag/nopenalty.txt
-npc: conf/mapflag/nopvp.txt
-npc: conf/mapflag/nosave.txt
-npc: conf/mapflag/noteleport.txt
-npc: conf/mapflag/noreturn.txt
-npc: conf/mapflag/nowarp.txt
-npc: conf/mapflag/nowarpto.txt
-npc: conf/mapflag/pvp.txt
-npc: conf/mapflag/pvp_noparty.txt
-npc: conf/mapflag/pvp_noguild.txt
-npc: conf/mapflag/night.txt
-npc: conf/mapflag/restricted.txt
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Map Flags -
+// --------------------------------------------------------------
+npc: conf/mapflag/gvg.txt
+npc: conf/mapflag/indoors.txt
+npc: conf/mapflag/jail.txt
+npc: conf/mapflag/nightmare.txt
+npc: conf/mapflag/nobranch.txt
+npc: conf/mapflag/noexp.txt
+npc: conf/mapflag/noicewall.txt
+npc: conf/mapflag/noloot.txt
+npc: conf/mapflag/nomemo.txt
+npc: conf/mapflag/nopenalty.txt
+npc: conf/mapflag/nopvp.txt
+npc: conf/mapflag/nosave.txt
+npc: conf/mapflag/noteleport.txt
+npc: conf/mapflag/noreturn.txt
+npc: conf/mapflag/nowarp.txt
+npc: conf/mapflag/nowarpto.txt
+npc: conf/mapflag/pvp.txt
+npc: conf/mapflag/pvp_noparty.txt
+npc: conf/mapflag/pvp_noguild.txt
+npc: conf/mapflag/night.txt
+npc: conf/mapflag/restricted.txt
+// --------------------------------------------------------------
diff --git a/npc/scripts_monsters.conf b/npc/scripts_monsters.conf
index a89d21245..692c3dadb 100644
--- a/npc/scripts_monsters.conf
+++ b/npc/scripts_monsters.conf
@@ -1,76 +1,76 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Monster Scripts -
-// --------------------------------------------------------------
-npc: npc/mobs/citycleaners.txt
-npc: npc/mobs/pvp.txt
-npc: npc/mobs/airplane.txt
-
-npc: npc/mobs/fields/amatsu.txt
-npc: npc/mobs/fields/ayothaya.txt
-npc: npc/mobs/fields/comodo.txt
-npc: npc/mobs/fields/einbroch.txt
-npc: npc/mobs/fields/geffen.txt
-npc: npc/mobs/fields/gonryun.txt
-npc: npc/mobs/fields/hugel.txt
-npc: npc/mobs/fields/jawaii.txt
-npc: npc/mobs/fields/lighthalzen.txt
-npc: npc/mobs/fields/louyang.txt
-npc: npc/mobs/fields/lutie.txt
-npc: npc/mobs/fields/mjolnir.txt
-npc: npc/mobs/fields/morocc.txt
-npc: npc/mobs/fields/niflheim.txt
-npc: npc/mobs/fields/odin.txt
-npc: npc/mobs/fields/payon.txt
-npc: npc/mobs/fields/prontera.txt
-npc: npc/mobs/fields/rachel.txt
-npc: npc/mobs/fields/umbala.txt
-npc: npc/mobs/fields/yuno.txt
-
-npc: npc/mobs/dungeons/amatdun.txt
-npc: npc/mobs/dungeons/anthell.txt
-npc: npc/mobs/dungeons/ayodun.txt
-npc: npc/mobs/dungeons/abyss.txt
-npc: npc/mobs/dungeons/beachdun.txt
-npc: npc/mobs/dungeons/byalan.txt
-npc: npc/mobs/dungeons/clocktower.txt
-npc: npc/mobs/dungeons/coalmine.txt
-npc: npc/mobs/dungeons/eindun.txt
-npc: npc/mobs/dungeons/gefenia.txt
-npc: npc/mobs/dungeons/geftower.txt
-npc: npc/mobs/dungeons/glastheim.txt
-npc: npc/mobs/dungeons/gondun.txt
-npc: npc/mobs/dungeons/guilddun.txt
-npc: npc/mobs/dungeons/icedun.txt
-npc: npc/mobs/dungeons/jupedun.txt
-npc: npc/mobs/dungeons/kiel.txt
-npc: npc/mobs/dungeons/lhzdun.txt
-npc: npc/mobs/dungeons/louydun.txt
-npc: npc/mobs/dungeons/magmadun.txt
-npc: npc/mobs/dungeons/moc_pyramid.txt
-npc: npc/mobs/dungeons/moc_sphinx.txt
-npc: npc/mobs/dungeons/orcdun.txt
-npc: npc/mobs/dungeons/payoncave.txt
-npc: npc/mobs/dungeons/pront_maze.txt
-npc: npc/mobs/dungeons/pront_sewers.txt
-//npc: npc/mobs/dungeons/racheldun.txt
-npc: npc/mobs/dungeons/sunkenship.txt
-npc: npc/mobs/dungeons/thanatos.txt
-npc: npc/mobs/dungeons/toyfactory.txt
-npc: npc/mobs/dungeons/turtleisland.txt
-npc: npc/mobs/dungeons/umbaladun.txt
-npc: npc/mobs/dungeons/yggdrasil.txt
-// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Monster Scripts -
+// --------------------------------------------------------------
+npc: npc/mobs/citycleaners.txt
+npc: npc/mobs/pvp.txt
+npc: npc/mobs/airplane.txt
+
+npc: npc/mobs/fields/amatsu.txt
+npc: npc/mobs/fields/ayothaya.txt
+npc: npc/mobs/fields/comodo.txt
+npc: npc/mobs/fields/einbroch.txt
+npc: npc/mobs/fields/geffen.txt
+npc: npc/mobs/fields/gonryun.txt
+npc: npc/mobs/fields/hugel.txt
+npc: npc/mobs/fields/jawaii.txt
+npc: npc/mobs/fields/lighthalzen.txt
+npc: npc/mobs/fields/louyang.txt
+npc: npc/mobs/fields/lutie.txt
+npc: npc/mobs/fields/mjolnir.txt
+npc: npc/mobs/fields/morocc.txt
+npc: npc/mobs/fields/niflheim.txt
+npc: npc/mobs/fields/odin.txt
+npc: npc/mobs/fields/payon.txt
+npc: npc/mobs/fields/prontera.txt
+npc: npc/mobs/fields/rachel.txt
+npc: npc/mobs/fields/umbala.txt
+npc: npc/mobs/fields/yuno.txt
+
+npc: npc/mobs/dungeons/amatdun.txt
+npc: npc/mobs/dungeons/anthell.txt
+npc: npc/mobs/dungeons/ayodun.txt
+npc: npc/mobs/dungeons/abyss.txt
+npc: npc/mobs/dungeons/beachdun.txt
+npc: npc/mobs/dungeons/byalan.txt
+npc: npc/mobs/dungeons/clocktower.txt
+npc: npc/mobs/dungeons/coalmine.txt
+npc: npc/mobs/dungeons/eindun.txt
+npc: npc/mobs/dungeons/gefenia.txt
+npc: npc/mobs/dungeons/geftower.txt
+npc: npc/mobs/dungeons/glastheim.txt
+npc: npc/mobs/dungeons/gondun.txt
+npc: npc/mobs/dungeons/guilddun.txt
+npc: npc/mobs/dungeons/icedun.txt
+npc: npc/mobs/dungeons/jupedun.txt
+npc: npc/mobs/dungeons/kiel.txt
+npc: npc/mobs/dungeons/lhzdun.txt
+npc: npc/mobs/dungeons/louydun.txt
+npc: npc/mobs/dungeons/magmadun.txt
+npc: npc/mobs/dungeons/moc_pyramid.txt
+npc: npc/mobs/dungeons/moc_sphinx.txt
+npc: npc/mobs/dungeons/orcdun.txt
+npc: npc/mobs/dungeons/payoncave.txt
+npc: npc/mobs/dungeons/pront_maze.txt
+npc: npc/mobs/dungeons/pront_sewers.txt
+//npc: npc/mobs/dungeons/racheldun.txt
+npc: npc/mobs/dungeons/sunkenship.txt
+npc: npc/mobs/dungeons/thanatos.txt
+npc: npc/mobs/dungeons/toyfactory.txt
+npc: npc/mobs/dungeons/turtleisland.txt
+npc: npc/mobs/dungeons/umbaladun.txt
+npc: npc/mobs/dungeons/yggdrasil.txt
+// --------------------------------------------------------------
diff --git a/npc/scripts_warps.conf b/npc/scripts_warps.conf
index 84584d5ea..266a1bc77 100644
--- a/npc/scripts_warps.conf
+++ b/npc/scripts_warps.conf
@@ -1,98 +1,98 @@
-// --------------------------------------------------------------
-// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
-// --------------------------------------------------------------
-// - All scripts here should be used at your own risk. If you -
-// - have edited it yourself, we are not responsible for any -
-// - Damages or whatsoever. Do not report any bugs unless you -
-// - are sure they exsist. Please provide evidence and proof. -
-// - eAthena developmers are not responsible for any damages or -
-// - disruptions of service during the service of the server -
-// - caused by the included scripts or for any damages -
-// - resulting in the use of the scripts. -
-// - Thanks, -
-// - eAthena Dev Team -
-// --------------------------------------------------------------
-// --------------------------------------------------------------
-// - Warp Scripts -
-// --------------------------------------------------------------
-// --------------------------- Cities ---------------------------
-npc: npc/warps/cities/alberta.txt
-npc: npc/warps/cities/aldebaran.txt
-npc: npc/warps/cities/amatsu.txt
-npc: npc/warps/cities/ayothaya.txt
-npc: npc/warps/cities/comodo.txt
-npc: npc/warps/cities/einbech.txt
-npc: npc/warps/cities/einbroch.txt
-npc: npc/warps/cities/geffen.txt
-npc: npc/warps/cities/gonryun.txt
-npc: npc/warps/cities/hugel.txt
-npc: npc/warps/cities/izlude.txt
-npc: npc/warps/cities/lighthalzen.txt
-npc: npc/warps/cities/louyang.txt
-npc: npc/warps/cities/lutie.txt
-npc: npc/warps/cities/morroc.txt
-npc: npc/warps/cities/niflheim.txt
-npc: npc/warps/cities/payon.txt
-npc: npc/warps/cities/prontera.txt
-npc: npc/warps/cities/rachel.txt
-npc: npc/warps/cities/umbala.txt
-npc: npc/warps/cities/yggdrasil.txt
-npc: npc/warps/cities/yuno.txt
-// -------------------------- Dungeons --------------------------
-npc: npc/warps/dungeons/abyss.txt
-npc: npc/warps/dungeons/alberta_duns.txt
-npc: npc/warps/dungeons/alde_ct.txt
-npc: npc/warps/dungeons/amatsu_dun.txt
-npc: npc/warps/dungeons/ant_hell.txt
-npc: npc/warps/dungeons/ayo_dun.txt
-npc: npc/warps/dungeons/coal_mine.txt
-npc: npc/warps/dungeons/com_dun.txt
-npc: npc/warps/dungeons/ein_dun.txt
-npc: npc/warps/dungeons/geffen_dun.txt
-npc: npc/warps/dungeons/gon_dun.txt
-npc: npc/warps/dungeons/ice_dun.txt
-npc: npc/warps/dungeons/izlude_dun.txt
-npc: npc/warps/dungeons/juperos.txt
-npc: npc/warps/dungeons/lhalzen_dun.txt
-npc: npc/warps/dungeons/louyang_dun.txt
-npc: npc/warps/dungeons/lutie_dun.txt
-npc: npc/warps/dungeons/morroc_duns.txt
-npc: npc/warps/dungeons/odin.txt
-npc: npc/warps/dungeons/orc_dun.txt
-npc: npc/warps/dungeons/payon_dun.txt
-npc: npc/warps/dungeons/prt_dun.txt
-npc: npc/warps/dungeons/rachel_dun.txt
-npc: npc/warps/dungeons/thana_dun.txt
-//npc: npc/warps/dungeons/thana_custom.txt
-npc: npc/warps/dungeons/umbala_dun.txt
-npc: npc/warps/dungeons/yuno_dun.txt
-npc: npc/warps/dungeons/kiel_dun.txt
-// --------------------------- Fields ---------------------------
-npc: npc/warps/fields/amatsu_fild.txt
-npc: npc/warps/fields/com_fild.txt
-npc: npc/warps/fields/ein_fild.txt
-npc: npc/warps/fields/gefenia.txt
-npc: npc/warps/fields/geffen_fild.txt
-npc: npc/warps/fields/glastheim.txt
-npc: npc/warps/fields/hugel_fild.txt
-npc: npc/warps/fields/jawaii.txt
-npc: npc/warps/fields/lhalzen_fild.txt
-npc: npc/warps/fields/lutie_fild.txt
-npc: npc/warps/fields/morroc_fild.txt
-npc: npc/warps/fields/mtmjolnir.txt
-npc: npc/warps/fields/payon_fild.txt
-npc: npc/warps/fields/prontera_fild.txt
-npc: npc/warps/fields/rachel_fild.txt
-npc: npc/warps/fields/umbala_fild.txt
-npc: npc/warps/fields/yuno_fild.txt
-npc: npc/warps/fields/abyss_warper.txt
-// --------------------------- Others ---------------------------
-npc: npc/warps/guild/guildcastles.txt
-npc: npc/warps/other/jobquests.txt
-npc: npc/warps/other/airplane.txt
-npc: npc/warps/other/other.txt
-npc: npc/warps/other/kiel.txt
-npc: npc/warps/other/sign.txt
-npc: npc/warps/other/god.txt
-npc: npc/warps/pvp/pvp.txt
+// --------------------------------------------------------------
+// - Warning!! Acktung!! Awas!! gevaar!! peligro!! Âíèìàíèå! -
+// --------------------------------------------------------------
+// - All scripts here should be used at your own risk. If you -
+// - have edited it yourself, we are not responsible for any -
+// - Damages or whatsoever. Do not report any bugs unless you -
+// - are sure they exsist. Please provide evidence and proof. -
+// - eAthena developmers are not responsible for any damages or -
+// - disruptions of service during the service of the server -
+// - caused by the included scripts or for any damages -
+// - resulting in the use of the scripts. -
+// - Thanks, -
+// - eAthena Dev Team -
+// --------------------------------------------------------------
+// --------------------------------------------------------------
+// - Warp Scripts -
+// --------------------------------------------------------------
+// --------------------------- Cities ---------------------------
+npc: npc/warps/cities/alberta.txt
+npc: npc/warps/cities/aldebaran.txt
+npc: npc/warps/cities/amatsu.txt
+npc: npc/warps/cities/ayothaya.txt
+npc: npc/warps/cities/comodo.txt
+npc: npc/warps/cities/einbech.txt
+npc: npc/warps/cities/einbroch.txt
+npc: npc/warps/cities/geffen.txt
+npc: npc/warps/cities/gonryun.txt
+npc: npc/warps/cities/hugel.txt
+npc: npc/warps/cities/izlude.txt
+npc: npc/warps/cities/lighthalzen.txt
+npc: npc/warps/cities/louyang.txt
+npc: npc/warps/cities/lutie.txt
+npc: npc/warps/cities/morroc.txt
+npc: npc/warps/cities/niflheim.txt
+npc: npc/warps/cities/payon.txt
+npc: npc/warps/cities/prontera.txt
+npc: npc/warps/cities/rachel.txt
+npc: npc/warps/cities/umbala.txt
+npc: npc/warps/cities/yggdrasil.txt
+npc: npc/warps/cities/yuno.txt
+// -------------------------- Dungeons --------------------------
+npc: npc/warps/dungeons/abyss.txt
+npc: npc/warps/dungeons/alberta_duns.txt
+npc: npc/warps/dungeons/alde_ct.txt
+npc: npc/warps/dungeons/amatsu_dun.txt
+npc: npc/warps/dungeons/ant_hell.txt
+npc: npc/warps/dungeons/ayo_dun.txt
+npc: npc/warps/dungeons/coal_mine.txt
+npc: npc/warps/dungeons/com_dun.txt
+npc: npc/warps/dungeons/ein_dun.txt
+npc: npc/warps/dungeons/geffen_dun.txt
+npc: npc/warps/dungeons/gon_dun.txt
+npc: npc/warps/dungeons/ice_dun.txt
+npc: npc/warps/dungeons/izlude_dun.txt
+npc: npc/warps/dungeons/juperos.txt
+npc: npc/warps/dungeons/lhalzen_dun.txt
+npc: npc/warps/dungeons/louyang_dun.txt
+npc: npc/warps/dungeons/lutie_dun.txt
+npc: npc/warps/dungeons/morroc_duns.txt
+npc: npc/warps/dungeons/odin.txt
+npc: npc/warps/dungeons/orc_dun.txt
+npc: npc/warps/dungeons/payon_dun.txt
+npc: npc/warps/dungeons/prt_dun.txt
+npc: npc/warps/dungeons/rachel_dun.txt
+npc: npc/warps/dungeons/thana_dun.txt
+//npc: npc/warps/dungeons/thana_custom.txt
+npc: npc/warps/dungeons/umbala_dun.txt
+npc: npc/warps/dungeons/yuno_dun.txt
+npc: npc/warps/dungeons/kiel_dun.txt
+// --------------------------- Fields ---------------------------
+npc: npc/warps/fields/amatsu_fild.txt
+npc: npc/warps/fields/com_fild.txt
+npc: npc/warps/fields/ein_fild.txt
+npc: npc/warps/fields/gefenia.txt
+npc: npc/warps/fields/geffen_fild.txt
+npc: npc/warps/fields/glastheim.txt
+npc: npc/warps/fields/hugel_fild.txt
+npc: npc/warps/fields/jawaii.txt
+npc: npc/warps/fields/lhalzen_fild.txt
+npc: npc/warps/fields/lutie_fild.txt
+npc: npc/warps/fields/morroc_fild.txt
+npc: npc/warps/fields/mtmjolnir.txt
+npc: npc/warps/fields/payon_fild.txt
+npc: npc/warps/fields/prontera_fild.txt
+npc: npc/warps/fields/rachel_fild.txt
+npc: npc/warps/fields/umbala_fild.txt
+npc: npc/warps/fields/yuno_fild.txt
+npc: npc/warps/fields/abyss_warper.txt
+// --------------------------- Others ---------------------------
+npc: npc/warps/guild/guildcastles.txt
+npc: npc/warps/other/jobquests.txt
+npc: npc/warps/other/airplane.txt
+npc: npc/warps/other/other.txt
+npc: npc/warps/other/kiel.txt
+npc: npc/warps/other/sign.txt
+npc: npc/warps/other/god.txt
+npc: npc/warps/pvp/pvp.txt
// -------------------------------------------------------------- \ No newline at end of file
diff --git a/npc/warps/cities/alberta.txt b/npc/warps/cities/alberta.txt
index 1ab9241fd..576a2284a 100644
--- a/npc/warps/cities/alberta.txt
+++ b/npc/warps/cities/alberta.txt
@@ -1,58 +1,58 @@
-//===== Athena Script ========================================
-//= Alberta Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Alberta, Treasure Island & Turtle Island
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//Alberta City
-alberta.gat,15,234,0 warp alb001 2,5,pay_fild03.gat,388,63
-alberta.gat,117,38,0 warp alb01 2,2,alberta_in.gat,180,30
-alberta.gat,134,38,0 warp alb02 1,1,alberta_in.gat,70,141
-alberta.gat,170,170,0 warp alb03 1,1,alb_ship.gat,26,168
-alberta.gat,178,165,0 warp alb04 1,2,alb_ship.gat,39,163
-alberta.gat,209,173,0 warp alb05 1,2,alb_ship.gat,162,171
-alberta.gat,33,42,0 warp alb06 2,2,alberta_in.gat,74,44
-alberta.gat,65,233,0 warp alb07 2,2,alberta_in.gat,18,141
-alberta.gat,93,205,0 warp alb08 2,2,alberta_in.gat,114,134
-alberta.gat,98,153,0 warp alb09 2,2,alberta_in.gat,185,89
-alberta.gat,99,221,0 warp alb10 2,2,alberta_in.gat,122,161
-alb_ship.gat,26,166,0 warp alb03-1 4,1,alberta.gat,170,168
-alb_ship.gat,41,163,0 warp alb04-1 1,3,alberta.gat,180,165
-alb_ship.gat,160,171,0 warp alb05-1 1,3,alberta.gat,207,173
-alb_ship.gat,37,174,0 warp alb20 1,2,alb_ship.gat,70,99
-alb_ship.gat,68,99,0 warp alb20-1 1,3,alb_ship.gat,35,173
-alberta_in.gat,189,89,0 warp alb09-1 2,2,alberta.gat,102,153
-alberta_in.gat,114,130,0 warp alb08-1 2,2,alberta.gat,93,201
-alberta_in.gat,14,141,0 warp alb07-1 2,3,alberta.gat,61,233
-alberta_in.gat,180,34,0 warp alb01-1 2,2,alberta.gat,117,42
-alberta_in.gat,73,141,0 warp alb02-1 2,3,alberta.gat,137,37
-alberta_in.gat,78,44,0 warp alb06-1 2,5,alberta.gat,37,41
-alberta_in.gat,125,161,0 warp alb10-1 2,2,alberta.gat,102,222
-alberta_in.gat,114,183,0 warp alb11 1,1,alberta_in.gat,148,186
-alberta_in.gat,152,186,0 warp alb11-1 1,1,alberta_in.gat,118,183
-alberta_in.gat,114,49,0 warp alb12 2,2,alberta_in.gat,155,153
-alberta_in.gat,159,153,0 warp alb12-1 2,2,alberta_in.gat,117,49
-alberta_in.gat,114,97,0 warp alb13 2,2,alberta_in.gat,155,175
-alberta_in.gat,159,175,0 warp alb13-1 2,2,alberta_in.gat,117,97
-alberta_in.gat,22,113,0 warp alb14 3,2,alberta_in.gat,22,134
-alberta_in.gat,22,130,0 warp alb14-1 3,2,alberta_in.gat,22,109
-alberta_in.gat,22,153,0 warp alb15 3,2,alberta_in.gat,22,174
-alberta_in.gat,22,170,0 warp alb15-1 3,2,alberta_in.gat,22,149
-alberta_in.gat,24,33,0 warp alb16 3,2,alberta_in.gat,64,35
-alberta_in.gat,64,31,0 warp alb16-1 3,2,alberta_in.gat,24,29
-alberta_in.gat,24,54,0 warp alb17 3,2,alberta_in.gat,64,53
-alberta_in.gat,64,57,0 warp alb17-1 3,2,alberta_in.gat,24,58
-alberta_in.gat,66,113,0 warp alb18 3,1,alberta_in.gat,66,132
-alberta_in.gat,66,130,0 warp alb18-1 3,1,alberta_in.gat,66,111
-alberta_in.gat,66,153,0 warp alb19 3,2,alberta_in.gat,66,173
-alberta_in.gat,66,170,0 warp alb19-1 3,2,alberta_in.gat,66,149
-alb2trea.gat,88,111,0 warp alb002 1,1,treasure01.gat,69,24
+//===== Athena Script ========================================
+//= Alberta Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Alberta, Treasure Island & Turtle Island
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//Alberta City
+alberta.gat,15,234,0 warp alb001 2,5,pay_fild03.gat,388,63
+alberta.gat,117,38,0 warp alb01 2,2,alberta_in.gat,180,30
+alberta.gat,134,38,0 warp alb02 1,1,alberta_in.gat,70,141
+alberta.gat,170,170,0 warp alb03 1,1,alb_ship.gat,26,168
+alberta.gat,178,165,0 warp alb04 1,2,alb_ship.gat,39,163
+alberta.gat,209,173,0 warp alb05 1,2,alb_ship.gat,162,171
+alberta.gat,33,42,0 warp alb06 2,2,alberta_in.gat,74,44
+alberta.gat,65,233,0 warp alb07 2,2,alberta_in.gat,18,141
+alberta.gat,93,205,0 warp alb08 2,2,alberta_in.gat,114,134
+alberta.gat,98,153,0 warp alb09 2,2,alberta_in.gat,185,89
+alberta.gat,99,221,0 warp alb10 2,2,alberta_in.gat,122,161
+alb_ship.gat,26,166,0 warp alb03-1 4,1,alberta.gat,170,168
+alb_ship.gat,41,163,0 warp alb04-1 1,3,alberta.gat,180,165
+alb_ship.gat,160,171,0 warp alb05-1 1,3,alberta.gat,207,173
+alb_ship.gat,37,174,0 warp alb20 1,2,alb_ship.gat,70,99
+alb_ship.gat,68,99,0 warp alb20-1 1,3,alb_ship.gat,35,173
+alberta_in.gat,189,89,0 warp alb09-1 2,2,alberta.gat,102,153
+alberta_in.gat,114,130,0 warp alb08-1 2,2,alberta.gat,93,201
+alberta_in.gat,14,141,0 warp alb07-1 2,3,alberta.gat,61,233
+alberta_in.gat,180,34,0 warp alb01-1 2,2,alberta.gat,117,42
+alberta_in.gat,73,141,0 warp alb02-1 2,3,alberta.gat,137,37
+alberta_in.gat,78,44,0 warp alb06-1 2,5,alberta.gat,37,41
+alberta_in.gat,125,161,0 warp alb10-1 2,2,alberta.gat,102,222
+alberta_in.gat,114,183,0 warp alb11 1,1,alberta_in.gat,148,186
+alberta_in.gat,152,186,0 warp alb11-1 1,1,alberta_in.gat,118,183
+alberta_in.gat,114,49,0 warp alb12 2,2,alberta_in.gat,155,153
+alberta_in.gat,159,153,0 warp alb12-1 2,2,alberta_in.gat,117,49
+alberta_in.gat,114,97,0 warp alb13 2,2,alberta_in.gat,155,175
+alberta_in.gat,159,175,0 warp alb13-1 2,2,alberta_in.gat,117,97
+alberta_in.gat,22,113,0 warp alb14 3,2,alberta_in.gat,22,134
+alberta_in.gat,22,130,0 warp alb14-1 3,2,alberta_in.gat,22,109
+alberta_in.gat,22,153,0 warp alb15 3,2,alberta_in.gat,22,174
+alberta_in.gat,22,170,0 warp alb15-1 3,2,alberta_in.gat,22,149
+alberta_in.gat,24,33,0 warp alb16 3,2,alberta_in.gat,64,35
+alberta_in.gat,64,31,0 warp alb16-1 3,2,alberta_in.gat,24,29
+alberta_in.gat,24,54,0 warp alb17 3,2,alberta_in.gat,64,53
+alberta_in.gat,64,57,0 warp alb17-1 3,2,alberta_in.gat,24,58
+alberta_in.gat,66,113,0 warp alb18 3,1,alberta_in.gat,66,132
+alberta_in.gat,66,130,0 warp alb18-1 3,1,alberta_in.gat,66,111
+alberta_in.gat,66,153,0 warp alb19 3,2,alberta_in.gat,66,173
+alberta_in.gat,66,170,0 warp alb19-1 3,2,alberta_in.gat,66,149
+alb2trea.gat,88,111,0 warp alb002 1,1,treasure01.gat,69,24
diff --git a/npc/warps/cities/aldebaran.txt b/npc/warps/cities/aldebaran.txt
index 53c7f9d91..6545ee9d5 100644
--- a/npc/warps/cities/aldebaran.txt
+++ b/npc/warps/cities/aldebaran.txt
@@ -1,51 +1,51 @@
-//===== Athena Script ========================================
-//= Al de Baran Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Al de Baran
-//===== Additional Comments: =================================
-//= 1.2 Added Turbo Room Warps [Justin84]
-//============================================================
-
-//===== Al De Baran Warps =====================================
-aldebaran.gat,118,63,0 warp ald01 1,1,aldeba_in.gat,211,117
-aldebaran.gat,139,34,0 warp ald001 3,2,mjolnir_12.gat,199,375
-aldebaran.gat,197,70,0 warp ald02 1,1,aldeba_in.gat,94,41
-aldebaran.gat,233,105,0 warp ald04 1,1,aldeba_in.gat,157,190
-aldebaran.gat,51,218,0 warp ald05 1,1,aldeba_in.gat,24,227
-aldebaran.gat,61,229,0 warp ald06 1,1,aldeba_in.gat,148,227
-aldebaran.gat,72,197,0 warp ald07 1,1,aldeba_in.gat,27,37
-aldebaran.gat,89,234,0 warp ald08 1,1,aldeba_in.gat,242,237
-aldeba_in.gat,103,157,0 warp ald09 2,2,aldeba_in.gat,137,237
-aldeba_in.gat,103,61,0 warp ald10 2,2,aldeba_in.gat,97,105
-aldeba_in.gat,134,237,0 warp ald09-1 2,2,aldeba_in.gat,100,157
-aldeba_in.gat,144,92,0 warp ald11 2,2,aldeba_in.gat,149,52
-aldeba_in.gat,148,224,0 warp ald06-1 2,2,aldebaran.gat,63,227
-aldeba_in.gat,149,55,0 warp ald11-1 2,2,aldeba_in.gat,144,95
-aldeba_in.gat,157,193,0 warp ald04-1 3,2,aldebaran.gat,231,107
-aldeba_in.gat,208,117,0 warp ald01-1 2,2,aldebaran.gat,116,63
-aldeba_in.gat,217,131,0 warp ald12 2,2,aldeba_in.gat,217,163
-aldeba_in.gat,217,160,0 warp ald12-1 2,2,aldeba_in.gat,217,128
-aldeba_in.gat,217,71,0 warp ald13-1 2,2,aldeba_in.gat,218,107
-aldeba_in.gat,218,104,0 warp ald13 2,2,aldeba_in.gat,218,68
-aldeba_in.gat,24,224,0 warp ald05-1 2,2,aldebaran.gat,53,216
-aldeba_in.gat,245,237,0 warp ald08-1 2,2,aldebaran.gat,91,234
-aldeba_in.gat,27,102,0 warp ald14-1 2,2,aldeba_in.gat,27,68
-aldeba_in.gat,27,34,0 warp ald07-1 2,2,aldebaran.gat,72,195
-aldeba_in.gat,27,71,0 warp ald14 2,2,aldeba_in.gat,27,105
-aldeba_in.gat,37,238,0 warp ald15 2,2,aldeba_in.gat,67,157
-aldeba_in.gat,64,157,0 warp ald15-1 2,2,aldeba_in.gat,34,238
-aldeba_in.gat,83,191,0 warp ald16 2,2,aldeba_in.gat,83,227
-aldeba_in.gat,83,224,0 warp ald16-1 2,2,aldeba_in.gat,83,188
-aldeba_in.gat,94,38,0 warp ald02-1 3,2,aldebaran.gat,197,68
-aldeba_in.gat,97,102,0 warp ald10-1 2,2,aldeba_in.gat,103,58
-
-//Turbo Track Room
-alde_gld.gat,183,204,0 warp turbo01 1,1,turbo_room.gat,100,64
+//===== Athena Script ========================================
+//= Al de Baran Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Al de Baran
+//===== Additional Comments: =================================
+//= 1.2 Added Turbo Room Warps [Justin84]
+//============================================================
+
+//===== Al De Baran Warps =====================================
+aldebaran.gat,118,63,0 warp ald01 1,1,aldeba_in.gat,211,117
+aldebaran.gat,139,34,0 warp ald001 3,2,mjolnir_12.gat,199,375
+aldebaran.gat,197,70,0 warp ald02 1,1,aldeba_in.gat,94,41
+aldebaran.gat,233,105,0 warp ald04 1,1,aldeba_in.gat,157,190
+aldebaran.gat,51,218,0 warp ald05 1,1,aldeba_in.gat,24,227
+aldebaran.gat,61,229,0 warp ald06 1,1,aldeba_in.gat,148,227
+aldebaran.gat,72,197,0 warp ald07 1,1,aldeba_in.gat,27,37
+aldebaran.gat,89,234,0 warp ald08 1,1,aldeba_in.gat,242,237
+aldeba_in.gat,103,157,0 warp ald09 2,2,aldeba_in.gat,137,237
+aldeba_in.gat,103,61,0 warp ald10 2,2,aldeba_in.gat,97,105
+aldeba_in.gat,134,237,0 warp ald09-1 2,2,aldeba_in.gat,100,157
+aldeba_in.gat,144,92,0 warp ald11 2,2,aldeba_in.gat,149,52
+aldeba_in.gat,148,224,0 warp ald06-1 2,2,aldebaran.gat,63,227
+aldeba_in.gat,149,55,0 warp ald11-1 2,2,aldeba_in.gat,144,95
+aldeba_in.gat,157,193,0 warp ald04-1 3,2,aldebaran.gat,231,107
+aldeba_in.gat,208,117,0 warp ald01-1 2,2,aldebaran.gat,116,63
+aldeba_in.gat,217,131,0 warp ald12 2,2,aldeba_in.gat,217,163
+aldeba_in.gat,217,160,0 warp ald12-1 2,2,aldeba_in.gat,217,128
+aldeba_in.gat,217,71,0 warp ald13-1 2,2,aldeba_in.gat,218,107
+aldeba_in.gat,218,104,0 warp ald13 2,2,aldeba_in.gat,218,68
+aldeba_in.gat,24,224,0 warp ald05-1 2,2,aldebaran.gat,53,216
+aldeba_in.gat,245,237,0 warp ald08-1 2,2,aldebaran.gat,91,234
+aldeba_in.gat,27,102,0 warp ald14-1 2,2,aldeba_in.gat,27,68
+aldeba_in.gat,27,34,0 warp ald07-1 2,2,aldebaran.gat,72,195
+aldeba_in.gat,27,71,0 warp ald14 2,2,aldeba_in.gat,27,105
+aldeba_in.gat,37,238,0 warp ald15 2,2,aldeba_in.gat,67,157
+aldeba_in.gat,64,157,0 warp ald15-1 2,2,aldeba_in.gat,34,238
+aldeba_in.gat,83,191,0 warp ald16 2,2,aldeba_in.gat,83,227
+aldeba_in.gat,83,224,0 warp ald16-1 2,2,aldeba_in.gat,83,188
+aldeba_in.gat,94,38,0 warp ald02-1 3,2,aldebaran.gat,197,68
+aldeba_in.gat,97,102,0 warp ald10-1 2,2,aldeba_in.gat,103,58
+
+//Turbo Track Room
+alde_gld.gat,183,204,0 warp turbo01 1,1,turbo_room.gat,100,64
turbo_room.gat,100,61,0 warp turbo02 1,1,alde_gld.gat,183,198 \ No newline at end of file
diff --git a/npc/warps/cities/amatsu.txt b/npc/warps/cities/amatsu.txt
index 1c25603aa..976e99e5a 100644
--- a/npc/warps/cities/amatsu.txt
+++ b/npc/warps/cities/amatsu.txt
@@ -1,57 +1,57 @@
-//===== Athena Script ========================================
-//= Amatsu Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Amatsu
-//===== Additional Comments: =================================
-//= 1.3 Fixed a warp-back [erKURITA]
-//= 1.4 Added Ninja's Warps. Thanks to RockmanEXE for the info. [erKURITA]
-//============================================================
-
-//= Amatsu ===================================================
-ama_in01.gat,157,25,0 warp warp1969 1,1,amatsu.gat,213,116
-ama_in01.gat,161,34,0 warp warp1970 1,1,ama_in01.gat,166,77
-ama_in01.gat,166,73,0 warp warp1971 1,1,ama_in01.gat,162,32
-ama_in01.gat,174,120,0 warp warp2011 1,1,amatsu.gat,217,146
-ama_in01.gat,174,170,0 warp warp2012 1,1,ama_fild01.gat,174,328
-ama_in01.gat,31,176,0 warp warp2010 1,1,amatsu.gat,42,110
-ama_in01.gat,32,24,0 warp warp1963 1,1,amatsu.gat,98,117
-ama_in01.gat,34,97,0 warp warp1965 1,1,amatsu.gat,168,178
-ama_in01.gat,77,177,0 warp warp1967 1,1,amatsu.gat,246,160
-ama_in01.gat,86,23,0 warp warp2009 1,1,amatsu.gat,129,117
-ama_in01.gat,88,94,0 warp warp2008 1,1,amatsu.gat,52,145
-ama_in02.gat,127,163,0 warp warp1980 1,1,ama_in02.gat,220,161
-ama_in02.gat,195,44,0 warp warp1973 1,1,ama_in02.gat,65,40
-ama_in02.gat,215,150,0 warp warp1978 1,1,ama_in02.gat,59,156
-ama_in02.gat,222,161,0 warp warp1979 1,1,ama_in02.gat,130,163
-ama_in02.gat,227,45,0 warp warp1973 1,1,amatsu.gat,88,235
-ama_in02.gat,56,44,0 warp warp1975 1,1,ama_in02.gat,59,144
-ama_in02.gat,59,142,0 warp warp1976 1,1,ama_in02.gat,56,41
-ama_in02.gat,59,159,0 warp warp1977 1,1,ama_in02.gat,215,152
-ama_in02.gat,65,38,0 warp warp1974 1,1,ama_in02.gat,195,41
-amatsu.gat,132,117,0 warp warp1989 1,1,ama_in01.gat,88,22
-amatsu.gat,168,180,0 warp warp1964 1,1,ama_in01.gat,34,99
-amatsu.gat,216,116,0 warp warp1968 1,1,ama_in01.gat,162,25
-amatsu.gat,217,149,0 warp warp1987 1,1,ama_in01.gat,174,122
-amatsu.gat,247,290,0 warp warp1960 1,1,ama_fild01.gat,73,32
-amatsu.gat,249,160,0 warp warp1966 1,1,ama_in01.gat,79,178
-amatsu.gat,40,110,0 warp warp1995 1,1,ama_in01.gat,28,176
-amatsu.gat,52,148,0 warp warp1994 1,1,ama_in01.gat,88,97
-amatsu.gat,85,235,0 warp warp1972 1,1,ama_in02.gat,224,45
-//removed
-//amatsu.gat,95,148,0 warp warp1990 1,1,ama_in01.gat,88,97
-amatsu.gat,96,117,0 warp warp1962 1,1,ama_in01.gat,29,23
-
-//| Ninja quest warps
-amatsu.gat,149,140,0 warp ninja01 1,1,que_ng.gat,20,142
-que_ng.gat,20,138,0 warp ninja02 1,1,amatsu.gat,147,136
-que_ng.gat,10,183,0 warp ninja03 1,1,que_ng.gat,33,64
-que_ng.gat,37,64,0 warp ninja04 1,1,que_ng.gat,15,182
-que_ng.gat,30,37,0 warp ninja05 1,1,que_ng.gat,67,28
+//===== Athena Script ========================================
+//= Amatsu Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Amatsu
+//===== Additional Comments: =================================
+//= 1.3 Fixed a warp-back [erKURITA]
+//= 1.4 Added Ninja's Warps. Thanks to RockmanEXE for the info. [erKURITA]
+//============================================================
+
+//= Amatsu ===================================================
+ama_in01.gat,157,25,0 warp warp1969 1,1,amatsu.gat,213,116
+ama_in01.gat,161,34,0 warp warp1970 1,1,ama_in01.gat,166,77
+ama_in01.gat,166,73,0 warp warp1971 1,1,ama_in01.gat,162,32
+ama_in01.gat,174,120,0 warp warp2011 1,1,amatsu.gat,217,146
+ama_in01.gat,174,170,0 warp warp2012 1,1,ama_fild01.gat,174,328
+ama_in01.gat,31,176,0 warp warp2010 1,1,amatsu.gat,42,110
+ama_in01.gat,32,24,0 warp warp1963 1,1,amatsu.gat,98,117
+ama_in01.gat,34,97,0 warp warp1965 1,1,amatsu.gat,168,178
+ama_in01.gat,77,177,0 warp warp1967 1,1,amatsu.gat,246,160
+ama_in01.gat,86,23,0 warp warp2009 1,1,amatsu.gat,129,117
+ama_in01.gat,88,94,0 warp warp2008 1,1,amatsu.gat,52,145
+ama_in02.gat,127,163,0 warp warp1980 1,1,ama_in02.gat,220,161
+ama_in02.gat,195,44,0 warp warp1973 1,1,ama_in02.gat,65,40
+ama_in02.gat,215,150,0 warp warp1978 1,1,ama_in02.gat,59,156
+ama_in02.gat,222,161,0 warp warp1979 1,1,ama_in02.gat,130,163
+ama_in02.gat,227,45,0 warp warp1973 1,1,amatsu.gat,88,235
+ama_in02.gat,56,44,0 warp warp1975 1,1,ama_in02.gat,59,144
+ama_in02.gat,59,142,0 warp warp1976 1,1,ama_in02.gat,56,41
+ama_in02.gat,59,159,0 warp warp1977 1,1,ama_in02.gat,215,152
+ama_in02.gat,65,38,0 warp warp1974 1,1,ama_in02.gat,195,41
+amatsu.gat,132,117,0 warp warp1989 1,1,ama_in01.gat,88,22
+amatsu.gat,168,180,0 warp warp1964 1,1,ama_in01.gat,34,99
+amatsu.gat,216,116,0 warp warp1968 1,1,ama_in01.gat,162,25
+amatsu.gat,217,149,0 warp warp1987 1,1,ama_in01.gat,174,122
+amatsu.gat,247,290,0 warp warp1960 1,1,ama_fild01.gat,73,32
+amatsu.gat,249,160,0 warp warp1966 1,1,ama_in01.gat,79,178
+amatsu.gat,40,110,0 warp warp1995 1,1,ama_in01.gat,28,176
+amatsu.gat,52,148,0 warp warp1994 1,1,ama_in01.gat,88,97
+amatsu.gat,85,235,0 warp warp1972 1,1,ama_in02.gat,224,45
+//removed
+//amatsu.gat,95,148,0 warp warp1990 1,1,ama_in01.gat,88,97
+amatsu.gat,96,117,0 warp warp1962 1,1,ama_in01.gat,29,23
+
+//| Ninja quest warps
+amatsu.gat,149,140,0 warp ninja01 1,1,que_ng.gat,20,142
+que_ng.gat,20,138,0 warp ninja02 1,1,amatsu.gat,147,136
+que_ng.gat,10,183,0 warp ninja03 1,1,que_ng.gat,33,64
+que_ng.gat,37,64,0 warp ninja04 1,1,que_ng.gat,15,182
+que_ng.gat,30,37,0 warp ninja05 1,1,que_ng.gat,67,28
que_ng.gat,63,30,0 warp ninja06 1,1,que_ng.gat,25,37 \ No newline at end of file
diff --git a/npc/warps/cities/ayothaya.txt b/npc/warps/cities/ayothaya.txt
index 619caeb6a..a2fcaf548 100644
--- a/npc/warps/cities/ayothaya.txt
+++ b/npc/warps/cities/ayothaya.txt
@@ -1,94 +1,94 @@
-//===== Athena Script ========================================
-//= Ayothaya Town Warps Script
-//===== By: ==================================================
-//= Muad_Dib, L0ne_W0lf (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Ayothaya
-//===== Additional Comments: =================================
-//= 1.1 Fixed Armory part by massdriller [Thanks to akusarujin]
-//= 1.2 Revised warps, due to official Ayothaya Town NPC [MasterOfMuppets]
-//= 1.3 Fixed swapped Inn Exits, thanks to Sir_Loon [Lupus]
-//= 1.4 Fixed a warp-back. [erKURITA]
-//============================================================
-
-
-//Entrance / Exit
-ayothaya.gat,277,176,0 warp ayothayawarp001 2,2,ayo_fild01.gat,36,239
-ayo_fild01.gat,32,241,0 warp ayothayawarp002 2,2,ayothaya.gat,274,176
-
-//Castle
-ayothaya.gat,207,285,0 warp ayothayawarp007 2,2,ayo_in02.gat,99,149
-ayo_in02.gat,99,146,0 warp ayothayawarp008 2,2,ayothaya.gat,207,282
-
-//House
-ayothaya.gat,128,86,0 warp ayothayawarp009 2,2,ayo_in01.gat,27,172
-ayo_in01.gat,29,170,0 warp ayothayawarp010 2,2,ayothaya.gat,132,86
-ayothaya.gat,129,96,0 warp ayothayawarp011 2,2,ayo_in01.gat,44,183
-ayo_in01.gat,47,183,0 warp ayothayawarp012 2,2,ayothaya.gat,131,98
-ayothaya.gat,130,75,0 warp ayothayawarp013 2,2,ayo_in01.gat,17,155
-ayo_in01.gat,17,152,0 warp ayothayawarp014 2,2,ayothaya.gat,132,73
-
-//Restaurant/Bar -- Facing North
-ayothaya.gat,229,70,0 warp ayothayawarp015 2,2,ayo_in01.gat,137,191
-ayo_in01.gat,137,194,0 warp ayothayawarp016 2,2,ayothaya.gat,232,75
-
-//Armory -- East door
-ayothaya.gat,176,90,0 warp ayothayawarp017 2,2,ayo_in01.gat,92,174
-ayo_in01.gat,97,174,0 warp ayothayawarp018 2,2,ayothaya.gat,180,90
-
-//Armory -- South door
-ayothaya.gat,172,77,0 warp ayothayawarp019 2,2,ayo_in01.gat,88,154
-ayo_in01.gat,84,149,0 warp ayothayawarp020 2,2,ayothaya.gat,172,74
-
-//Armory -- West door
-ayothaya.gat,166,90,0 warp ayothayawarp021 2,2,ayo_in01.gat,75,174
-ayo_in01.gat,73,174,0 warp ayothayawarp022 2,2,ayothaya.gat,163,90
-
-//Straw-roof hut -- Middle - Facing West
-//ayothaya.gat,120,164,0 warp ayothayawarp023 2,2,ayo_in01.gat,,
-//ayo_in01.gat,,,0 warp ayothayawarp024 2,2,ayothaya.gat,116,164
-
-//Straw-roof hut -- On Beach -- Facing South East
-//ayothaya.gat,60,148,0 warp ayothayawarp025 2,2,ayo_in01.gat,,
-//ayo_in01.gat,,,0 warp ayothayawarp026 2,2,ayothaya.gat,61,146
-
-//Straw-roof hut -- East Side (Middle) -- Facing East
-ayothaya.gat,61,104,0 warp ayothayawarp029 2,2,ayo_in01.gat,191,183
-ayo_in01.gat,194,183,0 warp ayothayawarp030 2,2,ayothaya.gat,66,104
-
-//Straw-roof hut -- East Side (Lower) -- Facing North
-//ayothaya.gat,77,88,0 warp ayothayawarp031 2,2,ayo_in01.gat,,
-//ayo_in01.gat,,,0 warp ayothayawarp032 2,2,ayothaya.gat,77,92
-
-//Larger Straw-roof hut -- East Side (Middle) -- Facing South
-ayothaya.gat,111,109,0 warp ayothayawarp033 2,2,ayo_in01.gat,180,128
-ayo_in01.gat,177,128,0 warp ayothayawarp034 2,2,ayothaya.gat,111,105
-
-//Inn -- North Door
-ayothaya.gat,202,158,0 warp ayothayawarp035 2,2,ayo_in01.gat,30,107
-ayo_in01.gat,30,110,0 warp ayothayawarp036 2,2,ayothaya.gat,202,161
-//Inn -- West Door
-ayothaya.gat,193,149,0 warp ayothayawarp037 2,2,ayo_in01.gat,14,94
-ayo_in01.gat,11,94,0 warp ayothayawarp038 2,2,ayothaya.gat,189,149
-//Inn -- South Door
-ayothaya.gat,202,141,0 warp ayothayawarp039 2,2,ayo_in01.gat,30,82
-ayo_in01.gat,30,79,0 warp ayothayawarp040 2,2,ayothaya.gat,202,138
-//Inn -- East Door
-ayothaya.gat,211,149,0 warp ayothayawarp041 2,2,ayo_in01.gat,47,94
-ayo_in01.gat,50,94,0 warp ayothayawarp042 2,2,ayothaya.gat,214,149
-//Inn Room --Upper Right
-ayo_in01.gat,48,83,0 warp ayothayawarp043 2,2,ayo_in01.gat,61,15
-ayo_in01.gat,59,15,0 warp ayothayawarp044 2,2,ayo_in01.gat,45,83
-//Inn Room -- Upper Left
-ayo_in01.gat,48,107,0 warp ayothayawarp045 2,2,ayo_in01.gat,177,27
-ayo_in01.gat,175,27,0 warp ayothayawarp046 2,2,ayo_in01.gat,45,107
-//Inn Room --Bottom Right
-ayo_in01.gat,13,83,0 warp ayothayawarp047 2,2,ayo_in01.gat,19,15
-ayo_in01.gat,22,15,0 warp ayothayawarp048 2,2,ayo_in01.gat,16,83
-//Inn Room -- Bottom Left
-ayo_in01.gat,13,107,0 warp ayothayawarp049 2,2,ayo_in01.gat,133,27
-ayo_in01.gat,136,27,0 warp ayothayawarp050 2,2,ayo_in01.gat,16,107
+//===== Athena Script ========================================
+//= Ayothaya Town Warps Script
+//===== By: ==================================================
+//= Muad_Dib, L0ne_W0lf (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Ayothaya
+//===== Additional Comments: =================================
+//= 1.1 Fixed Armory part by massdriller [Thanks to akusarujin]
+//= 1.2 Revised warps, due to official Ayothaya Town NPC [MasterOfMuppets]
+//= 1.3 Fixed swapped Inn Exits, thanks to Sir_Loon [Lupus]
+//= 1.4 Fixed a warp-back. [erKURITA]
+//============================================================
+
+
+//Entrance / Exit
+ayothaya.gat,277,176,0 warp ayothayawarp001 2,2,ayo_fild01.gat,36,239
+ayo_fild01.gat,32,241,0 warp ayothayawarp002 2,2,ayothaya.gat,274,176
+
+//Castle
+ayothaya.gat,207,285,0 warp ayothayawarp007 2,2,ayo_in02.gat,99,149
+ayo_in02.gat,99,146,0 warp ayothayawarp008 2,2,ayothaya.gat,207,282
+
+//House
+ayothaya.gat,128,86,0 warp ayothayawarp009 2,2,ayo_in01.gat,27,172
+ayo_in01.gat,29,170,0 warp ayothayawarp010 2,2,ayothaya.gat,132,86
+ayothaya.gat,129,96,0 warp ayothayawarp011 2,2,ayo_in01.gat,44,183
+ayo_in01.gat,47,183,0 warp ayothayawarp012 2,2,ayothaya.gat,131,98
+ayothaya.gat,130,75,0 warp ayothayawarp013 2,2,ayo_in01.gat,17,155
+ayo_in01.gat,17,152,0 warp ayothayawarp014 2,2,ayothaya.gat,132,73
+
+//Restaurant/Bar -- Facing North
+ayothaya.gat,229,70,0 warp ayothayawarp015 2,2,ayo_in01.gat,137,191
+ayo_in01.gat,137,194,0 warp ayothayawarp016 2,2,ayothaya.gat,232,75
+
+//Armory -- East door
+ayothaya.gat,176,90,0 warp ayothayawarp017 2,2,ayo_in01.gat,92,174
+ayo_in01.gat,97,174,0 warp ayothayawarp018 2,2,ayothaya.gat,180,90
+
+//Armory -- South door
+ayothaya.gat,172,77,0 warp ayothayawarp019 2,2,ayo_in01.gat,88,154
+ayo_in01.gat,84,149,0 warp ayothayawarp020 2,2,ayothaya.gat,172,74
+
+//Armory -- West door
+ayothaya.gat,166,90,0 warp ayothayawarp021 2,2,ayo_in01.gat,75,174
+ayo_in01.gat,73,174,0 warp ayothayawarp022 2,2,ayothaya.gat,163,90
+
+//Straw-roof hut -- Middle - Facing West
+//ayothaya.gat,120,164,0 warp ayothayawarp023 2,2,ayo_in01.gat,,
+//ayo_in01.gat,,,0 warp ayothayawarp024 2,2,ayothaya.gat,116,164
+
+//Straw-roof hut -- On Beach -- Facing South East
+//ayothaya.gat,60,148,0 warp ayothayawarp025 2,2,ayo_in01.gat,,
+//ayo_in01.gat,,,0 warp ayothayawarp026 2,2,ayothaya.gat,61,146
+
+//Straw-roof hut -- East Side (Middle) -- Facing East
+ayothaya.gat,61,104,0 warp ayothayawarp029 2,2,ayo_in01.gat,191,183
+ayo_in01.gat,194,183,0 warp ayothayawarp030 2,2,ayothaya.gat,66,104
+
+//Straw-roof hut -- East Side (Lower) -- Facing North
+//ayothaya.gat,77,88,0 warp ayothayawarp031 2,2,ayo_in01.gat,,
+//ayo_in01.gat,,,0 warp ayothayawarp032 2,2,ayothaya.gat,77,92
+
+//Larger Straw-roof hut -- East Side (Middle) -- Facing South
+ayothaya.gat,111,109,0 warp ayothayawarp033 2,2,ayo_in01.gat,180,128
+ayo_in01.gat,177,128,0 warp ayothayawarp034 2,2,ayothaya.gat,111,105
+
+//Inn -- North Door
+ayothaya.gat,202,158,0 warp ayothayawarp035 2,2,ayo_in01.gat,30,107
+ayo_in01.gat,30,110,0 warp ayothayawarp036 2,2,ayothaya.gat,202,161
+//Inn -- West Door
+ayothaya.gat,193,149,0 warp ayothayawarp037 2,2,ayo_in01.gat,14,94
+ayo_in01.gat,11,94,0 warp ayothayawarp038 2,2,ayothaya.gat,189,149
+//Inn -- South Door
+ayothaya.gat,202,141,0 warp ayothayawarp039 2,2,ayo_in01.gat,30,82
+ayo_in01.gat,30,79,0 warp ayothayawarp040 2,2,ayothaya.gat,202,138
+//Inn -- East Door
+ayothaya.gat,211,149,0 warp ayothayawarp041 2,2,ayo_in01.gat,47,94
+ayo_in01.gat,50,94,0 warp ayothayawarp042 2,2,ayothaya.gat,214,149
+//Inn Room --Upper Right
+ayo_in01.gat,48,83,0 warp ayothayawarp043 2,2,ayo_in01.gat,61,15
+ayo_in01.gat,59,15,0 warp ayothayawarp044 2,2,ayo_in01.gat,45,83
+//Inn Room -- Upper Left
+ayo_in01.gat,48,107,0 warp ayothayawarp045 2,2,ayo_in01.gat,177,27
+ayo_in01.gat,175,27,0 warp ayothayawarp046 2,2,ayo_in01.gat,45,107
+//Inn Room --Bottom Right
+ayo_in01.gat,13,83,0 warp ayothayawarp047 2,2,ayo_in01.gat,19,15
+ayo_in01.gat,22,15,0 warp ayothayawarp048 2,2,ayo_in01.gat,16,83
+//Inn Room -- Bottom Left
+ayo_in01.gat,13,107,0 warp ayothayawarp049 2,2,ayo_in01.gat,133,27
+ayo_in01.gat,136,27,0 warp ayothayawarp050 2,2,ayo_in01.gat,16,107
diff --git a/npc/warps/cities/comodo.txt b/npc/warps/cities/comodo.txt
index 3f9723655..25850efaf 100644
--- a/npc/warps/cities/comodo.txt
+++ b/npc/warps/cities/comodo.txt
@@ -1,50 +1,50 @@
-//===== Athena Script ========================================
-//= Comodo Warp Script
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points Comodo city
-//= Rogue guild
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-
-//Comodo City =====================================================
-comodo.gat,115,291,0 warp cmd09 1,1,cmd_in02.gat,67,132
-comodo.gat,126,98,0 warp cmd02 1,1,cmd_in02.gat,144,97
-comodo.gat,130,195,0 warp cmd05 1,1,cmd_in02.gat,143,173
-comodo.gat,140,111,0 warp cmd04 1,1,cmd_in02.gat,178,132
-comodo.gat,140,90,0 warp cmd01 1,1,cmd_in02.gat,74,25
-comodo.gat,145,328,0 warp cmd11 1,1,cmd_in01.gat,120,71
-comodo.gat,153,97,0 warp cmd03 1,1,cmd_in02.gat,212,97
-comodo.gat,176,358,0 warp cmd002 1,1,beach_dun2.gat,154,25
-comodo.gat,192,294,0 warp cmd17 1,1,cmd_in01.gat,177,123
-comodo.gat,236,298,0 warp cmd08 1,1,cmd_in01.gat,179,81
-comodo.gat,25,214,0 warp cmd001 1,1,beach_dun.gat,266,67
-comodo.gat,265,74,0 warp cmd06 1,1,cmd_in01.gat,123,180
-comodo.gat,271,271,0 warp cmd10 1,1,cmd_in01.gat,113,125
-comodo.gat,332,175,0 warp cmd003 1,1,beach_dun3.gat,23,260
-comodo.gat,92,128,0 warp cmd07 1,1,cmd_in01.gat,85,174
-cmd_in01.gat,109,125,0 warp cmd10-1 1,1,comodo.gat,269,273
-cmd_in01.gat,120,67,0 warp cmd11-1 1,1,comodo.gat,145,324
-cmd_in01.gat,123,186,0 warp cmd06-1 1,1,comodo.gat,265,79
-cmd_in01.gat,183,123,0 warp cmd17-1 1,1,comodo.gat,195,294
-cmd_in01.gat,183,81,0 warp cmd08-1 1,1,comodo.gat,239,296
-cmd_in01.gat,90,174,0 warp cmd07-1 1,1,comodo.gat,97,128
-cmd_in02.gat,139,169,0 warp cmd05-1 1,1,comodo.gat,127,191
-cmd_in02.gat,139,97,0 warp cmd02-1 1,1,comodo.gat,122,98
-cmd_in02.gat,168,113,0 warp cmd15-1 1,1,cmd_in02.gat,63,73
-cmd_in02.gat,178,136,0 warp cmd04-1 1,1,comodo.gat,140,115
-cmd_in02.gat,187,78,0 warp cmd14-2 1,1,cmd_in02.gat,84,37
-cmd_in02.gat,208,206,0 warp cmd16 1,1,cmd_in02.gat,97,211
-cmd_in02.gat,216,97,0 warp cmd03-1 1,1,comodo.gat,157,97
-cmd_in02.gat,58,74,0 warp cmd15 1,1,cmd_in02.gat,166,116
-cmd_in02.gat,69,129,0 warp cmd09-1 4,4,comodo.gat,115,288
-cmd_in02.gat,74,21,0 warp cmd01-1 1,1,comodo.gat,140,86
-cmd_in02.gat,90,37,0 warp cmd14 1,1,cmd_in02.gat,191,77
-cmd_in02.gat,98,216,0 warp cmd16-1 1,1,cmd_in02.gat,207,210
+//===== Athena Script ========================================
+//= Comodo Warp Script
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points Comodo city
+//= Rogue guild
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+
+//Comodo City =====================================================
+comodo.gat,115,291,0 warp cmd09 1,1,cmd_in02.gat,67,132
+comodo.gat,126,98,0 warp cmd02 1,1,cmd_in02.gat,144,97
+comodo.gat,130,195,0 warp cmd05 1,1,cmd_in02.gat,143,173
+comodo.gat,140,111,0 warp cmd04 1,1,cmd_in02.gat,178,132
+comodo.gat,140,90,0 warp cmd01 1,1,cmd_in02.gat,74,25
+comodo.gat,145,328,0 warp cmd11 1,1,cmd_in01.gat,120,71
+comodo.gat,153,97,0 warp cmd03 1,1,cmd_in02.gat,212,97
+comodo.gat,176,358,0 warp cmd002 1,1,beach_dun2.gat,154,25
+comodo.gat,192,294,0 warp cmd17 1,1,cmd_in01.gat,177,123
+comodo.gat,236,298,0 warp cmd08 1,1,cmd_in01.gat,179,81
+comodo.gat,25,214,0 warp cmd001 1,1,beach_dun.gat,266,67
+comodo.gat,265,74,0 warp cmd06 1,1,cmd_in01.gat,123,180
+comodo.gat,271,271,0 warp cmd10 1,1,cmd_in01.gat,113,125
+comodo.gat,332,175,0 warp cmd003 1,1,beach_dun3.gat,23,260
+comodo.gat,92,128,0 warp cmd07 1,1,cmd_in01.gat,85,174
+cmd_in01.gat,109,125,0 warp cmd10-1 1,1,comodo.gat,269,273
+cmd_in01.gat,120,67,0 warp cmd11-1 1,1,comodo.gat,145,324
+cmd_in01.gat,123,186,0 warp cmd06-1 1,1,comodo.gat,265,79
+cmd_in01.gat,183,123,0 warp cmd17-1 1,1,comodo.gat,195,294
+cmd_in01.gat,183,81,0 warp cmd08-1 1,1,comodo.gat,239,296
+cmd_in01.gat,90,174,0 warp cmd07-1 1,1,comodo.gat,97,128
+cmd_in02.gat,139,169,0 warp cmd05-1 1,1,comodo.gat,127,191
+cmd_in02.gat,139,97,0 warp cmd02-1 1,1,comodo.gat,122,98
+cmd_in02.gat,168,113,0 warp cmd15-1 1,1,cmd_in02.gat,63,73
+cmd_in02.gat,178,136,0 warp cmd04-1 1,1,comodo.gat,140,115
+cmd_in02.gat,187,78,0 warp cmd14-2 1,1,cmd_in02.gat,84,37
+cmd_in02.gat,208,206,0 warp cmd16 1,1,cmd_in02.gat,97,211
+cmd_in02.gat,216,97,0 warp cmd03-1 1,1,comodo.gat,157,97
+cmd_in02.gat,58,74,0 warp cmd15 1,1,cmd_in02.gat,166,116
+cmd_in02.gat,69,129,0 warp cmd09-1 4,4,comodo.gat,115,288
+cmd_in02.gat,74,21,0 warp cmd01-1 1,1,comodo.gat,140,86
+cmd_in02.gat,90,37,0 warp cmd14 1,1,cmd_in02.gat,191,77
+cmd_in02.gat,98,216,0 warp cmd16-1 1,1,cmd_in02.gat,207,210
diff --git a/npc/warps/cities/einbech.txt b/npc/warps/cities/einbech.txt
index 822db4136..62d2421c6 100644
--- a/npc/warps/cities/einbech.txt
+++ b/npc/warps/cities/einbech.txt
@@ -1,47 +1,47 @@
-//===== eAthena Script =======================================
-//= Einbech Warps
-//===== By: ==================================================
-//= Muad Dib (1.0), SSUNNY@YOUNG(1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Einbech Town warps
-//===== Additional Comments: =================================
-//= Made by Muad_Dib from Prometheus, all credit goes to him.
-//= 1.1 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
-//============================================================
-
-//==========================================================================
-//Einbech - Weapon shop
-//==========================================================================
-einbech.gat,177,136,0 warp eib_wp01 1,1,ein_in01.gat,190,35
-ein_in01.gat,190,38,0 warp eib_wp01a 1,1,einbech.gat,177,133
-
-
-//==========================================================================
-//Einbech - buildings
-//==========================================================================
-einbech.gat,207,135,0 warp eib_hu01 1,1,ein_in01.gat,190,99
-ein_in01.gat,187,99,0 warp eib_hu01a 1,1,einbech.gat,204,135
-einbech.gat,214,121,0 warp eib_hu02 1,1,ein_in01.gat,205,86
-ein_in01.gat,205,83,0 warp eib_hu02a 1,1,einbech.gat,214,118
-
-
-//==========================================================================
-//Einbech - Pub
-//==========================================================================
-einbech.gat,154,106,0 warp eib_b01 1,1,ein_in01.gat,285,89
-ein_in01.gat,288,89,0 warp eib_b01a 1,1,einbech.gat,157,106
-einbech.gat,145,112,0 warp eib_b02 1,1,ein_in01.gat,268,104
-ein_in01.gat,265,104,0 warp eib_b02a 1,1,einbech.gat,141,112
-
-
-//=========================================================================
-//Einbech - Swordman guild
-//=========================================================================
-einbech.gat,256,109,0 warp eib_js01 1,1,ein_in01.gat,148,153
-ein_in01.gat,144,153,0 warp eib_js01a 1,1,einbech.gat,253,109
-
-
+//===== eAthena Script =======================================
+//= Einbech Warps
+//===== By: ==================================================
+//= Muad Dib (1.0), SSUNNY@YOUNG(1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Einbech Town warps
+//===== Additional Comments: =================================
+//= Made by Muad_Dib from Prometheus, all credit goes to him.
+//= 1.1 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+//============================================================
+
+//==========================================================================
+//Einbech - Weapon shop
+//==========================================================================
+einbech.gat,177,136,0 warp eib_wp01 1,1,ein_in01.gat,190,35
+ein_in01.gat,190,38,0 warp eib_wp01a 1,1,einbech.gat,177,133
+
+
+//==========================================================================
+//Einbech - buildings
+//==========================================================================
+einbech.gat,207,135,0 warp eib_hu01 1,1,ein_in01.gat,190,99
+ein_in01.gat,187,99,0 warp eib_hu01a 1,1,einbech.gat,204,135
+einbech.gat,214,121,0 warp eib_hu02 1,1,ein_in01.gat,205,86
+ein_in01.gat,205,83,0 warp eib_hu02a 1,1,einbech.gat,214,118
+
+
+//==========================================================================
+//Einbech - Pub
+//==========================================================================
+einbech.gat,154,106,0 warp eib_b01 1,1,ein_in01.gat,285,89
+ein_in01.gat,288,89,0 warp eib_b01a 1,1,einbech.gat,157,106
+einbech.gat,145,112,0 warp eib_b02 1,1,ein_in01.gat,268,104
+ein_in01.gat,265,104,0 warp eib_b02a 1,1,einbech.gat,141,112
+
+
+//=========================================================================
+//Einbech - Swordman guild
+//=========================================================================
+einbech.gat,256,109,0 warp eib_js01 1,1,ein_in01.gat,148,153
+ein_in01.gat,144,153,0 warp eib_js01a 1,1,einbech.gat,253,109
+
+
diff --git a/npc/warps/cities/einbroch.txt b/npc/warps/cities/einbroch.txt
index 95f676d56..b2523f71f 100644
--- a/npc/warps/cities/einbroch.txt
+++ b/npc/warps/cities/einbroch.txt
@@ -1,116 +1,116 @@
-//===== Athena Script ========================================
-//= Einbroch Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.3), SSUNNY@YOUNG(1.7), erKURITA (1.8)
-//===== Current Version: =====================================
-//= 1.8
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Einbroch
-//===== Additional Comments: =================================
-//= 1.4 Moved all airports to Airplane Warps [Lupus]
-//= 1.5 Commented out some warps which are not in the official servers [MasterOfMuppets]
-//= 1.6 Removed some duplicate warps [MasterOfMuppets]
-//= 1.7 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
-//= 1.8 Added Gunslinger Map portion warps. Credits to RockmanEXE for the info [erKURITA]
-//============================================================
-
-//==========================================================================
-// Einbroch - Factory
-//==========================================================================
-einbroch.gat,132,79,0 warp ein_fa01 1,1,ein_in01.gat,17,213
-ein_in01.gat,13,213,0 warp ein_fa01a 1,1,einbroch.gat,129,79
-ein_in01.gat,81,198,0 warp ein_fa02 1,1,einbroch.gat,179,70
-einbroch.gat,179,73,0 warp ein_fa02a 1,1,ein_in01.gat,81,203
-
-
-//==========================================================================
-//Einbroch - Near Train station
-//==========================================================================
-einbroch.gat,214,263,0 warp ein_to01 1,1,einbroch.gat,233,315
-einbroch.gat,233,312,0 warp ein_to01a 1,1,einbroch.gat,214,260
-einbroch.gat,250,263,0 warp ein_to02 1,1,einbroch.gat,269,315
-einbroch.gat,269,312,0 warp ein_to02a 1,1,einbroch.gat,250,260
-
-
-//==========================================================================
-//Einbroch - Weapon shop
-//==========================================================================
-einbroch.gat,216,214,0 warp ein_wp01 1,1,ein_in01.gat,108,17
-ein_in01.gat,108,13,0 warp ein_wp01a 1,1,einbroch.gat,216,211
-
-
-//=========================================================================
-//Einbroch - Hotel
-//=========================================================================
-einbroch.gat,257,199,0 warp ein_h01 1,1,ein_in01.gat,198,224
-ein_in01.gat,195,224,0 warp ein_h01a 1,1,einbroch.gat,254,199
-ein_in01.gat,211,216,0 warp ein_h02 1,1,ein_in01.gat,274,218
-ein_in01.gat,271,218,0 warp ein_h02a 1,1,ein_in01.gat,208,216
-ein_in01.gat,211,232,0 warp ein_h03 1,1,ein_in01.gat,274,232
-ein_in01.gat,271,232,0 warp ein_h03a 1,1,ein_in01.gat,208,232
-ein_in01.gat,274,246,0 warp ein_h04 1,1,ein_in01.gat,273,276
-ein_in01.gat,273,273,0 warp ein_h04a 1,1,ein_in01.gat,274,243
-ein_in01.gat,264,246,0 warp ein_h05 1,1,ein_in01.gat,231,276
-ein_in01.gat,231,273,0 warp ein_h05a 1,1,ein_in01.gat,264,243
-ein_in01.gat,274,203,0 warp ein_h06 1,1,ein_in01.gat,274,173
-ein_in01.gat,274,176,0 warp ein_h06a 1,1,ein_in01.gat,274,206
-ein_in01.gat,264,203,0 warp ein_h07 1,1,ein_in01.gat,232,173
-ein_in01.gat,232,176,0 warp ein_h07a 1,1,ein_in01.gat,264,206
-ein_in01.gat,284,224,0 warp ein_h08 1,1,ein_in01.gat,177,277
-ein_in01.gat,180,277,0 warp ein_h08a 1,1,ein_in01.gat,280,224
-
-
-//==========================================================================
-//Einbroch - Building behind the hotel
-//==========================================================================
-einbroch.gat,278,233,0 warp ein_ho01 1,1,ein_in01.gat,107,95
-ein_in01.gat,103,95,0 warp ein_ho01a 1,1,einbroch.gat,275,233
-ein_in01.gat,126,88,0 warp ein_ho02 1,1,ein_in01.gat,100,139
-ein_in01.gat,100,142,0 warp ein_ho02a 1,1,ein_in01.gat,123,85
-einbroch.gat,290,222,0 warp ein_ho03 1,1,ein_in01.gat,121,80
-ein_in01.gat,121,77,0 warp ein_ho03a 1,1,einbroch.gat,290,219
-
-
-//==========================================================================
-//Einbroch - House of Kapetain
-//==========================================================================
-einbroch.gat,129,229,0 warp ein_kf01 1,1,ein_in01.gat,14,147
-ein_in01.gat,11,147,0 warp ein_kf01a 1,1,einbroch.gat,126,229
-
-
-//=========================================================================
-//Einbroch - Lab
-//=========================================================================
-ein_in01.gat,286,25,0 warp ein_lab 1,1,einbroch.gat,54,52
-
-
-//=========================================================================
-//Einbroch - Blacksmith guild
-//=========================================================================
-einbroch.gat,255,107,0 warp ein_jb01 1,1,ein_in01.gat,14,17
-ein_in01.gat,14,14,0 warp ein_jb01a 1,1,einbroch.gat,255,110
-ein_in01.gat,39,36,0 warp ein_jb02 1,1,ein_in01.gat,35,83
-ein_in01.gat,39,85,0 warp ein_jb02a 1,1,ein_in01.gat,36,36
-
-
-//==========================================================================
-//Einbroch - Field related
-//==========================================================================
-einbroch.gat,157,331,0 warp ein_fd01 1,1,ein_fild04.gat,184,31
-ein_fild04.gat,184,26,0 warp ein_fd01a 1,1,einbroch.gat,157,327
-einbroch.gat,150,25,0 warp ein_fd02 1,1,ein_fild08.gat,164,377
-ein_fild08.gat,164,380,0 warp ein_fd02a 1,1,einbroch.gat,150,28
-
-//==========================================================================
-//Einbroch - Gunslinger Map Portion (Ninja's map is the same: que_ng.gat)
-//==========================================================================
-einbroch.gat,136,199,0 warp gswarp1 1,1,que_ng.gat,138,167
-que_ng.gat,130,166,0 warp gswarp2 1,1,einbroch.gat,130,197
-que_ng.gat,178,162,0 warp gswarp3 1,1,que_ng.gat,172,86
-que_ng.gat,166,85,0 warp gswarp4 1,1,que_ng.gat,182,161
-que_ng.gat,165,137,0 warp gswarp5 1,1,que_ng.gat,177,41
-que_ng.gat,172,42,0 warp gswarp6 1,1,que_ng.gat,160,139
-//This one seems to be wrong
-//einbroch.gat,137,149,0 warp gswarp7 1,1,que_ng.gat,138,167
+//===== Athena Script ========================================
+//= Einbroch Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.3), SSUNNY@YOUNG(1.7), erKURITA (1.8)
+//===== Current Version: =====================================
+//= 1.8
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Einbroch
+//===== Additional Comments: =================================
+//= 1.4 Moved all airports to Airplane Warps [Lupus]
+//= 1.5 Commented out some warps which are not in the official servers [MasterOfMuppets]
+//= 1.6 Removed some duplicate warps [MasterOfMuppets]
+//= 1.7 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+//= 1.8 Added Gunslinger Map portion warps. Credits to RockmanEXE for the info [erKURITA]
+//============================================================
+
+//==========================================================================
+// Einbroch - Factory
+//==========================================================================
+einbroch.gat,132,79,0 warp ein_fa01 1,1,ein_in01.gat,17,213
+ein_in01.gat,13,213,0 warp ein_fa01a 1,1,einbroch.gat,129,79
+ein_in01.gat,81,198,0 warp ein_fa02 1,1,einbroch.gat,179,70
+einbroch.gat,179,73,0 warp ein_fa02a 1,1,ein_in01.gat,81,203
+
+
+//==========================================================================
+//Einbroch - Near Train station
+//==========================================================================
+einbroch.gat,214,263,0 warp ein_to01 1,1,einbroch.gat,233,315
+einbroch.gat,233,312,0 warp ein_to01a 1,1,einbroch.gat,214,260
+einbroch.gat,250,263,0 warp ein_to02 1,1,einbroch.gat,269,315
+einbroch.gat,269,312,0 warp ein_to02a 1,1,einbroch.gat,250,260
+
+
+//==========================================================================
+//Einbroch - Weapon shop
+//==========================================================================
+einbroch.gat,216,214,0 warp ein_wp01 1,1,ein_in01.gat,108,17
+ein_in01.gat,108,13,0 warp ein_wp01a 1,1,einbroch.gat,216,211
+
+
+//=========================================================================
+//Einbroch - Hotel
+//=========================================================================
+einbroch.gat,257,199,0 warp ein_h01 1,1,ein_in01.gat,198,224
+ein_in01.gat,195,224,0 warp ein_h01a 1,1,einbroch.gat,254,199
+ein_in01.gat,211,216,0 warp ein_h02 1,1,ein_in01.gat,274,218
+ein_in01.gat,271,218,0 warp ein_h02a 1,1,ein_in01.gat,208,216
+ein_in01.gat,211,232,0 warp ein_h03 1,1,ein_in01.gat,274,232
+ein_in01.gat,271,232,0 warp ein_h03a 1,1,ein_in01.gat,208,232
+ein_in01.gat,274,246,0 warp ein_h04 1,1,ein_in01.gat,273,276
+ein_in01.gat,273,273,0 warp ein_h04a 1,1,ein_in01.gat,274,243
+ein_in01.gat,264,246,0 warp ein_h05 1,1,ein_in01.gat,231,276
+ein_in01.gat,231,273,0 warp ein_h05a 1,1,ein_in01.gat,264,243
+ein_in01.gat,274,203,0 warp ein_h06 1,1,ein_in01.gat,274,173
+ein_in01.gat,274,176,0 warp ein_h06a 1,1,ein_in01.gat,274,206
+ein_in01.gat,264,203,0 warp ein_h07 1,1,ein_in01.gat,232,173
+ein_in01.gat,232,176,0 warp ein_h07a 1,1,ein_in01.gat,264,206
+ein_in01.gat,284,224,0 warp ein_h08 1,1,ein_in01.gat,177,277
+ein_in01.gat,180,277,0 warp ein_h08a 1,1,ein_in01.gat,280,224
+
+
+//==========================================================================
+//Einbroch - Building behind the hotel
+//==========================================================================
+einbroch.gat,278,233,0 warp ein_ho01 1,1,ein_in01.gat,107,95
+ein_in01.gat,103,95,0 warp ein_ho01a 1,1,einbroch.gat,275,233
+ein_in01.gat,126,88,0 warp ein_ho02 1,1,ein_in01.gat,100,139
+ein_in01.gat,100,142,0 warp ein_ho02a 1,1,ein_in01.gat,123,85
+einbroch.gat,290,222,0 warp ein_ho03 1,1,ein_in01.gat,121,80
+ein_in01.gat,121,77,0 warp ein_ho03a 1,1,einbroch.gat,290,219
+
+
+//==========================================================================
+//Einbroch - House of Kapetain
+//==========================================================================
+einbroch.gat,129,229,0 warp ein_kf01 1,1,ein_in01.gat,14,147
+ein_in01.gat,11,147,0 warp ein_kf01a 1,1,einbroch.gat,126,229
+
+
+//=========================================================================
+//Einbroch - Lab
+//=========================================================================
+ein_in01.gat,286,25,0 warp ein_lab 1,1,einbroch.gat,54,52
+
+
+//=========================================================================
+//Einbroch - Blacksmith guild
+//=========================================================================
+einbroch.gat,255,107,0 warp ein_jb01 1,1,ein_in01.gat,14,17
+ein_in01.gat,14,14,0 warp ein_jb01a 1,1,einbroch.gat,255,110
+ein_in01.gat,39,36,0 warp ein_jb02 1,1,ein_in01.gat,35,83
+ein_in01.gat,39,85,0 warp ein_jb02a 1,1,ein_in01.gat,36,36
+
+
+//==========================================================================
+//Einbroch - Field related
+//==========================================================================
+einbroch.gat,157,331,0 warp ein_fd01 1,1,ein_fild04.gat,184,31
+ein_fild04.gat,184,26,0 warp ein_fd01a 1,1,einbroch.gat,157,327
+einbroch.gat,150,25,0 warp ein_fd02 1,1,ein_fild08.gat,164,377
+ein_fild08.gat,164,380,0 warp ein_fd02a 1,1,einbroch.gat,150,28
+
+//==========================================================================
+//Einbroch - Gunslinger Map Portion (Ninja's map is the same: que_ng.gat)
+//==========================================================================
+einbroch.gat,136,199,0 warp gswarp1 1,1,que_ng.gat,138,167
+que_ng.gat,130,166,0 warp gswarp2 1,1,einbroch.gat,130,197
+que_ng.gat,178,162,0 warp gswarp3 1,1,que_ng.gat,172,86
+que_ng.gat,166,85,0 warp gswarp4 1,1,que_ng.gat,182,161
+que_ng.gat,165,137,0 warp gswarp5 1,1,que_ng.gat,177,41
+que_ng.gat,172,42,0 warp gswarp6 1,1,que_ng.gat,160,139
+//This one seems to be wrong
+//einbroch.gat,137,149,0 warp gswarp7 1,1,que_ng.gat,138,167
diff --git a/npc/warps/cities/geffen.txt b/npc/warps/cities/geffen.txt
index e0beb082c..f4fe16798 100644
--- a/npc/warps/cities/geffen.txt
+++ b/npc/warps/cities/geffen.txt
@@ -1,50 +1,50 @@
-//===== Athena Script ========================================
-//= Geffen Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Geffen
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//Geffen City
-geffen.gat,119,213,0 warp gef001 3,2,gef_fild04.gat,187,42
-geffen.gat,120,114,0 warp gef002 3,1,gef_tower.gat,52,177
-geffen.gat,217,119,0 warp gef003 2,4,gef_fild00.gat,46,199
-geffen.gat,26,119,0 warp gef004 2,3,gef_fild07.gat,336,187
-geffen.gat,138,138,0 warp gef01 1,1,geffen_in.gat,28,110
-geffen.gat,172,174,0 warp gef02 2,2,geffen_in.gat,70,52
-geffen.gat,182,59,0 warp gef03 2,2,geffen_in.gat,106,177
-geffen.gat,43,85,0 warp gef04 2,2,geffen_in.gat,70,138
-geffen.gat,61,180,0 warp gef05 3,3,geffen_in.gat,162,97
-geffen.gat,98,141,0 warp gef06 2,2,geffen_in.gat,28,160
-geffen_in.gat,28,156,0 warp gef06-1 3,1,geffen.gat,101,138
-geffen_in.gat,100,67,0 warp gef07 2,3,geffen_in.gat,84,65
-geffen_in.gat,87,66,0 warp gef07-1 2,3,geffen_in.gat,103,67
-geffen_in.gat,104,109,0 warp gef08 2,2,geffen_in.gat,76,107
-geffen_in.gat,79,107,0 warp gef08-1 2,2,geffen_in.gat,107,109
-geffen_in.gat,113,163,0 warp gef09 2,2,geffen_in.gat,139,169
-geffen_in.gat,136,169,0 warp gef09-1 2,2,geffen_in.gat,110,163
-geffen_in.gat,114,37,0 warp gef10 1,1,geffen_in.gat,114,63
-geffen_in.gat,114,60,0 warp gef10-1 1,2,geffen_in.gat,114,34
-geffen_in.gat,138,149,0 warp gef11 2,2,geffen_in.gat,138,165
-geffen_in.gat,138,162,0 warp gef11-1 2,2,geffen_in.gat,138,146
-geffen_in.gat,26,60,0 warp gef12 1,2,geffen_in.gat,26,34
-geffen_in.gat,26,37,0 warp gef12-1 1,1,geffen_in.gat,26,63
-geffen_in.gat,52,65,0 warp gef13 2,3,geffen_in.gat,38,67
-geffen_in.gat,41,67,0 warp gef13-1 2,3,geffen_in.gat,55,65
-geffen_in.gat,70,149,0 warp gef14 3,2,geffen_in.gat,70,161
-geffen_in.gat,70,158,0 warp gef14-1 3,2,geffen_in.gat,70,146
-geffen_in.gat,70,83,0 warp gef15 3,2,geffen_in.gat,72,101
-geffen_in.gat,72,98,0 warp gef15-1 3,2,geffen_in.gat,70,80
-geffen_in.gat,163,94,0 warp gef05-1 4,2,geffen.gat,65,176
-geffen_in.gat,70,132,0 warp gef04-1 3,1,geffen.gat,46,88
-geffen_in.gat,106,181,0 warp gef03-1 2,2,geffen.gat,180,61
-geffen_in.gat,28,106,0 warp gef01-1 1,3,geffen.gat,136,136
+//===== Athena Script ========================================
+//= Geffen Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Geffen
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//Geffen City
+geffen.gat,119,213,0 warp gef001 3,2,gef_fild04.gat,187,42
+geffen.gat,120,114,0 warp gef002 3,1,gef_tower.gat,52,177
+geffen.gat,217,119,0 warp gef003 2,4,gef_fild00.gat,46,199
+geffen.gat,26,119,0 warp gef004 2,3,gef_fild07.gat,336,187
+geffen.gat,138,138,0 warp gef01 1,1,geffen_in.gat,28,110
+geffen.gat,172,174,0 warp gef02 2,2,geffen_in.gat,70,52
+geffen.gat,182,59,0 warp gef03 2,2,geffen_in.gat,106,177
+geffen.gat,43,85,0 warp gef04 2,2,geffen_in.gat,70,138
+geffen.gat,61,180,0 warp gef05 3,3,geffen_in.gat,162,97
+geffen.gat,98,141,0 warp gef06 2,2,geffen_in.gat,28,160
+geffen_in.gat,28,156,0 warp gef06-1 3,1,geffen.gat,101,138
+geffen_in.gat,100,67,0 warp gef07 2,3,geffen_in.gat,84,65
+geffen_in.gat,87,66,0 warp gef07-1 2,3,geffen_in.gat,103,67
+geffen_in.gat,104,109,0 warp gef08 2,2,geffen_in.gat,76,107
+geffen_in.gat,79,107,0 warp gef08-1 2,2,geffen_in.gat,107,109
+geffen_in.gat,113,163,0 warp gef09 2,2,geffen_in.gat,139,169
+geffen_in.gat,136,169,0 warp gef09-1 2,2,geffen_in.gat,110,163
+geffen_in.gat,114,37,0 warp gef10 1,1,geffen_in.gat,114,63
+geffen_in.gat,114,60,0 warp gef10-1 1,2,geffen_in.gat,114,34
+geffen_in.gat,138,149,0 warp gef11 2,2,geffen_in.gat,138,165
+geffen_in.gat,138,162,0 warp gef11-1 2,2,geffen_in.gat,138,146
+geffen_in.gat,26,60,0 warp gef12 1,2,geffen_in.gat,26,34
+geffen_in.gat,26,37,0 warp gef12-1 1,1,geffen_in.gat,26,63
+geffen_in.gat,52,65,0 warp gef13 2,3,geffen_in.gat,38,67
+geffen_in.gat,41,67,0 warp gef13-1 2,3,geffen_in.gat,55,65
+geffen_in.gat,70,149,0 warp gef14 3,2,geffen_in.gat,70,161
+geffen_in.gat,70,158,0 warp gef14-1 3,2,geffen_in.gat,70,146
+geffen_in.gat,70,83,0 warp gef15 3,2,geffen_in.gat,72,101
+geffen_in.gat,72,98,0 warp gef15-1 3,2,geffen_in.gat,70,80
+geffen_in.gat,163,94,0 warp gef05-1 4,2,geffen.gat,65,176
+geffen_in.gat,70,132,0 warp gef04-1 3,1,geffen.gat,46,88
+geffen_in.gat,106,181,0 warp gef03-1 2,2,geffen.gat,180,61
+geffen_in.gat,28,106,0 warp gef01-1 1,3,geffen.gat,136,136
geffen_in.gat,70,48,0 warp gef02-1 3,2,geffen.gat,168,170 \ No newline at end of file
diff --git a/npc/warps/cities/gonryun.txt b/npc/warps/cities/gonryun.txt
index d13c0ca40..ad5e38c48 100644
--- a/npc/warps/cities/gonryun.txt
+++ b/npc/warps/cities/gonryun.txt
@@ -1,34 +1,34 @@
-//===== Athena Script ========================================
-//= Gonryun Town Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Gonryun
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Gonryun ==================================================
-gonryun.gat,161,8,0 warp gon02 1,1,gon_fild01.gat,191,261
-gonryun.gat,195,93,0 warp gon03 1,1,gon_in.gat,95,23
-gonryun.gat,109,131,0 warp gon15 1,1,gon_in.gat,44,24
-gonryun.gat,215,114,0 warp gon05 1,1,gon_in.gat,152,24
-gonryun.gat,107,184,0 warp gon13 1,1,gon_in.gat,72,70
-gonryun.gat,221,162,0 warp gon11 1,1,gon_in.gat,112,98
-gonryun.gat,159,201,0 warp gon19 1,1,gon_dun01.gat,153,48
-gon_in.gat,95,26,0 warp gon04 1,1,gonryun.gat,195,96
-gon_in.gat,149,24,0 warp gon06 1,1,gonryun.gat,212,114
-gon_in.gat,184,11,0 warp gon07 1,1,gon_in.gat,189,85
-gon_in.gat,186,85,0 warp gon08 1,1,gon_in.gat,181,11
-gon_in.gat,186,107,0 warp gon09 1,1,gon_in.gat,181,36
-gon_in.gat,184,36,0 warp gon10 1,1,gon_in.gat,189,107
-gon_in.gat,109,98,0 warp gon12 1,1,gonryun.gat,218,162
-gon_in.gat,72,67,0 warp gon14 1,1,gonryun.gat,107,181
-gon_in.gat,47,24,0 warp gon16 1,1,gonryun.gat,112,131
-gon_in.gat,42,35,0 warp gon17 1,1,gon_in.gat,34,97
-gon_in.gat,31,97,0 warp gon18 1,1,gon_in.gat,39,35
+//===== Athena Script ========================================
+//= Gonryun Town Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Gonryun
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Gonryun ==================================================
+gonryun.gat,161,8,0 warp gon02 1,1,gon_fild01.gat,191,261
+gonryun.gat,195,93,0 warp gon03 1,1,gon_in.gat,95,23
+gonryun.gat,109,131,0 warp gon15 1,1,gon_in.gat,44,24
+gonryun.gat,215,114,0 warp gon05 1,1,gon_in.gat,152,24
+gonryun.gat,107,184,0 warp gon13 1,1,gon_in.gat,72,70
+gonryun.gat,221,162,0 warp gon11 1,1,gon_in.gat,112,98
+gonryun.gat,159,201,0 warp gon19 1,1,gon_dun01.gat,153,48
+gon_in.gat,95,26,0 warp gon04 1,1,gonryun.gat,195,96
+gon_in.gat,149,24,0 warp gon06 1,1,gonryun.gat,212,114
+gon_in.gat,184,11,0 warp gon07 1,1,gon_in.gat,189,85
+gon_in.gat,186,85,0 warp gon08 1,1,gon_in.gat,181,11
+gon_in.gat,186,107,0 warp gon09 1,1,gon_in.gat,181,36
+gon_in.gat,184,36,0 warp gon10 1,1,gon_in.gat,189,107
+gon_in.gat,109,98,0 warp gon12 1,1,gonryun.gat,218,162
+gon_in.gat,72,67,0 warp gon14 1,1,gonryun.gat,107,181
+gon_in.gat,47,24,0 warp gon16 1,1,gonryun.gat,112,131
+gon_in.gat,42,35,0 warp gon17 1,1,gon_in.gat,34,97
+gon_in.gat,31,97,0 warp gon18 1,1,gon_in.gat,39,35
gon_fild01.gat,192,266,0 warp gon01 1,1,gonryun.gat,161,11 \ No newline at end of file
diff --git a/npc/warps/cities/hugel.txt b/npc/warps/cities/hugel.txt
index b2cda1c63..79862cd4e 100644
--- a/npc/warps/cities/hugel.txt
+++ b/npc/warps/cities/hugel.txt
@@ -1,109 +1,109 @@
-//===== Athena Script ========================================
-//= Garden City Hugel Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.1)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 10+
-//===== Description: =========================================
-//= Warp Points for Hugel
-//===== Additional Comments: =================================
-//= Initial Release
-//= 12/21/05 : Fixed 2 church warps and hunter house warps. [Muad_Dib]
-//= 1.2 fixed hugel10 [Lupus]
-//= 1.3 Rewrote all warps to relate houses, and fixed it to kRO. [Er_Maqui]
-//= 1.3a Replaced all spaces with TABs [Lupus]
-//= 1.4 Fixed an back warp on hu_in01,15,70 (walk to the warp, then warps you back) [erKURITA]
-//= 1.5 Added Bingo warps [erKURITA]
-//============================================================
-
-//= Hugel City ================================================
-
-//Entrance
-hu_fild06.gat,199,373,0 warp hugel01 1,1,hugel.gat,95,34
-hugel.gat,95,32,0 warp hugel02 1,1,hu_fild06.gat,199,371
-
-//Church
-hugel.gat,155,114,0 warp hugel03 1,1,hu_in01.gat,211,177
-hu_in01.gat,211,173,0 warp hugel04 1,1,hugel.gat,159,113
-hu_in01.gat,162,228,0 warp hugel05 1,1,hu_in01.gat,200,220
-hu_in01.gat,194,219,0 warp hugel06 1,1,hu_in01.gat,159,228
-hu_in01.gat,162,168,0 warp hugel07 1,1,hu_in01.gat,199,193
-hu_in01.gat,195,192,0 warp hugel08 1,1,hu_in01.gat,158,168
-
-//House
-hugel.gat,153,153,0 warp hugel09 1,1,hu_in01.gat,287,231
-hu_in01.gat,287,227,0 warp hugel10 1,1,hugel.gat,153,149
-hu_in01.gat,263,252,0 warp hugel11 1,1,hu_in01.gat,362,253
-hu_in01.gat,365,253,0 warp hugel12 1,1,hu_in01.gat,268,252
-
-//House
-hugel.gat,92,167,0 warp hugel13 1,1,hu_in01.gat,246,363
-hu_in01.gat,246,359,0 warp hugel14 1,1,hugel.gat,92,165
-hu_in01.gat,244,315,0 warp hugel15 1,1,hu_in01.gat,245,389
-hu_in01.gat,248,388,0 warp hugel16 1,1,hu_in01.gat,250,315
-hu_in01.gat,229,313,0 warp hugel17 1,1,hu_in01.gat,164,315
-hu_in01.gat,168,315,0 warp hugel18 1,1,hu_in01.gat,233,313
-hu_in01.gat,168,307,0 warp hugel19 1,1,hu_in01.gat,167,376
-hu_in01.gat,168,379,0 warp hugel20 1,1,hu_in01.gat,168,312
-hugel.gat,85,181,0 warp hugel21 1,1,hu_in01.gat,231,303
-hu_in01.gat,231,301,0 warp hugel22 1,1,hugel.gat,83,181
-
-//House
-hugel.gat,70,157,0 warp hugel23 1,1,hu_in01.gat,110,373
-hu_in01.gat,110,369,0 warp hugel24 1,1,hugel.gat,73,153
-hu_in01.gat,108,390,0 warp hugel25 1,1,hu_in01.gat,107,322
-hu_in01.gat,114,322,0 warp hugel26 1,1,hu_in01.gat,111,390
-
-//House
-hugel.gat,91,104,0 warp hugel27 1,1,hu_in01.gat,30,304
-hu_in01.gat,30,299,0 warp hugel28 1,1,hugel.gat,94,103
-hu_in01.gat,33,318,0 warp hugel29 1,1,hu_in01.gat,34,251
-hu_in01.gat,34,246,0 warp hugel30 1,1,hu_in01.gat,33,314
-
-//House
-hugel.gat,104,79,0 warp hugel31 1,1,hu_in01.gat,235,107
-hu_in01.gat,231,107,0 warp hugel32 1,1,hugel.gat,99,77
-hu_in01.gat,268,123,0 warp hugel33 1,1,hu_in01.gat,265,36
-hu_in01.gat,265,42,0 warp hugel34 1,1,hu_in01.gat,265,123
-
-//Library
-hugel.gat,52,90,0 warp hugel35 1,1,hu_in01.gat,33,90
-hu_in01.gat,37,90,0 warp hugel36 1,1,hugel.gat,54,96
-hu_in01.gat,15,70,0 warp hugel37 1,1,hu_in01.gat,15,27
-hu_in01.gat,15,29,0 warp hugel38 1,1,hu_in01.gat,16,74
-hu_in01.gat,15,108,0 warp hugel39 1,1,hu_in01.gat,15,155
-hu_in01.gat,15,151,0 warp hugel40 1,1,hu_in01.gat,16,104
-
-//Hunter Guild
-hugel.gat,206,228,0 warp hugel41 1,1,hu_in01.gat,381,368
-hu_in01.gat,381,363,0 warp hugel42 1,1,hugel.gat,207,225
-hu_in01.gat,380,319,0 warp hugel43 1,1,hu_in01.gat,384,388
-hu_in01.gat,388,388,0 warp hugel44 1,1,hu_in01.gat,385,319
-
-//Other
-hu_in01.gat,149,90,0 warp hugel45 1,1,hu_in01.gat,104,90
-hu_in01.gat,106,90,0 warp hugel46 1,1,hu_in01.gat,151,90
-hu_in01.gat,85,108,0 warp hugel47 1,1,hu_in01.gat,84,153
-hu_in01.gat,84,151,0 warp hugel48 1,1,hu_in01.gat,85,106
-hu_in01.gat,84,71,0 warp hugel49 1,1,hu_in01.gat,86,26
-hu_in01.gat,85,28,0 warp hugel50 1,1,hu_in01.gat,84,73
-hugel.gat,129,65,0 warp hugel51 1,1,hu_in01.gat,347,108
-hu_in01.gat,345,108,0 warp hugel52 1,1,hugel.gat,127,65
-hu_in01.gat,380,118,0 warp hugel53 1,1,hu_in01.gat,378,176
-hu_in01.gat,378,178,0 warp hugel54 1,1,hu_in01.gat,378,118
-hu_in01.gat,314,386,0 warp hugel55 1,1,hu_in01.gat,309,322
-hu_in01.gat,307,322,0 warp hugel56 1,1,hu_in01.gat,312,386
-hugel.gat,80,230,0 warp hugel57 1,1,hu_in01.gat,24,363
-hu_in01.gat,24,361,0 warp hugel58 1,1,hugel.gat,82,230
-hugel.gat,93,201,0 warp hugel60 1,1,hu_in01.gat,303,380
-hu_in01.gat,301,380,0 warp hugel59 1,1,hugel.gat,93,199
-
-//Bingo
-hugel.gat,55,208,0 warp hugelwarp1051 1,1,que_bingo.gat,49,9
-que_bingo.gat,49,7,0 warp hugelwarp1052 1,1,hugel.gat,57,207
-que_bingo.gat,39,34,0 warp hugelwarp1053 1,1,que_bingo.gat,34,109
-que_bingo.gat,34,105,0 warp hugelwarp1054 1,1,que_bingo.gat,38,28
-que_bingo.gat,53,34,0 warp hugelwarp1055 1,1,que_bingo.gat,49,71
+//===== Athena Script ========================================
+//= Garden City Hugel Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.1)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 10+
+//===== Description: =========================================
+//= Warp Points for Hugel
+//===== Additional Comments: =================================
+//= Initial Release
+//= 12/21/05 : Fixed 2 church warps and hunter house warps. [Muad_Dib]
+//= 1.2 fixed hugel10 [Lupus]
+//= 1.3 Rewrote all warps to relate houses, and fixed it to kRO. [Er_Maqui]
+//= 1.3a Replaced all spaces with TABs [Lupus]
+//= 1.4 Fixed an back warp on hu_in01,15,70 (walk to the warp, then warps you back) [erKURITA]
+//= 1.5 Added Bingo warps [erKURITA]
+//============================================================
+
+//= Hugel City ================================================
+
+//Entrance
+hu_fild06.gat,199,373,0 warp hugel01 1,1,hugel.gat,95,34
+hugel.gat,95,32,0 warp hugel02 1,1,hu_fild06.gat,199,371
+
+//Church
+hugel.gat,155,114,0 warp hugel03 1,1,hu_in01.gat,211,177
+hu_in01.gat,211,173,0 warp hugel04 1,1,hugel.gat,159,113
+hu_in01.gat,162,228,0 warp hugel05 1,1,hu_in01.gat,200,220
+hu_in01.gat,194,219,0 warp hugel06 1,1,hu_in01.gat,159,228
+hu_in01.gat,162,168,0 warp hugel07 1,1,hu_in01.gat,199,193
+hu_in01.gat,195,192,0 warp hugel08 1,1,hu_in01.gat,158,168
+
+//House
+hugel.gat,153,153,0 warp hugel09 1,1,hu_in01.gat,287,231
+hu_in01.gat,287,227,0 warp hugel10 1,1,hugel.gat,153,149
+hu_in01.gat,263,252,0 warp hugel11 1,1,hu_in01.gat,362,253
+hu_in01.gat,365,253,0 warp hugel12 1,1,hu_in01.gat,268,252
+
+//House
+hugel.gat,92,167,0 warp hugel13 1,1,hu_in01.gat,246,363
+hu_in01.gat,246,359,0 warp hugel14 1,1,hugel.gat,92,165
+hu_in01.gat,244,315,0 warp hugel15 1,1,hu_in01.gat,245,389
+hu_in01.gat,248,388,0 warp hugel16 1,1,hu_in01.gat,250,315
+hu_in01.gat,229,313,0 warp hugel17 1,1,hu_in01.gat,164,315
+hu_in01.gat,168,315,0 warp hugel18 1,1,hu_in01.gat,233,313
+hu_in01.gat,168,307,0 warp hugel19 1,1,hu_in01.gat,167,376
+hu_in01.gat,168,379,0 warp hugel20 1,1,hu_in01.gat,168,312
+hugel.gat,85,181,0 warp hugel21 1,1,hu_in01.gat,231,303
+hu_in01.gat,231,301,0 warp hugel22 1,1,hugel.gat,83,181
+
+//House
+hugel.gat,70,157,0 warp hugel23 1,1,hu_in01.gat,110,373
+hu_in01.gat,110,369,0 warp hugel24 1,1,hugel.gat,73,153
+hu_in01.gat,108,390,0 warp hugel25 1,1,hu_in01.gat,107,322
+hu_in01.gat,114,322,0 warp hugel26 1,1,hu_in01.gat,111,390
+
+//House
+hugel.gat,91,104,0 warp hugel27 1,1,hu_in01.gat,30,304
+hu_in01.gat,30,299,0 warp hugel28 1,1,hugel.gat,94,103
+hu_in01.gat,33,318,0 warp hugel29 1,1,hu_in01.gat,34,251
+hu_in01.gat,34,246,0 warp hugel30 1,1,hu_in01.gat,33,314
+
+//House
+hugel.gat,104,79,0 warp hugel31 1,1,hu_in01.gat,235,107
+hu_in01.gat,231,107,0 warp hugel32 1,1,hugel.gat,99,77
+hu_in01.gat,268,123,0 warp hugel33 1,1,hu_in01.gat,265,36
+hu_in01.gat,265,42,0 warp hugel34 1,1,hu_in01.gat,265,123
+
+//Library
+hugel.gat,52,90,0 warp hugel35 1,1,hu_in01.gat,33,90
+hu_in01.gat,37,90,0 warp hugel36 1,1,hugel.gat,54,96
+hu_in01.gat,15,70,0 warp hugel37 1,1,hu_in01.gat,15,27
+hu_in01.gat,15,29,0 warp hugel38 1,1,hu_in01.gat,16,74
+hu_in01.gat,15,108,0 warp hugel39 1,1,hu_in01.gat,15,155
+hu_in01.gat,15,151,0 warp hugel40 1,1,hu_in01.gat,16,104
+
+//Hunter Guild
+hugel.gat,206,228,0 warp hugel41 1,1,hu_in01.gat,381,368
+hu_in01.gat,381,363,0 warp hugel42 1,1,hugel.gat,207,225
+hu_in01.gat,380,319,0 warp hugel43 1,1,hu_in01.gat,384,388
+hu_in01.gat,388,388,0 warp hugel44 1,1,hu_in01.gat,385,319
+
+//Other
+hu_in01.gat,149,90,0 warp hugel45 1,1,hu_in01.gat,104,90
+hu_in01.gat,106,90,0 warp hugel46 1,1,hu_in01.gat,151,90
+hu_in01.gat,85,108,0 warp hugel47 1,1,hu_in01.gat,84,153
+hu_in01.gat,84,151,0 warp hugel48 1,1,hu_in01.gat,85,106
+hu_in01.gat,84,71,0 warp hugel49 1,1,hu_in01.gat,86,26
+hu_in01.gat,85,28,0 warp hugel50 1,1,hu_in01.gat,84,73
+hugel.gat,129,65,0 warp hugel51 1,1,hu_in01.gat,347,108
+hu_in01.gat,345,108,0 warp hugel52 1,1,hugel.gat,127,65
+hu_in01.gat,380,118,0 warp hugel53 1,1,hu_in01.gat,378,176
+hu_in01.gat,378,178,0 warp hugel54 1,1,hu_in01.gat,378,118
+hu_in01.gat,314,386,0 warp hugel55 1,1,hu_in01.gat,309,322
+hu_in01.gat,307,322,0 warp hugel56 1,1,hu_in01.gat,312,386
+hugel.gat,80,230,0 warp hugel57 1,1,hu_in01.gat,24,363
+hu_in01.gat,24,361,0 warp hugel58 1,1,hugel.gat,82,230
+hugel.gat,93,201,0 warp hugel60 1,1,hu_in01.gat,303,380
+hu_in01.gat,301,380,0 warp hugel59 1,1,hugel.gat,93,199
+
+//Bingo
+hugel.gat,55,208,0 warp hugelwarp1051 1,1,que_bingo.gat,49,9
+que_bingo.gat,49,7,0 warp hugelwarp1052 1,1,hugel.gat,57,207
+que_bingo.gat,39,34,0 warp hugelwarp1053 1,1,que_bingo.gat,34,109
+que_bingo.gat,34,105,0 warp hugelwarp1054 1,1,que_bingo.gat,38,28
+que_bingo.gat,53,34,0 warp hugelwarp1055 1,1,que_bingo.gat,49,71
que_bingo.gat,48,66,0 warp hugelwarp1056 1,1,que_bingo.gat,53,29 \ No newline at end of file
diff --git a/npc/warps/cities/izlude.txt b/npc/warps/cities/izlude.txt
index 87d38c692..c427e44cd 100644
--- a/npc/warps/cities/izlude.txt
+++ b/npc/warps/cities/izlude.txt
@@ -1,34 +1,34 @@
-//===== Athena Script ========================================
-//= Izlude Warp Script
-//===== By: ==================================================
-//= Athena (1.0), Nana (1.1)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Izlude
-//===== Additional Comments: =================================
-//= 1.3 Added warps to Izlude Airship [Justin84]
-//= 1.4 Minor correction on airport warps
-//============================================================
-
-//= Izlude City ==============================================
-izlude.gat,109,151,0 warp iz01 3,3,izlude_in.gat,65,87
-izlude.gat,148,148,0 warp iz02 2,2,izlude_in.gat,116,49
-izlude.gat,216,129,0 warp iz03 3,2,izlude_in.gat,151,127
-izlude.gat,30,78,0 warp iz001 3,3,prt_fild08.gat,367,212
-izlude.gat,52,140,0 warp iz04 2,2,izlude_in.gat,74,161
-izlude_in.gat,108,169,0 warp iz05 2,3,izlude_in.gat,84,169
-izlude_in.gat,116,46,0 warp iz02-1 3,2,izlude.gat,145,145
-izlude_in.gat,148,127,0 warp iz03-1 2,5,izlude.gat,212,129
-izlude_in.gat,171,97,0 warp iz06 3,2,izlude_in.gat,172,119
-izlude_in.gat,172,116,0 warp iz06-1 3,2,izlude_in.gat,172,94
-izlude_in.gat,172,139,0 warp iz07 3,2,izlude_in.gat,172,161
-izlude_in.gat,172,158,0 warp iz07-1 3,2,izlude_in.gat,172,136
-izlude_in.gat,43,169,0 warp w219 2,3,izlude_in.gat,64,169
-izlude_in.gat,65,84,0 warp iz01-1 5,2,izlude.gat,113,147
-izlude_in.gat,74,158,0 warp iz04-1 3,2,izlude.gat,52,136
-izlude_in.gat,87,169,0 warp iz05-1 2,3,izlude_in.gat,111,169
-izlude.gat,149,39,0 warp izair1 1,1,izlude.gat,180,56
+//===== Athena Script ========================================
+//= Izlude Warp Script
+//===== By: ==================================================
+//= Athena (1.0), Nana (1.1)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Izlude
+//===== Additional Comments: =================================
+//= 1.3 Added warps to Izlude Airship [Justin84]
+//= 1.4 Minor correction on airport warps
+//============================================================
+
+//= Izlude City ==============================================
+izlude.gat,109,151,0 warp iz01 3,3,izlude_in.gat,65,87
+izlude.gat,148,148,0 warp iz02 2,2,izlude_in.gat,116,49
+izlude.gat,216,129,0 warp iz03 3,2,izlude_in.gat,151,127
+izlude.gat,30,78,0 warp iz001 3,3,prt_fild08.gat,367,212
+izlude.gat,52,140,0 warp iz04 2,2,izlude_in.gat,74,161
+izlude_in.gat,108,169,0 warp iz05 2,3,izlude_in.gat,84,169
+izlude_in.gat,116,46,0 warp iz02-1 3,2,izlude.gat,145,145
+izlude_in.gat,148,127,0 warp iz03-1 2,5,izlude.gat,212,129
+izlude_in.gat,171,97,0 warp iz06 3,2,izlude_in.gat,172,119
+izlude_in.gat,172,116,0 warp iz06-1 3,2,izlude_in.gat,172,94
+izlude_in.gat,172,139,0 warp iz07 3,2,izlude_in.gat,172,161
+izlude_in.gat,172,158,0 warp iz07-1 3,2,izlude_in.gat,172,136
+izlude_in.gat,43,169,0 warp w219 2,3,izlude_in.gat,64,169
+izlude_in.gat,65,84,0 warp iz01-1 5,2,izlude.gat,113,147
+izlude_in.gat,74,158,0 warp iz04-1 3,2,izlude.gat,52,136
+izlude_in.gat,87,169,0 warp iz05-1 2,3,izlude_in.gat,111,169
+izlude.gat,149,39,0 warp izair1 1,1,izlude.gat,180,56
izlude.gat,176,56,0 warp lizair2 1,1,izlude.gat,145,39 \ No newline at end of file
diff --git a/npc/warps/cities/lighthalzen.txt b/npc/warps/cities/lighthalzen.txt
index fa1077573..0447d88b0 100644
--- a/npc/warps/cities/lighthalzen.txt
+++ b/npc/warps/cities/lighthalzen.txt
@@ -1,145 +1,145 @@
-//===== Athena Script ========================================
-//= Lighthalzen Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.0)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Lighthalzen
-//===== Additional Comments: =================================
-//= 1.3 Removed fields and dungeons warps from here [DracoRPG]
-//= 1.3a A small fix for a warp [MasterOfMuppets]
-//= 1.4 Lighthalzen warp, taken from korean eA site [Vicious]
-//= 1.4a Corrected warp for 'lhz013a' [Zephiris]
-//= 1.5 Added a few missing warps, thanks to Kargha [MasterOfMuppets]
-//= 1.6 Added a few more missing warps. [MasterOfMuppets]
-//= 1.7 Yet more missing warps implemented :P [MasterOfMuppets]
-//============================================================
-
-lighthalzen.gat,196,46,0 warp lhz010 1,1,lhz_in02.gat,282,83
-lhz_in02.gat,282,79,0 warp lhz010a 1,1,lighthalzen.gat,193,47
-
-lighthalzen.gat,197,36,0 warp lhz011 1,1,lhz_in02.gat,284,30
-lhz_in02.gat,288,30,0 warp lhz011a 1,1,lighthalzen.gat,194,35
-
-lhz_in02.gat,265,14,0 warp lhz012 1,1,lhz_in02.gat,269,82
-lhz_in02.gat,274,82,0 warp lhz012a 1,1,lhz_in02.gat,269,14
-
-lhz_in02.gat,108,26,0 warp lhz013 1,1,lighthalzen.gat,98,110
-lighthalzen.gat,92,110,0 warp lhz013a 1,1,lhz_in02.gat,104,26
-
-lighthalzen.gat,50,87,0 warp lhz014 1,1,lhz_in03.gat,45,31
-lhz_in03.gat,50,31,0 warp lhz014a 1,1,lighthalzen.gat,54,87
-
-lhz_in03.gat,20,99,0 warp lhz015 1,1,lhz_in03.gat,17,31
-lhz_in03.gat,13,31,0 warp lhz015a 1,1,lhz_in03.gat,15,99
-
-lighthalzen.gat,159,133,0 warp lhz016 1,1,lhz_in02.gat,232,265
-lhz_in02.gat,232,261,0 warp lhz016a 1,1,lighthalzen.gat,159,129
-
-lhz_in02.gat,210,284,0 warp lhz017 1,1,lhz_in02.gat,241,219
-lhz_in02.gat,236,219,0 warp lhz017a 1,1,lhz_in02.gat,206,284
-
-lhz_in02.gat,269,212,0 warp lhz018 1,1,lhz_in02.gat,250,212
-lhz_in02.gat,254,212,0 warp lhz018a 1,1,lhz_in02.gat,273,212
-
-lhz_in02.gat,231,200,0 warp lhz019 1,1,lhz_in02.gat,212,200
-lhz_in02.gat,216,200,0 warp lhz019a 1,1,lhz_in02.gat,233,200
-
-lhz_in02.gat,231,182,0 warp lhz020 1,1,lhz_in02.gat,212,182
-lhz_in02.gat,216,182,0 warp lhz020a 1,1,lhz_in02.gat,235,182
-
-lhz_in02.gat,238,169,0 warp lhz021 1,1,lhz_in02.gat,238,150
-lhz_in02.gat,238,154,0 warp lhz021a 1,1,lhz_in02.gat,238,173
-
-lhz_in02.gat,261,278,0 warp lhz022 1,1,lhz_in02.gat,246,278
-lhz_in02.gat,250,278,0 warp lhz022a 1,1,lhz_in02.gat,265,278
-
-lighthalzen.gat,238,220,0 warp lhz023 1,1,lhz_in02.gat,28,270
-lhz_in02.gat,27,265,0 warp lhz023a 1,1,lighthalzen.gat,238,216
-
-lhz_in02.gat,13,284,0 warp lhz024 1,1,lhz_in02.gat,89,285
-lhz_in02.gat,95,285,0 warp lhz024a 1,1,lhz_in02.gat,19,284
-
-lhz_in02.gat,114,272,0 warp lhz025 1,1,lhz_in02.gat,153,282
-lhz_in02.gat,149,282,0 warp lhz025a 1,1,lhz_in02.gat,110,272
-
-lighthalzen.gat,198,257,0 warp lhz026 1,1,lhz_in02.gat,39,28
-lhz_in02.gat,44,28,0 warp lhz026a 1,1,lighthalzen.gat,203,257
-
-lighthalzen.gat,236,276,0 warp lhz027 1,1,lhz_in02.gat,133,199
-lhz_in02.gat,129,199,0 warp lhz027a 1,1,lighthalzen.gat,232,276
-
-lighthalzen.gat,251,299,0 warp lhz028 1,1,lhz_in03.gat,97,21
-lhz_in03.gat,93,21,0 warp lhz028a 1,1,lighthalzen.gat,247,299
-
-lhz_in03.gat,134,14,0 warp lhz029 1,1,lhz_in03.gat,125,90
-lhz_in03.gat,120,90,0 warp lhz029a 1,1,lhz_in03.gat,130,14
-
-lighthalzen.gat,198,163,0 warp lhz030 1,1,lhz_in02.gat,21,195
-lhz_in02.gat,21,191,0 warp lhz030a 1,1,lighthalzen.gat,202,160
-
-lhz_in02.gat,39,204,0 warp lhz031 1,1,lhz_in02.gat,41,136
-lhz_in02.gat,36,136,0 warp lhz031a 1,1,lhz_in02.gat,34,204
-
-lhz_in02.gat,49,154,0 warp lhz032 1,1,lhz_in02.gat,98,155
-lhz_in02.gat,103,155,0 warp lhz032a 1,1,lhz_in02.gat,44,154
-
-lhz_in02.gat,88,144,0 warp lhz033 1,1,lhz_in02.gat,89,212
-lhz_in02.gat,94,212,0 warp lhz033a 1,1,lhz_in02.gat,94,144
-
-lhz_in02.gat,79,223,0 warp lhz034 1,1,lhz_in02.gat,17,155
-lhz_in02.gat,13,155,0 warp lhz034a 1,1,lhz_in02.gat,84,223
-
-lighthalzen.gat,101,248,0 warp lhz035 1,1,lhz_in01.gat,111,126
-lhz_in01.gat,111,121,0 warp lhz035a 1,1,lighthalzen.gat,101,243
-
-lighthalzen.gat,106,248,0 warp lhz036 1,1,lhz_in01.gat,116,126
-lhz_in01.gat,116,121,0 warp lhz036a 1,1,lighthalzen.gat,106,243
-
-lhz_in01.gat,88,215,0 warp lhz037 1,1,lhz_in01.gat,106,18
-lhz_in01.gat,106,15,0 warp lhz037a 1,1,lhz_in01.gat,88,211
-
-lhz_in01.gat,140,215,0 warp lhz038 1,1,lhz_in01.gat,158,18
-lhz_in01.gat,158,15,0 warp lhz038a 1,1,lhz_in01.gat,140,211
-
-lhz_in01.gat,194,55,0 warp lhz039 1,1,lhz_in01.gat,188,250
-lhz_in01.gat,188,254,0 warp lhz039a 1,1,lhz_in01.gat,191,52
-
-lhz_in01.gat,230,226,0 warp lhz040 1,1,lhz_in01.gat,257,226
-lhz_in01.gat,251,226,0 warp lhz040a 1,1,lhz_in01.gat,225,226
-
-lhz_in01.gat,98,55,0 warp lhz041 1,1,lhz_in01.gat,76,250
-lhz_in01.gat,76,254,0 warp lhz041a 1,1,lhz_in01.gat,100,52
-
-lhz_in01.gat,149,179,0 warp lhz042 1,1,lhz_in01.gat,15,24
-lhz_in01.gat,11,24,0 warp lhz042a 1,1,lhz_in01.gat,145,178
-
-lighthalzen.gat,346,232,0 warp lhz043 1,1,lhz_in03.gat,188,14
-lhz_in03.gat,188,11,0 warp lhz043a 1,1,lighthalzen.gat,346,229
-
-lhz_in03.gat,191,35,0 warp lhz044 1,1,lhz_in03.gat,190,103
-lhz_in03.gat,190,100,0 warp lhz044a 1,1,lhz_in03.gat,189,34
-
-lighthalzen.gat,339,240,0 warp lhz045 1,1,lhz_in03.gat,180,87
-lhz_in03.gat,180,90,0 warp lhz045a 1,1,lighthalzen.gat,339,242
-
-lhz_in01.gat,40,224,0 warp lhz046 1,1,lhz_in01.gat,19,129
-lhz_in01.gat,15,129,0 warp lhz046a 1,1,lhz_in01.gat,34,224
-
-lhz_in01.gat,58,130,0 warp lhz047 1,1,lhz_in01.gat,193,127
-lhz_in01.gat,191,127,0 warp lhz047a 1,1,lhz_in01.gat,56,130
-
-lhz_in01.gat,43,115,0 warp lhz048 1,1,lhz_in01.gat,278,130
-lhz_in01.gat,278,132,0 warp lhz048a 1,1,lhz_in01.gat,43,117
-
-//lhz_in01.gat,275,235,0 warp lhz049 1,1,lhz_in01.gat,275,242 //not sure
-//lhz_in01.gat,275,238,0 warp lhz049a 1,1,lhz_in01.gat,275,232 //not sure
-
-lighthalzen.gat,324,301,0 warp lhz050 1,1,lhz_in03.gat,239,101
-lhz_in03.gat,237,101,0 warp lhz050a 1,1,lighthalzen.gat,324,299
-
-lighthalzen.gat,323,322,0 warp lhz051 1,1,lhz_in03.gat,15,162
+//===== Athena Script ========================================
+//= Lighthalzen Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.0)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Lighthalzen
+//===== Additional Comments: =================================
+//= 1.3 Removed fields and dungeons warps from here [DracoRPG]
+//= 1.3a A small fix for a warp [MasterOfMuppets]
+//= 1.4 Lighthalzen warp, taken from korean eA site [Vicious]
+//= 1.4a Corrected warp for 'lhz013a' [Zephiris]
+//= 1.5 Added a few missing warps, thanks to Kargha [MasterOfMuppets]
+//= 1.6 Added a few more missing warps. [MasterOfMuppets]
+//= 1.7 Yet more missing warps implemented :P [MasterOfMuppets]
+//============================================================
+
+lighthalzen.gat,196,46,0 warp lhz010 1,1,lhz_in02.gat,282,83
+lhz_in02.gat,282,79,0 warp lhz010a 1,1,lighthalzen.gat,193,47
+
+lighthalzen.gat,197,36,0 warp lhz011 1,1,lhz_in02.gat,284,30
+lhz_in02.gat,288,30,0 warp lhz011a 1,1,lighthalzen.gat,194,35
+
+lhz_in02.gat,265,14,0 warp lhz012 1,1,lhz_in02.gat,269,82
+lhz_in02.gat,274,82,0 warp lhz012a 1,1,lhz_in02.gat,269,14
+
+lhz_in02.gat,108,26,0 warp lhz013 1,1,lighthalzen.gat,98,110
+lighthalzen.gat,92,110,0 warp lhz013a 1,1,lhz_in02.gat,104,26
+
+lighthalzen.gat,50,87,0 warp lhz014 1,1,lhz_in03.gat,45,31
+lhz_in03.gat,50,31,0 warp lhz014a 1,1,lighthalzen.gat,54,87
+
+lhz_in03.gat,20,99,0 warp lhz015 1,1,lhz_in03.gat,17,31
+lhz_in03.gat,13,31,0 warp lhz015a 1,1,lhz_in03.gat,15,99
+
+lighthalzen.gat,159,133,0 warp lhz016 1,1,lhz_in02.gat,232,265
+lhz_in02.gat,232,261,0 warp lhz016a 1,1,lighthalzen.gat,159,129
+
+lhz_in02.gat,210,284,0 warp lhz017 1,1,lhz_in02.gat,241,219
+lhz_in02.gat,236,219,0 warp lhz017a 1,1,lhz_in02.gat,206,284
+
+lhz_in02.gat,269,212,0 warp lhz018 1,1,lhz_in02.gat,250,212
+lhz_in02.gat,254,212,0 warp lhz018a 1,1,lhz_in02.gat,273,212
+
+lhz_in02.gat,231,200,0 warp lhz019 1,1,lhz_in02.gat,212,200
+lhz_in02.gat,216,200,0 warp lhz019a 1,1,lhz_in02.gat,233,200
+
+lhz_in02.gat,231,182,0 warp lhz020 1,1,lhz_in02.gat,212,182
+lhz_in02.gat,216,182,0 warp lhz020a 1,1,lhz_in02.gat,235,182
+
+lhz_in02.gat,238,169,0 warp lhz021 1,1,lhz_in02.gat,238,150
+lhz_in02.gat,238,154,0 warp lhz021a 1,1,lhz_in02.gat,238,173
+
+lhz_in02.gat,261,278,0 warp lhz022 1,1,lhz_in02.gat,246,278
+lhz_in02.gat,250,278,0 warp lhz022a 1,1,lhz_in02.gat,265,278
+
+lighthalzen.gat,238,220,0 warp lhz023 1,1,lhz_in02.gat,28,270
+lhz_in02.gat,27,265,0 warp lhz023a 1,1,lighthalzen.gat,238,216
+
+lhz_in02.gat,13,284,0 warp lhz024 1,1,lhz_in02.gat,89,285
+lhz_in02.gat,95,285,0 warp lhz024a 1,1,lhz_in02.gat,19,284
+
+lhz_in02.gat,114,272,0 warp lhz025 1,1,lhz_in02.gat,153,282
+lhz_in02.gat,149,282,0 warp lhz025a 1,1,lhz_in02.gat,110,272
+
+lighthalzen.gat,198,257,0 warp lhz026 1,1,lhz_in02.gat,39,28
+lhz_in02.gat,44,28,0 warp lhz026a 1,1,lighthalzen.gat,203,257
+
+lighthalzen.gat,236,276,0 warp lhz027 1,1,lhz_in02.gat,133,199
+lhz_in02.gat,129,199,0 warp lhz027a 1,1,lighthalzen.gat,232,276
+
+lighthalzen.gat,251,299,0 warp lhz028 1,1,lhz_in03.gat,97,21
+lhz_in03.gat,93,21,0 warp lhz028a 1,1,lighthalzen.gat,247,299
+
+lhz_in03.gat,134,14,0 warp lhz029 1,1,lhz_in03.gat,125,90
+lhz_in03.gat,120,90,0 warp lhz029a 1,1,lhz_in03.gat,130,14
+
+lighthalzen.gat,198,163,0 warp lhz030 1,1,lhz_in02.gat,21,195
+lhz_in02.gat,21,191,0 warp lhz030a 1,1,lighthalzen.gat,202,160
+
+lhz_in02.gat,39,204,0 warp lhz031 1,1,lhz_in02.gat,41,136
+lhz_in02.gat,36,136,0 warp lhz031a 1,1,lhz_in02.gat,34,204
+
+lhz_in02.gat,49,154,0 warp lhz032 1,1,lhz_in02.gat,98,155
+lhz_in02.gat,103,155,0 warp lhz032a 1,1,lhz_in02.gat,44,154
+
+lhz_in02.gat,88,144,0 warp lhz033 1,1,lhz_in02.gat,89,212
+lhz_in02.gat,94,212,0 warp lhz033a 1,1,lhz_in02.gat,94,144
+
+lhz_in02.gat,79,223,0 warp lhz034 1,1,lhz_in02.gat,17,155
+lhz_in02.gat,13,155,0 warp lhz034a 1,1,lhz_in02.gat,84,223
+
+lighthalzen.gat,101,248,0 warp lhz035 1,1,lhz_in01.gat,111,126
+lhz_in01.gat,111,121,0 warp lhz035a 1,1,lighthalzen.gat,101,243
+
+lighthalzen.gat,106,248,0 warp lhz036 1,1,lhz_in01.gat,116,126
+lhz_in01.gat,116,121,0 warp lhz036a 1,1,lighthalzen.gat,106,243
+
+lhz_in01.gat,88,215,0 warp lhz037 1,1,lhz_in01.gat,106,18
+lhz_in01.gat,106,15,0 warp lhz037a 1,1,lhz_in01.gat,88,211
+
+lhz_in01.gat,140,215,0 warp lhz038 1,1,lhz_in01.gat,158,18
+lhz_in01.gat,158,15,0 warp lhz038a 1,1,lhz_in01.gat,140,211
+
+lhz_in01.gat,194,55,0 warp lhz039 1,1,lhz_in01.gat,188,250
+lhz_in01.gat,188,254,0 warp lhz039a 1,1,lhz_in01.gat,191,52
+
+lhz_in01.gat,230,226,0 warp lhz040 1,1,lhz_in01.gat,257,226
+lhz_in01.gat,251,226,0 warp lhz040a 1,1,lhz_in01.gat,225,226
+
+lhz_in01.gat,98,55,0 warp lhz041 1,1,lhz_in01.gat,76,250
+lhz_in01.gat,76,254,0 warp lhz041a 1,1,lhz_in01.gat,100,52
+
+lhz_in01.gat,149,179,0 warp lhz042 1,1,lhz_in01.gat,15,24
+lhz_in01.gat,11,24,0 warp lhz042a 1,1,lhz_in01.gat,145,178
+
+lighthalzen.gat,346,232,0 warp lhz043 1,1,lhz_in03.gat,188,14
+lhz_in03.gat,188,11,0 warp lhz043a 1,1,lighthalzen.gat,346,229
+
+lhz_in03.gat,191,35,0 warp lhz044 1,1,lhz_in03.gat,190,103
+lhz_in03.gat,190,100,0 warp lhz044a 1,1,lhz_in03.gat,189,34
+
+lighthalzen.gat,339,240,0 warp lhz045 1,1,lhz_in03.gat,180,87
+lhz_in03.gat,180,90,0 warp lhz045a 1,1,lighthalzen.gat,339,242
+
+lhz_in01.gat,40,224,0 warp lhz046 1,1,lhz_in01.gat,19,129
+lhz_in01.gat,15,129,0 warp lhz046a 1,1,lhz_in01.gat,34,224
+
+lhz_in01.gat,58,130,0 warp lhz047 1,1,lhz_in01.gat,193,127
+lhz_in01.gat,191,127,0 warp lhz047a 1,1,lhz_in01.gat,56,130
+
+lhz_in01.gat,43,115,0 warp lhz048 1,1,lhz_in01.gat,278,130
+lhz_in01.gat,278,132,0 warp lhz048a 1,1,lhz_in01.gat,43,117
+
+//lhz_in01.gat,275,235,0 warp lhz049 1,1,lhz_in01.gat,275,242 //not sure
+//lhz_in01.gat,275,238,0 warp lhz049a 1,1,lhz_in01.gat,275,232 //not sure
+
+lighthalzen.gat,324,301,0 warp lhz050 1,1,lhz_in03.gat,239,101
+lhz_in03.gat,237,101,0 warp lhz050a 1,1,lighthalzen.gat,324,299
+
+lighthalzen.gat,323,322,0 warp lhz051 1,1,lhz_in03.gat,15,162
lhz_in03.gat,13,162,0 warp lhz051a 1,1,lighthalzen.gat,321,322 \ No newline at end of file
diff --git a/npc/warps/cities/louyang.txt b/npc/warps/cities/louyang.txt
index 94870dd20..3d13f5929 100644
--- a/npc/warps/cities/louyang.txt
+++ b/npc/warps/cities/louyang.txt
@@ -1,55 +1,55 @@
-//===== Athena Script ========================================
-//= Lou Yang Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version 6.0+
-//===== Description: =========================================
-//= Warp Points for Lou Yang
-//===== Additional Comments: =================================
-//= 1.1 Added 2 escapes from 2 mountains 018,019 [Lupus]
-//= Some players used to stuck there after warps
-//= 1.2 Added a few missing warps [MasterOfMuppets]
-//= 1.3 Fixed a few warp-back [erKURITA]
-//============================================================
-
-//= Louyang Town ============================================
-louyang.gat,217,22,0 warp louwarp001 3,3,lou_fild01.gat,232,353
-louyang.gat,37,270,0 warp louwarp002 3,3,lou_dun01.gat,218,196
-louyang.gat,218,253,0 warp louwarp005 3,3,lou_in01.gat,101,122
-louyang.gat,279,168,0 warp louwarp006 3,3,lou_in02.gat,57,174
-louyang.gat,309,80,0 warp louwarp007 3,3,lou_in02.gat,189,78
-louyang.gat,124,121,0 warp louwarp009 3,3,lou_in02.gat,197,162
-louyang.gat,129,121,0 warp louwarp009a 3,3,lou_in02.gat,203,162
-louyang.gat,145,175,0 warp louwarp010 3,3,lou_in02.gat,125,168
-louyang.gat,135,96,0 warp louwarp011 3,3,lou_in02.gat,248,172
-louyang.gat,317,177,0 warp louwarp014 3,3,lou_in02.gat,118,34
-louyang.gat,130,63,0 warp louwarp015 3,3,lou_in02.gat,71,32
-louyang.gat,263,93,0 warp louwarp018 3,3,lou_in02.gat,246,58
-louyang.gat,133,245,0 warp louwarp020 1,1,lou_in01.gat,25,19
-lou_in01.gat,27,19,0 warp louwarp020a 1,1,louyang.gat,135,245
-lou_in01.gat,125,141,0 warp louwarp016 3,3,lou_in01.gat,156,141
-lou_in01.gat,152,141,0 warp louwarp016a 3,3,lou_in01.gat,120,141
-lou_in01.gat,78,141,0 warp louwarp017 3,3,lou_in01.gat,47,141
-lou_in01.gat,51,141,0 warp louwarp017a 3,3,lou_in01.gat,82,141
-lou_in01.gat,101,118,0 warp louwarp005a 3,3,louyang.gat,218,249
-lou_in01.gat,14,18,0 warp louwarp021 1,1,louyang.gat,90,253
-lou_in02.gat,57,170,0 warp louwarp006a 3,3,louyang.gat,279,164
-lou_in02.gat,200,93,0 warp louwarp008 3,3,lou_in02.gat,170,46
-lou_in02.gat,174,46,0 warp louwarp008a 3,3,lou_in02.gat,206,94
-lou_in02.gat,197,158,0 warp louwarp009b 3,3,louyang.gat,124,117
-lou_in02.gat,203,158,0 warp louwarp009c 3,3,louyang.gat,129,117
-lou_in02.gat,125,164,0 warp louwarp010a 3,3,louyang.gat,145,171
-lou_in02.gat,251,175,0 warp louwarp011a 3,3,louyang.gat,140,101
-lou_in02.gat,242,59,0 warp louwarp018a 3,3,louyang.gat,260,93
-lou_in02.gat,80,190,0 warp louwarp012 3,3,lou_in02.gat,74,140
-lou_in02.gat,71,140,0 warp louwarp012a 3,3,lou_in02.gat,77,190
-lou_in02.gat,35,190,0 warp louwarp013 3,3,lou_in02.gat,37,138
-lou_in02.gat,43,138,0 warp louwarp013a 3,3,lou_in02.gat,39,190
-lou_in02.gat,121,32,0 warp louwarp014a 3,3,louyang.gat,317,173
-lou_in02.gat,71,28,0 warp louwarp015a 3,3,louyang.gat,130,57
-lou_in02.gat,189,74,0 warp louwarp007a 3,3,louyang.gat,309,76
-lou_fild01.gat,232,357,0 warp louwarp001a 3,3,louyang.gat,217,26
-
+//===== Athena Script ========================================
+//= Lou Yang Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version 6.0+
+//===== Description: =========================================
+//= Warp Points for Lou Yang
+//===== Additional Comments: =================================
+//= 1.1 Added 2 escapes from 2 mountains 018,019 [Lupus]
+//= Some players used to stuck there after warps
+//= 1.2 Added a few missing warps [MasterOfMuppets]
+//= 1.3 Fixed a few warp-back [erKURITA]
+//============================================================
+
+//= Louyang Town ============================================
+louyang.gat,217,22,0 warp louwarp001 3,3,lou_fild01.gat,232,353
+louyang.gat,37,270,0 warp louwarp002 3,3,lou_dun01.gat,218,196
+louyang.gat,218,253,0 warp louwarp005 3,3,lou_in01.gat,101,122
+louyang.gat,279,168,0 warp louwarp006 3,3,lou_in02.gat,57,174
+louyang.gat,309,80,0 warp louwarp007 3,3,lou_in02.gat,189,78
+louyang.gat,124,121,0 warp louwarp009 3,3,lou_in02.gat,197,162
+louyang.gat,129,121,0 warp louwarp009a 3,3,lou_in02.gat,203,162
+louyang.gat,145,175,0 warp louwarp010 3,3,lou_in02.gat,125,168
+louyang.gat,135,96,0 warp louwarp011 3,3,lou_in02.gat,248,172
+louyang.gat,317,177,0 warp louwarp014 3,3,lou_in02.gat,118,34
+louyang.gat,130,63,0 warp louwarp015 3,3,lou_in02.gat,71,32
+louyang.gat,263,93,0 warp louwarp018 3,3,lou_in02.gat,246,58
+louyang.gat,133,245,0 warp louwarp020 1,1,lou_in01.gat,25,19
+lou_in01.gat,27,19,0 warp louwarp020a 1,1,louyang.gat,135,245
+lou_in01.gat,125,141,0 warp louwarp016 3,3,lou_in01.gat,156,141
+lou_in01.gat,152,141,0 warp louwarp016a 3,3,lou_in01.gat,120,141
+lou_in01.gat,78,141,0 warp louwarp017 3,3,lou_in01.gat,47,141
+lou_in01.gat,51,141,0 warp louwarp017a 3,3,lou_in01.gat,82,141
+lou_in01.gat,101,118,0 warp louwarp005a 3,3,louyang.gat,218,249
+lou_in01.gat,14,18,0 warp louwarp021 1,1,louyang.gat,90,253
+lou_in02.gat,57,170,0 warp louwarp006a 3,3,louyang.gat,279,164
+lou_in02.gat,200,93,0 warp louwarp008 3,3,lou_in02.gat,170,46
+lou_in02.gat,174,46,0 warp louwarp008a 3,3,lou_in02.gat,206,94
+lou_in02.gat,197,158,0 warp louwarp009b 3,3,louyang.gat,124,117
+lou_in02.gat,203,158,0 warp louwarp009c 3,3,louyang.gat,129,117
+lou_in02.gat,125,164,0 warp louwarp010a 3,3,louyang.gat,145,171
+lou_in02.gat,251,175,0 warp louwarp011a 3,3,louyang.gat,140,101
+lou_in02.gat,242,59,0 warp louwarp018a 3,3,louyang.gat,260,93
+lou_in02.gat,80,190,0 warp louwarp012 3,3,lou_in02.gat,74,140
+lou_in02.gat,71,140,0 warp louwarp012a 3,3,lou_in02.gat,77,190
+lou_in02.gat,35,190,0 warp louwarp013 3,3,lou_in02.gat,37,138
+lou_in02.gat,43,138,0 warp louwarp013a 3,3,lou_in02.gat,39,190
+lou_in02.gat,121,32,0 warp louwarp014a 3,3,louyang.gat,317,173
+lou_in02.gat,71,28,0 warp louwarp015a 3,3,louyang.gat,130,57
+lou_in02.gat,189,74,0 warp louwarp007a 3,3,louyang.gat,309,76
+lou_fild01.gat,232,357,0 warp louwarp001a 3,3,louyang.gat,217,26
+
diff --git a/npc/warps/cities/lutie.txt b/npc/warps/cities/lutie.txt
index addb41e86..b52e65c38 100644
--- a/npc/warps/cities/lutie.txt
+++ b/npc/warps/cities/lutie.txt
@@ -1,38 +1,38 @@
-//===== Athena Script ========================================
-//= Lutie Warp Script
-//===== By: ==================================================
-//= Athena (1.0) Nana (1.1)
-//===== Current Version: =====================================
-//= 1.2a
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Lutie
-//===== Additional Comments: =================================
-//= 1.2a Re-fixed endless warping loop
-//============================================================
-
-xmas.gat,150,41,0 warp xmas2-1 3,3,xmas_fild01.gat,80,246
-xmas.gat,120,131,0 warp xmas3 3,3,xmas_in.gat,41,33
-xmas_in.gat,46,33,0 warp xmas3-1 3,3,xmas.gat,125,131
-xmas.gat,120,161,0 warp xmas4 3,3,xmas_in.gat,33,91
-xmas_in.gat,38,89,0 warp xmas4-1 3,3,xmas.gat,125,159
-xmas.gat,175,132,0 warp xmas5 3,3,xmas_in.gat,158,31
-xmas_in.gat,153,31,0 warp xmas5-1 3,3,xmas.gat,170,132
-xmas.gat,174,161,0 warp xmas6 3,3,xmas_in.gat,166,98
-xmas_in.gat,163,93,0 warp xmas6-1 3,3,xmas.gat,169,158
-xmas.gat,182,169,0 warp xmas7 3,3,xmas_in.gat,174,108
-xmas_in.gat,179,109,0 warp xmas7-1 3,3,xmas.gat,185,168
-xmas.gat,142,240,0 warp xmas8 3,3,xmas_in.gat,95,87
-xmas_in.gat,95,82,0 warp xmas8-1 3,3,xmas.gat,142,235
-xmas.gat,149,240,0 warp xmas9 3,3,xmas_in.gat,105,87
-xmas_in.gat,105,82,0 warp xmas9-1 3,3,xmas.gat,149,235
-xmas.gat,149,256,0 warp xmas10 3,3,xmas_in.gat,105,112
-xmas_in.gat,105,117,0 warp xmas10-1 2,2,xmas.gat,149,261
-xmas.gat,142,256,0 warp xmas11 3,3,xmas_in.gat,96,114
-xmas_in.gat,95,117,0 warp xmas11-1 2,2,xmas.gat,142,261
-xmas.gat,104,290,0 warp xmas12 3,3,xmas_in.gat,30,166
-xmas_in.gat,30,161,0 warp xmas12-1 3,3,xmas.gat,104,285
-xmas.gat,189,279,0 warp xmas13 3,3,xmas_in.gat,168,166
-xmas_in.gat,168,161,0 warp xmas13-1 3,3,xmas.gat,189,274
+//===== Athena Script ========================================
+//= Lutie Warp Script
+//===== By: ==================================================
+//= Athena (1.0) Nana (1.1)
+//===== Current Version: =====================================
+//= 1.2a
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Lutie
+//===== Additional Comments: =================================
+//= 1.2a Re-fixed endless warping loop
+//============================================================
+
+xmas.gat,150,41,0 warp xmas2-1 3,3,xmas_fild01.gat,80,246
+xmas.gat,120,131,0 warp xmas3 3,3,xmas_in.gat,41,33
+xmas_in.gat,46,33,0 warp xmas3-1 3,3,xmas.gat,125,131
+xmas.gat,120,161,0 warp xmas4 3,3,xmas_in.gat,33,91
+xmas_in.gat,38,89,0 warp xmas4-1 3,3,xmas.gat,125,159
+xmas.gat,175,132,0 warp xmas5 3,3,xmas_in.gat,158,31
+xmas_in.gat,153,31,0 warp xmas5-1 3,3,xmas.gat,170,132
+xmas.gat,174,161,0 warp xmas6 3,3,xmas_in.gat,166,98
+xmas_in.gat,163,93,0 warp xmas6-1 3,3,xmas.gat,169,158
+xmas.gat,182,169,0 warp xmas7 3,3,xmas_in.gat,174,108
+xmas_in.gat,179,109,0 warp xmas7-1 3,3,xmas.gat,185,168
+xmas.gat,142,240,0 warp xmas8 3,3,xmas_in.gat,95,87
+xmas_in.gat,95,82,0 warp xmas8-1 3,3,xmas.gat,142,235
+xmas.gat,149,240,0 warp xmas9 3,3,xmas_in.gat,105,87
+xmas_in.gat,105,82,0 warp xmas9-1 3,3,xmas.gat,149,235
+xmas.gat,149,256,0 warp xmas10 3,3,xmas_in.gat,105,112
+xmas_in.gat,105,117,0 warp xmas10-1 2,2,xmas.gat,149,261
+xmas.gat,142,256,0 warp xmas11 3,3,xmas_in.gat,96,114
+xmas_in.gat,95,117,0 warp xmas11-1 2,2,xmas.gat,142,261
+xmas.gat,104,290,0 warp xmas12 3,3,xmas_in.gat,30,166
+xmas_in.gat,30,161,0 warp xmas12-1 3,3,xmas.gat,104,285
+xmas.gat,189,279,0 warp xmas13 3,3,xmas_in.gat,168,166
+xmas_in.gat,168,161,0 warp xmas13-1 3,3,xmas.gat,189,274
xmas.gat,143,313,0 warp xmas14 3,3,xmas_dun01.gat,205,17 \ No newline at end of file
diff --git a/npc/warps/cities/morroc.txt b/npc/warps/cities/morroc.txt
index acac81154..aa5f2af16 100644
--- a/npc/warps/cities/morroc.txt
+++ b/npc/warps/cities/morroc.txt
@@ -1,107 +1,107 @@
-//===== Athena Script ========================================
-//= Morroc Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.2)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Morroc and Assassin Guild
-//===== Additional Comments: =================================
-//= No Comment
-//============================================================
-
-//= Morroc City ==============================================
-morocc.gat,160,17,0 warp moc001 2,2,moc_fild12.gat,159,378
-morocc.gat,160,183,0 warp moc002 2,1,moc_castle.gat,94,181
-morocc.gat,160,297,0 warp moc003 2,2,moc_fild07.gat,198,25
-morocc.gat,197,66,0 warp moc01 1,1,morocc_in.gat,83,92
-morocc.gat,22,294,0 warp moc02 2,5,moc_ruins.gat,156,42
-morocc.gat,24,164,0 warp moc004 1,2,moc_fild19.gat,164,107
-morocc.gat,253,56,0 warp moc03 2,1,morocc_in.gat,134,74
-morocc.gat,26,297,0 warp moc02-1 5,2,moc_ruins.gat,156,42
-morocc.gat,274,269,0 warp moc04 2,2,morocc_in.gat,138,136
-morocc.gat,283,170,0 warp moc07 2,2,morocc_in.gat,108,176
-morocc.gat,302,207,0 warp moc005 2,2,moc_fild10.gat,22,207
-morocc.gat,46,46,0 warp moc05 2,1,morocc_in.gat,68,72
-morocc.gat,52,259,0 warp moc06 1,2,morocc_in.gat,180,65
-morocc.gat,85,55,0 warp moc08 2,2,morocc_in.gat,44,149
-morocc.gat,98,68,0 warp moc09 1,1,morocc_in.gat,44,175
-morocc_in.gat,105,95,0 warp moc10-1 1,3,morocc_in.gat,90,95
-morocc_in.gat,106,123,0 warp moc11-1 1,3,morocc_in.gat,90,123
-morocc_in.gat,108,179,0 warp moc07-1 2,2,morocc.gat,283,173
-morocc_in.gat,134,77,0 warp moc03-1 3,1,morocc.gat,251,59
-morocc_in.gat,136,136,0 warp moc04-1 1,4,morocc.gat,271,269
-morocc_in.gat,144,109,0 warp moc12-1 3,1,morocc_in.gat,144,125
-morocc_in.gat,144,122,0 warp moc12 3,1,morocc_in.gat,144,106
-morocc_in.gat,144,151,0 warp moc13 3,1,morocc_in.gat,144,169
-morocc_in.gat,144,166,0 warp moc13-1 3,1,morocc_in.gat,144,148
-morocc_in.gat,149,129,0 warp moc14 1,2,morocc_in.gat,169,129
-morocc_in.gat,166,130,0 warp moc14-1 1,3,morocc_in.gat,146,130
-morocc_in.gat,171,37,0 warp moc15-1 4,1,morocc_in.gat,171,52
-morocc_in.gat,171,50,0 warp moc15 4,1,morocc_in.gat,171,35
-morocc_in.gat,174,109,0 warp moc22 3,1,morocc_in.gat,174,125
-morocc_in.gat,174,122,0 warp moc22-1 3,1,morocc_in.gat,174,106
-morocc_in.gat,174,151,0 warp moc16 3,1,morocc_in.gat,174,169
-morocc_in.gat,174,166,0 warp moc16-1 3,1,morocc_in.gat,174,148
-morocc_in.gat,183,65,0 warp moc06-1 2,3,morocc.gat,55,259
-morocc_in.gat,23,161,0 warp moc17 1,2,morocc_in.gat,37,161
-morocc_in.gat,34,161,0 warp moc17-1 1,2,morocc_in.gat,20,161
-morocc_in.gat,44,146,0 warp moc08-1 3,2,morocc.gat,82,52
-morocc_in.gat,44,178,0 warp moc09-1 2,2,morocc.gat,100,70
-morocc_in.gat,55,123,0 warp moc18-1 1,3,morocc_in.gat,71,123
-morocc_in.gat,55,95,0 warp moc19-1 1,3,morocc_in.gat,71,95
-morocc_in.gat,57,161,0 warp moc20 1,3,morocc_in.gat,73,161
-morocc_in.gat,68,123,0 warp moc18 1,3,morocc_in.gat,52,123
-morocc_in.gat,68,42,0 warp moc21-1 2,1,morocc_in.gat,68,65
-morocc_in.gat,68,62,0 warp moc21 2,1,morocc_in.gat,68,38
-morocc_in.gat,68,75,0 warp moc05-1 2,1,morocc.gat,49,49
-morocc_in.gat,68,95,0 warp moc19 1,3,morocc_in.gat,52,95
-morocc_in.gat,70,161,0 warp moc20-1 1,3,morocc_in.gat,54,161
-morocc_in.gat,83,90,0 warp moc01-1 4,1,morocc.gat,199,64
-morocc_in.gat,86,101,0 warp moc23 2,1,morocc_in.gat,86,120
-morocc_in.gat,86,117,0 warp moc23-1 3,1,morocc_in.gat,86,98
-morocc_in.gat,93,123,0 warp moc11 1,3,morocc_in.gat,109,123
-morocc_in.gat,93,95,0 warp moc10 1,3,morocc_in.gat,109,95
-
-//= Morroc Ruins ============================================
-moc_ruins.gat,161,40,0 warp moc02-2 2,4,morocc.gat,26,293
-moc_ruins.gat,157,37,0 warp moc02-3 5,2,morocc.gat,26,293
-moc_ruins.gat,54,161,0 warp moc006 2,3,moc_pryd01.gat,192,9
-moc_ruins.gat,71,16,0 warp moc007 8,2,moc_fild19.gat,71,167
-
-//= Morroc Castle ===========================================
-moc_castle.gat,94,183,0 warp mocc001 2,1,morocc.gat,160,185
-moc_castle.gat,107,163,0 warp mocc01 2,3,moc_castle.gat,124,163
-moc_castle.gat,120,163,0 warp mocc01-1 2,3,moc_castle.gat,103,163
-moc_castle.gat,120,75,0 warp mocc02 2,3,moc_castle.gat,56,33
-moc_castle.gat,59,34,0 warp mocc02-1 2,3,moc_castle.gat,124,75
-moc_castle.gat,134,101,0 warp mocc03 1,1,moc_castle.gat,134,128
-moc_castle.gat,134,124,0 warp mocc-03 2,2,moc_castle.gat,134,98
-moc_castle.gat,134,139,0 warp mocc04 1,1,moc_castle.gat,134,160
-moc_castle.gat,134,156,0 warp mocc04-1 2,2,moc_castle.gat,134,136
-moc_castle.gat,149,163,0 warp mocc05 2,3,moc_castle.gat,162,163
-moc_castle.gat,158,163,0 warp mocc05-1 2,3,moc_castle.gat,145,163
-moc_castle.gat,16,131,0 warp mocc06 1,2,moc_castle.gat,16,164
-moc_castle.gat,16,160,0 warp mocc06-1 1,2,moc_castle.gat,16,125
-moc_castle.gat,170,131,0 warp mocc07 2,2,moc_castle.gat,170,163
-moc_castle.gat,170,160,0 warp mocc07-1 1,1,moc_castle.gat,170,128
-moc_castle.gat,29,163,0 warp mocc08 2,2,moc_castle.gat,44,163
-moc_castle.gat,40,163,0 warp mocc08-1 2,2,moc_castle.gat,25,163
-moc_castle.gat,51,114,0 warp mocc09 3,2,moc_castle.gat,54,65
-moc_castle.gat,54,69,0 warp mocc09-1 3,2,moc_castle.gat,52,117
-moc_castle.gat,54,139,0 warp mocc10 2,2,moc_castle.gat,54,160
-moc_castle.gat,54,156,0 warp mocc10-1 2,2,moc_castle.gat,54,134
-moc_castle.gat,63,89,0 warp mocc11 2,3,moc_castle.gat,83,89
-moc_castle.gat,80,89,0 warp mocc11-1 2,3,moc_castle.gat,60,89
-moc_castle.gat,69,163,0 warp mocc12 2,2,moc_castle.gat,86,163
-moc_castle.gat,82,163,0 warp mocc12-1 2,2,moc_castle.gat,66,163
-moc_castle.gat,88,93,0 warp mocc13 1,1,moc_castle.gat,94,119
-moc_castle.gat,94,116,0 warp mocc13-1 1,1,moc_castle.gat,88,90
-moc_castle.gat,96,90,0 warp mocc13-2 1,1,moc_castle.gat,94,119
-moc_castle.gat,92,67,0 warp mocc14 3,2,moc_castle.gat,92,85
-moc_castle.gat,92,82,0 warp mocc14-1 3,2,moc_castle.gat,92,63
-moc_castle.gat,94,143,0 warp mocc15 3,2,moc_castle.gat,94,160
+//===== Athena Script ========================================
+//= Morroc Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.2)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Morroc and Assassin Guild
+//===== Additional Comments: =================================
+//= No Comment
+//============================================================
+
+//= Morroc City ==============================================
+morocc.gat,160,17,0 warp moc001 2,2,moc_fild12.gat,159,378
+morocc.gat,160,183,0 warp moc002 2,1,moc_castle.gat,94,181
+morocc.gat,160,297,0 warp moc003 2,2,moc_fild07.gat,198,25
+morocc.gat,197,66,0 warp moc01 1,1,morocc_in.gat,83,92
+morocc.gat,22,294,0 warp moc02 2,5,moc_ruins.gat,156,42
+morocc.gat,24,164,0 warp moc004 1,2,moc_fild19.gat,164,107
+morocc.gat,253,56,0 warp moc03 2,1,morocc_in.gat,134,74
+morocc.gat,26,297,0 warp moc02-1 5,2,moc_ruins.gat,156,42
+morocc.gat,274,269,0 warp moc04 2,2,morocc_in.gat,138,136
+morocc.gat,283,170,0 warp moc07 2,2,morocc_in.gat,108,176
+morocc.gat,302,207,0 warp moc005 2,2,moc_fild10.gat,22,207
+morocc.gat,46,46,0 warp moc05 2,1,morocc_in.gat,68,72
+morocc.gat,52,259,0 warp moc06 1,2,morocc_in.gat,180,65
+morocc.gat,85,55,0 warp moc08 2,2,morocc_in.gat,44,149
+morocc.gat,98,68,0 warp moc09 1,1,morocc_in.gat,44,175
+morocc_in.gat,105,95,0 warp moc10-1 1,3,morocc_in.gat,90,95
+morocc_in.gat,106,123,0 warp moc11-1 1,3,morocc_in.gat,90,123
+morocc_in.gat,108,179,0 warp moc07-1 2,2,morocc.gat,283,173
+morocc_in.gat,134,77,0 warp moc03-1 3,1,morocc.gat,251,59
+morocc_in.gat,136,136,0 warp moc04-1 1,4,morocc.gat,271,269
+morocc_in.gat,144,109,0 warp moc12-1 3,1,morocc_in.gat,144,125
+morocc_in.gat,144,122,0 warp moc12 3,1,morocc_in.gat,144,106
+morocc_in.gat,144,151,0 warp moc13 3,1,morocc_in.gat,144,169
+morocc_in.gat,144,166,0 warp moc13-1 3,1,morocc_in.gat,144,148
+morocc_in.gat,149,129,0 warp moc14 1,2,morocc_in.gat,169,129
+morocc_in.gat,166,130,0 warp moc14-1 1,3,morocc_in.gat,146,130
+morocc_in.gat,171,37,0 warp moc15-1 4,1,morocc_in.gat,171,52
+morocc_in.gat,171,50,0 warp moc15 4,1,morocc_in.gat,171,35
+morocc_in.gat,174,109,0 warp moc22 3,1,morocc_in.gat,174,125
+morocc_in.gat,174,122,0 warp moc22-1 3,1,morocc_in.gat,174,106
+morocc_in.gat,174,151,0 warp moc16 3,1,morocc_in.gat,174,169
+morocc_in.gat,174,166,0 warp moc16-1 3,1,morocc_in.gat,174,148
+morocc_in.gat,183,65,0 warp moc06-1 2,3,morocc.gat,55,259
+morocc_in.gat,23,161,0 warp moc17 1,2,morocc_in.gat,37,161
+morocc_in.gat,34,161,0 warp moc17-1 1,2,morocc_in.gat,20,161
+morocc_in.gat,44,146,0 warp moc08-1 3,2,morocc.gat,82,52
+morocc_in.gat,44,178,0 warp moc09-1 2,2,morocc.gat,100,70
+morocc_in.gat,55,123,0 warp moc18-1 1,3,morocc_in.gat,71,123
+morocc_in.gat,55,95,0 warp moc19-1 1,3,morocc_in.gat,71,95
+morocc_in.gat,57,161,0 warp moc20 1,3,morocc_in.gat,73,161
+morocc_in.gat,68,123,0 warp moc18 1,3,morocc_in.gat,52,123
+morocc_in.gat,68,42,0 warp moc21-1 2,1,morocc_in.gat,68,65
+morocc_in.gat,68,62,0 warp moc21 2,1,morocc_in.gat,68,38
+morocc_in.gat,68,75,0 warp moc05-1 2,1,morocc.gat,49,49
+morocc_in.gat,68,95,0 warp moc19 1,3,morocc_in.gat,52,95
+morocc_in.gat,70,161,0 warp moc20-1 1,3,morocc_in.gat,54,161
+morocc_in.gat,83,90,0 warp moc01-1 4,1,morocc.gat,199,64
+morocc_in.gat,86,101,0 warp moc23 2,1,morocc_in.gat,86,120
+morocc_in.gat,86,117,0 warp moc23-1 3,1,morocc_in.gat,86,98
+morocc_in.gat,93,123,0 warp moc11 1,3,morocc_in.gat,109,123
+morocc_in.gat,93,95,0 warp moc10 1,3,morocc_in.gat,109,95
+
+//= Morroc Ruins ============================================
+moc_ruins.gat,161,40,0 warp moc02-2 2,4,morocc.gat,26,293
+moc_ruins.gat,157,37,0 warp moc02-3 5,2,morocc.gat,26,293
+moc_ruins.gat,54,161,0 warp moc006 2,3,moc_pryd01.gat,192,9
+moc_ruins.gat,71,16,0 warp moc007 8,2,moc_fild19.gat,71,167
+
+//= Morroc Castle ===========================================
+moc_castle.gat,94,183,0 warp mocc001 2,1,morocc.gat,160,185
+moc_castle.gat,107,163,0 warp mocc01 2,3,moc_castle.gat,124,163
+moc_castle.gat,120,163,0 warp mocc01-1 2,3,moc_castle.gat,103,163
+moc_castle.gat,120,75,0 warp mocc02 2,3,moc_castle.gat,56,33
+moc_castle.gat,59,34,0 warp mocc02-1 2,3,moc_castle.gat,124,75
+moc_castle.gat,134,101,0 warp mocc03 1,1,moc_castle.gat,134,128
+moc_castle.gat,134,124,0 warp mocc-03 2,2,moc_castle.gat,134,98
+moc_castle.gat,134,139,0 warp mocc04 1,1,moc_castle.gat,134,160
+moc_castle.gat,134,156,0 warp mocc04-1 2,2,moc_castle.gat,134,136
+moc_castle.gat,149,163,0 warp mocc05 2,3,moc_castle.gat,162,163
+moc_castle.gat,158,163,0 warp mocc05-1 2,3,moc_castle.gat,145,163
+moc_castle.gat,16,131,0 warp mocc06 1,2,moc_castle.gat,16,164
+moc_castle.gat,16,160,0 warp mocc06-1 1,2,moc_castle.gat,16,125
+moc_castle.gat,170,131,0 warp mocc07 2,2,moc_castle.gat,170,163
+moc_castle.gat,170,160,0 warp mocc07-1 1,1,moc_castle.gat,170,128
+moc_castle.gat,29,163,0 warp mocc08 2,2,moc_castle.gat,44,163
+moc_castle.gat,40,163,0 warp mocc08-1 2,2,moc_castle.gat,25,163
+moc_castle.gat,51,114,0 warp mocc09 3,2,moc_castle.gat,54,65
+moc_castle.gat,54,69,0 warp mocc09-1 3,2,moc_castle.gat,52,117
+moc_castle.gat,54,139,0 warp mocc10 2,2,moc_castle.gat,54,160
+moc_castle.gat,54,156,0 warp mocc10-1 2,2,moc_castle.gat,54,134
+moc_castle.gat,63,89,0 warp mocc11 2,3,moc_castle.gat,83,89
+moc_castle.gat,80,89,0 warp mocc11-1 2,3,moc_castle.gat,60,89
+moc_castle.gat,69,163,0 warp mocc12 2,2,moc_castle.gat,86,163
+moc_castle.gat,82,163,0 warp mocc12-1 2,2,moc_castle.gat,66,163
+moc_castle.gat,88,93,0 warp mocc13 1,1,moc_castle.gat,94,119
+moc_castle.gat,94,116,0 warp mocc13-1 1,1,moc_castle.gat,88,90
+moc_castle.gat,96,90,0 warp mocc13-2 1,1,moc_castle.gat,94,119
+moc_castle.gat,92,67,0 warp mocc14 3,2,moc_castle.gat,92,85
+moc_castle.gat,92,82,0 warp mocc14-1 3,2,moc_castle.gat,92,63
+moc_castle.gat,94,143,0 warp mocc15 3,2,moc_castle.gat,94,160
moc_castle.gat,94,156,0 warp mocc15-1 3,2,moc_castle.gat,94,140 \ No newline at end of file
diff --git a/npc/warps/cities/niflheim.txt b/npc/warps/cities/niflheim.txt
index 6bf475180..f41626390 100644
--- a/npc/warps/cities/niflheim.txt
+++ b/npc/warps/cities/niflheim.txt
@@ -1,52 +1,52 @@
-//===== Athena Script ========================================
-//= Niflheim Warp Script
-//===== By: ==================================================
-//= PKGINGO (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Niflheim
-//===== Additional Comments: =================================
-//= Extracted from Vidar -> Athena
-//= V1.1: Added Inn and House warps needed for the Piano
-//= Quest. [Skotlex
-//============================================================
-
-//Niflheim Fields
-nif_fild01.gat,345,323,0 warp nwarp7 1,1,nif_fild02.gat,23,312
-nif_fild02.gat,21,312,0 warp nwarp8 1,1,nif_fild01.gat,343,322
-nif_fild02.gat,379,235,0 warp nwarp9 1,1,niflheim.gat,20,153
-niflheim.gat,18,151,0 warp nwarp10 1,1,nif_fild02.gat,376,235
-
-//Niflheim Town
-
-//Weapon shop
-niflheim.gat,220,169,0 warp nwarp11 1,1,nif_in.gat,14,88
-nif_in.gat,11,88,0 warp nwarp12 1,1,niflheim.gat,218,170
-
-//Item shop: 134,12
-niflheim.gat,219,199,0 warp nwarp13 1,1,nif_in.gat,136,14
-nif_in.gat,134,12,0 warp nwarp14 1,1,niflheim.gat,218,197
-
-//House
-niflheim.gat,190,241,0 warp nwarp19 1,1,nif_in.gat,81,77
-nif_in.gat,78,74,0 warp nwarp20 1,1,niflheim.gat,187,241
-
-//Inn
-niflheim.gat,189,211,0 warp nwarp21 1,1,nif_in.gat,20,14
-nif_in.gat,23,12,0 warp nwarp22 1,1,niflheim.gat,189,207
-nif_in.gat,34,34,0 warp nwarp23 1,1,nif_in.gat,88,31
-nif_in.gat,88,29,0 warp nwarp24 1,1,nif_in.gat,34,31
-
-//House on the hill
-niflheim.gat,255,194,0 warp nwarp15 1,1,nif_in.gat,20,156
-nif_in.gat,18,154,0 warp nwarp16 1,1,niflheim.gat,254,192
-nif_in.gat,65,168,0 warp nwarp17 1,1,nif_in.gat,141,174
-nif_in.gat,140,171,0 warp nwarp18 1,1,nif_in.gat,65,165
-
-niflheim.gat,165,162,0 warp nwarp19 1,1,nif_in.gat,156,80
-nif_in.gat,169,82,0 warp nwarp20 1,1,nif_in.gat,189,105
-nif_in.gat,186,105,0 warp nwarp21 1,1,nif_in.gat,167,82
-nif_in.gat,154,78,0 warp nwarp22 1,1,niflheim.gat,167,161
+//===== Athena Script ========================================
+//= Niflheim Warp Script
+//===== By: ==================================================
+//= PKGINGO (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Niflheim
+//===== Additional Comments: =================================
+//= Extracted from Vidar -> Athena
+//= V1.1: Added Inn and House warps needed for the Piano
+//= Quest. [Skotlex
+//============================================================
+
+//Niflheim Fields
+nif_fild01.gat,345,323,0 warp nwarp7 1,1,nif_fild02.gat,23,312
+nif_fild02.gat,21,312,0 warp nwarp8 1,1,nif_fild01.gat,343,322
+nif_fild02.gat,379,235,0 warp nwarp9 1,1,niflheim.gat,20,153
+niflheim.gat,18,151,0 warp nwarp10 1,1,nif_fild02.gat,376,235
+
+//Niflheim Town
+
+//Weapon shop
+niflheim.gat,220,169,0 warp nwarp11 1,1,nif_in.gat,14,88
+nif_in.gat,11,88,0 warp nwarp12 1,1,niflheim.gat,218,170
+
+//Item shop: 134,12
+niflheim.gat,219,199,0 warp nwarp13 1,1,nif_in.gat,136,14
+nif_in.gat,134,12,0 warp nwarp14 1,1,niflheim.gat,218,197
+
+//House
+niflheim.gat,190,241,0 warp nwarp19 1,1,nif_in.gat,81,77
+nif_in.gat,78,74,0 warp nwarp20 1,1,niflheim.gat,187,241
+
+//Inn
+niflheim.gat,189,211,0 warp nwarp21 1,1,nif_in.gat,20,14
+nif_in.gat,23,12,0 warp nwarp22 1,1,niflheim.gat,189,207
+nif_in.gat,34,34,0 warp nwarp23 1,1,nif_in.gat,88,31
+nif_in.gat,88,29,0 warp nwarp24 1,1,nif_in.gat,34,31
+
+//House on the hill
+niflheim.gat,255,194,0 warp nwarp15 1,1,nif_in.gat,20,156
+nif_in.gat,18,154,0 warp nwarp16 1,1,niflheim.gat,254,192
+nif_in.gat,65,168,0 warp nwarp17 1,1,nif_in.gat,141,174
+nif_in.gat,140,171,0 warp nwarp18 1,1,nif_in.gat,65,165
+
+niflheim.gat,165,162,0 warp nwarp19 1,1,nif_in.gat,156,80
+nif_in.gat,169,82,0 warp nwarp20 1,1,nif_in.gat,189,105
+nif_in.gat,186,105,0 warp nwarp21 1,1,nif_in.gat,167,82
+nif_in.gat,154,78,0 warp nwarp22 1,1,niflheim.gat,167,161
diff --git a/npc/warps/cities/payon.txt b/npc/warps/cities/payon.txt
index 52d6c001d..e4506b3f4 100644
--- a/npc/warps/cities/payon.txt
+++ b/npc/warps/cities/payon.txt
@@ -1,138 +1,138 @@
-//===== eAthena Script =======================================
-//= Payon Warps
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//= Nana (1.3)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= Payon warps
-//===== Additional Comments: =================================
-//= Warps Done By Muad Dib, All Credits To Him
-//= 1.2 Removed Duplicated Warp
-//= 1.3 Separated and reorganized field and dungeons
-//= 1.4 Fixed warp payonwarp031 [Yor]
-//= 1.5 Removed Payonwarp006, it was a duplicate [MasterOfMuppets]
-//============================================================
-
-// == Official Warps From kRO Screenshots ==
-
-// -- Entrance / Exit --
-payon.gat,16,142,0 warp payonwarp001 1,1,pay_gld.gat,370,149
-pay_gld.gat,374,149,0 warp payonwarp002 1,1,payon.gat,20,142
-payon.gat,122,27,0 warp payonwarp003 5,3,pay_fild01.gat,333,356
-pay_fild01.gat,333,360,0 warp payonwarp004 5,3,payon.gat,122,31
-payon.gat,267,89,0 warp payonwarp005 2,4,pay_fild08.gat,20,74
-payon.gat,228,330,0 warp payonwarp007 4,2,pay_arche.gat,81,22
-pay_arche.gat,81,18,0 warp payonwarp008 5,2,payon.gat,228,326
-
-// -- Inn --
-payon.gat,223,117,0 warp payonwarp009 2,2,payon_in01.gat,175,11
-payon_in01.gat,172,11,0 warp payonwarp010 2,2,payon.gat,219,117
-payon_in01.gat,180,43,0 warp payonwarp011 2,2,payon_in01.gat,181,73
-payon_in01.gat,181,70,0 warp payonwarp012 2,2,payon_in01.gat,180,40
-payon_in01.gat,193,92,0 warp payonwarp013 2,2,payon_in01.gat,143,61
-payon_in01.gat,146,61,0 warp payonwarp014 2,2,payon_in01.gat,193,89
-payon_in01.gat,133,42,0 warp payonwarp015 2,2,payon_in01.gat,133,18
-payon_in01.gat,133,21,0 warp payonwarp016 2,2,payon_in01.gat,133,45
-
-// -- Sort of Mill --
-payon.gat,140,85,0 warp payonwarp017 2,2,payon_in01.gat,14,51
-payon_in01.gat,17,51,0 warp payonwarp018 2,2,payon.gat,143,85
-payon_in01.gat,10,59,0 warp payonwarp019 2,2,payon_in01.gat,10,83
-payon_in01.gat,10,80,0 warp payonwarp021 2,2,payon_in01.gat,10,56
-payon_in01.gat,10,38,0 warp payonwarp022 2,2,payon_in01.gat,10,14
-payon_in01.gat,10,17,0 warp payonwarp023 2,2,payon_in01.gat,10,41
-
-// -- Weaponshop --
-payon.gat,135,158,0 warp payonwarp024 2,2,payon_in01.gat,20,129
-payon_in01.gat,23,129,0 warp payonwarp025 2,2,payon.gat,138,158
-payon.gat,130,169,0 warp payonwarp026 2,2,payon_in01.gat,13,136
-payon_in01.gat,13,139,0 warp payonwarp027 2,2,payon.gat,130,172
-
-// -- House --
-payon.gat,151,127,0 warp payonwarp028 2,2,payon_in01.gat,56,53
-payon_in01.gat,56,50,0 warp payonwarp029 2,2,payon.gat,151,124
-
-// -- Middle Castle --
-payon.gat,155,248,0 warp payonwarp030 4,1,payon_in03.gat,98,117
-payon_in03.gat,98,114,0 warp payonwarp031 5,1,payon.gat,155,245
-payon_in03.gat,90,124,0 warp payonwarp032 2,2,payon_in03.gat,80,124
-payon_in03.gat,83,124,0 warp payonwarp033 2,2,payon_in03.gat,93,124
-payon_in03.gat,99,133,0 warp payonwarp034 2,2,payon_in03.gat,99,151
-payon_in03.gat,99,148,0 warp payonwarp035 2,2,payon_in03.gat,99,130
-payon_in03.gat,107,124,0 warp payonwarp036 2,2,payon_in03.gat,117,124
-payon_in03.gat,114,124,0 warp payonwarp037 2,2,payon_in03.gat,104,124
-
-// -- Weapon Storage Building --
-payon.gat,189,233,0 warp payonwarp038 2,2,payon_in03.gat,149,39
-payon_in03.gat,146,39,0 warp payonwarp039 2,2,payon.gat,186,233
-payon_in03.gat,158,32,0 warp payonwarp040 2,2,payon_in03.gat,130,14
-payon_in03.gat,130,17,0 warp payonwarp041 2,2,payon_in03.gat,158,35
-payon_in03.gat,172,32,0 warp payonwarp042 2,2,payon_in03.gat,160,14
-payon_in03.gat,160,17,0 warp payonwarp043 2,2,payon_in03.gat,172,35
-payon_in03.gat,186,32,0 warp payonwarp044 2,2,payon_in03.gat,190,13
-payon_in03.gat,190,17,0 warp payonwarp045 2,2,payon_in03.gat,186,35
-
-// -- House --
-payon.gat,256,285,0 warp payonwarp046 2,2,payon_in01.gat,45,11
-payon_in01.gat,42,11,0 warp payonwarp047 2,2,payon.gat,253,285
-
-// -- Old Archer Village Warps --
-pay_arche.gat,36,131,0 warp payonwarp048 2,2,pay_dun00.gat,21,183
-pay_arche.gat,71,156,0 warp payonwarp049 2,2,payon_in02.gat,82,41
-pay_arche.gat,92,170,0 warp payonwarp050 2,2,payon_in02.gat,50,7
-pay_arche.gat,145,165,0 warp payonwarp051 2,2,payon_in02.gat,64,60
-payon_in02.gat,10,25,0 warp payonwarp052 2,2,payon_in02.gat,72,67
-payon_in02.gat,35,67,0 warp payonwarp053 2,2,payon_in02.gat,55,67
-payon_in02.gat,50,4,0 warp payonwarp054 3,1,pay_arche.gat,92,166
-payon_in02.gat,52,67,0 warp payonwarp055 2,2,payon_in02.gat,32,67
-payon_in02.gat,61,33,0 warp payonwarp056 2,2,payon_in02.gat,73,33
-payon_in02.gat,64,56,0 warp payonwarp057 2,2,pay_arche.gat,141,161
-payon_in02.gat,70,33,0 warp payonwarp058 2,2,payon_in02.gat,58,33
-payon_in02.gat,75,67,0 warp payonwarp059 2,2,payon_in02.gat,13,25
-payon_in02.gat,82,45,0 warp payonwarp060 2,2,pay_arche.gat,74,153
-
-
-// == Self Made Warps, No Screen Availble ==
-
-// -- Large West House --
-payon.gat,127,204,0 warp payonwarp061 2,2,payon_in03.gat,81,19
-payon_in03.gat,85,19,0 warp payonwarp062 2,2,payon.gat,131,204
-payon_in03.gat,74,18,0 warp payonwarp063 2,2,payon_in03.gat,62,18
-payon_in03.gat,67,18,0 warp payonwarp064 2,2,payon_in03.gat,78,18
-payon_in03.gat,46,18,0 warp payonwarp065 2,2,payon_in03.gat,35,18
-payon_in03.gat,39,18,0 warp payonwarp066 2,2,payon_in03.gat,51,18
-payon_in03.gat,28,18,0 warp payonwarp067 2,2,payon_in03.gat,17,18
-payon_in03.gat,21,18,0 warp payonwarp068 2,2,payon_in03.gat,32,18
-
-// -- Big Kitchen --
-payon.gat,155,327,0 warp payonwarp069 2,2,payon_in03.gat,165,143
-payon_in03.gat,165,140,0 warp payonwarp070 2,2,payon.gat,155,324
-payon_in03.gat,185,178,0 warp payonwarp071 2,2,payon_in03.gat,185,149
-payon_in03.gat,185,153,0 warp payonwarp072 2,2,payon_in03.gat,185,182
-
-// -- Upper Castle --
-payon.gat,107,327,0 warp payonwarp073 2,2,payon_in03.gat,19,64
-payon_in03.gat,19,60,0 warp payonwarp074 2,2,payon.gat,107,323
-payon_in03.gat,19,73,0 warp payonwarp075 2,2,payon_in03.gat,19,90
-payon_in03.gat,19,86,0 warp payonwarp076 2,2,payon_in03.gat,19,69
-payon_in03.gat,19,103,0 warp payonwarp077 2,2,payon_in03.gat,19,122
-payon_in03.gat,19,118,0 warp payonwarp078 2,2,payon_in03.gat,19,99
-payon_in03.gat,11,131,0 warp payonwarp079 2,2,payon_in03.gat,11,146
-payon_in03.gat,11,142,0 warp payonwarp080 2,2,payon_in03.gat,11,127
-payon_in03.gat,27,131,0 warp payonwarp081 2,2,payon_in03.gat,27,146
-payon_in03.gat,27,142,0 warp payonwarp082 2,2,payon_in03.gat,27,127
-payon_in03.gat,11,161,0 warp payonwarp083 2,2,payon_in03.gat,11,176
-payon_in03.gat,11,172,0 warp payonwarp084 2,2,payon_in03.gat,11,157
-payon_in03.gat,27,161,0 warp payonwarp085 2,2,payon_in03.gat,27,176
-payon_in03.gat,27,172,0 warp payonwarp086 2,2,payon_in03.gat,27,157
-
-// -- House --
-payon_in01.gat,86,9,0 warp payonwarp087 2,2,payon.gat,266,152
-payon.gat,270,152,0 warp payonwarp088 2,2,payon_in01.gat,90,9
-payon_in01.gat,107,71,0 warp payonwarp089 2,2,payon_in01.gat,96,37
+//===== eAthena Script =======================================
+//= Payon Warps
+//===== By: ==================================================
+//= Muad Dib (1.0)
+//= Darkchild (1.1)
+//= Nana (1.3)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= Payon warps
+//===== Additional Comments: =================================
+//= Warps Done By Muad Dib, All Credits To Him
+//= 1.2 Removed Duplicated Warp
+//= 1.3 Separated and reorganized field and dungeons
+//= 1.4 Fixed warp payonwarp031 [Yor]
+//= 1.5 Removed Payonwarp006, it was a duplicate [MasterOfMuppets]
+//============================================================
+
+// == Official Warps From kRO Screenshots ==
+
+// -- Entrance / Exit --
+payon.gat,16,142,0 warp payonwarp001 1,1,pay_gld.gat,370,149
+pay_gld.gat,374,149,0 warp payonwarp002 1,1,payon.gat,20,142
+payon.gat,122,27,0 warp payonwarp003 5,3,pay_fild01.gat,333,356
+pay_fild01.gat,333,360,0 warp payonwarp004 5,3,payon.gat,122,31
+payon.gat,267,89,0 warp payonwarp005 2,4,pay_fild08.gat,20,74
+payon.gat,228,330,0 warp payonwarp007 4,2,pay_arche.gat,81,22
+pay_arche.gat,81,18,0 warp payonwarp008 5,2,payon.gat,228,326
+
+// -- Inn --
+payon.gat,223,117,0 warp payonwarp009 2,2,payon_in01.gat,175,11
+payon_in01.gat,172,11,0 warp payonwarp010 2,2,payon.gat,219,117
+payon_in01.gat,180,43,0 warp payonwarp011 2,2,payon_in01.gat,181,73
+payon_in01.gat,181,70,0 warp payonwarp012 2,2,payon_in01.gat,180,40
+payon_in01.gat,193,92,0 warp payonwarp013 2,2,payon_in01.gat,143,61
+payon_in01.gat,146,61,0 warp payonwarp014 2,2,payon_in01.gat,193,89
+payon_in01.gat,133,42,0 warp payonwarp015 2,2,payon_in01.gat,133,18
+payon_in01.gat,133,21,0 warp payonwarp016 2,2,payon_in01.gat,133,45
+
+// -- Sort of Mill --
+payon.gat,140,85,0 warp payonwarp017 2,2,payon_in01.gat,14,51
+payon_in01.gat,17,51,0 warp payonwarp018 2,2,payon.gat,143,85
+payon_in01.gat,10,59,0 warp payonwarp019 2,2,payon_in01.gat,10,83
+payon_in01.gat,10,80,0 warp payonwarp021 2,2,payon_in01.gat,10,56
+payon_in01.gat,10,38,0 warp payonwarp022 2,2,payon_in01.gat,10,14
+payon_in01.gat,10,17,0 warp payonwarp023 2,2,payon_in01.gat,10,41
+
+// -- Weaponshop --
+payon.gat,135,158,0 warp payonwarp024 2,2,payon_in01.gat,20,129
+payon_in01.gat,23,129,0 warp payonwarp025 2,2,payon.gat,138,158
+payon.gat,130,169,0 warp payonwarp026 2,2,payon_in01.gat,13,136
+payon_in01.gat,13,139,0 warp payonwarp027 2,2,payon.gat,130,172
+
+// -- House --
+payon.gat,151,127,0 warp payonwarp028 2,2,payon_in01.gat,56,53
+payon_in01.gat,56,50,0 warp payonwarp029 2,2,payon.gat,151,124
+
+// -- Middle Castle --
+payon.gat,155,248,0 warp payonwarp030 4,1,payon_in03.gat,98,117
+payon_in03.gat,98,114,0 warp payonwarp031 5,1,payon.gat,155,245
+payon_in03.gat,90,124,0 warp payonwarp032 2,2,payon_in03.gat,80,124
+payon_in03.gat,83,124,0 warp payonwarp033 2,2,payon_in03.gat,93,124
+payon_in03.gat,99,133,0 warp payonwarp034 2,2,payon_in03.gat,99,151
+payon_in03.gat,99,148,0 warp payonwarp035 2,2,payon_in03.gat,99,130
+payon_in03.gat,107,124,0 warp payonwarp036 2,2,payon_in03.gat,117,124
+payon_in03.gat,114,124,0 warp payonwarp037 2,2,payon_in03.gat,104,124
+
+// -- Weapon Storage Building --
+payon.gat,189,233,0 warp payonwarp038 2,2,payon_in03.gat,149,39
+payon_in03.gat,146,39,0 warp payonwarp039 2,2,payon.gat,186,233
+payon_in03.gat,158,32,0 warp payonwarp040 2,2,payon_in03.gat,130,14
+payon_in03.gat,130,17,0 warp payonwarp041 2,2,payon_in03.gat,158,35
+payon_in03.gat,172,32,0 warp payonwarp042 2,2,payon_in03.gat,160,14
+payon_in03.gat,160,17,0 warp payonwarp043 2,2,payon_in03.gat,172,35
+payon_in03.gat,186,32,0 warp payonwarp044 2,2,payon_in03.gat,190,13
+payon_in03.gat,190,17,0 warp payonwarp045 2,2,payon_in03.gat,186,35
+
+// -- House --
+payon.gat,256,285,0 warp payonwarp046 2,2,payon_in01.gat,45,11
+payon_in01.gat,42,11,0 warp payonwarp047 2,2,payon.gat,253,285
+
+// -- Old Archer Village Warps --
+pay_arche.gat,36,131,0 warp payonwarp048 2,2,pay_dun00.gat,21,183
+pay_arche.gat,71,156,0 warp payonwarp049 2,2,payon_in02.gat,82,41
+pay_arche.gat,92,170,0 warp payonwarp050 2,2,payon_in02.gat,50,7
+pay_arche.gat,145,165,0 warp payonwarp051 2,2,payon_in02.gat,64,60
+payon_in02.gat,10,25,0 warp payonwarp052 2,2,payon_in02.gat,72,67
+payon_in02.gat,35,67,0 warp payonwarp053 2,2,payon_in02.gat,55,67
+payon_in02.gat,50,4,0 warp payonwarp054 3,1,pay_arche.gat,92,166
+payon_in02.gat,52,67,0 warp payonwarp055 2,2,payon_in02.gat,32,67
+payon_in02.gat,61,33,0 warp payonwarp056 2,2,payon_in02.gat,73,33
+payon_in02.gat,64,56,0 warp payonwarp057 2,2,pay_arche.gat,141,161
+payon_in02.gat,70,33,0 warp payonwarp058 2,2,payon_in02.gat,58,33
+payon_in02.gat,75,67,0 warp payonwarp059 2,2,payon_in02.gat,13,25
+payon_in02.gat,82,45,0 warp payonwarp060 2,2,pay_arche.gat,74,153
+
+
+// == Self Made Warps, No Screen Availble ==
+
+// -- Large West House --
+payon.gat,127,204,0 warp payonwarp061 2,2,payon_in03.gat,81,19
+payon_in03.gat,85,19,0 warp payonwarp062 2,2,payon.gat,131,204
+payon_in03.gat,74,18,0 warp payonwarp063 2,2,payon_in03.gat,62,18
+payon_in03.gat,67,18,0 warp payonwarp064 2,2,payon_in03.gat,78,18
+payon_in03.gat,46,18,0 warp payonwarp065 2,2,payon_in03.gat,35,18
+payon_in03.gat,39,18,0 warp payonwarp066 2,2,payon_in03.gat,51,18
+payon_in03.gat,28,18,0 warp payonwarp067 2,2,payon_in03.gat,17,18
+payon_in03.gat,21,18,0 warp payonwarp068 2,2,payon_in03.gat,32,18
+
+// -- Big Kitchen --
+payon.gat,155,327,0 warp payonwarp069 2,2,payon_in03.gat,165,143
+payon_in03.gat,165,140,0 warp payonwarp070 2,2,payon.gat,155,324
+payon_in03.gat,185,178,0 warp payonwarp071 2,2,payon_in03.gat,185,149
+payon_in03.gat,185,153,0 warp payonwarp072 2,2,payon_in03.gat,185,182
+
+// -- Upper Castle --
+payon.gat,107,327,0 warp payonwarp073 2,2,payon_in03.gat,19,64
+payon_in03.gat,19,60,0 warp payonwarp074 2,2,payon.gat,107,323
+payon_in03.gat,19,73,0 warp payonwarp075 2,2,payon_in03.gat,19,90
+payon_in03.gat,19,86,0 warp payonwarp076 2,2,payon_in03.gat,19,69
+payon_in03.gat,19,103,0 warp payonwarp077 2,2,payon_in03.gat,19,122
+payon_in03.gat,19,118,0 warp payonwarp078 2,2,payon_in03.gat,19,99
+payon_in03.gat,11,131,0 warp payonwarp079 2,2,payon_in03.gat,11,146
+payon_in03.gat,11,142,0 warp payonwarp080 2,2,payon_in03.gat,11,127
+payon_in03.gat,27,131,0 warp payonwarp081 2,2,payon_in03.gat,27,146
+payon_in03.gat,27,142,0 warp payonwarp082 2,2,payon_in03.gat,27,127
+payon_in03.gat,11,161,0 warp payonwarp083 2,2,payon_in03.gat,11,176
+payon_in03.gat,11,172,0 warp payonwarp084 2,2,payon_in03.gat,11,157
+payon_in03.gat,27,161,0 warp payonwarp085 2,2,payon_in03.gat,27,176
+payon_in03.gat,27,172,0 warp payonwarp086 2,2,payon_in03.gat,27,157
+
+// -- House --
+payon_in01.gat,86,9,0 warp payonwarp087 2,2,payon.gat,266,152
+payon.gat,270,152,0 warp payonwarp088 2,2,payon_in01.gat,90,9
+payon_in01.gat,107,71,0 warp payonwarp089 2,2,payon_in01.gat,96,37
payon_in01.gat,93,37,0 warp payonwarp090 2,2,payon_in01.gat,104,71 \ No newline at end of file
diff --git a/npc/warps/cities/prontera.txt b/npc/warps/cities/prontera.txt
index 9ac0d5d1e..d3ef1aa6b 100644
--- a/npc/warps/cities/prontera.txt
+++ b/npc/warps/cities/prontera.txt
@@ -1,105 +1,105 @@
-//===== Athena Script ========================================
-//= Prontera Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.2)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera
-//===== Additional Comments: =================================
-//= 1.3 prt19 warp fix [shadow]
-//= 1.4 Added warps for the sign quest [MasterOfMuppets]
-//============================================================
-
-//= Prontera City ============================================
-prontera.gat,107,215,0 warp prt01 2,2,prt_in.gat,240,139
-prontera.gat,120,267,0 warp prt02 2,2,prt_in.gat,180,97
-prontera.gat,133,183,0 warp prt03 2,2,prt_in.gat,50,105
-prontera.gat,134,221,0 warp prt04 1,1,prt_in.gat,131,71
-prontera.gat,156,22,0 warp prt001 3,2,prt_fild08.gat,170,375
-prontera.gat,156,360,0 warp prt005 4,2,prt_castle.gat,102,20
-prontera.gat,177,221,0 warp prt05 2,2,prt_in.gat,168,128
-prontera.gat,179,184,0 warp prt06 2,2,prt_in.gat,60,73
-prontera.gat,192,267,0 warp prt07 2,2,prt_in.gat,178,55
-prontera.gat,204,192,0 warp prt08 2,2,prt_in.gat,68,134
-prontera.gat,208,154,0 warp prt09 2,2,prt_in.gat,172,29
-prontera.gat,22,203,0 warp prt002 2,3,prt_fild05.gat,367,205
-prontera.gat,237,317,0 warp prt004 2,2,prt_church.gat,100,60
-prontera.gat,289,203,0 warp prt003 2,3,prt_fild06.gat,27,193
-prontera.gat,42,67,0 warp prt10 2,2,prt_in.gat,44,29
-prontera.gat,45,346,0 warp prt11 2,2,prt_in.gat,80,110
-prontera.gat,73,100,0 warp prt12 1,1,prt_in.gat,208,176
-prontera.gat,74,90,0 warp prt13 2,2,prt_in.gat,248,170
-prontera.gat,84,89,0 warp prt14-1 1,1,prt_in.gat,282,176
-prontera.gat,263,279,0 warp prt15-2 2,2,prt_in.gat,227,18
-prt_in.gat,135,71,0 warp prt04-1 1,2,prontera.gat,136,219
-prt_in.gat,168,124,0 warp prt05-1 2,1,prontera.gat,174,218
-prt_in.gat,172,33,0 warp prt09-1 2,1,prontera.gat,205,157
-prt_in.gat,181,55,0 warp prt07-1 1,2,prontera.gat,192,264
-prt_in.gat,183,97,0 warp prt02-1 1,2,prontera.gat,120,264
-prt_in.gat,208,179,0 warp prt12-1 3,1,prontera.gat,76,102
-prt_in.gat,217,163,0 warp prt15 1,3,prt_in.gat,236,163
-prt_in.gat,234,163,0 warp prt15-1 1,3,prt_in.gat,215,163
-prt_in.gat,240,141,0 warp prt01-1 3,1,prontera.gat,107,218
-prt_in.gat,248,173,0 warp prt13-1 3,2,prontera.gat,77,93
-prt_in.gat,254,113,0 warp prt16 3,2,prt_in.gat,256,134
-prt_in.gat,256,131,0 warp prt16-1 2,2,prt_in.gat,254,110
-prt_in.gat,263,163,0 warp prt17 1,3,prt_in.gat,276,163
-prt_in.gat,274,163,0 warp prt17-1 1,3,prt_in.gat,261,163
-prt_in.gat,280,68,0 warp w472 6,6,prontera.gat,147,287
-prt_in.gat,281,36,0 warp w473 6,6,prontera.gat,147,287
-prt_in.gat,282,100,0 warp w471 6,6,prontera.gat,147,287
-prt_in.gat,282,179,0 warp prt14 3,1,prontera.gat,87,91
-prt_in.gat,285,130,0 warp w470 6,6,prontera.gat,147,287
-prt_in.gat,37,65,0 warp prt18 1,3,prt_in.gat,51,65
-prt_in.gat,47,29,0 warp prt10-1 2,1,prontera.gat,46,67
-prt_in.gat,48,65,0 warp prt18-1 1,3,prt_in.gat,34,65
-prt_in.gat,53,105,0 warp prt03-1 1,2,prontera.gat,136,186
-prt_in.gat,60,77,0 warp prt06-1 2,1,prontera.gat,175,188
-prt_in.gat,68,130,0 warp prt08-1 2,1,prontera.gat,204,188
-prt_in.gat,69,65,0 warp prt19 1,3,prt_in.gat,84,65
-prt_in.gat,70,143,0 warp prt20 2,1,prt_in.gat,70,165
-prt_in.gat,70,162,0 warp prt20-1 2,1,prt_in.gat,70,140
-prt_in.gat,80,113,0 warp prt11-1 2,1,prontera.gat,48,343
-prt_in.gat,82,65,0 warp prt19 1,3,prt_in.gat,66,65
-prt_in.gat,227,15,0 warp prt20-2 2,2,prontera.gat,263,275
-
-//= Prontera Church ==========================================
-prt_church.gat,100,56,0 warp prtch001 7,1,prontera.gat,234,314
-prt_church.gat,109,81,0 warp prtch01 1,2,prt_church.gat,172,19
-prt_church.gat,168,19,0 warp prtch01-1 1,2,prt_church.gat,105,81
-prt_church.gat,31,19,0 warp prtch02 1,2,prt_church.gat,94,81
-prt_church.gat,90,81,0 warp prtch02-1 1,2,prt_church.gat,27,19
-
-
-
-//= Prontera Castle ===========================================
-prt_castle.gat,102,129,0 warp prtca01 3,2,prt_castle.gat,102,143
-prt_castle.gat,102,140,0 warp prtca01-1 3,2,prt_castle.gat,102,126
-prt_castle.gat,102,16,0 warp prtca001 6,2,prontera.gat,156,356
-prt_castle.gat,102,181,0 warp prtca002 6,2,prt_gld.gat,159,28
-prt_castle.gat,102,73,0 warp prtca02 3,2,prt_castle.gat,102,91
-prt_castle.gat,102,88,0 warp prtca02-1 3,2,prt_castle.gat,102,70
-prt_castle.gat,113,107,0 warp prtca03 2,3,prt_castle.gat,134,107
-prt_castle.gat,121,29,0 warp prtca04 1,1,prt_castle.gat,148,29
-prt_castle.gat,130,107,0 warp prtca03-1 2,3,prt_castle.gat,110,107
-prt_castle.gat,135,153,0 warp prtca05 1,1,prt_castle.gat,167,145
-prt_castle.gat,144,29,0 warp prtca04-1 2,2,prt_castle.gat,117,29
-prt_castle.gat,149,113,0 warp prtca06 1,1,prt_castle.gat,175,113
-prt_castle.gat,164,145,0 warp prtca05-1 1,1,prt_castle.gat,132,153
-prt_castle.gat,170,138,0 warp prtca07 3,2,prt_castle.gat,176,118
-prt_castle.gat,172,113,0 warp prtca06-1 1,1,prt_castle.gat,146,113
-prt_castle.gat,176,121,0 warp prtca07-1 3,2,prt_castle.gat,170,141
-prt_castle.gat,28,121,0 warp prtca08 2,2,prt_castle.gat,40,141
-prt_castle.gat,31,113,0 warp prtca09 1,1,prt_castle.gat,58,113
-prt_castle.gat,40,138,0 warp prtca08-1 3,2,prt_castle.gat,28,118
-prt_castle.gat,45,145,0 warp prtca10 1,1,prt_castle.gat,72,153
-prt_castle.gat,54,113,0 warp prtca09-1 1,1,prt_castle.gat,27,113
-prt_castle.gat,59,29,0 warp prtca11 2,2,prt_castle.gat,85,29
-prt_castle.gat,68,153,0 warp prtca10-1 1,1,prt_castle.gat,42,145
-prt_castle.gat,75,107,0 warp prtca12 2,3,prt_castle.gat,95,107
-prt_castle.gat,82,29,0 warp prtca11-1 1,1,prt_castle.gat,56,29
+//===== Athena Script ========================================
+//= Prontera Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.2)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera
+//===== Additional Comments: =================================
+//= 1.3 prt19 warp fix [shadow]
+//= 1.4 Added warps for the sign quest [MasterOfMuppets]
+//============================================================
+
+//= Prontera City ============================================
+prontera.gat,107,215,0 warp prt01 2,2,prt_in.gat,240,139
+prontera.gat,120,267,0 warp prt02 2,2,prt_in.gat,180,97
+prontera.gat,133,183,0 warp prt03 2,2,prt_in.gat,50,105
+prontera.gat,134,221,0 warp prt04 1,1,prt_in.gat,131,71
+prontera.gat,156,22,0 warp prt001 3,2,prt_fild08.gat,170,375
+prontera.gat,156,360,0 warp prt005 4,2,prt_castle.gat,102,20
+prontera.gat,177,221,0 warp prt05 2,2,prt_in.gat,168,128
+prontera.gat,179,184,0 warp prt06 2,2,prt_in.gat,60,73
+prontera.gat,192,267,0 warp prt07 2,2,prt_in.gat,178,55
+prontera.gat,204,192,0 warp prt08 2,2,prt_in.gat,68,134
+prontera.gat,208,154,0 warp prt09 2,2,prt_in.gat,172,29
+prontera.gat,22,203,0 warp prt002 2,3,prt_fild05.gat,367,205
+prontera.gat,237,317,0 warp prt004 2,2,prt_church.gat,100,60
+prontera.gat,289,203,0 warp prt003 2,3,prt_fild06.gat,27,193
+prontera.gat,42,67,0 warp prt10 2,2,prt_in.gat,44,29
+prontera.gat,45,346,0 warp prt11 2,2,prt_in.gat,80,110
+prontera.gat,73,100,0 warp prt12 1,1,prt_in.gat,208,176
+prontera.gat,74,90,0 warp prt13 2,2,prt_in.gat,248,170
+prontera.gat,84,89,0 warp prt14-1 1,1,prt_in.gat,282,176
+prontera.gat,263,279,0 warp prt15-2 2,2,prt_in.gat,227,18
+prt_in.gat,135,71,0 warp prt04-1 1,2,prontera.gat,136,219
+prt_in.gat,168,124,0 warp prt05-1 2,1,prontera.gat,174,218
+prt_in.gat,172,33,0 warp prt09-1 2,1,prontera.gat,205,157
+prt_in.gat,181,55,0 warp prt07-1 1,2,prontera.gat,192,264
+prt_in.gat,183,97,0 warp prt02-1 1,2,prontera.gat,120,264
+prt_in.gat,208,179,0 warp prt12-1 3,1,prontera.gat,76,102
+prt_in.gat,217,163,0 warp prt15 1,3,prt_in.gat,236,163
+prt_in.gat,234,163,0 warp prt15-1 1,3,prt_in.gat,215,163
+prt_in.gat,240,141,0 warp prt01-1 3,1,prontera.gat,107,218
+prt_in.gat,248,173,0 warp prt13-1 3,2,prontera.gat,77,93
+prt_in.gat,254,113,0 warp prt16 3,2,prt_in.gat,256,134
+prt_in.gat,256,131,0 warp prt16-1 2,2,prt_in.gat,254,110
+prt_in.gat,263,163,0 warp prt17 1,3,prt_in.gat,276,163
+prt_in.gat,274,163,0 warp prt17-1 1,3,prt_in.gat,261,163
+prt_in.gat,280,68,0 warp w472 6,6,prontera.gat,147,287
+prt_in.gat,281,36,0 warp w473 6,6,prontera.gat,147,287
+prt_in.gat,282,100,0 warp w471 6,6,prontera.gat,147,287
+prt_in.gat,282,179,0 warp prt14 3,1,prontera.gat,87,91
+prt_in.gat,285,130,0 warp w470 6,6,prontera.gat,147,287
+prt_in.gat,37,65,0 warp prt18 1,3,prt_in.gat,51,65
+prt_in.gat,47,29,0 warp prt10-1 2,1,prontera.gat,46,67
+prt_in.gat,48,65,0 warp prt18-1 1,3,prt_in.gat,34,65
+prt_in.gat,53,105,0 warp prt03-1 1,2,prontera.gat,136,186
+prt_in.gat,60,77,0 warp prt06-1 2,1,prontera.gat,175,188
+prt_in.gat,68,130,0 warp prt08-1 2,1,prontera.gat,204,188
+prt_in.gat,69,65,0 warp prt19 1,3,prt_in.gat,84,65
+prt_in.gat,70,143,0 warp prt20 2,1,prt_in.gat,70,165
+prt_in.gat,70,162,0 warp prt20-1 2,1,prt_in.gat,70,140
+prt_in.gat,80,113,0 warp prt11-1 2,1,prontera.gat,48,343
+prt_in.gat,82,65,0 warp prt19 1,3,prt_in.gat,66,65
+prt_in.gat,227,15,0 warp prt20-2 2,2,prontera.gat,263,275
+
+//= Prontera Church ==========================================
+prt_church.gat,100,56,0 warp prtch001 7,1,prontera.gat,234,314
+prt_church.gat,109,81,0 warp prtch01 1,2,prt_church.gat,172,19
+prt_church.gat,168,19,0 warp prtch01-1 1,2,prt_church.gat,105,81
+prt_church.gat,31,19,0 warp prtch02 1,2,prt_church.gat,94,81
+prt_church.gat,90,81,0 warp prtch02-1 1,2,prt_church.gat,27,19
+
+
+
+//= Prontera Castle ===========================================
+prt_castle.gat,102,129,0 warp prtca01 3,2,prt_castle.gat,102,143
+prt_castle.gat,102,140,0 warp prtca01-1 3,2,prt_castle.gat,102,126
+prt_castle.gat,102,16,0 warp prtca001 6,2,prontera.gat,156,356
+prt_castle.gat,102,181,0 warp prtca002 6,2,prt_gld.gat,159,28
+prt_castle.gat,102,73,0 warp prtca02 3,2,prt_castle.gat,102,91
+prt_castle.gat,102,88,0 warp prtca02-1 3,2,prt_castle.gat,102,70
+prt_castle.gat,113,107,0 warp prtca03 2,3,prt_castle.gat,134,107
+prt_castle.gat,121,29,0 warp prtca04 1,1,prt_castle.gat,148,29
+prt_castle.gat,130,107,0 warp prtca03-1 2,3,prt_castle.gat,110,107
+prt_castle.gat,135,153,0 warp prtca05 1,1,prt_castle.gat,167,145
+prt_castle.gat,144,29,0 warp prtca04-1 2,2,prt_castle.gat,117,29
+prt_castle.gat,149,113,0 warp prtca06 1,1,prt_castle.gat,175,113
+prt_castle.gat,164,145,0 warp prtca05-1 1,1,prt_castle.gat,132,153
+prt_castle.gat,170,138,0 warp prtca07 3,2,prt_castle.gat,176,118
+prt_castle.gat,172,113,0 warp prtca06-1 1,1,prt_castle.gat,146,113
+prt_castle.gat,176,121,0 warp prtca07-1 3,2,prt_castle.gat,170,141
+prt_castle.gat,28,121,0 warp prtca08 2,2,prt_castle.gat,40,141
+prt_castle.gat,31,113,0 warp prtca09 1,1,prt_castle.gat,58,113
+prt_castle.gat,40,138,0 warp prtca08-1 3,2,prt_castle.gat,28,118
+prt_castle.gat,45,145,0 warp prtca10 1,1,prt_castle.gat,72,153
+prt_castle.gat,54,113,0 warp prtca09-1 1,1,prt_castle.gat,27,113
+prt_castle.gat,59,29,0 warp prtca11 2,2,prt_castle.gat,85,29
+prt_castle.gat,68,153,0 warp prtca10-1 1,1,prt_castle.gat,42,145
+prt_castle.gat,75,107,0 warp prtca12 2,3,prt_castle.gat,95,107
+prt_castle.gat,82,29,0 warp prtca11-1 1,1,prt_castle.gat,56,29
prt_castle.gat,92,107,0 warp prtca12-1 2,3,prt_castle.gat,72,107 \ No newline at end of file
diff --git a/npc/warps/cities/rachel.txt b/npc/warps/cities/rachel.txt
index 36852166c..1f6722d5c 100644
--- a/npc/warps/cities/rachel.txt
+++ b/npc/warps/cities/rachel.txt
@@ -1,123 +1,123 @@
-//===== Athena Script ========================================
-//= Rachel Warp Script
-//===== By: ==================================================
-//= erKURITA & RockmanEXE
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Rachel City, shops & other locations
-//===== Additional Comments: =================================
-//= 1.0 Added the official warps and commented out the
-//= "custom duplicates" for future checkout. Special thanks
-//= to RockmanEXE who provided all the info. [erKURITA]
-//============================================================
-
-//| Official warps under this comment. Needs separation though...
-//| There are a few warps missing that will be done soon.
-
-ra_in01.gat,172,392,0 warp rachel01 1,1,rachel.gat,42,114
-rachel.gat,42,87,0 warp rachel02 1,1,ra_in01.gat,171,359
-rachel.gat,42,109,0 warp rachel03 1,1,ra_in01.gat,171,389
-ra_in01.gat,171,355,0 warp rachel04 1,1,rachel.gat,42,82
-rachel.gat,83,78,0 warp rachel05 1,1,ra_in01.gat,249,266
-ra_in01.gat,249,262,0 warp rachel05 1,1,rachel.gat,83,75
-rachel.gat,115,149,0 warp rachel06 1,1,ra_in01.gat,386,43
-ra_in01.gat,386,40,0 warp rachel07 1,1,rachel.gat,115,144
-ra_in01.gat,165,369,0 warp rachel10 1,1,ra_in01.gat,122,334
-ra_in01.gat,126,334,0 warp rachel11 1,1,ra_in01.gat,169,369
-ra_in01.gat,178,370,0 warp rachel12 1,1,ra_in01.gat,113,385
-ra_in01.gat,109,385,0 warp rachel13 1,1,ra_in01.gat,174,370
-ra_in01.gat,357,61,0 warp rachel15 1,1,ra_in01.gat,310,62
-ra_in01.gat,314,62,0 warp rachel16 1,1,ra_in01.gat,361,61
-ra_in01.gat,309,70,0 warp rachel17 1,1,rachel.gat,108,175
-rachel.gat,105,171,0 warp rachel18 1,1,ra_in01.gat,309,65
-ra_in01.gat,297,59,0 warp rachel19 1,1,ra_in01.gat,339,116
-ra_in01.gat,339,120,0 warp rachel20 1,1,ra_in01.gat,297,63
-ra_in01.gat,375,109,0 warp rachel21 1,1,rachel.gat,116,154
-rachel.gat,116,158,0 warp rachel22 1,1,ra_in01.gat,375,114
-ra_in01.gat,135,286,0 warp rachel22 1,1,rachel.gat,216,164
-rachel.gat,216,160,0 warp rachel23 1,1,ra_in01.gat,135,282
-ra_in01.gat,213,79,0 warp rachel24 1,1,rachel.gat,108,195
-rachel.gat,108,200,0 warp rachel25 1,1,ra_in01.gat,213,83
-ra_in01.gat,192,152,0 warp rachel26 1,1,rachel.gat,90,193
-rachel.gat,90,189,0 warp rachel27 1,1,ra_in01.gat,192,148
-rachel.gat,25,125,0 warp rachel28 1,1,ra_fild11.gat,353,226
-rachel.gat,273,125,0 warp rachel29 1,1,ra_fild12.gat,41,225
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//~~~~~~~~~~~~~~~~~~~ Custom warps starts here ~~~~~~~~~~~~~~~~~~~
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-//Rachel Sanctuary Sky Map
-ra_temsky.gat,99,117,0 warp rasky001 1,1,ra_temsky.gat,99,140
-ra_temsky.gat,99,135,0 warp rasky002 1,1,ra_temsky.gat,99,112
-ra_temsky.gat,112,143,0 warp rasky003 1,1,ra_temsky.gat,141,139
-ra_temsky.gat,137,139,0 warp rasky004 1,1,ra_temsky.gat,108,143
-ra_temsky.gat,87,143,0 warp rasky005 1,1,ra_temsky.gat,58,139
-ra_temsky.gat,62,139,0 warp rasky004 1,1,ra_temsky.gat,91,143
-
-//Rachel Temple
-ra_temple.gat,119,21,0 warp rachel002 1,1,rachel.gat,149,244
-ra_temple.gat,119,181,0 warp rachel003 1,1,ra_temin.gat,169,22
-ra_temin.gat,169,17,0 warp rachel004 1,1,ra_temple.gat,119,176
-ra_temin.gat,206,93,0 warp rachel005 1,1,ra_temin.gat,312,257
-ra_temin.gat,312,252,0 warp rachel006 1,1,ra_temin.gat,206,88
-ra_temin.gat,130,93,0 warp rachel007 1,1,ra_temin.gat,238,257
-ra_temin.gat,238,252,0 warp rachel008 1,1,ra_temin.gat,130,88
-
-ra_temin.gat,276,326,0 script Statue#Rachel 111,{
- mes "Welcome to the temporary Rachel";
- mes "Sanctuary entrance npc!";
- mes "Isn't it great?";
- next;
- mes "Do you want to enter Rachel Sanctuary?";
- next;
- if(select("Yes", "No") == 1){
- close2;
- warp "ra_san01",139,14;
- end;
- }
- close;
-}
-
-//== WEAPON SHOP ==========================
-//rachel.gat,42,108,0 warp ra_in001 2,2,ra_in01.gat,171,389
-//ra_in01.gat,171,393,0 warp ra_in001a 2,2,rachel.gat,41,112
-//rachel.gat,42,88,0 warp ra_in002 2,2,ra_in01.gat,171,358
-//ra_in01.gat,171,354,0 warp ra_in002a 2,2,rachel.gat,42,84
-//ra_in01.gat,179,370,0 warp ra_in003 2,2,ra_in01.gat,112,385
-//ra_in01.gat,108,385,0 warp ra_in003a 2,2,ra_in01.gat,175,370
-//ra_in01.gat,164,370,0 warp ra_in004 2,2,ra_in01.gat,123,334
-//ra_in01.gat,127,334,0 warp ra_in004a 2,2,ra_in01.gat,168,370
-
-//== ITEM SHOP ============================
-//rachel.gat,83,179,0 warp ra_in005 2,2,ra_in01.gat,249,264
-//ra_in01.gat,249,260,0 warp ra_in005a 2,2,rachel.gat,83,74
-//ra_in01.gat,240,300,0 warp ra_in006 2,2,ra_in01.gat,191,312
-//ra_in01.gat,195,312,0 warp ra_in006a 2,2,ra_in01.gat,244,300
-
-//== INN ==================================
-//rachel.gat,115,149,0 warp ra_in007 2,2,ra_in01.gat,386,42
-//ra_in01.gat,386,38,0 warp ra_in007a 2,2,rachel.gat,115,145
-//rachel.gat,116,158,0 warp ra_in008 2,2,ra_in01.gat,375,111
-//ra_in01.gat,375,108,0 warp ra_in008a 2,2,rachel.gat,116,155
-//rachel.gat,105,170,0 warp ra_in009 2,2,ra_in01.gat,310,67
-//ra_in01.gat,310,71,0 warp ra_in009a 2,2,rachel.gat,105,175
-//ra_in01.gat,356,61,0 warp ra_in010 2,2,ra_in01.gat,311,62
-//ra_in01.gat,315,62,0 warp ra_in010a 2,2,ra_in01.gat,360,61
-//ra_in01.gat,297,58,0 warp ra_in011 2,2,ra_in01.gat,340,117
-//ra_in01.gat,338,120,0 warp ra_in011a 2,2,ra_in01.gat,297,62
-
-
-//== HOUSES ===============================
-rachel.gat,57,259,0 warp ra_in012 2,2,ra_in01.gat,295,350
-ra_in01.gat,295,346,0 warp ra_in012a 2,2,rachel.gat,57,254
-ra_in01.gat,293,372,0 warp ra_in013 2,2,ra_in01.gat,225,379
-ra_in01.gat,220,379,0 warp ra_in013a 2,2,ra_in01.gat,289,372
-ra_in01.gat,313,374,0 warp ra_in014 2,2,ra_in01.gat,358,373
-ra_in01.gat,354,373,0 warp ra_in014a 2,2,ra_in01.gat,308,374
-
-//Entrance to the Temple
+//===== Athena Script ========================================
+//= Rachel Warp Script
+//===== By: ==================================================
+//= erKURITA & RockmanEXE
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Rachel City, shops & other locations
+//===== Additional Comments: =================================
+//= 1.0 Added the official warps and commented out the
+//= "custom duplicates" for future checkout. Special thanks
+//= to RockmanEXE who provided all the info. [erKURITA]
+//============================================================
+
+//| Official warps under this comment. Needs separation though...
+//| There are a few warps missing that will be done soon.
+
+ra_in01.gat,172,392,0 warp rachel01 1,1,rachel.gat,42,114
+rachel.gat,42,87,0 warp rachel02 1,1,ra_in01.gat,171,359
+rachel.gat,42,109,0 warp rachel03 1,1,ra_in01.gat,171,389
+ra_in01.gat,171,355,0 warp rachel04 1,1,rachel.gat,42,82
+rachel.gat,83,78,0 warp rachel05 1,1,ra_in01.gat,249,266
+ra_in01.gat,249,262,0 warp rachel05 1,1,rachel.gat,83,75
+rachel.gat,115,149,0 warp rachel06 1,1,ra_in01.gat,386,43
+ra_in01.gat,386,40,0 warp rachel07 1,1,rachel.gat,115,144
+ra_in01.gat,165,369,0 warp rachel10 1,1,ra_in01.gat,122,334
+ra_in01.gat,126,334,0 warp rachel11 1,1,ra_in01.gat,169,369
+ra_in01.gat,178,370,0 warp rachel12 1,1,ra_in01.gat,113,385
+ra_in01.gat,109,385,0 warp rachel13 1,1,ra_in01.gat,174,370
+ra_in01.gat,357,61,0 warp rachel15 1,1,ra_in01.gat,310,62
+ra_in01.gat,314,62,0 warp rachel16 1,1,ra_in01.gat,361,61
+ra_in01.gat,309,70,0 warp rachel17 1,1,rachel.gat,108,175
+rachel.gat,105,171,0 warp rachel18 1,1,ra_in01.gat,309,65
+ra_in01.gat,297,59,0 warp rachel19 1,1,ra_in01.gat,339,116
+ra_in01.gat,339,120,0 warp rachel20 1,1,ra_in01.gat,297,63
+ra_in01.gat,375,109,0 warp rachel21 1,1,rachel.gat,116,154
+rachel.gat,116,158,0 warp rachel22 1,1,ra_in01.gat,375,114
+ra_in01.gat,135,286,0 warp rachel22 1,1,rachel.gat,216,164
+rachel.gat,216,160,0 warp rachel23 1,1,ra_in01.gat,135,282
+ra_in01.gat,213,79,0 warp rachel24 1,1,rachel.gat,108,195
+rachel.gat,108,200,0 warp rachel25 1,1,ra_in01.gat,213,83
+ra_in01.gat,192,152,0 warp rachel26 1,1,rachel.gat,90,193
+rachel.gat,90,189,0 warp rachel27 1,1,ra_in01.gat,192,148
+rachel.gat,25,125,0 warp rachel28 1,1,ra_fild11.gat,353,226
+rachel.gat,273,125,0 warp rachel29 1,1,ra_fild12.gat,41,225
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//~~~~~~~~~~~~~~~~~~~ Custom warps starts here ~~~~~~~~~~~~~~~~~~~
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+//Rachel Sanctuary Sky Map
+ra_temsky.gat,99,117,0 warp rasky001 1,1,ra_temsky.gat,99,140
+ra_temsky.gat,99,135,0 warp rasky002 1,1,ra_temsky.gat,99,112
+ra_temsky.gat,112,143,0 warp rasky003 1,1,ra_temsky.gat,141,139
+ra_temsky.gat,137,139,0 warp rasky004 1,1,ra_temsky.gat,108,143
+ra_temsky.gat,87,143,0 warp rasky005 1,1,ra_temsky.gat,58,139
+ra_temsky.gat,62,139,0 warp rasky004 1,1,ra_temsky.gat,91,143
+
+//Rachel Temple
+ra_temple.gat,119,21,0 warp rachel002 1,1,rachel.gat,149,244
+ra_temple.gat,119,181,0 warp rachel003 1,1,ra_temin.gat,169,22
+ra_temin.gat,169,17,0 warp rachel004 1,1,ra_temple.gat,119,176
+ra_temin.gat,206,93,0 warp rachel005 1,1,ra_temin.gat,312,257
+ra_temin.gat,312,252,0 warp rachel006 1,1,ra_temin.gat,206,88
+ra_temin.gat,130,93,0 warp rachel007 1,1,ra_temin.gat,238,257
+ra_temin.gat,238,252,0 warp rachel008 1,1,ra_temin.gat,130,88
+
+ra_temin.gat,276,326,0 script Statue#Rachel 111,{
+ mes "Welcome to the temporary Rachel";
+ mes "Sanctuary entrance npc!";
+ mes "Isn't it great?";
+ next;
+ mes "Do you want to enter Rachel Sanctuary?";
+ next;
+ if(select("Yes", "No") == 1){
+ close2;
+ warp "ra_san01",139,14;
+ end;
+ }
+ close;
+}
+
+//== WEAPON SHOP ==========================
+//rachel.gat,42,108,0 warp ra_in001 2,2,ra_in01.gat,171,389
+//ra_in01.gat,171,393,0 warp ra_in001a 2,2,rachel.gat,41,112
+//rachel.gat,42,88,0 warp ra_in002 2,2,ra_in01.gat,171,358
+//ra_in01.gat,171,354,0 warp ra_in002a 2,2,rachel.gat,42,84
+//ra_in01.gat,179,370,0 warp ra_in003 2,2,ra_in01.gat,112,385
+//ra_in01.gat,108,385,0 warp ra_in003a 2,2,ra_in01.gat,175,370
+//ra_in01.gat,164,370,0 warp ra_in004 2,2,ra_in01.gat,123,334
+//ra_in01.gat,127,334,0 warp ra_in004a 2,2,ra_in01.gat,168,370
+
+//== ITEM SHOP ============================
+//rachel.gat,83,179,0 warp ra_in005 2,2,ra_in01.gat,249,264
+//ra_in01.gat,249,260,0 warp ra_in005a 2,2,rachel.gat,83,74
+//ra_in01.gat,240,300,0 warp ra_in006 2,2,ra_in01.gat,191,312
+//ra_in01.gat,195,312,0 warp ra_in006a 2,2,ra_in01.gat,244,300
+
+//== INN ==================================
+//rachel.gat,115,149,0 warp ra_in007 2,2,ra_in01.gat,386,42
+//ra_in01.gat,386,38,0 warp ra_in007a 2,2,rachel.gat,115,145
+//rachel.gat,116,158,0 warp ra_in008 2,2,ra_in01.gat,375,111
+//ra_in01.gat,375,108,0 warp ra_in008a 2,2,rachel.gat,116,155
+//rachel.gat,105,170,0 warp ra_in009 2,2,ra_in01.gat,310,67
+//ra_in01.gat,310,71,0 warp ra_in009a 2,2,rachel.gat,105,175
+//ra_in01.gat,356,61,0 warp ra_in010 2,2,ra_in01.gat,311,62
+//ra_in01.gat,315,62,0 warp ra_in010a 2,2,ra_in01.gat,360,61
+//ra_in01.gat,297,58,0 warp ra_in011 2,2,ra_in01.gat,340,117
+//ra_in01.gat,338,120,0 warp ra_in011a 2,2,ra_in01.gat,297,62
+
+
+//== HOUSES ===============================
+rachel.gat,57,259,0 warp ra_in012 2,2,ra_in01.gat,295,350
+ra_in01.gat,295,346,0 warp ra_in012a 2,2,rachel.gat,57,254
+ra_in01.gat,293,372,0 warp ra_in013 2,2,ra_in01.gat,225,379
+ra_in01.gat,220,379,0 warp ra_in013a 2,2,ra_in01.gat,289,372
+ra_in01.gat,313,374,0 warp ra_in014 2,2,ra_in01.gat,358,373
+ra_in01.gat,354,373,0 warp ra_in014a 2,2,ra_in01.gat,308,374
+
+//Entrance to the Temple
rachel.gat,149,249,0 warp rachel001 1,1,ra_temple.gat,119,28 \ No newline at end of file
diff --git a/npc/warps/cities/umbala.txt b/npc/warps/cities/umbala.txt
index 649bf362a..99e77b75d 100644
--- a/npc/warps/cities/umbala.txt
+++ b/npc/warps/cities/umbala.txt
@@ -1,45 +1,45 @@
-//===== Athena Script ========================================
-//= Umbala Warp Script
-//===== By: ==================================================
-//= Darkchild (1.0v A)
-//= Athena (1.0v B)
-//= 1.1 (Akaru)
-//= Nana (1.2)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Umbala
-//===== Additional Comments: =================================
-//= No Comment
-//============================================================
-
-//Witch House
-//Entrance via the Skeleton Gate Quest
-//umbala.gat,220,190,0 warp umba0027 1,1,um_in.gat,32,70
-um_in.gat,28,70,0 warp umba0028 1,1,umbala.gat,217,187
-
-//Weapons
-umbala.gat,125,157,0 warp umba0029 1,1,um_in.gat,155,114
-um_in.gat,155,110,0 warp umba0030 1,1,umbala.gat,126,152
-
-//Fan Shack
-umbala.gat,138,129,0 warp umba0031 1,1,um_in.gat,99,114
-um_in.gat,99,110,0 warp umba0032 1,1,umbala.gat,136,127
-
-//Lower Double Shack
-umbala.gat,95,186,0 warp umba0033 1,1,um_in.gat,142,42
-um_in.gat,141,39,0 warp umba0034 1,1,umbala.gat,95,183
-
-//Upper Double Shack
-umbala.gat,100,202,0 warp umba0035 1,1,um_in.gat,163,70
-um_in.gat,166,70,0 warp umba0036 1,1,umbala.gat,102,204
-
-//Small Shack
-umbala.gat,156,249,0 warp umba0037 1,1,um_in.gat,99,67
-um_in.gat,99,63,0 warp umba0038 1,1,umbala.gat,160,247
-
-//Large Shack
-umbala.gat,108,164,0 warp umba0039 1,1,um_in.gat,38,112
+//===== Athena Script ========================================
+//= Umbala Warp Script
+//===== By: ==================================================
+//= Darkchild (1.0v A)
+//= Athena (1.0v B)
+//= 1.1 (Akaru)
+//= Nana (1.2)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Umbala
+//===== Additional Comments: =================================
+//= No Comment
+//============================================================
+
+//Witch House
+//Entrance via the Skeleton Gate Quest
+//umbala.gat,220,190,0 warp umba0027 1,1,um_in.gat,32,70
+um_in.gat,28,70,0 warp umba0028 1,1,umbala.gat,217,187
+
+//Weapons
+umbala.gat,125,157,0 warp umba0029 1,1,um_in.gat,155,114
+um_in.gat,155,110,0 warp umba0030 1,1,umbala.gat,126,152
+
+//Fan Shack
+umbala.gat,138,129,0 warp umba0031 1,1,um_in.gat,99,114
+um_in.gat,99,110,0 warp umba0032 1,1,umbala.gat,136,127
+
+//Lower Double Shack
+umbala.gat,95,186,0 warp umba0033 1,1,um_in.gat,142,42
+um_in.gat,141,39,0 warp umba0034 1,1,umbala.gat,95,183
+
+//Upper Double Shack
+umbala.gat,100,202,0 warp umba0035 1,1,um_in.gat,163,70
+um_in.gat,166,70,0 warp umba0036 1,1,umbala.gat,102,204
+
+//Small Shack
+umbala.gat,156,249,0 warp umba0037 1,1,um_in.gat,99,67
+um_in.gat,99,63,0 warp umba0038 1,1,umbala.gat,160,247
+
+//Large Shack
+umbala.gat,108,164,0 warp umba0039 1,1,um_in.gat,38,112
um_in.gat,38,110,0 warp umba0040 1,1,umbala.gat,104,163 \ No newline at end of file
diff --git a/npc/warps/cities/yggdrasil.txt b/npc/warps/cities/yggdrasil.txt
index 30176aafb..153acfe67 100644
--- a/npc/warps/cities/yggdrasil.txt
+++ b/npc/warps/cities/yggdrasil.txt
@@ -1,23 +1,23 @@
-//===== Athena Script ========================================
-//= Yggdrasil Tree Warp Script
-//===== By: ==================================================
-//= PKGINGO (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Yggdrasil Tree
-//===== Additional Comments: =================================
-//= Extracted from Vidar -> Athena
-//============================================================
-
-//Umbala Entrance
-um_dun02.gat,125,163,0 warp nwarp1 1,1,yggdrasil01.gat,40,63
-
-//Niflheim Exit
-yggdrasil01.gat,249,262,0 warp nwarp5 1,1,nif_fild01.gat,315,66
-
-//Yggdrasil Tree
-yggdrasil01.gat,271,51,0 warp nwarp3 1,1,yggdrasil01.gat,26,196
+//===== Athena Script ========================================
+//= Yggdrasil Tree Warp Script
+//===== By: ==================================================
+//= PKGINGO (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Yggdrasil Tree
+//===== Additional Comments: =================================
+//= Extracted from Vidar -> Athena
+//============================================================
+
+//Umbala Entrance
+um_dun02.gat,125,163,0 warp nwarp1 1,1,yggdrasil01.gat,40,63
+
+//Niflheim Exit
+yggdrasil01.gat,249,262,0 warp nwarp5 1,1,nif_fild01.gat,315,66
+
+//Yggdrasil Tree
+yggdrasil01.gat,271,51,0 warp nwarp3 1,1,yggdrasil01.gat,26,196
yggdrasil01.gat,26,193,0 warp nwarp4 1,1,yggdrasil01.gat,269,53 \ No newline at end of file
diff --git a/npc/warps/cities/yuno.txt b/npc/warps/cities/yuno.txt
index 478a8302a..cdc558cec 100644
--- a/npc/warps/cities/yuno.txt
+++ b/npc/warps/cities/yuno.txt
@@ -1,202 +1,202 @@
-//===== Athena Script ========================================
-//= Yuno Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//= Sara-chan (1.1)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Yuno
-//===== Additional Comments: =================================
-//= 1.1 - Added Yuno Airport warps
-//= 1.2 Moved all airports to Airplane Warps [Lupus]
-//= 1.3 Dr.Evil's yuno_05 warps update [Lupus]
-//= 1.4 optimized [Lupus]
-//= 1.5 Added Missing Juno warps [musashiden]
-//= 1.6 Corrected duplicate warps [Musashiden]
-//= 1.7 Yet another missing warp [Musashiden]
-//============================================================
-
-//= Yuno City ================================================
-yuno.gat,158,15,0 warp yun-yunfild 1,1,yuno_fild04.gat,231,284
-yuno.gat,117,135,0 warp yun01 1,1,yuno_in01.gat,116,37
-yuno_in01.gat,116,40,0 warp yun02 1,1,yuno.gat,120,138
-yuno.gat,48,105,0 warp yun03 1,1,yuno_in01.gat,37,176
-yuno_in01.gat,40,176,0 warp yun04 1,1,yuno.gat,51,105
-yuno_in01.gat,32,182,0 warp yun05 1,1,yuno_in01.gat,86,164
-yuno_in01.gat,82,164,0 warp yun06 1,1,yuno_in01.gat,28,182
-yuno.gat,48,151,0 warp yun07 1,1,yuno_in01.gat,30,100
-yuno_in01.gat,34,100,0 warp yun08 1,1,yuno.gat,51,151
-yuno.gat,93,180,0 warp yun09 1,1,yuno_in04.gat,33,127
-yuno_in04.gat,33,130,0 warp yun10 1,1,yuno.gat,95,184
-yuno.gat,196,138,0 warp yun11 1,1,yuno_in01.gat,32,33
-yuno_in01.gat,32,36,0 warp yun12 1,1,yuno.gat,193,142
-yuno.gat,264,87,0 warp yun13 1,1,yuno_in01.gat,168,101
-yuno_in01.gat,168,104,0 warp yun14 1,1,yuno.gat,264,90
-yuno.gat,341,203,0 warp yun15 1,1,yuno_in04.gat,32,58
-yuno_in04.gat,29,58,0 warp yun16 1,1,yuno.gat,338,203
-yuno_in04.gat,52,58,0 warp yun17 1,1,yuno_in04.gat,97,58
-yuno_in04.gat,95,58,0 warp yun18 1,1,yuno_in04.gat,50,58
-yuno_in04.gat,103,64,0 warp yun19 1,1,yuno_in04.gat,103,95
-yuno_in04.gat,103,93,0 warp yun20 1,1,yuno_in04.gat,103,62
-yuno_in04.gat,115,64,0 warp yun21 1,1,yuno_in04.gat,115,95
-yuno_in04.gat,115,93,0 warp yun22 1,1,yuno_in04.gat,115,62
-yuno_in04.gat,115,51,0 warp yun23 1,1,yuno_in04.gat,115,20
-yuno_in04.gat,115,22,0 warp yun24 1,1,yuno_in04.gat,115,53
-yuno_in04.gat,103,51,0 warp yun25 1,1,yuno_in04.gat,103,20
-yuno_in04.gat,103,22,0 warp yun26 1,1,yuno_in04.gat,103,53
-yuno_in04.gat,122,57,0 warp yun27 1,1,yuno_in04.gat,164,110
-yuno_in04.gat,161,110,0 warp yun28 1,1,yuno_in04.gat,120,57
-yuno.gat,323,284,0 warp yun29 1,1,yuno_in03.gat,167,22
-yuno_in03.gat,167,19,0 warp yun30 1,1,yuno.gat,323,280
-yuno_in03.gat,167,72,0 warp yun31 1,1,yuno_in03.gat,179,113
-yuno_in03.gat,179,109,0 warp yun32 1,1,yuno_in03.gat,167,69
-yuno_in03.gat,186,119,0 warp yun33 1,1,yuno_in03.gat,163,174
-yuno_in03.gat,159,174,0 warp yun34 1,1,yuno_in03.gat,183,119
-yuno_in03.gat,186,131,0 warp yun35 1,1,yuno_in03.gat,163,187
-yuno_in03.gat,159,187,0 warp yun36 1,1,yuno_in03.gat,183,131
-yuno_in03.gat,172,118,0 warp yun37 1,1,yuno_in03.gat,120,178
-yuno_in03.gat,124,178,0 warp yun38 1,1,yuno_in03.gat,176,118
-yuno_in03.gat,111,192,0 warp yun39 1,1,yuno_in03.gat,162,132
-yuno_in03.gat,162,129,0 warp yun40 1,1,yuno_in03.gat,111,189
-yuno_in03.gat,153,134,0 warp yun41 1,1,yuno_in03.gat,62,186
-yuno_in03.gat,66,186,0 warp yun42 1,1,yuno_in03.gat,155,134
-yuno.gat,278,293,0 warp yun43 1,1,yuno_in03.gat,25,15
-yuno_in03.gat,25,11,0 warp yun44 1,1,yuno.gat,278,290
-yuno_in03.gat,32,89,0 warp yun45 1,1,yuno_in03.gat,25,53
-yuno_in03.gat,25,56,0 warp yun46 1,1,yuno_in03.gat,32,92
-yuno.gat,284,366,0 warp yun47 1,1,yuno_in03.gat,224,23
-yuno_in03.gat,224,19,0 warp yun48 1,1,yuno.gat,284,363
-yuno_in03.gat,219,50,0 warp yun49 1,1,yuno_in03.gat,104,118
-yuno_in03.gat,104,115,0 warp yun50 1,1,yuno_in03.gat,219,47
-yuno_in03.gat,244,52,0 warp yun51 1,1,yuno_in03.gat,235,94
-yuno_in03.gat,235,91,0 warp yun52 1,1,yuno_in03.gat,244,49
-yuno_in03.gat,231,61,0 warp yun53 1,1,yuno_in03.gat,239,144
-yuno_in03.gat,239,141,0 warp yun54 1,1,yuno_in03.gat,231,57
-yuno_in03.gat,223,167,0 warp yun55 1,1,yuno_in03.gat,96,54
-yuno_in03.gat,96,58,0 warp yun56 1,1,yuno_in03.gat,223,170
-yuno.gat,87,321,0 warp yun57 1,1,yuno_in02.gat,168,61
-yuno_in02.gat,172,61,0 warp yun58 1,1,yuno.gat,90,321
-yuno_in01.gat,88,36,0 warp yun59 1,1,yuno_in01.gat,173,34
-yuno_in01.gat,176,34,0 warp yun60 1,1,yuno_in01.gat,91,36
-yuno_in02.gat,82,14,0 warp yun61 1,1,yuno_in05.gat,192,194
-yuno_in05.gat,196,194,0 warp yun62 1,1,yuno_in02.gat,85,14
-yuno.gat,157,320,0 warp yun63 1,1,yuno_pre.gat,69,13
-yuno_pre.gat,69,10,0 warp yun64 1,1,yuno.gat,157,317
-yuno.gat,245,147,0 warp yun65 1,1,yuno_in01.gat,101,88
-yuno_in01.gat,101,85,0 warp yun66 1,1,yuno.gat,245,144
-
-// Yuno In05 (Entering Random Warps) -------------------------------------------
-yuno_in05.gat,153,141,0 script #yun63 45,1,1,{
- if(rand(2)){
- warp "yuno_in05",192,102;
- } else {
- warp "yuno_in05",145,82;
- }
- end;
-}
-// Yuno In05 (Random Warps - Cross Shaped) -------------------------------------
-yuno_in05.gat,196,102,0 script #yun64 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",169,102; end;
-w2: warp "yuno_in05",128,82; end;
-w3: warp "yuno_in05",156,141; end;
-}
-yuno_in05.gat,181,116,0 script #yun65 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,94; end;
-w2: warp "yuno_in05",176,13; end;
-w3: warp "yuno_in05",136,75; end;
-}
-yuno_in05.gat,165,102,0 script #yun66 45,1,1,{
- if(rand(2)){
- warp "yuno_in05",192,102;
- } else {
- warp "yuno_in05",145,82;
- }
- end;
-}
-yuno_in05.gat,181,91,0 script #yun67 45,1,1,{
- if(rand(2)){
- warp "yuno_in05",181,112;
- } else {
- warp "yuno_in05",176,48;
- }
- end;
-}
-// Yuno In05 (Random Warps - T-Shaped) -----------------------------------------
-yuno_in05.gat,148,82,0 script #yun68 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",169,102; end;
-w2: warp "yuno_in05",128,82; end;
-w3: warp "yuno_in05",156,141; end;
-}
-yuno_in05.gat,125,82,0 script #yun69 45,1,1,{
- if(rand(2)){
- warp "yuno_in05",192,102;
- } else {
- warp "yuno_in05",145,82;
- }
- end;
-}
-yuno_in05.gat,136,71,0 script #yun70 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,112; end;
-w2: warp "yuno_in05",16,185; end;
-w3: warp "yuno_in05",176,48; end;
-}
-// Yuno In05 (Random Warps - Other) --------------------------------------------
-yuno_in05.gat,16,188,0 script #yun71 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,94; end;
-w2: warp "yuno_in05",176,13; end;
-w3: warp "yuno_in05",136,75; end;
-}
-yuno_in05.gat,176,9,0 script #yun72 45,1,1,{
- if(rand(2)){
- warp "yuno_in05",181,112;
- } else {
- warp "yuno_in05",176,48;
- }
- end;
-}
-yuno_in05.gat,176,52,0 script #yun73 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,94; end;
-w2: warp "yuno_in05",176,13; end;
-w3: warp "yuno_in05",136,75; end;
-}
-// Yuno In05 (Destination - Room) ----------------------------------------------
-yuno_in05.gat,40,178,0 script #yun74 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,94; end;
-w2: warp "yuno_in05",176,13; end;
-w3: warp "yuno_in05",136,75; end;
-}
-yuno_in05.gat,47,186,0 script #yun75 45,1,1,{
- set @warp0,rand(3);
- if(@warp0==1) goto w2;
- if(@warp0==2) goto w3;
- warp "yuno_in05",181,94; end;
-w2: warp "yuno_in05",176,13; end;
-w3: warp "yuno_in05",136,75; end;
-}
-// Yuno In05 (Destination - Escaped Random Warps) ------------------------------
-yuno_in05.gat,31,167,0 warp yun76 1,1,yuno_in05.gat,50,85
+//===== Athena Script ========================================
+//= Yuno Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//= Sara-chan (1.1)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Yuno
+//===== Additional Comments: =================================
+//= 1.1 - Added Yuno Airport warps
+//= 1.2 Moved all airports to Airplane Warps [Lupus]
+//= 1.3 Dr.Evil's yuno_05 warps update [Lupus]
+//= 1.4 optimized [Lupus]
+//= 1.5 Added Missing Juno warps [musashiden]
+//= 1.6 Corrected duplicate warps [Musashiden]
+//= 1.7 Yet another missing warp [Musashiden]
+//============================================================
+
+//= Yuno City ================================================
+yuno.gat,158,15,0 warp yun-yunfild 1,1,yuno_fild04.gat,231,284
+yuno.gat,117,135,0 warp yun01 1,1,yuno_in01.gat,116,37
+yuno_in01.gat,116,40,0 warp yun02 1,1,yuno.gat,120,138
+yuno.gat,48,105,0 warp yun03 1,1,yuno_in01.gat,37,176
+yuno_in01.gat,40,176,0 warp yun04 1,1,yuno.gat,51,105
+yuno_in01.gat,32,182,0 warp yun05 1,1,yuno_in01.gat,86,164
+yuno_in01.gat,82,164,0 warp yun06 1,1,yuno_in01.gat,28,182
+yuno.gat,48,151,0 warp yun07 1,1,yuno_in01.gat,30,100
+yuno_in01.gat,34,100,0 warp yun08 1,1,yuno.gat,51,151
+yuno.gat,93,180,0 warp yun09 1,1,yuno_in04.gat,33,127
+yuno_in04.gat,33,130,0 warp yun10 1,1,yuno.gat,95,184
+yuno.gat,196,138,0 warp yun11 1,1,yuno_in01.gat,32,33
+yuno_in01.gat,32,36,0 warp yun12 1,1,yuno.gat,193,142
+yuno.gat,264,87,0 warp yun13 1,1,yuno_in01.gat,168,101
+yuno_in01.gat,168,104,0 warp yun14 1,1,yuno.gat,264,90
+yuno.gat,341,203,0 warp yun15 1,1,yuno_in04.gat,32,58
+yuno_in04.gat,29,58,0 warp yun16 1,1,yuno.gat,338,203
+yuno_in04.gat,52,58,0 warp yun17 1,1,yuno_in04.gat,97,58
+yuno_in04.gat,95,58,0 warp yun18 1,1,yuno_in04.gat,50,58
+yuno_in04.gat,103,64,0 warp yun19 1,1,yuno_in04.gat,103,95
+yuno_in04.gat,103,93,0 warp yun20 1,1,yuno_in04.gat,103,62
+yuno_in04.gat,115,64,0 warp yun21 1,1,yuno_in04.gat,115,95
+yuno_in04.gat,115,93,0 warp yun22 1,1,yuno_in04.gat,115,62
+yuno_in04.gat,115,51,0 warp yun23 1,1,yuno_in04.gat,115,20
+yuno_in04.gat,115,22,0 warp yun24 1,1,yuno_in04.gat,115,53
+yuno_in04.gat,103,51,0 warp yun25 1,1,yuno_in04.gat,103,20
+yuno_in04.gat,103,22,0 warp yun26 1,1,yuno_in04.gat,103,53
+yuno_in04.gat,122,57,0 warp yun27 1,1,yuno_in04.gat,164,110
+yuno_in04.gat,161,110,0 warp yun28 1,1,yuno_in04.gat,120,57
+yuno.gat,323,284,0 warp yun29 1,1,yuno_in03.gat,167,22
+yuno_in03.gat,167,19,0 warp yun30 1,1,yuno.gat,323,280
+yuno_in03.gat,167,72,0 warp yun31 1,1,yuno_in03.gat,179,113
+yuno_in03.gat,179,109,0 warp yun32 1,1,yuno_in03.gat,167,69
+yuno_in03.gat,186,119,0 warp yun33 1,1,yuno_in03.gat,163,174
+yuno_in03.gat,159,174,0 warp yun34 1,1,yuno_in03.gat,183,119
+yuno_in03.gat,186,131,0 warp yun35 1,1,yuno_in03.gat,163,187
+yuno_in03.gat,159,187,0 warp yun36 1,1,yuno_in03.gat,183,131
+yuno_in03.gat,172,118,0 warp yun37 1,1,yuno_in03.gat,120,178
+yuno_in03.gat,124,178,0 warp yun38 1,1,yuno_in03.gat,176,118
+yuno_in03.gat,111,192,0 warp yun39 1,1,yuno_in03.gat,162,132
+yuno_in03.gat,162,129,0 warp yun40 1,1,yuno_in03.gat,111,189
+yuno_in03.gat,153,134,0 warp yun41 1,1,yuno_in03.gat,62,186
+yuno_in03.gat,66,186,0 warp yun42 1,1,yuno_in03.gat,155,134
+yuno.gat,278,293,0 warp yun43 1,1,yuno_in03.gat,25,15
+yuno_in03.gat,25,11,0 warp yun44 1,1,yuno.gat,278,290
+yuno_in03.gat,32,89,0 warp yun45 1,1,yuno_in03.gat,25,53
+yuno_in03.gat,25,56,0 warp yun46 1,1,yuno_in03.gat,32,92
+yuno.gat,284,366,0 warp yun47 1,1,yuno_in03.gat,224,23
+yuno_in03.gat,224,19,0 warp yun48 1,1,yuno.gat,284,363
+yuno_in03.gat,219,50,0 warp yun49 1,1,yuno_in03.gat,104,118
+yuno_in03.gat,104,115,0 warp yun50 1,1,yuno_in03.gat,219,47
+yuno_in03.gat,244,52,0 warp yun51 1,1,yuno_in03.gat,235,94
+yuno_in03.gat,235,91,0 warp yun52 1,1,yuno_in03.gat,244,49
+yuno_in03.gat,231,61,0 warp yun53 1,1,yuno_in03.gat,239,144
+yuno_in03.gat,239,141,0 warp yun54 1,1,yuno_in03.gat,231,57
+yuno_in03.gat,223,167,0 warp yun55 1,1,yuno_in03.gat,96,54
+yuno_in03.gat,96,58,0 warp yun56 1,1,yuno_in03.gat,223,170
+yuno.gat,87,321,0 warp yun57 1,1,yuno_in02.gat,168,61
+yuno_in02.gat,172,61,0 warp yun58 1,1,yuno.gat,90,321
+yuno_in01.gat,88,36,0 warp yun59 1,1,yuno_in01.gat,173,34
+yuno_in01.gat,176,34,0 warp yun60 1,1,yuno_in01.gat,91,36
+yuno_in02.gat,82,14,0 warp yun61 1,1,yuno_in05.gat,192,194
+yuno_in05.gat,196,194,0 warp yun62 1,1,yuno_in02.gat,85,14
+yuno.gat,157,320,0 warp yun63 1,1,yuno_pre.gat,69,13
+yuno_pre.gat,69,10,0 warp yun64 1,1,yuno.gat,157,317
+yuno.gat,245,147,0 warp yun65 1,1,yuno_in01.gat,101,88
+yuno_in01.gat,101,85,0 warp yun66 1,1,yuno.gat,245,144
+
+// Yuno In05 (Entering Random Warps) -------------------------------------------
+yuno_in05.gat,153,141,0 script #yun63 45,1,1,{
+ if(rand(2)){
+ warp "yuno_in05",192,102;
+ } else {
+ warp "yuno_in05",145,82;
+ }
+ end;
+}
+// Yuno In05 (Random Warps - Cross Shaped) -------------------------------------
+yuno_in05.gat,196,102,0 script #yun64 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",169,102; end;
+w2: warp "yuno_in05",128,82; end;
+w3: warp "yuno_in05",156,141; end;
+}
+yuno_in05.gat,181,116,0 script #yun65 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,94; end;
+w2: warp "yuno_in05",176,13; end;
+w3: warp "yuno_in05",136,75; end;
+}
+yuno_in05.gat,165,102,0 script #yun66 45,1,1,{
+ if(rand(2)){
+ warp "yuno_in05",192,102;
+ } else {
+ warp "yuno_in05",145,82;
+ }
+ end;
+}
+yuno_in05.gat,181,91,0 script #yun67 45,1,1,{
+ if(rand(2)){
+ warp "yuno_in05",181,112;
+ } else {
+ warp "yuno_in05",176,48;
+ }
+ end;
+}
+// Yuno In05 (Random Warps - T-Shaped) -----------------------------------------
+yuno_in05.gat,148,82,0 script #yun68 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",169,102; end;
+w2: warp "yuno_in05",128,82; end;
+w3: warp "yuno_in05",156,141; end;
+}
+yuno_in05.gat,125,82,0 script #yun69 45,1,1,{
+ if(rand(2)){
+ warp "yuno_in05",192,102;
+ } else {
+ warp "yuno_in05",145,82;
+ }
+ end;
+}
+yuno_in05.gat,136,71,0 script #yun70 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,112; end;
+w2: warp "yuno_in05",16,185; end;
+w3: warp "yuno_in05",176,48; end;
+}
+// Yuno In05 (Random Warps - Other) --------------------------------------------
+yuno_in05.gat,16,188,0 script #yun71 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,94; end;
+w2: warp "yuno_in05",176,13; end;
+w3: warp "yuno_in05",136,75; end;
+}
+yuno_in05.gat,176,9,0 script #yun72 45,1,1,{
+ if(rand(2)){
+ warp "yuno_in05",181,112;
+ } else {
+ warp "yuno_in05",176,48;
+ }
+ end;
+}
+yuno_in05.gat,176,52,0 script #yun73 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,94; end;
+w2: warp "yuno_in05",176,13; end;
+w3: warp "yuno_in05",136,75; end;
+}
+// Yuno In05 (Destination - Room) ----------------------------------------------
+yuno_in05.gat,40,178,0 script #yun74 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,94; end;
+w2: warp "yuno_in05",176,13; end;
+w3: warp "yuno_in05",136,75; end;
+}
+yuno_in05.gat,47,186,0 script #yun75 45,1,1,{
+ set @warp0,rand(3);
+ if(@warp0==1) goto w2;
+ if(@warp0==2) goto w3;
+ warp "yuno_in05",181,94; end;
+w2: warp "yuno_in05",176,13; end;
+w3: warp "yuno_in05",136,75; end;
+}
+// Yuno In05 (Destination - Escaped Random Warps) ------------------------------
+yuno_in05.gat,31,167,0 warp yun76 1,1,yuno_in05.gat,50,85
yuno_in05.gat,50,88,0 warp yun77 1,1,yuno_in02.gat,85,14 \ No newline at end of file
diff --git a/npc/warps/disabled_warps.txt b/npc/warps/disabled_warps.txt
index 837df12e7..f9c241e82 100644
--- a/npc/warps/disabled_warps.txt
+++ b/npc/warps/disabled_warps.txt
@@ -1,45 +1,45 @@
-//===== Athena Script ========================================
-//= Disabled Warps
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Description: =========================================
-//= Disabled Warp's for entire Athena
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Beach Dungeon ============================================
-//beach_dun.gat,89,28,0 warp cmd00a 3,3,beach_dun2.gat,15,182
-//beach_dun2.gat,13,182,0 warp cmd00b 3,3,beach_dun.gat,89,30
-
-//= Comodo Field
-//moc_fild12.gat,35,303,0 warp cmd011 3,3,cmd_fild08.gat,331,319
-//cmd_fild09.gat,14,120,0 warp cmdf14-3 3,3,cmd_fild07.gat,386,96
-
-
-//= Morroc Field =============================================
-//moc_fild04.gat,219,327,0 warp mocf016 3,4,anthell01.gat,35,262
-//moc_fild15.gat,258,253,0 warp mocf017 3,3,anthell01.gat,35,262
-
-//= Ant Hell =================================================
-//anthell01.gat,35,267,0 warp ant001 1,1,moc_fild04.gat,213,327
-//anthell02.gat,171,169,0 warp ant002 1,2,moc_fild04.gat,213,327
-
-//= Morroc Ruins =============================================
-//morocc_in.gat,108,179,0 warp w280 3,2,morocc.gat,284,175
-
-//= Morroc Town ==============================================
-//morocc_in.gat,72,67,0 warp w341 2,2,morocc_in.gat,44,162
-
-//= Izlude Town ==============================================
-//= Due to Job Quest
-//izlude_in.gat,62,170,0 warp w1039 1,1,izlude_in.gat,68,165
-
-//= Payon Cave
-//pay_dun03.gat,127,62,0 warp payd04 1,2,pay_dun04.gat,201,204
-
-// Airplane (no direct access there)
-//airplane.gat,255,55,0 warp ein044 1,1,airplane.gat,90,68
-//airplane.gat,88,68,0 warp ein044a 1,1,airplane.gat,253,55
+//===== Athena Script ========================================
+//= Disabled Warps
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Description: =========================================
+//= Disabled Warp's for entire Athena
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Beach Dungeon ============================================
+//beach_dun.gat,89,28,0 warp cmd00a 3,3,beach_dun2.gat,15,182
+//beach_dun2.gat,13,182,0 warp cmd00b 3,3,beach_dun.gat,89,30
+
+//= Comodo Field
+//moc_fild12.gat,35,303,0 warp cmd011 3,3,cmd_fild08.gat,331,319
+//cmd_fild09.gat,14,120,0 warp cmdf14-3 3,3,cmd_fild07.gat,386,96
+
+
+//= Morroc Field =============================================
+//moc_fild04.gat,219,327,0 warp mocf016 3,4,anthell01.gat,35,262
+//moc_fild15.gat,258,253,0 warp mocf017 3,3,anthell01.gat,35,262
+
+//= Ant Hell =================================================
+//anthell01.gat,35,267,0 warp ant001 1,1,moc_fild04.gat,213,327
+//anthell02.gat,171,169,0 warp ant002 1,2,moc_fild04.gat,213,327
+
+//= Morroc Ruins =============================================
+//morocc_in.gat,108,179,0 warp w280 3,2,morocc.gat,284,175
+
+//= Morroc Town ==============================================
+//morocc_in.gat,72,67,0 warp w341 2,2,morocc_in.gat,44,162
+
+//= Izlude Town ==============================================
+//= Due to Job Quest
+//izlude_in.gat,62,170,0 warp w1039 1,1,izlude_in.gat,68,165
+
+//= Payon Cave
+//pay_dun03.gat,127,62,0 warp payd04 1,2,pay_dun04.gat,201,204
+
+// Airplane (no direct access there)
+//airplane.gat,255,55,0 warp ein044 1,1,airplane.gat,90,68
+//airplane.gat,88,68,0 warp ein044a 1,1,airplane.gat,253,55
diff --git a/npc/warps/dungeons/abyss.txt b/npc/warps/dungeons/abyss.txt
index da37d1fa4..87507f2a0 100644
--- a/npc/warps/dungeons/abyss.txt
+++ b/npc/warps/dungeons/abyss.txt
@@ -1,20 +1,20 @@
-//===== Athena Script ========================================
-//= Abyss Lake Dungeon Warp Script
-//===== By: ==================================================
-//= Muad-Dib (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 10+
-//===== Description: =========================================
-//= Warp Points for Abyss Lake Dungeon
-//===== Additional Comments: =================================
-//= 1.0 Thanks to Muad-Dib for the temp warps [Lupus]
-//============================================================
-
-//hu_fild05.gat,197,210,0 warp abysslakedunwarp001 2,3,abyss_01.gat,264,271
-abyss_01.gat,267,274,0 warp abysslakedunwarp002 1,1,hu_fild05.gat,192,207
-abyss_01.gat,26,23,0 warp abysslakedunwarp003 1,1,abyss_02.gat,275,270
-abyss_02.gat,278,270,0 warp abysslakedunwarp004 1,1,abyss_01.gat,26,26
-abyss_02.gat,145,281,0 warp abysslakedunwarp005 1,1,abyss_03.gat,116,27
-abyss_03.gat,116,24,0 warp abysslakedunwarp006 1,1,abyss_02.gat,145,278
+//===== Athena Script ========================================
+//= Abyss Lake Dungeon Warp Script
+//===== By: ==================================================
+//= Muad-Dib (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 10+
+//===== Description: =========================================
+//= Warp Points for Abyss Lake Dungeon
+//===== Additional Comments: =================================
+//= 1.0 Thanks to Muad-Dib for the temp warps [Lupus]
+//============================================================
+
+//hu_fild05.gat,197,210,0 warp abysslakedunwarp001 2,3,abyss_01.gat,264,271
+abyss_01.gat,267,274,0 warp abysslakedunwarp002 1,1,hu_fild05.gat,192,207
+abyss_01.gat,26,23,0 warp abysslakedunwarp003 1,1,abyss_02.gat,275,270
+abyss_02.gat,278,270,0 warp abysslakedunwarp004 1,1,abyss_01.gat,26,26
+abyss_02.gat,145,281,0 warp abysslakedunwarp005 1,1,abyss_03.gat,116,27
+abyss_03.gat,116,24,0 warp abysslakedunwarp006 1,1,abyss_02.gat,145,278
diff --git a/npc/warps/dungeons/alberta_duns.txt b/npc/warps/dungeons/alberta_duns.txt
index e715be196..e083d618a 100644
--- a/npc/warps/dungeons/alberta_duns.txt
+++ b/npc/warps/dungeons/alberta_duns.txt
@@ -1,58 +1,58 @@
-//==== Athena Script ========================================
-//= Alberta Field's Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Treasure Island & Turtle Island
-//===== Additional Comments: =================================
-//= Split of Alberta.txt
-//============================================================
-
-//Treasure Island Warp's
-treasure01.gat,112,164,0 warp tre01 1,4,treasure01.gat,97,164
-treasure01.gat,125,161,0 warp tre02 1,3,treasure01.gat,144,161
-treasure01.gat,142,161,0 warp tre02-1 1,3,treasure01.gat,123,161
-treasure01.gat,164,114,0 warp tre03 3,1,treasure01.gat,164,88
-treasure01.gat,164,91,0 warp tre03-1 5,1,treasure01.gat,164,116
-treasure01.gat,99,164,0 warp tre01-1 1,4,treasure01.gat,114,164
-treasure01.gat,76,111,0 warp tre10 1,3,treasure01.gat,100,111
-treasure01.gat,38,164,0 warp tre04-1 1,4,treasure01.gat,25,164
-treasure01.gat,40,111,0 warp tre05 1,3,treasure01.gat,67,112
-treasure01.gat,62,111,0 warp tre05-1 1,3,treasure01.gat,38,111
-treasure01.gat,27,164,0 warp tre04 1,4,treasure01.gat,40,164
-treasure01.gat,69,75,0 warp tre07 2,1,treasure01.gat,69,106
-treasure01.gat,69,125,0 warp tre08 4,1,treasure01.gat,69,142
-treasure01.gat,69,140,0 warp tre08-1 4,1,treasure01.gat,69,123
-treasure01.gat,98,111,0 warp tre10-1 1,3,treasure01.gat,74,111
-treasure01.gat,69,177,0 warp tre002 3,1,treasure02.gat,102,27
-treasure01.gat,41,37,0 warp tre06 1,3,treasure01.gat,61,37
-treasure01.gat,58,37,0 warp tre06-1 1,3,treasure01.gat,39,37
-treasure01.gat,69,102,0 warp tre07-1 2,1,treasure01.gat,69,77
-treasure01.gat,79,37,0 warp tre09 1,3,treasure01.gat,98,37
-treasure01.gat,96,37,0 warp tre09-1 1,3,treasure01.gat,77,37
-treasure01.gat,69,22,0 warp tre001 4,1,alb2trea.gat,85,107
-treasure02.gat,102,103,0 warp tre11 5,1,treasure02.gat,102,120
-treasure02.gat,102,118,0 warp tre11-1 5,1,treasure02.gat,102,101
-treasure02.gat,155,128,0 warp tre13-1 1,1,treasure02.gat,155,97
-treasure02.gat,155,99,0 warp tre13 1,1,treasure02.gat,155,130
-treasure02.gat,49,99,0 warp tre14-1 1,1,treasure02.gat,49,130
-treasure02.gat,102,24,0 warp tre003 3,1,treasure01.gat,69,179
-treasure02.gat,123,72,0 warp tre12 1,4,treasure02.gat,140,72
-treasure02.gat,138,72,0 warp tre12-1 1,4,treasure02.gat,121,72
-treasure02.gat,49,128,0 warp tre14 1,1,treasure02.gat,49,97
-treasure02.gat,65,72,0 warp tre15 1,4,treasure02.gat,82,72
-treasure02.gat,80,72,0 warp tre15-1 1,4,treasure02.gat,63,72
-
-//Turtle Island Warp's
-tur_dun01.gat,154,241,0 warp ttl01 1,1,tur_dun02.gat,148,264
-tur_dun02.gat,148,268,0 warp ttl01-1 1,1,tur_dun01.gat,154,237
-tur_dun02.gat,167,19,0 warp ttl02 1,1,tur_dun03.gat,132,189
-tur_dun03.gat,132,193,0 warp ttl02-1 1,1,tur_dun02.gat,167,23
-tur_dun03.gat,217,71,0 warp ttl03 1,1,tur_dun04.gat,100,192
-tur_dun04.gat,100,196,0 warp ttl03-1 1,1,tur_dun03.gat,215,75
-tur_dun05.gat,89,69,0 warp ttl05 1,1,tur_dun02.gat,148,264
+//==== Athena Script ========================================
+//= Alberta Field's Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Treasure Island & Turtle Island
+//===== Additional Comments: =================================
+//= Split of Alberta.txt
+//============================================================
+
+//Treasure Island Warp's
+treasure01.gat,112,164,0 warp tre01 1,4,treasure01.gat,97,164
+treasure01.gat,125,161,0 warp tre02 1,3,treasure01.gat,144,161
+treasure01.gat,142,161,0 warp tre02-1 1,3,treasure01.gat,123,161
+treasure01.gat,164,114,0 warp tre03 3,1,treasure01.gat,164,88
+treasure01.gat,164,91,0 warp tre03-1 5,1,treasure01.gat,164,116
+treasure01.gat,99,164,0 warp tre01-1 1,4,treasure01.gat,114,164
+treasure01.gat,76,111,0 warp tre10 1,3,treasure01.gat,100,111
+treasure01.gat,38,164,0 warp tre04-1 1,4,treasure01.gat,25,164
+treasure01.gat,40,111,0 warp tre05 1,3,treasure01.gat,67,112
+treasure01.gat,62,111,0 warp tre05-1 1,3,treasure01.gat,38,111
+treasure01.gat,27,164,0 warp tre04 1,4,treasure01.gat,40,164
+treasure01.gat,69,75,0 warp tre07 2,1,treasure01.gat,69,106
+treasure01.gat,69,125,0 warp tre08 4,1,treasure01.gat,69,142
+treasure01.gat,69,140,0 warp tre08-1 4,1,treasure01.gat,69,123
+treasure01.gat,98,111,0 warp tre10-1 1,3,treasure01.gat,74,111
+treasure01.gat,69,177,0 warp tre002 3,1,treasure02.gat,102,27
+treasure01.gat,41,37,0 warp tre06 1,3,treasure01.gat,61,37
+treasure01.gat,58,37,0 warp tre06-1 1,3,treasure01.gat,39,37
+treasure01.gat,69,102,0 warp tre07-1 2,1,treasure01.gat,69,77
+treasure01.gat,79,37,0 warp tre09 1,3,treasure01.gat,98,37
+treasure01.gat,96,37,0 warp tre09-1 1,3,treasure01.gat,77,37
+treasure01.gat,69,22,0 warp tre001 4,1,alb2trea.gat,85,107
+treasure02.gat,102,103,0 warp tre11 5,1,treasure02.gat,102,120
+treasure02.gat,102,118,0 warp tre11-1 5,1,treasure02.gat,102,101
+treasure02.gat,155,128,0 warp tre13-1 1,1,treasure02.gat,155,97
+treasure02.gat,155,99,0 warp tre13 1,1,treasure02.gat,155,130
+treasure02.gat,49,99,0 warp tre14-1 1,1,treasure02.gat,49,130
+treasure02.gat,102,24,0 warp tre003 3,1,treasure01.gat,69,179
+treasure02.gat,123,72,0 warp tre12 1,4,treasure02.gat,140,72
+treasure02.gat,138,72,0 warp tre12-1 1,4,treasure02.gat,121,72
+treasure02.gat,49,128,0 warp tre14 1,1,treasure02.gat,49,97
+treasure02.gat,65,72,0 warp tre15 1,4,treasure02.gat,82,72
+treasure02.gat,80,72,0 warp tre15-1 1,4,treasure02.gat,63,72
+
+//Turtle Island Warp's
+tur_dun01.gat,154,241,0 warp ttl01 1,1,tur_dun02.gat,148,264
+tur_dun02.gat,148,268,0 warp ttl01-1 1,1,tur_dun01.gat,154,237
+tur_dun02.gat,167,19,0 warp ttl02 1,1,tur_dun03.gat,132,189
+tur_dun03.gat,132,193,0 warp ttl02-1 1,1,tur_dun02.gat,167,23
+tur_dun03.gat,217,71,0 warp ttl03 1,1,tur_dun04.gat,100,192
+tur_dun04.gat,100,196,0 warp ttl03-1 1,1,tur_dun03.gat,215,75
+tur_dun05.gat,89,69,0 warp ttl05 1,1,tur_dun02.gat,148,264
tur_dun05.gat,9,45,0 warp ttl06 1,1,tur_dun01.gat,154,237 \ No newline at end of file
diff --git a/npc/warps/dungeons/alde_ct.txt b/npc/warps/dungeons/alde_ct.txt
index b86949b49..9e10b2ce3 100644
--- a/npc/warps/dungeons/alde_ct.txt
+++ b/npc/warps/dungeons/alde_ct.txt
@@ -1,216 +1,216 @@
-//===== Athena Script ========================================
-//= Al de Baran Clock Tower Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Clock Tower
-//===== Additional Comments: =================================
-//= Split off Aldebaran.txt 1.1 fixed clt007 warp
-//= 1.3 Optimized [Lupus]
-//= 1.4 Removed Duplicates [Silent]
-//============================================================
-
-//= Al De Baran Clock Tower
-aldebaran.gat,139,135,0 warp ald002 1,1,c_tower1.gat,199,159
-c_tower1.gat,200,157,0 warp ald003 1,1,aldebaran.gat,139,131
-c_tower1.gat,235,226,0 warp clt001 1,1,c_tower2.gat,268,26
-c_tower1.gat,123,22,0 warp clt002 1,1,alde_dun01.gat,297,25
-c_tower2.gat,142,283,0 warp clt003 1,1,c_tower3.gat,65,147
-c_tower2.gat,24,24,0 warp clt004 1,1,alde_dun03.gat,277,178
-c_tower2.gat,273,26,0 warp clt005 1,1,c_tower1.gat,235,223
-
-//============================================================
-//= Level 2 ==================================================
-//= Random 2-1 ===============================================
-c_tower2.gat,13,288,4 script clt006r 45,1,1,{
- set @r,rand(3);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",13,282; end;
- w2: warp "alde_dun03.gat",175,131; end;
- w3: warp "c_tower3.gat",235,7; end;
-}
-//============================================================
-//= Random 2-2 ===============================================
-c_tower2.gat,223,267,4 script clt007r 45,1,1,{
- set @r,rand(3);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",288,267; end;
- w2: warp "alde_dun03.gat",130,130; end;
- w3: warp "c_tower3.gat",252,29; end;
-}
-//============================================================
-//= Level 3 ==================================================
-c_tower3.gat,60,147,0 warp clt009 1,1,c_tower2.gat,148,283
-c_tower3.gat,212,159,0 warp clt010 1,1,alde_dun03.gat,276,53
-c_tower3.gat,7,39,0 warp clt011 1,1,alde_dun01.gat,171,158
-c_tower3.gat,42,41,0 warp clt012 1,1,alde_dun02.gat,127,169
-c_tower3.gat,146,8,0 warp clt013 1,1,c_tower1.gat,235,223
-//============================================================
-//= Random 3-1 ===============================================
-c_tower3.gat,163,252,4 script clt014r 45,1,1,{
- if(rand(2)) {
- warp "c_tower3.gat",168,252;
- } else {
- warp "alde_dun02.gat",262,41;
- }
- end;
-}
-//============================================================
-//= Random 3-2 ===============================================
-c_tower3.gat,240,7,4 script clt015r 45,1,1,{
- set @r,rand(3);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",13,282; end;
- w2: warp "alde_dun03.gat",175,131; end;
- w3: warp "c_tower3.gat",235,7; end;
-}
-//============================================================
-//= Random 3-3 ===============================================
-c_tower3.gat,252,24,4 script clt016r 45,1,1,{
- set @r,rand(3);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",228,267; end;
- w2: warp "alde_dun03.gat",130,130; end;
- w3: warp "c_tower3.gat",252,29; end;
-}
-//============================================================
-//= Level 4 ==================================================
-c_tower4.gat,37,70,0 warp clt017 1,1,alde_dun03.gat,277,54
-c_tower4.gat,51,156,0 warp clt018 1,1,alde_dun01.gat,171,158
-c_tower4.gat,68,46,0 warp clt019 1,1,c_tower4.gat,73,154
-c_tower4.gat,70,19,0 warp clt020 2,2,c_tower3.gat,151,8
-c_tower4.gat,79,49,0 warp clt021 2,2,c_tower4.gat,204,60
-c_tower4.gat,133,202,0 warp clt022 1,1,c_tower4.gat,140,149
-c_tower4.gat,153,107,0 warp clt023 1,1,c_tower2.gat,228,267
-c_tower4.gat,171,179,0 warp clt024 1,1,alde_dun03.gat,276,53
-c_tower4.gat,198,59,0 warp clt025 1,1,c_tower4.gat,152,98
-c_tower4.gat,204,57,0 warp clt026 1,1,c_tower4.gat,65,77
-//============================================================
-//= Random 4-1 ===============================================
-c_tower4.gat,75,156,4 script clt027r 45,0,0,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower3.gat",168,252; end;
- w2: warp "alde_dun02.gat",262,41; end;
- w3: warp "c_tower4.gat",73,154; end;
- w4: warp "c_tower4.gat",140,149; end;
-}
-//============================================================
-//= Random 4-2 ===============================================
-c_tower4.gat,68,79,4 script clt028r 45,0,0,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower2.gat",13,282; end;
- w2: warp "alde_dun03.gat",175,131; end;
- w3: warp "c_tower3.gat",235,7; end;
- w4: warp "c_tower4.gat",65,77; end;
-}
-//============================================================
-//= Random 4-3 ===============================================
-c_tower4.gat,142,151,4 script clt029r 45,0,0,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower3.gat",168,252; end;
- w2: warp "alde_dun02.gat",262,41; end;
- w3: warp "c_tower4.gat",73,154; end;
- w4: warp "c_tower4.gat",140,149; end;
-}
-//============================================================
-//= Random 4-4 ===============================================
-c_tower4.gat,151,96,4 script clt030r 45,0,0,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower2.gat",228,267; end;
- w2: warp "alde_dun03.gat",130,130; end;
- w3: warp "c_tower3.gat",252,29; end;
- w4: warp "c_tower4.gat",152,95; end;
-}
-//============================================================
-//= Random 4-5 ===============================================
-c_tower4.gat,189,40,4 script clt031r 45,2,2,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower2.gat",228,267; end;
- w2: warp "alde_dun03.gat",130,130; end;
- w3: warp "c_tower3.gat",252,29; end;
- w4: warp "c_tower4.gat",152,95; end;
-}
-//============================================================
-//============================================================
-alde_dun01.gat,292,306,0 warp aldd01 2,1,alde_dun02.gat,43,24
-alde_dun01.gat,167,158,0 warp ald002 2,2,c_tower2.gat,148,283
-alde_dun01.gat,302,25,0 warp ald003 2,2,c_tower1.gat,125,22
-alde_dun02.gat,43,20,0 warp aldd04 1,1,alde_dun01.gat,292,300
-alde_dun02.gat,279,250,0 warp aldd05 2,2,alde_dun03.gat,18,267
-alde_dun02.gat,122,169,0 warp ald006 2,2,c_tower3.gat,47,41
-alde_dun02.gat,187,234,0 warp ald007 2,2,c_tower3.gat,65,147
-//============================================================
-//= Random B2 ================================================
-alde_dun02.gat,267,41,4 script ald008r 45,1,1,{
- if(rand(2)) {
- warp "c_tower3.gat",168,252;
- } else {
- warp "alde_dun02.gat",262,141;
- }
- end;
-}
-alde_dun03.gat,12,267,0 warp aldd09 2,2,alde_dun02.gat,273,250
-alde_dun03.gat,277,183,0 warp ald010 2,2,c_tower2.gat,27,27
-alde_dun03.gat,191,31,0 warp ald011 2,2,c_tower3.gat,217,159
-alde_dun03.gat,276,48,0 warp ald012 2,2,c_tower1.gat,235,223
-//============================================================
-//7(npc)
-//= Random B3-1 ================================================
-alde_dun03.gat,130,125,4 script ald014r 45,1,1,{
- set @r,rand(3);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",228,267; end;
- w2: warp "alde_dun03.gat",130,130; end;
- w3: warp "c_tower3.gat",252,29; end;
-}
-//============================================================
-//= Random 3-2 ===============================================
-alde_dun03.gat,171,127,4 script ald015r 45,1,1,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- warp "c_tower2.gat",13,282; end;
- w2: warp "alde_dun03.gat",175,131; end;
- w3: warp "c_tower3.gat",235,7; end;
-}
-alde_dun04.gat,80,273,0 warp aldd016 2,2,alde_dun03.gat,263,26
-alde_dun04.gat,207,225,0 warp ald017 1,1,c_tower3.gat,7,34
-alde_dun04.gat,215,192,0 warp ald018 1,1,c_tower2.gat,148,283
-alde_dun04.gat,32,74,0 warp aldd19 1,1,alde_dun02.gat,187,239
-alde_dun04.gat,208,58,0 warp aldd20 2,2,alde_dun04.gat,268,74
-alde_dun04.gat,272,74,0 warp aldd021 2,2,alde_dun04.gat,204,62
-alde_dun04.gat,80,34,4 script ald022r 45,1,1,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "c_tower2.gat",13,282; end;
- w2: warp "alde_dun03.gat",175,131; end;
- w3: warp "c_tower3.gat",235,7; end;
- w4: warp "alde_dun04.gat",84,36; end;
-}
-//============================================================
+//===== Athena Script ========================================
+//= Al de Baran Clock Tower Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Clock Tower
+//===== Additional Comments: =================================
+//= Split off Aldebaran.txt 1.1 fixed clt007 warp
+//= 1.3 Optimized [Lupus]
+//= 1.4 Removed Duplicates [Silent]
+//============================================================
+
+//= Al De Baran Clock Tower
+aldebaran.gat,139,135,0 warp ald002 1,1,c_tower1.gat,199,159
+c_tower1.gat,200,157,0 warp ald003 1,1,aldebaran.gat,139,131
+c_tower1.gat,235,226,0 warp clt001 1,1,c_tower2.gat,268,26
+c_tower1.gat,123,22,0 warp clt002 1,1,alde_dun01.gat,297,25
+c_tower2.gat,142,283,0 warp clt003 1,1,c_tower3.gat,65,147
+c_tower2.gat,24,24,0 warp clt004 1,1,alde_dun03.gat,277,178
+c_tower2.gat,273,26,0 warp clt005 1,1,c_tower1.gat,235,223
+
+//============================================================
+//= Level 2 ==================================================
+//= Random 2-1 ===============================================
+c_tower2.gat,13,288,4 script clt006r 45,1,1,{
+ set @r,rand(3);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",13,282; end;
+ w2: warp "alde_dun03.gat",175,131; end;
+ w3: warp "c_tower3.gat",235,7; end;
+}
+//============================================================
+//= Random 2-2 ===============================================
+c_tower2.gat,223,267,4 script clt007r 45,1,1,{
+ set @r,rand(3);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",288,267; end;
+ w2: warp "alde_dun03.gat",130,130; end;
+ w3: warp "c_tower3.gat",252,29; end;
+}
+//============================================================
+//= Level 3 ==================================================
+c_tower3.gat,60,147,0 warp clt009 1,1,c_tower2.gat,148,283
+c_tower3.gat,212,159,0 warp clt010 1,1,alde_dun03.gat,276,53
+c_tower3.gat,7,39,0 warp clt011 1,1,alde_dun01.gat,171,158
+c_tower3.gat,42,41,0 warp clt012 1,1,alde_dun02.gat,127,169
+c_tower3.gat,146,8,0 warp clt013 1,1,c_tower1.gat,235,223
+//============================================================
+//= Random 3-1 ===============================================
+c_tower3.gat,163,252,4 script clt014r 45,1,1,{
+ if(rand(2)) {
+ warp "c_tower3.gat",168,252;
+ } else {
+ warp "alde_dun02.gat",262,41;
+ }
+ end;
+}
+//============================================================
+//= Random 3-2 ===============================================
+c_tower3.gat,240,7,4 script clt015r 45,1,1,{
+ set @r,rand(3);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",13,282; end;
+ w2: warp "alde_dun03.gat",175,131; end;
+ w3: warp "c_tower3.gat",235,7; end;
+}
+//============================================================
+//= Random 3-3 ===============================================
+c_tower3.gat,252,24,4 script clt016r 45,1,1,{
+ set @r,rand(3);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",228,267; end;
+ w2: warp "alde_dun03.gat",130,130; end;
+ w3: warp "c_tower3.gat",252,29; end;
+}
+//============================================================
+//= Level 4 ==================================================
+c_tower4.gat,37,70,0 warp clt017 1,1,alde_dun03.gat,277,54
+c_tower4.gat,51,156,0 warp clt018 1,1,alde_dun01.gat,171,158
+c_tower4.gat,68,46,0 warp clt019 1,1,c_tower4.gat,73,154
+c_tower4.gat,70,19,0 warp clt020 2,2,c_tower3.gat,151,8
+c_tower4.gat,79,49,0 warp clt021 2,2,c_tower4.gat,204,60
+c_tower4.gat,133,202,0 warp clt022 1,1,c_tower4.gat,140,149
+c_tower4.gat,153,107,0 warp clt023 1,1,c_tower2.gat,228,267
+c_tower4.gat,171,179,0 warp clt024 1,1,alde_dun03.gat,276,53
+c_tower4.gat,198,59,0 warp clt025 1,1,c_tower4.gat,152,98
+c_tower4.gat,204,57,0 warp clt026 1,1,c_tower4.gat,65,77
+//============================================================
+//= Random 4-1 ===============================================
+c_tower4.gat,75,156,4 script clt027r 45,0,0,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower3.gat",168,252; end;
+ w2: warp "alde_dun02.gat",262,41; end;
+ w3: warp "c_tower4.gat",73,154; end;
+ w4: warp "c_tower4.gat",140,149; end;
+}
+//============================================================
+//= Random 4-2 ===============================================
+c_tower4.gat,68,79,4 script clt028r 45,0,0,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower2.gat",13,282; end;
+ w2: warp "alde_dun03.gat",175,131; end;
+ w3: warp "c_tower3.gat",235,7; end;
+ w4: warp "c_tower4.gat",65,77; end;
+}
+//============================================================
+//= Random 4-3 ===============================================
+c_tower4.gat,142,151,4 script clt029r 45,0,0,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower3.gat",168,252; end;
+ w2: warp "alde_dun02.gat",262,41; end;
+ w3: warp "c_tower4.gat",73,154; end;
+ w4: warp "c_tower4.gat",140,149; end;
+}
+//============================================================
+//= Random 4-4 ===============================================
+c_tower4.gat,151,96,4 script clt030r 45,0,0,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower2.gat",228,267; end;
+ w2: warp "alde_dun03.gat",130,130; end;
+ w3: warp "c_tower3.gat",252,29; end;
+ w4: warp "c_tower4.gat",152,95; end;
+}
+//============================================================
+//= Random 4-5 ===============================================
+c_tower4.gat,189,40,4 script clt031r 45,2,2,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower2.gat",228,267; end;
+ w2: warp "alde_dun03.gat",130,130; end;
+ w3: warp "c_tower3.gat",252,29; end;
+ w4: warp "c_tower4.gat",152,95; end;
+}
+//============================================================
+//============================================================
+alde_dun01.gat,292,306,0 warp aldd01 2,1,alde_dun02.gat,43,24
+alde_dun01.gat,167,158,0 warp ald002 2,2,c_tower2.gat,148,283
+alde_dun01.gat,302,25,0 warp ald003 2,2,c_tower1.gat,125,22
+alde_dun02.gat,43,20,0 warp aldd04 1,1,alde_dun01.gat,292,300
+alde_dun02.gat,279,250,0 warp aldd05 2,2,alde_dun03.gat,18,267
+alde_dun02.gat,122,169,0 warp ald006 2,2,c_tower3.gat,47,41
+alde_dun02.gat,187,234,0 warp ald007 2,2,c_tower3.gat,65,147
+//============================================================
+//= Random B2 ================================================
+alde_dun02.gat,267,41,4 script ald008r 45,1,1,{
+ if(rand(2)) {
+ warp "c_tower3.gat",168,252;
+ } else {
+ warp "alde_dun02.gat",262,141;
+ }
+ end;
+}
+alde_dun03.gat,12,267,0 warp aldd09 2,2,alde_dun02.gat,273,250
+alde_dun03.gat,277,183,0 warp ald010 2,2,c_tower2.gat,27,27
+alde_dun03.gat,191,31,0 warp ald011 2,2,c_tower3.gat,217,159
+alde_dun03.gat,276,48,0 warp ald012 2,2,c_tower1.gat,235,223
+//============================================================
+//7(npc)
+//= Random B3-1 ================================================
+alde_dun03.gat,130,125,4 script ald014r 45,1,1,{
+ set @r,rand(3);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",228,267; end;
+ w2: warp "alde_dun03.gat",130,130; end;
+ w3: warp "c_tower3.gat",252,29; end;
+}
+//============================================================
+//= Random 3-2 ===============================================
+alde_dun03.gat,171,127,4 script ald015r 45,1,1,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ warp "c_tower2.gat",13,282; end;
+ w2: warp "alde_dun03.gat",175,131; end;
+ w3: warp "c_tower3.gat",235,7; end;
+}
+alde_dun04.gat,80,273,0 warp aldd016 2,2,alde_dun03.gat,263,26
+alde_dun04.gat,207,225,0 warp ald017 1,1,c_tower3.gat,7,34
+alde_dun04.gat,215,192,0 warp ald018 1,1,c_tower2.gat,148,283
+alde_dun04.gat,32,74,0 warp aldd19 1,1,alde_dun02.gat,187,239
+alde_dun04.gat,208,58,0 warp aldd20 2,2,alde_dun04.gat,268,74
+alde_dun04.gat,272,74,0 warp aldd021 2,2,alde_dun04.gat,204,62
+alde_dun04.gat,80,34,4 script ald022r 45,1,1,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "c_tower2.gat",13,282; end;
+ w2: warp "alde_dun03.gat",175,131; end;
+ w3: warp "c_tower3.gat",235,7; end;
+ w4: warp "alde_dun04.gat",84,36; end;
+}
+//============================================================
diff --git a/npc/warps/dungeons/amatsu_dun.txt b/npc/warps/dungeons/amatsu_dun.txt
index 123c2634c..981b3cd19 100644
--- a/npc/warps/dungeons/amatsu_dun.txt
+++ b/npc/warps/dungeons/amatsu_dun.txt
@@ -1,21 +1,21 @@
-//===== Athena Script ========================================
-//= Amatsu Dungeon Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Amatsu
-//===== Additional Comments: =================================
-//= Split off amatsu.txt
-//============================================================
-
-//= Amatsu Dungeon ===========================================
-//disabled due to amatsu dungeon quest
-//ama_dun01.gat,228,6,0 warp warp8007 1,1,ama_test.gat,50,87
-ama_dun01.gat,234,143,0 warp warp8008 1,1,ama_dun02.gat,31,41
-ama_dun02.gat,196,124,0 warp warp8010 1,1,ama_dun03.gat,119,14
-ama_dun02.gat,29,41,0 warp warp8009 1,1,ama_dun01.gat,231,143
+//===== Athena Script ========================================
+//= Amatsu Dungeon Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Amatsu
+//===== Additional Comments: =================================
+//= Split off amatsu.txt
+//============================================================
+
+//= Amatsu Dungeon ===========================================
+//disabled due to amatsu dungeon quest
+//ama_dun01.gat,228,6,0 warp warp8007 1,1,ama_test.gat,50,87
+ama_dun01.gat,234,143,0 warp warp8008 1,1,ama_dun02.gat,31,41
+ama_dun02.gat,196,124,0 warp warp8010 1,1,ama_dun03.gat,119,14
+ama_dun02.gat,29,41,0 warp warp8009 1,1,ama_dun01.gat,231,143
ama_dun03.gat,119,9,0 warp warp8011 1,1,ama_dun02.gat,196,121 \ No newline at end of file
diff --git a/npc/warps/dungeons/ant_hell.txt b/npc/warps/dungeons/ant_hell.txt
index 1fc483850..383ba2f04 100644
--- a/npc/warps/dungeons/ant_hell.txt
+++ b/npc/warps/dungeons/ant_hell.txt
@@ -1,34 +1,34 @@
-//===== Athena Script ========================================
-//= Ant Hell Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Ant Hell
-//===== Additional Comments: =================================
-//= 1.3 Changed var anthell to @anthell. Optimized [Lupus]
-//= 1.4 Removed Duplicates [Silent]
-//============================================================
-
-//= Ant Hell =================================================
-anthell01.gat,35,267,0 script ant001 45,1,1,{
- if(@anthell) {
- warp "moc_fild15.gat",251,248;
- } else {
- warp "moc_fild04.gat",213,327;
- }
- end;
-}
-anthell02.gat,171,169,0 script ant002 45,1,2,{
- if(@anthell) {
- warp "moc_fild04.gat",213,327;
- } else {
- warp "moc_fild15.gat",251,248;
- }
- end;
-}
-anthell01.gat,253,32,0 warp ant01 2,1,anthell02.gat,34,263
-anthell02.gat,32,267,0 warp ant01-1 2,2,anthell01.gat,253,35
+//===== Athena Script ========================================
+//= Ant Hell Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Ant Hell
+//===== Additional Comments: =================================
+//= 1.3 Changed var anthell to @anthell. Optimized [Lupus]
+//= 1.4 Removed Duplicates [Silent]
+//============================================================
+
+//= Ant Hell =================================================
+anthell01.gat,35,267,0 script ant001 45,1,1,{
+ if(@anthell) {
+ warp "moc_fild15.gat",251,248;
+ } else {
+ warp "moc_fild04.gat",213,327;
+ }
+ end;
+}
+anthell02.gat,171,169,0 script ant002 45,1,2,{
+ if(@anthell) {
+ warp "moc_fild04.gat",213,327;
+ } else {
+ warp "moc_fild15.gat",251,248;
+ }
+ end;
+}
+anthell01.gat,253,32,0 warp ant01 2,1,anthell02.gat,34,263
+anthell02.gat,32,267,0 warp ant01-1 2,2,anthell01.gat,253,35
diff --git a/npc/warps/dungeons/ayo_dun.txt b/npc/warps/dungeons/ayo_dun.txt
index 1a3a9cc15..968d13d9d 100644
--- a/npc/warps/dungeons/ayo_dun.txt
+++ b/npc/warps/dungeons/ayo_dun.txt
@@ -1,21 +1,21 @@
-//===== Athena Script ========================================
-//= Ayothaya Dungeon Warp Script
-//===== By: ==================================================
-//= eAthena Team (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 10+
-//===== Description: =========================================
-//= Warp Points for Ayothaya Dungeon
-//===== Additional Comments: =================================
-//= 1.0 Splitted 2 files [Lupus]
-//= Should some warps be disabled due to Dungeon Quest?
-//============================================================
-
-
-//Dungeon
-ayo_fild02.gat,285,150,0 warp ayodunwrp001 2,2,ayo_dun01.gat,275,17
-ayo_dun01.gat,275,14,0 warp ayodunwrp002 2,2,ayo_fild02.gat,282,150
-ayo_dun02.gat,24,21,0 warp ayodunwrp003 2,2,ayo_dun01.gat,24,281
-ayo_dun02.gat,275,21,0 warp ayodunwrp004 2,2,ayo_dun01.gat,24,281
+//===== Athena Script ========================================
+//= Ayothaya Dungeon Warp Script
+//===== By: ==================================================
+//= eAthena Team (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 10+
+//===== Description: =========================================
+//= Warp Points for Ayothaya Dungeon
+//===== Additional Comments: =================================
+//= 1.0 Splitted 2 files [Lupus]
+//= Should some warps be disabled due to Dungeon Quest?
+//============================================================
+
+
+//Dungeon
+ayo_fild02.gat,285,150,0 warp ayodunwrp001 2,2,ayo_dun01.gat,275,17
+ayo_dun01.gat,275,14,0 warp ayodunwrp002 2,2,ayo_fild02.gat,282,150
+ayo_dun02.gat,24,21,0 warp ayodunwrp003 2,2,ayo_dun01.gat,24,281
+ayo_dun02.gat,275,21,0 warp ayodunwrp004 2,2,ayo_dun01.gat,24,281
diff --git a/npc/warps/dungeons/coal_mine.txt b/npc/warps/dungeons/coal_mine.txt
index 7ad8ef934..294bd1a6f 100644
--- a/npc/warps/dungeons/coal_mine.txt
+++ b/npc/warps/dungeons/coal_mine.txt
@@ -1,22 +1,22 @@
-//===== Athena Script ========================================
-//= Coal Mine Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Coal Mines
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Coal Mine ================================================
-mjo_dun01.gat,14,283,0 warp mjod01 2,4,mjo_dun02.gat,381,343
-mjo_dun01.gat,52,14,0 warp mjod001 4,2,mjolnir_02.gat,79,363
-mjo_dun02.gat,31,21,0 warp mjod02 1,1,mjo_dun03.gat,302,262
-mjo_dun02.gat,384,343,0 warp mjod01-1 2,4,mjo_dun01.gat,17,283
-mjo_dun02.gat,39,21,0 warp mjod03 1,1,mjo_dun03.gat,308,262
-mjo_dun03.gat,302,264,0 warp mjod02-1 1,1,mjo_dun02.gat,31,23
+//===== Athena Script ========================================
+//= Coal Mine Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Coal Mines
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Coal Mine ================================================
+mjo_dun01.gat,14,283,0 warp mjod01 2,4,mjo_dun02.gat,381,343
+mjo_dun01.gat,52,14,0 warp mjod001 4,2,mjolnir_02.gat,79,363
+mjo_dun02.gat,31,21,0 warp mjod02 1,1,mjo_dun03.gat,302,262
+mjo_dun02.gat,384,343,0 warp mjod01-1 2,4,mjo_dun01.gat,17,283
+mjo_dun02.gat,39,21,0 warp mjod03 1,1,mjo_dun03.gat,308,262
+mjo_dun03.gat,302,264,0 warp mjod02-1 1,1,mjo_dun02.gat,31,23
mjo_dun03.gat,308,264,0 warp mjod03-1 1,1,mjo_dun02.gat,39,23 \ No newline at end of file
diff --git a/npc/warps/dungeons/com_dun.txt b/npc/warps/dungeons/com_dun.txt
index faaf38422..93621db03 100644
--- a/npc/warps/dungeons/com_dun.txt
+++ b/npc/warps/dungeons/com_dun.txt
@@ -1,19 +1,19 @@
-//===== Athena Script ========================================
-//= Comodo Dungeon Warp
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points Comodo Dungeon
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//Beach Dungeon ==================================================
-beach_dun.gat,276,67,0 warp cmd004 1,1,comodo.gat,31,215
-beach_dun2.gat,154,13,0 warp cmd005 2,1,comodo.gat,176,353
-beach_dun3.gat,17,265,0 warp cmd007 1,1,comodo.gat,328,175
+//===== Athena Script ========================================
+//= Comodo Dungeon Warp
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points Comodo Dungeon
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//Beach Dungeon ==================================================
+beach_dun.gat,276,67,0 warp cmd004 1,1,comodo.gat,31,215
+beach_dun2.gat,154,13,0 warp cmd005 2,1,comodo.gat,176,353
+beach_dun3.gat,17,265,0 warp cmd007 1,1,comodo.gat,328,175
beach_dun3.gat,286,57,0 warp cmd006 1,1,cmd_fild01.gat,30,317 \ No newline at end of file
diff --git a/npc/warps/dungeons/ein_dun.txt b/npc/warps/dungeons/ein_dun.txt
index 71811e9c9..8b2f440aa 100644
--- a/npc/warps/dungeons/ein_dun.txt
+++ b/npc/warps/dungeons/ein_dun.txt
@@ -1,19 +1,19 @@
-//===== Athena Script ========================================
-//= Einbroch Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.3), SSUNNY@YOUNG(1.4)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Einbroch
-//===== Additional Comments: =================================
-//= 1.4 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
-//============================================================
-
-//Dungeon Warps
-einbech.gat,138,252,0 warp eib_d01 1,1,ein_dun01.gat,22,14
-ein_dun01.gat,22,11,0 warp eib_d01a 1,1,einbech.gat,138,249
-ein_dun01.gat,262,256,0 warp ein012 1,1,ein_dun02.gat,292,290
-ein_dun02.gat,292,292,0 warp ein012a 1,1,ein_dun01.gat,262,258
+//===== Athena Script ========================================
+//= Einbroch Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.3), SSUNNY@YOUNG(1.4)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Einbroch
+//===== Additional Comments: =================================
+//= 1.4 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+//============================================================
+
+//Dungeon Warps
+einbech.gat,138,252,0 warp eib_d01 1,1,ein_dun01.gat,22,14
+ein_dun01.gat,22,11,0 warp eib_d01a 1,1,einbech.gat,138,249
+ein_dun01.gat,262,256,0 warp ein012 1,1,ein_dun02.gat,292,290
+ein_dun02.gat,292,292,0 warp ein012a 1,1,ein_dun01.gat,262,258
diff --git a/npc/warps/dungeons/geffen_dun.txt b/npc/warps/dungeons/geffen_dun.txt
index 3e4925550..65342e53e 100644
--- a/npc/warps/dungeons/geffen_dun.txt
+++ b/npc/warps/dungeons/geffen_dun.txt
@@ -1,46 +1,46 @@
-//===== Athena Script ========================================
-//= Geffen Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Geffen Tower
-//===== Additional Comments: =================================
-//= Removed the warp from gef_dun02.gat to gef_dun03.gat, [MasterOfMuppets]
-//= gef_dun03.gat is just an event map...
-//============================================================
-
-//= Geffen Tower =============================================
-gef_tower.gat,106,115,0 warp geft01 1,1,gef_tower.gat,106,72
-gef_tower.gat,106,69,0 warp geft01-1 1,1,gef_tower.gat,106,112
-gef_tower.gat,44,36,0 warp geft02 1,1,gef_tower.gat,106,162
-gef_tower.gat,106,158,0 warp geft02-1 1,1,gef_tower.gat,44,33
-gef_tower.gat,118,68,0 warp geft03 1,1,gef_tower.gat,116,28
-gef_tower.gat,116,31,0 warp geft03-1 1,1,gef_tower.gat,118,71
-gef_tower.gat,120,158,0 warp geft04 1,1,gef_tower.gat,118,111
-gef_tower.gat,118,114,0 warp geft04-1 1,1,gef_tower.gat,120,161
-gef_tower.gat,158,104,0 warp geft05 2,2,gef_tower.gat,156,90
-gef_tower.gat,156,93,0 warp geft05-1 2,2,gef_tower.gat,158,107
-gef_tower.gat,158,150,0 warp geft06 1,2,gef_tower.gat,158,124
-gef_tower.gat,158,128,0 warp geft06-1 2,1,gef_tower.gat,158,153
-gef_tower.gat,158,174,0 warp geft07 2,1,gef_tower.gat,52,140
-gef_tower.gat,52,136,0 warp geft07-1 2,1,gef_tower.gat,158,169
-gef_tower.gat,38,160,0 warp geft08 2,1,gef_tower.gat,42,90
-gef_tower.gat,42,86,0 warp geft08-1 1,1,gef_tower.gat,38,157
-gef_tower.gat,66,156,0 warp geft08-2 2,1,gef_tower.gat,42,90
-gef_tower.gat,153,28,0 warp gef005 4,2,gef_dun00.gat,104,99
-gef_tower.gat,52,181,0 warp gef006 4,1,geffen.gat,120,110
-gef_tower.gat,60,32,0 warp geft09 1,1,gef_tower.gat,62,90
-gef_tower.gat,62,87,0 warp geft09-1 1,1,gef_tower.gat,60,30
-
-//= Geffen Dungeon =============================================
-gef_dun00.gat,104,103,0 warp gef024 3,3,gef_tower.gat,153,31
-gef_dun00.gat,107,169,0 warp gefd01 2,1,gef_dun01.gat,115,236
-gef_dun01.gat,115,240,0 warp gefd01-1 2,2,gef_dun00.gat,107,165
-gef_dun01.gat,197,38,0 warp gefd02 2,1,gef_dun02.gat,106,132
-gef_dun02.gat,106,134,0 warp gefd02-1 2,1,gef_dun01.gat,197,40
-//gef_dun02.gat,215,67,0 warp gefd03 2,1,gef_dun03.gat,203,200
+//===== Athena Script ========================================
+//= Geffen Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Geffen Tower
+//===== Additional Comments: =================================
+//= Removed the warp from gef_dun02.gat to gef_dun03.gat, [MasterOfMuppets]
+//= gef_dun03.gat is just an event map...
+//============================================================
+
+//= Geffen Tower =============================================
+gef_tower.gat,106,115,0 warp geft01 1,1,gef_tower.gat,106,72
+gef_tower.gat,106,69,0 warp geft01-1 1,1,gef_tower.gat,106,112
+gef_tower.gat,44,36,0 warp geft02 1,1,gef_tower.gat,106,162
+gef_tower.gat,106,158,0 warp geft02-1 1,1,gef_tower.gat,44,33
+gef_tower.gat,118,68,0 warp geft03 1,1,gef_tower.gat,116,28
+gef_tower.gat,116,31,0 warp geft03-1 1,1,gef_tower.gat,118,71
+gef_tower.gat,120,158,0 warp geft04 1,1,gef_tower.gat,118,111
+gef_tower.gat,118,114,0 warp geft04-1 1,1,gef_tower.gat,120,161
+gef_tower.gat,158,104,0 warp geft05 2,2,gef_tower.gat,156,90
+gef_tower.gat,156,93,0 warp geft05-1 2,2,gef_tower.gat,158,107
+gef_tower.gat,158,150,0 warp geft06 1,2,gef_tower.gat,158,124
+gef_tower.gat,158,128,0 warp geft06-1 2,1,gef_tower.gat,158,153
+gef_tower.gat,158,174,0 warp geft07 2,1,gef_tower.gat,52,140
+gef_tower.gat,52,136,0 warp geft07-1 2,1,gef_tower.gat,158,169
+gef_tower.gat,38,160,0 warp geft08 2,1,gef_tower.gat,42,90
+gef_tower.gat,42,86,0 warp geft08-1 1,1,gef_tower.gat,38,157
+gef_tower.gat,66,156,0 warp geft08-2 2,1,gef_tower.gat,42,90
+gef_tower.gat,153,28,0 warp gef005 4,2,gef_dun00.gat,104,99
+gef_tower.gat,52,181,0 warp gef006 4,1,geffen.gat,120,110
+gef_tower.gat,60,32,0 warp geft09 1,1,gef_tower.gat,62,90
+gef_tower.gat,62,87,0 warp geft09-1 1,1,gef_tower.gat,60,30
+
+//= Geffen Dungeon =============================================
+gef_dun00.gat,104,103,0 warp gef024 3,3,gef_tower.gat,153,31
+gef_dun00.gat,107,169,0 warp gefd01 2,1,gef_dun01.gat,115,236
+gef_dun01.gat,115,240,0 warp gefd01-1 2,2,gef_dun00.gat,107,165
+gef_dun01.gat,197,38,0 warp gefd02 2,1,gef_dun02.gat,106,132
+gef_dun02.gat,106,134,0 warp gefd02-1 2,1,gef_dun01.gat,197,40
+//gef_dun02.gat,215,67,0 warp gefd03 2,1,gef_dun03.gat,203,200
gef_dun03.gat,203,204,0 warp gefd03-1 2,1,gef_dun02.gat,215,63 \ No newline at end of file
diff --git a/npc/warps/dungeons/gon_dun.txt b/npc/warps/dungeons/gon_dun.txt
index 6474ca29e..709e36767 100644
--- a/npc/warps/dungeons/gon_dun.txt
+++ b/npc/warps/dungeons/gon_dun.txt
@@ -1,40 +1,40 @@
-//===== Athena Script ========================================
-//= Gonryun Dungeon Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Gonryun
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Gonryun Dungeon ==========================================
-gon_dun01.gat,153,45,0 warp gon20 1,1,gonryun.gat,159,198
-gon_dun01.gat,162,273,0 warp gon21 1,1,gon_dun02.gat,17,113
-gon_dun02.gat,14,113,0 warp gon22 1,1,gon_dun01.gat,162,270
-gon_dun02.gat,56,119,0 warp gon23 1,1,gon_dun02.gat,47,210/*‘ŠŒÝF*/
-gon_dun02.gat,92,190,0 warp gon24 1,1,gon_dun02.gat,199,20/*‘ŠŒÝE*/
-gon_dun02.gat,44,213,0 warp gon25 1,1,gon_dun02.gat,51,119/*‘ŠŒÝF*/
-gon_dun02.gat,44,166,0 warp gon26 1,1,gon_dun02.gat,97,121/*Šm’è*/
-gon_dun02.gat,94,118,0 warp gon27 1,1,gon_dun02.gat,177,189/*Šm’è*/
-gon_dun02.gat,76,100,0 warp gon28 1,1,gon_dun02.gat,145,62/*Šm’è*/
-gon_dun02.gat,63,66,0 warp gon29 1,1,gon_dun02.gat,203,94/*‘ŠŒÝA*/
-gon_dun02.gat,86,44,0 warp gon30 1,1,gon_dun02.gat,145,233/*Šm’è*/
-gon_dun02.gat,148,236,0 warp gon31 1,1,gon_dun02.gat,234,194/*‘ŠŒÝD*/
-gon_dun02.gat,171,258,0 warp gon32 1,1,gon_dun02.gat,76,96/*Šm’è*/
-gon_dun02.gat,180,189,0 warp gon33 1,1,gon_dun02.gat,170,164/*Šm’è*/
-gon_dun02.gat,165,189,0 warp gon34 1,1,gon_dun02.gat,235,135/*‘ŠŒÝC*/
-gon_dun02.gat,170,161,0 warp gon35 1,1,gon_dun02.gat,89,41/*Šm’è*/
-gon_dun02.gat,168,92,0 warp gon36 1,1,gon_dun02.gat,273,76/*‘ŠŒÝB*/
-gon_dun02.gat,145,66,0 warp gon37 1,1,gon_dun02.gat,199,20/*Šm’è*/
-gon_dun02.gat,234,191,0 warp gon38 1,1,gon_dun02.gat,145,233/*‘ŠŒÝD*/
-gon_dun02.gat,235,138,0 warp gon39 1,1,gon_dun02.gat,168,189/*‘ŠŒÝC*/
-gon_dun02.gat,199,94,0 warp gon40 1,1,gon_dun02.gat,60,70/*‘ŠŒÝA*/
-gon_dun02.gat,276,76,0 warp gon41 1,1,gon_dun02.gat,163,87/*‘ŠŒÝB*/
-gon_dun02.gat,196,20,0 warp gon42 1,1,gon_dun02.gat,95,190/*‘ŠŒÝE*/
-gon_dun02.gat,251,268,0 warp gon43 1,1,gon_dun03.gat,68,9
-gon_dun03.gat,68,6,0 warp gon44 1,1,gon_dun02.gat,251,265
+//===== Athena Script ========================================
+//= Gonryun Dungeon Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Gonryun
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Gonryun Dungeon ==========================================
+gon_dun01.gat,153,45,0 warp gon20 1,1,gonryun.gat,159,198
+gon_dun01.gat,162,273,0 warp gon21 1,1,gon_dun02.gat,17,113
+gon_dun02.gat,14,113,0 warp gon22 1,1,gon_dun01.gat,162,270
+gon_dun02.gat,56,119,0 warp gon23 1,1,gon_dun02.gat,47,210/*‘ŠŒÝF*/
+gon_dun02.gat,92,190,0 warp gon24 1,1,gon_dun02.gat,199,20/*‘ŠŒÝE*/
+gon_dun02.gat,44,213,0 warp gon25 1,1,gon_dun02.gat,51,119/*‘ŠŒÝF*/
+gon_dun02.gat,44,166,0 warp gon26 1,1,gon_dun02.gat,97,121/*Šm’è*/
+gon_dun02.gat,94,118,0 warp gon27 1,1,gon_dun02.gat,177,189/*Šm’è*/
+gon_dun02.gat,76,100,0 warp gon28 1,1,gon_dun02.gat,145,62/*Šm’è*/
+gon_dun02.gat,63,66,0 warp gon29 1,1,gon_dun02.gat,203,94/*‘ŠŒÝA*/
+gon_dun02.gat,86,44,0 warp gon30 1,1,gon_dun02.gat,145,233/*Šm’è*/
+gon_dun02.gat,148,236,0 warp gon31 1,1,gon_dun02.gat,234,194/*‘ŠŒÝD*/
+gon_dun02.gat,171,258,0 warp gon32 1,1,gon_dun02.gat,76,96/*Šm’è*/
+gon_dun02.gat,180,189,0 warp gon33 1,1,gon_dun02.gat,170,164/*Šm’è*/
+gon_dun02.gat,165,189,0 warp gon34 1,1,gon_dun02.gat,235,135/*‘ŠŒÝC*/
+gon_dun02.gat,170,161,0 warp gon35 1,1,gon_dun02.gat,89,41/*Šm’è*/
+gon_dun02.gat,168,92,0 warp gon36 1,1,gon_dun02.gat,273,76/*‘ŠŒÝB*/
+gon_dun02.gat,145,66,0 warp gon37 1,1,gon_dun02.gat,199,20/*Šm’è*/
+gon_dun02.gat,234,191,0 warp gon38 1,1,gon_dun02.gat,145,233/*‘ŠŒÝD*/
+gon_dun02.gat,235,138,0 warp gon39 1,1,gon_dun02.gat,168,189/*‘ŠŒÝC*/
+gon_dun02.gat,199,94,0 warp gon40 1,1,gon_dun02.gat,60,70/*‘ŠŒÝA*/
+gon_dun02.gat,276,76,0 warp gon41 1,1,gon_dun02.gat,163,87/*‘ŠŒÝB*/
+gon_dun02.gat,196,20,0 warp gon42 1,1,gon_dun02.gat,95,190/*‘ŠŒÝE*/
+gon_dun02.gat,251,268,0 warp gon43 1,1,gon_dun03.gat,68,9
+gon_dun03.gat,68,6,0 warp gon44 1,1,gon_dun02.gat,251,265
diff --git a/npc/warps/dungeons/ice_dun.txt b/npc/warps/dungeons/ice_dun.txt
index f80e3fe5f..570ca4d09 100644
--- a/npc/warps/dungeons/ice_dun.txt
+++ b/npc/warps/dungeons/ice_dun.txt
@@ -1,6 +1,6 @@
-//Ice Dungeon Warps
-ice_dun01.gat,157,10,0 warp ice001 1,1,ra_fild01.gat,233,330
-ice_dun01.gat,145,153,0 warp ice002 1,1,ice_dun02.gat,151,155
-ice_dun02.gat,151,160,0 warp ice003 1,1,ice_dun01.gat,146,157
-ice_dun02.gat,150,285,0 warp ice004 1,1,ice_dun03.gat,149,22
+//Ice Dungeon Warps
+ice_dun01.gat,157,10,0 warp ice001 1,1,ra_fild01.gat,233,330
+ice_dun01.gat,145,153,0 warp ice002 1,1,ice_dun02.gat,151,155
+ice_dun02.gat,151,160,0 warp ice003 1,1,ice_dun01.gat,146,157
+ice_dun02.gat,150,285,0 warp ice004 1,1,ice_dun03.gat,149,22
ice_dun03.gat,149,18,0 warp ice005 1,1,ice_dun02.gat,150,281 \ No newline at end of file
diff --git a/npc/warps/dungeons/izlude_dun.txt b/npc/warps/dungeons/izlude_dun.txt
index aa653fb89..69fb8bc5d 100644
--- a/npc/warps/dungeons/izlude_dun.txt
+++ b/npc/warps/dungeons/izlude_dun.txt
@@ -1,30 +1,30 @@
-//===== Athena Script ========================================
-//= Izlude Dungeon Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Bibilyn Island & Undersea Cave
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Bibilyn Island ===========================================
-izlu2dun.gat,108,83,0 warp izd01 3,2,iz_dun00.gat,168,168
-
-//= Undersea Cave ============================================
-iz_dun00.gat,168,173,0 warp izd01-1 3,3,izlu2dun.gat,108,88
-iz_dun00.gat,352,342,0 warp izd02 5,2,iz_dun01.gat,253,252
-iz_dun00.gat,39,41,0 warp izd03 5,2,iz_dun01.gat,41,37
-iz_dun01.gat,118,170,0 warp izd04 5,2,iz_dun02.gat,236,204
-iz_dun01.gat,253,258,0 warp izd02-1 2,2,iz_dun00.gat,352,337
-iz_dun01.gat,41,32,0 warp izd03-1 2,2,iz_dun00.gat,39,46
-iz_dun02.gat,236,198,0 warp izd04-1 5,3,iz_dun01.gat,118,165
-iz_dun02.gat,339,331,0 warp izd05 2,2,iz_dun03.gat,32,63
-iz_dun03.gat,264,245,0 warp izd06 1,2,iz_dun04.gat,26,27
-iz_dun03.gat,29,63,0 warp izd05-1 2,2,iz_dun02.gat,339,328
+//===== Athena Script ========================================
+//= Izlude Dungeon Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Bibilyn Island & Undersea Cave
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Bibilyn Island ===========================================
+izlu2dun.gat,108,83,0 warp izd01 3,2,iz_dun00.gat,168,168
+
+//= Undersea Cave ============================================
+iz_dun00.gat,168,173,0 warp izd01-1 3,3,izlu2dun.gat,108,88
+iz_dun00.gat,352,342,0 warp izd02 5,2,iz_dun01.gat,253,252
+iz_dun00.gat,39,41,0 warp izd03 5,2,iz_dun01.gat,41,37
+iz_dun01.gat,118,170,0 warp izd04 5,2,iz_dun02.gat,236,204
+iz_dun01.gat,253,258,0 warp izd02-1 2,2,iz_dun00.gat,352,337
+iz_dun01.gat,41,32,0 warp izd03-1 2,2,iz_dun00.gat,39,46
+iz_dun02.gat,236,198,0 warp izd04-1 5,3,iz_dun01.gat,118,165
+iz_dun02.gat,339,331,0 warp izd05 2,2,iz_dun03.gat,32,63
+iz_dun03.gat,264,245,0 warp izd06 1,2,iz_dun04.gat,26,27
+iz_dun03.gat,29,63,0 warp izd05-1 2,2,iz_dun02.gat,339,328
iz_dun04.gat,26,24,0 warp izd06-1 2,2,iz_dun03.gat,261,245 \ No newline at end of file
diff --git a/npc/warps/dungeons/juperos.txt b/npc/warps/dungeons/juperos.txt
index fea25e5da..16266d16c 100644
--- a/npc/warps/dungeons/juperos.txt
+++ b/npc/warps/dungeons/juperos.txt
@@ -1,129 +1,129 @@
-//===== Athena Script ========================================
-//= Juperos Dungeon Warp Script
-//===== By: ==================================================
-//= Muad-Dib (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena with independant npctimer support; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Juperos Dungeon
-//===== Additional Comments: =================================
-//= 1.0 Converted by Dr.Evil [Lupus]
-//= 1.1 More temp warps to Juperos by Justin84 [Lupus]
-//= 1.2 Justin84's fixed elevator scripts
-//= 1.3 Fixed getting stuck when player relogs in. [Lance]
-//= 1.4 Added attachnpctimer to the initnpctimer calls. [Skotlex]
-//= 1.5 Implemented a part of the Juperos quest [MasterOfMuppets]
-//============================================================
-
-yuno_fild07.gat,207,175,0 warp jupwrp01 1,1,jupe_cave.gat,143,52
-jupe_cave.gat,148,52,0 warp jupwrp02 1,1,yuno_fild07.gat,212,175
-jupe_cave.gat,26,52,0 warp jupwrp03 1,1,juperos_01.gat,53,247
-juperos_01.gat,50,250,0 warp jupwrp04 1,1,jupe_cave.gat,29,52
-
-juperos_01.gat,99,92,1 script jupwrp05 -1,0,0,{
-OnTouch:
-
- mes "^666666[" + strcharinfo(0) + "]";
- mes "^000000This light...";
- mes "It feels like...";
- mes "Its warmth is...";
- mes "Wrapping all over me...";
- next;
- menu "Ah, it's so nice...",s_Nice,"No! This is wrong!",-;
-
- mes "^666666[" + strcharinfo(0) + "]";
- mes "^000000N-No! This is";
- mes "wrong! Something";
- mes "weird's happening!";
- mes "I gotta get away!";
- close2;
- warp "juperos_01.gat",96,91;
- end;
-
-s_Nice:
- specialeffect 309;
- mes "^666666[" + strcharinfo(0) + "]";
- mes "^000000Ahhhh...";
- mes "It feels like";
- mes "I'm floating...";
- close2;
- warp "juperos_02.gat",128,278;
- end;
-
-}
-
-juperos_02.gat,33,60,0 warp jupwrp06 1,1,juperos_01.gat,99,88
-jupe_ele_r.gat,49,27,0 warp jupwrp07 1,1,jupe_gate.gat,49,52
-jupe_gate.gat,49,55,0 warp jupwrp08 1,1,jupe_ele_r.gat,49,30
-
-jupe_gate.gat,28,30,0 warp jupwrp11 1,1,jupe_area1.gat,115,158
-jupe_area1.gat,118,158,0 warp jupwrp12 1,1,jupe_gate.gat,31,30
-jupe_gate.gat,71,30,0 warp jupwrp13 1,1,jupe_area2.gat,48,158
-jupe_area2.gat,45,158,0 warp jupwrp14 1,1,jupe_gate.gat,68,30
-jupe_gate.gat,28,146,0 warp jupwrp15 1,1,jupe_area1.gat,101,222
-jupe_area1.gat,103,222,0 warp jupwrp16 1,1,jupe_gate.gat,31,146
-jupe_gate.gat,71,146,0 warp jupwrp17 1,1,jupe_area2.gat,62,222
-jupe_area2.gat,60,222,0 warp jupwrp18 1,1,jupe_gate.gat,68,146
-
-jupe_area1.gat,84,222,0 warp jupwrp21 1,1,jupe_area1.gat,45,260
-jupe_area1.gat,48,260,0 warp jupwrp22 1,1,jupe_area1.gat,86,222
-jupe_area1.gat,22,226,0 warp jupwrp23 1,1,jupe_area1.gat,22,189
-jupe_area1.gat,22,192,0 warp jupwrp24 1,1,jupe_area1.gat,22,228
-jupe_area1.gat,34,138,0 warp jupwrp25 1,1,jupe_area1.gat,34,103
-jupe_area1.gat,34,106,0 warp jupwrp26 1,1,jupe_area1.gat,34,140
-jupe_area1.gat,58,54,0 warp jupwrp27 1,1,jupe_area1.gat,86,158
-jupe_area1.gat,84,158,0 warp jupwrp28 1,1,jupe_area1.gat,55,54
-
-jupe_area2.gat,79,222,0 warp jupwrp31 1,1,jupe_area2.gat,118,260
-jupe_area2.gat,115,260,0 warp jupwrp32 1,1,jupe_area2.gat,77,222
-jupe_area2.gat,141,226,0 warp jupwrp33 1,1,jupe_area2.gat,141,189
-jupe_area2.gat,141,192,0 warp jupwrp34 1,1,jupe_area2.gat,141,228
-jupe_area2.gat,129,138,0 warp jupwrp35 1,1,jupe_area2.gat,129,103
-jupe_area2.gat,129,106,0 warp jupwrp36 1,1,jupe_area2.gat,129,140
-jupe_area2.gat,105,54,0 warp jupwrp37 1,1,jupe_area2.gat,77,158
-jupe_area2.gat,79,158,0 warp jupwrp38 1,1,jupe_area2.gat,108,54
-
-juperos_02.gat,129,150,0 script JupeWarp2 -1,1,1{
-OnInit:
- disablenpc "JupeWarp2";
- end;
-OnTouch:
- warp "jupe_gate.gat",49,162;
- end;
-}
-
-jupe_gate.gat,49,168,0 script JupeWarp3 -1,1,1,{
-OnTouch:
- warp "juperos_02.gat",129,147;
- end;
-}
-
-jupe_ele_r.gat,50,98,0 script Juperos Guard 111,{
- mes "Are you sure you want to enter the Juperos Core?";
- next;
- if(select("Yes","No") == 1){
- attachnpctimer;
- initnpctimer;
- soundeffect "jupe_warning.wav",0;
- }
- close;
-
-OnTimer5000:
- stopnpctimer;
- setnpctimer 0;
- warp "jupe_core.gat",150,20;
- end;
-}
-
-jupe_core.gat,150,17,0 script Juperos Guard#2 111,{
- mes "Leave Juperos Core?";
- next;
- if(select("Yes", "No") == 1){
- close2;
- warp "jupe_ele_r",50,94;
- end;
- }
- close;
-}
+//===== Athena Script ========================================
+//= Juperos Dungeon Warp Script
+//===== By: ==================================================
+//= Muad-Dib (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena with independant npctimer support; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Juperos Dungeon
+//===== Additional Comments: =================================
+//= 1.0 Converted by Dr.Evil [Lupus]
+//= 1.1 More temp warps to Juperos by Justin84 [Lupus]
+//= 1.2 Justin84's fixed elevator scripts
+//= 1.3 Fixed getting stuck when player relogs in. [Lance]
+//= 1.4 Added attachnpctimer to the initnpctimer calls. [Skotlex]
+//= 1.5 Implemented a part of the Juperos quest [MasterOfMuppets]
+//============================================================
+
+yuno_fild07.gat,207,175,0 warp jupwrp01 1,1,jupe_cave.gat,143,52
+jupe_cave.gat,148,52,0 warp jupwrp02 1,1,yuno_fild07.gat,212,175
+jupe_cave.gat,26,52,0 warp jupwrp03 1,1,juperos_01.gat,53,247
+juperos_01.gat,50,250,0 warp jupwrp04 1,1,jupe_cave.gat,29,52
+
+juperos_01.gat,99,92,1 script jupwrp05 -1,0,0,{
+OnTouch:
+
+ mes "^666666[" + strcharinfo(0) + "]";
+ mes "^000000This light...";
+ mes "It feels like...";
+ mes "Its warmth is...";
+ mes "Wrapping all over me...";
+ next;
+ menu "Ah, it's so nice...",s_Nice,"No! This is wrong!",-;
+
+ mes "^666666[" + strcharinfo(0) + "]";
+ mes "^000000N-No! This is";
+ mes "wrong! Something";
+ mes "weird's happening!";
+ mes "I gotta get away!";
+ close2;
+ warp "juperos_01.gat",96,91;
+ end;
+
+s_Nice:
+ specialeffect 309;
+ mes "^666666[" + strcharinfo(0) + "]";
+ mes "^000000Ahhhh...";
+ mes "It feels like";
+ mes "I'm floating...";
+ close2;
+ warp "juperos_02.gat",128,278;
+ end;
+
+}
+
+juperos_02.gat,33,60,0 warp jupwrp06 1,1,juperos_01.gat,99,88
+jupe_ele_r.gat,49,27,0 warp jupwrp07 1,1,jupe_gate.gat,49,52
+jupe_gate.gat,49,55,0 warp jupwrp08 1,1,jupe_ele_r.gat,49,30
+
+jupe_gate.gat,28,30,0 warp jupwrp11 1,1,jupe_area1.gat,115,158
+jupe_area1.gat,118,158,0 warp jupwrp12 1,1,jupe_gate.gat,31,30
+jupe_gate.gat,71,30,0 warp jupwrp13 1,1,jupe_area2.gat,48,158
+jupe_area2.gat,45,158,0 warp jupwrp14 1,1,jupe_gate.gat,68,30
+jupe_gate.gat,28,146,0 warp jupwrp15 1,1,jupe_area1.gat,101,222
+jupe_area1.gat,103,222,0 warp jupwrp16 1,1,jupe_gate.gat,31,146
+jupe_gate.gat,71,146,0 warp jupwrp17 1,1,jupe_area2.gat,62,222
+jupe_area2.gat,60,222,0 warp jupwrp18 1,1,jupe_gate.gat,68,146
+
+jupe_area1.gat,84,222,0 warp jupwrp21 1,1,jupe_area1.gat,45,260
+jupe_area1.gat,48,260,0 warp jupwrp22 1,1,jupe_area1.gat,86,222
+jupe_area1.gat,22,226,0 warp jupwrp23 1,1,jupe_area1.gat,22,189
+jupe_area1.gat,22,192,0 warp jupwrp24 1,1,jupe_area1.gat,22,228
+jupe_area1.gat,34,138,0 warp jupwrp25 1,1,jupe_area1.gat,34,103
+jupe_area1.gat,34,106,0 warp jupwrp26 1,1,jupe_area1.gat,34,140
+jupe_area1.gat,58,54,0 warp jupwrp27 1,1,jupe_area1.gat,86,158
+jupe_area1.gat,84,158,0 warp jupwrp28 1,1,jupe_area1.gat,55,54
+
+jupe_area2.gat,79,222,0 warp jupwrp31 1,1,jupe_area2.gat,118,260
+jupe_area2.gat,115,260,0 warp jupwrp32 1,1,jupe_area2.gat,77,222
+jupe_area2.gat,141,226,0 warp jupwrp33 1,1,jupe_area2.gat,141,189
+jupe_area2.gat,141,192,0 warp jupwrp34 1,1,jupe_area2.gat,141,228
+jupe_area2.gat,129,138,0 warp jupwrp35 1,1,jupe_area2.gat,129,103
+jupe_area2.gat,129,106,0 warp jupwrp36 1,1,jupe_area2.gat,129,140
+jupe_area2.gat,105,54,0 warp jupwrp37 1,1,jupe_area2.gat,77,158
+jupe_area2.gat,79,158,0 warp jupwrp38 1,1,jupe_area2.gat,108,54
+
+juperos_02.gat,129,150,0 script JupeWarp2 -1,1,1{
+OnInit:
+ disablenpc "JupeWarp2";
+ end;
+OnTouch:
+ warp "jupe_gate.gat",49,162;
+ end;
+}
+
+jupe_gate.gat,49,168,0 script JupeWarp3 -1,1,1,{
+OnTouch:
+ warp "juperos_02.gat",129,147;
+ end;
+}
+
+jupe_ele_r.gat,50,98,0 script Juperos Guard 111,{
+ mes "Are you sure you want to enter the Juperos Core?";
+ next;
+ if(select("Yes","No") == 1){
+ attachnpctimer;
+ initnpctimer;
+ soundeffect "jupe_warning.wav",0;
+ }
+ close;
+
+OnTimer5000:
+ stopnpctimer;
+ setnpctimer 0;
+ warp "jupe_core.gat",150,20;
+ end;
+}
+
+jupe_core.gat,150,17,0 script Juperos Guard#2 111,{
+ mes "Leave Juperos Core?";
+ next;
+ if(select("Yes", "No") == 1){
+ close2;
+ warp "jupe_ele_r",50,94;
+ end;
+ }
+ close;
+}
diff --git a/npc/warps/dungeons/kiel_dun.txt b/npc/warps/dungeons/kiel_dun.txt
index 754e835aa..09e9bce68 100644
--- a/npc/warps/dungeons/kiel_dun.txt
+++ b/npc/warps/dungeons/kiel_dun.txt
@@ -1,77 +1,77 @@
-//===== Athena Script ========================================
-//= Kiel Dungeon Warp Script
-//===== By: ==================================================
-//= Lost Kakashi
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Warp Points for the Kiel Dungeon
-//===== Additional Comments: =================================
-//= 1.1 Added official Kiel Dungeon entrance [Playtester]
-//============================================================
-
-//= Kiel Dungeon =============================================
-kh_dun01.gat,3,234,0 warp khwarp01 1,1,yuno_fild08,69,170
-
-//= Graveyard Switch =========================================
-yuno_fild08.gat,67,169,4 script Switch#kh 111,1,1,{
-
- mes "You examine the grave and find a switch!";
- mes "Do you want to press it?";
- next;
-
- menu "Yes.",-,"No.",L_End;
-
- mes "Suddenly the grave opens and reveals a staircase.";
- close2;
-
- warp "kh_dun01",4,229;
- end;
-
-L_End:
- mes "You decided not to press it.";
- close;
-}
-
-//= Elevator to Floor 2 ======================================
-kh_dun01.gat,44,203,4 script Switch#khe1::khelevator 111,1,1,{
-
- mes "The elevator seems to be broken.";
- mes "But you could repair it with";
- mes "^0000FF40 Hard Pieces of Steel^000000.";
- next;
-
- mes "Be careful, though.";
- mes "This will only work once and there's no turning back.";
- next;
-
- mes "Do you want to repair the elevator?";
- next;
-
- menu "Yes.",-,"No.",L_End;
-
- if(countitem(7507)<40) goto L_NoItem;
- delitem 7507,40;
- mes "The elevator starts moving.";
- mes "You quickly jump into it.";
- close2;
-
- warp "kh_dun02",44,195;
- end;
-
-L_NoItem:
- mes "It appears you don't have enough items.";
-L_End:
- mes "The elevator remains broken.";
- close;
-}
-
-kh_dun01.gat,36,195,4 duplicate(khelevator) Switch#khe2 111
-
-//= Custom Kiel Dungeon Warps ================================
-//kh_dun01.gat,3,234,0 warp warp01 1,1,kh_dun02.gat,42,197
-//kh_dun02.gat,45,194,0 warp warp02 1,1,kh_dun01.gat,4,229
-//kh_kiehl02.gat,49,52,0 warp warp05 1,1,kh_dun01.gat,63,10
+//===== Athena Script ========================================
+//= Kiel Dungeon Warp Script
+//===== By: ==================================================
+//= Lost Kakashi
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Warp Points for the Kiel Dungeon
+//===== Additional Comments: =================================
+//= 1.1 Added official Kiel Dungeon entrance [Playtester]
+//============================================================
+
+//= Kiel Dungeon =============================================
+kh_dun01.gat,3,234,0 warp khwarp01 1,1,yuno_fild08,69,170
+
+//= Graveyard Switch =========================================
+yuno_fild08.gat,67,169,4 script Switch#kh 111,1,1,{
+
+ mes "You examine the grave and find a switch!";
+ mes "Do you want to press it?";
+ next;
+
+ menu "Yes.",-,"No.",L_End;
+
+ mes "Suddenly the grave opens and reveals a staircase.";
+ close2;
+
+ warp "kh_dun01",4,229;
+ end;
+
+L_End:
+ mes "You decided not to press it.";
+ close;
+}
+
+//= Elevator to Floor 2 ======================================
+kh_dun01.gat,44,203,4 script Switch#khe1::khelevator 111,1,1,{
+
+ mes "The elevator seems to be broken.";
+ mes "But you could repair it with";
+ mes "^0000FF40 Hard Pieces of Steel^000000.";
+ next;
+
+ mes "Be careful, though.";
+ mes "This will only work once and there's no turning back.";
+ next;
+
+ mes "Do you want to repair the elevator?";
+ next;
+
+ menu "Yes.",-,"No.",L_End;
+
+ if(countitem(7507)<40) goto L_NoItem;
+ delitem 7507,40;
+ mes "The elevator starts moving.";
+ mes "You quickly jump into it.";
+ close2;
+
+ warp "kh_dun02",44,195;
+ end;
+
+L_NoItem:
+ mes "It appears you don't have enough items.";
+L_End:
+ mes "The elevator remains broken.";
+ close;
+}
+
+kh_dun01.gat,36,195,4 duplicate(khelevator) Switch#khe2 111
+
+//= Custom Kiel Dungeon Warps ================================
+//kh_dun01.gat,3,234,0 warp warp01 1,1,kh_dun02.gat,42,197
+//kh_dun02.gat,45,194,0 warp warp02 1,1,kh_dun01.gat,4,229
+//kh_kiehl02.gat,49,52,0 warp warp05 1,1,kh_dun01.gat,63,10
//kh_dun01.gat,64,7,0 warp warp06 1,1,kh_kiehl02.gat,51,49 \ No newline at end of file
diff --git a/npc/warps/dungeons/lhalzen_dun.txt b/npc/warps/dungeons/lhalzen_dun.txt
index b0e36e552..000f9ed83 100644
--- a/npc/warps/dungeons/lhalzen_dun.txt
+++ b/npc/warps/dungeons/lhalzen_dun.txt
@@ -1,213 +1,213 @@
-//===== Athena Script ========================================
-//= Lighthalzen Dungeon Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.0)
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Lighthalzen Dungeon
-//===== Additional Comments: =================================
-//= No Comment!
-//= 1.1 Added temp restriction by Azazel [Lupus]
-//= 1.2 Optimized [Lupus]
-//= and fixed 005 and 005a warps coords, thanks to Justin84
-//= 1.3 Fixed entrance condition check, thanx2Daegaladh [Lupus]
-//= 1.4 Added coords of secret dungeon entrance, thanks to Justin84
-//= proved with screenshots [Lupus]
-//= 1.5a thx2 Justin84, some additions and fixes [Lupus]
-//= 1.5b re-enabled main entrance warp [Lupus] <-reverted 1.5c
-//= 1.6 Updated entrances, added Cube room warps, thanx 2 Justin84
-//= 1.6a Disabled the "Entrance" to lhz_dun01 [Poki#3]
-//= 1.6b Updated Sewer Pipe [Vicious]
-//= 1.7 Fixed a warp-back
-//= 1.8 Some small changes [MasterOfMuppets]
-//= 1.9 Removed duplicates [Toms]
-//= 2.0 Now use MISC_QUEST&512 instead of 'hzdun' [Lupus]
-//============================================================
-
-lhz_dun03.gat,140,139,0 warp lhz003 1,1,lhz_dun02.gat,150,145
-lhz_dun02.gat,18,150,0 warp lhz004 1,1,lhz_dun01.gat,18,148
-lhz_dun01.gat,18,146,0 warp lhz004a 1,1,lhz_dun02.gat,18,148
-lhz_dun02.gat,282,155,0 warp lhz005 1,1,lhz_dun01.gat,281,152
-lhz_dun01.gat,281,150,0 warp lhz005a 1,1,lhz_dun02.gat,282,153
-lhz_dun02.gat,148,18,0 warp lhz006 1,1,lhz_dun01.gat,146,10
-lhz_dun01.gat,148,10,0 warp lhz006a 1,1,lhz_dun02.gat,150,18
-
-//current entrance
-lhz_dun01.gat,150,290,0 warp lhz007 1,1,lhz_in01.gat,23,137
-//lighthalzen.gat,73,52,0 warp lhz007a 1,1,lhz_dun01.gat,150,288
-//This should be only an Exit. This warp doesn't exist on kRO.
-
-//--------------------------Sewer Pipe--------------------------
-
-lighthalzen.gat,313,301,0 script Sewer Pipe 111,{
- mes "You see some pipes for a sewage system.";
- if(MISC_QUEST&512){
- mes "You found the way into the lab.";
- next;
- menu "Go in.",-,"Do not go in.",L_NO;
-
- warp "lhz_cube.gat",231,17;
- end;
- }
-L_NO:
- close;
-}
-
-//--------------------------Warp--------------------------
-
-//Cube room <-> Organism test laboratory level 2
-lhz_cube.gat,231,96,0 warp lhzcube1 1,1,lhz_dun02.gat,220,6
-lhz_dun02.gat,224,6,0 warp lhzcube2 1,1,lhz_cube.gat,231,90
-
-//Cube room -> Lighthalzen
-lhz_cube.gat,231,12,0 warp lhzcube3 1,1,lighthalzen.gat,310,302
-lhz_cube.gat,177,96,0 warp lhzcube4 1,1,lighthalzen.gat,310,302
-
-lhz_dun02.gat,150,149,4 script lhz-warp 45,2,2,{
-OnTouch:
- if(Upper != 1 && BaseLevel<95)goto s_Noentry0;
- if(Upper == 1 && BaseLevel<90)goto s_Noentry1;
- warp "lhz_dun03",140,137;
- end;
-
-s_Noentry0:
- mes "Non-Advanced class characters must be at least base level 95 to enter level 3 of the Bio Lab Dungeon";
- close;
-
-s_Noentry1:
- mes "Advanced class characters must be at least base level 90 to enter level 3 of the Bio Lab Dungeon";
- close;
-}
-
-//----------------- Cube Room Maze ---------------------------
-// -1 are warps facing east.
-// -2 the warps facing south.
-// -3 are warps facing west.
-// -4 are warps facing north.
-//----------------- Room 66 74 -------------------------------
-lhz_cube.gat,74,74,0 script cubew01-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,66,67,0 warp cubew01-2 2,2,lhz_cube.gat,10,18
-lhz_cube.gat,59,74,0 script cubew01-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,66,82,0 script cubew01-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-//----------------- Room 66 136 ------------------------------
-lhz_cube.gat,74,136,0 warp cubew02-1 2,2,lhz_cube.gat,10,193
-lhz_cube.gat,66,129,0 script cubew02-2 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,59,136,0 script cubew02-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,66,144,0 script cubew02-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-//----------------- Room 67 193 ------------------------------
-lhz_cube.gat,74,192,0 script cubew03-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,67,185,0 script cubew03-2 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,59,192,0 script cubew03-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,67,200,0 warp cubew03-4 2,2,lhz_cube.gat,10,136
-//----------------- Room 66 18 -------------------------------
-lhz_cube.gat,74,18,0 script cubew04-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,66,11,0 warp cubew04-2 2,2,lhz_cube.gat,10,18
-lhz_cube.gat,59,18,0 script cubew04-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,66,26,0 warp cubew04-4 2,2,lhz_cube.gat,123,18
-//----------------- Room 66 18 -------------------------------
-lhz_cube.gat,18,18,0 warp cubew05-1 2,2,lhz_cube.gat,10,193
-lhz_cube.gat,10,11,0 warp cubew05-2 2,2,lhz_cube.gat,123,18
-lhz_cube.gat,3,18,0 script cubew05-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,10,26,0 script cubew05-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-//----------------- Room 10 74 -------------------------------
-lhz_cube.gat,18,74,0 script cubew06-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,10,67,0 warp cubew06-2 2,2,lhz_cube.gat,123,18
-lhz_cube.gat,3,74,0 warp cubew06-3 2,2,lhz_cube.gat,66,18
-lhz_cube.gat,10,82,0 script cubew06-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-//----------------- Room 10 136 ------------------------------
-lhz_cube.gat,18,136,0 warp cubew07-1 2,2,lhz_cube.gat,10,74
-lhz_cube.gat,10,129,0 script cubew07-2 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,3,136,0 script cubew07-3 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,10,144,0 script cubew07-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-//----------------- Room 10 193 ------------------------------
-lhz_cube.gat,18,192,0 script cubew08-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,10,185,0 script cubew08-2 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,3,192,0 warp cubew08-3 2,2,lhz_cube.gat,10,74
-lhz_cube.gat,10,200,0 warp cubew08-4 2,2,lhz_cube.gat,66,18
-//----------------- Room 123 18 ------------------------------
-lhz_cube.gat,130,18,0 script cubew09-1 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,123,11,0 script cubew09-2 45,1,1,{
- callfunc "randomw";
- end;
-}
-lhz_cube.gat,115,18,0 warp cubew09-3 2,2,lhz_cube.gat,248,184
-lhz_cube.gat,123,26,0 script cubew09-4 45,1,1,{
- callfunc "randomw";
- end;
-}
-
-//----- Function for Random Warps ----------------------------
-function script randomw {
- set @rdm,rand(3);
- if(@rdm==1)goto rdm1;
- if(@rdm==2)goto rdm2;
- warp "lhz_cube.gat",67,193; end;
- rdm1: warp "lhz_cube.gat",66,136; end;
- rdm2: warp "lhz_cube.gat",66,74; end;
+//===== Athena Script ========================================
+//= Lighthalzen Dungeon Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.0)
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Lighthalzen Dungeon
+//===== Additional Comments: =================================
+//= No Comment!
+//= 1.1 Added temp restriction by Azazel [Lupus]
+//= 1.2 Optimized [Lupus]
+//= and fixed 005 and 005a warps coords, thanks to Justin84
+//= 1.3 Fixed entrance condition check, thanx2Daegaladh [Lupus]
+//= 1.4 Added coords of secret dungeon entrance, thanks to Justin84
+//= proved with screenshots [Lupus]
+//= 1.5a thx2 Justin84, some additions and fixes [Lupus]
+//= 1.5b re-enabled main entrance warp [Lupus] <-reverted 1.5c
+//= 1.6 Updated entrances, added Cube room warps, thanx 2 Justin84
+//= 1.6a Disabled the "Entrance" to lhz_dun01 [Poki#3]
+//= 1.6b Updated Sewer Pipe [Vicious]
+//= 1.7 Fixed a warp-back
+//= 1.8 Some small changes [MasterOfMuppets]
+//= 1.9 Removed duplicates [Toms]
+//= 2.0 Now use MISC_QUEST&512 instead of 'hzdun' [Lupus]
+//============================================================
+
+lhz_dun03.gat,140,139,0 warp lhz003 1,1,lhz_dun02.gat,150,145
+lhz_dun02.gat,18,150,0 warp lhz004 1,1,lhz_dun01.gat,18,148
+lhz_dun01.gat,18,146,0 warp lhz004a 1,1,lhz_dun02.gat,18,148
+lhz_dun02.gat,282,155,0 warp lhz005 1,1,lhz_dun01.gat,281,152
+lhz_dun01.gat,281,150,0 warp lhz005a 1,1,lhz_dun02.gat,282,153
+lhz_dun02.gat,148,18,0 warp lhz006 1,1,lhz_dun01.gat,146,10
+lhz_dun01.gat,148,10,0 warp lhz006a 1,1,lhz_dun02.gat,150,18
+
+//current entrance
+lhz_dun01.gat,150,290,0 warp lhz007 1,1,lhz_in01.gat,23,137
+//lighthalzen.gat,73,52,0 warp lhz007a 1,1,lhz_dun01.gat,150,288
+//This should be only an Exit. This warp doesn't exist on kRO.
+
+//--------------------------Sewer Pipe--------------------------
+
+lighthalzen.gat,313,301,0 script Sewer Pipe 111,{
+ mes "You see some pipes for a sewage system.";
+ if(MISC_QUEST&512){
+ mes "You found the way into the lab.";
+ next;
+ menu "Go in.",-,"Do not go in.",L_NO;
+
+ warp "lhz_cube.gat",231,17;
+ end;
+ }
+L_NO:
+ close;
+}
+
+//--------------------------Warp--------------------------
+
+//Cube room <-> Organism test laboratory level 2
+lhz_cube.gat,231,96,0 warp lhzcube1 1,1,lhz_dun02.gat,220,6
+lhz_dun02.gat,224,6,0 warp lhzcube2 1,1,lhz_cube.gat,231,90
+
+//Cube room -> Lighthalzen
+lhz_cube.gat,231,12,0 warp lhzcube3 1,1,lighthalzen.gat,310,302
+lhz_cube.gat,177,96,0 warp lhzcube4 1,1,lighthalzen.gat,310,302
+
+lhz_dun02.gat,150,149,4 script lhz-warp 45,2,2,{
+OnTouch:
+ if(Upper != 1 && BaseLevel<95)goto s_Noentry0;
+ if(Upper == 1 && BaseLevel<90)goto s_Noentry1;
+ warp "lhz_dun03",140,137;
+ end;
+
+s_Noentry0:
+ mes "Non-Advanced class characters must be at least base level 95 to enter level 3 of the Bio Lab Dungeon";
+ close;
+
+s_Noentry1:
+ mes "Advanced class characters must be at least base level 90 to enter level 3 of the Bio Lab Dungeon";
+ close;
+}
+
+//----------------- Cube Room Maze ---------------------------
+// -1 are warps facing east.
+// -2 the warps facing south.
+// -3 are warps facing west.
+// -4 are warps facing north.
+//----------------- Room 66 74 -------------------------------
+lhz_cube.gat,74,74,0 script cubew01-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,66,67,0 warp cubew01-2 2,2,lhz_cube.gat,10,18
+lhz_cube.gat,59,74,0 script cubew01-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,66,82,0 script cubew01-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+//----------------- Room 66 136 ------------------------------
+lhz_cube.gat,74,136,0 warp cubew02-1 2,2,lhz_cube.gat,10,193
+lhz_cube.gat,66,129,0 script cubew02-2 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,59,136,0 script cubew02-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,66,144,0 script cubew02-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+//----------------- Room 67 193 ------------------------------
+lhz_cube.gat,74,192,0 script cubew03-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,67,185,0 script cubew03-2 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,59,192,0 script cubew03-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,67,200,0 warp cubew03-4 2,2,lhz_cube.gat,10,136
+//----------------- Room 66 18 -------------------------------
+lhz_cube.gat,74,18,0 script cubew04-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,66,11,0 warp cubew04-2 2,2,lhz_cube.gat,10,18
+lhz_cube.gat,59,18,0 script cubew04-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,66,26,0 warp cubew04-4 2,2,lhz_cube.gat,123,18
+//----------------- Room 66 18 -------------------------------
+lhz_cube.gat,18,18,0 warp cubew05-1 2,2,lhz_cube.gat,10,193
+lhz_cube.gat,10,11,0 warp cubew05-2 2,2,lhz_cube.gat,123,18
+lhz_cube.gat,3,18,0 script cubew05-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,10,26,0 script cubew05-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+//----------------- Room 10 74 -------------------------------
+lhz_cube.gat,18,74,0 script cubew06-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,10,67,0 warp cubew06-2 2,2,lhz_cube.gat,123,18
+lhz_cube.gat,3,74,0 warp cubew06-3 2,2,lhz_cube.gat,66,18
+lhz_cube.gat,10,82,0 script cubew06-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+//----------------- Room 10 136 ------------------------------
+lhz_cube.gat,18,136,0 warp cubew07-1 2,2,lhz_cube.gat,10,74
+lhz_cube.gat,10,129,0 script cubew07-2 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,3,136,0 script cubew07-3 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,10,144,0 script cubew07-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+//----------------- Room 10 193 ------------------------------
+lhz_cube.gat,18,192,0 script cubew08-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,10,185,0 script cubew08-2 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,3,192,0 warp cubew08-3 2,2,lhz_cube.gat,10,74
+lhz_cube.gat,10,200,0 warp cubew08-4 2,2,lhz_cube.gat,66,18
+//----------------- Room 123 18 ------------------------------
+lhz_cube.gat,130,18,0 script cubew09-1 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,123,11,0 script cubew09-2 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+lhz_cube.gat,115,18,0 warp cubew09-3 2,2,lhz_cube.gat,248,184
+lhz_cube.gat,123,26,0 script cubew09-4 45,1,1,{
+ callfunc "randomw";
+ end;
+}
+
+//----- Function for Random Warps ----------------------------
+function script randomw {
+ set @rdm,rand(3);
+ if(@rdm==1)goto rdm1;
+ if(@rdm==2)goto rdm2;
+ warp "lhz_cube.gat",67,193; end;
+ rdm1: warp "lhz_cube.gat",66,136; end;
+ rdm2: warp "lhz_cube.gat",66,74; end;
} \ No newline at end of file
diff --git a/npc/warps/dungeons/louyang_dun.txt b/npc/warps/dungeons/louyang_dun.txt
index 278b0e321..304dedeb1 100644
--- a/npc/warps/dungeons/louyang_dun.txt
+++ b/npc/warps/dungeons/louyang_dun.txt
@@ -1,20 +1,20 @@
-//===== Athena Script ========================================
-//= Lou Yang Dungeon Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version 6.0+
-//===== Description: =========================================
-//= Warp Points for Lou Yang
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Loy Yang Dungeon =========================================
-lou_dun01.gat,222,196,0 warp louwarp002a 3,3,louyang.gat,41,270
-lou_dun01.gat,38,205,0 warp louwarp003 3,3,lou_dun02.gat,282,20
-lou_dun02.gat,286,20,0 warp louwarp003a 3,3,lou_dun01.gat,38,209
-lou_dun02.gat,165,270,0 warp louwarp004 3,3,lou_dun03.gat,165,38
+//===== Athena Script ========================================
+//= Lou Yang Dungeon Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version 6.0+
+//===== Description: =========================================
+//= Warp Points for Lou Yang
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Loy Yang Dungeon =========================================
+lou_dun01.gat,222,196,0 warp louwarp002a 3,3,louyang.gat,41,270
+lou_dun01.gat,38,205,0 warp louwarp003 3,3,lou_dun02.gat,282,20
+lou_dun02.gat,286,20,0 warp louwarp003a 3,3,lou_dun01.gat,38,209
+lou_dun02.gat,165,270,0 warp louwarp004 3,3,lou_dun03.gat,165,38
lou_dun03.gat,165,34,0 warp louwarp004a 3,3,lou_dun02.gat,165,266 \ No newline at end of file
diff --git a/npc/warps/dungeons/lutie_dun.txt b/npc/warps/dungeons/lutie_dun.txt
index f355af847..f67b75269 100644
--- a/npc/warps/dungeons/lutie_dun.txt
+++ b/npc/warps/dungeons/lutie_dun.txt
@@ -1,18 +1,18 @@
-//===== Athena Script ========================================
-//= Lutie Dungeon (Toy Factory) Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Lutie Dungeon (Toy Factory)
-//===== Additional Comments: =================================
-//= 1.1 Fixed endless warping loop
-//============================================================
-
-//= Toy Factory ==============================================
-xmas_dun01.gat,128,133,0 warp xmas15 3,3,xmas_dun02.gat,129,133
-xmas_dun01.gat,205,13,0 warp xmas14-1 3,3,xmas.gat,143,308
+//===== Athena Script ========================================
+//= Lutie Dungeon (Toy Factory) Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Lutie Dungeon (Toy Factory)
+//===== Additional Comments: =================================
+//= 1.1 Fixed endless warping loop
+//============================================================
+
+//= Toy Factory ==============================================
+xmas_dun01.gat,128,133,0 warp xmas15 3,3,xmas_dun02.gat,129,133
+xmas_dun01.gat,205,13,0 warp xmas14-1 3,3,xmas.gat,143,308
xmas_dun02.gat,129,129,0 warp xmas15-1 3,3,xmas_dun01.gat,128,128 \ No newline at end of file
diff --git a/npc/warps/dungeons/morroc_duns.txt b/npc/warps/dungeons/morroc_duns.txt
index bcdb56807..dfb74bc05 100644
--- a/npc/warps/dungeons/morroc_duns.txt
+++ b/npc/warps/dungeons/morroc_duns.txt
@@ -1,63 +1,63 @@
-//===== Athena Script ========================================
-//= Morroc Dungeons Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Morroc Dungeons
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Morroc Sphinx ============================================
-in_sphinx1.gat,288,6,0 warp sphx001 5,1,moc_fild19.gat,100,99
-in_sphinx1.gat,80,191,0 warp sphx01 2,1,in_sphinx2.gat,149,81
-in_sphinx2.gat,149,77,0 warp sphx01-1 3,2,in_sphinx1.gat,80,189
-in_sphinx2.gat,276,272,0 warp sphx02 1,3,in_sphinx3.gat,210,54
-in_sphinx3.gat,210,57,0 warp sphx02-1 4,1,in_sphinx2.gat,274,272
-in_sphinx3.gat,35,227,0 warp sphx03 2,4,in_sphinx3.gat,62,227
-in_sphinx3.gat,60,227,0 warp sphx03-1 1,4,in_sphinx3.gat,32,227
-in_sphinx3.gat,70,111,0 warp sphx04 1,1,in_sphinx3.gat,70,81
-in_sphinx3.gat,70,83,0 warp sphx04-1 4,1,in_sphinx3.gat,70,113
-in_sphinx3.gat,12,69,0 warp sphx05 4,1,in_sphinx4.gat,10,222
-in_sphinx4.gat,10,224,0 warp sphx05-1 2,1,in_sphinx3.gat,12,71
-in_sphinx4.gat,120,113,0 warp sphx06 4,2,in_sphinx5.gat,100,99
-in_sphinx5.gat,100,96,0 warp sphx06-1 4,2,in_sphinx4.gat,120,116
-in_sphinx5.gat,11,16,0 warp sphx07 3,1,in_sphinx5.gat,189,181
-in_sphinx5.gat,11,183,0 warp sphx07-1 3,1,in_sphinx5.gat,11,18
-in_sphinx5.gat,189,16,0 warp sphx08-1 3,1,in_sphinx5.gat,11,181
-in_sphinx5.gat,16,188,0 warp sphx08-2 1,3,in_sphinx5.gat,181,188
-in_sphinx5.gat,16,10,0 warp sphx08-3 1,3,in_sphinx5.gat,181,10
-in_sphinx5.gat,183,10,0 warp sphx08-4 1,3,in_sphinx5.gat,18,188
-in_sphinx5.gat,183,188,0 warp sphx08-5 1,3,in_sphinx5.gat,18,10
-in_sphinx5.gat,189,183,0 warp sphx08-6 3,1,in_sphinx5.gat,189,18
-
-//= Morroc Pyramid ===========================================
-moc_pryd01.gat,10,195,0 warp mocp01 5,2,moc_pryd02.gat,10,192
-moc_pryd01.gat,195,9,0 warp mocp001 2,5,moc_ruins.gat,60,161
-moc_pryd01.gat,90,109,0 warp mocp02 1,2,moc_prydb1.gat,100,185
-moc_pryd02.gat,10,195,0 warp mocp01-1 5,2,moc_pryd01.gat,10,192
-moc_pryd02.gat,100,99,0 warp mocp03 3,2,moc_pryd03.gat,100,92
-moc_pryd03.gat,100,97,0 warp mocp03-1 3,2,moc_pryd02.gat,100,92
-moc_pryd03.gat,12,15,0 warp mocp04 3,2,moc_pryd04.gat,12,18
-moc_pryd03.gat,15,187,0 warp mocp05 2,3,moc_pryd04.gat,18,187
-moc_pryd03.gat,184,11,0 warp mocp06 2,3,moc_pryd04.gat,181,11
-moc_pryd03.gat,188,184,0 warp mocp07 3,2,moc_pryd04.gat,188,181
-moc_pryd04.gat,12,15,0 warp mocp04-1 3,2,moc_pryd03.gat,12,18
-moc_pryd04.gat,15,187,0 warp mocp05-1 2,3,moc_pryd03.gat,18,187
-moc_pryd04.gat,184,11,0 warp mocp06-1 2,3,moc_pryd03.gat,181,11
-moc_pryd04.gat,188,184,0 warp mocp07-1 3,2,moc_pryd03.gat,188,181
-moc_pryd05.gat,223,9,0 warp mocp08 2,2,moc_pryd06.gat,192,10
-moc_pryd05.gat,94,98,0 warp mocp09 2,1,moc_prydb1.gat,100,57
-moc_pryd06.gat,197,10,0 warp mocp08-1 2,3,moc_pryd05.gat,220,9
-moc_prydb1.gat,100,104,0 warp mocp10 5,2,moc_prydb1.gat,100,74
-moc_prydb1.gat,100,191,0 warp moco02-1 2,2,moc_pryd01.gat,90,105
-moc_prydb1.gat,100,55,0 warp mocp09-1 2,1,moc_pryd05.gat,94,96
-moc_prydb1.gat,100,77,0 warp mocp10-1 5,2,moc_prydb1.gat,100,107
-moc_prydb1.gat,111,115,0 warp mocp11 2,6,moc_prydb1.gat,145,115
-moc_prydb1.gat,142,115,0 warp mocp11-1 2,6,moc_prydb1.gat,108,115
-moc_prydb1.gat,59,115,0 warp mocp12 2,6,moc_prydb1.gat,90,115
-moc_prydb1.gat,87,115,0 warp mocp12-1 2,6,moc_prydb1.gat,56,115
+//===== Athena Script ========================================
+//= Morroc Dungeons Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Morroc Dungeons
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Morroc Sphinx ============================================
+in_sphinx1.gat,288,6,0 warp sphx001 5,1,moc_fild19.gat,100,99
+in_sphinx1.gat,80,191,0 warp sphx01 2,1,in_sphinx2.gat,149,81
+in_sphinx2.gat,149,77,0 warp sphx01-1 3,2,in_sphinx1.gat,80,189
+in_sphinx2.gat,276,272,0 warp sphx02 1,3,in_sphinx3.gat,210,54
+in_sphinx3.gat,210,57,0 warp sphx02-1 4,1,in_sphinx2.gat,274,272
+in_sphinx3.gat,35,227,0 warp sphx03 2,4,in_sphinx3.gat,62,227
+in_sphinx3.gat,60,227,0 warp sphx03-1 1,4,in_sphinx3.gat,32,227
+in_sphinx3.gat,70,111,0 warp sphx04 1,1,in_sphinx3.gat,70,81
+in_sphinx3.gat,70,83,0 warp sphx04-1 4,1,in_sphinx3.gat,70,113
+in_sphinx3.gat,12,69,0 warp sphx05 4,1,in_sphinx4.gat,10,222
+in_sphinx4.gat,10,224,0 warp sphx05-1 2,1,in_sphinx3.gat,12,71
+in_sphinx4.gat,120,113,0 warp sphx06 4,2,in_sphinx5.gat,100,99
+in_sphinx5.gat,100,96,0 warp sphx06-1 4,2,in_sphinx4.gat,120,116
+in_sphinx5.gat,11,16,0 warp sphx07 3,1,in_sphinx5.gat,189,181
+in_sphinx5.gat,11,183,0 warp sphx07-1 3,1,in_sphinx5.gat,11,18
+in_sphinx5.gat,189,16,0 warp sphx08-1 3,1,in_sphinx5.gat,11,181
+in_sphinx5.gat,16,188,0 warp sphx08-2 1,3,in_sphinx5.gat,181,188
+in_sphinx5.gat,16,10,0 warp sphx08-3 1,3,in_sphinx5.gat,181,10
+in_sphinx5.gat,183,10,0 warp sphx08-4 1,3,in_sphinx5.gat,18,188
+in_sphinx5.gat,183,188,0 warp sphx08-5 1,3,in_sphinx5.gat,18,10
+in_sphinx5.gat,189,183,0 warp sphx08-6 3,1,in_sphinx5.gat,189,18
+
+//= Morroc Pyramid ===========================================
+moc_pryd01.gat,10,195,0 warp mocp01 5,2,moc_pryd02.gat,10,192
+moc_pryd01.gat,195,9,0 warp mocp001 2,5,moc_ruins.gat,60,161
+moc_pryd01.gat,90,109,0 warp mocp02 1,2,moc_prydb1.gat,100,185
+moc_pryd02.gat,10,195,0 warp mocp01-1 5,2,moc_pryd01.gat,10,192
+moc_pryd02.gat,100,99,0 warp mocp03 3,2,moc_pryd03.gat,100,92
+moc_pryd03.gat,100,97,0 warp mocp03-1 3,2,moc_pryd02.gat,100,92
+moc_pryd03.gat,12,15,0 warp mocp04 3,2,moc_pryd04.gat,12,18
+moc_pryd03.gat,15,187,0 warp mocp05 2,3,moc_pryd04.gat,18,187
+moc_pryd03.gat,184,11,0 warp mocp06 2,3,moc_pryd04.gat,181,11
+moc_pryd03.gat,188,184,0 warp mocp07 3,2,moc_pryd04.gat,188,181
+moc_pryd04.gat,12,15,0 warp mocp04-1 3,2,moc_pryd03.gat,12,18
+moc_pryd04.gat,15,187,0 warp mocp05-1 2,3,moc_pryd03.gat,18,187
+moc_pryd04.gat,184,11,0 warp mocp06-1 2,3,moc_pryd03.gat,181,11
+moc_pryd04.gat,188,184,0 warp mocp07-1 3,2,moc_pryd03.gat,188,181
+moc_pryd05.gat,223,9,0 warp mocp08 2,2,moc_pryd06.gat,192,10
+moc_pryd05.gat,94,98,0 warp mocp09 2,1,moc_prydb1.gat,100,57
+moc_pryd06.gat,197,10,0 warp mocp08-1 2,3,moc_pryd05.gat,220,9
+moc_prydb1.gat,100,104,0 warp mocp10 5,2,moc_prydb1.gat,100,74
+moc_prydb1.gat,100,191,0 warp moco02-1 2,2,moc_pryd01.gat,90,105
+moc_prydb1.gat,100,55,0 warp mocp09-1 2,1,moc_pryd05.gat,94,96
+moc_prydb1.gat,100,77,0 warp mocp10-1 5,2,moc_prydb1.gat,100,107
+moc_prydb1.gat,111,115,0 warp mocp11 2,6,moc_prydb1.gat,145,115
+moc_prydb1.gat,142,115,0 warp mocp11-1 2,6,moc_prydb1.gat,108,115
+moc_prydb1.gat,59,115,0 warp mocp12 2,6,moc_prydb1.gat,90,115
+moc_prydb1.gat,87,115,0 warp mocp12-1 2,6,moc_prydb1.gat,56,115
diff --git a/npc/warps/dungeons/odin.txt b/npc/warps/dungeons/odin.txt
index 4abbbbcad..211601133 100644
--- a/npc/warps/dungeons/odin.txt
+++ b/npc/warps/dungeons/odin.txt
@@ -1,69 +1,69 @@
-//===== Athena Script ========================================
-//= Odin Temple Warp Script
-//===== By: ==================================================
-//= birkiczd (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Odin Temple
-//===== Additional Comments: =================================
-//= 1.1 Move the Saylor from Hugel.txt here. [Poki#3]
-//= Hako's Sprite, cords and price is official. The text is not.
-//= 1.2 Removed Duplicates [Silent]
-//============================================================
-
-odin_tem01.gat,378,181,0 warp odin01 1,1,odin_tem02.gat,22,181
-odin_tem02.gat,20,181,0 warp odin02 1,1,odin_tem01.gat,376,181
-odin_tem01.gat,384,334,0 warp odin03 1,1,odin_tem02.gat,23,334
-odin_tem02.gat,20,334,0 warp odin04 1,1,odin_tem01.gat,381,334
-odin_tem02.gat,152,350,0 warp odin05 1,1,odin_tem03.gat,121,51
-odin_tem03.gat,122,48,0 warp odin06 1,1,odin_tem02.gat,153,347
-odin_tem02.gat,259,374,0 warp odin07 1,1,odin_tem03.gat,249,35
-odin_tem03.gat,249,33,0 warp odin08 1,1,odin_tem02.gat,262,371
-
-hugel.gat,209,109,1 script Sailor Hako#01 709,{
- mes "[Sailor Hako]";
- mes "Hello stranger. I'm the only person that offers a unique trip to the cursed Odin Islands.";
- mes "One of the strongest monsters known to man live there, so no wonder. Ha, ha, ha~!";
- next;
- mes "[Sailor Hako]";
- mes "Anyway I'm planing a trip right now. I'll let you tag along for a measly 800 zeny. You dig?";
- next;
- menu "Yeah, I dig.",-,"No, thanks.",L_No;
- mes "[Sailor Hako]";
- if (Zeny < 800) goto L_Zeny;
- set Zeny, Zeny-800;
- mes "All aboard!";
- next;
- warp "odin_tem01.gat",100,145;
- end;
-
-L_Zeny:
- mes "Who are ya trying to kid? You're poor like a church mouse!";
- mes "Come back whey you make some cash, and I'll let you hike along";
- close;
-
-L_No:
- mes "[Sailor Hako]";
- mes "Suit yourself. Se ya!";
- close;
-}
-
-odin_tem01.gat,93,146,3 script Sailor Hako#02 709,{
- mes "[Sailor Hako]";
- mes "So how is it? Not to hard for ya? Wanna to go back to Hugel?";
- next;
- menu "Yeah...",-,"Nope.",L_No;
- mes "[Sailor Hako]";
- mes "All aboard!";
- next;
- warp "hugel.gat",205,108;
- end;
-
-L_No:
- mes "[Sailor Hako]";
- mes "Suit yourself.";
- close;
+//===== Athena Script ========================================
+//= Odin Temple Warp Script
+//===== By: ==================================================
+//= birkiczd (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Odin Temple
+//===== Additional Comments: =================================
+//= 1.1 Move the Saylor from Hugel.txt here. [Poki#3]
+//= Hako's Sprite, cords and price is official. The text is not.
+//= 1.2 Removed Duplicates [Silent]
+//============================================================
+
+odin_tem01.gat,378,181,0 warp odin01 1,1,odin_tem02.gat,22,181
+odin_tem02.gat,20,181,0 warp odin02 1,1,odin_tem01.gat,376,181
+odin_tem01.gat,384,334,0 warp odin03 1,1,odin_tem02.gat,23,334
+odin_tem02.gat,20,334,0 warp odin04 1,1,odin_tem01.gat,381,334
+odin_tem02.gat,152,350,0 warp odin05 1,1,odin_tem03.gat,121,51
+odin_tem03.gat,122,48,0 warp odin06 1,1,odin_tem02.gat,153,347
+odin_tem02.gat,259,374,0 warp odin07 1,1,odin_tem03.gat,249,35
+odin_tem03.gat,249,33,0 warp odin08 1,1,odin_tem02.gat,262,371
+
+hugel.gat,209,109,1 script Sailor Hako#01 709,{
+ mes "[Sailor Hako]";
+ mes "Hello stranger. I'm the only person that offers a unique trip to the cursed Odin Islands.";
+ mes "One of the strongest monsters known to man live there, so no wonder. Ha, ha, ha~!";
+ next;
+ mes "[Sailor Hako]";
+ mes "Anyway I'm planing a trip right now. I'll let you tag along for a measly 800 zeny. You dig?";
+ next;
+ menu "Yeah, I dig.",-,"No, thanks.",L_No;
+ mes "[Sailor Hako]";
+ if (Zeny < 800) goto L_Zeny;
+ set Zeny, Zeny-800;
+ mes "All aboard!";
+ next;
+ warp "odin_tem01.gat",100,145;
+ end;
+
+L_Zeny:
+ mes "Who are ya trying to kid? You're poor like a church mouse!";
+ mes "Come back whey you make some cash, and I'll let you hike along";
+ close;
+
+L_No:
+ mes "[Sailor Hako]";
+ mes "Suit yourself. Se ya!";
+ close;
+}
+
+odin_tem01.gat,93,146,3 script Sailor Hako#02 709,{
+ mes "[Sailor Hako]";
+ mes "So how is it? Not to hard for ya? Wanna to go back to Hugel?";
+ next;
+ menu "Yeah...",-,"Nope.",L_No;
+ mes "[Sailor Hako]";
+ mes "All aboard!";
+ next;
+ warp "hugel.gat",205,108;
+ end;
+
+L_No:
+ mes "[Sailor Hako]";
+ mes "Suit yourself.";
+ close;
} \ No newline at end of file
diff --git a/npc/warps/dungeons/orc_dun.txt b/npc/warps/dungeons/orc_dun.txt
index 594e151f5..6eba23883 100644
--- a/npc/warps/dungeons/orc_dun.txt
+++ b/npc/warps/dungeons/orc_dun.txt
@@ -1,26 +1,26 @@
-//===== Athena Script ========================================
-//= Orc Dungeon Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Orc Dungeon
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Orc Dungeon ==============================================
-in_orcs01.gat,108,86,0 warp orc001 3,2,gef_fild10.gat,223,203
-in_orcs01.gat,124,171,0 warp orc002 1,3,gef_fild10.gat,138,329
-in_orcs01.gat,162,55,0 warp orc003 4,1,gef_fild10.gat,214,53
-in_orcs01.gat,29,116,0 warp orc004 4,1,gef_fild10.gat,137,286
-in_orcs01.gat,30,154,0 warp orc005 3,2,gef_fild10.gat,65,335
-in_orcs01.gat,30,182,0 warp orc01 2,1,orcsdun01.gat,32,170
-orcsdun01.gat,32,172,0 warp orc01-1 3,1,in_orcs01.gat,30,180
-in_orcs01.gat,108,114,0 warp orc02 2,1,orcsdun02.gat,180,17
-orcsdun02.gat,180,15,0 warp orc02-1 2,1,in_orcs01.gat,108,112
-orcsdun01.gat,183,8,0 warp orc03 4,2,orcsdun02.gat,21,185
+//===== Athena Script ========================================
+//= Orc Dungeon Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Orc Dungeon
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Orc Dungeon ==============================================
+in_orcs01.gat,108,86,0 warp orc001 3,2,gef_fild10.gat,223,203
+in_orcs01.gat,124,171,0 warp orc002 1,3,gef_fild10.gat,138,329
+in_orcs01.gat,162,55,0 warp orc003 4,1,gef_fild10.gat,214,53
+in_orcs01.gat,29,116,0 warp orc004 4,1,gef_fild10.gat,137,286
+in_orcs01.gat,30,154,0 warp orc005 3,2,gef_fild10.gat,65,335
+in_orcs01.gat,30,182,0 warp orc01 2,1,orcsdun01.gat,32,170
+orcsdun01.gat,32,172,0 warp orc01-1 3,1,in_orcs01.gat,30,180
+in_orcs01.gat,108,114,0 warp orc02 2,1,orcsdun02.gat,180,17
+orcsdun02.gat,180,15,0 warp orc02-1 2,1,in_orcs01.gat,108,112
+orcsdun01.gat,183,8,0 warp orc03 4,2,orcsdun02.gat,21,185
orcsdun02.gat,21,188,0 warp orc03-1 8,2,orcsdun01.gat,183,11 \ No newline at end of file
diff --git a/npc/warps/dungeons/payon_dun.txt b/npc/warps/dungeons/payon_dun.txt
index 1857a3c86..779714d39 100644
--- a/npc/warps/dungeons/payon_dun.txt
+++ b/npc/warps/dungeons/payon_dun.txt
@@ -1,36 +1,36 @@
-//===== eAthena Script =======================================
-//= Payon Cave Warps
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= Payon Dungeon Warps
-//===== Additional Comments: =================================
-//= 1.1a Fixed 'payd04r' warping players to a non-existant tile [MasterOfMuppets]
-//============================================================
-
-//= Payon Cave ===============================================
-pay_dun00.gat,184,33,0 warp payd01 2,7,pay_dun01.gat,19,33
-pay_dun00.gat,21,186,0 warp pay005 2,2,pay_arche.gat,39,131
-pay_dun01.gat,15,33,0 warp payd01-1 2,6,pay_dun00.gat,181,33
-pay_dun01.gat,286,25,0 warp payd02 2,7,pay_dun02.gat,19,63
-pay_dun02.gat,137,128,0 warp payd03 4,1,pay_dun03.gat,155,159
-pay_dun02.gat,16,63,0 warp payd02-1 2,7,pay_dun01.gat,283,28
-pay_dun03.gat,155,161,0 warp payd03-1 2,1,pay_dun02.gat,137,126
-pay_dun03.gat,127,62,4 script payd04r 45,2,2,{
- set @r,rand(4);
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- warp "pay_dun04.gat",201,204; end;
- w2: warp "pay_dun04.gat",189,43; end;
- w3: warp "pay_dun04.gat",43,40; end;
- w4: warp "pay_dun04.gat",34,202; end;
-}
-pay_dun04.gat,191,41,0 warp payd04-2 1,1,pay_dun03.gat,124,62
-pay_dun04.gat,202,206,0 warp payd04-3 1,1,pay_dun03.gat,124,62
-pay_dun04.gat,32,204,0 warp payd04-4 2,1,pay_dun03.gat,124,62
-pay_dun04.gat,40,37,0 warp payd04-1 2,2,pay_dun03.gat,124,62
+//===== eAthena Script =======================================
+//= Payon Cave Warps
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= Payon Dungeon Warps
+//===== Additional Comments: =================================
+//= 1.1a Fixed 'payd04r' warping players to a non-existant tile [MasterOfMuppets]
+//============================================================
+
+//= Payon Cave ===============================================
+pay_dun00.gat,184,33,0 warp payd01 2,7,pay_dun01.gat,19,33
+pay_dun00.gat,21,186,0 warp pay005 2,2,pay_arche.gat,39,131
+pay_dun01.gat,15,33,0 warp payd01-1 2,6,pay_dun00.gat,181,33
+pay_dun01.gat,286,25,0 warp payd02 2,7,pay_dun02.gat,19,63
+pay_dun02.gat,137,128,0 warp payd03 4,1,pay_dun03.gat,155,159
+pay_dun02.gat,16,63,0 warp payd02-1 2,7,pay_dun01.gat,283,28
+pay_dun03.gat,155,161,0 warp payd03-1 2,1,pay_dun02.gat,137,126
+pay_dun03.gat,127,62,4 script payd04r 45,2,2,{
+ set @r,rand(4);
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ warp "pay_dun04.gat",201,204; end;
+ w2: warp "pay_dun04.gat",189,43; end;
+ w3: warp "pay_dun04.gat",43,40; end;
+ w4: warp "pay_dun04.gat",34,202; end;
+}
+pay_dun04.gat,191,41,0 warp payd04-2 1,1,pay_dun03.gat,124,62
+pay_dun04.gat,202,206,0 warp payd04-3 1,1,pay_dun03.gat,124,62
+pay_dun04.gat,32,204,0 warp payd04-4 2,1,pay_dun03.gat,124,62
+pay_dun04.gat,40,37,0 warp payd04-1 2,2,pay_dun03.gat,124,62
diff --git a/npc/warps/dungeons/prt_dun.txt b/npc/warps/dungeons/prt_dun.txt
index 8b8b001d3..abf667485 100644
--- a/npc/warps/dungeons/prt_dun.txt
+++ b/npc/warps/dungeons/prt_dun.txt
@@ -1,242 +1,242 @@
-//===== Athena Script ========================================
-//= Prontera Dungeons Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Dungeons
-//===== Additional Comments: =================================
-//= 1.1 updating according to jA. Optimized scripts [Lupus]
-//============================================================
-
-//= Hidden Temple ============================================
-// ----- (1st Floor No.03)(1st Floor No.16)(1st Floor No.20)
-// 1st Floor No.01 -------------------------------------------------------------
-prt_maze01.gat,22,194,0 warp mazewarp5101 1,1,prt_maze01.gat,16,31 /*To No.1-21*/
-prt_maze01.gat,5,186,0 warp mazewarp5102 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
-// 1st Floor No.02
-prt_maze01.gat,58,194,0 warp mazewarp5103 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
-// 1st Floor No.03
-prt_maze01.gat,102,165,0 warp mazewarp5104 1,1,prt_maze01.gat,99,31 /*To No.1-23*/
-prt_maze01.gat,85,174,0 warp mazewarp5105 1,1,prt_maze02.gat,93,20
-// 1st Floor No.04
-prt_maze01.gat,154,181,0 warp mazewarp5106 1,1,prt_maze01.gat,191,175 /*To No.1-5*/
-prt_maze01.gat,125,171,0 warp mazewarp5107 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
-// 1st Floor No.05
-prt_maze01.gat,175,165,0 warp mazewarp5108 1,1,prt_maze01.gat,48,104 /*To No.1-12*/
-prt_maze01.gat,194,175,0 warp mazewarp5109 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
-// 1st Floor No.06
-prt_maze01.gat,18,154,0 warp mazewarp5110 1,1,prt_maze01.gat,177,71 /*To No.1-20*/
-prt_maze01.gat,23,125,0 warp mazewarp5111 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
-prt_maze01.gat,5,140,0 warp mazewarp5112 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
-// 1st Floor No.07
-prt_maze01.gat,54,154,0 warp mazewarp5113 1,1,prt_maze01.gat,191,175 /*To No.1-5*/
-prt_maze01.gat,63,125,0 warp mazewarp5114 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
-// 1st Floor No.08
-prt_maze01.gat,98,154,0 warp mazewarp5115 1,1,prt_maze01.gat,102,168 /*To No.1-3*/
-prt_maze01.gat,114,145,0 warp mazewarp5116 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
-prt_maze01.gat,85,146,0 warp mazewarp5117 1,1,prt_maze01.gat,142,111 /*To No.1-14*/
-// 1st Floor No.09
-prt_maze01.gat,137,125,0 warp mazewarp5118 1,1,prt_maze01.gat,191,139 /*To No.1-10*/
-prt_maze01.gat,154,134,0 warp mazewarp5119 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
-// 1st Floor No.10
-prt_maze01.gat,194,139,0 warp mazewarp5120 1,1,prt_maze01.gat,22,88 /*To No.1-11*/
-prt_maze01.gat,166,139,0 warp mazewarp5121 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
-// 1st Floor No.11
-prt_maze01.gat,17,114,0 warp mazewarp5122 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
-prt_maze01.gat,22,85,0 warp mazewarp5123 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
-// 1st Floor No.12
-prt_maze01.gat,63,114,0 warp mazewarp5124 1,1,prt_maze01.gat,111,56 /*To No.1-18*/
-prt_maze01.gat,63,85,0 warp mazewarp5125 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
-prt_maze01.gat,74,97,0 warp mazewarp5126 1,1,prt_maze01.gat,71,11 /*To No.1-22*/
-prt_maze01.gat,45,104,0 warp mazewarp5127 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
-// 1st Floor No.13
-prt_maze01.gat,105,114,0 warp mazewarp5128 1,1,prt_maze01.gat,111,145 /*To No.1-8?*/
-prt_maze01.gat,114,95,0 warp mazewarp5129 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
-prt_maze01.gat,85,97,0 warp mazewarp5130 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
-// 1st Floor No.14
-prt_maze01.gat,142,114,0 warp mazewarp5131 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
-prt_maze01.gat,125,105,0 warp mazewarp5132 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
-// 1st Floor No.15
-prt_maze01.gat,182,85,0 warp mazewarp5133 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
-prt_maze01.gat,194,94,0 warp mazewarp5134 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
-prt_maze01.gat,168,94,0 warp mazewarp5135 1,1,prt_maze01.gat,191,139 /*To No.1-10*/
-// 1st Floor No.16
-prt_maze01.gat,14,74,0 warp mazewarp5136 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
-prt_maze01.gat,14,45,0 warp mazewarp5137 1,1,mjolnir_12.gat,44,21
-prt_maze01.gat,5,58,0 warp mazewarp5138 1,1,prt_maze01.gat,48,104 /*To No.1-12*/
-// 1st Floor No.17
-prt_maze01.gat,74,74,0 warp mazewarp5139 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
-prt_maze01.gat,52,45,0 warp mazewarp5140 1,1,prt_maze01.gat,139,48 /*To No.1-19*/
-// 1st Floor No.18
-prt_maze01.gat,104,74,0 warp mazewarp5141 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
-prt_maze01.gat,96,45,0 warp mazewarp5142 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
-prt_maze01.gat,114,56,0 warp mazewarp5143 1,1,prt_maze01.gat,176,8 /*To No.1-25*/
-prt_maze01.gat,85,56,0 warp mazewarp5144 1,1,prt_maze01.gat,105,111 /*To No.1-13*/
-// 1st Floor No.19
-prt_maze01.gat,137,74,0 warp mazewarp5145 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
-prt_maze01.gat,139,45,0 warp mazewarp5146 1,1,prt_maze01.gat,71,11 /*To No.1-22*/
-// 1st Floor No.20
-prt_maze01.gat,177,74,0 warp mazewarp5147 1,1,prt_fild01.gat,136,368
-prt_maze01.gat,175,45,0 warp mazewarp5148 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
-prt_maze01.gat,194,54,0 warp mazewarp5149 1,1,prt_maze01.gat,99,31 /*To No.1-23*/
-// 1st Floor No.21
-prt_maze01.gat,16,34,0 warp mazewarp5150 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
-prt_maze01.gat,23,5,0 warp mazewarp5151 1,1,prt_maze01.gat,176,8 /*To No.1-25*/
-// 1st Floor No.22
-prt_maze01.gat,54,5,0 warp mazewarp5152 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
-prt_maze01.gat,74,12,0 warp mazewarp5153 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
-prt_maze01.gat,45,21,0 warp mazewarp5154 1,1,prt_maze01.gat,142,111 /*To No.1-14*/
-// 1st Floor No.23
-prt_maze01.gat,99,34,0 warp mazewarp5155 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
-prt_maze01.gat,114,22,0 warp mazewarp5156 1,1,prt_maze01.gat,177,71 /*To No.1-20*/
-prt_maze01.gat,85,13,0 warp mazewarp5157 1,1,prt_maze01.gat,22,88 /*To No.1-11*/
-//1st Floor No.24
-prt_maze01.gat,154,22,0 warp mazewarp5158 1,1,prt_maze01.gat,139,48 /*To No.1-19*/
-// 1st Floor No.25
-prt_maze01.gat,176,34,0 warp mazewarp5159 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
-prt_maze01.gat,176,5,0 warp mazewarp5160 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
-prt_maze01.gat,194,15,0 warp mazewarp5161 1,1,prt_maze01.gat,52,48 /*To No.1-17*/
-prt_maze01.gat,165,22,0 warp mazewarp5162 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
-// 2nd Floor -------------------------------------------------------------------
-prt_maze02.gat,93,16,0 warp mazewarp5201 1,1,prt_maze01.gat,102,168 /*To No.1-3*/
-prt_maze02.gat,100,182,0 warp mazewarp5202 1,1,prt_maze03.gat,182,88 /*To No.3-15*/
-// 3rd Floor No.01 -------------------------------------------------------------
-prt_maze03.gat,22,194,0 warp mazewarp5301 1,1,prt_maze03.gat,175,48 /*To No.3-20*/
-prt_maze03.gat,5,186,0 warp mazewarp5302 1,1,prt_maze03.gat,151,134 /*To No.3-9*/
-//3rd Floor No.02
-prt_maze03.gat,58,194,0 script #mazewarp5303 45,1,1,{
- set @w,rand(4);
- if(@w==1)goto w2;
- if(@w==2)goto w3;
- if(@w==3)goto w4;
- warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
- w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
- w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
- w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
-}
-// 3rd Floor No.03
-prt_maze03.gat,102,165,0 warp mazewarp5304 1,1,prt_maze03.gat,137,71 /*To No.3-19*/
-prt_maze03.gat,85,174,0 warp mazewarp5305 1,1,prt_maze03.gat,14,47 /*To No.3-16*/
-// 3rd Floor No.04
-prt_maze03.gat,154,181,0 warp mazewarp5306 1,1,prt_maze03.gat,139,48 /*To No.3-19*/
-prt_maze03.gat,125,171,0 warp mazewarp5307 1,1,prt_maze03.gat,105,111 /*To No.3-13*/
-// 3rd Floor No.05
-prt_maze03.gat,175,165,0 warp mazewarp5308 1,1,prt_maze03.gat,71,12 /*To No.3-22*/
-prt_maze03.gat,194,175,0 warp mazewarp5309 1,1,prt_maze03.gat,191,139 /*To No.3-10*/
-// 3rd Floor No.06
-prt_maze03.gat,18,154,0 warp mazewarp5310 1,1,prt_maze03.gat,48,21 /*To No.3-22*/
-prt_maze03.gat,23,125,0 warp mazewarp5311 1,1,prt_maze03.gat,177,71 /*To No.3-20*/
-prt_maze03.gat,5,140,0 warp mazewarp5312 1,1,prt_maze03.gat,111,56 /*To No.3-18*/
-// 3rd Floor No.07
-prt_maze03.gat,54,154,0 warp mazewarp5313 1,1,prt_maze03.gat,142,111 /*To No.3-14*/
-prt_maze03.gat,63,125,0 warp mazewarp5314 1,1,prt_maze03.gat,88,97 /*To No.3-13*/
-// 3rd Floor No.08
-prt_maze03.gat,98,154,0 warp mazewarp5315 1,1,prt_maze03.gat,99,31 /*To No.3-23*/
-prt_maze03.gat,114,145,0 warp mazewarp5316 1,1,prt_maze03.gat,168,22 /*To No.3-25*/
-prt_maze03.gat,85,146,0 warp mazewarp5317 1,1,prt_maze03.gat,22,88 /*To No.3-11*/
-// 3rd Floor No.09
-prt_maze03.gat,137,125,0 warp mazewarp5318 1,1,prt_maze03.gat,71,71 /*To No.3-17*/
-prt_maze03.gat,154,134,0 warp mazewarp5319 1,1,prt_maze03.gat,8,186 /*To No.3-1*/
-// 3rd Floor No.10
-prt_maze03.gat,194,139,0 warp mazewarp5320 1,1,prt_maze03.gat,191,175 /*To No.3-5*/
-prt_maze03.gat,166,139,0 warp mazewarp5321 1,1,prt_maze03.gat,63,88 /*To No.3-12*/
-// 3rd Floor No.11
-prt_maze03.gat,17,114,0 warp mazewarp5322 1,1,prt_maze03.gat,128,105 /*To No.3-14*/
-prt_maze03.gat,22,85,0 warp mazewarp5323 1,1,prt_maze03.gat,88,146 /*To No.3-8*/
-// 3rd Floor No.12
-prt_maze03.gat,63,114,0 warp mazewarp5324 1,1,prt_maze03.gat,14,71 /*To No.3-16*/
-prt_maze03.gat,63,85,0 warp mazewarp5325 1,1,prt_maze03.gat,169,139 /*To No.3-10*/
-prt_maze03.gat,74,97,0 warp mazewarp5326 1,1,prt_maze03.gat,54,8 /*To No.3-22*/
-prt_maze03.gat,45,104,0 warp mazewarp5327 1,1,prt_maze03.gat,96,48 /*To No.3-18*/
-// 3rd Floor No.13
-prt_maze03.gat,105,114,0 warp mazewarp5328 1,1,prt_maze03.gat,128,171 /*To No.3-4*/
-prt_maze03.gat,114,95,0 warp mazewarp5329 1,1,prt_maze03.gat,176,8 /*To No.3-25*/
-prt_maze03.gat,85,97,0 warp mazewarp5330 1,1,prt_maze03.gat,63,128 /*To No.3-7*/
-// 3rd Floor No.14
-prt_maze03.gat,142,114,0 warp mazewarp5331 1,1,prt_maze03.gat,54,151 /*To No.3-7*/
-prt_maze03.gat,125,105,0 warp mazewarp5332 1,1,prt_maze03.gat,58,191 /*To No.3-2*/
-// 3rd Floor No.15
-prt_maze03.gat,182,85,0 warp mazewarp5333 1,1,prt_maze02.gat,100,179
-prt_maze03.gat,194,94,0 warp mazewarp5334 1,1,prt_maze03.gat,151,22 /*To No.3-24*/
-prt_maze03.gat,168,94,0 warp mazewarp5335 1,1,prt_maze03.gat,191,54 /*To No.3-20*/
-// 3rd Floor No.16
-prt_maze03.gat,14,74,0 warp mazewarp5336 1,1,prt_maze03.gat,63,111 /*To No.3-12*/
-prt_maze03.gat,14,45,0 warp mazewarp5337 1,1,prt_maze03.gat,88,174 /*To No.3-3*/
-prt_maze03.gat,5,58,0 warp mazewarp5338 1,1,prt_maze03.gat,191,15 /*To No.3-25*/
-// 3rd Floor No.17
-prt_maze03.gat,74,74,0 script #mazewarp5339 45,1,1,{
-set @w,rand(4);
- if(@w==1)goto w2;
- if(@w==2)goto w3;
- if(@w==3)goto w4;
- warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
- w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
- w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
- w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
-}
-prt_maze03.gat,52,45,0 warp mazewarp5340 1,1,prt_maze03.gat,16,31 /*To No.3-21*/
-// 3rd Floor No.18
-prt_maze03.gat,104,74,0 warp mazewarp5341 1,1,prt_maze03.gat,111,22 /*To No.3-23*/
-prt_maze03.gat,96,45,0 warp mazewarp5342 1,1,prt_maze03.gat,48,104 /*To No.3-12*/
-prt_maze03.gat,114,56,0 warp mazewarp5343 1,1,prt_maze03.gat,8,140 /*To No.3-6*/
-prt_maze03.gat,85,56,0 warp mazewarp5344 1,1,prt_maze03.gat,176,31 /*To No.3-25*/
-// 3rd Floor No.19
-prt_maze03.gat,137,74,0 warp mazewarp5345 1,1,prt_maze03.gat,102,168 /*To No.3-3*/
-prt_maze03.gat,139,45,0 script #mazewarp5346 45,1,1,{
- set @w,rand(4);
- if(@w==1)goto w2;
- if(@w==2)goto w3;
- if(@w==3)goto w4;
- warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
- w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
- w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
- w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
-}
-// 3rd Floor No.20
-prt_maze03.gat,177,74,0 warp mazewarp5347 1,1,prt_maze03.gat,23,128 /*To No.3-6*/
-prt_maze03.gat,175,45,0 warp mazewarp5348 1,1,prt_maze03.gat,22,191 /*To No.3-1*/
-prt_maze03.gat,194,54,0 warp mazewarp5349 1,1,prt_maze03.gat,171,94 /*To No.3-15*/
-// 3rd Floor No.21
-prt_maze03.gat,16,34,0 warp mazewarp5350 1,1,prt_maze03.gat,52,48 /*To No.3-17*/
-prt_maze03.gat,23,5,0 warp mazewarp5351 1,1,prt_maze03.gat,88,13 /*To No.3-23*/
-// 3rd Floor No.22
-prt_maze03.gat,54,5,0 warp mazewarp5352 1,1,prt_maze03.gat,71,97 /*To No.3-12*/
-prt_maze03.gat,74,12,0 warp mazewarp5353 1,1,prt_maze03.gat,175,168 /*To No.3-5*/
-prt_maze03.gat,45,21,0 warp mazewarp5354 1,1,prt_maze03.gat,18,151 /*To No.3-6*/
-// 3rd Floor No.23
-prt_maze03.gat,99,34,0 warp mazewarp5355 1,1,prt_maze03.gat,98,151 /*To No.3-8*/
-prt_maze03.gat,114,22,0 warp mazewarp5356 1,1,prt_maze03.gat,104,71 /*To No.3-18*/
-prt_maze03.gat,85,13,0 warp mazewarp5357 1,1,prt_maze03.gat,23,8 /*To No.3-21*/
-// 3rd Floor No.24
-prt_maze03.gat,154,22,0 script #mazewarp5358 45,1,1,{
- set @w,rand(4);
- if(@w==1)goto w2;
- if(@w==2)goto w3;
- if(@w==3)goto w4;
- warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
- w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
- w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
- w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
-}
-// 3rd Floor No.25
-prt_maze03.gat,176,34,0 warp mazewarp5359 1,1,prt_maze03.gat,88,56 /*To No.3-18*/
-prt_maze03.gat,176,5,0 warp mazewarp5360 1,1,prt_maze03.gat,111,95 /*To No.3-13*/
-prt_maze03.gat,194,15,0 warp mazewarp5361 1,1,prt_maze03.gat,8,58 /*To No.3-16*/
-prt_maze03.gat,165,22,0 warp mazewarp5362 1,1,prt_maze03.gat,111,145 /*To No.3-8*/
-
-//= Prontera Sewers ==============================================
-prt_sewb1.gat,135,248,0 warp prts001 2,2,prt_fild05.gat,274,208
-prt_sewb1.gat,188,247,0 warp prts01 1,3,prt_sewb2.gat,19,19
-prt_sewb2.gat,100,176,0 warp prts02 4,2,prt_sewb2.gat,140,28
-prt_sewb2.gat,140,24,0 warp prts02-1 4,2,prt_sewb2.gat,100,172
-prt_sewb2.gat,180,24,0 warp prts03 4,2,prt_sewb3.gat,180,169
-prt_sewb2.gat,19,12,0 warp prts01-1 2,2,prt_sewb1.gat,192,247
-prt_sewb2.gat,19,175,0 warp prts04 4,2,prt_sewb2.gat,60,28
-prt_sewb2.gat,60,24,0 warp prts04-1 4,2,prt_sewb2.gat,19,171
-prt_sewb3.gat,180,173,0 warp prts03-1 4,2,prt_sewb2.gat,180,28
-prt_sewb3.gat,20,185,0 warp prts05 3,2,prt_sewb4.gat,100,92
+//===== Athena Script ========================================
+//= Prontera Dungeons Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Dungeons
+//===== Additional Comments: =================================
+//= 1.1 updating according to jA. Optimized scripts [Lupus]
+//============================================================
+
+//= Hidden Temple ============================================
+// ----- (1st Floor No.03)(1st Floor No.16)(1st Floor No.20)
+// 1st Floor No.01 -------------------------------------------------------------
+prt_maze01.gat,22,194,0 warp mazewarp5101 1,1,prt_maze01.gat,16,31 /*To No.1-21*/
+prt_maze01.gat,5,186,0 warp mazewarp5102 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
+// 1st Floor No.02
+prt_maze01.gat,58,194,0 warp mazewarp5103 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
+// 1st Floor No.03
+prt_maze01.gat,102,165,0 warp mazewarp5104 1,1,prt_maze01.gat,99,31 /*To No.1-23*/
+prt_maze01.gat,85,174,0 warp mazewarp5105 1,1,prt_maze02.gat,93,20
+// 1st Floor No.04
+prt_maze01.gat,154,181,0 warp mazewarp5106 1,1,prt_maze01.gat,191,175 /*To No.1-5*/
+prt_maze01.gat,125,171,0 warp mazewarp5107 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
+// 1st Floor No.05
+prt_maze01.gat,175,165,0 warp mazewarp5108 1,1,prt_maze01.gat,48,104 /*To No.1-12*/
+prt_maze01.gat,194,175,0 warp mazewarp5109 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
+// 1st Floor No.06
+prt_maze01.gat,18,154,0 warp mazewarp5110 1,1,prt_maze01.gat,177,71 /*To No.1-20*/
+prt_maze01.gat,23,125,0 warp mazewarp5111 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
+prt_maze01.gat,5,140,0 warp mazewarp5112 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
+// 1st Floor No.07
+prt_maze01.gat,54,154,0 warp mazewarp5113 1,1,prt_maze01.gat,191,175 /*To No.1-5*/
+prt_maze01.gat,63,125,0 warp mazewarp5114 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
+// 1st Floor No.08
+prt_maze01.gat,98,154,0 warp mazewarp5115 1,1,prt_maze01.gat,102,168 /*To No.1-3*/
+prt_maze01.gat,114,145,0 warp mazewarp5116 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
+prt_maze01.gat,85,146,0 warp mazewarp5117 1,1,prt_maze01.gat,142,111 /*To No.1-14*/
+// 1st Floor No.09
+prt_maze01.gat,137,125,0 warp mazewarp5118 1,1,prt_maze01.gat,191,139 /*To No.1-10*/
+prt_maze01.gat,154,134,0 warp mazewarp5119 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
+// 1st Floor No.10
+prt_maze01.gat,194,139,0 warp mazewarp5120 1,1,prt_maze01.gat,22,88 /*To No.1-11*/
+prt_maze01.gat,166,139,0 warp mazewarp5121 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
+// 1st Floor No.11
+prt_maze01.gat,17,114,0 warp mazewarp5122 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
+prt_maze01.gat,22,85,0 warp mazewarp5123 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
+// 1st Floor No.12
+prt_maze01.gat,63,114,0 warp mazewarp5124 1,1,prt_maze01.gat,111,56 /*To No.1-18*/
+prt_maze01.gat,63,85,0 warp mazewarp5125 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
+prt_maze01.gat,74,97,0 warp mazewarp5126 1,1,prt_maze01.gat,71,11 /*To No.1-22*/
+prt_maze01.gat,45,104,0 warp mazewarp5127 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
+// 1st Floor No.13
+prt_maze01.gat,105,114,0 warp mazewarp5128 1,1,prt_maze01.gat,111,145 /*To No.1-8?*/
+prt_maze01.gat,114,95,0 warp mazewarp5129 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
+prt_maze01.gat,85,97,0 warp mazewarp5130 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
+// 1st Floor No.14
+prt_maze01.gat,142,114,0 warp mazewarp5131 1,1,prt_maze01.gat,23,128 /*To No.1-6*/
+prt_maze01.gat,125,105,0 warp mazewarp5132 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
+// 1st Floor No.15
+prt_maze01.gat,182,85,0 warp mazewarp5133 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
+prt_maze01.gat,194,94,0 warp mazewarp5134 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
+prt_maze01.gat,168,94,0 warp mazewarp5135 1,1,prt_maze01.gat,191,139 /*To No.1-10*/
+// 1st Floor No.16
+prt_maze01.gat,14,74,0 warp mazewarp5136 1,1,prt_maze01.gat,151,22 /*To No.1-24*/
+prt_maze01.gat,14,45,0 warp mazewarp5137 1,1,mjolnir_12.gat,44,21
+prt_maze01.gat,5,58,0 warp mazewarp5138 1,1,prt_maze01.gat,48,104 /*To No.1-12*/
+// 1st Floor No.17
+prt_maze01.gat,74,74,0 warp mazewarp5139 1,1,prt_maze01.gat,58,191 /*To No.1-2*/
+prt_maze01.gat,52,45,0 warp mazewarp5140 1,1,prt_maze01.gat,139,48 /*To No.1-19*/
+// 1st Floor No.18
+prt_maze01.gat,104,74,0 warp mazewarp5141 1,1,prt_maze01.gat,14,48 /*To No.1-16*/
+prt_maze01.gat,96,45,0 warp mazewarp5142 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
+prt_maze01.gat,114,56,0 warp mazewarp5143 1,1,prt_maze01.gat,176,8 /*To No.1-25*/
+prt_maze01.gat,85,56,0 warp mazewarp5144 1,1,prt_maze01.gat,105,111 /*To No.1-13*/
+// 1st Floor No.19
+prt_maze01.gat,137,74,0 warp mazewarp5145 1,1,prt_maze01.gat,182,88 /*To No.1-15*/
+prt_maze01.gat,139,45,0 warp mazewarp5146 1,1,prt_maze01.gat,71,11 /*To No.1-22*/
+// 1st Floor No.20
+prt_maze01.gat,177,74,0 warp mazewarp5147 1,1,prt_fild01.gat,136,368
+prt_maze01.gat,175,45,0 warp mazewarp5148 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
+prt_maze01.gat,194,54,0 warp mazewarp5149 1,1,prt_maze01.gat,99,31 /*To No.1-23*/
+// 1st Floor No.21
+prt_maze01.gat,16,34,0 warp mazewarp5150 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
+prt_maze01.gat,23,5,0 warp mazewarp5151 1,1,prt_maze01.gat,176,8 /*To No.1-25*/
+// 1st Floor No.22
+prt_maze01.gat,54,5,0 warp mazewarp5152 1,1,prt_maze01.gat,128,173 /*To No.1-4*/
+prt_maze01.gat,74,12,0 warp mazewarp5153 1,1,prt_maze01.gat,58,48 /*To No.1-17*/
+prt_maze01.gat,45,21,0 warp mazewarp5154 1,1,prt_maze01.gat,142,111 /*To No.1-14*/
+// 1st Floor No.23
+prt_maze01.gat,99,34,0 warp mazewarp5155 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
+prt_maze01.gat,114,22,0 warp mazewarp5156 1,1,prt_maze01.gat,177,71 /*To No.1-20*/
+prt_maze01.gat,85,13,0 warp mazewarp5157 1,1,prt_maze01.gat,22,88 /*To No.1-11*/
+//1st Floor No.24
+prt_maze01.gat,154,22,0 warp mazewarp5158 1,1,prt_maze01.gat,139,48 /*To No.1-19*/
+// 1st Floor No.25
+prt_maze01.gat,176,34,0 warp mazewarp5159 1,1,prt_maze01.gat,8,186 /*To No.1-1*/
+prt_maze01.gat,176,5,0 warp mazewarp5160 1,1,prt_maze01.gat,137,128 /*To No.1-9*/
+prt_maze01.gat,194,15,0 warp mazewarp5161 1,1,prt_maze01.gat,52,48 /*To No.1-17*/
+prt_maze01.gat,165,22,0 warp mazewarp5162 1,1,prt_maze01.gat,63,128 /*To No.1-7*/
+// 2nd Floor -------------------------------------------------------------------
+prt_maze02.gat,93,16,0 warp mazewarp5201 1,1,prt_maze01.gat,102,168 /*To No.1-3*/
+prt_maze02.gat,100,182,0 warp mazewarp5202 1,1,prt_maze03.gat,182,88 /*To No.3-15*/
+// 3rd Floor No.01 -------------------------------------------------------------
+prt_maze03.gat,22,194,0 warp mazewarp5301 1,1,prt_maze03.gat,175,48 /*To No.3-20*/
+prt_maze03.gat,5,186,0 warp mazewarp5302 1,1,prt_maze03.gat,151,134 /*To No.3-9*/
+//3rd Floor No.02
+prt_maze03.gat,58,194,0 script #mazewarp5303 45,1,1,{
+ set @w,rand(4);
+ if(@w==1)goto w2;
+ if(@w==2)goto w3;
+ if(@w==3)goto w4;
+ warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
+ w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
+ w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
+ w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
+}
+// 3rd Floor No.03
+prt_maze03.gat,102,165,0 warp mazewarp5304 1,1,prt_maze03.gat,137,71 /*To No.3-19*/
+prt_maze03.gat,85,174,0 warp mazewarp5305 1,1,prt_maze03.gat,14,47 /*To No.3-16*/
+// 3rd Floor No.04
+prt_maze03.gat,154,181,0 warp mazewarp5306 1,1,prt_maze03.gat,139,48 /*To No.3-19*/
+prt_maze03.gat,125,171,0 warp mazewarp5307 1,1,prt_maze03.gat,105,111 /*To No.3-13*/
+// 3rd Floor No.05
+prt_maze03.gat,175,165,0 warp mazewarp5308 1,1,prt_maze03.gat,71,12 /*To No.3-22*/
+prt_maze03.gat,194,175,0 warp mazewarp5309 1,1,prt_maze03.gat,191,139 /*To No.3-10*/
+// 3rd Floor No.06
+prt_maze03.gat,18,154,0 warp mazewarp5310 1,1,prt_maze03.gat,48,21 /*To No.3-22*/
+prt_maze03.gat,23,125,0 warp mazewarp5311 1,1,prt_maze03.gat,177,71 /*To No.3-20*/
+prt_maze03.gat,5,140,0 warp mazewarp5312 1,1,prt_maze03.gat,111,56 /*To No.3-18*/
+// 3rd Floor No.07
+prt_maze03.gat,54,154,0 warp mazewarp5313 1,1,prt_maze03.gat,142,111 /*To No.3-14*/
+prt_maze03.gat,63,125,0 warp mazewarp5314 1,1,prt_maze03.gat,88,97 /*To No.3-13*/
+// 3rd Floor No.08
+prt_maze03.gat,98,154,0 warp mazewarp5315 1,1,prt_maze03.gat,99,31 /*To No.3-23*/
+prt_maze03.gat,114,145,0 warp mazewarp5316 1,1,prt_maze03.gat,168,22 /*To No.3-25*/
+prt_maze03.gat,85,146,0 warp mazewarp5317 1,1,prt_maze03.gat,22,88 /*To No.3-11*/
+// 3rd Floor No.09
+prt_maze03.gat,137,125,0 warp mazewarp5318 1,1,prt_maze03.gat,71,71 /*To No.3-17*/
+prt_maze03.gat,154,134,0 warp mazewarp5319 1,1,prt_maze03.gat,8,186 /*To No.3-1*/
+// 3rd Floor No.10
+prt_maze03.gat,194,139,0 warp mazewarp5320 1,1,prt_maze03.gat,191,175 /*To No.3-5*/
+prt_maze03.gat,166,139,0 warp mazewarp5321 1,1,prt_maze03.gat,63,88 /*To No.3-12*/
+// 3rd Floor No.11
+prt_maze03.gat,17,114,0 warp mazewarp5322 1,1,prt_maze03.gat,128,105 /*To No.3-14*/
+prt_maze03.gat,22,85,0 warp mazewarp5323 1,1,prt_maze03.gat,88,146 /*To No.3-8*/
+// 3rd Floor No.12
+prt_maze03.gat,63,114,0 warp mazewarp5324 1,1,prt_maze03.gat,14,71 /*To No.3-16*/
+prt_maze03.gat,63,85,0 warp mazewarp5325 1,1,prt_maze03.gat,169,139 /*To No.3-10*/
+prt_maze03.gat,74,97,0 warp mazewarp5326 1,1,prt_maze03.gat,54,8 /*To No.3-22*/
+prt_maze03.gat,45,104,0 warp mazewarp5327 1,1,prt_maze03.gat,96,48 /*To No.3-18*/
+// 3rd Floor No.13
+prt_maze03.gat,105,114,0 warp mazewarp5328 1,1,prt_maze03.gat,128,171 /*To No.3-4*/
+prt_maze03.gat,114,95,0 warp mazewarp5329 1,1,prt_maze03.gat,176,8 /*To No.3-25*/
+prt_maze03.gat,85,97,0 warp mazewarp5330 1,1,prt_maze03.gat,63,128 /*To No.3-7*/
+// 3rd Floor No.14
+prt_maze03.gat,142,114,0 warp mazewarp5331 1,1,prt_maze03.gat,54,151 /*To No.3-7*/
+prt_maze03.gat,125,105,0 warp mazewarp5332 1,1,prt_maze03.gat,58,191 /*To No.3-2*/
+// 3rd Floor No.15
+prt_maze03.gat,182,85,0 warp mazewarp5333 1,1,prt_maze02.gat,100,179
+prt_maze03.gat,194,94,0 warp mazewarp5334 1,1,prt_maze03.gat,151,22 /*To No.3-24*/
+prt_maze03.gat,168,94,0 warp mazewarp5335 1,1,prt_maze03.gat,191,54 /*To No.3-20*/
+// 3rd Floor No.16
+prt_maze03.gat,14,74,0 warp mazewarp5336 1,1,prt_maze03.gat,63,111 /*To No.3-12*/
+prt_maze03.gat,14,45,0 warp mazewarp5337 1,1,prt_maze03.gat,88,174 /*To No.3-3*/
+prt_maze03.gat,5,58,0 warp mazewarp5338 1,1,prt_maze03.gat,191,15 /*To No.3-25*/
+// 3rd Floor No.17
+prt_maze03.gat,74,74,0 script #mazewarp5339 45,1,1,{
+set @w,rand(4);
+ if(@w==1)goto w2;
+ if(@w==2)goto w3;
+ if(@w==3)goto w4;
+ warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
+ w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
+ w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
+ w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
+}
+prt_maze03.gat,52,45,0 warp mazewarp5340 1,1,prt_maze03.gat,16,31 /*To No.3-21*/
+// 3rd Floor No.18
+prt_maze03.gat,104,74,0 warp mazewarp5341 1,1,prt_maze03.gat,111,22 /*To No.3-23*/
+prt_maze03.gat,96,45,0 warp mazewarp5342 1,1,prt_maze03.gat,48,104 /*To No.3-12*/
+prt_maze03.gat,114,56,0 warp mazewarp5343 1,1,prt_maze03.gat,8,140 /*To No.3-6*/
+prt_maze03.gat,85,56,0 warp mazewarp5344 1,1,prt_maze03.gat,176,31 /*To No.3-25*/
+// 3rd Floor No.19
+prt_maze03.gat,137,74,0 warp mazewarp5345 1,1,prt_maze03.gat,102,168 /*To No.3-3*/
+prt_maze03.gat,139,45,0 script #mazewarp5346 45,1,1,{
+ set @w,rand(4);
+ if(@w==1)goto w2;
+ if(@w==2)goto w3;
+ if(@w==3)goto w4;
+ warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
+ w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
+ w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
+ w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
+}
+// 3rd Floor No.20
+prt_maze03.gat,177,74,0 warp mazewarp5347 1,1,prt_maze03.gat,23,128 /*To No.3-6*/
+prt_maze03.gat,175,45,0 warp mazewarp5348 1,1,prt_maze03.gat,22,191 /*To No.3-1*/
+prt_maze03.gat,194,54,0 warp mazewarp5349 1,1,prt_maze03.gat,171,94 /*To No.3-15*/
+// 3rd Floor No.21
+prt_maze03.gat,16,34,0 warp mazewarp5350 1,1,prt_maze03.gat,52,48 /*To No.3-17*/
+prt_maze03.gat,23,5,0 warp mazewarp5351 1,1,prt_maze03.gat,88,13 /*To No.3-23*/
+// 3rd Floor No.22
+prt_maze03.gat,54,5,0 warp mazewarp5352 1,1,prt_maze03.gat,71,97 /*To No.3-12*/
+prt_maze03.gat,74,12,0 warp mazewarp5353 1,1,prt_maze03.gat,175,168 /*To No.3-5*/
+prt_maze03.gat,45,21,0 warp mazewarp5354 1,1,prt_maze03.gat,18,151 /*To No.3-6*/
+// 3rd Floor No.23
+prt_maze03.gat,99,34,0 warp mazewarp5355 1,1,prt_maze03.gat,98,151 /*To No.3-8*/
+prt_maze03.gat,114,22,0 warp mazewarp5356 1,1,prt_maze03.gat,104,71 /*To No.3-18*/
+prt_maze03.gat,85,13,0 warp mazewarp5357 1,1,prt_maze03.gat,23,8 /*To No.3-21*/
+// 3rd Floor No.24
+prt_maze03.gat,154,22,0 script #mazewarp5358 45,1,1,{
+ set @w,rand(4);
+ if(@w==1)goto w2;
+ if(@w==2)goto w3;
+ if(@w==3)goto w4;
+ warp "prt_maze03.gat",98,151; end; /*To No.3-8*/
+ w2: warp "prt_maze03.gat",137,128; end; /*To No.3-9*/
+ w3: warp "prt_maze03.gat",14,71; end; /*To No.3-16*/
+ w4: warp "prt_maze03.gat",54,8; end; /*To No.3-22*/
+}
+// 3rd Floor No.25
+prt_maze03.gat,176,34,0 warp mazewarp5359 1,1,prt_maze03.gat,88,56 /*To No.3-18*/
+prt_maze03.gat,176,5,0 warp mazewarp5360 1,1,prt_maze03.gat,111,95 /*To No.3-13*/
+prt_maze03.gat,194,15,0 warp mazewarp5361 1,1,prt_maze03.gat,8,58 /*To No.3-16*/
+prt_maze03.gat,165,22,0 warp mazewarp5362 1,1,prt_maze03.gat,111,145 /*To No.3-8*/
+
+//= Prontera Sewers ==============================================
+prt_sewb1.gat,135,248,0 warp prts001 2,2,prt_fild05.gat,274,208
+prt_sewb1.gat,188,247,0 warp prts01 1,3,prt_sewb2.gat,19,19
+prt_sewb2.gat,100,176,0 warp prts02 4,2,prt_sewb2.gat,140,28
+prt_sewb2.gat,140,24,0 warp prts02-1 4,2,prt_sewb2.gat,100,172
+prt_sewb2.gat,180,24,0 warp prts03 4,2,prt_sewb3.gat,180,169
+prt_sewb2.gat,19,12,0 warp prts01-1 2,2,prt_sewb1.gat,192,247
+prt_sewb2.gat,19,175,0 warp prts04 4,2,prt_sewb2.gat,60,28
+prt_sewb2.gat,60,24,0 warp prts04-1 4,2,prt_sewb2.gat,19,171
+prt_sewb3.gat,180,173,0 warp prts03-1 4,2,prt_sewb2.gat,180,28
+prt_sewb3.gat,20,185,0 warp prts05 3,2,prt_sewb4.gat,100,92
prt_sewb4.gat,100,96,0 warp prts05-1 3,2,prt_sewb3.gat,19,180 \ No newline at end of file
diff --git a/npc/warps/dungeons/rachel_dun.txt b/npc/warps/dungeons/rachel_dun.txt
index 314922064..882cdb25d 100644
--- a/npc/warps/dungeons/rachel_dun.txt
+++ b/npc/warps/dungeons/rachel_dun.txt
@@ -1,30 +1,30 @@
-//==== Athena Script =====================================
-//= Rachel Sanctuary Dungeon Warp Script
-//==== By ================================================
-//= Playtester
-//==== Current Version :==================================
-//= 1.2
-//==== Compatible With :==================================
-//= Any Athena Version
-//==== Description :======================================
-//= Warp Points For Rachel Sanctuary Dungeon
-//==== Additional Comment:================================
-//= 1.1 Added $ephiroth's warps [Playtester]
-//= 1.2 Replaced old versions with jAthena's [Playtester]
-//========================================================
-
-// Rachel Sanctuary Dungeon
-ra_san01.gat,140,6,0 warp rachelwarp4000 1,1,ra_temin.gat,276,318
-ra_san01.gat,140,140,0 warp rachelwarp4001 1,1,ra_san02.gat,32,21
-ra_san02.gat,30,21,0 warp rachelwarp4002 1,1,ra_san01.gat,140,138
-ra_san02.gat,291,149,0 warp rachelwarp4003 1,1,ra_san03.gat,4,149
-ra_san03.gat,2,149,0 warp rachelwarp4004 1,1,ra_san02.gat,289,149
-ra_san02.gat,214,2,0 warp rachelwarp4005 1,1,ra_san04.gat,36,221
-ra_san04.gat,36,223,0 warp rachelwarp4006 1,1,ra_san02.gat,214,4
-ra_san03.gat,86,14,0 warp rachelwarp4007 1,1,ra_san04.gat,204,220
-ra_san04.gat,204,222,0 warp rachelwarp4008 1,1,ra_san03.gat,86,16
-ra_san04.gat,120,50,0 warp rachelwarp4009 1,1,ra_san05.gat,150,9
-ra_san05.gat,150,7,0 warp rachelwarp4010 1,1,ra_san04.gat,120,48
-ra_san02.gat,214,278,0 warp rachelwarp4011 1,1,ra_san01.gat,140,138
-ra_san03.gat,124,283,0 warp rachelwarp4012 1,1,ra_san01.gat,140,138
-ra_san04.gat,120,104,0 warp rachelwarp4013 1,1,ra_san01.gat,140,138
+//==== Athena Script =====================================
+//= Rachel Sanctuary Dungeon Warp Script
+//==== By ================================================
+//= Playtester
+//==== Current Version :==================================
+//= 1.2
+//==== Compatible With :==================================
+//= Any Athena Version
+//==== Description :======================================
+//= Warp Points For Rachel Sanctuary Dungeon
+//==== Additional Comment:================================
+//= 1.1 Added $ephiroth's warps [Playtester]
+//= 1.2 Replaced old versions with jAthena's [Playtester]
+//========================================================
+
+// Rachel Sanctuary Dungeon
+ra_san01.gat,140,6,0 warp rachelwarp4000 1,1,ra_temin.gat,276,318
+ra_san01.gat,140,140,0 warp rachelwarp4001 1,1,ra_san02.gat,32,21
+ra_san02.gat,30,21,0 warp rachelwarp4002 1,1,ra_san01.gat,140,138
+ra_san02.gat,291,149,0 warp rachelwarp4003 1,1,ra_san03.gat,4,149
+ra_san03.gat,2,149,0 warp rachelwarp4004 1,1,ra_san02.gat,289,149
+ra_san02.gat,214,2,0 warp rachelwarp4005 1,1,ra_san04.gat,36,221
+ra_san04.gat,36,223,0 warp rachelwarp4006 1,1,ra_san02.gat,214,4
+ra_san03.gat,86,14,0 warp rachelwarp4007 1,1,ra_san04.gat,204,220
+ra_san04.gat,204,222,0 warp rachelwarp4008 1,1,ra_san03.gat,86,16
+ra_san04.gat,120,50,0 warp rachelwarp4009 1,1,ra_san05.gat,150,9
+ra_san05.gat,150,7,0 warp rachelwarp4010 1,1,ra_san04.gat,120,48
+ra_san02.gat,214,278,0 warp rachelwarp4011 1,1,ra_san01.gat,140,138
+ra_san03.gat,124,283,0 warp rachelwarp4012 1,1,ra_san01.gat,140,138
+ra_san04.gat,120,104,0 warp rachelwarp4013 1,1,ra_san01.gat,140,138
diff --git a/npc/warps/dungeons/thana_custom.txt b/npc/warps/dungeons/thana_custom.txt
index 6eaebdb32..3c4440b8f 100644
--- a/npc/warps/dungeons/thana_custom.txt
+++ b/npc/warps/dungeons/thana_custom.txt
@@ -1,159 +1,159 @@
-//===== Athena Script ========================================
-//= Thanatos Tower Warp Script
-//===== By: ==================================================
-//= Bibilol & Moryagorn (1.0)
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 10+
-//===== Description: =========================================
-//= Warp Points for Thanatos Tower
-//===== Additional Comments: =================================
-//= It's just Temp warps [Lupus]
-//= 1.2 Updated to level tha_t12.gat
-//= 1.3 Some warps changes due to official info [Justin84]
-//= 1.4 Fixed 2 warps [Justin84]
-//= 1.5 Added Thanatos entrance warp. Now you can go in [Justin84]
-//= 1.6 Fixed warps: tha_t06,tha_t06a,tha_t06b,tha_t05a
-//= Added Temp Keys solution [Justin84]
-//============================================================
-
-// Affiliated Files : tha_statues.txt
-// ^^^^ it's in the custom quests
-
-//Hugel Field 01 -> Thanatos Scene 01
-hu_fild01.gat,139,164,0 script Thanatos Tower Warper 111,{
- mes "[Thanatos Tower Warper]";
- mes "There is no turning back.";
- mes "Are you sure want to go Thanatos Tower?";
- next;
- menu "Yes",-,"No",T_CLOSE;
-
- warp "tha_scene01.gat",131,224;
- end;
-
-T_CLOSE:
- close;
-}
-
-//Thanatos Scene 01 -> Thantos Tower F1
-tha_scene01.gat,144,200,0 warp tha_scene01 1,1,tha_t01.gat,150,39
-tha_t01.gat,150,32,0 warp tha_scene02 1,1,tha_scene01.gat,142,200
-
-//Thanatos Tower
-tha_scene01.gat,144,200,0 warp tha_scene03 1,1,tha_t01.gat,150,39
-tha_t01.gat,150,32,0 warp tha_scene04 1,1,tha_scene01.gat,142,200
-tha_t01.gat,150,149,0 warp tha_t02 1,1,tha_t02.gat,150,136
-tha_t02.gat,150,129,0 warp tha_t01 1,1,tha_t01.gat,150,142
-tha_t02.gat,226,161,0 warp tha_t03 1,1,tha_t03.gat,220,158
-tha_t03.gat,220,165,0 warp tha_t02a 1,1,tha_t02.gat,226,149
-tha_t03.gat,60,134,0 warp tha_t04 1,1,tha_t04.gat,59,143
-tha_t04.gat,59,136,0 warp tha_t03a 1,1,tha_t03.gat,59,126
-tha_t04.gat,83,36,0 warp tha_t05 1,1,tha_t05.gat,62,11
-//According to official info, 5F it is not possible to return to the 4F, so we disable this warp:
-//tha_t05.gat,62,4,0 warp tha_t04a 1,1,tha_t04.gat,90,34
-tha_t05.gat,208,96,0 warp tha_t06 1,1,tha_t06.gat,206,8
-tha_t05.gat,185,232,0 warp tha_t06a 1,1,tha_t06.gat,206,8
-tha_t05.gat,61,157,0 warp tha_t06b 1,1,tha_t06.gat,206,8
-tha_t06.gat,206,5,0 warp tha_t05a 1,1,tha_t05.gat,61,164
-
-//tha_t06.gat,119,120,0 warp tha_t07 1,1,tha_t07.gat,35,166
-//Thanatos 6F to 7F
-tha_t06.gat,119,120,4 script tha_t07warp 45,2,2,{
- mes "You have to gather 4 types of keys to enter the 7th Floor.";
- mes "Give me the key of red, yellow, blue & green.";
- next;
- menu "Give the keys",-,"Leave",T_CLOSE;
-
- if(countitem(7421) < 1 || countitem(7422) < 1 || countitem(7423) < 1 || countitem(7424) < 1) goto T_1;
- delitem 7421,1;
- delitem 7422,1;
- delitem 7423,1;
- delitem 7424,1;
- warp "tha_t07.gat",35,166;
- end;
-
-T_1:
- mes "You don't have enough keys.";
-T_CLOSE:
- close;
-}
-
-
-tha_t07.gat,28,166,0 warp tha_t06c 1,1,tha_t06.gat,119,127
-tha_t07.gat,112,166,0 warp tha_t08 1,1,tha_t08.gat,105,44
-tha_t08.gat,112,44,0 warp tha_t07b 1,1,tha_t07.gat,105,166
-tha_t08.gat,26,44,0 warp tha_t09 1,1,tha_t09.gat,88,145
-tha_t09.gat,93,145,0 warp tha_t08 1,1,tha_t08.gat,30,44
-tha_t10.gat,171,138,0 warp tha_t09 1,1,tha_t09.gat,18,97
-tha_t11.gat,93,36,0 warp tha_t10 1,1,tha_t10.gat,91,130
-tha_t12.gat,129,51,0 warp tha_t11 1,1,tha_t11.gat,13,38
-
-//Thana_step
-thana_step.gat,12,73,0 warp thana_step1 1,1,tha_t12.gat,128,58
-thana_step.gat,16,16,0 warp thana_step2 1,1,thana_step.gat,32,224
-thana_step.gat,30,224,0 warp thana_step3 1,1,thana_step.gat,19,16
-thana_step.gat,32,166,0 warp thana_step4 1,1,thana_step.gat,184,74
-thana_step.gat,180,74,0 warp thana_step5 1,1,thana_step.gat,36,166
-thana_step.gat,182,16,0 warp thana_step6 1,1,thana_step.gat,184,224
-thana_step.gat,180,224,0 warp thana_step7 1,1,thana_step.gat,185,16
-thana_step.gat,182,166,0 warp thana_step8 1,1,thana_step.gat,73,287
-thana_step.gat,69,287,0 warp thana_step9 1,1,thana_step.gat,186,166
-thana_step.gat,70,371,0 warp thana_step10 1,1,thana_step.gat,170,287
-thana_step.gat,174,287,0 warp thana_step11 1,1,thana_step.gat,74,371
-
-//Thana_boss
-thana_step.gat,169,371,0 warp thana_boss 1,1,thana_boss.gat,85,76
-thana_boss.gat,80,76,0 warp thana_step9 1,1,thana_step.gat,163,371
-thana_boss.gat,62,171,0 warp thana_step10 1,1,thana_step.gat,163,371
-thana_boss.gat,141,217,0 warp thana_step11 1,1,thana_step.gat,163,371
-thana_boss.gat,202,75,0 warp thana_step12 1,1,thana_step.gat,163,371
-
-//Temp Plug for KEYS
-tha_t03.gat,139,46,0 script #TanKey1 111,{
- if(countitem(7421) < 1) getitem 7421,1;
- end;
-}
-
-tha_t03.gat,67,70,0 script #TanKey2 111,{
- if(countitem(7421) < 1) end;
- delitem 7421,1;
- getitem 7426,1;
- end;
-}
-
-tha_t03.gat,48,143,0 script #TanKey3 111,{
- if(countitem(7422) < 1) getitem 7422,1;
- end;
-}
-
-tha_t03.gat,66,208,0 script #TanKey4 111,{
- if(countitem(7422) < 1) end;
- delitem 7422,1;
- getitem 7427,1;
- end;
-}
-
-tha_t03.gat,139,230,0 script #TanKey5 111,{
- if(countitem(7423) < 1) getitem 7423,1;
- end;
-}
-
-tha_t03.gat,208,208,0 script #TanKey6 111,{
- if(countitem(7423) < 1) end;
- delitem 7423,1;
- getitem 7428,1;
- end;
-}
-
-tha_t03.gat,230,143,0 script #TanKey7 111,{
- if(countitem(7424) < 1) getitem 7424,1;
- end;
-}
-
-tha_t03.gat,207,70,0 script #TanKey8 111,{
- if(countitem(7424) < 1) end;
- delitem 7424,1;
- getitem 7429,1;
- end;
+//===== Athena Script ========================================
+//= Thanatos Tower Warp Script
+//===== By: ==================================================
+//= Bibilol & Moryagorn (1.0)
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 10+
+//===== Description: =========================================
+//= Warp Points for Thanatos Tower
+//===== Additional Comments: =================================
+//= It's just Temp warps [Lupus]
+//= 1.2 Updated to level tha_t12.gat
+//= 1.3 Some warps changes due to official info [Justin84]
+//= 1.4 Fixed 2 warps [Justin84]
+//= 1.5 Added Thanatos entrance warp. Now you can go in [Justin84]
+//= 1.6 Fixed warps: tha_t06,tha_t06a,tha_t06b,tha_t05a
+//= Added Temp Keys solution [Justin84]
+//============================================================
+
+// Affiliated Files : tha_statues.txt
+// ^^^^ it's in the custom quests
+
+//Hugel Field 01 -> Thanatos Scene 01
+hu_fild01.gat,139,164,0 script Thanatos Tower Warper 111,{
+ mes "[Thanatos Tower Warper]";
+ mes "There is no turning back.";
+ mes "Are you sure want to go Thanatos Tower?";
+ next;
+ menu "Yes",-,"No",T_CLOSE;
+
+ warp "tha_scene01.gat",131,224;
+ end;
+
+T_CLOSE:
+ close;
+}
+
+//Thanatos Scene 01 -> Thantos Tower F1
+tha_scene01.gat,144,200,0 warp tha_scene01 1,1,tha_t01.gat,150,39
+tha_t01.gat,150,32,0 warp tha_scene02 1,1,tha_scene01.gat,142,200
+
+//Thanatos Tower
+tha_scene01.gat,144,200,0 warp tha_scene03 1,1,tha_t01.gat,150,39
+tha_t01.gat,150,32,0 warp tha_scene04 1,1,tha_scene01.gat,142,200
+tha_t01.gat,150,149,0 warp tha_t02 1,1,tha_t02.gat,150,136
+tha_t02.gat,150,129,0 warp tha_t01 1,1,tha_t01.gat,150,142
+tha_t02.gat,226,161,0 warp tha_t03 1,1,tha_t03.gat,220,158
+tha_t03.gat,220,165,0 warp tha_t02a 1,1,tha_t02.gat,226,149
+tha_t03.gat,60,134,0 warp tha_t04 1,1,tha_t04.gat,59,143
+tha_t04.gat,59,136,0 warp tha_t03a 1,1,tha_t03.gat,59,126
+tha_t04.gat,83,36,0 warp tha_t05 1,1,tha_t05.gat,62,11
+//According to official info, 5F it is not possible to return to the 4F, so we disable this warp:
+//tha_t05.gat,62,4,0 warp tha_t04a 1,1,tha_t04.gat,90,34
+tha_t05.gat,208,96,0 warp tha_t06 1,1,tha_t06.gat,206,8
+tha_t05.gat,185,232,0 warp tha_t06a 1,1,tha_t06.gat,206,8
+tha_t05.gat,61,157,0 warp tha_t06b 1,1,tha_t06.gat,206,8
+tha_t06.gat,206,5,0 warp tha_t05a 1,1,tha_t05.gat,61,164
+
+//tha_t06.gat,119,120,0 warp tha_t07 1,1,tha_t07.gat,35,166
+//Thanatos 6F to 7F
+tha_t06.gat,119,120,4 script tha_t07warp 45,2,2,{
+ mes "You have to gather 4 types of keys to enter the 7th Floor.";
+ mes "Give me the key of red, yellow, blue & green.";
+ next;
+ menu "Give the keys",-,"Leave",T_CLOSE;
+
+ if(countitem(7421) < 1 || countitem(7422) < 1 || countitem(7423) < 1 || countitem(7424) < 1) goto T_1;
+ delitem 7421,1;
+ delitem 7422,1;
+ delitem 7423,1;
+ delitem 7424,1;
+ warp "tha_t07.gat",35,166;
+ end;
+
+T_1:
+ mes "You don't have enough keys.";
+T_CLOSE:
+ close;
+}
+
+
+tha_t07.gat,28,166,0 warp tha_t06c 1,1,tha_t06.gat,119,127
+tha_t07.gat,112,166,0 warp tha_t08 1,1,tha_t08.gat,105,44
+tha_t08.gat,112,44,0 warp tha_t07b 1,1,tha_t07.gat,105,166
+tha_t08.gat,26,44,0 warp tha_t09 1,1,tha_t09.gat,88,145
+tha_t09.gat,93,145,0 warp tha_t08 1,1,tha_t08.gat,30,44
+tha_t10.gat,171,138,0 warp tha_t09 1,1,tha_t09.gat,18,97
+tha_t11.gat,93,36,0 warp tha_t10 1,1,tha_t10.gat,91,130
+tha_t12.gat,129,51,0 warp tha_t11 1,1,tha_t11.gat,13,38
+
+//Thana_step
+thana_step.gat,12,73,0 warp thana_step1 1,1,tha_t12.gat,128,58
+thana_step.gat,16,16,0 warp thana_step2 1,1,thana_step.gat,32,224
+thana_step.gat,30,224,0 warp thana_step3 1,1,thana_step.gat,19,16
+thana_step.gat,32,166,0 warp thana_step4 1,1,thana_step.gat,184,74
+thana_step.gat,180,74,0 warp thana_step5 1,1,thana_step.gat,36,166
+thana_step.gat,182,16,0 warp thana_step6 1,1,thana_step.gat,184,224
+thana_step.gat,180,224,0 warp thana_step7 1,1,thana_step.gat,185,16
+thana_step.gat,182,166,0 warp thana_step8 1,1,thana_step.gat,73,287
+thana_step.gat,69,287,0 warp thana_step9 1,1,thana_step.gat,186,166
+thana_step.gat,70,371,0 warp thana_step10 1,1,thana_step.gat,170,287
+thana_step.gat,174,287,0 warp thana_step11 1,1,thana_step.gat,74,371
+
+//Thana_boss
+thana_step.gat,169,371,0 warp thana_boss 1,1,thana_boss.gat,85,76
+thana_boss.gat,80,76,0 warp thana_step9 1,1,thana_step.gat,163,371
+thana_boss.gat,62,171,0 warp thana_step10 1,1,thana_step.gat,163,371
+thana_boss.gat,141,217,0 warp thana_step11 1,1,thana_step.gat,163,371
+thana_boss.gat,202,75,0 warp thana_step12 1,1,thana_step.gat,163,371
+
+//Temp Plug for KEYS
+tha_t03.gat,139,46,0 script #TanKey1 111,{
+ if(countitem(7421) < 1) getitem 7421,1;
+ end;
+}
+
+tha_t03.gat,67,70,0 script #TanKey2 111,{
+ if(countitem(7421) < 1) end;
+ delitem 7421,1;
+ getitem 7426,1;
+ end;
+}
+
+tha_t03.gat,48,143,0 script #TanKey3 111,{
+ if(countitem(7422) < 1) getitem 7422,1;
+ end;
+}
+
+tha_t03.gat,66,208,0 script #TanKey4 111,{
+ if(countitem(7422) < 1) end;
+ delitem 7422,1;
+ getitem 7427,1;
+ end;
+}
+
+tha_t03.gat,139,230,0 script #TanKey5 111,{
+ if(countitem(7423) < 1) getitem 7423,1;
+ end;
+}
+
+tha_t03.gat,208,208,0 script #TanKey6 111,{
+ if(countitem(7423) < 1) end;
+ delitem 7423,1;
+ getitem 7428,1;
+ end;
+}
+
+tha_t03.gat,230,143,0 script #TanKey7 111,{
+ if(countitem(7424) < 1) getitem 7424,1;
+ end;
+}
+
+tha_t03.gat,207,70,0 script #TanKey8 111,{
+ if(countitem(7424) < 1) end;
+ delitem 7424,1;
+ getitem 7429,1;
+ end;
} \ No newline at end of file
diff --git a/npc/warps/dungeons/thana_dun.txt b/npc/warps/dungeons/thana_dun.txt
index c999b13bc..b1dabff60 100644
--- a/npc/warps/dungeons/thana_dun.txt
+++ b/npc/warps/dungeons/thana_dun.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= Thanatos Tower Warps
-//===== By: ==================================================
-//= [Ishizu-chan]
-//===== Current Version: =====================================
-//= 1.1 Beta
-//===== Compatible With: =====================================
-//= Any eAthena Version i guess?
-//===== Description: =========================================
-//= It's the Thanatos Tower Warps...
-//===== Additional Comments: =================================
-//= 1.0 - First Release [Ishizu-chan]
-//= 1.1 - Added Entrance Warp Guard
-//============================================================
-
-
-// Tour Guide - Thanatos Tower
-hu_fild01.gat,140,163,5 script Thanatos Tower Guard 852,{
-
- mes "[Thanatos Tower Guard]";
- mes "Are you sure you want to go to the Thanatos Tower?";
- mes "You can't go back, and I'll have to charge 5000 Zeny.";
- next;
- menu "Yes.",-,
- "No.",L_End;
-
- if (Zeny < 5000) goto L_Zeny;
- set Zeny, Zeny - 5000;
- warp "tha_scene01.gat",131,224;
- end;
-
- L_Zeny:
- mes "[Thanatos Tower Guard]";
- mes "You don't have enough Zeny.";
- close;
-
- L_End:
- mes "[Thanatos Tower Guard]";
- mes "Goodbye.";
- close;
-
-}
-
-// Thanatos Scene (tha_scene01.gat)
-tha_scene01.gat,144,200,0 warp WarpThana0a 1,1,tha_t01.gat,150,39
-tha_t01.gat,150,32,0 warp WarpThana0b 1,1,tha_scene01.gat,142,200
-
-// Thanatos Tower Level 1 (tha_t01.gat)
-tha_t01.gat,150,149,0 warp WarpThana1a 1,1,tha_t02.gat,150,129
-tha_t02.gat,150,126,0 warp WarpThana1b 1,1,tha_t01.gat,150,146
-
-// Thanatos Tower Level 2 (tha_t02.gat)
-tha_t03.gat,218,167,0 warp WarpThana2a 1,1,tha_t02.gat,227,159
-
-// Thanatos Tower Level 3 (tha_t03.gat)
-tha_t03.gat,60,141,0 warp WarpThana3a 1,1,tha_t04.gat,60,141
-tha_t04.gat,60,138,0 warp WarpThana3b 1,1,tha_t03.gat,60,138
-
-// Thanatos Tower Level 4 (tha_t04.gat)
-tha_t04.gat,82,36,0 warp WarpThana4a 1,1,tha_t05.gat,62,6
-
-// Thanatos Tower Level 5 (tha_t05.gat)
-tha_t05.gat,61,157,0 warp WarpThana5a 1,1,tha_t05.gat,211,97
-tha_t05.gat,208,97,0 warp WarpThana5b 1,1,tha_t05.gat,61,162
-tha_t05.gat,186,236,0 warp WarpThana5c 1,1,tha_t06.gat,207,6
-
-// Thanatos Tower Level 6 (tha_t06.gat)
-tha_t06.gat,119,120,4 script WarpThana6a 45,2,2,{
-
- if (ThanaQuest < 31) {
-
- mes "[Seal]";
- mes "It seems this portal will only open when 4 Keys are placed in the Keyholes around it.";
- close;
-
- }
-
- warp "thana_step.gat",73,372;
- end;
-
-}
-thana_step.gat,70,372,0 warp WarpThana6b 1,1,tha_t06.gat,236,120
-thana_step.gat,173,372,0 warp WarpThana6c 1,1,tha_t07.gat,28,166
-tha_t07.gat,25,166,0 warp WarpThana6d 1,1,thana_step.gat,170,372
-
-// Thanatos Tower Level 7 (tha_t07.gat)
-tha_t07.gat,114,166,0 warp WarpThana7a 1,1,tha_t08.gat,28,44
-tha_t08.gat,25,44,0 warp WarpThana7b 1,1,tha_t07.gat,111,166
-
-// Thanatos Tower Level 8 (tha_t08.gat)
-tha_t08.gat,114,44,0 warp WarpThana8a 1,1,thana_step.gat,33,223
-thana_step.gat,30,223,0 warp WarpThana8b 1,1,tha_t08.gat,111,44
-
-// Thanatos Tower Level 9 (tha_t09.gat)
-thana_step.gat,32,165,0 warp WarpThana9a 1,1,tha_t09.gat,89,146
-tha_t09.gat,92,146,0 script WarpThana9b 45,1,1,{
-
- if (ThanaSteps & 1) warp "thana_step.gat",183,223;
- else warp "thana_step.gat",35,165;
- end;
-
-}
-thana_step.gat,180,223,0 warp WarpThana9c 1,1,tha_t09.gat,89,146
-
-// Thanatos Tower Level 10 (tha_t10.gat)
-thana_step.gat,182,165,0 warp WarpThana10a 1,1,tha_t10.gat,167,138
-tha_t10.gat,170,138,0 script WarpThana10b 45,1,1,{
-
- if (ThanaSteps & 4) warp "thana_step.gat",17,73;
- else warp "thana_step.gat",185,165;
- end;
-
-}
-thana_step.gat,14,73,0 warp WarpThana10c 1,1,tha_t10.gat,167,138
-
-// Thanatos Tower Level 11 (tha_t11.gat)
-thana_step.gat,16,15,0 warp WarpThana11a 1,1,tha_t11.gat,89,36
-tha_t11.gat,92,36,0 script WarpThana11b 45,1,1,{
-
- if (ThanaSteps & 64) warp "thana_step.gat",183,73;
- else warp "thana_step.gat",19,15;
- end;
-
-}
-thana_step.gat,180,73,0 warp WarpThana11c 1,1,tha_t11.gat,89,36
-
-// Thanatos Tower Level 12 (tha_t12.gat)
-thana_step.gat,182,15,0 warp WarpThana12a 1,1,tha_t12.gat,129,51
-thana_step.gat,70,288,0 warp WarpThana12b 1,1,tha_t12.gat,129,51
+//===== eAthena Script =======================================
+//= Thanatos Tower Warps
+//===== By: ==================================================
+//= [Ishizu-chan]
+//===== Current Version: =====================================
+//= 1.1 Beta
+//===== Compatible With: =====================================
+//= Any eAthena Version i guess?
+//===== Description: =========================================
+//= It's the Thanatos Tower Warps...
+//===== Additional Comments: =================================
+//= 1.0 - First Release [Ishizu-chan]
+//= 1.1 - Added Entrance Warp Guard
+//============================================================
+
+
+// Tour Guide - Thanatos Tower
+hu_fild01.gat,140,163,5 script Thanatos Tower Guard 852,{
+
+ mes "[Thanatos Tower Guard]";
+ mes "Are you sure you want to go to the Thanatos Tower?";
+ mes "You can't go back, and I'll have to charge 5000 Zeny.";
+ next;
+ menu "Yes.",-,
+ "No.",L_End;
+
+ if (Zeny < 5000) goto L_Zeny;
+ set Zeny, Zeny - 5000;
+ warp "tha_scene01.gat",131,224;
+ end;
+
+ L_Zeny:
+ mes "[Thanatos Tower Guard]";
+ mes "You don't have enough Zeny.";
+ close;
+
+ L_End:
+ mes "[Thanatos Tower Guard]";
+ mes "Goodbye.";
+ close;
+
+}
+
+// Thanatos Scene (tha_scene01.gat)
+tha_scene01.gat,144,200,0 warp WarpThana0a 1,1,tha_t01.gat,150,39
+tha_t01.gat,150,32,0 warp WarpThana0b 1,1,tha_scene01.gat,142,200
+
+// Thanatos Tower Level 1 (tha_t01.gat)
+tha_t01.gat,150,149,0 warp WarpThana1a 1,1,tha_t02.gat,150,129
+tha_t02.gat,150,126,0 warp WarpThana1b 1,1,tha_t01.gat,150,146
+
+// Thanatos Tower Level 2 (tha_t02.gat)
+tha_t03.gat,218,167,0 warp WarpThana2a 1,1,tha_t02.gat,227,159
+
+// Thanatos Tower Level 3 (tha_t03.gat)
+tha_t03.gat,60,141,0 warp WarpThana3a 1,1,tha_t04.gat,60,141
+tha_t04.gat,60,138,0 warp WarpThana3b 1,1,tha_t03.gat,60,138
+
+// Thanatos Tower Level 4 (tha_t04.gat)
+tha_t04.gat,82,36,0 warp WarpThana4a 1,1,tha_t05.gat,62,6
+
+// Thanatos Tower Level 5 (tha_t05.gat)
+tha_t05.gat,61,157,0 warp WarpThana5a 1,1,tha_t05.gat,211,97
+tha_t05.gat,208,97,0 warp WarpThana5b 1,1,tha_t05.gat,61,162
+tha_t05.gat,186,236,0 warp WarpThana5c 1,1,tha_t06.gat,207,6
+
+// Thanatos Tower Level 6 (tha_t06.gat)
+tha_t06.gat,119,120,4 script WarpThana6a 45,2,2,{
+
+ if (ThanaQuest < 31) {
+
+ mes "[Seal]";
+ mes "It seems this portal will only open when 4 Keys are placed in the Keyholes around it.";
+ close;
+
+ }
+
+ warp "thana_step.gat",73,372;
+ end;
+
+}
+thana_step.gat,70,372,0 warp WarpThana6b 1,1,tha_t06.gat,236,120
+thana_step.gat,173,372,0 warp WarpThana6c 1,1,tha_t07.gat,28,166
+tha_t07.gat,25,166,0 warp WarpThana6d 1,1,thana_step.gat,170,372
+
+// Thanatos Tower Level 7 (tha_t07.gat)
+tha_t07.gat,114,166,0 warp WarpThana7a 1,1,tha_t08.gat,28,44
+tha_t08.gat,25,44,0 warp WarpThana7b 1,1,tha_t07.gat,111,166
+
+// Thanatos Tower Level 8 (tha_t08.gat)
+tha_t08.gat,114,44,0 warp WarpThana8a 1,1,thana_step.gat,33,223
+thana_step.gat,30,223,0 warp WarpThana8b 1,1,tha_t08.gat,111,44
+
+// Thanatos Tower Level 9 (tha_t09.gat)
+thana_step.gat,32,165,0 warp WarpThana9a 1,1,tha_t09.gat,89,146
+tha_t09.gat,92,146,0 script WarpThana9b 45,1,1,{
+
+ if (ThanaSteps & 1) warp "thana_step.gat",183,223;
+ else warp "thana_step.gat",35,165;
+ end;
+
+}
+thana_step.gat,180,223,0 warp WarpThana9c 1,1,tha_t09.gat,89,146
+
+// Thanatos Tower Level 10 (tha_t10.gat)
+thana_step.gat,182,165,0 warp WarpThana10a 1,1,tha_t10.gat,167,138
+tha_t10.gat,170,138,0 script WarpThana10b 45,1,1,{
+
+ if (ThanaSteps & 4) warp "thana_step.gat",17,73;
+ else warp "thana_step.gat",185,165;
+ end;
+
+}
+thana_step.gat,14,73,0 warp WarpThana10c 1,1,tha_t10.gat,167,138
+
+// Thanatos Tower Level 11 (tha_t11.gat)
+thana_step.gat,16,15,0 warp WarpThana11a 1,1,tha_t11.gat,89,36
+tha_t11.gat,92,36,0 script WarpThana11b 45,1,1,{
+
+ if (ThanaSteps & 64) warp "thana_step.gat",183,73;
+ else warp "thana_step.gat",19,15;
+ end;
+
+}
+thana_step.gat,180,73,0 warp WarpThana11c 1,1,tha_t11.gat,89,36
+
+// Thanatos Tower Level 12 (tha_t12.gat)
+thana_step.gat,182,15,0 warp WarpThana12a 1,1,tha_t12.gat,129,51
+thana_step.gat,70,288,0 warp WarpThana12b 1,1,tha_t12.gat,129,51
thana_step.gat,173,288,0 warp WarpThana12c 1,1,thana_boss.gat,135,128 \ No newline at end of file
diff --git a/npc/warps/dungeons/umbala_dun.txt b/npc/warps/dungeons/umbala_dun.txt
index 092f6ae90..611d54832 100644
--- a/npc/warps/dungeons/umbala_dun.txt
+++ b/npc/warps/dungeons/umbala_dun.txt
@@ -1,33 +1,33 @@
-//===== Athena Script ========================================
-//= Umbala Dungeon (Yggdrasil Cave) Warp Script
-//===== By: ==================================================
-//= Darkchild (1.0vA); Athena (1.0vB)
-//===== Current Version: =====================================
-//= 1.1 (Akaru)
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Umbala Dungeon (Yggdrasil Cave)
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Dungeon Level 1 ==========================================
-umbala.gat,106,286,0 warp umba0011 1,1,um_dun01.gat,42,31
-um_dun01.gat,150,198,0 warp umba0013 1,1,um_dun02.gat,48,30
-um_dun01.gat,42,26,0 warp umba0012 1,1,umbala.gat,111,283
-
-//= Dungeon Level 2 ==========================================
-um_dun02.gat,103,208,0 warp umba0020 1,1,um_dun02.gat,116,208
-um_dun02.gat,113,208,0 warp umba0019 1,1,um_dun02.gat,100,208
-um_dun02.gat,169,38,0 warp umba0025 1,1,um_dun02.gat,180,38
-um_dun02.gat,177,38,0 warp umba0026 1,1,um_dun02.gat,166,38
-um_dun02.gat,216,77,0 warp umba0018 1,1,um_dun02.gat,217,88
-um_dun02.gat,216,84,0 warp umba0017 1,1,um_dun02.gat,214,74
-um_dun02.gat,222,259,0 warp umba0015 1,1,um_dun02.gat,234,255
-um_dun02.gat,231,255,0 warp umba0016 1,1,um_dun02.gat,219,260
-um_dun02.gat,25,244,0 warp umba0022 1,1,um_dun02.gat,35,251
-um_dun02.gat,33,249,0 warp umba0021 1,1,um_dun02.gat,23,242
-um_dun02.gat,51,26,0 warp umba0022 1,1,um_dun01.gat,153,201
-um_dun02.gat,60,88,0 warp umba0023 1,1,um_dun02.gat,66,77
+//===== Athena Script ========================================
+//= Umbala Dungeon (Yggdrasil Cave) Warp Script
+//===== By: ==================================================
+//= Darkchild (1.0vA); Athena (1.0vB)
+//===== Current Version: =====================================
+//= 1.1 (Akaru)
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Umbala Dungeon (Yggdrasil Cave)
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Dungeon Level 1 ==========================================
+umbala.gat,106,286,0 warp umba0011 1,1,um_dun01.gat,42,31
+um_dun01.gat,150,198,0 warp umba0013 1,1,um_dun02.gat,48,30
+um_dun01.gat,42,26,0 warp umba0012 1,1,umbala.gat,111,283
+
+//= Dungeon Level 2 ==========================================
+um_dun02.gat,103,208,0 warp umba0020 1,1,um_dun02.gat,116,208
+um_dun02.gat,113,208,0 warp umba0019 1,1,um_dun02.gat,100,208
+um_dun02.gat,169,38,0 warp umba0025 1,1,um_dun02.gat,180,38
+um_dun02.gat,177,38,0 warp umba0026 1,1,um_dun02.gat,166,38
+um_dun02.gat,216,77,0 warp umba0018 1,1,um_dun02.gat,217,88
+um_dun02.gat,216,84,0 warp umba0017 1,1,um_dun02.gat,214,74
+um_dun02.gat,222,259,0 warp umba0015 1,1,um_dun02.gat,234,255
+um_dun02.gat,231,255,0 warp umba0016 1,1,um_dun02.gat,219,260
+um_dun02.gat,25,244,0 warp umba0022 1,1,um_dun02.gat,35,251
+um_dun02.gat,33,249,0 warp umba0021 1,1,um_dun02.gat,23,242
+um_dun02.gat,51,26,0 warp umba0022 1,1,um_dun01.gat,153,201
+um_dun02.gat,60,88,0 warp umba0023 1,1,um_dun02.gat,66,77
um_dun02.gat,63,80,0 warp umba0024 1,1,um_dun02.gat,59,92 \ No newline at end of file
diff --git a/npc/warps/dungeons/yuno_dun.txt b/npc/warps/dungeons/yuno_dun.txt
index 36aac0738..3281c06d4 100644
--- a/npc/warps/dungeons/yuno_dun.txt
+++ b/npc/warps/dungeons/yuno_dun.txt
@@ -1,18 +1,18 @@
-//===== Athena Script ========================================
-//= Yuno Dungeon Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Yuno Dungeon
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Magma Dungeon ============================================
-mag_dun01.gat,126,66,0 warp mag01-yunfild 1,1,yuno_fild03.gat,34,139
-mag_dun01.gat,242,241,0 warp mag01-02 1,1,mag_dun02.gat,47,30
-mag_dun02.gat,47,28,0 warp mag02-01 1,1,mag_dun01.gat,242,239
+//===== Athena Script ========================================
+//= Yuno Dungeon Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Yuno Dungeon
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Magma Dungeon ============================================
+mag_dun01.gat,126,66,0 warp mag01-yunfild 1,1,yuno_fild03.gat,34,139
+mag_dun01.gat,242,241,0 warp mag01-02 1,1,mag_dun02.gat,47,30
+mag_dun02.gat,47,28,0 warp mag02-01 1,1,mag_dun01.gat,242,239
diff --git a/npc/warps/fields/abyss_warper.txt b/npc/warps/fields/abyss_warper.txt
index beb15ae82..ca3435c59 100644
--- a/npc/warps/fields/abyss_warper.txt
+++ b/npc/warps/fields/abyss_warper.txt
@@ -1,77 +1,77 @@
-//===== Athena Script ========================================
-//= Abyss Cave Warper
-//===== By: ==================================================
-//= erKURITA
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warper to Abyss Cave. and warper out
-//===== Additional Comments: =================================
-//= 1.0 Added by Nexon [Nexon]
-//= 1.1 Removed Duplicates [Silent]
-//= 1.2 Fixed tab - missing pillar's appeared [Lupus]
-//============================================================
-
-hu_fild05.gat,168,303,0 script Pillar#01 111,{
- mes "[Ancient Voice]";
- mes "So, you wish access to the Abyss Cave?";
- mes "You have to bring me then 1 Dragon Canine, 1 Dragon Tail and 1 Dragon Scale";
- mes "in order to grant you access to the island";
- next;
- mes "[Ancient Voice]";
- mes "Do you wish to go?";
- next;
- menu "Yes",L_Check,"No",-;
- mes "Return when you are ready.";
- close;
-
-L_Check:
- mes "[Ancient Voice]";
- mes "Good, let me check your items first";
- next;
- mes "[Ancient Voice]";
- if ((countitem(1035) == 0) || (countitem(1036) == 0) || (countitem(1037) == 0)) goto L_No_Items;
- mes "Good, I hereby grant you access then";
- mes "Please hurry. The entrance will not stay open for long";
- close2;
- delitem 1035,1;
- delitem 1036,1;
- delitem 1037,1;
- enablenpc "warpabyss";
- initnpctimer;
- warp "hu_fild05",181,197;
- end;
-
-L_No_Items:
- mes "You dont have enough items";
- close;
-
-OnTimer10000:
- disablenpc "warpabyss";
- stopnpctimer;
- setnpctimer 0;
- end;
-
-OnInit:
- disablenpc "warpabyss";
- end;
-}
-
-
-hu_fild05.gat,171,212,0 script Pillar#02 111,{
- mes "[Ancient Voice]";
- mes "Leave the island?";
- next;
- menu "Yes",-,"No",L_close;
- warp "hu_fild05.gat",168,301;
- end;
-
-L_close:
- mes "[Ancient Voice]";
- mes "Return when you are ready.";
- close;
-}
-
-hu_fild05.gat,197,210,0 warp warpabyss 2,3,abyss_01.gat,264,271
+//===== Athena Script ========================================
+//= Abyss Cave Warper
+//===== By: ==================================================
+//= erKURITA
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warper to Abyss Cave. and warper out
+//===== Additional Comments: =================================
+//= 1.0 Added by Nexon [Nexon]
+//= 1.1 Removed Duplicates [Silent]
+//= 1.2 Fixed tab - missing pillar's appeared [Lupus]
+//============================================================
+
+hu_fild05.gat,168,303,0 script Pillar#01 111,{
+ mes "[Ancient Voice]";
+ mes "So, you wish access to the Abyss Cave?";
+ mes "You have to bring me then 1 Dragon Canine, 1 Dragon Tail and 1 Dragon Scale";
+ mes "in order to grant you access to the island";
+ next;
+ mes "[Ancient Voice]";
+ mes "Do you wish to go?";
+ next;
+ menu "Yes",L_Check,"No",-;
+ mes "Return when you are ready.";
+ close;
+
+L_Check:
+ mes "[Ancient Voice]";
+ mes "Good, let me check your items first";
+ next;
+ mes "[Ancient Voice]";
+ if ((countitem(1035) == 0) || (countitem(1036) == 0) || (countitem(1037) == 0)) goto L_No_Items;
+ mes "Good, I hereby grant you access then";
+ mes "Please hurry. The entrance will not stay open for long";
+ close2;
+ delitem 1035,1;
+ delitem 1036,1;
+ delitem 1037,1;
+ enablenpc "warpabyss";
+ initnpctimer;
+ warp "hu_fild05",181,197;
+ end;
+
+L_No_Items:
+ mes "You dont have enough items";
+ close;
+
+OnTimer10000:
+ disablenpc "warpabyss";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnInit:
+ disablenpc "warpabyss";
+ end;
+}
+
+
+hu_fild05.gat,171,212,0 script Pillar#02 111,{
+ mes "[Ancient Voice]";
+ mes "Leave the island?";
+ next;
+ menu "Yes",-,"No",L_close;
+ warp "hu_fild05.gat",168,301;
+ end;
+
+L_close:
+ mes "[Ancient Voice]";
+ mes "Return when you are ready.";
+ close;
+}
+
+hu_fild05.gat,197,210,0 warp warpabyss 2,3,abyss_01.gat,264,271
diff --git a/npc/warps/fields/amatsu_fild.txt b/npc/warps/fields/amatsu_fild.txt
index d68069c17..19df68ff5 100644
--- a/npc/warps/fields/amatsu_fild.txt
+++ b/npc/warps/fields/amatsu_fild.txt
@@ -1,22 +1,22 @@
-//===== Athena Script ========================================
-//= Amatsu Field Warp's
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Amatsu Field's
-//===== Additional Comments: =================================
-//= Split off amatsu.txt
-//============================================================
-
-//= Amatsu Fields ============================================
-// removed
-//ama_fild.gat,154,301,0 warp warp1998 1,1,prontera.gat,163,186
-//ama_fild.gat,174,132,0 warp warp1996 1,1,prontera.gat,163,186
-//ama_fild.gat,193,302,0 warp warp1997 1,1,prontera.gat,163,186
-//ama_fild.gat,330,141,0 warp warp1999 1,1,prontera.gat,163,186
-ama_fild01.gat,174,332,0 warp warp8003 1,1,ama_in01.gat,175,174
+//===== Athena Script ========================================
+//= Amatsu Field Warp's
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Amatsu Field's
+//===== Additional Comments: =================================
+//= Split off amatsu.txt
+//============================================================
+
+//= Amatsu Fields ============================================
+// removed
+//ama_fild.gat,154,301,0 warp warp1998 1,1,prontera.gat,163,186
+//ama_fild.gat,174,132,0 warp warp1996 1,1,prontera.gat,163,186
+//ama_fild.gat,193,302,0 warp warp1997 1,1,prontera.gat,163,186
+//ama_fild.gat,330,141,0 warp warp1999 1,1,prontera.gat,163,186
+ama_fild01.gat,174,332,0 warp warp8003 1,1,ama_in01.gat,175,174
ama_fild01.gat,75,29,0 warp warp1961 1,1,amatsu.gat,247,287 \ No newline at end of file
diff --git a/npc/warps/fields/com_fild.txt b/npc/warps/fields/com_fild.txt
index 2d1d400b8..1215e136b 100644
--- a/npc/warps/fields/com_fild.txt
+++ b/npc/warps/fields/com_fild.txt
@@ -1,53 +1,53 @@
-//===== Athena Script ========================================
-//= Comodo Warp Script
-//===== By: ==================================================
-//= Nana
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points Comodo Fields
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Comodo Fields ============================================
-cmd_fild01.gat,222,24,0 warp cmdf01 1,1,cmd_fild02.gat,222,372
-cmd_fild01.gat,26,318,0 warp cmdf001 1,1,beach_dun3.gat,281,56
-cmd_fild01.gat,362,263,0 warp cmdf03 1,1,cmd_fild03.gat,27,269
-cmd_fild01.gat,362,73,0 warp cmdf02 1,1,cmd_fild03.gat,27,68
-cmd_fild02.gat,222,376,0 warp cmdf01-1 1,1,cmd_fild01.gat,222,30
-cmd_fild02.gat,358,95,0 warp cmdf04 1,1,cmd_fild04.gat,35,94
-cmd_fild02.gat,382,269,0 warp cmdf05 1,1,cmd_fild04.gat,25,275
-cmd_fild03.gat,181,17,0 warp cmdf06 1,1,cmd_fild04.gat,181,367
-cmd_fild03.gat,23,269,0 warp cmdf03-1 1,1,cmd_fild01.gat,359,260
-cmd_fild03.gat,23,68,0 warp cmdf02-1 1,1,cmd_fild01.gat,359,76
-cmd_fild03.gat,384,165,0 warp cmdf07 1,1,cmd_fild05.gat,26,161
-cmd_fild04.gat,180,372,0 warp cmdf06-1 1,1,cmd_fild03.gat,183,23
-cmd_fild04.gat,21,275,0 warp cmdf05-1 1,1,cmd_fild02.gat,378,264
-cmd_fild04.gat,31,92,0 warp cmdf04-1 1,1,cmd_fild02.gat,351,92
-cmd_fild04.gat,376,287,0 warp cmdf08 1,1,cmd_fild06.gat,26,288
-cmd_fild05.gat,148,19,0 warp cmdf09 1,1,cmd_fild06.gat,150,374
-cmd_fild05.gat,21,163,0 warp cmdf07-1 1,1,cmd_fild03.gat,377,167
-cmd_fild06.gat,150,380,0 warp cmdf09-1 1,1,cmd_fild05.gat,146,27
-cmd_fild06.gat,151,27,0 warp cmfd10 1,1,cmd_fild07.gat,147,370
-cmd_fild06.gat,21,285,0 warp cmdf08-1 1,1,cmd_fild04.gat,371,288
-cmd_fild06.gat,368,96,0 warp cmdf11 1,1,cmd_fild08.gat,25,102
-cmd_fild06.gat,372,359,0 warp cmdf12 1,1,cmd_fild08.gat,31,359
-cmd_fild06.gat,379,174,0 warp cmdf13 1,1,cmd_fild08.gat,28,166
-cmd_fild07.gat,149,379,0 warp cmdf10-1 10,1,cmd_fild06.gat,147,36
-cmd_fild07.gat,389,186,0 warp cmdf14-1 1,3,cmd_fild09.gat,18,170
-cmd_fild08.gat,15,102,0 warp cmdf11-1 1,1,cmd_fild06.gat,361,96
-cmd_fild08.gat,25,170,0 warp cmdf13-1 1,1,cmd_fild06.gat,374,167
-cmd_fild08.gat,25,355,0 warp cmdf12-1 1,1,cmd_fild06.gat,369,359
-cmd_fild08.gat,309,48,0 warp cmdf16 2,1,cmd_fild09.gat,307,374
-cmd_fild08.gat,76,31,0 warp cmdf15 2,1,cmd_fild09.gat,76,375
-cmd_fild09.gat,12,170,0 warp cmdf14-2 1,4,cmd_fild07.gat,382,184
-cmd_fild09.gat,309,381,0 warp cmdf16-1 2,1,cmd_fild08.gat,309,60
-cmd_fild09.gat,75,382,0 warp cmdf15-1 2,1,cmd_fild08.gat,75,42
-
-//Others =======================
-cmd_fild08.gat,354,324,0 warp cmd008 1,1,moc_fild12.gat,26,305
-cmd_fild09.gat,369,164,0 warp cmd009 2,2,moc_fild18.gat,55,170
+//===== Athena Script ========================================
+//= Comodo Warp Script
+//===== By: ==================================================
+//= Nana
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points Comodo Fields
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Comodo Fields ============================================
+cmd_fild01.gat,222,24,0 warp cmdf01 1,1,cmd_fild02.gat,222,372
+cmd_fild01.gat,26,318,0 warp cmdf001 1,1,beach_dun3.gat,281,56
+cmd_fild01.gat,362,263,0 warp cmdf03 1,1,cmd_fild03.gat,27,269
+cmd_fild01.gat,362,73,0 warp cmdf02 1,1,cmd_fild03.gat,27,68
+cmd_fild02.gat,222,376,0 warp cmdf01-1 1,1,cmd_fild01.gat,222,30
+cmd_fild02.gat,358,95,0 warp cmdf04 1,1,cmd_fild04.gat,35,94
+cmd_fild02.gat,382,269,0 warp cmdf05 1,1,cmd_fild04.gat,25,275
+cmd_fild03.gat,181,17,0 warp cmdf06 1,1,cmd_fild04.gat,181,367
+cmd_fild03.gat,23,269,0 warp cmdf03-1 1,1,cmd_fild01.gat,359,260
+cmd_fild03.gat,23,68,0 warp cmdf02-1 1,1,cmd_fild01.gat,359,76
+cmd_fild03.gat,384,165,0 warp cmdf07 1,1,cmd_fild05.gat,26,161
+cmd_fild04.gat,180,372,0 warp cmdf06-1 1,1,cmd_fild03.gat,183,23
+cmd_fild04.gat,21,275,0 warp cmdf05-1 1,1,cmd_fild02.gat,378,264
+cmd_fild04.gat,31,92,0 warp cmdf04-1 1,1,cmd_fild02.gat,351,92
+cmd_fild04.gat,376,287,0 warp cmdf08 1,1,cmd_fild06.gat,26,288
+cmd_fild05.gat,148,19,0 warp cmdf09 1,1,cmd_fild06.gat,150,374
+cmd_fild05.gat,21,163,0 warp cmdf07-1 1,1,cmd_fild03.gat,377,167
+cmd_fild06.gat,150,380,0 warp cmdf09-1 1,1,cmd_fild05.gat,146,27
+cmd_fild06.gat,151,27,0 warp cmfd10 1,1,cmd_fild07.gat,147,370
+cmd_fild06.gat,21,285,0 warp cmdf08-1 1,1,cmd_fild04.gat,371,288
+cmd_fild06.gat,368,96,0 warp cmdf11 1,1,cmd_fild08.gat,25,102
+cmd_fild06.gat,372,359,0 warp cmdf12 1,1,cmd_fild08.gat,31,359
+cmd_fild06.gat,379,174,0 warp cmdf13 1,1,cmd_fild08.gat,28,166
+cmd_fild07.gat,149,379,0 warp cmdf10-1 10,1,cmd_fild06.gat,147,36
+cmd_fild07.gat,389,186,0 warp cmdf14-1 1,3,cmd_fild09.gat,18,170
+cmd_fild08.gat,15,102,0 warp cmdf11-1 1,1,cmd_fild06.gat,361,96
+cmd_fild08.gat,25,170,0 warp cmdf13-1 1,1,cmd_fild06.gat,374,167
+cmd_fild08.gat,25,355,0 warp cmdf12-1 1,1,cmd_fild06.gat,369,359
+cmd_fild08.gat,309,48,0 warp cmdf16 2,1,cmd_fild09.gat,307,374
+cmd_fild08.gat,76,31,0 warp cmdf15 2,1,cmd_fild09.gat,76,375
+cmd_fild09.gat,12,170,0 warp cmdf14-2 1,4,cmd_fild07.gat,382,184
+cmd_fild09.gat,309,381,0 warp cmdf16-1 2,1,cmd_fild08.gat,309,60
+cmd_fild09.gat,75,382,0 warp cmdf15-1 2,1,cmd_fild08.gat,75,42
+
+//Others =======================
+cmd_fild08.gat,354,324,0 warp cmd008 1,1,moc_fild12.gat,26,305
+cmd_fild09.gat,369,164,0 warp cmd009 2,2,moc_fild18.gat,55,170
moc_fild18.gat,51,170,0 warp cmd010 1,3,cmd_fild09.gat,363,164 \ No newline at end of file
diff --git a/npc/warps/fields/ein_fild.txt b/npc/warps/fields/ein_fild.txt
index 589201e99..348c53df7 100644
--- a/npc/warps/fields/ein_fild.txt
+++ b/npc/warps/fields/ein_fild.txt
@@ -1,53 +1,53 @@
-//===== Athena Script ========================================
-//= Einbroch Field Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.0), SSUNNY@YOUNG(1.2)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Lighthalzen Field
-//===== Additional Comments: =================================
-// Field update - Einbroch and Lhztargen by Sara - Version 1.0
-// 1.1 moved field warps from town warps [Lupus]
-// 1.2 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
-//============================================================
-
-
-//Einbroch Field <-> Juno Field
-yuno_fild04.gat,251,21,0 warp ein001 1,1,ein_fild06.gat,252,363
-ein_fild06.gat,252,365,0 warp ein001a 1,1,yuno_fild04.gat,251,23
-yuno_fild07.gat,73,219,0 warp ein002 1,1,ein_fild06.gat,338,170
-ein_fild06.gat,340,170,0 warp ein002a 1,1,yuno_fild07.gat,75,219
-yuno_fild07.gat,56,76,0 warp ein003 1,1,ein_fild06.gat,354,94
-ein_fild06.gat,356,94,0 warp ein003a 1,1,yuno_fild07.gat,58,76
-yuno_fild11.gat,28,266,0 warp ein004 1,1,ein_fild07.gat,380,263
-ein_fild07.gat,382,263,0 warp ein004a 1,1,yuno_fild11.gat,30,266
-
-//Einbroch Field
-ein_fild06.gat,135,35,0 warp ein005 1,1,ein_fild07.gat,147,360
-ein_fild07.gat,145,362,0 warp ein005a 1,1,ein_fild06.gat,135,37
-ein_fild07.gat,191,42,0 warp ein006 1,1,ein_fild10.gat,194,370
-ein_fild10.gat,194,372,0 warp ein006a 1,1,ein_fild07.gat,191,44
-ein_fild10.gat,24,331,0 warp ein007 1,1,ein_fild09.gat,327,346
-ein_fild09.gat,329,346,0 warp ein007a 1,1,ein_fild10.gat,26,331
-ein_fild09.gat,34,132,0 warp ein008 1,1,ein_fild08.gat,361,128
-ein_fild08.gat,363,128,0 warp ein008a 1,1,ein_fild09.gat,36,132
-
-//Einbroch Field <-> Lighthalzen Field
-einbech.gat,62,29,0 warp ein_fd03 1,1,ein_fild09.gat,74,350
-ein_fild09.gat,71,352,0 warp ein_fd03a 1,1,einbech.gat,62,32
-
-ein_fild04.gat,20,251,0 warp ein046 1,1,ein_fild03.gat,361,257
-ein_fild03.gat,363,257,0 warp ein046a 1,1,ein_fild04.gat,22,251
-ein_fild04.gat,14,215,0 warp ein047 1,1,ein_fild03.gat,359,219
-ein_fild03.gat,361,219,0 warp ein047a 1,1,ein_fild04.gat,16,215
-ein_fild04.gat,14,205,0 warp ein048 1,1,ein_fild03.gat,359,204
-ein_fild03.gat,361,204,0 warp ein048a 1,1,ein_fild04.gat,16,205
-ein_fild03.gat,142,32,0 warp ein049 1,1,lhz_fild02.gat,166,365
-lhz_fild02.gat,166,367,0 warp ein049a 1,1,ein_fild03.gat,142,34
-lhz_fild02.gat,164,37,0 warp ein050 1,1,lhz_fild03.gat,158,347
-lhz_fild03.gat,158,349,0 warp ein050a 1,1,lhz_fild02.gat,164,39
-lhz_fild03.gat,363,283,0 warp ein051 1,1,ein_fild08.gat,25,275
-ein_fild08.gat,23,275,0 warp ein051a 1,1,lhz_fild03.gat,361,283
+//===== Athena Script ========================================
+//= Einbroch Field Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.0), SSUNNY@YOUNG(1.2)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Lighthalzen Field
+//===== Additional Comments: =================================
+// Field update - Einbroch and Lhztargen by Sara - Version 1.0
+// 1.1 moved field warps from town warps [Lupus]
+// 1.2 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+//============================================================
+
+
+//Einbroch Field <-> Juno Field
+yuno_fild04.gat,251,21,0 warp ein001 1,1,ein_fild06.gat,252,363
+ein_fild06.gat,252,365,0 warp ein001a 1,1,yuno_fild04.gat,251,23
+yuno_fild07.gat,73,219,0 warp ein002 1,1,ein_fild06.gat,338,170
+ein_fild06.gat,340,170,0 warp ein002a 1,1,yuno_fild07.gat,75,219
+yuno_fild07.gat,56,76,0 warp ein003 1,1,ein_fild06.gat,354,94
+ein_fild06.gat,356,94,0 warp ein003a 1,1,yuno_fild07.gat,58,76
+yuno_fild11.gat,28,266,0 warp ein004 1,1,ein_fild07.gat,380,263
+ein_fild07.gat,382,263,0 warp ein004a 1,1,yuno_fild11.gat,30,266
+
+//Einbroch Field
+ein_fild06.gat,135,35,0 warp ein005 1,1,ein_fild07.gat,147,360
+ein_fild07.gat,145,362,0 warp ein005a 1,1,ein_fild06.gat,135,37
+ein_fild07.gat,191,42,0 warp ein006 1,1,ein_fild10.gat,194,370
+ein_fild10.gat,194,372,0 warp ein006a 1,1,ein_fild07.gat,191,44
+ein_fild10.gat,24,331,0 warp ein007 1,1,ein_fild09.gat,327,346
+ein_fild09.gat,329,346,0 warp ein007a 1,1,ein_fild10.gat,26,331
+ein_fild09.gat,34,132,0 warp ein008 1,1,ein_fild08.gat,361,128
+ein_fild08.gat,363,128,0 warp ein008a 1,1,ein_fild09.gat,36,132
+
+//Einbroch Field <-> Lighthalzen Field
+einbech.gat,62,29,0 warp ein_fd03 1,1,ein_fild09.gat,74,350
+ein_fild09.gat,71,352,0 warp ein_fd03a 1,1,einbech.gat,62,32
+
+ein_fild04.gat,20,251,0 warp ein046 1,1,ein_fild03.gat,361,257
+ein_fild03.gat,363,257,0 warp ein046a 1,1,ein_fild04.gat,22,251
+ein_fild04.gat,14,215,0 warp ein047 1,1,ein_fild03.gat,359,219
+ein_fild03.gat,361,219,0 warp ein047a 1,1,ein_fild04.gat,16,215
+ein_fild04.gat,14,205,0 warp ein048 1,1,ein_fild03.gat,359,204
+ein_fild03.gat,361,204,0 warp ein048a 1,1,ein_fild04.gat,16,205
+ein_fild03.gat,142,32,0 warp ein049 1,1,lhz_fild02.gat,166,365
+lhz_fild02.gat,166,367,0 warp ein049a 1,1,ein_fild03.gat,142,34
+lhz_fild02.gat,164,37,0 warp ein050 1,1,lhz_fild03.gat,158,347
+lhz_fild03.gat,158,349,0 warp ein050a 1,1,lhz_fild02.gat,164,39
+lhz_fild03.gat,363,283,0 warp ein051 1,1,ein_fild08.gat,25,275
+ein_fild08.gat,23,275,0 warp ein051a 1,1,lhz_fild03.gat,361,283
diff --git a/npc/warps/fields/gefenia.txt b/npc/warps/fields/gefenia.txt
index 09dbf2371..34b295be6 100644
--- a/npc/warps/fields/gefenia.txt
+++ b/npc/warps/fields/gefenia.txt
@@ -1,30 +1,30 @@
-//===== Athena Script ========================================
-//= Gefenia Warp Script
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//= Nana (1.2)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Gefenia
-//===== Additional Comments: =================================
-//= 1.3 fixed gefenia03.gat,28,26 -> gefenia03.gat,58,26
-//============================================================
-gefenia01.gat,37,103,0 warp gefeniawarp014 1,1,gefenia04.gat,283,95
-gefenia01.gat,199,269,0 warp gefeniawarp001 1,1,gefenia02.gat,203,34
-gefenia01.gat,220,256,0 warp gefeniawarp003 1,1,gefenia02.gat,240,23
-gefenia02.gat,17,175,0 warp gefeniawarp005 1,1,gefenia03.gat,266,168
-gefenia02.gat,19,237,0 warp gefeniawarp007 1,1,gefenia03.gat,264,236
-gefenia02.gat,203,31,0 warp gefeniawarp002 1,1,gefenia01.gat,199,266
-gefenia02.gat,240,20,0 warp gefeniawarp004 1,1,gefenia01.gat,223,256
-gefenia03.gat,58,26,0 warp gefeniawarp011 1,1,gefenia04.gat,33,270
-gefenia03.gat,145,27,0 warp gefeniawarp009 1,1,gefenia04.gat,130,272
-gefenia03.gat,267,236,0 warp gefeniawarp008 1,1,gefenia02.gat,22,237
-gefenia03.gat,269,168,0 warp gefeniawarp006 1,1,gefenia02.gat,20,175
-gefenia04.gat,130,275,0 warp gefeniawarp010 1,1,gefenia03.gat,145,30
-gefenia04.gat,33,273,0 warp gefeniawarp012 1,1,gefenia03.gat,58,29
-gefenia04.gat,287,95,0 warp gefeniawarp013 1,1,gefenia01.gat,40,103
-
+//===== Athena Script ========================================
+//= Gefenia Warp Script
+//===== By: ==================================================
+//= Muad Dib (1.0)
+//= Darkchild (1.1)
+//= Nana (1.2)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Gefenia
+//===== Additional Comments: =================================
+//= 1.3 fixed gefenia03.gat,28,26 -> gefenia03.gat,58,26
+//============================================================
+gefenia01.gat,37,103,0 warp gefeniawarp014 1,1,gefenia04.gat,283,95
+gefenia01.gat,199,269,0 warp gefeniawarp001 1,1,gefenia02.gat,203,34
+gefenia01.gat,220,256,0 warp gefeniawarp003 1,1,gefenia02.gat,240,23
+gefenia02.gat,17,175,0 warp gefeniawarp005 1,1,gefenia03.gat,266,168
+gefenia02.gat,19,237,0 warp gefeniawarp007 1,1,gefenia03.gat,264,236
+gefenia02.gat,203,31,0 warp gefeniawarp002 1,1,gefenia01.gat,199,266
+gefenia02.gat,240,20,0 warp gefeniawarp004 1,1,gefenia01.gat,223,256
+gefenia03.gat,58,26,0 warp gefeniawarp011 1,1,gefenia04.gat,33,270
+gefenia03.gat,145,27,0 warp gefeniawarp009 1,1,gefenia04.gat,130,272
+gefenia03.gat,267,236,0 warp gefeniawarp008 1,1,gefenia02.gat,22,237
+gefenia03.gat,269,168,0 warp gefeniawarp006 1,1,gefenia02.gat,20,175
+gefenia04.gat,130,275,0 warp gefeniawarp010 1,1,gefenia03.gat,145,30
+gefenia04.gat,33,273,0 warp gefeniawarp012 1,1,gefenia03.gat,58,29
+gefenia04.gat,287,95,0 warp gefeniawarp013 1,1,gefenia01.gat,40,103
+
diff --git a/npc/warps/fields/geffen_fild.txt b/npc/warps/fields/geffen_fild.txt
index 061eb4a48..eb04cac3a 100644
--- a/npc/warps/fields/geffen_fild.txt
+++ b/npc/warps/fields/geffen_fild.txt
@@ -1,72 +1,72 @@
-//===== Athena Script ========================================
-//= Geffen Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Geffen Field's
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= Geffen Field Warps =======================================
-gef_fild00.gat,267,382,0 warp gef007 4,2,mjolnir_06.gat,265,32
-gef_fild00.gat,381,137,0 warp gef008 3,9,prt_fild00.gat,24,125
-gef_fild00.gat,40,199,0 warp gef009 2,7,geffen.gat,213,119
-gef_fild01.gat,382,111,0 warp gef010 2,9,prt_fild04.gat,20,114
-gef_fild01.gat,16,102,0 warp geff01 2,4,gef_fild09.gat,368,92
-gef_fild01.gat,69,17,0 warp geff02 4,2,gef_fild03.gat,66,379
-gef_fild02.gat,380,156,0 warp gef011 3,7,prt_fild07.gat,21,143
-gef_fild02.gat,380,289,0 warp gef012 3,12,prt_fild07.gat,18,289
-gef_fild02.gat,380,68,0 warp gef013 3,10,prt_fild07.gat,17,64
-gef_fild02.gat,266,18,0 warp gef026 5,2,prt_fild10.gat,227,296
-gef_fild02.gat,14,78,0 warp geff03 2,4,gef_fild03.gat,379,77
-gef_fild02.gat,16,275,0 warp geff04 2,4,gef_fild03.gat,379,277
-gef_fild03.gat,312,16,0 warp gef014 5,2,prt_fild11.gat,302,298
-gef_fild03.gat,66,382,0 warp geff02-1 4,2,gef_fild01.gat,69,20
-gef_fild03.gat,382,77,0 warp geff03-1 2,4,gef_fild02.gat,17,78
-gef_fild03.gat,382,277,0 warp geff04-1 2,4,gef_fild02.gat,19,275
-gef_fild03.gat,18,52,0 warp geff05 2,4,gef_fild10.gat,367,56
-gef_fild04.gat,187,39,0 warp gef015 4,2,geffen.gat,119,210
-gef_fild04.gat,261,362,0 warp gef016 4,2,mjolnir_01.gat,284,21
-gef_fild04.gat,362,322,0 warp gef017 2,4,mjolnir_06.gat,21,331
-gef_fild04.gat,16,309,0 warp geff06 2,6,gef_fild05.gat,361,309
-gef_fild05.gat,364,309,0 warp geff06-1 2,8,gef_fild04.gat,19,309
-gef_fild05.gat,15,201,0 warp geff07 2,4,gef_fild06.gat,379,211
-gef_fild05.gat,64,15,0 warp geff08 4,2,gef_fild07.gat,64,360
-gef_fild06.gat,382,211,0 warp geff07-1 2,4,gef_fild05.gat,18,201
-gef_fild06.gat,218,17,0 warp geff09 4,2,gef_fild08.gat,200,352
-gef_fild07.gat,339,187,0 warp gef025 2,4,geffen.gat,29,119
-gef_fild07.gat,64,363,0 warp geff08-1 4,2,gef_fild05.gat,64,18
-gef_fild07.gat,18,191,0 warp geff10 2,4,gef_fild08.gat,357,187
-gef_fild07.gat,40,19,0 warp geff13 1,1,gef_fild13.gat,41,369
-gef_fild08.gat,200,355,0 warp geff09-1 4,2,gef_fild06.gat,218,20
-gef_fild08.gat,360,187,0 warp geff10-1 2,4,gef_fild07.gat,21,191
-gef_fild08.gat,215,18,0 warp geff14 1,1,gef_fild12.gat,221,369
-gef_fild09.gat,23,56,0 warp geff18-1 1,1,gef_fild13.gat,376,56
-gef_fild09.gat,225,25,0 warp geff11 3,2,gef_fild10.gat,251,368
-gef_fild09.gat,368,95,0 warp geff01-1 4,2,gef_fild01.gat,19,102
-gef_fild10.gat,251,371,0 warp geff11-1 5,2,gef_fild09.gat,225,28
-gef_fild10.gat,104,21,0 warp geff12 5,2,gef_fild11.gat,114,360
-gef_fild10.gat,370,56,0 warp geff05-1 2,5,gef_fild03.gat,21,52
-gef_fild10.gat,136,331,0 warp gef018 1,1,in_orcs01.gat,122,171
-gef_fild10.gat,138,284,0 warp gef019 1,1,in_orcs01.gat,29,114
-gef_fild10.gat,215,51,0 warp gef020 1,1,in_orcs01.gat,162,53
-gef_fild10.gat,223,205,0 warp gef021 1,1,in_orcs01.gat,108,89
-gef_fild10.gat,63,337,0 warp gef022 1,1,in_orcs01.gat,30,157
-gef_fild10.gat,27,219,0 warp geff19-1 1,1,gef_fild14.gat,367,219
-gef_fild11.gat,377,293,0 warp gef023 2,4,prt_fild11.gat,20,281
-gef_fild11.gat,111,364,0 warp geff12-1 6,3,gef_fild10.gat,104,24
-gef_fild12.gat,221,374,0 warp geff14-1 1,1,gef_fild08.gat,215,25
-gef_fild12.gat,368,180,0 warp geff15 1,1,gef_fild13.gat,29,202
-gef_fild12.gat,372,50,0 warp geff16 1,1,gef_fild13.gat,29,59
-gef_fild13.gat,200,25,0 warp geff17 1,1,gef_fild14.gat,180,357
-gef_fild13.gat,25,202,0 warp geff15-1 1,1,gef_fild12.gat,364,180
-gef_fild13.gat,26,59,0 warp geff16-1 1,1,gef_fild12.gat,370,50
-gef_fild13.gat,380,56,0 warp geff18 1,1,gef_fild09.gat,27,56
-gef_fild13.gat,41,373,0 warp geff13-1 1,1,gef_fild07.gat,40,23
-gef_fild14.gat,180,360,0 warp geff17-1 1,1,gef_fild13.gat,200,29
+//===== Athena Script ========================================
+//= Geffen Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Geffen Field's
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Geffen Field Warps =======================================
+gef_fild00.gat,267,382,0 warp gef007 4,2,mjolnir_06.gat,265,32
+gef_fild00.gat,381,137,0 warp gef008 3,9,prt_fild00.gat,24,125
+gef_fild00.gat,40,199,0 warp gef009 2,7,geffen.gat,213,119
+gef_fild01.gat,382,111,0 warp gef010 2,9,prt_fild04.gat,20,114
+gef_fild01.gat,16,102,0 warp geff01 2,4,gef_fild09.gat,368,92
+gef_fild01.gat,69,17,0 warp geff02 4,2,gef_fild03.gat,66,379
+gef_fild02.gat,380,156,0 warp gef011 3,7,prt_fild07.gat,21,143
+gef_fild02.gat,380,289,0 warp gef012 3,12,prt_fild07.gat,18,289
+gef_fild02.gat,380,68,0 warp gef013 3,10,prt_fild07.gat,17,64
+gef_fild02.gat,266,18,0 warp gef026 5,2,prt_fild10.gat,227,296
+gef_fild02.gat,14,78,0 warp geff03 2,4,gef_fild03.gat,379,77
+gef_fild02.gat,16,275,0 warp geff04 2,4,gef_fild03.gat,379,277
+gef_fild03.gat,312,16,0 warp gef014 5,2,prt_fild11.gat,302,298
+gef_fild03.gat,66,382,0 warp geff02-1 4,2,gef_fild01.gat,69,20
+gef_fild03.gat,382,77,0 warp geff03-1 2,4,gef_fild02.gat,17,78
+gef_fild03.gat,382,277,0 warp geff04-1 2,4,gef_fild02.gat,19,275
+gef_fild03.gat,18,52,0 warp geff05 2,4,gef_fild10.gat,367,56
+gef_fild04.gat,187,39,0 warp gef015 4,2,geffen.gat,119,210
+gef_fild04.gat,261,362,0 warp gef016 4,2,mjolnir_01.gat,284,21
+gef_fild04.gat,362,322,0 warp gef017 2,4,mjolnir_06.gat,21,331
+gef_fild04.gat,16,309,0 warp geff06 2,6,gef_fild05.gat,361,309
+gef_fild05.gat,364,309,0 warp geff06-1 2,8,gef_fild04.gat,19,309
+gef_fild05.gat,15,201,0 warp geff07 2,4,gef_fild06.gat,379,211
+gef_fild05.gat,64,15,0 warp geff08 4,2,gef_fild07.gat,64,360
+gef_fild06.gat,382,211,0 warp geff07-1 2,4,gef_fild05.gat,18,201
+gef_fild06.gat,218,17,0 warp geff09 4,2,gef_fild08.gat,200,352
+gef_fild07.gat,339,187,0 warp gef025 2,4,geffen.gat,29,119
+gef_fild07.gat,64,363,0 warp geff08-1 4,2,gef_fild05.gat,64,18
+gef_fild07.gat,18,191,0 warp geff10 2,4,gef_fild08.gat,357,187
+gef_fild07.gat,40,19,0 warp geff13 1,1,gef_fild13.gat,41,369
+gef_fild08.gat,200,355,0 warp geff09-1 4,2,gef_fild06.gat,218,20
+gef_fild08.gat,360,187,0 warp geff10-1 2,4,gef_fild07.gat,21,191
+gef_fild08.gat,215,18,0 warp geff14 1,1,gef_fild12.gat,221,369
+gef_fild09.gat,23,56,0 warp geff18-1 1,1,gef_fild13.gat,376,56
+gef_fild09.gat,225,25,0 warp geff11 3,2,gef_fild10.gat,251,368
+gef_fild09.gat,368,95,0 warp geff01-1 4,2,gef_fild01.gat,19,102
+gef_fild10.gat,251,371,0 warp geff11-1 5,2,gef_fild09.gat,225,28
+gef_fild10.gat,104,21,0 warp geff12 5,2,gef_fild11.gat,114,360
+gef_fild10.gat,370,56,0 warp geff05-1 2,5,gef_fild03.gat,21,52
+gef_fild10.gat,136,331,0 warp gef018 1,1,in_orcs01.gat,122,171
+gef_fild10.gat,138,284,0 warp gef019 1,1,in_orcs01.gat,29,114
+gef_fild10.gat,215,51,0 warp gef020 1,1,in_orcs01.gat,162,53
+gef_fild10.gat,223,205,0 warp gef021 1,1,in_orcs01.gat,108,89
+gef_fild10.gat,63,337,0 warp gef022 1,1,in_orcs01.gat,30,157
+gef_fild10.gat,27,219,0 warp geff19-1 1,1,gef_fild14.gat,367,219
+gef_fild11.gat,377,293,0 warp gef023 2,4,prt_fild11.gat,20,281
+gef_fild11.gat,111,364,0 warp geff12-1 6,3,gef_fild10.gat,104,24
+gef_fild12.gat,221,374,0 warp geff14-1 1,1,gef_fild08.gat,215,25
+gef_fild12.gat,368,180,0 warp geff15 1,1,gef_fild13.gat,29,202
+gef_fild12.gat,372,50,0 warp geff16 1,1,gef_fild13.gat,29,59
+gef_fild13.gat,200,25,0 warp geff17 1,1,gef_fild14.gat,180,357
+gef_fild13.gat,25,202,0 warp geff15-1 1,1,gef_fild12.gat,364,180
+gef_fild13.gat,26,59,0 warp geff16-1 1,1,gef_fild12.gat,370,50
+gef_fild13.gat,380,56,0 warp geff18 1,1,gef_fild09.gat,27,56
+gef_fild13.gat,41,373,0 warp geff13-1 1,1,gef_fild07.gat,40,23
+gef_fild14.gat,180,360,0 warp geff17-1 1,1,gef_fild13.gat,200,29
gef_fild14.gat,371,219,0 warp geff19 1,1,gef_fild10.gat,31,219 \ No newline at end of file
diff --git a/npc/warps/fields/glastheim.txt b/npc/warps/fields/glastheim.txt
index 9f8a0dc3f..753492798 100644
--- a/npc/warps/fields/glastheim.txt
+++ b/npc/warps/fields/glastheim.txt
@@ -1,84 +1,84 @@
-//===== Athena Script ========================================
-//= Glastheim Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2.x
-//===== Description: =========================================
-//= Warp Points for Glastheim
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt, 1.1 added gl18-2 [Lupus]
-//= optimized random warp [Lupus] fixed looped warps
-//============================================================
-
-//Glastheim
-gef_fild06.gat,20,304,0 warp gef027 3,3,glast_01.gat,370,304
-gl_cas01.gat,135,40,0 warp gl01 1,1,gl_cas01.gat,144,314
-gl_cas01.gat,149,314,0 warp gl02 1,1,gl_prison.gat,14,70
-gl_cas01.gat,167,191,0 warp gl03 1,1,gl_prison.gat,14,70
-gl_cas01.gat,185,236,0 warp gl06 1,1,gl_cas01.gat,163,191
-gl_cas01.gat,200,165,0 warp gl10 1,1,gl_cas02.gat,104,25
-gl_cas01.gat,200,18,0 warp gl7-1 2,2,glast_01.gat,200,294
-gl_cas01.gat,215,236,0 warp gl07 1,1,gl_cas01.gat,238,192
-gl_cas01.gat,234,192,0 warp gl04 1,1,gl_prison.gat,14,70
-gl_cas01.gat,371,301,0 warp gl05 1,1,gl_prison.gat,14,70
-gl_cas01.gat,372,39,0 warp gl08 1,1,gl_cas01.gat,367,301
-gl_cas02.gat,104,15,0 warp gl10-1 1,1,gl_cas01.gat,200,160
-gl_cas02.gat,104,193,0 warp gl8-1 1,1,glast_01.gat,199,325
-gl_church.gat,156,4,0 warp gl9-1 1,1,glast_01.gat,200,134
-gl_church.gat,16,299,0 warp gl11 1,1,gl_chyard.gat,147,284
-gl_church.gat,301,46,0 warp gl12 1,1,gl_chyard.gat,147,15
-gl_chyard.gat,12,149,0 warp gl22 1,1,gl_sew02.gat,29,270
-gl_chyard.gat,147,12,0 warp gl12-1 1,1,gl_church.gat,295,46
-gl_chyard.gat,147,287,0 warp gl11-1 1,1,gl_church.gat,16,295
-gl_dun01.gat,133,277,0 warp gl25-1 1,1,gl_sew04.gat,101,78
-gl_dun01.gat,225,18,0 warp gl13 1,1,gl_dun02.gat,224,274
-gl_dun02.gat,224,277,0 warp gl13-1 1,1,gl_dun01.gat,225,22
-gl_in01.gat,106,125,0 warp gl5-1 1,1,glast_01.gat,219,357
-gl_in01.gat,118,59,0 warp gl6-1 1,1,glast_01.gat,234,330
-gl_in01.gat,81,68,0 warp gl3-1 1,1,glast_01.gat,165,330
-gl_in01.gat,83,174,0 warp gl4-1 1,1,glast_01.gat,181,357
-gl_knt01.gat,104,204,0 warp gl15 1,1,gl_knt01.gat,123,292
-gl_knt01.gat,12,148,0 warp gl14 1,1,gl_knt02.gat,15,140
-gl_knt01.gat,128,292,0 warp gl15-1 1,1,gl_knt01.gat,104,199
-gl_knt01.gat,150,291,0 warp gl16 1,1,gl_knt02.gat,157,287
-gl_knt01.gat,150,6,0 warp gl2-1 2,2,glast_01.gat,74,193
-gl_knt01.gat,231,197,0 warp gl24-1 1,1,gl_sew02.gat,296,22
-gl_knt01.gat,287,144,0 warp gl17 1,1,gl_knt02.gat,283,140
-gl_knt02.gat,10,138,0 warp gl14-1 1,1,gl_knt01.gat,7,148
-gl_knt02.gat,157,292,0 warp gl16-1 1,1,gl_knt01.gat,150,286
-gl_knt02.gat,289,138,0 warp gl17-1 1,1,gl_knt01.gat,292,144
-gl_prison.gat,149,183,0 warp gl18-1 1,1,gl_prison1.gat,150,14
-gl_prison.gat,10,70,4 script gl18-2 45,1,1,{
-if(rand(2)==1) goto w2;
- warp "gl_cas01",236,192; end;
-w2: warp "gl_cas01",164,191; end;
-}
-gl_prison1.gat,150,10,0 warp gl18 1,1,gl_prison.gat,149,178
-gl_prison1.gat,62,187,0 warp gl10 1,1,gl_sew01.gat,258,255
-gl_sew01.gat,19,21,0 warp gl19 1,1,gl_sew02.gat,108,291
-gl_sew01.gat,258,258,0 warp gl09 1,1,gl_prison1.gat,61,183
-gl_sew02.gat,109,294,0 warp gl19-1 1,1,gl_sew01.gat,19,24
-gl_sew02.gat,16,26,0 warp gl11 1,1,gl_prison1.gat,61,183
-gl_sew02.gat,290,156,0 warp gl23 1,1,gl_step.gat,117,124
-gl_sew02.gat,296,18,0 warp gl24 1,1,gl_knt01.gat,231,192
-gl_sew02.gat,299,294,0 warp gl20 1,1,gl_sew03.gat,171,283
-gl_sew02.gat,30,273,0 warp gl22-1 1,1,gl_chyard.gat,15,149
-gl_sew03.gat,171,286,0 warp gl20-1 1,1,gl_sew02.gat,295,294
-gl_sew03.gat,64,10,0 warp gl21 1,1,gl_sew04.gat,68,277
-gl_sew04.gat,104,78,0 warp gl25 1,1,gl_dun01.gat,133,271
-gl_sew04.gat,68,280,0 warp gl21-1 1,1,gl_sew03.gat,64,13
-gl_step.gat,120,124,0 warp gl23-1 1,1,gl_sew02.gat,285,158
-gl_step.gat,8,7,0 warp gl1-1 1,1,glast_01.gat,54,108
-glast_01.gat,162,330,0 warp gl3 1,1,gl_in01.gat,77,68
-glast_01.gat,179,360,0 warp gl4 1,1,gl_in01.gat,80,174
-glast_01.gat,199,322,0 warp gl8 1,1,gl_cas02.gat,104,189
-glast_01.gat,200,137,0 warp gl9 1,1,gl_church.gat,156,7
-glast_01.gat,200,297,0 warp gl7 1,1,gl_cas01.gat,199,29
-glast_01.gat,220,360,0 warp gl5 1,1,gl_in01.gat,110,125
-glast_01.gat,237,330,0 warp gl6 1,1,gl_in01.gat,122,59
-glast_01.gat,377,304,0 warp glst001 3,3,gef_fild06.gat,27,304
-glast_01.gat,51,108,0 warp gl1 1,1,gl_step.gat,12,7
+//===== Athena Script ========================================
+//= Glastheim Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2.x
+//===== Description: =========================================
+//= Warp Points for Glastheim
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt, 1.1 added gl18-2 [Lupus]
+//= optimized random warp [Lupus] fixed looped warps
+//============================================================
+
+//Glastheim
+gef_fild06.gat,20,304,0 warp gef027 3,3,glast_01.gat,370,304
+gl_cas01.gat,135,40,0 warp gl01 1,1,gl_cas01.gat,144,314
+gl_cas01.gat,149,314,0 warp gl02 1,1,gl_prison.gat,14,70
+gl_cas01.gat,167,191,0 warp gl03 1,1,gl_prison.gat,14,70
+gl_cas01.gat,185,236,0 warp gl06 1,1,gl_cas01.gat,163,191
+gl_cas01.gat,200,165,0 warp gl10 1,1,gl_cas02.gat,104,25
+gl_cas01.gat,200,18,0 warp gl7-1 2,2,glast_01.gat,200,294
+gl_cas01.gat,215,236,0 warp gl07 1,1,gl_cas01.gat,238,192
+gl_cas01.gat,234,192,0 warp gl04 1,1,gl_prison.gat,14,70
+gl_cas01.gat,371,301,0 warp gl05 1,1,gl_prison.gat,14,70
+gl_cas01.gat,372,39,0 warp gl08 1,1,gl_cas01.gat,367,301
+gl_cas02.gat,104,15,0 warp gl10-1 1,1,gl_cas01.gat,200,160
+gl_cas02.gat,104,193,0 warp gl8-1 1,1,glast_01.gat,199,325
+gl_church.gat,156,4,0 warp gl9-1 1,1,glast_01.gat,200,134
+gl_church.gat,16,299,0 warp gl11 1,1,gl_chyard.gat,147,284
+gl_church.gat,301,46,0 warp gl12 1,1,gl_chyard.gat,147,15
+gl_chyard.gat,12,149,0 warp gl22 1,1,gl_sew02.gat,29,270
+gl_chyard.gat,147,12,0 warp gl12-1 1,1,gl_church.gat,295,46
+gl_chyard.gat,147,287,0 warp gl11-1 1,1,gl_church.gat,16,295
+gl_dun01.gat,133,277,0 warp gl25-1 1,1,gl_sew04.gat,101,78
+gl_dun01.gat,225,18,0 warp gl13 1,1,gl_dun02.gat,224,274
+gl_dun02.gat,224,277,0 warp gl13-1 1,1,gl_dun01.gat,225,22
+gl_in01.gat,106,125,0 warp gl5-1 1,1,glast_01.gat,219,357
+gl_in01.gat,118,59,0 warp gl6-1 1,1,glast_01.gat,234,330
+gl_in01.gat,81,68,0 warp gl3-1 1,1,glast_01.gat,165,330
+gl_in01.gat,83,174,0 warp gl4-1 1,1,glast_01.gat,181,357
+gl_knt01.gat,104,204,0 warp gl15 1,1,gl_knt01.gat,123,292
+gl_knt01.gat,12,148,0 warp gl14 1,1,gl_knt02.gat,15,140
+gl_knt01.gat,128,292,0 warp gl15-1 1,1,gl_knt01.gat,104,199
+gl_knt01.gat,150,291,0 warp gl16 1,1,gl_knt02.gat,157,287
+gl_knt01.gat,150,6,0 warp gl2-1 2,2,glast_01.gat,74,193
+gl_knt01.gat,231,197,0 warp gl24-1 1,1,gl_sew02.gat,296,22
+gl_knt01.gat,287,144,0 warp gl17 1,1,gl_knt02.gat,283,140
+gl_knt02.gat,10,138,0 warp gl14-1 1,1,gl_knt01.gat,7,148
+gl_knt02.gat,157,292,0 warp gl16-1 1,1,gl_knt01.gat,150,286
+gl_knt02.gat,289,138,0 warp gl17-1 1,1,gl_knt01.gat,292,144
+gl_prison.gat,149,183,0 warp gl18-1 1,1,gl_prison1.gat,150,14
+gl_prison.gat,10,70,4 script gl18-2 45,1,1,{
+if(rand(2)==1) goto w2;
+ warp "gl_cas01",236,192; end;
+w2: warp "gl_cas01",164,191; end;
+}
+gl_prison1.gat,150,10,0 warp gl18 1,1,gl_prison.gat,149,178
+gl_prison1.gat,62,187,0 warp gl10 1,1,gl_sew01.gat,258,255
+gl_sew01.gat,19,21,0 warp gl19 1,1,gl_sew02.gat,108,291
+gl_sew01.gat,258,258,0 warp gl09 1,1,gl_prison1.gat,61,183
+gl_sew02.gat,109,294,0 warp gl19-1 1,1,gl_sew01.gat,19,24
+gl_sew02.gat,16,26,0 warp gl11 1,1,gl_prison1.gat,61,183
+gl_sew02.gat,290,156,0 warp gl23 1,1,gl_step.gat,117,124
+gl_sew02.gat,296,18,0 warp gl24 1,1,gl_knt01.gat,231,192
+gl_sew02.gat,299,294,0 warp gl20 1,1,gl_sew03.gat,171,283
+gl_sew02.gat,30,273,0 warp gl22-1 1,1,gl_chyard.gat,15,149
+gl_sew03.gat,171,286,0 warp gl20-1 1,1,gl_sew02.gat,295,294
+gl_sew03.gat,64,10,0 warp gl21 1,1,gl_sew04.gat,68,277
+gl_sew04.gat,104,78,0 warp gl25 1,1,gl_dun01.gat,133,271
+gl_sew04.gat,68,280,0 warp gl21-1 1,1,gl_sew03.gat,64,13
+gl_step.gat,120,124,0 warp gl23-1 1,1,gl_sew02.gat,285,158
+gl_step.gat,8,7,0 warp gl1-1 1,1,glast_01.gat,54,108
+glast_01.gat,162,330,0 warp gl3 1,1,gl_in01.gat,77,68
+glast_01.gat,179,360,0 warp gl4 1,1,gl_in01.gat,80,174
+glast_01.gat,199,322,0 warp gl8 1,1,gl_cas02.gat,104,189
+glast_01.gat,200,137,0 warp gl9 1,1,gl_church.gat,156,7
+glast_01.gat,200,297,0 warp gl7 1,1,gl_cas01.gat,199,29
+glast_01.gat,220,360,0 warp gl5 1,1,gl_in01.gat,110,125
+glast_01.gat,237,330,0 warp gl6 1,1,gl_in01.gat,122,59
+glast_01.gat,377,304,0 warp glst001 3,3,gef_fild06.gat,27,304
+glast_01.gat,51,108,0 warp gl1 1,1,gl_step.gat,12,7
glast_01.gat,77,193,0 warp gl2 1,1,gl_knt01.gat,150,15 \ No newline at end of file
diff --git a/npc/warps/fields/hugel_fild.txt b/npc/warps/fields/hugel_fild.txt
index 0f98ae1bd..925297e87 100644
--- a/npc/warps/fields/hugel_fild.txt
+++ b/npc/warps/fields/hugel_fild.txt
@@ -1,45 +1,45 @@
-//===== Athena Script ========================================
-//= Hugel Field Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.1)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 10+
-//===== Description: =========================================
-//= Warp Points for Hugel Field
-//===== Additional Comments: =================================
-//= Initial Release
-//============================================================
-
-//= Hugel Field ================================================
-ein_fild04.gat,344,294,0 warp hugel001 1,1,ein_fild05.gat,77,294
-ein_fild05.gat,75,294,0 warp hugel001a 1,1,ein_fild04.gat,339,294
-ein_fild05.gat,377,183,0 warp hugel002 1,1,ein_fild06.gat,42,169
-ein_fild06.gat,40,169,0 warp hugel002a 1,1,ein_fild05.gat,375,183
-ein_fild02.gat,358,250,0 warp hugel003 1,1,yuno_fild04.gat,34,281
-yuno_fild04.gat,32,281,0 warp hugel003a 1,1,ein_fild02.gat,356,250
-ein_fild01.gat,350,369,0 warp hugel003 1,1,yuno_fild05.gat,40,349
-yuno_fild05.gat,40,351,0 warp hugel003a 1,1,ein_fild01.gat,348,369
-ein_fild01.gat,107,34,0 warp hugel004 1,1,ein_fild02.gat,107,363
-ein_fild02.gat,107,365,0 warp hugel004a 1,1,ein_fild01.gat,107,36
-ein_fild01.gat,234,34,0 warp hugel005 1,1,ein_fild02.gat,256,348
-ein_fild02.gat,256,350,0 warp hugel005a 1,1,ein_fild01.gat,234,36
-ein_fild02.gat,170,30,0 warp hugel006 1,1,ein_fild05.gat,174,372
-ein_fild05.gat,174,374,0 warp hugel006a 1,1,ein_fild02.gat,170,32
-hu_fild01.gat,367,182,0 warp hugel007 1,1,hu_fild02.gat,18,167
-hu_fild02.gat,16,167,0 warp hugel007a 1,1,hu_fild01.gat,365,182
-hu_fild04.gat,47,373,0 warp hugel008 1,1,hu_fild02.gat,41,23
-hu_fild02.gat,41,21,0 warp hugel008a 1,1,hu_fild04.gat,47,371
-hu_fild04.gat,296,380,0 warp hugel009 1,1,hu_fild02.gat,291,29
-hu_fild02.gat,291,27,0 warp hugel009a 1,1,hu_fild04.gat,296,378
-hu_fild05.gat,286,357,0 warp hugel010 1,1,hu_fild03.gat,289,22
-hu_fild03.gat,289,20,0 warp hugel010a 1,1,hu_fild05.gat,286,355
-hu_fild05.gat,353,125,0 warp hugel011 1,1,hu_fild06.gat,29,118
-hu_fild06.gat,27,118,0 warp hugel011a 1,1,hu_fild05.gat,351,125
-hu_fild02.gat,375,338,0 warp hugel012 1,1,hu_fild03.gat,21,339
-hu_fild03.gat,19,339,0 warp hugel012a 1,1,hu_fild02.gat,373,338
-hu_fild02.gat,378,153,0 warp hugel013 1,1,hu_fild03.gat,26,166
-hu_fild03.gat,24,166,0 warp hugel013a 1,1,hu_fild02.gat,376,153
-yuno_fild09.gat,377,182,0 warp hugel014 1,1,yuno_fild10.gat,40,183
+//===== Athena Script ========================================
+//= Hugel Field Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.1)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 10+
+//===== Description: =========================================
+//= Warp Points for Hugel Field
+//===== Additional Comments: =================================
+//= Initial Release
+//============================================================
+
+//= Hugel Field ================================================
+ein_fild04.gat,344,294,0 warp hugel001 1,1,ein_fild05.gat,77,294
+ein_fild05.gat,75,294,0 warp hugel001a 1,1,ein_fild04.gat,339,294
+ein_fild05.gat,377,183,0 warp hugel002 1,1,ein_fild06.gat,42,169
+ein_fild06.gat,40,169,0 warp hugel002a 1,1,ein_fild05.gat,375,183
+ein_fild02.gat,358,250,0 warp hugel003 1,1,yuno_fild04.gat,34,281
+yuno_fild04.gat,32,281,0 warp hugel003a 1,1,ein_fild02.gat,356,250
+ein_fild01.gat,350,369,0 warp hugel003 1,1,yuno_fild05.gat,40,349
+yuno_fild05.gat,40,351,0 warp hugel003a 1,1,ein_fild01.gat,348,369
+ein_fild01.gat,107,34,0 warp hugel004 1,1,ein_fild02.gat,107,363
+ein_fild02.gat,107,365,0 warp hugel004a 1,1,ein_fild01.gat,107,36
+ein_fild01.gat,234,34,0 warp hugel005 1,1,ein_fild02.gat,256,348
+ein_fild02.gat,256,350,0 warp hugel005a 1,1,ein_fild01.gat,234,36
+ein_fild02.gat,170,30,0 warp hugel006 1,1,ein_fild05.gat,174,372
+ein_fild05.gat,174,374,0 warp hugel006a 1,1,ein_fild02.gat,170,32
+hu_fild01.gat,367,182,0 warp hugel007 1,1,hu_fild02.gat,18,167
+hu_fild02.gat,16,167,0 warp hugel007a 1,1,hu_fild01.gat,365,182
+hu_fild04.gat,47,373,0 warp hugel008 1,1,hu_fild02.gat,41,23
+hu_fild02.gat,41,21,0 warp hugel008a 1,1,hu_fild04.gat,47,371
+hu_fild04.gat,296,380,0 warp hugel009 1,1,hu_fild02.gat,291,29
+hu_fild02.gat,291,27,0 warp hugel009a 1,1,hu_fild04.gat,296,378
+hu_fild05.gat,286,357,0 warp hugel010 1,1,hu_fild03.gat,289,22
+hu_fild03.gat,289,20,0 warp hugel010a 1,1,hu_fild05.gat,286,355
+hu_fild05.gat,353,125,0 warp hugel011 1,1,hu_fild06.gat,29,118
+hu_fild06.gat,27,118,0 warp hugel011a 1,1,hu_fild05.gat,351,125
+hu_fild02.gat,375,338,0 warp hugel012 1,1,hu_fild03.gat,21,339
+hu_fild03.gat,19,339,0 warp hugel012a 1,1,hu_fild02.gat,373,338
+hu_fild02.gat,378,153,0 warp hugel013 1,1,hu_fild03.gat,26,166
+hu_fild03.gat,24,166,0 warp hugel013a 1,1,hu_fild02.gat,376,153
+yuno_fild09.gat,377,182,0 warp hugel014 1,1,yuno_fild10.gat,40,183
yuno_fild10.gat,38,183,0 warp hugel014a 1,1,yuno_fild09.gat,375,182 \ No newline at end of file
diff --git a/npc/warps/fields/jawaii.txt b/npc/warps/fields/jawaii.txt
index 528293098..20b8e2c59 100644
--- a/npc/warps/fields/jawaii.txt
+++ b/npc/warps/fields/jawaii.txt
@@ -1,26 +1,26 @@
-//===== Athena Script ========================================
-//= Jawaii Warp Script
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//= MasterOfMuppets (1.2)
-//===== Current Version: =====================================
-//= 1.2b
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Jawaii
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//= 1.2a Added a missing warp, thanks to Zoc [MasterOfMuppets]
-//= 1.2b Added a missing warp [Komurka]
-//============================================================
-
-jawaii_in.gat,90,78,0 warp jawaiiwarp001 1,1,jawaii.gat,115,172
-jawaii_in.gat,113,61,0 warp jawaiiwarp002 1,1,jawaii.gat,138,202
-jawaii_in.gat,133,107,0 warp jawaiiwarp003 1,1,jawaii.gat,111,199
-jawaii_in.gat,88,117,0 warp jawaiiwarp004 1,1,jawaii.gat,109,186
-jawaii.gat,192,215,0 warp jawaiiwarp005 1,1,jawaii_in.gat,28,94
-jawaii_in.gat,27,91,4 script jawaiiwarp006 45,1,1,{
-if (getpartnerid() > 0) warp "jawaii.gat",192,218; else warp "jawaii_in.gat",27,94;
+//===== Athena Script ========================================
+//= Jawaii Warp Script
+//===== By: ==================================================
+//= Muad Dib (1.0)
+//= Darkchild (1.1)
+//= MasterOfMuppets (1.2)
+//===== Current Version: =====================================
+//= 1.2b
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Jawaii
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//= 1.2a Added a missing warp, thanks to Zoc [MasterOfMuppets]
+//= 1.2b Added a missing warp [Komurka]
+//============================================================
+
+jawaii_in.gat,90,78,0 warp jawaiiwarp001 1,1,jawaii.gat,115,172
+jawaii_in.gat,113,61,0 warp jawaiiwarp002 1,1,jawaii.gat,138,202
+jawaii_in.gat,133,107,0 warp jawaiiwarp003 1,1,jawaii.gat,111,199
+jawaii_in.gat,88,117,0 warp jawaiiwarp004 1,1,jawaii.gat,109,186
+jawaii.gat,192,215,0 warp jawaiiwarp005 1,1,jawaii_in.gat,28,94
+jawaii_in.gat,27,91,4 script jawaiiwarp006 45,1,1,{
+if (getpartnerid() > 0) warp "jawaii.gat",192,218; else warp "jawaii_in.gat",27,94;
} \ No newline at end of file
diff --git a/npc/warps/fields/lhalzen_fild.txt b/npc/warps/fields/lhalzen_fild.txt
index 0c867f6c9..7fe640fc0 100644
--- a/npc/warps/fields/lhalzen_fild.txt
+++ b/npc/warps/fields/lhalzen_fild.txt
@@ -1,20 +1,20 @@
-//===== Athena Script ========================================
-//= Lighthalzen Field Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for Lighthalzen Field
-//===== Additional Comments: =================================
-//= 1.1 Applied Poki#3's fix for lhz001 & lhz001a [DracoRPG]
-//= 1.2 Updated the warp, according to korean eA site [Vicious]
-//============================================================
-
-lhz_fild01.gat,210,18,0 warp lhz043 1,1,lighthalzen.gat,214,324
-lighthalzen.gat,214,329,0 warp lhz043a 1,1,lhz_fild01.gat,210,23
-
-lhz_fild01.gat,367,222,0 warp lhz044 1,1,lhz_fild02.gat,36,221
+//===== Athena Script ========================================
+//= Lighthalzen Field Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for Lighthalzen Field
+//===== Additional Comments: =================================
+//= 1.1 Applied Poki#3's fix for lhz001 & lhz001a [DracoRPG]
+//= 1.2 Updated the warp, according to korean eA site [Vicious]
+//============================================================
+
+lhz_fild01.gat,210,18,0 warp lhz043 1,1,lighthalzen.gat,214,324
+lighthalzen.gat,214,329,0 warp lhz043a 1,1,lhz_fild01.gat,210,23
+
+lhz_fild01.gat,367,222,0 warp lhz044 1,1,lhz_fild02.gat,36,221
lhz_fild02.gat,29,219,0 warp lhz044a 1,1,lhz_fild01.gat,361,222 \ No newline at end of file
diff --git a/npc/warps/fields/lutie_fild.txt b/npc/warps/fields/lutie_fild.txt
index 45e52bc6f..38a14d7da 100644
--- a/npc/warps/fields/lutie_fild.txt
+++ b/npc/warps/fields/lutie_fild.txt
@@ -1,17 +1,17 @@
-//===== Athena Script ========================================
-//= Lutie Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Lutie Field
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Lutie Field ==============================================
-xmas_fild01.gat,80,251,0 warp xmas2 2,2,xmas.gat,150,45
-xmas_fild01.gat,85,49,0 warp xmas001 10,3,aldebaran.gat,140,240
+//===== Athena Script ========================================
+//= Lutie Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Lutie Field
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Lutie Field ==============================================
+xmas_fild01.gat,80,251,0 warp xmas2 2,2,xmas.gat,150,45
+xmas_fild01.gat,85,49,0 warp xmas001 10,3,aldebaran.gat,140,240
diff --git a/npc/warps/fields/morroc_fild.txt b/npc/warps/fields/morroc_fild.txt
index 37a3c39e9..39e4e3b35 100644
--- a/npc/warps/fields/morroc_fild.txt
+++ b/npc/warps/fields/morroc_fild.txt
@@ -1,103 +1,103 @@
-//===== Athena Script ========================================
-//= Morroc Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Morroc Fields
-//===== Additional Comments: =================================
-//= 1.1 changed 'anthell' to @anthell [Lupus]
-//============================================================
-
-//= Sograt Dessert ===========================================
-moc_fild01.gat,101,16,0 warp mocf01-1 15,3,moc_fild04.gat,317,376
-moc_fild01.gat,22,242,0 warp mocf005 2,2,prt_fild09.gat,380,237
-moc_fild01.gat,239,382,0 warp mocf006 12,1,prt_fild08.gat,233,20
-moc_fild01.gat,301,16,0 warp mocf02 10,1,moc_fild02.gat,77,338
-moc_fild01.gat,321,16,0 warp mocf02-1 10,1,moc_fild02.gat,77,338
-moc_fild01.gat,341,16,0 warp mocf02-2 10,1,moc_fild02.gat,77,338
-moc_fild01.gat,379,162,0 warp mocf011 2,12,pay_fild04.gat,20,165
-moc_fild01.gat,56,384,0 warp moc007 3,2,prt_fild08.gat,54,24
-moc_fild01.gat,68,16,0 warp mocf01 15,3,moc_fild04.gat,317,376
-moc_fild02.gat,228,29,0 warp mocf03 4,2,moc_fild13.gat,298,367
-moc_fild02.gat,332,19,0 warp mocf04 5,3,moc_fild03.gat,70,336
-moc_fild02.gat,350,339,0 warp mocf012 6,2,pay_fild04.gat,194,20
-moc_fild02.gat,67,342,0 warp mocf02-3 11,3,moc_fild01.gat,315,25
-moc_fild02.gat,71,18,0 warp mocf05 4,2,moc_fild13.gat,146,365
-moc_fild02.gat,92,342,0 warp mocf02-4 11,3,moc_fild01.gat,315,25
-moc_fild03.gat,17,37,0 warp mocf06 2,4,moc_fild13.gat,305,49
-moc_fild03.gat,179,16,0 warp mocf013 4,2,pay_fild11.gat,38,327
-moc_fild03.gat,303,170,0 warp mocf014 2,7,pay_fild01.gat,17,152
-moc_fild03.gat,70,341,0 warp mocf04-1 5,2,moc_fild02.gat,332,23
-moc_fild04.gat,14,122,0 warp mocf07-1 1,11,moc_fild05.gat,378,119
-moc_fild04.gat,14,146,0 warp mocf07-2 1,11,moc_fild05.gat,378,119
-moc_fild04.gat,14,98,0 warp mocf07 1,11,moc_fild05.gat,378,119
-moc_fild04.gat,175,18,0 warp mocf08 3,2,moc_fild08.gat,170,380
-moc_fild04.gat,19,206,0 warp mocf09 3,15,moc_fild05.gat,373,208
-moc_fild04.gat,219,327,0 script mocf016 45,3,4,{ set @anthell,0; warp "anthell01.gat",35,262; }
-moc_fild04.gat,292,381,0 warp mocf01-2 10,1,moc_fild01.gat,76,25
-moc_fild04.gat,314,381,0 warp mocf01-3 10,1,moc_fild01.gat,76,25
-moc_fild04.gat,336,381,0 warp mocf01-4 10,1,moc_fild01.gat,76,25
-moc_fild04.gat,92,381,0 warp mocf008 9,2,prt_fild09.gat,246,19
-moc_fild05.gat,144,375,0 warp mocf009 11,2,prt_fild10.gat,263,23
-moc_fild05.gat,18,136,0 warp mocf10 1,8,moc_fild06.gat,367,317
-moc_fild05.gat,18,154,0 warp mocf10-1 1,8,moc_fild06.gat,367,317
-moc_fild05.gat,18,172,0 warp mocf10-2 1,8,moc_fild06.gat,367,317
-moc_fild05.gat,268,18,0 warp mocf11 4,2,moc_fild09.gat,267,368
-moc_fild05.gat,325,382,0 warp mocf010 6,2,prt_fild09.gat,95,19
-moc_fild05.gat,378,208,0 warp mocf09-1 3,14,moc_fild04.gat,26,206
-moc_fild05.gat,384,108,0 warp mocf07-3 1,8,moc_fild04.gat,22,123
-moc_fild05.gat,384,126,0 warp mocf07-4 1,8,moc_fild04.gat,22,123
-moc_fild05.gat,384,144,0 warp mocf07-5 1,8,moc_fild04.gat,22,123
-moc_fild05.gat,82,16,0 warp mocf12 5,2,moc_fild09.gat,80,366
-moc_fild06.gat,18,198,0 warp mocf13 1,18,moc_fild07.gat,378,201
-moc_fild06.gat,207,18,0 warp mocf14 11,2,moc_fild10.gat,208,295
-moc_fild06.gat,377,316,0 warp mocf10-3 1,15,moc_fild05.gat,24,153
-moc_fild07.gat,198,21,0 warp mocf001 2,2,morocc.gat,160,294
-moc_fild07.gat,381,201,0 warp mocf13-1 2,16,moc_fild06.gat,28,201
-moc_fild08.gat,16,207,0 warp mocf15 2,4,moc_fild09.gat,371,195
-moc_fild08.gat,170,383,0 warp mocf08-1 3,2,moc_fild04.gat,175,21
-moc_fild08.gat,204,16,0 warp mocf16 4,2,moc_fild14.gat,196,379
-moc_fild08.gat,383,211,0 warp mocf17 2,4,moc_fild13.gat,32,171
-moc_fild09.gat,126,20,0 warp mocf18 4,2,moc_fild15.gat,158,360
-moc_fild09.gat,267,371,0 warp mocf11-1 4,2,moc_fild05.gat,268,21
-moc_fild09.gat,30,162,0 warp mocf19 2,3,moc_fild10.gat,381,258
-moc_fild09.gat,374,195,0 warp mocf15-1 2,8,moc_fild08.gat,19,207
-moc_fild09.gat,80,369,0 warp mocf12-1 7,2,moc_fild05.gat,82,19
-moc_fild10.gat,189,23,0 warp mocf20 3,2,moc_fild11.gat,189,360
-moc_fild10.gat,19,207,0 warp mocf002 2,2,morocc.gat,299,207
-moc_fild10.gat,208,298,0 warp mocf14-1 10,2,moc_fild06.gat,207,21
-moc_fild10.gat,384,258,0 warp mocf19-1 2,3,moc_fild09.gat,33,162
-moc_fild11.gat,189,363,0 warp mocf20-1 3,2,moc_fild10.gat,189,26
-moc_fild11.gat,212,29,0 warp mocf21 4,2,moc_fild17.gat,218,366
-moc_fild11.gat,26,161,0 warp mocf22 2,10,moc_fild12.gat,286,168
-moc_fild11.gat,379,197,0 warp mocf23 2,6,moc_fild15.gat,41,105
-moc_fild12.gat,118,30,0 warp mocf24 4,2,moc_fild18.gat,158,379
-moc_fild12.gat,159,381,0 warp mocf003 2,2,morocc.gat,160,20
-moc_fild12.gat,289,168,0 warp mocf22-1 2,3,moc_fild11.gat,29,161
-moc_fild13.gat,146,368,0 warp mocf05-1 5,2,moc_fild02.gat,71,21
-moc_fild13.gat,29,171,0 warp mocf17-1 2,4,moc_fild08.gat,380,211
-moc_fild13.gat,298,370,0 warp mocf03-1 4,2,moc_fild02.gat,228,32
-moc_fild13.gat,308,49,0 warp mocf06-1 2,4,moc_fild03.gat,20,37
-moc_fild14.gat,16,278,0 warp mocf25 2,6,moc_fild15.gat,364,276
-moc_fild14.gat,196,382,0 warp mocf16-1 4,2,moc_fild08.gat,204,19
-moc_fild15.gat,104,16,0 warp mocf26 9,2,moc_fild16.gat,125,380
-moc_fild15.gat,158,363,0 warp mocf18-1 6,2,moc_fild09.gat,126,23
-moc_fild15.gat,258,253,0 script mocf017 45,3,3,{ set @anthell,1; warp "anthell01.gat",35,262; }
-moc_fild15.gat,348,18,0 warp mocf27 5,2,moc_fild16.gat,334,379
-moc_fild15.gat,367,276,0 warp mocf25-1 2,4,moc_fild14.gat,19,278
-moc_fild15.gat,38,105,0 warp mocf23-1 2,4,moc_fild11.gat,376,197
-moc_fild16.gat,125,383,0 warp mocf26-1 5,2,moc_fild15.gat,104,19
-moc_fild16.gat,16,179,0 warp mocf28 2,6,moc_fild17.gat,366,272
-moc_fild16.gat,334,382,0 warp mocf27-1 4,2,moc_fild15.gat,348,21
-moc_fild17.gat,218,369,0 warp mocf21-1 5,2,moc_fild11.gat,212,32
-moc_fild17.gat,30,300,0 warp moc29 2,5,moc_fild18.gat,379,305
-moc_fild17.gat,369,272,0 warp mocf28-1 2,3,moc_fild16.gat,19,179
-moc_fild18.gat,158,382,0 warp mocf24-1 4,2,moc_fild12.gat,118,33
-moc_fild18.gat,382,305,0 warp moc29-1 2,4,moc_fild17.gat,33,300
-moc_fild19.gat,169,107,0 warp mocf004 1,4,morocc.gat,27,164
-moc_fild19.gat,71,170,0 warp mocf018 8,2,moc_ruins.gat,71,19
+//===== Athena Script ========================================
+//= Morroc Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Morroc Fields
+//===== Additional Comments: =================================
+//= 1.1 changed 'anthell' to @anthell [Lupus]
+//============================================================
+
+//= Sograt Dessert ===========================================
+moc_fild01.gat,101,16,0 warp mocf01-1 15,3,moc_fild04.gat,317,376
+moc_fild01.gat,22,242,0 warp mocf005 2,2,prt_fild09.gat,380,237
+moc_fild01.gat,239,382,0 warp mocf006 12,1,prt_fild08.gat,233,20
+moc_fild01.gat,301,16,0 warp mocf02 10,1,moc_fild02.gat,77,338
+moc_fild01.gat,321,16,0 warp mocf02-1 10,1,moc_fild02.gat,77,338
+moc_fild01.gat,341,16,0 warp mocf02-2 10,1,moc_fild02.gat,77,338
+moc_fild01.gat,379,162,0 warp mocf011 2,12,pay_fild04.gat,20,165
+moc_fild01.gat,56,384,0 warp moc007 3,2,prt_fild08.gat,54,24
+moc_fild01.gat,68,16,0 warp mocf01 15,3,moc_fild04.gat,317,376
+moc_fild02.gat,228,29,0 warp mocf03 4,2,moc_fild13.gat,298,367
+moc_fild02.gat,332,19,0 warp mocf04 5,3,moc_fild03.gat,70,336
+moc_fild02.gat,350,339,0 warp mocf012 6,2,pay_fild04.gat,194,20
+moc_fild02.gat,67,342,0 warp mocf02-3 11,3,moc_fild01.gat,315,25
+moc_fild02.gat,71,18,0 warp mocf05 4,2,moc_fild13.gat,146,365
+moc_fild02.gat,92,342,0 warp mocf02-4 11,3,moc_fild01.gat,315,25
+moc_fild03.gat,17,37,0 warp mocf06 2,4,moc_fild13.gat,305,49
+moc_fild03.gat,179,16,0 warp mocf013 4,2,pay_fild11.gat,38,327
+moc_fild03.gat,303,170,0 warp mocf014 2,7,pay_fild01.gat,17,152
+moc_fild03.gat,70,341,0 warp mocf04-1 5,2,moc_fild02.gat,332,23
+moc_fild04.gat,14,122,0 warp mocf07-1 1,11,moc_fild05.gat,378,119
+moc_fild04.gat,14,146,0 warp mocf07-2 1,11,moc_fild05.gat,378,119
+moc_fild04.gat,14,98,0 warp mocf07 1,11,moc_fild05.gat,378,119
+moc_fild04.gat,175,18,0 warp mocf08 3,2,moc_fild08.gat,170,380
+moc_fild04.gat,19,206,0 warp mocf09 3,15,moc_fild05.gat,373,208
+moc_fild04.gat,219,327,0 script mocf016 45,3,4,{ set @anthell,0; warp "anthell01.gat",35,262; }
+moc_fild04.gat,292,381,0 warp mocf01-2 10,1,moc_fild01.gat,76,25
+moc_fild04.gat,314,381,0 warp mocf01-3 10,1,moc_fild01.gat,76,25
+moc_fild04.gat,336,381,0 warp mocf01-4 10,1,moc_fild01.gat,76,25
+moc_fild04.gat,92,381,0 warp mocf008 9,2,prt_fild09.gat,246,19
+moc_fild05.gat,144,375,0 warp mocf009 11,2,prt_fild10.gat,263,23
+moc_fild05.gat,18,136,0 warp mocf10 1,8,moc_fild06.gat,367,317
+moc_fild05.gat,18,154,0 warp mocf10-1 1,8,moc_fild06.gat,367,317
+moc_fild05.gat,18,172,0 warp mocf10-2 1,8,moc_fild06.gat,367,317
+moc_fild05.gat,268,18,0 warp mocf11 4,2,moc_fild09.gat,267,368
+moc_fild05.gat,325,382,0 warp mocf010 6,2,prt_fild09.gat,95,19
+moc_fild05.gat,378,208,0 warp mocf09-1 3,14,moc_fild04.gat,26,206
+moc_fild05.gat,384,108,0 warp mocf07-3 1,8,moc_fild04.gat,22,123
+moc_fild05.gat,384,126,0 warp mocf07-4 1,8,moc_fild04.gat,22,123
+moc_fild05.gat,384,144,0 warp mocf07-5 1,8,moc_fild04.gat,22,123
+moc_fild05.gat,82,16,0 warp mocf12 5,2,moc_fild09.gat,80,366
+moc_fild06.gat,18,198,0 warp mocf13 1,18,moc_fild07.gat,378,201
+moc_fild06.gat,207,18,0 warp mocf14 11,2,moc_fild10.gat,208,295
+moc_fild06.gat,377,316,0 warp mocf10-3 1,15,moc_fild05.gat,24,153
+moc_fild07.gat,198,21,0 warp mocf001 2,2,morocc.gat,160,294
+moc_fild07.gat,381,201,0 warp mocf13-1 2,16,moc_fild06.gat,28,201
+moc_fild08.gat,16,207,0 warp mocf15 2,4,moc_fild09.gat,371,195
+moc_fild08.gat,170,383,0 warp mocf08-1 3,2,moc_fild04.gat,175,21
+moc_fild08.gat,204,16,0 warp mocf16 4,2,moc_fild14.gat,196,379
+moc_fild08.gat,383,211,0 warp mocf17 2,4,moc_fild13.gat,32,171
+moc_fild09.gat,126,20,0 warp mocf18 4,2,moc_fild15.gat,158,360
+moc_fild09.gat,267,371,0 warp mocf11-1 4,2,moc_fild05.gat,268,21
+moc_fild09.gat,30,162,0 warp mocf19 2,3,moc_fild10.gat,381,258
+moc_fild09.gat,374,195,0 warp mocf15-1 2,8,moc_fild08.gat,19,207
+moc_fild09.gat,80,369,0 warp mocf12-1 7,2,moc_fild05.gat,82,19
+moc_fild10.gat,189,23,0 warp mocf20 3,2,moc_fild11.gat,189,360
+moc_fild10.gat,19,207,0 warp mocf002 2,2,morocc.gat,299,207
+moc_fild10.gat,208,298,0 warp mocf14-1 10,2,moc_fild06.gat,207,21
+moc_fild10.gat,384,258,0 warp mocf19-1 2,3,moc_fild09.gat,33,162
+moc_fild11.gat,189,363,0 warp mocf20-1 3,2,moc_fild10.gat,189,26
+moc_fild11.gat,212,29,0 warp mocf21 4,2,moc_fild17.gat,218,366
+moc_fild11.gat,26,161,0 warp mocf22 2,10,moc_fild12.gat,286,168
+moc_fild11.gat,379,197,0 warp mocf23 2,6,moc_fild15.gat,41,105
+moc_fild12.gat,118,30,0 warp mocf24 4,2,moc_fild18.gat,158,379
+moc_fild12.gat,159,381,0 warp mocf003 2,2,morocc.gat,160,20
+moc_fild12.gat,289,168,0 warp mocf22-1 2,3,moc_fild11.gat,29,161
+moc_fild13.gat,146,368,0 warp mocf05-1 5,2,moc_fild02.gat,71,21
+moc_fild13.gat,29,171,0 warp mocf17-1 2,4,moc_fild08.gat,380,211
+moc_fild13.gat,298,370,0 warp mocf03-1 4,2,moc_fild02.gat,228,32
+moc_fild13.gat,308,49,0 warp mocf06-1 2,4,moc_fild03.gat,20,37
+moc_fild14.gat,16,278,0 warp mocf25 2,6,moc_fild15.gat,364,276
+moc_fild14.gat,196,382,0 warp mocf16-1 4,2,moc_fild08.gat,204,19
+moc_fild15.gat,104,16,0 warp mocf26 9,2,moc_fild16.gat,125,380
+moc_fild15.gat,158,363,0 warp mocf18-1 6,2,moc_fild09.gat,126,23
+moc_fild15.gat,258,253,0 script mocf017 45,3,3,{ set @anthell,1; warp "anthell01.gat",35,262; }
+moc_fild15.gat,348,18,0 warp mocf27 5,2,moc_fild16.gat,334,379
+moc_fild15.gat,367,276,0 warp mocf25-1 2,4,moc_fild14.gat,19,278
+moc_fild15.gat,38,105,0 warp mocf23-1 2,4,moc_fild11.gat,376,197
+moc_fild16.gat,125,383,0 warp mocf26-1 5,2,moc_fild15.gat,104,19
+moc_fild16.gat,16,179,0 warp mocf28 2,6,moc_fild17.gat,366,272
+moc_fild16.gat,334,382,0 warp mocf27-1 4,2,moc_fild15.gat,348,21
+moc_fild17.gat,218,369,0 warp mocf21-1 5,2,moc_fild11.gat,212,32
+moc_fild17.gat,30,300,0 warp moc29 2,5,moc_fild18.gat,379,305
+moc_fild17.gat,369,272,0 warp mocf28-1 2,3,moc_fild16.gat,19,179
+moc_fild18.gat,158,382,0 warp mocf24-1 4,2,moc_fild12.gat,118,33
+moc_fild18.gat,382,305,0 warp moc29-1 2,4,moc_fild17.gat,33,300
+moc_fild19.gat,169,107,0 warp mocf004 1,4,morocc.gat,27,164
+moc_fild19.gat,71,170,0 warp mocf018 8,2,moc_ruins.gat,71,19
moc_fild19.gat,98,99,0 warp mocf019 1,1,in_sphinx1.gat,288,9 \ No newline at end of file
diff --git a/npc/warps/fields/mtmjolnir.txt b/npc/warps/fields/mtmjolnir.txt
index e95915d2c..0c7573b57 100644
--- a/npc/warps/fields/mtmjolnir.txt
+++ b/npc/warps/fields/mtmjolnir.txt
@@ -1,61 +1,61 @@
-//===== Athena Script ========================================
-//= Mt. Mjolnir Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Mt. Mjolnir
-//===== Additional Comments: =================================
-//= 1.1 updating according to jA [Lupus]
-//============================================================
-
-//= Mt. Mjolnir ==============================================
-mjolnir_01.gat,284,18,0 warp mjol001 4,2,gef_fild04.gat,261,359
-mjolnir_01.gat,378,256,0 warp mjol01 2,2,mjolnir_02.gat,30,258
-mjolnir_02.gat,28,258,0 warp mjol01-1 2,2,mjolnir_01.gat,374,256
-mjolnir_02.gat,326,289,0 warp mjol02 1,1,mjolnir_03.gat,24,258
-mjolnir_02.gat,361,18,0 warp mjol03 4,2,mjolnir_06.gat,366,380
-mjolnir_02.gat,79,365,0 warp mjol013 2,1,mjo_dun01.gat,52,17
-mjolnir_03.gat,21,258,0 warp mjol02-1 2,2,mjolnir_02.gat,323,289
-mjolnir_03.gat,212,17,0 warp mjol04 4,2,mjolnir_07.gat,214,380
-mjolnir_03.gat,242,204,0 warp mjol05 1,1,mjolnir_04.gat,125,208
-mjolnir_04.gat,122,208,0 warp mjol05-1 1,1,mjolnir_03.gat,239,204
-mjolnir_04.gat,160,46,0 warp mjol06 4,2,mjolnir_08.gat,159,370
-mjolnir_04.gat,387,174,0 warp mjol07 2,2,mjolnir_05.gat,19,171
-mjolnir_05.gat,16,171,0 warp mjol07-1 2,2,mjolnir_04.gat,384,174
-mjolnir_05.gat,220,382,0 warp mjol08 4,2,mjolnir_12.gat,220,29
-mjolnir_05.gat,235,16,0 warp mjol09 4,2,mjolnir_10.gat,235,378
-mjolnir_06.gat,18,331,0 warp mjol002 2,4,gef_fild04.gat,359,322
-mjolnir_06.gat,265,29,0 warp mjol003 2,2,gef_fild00.gat,267,379
-mjolnir_06.gat,366,383,0 warp mjol03-1 4,2,mjolnir_02.gat,361,21
-mjolnir_06.gat,382,377,0 warp mjol10 2,4,mjolnir_07.gat,19,377
-mjolnir_06.gat,383,74,0 warp mjol11 2,4,mjolnir_07.gat,20,77
-mjolnir_07.gat,156,16,0 warp mjol004 4,2,prt_fild00.gat,159,380
-mjolnir_07.gat,16,377,0 warp mjol10-1 2,4,mjolnir_06.gat,379,377
-mjolnir_07.gat,17,77,0 warp mjol11-1 2,4,mjolnir_06.gat,380,74
-mjolnir_07.gat,214,383,0 warp mjol04-1 4,2,mjolnir_03.gat,212,20
-mjolnir_07.gat,383,233,0 warp mjol12 2,4,mjolnir_08.gat,33,234
-mjolnir_07.gat,383,362,0 warp mjol13 2,4,mjolnir_08.gat,32,346
-mjolnir_08.gat,159,373,0 warp mjol06 1,1,mjolnir_04.gat,160,49
-mjolnir_08.gat,185,28,0 warp mjol14 17,2,mjolnir_09.gat,196,364
-mjolnir_08.gat,29,346,0 warp mjol13-1 2,4,mjolnir_07.gat,380,362
-mjolnir_08.gat,30,234,0 warp mjol12-1 2,4,mjolnir_07.gat,380,233
-mjolnir_08.gat,369,257,0 warp mjol15 2,4,mjolnir_10.gat,18,258
-mjolnir_09.gat,106,28,0 warp mjol005 4,2,prt_fild05.gat,105,378
-mjolnir_09.gat,194,367,0 warp mjol14-1 8,2,mjolnir_08.gat,185,31
-mjolnir_09.gat,30,249,0 warp mjol006 2,4,prt_fild00.gat,380,249
-mjolnir_09.gat,300,28,0 warp mjol007 4,2,prt_fild05.gat,292,382
-mjolnir_09.gat,373,288,0 warp mjol011 2,2,prt_fild01.gat,23,292
-mjolnir_10.gat,15,258,0 warp mjol15-1 2,4,mjolnir_08.gat,366,257
-mjolnir_10.gat,235,381,0 warp mjol09-1 4,2,mjolnir_05.gat,235,19
-mjolnir_10.gat,265,13,0 warp mjol008 3,2,prt_fild01.gat,261,370
-mjolnir_10.gat,384,220,0 warp mjol16 2,4,mjolnir_11.gat,23,220
-mjolnir_10.gat,66,15,0 warp mjol009 4,2,prt_fild01.gat,66,370
-mjolnir_11.gat,174,20,0 warp mjol010 4,2,prt_fild02.gat,173,379
-mjolnir_11.gat,20,220,0 warp mjol16-1 2,4,mjolnir_10.gat,381,220
-mjolnir_12.gat,199,378,0 warp mjol012 2,2,aldebaran.gat,138,37
-mjolnir_12.gat,220,26,0 warp mjol08-1 3,2,mjolnir_05.gat,220,379
-mjolnir_12.gat,44,17,0 warp mjol17 1,1,prt_maze01.gat,17,111
+//===== Athena Script ========================================
+//= Mt. Mjolnir Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Mt. Mjolnir
+//===== Additional Comments: =================================
+//= 1.1 updating according to jA [Lupus]
+//============================================================
+
+//= Mt. Mjolnir ==============================================
+mjolnir_01.gat,284,18,0 warp mjol001 4,2,gef_fild04.gat,261,359
+mjolnir_01.gat,378,256,0 warp mjol01 2,2,mjolnir_02.gat,30,258
+mjolnir_02.gat,28,258,0 warp mjol01-1 2,2,mjolnir_01.gat,374,256
+mjolnir_02.gat,326,289,0 warp mjol02 1,1,mjolnir_03.gat,24,258
+mjolnir_02.gat,361,18,0 warp mjol03 4,2,mjolnir_06.gat,366,380
+mjolnir_02.gat,79,365,0 warp mjol013 2,1,mjo_dun01.gat,52,17
+mjolnir_03.gat,21,258,0 warp mjol02-1 2,2,mjolnir_02.gat,323,289
+mjolnir_03.gat,212,17,0 warp mjol04 4,2,mjolnir_07.gat,214,380
+mjolnir_03.gat,242,204,0 warp mjol05 1,1,mjolnir_04.gat,125,208
+mjolnir_04.gat,122,208,0 warp mjol05-1 1,1,mjolnir_03.gat,239,204
+mjolnir_04.gat,160,46,0 warp mjol06 4,2,mjolnir_08.gat,159,370
+mjolnir_04.gat,387,174,0 warp mjol07 2,2,mjolnir_05.gat,19,171
+mjolnir_05.gat,16,171,0 warp mjol07-1 2,2,mjolnir_04.gat,384,174
+mjolnir_05.gat,220,382,0 warp mjol08 4,2,mjolnir_12.gat,220,29
+mjolnir_05.gat,235,16,0 warp mjol09 4,2,mjolnir_10.gat,235,378
+mjolnir_06.gat,18,331,0 warp mjol002 2,4,gef_fild04.gat,359,322
+mjolnir_06.gat,265,29,0 warp mjol003 2,2,gef_fild00.gat,267,379
+mjolnir_06.gat,366,383,0 warp mjol03-1 4,2,mjolnir_02.gat,361,21
+mjolnir_06.gat,382,377,0 warp mjol10 2,4,mjolnir_07.gat,19,377
+mjolnir_06.gat,383,74,0 warp mjol11 2,4,mjolnir_07.gat,20,77
+mjolnir_07.gat,156,16,0 warp mjol004 4,2,prt_fild00.gat,159,380
+mjolnir_07.gat,16,377,0 warp mjol10-1 2,4,mjolnir_06.gat,379,377
+mjolnir_07.gat,17,77,0 warp mjol11-1 2,4,mjolnir_06.gat,380,74
+mjolnir_07.gat,214,383,0 warp mjol04-1 4,2,mjolnir_03.gat,212,20
+mjolnir_07.gat,383,233,0 warp mjol12 2,4,mjolnir_08.gat,33,234
+mjolnir_07.gat,383,362,0 warp mjol13 2,4,mjolnir_08.gat,32,346
+mjolnir_08.gat,159,373,0 warp mjol06 1,1,mjolnir_04.gat,160,49
+mjolnir_08.gat,185,28,0 warp mjol14 17,2,mjolnir_09.gat,196,364
+mjolnir_08.gat,29,346,0 warp mjol13-1 2,4,mjolnir_07.gat,380,362
+mjolnir_08.gat,30,234,0 warp mjol12-1 2,4,mjolnir_07.gat,380,233
+mjolnir_08.gat,369,257,0 warp mjol15 2,4,mjolnir_10.gat,18,258
+mjolnir_09.gat,106,28,0 warp mjol005 4,2,prt_fild05.gat,105,378
+mjolnir_09.gat,194,367,0 warp mjol14-1 8,2,mjolnir_08.gat,185,31
+mjolnir_09.gat,30,249,0 warp mjol006 2,4,prt_fild00.gat,380,249
+mjolnir_09.gat,300,28,0 warp mjol007 4,2,prt_fild05.gat,292,382
+mjolnir_09.gat,373,288,0 warp mjol011 2,2,prt_fild01.gat,23,292
+mjolnir_10.gat,15,258,0 warp mjol15-1 2,4,mjolnir_08.gat,366,257
+mjolnir_10.gat,235,381,0 warp mjol09-1 4,2,mjolnir_05.gat,235,19
+mjolnir_10.gat,265,13,0 warp mjol008 3,2,prt_fild01.gat,261,370
+mjolnir_10.gat,384,220,0 warp mjol16 2,4,mjolnir_11.gat,23,220
+mjolnir_10.gat,66,15,0 warp mjol009 4,2,prt_fild01.gat,66,370
+mjolnir_11.gat,174,20,0 warp mjol010 4,2,prt_fild02.gat,173,379
+mjolnir_11.gat,20,220,0 warp mjol16-1 2,4,mjolnir_10.gat,381,220
+mjolnir_12.gat,199,378,0 warp mjol012 2,2,aldebaran.gat,138,37
+mjolnir_12.gat,220,26,0 warp mjol08-1 3,2,mjolnir_05.gat,220,379
+mjolnir_12.gat,44,17,0 warp mjol17 1,1,prt_maze01.gat,17,111
diff --git a/npc/warps/fields/payon_fild.txt b/npc/warps/fields/payon_fild.txt
index f3707d811..ba3869fc9 100644
--- a/npc/warps/fields/payon_fild.txt
+++ b/npc/warps/fields/payon_fild.txt
@@ -1,48 +1,48 @@
-//===== eAthena Script =======================================
-//= Payon Field Warps
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= Payon Field Warps
-//===== Additional Comments: =================================
-//= 1.1 Refixed payon field08 -> payon warp
-//============================================================
-
-//= Payon Field's ============================================
-pay_fild01.gat,13,152,0 warp payf001 2,7,moc_fild03.gat,299,170
-pay_fild01.gat,278,14,0 warp payf01 13,2,pay_fild02.gat,83,382
-pay_fild01.gat,353,14,0 warp payf02 20,3,pay_fild02.gat,160,381
-pay_fild01.gat,379,201,0 warp payf03 2,6,pay_fild07.gat,23,207
-pay_fild02.gat,134,16,0 warp payf04 5,2,pay_fild05.gat,127,375
-pay_fild02.gat,16,175,0 warp payf06 2,4,pay_fild11.gat,294,135
-pay_fild02.gat,167,390,0 warp payf02-1 20,3,pay_fild01.gat,354,18
-pay_fild02.gat,284,108,0 warp payf07 2,7,pay_fild03.gat,20,110
-pay_fild02.gat,83,386,0 warp payf01-1 13,2,pay_fild01.gat,278,18
-pay_fild03.gat,15,110,0 warp payf07-1 2,10,pay_fild02.gat,280,108
-pay_fild03.gat,172,281,0 warp payf08 5,2,pay_fild07.gat,167,20
-pay_fild03.gat,313,16,0 warp payf09 4,2,pay_fild06.gat,305,372
-pay_fild03.gat,392,63,0 warp payf005 2,7,alberta.gat,19,233
-pay_fild04.gat,17,165,0 warp payf002 2,8,moc_fild01.gat,376,162
-pay_fild04.gat,194,17,0 warp payf003 7,2,moc_fild02.gat,350,336
-pay_fild05.gat,127,378,0 warp payf04-1 4,2,pay_fild02.gat,134,19
-pay_fild05.gat,271,284,0 warp payf10 2,4,pay_fild06.gat,31,288
-pay_fild06.gat,28,288,0 warp payf10-1 2,2,pay_fild05.gat,268,284
-pay_fild06.gat,305,375,0 warp payf09-1 6,2,pay_fild03.gat,313,19
-pay_fild07.gat,16,200,0 warp payf03-1 3,3,pay_fild01.gat,371,205
-pay_fild07.gat,163,17,0 warp payf08-1 5,2,pay_fild03.gat,177,275
-pay_fild07.gat,280,382,0 warp payf11 4,2,pay_fild08.gat,160,19
-pay_fild07.gat,382,290,0 warp payf12 2,5,pay_fild10.gat,19,290
-pay_fild08.gat,160,16,0 warp payf11-1 4,2,pay_fild07.gat,280,379
-pay_fild08.gat,17,75,0 warp payf006 2,4,payon.gat,265,92
-pay_fild08.gat,262,91,0 warp payf13 2,4,pay_fild09.gat,19,91
-pay_fild09.gat,112,16,0 warp pay14 4,2,pay_fild10.gat,112,379
-pay_fild09.gat,16,91,0 warp payf13-1 2,4,pay_fild08.gat,259,91
-pay_fild10.gat,112,382,0 warp pay14-1 3,2,pay_fild09.gat,112,19
-pay_fild10.gat,16,290,0 warp payf12-1 2,5,pay_fild07.gat,379,290
-pay_fild10.gat,99,13,0 warp w1034 1,1,pay_fild10.gat,148,252
-pay_fild11.gat,297,135,0 warp payf06-1 2,4,pay_fild02.gat,19,175
+//===== eAthena Script =======================================
+//= Payon Field Warps
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= Payon Field Warps
+//===== Additional Comments: =================================
+//= 1.1 Refixed payon field08 -> payon warp
+//============================================================
+
+//= Payon Field's ============================================
+pay_fild01.gat,13,152,0 warp payf001 2,7,moc_fild03.gat,299,170
+pay_fild01.gat,278,14,0 warp payf01 13,2,pay_fild02.gat,83,382
+pay_fild01.gat,353,14,0 warp payf02 20,3,pay_fild02.gat,160,381
+pay_fild01.gat,379,201,0 warp payf03 2,6,pay_fild07.gat,23,207
+pay_fild02.gat,134,16,0 warp payf04 5,2,pay_fild05.gat,127,375
+pay_fild02.gat,16,175,0 warp payf06 2,4,pay_fild11.gat,294,135
+pay_fild02.gat,167,390,0 warp payf02-1 20,3,pay_fild01.gat,354,18
+pay_fild02.gat,284,108,0 warp payf07 2,7,pay_fild03.gat,20,110
+pay_fild02.gat,83,386,0 warp payf01-1 13,2,pay_fild01.gat,278,18
+pay_fild03.gat,15,110,0 warp payf07-1 2,10,pay_fild02.gat,280,108
+pay_fild03.gat,172,281,0 warp payf08 5,2,pay_fild07.gat,167,20
+pay_fild03.gat,313,16,0 warp payf09 4,2,pay_fild06.gat,305,372
+pay_fild03.gat,392,63,0 warp payf005 2,7,alberta.gat,19,233
+pay_fild04.gat,17,165,0 warp payf002 2,8,moc_fild01.gat,376,162
+pay_fild04.gat,194,17,0 warp payf003 7,2,moc_fild02.gat,350,336
+pay_fild05.gat,127,378,0 warp payf04-1 4,2,pay_fild02.gat,134,19
+pay_fild05.gat,271,284,0 warp payf10 2,4,pay_fild06.gat,31,288
+pay_fild06.gat,28,288,0 warp payf10-1 2,2,pay_fild05.gat,268,284
+pay_fild06.gat,305,375,0 warp payf09-1 6,2,pay_fild03.gat,313,19
+pay_fild07.gat,16,200,0 warp payf03-1 3,3,pay_fild01.gat,371,205
+pay_fild07.gat,163,17,0 warp payf08-1 5,2,pay_fild03.gat,177,275
+pay_fild07.gat,280,382,0 warp payf11 4,2,pay_fild08.gat,160,19
+pay_fild07.gat,382,290,0 warp payf12 2,5,pay_fild10.gat,19,290
+pay_fild08.gat,160,16,0 warp payf11-1 4,2,pay_fild07.gat,280,379
+pay_fild08.gat,17,75,0 warp payf006 2,4,payon.gat,265,92
+pay_fild08.gat,262,91,0 warp payf13 2,4,pay_fild09.gat,19,91
+pay_fild09.gat,112,16,0 warp pay14 4,2,pay_fild10.gat,112,379
+pay_fild09.gat,16,91,0 warp payf13-1 2,4,pay_fild08.gat,259,91
+pay_fild10.gat,112,382,0 warp pay14-1 3,2,pay_fild09.gat,112,19
+pay_fild10.gat,16,290,0 warp payf12-1 2,5,pay_fild07.gat,379,290
+pay_fild10.gat,99,13,0 warp w1034 1,1,pay_fild10.gat,148,252
+pay_fild11.gat,297,135,0 warp payf06-1 2,4,pay_fild02.gat,19,175
pay_fild11.gat,38,330,0 warp payf004 4,2,moc_fild03.gat,179,19 \ No newline at end of file
diff --git a/npc/warps/fields/prontera_fild.txt b/npc/warps/fields/prontera_fild.txt
index 3ca22ce4d..8baff38ff 100644
--- a/npc/warps/fields/prontera_fild.txt
+++ b/npc/warps/fields/prontera_fild.txt
@@ -1,101 +1,101 @@
-//===== Athena Script ========================================
-//= Prontera Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Field
-//===== Additional Comments: =================================
-//= 1.1 updating according to jA [Lupus]
-//============================================================
-
-//= Prontera Fields ==========================================
-prt_fild00.gat,159,383,0 warp prtf007 4,2,mjolnir_07.gat,156,19
-prt_fild00.gat,165,18,0 warp prtf01 9,3,prt_fild04.gat,158,384
-prt_fild00.gat,18,129,0 warp prtf015 2,6,gef_fild00.gat,376,140
-prt_fild00.gat,317,18,0 warp prtf02 8,2,prt_fild04.gat,323,384
-prt_fild00.gat,383,249,0 warp prtf008 2,4,mjolnir_09.gat,33,248
-prt_fild01.gat,136,373,0 warp prtf030 1,1,prt_maze01.gat,99,31
-prt_fild01.gat,199,24,0 warp prtf001 3,2,prt_gld.gat,159,295
-prt_fild01.gat,20,292,0 warp prtf009 2,3,mjolnir_09.gat,370,288
-prt_fild01.gat,261,373,0 warp prtf010 6,2,mjolnir_10.gat,265,16
-prt_fild01.gat,380,243,0 warp prtf03 2,5,prt_fild02.gat,20,242
-prt_fild01.gat,382,304,0 warp prtf04 2,10,prt_fild02.gat,20,305
-prt_fild01.gat,382,351,0 warp prtf05 2,8,prt_fild02.gat,20,350
-prt_fild01.gat,66,373,0 warp prtf011 2,2,mjolnir_10.gat,66,18
-prt_fild02.gat,17,242,0 warp prtf03-1 2,5,prt_fild01.gat,377,243
-prt_fild02.gat,17,305,0 warp prtf04-1 2,5,prt_fild01.gat,379,302
-prt_fild02.gat,17,350,0 warp prtf05-1 2,7,prt_fild01.gat,379,351
-prt_fild02.gat,173,382,0 warp prtf012 4,2,mjolnir_11.gat,174,23
-prt_fild02.gat,305,17,0 warp prtf06 10,2,prt_fild06.gat,277,315
-prt_fild02.gat,380,347,0 warp prtf07 2,10,prt_fild03.gat,23,249
-prt_fild03.gat,16,249,0 warp prtf07-1 2,10,prt_fild02.gat,373,353
-prt_fild03.gat,371,256,0 warp prtf006 2,2,prt_monk.gat,25,248
-prt_fild04.gat,160,387,0 warp prtf01-1 10,2,prt_fild00.gat,164,24
-prt_fild04.gat,17,114,0 warp prtf016 2,10,gef_fild01.gat,375,111
-prt_fild04.gat,323,387,0 warp prtf02-1 7,2,prt_fild00.gat,315,21
-prt_fild04.gat,378,72,0 warp prtf08 2,6,prt_fild05.gat,17,59
-prt_fild04.gat,384,155,0 warp prtf09 2,7,prt_fild05.gat,20,134
-prt_fild04.gat,384,334,0 warp prtf10 2,6,prt_fild05.gat,20,333
-prt_fild05.gat,105,381,0 warp prtf013 5,2,mjolnir_09.gat,106,34
-prt_fild05.gat,13,63,0 warp prtf08-1 2,15,prt_fild04.gat,374,73
-prt_fild05.gat,134,14,0 warp prtf11 14,3,prt_fild07.gat,129,374
-prt_fild05.gat,14,141,0 warp prtf09-1 2,18,prt_fild04.gat,380,158
-prt_fild05.gat,15,333,0 warp prtf10-1 2,8,prt_fild04.gat,380,332
-prt_fild05.gat,255,14,0 warp prtf12 12,2,prt_fild07.gat,248,369
-prt_fild05.gat,292,385,0 warp prtf014 4,2,mjolnir_09.gat,305,33
-prt_fild05.gat,373,205,0 warp prtf002 3,3,prontera.gat,26,203
-prt_fild06.gat,23,193,0 warp prtf003 2,3,prontera.gat,285,203
-prt_fild06.gat,277,320,0 warp prtf06-1 10,2,prt_fild02.gat,305,22
-prt_fild07.gat,13,64,0 warp prtf017 3,8,gef_fild02.gat,376,69
-prt_fild07.gat,132,381,0 warp prtf11-1 9,3,prt_fild05.gat,142,18
-prt_fild07.gat,14,289,0 warp prtf018 3,10,gef_fild02.gat,375,292
-prt_fild07.gat,17,145,0 warp prtf019 3,12,gef_fild02.gat,376,156
-prt_fild07.gat,206,12,0 warp prtf13 4,2,prt_fild09.gat,224,377
-prt_fild07.gat,248,376,0 warp prtf12-1 8,2,prt_fild05.gat,257,18
-prt_fild07.gat,383,239,0 warp prtf14 3,20,prt_fild08.gat,20,239
-prt_fild07.gat,385,186,0 warp prtf15 3,20,prt_fild08.gat,20,186
-prt_fild07.gat,84,13,0 warp prtf16 4,2,prt_fild09.gat,87,377
-prt_fild08.gat,16,187,0 warp prtf15-1 3,17,prt_fild07.gat,380,186
-prt_fild08.gat,16,239,0 warp prtf14-1 3,15,prt_fild07.gat,379,239
-prt_fild08.gat,170,378,0 warp prtf004 3,2,prontera.gat,156,26
-prt_fild08.gat,233,16,0 warp prtf023 12,1,moc_fild01.gat,238,378
-prt_fild08.gat,371,212,0 warp prtf005 3,3,izlude.gat,35,78
-prt_fild08.gat,55,21,0 warp prtf024 4,2,moc_fild01.gat,56,380
-prt_fild09.gat,14,124,0 warp prtf17 2,6,prt_fild10.gat,336,126
-prt_fild09.gat,14,139,0 warp prtf17-1 2,8,prt_fild10.gat,336,126
-prt_fild09.gat,224,380,0 warp prtf13-1 4,2,prt_fild07.gat,206,15
-prt_fild09.gat,246,16,0 warp prtf025 7,2,moc_fild04.gat,92,378
-prt_fild09.gat,383,223,0 warp prtf026 2,15,moc_fild01.gat,25,242
-prt_fild09.gat,383,251,0 warp prtf027 2,15,moc_fild01.gat,25,242
-prt_fild09.gat,87,380,0 warp prtf16-1 5,2,prt_fild07.gat,84,16
-prt_fild09.gat,95,16,0 warp prtf028 7,2,moc_fild05.gat,325,379
-prt_fild10.gat,20,122,0 warp prtf19 2,4,prt_fild11.gat,359,111
-prt_fild10.gat,20,196,0 warp prtf20 2,4,prt_fild11.gat,358,184
-prt_fild10.gat,227,299,0 warp prtf020 5,2,gef_fild02.gat,266,21
-prt_fild10.gat,263,20,0 warp prtf029 6,2,moc_fild05.gat,144,372
-prt_fild10.gat,339,126,0 warp prtf17-2 2,8,prt_fild09.gat,17,133
-prt_fild11.gat,17,281,0 warp prtf021 2,4,gef_fild11.gat,374,293
-prt_fild11.gat,302,301,0 warp prtf022 5,2,gef_fild03.gat,312,19
-prt_fild11.gat,361,184,0 warp prtf20-1 2,5,prt_fild10.gat,23,196
-prt_fild11.gat,362,111,0 warp prtf19-1 2,6,prt_fild10.gat,23,122
-
-//= St. Capitolina Abbey =====================================
-monk_in.gat,128,46,0 warp monk03 1,3,monk_in.gat,161,38
-monk_in.gat,128,84,0 warp monk04 1,3,monk_in.gat,161,90
-monk_in.gat,159,38,0 warp monk03-1 1,3,monk_in.gat,126,46
-monk_in.gat,159,90,0 warp monk04-1 1,3,monk_in.gat,126,84
-monk_in.gat,40,38,0 warp monk05 1,3,monk_in.gat,71,46
-monk_in.gat,40,92,0 warp monk06 1,3,monk_in.gat,71,84
-monk_in.gat,69,46,0 warp monk05-1 1,3,monk_in.gat,38,38
-monk_in.gat,69,84,0 warp monk06-1 1,3,monk_in.gat,38,92
-monk_in.gat,98,186,0 warp monk02-1 3,2,prt_monk.gat,245,139
-monk_in.gat,98,27,0 warp monk01-1 5,2,prt_monk.gat,245,104
-monk_in.gat,99,102,0 warp monk07 5,1,monk_in.gat,99,143
-monk_in.gat,99,141,0 warp monk07-1 3,1,monk_in.gat,99,100
-prt_monk.gat,22,248,0 warp monk001 2,2,prt_fild03.gat,368,256
-prt_monk.gat,245,106,0 warp monk01 1,1,monk_in.gat,98,30
+//===== Athena Script ========================================
+//= Prontera Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Field
+//===== Additional Comments: =================================
+//= 1.1 updating according to jA [Lupus]
+//============================================================
+
+//= Prontera Fields ==========================================
+prt_fild00.gat,159,383,0 warp prtf007 4,2,mjolnir_07.gat,156,19
+prt_fild00.gat,165,18,0 warp prtf01 9,3,prt_fild04.gat,158,384
+prt_fild00.gat,18,129,0 warp prtf015 2,6,gef_fild00.gat,376,140
+prt_fild00.gat,317,18,0 warp prtf02 8,2,prt_fild04.gat,323,384
+prt_fild00.gat,383,249,0 warp prtf008 2,4,mjolnir_09.gat,33,248
+prt_fild01.gat,136,373,0 warp prtf030 1,1,prt_maze01.gat,99,31
+prt_fild01.gat,199,24,0 warp prtf001 3,2,prt_gld.gat,159,295
+prt_fild01.gat,20,292,0 warp prtf009 2,3,mjolnir_09.gat,370,288
+prt_fild01.gat,261,373,0 warp prtf010 6,2,mjolnir_10.gat,265,16
+prt_fild01.gat,380,243,0 warp prtf03 2,5,prt_fild02.gat,20,242
+prt_fild01.gat,382,304,0 warp prtf04 2,10,prt_fild02.gat,20,305
+prt_fild01.gat,382,351,0 warp prtf05 2,8,prt_fild02.gat,20,350
+prt_fild01.gat,66,373,0 warp prtf011 2,2,mjolnir_10.gat,66,18
+prt_fild02.gat,17,242,0 warp prtf03-1 2,5,prt_fild01.gat,377,243
+prt_fild02.gat,17,305,0 warp prtf04-1 2,5,prt_fild01.gat,379,302
+prt_fild02.gat,17,350,0 warp prtf05-1 2,7,prt_fild01.gat,379,351
+prt_fild02.gat,173,382,0 warp prtf012 4,2,mjolnir_11.gat,174,23
+prt_fild02.gat,305,17,0 warp prtf06 10,2,prt_fild06.gat,277,315
+prt_fild02.gat,380,347,0 warp prtf07 2,10,prt_fild03.gat,23,249
+prt_fild03.gat,16,249,0 warp prtf07-1 2,10,prt_fild02.gat,373,353
+prt_fild03.gat,371,256,0 warp prtf006 2,2,prt_monk.gat,25,248
+prt_fild04.gat,160,387,0 warp prtf01-1 10,2,prt_fild00.gat,164,24
+prt_fild04.gat,17,114,0 warp prtf016 2,10,gef_fild01.gat,375,111
+prt_fild04.gat,323,387,0 warp prtf02-1 7,2,prt_fild00.gat,315,21
+prt_fild04.gat,378,72,0 warp prtf08 2,6,prt_fild05.gat,17,59
+prt_fild04.gat,384,155,0 warp prtf09 2,7,prt_fild05.gat,20,134
+prt_fild04.gat,384,334,0 warp prtf10 2,6,prt_fild05.gat,20,333
+prt_fild05.gat,105,381,0 warp prtf013 5,2,mjolnir_09.gat,106,34
+prt_fild05.gat,13,63,0 warp prtf08-1 2,15,prt_fild04.gat,374,73
+prt_fild05.gat,134,14,0 warp prtf11 14,3,prt_fild07.gat,129,374
+prt_fild05.gat,14,141,0 warp prtf09-1 2,18,prt_fild04.gat,380,158
+prt_fild05.gat,15,333,0 warp prtf10-1 2,8,prt_fild04.gat,380,332
+prt_fild05.gat,255,14,0 warp prtf12 12,2,prt_fild07.gat,248,369
+prt_fild05.gat,292,385,0 warp prtf014 4,2,mjolnir_09.gat,305,33
+prt_fild05.gat,373,205,0 warp prtf002 3,3,prontera.gat,26,203
+prt_fild06.gat,23,193,0 warp prtf003 2,3,prontera.gat,285,203
+prt_fild06.gat,277,320,0 warp prtf06-1 10,2,prt_fild02.gat,305,22
+prt_fild07.gat,13,64,0 warp prtf017 3,8,gef_fild02.gat,376,69
+prt_fild07.gat,132,381,0 warp prtf11-1 9,3,prt_fild05.gat,142,18
+prt_fild07.gat,14,289,0 warp prtf018 3,10,gef_fild02.gat,375,292
+prt_fild07.gat,17,145,0 warp prtf019 3,12,gef_fild02.gat,376,156
+prt_fild07.gat,206,12,0 warp prtf13 4,2,prt_fild09.gat,224,377
+prt_fild07.gat,248,376,0 warp prtf12-1 8,2,prt_fild05.gat,257,18
+prt_fild07.gat,383,239,0 warp prtf14 3,20,prt_fild08.gat,20,239
+prt_fild07.gat,385,186,0 warp prtf15 3,20,prt_fild08.gat,20,186
+prt_fild07.gat,84,13,0 warp prtf16 4,2,prt_fild09.gat,87,377
+prt_fild08.gat,16,187,0 warp prtf15-1 3,17,prt_fild07.gat,380,186
+prt_fild08.gat,16,239,0 warp prtf14-1 3,15,prt_fild07.gat,379,239
+prt_fild08.gat,170,378,0 warp prtf004 3,2,prontera.gat,156,26
+prt_fild08.gat,233,16,0 warp prtf023 12,1,moc_fild01.gat,238,378
+prt_fild08.gat,371,212,0 warp prtf005 3,3,izlude.gat,35,78
+prt_fild08.gat,55,21,0 warp prtf024 4,2,moc_fild01.gat,56,380
+prt_fild09.gat,14,124,0 warp prtf17 2,6,prt_fild10.gat,336,126
+prt_fild09.gat,14,139,0 warp prtf17-1 2,8,prt_fild10.gat,336,126
+prt_fild09.gat,224,380,0 warp prtf13-1 4,2,prt_fild07.gat,206,15
+prt_fild09.gat,246,16,0 warp prtf025 7,2,moc_fild04.gat,92,378
+prt_fild09.gat,383,223,0 warp prtf026 2,15,moc_fild01.gat,25,242
+prt_fild09.gat,383,251,0 warp prtf027 2,15,moc_fild01.gat,25,242
+prt_fild09.gat,87,380,0 warp prtf16-1 5,2,prt_fild07.gat,84,16
+prt_fild09.gat,95,16,0 warp prtf028 7,2,moc_fild05.gat,325,379
+prt_fild10.gat,20,122,0 warp prtf19 2,4,prt_fild11.gat,359,111
+prt_fild10.gat,20,196,0 warp prtf20 2,4,prt_fild11.gat,358,184
+prt_fild10.gat,227,299,0 warp prtf020 5,2,gef_fild02.gat,266,21
+prt_fild10.gat,263,20,0 warp prtf029 6,2,moc_fild05.gat,144,372
+prt_fild10.gat,339,126,0 warp prtf17-2 2,8,prt_fild09.gat,17,133
+prt_fild11.gat,17,281,0 warp prtf021 2,4,gef_fild11.gat,374,293
+prt_fild11.gat,302,301,0 warp prtf022 5,2,gef_fild03.gat,312,19
+prt_fild11.gat,361,184,0 warp prtf20-1 2,5,prt_fild10.gat,23,196
+prt_fild11.gat,362,111,0 warp prtf19-1 2,6,prt_fild10.gat,23,122
+
+//= St. Capitolina Abbey =====================================
+monk_in.gat,128,46,0 warp monk03 1,3,monk_in.gat,161,38
+monk_in.gat,128,84,0 warp monk04 1,3,monk_in.gat,161,90
+monk_in.gat,159,38,0 warp monk03-1 1,3,monk_in.gat,126,46
+monk_in.gat,159,90,0 warp monk04-1 1,3,monk_in.gat,126,84
+monk_in.gat,40,38,0 warp monk05 1,3,monk_in.gat,71,46
+monk_in.gat,40,92,0 warp monk06 1,3,monk_in.gat,71,84
+monk_in.gat,69,46,0 warp monk05-1 1,3,monk_in.gat,38,38
+monk_in.gat,69,84,0 warp monk06-1 1,3,monk_in.gat,38,92
+monk_in.gat,98,186,0 warp monk02-1 3,2,prt_monk.gat,245,139
+monk_in.gat,98,27,0 warp monk01-1 5,2,prt_monk.gat,245,104
+monk_in.gat,99,102,0 warp monk07 5,1,monk_in.gat,99,143
+monk_in.gat,99,141,0 warp monk07-1 3,1,monk_in.gat,99,100
+prt_monk.gat,22,248,0 warp monk001 2,2,prt_fild03.gat,368,256
+prt_monk.gat,245,106,0 warp monk01 1,1,monk_in.gat,98,30
prt_monk.gat,245,137,0 warp monk02 1,1,monk_in.gat,98,183 \ No newline at end of file
diff --git a/npc/warps/fields/rachel_fild.txt b/npc/warps/fields/rachel_fild.txt
index 2e2b2c696..7b9889e8d 100644
--- a/npc/warps/fields/rachel_fild.txt
+++ b/npc/warps/fields/rachel_fild.txt
@@ -1,32 +1,32 @@
-//Rachel Fields
-ra_fild01.gat,233,334,0 warp ra000 1,1,ice_dun01.gat,157,14
-ra_fild01.gat,305,38,0 warp ra001 1,1,ra_fild04.gat,324,375
-ra_fild04.gat,324,379,0 warp ra002 1,1,ra_fild01.gat,305,42
-ra_fild04.gat,363,350,0 warp ra003 1,1,ra_fild05.gat,36,358
-ra_fild05.gat,32,357,0 warp ra004 1,1,ra_fild04.gat,359,350
-ra_fild05.gat,25,15,0 warp ra005 1,1,ra_fild09.gat,29,339
-ra_fild09.gat,28,343,0 warp ra006 1,1,ra_fild05.gat,29,19
-ra_fild04.gat,263,54,0 warp ra007 1,1,ra_fild08.gat,297,367
-ra_fild08.gat,297,371,0 warp ra008 1,1,ra_fild04.gat,263,58
-ra_fild09.gat,26,236,0 warp ra009 1,1,ra_fild08.gat,365,234
-ra_fild08.gat,369,234,0 warp ra010 1,1,ra_fild09.gat,30,236
-ra_fild04.gat,23,176,0 warp ra011 1,1,ra_fild03.gat,370,172
-ra_fild03.gat,374,172,0 warp ra012 1,1,ra_fild04.gat,27,176
-ra_fild05.gat,349,274,0 warp ra013 1,1,ra_fild06.gat,23,280
-ra_fild06.gat,19,280,0 warp ra014 1,1,ra_fild05.gat,345,274
-ra_fild06.gat,296,21,0 warp ra015 1,1,lhz_fild01.gat,295,381
-lhz_fild01.gat,295,383,0 warp ra016 1,1,ra_fild06.gat,296,23
-ra_fild12.gat,36,225,0 warp ra017 1,1,rachel.gat,268,125
-ra_fild08.gat,168,28,0 warp ra018 1,1,ra_fild12.gat,155,370
-ra_fild12.gat,155,375,0 warp ra019 1,1,ra_fild08.gat,168,32
-ra_fild12.gat,279,26,0 warp ra020 1,1,ra_fild13.gat,296,343
-ra_fild13.gat,296,347,0 warp ra021 1,1,ra_fild12.gat,279,30
-ra_fild11.gat,361,225,0 warp ra022 1,1,rachel.gat,30,125
-ra_fild11.gat,20,293,0 warp ra023 1,1,ra_fild10.gat,380,297
-ra_fild10.gat,385,297,0 warp ra024 1,1,ra_fild11.gat,25,293
-ra_fild11.gat,201,336,0 warp ra025 1,1,ra_fild07.gat,215,30
-ra_fild07.gat,215,26,0 warp ra025 1,1,ra_fild11.gat,201,332
-ra_fild07.gat,165,356,0 warp ra026 1,1,ra_fild02.gat,168,40
-ra_fild02.gat,168,35,0 warp ra027 1,1,ra_fild07.gat,165,352
-ra_fild02.gat,372,275,0 warp ra028 1,1,ra_fild03.gat,26,297
+//Rachel Fields
+ra_fild01.gat,233,334,0 warp ra000 1,1,ice_dun01.gat,157,14
+ra_fild01.gat,305,38,0 warp ra001 1,1,ra_fild04.gat,324,375
+ra_fild04.gat,324,379,0 warp ra002 1,1,ra_fild01.gat,305,42
+ra_fild04.gat,363,350,0 warp ra003 1,1,ra_fild05.gat,36,358
+ra_fild05.gat,32,357,0 warp ra004 1,1,ra_fild04.gat,359,350
+ra_fild05.gat,25,15,0 warp ra005 1,1,ra_fild09.gat,29,339
+ra_fild09.gat,28,343,0 warp ra006 1,1,ra_fild05.gat,29,19
+ra_fild04.gat,263,54,0 warp ra007 1,1,ra_fild08.gat,297,367
+ra_fild08.gat,297,371,0 warp ra008 1,1,ra_fild04.gat,263,58
+ra_fild09.gat,26,236,0 warp ra009 1,1,ra_fild08.gat,365,234
+ra_fild08.gat,369,234,0 warp ra010 1,1,ra_fild09.gat,30,236
+ra_fild04.gat,23,176,0 warp ra011 1,1,ra_fild03.gat,370,172
+ra_fild03.gat,374,172,0 warp ra012 1,1,ra_fild04.gat,27,176
+ra_fild05.gat,349,274,0 warp ra013 1,1,ra_fild06.gat,23,280
+ra_fild06.gat,19,280,0 warp ra014 1,1,ra_fild05.gat,345,274
+ra_fild06.gat,296,21,0 warp ra015 1,1,lhz_fild01.gat,295,381
+lhz_fild01.gat,295,383,0 warp ra016 1,1,ra_fild06.gat,296,23
+ra_fild12.gat,36,225,0 warp ra017 1,1,rachel.gat,268,125
+ra_fild08.gat,168,28,0 warp ra018 1,1,ra_fild12.gat,155,370
+ra_fild12.gat,155,375,0 warp ra019 1,1,ra_fild08.gat,168,32
+ra_fild12.gat,279,26,0 warp ra020 1,1,ra_fild13.gat,296,343
+ra_fild13.gat,296,347,0 warp ra021 1,1,ra_fild12.gat,279,30
+ra_fild11.gat,361,225,0 warp ra022 1,1,rachel.gat,30,125
+ra_fild11.gat,20,293,0 warp ra023 1,1,ra_fild10.gat,380,297
+ra_fild10.gat,385,297,0 warp ra024 1,1,ra_fild11.gat,25,293
+ra_fild11.gat,201,336,0 warp ra025 1,1,ra_fild07.gat,215,30
+ra_fild07.gat,215,26,0 warp ra025 1,1,ra_fild11.gat,201,332
+ra_fild07.gat,165,356,0 warp ra026 1,1,ra_fild02.gat,168,40
+ra_fild02.gat,168,35,0 warp ra027 1,1,ra_fild07.gat,165,352
+ra_fild02.gat,372,275,0 warp ra028 1,1,ra_fild03.gat,26,297
ra_fild03.gat,22,297,0 warp ra029 1,1,ra_fild02.gat,368,271 \ No newline at end of file
diff --git a/npc/warps/fields/umbala_fild.txt b/npc/warps/fields/umbala_fild.txt
index d20de19fe..6b07d484d 100644
--- a/npc/warps/fields/umbala_fild.txt
+++ b/npc/warps/fields/umbala_fild.txt
@@ -1,35 +1,35 @@
-//===== Athena Script ========================================
-//= Umbala Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Umbala Field
-//===== Additional Comments: =================================
-//= No Comment
-//============================================================
-
-//Umbala-Umbala Fields Connection
-um_fild04.gat,215,340,0 warp umba0055 1,1,umbala.gat,130,80
-umbala.gat,129,78,0 warp umba0001 1,1,um_fild04.gat,215,337
-
-//Umbala-Comodo Connection
-beach_dun2.gat,258,244,0 warp umba0052 1,1,um_fild01.gat,35,276
-cmd_fild01.gat,179,370,0 warp umba0041 1,1,um_fild03.gat,239,27
-cmd_fild01.gat,78,367,0 warp umba0043 1,1,um_fild03.gat,117,51
-um_fild01.gat,30,274,0 warp umba0051 1,1,beach_dun2.gat,255,244
-um_fild03.gat,119,50,0 warp umba0044 1,1,cmd_fild01.gat,78,365
-um_fild03.gat,239,25,0 warp umba0042 1,1,cmd_fild01.gat,179,368
-
-//Umbala Fields
-um_fild01.gat,368,275,0 warp umba0010 1,1,um_fild02.gat,24,271
-um_fild02.gat,191,374,0 warp umba0053 1,1,um_fild04.gat,179,13
-um_fild02.gat,21,270,0 warp umba0009 1,1,um_fild01.gat,365,275
-um_fild02.gat,374,149,0 warp umba0008 1,1,um_fild03.gat,35,146
-um_fild02.gat,374,326,0 warp umba0005 1,1,um_fild03.gat,21,334
-um_fild03.gat,18,334,0 warp umba0006 1,1,um_fild02.gat,371,326
-um_fild03.gat,30,146,0 warp umba0007 1,1,um_fild02.gat,371,149
+//===== Athena Script ========================================
+//= Umbala Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Umbala Field
+//===== Additional Comments: =================================
+//= No Comment
+//============================================================
+
+//Umbala-Umbala Fields Connection
+um_fild04.gat,215,340,0 warp umba0055 1,1,umbala.gat,130,80
+umbala.gat,129,78,0 warp umba0001 1,1,um_fild04.gat,215,337
+
+//Umbala-Comodo Connection
+beach_dun2.gat,258,244,0 warp umba0052 1,1,um_fild01.gat,35,276
+cmd_fild01.gat,179,370,0 warp umba0041 1,1,um_fild03.gat,239,27
+cmd_fild01.gat,78,367,0 warp umba0043 1,1,um_fild03.gat,117,51
+um_fild01.gat,30,274,0 warp umba0051 1,1,beach_dun2.gat,255,244
+um_fild03.gat,119,50,0 warp umba0044 1,1,cmd_fild01.gat,78,365
+um_fild03.gat,239,25,0 warp umba0042 1,1,cmd_fild01.gat,179,368
+
+//Umbala Fields
+um_fild01.gat,368,275,0 warp umba0010 1,1,um_fild02.gat,24,271
+um_fild02.gat,191,374,0 warp umba0053 1,1,um_fild04.gat,179,13
+um_fild02.gat,21,270,0 warp umba0009 1,1,um_fild01.gat,365,275
+um_fild02.gat,374,149,0 warp umba0008 1,1,um_fild03.gat,35,146
+um_fild02.gat,374,326,0 warp umba0005 1,1,um_fild03.gat,21,334
+um_fild03.gat,18,334,0 warp umba0006 1,1,um_fild02.gat,371,326
+um_fild03.gat,30,146,0 warp umba0007 1,1,um_fild02.gat,371,149
um_fild04.gat,179,10,0 warp umba0054 1,1,um_fild02.gat,191,372 \ No newline at end of file
diff --git a/npc/warps/fields/yuno_fild.txt b/npc/warps/fields/yuno_fild.txt
index 1dff2d39a..2cedd8902 100644
--- a/npc/warps/fields/yuno_fild.txt
+++ b/npc/warps/fields/yuno_fild.txt
@@ -1,89 +1,89 @@
-//===== Athena Script ========================================
-//= Yuno Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0), Sara
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Yuno Field
-//===== Additional Comments: =================================
-//= 1.1 - Updated for the new Yuno Fields
-//= 1.2 New field update - Hugel Field by Sara - Version 1
-//============================================================
-
-//= Yuno Field ===============================================
-//yuno_fild01.gat,286,368,0 warp yunfild01 1,1,yuno_fild02.gat,294,26
-//yuno_fild02.gat,294,24,0 warp yunfild01-1 1,1,yuno_fild01.gat,286,366
-//yuno_fild01.gat,70,378,0 warp yunfild02 1,1,yuno_fild02.gat,70,25
-//yuno_fild02.gat,70,23,0 warp yunfild02-1 1,1,yuno_fild01.gat,70,376
-
-yuno_fild02.gat,18,337,0 warp yunfild03 1,1,yuno_fild03.gat,381,331
-yuno_fild03.gat,383,331,0 warp yunfild03-1 1,1,yuno_fild02.gat,20,337
-yuno_fild03.gat,19,79,0 warp yunfild04 1,1,yuno_fild04.gat,373,84
-yuno_fild04.gat,375,84,0 warp yunfild04-1 1,1,yuno_fild03.gat,21,79
-yuno_fild03.gat,20,155,0 warp yunfild05 1,1,yuno_fild04.gat,373,150
-yuno_fild04.gat,375,150,0 warp yunfild05-1 1,1,yuno_fild03.gat,22,155
-yuno_fild04.gat,231,288,0 warp yunfild-yun 1,1,yuno.gat,158,17
-yuno_fild03.gat,32,139,0 warp yunfild-mag01 1,1,mag_dun01.gat,126,68
-
-//= New Yuno Fields ==========================================
-yuno_fild01.gat,26,246,0 warp newjun01 1,1,yuno_fild12.gat,373,239
-yuno_fild12.gat,375,239,0 warp newjun01a 1,1,yuno_fild01.gat,28,246
-yuno_fild12.gat,23,338,0 warp newjun02 1,1,yuno_fild11.gat,366,361
-yuno_fild11.gat,368,361,0 warp newjun02a 1,1,yuno_fild12.gat,25,338
-yuno_fild12.gat,24,225,0 warp newjun03 1,1,yuno_fild11.gat,363,218
-yuno_fild11.gat,365,218,0 warp newjun03a 1,1,yuno_fild12.gat,24,227
-yuno_fild07.gat,92,12,0 warp newjun04 1,1,yuno_fild11.gat,92,369
-yuno_fild11.gat,92,371,0 warp newjun04a 1,1,yuno_fild07.gat,92,14
-yuno_fild12.gat,193,371,0 warp newjun05 1,1,yuno_fild08.gat,143,21
-yuno_fild08.gat,145,21,0 warp newjun05a 1,1,yuno_fild12.gat,195,371
-yuno_fild01.gat,70,378,0 warp newjun06 1,1,yuno_fild09.gat,70,19
-yuno_fild09.gat,70,17,0 warp newjun06a 1,1,yuno_fild01.gat,70,376
-yuno_fild01.gat,286,368,0 warp newjun07 1,1,yuno_fild09.gat,280,30
-yuno_fild09.gat,280,28,0 warp newjun07a 1,1,yuno_fild01.gat,286,366
-yuno_fild09.gat,19,194,0 warp newjun08 1,1,yuno_fild08.gat,374,193
-yuno_fild08.gat,376,193,0 warp newjun08a 1,1,yuno_fild09.gat,21,194
-yuno_fild08.gat,20,278,0 warp newjun09 1,1,yuno_fild07.gat,352,291
-yuno_fild07.gat,354,291,0 warp newjun09a 1,1,yuno_fild08.gat,22,278
-yuno_fild08.gat,31,58,0 warp newjun10 1,1,yuno_fild07.gat,358,72
-yuno_fild07.gat,360,72,0 warp newjun10a 1,1,yuno_fild08.gat,33,58
-
-//= (By speculation only) ====================================
-yuno_fild07.gat,179,354,0 warp newjun11 1,1,yuno_fild03.gat,179,17
-yuno_fild03.gat,179,15,0 warp newjun11a 1,1,yuno_fild07.gat,179,352
-yuno_fild08.gat,74,376,0 warp newjun12 1,1,yuno_fild02.gat,70,25
-yuno_fild02.gat,70,23,0 warp newjun12a 1,1,yuno_fild08.gat,74,374
-yuno_fild08.gat,286,386,0 warp newjun13 1,1,yuno_fild02.gat,294,26
-yuno_fild02.gat,294,24,0 warp newjun13a 1,1,yuno_fild08.gat,286,384
-yuno_fild04.gat,42,369,0 warp newjun14 1,1,yuno_fild05.gat,59,30
-yuno_fild05.gat,59,28,0 warp newjun14a 1,1,yuno_fild04.gat,42,367
-
-
-//= Al de Baran <-> Yuno Connection ==========================
-aldebaran.gat,140,244,0 warp alde-yunfild 1,1,yuno_fild01.gat,208,19
-yuno_fild01.gat,208,17,0 warp yunfild-alde 1,1,aldebaran.gat,140,242
-
-//= Hugel Field
-//= Version 1
-yuno_fild05.gat,372,325,0 warp hu001 1,1,yuno_fild06.gat,42,319
-yuno_fild06.gat,40,319,0 warp hu001a 1,1,yuno_fild05.gat,370,325
-yuno_fild06.gat,217,27,0 warp hu002 1,1,yuno_fild03.gat,214,381
-yuno_fild03.gat,214,383,0 warp hu002a 1,1,yuno_fild06.gat,217,29
-yuno_fild06.gat,369,136,0 warp hu003 1,1,hu_fild04.gat,28,126
-hu_fild04.gat,26,126,0 warp hu003a 1,1,yuno_fild06.gat,367,136
-hu_fild04.gat,121,26,0 warp hu004 1,1,yuno_fild02.gat,118,374
-yuno_fild02.gat,118,376,0 warp hu004a 1,1,hu_fild04.gat,121,28
-yuno_fild06.gat,149,369,0 warp hu005 1,1,hu_fild01.gat,139,37
-hu_fild01.gat,139,35,0 warp hu005a 1,1,yuno_fild06.gat,151,369
-hu_fild04.gat,381,187,0 warp hu006 1,1,hu_fild05.gat,34,202
-hu_fild05.gat,32,202,0 warp hu006a 1,1,hu_fild04.gat,379,187
-hu_fild05.gat,91,42,0 warp hu007 1,1,hu_fild07.gat,80,369
-hu_fild07.gat,80,371,0 warp hu007a 1,1,hu_fild05.gat,91,44
-hu_fild07.gat,35,351,0 warp hu008 1,1,yuno_fild02.gat,384,338
-yuno_fild02.gat,384,340,0 warp hu008a 1,1,hu_fild07.gat,37,351
-hu_fild07.gat,56,36,0 warp hu009 1,1,yuno_fild09.gat,47,375
-yuno_fild09.gat,47,377,0 warp hu009a 1,1,hu_fild07.gat,56,38
-hu_fild07.gat,226,36,0 warp hu010 1,1,yuno_fild09.gat,220,372
-yuno_fild09.gat,220,374,0 warp hu010a 1,1,hu_fild07.gat,226,38
+//===== Athena Script ========================================
+//= Yuno Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0), Sara
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Yuno Field
+//===== Additional Comments: =================================
+//= 1.1 - Updated for the new Yuno Fields
+//= 1.2 New field update - Hugel Field by Sara - Version 1
+//============================================================
+
+//= Yuno Field ===============================================
+//yuno_fild01.gat,286,368,0 warp yunfild01 1,1,yuno_fild02.gat,294,26
+//yuno_fild02.gat,294,24,0 warp yunfild01-1 1,1,yuno_fild01.gat,286,366
+//yuno_fild01.gat,70,378,0 warp yunfild02 1,1,yuno_fild02.gat,70,25
+//yuno_fild02.gat,70,23,0 warp yunfild02-1 1,1,yuno_fild01.gat,70,376
+
+yuno_fild02.gat,18,337,0 warp yunfild03 1,1,yuno_fild03.gat,381,331
+yuno_fild03.gat,383,331,0 warp yunfild03-1 1,1,yuno_fild02.gat,20,337
+yuno_fild03.gat,19,79,0 warp yunfild04 1,1,yuno_fild04.gat,373,84
+yuno_fild04.gat,375,84,0 warp yunfild04-1 1,1,yuno_fild03.gat,21,79
+yuno_fild03.gat,20,155,0 warp yunfild05 1,1,yuno_fild04.gat,373,150
+yuno_fild04.gat,375,150,0 warp yunfild05-1 1,1,yuno_fild03.gat,22,155
+yuno_fild04.gat,231,288,0 warp yunfild-yun 1,1,yuno.gat,158,17
+yuno_fild03.gat,32,139,0 warp yunfild-mag01 1,1,mag_dun01.gat,126,68
+
+//= New Yuno Fields ==========================================
+yuno_fild01.gat,26,246,0 warp newjun01 1,1,yuno_fild12.gat,373,239
+yuno_fild12.gat,375,239,0 warp newjun01a 1,1,yuno_fild01.gat,28,246
+yuno_fild12.gat,23,338,0 warp newjun02 1,1,yuno_fild11.gat,366,361
+yuno_fild11.gat,368,361,0 warp newjun02a 1,1,yuno_fild12.gat,25,338
+yuno_fild12.gat,24,225,0 warp newjun03 1,1,yuno_fild11.gat,363,218
+yuno_fild11.gat,365,218,0 warp newjun03a 1,1,yuno_fild12.gat,24,227
+yuno_fild07.gat,92,12,0 warp newjun04 1,1,yuno_fild11.gat,92,369
+yuno_fild11.gat,92,371,0 warp newjun04a 1,1,yuno_fild07.gat,92,14
+yuno_fild12.gat,193,371,0 warp newjun05 1,1,yuno_fild08.gat,143,21
+yuno_fild08.gat,145,21,0 warp newjun05a 1,1,yuno_fild12.gat,195,371
+yuno_fild01.gat,70,378,0 warp newjun06 1,1,yuno_fild09.gat,70,19
+yuno_fild09.gat,70,17,0 warp newjun06a 1,1,yuno_fild01.gat,70,376
+yuno_fild01.gat,286,368,0 warp newjun07 1,1,yuno_fild09.gat,280,30
+yuno_fild09.gat,280,28,0 warp newjun07a 1,1,yuno_fild01.gat,286,366
+yuno_fild09.gat,19,194,0 warp newjun08 1,1,yuno_fild08.gat,374,193
+yuno_fild08.gat,376,193,0 warp newjun08a 1,1,yuno_fild09.gat,21,194
+yuno_fild08.gat,20,278,0 warp newjun09 1,1,yuno_fild07.gat,352,291
+yuno_fild07.gat,354,291,0 warp newjun09a 1,1,yuno_fild08.gat,22,278
+yuno_fild08.gat,31,58,0 warp newjun10 1,1,yuno_fild07.gat,358,72
+yuno_fild07.gat,360,72,0 warp newjun10a 1,1,yuno_fild08.gat,33,58
+
+//= (By speculation only) ====================================
+yuno_fild07.gat,179,354,0 warp newjun11 1,1,yuno_fild03.gat,179,17
+yuno_fild03.gat,179,15,0 warp newjun11a 1,1,yuno_fild07.gat,179,352
+yuno_fild08.gat,74,376,0 warp newjun12 1,1,yuno_fild02.gat,70,25
+yuno_fild02.gat,70,23,0 warp newjun12a 1,1,yuno_fild08.gat,74,374
+yuno_fild08.gat,286,386,0 warp newjun13 1,1,yuno_fild02.gat,294,26
+yuno_fild02.gat,294,24,0 warp newjun13a 1,1,yuno_fild08.gat,286,384
+yuno_fild04.gat,42,369,0 warp newjun14 1,1,yuno_fild05.gat,59,30
+yuno_fild05.gat,59,28,0 warp newjun14a 1,1,yuno_fild04.gat,42,367
+
+
+//= Al de Baran <-> Yuno Connection ==========================
+aldebaran.gat,140,244,0 warp alde-yunfild 1,1,yuno_fild01.gat,208,19
+yuno_fild01.gat,208,17,0 warp yunfild-alde 1,1,aldebaran.gat,140,242
+
+//= Hugel Field
+//= Version 1
+yuno_fild05.gat,372,325,0 warp hu001 1,1,yuno_fild06.gat,42,319
+yuno_fild06.gat,40,319,0 warp hu001a 1,1,yuno_fild05.gat,370,325
+yuno_fild06.gat,217,27,0 warp hu002 1,1,yuno_fild03.gat,214,381
+yuno_fild03.gat,214,383,0 warp hu002a 1,1,yuno_fild06.gat,217,29
+yuno_fild06.gat,369,136,0 warp hu003 1,1,hu_fild04.gat,28,126
+hu_fild04.gat,26,126,0 warp hu003a 1,1,yuno_fild06.gat,367,136
+hu_fild04.gat,121,26,0 warp hu004 1,1,yuno_fild02.gat,118,374
+yuno_fild02.gat,118,376,0 warp hu004a 1,1,hu_fild04.gat,121,28
+yuno_fild06.gat,149,369,0 warp hu005 1,1,hu_fild01.gat,139,37
+hu_fild01.gat,139,35,0 warp hu005a 1,1,yuno_fild06.gat,151,369
+hu_fild04.gat,381,187,0 warp hu006 1,1,hu_fild05.gat,34,202
+hu_fild05.gat,32,202,0 warp hu006a 1,1,hu_fild04.gat,379,187
+hu_fild05.gat,91,42,0 warp hu007 1,1,hu_fild07.gat,80,369
+hu_fild07.gat,80,371,0 warp hu007a 1,1,hu_fild05.gat,91,44
+hu_fild07.gat,35,351,0 warp hu008 1,1,yuno_fild02.gat,384,338
+yuno_fild02.gat,384,340,0 warp hu008a 1,1,hu_fild07.gat,37,351
+hu_fild07.gat,56,36,0 warp hu009 1,1,yuno_fild09.gat,47,375
+yuno_fild09.gat,47,377,0 warp hu009a 1,1,hu_fild07.gat,56,38
+hu_fild07.gat,226,36,0 warp hu010 1,1,yuno_fild09.gat,220,372
+yuno_fild09.gat,220,374,0 warp hu010a 1,1,hu_fild07.gat,226,38
diff --git a/npc/warps/guild/guildcastles.txt b/npc/warps/guild/guildcastles.txt
index 0accb146e..72792932c 100644
--- a/npc/warps/guild/guildcastles.txt
+++ b/npc/warps/guild/guildcastles.txt
@@ -1,487 +1,487 @@
-//===== Athena Script ========================================
-//= Guild Castles Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 2.3
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Al de Baran, Payon, Prontera & Geffen
-//= Guild Castles
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//= fixed aldg504-1 warp [Lupus]
-//= 2.0 Added Novice Guilds warps, optimized aldg408r warp [Lupus]
-//= 2.1 Fixed some warps positions [Yor]
-//= 2.2 Changed all breaks to end as per the new script engine. [Skotlex]
-//= 2.3 Removed 2nd entrance to Novice Castle Geffen [Lupus]
-//============================================================
-
-
-//Al de Baran Guild Castles Map Connection
-aldebaran.gat,35,140,0 warp aldg001 1,1,alde_gld.gat,280,160
-alde_gld.gat,284,160,0 warp aldg002 1,1,aldebaran.gat,39,140
-
-//Al de Baran Guild Castles Map
-alde_gld.gat,48,79,0 warp aldg01 1,1,aldeg_cas01.gat,34,248
-aldeg_cas01.gat,34,252,0 warp aldg01-1 1,1,alde_gld.gat,48,83
-alde_gld.gat,95,253,0 warp aldg02 1,1,aldeg_cas02.gat,88,163
-aldeg_cas02.gat,88,159,0 warp aldg02-1 1,1,alde_gld.gat,95,249
-alde_gld.gat,142,81,0 warp aldg03 1,1,aldeg_cas03.gat,114,286
-aldeg_cas03.gat,114,290,0 warp aldg03-1 1,1,alde_gld.gat,142,85
-alde_gld.gat,243,242,0 warp aldg04 1,1,aldeg_cas04.gat,149,17
-aldeg_cas04.gat,145,17,0 warp aldg04-1 1,1,alde_gld.gat,239,242
-alde_gld.gat,259,90,0 warp aldg05 1,1,aldeg_cas05.gat,216,103
-aldeg_cas05.gat,216,107,0 warp aldg05-1 1,1,alde_gld.gat,264,90
-
-//Al de Baran Guild Castles
-aldeg_cas01.gat,50,222,0 warp aldg101 1,1,aldeg_cas01.gat,104,108
-aldeg_cas01.gat,104,112,0 warp aldg101-1 1,1,aldeg_cas01.gat,45,224
-aldeg_cas01.gat,66,191,0 warp aldg102 1,1,aldeg_cas01.gat,122,61
-aldeg_cas01.gat,126,61,0 warp aldg102-1 1,1,aldeg_cas01.gat,62,191
-aldeg_cas01.gat,54,27,0 warp aldg102-2 1,1,aldeg_cas01.gat,62,191
-aldeg_cas01.gat,26,188,0 warp aldg103 1,1,aldeg_cas01.gat,50,70
-aldeg_cas01.gat,46,70,0 warp aldg103-1 1,1,aldeg_cas01.gat,24,188
-aldeg_cas01.gat,70,112,0 warp aldg104 1,1,aldeg_cas01.gat,42,225
-aldeg_cas01.gat,39,222,0 warp aldg104-1 1,1,aldeg_cas01.gat,70,108
-aldeg_cas01.gat,89,23,0 warp aldg105 1,1,aldeg_cas01.gat,207,132
-aldeg_cas01.gat,207,128,0 warp aldg105-1 1,1,aldeg_cas01.gat,89,27
-aldeg_cas01.gat,206,188,0 warp aldg106 1,1,aldeg_cas01.gat,216,50
-aldeg_cas01.gat,216,54,0 warp aldg106-1 1,1,aldeg_cas01.gat,206,184
-aldeg_cas01.gat,232,186,0 warp aldg107 1,1,aldeg_cas01.gat,42,197
-aldeg_cas01.gat,46,197,0 warp aldg107-1 1,1,aldeg_cas01.gat,232,182
-aldeg_cas01.gat,171,175,0 warp aldg108 1,1,aldeg_cas01.gat,35,197
-aldeg_cas01.gat,31,197,0 warp aldg108-1 1,1,aldeg_cas01.gat,175,175
-aldeg_cas02.gat,84,208,0 warp aldg201 1,1,aldeg_cas02.gat,105,84
-aldeg_cas02.gat,105,88,0 warp aldg201-1 1,1,aldeg_cas02.gat,79,208
-aldeg_cas02.gat,45,39,0 warp aldg201-2 1,1,aldeg_cas02.gat,79,208
-aldeg_cas02.gat,50,185,0 warp aldg202 1,1,aldeg_cas02.gat,192,192
-aldeg_cas02.gat,192,196,0 warp aldg202-1 1,1,aldeg_cas02.gat,50,180
-aldeg_cas02.gat,33,174,0 warp aldg203 1,1,aldeg_cas02.gat,126,61
-aldeg_cas02.gat,130,61,0 warp aldg203-1 1,1,aldeg_cas02.gat,33,179
-aldeg_cas02.gat,22,193,0 warp aldg204 1,1,aldeg_cas02.gat,88,11
-aldeg_cas02.gat,88,8,0 warp aldg204-1 1,1,aldeg_cas02.gat,22,190
-aldeg_cas02.gat,121,88,0 warp aldg205 1,1,aldeg_cas02.gat,177,135
-aldeg_cas02.gat,177,131,0 warp aldg205-1 1,1,aldeg_cas02.gat,121,84
-aldeg_cas02.gat,206,196,0 warp aldg206 1,1,aldeg_cas02.gat,197,13
-aldeg_cas02.gat,197,9,0 warp aldg206-1 1,1,aldeg_cas02.gat,206,192
-aldeg_cas03.gat,92,217,0 warp aldg301 1,1,aldeg_cas03.gat,127,90
-aldeg_cas03.gat,130,90,0 warp aldg301-1 1,1,aldeg_cas03.gat,96,215
-aldeg_cas03.gat,87,247,0 warp aldg302 1,1,aldeg_cas03.gat,54,90
-aldeg_cas03.gat,51,90,0 warp aldg302-1 1,1,aldeg_cas03.gat,87,251
-aldeg_cas03.gat,93,124,0 warp aldg302-2 1,1,aldeg_cas03.gat,87,251
-aldeg_cas03.gat,44,222,0 warp aldg303 1,1,aldeg_cas03.gat,213,182
-aldeg_cas03.gat,214,186,0 warp aldg303-1 1,1,aldeg_cas03.gat,49,222
-aldeg_cas03.gat,91,57,0 warp aldg304 1,1,aldeg_cas03.gat,60,236
-aldeg_cas03.gat,60,241,0 warp aldg304-1 1,1,aldeg_cas03.gat,91,61
-aldeg_cas03.gat,79,130,0 warp aldg305 1,1,aldeg_cas03.gat,201,149
-aldeg_cas03.gat,201,145,0 warp aldg305-1 1,1,aldeg_cas03.gat,79,126
-aldeg_cas03.gat,199,190,0 warp aldg306 1,1,aldeg_cas03.gat,195,51
-aldeg_cas03.gat,195,54,0 warp aldg306-1 1,1,aldeg_cas03.gat,199,186
-aldeg_cas04.gat,197,40,0 warp aldg401 1,1,aldeg_cas04.gat,26,88
-aldeg_cas04.gat,22,88,0 warp aldg401-1 1,1,aldeg_cas04.gat,192,41
-aldeg_cas04.gat,175,54,0 warp aldg402 1,1,aldeg_cas04.gat,74,88
-aldeg_cas04.gat,50,132,0 warp aldg402-1 1,1,aldeg_cas04.gat,74,88
-aldeg_cas04.gat,78,88,0 warp aldg402-2 1,1,aldeg_cas04.gat,174,58
-aldeg_cas04.gat,185,87,0 warp aldg403 1,1,aldeg_cas04.gat,111,210
-aldeg_cas04.gat,108,210,0 warp aldg403-1 1,1,aldeg_cas04.gat,186,92
-aldeg_cas04.gat,171,100,0 warp aldg404 1,1,aldeg_cas04.gat,152,210
-aldeg_cas04.gat,156,210,0 warp aldg404-1 1,1,aldeg_cas04.gat,169,97
-aldeg_cas04.gat,196,85,0 warp aldg405 1,1,aldeg_cas04.gat,49,54
-aldeg_cas04.gat,49,52,0 warp aldg405-1 8,1,aldeg_cas04.gat,196,82
-aldeg_cas04.gat,21,123,0 warp aldg406 1,1,aldeg_cas04.gat,125,168
-aldeg_cas04.gat,121,168,0 warp aldg406-1 1,1,aldeg_cas04.gat,25,123
-aldeg_cas04.gat,132,209,0 warp aldg407 1,1,aldeg_cas04.gat,14,196
-aldeg_cas04.gat,17,196,0 warp aldg407-1 1,1,aldeg_cas04.gat,132,228
-aldeg_cas04.gat,132,231,4 script aldg408r 45,1,1,{
- set @l0,rand(5);
- if(@l0==1) goto w2;
- if(@l0==2) goto w3;
- if(@l0==3) goto w4;
- if(@l0==4) goto w5;
- warp "aldeg_cas04.gat",152,210; end;
-w2: warp "aldeg_cas04.gat",111,210; end;
-w3: warp "aldeg_cas04.gat",129,212; end;
-w4: warp "aldeg_cas04.gat",129,212; end;
-w5: warp "aldeg_cas04.gat",14,196; end;
-}
-aldeg_cas05.gat,194,71,0 warp aldg501 1,1,aldeg_cas05.gat,129,194
-aldeg_cas05.gat,125,194,0 warp aldg501-1 1,1,aldeg_cas05.gat,199,70
-aldeg_cas05.gat,164,86,0 warp aldg502 1,1,aldeg_cas05.gat,66,189
-aldeg_cas05.gat,70,189,0 warp aldg502-1 1,1,aldeg_cas05.gat,166,81
-aldeg_cas05.gat,150,67,0 warp aldg503 1,1,aldeg_cas05.gat,9,187
-aldeg_cas05.gat,5,187,0 warp aldg503-1 1,1,aldeg_cas05.gat,151,62
-aldeg_cas05.gat,165,232,0 warp aldg504 1,1,aldeg_cas05.gat,193,49
-aldeg_cas05.gat,188,49,0 warp aldg504-1 1,1,aldeg_cas05.gat,165,228 //fixed [Lupus]
-aldeg_cas05.gat,195,42,0 warp aldg505 1,1,aldeg_cas05.gat,19,227
-aldeg_cas05.gat,15,227,0 warp aldg505-1 1,1,aldeg_cas05.gat,195,46
-aldeg_cas05.gat,13,175,0 warp aldg506 1,1,aldeg_cas05.gat,162,194
-aldeg_cas05.gat,166,194,0 warp aldg506-1 1,1,aldeg_cas05.gat,13,179
-aldeg_cas05.gat,156,231,0 warp aldg507 1,1,aldeg_cas05.gat,18,88
-aldeg_cas05.gat,14,88,0 warp aldg507-1 1,1,aldeg_cas05.gat,156,227
-
-// Geffen Castles Map
-gef_fild13.gat,112,269,0 warp gefg05 1,1,gefg_cas03.gat,100,280
-gef_fild13.gat,139,240,0 warp gefg06 1,1,gefg_cas03.gat,125,250
-gef_fild13.gat,150,54,0 warp gefg01 1,1,gefg_cas01.gat,34,140
-gef_fild13.gat,196,281,0 warp gefg08 1,1,gefg_cas04.gat,24,149
-gef_fild13.gat,210,75,0 warp gefg02 1,1,gefg_cas01.gat,95,178
-gef_fild13.gat,256,57,0 warp gefg09 1,1,gefg_cas05.gat,11,134
-gef_fild13.gat,305,83,0 warp gefg09-1 1,1,gefg_cas05.gat,99,200
-gef_fild13.gat,308,244,0 warp gefg03 1,1,gefg_cas02.gat,70,143
-gef_fild13.gat,77,284,0 warp gefg04 1,1,gefg_cas03.gat,60,286
-gef_fild13.gat,83,185,0 warp gefg07 1,1,gefg_cas03.gat,89,159
-
-//Geffen Guild Castles
-gefg_cas01.gat,170,14,0 warp gefg106-1 1,1,gefg_cas01.gat,50,84
-gefg_cas01.gat,170,34,0 warp gefg105-1 1,1,gefg_cas01.gat,30,167
-gefg_cas01.gat,181,52,0 warp gefg107 1,1,gefg_cas01.gat,198,160
-gefg_cas01.gat,202,160,0 warp gefg107-1 1,1,gefg_cas01.gat,185,52
-gefg_cas01.gat,209,34,0 warp gefg103-1 1,1,gefg_cas01.gat,56,170
-gefg_cas01.gat,31,185,0 warp gefg104 1,1,gefg_cas01.gat,33,47
-gefg_cas01.gat,33,51,0 warp gefg104-1 1,1,gefg_cas01.gat,35,185
-gefg_cas01.gat,34,136,0 warp gefg01-1 1,1,gef_fild13.gat,150,50
-gefg_cas01.gat,34,167,0 warp gefg105 1,1,gefg_cas01.gat,174,34
-gefg_cas01.gat,39,196,0 warp gefg101 1,1,gefg_cas01.gat,62,13
-gefg_cas01.gat,54,84,0 warp gefg106 1,1,gefg_cas01.gat,174,14
-gefg_cas01.gat,58,185,0 warp gefg102 1,1,gefg_cas01.gat,90,47
-gefg_cas01.gat,59,170,0 warp gefg103 1,1,gefg_cas01.gat,205,34
-gefg_cas01.gat,62,9,0 warp gefg101-1 1,1,gefg_cas01.gat,39,192
-gefg_cas01.gat,90,51,0 warp gefg102-1 1,1,gefg_cas01.gat,54,185
-gefg_cas01.gat,99,178,0 warp gefg02-1 1,1,gef_fild13.gat,214,75
-gefg_cas02.gat,148,18,0 warp gefg205-1 1,1,gefg_cas02.gat,35,150
-gefg_cas02.gat,150,36,0 warp gefg208 1,1,gefg_cas02.gat,152,186
-gefg_cas02.gat,152,190,0 warp gefg208-1 1,1,gefg_cas02.gat,150,41
-gefg_cas02.gat,174,11,0 warp gefg207-1 1,1,gefg_cas02.gat,21,13
-gefg_cas02.gat,184,36,0 warp gefg204-1 1,1,gefg_cas02.gat,48,155
-gefg_cas02.gat,185,18,0 warp gefg206-1 1,1,gefg_cas02.gat,53,136
-gefg_cas02.gat,22,160,0 warp gefg203 1,1,gefg_cas02.gat,34,17
-gefg_cas02.gat,25,13,0 warp gefg207 1,1,gefg_cas02.gat,170,11
-gefg_cas02.gat,34,13,0 warp gefg203-1 1,1,gefg_cas02.gat,22,156
-gefg_cas02.gat,34,152,0 warp gefg205 1,1,gefg_cas02.gat,153,18
-gefg_cas02.gat,34,68,0 warp gefg202-1 1,1,gefg_cas02.gat,50,175
-gefg_cas02.gat,35,173,0 warp gefg201 1,1,gefg_cas02.gat,76,42
-gefg_cas02.gat,46,175,0 warp gefg202 1,1,gefg_cas02.gat,34,64
-gefg_cas02.gat,48,159,0 warp gefg204 1,1,gefg_cas02.gat,184,41
-gefg_cas02.gat,57,136,0 warp gefg206 1,1,gefg_cas02.gat,180,18
-gefg_cas02.gat,70,147,0 warp gefg03-1 1,1,gef_fild13.gat,308,240
-gefg_cas02.gat,80,42,0 warp gefg201-1 1,1,gefg_cas02.gat,39,173
-gefg_cas03.gat,103,283,0 warp gefg05-1 1,1,gef_fild13.gat,117,273
-gefg_cas03.gat,106,217,0 warp gefg307 1,1,gefg_cas03.gat,131,15
-gefg_cas03.gat,115,210,0 warp gefg308 1,1,gefg_cas03.gat,92,215
-gefg_cas03.gat,130,250,0 warp gefg06-1 1,1,gef_fild13.gat,143,240
-gefg_cas03.gat,135,15,0 warp gefg307-1 1,1,gefg_cas03.gat,110,217
-gefg_cas03.gat,135,92,0 warp gefg302-1 1,1,gefg_cas03.gat,34,282
-gefg_cas03.gat,152,92,0 warp gefg304-1 1,1,gefg_cas03.gat,59,255
-gefg_cas03.gat,154,16,0 warp gefg314 1,1,gefg_cas03.gat,252,11
-gefg_cas03.gat,17,206,0 warp gefg306-1 1,1,gefg_cas03.gat,29,219
-gefg_cas03.gat,212,46,0 warp gefg315 1,1,gefg_cas03.gat,225,158
-gefg_cas03.gat,225,154,0 warp gefg315-1 1,1,gefg_cas03.gat,212,42
-gefg_cas03.gat,237,74,0 warp gefg312-1 1,1,gefg_cas03.gat,62,213
-gefg_cas03.gat,256,11,0 warp gefg314-1 1,1,gefg_cas03.gat,159,16
-gefg_cas03.gat,266,47,0 warp gefg309-1 1,1,gefg_cas03.gat,45,175
-gefg_cas03.gat,27,215,0 warp gefg306-2 1,1,gefg_cas03.gat,17,202
-gefg_cas03.gat,34,286,0 warp gefg302 1,1,gefg_cas03.gat,131,92
-gefg_cas03.gat,38,243,0 warp gefg306 1,1,gefg_cas03.gat,29,219
-gefg_cas03.gat,38,259,0 warp gefg303-1 1,1,gefg_cas03.gat,43,271
-gefg_cas03.gat,42,175,0 warp gefg309 1,1,gefg_cas03.gat,266,43
-gefg_cas03.gat,43,191,0 warp gefg310-1 1,1,gefg_cas03.gat,70,185
-gefg_cas03.gat,47,271,0 warp gefg303 1,1,gefg_cas03.gat,38,255
-gefg_cas03.gat,50,248,0 warp gefg305 1,1,gefg_cas03.gat,54,229
-gefg_cas03.gat,58,232,0 warp gefg305-1 1,1,gefg_cas03.gat,62,213
-gefg_cas03.gat,63,255,0 warp gefg304 1,1,gefg_cas03.gat,156,92
-gefg_cas03.gat,65,215,0 warp gefg312 1,1,gefg_cas03.gat,233,74
-gefg_cas03.gat,66,223,0 warp gefg301 1,1,gefg_cas03.gat,96,53
-gefg_cas03.gat,68,290,0 warp gefg04-1 1,1,gef_fild13.gat,74,287
-gefg_cas03.gat,70,182,0 warp gefg310 1,1,gefg_cas03.gat,39,191
-gefg_cas03.gat,79,244,0 warp gefg313-1 1,1,gefg_cas03.gat,91,250
-gefg_cas03.gat,88,248,0 warp gefg311-1 1,1,gefg_cas03.gat,76,242
-gefg_cas03.gat,90,218,0 warp gefg308-1 1,1,gefg_cas03.gat,111,210
-gefg_cas03.gat,92,53,0 warp gefg301-1 1,1,gefg_cas03.gat,62,223
-gefg_cas03.gat,93,159,0 warp gefg07-1 1,1,gef_fild13.gat,83,181
-gefg_cas03.gat,93,209,0 warp gefg311 1,1,gefg_cas03.gat,92,250
-gefg_cas03.gat,95,251,0 warp gefg313 1,1,gefg_cas03.gat,91,209
-gefg_cas04.gat,140,168,0 warp gefg407-1 1,1,gefg_cas04.gat,178,61
-gefg_cas04.gat,142,33,0 warp gefg406-1 1,1,gefg_cas04.gat,52,21
-gefg_cas04.gat,142,55,0 warp gefg404-1 1,1,gefg_cas04.gat,32,180
-gefg_cas04.gat,174,36,0 warp gefg403-1 1,1,gefg_cas04.gat,53,192
-gefg_cas04.gat,178,57,0 warp gefg407 1,1,gefg_cas04.gat,143,166
-gefg_cas04.gat,18,82,0 warp gefg401-1 1,1,gefg_cas04.gat,34,215
-gefg_cas04.gat,18,9,0 warp gefg402-1 1,1,gefg_cas04.gat,57,220
-gefg_cas04.gat,24,145,0 warp gefg08-1 1,1,gef_fild13.gat,193,278
-gefg_cas04.gat,27,180,0 warp gefg404 1,1,gefg_cas04.gat,142,59
-gefg_cas04.gat,34,211,0 warp gefg401 1,1,gefg_cas04.gat,18,78
-gefg_cas04.gat,42,81,0 warp gefg405 1,1,gefg_cas04.gat,42,13
-gefg_cas04.gat,42,9,0 warp gefg405-1 1,1,gefg_cas04.gat,42,77
-gefg_cas04.gat,52,25,0 warp gefg406 1,1,gefg_cas04.gat,142,37
-gefg_cas04.gat,53,196,0 warp gefg403 1,1,gefg_cas04.gat,170,36
-gefg_cas04.gat,57,224,0 warp gefg402 1,1,gefg_cas04.gat,18,13
-gefg_cas05.gat,149,44,0 warp gefg506-1 1,1,gefg_cas05.gat,37,20
-gefg_cas05.gat,178,72,0 warp gefg501-1 1,1,gefg_cas05.gat,46,165
-gefg_cas05.gat,190,20,0 warp gefg508 1,1,gefg_cas05.gat,194,151
-gefg_cas05.gat,194,147,0 warp gefg508-1 1,1,gefg_cas05.gat,190,16
-gefg_cas05.gat,206,44,0 warp gefg507-1 1,1,gefg_cas05.gat,93,20
-gefg_cas05.gat,37,16,0 warp gefg506 1,1,gefg_cas05.gat,153,44
-gefg_cas05.gat,43,62,0 warp gefg505-1 1,1,gefg_cas05.gat,78,138
-gefg_cas05.gat,44,143,0 warp gefg503 1,1,gefg_cas05.gat,70,155
-gefg_cas05.gat,50,165,0 warp gefg501 1,1,gefg_cas05.gat,178,68
-gefg_cas05.gat,66,76,0 warp gefg504-1 1,1,gefg_cas05.gat,80,155
-gefg_cas05.gat,68,150,0 warp gefg503-1 1,1,gefg_cas05.gat,44,147
-gefg_cas05.gat,7,134,0 warp gefg10 1,1,gef_fild13.gat,252,57
-gefg_cas05.gat,74,138,0 warp gefg505 1,1,gefg_cas05.gat,47,62
-gefg_cas05.gat,83,152,0 warp gefg504 1,1,gefg_cas05.gat,66,72
-gefg_cas05.gat,87,165,0 warp gefg502 1,1,gefg_cas05.gat,84,62
-gefg_cas05.gat,88,62,0 warp gefg502-1 1,1,gefg_cas05.gat,83,165
-gefg_cas05.gat,93,16,0 warp gefg507 1,1,gefg_cas05.gat,202,44
-gefg_cas05.gat,99,204,0 warp gefg10-1 1,1,gef_fild13.gat,305,87
-
-//Payon Guild Castles Map Connection
-// Temp Disabled till i replace them from the ones in payon.txt!!
-//payon.gat,17,151,0 warp payg001 1,1,pay_gld.gat,370,149
-//pay_gld.gat,374,149,0 warp payg001-1 1,1,payon.gat,21,151
-moc_fild02.gat,378,272,0 warp payg002 1,1,pay_gld.gat,20,276
-pay_gld.gat,16,276,0 warp payg002-1 1,1,moc_fild02.gat,374,272
-
-//Payon Guild Castles Map
-pay_gld.gat,121,238,0 warp payg01 1,1,payg_cas01.gat,214,48
-payg_cas01.gat,214,44,0 warp payg01-1 1,1,pay_gld.gat,121,233
-pay_gld.gat,291,116,0 warp payg02 1,1,payg_cas02.gat,272,57
-payg_cas02.gat,276,61,0 warp payg02-1 1,1,pay_gld.gat,295,116
-pay_gld.gat,321,293,0 warp payg03 1,1,payg_cas03.gat,226,26
-payg_cas03.gat,226,22,0 warp payg03-1 1,1,pay_gld.gat,317,293
-pay_gld.gat,140,156,0 warp payg04 1,1,payg_cas04.gat,252,271
-payg_cas04.gat,252,275,0 warp payg04-1 1,1,pay_gld.gat,140,160
-pay_gld.gat,204,269,0 warp payg05 3,1,payg_cas05.gat,62,225
-payg_cas05.gat,62,222,0 warp payg05-1 5,1,pay_gld.gat,204,266
-
-//Payon Guild Castles
-payg_cas01.gat,201,125,0 warp payg101 1,1,payg_cas01.gat,102,19
-payg_cas01.gat,102,16,0 warp payg101-1 3,1,payg_cas01.gat,201,122
-payg_cas01.gat,222,130,0 warp payg102 1,1,payg_cas01.gat,130,43
-payg_cas01.gat,134,43,0 warp payg102-1 1,1,payg_cas01.gat,226,130
-payg_cas01.gat,218,112,0 warp payg103 1,1,payg_cas01.gat,230,94
-payg_cas01.gat,230,98,0 warp payg103-1 1,1,payg_cas01.gat,222,112
-payg_cas01.gat,213,76,0 warp payg104 1,1,payg_cas01.gat,201,118
-payg_cas01.gat,201,114,0 warp payg104-1 1,1,payg_cas01.gat,213,72
-payg_cas01.gat,84,15,0 warp payg105 1,1,payg_cas01.gat,15,115
-payg_cas01.gat,11,115,0 warp payg105-1 1,1,payg_cas01.gat,81,15
-payg_cas01.gat,53,111,0 warp payg106 1,1,payg_cas01.gat,115,147
-payg_cas01.gat,115,151,0 warp payg106-1 1,1,payg_cas01.gat,53,115
-payg_cas02.gat,232,72,0 warp payg201 1,1,payg_cas02.gat,28,289
-payg_cas02.gat,28,293,0 warp payg201-1 1,1,payg_cas02.gat,229,72
-payg_cas02.gat,236,59,0 warp payg201-2 1,1,payg_cas02.gat,229,72
-payg_cas02.gat,222,26,0 warp payg202 1,1,payg_cas02.gat,80,240
-payg_cas02.gat,84,240,0 warp payg202-1 1,1,payg_cas02.gat,224,30
-payg_cas02.gat,215,31,0 warp payg203 1,1,payg_cas02.gat,65,288
-payg_cas02.gat,65,292,0 warp payg203-1 1,1,payg_cas02.gat,215,35
-payg_cas02.gat,47,223,0 warp payg204 1,1,payg_cas02.gat,280,287
-payg_cas02.gat,280,291,0 warp payg204-1 1,1,payg_cas02.gat,47,227
-payg_cas02.gat,254,240,0 warp payg205 3,1,payg_cas02.gat,13,40
-payg_cas02.gat,13,43,0 warp payg205-1 7,1,payg_cas02.gat,254,243
-payg_cas03.gat,255,76,0 warp payg301 1,1,payg_cas03.gat,24,19
-payg_cas03.gat,20,19,0 warp payg301-1 1,1,payg_cas03.gat,255,72
-payg_cas03.gat,269,79,0 warp payg302 1,1,payg_cas03.gat,53,19
-payg_cas03.gat,57,19,0 warp payg302-1 1,1,payg_cas03.gat,269,75
-payg_cas03.gat,255,64,0 warp payg303 1,1,payg_cas03.gat,245,37
-payg_cas03.gat,245,41,0 warp payg303-1 1,1,payg_cas03.gat,255,68
-payg_cas03.gat,262,71,0 warp payg304 1,1,payg_cas03.gat,39,9
-payg_cas03.gat,39,5,0 warp payg304-1 1,1,payg_cas03.gat,263,66
-payg_cas03.gat,271,68,0 warp payg305 0,1,payg_cas03.gat,261,37
-payg_cas03.gat,261,34,0 warp payg305-1 1,1,payg_cas03.gat,269,68
-payg_cas03.gat,39,84,0 warp payg306 1,1,payg_cas03.gat,29,249
-payg_cas03.gat,29,245,0 warp payg306-1 1,1,payg_cas03.gat,39,80
-payg_cas03.gat,29,269,0 warp payg307 1,1,payg_cas03.gat,269,287
-payg_cas03.gat,269,290,0 warp payg307-1 1,1,payg_cas03.gat,29,273
-payg_cas04.gat,259,212,0 warp payg401 1,1,payg_cas04.gat,72,240
-payg_cas04.gat,75,240,0 warp payg401-1 1,5,payg_cas04.gat,256,212
-payg_cas04.gat,232,189,0 warp payg402 1,1,payg_cas04.gat,74,261
-payg_cas04.gat,78,261,0 warp payg402-1 1,1,payg_cas04.gat,236,189
-payg_cas04.gat,229,208,0 warp payg403 1,1,payg_cas04.gat,70,282
-payg_cas04.gat,74,282,0 warp payg403-1 1,1,payg_cas04.gat,225,208
-payg_cas04.gat,7,261,0 warp payg404 1,1,payg_cas04.gat,55,30
-payg_cas04.gat,59,30,0 warp payg404-1 1,1,payg_cas04.gat,11,261
-payg_cas04.gat,28,31,0 warp payg405 1,1,payg_cas04.gat,251,42
-payg_cas04.gat,254,45,0 warp payg405-1 1,1,payg_cas04.gat,24,31
-payg_cas05.gat,23,283,0 warp payg501 1,1,payg_cas05.gat,237,282
-payg_cas05.gat,237,286,0 warp payg501-1 1,1,payg_cas05.gat,19,282
-payg_cas05.gat,56,255,0 warp payg502 1,1,payg_cas05.gat,223,256
-payg_cas05.gat,219,256,0 warp payg502-1 1,1,payg_cas05.gat,52,255
-payg_cas05.gat,40,263,0 warp payg503 3,1,payg_cas05.gat,237,229
-payg_cas05.gat,237,226,0 warp payg503-1 5,1,payg_cas05.gat,40,260
-payg_cas05.gat,283,256,0 warp payg504 1,1,payg_cas05.gat,286,43
-payg_cas05.gat,290,43,0 warp payg504-1 1,1,payg_cas05.gat,287,256
-payg_cas05.gat,242,41,0 warp payg505 1,1,payg_cas05.gat,18,18
-payg_cas05.gat,14,14,0 warp payg505-1 1,1,payg_cas05.gat,246,41
-
-//Prontera Castles Map
-prt_gld.gat,107,240,0 warp prtg04-1 1,1,prtg_cas04.gat,86,13
-prt_gld.gat,129,65,0 warp prtg01 1,1,prtg_cas01.gat,99,32
-prt_gld.gat,153,141,0 warp prtg03-1 1,1,prtg_cas03.gat,168,12
-prt_gld.gat,159,25,0 warp prtg002 6,2,prt_castle.gat,102,178
-prt_gld.gat,159,298,0 warp prtg001 1,1,prt_fild01.gat,199,30
-prt_gld.gat,212,240,0 warp prtg05-1 1,1,prtg_cas05.gat,17,235
-prt_gld.gat,240,124,0 warp prtg02-1 1,1,prtg_cas02.gat,43,229
-
-//Prontera Guild Castles
-prtg_cas01.gat,103,32,0 warp prtg01-1 1,1,prt_gld.gat,134,65
-prtg_cas01.gat,109,163,0 warp prtg107 1,1,prtg_cas01.gat,202,183
-prtg_cas01.gat,147,120,0 warp prtg106 1,1,prtg_cas01.gat,75,187
-prtg_cas01.gat,196,119,0 warp prtg103-1 1,1,prtg_cas01.gat,40,54
-prtg_cas01.gat,196,65,0 warp prtg104-1 1,1,prtg_cas01.gat,75,54
-prtg_cas01.gat,206,183,0 warp prtg107-1 1,1,prtg_cas01.gat,113,163
-prtg_cas01.gat,206,92,0 warp prtg105-1 1,1,prtg_cas01.gat,55,70
-prtg_cas01.gat,37,47,0 warp prtg102-1 1,1,prtg_cas01.gat,45,34
-prtg_cas01.gat,37,54,0 warp prtg103 1,1,prtg_cas01.gat,192,119
-prtg_cas01.gat,41,34,0 warp prtg102 1,1,prtg_cas01.gat,40,47
-prtg_cas01.gat,51,70,0 warp prtg105 1,1,prtg_cas01.gat,202,92
-prtg_cas01.gat,57,19,0 warp prtg101 1,1,prtg_cas01.gat,80,49
-prtg_cas01.gat,62,34,0 warp prtg108 1,1,prtg_cas01.gat,192,119
-prtg_cas01.gat,71,54,0 warp prtg104 1,1,prtg_cas01.gat,192,65
-prtg_cas01.gat,75,183,0 warp prtg106-1 1,1,prtg_cas01.gat,147,116
-prtg_cas01.gat,84,19,0 warp prtg109 1,1,prtg_cas01.gat,192,65
-prtg_cas01.gat,84,49,0 warp prtg101-1 1,1,prtg_cas01.gat,61,19
-prtg_cas02.gat,157,135,0 warp prtg206-1 1,1,prtg_cas02.gat,184,40
-prtg_cas02.gat,161,41,0 warp prtg202-1 1,1,prtg_cas02.gat,57,202
-prtg_cas02.gat,184,44,0 warp prtg206 1,1,prtg_cas02.gat,157,140
-prtg_cas02.gat,203,21,0 warp prtg205-1 1,1,prtg_cas02.gat,45,25
-prtg_cas02.gat,210,41,0 warp prtg201-1 1,1,prtg_cas02.gat,84,215
-prtg_cas02.gat,35,183,0 warp prtg204 1,1,prtg_cas02.gat,71,82
-prtg_cas02.gat,43,233,0 warp prtg02 1,1,prt_gld.gat,240,128
-prtg_cas02.gat,45,21,0 warp prtg205 1,1,prtg_cas02.gat,203,25
-prtg_cas02.gat,53,202,0 warp prtg202 1,1,prtg_cas02.gat,165,41
-prtg_cas02.gat,64,164,0 warp prtg203 1,1,prtg_cas02.gat,98,25
-prtg_cas02.gat,71,86,0 warp prtg204-1 1,1,prtg_cas02.gat,35,187
-prtg_cas02.gat,88,215,0 warp prtg201 1,1,prtg_cas02.gat,206,41
-prtg_cas02.gat,98,21,0 warp prtg203-1 1,1,prtg_cas02.gat,64,168
-prtg_cas03.gat,164,173,0 warp prtg305-1 1,1,prtg_cas03.gat,45,117
-prtg_cas03.gat,165,59,0 warp prtg304 1,1,prtg_cas03.gat,45,47
-prtg_cas03.gat,168,8,0 warp prtg03 1,1,prt_gld.gat,153,137
-prtg_cas03.gat,169,235,0 warp prtg306 1,1,prtg_cas03.gat,11,200
-prtg_cas03.gat,172,44,0 warp prtg303 1,1,prtg_cas03.gat,10,78
-prtg_cas03.gat,178,85,0 warp prtg301 1,1,prtg_cas03.gat,82,73
-prtg_cas03.gat,191,55,0 warp prtg302 1,1,prtg_cas03.gat,190,233
-prtg_cas03.gat,194,233,0 warp prtg302-1 1,1,prtg_cas03.gat,191,59
-prtg_cas03.gat,45,120,0 warp prtg305 1,1,prtg_cas03.gat,164,177
-prtg_cas03.gat,45,43,0 warp prtg304-1 1,1,prtg_cas03.gat,165,54
-prtg_cas03.gat,6,78,0 warp prtg303-1 1,1,prtg_cas03.gat,176,44
-prtg_cas03.gat,7,200,0 warp prtg306-1 1,1,prtg_cas03.gat,169,231
-prtg_cas03.gat,86,73,0 warp prtg301-1 1,1,prtg_cas03.gat,178,81
-prtg_cas04.gat,10,229,0 warp prtg401-1 1,1,prtg_cas04.gat,48,44
-prtg_cas04.gat,238,257,0 warp prtg406-1 1,1,prtg_cas04.gat,34,286
-prtg_cas04.gat,247,258,0 warp prtg407 1,1,prtg_cas04.gat,255,14
-prtg_cas04.gat,251,14,0 warp prtg407-1 1,1,prtg_cas04.gat,247,254
-prtg_cas04.gat,32,28,0 warp prtg403 1,1,prtg_cas04.gat,11,254
-prtg_cas04.gat,34,225,0 warp prtg402-1 1,1,prtg_cas04.gat,63,26
-prtg_cas04.gat,34,290,0 warp prtg406 1,1,prtg_cas04.gat,238,261
-prtg_cas04.gat,42,13,0 warp prtg404 1,1,prtg_cas04.gat,56,254
-prtg_cas04.gat,48,48,0 warp prtg401 1,1,prtg_cas04.gat,10,233
-prtg_cas04.gat,54,25,0 warp prtg405 1,1,prtg_cas04.gat,56,233
-prtg_cas04.gat,56,229,0 warp prtg405-1 1,1,prtg_cas04.gat,54,29
-prtg_cas04.gat,60,254,0 warp prtg404-1 1,1,prtg_cas04.gat,42,17
-prtg_cas04.gat,63,30,0 warp prtg402 1,1,prtg_cas04.gat,34,229
-prtg_cas04.gat,7,254,0 warp prtg403-1 1,1,prtg_cas04.gat,32,32
-prtg_cas04.gat,86,9,0 warp prtg04 1,1,prt_gld.gat,111,240
-prtg_cas05.gat,17,231,0 warp prtg05 1,1,prt_gld.gat,208,240
-prtg_cas05.gat,195,13,0 warp prtg504-1 1,1,prtg_cas05.gat,55,248
-prtg_cas05.gat,228,96,0 warp prtg505 1,1,prtg_cas05.gat,26,7
-prtg_cas05.gat,244,3,0 warp prtg501-1 1,1,prtg_cas05.gat,35,247
-prtg_cas05.gat,253,294,0 warp prtg506-1 1,1,prtg_cas05.gat,58,11
-prtg_cas05.gat,26,3,0 warp prtg505-1 1,1,prtg_cas05.gat,228,92
-prtg_cas05.gat,260,96,0 warp prtg503-1 1,1,prtg_cas05.gat,66,229
-prtg_cas05.gat,292,13,0 warp prtg502-1 1,1,prtg_cas05.gat,76,246
-prtg_cas05.gat,38,250,0 warp prtg501 1,1,prtg_cas05.gat,244,7
-prtg_cas05.gat,53,246,0 warp prtg504 1,1,prtg_cas05.gat,199,13
-prtg_cas05.gat,58,7,0 warp prtg506 1,1,prtg_cas05.gat,253,290
-prtg_cas05.gat,66,225,0 warp prtg503 1,1,prtg_cas05.gat,260,92
-prtg_cas05.gat,76,242,0 warp prtg502 1,1,prtg_cas05.gat,288,13
-
-//================== 4 Novices Guild Castles =============================
-//Novices Guild: Al de Baran Guild Castles Map
-n_castle.gat,184,16,0 warp naldg01 1,1,nguild_alde.gat,34,248
-nguild_alde.gat,34,252,0 warp naldg01-1 1,1,n_castle.gat,187,16
-
-nguild_alde.gat,50,222,0 warp naldg101 1,1,nguild_alde.gat,104,108
-nguild_alde.gat,104,112,0 warp naldg101-1 1,1,nguild_alde.gat,45,224
-nguild_alde.gat,66,191,0 warp naldg102 1,1,nguild_alde.gat,122,61
-nguild_alde.gat,126,61,0 warp naldg102-1 1,1,nguild_alde.gat,62,191
-nguild_alde.gat,54,27,0 warp naldg102-2 1,1,nguild_alde.gat,62,191
-nguild_alde.gat,26,188,0 warp naldg103 1,1,nguild_alde.gat,50,70
-nguild_alde.gat,46,70,0 warp naldg103-1 1,1,nguild_alde.gat,24,188
-nguild_alde.gat,70,112,0 warp naldg104 1,1,nguild_alde.gat,42,225
-nguild_alde.gat,39,222,0 warp naldg104-1 1,1,nguild_alde.gat,70,108
-nguild_alde.gat,89,23,0 warp naldg105 1,1,nguild_alde.gat,207,132
-nguild_alde.gat,207,128,0 warp naldg105-1 1,1,nguild_alde.gat,89,27
-nguild_alde.gat,206,188,0 warp naldg106 1,1,nguild_alde.gat,216,50
-nguild_alde.gat,216,54,0 warp naldg106-1 1,1,nguild_alde.gat,206,184
-nguild_alde.gat,232,186,0 warp naldg107 1,1,nguild_alde.gat,42,197
-nguild_alde.gat,46,197,0 warp naldg107-1 1,1,nguild_alde.gat,232,182
-nguild_alde.gat,171,175,0 warp naldg108 1,1,nguild_alde.gat,35,197
-nguild_alde.gat,31,197,0 warp naldg108-1 1,1,nguild_alde.gat,175,175
-
-//Novices Guild: Geffen Castles Map
-n_castle.gat,183,183,0 warp ngefg01 1,1,nguild_gef.gat,34,140
-nguild_gef.gat,34,136,0 warp ngefg01-1 1,1,n_castle.gat,183,180
-nguild_gef.gat,99,178,0 warp ngefg02-1 1,1,n_castle.gat,183,180
-
-nguild_gef.gat,170,14,0 warp ngefg106-1 1,1,nguild_gef.gat,50,84
-nguild_gef.gat,170,34,0 warp ngefg105-1 1,1,nguild_gef.gat,30,167
-nguild_gef.gat,181,52,0 warp ngefg107 1,1,nguild_gef.gat,198,160
-nguild_gef.gat,202,160,0 warp ngefg107-1 1,1,nguild_gef.gat,185,52
-nguild_gef.gat,209,34,0 warp ngefg103-1 1,1,nguild_gef.gat,56,170
-nguild_gef.gat,31,185,0 warp ngefg104 1,1,nguild_gef.gat,33,47
-nguild_gef.gat,33,51,0 warp ngefg104-1 1,1,nguild_gef.gat,35,185
-nguild_gef.gat,34,167,0 warp ngefg105 1,1,nguild_gef.gat,174,34
-nguild_gef.gat,39,196,0 warp ngefg101 1,1,nguild_gef.gat,62,13
-nguild_gef.gat,54,84,0 warp ngefg106 1,1,nguild_gef.gat,174,14
-nguild_gef.gat,58,185,0 warp ngefg102 1,1,nguild_gef.gat,90,47
-nguild_gef.gat,59,170,0 warp ngefg103 1,1,nguild_gef.gat,205,34
-nguild_gef.gat,62,9,0 warp ngefg101-1 1,1,nguild_gef.gat,39,192
-nguild_gef.gat,90,51,0 warp ngefg102-1 1,1,nguild_gef.gat,54,185
-
-//Novices Guild: Payon Guild Castles Map
-n_castle.gat,18,181,0 warp npayg01 1,1,nguild_pay.gat,214,48
-nguild_pay.gat,214,44,0 warp npayg01-1 1,1,n_castle.gat,18,178
-
-nguild_pay.gat,201,125,0 warp npayg101 1,1,nguild_pay.gat,102,19
-nguild_pay.gat,102,16,0 warp npayg101-1 3,1,nguild_pay.gat,201,122
-nguild_pay.gat,222,130,0 warp npayg102 1,1,nguild_pay.gat,130,43
-nguild_pay.gat,134,43,0 warp npayg102-1 1,1,nguild_pay.gat,226,130
-nguild_pay.gat,218,112,0 warp npayg103 1,1,nguild_pay.gat,230,94
-nguild_pay.gat,230,98,0 warp npayg103-1 1,1,nguild_pay.gat,222,112
-nguild_pay.gat,213,76,0 warp npayg104 1,1,nguild_pay.gat,201,118
-nguild_pay.gat,201,114,0 warp npayg104-1 1,1,nguild_pay.gat,213,72
-nguild_pay.gat,84,15,0 warp npayg105 1,1,nguild_pay.gat,15,115
-nguild_pay.gat,11,115,0 warp npayg105-1 1,1,nguild_pay.gat,81,15
-nguild_pay.gat,53,111,0 warp npayg106 1,1,nguild_pay.gat,115,147
-nguild_pay.gat,115,151,0 warp npayg106-1 1,1,nguild_pay.gat,53,115
-
-//Novices Guild: Prontera Castles Map
-n_castle.gat,16,14,0 warp nprtg01 1,1,nguild_prt.gat,99,32
-nguild_prt.gat,103,32,0 warp nprtg01-1 1,1,n_castle.gat,19,14
-
-nguild_prt.gat,109,163,0 warp nprtg107 1,1,nguild_prt.gat,202,183
-nguild_prt.gat,147,120,0 warp nprtg106 1,1,nguild_prt.gat,75,187
-nguild_prt.gat,196,119,0 warp nprtg103-1 1,1,nguild_prt.gat,40,54
-nguild_prt.gat,196,65,0 warp nprtg104-1 1,1,nguild_prt.gat,75,54
-nguild_prt.gat,206,183,0 warp nprtg107-1 1,1,nguild_prt.gat,113,163
-nguild_prt.gat,206,92,0 warp nprtg105-1 1,1,nguild_prt.gat,55,70
-nguild_prt.gat,37,47,0 warp nprtg102-1 1,1,nguild_prt.gat,45,34
-nguild_prt.gat,37,54,0 warp nprtg103 1,1,nguild_prt.gat,192,119
-nguild_prt.gat,41,34,0 warp nprtg102 1,1,nguild_prt.gat,40,47
-nguild_prt.gat,51,70,0 warp nprtg105 1,1,nguild_prt.gat,202,92
-nguild_prt.gat,57,19,0 warp nprtg101 1,1,nguild_prt.gat,80,49
-nguild_prt.gat,62,34,0 warp nprtg108 1,1,nguild_prt.gat,192,119
-nguild_prt.gat,71,54,0 warp nprtg104 1,1,nguild_prt.gat,192,65
-nguild_prt.gat,75,183,0 warp nprtg106-1 1,1,nguild_prt.gat,147,116
-nguild_prt.gat,84,19,0 warp nprtg109 1,1,nguild_prt.gat,192,65
-nguild_prt.gat,84,49,0 warp nprtg101-1 1,1,nguild_prt.gat,61,19
-
-//Guild Dungeons
-gld_dun01.gat,119,14,0 warp gldd_001 1,1,pay_gld.gat,53,141
-gld_dun02.gat,180,112,0 warp gldd_002 1,1,alde_gld.gat,242,121
-gld_dun02.gat,20,160,0 warp gldd_003 1,1,alde_gld.gat,229,185
-gld_dun03.gat,42,30,0 warp gldd_004 1,1,prt_gld.gat,63,66
-gld_dun03.gat,238,274,0 warp gldd_005 1,1,prt_gld.gat,252,247
-gld_dun04.gat,37,230,0 warp gldd_006 1,1,gef_fild13.gat,42,331
-gld_dun04.gat,110,20,0 warp gldd_007 1,1,gef_fild13.gat,373,62
+//===== Athena Script ========================================
+//= Guild Castles Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 2.3
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Al de Baran, Payon, Prontera & Geffen
+//= Guild Castles
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//= fixed aldg504-1 warp [Lupus]
+//= 2.0 Added Novice Guilds warps, optimized aldg408r warp [Lupus]
+//= 2.1 Fixed some warps positions [Yor]
+//= 2.2 Changed all breaks to end as per the new script engine. [Skotlex]
+//= 2.3 Removed 2nd entrance to Novice Castle Geffen [Lupus]
+//============================================================
+
+
+//Al de Baran Guild Castles Map Connection
+aldebaran.gat,35,140,0 warp aldg001 1,1,alde_gld.gat,280,160
+alde_gld.gat,284,160,0 warp aldg002 1,1,aldebaran.gat,39,140
+
+//Al de Baran Guild Castles Map
+alde_gld.gat,48,79,0 warp aldg01 1,1,aldeg_cas01.gat,34,248
+aldeg_cas01.gat,34,252,0 warp aldg01-1 1,1,alde_gld.gat,48,83
+alde_gld.gat,95,253,0 warp aldg02 1,1,aldeg_cas02.gat,88,163
+aldeg_cas02.gat,88,159,0 warp aldg02-1 1,1,alde_gld.gat,95,249
+alde_gld.gat,142,81,0 warp aldg03 1,1,aldeg_cas03.gat,114,286
+aldeg_cas03.gat,114,290,0 warp aldg03-1 1,1,alde_gld.gat,142,85
+alde_gld.gat,243,242,0 warp aldg04 1,1,aldeg_cas04.gat,149,17
+aldeg_cas04.gat,145,17,0 warp aldg04-1 1,1,alde_gld.gat,239,242
+alde_gld.gat,259,90,0 warp aldg05 1,1,aldeg_cas05.gat,216,103
+aldeg_cas05.gat,216,107,0 warp aldg05-1 1,1,alde_gld.gat,264,90
+
+//Al de Baran Guild Castles
+aldeg_cas01.gat,50,222,0 warp aldg101 1,1,aldeg_cas01.gat,104,108
+aldeg_cas01.gat,104,112,0 warp aldg101-1 1,1,aldeg_cas01.gat,45,224
+aldeg_cas01.gat,66,191,0 warp aldg102 1,1,aldeg_cas01.gat,122,61
+aldeg_cas01.gat,126,61,0 warp aldg102-1 1,1,aldeg_cas01.gat,62,191
+aldeg_cas01.gat,54,27,0 warp aldg102-2 1,1,aldeg_cas01.gat,62,191
+aldeg_cas01.gat,26,188,0 warp aldg103 1,1,aldeg_cas01.gat,50,70
+aldeg_cas01.gat,46,70,0 warp aldg103-1 1,1,aldeg_cas01.gat,24,188
+aldeg_cas01.gat,70,112,0 warp aldg104 1,1,aldeg_cas01.gat,42,225
+aldeg_cas01.gat,39,222,0 warp aldg104-1 1,1,aldeg_cas01.gat,70,108
+aldeg_cas01.gat,89,23,0 warp aldg105 1,1,aldeg_cas01.gat,207,132
+aldeg_cas01.gat,207,128,0 warp aldg105-1 1,1,aldeg_cas01.gat,89,27
+aldeg_cas01.gat,206,188,0 warp aldg106 1,1,aldeg_cas01.gat,216,50
+aldeg_cas01.gat,216,54,0 warp aldg106-1 1,1,aldeg_cas01.gat,206,184
+aldeg_cas01.gat,232,186,0 warp aldg107 1,1,aldeg_cas01.gat,42,197
+aldeg_cas01.gat,46,197,0 warp aldg107-1 1,1,aldeg_cas01.gat,232,182
+aldeg_cas01.gat,171,175,0 warp aldg108 1,1,aldeg_cas01.gat,35,197
+aldeg_cas01.gat,31,197,0 warp aldg108-1 1,1,aldeg_cas01.gat,175,175
+aldeg_cas02.gat,84,208,0 warp aldg201 1,1,aldeg_cas02.gat,105,84
+aldeg_cas02.gat,105,88,0 warp aldg201-1 1,1,aldeg_cas02.gat,79,208
+aldeg_cas02.gat,45,39,0 warp aldg201-2 1,1,aldeg_cas02.gat,79,208
+aldeg_cas02.gat,50,185,0 warp aldg202 1,1,aldeg_cas02.gat,192,192
+aldeg_cas02.gat,192,196,0 warp aldg202-1 1,1,aldeg_cas02.gat,50,180
+aldeg_cas02.gat,33,174,0 warp aldg203 1,1,aldeg_cas02.gat,126,61
+aldeg_cas02.gat,130,61,0 warp aldg203-1 1,1,aldeg_cas02.gat,33,179
+aldeg_cas02.gat,22,193,0 warp aldg204 1,1,aldeg_cas02.gat,88,11
+aldeg_cas02.gat,88,8,0 warp aldg204-1 1,1,aldeg_cas02.gat,22,190
+aldeg_cas02.gat,121,88,0 warp aldg205 1,1,aldeg_cas02.gat,177,135
+aldeg_cas02.gat,177,131,0 warp aldg205-1 1,1,aldeg_cas02.gat,121,84
+aldeg_cas02.gat,206,196,0 warp aldg206 1,1,aldeg_cas02.gat,197,13
+aldeg_cas02.gat,197,9,0 warp aldg206-1 1,1,aldeg_cas02.gat,206,192
+aldeg_cas03.gat,92,217,0 warp aldg301 1,1,aldeg_cas03.gat,127,90
+aldeg_cas03.gat,130,90,0 warp aldg301-1 1,1,aldeg_cas03.gat,96,215
+aldeg_cas03.gat,87,247,0 warp aldg302 1,1,aldeg_cas03.gat,54,90
+aldeg_cas03.gat,51,90,0 warp aldg302-1 1,1,aldeg_cas03.gat,87,251
+aldeg_cas03.gat,93,124,0 warp aldg302-2 1,1,aldeg_cas03.gat,87,251
+aldeg_cas03.gat,44,222,0 warp aldg303 1,1,aldeg_cas03.gat,213,182
+aldeg_cas03.gat,214,186,0 warp aldg303-1 1,1,aldeg_cas03.gat,49,222
+aldeg_cas03.gat,91,57,0 warp aldg304 1,1,aldeg_cas03.gat,60,236
+aldeg_cas03.gat,60,241,0 warp aldg304-1 1,1,aldeg_cas03.gat,91,61
+aldeg_cas03.gat,79,130,0 warp aldg305 1,1,aldeg_cas03.gat,201,149
+aldeg_cas03.gat,201,145,0 warp aldg305-1 1,1,aldeg_cas03.gat,79,126
+aldeg_cas03.gat,199,190,0 warp aldg306 1,1,aldeg_cas03.gat,195,51
+aldeg_cas03.gat,195,54,0 warp aldg306-1 1,1,aldeg_cas03.gat,199,186
+aldeg_cas04.gat,197,40,0 warp aldg401 1,1,aldeg_cas04.gat,26,88
+aldeg_cas04.gat,22,88,0 warp aldg401-1 1,1,aldeg_cas04.gat,192,41
+aldeg_cas04.gat,175,54,0 warp aldg402 1,1,aldeg_cas04.gat,74,88
+aldeg_cas04.gat,50,132,0 warp aldg402-1 1,1,aldeg_cas04.gat,74,88
+aldeg_cas04.gat,78,88,0 warp aldg402-2 1,1,aldeg_cas04.gat,174,58
+aldeg_cas04.gat,185,87,0 warp aldg403 1,1,aldeg_cas04.gat,111,210
+aldeg_cas04.gat,108,210,0 warp aldg403-1 1,1,aldeg_cas04.gat,186,92
+aldeg_cas04.gat,171,100,0 warp aldg404 1,1,aldeg_cas04.gat,152,210
+aldeg_cas04.gat,156,210,0 warp aldg404-1 1,1,aldeg_cas04.gat,169,97
+aldeg_cas04.gat,196,85,0 warp aldg405 1,1,aldeg_cas04.gat,49,54
+aldeg_cas04.gat,49,52,0 warp aldg405-1 8,1,aldeg_cas04.gat,196,82
+aldeg_cas04.gat,21,123,0 warp aldg406 1,1,aldeg_cas04.gat,125,168
+aldeg_cas04.gat,121,168,0 warp aldg406-1 1,1,aldeg_cas04.gat,25,123
+aldeg_cas04.gat,132,209,0 warp aldg407 1,1,aldeg_cas04.gat,14,196
+aldeg_cas04.gat,17,196,0 warp aldg407-1 1,1,aldeg_cas04.gat,132,228
+aldeg_cas04.gat,132,231,4 script aldg408r 45,1,1,{
+ set @l0,rand(5);
+ if(@l0==1) goto w2;
+ if(@l0==2) goto w3;
+ if(@l0==3) goto w4;
+ if(@l0==4) goto w5;
+ warp "aldeg_cas04.gat",152,210; end;
+w2: warp "aldeg_cas04.gat",111,210; end;
+w3: warp "aldeg_cas04.gat",129,212; end;
+w4: warp "aldeg_cas04.gat",129,212; end;
+w5: warp "aldeg_cas04.gat",14,196; end;
+}
+aldeg_cas05.gat,194,71,0 warp aldg501 1,1,aldeg_cas05.gat,129,194
+aldeg_cas05.gat,125,194,0 warp aldg501-1 1,1,aldeg_cas05.gat,199,70
+aldeg_cas05.gat,164,86,0 warp aldg502 1,1,aldeg_cas05.gat,66,189
+aldeg_cas05.gat,70,189,0 warp aldg502-1 1,1,aldeg_cas05.gat,166,81
+aldeg_cas05.gat,150,67,0 warp aldg503 1,1,aldeg_cas05.gat,9,187
+aldeg_cas05.gat,5,187,0 warp aldg503-1 1,1,aldeg_cas05.gat,151,62
+aldeg_cas05.gat,165,232,0 warp aldg504 1,1,aldeg_cas05.gat,193,49
+aldeg_cas05.gat,188,49,0 warp aldg504-1 1,1,aldeg_cas05.gat,165,228 //fixed [Lupus]
+aldeg_cas05.gat,195,42,0 warp aldg505 1,1,aldeg_cas05.gat,19,227
+aldeg_cas05.gat,15,227,0 warp aldg505-1 1,1,aldeg_cas05.gat,195,46
+aldeg_cas05.gat,13,175,0 warp aldg506 1,1,aldeg_cas05.gat,162,194
+aldeg_cas05.gat,166,194,0 warp aldg506-1 1,1,aldeg_cas05.gat,13,179
+aldeg_cas05.gat,156,231,0 warp aldg507 1,1,aldeg_cas05.gat,18,88
+aldeg_cas05.gat,14,88,0 warp aldg507-1 1,1,aldeg_cas05.gat,156,227
+
+// Geffen Castles Map
+gef_fild13.gat,112,269,0 warp gefg05 1,1,gefg_cas03.gat,100,280
+gef_fild13.gat,139,240,0 warp gefg06 1,1,gefg_cas03.gat,125,250
+gef_fild13.gat,150,54,0 warp gefg01 1,1,gefg_cas01.gat,34,140
+gef_fild13.gat,196,281,0 warp gefg08 1,1,gefg_cas04.gat,24,149
+gef_fild13.gat,210,75,0 warp gefg02 1,1,gefg_cas01.gat,95,178
+gef_fild13.gat,256,57,0 warp gefg09 1,1,gefg_cas05.gat,11,134
+gef_fild13.gat,305,83,0 warp gefg09-1 1,1,gefg_cas05.gat,99,200
+gef_fild13.gat,308,244,0 warp gefg03 1,1,gefg_cas02.gat,70,143
+gef_fild13.gat,77,284,0 warp gefg04 1,1,gefg_cas03.gat,60,286
+gef_fild13.gat,83,185,0 warp gefg07 1,1,gefg_cas03.gat,89,159
+
+//Geffen Guild Castles
+gefg_cas01.gat,170,14,0 warp gefg106-1 1,1,gefg_cas01.gat,50,84
+gefg_cas01.gat,170,34,0 warp gefg105-1 1,1,gefg_cas01.gat,30,167
+gefg_cas01.gat,181,52,0 warp gefg107 1,1,gefg_cas01.gat,198,160
+gefg_cas01.gat,202,160,0 warp gefg107-1 1,1,gefg_cas01.gat,185,52
+gefg_cas01.gat,209,34,0 warp gefg103-1 1,1,gefg_cas01.gat,56,170
+gefg_cas01.gat,31,185,0 warp gefg104 1,1,gefg_cas01.gat,33,47
+gefg_cas01.gat,33,51,0 warp gefg104-1 1,1,gefg_cas01.gat,35,185
+gefg_cas01.gat,34,136,0 warp gefg01-1 1,1,gef_fild13.gat,150,50
+gefg_cas01.gat,34,167,0 warp gefg105 1,1,gefg_cas01.gat,174,34
+gefg_cas01.gat,39,196,0 warp gefg101 1,1,gefg_cas01.gat,62,13
+gefg_cas01.gat,54,84,0 warp gefg106 1,1,gefg_cas01.gat,174,14
+gefg_cas01.gat,58,185,0 warp gefg102 1,1,gefg_cas01.gat,90,47
+gefg_cas01.gat,59,170,0 warp gefg103 1,1,gefg_cas01.gat,205,34
+gefg_cas01.gat,62,9,0 warp gefg101-1 1,1,gefg_cas01.gat,39,192
+gefg_cas01.gat,90,51,0 warp gefg102-1 1,1,gefg_cas01.gat,54,185
+gefg_cas01.gat,99,178,0 warp gefg02-1 1,1,gef_fild13.gat,214,75
+gefg_cas02.gat,148,18,0 warp gefg205-1 1,1,gefg_cas02.gat,35,150
+gefg_cas02.gat,150,36,0 warp gefg208 1,1,gefg_cas02.gat,152,186
+gefg_cas02.gat,152,190,0 warp gefg208-1 1,1,gefg_cas02.gat,150,41
+gefg_cas02.gat,174,11,0 warp gefg207-1 1,1,gefg_cas02.gat,21,13
+gefg_cas02.gat,184,36,0 warp gefg204-1 1,1,gefg_cas02.gat,48,155
+gefg_cas02.gat,185,18,0 warp gefg206-1 1,1,gefg_cas02.gat,53,136
+gefg_cas02.gat,22,160,0 warp gefg203 1,1,gefg_cas02.gat,34,17
+gefg_cas02.gat,25,13,0 warp gefg207 1,1,gefg_cas02.gat,170,11
+gefg_cas02.gat,34,13,0 warp gefg203-1 1,1,gefg_cas02.gat,22,156
+gefg_cas02.gat,34,152,0 warp gefg205 1,1,gefg_cas02.gat,153,18
+gefg_cas02.gat,34,68,0 warp gefg202-1 1,1,gefg_cas02.gat,50,175
+gefg_cas02.gat,35,173,0 warp gefg201 1,1,gefg_cas02.gat,76,42
+gefg_cas02.gat,46,175,0 warp gefg202 1,1,gefg_cas02.gat,34,64
+gefg_cas02.gat,48,159,0 warp gefg204 1,1,gefg_cas02.gat,184,41
+gefg_cas02.gat,57,136,0 warp gefg206 1,1,gefg_cas02.gat,180,18
+gefg_cas02.gat,70,147,0 warp gefg03-1 1,1,gef_fild13.gat,308,240
+gefg_cas02.gat,80,42,0 warp gefg201-1 1,1,gefg_cas02.gat,39,173
+gefg_cas03.gat,103,283,0 warp gefg05-1 1,1,gef_fild13.gat,117,273
+gefg_cas03.gat,106,217,0 warp gefg307 1,1,gefg_cas03.gat,131,15
+gefg_cas03.gat,115,210,0 warp gefg308 1,1,gefg_cas03.gat,92,215
+gefg_cas03.gat,130,250,0 warp gefg06-1 1,1,gef_fild13.gat,143,240
+gefg_cas03.gat,135,15,0 warp gefg307-1 1,1,gefg_cas03.gat,110,217
+gefg_cas03.gat,135,92,0 warp gefg302-1 1,1,gefg_cas03.gat,34,282
+gefg_cas03.gat,152,92,0 warp gefg304-1 1,1,gefg_cas03.gat,59,255
+gefg_cas03.gat,154,16,0 warp gefg314 1,1,gefg_cas03.gat,252,11
+gefg_cas03.gat,17,206,0 warp gefg306-1 1,1,gefg_cas03.gat,29,219
+gefg_cas03.gat,212,46,0 warp gefg315 1,1,gefg_cas03.gat,225,158
+gefg_cas03.gat,225,154,0 warp gefg315-1 1,1,gefg_cas03.gat,212,42
+gefg_cas03.gat,237,74,0 warp gefg312-1 1,1,gefg_cas03.gat,62,213
+gefg_cas03.gat,256,11,0 warp gefg314-1 1,1,gefg_cas03.gat,159,16
+gefg_cas03.gat,266,47,0 warp gefg309-1 1,1,gefg_cas03.gat,45,175
+gefg_cas03.gat,27,215,0 warp gefg306-2 1,1,gefg_cas03.gat,17,202
+gefg_cas03.gat,34,286,0 warp gefg302 1,1,gefg_cas03.gat,131,92
+gefg_cas03.gat,38,243,0 warp gefg306 1,1,gefg_cas03.gat,29,219
+gefg_cas03.gat,38,259,0 warp gefg303-1 1,1,gefg_cas03.gat,43,271
+gefg_cas03.gat,42,175,0 warp gefg309 1,1,gefg_cas03.gat,266,43
+gefg_cas03.gat,43,191,0 warp gefg310-1 1,1,gefg_cas03.gat,70,185
+gefg_cas03.gat,47,271,0 warp gefg303 1,1,gefg_cas03.gat,38,255
+gefg_cas03.gat,50,248,0 warp gefg305 1,1,gefg_cas03.gat,54,229
+gefg_cas03.gat,58,232,0 warp gefg305-1 1,1,gefg_cas03.gat,62,213
+gefg_cas03.gat,63,255,0 warp gefg304 1,1,gefg_cas03.gat,156,92
+gefg_cas03.gat,65,215,0 warp gefg312 1,1,gefg_cas03.gat,233,74
+gefg_cas03.gat,66,223,0 warp gefg301 1,1,gefg_cas03.gat,96,53
+gefg_cas03.gat,68,290,0 warp gefg04-1 1,1,gef_fild13.gat,74,287
+gefg_cas03.gat,70,182,0 warp gefg310 1,1,gefg_cas03.gat,39,191
+gefg_cas03.gat,79,244,0 warp gefg313-1 1,1,gefg_cas03.gat,91,250
+gefg_cas03.gat,88,248,0 warp gefg311-1 1,1,gefg_cas03.gat,76,242
+gefg_cas03.gat,90,218,0 warp gefg308-1 1,1,gefg_cas03.gat,111,210
+gefg_cas03.gat,92,53,0 warp gefg301-1 1,1,gefg_cas03.gat,62,223
+gefg_cas03.gat,93,159,0 warp gefg07-1 1,1,gef_fild13.gat,83,181
+gefg_cas03.gat,93,209,0 warp gefg311 1,1,gefg_cas03.gat,92,250
+gefg_cas03.gat,95,251,0 warp gefg313 1,1,gefg_cas03.gat,91,209
+gefg_cas04.gat,140,168,0 warp gefg407-1 1,1,gefg_cas04.gat,178,61
+gefg_cas04.gat,142,33,0 warp gefg406-1 1,1,gefg_cas04.gat,52,21
+gefg_cas04.gat,142,55,0 warp gefg404-1 1,1,gefg_cas04.gat,32,180
+gefg_cas04.gat,174,36,0 warp gefg403-1 1,1,gefg_cas04.gat,53,192
+gefg_cas04.gat,178,57,0 warp gefg407 1,1,gefg_cas04.gat,143,166
+gefg_cas04.gat,18,82,0 warp gefg401-1 1,1,gefg_cas04.gat,34,215
+gefg_cas04.gat,18,9,0 warp gefg402-1 1,1,gefg_cas04.gat,57,220
+gefg_cas04.gat,24,145,0 warp gefg08-1 1,1,gef_fild13.gat,193,278
+gefg_cas04.gat,27,180,0 warp gefg404 1,1,gefg_cas04.gat,142,59
+gefg_cas04.gat,34,211,0 warp gefg401 1,1,gefg_cas04.gat,18,78
+gefg_cas04.gat,42,81,0 warp gefg405 1,1,gefg_cas04.gat,42,13
+gefg_cas04.gat,42,9,0 warp gefg405-1 1,1,gefg_cas04.gat,42,77
+gefg_cas04.gat,52,25,0 warp gefg406 1,1,gefg_cas04.gat,142,37
+gefg_cas04.gat,53,196,0 warp gefg403 1,1,gefg_cas04.gat,170,36
+gefg_cas04.gat,57,224,0 warp gefg402 1,1,gefg_cas04.gat,18,13
+gefg_cas05.gat,149,44,0 warp gefg506-1 1,1,gefg_cas05.gat,37,20
+gefg_cas05.gat,178,72,0 warp gefg501-1 1,1,gefg_cas05.gat,46,165
+gefg_cas05.gat,190,20,0 warp gefg508 1,1,gefg_cas05.gat,194,151
+gefg_cas05.gat,194,147,0 warp gefg508-1 1,1,gefg_cas05.gat,190,16
+gefg_cas05.gat,206,44,0 warp gefg507-1 1,1,gefg_cas05.gat,93,20
+gefg_cas05.gat,37,16,0 warp gefg506 1,1,gefg_cas05.gat,153,44
+gefg_cas05.gat,43,62,0 warp gefg505-1 1,1,gefg_cas05.gat,78,138
+gefg_cas05.gat,44,143,0 warp gefg503 1,1,gefg_cas05.gat,70,155
+gefg_cas05.gat,50,165,0 warp gefg501 1,1,gefg_cas05.gat,178,68
+gefg_cas05.gat,66,76,0 warp gefg504-1 1,1,gefg_cas05.gat,80,155
+gefg_cas05.gat,68,150,0 warp gefg503-1 1,1,gefg_cas05.gat,44,147
+gefg_cas05.gat,7,134,0 warp gefg10 1,1,gef_fild13.gat,252,57
+gefg_cas05.gat,74,138,0 warp gefg505 1,1,gefg_cas05.gat,47,62
+gefg_cas05.gat,83,152,0 warp gefg504 1,1,gefg_cas05.gat,66,72
+gefg_cas05.gat,87,165,0 warp gefg502 1,1,gefg_cas05.gat,84,62
+gefg_cas05.gat,88,62,0 warp gefg502-1 1,1,gefg_cas05.gat,83,165
+gefg_cas05.gat,93,16,0 warp gefg507 1,1,gefg_cas05.gat,202,44
+gefg_cas05.gat,99,204,0 warp gefg10-1 1,1,gef_fild13.gat,305,87
+
+//Payon Guild Castles Map Connection
+// Temp Disabled till i replace them from the ones in payon.txt!!
+//payon.gat,17,151,0 warp payg001 1,1,pay_gld.gat,370,149
+//pay_gld.gat,374,149,0 warp payg001-1 1,1,payon.gat,21,151
+moc_fild02.gat,378,272,0 warp payg002 1,1,pay_gld.gat,20,276
+pay_gld.gat,16,276,0 warp payg002-1 1,1,moc_fild02.gat,374,272
+
+//Payon Guild Castles Map
+pay_gld.gat,121,238,0 warp payg01 1,1,payg_cas01.gat,214,48
+payg_cas01.gat,214,44,0 warp payg01-1 1,1,pay_gld.gat,121,233
+pay_gld.gat,291,116,0 warp payg02 1,1,payg_cas02.gat,272,57
+payg_cas02.gat,276,61,0 warp payg02-1 1,1,pay_gld.gat,295,116
+pay_gld.gat,321,293,0 warp payg03 1,1,payg_cas03.gat,226,26
+payg_cas03.gat,226,22,0 warp payg03-1 1,1,pay_gld.gat,317,293
+pay_gld.gat,140,156,0 warp payg04 1,1,payg_cas04.gat,252,271
+payg_cas04.gat,252,275,0 warp payg04-1 1,1,pay_gld.gat,140,160
+pay_gld.gat,204,269,0 warp payg05 3,1,payg_cas05.gat,62,225
+payg_cas05.gat,62,222,0 warp payg05-1 5,1,pay_gld.gat,204,266
+
+//Payon Guild Castles
+payg_cas01.gat,201,125,0 warp payg101 1,1,payg_cas01.gat,102,19
+payg_cas01.gat,102,16,0 warp payg101-1 3,1,payg_cas01.gat,201,122
+payg_cas01.gat,222,130,0 warp payg102 1,1,payg_cas01.gat,130,43
+payg_cas01.gat,134,43,0 warp payg102-1 1,1,payg_cas01.gat,226,130
+payg_cas01.gat,218,112,0 warp payg103 1,1,payg_cas01.gat,230,94
+payg_cas01.gat,230,98,0 warp payg103-1 1,1,payg_cas01.gat,222,112
+payg_cas01.gat,213,76,0 warp payg104 1,1,payg_cas01.gat,201,118
+payg_cas01.gat,201,114,0 warp payg104-1 1,1,payg_cas01.gat,213,72
+payg_cas01.gat,84,15,0 warp payg105 1,1,payg_cas01.gat,15,115
+payg_cas01.gat,11,115,0 warp payg105-1 1,1,payg_cas01.gat,81,15
+payg_cas01.gat,53,111,0 warp payg106 1,1,payg_cas01.gat,115,147
+payg_cas01.gat,115,151,0 warp payg106-1 1,1,payg_cas01.gat,53,115
+payg_cas02.gat,232,72,0 warp payg201 1,1,payg_cas02.gat,28,289
+payg_cas02.gat,28,293,0 warp payg201-1 1,1,payg_cas02.gat,229,72
+payg_cas02.gat,236,59,0 warp payg201-2 1,1,payg_cas02.gat,229,72
+payg_cas02.gat,222,26,0 warp payg202 1,1,payg_cas02.gat,80,240
+payg_cas02.gat,84,240,0 warp payg202-1 1,1,payg_cas02.gat,224,30
+payg_cas02.gat,215,31,0 warp payg203 1,1,payg_cas02.gat,65,288
+payg_cas02.gat,65,292,0 warp payg203-1 1,1,payg_cas02.gat,215,35
+payg_cas02.gat,47,223,0 warp payg204 1,1,payg_cas02.gat,280,287
+payg_cas02.gat,280,291,0 warp payg204-1 1,1,payg_cas02.gat,47,227
+payg_cas02.gat,254,240,0 warp payg205 3,1,payg_cas02.gat,13,40
+payg_cas02.gat,13,43,0 warp payg205-1 7,1,payg_cas02.gat,254,243
+payg_cas03.gat,255,76,0 warp payg301 1,1,payg_cas03.gat,24,19
+payg_cas03.gat,20,19,0 warp payg301-1 1,1,payg_cas03.gat,255,72
+payg_cas03.gat,269,79,0 warp payg302 1,1,payg_cas03.gat,53,19
+payg_cas03.gat,57,19,0 warp payg302-1 1,1,payg_cas03.gat,269,75
+payg_cas03.gat,255,64,0 warp payg303 1,1,payg_cas03.gat,245,37
+payg_cas03.gat,245,41,0 warp payg303-1 1,1,payg_cas03.gat,255,68
+payg_cas03.gat,262,71,0 warp payg304 1,1,payg_cas03.gat,39,9
+payg_cas03.gat,39,5,0 warp payg304-1 1,1,payg_cas03.gat,263,66
+payg_cas03.gat,271,68,0 warp payg305 0,1,payg_cas03.gat,261,37
+payg_cas03.gat,261,34,0 warp payg305-1 1,1,payg_cas03.gat,269,68
+payg_cas03.gat,39,84,0 warp payg306 1,1,payg_cas03.gat,29,249
+payg_cas03.gat,29,245,0 warp payg306-1 1,1,payg_cas03.gat,39,80
+payg_cas03.gat,29,269,0 warp payg307 1,1,payg_cas03.gat,269,287
+payg_cas03.gat,269,290,0 warp payg307-1 1,1,payg_cas03.gat,29,273
+payg_cas04.gat,259,212,0 warp payg401 1,1,payg_cas04.gat,72,240
+payg_cas04.gat,75,240,0 warp payg401-1 1,5,payg_cas04.gat,256,212
+payg_cas04.gat,232,189,0 warp payg402 1,1,payg_cas04.gat,74,261
+payg_cas04.gat,78,261,0 warp payg402-1 1,1,payg_cas04.gat,236,189
+payg_cas04.gat,229,208,0 warp payg403 1,1,payg_cas04.gat,70,282
+payg_cas04.gat,74,282,0 warp payg403-1 1,1,payg_cas04.gat,225,208
+payg_cas04.gat,7,261,0 warp payg404 1,1,payg_cas04.gat,55,30
+payg_cas04.gat,59,30,0 warp payg404-1 1,1,payg_cas04.gat,11,261
+payg_cas04.gat,28,31,0 warp payg405 1,1,payg_cas04.gat,251,42
+payg_cas04.gat,254,45,0 warp payg405-1 1,1,payg_cas04.gat,24,31
+payg_cas05.gat,23,283,0 warp payg501 1,1,payg_cas05.gat,237,282
+payg_cas05.gat,237,286,0 warp payg501-1 1,1,payg_cas05.gat,19,282
+payg_cas05.gat,56,255,0 warp payg502 1,1,payg_cas05.gat,223,256
+payg_cas05.gat,219,256,0 warp payg502-1 1,1,payg_cas05.gat,52,255
+payg_cas05.gat,40,263,0 warp payg503 3,1,payg_cas05.gat,237,229
+payg_cas05.gat,237,226,0 warp payg503-1 5,1,payg_cas05.gat,40,260
+payg_cas05.gat,283,256,0 warp payg504 1,1,payg_cas05.gat,286,43
+payg_cas05.gat,290,43,0 warp payg504-1 1,1,payg_cas05.gat,287,256
+payg_cas05.gat,242,41,0 warp payg505 1,1,payg_cas05.gat,18,18
+payg_cas05.gat,14,14,0 warp payg505-1 1,1,payg_cas05.gat,246,41
+
+//Prontera Castles Map
+prt_gld.gat,107,240,0 warp prtg04-1 1,1,prtg_cas04.gat,86,13
+prt_gld.gat,129,65,0 warp prtg01 1,1,prtg_cas01.gat,99,32
+prt_gld.gat,153,141,0 warp prtg03-1 1,1,prtg_cas03.gat,168,12
+prt_gld.gat,159,25,0 warp prtg002 6,2,prt_castle.gat,102,178
+prt_gld.gat,159,298,0 warp prtg001 1,1,prt_fild01.gat,199,30
+prt_gld.gat,212,240,0 warp prtg05-1 1,1,prtg_cas05.gat,17,235
+prt_gld.gat,240,124,0 warp prtg02-1 1,1,prtg_cas02.gat,43,229
+
+//Prontera Guild Castles
+prtg_cas01.gat,103,32,0 warp prtg01-1 1,1,prt_gld.gat,134,65
+prtg_cas01.gat,109,163,0 warp prtg107 1,1,prtg_cas01.gat,202,183
+prtg_cas01.gat,147,120,0 warp prtg106 1,1,prtg_cas01.gat,75,187
+prtg_cas01.gat,196,119,0 warp prtg103-1 1,1,prtg_cas01.gat,40,54
+prtg_cas01.gat,196,65,0 warp prtg104-1 1,1,prtg_cas01.gat,75,54
+prtg_cas01.gat,206,183,0 warp prtg107-1 1,1,prtg_cas01.gat,113,163
+prtg_cas01.gat,206,92,0 warp prtg105-1 1,1,prtg_cas01.gat,55,70
+prtg_cas01.gat,37,47,0 warp prtg102-1 1,1,prtg_cas01.gat,45,34
+prtg_cas01.gat,37,54,0 warp prtg103 1,1,prtg_cas01.gat,192,119
+prtg_cas01.gat,41,34,0 warp prtg102 1,1,prtg_cas01.gat,40,47
+prtg_cas01.gat,51,70,0 warp prtg105 1,1,prtg_cas01.gat,202,92
+prtg_cas01.gat,57,19,0 warp prtg101 1,1,prtg_cas01.gat,80,49
+prtg_cas01.gat,62,34,0 warp prtg108 1,1,prtg_cas01.gat,192,119
+prtg_cas01.gat,71,54,0 warp prtg104 1,1,prtg_cas01.gat,192,65
+prtg_cas01.gat,75,183,0 warp prtg106-1 1,1,prtg_cas01.gat,147,116
+prtg_cas01.gat,84,19,0 warp prtg109 1,1,prtg_cas01.gat,192,65
+prtg_cas01.gat,84,49,0 warp prtg101-1 1,1,prtg_cas01.gat,61,19
+prtg_cas02.gat,157,135,0 warp prtg206-1 1,1,prtg_cas02.gat,184,40
+prtg_cas02.gat,161,41,0 warp prtg202-1 1,1,prtg_cas02.gat,57,202
+prtg_cas02.gat,184,44,0 warp prtg206 1,1,prtg_cas02.gat,157,140
+prtg_cas02.gat,203,21,0 warp prtg205-1 1,1,prtg_cas02.gat,45,25
+prtg_cas02.gat,210,41,0 warp prtg201-1 1,1,prtg_cas02.gat,84,215
+prtg_cas02.gat,35,183,0 warp prtg204 1,1,prtg_cas02.gat,71,82
+prtg_cas02.gat,43,233,0 warp prtg02 1,1,prt_gld.gat,240,128
+prtg_cas02.gat,45,21,0 warp prtg205 1,1,prtg_cas02.gat,203,25
+prtg_cas02.gat,53,202,0 warp prtg202 1,1,prtg_cas02.gat,165,41
+prtg_cas02.gat,64,164,0 warp prtg203 1,1,prtg_cas02.gat,98,25
+prtg_cas02.gat,71,86,0 warp prtg204-1 1,1,prtg_cas02.gat,35,187
+prtg_cas02.gat,88,215,0 warp prtg201 1,1,prtg_cas02.gat,206,41
+prtg_cas02.gat,98,21,0 warp prtg203-1 1,1,prtg_cas02.gat,64,168
+prtg_cas03.gat,164,173,0 warp prtg305-1 1,1,prtg_cas03.gat,45,117
+prtg_cas03.gat,165,59,0 warp prtg304 1,1,prtg_cas03.gat,45,47
+prtg_cas03.gat,168,8,0 warp prtg03 1,1,prt_gld.gat,153,137
+prtg_cas03.gat,169,235,0 warp prtg306 1,1,prtg_cas03.gat,11,200
+prtg_cas03.gat,172,44,0 warp prtg303 1,1,prtg_cas03.gat,10,78
+prtg_cas03.gat,178,85,0 warp prtg301 1,1,prtg_cas03.gat,82,73
+prtg_cas03.gat,191,55,0 warp prtg302 1,1,prtg_cas03.gat,190,233
+prtg_cas03.gat,194,233,0 warp prtg302-1 1,1,prtg_cas03.gat,191,59
+prtg_cas03.gat,45,120,0 warp prtg305 1,1,prtg_cas03.gat,164,177
+prtg_cas03.gat,45,43,0 warp prtg304-1 1,1,prtg_cas03.gat,165,54
+prtg_cas03.gat,6,78,0 warp prtg303-1 1,1,prtg_cas03.gat,176,44
+prtg_cas03.gat,7,200,0 warp prtg306-1 1,1,prtg_cas03.gat,169,231
+prtg_cas03.gat,86,73,0 warp prtg301-1 1,1,prtg_cas03.gat,178,81
+prtg_cas04.gat,10,229,0 warp prtg401-1 1,1,prtg_cas04.gat,48,44
+prtg_cas04.gat,238,257,0 warp prtg406-1 1,1,prtg_cas04.gat,34,286
+prtg_cas04.gat,247,258,0 warp prtg407 1,1,prtg_cas04.gat,255,14
+prtg_cas04.gat,251,14,0 warp prtg407-1 1,1,prtg_cas04.gat,247,254
+prtg_cas04.gat,32,28,0 warp prtg403 1,1,prtg_cas04.gat,11,254
+prtg_cas04.gat,34,225,0 warp prtg402-1 1,1,prtg_cas04.gat,63,26
+prtg_cas04.gat,34,290,0 warp prtg406 1,1,prtg_cas04.gat,238,261
+prtg_cas04.gat,42,13,0 warp prtg404 1,1,prtg_cas04.gat,56,254
+prtg_cas04.gat,48,48,0 warp prtg401 1,1,prtg_cas04.gat,10,233
+prtg_cas04.gat,54,25,0 warp prtg405 1,1,prtg_cas04.gat,56,233
+prtg_cas04.gat,56,229,0 warp prtg405-1 1,1,prtg_cas04.gat,54,29
+prtg_cas04.gat,60,254,0 warp prtg404-1 1,1,prtg_cas04.gat,42,17
+prtg_cas04.gat,63,30,0 warp prtg402 1,1,prtg_cas04.gat,34,229
+prtg_cas04.gat,7,254,0 warp prtg403-1 1,1,prtg_cas04.gat,32,32
+prtg_cas04.gat,86,9,0 warp prtg04 1,1,prt_gld.gat,111,240
+prtg_cas05.gat,17,231,0 warp prtg05 1,1,prt_gld.gat,208,240
+prtg_cas05.gat,195,13,0 warp prtg504-1 1,1,prtg_cas05.gat,55,248
+prtg_cas05.gat,228,96,0 warp prtg505 1,1,prtg_cas05.gat,26,7
+prtg_cas05.gat,244,3,0 warp prtg501-1 1,1,prtg_cas05.gat,35,247
+prtg_cas05.gat,253,294,0 warp prtg506-1 1,1,prtg_cas05.gat,58,11
+prtg_cas05.gat,26,3,0 warp prtg505-1 1,1,prtg_cas05.gat,228,92
+prtg_cas05.gat,260,96,0 warp prtg503-1 1,1,prtg_cas05.gat,66,229
+prtg_cas05.gat,292,13,0 warp prtg502-1 1,1,prtg_cas05.gat,76,246
+prtg_cas05.gat,38,250,0 warp prtg501 1,1,prtg_cas05.gat,244,7
+prtg_cas05.gat,53,246,0 warp prtg504 1,1,prtg_cas05.gat,199,13
+prtg_cas05.gat,58,7,0 warp prtg506 1,1,prtg_cas05.gat,253,290
+prtg_cas05.gat,66,225,0 warp prtg503 1,1,prtg_cas05.gat,260,92
+prtg_cas05.gat,76,242,0 warp prtg502 1,1,prtg_cas05.gat,288,13
+
+//================== 4 Novices Guild Castles =============================
+//Novices Guild: Al de Baran Guild Castles Map
+n_castle.gat,184,16,0 warp naldg01 1,1,nguild_alde.gat,34,248
+nguild_alde.gat,34,252,0 warp naldg01-1 1,1,n_castle.gat,187,16
+
+nguild_alde.gat,50,222,0 warp naldg101 1,1,nguild_alde.gat,104,108
+nguild_alde.gat,104,112,0 warp naldg101-1 1,1,nguild_alde.gat,45,224
+nguild_alde.gat,66,191,0 warp naldg102 1,1,nguild_alde.gat,122,61
+nguild_alde.gat,126,61,0 warp naldg102-1 1,1,nguild_alde.gat,62,191
+nguild_alde.gat,54,27,0 warp naldg102-2 1,1,nguild_alde.gat,62,191
+nguild_alde.gat,26,188,0 warp naldg103 1,1,nguild_alde.gat,50,70
+nguild_alde.gat,46,70,0 warp naldg103-1 1,1,nguild_alde.gat,24,188
+nguild_alde.gat,70,112,0 warp naldg104 1,1,nguild_alde.gat,42,225
+nguild_alde.gat,39,222,0 warp naldg104-1 1,1,nguild_alde.gat,70,108
+nguild_alde.gat,89,23,0 warp naldg105 1,1,nguild_alde.gat,207,132
+nguild_alde.gat,207,128,0 warp naldg105-1 1,1,nguild_alde.gat,89,27
+nguild_alde.gat,206,188,0 warp naldg106 1,1,nguild_alde.gat,216,50
+nguild_alde.gat,216,54,0 warp naldg106-1 1,1,nguild_alde.gat,206,184
+nguild_alde.gat,232,186,0 warp naldg107 1,1,nguild_alde.gat,42,197
+nguild_alde.gat,46,197,0 warp naldg107-1 1,1,nguild_alde.gat,232,182
+nguild_alde.gat,171,175,0 warp naldg108 1,1,nguild_alde.gat,35,197
+nguild_alde.gat,31,197,0 warp naldg108-1 1,1,nguild_alde.gat,175,175
+
+//Novices Guild: Geffen Castles Map
+n_castle.gat,183,183,0 warp ngefg01 1,1,nguild_gef.gat,34,140
+nguild_gef.gat,34,136,0 warp ngefg01-1 1,1,n_castle.gat,183,180
+nguild_gef.gat,99,178,0 warp ngefg02-1 1,1,n_castle.gat,183,180
+
+nguild_gef.gat,170,14,0 warp ngefg106-1 1,1,nguild_gef.gat,50,84
+nguild_gef.gat,170,34,0 warp ngefg105-1 1,1,nguild_gef.gat,30,167
+nguild_gef.gat,181,52,0 warp ngefg107 1,1,nguild_gef.gat,198,160
+nguild_gef.gat,202,160,0 warp ngefg107-1 1,1,nguild_gef.gat,185,52
+nguild_gef.gat,209,34,0 warp ngefg103-1 1,1,nguild_gef.gat,56,170
+nguild_gef.gat,31,185,0 warp ngefg104 1,1,nguild_gef.gat,33,47
+nguild_gef.gat,33,51,0 warp ngefg104-1 1,1,nguild_gef.gat,35,185
+nguild_gef.gat,34,167,0 warp ngefg105 1,1,nguild_gef.gat,174,34
+nguild_gef.gat,39,196,0 warp ngefg101 1,1,nguild_gef.gat,62,13
+nguild_gef.gat,54,84,0 warp ngefg106 1,1,nguild_gef.gat,174,14
+nguild_gef.gat,58,185,0 warp ngefg102 1,1,nguild_gef.gat,90,47
+nguild_gef.gat,59,170,0 warp ngefg103 1,1,nguild_gef.gat,205,34
+nguild_gef.gat,62,9,0 warp ngefg101-1 1,1,nguild_gef.gat,39,192
+nguild_gef.gat,90,51,0 warp ngefg102-1 1,1,nguild_gef.gat,54,185
+
+//Novices Guild: Payon Guild Castles Map
+n_castle.gat,18,181,0 warp npayg01 1,1,nguild_pay.gat,214,48
+nguild_pay.gat,214,44,0 warp npayg01-1 1,1,n_castle.gat,18,178
+
+nguild_pay.gat,201,125,0 warp npayg101 1,1,nguild_pay.gat,102,19
+nguild_pay.gat,102,16,0 warp npayg101-1 3,1,nguild_pay.gat,201,122
+nguild_pay.gat,222,130,0 warp npayg102 1,1,nguild_pay.gat,130,43
+nguild_pay.gat,134,43,0 warp npayg102-1 1,1,nguild_pay.gat,226,130
+nguild_pay.gat,218,112,0 warp npayg103 1,1,nguild_pay.gat,230,94
+nguild_pay.gat,230,98,0 warp npayg103-1 1,1,nguild_pay.gat,222,112
+nguild_pay.gat,213,76,0 warp npayg104 1,1,nguild_pay.gat,201,118
+nguild_pay.gat,201,114,0 warp npayg104-1 1,1,nguild_pay.gat,213,72
+nguild_pay.gat,84,15,0 warp npayg105 1,1,nguild_pay.gat,15,115
+nguild_pay.gat,11,115,0 warp npayg105-1 1,1,nguild_pay.gat,81,15
+nguild_pay.gat,53,111,0 warp npayg106 1,1,nguild_pay.gat,115,147
+nguild_pay.gat,115,151,0 warp npayg106-1 1,1,nguild_pay.gat,53,115
+
+//Novices Guild: Prontera Castles Map
+n_castle.gat,16,14,0 warp nprtg01 1,1,nguild_prt.gat,99,32
+nguild_prt.gat,103,32,0 warp nprtg01-1 1,1,n_castle.gat,19,14
+
+nguild_prt.gat,109,163,0 warp nprtg107 1,1,nguild_prt.gat,202,183
+nguild_prt.gat,147,120,0 warp nprtg106 1,1,nguild_prt.gat,75,187
+nguild_prt.gat,196,119,0 warp nprtg103-1 1,1,nguild_prt.gat,40,54
+nguild_prt.gat,196,65,0 warp nprtg104-1 1,1,nguild_prt.gat,75,54
+nguild_prt.gat,206,183,0 warp nprtg107-1 1,1,nguild_prt.gat,113,163
+nguild_prt.gat,206,92,0 warp nprtg105-1 1,1,nguild_prt.gat,55,70
+nguild_prt.gat,37,47,0 warp nprtg102-1 1,1,nguild_prt.gat,45,34
+nguild_prt.gat,37,54,0 warp nprtg103 1,1,nguild_prt.gat,192,119
+nguild_prt.gat,41,34,0 warp nprtg102 1,1,nguild_prt.gat,40,47
+nguild_prt.gat,51,70,0 warp nprtg105 1,1,nguild_prt.gat,202,92
+nguild_prt.gat,57,19,0 warp nprtg101 1,1,nguild_prt.gat,80,49
+nguild_prt.gat,62,34,0 warp nprtg108 1,1,nguild_prt.gat,192,119
+nguild_prt.gat,71,54,0 warp nprtg104 1,1,nguild_prt.gat,192,65
+nguild_prt.gat,75,183,0 warp nprtg106-1 1,1,nguild_prt.gat,147,116
+nguild_prt.gat,84,19,0 warp nprtg109 1,1,nguild_prt.gat,192,65
+nguild_prt.gat,84,49,0 warp nprtg101-1 1,1,nguild_prt.gat,61,19
+
+//Guild Dungeons
+gld_dun01.gat,119,14,0 warp gldd_001 1,1,pay_gld.gat,53,141
+gld_dun02.gat,180,112,0 warp gldd_002 1,1,alde_gld.gat,242,121
+gld_dun02.gat,20,160,0 warp gldd_003 1,1,alde_gld.gat,229,185
+gld_dun03.gat,42,30,0 warp gldd_004 1,1,prt_gld.gat,63,66
+gld_dun03.gat,238,274,0 warp gldd_005 1,1,prt_gld.gat,252,247
+gld_dun04.gat,37,230,0 warp gldd_006 1,1,gef_fild13.gat,42,331
+gld_dun04.gat,110,20,0 warp gldd_007 1,1,gef_fild13.gat,373,62
diff --git a/npc/warps/other/airplane.txt b/npc/warps/other/airplane.txt
index 5cb80e63f..e7cc8357f 100644
--- a/npc/warps/other/airplane.txt
+++ b/npc/warps/other/airplane.txt
@@ -1,79 +1,79 @@
-//===== Athena Script ========================================
-//= Airports & Airplanes Warp Script
-//===== By: ==================================================
-//= Sara-chan (1.0), SSUNNY@YOUNG(1.6)
-//===== Current Version: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for All Airplanes and Airports
-//===== Additional Comments: =================================
-//= Not really sure where this belongs, feel free to move
-//= it to wherever suits the script better ^^; [Celest]
-//= 1.3 Removed warps dupes from other files.
-//= disabled direct warp to airplane [Lupus]
-//= 1.4 added some warps as recomended by Justin84 [Skotlex]
-//= (those commented are direct warps into the airplanes, left here
-//= temporarily since the NPC isn't quite there yet)
-//= 1.5 Uncomented the airplane warps and remove two unnecessary ones [MasterOfMuppets]
-//= 1.6 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
-//= 1.61 Corrected the first einbroch warp [Zephiris]
-//= 1.7 Corrected Juno's Aiport entrance locations. [Musashiden]
-//============================================================
-
-//==========================================================================
-//Einbroch - Airport
-//==========================================================================
-einbroch.gat,92,280,0 warp ein_ap01 1,1,airplane.gat,224,64
-einbroch.gat,64,234,0 warp ein_ap02 1,1,airport.gat,138,51
-airport.gat,142,61,0 warp ein_ap02a 1,1,einbroch.gat,62,246
-airport.gat,124,13,0 warp ein_ap03 1,1,airport.gat,19,21
-airport.gat,19,18,0 warp ein_ap03a 1,1,airport.gat,122,16
-airport.gat,161,13,0 warp ein_ap04 1,1,airport.gat,47,21
-airport.gat,47,18,0 warp ein_ap04a 1,1,airport.gat,163,16
-airport.gat,143,14,0 warp ein_ap05 1,1,einbroch.gat,64,204
-einbroch.gat,64,207,0 warp ein_ap05a 1,1,airport.gat,143,17
-
-
-// -Lighthalzen Airport-
-lhz_airport.gat,125,14,0 warp lairp1 1,1,lhz_airport.gat,19,20
-lhz_airport.gat,19,18,0 warp lairp1a 1,1,lhz_airport.gat,123,14
-lhz_airport.gat,160,14,0 warp lairp2 1,1,lhz_airport.gat,48,20
-lhz_airport.gat,48,18,0 warp lairp2a 1,1,lhz_airport.gat,162,14
-lighthalzen.gat,267,76,0 warp lairp3 1,1,lhz_airport.gat,143,15
-lhz_airport.gat,143,13,0 warp lairp3a 1,1,lighthalzen.gat,265,76
-lhz_airport.gat,143,63,0 warp lairp4 1,1,lighthalzen.gat,296,76
-lighthalzen.gat,294,76,0 warp lairp4a 1,1,lhz_airport.gat,143,60
-lighthalzen.gat,308,76,0 warp lairp5 1,1,airplane.gat,224,64
-
-
-// -Juno Airport-
-y_airport.gat,125,14,0 warp jairp1 1,1,y_airport.gat,19,20
-y_airport.gat,19,18,0 warp jairp1a 1,1,y_airport.gat,123,14
-y_airport.gat,160,14,0 warp jairp2 1,1,y_airport.gat,48,20
-y_airport.gat,48,18,0 warp jairp2a 1,1,y_airport.gat,162,14
-yuno.gat,53,214,0 warp jairp3 1,1,y_airport.gat,143,23
-y_airport.gat,143,16,0 warp jairp3a 1,1,yuno.gat,52,207
-yuno.gat,52,238,0 warp jairp4a 1,1,y_airport.gat,143,60
-yuno.gat,55,238,0 warp jairp5a 1,1,y_airport.gat,143,60
-yuno.gat,8,261,0 warp jairp6 1,1,airplane_01.gat,224,64
-yuno.gat,97,260,0 warp jairp7 1,1,airplane.gat,224,64
-
-
-//=========================================================================
-//Airplane
-//=========================================================================
-airplane.gat,254,54,0 warp air_1wp01 1,1,airplane.gat,91,67
-airplane.gat,87,67,0 warp air_1wp01a 1,1,airplane.gat,250,54
-airplane.gat,208,53,0 warp air_1wp02 1,1,airplane.gat,239,160
-airplane.gat,245,160,0 warp air_1wp02a 1,1,airplane.gat,214,54
-
-airplane_01.gat,254,54,0 warp air_2wp01 1,1,airplane_01.gat,91,67
-airplane_01.gat,87,67,0 warp air_2wp01a 1,1,airplane_01.gat,250,54
-airplane_01.gat,208,53,0 warp air_2wp02 1,1,airplane_01.gat,239,160
-airplane_01.gat,245,160,0 warp air_2wp02a 1,1,airplane_01.gat,214,54
-airplane_01.gat,104,199,0 warp air_2wp03 1,1,airplane_01.gat,105,72
-airplane_01.gat,103,72,0 warp air_2wp03a 1,1,airplane_01.gat,102,199
-airplane_01.gat,104,176,0 warp air_2wp04 1,1,airplane_01.gat,105,52
-airplane_01.gat,103,52,0 warp air_2wp04a 1,1,airplane_01.gat,102,176
+//===== Athena Script ========================================
+//= Airports & Airplanes Warp Script
+//===== By: ==================================================
+//= Sara-chan (1.0), SSUNNY@YOUNG(1.6)
+//===== Current Version: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for All Airplanes and Airports
+//===== Additional Comments: =================================
+//= Not really sure where this belongs, feel free to move
+//= it to wherever suits the script better ^^; [Celest]
+//= 1.3 Removed warps dupes from other files.
+//= disabled direct warp to airplane [Lupus]
+//= 1.4 added some warps as recomended by Justin84 [Skotlex]
+//= (those commented are direct warps into the airplanes, left here
+//= temporarily since the NPC isn't quite there yet)
+//= 1.5 Uncomented the airplane warps and remove two unnecessary ones [MasterOfMuppets]
+//= 1.6 Updated Warps, work done by SSUNNY@YOUNG in Korean eA site [Vicious]
+//= 1.61 Corrected the first einbroch warp [Zephiris]
+//= 1.7 Corrected Juno's Aiport entrance locations. [Musashiden]
+//============================================================
+
+//==========================================================================
+//Einbroch - Airport
+//==========================================================================
+einbroch.gat,92,280,0 warp ein_ap01 1,1,airplane.gat,224,64
+einbroch.gat,64,234,0 warp ein_ap02 1,1,airport.gat,138,51
+airport.gat,142,61,0 warp ein_ap02a 1,1,einbroch.gat,62,246
+airport.gat,124,13,0 warp ein_ap03 1,1,airport.gat,19,21
+airport.gat,19,18,0 warp ein_ap03a 1,1,airport.gat,122,16
+airport.gat,161,13,0 warp ein_ap04 1,1,airport.gat,47,21
+airport.gat,47,18,0 warp ein_ap04a 1,1,airport.gat,163,16
+airport.gat,143,14,0 warp ein_ap05 1,1,einbroch.gat,64,204
+einbroch.gat,64,207,0 warp ein_ap05a 1,1,airport.gat,143,17
+
+
+// -Lighthalzen Airport-
+lhz_airport.gat,125,14,0 warp lairp1 1,1,lhz_airport.gat,19,20
+lhz_airport.gat,19,18,0 warp lairp1a 1,1,lhz_airport.gat,123,14
+lhz_airport.gat,160,14,0 warp lairp2 1,1,lhz_airport.gat,48,20
+lhz_airport.gat,48,18,0 warp lairp2a 1,1,lhz_airport.gat,162,14
+lighthalzen.gat,267,76,0 warp lairp3 1,1,lhz_airport.gat,143,15
+lhz_airport.gat,143,13,0 warp lairp3a 1,1,lighthalzen.gat,265,76
+lhz_airport.gat,143,63,0 warp lairp4 1,1,lighthalzen.gat,296,76
+lighthalzen.gat,294,76,0 warp lairp4a 1,1,lhz_airport.gat,143,60
+lighthalzen.gat,308,76,0 warp lairp5 1,1,airplane.gat,224,64
+
+
+// -Juno Airport-
+y_airport.gat,125,14,0 warp jairp1 1,1,y_airport.gat,19,20
+y_airport.gat,19,18,0 warp jairp1a 1,1,y_airport.gat,123,14
+y_airport.gat,160,14,0 warp jairp2 1,1,y_airport.gat,48,20
+y_airport.gat,48,18,0 warp jairp2a 1,1,y_airport.gat,162,14
+yuno.gat,53,214,0 warp jairp3 1,1,y_airport.gat,143,23
+y_airport.gat,143,16,0 warp jairp3a 1,1,yuno.gat,52,207
+yuno.gat,52,238,0 warp jairp4a 1,1,y_airport.gat,143,60
+yuno.gat,55,238,0 warp jairp5a 1,1,y_airport.gat,143,60
+yuno.gat,8,261,0 warp jairp6 1,1,airplane_01.gat,224,64
+yuno.gat,97,260,0 warp jairp7 1,1,airplane.gat,224,64
+
+
+//=========================================================================
+//Airplane
+//=========================================================================
+airplane.gat,254,54,0 warp air_1wp01 1,1,airplane.gat,91,67
+airplane.gat,87,67,0 warp air_1wp01a 1,1,airplane.gat,250,54
+airplane.gat,208,53,0 warp air_1wp02 1,1,airplane.gat,239,160
+airplane.gat,245,160,0 warp air_1wp02a 1,1,airplane.gat,214,54
+
+airplane_01.gat,254,54,0 warp air_2wp01 1,1,airplane_01.gat,91,67
+airplane_01.gat,87,67,0 warp air_2wp01a 1,1,airplane_01.gat,250,54
+airplane_01.gat,208,53,0 warp air_2wp02 1,1,airplane_01.gat,239,160
+airplane_01.gat,245,160,0 warp air_2wp02a 1,1,airplane_01.gat,214,54
+airplane_01.gat,104,199,0 warp air_2wp03 1,1,airplane_01.gat,105,72
+airplane_01.gat,103,72,0 warp air_2wp03a 1,1,airplane_01.gat,102,199
+airplane_01.gat,104,176,0 warp air_2wp04 1,1,airplane_01.gat,105,52
+airplane_01.gat,103,52,0 warp air_2wp04a 1,1,airplane_01.gat,102,176
diff --git a/npc/warps/other/arena.txt b/npc/warps/other/arena.txt
index 481a3b442..ac7bf7d8f 100644
--- a/npc/warps/other/arena.txt
+++ b/npc/warps/other/arena.txt
@@ -1,28 +1,28 @@
-//============================================================
-//===== Athena Script ========================================
-//= Arena Warps
-//===== By: ==================================================
-//= SinSloth
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points related to Izlude Arena && Control Panel(to come)
-//===== Additional Comments: =================================
-//= 1.0 First version, done by SinSloth. [MasterOfMuppets]
-//============================================================
-
-izlude.gat,128,126,0 warp welcome_arena 1,1,arena_room.gat,100,30
-arena_room.gat,99,24,0 warp bye_arena 2,2,izlude.gat,128,220
-arena_room.gat,84,103,0 warp arn_room_11_1 1,1,arena_room.gat,63,130
-arena_room.gat,63,126,0 warp arn_room_11_2 1,1,arena_room.gat,87,100
-arena_room.gat,76,87,0 warp arn_room_9_1 1,1,arena_room.gat,46,87
-arena_room.gat,49,87,0 warp arn_room_9_2 1,1,arena_room.gat,78,87
-arena_room.gat,84,71,0 warp arn_room_7_1 1,1,arena_room.gat,60,50
-arena_room.gat,63,53,0 warp arn_room_7_2 1,1,arena_room.gat,86,74
-arena_room.gat,115,71,0 warp arn_room_5_1 1,1,arena_room.gat,139,50
-arena_room.gat,136,53,0 warp arn_room_5_2 1,1,arena_room.gat,113,74
-arena_room.gat,123,88,0 warp arn_room_3_1 1,1,arena_room.gat,153,87
-arena_room.gat,150,87,0 warp arn_room_3_2 1,1,arena_room.gat,120,87
-prt_are_in.gat,54,13,0 warp toarn_room 1,1,arena_room.gat,100,77
+//============================================================
+//===== Athena Script ========================================
+//= Arena Warps
+//===== By: ==================================================
+//= SinSloth
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points related to Izlude Arena && Control Panel(to come)
+//===== Additional Comments: =================================
+//= 1.0 First version, done by SinSloth. [MasterOfMuppets]
+//============================================================
+
+izlude.gat,128,126,0 warp welcome_arena 1,1,arena_room.gat,100,30
+arena_room.gat,99,24,0 warp bye_arena 2,2,izlude.gat,128,220
+arena_room.gat,84,103,0 warp arn_room_11_1 1,1,arena_room.gat,63,130
+arena_room.gat,63,126,0 warp arn_room_11_2 1,1,arena_room.gat,87,100
+arena_room.gat,76,87,0 warp arn_room_9_1 1,1,arena_room.gat,46,87
+arena_room.gat,49,87,0 warp arn_room_9_2 1,1,arena_room.gat,78,87
+arena_room.gat,84,71,0 warp arn_room_7_1 1,1,arena_room.gat,60,50
+arena_room.gat,63,53,0 warp arn_room_7_2 1,1,arena_room.gat,86,74
+arena_room.gat,115,71,0 warp arn_room_5_1 1,1,arena_room.gat,139,50
+arena_room.gat,136,53,0 warp arn_room_5_2 1,1,arena_room.gat,113,74
+arena_room.gat,123,88,0 warp arn_room_3_1 1,1,arena_room.gat,153,87
+arena_room.gat,150,87,0 warp arn_room_3_2 1,1,arena_room.gat,120,87
+prt_are_in.gat,54,13,0 warp toarn_room 1,1,arena_room.gat,100,77
diff --git a/npc/warps/other/god.txt b/npc/warps/other/god.txt
index 8decc2e1e..447b42213 100644
--- a/npc/warps/other/god.txt
+++ b/npc/warps/other/god.txt
@@ -1,22 +1,22 @@
-//===== Athena Script ========================================
-//= God Seal Quest Warps
-//===== By: ==================================================
-//= MasterOfMuppets && SinSloth
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= Warp Points related to the God Seal Quest.
-//===== Additional Comments: =================================
-//= 1.0 Added some warps of the Sleipnir part [SinSloth]
-//============================================================
-
-yuno.gat,218,180,0 warp yuno_god01 1,1,que_god01.gat,99,84
-que_god01.gat,99,81,0 warp god01_yuno 1,1,yuno.gat,218,177
-que_god01.gat,63,88,0 warp god_sl_w0-1 1,1,que_god01.gat,87,92
-que_god01.gat,62,116,0 warp god_sl_w1-1 1,1,que_god01.gat,46,94
-que_god01.gat,12,116,0 warp god_sl_w2-1 1,1,que_god01.gat,16,94
-que_god01.gat,12,55,0 warp god_sl_w3-1 1,1,que_god01.gat,17,83
-que_god01.gat,50,55,0 warp god_sl_w4-1 1,1,que_god01.gat,47,83
-
+//===== Athena Script ========================================
+//= God Seal Quest Warps
+//===== By: ==================================================
+//= MasterOfMuppets && SinSloth
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= Warp Points related to the God Seal Quest.
+//===== Additional Comments: =================================
+//= 1.0 Added some warps of the Sleipnir part [SinSloth]
+//============================================================
+
+yuno.gat,218,180,0 warp yuno_god01 1,1,que_god01.gat,99,84
+que_god01.gat,99,81,0 warp god01_yuno 1,1,yuno.gat,218,177
+que_god01.gat,63,88,0 warp god_sl_w0-1 1,1,que_god01.gat,87,92
+que_god01.gat,62,116,0 warp god_sl_w1-1 1,1,que_god01.gat,46,94
+que_god01.gat,12,116,0 warp god_sl_w2-1 1,1,que_god01.gat,16,94
+que_god01.gat,12,55,0 warp god_sl_w3-1 1,1,que_god01.gat,17,83
+que_god01.gat,50,55,0 warp god_sl_w4-1 1,1,que_god01.gat,47,83
+
diff --git a/npc/warps/other/jobquests.txt b/npc/warps/other/jobquests.txt
index fc0141290..6380f805f 100644
--- a/npc/warps/other/jobquests.txt
+++ b/npc/warps/other/jobquests.txt
@@ -1,122 +1,122 @@
-//===== Athena Script ========================================
-//= Job Quest Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Version Ep4+
-//===== Description: =========================================
-//= Warp Points for Job Quest Maps
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//= Commented some warps because new Job quests have correct
-//= ones! Added missing warps for Thief/Hunter/Swordman [Lupus]
-//= 1.3 Added missing warps Swordman [Lupus]
-//= Reorganized. Added complete rogue quest warps.
-//= Removed unused, duplicate warps. [kobra_k88]
-//= 1.3b activated Dancer JQ warp [Lupus]
-//= 1.4 Imported damn noobie warps from jAthena (because it's broken since last year)
-//= 1.5 Replaced clone maps with the real ones [Lupus]
-//============================================================
-
-
-//==============================================================================
-//Novice
-//==============================================================================
-new_zone01.gat,148,112,0 warp newwarp6001 2,2,new_zone02.gat,100,9
-new_zone02.gat,100,6,0 warp newwarp6002 2,2,new_zone01.gat,144,112
-new_zone02.gat,126,106,0 warp newwarp6003 2,2,new_zone02.gat,160,171
-new_zone02.gat,156,171,0 warp newwarp6004 2,2,new_zone02.gat,123,106
-new_zone02.gat,73,106,0 warp newwarp6005 2,2,new_zone02.gat,41,172
-new_zone02.gat,46,172,0 warp newwarp6006 2,2,new_zone02.gat,78,106
-
-//==============================================================================
-//Swordman
-//==============================================================================
-job_sword1.gat,192,244,0 warp SwordWarp0 2,2,job_sword1.gat,215,244
-job_sword1.gat,223,243,0 warp SwordWarp1 2,2,job_sword1.gat,12,206
-job_sword1.gat,192,206,0 warp SwordWarp2 2,2,job_sword1.gat,215,205
-job_sword1.gat,223,205,0 warp SwordWarp3 2,2,job_sword1.gat,12,168
-job_sword1.gat,192,168,0 warp SwordWarp4 2,2,job_sword1.gat,215,167
-// Underground cave
-job_sword1.gat,65,117,0 warp swd101 1,1,job_sword1.gat,10,245
-job_sword1.gat,98,27,0 warp swd102 1,1,job_sword1.gat,11,207
-job_sword1.gat,161,27,0 warp swd103 1,1,job_sword1.gat,11,207
-job_sword1.gat,239,117,0 warp swd106 1,1,job_sword1.gat,11,169
-
-//==============================================================================
-//Thief
-//==============================================================================
-job_thief1.gat,180,15,0 warp jthf 7,1,moc_ruins.gat,145,117
-
-
-//==============================================================================
-// Assassin
-//==============================================================================
-in_moc_16.gat,18,8,0 warp guild_to_16 2,2,moc_fild16.gat,205,291
-moc_fild16.gat,205,296,0 warp 16_to_guild 2,2,in_moc_16.gat,18,11
-
-//==============================================================================
-// Hunter
-//==============================================================================
-in_hunter.gat,100,15,0 warp jhun01 0,0,pay_fild10.gat,143,250
-
-
-
-//==============================================================================
-// Monk (St. Capitolina Abbey)
-//==============================================================================
-prt_monk.gat,192,172,0 warp monk15 1,1,monk_test.gat,329,50
-monk_test.gat,329,47,0 warp monk16 1,1,prt_monk.gat,193,166
-monk_test.gat,329,76,0 warp monk17 1,1,monk_test.gat,259,118
-monk_test.gat,259,115,0 warp monk18 1,1,monk_test.gat,329,71
-monk_test.gat,272,125,0 warp monk19 1,1,monk_test.gat,301,127
-monk_test.gat,298,127,0 warp monk20 1,1,monk_test.gat,268,125
-
-//==============================================================================
-//Alchemist
-//==============================================================================
-//Town - Alchemist , Alchemist - Town
-aldebaran.gat,54,66,0 warp alche01 1,1,alde_alche.gat,41,174
-alde_alche.gat,41,171,0 warp alche02 1,1,aldebaran.gat,56,68
-//Alchemist Hall 1st Floor Top Rooms
-alde_alche.gat,129,104,0 warp alche03 1,1,alde_alche.gat,163,163
-alde_alche.gat,159,163,0 warp alche04 1,1,alde_alche.gat,126,104
-alde_alche.gat,131,77,0 warp alche05 1,1,alde_alche.gat,162,107
-alde_alche.gat,159,107,0 warp alche06 1,1,alde_alche.gat,128,77
-//Alchemist Hall 1st Floor Bottom Rooms
-alde_alche.gat,47,103,0 warp alche07 1,1,alde_alche.gat,88,18
-alde_alche.gat,92,18,0 warp alche08 1,1,alde_alche.gat,50,103
-alde_alche.gat,47,77,0 warp alche09 1,1,alde_alche.gat,155,18
-alde_alche.gat,159,18,0 warp alche10 1,1,alde_alche.gat,50,77
-//Alchemist Hall 2nd Floor - 1st Floor Link
-alde_alche.gat,14,184,0 warp alche11 1,1,alde_alche.gat,88,113
-alde_alche.gat,88,117,0 warp alche12 1,1,alde_alche.gat,14,180
-//Alchemist Hall 2nd Floor Rooms
-alde_alche.gat,19,171,0 warp alche13 1,1,aldebaran.gat,68,56
-aldebaran.gat,66,54,0 warp alche14 1,1,alde_alche.gat,19,175
-alde_alche.gat,18,28,0 warp alche15 1,1,alde_alche.gat,89,66
-alde_alche.gat,89,63,0 warp alche16 1,1,alde_alche.gat,18,24
-//Alchemist Hall 3rd Floor
-alde_alche.gat,41,187,0 warp alche17 1,1,alde_alche.gat,114,178
-alde_alche.gat,114,182,0 warp alche18 1,1,alde_alche.gat,41,183
-
-//==============================================================================
-//Rogue
-//==============================================================================
-cmd_fild07.gat,193,117,0 warp fild07-rogue00 1,1,in_rogue.gat,378,46
-in_rogue.gat,375,46,0 warp rogue00-fild07 1,1,cmd_fild07.gat,195,116
-in_rogue.gat,376,34,0 warp rogue01-02 1,1,in_rogue.gat,378,125
-in_rogue.gat,375,125,0 warp rogue02-01 1,1,in_rogue.gat,379,34
-cmd_fild07.gat,352,275,0 warp fild07-rogue03 1,1,in_rogue.gat,265,122
-in_rogue.gat,265,118,0 warp rogue03-fild07 1,1,cmd_fild07.gat,349,275
-in_rogue.gat,244,20,0 warp rogue04-fild09 1,1,cmd_fild09.gat,106,192
-in_rogue.gat,172,34,0 warp rogue05-fild09 1,1,cmd_fild09.gat,339,143
-in_rogue.gat,160,103,0 warp rogue06-fild04 1,1,cmd_fild04.gat,301,177
-
-//==============================================================================
-//Dancer
-//==============================================================================
-//job_duncer.gat,69,43,0 warp duncer1 1,1,comodo.gat,185,156
-job_duncer.gat,70,45,0 warp duncer1 2,2,comodo.gat,193,149
+//===== Athena Script ========================================
+//= Job Quest Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Version Ep4+
+//===== Description: =========================================
+//= Warp Points for Job Quest Maps
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//= Commented some warps because new Job quests have correct
+//= ones! Added missing warps for Thief/Hunter/Swordman [Lupus]
+//= 1.3 Added missing warps Swordman [Lupus]
+//= Reorganized. Added complete rogue quest warps.
+//= Removed unused, duplicate warps. [kobra_k88]
+//= 1.3b activated Dancer JQ warp [Lupus]
+//= 1.4 Imported damn noobie warps from jAthena (because it's broken since last year)
+//= 1.5 Replaced clone maps with the real ones [Lupus]
+//============================================================
+
+
+//==============================================================================
+//Novice
+//==============================================================================
+new_zone01.gat,148,112,0 warp newwarp6001 2,2,new_zone02.gat,100,9
+new_zone02.gat,100,6,0 warp newwarp6002 2,2,new_zone01.gat,144,112
+new_zone02.gat,126,106,0 warp newwarp6003 2,2,new_zone02.gat,160,171
+new_zone02.gat,156,171,0 warp newwarp6004 2,2,new_zone02.gat,123,106
+new_zone02.gat,73,106,0 warp newwarp6005 2,2,new_zone02.gat,41,172
+new_zone02.gat,46,172,0 warp newwarp6006 2,2,new_zone02.gat,78,106
+
+//==============================================================================
+//Swordman
+//==============================================================================
+job_sword1.gat,192,244,0 warp SwordWarp0 2,2,job_sword1.gat,215,244
+job_sword1.gat,223,243,0 warp SwordWarp1 2,2,job_sword1.gat,12,206
+job_sword1.gat,192,206,0 warp SwordWarp2 2,2,job_sword1.gat,215,205
+job_sword1.gat,223,205,0 warp SwordWarp3 2,2,job_sword1.gat,12,168
+job_sword1.gat,192,168,0 warp SwordWarp4 2,2,job_sword1.gat,215,167
+// Underground cave
+job_sword1.gat,65,117,0 warp swd101 1,1,job_sword1.gat,10,245
+job_sword1.gat,98,27,0 warp swd102 1,1,job_sword1.gat,11,207
+job_sword1.gat,161,27,0 warp swd103 1,1,job_sword1.gat,11,207
+job_sword1.gat,239,117,0 warp swd106 1,1,job_sword1.gat,11,169
+
+//==============================================================================
+//Thief
+//==============================================================================
+job_thief1.gat,180,15,0 warp jthf 7,1,moc_ruins.gat,145,117
+
+
+//==============================================================================
+// Assassin
+//==============================================================================
+in_moc_16.gat,18,8,0 warp guild_to_16 2,2,moc_fild16.gat,205,291
+moc_fild16.gat,205,296,0 warp 16_to_guild 2,2,in_moc_16.gat,18,11
+
+//==============================================================================
+// Hunter
+//==============================================================================
+in_hunter.gat,100,15,0 warp jhun01 0,0,pay_fild10.gat,143,250
+
+
+
+//==============================================================================
+// Monk (St. Capitolina Abbey)
+//==============================================================================
+prt_monk.gat,192,172,0 warp monk15 1,1,monk_test.gat,329,50
+monk_test.gat,329,47,0 warp monk16 1,1,prt_monk.gat,193,166
+monk_test.gat,329,76,0 warp monk17 1,1,monk_test.gat,259,118
+monk_test.gat,259,115,0 warp monk18 1,1,monk_test.gat,329,71
+monk_test.gat,272,125,0 warp monk19 1,1,monk_test.gat,301,127
+monk_test.gat,298,127,0 warp monk20 1,1,monk_test.gat,268,125
+
+//==============================================================================
+//Alchemist
+//==============================================================================
+//Town - Alchemist , Alchemist - Town
+aldebaran.gat,54,66,0 warp alche01 1,1,alde_alche.gat,41,174
+alde_alche.gat,41,171,0 warp alche02 1,1,aldebaran.gat,56,68
+//Alchemist Hall 1st Floor Top Rooms
+alde_alche.gat,129,104,0 warp alche03 1,1,alde_alche.gat,163,163
+alde_alche.gat,159,163,0 warp alche04 1,1,alde_alche.gat,126,104
+alde_alche.gat,131,77,0 warp alche05 1,1,alde_alche.gat,162,107
+alde_alche.gat,159,107,0 warp alche06 1,1,alde_alche.gat,128,77
+//Alchemist Hall 1st Floor Bottom Rooms
+alde_alche.gat,47,103,0 warp alche07 1,1,alde_alche.gat,88,18
+alde_alche.gat,92,18,0 warp alche08 1,1,alde_alche.gat,50,103
+alde_alche.gat,47,77,0 warp alche09 1,1,alde_alche.gat,155,18
+alde_alche.gat,159,18,0 warp alche10 1,1,alde_alche.gat,50,77
+//Alchemist Hall 2nd Floor - 1st Floor Link
+alde_alche.gat,14,184,0 warp alche11 1,1,alde_alche.gat,88,113
+alde_alche.gat,88,117,0 warp alche12 1,1,alde_alche.gat,14,180
+//Alchemist Hall 2nd Floor Rooms
+alde_alche.gat,19,171,0 warp alche13 1,1,aldebaran.gat,68,56
+aldebaran.gat,66,54,0 warp alche14 1,1,alde_alche.gat,19,175
+alde_alche.gat,18,28,0 warp alche15 1,1,alde_alche.gat,89,66
+alde_alche.gat,89,63,0 warp alche16 1,1,alde_alche.gat,18,24
+//Alchemist Hall 3rd Floor
+alde_alche.gat,41,187,0 warp alche17 1,1,alde_alche.gat,114,178
+alde_alche.gat,114,182,0 warp alche18 1,1,alde_alche.gat,41,183
+
+//==============================================================================
+//Rogue
+//==============================================================================
+cmd_fild07.gat,193,117,0 warp fild07-rogue00 1,1,in_rogue.gat,378,46
+in_rogue.gat,375,46,0 warp rogue00-fild07 1,1,cmd_fild07.gat,195,116
+in_rogue.gat,376,34,0 warp rogue01-02 1,1,in_rogue.gat,378,125
+in_rogue.gat,375,125,0 warp rogue02-01 1,1,in_rogue.gat,379,34
+cmd_fild07.gat,352,275,0 warp fild07-rogue03 1,1,in_rogue.gat,265,122
+in_rogue.gat,265,118,0 warp rogue03-fild07 1,1,cmd_fild07.gat,349,275
+in_rogue.gat,244,20,0 warp rogue04-fild09 1,1,cmd_fild09.gat,106,192
+in_rogue.gat,172,34,0 warp rogue05-fild09 1,1,cmd_fild09.gat,339,143
+in_rogue.gat,160,103,0 warp rogue06-fild04 1,1,cmd_fild04.gat,301,177
+
+//==============================================================================
+//Dancer
+//==============================================================================
+//job_duncer.gat,69,43,0 warp duncer1 1,1,comodo.gat,185,156
+job_duncer.gat,70,45,0 warp duncer1 2,2,comodo.gat,193,149
diff --git a/npc/warps/other/kiel.txt b/npc/warps/other/kiel.txt
index e2acb222c..0cdfe6c61 100644
--- a/npc/warps/other/kiel.txt
+++ b/npc/warps/other/kiel.txt
@@ -1,113 +1,113 @@
-//===== Athena Script ========================================
-//= Kiel Warp Script (Kiel Buildings)
-//===== By: ==================================================
-//= Playtester
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points for all Kiel Buildings
-//===== Additional Comments: =================================
-//= 1.0 Added Kiel warps thanks to Celestria [Playtester]
-//= 1.1 Added more warps thanks to Celestria [Playtester]
-//============================================================
-
-
-//============================================================
-// kh_school
-//============================================================
-//Entrance Level
-kh_school.gat,77,155,0 warp school01 1,1,yuno_fild08.gat,154,189
-kh_school.gat,30,184,0 warp school02 1,1,kh_school.gat,63,75
-kh_school.gat,30,125,0 warp school03 1,1,kh_school.gat,63,14
-kh_school.gat,34,177,0 warp school04 1,1,kh_school.gat,147,57
-kh_school.gat,34,133,0 warp school05 1,1,kh_school.gat,147,17
-//Basement Level
-kh_school.gat,153,57,0 warp school06 1,1,kh_school.gat,39,177
-kh_school.gat,153,17,0 warp school07 1,1,kh_school.gat,39,133
-//Upper Level
-kh_school.gat,71,75,0 warp school08 1,1,kh_school.gat,39,184
-kh_school.gat,71,14,0 warp school09 1,1,kh_school.gat,39,125
-kh_school.gat,12,48,0 warp school10 1,1,kh_school.gat,182,117
-kh_school.gat,187,117,0 warp school11 1,1,kh_school.gat,17,48
-//Detention Room
-kh_school.gat,63,80,0 warp school12 1,1,kh_school.gat,118,144
-kh_school.gat,118,139,0 warp school13 1,1,kh_school.gat,63,75
-//Yuno Field
-yuno_fild08.gat,148,189,0 warp school14 1,1,kh_school.gat,71,158
-
-//============================================================
-// kh_vila
-//============================================================
-//Entrance
-yuno_fild02.gat,92,213,0 warp vila18 1,1,kh_vila.gat,79,14
-//Entrance Hall
-kh_vila.gat,79,10,0 warp vila01 1,1,yuno_fild02.gat,92,208
-kh_vila.gat,70,38,0 warp vila02 1,1,kh_vila.gat,43,38
-kh_vila.gat,70,54,0 warp vila03 1,1,kh_vila.gat,43,55
-kh_vila.gat,91,49,0 warp vila04 1,1,kh_vila.gat,118,47
-kh_vila.gat,84,67,0 warp vila05 1,1,kh_vila.gat,45,106
-//Lounge and Atrium
-kh_vila.gat,47,39,0 warp vila06 1,1,kh_vila.gat,74,38
-kh_vila.gat,47,55,0 warp vila07 1,1,kh_vila.gat,74,54
-kh_vila.gat,34,67,0 warp vila08 1,1,kh_vila.gat,20,106
-//Dining Room, Kitchen, Store Room
-kh_vila.gat,20,102,0 warp vila09 1,1,kh_vila.gat,34,63
-kh_vila.gat,45,102,0 warp vila10 1,1,kh_vila.gat,84,63
-kh_vila.gat,32,129,0 warp vila11 1,1,kh_vila.gat,22,170
-kh_vila.gat,22,166,0 warp vila12 1,1,kh_vila.gat,32,125
-kh_vila.gat,27,189,0 warp vila13 1,1,kh_vila.gat,185,18
-kh_vila.gat,191,18,0 warp vila14 1,1,kh_vila.gat,27,185
-//Stairwell and Upstairs
-kh_vila.gat,114,47,0 warp vila15 1,1,kh_vila.gat,86,49
-kh_vila.gat,126,76,0 warp vila16 1,1,kh_vila.gat,180,175
-kh_vila.gat,180,170,0 warp vila17 1,1,kh_vila.gat,127,71
-
-kh_vila.gat,174,72,0 warp vila19 1,1,kh_vila.gat,181,125
-
-
-//============================================================
-// kh_rossi - House of the Losimier family
-//============================================================
-//Entrance Level
-//???.gat,???,???,0 warp rossi01 1,1,kh_rossi.gat,17,93
-//kh_rossi.gat,12,93,0 warp rossi02 1,1,???.gat,???,???
-kh_rossi.gat,35,99,0 warp rossi03 1,1,kh_rossi.gat,27,146
-kh_rossi.gat,27,142,0 warp rossi04 1,1,kh_rossi.gat,35,95
-kh_rossi.gat,35,86,0 warp rossi05 1,1,kh_rossi.gat,27,39
-kh_rossi.gat,27,43,0 warp rossi06 1,1,kh_rossi.gat,35,90
-kh_rossi.gat,63,86,0 warp rossi07 1,1,kh_rossi.gat,99,39
-kh_rossi.gat,99,43,0 warp rossi08 1,1,kh_rossi.gat,63,90
-kh_rossi.gat,90,86,0 warp rossi09 1,1,kh_rossi.gat,168,31
-kh_rossi.gat,168,35,0 warp rossi10 1,1,kh_rossi.gat,90,90
-kh_rossi.gat,43,26,0 warp rossi11 1,1,kh_rossi.gat,90,25
-kh_rossi.gat,86,25,0 warp rossi12 1,1,kh_rossi.gat,37,26
-kh_rossi.gat,91,101,0 warp rossi13 1,1,kh_rossi.gat,282,65
-
-//Upper Level
-kh_rossi.gat,282,60,0 warp rossi14 1,1,kh_rossi.gat,91,95
-kh_rossi.gat,222,24,0 warp rossi15 1,1,kh_rossi.gat,22,219
-kh_rossi.gat,22,223,0 warp rossi16 1,1,kh_rossi.gat,222,28
-kh_rossi.gat,248,24,0 warp rossi17 1,1,kh_rossi.gat,88,219
-kh_rossi.gat,88,223,0 warp rossi18 1,1,kh_rossi.gat,248,28
-kh_rossi.gat,258,46,0 warp rossi19 1,1,kh_rossi.gat,225,235
-kh_rossi.gat,222,69,0 warp rossi20 1,1,kh_rossi.gat,22,276
-kh_rossi.gat,22,272,0 warp rossi21 1,1,kh_rossi.gat,222,65
-kh_rossi.gat,248,69,0 warp rossi21 1,1,kh_rossi.gat,88,276
-kh_rossi.gat,88,272,0 warp rossi23 1,1,kh_rossi.gat,248,65
-
-//Hallway
-kh_rossi.gat,229,235,0 warp rossi24 1,1,kh_rossi.gat,263,46
-kh_rossi.gat,188,239,0 warp rossi25 1,1,kh_rossi.gat,148,281
-kh_rossi.gat,148,278,0 warp rossi26 1,1,kh_rossi.gat,188,235
-kh_rossi.gat,204,239,0 warp rossi27 1,1,kh_rossi.gat,204,281
-kh_rossi.gat,204,278,0 warp rossi28 1,1,kh_rossi.gat,204,235
-kh_rossi.gat,220,239,0 warp rossi29 1,1,kh_rossi.gat,260,281
-kh_rossi.gat,260,278,0 warp rossi30 1,1,kh_rossi.gat,220,235
-kh_rossi.gat,188,230,0 warp rossi31 1,1,kh_rossi.gat,148,187
-kh_rossi.gat,148,191,0 warp rossi32 1,1,kh_rossi.gat,188,234
-kh_rossi.gat,204,230,0 warp rossi33 1,1,kh_rossi.gat,204,187
-kh_rossi.gat,204,191,0 warp rossi34 1,1,kh_rossi.gat,204,234
-kh_rossi.gat,220,230,0 warp rossi35 1,1,kh_rossi.gat,260,187
+//===== Athena Script ========================================
+//= Kiel Warp Script (Kiel Buildings)
+//===== By: ==================================================
+//= Playtester
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points for all Kiel Buildings
+//===== Additional Comments: =================================
+//= 1.0 Added Kiel warps thanks to Celestria [Playtester]
+//= 1.1 Added more warps thanks to Celestria [Playtester]
+//============================================================
+
+
+//============================================================
+// kh_school
+//============================================================
+//Entrance Level
+kh_school.gat,77,155,0 warp school01 1,1,yuno_fild08.gat,154,189
+kh_school.gat,30,184,0 warp school02 1,1,kh_school.gat,63,75
+kh_school.gat,30,125,0 warp school03 1,1,kh_school.gat,63,14
+kh_school.gat,34,177,0 warp school04 1,1,kh_school.gat,147,57
+kh_school.gat,34,133,0 warp school05 1,1,kh_school.gat,147,17
+//Basement Level
+kh_school.gat,153,57,0 warp school06 1,1,kh_school.gat,39,177
+kh_school.gat,153,17,0 warp school07 1,1,kh_school.gat,39,133
+//Upper Level
+kh_school.gat,71,75,0 warp school08 1,1,kh_school.gat,39,184
+kh_school.gat,71,14,0 warp school09 1,1,kh_school.gat,39,125
+kh_school.gat,12,48,0 warp school10 1,1,kh_school.gat,182,117
+kh_school.gat,187,117,0 warp school11 1,1,kh_school.gat,17,48
+//Detention Room
+kh_school.gat,63,80,0 warp school12 1,1,kh_school.gat,118,144
+kh_school.gat,118,139,0 warp school13 1,1,kh_school.gat,63,75
+//Yuno Field
+yuno_fild08.gat,148,189,0 warp school14 1,1,kh_school.gat,71,158
+
+//============================================================
+// kh_vila
+//============================================================
+//Entrance
+yuno_fild02.gat,92,213,0 warp vila18 1,1,kh_vila.gat,79,14
+//Entrance Hall
+kh_vila.gat,79,10,0 warp vila01 1,1,yuno_fild02.gat,92,208
+kh_vila.gat,70,38,0 warp vila02 1,1,kh_vila.gat,43,38
+kh_vila.gat,70,54,0 warp vila03 1,1,kh_vila.gat,43,55
+kh_vila.gat,91,49,0 warp vila04 1,1,kh_vila.gat,118,47
+kh_vila.gat,84,67,0 warp vila05 1,1,kh_vila.gat,45,106
+//Lounge and Atrium
+kh_vila.gat,47,39,0 warp vila06 1,1,kh_vila.gat,74,38
+kh_vila.gat,47,55,0 warp vila07 1,1,kh_vila.gat,74,54
+kh_vila.gat,34,67,0 warp vila08 1,1,kh_vila.gat,20,106
+//Dining Room, Kitchen, Store Room
+kh_vila.gat,20,102,0 warp vila09 1,1,kh_vila.gat,34,63
+kh_vila.gat,45,102,0 warp vila10 1,1,kh_vila.gat,84,63
+kh_vila.gat,32,129,0 warp vila11 1,1,kh_vila.gat,22,170
+kh_vila.gat,22,166,0 warp vila12 1,1,kh_vila.gat,32,125
+kh_vila.gat,27,189,0 warp vila13 1,1,kh_vila.gat,185,18
+kh_vila.gat,191,18,0 warp vila14 1,1,kh_vila.gat,27,185
+//Stairwell and Upstairs
+kh_vila.gat,114,47,0 warp vila15 1,1,kh_vila.gat,86,49
+kh_vila.gat,126,76,0 warp vila16 1,1,kh_vila.gat,180,175
+kh_vila.gat,180,170,0 warp vila17 1,1,kh_vila.gat,127,71
+
+kh_vila.gat,174,72,0 warp vila19 1,1,kh_vila.gat,181,125
+
+
+//============================================================
+// kh_rossi - House of the Losimier family
+//============================================================
+//Entrance Level
+//???.gat,???,???,0 warp rossi01 1,1,kh_rossi.gat,17,93
+//kh_rossi.gat,12,93,0 warp rossi02 1,1,???.gat,???,???
+kh_rossi.gat,35,99,0 warp rossi03 1,1,kh_rossi.gat,27,146
+kh_rossi.gat,27,142,0 warp rossi04 1,1,kh_rossi.gat,35,95
+kh_rossi.gat,35,86,0 warp rossi05 1,1,kh_rossi.gat,27,39
+kh_rossi.gat,27,43,0 warp rossi06 1,1,kh_rossi.gat,35,90
+kh_rossi.gat,63,86,0 warp rossi07 1,1,kh_rossi.gat,99,39
+kh_rossi.gat,99,43,0 warp rossi08 1,1,kh_rossi.gat,63,90
+kh_rossi.gat,90,86,0 warp rossi09 1,1,kh_rossi.gat,168,31
+kh_rossi.gat,168,35,0 warp rossi10 1,1,kh_rossi.gat,90,90
+kh_rossi.gat,43,26,0 warp rossi11 1,1,kh_rossi.gat,90,25
+kh_rossi.gat,86,25,0 warp rossi12 1,1,kh_rossi.gat,37,26
+kh_rossi.gat,91,101,0 warp rossi13 1,1,kh_rossi.gat,282,65
+
+//Upper Level
+kh_rossi.gat,282,60,0 warp rossi14 1,1,kh_rossi.gat,91,95
+kh_rossi.gat,222,24,0 warp rossi15 1,1,kh_rossi.gat,22,219
+kh_rossi.gat,22,223,0 warp rossi16 1,1,kh_rossi.gat,222,28
+kh_rossi.gat,248,24,0 warp rossi17 1,1,kh_rossi.gat,88,219
+kh_rossi.gat,88,223,0 warp rossi18 1,1,kh_rossi.gat,248,28
+kh_rossi.gat,258,46,0 warp rossi19 1,1,kh_rossi.gat,225,235
+kh_rossi.gat,222,69,0 warp rossi20 1,1,kh_rossi.gat,22,276
+kh_rossi.gat,22,272,0 warp rossi21 1,1,kh_rossi.gat,222,65
+kh_rossi.gat,248,69,0 warp rossi21 1,1,kh_rossi.gat,88,276
+kh_rossi.gat,88,272,0 warp rossi23 1,1,kh_rossi.gat,248,65
+
+//Hallway
+kh_rossi.gat,229,235,0 warp rossi24 1,1,kh_rossi.gat,263,46
+kh_rossi.gat,188,239,0 warp rossi25 1,1,kh_rossi.gat,148,281
+kh_rossi.gat,148,278,0 warp rossi26 1,1,kh_rossi.gat,188,235
+kh_rossi.gat,204,239,0 warp rossi27 1,1,kh_rossi.gat,204,281
+kh_rossi.gat,204,278,0 warp rossi28 1,1,kh_rossi.gat,204,235
+kh_rossi.gat,220,239,0 warp rossi29 1,1,kh_rossi.gat,260,281
+kh_rossi.gat,260,278,0 warp rossi30 1,1,kh_rossi.gat,220,235
+kh_rossi.gat,188,230,0 warp rossi31 1,1,kh_rossi.gat,148,187
+kh_rossi.gat,148,191,0 warp rossi32 1,1,kh_rossi.gat,188,234
+kh_rossi.gat,204,230,0 warp rossi33 1,1,kh_rossi.gat,204,187
+kh_rossi.gat,204,191,0 warp rossi34 1,1,kh_rossi.gat,204,234
+kh_rossi.gat,220,230,0 warp rossi35 1,1,kh_rossi.gat,260,187
kh_rossi.gat,260,191,0 warp rossi36 1,1,kh_rossi.gat,220,234 \ No newline at end of file
diff --git a/npc/warps/other/other.txt b/npc/warps/other/other.txt
index f3e208b88..1760f7ec6 100644
--- a/npc/warps/other/other.txt
+++ b/npc/warps/other/other.txt
@@ -1,35 +1,35 @@
-//===== Athena Script ========================================
-//= Other Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version;
-//===== Description: =========================================
-//= Warp Points for Other Maps
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//============================================================
-
-//guild_room.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs2.gat,50,88,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs4.gat,7,50,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs4.gat,50,7,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs4.gat,92,50,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs4.gat,50,92,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
-//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//===== Athena Script ========================================
+//= Other Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version;
+//===== Description: =========================================
+//= Warp Points for Other Maps
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//============================================================
+
+//guild_room.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs1.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs2.gat,50,88,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs2.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs3.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs4.gat,7,50,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs4.gat,50,7,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs4.gat,92,50,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs4.gat,50,92,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
+//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0
//guild_vs5.gat,0,0,0 warp warp4 0,0,hoge.gat,0,0 \ No newline at end of file
diff --git a/npc/warps/other/sign.txt b/npc/warps/other/sign.txt
index 595a7ef36..d79254a1b 100644
--- a/npc/warps/other/sign.txt
+++ b/npc/warps/other/sign.txt
@@ -1,38 +1,38 @@
-//===== Athena Script ========================================
-//= Sign Quest Warps
-//===== By: ==================================================
-//= MasterOfMuppets
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 8+
-//===== Description: =========================================
-//= Warp Points related to the Sign Quest will be put here
-//===== Additional Comments: =================================
-//= 1.0 A few warps. [MasterOfMuppets]
-//= 1.1 A few more warps. [MasterOfMuppets]
-//= 1.2 Completed the warps [MasterOfMuppets]
-//============================================================
-
-cmd_in01.gat,17,34,0 warp sign01 1,1,comodo.gat,187,164
-
-geffen.gat,140,99,0 warp sign02 1,1,geffen_in.gat,165,52
-geffen_in.gat,165,54,0 warp sign02a 1,1,geffen.gat,138,101
-
-himinn.gat,49,6,0 warp sign03 1,1,gef_fild07.gat,179,241
-
-himinn.gat,49,67,0 warp sign04 1,1,himinn.gat,49,75
-himinn.gat,49,73,0 warp sign04a 1,1,himinn.gat,49,65
-
-um_in.gat,33,18,0 warp sign05 1,1,um_in.gat,89,11
-um_in.gat,89,9,0 warp sign05a 1,1,um_in.gat,33,16
-
-um_dun01.gat,132,90,0 warp sign06 1,1,um_in.gat,12,18
-um_in.gat,10,18,0 warp sign06a 1,1,um_dun01.gat,129,90
-
-que_sign01.gat,113,133,0 warp sign07 1,1,nif_in.gat,117,173
-
-que_sign01.gat,45,15,0 warp sign08 1,1,niflheim.gat,146,245
-
-que_sign02.gat,22,314,0 warp sign09 1,1,niflheim.gat,30,156
-que_sign02.gat,379,235,0 warp sign09a 1,1,que_sign01.gat,180,172
+//===== Athena Script ========================================
+//= Sign Quest Warps
+//===== By: ==================================================
+//= MasterOfMuppets
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 8+
+//===== Description: =========================================
+//= Warp Points related to the Sign Quest will be put here
+//===== Additional Comments: =================================
+//= 1.0 A few warps. [MasterOfMuppets]
+//= 1.1 A few more warps. [MasterOfMuppets]
+//= 1.2 Completed the warps [MasterOfMuppets]
+//============================================================
+
+cmd_in01.gat,17,34,0 warp sign01 1,1,comodo.gat,187,164
+
+geffen.gat,140,99,0 warp sign02 1,1,geffen_in.gat,165,52
+geffen_in.gat,165,54,0 warp sign02a 1,1,geffen.gat,138,101
+
+himinn.gat,49,6,0 warp sign03 1,1,gef_fild07.gat,179,241
+
+himinn.gat,49,67,0 warp sign04 1,1,himinn.gat,49,75
+himinn.gat,49,73,0 warp sign04a 1,1,himinn.gat,49,65
+
+um_in.gat,33,18,0 warp sign05 1,1,um_in.gat,89,11
+um_in.gat,89,9,0 warp sign05a 1,1,um_in.gat,33,16
+
+um_dun01.gat,132,90,0 warp sign06 1,1,um_in.gat,12,18
+um_in.gat,10,18,0 warp sign06a 1,1,um_dun01.gat,129,90
+
+que_sign01.gat,113,133,0 warp sign07 1,1,nif_in.gat,117,173
+
+que_sign01.gat,45,15,0 warp sign08 1,1,niflheim.gat,146,245
+
+que_sign02.gat,22,314,0 warp sign09 1,1,niflheim.gat,30,156
+que_sign02.gat,379,235,0 warp sign09a 1,1,que_sign01.gat,180,172
diff --git a/npc/warps/pvp/pvp.txt b/npc/warps/pvp/pvp.txt
index 48129f1e2..dfa65d74c 100644
--- a/npc/warps/pvp/pvp.txt
+++ b/npc/warps/pvp/pvp.txt
@@ -1,169 +1,169 @@
-//===== Athena Script ========================================
-//= Prontera Arena & PvP Warp Script
-//===== By: ==================================================
-//= Athena (any)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Arena and PvP Maps
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//= 1.1 Fixed Prontera Arena warp [Yor]
-//============================================================
-
-//Battle Ordeal Mode
-ordeal_1-1.gat,100,150,0 warp ord11 1,1,ordeal_1-1.gat,128,150
-ordeal_1-1.gat,123,150,0 warp ord11-1 1,1,ordeal_1-1.gat,95,150
-ordeal_1-1.gat,114,183,0 warp ord12 1,1,ordeal_1-1.gat,135,163
-ordeal_1-1.gat,130,168,0 warp ord12-1 1,1,ordeal_1-1.gat,109,188
-ordeal_1-1.gat,115,115,0 warp ord13 1,1,ordeal_1-1.gat,136,136
-ordeal_1-1.gat,131,131,0 warp ord13-1 1,1,ordeal_1-1.gat,110,110
-ordeal_1-1.gat,148,176,0 warp ord14 1,1,ordeal_1-1.gat,149,204
-ordeal_1-1.gat,149,199,0 warp ord14-1 1,1,ordeal_1-1.gat,148,171
-ordeal_1-1.gat,149,99,0 warp ord15 1,1,ordeal_1-1.gat,151,129
-ordeal_1-1.gat,151,124,0 warp ord15-1 1,1,ordeal_1-1.gat,151,94
-ordeal_1-1.gat,168,168,0 warp ord16 1,1,ordeal_1-1.gat,189,189
-ordeal_1-1.gat,184,184,0 warp ord16-1 1,1,ordeal_1-1.gat,163,163
-ordeal_1-1.gat,169,131,0 warp ord17 1,1,ordeal_1-1.gat,188,111
-ordeal_1-1.gat,183,116,0 warp ord17-1 1,1,ordeal_1-1.gat,164,136
-ordeal_1-1.gat,176,150,0 warp ord18 1,1,ordeal_1-1.gat,204,150
-ordeal_1-1.gat,199,150,0 warp ord18-1 1,1,ordeal_1-1.gat,171,150
-ordeal_1-2.gat,128,154,0 warp ord121 1,1,ordeal_1-2.gat,24,154
-ordeal_1-2.gat,136,136,0 warp ord122 1,1,ordeal_1-2.gat,24,24
-ordeal_1-2.gat,136,172,0 warp ord123 1,1,ordeal_1-2.gat,24,284
-ordeal_1-2.gat,153,128,0 warp ord124 1,1,ordeal_1-2.gat,153,23
-ordeal_1-2.gat,153,180,0 warp ord125 1,1,ordeal_1-2.gat,144,284
-ordeal_1-2.gat,172,135,0 warp ord126 1,1,ordeal_1-2.gat,284,24
-ordeal_1-2.gat,172,172,0 warp ord127 1,1,ordeal_1-2.gat,284,284
-ordeal_1-2.gat,180,154,0 warp ord128 1,1,ordeal_1-2.gat,284,164
-ordeal_1-3.gat,100,150,0 warp ord11 1,1,ordeal_1-3.gat,128,150
-ordeal_1-3.gat,114,183,0 warp ord11-1 1,1,ordeal_1-3.gat,135,163
-ordeal_1-3.gat,115,115,0 warp ord12 1,1,ordeal_1-3.gat,136,136
-ordeal_1-3.gat,123,150,0 warp ord12-1 1,1,ordeal_1-3.gat,95,150
-ordeal_1-3.gat,130,168,0 warp ord13 1,1,ordeal_1-3.gat,109,188
-ordeal_1-3.gat,131,131,0 warp ord13-1 1,1,ordeal_1-3.gat,110,110
-ordeal_1-3.gat,148,176,0 warp ord14 1,1,ordeal_1-3.gat,149,204
-ordeal_1-3.gat,149,99,0 warp ord14-1 1,1,ordeal_1-3.gat,151,129
-ordeal_1-3.gat,149,199,0 warp ord15 1,1,ordeal_1-3.gat,148,171
-ordeal_1-3.gat,151,124,0 warp ord15-1 1,1,ordeal_1-3.gat,151,94
-ordeal_1-3.gat,168,168,0 warp ord16 1,1,ordeal_1-3.gat,189,189
-ordeal_1-3.gat,169,131,0 warp ord16-1 1,1,ordeal_1-3.gat,188,111
-ordeal_1-3.gat,176,150,0 warp ord17 1,1,ordeal_1-3.gat,204,150
-ordeal_1-3.gat,183,116,0 warp ord17-1 1,1,ordeal_1-3.gat,164,136
-ordeal_1-3.gat,184,184,0 warp ord18 1,1,ordeal_1-3.gat,163,163
-ordeal_1-3.gat,199,150,0 warp ord18-1 1,1,ordeal_1-3.gat,171,150
-ordeal_1-4.gat,128,154,0 warp ord141 1,1,ordeal_1-4.gat,24,154
-ordeal_1-4.gat,136,136,0 warp ord142 1,1,ordeal_1-4.gat,24,24
-ordeal_1-4.gat,136,172,0 warp ord143 1,1,ordeal_1-4.gat,24,284
-ordeal_1-4.gat,153,128,0 warp ord144 1,1,ordeal_1-4.gat,153,23
-ordeal_1-4.gat,153,180,0 warp ord145 1,1,ordeal_1-4.gat,144,284
-ordeal_1-4.gat,172,135,0 warp ord146 1,1,ordeal_1-4.gat,284,24
-ordeal_1-4.gat,172,172,0 warp ord147 1,1,ordeal_1-4.gat,284,284
-ordeal_1-4.gat,180,154,0 warp ord148 1,1,ordeal_1-4.gat,284,164
-ordeal_2-1.gat,100,150,0 warp ord21 1,1,ordeal_2-1.gat,128,150
-ordeal_2-1.gat,123,150,0 warp ord21-1 1,1,ordeal_2-1.gat,95,150
-ordeal_2-1.gat,114,183,0 warp ord22 1,1,ordeal_2-1.gat,135,163
-ordeal_2-1.gat,130,168,0 warp ord22-1 1,1,ordeal_2-1.gat,109,188
-ordeal_2-1.gat,115,115,0 warp ord23 1,1,ordeal_2-1.gat,136,136
-ordeal_2-1.gat,131,131,0 warp ord23-1 1,1,ordeal_2-1.gat,110,110
-ordeal_2-1.gat,148,176,0 warp ord24 1,1,ordeal_2-1.gat,149,204
-ordeal_2-1.gat,149,199,0 warp ord24-1 1,1,ordeal_2-1.gat,148,171
-ordeal_2-1.gat,149,99,0 warp ord25 1,1,ordeal_2-1.gat,151,129
-ordeal_2-1.gat,151,124,0 warp ord25-1 1,1,ordeal_2-1.gat,151,94
-ordeal_2-1.gat,168,168,0 warp ord26 1,1,ordeal_2-1.gat,189,189
-ordeal_2-1.gat,184,184,0 warp ord26-1 1,1,ordeal_2-1.gat,163,163
-ordeal_2-1.gat,169,131,0 warp ord27 1,1,ordeal_2-1.gat,188,111
-ordeal_2-1.gat,183,116,0 warp ord27-1 1,1,ordeal_2-1.gat,164,136
-ordeal_2-1.gat,176,150,0 warp ord28 1,1,ordeal_2-1.gat,204,150
-ordeal_2-1.gat,199,150,0 warp ord28-1 1,1,ordeal_2-1.gat,171,150
-ordeal_2-2.gat,128,154,0 warp ord221 1,1,ordeal_2-2.gat,24,154
-ordeal_2-2.gat,136,136,0 warp ord222 1,1,ordeal_2-2.gat,24,24
-ordeal_2-2.gat,136,172,0 warp ord223 1,1,ordeal_2-2.gat,24,284
-ordeal_2-2.gat,153,128,0 warp ord224 1,1,ordeal_2-2.gat,153,23
-ordeal_2-2.gat,153,180,0 warp ord225 1,1,ordeal_2-2.gat,144,284
-ordeal_2-2.gat,172,135,0 warp ord226 1,1,ordeal_2-2.gat,284,24
-ordeal_2-2.gat,172,172,0 warp ord227 1,1,ordeal_2-2.gat,284,284
-ordeal_2-2.gat,180,154,0 warp ord228 1,1,ordeal_2-2.gat,284,164
-ordeal_2-3.gat,100,150,0 warp ord21 1,1,ordeal_2-3.gat,128,150
-ordeal_2-3.gat,114,183,0 warp ord21-1 1,1,ordeal_2-3.gat,135,163
-ordeal_2-3.gat,115,115,0 warp ord22 1,1,ordeal_2-3.gat,136,136
-ordeal_2-3.gat,123,150,0 warp ord22-1 1,1,ordeal_2-3.gat,95,150
-ordeal_2-3.gat,130,168,0 warp ord23 1,1,ordeal_2-3.gat,109,188
-ordeal_2-3.gat,131,131,0 warp ord23-1 1,1,ordeal_2-3.gat,110,110
-ordeal_2-3.gat,148,176,0 warp ord24 1,1,ordeal_2-3.gat,149,204
-ordeal_2-3.gat,149,99,0 warp ord24-1 1,1,ordeal_2-3.gat,151,129
-ordeal_2-3.gat,149,199,0 warp ord25 1,1,ordeal_2-3.gat,148,171
-ordeal_2-3.gat,151,124,0 warp ord25-1 1,1,ordeal_2-3.gat,151,94
-ordeal_2-3.gat,168,168,0 warp ord26 1,1,ordeal_2-3.gat,189,189
-ordeal_2-3.gat,169,131,0 warp ord26-1 1,1,ordeal_2-3.gat,188,111
-ordeal_2-3.gat,176,150,0 warp ord27 1,1,ordeal_2-3.gat,204,150
-ordeal_2-3.gat,183,116,0 warp ord27-1 1,1,ordeal_2-3.gat,164,136
-ordeal_2-3.gat,184,184,0 warp ord28 1,1,ordeal_2-3.gat,163,163
-ordeal_2-3.gat,199,150,0 warp ord28-1 1,1,ordeal_2-3.gat,171,150
-ordeal_2-4.gat,128,154,0 warp ord241 1,1,ordeal_2-4.gat,24,154
-ordeal_2-4.gat,136,136,0 warp ord242 1,1,ordeal_2-4.gat,24,24
-ordeal_2-4.gat,136,172,0 warp ord243 1,1,ordeal_2-4.gat,24,284
-ordeal_2-4.gat,153,128,0 warp ord244 1,1,ordeal_2-4.gat,153,23
-ordeal_2-4.gat,153,180,0 warp ord245 1,1,ordeal_2-4.gat,144,284
-ordeal_2-4.gat,172,135,0 warp ord246 1,1,ordeal_2-4.gat,284,24
-ordeal_2-4.gat,172,172,0 warp ord247 1,1,ordeal_2-4.gat,284,284
-ordeal_2-4.gat,180,154,0 warp ord248 1,1,ordeal_2-4.gat,284,164
-ordeal_3-1.gat,100,150,0 warp ord31 1,1,ordeal_3-1.gat,128,150
-ordeal_3-1.gat,123,150,0 warp ord31-1 1,1,ordeal_3-1.gat,95,150
-ordeal_3-1.gat,114,183,0 warp ord32 1,1,ordeal_3-1.gat,135,163
-ordeal_3-1.gat,130,168,0 warp ord32-1 1,1,ordeal_3-1.gat,109,188
-ordeal_3-1.gat,115,115,0 warp ord33 1,1,ordeal_3-1.gat,136,136
-ordeal_3-1.gat,131,131,0 warp ord33-1 1,1,ordeal_3-1.gat,110,110
-ordeal_3-1.gat,148,176,0 warp ord34 1,1,ordeal_3-1.gat,149,204
-ordeal_3-1.gat,149,199,0 warp ord34-1 1,1,ordeal_3-1.gat,148,171
-ordeal_3-1.gat,149,99,0 warp ord35 1,1,ordeal_3-1.gat,151,129
-ordeal_3-1.gat,151,124,0 warp ord35-1 1,1,ordeal_3-1.gat,151,94
-ordeal_3-1.gat,168,168,0 warp ord36 1,1,ordeal_3-1.gat,189,189
-ordeal_3-1.gat,184,184,0 warp ord36-1 1,1,ordeal_3-1.gat,163,163
-ordeal_3-1.gat,169,131,0 warp ord37 1,1,ordeal_3-1.gat,188,111
-ordeal_3-1.gat,183,116,0 warp ord37-1 1,1,ordeal_3-1.gat,164,136
-ordeal_3-1.gat,176,150,0 warp ord38 1,1,ordeal_3-1.gat,204,150
-ordeal_3-1.gat,199,150,0 warp ord38-1 1,1,ordeal_3-1.gat,171,150
-ordeal_3-2.gat,128,154,0 warp ord321 1,1,ordeal_3-2.gat,24,154
-ordeal_3-2.gat,136,136,0 warp ord322 1,1,ordeal_3-2.gat,24,24
-ordeal_3-2.gat,136,172,0 warp ord323 1,1,ordeal_3-2.gat,24,284
-ordeal_3-2.gat,153,128,0 warp ord324 1,1,ordeal_3-2.gat,153,23
-ordeal_3-2.gat,153,180,0 warp ord325 1,1,ordeal_3-2.gat,144,284
-ordeal_3-2.gat,172,135,0 warp ord326 1,1,ordeal_3-2.gat,284,24
-ordeal_3-2.gat,172,172,0 warp ord327 1,1,ordeal_3-2.gat,284,284
-ordeal_3-2.gat,180,154,0 warp ord328 1,1,ordeal_3-2.gat,284,164
-ordeal_3-3.gat,100,150,0 warp ord31 1,1,ordeal_3-3.gat,128,150
-ordeal_3-3.gat,114,183,0 warp ord31-1 1,1,ordeal_3-3.gat,135,163
-ordeal_3-3.gat,115,115,0 warp ord32 1,1,ordeal_3-3.gat,136,136
-ordeal_3-3.gat,123,150,0 warp ord32-1 1,1,ordeal_3-3.gat,95,150
-ordeal_3-3.gat,130,168,0 warp ord33 1,1,ordeal_3-3.gat,109,188
-ordeal_3-3.gat,131,131,0 warp ord33-1 1,1,ordeal_3-3.gat,110,110
-ordeal_3-3.gat,148,176,0 warp ord34 1,1,ordeal_3-3.gat,149,204
-ordeal_3-3.gat,149,99,0 warp ord34-1 1,1,ordeal_3-3.gat,151,129
-ordeal_3-3.gat,149,199,0 warp ord35 1,1,ordeal_3-3.gat,148,171
-ordeal_3-3.gat,151,124,0 warp ord35-1 1,1,ordeal_3-3.gat,151,94
-ordeal_3-3.gat,168,168,0 warp ord36 1,1,ordeal_3-3.gat,189,189
-ordeal_3-3.gat,169,131,0 warp ord36-1 1,1,ordeal_3-3.gat,188,111
-ordeal_3-3.gat,176,150,0 warp ord37 1,1,ordeal_3-3.gat,204,150
-ordeal_3-3.gat,183,116,0 warp ord37-1 1,1,ordeal_3-3.gat,164,136
-ordeal_3-3.gat,184,184,0 warp ord38 1,1,ordeal_3-3.gat,163,163
-ordeal_3-3.gat,199,150,0 warp ord38-1 1,1,ordeal_3-3.gat,171,150
-ordeal_3-4.gat,128,154,0 warp ord341 1,1,ordeal_3-4.gat,24,154
-ordeal_3-4.gat,136,136,0 warp ord342 1,1,ordeal_3-4.gat,24,24
-ordeal_3-4.gat,136,172,0 warp ord343 1,1,ordeal_3-4.gat,24,284
-ordeal_3-4.gat,153,128,0 warp ord344 1,1,ordeal_3-4.gat,153,23
-ordeal_3-4.gat,153,180,0 warp ord345 1,1,ordeal_3-4.gat,144,284
-ordeal_3-4.gat,172,135,0 warp ord346 1,1,ordeal_3-4.gat,284,24
-ordeal_3-4.gat,172,172,0 warp ord347 1,1,ordeal_3-4.gat,284,284
-ordeal_3-4.gat,180,154,0 warp ord348 1,1,ordeal_3-4.gat,284,164
-//This map doesn't even exists. Is it ordeal_a02 or ordea_la00?
-//ordeal_a04.gat,128,154,0 warp orda1 0,0,ordeal_a04.gat,24,154
-//ordeal_a04.gat,136,136,0 warp orda2 0,0,ordeal_a04.gat,24,24
-//ordeal_a04.gat,136,172,0 warp orda3 0,0,ordeal_a04.gat,24,284
-//ordeal_a04.gat,153,128,0 warp orda4 0,0,ordeal_a04.gat,153,23
-//ordeal_a04.gat,153,180,0 warp orda5 0,0,ordeal_a04.gat,144,284
-//ordeal_a04.gat,172,135,0 warp orda6 0,0,ordeal_a04.gat,284,24
-//ordeal_a04.gat,172,172,0 warp orda7 0,0,ordeal_a04.gat,284,284
-//ordeal_a04.gat,180,154,0 warp orda8 0,0,ordeal_a04.gat,284,164
+//===== Athena Script ========================================
+//= Prontera Arena & PvP Warp Script
+//===== By: ==================================================
+//= Athena (any)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Arena and PvP Maps
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//= 1.1 Fixed Prontera Arena warp [Yor]
+//============================================================
+
+//Battle Ordeal Mode
+ordeal_1-1.gat,100,150,0 warp ord11 1,1,ordeal_1-1.gat,128,150
+ordeal_1-1.gat,123,150,0 warp ord11-1 1,1,ordeal_1-1.gat,95,150
+ordeal_1-1.gat,114,183,0 warp ord12 1,1,ordeal_1-1.gat,135,163
+ordeal_1-1.gat,130,168,0 warp ord12-1 1,1,ordeal_1-1.gat,109,188
+ordeal_1-1.gat,115,115,0 warp ord13 1,1,ordeal_1-1.gat,136,136
+ordeal_1-1.gat,131,131,0 warp ord13-1 1,1,ordeal_1-1.gat,110,110
+ordeal_1-1.gat,148,176,0 warp ord14 1,1,ordeal_1-1.gat,149,204
+ordeal_1-1.gat,149,199,0 warp ord14-1 1,1,ordeal_1-1.gat,148,171
+ordeal_1-1.gat,149,99,0 warp ord15 1,1,ordeal_1-1.gat,151,129
+ordeal_1-1.gat,151,124,0 warp ord15-1 1,1,ordeal_1-1.gat,151,94
+ordeal_1-1.gat,168,168,0 warp ord16 1,1,ordeal_1-1.gat,189,189
+ordeal_1-1.gat,184,184,0 warp ord16-1 1,1,ordeal_1-1.gat,163,163
+ordeal_1-1.gat,169,131,0 warp ord17 1,1,ordeal_1-1.gat,188,111
+ordeal_1-1.gat,183,116,0 warp ord17-1 1,1,ordeal_1-1.gat,164,136
+ordeal_1-1.gat,176,150,0 warp ord18 1,1,ordeal_1-1.gat,204,150
+ordeal_1-1.gat,199,150,0 warp ord18-1 1,1,ordeal_1-1.gat,171,150
+ordeal_1-2.gat,128,154,0 warp ord121 1,1,ordeal_1-2.gat,24,154
+ordeal_1-2.gat,136,136,0 warp ord122 1,1,ordeal_1-2.gat,24,24
+ordeal_1-2.gat,136,172,0 warp ord123 1,1,ordeal_1-2.gat,24,284
+ordeal_1-2.gat,153,128,0 warp ord124 1,1,ordeal_1-2.gat,153,23
+ordeal_1-2.gat,153,180,0 warp ord125 1,1,ordeal_1-2.gat,144,284
+ordeal_1-2.gat,172,135,0 warp ord126 1,1,ordeal_1-2.gat,284,24
+ordeal_1-2.gat,172,172,0 warp ord127 1,1,ordeal_1-2.gat,284,284
+ordeal_1-2.gat,180,154,0 warp ord128 1,1,ordeal_1-2.gat,284,164
+ordeal_1-3.gat,100,150,0 warp ord11 1,1,ordeal_1-3.gat,128,150
+ordeal_1-3.gat,114,183,0 warp ord11-1 1,1,ordeal_1-3.gat,135,163
+ordeal_1-3.gat,115,115,0 warp ord12 1,1,ordeal_1-3.gat,136,136
+ordeal_1-3.gat,123,150,0 warp ord12-1 1,1,ordeal_1-3.gat,95,150
+ordeal_1-3.gat,130,168,0 warp ord13 1,1,ordeal_1-3.gat,109,188
+ordeal_1-3.gat,131,131,0 warp ord13-1 1,1,ordeal_1-3.gat,110,110
+ordeal_1-3.gat,148,176,0 warp ord14 1,1,ordeal_1-3.gat,149,204
+ordeal_1-3.gat,149,99,0 warp ord14-1 1,1,ordeal_1-3.gat,151,129
+ordeal_1-3.gat,149,199,0 warp ord15 1,1,ordeal_1-3.gat,148,171
+ordeal_1-3.gat,151,124,0 warp ord15-1 1,1,ordeal_1-3.gat,151,94
+ordeal_1-3.gat,168,168,0 warp ord16 1,1,ordeal_1-3.gat,189,189
+ordeal_1-3.gat,169,131,0 warp ord16-1 1,1,ordeal_1-3.gat,188,111
+ordeal_1-3.gat,176,150,0 warp ord17 1,1,ordeal_1-3.gat,204,150
+ordeal_1-3.gat,183,116,0 warp ord17-1 1,1,ordeal_1-3.gat,164,136
+ordeal_1-3.gat,184,184,0 warp ord18 1,1,ordeal_1-3.gat,163,163
+ordeal_1-3.gat,199,150,0 warp ord18-1 1,1,ordeal_1-3.gat,171,150
+ordeal_1-4.gat,128,154,0 warp ord141 1,1,ordeal_1-4.gat,24,154
+ordeal_1-4.gat,136,136,0 warp ord142 1,1,ordeal_1-4.gat,24,24
+ordeal_1-4.gat,136,172,0 warp ord143 1,1,ordeal_1-4.gat,24,284
+ordeal_1-4.gat,153,128,0 warp ord144 1,1,ordeal_1-4.gat,153,23
+ordeal_1-4.gat,153,180,0 warp ord145 1,1,ordeal_1-4.gat,144,284
+ordeal_1-4.gat,172,135,0 warp ord146 1,1,ordeal_1-4.gat,284,24
+ordeal_1-4.gat,172,172,0 warp ord147 1,1,ordeal_1-4.gat,284,284
+ordeal_1-4.gat,180,154,0 warp ord148 1,1,ordeal_1-4.gat,284,164
+ordeal_2-1.gat,100,150,0 warp ord21 1,1,ordeal_2-1.gat,128,150
+ordeal_2-1.gat,123,150,0 warp ord21-1 1,1,ordeal_2-1.gat,95,150
+ordeal_2-1.gat,114,183,0 warp ord22 1,1,ordeal_2-1.gat,135,163
+ordeal_2-1.gat,130,168,0 warp ord22-1 1,1,ordeal_2-1.gat,109,188
+ordeal_2-1.gat,115,115,0 warp ord23 1,1,ordeal_2-1.gat,136,136
+ordeal_2-1.gat,131,131,0 warp ord23-1 1,1,ordeal_2-1.gat,110,110
+ordeal_2-1.gat,148,176,0 warp ord24 1,1,ordeal_2-1.gat,149,204
+ordeal_2-1.gat,149,199,0 warp ord24-1 1,1,ordeal_2-1.gat,148,171
+ordeal_2-1.gat,149,99,0 warp ord25 1,1,ordeal_2-1.gat,151,129
+ordeal_2-1.gat,151,124,0 warp ord25-1 1,1,ordeal_2-1.gat,151,94
+ordeal_2-1.gat,168,168,0 warp ord26 1,1,ordeal_2-1.gat,189,189
+ordeal_2-1.gat,184,184,0 warp ord26-1 1,1,ordeal_2-1.gat,163,163
+ordeal_2-1.gat,169,131,0 warp ord27 1,1,ordeal_2-1.gat,188,111
+ordeal_2-1.gat,183,116,0 warp ord27-1 1,1,ordeal_2-1.gat,164,136
+ordeal_2-1.gat,176,150,0 warp ord28 1,1,ordeal_2-1.gat,204,150
+ordeal_2-1.gat,199,150,0 warp ord28-1 1,1,ordeal_2-1.gat,171,150
+ordeal_2-2.gat,128,154,0 warp ord221 1,1,ordeal_2-2.gat,24,154
+ordeal_2-2.gat,136,136,0 warp ord222 1,1,ordeal_2-2.gat,24,24
+ordeal_2-2.gat,136,172,0 warp ord223 1,1,ordeal_2-2.gat,24,284
+ordeal_2-2.gat,153,128,0 warp ord224 1,1,ordeal_2-2.gat,153,23
+ordeal_2-2.gat,153,180,0 warp ord225 1,1,ordeal_2-2.gat,144,284
+ordeal_2-2.gat,172,135,0 warp ord226 1,1,ordeal_2-2.gat,284,24
+ordeal_2-2.gat,172,172,0 warp ord227 1,1,ordeal_2-2.gat,284,284
+ordeal_2-2.gat,180,154,0 warp ord228 1,1,ordeal_2-2.gat,284,164
+ordeal_2-3.gat,100,150,0 warp ord21 1,1,ordeal_2-3.gat,128,150
+ordeal_2-3.gat,114,183,0 warp ord21-1 1,1,ordeal_2-3.gat,135,163
+ordeal_2-3.gat,115,115,0 warp ord22 1,1,ordeal_2-3.gat,136,136
+ordeal_2-3.gat,123,150,0 warp ord22-1 1,1,ordeal_2-3.gat,95,150
+ordeal_2-3.gat,130,168,0 warp ord23 1,1,ordeal_2-3.gat,109,188
+ordeal_2-3.gat,131,131,0 warp ord23-1 1,1,ordeal_2-3.gat,110,110
+ordeal_2-3.gat,148,176,0 warp ord24 1,1,ordeal_2-3.gat,149,204
+ordeal_2-3.gat,149,99,0 warp ord24-1 1,1,ordeal_2-3.gat,151,129
+ordeal_2-3.gat,149,199,0 warp ord25 1,1,ordeal_2-3.gat,148,171
+ordeal_2-3.gat,151,124,0 warp ord25-1 1,1,ordeal_2-3.gat,151,94
+ordeal_2-3.gat,168,168,0 warp ord26 1,1,ordeal_2-3.gat,189,189
+ordeal_2-3.gat,169,131,0 warp ord26-1 1,1,ordeal_2-3.gat,188,111
+ordeal_2-3.gat,176,150,0 warp ord27 1,1,ordeal_2-3.gat,204,150
+ordeal_2-3.gat,183,116,0 warp ord27-1 1,1,ordeal_2-3.gat,164,136
+ordeal_2-3.gat,184,184,0 warp ord28 1,1,ordeal_2-3.gat,163,163
+ordeal_2-3.gat,199,150,0 warp ord28-1 1,1,ordeal_2-3.gat,171,150
+ordeal_2-4.gat,128,154,0 warp ord241 1,1,ordeal_2-4.gat,24,154
+ordeal_2-4.gat,136,136,0 warp ord242 1,1,ordeal_2-4.gat,24,24
+ordeal_2-4.gat,136,172,0 warp ord243 1,1,ordeal_2-4.gat,24,284
+ordeal_2-4.gat,153,128,0 warp ord244 1,1,ordeal_2-4.gat,153,23
+ordeal_2-4.gat,153,180,0 warp ord245 1,1,ordeal_2-4.gat,144,284
+ordeal_2-4.gat,172,135,0 warp ord246 1,1,ordeal_2-4.gat,284,24
+ordeal_2-4.gat,172,172,0 warp ord247 1,1,ordeal_2-4.gat,284,284
+ordeal_2-4.gat,180,154,0 warp ord248 1,1,ordeal_2-4.gat,284,164
+ordeal_3-1.gat,100,150,0 warp ord31 1,1,ordeal_3-1.gat,128,150
+ordeal_3-1.gat,123,150,0 warp ord31-1 1,1,ordeal_3-1.gat,95,150
+ordeal_3-1.gat,114,183,0 warp ord32 1,1,ordeal_3-1.gat,135,163
+ordeal_3-1.gat,130,168,0 warp ord32-1 1,1,ordeal_3-1.gat,109,188
+ordeal_3-1.gat,115,115,0 warp ord33 1,1,ordeal_3-1.gat,136,136
+ordeal_3-1.gat,131,131,0 warp ord33-1 1,1,ordeal_3-1.gat,110,110
+ordeal_3-1.gat,148,176,0 warp ord34 1,1,ordeal_3-1.gat,149,204
+ordeal_3-1.gat,149,199,0 warp ord34-1 1,1,ordeal_3-1.gat,148,171
+ordeal_3-1.gat,149,99,0 warp ord35 1,1,ordeal_3-1.gat,151,129
+ordeal_3-1.gat,151,124,0 warp ord35-1 1,1,ordeal_3-1.gat,151,94
+ordeal_3-1.gat,168,168,0 warp ord36 1,1,ordeal_3-1.gat,189,189
+ordeal_3-1.gat,184,184,0 warp ord36-1 1,1,ordeal_3-1.gat,163,163
+ordeal_3-1.gat,169,131,0 warp ord37 1,1,ordeal_3-1.gat,188,111
+ordeal_3-1.gat,183,116,0 warp ord37-1 1,1,ordeal_3-1.gat,164,136
+ordeal_3-1.gat,176,150,0 warp ord38 1,1,ordeal_3-1.gat,204,150
+ordeal_3-1.gat,199,150,0 warp ord38-1 1,1,ordeal_3-1.gat,171,150
+ordeal_3-2.gat,128,154,0 warp ord321 1,1,ordeal_3-2.gat,24,154
+ordeal_3-2.gat,136,136,0 warp ord322 1,1,ordeal_3-2.gat,24,24
+ordeal_3-2.gat,136,172,0 warp ord323 1,1,ordeal_3-2.gat,24,284
+ordeal_3-2.gat,153,128,0 warp ord324 1,1,ordeal_3-2.gat,153,23
+ordeal_3-2.gat,153,180,0 warp ord325 1,1,ordeal_3-2.gat,144,284
+ordeal_3-2.gat,172,135,0 warp ord326 1,1,ordeal_3-2.gat,284,24
+ordeal_3-2.gat,172,172,0 warp ord327 1,1,ordeal_3-2.gat,284,284
+ordeal_3-2.gat,180,154,0 warp ord328 1,1,ordeal_3-2.gat,284,164
+ordeal_3-3.gat,100,150,0 warp ord31 1,1,ordeal_3-3.gat,128,150
+ordeal_3-3.gat,114,183,0 warp ord31-1 1,1,ordeal_3-3.gat,135,163
+ordeal_3-3.gat,115,115,0 warp ord32 1,1,ordeal_3-3.gat,136,136
+ordeal_3-3.gat,123,150,0 warp ord32-1 1,1,ordeal_3-3.gat,95,150
+ordeal_3-3.gat,130,168,0 warp ord33 1,1,ordeal_3-3.gat,109,188
+ordeal_3-3.gat,131,131,0 warp ord33-1 1,1,ordeal_3-3.gat,110,110
+ordeal_3-3.gat,148,176,0 warp ord34 1,1,ordeal_3-3.gat,149,204
+ordeal_3-3.gat,149,99,0 warp ord34-1 1,1,ordeal_3-3.gat,151,129
+ordeal_3-3.gat,149,199,0 warp ord35 1,1,ordeal_3-3.gat,148,171
+ordeal_3-3.gat,151,124,0 warp ord35-1 1,1,ordeal_3-3.gat,151,94
+ordeal_3-3.gat,168,168,0 warp ord36 1,1,ordeal_3-3.gat,189,189
+ordeal_3-3.gat,169,131,0 warp ord36-1 1,1,ordeal_3-3.gat,188,111
+ordeal_3-3.gat,176,150,0 warp ord37 1,1,ordeal_3-3.gat,204,150
+ordeal_3-3.gat,183,116,0 warp ord37-1 1,1,ordeal_3-3.gat,164,136
+ordeal_3-3.gat,184,184,0 warp ord38 1,1,ordeal_3-3.gat,163,163
+ordeal_3-3.gat,199,150,0 warp ord38-1 1,1,ordeal_3-3.gat,171,150
+ordeal_3-4.gat,128,154,0 warp ord341 1,1,ordeal_3-4.gat,24,154
+ordeal_3-4.gat,136,136,0 warp ord342 1,1,ordeal_3-4.gat,24,24
+ordeal_3-4.gat,136,172,0 warp ord343 1,1,ordeal_3-4.gat,24,284
+ordeal_3-4.gat,153,128,0 warp ord344 1,1,ordeal_3-4.gat,153,23
+ordeal_3-4.gat,153,180,0 warp ord345 1,1,ordeal_3-4.gat,144,284
+ordeal_3-4.gat,172,135,0 warp ord346 1,1,ordeal_3-4.gat,284,24
+ordeal_3-4.gat,172,172,0 warp ord347 1,1,ordeal_3-4.gat,284,284
+ordeal_3-4.gat,180,154,0 warp ord348 1,1,ordeal_3-4.gat,284,164
+//This map doesn't even exists. Is it ordeal_a02 or ordea_la00?
+//ordeal_a04.gat,128,154,0 warp orda1 0,0,ordeal_a04.gat,24,154
+//ordeal_a04.gat,136,136,0 warp orda2 0,0,ordeal_a04.gat,24,24
+//ordeal_a04.gat,136,172,0 warp orda3 0,0,ordeal_a04.gat,24,284
+//ordeal_a04.gat,153,128,0 warp orda4 0,0,ordeal_a04.gat,153,23
+//ordeal_a04.gat,153,180,0 warp orda5 0,0,ordeal_a04.gat,144,284
+//ordeal_a04.gat,172,135,0 warp orda6 0,0,ordeal_a04.gat,284,24
+//ordeal_a04.gat,172,172,0 warp orda7 0,0,ordeal_a04.gat,284,284
+//ordeal_a04.gat,180,154,0 warp orda8 0,0,ordeal_a04.gat,284,164
diff --git a/save-tmpl/account.txt b/save-tmpl/account.txt
index 96b272d3a..b326f67f7 100644
--- a/save-tmpl/account.txt
+++ b/save-tmpl/account.txt
@@ -10,10 +10,10 @@
// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)
// memo field : max 254 char
// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)
-0 s1 p1 2004-10-25 01:12:04.147 S 2 0 a@a.com - 0 127.0.0.1 - 0
-1 s2 p2 - S 0 0 a@a.com - 0 - - 0
-2 s3 p3 - S 0 0 a@a.com - 0 - - 0
-3 s4 p4 - S 0 0 a@a.com - 0 - - 0
-4 s5 p5 - S 0 0 a@a.com - 0 - - 0
-2000001 Test Test - M 0 0 a@a.com - 0 - - 0
+0 s1 p1 2004-10-25 01:12:04.147 S 2 0 a@a.com - 0 127.0.0.1 - 0
+1 s2 p2 - S 0 0 a@a.com - 0 - - 0
+2 s3 p3 - S 0 0 a@a.com - 0 - - 0
+3 s4 p4 - S 0 0 a@a.com - 0 - - 0
+4 s5 p5 - S 0 0 a@a.com - 0 - - 0
+2000001 Test Test - M 0 0 a@a.com - 0 - - 0
2000002 %newid%
diff --git a/save-tmpl/castle.txt b/save-tmpl/castle.txt
index 98cdd36fa..bb99e124a 100644
--- a/save-tmpl/castle.txt
+++ b/save-tmpl/castle.txt
@@ -1,24 +1,24 @@
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-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
-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
-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
-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
-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+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
+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
+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
+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
+7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+23,0,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/src/char/char.c b/src/char/char.c
index 6c234984a..1978b225b 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1,4443 +1,4443 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <sys/types.h>
-
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#include <time.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#include "../common/strlib.h"
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/db.h"
-#include "../common/version.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
-
-#include "char.h"
-#include "inter.h"
-#include "int_pet.h"
-#include "int_homun.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
-#ifdef ENABLE_SC_SAVING
-#include "int_status.h"
-#endif
-
-#ifndef TXT_SQL_CONVERT
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- unsigned short map[MAX_MAP_PER_SERVER];
-} server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[NAME_LENGTH] = "Server";
-char login_ip_str[128];
-in_addr_t login_ip;
-int login_port = 6900;
-char char_ip_str[128];
-in_addr_t char_ip;
-char bind_ip_str[128];
-in_addr_t bind_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-int char_new_display;
-int email_creation = 0; // disabled by default
-#endif
-char char_txt[1024]="save/athena.txt";
-char backup_txt[1024]="save/backup.txt"; //By zanetheinsane
-char friends_txt[1024]="save/friends.txt"; // davidsiaw
-#ifndef TXT_SQL_CONVERT
-char backup_txt_flag = 0; // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
-char unknown_char_name[1024] = "Unknown";
-char char_log_filename[1024] = "log/char.log";
-char db_path[1024]="db";
-
-// Advanced subnet check [LuzZza]
-struct _subnet {
- long subnet;
- long mask;
- long char_ip;
- long map_ip;
-} subnet[16];
-
-int subnet_count = 0;
-
-int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
-int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
-//The following are characters that are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
-#define TRIM_CHARS "\032\t\x0A\x0D "
-char char_name_letters[1024] = ""; // list of letters/symbols authorised (or not) in a character name. by [Yor]
-
-int log_char = 1; // loggin char or not [devil]
-int log_inter = 1; // loggin inter or not [devil]
-
-struct char_session_data{
- int account_id, login_id1, login_id2, sex;
- int found_char[9];
- char email[40]; // e-mail (default: a@a.com) by [Yor]
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, sex;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-static int online_check = 1; //If one, it won't let players connect when their account is already registered online and will send the relevant map server a kick user request. [Skotlex]
-
-int char_id_count = START_CHAR_NUM;
-struct character_data *char_dat;
-
-int char_num, char_max;
-int max_connect_user = 0;
-int gm_allow_level = 99;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int save_log = 1;
-int start_zeny = 500;
-int start_weapon = 1201;
-int start_armor = 2301;
-int guild_exp_rate = 100;
-
-//Custom limits for the fame lists. [Skotlex]
-int fame_list_size_chemist = MAX_FAME_LIST;
-int fame_list_size_smith = MAX_FAME_LIST;
-int fame_list_size_taekwon = MAX_FAME_LIST;
-
-// Char-server-side stored fame lists [DracoRPG]
-struct fame_list smith_fame_list[MAX_FAME_LIST];
-struct fame_list chemist_fame_list[MAX_FAME_LIST];
-struct fame_list taekwon_fame_list[MAX_FAME_LIST];
-
-// Initial position (it's possible to set it in conf file)
-struct point start_point = { 0, 53, 111};
-
-struct gm_account *gm_account = NULL;
-int GM_num = 0;
-
-// online players by [Yor]
-char online_txt_filename[1024] = "online.txt";
-char online_html_filename[1024] = "online.html";
-int online_sorting_option = 0; // sorting option to display online players in online files
-int online_display_option = 1; // display options: to know which columns must be displayed
-int online_refresh_html = 20; // refresh time (in sec) of the html file in the explorer
-int online_gm_display_min_level = 20; // minimum GM level to display 'GM' when we want to display it
-
-//These are used to aid the map server in identifying valid clients. [Skotlex]
-static int max_account_id = DEFAULT_MAX_ACCOUNT_ID, max_char_id = DEFAULT_MAX_CHAR_ID;
-
-struct online_char_data {
- int account_id;
- int char_id;
- short server;
- unsigned waiting_disconnect :1;
-};
-
-struct dbt *online_char_db; //Holds all online characters.
-
-time_t update_online; // to update online files when we receiving information from a server (not less than 8 seconds)
-
-int console = 0;
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int char_log(char *fmt, ...) {
- if(log_char)
- {
- FILE *logfp;
- va_list ap;
- time_t raw_time;
- char tmpstr[2048];
-
- va_start(ap, fmt);
-
- logfp = fopen(char_log_filename, "a");
- if (logfp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(logfp, RETCODE);
- else {
- time(&raw_time);
- strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", localtime(&raw_time));
- sprintf(tmpstr + 19, ": %s", fmt);
- vfprintf(logfp, tmpstr, ap);
- }
- fclose(logfp);
- }
- va_end(ap);
- }
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-int isGM(int account_id) {
- int i;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == account_id)
- return gm_account[i].level;
- return 0;
-}
-
-//Search character data from the aid/cid givem
-struct mmo_charstatus* search_character(int aid, int cid) {
- int i;
- for (i = 0; i < char_num; i++) {
- if (char_dat[i].status.char_id == cid && char_dat[i].status.account_id == aid)
- return &char_dat[i].status;
- }
- return NULL;
-}
-
-struct mmo_charstatus* search_character_byname(char* character_name)
-{
- int i = search_character_index(character_name);
- if (i == -1) return NULL;
- return &char_dat[i].status;
-}
-
-//----------------------------------------------
-// Search an character id
-// (return character index or -1 (if not found))
-// If exact character name is not found,
-// the function checks without case sensitive
-// and returns index if only 1 character is found
-// and similar to the searched name.
-//----------------------------------------------
-int search_character_index(char* character_name) {
- int i, quantity, index;
-
- quantity = 0;
- index = -1;
- for(i = 0; i < char_num; i++) {
- // Without case sensitive check (increase the number of similar character names found)
- if (stricmp(char_dat[i].status.name, character_name) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(char_dat[i].status.name, character_name) == 0)
- return i;
- quantity++;
- index = i;
- }
- }
- // Here, the exact character name is not found
- // We return the found index of a similar account ONLY if there is 1 similar character
- if (quantity == 1)
- return index;
-
- // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
- return -1;
-}
-
-//-------------------------------------
-// Return character name with the index
-//-------------------------------------
-char * search_character_name(int index) {
-
- if (index >= 0 && index < char_num)
- return char_dat[index].status.name;
-
- return unknown_char_name;
-}
-
-// Searches if the given character is online, and returns the fd of the
-// map-server it is connected to.
-int search_character_online(int aid, int cid)
-{
- //Look for online character.
- struct online_char_data* character;
- character = idb_get(online_char_db, aid);
- if(character &&
- character->char_id == cid &&
- character->server > -1)
- return server_fd[character->server];
- return -1;
-}
-static void * create_online_char_data(DBKey key, va_list args) {
- struct online_char_data* character;
- character = aCalloc(1, sizeof(struct online_char_data));
- character->account_id = key.i;
- character->char_id = -1;
- character->server = -1;
- return character;
-}
-
-static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data);
-
-//-------------------------------------------------
-// Set Character online/offline [Wizputer]
-//-------------------------------------------------
-
-void set_char_online(int map_id, int char_id, int account_id) {
- struct online_char_data* character;
-
- if ( char_id != 99 && (max_account_id < account_id || max_char_id < char_id))
- { //Notify map-server of the new max IDs [Skotlex]
- if (account_id > max_account_id)
- max_account_id = account_id;
- if (char_id > max_char_id)
- max_char_id = char_id;
- mapif_send_maxid(max_account_id, max_char_id);
- }
- character = idb_ensure(online_char_db, account_id, create_online_char_data);
- if (online_check && character->char_id != -1 && character->server > -1 && character->server != map_id)
- {
- //char == 99 <- Character logging in, so someone has logged in while one
- //char is still on map-server, so kick him out, but don't print "error"
- //as this is normal behaviour. [Skotlex]
- if (char_id != 99)
- ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
- character->account_id, character->char_id, character->server, map_id, account_id, char_id);
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- }
- character->waiting_disconnect = 0;
- character->char_id = (char_id==99)?-1:char_id;
- character->server = (char_id==99)?-1:map_id;
-
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd,0) = 0x272b;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-
- //printf ("set online\n");
-}
-void set_char_offline(int char_id, int account_id) {
- struct online_char_data* character;
-
- if ((character = idb_get(online_char_db, account_id)) != NULL)
- { //We don't free yet to avoid aCalloc/aFree spamming during char change. [Skotlex]
- character->char_id = -1;
- character->server = -1;
- character->waiting_disconnect = 0;
- }
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd,0) = 0x272c;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-
-}
-
-static int char_db_setoffline(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int server = va_arg(ap, int);
- if (server == -1) {
- character->char_id = -1;
- character->server = -1;
- character->waiting_disconnect = 0;
- } else if (character->server == server)
- character->server = -2; //In some map server that we aren't connected to.
- return 0;
-}
-
-static int char_db_kickoffline(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int server = va_arg(ap, int);
-
- if (server > -1 && character->server != server)
- return 0;
-
- //Kick out any connected characters, and set them offline as appropiate.
- if (character->server > -1)
- mapif_disconnectplayer(server_fd[character->server],
- character->account_id, character->char_id, 1);
- else if (!character->waiting_disconnect)
- set_char_offline(character->char_id, character->account_id);
- else return 0;
- return 1;
-}
-
-void set_all_offline(int id) {
- if (id < 0)
- ShowNotice("Sending all users offline.\n");
- else
- ShowNotice("Sending users of map-server %d offline.\n", id);
- online_char_db->foreach(online_char_db,char_db_kickoffline,id);
-
- if (id >= 0 || login_fd <= 0 || session[login_fd]->eof)
- return;
- //Tell login-server to also mark all our characters as offline.
- WFIFOHEAD(login_fd, 2);
- WFIFOW(login_fd,0) = 0x2737;
- WFIFOSET(login_fd,2);
-}
-
-/*---------------------------------------------------
- Make a data line for friends list
- --------------------------------------------------*/
-
-int mmo_friends_list_data_str(char *str, struct mmo_charstatus *p) {
- int i;
- char *str_p = str;
- str_p += sprintf(str_p, "%d", p->char_id);
-
- for (i=0;i<MAX_FRIENDS;i++){
- if (p->friends[i].account_id > 0 && p->friends[i].char_id > 0 && p->friends[i].name[0])
- str_p += sprintf(str_p, ",%d,%d,%s", p->friends[i].account_id, p->friends[i].char_id, p->friends[i].name);
- }
-
- str_p += '\0';
-
- return 0;
-}
-
-//-------------------------------------------------
-// Function to create the character line (for save)
-//-------------------------------------------------
-int mmo_char_tostr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int reg_num) {
- int i,j;
- char *str_p = str;
-
- /* We shouldn't need this anymore... [Skotlex]
- // on multi-map server, sometimes it's posssible that last_point become void. (reason???) We check that to not lost character at restart.
- if (!p->last_point.map) {
- p->last_point.map = mapindex_name2id(MAP_PRONTERA);
- p->last_point.x = 273;
- p->last_point.y = 354;
- }
- */
- str_p += sprintf(str_p,
- "%d\t%d,%d\t%s\t%d,%d,%d\t%u,%u,%d" //Up to Zeny field
- "\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" //Up to Skill Point
- "\t%d,%d,%d\t%d,%d,%d,%d" //Up to hom id
- "\t%d,%d,%d\t%d,%d,%d,%d,%d" //Up to head bottom
- "\t%d,%d,%d\t%d,%d,%d" //last point + save point
- ",%d,%d,%d,%d,%d\t", //Family info
- p->char_id, p->account_id, p->char_num, p->name, //
- p->class_, p->base_level, p->job_level,
- p->base_exp, p->job_exp, p->zeny,
- p->hp, p->max_hp, p->sp, p->max_sp,
- p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
- p->status_point, p->skill_point,
- p->option, p->karma, p->manner, //
- p->party_id, p->guild_id, p->pet_id, p->hom_id,
- p->hair, p->hair_color, p->clothes_color,
- p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
- p->last_point.map, p->last_point.x, p->last_point.y, //
- p->save_point.map, p->save_point.x, p->save_point.y,
- p->partner_id,p->father,p->mother,p->child,p->fame);
- for(i = 0; i < MAX_MEMOPOINTS; i++)
- if (p->memo_point[i].map) {
- str_p += sprintf(str_p, "%d,%d,%d ", p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_INVENTORY; i++)
- if (p->inventory[i].nameid) {
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
- p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
- p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,",%d",p->inventory[i].card[j]);
- str_p += sprintf(str_p," ");
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_CART; i++)
- if (p->cart[i].nameid) {
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
- p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
- p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,",%d",p->cart[i].card[j]);
- str_p += sprintf(str_p," ");
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_SKILL; i++)
- if (p->skill[i].id && p->skill[i].flag != 1) {
- str_p += sprintf(str_p, "%d,%d ", p->skill[i].id, (p->skill[i].flag == 0) ? p->skill[i].lv : p->skill[i].flag-2);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < reg_num; i++)
- if (reg[i].str[0])
- str_p += sprintf(str_p, "%s,%s ", reg[i].str, reg[i].value);
- *(str_p++) = '\t';
-
- *str_p = '\0';
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-//-------------------------------------------------------------------------
-// Function to set the character from the line (at read of characters file)
-//-------------------------------------------------------------------------
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int *reg_num) {
- char tmp_str[3][128]; //To avoid deleting chars with too long names.
- int tmp_int[256];
- unsigned int tmp_uint[2]; //To read exp....
- int next, len, i, j;
-
- // initilialise character
- memset(p, '\0', sizeof(struct mmo_charstatus));
-
-// Char structure of version 1500 (homun + mapindex maps)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%d,%d,%d\t%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0],
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[44],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- &tmp_int[45], &tmp_int[35], &tmp_int[36],
- &tmp_int[46], &tmp_int[37], &tmp_int[38], &tmp_int[39],
- &tmp_int[40], &tmp_int[41], &tmp_int[42], &tmp_int[43], &next) != 48)
- {
- tmp_int[44] = 0; //Hom ID.
-// Char structure of version 1488 (fame field addition)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0],
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- tmp_str[1], &tmp_int[35], &tmp_int[36],
- tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39],
- &tmp_int[40], &tmp_int[41], &tmp_int[42], &tmp_int[43], &next) != 47)
- {
- tmp_int[43] = 0; //Fame
-// Char structure of version 1363 (family data addition)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- tmp_str[1], &tmp_int[35], &tmp_int[36], //
- tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39],
- &tmp_int[40], &tmp_int[41], &tmp_int[42], &next) != 46)
- {
- tmp_int[40] = 0; // father
- tmp_int[41] = 0; // mother
- tmp_int[42] = 0; // child
-// Char structure version 1008 (marriage partner addition)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- tmp_str[1], &tmp_int[35], &tmp_int[36], //
- tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39], &next) != 43)
- {
- tmp_int[39] = 0; // partner id
-// Char structure version 384 (pet addition)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%127[^,],%d,%d\t%127[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- tmp_str[1], &tmp_int[35], &tmp_int[36], //
- tmp_str[2], &tmp_int[37], &tmp_int[38], &next) != 42)
- {
- tmp_int[26] = 0; // pet id
-// Char structure of a version 1 (original data structure)
- if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%127[^,],%d,%d\t%127[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], //
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- tmp_str[1], &tmp_int[35], &tmp_int[36], //
- tmp_str[2], &tmp_int[37], &tmp_int[38], &next) != 41)
- {
- ShowError("Char-loading: Unrecognized character data version, info lost!\n");
- ShowDebug("Character info: %s\n", str);
- return 0;
- }
- } // Char structure version 384 (pet addition)
- } // Char structure version 1008 (marriage partner addition)
- } // Char structure of version 1363 (family data addition)
- } // Char structure of version 1488 (fame field addition)
- //Convert save data from string to integer for older formats
- tmp_int[45] = mapindex_name2id(tmp_str[1]);
- tmp_int[46] = mapindex_name2id(tmp_str[2]);
- } // Char structure of version 1500 (homun + mapindex maps)
-
- memcpy(p->name, tmp_str[0], NAME_LENGTH-1); //Overflow protection [Skotlex]
- p->char_id = tmp_int[0];
- p->account_id = tmp_int[1];
- p->char_num = tmp_int[2];
- p->class_ = tmp_int[3];
-/* Unneeded unless you are running a real old character database now.
- //Temporal fix until all chars are reverted from peco-flying-class to
- //normal classes. [Skotlex]
- switch (p->class_) {
- case JOB_KNIGHT2: //Job_Knight2
- p->class_ = JOB_KNIGHT;
- break;
- case JOB_CRUSADER2: //Job_Crusader2
- p->class_ = JOB_CRUSADER;
- break;
- case JOB_LORD_KNIGHT2: //Job_Lord_Knight2
- p->class_ = JOB_LORD_KNIGHT;
- break;
- case JOB_PALADIN2: //Job_Paladin2
- p->class_ = JOB_PALADIN;
- break;
- case JOB_BABY_KNIGHT2: //Job_Baby_Knight2
- p->class_ = JOB_BABY_KNIGHT;
- break;
- case JOB_BABY_CRUSADER2: //Job_Baby_Crusader2
- p->class_ = JOB_BABY_CRUSADER;
- break;
- case JOB_STAR_GLADIATOR2: //Job_Star_Gladiator2
- p->class_ = JOB_STAR_GLADIATOR;
- break;
- }
-*/
- p->base_level = tmp_int[4];
- p->job_level = tmp_int[5];
- p->base_exp = tmp_uint[0];
- p->job_exp = tmp_uint[1];
- p->zeny = tmp_int[8];
- p->hp = tmp_int[9];
- p->max_hp = tmp_int[10];
- p->sp = tmp_int[11];
- p->max_sp = tmp_int[12];
- p->str = tmp_int[13];
- p->agi = tmp_int[14];
- p->vit = tmp_int[15];
- p->int_ = tmp_int[16];
- p->dex = tmp_int[17];
- p->luk = tmp_int[18];
- p->status_point = tmp_int[19] > USHRT_MAX ? USHRT_MAX : tmp_int[19];
- p->skill_point = tmp_int[20] > USHRT_MAX ? USHRT_MAX : tmp_int[20];
- p->option = tmp_int[21];
- p->karma = tmp_int[22];
- p->manner = tmp_int[23];
- p->party_id = tmp_int[24];
- p->guild_id = tmp_int[25];
- p->pet_id = tmp_int[26];
- p->hair = tmp_int[27];
- p->hair_color = tmp_int[28];
- p->clothes_color = tmp_int[29];
- p->weapon = tmp_int[30];
- p->shield = tmp_int[31];
- p->head_top = tmp_int[32];
- p->head_mid = tmp_int[33];
- p->head_bottom = tmp_int[34];
- p->last_point.x = tmp_int[35];
- p->last_point.y = tmp_int[36];
- p->save_point.x = tmp_int[37];
- p->save_point.y = tmp_int[38];
- p->partner_id = tmp_int[39];
- p->father = tmp_int[40];
- p->mother = tmp_int[41];
- p->child = tmp_int[42];
- p->fame = tmp_int[43];
- p->hom_id = tmp_int[44];
- p->last_point.map = tmp_int[45];
- p->save_point.map = tmp_int[46];
-
-#ifndef TXT_SQL_CONVERT
- // Some checks
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.char_id == p->char_id) {
- ShowError(CL_RED"mmmo_auth_init: a character has an identical id to another.\n");
- ShowError(" character id #%d -> new character not readed.\n", p->char_id);
- ShowError(" Character saved in log file."CL_RESET"\n");
- return -1;
- } else if (strcmp(char_dat[i].status.name, p->name) == 0) {
- ShowError(CL_RED"mmmo_auth_init: a character name already exists.\n");
- ShowError(" character name '%s' -> new character not read.\n", p->name);
- ShowError(" Character saved in log file."CL_RESET"\n");
- return -2;
- }
- }
-
- if (strcmpi(wisp_server_name, p->name) == 0) {
- ShowWarning("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
- ShowWarning(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name);
- ShowWarning(" Character readed. Suggestion: change the wisp server name.\n");
- char_log("mmo_auth_init: ******WARNING: character name has wisp server name: Character name '%s' = wisp server name '%s'." RETCODE,
- p->name, wisp_server_name);
- }
-#endif //TXT_SQL_CONVERT
- if (str[next] == '\n' || str[next] == '\r')
- return 1; // V‹Kƒf[ƒ^
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- //mapindex memo format
- if (sscanf(str+next, "%d,%d,%d%n", &tmp_int[2], &tmp_int[0], &tmp_int[1], &len) != 3)
- { //Old string-based memo format.
- if (sscanf(str+next, "%[^,],%d,%d%n", tmp_str[0], &tmp_int[0], &tmp_int[1], &len) != 3)
- return -3;
- tmp_int[2] = mapindex_name2id(tmp_str[0]);
- }
- if (i < MAX_MEMOPOINTS)
- { //Avoid overflowing (but we must also read through all saved memos)
- p->memo_point[i].x = tmp_int[0];
- p->memo_point[i].y = tmp_int[1];
- p->memo_point[i].map = tmp_int[2];
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str[0], &len) == 8)
- {
- p->inventory[i].id = tmp_int[0];
- p->inventory[i].nameid = tmp_int[1];
- p->inventory[i].amount = tmp_int[2];
- p->inventory[i].equip = tmp_int[3];
- p->inventory[i].identify = tmp_int[4];
- p->inventory[i].refine = tmp_int[5];
- p->inventory[i].attribute = tmp_int[6];
-
- for(j = 0; j < MAX_SLOTS && tmp_str[0] && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
- p->inventory[i].card[j] = tmp_int[0];
-
- next += len;
- if (str[next] == ' ')
- next++;
- } else // invalid structure
- return -4;
- }
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str[0], &len) == 8)
- {
- p->cart[i].id = tmp_int[0];
- p->cart[i].nameid = tmp_int[1];
- p->cart[i].amount = tmp_int[2];
- p->cart[i].equip = tmp_int[3];
- p->cart[i].identify = tmp_int[4];
- p->cart[i].refine = tmp_int[5];
- p->cart[i].attribute = tmp_int[6];
-
- for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
- p->cart[i].card[j] = tmp_int[0];
-
- next += len;
- if (str[next] == ' ')
- next++;
- } else // invalid structure
- return -5;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len) != 2)
- return -6;
- p->skill[tmp_int[0]].id = tmp_int[0];
- p->skill[tmp_int[0]].lv = tmp_int[1];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
- if (sscanf(str + next, "%[^,],%[^ ] %n", reg[i].str, reg[i].value, &len) != 2) {
- // because some scripts are not correct, the str can be "". So, we must check that.
- // If it's, we must not refuse the character, but just this REG value.
- // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good)
- if (str[next] == ',' && sscanf(str + next, ",%[^ ] %n", reg[i].value, &len) == 1)
- i--;
- else
- return -7;
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
- *reg_num = i;
-
- return 1;
-}
-//---------------------------------
-// Function to read friend list
-//---------------------------------
-
-int parse_friend_txt(struct mmo_charstatus *p)
-{
- char line[1024], temp[1024];
- int pos = 0, count = 0, next;
- int i,len;
- FILE *fp;
-
- // Open the file and look for the ID
- fp = fopen(friends_txt, "r");
-
- if(fp == NULL)
- return -1;
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- if(line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%d%n",&i, &pos) < 1 || i != p->char_id)
- continue; //Not this line...
- //Read friends
- len = strlen(line);
- next = pos;
- for (count = 0; next < len && count < MAX_FRIENDS; count++)
- { //Read friends.
- if (sscanf(line+next, ",%d,%d,%23[^,^\n]%n",&p->friends[count].account_id,&p->friends[count].char_id, p->friends[count].name, &pos) < 3)
- { //Invalid friend?
- memset(&p->friends[count], 0, sizeof(p->friends[count]));
- break;
- }
- next+=pos;
- //What IF the name contains a comma? while the next field is not a
- //number, we assume it belongs to the current name. [Skotlex]
- //NOTE: Of course, this will fail if someone sets their name to something like
- //Bob,2005 but... meh, it's the problem of parsing a text file (encasing it in "
- //won't do as quotes are also valid name chars!)
- while(next < len && sscanf(line+next, ",%23[^,^\n]%n", temp, &pos) > 0)
- {
- if (atoi(temp)) //We read the next friend, just continue.
- break;
- //Append the name.
- next+=pos;
- i = strlen(p->friends[count].name);
- if (i + strlen(temp) +1 < NAME_LENGTH)
- {
- p->friends[count].name[i] = ',';
- strcpy(p->friends[count].name+i+1, temp);
- }
- } //End Guess Block
- } //Friend's for.
- break; //Found friends.
- }
- fclose(fp);
- return count;
-}
-#ifndef TXT_SQL_CONVERT
-//---------------------------------
-// Function to read characters file
-//---------------------------------
-int mmo_char_init(void) {
- char line[65536];
- int ret, line_count;
- FILE *fp;
-
- char_max = 256;
- char_dat = (struct character_data*)aCalloc(sizeof(struct character_data) * 256, 1);
- if (!char_dat) {
- ShowFatalError("out of memory: mmo_char_init (calloc of char_dat).\n");
- exit(1);
- }
- char_num = 0;
-
- fp = fopen(char_txt, "r");
-
- if (fp == NULL) {
- ShowError("Characters file not found: %s.\n", char_txt);
- char_log("Characters file not found: %s." RETCODE, char_txt);
- char_log("Id for the next created character: %d." RETCODE, char_id_count);
- return 0;
- }
-
- line_count = 0;
- while(fgets(line, sizeof(line)-1, fp)) {
- int i, j;
- line_count++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
-
- j = 0;
- if (sscanf(line, "%d\t%%newid%%%n", &i, &j) == 1 && j > 0) {
- if (char_id_count < i)
- char_id_count = i;
- continue;
- }
-
- if (char_num >= char_max) {
- char_max += 256;
- char_dat = (struct character_data*)aRealloc(char_dat, sizeof(struct character_data) * char_max);
- if (!char_dat) {
- ShowFatalError("Out of memory: mmo_char_init (realloc of char_dat).\n");
- char_log("Out of memory: mmo_char_init (realloc of char_dat)." RETCODE);
- exit(1);
- }
- }
-
- ret = mmo_char_fromstr(line, &char_dat[char_num].status, char_dat[char_num].global, &char_dat[char_num].global_num);
-
- // Initialize friends list
- parse_friend_txt(&char_dat[char_num].status); // Grab friends for the character
-
- if (ret > 0) { // negative value or zero for errors
- if (char_dat[char_num].status.char_id >= char_id_count)
- char_id_count = char_dat[char_num].status.char_id + 1;
- char_num++;
- } else {
- ShowError("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count);
- ShowError(" -> Character saved in log file.\n");
- switch (ret) {
- case -1:
- char_log("Duplicate character id in the next character line (character not readed):" RETCODE);
- break;
- case -2:
- char_log("Duplicate character name in the next character line (character not readed):" RETCODE);
- break;
- case -3:
- char_log("Invalid memo point structure in the next character line (character not readed):" RETCODE);
- break;
- case -4:
- char_log("Invalid inventory item structure in the next character line (character not readed):" RETCODE);
- break;
- case -5:
- char_log("Invalid cart item structure in the next character line (character not readed):" RETCODE);
- break;
- case -6:
- char_log("Invalid skill structure in the next character line (character not readed):" RETCODE);
- break;
- case -7:
- char_log("Invalid register structure in the next character line (character not readed):" RETCODE);
- break;
- default: // 0
- char_log("Unabled to get a character in the next line - Basic structure of line (before inventory) is incorrect (character not readed):" RETCODE);
- break;
- }
- char_log("%s", line);
- }
- }
- fclose(fp);
-
- if (char_num == 0) {
- ShowNotice("mmo_char_init: No character found in %s.\n", char_txt);
- char_log("mmo_char_init: No character found in %s." RETCODE, char_txt);
- } else if (char_num == 1) {
- ShowStatus("mmo_char_init: 1 character read in %s.\n", char_txt);
- char_log("mmo_char_init: 1 character read in %s." RETCODE, char_txt);
- } else {
- ShowStatus("mmo_char_init: %d characters read in %s.\n", char_num, char_txt);
- char_log("mmo_char_init: %d characters read in %s." RETCODE, char_num, char_txt);
- }
-
- char_log("Id for the next created character: %d." RETCODE, char_id_count);
-
- return 0;
-}
-
-//---------------------------------------------------------
-// Function to save characters in files (speed up by [Yor])
-//---------------------------------------------------------
-void mmo_char_sync(void) {
- char line[65536],f_line[1024];
- int i, j, k;
- int lock;
- FILE *fp,*f_fp;
- //int *id = (int *) aMalloc(sizeof(int) * char_num);
- CREATE_BUFFER(id, int, char_num);
-
- // Sorting before save (by [Yor])
- for(i = 0; i < char_num; i++) {
- id[i] = i;
- for(j = 0; j < i; j++) {
- if ((char_dat[i].status.account_id < char_dat[id[j]].status.account_id) ||
- // if same account id, we sort by slot.
- (char_dat[i].status.account_id == char_dat[id[j]].status.account_id &&
- char_dat[i].status.char_num < char_dat[id[j]].status.char_num)) {
- for(k = i; k > j; k--)
- id[k] = id[k-1];
- id[j] = i; // id[i]
- break;
- }
- }
- }
-
- // Data save
- fp = lock_fopen(char_txt, &lock);
- if (fp == NULL) {
- ShowWarning("Server can't not save characters.\n");
- char_log("WARNING: Server can't not save characters." RETCODE);
- } else {
- for(i = 0; i < char_num; i++) {
- // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
- mmo_char_tostr(line, &char_dat[id[i]].status, char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
- lock_fclose(fp, char_txt, &lock);
- }
-
- // Data save (backup)
- if (backup_txt_flag) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
- fp = lock_fopen(backup_txt, &lock);
- if (fp == NULL) {
- ShowWarning("Server can't not create backup of characters file.\n");
- char_log("WARNING: Server can't not create backup of characters file." RETCODE);
- //aFree(id); // free up the memory before leaving -.- [Ajarn]
- DELETE_BUFFER(id);
- return;
- }
- for(i = 0; i < char_num; i++) {
- // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
- mmo_char_tostr(line, &char_dat[id[i]].status,char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
- lock_fclose(fp, backup_txt, &lock);
- }
-
- // Friends List data save (davidsiaw)
- f_fp = lock_fopen(friends_txt, &lock);
- for(i = 0; i < char_num; i++) {
- mmo_friends_list_data_str(f_line, &char_dat[id[i]].status);
- fprintf(f_fp, "%s" RETCODE, f_line);
- }
-
- lock_fclose(f_fp, friends_txt, &lock);
-
- //aFree(id);
- DELETE_BUFFER(id);
-
- return;
-}
-
-//----------------------------------------------------
-// Function to save (in a periodic way) datas in files
-//----------------------------------------------------
-int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
- if (save_log)
- ShowInfo("Saving all files...\n");
- mmo_char_sync();
- inter_save();
- return 0;
-}
-
-//-----------------------------------
-// Function to create a new character
-//-----------------------------------
-int make_new_char(int fd, unsigned char *dat) {
- int i;
- struct char_session_data *sd;
- char name[NAME_LENGTH];
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- // remove control characters from the name
- strncpy(name, dat, NAME_LENGTH);
- name[NAME_LENGTH-1] = '\0'; //Trunc name to max possible value (23)
-
- trim(name,TRIM_CHARS); //Trim character name. [Skotlex]
-
- //check name != main chat nick [LuzZza]
- if(strcmpi(name, main_chat_nick) == 0) {
- char_log("Create char failed (%d): this nick (%s) reserved for mainchat messages." RETCODE,
- sd->account_id, name);
- return -1;
- }
-
- if (remove_control_chars((unsigned char *)name)) {
- char_log("Make new char error (control char received in the name): (connection #%d, account: %d)." RETCODE,
- fd, sd->account_id);
- return -1;
- }
-
- // check lenght of character name
- if (strlen(name) < 4) {
- char_log("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." RETCODE,
- fd, sd->account_id, dat);
- return -1;
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
- fd, sd->account_id, name, name[i]);
- return -1;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
- fd, sd->account_id, dat, dat[i]);
- return -1;
- }
- } // else, all letters/symbols are authorised (except control char removed before)
-
- if (dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5*6 || // stats
- dat[30] >= 9 || // slots (dat[30] can not be negativ)
- dat[33] <= 0 || dat[33] >= 24 || // hair style
- dat[31] >= 9) { // hair color (dat[31] can not be negativ)
- char_log("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
-
- // check individual stat value
- for(i = 24; i <= 29; i++) {
- if (dat[i] < 1 || dat[i] > 9) {
- char_log("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- } // now we know that every stat has proper value but we have to check if str/int agi/luk vit/dex pairs are correct
-
- if( ((dat[24]+dat[27]) > 10) || ((dat[25]+dat[29]) > 10) || ((dat[26]+dat[28]) > 10) ) {
- if (log_char) {
- char_log("Make new char error (invalid stat value): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- } // now when we have passed all stat checks
-
- for(i = 0; i < char_num; i++) {
- if ((name_ignoring_case != 0 && strncmp(char_dat[i].status.name, name, NAME_LENGTH) == 0) ||
- (name_ignoring_case == 0 && strncmpi(char_dat[i].status.name, name, NAME_LENGTH) == 0)) {
- char_log("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- if (char_dat[i].status.account_id == sd->account_id && char_dat[i].status.char_num == dat[30]) {
- char_log("Make new char error (slot already used): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- }
-
- if (strcmp(wisp_server_name, name) == 0) {
- char_log("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], name, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
-
- if (char_num >= char_max) {
- char_max += 256;
- char_dat = (struct character_data*)aRealloc(char_dat, sizeof(struct character_data) * char_max);
- if (!char_dat) {
- ShowFatalError("Out of memory: make_new_char (realloc of char_dat).\n");
- char_log("Out of memory: make_new_char (realloc of char_dat)." RETCODE);
- exit(1);
- }
- }
-
- char_log("Creation of New Character: (connection #%d, account: %d) slot %d, character Name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
-
- memset(&char_dat[i], 0, sizeof(struct character_data));
-
- char_dat[i].status.char_id = char_id_count++;
- char_dat[i].status.account_id = sd->account_id;
- char_dat[i].status.char_num = dat[30];
- strcpy(char_dat[i].status.name,name);
- char_dat[i].status.class_ = 0;
- char_dat[i].status.base_level = 1;
- char_dat[i].status.job_level = 1;
- char_dat[i].status.base_exp = 0;
- char_dat[i].status.job_exp = 0;
- char_dat[i].status.zeny = start_zeny;
- char_dat[i].status.str = dat[24];
- char_dat[i].status.agi = dat[25];
- char_dat[i].status.vit = dat[26];
- char_dat[i].status.int_ = dat[27];
- char_dat[i].status.dex = dat[28];
- char_dat[i].status.luk = dat[29];
- char_dat[i].status.max_hp = 40 * (100 + char_dat[i].status.vit) / 100;
- char_dat[i].status.max_sp = 11 * (100 + char_dat[i].status.int_) / 100;
- char_dat[i].status.hp = char_dat[i].status.max_hp;
- char_dat[i].status.sp = char_dat[i].status.max_sp;
- char_dat[i].status.status_point = 0;
- char_dat[i].status.skill_point = 0;
- char_dat[i].status.option = 0;
- char_dat[i].status.karma = 0;
- char_dat[i].status.manner = 0;
- char_dat[i].status.party_id = 0;
- char_dat[i].status.guild_id = 0;
- char_dat[i].status.hair = dat[33];
- char_dat[i].status.hair_color = dat[31];
- char_dat[i].status.clothes_color = 0;
- char_dat[i].status.inventory[0].nameid = start_weapon; // Knife
- char_dat[i].status.inventory[0].amount = 1;
- char_dat[i].status.inventory[0].equip = 0x02;
- char_dat[i].status.inventory[0].identify = 1;
- char_dat[i].status.inventory[1].nameid = start_armor; // Cotton Shirt
- char_dat[i].status.inventory[1].amount = 1;
- char_dat[i].status.inventory[1].equip = 0x10;
- char_dat[i].status.inventory[1].identify = 1;
- char_dat[i].status.weapon = 1;
- char_dat[i].status.shield = 0;
- char_dat[i].status.head_top = 0;
- char_dat[i].status.head_mid = 0;
- char_dat[i].status.head_bottom = 0;
- memcpy(&char_dat[i].status.last_point, &start_point, sizeof(start_point));
- memcpy(&char_dat[i].status.save_point, &start_point, sizeof(start_point));
- char_num++;
-
- mmo_char_sync();
- return i;
-}
-
-//----------------------------------------------------
-// This function return the name of the job (by [Yor])
-//----------------------------------------------------
-char * job_name(int class_) {
- switch (class_) {
- case JOB_NOVICE: return "Novice";
- case JOB_SWORDMAN: return "Swordsman";
- case JOB_MAGE: return "Mage";
- case JOB_ARCHER: return "Archer";
- case JOB_ACOLYTE: return "Acolyte";
- case JOB_MERCHANT: return "Merchant";
- case JOB_THIEF: return "Thief";
- case JOB_KNIGHT: return "Knight";
- case JOB_PRIEST: return "Priest";
- case JOB_WIZARD: return "Wizard";
- case JOB_BLACKSMITH: return "Blacksmith";
- case JOB_HUNTER: return "Hunter";
- case JOB_ASSASSIN: return "Assassin";
- case JOB_KNIGHT2: return "Peco-Knight";
- case JOB_CRUSADER: return "Crusader";
- case JOB_MONK: return "Monk";
- case JOB_SAGE: return "Sage";
- case JOB_ROGUE: return "Rogue";
- case JOB_ALCHEMIST: return "Alchemist";
- case JOB_BARD: return "Bard";
- case JOB_DANCER: return "Dancer";
- case JOB_CRUSADER2: return "Peco-Crusader";
- case JOB_WEDDING: return "Wedding";
- case JOB_SUPER_NOVICE: return "Super Novice";
- case JOB_GUNSLINGER: return "Gunslinger";
- case JOB_NINJA: return "Ninja";
- case JOB_XMAS: return "Christmas";
- case JOB_NOVICE_HIGH: return "Novice High";
- case JOB_SWORDMAN_HIGH: return "Swordsman High";
- case JOB_MAGE_HIGH: return "Mage High";
- case JOB_ARCHER_HIGH: return "Archer High";
- case JOB_ACOLYTE_HIGH: return "Acolyte High";
- case JOB_MERCHANT_HIGH: return "Merchant High";
- case JOB_THIEF_HIGH: return "Thief High";
- case JOB_LORD_KNIGHT: return "Lord Knight";
- case JOB_HIGH_PRIEST: return "High Priest";
- case JOB_HIGH_WIZARD: return "High Wizard";
- case JOB_WHITESMITH: return "Whitesmith";
- case JOB_SNIPER: return "Sniper";
- case JOB_ASSASSIN_CROSS: return "Assassin Cross";
- case JOB_LORD_KNIGHT2: return "Peko Knight";
- case JOB_PALADIN: return "Paladin";
- case JOB_CHAMPION: return "Champion";
- case JOB_PROFESSOR: return "Professor";
- case JOB_STALKER: return "Stalker";
- case JOB_CREATOR: return "Creator";
- case JOB_CLOWN: return "Clown";
- case JOB_GYPSY: return "Gypsy";
- case JOB_PALADIN2: return "Peko Paladin";
- case JOB_BABY: return "Baby Novice";
- case JOB_BABY_SWORDMAN: return "Baby Swordsman";
- case JOB_BABY_MAGE: return "Baby Mage";
- case JOB_BABY_ARCHER: return "Baby Archer";
- case JOB_BABY_ACOLYTE: return "Baby Acolyte";
- case JOB_BABY_MERCHANT: return "Baby Merchant";
- case JOB_BABY_THIEF: return "Baby Thief";
- case JOB_BABY_KNIGHT: return "Baby Knight";
- case JOB_BABY_PRIEST: return "Baby Priest";
- case JOB_BABY_WIZARD: return "Baby Wizard";
- case JOB_BABY_BLACKSMITH: return "Baby Blacksmith";
- case JOB_BABY_HUNTER: return "Baby Hunter";
- case JOB_BABY_ASSASSIN: return "Baby Assassin";
- case JOB_BABY_KNIGHT2: return "Baby Peco Knight";
- case JOB_BABY_CRUSADER: return "Baby Crusader";
- case JOB_BABY_MONK: return "Baby Monk";
- case JOB_BABY_SAGE: return "Baby Sage";
- case JOB_BABY_ROGUE: return "Baby Rogue";
- case JOB_BABY_ALCHEMIST: return "Baby Alchemist";
- case JOB_BABY_BARD: return "Baby Bard";
- case JOB_BABY_DANCER: return "Baby Dancer";
- case JOB_BABY_CRUSADER2: return "Baby Peco Crusader";
- case JOB_SUPER_BABY: return "Super Baby";
- case JOB_TAEKWON: return "Taekwon";
- case JOB_STAR_GLADIATOR: return "Star Gladiator";
- case JOB_STAR_GLADIATOR2: return "Flying Star Gladiator";
- case JOB_SOUL_LINKER: return "Soul Linker";
- }
- return "Unknown Job";
-}
-
-static int create_online_files_sub(DBKey key, void* data, va_list va)
-{
- struct online_char_data *character;
- int* players;
- int *id;
- int j,k,l;
- character = (struct online_char_data*) data;
- players = va_arg(va, int*);
- id = va_arg(va, int*);
-
- // check if map-server is online
- if (character->server == -1 || character->char_id == -1) { //Character not currently online.
- return -1;
- }
-
- j = character->server;
- if (server_fd[j] < 0) {
- server[j].users = 0;
- return -1;
- }
- // search position of character in char_dat and sort online characters.
- for(j = 0; j < char_num; j++) {
- if (char_dat[j].status.char_id != character->char_id)
- continue;
- id[*players] = j;
- // use sorting option
- switch (online_sorting_option) {
- case 1: // by name (without case sensitive)
- for(k = 0; k < *players; k++)
- if (stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0 ||
- // if same name, we sort with case sensitive.
- (stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) == 0 &&
- strcmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
- for(l = *players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[*players]
- break;
- }
- break;
- case 2: // by zeny
- for(k = 0; k < *players; k++)
- if (char_dat[j].status.zeny < char_dat[id[k]].status.zeny ||
- // if same number of zenys, we sort by name.
- (char_dat[j].status.zeny == char_dat[id[k]].status.zeny &&
- stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
- for(l = *players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[*players]
- break;
- }
- break;
- case 3: // by base level
- for(k = 0; k < *players; k++)
- if (char_dat[j].status.base_level < char_dat[id[k]].status.base_level ||
- // if same base level, we sort by base exp.
- (char_dat[j].status.base_level == char_dat[id[k]].status.base_level &&
- char_dat[j].status.base_exp < char_dat[id[k]].status.base_exp)) {
- for(l = *players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[*players]
- break;
- }
- break;
- case 4: // by job (and job level)
- for(k = 0; k < *players; k++)
- if (char_dat[j].status.class_ < char_dat[id[k]].status.class_ ||
- // if same job, we sort by job level.
- (char_dat[j].status.class_ == char_dat[id[k]].status.class_ &&
- char_dat[j].status.job_level < char_dat[id[k]].status.job_level) ||
- // if same job and job level, we sort by job exp.
- (char_dat[j].status.class_ == char_dat[id[k]].status.class_ &&
- char_dat[j].status.job_level == char_dat[id[k]].status.job_level &&
- char_dat[j].status.job_exp < char_dat[id[k]].status.job_exp)) {
- for(l = *players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[*players]
- break;
- }
- break;
- case 5: // by location map name
- {
- const char *map1, *map2;
- map1 = mapindex_id2name(char_dat[j].status.last_point.map);
-
- for(k = 0; k < *players; k++) {
- map2 = mapindex_id2name(char_dat[id[k]].status.last_point.map);
- if (!map1 || !map2 || //Avoid sorting if either one failed to resolve.
- stricmp(map1, map2) < 0 ||
- // if same map name, we sort by name.
- (stricmp(map1, map2) == 0 &&
- stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
- for(l = *players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[*players]
- break;
- }
- }
- }
- break;
- default: // 0 or invalid value: no sorting
- break;
- }
- (*players)++;
- break;
- }
- return 0;
-}
-//-------------------------------------------------------------
-// Function to create the online files (txt and html). by [Yor]
-//-------------------------------------------------------------
-void create_online_files(void) {
- unsigned int k, j; // for loop with strlen comparing
- int i, l; // for loops
- int players; // count the number of players
- FILE *fp; // for the txt file
- FILE *fp2; // for the html file
- char temp[256]; // to prepare what we must display
- time_t time_server; // for number of seconds
- struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
- int id[4096];
-
- if (online_display_option == 0) // we display nothing, so return
- return;
-
- // Get number of online players, id of each online players, and verify if a server is offline
- players = 0;
- online_char_db->foreach(online_char_db, create_online_files_sub, &players, &id);
-
- // write files
- fp = fopen(online_txt_filename, "w");
- if (fp != NULL) {
- fp2 = fopen(online_html_filename, "w");
- if (fp2 != NULL) {
- // get time
- time(&time_server); // get time in seconds since 1/1/1970
- datetime = localtime(&time_server); // convert seconds in structure
- strftime(temp, sizeof(temp), "%d %b %Y %X", datetime); // like sprintf, but only for date/time (05 dec 2003 15:12:52)
- // write heading
- fprintf(fp2, "<HTML>\n");
- fprintf(fp2, " <META http-equiv=\"Refresh\" content=\"%d\">\n", online_refresh_html); // update on client explorer every x seconds
- fprintf(fp2, " <HEAD>\n");
- fprintf(fp2, " <TITLE>Online Players on %s</TITLE>\n", server_name);
- fprintf(fp2, " </HEAD>\n");
- fprintf(fp2, " <BODY>\n");
- fprintf(fp2, " <H3>Online Players on %s (%s):</H3>\n", server_name, temp);
- fprintf(fp, "Online Players on %s (%s):\n", server_name, temp);
- fprintf(fp, "\n");
-
- for (i = 0; i < players; i++) {
- // if it's the first player
- if (i == 0) {
- j = 0; // count the number of characters for the txt version and to set the separate line
- fprintf(fp2, " <table border=\"1\" cellspacing=\"1\">\n");
- fprintf(fp2, " <tr>\n");
- if ((online_display_option & 1) || (online_display_option & 64)) {
- fprintf(fp2, " <td><b>Name</b></td>\n");
- if (online_display_option & 64) {
- fprintf(fp, "Name "); // 30
- j += 30;
- } else {
- fprintf(fp, "Name "); // 25
- j += 25;
- }
- }
- if ((online_display_option & 6) == 6) {
- fprintf(fp2, " <td><b>Job (levels)</b></td>\n");
- fprintf(fp, "Job Levels "); // 27
- j += 27;
- } else if (online_display_option & 2) {
- fprintf(fp2, " <td><b>Job</b></td>\n");
- fprintf(fp, "Job "); // 19
- j += 19;
- } else if (online_display_option & 4) {
- fprintf(fp2, " <td><b>Levels</b></td>\n");
- fprintf(fp, " Levels "); // 8
- j += 8;
- }
- if (online_display_option & 24) { // 8 or 16
- fprintf(fp2, " <td><b>Location</b></td>\n");
- if (online_display_option & 16) {
- fprintf(fp, "Location ( x , y ) "); // 23
- j += 23;
- } else {
- fprintf(fp, "Location "); // 13
- j += 13;
- }
- }
- if (online_display_option & 32) {
- fprintf(fp2, " <td ALIGN=CENTER><b>zenys</b></td>\n");
- fprintf(fp, " Zenys "); // 16
- j += 16;
- }
- fprintf(fp2, " </tr>\n");
- fprintf(fp, "\n");
- for (k = 0; k < j; k++)
- fprintf(fp, "-");
- fprintf(fp, "\n");
- }
- fprintf(fp2, " <tr>\n");
- // get id of the character (more speed)
- j = id[i];
- // displaying the character name
- if ((online_display_option & 1) || (online_display_option & 64)) { // without/with 'GM' display
- strcpy(temp, char_dat[j].status.name);
- l = isGM(char_dat[j].status.account_id);
- if (online_display_option & 64) {
- if (l >= online_gm_display_min_level)
- fprintf(fp, "%-24s (GM) ", temp);
- else
- fprintf(fp, "%-24s ", temp);
- } else
- fprintf(fp, "%-24s ", temp);
- // name of the character in the html (no < >, because that create problem in html code)
- fprintf(fp2, " <td>");
- if ((online_display_option & 64) && l >= online_gm_display_min_level)
- fprintf(fp2, "<b>");
- for (k = 0; k < strlen(temp); k++) {
- switch(temp[k]) {
- case '<': // <
- fprintf(fp2, "&lt;");
- break;
- case '>': // >
- fprintf(fp2, "&gt;");
- break;
- default:
- fprintf(fp2, "%c", temp[k]);
- break;
- };
- }
- if ((online_display_option & 64) && l >= online_gm_display_min_level)
- fprintf(fp2, "</b> (GM)");
- fprintf(fp2, "</td>\n");
- }
- // displaying of the job
- if (online_display_option & 6) {
- char * jobname = job_name(char_dat[j].status.class_);
- if ((online_display_option & 6) == 6) {
- fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].status.base_level, char_dat[j].status.job_level);
- fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].status.base_level, char_dat[j].status.job_level);
- } else if (online_display_option & 2) {
- fprintf(fp2, " <td>%s</td>\n", jobname);
- fprintf(fp, "%-18s ", jobname);
- } else if (online_display_option & 4) {
- fprintf(fp2, " <td>%d/%d</td>\n", char_dat[j].status.base_level, char_dat[j].status.job_level);
- fprintf(fp, "%3d/%3d ", char_dat[j].status.base_level, char_dat[j].status.job_level);
- }
- }
- // displaying of the map
- if (online_display_option & 24) { // 8 or 16
- // prepare map name
- memcpy(temp, mapindex_id2name(char_dat[j].status.last_point.map), MAP_NAME_LENGTH);
- temp[MAP_NAME_LENGTH] = '\0';
- if (strstr(temp, ".gat") != NULL) {
- temp[strstr(temp, ".gat") - temp] = 0; // suppress the '.gat'
- }
- // write map name
- if (online_display_option & 16) { // map-name AND coordinates
- fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].status.last_point.x, char_dat[j].status.last_point.y);
- fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].status.last_point.x, char_dat[j].status.last_point.y);
- } else {
- fprintf(fp2, " <td>%s</td>\n", temp);
- fprintf(fp, "%-12s ", temp);
- }
- }
- // displaying nimber of zenys
- if (online_display_option & 32) {
- // write number of zenys
- if (char_dat[j].status.zeny == 0) { // if no zeny
- fprintf(fp2, " <td ALIGN=RIGHT>no zeny</td>\n");
- fprintf(fp, " no zeny ");
- } else {
- fprintf(fp2, " <td ALIGN=RIGHT>%d z</td>\n", char_dat[j].status.zeny);
- fprintf(fp, "%13d z ", char_dat[j].status.zeny);
- }
- }
- fprintf(fp, "\n");
- fprintf(fp2, " </tr>\n");
- }
- // If we display at least 1 player
- if (players > 0) {
- fprintf(fp2, " </table>\n");
- fprintf(fp, "\n");
- }
-
- // Displaying number of online players
- if (players == 0) {
- fprintf(fp2, " <p>No user is online.</p>\n");
- fprintf(fp, "No user is online.\n");
- } else if (players == 1) {
- fprintf(fp2, " <p>%d user is online.</p>\n", players);
- fprintf(fp, "%d user is online.\n", players);
- } else {
- fprintf(fp2, " <p>%d users are online.</p>\n", players);
- fprintf(fp, "%d users are online.\n", players);
- }
- fprintf(fp2, " </BODY>\n");
- fprintf(fp2, "</HTML>\n");
- fclose(fp2);
- }
- fclose(fp);
- }
-
- return;
-}
-
-//---------------------------------------------------------------------
-// This function return the number of online players in all map-servers
-//---------------------------------------------------------------------
-int count_users(void) {
- int i, users;
-
- users = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- users += server[i].users;
-
- return users;
-}
-
-//----------------------------------------
-// Function to send characters to a player
-//----------------------------------------
-int mmo_char_send006b(int fd, struct char_session_data *sd) {
- int i, j, found_num;
- struct mmo_charstatus *p;
-//#ifdef NEW_006b
- const int offset = 24;
-//#else
-// const int offset = 4;
-//#endif
-
- set_char_online(-1, 99,sd->account_id);
-
- found_num = 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == sd->account_id) {
- sd->found_char[found_num] = i;
- found_num++;
- if (found_num == 9)
- break;
- }
- }
- for(i = found_num; i < 9; i++)
- sd->found_char[i] = -1;
-
- WFIFOHEAD(fd, offset + found_num * 106);
- memset(WFIFOP(fd,0), 0, offset + found_num * 106);
- WFIFOW(fd,0) = 0x6b;
- WFIFOW(fd,2) = offset + found_num * 106;
-
- for(i = 0; i < found_num; i++) {
- p = &char_dat[sd->found_char[i]].status;
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
- WFIFOL(fd,j+16) = p->job_level;
-
- WFIFOL(fd,j+20) = 0;
- WFIFOL(fd,j+24) = 0;
- WFIFOL(fd,j+28) = p->option;
-
- WFIFOL(fd,j+32) = p->karma;
- WFIFOL(fd,j+36) = p->manner;
-
- WFIFOW(fd,j+40) = (p->status_point>SHRT_MAX) ? SHRT_MAX : p->status_point;
- WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
- WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
- WFIFOW(fd,j+52) = p->class_;
- WFIFOW(fd,j+54) = p->hair;
- WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = (p->skill_point>SHRT_MAX)? SHRT_MAX : p->skill_point;
- WFIFOW(fd,j+62) = p->head_bottom;
- WFIFOW(fd,j+64) = p->shield;
- WFIFOW(fd,j+66) = p->head_top;
- WFIFOW(fd,j+68) = p->head_mid;
- WFIFOW(fd,j+70) = p->hair_color;
- WFIFOW(fd,j+72) = p->clothes_color;
-
- memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
-
- WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str;
- WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi;
- WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit;
- WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_;
- WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex;
- WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk;
- WFIFOB(fd,j+104) = p->char_num;
- }
-
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-// —£¥(char휎ž‚ÉŽg—p)
-int char_divorce(struct mmo_charstatus *cs) {
- if (cs == NULL)
- return 0;
-
- if (cs->partner_id > 0){
- int i, j;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.char_id == cs->partner_id && char_dat[i].status.partner_id == cs->char_id) {
- cs->partner_id = 0;
- char_dat[i].status.partner_id = 0;
- for(j = 0; j < MAX_INVENTORY; j++)
- if (char_dat[i].status.inventory[j].nameid == WEDDING_RING_M || char_dat[i].status.inventory[j].nameid == WEDDING_RING_F)
- memset(&char_dat[i].status.inventory[j], 0, sizeof(char_dat[i].status.inventory[0]));
- if (cs->inventory[j].nameid == WEDDING_RING_M || cs->inventory[j].nameid == WEDDING_RING_F)
- memset(&cs->inventory[j], 0, sizeof(cs->inventory[0]));
- return 0;
- }
- }
- }
- return 0;
-}
-
-int char_married(int pl1,int pl2) {
- return (char_dat[pl1].status.char_id == char_dat[pl2].status.partner_id && char_dat[pl2].status.char_id == char_dat[pl1].status.partner_id);
-}
-
-int char_child(int parent_id, int child_id) {
- return (char_dat[parent_id].status.child == char_dat[child_id].status.char_id &&
- ((char_dat[parent_id].status.char_id == char_dat[child_id].status.father) ||
- (char_dat[parent_id].status.char_id == char_dat[child_id].status.mother)));
-}
-
-int char_family(int cid1, int cid2, int cid3) {
- int i, idx1 = -1, idx2 =-1;//, idx3 =-1;
- for(i = 0; i < char_num && (idx1 == -1 || idx2 == -1/* || idx3 == 1*/); i++)
- {
- if (char_dat[i].status.char_id == cid1)
- idx1 = i;
- if (char_dat[i].status.char_id == cid2)
- idx2 = i;
-// if (char_dat[i].status.char_id == cid2)
-// idx3 = i;
- }
- if (idx1 == -1 || idx2 == -1/* || idx3 == -1*/)
- return 0; //Some character not found??
-
- //Unless the dbs are corrupted, these 3 checks should suffice, even though
- //we could do a lot more checks and force cross-reference integrity.
- if(char_dat[idx1].status.partner_id == cid2 &&
- char_dat[idx1].status.child == cid3)
- return cid3; //cid1/cid2 parents. cid3 child.
-
- if(char_dat[idx1].status.partner_id == cid3 &&
- char_dat[idx1].status.child == cid2)
- return cid2; //cid1/cid3 parents. cid2 child.
-
- if(char_dat[idx2].status.partner_id == cid3 &&
- char_dat[idx2].status.child == cid1)
- return cid1; //cid2/cid3 parents. cid1 child.
- return 0;
-}
-
-//Clears the given party id from all characters.
-//Since sometimes the party format changes and parties must be wiped, this
-//method is required to prevent stress during the "party not found!" stages.
-void char_clearparty(int party_id)
-{
- int i;
- for(i = 0; i < char_num; i++)
- {
- if (char_dat[i].status.party_id == party_id)
- char_dat[i].status.party_id = 0;
- }
-}
-
-//------------------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
-//------------------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//----------------------------------------------------------------------
-// Force disconnection of an online player (with account value) by [Yor]
-//----------------------------------------------------------------------
-int disconnect_player(int account_id) {
- int i;
- struct char_session_data *sd;
-
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == account_id) {
- session[i]->eof = 1;
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-// ƒLƒƒƒ‰íœ‚É”º‚¤ƒf[ƒ^íœ
-static int char_delete(struct mmo_charstatus *cs) {
- int j;
-
- // ƒyƒbƒgíœ
- if (cs->pet_id)
- inter_pet_delete(cs->pet_id);
- if (cs->hom_id)
- inter_homun_delete(cs->hom_id);
- for (j = 0; j < MAX_INVENTORY; j++)
- if (cs->inventory[j].card[0] == (short)0xff00)
- inter_pet_delete(MakeDWord(cs->inventory[j].card[1],cs->inventory[j].card[2]));
- for (j = 0; j < MAX_CART; j++)
- if (cs->cart[j].card[0] == (short)0xff00)
- inter_pet_delete( MakeDWord(cs->cart[j].card[1],cs->cart[j].card[2]) );
- // ƒMƒ‹ƒh’E‘Þ
- if (cs->guild_id)
- inter_guild_leave(cs->guild_id, cs->account_id, cs->char_id);
- // ƒp[ƒeƒB[’E‘Þ
- if (cs->party_id)
- inter_party_leave(cs->party_id, cs->account_id, cs->char_id);
- // —£¥
- if (cs->partner_id){
- // —£¥î•ñ‚ðmap‚É’Ê’m
- unsigned char buf[10];
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = cs->char_id;
- WBUFL(buf,6) = cs->partner_id;
- mapif_sendall(buf,10);
- // —£¥
- char_divorce(cs);
- }
-#ifdef ENABLE_SC_SAVING
- status_delete_scdata(cs->account_id, cs->char_id);
-#endif
- return 0;
-}
-
-int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
- RFIFOHEAD(fd);
-
- // only login-server can have an access to here.
- // so, if it isn't the login-server, we disconnect the session (fd != login_fd).
- if (fd != login_fd)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd) {
- ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
- login_fd = -1;
- }
- do_close(fd);
- return 0;
- }
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
-// printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch(RFIFOW(fd,0)) {
- case 0x2711:
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd,2)) {
-// printf("connect login server error : %d\n", RFIFOB(fd,2));
- ShowError("Can not connect to the login-server.\n");
- ShowError("The server communication passwords (default s1/p1) are probably invalid.\n");
- ShowInfo("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n");
- ShowInfo("The communication passwords can be changed in map_athena.conf and char_athena.conf\n");
- exit(1);
- } else {
- ShowStatus("Connected to login-server (connection #%d).\n", fd);
-
- //Send to login accounts currently connected.
- send_accounts_tologin(-1, gettick(), 0, 0);
-
- // if no map-server already connected, display a message...
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0 && server[i].map[0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- ShowStatus("Awaiting maps from map-server.\n");
- }
- RFIFOSKIP(fd,3);
- break;
-
- case 0x2713:
- if (RFIFOREST(fd) < 51)
- return 0;
-// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6));
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- if (RFIFOB(fd,6) != 0) {
- WFIFOHEAD(i, 3);
- WFIFOW(i,0) = 0x6c;
- WFIFOB(i,2) = 0x42;
- WFIFOSET(i,3);
- } else if (max_connect_user == 0 || count_users() < max_connect_user) {
-// if (max_connect_user == 0)
-// printf("max_connect_user (unlimited) -> accepted.\n");
-// else
-// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
- memcpy(sd->email, RFIFOP(fd, 7), 40);
- if (e_mail_check(sd->email) == 0)
- strncpy(sd->email, "a@a.com", 40); // default e-mail
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else if(isGM(sd->account_id) >= gm_allow_level) {
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else {
- // refuse connection: too much online players
-// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
- WFIFOHEAD(i, 3);
- WFIFOW(i,0) = 0x6c;
- WFIFOW(i,2) = 0;
- WFIFOSET(i,3);
- }
- break;
- }
- }
- RFIFOSKIP(fd,51);
- break;
-
- // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor]
- case 0x2717:
- if (RFIFOREST(fd) < 50)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- memcpy(sd->email, RFIFOP(fd,6), 40);
- if (e_mail_check(sd->email) == 0)
- strncpy(sd->email, "a@a.com", 40); // default e-mail
- sd->connect_until_time = (time_t)RFIFOL(fd,46);
- break;
- }
- }
- }
- RFIFOSKIP(fd,50);
- break;
-
- // login-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving authentification from Freya-type login server (to avoid char->login->char)
- case 0x2719:
- if (RFIFOREST(fd) < 18)
- return 0;
- // to conserv a maximum of authentification, search if account is already authentified and replace it
- // that will reduce multiple connection too
- for(i = 0; i < AUTH_FIFO_SIZE; i++)
- if (auth_fifo[i].account_id == RFIFOL(fd,2))
- break;
- // if not found, use next value
- if (i == AUTH_FIFO_SIZE) {
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- i = auth_fifo_pos;
- auth_fifo_pos++;
- }
- auth_fifo[i].account_id = RFIFOL(fd,2);
- auth_fifo[i].char_id = 0;
- auth_fifo[i].login_id1 = RFIFOL(fd,6);
- auth_fifo[i].login_id2 = RFIFOL(fd,10);
- auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
- auth_fifo[i].char_pos = 0;
- auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[i].ip = RFIFOL(fd,14);
- RFIFOSKIP(fd,18);
- break;
-
- case 0x2721: // gm reply
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- unsigned char buf[10];
- WBUFW(buf,0) = 0x2b0b;
- WBUFL(buf,2) = RFIFOL(fd,2); // account
- WBUFL(buf,6) = RFIFOL(fd,6); // GM level
- mapif_sendall(buf,10);
-// printf("parse_tologin: To become GM answer: char -> map.\n");
- }
- RFIFOSKIP(fd,10);
- break;
-
- case 0x2723: // changesex reply (modified by [Yor])
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int acc, sex, i, j;
- unsigned char buf[7];
- acc = RFIFOL(fd,2);
- sex = RFIFOB(fd,6);
- RFIFOSKIP(fd, 7);
- if (acc > 0) {
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == acc)
- auth_fifo[i].sex = sex;
- }
- for (i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == acc) {
- int jobclass = char_dat[i].status.class_;
- char_dat[i].status.sex = sex;
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER ||
- jobclass == JOB_CLOWN || jobclass == JOB_GYPSY ||
- jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
- // job modification
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER) {
- char_dat[i].status.class_ = (sex) ? JOB_BARD : JOB_DANCER;
- } else if (jobclass == JOB_CLOWN || jobclass == JOB_GYPSY) {
- char_dat[i].status.class_ = (sex) ? JOB_CLOWN : JOB_GYPSY;
- } else if (jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
- char_dat[i].status.class_ = (sex) ? JOB_BABY_BARD : JOB_BABY_DANCER;
- }
- // remove specifical skills of classes 19, 4020 and 4042
- for(j = 315; j <= 322; j++) {
- if (char_dat[i].status.skill[j].id > 0 && !char_dat[i].status.skill[j].flag) {
- if (char_dat[i].status.skill_point > USHRT_MAX - char_dat[i].status.skill[j].lv)
- char_dat[i].status.skill_point = USHRT_MAX;
- else
- char_dat[i].status.skill_point += char_dat[i].status.skill[j].lv;
- char_dat[i].status.skill[j].id = 0;
- char_dat[i].status.skill[j].lv = 0;
- }
- }
- // remove specifical skills of classes 20, 4021 and 4043
- for(j = 323; j <= 330; j++) {
- if (char_dat[i].status.skill[j].id > 0 && !char_dat[i].status.skill[j].flag) {
- if (char_dat[i].status.skill_point > USHRT_MAX - char_dat[i].status.skill[j].lv)
- char_dat[i].status.skill_point = USHRT_MAX;
- else
- char_dat[i].status.skill_point += char_dat[i].status.skill[j].lv;
-
- char_dat[i].status.skill[j].id = 0;
- char_dat[i].status.skill[j].lv = 0;
- }
- }
- }
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- for (j = 0; j < MAX_INVENTORY; j++) {
- if (char_dat[i].status.inventory[j].nameid && char_dat[i].status.inventory[j].equip)
- char_dat[i].status.inventory[j].equip = 0;
- }
- char_dat[i].status.weapon = 0;
- char_dat[i].status.shield = 0;
- char_dat[i].status.head_top = 0;
- char_dat[i].status.head_mid = 0;
- char_dat[i].status.head_bottom = 0;
-
- if (char_dat[i].status.guild_id) //If there is a guild, update the guild_member data [Skotlex]
- inter_guild_sex_changed(char_dat[i].status.guild_id, acc, char_dat[i].status.char_id, sex);
- }
- }
- // disconnect player if online on char-server
- disconnect_player(acc);
- }
- WBUFW(buf,0) = 0x2b0d;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- mapif_sendall(buf, 7);
- }
- break;
-
- case 0x2726: // Request to send a broadcast message (no answer)
- if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
- return 0;
- if (RFIFOL(fd,4) < 1)
- char_log("Receiving a message for broadcast, but message is void." RETCODE);
- else {
- // at least 1 map-server
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- break;
- if (i == MAX_MAP_SERVERS)
- char_log("'ladmin': Receiving a message for broadcast, but no map-server is online." RETCODE);
- else {
- unsigned char buf[128];
- char message[4096]; // +1 to add a null terminated if not exist in the packet
- int lp;
- char *p;
- memset(message, '\0', sizeof(message));
- memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
- message[sizeof(message)-1] = '\0';
- remove_control_chars((unsigned char *)message);
- // remove all first spaces
- p = message;
- while(p[0] == ' ')
- p++;
- // if message is only composed of spaces
- if (p[0] == '\0')
- char_log("Receiving a message for broadcast, but message is only a lot of spaces." RETCODE);
- // else send message to all map-servers
- else {
- if (RFIFOW(fd,2) == 0) {
- char_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s)" RETCODE,
- message);
- lp = 4;
- } else {
- char_log("'ladmin': Receiving a message for broadcast (message (in blue): %s)" RETCODE,
- message);
- lp = 8;
- }
- // split message to max 80 char
- while(p[0] != '\0') { // if not finish
- if (p[0] == ' ') // jump if first char is a space
- p++;
- else {
- char split[80];
- char* last_space;
- sscanf(p, "%79[^\t]", split); // max 79 char, any char (\t is control char and control char was removed before)
- split[sizeof(split)-1] = '\0'; // last char always \0
- if ((last_space = strrchr(split, ' ')) != NULL) { // searching space from end of the string
- last_space[0] = '\0'; // replace it by NULL to have correct length of split
- p++; // to jump the new NULL
- }
- p += strlen(split);
- // send broadcast to all map-servers
- WBUFW(buf,0) = 0x3800;
- WBUFW(buf,2) = lp + strlen(split) + 1;
- WBUFL(buf,4) = 0x65756c62; // only write if in blue (lp = 8)
- memcpy(WBUFP(buf,lp), split, strlen(split) + 1);
- mapif_sendall(buf, WBUFW(buf,2));
- }
- }
- }
- }
- }
- RFIFOSKIP(fd,8 + RFIFOL(fd,4));
- break;
-
- // account_reg2•ÏX’Ê’m
- case 0x2729:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- { //Receive account_reg2 registry, forward to map servers.
- unsigned char buf[ACCOUNT_REG2_NUM*(256+32+2)+16];
- memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
-// WBUFW(buf,0) = 0x2b11;
- WBUFW(buf,0) = 0x3804; //Map server can now receive all kinds of reg values with the same packet. [Skotlex]
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
- }
- break;
-
- // Account deletion notification (from login-server)
- case 0x2730:
- if (RFIFOREST(fd) < 6)
- return 0;
- // Deletion of all characters of the account
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == RFIFOL(fd,2)) {
- char_delete(&char_dat[i].status);
- if (i < char_num - 1) {
- memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct character_data));
- // if moved character owns to deleted account, check again it's character
- if (char_dat[i].status.account_id == RFIFOL(fd,2)) {
- i--;
- // Correct moved character reference in the character's owner by [Yor]
- } else {
- int j, k;
- struct char_session_data *sd2;
- for (j = 0; j < fd_max; j++) {
- if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].status.account_id) {
- for (k = 0; k < 9; k++) {
- if (sd2->found_char[k] == char_num-1) {
- sd2->found_char[k] = i;
- break;
- }
- }
- break;
- }
- }
- }
- }
- char_num--;
- }
- }
- // Deletion of the storage
- inter_storage_delete(RFIFOL(fd,2));
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[6];
- WBUFW(buf,0) = 0x2b13;
- WBUFL(buf,2) = RFIFOL(fd,2);
- mapif_sendall(buf, 6);
- }
- // disconnect player if online on char-server
- disconnect_player(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- // State change of account/ban notification (from login-server) by [Yor]
- case 0x2731:
- if (RFIFOREST(fd) < 11)
- return 0;
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[11];
- WBUFW(buf,0) = 0x2b14;
- WBUFL(buf,2) = RFIFOL(fd,2);
- WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
- WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
- mapif_sendall(buf, 11);
- }
- // disconnect player if online on char-server
- disconnect_player(RFIFOL(fd,2));
- RFIFOSKIP(fd,11);
- break;
-
- // Receiving GM acounts info from login-server (by [Yor])
- case 0x2732:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned char buf[32000];
- if (gm_account != NULL)
- aFree(gm_account);
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
- GM_num = 0;
- for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
- gm_account[GM_num].account_id = RFIFOL(fd,i);
- gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
- //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
- ShowStatus("From login-server: receiving information of %d GM accounts.\n", GM_num);
- char_log("From login-server: receiving information of %d GM accounts." RETCODE, GM_num);
- create_online_files(); // update online players files (perhaps some online players change of GM level)
- // send new gm acccounts level to map-servers
- memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b15;
- mapif_sendall(buf, RFIFOW(fd,2));
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // Receive GM accounts [Freya login server packet by Yor]
- case 0x2733:
- // add test here to remember that the login-server is Freya-type
- // sprintf (login_server_type, "Freya");
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- unsigned char buf[32000];
- int new_level = 0;
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == RFIFOL(fd,2)) {
- if (gm_account[i].level != (int)RFIFOB(fd,6)) {
- gm_account[i].level = (int)RFIFOB(fd,6);
- new_level = 1;
- }
- break;
- }
- // if not found, add it
- if (i == GM_num) {
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
- if (GM_num == 0) {
- gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
- } else {
- gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
- }
- gm_account[GM_num].account_id = RFIFOL(fd,2);
- gm_account[GM_num].level = (int)RFIFOB(fd,6);
- new_level = 1;
- GM_num++;
- if (GM_num >= 4000) {
- ShowWarning("4000 GM accounts found. Next GM accounts are not readed.\n");
- char_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
- }
- }
- }
- if (new_level == 1) {
- int len;
- ShowStatus("From login-server: receiving GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- char_log("From login-server: receiving a GM account information (%d: level %d)." RETCODE, RFIFOL(fd,2), (int)RFIFOB(fd,6));
- //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
- // send gm acccounts level to map-servers
- len = 4;
- WBUFW(buf,0) = 0x2b15;
-
- for(i = 0; i < GM_num; i++) {
- WBUFL(buf, len) = gm_account[i].account_id;
- WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WBUFW(buf, 2) = len;
- mapif_sendall(buf, len);
- }
- }
- RFIFOSKIP(fd,7);
- break;
-
- //Login server request to kick a character out. [Skotlex]
- case 0x2734:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- struct online_char_data* character;
- int aid = RFIFOL(fd,2);
- if ((character = idb_get(online_char_db, aid)) != NULL)
- { //Kick out this player.
- if (character->server > -1)
- { //Kick it from the map server it is on.
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- if (!character->waiting_disconnect)
- add_timer(gettick()+15000, chardb_waiting_disconnect, character->account_id, 0);
- character->waiting_disconnect = 1;
- } else { //Manual kick from char server.
- struct char_session_data *tsd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == aid)
- {
- WFIFOHEAD(i, 3);
- WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
- WFIFOSET(i,3);
- break;
- }
- }
- if (i == fd_max) //Shouldn't happen, but just in case.
- set_char_offline(99, aid);
- }
- }
- RFIFOSKIP(fd,6);
- }
- break;
- case 0x2735:
- {
- unsigned char buf[2];
- in_addr_t new_ip = 0;
- RFIFOSKIP(fd,2);
-
- WBUFW(buf,0) = 0x2b1e;
- mapif_sendall(buf, 2);
-
- new_ip = resolve_hostbyname(login_ip_str, NULL, NULL);
- if (new_ip && new_ip != login_ip)
- login_ip = new_ip; //Update login up.
-
- new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
- if (new_ip && new_ip != char_ip)
- { //Update ip.
- WFIFOHEAD(fd,6);
- char_ip = new_ip;
- ShowInfo("Updating IP for [%s].\n",char_ip_str);
- WFIFOW(fd,0) = 0x2736;
- WFIFOL(fd,2) = char_ip;
- WFIFOSET(fd,6);
- }
- break;
- }
- default:
- ShowWarning("Unknown packet 0x%04x received from login-server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-int request_accreg2(int account_id, int char_id) {
- if (login_fd > 0) {
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd, 0) = 0x272e;
- WFIFOL(login_fd, 2) = account_id;
- WFIFOL(login_fd, 6) = char_id;
- WFIFOSET(login_fd, 10);
- return 1;
- }
- return 0;
-}
-
-//Send packet forward to login-server for account saving
-int save_accreg2(unsigned char* buf, int len) {
- if (login_fd > 0) {
- WFIFOHEAD(login_fd, len+4);
- memcpy(WFIFOP(login_fd,4), buf, len);
- WFIFOW(login_fd,0) = 0x2728;
- WFIFOW(login_fd,2) = len+4;
- WFIFOSET(login_fd,len+4);
- return 1;
- }
- return 0;
-}
-
-//Receive Registry information for a character.
-int char_parse_Registry(int account_id, int char_id, unsigned char *buf, int buf_len) {
- int i,j,p,len;
- for (i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == account_id && char_dat[i].status.char_id == char_id)
- break;
- }
- if(i >= char_num) //Character not found?
- return 1;
- for(j=0,p=0;j<GLOBAL_REG_NUM && p<buf_len;j++){
- sscanf(WBUFP(buf,p), "%31c%n",char_dat[i].global[j].str,&len);
- char_dat[i].global[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf(WBUFP(buf,p), "%255c%n",char_dat[i].global[j].value,&len);
- char_dat[i].global[j].value[len]='\0';
- p +=len+1;
- }
- char_dat[i].global_num = j;
- return 0;
-}
-
-//Reply to map server with acc reg values.
-int char_account_reg_reply(int fd,int account_id,int char_id) {
- int i,j,p;
- WFIFOHEAD(fd, GLOBAL_REG_NUM*288 + 13);
- WFIFOW(fd,0)=0x3804;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=char_id;
- WFIFOB(fd,12)=3; //Type 3: char acc reg.
- for (i = 0;i < char_num; i++) {
- if (char_dat[i].status.account_id == account_id && char_dat[i].status.char_id == char_id)
- break;
- }
- if(i >= char_num){ //Character not found? Sent empty packet.
- WFIFOW(fd,2)=13;
- }else{
- for (p=13,j = 0; j < char_dat[i].global_num; j++) {
- if (char_dat[i].global[j].str[0]) {
- p+= sprintf(WFIFOP(fd,p), "%s", char_dat[i].global[j].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(fd,p), "%s", char_dat[i].global[j].value)+1;
- }
- }
- WFIFOW(fd,2)=p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-void char_read_fame_list(void)
-{
- int i, j, k;
- struct fame_list fame_item;
- CREATE_BUFFER(id, int, char_num);
-
- for(i = 0; i < char_num; i++) {
- id[i] = i;
- for(j = 0; j < i; j++) {
- if (char_dat[i].status.fame > char_dat[id[j]].status.fame) {
- for(k = i; k > j; k--)
- id[k] = id[k-1];
- id[j] = i; // id[i]
- break;
- }
- }
- }
-
- // Empty ranking lists
- memset(smith_fame_list, 0, sizeof(smith_fame_list));
- memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
- memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
- // Build Blacksmith ranking list
- for (i = 0, j = 0; i < char_num && j < fame_list_size_smith; i++) {
- if (char_dat[id[i]].status.fame && (
- char_dat[id[i]].status.class_ == JOB_BLACKSMITH ||
- char_dat[id[i]].status.class_ == JOB_WHITESMITH ||
- char_dat[id[i]].status.class_ == JOB_BABY_BLACKSMITH))
- {
- fame_item.id = char_dat[id[i]].status.char_id;
- fame_item.fame = char_dat[id[i]].status.fame;
- strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
-
- memcpy(&smith_fame_list[j],&fame_item,sizeof(struct fame_list));
- j++;
- }
- }
- // Build Alchemist ranking list
- for (i = 0, j = 0; i < char_num && j < fame_list_size_chemist; i++) {
- if (char_dat[id[i]].status.fame && (
- char_dat[id[i]].status.class_ == JOB_ALCHEMIST ||
- char_dat[id[i]].status.class_ == JOB_CREATOR ||
- char_dat[id[i]].status.class_ == JOB_BABY_ALCHEMIST))
- {
- fame_item.id = char_dat[id[i]].status.char_id;
- fame_item.fame = char_dat[id[i]].status.fame;
- strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
-
- memcpy(&chemist_fame_list[j],&fame_item,sizeof(struct fame_list));
-
- j++;
- }
- }
- // Build Taekwon ranking list
- for (i = 0, j = 0; i < char_num && j < fame_list_size_taekwon; i++) {
- if (char_dat[id[i]].status.fame &&
- char_dat[id[i]].status.class_ == JOB_TAEKWON)
- {
- fame_item.id = char_dat[id[i]].status.char_id;
- fame_item.fame = char_dat[id[i]].status.fame;
- strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
-
- memcpy(&taekwon_fame_list[j],&fame_item,sizeof(struct fame_list));
-
- j++;
- }
- }
- DELETE_BUFFER(id);
-}
-// Send map-servers the fame ranking lists
-int char_send_fame_list(int fd) {
- int i, len = 8;
- unsigned char buf[32000];
-
- WBUFW(buf,0) = 0x2b1b;
-
- for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add blacksmith's block length
- WBUFW(buf, 6) = len;
-
- for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add alchemist's block length
- WBUFW(buf, 4) = len;
-
- for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add total packet length
- WBUFW(buf, 2) = len;
-
- if(fd!=-1)
- mapif_send(fd, buf, len);
- else
- mapif_sendall(buf, len);
-
- return 0;
-}
-
-int search_mapserver(unsigned short map, long ip, short port);
-
-int parse_frommap(int fd) {
- int i, j;
- int id;
- RFIFOHEAD(fd);
-
- for(id = 0; id < MAX_MAP_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if(id==MAX_MAP_SERVERS)
- session[fd]->eof=1;
- if(session[fd]->eof){
- if (id < MAX_MAP_SERVERS) {
- unsigned char buf[16384];
- ShowStatus("Map-server %d has disconnected.\n", id);
- //Notify other map servers that this one is gone. [Skotlex]
- WBUFW(buf,0) = 0x2b20;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[id].map[i])
- WBUFW(buf,10+(j++)*4) = server[id].map[i];
- if (j > 0) {
- WBUFW(buf,2) = j * 4 + 10;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- server_fd[id] = -1;
- online_char_db->foreach(online_char_db,char_db_setoffline,i); //Tag relevant chars as 'in disconnected' server.
- }
- do_close(fd);
- create_online_files();
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
- //ShowDebug("Received packet 0x%4x (%d bytes) from map-server (connection %d)\n", RFIFOW(fd, 0), RFIFOREST(fd), fd);
-
- switch(RFIFOW(fd,0)) {
-
- // map-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // request from map-server to reload GM accounts. Transmission to login-server (by Yor)
- case 0x2af7:
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 2);
- WFIFOW(login_fd,0) = 0x2709;
- WFIFOSET(login_fd, 2);
- }
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving map names list from the map-server
- case 0x2afa:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- memset(server[id].map, 0, sizeof(server[id].map));
- j = 0;
- for(i = 4; i < RFIFOW(fd,2); i += 4) {
- server[id].map[j] = RFIFOW(fd,i);
- j++;
- }
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- ShowStatus("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
- id, j, p[0], p[1], p[2], p[3], server[id].port);
- ShowStatus("Map-server %d loading complete.\n", id);
- char_log("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d. Map-server %d loading complete." RETCODE,
- id, j, p[0], p[1], p[2], p[3], server[id].port, id);
-
- if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
- mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
- }
- WFIFOHEAD(fd, 3 + NAME_LENGTH);
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH); // name for wisp to player
- WFIFOSET(fd,3+NAME_LENGTH);
- //WFIFOSET(fd,27);
- char_send_fame_list(fd); //Send fame list.
- {
- unsigned char buf[16384];
- int x;
- if (j == 0) {
- ShowWarning("Map-Server %d have NO map.\n", id);
- char_log("WARNING: Map-Server %d have NO map." RETCODE, id);
- // Transmitting maps information to the other map-servers
- } else {
- WBUFW(buf,0) = 0x2b04;
- WBUFW(buf,2) = j * 4 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 4);
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- // Transmitting the maps of the other map-servers to the new map-server
- for(x = 0; x < MAX_MAP_SERVERS; x++) {
- if (server_fd[x] >= 0 && x != id) {
- WFIFOW(fd,0) = 0x2b04;
- WFIFOL(fd,4) = server[x].ip;
- WFIFOW(fd,8) = server[x].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[x].map[i])
- WFIFOW(fd,10+(j++)*4) = server[x].map[i];
- if (j > 0) {
- WFIFOW(fd,2) = j * 4 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- //Packet command is now used for sc_data request. [Skotlex]
- case 0x2afc:
- if (RFIFOREST(fd) < 10)
- return 0;
- {
-#ifdef ENABLE_SC_SAVING
- int aid, cid;
- struct scdata *data;
- aid = RFIFOL(fd,2);
- cid = RFIFOL(fd,6);
-#endif
- RFIFOSKIP(fd, 10);
-#ifdef ENABLE_SC_SAVING
- data = status_search_scdata(aid, cid);
- if (data->count > 0)
- { //Deliver status change data.
- WFIFOW(fd,0) = 0x2b1d;
- WFIFOW(fd,2) = 14 + data->count*sizeof(struct status_change_data);
- WFIFOL(fd,4) = aid;
- WFIFOL(fd,8) = cid;
- WFIFOW(fd,12) = data->count;
- for (i = 0; i < data->count; i++)
- memcpy(WFIFOP(fd,14+i*sizeof(struct status_change_data)), &data->data[i], sizeof(struct status_change_data));
- WFIFOSET(fd, WFIFOW(fd,2));
- status_delete_scdata(aid, cid); //Data sent, so it needs be discarded now.
- }
-#endif
- break;
- }
-
- //set MAP user count
- case 0x2afe:
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOW(fd,2) != server[id].users) {
- server[id].users = RFIFOW(fd,2);
- ShowInfo("User Count: %d (Server: %d)\n", server[id].users, id);
- }
- RFIFOSKIP(fd, 4);
- break;
- //set MAP users
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- //TODO: When data mismatches memory, update guild/party online/offline states.
- server[id].users = RFIFOW(fd,4);
- // add online players in the list by [Yor], adapted to use dbs by [Skotlex]
- j = 0;
- online_char_db->foreach(online_char_db,char_db_setoffline,id); //Set all chars from this server as 'unknown'
- for(i = 0; i < server[id].users; i++) {
- int aid, cid;
- struct online_char_data* character;
- aid = RFIFOL(fd,6+i*8);
- cid = RFIFOL(fd,6+i*8+4);
- character = idb_ensure(online_char_db, aid, create_online_char_data);
- if (online_check && character->server > -1 && character->server != id)
- {
- ShowNotice("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n",
- character->account_id, character->char_id, character->server, id, aid, cid);
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- }
- character->char_id = cid;
- character->server = id;
- }
- if (update_online < time(NULL)) { // Time is done
- update_online = time(NULL) + 8;
- create_online_files(); // only every 8 sec. (normally, 1 server send users every 5 sec.) Don't update every time, because that takes time, but only every 2 connection.
- // it set to 8 sec because is more than 5 (sec) and if we have more than 1 map-server, informations can be received in shifted.
- }
- //If any chars remain in -2, they will be cleaned in the cleanup timer.
- RFIFOSKIP(fd,6+i*8);
- break;
-
- // ƒLƒƒƒ‰ƒf[ƒ^•Û‘¶
- // Recieve character data from map-server
- case 0x2b01:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == RFIFOL(fd,4) &&
- char_dat[i].status.char_id == RFIFOL(fd,8))
- break;
- }
- if (i != char_num)
- memcpy(&char_dat[i].status, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
- if (RFIFOB(fd,12))
- { //Flag, set character offline. [Skotlex]
- set_char_offline(RFIFOL(fd,8),RFIFOL(fd,4));
- WFIFOW(fd, 0) = 0x2b21; //Save ack only needed on final save.
- WFIFOL(fd, 2) = RFIFOL(fd,4);
- WFIFOL(fd, 6) = RFIFOL(fd,8);
- WFIFOSET(fd, 10);
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // ƒLƒƒƒ‰ƒZƒŒ—v‹
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- auth_fifo[auth_fifo_pos].char_id = 0;
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].delflag = 2;
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
- auth_fifo_pos++;
- WFIFOW(fd,0) = 0x2b03;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOB(fd,6) = 0;
- WFIFOSET(fd,7);
- RFIFOSKIP(fd,18);
- break;
-
- // request "change map server"
- case 0x2b05:
- if (RFIFOREST(fd) < 35)
- return 0;
- {
- unsigned short name;
- int map_id, map_fd = -1;
- struct online_char_data* data;
- struct mmo_charstatus* char_data;
-
- name = RFIFOW(fd,18);
- map_id = search_mapserver(name, RFIFOL(fd,24), RFIFOW(fd,28)); //Locate mapserver by ip and port.
- if (map_id >= 0)
- map_fd = server_fd[map_id];
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.account_id == RFIFOL(fd,2) &&
- char_dat[i].status.char_id == RFIFOL(fd,14))
- break;
- }
- char_data = i< char_num? &char_dat[i].status:NULL;
- //Tell the new map server about this player using Kevin's new auth packet. [Skotlex]
- if (map_fd>=0 && session[map_fd] && char_data)
- { //Send the map server the auth of this player.
- //Update the "last map" as this is where the player must be spawned on the new map server.
- WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
- char_data->last_point.map = RFIFOW(fd,18);
- char_data->last_point.x = RFIFOW(fd,20);
- char_data->last_point.y = RFIFOW(fd,22);
- char_data->sex = RFIFOB(fd,30); // Buuyo^
-
- WFIFOW(map_fd,0) = 0x2afd;
- WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
- WFIFOL(map_fd,4) = RFIFOL(fd, 2); //Account ID
- WFIFOL(map_fd,8) = RFIFOL(fd, 6); //Login1
- WFIFOL(map_fd,16) = RFIFOL(fd,10); //Login2
- WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
- memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
- WFIFOSET(map_fd, WFIFOW(map_fd,2));
- data = idb_ensure(online_char_db, RFIFOL(fd, 2), create_online_char_data);
- data->char_id = char_data->char_id;
- data->server = map_id; //Update server where char is.
-
- //Reply with an ack.
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
- WFIFOSET(fd, 30);
- } else { //Reply with nak
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
- WFIFOL(fd, 6) = 0; //Set login1 to 0.
- WFIFOSET(fd, 30);
- }
- RFIFOSKIP(fd, 35);
- }
- break;
-
- // ƒLƒƒƒ‰–¼ŒŸõ
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].status.char_id == RFIFOL(fd,2))
- break;
- }
- WFIFOW(fd,0) = 0x2b09;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- if (i != char_num)
- memcpy(WFIFOP(fd,6), char_dat[i].status.name, NAME_LENGTH);
- else
- memcpy(WFIFOP(fd,6), unknown_char_name, NAME_LENGTH);
- WFIFOSET(fd,6+NAME_LENGTH);
- RFIFOSKIP(fd,6);
- break;
-
- // it is a request to become GM
- case 0x2b0a:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
-// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8));
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, RFIFOW(fd,2));
- WFIFOW(login_fd,0) = 0x2720;
- memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2);
- WFIFOSET(login_fd, RFIFOW(fd,2));
- } else {
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0) = 0x2b0b;
- WFIFOL(fd,2) = RFIFOL(fd,4);
- WFIFOL(fd,6) = 0;
- WFIFOSET(fd, 10);
- }
- RFIFOSKIP(fd, RFIFOW(fd,2));
- break;
-
- // Map server send information to change an email of an account -> login-server
- case 0x2b0c:
- if (RFIFOREST(fd) < 86)
- return 0;
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 86);
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- WFIFOW(login_fd,0) = 0x2722;
- WFIFOSET(login_fd, 86);
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server)
- case 0x2b0e:
- if (RFIFOREST(fd) < 44)
- return 0;
- {
- char character_name[NAME_LENGTH];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- memcpy(character_name, RFIFOP(fd,6), NAME_LENGTH-1);
- character_name[NAME_LENGTH -1] = '\0';
- // prepare answer
- WFIFOW(fd,0) = 0x2b0f; // answer
- WFIFOL(fd,2) = acc; // who want do operation
- WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex
- // search character
- i = search_character_index(character_name);
- if (i >= 0) {
- memcpy(WFIFOP(fd,6), search_character_name(i), NAME_LENGTH); // put correct name if found
- WFIFOW(fd,6+NAME_LENGTH) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- //WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].status.account_id; // account value
- WFIFOL(login_fd,6) = 5; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 2: // ban
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,18);
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
- WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
- WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
- WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
- WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
- WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
- WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
- WFIFOSET(login_fd,18);
-// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n",
-// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42));
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 3: // unblock
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].status.account_id; // account value
- WFIFOL(login_fd,6) = 0; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 4: // unban
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 5: // changesex
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- }
- } else {
- // character name not found
- memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
- WFIFOW(fd,8+NAME_LENGTH) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- //WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- }
- // send answer if a player ask, not if the server ask
- if (acc != -1) {
- //WFIFOSET(fd, 34);
- WFIFOSET(fd, 10+NAME_LENGTH);
- }
- RFIFOSKIP(fd, 44);
- break;
- }
-
-// case 0x2b0f: Not used anymore, available for future use
-
- // Update and send fame ranking list [DracoRPG]
- case 0x2b10:
- if (RFIFOREST(fd) < 12)
- return 0;
- {
- int cid = RFIFOL(fd, 2);
- int fame = RFIFOL(fd, 6);
- char type = RFIFOB(fd, 10);
- char pos = RFIFOB(fd, 11);
- int size;
- struct fame_list *list = NULL;
- RFIFOSKIP(fd,12);
-
- switch(type) {
- case 1:
- size = fame_list_size_smith;
- list = smith_fame_list;
- break;
- case 2:
- size = fame_list_size_chemist;
- list = chemist_fame_list;
- break;
- case 3:
- size = fame_list_size_taekwon;
- list = taekwon_fame_list;
- break;
- default:
- size = 0;
- break;
- }
- if(!size)
- break;
- if(pos)
- {
- pos--; //Convert from pos to index.
- if(
- (pos == 0 || fame < list[pos-1].fame) &&
- (pos == size-1 || fame > list[pos+1].fame)
- ) { //No change in order.
- list[(int)pos].fame = fame;
- char_send_fame_list(fd);
- break;
- }
- // If the player's already in the list, remove the entry and shift the following ones 1 step up
- memmove(list+pos, list+pos+1, (size-pos-1) * sizeof(struct fame_list));
- //Clear out last entry.
- list[size-1].id = 0;
- list[size-1].fame = 0;
- }
- // Find the position where the player has to be inserted
- for(i = 0; i < size && fame < list[i].fame; i++);
- // When found someone with less or as much fame, insert just above
- if(i >= size) break;//Out of ranking.
- memmove(list+i+1, list+i, (size-i-1) * sizeof(struct fame_list));
- list[i].id = cid;
- list[i].fame = fame;
- // Look for the player's name
- for(j = 0; j < char_num && char_dat[j].status.char_id != id; j++);
- if(j < char_num)
- strncpy(list[i].name, char_dat[j].status.name, NAME_LENGTH);
- else //Not found??
- strncpy(list[i].name, "Unknown", NAME_LENGTH);
- char_send_fame_list(-1);
- }
- break;
-
- // Recieve rates [Wizputer]
- case 0x2b16:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
- return 0;
- // Txt doesn't need this packet, so just skip it
- RFIFOSKIP(fd,RFIFOW(fd,8));
- break;
-
- // Character disconnected set online 0 [Wizputer]
- case 0x2b17:
- if (RFIFOREST(fd) < 6)
- return 0;
- set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- // Reset all chars to offline [Wizputer]
- case 0x2b18:
- set_all_offline(id);
- RFIFOSKIP(fd,2);
- break;
-
- // Character set online [Wizputer]
- case 0x2b19:
- if (RFIFOREST(fd) < 6)
- return 0;
- set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- // Build and send fame ranking lists [DracoRPG]
- case 0x2b1a:
- if (RFIFOREST(fd) < 2)
- return 0;
- char_read_fame_list();
- char_send_fame_list(-1);
- RFIFOSKIP(fd,2);
- break;
-
- //Request to save status change data. [Skotlex]
- case 0x2b1c:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
-#ifdef ENABLE_SC_SAVING
- int count, aid, cid;
- struct scdata *data;
- aid = RFIFOL(fd, 4);
- cid = RFIFOL(fd, 8);
- count = RFIFOW(fd, 12);
- data = status_search_scdata(aid, cid);
- if (data->count != count)
- {
- data->count = count;
- data->data = aRealloc(data->data, count*sizeof(struct status_change_data));
- }
- for (i = 0; i < count; i++)
- memcpy (&data->data[i], RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
-#endif
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- break;
- }
- case 0x2736:
- if (RFIFOREST(fd) < 6) return 0;
- ShowInfo("Updated IP address of Server #%d to %d.%d.%d.%d.\n",id,
- (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
- (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
- server[id].ip = RFIFOL(fd, 2);
- RFIFOSKIP(fd,6);
- break;
- default:
- // inter serverˆ—‚É“n‚·
- {
- int r = inter_parse_frommap(fd);
- if (r == 1) // ˆ—‚Å‚«‚½
- break;
- if (r == 2) // ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¢
- return 0;
- }
- // inter serverˆ—‚Å‚à‚È‚¢ê‡‚ÍØ’f
- ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(unsigned short map, long ip, short port) {
- int i, j;
-
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- for (j = 0; server[i].map[j]; j++)
- if (server[i].map[j] == map) {
- if (ip > 0 && server[i].ip != ip)
- continue;
- if (port > 0 && server[i].port != port)
- continue;
- return i;
- }
-
- return -1;
-}
-
-// char_mapif‚̉Šú‰»ˆ—iŒ»Ý‚Íinter_mapif‰Šú‰»‚Ì‚Ýj
-static int char_mapif_init(int fd) {
- return inter_mapif_init(fd);
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-// Rewrote: Adnvanced subnet check [LuzZza]
-//--------------------------------------------
-int lan_subnetcheck(long *p) {
-
- int i;
- unsigned char *sbn, *msk, *src = (unsigned char *)p;
-
- for(i=0; i<subnet_count; i++) {
-
- if(subnet[i].subnet == (*p & subnet[i].mask)) {
-
- sbn = (unsigned char *)&subnet[i].subnet;
- msk = (unsigned char *)&subnet[i].mask;
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
- src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
-
- return subnet[i].map_ip;
- }
- }
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
- return 0;
-}
-
-int parse_char(int fd) {
- int i, ch;
- unsigned short cmd;
- char email[40];
- int map_fd;
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- long subnet_map_ip;
-
- RFIFOHEAD(fd);
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- if (login_fd < 0)
- session[fd]->eof = 1;
- if(session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected.
- if (fd == login_fd)
- login_fd = -1;
- if (sd != NULL)
- {
- struct online_char_data* data = idb_get(online_char_db, sd->account_id);
- if (!data || data->server== -1) //If it is not in any server, send it offline. [Skotlex]
- set_char_offline(99,sd->account_id);
- }
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
- cmd = RFIFOW(fd,0);
- // crc32‚̃XƒLƒbƒv—p
- if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
- RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
- RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
- cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
- (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
- RFIFOSKIP(fd,4);
- cmd = RFIFOW(fd,0);
- ShowDebug("parse_char : %d crc32 skipped\n",fd);
- if(RFIFOREST(fd)==0)
- return 0;
- }
-
-//For use in packets that depend on an sd being present [Skotlex]
-#define FIFOSD_CHECK(rest) { if(RFIFOREST(fd) < rest) return 0; if (sd==NULL) { RFIFOSKIP(fd,rest); return 0; } }
-
- switch(cmd){
- case 0x20b: //20040622ˆÃ†‰»ragexe‘Ήž
- if (RFIFOREST(fd) < 19)
- return 0;
- RFIFOSKIP(fd,19);
- break;
-
- case 0x65: // Ú‘±—v‹
- if (RFIFOREST(fd) < 17)
- return 0;
- {
- int GM_value;
- WFIFOHEAD(fd, 4);
- if (sd) {
- //Received again auth packet for already authentified account?? Discard it.
- //TODO: Perhaps log this as a hack attempt?
- RFIFOSKIP(fd,17);
- break;
- }
- if ((GM_value = isGM(RFIFOL(fd,2))))
- ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
- else
- ShowInfo("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
- sd = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1);
- session[fd]->session_data = sd;
- strncpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
- sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
- sd->account_id = RFIFOL(fd,2);
- sd->login_id1 = RFIFOL(fd,6);
- sd->login_id2 = RFIFOL(fd,10);
- sd->sex = RFIFOB(fd,16);
- // send back account_id
- WFIFOL(fd,0) = RFIFOL(fd,2);
- WFIFOSET(fd,4);
- // search authentification
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == sd->account_id &&
- auth_fifo[i].login_id1 == sd->login_id1 &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
- auth_fifo[i].delflag == 2) {
- auth_fifo[i].delflag = 1;
-
- if (online_check)
- { // check if character is not online already. [Skotlex]
- struct online_char_data* character;
- character = idb_get(online_char_db, sd->account_id);
-
- if (character)
- {
- if(character->server > -1)
- { //Kick it from the map server it is on.
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- if (!character->waiting_disconnect)
- add_timer(gettick()+20000, chardb_waiting_disconnect, character->account_id, 0);
- character->waiting_disconnect = 1;
- /* Not a good idea because this would trigger when you do a char-change from the map server! [Skotlex]
- } else { //Manual kick from char server.
- struct char_session_data *tsd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && i!=fd && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == sd->account_id)
- {
- WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
- WFIFOSET(i,3);
- break;
- }
- }
- if (i == fd_max) //Shouldn't happen, but just in case.
- set_char_offline(99, sd->account_id);
- */
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 8;
- WFIFOSET(fd,3);
- break;
- }
- }
- }
-
- if (max_connect_user == 0 || count_users() < max_connect_user) {
- if (login_fd > 0) { // don't send request if no login-server
- // request to login-server to obtain e-mail/time limit
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd,0) = 0x2716;
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOSET(login_fd,6);
- }
- // send characters to player
- mmo_char_send006b(fd, sd);
- } else {
- // refuse connection (over populated)
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- break;
- }
- }
- // authentification not found
- if (i == AUTH_FIFO_SIZE) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,19);
- WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOL(login_fd,6) = sd->login_id1;
- WFIFOL(login_fd,10) = sd->login_id2; // relate to the versions higher than 18
- WFIFOB(login_fd,14) = sd->sex;
- WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
- WFIFOSET(login_fd,19);
- } else { // if no login-server, we must refuse connection
- WFIFOHEAD(fd,3);
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd,17);
- break;
-
- case 0x66: // ƒLƒƒƒ‰‘I‘ð
- FIFOSD_CHECK(3);
- {
- int char_num = RFIFOB(fd,2);
- struct mmo_charstatus *cd;
- RFIFOSKIP(fd,3);
-
- // if we activated email creation and email is default email
- if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
- WFIFOHEAD(fd, 3);
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- break;
- }
- // otherwise, load the character
- for (ch = 0; ch < 9; ch++)
- if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].status.char_num == char_num)
- break;
- if (ch == 9)
- { //Not found?? May be forged packet.
- break;
- }
- cd = &char_dat[sd->found_char[ch]].status;
- char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
- sd->account_id, char_num, cd->name);
-
- cd->sex = sd->sex;
-
- // searching map server
- i = search_mapserver(cd->last_point.map,-1,-1);
- // if map is not found, we check major cities
- if (i < 0) {
- unsigned short j;
- //First check that there's actually a map server online.
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0])
- break;
- if (j == MAX_MAP_SERVERS) {
- ShowInfo("Connection Closed. No map servers available.\n");
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
- if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
- cd->last_point.x = 273;
- cd->last_point.y = 354;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
- cd->last_point.x = 120;
- cd->last_point.y = 100;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
- cd->last_point.x = 160;
- cd->last_point.y = 94;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
- cd->last_point.x = 116;
- cd->last_point.y = 57;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
- cd->last_point.x = 87;
- cd->last_point.y = 117;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
- cd->last_point.x = 94;
- cd->last_point.y = 103;
- } else {
- ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(cd->last_point.map));
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
- ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(cd->last_point.map), mapindex_id2name(j));
- cd->last_point.map = j;
- }
- { //Send player to map
- WFIFOHEAD(fd, 28);
- WFIFOW(fd,0) = 0x71;
- WFIFOL(fd,2) = cd->char_id;
- memcpy(WFIFOP(fd,6), mapindex_id2name(cd->last_point.map), MAP_NAME_LENGTH);
-
- // Advanced subnet check [LuzZza]
- if((subnet_map_ip = lan_subnetcheck((long *)p)))
- WFIFOL(fd,22) = subnet_map_ip;
- else
- WFIFOL(fd,22) = server[i].ip;
-
- WFIFOW(fd,26) = server[i].port;
- WFIFOSET(fd,28);
-
- ShowInfo("Character selection '%s' (account: %d, slot: %d).\n",
- cd->name, sd->account_id, ch);
- }
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = cd->char_id;
- auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch];
- auth_fifo[auth_fifo_pos].sex = sd->sex;
- auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
-
- //Send NEW auth packet [Kevin]
- if ((map_fd = server_fd[i]) < 1 || session[map_fd] == NULL)
- { //0 Should not be a valid server_fd [Skotlex]
- WFIFOHEAD(fd, 3);
- ShowError("parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", map_fd, i);
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- //Send server closed.
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
- { //Send auth to server.
- WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
- WFIFOW(map_fd,0) = 0x2afd;
- WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
- WFIFOL(map_fd,4) = auth_fifo[auth_fifo_pos].account_id;
- WFIFOL(map_fd,8) = auth_fifo[auth_fifo_pos].login_id1;
- WFIFOL(map_fd,16) = auth_fifo[auth_fifo_pos].login_id2;
- WFIFOL(map_fd,12) = (unsigned long)auth_fifo[auth_fifo_pos].connect_until_time;
- memcpy(WFIFOP(map_fd,20), cd, sizeof(struct mmo_charstatus));
- WFIFOSET(map_fd, WFIFOW(map_fd,2));
- }
- set_char_online(i, cd->char_id, cd->account_id);
- //Sets char online in the party and breaks even share if needed.
- inter_party_logged(cd->party_id, cd->account_id, cd->char_id);
-
- auth_fifo_pos++;
- }
- break;
-
- case 0x67: // ì¬
- FIFOSD_CHECK(37);
-
- if(char_new == 0) //turn character creation on/off [Kevin]
- i = -2;
- else
- i = make_new_char(fd, RFIFOP(fd,2));
- //added some better fail reporting to client on the txt version [Kevin]
- if (i < 0)
- {
- WFIFOHEAD(fd, 3);
- WFIFOW(fd, 0) = 0x6e;
- switch (i) {
- case -1: WFIFOB(fd, 2) = 0x00; break;
- case -2: WFIFOB(fd, 2) = 0x02; break;
- case -3: WFIFOB(fd, 2) = 0x01; break;
- }
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }
- { //Send to player.
- WFIFOHEAD(fd, 108);
- WFIFOW(fd,0) = 0x6d;
- memset(WFIFOP(fd,2), 0, 106);
-
- WFIFOL(fd,2) = char_dat[i].status.char_id;
- WFIFOL(fd,2+4) = char_dat[i].status.base_exp>LONG_MAX?LONG_MAX:char_dat[i].status.base_exp;
- WFIFOL(fd,2+8) = char_dat[i].status.zeny;
- WFIFOL(fd,2+12) = char_dat[i].status.job_exp>LONG_MAX?LONG_MAX:char_dat[i].status.job_exp;
- WFIFOL(fd,2+16) = char_dat[i].status.job_level;
-
- WFIFOL(fd,2+28) = char_dat[i].status.karma;
- WFIFOL(fd,2+32) = char_dat[i].status.manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat[i].status.hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.hp;
- WFIFOW(fd,2+44) = (char_dat[i].status.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_hp;
- WFIFOW(fd,2+46) = (char_dat[i].status.sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.sp;
- WFIFOW(fd,2+48) = (char_dat[i].status.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].status.speed;
- WFIFOW(fd,2+52) = char_dat[i].status.class_;
- WFIFOW(fd,2+54) = char_dat[i].status.hair;
-
- WFIFOW(fd,2+58) = char_dat[i].status.base_level;
- WFIFOW(fd,2+60) = (char_dat[i].status.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.skill_point;
-
- WFIFOW(fd,2+64) = char_dat[i].status.shield;
- WFIFOW(fd,2+66) = char_dat[i].status.head_top;
- WFIFOW(fd,2+68) = char_dat[i].status.head_mid;
- WFIFOW(fd,2+70) = char_dat[i].status.hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat[i].status.name, NAME_LENGTH);
-
- WFIFOB(fd,2+98) = (char_dat[i].status.str > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.str;
- WFIFOB(fd,2+99) = (char_dat[i].status.agi > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.agi;
- WFIFOB(fd,2+100) = (char_dat[i].status.vit > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.vit;
- WFIFOB(fd,2+101) = (char_dat[i].status.int_ > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.int_;
- WFIFOB(fd,2+102) = (char_dat[i].status.dex > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.dex;
- WFIFOB(fd,2+103) = (char_dat[i].status.luk > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.luk;
- WFIFOB(fd,2+104) = char_dat[i].status.char_num;
-
- WFIFOSET(fd,108);
- RFIFOSKIP(fd,37);
- }
- for(ch = 0; ch < 9; ch++) {
- if (sd->found_char[ch] == -1) {
- sd->found_char[ch] = i;
- break;
- }
- }
-
- case 0x68: // delete char //Yor's Fix
- FIFOSD_CHECK(46);
- {
- WFIFOHEAD(fd, 46);
- WFIFOHEAD(login_fd,46);
- memcpy(email, RFIFOP(fd,6), 40);
- if (e_mail_check(email) == 0)
- strncpy(email, "a@a.com", 40); // default e-mail
-
- // if we activated email creation and email is default email
- if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
- // if sended email is incorrect e-mail
- if (strcmp(email, "a@a.com") == 0) {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd,46);
- // we act like we have selected a character
- } else {
- // we change the packet to set it like selection.
- for (i = 0; i < 9; i++)
- if (char_dat[sd->found_char[i]].status.char_id == RFIFOL(fd,2)) {
- // we save new e-mail
- memcpy(sd->email, email, 40);
- // we send new e-mail to login-server ('online' login-server is checked before)
- WFIFOW(login_fd,0) = 0x2715;
- WFIFOL(login_fd,2) = sd->account_id;
- memcpy(WFIFOP(login_fd, 6), email, 40);
- WFIFOSET(login_fd,46);
- // skip part of the packet! (46, but leave the size of select packet: 3)
- RFIFOSKIP(fd,43);
- // change value to put new packet (char selection)
- RFIFOW(fd, 0) = 0x66;
- RFIFOB(fd, 2) = char_dat[sd->found_char[i]].status.char_num;
- // not send packet, it's modify of actual packet
- break;
- }
- if (i == 9) {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd,46);
- }
- }
-
- // otherwise, we delete the character
- } else {
- if (strcmpi(email, sd->email) != 0) { // if it's an invalid email
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- // if mail is correct
- } else {
- for (i = 0; i < 9; i++) {
- struct mmo_charstatus *cs = NULL;
- if ((cs = &char_dat[sd->found_char[i]].status)->char_id == RFIFOL(fd,2)) {
- char_delete(cs); // deletion process
-
- if (sd->found_char[i] != char_num - 1) {
- memcpy(&char_dat[sd->found_char[i]], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
- // Correct moved character reference in the character's owner
- {
- int j, k;
- struct char_session_data *sd2;
- for (j = 0; j < fd_max; j++) {
- if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].status.account_id) {
- for (k = 0; k < 9; k++) {
- if (sd2->found_char[k] == char_num-1) {
- sd2->found_char[k] = sd->found_char[i];
- break;
- }
- }
- break;
- }
- }
- }
- }
-
- char_num--;
- for(ch = i; ch < 9-1; ch++)
- sd->found_char[ch] = sd->found_char[ch+1];
- sd->found_char[8] = -1;
- WFIFOW(fd,0) = 0x6f;
- WFIFOSET(fd,2);
- break;
- }
- }
-
- if (i == 9) {
- WFIFOW(fd,0) = 0x70;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- RFIFOSKIP(fd,46);
- }
- }
- break;
-
- case 0x2af8: // ƒ}ƒbƒvƒT[ƒo[ƒƒOƒCƒ“
- if (RFIFOREST(fd) < 60)
- return 0;
- {
- char *l_user = RFIFOP(fd, 2);
- char *l_pass = RFIFOP(fd, 26);
- WFIFOHEAD(fd, 4+5*GM_num);
- l_user[23] = '\0';
- l_pass[23] = '\0';
- WFIFOW(fd,0) = 0x2af9;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] < 0)
- break;
- }
- if (i == MAX_MAP_SERVERS ||
- strcmp(l_user, userid) ||
- strcmp(l_pass, passwd)){
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,60);
- } else {
- int len;
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_frommap;
- server_fd[i] = fd;
- server[i].ip = RFIFOL(fd,54);
- server[i].port = RFIFOW(fd,58);
- server[i].users = 0;
- memset(server[i].map, 0, sizeof(server[i].map));
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,60);
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- char_mapif_init(fd);
- // send gm acccounts level to map-servers
- len = 4;
- WFIFOW(fd,0) = 0x2b15;
- for(i = 0; i < GM_num; i++) {
- WFIFOL(fd,len) = gm_account[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- return 0;
- }
- }
- break;
-
- case 0x187: // AliveM†H
- if (RFIFOREST(fd) < 6)
- return 0;
- RFIFOSKIP(fd, 6);
- break;
-
- case 0x7530: // Athenaî•ñŠ“¾
- {
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- return 0;
- }
- case 0x7532: // Ú‘±‚ÌØ’f(default‚ƈ—‚͈ꂾ‚ª–¾Ž¦“I‚É‚·‚邽‚ß)
- default:
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aCalloc(64,1);
- command = (char *)aCalloc(64,1);
-
-// memset(type,0,64);
-// memset(command,0,64);
-
- ShowStatus("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- ShowDebug("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-// ‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
-int mapif_sendall(unsigned char *buf, unsigned int len) {
- int i, c;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- int fd;
- if ((fd = server_fd[i]) >= 0) {
-#if 0 //This seems to have been fixed long long ago.
- if (session[fd] == NULL)
- { //Could this be the crash's source? [Skotlex]
- ShowError("mapif_sendall: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", fd, i);
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- continue;
- }
-#endif
- WFIFOHEAD(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
- return c;
-}
-
-// Ž©•ªˆÈŠO‚Ì‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
-int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- int fd;
- if ((fd = server_fd[i]) >= 0 && fd != sfd) {
- WFIFOHEAD(fd, len);
- if (WFIFOSPACE(fd) < len) //Increase buffer size.
- realloc_writefifo(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
- return c;
-}
-// MAPƒT[ƒo[‚Ƀf[ƒ^‘—MimapŽI¶‘¶Šm”F—L‚èj
-int mapif_send(int fd, unsigned char *buf, unsigned int len) {
- int i;
-
- if (fd >= 0) {
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (fd == server_fd[i]) {
- WFIFOHEAD(fd, len);
- if (WFIFOSPACE(fd) < len) //Increase buffer size.
- realloc_writefifo(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- return 1;
- }
- }
- }
- return 0;
-}
-
-int send_users_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users();
- unsigned char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd,0) = 0x2714;
- WFIFOL(login_fd,2) = users;
- WFIFOSET(login_fd,6);
- }
- // send number of players to all map-servers
- WBUFW(buf,0) = 0x2b00;
- WBUFL(buf,2) = users;
- mapif_sendall(buf, 6);
-
- return 0;
-}
-
-static int send_accounts_tologin_sub(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int *i = va_arg(ap, int*);
- int count = va_arg(ap, int);
- if ((*i) >= count)
- return 0; //This is an error that shouldn't happen....
- if(character->server > -1) {
- WFIFOHEAD(login_fd, 8+count*4);
- WFIFOL(login_fd, 8+(*i)*4) =character->account_id;
- (*i)++;
- return 1;
- }
- return 0;
-}
-
-int send_accounts_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users(), i=0;
-
- if (login_fd > 0 && session[login_fd]) {
- // send account list to login server
- WFIFOHEAD(login_fd, 8+users*4);
- WFIFOW(login_fd,0) = 0x272d;
- WFIFOL(login_fd,4) = users;
- online_char_db->foreach(online_char_db, send_accounts_tologin_sub, &i);
- WFIFOW(login_fd,2) = 8+ i*4;
- WFIFOSET(login_fd,WFIFOW(login_fd,2));
- }
- return 0;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd > 0 && session[login_fd] != NULL)
- return 0;
-
- ShowInfo("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- if (login_fd == -1)
- { //Try again later... [Skotlex]
- login_fd = 0;
- return 0;
- }
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- WFIFOHEAD(login_fd, 86);
- WFIFOW(login_fd,0) = 0x2710;
- memcpy(WFIFOP(login_fd,2), userid, 24);
- memcpy(WFIFOP(login_fd,26), passwd, 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memcpy(WFIFOP(login_fd,60), server_name, 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
-
- WFIFOW(login_fd,84) = char_new_display; //only display (New) if they want to [Kevin]
-
- WFIFOSET(login_fd,86);
- return 1;
-}
-
-//------------------------------------------------
-//Invoked 15 seconds after mapif_disconnectplayer in case the map server doesn't
-//replies/disconnect the player we tried to kick. [Skotlex]
-//------------------------------------------------
-static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data)
-{
- struct online_char_data* character;
- if ((character = idb_get(online_char_db, id)) != NULL && character->waiting_disconnect)
- { //Mark it offline due to timeout.
- set_char_offline(character->char_id, character->account_id);
- }
- return 0;
-}
-
-//----------------------------------------------------------
-// Return numerical value of a switch configuration by [Yor]
-// on/off, english, français, deutsch, español
-//----------------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//----------------------------------
-// Reading Lan Support configuration
-// Rewrote: Anvanced subnet check [LuzZza]
-//----------------------------------
-int char_lan_config_read(const char *lancfgName) {
-
- FILE *fp;
- int line_num = 0;
- char line[1024], w1[64], w2[64], w3[64], w4[64];
-
- if((fp = fopen(lancfgName, "r")) == NULL) {
- ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- ShowInfo("Reading the configuration file %s...\n", lancfgName);
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- line_num++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
-
- ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
- continue;
- }
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- remove_control_chars((unsigned char *)w3);
- remove_control_chars((unsigned char *)w4);
-
- if(strcmpi(w1, "subnet") == 0) {
-
- subnet[subnet_count].mask = inet_addr(w2);
- subnet[subnet_count].char_ip = inet_addr(w3);
- subnet[subnet_count].map_ip = inet_addr(w4);
- subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
- if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
- ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
- continue;
- }
-
- subnet_count++;
- }
-
- ShowStatus("Read information about %d subnetworks.\n", subnet_count);
- }
-
- fclose(fp);
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-
-int char_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp = fopen(cfgName, "r");
-
- if (fp == NULL) {
- ShowFatalError("Configuration file not found: %s.\n", cfgName);
- exit(1);
- }
-
- ShowInfo("Reading configuration file %s...\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- if(strcmpi(w1,"timestamp_format") == 0) {
- strncpy(timestamp_format, w2, 20);
- } else if(strcmpi(w1,"console_silent")==0){
- msg_silent = 0; //To always allow the next line to show up.
- ShowInfo("Console Silent Setting: %d\n", atoi(w2));
- msg_silent = atoi(w2);
-#ifndef TXT_SQL_CONVERT
- } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
- stdout_with_ansisequence = config_switch(w2);
- } else if (strcmpi(w1, "userid") == 0) {
- strncpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- strncpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- strncpy(server_name, w2, 20);
- server_name[sizeof(server_name) - 1] = '\0';
- ShowStatus("%s server has been initialized\n", w2);
- } else if (strcmpi(w1, "wisp_server_name") == 0) {
- if (strlen(w2) >= 4) {
- memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
- wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
- }
- } else if (strcmpi(w1, "login_ip") == 0) {
- char ip_str[16];
- login_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (login_ip) {
- strncpy(login_ip_str, w2, sizeof(login_ip_str));
- ShowStatus("Login server IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port = atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char ip_str[16];
- char_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (char_ip){
- strncpy(char_ip_str, w2, sizeof(char_ip_str));
- ShowStatus("Character server IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "bind_ip") == 0) {
- char ip_str[16];
- bind_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (bind_ip) {
- strncpy(bind_ip_str, w2, sizeof(bind_ip_str));
- ShowStatus("Character server binding IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "char_port") == 0) {
- char_port = atoi(w2);
- } else if (strcmpi(w1, "char_maintenance") == 0) {
- char_maintenance = atoi(w2);
- } else if (strcmpi(w1, "char_new") == 0) {
- char_new = atoi(w2);
- } else if (strcmpi(w1, "char_new_display") == 0) {
- char_new_display = atoi(w2);
- } else if (strcmpi(w1, "email_creation") == 0) {
- email_creation = config_switch(w2);
- } else if (strcmpi(w1, "scdata_txt") == 0) { //By Skotlex
- strcpy(scdata_txt, w2);
-#endif
- } else if (strcmpi(w1, "char_txt") == 0) {
- strcpy(char_txt, w2);
- } else if (strcmpi(w1, "backup_txt") == 0) { //By zanetheinsane
- strcpy(backup_txt, w2);
- } else if (strcmpi(w1, "friends_txt") == 0) { //By davidsiaw
- strcpy(friends_txt, w2);
-#ifndef TXT_SQL_CONVERT
- } else if (strcmpi(w1, "backup_txt_flag") == 0) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor]
- backup_txt_flag = config_switch(w2);
- } else if (strcmpi(w1, "max_connect_user") == 0) {
- max_connect_user = atoi(w2);
- if (max_connect_user < 0)
- max_connect_user = 0; // unlimited online players
- } else if(strcmpi(w1, "gm_allow_level") == 0) {
- gm_allow_level = atoi(w2);
- if(gm_allow_level < 0)
- gm_allow_level = 99;
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "online_check") == 0) {
- online_check = config_switch(w2);
- } else if (strcmpi(w1, "autosave_time") == 0) {
- autosave_interval = atoi(w2)*1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- } else if (strcmpi(w1, "save_log") == 0) {
- save_log = config_switch(w2);
- } else if (strcmpi(w1, "start_point") == 0) {
- char map[32];
- int x, y;
- if (sscanf(w2, "%[^,],%d,%d", map, &x, &y) < 3)
- continue;
- if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
- start_point.map = mapindex_name2id(map);
- if (!start_point.map) {
- ShowError("Specified start_point %s not found in map-index cache.\n", map);
- start_point.map = 0;
- }
- start_point.x = x;
- start_point.y = y;
- }
- } else if(strcmpi(w1,"log_char")==0) { //log char or not [devil]
- log_char = atoi(w2);
- } else if (strcmpi(w1, "start_zeny") == 0) {
- start_zeny = atoi(w2);
- if (start_zeny < 0)
- start_zeny = 0;
- } else if (strcmpi(w1, "start_weapon") == 0) {
- start_weapon = atoi(w2);
- if (start_weapon < 0)
- start_weapon = 0;
- } else if (strcmpi(w1, "start_armor") == 0) {
- start_armor = atoi(w2);
- if (start_armor < 0)
- start_armor = 0;
- } else if (strcmpi(w1, "unknown_char_name") == 0) {
- strcpy(unknown_char_name, w2);
- unknown_char_name[NAME_LENGTH-1] = '\0';
- } else if (strcmpi(w1, "char_log_filename") == 0) {
- strcpy(char_log_filename, w2);
- } else if (strcmpi(w1, "name_ignoring_case") == 0) {
- name_ignoring_case = config_switch(w2);
- } else if (strcmpi(w1, "char_name_option") == 0) {
- char_name_option = atoi(w2);
- } else if (strcmpi(w1, "char_name_letters") == 0) {
- strcpy(char_name_letters, w2);
-// online files options
- } else if (strcmpi(w1, "online_txt_filename") == 0) {
- strcpy(online_txt_filename, w2);
- } else if (strcmpi(w1, "online_html_filename") == 0) {
- strcpy(online_html_filename, w2);
- } else if (strcmpi(w1, "online_sorting_option") == 0) {
- online_sorting_option = atoi(w2);
- } else if (strcmpi(w1, "online_display_option") == 0) {
- online_display_option = atoi(w2);
- } else if (strcmpi(w1, "online_gm_display_min_level") == 0) { // minimum GM level to display 'GM' when we want to display it
- online_gm_display_min_level = atoi(w2);
- if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough
- online_gm_display_min_level = 5;
- } else if (strcmpi(w1, "online_refresh_html") == 0) {
- online_refresh_html = atoi(w2);
- if (online_refresh_html < 1)
- online_refresh_html = 1;
- } else if(strcmpi(w1,"db_path")==0) {
- strcpy(db_path,w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- } else if (strcmpi(w1, "fame_list_alchemist") == 0) {
- fame_list_size_chemist = atoi(w2);
- if (fame_list_size_chemist > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_alchemist)\n", MAX_FAME_LIST);
- fame_list_size_chemist = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "fame_list_blacksmith") == 0) {
- fame_list_size_smith = atoi(w2);
- if (fame_list_size_smith > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_blacksmith)\n", MAX_FAME_LIST);
- fame_list_size_smith = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "fame_list_taekwon") == 0) {
- fame_list_size_taekwon = atoi(w2);
- if (fame_list_size_taekwon > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_taekwon)\n", MAX_FAME_LIST);
- fame_list_size_taekwon = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "guild_exp_rate") == 0) {
- guild_exp_rate = atoi(w2);
-#endif //TXT_SQL_CONVERT
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- }
- }
- fclose(fp);
-
- ShowInfo("done reading %s.\n", cfgName);
- return 0;
-}
-
-#ifndef TXT_SQL_CONVERT
-int chardb_final(int key, void* data, va_list va)
-{
- aFree(data);
- return 0;
-}
-void do_final(void) {
- ShowStatus("Terminating server.\n");
- // write online players files with no player
- online_char_db->clear(online_char_db, NULL); //clean the db...
- create_online_files();
- online_char_db->destroy(online_char_db, NULL); //dispose the db...
-
- mmo_char_sync();
- inter_save();
- set_all_offline(-1);
- flush_fifos();
-
- if(gm_account) aFree(gm_account);
- if(char_dat) aFree(char_dat);
-
- delete_session(login_fd);
- delete_session(char_fd);
-
-#ifdef ENABLE_SC_SAVING
- status_final();
-#endif
- inter_final();
- mapindex_final();
-
- char_log("----End of char-server (normal end with closing of all files)." RETCODE);
-}
-
-void set_server_type(void)
-{
- SERVER_TYPE = ATHENA_SERVER_CHAR;
-}
-
-static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
-{
- struct online_char_data *character= (struct online_char_data*)data;
- if (character->server == -2) //Unknown server.. set them offline
- set_char_offline(character->char_id, character->account_id);
- if (character->server < 0)
- //Free data from players that have not been online for a while.
- db_remove(online_char_db, key);
- return 0;
-}
-
-static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
-{
- online_char_db->foreach(online_char_db, online_data_cleanup_sub);
- return 0;
-}
-
-int do_init(int argc, char **argv) {
- int i;
-
- mapindex_init(); //Needed here for the start-point reading.
- start_point.map = mapindex_name2id("new_zone01.gat");
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- char_lan_config_read((argc > 3) ? argv[3] : LOGIN_LAN_CONF_NAME);
-
- if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
- ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
- ShowNotice("Please edit your save/account.txt file to create a proper inter-server user/password (gender 'S')\n");
- ShowNotice("And then change the user/password to use in conf/char_athena.conf (or conf/import/char_conf.txt)\n");
- }
-
- // a newline in the log...
- char_log("");
- // moved behind char_config_read in case we changed the filename [celest]
- char_log("The char-server starting..." RETCODE);
-
- if ((naddr_ != 0) && (!login_ip || !char_ip)) {
- // The char server should know what IP address it is running on
- // - MouseJstr
- int localaddr = ntohl(addr_[0]);
- unsigned char *ptr = (unsigned char *) &localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
- if (naddr_ != 1)
- ShowStatus("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- ShowStatus("Defaulting to %s as our IP address\n", buf);
- if (!login_ip) {
- strcpy(login_ip_str, buf);
- login_ip = inet_addr(login_ip_str);
- }
- if (!char_ip) {
- strcpy(char_ip_str, buf);
- char_ip = inet_addr(char_ip_str);
- }
-
- if (ptr[0] == 192 && ptr[1] == 168)
- ShowWarning("Firewall detected.. edit subnet_athena.conf and char_athena.conf\n");
- }
-
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- server_fd[i] = -1;
- }
-
- online_char_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- mmo_char_init();
-#ifdef ENABLE_SC_SAVING
- status_init();
-#endif
- update_online = time(NULL);
- create_online_files(); // update online players files at start of the server
-
- inter_init_txt((argc > 2) ? argv[2] : inter_cfgName); // inter server ‰Šú‰»
-
- set_defaultparse(parse_char);
-
- char_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,char_port);
-
- add_timer_func_list(check_connect_login_server, "check_connect_login_server");
- add_timer_func_list(send_users_tologin, "send_users_tologin");
- add_timer_func_list(send_accounts_tologin, "send_accounts_tologin");
- add_timer_func_list(mmo_char_sync_timer, "mmo_char_sync_timer");
- add_timer_func_list(chardb_waiting_disconnect, "chardb_waiting_disconnect");
- add_timer_func_list(online_data_cleanup, "online_data_cleanup");
-
- add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600 * 1000);
- add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000);
- add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000);
- add_timer_interval(gettick() + 3600*1000, send_accounts_tologin, 0, 0, 3600*1000); //Sync online accounts every hour
- add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval);
-
- char_read_fame_list(); //Read fame lists.
-
- if(console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- char_log("The char-server is ready (Server is listening on the port %d)." RETCODE, char_port);
-
- ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <sys/types.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include <time.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "../common/strlib.h"
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/mmo.h"
+#include "../common/db.h"
+#include "../common/version.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "../common/malloc.h"
+
+#include "char.h"
+#include "inter.h"
+#include "int_pet.h"
+#include "int_homun.h"
+#include "int_guild.h"
+#include "int_party.h"
+#include "int_storage.h"
+#ifdef ENABLE_SC_SAVING
+#include "int_status.h"
+#endif
+
+#ifndef TXT_SQL_CONVERT
+struct mmo_map_server{
+ long ip;
+ short port;
+ int users;
+ unsigned short map[MAX_MAP_PER_SERVER];
+} server[MAX_MAP_SERVERS];
+int server_fd[MAX_MAP_SERVERS];
+
+int login_fd, char_fd;
+char userid[24];
+char passwd[24];
+char server_name[20];
+char wisp_server_name[NAME_LENGTH] = "Server";
+char login_ip_str[128];
+in_addr_t login_ip;
+int login_port = 6900;
+char char_ip_str[128];
+in_addr_t char_ip;
+char bind_ip_str[128];
+in_addr_t bind_ip;
+int char_port = 6121;
+int char_maintenance;
+int char_new;
+int char_new_display;
+int email_creation = 0; // disabled by default
+#endif
+char char_txt[1024]="save/athena.txt";
+char backup_txt[1024]="save/backup.txt"; //By zanetheinsane
+char friends_txt[1024]="save/friends.txt"; // davidsiaw
+#ifndef TXT_SQL_CONVERT
+char backup_txt_flag = 0; // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
+char unknown_char_name[1024] = "Unknown";
+char char_log_filename[1024] = "log/char.log";
+char db_path[1024]="db";
+
+// Advanced subnet check [LuzZza]
+struct _subnet {
+ long subnet;
+ long mask;
+ long char_ip;
+ long map_ip;
+} subnet[16];
+
+int subnet_count = 0;
+
+int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
+int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
+//The following are characters that are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
+#define TRIM_CHARS "\032\t\x0A\x0D "
+char char_name_letters[1024] = ""; // list of letters/symbols authorised (or not) in a character name. by [Yor]
+
+int log_char = 1; // loggin char or not [devil]
+int log_inter = 1; // loggin inter or not [devil]
+
+struct char_session_data{
+ int account_id, login_id1, login_id2, sex;
+ int found_char[9];
+ char email[40]; // e-mail (default: a@a.com) by [Yor]
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+};
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, sex;
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+} auth_fifo[AUTH_FIFO_SIZE];
+int auth_fifo_pos = 0;
+
+int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
+static int online_check = 1; //If one, it won't let players connect when their account is already registered online and will send the relevant map server a kick user request. [Skotlex]
+
+int char_id_count = START_CHAR_NUM;
+struct character_data *char_dat;
+
+int char_num, char_max;
+int max_connect_user = 0;
+int gm_allow_level = 99;
+int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int save_log = 1;
+int start_zeny = 500;
+int start_weapon = 1201;
+int start_armor = 2301;
+int guild_exp_rate = 100;
+
+//Custom limits for the fame lists. [Skotlex]
+int fame_list_size_chemist = MAX_FAME_LIST;
+int fame_list_size_smith = MAX_FAME_LIST;
+int fame_list_size_taekwon = MAX_FAME_LIST;
+
+// Char-server-side stored fame lists [DracoRPG]
+struct fame_list smith_fame_list[MAX_FAME_LIST];
+struct fame_list chemist_fame_list[MAX_FAME_LIST];
+struct fame_list taekwon_fame_list[MAX_FAME_LIST];
+
+// Initial position (it's possible to set it in conf file)
+struct point start_point = { 0, 53, 111};
+
+struct gm_account *gm_account = NULL;
+int GM_num = 0;
+
+// online players by [Yor]
+char online_txt_filename[1024] = "online.txt";
+char online_html_filename[1024] = "online.html";
+int online_sorting_option = 0; // sorting option to display online players in online files
+int online_display_option = 1; // display options: to know which columns must be displayed
+int online_refresh_html = 20; // refresh time (in sec) of the html file in the explorer
+int online_gm_display_min_level = 20; // minimum GM level to display 'GM' when we want to display it
+
+//These are used to aid the map server in identifying valid clients. [Skotlex]
+static int max_account_id = DEFAULT_MAX_ACCOUNT_ID, max_char_id = DEFAULT_MAX_CHAR_ID;
+
+struct online_char_data {
+ int account_id;
+ int char_id;
+ short server;
+ unsigned waiting_disconnect :1;
+};
+
+struct dbt *online_char_db; //Holds all online characters.
+
+time_t update_online; // to update online files when we receiving information from a server (not less than 8 seconds)
+
+int console = 0;
+
+//------------------------------
+// Writing function of logs file
+//------------------------------
+int char_log(char *fmt, ...) {
+ if(log_char)
+ {
+ FILE *logfp;
+ va_list ap;
+ time_t raw_time;
+ char tmpstr[2048];
+
+ va_start(ap, fmt);
+
+ logfp = fopen(char_log_filename, "a");
+ if (logfp) {
+ if (fmt[0] == '\0') // jump a line if no message
+ fprintf(logfp, RETCODE);
+ else {
+ time(&raw_time);
+ strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", localtime(&raw_time));
+ sprintf(tmpstr + 19, ": %s", fmt);
+ vfprintf(logfp, tmpstr, ap);
+ }
+ fclose(logfp);
+ }
+ va_end(ap);
+ }
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// Determine if an account (id) is a GM account
+// and returns its level (or 0 if it isn't a GM account or if not found)
+//----------------------------------------------------------------------
+int isGM(int account_id) {
+ int i;
+
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == account_id)
+ return gm_account[i].level;
+ return 0;
+}
+
+//Search character data from the aid/cid givem
+struct mmo_charstatus* search_character(int aid, int cid) {
+ int i;
+ for (i = 0; i < char_num; i++) {
+ if (char_dat[i].status.char_id == cid && char_dat[i].status.account_id == aid)
+ return &char_dat[i].status;
+ }
+ return NULL;
+}
+
+struct mmo_charstatus* search_character_byname(char* character_name)
+{
+ int i = search_character_index(character_name);
+ if (i == -1) return NULL;
+ return &char_dat[i].status;
+}
+
+//----------------------------------------------
+// Search an character id
+// (return character index or -1 (if not found))
+// If exact character name is not found,
+// the function checks without case sensitive
+// and returns index if only 1 character is found
+// and similar to the searched name.
+//----------------------------------------------
+int search_character_index(char* character_name) {
+ int i, quantity, index;
+
+ quantity = 0;
+ index = -1;
+ for(i = 0; i < char_num; i++) {
+ // Without case sensitive check (increase the number of similar character names found)
+ if (stricmp(char_dat[i].status.name, character_name) == 0) {
+ // Strict comparison (if found, we finish the function immediatly with correct value)
+ if (strcmp(char_dat[i].status.name, character_name) == 0)
+ return i;
+ quantity++;
+ index = i;
+ }
+ }
+ // Here, the exact character name is not found
+ // We return the found index of a similar account ONLY if there is 1 similar character
+ if (quantity == 1)
+ return index;
+
+ // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
+ return -1;
+}
+
+//-------------------------------------
+// Return character name with the index
+//-------------------------------------
+char * search_character_name(int index) {
+
+ if (index >= 0 && index < char_num)
+ return char_dat[index].status.name;
+
+ return unknown_char_name;
+}
+
+// Searches if the given character is online, and returns the fd of the
+// map-server it is connected to.
+int search_character_online(int aid, int cid)
+{
+ //Look for online character.
+ struct online_char_data* character;
+ character = idb_get(online_char_db, aid);
+ if(character &&
+ character->char_id == cid &&
+ character->server > -1)
+ return server_fd[character->server];
+ return -1;
+}
+static void * create_online_char_data(DBKey key, va_list args) {
+ struct online_char_data* character;
+ character = aCalloc(1, sizeof(struct online_char_data));
+ character->account_id = key.i;
+ character->char_id = -1;
+ character->server = -1;
+ return character;
+}
+
+static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data);
+
+//-------------------------------------------------
+// Set Character online/offline [Wizputer]
+//-------------------------------------------------
+
+void set_char_online(int map_id, int char_id, int account_id) {
+ struct online_char_data* character;
+
+ if ( char_id != 99 && (max_account_id < account_id || max_char_id < char_id))
+ { //Notify map-server of the new max IDs [Skotlex]
+ if (account_id > max_account_id)
+ max_account_id = account_id;
+ if (char_id > max_char_id)
+ max_char_id = char_id;
+ mapif_send_maxid(max_account_id, max_char_id);
+ }
+ character = idb_ensure(online_char_db, account_id, create_online_char_data);
+ if (online_check && character->char_id != -1 && character->server > -1 && character->server != map_id)
+ {
+ //char == 99 <- Character logging in, so someone has logged in while one
+ //char is still on map-server, so kick him out, but don't print "error"
+ //as this is normal behaviour. [Skotlex]
+ if (char_id != 99)
+ ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
+ character->account_id, character->char_id, character->server, map_id, account_id, char_id);
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ }
+ character->waiting_disconnect = 0;
+ character->char_id = (char_id==99)?-1:char_id;
+ character->server = (char_id==99)?-1:map_id;
+
+ if (login_fd <= 0 || session[login_fd]->eof)
+ return;
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd,0) = 0x272b;
+ WFIFOL(login_fd,2) = account_id;
+ WFIFOSET(login_fd,6);
+
+ //printf ("set online\n");
+}
+void set_char_offline(int char_id, int account_id) {
+ struct online_char_data* character;
+
+ if ((character = idb_get(online_char_db, account_id)) != NULL)
+ { //We don't free yet to avoid aCalloc/aFree spamming during char change. [Skotlex]
+ character->char_id = -1;
+ character->server = -1;
+ character->waiting_disconnect = 0;
+ }
+ if (login_fd <= 0 || session[login_fd]->eof)
+ return;
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd,0) = 0x272c;
+ WFIFOL(login_fd,2) = account_id;
+ WFIFOSET(login_fd,6);
+
+}
+
+static int char_db_setoffline(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int server = va_arg(ap, int);
+ if (server == -1) {
+ character->char_id = -1;
+ character->server = -1;
+ character->waiting_disconnect = 0;
+ } else if (character->server == server)
+ character->server = -2; //In some map server that we aren't connected to.
+ return 0;
+}
+
+static int char_db_kickoffline(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int server = va_arg(ap, int);
+
+ if (server > -1 && character->server != server)
+ return 0;
+
+ //Kick out any connected characters, and set them offline as appropiate.
+ if (character->server > -1)
+ mapif_disconnectplayer(server_fd[character->server],
+ character->account_id, character->char_id, 1);
+ else if (!character->waiting_disconnect)
+ set_char_offline(character->char_id, character->account_id);
+ else return 0;
+ return 1;
+}
+
+void set_all_offline(int id) {
+ if (id < 0)
+ ShowNotice("Sending all users offline.\n");
+ else
+ ShowNotice("Sending users of map-server %d offline.\n", id);
+ online_char_db->foreach(online_char_db,char_db_kickoffline,id);
+
+ if (id >= 0 || login_fd <= 0 || session[login_fd]->eof)
+ return;
+ //Tell login-server to also mark all our characters as offline.
+ WFIFOHEAD(login_fd, 2);
+ WFIFOW(login_fd,0) = 0x2737;
+ WFIFOSET(login_fd,2);
+}
+
+/*---------------------------------------------------
+ Make a data line for friends list
+ --------------------------------------------------*/
+
+int mmo_friends_list_data_str(char *str, struct mmo_charstatus *p) {
+ int i;
+ char *str_p = str;
+ str_p += sprintf(str_p, "%d", p->char_id);
+
+ for (i=0;i<MAX_FRIENDS;i++){
+ if (p->friends[i].account_id > 0 && p->friends[i].char_id > 0 && p->friends[i].name[0])
+ str_p += sprintf(str_p, ",%d,%d,%s", p->friends[i].account_id, p->friends[i].char_id, p->friends[i].name);
+ }
+
+ str_p += '\0';
+
+ return 0;
+}
+
+//-------------------------------------------------
+// Function to create the character line (for save)
+//-------------------------------------------------
+int mmo_char_tostr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int reg_num) {
+ int i,j;
+ char *str_p = str;
+
+ /* We shouldn't need this anymore... [Skotlex]
+ // on multi-map server, sometimes it's posssible that last_point become void. (reason???) We check that to not lost character at restart.
+ if (!p->last_point.map) {
+ p->last_point.map = mapindex_name2id(MAP_PRONTERA);
+ p->last_point.x = 273;
+ p->last_point.y = 354;
+ }
+ */
+ str_p += sprintf(str_p,
+ "%d\t%d,%d\t%s\t%d,%d,%d\t%u,%u,%d" //Up to Zeny field
+ "\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" //Up to Skill Point
+ "\t%d,%d,%d\t%d,%d,%d,%d" //Up to hom id
+ "\t%d,%d,%d\t%d,%d,%d,%d,%d" //Up to head bottom
+ "\t%d,%d,%d\t%d,%d,%d" //last point + save point
+ ",%d,%d,%d,%d,%d\t", //Family info
+ p->char_id, p->account_id, p->char_num, p->name, //
+ p->class_, p->base_level, p->job_level,
+ p->base_exp, p->job_exp, p->zeny,
+ p->hp, p->max_hp, p->sp, p->max_sp,
+ p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
+ p->status_point, p->skill_point,
+ p->option, p->karma, p->manner, //
+ p->party_id, p->guild_id, p->pet_id, p->hom_id,
+ p->hair, p->hair_color, p->clothes_color,
+ p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
+ p->last_point.map, p->last_point.x, p->last_point.y, //
+ p->save_point.map, p->save_point.x, p->save_point.y,
+ p->partner_id,p->father,p->mother,p->child,p->fame);
+ for(i = 0; i < MAX_MEMOPOINTS; i++)
+ if (p->memo_point[i].map) {
+ str_p += sprintf(str_p, "%d,%d,%d ", p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
+ }
+ *(str_p++) = '\t';
+
+ for(i = 0; i < MAX_INVENTORY; i++)
+ if (p->inventory[i].nameid) {
+ str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
+ p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
+ p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute);
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p,",%d",p->inventory[i].card[j]);
+ str_p += sprintf(str_p," ");
+ }
+ *(str_p++) = '\t';
+
+ for(i = 0; i < MAX_CART; i++)
+ if (p->cart[i].nameid) {
+ str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
+ p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
+ p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute);
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p,",%d",p->cart[i].card[j]);
+ str_p += sprintf(str_p," ");
+ }
+ *(str_p++) = '\t';
+
+ for(i = 0; i < MAX_SKILL; i++)
+ if (p->skill[i].id && p->skill[i].flag != 1) {
+ str_p += sprintf(str_p, "%d,%d ", p->skill[i].id, (p->skill[i].flag == 0) ? p->skill[i].lv : p->skill[i].flag-2);
+ }
+ *(str_p++) = '\t';
+
+ for(i = 0; i < reg_num; i++)
+ if (reg[i].str[0])
+ str_p += sprintf(str_p, "%s,%s ", reg[i].str, reg[i].value);
+ *(str_p++) = '\t';
+
+ *str_p = '\0';
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+//-------------------------------------------------------------------------
+// Function to set the character from the line (at read of characters file)
+//-------------------------------------------------------------------------
+int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int *reg_num) {
+ char tmp_str[3][128]; //To avoid deleting chars with too long names.
+ int tmp_int[256];
+ unsigned int tmp_uint[2]; //To read exp....
+ int next, len, i, j;
+
+ // initilialise character
+ memset(p, '\0', sizeof(struct mmo_charstatus));
+
+// Char structure of version 1500 (homun + mapindex maps)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d,%d,%d,%d,%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0],
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[44],
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ &tmp_int[45], &tmp_int[35], &tmp_int[36],
+ &tmp_int[46], &tmp_int[37], &tmp_int[38], &tmp_int[39],
+ &tmp_int[40], &tmp_int[41], &tmp_int[42], &tmp_int[43], &next) != 48)
+ {
+ tmp_int[44] = 0; //Hom ID.
+// Char structure of version 1488 (fame field addition)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d,%d,%d,%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0],
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], &tmp_int[26],
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ tmp_str[1], &tmp_int[35], &tmp_int[36],
+ tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39],
+ &tmp_int[40], &tmp_int[41], &tmp_int[42], &tmp_int[43], &next) != 47)
+ {
+ tmp_int[43] = 0; //Fame
+// Char structure of version 1363 (family data addition)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d,%d,%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], &tmp_int[26],
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ tmp_str[1], &tmp_int[35], &tmp_int[36], //
+ tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39],
+ &tmp_int[40], &tmp_int[41], &tmp_int[42], &next) != 46)
+ {
+ tmp_int[40] = 0; // father
+ tmp_int[41] = 0; // mother
+ tmp_int[42] = 0; // child
+// Char structure version 1008 (marriage partner addition)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%127[^,],%d,%d\t%127[^,],%d,%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], &tmp_int[26],
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ tmp_str[1], &tmp_int[35], &tmp_int[36], //
+ tmp_str[2], &tmp_int[37], &tmp_int[38], &tmp_int[39], &next) != 43)
+ {
+ tmp_int[39] = 0; // partner id
+// Char structure version 384 (pet addition)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%127[^,],%d,%d\t%127[^,],%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], &tmp_int[26],
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ tmp_str[1], &tmp_int[35], &tmp_int[36], //
+ tmp_str[2], &tmp_int[37], &tmp_int[38], &next) != 42)
+ {
+ tmp_int[26] = 0; // pet id
+// Char structure of a version 1 (original data structure)
+ if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%127[^,],%d,%d\t%127[^,],%d,%d%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0], //
+ &tmp_int[3], &tmp_int[4], &tmp_int[5],
+ &tmp_uint[0], &tmp_uint[1], &tmp_int[8],
+ &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
+ &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
+ &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], //
+ &tmp_int[24], &tmp_int[25], //
+ &tmp_int[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ tmp_str[1], &tmp_int[35], &tmp_int[36], //
+ tmp_str[2], &tmp_int[37], &tmp_int[38], &next) != 41)
+ {
+ ShowError("Char-loading: Unrecognized character data version, info lost!\n");
+ ShowDebug("Character info: %s\n", str);
+ return 0;
+ }
+ } // Char structure version 384 (pet addition)
+ } // Char structure version 1008 (marriage partner addition)
+ } // Char structure of version 1363 (family data addition)
+ } // Char structure of version 1488 (fame field addition)
+ //Convert save data from string to integer for older formats
+ tmp_int[45] = mapindex_name2id(tmp_str[1]);
+ tmp_int[46] = mapindex_name2id(tmp_str[2]);
+ } // Char structure of version 1500 (homun + mapindex maps)
+
+ memcpy(p->name, tmp_str[0], NAME_LENGTH-1); //Overflow protection [Skotlex]
+ p->char_id = tmp_int[0];
+ p->account_id = tmp_int[1];
+ p->char_num = tmp_int[2];
+ p->class_ = tmp_int[3];
+/* Unneeded unless you are running a real old character database now.
+ //Temporal fix until all chars are reverted from peco-flying-class to
+ //normal classes. [Skotlex]
+ switch (p->class_) {
+ case JOB_KNIGHT2: //Job_Knight2
+ p->class_ = JOB_KNIGHT;
+ break;
+ case JOB_CRUSADER2: //Job_Crusader2
+ p->class_ = JOB_CRUSADER;
+ break;
+ case JOB_LORD_KNIGHT2: //Job_Lord_Knight2
+ p->class_ = JOB_LORD_KNIGHT;
+ break;
+ case JOB_PALADIN2: //Job_Paladin2
+ p->class_ = JOB_PALADIN;
+ break;
+ case JOB_BABY_KNIGHT2: //Job_Baby_Knight2
+ p->class_ = JOB_BABY_KNIGHT;
+ break;
+ case JOB_BABY_CRUSADER2: //Job_Baby_Crusader2
+ p->class_ = JOB_BABY_CRUSADER;
+ break;
+ case JOB_STAR_GLADIATOR2: //Job_Star_Gladiator2
+ p->class_ = JOB_STAR_GLADIATOR;
+ break;
+ }
+*/
+ p->base_level = tmp_int[4];
+ p->job_level = tmp_int[5];
+ p->base_exp = tmp_uint[0];
+ p->job_exp = tmp_uint[1];
+ p->zeny = tmp_int[8];
+ p->hp = tmp_int[9];
+ p->max_hp = tmp_int[10];
+ p->sp = tmp_int[11];
+ p->max_sp = tmp_int[12];
+ p->str = tmp_int[13];
+ p->agi = tmp_int[14];
+ p->vit = tmp_int[15];
+ p->int_ = tmp_int[16];
+ p->dex = tmp_int[17];
+ p->luk = tmp_int[18];
+ p->status_point = tmp_int[19] > USHRT_MAX ? USHRT_MAX : tmp_int[19];
+ p->skill_point = tmp_int[20] > USHRT_MAX ? USHRT_MAX : tmp_int[20];
+ p->option = tmp_int[21];
+ p->karma = tmp_int[22];
+ p->manner = tmp_int[23];
+ p->party_id = tmp_int[24];
+ p->guild_id = tmp_int[25];
+ p->pet_id = tmp_int[26];
+ p->hair = tmp_int[27];
+ p->hair_color = tmp_int[28];
+ p->clothes_color = tmp_int[29];
+ p->weapon = tmp_int[30];
+ p->shield = tmp_int[31];
+ p->head_top = tmp_int[32];
+ p->head_mid = tmp_int[33];
+ p->head_bottom = tmp_int[34];
+ p->last_point.x = tmp_int[35];
+ p->last_point.y = tmp_int[36];
+ p->save_point.x = tmp_int[37];
+ p->save_point.y = tmp_int[38];
+ p->partner_id = tmp_int[39];
+ p->father = tmp_int[40];
+ p->mother = tmp_int[41];
+ p->child = tmp_int[42];
+ p->fame = tmp_int[43];
+ p->hom_id = tmp_int[44];
+ p->last_point.map = tmp_int[45];
+ p->save_point.map = tmp_int[46];
+
+#ifndef TXT_SQL_CONVERT
+ // Some checks
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.char_id == p->char_id) {
+ ShowError(CL_RED"mmmo_auth_init: a character has an identical id to another.\n");
+ ShowError(" character id #%d -> new character not readed.\n", p->char_id);
+ ShowError(" Character saved in log file."CL_RESET"\n");
+ return -1;
+ } else if (strcmp(char_dat[i].status.name, p->name) == 0) {
+ ShowError(CL_RED"mmmo_auth_init: a character name already exists.\n");
+ ShowError(" character name '%s' -> new character not read.\n", p->name);
+ ShowError(" Character saved in log file."CL_RESET"\n");
+ return -2;
+ }
+ }
+
+ if (strcmpi(wisp_server_name, p->name) == 0) {
+ ShowWarning("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
+ ShowWarning(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name);
+ ShowWarning(" Character readed. Suggestion: change the wisp server name.\n");
+ char_log("mmo_auth_init: ******WARNING: character name has wisp server name: Character name '%s' = wisp server name '%s'." RETCODE,
+ p->name, wisp_server_name);
+ }
+#endif //TXT_SQL_CONVERT
+ if (str[next] == '\n' || str[next] == '\r')
+ return 1; // V‹Kƒf[ƒ^
+
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t'; i++) {
+ //mapindex memo format
+ if (sscanf(str+next, "%d,%d,%d%n", &tmp_int[2], &tmp_int[0], &tmp_int[1], &len) != 3)
+ { //Old string-based memo format.
+ if (sscanf(str+next, "%[^,],%d,%d%n", tmp_str[0], &tmp_int[0], &tmp_int[1], &len) != 3)
+ return -3;
+ tmp_int[2] = mapindex_name2id(tmp_str[0]);
+ }
+ if (i < MAX_MEMOPOINTS)
+ { //Avoid overflowing (but we must also read through all saved memos)
+ p->memo_point[i].x = tmp_int[0];
+ p->memo_point[i].y = tmp_int[1];
+ p->memo_point[i].map = tmp_int[2];
+ }
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t'; i++) {
+ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
+ &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str[0], &len) == 8)
+ {
+ p->inventory[i].id = tmp_int[0];
+ p->inventory[i].nameid = tmp_int[1];
+ p->inventory[i].amount = tmp_int[2];
+ p->inventory[i].equip = tmp_int[3];
+ p->inventory[i].identify = tmp_int[4];
+ p->inventory[i].refine = tmp_int[5];
+ p->inventory[i].attribute = tmp_int[6];
+
+ for(j = 0; j < MAX_SLOTS && tmp_str[0] && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
+ p->inventory[i].card[j] = tmp_int[0];
+
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ } else // invalid structure
+ return -4;
+ }
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t'; i++) {
+ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
+ &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str[0], &len) == 8)
+ {
+ p->cart[i].id = tmp_int[0];
+ p->cart[i].nameid = tmp_int[1];
+ p->cart[i].amount = tmp_int[2];
+ p->cart[i].equip = tmp_int[3];
+ p->cart[i].identify = tmp_int[4];
+ p->cart[i].refine = tmp_int[5];
+ p->cart[i].attribute = tmp_int[6];
+
+ for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
+ p->cart[i].card[j] = tmp_int[0];
+
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ } else // invalid structure
+ return -5;
+ }
+
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t'; i++) {
+ if (sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len) != 2)
+ return -6;
+ p->skill[tmp_int[0]].id = tmp_int[0];
+ p->skill[tmp_int[0]].lv = tmp_int[1];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
+ if (sscanf(str + next, "%[^,],%[^ ] %n", reg[i].str, reg[i].value, &len) != 2) {
+ // because some scripts are not correct, the str can be "". So, we must check that.
+ // If it's, we must not refuse the character, but just this REG value.
+ // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good)
+ if (str[next] == ',' && sscanf(str + next, ",%[^ ] %n", reg[i].value, &len) == 1)
+ i--;
+ else
+ return -7;
+ }
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ *reg_num = i;
+
+ return 1;
+}
+//---------------------------------
+// Function to read friend list
+//---------------------------------
+
+int parse_friend_txt(struct mmo_charstatus *p)
+{
+ char line[1024], temp[1024];
+ int pos = 0, count = 0, next;
+ int i,len;
+ FILE *fp;
+
+ // Open the file and look for the ID
+ fp = fopen(friends_txt, "r");
+
+ if(fp == NULL)
+ return -1;
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line, "%d%n",&i, &pos) < 1 || i != p->char_id)
+ continue; //Not this line...
+ //Read friends
+ len = strlen(line);
+ next = pos;
+ for (count = 0; next < len && count < MAX_FRIENDS; count++)
+ { //Read friends.
+ if (sscanf(line+next, ",%d,%d,%23[^,^\n]%n",&p->friends[count].account_id,&p->friends[count].char_id, p->friends[count].name, &pos) < 3)
+ { //Invalid friend?
+ memset(&p->friends[count], 0, sizeof(p->friends[count]));
+ break;
+ }
+ next+=pos;
+ //What IF the name contains a comma? while the next field is not a
+ //number, we assume it belongs to the current name. [Skotlex]
+ //NOTE: Of course, this will fail if someone sets their name to something like
+ //Bob,2005 but... meh, it's the problem of parsing a text file (encasing it in "
+ //won't do as quotes are also valid name chars!)
+ while(next < len && sscanf(line+next, ",%23[^,^\n]%n", temp, &pos) > 0)
+ {
+ if (atoi(temp)) //We read the next friend, just continue.
+ break;
+ //Append the name.
+ next+=pos;
+ i = strlen(p->friends[count].name);
+ if (i + strlen(temp) +1 < NAME_LENGTH)
+ {
+ p->friends[count].name[i] = ',';
+ strcpy(p->friends[count].name+i+1, temp);
+ }
+ } //End Guess Block
+ } //Friend's for.
+ break; //Found friends.
+ }
+ fclose(fp);
+ return count;
+}
+#ifndef TXT_SQL_CONVERT
+//---------------------------------
+// Function to read characters file
+//---------------------------------
+int mmo_char_init(void) {
+ char line[65536];
+ int ret, line_count;
+ FILE *fp;
+
+ char_max = 256;
+ char_dat = (struct character_data*)aCalloc(sizeof(struct character_data) * 256, 1);
+ if (!char_dat) {
+ ShowFatalError("out of memory: mmo_char_init (calloc of char_dat).\n");
+ exit(1);
+ }
+ char_num = 0;
+
+ fp = fopen(char_txt, "r");
+
+ if (fp == NULL) {
+ ShowError("Characters file not found: %s.\n", char_txt);
+ char_log("Characters file not found: %s." RETCODE, char_txt);
+ char_log("Id for the next created character: %d." RETCODE, char_id_count);
+ return 0;
+ }
+
+ line_count = 0;
+ while(fgets(line, sizeof(line)-1, fp)) {
+ int i, j;
+ line_count++;
+
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ line[sizeof(line)-1] = '\0';
+
+ j = 0;
+ if (sscanf(line, "%d\t%%newid%%%n", &i, &j) == 1 && j > 0) {
+ if (char_id_count < i)
+ char_id_count = i;
+ continue;
+ }
+
+ if (char_num >= char_max) {
+ char_max += 256;
+ char_dat = (struct character_data*)aRealloc(char_dat, sizeof(struct character_data) * char_max);
+ if (!char_dat) {
+ ShowFatalError("Out of memory: mmo_char_init (realloc of char_dat).\n");
+ char_log("Out of memory: mmo_char_init (realloc of char_dat)." RETCODE);
+ exit(1);
+ }
+ }
+
+ ret = mmo_char_fromstr(line, &char_dat[char_num].status, char_dat[char_num].global, &char_dat[char_num].global_num);
+
+ // Initialize friends list
+ parse_friend_txt(&char_dat[char_num].status); // Grab friends for the character
+
+ if (ret > 0) { // negative value or zero for errors
+ if (char_dat[char_num].status.char_id >= char_id_count)
+ char_id_count = char_dat[char_num].status.char_id + 1;
+ char_num++;
+ } else {
+ ShowError("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count);
+ ShowError(" -> Character saved in log file.\n");
+ switch (ret) {
+ case -1:
+ char_log("Duplicate character id in the next character line (character not readed):" RETCODE);
+ break;
+ case -2:
+ char_log("Duplicate character name in the next character line (character not readed):" RETCODE);
+ break;
+ case -3:
+ char_log("Invalid memo point structure in the next character line (character not readed):" RETCODE);
+ break;
+ case -4:
+ char_log("Invalid inventory item structure in the next character line (character not readed):" RETCODE);
+ break;
+ case -5:
+ char_log("Invalid cart item structure in the next character line (character not readed):" RETCODE);
+ break;
+ case -6:
+ char_log("Invalid skill structure in the next character line (character not readed):" RETCODE);
+ break;
+ case -7:
+ char_log("Invalid register structure in the next character line (character not readed):" RETCODE);
+ break;
+ default: // 0
+ char_log("Unabled to get a character in the next line - Basic structure of line (before inventory) is incorrect (character not readed):" RETCODE);
+ break;
+ }
+ char_log("%s", line);
+ }
+ }
+ fclose(fp);
+
+ if (char_num == 0) {
+ ShowNotice("mmo_char_init: No character found in %s.\n", char_txt);
+ char_log("mmo_char_init: No character found in %s." RETCODE, char_txt);
+ } else if (char_num == 1) {
+ ShowStatus("mmo_char_init: 1 character read in %s.\n", char_txt);
+ char_log("mmo_char_init: 1 character read in %s." RETCODE, char_txt);
+ } else {
+ ShowStatus("mmo_char_init: %d characters read in %s.\n", char_num, char_txt);
+ char_log("mmo_char_init: %d characters read in %s." RETCODE, char_num, char_txt);
+ }
+
+ char_log("Id for the next created character: %d." RETCODE, char_id_count);
+
+ return 0;
+}
+
+//---------------------------------------------------------
+// Function to save characters in files (speed up by [Yor])
+//---------------------------------------------------------
+void mmo_char_sync(void) {
+ char line[65536],f_line[1024];
+ int i, j, k;
+ int lock;
+ FILE *fp,*f_fp;
+ //int *id = (int *) aMalloc(sizeof(int) * char_num);
+ CREATE_BUFFER(id, int, char_num);
+
+ // Sorting before save (by [Yor])
+ for(i = 0; i < char_num; i++) {
+ id[i] = i;
+ for(j = 0; j < i; j++) {
+ if ((char_dat[i].status.account_id < char_dat[id[j]].status.account_id) ||
+ // if same account id, we sort by slot.
+ (char_dat[i].status.account_id == char_dat[id[j]].status.account_id &&
+ char_dat[i].status.char_num < char_dat[id[j]].status.char_num)) {
+ for(k = i; k > j; k--)
+ id[k] = id[k-1];
+ id[j] = i; // id[i]
+ break;
+ }
+ }
+ }
+
+ // Data save
+ fp = lock_fopen(char_txt, &lock);
+ if (fp == NULL) {
+ ShowWarning("Server can't not save characters.\n");
+ char_log("WARNING: Server can't not save characters." RETCODE);
+ } else {
+ for(i = 0; i < char_num; i++) {
+ // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
+ mmo_char_tostr(line, &char_dat[id[i]].status, char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
+ fprintf(fp, "%s" RETCODE, line);
+ }
+ fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
+ lock_fclose(fp, char_txt, &lock);
+ }
+
+ // Data save (backup)
+ if (backup_txt_flag) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
+ fp = lock_fopen(backup_txt, &lock);
+ if (fp == NULL) {
+ ShowWarning("Server can't not create backup of characters file.\n");
+ char_log("WARNING: Server can't not create backup of characters file." RETCODE);
+ //aFree(id); // free up the memory before leaving -.- [Ajarn]
+ DELETE_BUFFER(id);
+ return;
+ }
+ for(i = 0; i < char_num; i++) {
+ // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
+ mmo_char_tostr(line, &char_dat[id[i]].status,char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
+ fprintf(fp, "%s" RETCODE, line);
+ }
+ fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
+ lock_fclose(fp, backup_txt, &lock);
+ }
+
+ // Friends List data save (davidsiaw)
+ f_fp = lock_fopen(friends_txt, &lock);
+ for(i = 0; i < char_num; i++) {
+ mmo_friends_list_data_str(f_line, &char_dat[id[i]].status);
+ fprintf(f_fp, "%s" RETCODE, f_line);
+ }
+
+ lock_fclose(f_fp, friends_txt, &lock);
+
+ //aFree(id);
+ DELETE_BUFFER(id);
+
+ return;
+}
+
+//----------------------------------------------------
+// Function to save (in a periodic way) datas in files
+//----------------------------------------------------
+int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
+ if (save_log)
+ ShowInfo("Saving all files...\n");
+ mmo_char_sync();
+ inter_save();
+ return 0;
+}
+
+//-----------------------------------
+// Function to create a new character
+//-----------------------------------
+int make_new_char(int fd, unsigned char *dat) {
+ int i;
+ struct char_session_data *sd;
+ char name[NAME_LENGTH];
+
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ // remove control characters from the name
+ strncpy(name, dat, NAME_LENGTH);
+ name[NAME_LENGTH-1] = '\0'; //Trunc name to max possible value (23)
+
+ trim(name,TRIM_CHARS); //Trim character name. [Skotlex]
+
+ //check name != main chat nick [LuzZza]
+ if(strcmpi(name, main_chat_nick) == 0) {
+ char_log("Create char failed (%d): this nick (%s) reserved for mainchat messages." RETCODE,
+ sd->account_id, name);
+ return -1;
+ }
+
+ if (remove_control_chars((unsigned char *)name)) {
+ char_log("Make new char error (control char received in the name): (connection #%d, account: %d)." RETCODE,
+ fd, sd->account_id);
+ return -1;
+ }
+
+ // check lenght of character name
+ if (strlen(name) < 4) {
+ char_log("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." RETCODE,
+ fd, sd->account_id, dat);
+ return -1;
+ }
+
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
+ fd, sd->account_id, name, name[i]);
+ return -1;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
+ fd, sd->account_id, dat, dat[i]);
+ return -1;
+ }
+ } // else, all letters/symbols are authorised (except control char removed before)
+
+ if (dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5*6 || // stats
+ dat[30] >= 9 || // slots (dat[30] can not be negativ)
+ dat[33] <= 0 || dat[33] >= 24 || // hair style
+ dat[31] >= 9) { // hair color (dat[31] can not be negativ)
+ char_log("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
+ fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+
+ // check individual stat value
+ for(i = 24; i <= 29; i++) {
+ if (dat[i] < 1 || dat[i] > 9) {
+ char_log("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
+ fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+ } // now we know that every stat has proper value but we have to check if str/int agi/luk vit/dex pairs are correct
+
+ if( ((dat[24]+dat[27]) > 10) || ((dat[25]+dat[29]) > 10) || ((dat[26]+dat[28]) > 10) ) {
+ if (log_char) {
+ char_log("Make new char error (invalid stat value): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
+ fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+ } // now when we have passed all stat checks
+
+ for(i = 0; i < char_num; i++) {
+ if ((name_ignoring_case != 0 && strncmp(char_dat[i].status.name, name, NAME_LENGTH) == 0) ||
+ (name_ignoring_case == 0 && strncmpi(char_dat[i].status.name, name, NAME_LENGTH) == 0)) {
+ char_log("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
+ fd, sd->account_id, dat[30], dat, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+ if (char_dat[i].status.account_id == sd->account_id && char_dat[i].status.char_num == dat[30]) {
+ char_log("Make new char error (slot already used): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
+ fd, sd->account_id, dat[30], dat, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+ }
+
+ if (strcmp(wisp_server_name, name) == 0) {
+ char_log("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
+ fd, sd->account_id, dat[30], name, char_dat[i].status.name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+ return -1;
+ }
+
+ if (char_num >= char_max) {
+ char_max += 256;
+ char_dat = (struct character_data*)aRealloc(char_dat, sizeof(struct character_data) * char_max);
+ if (!char_dat) {
+ ShowFatalError("Out of memory: make_new_char (realloc of char_dat).\n");
+ char_log("Out of memory: make_new_char (realloc of char_dat)." RETCODE);
+ exit(1);
+ }
+ }
+
+ char_log("Creation of New Character: (connection #%d, account: %d) slot %d, character Name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
+ fd, sd->account_id, dat[30], name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
+
+ memset(&char_dat[i], 0, sizeof(struct character_data));
+
+ char_dat[i].status.char_id = char_id_count++;
+ char_dat[i].status.account_id = sd->account_id;
+ char_dat[i].status.char_num = dat[30];
+ strcpy(char_dat[i].status.name,name);
+ char_dat[i].status.class_ = 0;
+ char_dat[i].status.base_level = 1;
+ char_dat[i].status.job_level = 1;
+ char_dat[i].status.base_exp = 0;
+ char_dat[i].status.job_exp = 0;
+ char_dat[i].status.zeny = start_zeny;
+ char_dat[i].status.str = dat[24];
+ char_dat[i].status.agi = dat[25];
+ char_dat[i].status.vit = dat[26];
+ char_dat[i].status.int_ = dat[27];
+ char_dat[i].status.dex = dat[28];
+ char_dat[i].status.luk = dat[29];
+ char_dat[i].status.max_hp = 40 * (100 + char_dat[i].status.vit) / 100;
+ char_dat[i].status.max_sp = 11 * (100 + char_dat[i].status.int_) / 100;
+ char_dat[i].status.hp = char_dat[i].status.max_hp;
+ char_dat[i].status.sp = char_dat[i].status.max_sp;
+ char_dat[i].status.status_point = 0;
+ char_dat[i].status.skill_point = 0;
+ char_dat[i].status.option = 0;
+ char_dat[i].status.karma = 0;
+ char_dat[i].status.manner = 0;
+ char_dat[i].status.party_id = 0;
+ char_dat[i].status.guild_id = 0;
+ char_dat[i].status.hair = dat[33];
+ char_dat[i].status.hair_color = dat[31];
+ char_dat[i].status.clothes_color = 0;
+ char_dat[i].status.inventory[0].nameid = start_weapon; // Knife
+ char_dat[i].status.inventory[0].amount = 1;
+ char_dat[i].status.inventory[0].equip = 0x02;
+ char_dat[i].status.inventory[0].identify = 1;
+ char_dat[i].status.inventory[1].nameid = start_armor; // Cotton Shirt
+ char_dat[i].status.inventory[1].amount = 1;
+ char_dat[i].status.inventory[1].equip = 0x10;
+ char_dat[i].status.inventory[1].identify = 1;
+ char_dat[i].status.weapon = 1;
+ char_dat[i].status.shield = 0;
+ char_dat[i].status.head_top = 0;
+ char_dat[i].status.head_mid = 0;
+ char_dat[i].status.head_bottom = 0;
+ memcpy(&char_dat[i].status.last_point, &start_point, sizeof(start_point));
+ memcpy(&char_dat[i].status.save_point, &start_point, sizeof(start_point));
+ char_num++;
+
+ mmo_char_sync();
+ return i;
+}
+
+//----------------------------------------------------
+// This function return the name of the job (by [Yor])
+//----------------------------------------------------
+char * job_name(int class_) {
+ switch (class_) {
+ case JOB_NOVICE: return "Novice";
+ case JOB_SWORDMAN: return "Swordsman";
+ case JOB_MAGE: return "Mage";
+ case JOB_ARCHER: return "Archer";
+ case JOB_ACOLYTE: return "Acolyte";
+ case JOB_MERCHANT: return "Merchant";
+ case JOB_THIEF: return "Thief";
+ case JOB_KNIGHT: return "Knight";
+ case JOB_PRIEST: return "Priest";
+ case JOB_WIZARD: return "Wizard";
+ case JOB_BLACKSMITH: return "Blacksmith";
+ case JOB_HUNTER: return "Hunter";
+ case JOB_ASSASSIN: return "Assassin";
+ case JOB_KNIGHT2: return "Peco-Knight";
+ case JOB_CRUSADER: return "Crusader";
+ case JOB_MONK: return "Monk";
+ case JOB_SAGE: return "Sage";
+ case JOB_ROGUE: return "Rogue";
+ case JOB_ALCHEMIST: return "Alchemist";
+ case JOB_BARD: return "Bard";
+ case JOB_DANCER: return "Dancer";
+ case JOB_CRUSADER2: return "Peco-Crusader";
+ case JOB_WEDDING: return "Wedding";
+ case JOB_SUPER_NOVICE: return "Super Novice";
+ case JOB_GUNSLINGER: return "Gunslinger";
+ case JOB_NINJA: return "Ninja";
+ case JOB_XMAS: return "Christmas";
+ case JOB_NOVICE_HIGH: return "Novice High";
+ case JOB_SWORDMAN_HIGH: return "Swordsman High";
+ case JOB_MAGE_HIGH: return "Mage High";
+ case JOB_ARCHER_HIGH: return "Archer High";
+ case JOB_ACOLYTE_HIGH: return "Acolyte High";
+ case JOB_MERCHANT_HIGH: return "Merchant High";
+ case JOB_THIEF_HIGH: return "Thief High";
+ case JOB_LORD_KNIGHT: return "Lord Knight";
+ case JOB_HIGH_PRIEST: return "High Priest";
+ case JOB_HIGH_WIZARD: return "High Wizard";
+ case JOB_WHITESMITH: return "Whitesmith";
+ case JOB_SNIPER: return "Sniper";
+ case JOB_ASSASSIN_CROSS: return "Assassin Cross";
+ case JOB_LORD_KNIGHT2: return "Peko Knight";
+ case JOB_PALADIN: return "Paladin";
+ case JOB_CHAMPION: return "Champion";
+ case JOB_PROFESSOR: return "Professor";
+ case JOB_STALKER: return "Stalker";
+ case JOB_CREATOR: return "Creator";
+ case JOB_CLOWN: return "Clown";
+ case JOB_GYPSY: return "Gypsy";
+ case JOB_PALADIN2: return "Peko Paladin";
+ case JOB_BABY: return "Baby Novice";
+ case JOB_BABY_SWORDMAN: return "Baby Swordsman";
+ case JOB_BABY_MAGE: return "Baby Mage";
+ case JOB_BABY_ARCHER: return "Baby Archer";
+ case JOB_BABY_ACOLYTE: return "Baby Acolyte";
+ case JOB_BABY_MERCHANT: return "Baby Merchant";
+ case JOB_BABY_THIEF: return "Baby Thief";
+ case JOB_BABY_KNIGHT: return "Baby Knight";
+ case JOB_BABY_PRIEST: return "Baby Priest";
+ case JOB_BABY_WIZARD: return "Baby Wizard";
+ case JOB_BABY_BLACKSMITH: return "Baby Blacksmith";
+ case JOB_BABY_HUNTER: return "Baby Hunter";
+ case JOB_BABY_ASSASSIN: return "Baby Assassin";
+ case JOB_BABY_KNIGHT2: return "Baby Peco Knight";
+ case JOB_BABY_CRUSADER: return "Baby Crusader";
+ case JOB_BABY_MONK: return "Baby Monk";
+ case JOB_BABY_SAGE: return "Baby Sage";
+ case JOB_BABY_ROGUE: return "Baby Rogue";
+ case JOB_BABY_ALCHEMIST: return "Baby Alchemist";
+ case JOB_BABY_BARD: return "Baby Bard";
+ case JOB_BABY_DANCER: return "Baby Dancer";
+ case JOB_BABY_CRUSADER2: return "Baby Peco Crusader";
+ case JOB_SUPER_BABY: return "Super Baby";
+ case JOB_TAEKWON: return "Taekwon";
+ case JOB_STAR_GLADIATOR: return "Star Gladiator";
+ case JOB_STAR_GLADIATOR2: return "Flying Star Gladiator";
+ case JOB_SOUL_LINKER: return "Soul Linker";
+ }
+ return "Unknown Job";
+}
+
+static int create_online_files_sub(DBKey key, void* data, va_list va)
+{
+ struct online_char_data *character;
+ int* players;
+ int *id;
+ int j,k,l;
+ character = (struct online_char_data*) data;
+ players = va_arg(va, int*);
+ id = va_arg(va, int*);
+
+ // check if map-server is online
+ if (character->server == -1 || character->char_id == -1) { //Character not currently online.
+ return -1;
+ }
+
+ j = character->server;
+ if (server_fd[j] < 0) {
+ server[j].users = 0;
+ return -1;
+ }
+ // search position of character in char_dat and sort online characters.
+ for(j = 0; j < char_num; j++) {
+ if (char_dat[j].status.char_id != character->char_id)
+ continue;
+ id[*players] = j;
+ // use sorting option
+ switch (online_sorting_option) {
+ case 1: // by name (without case sensitive)
+ for(k = 0; k < *players; k++)
+ if (stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0 ||
+ // if same name, we sort with case sensitive.
+ (stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) == 0 &&
+ strcmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
+ for(l = *players; l > k; l--)
+ id[l] = id[l-1];
+ id[k] = j; // id[*players]
+ break;
+ }
+ break;
+ case 2: // by zeny
+ for(k = 0; k < *players; k++)
+ if (char_dat[j].status.zeny < char_dat[id[k]].status.zeny ||
+ // if same number of zenys, we sort by name.
+ (char_dat[j].status.zeny == char_dat[id[k]].status.zeny &&
+ stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
+ for(l = *players; l > k; l--)
+ id[l] = id[l-1];
+ id[k] = j; // id[*players]
+ break;
+ }
+ break;
+ case 3: // by base level
+ for(k = 0; k < *players; k++)
+ if (char_dat[j].status.base_level < char_dat[id[k]].status.base_level ||
+ // if same base level, we sort by base exp.
+ (char_dat[j].status.base_level == char_dat[id[k]].status.base_level &&
+ char_dat[j].status.base_exp < char_dat[id[k]].status.base_exp)) {
+ for(l = *players; l > k; l--)
+ id[l] = id[l-1];
+ id[k] = j; // id[*players]
+ break;
+ }
+ break;
+ case 4: // by job (and job level)
+ for(k = 0; k < *players; k++)
+ if (char_dat[j].status.class_ < char_dat[id[k]].status.class_ ||
+ // if same job, we sort by job level.
+ (char_dat[j].status.class_ == char_dat[id[k]].status.class_ &&
+ char_dat[j].status.job_level < char_dat[id[k]].status.job_level) ||
+ // if same job and job level, we sort by job exp.
+ (char_dat[j].status.class_ == char_dat[id[k]].status.class_ &&
+ char_dat[j].status.job_level == char_dat[id[k]].status.job_level &&
+ char_dat[j].status.job_exp < char_dat[id[k]].status.job_exp)) {
+ for(l = *players; l > k; l--)
+ id[l] = id[l-1];
+ id[k] = j; // id[*players]
+ break;
+ }
+ break;
+ case 5: // by location map name
+ {
+ const char *map1, *map2;
+ map1 = mapindex_id2name(char_dat[j].status.last_point.map);
+
+ for(k = 0; k < *players; k++) {
+ map2 = mapindex_id2name(char_dat[id[k]].status.last_point.map);
+ if (!map1 || !map2 || //Avoid sorting if either one failed to resolve.
+ stricmp(map1, map2) < 0 ||
+ // if same map name, we sort by name.
+ (stricmp(map1, map2) == 0 &&
+ stricmp(char_dat[j].status.name, char_dat[id[k]].status.name) < 0)) {
+ for(l = *players; l > k; l--)
+ id[l] = id[l-1];
+ id[k] = j; // id[*players]
+ break;
+ }
+ }
+ }
+ break;
+ default: // 0 or invalid value: no sorting
+ break;
+ }
+ (*players)++;
+ break;
+ }
+ return 0;
+}
+//-------------------------------------------------------------
+// Function to create the online files (txt and html). by [Yor]
+//-------------------------------------------------------------
+void create_online_files(void) {
+ unsigned int k, j; // for loop with strlen comparing
+ int i, l; // for loops
+ int players; // count the number of players
+ FILE *fp; // for the txt file
+ FILE *fp2; // for the html file
+ char temp[256]; // to prepare what we must display
+ time_t time_server; // for number of seconds
+ struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
+ int id[4096];
+
+ if (online_display_option == 0) // we display nothing, so return
+ return;
+
+ // Get number of online players, id of each online players, and verify if a server is offline
+ players = 0;
+ online_char_db->foreach(online_char_db, create_online_files_sub, &players, &id);
+
+ // write files
+ fp = fopen(online_txt_filename, "w");
+ if (fp != NULL) {
+ fp2 = fopen(online_html_filename, "w");
+ if (fp2 != NULL) {
+ // get time
+ time(&time_server); // get time in seconds since 1/1/1970
+ datetime = localtime(&time_server); // convert seconds in structure
+ strftime(temp, sizeof(temp), "%d %b %Y %X", datetime); // like sprintf, but only for date/time (05 dec 2003 15:12:52)
+ // write heading
+ fprintf(fp2, "<HTML>\n");
+ fprintf(fp2, " <META http-equiv=\"Refresh\" content=\"%d\">\n", online_refresh_html); // update on client explorer every x seconds
+ fprintf(fp2, " <HEAD>\n");
+ fprintf(fp2, " <TITLE>Online Players on %s</TITLE>\n", server_name);
+ fprintf(fp2, " </HEAD>\n");
+ fprintf(fp2, " <BODY>\n");
+ fprintf(fp2, " <H3>Online Players on %s (%s):</H3>\n", server_name, temp);
+ fprintf(fp, "Online Players on %s (%s):\n", server_name, temp);
+ fprintf(fp, "\n");
+
+ for (i = 0; i < players; i++) {
+ // if it's the first player
+ if (i == 0) {
+ j = 0; // count the number of characters for the txt version and to set the separate line
+ fprintf(fp2, " <table border=\"1\" cellspacing=\"1\">\n");
+ fprintf(fp2, " <tr>\n");
+ if ((online_display_option & 1) || (online_display_option & 64)) {
+ fprintf(fp2, " <td><b>Name</b></td>\n");
+ if (online_display_option & 64) {
+ fprintf(fp, "Name "); // 30
+ j += 30;
+ } else {
+ fprintf(fp, "Name "); // 25
+ j += 25;
+ }
+ }
+ if ((online_display_option & 6) == 6) {
+ fprintf(fp2, " <td><b>Job (levels)</b></td>\n");
+ fprintf(fp, "Job Levels "); // 27
+ j += 27;
+ } else if (online_display_option & 2) {
+ fprintf(fp2, " <td><b>Job</b></td>\n");
+ fprintf(fp, "Job "); // 19
+ j += 19;
+ } else if (online_display_option & 4) {
+ fprintf(fp2, " <td><b>Levels</b></td>\n");
+ fprintf(fp, " Levels "); // 8
+ j += 8;
+ }
+ if (online_display_option & 24) { // 8 or 16
+ fprintf(fp2, " <td><b>Location</b></td>\n");
+ if (online_display_option & 16) {
+ fprintf(fp, "Location ( x , y ) "); // 23
+ j += 23;
+ } else {
+ fprintf(fp, "Location "); // 13
+ j += 13;
+ }
+ }
+ if (online_display_option & 32) {
+ fprintf(fp2, " <td ALIGN=CENTER><b>zenys</b></td>\n");
+ fprintf(fp, " Zenys "); // 16
+ j += 16;
+ }
+ fprintf(fp2, " </tr>\n");
+ fprintf(fp, "\n");
+ for (k = 0; k < j; k++)
+ fprintf(fp, "-");
+ fprintf(fp, "\n");
+ }
+ fprintf(fp2, " <tr>\n");
+ // get id of the character (more speed)
+ j = id[i];
+ // displaying the character name
+ if ((online_display_option & 1) || (online_display_option & 64)) { // without/with 'GM' display
+ strcpy(temp, char_dat[j].status.name);
+ l = isGM(char_dat[j].status.account_id);
+ if (online_display_option & 64) {
+ if (l >= online_gm_display_min_level)
+ fprintf(fp, "%-24s (GM) ", temp);
+ else
+ fprintf(fp, "%-24s ", temp);
+ } else
+ fprintf(fp, "%-24s ", temp);
+ // name of the character in the html (no < >, because that create problem in html code)
+ fprintf(fp2, " <td>");
+ if ((online_display_option & 64) && l >= online_gm_display_min_level)
+ fprintf(fp2, "<b>");
+ for (k = 0; k < strlen(temp); k++) {
+ switch(temp[k]) {
+ case '<': // <
+ fprintf(fp2, "&lt;");
+ break;
+ case '>': // >
+ fprintf(fp2, "&gt;");
+ break;
+ default:
+ fprintf(fp2, "%c", temp[k]);
+ break;
+ };
+ }
+ if ((online_display_option & 64) && l >= online_gm_display_min_level)
+ fprintf(fp2, "</b> (GM)");
+ fprintf(fp2, "</td>\n");
+ }
+ // displaying of the job
+ if (online_display_option & 6) {
+ char * jobname = job_name(char_dat[j].status.class_);
+ if ((online_display_option & 6) == 6) {
+ fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].status.base_level, char_dat[j].status.job_level);
+ fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].status.base_level, char_dat[j].status.job_level);
+ } else if (online_display_option & 2) {
+ fprintf(fp2, " <td>%s</td>\n", jobname);
+ fprintf(fp, "%-18s ", jobname);
+ } else if (online_display_option & 4) {
+ fprintf(fp2, " <td>%d/%d</td>\n", char_dat[j].status.base_level, char_dat[j].status.job_level);
+ fprintf(fp, "%3d/%3d ", char_dat[j].status.base_level, char_dat[j].status.job_level);
+ }
+ }
+ // displaying of the map
+ if (online_display_option & 24) { // 8 or 16
+ // prepare map name
+ memcpy(temp, mapindex_id2name(char_dat[j].status.last_point.map), MAP_NAME_LENGTH);
+ temp[MAP_NAME_LENGTH] = '\0';
+ if (strstr(temp, ".gat") != NULL) {
+ temp[strstr(temp, ".gat") - temp] = 0; // suppress the '.gat'
+ }
+ // write map name
+ if (online_display_option & 16) { // map-name AND coordinates
+ fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].status.last_point.x, char_dat[j].status.last_point.y);
+ fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].status.last_point.x, char_dat[j].status.last_point.y);
+ } else {
+ fprintf(fp2, " <td>%s</td>\n", temp);
+ fprintf(fp, "%-12s ", temp);
+ }
+ }
+ // displaying nimber of zenys
+ if (online_display_option & 32) {
+ // write number of zenys
+ if (char_dat[j].status.zeny == 0) { // if no zeny
+ fprintf(fp2, " <td ALIGN=RIGHT>no zeny</td>\n");
+ fprintf(fp, " no zeny ");
+ } else {
+ fprintf(fp2, " <td ALIGN=RIGHT>%d z</td>\n", char_dat[j].status.zeny);
+ fprintf(fp, "%13d z ", char_dat[j].status.zeny);
+ }
+ }
+ fprintf(fp, "\n");
+ fprintf(fp2, " </tr>\n");
+ }
+ // If we display at least 1 player
+ if (players > 0) {
+ fprintf(fp2, " </table>\n");
+ fprintf(fp, "\n");
+ }
+
+ // Displaying number of online players
+ if (players == 0) {
+ fprintf(fp2, " <p>No user is online.</p>\n");
+ fprintf(fp, "No user is online.\n");
+ } else if (players == 1) {
+ fprintf(fp2, " <p>%d user is online.</p>\n", players);
+ fprintf(fp, "%d user is online.\n", players);
+ } else {
+ fprintf(fp2, " <p>%d users are online.</p>\n", players);
+ fprintf(fp, "%d users are online.\n", players);
+ }
+ fprintf(fp2, " </BODY>\n");
+ fprintf(fp2, "</HTML>\n");
+ fclose(fp2);
+ }
+ fclose(fp);
+ }
+
+ return;
+}
+
+//---------------------------------------------------------------------
+// This function return the number of online players in all map-servers
+//---------------------------------------------------------------------
+int count_users(void) {
+ int i, users;
+
+ users = 0;
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ users += server[i].users;
+
+ return users;
+}
+
+//----------------------------------------
+// Function to send characters to a player
+//----------------------------------------
+int mmo_char_send006b(int fd, struct char_session_data *sd) {
+ int i, j, found_num;
+ struct mmo_charstatus *p;
+//#ifdef NEW_006b
+ const int offset = 24;
+//#else
+// const int offset = 4;
+//#endif
+
+ set_char_online(-1, 99,sd->account_id);
+
+ found_num = 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == sd->account_id) {
+ sd->found_char[found_num] = i;
+ found_num++;
+ if (found_num == 9)
+ break;
+ }
+ }
+ for(i = found_num; i < 9; i++)
+ sd->found_char[i] = -1;
+
+ WFIFOHEAD(fd, offset + found_num * 106);
+ memset(WFIFOP(fd,0), 0, offset + found_num * 106);
+ WFIFOW(fd,0) = 0x6b;
+ WFIFOW(fd,2) = offset + found_num * 106;
+
+ for(i = 0; i < found_num; i++) {
+ p = &char_dat[sd->found_char[i]].status;
+ j = offset + (i * 106); // increase speed of code
+
+ WFIFOL(fd,j) = p->char_id;
+ WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
+ WFIFOL(fd,j+8) = p->zeny;
+ WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
+ WFIFOL(fd,j+16) = p->job_level;
+
+ WFIFOL(fd,j+20) = 0;
+ WFIFOL(fd,j+24) = 0;
+ WFIFOL(fd,j+28) = p->option;
+
+ WFIFOL(fd,j+32) = p->karma;
+ WFIFOL(fd,j+36) = p->manner;
+
+ WFIFOW(fd,j+40) = (p->status_point>SHRT_MAX) ? SHRT_MAX : p->status_point;
+ WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
+ WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
+ WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
+ WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
+ WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
+ WFIFOW(fd,j+52) = p->class_;
+ WFIFOW(fd,j+54) = p->hair;
+ WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
+ WFIFOW(fd,j+58) = p->base_level;
+ WFIFOW(fd,j+60) = (p->skill_point>SHRT_MAX)? SHRT_MAX : p->skill_point;
+ WFIFOW(fd,j+62) = p->head_bottom;
+ WFIFOW(fd,j+64) = p->shield;
+ WFIFOW(fd,j+66) = p->head_top;
+ WFIFOW(fd,j+68) = p->head_mid;
+ WFIFOW(fd,j+70) = p->hair_color;
+ WFIFOW(fd,j+72) = p->clothes_color;
+
+ memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
+
+ WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str;
+ WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi;
+ WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit;
+ WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_;
+ WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex;
+ WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk;
+ WFIFOB(fd,j+104) = p->char_num;
+ }
+
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+// —£¥(char휎ž‚ÉŽg—p)
+int char_divorce(struct mmo_charstatus *cs) {
+ if (cs == NULL)
+ return 0;
+
+ if (cs->partner_id > 0){
+ int i, j;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.char_id == cs->partner_id && char_dat[i].status.partner_id == cs->char_id) {
+ cs->partner_id = 0;
+ char_dat[i].status.partner_id = 0;
+ for(j = 0; j < MAX_INVENTORY; j++)
+ if (char_dat[i].status.inventory[j].nameid == WEDDING_RING_M || char_dat[i].status.inventory[j].nameid == WEDDING_RING_F)
+ memset(&char_dat[i].status.inventory[j], 0, sizeof(char_dat[i].status.inventory[0]));
+ if (cs->inventory[j].nameid == WEDDING_RING_M || cs->inventory[j].nameid == WEDDING_RING_F)
+ memset(&cs->inventory[j], 0, sizeof(cs->inventory[0]));
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+int char_married(int pl1,int pl2) {
+ return (char_dat[pl1].status.char_id == char_dat[pl2].status.partner_id && char_dat[pl2].status.char_id == char_dat[pl1].status.partner_id);
+}
+
+int char_child(int parent_id, int child_id) {
+ return (char_dat[parent_id].status.child == char_dat[child_id].status.char_id &&
+ ((char_dat[parent_id].status.char_id == char_dat[child_id].status.father) ||
+ (char_dat[parent_id].status.char_id == char_dat[child_id].status.mother)));
+}
+
+int char_family(int cid1, int cid2, int cid3) {
+ int i, idx1 = -1, idx2 =-1;//, idx3 =-1;
+ for(i = 0; i < char_num && (idx1 == -1 || idx2 == -1/* || idx3 == 1*/); i++)
+ {
+ if (char_dat[i].status.char_id == cid1)
+ idx1 = i;
+ if (char_dat[i].status.char_id == cid2)
+ idx2 = i;
+// if (char_dat[i].status.char_id == cid2)
+// idx3 = i;
+ }
+ if (idx1 == -1 || idx2 == -1/* || idx3 == -1*/)
+ return 0; //Some character not found??
+
+ //Unless the dbs are corrupted, these 3 checks should suffice, even though
+ //we could do a lot more checks and force cross-reference integrity.
+ if(char_dat[idx1].status.partner_id == cid2 &&
+ char_dat[idx1].status.child == cid3)
+ return cid3; //cid1/cid2 parents. cid3 child.
+
+ if(char_dat[idx1].status.partner_id == cid3 &&
+ char_dat[idx1].status.child == cid2)
+ return cid2; //cid1/cid3 parents. cid2 child.
+
+ if(char_dat[idx2].status.partner_id == cid3 &&
+ char_dat[idx2].status.child == cid1)
+ return cid1; //cid2/cid3 parents. cid1 child.
+ return 0;
+}
+
+//Clears the given party id from all characters.
+//Since sometimes the party format changes and parties must be wiped, this
+//method is required to prevent stress during the "party not found!" stages.
+void char_clearparty(int party_id)
+{
+ int i;
+ for(i = 0; i < char_num; i++)
+ {
+ if (char_dat[i].status.party_id == party_id)
+ char_dat[i].status.party_id = 0;
+ }
+}
+
+//------------------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
+//------------------------------------------------------------
+int e_mail_check(char *email) {
+ char ch;
+ char* last_arobas;
+
+ // athena limits
+ if (strlen(email) < 3 || strlen(email) > 39)
+ return 0;
+
+ // part of RFC limits (official reference of e-mail description)
+ if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
+ return 0;
+
+ if (email[strlen(email)-1] == '.')
+ return 0;
+
+ last_arobas = strrchr(email, '@');
+
+ if (strstr(last_arobas, "@.") != NULL ||
+ strstr(last_arobas, "..") != NULL)
+ return 0;
+
+ for(ch = 1; ch < 32; ch++) {
+ if (strchr(last_arobas, ch) != NULL) {
+ return 0;
+ break;
+ }
+ }
+
+ if (strchr(last_arobas, ' ') != NULL ||
+ strchr(last_arobas, ';') != NULL)
+ return 0;
+
+ // all correct
+ return 1;
+}
+
+//----------------------------------------------------------------------
+// Force disconnection of an online player (with account value) by [Yor]
+//----------------------------------------------------------------------
+int disconnect_player(int account_id) {
+ int i;
+ struct char_session_data *sd;
+
+ // disconnect player if online on char-server
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
+ if (sd->account_id == account_id) {
+ session[i]->eof = 1;
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+// ƒLƒƒƒ‰íœ‚É”º‚¤ƒf[ƒ^íœ
+static int char_delete(struct mmo_charstatus *cs) {
+ int j;
+
+ // ƒyƒbƒgíœ
+ if (cs->pet_id)
+ inter_pet_delete(cs->pet_id);
+ if (cs->hom_id)
+ inter_homun_delete(cs->hom_id);
+ for (j = 0; j < MAX_INVENTORY; j++)
+ if (cs->inventory[j].card[0] == (short)0xff00)
+ inter_pet_delete(MakeDWord(cs->inventory[j].card[1],cs->inventory[j].card[2]));
+ for (j = 0; j < MAX_CART; j++)
+ if (cs->cart[j].card[0] == (short)0xff00)
+ inter_pet_delete( MakeDWord(cs->cart[j].card[1],cs->cart[j].card[2]) );
+ // ƒMƒ‹ƒh’E‘Þ
+ if (cs->guild_id)
+ inter_guild_leave(cs->guild_id, cs->account_id, cs->char_id);
+ // ƒp[ƒeƒB[’E‘Þ
+ if (cs->party_id)
+ inter_party_leave(cs->party_id, cs->account_id, cs->char_id);
+ // —£¥
+ if (cs->partner_id){
+ // —£¥î•ñ‚ðmap‚É’Ê’m
+ unsigned char buf[10];
+ WBUFW(buf,0) = 0x2b12;
+ WBUFL(buf,2) = cs->char_id;
+ WBUFL(buf,6) = cs->partner_id;
+ mapif_sendall(buf,10);
+ // —£¥
+ char_divorce(cs);
+ }
+#ifdef ENABLE_SC_SAVING
+ status_delete_scdata(cs->account_id, cs->char_id);
+#endif
+ return 0;
+}
+
+int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
+
+int parse_tologin(int fd) {
+ int i;
+ struct char_session_data *sd;
+ RFIFOHEAD(fd);
+
+ // only login-server can have an access to here.
+ // so, if it isn't the login-server, we disconnect the session (fd != login_fd).
+ if (fd != login_fd)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (fd == login_fd) {
+ ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
+ login_fd = -1;
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+// printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+
+ switch(RFIFOW(fd,0)) {
+ case 0x2711:
+ if (RFIFOREST(fd) < 3)
+ return 0;
+ if (RFIFOB(fd,2)) {
+// printf("connect login server error : %d\n", RFIFOB(fd,2));
+ ShowError("Can not connect to the login-server.\n");
+ ShowError("The server communication passwords (default s1/p1) are probably invalid.\n");
+ ShowInfo("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n");
+ ShowInfo("The communication passwords can be changed in map_athena.conf and char_athena.conf\n");
+ exit(1);
+ } else {
+ ShowStatus("Connected to login-server (connection #%d).\n", fd);
+
+ //Send to login accounts currently connected.
+ send_accounts_tologin(-1, gettick(), 0, 0);
+
+ // if no map-server already connected, display a message...
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0 && server[i].map[0]) // if map-server online and at least 1 map
+ break;
+ if (i == MAX_MAP_SERVERS)
+ ShowStatus("Awaiting maps from map-server.\n");
+ }
+ RFIFOSKIP(fd,3);
+ break;
+
+ case 0x2713:
+ if (RFIFOREST(fd) < 51)
+ return 0;
+// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6));
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
+ if (RFIFOB(fd,6) != 0) {
+ WFIFOHEAD(i, 3);
+ WFIFOW(i,0) = 0x6c;
+ WFIFOB(i,2) = 0x42;
+ WFIFOSET(i,3);
+ } else if (max_connect_user == 0 || count_users() < max_connect_user) {
+// if (max_connect_user == 0)
+// printf("max_connect_user (unlimited) -> accepted.\n");
+// else
+// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
+ memcpy(sd->email, RFIFOP(fd, 7), 40);
+ if (e_mail_check(sd->email) == 0)
+ strncpy(sd->email, "a@a.com", 40); // default e-mail
+ sd->connect_until_time = (time_t)RFIFOL(fd,47);
+ // send characters to player
+ mmo_char_send006b(i, sd);
+ } else if(isGM(sd->account_id) >= gm_allow_level) {
+ sd->connect_until_time = (time_t)RFIFOL(fd,47);
+ // send characters to player
+ mmo_char_send006b(i, sd);
+ } else {
+ // refuse connection: too much online players
+// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
+ WFIFOHEAD(i, 3);
+ WFIFOW(i,0) = 0x6c;
+ WFIFOW(i,2) = 0;
+ WFIFOSET(i,3);
+ }
+ break;
+ }
+ }
+ RFIFOSKIP(fd,51);
+ break;
+
+ // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor]
+ case 0x2717:
+ if (RFIFOREST(fd) < 50)
+ return 0;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
+ if (sd->account_id == RFIFOL(fd,2)) {
+ memcpy(sd->email, RFIFOP(fd,6), 40);
+ if (e_mail_check(sd->email) == 0)
+ strncpy(sd->email, "a@a.com", 40); // default e-mail
+ sd->connect_until_time = (time_t)RFIFOL(fd,46);
+ break;
+ }
+ }
+ }
+ RFIFOSKIP(fd,50);
+ break;
+
+ // login-server alive packet
+ case 0x2718:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ RFIFOSKIP(fd,2);
+ break;
+
+ // Receiving authentification from Freya-type login server (to avoid char->login->char)
+ case 0x2719:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ // to conserv a maximum of authentification, search if account is already authentified and replace it
+ // that will reduce multiple connection too
+ for(i = 0; i < AUTH_FIFO_SIZE; i++)
+ if (auth_fifo[i].account_id == RFIFOL(fd,2))
+ break;
+ // if not found, use next value
+ if (i == AUTH_FIFO_SIZE) {
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ i = auth_fifo_pos;
+ auth_fifo_pos++;
+ }
+ auth_fifo[i].account_id = RFIFOL(fd,2);
+ auth_fifo[i].char_id = 0;
+ auth_fifo[i].login_id1 = RFIFOL(fd,6);
+ auth_fifo[i].login_id2 = RFIFOL(fd,10);
+ auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
+ auth_fifo[i].char_pos = 0;
+ auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[i].ip = RFIFOL(fd,14);
+ RFIFOSKIP(fd,18);
+ break;
+
+ case 0x2721: // gm reply
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ unsigned char buf[10];
+ WBUFW(buf,0) = 0x2b0b;
+ WBUFL(buf,2) = RFIFOL(fd,2); // account
+ WBUFL(buf,6) = RFIFOL(fd,6); // GM level
+ mapif_sendall(buf,10);
+// printf("parse_tologin: To become GM answer: char -> map.\n");
+ }
+ RFIFOSKIP(fd,10);
+ break;
+
+ case 0x2723: // changesex reply (modified by [Yor])
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ int acc, sex, i, j;
+ unsigned char buf[7];
+ acc = RFIFOL(fd,2);
+ sex = RFIFOB(fd,6);
+ RFIFOSKIP(fd, 7);
+ if (acc > 0) {
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == acc)
+ auth_fifo[i].sex = sex;
+ }
+ for (i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == acc) {
+ int jobclass = char_dat[i].status.class_;
+ char_dat[i].status.sex = sex;
+ if (jobclass == JOB_BARD || jobclass == JOB_DANCER ||
+ jobclass == JOB_CLOWN || jobclass == JOB_GYPSY ||
+ jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
+ // job modification
+ if (jobclass == JOB_BARD || jobclass == JOB_DANCER) {
+ char_dat[i].status.class_ = (sex) ? JOB_BARD : JOB_DANCER;
+ } else if (jobclass == JOB_CLOWN || jobclass == JOB_GYPSY) {
+ char_dat[i].status.class_ = (sex) ? JOB_CLOWN : JOB_GYPSY;
+ } else if (jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
+ char_dat[i].status.class_ = (sex) ? JOB_BABY_BARD : JOB_BABY_DANCER;
+ }
+ // remove specifical skills of classes 19, 4020 and 4042
+ for(j = 315; j <= 322; j++) {
+ if (char_dat[i].status.skill[j].id > 0 && !char_dat[i].status.skill[j].flag) {
+ if (char_dat[i].status.skill_point > USHRT_MAX - char_dat[i].status.skill[j].lv)
+ char_dat[i].status.skill_point = USHRT_MAX;
+ else
+ char_dat[i].status.skill_point += char_dat[i].status.skill[j].lv;
+ char_dat[i].status.skill[j].id = 0;
+ char_dat[i].status.skill[j].lv = 0;
+ }
+ }
+ // remove specifical skills of classes 20, 4021 and 4043
+ for(j = 323; j <= 330; j++) {
+ if (char_dat[i].status.skill[j].id > 0 && !char_dat[i].status.skill[j].flag) {
+ if (char_dat[i].status.skill_point > USHRT_MAX - char_dat[i].status.skill[j].lv)
+ char_dat[i].status.skill_point = USHRT_MAX;
+ else
+ char_dat[i].status.skill_point += char_dat[i].status.skill[j].lv;
+
+ char_dat[i].status.skill[j].id = 0;
+ char_dat[i].status.skill[j].lv = 0;
+ }
+ }
+ }
+ // to avoid any problem with equipment and invalid sex, equipment is unequiped.
+ for (j = 0; j < MAX_INVENTORY; j++) {
+ if (char_dat[i].status.inventory[j].nameid && char_dat[i].status.inventory[j].equip)
+ char_dat[i].status.inventory[j].equip = 0;
+ }
+ char_dat[i].status.weapon = 0;
+ char_dat[i].status.shield = 0;
+ char_dat[i].status.head_top = 0;
+ char_dat[i].status.head_mid = 0;
+ char_dat[i].status.head_bottom = 0;
+
+ if (char_dat[i].status.guild_id) //If there is a guild, update the guild_member data [Skotlex]
+ inter_guild_sex_changed(char_dat[i].status.guild_id, acc, char_dat[i].status.char_id, sex);
+ }
+ }
+ // disconnect player if online on char-server
+ disconnect_player(acc);
+ }
+ WBUFW(buf,0) = 0x2b0d;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+ mapif_sendall(buf, 7);
+ }
+ break;
+
+ case 0x2726: // Request to send a broadcast message (no answer)
+ if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
+ return 0;
+ if (RFIFOL(fd,4) < 1)
+ char_log("Receiving a message for broadcast, but message is void." RETCODE);
+ else {
+ // at least 1 map-server
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ break;
+ if (i == MAX_MAP_SERVERS)
+ char_log("'ladmin': Receiving a message for broadcast, but no map-server is online." RETCODE);
+ else {
+ unsigned char buf[128];
+ char message[4096]; // +1 to add a null terminated if not exist in the packet
+ int lp;
+ char *p;
+ memset(message, '\0', sizeof(message));
+ memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
+ message[sizeof(message)-1] = '\0';
+ remove_control_chars((unsigned char *)message);
+ // remove all first spaces
+ p = message;
+ while(p[0] == ' ')
+ p++;
+ // if message is only composed of spaces
+ if (p[0] == '\0')
+ char_log("Receiving a message for broadcast, but message is only a lot of spaces." RETCODE);
+ // else send message to all map-servers
+ else {
+ if (RFIFOW(fd,2) == 0) {
+ char_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s)" RETCODE,
+ message);
+ lp = 4;
+ } else {
+ char_log("'ladmin': Receiving a message for broadcast (message (in blue): %s)" RETCODE,
+ message);
+ lp = 8;
+ }
+ // split message to max 80 char
+ while(p[0] != '\0') { // if not finish
+ if (p[0] == ' ') // jump if first char is a space
+ p++;
+ else {
+ char split[80];
+ char* last_space;
+ sscanf(p, "%79[^\t]", split); // max 79 char, any char (\t is control char and control char was removed before)
+ split[sizeof(split)-1] = '\0'; // last char always \0
+ if ((last_space = strrchr(split, ' ')) != NULL) { // searching space from end of the string
+ last_space[0] = '\0'; // replace it by NULL to have correct length of split
+ p++; // to jump the new NULL
+ }
+ p += strlen(split);
+ // send broadcast to all map-servers
+ WBUFW(buf,0) = 0x3800;
+ WBUFW(buf,2) = lp + strlen(split) + 1;
+ WBUFL(buf,4) = 0x65756c62; // only write if in blue (lp = 8)
+ memcpy(WBUFP(buf,lp), split, strlen(split) + 1);
+ mapif_sendall(buf, WBUFW(buf,2));
+ }
+ }
+ }
+ }
+ }
+ RFIFOSKIP(fd,8 + RFIFOL(fd,4));
+ break;
+
+ // account_reg2•ÏX’Ê’m
+ case 0x2729:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ { //Receive account_reg2 registry, forward to map servers.
+ unsigned char buf[ACCOUNT_REG2_NUM*(256+32+2)+16];
+ memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
+// WBUFW(buf,0) = 0x2b11;
+ WBUFW(buf,0) = 0x3804; //Map server can now receive all kinds of reg values with the same packet. [Skotlex]
+ mapif_sendall(buf, WBUFW(buf,2));
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ }
+ break;
+
+ // Account deletion notification (from login-server)
+ case 0x2730:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ // Deletion of all characters of the account
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == RFIFOL(fd,2)) {
+ char_delete(&char_dat[i].status);
+ if (i < char_num - 1) {
+ memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct character_data));
+ // if moved character owns to deleted account, check again it's character
+ if (char_dat[i].status.account_id == RFIFOL(fd,2)) {
+ i--;
+ // Correct moved character reference in the character's owner by [Yor]
+ } else {
+ int j, k;
+ struct char_session_data *sd2;
+ for (j = 0; j < fd_max; j++) {
+ if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
+ sd2->account_id == char_dat[char_num-1].status.account_id) {
+ for (k = 0; k < 9; k++) {
+ if (sd2->found_char[k] == char_num-1) {
+ sd2->found_char[k] = i;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ char_num--;
+ }
+ }
+ // Deletion of the storage
+ inter_storage_delete(RFIFOL(fd,2));
+ // send to all map-servers to disconnect the player
+ {
+ unsigned char buf[6];
+ WBUFW(buf,0) = 0x2b13;
+ WBUFL(buf,2) = RFIFOL(fd,2);
+ mapif_sendall(buf, 6);
+ }
+ // disconnect player if online on char-server
+ disconnect_player(RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+ break;
+
+ // State change of account/ban notification (from login-server) by [Yor]
+ case 0x2731:
+ if (RFIFOREST(fd) < 11)
+ return 0;
+ // send to all map-servers to disconnect the player
+ {
+ unsigned char buf[11];
+ WBUFW(buf,0) = 0x2b14;
+ WBUFL(buf,2) = RFIFOL(fd,2);
+ WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
+ WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
+ mapif_sendall(buf, 11);
+ }
+ // disconnect player if online on char-server
+ disconnect_player(RFIFOL(fd,2));
+ RFIFOSKIP(fd,11);
+ break;
+
+ // Receiving GM acounts info from login-server (by [Yor])
+ case 0x2732:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ unsigned char buf[32000];
+ if (gm_account != NULL)
+ aFree(gm_account);
+ gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
+ GM_num = 0;
+ for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
+ gm_account[GM_num].account_id = RFIFOL(fd,i);
+ gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
+ //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
+ GM_num++;
+ }
+ ShowStatus("From login-server: receiving information of %d GM accounts.\n", GM_num);
+ char_log("From login-server: receiving information of %d GM accounts." RETCODE, GM_num);
+ create_online_files(); // update online players files (perhaps some online players change of GM level)
+ // send new gm acccounts level to map-servers
+ memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf,0) = 0x2b15;
+ mapif_sendall(buf, RFIFOW(fd,2));
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // Receive GM accounts [Freya login server packet by Yor]
+ case 0x2733:
+ // add test here to remember that the login-server is Freya-type
+ // sprintf (login_server_type, "Freya");
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ unsigned char buf[32000];
+ int new_level = 0;
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == RFIFOL(fd,2)) {
+ if (gm_account[i].level != (int)RFIFOB(fd,6)) {
+ gm_account[i].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ }
+ break;
+ }
+ // if not found, add it
+ if (i == GM_num) {
+ // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
+ // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
+ if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
+ if (GM_num == 0) {
+ gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
+ } else {
+ gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
+ }
+ gm_account[GM_num].account_id = RFIFOL(fd,2);
+ gm_account[GM_num].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ GM_num++;
+ if (GM_num >= 4000) {
+ ShowWarning("4000 GM accounts found. Next GM accounts are not readed.\n");
+ char_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
+ }
+ }
+ }
+ if (new_level == 1) {
+ int len;
+ ShowStatus("From login-server: receiving GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ char_log("From login-server: receiving a GM account information (%d: level %d)." RETCODE, RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
+ // send gm acccounts level to map-servers
+ len = 4;
+ WBUFW(buf,0) = 0x2b15;
+
+ for(i = 0; i < GM_num; i++) {
+ WBUFL(buf, len) = gm_account[i].account_id;
+ WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WBUFW(buf, 2) = len;
+ mapif_sendall(buf, len);
+ }
+ }
+ RFIFOSKIP(fd,7);
+ break;
+
+ //Login server request to kick a character out. [Skotlex]
+ case 0x2734:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ struct online_char_data* character;
+ int aid = RFIFOL(fd,2);
+ if ((character = idb_get(online_char_db, aid)) != NULL)
+ { //Kick out this player.
+ if (character->server > -1)
+ { //Kick it from the map server it is on.
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ if (!character->waiting_disconnect)
+ add_timer(gettick()+15000, chardb_waiting_disconnect, character->account_id, 0);
+ character->waiting_disconnect = 1;
+ } else { //Manual kick from char server.
+ struct char_session_data *tsd;
+ int i;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == aid)
+ {
+ WFIFOHEAD(i, 3);
+ WFIFOW(i,0) = 0x81;
+ WFIFOB(i,2) = 2;
+ WFIFOSET(i,3);
+ break;
+ }
+ }
+ if (i == fd_max) //Shouldn't happen, but just in case.
+ set_char_offline(99, aid);
+ }
+ }
+ RFIFOSKIP(fd,6);
+ }
+ break;
+ case 0x2735:
+ {
+ unsigned char buf[2];
+ in_addr_t new_ip = 0;
+ RFIFOSKIP(fd,2);
+
+ WBUFW(buf,0) = 0x2b1e;
+ mapif_sendall(buf, 2);
+
+ new_ip = resolve_hostbyname(login_ip_str, NULL, NULL);
+ if (new_ip && new_ip != login_ip)
+ login_ip = new_ip; //Update login up.
+
+ new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
+ if (new_ip && new_ip != char_ip)
+ { //Update ip.
+ WFIFOHEAD(fd,6);
+ char_ip = new_ip;
+ ShowInfo("Updating IP for [%s].\n",char_ip_str);
+ WFIFOW(fd,0) = 0x2736;
+ WFIFOL(fd,2) = char_ip;
+ WFIFOSET(fd,6);
+ }
+ break;
+ }
+ default:
+ ShowWarning("Unknown packet 0x%04x received from login-server, disconnecting.\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ RFIFOFLUSH(fd);
+
+ return 0;
+}
+
+int request_accreg2(int account_id, int char_id) {
+ if (login_fd > 0) {
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd, 0) = 0x272e;
+ WFIFOL(login_fd, 2) = account_id;
+ WFIFOL(login_fd, 6) = char_id;
+ WFIFOSET(login_fd, 10);
+ return 1;
+ }
+ return 0;
+}
+
+//Send packet forward to login-server for account saving
+int save_accreg2(unsigned char* buf, int len) {
+ if (login_fd > 0) {
+ WFIFOHEAD(login_fd, len+4);
+ memcpy(WFIFOP(login_fd,4), buf, len);
+ WFIFOW(login_fd,0) = 0x2728;
+ WFIFOW(login_fd,2) = len+4;
+ WFIFOSET(login_fd,len+4);
+ return 1;
+ }
+ return 0;
+}
+
+//Receive Registry information for a character.
+int char_parse_Registry(int account_id, int char_id, unsigned char *buf, int buf_len) {
+ int i,j,p,len;
+ for (i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == account_id && char_dat[i].status.char_id == char_id)
+ break;
+ }
+ if(i >= char_num) //Character not found?
+ return 1;
+ for(j=0,p=0;j<GLOBAL_REG_NUM && p<buf_len;j++){
+ sscanf(WBUFP(buf,p), "%31c%n",char_dat[i].global[j].str,&len);
+ char_dat[i].global[j].str[len]='\0';
+ p +=len+1; //+1 to skip the '\0' between strings.
+ sscanf(WBUFP(buf,p), "%255c%n",char_dat[i].global[j].value,&len);
+ char_dat[i].global[j].value[len]='\0';
+ p +=len+1;
+ }
+ char_dat[i].global_num = j;
+ return 0;
+}
+
+//Reply to map server with acc reg values.
+int char_account_reg_reply(int fd,int account_id,int char_id) {
+ int i,j,p;
+ WFIFOHEAD(fd, GLOBAL_REG_NUM*288 + 13);
+ WFIFOW(fd,0)=0x3804;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=char_id;
+ WFIFOB(fd,12)=3; //Type 3: char acc reg.
+ for (i = 0;i < char_num; i++) {
+ if (char_dat[i].status.account_id == account_id && char_dat[i].status.char_id == char_id)
+ break;
+ }
+ if(i >= char_num){ //Character not found? Sent empty packet.
+ WFIFOW(fd,2)=13;
+ }else{
+ for (p=13,j = 0; j < char_dat[i].global_num; j++) {
+ if (char_dat[i].global[j].str[0]) {
+ p+= sprintf(WFIFOP(fd,p), "%s", char_dat[i].global[j].str)+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(fd,p), "%s", char_dat[i].global[j].value)+1;
+ }
+ }
+ WFIFOW(fd,2)=p;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+void char_read_fame_list(void)
+{
+ int i, j, k;
+ struct fame_list fame_item;
+ CREATE_BUFFER(id, int, char_num);
+
+ for(i = 0; i < char_num; i++) {
+ id[i] = i;
+ for(j = 0; j < i; j++) {
+ if (char_dat[i].status.fame > char_dat[id[j]].status.fame) {
+ for(k = i; k > j; k--)
+ id[k] = id[k-1];
+ id[j] = i; // id[i]
+ break;
+ }
+ }
+ }
+
+ // Empty ranking lists
+ memset(smith_fame_list, 0, sizeof(smith_fame_list));
+ memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
+ memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
+ // Build Blacksmith ranking list
+ for (i = 0, j = 0; i < char_num && j < fame_list_size_smith; i++) {
+ if (char_dat[id[i]].status.fame && (
+ char_dat[id[i]].status.class_ == JOB_BLACKSMITH ||
+ char_dat[id[i]].status.class_ == JOB_WHITESMITH ||
+ char_dat[id[i]].status.class_ == JOB_BABY_BLACKSMITH))
+ {
+ fame_item.id = char_dat[id[i]].status.char_id;
+ fame_item.fame = char_dat[id[i]].status.fame;
+ strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
+
+ memcpy(&smith_fame_list[j],&fame_item,sizeof(struct fame_list));
+ j++;
+ }
+ }
+ // Build Alchemist ranking list
+ for (i = 0, j = 0; i < char_num && j < fame_list_size_chemist; i++) {
+ if (char_dat[id[i]].status.fame && (
+ char_dat[id[i]].status.class_ == JOB_ALCHEMIST ||
+ char_dat[id[i]].status.class_ == JOB_CREATOR ||
+ char_dat[id[i]].status.class_ == JOB_BABY_ALCHEMIST))
+ {
+ fame_item.id = char_dat[id[i]].status.char_id;
+ fame_item.fame = char_dat[id[i]].status.fame;
+ strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
+
+ memcpy(&chemist_fame_list[j],&fame_item,sizeof(struct fame_list));
+
+ j++;
+ }
+ }
+ // Build Taekwon ranking list
+ for (i = 0, j = 0; i < char_num && j < fame_list_size_taekwon; i++) {
+ if (char_dat[id[i]].status.fame &&
+ char_dat[id[i]].status.class_ == JOB_TAEKWON)
+ {
+ fame_item.id = char_dat[id[i]].status.char_id;
+ fame_item.fame = char_dat[id[i]].status.fame;
+ strncpy(fame_item.name, char_dat[id[i]].status.name, NAME_LENGTH);
+
+ memcpy(&taekwon_fame_list[j],&fame_item,sizeof(struct fame_list));
+
+ j++;
+ }
+ }
+ DELETE_BUFFER(id);
+}
+// Send map-servers the fame ranking lists
+int char_send_fame_list(int fd) {
+ int i, len = 8;
+ unsigned char buf[32000];
+
+ WBUFW(buf,0) = 0x2b1b;
+
+ for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add blacksmith's block length
+ WBUFW(buf, 6) = len;
+
+ for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add alchemist's block length
+ WBUFW(buf, 4) = len;
+
+ for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add total packet length
+ WBUFW(buf, 2) = len;
+
+ if(fd!=-1)
+ mapif_send(fd, buf, len);
+ else
+ mapif_sendall(buf, len);
+
+ return 0;
+}
+
+int search_mapserver(unsigned short map, long ip, short port);
+
+int parse_frommap(int fd) {
+ int i, j;
+ int id;
+ RFIFOHEAD(fd);
+
+ for(id = 0; id < MAX_MAP_SERVERS; id++)
+ if (server_fd[id] == fd)
+ break;
+ if(id==MAX_MAP_SERVERS)
+ session[fd]->eof=1;
+ if(session[fd]->eof){
+ if (id < MAX_MAP_SERVERS) {
+ unsigned char buf[16384];
+ ShowStatus("Map-server %d has disconnected.\n", id);
+ //Notify other map servers that this one is gone. [Skotlex]
+ WBUFW(buf,0) = 0x2b20;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ j = 0;
+ for(i = 0; i < MAX_MAP_PER_SERVER; i++)
+ if (server[id].map[i])
+ WBUFW(buf,10+(j++)*4) = server[id].map[i];
+ if (j > 0) {
+ WBUFW(buf,2) = j * 4 + 10;
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+ }
+ server_fd[id] = -1;
+ online_char_db->foreach(online_char_db,char_db_setoffline,i); //Tag relevant chars as 'in disconnected' server.
+ }
+ do_close(fd);
+ create_online_files();
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+ //ShowDebug("Received packet 0x%4x (%d bytes) from map-server (connection %d)\n", RFIFOW(fd, 0), RFIFOREST(fd), fd);
+
+ switch(RFIFOW(fd,0)) {
+
+ // map-server alive packet
+ case 0x2718:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ RFIFOSKIP(fd,2);
+ break;
+
+ // request from map-server to reload GM accounts. Transmission to login-server (by Yor)
+ case 0x2af7:
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 2);
+ WFIFOW(login_fd,0) = 0x2709;
+ WFIFOSET(login_fd, 2);
+ }
+ RFIFOSKIP(fd,2);
+ break;
+
+ // Receiving map names list from the map-server
+ case 0x2afa:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ memset(server[id].map, 0, sizeof(server[id].map));
+ j = 0;
+ for(i = 4; i < RFIFOW(fd,2); i += 4) {
+ server[id].map[j] = RFIFOW(fd,i);
+ j++;
+ }
+ {
+ unsigned char *p = (unsigned char *)&server[id].ip;
+ ShowStatus("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
+ id, j, p[0], p[1], p[2], p[3], server[id].port);
+ ShowStatus("Map-server %d loading complete.\n", id);
+ char_log("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d. Map-server %d loading complete." RETCODE,
+ id, j, p[0], p[1], p[2], p[3], server[id].port, id);
+
+ if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
+ mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
+ }
+ WFIFOHEAD(fd, 3 + NAME_LENGTH);
+ WFIFOW(fd,0) = 0x2afb;
+ WFIFOB(fd,2) = 0;
+ memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH); // name for wisp to player
+ WFIFOSET(fd,3+NAME_LENGTH);
+ //WFIFOSET(fd,27);
+ char_send_fame_list(fd); //Send fame list.
+ {
+ unsigned char buf[16384];
+ int x;
+ if (j == 0) {
+ ShowWarning("Map-Server %d have NO map.\n", id);
+ char_log("WARNING: Map-Server %d have NO map." RETCODE, id);
+ // Transmitting maps information to the other map-servers
+ } else {
+ WBUFW(buf,0) = 0x2b04;
+ WBUFW(buf,2) = j * 4 + 10;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 4);
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+ }
+ // Transmitting the maps of the other map-servers to the new map-server
+ for(x = 0; x < MAX_MAP_SERVERS; x++) {
+ if (server_fd[x] >= 0 && x != id) {
+ WFIFOW(fd,0) = 0x2b04;
+ WFIFOL(fd,4) = server[x].ip;
+ WFIFOW(fd,8) = server[x].port;
+ j = 0;
+ for(i = 0; i < MAX_MAP_PER_SERVER; i++)
+ if (server[x].map[i])
+ WFIFOW(fd,10+(j++)*4) = server[x].map[i];
+ if (j > 0) {
+ WFIFOW(fd,2) = j * 4 + 10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ }
+ }
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ //Packet command is now used for sc_data request. [Skotlex]
+ case 0x2afc:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+#ifdef ENABLE_SC_SAVING
+ int aid, cid;
+ struct scdata *data;
+ aid = RFIFOL(fd,2);
+ cid = RFIFOL(fd,6);
+#endif
+ RFIFOSKIP(fd, 10);
+#ifdef ENABLE_SC_SAVING
+ data = status_search_scdata(aid, cid);
+ if (data->count > 0)
+ { //Deliver status change data.
+ WFIFOW(fd,0) = 0x2b1d;
+ WFIFOW(fd,2) = 14 + data->count*sizeof(struct status_change_data);
+ WFIFOL(fd,4) = aid;
+ WFIFOL(fd,8) = cid;
+ WFIFOW(fd,12) = data->count;
+ for (i = 0; i < data->count; i++)
+ memcpy(WFIFOP(fd,14+i*sizeof(struct status_change_data)), &data->data[i], sizeof(struct status_change_data));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ status_delete_scdata(aid, cid); //Data sent, so it needs be discarded now.
+ }
+#endif
+ break;
+ }
+
+ //set MAP user count
+ case 0x2afe:
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ if (RFIFOW(fd,2) != server[id].users) {
+ server[id].users = RFIFOW(fd,2);
+ ShowInfo("User Count: %d (Server: %d)\n", server[id].users, id);
+ }
+ RFIFOSKIP(fd, 4);
+ break;
+ //set MAP users
+ case 0x2aff:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ //TODO: When data mismatches memory, update guild/party online/offline states.
+ server[id].users = RFIFOW(fd,4);
+ // add online players in the list by [Yor], adapted to use dbs by [Skotlex]
+ j = 0;
+ online_char_db->foreach(online_char_db,char_db_setoffline,id); //Set all chars from this server as 'unknown'
+ for(i = 0; i < server[id].users; i++) {
+ int aid, cid;
+ struct online_char_data* character;
+ aid = RFIFOL(fd,6+i*8);
+ cid = RFIFOL(fd,6+i*8+4);
+ character = idb_ensure(online_char_db, aid, create_online_char_data);
+ if (online_check && character->server > -1 && character->server != id)
+ {
+ ShowNotice("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n",
+ character->account_id, character->char_id, character->server, id, aid, cid);
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ }
+ character->char_id = cid;
+ character->server = id;
+ }
+ if (update_online < time(NULL)) { // Time is done
+ update_online = time(NULL) + 8;
+ create_online_files(); // only every 8 sec. (normally, 1 server send users every 5 sec.) Don't update every time, because that takes time, but only every 2 connection.
+ // it set to 8 sec because is more than 5 (sec) and if we have more than 1 map-server, informations can be received in shifted.
+ }
+ //If any chars remain in -2, they will be cleaned in the cleanup timer.
+ RFIFOSKIP(fd,6+i*8);
+ break;
+
+ // ƒLƒƒƒ‰ƒf[ƒ^•Û‘¶
+ // Recieve character data from map-server
+ case 0x2b01:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == RFIFOL(fd,4) &&
+ char_dat[i].status.char_id == RFIFOL(fd,8))
+ break;
+ }
+ if (i != char_num)
+ memcpy(&char_dat[i].status, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
+ if (RFIFOB(fd,12))
+ { //Flag, set character offline. [Skotlex]
+ set_char_offline(RFIFOL(fd,8),RFIFOL(fd,4));
+ WFIFOW(fd, 0) = 0x2b21; //Save ack only needed on final save.
+ WFIFOL(fd, 2) = RFIFOL(fd,4);
+ WFIFOL(fd, 6) = RFIFOL(fd,8);
+ WFIFOSET(fd, 10);
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // ƒLƒƒƒ‰ƒZƒŒ—v‹
+ case 0x2b02:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
+ auth_fifo[auth_fifo_pos].char_id = 0;
+ auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6);
+ auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
+ auth_fifo[auth_fifo_pos].delflag = 2;
+ auth_fifo[auth_fifo_pos].char_pos = 0;
+ auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
+ auth_fifo_pos++;
+ WFIFOW(fd,0) = 0x2b03;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ WFIFOB(fd,6) = 0;
+ WFIFOSET(fd,7);
+ RFIFOSKIP(fd,18);
+ break;
+
+ // request "change map server"
+ case 0x2b05:
+ if (RFIFOREST(fd) < 35)
+ return 0;
+ {
+ unsigned short name;
+ int map_id, map_fd = -1;
+ struct online_char_data* data;
+ struct mmo_charstatus* char_data;
+
+ name = RFIFOW(fd,18);
+ map_id = search_mapserver(name, RFIFOL(fd,24), RFIFOW(fd,28)); //Locate mapserver by ip and port.
+ if (map_id >= 0)
+ map_fd = server_fd[map_id];
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.account_id == RFIFOL(fd,2) &&
+ char_dat[i].status.char_id == RFIFOL(fd,14))
+ break;
+ }
+ char_data = i< char_num? &char_dat[i].status:NULL;
+ //Tell the new map server about this player using Kevin's new auth packet. [Skotlex]
+ if (map_fd>=0 && session[map_fd] && char_data)
+ { //Send the map server the auth of this player.
+ //Update the "last map" as this is where the player must be spawned on the new map server.
+ WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
+ char_data->last_point.map = RFIFOW(fd,18);
+ char_data->last_point.x = RFIFOW(fd,20);
+ char_data->last_point.y = RFIFOW(fd,22);
+ char_data->sex = RFIFOB(fd,30); // Buuyo^
+
+ WFIFOW(map_fd,0) = 0x2afd;
+ WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
+ WFIFOL(map_fd,4) = RFIFOL(fd, 2); //Account ID
+ WFIFOL(map_fd,8) = RFIFOL(fd, 6); //Login1
+ WFIFOL(map_fd,16) = RFIFOL(fd,10); //Login2
+ WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
+ memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
+ WFIFOSET(map_fd, WFIFOW(map_fd,2));
+ data = idb_ensure(online_char_db, RFIFOL(fd, 2), create_online_char_data);
+ data->char_id = char_data->char_id;
+ data->server = map_id; //Update server where char is.
+
+ //Reply with an ack.
+ WFIFOW(fd, 0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
+ WFIFOSET(fd, 30);
+ } else { //Reply with nak
+ WFIFOW(fd, 0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
+ WFIFOL(fd, 6) = 0; //Set login1 to 0.
+ WFIFOSET(fd, 30);
+ }
+ RFIFOSKIP(fd, 35);
+ }
+ break;
+
+ // ƒLƒƒƒ‰–¼ŒŸõ
+ case 0x2b08:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].status.char_id == RFIFOL(fd,2))
+ break;
+ }
+ WFIFOW(fd,0) = 0x2b09;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ if (i != char_num)
+ memcpy(WFIFOP(fd,6), char_dat[i].status.name, NAME_LENGTH);
+ else
+ memcpy(WFIFOP(fd,6), unknown_char_name, NAME_LENGTH);
+ WFIFOSET(fd,6+NAME_LENGTH);
+ RFIFOSKIP(fd,6);
+ break;
+
+ // it is a request to become GM
+ case 0x2b0a:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8));
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, RFIFOW(fd,2));
+ WFIFOW(login_fd,0) = 0x2720;
+ memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2);
+ WFIFOSET(login_fd, RFIFOW(fd,2));
+ } else {
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0) = 0x2b0b;
+ WFIFOL(fd,2) = RFIFOL(fd,4);
+ WFIFOL(fd,6) = 0;
+ WFIFOSET(fd, 10);
+ }
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ break;
+
+ // Map server send information to change an email of an account -> login-server
+ case 0x2b0c:
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 86);
+ memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
+ WFIFOW(login_fd,0) = 0x2722;
+ WFIFOSET(login_fd, 86);
+ }
+ RFIFOSKIP(fd, 86);
+ break;
+
+ // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server)
+ case 0x2b0e:
+ if (RFIFOREST(fd) < 44)
+ return 0;
+ {
+ char character_name[NAME_LENGTH];
+ int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
+ memcpy(character_name, RFIFOP(fd,6), NAME_LENGTH-1);
+ character_name[NAME_LENGTH -1] = '\0';
+ // prepare answer
+ WFIFOW(fd,0) = 0x2b0f; // answer
+ WFIFOL(fd,2) = acc; // who want do operation
+ WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex
+ // search character
+ i = search_character_index(character_name);
+ if (i >= 0) {
+ memcpy(WFIFOP(fd,6), search_character_name(i), NAME_LENGTH); // put correct name if found
+ WFIFOW(fd,6+NAME_LENGTH) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ //WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ switch(RFIFOW(fd, 30)) {
+ case 1: // block
+ if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = char_dat[i].status.account_id; // account value
+ WFIFOL(login_fd,6) = 5; // status of the account
+ WFIFOSET(login_fd, 10);
+// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 2: // ban
+ if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,18);
+ WFIFOW(login_fd, 0) = 0x2725;
+ WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
+ WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
+ WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
+ WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
+ WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
+ WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
+ WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
+ WFIFOSET(login_fd,18);
+// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n",
+// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42));
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 3: // unblock
+ if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = char_dat[i].status.account_id; // account value
+ WFIFOL(login_fd,6) = 0; // status of the account
+ WFIFOSET(login_fd, 10);
+// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 4: // unban
+ if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd, 0) = 0x272a;
+ WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
+ WFIFOSET(login_fd, 6);
+// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 5: // changesex
+ if (acc == -1 || isGM(acc) >= isGM(char_dat[i].status.account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd, 0) = 0x2727;
+ WFIFOL(login_fd, 2) = char_dat[i].status.account_id; // account value
+ WFIFOSET(login_fd, 6);
+// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ }
+ } else {
+ // character name not found
+ memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
+ WFIFOW(fd,8+NAME_LENGTH) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ //WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ }
+ // send answer if a player ask, not if the server ask
+ if (acc != -1) {
+ //WFIFOSET(fd, 34);
+ WFIFOSET(fd, 10+NAME_LENGTH);
+ }
+ RFIFOSKIP(fd, 44);
+ break;
+ }
+
+// case 0x2b0f: Not used anymore, available for future use
+
+ // Update and send fame ranking list [DracoRPG]
+ case 0x2b10:
+ if (RFIFOREST(fd) < 12)
+ return 0;
+ {
+ int cid = RFIFOL(fd, 2);
+ int fame = RFIFOL(fd, 6);
+ char type = RFIFOB(fd, 10);
+ char pos = RFIFOB(fd, 11);
+ int size;
+ struct fame_list *list = NULL;
+ RFIFOSKIP(fd,12);
+
+ switch(type) {
+ case 1:
+ size = fame_list_size_smith;
+ list = smith_fame_list;
+ break;
+ case 2:
+ size = fame_list_size_chemist;
+ list = chemist_fame_list;
+ break;
+ case 3:
+ size = fame_list_size_taekwon;
+ list = taekwon_fame_list;
+ break;
+ default:
+ size = 0;
+ break;
+ }
+ if(!size)
+ break;
+ if(pos)
+ {
+ pos--; //Convert from pos to index.
+ if(
+ (pos == 0 || fame < list[pos-1].fame) &&
+ (pos == size-1 || fame > list[pos+1].fame)
+ ) { //No change in order.
+ list[(int)pos].fame = fame;
+ char_send_fame_list(fd);
+ break;
+ }
+ // If the player's already in the list, remove the entry and shift the following ones 1 step up
+ memmove(list+pos, list+pos+1, (size-pos-1) * sizeof(struct fame_list));
+ //Clear out last entry.
+ list[size-1].id = 0;
+ list[size-1].fame = 0;
+ }
+ // Find the position where the player has to be inserted
+ for(i = 0; i < size && fame < list[i].fame; i++);
+ // When found someone with less or as much fame, insert just above
+ if(i >= size) break;//Out of ranking.
+ memmove(list+i+1, list+i, (size-i-1) * sizeof(struct fame_list));
+ list[i].id = cid;
+ list[i].fame = fame;
+ // Look for the player's name
+ for(j = 0; j < char_num && char_dat[j].status.char_id != id; j++);
+ if(j < char_num)
+ strncpy(list[i].name, char_dat[j].status.name, NAME_LENGTH);
+ else //Not found??
+ strncpy(list[i].name, "Unknown", NAME_LENGTH);
+ char_send_fame_list(-1);
+ }
+ break;
+
+ // Recieve rates [Wizputer]
+ case 0x2b16:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
+ return 0;
+ // Txt doesn't need this packet, so just skip it
+ RFIFOSKIP(fd,RFIFOW(fd,8));
+ break;
+
+ // Character disconnected set online 0 [Wizputer]
+ case 0x2b17:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+ break;
+
+ // Reset all chars to offline [Wizputer]
+ case 0x2b18:
+ set_all_offline(id);
+ RFIFOSKIP(fd,2);
+ break;
+
+ // Character set online [Wizputer]
+ case 0x2b19:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+ break;
+
+ // Build and send fame ranking lists [DracoRPG]
+ case 0x2b1a:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ char_read_fame_list();
+ char_send_fame_list(-1);
+ RFIFOSKIP(fd,2);
+ break;
+
+ //Request to save status change data. [Skotlex]
+ case 0x2b1c:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+#ifdef ENABLE_SC_SAVING
+ int count, aid, cid;
+ struct scdata *data;
+ aid = RFIFOL(fd, 4);
+ cid = RFIFOL(fd, 8);
+ count = RFIFOW(fd, 12);
+ data = status_search_scdata(aid, cid);
+ if (data->count != count)
+ {
+ data->count = count;
+ data->data = aRealloc(data->data, count*sizeof(struct status_change_data));
+ }
+ for (i = 0; i < count; i++)
+ memcpy (&data->data[i], RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
+#endif
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ break;
+ }
+ case 0x2736:
+ if (RFIFOREST(fd) < 6) return 0;
+ ShowInfo("Updated IP address of Server #%d to %d.%d.%d.%d.\n",id,
+ (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
+ (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
+ server[id].ip = RFIFOL(fd, 2);
+ RFIFOSKIP(fd,6);
+ break;
+ default:
+ // inter serverˆ—‚É“n‚·
+ {
+ int r = inter_parse_frommap(fd);
+ if (r == 1) // ˆ—‚Å‚«‚½
+ break;
+ if (r == 2) // ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¢
+ return 0;
+ }
+ // inter serverˆ—‚Å‚à‚È‚¢ê‡‚ÍØ’f
+ ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int search_mapserver(unsigned short map, long ip, short port) {
+ int i, j;
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ for (j = 0; server[i].map[j]; j++)
+ if (server[i].map[j] == map) {
+ if (ip > 0 && server[i].ip != ip)
+ continue;
+ if (port > 0 && server[i].port != port)
+ continue;
+ return i;
+ }
+
+ return -1;
+}
+
+// char_mapif‚̉Šú‰»ˆ—iŒ»Ý‚Íinter_mapif‰Šú‰»‚Ì‚Ýj
+static int char_mapif_init(int fd) {
+ return inter_mapif_init(fd);
+}
+
+//--------------------------------------------
+// Test to know if an IP come from LAN or WAN.
+// Rewrote: Adnvanced subnet check [LuzZza]
+//--------------------------------------------
+int lan_subnetcheck(long *p) {
+
+ int i;
+ unsigned char *sbn, *msk, *src = (unsigned char *)p;
+
+ for(i=0; i<subnet_count; i++) {
+
+ if(subnet[i].subnet == (*p & subnet[i].mask)) {
+
+ sbn = (unsigned char *)&subnet[i].subnet;
+ msk = (unsigned char *)&subnet[i].mask;
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
+ src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
+
+ return subnet[i].map_ip;
+ }
+ }
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
+ return 0;
+}
+
+int parse_char(int fd) {
+ int i, ch;
+ unsigned short cmd;
+ char email[40];
+ int map_fd;
+ struct char_session_data *sd;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ long subnet_map_ip;
+
+ RFIFOHEAD(fd);
+
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ if (login_fd < 0)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected.
+ if (fd == login_fd)
+ login_fd = -1;
+ if (sd != NULL)
+ {
+ struct online_char_data* data = idb_get(online_char_db, sd->account_id);
+ if (!data || data->server== -1) //If it is not in any server, send it offline. [Skotlex]
+ set_char_offline(99,sd->account_id);
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+ cmd = RFIFOW(fd,0);
+ // crc32‚̃XƒLƒbƒv—p
+ if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
+ RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
+ RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
+ cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
+ (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
+ RFIFOSKIP(fd,4);
+ cmd = RFIFOW(fd,0);
+ ShowDebug("parse_char : %d crc32 skipped\n",fd);
+ if(RFIFOREST(fd)==0)
+ return 0;
+ }
+
+//For use in packets that depend on an sd being present [Skotlex]
+#define FIFOSD_CHECK(rest) { if(RFIFOREST(fd) < rest) return 0; if (sd==NULL) { RFIFOSKIP(fd,rest); return 0; } }
+
+ switch(cmd){
+ case 0x20b: //20040622ˆÃ†‰»ragexe‘Ήž
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ RFIFOSKIP(fd,19);
+ break;
+
+ case 0x65: // Ú‘±—v‹
+ if (RFIFOREST(fd) < 17)
+ return 0;
+ {
+ int GM_value;
+ WFIFOHEAD(fd, 4);
+ if (sd) {
+ //Received again auth packet for already authentified account?? Discard it.
+ //TODO: Perhaps log this as a hack attempt?
+ RFIFOSKIP(fd,17);
+ break;
+ }
+ if ((GM_value = isGM(RFIFOL(fd,2))))
+ ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
+ else
+ ShowInfo("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
+ sd = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1);
+ session[fd]->session_data = sd;
+ strncpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
+ sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
+ sd->account_id = RFIFOL(fd,2);
+ sd->login_id1 = RFIFOL(fd,6);
+ sd->login_id2 = RFIFOL(fd,10);
+ sd->sex = RFIFOB(fd,16);
+ // send back account_id
+ WFIFOL(fd,0) = RFIFOL(fd,2);
+ WFIFOSET(fd,4);
+ // search authentification
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == sd->account_id &&
+ auth_fifo[i].login_id1 == sd->login_id1 &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
+#endif
+ (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
+ auth_fifo[i].delflag == 2) {
+ auth_fifo[i].delflag = 1;
+
+ if (online_check)
+ { // check if character is not online already. [Skotlex]
+ struct online_char_data* character;
+ character = idb_get(online_char_db, sd->account_id);
+
+ if (character)
+ {
+ if(character->server > -1)
+ { //Kick it from the map server it is on.
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ if (!character->waiting_disconnect)
+ add_timer(gettick()+20000, chardb_waiting_disconnect, character->account_id, 0);
+ character->waiting_disconnect = 1;
+ /* Not a good idea because this would trigger when you do a char-change from the map server! [Skotlex]
+ } else { //Manual kick from char server.
+ struct char_session_data *tsd;
+ int i;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && i!=fd && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == sd->account_id)
+ {
+ WFIFOW(i,0) = 0x81;
+ WFIFOB(i,2) = 2;
+ WFIFOSET(i,3);
+ break;
+ }
+ }
+ if (i == fd_max) //Shouldn't happen, but just in case.
+ set_char_offline(99, sd->account_id);
+ */
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 8;
+ WFIFOSET(fd,3);
+ break;
+ }
+ }
+ }
+
+ if (max_connect_user == 0 || count_users() < max_connect_user) {
+ if (login_fd > 0) { // don't send request if no login-server
+ // request to login-server to obtain e-mail/time limit
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd,0) = 0x2716;
+ WFIFOL(login_fd,2) = sd->account_id;
+ WFIFOSET(login_fd,6);
+ }
+ // send characters to player
+ mmo_char_send006b(fd, sd);
+ } else {
+ // refuse connection (over populated)
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOW(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ break;
+ }
+ }
+ // authentification not found
+ if (i == AUTH_FIFO_SIZE) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,19);
+ WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
+ WFIFOL(login_fd,2) = sd->account_id;
+ WFIFOL(login_fd,6) = sd->login_id1;
+ WFIFOL(login_fd,10) = sd->login_id2; // relate to the versions higher than 18
+ WFIFOB(login_fd,14) = sd->sex;
+ WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
+ WFIFOSET(login_fd,19);
+ } else { // if no login-server, we must refuse connection
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOW(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ }
+ }
+ RFIFOSKIP(fd,17);
+ break;
+
+ case 0x66: // ƒLƒƒƒ‰‘I‘ð
+ FIFOSD_CHECK(3);
+ {
+ int char_num = RFIFOB(fd,2);
+ struct mmo_charstatus *cd;
+ RFIFOSKIP(fd,3);
+
+ // if we activated email creation and email is default email
+ if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
+ WFIFOSET(fd, 3);
+ break;
+ }
+ // otherwise, load the character
+ for (ch = 0; ch < 9; ch++)
+ if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].status.char_num == char_num)
+ break;
+ if (ch == 9)
+ { //Not found?? May be forged packet.
+ break;
+ }
+ cd = &char_dat[sd->found_char[ch]].status;
+ char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
+ sd->account_id, char_num, cd->name);
+
+ cd->sex = sd->sex;
+
+ // searching map server
+ i = search_mapserver(cd->last_point.map,-1,-1);
+ // if map is not found, we check major cities
+ if (i < 0) {
+ unsigned short j;
+ //First check that there's actually a map server online.
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0])
+ break;
+ if (j == MAX_MAP_SERVERS) {
+ ShowInfo("Connection Closed. No map servers available.\n");
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
+ if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
+ cd->last_point.x = 273;
+ cd->last_point.y = 354;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
+ cd->last_point.x = 120;
+ cd->last_point.y = 100;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
+ cd->last_point.x = 160;
+ cd->last_point.y = 94;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
+ cd->last_point.x = 116;
+ cd->last_point.y = 57;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
+ cd->last_point.x = 87;
+ cd->last_point.y = 117;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
+ cd->last_point.x = 94;
+ cd->last_point.y = 103;
+ } else {
+ ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(cd->last_point.map));
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
+ ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(cd->last_point.map), mapindex_id2name(j));
+ cd->last_point.map = j;
+ }
+ { //Send player to map
+ WFIFOHEAD(fd, 28);
+ WFIFOW(fd,0) = 0x71;
+ WFIFOL(fd,2) = cd->char_id;
+ memcpy(WFIFOP(fd,6), mapindex_id2name(cd->last_point.map), MAP_NAME_LENGTH);
+
+ // Advanced subnet check [LuzZza]
+ if((subnet_map_ip = lan_subnetcheck((long *)p)))
+ WFIFOL(fd,22) = subnet_map_ip;
+ else
+ WFIFOL(fd,22) = server[i].ip;
+
+ WFIFOW(fd,26) = server[i].port;
+ WFIFOSET(fd,28);
+
+ ShowInfo("Character selection '%s' (account: %d, slot: %d).\n",
+ cd->name, sd->account_id, ch);
+ }
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ auth_fifo[auth_fifo_pos].account_id = sd->account_id;
+ auth_fifo[auth_fifo_pos].char_id = cd->char_id;
+ auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
+ auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
+ auth_fifo[auth_fifo_pos].delflag = 0;
+ auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch];
+ auth_fifo[auth_fifo_pos].sex = sd->sex;
+ auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
+ auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
+
+ //Send NEW auth packet [Kevin]
+ if ((map_fd = server_fd[i]) < 1 || session[map_fd] == NULL)
+ { //0 Should not be a valid server_fd [Skotlex]
+ WFIFOHEAD(fd, 3);
+ ShowError("parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", map_fd, i);
+ server_fd[i] = -1;
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ //Send server closed.
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
+ { //Send auth to server.
+ WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
+ WFIFOW(map_fd,0) = 0x2afd;
+ WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
+ WFIFOL(map_fd,4) = auth_fifo[auth_fifo_pos].account_id;
+ WFIFOL(map_fd,8) = auth_fifo[auth_fifo_pos].login_id1;
+ WFIFOL(map_fd,16) = auth_fifo[auth_fifo_pos].login_id2;
+ WFIFOL(map_fd,12) = (unsigned long)auth_fifo[auth_fifo_pos].connect_until_time;
+ memcpy(WFIFOP(map_fd,20), cd, sizeof(struct mmo_charstatus));
+ WFIFOSET(map_fd, WFIFOW(map_fd,2));
+ }
+ set_char_online(i, cd->char_id, cd->account_id);
+ //Sets char online in the party and breaks even share if needed.
+ inter_party_logged(cd->party_id, cd->account_id, cd->char_id);
+
+ auth_fifo_pos++;
+ }
+ break;
+
+ case 0x67: // ì¬
+ FIFOSD_CHECK(37);
+
+ if(char_new == 0) //turn character creation on/off [Kevin]
+ i = -2;
+ else
+ i = make_new_char(fd, RFIFOP(fd,2));
+ //added some better fail reporting to client on the txt version [Kevin]
+ if (i < 0)
+ {
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd, 0) = 0x6e;
+ switch (i) {
+ case -1: WFIFOB(fd, 2) = 0x00; break;
+ case -2: WFIFOB(fd, 2) = 0x02; break;
+ case -3: WFIFOB(fd, 2) = 0x01; break;
+ }
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 37);
+ break;
+ }
+ { //Send to player.
+ WFIFOHEAD(fd, 108);
+ WFIFOW(fd,0) = 0x6d;
+ memset(WFIFOP(fd,2), 0, 106);
+
+ WFIFOL(fd,2) = char_dat[i].status.char_id;
+ WFIFOL(fd,2+4) = char_dat[i].status.base_exp>LONG_MAX?LONG_MAX:char_dat[i].status.base_exp;
+ WFIFOL(fd,2+8) = char_dat[i].status.zeny;
+ WFIFOL(fd,2+12) = char_dat[i].status.job_exp>LONG_MAX?LONG_MAX:char_dat[i].status.job_exp;
+ WFIFOL(fd,2+16) = char_dat[i].status.job_level;
+
+ WFIFOL(fd,2+28) = char_dat[i].status.karma;
+ WFIFOL(fd,2+32) = char_dat[i].status.manner;
+
+ WFIFOW(fd,2+40) = 0x30;
+ WFIFOW(fd,2+42) = (char_dat[i].status.hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.hp;
+ WFIFOW(fd,2+44) = (char_dat[i].status.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_hp;
+ WFIFOW(fd,2+46) = (char_dat[i].status.sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.sp;
+ WFIFOW(fd,2+48) = (char_dat[i].status.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_sp;
+ WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].status.speed;
+ WFIFOW(fd,2+52) = char_dat[i].status.class_;
+ WFIFOW(fd,2+54) = char_dat[i].status.hair;
+
+ WFIFOW(fd,2+58) = char_dat[i].status.base_level;
+ WFIFOW(fd,2+60) = (char_dat[i].status.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.skill_point;
+
+ WFIFOW(fd,2+64) = char_dat[i].status.shield;
+ WFIFOW(fd,2+66) = char_dat[i].status.head_top;
+ WFIFOW(fd,2+68) = char_dat[i].status.head_mid;
+ WFIFOW(fd,2+70) = char_dat[i].status.hair_color;
+
+ memcpy(WFIFOP(fd,2+74), char_dat[i].status.name, NAME_LENGTH);
+
+ WFIFOB(fd,2+98) = (char_dat[i].status.str > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.str;
+ WFIFOB(fd,2+99) = (char_dat[i].status.agi > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.agi;
+ WFIFOB(fd,2+100) = (char_dat[i].status.vit > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.vit;
+ WFIFOB(fd,2+101) = (char_dat[i].status.int_ > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.int_;
+ WFIFOB(fd,2+102) = (char_dat[i].status.dex > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.dex;
+ WFIFOB(fd,2+103) = (char_dat[i].status.luk > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.luk;
+ WFIFOB(fd,2+104) = char_dat[i].status.char_num;
+
+ WFIFOSET(fd,108);
+ RFIFOSKIP(fd,37);
+ }
+ for(ch = 0; ch < 9; ch++) {
+ if (sd->found_char[ch] == -1) {
+ sd->found_char[ch] = i;
+ break;
+ }
+ }
+
+ case 0x68: // delete char //Yor's Fix
+ FIFOSD_CHECK(46);
+ {
+ WFIFOHEAD(fd, 46);
+ WFIFOHEAD(login_fd,46);
+ memcpy(email, RFIFOP(fd,6), 40);
+ if (e_mail_check(email) == 0)
+ strncpy(email, "a@a.com", 40); // default e-mail
+
+ // if we activated email creation and email is default email
+ if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
+ // if sended email is incorrect e-mail
+ if (strcmp(email, "a@a.com") == 0) {
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd,46);
+ // we act like we have selected a character
+ } else {
+ // we change the packet to set it like selection.
+ for (i = 0; i < 9; i++)
+ if (char_dat[sd->found_char[i]].status.char_id == RFIFOL(fd,2)) {
+ // we save new e-mail
+ memcpy(sd->email, email, 40);
+ // we send new e-mail to login-server ('online' login-server is checked before)
+ WFIFOW(login_fd,0) = 0x2715;
+ WFIFOL(login_fd,2) = sd->account_id;
+ memcpy(WFIFOP(login_fd, 6), email, 40);
+ WFIFOSET(login_fd,46);
+ // skip part of the packet! (46, but leave the size of select packet: 3)
+ RFIFOSKIP(fd,43);
+ // change value to put new packet (char selection)
+ RFIFOW(fd, 0) = 0x66;
+ RFIFOB(fd, 2) = char_dat[sd->found_char[i]].status.char_num;
+ // not send packet, it's modify of actual packet
+ break;
+ }
+ if (i == 9) {
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd,46);
+ }
+ }
+
+ // otherwise, we delete the character
+ } else {
+ if (strcmpi(email, sd->email) != 0) { // if it's an invalid email
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
+ WFIFOSET(fd, 3);
+ // if mail is correct
+ } else {
+ for (i = 0; i < 9; i++) {
+ struct mmo_charstatus *cs = NULL;
+ if ((cs = &char_dat[sd->found_char[i]].status)->char_id == RFIFOL(fd,2)) {
+ char_delete(cs); // deletion process
+
+ if (sd->found_char[i] != char_num - 1) {
+ memcpy(&char_dat[sd->found_char[i]], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
+ // Correct moved character reference in the character's owner
+ {
+ int j, k;
+ struct char_session_data *sd2;
+ for (j = 0; j < fd_max; j++) {
+ if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
+ sd2->account_id == char_dat[char_num-1].status.account_id) {
+ for (k = 0; k < 9; k++) {
+ if (sd2->found_char[k] == char_num-1) {
+ sd2->found_char[k] = sd->found_char[i];
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ char_num--;
+ for(ch = i; ch < 9-1; ch++)
+ sd->found_char[ch] = sd->found_char[ch+1];
+ sd->found_char[8] = -1;
+ WFIFOW(fd,0) = 0x6f;
+ WFIFOSET(fd,2);
+ break;
+ }
+ }
+
+ if (i == 9) {
+ WFIFOW(fd,0) = 0x70;
+ WFIFOB(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ }
+ RFIFOSKIP(fd,46);
+ }
+ }
+ break;
+
+ case 0x2af8: // ƒ}ƒbƒvƒT[ƒo[ƒƒOƒCƒ“
+ if (RFIFOREST(fd) < 60)
+ return 0;
+ {
+ char *l_user = RFIFOP(fd, 2);
+ char *l_pass = RFIFOP(fd, 26);
+ WFIFOHEAD(fd, 4+5*GM_num);
+ l_user[23] = '\0';
+ l_pass[23] = '\0';
+ WFIFOW(fd,0) = 0x2af9;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] < 0)
+ break;
+ }
+ if (i == MAX_MAP_SERVERS ||
+ strcmp(l_user, userid) ||
+ strcmp(l_pass, passwd)){
+ WFIFOB(fd,2) = 3;
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd,60);
+ } else {
+ int len;
+ WFIFOB(fd,2) = 0;
+ session[fd]->func_parse = parse_frommap;
+ server_fd[i] = fd;
+ server[i].ip = RFIFOL(fd,54);
+ server[i].port = RFIFOW(fd,58);
+ server[i].users = 0;
+ memset(server[i].map, 0, sizeof(server[i].map));
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd,60);
+ realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ char_mapif_init(fd);
+ // send gm acccounts level to map-servers
+ len = 4;
+ WFIFOW(fd,0) = 0x2b15;
+ for(i = 0; i < GM_num; i++) {
+ WFIFOL(fd,len) = gm_account[i].account_id;
+ WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd,len);
+ return 0;
+ }
+ }
+ break;
+
+ case 0x187: // AliveM†H
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ RFIFOSKIP(fd, 6);
+ break;
+
+ case 0x7530: // Athenaî•ñŠ“¾
+ {
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0) = 0x7531;
+ WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
+ WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
+ WFIFOB(fd,4) = ATHENA_REVISION;
+ WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
+ WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd,7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
+ WFIFOW(fd,8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd,10);
+ RFIFOSKIP(fd,2);
+ return 0;
+ }
+ case 0x7532: // Ú‘±‚ÌØ’f(default‚ƈ—‚͈ꂾ‚ª–¾Ž¦“I‚É‚·‚邽‚ß)
+ default:
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ RFIFOFLUSH(fd);
+ return 0;
+}
+
+// Console Command Parser [Wizputer]
+int parse_console(char *buf) {
+ char *type,*command;
+
+ type = (char *)aCalloc(64,1);
+ command = (char *)aCalloc(64,1);
+
+// memset(type,0,64);
+// memset(command,0,64);
+
+ ShowStatus("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ ShowDebug("Type of command: %s || Command: %s \n",type,command);
+
+ if(buf) aFree(buf);
+ if(type) aFree(type);
+ if(command) aFree(command);
+
+ return 0;
+}
+
+// ‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
+int mapif_sendall(unsigned char *buf, unsigned int len) {
+ int i, c;
+
+ c = 0;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ int fd;
+ if ((fd = server_fd[i]) >= 0) {
+#if 0 //This seems to have been fixed long long ago.
+ if (session[fd] == NULL)
+ { //Could this be the crash's source? [Skotlex]
+ ShowError("mapif_sendall: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", fd, i);
+ server_fd[i] = -1;
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ continue;
+ }
+#endif
+ WFIFOHEAD(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+ return c;
+}
+
+// Ž©•ªˆÈŠO‚Ì‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
+int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
+ int i, c;
+
+ c = 0;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ int fd;
+ if ((fd = server_fd[i]) >= 0 && fd != sfd) {
+ WFIFOHEAD(fd, len);
+ if (WFIFOSPACE(fd) < len) //Increase buffer size.
+ realloc_writefifo(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd, len);
+ c++;
+ }
+ }
+ return c;
+}
+// MAPƒT[ƒo[‚Ƀf[ƒ^‘—MimapŽI¶‘¶Šm”F—L‚èj
+int mapif_send(int fd, unsigned char *buf, unsigned int len) {
+ int i;
+
+ if (fd >= 0) {
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (fd == server_fd[i]) {
+ WFIFOHEAD(fd, len);
+ if (WFIFOSPACE(fd) < len) //Increase buffer size.
+ realloc_writefifo(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+int send_users_tologin(int tid, unsigned int tick, int id, int data) {
+ int users = count_users();
+ unsigned char buf[16];
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send number of user to login server
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd,0) = 0x2714;
+ WFIFOL(login_fd,2) = users;
+ WFIFOSET(login_fd,6);
+ }
+ // send number of players to all map-servers
+ WBUFW(buf,0) = 0x2b00;
+ WBUFL(buf,2) = users;
+ mapif_sendall(buf, 6);
+
+ return 0;
+}
+
+static int send_accounts_tologin_sub(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int *i = va_arg(ap, int*);
+ int count = va_arg(ap, int);
+ if ((*i) >= count)
+ return 0; //This is an error that shouldn't happen....
+ if(character->server > -1) {
+ WFIFOHEAD(login_fd, 8+count*4);
+ WFIFOL(login_fd, 8+(*i)*4) =character->account_id;
+ (*i)++;
+ return 1;
+ }
+ return 0;
+}
+
+int send_accounts_tologin(int tid, unsigned int tick, int id, int data) {
+ int users = count_users(), i=0;
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send account list to login server
+ WFIFOHEAD(login_fd, 8+users*4);
+ WFIFOW(login_fd,0) = 0x272d;
+ WFIFOL(login_fd,4) = users;
+ online_char_db->foreach(online_char_db, send_accounts_tologin_sub, &i);
+ WFIFOW(login_fd,2) = 8+ i*4;
+ WFIFOSET(login_fd,WFIFOW(login_fd,2));
+ }
+ return 0;
+}
+
+int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
+ if (login_fd > 0 && session[login_fd] != NULL)
+ return 0;
+
+ ShowInfo("Attempt to connect to login-server...\n");
+ login_fd = make_connection(login_ip, login_port);
+ if (login_fd == -1)
+ { //Try again later... [Skotlex]
+ login_fd = 0;
+ return 0;
+ }
+ session[login_fd]->func_parse = parse_tologin;
+ realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ WFIFOHEAD(login_fd, 86);
+ WFIFOW(login_fd,0) = 0x2710;
+ memcpy(WFIFOP(login_fd,2), userid, 24);
+ memcpy(WFIFOP(login_fd,26), passwd, 24);
+ WFIFOL(login_fd,50) = 0;
+ WFIFOL(login_fd,54) = char_ip;
+ WFIFOL(login_fd,58) = char_port;
+ memcpy(WFIFOP(login_fd,60), server_name, 20);
+ WFIFOW(login_fd,80) = 0;
+ WFIFOW(login_fd,82) = char_maintenance;
+
+ WFIFOW(login_fd,84) = char_new_display; //only display (New) if they want to [Kevin]
+
+ WFIFOSET(login_fd,86);
+ return 1;
+}
+
+//------------------------------------------------
+//Invoked 15 seconds after mapif_disconnectplayer in case the map server doesn't
+//replies/disconnect the player we tried to kick. [Skotlex]
+//------------------------------------------------
+static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data)
+{
+ struct online_char_data* character;
+ if ((character = idb_get(online_char_db, id)) != NULL && character->waiting_disconnect)
+ { //Mark it offline due to timeout.
+ set_char_offline(character->char_id, character->account_id);
+ }
+ return 0;
+}
+
+//----------------------------------------------------------
+// Return numerical value of a switch configuration by [Yor]
+// on/off, english, français, deutsch, español
+//----------------------------------------------------------
+int config_switch(const char *str) {
+ if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
+ return 1;
+ if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
+ return 0;
+
+ return atoi(str);
+}
+
+//----------------------------------
+// Reading Lan Support configuration
+// Rewrote: Anvanced subnet check [LuzZza]
+//----------------------------------
+int char_lan_config_read(const char *lancfgName) {
+
+ FILE *fp;
+ int line_num = 0;
+ char line[1024], w1[64], w2[64], w3[64], w4[64];
+
+ if((fp = fopen(lancfgName, "r")) == NULL) {
+ ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ ShowInfo("Reading the configuration file %s...\n", lancfgName);
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ line_num++;
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
+
+ ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
+ continue;
+ }
+
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+ remove_control_chars((unsigned char *)w3);
+ remove_control_chars((unsigned char *)w4);
+
+ if(strcmpi(w1, "subnet") == 0) {
+
+ subnet[subnet_count].mask = inet_addr(w2);
+ subnet[subnet_count].char_ip = inet_addr(w3);
+ subnet[subnet_count].map_ip = inet_addr(w4);
+ subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
+ if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
+ ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
+ continue;
+ }
+
+ subnet_count++;
+ }
+
+ ShowStatus("Read information about %d subnetworks.\n", subnet_count);
+ }
+
+ fclose(fp);
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+
+int char_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp = fopen(cfgName, "r");
+
+ if (fp == NULL) {
+ ShowFatalError("Configuration file not found: %s.\n", cfgName);
+ exit(1);
+ }
+
+ ShowInfo("Reading configuration file %s...\n", cfgName);
+ while(fgets(line, sizeof(line)-1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+ if(strcmpi(w1,"timestamp_format") == 0) {
+ strncpy(timestamp_format, w2, 20);
+ } else if(strcmpi(w1,"console_silent")==0){
+ msg_silent = 0; //To always allow the next line to show up.
+ ShowInfo("Console Silent Setting: %d\n", atoi(w2));
+ msg_silent = atoi(w2);
+#ifndef TXT_SQL_CONVERT
+ } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
+ stdout_with_ansisequence = config_switch(w2);
+ } else if (strcmpi(w1, "userid") == 0) {
+ strncpy(userid, w2, 24);
+ } else if (strcmpi(w1, "passwd") == 0) {
+ strncpy(passwd, w2, 24);
+ } else if (strcmpi(w1, "server_name") == 0) {
+ strncpy(server_name, w2, 20);
+ server_name[sizeof(server_name) - 1] = '\0';
+ ShowStatus("%s server has been initialized\n", w2);
+ } else if (strcmpi(w1, "wisp_server_name") == 0) {
+ if (strlen(w2) >= 4) {
+ memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
+ wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
+ }
+ } else if (strcmpi(w1, "login_ip") == 0) {
+ char ip_str[16];
+ login_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (login_ip) {
+ strncpy(login_ip_str, w2, sizeof(login_ip_str));
+ ShowStatus("Login server IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "login_port") == 0) {
+ login_port = atoi(w2);
+ } else if (strcmpi(w1, "char_ip") == 0) {
+ char ip_str[16];
+ char_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (char_ip){
+ strncpy(char_ip_str, w2, sizeof(char_ip_str));
+ ShowStatus("Character server IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "bind_ip") == 0) {
+ char ip_str[16];
+ bind_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (bind_ip) {
+ strncpy(bind_ip_str, w2, sizeof(bind_ip_str));
+ ShowStatus("Character server binding IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "char_port") == 0) {
+ char_port = atoi(w2);
+ } else if (strcmpi(w1, "char_maintenance") == 0) {
+ char_maintenance = atoi(w2);
+ } else if (strcmpi(w1, "char_new") == 0) {
+ char_new = atoi(w2);
+ } else if (strcmpi(w1, "char_new_display") == 0) {
+ char_new_display = atoi(w2);
+ } else if (strcmpi(w1, "email_creation") == 0) {
+ email_creation = config_switch(w2);
+ } else if (strcmpi(w1, "scdata_txt") == 0) { //By Skotlex
+ strcpy(scdata_txt, w2);
+#endif
+ } else if (strcmpi(w1, "char_txt") == 0) {
+ strcpy(char_txt, w2);
+ } else if (strcmpi(w1, "backup_txt") == 0) { //By zanetheinsane
+ strcpy(backup_txt, w2);
+ } else if (strcmpi(w1, "friends_txt") == 0) { //By davidsiaw
+ strcpy(friends_txt, w2);
+#ifndef TXT_SQL_CONVERT
+ } else if (strcmpi(w1, "backup_txt_flag") == 0) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor]
+ backup_txt_flag = config_switch(w2);
+ } else if (strcmpi(w1, "max_connect_user") == 0) {
+ max_connect_user = atoi(w2);
+ if (max_connect_user < 0)
+ max_connect_user = 0; // unlimited online players
+ } else if(strcmpi(w1, "gm_allow_level") == 0) {
+ gm_allow_level = atoi(w2);
+ if(gm_allow_level < 0)
+ gm_allow_level = 99;
+ } else if (strcmpi(w1, "check_ip_flag") == 0) {
+ check_ip_flag = config_switch(w2);
+ } else if (strcmpi(w1, "online_check") == 0) {
+ online_check = config_switch(w2);
+ } else if (strcmpi(w1, "autosave_time") == 0) {
+ autosave_interval = atoi(w2)*1000;
+ if (autosave_interval <= 0)
+ autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+ } else if (strcmpi(w1, "save_log") == 0) {
+ save_log = config_switch(w2);
+ } else if (strcmpi(w1, "start_point") == 0) {
+ char map[32];
+ int x, y;
+ if (sscanf(w2, "%[^,],%d,%d", map, &x, &y) < 3)
+ continue;
+ if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
+ start_point.map = mapindex_name2id(map);
+ if (!start_point.map) {
+ ShowError("Specified start_point %s not found in map-index cache.\n", map);
+ start_point.map = 0;
+ }
+ start_point.x = x;
+ start_point.y = y;
+ }
+ } else if(strcmpi(w1,"log_char")==0) { //log char or not [devil]
+ log_char = atoi(w2);
+ } else if (strcmpi(w1, "start_zeny") == 0) {
+ start_zeny = atoi(w2);
+ if (start_zeny < 0)
+ start_zeny = 0;
+ } else if (strcmpi(w1, "start_weapon") == 0) {
+ start_weapon = atoi(w2);
+ if (start_weapon < 0)
+ start_weapon = 0;
+ } else if (strcmpi(w1, "start_armor") == 0) {
+ start_armor = atoi(w2);
+ if (start_armor < 0)
+ start_armor = 0;
+ } else if (strcmpi(w1, "unknown_char_name") == 0) {
+ strcpy(unknown_char_name, w2);
+ unknown_char_name[NAME_LENGTH-1] = '\0';
+ } else if (strcmpi(w1, "char_log_filename") == 0) {
+ strcpy(char_log_filename, w2);
+ } else if (strcmpi(w1, "name_ignoring_case") == 0) {
+ name_ignoring_case = config_switch(w2);
+ } else if (strcmpi(w1, "char_name_option") == 0) {
+ char_name_option = atoi(w2);
+ } else if (strcmpi(w1, "char_name_letters") == 0) {
+ strcpy(char_name_letters, w2);
+// online files options
+ } else if (strcmpi(w1, "online_txt_filename") == 0) {
+ strcpy(online_txt_filename, w2);
+ } else if (strcmpi(w1, "online_html_filename") == 0) {
+ strcpy(online_html_filename, w2);
+ } else if (strcmpi(w1, "online_sorting_option") == 0) {
+ online_sorting_option = atoi(w2);
+ } else if (strcmpi(w1, "online_display_option") == 0) {
+ online_display_option = atoi(w2);
+ } else if (strcmpi(w1, "online_gm_display_min_level") == 0) { // minimum GM level to display 'GM' when we want to display it
+ online_gm_display_min_level = atoi(w2);
+ if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough
+ online_gm_display_min_level = 5;
+ } else if (strcmpi(w1, "online_refresh_html") == 0) {
+ online_refresh_html = atoi(w2);
+ if (online_refresh_html < 1)
+ online_refresh_html = 1;
+ } else if(strcmpi(w1,"db_path")==0) {
+ strcpy(db_path,w2);
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ } else if (strcmpi(w1, "fame_list_alchemist") == 0) {
+ fame_list_size_chemist = atoi(w2);
+ if (fame_list_size_chemist > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_alchemist)\n", MAX_FAME_LIST);
+ fame_list_size_chemist = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "fame_list_blacksmith") == 0) {
+ fame_list_size_smith = atoi(w2);
+ if (fame_list_size_smith > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_blacksmith)\n", MAX_FAME_LIST);
+ fame_list_size_smith = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "fame_list_taekwon") == 0) {
+ fame_list_size_taekwon = atoi(w2);
+ if (fame_list_size_taekwon > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_taekwon)\n", MAX_FAME_LIST);
+ fame_list_size_taekwon = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "guild_exp_rate") == 0) {
+ guild_exp_rate = atoi(w2);
+#endif //TXT_SQL_CONVERT
+ } else if (strcmpi(w1, "import") == 0) {
+ char_config_read(w2);
+ }
+ }
+ fclose(fp);
+
+ ShowInfo("done reading %s.\n", cfgName);
+ return 0;
+}
+
+#ifndef TXT_SQL_CONVERT
+int chardb_final(int key, void* data, va_list va)
+{
+ aFree(data);
+ return 0;
+}
+void do_final(void) {
+ ShowStatus("Terminating server.\n");
+ // write online players files with no player
+ online_char_db->clear(online_char_db, NULL); //clean the db...
+ create_online_files();
+ online_char_db->destroy(online_char_db, NULL); //dispose the db...
+
+ mmo_char_sync();
+ inter_save();
+ set_all_offline(-1);
+ flush_fifos();
+
+ if(gm_account) aFree(gm_account);
+ if(char_dat) aFree(char_dat);
+
+ delete_session(login_fd);
+ delete_session(char_fd);
+
+#ifdef ENABLE_SC_SAVING
+ status_final();
+#endif
+ inter_final();
+ mapindex_final();
+
+ char_log("----End of char-server (normal end with closing of all files)." RETCODE);
+}
+
+void set_server_type(void)
+{
+ SERVER_TYPE = ATHENA_SERVER_CHAR;
+}
+
+static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
+{
+ struct online_char_data *character= (struct online_char_data*)data;
+ if (character->server == -2) //Unknown server.. set them offline
+ set_char_offline(character->char_id, character->account_id);
+ if (character->server < 0)
+ //Free data from players that have not been online for a while.
+ db_remove(online_char_db, key);
+ return 0;
+}
+
+static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
+{
+ online_char_db->foreach(online_char_db, online_data_cleanup_sub);
+ return 0;
+}
+
+int do_init(int argc, char **argv) {
+ int i;
+
+ mapindex_init(); //Needed here for the start-point reading.
+ start_point.map = mapindex_name2id("new_zone01.gat");
+ char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
+ char_lan_config_read((argc > 3) ? argv[3] : LOGIN_LAN_CONF_NAME);
+
+ if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
+ ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
+ ShowNotice("Please edit your save/account.txt file to create a proper inter-server user/password (gender 'S')\n");
+ ShowNotice("And then change the user/password to use in conf/char_athena.conf (or conf/import/char_conf.txt)\n");
+ }
+
+ // a newline in the log...
+ char_log("");
+ // moved behind char_config_read in case we changed the filename [celest]
+ char_log("The char-server starting..." RETCODE);
+
+ if ((naddr_ != 0) && (!login_ip || !char_ip)) {
+ // The char server should know what IP address it is running on
+ // - MouseJstr
+ int localaddr = ntohl(addr_[0]);
+ unsigned char *ptr = (unsigned char *) &localaddr;
+ char buf[16];
+ sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
+ if (naddr_ != 1)
+ ShowStatus("Multiple interfaces detected.. using %s as our IP address\n", buf);
+ else
+ ShowStatus("Defaulting to %s as our IP address\n", buf);
+ if (!login_ip) {
+ strcpy(login_ip_str, buf);
+ login_ip = inet_addr(login_ip_str);
+ }
+ if (!char_ip) {
+ strcpy(char_ip_str, buf);
+ char_ip = inet_addr(char_ip_str);
+ }
+
+ if (ptr[0] == 192 && ptr[1] == 168)
+ ShowWarning("Firewall detected.. edit subnet_athena.conf and char_athena.conf\n");
+ }
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ server_fd[i] = -1;
+ }
+
+ online_char_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ mmo_char_init();
+#ifdef ENABLE_SC_SAVING
+ status_init();
+#endif
+ update_online = time(NULL);
+ create_online_files(); // update online players files at start of the server
+
+ inter_init_txt((argc > 2) ? argv[2] : inter_cfgName); // inter server ‰Šú‰»
+
+ set_defaultparse(parse_char);
+
+ char_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,char_port);
+
+ add_timer_func_list(check_connect_login_server, "check_connect_login_server");
+ add_timer_func_list(send_users_tologin, "send_users_tologin");
+ add_timer_func_list(send_accounts_tologin, "send_accounts_tologin");
+ add_timer_func_list(mmo_char_sync_timer, "mmo_char_sync_timer");
+ add_timer_func_list(chardb_waiting_disconnect, "chardb_waiting_disconnect");
+ add_timer_func_list(online_data_cleanup, "online_data_cleanup");
+
+ add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600 * 1000);
+ add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000);
+ add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000);
+ add_timer_interval(gettick() + 3600*1000, send_accounts_tologin, 0, 0, 3600*1000); //Sync online accounts every hour
+ add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval);
+
+ char_read_fame_list(); //Read fame lists.
+
+ if(console) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ char_log("The char-server is ready (Server is listening on the port %d)." RETCODE, char_port);
+
+ ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/char.h b/src/char/char.h
index d6ec8e5cb..e70fe7e4f 100644
--- a/src/char/char.h
+++ b/src/char/char.h
@@ -1,58 +1,58 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#include "../common/mmo.h"
-#include "../common/mapindex.h"
-
-#define START_CHAR_NUM 150000
-#define MAX_MAP_SERVERS 30
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-#define LOGIN_LAN_CONF_NAME "conf/subnet_athena.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct character_data {
- struct mmo_charstatus status;
- int global_num;
- struct global_reg global[GLOBAL_REG_NUM];
-};
-
-struct mmo_charstatus* search_character(int aid, int cid);
-struct mmo_charstatus* search_character_byname(char* character_name);
-int search_character_index(char* character_name);
-char * search_character_name(int index);
-int search_character_online(int aid, int cid);
-
-int mapif_sendall(unsigned char *buf, unsigned int len);
-int mapif_sendallwos(int fd,unsigned char *buf, unsigned int len);
-int mapif_send(int fd,unsigned char *buf, unsigned int len);
-
-int char_married(int pl1,int pl2);
-int char_child(int parent_id, int child_id);
-int char_family(int cid1, int cid2, int cid3);
-void char_clearparty(int party_id);
-
-int char_log(char *fmt, ...);
-
-int request_accreg2(int account_id, int char_id);
-int char_parse_Registry(int account_id, int char_id, unsigned char *buf, int len);
-int save_accreg2(unsigned char *buf, int len);
-int char_account_reg_reply(int fd,int account_id,int char_id);
-
-extern int char_name_option;
-extern char char_name_letters[];
-extern int autosave_interval;
-extern char db_path[];
-extern int guild_exp_rate;
-extern int log_inter;
-//Exported for use in the TXT-SQL converter.
-extern char char_txt[];
-int char_config_read(const char *cfgName);
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int *reg_num);
-int parse_friend_txt(struct mmo_charstatus *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CHAR_H_
+#define _CHAR_H_
+
+#include "../common/mmo.h"
+#include "../common/mapindex.h"
+
+#define START_CHAR_NUM 150000
+#define MAX_MAP_SERVERS 30
+
+#define CHAR_CONF_NAME "conf/char_athena.conf"
+
+#define LOGIN_LAN_CONF_NAME "conf/subnet_athena.conf"
+
+#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+
+struct character_data {
+ struct mmo_charstatus status;
+ int global_num;
+ struct global_reg global[GLOBAL_REG_NUM];
+};
+
+struct mmo_charstatus* search_character(int aid, int cid);
+struct mmo_charstatus* search_character_byname(char* character_name);
+int search_character_index(char* character_name);
+char * search_character_name(int index);
+int search_character_online(int aid, int cid);
+
+int mapif_sendall(unsigned char *buf, unsigned int len);
+int mapif_sendallwos(int fd,unsigned char *buf, unsigned int len);
+int mapif_send(int fd,unsigned char *buf, unsigned int len);
+
+int char_married(int pl1,int pl2);
+int char_child(int parent_id, int child_id);
+int char_family(int cid1, int cid2, int cid3);
+void char_clearparty(int party_id);
+
+int char_log(char *fmt, ...);
+
+int request_accreg2(int account_id, int char_id);
+int char_parse_Registry(int account_id, int char_id, unsigned char *buf, int len);
+int save_accreg2(unsigned char *buf, int len);
+int char_account_reg_reply(int fd,int account_id,int char_id);
+
+extern int char_name_option;
+extern char char_name_letters[];
+extern int autosave_interval;
+extern char db_path[];
+extern int guild_exp_rate;
+extern int log_inter;
+//Exported for use in the TXT-SQL converter.
+extern char char_txt[];
+int char_config_read(const char *cfgName);
+int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg, int *reg_num);
+int parse_friend_txt(struct mmo_charstatus *p);
+#endif
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 7a34b081f..e6c4105c8 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -1,1565 +1,1565 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "char.h"
-#include "inter.h"
-#include "int_storage.h"
-#include "int_guild.h"
-
-char guild_txt[1024] = "save/guild.txt";
-char castle_txt[1024] = "save/castle.txt";
-
-#ifndef TXT_SQL_CONVERT
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-
-static int guild_newid = 10000;
-
-static unsigned int guild_exp[100];
-
-int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes);
-int mapif_guild_broken(int guild_id, int flag);
-int guild_check_empty(struct guild *g);
-int guild_calcinfo(struct guild *g);
-int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len);
-int mapif_guild_info(int fd, struct guild *g);
-int guild_break_sub(DBKey key, void *data, va_list ap);
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
-int inter_guild_tostr(char *str, struct guild *g) {
- int i, c, len;
-
- // Šî–{ƒf[ƒ^
- len = sprintf(str, "%d\t%s\t%s\t%d,%d,%u,%d,%d\t%s#\t%s#\t",
- g->guild_id, g->name, g->master,
- g->guild_lv, g->max_member, g->exp, g->skill_point, g->castle_id,
- g->mes1, g->mes2);
- // ƒƒ“ƒo[
- for(i = 0; i < g->max_member; i++) {
- struct guild_member *m = &g->member[i];
- len += sprintf(str + len, "%d,%d,%d,%d,%d,%d,%d,%u,%d,%d\t%s\t",
- m->account_id, m->char_id,
- m->hair, m->hair_color, m->gender,
- m->class_, m->lv, m->exp, m->exp_payper, m->position,
- ((m->account_id > 0) ? m->name : "-"));
- }
- // –ðE
- for(i = 0; i < MAX_GUILDPOSITION; i++) {
- struct guild_position *p = &g->position[i];
- len += sprintf(str + len, "%d,%d\t%s#\t", p->mode, p->exp_mode, p->name);
- }
- // ƒGƒ“ƒuƒŒƒ€
- len += sprintf(str + len, "%d,%d,", g->emblem_len, g->emblem_id);
- for(i = 0; i < g->emblem_len; i++) {
- len += sprintf(str + len, "%02x", (unsigned char)(g->emblem_data[i]));
- }
- len += sprintf(str + len, "$\t");
- // “¯–¿ƒŠƒXƒg
- c = 0;
- for(i = 0; i < MAX_GUILDALLIANCE; i++)
- if (g->alliance[i].guild_id > 0)
- c++;
- len += sprintf(str + len, "%d\t", c);
- for(i = 0; i < MAX_GUILDALLIANCE; i++) {
- struct guild_alliance *a = &g->alliance[i];
- if (a->guild_id > 0)
- len += sprintf(str + len, "%d,%d\t%s\t", a->guild_id, a->opposition, a->name);
- }
- // ’Ç•úƒŠƒXƒg
- c = 0;
- for(i = 0; i < MAX_GUILDEXPULSION; i++)
- if (g->expulsion[i].account_id > 0)
- c++;
- len += sprintf(str + len, "%d\t", c);
- for(i = 0; i < MAX_GUILDEXPULSION; i++) {
- struct guild_expulsion *e = &g->expulsion[i];
- if (e->account_id > 0)
- len += sprintf(str + len, "%d,%d,%d,%d\t%s\t%s\t%s#\t",
- e->account_id, e->rsv1, e->rsv2, e->rsv3,
- e->name, e->acc, e->mes );
- }
- // ƒMƒ‹ƒhƒXƒLƒ‹
- for(i = 0; i < MAX_GUILDSKILL; i++) {
- len += sprintf(str + len, "%d,%d ", g->skill[i].id, g->skill[i].lv);
- }
- len += sprintf(str + len, "\t");
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_guild_fromstr(char *str, struct guild *g) {
- int i, j, c;
- unsigned int exp;
- int tmp_int[16];
- char tmp_str[4][256];
- char tmp_str2[4096];
- char *pstr;
-
- // Šî–{ƒf[ƒ^
- memset(g, 0, sizeof(struct guild));
- if (sscanf(str, "%d\t%[^\t]\t%[^\t]\t%d,%d,%u,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0],
- tmp_str[0], tmp_str[1],
- &tmp_int[1], &tmp_int[2], &exp, &tmp_int[4], &tmp_int[5],
- tmp_str[2], tmp_str[3]) < 8)
- return 1;
-
- g->guild_id = tmp_int[0];
- g->guild_lv = tmp_int[1];
- g->max_member = tmp_int[2];
- g->exp = exp;
- g->skill_point = tmp_int[4];
-#ifndef TXT_SQL_CONVERT
- g->castle_id = tmp_int[5];
-#endif
- memcpy(g->name, tmp_str[0], NAME_LENGTH-1);
- memcpy(g->master, tmp_str[1], NAME_LENGTH-1);
- memcpy(g->mes1, tmp_str[2], 60);
- memcpy(g->mes2, tmp_str[3], 120);
- g->mes1[strlen(g->mes1)-1] = 0;
- g->mes2[strlen(g->mes2)-1] = 0;
-
- for(j = 0; j < 6 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
-// printf("GuildBaseInfo OK\n");
-
- // ƒƒ“ƒo[
- for(i = 0; i < g->max_member; i++) {
- struct guild_member *m = &g->member[i];
- if (sscanf(str + 1, "%d,%d,%d,%d,%d,%d,%d,%u,%d,%d\t%[^\t]\t",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4],
- &tmp_int[5], &tmp_int[6], &exp, &tmp_int[8], &tmp_int[9],
- tmp_str[0]) < 11)
- return 1;
- m->account_id = tmp_int[0];
- m->char_id = tmp_int[1];
- m->hair = tmp_int[2];
- m->hair_color = tmp_int[3];
- m->gender = tmp_int[4];
- m->class_ = tmp_int[5];
- m->lv = tmp_int[6];
- m->exp = exp;
- m->exp_payper = tmp_int[8];
- m->position = tmp_int[9];
- memcpy(m->name, tmp_str[0], NAME_LENGTH-1);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildMemberInfo OK\n");
- // –ðE
- i = 0;
- while (sscanf(str+1, "%d,%d%n", &tmp_int[0], &tmp_int[1], &j) == 2 && str[1+j] == '\t') {
- struct guild_position *p = &g->position[i];
- if (sscanf(str+1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
- return 1;
- p->mode = tmp_int[0];
- p->exp_mode = tmp_int[1];
- tmp_str[0][strlen(tmp_str[0])-1] = 0;
- memcpy(p->name, tmp_str[0], NAME_LENGTH-1);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str+1, '\t');
- i++;
- }
-// printf("GuildPositionInfo OK\n");
- // ƒGƒ“ƒuƒŒƒ€
- tmp_int[1] = 0;
- if (sscanf(str + 1, "%d,%d,%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str2)< 3 &&
- sscanf(str + 1, "%d,%[^\t]\t", &tmp_int[0], tmp_str2) < 2)
- return 1;
- g->emblem_len = tmp_int[0];
- g->emblem_id = tmp_int[1];
- for(i = 0, pstr = tmp_str2; i < g->emblem_len; i++, pstr += 2) {
- int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0;
- if (c1 >= '0' && c1 <= '9') x1 = c1 - '0';
- if (c1 >= 'a' && c1 <= 'f') x1 = c1 - 'a' + 10;
- if (c1 >= 'A' && c1 <= 'F') x1 = c1 - 'A' + 10;
- if (c2 >= '0' && c2 <= '9') x2 = c2 - '0';
- if (c2 >= 'a' && c2 <= 'f') x2 = c2 - 'a' + 10;
- if (c2 >= 'A' && c2 <= 'F') x2 = c2 - 'A' + 10;
- g->emblem_data[i] = (x1<<4) | x2;
- }
-// printf("GuildEmblemInfo OK\n");
- str=strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
-
- // “¯–¿ƒŠƒXƒg
- if (sscanf(str + 1, "%d\t", &c) < 1)
- return 1;
- str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
- for(i = 0; i < c; i++) {
- struct guild_alliance *a = &g->alliance[i];
- if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
- return 1;
- a->guild_id = tmp_int[0];
- a->opposition = tmp_int[1];
- memcpy(a->name, tmp_str[0], NAME_LENGTH-1);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildAllianceInfo OK\n");
- // ’Ç•úƒŠƒXƒg
- if (sscanf(str+1, "%d\t", &c) < 1)
- return 1;
- str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
- for(i = 0; i < c; i++) {
- struct guild_expulsion *e = &g->expulsion[i];
- if (sscanf(str + 1, "%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- tmp_str[0], tmp_str[1], tmp_str[2]) < 6)
- return 1;
- e->account_id = tmp_int[0];
- e->rsv1 = tmp_int[1];
- e->rsv2 = tmp_int[2];
- e->rsv3 = tmp_int[3];
- memcpy(e->name, tmp_str[0], NAME_LENGTH-1);
- memcpy(e->acc, tmp_str[1], 24);
- tmp_str[2][strlen(tmp_str[2])-1] = 0;
- memcpy(e->mes, tmp_str[2], 40);
-
- for(j = 0; j < 4 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildExplusionInfo OK\n");
- // ƒMƒ‹ƒhƒXƒLƒ‹
- for(i = 0; i < MAX_GUILDSKILL; i++) {
- if (sscanf(str+1,"%d,%d ", &tmp_int[0], &tmp_int[1]) < 2)
- break;
- g->skill[i].id = tmp_int[0];
- g->skill[i].lv = tmp_int[1];
- str = strchr(str + 1, ' ');
- }
- str = strchr(str + 1, '\t');
-// printf("GuildSkillInfo OK\n");
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
-int inter_guildcastle_tostr(char *str, struct guild_castle *gc) {
- int len;
-
- len = sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", // added Guardian HP [Valaris]
- gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE,
- gc->triggerD, gc->nextTime, gc->payTime, gc->createTime, gc->visibleC,
- gc->guardian[0].visible, gc->guardian[1].visible, gc->guardian[2].visible, gc->guardian[3].visible,
- gc->guardian[4].visible, gc->guardian[5].visible, gc->guardian[6].visible, gc->guardian[7].visible,
- gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp,
- gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp);
-
- return 0;
-}
-#endif ///TXT_SQL_CONVERT
-// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_guildcastle_fromstr(char *str, struct guild_castle *gc) {
- int tmp_int[26];
-
- memset(gc, 0, sizeof(struct guild_castle));
- // new structure of guild castle
- if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
- &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], &tmp_int[24], &tmp_int[25]) == 26) {
- gc->castle_id = tmp_int[0];
- gc->guild_id = tmp_int[1];
- gc->economy = tmp_int[2];
- gc->defense = tmp_int[3];
- gc->triggerE = tmp_int[4];
- gc->triggerD = tmp_int[5];
- gc->nextTime = tmp_int[6];
- gc->payTime = tmp_int[7];
- gc->createTime = tmp_int[8];
- gc->visibleC = tmp_int[9];
- gc->guardian[0].visible = tmp_int[10];
- gc->guardian[1].visible = tmp_int[11];
- gc->guardian[2].visible = tmp_int[12];
- gc->guardian[3].visible = tmp_int[13];
- gc->guardian[4].visible = tmp_int[14];
- gc->guardian[5].visible = tmp_int[15];
- gc->guardian[6].visible = tmp_int[16];
- gc->guardian[7].visible = tmp_int[17];
- gc->guardian[0].hp = tmp_int[18];
- gc->guardian[1].hp = tmp_int[19];
- gc->guardian[2].hp = tmp_int[20];
- gc->guardian[3].hp = tmp_int[21];
- gc->guardian[4].hp = tmp_int[22];
- gc->guardian[5].hp = tmp_int[23];
- gc->guardian[6].hp = tmp_int[24];
- gc->guardian[7].hp = tmp_int[25]; // end additions [Valaris]
- // old structure of guild castle
- } else if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
- &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17]) == 18) {
- int i;
-
- gc->castle_id = tmp_int[0];
- gc->guild_id = tmp_int[1];
- gc->economy = tmp_int[2];
- gc->defense = tmp_int[3];
- gc->triggerE = tmp_int[4];
- gc->triggerD = tmp_int[5];
- gc->nextTime = tmp_int[6];
- gc->payTime = tmp_int[7];
- gc->createTime = tmp_int[8];
- gc->visibleC = tmp_int[9];
- gc->guardian[0].visible = tmp_int[10];
- gc->guardian[1].visible = tmp_int[11];
- gc->guardian[2].visible = tmp_int[12];
- gc->guardian[3].visible = tmp_int[13];
- gc->guardian[4].visible = tmp_int[14];
- gc->guardian[5].visible = tmp_int[15];
- gc->guardian[6].visible = tmp_int[16];
- gc->guardian[7].visible = tmp_int[17];
-
- for (i = 0; i < MAX_GUARDIANS; i++)
- {
- if (gc->guardian[i].visible)
- gc->guardian[i].hp = 15000 + 2000 * gc->defense;
- else
- gc->guardian[i].hp = 0;
- }
- } else {
- return 1;
- }
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// ƒMƒ‹ƒhŠÖ˜Aƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
-int inter_guild_readdb(void) {
- int i;
- FILE *fp;
- char line[1024];
- char path[1024];
-
- sprintf(path, "%s%s", db_path, "/exp_guild.txt");
- fp = fopen(path, "r");
- if (fp == NULL) {
- ShowError("can't read db/exp_guild.txt\n");
- return 1;
- }
- i = 0;
- while(fgets(line, sizeof(line)-1, fp) && i < 100){
- if (line[0] == '/' && line[1] == '/')
- continue;
- guild_exp[i] = (unsigned int)atof(line);
- i++;
- }
- fclose(fp);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
-int inter_guild_init() {
- char line[16384];
- struct guild *g;
- struct guild_castle *gc;
- FILE *fp;
- int i, j, c = 0;
-
- inter_guild_readdb();
-
- guild_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- castle_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if ((fp = fopen(guild_txt,"r")) == NULL)
- return 1;
- while(fgets(line, sizeof(line)-1, fp)) {
- j = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && guild_newid <= i) {
- guild_newid = i;
- continue;
- }
-
- g = (struct guild *) aCalloc(sizeof(struct guild), 1);
- if(g == NULL){
- ShowFatalError("int_guild: out of memory!\n");
- exit(0);
- }
-// memset(g, 0, sizeof(struct guild)); not needed...
- if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) {
- if (g->guild_id >= guild_newid)
- guild_newid = g->guild_id + 1;
- idb_put(guild_db, g->guild_id, g);
- guild_check_empty(g);
- guild_calcinfo(g);
- } else {
- ShowError("int_guild: broken data [%s] line %d\n", guild_txt, c);
- aFree(g);
- }
- c++;
- }
- fclose(fp);
-// printf("int_guild: %s read done (%d guilds)\n", guild_txt, c);
-
- c = 0;//ƒJƒEƒ“ƒ^‰Šú‰»
-
- if ((fp = fopen(castle_txt, "r")) == NULL) {
- return 1;
- }
-
- while(fgets(line, sizeof(line)-1, fp)) {
- gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
- if(gc == NULL){
- ShowFatalError("int_guild: out of memory!\n");
- exit(0);
- }
-// memset(gc, 0, sizeof(struct guild_castle)); No need...
- if (inter_guildcastle_fromstr(line, gc) == 0) {
- idb_put(castle_db, gc->castle_id, gc);
- } else {
- ShowError("int_guild: broken data [%s] line %d\n", castle_txt, c);
- aFree(gc);
- }
- c++;
- }
-
- if (!c) {
- ShowStatus(" %s - making Default Data...\n", castle_txt);
- //ƒfƒtƒHƒ‹ƒgƒf[ƒ^‚ðì¬
- for(i = 0; i < MAX_GUILDCASTLE; i++) {
- gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
- if (gc == NULL) {
- ShowFatalError("int_guild: out of memory!\n");
- exit(0);
- }
- gc->castle_id = i;
- idb_put(castle_db, gc->castle_id, gc);
- }
- ShowStatus(" %s - making done\n",castle_txt);
- return 0;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-void inter_guild_final() {
- castle_db->destroy(castle_db, NULL);
- guild_db->destroy(guild_db, NULL);
- return;
-}
-
-struct guild *inter_guild_search(int guild_id) {
- return idb_get(guild_db, guild_id);
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu—p
-int inter_guild_save_sub(DBKey key,void *data,va_list ap) {
- char line[16384];
- FILE *fp;
-
- inter_guild_tostr(line,(struct guild *)data);
- fp=va_arg(ap,FILE *);
- fprintf(fp,"%s" RETCODE,line);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^‚̃Z[ƒu—p
-int inter_castle_save_sub(DBKey key, void *data, va_list ap) {
- char line[16384];
- FILE *fp;
-
- inter_guildcastle_tostr(line, (struct guild_castle *)data);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu
-int inter_guild_save() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(guild_txt, &lock)) == NULL) {
- ShowError("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt);
- return 1;
- }
- guild_db->foreach(guild_db, inter_guild_save_sub, fp);
-// fprintf(fp, "%d\t%%newid%%\n", guild_newid);
- lock_fclose(fp, guild_txt, &lock);
-// printf("int_guild: %s saved.\n", guild_txt);
-
- if ((fp = lock_fopen(castle_txt,&lock)) == NULL) {
- ShowError("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt);
- return 1;
- }
- castle_db->foreach(castle_db, inter_castle_save_sub, fp);
- lock_fclose(fp, castle_txt, &lock);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–¼ŒŸõ—p
-int search_guildname_sub(DBKey key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data, **dst;
- char *str;
-
- str = va_arg(ap, char *);
- dst = va_arg(ap, struct guild **);
- if (strcmpi(g->name, str) == 0)
- *dst = g;
- return 0;
-}
-
-// ƒMƒ‹ƒh–¼ŒŸõ
-struct guild* search_guildname(char *str) {
- struct guild *g = NULL;
- guild_db->foreach(guild_db, search_guildname_sub, str, &g);
- return g;
-}
-
-// ƒMƒ‹ƒh‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-int guild_check_empty(struct guild *g) {
- int i;
-
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id > 0) {
- return 0;
- }
- }
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- guild_db->foreach(guild_db, guild_break_sub, g->guild_id);
- inter_guild_storage_delete(g->guild_id);
- mapif_guild_broken(g->guild_id, 0);
- idb_remove(guild_db, g->guild_id);
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int guild_check_conflict_sub(DBKey key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data;
- int guild_id, account_id, char_id, i;
-
- guild_id = va_arg(ap, int);
- account_id = va_arg(ap, int);
- char_id = va_arg(ap, int);
-
- if (g->guild_id == guild_id) // –{—ˆ‚ÌŠ‘®‚È‚Ì‚Å–â‘è‚È‚µ
- return 0;
-
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
- // •Ê‚̃Mƒ‹ƒh‚É‹U‚ÌŠ‘®ƒf[ƒ^‚ª‚ ‚é‚Ì‚Å’E‘Þ
- ShowWarning("int_guild: guild conflict! %d,%d %d!=%d\n", account_id, char_id, guild_id, g->guild_id);
- mapif_parse_GuildLeave(-1, g->guild_id, account_id, char_id, 0, "**ƒf[ƒ^‹£‡**");
- }
- }
-
- return 0;
-}
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
-int guild_check_conflict(int guild_id, int account_id, int char_id) {
- guild_db->foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id);
-
- return 0;
-}
-
-unsigned int guild_nextexp (int level)
-{
- if (level == 0)
- return 1;
- if (level > 0 && level < 100)
- return guild_exp[level-1];
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g, int id) {
- int idx = id - GD_SKILLBASE;
-
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
-
- return 0;
-
- return g->skill[idx].lv;
-}
-
-// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
-int guild_calcinfo(struct guild *g) {
- int i, c;
- unsigned int nextexp;
- struct guild before = *g;
-
- // ƒXƒLƒ‹ID‚ÌÝ’è
- for(i = 0; i < MAX_GUILDSKILL; i++)
- g->skill[i].id=i+GD_SKILLBASE;
-
- // ƒMƒ‹ƒhƒŒƒxƒ‹
- if (g->guild_lv <= 0)
- g->guild_lv = 1;
- nextexp = guild_nextexp(g->guild_lv);
- if (nextexp > 0) {
- while(g->exp >= nextexp && nextexp > 0) { //fixed guild exp overflow [Kevin]
- g->exp -= nextexp;
- g->guild_lv++;
- g->skill_point++;
- nextexp = guild_nextexp(g->guild_lv);
- }
- }
-
- // ƒMƒ‹ƒh‚ÌŽŸ‚ÌŒoŒ±’l
- g->next_exp = guild_nextexp(g->guild_lv);
-
- // ƒƒ“ƒoãŒÀiƒMƒ‹ƒhŠg’£“K—pj
- g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6; //Guild Extention skill - currently adds 6 to max per skill lv.
- if(g->max_member > MAX_GUILD)
- {
- ShowError("Guild %d:%s has capacity for too many guild members (%d), max supported is %d\n", g->guild_id, g->name, g->max_member, MAX_GUILD);
- g->max_member = MAX_GUILD;
- }
-
- // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
- g->average_lv = 0;
- g->connect_member = 0;
- c = 0;
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id > 0) {
- g->average_lv += g->member[i].lv;
- c++;
- if (g->member[i].online > 0)
- g->connect_member++;
- }
- }
- if(c) g->average_lv /= c;
-
- // ‘Sƒf[ƒ^‚ð‘—‚é•K—v‚ª‚ ‚è‚»‚¤
- if (g->max_member != before.max_member ||
- g->guild_lv != before.guild_lv ||
- g->skill_point != before.skill_point) {
- mapif_guild_info(-1, g);
- return 1;
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒMƒ‹ƒh쬉”Û
-int mapif_guild_created(int fd, int account_id, struct guild *g) {
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0) = 0x3830;
- WFIFOL(fd,2) = account_id;
- if (g != NULL) {
- WFIFOL(fd,6) = g->guild_id;
- ShowInfo("Created Guild (%d %s)\n", g->guild_id, g->name);
- }else{
- WFIFOL(fd,6) = 0;
- }
- WFIFOSET(fd,10);
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñŒ©‚‚©‚炸
-int mapif_guild_noinfo(int fd, int guild_id) {
- WFIFOHEAD(fd, 8);
- WFIFOW(fd,0) = 0x3831;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = guild_id;
- WFIFOSET(fd,8);
- ShowNotice("int_guild: info not found %d\n", guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_guild_info(int fd, struct guild *g) {
- unsigned char buf[8+sizeof(struct guild)];
-
- WBUFW(buf,0) = 0x3831;
- memcpy(buf + 4, g, sizeof(struct guild));
- WBUFW(buf,2) = 4 + sizeof(struct guild);
-// printf("int_guild: sizeof(guild)=%d\n", sizeof(struct guild));
- if (fd < 0)
- mapif_sendall(buf, WBUFW(buf,2));
- else
- mapif_send(fd, buf, WBUFW(buf,2));
-// printf("int_guild: info %d %s\n", p->guild_id, p->name);
-
- return 0;
-}
-
-// ƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_guild_memberadded(int fd, int guild_id, int account_id, int char_id, int flag) {
- WFIFOHEAD(fd, 15);
- WFIFOW(fd,0) = 0x3832;
- WFIFOL(fd,2) = guild_id;
- WFIFOL(fd,6) = account_id;
- WFIFOL(fd,10) = char_id;
- WFIFOB(fd,14) = flag;
- WFIFOSET(fd, 15);
-
- return 0;
-}
-
-// ’E‘Þ/’Ç•ú’Ê’m
-int mapif_guild_leaved(int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes) {
- unsigned char buf[79];
-
- WBUFW(buf, 0) = 0x3834;
- WBUFL(buf, 2) = guild_id;
- WBUFL(buf, 6) = account_id;
- WBUFL(buf,10) = char_id;
- WBUFB(buf,14) = flag;
- memcpy(WBUFP(buf,15), mes, 40);
- memcpy(WBUFP(buf,55), name, NAME_LENGTH);
- mapif_sendall(buf, 55+NAME_LENGTH);
-// mapif_sendall(buf, 79);
- ShowInfo("Character left guild (Guild %d, %d - %s: %s)\n", guild_id, account_id, name, mes);
-
- return 0;
-}
-
-// ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ÆLvXV’Ê’m
-int mapif_guild_memberinfoshort(struct guild *g, int idx) {
- unsigned char buf[19];
-
- WBUFW(buf, 0) = 0x3835;
- WBUFL(buf, 2) = g->guild_id;
- WBUFL(buf, 6) = g->member[idx].account_id;
- WBUFL(buf,10) = g->member[idx].char_id;
- WBUFB(buf,14) = (unsigned char)g->member[idx].online;
- WBUFW(buf,15) = g->member[idx].lv;
- WBUFW(buf,17) = g->member[idx].class_;
- mapif_sendall(buf, 19);
- return 0;
-}
-
-// ‰ðŽU’Ê’m
-int mapif_guild_broken(int guild_id, int flag) {
- unsigned char buf[7];
-
- WBUFW(buf,0) = 0x3836;
- WBUFL(buf,2) = guild_id;
- WBUFB(buf,6) = flag;
- mapif_sendall(buf, 7);
- ShowInfo("Guild Break (%d)\n", guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“à”­Œ¾
-int mapif_guild_message(int guild_id, int account_id, char *mes, int len, int sfd) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3837;
- WBUFW(buf,2) = len + 12;
- WBUFL(buf,4) = guild_id;
- WBUFL(buf,8) = account_id;
- memcpy(WBUFP(buf,12), mes, len);
- mapif_sendallwos(sfd, buf, len + 12);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
-int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3839;
- WBUFW(buf,2) = len+10;
- WBUFL(buf,4) = guild_id;
- WBUFW(buf,8) = type;
- memcpy(WBUFP(buf,10),data,len);
- mapif_sendall(buf,len+10);
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
-int mapif_guild_memberinfochanged(int guild_id, int account_id, int char_id, int type, const void *data, int len) {
- unsigned char buf[4096];
-
- WBUFW(buf, 0) = 0x383a;
- WBUFW(buf, 2) = len + 18;
- WBUFL(buf, 4) = guild_id;
- WBUFL(buf, 8) = account_id;
- WBUFL(buf,12) = char_id;
- WBUFW(buf,16) = type;
- memcpy(WBUFP(buf,18), data, len);
- mapif_sendall(buf,len+18);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv’Ê’m
-int mapif_guild_skillupack(int guild_id, int skill_num, int account_id) {
- unsigned char buf[14];
-
- WBUFW(buf, 0) = 0x383c;
- WBUFL(buf, 2) = guild_id;
- WBUFL(buf, 6) = skill_num;
- WBUFL(buf,10) = account_id;
- mapif_sendall(buf, 14);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2) {
- unsigned char buf[67];
-
- WBUFW(buf, 0) = 0x383d;
- WBUFL(buf, 2) = guild_id1;
- WBUFL(buf, 6) = guild_id2;
- WBUFL(buf,10) = account_id1;
- WBUFL(buf,14) = account_id2;
- WBUFB(buf,18) = flag;
- memcpy(WBUFP(buf,19), name1, NAME_LENGTH);
- memcpy(WBUFP(buf,19+NAME_LENGTH), name2, NAME_LENGTH);
- mapif_sendall(buf,19+2*NAME_LENGTH);
-/*
- memcpy(WBUFP(buf,43), name2, NAME_LENGTH);
- mapif_sendall(buf, 67);
-*/
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int mapif_guild_position(struct guild *g, int idx) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x383b;
- WBUFW(buf,2) = sizeof(struct guild_position) + 12;
- WBUFL(buf,4) = g->guild_id;
- WBUFL(buf,8) = idx;
- memcpy(WBUFP(buf,12), &g->position[idx], sizeof(struct guild_position));
- mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int mapif_guild_notice(struct guild *g) {
- unsigned char buf[186];
-
- WBUFW(buf,0) = 0x383e;
- WBUFL(buf,2) = g->guild_id;
- memcpy(WBUFP(buf,6), g->mes1, 60);
- memcpy(WBUFP(buf,66), g->mes2, 120);
- mapif_sendall(buf, 186);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int mapif_guild_emblem(struct guild *g) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x383f;
- WBUFW(buf,2) = g->emblem_len + 12;
- WBUFL(buf,4) = g->guild_id;
- WBUFL(buf,8) = g->emblem_id;
- memcpy(WBUFP(buf,12), g->emblem_data, g->emblem_len);
- mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-int mapif_guild_master_changed(struct guild *g, int position)
-{
- unsigned char buf[12];
- WBUFW(buf,0)=0x3843;
- WBUFL(buf,2)=g->guild_id;
- WBUFL(buf,6)=position;
- mapif_sendall(buf,10);
- return 0;
-}
-
-int mapif_guild_castle_dataload(int castle_id, int index, int value) {
- unsigned char buf[9];
-
- WBUFW(buf,0) = 0x3840;
- WBUFW(buf,2) = castle_id;
- WBUFB(buf,4) = index;
- WBUFL(buf,5) = value;
- mapif_sendall(buf,9);
-
- return 0;
-}
-
-int mapif_guild_castle_datasave(int castle_id, int index, int value) {
- unsigned char buf[9];
-
- WBUFW(buf,0) = 0x3841;
- WBUFW(buf,2) = castle_id;
- WBUFB(buf,4) = index;
- WBUFL(buf,5) = value;
- mapif_sendall(buf,9);
-
- return 0;
-}
-
-int mapif_guild_castle_alldataload_sub(DBKey key, void *data, va_list ap) {
- int fd = va_arg(ap, int);
- int *p = va_arg(ap, int*);
-
- WFIFOHEAD(fd, sizeof(struct guild_castle));
- memcpy(WFIFOP(fd,*p), (struct guild_castle*)data, sizeof(struct guild_castle));
- (*p) += sizeof(struct guild_castle);
-
- return 0;
-}
-
-int mapif_guild_castle_alldataload(int fd) {
- int len = 4;
-
- WFIFOHEAD(fd, 0);
- WFIFOW(fd,0) = 0x3842;
- castle_db->foreach(castle_db, mapif_guild_castle_alldataload_sub, fd, &len);
- WFIFOW(fd,2) = len;
- WFIFOSET(fd, len);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-// ƒMƒ‹ƒh쬗v‹
-int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_member *master) {
- struct guild *g;
- int i;
-
- for(i = 0; i < NAME_LENGTH && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- ShowInfo("Create Guild: illegal guild name [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
- }
-
- if ((g = search_guildname(name)) != NULL) {
- ShowInfo("Create Guild: same name guild exists [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- }
-
- g = (struct guild *) aCalloc(sizeof(struct guild), 1);
- if (g == NULL) {
- ShowFatalError("int_guild: CreateGuild: out of memory !\n");
- mapif_guild_created(fd, account_id, NULL);
- exit(0);
- }
-// memset(g, 0, sizeof(struct guild)); Meh...
- g->guild_id = guild_newid++;
- memcpy(g->name, name, NAME_LENGTH-1);
- memcpy(g->master, master->name, NAME_LENGTH-1);
- memcpy(&g->member[0], master, sizeof(struct guild_member));
-
- g->position[0].mode = 0x11;
- strcpy(g->position[ 0].name, "GuildMaster");
- strcpy(g->position[MAX_GUILDPOSITION-1].name, "Newbie");
- for(i = 1; i < MAX_GUILDPOSITION-1; i++)
- sprintf(g->position[i].name, "Position %d", i + 1);
-
- // ‚±‚±‚ŃMƒ‹ƒhî•ñŒvŽZ‚ª•K—v‚ÆŽv‚í‚ê‚é
- g->max_member = 16;
- g->average_lv = master->lv;
- for(i = 0; i < MAX_GUILDSKILL; i++)
- g->skill[i].id=i + GD_SKILLBASE;
-
- idb_put(guild_db, g->guild_id, g);
-
- mapif_guild_created(fd, account_id, g);
- mapif_guild_info(fd, g);
-
- if(log_inter)
- inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
- name, g->guild_id, master->name, master->account_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñ—v‹
-int mapif_parse_GuildInfo(int fd, int guild_id) {
- struct guild *g;
-
- g = idb_get(guild_db, guild_id);
- if (g != NULL){
- guild_calcinfo(g);
- mapif_guild_info(fd, g);
- } else
- mapif_guild_noinfo(fd, guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
-int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m) {
- struct guild *g;
- int i;
-
- g = idb_get(guild_db, guild_id);
- if (g == NULL) {
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
- return 0;
- }
-
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id == 0) {
- memcpy(&g->member[i], m, sizeof(struct guild_member));
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 0);
- guild_calcinfo(g);
- mapif_guild_info(-1, g);
-
- return 0;
- }
- }
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’E‘Þ/’Ç•ú—v‹
-int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes) {
- struct guild *g = NULL;
- int i, j;
-
- g = idb_get(guild_db, guild_id);
- if (g != NULL) {
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
-// printf("%d %d\n", i, (int)(&g->member[i]));
-// printf("%d %s\n", i, g->member[i].name);
-
- if (flag) { // ’Ç•ú‚ÌꇒǕúƒŠƒXƒg‚É“ü‚ê‚é
- for(j = 0; j < MAX_GUILDEXPULSION; j++) {
- if (g->expulsion[j].account_id == 0)
- break;
- }
- if (j == MAX_GUILDEXPULSION) { // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
- for(j = 0; j < MAX_GUILDEXPULSION - 1; j++)
- g->expulsion[j] = g->expulsion[j+1];
- j = MAX_GUILDEXPULSION - 1;
- }
- g->expulsion[j].account_id = account_id;
- memcpy(g->expulsion[j].acc, "dummy", NAME_LENGTH-1);
- memcpy(g->expulsion[j].name, g->member[i].name, NAME_LENGTH-1);
- memcpy(g->expulsion[j].mes, mes, 40);
- }
-
- mapif_guild_leaved(guild_id, account_id, char_id, flag, g->member[i].name, mes);
-// printf("%d %d\n", i, (int)(&g->member[i]));
-// printf("%d %s\n", i, (&g->member[i])->name);
- memset(&g->member[i], 0, sizeof(struct guild_member));
-
- if (guild_check_empty(g) == 0)
- mapif_guild_info(-1,g);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
-
- return 0;
- }
- }
- }
- return 0;
-}
-
-// ƒIƒ“ƒ‰ƒCƒ“/LvXV
-int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class_) {
- struct guild *g;
- int i, alv, c;
-
- g = idb_get(guild_db, guild_id);
- if (g == NULL)
- return 0;
-
- g->connect_member = 0;
-
- alv = 0;
- c = 0;
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
- g->member[i].online = online;
- g->member[i].lv = lv;
- g->member[i].class_ = class_;
- mapif_guild_memberinfoshort(g, i);
- }
- if (g->member[i].account_id > 0) {
- alv += g->member[i].lv;
- c++;
- }
- if (g->member[i].online)
- g->connect_member++;
- }
-
- if (c)
- // •½‹ÏƒŒƒxƒ‹
- g->average_lv = alv / c;
-
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽUˆ——pi“¯–¿/“G‘΂ð‰ðœj
-int guild_break_sub(DBKey key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data;
- int guild_id = va_arg(ap, int);
- int i;
-
- for(i = 0; i < MAX_GUILDALLIANCE; i++) {
- if (g->alliance[i].guild_id == guild_id)
- g->alliance[i].guild_id = 0;
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽU—v‹
-int mapif_parse_BreakGuild(int fd, int guild_id) {
- struct guild *g;
-
- g = idb_get(guild_db, guild_id);
- if(g == NULL)
- return 0;
-
- guild_db->foreach(guild_db, guild_break_sub, guild_id);
- inter_guild_storage_delete(guild_id);
- mapif_guild_broken(guild_id, 0);
-
- if(log_inter)
- inter_log("guild %s (id=%d) broken" RETCODE, g->name, guild_id);
-
- idb_remove(guild_db, guild_id);
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒbƒZ[ƒW‘—M
-int mapif_parse_GuildMessage(int fd, int guild_id, int account_id, char *mes, int len) {
- return mapif_guild_message(guild_id, account_id, mes, len, fd);
-}
-
-// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildBasicInfoChange(int fd, int guild_id, int type, const char *data, int len) {
- struct guild *g;
- short dw = *((short *)data);
-
- g = idb_get(guild_db, guild_id);
- if (g == NULL)
- return 0;
-
- switch(type) {
- case GBI_GUILDLV:
- if (dw > 0 && g->guild_lv + dw <= 50) {
- g->guild_lv+=dw;
- g->skill_point+=dw;
- } else if (dw < 0 && g->guild_lv + dw >= 1)
- g->guild_lv += dw;
- mapif_guild_info(-1, g);
- return 0;
- default:
- ShowError("int_guild: GuildBasicInfoChange: Unknown type %d\n", type);
- break;
- }
- mapif_guild_basicinfochanged(guild_id, type, data, len);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildMemberInfoChange(int fd, int guild_id, int account_id, int char_id, int type, const char *data, int len) {
- int i;
- struct guild *g;
-
- g = idb_get(guild_db, guild_id);
- if(g == NULL)
- return 0;
-
- for(i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id)
- break;
- if (i == g->max_member) {
- ShowWarning("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", account_id, char_id, guild_id, g->name);
- return 0;
- }
- switch(type) {
- case GMI_POSITION: // –ðE
- g->member[i].position = *((int *)data);
- break;
- case GMI_EXP: // EXP
- {
- unsigned int exp, old_exp=g->member[i].exp;
- g->member[i].exp=*((unsigned int *)data);
- if (g->member[i].exp > old_exp)
- {
- exp = g->member[i].exp - old_exp;
- if (guild_exp_rate != 100)
- exp = exp*guild_exp_rate/100;
- if (exp > UINT_MAX - g->exp)
- g->exp = UINT_MAX;
- else
- g->exp+=exp;
- guild_calcinfo(g);
- mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
- }
- break;
- }
- case GMI_HAIR:
- {
- g->member[i].hair=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- break;
- }
- case GMI_HAIR_COLOR:
- {
- g->member[i].hair_color=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- break;
- }
- case GMI_GENDER:
- {
- g->member[i].gender=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- break;
- }
- case GMI_CLASS:
- {
- g->member[i].class_=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- break;
- }
- case GMI_LEVEL:
- {
- g->member[i].lv=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- break;
- }
-
- default:
- ShowError("int_guild: GuildMemberInfoChange: Unknown type %d\n", type);
- break;
- }
- mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len);
-
- return 0;
-}
-
-int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender)
-{
- return mapif_parse_GuildMemberInfoChange(0, guild_id, account_id, char_id, GMI_GENDER, (const char*)&gender, sizeof(gender));
-}
-
-// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
-int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) {
- struct guild *g = idb_get(guild_db, guild_id);
-
- if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) {
- return 0;
- }
- memcpy(&g->position[idx], p, sizeof(struct guild_position));
- mapif_guild_position(g, idx);
- ShowInfo("int_guild: position [%d] changed\n", idx);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
-int mapif_parse_GuildSkillUp(int fd, int guild_id, int skill_num, int account_id) {
- struct guild *g = idb_get(guild_db, guild_id);
- int idx = skill_num - GD_SKILLBASE;
-
- if (g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
-
- if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) {
- g->skill[idx].lv++;
- g->skill_point--;
- if (guild_calcinfo(g) == 0)
- mapif_guild_info(-1, g);
- mapif_guild_skillupack(guild_id, skill_num, account_id);
- }
-
- return 0;
-}
-
-//Manual deletion of an alliance when partnering guild does not exists. [Skotlex]
-static int mapif_parse_GuildDeleteAlliance(struct guild *g, int guild_id, int account_id1, int account_id2, int flag)
-{
- int i;
- char name[NAME_LENGTH];
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- if(g->alliance[i].guild_id == guild_id)
- {
- strcpy(name, g->alliance[i].name);
- g->alliance[i].guild_id=0;
- break;
- }
- if (i == MAX_GUILDALLIANCE)
- return -1;
-
- mapif_guild_alliance(g->guild_id,guild_id,account_id1,account_id2,flag,g->name,name);
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿—v‹
-int mapif_parse_GuildAlliance(int fd, int guild_id1, int guild_id2, int account_id1, int account_id2, int flag) {
- struct guild *g[2];
- int j, i;
-
- g[0] = idb_get(guild_db, guild_id1);
- g[1] = idb_get(guild_db, guild_id2);
-
- if(g[0] && g[1]==NULL && (flag&0x8)) //Requested to remove an alliance with a not found guild.
- return mapif_parse_GuildDeleteAlliance(g[0], guild_id2,
- account_id1, account_id2, flag); //Try to do a manual removal of said guild.
-
- if (g[0] == NULL || g[1] == NULL)
- return 0;
-
- if (!(flag & 0x8)) {
- for(i = 0; i < 2 - (flag & 1); i++) {
- for(j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == 0) {
- g[i]->alliance[j].guild_id = g[1-i]->guild_id;
- memcpy(g[i]->alliance[j].name, g[1-i]->name, NAME_LENGTH-1);
- g[i]->alliance[j].opposition = flag & 1;
- break;
- }
- }
- } else { // ŠÖŒW‰ðÁ
- for(i = 0; i < 2 - (flag & 1); i++) {
- for(j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag & 1)) {
- g[i]->alliance[j].guild_id = 0;
- break;
- }
- }
- }
- mapif_guild_alliance(guild_id1, guild_id2, account_id1, account_id2, flag, g[0]->name, g[1]->name);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’m•ÏX—v‹
-int mapif_parse_GuildNotice(int fd, int guild_id, const char *mes1, const char *mes2) {
- struct guild *g;
-
- g = idb_get(guild_db, guild_id);
- if (g == NULL)
- return 0;
- memcpy(g->mes1, mes1, 60);
- memcpy(g->mes2, mes2, 120);
-
- return mapif_guild_notice(g);
-}
-
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
-int mapif_parse_GuildEmblem(int fd, int len, int guild_id, int dummy, const char *data) {
- struct guild *g;
-
- g = idb_get(guild_db, guild_id);
- if (g == NULL)
- return 0;
- memcpy(g->emblem_data, data, len);
- g->emblem_len = len;
- g->emblem_id++;
-
- return mapif_guild_emblem(g);
-}
-
-int mapif_parse_GuildCastleDataLoad(int fd, int castle_id, int index) {
- struct guild_castle *gc = idb_get(castle_db, castle_id);
-
- if (gc == NULL) {
- return mapif_guild_castle_dataload(castle_id, 0, 0);
- }
- switch(index) {
- case 1: return mapif_guild_castle_dataload(gc->castle_id, index, gc->guild_id);
- case 2: return mapif_guild_castle_dataload(gc->castle_id, index, gc->economy);
- case 3: return mapif_guild_castle_dataload(gc->castle_id, index, gc->defense);
- case 4: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerE);
- case 5: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerD);
- case 6: return mapif_guild_castle_dataload(gc->castle_id, index, gc->nextTime);
- case 7: return mapif_guild_castle_dataload(gc->castle_id, index, gc->payTime);
- case 8: return mapif_guild_castle_dataload(gc->castle_id, index, gc->createTime);
- case 9: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleC);
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- return mapif_guild_castle_dataload(gc->castle_id, index, gc->guardian[index-10].visible);
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- return mapif_guild_castle_dataload(gc->castle_id, index, gc->guardian[index-18].hp); // end additions [Valaris]
-
- default:
- ShowError("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-
- return 0;
-}
-
-int mapif_parse_GuildCastleDataSave(int fd, int castle_id, int index, int value) {
- struct guild_castle *gc= idb_get(castle_db, castle_id);
-
- if (gc == NULL) {
- return mapif_guild_castle_datasave(castle_id, index, value);
- }
- switch(index) {
- case 1:
- if (gc->guild_id != value) {
- int gid = (value) ? value : gc->guild_id;
- struct guild *g = idb_get(guild_db, gid);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", castle_id);
- }
- gc->guild_id = value;
- if(gc->guild_id == 0) {
- //Delete guardians.
- memset(&gc->guardian, 0, sizeof(gc->guardian));
- }
- break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- gc->guardian[index-10].visible = value; break;
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- gc->guardian[index-18].hp = value; break; // end additions [Valaris]
- default:
- ShowError("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-
- return mapif_guild_castle_datasave(gc->castle_id, index, value);
-}
-
-// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
-int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) {
- return guild_check_conflict(guild_id, account_id, char_id);
-}
-
-int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int len)
-{
- struct guild *g = idb_get(guild_db, guild_id);
- struct guild_member gm;
- int pos;
-
- if(g==NULL || g->guild_id<=0 || len > NAME_LENGTH)
- return 0;
-
- for (pos = 0; pos < g->max_member && strncmp(g->member[pos].name, name, len); pos++);
-
- if (pos == g->max_member)
- return 0; //Character not found??
-
- memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
- memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
- memcpy(&g->member[0], &gm, sizeof(struct guild_member));
-
- g->member[pos].position = g->member[0].position;
- g->member[0].position = 0; //Position 0: guild Master.
- strncpy(g->master, name, len);
- if (len < NAME_LENGTH)
- g->master[len] = '\0';
-
- ShowInfo("int_guild: Guildmaster Changed to %s (Guild %d - %s)\n",name, guild_id, g->name);
- return mapif_guild_master_changed(g, pos);
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_guild_parse_frommap(int fd) {
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)) {
- case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), (char*)RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break;
- case 0x3031: mapif_parse_GuildInfo(fd, RFIFOL(fd,2)); break;
- case 0x3032: mapif_parse_GuildAddMember(fd, RFIFOL(fd,4), (struct guild_member *)RFIFOP(fd,8)); break;
- case 0x3033: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
- case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), (const char*)RFIFOP(fd,15)); break;
- case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOW(fd,15), RFIFOW(fd,17)); break;
- case 0x3036: mapif_parse_BreakGuild(fd, RFIFOL(fd,2)); break;
- case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3038: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
- case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), (const char*)RFIFOP(fd,10), RFIFOW(fd,2)-10); break;
- case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), (const char*)RFIFOP(fd,18), RFIFOW(fd,2)-18); break;
- case 0x303B: mapif_parse_GuildPosition(fd, RFIFOL(fd,4), RFIFOL(fd,8), (struct guild_position *)RFIFOP(fd,12)); break;
- case 0x303C: mapif_parse_GuildSkillUp(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x303D: mapif_parse_GuildAlliance(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18)); break;
- case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), (const char*)RFIFOP(fd,6), (const char*)RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), (const char*)RFIFOP(fd,12)); break;
- case 0x3040: mapif_parse_GuildCastleDataLoad(fd, RFIFOW(fd,2), RFIFOB(fd,4)); break;
- case 0x3041: mapif_parse_GuildCastleDataSave(fd, RFIFOW(fd,2), RFIFOB(fd,4), RFIFOL(fd,5)); break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-// ƒ}ƒbƒvƒT[ƒo[‚ÌÚ‘±Žžˆ—
-int inter_guild_mapif_init(int fd) {
- return mapif_guild_castle_alldataload(fd);
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_guild_leave(int guild_id, int account_id, int char_id) {
- return mapif_parse_GuildLeave(-1, guild_id, account_id, char_id, 0, "** Character Deleted **");
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "char.h"
+#include "inter.h"
+#include "int_storage.h"
+#include "int_guild.h"
+
+char guild_txt[1024] = "save/guild.txt";
+char castle_txt[1024] = "save/castle.txt";
+
+#ifndef TXT_SQL_CONVERT
+static struct dbt *guild_db;
+static struct dbt *castle_db;
+
+static int guild_newid = 10000;
+
+static unsigned int guild_exp[100];
+
+int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes);
+int mapif_guild_broken(int guild_id, int flag);
+int guild_check_empty(struct guild *g);
+int guild_calcinfo(struct guild *g);
+int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len);
+int mapif_guild_info(int fd, struct guild *g);
+int guild_break_sub(DBKey key, void *data, va_list ap);
+
+// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
+int inter_guild_tostr(char *str, struct guild *g) {
+ int i, c, len;
+
+ // Šî–{ƒf[ƒ^
+ len = sprintf(str, "%d\t%s\t%s\t%d,%d,%u,%d,%d\t%s#\t%s#\t",
+ g->guild_id, g->name, g->master,
+ g->guild_lv, g->max_member, g->exp, g->skill_point, g->castle_id,
+ g->mes1, g->mes2);
+ // ƒƒ“ƒo[
+ for(i = 0; i < g->max_member; i++) {
+ struct guild_member *m = &g->member[i];
+ len += sprintf(str + len, "%d,%d,%d,%d,%d,%d,%d,%u,%d,%d\t%s\t",
+ m->account_id, m->char_id,
+ m->hair, m->hair_color, m->gender,
+ m->class_, m->lv, m->exp, m->exp_payper, m->position,
+ ((m->account_id > 0) ? m->name : "-"));
+ }
+ // –ðE
+ for(i = 0; i < MAX_GUILDPOSITION; i++) {
+ struct guild_position *p = &g->position[i];
+ len += sprintf(str + len, "%d,%d\t%s#\t", p->mode, p->exp_mode, p->name);
+ }
+ // ƒGƒ“ƒuƒŒƒ€
+ len += sprintf(str + len, "%d,%d,", g->emblem_len, g->emblem_id);
+ for(i = 0; i < g->emblem_len; i++) {
+ len += sprintf(str + len, "%02x", (unsigned char)(g->emblem_data[i]));
+ }
+ len += sprintf(str + len, "$\t");
+ // “¯–¿ƒŠƒXƒg
+ c = 0;
+ for(i = 0; i < MAX_GUILDALLIANCE; i++)
+ if (g->alliance[i].guild_id > 0)
+ c++;
+ len += sprintf(str + len, "%d\t", c);
+ for(i = 0; i < MAX_GUILDALLIANCE; i++) {
+ struct guild_alliance *a = &g->alliance[i];
+ if (a->guild_id > 0)
+ len += sprintf(str + len, "%d,%d\t%s\t", a->guild_id, a->opposition, a->name);
+ }
+ // ’Ç•úƒŠƒXƒg
+ c = 0;
+ for(i = 0; i < MAX_GUILDEXPULSION; i++)
+ if (g->expulsion[i].account_id > 0)
+ c++;
+ len += sprintf(str + len, "%d\t", c);
+ for(i = 0; i < MAX_GUILDEXPULSION; i++) {
+ struct guild_expulsion *e = &g->expulsion[i];
+ if (e->account_id > 0)
+ len += sprintf(str + len, "%d,%d,%d,%d\t%s\t%s\t%s#\t",
+ e->account_id, e->rsv1, e->rsv2, e->rsv3,
+ e->name, e->acc, e->mes );
+ }
+ // ƒMƒ‹ƒhƒXƒLƒ‹
+ for(i = 0; i < MAX_GUILDSKILL; i++) {
+ len += sprintf(str + len, "%d,%d ", g->skill[i].id, g->skill[i].lv);
+ }
+ len += sprintf(str + len, "\t");
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
+int inter_guild_fromstr(char *str, struct guild *g) {
+ int i, j, c;
+ unsigned int exp;
+ int tmp_int[16];
+ char tmp_str[4][256];
+ char tmp_str2[4096];
+ char *pstr;
+
+ // Šî–{ƒf[ƒ^
+ memset(g, 0, sizeof(struct guild));
+ if (sscanf(str, "%d\t%[^\t]\t%[^\t]\t%d,%d,%u,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0],
+ tmp_str[0], tmp_str[1],
+ &tmp_int[1], &tmp_int[2], &exp, &tmp_int[4], &tmp_int[5],
+ tmp_str[2], tmp_str[3]) < 8)
+ return 1;
+
+ g->guild_id = tmp_int[0];
+ g->guild_lv = tmp_int[1];
+ g->max_member = tmp_int[2];
+ g->exp = exp;
+ g->skill_point = tmp_int[4];
+#ifndef TXT_SQL_CONVERT
+ g->castle_id = tmp_int[5];
+#endif
+ memcpy(g->name, tmp_str[0], NAME_LENGTH-1);
+ memcpy(g->master, tmp_str[1], NAME_LENGTH-1);
+ memcpy(g->mes1, tmp_str[2], 60);
+ memcpy(g->mes2, tmp_str[3], 120);
+ g->mes1[strlen(g->mes1)-1] = 0;
+ g->mes2[strlen(g->mes2)-1] = 0;
+
+ for(j = 0; j < 6 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
+ str = strchr(str + 1, '\t');
+// printf("GuildBaseInfo OK\n");
+
+ // ƒƒ“ƒo[
+ for(i = 0; i < g->max_member; i++) {
+ struct guild_member *m = &g->member[i];
+ if (sscanf(str + 1, "%d,%d,%d,%d,%d,%d,%d,%u,%d,%d\t%[^\t]\t",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4],
+ &tmp_int[5], &tmp_int[6], &exp, &tmp_int[8], &tmp_int[9],
+ tmp_str[0]) < 11)
+ return 1;
+ m->account_id = tmp_int[0];
+ m->char_id = tmp_int[1];
+ m->hair = tmp_int[2];
+ m->hair_color = tmp_int[3];
+ m->gender = tmp_int[4];
+ m->class_ = tmp_int[5];
+ m->lv = tmp_int[6];
+ m->exp = exp;
+ m->exp_payper = tmp_int[8];
+ m->position = tmp_int[9];
+ memcpy(m->name, tmp_str[0], NAME_LENGTH-1);
+
+ for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
+ str = strchr(str + 1, '\t');
+ }
+// printf("GuildMemberInfo OK\n");
+ // –ðE
+ i = 0;
+ while (sscanf(str+1, "%d,%d%n", &tmp_int[0], &tmp_int[1], &j) == 2 && str[1+j] == '\t') {
+ struct guild_position *p = &g->position[i];
+ if (sscanf(str+1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
+ return 1;
+ p->mode = tmp_int[0];
+ p->exp_mode = tmp_int[1];
+ tmp_str[0][strlen(tmp_str[0])-1] = 0;
+ memcpy(p->name, tmp_str[0], NAME_LENGTH-1);
+
+ for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
+ str = strchr(str+1, '\t');
+ i++;
+ }
+// printf("GuildPositionInfo OK\n");
+ // ƒGƒ“ƒuƒŒƒ€
+ tmp_int[1] = 0;
+ if (sscanf(str + 1, "%d,%d,%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str2)< 3 &&
+ sscanf(str + 1, "%d,%[^\t]\t", &tmp_int[0], tmp_str2) < 2)
+ return 1;
+ g->emblem_len = tmp_int[0];
+ g->emblem_id = tmp_int[1];
+ for(i = 0, pstr = tmp_str2; i < g->emblem_len; i++, pstr += 2) {
+ int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0;
+ if (c1 >= '0' && c1 <= '9') x1 = c1 - '0';
+ if (c1 >= 'a' && c1 <= 'f') x1 = c1 - 'a' + 10;
+ if (c1 >= 'A' && c1 <= 'F') x1 = c1 - 'A' + 10;
+ if (c2 >= '0' && c2 <= '9') x2 = c2 - '0';
+ if (c2 >= 'a' && c2 <= 'f') x2 = c2 - 'a' + 10;
+ if (c2 >= 'A' && c2 <= 'F') x2 = c2 - 'A' + 10;
+ g->emblem_data[i] = (x1<<4) | x2;
+ }
+// printf("GuildEmblemInfo OK\n");
+ str=strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
+
+ // “¯–¿ƒŠƒXƒg
+ if (sscanf(str + 1, "%d\t", &c) < 1)
+ return 1;
+ str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
+ for(i = 0; i < c; i++) {
+ struct guild_alliance *a = &g->alliance[i];
+ if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
+ return 1;
+ a->guild_id = tmp_int[0];
+ a->opposition = tmp_int[1];
+ memcpy(a->name, tmp_str[0], NAME_LENGTH-1);
+
+ for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
+ str = strchr(str + 1, '\t');
+ }
+// printf("GuildAllianceInfo OK\n");
+ // ’Ç•úƒŠƒXƒg
+ if (sscanf(str+1, "%d\t", &c) < 1)
+ return 1;
+ str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
+ for(i = 0; i < c; i++) {
+ struct guild_expulsion *e = &g->expulsion[i];
+ if (sscanf(str + 1, "%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
+ tmp_str[0], tmp_str[1], tmp_str[2]) < 6)
+ return 1;
+ e->account_id = tmp_int[0];
+ e->rsv1 = tmp_int[1];
+ e->rsv2 = tmp_int[2];
+ e->rsv3 = tmp_int[3];
+ memcpy(e->name, tmp_str[0], NAME_LENGTH-1);
+ memcpy(e->acc, tmp_str[1], 24);
+ tmp_str[2][strlen(tmp_str[2])-1] = 0;
+ memcpy(e->mes, tmp_str[2], 40);
+
+ for(j = 0; j < 4 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
+ str = strchr(str + 1, '\t');
+ }
+// printf("GuildExplusionInfo OK\n");
+ // ƒMƒ‹ƒhƒXƒLƒ‹
+ for(i = 0; i < MAX_GUILDSKILL; i++) {
+ if (sscanf(str+1,"%d,%d ", &tmp_int[0], &tmp_int[1]) < 2)
+ break;
+ g->skill[i].id = tmp_int[0];
+ g->skill[i].lv = tmp_int[1];
+ str = strchr(str + 1, ' ');
+ }
+ str = strchr(str + 1, '\t');
+// printf("GuildSkillInfo OK\n");
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
+int inter_guildcastle_tostr(char *str, struct guild_castle *gc) {
+ int len;
+
+ len = sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", // added Guardian HP [Valaris]
+ gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE,
+ gc->triggerD, gc->nextTime, gc->payTime, gc->createTime, gc->visibleC,
+ gc->guardian[0].visible, gc->guardian[1].visible, gc->guardian[2].visible, gc->guardian[3].visible,
+ gc->guardian[4].visible, gc->guardian[5].visible, gc->guardian[6].visible, gc->guardian[7].visible,
+ gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp,
+ gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp);
+
+ return 0;
+}
+#endif ///TXT_SQL_CONVERT
+// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
+int inter_guildcastle_fromstr(char *str, struct guild_castle *gc) {
+ int tmp_int[26];
+
+ memset(gc, 0, sizeof(struct guild_castle));
+ // new structure of guild castle
+ if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
+ &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
+ &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20],
+ &tmp_int[21], &tmp_int[22], &tmp_int[23], &tmp_int[24], &tmp_int[25]) == 26) {
+ gc->castle_id = tmp_int[0];
+ gc->guild_id = tmp_int[1];
+ gc->economy = tmp_int[2];
+ gc->defense = tmp_int[3];
+ gc->triggerE = tmp_int[4];
+ gc->triggerD = tmp_int[5];
+ gc->nextTime = tmp_int[6];
+ gc->payTime = tmp_int[7];
+ gc->createTime = tmp_int[8];
+ gc->visibleC = tmp_int[9];
+ gc->guardian[0].visible = tmp_int[10];
+ gc->guardian[1].visible = tmp_int[11];
+ gc->guardian[2].visible = tmp_int[12];
+ gc->guardian[3].visible = tmp_int[13];
+ gc->guardian[4].visible = tmp_int[14];
+ gc->guardian[5].visible = tmp_int[15];
+ gc->guardian[6].visible = tmp_int[16];
+ gc->guardian[7].visible = tmp_int[17];
+ gc->guardian[0].hp = tmp_int[18];
+ gc->guardian[1].hp = tmp_int[19];
+ gc->guardian[2].hp = tmp_int[20];
+ gc->guardian[3].hp = tmp_int[21];
+ gc->guardian[4].hp = tmp_int[22];
+ gc->guardian[5].hp = tmp_int[23];
+ gc->guardian[6].hp = tmp_int[24];
+ gc->guardian[7].hp = tmp_int[25]; // end additions [Valaris]
+ // old structure of guild castle
+ } else if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
+ &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
+ &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17]) == 18) {
+ int i;
+
+ gc->castle_id = tmp_int[0];
+ gc->guild_id = tmp_int[1];
+ gc->economy = tmp_int[2];
+ gc->defense = tmp_int[3];
+ gc->triggerE = tmp_int[4];
+ gc->triggerD = tmp_int[5];
+ gc->nextTime = tmp_int[6];
+ gc->payTime = tmp_int[7];
+ gc->createTime = tmp_int[8];
+ gc->visibleC = tmp_int[9];
+ gc->guardian[0].visible = tmp_int[10];
+ gc->guardian[1].visible = tmp_int[11];
+ gc->guardian[2].visible = tmp_int[12];
+ gc->guardian[3].visible = tmp_int[13];
+ gc->guardian[4].visible = tmp_int[14];
+ gc->guardian[5].visible = tmp_int[15];
+ gc->guardian[6].visible = tmp_int[16];
+ gc->guardian[7].visible = tmp_int[17];
+
+ for (i = 0; i < MAX_GUARDIANS; i++)
+ {
+ if (gc->guardian[i].visible)
+ gc->guardian[i].hp = 15000 + 2000 * gc->defense;
+ else
+ gc->guardian[i].hp = 0;
+ }
+ } else {
+ return 1;
+ }
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// ƒMƒ‹ƒhŠÖ˜Aƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
+int inter_guild_readdb(void) {
+ int i;
+ FILE *fp;
+ char line[1024];
+ char path[1024];
+
+ sprintf(path, "%s%s", db_path, "/exp_guild.txt");
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ ShowError("can't read db/exp_guild.txt\n");
+ return 1;
+ }
+ i = 0;
+ while(fgets(line, sizeof(line)-1, fp) && i < 100){
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ guild_exp[i] = (unsigned int)atof(line);
+ i++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
+int inter_guild_init() {
+ char line[16384];
+ struct guild *g;
+ struct guild_castle *gc;
+ FILE *fp;
+ int i, j, c = 0;
+
+ inter_guild_readdb();
+
+ guild_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ castle_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if ((fp = fopen(guild_txt,"r")) == NULL)
+ return 1;
+ while(fgets(line, sizeof(line)-1, fp)) {
+ j = 0;
+ if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && guild_newid <= i) {
+ guild_newid = i;
+ continue;
+ }
+
+ g = (struct guild *) aCalloc(sizeof(struct guild), 1);
+ if(g == NULL){
+ ShowFatalError("int_guild: out of memory!\n");
+ exit(0);
+ }
+// memset(g, 0, sizeof(struct guild)); not needed...
+ if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) {
+ if (g->guild_id >= guild_newid)
+ guild_newid = g->guild_id + 1;
+ idb_put(guild_db, g->guild_id, g);
+ guild_check_empty(g);
+ guild_calcinfo(g);
+ } else {
+ ShowError("int_guild: broken data [%s] line %d\n", guild_txt, c);
+ aFree(g);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("int_guild: %s read done (%d guilds)\n", guild_txt, c);
+
+ c = 0;//ƒJƒEƒ“ƒ^‰Šú‰»
+
+ if ((fp = fopen(castle_txt, "r")) == NULL) {
+ return 1;
+ }
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+ gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
+ if(gc == NULL){
+ ShowFatalError("int_guild: out of memory!\n");
+ exit(0);
+ }
+// memset(gc, 0, sizeof(struct guild_castle)); No need...
+ if (inter_guildcastle_fromstr(line, gc) == 0) {
+ idb_put(castle_db, gc->castle_id, gc);
+ } else {
+ ShowError("int_guild: broken data [%s] line %d\n", castle_txt, c);
+ aFree(gc);
+ }
+ c++;
+ }
+
+ if (!c) {
+ ShowStatus(" %s - making Default Data...\n", castle_txt);
+ //ƒfƒtƒHƒ‹ƒgƒf[ƒ^‚ðì¬
+ for(i = 0; i < MAX_GUILDCASTLE; i++) {
+ gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
+ if (gc == NULL) {
+ ShowFatalError("int_guild: out of memory!\n");
+ exit(0);
+ }
+ gc->castle_id = i;
+ idb_put(castle_db, gc->castle_id, gc);
+ }
+ ShowStatus(" %s - making done\n",castle_txt);
+ return 0;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+void inter_guild_final() {
+ castle_db->destroy(castle_db, NULL);
+ guild_db->destroy(guild_db, NULL);
+ return;
+}
+
+struct guild *inter_guild_search(int guild_id) {
+ return idb_get(guild_db, guild_id);
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu—p
+int inter_guild_save_sub(DBKey key,void *data,va_list ap) {
+ char line[16384];
+ FILE *fp;
+
+ inter_guild_tostr(line,(struct guild *)data);
+ fp=va_arg(ap,FILE *);
+ fprintf(fp,"%s" RETCODE,line);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhéƒf[ƒ^‚̃Z[ƒu—p
+int inter_castle_save_sub(DBKey key, void *data, va_list ap) {
+ char line[16384];
+ FILE *fp;
+
+ inter_guildcastle_tostr(line, (struct guild_castle *)data);
+ fp = va_arg(ap, FILE *);
+ fprintf(fp, "%s" RETCODE, line);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu
+int inter_guild_save() {
+ FILE *fp;
+ int lock;
+
+ if ((fp = lock_fopen(guild_txt, &lock)) == NULL) {
+ ShowError("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt);
+ return 1;
+ }
+ guild_db->foreach(guild_db, inter_guild_save_sub, fp);
+// fprintf(fp, "%d\t%%newid%%\n", guild_newid);
+ lock_fclose(fp, guild_txt, &lock);
+// printf("int_guild: %s saved.\n", guild_txt);
+
+ if ((fp = lock_fopen(castle_txt,&lock)) == NULL) {
+ ShowError("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt);
+ return 1;
+ }
+ castle_db->foreach(castle_db, inter_castle_save_sub, fp);
+ lock_fclose(fp, castle_txt, &lock);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh–¼ŒŸõ—p
+int search_guildname_sub(DBKey key, void *data, va_list ap) {
+ struct guild *g = (struct guild *)data, **dst;
+ char *str;
+
+ str = va_arg(ap, char *);
+ dst = va_arg(ap, struct guild **);
+ if (strcmpi(g->name, str) == 0)
+ *dst = g;
+ return 0;
+}
+
+// ƒMƒ‹ƒh–¼ŒŸõ
+struct guild* search_guildname(char *str) {
+ struct guild *g = NULL;
+ guild_db->foreach(guild_db, search_guildname_sub, str, &g);
+ return g;
+}
+
+// ƒMƒ‹ƒh‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+int guild_check_empty(struct guild *g) {
+ int i;
+
+ for(i = 0; i < g->max_member; i++) {
+ if (g->member[i].account_id > 0) {
+ return 0;
+ }
+ }
+ // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
+ guild_db->foreach(guild_db, guild_break_sub, g->guild_id);
+ inter_guild_storage_delete(g->guild_id);
+ mapif_guild_broken(g->guild_id, 0);
+ idb_remove(guild_db, g->guild_id);
+ return 1;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
+int guild_check_conflict_sub(DBKey key, void *data, va_list ap) {
+ struct guild *g = (struct guild *)data;
+ int guild_id, account_id, char_id, i;
+
+ guild_id = va_arg(ap, int);
+ account_id = va_arg(ap, int);
+ char_id = va_arg(ap, int);
+
+ if (g->guild_id == guild_id) // –{—ˆ‚ÌŠ‘®‚È‚Ì‚Å–â‘è‚È‚µ
+ return 0;
+
+ for(i = 0; i < MAX_GUILD; i++) {
+ if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
+ // •Ê‚̃Mƒ‹ƒh‚É‹U‚ÌŠ‘®ƒf[ƒ^‚ª‚ ‚é‚Ì‚Å’E‘Þ
+ ShowWarning("int_guild: guild conflict! %d,%d %d!=%d\n", account_id, char_id, guild_id, g->guild_id);
+ mapif_parse_GuildLeave(-1, g->guild_id, account_id, char_id, 0, "**ƒf[ƒ^‹£‡**");
+ }
+ }
+
+ return 0;
+}
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
+int guild_check_conflict(int guild_id, int account_id, int char_id) {
+ guild_db->foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id);
+
+ return 0;
+}
+
+unsigned int guild_nextexp (int level)
+{
+ if (level == 0)
+ return 1;
+ if (level > 0 && level < 100)
+ return guild_exp[level-1];
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
+int guild_checkskill(struct guild *g, int id) {
+ int idx = id - GD_SKILLBASE;
+
+
+ if(idx < 0 || idx >= MAX_GUILDSKILL)
+
+ return 0;
+
+ return g->skill[idx].lv;
+}
+
+// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
+int guild_calcinfo(struct guild *g) {
+ int i, c;
+ unsigned int nextexp;
+ struct guild before = *g;
+
+ // ƒXƒLƒ‹ID‚ÌÝ’è
+ for(i = 0; i < MAX_GUILDSKILL; i++)
+ g->skill[i].id=i+GD_SKILLBASE;
+
+ // ƒMƒ‹ƒhƒŒƒxƒ‹
+ if (g->guild_lv <= 0)
+ g->guild_lv = 1;
+ nextexp = guild_nextexp(g->guild_lv);
+ if (nextexp > 0) {
+ while(g->exp >= nextexp && nextexp > 0) { //fixed guild exp overflow [Kevin]
+ g->exp -= nextexp;
+ g->guild_lv++;
+ g->skill_point++;
+ nextexp = guild_nextexp(g->guild_lv);
+ }
+ }
+
+ // ƒMƒ‹ƒh‚ÌŽŸ‚ÌŒoŒ±’l
+ g->next_exp = guild_nextexp(g->guild_lv);
+
+ // ƒƒ“ƒoãŒÀiƒMƒ‹ƒhŠg’£“K—pj
+ g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6; //Guild Extention skill - currently adds 6 to max per skill lv.
+ if(g->max_member > MAX_GUILD)
+ {
+ ShowError("Guild %d:%s has capacity for too many guild members (%d), max supported is %d\n", g->guild_id, g->name, g->max_member, MAX_GUILD);
+ g->max_member = MAX_GUILD;
+ }
+
+ // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
+ g->average_lv = 0;
+ g->connect_member = 0;
+ c = 0;
+ for(i = 0; i < g->max_member; i++) {
+ if (g->member[i].account_id > 0) {
+ g->average_lv += g->member[i].lv;
+ c++;
+ if (g->member[i].online > 0)
+ g->connect_member++;
+ }
+ }
+ if(c) g->average_lv /= c;
+
+ // ‘Sƒf[ƒ^‚ð‘—‚é•K—v‚ª‚ ‚è‚»‚¤
+ if (g->max_member != before.max_member ||
+ g->guild_lv != before.guild_lv ||
+ g->skill_point != before.skill_point) {
+ mapif_guild_info(-1, g);
+ return 1;
+ }
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ƒMƒ‹ƒh쬉”Û
+int mapif_guild_created(int fd, int account_id, struct guild *g) {
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0) = 0x3830;
+ WFIFOL(fd,2) = account_id;
+ if (g != NULL) {
+ WFIFOL(fd,6) = g->guild_id;
+ ShowInfo("Created Guild (%d %s)\n", g->guild_id, g->name);
+ }else{
+ WFIFOL(fd,6) = 0;
+ }
+ WFIFOSET(fd,10);
+ return 0;
+}
+
+// ƒMƒ‹ƒhî•ñŒ©‚‚©‚炸
+int mapif_guild_noinfo(int fd, int guild_id) {
+ WFIFOHEAD(fd, 8);
+ WFIFOW(fd,0) = 0x3831;
+ WFIFOW(fd,2) = 8;
+ WFIFOL(fd,4) = guild_id;
+ WFIFOSET(fd,8);
+ ShowNotice("int_guild: info not found %d\n", guild_id);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhî•ñ‚Ü‚Æ‚ß‘—‚è
+int mapif_guild_info(int fd, struct guild *g) {
+ unsigned char buf[8+sizeof(struct guild)];
+
+ WBUFW(buf,0) = 0x3831;
+ memcpy(buf + 4, g, sizeof(struct guild));
+ WBUFW(buf,2) = 4 + sizeof(struct guild);
+// printf("int_guild: sizeof(guild)=%d\n", sizeof(struct guild));
+ if (fd < 0)
+ mapif_sendall(buf, WBUFW(buf,2));
+ else
+ mapif_send(fd, buf, WBUFW(buf,2));
+// printf("int_guild: info %d %s\n", p->guild_id, p->name);
+
+ return 0;
+}
+
+// ƒƒ“ƒo’ljÁ‰Â”Û
+int mapif_guild_memberadded(int fd, int guild_id, int account_id, int char_id, int flag) {
+ WFIFOHEAD(fd, 15);
+ WFIFOW(fd,0) = 0x3832;
+ WFIFOL(fd,2) = guild_id;
+ WFIFOL(fd,6) = account_id;
+ WFIFOL(fd,10) = char_id;
+ WFIFOB(fd,14) = flag;
+ WFIFOSET(fd, 15);
+
+ return 0;
+}
+
+// ’E‘Þ/’Ç•ú’Ê’m
+int mapif_guild_leaved(int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes) {
+ unsigned char buf[79];
+
+ WBUFW(buf, 0) = 0x3834;
+ WBUFL(buf, 2) = guild_id;
+ WBUFL(buf, 6) = account_id;
+ WBUFL(buf,10) = char_id;
+ WBUFB(buf,14) = flag;
+ memcpy(WBUFP(buf,15), mes, 40);
+ memcpy(WBUFP(buf,55), name, NAME_LENGTH);
+ mapif_sendall(buf, 55+NAME_LENGTH);
+// mapif_sendall(buf, 79);
+ ShowInfo("Character left guild (Guild %d, %d - %s: %s)\n", guild_id, account_id, name, mes);
+
+ return 0;
+}
+
+// ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ÆLvXV’Ê’m
+int mapif_guild_memberinfoshort(struct guild *g, int idx) {
+ unsigned char buf[19];
+
+ WBUFW(buf, 0) = 0x3835;
+ WBUFL(buf, 2) = g->guild_id;
+ WBUFL(buf, 6) = g->member[idx].account_id;
+ WBUFL(buf,10) = g->member[idx].char_id;
+ WBUFB(buf,14) = (unsigned char)g->member[idx].online;
+ WBUFW(buf,15) = g->member[idx].lv;
+ WBUFW(buf,17) = g->member[idx].class_;
+ mapif_sendall(buf, 19);
+ return 0;
+}
+
+// ‰ðŽU’Ê’m
+int mapif_guild_broken(int guild_id, int flag) {
+ unsigned char buf[7];
+
+ WBUFW(buf,0) = 0x3836;
+ WBUFL(buf,2) = guild_id;
+ WBUFB(buf,6) = flag;
+ mapif_sendall(buf, 7);
+ ShowInfo("Guild Break (%d)\n", guild_id);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh“à”­Œ¾
+int mapif_guild_message(int guild_id, int account_id, char *mes, int len, int sfd) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x3837;
+ WBUFW(buf,2) = len + 12;
+ WBUFL(buf,4) = guild_id;
+ WBUFL(buf,8) = account_id;
+ memcpy(WBUFP(buf,12), mes, len);
+ mapif_sendallwos(sfd, buf, len + 12);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
+int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x3839;
+ WBUFW(buf,2) = len+10;
+ WBUFL(buf,4) = guild_id;
+ WBUFW(buf,8) = type;
+ memcpy(WBUFP(buf,10),data,len);
+ mapif_sendall(buf,len+10);
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
+int mapif_guild_memberinfochanged(int guild_id, int account_id, int char_id, int type, const void *data, int len) {
+ unsigned char buf[4096];
+
+ WBUFW(buf, 0) = 0x383a;
+ WBUFW(buf, 2) = len + 18;
+ WBUFL(buf, 4) = guild_id;
+ WBUFL(buf, 8) = account_id;
+ WBUFL(buf,12) = char_id;
+ WBUFW(buf,16) = type;
+ memcpy(WBUFP(buf,18), data, len);
+ mapif_sendall(buf,len+18);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv’Ê’m
+int mapif_guild_skillupack(int guild_id, int skill_num, int account_id) {
+ unsigned char buf[14];
+
+ WBUFW(buf, 0) = 0x383c;
+ WBUFL(buf, 2) = guild_id;
+ WBUFL(buf, 6) = skill_num;
+ WBUFL(buf,10) = account_id;
+ mapif_sendall(buf, 14);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
+int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2) {
+ unsigned char buf[67];
+
+ WBUFW(buf, 0) = 0x383d;
+ WBUFL(buf, 2) = guild_id1;
+ WBUFL(buf, 6) = guild_id2;
+ WBUFL(buf,10) = account_id1;
+ WBUFL(buf,14) = account_id2;
+ WBUFB(buf,18) = flag;
+ memcpy(WBUFP(buf,19), name1, NAME_LENGTH);
+ memcpy(WBUFP(buf,19+NAME_LENGTH), name2, NAME_LENGTH);
+ mapif_sendall(buf,19+2*NAME_LENGTH);
+/*
+ memcpy(WBUFP(buf,43), name2, NAME_LENGTH);
+ mapif_sendall(buf, 67);
+*/
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+int mapif_guild_position(struct guild *g, int idx) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x383b;
+ WBUFW(buf,2) = sizeof(struct guild_position) + 12;
+ WBUFL(buf,4) = g->guild_id;
+ WBUFL(buf,8) = idx;
+ memcpy(WBUFP(buf,12), &g->position[idx], sizeof(struct guild_position));
+ mapif_sendall(buf, WBUFW(buf,2));
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh’m•ÏX’Ê’m
+int mapif_guild_notice(struct guild *g) {
+ unsigned char buf[186];
+
+ WBUFW(buf,0) = 0x383e;
+ WBUFL(buf,2) = g->guild_id;
+ memcpy(WBUFP(buf,6), g->mes1, 60);
+ memcpy(WBUFP(buf,66), g->mes2, 120);
+ mapif_sendall(buf, 186);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
+int mapif_guild_emblem(struct guild *g) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x383f;
+ WBUFW(buf,2) = g->emblem_len + 12;
+ WBUFL(buf,4) = g->guild_id;
+ WBUFL(buf,8) = g->emblem_id;
+ memcpy(WBUFP(buf,12), g->emblem_data, g->emblem_len);
+ mapif_sendall(buf, WBUFW(buf,2));
+
+ return 0;
+}
+
+int mapif_guild_master_changed(struct guild *g, int position)
+{
+ unsigned char buf[12];
+ WBUFW(buf,0)=0x3843;
+ WBUFL(buf,2)=g->guild_id;
+ WBUFL(buf,6)=position;
+ mapif_sendall(buf,10);
+ return 0;
+}
+
+int mapif_guild_castle_dataload(int castle_id, int index, int value) {
+ unsigned char buf[9];
+
+ WBUFW(buf,0) = 0x3840;
+ WBUFW(buf,2) = castle_id;
+ WBUFB(buf,4) = index;
+ WBUFL(buf,5) = value;
+ mapif_sendall(buf,9);
+
+ return 0;
+}
+
+int mapif_guild_castle_datasave(int castle_id, int index, int value) {
+ unsigned char buf[9];
+
+ WBUFW(buf,0) = 0x3841;
+ WBUFW(buf,2) = castle_id;
+ WBUFB(buf,4) = index;
+ WBUFL(buf,5) = value;
+ mapif_sendall(buf,9);
+
+ return 0;
+}
+
+int mapif_guild_castle_alldataload_sub(DBKey key, void *data, va_list ap) {
+ int fd = va_arg(ap, int);
+ int *p = va_arg(ap, int*);
+
+ WFIFOHEAD(fd, sizeof(struct guild_castle));
+ memcpy(WFIFOP(fd,*p), (struct guild_castle*)data, sizeof(struct guild_castle));
+ (*p) += sizeof(struct guild_castle);
+
+ return 0;
+}
+
+int mapif_guild_castle_alldataload(int fd) {
+ int len = 4;
+
+ WFIFOHEAD(fd, 0);
+ WFIFOW(fd,0) = 0x3842;
+ castle_db->foreach(castle_db, mapif_guild_castle_alldataload_sub, fd, &len);
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd, len);
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+// ƒMƒ‹ƒh쬗v‹
+int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_member *master) {
+ struct guild *g;
+ int i;
+
+ for(i = 0; i < NAME_LENGTH && name[i]; i++) {
+ if (!(name[i] & 0xe0) || name[i] == 0x7f) {
+ ShowInfo("Create Guild: illegal guild name [%s]\n", name);
+ mapif_guild_created(fd, account_id, NULL);
+ return 0;
+ }
+ }
+
+ if ((g = search_guildname(name)) != NULL) {
+ ShowInfo("Create Guild: same name guild exists [%s]\n", name);
+ mapif_guild_created(fd, account_id, NULL);
+ return 0;
+ }
+
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ }
+
+ g = (struct guild *) aCalloc(sizeof(struct guild), 1);
+ if (g == NULL) {
+ ShowFatalError("int_guild: CreateGuild: out of memory !\n");
+ mapif_guild_created(fd, account_id, NULL);
+ exit(0);
+ }
+// memset(g, 0, sizeof(struct guild)); Meh...
+ g->guild_id = guild_newid++;
+ memcpy(g->name, name, NAME_LENGTH-1);
+ memcpy(g->master, master->name, NAME_LENGTH-1);
+ memcpy(&g->member[0], master, sizeof(struct guild_member));
+
+ g->position[0].mode = 0x11;
+ strcpy(g->position[ 0].name, "GuildMaster");
+ strcpy(g->position[MAX_GUILDPOSITION-1].name, "Newbie");
+ for(i = 1; i < MAX_GUILDPOSITION-1; i++)
+ sprintf(g->position[i].name, "Position %d", i + 1);
+
+ // ‚±‚±‚ŃMƒ‹ƒhî•ñŒvŽZ‚ª•K—v‚ÆŽv‚í‚ê‚é
+ g->max_member = 16;
+ g->average_lv = master->lv;
+ for(i = 0; i < MAX_GUILDSKILL; i++)
+ g->skill[i].id=i + GD_SKILLBASE;
+
+ idb_put(guild_db, g->guild_id, g);
+
+ mapif_guild_created(fd, account_id, g);
+ mapif_guild_info(fd, g);
+
+ if(log_inter)
+ inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
+ name, g->guild_id, master->name, master->account_id);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhî•ñ—v‹
+int mapif_parse_GuildInfo(int fd, int guild_id) {
+ struct guild *g;
+
+ g = idb_get(guild_db, guild_id);
+ if (g != NULL){
+ guild_calcinfo(g);
+ mapif_guild_info(fd, g);
+ } else
+ mapif_guild_noinfo(fd, guild_id);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
+int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m) {
+ struct guild *g;
+ int i;
+
+ g = idb_get(guild_db, guild_id);
+ if (g == NULL) {
+ mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
+ return 0;
+ }
+
+ for(i = 0; i < g->max_member; i++) {
+ if (g->member[i].account_id == 0) {
+ memcpy(&g->member[i], m, sizeof(struct guild_member));
+ mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 0);
+ guild_calcinfo(g);
+ mapif_guild_info(-1, g);
+
+ return 0;
+ }
+ }
+ mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh’E‘Þ/’Ç•ú—v‹
+int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes) {
+ struct guild *g = NULL;
+ int i, j;
+
+ g = idb_get(guild_db, guild_id);
+ if (g != NULL) {
+ for(i = 0; i < MAX_GUILD; i++) {
+ if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
+// printf("%d %d\n", i, (int)(&g->member[i]));
+// printf("%d %s\n", i, g->member[i].name);
+
+ if (flag) { // ’Ç•ú‚ÌꇒǕúƒŠƒXƒg‚É“ü‚ê‚é
+ for(j = 0; j < MAX_GUILDEXPULSION; j++) {
+ if (g->expulsion[j].account_id == 0)
+ break;
+ }
+ if (j == MAX_GUILDEXPULSION) { // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
+ for(j = 0; j < MAX_GUILDEXPULSION - 1; j++)
+ g->expulsion[j] = g->expulsion[j+1];
+ j = MAX_GUILDEXPULSION - 1;
+ }
+ g->expulsion[j].account_id = account_id;
+ memcpy(g->expulsion[j].acc, "dummy", NAME_LENGTH-1);
+ memcpy(g->expulsion[j].name, g->member[i].name, NAME_LENGTH-1);
+ memcpy(g->expulsion[j].mes, mes, 40);
+ }
+
+ mapif_guild_leaved(guild_id, account_id, char_id, flag, g->member[i].name, mes);
+// printf("%d %d\n", i, (int)(&g->member[i]));
+// printf("%d %s\n", i, (&g->member[i])->name);
+ memset(&g->member[i], 0, sizeof(struct guild_member));
+
+ if (guild_check_empty(g) == 0)
+ mapif_guild_info(-1,g);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
+
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+// ƒIƒ“ƒ‰ƒCƒ“/LvXV
+int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class_) {
+ struct guild *g;
+ int i, alv, c;
+
+ g = idb_get(guild_db, guild_id);
+ if (g == NULL)
+ return 0;
+
+ g->connect_member = 0;
+
+ alv = 0;
+ c = 0;
+ for(i = 0; i < MAX_GUILD; i++) {
+ if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
+ g->member[i].online = online;
+ g->member[i].lv = lv;
+ g->member[i].class_ = class_;
+ mapif_guild_memberinfoshort(g, i);
+ }
+ if (g->member[i].account_id > 0) {
+ alv += g->member[i].lv;
+ c++;
+ }
+ if (g->member[i].online)
+ g->connect_member++;
+ }
+
+ if (c)
+ // •½‹ÏƒŒƒxƒ‹
+ g->average_lv = alv / c;
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh‰ðŽUˆ——pi“¯–¿/“G‘΂ð‰ðœj
+int guild_break_sub(DBKey key, void *data, va_list ap) {
+ struct guild *g = (struct guild *)data;
+ int guild_id = va_arg(ap, int);
+ int i;
+
+ for(i = 0; i < MAX_GUILDALLIANCE; i++) {
+ if (g->alliance[i].guild_id == guild_id)
+ g->alliance[i].guild_id = 0;
+ }
+ return 0;
+}
+
+// ƒMƒ‹ƒh‰ðŽU—v‹
+int mapif_parse_BreakGuild(int fd, int guild_id) {
+ struct guild *g;
+
+ g = idb_get(guild_db, guild_id);
+ if(g == NULL)
+ return 0;
+
+ guild_db->foreach(guild_db, guild_break_sub, guild_id);
+ inter_guild_storage_delete(guild_id);
+ mapif_guild_broken(guild_id, 0);
+
+ if(log_inter)
+ inter_log("guild %s (id=%d) broken" RETCODE, g->name, guild_id);
+
+ idb_remove(guild_db, guild_id);
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒƒbƒZ[ƒW‘—M
+int mapif_parse_GuildMessage(int fd, int guild_id, int account_id, char *mes, int len) {
+ return mapif_guild_message(guild_id, account_id, mes, len, fd);
+}
+
+// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
+int mapif_parse_GuildBasicInfoChange(int fd, int guild_id, int type, const char *data, int len) {
+ struct guild *g;
+ short dw = *((short *)data);
+
+ g = idb_get(guild_db, guild_id);
+ if (g == NULL)
+ return 0;
+
+ switch(type) {
+ case GBI_GUILDLV:
+ if (dw > 0 && g->guild_lv + dw <= 50) {
+ g->guild_lv+=dw;
+ g->skill_point+=dw;
+ } else if (dw < 0 && g->guild_lv + dw >= 1)
+ g->guild_lv += dw;
+ mapif_guild_info(-1, g);
+ return 0;
+ default:
+ ShowError("int_guild: GuildBasicInfoChange: Unknown type %d\n", type);
+ break;
+ }
+ mapif_guild_basicinfochanged(guild_id, type, data, len);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒƒ“ƒoƒf[ƒ^•ÏX—v‹
+int mapif_parse_GuildMemberInfoChange(int fd, int guild_id, int account_id, int char_id, int type, const char *data, int len) {
+ int i;
+ struct guild *g;
+
+ g = idb_get(guild_db, guild_id);
+ if(g == NULL)
+ return 0;
+
+ for(i = 0; i < g->max_member; i++)
+ if (g->member[i].account_id == account_id && g->member[i].char_id == char_id)
+ break;
+ if (i == g->max_member) {
+ ShowWarning("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", account_id, char_id, guild_id, g->name);
+ return 0;
+ }
+ switch(type) {
+ case GMI_POSITION: // –ðE
+ g->member[i].position = *((int *)data);
+ break;
+ case GMI_EXP: // EXP
+ {
+ unsigned int exp, old_exp=g->member[i].exp;
+ g->member[i].exp=*((unsigned int *)data);
+ if (g->member[i].exp > old_exp)
+ {
+ exp = g->member[i].exp - old_exp;
+ if (guild_exp_rate != 100)
+ exp = exp*guild_exp_rate/100;
+ if (exp > UINT_MAX - g->exp)
+ g->exp = UINT_MAX;
+ else
+ g->exp+=exp;
+ guild_calcinfo(g);
+ mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
+ }
+ break;
+ }
+ case GMI_HAIR:
+ {
+ g->member[i].hair=*((int *)data);
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ break;
+ }
+ case GMI_HAIR_COLOR:
+ {
+ g->member[i].hair_color=*((int *)data);
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ break;
+ }
+ case GMI_GENDER:
+ {
+ g->member[i].gender=*((int *)data);
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ break;
+ }
+ case GMI_CLASS:
+ {
+ g->member[i].class_=*((int *)data);
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ break;
+ }
+ case GMI_LEVEL:
+ {
+ g->member[i].lv=*((int *)data);
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ break;
+ }
+
+ default:
+ ShowError("int_guild: GuildMemberInfoChange: Unknown type %d\n", type);
+ break;
+ }
+ mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len);
+
+ return 0;
+}
+
+int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender)
+{
+ return mapif_parse_GuildMemberInfoChange(0, guild_id, account_id, char_id, GMI_GENDER, (const char*)&gender, sizeof(gender));
+}
+
+// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
+int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) {
+ struct guild *g = idb_get(guild_db, guild_id);
+
+ if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) {
+ return 0;
+ }
+ memcpy(&g->position[idx], p, sizeof(struct guild_position));
+ mapif_guild_position(g, idx);
+ ShowInfo("int_guild: position [%d] changed\n", idx);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
+int mapif_parse_GuildSkillUp(int fd, int guild_id, int skill_num, int account_id) {
+ struct guild *g = idb_get(guild_db, guild_id);
+ int idx = skill_num - GD_SKILLBASE;
+
+ if (g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
+ return 0;
+
+ if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) {
+ g->skill[idx].lv++;
+ g->skill_point--;
+ if (guild_calcinfo(g) == 0)
+ mapif_guild_info(-1, g);
+ mapif_guild_skillupack(guild_id, skill_num, account_id);
+ }
+
+ return 0;
+}
+
+//Manual deletion of an alliance when partnering guild does not exists. [Skotlex]
+static int mapif_parse_GuildDeleteAlliance(struct guild *g, int guild_id, int account_id1, int account_id2, int flag)
+{
+ int i;
+ char name[NAME_LENGTH];
+ for(i=0;i<MAX_GUILDALLIANCE;i++)
+ if(g->alliance[i].guild_id == guild_id)
+ {
+ strcpy(name, g->alliance[i].name);
+ g->alliance[i].guild_id=0;
+ break;
+ }
+ if (i == MAX_GUILDALLIANCE)
+ return -1;
+
+ mapif_guild_alliance(g->guild_id,guild_id,account_id1,account_id2,flag,g->name,name);
+ return 0;
+}
+// ƒMƒ‹ƒh“¯–¿—v‹
+int mapif_parse_GuildAlliance(int fd, int guild_id1, int guild_id2, int account_id1, int account_id2, int flag) {
+ struct guild *g[2];
+ int j, i;
+
+ g[0] = idb_get(guild_db, guild_id1);
+ g[1] = idb_get(guild_db, guild_id2);
+
+ if(g[0] && g[1]==NULL && (flag&0x8)) //Requested to remove an alliance with a not found guild.
+ return mapif_parse_GuildDeleteAlliance(g[0], guild_id2,
+ account_id1, account_id2, flag); //Try to do a manual removal of said guild.
+
+ if (g[0] == NULL || g[1] == NULL)
+ return 0;
+
+ if (!(flag & 0x8)) {
+ for(i = 0; i < 2 - (flag & 1); i++) {
+ for(j = 0; j < MAX_GUILDALLIANCE; j++)
+ if (g[i]->alliance[j].guild_id == 0) {
+ g[i]->alliance[j].guild_id = g[1-i]->guild_id;
+ memcpy(g[i]->alliance[j].name, g[1-i]->name, NAME_LENGTH-1);
+ g[i]->alliance[j].opposition = flag & 1;
+ break;
+ }
+ }
+ } else { // ŠÖŒW‰ðÁ
+ for(i = 0; i < 2 - (flag & 1); i++) {
+ for(j = 0; j < MAX_GUILDALLIANCE; j++)
+ if (g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag & 1)) {
+ g[i]->alliance[j].guild_id = 0;
+ break;
+ }
+ }
+ }
+ mapif_guild_alliance(guild_id1, guild_id2, account_id1, account_id2, flag, g[0]->name, g[1]->name);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh’m•ÏX—v‹
+int mapif_parse_GuildNotice(int fd, int guild_id, const char *mes1, const char *mes2) {
+ struct guild *g;
+
+ g = idb_get(guild_db, guild_id);
+ if (g == NULL)
+ return 0;
+ memcpy(g->mes1, mes1, 60);
+ memcpy(g->mes2, mes2, 120);
+
+ return mapif_guild_notice(g);
+}
+
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
+int mapif_parse_GuildEmblem(int fd, int len, int guild_id, int dummy, const char *data) {
+ struct guild *g;
+
+ g = idb_get(guild_db, guild_id);
+ if (g == NULL)
+ return 0;
+ memcpy(g->emblem_data, data, len);
+ g->emblem_len = len;
+ g->emblem_id++;
+
+ return mapif_guild_emblem(g);
+}
+
+int mapif_parse_GuildCastleDataLoad(int fd, int castle_id, int index) {
+ struct guild_castle *gc = idb_get(castle_db, castle_id);
+
+ if (gc == NULL) {
+ return mapif_guild_castle_dataload(castle_id, 0, 0);
+ }
+ switch(index) {
+ case 1: return mapif_guild_castle_dataload(gc->castle_id, index, gc->guild_id);
+ case 2: return mapif_guild_castle_dataload(gc->castle_id, index, gc->economy);
+ case 3: return mapif_guild_castle_dataload(gc->castle_id, index, gc->defense);
+ case 4: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerE);
+ case 5: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerD);
+ case 6: return mapif_guild_castle_dataload(gc->castle_id, index, gc->nextTime);
+ case 7: return mapif_guild_castle_dataload(gc->castle_id, index, gc->payTime);
+ case 8: return mapif_guild_castle_dataload(gc->castle_id, index, gc->createTime);
+ case 9: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleC);
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ return mapif_guild_castle_dataload(gc->castle_id, index, gc->guardian[index-10].visible);
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ return mapif_guild_castle_dataload(gc->castle_id, index, gc->guardian[index-18].hp); // end additions [Valaris]
+
+ default:
+ ShowError("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+
+ return 0;
+}
+
+int mapif_parse_GuildCastleDataSave(int fd, int castle_id, int index, int value) {
+ struct guild_castle *gc= idb_get(castle_db, castle_id);
+
+ if (gc == NULL) {
+ return mapif_guild_castle_datasave(castle_id, index, value);
+ }
+ switch(index) {
+ case 1:
+ if (gc->guild_id != value) {
+ int gid = (value) ? value : gc->guild_id;
+ struct guild *g = idb_get(guild_db, gid);
+ if(log_inter)
+ inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
+ (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", castle_id);
+ }
+ gc->guild_id = value;
+ if(gc->guild_id == 0) {
+ //Delete guardians.
+ memset(&gc->guardian, 0, sizeof(gc->guardian));
+ }
+ break;
+ case 2: gc->economy = value; break;
+ case 3: gc->defense = value; break;
+ case 4: gc->triggerE = value; break;
+ case 5: gc->triggerD = value; break;
+ case 6: gc->nextTime = value; break;
+ case 7: gc->payTime = value; break;
+ case 8: gc->createTime = value; break;
+ case 9: gc->visibleC = value; break;
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ gc->guardian[index-10].visible = value; break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ gc->guardian[index-18].hp = value; break; // end additions [Valaris]
+ default:
+ ShowError("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+
+ return mapif_guild_castle_datasave(gc->castle_id, index, value);
+}
+
+// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
+int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) {
+ return guild_check_conflict(guild_id, account_id, char_id);
+}
+
+int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int len)
+{
+ struct guild *g = idb_get(guild_db, guild_id);
+ struct guild_member gm;
+ int pos;
+
+ if(g==NULL || g->guild_id<=0 || len > NAME_LENGTH)
+ return 0;
+
+ for (pos = 0; pos < g->max_member && strncmp(g->member[pos].name, name, len); pos++);
+
+ if (pos == g->max_member)
+ return 0; //Character not found??
+
+ memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
+ memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
+ memcpy(&g->member[0], &gm, sizeof(struct guild_member));
+
+ g->member[pos].position = g->member[0].position;
+ g->member[0].position = 0; //Position 0: guild Master.
+ strncpy(g->master, name, len);
+ if (len < NAME_LENGTH)
+ g->master[len] = '\0';
+
+ ShowInfo("int_guild: Guildmaster Changed to %s (Guild %d - %s)\n",name, guild_id, g->name);
+ return mapif_guild_master_changed(g, pos);
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_guild_parse_frommap(int fd) {
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)) {
+ case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), (char*)RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break;
+ case 0x3031: mapif_parse_GuildInfo(fd, RFIFOL(fd,2)); break;
+ case 0x3032: mapif_parse_GuildAddMember(fd, RFIFOL(fd,4), (struct guild_member *)RFIFOP(fd,8)); break;
+ case 0x3033: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
+ case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), (const char*)RFIFOP(fd,15)); break;
+ case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOW(fd,15), RFIFOW(fd,17)); break;
+ case 0x3036: mapif_parse_BreakGuild(fd, RFIFOL(fd,2)); break;
+ case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
+ case 0x3038: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
+ case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), (const char*)RFIFOP(fd,10), RFIFOW(fd,2)-10); break;
+ case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), (const char*)RFIFOP(fd,18), RFIFOW(fd,2)-18); break;
+ case 0x303B: mapif_parse_GuildPosition(fd, RFIFOL(fd,4), RFIFOL(fd,8), (struct guild_position *)RFIFOP(fd,12)); break;
+ case 0x303C: mapif_parse_GuildSkillUp(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x303D: mapif_parse_GuildAlliance(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18)); break;
+ case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), (const char*)RFIFOP(fd,6), (const char*)RFIFOP(fd,66)); break;
+ case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), (const char*)RFIFOP(fd,12)); break;
+ case 0x3040: mapif_parse_GuildCastleDataLoad(fd, RFIFOW(fd,2), RFIFOB(fd,4)); break;
+ case 0x3041: mapif_parse_GuildCastleDataSave(fd, RFIFOW(fd,2), RFIFOB(fd,4), RFIFOL(fd,5)); break;
+
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+// ƒ}ƒbƒvƒT[ƒo[‚ÌÚ‘±Žžˆ—
+int inter_guild_mapif_init(int fd) {
+ return mapif_guild_castle_alldataload(fd);
+}
+
+// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
+int inter_guild_leave(int guild_id, int account_id, int char_id) {
+ return mapif_parse_GuildLeave(-1, guild_id, account_id, char_id, 0, "** Character Deleted **");
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/int_guild.h b/src/char/int_guild.h
index 2cd26a516..616384b94 100644
--- a/src/char/int_guild.h
+++ b/src/char/int_guild.h
@@ -1,22 +1,22 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_init(void);
-void inter_guild_final(void);
-int inter_guild_save(void);
-int inter_guild_parse_frommap(int fd);
-struct guild *inter_guild_search(int guild_id);
-int inter_guild_mapif_init(int fd);
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
-
-extern char guild_txt[1024];
-extern char castle_txt[1024];
-
-//For the TXT->SQL converter
-int inter_guild_fromstr(char *str, struct guild *g);
-int inter_guildcastle_fromstr(char *str, struct guild_castle *gc);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_GUILD_H_
+#define _INT_GUILD_H_
+
+int inter_guild_init(void);
+void inter_guild_final(void);
+int inter_guild_save(void);
+int inter_guild_parse_frommap(int fd);
+struct guild *inter_guild_search(int guild_id);
+int inter_guild_mapif_init(int fd);
+int inter_guild_leave(int guild_id,int account_id,int char_id);
+int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
+
+extern char guild_txt[1024];
+extern char castle_txt[1024];
+
+//For the TXT->SQL converter
+int inter_guild_fromstr(char *str, struct guild *g);
+int inter_guildcastle_fromstr(char *str, struct guild_castle *gc);
+#endif
diff --git a/src/char/int_homun.c b/src/char/int_homun.c
index 3de472d74..a07378c2a 100644
--- a/src/char/int_homun.c
+++ b/src/char/int_homun.c
@@ -1,371 +1,371 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "char.h"
-#include "inter.h"
-#include "int_homun.h"
-
-char homun_txt[1024]="save/homun.txt";
-
-static struct dbt *homun_db;
-static int homun_newid = 100;
-
-int inter_homun_tostr(char *str,struct s_homunculus *p)
-{
- int i;
-
- str+=sprintf(str,"%d,%d\t%s\t%d,%d,%d,%d,%d,"
- "%u,%d,%d,%d,"
- "%u,%d,%d,"
- "%d,%d,%d,%d,%d,%d\t",
- p->hom_id, p->class_, p->name,
- p->char_id, p->hp, p->max_hp, p->sp, p->max_sp,
- p->intimacy, p->hunger, p->skillpts, p->level,
- p->exp, p->rename_flag, p->vaporize,
- p->str, p->agi, p->vit, p->int_, p->dex, p->luk);
-
- for (i = 0; i < MAX_HOMUNSKILL; i++)
- {
- if (p->hskill[i].id && !p->hskill[i].flag)
- str+=sprintf(str,"%d,%d,", p->hskill[i].id, p->hskill[i].lv);
- }
-
- return 0;
-}
-
-int inter_homun_fromstr(char *str,struct s_homunculus *p)
-{
- int i, next, len;
- int tmp_int[25];
- unsigned int tmp_uint[5];
- char tmp_str[256];
-
- memset(p,0,sizeof(struct s_homunculus));
-
- i=sscanf(str,"%d,%d\t%127[^\t]\t%d,%d,%d,%d,%d,"
- "%u,%d,%d,%d,"
- "%u,%d,%d,"
- "%d,%d,%d,%d,%d,%d\t%n",
- &tmp_int[0],&tmp_int[1],tmp_str,
- &tmp_int[2],&tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],
- &tmp_uint[0],&tmp_int[7],&tmp_int[8],&tmp_int[9],
- &tmp_uint[1],&tmp_int[10],&tmp_int[11],
- &tmp_int[12],&tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],
- &next);
-
- if(i!=21)
- return 1;
-
- p->hom_id = tmp_int[0];
- p->class_ = tmp_int[1];
- memcpy(p->name, tmp_str, NAME_LENGTH-1);
-
- p->char_id = tmp_int[2];
- p->hp = tmp_int[3];
- p->max_hp = tmp_int[4];
- p->sp = tmp_int[5];
- p->max_sp = tmp_int[6];
-
- p->intimacy = tmp_uint[0];
- p->hunger = tmp_int[7];
- p->skillpts = tmp_int[8];
- p->level = tmp_int[9];
-
- p->exp = tmp_uint[1];
- p->rename_flag = tmp_int[10];
- p->vaporize = tmp_int[11];
-
- p->str = tmp_int[12];
- p->agi = tmp_int[13];
- p->vit = tmp_int[14];
- p->int_= tmp_int[15];
- p->dex = tmp_int[16];
- p->luk = tmp_int[17];
-
- //Read skills.
- while(str[next] && str[next] != '\n' && str[next] != '\r') {
- if (sscanf(str+next, "%d,%d,%n", &tmp_int[0], &tmp_int[1], &len) != 2)
- return 2;
-
- if (tmp_int[0] > HM_SKILLBASE && tmp_int[0] <= HM_SKILLBASE+MAX_HOMUNSKILL)
- {
- i = tmp_int[0] - HM_SKILLBASE -1;
- p->hskill[i].id = tmp_int[0];
- p->hskill[i].lv = tmp_int[1];
- } else
- ShowError("Read Homun: Unsupported Skill ID %d for homunculus (Homun ID=%d\n", tmp_int[0], p->hom_id);
- next += len;
- if (str[next] == ' ')
- next++;
- }
- return 0;
-}
-
-int inter_homun_init()
-{
- char line[8192];
- struct s_homunculus *p;
- FILE *fp;
- int c=0;
-
- homun_db= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if( (fp=fopen(homun_txt,"r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- p = (struct s_homunculus*)aCalloc(sizeof(struct s_homunculus), 1);
- if(p==NULL){
- ShowFatalError("int_homun: out of memory!\n");
- exit(0);
- }
- if(inter_homun_fromstr(line,p)==0 && p->hom_id>0){
- if( p->hom_id >= homun_newid)
- homun_newid=p->hom_id+1;
- idb_put(homun_db,p->hom_id,p);
- }else{
- ShowError("int_homun: broken data [%s] line %d\n",homun_txt,c);
- aFree(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_homun: %s read done (%d homuns)\n",homun_txt,c);
- return 0;
-}
-
-void inter_homun_final()
-{
- homun_db->destroy(homun_db, NULL);
- return;
-}
-
-int inter_homun_save_sub(DBKey key,void *data,va_list ap)
-{
- char line[8192];
- FILE *fp;
- inter_homun_tostr(line,(struct s_homunculus *)data);
- fp=va_arg(ap,FILE *);
- fprintf(fp,"%s" RETCODE,line);
- return 0;
-}
-
-int inter_homun_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(homun_txt,&lock))==NULL ){
- ShowError("int_homun: cant write [%s] !!! data is lost !!!\n",homun_txt);
- return 1;
- }
- homun_db->foreach(homun_db,inter_homun_save_sub,fp);
- lock_fclose(fp,homun_txt,&lock);
-// printf("int_homun: %s saved.\n",homun_txt);
- return 0;
-}
-
-int inter_homun_delete(int hom_id)
-{
- struct s_homunculus *p;
- p = idb_get(homun_db,hom_id);
- if( p == NULL)
- return 0;
- idb_remove(homun_db,hom_id);
- ShowInfo("Deleted homun (hom_id: %d)\n",hom_id);
- return 1;
-}
-
-int mapif_homun_created(int fd,int account_id, struct s_homunculus *p)
-{
- WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
- WFIFOW(fd, 0) =0x3890;
- WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
- WFIFOL(fd,4) = account_id;
- WFIFOB(fd,8)= p->hom_id?1:0;
- memcpy(WFIFOP(fd,9), p, sizeof(struct s_homunculus));
- WFIFOSET(fd, WFIFOW(fd,2));
- return 0;
-}
-
-int mapif_homun_info(int fd,int account_id,struct s_homunculus *p)
-{
- WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
- WFIFOW(fd,0) = 0x3891;
- WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
- WFIFOL(fd,4) = account_id;
- WFIFOB(fd,8) = 1; // account loaded with success
-
- memcpy(WFIFOP(fd,9), p, sizeof(struct s_homunculus));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-int mapif_homun_noinfo(int fd,int account_id)
-{
- WFIFOHEAD(fd,sizeof(struct s_homunculus) + 9);
- WFIFOW(fd,0)=0x3891;
- WFIFOW(fd,2)=sizeof(struct s_homunculus) + 9;
- WFIFOL(fd,4)=account_id;
- WFIFOB(fd,8)=0;
- memset(WFIFOP(fd,9),0,sizeof(struct s_homunculus));
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int mapif_save_homun_ack(int fd,int account_id,int flag)
-{
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0)=0x3892;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=flag;
- WFIFOSET(fd,7);
- return 0;
-}
-
-int mapif_delete_homun_ack(int fd,int flag)
-{
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0)=0x3893;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,3);
- return 0;
-}
-
-int mapif_rename_homun_ack(int fd, int account_id, int char_id, int flag, char *name){
- WFIFOHEAD(fd, NAME_LENGTH+12);
- WFIFOW(fd, 0) =0x3894;
- WFIFOL(fd, 2) =account_id;
- WFIFOL(fd, 6) =char_id;
- WFIFOB(fd, 10) =flag;
- memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
- WFIFOSET(fd, NAME_LENGTH+12);
-
- return 0;
-}
-
-int mapif_create_homun(int fd)
-{
- struct s_homunculus *p;
- RFIFOHEAD(fd);
- p= (struct s_homunculus *) aCalloc(sizeof(struct s_homunculus), 1);
- if(p==NULL){
- ShowFatalError("int_homun: out of memory !\n");
- //Sending the received data will pass hom_id == 0 <- fail.
- mapif_homun_created(fd,RFIFOL(fd,4),(struct s_homunculus*)RFIFOP(fd,8));
- return 0;
- }
- memcpy(p, RFIFOP(fd,8), sizeof(struct s_homunculus));
- p->hom_id = homun_newid++; //New ID
- idb_put(homun_db,p->hom_id,p);
- mapif_homun_created(fd,RFIFOL(fd,4),p);
- return 0;
-}
-
-int mapif_load_homun(int fd)
-{
- struct s_homunculus *p;
- int account_id;
- RFIFOHEAD(fd);
- account_id = RFIFOL(fd,2);
-
- p= idb_get(homun_db,RFIFOL(fd,6));
- if(p==NULL) {
- mapif_homun_noinfo(fd,account_id);
- return 0;
- }
- mapif_homun_info(fd,account_id,p);
- return 0;
-}
-
-static void* create_homun(DBKey key, va_list args) {
- struct s_homunculus *p;
- p=(struct s_homunculus *)aCalloc(sizeof(struct s_homunculus),1);
- p->hom_id = key.i;
- return p;
-}
-int mapif_save_homun(int fd,int account_id,struct s_homunculus *data)
-{
- struct s_homunculus *p;
- int hom_id;
-
- if (data->hom_id == 0)
- data->hom_id = homun_newid++;
- hom_id = data->hom_id;
- p= idb_ensure(homun_db,hom_id,create_homun);
- memcpy(p,data,sizeof(struct s_homunculus));
- mapif_save_homun_ack(fd,account_id,1);
- return 0;
-}
-
-int mapif_delete_homun(int fd,int hom_id)
-{
- mapif_delete_homun_ack(fd,inter_homun_delete(hom_id));
- return 0;
-}
-
-int mapif_rename_homun(int fd, int account_id, int char_id, char *name){
- int i;
-
- // Check Authorised letters/symbols in the name of the homun
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- }
-
- mapif_rename_homun_ack(fd, account_id, char_id, 1, name);
- return 0;
-}
-
-int mapif_parse_SaveHomun(int fd)
-{
- RFIFOHEAD(fd);
- mapif_save_homun(fd,RFIFOL(fd,4),(struct s_homunculus *)RFIFOP(fd,8));
- return 0;
-}
-
-int mapif_parse_DeleteHomun(int fd)
-{
- RFIFOHEAD(fd);
- mapif_delete_homun(fd,RFIFOL(fd,2));
- return 0;
-}
-
-int mapif_parse_RenameHomun(int fd){
- RFIFOHEAD(fd);
- mapif_rename_homun(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
- return 0;
-}
-
-int inter_homun_parse_frommap(int fd)
-{
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)){
- case 0x3090: mapif_create_homun(fd); break;
- case 0x3091: mapif_load_homun(fd); break;
- case 0x3092: mapif_parse_SaveHomun(fd); break;
- case 0x3093: mapif_parse_DeleteHomun(fd); break;
- case 0x3094: mapif_parse_RenameHomun(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "char.h"
+#include "inter.h"
+#include "int_homun.h"
+
+char homun_txt[1024]="save/homun.txt";
+
+static struct dbt *homun_db;
+static int homun_newid = 100;
+
+int inter_homun_tostr(char *str,struct s_homunculus *p)
+{
+ int i;
+
+ str+=sprintf(str,"%d,%d\t%s\t%d,%d,%d,%d,%d,"
+ "%u,%d,%d,%d,"
+ "%u,%d,%d,"
+ "%d,%d,%d,%d,%d,%d\t",
+ p->hom_id, p->class_, p->name,
+ p->char_id, p->hp, p->max_hp, p->sp, p->max_sp,
+ p->intimacy, p->hunger, p->skillpts, p->level,
+ p->exp, p->rename_flag, p->vaporize,
+ p->str, p->agi, p->vit, p->int_, p->dex, p->luk);
+
+ for (i = 0; i < MAX_HOMUNSKILL; i++)
+ {
+ if (p->hskill[i].id && !p->hskill[i].flag)
+ str+=sprintf(str,"%d,%d,", p->hskill[i].id, p->hskill[i].lv);
+ }
+
+ return 0;
+}
+
+int inter_homun_fromstr(char *str,struct s_homunculus *p)
+{
+ int i, next, len;
+ int tmp_int[25];
+ unsigned int tmp_uint[5];
+ char tmp_str[256];
+
+ memset(p,0,sizeof(struct s_homunculus));
+
+ i=sscanf(str,"%d,%d\t%127[^\t]\t%d,%d,%d,%d,%d,"
+ "%u,%d,%d,%d,"
+ "%u,%d,%d,"
+ "%d,%d,%d,%d,%d,%d\t%n",
+ &tmp_int[0],&tmp_int[1],tmp_str,
+ &tmp_int[2],&tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],
+ &tmp_uint[0],&tmp_int[7],&tmp_int[8],&tmp_int[9],
+ &tmp_uint[1],&tmp_int[10],&tmp_int[11],
+ &tmp_int[12],&tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],
+ &next);
+
+ if(i!=21)
+ return 1;
+
+ p->hom_id = tmp_int[0];
+ p->class_ = tmp_int[1];
+ memcpy(p->name, tmp_str, NAME_LENGTH-1);
+
+ p->char_id = tmp_int[2];
+ p->hp = tmp_int[3];
+ p->max_hp = tmp_int[4];
+ p->sp = tmp_int[5];
+ p->max_sp = tmp_int[6];
+
+ p->intimacy = tmp_uint[0];
+ p->hunger = tmp_int[7];
+ p->skillpts = tmp_int[8];
+ p->level = tmp_int[9];
+
+ p->exp = tmp_uint[1];
+ p->rename_flag = tmp_int[10];
+ p->vaporize = tmp_int[11];
+
+ p->str = tmp_int[12];
+ p->agi = tmp_int[13];
+ p->vit = tmp_int[14];
+ p->int_= tmp_int[15];
+ p->dex = tmp_int[16];
+ p->luk = tmp_int[17];
+
+ //Read skills.
+ while(str[next] && str[next] != '\n' && str[next] != '\r') {
+ if (sscanf(str+next, "%d,%d,%n", &tmp_int[0], &tmp_int[1], &len) != 2)
+ return 2;
+
+ if (tmp_int[0] > HM_SKILLBASE && tmp_int[0] <= HM_SKILLBASE+MAX_HOMUNSKILL)
+ {
+ i = tmp_int[0] - HM_SKILLBASE -1;
+ p->hskill[i].id = tmp_int[0];
+ p->hskill[i].lv = tmp_int[1];
+ } else
+ ShowError("Read Homun: Unsupported Skill ID %d for homunculus (Homun ID=%d\n", tmp_int[0], p->hom_id);
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ return 0;
+}
+
+int inter_homun_init()
+{
+ char line[8192];
+ struct s_homunculus *p;
+ FILE *fp;
+ int c=0;
+
+ homun_db= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if( (fp=fopen(homun_txt,"r"))==NULL )
+ return 1;
+ while(fgets(line,sizeof(line),fp)){
+ p = (struct s_homunculus*)aCalloc(sizeof(struct s_homunculus), 1);
+ if(p==NULL){
+ ShowFatalError("int_homun: out of memory!\n");
+ exit(0);
+ }
+ if(inter_homun_fromstr(line,p)==0 && p->hom_id>0){
+ if( p->hom_id >= homun_newid)
+ homun_newid=p->hom_id+1;
+ idb_put(homun_db,p->hom_id,p);
+ }else{
+ ShowError("int_homun: broken data [%s] line %d\n",homun_txt,c);
+ aFree(p);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("int_homun: %s read done (%d homuns)\n",homun_txt,c);
+ return 0;
+}
+
+void inter_homun_final()
+{
+ homun_db->destroy(homun_db, NULL);
+ return;
+}
+
+int inter_homun_save_sub(DBKey key,void *data,va_list ap)
+{
+ char line[8192];
+ FILE *fp;
+ inter_homun_tostr(line,(struct s_homunculus *)data);
+ fp=va_arg(ap,FILE *);
+ fprintf(fp,"%s" RETCODE,line);
+ return 0;
+}
+
+int inter_homun_save()
+{
+ FILE *fp;
+ int lock;
+ if( (fp=lock_fopen(homun_txt,&lock))==NULL ){
+ ShowError("int_homun: cant write [%s] !!! data is lost !!!\n",homun_txt);
+ return 1;
+ }
+ homun_db->foreach(homun_db,inter_homun_save_sub,fp);
+ lock_fclose(fp,homun_txt,&lock);
+// printf("int_homun: %s saved.\n",homun_txt);
+ return 0;
+}
+
+int inter_homun_delete(int hom_id)
+{
+ struct s_homunculus *p;
+ p = idb_get(homun_db,hom_id);
+ if( p == NULL)
+ return 0;
+ idb_remove(homun_db,hom_id);
+ ShowInfo("Deleted homun (hom_id: %d)\n",hom_id);
+ return 1;
+}
+
+int mapif_homun_created(int fd,int account_id, struct s_homunculus *p)
+{
+ WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
+ WFIFOW(fd, 0) =0x3890;
+ WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
+ WFIFOL(fd,4) = account_id;
+ WFIFOB(fd,8)= p->hom_id?1:0;
+ memcpy(WFIFOP(fd,9), p, sizeof(struct s_homunculus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ return 0;
+}
+
+int mapif_homun_info(int fd,int account_id,struct s_homunculus *p)
+{
+ WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
+ WFIFOW(fd,0) = 0x3891;
+ WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
+ WFIFOL(fd,4) = account_id;
+ WFIFOB(fd,8) = 1; // account loaded with success
+
+ memcpy(WFIFOP(fd,9), p, sizeof(struct s_homunculus));
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+int mapif_homun_noinfo(int fd,int account_id)
+{
+ WFIFOHEAD(fd,sizeof(struct s_homunculus) + 9);
+ WFIFOW(fd,0)=0x3891;
+ WFIFOW(fd,2)=sizeof(struct s_homunculus) + 9;
+ WFIFOL(fd,4)=account_id;
+ WFIFOB(fd,8)=0;
+ memset(WFIFOP(fd,9),0,sizeof(struct s_homunculus));
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+int mapif_save_homun_ack(int fd,int account_id,int flag)
+{
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0)=0x3892;
+ WFIFOL(fd,2)=account_id;
+ WFIFOB(fd,6)=flag;
+ WFIFOSET(fd,7);
+ return 0;
+}
+
+int mapif_delete_homun_ack(int fd,int flag)
+{
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0)=0x3893;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,3);
+ return 0;
+}
+
+int mapif_rename_homun_ack(int fd, int account_id, int char_id, int flag, char *name){
+ WFIFOHEAD(fd, NAME_LENGTH+12);
+ WFIFOW(fd, 0) =0x3894;
+ WFIFOL(fd, 2) =account_id;
+ WFIFOL(fd, 6) =char_id;
+ WFIFOB(fd, 10) =flag;
+ memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
+ WFIFOSET(fd, NAME_LENGTH+12);
+
+ return 0;
+}
+
+int mapif_create_homun(int fd)
+{
+ struct s_homunculus *p;
+ RFIFOHEAD(fd);
+ p= (struct s_homunculus *) aCalloc(sizeof(struct s_homunculus), 1);
+ if(p==NULL){
+ ShowFatalError("int_homun: out of memory !\n");
+ //Sending the received data will pass hom_id == 0 <- fail.
+ mapif_homun_created(fd,RFIFOL(fd,4),(struct s_homunculus*)RFIFOP(fd,8));
+ return 0;
+ }
+ memcpy(p, RFIFOP(fd,8), sizeof(struct s_homunculus));
+ p->hom_id = homun_newid++; //New ID
+ idb_put(homun_db,p->hom_id,p);
+ mapif_homun_created(fd,RFIFOL(fd,4),p);
+ return 0;
+}
+
+int mapif_load_homun(int fd)
+{
+ struct s_homunculus *p;
+ int account_id;
+ RFIFOHEAD(fd);
+ account_id = RFIFOL(fd,2);
+
+ p= idb_get(homun_db,RFIFOL(fd,6));
+ if(p==NULL) {
+ mapif_homun_noinfo(fd,account_id);
+ return 0;
+ }
+ mapif_homun_info(fd,account_id,p);
+ return 0;
+}
+
+static void* create_homun(DBKey key, va_list args) {
+ struct s_homunculus *p;
+ p=(struct s_homunculus *)aCalloc(sizeof(struct s_homunculus),1);
+ p->hom_id = key.i;
+ return p;
+}
+int mapif_save_homun(int fd,int account_id,struct s_homunculus *data)
+{
+ struct s_homunculus *p;
+ int hom_id;
+
+ if (data->hom_id == 0)
+ data->hom_id = homun_newid++;
+ hom_id = data->hom_id;
+ p= idb_ensure(homun_db,hom_id,create_homun);
+ memcpy(p,data,sizeof(struct s_homunculus));
+ mapif_save_homun_ack(fd,account_id,1);
+ return 0;
+}
+
+int mapif_delete_homun(int fd,int hom_id)
+{
+ mapif_delete_homun_ack(fd,inter_homun_delete(hom_id));
+ return 0;
+}
+
+int mapif_rename_homun(int fd, int account_id, int char_id, char *name){
+ int i;
+
+ // Check Authorised letters/symbols in the name of the homun
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ }
+
+ mapif_rename_homun_ack(fd, account_id, char_id, 1, name);
+ return 0;
+}
+
+int mapif_parse_SaveHomun(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_save_homun(fd,RFIFOL(fd,4),(struct s_homunculus *)RFIFOP(fd,8));
+ return 0;
+}
+
+int mapif_parse_DeleteHomun(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_delete_homun(fd,RFIFOL(fd,2));
+ return 0;
+}
+
+int mapif_parse_RenameHomun(int fd){
+ RFIFOHEAD(fd);
+ mapif_rename_homun(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
+ return 0;
+}
+
+int inter_homun_parse_frommap(int fd)
+{
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)){
+ case 0x3090: mapif_create_homun(fd); break;
+ case 0x3091: mapif_load_homun(fd); break;
+ case 0x3092: mapif_parse_SaveHomun(fd); break;
+ case 0x3093: mapif_parse_DeleteHomun(fd); break;
+ case 0x3094: mapif_parse_RenameHomun(fd); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
diff --git a/src/char/int_homun.h b/src/char/int_homun.h
index d9c0e4689..5987d23f8 100644
--- a/src/char/int_homun.h
+++ b/src/char/int_homun.h
@@ -1,16 +1,16 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_HOMUN_H_
-#define _INT_HOMUN_H_
-
-int inter_homun_init(void);
-void inter_homun_final(void);
-int inter_homun_save(void);
-int inter_homun_delete(int homun_id);
-
-int inter_homun_parse_frommap(int fd);
-
-extern char homun_txt[1024];
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_HOMUN_H_
+#define _INT_HOMUN_H_
+
+int inter_homun_init(void);
+void inter_homun_final(void);
+int inter_homun_save(void);
+int inter_homun_delete(int homun_id);
+
+int inter_homun_parse_frommap(int fd);
+
+extern char homun_txt[1024];
+
+#endif
diff --git a/src/char/int_party.c b/src/char/int_party.c
index 13fbaf489..be8c6a04c 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -1,747 +1,747 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "char.h"
-#include "inter.h"
-#include "int_party.h"
-
-char party_txt[1024] = "save/party.txt";
-#ifndef TXT_SQL_CONVERT
-struct party_data {
- struct party party;
- unsigned int min_lv, max_lv;
- int family; //Is this party a family? if so, this holds the child id.
- unsigned char size; //Total size of party.
-};
-
-static struct dbt *party_db;
-static int party_newid = 100;
-
-int mapif_party_broken(int party_id, int flag);
-int party_check_empty(struct party *p);
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id);
-int party_check_exp_share(struct party_data *p);
-int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag);
-
-//Updates party's level range and unsets even share if broken.
-static int int_party_check_lv(struct party_data *p) {
- int i;
- unsigned int lv;
- p->min_lv = UINT_MAX;
- p->max_lv = 0;
- for(i=0;i<MAX_PARTY;i++){
- if(!p->party.member[i].online)
- continue;
-
- lv=p->party.member[i].lv;
- if (lv < p->min_lv) p->min_lv = lv;
- if (lv > p->max_lv) p->max_lv = lv;
- }
-
- if (p->party.exp && !party_check_exp_share(p)) {
- p->party.exp = 0;
- mapif_party_optionchanged(0, &p->party, 0, 0);
- return 0;
- }
- return 1;
-}
-
-//Calculates the state of a party.
-static void int_party_calc_state(struct party_data *p)
-{
- int i;
- unsigned int lv;
- p->min_lv = UINT_MAX;
- p->max_lv = 0;
- p->party.count =
- p->size =
- p->family = 0;
-
- //Check party size.
- for(i=0;i<MAX_PARTY;i++){
- if (!p->party.member[i].lv) continue;
- p->size++;
- if(p->party.member[i].online)
- p->party.count++;
- }
- if(p->size == 3) {
- //Check Family State.
- p->family = char_family(
- p->party.member[0].char_id,
- p->party.member[1].char_id,
- p->party.member[2].char_id
- );
- }
- //max/min levels.
- for(i=0;i<MAX_PARTY;i++){
- lv=p->party.member[i].lv;
- if (!lv) continue;
- if(p->party.member[i].online &&
- //On families, the kid is not counted towards exp share rules.
- p->party.member[i].char_id != p->family)
- {
- if( lv < p->min_lv ) p->min_lv=lv;
- if( p->max_lv < lv ) p->max_lv=lv;
- }
- }
-
- if (p->party.exp && !party_check_exp_share(p)) {
- p->party.exp = 0; //Set off even share.
- mapif_party_optionchanged(0, &p->party, 0, 0);
- }
- return;
-}
-
-// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì?Š·
-int inter_party_tostr(char *str, struct party *p) {
- int i, len;
-
- len = sprintf(str, "%d\t%s\t%d,%d\t", p->party_id, p->name, p->exp, p->item);
- for(i = 0; i < MAX_PARTY; i++) {
- struct party_member *m = &p->member[i];
- len += sprintf(str + len, "%d,%d,%d\t", m->account_id, m->char_id, m->leader);
- }
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì?Š·
-int inter_party_fromstr(char *str, struct party *p) {
- int i, j;
- int tmp_int[16];
- char tmp_str[256];
-#ifndef TXT_SQL_CONVERT
- struct mmo_charstatus* status;
-#endif
-
- memset(p, 0, sizeof(struct party));
-
-// printf("sscanf party main info\n");
- if (sscanf(str, "%d\t%255[^\t]\t%d,%d\t", &tmp_int[0], tmp_str, &tmp_int[1], &tmp_int[2]) != 4)
- return 1;
-
- p->party_id = tmp_int[0];
- memcpy(p->name, tmp_str, NAME_LENGTH-1);
- p->exp = tmp_int[1]?1:0;
- p->item = tmp_int[2];
-// printf("%d [%s] %d %d\n", tmp_int[0], tmp_str[0], tmp_int[1], tmp_int[2]);
-
- for(j = 0; j < 3 && str != NULL; j++)
- str = strchr(str + 1, '\t');
-
- for(i = 0; i < MAX_PARTY; i++) {
- struct party_member *m = &p->member[i];
- if (str == NULL)
- return 1;
-// printf("sscanf party member info %d\n", i);
-
- if (sscanf(str + 1, "%d,%d,%d\t", &tmp_int[0], &tmp_int[1], &tmp_int[2]) != 3)
- return 1;
-
- m->account_id = tmp_int[0];
- m->char_id = tmp_int[1];
- m->leader = tmp_int[2]?1:0;
-
- str = strchr(str + 1, '\t');
-#ifndef TXT_SQL_CONVERT
- if (!m->account_id) continue;
- //Lookup player for rest of data.
- status = search_character(m->account_id, m->char_id);
- if (!status) continue;
-
- memcpy(m->name, status->name, NAME_LENGTH);
- m->class_ = status->class_;
- m->map = status->last_point.map;
- m->lv = status->base_level;
-#endif //TXT_SQL_CONVERT
- }
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// ƒp?ƒeƒBƒf?ƒ^‚̃?ƒh
-int inter_party_init() {
- char line[8192];
- struct party_data *p;
- FILE *fp;
- int c = 0;
- int i, j;
-
- party_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if ((fp = fopen(party_txt, "r")) == NULL)
- return 1;
-
- while(fgets(line, sizeof(line) - 1, fp)) {
- j = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) {
- party_newid = i;
- continue;
- }
-
- p = (struct party_data*)aCalloc(sizeof(struct party_data), 1);
- if (p == NULL){
- ShowFatalError("int_party: out of memory!\n");
- exit(0);
- }
- memset(p, 0, sizeof(struct party_data));
- if (inter_party_fromstr(line, &p->party) == 0 && p->party.party_id > 0) {
- int_party_calc_state(p);
- if (p->party.party_id >= party_newid)
- party_newid = p->party.party_id + 1;
- idb_put(party_db, p->party.party_id, p);
- party_check_empty(&p->party);
- } else {
- ShowError("int_party: broken data [%s] line %d\n", party_txt, c + 1);
- aFree(p);
- }
- c++;
- }
- fclose(fp);
-
- return 0;
-}
-
-void inter_party_final()
-{
- party_db->destroy(party_db, NULL);
- return;
-}
-
-// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu—p
-int inter_party_save_sub(DBKey key, void *data, va_list ap) {
- char line[8192];
- FILE *fp;
-
- inter_party_tostr(line, &((struct party_data*)data)->party);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
-
- return 0;
-}
-
-// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu
-int inter_party_save() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(party_txt, &lock)) == NULL) {
- ShowError("int_party: cant write [%s] !!! data is lost !!!\n", party_txt);
- return 1;
- }
- party_db->foreach(party_db, inter_party_save_sub, fp);
- lock_fclose(fp,party_txt, &lock);
- return 0;
-}
-
-// ƒp?ƒeƒB–¼?õ—p
-int search_partyname_sub(DBKey key,void *data,va_list ap) {
- struct party_data *p = (struct party_data *)data,**dst;
- char *str;
-
- str = va_arg(ap, char *);
- dst = va_arg(ap, struct party_data **);
- if (strncmpi(p->party.name, str, NAME_LENGTH) == 0)
- *dst = p;
-
- return 0;
-}
-
-// ƒp?ƒeƒB–¼?õ
-struct party_data* search_partyname(char *str) {
- struct party_data *p = NULL;
- party_db->foreach(party_db, search_partyname_sub, str, &p);
- return p;
-}
-
-// Returns whether this party can keep having exp share or not.
-int party_check_exp_share(struct party_data *p) {
- return (p->party.count < 2|| p->max_lv - p->min_lv <= party_share_level);
-}
-
-// ƒp?ƒeƒB‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-int party_check_empty(struct party *p) {
- int i;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id > 0) {
- return 0;
- }
- }
- mapif_party_broken(p->party_id, 0);
- idb_remove(party_db, p->party_id);
-
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int party_check_conflict_sub(DBKey key, void *data, va_list ap) {
- struct party_data *p = (struct party_data *)data;
- int party_id, account_id, char_id, i;
-
- party_id=va_arg(ap, int);
- account_id=va_arg(ap, int);
- char_id=va_arg(ap, int);
-
- if (p->party.party_id == party_id) //No conflict to check
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- ShowWarning("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party.party_id);
- mapif_parse_PartyLeave(-1, p->party.party_id, account_id, char_id);
- }
- }
-
- return 0;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
-int party_check_conflict(int party_id, int account_id, int char_id) {
- party_db->foreach(party_db, party_check_conflict_sub, party_id, account_id, char_id);
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp?ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id, int char_id, struct party *p) {
- WFIFOHEAD(fd, 39);
- WFIFOW(fd,0) = 0x3820;
- WFIFOL(fd,2) = account_id;
- WFIFOL(fd,6) = char_id;
- if (p != NULL) {
- WFIFOB(fd,10) = 0;
- WFIFOL(fd,11) = p->party_id;
- memcpy(WFIFOP(fd,15), p->name, NAME_LENGTH);
- ShowInfo("Created party (%d - %s)\n", p->party_id, p->name);
- } else {
- WFIFOB(fd,10) = 1;
- WFIFOL(fd,11) = 0;
- memset(WFIFOP(fd,15), 0, NAME_LENGTH);
- }
- WFIFOSET(fd,39);
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd, int party_id) {
- WFIFOHEAD(fd, 8);
- WFIFOW(fd,0) = 0x3821;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = party_id;
- WFIFOSET(fd,8);
- ShowWarning("int_party: info not found %d\n", party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_party_info(int fd, struct party *p) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3821;
- memcpy(buf + 4, p, sizeof(struct party));
- WBUFW(buf,2) = 4 + sizeof(struct party);
- if (fd < 0)
- mapif_sendall(buf, WBUFW(buf,2));
- else
- mapif_send(fd, buf, WBUFW(buf,2));
- return 0;
-}
-
-// ƒp?ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd, int party_id, int account_id, int char_id, int flag) {
- WFIFOHEAD(fd, 15);
- WFIFOW(fd,0) = 0x3822;
- WFIFOL(fd,2) = party_id;
- WFIFOL(fd,6) = account_id;
- WFIFOL(fd,10) = char_id;
- WFIFOB(fd,14) = flag;
- WFIFOSET(fd,15);
-
- return 0;
-}
-
-// ƒp?ƒeƒBÝ’è?X’Ê’m
-int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) {
- unsigned char buf[15];
-
- WBUFW(buf,0) = 0x3823;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = account_id;
- WBUFW(buf,10) = p->exp;
- WBUFW(buf,12) = p->item;
- WBUFB(buf,14) = flag;
- if (flag == 0)
- mapif_sendall(buf, 15);
- else
- mapif_send(fd, buf, 15);
- return 0;
-}
-
-//Checks whether the even-share setting of a party is broken when a character logs in. [Skotlex]
-int inter_party_logged(int party_id, int account_id, int char_id)
-{
- struct party_data *p;
- int i;
- if (!party_id)
- return 0;
-
- p = idb_get(party_db, party_id);
- if(p==NULL)
- return 0;
- for (i = 0; i < MAX_PARTY; i++)
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- p->party.member[i].online = 1;
- p->party.count++;
- if(p->party.member[i].lv < p->min_lv ||
- p->party.member[i].lv > p->max_lv)
- int_party_check_lv(p);
- break;
- }
- return 0;
-}
-
-// ƒp?ƒeƒB?‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id, int char_id) {
- unsigned char buf[16];
-
- WBUFW(buf,0) = 0x3824;
- WBUFL(buf,2) = party_id;
- WBUFL(buf,6) = account_id;
- WBUFL(buf,10) = char_id;
- mapif_sendall(buf, 14);
- return 0;
-}
-
-// ƒp?ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p, int idx) {
- unsigned char buf[20];
-
- WBUFW(buf,0) = 0x3825;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = p->member[idx].account_id;
- WBUFL(buf,10) = p->member[idx].char_id;
- WBUFW(buf,14) = p->member[idx].map;
- WBUFB(buf,16) = p->member[idx].online;
- WBUFW(buf,17) = p->member[idx].lv;
- mapif_sendall(buf, 19);
- return 0;
-}
-
-// ƒp?ƒeƒB‰ðŽU’Ê’m
-int mapif_party_broken(int party_id, int flag) {
- unsigned char buf[7];
- WBUFW(buf,0) = 0x3826;
- WBUFL(buf,2) = party_id;
- WBUFB(buf,6) = flag;
- mapif_sendall(buf, 7);
- ShowInfo("Party broken (%d)\n", party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒB??Œ¾
-int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3827;
- WBUFW(buf,2) = len + 12;
- WBUFL(buf,4) = party_id;
- WBUFL(buf,8) = account_id;
- memcpy(WBUFP(buf,12), mes, len);
- mapif_sendallwos(sfd, buf,len + 12);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// ƒp?ƒeƒB
-int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader) {
- struct party_data *p;
- int i;
-
- for(i = 0; i < NAME_LENGTH && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- ShowInfo("int_party: illegal party name [%s]\n", name);
- mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
- return 0;
- }
- }
-
- if ((p = search_partyname(name)) != NULL) {
- ShowInfo("int_party: same name party exists [%s]\n", name);
- mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
- return 0;
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
- return 0;
- }
- }
-
- p = (struct party_data *) aCalloc(sizeof(struct party_data), 1);
- if (p == NULL) {
- ShowFatalError("int_party: out of memory !\n");
- mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
- return 0;
- }
- p->party.party_id = party_newid++;
- memcpy(p->party.name, name, NAME_LENGTH);
- p->party.exp = 0;
- p->party.item=(item?1:0)|(item2?2:0);
- memcpy(&p->party.member[0], leader, sizeof(struct party_member));
- p->party.member[0].leader = 1;
- int_party_calc_state(p);
- idb_put(party_db, p->party.party_id, p);
-
- mapif_party_created(fd, leader->account_id, leader->char_id, &p->party);
- mapif_party_info(fd, &p->party);
-
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd, int party_id) {
- struct party_data *p;
-
- p = idb_get(party_db, party_id);
- if (p != NULL)
- mapif_party_info(fd, &p->party);
- else {
- mapif_party_noinfo(fd, party_id);
- char_clearparty(party_id);
- }
-
- return 0;
-}
-
-// ƒp?ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
- struct party_data *p;
- int i;
-
- p = idb_get(party_db, party_id);
- if (p == NULL || p->size == MAX_PARTY) {
- mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
- return 0;
- }
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->party.member[i].account_id == 0) {
- memcpy(&p->party.member[i], member, sizeof(struct party_member));
- p->party.member[i].leader = 0;
- if (p->party.member[i].online) p->party.count++;
- p->size++;
- if (p->size == 3) //Check family state.
- int_party_calc_state(p);
- else //Check even share range.
- if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
- if (p->family) p->family = 0; //Family state broken.
- int_party_check_lv(p);
- }
- mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0);
- mapif_party_info(-1, &p->party);
- return 0;
- }
- }
- mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
-
- return 0;
-}
-
-// ƒp?ƒeƒB?Ý’è?X—v‹
-int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) {
- struct party_data *p;
- int flag = 0;
-
- p = idb_get(party_db, party_id);
- if (p == NULL)
- return 0;
-
- p->party.exp = exp;
- if (exp>0 && !party_check_exp_share(p)) {
- flag |= 0x01;
- p->party.exp = 0;
- }
- p->party.item = item&0x3;
- mapif_party_optionchanged(fd, &p->party, account_id, flag);
- return 0;
-}
-
-// ƒp?ƒeƒB?‘Þ—v‹
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id) {
- struct party_data *p;
- int i,lv;
-
- p = idb_get(party_db, party_id);
- if (!p) return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- mapif_party_leaved(party_id, account_id, char_id);
- lv = p->party.member[i].lv;
- if(p->party.member[i].online) p->party.count--;
- memset(&p->party.member[i], 0, sizeof(struct party_member));
- p->size--;
- if (lv == p->min_lv || lv == p->max_lv || p->family)
- {
- if(p->family) p->family = 0; //Family state broken.
- int_party_check_lv(p);
- }
- if (party_check_empty(&p->party) == 0)
- mapif_party_info(-1, &p->party);
- return 0;
- }
- }
- return 0;
-}
-
-int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv)
-{
- struct party_data *p;
- int i;
-
- p = idb_get(party_db, party_id);
- if (p == NULL)
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- p->party.member[i].map = map;
- if (p->party.member[i].online != online)
- {
- p->party.member[i].online = online;
- if (online)
- p->party.count++;
- else
- p->party.count--;
- // Even share check situations: Family state (always breaks)
- // character logging on/off is max/min level (update level range)
- // or character logging on/off has a different level (update level range using new level)
- if (p->family ||
- (p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
- (p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
- )
- {
- p->party.member[i].lv = lv;
- int_party_check_lv(p);
- }
- }
- if (p->party.member[i].lv != lv) {
- if(p->party.member[i].lv == p->min_lv ||
- p->party.member[i].lv == p->max_lv)
- {
- p->party.member[i].lv = lv;
- int_party_check_lv(p);
- } else
- p->party.member[i].lv = lv;
- }
- mapif_party_membermoved(&p->party, i);
- break;
- }
- }
- return 0;
-}
-
-// ƒp?ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd, int party_id) {
-
- idb_remove(party_db, party_id);
- mapif_party_broken(fd, party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒƒbƒZ?ƒW‘—M
-int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) {
- return mapif_party_message(party_id, account_id, mes, len, fd);
-}
-// ƒp?ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd, int party_id, int account_id, int char_id) {
- return party_check_conflict(party_id, account_id, char_id);
-}
-
-int mapif_parse_PartyLeaderChange(int fd,int party_id,int account_id,int char_id)
-{
- struct party_data *p;
- int i;
-
- p = idb_get(party_db, party_id);
- if (p == NULL)
- return 0;
-
- for (i = 0; i < MAX_PARTY; i++)
- {
- if(p->party.member[i].leader)
- p->party.member[i].leader = 0;
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- p->party.member[i].leader = 1;
- }
- return 1;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// ?‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// ?ƒpƒPƒbƒg’·ƒf?ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// ?ƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// ?ƒGƒ‰?‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_party_parse_frommap(int fd) {
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)) {
- case 0x3020: mapif_parse_CreateParty(fd, (char*)RFIFOP(fd,4), RFIFOB(fd,28), RFIFOB(fd,29), (struct party_member*)RFIFOP(fd,30)); break;
- case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,4), (struct party_member*)RFIFOP(fd,8)); break;
- case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
- case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOW(fd,14), RFIFOB(fd,16), RFIFOW(fd,17)); break;
- case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3029: mapif_parse_PartyLeaderChange(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- default:
- return 0;
- }
-
- return 1;
-}
-
-// ƒT?ƒo?‚©‚ç?‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_party_leave(int party_id, int account_id, int char_id) {
- return mapif_parse_PartyLeave(-1, party_id, account_id, char_id);
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "char.h"
+#include "inter.h"
+#include "int_party.h"
+
+char party_txt[1024] = "save/party.txt";
+#ifndef TXT_SQL_CONVERT
+struct party_data {
+ struct party party;
+ unsigned int min_lv, max_lv;
+ int family; //Is this party a family? if so, this holds the child id.
+ unsigned char size; //Total size of party.
+};
+
+static struct dbt *party_db;
+static int party_newid = 100;
+
+int mapif_party_broken(int party_id, int flag);
+int party_check_empty(struct party *p);
+int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id);
+int party_check_exp_share(struct party_data *p);
+int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag);
+
+//Updates party's level range and unsets even share if broken.
+static int int_party_check_lv(struct party_data *p) {
+ int i;
+ unsigned int lv;
+ p->min_lv = UINT_MAX;
+ p->max_lv = 0;
+ for(i=0;i<MAX_PARTY;i++){
+ if(!p->party.member[i].online)
+ continue;
+
+ lv=p->party.member[i].lv;
+ if (lv < p->min_lv) p->min_lv = lv;
+ if (lv > p->max_lv) p->max_lv = lv;
+ }
+
+ if (p->party.exp && !party_check_exp_share(p)) {
+ p->party.exp = 0;
+ mapif_party_optionchanged(0, &p->party, 0, 0);
+ return 0;
+ }
+ return 1;
+}
+
+//Calculates the state of a party.
+static void int_party_calc_state(struct party_data *p)
+{
+ int i;
+ unsigned int lv;
+ p->min_lv = UINT_MAX;
+ p->max_lv = 0;
+ p->party.count =
+ p->size =
+ p->family = 0;
+
+ //Check party size.
+ for(i=0;i<MAX_PARTY;i++){
+ if (!p->party.member[i].lv) continue;
+ p->size++;
+ if(p->party.member[i].online)
+ p->party.count++;
+ }
+ if(p->size == 3) {
+ //Check Family State.
+ p->family = char_family(
+ p->party.member[0].char_id,
+ p->party.member[1].char_id,
+ p->party.member[2].char_id
+ );
+ }
+ //max/min levels.
+ for(i=0;i<MAX_PARTY;i++){
+ lv=p->party.member[i].lv;
+ if (!lv) continue;
+ if(p->party.member[i].online &&
+ //On families, the kid is not counted towards exp share rules.
+ p->party.member[i].char_id != p->family)
+ {
+ if( lv < p->min_lv ) p->min_lv=lv;
+ if( p->max_lv < lv ) p->max_lv=lv;
+ }
+ }
+
+ if (p->party.exp && !party_check_exp_share(p)) {
+ p->party.exp = 0; //Set off even share.
+ mapif_party_optionchanged(0, &p->party, 0, 0);
+ }
+ return;
+}
+
+// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì?Š·
+int inter_party_tostr(char *str, struct party *p) {
+ int i, len;
+
+ len = sprintf(str, "%d\t%s\t%d,%d\t", p->party_id, p->name, p->exp, p->item);
+ for(i = 0; i < MAX_PARTY; i++) {
+ struct party_member *m = &p->member[i];
+ len += sprintf(str + len, "%d,%d,%d\t", m->account_id, m->char_id, m->leader);
+ }
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì?Š·
+int inter_party_fromstr(char *str, struct party *p) {
+ int i, j;
+ int tmp_int[16];
+ char tmp_str[256];
+#ifndef TXT_SQL_CONVERT
+ struct mmo_charstatus* status;
+#endif
+
+ memset(p, 0, sizeof(struct party));
+
+// printf("sscanf party main info\n");
+ if (sscanf(str, "%d\t%255[^\t]\t%d,%d\t", &tmp_int[0], tmp_str, &tmp_int[1], &tmp_int[2]) != 4)
+ return 1;
+
+ p->party_id = tmp_int[0];
+ memcpy(p->name, tmp_str, NAME_LENGTH-1);
+ p->exp = tmp_int[1]?1:0;
+ p->item = tmp_int[2];
+// printf("%d [%s] %d %d\n", tmp_int[0], tmp_str[0], tmp_int[1], tmp_int[2]);
+
+ for(j = 0; j < 3 && str != NULL; j++)
+ str = strchr(str + 1, '\t');
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ struct party_member *m = &p->member[i];
+ if (str == NULL)
+ return 1;
+// printf("sscanf party member info %d\n", i);
+
+ if (sscanf(str + 1, "%d,%d,%d\t", &tmp_int[0], &tmp_int[1], &tmp_int[2]) != 3)
+ return 1;
+
+ m->account_id = tmp_int[0];
+ m->char_id = tmp_int[1];
+ m->leader = tmp_int[2]?1:0;
+
+ str = strchr(str + 1, '\t');
+#ifndef TXT_SQL_CONVERT
+ if (!m->account_id) continue;
+ //Lookup player for rest of data.
+ status = search_character(m->account_id, m->char_id);
+ if (!status) continue;
+
+ memcpy(m->name, status->name, NAME_LENGTH);
+ m->class_ = status->class_;
+ m->map = status->last_point.map;
+ m->lv = status->base_level;
+#endif //TXT_SQL_CONVERT
+ }
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// ƒp?ƒeƒBƒf?ƒ^‚̃?ƒh
+int inter_party_init() {
+ char line[8192];
+ struct party_data *p;
+ FILE *fp;
+ int c = 0;
+ int i, j;
+
+ party_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if ((fp = fopen(party_txt, "r")) == NULL)
+ return 1;
+
+ while(fgets(line, sizeof(line) - 1, fp)) {
+ j = 0;
+ if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) {
+ party_newid = i;
+ continue;
+ }
+
+ p = (struct party_data*)aCalloc(sizeof(struct party_data), 1);
+ if (p == NULL){
+ ShowFatalError("int_party: out of memory!\n");
+ exit(0);
+ }
+ memset(p, 0, sizeof(struct party_data));
+ if (inter_party_fromstr(line, &p->party) == 0 && p->party.party_id > 0) {
+ int_party_calc_state(p);
+ if (p->party.party_id >= party_newid)
+ party_newid = p->party.party_id + 1;
+ idb_put(party_db, p->party.party_id, p);
+ party_check_empty(&p->party);
+ } else {
+ ShowError("int_party: broken data [%s] line %d\n", party_txt, c + 1);
+ aFree(p);
+ }
+ c++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+void inter_party_final()
+{
+ party_db->destroy(party_db, NULL);
+ return;
+}
+
+// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu—p
+int inter_party_save_sub(DBKey key, void *data, va_list ap) {
+ char line[8192];
+ FILE *fp;
+
+ inter_party_tostr(line, &((struct party_data*)data)->party);
+ fp = va_arg(ap, FILE *);
+ fprintf(fp, "%s" RETCODE, line);
+
+ return 0;
+}
+
+// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu
+int inter_party_save() {
+ FILE *fp;
+ int lock;
+
+ if ((fp = lock_fopen(party_txt, &lock)) == NULL) {
+ ShowError("int_party: cant write [%s] !!! data is lost !!!\n", party_txt);
+ return 1;
+ }
+ party_db->foreach(party_db, inter_party_save_sub, fp);
+ lock_fclose(fp,party_txt, &lock);
+ return 0;
+}
+
+// ƒp?ƒeƒB–¼?õ—p
+int search_partyname_sub(DBKey key,void *data,va_list ap) {
+ struct party_data *p = (struct party_data *)data,**dst;
+ char *str;
+
+ str = va_arg(ap, char *);
+ dst = va_arg(ap, struct party_data **);
+ if (strncmpi(p->party.name, str, NAME_LENGTH) == 0)
+ *dst = p;
+
+ return 0;
+}
+
+// ƒp?ƒeƒB–¼?õ
+struct party_data* search_partyname(char *str) {
+ struct party_data *p = NULL;
+ party_db->foreach(party_db, search_partyname_sub, str, &p);
+ return p;
+}
+
+// Returns whether this party can keep having exp share or not.
+int party_check_exp_share(struct party_data *p) {
+ return (p->party.count < 2|| p->max_lv - p->min_lv <= party_share_level);
+}
+
+// ƒp?ƒeƒB‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+int party_check_empty(struct party *p) {
+ int i;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->member[i].account_id > 0) {
+ return 0;
+ }
+ }
+ mapif_party_broken(p->party_id, 0);
+ idb_remove(party_db, p->party_id);
+
+ return 1;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
+int party_check_conflict_sub(DBKey key, void *data, va_list ap) {
+ struct party_data *p = (struct party_data *)data;
+ int party_id, account_id, char_id, i;
+
+ party_id=va_arg(ap, int);
+ account_id=va_arg(ap, int);
+ char_id=va_arg(ap, int);
+
+ if (p->party.party_id == party_id) //No conflict to check
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ ShowWarning("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party.party_id);
+ mapif_parse_PartyLeave(-1, p->party.party_id, account_id, char_id);
+ }
+ }
+
+ return 0;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
+int party_check_conflict(int party_id, int account_id, int char_id) {
+ party_db->foreach(party_db, party_check_conflict_sub, party_id, account_id, char_id);
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ƒp?ƒeƒB쬉”Û
+int mapif_party_created(int fd,int account_id, int char_id, struct party *p) {
+ WFIFOHEAD(fd, 39);
+ WFIFOW(fd,0) = 0x3820;
+ WFIFOL(fd,2) = account_id;
+ WFIFOL(fd,6) = char_id;
+ if (p != NULL) {
+ WFIFOB(fd,10) = 0;
+ WFIFOL(fd,11) = p->party_id;
+ memcpy(WFIFOP(fd,15), p->name, NAME_LENGTH);
+ ShowInfo("Created party (%d - %s)\n", p->party_id, p->name);
+ } else {
+ WFIFOB(fd,10) = 1;
+ WFIFOL(fd,11) = 0;
+ memset(WFIFOP(fd,15), 0, NAME_LENGTH);
+ }
+ WFIFOSET(fd,39);
+ return 0;
+}
+
+// ƒp?ƒeƒBî•ñŒ©‚‚©‚炸
+int mapif_party_noinfo(int fd, int party_id) {
+ WFIFOHEAD(fd, 8);
+ WFIFOW(fd,0) = 0x3821;
+ WFIFOW(fd,2) = 8;
+ WFIFOL(fd,4) = party_id;
+ WFIFOSET(fd,8);
+ ShowWarning("int_party: info not found %d\n", party_id);
+
+ return 0;
+}
+
+// ƒp?ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
+int mapif_party_info(int fd, struct party *p) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x3821;
+ memcpy(buf + 4, p, sizeof(struct party));
+ WBUFW(buf,2) = 4 + sizeof(struct party);
+ if (fd < 0)
+ mapif_sendall(buf, WBUFW(buf,2));
+ else
+ mapif_send(fd, buf, WBUFW(buf,2));
+ return 0;
+}
+
+// ƒp?ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
+int mapif_party_memberadded(int fd, int party_id, int account_id, int char_id, int flag) {
+ WFIFOHEAD(fd, 15);
+ WFIFOW(fd,0) = 0x3822;
+ WFIFOL(fd,2) = party_id;
+ WFIFOL(fd,6) = account_id;
+ WFIFOL(fd,10) = char_id;
+ WFIFOB(fd,14) = flag;
+ WFIFOSET(fd,15);
+
+ return 0;
+}
+
+// ƒp?ƒeƒBÝ’è?X’Ê’m
+int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) {
+ unsigned char buf[15];
+
+ WBUFW(buf,0) = 0x3823;
+ WBUFL(buf,2) = p->party_id;
+ WBUFL(buf,6) = account_id;
+ WBUFW(buf,10) = p->exp;
+ WBUFW(buf,12) = p->item;
+ WBUFB(buf,14) = flag;
+ if (flag == 0)
+ mapif_sendall(buf, 15);
+ else
+ mapif_send(fd, buf, 15);
+ return 0;
+}
+
+//Checks whether the even-share setting of a party is broken when a character logs in. [Skotlex]
+int inter_party_logged(int party_id, int account_id, int char_id)
+{
+ struct party_data *p;
+ int i;
+ if (!party_id)
+ return 0;
+
+ p = idb_get(party_db, party_id);
+ if(p==NULL)
+ return 0;
+ for (i = 0; i < MAX_PARTY; i++)
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ p->party.member[i].online = 1;
+ p->party.count++;
+ if(p->party.member[i].lv < p->min_lv ||
+ p->party.member[i].lv > p->max_lv)
+ int_party_check_lv(p);
+ break;
+ }
+ return 0;
+}
+
+// ƒp?ƒeƒB?‘Þ’Ê’m
+int mapif_party_leaved(int party_id,int account_id, int char_id) {
+ unsigned char buf[16];
+
+ WBUFW(buf,0) = 0x3824;
+ WBUFL(buf,2) = party_id;
+ WBUFL(buf,6) = account_id;
+ WBUFL(buf,10) = char_id;
+ mapif_sendall(buf, 14);
+ return 0;
+}
+
+// ƒp?ƒeƒBƒ}ƒbƒvXV’Ê’m
+int mapif_party_membermoved(struct party *p, int idx) {
+ unsigned char buf[20];
+
+ WBUFW(buf,0) = 0x3825;
+ WBUFL(buf,2) = p->party_id;
+ WBUFL(buf,6) = p->member[idx].account_id;
+ WBUFL(buf,10) = p->member[idx].char_id;
+ WBUFW(buf,14) = p->member[idx].map;
+ WBUFB(buf,16) = p->member[idx].online;
+ WBUFW(buf,17) = p->member[idx].lv;
+ mapif_sendall(buf, 19);
+ return 0;
+}
+
+// ƒp?ƒeƒB‰ðŽU’Ê’m
+int mapif_party_broken(int party_id, int flag) {
+ unsigned char buf[7];
+ WBUFW(buf,0) = 0x3826;
+ WBUFL(buf,2) = party_id;
+ WBUFB(buf,6) = flag;
+ mapif_sendall(buf, 7);
+ ShowInfo("Party broken (%d)\n", party_id);
+
+ return 0;
+}
+
+// ƒp?ƒeƒB??Œ¾
+int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) {
+ unsigned char buf[2048];
+
+ WBUFW(buf,0) = 0x3827;
+ WBUFW(buf,2) = len + 12;
+ WBUFL(buf,4) = party_id;
+ WBUFL(buf,8) = account_id;
+ memcpy(WBUFP(buf,12), mes, len);
+ mapif_sendallwos(sfd, buf,len + 12);
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+
+// ƒp?ƒeƒB
+int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader) {
+ struct party_data *p;
+ int i;
+
+ for(i = 0; i < NAME_LENGTH && name[i]; i++) {
+ if (!(name[i] & 0xe0) || name[i] == 0x7f) {
+ ShowInfo("int_party: illegal party name [%s]\n", name);
+ mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
+ return 0;
+ }
+ }
+
+ if ((p = search_partyname(name)) != NULL) {
+ ShowInfo("int_party: same name party exists [%s]\n", name);
+ mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
+ return 0;
+ }
+
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_party_created(fd, leader->account_id, leader->char_id, NULL);
+ return 0;
+ }
+ }
+
+ p = (struct party_data *) aCalloc(sizeof(struct party_data), 1);
+ if (p == NULL) {
+ ShowFatalError("int_party: out of memory !\n");
+ mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
+ return 0;
+ }
+ p->party.party_id = party_newid++;
+ memcpy(p->party.name, name, NAME_LENGTH);
+ p->party.exp = 0;
+ p->party.item=(item?1:0)|(item2?2:0);
+ memcpy(&p->party.member[0], leader, sizeof(struct party_member));
+ p->party.member[0].leader = 1;
+ int_party_calc_state(p);
+ idb_put(party_db, p->party.party_id, p);
+
+ mapif_party_created(fd, leader->account_id, leader->char_id, &p->party);
+ mapif_party_info(fd, &p->party);
+
+ return 0;
+}
+
+// ƒp?ƒeƒBî•ñ—v‹
+int mapif_parse_PartyInfo(int fd, int party_id) {
+ struct party_data *p;
+
+ p = idb_get(party_db, party_id);
+ if (p != NULL)
+ mapif_party_info(fd, &p->party);
+ else {
+ mapif_party_noinfo(fd, party_id);
+ char_clearparty(party_id);
+ }
+
+ return 0;
+}
+
+// ƒp?ƒeƒB’ljÁ—v‹
+int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
+ struct party_data *p;
+ int i;
+
+ p = idb_get(party_db, party_id);
+ if (p == NULL || p->size == MAX_PARTY) {
+ mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
+ return 0;
+ }
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->party.member[i].account_id == 0) {
+ memcpy(&p->party.member[i], member, sizeof(struct party_member));
+ p->party.member[i].leader = 0;
+ if (p->party.member[i].online) p->party.count++;
+ p->size++;
+ if (p->size == 3) //Check family state.
+ int_party_calc_state(p);
+ else //Check even share range.
+ if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
+ if (p->family) p->family = 0; //Family state broken.
+ int_party_check_lv(p);
+ }
+ mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0);
+ mapif_party_info(-1, &p->party);
+ return 0;
+ }
+ }
+ mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
+
+ return 0;
+}
+
+// ƒp?ƒeƒB?Ý’è?X—v‹
+int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) {
+ struct party_data *p;
+ int flag = 0;
+
+ p = idb_get(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ p->party.exp = exp;
+ if (exp>0 && !party_check_exp_share(p)) {
+ flag |= 0x01;
+ p->party.exp = 0;
+ }
+ p->party.item = item&0x3;
+ mapif_party_optionchanged(fd, &p->party, account_id, flag);
+ return 0;
+}
+
+// ƒp?ƒeƒB?‘Þ—v‹
+int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id) {
+ struct party_data *p;
+ int i,lv;
+
+ p = idb_get(party_db, party_id);
+ if (!p) return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ mapif_party_leaved(party_id, account_id, char_id);
+ lv = p->party.member[i].lv;
+ if(p->party.member[i].online) p->party.count--;
+ memset(&p->party.member[i], 0, sizeof(struct party_member));
+ p->size--;
+ if (lv == p->min_lv || lv == p->max_lv || p->family)
+ {
+ if(p->family) p->family = 0; //Family state broken.
+ int_party_check_lv(p);
+ }
+ if (party_check_empty(&p->party) == 0)
+ mapif_party_info(-1, &p->party);
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv)
+{
+ struct party_data *p;
+ int i;
+
+ p = idb_get(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ p->party.member[i].map = map;
+ if (p->party.member[i].online != online)
+ {
+ p->party.member[i].online = online;
+ if (online)
+ p->party.count++;
+ else
+ p->party.count--;
+ // Even share check situations: Family state (always breaks)
+ // character logging on/off is max/min level (update level range)
+ // or character logging on/off has a different level (update level range using new level)
+ if (p->family ||
+ (p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
+ (p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
+ )
+ {
+ p->party.member[i].lv = lv;
+ int_party_check_lv(p);
+ }
+ }
+ if (p->party.member[i].lv != lv) {
+ if(p->party.member[i].lv == p->min_lv ||
+ p->party.member[i].lv == p->max_lv)
+ {
+ p->party.member[i].lv = lv;
+ int_party_check_lv(p);
+ } else
+ p->party.member[i].lv = lv;
+ }
+ mapif_party_membermoved(&p->party, i);
+ break;
+ }
+ }
+ return 0;
+}
+
+// ƒp?ƒeƒB‰ðŽU—v‹
+int mapif_parse_BreakParty(int fd, int party_id) {
+
+ idb_remove(party_db, party_id);
+ mapif_party_broken(fd, party_id);
+
+ return 0;
+}
+
+// ƒp?ƒeƒBƒƒbƒZ?ƒW‘—M
+int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) {
+ return mapif_party_message(party_id, account_id, mes, len, fd);
+}
+// ƒp?ƒeƒBƒ`ƒFƒbƒN—v‹
+int mapif_parse_PartyCheck(int fd, int party_id, int account_id, int char_id) {
+ return party_check_conflict(party_id, account_id, char_id);
+}
+
+int mapif_parse_PartyLeaderChange(int fd,int party_id,int account_id,int char_id)
+{
+ struct party_data *p;
+ int i;
+
+ p = idb_get(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ for (i = 0; i < MAX_PARTY; i++)
+ {
+ if(p->party.member[i].leader)
+ p->party.member[i].leader = 0;
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ p->party.member[i].leader = 1;
+ }
+ return 1;
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// ?‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// ?ƒpƒPƒbƒg’·ƒf?ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// ?ƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// ?ƒGƒ‰?‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_party_parse_frommap(int fd) {
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)) {
+ case 0x3020: mapif_parse_CreateParty(fd, (char*)RFIFOP(fd,4), RFIFOB(fd,28), RFIFOB(fd,29), (struct party_member*)RFIFOP(fd,30)); break;
+ case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
+ case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,4), (struct party_member*)RFIFOP(fd,8)); break;
+ case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
+ case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOW(fd,14), RFIFOB(fd,16), RFIFOW(fd,17)); break;
+ case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
+ case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
+ case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x3029: mapif_parse_PartyLeaderChange(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+// ƒT?ƒo?‚©‚ç?‘Þ—v‹iƒLƒƒƒ‰íœ—pj
+int inter_party_leave(int party_id, int account_id, int char_id) {
+ return mapif_parse_PartyLeave(-1, party_id, account_id, char_id);
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/int_party.h b/src/char/int_party.h
index 5c2fbefb1..be3ae65f3 100644
--- a/src/char/int_party.h
+++ b/src/char/int_party.h
@@ -1,20 +1,20 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_init(void);
-void inter_party_final(void);
-int inter_party_save(void);
-
-int inter_party_parse_frommap(int fd);
-
-int inter_party_leave(int party_id,int account_id, int char_id);
-int inter_party_logged(int party_id, int account_id, int char_id);
-
-extern char party_txt[1024];
-
-//For the TXT->SQL converter
-int inter_party_fromstr(char *str, struct party *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_PARTY_H_
+#define _INT_PARTY_H_
+
+int inter_party_init(void);
+void inter_party_final(void);
+int inter_party_save(void);
+
+int inter_party_parse_frommap(int fd);
+
+int inter_party_leave(int party_id,int account_id, int char_id);
+int inter_party_logged(int party_id, int account_id, int char_id);
+
+extern char party_txt[1024];
+
+//For the TXT->SQL converter
+int inter_party_fromstr(char *str, struct party *p);
+#endif
diff --git a/src/char/int_pet.c b/src/char/int_pet.c
index 3ab48c8ae..97fef3799 100644
--- a/src/char/int_pet.c
+++ b/src/char/int_pet.c
@@ -1,422 +1,422 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "char.h"
-#include "inter.h"
-#include "int_pet.h"
-
-char pet_txt[1024]="save/pet.txt";
-
-#ifndef TXT_SQL_CONVERT
-static struct dbt *pet_db;
-static int pet_newid = 100;
-
-int inter_pet_tostr(char *str,struct s_pet *p)
-{
- int len;
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- len=sprintf(str,"%d,%d,%s\t%d,%d,%d,%d,%d,%d,%d,%d,%d",
- p->pet_id,p->class_,p->name,p->account_id,p->char_id,p->level,p->egg_id,
- p->equip,p->intimate,p->hungry,p->rename_flag,p->incuvate);
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-int inter_pet_fromstr(char *str,struct s_pet *p)
-{
- int s;
- int tmp_int[16];
- char tmp_str[256];
-
- memset(p,0,sizeof(struct s_pet));
-
-// printf("sscanf pet main info\n");
- s=sscanf(str,"%d,%d,%[^\t]\t%d,%d,%d,%d,%d,%d,%d,%d,%d",&tmp_int[0],&tmp_int[1],tmp_str,&tmp_int[2],
- &tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],&tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10]);
-
- if(s!=12)
- return 1;
-
- p->pet_id = tmp_int[0];
- p->class_ = tmp_int[1];
- memcpy(p->name,tmp_str,NAME_LENGTH-1);
- p->account_id = tmp_int[2];
- p->char_id = tmp_int[3];
- p->level = tmp_int[4];
- p->egg_id = tmp_int[5];
- p->equip = tmp_int[6];
- p->intimate = tmp_int[7];
- p->hungry = tmp_int[8];
- p->rename_flag = tmp_int[9];
- p->incuvate = tmp_int[10];
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-int inter_pet_init()
-{
- char line[8192];
- struct s_pet *p;
- FILE *fp;
- int c=0;
-
- pet_db= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if( (fp=fopen(pet_txt,"r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- p = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
- if(p==NULL){
- ShowFatalError("int_pet: out of memory!\n");
- exit(0);
- }
- memset(p,0,sizeof(struct s_pet));
- if(inter_pet_fromstr(line,p)==0 && p->pet_id>0){
- if( p->pet_id >= pet_newid)
- pet_newid=p->pet_id+1;
- idb_put(pet_db,p->pet_id,p);
- }else{
- ShowError("int_pet: broken data [%s] line %d\n",pet_txt,c);
- aFree(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_pet: %s read done (%d pets)\n",pet_txt,c);
- return 0;
-}
-
-void inter_pet_final()
-{
- pet_db->destroy(pet_db, NULL);
- return;
-}
-
-int inter_pet_save_sub(DBKey key,void *data,va_list ap)
-{
- char line[8192];
- FILE *fp;
- inter_pet_tostr(line,(struct s_pet *)data);
- fp=va_arg(ap,FILE *);
- fprintf(fp,"%s" RETCODE,line);
- return 0;
-}
-
-int inter_pet_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(pet_txt,&lock))==NULL ){
- ShowError("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);
- return 1;
- }
- pet_db->foreach(pet_db,inter_pet_save_sub,fp);
- lock_fclose(fp,pet_txt,&lock);
-// printf("int_pet: %s saved.\n",pet_txt);
- return 0;
-}
-
-int inter_pet_delete(int pet_id)
-{
- struct s_pet *p;
- p = idb_get(pet_db,pet_id);
- if( p == NULL)
- return 1;
- else {
- idb_remove(pet_db,pet_id);
- ShowInfo("Deleted pet (pet_id: %d)\n",pet_id);
- }
- return 0;
-}
-
-int mapif_pet_created(int fd,int account_id,struct s_pet *p)
-{
- WFIFOHEAD(fd, 11);
- WFIFOW(fd,0)=0x3880;
- WFIFOL(fd,2)=account_id;
- if(p!=NULL){
- WFIFOB(fd,6)=0;
- WFIFOL(fd,7)=p->pet_id;
- ShowInfo("Created pet (%d - %s)\n",p->pet_id,p->name);
- }else{
- WFIFOB(fd,6)=1;
- WFIFOL(fd,7)=0;
- }
- WFIFOSET(fd,11);
-
- return 0;
-}
-
-int mapif_pet_info(int fd,int account_id,struct s_pet *p)
-{
- WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
- WFIFOW(fd,0)=0x3881;
- WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
- WFIFOL(fd,4)=account_id;
- WFIFOB(fd,8)=0;
- memcpy(WFIFOP(fd,9),p,sizeof(struct s_pet));
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int mapif_pet_noinfo(int fd,int account_id)
-{
- WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
- WFIFOW(fd,0)=0x3881;
- WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
- WFIFOL(fd,4)=account_id;
- WFIFOB(fd,8)=1;
- memset(WFIFOP(fd,9),0,sizeof(struct s_pet));
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int mapif_save_pet_ack(int fd,int account_id,int flag)
-{
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0)=0x3882;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=flag;
- WFIFOSET(fd,7);
-
- return 0;
-}
-
-int mapif_delete_pet_ack(int fd,int flag)
-{
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0)=0x3883;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,3);
-
- return 0;
-}
-
-int mapif_rename_pet_ack(int fd, int account_id, int char_id, int flag, char *name){
- WFIFOHEAD(fd, NAME_LENGTH+12);
- WFIFOW(fd, 0) =0x3884;
- WFIFOL(fd, 2) =account_id;
- WFIFOL(fd, 6) =char_id;
- WFIFOB(fd, 10) =flag;
- memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
- WFIFOSET(fd, NAME_LENGTH+12);
-
- return 0;
-}
-
-int mapif_create_pet(int fd,int account_id,int char_id,short pet_class,short pet_lv,short pet_egg_id,
- short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name)
-{
- struct s_pet *p;
- p= (struct s_pet *) aCalloc(sizeof(struct s_pet), 1);
- if(p==NULL){
- ShowFatalError("int_pet: out of memory !\n");
- mapif_pet_created(fd,account_id,NULL);
- return 0;
- }
-// memset(p,0,sizeof(struct s_pet)); unnecessary after aCalloc [Skotlex]
- p->pet_id = pet_newid++;
- memcpy(p->name,pet_name,NAME_LENGTH-1);
- if(incuvate == 1)
- p->account_id = p->char_id = 0;
- else {
- p->account_id = account_id;
- p->char_id = char_id;
- }
- p->class_ = pet_class;
- p->level = pet_lv;
- p->egg_id = pet_egg_id;
- p->equip = pet_equip;
- p->intimate = intimate;
- p->hungry = hungry;
- p->rename_flag = rename_flag;
- p->incuvate = incuvate;
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- idb_put(pet_db,p->pet_id,p);
-
- mapif_pet_created(fd,account_id,p);
-
- return 0;
-}
-
-int mapif_load_pet(int fd,int account_id,int char_id,int pet_id)
-{
- struct s_pet *p;
- p= idb_get(pet_db,pet_id);
- if(p!=NULL) {
- if(p->incuvate == 1) {
- p->account_id = p->char_id = 0;
- mapif_pet_info(fd,account_id,p);
- }
- else if(account_id == p->account_id && char_id == p->char_id)
- mapif_pet_info(fd,account_id,p);
- else
- mapif_pet_noinfo(fd,account_id);
- }
- else
- mapif_pet_noinfo(fd,account_id);
-
- return 0;
-}
-
-static void* create_pet(DBKey key, va_list args) {
- struct s_pet *p;
- p=(struct s_pet *)aCalloc(sizeof(struct s_pet),1);
- p->pet_id = key.i;
- return p;
-}
-int mapif_save_pet(int fd,int account_id,struct s_pet *data)
-{
- struct s_pet *p;
- int pet_id, len;
- RFIFOHEAD(fd);
- len=RFIFOW(fd,2);
-
- if(sizeof(struct s_pet)!=len-8) {
- ShowError("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);
- }
- else{
- pet_id = data->pet_id;
- if (pet_id == 0)
- pet_id = data->pet_id = pet_newid++;
- p= idb_ensure(pet_db,pet_id,create_pet);
- if(data->hungry < 0)
- data->hungry = 0;
- else if(data->hungry > 100)
- data->hungry = 100;
- if(data->intimate < 0)
- data->intimate = 0;
- else if(data->intimate > 1000)
- data->intimate = 1000;
- memcpy(p,data,sizeof(struct s_pet));
- if(p->incuvate == 1)
- p->account_id = p->char_id = 0;
-
- mapif_save_pet_ack(fd,account_id,0);
- }
-
- return 0;
-}
-
-int mapif_delete_pet(int fd,int pet_id)
-{
- mapif_delete_pet_ack(fd,inter_pet_delete(pet_id));
-
- return 0;
-}
-
-int mapif_rename_pet(int fd, int account_id, int char_id, char *name){
- int i;
-
- // Check Authorised letters/symbols in the name of the pet
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- }
-
- mapif_rename_pet_ack(fd, account_id, char_id, 1, name);
- return 0;
-}
-
-int mapif_parse_CreatePet(int fd)
-{
- RFIFOHEAD(fd);
- mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOW(fd,18),
- RFIFOW(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),(char*)RFIFOP(fd,24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd)
-{
- RFIFOHEAD(fd);
- mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd)
-{
- RFIFOHEAD(fd);
- mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd)
-{
- RFIFOHEAD(fd);
- mapif_delete_pet(fd,RFIFOL(fd,2));
- return 0;
-}
-
-int mapif_parse_RenamePet(int fd){
- RFIFOHEAD(fd);
- mapif_rename_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_pet_parse_frommap(int fd)
-{
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)){
- case 0x3080: mapif_parse_CreatePet(fd); break;
- case 0x3081: mapif_parse_LoadPet(fd); break;
- case 0x3082: mapif_parse_SavePet(fd); break;
- case 0x3083: mapif_parse_DeletePet(fd); break;
- case 0x3084: mapif_parse_RenamePet(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "char.h"
+#include "inter.h"
+#include "int_pet.h"
+
+char pet_txt[1024]="save/pet.txt";
+
+#ifndef TXT_SQL_CONVERT
+static struct dbt *pet_db;
+static int pet_newid = 100;
+
+int inter_pet_tostr(char *str,struct s_pet *p)
+{
+ int len;
+
+ if(p->hungry < 0)
+ p->hungry = 0;
+ else if(p->hungry > 100)
+ p->hungry = 100;
+ if(p->intimate < 0)
+ p->intimate = 0;
+ else if(p->intimate > 1000)
+ p->intimate = 1000;
+
+ len=sprintf(str,"%d,%d,%s\t%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ p->pet_id,p->class_,p->name,p->account_id,p->char_id,p->level,p->egg_id,
+ p->equip,p->intimate,p->hungry,p->rename_flag,p->incuvate);
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+int inter_pet_fromstr(char *str,struct s_pet *p)
+{
+ int s;
+ int tmp_int[16];
+ char tmp_str[256];
+
+ memset(p,0,sizeof(struct s_pet));
+
+// printf("sscanf pet main info\n");
+ s=sscanf(str,"%d,%d,%[^\t]\t%d,%d,%d,%d,%d,%d,%d,%d,%d",&tmp_int[0],&tmp_int[1],tmp_str,&tmp_int[2],
+ &tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],&tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10]);
+
+ if(s!=12)
+ return 1;
+
+ p->pet_id = tmp_int[0];
+ p->class_ = tmp_int[1];
+ memcpy(p->name,tmp_str,NAME_LENGTH-1);
+ p->account_id = tmp_int[2];
+ p->char_id = tmp_int[3];
+ p->level = tmp_int[4];
+ p->egg_id = tmp_int[5];
+ p->equip = tmp_int[6];
+ p->intimate = tmp_int[7];
+ p->hungry = tmp_int[8];
+ p->rename_flag = tmp_int[9];
+ p->incuvate = tmp_int[10];
+
+ if(p->hungry < 0)
+ p->hungry = 0;
+ else if(p->hungry > 100)
+ p->hungry = 100;
+ if(p->intimate < 0)
+ p->intimate = 0;
+ else if(p->intimate > 1000)
+ p->intimate = 1000;
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+int inter_pet_init()
+{
+ char line[8192];
+ struct s_pet *p;
+ FILE *fp;
+ int c=0;
+
+ pet_db= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if( (fp=fopen(pet_txt,"r"))==NULL )
+ return 1;
+ while(fgets(line,sizeof(line),fp)){
+ p = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
+ if(p==NULL){
+ ShowFatalError("int_pet: out of memory!\n");
+ exit(0);
+ }
+ memset(p,0,sizeof(struct s_pet));
+ if(inter_pet_fromstr(line,p)==0 && p->pet_id>0){
+ if( p->pet_id >= pet_newid)
+ pet_newid=p->pet_id+1;
+ idb_put(pet_db,p->pet_id,p);
+ }else{
+ ShowError("int_pet: broken data [%s] line %d\n",pet_txt,c);
+ aFree(p);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("int_pet: %s read done (%d pets)\n",pet_txt,c);
+ return 0;
+}
+
+void inter_pet_final()
+{
+ pet_db->destroy(pet_db, NULL);
+ return;
+}
+
+int inter_pet_save_sub(DBKey key,void *data,va_list ap)
+{
+ char line[8192];
+ FILE *fp;
+ inter_pet_tostr(line,(struct s_pet *)data);
+ fp=va_arg(ap,FILE *);
+ fprintf(fp,"%s" RETCODE,line);
+ return 0;
+}
+
+int inter_pet_save()
+{
+ FILE *fp;
+ int lock;
+ if( (fp=lock_fopen(pet_txt,&lock))==NULL ){
+ ShowError("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);
+ return 1;
+ }
+ pet_db->foreach(pet_db,inter_pet_save_sub,fp);
+ lock_fclose(fp,pet_txt,&lock);
+// printf("int_pet: %s saved.\n",pet_txt);
+ return 0;
+}
+
+int inter_pet_delete(int pet_id)
+{
+ struct s_pet *p;
+ p = idb_get(pet_db,pet_id);
+ if( p == NULL)
+ return 1;
+ else {
+ idb_remove(pet_db,pet_id);
+ ShowInfo("Deleted pet (pet_id: %d)\n",pet_id);
+ }
+ return 0;
+}
+
+int mapif_pet_created(int fd,int account_id,struct s_pet *p)
+{
+ WFIFOHEAD(fd, 11);
+ WFIFOW(fd,0)=0x3880;
+ WFIFOL(fd,2)=account_id;
+ if(p!=NULL){
+ WFIFOB(fd,6)=0;
+ WFIFOL(fd,7)=p->pet_id;
+ ShowInfo("Created pet (%d - %s)\n",p->pet_id,p->name);
+ }else{
+ WFIFOB(fd,6)=1;
+ WFIFOL(fd,7)=0;
+ }
+ WFIFOSET(fd,11);
+
+ return 0;
+}
+
+int mapif_pet_info(int fd,int account_id,struct s_pet *p)
+{
+ WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
+ WFIFOW(fd,0)=0x3881;
+ WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
+ WFIFOL(fd,4)=account_id;
+ WFIFOB(fd,8)=0;
+ memcpy(WFIFOP(fd,9),p,sizeof(struct s_pet));
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+int mapif_pet_noinfo(int fd,int account_id)
+{
+ WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
+ WFIFOW(fd,0)=0x3881;
+ WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
+ WFIFOL(fd,4)=account_id;
+ WFIFOB(fd,8)=1;
+ memset(WFIFOP(fd,9),0,sizeof(struct s_pet));
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+int mapif_save_pet_ack(int fd,int account_id,int flag)
+{
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0)=0x3882;
+ WFIFOL(fd,2)=account_id;
+ WFIFOB(fd,6)=flag;
+ WFIFOSET(fd,7);
+
+ return 0;
+}
+
+int mapif_delete_pet_ack(int fd,int flag)
+{
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0)=0x3883;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,3);
+
+ return 0;
+}
+
+int mapif_rename_pet_ack(int fd, int account_id, int char_id, int flag, char *name){
+ WFIFOHEAD(fd, NAME_LENGTH+12);
+ WFIFOW(fd, 0) =0x3884;
+ WFIFOL(fd, 2) =account_id;
+ WFIFOL(fd, 6) =char_id;
+ WFIFOB(fd, 10) =flag;
+ memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
+ WFIFOSET(fd, NAME_LENGTH+12);
+
+ return 0;
+}
+
+int mapif_create_pet(int fd,int account_id,int char_id,short pet_class,short pet_lv,short pet_egg_id,
+ short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name)
+{
+ struct s_pet *p;
+ p= (struct s_pet *) aCalloc(sizeof(struct s_pet), 1);
+ if(p==NULL){
+ ShowFatalError("int_pet: out of memory !\n");
+ mapif_pet_created(fd,account_id,NULL);
+ return 0;
+ }
+// memset(p,0,sizeof(struct s_pet)); unnecessary after aCalloc [Skotlex]
+ p->pet_id = pet_newid++;
+ memcpy(p->name,pet_name,NAME_LENGTH-1);
+ if(incuvate == 1)
+ p->account_id = p->char_id = 0;
+ else {
+ p->account_id = account_id;
+ p->char_id = char_id;
+ }
+ p->class_ = pet_class;
+ p->level = pet_lv;
+ p->egg_id = pet_egg_id;
+ p->equip = pet_equip;
+ p->intimate = intimate;
+ p->hungry = hungry;
+ p->rename_flag = rename_flag;
+ p->incuvate = incuvate;
+
+ if(p->hungry < 0)
+ p->hungry = 0;
+ else if(p->hungry > 100)
+ p->hungry = 100;
+ if(p->intimate < 0)
+ p->intimate = 0;
+ else if(p->intimate > 1000)
+ p->intimate = 1000;
+
+ idb_put(pet_db,p->pet_id,p);
+
+ mapif_pet_created(fd,account_id,p);
+
+ return 0;
+}
+
+int mapif_load_pet(int fd,int account_id,int char_id,int pet_id)
+{
+ struct s_pet *p;
+ p= idb_get(pet_db,pet_id);
+ if(p!=NULL) {
+ if(p->incuvate == 1) {
+ p->account_id = p->char_id = 0;
+ mapif_pet_info(fd,account_id,p);
+ }
+ else if(account_id == p->account_id && char_id == p->char_id)
+ mapif_pet_info(fd,account_id,p);
+ else
+ mapif_pet_noinfo(fd,account_id);
+ }
+ else
+ mapif_pet_noinfo(fd,account_id);
+
+ return 0;
+}
+
+static void* create_pet(DBKey key, va_list args) {
+ struct s_pet *p;
+ p=(struct s_pet *)aCalloc(sizeof(struct s_pet),1);
+ p->pet_id = key.i;
+ return p;
+}
+int mapif_save_pet(int fd,int account_id,struct s_pet *data)
+{
+ struct s_pet *p;
+ int pet_id, len;
+ RFIFOHEAD(fd);
+ len=RFIFOW(fd,2);
+
+ if(sizeof(struct s_pet)!=len-8) {
+ ShowError("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);
+ }
+ else{
+ pet_id = data->pet_id;
+ if (pet_id == 0)
+ pet_id = data->pet_id = pet_newid++;
+ p= idb_ensure(pet_db,pet_id,create_pet);
+ if(data->hungry < 0)
+ data->hungry = 0;
+ else if(data->hungry > 100)
+ data->hungry = 100;
+ if(data->intimate < 0)
+ data->intimate = 0;
+ else if(data->intimate > 1000)
+ data->intimate = 1000;
+ memcpy(p,data,sizeof(struct s_pet));
+ if(p->incuvate == 1)
+ p->account_id = p->char_id = 0;
+
+ mapif_save_pet_ack(fd,account_id,0);
+ }
+
+ return 0;
+}
+
+int mapif_delete_pet(int fd,int pet_id)
+{
+ mapif_delete_pet_ack(fd,inter_pet_delete(pet_id));
+
+ return 0;
+}
+
+int mapif_rename_pet(int fd, int account_id, int char_id, char *name){
+ int i;
+
+ // Check Authorised letters/symbols in the name of the pet
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ }
+
+ mapif_rename_pet_ack(fd, account_id, char_id, 1, name);
+ return 0;
+}
+
+int mapif_parse_CreatePet(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOW(fd,18),
+ RFIFOW(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),(char*)RFIFOP(fd,24));
+ return 0;
+}
+
+int mapif_parse_LoadPet(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ return 0;
+}
+
+int mapif_parse_SavePet(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));
+ return 0;
+}
+
+int mapif_parse_DeletePet(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_delete_pet(fd,RFIFOL(fd,2));
+ return 0;
+}
+
+int mapif_parse_RenamePet(int fd){
+ RFIFOHEAD(fd);
+ mapif_rename_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
+ return 0;
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_pet_parse_frommap(int fd)
+{
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)){
+ case 0x3080: mapif_parse_CreatePet(fd); break;
+ case 0x3081: mapif_parse_LoadPet(fd); break;
+ case 0x3082: mapif_parse_SavePet(fd); break;
+ case 0x3083: mapif_parse_DeletePet(fd); break;
+ case 0x3084: mapif_parse_RenamePet(fd); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/int_pet.h b/src/char/int_pet.h
index 31489579f..2c72628bb 100644
--- a/src/char/int_pet.h
+++ b/src/char/int_pet.h
@@ -1,18 +1,18 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init(void);
-void inter_pet_final(void);
-int inter_pet_save(void);
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-
-extern char pet_txt[1024];
-
-//Exported for use in the TXT-SQL converter.
-int inter_pet_fromstr(char *str,struct s_pet *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_PET_H_
+#define _INT_PET_H_
+
+int inter_pet_init(void);
+void inter_pet_final(void);
+int inter_pet_save(void);
+int inter_pet_delete(int pet_id);
+
+int inter_pet_parse_frommap(int fd);
+
+extern char pet_txt[1024];
+
+//Exported for use in the TXT-SQL converter.
+int inter_pet_fromstr(char *str,struct s_pet *p);
+#endif
diff --git a/src/char/int_status.c b/src/char/int_status.c
index 3c3b65dc4..7ece61ccd 100644
--- a/src/char/int_status.c
+++ b/src/char/int_status.c
@@ -1,187 +1,187 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-
-#include "int_status.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-static struct dbt * scdata_db = NULL; //Contains all the status change data in-memory. [Skotlex]
-char scdata_txt[1024]="save/scdata.txt"; //By [Skotlex]
-
-#ifdef ENABLE_SC_SAVING
-static void* create_scdata(DBKey key, va_list args) {
- struct scdata *data;
- data = aCalloc(1, sizeof(struct scdata));
- data->account_id = va_arg(args, int);
- data->char_id = key.i;
- return data;
-}
-
-/*==========================================
- * Loads status change data of the player given. [Skotlex]
- *------------------------------------------
- */
-struct scdata* status_search_scdata(int aid, int cid)
-{
- struct scdata *data;
- data = scdata_db->ensure(scdata_db, i2key(cid), create_scdata, aid);
- return data;
-}
-
-/*==========================================
- * Deletes status change data of the player given. [Skotlex]
- * Should be invoked after the data of said player was successfully loaded.
- *------------------------------------------
- */
-void status_delete_scdata(int aid, int cid)
-{
- struct scdata *scdata = idb_remove(scdata_db, cid);
- if (scdata)
- {
- if (scdata->data)
- aFree(scdata->data);
- aFree(scdata);
- }
-}
-
-
-static void inter_status_tostr(char* line, struct scdata *sc_data)
-{
- int i, len;
-
- len = sprintf(line, "%d,%d,%d\t", sc_data->account_id, sc_data->char_id, sc_data->count);
- for(i = 0; i < sc_data->count; i++) {
- len += sprintf(line + len, "%d,%d,%d,%d,%d,%d\t", sc_data->data[i].type, sc_data->data[i].tick,
- sc_data->data[i].val1, sc_data->data[i].val2, sc_data->data[i].val3, sc_data->data[i].val4);
- }
- return;
-}
-
-static int inter_scdata_fromstr(char *line, struct scdata *sc_data)
-{
- int i, len, next;
-
- if (sscanf(line,"%d,%d,%d\t%n",&sc_data->account_id, &sc_data->char_id, &sc_data->count, &next) < 3)
- return 0;
-
- if (sc_data->count < 1)
- return 0;
-
- sc_data->data = aCalloc(sc_data->count, sizeof (struct status_change_data));
-
- for (i = 0; i < sc_data->count; i++)
- {
- if (sscanf(line + next, "%hu,%d,%d,%d,%d,%d\t%n", &sc_data->data[i].type, &sc_data->data[i].tick,
- &sc_data->data[i].val1, &sc_data->data[i].val2, &sc_data->data[i].val3, &sc_data->data[i].val4, &len) < 6)
- {
- aFree(sc_data->data);
- return 0;
- }
- next+=len;
- }
- return 1;
-}
-/*==========================================
- * Loads all scdata from the given filename.
- *------------------------------------------
- */
-void status_load_scdata(const char* filename)
-{
- FILE *fp;
- int sd_count=0, sc_count=0;
- char line[8192];
- struct scdata *sc;
-
- if ((fp = fopen(filename, "r")) == NULL) {
- ShowError("status_load_scdata: Cannot open file %s!\n", filename);
- return;
- }
-
- while(fgets(line, sizeof(line) - 1, fp)) {
- sc = (struct scdata*)aCalloc(1, sizeof(struct scdata));
- if (inter_scdata_fromstr(line, sc)) {
- sd_count++;
- sc_count+= sc->count;
- sc = idb_put(scdata_db, sc->char_id, sc);
- if (sc) {
- ShowError("Duplicate entry in %s for character %d\n", filename, sc->char_id);
- if (sc->data) aFree(sc->data);
- aFree(sc);
- }
- } else {
- ShowError("status_load_scdata: Broken line data: %s\n", line);
- aFree(sc);
- }
- }
- fclose(fp);
- ShowStatus("Loaded %d saved status changes for %d characters.\n", sc_count, sd_count);
-}
-
-static int inter_status_save_sub(DBKey key, void *data, va_list ap) {
- char line[8192];
- struct scdata * sc_data;
- FILE *fp;
-
- sc_data = (struct scdata *)data;
- if (sc_data->count < 1)
- return 0;
-
- fp = va_arg(ap, FILE *);
- inter_status_tostr(line, sc_data);
- fprintf(fp, "%s" RETCODE, line);
- return 0;
-}
-
-/*==========================================
- * Saves all scdata to the given filename.
- *------------------------------------------
- */
-void inter_status_save()
-{
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(scdata_txt, &lock)) == NULL) {
- ShowError("int_status: cant write [%s] !!! data is lost !!!\n", scdata_txt);
- return;
- }
- scdata_db->foreach(scdata_db, inter_status_save_sub, fp);
- lock_fclose(fp,scdata_txt, &lock);
-}
-
-/*==========================================
- * Initializes db.
- *------------------------------------------
- */
-void status_init()
-{
- scdata_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
- status_load_scdata(scdata_txt);
-}
-
-/*==========================================
- * Frees up memory.
- *------------------------------------------
- */
-static int scdata_db_final(DBKey k,void *d,va_list ap)
-{
- struct scdata *data = (struct scdata*)d;
- if (data->data)
- aFree(data->data);
- aFree(data);
- return 0;
-}
-
-/*==========================================
- * Final cleanup.
- *------------------------------------------
- */
-void status_final(void)
-{
- scdata_db->destroy(scdata_db, scdata_db_final);
-}
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+
+#include "int_status.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
+static struct dbt * scdata_db = NULL; //Contains all the status change data in-memory. [Skotlex]
+char scdata_txt[1024]="save/scdata.txt"; //By [Skotlex]
+
+#ifdef ENABLE_SC_SAVING
+static void* create_scdata(DBKey key, va_list args) {
+ struct scdata *data;
+ data = aCalloc(1, sizeof(struct scdata));
+ data->account_id = va_arg(args, int);
+ data->char_id = key.i;
+ return data;
+}
+
+/*==========================================
+ * Loads status change data of the player given. [Skotlex]
+ *------------------------------------------
+ */
+struct scdata* status_search_scdata(int aid, int cid)
+{
+ struct scdata *data;
+ data = scdata_db->ensure(scdata_db, i2key(cid), create_scdata, aid);
+ return data;
+}
+
+/*==========================================
+ * Deletes status change data of the player given. [Skotlex]
+ * Should be invoked after the data of said player was successfully loaded.
+ *------------------------------------------
+ */
+void status_delete_scdata(int aid, int cid)
+{
+ struct scdata *scdata = idb_remove(scdata_db, cid);
+ if (scdata)
+ {
+ if (scdata->data)
+ aFree(scdata->data);
+ aFree(scdata);
+ }
+}
+
+
+static void inter_status_tostr(char* line, struct scdata *sc_data)
+{
+ int i, len;
+
+ len = sprintf(line, "%d,%d,%d\t", sc_data->account_id, sc_data->char_id, sc_data->count);
+ for(i = 0; i < sc_data->count; i++) {
+ len += sprintf(line + len, "%d,%d,%d,%d,%d,%d\t", sc_data->data[i].type, sc_data->data[i].tick,
+ sc_data->data[i].val1, sc_data->data[i].val2, sc_data->data[i].val3, sc_data->data[i].val4);
+ }
+ return;
+}
+
+static int inter_scdata_fromstr(char *line, struct scdata *sc_data)
+{
+ int i, len, next;
+
+ if (sscanf(line,"%d,%d,%d\t%n",&sc_data->account_id, &sc_data->char_id, &sc_data->count, &next) < 3)
+ return 0;
+
+ if (sc_data->count < 1)
+ return 0;
+
+ sc_data->data = aCalloc(sc_data->count, sizeof (struct status_change_data));
+
+ for (i = 0; i < sc_data->count; i++)
+ {
+ if (sscanf(line + next, "%hu,%d,%d,%d,%d,%d\t%n", &sc_data->data[i].type, &sc_data->data[i].tick,
+ &sc_data->data[i].val1, &sc_data->data[i].val2, &sc_data->data[i].val3, &sc_data->data[i].val4, &len) < 6)
+ {
+ aFree(sc_data->data);
+ return 0;
+ }
+ next+=len;
+ }
+ return 1;
+}
+/*==========================================
+ * Loads all scdata from the given filename.
+ *------------------------------------------
+ */
+void status_load_scdata(const char* filename)
+{
+ FILE *fp;
+ int sd_count=0, sc_count=0;
+ char line[8192];
+ struct scdata *sc;
+
+ if ((fp = fopen(filename, "r")) == NULL) {
+ ShowError("status_load_scdata: Cannot open file %s!\n", filename);
+ return;
+ }
+
+ while(fgets(line, sizeof(line) - 1, fp)) {
+ sc = (struct scdata*)aCalloc(1, sizeof(struct scdata));
+ if (inter_scdata_fromstr(line, sc)) {
+ sd_count++;
+ sc_count+= sc->count;
+ sc = idb_put(scdata_db, sc->char_id, sc);
+ if (sc) {
+ ShowError("Duplicate entry in %s for character %d\n", filename, sc->char_id);
+ if (sc->data) aFree(sc->data);
+ aFree(sc);
+ }
+ } else {
+ ShowError("status_load_scdata: Broken line data: %s\n", line);
+ aFree(sc);
+ }
+ }
+ fclose(fp);
+ ShowStatus("Loaded %d saved status changes for %d characters.\n", sc_count, sd_count);
+}
+
+static int inter_status_save_sub(DBKey key, void *data, va_list ap) {
+ char line[8192];
+ struct scdata * sc_data;
+ FILE *fp;
+
+ sc_data = (struct scdata *)data;
+ if (sc_data->count < 1)
+ return 0;
+
+ fp = va_arg(ap, FILE *);
+ inter_status_tostr(line, sc_data);
+ fprintf(fp, "%s" RETCODE, line);
+ return 0;
+}
+
+/*==========================================
+ * Saves all scdata to the given filename.
+ *------------------------------------------
+ */
+void inter_status_save()
+{
+ FILE *fp;
+ int lock;
+
+ if ((fp = lock_fopen(scdata_txt, &lock)) == NULL) {
+ ShowError("int_status: cant write [%s] !!! data is lost !!!\n", scdata_txt);
+ return;
+ }
+ scdata_db->foreach(scdata_db, inter_status_save_sub, fp);
+ lock_fclose(fp,scdata_txt, &lock);
+}
+
+/*==========================================
+ * Initializes db.
+ *------------------------------------------
+ */
+void status_init()
+{
+ scdata_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+ status_load_scdata(scdata_txt);
+}
+
+/*==========================================
+ * Frees up memory.
+ *------------------------------------------
+ */
+static int scdata_db_final(DBKey k,void *d,va_list ap)
+{
+ struct scdata *data = (struct scdata*)d;
+ if (data->data)
+ aFree(data->data);
+ aFree(data);
+ return 0;
+}
+
+/*==========================================
+ * Final cleanup.
+ *------------------------------------------
+ */
+void status_final(void)
+{
+ scdata_db->destroy(scdata_db, scdata_db_final);
+}
+#endif
diff --git a/src/char/int_status.h b/src/char/int_status.h
index 0e22fb201..bc93b1024 100644
--- a/src/char/int_status.h
+++ b/src/char/int_status.h
@@ -1,24 +1,24 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef __INT_STATUS__
-#define __INT_STATUS__
-
-#include "char.h"
-
-struct scdata {
- int account_id, char_id;
- int count;
- struct status_change_data* data;
-};
-
-extern char scdata_txt[1024];
-
-#ifdef ENABLE_SC_SAVING
-struct scdata *status_search_scdata(int aid, int cid);
-void status_delete_scdata(int aid, int cid);
-void inter_status_save(void);
-void status_init(void);
-void status_final(void);
-#endif
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef __INT_STATUS__
+#define __INT_STATUS__
+
+#include "char.h"
+
+struct scdata {
+ int account_id, char_id;
+ int count;
+ struct status_change_data* data;
+};
+
+extern char scdata_txt[1024];
+
+#ifdef ENABLE_SC_SAVING
+struct scdata *status_search_scdata(int aid, int cid);
+void status_delete_scdata(int aid, int cid);
+void inter_status_save(void);
+void status_init(void);
+void status_final(void);
+#endif
+#endif
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index 89e9a540a..06b05ba25 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -1,478 +1,478 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-#include "char.h"
-#include "inter.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "int_guild.h"
-
-// ƒtƒ@ƒCƒ‹–¼‚̃fƒtƒHƒ‹ƒg
-// inter_config_read()‚ÅÄݒ肳‚ê‚é
-char storage_txt[1024]="save/storage.txt";
-char guild_storage_txt[1024]="save/g_storage.txt";
-
-#ifndef TXT_SQL_CONVERT
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
-
-// ‘qŒÉƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·
-int storage_tostr(char *str,struct storage *p)
-{
- int i,j,f=0;
- char *str_p = str;
- str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount);
-
- for(i=0;i<MAX_STORAGE;i++)
- if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
- p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
- p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,",%d",p->storage_[i].card[j]);
- str_p += sprintf(str_p," ");
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// •¶Žš—ñ‚ð‘qŒÉƒf[ƒ^‚É•ÏŠ·
-int storage_fromstr(char *str,struct storage *p)
-{
- int tmp_int[256];
- char tmp_str[256];
- int set,next,len,i,j;
-
- set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 1;
- if(str[next]=='\n' || str[next]=='\r')
- return 0;
- next++;
- for(i=0;str[next] && str[next]!='\t' && i < MAX_STORAGE;i++){
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str, &len) == 8) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
-
- for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
- p->storage_[i].card[j] = tmp_int[0];
-
- next += len;
- if (str[next] == ' ')
- next++;
- }
- else return 1;
- }
- if (i >= MAX_STORAGE && str[next] && str[next]!='\t')
- ShowWarning("storage_fromstr: Found a storage line with more items than MAX_STORAGE (%d), remaining items have been discarded!\n", MAX_STORAGE);
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-int guild_storage_tostr(char *str,struct guild_storage *p)
-{
- int i,j,f=0;
- char *str_p = str;
- str_p+=sprintf(str,"%d,%d\t",p->guild_id,p->storage_amount);
-
- for(i=0;i<MAX_GUILD_STORAGE;i++)
- if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
- p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
- p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,",%d",p->storage_[i].card[j]);
- str_p += sprintf(str_p," ");
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-int guild_storage_fromstr(char *str,struct guild_storage *p)
-{
- int tmp_int[256];
- char tmp_str[256];
- int set,next,len,i,j;
-
- set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 1;
- if(str[next]=='\n' || str[next]=='\r')
- return 0;
- next++;
- for(i=0;str[next] && str[next]!='\t' && i < MAX_GUILD_STORAGE;i++){
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str, &len) == 8)
- {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
- p->storage_[i].card[j] = tmp_int[0];
- next += len;
- if (str[next] == ' ')
- next++;
- }
- else return 1;
- }
- if (i >= MAX_GUILD_STORAGE && str[next] && str[next]!='\t')
- ShowWarning("guild_storage_fromstr: Found a storage line with more items than MAX_GUILD_STORAGE (%d), remaining items have been discarded!\n", MAX_GUILD_STORAGE);
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-static void* create_storage(DBKey key, va_list args) {
- struct storage *s;
- s = (struct storage *) aCalloc(sizeof(struct storage), 1);
- s->account_id=key.i;
- return s;
-}
-
-// ƒAƒJƒEƒ“ƒg‚©‚ç‘qŒÉƒf[ƒ^ƒCƒ“ƒfƒbƒNƒX‚𓾂éiV‹K‘qŒÉ’ljÁ‰Â”\j
-struct storage *account2storage(int account_id)
-{
- struct storage *s;
- s= idb_ensure(storage_db, account_id, create_storage);
- return s;
-}
-
-static void* create_guildstorage(DBKey key, va_list args) {
- struct guild_storage *gs = NULL;
- gs = (struct guild_storage *) aCalloc(sizeof(struct guild_storage), 1);
- gs->guild_id=key.i;
- return gs;
-}
-
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(inter_guild_search(guild_id) != NULL)
- gs= idb_ensure(guild_storage_db, guild_id, create_guildstorage);
- return gs;
-}
-
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð“Ç‚Ýž‚Þ
-int inter_storage_init()
-{
- char line[65536];
- int c=0,tmp_int;
- struct storage *s;
- struct guild_storage *gs;
- FILE *fp;
-
- storage_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- ShowError("cant't read : %s\n",storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- s = (struct storage*)aCalloc(sizeof(struct storage), 1);
- if(s==NULL){
- ShowFatalError("int_storage: out of memory!\n");
- exit(0);
- }
-// memset(s,0,sizeof(struct storage)); aCalloc does this...
- s->account_id=tmp_int;
- if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
- idb_put(storage_db,s->account_id,s);
- }
- else{
- ShowError("int_storage: broken data [%s] line %d\n",storage_txt,c);
- aFree(s);
- }
- c++;
- }
- fclose(fp);
-
- c = 0;
- guild_storage_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- fp=fopen(guild_storage_txt,"r");
- if(fp==NULL){
- ShowError("cant't read : %s\n",guild_storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- gs = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- ShowFatalError("int_storage: out of memory!\n");
- exit(0);
- }
-// memset(gs,0,sizeof(struct guild_storage)); aCalloc...
- gs->guild_id=tmp_int;
- if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
- idb_put(guild_storage_db,gs->guild_id,gs);
- }
- else{
- ShowError("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
- aFree(gs);
- }
- c++;
- }
- fclose(fp);
-
- return 0;
-}
-
-void inter_storage_final() {
- storage_db->destroy(storage_db, NULL);
- guild_storage_db->destroy(guild_storage_db, NULL);
- return;
-}
-
-int inter_storage_save_sub(DBKey key,void *data,va_list ap)
-{
- char line[65536];
- FILE *fp;
- storage_tostr(line,(struct storage *)data);
- fp=va_arg(ap,FILE *);
- if(*line)
- fprintf(fp,"%s" RETCODE,line);
- return 0;
-}
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
-int inter_storage_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(storage_txt,&lock))==NULL ){
- ShowError("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
- return 1;
- }
- storage_db->foreach(storage_db,inter_storage_save_sub,fp);
- lock_fclose(fp,storage_txt,&lock);
-// printf("int_storage: %s saved.\n",storage_txt);
- return 0;
-}
-
-int inter_guild_storage_save_sub(DBKey key,void *data,va_list ap)
-{
- char line[65536];
- FILE *fp;
- if(inter_guild_search(((struct guild_storage *)data)->guild_id) != NULL) {
- guild_storage_tostr(line,(struct guild_storage *)data);
- fp=va_arg(ap,FILE *);
- if(*line)
- fprintf(fp,"%s" RETCODE,line);
- }
- return 0;
-}
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
-int inter_guild_storage_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(guild_storage_txt,&lock))==NULL ){
- ShowError("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
- return 1;
- }
- guild_storage_db->foreach(guild_storage_db,inter_guild_storage_save_sub,fp);
- lock_fclose(fp,guild_storage_txt,&lock);
-// printf("int_storage: %s saved.\n",guild_storage_txt);
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^íœ
-int inter_storage_delete(int account_id)
-{
- struct storage *s = idb_get(storage_db,account_id);
- if(s) {
- int i;
- for(i=0;i<s->storage_amount;i++){
- if(s->storage_[i].card[0] == (short)0xff00)
- inter_pet_delete( MakeDWord(s->storage_[i].card[1],s->storage_[i].card[2]) );
- }
- idb_remove(storage_db,account_id);
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‘qŒÉƒf[ƒ^íœ
-int inter_guild_storage_delete(int guild_id)
-{
- struct guild_storage *gs = idb_get(guild_storage_db,guild_id);
- if(gs) {
- int i;
- for(i=0;i<gs->storage_amount;i++){
- if(gs->storage_[i].card[0] == (short)0xff00)
- inter_pet_delete( MakeDWord(gs->storage_[i].card[1],gs->storage_[i].card[2]) );
- }
- idb_remove(guild_storage_db,guild_id);
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ‘qŒÉƒf[ƒ^‚Ì‘—M
-int mapif_load_storage(int fd,int account_id)
-{
- struct storage *s=account2storage(account_id);
- WFIFOHEAD(fd, sizeof(struct storage)+8);
- WFIFOW(fd,0)=0x3810;
- WFIFOW(fd,2)=sizeof(struct storage)+8;
- WFIFOL(fd,4)=account_id;
- memcpy(WFIFOP(fd,8),s,sizeof(struct storage));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-// ‘qŒÉƒf[ƒ^•Û‘¶Š®—¹‘—M
-int mapif_save_storage_ack(int fd,int account_id)
-{
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0)=0x3811;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=0;
- WFIFOSET(fd,7);
- return 0;
-}
-
-int mapif_load_guild_storage(int fd,int account_id,int guild_id)
-{
- struct guild_storage *gs=guild2storage(guild_id);
- WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
- WFIFOW(fd,0)=0x3818;
- if(gs) {
- WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=guild_id;
- memcpy(WFIFOP(fd,12),gs,sizeof(struct guild_storage));
- }
- else {
- WFIFOW(fd,2)=12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=0;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
-{
- WFIFOHEAD(fd, 11);
- WFIFOW(fd,0)=0x3819;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=guild_id;
- WFIFOB(fd,10)=fail;
- WFIFOSET(fd,11);
- return 0;
-}
-
-//---------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-// ‘qŒÉƒf[ƒ^—v‹ŽóM
-int mapif_parse_LoadStorage(int fd)
-{
- RFIFOHEAD(fd);
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// ‘qŒÉƒf[ƒ^ŽóM••Û‘¶
-int mapif_parse_SaveStorage(int fd)
-{
- struct storage *s;
- int account_id, len;
- RFIFOHEAD(fd);
- account_id=RFIFOL(fd,4);
- len=RFIFOW(fd,2);
- if(sizeof(struct storage)!=len-8){
- ShowError("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
- }
- else {
- s=account2storage(account_id);
- memcpy(s,RFIFOP(fd,8),sizeof(struct storage));
- mapif_save_storage_ack(fd,account_id);
- }
- return 0;
-}
-
-int mapif_parse_LoadGuildStorage(int fd)
-{
- RFIFOHEAD(fd);
- mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-int mapif_parse_SaveGuildStorage(int fd)
-{
- struct guild_storage *gs;
- int guild_id, len;
- RFIFOHEAD(fd);
- guild_id=RFIFOL(fd,8);
- len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- ShowError("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
- }
- else {
- gs=guild2storage(guild_id);
- if(gs) {
- memcpy(gs,RFIFOP(fd,12),sizeof(struct guild_storage));
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
- }
- else
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
- }
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_storage_parse_frommap(int fd)
-{
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)){
- case 0x3010: mapif_parse_LoadStorage(fd); break;
- case 0x3011: mapif_parse_SaveStorage(fd); break;
- case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
- case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+#include "char.h"
+#include "inter.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "int_guild.h"
+
+// ƒtƒ@ƒCƒ‹–¼‚̃fƒtƒHƒ‹ƒg
+// inter_config_read()‚ÅÄݒ肳‚ê‚é
+char storage_txt[1024]="save/storage.txt";
+char guild_storage_txt[1024]="save/g_storage.txt";
+
+#ifndef TXT_SQL_CONVERT
+static struct dbt *storage_db;
+static struct dbt *guild_storage_db;
+
+// ‘qŒÉƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·
+int storage_tostr(char *str,struct storage *p)
+{
+ int i,j,f=0;
+ char *str_p = str;
+ str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount);
+
+ for(i=0;i<MAX_STORAGE;i++)
+ if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
+ str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
+ p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
+ p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute);
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p,",%d",p->storage_[i].card[j]);
+ str_p += sprintf(str_p," ");
+ f++;
+ }
+
+ *(str_p++)='\t';
+
+ *str_p='\0';
+ if(!f)
+ str[0]=0;
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// •¶Žš—ñ‚ð‘qŒÉƒf[ƒ^‚É•ÏŠ·
+int storage_fromstr(char *str,struct storage *p)
+{
+ int tmp_int[256];
+ char tmp_str[256];
+ int set,next,len,i,j;
+
+ set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
+ p->storage_amount=tmp_int[1];
+
+ if(set!=2)
+ return 1;
+ if(str[next]=='\n' || str[next]=='\r')
+ return 0;
+ next++;
+ for(i=0;str[next] && str[next]!='\t' && i < MAX_STORAGE;i++){
+ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
+ &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str, &len) == 8) {
+ p->storage_[i].id = tmp_int[0];
+ p->storage_[i].nameid = tmp_int[1];
+ p->storage_[i].amount = tmp_int[2];
+ p->storage_[i].equip = tmp_int[3];
+ p->storage_[i].identify = tmp_int[4];
+ p->storage_[i].refine = tmp_int[5];
+ p->storage_[i].attribute = tmp_int[6];
+
+ for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
+ p->storage_[i].card[j] = tmp_int[0];
+
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ else return 1;
+ }
+ if (i >= MAX_STORAGE && str[next] && str[next]!='\t')
+ ShowWarning("storage_fromstr: Found a storage line with more items than MAX_STORAGE (%d), remaining items have been discarded!\n", MAX_STORAGE);
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+int guild_storage_tostr(char *str,struct guild_storage *p)
+{
+ int i,j,f=0;
+ char *str_p = str;
+ str_p+=sprintf(str,"%d,%d\t",p->guild_id,p->storage_amount);
+
+ for(i=0;i<MAX_GUILD_STORAGE;i++)
+ if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
+ str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d",
+ p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
+ p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute);
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p,",%d",p->storage_[i].card[j]);
+ str_p += sprintf(str_p," ");
+ f++;
+ }
+
+ *(str_p++)='\t';
+
+ *str_p='\0';
+ if(!f)
+ str[0]=0;
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+int guild_storage_fromstr(char *str,struct guild_storage *p)
+{
+ int tmp_int[256];
+ char tmp_str[256];
+ int set,next,len,i,j;
+
+ set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
+ p->storage_amount=tmp_int[1];
+
+ if(set!=2)
+ return 1;
+ if(str[next]=='\n' || str[next]=='\r')
+ return 0;
+ next++;
+ for(i=0;str[next] && str[next]!='\t' && i < MAX_GUILD_STORAGE;i++){
+ if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d%[0-9,-]%n",
+ &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
+ &tmp_int[4], &tmp_int[5], &tmp_int[6], tmp_str, &len) == 8)
+ {
+ p->storage_[i].id = tmp_int[0];
+ p->storage_[i].nameid = tmp_int[1];
+ p->storage_[i].amount = tmp_int[2];
+ p->storage_[i].equip = tmp_int[3];
+ p->storage_[i].identify = tmp_int[4];
+ p->storage_[i].refine = tmp_int[5];
+ p->storage_[i].attribute = tmp_int[6];
+ for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
+ p->storage_[i].card[j] = tmp_int[0];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ else return 1;
+ }
+ if (i >= MAX_GUILD_STORAGE && str[next] && str[next]!='\t')
+ ShowWarning("guild_storage_fromstr: Found a storage line with more items than MAX_GUILD_STORAGE (%d), remaining items have been discarded!\n", MAX_GUILD_STORAGE);
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+static void* create_storage(DBKey key, va_list args) {
+ struct storage *s;
+ s = (struct storage *) aCalloc(sizeof(struct storage), 1);
+ s->account_id=key.i;
+ return s;
+}
+
+// ƒAƒJƒEƒ“ƒg‚©‚ç‘qŒÉƒf[ƒ^ƒCƒ“ƒfƒbƒNƒX‚𓾂éiV‹K‘qŒÉ’ljÁ‰Â”\j
+struct storage *account2storage(int account_id)
+{
+ struct storage *s;
+ s= idb_ensure(storage_db, account_id, create_storage);
+ return s;
+}
+
+static void* create_guildstorage(DBKey key, va_list args) {
+ struct guild_storage *gs = NULL;
+ gs = (struct guild_storage *) aCalloc(sizeof(struct guild_storage), 1);
+ gs->guild_id=key.i;
+ return gs;
+}
+
+struct guild_storage *guild2storage(int guild_id)
+{
+ struct guild_storage *gs = NULL;
+ if(inter_guild_search(guild_id) != NULL)
+ gs= idb_ensure(guild_storage_db, guild_id, create_guildstorage);
+ return gs;
+}
+
+//---------------------------------------------------------
+// ‘qŒÉƒf[ƒ^‚ð“Ç‚Ýž‚Þ
+int inter_storage_init()
+{
+ char line[65536];
+ int c=0,tmp_int;
+ struct storage *s;
+ struct guild_storage *gs;
+ FILE *fp;
+
+ storage_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ fp=fopen(storage_txt,"r");
+ if(fp==NULL){
+ ShowError("cant't read : %s\n",storage_txt);
+ return 1;
+ }
+ while(fgets(line,65535,fp)){
+ sscanf(line,"%d",&tmp_int);
+ s = (struct storage*)aCalloc(sizeof(struct storage), 1);
+ if(s==NULL){
+ ShowFatalError("int_storage: out of memory!\n");
+ exit(0);
+ }
+// memset(s,0,sizeof(struct storage)); aCalloc does this...
+ s->account_id=tmp_int;
+ if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
+ idb_put(storage_db,s->account_id,s);
+ }
+ else{
+ ShowError("int_storage: broken data [%s] line %d\n",storage_txt,c);
+ aFree(s);
+ }
+ c++;
+ }
+ fclose(fp);
+
+ c = 0;
+ guild_storage_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ fp=fopen(guild_storage_txt,"r");
+ if(fp==NULL){
+ ShowError("cant't read : %s\n",guild_storage_txt);
+ return 1;
+ }
+ while(fgets(line,65535,fp)){
+ sscanf(line,"%d",&tmp_int);
+ gs = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
+ if(gs==NULL){
+ ShowFatalError("int_storage: out of memory!\n");
+ exit(0);
+ }
+// memset(gs,0,sizeof(struct guild_storage)); aCalloc...
+ gs->guild_id=tmp_int;
+ if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
+ idb_put(guild_storage_db,gs->guild_id,gs);
+ }
+ else{
+ ShowError("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
+ aFree(gs);
+ }
+ c++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+void inter_storage_final() {
+ storage_db->destroy(storage_db, NULL);
+ guild_storage_db->destroy(guild_storage_db, NULL);
+ return;
+}
+
+int inter_storage_save_sub(DBKey key,void *data,va_list ap)
+{
+ char line[65536];
+ FILE *fp;
+ storage_tostr(line,(struct storage *)data);
+ fp=va_arg(ap,FILE *);
+ if(*line)
+ fprintf(fp,"%s" RETCODE,line);
+ return 0;
+}
+//---------------------------------------------------------
+// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
+int inter_storage_save()
+{
+ FILE *fp;
+ int lock;
+ if( (fp=lock_fopen(storage_txt,&lock))==NULL ){
+ ShowError("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
+ return 1;
+ }
+ storage_db->foreach(storage_db,inter_storage_save_sub,fp);
+ lock_fclose(fp,storage_txt,&lock);
+// printf("int_storage: %s saved.\n",storage_txt);
+ return 0;
+}
+
+int inter_guild_storage_save_sub(DBKey key,void *data,va_list ap)
+{
+ char line[65536];
+ FILE *fp;
+ if(inter_guild_search(((struct guild_storage *)data)->guild_id) != NULL) {
+ guild_storage_tostr(line,(struct guild_storage *)data);
+ fp=va_arg(ap,FILE *);
+ if(*line)
+ fprintf(fp,"%s" RETCODE,line);
+ }
+ return 0;
+}
+//---------------------------------------------------------
+// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
+int inter_guild_storage_save()
+{
+ FILE *fp;
+ int lock;
+ if( (fp=lock_fopen(guild_storage_txt,&lock))==NULL ){
+ ShowError("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
+ return 1;
+ }
+ guild_storage_db->foreach(guild_storage_db,inter_guild_storage_save_sub,fp);
+ lock_fclose(fp,guild_storage_txt,&lock);
+// printf("int_storage: %s saved.\n",guild_storage_txt);
+ return 0;
+}
+
+// ‘qŒÉƒf[ƒ^íœ
+int inter_storage_delete(int account_id)
+{
+ struct storage *s = idb_get(storage_db,account_id);
+ if(s) {
+ int i;
+ for(i=0;i<s->storage_amount;i++){
+ if(s->storage_[i].card[0] == (short)0xff00)
+ inter_pet_delete( MakeDWord(s->storage_[i].card[1],s->storage_[i].card[2]) );
+ }
+ idb_remove(storage_db,account_id);
+ }
+ return 0;
+}
+
+// ƒMƒ‹ƒh‘qŒÉƒf[ƒ^íœ
+int inter_guild_storage_delete(int guild_id)
+{
+ struct guild_storage *gs = idb_get(guild_storage_db,guild_id);
+ if(gs) {
+ int i;
+ for(i=0;i<gs->storage_amount;i++){
+ if(gs->storage_[i].card[0] == (short)0xff00)
+ inter_pet_delete( MakeDWord(gs->storage_[i].card[1],gs->storage_[i].card[2]) );
+ }
+ idb_remove(guild_storage_db,guild_id);
+ }
+ return 0;
+}
+
+//---------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ‘qŒÉƒf[ƒ^‚Ì‘—M
+int mapif_load_storage(int fd,int account_id)
+{
+ struct storage *s=account2storage(account_id);
+ WFIFOHEAD(fd, sizeof(struct storage)+8);
+ WFIFOW(fd,0)=0x3810;
+ WFIFOW(fd,2)=sizeof(struct storage)+8;
+ WFIFOL(fd,4)=account_id;
+ memcpy(WFIFOP(fd,8),s,sizeof(struct storage));
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+// ‘qŒÉƒf[ƒ^•Û‘¶Š®—¹‘—M
+int mapif_save_storage_ack(int fd,int account_id)
+{
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0)=0x3811;
+ WFIFOL(fd,2)=account_id;
+ WFIFOB(fd,6)=0;
+ WFIFOSET(fd,7);
+ return 0;
+}
+
+int mapif_load_guild_storage(int fd,int account_id,int guild_id)
+{
+ struct guild_storage *gs=guild2storage(guild_id);
+ WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
+ WFIFOW(fd,0)=0x3818;
+ if(gs) {
+ WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=guild_id;
+ memcpy(WFIFOP(fd,12),gs,sizeof(struct guild_storage));
+ }
+ else {
+ WFIFOW(fd,2)=12;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=0;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
+{
+ WFIFOHEAD(fd, 11);
+ WFIFOW(fd,0)=0x3819;
+ WFIFOL(fd,2)=account_id;
+ WFIFOL(fd,6)=guild_id;
+ WFIFOB(fd,10)=fail;
+ WFIFOSET(fd,11);
+ return 0;
+}
+
+//---------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+// ‘qŒÉƒf[ƒ^—v‹ŽóM
+int mapif_parse_LoadStorage(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_load_storage(fd,RFIFOL(fd,2));
+ return 0;
+}
+// ‘qŒÉƒf[ƒ^ŽóM••Û‘¶
+int mapif_parse_SaveStorage(int fd)
+{
+ struct storage *s;
+ int account_id, len;
+ RFIFOHEAD(fd);
+ account_id=RFIFOL(fd,4);
+ len=RFIFOW(fd,2);
+ if(sizeof(struct storage)!=len-8){
+ ShowError("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
+ }
+ else {
+ s=account2storage(account_id);
+ memcpy(s,RFIFOP(fd,8),sizeof(struct storage));
+ mapif_save_storage_ack(fd,account_id);
+ }
+ return 0;
+}
+
+int mapif_parse_LoadGuildStorage(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
+ return 0;
+}
+int mapif_parse_SaveGuildStorage(int fd)
+{
+ struct guild_storage *gs;
+ int guild_id, len;
+ RFIFOHEAD(fd);
+ guild_id=RFIFOL(fd,8);
+ len=RFIFOW(fd,2);
+ if(sizeof(struct guild_storage)!=len-12){
+ ShowError("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
+ }
+ else {
+ gs=guild2storage(guild_id);
+ if(gs) {
+ memcpy(gs,RFIFOP(fd,12),sizeof(struct guild_storage));
+ mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
+ }
+ else
+ mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
+ }
+ return 0;
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_storage_parse_frommap(int fd)
+{
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)){
+ case 0x3010: mapif_parse_LoadStorage(fd); break;
+ case 0x3011: mapif_parse_SaveStorage(fd); break;
+ case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
+ case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/int_storage.h b/src/char/int_storage.h
index c15af003e..7007646f9 100644
--- a/src/char/int_storage.h
+++ b/src/char/int_storage.h
@@ -1,22 +1,22 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_init(void);
-void inter_storage_final(void);
-int inter_storage_save(void);
-int inter_guild_storage_save(void);
-int inter_storage_delete(int account_id);
-int inter_guild_storage_delete(int guild_id);
-
-int inter_storage_parse_frommap(int fd);
-
-extern char storage_txt[1024];
-extern char guild_storage_txt[1024];
-
-//Exported for use in the TXT-SQL converter.
-int storage_fromstr(char *str,struct storage *p);
-int guild_storage_fromstr(char *str,struct guild_storage *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_STORAGE_H_
+#define _INT_STORAGE_H_
+
+int inter_storage_init(void);
+void inter_storage_final(void);
+int inter_storage_save(void);
+int inter_guild_storage_save(void);
+int inter_storage_delete(int account_id);
+int inter_guild_storage_delete(int guild_id);
+
+int inter_storage_parse_frommap(int fd);
+
+extern char storage_txt[1024];
+extern char guild_storage_txt[1024];
+
+//Exported for use in the TXT-SQL converter.
+int storage_fromstr(char *str,struct storage *p);
+int guild_storage_fromstr(char *str,struct guild_storage *p);
+#endif
diff --git a/src/char/inter.c b/src/char/inter.c
index ab97c6512..fd46e0b33 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -1,692 +1,692 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "../common/db.h"
-#include "../common/mmo.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/lock.h"
-#include "../common/showmsg.h"
-
-#include "char.h"
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_status.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "int_homun.h"
-
-#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds)
- // that is the waiting time of answers of all map-servers
-#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list
-
-char accreg_txt[1024] = "save/accreg.txt";
-#ifndef TXT_SQL_CONVERT
-char inter_log_filename[1024] = "log/inter.log";
-char main_chat_nick[16] = "Main";
-
-static struct dbt *accreg_db = NULL;
-
-unsigned int party_share_level = 10;
-
-// sending packet list
-// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
-int inter_send_packet_length[]={
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-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,
- 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// recv. packet list
-int inter_recv_packet_length[]={
- -1,-1, 7,-1, -1,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
- -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
- -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
- 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,14,-1, 6, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3080-0x308f
- -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
-};
-
-struct WisData {
- int id, fd, count, len;
- unsigned long tick;
- unsigned char src[24], dst[24], msg[1024];
-};
-static struct dbt * wis_db = NULL;
-static int wis_dellist[WISDELLIST_MAX], wis_delnum;
-
-
-//--------------------------------------------------------
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚Ö•ÏŠ·
-int inter_accreg_tostr(char *str, struct accreg *reg) {
- int j;
- char *p = str;
-
- p += sprintf(p, "%d\t", reg->account_id);
- for(j = 0; j < reg->reg_num; j++) {
- p += sprintf(p,"%s,%s ", reg->reg[j].str, reg->reg[j].value);
- }
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚©‚ç•ÏŠ·
-int inter_accreg_fromstr(const char *str, struct accreg *reg) {
- int j, n;
- const char *p = str;
-
- if (sscanf(p, "%d\t%n", &reg->account_id, &n ) != 1 || reg->account_id <= 0)
- return 1;
-
- for(j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n) {
- if (sscanf(p, "%[^,],%[^ ] %n", reg->reg[j].str, reg->reg[j].value, &n) != 2)
- break;
- }
- reg->reg_num = j;
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// ƒAƒJƒEƒ“ƒg•Ï”‚Ì“Ç‚Ýž‚Ý
-int inter_accreg_init(void) {
- char line[8192];
- FILE *fp;
- int c = 0;
- struct accreg *reg;
-
- accreg_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if( (fp = fopen(accreg_txt, "r")) == NULL)
- return 1;
- while(fgets(line, sizeof(line)-1, fp)){
- line[sizeof(line)-1] = '\0';
-
- reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1);
- if (reg == NULL) {
- ShowFatalError("inter: accreg: out of memory!\n");
- exit(0);
- }
- if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) {
- idb_put(accreg_db, reg->account_id, reg);
- } else {
- ShowError("inter: accreg: broken data [%s] line %d\n", accreg_txt, c);
- aFree(reg);
- }
- c++;
- }
- fclose(fp);
-// printf("inter: %s read done (%d)\n", accreg_txt, c);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu—p
-int inter_accreg_save_sub(DBKey key, void *data, va_list ap) {
- char line[8192];
- FILE *fp;
- struct accreg *reg = (struct accreg *)data;
-
- if (reg->reg_num > 0) {
- inter_accreg_tostr(line,reg);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
- }
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu
-int inter_accreg_save(void) {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) {
- ShowError("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt);
- return 1;
- }
- accreg_db->foreach(accreg_db, inter_accreg_save_sub,fp);
- lock_fclose(fp, accreg_txt, &lock);
-// printf("inter: %s saved.\n", accreg_txt);
-
- return 0;
-}
-
-//--------------------------------------------------------
-#endif //TXT_SQL_CONVERT
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int inter_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- ShowError("file not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line, sizeof(line) - 1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
-
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if (strcmpi(w1, "storage_txt") == 0) {
- strncpy(storage_txt, w2, sizeof(storage_txt));
- } else if (strcmpi(w1, "party_txt") == 0) {
- strncpy(party_txt, w2, sizeof(party_txt));
- } else if (strcmpi(w1, "pet_txt") == 0) {
- strncpy(pet_txt, w2, sizeof(pet_txt));
- } else if (strcmpi(w1, "accreg_txt") == 0) {
- strncpy(accreg_txt, w2, sizeof(accreg_txt));
- } else if (strcmpi(w1, "guild_txt") == 0) {
- strncpy(guild_txt, w2, sizeof(guild_txt));
- } else if (strcmpi(w1, "castle_txt") == 0) {
- strncpy(castle_txt, w2, sizeof(castle_txt));
- } else if (strcmpi(w1, "guild_storage_txt") == 0) {
- strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt));
-#ifndef TXT_SQL_CONVERT
- } else if (strcmpi(w1, "homun_txt") == 0) {
- strncpy(homun_txt, w2, sizeof(homun_txt));
- } else if (strcmpi(w1, "party_share_level") == 0) {
- party_share_level = (unsigned int)atof(w2);
- } else if (strcmpi(w1, "inter_log_filename") == 0) {
- strncpy(inter_log_filename, w2, sizeof(inter_log_filename));
- } else if(strcmpi(w1,"log_inter")==0) {
- log_inter = atoi(w2);
- } else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
- strcpy(main_chat_nick, w2);
-#endif //TXT_SQL_CONVERT
- } else if (strcmpi(w1, "import") == 0) {
- inter_config_read(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// ƒƒO‘‚«o‚µ
-int inter_log(char *fmt,...) {
- FILE *logfp;
- va_list ap;
-
- va_start(ap,fmt);
- logfp = fopen(inter_log_filename, "a");
- if (logfp) {
- vfprintf(logfp, fmt, ap);
- fclose(logfp);
- }
- va_end(ap);
-
- return 0;
-}
-
-// ƒZ[ƒu
-int inter_save(void) {
-#ifdef ENABLE_SC_SAVING
- inter_status_save();
-#endif
- inter_party_save();
- inter_guild_save();
- inter_storage_save();
- inter_guild_storage_save();
- inter_pet_save();
- inter_homun_save();
- inter_accreg_save();
-
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// ‰Šú‰»
-int inter_init_txt(const char *file) {
- inter_config_read(file);
-
-#ifndef TXT_SQL_CONVERT
- wis_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- inter_party_init();
- inter_guild_init();
- inter_storage_init();
- inter_pet_init();
- inter_homun_init();
- inter_accreg_init();
-#endif //TXT_SQL_CONVERT
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// finalize
-void inter_final(void) {
- accreg_db->destroy(accreg_db, NULL);
- wis_db->destroy(wis_db, NULL);
-
- inter_party_final();
- inter_guild_final();
- inter_storage_final();
- inter_pet_final();
- inter_homun_final();
-
- return;
-}
-
-// ƒ}ƒbƒvƒT[ƒo[Ú‘±
-int inter_mapif_init(int fd) {
- inter_guild_mapif_init(fd);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// sended packets to map-server
-
-//Sends to map server the current max Account/Char id [Skotlex]
-void mapif_send_maxid(int account_id, int char_id)
-{
- unsigned char buf[12];
-
- WBUFW(buf,0) = 0x2b07;
- WBUFL(buf,2) = account_id;
- WBUFL(buf,6) = char_id;
- mapif_sendall(buf, 10);
-}
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
- unsigned char buf[2048];
-
- if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
- WBUFW(buf,0) = 0x3800;
- WBUFW(buf,2) = len;
- WBUFL(buf,4) = color;
- memcpy(WBUFP(buf,8), mes, len - 8);
- mapif_sendallwos(sfd, buf, len);
-// printf("inter server: GM:%d %s\n", len, mes);
-
- return 0;
-}
-
-// Wisp/page transmission to one map-server
-int mapif_wis_message2(struct WisData *wd, int fd) {
- WFIFOHEAD(fd, 56+wd->len);
- WFIFOW(fd, 0) = 0x3801;
- WFIFOW(fd, 2) = 56 + wd->len;
- WFIFOL(fd, 4) = wd->id;
- memcpy(WFIFOP(fd, 8), wd->src, NAME_LENGTH);
- memcpy(WFIFOP(fd,32), wd->dst, NAME_LENGTH);
- memcpy(WFIFOP(fd,56), wd->msg, wd->len);
- wd->count = 1;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 1;
-}
-
-// Wisp/page transmission to all map-server
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[2048];
- if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 + wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, NAME_LENGTH);
- memcpy(WBUFP(buf,32), wd->dst, NAME_LENGTH);
- memcpy(WBUFP(buf,56), wd->msg, wd->len);
- wd->count = mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-int mapif_wis_fail(int fd, char *src) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), src, NAME_LENGTH);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- return 0;
-
-}
-
-// Wisp/page transmission result to map-server
-int mapif_wis_end(struct WisData *wd, int flag) {
- unsigned char buf[27];
-
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), wd->src, 24);
- WBUFB(buf,26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(wd->fd, buf, 27);
-// printf("inter server wis_end: flag: %d\n", flag);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M
-int mapif_account_reg(int fd, unsigned char *src) {
- unsigned char *buf = aCalloc(1,WBUFW(src,2));
-
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0) = 0x3804;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
-
- aFree(buf);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”—v‹•ÔM
-int mapif_account_reg_reply(int fd,int account_id, int char_id) {
- struct accreg *reg = idb_get(accreg_db,account_id);
-
- WFIFOHEAD(fd, ACCOUNT_REG_NUM * 288+ 13);
- WFIFOW(fd,0) = 0x3804;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = char_id;
- WFIFOB(fd,12) = 2; //Acc Reg
- if (reg == NULL) {
- WFIFOW(fd,2) = 13;
- } else {
- int i, p;
- for (p=13,i = 0; i < reg->reg_num; i++) {
- p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].value)+1;
- }
- WFIFOW(fd,2)=p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-//Request to kick char from a certain map server. [Skotlex]
-int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
-{
- if (fd < 0)
- return -1;
-
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0) = 0x2b1f;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = reason;
- WFIFOSET(fd,7);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
- unsigned long tick;
- struct WisData *wd = (struct WisData *)data;
- tick = va_arg(ap, unsigned long);
-
- if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
- wis_dellist[wis_delnum++] = wd->id;
-
- return 0;
-}
-
-int check_ttl_wisdata(void) {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- wis_db->foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = idb_get(wis_db, wis_dellist[i]);
- ShowWarning("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
- // removed. not send information after a timeout. Just no answer for the player
- //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- idb_remove(wis_db, wd->id);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// received packets from map-server
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_parse_GMmessage(int fd) {
- RFIFOHEAD(fd);
- mapif_GMmessage(RFIFOP(fd,8), RFIFOW(fd,2), RFIFOL(fd,4), fd);
-
- return 0;
-}
-
-static struct WisData* mapif_create_whisper(int fd, char* src, char* dst, char* mes, int meslen)
-{
- static int wisid = 0;
- struct WisData* wd = (struct WisData *)aCalloc(sizeof(struct WisData), 1);
- if (wd == NULL){
- ShowFatalError("inter: WisRequest: out of memory !\n");
- return NULL;
- }
- wd->id = ++wisid;
- wd->fd = fd;
- wd->len= meslen;
- memcpy(wd->src, src, NAME_LENGTH);
- memcpy(wd->dst, dst, NAME_LENGTH);
- memcpy(wd->msg, mes, meslen);
- wd->tick = gettick();
- return wd;
-}
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct mmo_charstatus* char_status;
- struct WisData* wd;
- char name[NAME_LENGTH];
- int fd2;
-
- RFIFOHEAD(fd);
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- ShowWarning("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- ShowError("inter: Wis message doesn't exist.\n");
- return 0;
- }
-
- memcpy(name, RFIFOP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex]
- name[NAME_LENGTH-1]= '\0';
- // search if character exists before to ask all map-servers
- char_status = search_character_byname(name);
- if (char_status == NULL)
- return mapif_wis_fail(fd, RFIFOP(fd, 4));
-
- // Character exists.
- // to be sure of the correct name, rewrite it
- memset(name, 0, NAME_LENGTH);
- strncpy(name, char_status->name, NAME_LENGTH);
- // if source is destination, don't ask other servers.
- if (strcmp((char*)RFIFOP(fd,4),name) == 0)
- return mapif_wis_fail(fd, RFIFOP(fd, 4));
-
- //Look for online character.
- fd2 = search_character_online(char_status->account_id, char_status->char_id);
- if (fd2 >= 0) { //Character online, send whisper.
- wd = mapif_create_whisper(fd, RFIFOP(fd, 4), RFIFOP(fd,28), RFIFOP(fd,52), RFIFOW(fd,2)-52);
- if (!wd) return 1;
- idb_put(wis_db, wd->id, wd);
- mapif_wis_message2(wd, fd2);
- return 0;
- }
- //Not found.
- return mapif_wis_fail(fd, RFIFOP(fd, 4));
-
-/* Scrapped since now we know where characters are online in. [Skotlex]
- wd = mapif_create_whisper(fd, RFIFOP(fd, 4), RFIFOP(fd,28), RFIFOP(fd,52), RFIFOW(fd,2)-52);
- if (!wd) return 0;
- idb_put(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- return 0;
-*/
-}
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id, flag;
- struct WisData *wd;
- RFIFOHEAD(fd);
- id = RFIFOL(fd,2);
- flag = RFIFOB(fd,6);
- wd = idb_get(wis_db, id);
-
- if (wd == NULL)
- return 0; // This wisp was probably suppress before, because it was timeout or because of target was found on another map-server
-
- if ((--wd->count) <= 0 || flag != 1) {
- mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- idb_remove(wis_db, id);
- }
-
- return 0;
-}
-
-// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
-int mapif_parse_WisToGM(int fd) {
- unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- RFIFOHEAD(fd);
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf, 0) = 0x3803;
- mapif_sendall(buf, RFIFOW(fd,2));
-
- return 0;
-}
-
-static void* create_accreg(DBKey key, va_list args) {
- struct accreg *reg;
- reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1);
- reg->account_id = key.i;
- return reg;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
-int mapif_parse_Registry(int fd) {
- int j, p, len;
- struct accreg *reg;
- RFIFOHEAD(fd);
-
- switch (RFIFOB(fd,12)) {
- case 3: //Character registry
- return char_parse_Registry(RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,13), RFIFOW(fd,2)-13);
- case 2: //Acc Reg
- break;
- case 1: //Acc Reg2, forward to login
- return save_accreg2(RFIFOP(fd,4), RFIFOW(fd,2)-4);
- default: //Error?
- return 1;
- }
- reg = idb_ensure(accreg_db, RFIFOL(fd,4), create_accreg);
-
- for(j=0,p=13;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++){
- sscanf(RFIFOP(fd,p), "%31c%n",reg->reg[j].str,&len);
- reg->reg[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf(RFIFOP(fd,p), "%255c%n",reg->reg[j].value,&len);
- reg->reg[j].value[len]='\0';
- p +=len+1;
- }
- reg->reg_num=j;
- mapif_account_reg(fd, RFIFOP(fd,0)); // ‘¼‚ÌMAPƒT[ƒo[‚É‘—M
-
- return 0;
-}
-
-// Request the value of all registries.
-int mapif_parse_RegistryRequest(int fd)
-{
- RFIFOHEAD(fd);
- //Load Char Registry
- if (RFIFOB(fd,12))
- char_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- //Load Account Registry
- if (RFIFOB(fd,11))
- mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- //Ask Login Server for Account2 values.
- if (RFIFOB(fd,10))
- request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
- return 1;
-}
-
-//--------------------------------------------------------
-
-// map server ‚©‚ç‚Ì’ÊMi‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æj
-// ƒGƒ‰[‚È‚ç0(false)Aˆ—‚Å‚«‚½‚È‚ç1A
-// ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_parse_frommap(int fd) {
- int cmd, len;
- RFIFOHEAD(fd);
- cmd = RFIFOW(fd,0);
- len = 0;
-
- // interŽIŠÇŠ‚©‚𒲂ׂé
- if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0])))
- return 0;
-
- if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
- return 0;
-
- // ƒpƒPƒbƒg’·‚𒲂ׂé
- if ((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
- return 2;
-
- switch(cmd) {
- case 0x3000: mapif_parse_GMmessage(fd); break;
- case 0x3001: mapif_parse_WisRequest(fd); break;
- case 0x3002: mapif_parse_WisReply(fd); break;
- case 0x3003: mapif_parse_WisToGM(fd); break;
- case 0x3004: mapif_parse_Registry(fd); break;
- case 0x3005: mapif_parse_RegistryRequest(fd); break;
- default:
- if (inter_party_parse_frommap(fd))
- break;
- if (inter_guild_parse_frommap(fd))
- break;
- if (inter_storage_parse_frommap(fd))
- break;
- if (inter_pet_parse_frommap(fd))
- break;
- if (inter_homun_parse_frommap(fd))
- break;
- return 0;
- }
- RFIFOSKIP(fd, len);
- return 1;
-}
-
-// RFIFO‚̃pƒPƒbƒg’·Šm”F
-// •K—vƒpƒPƒbƒg’·‚ª‚ ‚ê‚΃pƒPƒbƒg’·A‚Ü‚¾‘«‚è‚È‚¯‚ê‚Î0
-int inter_check_length(int fd, int length) {
- if (length == -1) { // ‰Â•ÏƒpƒPƒbƒg’·
- RFIFOHEAD(fd);
- if (RFIFOREST(fd) < 4) // ƒpƒPƒbƒg’·‚ª–¢’…
- return 0;
- length = RFIFOW(fd,2);
- }
-
- if ((int)RFIFOREST(fd) < length) // ƒpƒPƒbƒg‚ª–¢’…
- return 0;
-
- return length;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "../common/db.h"
+#include "../common/mmo.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/malloc.h"
+#include "../common/lock.h"
+#include "../common/showmsg.h"
+
+#include "char.h"
+#include "inter.h"
+#include "int_party.h"
+#include "int_guild.h"
+#include "int_status.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "int_homun.h"
+
+#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds)
+ // that is the waiting time of answers of all map-servers
+#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list
+
+char accreg_txt[1024] = "save/accreg.txt";
+#ifndef TXT_SQL_CONVERT
+char inter_log_filename[1024] = "log/inter.log";
+char main_chat_nick[16] = "Main";
+
+static struct dbt *accreg_db = NULL;
+
+unsigned int party_share_level = 10;
+
+// sending packet list
+// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
+int inter_send_packet_length[]={
+ -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
+ -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
+ 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
+ 9, 9,-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,
+ 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+// recv. packet list
+int inter_recv_packet_length[]={
+ -1,-1, 7,-1, -1,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
+ 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
+ -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
+ -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
+ 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48,14,-1, 6, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3080-0x308f
+ -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
+};
+
+struct WisData {
+ int id, fd, count, len;
+ unsigned long tick;
+ unsigned char src[24], dst[24], msg[1024];
+};
+static struct dbt * wis_db = NULL;
+static int wis_dellist[WISDELLIST_MAX], wis_delnum;
+
+
+//--------------------------------------------------------
+
+// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚Ö•ÏŠ·
+int inter_accreg_tostr(char *str, struct accreg *reg) {
+ int j;
+ char *p = str;
+
+ p += sprintf(p, "%d\t", reg->account_id);
+ for(j = 0; j < reg->reg_num; j++) {
+ p += sprintf(p,"%s,%s ", reg->reg[j].str, reg->reg[j].value);
+ }
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚©‚ç•ÏŠ·
+int inter_accreg_fromstr(const char *str, struct accreg *reg) {
+ int j, n;
+ const char *p = str;
+
+ if (sscanf(p, "%d\t%n", &reg->account_id, &n ) != 1 || reg->account_id <= 0)
+ return 1;
+
+ for(j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n) {
+ if (sscanf(p, "%[^,],%[^ ] %n", reg->reg[j].str, reg->reg[j].value, &n) != 2)
+ break;
+ }
+ reg->reg_num = j;
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// ƒAƒJƒEƒ“ƒg•Ï”‚Ì“Ç‚Ýž‚Ý
+int inter_accreg_init(void) {
+ char line[8192];
+ FILE *fp;
+ int c = 0;
+ struct accreg *reg;
+
+ accreg_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if( (fp = fopen(accreg_txt, "r")) == NULL)
+ return 1;
+ while(fgets(line, sizeof(line)-1, fp)){
+ line[sizeof(line)-1] = '\0';
+
+ reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1);
+ if (reg == NULL) {
+ ShowFatalError("inter: accreg: out of memory!\n");
+ exit(0);
+ }
+ if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) {
+ idb_put(accreg_db, reg->account_id, reg);
+ } else {
+ ShowError("inter: accreg: broken data [%s] line %d\n", accreg_txt, c);
+ aFree(reg);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("inter: %s read done (%d)\n", accreg_txt, c);
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu—p
+int inter_accreg_save_sub(DBKey key, void *data, va_list ap) {
+ char line[8192];
+ FILE *fp;
+ struct accreg *reg = (struct accreg *)data;
+
+ if (reg->reg_num > 0) {
+ inter_accreg_tostr(line,reg);
+ fp = va_arg(ap, FILE *);
+ fprintf(fp, "%s" RETCODE, line);
+ }
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu
+int inter_accreg_save(void) {
+ FILE *fp;
+ int lock;
+
+ if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) {
+ ShowError("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt);
+ return 1;
+ }
+ accreg_db->foreach(accreg_db, inter_accreg_save_sub,fp);
+ lock_fclose(fp, accreg_txt, &lock);
+// printf("inter: %s saved.\n", accreg_txt);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+#endif //TXT_SQL_CONVERT
+/*==========================================
+ * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+static int inter_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp = fopen(cfgName, "r");
+ if (fp == NULL) {
+ ShowError("file not found: %s\n", cfgName);
+ return 1;
+ }
+ while(fgets(line, sizeof(line) - 1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ line[sizeof(line)-1] = '\0';
+
+ if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ if (strcmpi(w1, "storage_txt") == 0) {
+ strncpy(storage_txt, w2, sizeof(storage_txt));
+ } else if (strcmpi(w1, "party_txt") == 0) {
+ strncpy(party_txt, w2, sizeof(party_txt));
+ } else if (strcmpi(w1, "pet_txt") == 0) {
+ strncpy(pet_txt, w2, sizeof(pet_txt));
+ } else if (strcmpi(w1, "accreg_txt") == 0) {
+ strncpy(accreg_txt, w2, sizeof(accreg_txt));
+ } else if (strcmpi(w1, "guild_txt") == 0) {
+ strncpy(guild_txt, w2, sizeof(guild_txt));
+ } else if (strcmpi(w1, "castle_txt") == 0) {
+ strncpy(castle_txt, w2, sizeof(castle_txt));
+ } else if (strcmpi(w1, "guild_storage_txt") == 0) {
+ strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt));
+#ifndef TXT_SQL_CONVERT
+ } else if (strcmpi(w1, "homun_txt") == 0) {
+ strncpy(homun_txt, w2, sizeof(homun_txt));
+ } else if (strcmpi(w1, "party_share_level") == 0) {
+ party_share_level = (unsigned int)atof(w2);
+ } else if (strcmpi(w1, "inter_log_filename") == 0) {
+ strncpy(inter_log_filename, w2, sizeof(inter_log_filename));
+ } else if(strcmpi(w1,"log_inter")==0) {
+ log_inter = atoi(w2);
+ } else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
+ strcpy(main_chat_nick, w2);
+#endif //TXT_SQL_CONVERT
+ } else if (strcmpi(w1, "import") == 0) {
+ inter_config_read(w2);
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// ƒƒO‘‚«o‚µ
+int inter_log(char *fmt,...) {
+ FILE *logfp;
+ va_list ap;
+
+ va_start(ap,fmt);
+ logfp = fopen(inter_log_filename, "a");
+ if (logfp) {
+ vfprintf(logfp, fmt, ap);
+ fclose(logfp);
+ }
+ va_end(ap);
+
+ return 0;
+}
+
+// ƒZ[ƒu
+int inter_save(void) {
+#ifdef ENABLE_SC_SAVING
+ inter_status_save();
+#endif
+ inter_party_save();
+ inter_guild_save();
+ inter_storage_save();
+ inter_guild_storage_save();
+ inter_pet_save();
+ inter_homun_save();
+ inter_accreg_save();
+
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// ‰Šú‰»
+int inter_init_txt(const char *file) {
+ inter_config_read(file);
+
+#ifndef TXT_SQL_CONVERT
+ wis_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ inter_party_init();
+ inter_guild_init();
+ inter_storage_init();
+ inter_pet_init();
+ inter_homun_init();
+ inter_accreg_init();
+#endif //TXT_SQL_CONVERT
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// finalize
+void inter_final(void) {
+ accreg_db->destroy(accreg_db, NULL);
+ wis_db->destroy(wis_db, NULL);
+
+ inter_party_final();
+ inter_guild_final();
+ inter_storage_final();
+ inter_pet_final();
+ inter_homun_final();
+
+ return;
+}
+
+// ƒ}ƒbƒvƒT[ƒo[Ú‘±
+int inter_mapif_init(int fd) {
+ inter_guild_mapif_init(fd);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// sended packets to map-server
+
+//Sends to map server the current max Account/Char id [Skotlex]
+void mapif_send_maxid(int account_id, int char_id)
+{
+ unsigned char buf[12];
+
+ WBUFW(buf,0) = 0x2b07;
+ WBUFL(buf,2) = account_id;
+ WBUFL(buf,6) = char_id;
+ mapif_sendall(buf, 10);
+}
+
+// GMƒƒbƒZ[ƒW‘—M
+int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
+ unsigned char buf[2048];
+
+ if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
+ WBUFW(buf,0) = 0x3800;
+ WBUFW(buf,2) = len;
+ WBUFL(buf,4) = color;
+ memcpy(WBUFP(buf,8), mes, len - 8);
+ mapif_sendallwos(sfd, buf, len);
+// printf("inter server: GM:%d %s\n", len, mes);
+
+ return 0;
+}
+
+// Wisp/page transmission to one map-server
+int mapif_wis_message2(struct WisData *wd, int fd) {
+ WFIFOHEAD(fd, 56+wd->len);
+ WFIFOW(fd, 0) = 0x3801;
+ WFIFOW(fd, 2) = 56 + wd->len;
+ WFIFOL(fd, 4) = wd->id;
+ memcpy(WFIFOP(fd, 8), wd->src, NAME_LENGTH);
+ memcpy(WFIFOP(fd,32), wd->dst, NAME_LENGTH);
+ memcpy(WFIFOP(fd,56), wd->msg, wd->len);
+ wd->count = 1;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 1;
+}
+
+// Wisp/page transmission to all map-server
+int mapif_wis_message(struct WisData *wd) {
+ unsigned char buf[2048];
+ if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
+
+ WBUFW(buf, 0) = 0x3801;
+ WBUFW(buf, 2) = 56 + wd->len;
+ WBUFL(buf, 4) = wd->id;
+ memcpy(WBUFP(buf, 8), wd->src, NAME_LENGTH);
+ memcpy(WBUFP(buf,32), wd->dst, NAME_LENGTH);
+ memcpy(WBUFP(buf,56), wd->msg, wd->len);
+ wd->count = mapif_sendall(buf, WBUFW(buf,2));
+
+ return 0;
+}
+
+int mapif_wis_fail(int fd, char *src) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), src, NAME_LENGTH);
+ WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(fd, buf, 27);
+ return 0;
+
+}
+
+// Wisp/page transmission result to map-server
+int mapif_wis_end(struct WisData *wd, int flag) {
+ unsigned char buf[27];
+
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), wd->src, 24);
+ WBUFB(buf,26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(wd->fd, buf, 27);
+// printf("inter server wis_end: flag: %d\n", flag);
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‘—M
+int mapif_account_reg(int fd, unsigned char *src) {
+ unsigned char *buf = aCalloc(1,WBUFW(src,2));
+
+ memcpy(WBUFP(buf,0),src,WBUFW(src,2));
+ WBUFW(buf, 0) = 0x3804;
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+
+ aFree(buf);
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”—v‹•ÔM
+int mapif_account_reg_reply(int fd,int account_id, int char_id) {
+ struct accreg *reg = idb_get(accreg_db,account_id);
+
+ WFIFOHEAD(fd, ACCOUNT_REG_NUM * 288+ 13);
+ WFIFOW(fd,0) = 0x3804;
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = char_id;
+ WFIFOB(fd,12) = 2; //Acc Reg
+ if (reg == NULL) {
+ WFIFOW(fd,2) = 13;
+ } else {
+ int i, p;
+ for (p=13,i = 0; i < reg->reg_num; i++) {
+ p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].str)+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].value)+1;
+ }
+ WFIFOW(fd,2)=p;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+//Request to kick char from a certain map server. [Skotlex]
+int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
+{
+ if (fd < 0)
+ return -1;
+
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0) = 0x2b1f;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = reason;
+ WFIFOSET(fd,7);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+
+// Existence check of WISP data
+int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
+ unsigned long tick;
+ struct WisData *wd = (struct WisData *)data;
+ tick = va_arg(ap, unsigned long);
+
+ if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
+ wis_dellist[wis_delnum++] = wd->id;
+
+ return 0;
+}
+
+int check_ttl_wisdata(void) {
+ unsigned long tick = gettick();
+ int i;
+
+ do {
+ wis_delnum = 0;
+ wis_db->foreach(wis_db, check_ttl_wisdata_sub, tick);
+ for(i = 0; i < wis_delnum; i++) {
+ struct WisData *wd = idb_get(wis_db, wis_dellist[i]);
+ ShowWarning("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
+ // removed. not send information after a timeout. Just no answer for the player
+ //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ idb_remove(wis_db, wd->id);
+ }
+ } while(wis_delnum >= WISDELLIST_MAX);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// received packets from map-server
+
+// GMƒƒbƒZ[ƒW‘—M
+int mapif_parse_GMmessage(int fd) {
+ RFIFOHEAD(fd);
+ mapif_GMmessage(RFIFOP(fd,8), RFIFOW(fd,2), RFIFOL(fd,4), fd);
+
+ return 0;
+}
+
+static struct WisData* mapif_create_whisper(int fd, char* src, char* dst, char* mes, int meslen)
+{
+ static int wisid = 0;
+ struct WisData* wd = (struct WisData *)aCalloc(sizeof(struct WisData), 1);
+ if (wd == NULL){
+ ShowFatalError("inter: WisRequest: out of memory !\n");
+ return NULL;
+ }
+ wd->id = ++wisid;
+ wd->fd = fd;
+ wd->len= meslen;
+ memcpy(wd->src, src, NAME_LENGTH);
+ memcpy(wd->dst, dst, NAME_LENGTH);
+ memcpy(wd->msg, mes, meslen);
+ wd->tick = gettick();
+ return wd;
+}
+
+// Wisp/page request to send
+int mapif_parse_WisRequest(int fd) {
+ struct mmo_charstatus* char_status;
+ struct WisData* wd;
+ char name[NAME_LENGTH];
+ int fd2;
+
+ RFIFOHEAD(fd);
+
+ if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
+ ShowWarning("inter: Wis message size too long.\n");
+ return 0;
+ } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
+ ShowError("inter: Wis message doesn't exist.\n");
+ return 0;
+ }
+
+ memcpy(name, RFIFOP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex]
+ name[NAME_LENGTH-1]= '\0';
+ // search if character exists before to ask all map-servers
+ char_status = search_character_byname(name);
+ if (char_status == NULL)
+ return mapif_wis_fail(fd, RFIFOP(fd, 4));
+
+ // Character exists.
+ // to be sure of the correct name, rewrite it
+ memset(name, 0, NAME_LENGTH);
+ strncpy(name, char_status->name, NAME_LENGTH);
+ // if source is destination, don't ask other servers.
+ if (strcmp((char*)RFIFOP(fd,4),name) == 0)
+ return mapif_wis_fail(fd, RFIFOP(fd, 4));
+
+ //Look for online character.
+ fd2 = search_character_online(char_status->account_id, char_status->char_id);
+ if (fd2 >= 0) { //Character online, send whisper.
+ wd = mapif_create_whisper(fd, RFIFOP(fd, 4), RFIFOP(fd,28), RFIFOP(fd,52), RFIFOW(fd,2)-52);
+ if (!wd) return 1;
+ idb_put(wis_db, wd->id, wd);
+ mapif_wis_message2(wd, fd2);
+ return 0;
+ }
+ //Not found.
+ return mapif_wis_fail(fd, RFIFOP(fd, 4));
+
+/* Scrapped since now we know where characters are online in. [Skotlex]
+ wd = mapif_create_whisper(fd, RFIFOP(fd, 4), RFIFOP(fd,28), RFIFOP(fd,52), RFIFOW(fd,2)-52);
+ if (!wd) return 0;
+ idb_put(wis_db, wd->id, wd);
+ mapif_wis_message(wd);
+ return 0;
+*/
+}
+
+// Wisp/page transmission result
+int mapif_parse_WisReply(int fd) {
+ int id, flag;
+ struct WisData *wd;
+ RFIFOHEAD(fd);
+ id = RFIFOL(fd,2);
+ flag = RFIFOB(fd,6);
+ wd = idb_get(wis_db, id);
+
+ if (wd == NULL)
+ return 0; // This wisp was probably suppress before, because it was timeout or because of target was found on another map-server
+
+ if ((--wd->count) <= 0 || flag != 1) {
+ mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ idb_remove(wis_db, id);
+ }
+
+ return 0;
+}
+
+// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
+int mapif_parse_WisToGM(int fd) {
+ unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+ RFIFOHEAD(fd);
+ memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf, 0) = 0x3803;
+ mapif_sendall(buf, RFIFOW(fd,2));
+
+ return 0;
+}
+
+static void* create_accreg(DBKey key, va_list args) {
+ struct accreg *reg;
+ reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1);
+ reg->account_id = key.i;
+ return reg;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
+int mapif_parse_Registry(int fd) {
+ int j, p, len;
+ struct accreg *reg;
+ RFIFOHEAD(fd);
+
+ switch (RFIFOB(fd,12)) {
+ case 3: //Character registry
+ return char_parse_Registry(RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,13), RFIFOW(fd,2)-13);
+ case 2: //Acc Reg
+ break;
+ case 1: //Acc Reg2, forward to login
+ return save_accreg2(RFIFOP(fd,4), RFIFOW(fd,2)-4);
+ default: //Error?
+ return 1;
+ }
+ reg = idb_ensure(accreg_db, RFIFOL(fd,4), create_accreg);
+
+ for(j=0,p=13;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++){
+ sscanf(RFIFOP(fd,p), "%31c%n",reg->reg[j].str,&len);
+ reg->reg[j].str[len]='\0';
+ p +=len+1; //+1 to skip the '\0' between strings.
+ sscanf(RFIFOP(fd,p), "%255c%n",reg->reg[j].value,&len);
+ reg->reg[j].value[len]='\0';
+ p +=len+1;
+ }
+ reg->reg_num=j;
+ mapif_account_reg(fd, RFIFOP(fd,0)); // ‘¼‚ÌMAPƒT[ƒo[‚É‘—M
+
+ return 0;
+}
+
+// Request the value of all registries.
+int mapif_parse_RegistryRequest(int fd)
+{
+ RFIFOHEAD(fd);
+ //Load Char Registry
+ if (RFIFOB(fd,12))
+ char_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6));
+ //Load Account Registry
+ if (RFIFOB(fd,11))
+ mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6));
+ //Ask Login Server for Account2 values.
+ if (RFIFOB(fd,10))
+ request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
+ return 1;
+}
+
+//--------------------------------------------------------
+
+// map server ‚©‚ç‚Ì’ÊMi‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æj
+// ƒGƒ‰[‚È‚ç0(false)Aˆ—‚Å‚«‚½‚È‚ç1A
+// ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_parse_frommap(int fd) {
+ int cmd, len;
+ RFIFOHEAD(fd);
+ cmd = RFIFOW(fd,0);
+ len = 0;
+
+ // interŽIŠÇŠ‚©‚𒲂ׂé
+ if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0])))
+ return 0;
+
+ if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
+ return 0;
+
+ // ƒpƒPƒbƒg’·‚𒲂ׂé
+ if ((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
+ return 2;
+
+ switch(cmd) {
+ case 0x3000: mapif_parse_GMmessage(fd); break;
+ case 0x3001: mapif_parse_WisRequest(fd); break;
+ case 0x3002: mapif_parse_WisReply(fd); break;
+ case 0x3003: mapif_parse_WisToGM(fd); break;
+ case 0x3004: mapif_parse_Registry(fd); break;
+ case 0x3005: mapif_parse_RegistryRequest(fd); break;
+ default:
+ if (inter_party_parse_frommap(fd))
+ break;
+ if (inter_guild_parse_frommap(fd))
+ break;
+ if (inter_storage_parse_frommap(fd))
+ break;
+ if (inter_pet_parse_frommap(fd))
+ break;
+ if (inter_homun_parse_frommap(fd))
+ break;
+ return 0;
+ }
+ RFIFOSKIP(fd, len);
+ return 1;
+}
+
+// RFIFO‚̃pƒPƒbƒg’·Šm”F
+// •K—vƒpƒPƒbƒg’·‚ª‚ ‚ê‚΃pƒPƒbƒg’·A‚Ü‚¾‘«‚è‚È‚¯‚ê‚Î0
+int inter_check_length(int fd, int length) {
+ if (length == -1) { // ‰Â•ÏƒpƒPƒbƒg’·
+ RFIFOHEAD(fd);
+ if (RFIFOREST(fd) < 4) // ƒpƒPƒbƒg’·‚ª–¢’…
+ return 0;
+ length = RFIFOW(fd,2);
+ }
+
+ if ((int)RFIFOREST(fd) < length) // ƒpƒPƒbƒg‚ª–¢’…
+ return 0;
+
+ return length;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char/inter.h b/src/char/inter.h
index 75489c387..1789848c5 100644
--- a/src/char/inter.h
+++ b/src/char/inter.h
@@ -1,28 +1,28 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init_txt(const char *file);
-void inter_final(void);
-int inter_save(void);
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-void mapif_send_maxid(int, int);
-int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason);
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern unsigned int party_share_level;
-extern char inter_log_filename[1024];
-extern char main_chat_nick[16];
-
-//For TXT->SQL conversion
-extern char accreg_txt[];
-int inter_accreg_fromstr(const char *str, struct accreg *reg);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INTER_H_
+#define _INTER_H_
+
+int inter_init_txt(const char *file);
+void inter_final(void);
+int inter_save(void);
+int inter_parse_frommap(int fd);
+int inter_mapif_init(int fd);
+void mapif_send_maxid(int, int);
+int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason);
+
+int inter_check_length(int fd,int length);
+
+int inter_log(char *fmt,...);
+
+#define inter_cfgName "conf/inter_athena.conf"
+
+extern unsigned int party_share_level;
+extern char inter_log_filename[1024];
+extern char main_chat_nick[16];
+
+//For TXT->SQL conversion
+extern char accreg_txt[];
+int inter_accreg_fromstr(const char *str, struct accreg *reg);
+#endif
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 136453e3b..a6bc9dbea 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -1,4435 +1,4435 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by Jioh L. Jung
-// TXT 1.105
-#include <sys/types.h>
-
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#include <time.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#include "char.h"
-#include "../common/utils.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-#include "itemdb.h"
-#include "inter.h"
-#include "db.h"
-#include "malloc.h"
-#include "int_guild.h"
-
-#ifndef TXT_SQL_CONVERT
-static struct dbt *char_db_;
-#endif
-char char_db[256] = "char";
-char scdata_db[256] = "sc_data";
-char cart_db[256] = "cart_inventory";
-char inventory_db[256] = "inventory";
-char charlog_db[256] = "charlog";
-char storage_db[256] = "storage";
-char interlog_db[256] = "interlog";
-char reg_db[256] = "global_reg_value";
-char skill_db[256] = "skill";
-char memo_db[256] = "memo";
-char guild_db[256] = "guild";
-char guild_alliance_db[256] = "guild_alliance";
-char guild_castle_db[256] = "guild_castle";
-char guild_expulsion_db[256] = "guild_expulsion";
-char guild_member_db[256] = "guild_member";
-char guild_position_db[256] = "guild_position";
-char guild_skill_db[256] = "guild_skill";
-char guild_storage_db[256] = "guild_storage";
-char party_db[256] = "party";
-char pet_db[256] = "pet";
-char friend_db[256] = "friends";
-#ifdef TXT_SQL_CONVERT
-int save_log = 0; //Have the logs be off by default when converting
-#else
-int save_log = 1;
-int db_use_sqldbs;
-int connection_ping_interval = 0;
-
-char login_db[256] = "login";
-char login_db_account_id[32] = "account_id";
-char login_db_level[32] = "level";
-
-int lowest_gm_level = 1;
-
-char *SQL_CONF_NAME = "conf/inter_athena.conf";
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- unsigned short map[MAX_MAP_PER_SERVER];
-} server[MAX_MAP_SERVERS];
-
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[NAME_LENGTH] = "Server";
-char login_ip_str[128];
-in_addr_t login_ip = 0;
-int login_port = 6900;
-char char_ip_str[128];
-in_addr_t char_ip = 0;
-char bind_ip_str[128];
-in_addr_t bind_ip = 0;
-int char_port = 6121;
-int char_maintenance = 0;
-int char_new;
-int char_new_display;
-int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
-int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
-char char_name_letters[1024] = ""; // list of letters/symbols used to authorise or not a name of a character. by [Yor]
-//The following are characters that are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
-#define TRIM_CHARS "\032\t\x0A\x0D "
-int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
-int char_del_level = 0; //From which level u can delete character [Lupus]
-
-int log_char = 1; // loggin char or not [devil]
-int log_inter = 1; // loggin inter or not [devil]
-
-// Advanced subnet check [LuzZza]
-struct _subnet {
- long subnet;
- long mask;
- long char_ip;
- long map_ip;
-} subnet[16];
-
-int subnet_count = 0;
-
-char unknown_char_name[NAME_LENGTH] = "Unknown";
-char db_path[1024]="db";
-
-//These are used to aid the map server in identifying valid clients. [Skotlex]
-static int max_account_id = DEFAULT_MAX_ACCOUNT_ID, max_char_id = DEFAULT_MAX_CHAR_ID;
-static int online_check = 1; //If one, it won't let players connect when their account is already registered online and will send the relevant map server a kick user request. [Skotlex]
-
-struct char_session_data{
- int account_id, login_id1, login_id2,sex;
- int found_char[9];
- char email[40]; // e-mail (default: a@a.com) by [Yor]
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag,sex;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-
-struct mmo_charstatus char_dat;
-int char_num,char_max;
-int max_connect_user = 0;
-int gm_allow_level = 99;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int start_zeny = 0;
-int start_weapon = 1201;
-int start_armor = 2301;
-int guild_exp_rate = 100;
-
-//Custom limits for the fame lists. [Skotlex]
-int fame_list_size_chemist = MAX_FAME_LIST;
-int fame_list_size_smith = MAX_FAME_LIST;
-int fame_list_size_taekwon = MAX_FAME_LIST;
-
-// Char-server-side stored fame lists [DracoRPG]
-struct fame_list smith_fame_list[MAX_FAME_LIST];
-struct fame_list chemist_fame_list[MAX_FAME_LIST];
-struct fame_list taekwon_fame_list[MAX_FAME_LIST];
-
-// check for exit signal
-// 0 is saving complete
-// other is char_id
-unsigned int save_flag = 0;
-
-// start point (you can reset point on conf file)
-struct point start_point = { 0, 53, 111};
-
-bool char_gm_read = false;
-struct gm_account *gm_account = NULL;
-int GM_num = 0;
-
-int console = 0;
-
-//Structure for holding in memory which characters are online on the map servers connected.
-struct online_char_data {
- int account_id;
- int char_id;
- short server;
- unsigned waiting_disconnect :1;
-};
-
-struct dbt *online_char_db; //Holds all online characters.
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data);
-
-static void * create_online_char_data(DBKey key, va_list args) {
- struct online_char_data* character;
- character = aCalloc(1, sizeof(struct online_char_data));
- character->account_id = key.i;
- character->char_id = -1;
- character->server = -1;
- return character;
-}
-
-//-------------------------------------------------
-// Set Character online/offline [Wizputer]
-//-------------------------------------------------
-
-void set_char_online(int map_id, int char_id, int account_id) {
- struct online_char_data* character;
- if ( char_id != 99 ) {
- sprintf(tmp_sql, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'",char_db,char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- if (max_account_id < account_id || max_char_id < char_id)
- { //Notify map-server of the new max IDs [Skotlex]
- if (account_id > max_account_id)
- max_account_id = account_id;
- if (char_id > max_char_id)
- max_char_id = char_id;
- mapif_send_maxid(max_account_id, max_char_id);
- }
- }
-
- character = idb_ensure(online_char_db, account_id, create_online_char_data);
- if (online_check && character->char_id != -1 && character->server > -1 && character->server != map_id)
- {
- //char == 99 <- Character logging in, so someone has logged in while one
- //char is still on map-server, so kick him out, but don't print "error"
- //as this is normal behaviour. [Skotlex]
- if (char_id != 99)
- ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
- character->account_id, character->char_id, character->server, map_id, account_id, char_id);
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- }
- character->char_id = (char_id==99)?-1:char_id;
- character->server = (char_id==99)?-1:map_id;
- character->waiting_disconnect = 0;
- if (char_id != 99)
- { //Set char online in guild cache. If char is in memory, use the guild id on it, otherwise seek it.
- struct mmo_charstatus *cp;
- cp = idb_get(char_db_,char_id);
- inter_guild_CharOnline(char_id, cp?cp->guild_id:-1);
- }
- if (login_fd > 0 && !session[login_fd]->eof)
- {
- WFIFOHEAD(login_fd,6);
- WFIFOW(login_fd,0) = 0x272b;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
- }
-}
-
-void set_char_offline(int char_id, int account_id) {
- struct mmo_charstatus *cp;
- struct online_char_data* character;
-
- if ( char_id == 99 )
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
- else {
- cp = idb_get(char_db_,char_id);
- inter_guild_CharOffline(char_id, cp?cp->guild_id:-1);
- if (cp)
- idb_remove(char_db_,char_id);
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if ((character = idb_get(online_char_db, account_id)) != NULL)
- { //We don't free yet to avoid aCalloc/aFree spamming during char change. [Skotlex]
- character->char_id = -1;
- character->server = -1;
- character->waiting_disconnect = 0;
- }
-
- if (login_fd > 0 && !session[login_fd]->eof)
- {
- WFIFOHEAD(login_fd,6);
- WFIFOW(login_fd,0) = 0x272c;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
- }
-}
-
-static int char_db_setoffline(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int server = va_arg(ap, int);
- if (server == -1) {
- character->char_id = -1;
- character->server = -1;
- character->waiting_disconnect = 0;
- } else if (character->server == server)
- character->server = -2; //In some map server that we aren't connected to.
- return 0;
-}
-
-static int char_db_kickoffline(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int server = va_arg(ap, int);
- if (server > -1 && character->server != server)
- return 0;
-
- //Kick out any connected characters, and set them offline as appropiate.
- if (character->server > -1)
- mapif_disconnectplayer(server_fd[character->server],
- character->account_id, character->char_id, 1);
- else if (!character->waiting_disconnect)
- set_char_offline(character->char_id, character->account_id);
- else return 0;
- return 1;
-}
-
-void set_all_offline(int id) {
- if (id < 0)
- ShowNotice("Sending all users offline.\n");
- else
- ShowNotice("Sending users of map-server %d offline.\n",id);
- online_char_db->foreach(online_char_db,char_db_kickoffline,id);
-
- if (id >= 0 || login_fd <= 0 || session[login_fd]->eof)
- return;
- //Tell login-server to also mark all our characters as offline.
- WFIFOHEAD(login_fd, 2);
- WFIFOW(login_fd,0) = 0x2737;
- WFIFOSET(login_fd,2);
-}
-
-void set_all_offline_sql(void) {
- //Set all players to 'OFFLINE'
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `connect_member` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-// Removed since nothing GM related goes on in the char server [CLOWNISIUS]
-int isGM(int account_id) {
- int i;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == account_id)
- return gm_account[i].level;
- return 0;
-}
-
-void read_gm_account(void) {
- if(!char_gm_read)
- return;
-
- if (gm_account != NULL)
- aFree(gm_account);
- GM_num = 0;
-
- sprintf(tmp_sql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level);
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * (size_t)mysql_num_rows(lsql_res), 1);
- while ((lsql_row = mysql_fetch_row(lsql_res))) {
- gm_account[GM_num].account_id = atoi(lsql_row[0]);
- gm_account[GM_num].level = atoi(lsql_row[1]);
- GM_num++;
- }
- }
-
- mysql_free_result(lsql_res);
- mapif_send_gmaccounts();
-}
-#endif //TXT_SQL_CONVERT
-int compare_item(struct item *a, struct item *b) {
-
- if(a->id == b->id &&
- a->nameid == b->nameid &&
- a->amount == b->amount &&
- a->equip == b->equip &&
- a->identify == b->identify &&
- a->refine == b->refine &&
- a->attribute == b->attribute)
- {
- int i;
- for (i=0; i<MAX_SLOTS && a->card[i]==b->card[i]; i++);
- return (i == MAX_SLOTS);
- }
- return 0;
-}
-
-#ifndef TXT_SQL_CONVERT
-static void* create_charstatus(DBKey key, va_list args) {
- struct mmo_charstatus *cp;
- cp = (struct mmo_charstatus *) aCalloc(1,sizeof(struct mmo_charstatus));
- cp->char_id = key.i;
- return cp;
-}
-#endif //TXT_SQL_CONVERT
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i=0,j;
- int count = 0;
- int diff = 0;
- char *tmp_ptr; //Building a single query should be more efficient than running
- //multiple queries for each thing about to be saved, right? [Skotlex]
- char save_status[128]; //For displaying save information. [Skotlex]
- struct mmo_charstatus *cp;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
-
- if (char_id!=p->char_id) return 0;
-
-#ifndef TXT_SQL_CONVERT
- cp = idb_ensure(char_db_, char_id, create_charstatus);
-#else
- cp = aCalloc(1, sizeof(struct mmo_charstatus));
-#endif
-
- memset(save_status, 0, sizeof(save_status));
- diff = 0;
- //map inventory data
- for(i=0;i<MAX_INVENTORY;i++){
- if (!compare_item(&p->inventory[i], &cp->inventory[i]))
- diff = 1;
- if(p->inventory[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->inventory[i].id;
- mapitem[count].nameid=p->inventory[i].nameid;
- mapitem[count].amount = p->inventory[i].amount;
- mapitem[count].equip = p->inventory[i].equip;
- mapitem[count].identify = p->inventory[i].identify;
- mapitem[count].refine = p->inventory[i].refine;
- mapitem[count].attribute = p->inventory[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->inventory[i].card[j];
- count++;
- }
- }
- //printf("- Save item data to MySQL!\n");
- if (diff)
- if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_INVENTORY))
- strcat(save_status, " inventory");
-
- count = 0;
- diff = 0;
-
- //map cart data
- for(i=0;i<MAX_CART;i++){
- if (!compare_item(&p->cart[i], &cp->cart[i]))
- diff = 1;
- if(p->cart[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->cart[i].id;
- mapitem[count].nameid=p->cart[i].nameid;
- mapitem[count].amount = p->cart[i].amount;
- mapitem[count].equip = p->cart[i].equip;
- mapitem[count].identify = p->cart[i].identify;
- mapitem[count].refine = p->cart[i].refine;
- mapitem[count].attribute = p->cart[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->cart[i].card[j];
- count++;
- }
- }
-
- if (diff)
- if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_CART))
- strcat(save_status, " cart");
-#ifdef TXT_SQL_CONVERT
-{ //Insert the barebones to then update the rest.
- char t_name[NAME_LENGTH*2];
- jstrescapecpy(t_name, p->name);
- sprintf(tmp_sql, "REPLACE INTO `%s` (`account_id`, `char_num`, `name`) VALUES ('%d', '%d', '%s')",
- char_db, p->account_id, p->char_num, t_name);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " creation");
-}
-#endif
-
- if (
- (p->base_exp != cp->base_exp) || (p->base_level != cp->base_level) ||
- (p->job_level != cp->job_level) || (p->job_exp != cp->job_exp) ||
- (p->zeny != cp->zeny) ||
- (p->last_point.x != cp->last_point.x) || (p->last_point.y != cp->last_point.y) ||
- (p->max_hp != cp->max_hp) || (p->hp != cp->hp) ||
- (p->max_sp != cp->max_sp) || (p->sp != cp->sp) ||
- (p->status_point != cp->status_point) || (p->skill_point != cp->skill_point) ||
- (p->str != cp->str) || (p->agi != cp->agi) || (p->vit != cp->vit) ||
- (p->int_ != cp->int_) || (p->dex != cp->dex) || (p->luk != cp->luk) ||
- (p->option != cp->option) ||
- (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) ||
- (p->pet_id != cp->pet_id) || (p->weapon != cp->weapon) || (p->hom_id != cp->hom_id) ||
- (p->shield != cp->shield) || (p->head_top != cp->head_top) ||
- (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom)
- )
- { //Save status
- sprintf(tmp_sql ,"UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
- "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
- "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
- "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d'," //[orn] add homun_id (homunculus id)
- "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
- "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d'"
- " WHERE `account_id`='%d' AND `char_id` = '%d'",
- char_db, p->base_level, p->job_level,
- p->base_exp, p->job_exp, p->zeny,
- p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point,
- p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
- p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, //[orn] add homun_id (homunculus id)
- p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
- mapindex_id2name(p->last_point.map), p->last_point.x, p->last_point.y,
- mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y,
- p->account_id, p->char_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " status");
- }
-
- //Values that will seldom change (to speed up saving)
- if (
- (p->hair != cp->hair) || (p->hair_color != cp->hair_color) || (p->clothes_color != cp->clothes_color) ||
- (p->class_ != cp->class_) ||
- (p->partner_id != cp->partner_id) || (p->father != cp->father) ||
- (p->mother != cp->mother) || (p->child != cp->child) ||
- (p->karma != cp->karma) || (p->manner != cp->manner) ||
- (p->fame != cp->fame)
- )
- {
- sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d',"
- "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',"
- "`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d',"
- "`karma`='%d',`manner`='%d', `fame`='%d'"
- " WHERE `account_id`='%d' AND `char_id` = '%d'",
- char_db, p->class_,
- p->hair, p->hair_color, p->clothes_color,
- p->partner_id, p->father, p->mother, p->child,
- p->karma, p->manner, p->fame,
- p->account_id, p->char_id
- );
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " status2");
- }
-
-
- diff = 0;
-
- for(i=0;i<MAX_MEMOPOINTS;i++){
- if(p->memo_point[i].map == cp->memo_point[i].map && p->memo_point[i].x == cp->memo_point[i].x && p->memo_point[i].y == cp->memo_point[i].y)
- continue;
- diff = 1;
- break;
- }
-
- if (diff)
- { //Save memo
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //insert here.
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ", memo_db);
- count = 0;
- for(i=0;i<MAX_MEMOPOINTS;i++){
- if(p->memo_point[i].map){
- tmp_ptr += sprintf(tmp_ptr,"('%d', '%s', '%d', '%d'),",
- char_id, mapindex_id2name(p->memo_point[i].map), p->memo_point[i].x, p->memo_point[i].y);
- count++;
- }
- }
- if (count)
- { //Dangerous? Only if none of the above sprintf worked. [Skotlex]
- tmp_ptr[-1] = '\0'; //Remove the trailing comma.
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " memo");
- } else //Memo Points cleared (how is this possible?).
- strcat(save_status, " memo");
- }
-
- diff = 0;
- for(i=0;i<MAX_SKILL;i++) {
- if ((p->skill[i].lv != 0) && (p->skill[i].id == 0))
- p->skill[i].id = i; // Fix skill tree
-
- if((p->skill[i].id != cp->skill[i].id) || (p->skill[i].lv != cp->skill[i].lv) ||
- (p->skill[i].flag != cp->skill[i].flag))
- {
- diff = 1;
- break;
- }
- }
-
- if (diff)
- { //Save skills
-
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr,"INSERT INTO `%s`(`char_id`,`id`,`lv`) VALUES ", skill_db);
- count = 0;
- //insert here.
- for(i=0;i<MAX_SKILL;i++){
- if(p->skill[i].id && p->skill[i].flag!=1)
- {
- tmp_ptr += sprintf(tmp_ptr,"('%d','%d','%d'),",
- char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- count++;
- }
- }
-
- if (count)
- {
- tmp_ptr[-1] = '\0'; //Remove trailing comma.
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " skills");
- } else //Skills removed (reset?)
- strcat(save_status, " skills");
- }
- diff = 0;
- for(i = 0; i < MAX_FRIENDS; i++){
- if(p->friends[i].char_id != cp->friends[i].char_id ||
- p->friends[i].account_id != cp->friends[i].account_id){
- diff = 1;
- break;
- }
- }
-
- if(diff == 1)
- { //Save friends
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db);
- count = 0;
- for(i = 0; i < MAX_FRIENDS; i++){
- if(p->friends[i].char_id > 0)
- {
- tmp_ptr += sprintf(tmp_ptr, "('%d','%d','%d'),", char_id, p->friends[i].account_id, p->friends[i].char_id);
- count++;
- }
- }
- if (count)
- {
- tmp_ptr[-1] = '\0'; //Remove the last comma. [Skotlex]
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " friends");
- } else //Friend list cleared.
- strcat(save_status, " friends");
-
- }
-
- if (save_status[0]!='\0' && save_log)
- ShowInfo("Saved char %d - %s:%s.\n", char_id, p->name, save_status);
-#ifndef TXT_SQL_CONVERT
- memcpy(cp, p, sizeof(struct mmo_charstatus));
-#else
- aFree(cp);
-#endif
- return 0;
-}
-
-// [Ilpalazzo-sama]
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
-{
- int i,j, flag, id;
- char *tablename;
- char selectoption[16];
- char * str_p = tmp_sql;
-
- switch (tableswitch) {
- case TABLE_INVENTORY:
- tablename = inventory_db; // no need for sprintf here as *_db are char*.
- sprintf(selectoption,"char_id");
- break;
- case TABLE_CART:
- tablename = cart_db;
- sprintf(selectoption,"char_id");
- break;
- case TABLE_STORAGE:
- tablename = storage_db;
- sprintf(selectoption,"account_id");
- break;
- case TABLE_GUILD_STORAGE:
- tablename = guild_storage_db;
- sprintf(selectoption,"guild_id");
- break;
- default:
- ShowError("Invalid table name!\n");
- return 1;
- }
-
- //=======================================mysql database data > memory===============================================
-
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, " FROM `%s` WHERE `%s`='%d'", tablename, selectoption, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 1;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))) {
- flag = 0;
- id = atoi(sql_row[0]);
- for(i = 0; i < count; i++) {
- if(mapitem[i].flag == 1)
- continue;
- if(mapitem[i].nameid == atoi(sql_row[1])
- && mapitem[i].card[0] == atoi(sql_row[7])
- && mapitem[i].card[2] == atoi(sql_row[9])
- && mapitem[i].card[3] == atoi(sql_row[10])
- ) { //They are the same item.
- for (j = 0; j<MAX_SLOTS && mapitem[i].card[j] == atoi(sql_row[7+j]); j++);
- if (j == MAX_SLOTS &&
- mapitem[i].amount == atoi(sql_row[2]) &&
- mapitem[i].equip == atoi(sql_row[3]) &&
- mapitem[i].identify == atoi(sql_row[4]) &&
- mapitem[i].refine == atoi(sql_row[5]) &&
- mapitem[i].attribute == atoi(sql_row[6]))
- { //Do nothing.
- } else
-//==============================================Memory data > SQL ===============================
-#ifndef TXT_SQL_CONVERT
- if(!itemdb_isequip(mapitem[i].nameid))
- { //Quick update of stackable items. Update Qty and Equip should be enough, but in case we are also updating identify
- sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
- tablename, mapitem[i].equip, mapitem[i].identify,mapitem[i].amount, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- } else
-#endif //TXT_SQL_CONVERT
- { //Equipment or Misc item, just update all fields.
- str_p = tmp_sql;
- str_p += sprintf(str_p,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',`attribute`='%d'",
- tablename, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine, mapitem[i].attribute);
-
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`=%d", j, mapitem[i].card[j]);
-
- str_p += sprintf(str_p,", `amount`='%d' WHERE `id`='%d' LIMIT 1",
- mapitem[i].amount, id);
-
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- flag = mapitem[i].flag = 1; //Item dealt with,
- break; //skip to next item in the db.
- }
- }
- if(!flag) { //Item not updated, remove it.
- sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- mysql_free_result(sql_res);
- }
-
- for(i = 0; i < count; i++) {
- if(!mapitem[i].flag) {
- str_p = tmp_sql;
- str_p += sprintf(str_p,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`",
- tablename, selectoption);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,", `card%d`", j);
-
- str_p += sprintf(str_p,") VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d'",
- char_id, mapitem[i].nameid, mapitem[i].amount, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine,
- mapitem[i].attribute);
-
- for(j=0; j<MAX_SLOTS; j++)
- str_p +=sprintf(str_p,", '%d'",mapitem[i].card[j]);
-
- strcat(tmp_sql, ")");
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-//=====================================================================================================
-int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
- int i,j, n;
- double exp;
- char t_msg[128];
- char *str_p = tmp_sql;
- struct mmo_charstatus *cp;
-
- memset(p, 0, sizeof(struct mmo_charstatus));
- t_msg[0]= '\0';
-
- p->char_id = char_id;
- if (save_log)
- ShowInfo("Char load request (%d)\n", char_id);
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //splite 2 parts. cause veeeery long SQL syntax
-
- sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
- "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row)
- { //Just how does this happens? [Skotlex]
- ShowError("Requested non-existant character id: %d!\n", char_id);
- return 0;
- }
-
- p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strcpy(p->name, sql_row[3]);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- exp = atof(sql_row[7]);
- p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- exp = atof(sql_row[8]);
- p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
- p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
- //free mysql result.
- mysql_free_result(sql_res);
- strcat (t_msg, " status");
- } else
- ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
-
- sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`,"
- "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,"
- "`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id`, `father`, `mother`, `child`, `fame`, `homun_id`" //[orn] homun_id
- "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
- if (sql_row) {
-
- p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
- p->party_id = atoi(sql_row[3]); p->guild_id = atoi(sql_row[4]); p->pet_id = atoi(sql_row[5]);
-
- p->hair = atoi(sql_row[6]); p->hair_color = atoi(sql_row[7]); p->clothes_color = atoi(sql_row[8]);
- p->weapon = atoi(sql_row[9]); p->shield = atoi(sql_row[10]);
- p->head_top = atoi(sql_row[11]); p->head_mid = atoi(sql_row[12]); p->head_bottom = atoi(sql_row[13]);
- p->last_point.map = mapindex_name2id(sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
- p->save_point.map = mapindex_name2id(sql_row[17]); p->save_point.x = atoi(sql_row[18]); p->save_point.y = atoi(sql_row[19]);
- p->partner_id = atoi(sql_row[20]); p->father = atoi(sql_row[21]); p->mother = atoi(sql_row[22]); p->child = atoi(sql_row[23]);
- p->fame = atoi(sql_row[24]);
- p->hom_id = atoi(sql_row[25]); //[orn] homunculus id
-
- strcat (t_msg, " status2");
- } else
- ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
- //free mysql result.
- if (sql_res)
- mysql_free_result(sql_res);
-
- //read memo data
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d' ORDER by `memo_id`",memo_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->memo_point[i].map = mapindex_name2id(sql_row[0]);
- p->memo_point[i].x=atoi(sql_row[1]);
- p->memo_point[i].y=atoi(sql_row[2]);
- //i ++;
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " memo");
- }
-
- //read inventory
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->inventory[i].id = atoi(sql_row[0]);
- p->inventory[i].nameid = atoi(sql_row[1]);
- p->inventory[i].amount = atoi(sql_row[2]);
- p->inventory[i].equip = atoi(sql_row[3]);
- p->inventory[i].identify = atoi(sql_row[4]);
- p->inventory[i].refine = atoi(sql_row[5]);
- p->inventory[i].attribute = atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->inventory[i].card[j] = atoi(sql_row[7+j]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " inventory");
- }
-
- //read cart.
- //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- str_p = tmp_sql;
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", cart_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->cart[i].id = atoi(sql_row[0]);
- p->cart[i].nameid = atoi(sql_row[1]);
- p->cart[i].amount = atoi(sql_row[2]);
- p->cart[i].equip = atoi(sql_row[3]);
- p->cart[i].identify = atoi(sql_row[4]);
- p->cart[i].refine = atoi(sql_row[5]);
- p->cart[i].attribute = atoi(sql_row[6]);
- for(j=0; j<MAX_SLOTS; j++)
- p->cart[i].card[j] = atoi(sql_row[7+j]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " cart");
- }
-
- //read skill
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- n = atoi(sql_row[0]);
- p->skill[n].id = n; //memory!? shit!.
- p->skill[n].lv = atoi(sql_row[1]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " skills");
- }
-/* Global-reg loading is now handled by the inter-server.
- //global_reg
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- i = 0;
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- strcpy (p->global_reg[i].str, sql_row[0]);
- strcpy (p->global_reg[i].value, sql_row[1]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " reg_values");
- }
- p->global_reg_num=i;
-*/
- //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
- //Friend list
- sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM `%s` f LEFT JOIN `%s` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", friend_db, char_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res)
- {
- for(i = 0; (sql_row = mysql_fetch_row(sql_res)) && i<MAX_FRIENDS; i++)
- {
- if(sql_row) { //need to check if we have sql_row before we check if we have sql_row[2] because we don't want a segfault
- if(sql_row[2]) {
- p->friends[i].account_id = atoi(sql_row[0]);
- p->friends[i].char_id = atoi(sql_row[1]);
- strncpy(p->friends[i].name, sql_row[2], NAME_LENGTH-1); //The -1 is to avoid losing the ending \0 [Skotlex]
- }
- }
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " friends");
- }
-
- if (save_log)
- ShowInfo("Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
-
- cp = idb_ensure(char_db_, char_id, create_charstatus);
- memcpy(cp, p, sizeof(struct mmo_charstatus));
- return 1;
-}
-
-// For quick selection of data when displaying the char menu. [Skotlex]
-//
-int mmo_char_fromsql_short(int char_id, struct mmo_charstatus *p){
- char t_msg[128];
- double exp;
- memset(p, 0, sizeof(struct mmo_charstatus));
- t_msg[0]= '\0';
-
- p->char_id = char_id;
-// ShowInfo("Quick Char load request (%d)\n", char_id);
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //splite 2 parts. cause veeeery long SQL syntax
-
- sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
- "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row)
- { //Just how does this happens? [Skotlex]
- ShowError("Requested non-existant character id: %d!\n", char_id);
- mysql_free_result(sql_res);
- return 0;
- }
- p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strcpy(p->name, sql_row[3]);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- exp = atof(sql_row[7]);
- p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- exp = atof(sql_row[8]);
- p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
- p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
- //free mysql result.
- mysql_free_result(sql_res);
- strcat (t_msg, " status");
- } else
- ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
-
- sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`hair`,`hair_color`,"
- "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`"
- "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
- if (sql_row) {
-
- p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
- p->hair = atoi(sql_row[3]); p->hair_color = atoi(sql_row[4]); p->clothes_color = atoi(sql_row[5]);
- p->weapon = atoi(sql_row[6]); p->shield = atoi(sql_row[7]);
- p->head_top = atoi(sql_row[8]); p->head_mid = atoi(sql_row[9]); p->head_bottom = atoi(sql_row[10]);
-
- strcat (t_msg, " status2");
- } else
- ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
- //free mysql result.
- if (sql_res)
- mysql_free_result(sql_res);
-// if (save_log) //Too much spam :/
-// ShowInfo("Quick Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
-
- return 1;
-}
-//==========================================================================================================
-int mmo_char_sql_init(void) {
- ShowInfo("Begin Initializing.......\n");
- char_db_= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA, sizeof(int));
- // memory initialize
- memset(&char_dat, 0, sizeof(struct mmo_charstatus));
- if(char_per_account == 0){
- ShowStatus("Chars per Account: 'Unlimited'.......\n");
- }else{
- ShowStatus("Chars per Account: '%d'.......\n", char_per_account);
- }
-
- //the 'set offline' part is now in check_login_conn ...
- //if the server connects to loginserver
- //it will dc all off players
- //and send the loginserver the new state....
-
- // Force all users offline in sql when starting char-server
- // (useful when servers crashs and don't clean the database)
- set_all_offline_sql();
-
- ShowInfo("Finished initilizing.......\n");
-
- return 0;
-}
-
-//==========================================================================================================
-
-int make_new_char_sql(int fd, unsigned char *dat) {
- struct char_session_data *sd;
- char name[NAME_LENGTH];
- char t_name[NAME_LENGTH*2];
- unsigned int i; // Used in for loop and comparing with strlen, safe to be unsigned. [Lance]
- int char_id, temp;
-
- strncpy(name, dat, NAME_LENGTH);
- name[NAME_LENGTH-1] = '\0'; //Always terminate string.
- trim(name,TRIM_CHARS); //Trim character name. [Skotlex]
- jstrescapecpy(t_name, name);
-
- // disabled until fixed >.>
- // Note: escape characters should be added to jstrescape()!
- //mysql_real_escape_string(&mysql_handle, t_name, t_name_temp, sizeof(t_name_temp));
-
- if (!session_isValid(fd) || !(sd = (struct char_session_data*)session[fd]->session_data))
- return -2;
-
- ShowInfo("New character request (%d)\n", sd->account_id);
-
- //check name != main chat nick [LuzZza]
- if(strcmpi(name, main_chat_nick) == 0) {
- ShowInfo("Create char failed (%d): this nick (%s) reserved for mainchat messages.\n", sd->account_id, name);
- return -2;
- }
-
- //check for charcount (maxchars) :)
- if(char_per_account != 0){
- sprintf(tmp_sql, "SELECT `account_id` FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- //ok
- temp = (int)mysql_num_rows(sql_res);
- if(temp >= char_per_account){
- //hehe .. limit exceeded :P
- ShowInfo("Create char failed (%d): charlimit exceeded.\n", sd->account_id);
- mysql_free_result(sql_res);
- return -2;
- }
- mysql_free_result(sql_res);
- }
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL)
- return -2;
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL)
- return -2;
- } // else, all letters/symbols are authorised (except control char removed before)
-
- //check stat error
- if ((dat[24]+dat[25]+dat[26]+dat[27]+dat[28]+dat[29]!=6*5 ) || // stats
- (dat[30] >= 9) || // slots (dat[30] can not be negativ)
- (dat[33] <= 0) || (dat[33] >= 24) || // hair style
- (dat[31] >= 9)) { // hair color (dat[31] can not be negativ)
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
- return -2;
- } // for now we have checked: stat points used <31, char slot is less then 9, hair style/color values are acceptable
-
- // check individual stat value
- for(i = 24; i <= 29; i++) {
- if (dat[i] < 1 || dat[i] > 9) {
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
- return -2;
- }
- } // now we know that every stat has proper value but we have to check if str/int agi/luk vit/dex pairs are correct
-
- if( ((dat[24]+dat[27]) > 10) || ((dat[25]+dat[29]) > 10) || ((dat[26]+dat[28]) > 10) ) {
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
- return -2;
- } // now when we have passed all stat checks
-
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- //printf("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d" RETCODE,
- // fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
-
- //Check Name (already in use?)
- sprintf(tmp_sql, "SELECT 1 FROM `%s` WHERE `name` = '%s'",char_db, t_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return -2;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- temp = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (temp > 0) {
- ShowInfo("Create char failed: charname already in use\n");
- return -1;
- }
- }
-
- // check char slot.
- sprintf(tmp_sql, "SELECT `account_id`, `char_num` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res){
- temp = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (temp > 0) {
- ShowWarning("Create char failed (%d, slot: %d), slot already in use\n", sd->account_id, dat[30]);
- return -2;
- }
- }
-
- //New Querys [Sirius]
- //Insert the char to the 'chardb' ^^
- sprintf(tmp_sql, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
- "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
- "'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
- char_db, sd->account_id , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29],
- (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31],
- mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return -2; //No, stop the procedure!
- }
- //Now we need the charid from sql!
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) > 0)
- char_id = (int)mysql_insert_id(&mysql_handle);
- else {
- //delete the char ..(no trash in DB!) but how is this possible?
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return -2; //XD end of the (World? :P) .. charcreate (denied)
- }
- //Give the char the default items
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- if (start_weapon > 0) { //add Start Weapon (Knife?)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_weapon,1,0x02,1);
- if (mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- if (start_armor > 0) { //Add default armor (cotton shirt?)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_armor,1,0x10,1);
- if (mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- ShowInfo("Created char: account: %d, char: %d, slot: %d, name: %s\n", sd->account_id, char_id, dat[30], name);
- return char_id;
-}
-
-/*----------------------------------------------------------------------------------------------------------*/
-/* Delete char - davidsiaw */
-/*----------------------------------------------------------------------------------------------------------*/
-/* Returns 0 if successful
- * Returns < 0 for error
- */
-int delete_char_sql(int char_id, int partner_id)
-{
- char char_name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Name needs be escaped.
- int account_id=0, party_id=0, guild_id=0, char_base_level=0;
-
- sprintf(tmp_sql, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level` FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
-
- if (sql_res == NULL || sql_row == NULL)
- {
- ShowError("delete_char_sql: Unable to fetch character data, deletion aborted.\n");
- if (sql_res)
- mysql_free_result(sql_res);
- return -1;
- }
- strncpy(char_name, sql_row[0], NAME_LENGTH);
- char_name[NAME_LENGTH-1] = '\0';
- jstrescapecpy(t_name, char_name); //Escape string for sql use... [Skotlex]
- account_id = atoi(sql_row[1]);
- party_id = atoi(sql_row[2]);
- guild_id = atoi(sql_row[3]);
- char_base_level = atoi(sql_row[4]);
- mysql_free_result(sql_res); //Let's free this as soon as possible to avoid problems later on.
-
- //check for config char del condition [Lupus]
- if( ( char_del_level > 0 && char_base_level >= char_del_level )
- || ( char_del_level < 0 && char_base_level <= -char_del_level )
- ) {
- ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n",char_name,char_base_level);
- return -1;
- }
-
- /* Divorce [Wizputer] */
- if (partner_id) {
- sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,partner_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,partner_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- //Make the character leave the party [Skotlex]
- if (party_id)
- inter_party_leave(party_id, account_id, char_id);
-
- /* delete char's pet */
- //Delete the hatched pet if you have one...
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d' AND `incuvate` = '0'",pet_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- // Komurka's suggested way to clear pets, modified by [Skotlex] (because I always personalize what I do :X)
- //Removing pets that are in the char's inventory....
- { //NOTE: The syntax for multi-table deletes is a bit changed between 4.0 and 4.1 regarding aliases, so we have to consider the version... [Skotlex]
- //Since we only care about the major and minor version, a double conversion is good enough. (4.1.20 -> 4.10000)
- double mysql_version = atof(mysql_get_server_info(&mysql_handle));
-
- sprintf(tmp_sql,
- "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
- (mysql_version<4.1?pet_db:"p"), char_db, inventory_db, pet_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //Removing pets that are in the char's cart....
- sprintf(tmp_sql,
- "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
- (mysql_version<4.1?pet_db:"p"), char_db, cart_db, pet_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- /* delete char's friends list */
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'",friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete char from other's friend list */
- //NOTE: Won't this cause problems for people who are already online? [Skotlex]
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `friend_id` = '%d'",friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete inventory */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete cart inventory */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete memo areas */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete character registry */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* delete skills */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
-#ifdef ENABLE_SC_SAVING
- /* status changes */
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
- scdata_db, account_id, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-#endif
-
- if (log_char) {
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`char_msg`,`name`) VALUES (NOW(), '%d', '%d', 'Deleted char (CID %d)', '%s')",
- charlog_db, account_id, 0, char_id, t_name);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- /* delete character */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- /* No need as we used inter_guild_leave [Skotlex]
- // Also delete info from guildtables.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- */
-
- sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, t_name);
-
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else {
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res == NULL) {
- if (mysql_errno(&mysql_handle) != 0)
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return -1;
- } else {
- int rows = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (rows > 0) {
- mapif_parse_BreakGuild(0,guild_id);
- }
- else if (guild_id) //Leave your guild.
- inter_guild_leave(guild_id, account_id, char_id);
- }
- }
- return 0;
-}
-
-//==========================================================================================================
-
-int count_users(void) {
- int i, users;
-
- if (login_fd > 0 && session[login_fd]){
- users = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] > 0) {
- users += server[i].users;
- }
- }
- return users;
- }
- return 0;
-}
-
-int mmo_char_send006b(int fd, struct char_session_data *sd) {
- int i, j, found_num = 0;
- struct mmo_charstatus *p = NULL;
- const int offset = 24;
- WFIFOHEAD(fd, offset +9*106);
-
- set_char_online(-1, 99,sd->account_id);
-
- //search char.
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d'",char_db, sd->account_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- found_num = (int)mysql_num_rows(sql_res);
-// ShowInfo("number of chars: %d\n", found_num);
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- sd->found_char[i] = atoi(sql_row[0]);
- i++;
- }
- mysql_free_result(sql_res);
- }
-
- for(i = found_num; i < 9; i++)
- sd->found_char[i] = -1;
-
- memset(WFIFOP(fd, 0), 0, offset + found_num * 106);
- WFIFOW(fd, 0) = 0x6b;
- WFIFOW(fd, 2) = offset + found_num * 106;
-
- if (save_log)
- ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id);
-
- for(i = 0; i < found_num; i++) {
- mmo_char_fromsql_short(sd->found_char[i], &char_dat);
-
- p = &char_dat;
-
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
- WFIFOL(fd,j+16) = p->job_level;
-
- WFIFOL(fd,j+20) = 0;
- WFIFOL(fd,j+24) = 0;
- WFIFOL(fd,j+28) = p->option;
-
- WFIFOL(fd,j+32) = p->karma;
- WFIFOL(fd,j+36) = p->manner;
-
- WFIFOW(fd,j+40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point;
- WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
- WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
- WFIFOW(fd,j+52) = p->class_;
- WFIFOW(fd,j+54) = p->hair;
- WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point;
- WFIFOW(fd,j+62) = p->head_bottom;
- WFIFOW(fd,j+64) = p->shield;
- WFIFOW(fd,j+66) = p->head_top;
- WFIFOW(fd,j+68) = p->head_mid;
- WFIFOW(fd,j+70) = p->hair_color;
- WFIFOW(fd,j+72) = p->clothes_color;
-
- memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
-
- WFIFOB(fd,j+98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
- WFIFOB(fd,j+99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
- WFIFOB(fd,j+100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
- WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
- WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
- WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
- WFIFOB(fd,j+104) = p->char_num;
- }
-
- WFIFOSET(fd,WFIFOW(fd,2));
-// printf("mmo_char_send006b end..\n");
- return 0;
-}
-
-int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
- RFIFOHEAD(fd);
- // only login-server can have an access to here.
- // so, if it isn't the login-server, we disconnect the session.
- //session eof check!
- if(fd != login_fd)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd) {
- ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
- login_fd = -1;
- }
- do_close(fd);
- return 0;
- }
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- // hehe. no need to set user limit on SQL version. :P
- // but char limitation is good way to maintain server. :D
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
-// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
-
- switch(RFIFOW(fd, 0)){
- case 0x2711:
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd, 2)) {
- //printf("connect login server error : %d\n", RFIFOB(fd, 2));
- ShowError("Can not connect to login-server.\n");
- ShowError("The server communication passwords (default s1/p1) are probably invalid.\n");
- ShowError("Also, please make sure your login db has the correct coounication username/passwords and the gender of the account is S.\n");
- ShowError("The communication passwords are set in map_athena.conf and char_athena.conf\n");
- return 0;
- //exit(1); //fixed for server shutdown.
- }else {
- ShowStatus("Connected to login-server (connection #%d).\n", fd);
-
- //Send online accounts to login server.
- send_accounts_tologin(-1, gettick(), 0, 0);
-
- // if no map-server already connected, display a message...
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] > 0 && server[i].map[0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- ShowStatus("Awaiting maps from map-server.\n");
- }
- RFIFOSKIP(fd, 3);
- break;
-
- case 0x2713:
- if(RFIFOREST(fd)<51)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- WFIFOHEAD(i,3);
- if (RFIFOB(fd,6) != 0) {
- WFIFOW(i,0) = 0x6c;
- WFIFOB(i,2) = 0x42;
- WFIFOSET(i,3);
- } else if (max_connect_user == 0 || count_users() < max_connect_user) {
-// if (max_connect_user == 0)
-// printf("max_connect_user (unlimited) -> accepted.\n");
-// else
-// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- memcpy(sd->email, RFIFOP(fd, 7), 40);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else if(isGM(sd->account_id) >= gm_allow_level) {
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- memcpy(sd->email, RFIFOP(fd, 7), 40);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else {
- // refuse connection: too much online players
-// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
- WFIFOW(i,0) = 0x6c;
- WFIFOW(i,2) = 0;
- WFIFOSET(i,3);
- }
- }
- }
- RFIFOSKIP(fd,51);
- break;
-
- case 0x2717:
- if (RFIFOREST(fd) < 50)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- memcpy(sd->email, RFIFOP(fd, 6), 40);
- sd->connect_until_time = (time_t)RFIFOL(fd,46);
- break;
- }
- }
- }
- RFIFOSKIP(fd,50);
- break;
-
- // login-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving authentification from Freya-type login server (to avoid char->login->char)
- case 0x2719:
- if (RFIFOREST(fd) < 18)
- return 0;
- // to conserv a maximum of authentification, search if account is already authentified and replace it
- // that will reduce multiple connection too
- for(i = 0; i < AUTH_FIFO_SIZE; i++)
- if (auth_fifo[i].account_id == RFIFOL(fd,2))
- break;
- // if not found, use next value
- if (i == AUTH_FIFO_SIZE) {
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- i = auth_fifo_pos;
- auth_fifo_pos++;
- }
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[i].account_id = RFIFOL(fd,2);
- auth_fifo[i].char_id = 0;
- auth_fifo[i].login_id1 = RFIFOL(fd,6);
- auth_fifo[i].login_id2 = RFIFOL(fd,10);
- auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
- auth_fifo[i].char_pos = 0;
- auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[i].ip = RFIFOL(fd,14);
- //auth_fifo[i].map_auth = 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x2721: // gm reply. I don't want to support this function.
- if (RFIFOREST(fd) < 10)
- return 0;
- RFIFOSKIP(fd, 10);
-/* Note that this is the code from char-txt! Even uncommenting it will not work.
- printf("0x2721:GM reply\n");
- {
- int oldacc, newacc;
- unsigned char buf[64];
- if (RFIFOREST(fd) < 10)
- return 0;
- oldacc = RFIFOL(fd, 2);
- newacc = RFIFOL(fd, 6);
- RFIFOSKIP(fd, 10);
- if (newacc > 0) {
- for(i=0;i<char_num;i++){
- if(char_dat[i].account_id==oldacc)
- char_dat[i].account_id=newacc;
- }
- }
- WBUFW(buf,0)=0x2b0b;
- WBUFL(buf,2)=oldacc;
- WBUFL(buf,6)=newacc;
- mapif_sendall(buf,10);
-// printf("char -> map\n");
- }
-*/
- break;
- case 0x2723: // changesex reply (modified by [Yor])
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int acc, sex;
- unsigned char buf[16];
- MYSQL_RES* sql_res2;
- acc = RFIFOL(fd,2);
- sex = RFIFOB(fd,6);
- RFIFOSKIP(fd, 7);
- if (acc > 0) {
- sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point`,`guild_id` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res2 = mysql_store_result(&mysql_handle);
-
- while(sql_res2 && (sql_row = mysql_fetch_row(sql_res2))) {
- int char_id, guild_id, jobclass, skill_point, class_;
- char_id = atoi(sql_row[0]);
- jobclass = atoi(sql_row[1]);
- skill_point = atoi(sql_row[2]);
- guild_id = atoi(sql_row[3]);
- class_ = jobclass;
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER ||
- jobclass == JOB_CLOWN || jobclass == JOB_GYPSY ||
- jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
- // job modification
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER) {
- class_ = (sex) ? JOB_BARD : JOB_DANCER;
- } else if (jobclass == JOB_CLOWN || jobclass == JOB_GYPSY) {
- class_ = (sex) ? JOB_CLOWN : JOB_GYPSY;
- } else if (jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
- class_ = (sex) ? JOB_BABY_BARD : JOB_BABY_DANCER;
- }
- // remove specifical skills of classes 19,20 4020,4021 and 4042,4043
- sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while(( sql_row = mysql_fetch_row(sql_res))) {
- skill_point += atoi(sql_row[0]);
- }
- mysql_free_result(sql_res);
- }
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- sprintf(tmp_sql, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'",inventory_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield`='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class_, skill_point, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- if (guild_id) //If there is a guild, update the guild_member data [Skotlex]
- inter_guild_sex_changed(guild_id, acc, char_id, sex);
- }
- if (sql_res2)
- mysql_free_result(sql_res2);
- }
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == acc) {
- session[i]->eof = 1;
- break;
- }
- }
- }
-
- WBUFW(buf,0) = 0x2b0d;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
-
- mapif_sendall(buf, 7);
- }
- break;
-
- // account_reg2•ÏX’Ê’m
- case 0x2729:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- { //Receive account_reg2 registry, forward to map servers.
- unsigned char buf[ACCOUNT_REG2_NUM*(256+32+2)+16];
- memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
-// WBUFW(buf,0) = 0x2b11;
- WBUFW(buf,0) = 0x3804; //Map server can now receive all kinds of reg values with the same packet. [Skotlex]
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
- }
- break;
-
- // State change of account/ban notification (from login-server) by [Yor]
- case 0x2731:
- if (RFIFOREST(fd) < 11)
- return 0;
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2b14;
- WBUFL(buf,2) = RFIFOL(fd,2);
- WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
- WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
- mapif_sendall(buf, 11);
- }
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- session[i]->eof = 1;
- break;
- }
- }
- }
- RFIFOSKIP(fd,11);
- break;
-
- case 0x2732:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if(!char_gm_read) {
- unsigned char buf[32000];
- if (gm_account != NULL)
- aFree(gm_account);
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
- GM_num = 0;
- for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
- gm_account[GM_num].account_id = RFIFOL(fd,i);
- gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
- //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
- ShowStatus("From login-server: receiving information of %d GM accounts.\n", GM_num);
- // send new gm acccounts level to map-servers
- memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b15;
- mapif_sendall(buf, RFIFOW(fd,2));
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // Receive GM accounts [Freya login server packet by Yor]
- case 0x2733:
- // add test here to remember that the login-server is Freya-type
- // sprintf (login_server_type, "Freya");
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int new_level = 0;
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == RFIFOL(fd,2)) {
- if (gm_account[i].level != (int)RFIFOB(fd,6)) {
- gm_account[i].level = (int)RFIFOB(fd,6);
- new_level = 1;
- }
- break;
- }
- // if not found, add it
- if (i == GM_num) {
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
- if (GM_num == 0) {
- gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
- } else {
- gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
- }
- gm_account[GM_num].account_id = RFIFOL(fd,2);
- gm_account[GM_num].level = (int)RFIFOB(fd,6);
- new_level = 1;
- GM_num++;
- if (GM_num >= 4000)
- ShowWarning("4000 GM accounts found. Next GM accounts are not readed.\n");
- }
- }
- if (new_level == 1) {
- ShowStatus("From login-server: receiving GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- mapif_send_gmaccounts();
-
- //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
- // send gm acccounts level to map-servers
- }
- }
- RFIFOSKIP(fd,7);
- break;
-
- //Login server request to kick a character out. [Skotlex]
- case 0x2734:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- struct online_char_data* character;
- int aid = RFIFOL(fd,2);
- if ((character = idb_get(online_char_db, aid)) != NULL)
- { //Kick out this player.
- if (character->server > -1)
- { //Kick it from the map server it is on.
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- if (!character->waiting_disconnect)
- add_timer(gettick()+15000, chardb_waiting_disconnect, character->account_id, 0);
- character->waiting_disconnect = 1;
- } else { //Manual kick from char server.
- struct char_session_data *tsd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == aid)
- {
- WFIFOHEAD(i,3);
- WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
- WFIFOSET(i,3);
- break;
- }
- }
- if (i == fd_max) //Shouldn't happen, but just in case.
- set_char_offline(99, aid);
- }
- }
- RFIFOSKIP(fd,6);
- }
- break;
-
- case 0x2735:
- {
- unsigned char buf[2];
- in_addr_t new_ip = 0;
- RFIFOSKIP(fd,2);
-
- WBUFW(buf,0) = 0x2b1e;
- mapif_sendall(buf, 2);
-
- new_ip = resolve_hostbyname(login_ip_str, NULL, NULL);
- if (new_ip && new_ip != login_ip) //Update login ip, too.
- login_ip = new_ip;
-
- new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
- if (new_ip && new_ip != char_ip)
- { //Update ip.
- char_ip = new_ip;
- ShowInfo("Updating IP for [%s].\n",char_ip_str);
- WFIFOHEAD(fd,6);
- WFIFOW(fd,0) = 0x2736;
- WFIFOL(fd,2) = char_ip;
- WFIFOSET(fd,6);
- }
- break;
- }
- default:
- ShowError("Unknown packet 0x%04x from login server, disconnecting.\n", RFIFOW(fd, 0));
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-int request_accreg2(int account_id, int char_id) {
- if (login_fd > 0) {
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd, 0) = 0x272e;
- WFIFOL(login_fd, 2) = account_id;
- WFIFOL(login_fd, 6) = char_id;
- WFIFOSET(login_fd, 10);
- return 1;
- }
- return 0;
-}
-//Send packet forward to login-server for account saving
-int save_accreg2(unsigned char* buf, int len) {
- if (login_fd > 0) {
- WFIFOHEAD(login_fd, len+4);
- memcpy(WFIFOP(login_fd,4), buf, len);
- WFIFOW(login_fd,0) = 0x2728;
- WFIFOW(login_fd,2) = len+4;
- WFIFOSET(login_fd,len+4);
- return 1;
- }
- return 0;
-}
-
-void char_read_fame_list(void)
-{
- int i;
- struct fame_list fame_item;
-
- // Empty ranking lists
- memset(smith_fame_list, 0, sizeof(smith_fame_list));
- memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
- memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
- // Build Blacksmith ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, fame_list_size_smith);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
- memcpy(&smith_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_smith)
- break;
- }
- mysql_free_result(sql_res);
- }
- // Build Alchemist ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, fame_list_size_chemist);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
-
- memcpy(&chemist_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_chemist)
- break;
- }
- mysql_free_result(sql_res);
- }
- // Build Taekwon ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_TAEKWON, fame_list_size_taekwon);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
-
- memcpy(&taekwon_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_taekwon)
- break;
- }
- mysql_free_result(sql_res);
- }
-}
-
-// Send map-servers the fame ranking lists
-int char_send_fame_list(int fd) {
- int i, len = 8;
- unsigned char buf[32000];
-
- WBUFW(buf,0) = 0x2b1b;
-
- for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add blacksmith's block length
- WBUFW(buf, 6) = len;
-
- for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add alchemist's block length
- WBUFW(buf, 4) = len;
-
- for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) {
- memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- // add total packet length
- WBUFW(buf, 2) = len;
-
- if (fd != -1)
- mapif_send(fd, buf, len);
- else
- mapif_sendall(buf, len);
- return 0;
-}
-
-int search_mapserver(unsigned short map, long ip, short port);
-
-//Loads a character's name and stores it in the buffer given (must be NAME_LENGTH in size)
-//Returns 1 on found, 0 on not found (buffer is filled with Unknown char name)
-int char_loadName(int char_id, char* name)
-{
- sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
-
- if (sql_row)
- memcpy(name, sql_row[0], NAME_LENGTH);
- else
- memcpy(name, unknown_char_name, NAME_LENGTH);
- if (sql_res) mysql_free_result(sql_res);
- return sql_row?1:0;
-}
-
-
-int parse_frommap(int fd) {
- int i = 0, j = 0;
- int id;
- RFIFOHEAD(fd);
-
- // Sometimes fd=0, and it will cause server crash. Don't know why. :(
- if (fd <= 0) {
- ShowError("parse_frommap error fd=%d\n", fd);
- return 0;
- }
-
- for(id = 0; id < MAX_MAP_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if(id == MAX_MAP_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_MAP_SERVERS) {
- unsigned char buf[16384];
- ShowStatus("Map-server %d (session #%d) has disconnected.\n", id, fd);
- //Notify other map servers that this one is gone. [Skotlex]
- WBUFW(buf,0) = 0x2b20;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[id].map[i])
- WBUFW(buf,10+(j++)*4) = server[id].map[i];
- if (j > 0) {
- WBUFW(buf,2) = j * 4 + 10;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- memset(&server[id], 0, sizeof(struct mmo_map_server));
- sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- server_fd[id] = -1;
- online_char_db->foreach(online_char_db,char_db_setoffline,id); //Tag relevant chars as 'in disconnected' server.
- }
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
- switch(RFIFOW(fd, 0)) {
-
- // map-server alive packet
- case 0x2718:
- RFIFOSKIP(fd,2);
- break;
-
- case 0x2af7:
- RFIFOSKIP(fd,2);
- if(char_gm_read) //Re-read gm accounts.
- read_gm_account();
- //Send to login request to reload gm accounts.
- else if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 2);
- WFIFOW(login_fd,0) = 0x2709;
- WFIFOSET(login_fd, 2);
- }
- break;
-
- // mapserver -> map names recv.
- case 0x2afa:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- unsigned char buf[16384];
- int x;
- WFIFOHEAD(fd,3+NAME_LENGTH);
-
- memset(server[id].map, 0, sizeof(server[id].map));
- j = 0;
- for(i = 4; i < RFIFOW(fd,2); i += 4) {
- server[id].map[j] = RFIFOW(fd,i);
- j++;
- }
-
- ShowStatus("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
- id, j, p[0], p[1], p[2], p[3], server[id].port);
- ShowStatus("Map-server %d loading complete.\n", id);
-
- if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
- mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
-
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- // name for wisp to player
- memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH);
- WFIFOSET(fd,3+NAME_LENGTH);
-
- char_send_fame_list(fd); //Send fame list.
-
- if (j == 0)
- ShowWarning("Map-Server %d have NO maps.\n", id);
- else {
- // Transmitting maps information to the other map-servers
- WBUFW(buf,0) = 0x2b04;
- WBUFW(buf,2) = j * 4 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 4);
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- // Transmitting the maps of the other map-servers to the new map-server
- for(x = 0; x < MAX_MAP_SERVERS; x++) {
- if (server_fd[x] > 0 && x != id) {
- WFIFOHEAD(fd, 10 +4*MAX_MAP_PER_SERVER);
- WFIFOW(fd,0) = 0x2b04;
- WFIFOL(fd,4) = server[x].ip;
- WFIFOW(fd,8) = server[x].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[x].map[i])
- WFIFOW(fd,10+(j++)*4) = server[x].map[i];
- if (j > 0) {
- WFIFOW(fd,2) = j * 4 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- }
- break;
- //Packet command is now used for sc_data request. [Skotlex]
- case 0x2afc:
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int aid, cid;
- aid = RFIFOL(fd,2);
- cid = RFIFOL(fd,6);
- RFIFOSKIP(fd, 10);
-#ifdef ENABLE_SC_SAVING
- sprintf(tmp_sql, "SELECT type, tick, val1, val2, val3, val4 from `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
- scdata_db, aid, cid);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- break;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- struct status_change_data data;
- int count = 0;
- WFIFOHEAD(fd, 14+50*sizeof(struct status_change_data));
- WFIFOW(fd, 0) = 0x2b1d;
- WFIFOL(fd, 4) = aid;
- WFIFOL(fd, 8) = cid;
- while((sql_row = mysql_fetch_row(sql_res)) && count < 50)
- {
- data.type = atoi(sql_row[0]);
- data.tick = atoi(sql_row[1]);
- data.val1 = atoi(sql_row[2]);
- data.val2 = atoi(sql_row[3]);
- data.val3 = atoi(sql_row[4]);
- data.val4 = atoi(sql_row[5]);
- memcpy(WFIFOP(fd, 14+count*sizeof(struct status_change_data)), &data, sizeof(struct status_change_data));
- count++;
- }
- if (count >= 50)
- ShowWarning("Too many status changes for %d:%d, some of them were not loaded.\n", aid, cid);
- mysql_free_result(sql_res);
- if (count > 0)
- {
- WFIFOW(fd, 2) = 14 + count*sizeof(struct status_change_data);
- WFIFOW(fd, 12) = count;
- WFIFOSET(fd, WFIFOW(fd,2));
-
- //Clear the data once loaded.
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-#endif
- break;
- }
- //set MAP user count
- case 0x2afe:
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOW(fd,2) != server[id].users) {
- server[id].users = RFIFOW(fd,2);
- ShowInfo("User Count: %d (Server: %d)\n", server[id].users, id);
- }
- RFIFOSKIP(fd, 4);
- break;
- // set MAP user
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- //TODO: When data mismatches memory, update guild/party online/offline states.
- int i, aid, cid;
- struct online_char_data* character;
-
- online_char_db->foreach(online_char_db,char_db_setoffline,id); //Set all chars from this server as 'unknown'
- server[id].users = RFIFOW(fd,4);
- for(i = 0; i < server[id].users; i++) {
- aid = RFIFOL(fd,6+i*8);
- cid = RFIFOL(fd,6+i*8+4);
- character = idb_ensure(online_char_db, aid, create_online_char_data);
- if (character->server > -1 && character->server != id)
- {
- ShowNotice("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n",
- character->account_id, character->char_id, character->server, id, aid, cid);
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- }
- character->server = id;
- character->char_id = cid;
- }
- //If any chars remain in -2, they will be cleaned in the cleanup timer.
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
- }
- // char saving
- case 0x2b01:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8), size = RFIFOW(fd,2);
- struct online_char_data* character;
- if (size - 13 != sizeof(struct mmo_charstatus))
- {
- ShowError("parse_from_map (save-char): Size mismatch! %d != %d\n", size-13, sizeof(struct mmo_charstatus));
- RFIFOSKIP(fd,size);
- break;
- }
- //Check account only if this ain't final save. Final-save goes through because of the char-map reconnect
- if (RFIFOB(fd,12) || (
- (character = idb_get(online_char_db, aid)) != NULL &&
- character->char_id == cid))
- {
- memcpy(&char_dat, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
- mmo_char_tosql(cid, &char_dat);
- } else { //This may be valid on char-server reconnection, when re-sending characters that already logged off.
- ShowError("parse_from_map (save-char): Received data for non-existant/offline character (%d:%d).\n", aid, cid);
- set_char_online(id, cid, aid);
- }
-
- if (RFIFOB(fd,12))
- { //Flag? Set character offline after saving [Skotlex]
- set_char_offline(cid, aid);
- WFIFOHEAD(fd, 10);
- WFIFOW(fd, 0) = 0x2b21; //Save ack only needed on final save.
- WFIFOL(fd, 2) = aid;
- WFIFOL(fd, 6) = cid;
- WFIFOSET(fd, 10);
- }
- RFIFOSKIP(fd,size);
- break;
- }
- // req char selection
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
-
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
- auth_fifo[auth_fifo_pos].char_id = 0;
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].delflag = 2;
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
- auth_fifo_pos++;
- {
- WFIFOHEAD(fd, 7);
- WFIFOW(fd, 0) = 0x2b03;
- WFIFOL(fd, 2) = RFIFOL(fd, 2);
- WFIFOB(fd, 6) = 0;
- WFIFOSET(fd, 7);
- }
- RFIFOSKIP(fd, 18);
- break;
-
- // request "change map server"
- case 0x2b05:
- if (RFIFOREST(fd) < 35)
- return 0;
- {
- unsigned short name;
- int map_id, map_fd = -1;
- struct online_char_data* data;
- struct mmo_charstatus* char_data;
- name = RFIFOW(fd,18);
- map_id = search_mapserver(name, RFIFOL(fd,24), RFIFOW(fd,28)); //Locate mapserver by ip and port.
- if (map_id >= 0)
- map_fd = server_fd[map_id];
- //Char should just had been saved before this packet, so this should be safe. [Skotlex]
- char_data = uidb_get(char_db_,RFIFOL(fd,14));
- if (char_data == NULL)
- { //Really shouldn't happen.
- mmo_char_fromsql(RFIFOL(fd,14), &char_dat);
- char_data = &char_dat;
- }
- //Tell the new map server about this player using Kevin's new auth packet. [Skotlex]
- if (map_fd>=0 && session[map_fd] && char_data)
- { //Send the map server the auth of this player.
- //Update the "last map" as this is where the player must be spawned on the new map server.
- WFIFOHEAD(fd, 30);
- WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
- char_data->last_point.map = RFIFOW(fd,18);
- char_data->last_point.x = RFIFOW(fd,20);
- char_data->last_point.y = RFIFOW(fd,22);
- char_data->sex = RFIFOB(fd,30); // Buuyo^
-
- WFIFOW(map_fd,0) = 0x2afd;
- WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
- WFIFOL(map_fd,4) = RFIFOL(fd, 2); //Account ID
- WFIFOL(map_fd,8) = RFIFOL(fd, 6); //Login1
- WFIFOL(map_fd,16) = RFIFOL(fd,10); //Login2
- WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
- memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
- WFIFOSET(map_fd, WFIFOW(map_fd,2));
- data = idb_ensure(online_char_db, RFIFOL(fd, 2), create_online_char_data);
- data->char_id = char_data->char_id;
- data->server = map_id; //Update server where char is.
-
- //Reply with an ack.
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
- WFIFOSET(fd, 30);
- } else { //Reply with nak
- WFIFOHEAD(fd, 30);
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
- WFIFOL(fd, 6) = 0; //Set login1 to 0.
- WFIFOSET(fd, 30);
- }
- RFIFOSKIP(fd, 35);
- }
- break;
-
- // char name check
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- char name[NAME_LENGTH];
- WFIFOHEAD(fd,30);
- char_loadName((int)RFIFOL(fd,2), name);
- WFIFOW(fd,0) = 0x2b09;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memcpy(WFIFOP(fd,6), name, NAME_LENGTH);
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,6);
- }
- break;
-
- // I want become GM - fuck!
- case 0x2b0a:
- if(RFIFOREST(fd)<4)
- return 0;
- if(RFIFOREST(fd)<RFIFOW(fd,2))
- return 0;
- /*
- memcpy(WFIFOP(login_fd,2),RFIFOP(fd,2),RFIFOW(fd,2)-2);
- WFIFOW(login_fd,0)=0x2720;
- WFIFOSET(login_fd,RFIFOW(fd,2));
-// printf("char : change gm -> login %d %s %d\n", RFIFOL(fd, 4), RFIFOP(fd, 8), RFIFOW(fd, 2));
- */
- ShowWarning("packet 0x2ba (become GM) is not supported by the Char-Server.\n");
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- break;
-
- // Map server send information to change an email of an account -> login-server
- case 0x2b0c:
- if (RFIFOREST(fd) < 86)
- return 0;
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 86);
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- WFIFOW(login_fd,0) = 0x2722;
- WFIFOSET(login_fd, 86);
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Receiving from map-server a status change resquest. Transmission to login-server (by Yor)
- case 0x2b0e:
- if (RFIFOREST(fd) < 44)
- return 0;
- {
- char character_name[NAME_LENGTH], t_name[NAME_LENGTH*2];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- WFIFOHEAD(fd, 34);
- memcpy(character_name, RFIFOP(fd,6), NAME_LENGTH);
- character_name[NAME_LENGTH-1] = '\0';
- jstrescapecpy(t_name, character_name); //Escape string for sql use... [Skotlex]
- // prepare answer
- WFIFOW(fd,0) = 0x2b0f; // answer
- WFIFOL(fd,2) = acc; // who want do operation
- WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban
- sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, t_name);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- if (mysql_num_rows(sql_res)) {
- sql_row = mysql_fetch_row(sql_res);
- memcpy(WFIFOP(fd,6), sql_row[1], NAME_LENGTH); // put correct name if found
- WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 5; // status of the account
- WFIFOSET(login_fd, 10);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 2: // ban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 18);
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
- WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
- WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
- WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
- WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
- WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
- WFIFOSET(login_fd,18);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 3: // unblock
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 0; // status of the account
- WFIFOSET(login_fd, 10);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 4: // unban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd, 6);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 5: // changesex
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd, 6);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- }
- } else {
- // character name not found
- memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
- WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- }
- // send answer if a player ask, not if the server ask
- if (acc != -1) {
- WFIFOSET(fd, 34);
- }
- mysql_free_result(sql_res);
- }
- }
- RFIFOSKIP(fd, 44);
- break;
-
-// case 0x2b0f: Not used anymore, available for future use
-
- // Update and send fame ranking list [DracoRPG]
- case 0x2b10:
- if (RFIFOREST(fd) < 12)
- return 0;
- {
- int cid = RFIFOL(fd, 2);
- int fame = RFIFOL(fd, 6);
- char type = RFIFOB(fd, 10);
- char pos = RFIFOB(fd, 11);
- int size = 0;
- struct fame_list *list = NULL;
- RFIFOSKIP(fd,12);
-
- switch(type) {
- case 1:
- size = fame_list_size_smith;
- list = smith_fame_list;
- break;
- case 2:
- size = fame_list_size_chemist;
- list = chemist_fame_list;
- break;
- case 3:
- size = fame_list_size_taekwon;
- list = taekwon_fame_list;
- break;
- }
- if(!size) break; //No list.
- if(pos)
- {
- pos--; //Convert from pos to index.
- if(
- (pos == 0 || fame < list[pos-1].fame) &&
- (pos == size-1 || fame > list[pos+1].fame)
- ) { //No change in order.
- list[(int)pos].fame = fame;
- char_send_fame_list(fd);
- break;
- }
- // If the player's already in the list, remove the entry and shift the following ones 1 step up
- memmove(list+pos, list+pos+1, (size-pos-1) * sizeof(struct fame_list));
- //Clear out last entry.
- list[size-1].id = 0;
- list[size-1].fame = 0;
- }
-
- // Find the position where the player has to be inserted
- for(i = 0; i < size && fame < list[i].fame; i++);
- if(i>=size) break; //Out of ranking.
- // When found someone with less or as much fame, insert just above
- memmove(list+i+1, list+i, (size-i-1) * sizeof(struct fame_list));
- list[i].id = cid;
- list[i].fame = fame;
- // Look for the player's name
- char_loadName(list[i].id, list[i].name);
- char_send_fame_list(-1);
- }
-
- break;
-
- // Receive rates [Wizputer]
- case 0x2b16:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
- return 0;
- {
- char motd[256], t_name[512]; //Required for jstrescapecpy [Skotlex]
- strncpy(motd, RFIFOP(fd,10), 255); //First copy it to make sure the motd fits.
- motd[255]='\0';
- jstrescapecpy(t_name,motd);
-
- sprintf(tmp_sql, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'",
- fd, server_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), t_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- RFIFOSKIP(fd,RFIFOW(fd,8));
- break;
- }
-
- // Character disconnected set online 0 [Wizputer]
- case 0x2b17:
- if (RFIFOREST(fd) < 6 )
- return 0;
- //printf("Setting %d char offline\n",RFIFOL(fd,2));
- set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
- // Reset all chars to offline [Wizputer]
- case 0x2b18:
- set_all_offline(id);
- RFIFOSKIP(fd,2);
- break;
- // Character set online [Wizputer]
- case 0x2b19:
- if (RFIFOREST(fd) < 6 )
- return 0;
- set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- // Build and send fame ranking lists [DracoRPG]
- case 0x2b1a:
- if (RFIFOREST(fd) < 2)
- return 0;
- char_read_fame_list();
- char_send_fame_list(-1);
- RFIFOSKIP(fd,2);
- break;
-
- //Request saving sc_data of a player. [Skotlex]
- case 0x2b1c:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
-#ifdef ENABLE_SC_SAVING
- int count, aid, cid, i;
- struct status_change_data data;
- char *p = tmp_sql;
-
- aid = RFIFOL(fd, 4);
- cid = RFIFOL(fd, 8);
- count = RFIFOW(fd, 12);
-
- p+= sprintf(p, "INSERT INTO `%s` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ", scdata_db);
-
- for (i = 0; i < count; i++)
- {
- memcpy (&data, RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
- p += sprintf (p, " ('%d','%d','%hu','%d','%d','%d','%d','%d'),", aid, cid,
- data.type, data.tick, data.val1, data.val2, data.val3, data.val4);
- }
- if (count > 0)
- {
- *--p = '\0'; //Remove final comma.
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-#endif
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- break;
- }
-
- case 0x2736:
- if (RFIFOREST(fd) < 6) return 0;
- ShowInfo("Updated IP address of Server #%d to %d.%d.%d.%d.\n",id,
- (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
- (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
- server[id].ip = RFIFOL(fd, 2);
- RFIFOSKIP(fd,6);
- break;
-
- default:
- // inter server - packet
- {
- int r = inter_parse_frommap(fd);
- if (r == 1) break; // processed
- if (r == 2) return 0; // need more packet
- }
-
- // no inter server packet. no char server packet -> disconnect
- ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(unsigned short map, long ip, short port) {
- int i, j;
-
- if (!map)
- return -1;
-
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] > 0)
- for (j = 0; server[i].map[j]; j++)
- if (server[i].map[j] == map) {
- if (ip > 0 && server[i].ip != ip)
- continue;
- if (port > 0 && server[i].port != port)
- continue;
- return i;
- }
-
- return -1;
-}
-
-int char_mapif_init(int fd) {
- return inter_mapif_init(fd);
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-// Rewrote: Adnvanced subnet check [LuzZza]
-//--------------------------------------------
-int lan_subnetcheck(long *p) {
-
- int i;
- unsigned char *sbn, *msk, *src = (unsigned char *)p;
-
- for(i=0; i<subnet_count; i++) {
-
- if((subnet[i].subnet & subnet[i].mask) == (*p & subnet[i].mask)) {
-
- sbn = (unsigned char *)&subnet[i].subnet;
- msk = (unsigned char *)&subnet[i].mask;
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
- src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
-
- return subnet[i].map_ip;
- }
- }
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
- return 0;
-}
-
-int parse_char(int fd) {
-
- int i, ch = 0;
- char email[40];
- unsigned char buf[64];
- unsigned short cmd;
- int map_fd;
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- long subnet_map_ip;
- RFIFOHEAD(fd);
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- if(login_fd < 0)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd)
- login_fd = -1;
- if (sd != NULL)
- {
- struct online_char_data* data = idb_get(online_char_db, sd->account_id);
- if (!data || data->server== -1) //If it is not in any server, send it offline. [Skotlex]
- set_char_offline(99,sd->account_id);
- }
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
- cmd = RFIFOW(fd,0);
- // crc32‚̃XƒLƒbƒv—p
- if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
- RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
- RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
- cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
- (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
- RFIFOSKIP(fd,4);
- cmd = RFIFOW(fd,0);
- ShowDebug("parse_char : %d crc32 skipped\n",fd);
- if(RFIFOREST(fd)==0)
- return 0;
- }
-
-//For use in packets that depend on an sd being present [Skotlex]
-#define FIFOSD_CHECK(rest) { if(RFIFOREST(fd) < rest) return 0; if (sd==NULL) { RFIFOSKIP(fd,rest); return 0; } }
-
- switch(cmd){
- case 0x20b: //20040622 encryption ragexe correspondence
- if (RFIFOREST(fd) < 19)
- return 0;
- RFIFOSKIP(fd,19);
- break;
-
- case 0x65: // request to connect
- ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- if (RFIFOREST(fd) < 17)
- return 0;
- {
- WFIFOHEAD(fd, 4);
-
- if (sd) {
- //Received again auth packet for already authentified account?? Discard it.
- //TODO: Perhaps log this as a hack attempt?
- RFIFOSKIP(fd,17);
- break;
- }
- CREATE(session[fd]->session_data, struct char_session_data, 1);
- sd = (struct char_session_data*)session[fd]->session_data;
- sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
- sd->account_id = RFIFOL(fd, 2);
- sd->login_id1 = RFIFOL(fd, 6);
- sd->login_id2 = RFIFOL(fd, 10);
- sd->sex = RFIFOB(fd, 16);
-
- WFIFOL(fd, 0) = RFIFOL(fd, 2);
- WFIFOSET(fd, 4);
-
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == sd->account_id &&
- auth_fifo[i].login_id1 == sd->login_id1 &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
- auth_fifo[i].delflag == 2) {
- auth_fifo[i].delflag = 1;
-
- if (online_check)
- { // check if character is not online already. [Skotlex]
- struct online_char_data* character;
- character = idb_get(online_char_db, sd->account_id);
-
- if (character)
- {
- if (character->server > -1)
- { //Character already online. KICK KICK KICK
- mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
- if (!character->waiting_disconnect)
- add_timer(gettick()+20000, chardb_waiting_disconnect, character->account_id, 0);
- character->waiting_disconnect = 1;
- /* Not a good idea because this would trigger when you do a char-change from the map server! [Skotlex]
- } else { //Kick from char server.
- struct char_session_data *tsd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && i != fd && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == sd->account_id)
- {
- WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
- WFIFOSET(i,3);
- break;
- }
- if (i == fd_max) //Shouldn't happen, but just in case.
- set_char_offline(99, sd->account_id);
- }
- */
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 8;
- WFIFOSET(fd,3);
- break;
- }
- }
- }
-
- if (max_connect_user == 0 || count_users() < max_connect_user) {
- if (login_fd > 0) { // don't send request if no login-server
- // request to login-server to obtain e-mail/time limit
- WFIFOHEAD(login_fd, 6);
- WFIFOW(login_fd,0) = 0x2716;
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOSET(login_fd,6);
- }
- // send characters to player
- mmo_char_send006b(fd, sd);
- } else {
- // refuse connection (over populated)
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
-// printf("connection request> set delflag 1(o:2)- account_id:%d/login_id1:%d(fifo_id:%d)\n", sd->account_id, sd->login_id1, i);
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,19);
- WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOL(login_fd,6) = sd->login_id1;
- WFIFOL(login_fd,10) = sd->login_id2;
- WFIFOB(login_fd,14) = sd->sex;
- WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
- WFIFOSET(login_fd,19);
- } else { // if no login-server, we must refuse connection
- WFIFOHEAD(fd,3);
- WFIFOW(fd,0) = 0x6c;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd, 17);
- break;
-
- case 0x66: // char select
- FIFOSD_CHECK(3);
-
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
- RFIFOSKIP(fd, 3);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
-
- if (sql_row)
- {
- int char_id = atoi(sql_row[0]);
- mysql_free_result(sql_res); //Free'd as soon as possible
- mmo_char_fromsql(char_id, &char_dat);
- char_dat.sex = sd->sex;
- } else {
- mysql_free_result(sql_res);
- break;
- }
-
- if (log_char) {
- char escaped_name[NAME_LENGTH*2];
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')",
- charlog_db, sd->account_id, RFIFOB(fd, 2), jstrescapecpy(escaped_name, char_dat.name));
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- ShowInfo("Selected char: (Account %d: %d - %s)" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat.name);
-
- i = search_mapserver(char_dat.last_point.map, -1, -1);
-
- // if map is not found, we check major cities
- if (i < 0) {
- unsigned short j;
- //First check that there's actually a map server online.
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0])
- break;
- if (j == MAX_MAP_SERVERS) {
- ShowInfo("Connection Closed. No map servers available.\n");
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
- if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
- char_dat.last_point.x = 273;
- char_dat.last_point.y = 354;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
- char_dat.last_point.x = 120;
- char_dat.last_point.y = 100;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
- char_dat.last_point.x = 160;
- char_dat.last_point.y = 94;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
- char_dat.last_point.x = 116;
- char_dat.last_point.y = 57;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
- char_dat.last_point.x = 87;
- char_dat.last_point.y = 117;
- } else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
- char_dat.last_point.x = 94;
- char_dat.last_point.y = 103;
- } else {
- ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(char_dat.last_point.map));
- WFIFOHEAD(fd,3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
- ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(char_dat.last_point.map), mapindex_id2name(j));
- char_dat.last_point.map = j;
- }
- { //Send player to map.
- WFIFOHEAD(fd,28);
- WFIFOW(fd, 0) =0x71;
- WFIFOL(fd, 2) =char_dat.char_id;
- memcpy(WFIFOP(fd,6), mapindex_id2name(char_dat.last_point.map), MAP_NAME_LENGTH);
-
- // Advanced subnet check [LuzZza]
- if((subnet_map_ip = lan_subnetcheck((long *)p)))
- WFIFOL(fd,22) = subnet_map_ip;
- else
- WFIFOL(fd,22) = server[i].ip;
-
- WFIFOW(fd,26) = server[i].port;
- WFIFOSET(fd,28);
- }
- if (auth_fifo_pos >= AUTH_FIFO_SIZE) {
- auth_fifo_pos = 0;
- }
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = char_dat.char_id;
- auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].sex = sd->sex;
- auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
-
- //Send NEW auth packet [Kevin]
- if ((map_fd = server_fd[i]) < 1 || session[map_fd] == NULL)
- {
- ShowError("parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", map_fd, i);
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- break;
- }
- { //Send auth ok to map server
- WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
- WFIFOW(map_fd,0) = 0x2afd;
- WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
- WFIFOL(map_fd,4) = auth_fifo[auth_fifo_pos].account_id;
- WFIFOL(map_fd,8) = auth_fifo[auth_fifo_pos].login_id1;
- WFIFOL(map_fd,16) = auth_fifo[auth_fifo_pos].login_id2;
- WFIFOL(map_fd,12) = (unsigned long)auth_fifo[auth_fifo_pos].connect_until_time;
- memcpy(WFIFOP(map_fd,20), &char_dat, sizeof(struct mmo_charstatus));
- WFIFOSET(map_fd, WFIFOW(map_fd,2));
- }
-
- set_char_online(i, auth_fifo[auth_fifo_pos].char_id, auth_fifo[auth_fifo_pos].account_id);
- //Checks to see if the even share setting of the party must be broken.
- inter_party_logged(char_dat.party_id, char_dat.account_id, char_dat.char_id);
- auth_fifo_pos++;
- break;
-
- case 0x67: // make new
- FIFOSD_CHECK(37);
-
- if(char_new == 0) //turn character creation on/off [Kevin]
- i = -2;
- else
- i = make_new_char_sql(fd, RFIFOP(fd, 2));
-
- //'Charname already exists' (-1), 'Char creation denied' (-2)
- //And 'You are underaged' (-3) (XD) [Sirius]
- if (i < 0)
- {
- WFIFOHEAD(fd, 3);
- WFIFOW(fd, 0) = 0x6e;
- switch (i) {
- case -1: WFIFOB(fd, 2) = 0x00; break;
- case -2: WFIFOB(fd, 2) = 0x02; break;
- case -3: WFIFOB(fd, 2) = 0x01; break;
- }
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }
- { //Send data.
- WFIFOHEAD(fd, 108);
- WFIFOW(fd, 0) = 0x6d;
- memset(WFIFOP(fd, 2), 0x00, 106);
-
- mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed.
- WFIFOL(fd, 2) = char_dat.char_id;
- WFIFOL(fd,2+4) = char_dat.base_exp>LONG_MAX?LONG_MAX:char_dat.base_exp;
- WFIFOL(fd,2+8) = char_dat.zeny;
- WFIFOL(fd,2+12) = char_dat.job_exp>LONG_MAX?LONG_MAX:char_dat.job_exp;
- WFIFOL(fd,2+16) = char_dat.job_level;
-
- WFIFOL(fd,2+28) = char_dat.karma;
- WFIFOL(fd,2+32) = char_dat.manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat.hp > SHRT_MAX) ? SHRT_MAX : char_dat.hp;
- WFIFOW(fd,2+44) = (char_dat.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat.max_hp;
- WFIFOW(fd,2+46) = (char_dat.sp > SHRT_MAX) ? SHRT_MAX : char_dat.sp;
- WFIFOW(fd,2+48) = (char_dat.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat.max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
- WFIFOW(fd,2+52) = char_dat.class_;
- WFIFOW(fd,2+54) = char_dat.hair;
-
- WFIFOW(fd,2+58) = char_dat.base_level;
- WFIFOW(fd,2+60) = (char_dat.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat.skill_point;
-
- WFIFOW(fd,2+64) = char_dat.shield;
- WFIFOW(fd,2+66) = char_dat.head_top;
- WFIFOW(fd,2+68) = char_dat.head_mid;
- WFIFOW(fd,2+70) = char_dat.hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat.name, NAME_LENGTH);
-
- WFIFOB(fd,2+98) = char_dat.str>UCHAR_MAX?UCHAR_MAX:char_dat.str;
- WFIFOB(fd,2+99) = char_dat.agi>UCHAR_MAX?UCHAR_MAX:char_dat.agi;
- WFIFOB(fd,2+100) = char_dat.vit>UCHAR_MAX?UCHAR_MAX:char_dat.vit;
- WFIFOB(fd,2+101) = char_dat.int_>UCHAR_MAX?UCHAR_MAX:char_dat.int_;
- WFIFOB(fd,2+102) = char_dat.dex>UCHAR_MAX?UCHAR_MAX:char_dat.dex;
- WFIFOB(fd,2+103) = char_dat.luk>UCHAR_MAX?UCHAR_MAX:char_dat.luk;
- WFIFOB(fd,2+104) = char_dat.char_num;
-
- WFIFOSET(fd, 108);
- RFIFOSKIP(fd, 37);
- }
- //to do
- for(ch = 0; ch < 9; ch++) {
- if (sd->found_char[ch] == -1) {
- sd->found_char[ch] = char_dat.char_id;
- break;
- }
- }
- break;
- case 0x68: /* delete char */
- FIFOSD_CHECK(46);
- {
- int cid = RFIFOL(fd,2);
- WFIFOHEAD(fd, 46);
- ShowInfo(CL_RED" Request Char Deletion:"CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
- memcpy(email, RFIFOP(fd,6), 40);
-
- /* Check if e-mail is correct */
- if(strcmpi(email, sd->email)){
- if(strcmp("a@a.com", sd->email) == 0){
- if(strcmp("a@a.com", email) == 0 || strcmp("", email) == 0){
- //ignore
- }else{
- //del fail
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- break;
- }
- }else{
- //del fail
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- break;
- }
- }
-
- for(i = 0; i < 9; i++) {
- /* Debug:
- printf("Checking if char to be deleted: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id);
- */
- if (sd->found_char[i] == cid) {
- for(ch = i; ch < 9-1; ch++)
- sd->found_char[ch] = sd->found_char[ch+1];
- sd->found_char[8] = -1;
- break;
- }
- }
- /* Such a character does not exist in the account */
- /* If so, you are so screwed. */
- if (i == 9) {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- break;
- }
-
- /* Grab the partner id */
- sprintf(tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, cid);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res)
- {
- int char_pid=0;
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row)
- char_pid = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- /* Delete character and partner (if any) */
- if(delete_char_sql(cid, char_pid)<0){
- //can't delete the char
- //either SQL error or can't delete by some CONFIG conditions
- //del fail
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- break;
- }
- if (char_pid != 0)
- { /* If there is partner, tell map server to do divorce */
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = RFIFOL(fd,2);
- WBUFL(buf,6) = char_pid;
- mapif_sendall(buf,10);
- }
- }
- /* Char successfully deleted.*/
- WFIFOW(fd, 0) = 0x6f;
- WFIFOSET(fd, 2);
-
- RFIFOSKIP(fd, 46);
- break;
- }
- case 0x2af8: // login as map-server
- if (RFIFOREST(fd) < 60)
- return 0;
- {
- char *l_userid = RFIFOP(fd,2);
- char *l_password = RFIFOP(fd,26);
- WFIFOHEAD(fd, 4+5*GM_num);
-
- l_userid[23] = '\0';
- l_password[23] = '\0';
- WFIFOW(fd, 0) = 0x2af9;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] <= 0)
- break;
- }
- if (i == MAX_MAP_SERVERS ||
- strcmp(l_userid, userid) ||
- strcmp(l_password, passwd)) {
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd, 3);
- } else {
- int len;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd, 3);
- session[fd]->func_parse = parse_frommap;
- server_fd[i] = fd;
- server[i].ip = RFIFOL(fd, 54);
- server[i].port = RFIFOW(fd, 58);
- server[i].users = 0;
- memset(server[i].map, 0, sizeof(server[i].map));
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- char_mapif_init(fd);
- // send gm acccounts level to map-servers
- len = 4;
- WFIFOW(fd,0) = 0x2b15;
- for(i = 0; i < GM_num; i++) {
- WFIFOL(fd,len) = gm_account[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- }
- RFIFOSKIP(fd,60);
- break;
- }
- case 0x187: // Alive?
- if (RFIFOREST(fd) < 6) {
- return 0;
- }
- RFIFOSKIP(fd, 6);
- break;
-
- case 0x7530: // Athena info get
- {
- WFIFOHEAD(fd, 10);
- WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd, 4) = ATHENA_REVISION;
- WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
- WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd, 10);
- RFIFOSKIP(fd, 2);
- return 0;
- }
- case 0x7532: // disconnect(default also disconnect)
- default:
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aMalloc(64);
- command = (char *)aMalloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- ShowNotice("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- ShowNotice("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-// MAP send all
-int mapif_sendall(unsigned char *buf, unsigned int len) {
- int i, c;
- int fd;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if ((fd = server_fd[i]) > 0) { //0 Should not be a valid server_fd [Skotlex]
- WFIFOHEAD(fd,len);
-#if 0 //This seems to have been fixed long long ago.
- if (session[fd] == NULL)
- { //Could this be the crash's source? [Skotlex]
- ShowError("mapif_sendall: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", fd, i);
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- continue;
- }
-#endif
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
-
- return c;
-}
-
-int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c;
- int fd;
-
- c = 0;
- for(i=0, c=0;i<MAX_MAP_SERVERS;i++){
- if ((fd = server_fd[i]) > 0 && fd != sfd) {
- WFIFOHEAD(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
-
- return c;
-}
-
-int mapif_send(int fd, unsigned char *buf, unsigned int len) {
- int i;
-
- if (fd >= 0) {
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (fd == server_fd[i]) {
- WFIFOHEAD(fd,len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- return 1;
- }
- }
- }
- return 0;
-}
-
-int send_users_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users();
- unsigned char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- WFIFOHEAD(login_fd,6);
- WFIFOW(login_fd,0) = 0x2714;
- WFIFOL(login_fd,2) = users;
- WFIFOSET(login_fd,6);
- }
- // send number of players to all map-servers
- WBUFW(buf,0) = 0x2b00;
- WBUFL(buf,2) = users;
- mapif_sendall(buf, 6);
-
- return 0;
-}
-
-static int send_accounts_tologin_sub(DBKey key, void* data, va_list ap) {
- struct online_char_data* character = (struct online_char_data*)data;
- int *i = va_arg(ap, int*);
- int count = va_arg(ap, int);
- if ((*i) >= count)
- return 0; //This is an error that shouldn't happen....
- if(character->server > -1) {
- WFIFOHEAD(login_fd, 8+count*4);
- WFIFOL(login_fd, 8+(*i)*4) =character->account_id;
- (*i)++;
- return 1;
- }
- return 0;
-}
-
-int send_accounts_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users(), i=0;
-
- if (login_fd > 0 && session[login_fd]) {
- // send account list to login server
- WFIFOHEAD(login_fd, 8+users*4);
- WFIFOW(login_fd,0) = 0x272d;
- WFIFOL(login_fd,4) = users;
- online_char_db->foreach(online_char_db, send_accounts_tologin_sub, &i, users);
- WFIFOW(login_fd,2) = 8+ i*4;
- WFIFOSET(login_fd,WFIFOW(login_fd,2));
- }
- return 0;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd > 0 && session[login_fd] != NULL)
- return 0;
-
- ShowInfo("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- if (login_fd == -1)
- { //Try again later. [Skotlex]
- login_fd = 0;
- return 0;
- }
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- {
- WFIFOHEAD(login_fd, 86);
- WFIFOW(login_fd,0) = 0x2710;
- memcpy(WFIFOP(login_fd,2), userid, 24);
- memcpy(WFIFOP(login_fd,26), passwd, 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memcpy(WFIFOP(login_fd,60), server_name, 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
- WFIFOW(login_fd,84) = char_new_display; //only display (New) if they want to [Kevin]
- WFIFOSET(login_fd,86);
- }
- return 0;
-}
-
-//------------------------------------------------
-//Invoked 15 seconds after mapif_disconnectplayer in case the map server doesn't
-//replies/disconnect the player we tried to kick. [Skotlex]
-//------------------------------------------------
-static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data)
-{
- struct online_char_data* character;
- if ((character = idb_get(online_char_db, id)) != NULL && character->waiting_disconnect)
- { //Mark it offline due to timeout.
- set_char_offline(character->char_id, character->account_id);
- }
- return 0;
-}
-
-//----------------------------------------------------------
-// Return numerical value of a switch configuration by [Yor]
-// on/off, english, français, deutsch, español
-//----------------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//----------------------------------
-// Reading Lan Support configuration
-// Rewrote: Anvanced subnet check [LuzZza]
-//----------------------------------
-int char_lan_config_read(const char *lancfgName) {
-
- FILE *fp;
- int line_num = 0;
- char line[1024], w1[64], w2[64], w3[64], w4[64];
-
- if((fp = fopen(lancfgName, "r")) == NULL) {
- ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- ShowInfo("Reading the configuration file %s...\n", lancfgName);
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- line_num++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
-
- ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
- continue;
- }
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- remove_control_chars((unsigned char *)w3);
- remove_control_chars((unsigned char *)w4);
-
- if(strcmpi(w1, "subnet") == 0) {
-
- subnet[subnet_count].mask = inet_addr(w2);
- subnet[subnet_count].char_ip = inet_addr(w3);
- subnet[subnet_count].map_ip = inet_addr(w4);
- subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
- if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
- ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
- continue;
- }
-
- subnet_count++;
- }
-
- ShowStatus("Read information about %d subnetworks.\n", subnet_count);
- }
-
- fclose(fp);
- return 0;
-}
-
-void do_final(void) {
- ShowInfo("Doing final stage...\n");
- //inter_save();
- do_final_itemdb();
- //check SQL save progress.
- //wait until save char complete
-
- set_all_offline(-1);
- set_all_offline_sql();
-
- inter_final();
-
- flush_fifos();
-
- mapindex_final();
-
- sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- if(gm_account) {
- aFree(gm_account);
- gm_account = 0;
- }
-
- delete_session(login_fd);
- delete_session(char_fd);
- char_db_->destroy(char_db_, NULL);
- online_char_db->destroy(online_char_db, NULL);
-
- mysql_close(&mysql_handle);
- if(char_gm_read)
- mysql_close(&lmysql_handle);
-
- ShowInfo("ok! all done...\n");
-}
-#endif //TXT_SQL_CONVERT
-void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- ShowInfo("Reading file %s...\n", cfgName);
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowFatalError("file not found: %s\n", cfgName);
- exit(1);
- }
-
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if(strcmpi(w1,"char_db")==0){
- strcpy(char_db,w2);
-#ifndef TXT_SQL_CONVERT
- } else if(strcmpi(w1, "gm_read_method") == 0) {
- if(atoi(w2) != 0)
- char_gm_read = true;
- else
- char_gm_read = false;
- //custom columns for login database
- }else if(strcmpi(w1,"login_db")==0){
- strcpy(login_db, w2);
- }else if(strcmpi(w1,"login_db_level")==0){
- strcpy(login_db_level,w2);
- }else if(strcmpi(w1,"login_db_account_id")==0){
- strcpy(login_db_account_id,w2);
- }else if(strcmpi(w1,"lowest_gm_level")==0){
- lowest_gm_level = atoi(w2);
- ShowStatus("set lowest_gm_level : %s\n",w2);
-#endif
- }else if(strcmpi(w1,"scdata_db")==0){
- strcpy(scdata_db,w2);
- }else if(strcmpi(w1,"cart_db")==0){
- strcpy(cart_db,w2);
- }else if(strcmpi(w1,"inventory_db")==0){
- strcpy(inventory_db,w2);
- }else if(strcmpi(w1,"charlog_db")==0){
- strcpy(charlog_db,w2);
- }else if(strcmpi(w1,"storage_db")==0){
- strcpy(storage_db,w2);
- }else if(strcmpi(w1,"reg_db")==0){
- strcpy(reg_db,w2);
- }else if(strcmpi(w1,"skill_db")==0){
- strcpy(skill_db,w2);
- }else if(strcmpi(w1,"interlog_db")==0){
- strcpy(interlog_db,w2);
- }else if(strcmpi(w1,"memo_db")==0){
- strcpy(memo_db,w2);
- }else if(strcmpi(w1,"guild_db")==0){
- strcpy(guild_db,w2);
- }else if(strcmpi(w1,"guild_alliance_db")==0){
- strcpy(guild_alliance_db,w2);
- }else if(strcmpi(w1,"guild_castle_db")==0){
- strcpy(guild_castle_db,w2);
- }else if(strcmpi(w1,"guild_expulsion_db")==0){
- strcpy(guild_expulsion_db,w2);
- }else if(strcmpi(w1,"guild_member_db")==0){
- strcpy(guild_member_db,w2);
- }else if(strcmpi(w1,"guild_skill_db")==0){
- strcpy(guild_skill_db,w2);
- }else if(strcmpi(w1,"guild_position_db")==0){
- strcpy(guild_position_db,w2);
- }else if(strcmpi(w1,"guild_storage_db")==0){
- strcpy(guild_storage_db,w2);
- }else if(strcmpi(w1,"party_db")==0){
- strcpy(party_db,w2);
- }else if(strcmpi(w1,"pet_db")==0){
- strcpy(pet_db,w2);
- }else if(strcmpi(w1,"friend_db")==0){
- strcpy(friend_db,w2);
-#ifndef TXT_SQL_CONVERT
- }else if(strcmpi(w1,"db_path")==0){
- strcpy(db_path,w2);
- //Map server option to use SQL db or not
- }else if(strcmpi(w1,"use_sql_db")==0){ // added for sql item_db read for char server [Valaris]
- db_use_sqldbs = config_switch(w2);
- ShowStatus("Using SQL dbs: %s\n",w2);
- }else if(strcmpi(w1,"item_db_db")==0){
- strcpy(item_db_db,w2);
- }else if(strcmpi(w1,"item_db2_db")==0){
- strcpy(item_db2_db,w2);
- } else if(strcmpi(w1,"connection_ping_interval")==0) {
- connection_ping_interval = config_switch(w2);
-#endif
- //support the import command, just like any other config
- }else if(strcmpi(w1,"import")==0){
- sql_config_read(w2);
- }
-
- }
- fclose(fp);
- ShowInfo("done reading %s.\n", cfgName);
-}
-#ifndef TXT_SQL_CONVERT
-
-int char_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowFatalError("Configuration file not found: %s.\n", cfgName);
- exit(1);
- }
-
- ShowInfo("Reading file %s...\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *) w1);
- remove_control_chars((unsigned char *) w2);
- if(strcmpi(w1,"timestamp_format")==0) {
- strncpy(timestamp_format, w2, 20);
- } else if(strcmpi(w1,"console_silent")==0){
- msg_silent = 0; //To always allow the next line to show up.
- ShowInfo("Console Silent Setting: %d\n", atoi(w2));
- msg_silent = atoi(w2);
- } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
- stdout_with_ansisequence = config_switch(w2);
- } else if (strcmpi(w1, "userid") == 0) {
- strncpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- strncpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- strncpy(server_name, w2, 20);
- server_name[sizeof(server_name) - 1] = '\0';
- ShowStatus("%s server has been initialized\n", w2);
- } else if (strcmpi(w1, "wisp_server_name") == 0) {
- if (strlen(w2) >= 4) {
- memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
- wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
- }
- } else if (strcmpi(w1, "login_ip") == 0) {
- unsigned char ip_str[16];
- login_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (login_ip) {
- strncpy(login_ip_str, w2, sizeof(login_ip_str));
- ShowStatus("Login server IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port=atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- unsigned char ip_str[16];
- char_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (char_ip){
- strncpy(char_ip_str, w2, sizeof(char_ip_str));
- ShowStatus("Character server IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "bind_ip") == 0) {
- unsigned char ip_str[16];
- bind_ip = resolve_hostbyname(w2, NULL, ip_str);
- if (bind_ip) {
- strncpy(bind_ip_str, w2, sizeof(bind_ip_str));
- ShowStatus("Character server binding IP address : %s -> %s\n", w2, ip_str);
- }
- } else if (strcmpi(w1, "char_port") == 0) {
- char_port = atoi(w2);
- } else if (strcmpi(w1, "char_maintenance") == 0) {
- char_maintenance = atoi(w2);
- } else if (strcmpi(w1, "char_new")==0){
- char_new = atoi(w2);
- } else if (strcmpi(w1, "char_new_display")==0){
- char_new_display = atoi(w2);
- } else if (strcmpi(w1, "max_connect_user") == 0) {
- max_connect_user = atoi(w2);
- if (max_connect_user < 0)
- max_connect_user = 0; // unlimited online players
- } else if(strcmpi(w1, "gm_allow_level") == 0) {
- gm_allow_level = atoi(w2);
- if(gm_allow_level < 0)
- gm_allow_level = 99;
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "online_check") == 0) {
- online_check = config_switch(w2);
- } else if (strcmpi(w1, "autosave_time") == 0) {
- autosave_interval = atoi(w2)*1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- } else if (strcmpi(w1, "save_log") == 0) {
- save_log = config_switch(w2);
- } else if (strcmpi(w1, "start_point") == 0) {
- char map[MAP_NAME_LENGTH];
- int x, y;
- if (sscanf(w2,"%16[^,],%d,%d", map, &x, &y) < 3)
- continue;
- if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
- start_point.map = mapindex_name2id(map);
- if (!start_point.map)
- ShowError("Specified start_point %s not found in map-index cache.\n", map);
- start_point.x = x;
- start_point.y = y;
- }
- } else if (strcmpi(w1, "start_zeny") == 0) {
- start_zeny = atoi(w2);
- if (start_zeny < 0)
- start_zeny = 0;
- } else if (strcmpi(w1, "start_weapon") == 0) {
- start_weapon = atoi(w2);
- if (start_weapon < 0)
- start_weapon = 0;
- } else if (strcmpi(w1, "start_armor") == 0) {
- start_armor = atoi(w2);
- if (start_armor < 0)
- start_armor = 0;
- } else if(strcmpi(w1,"log_char")==0){ //log char or not [devil]
- log_char = atoi(w2);
- } else if (strcmpi(w1, "unknown_char_name") == 0) {
- strcpy(unknown_char_name, w2);
- unknown_char_name[NAME_LENGTH-1] = 0;
- } else if (strcmpi(w1, "name_ignoring_case") == 0) {
- name_ignoring_case = config_switch(w2);
- } else if (strcmpi(w1, "char_name_option") == 0) {
- char_name_option = atoi(w2);
- } else if (strcmpi(w1, "char_name_letters") == 0) {
- strcpy(char_name_letters, w2);
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "chars_per_account") == 0) { //maxchars per account [Sirius]
- char_per_account = atoi(w2);
- } else if (strcmpi(w1, "char_del_level") == 0) { //disable/enable char deletion by its level condition [Lupus]
- char_del_level = atoi(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- } else if (strcmpi(w1, "fame_list_alchemist") == 0) {
- fame_list_size_chemist = atoi(w2);
- if (fame_list_size_chemist > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_alchemist)\n", MAX_FAME_LIST);
- fame_list_size_chemist = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "fame_list_blacksmith") == 0) {
- fame_list_size_smith = atoi(w2);
- if (fame_list_size_smith > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_blacksmith)\n", MAX_FAME_LIST);
- fame_list_size_smith = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "fame_list_taekwon") == 0) {
- fame_list_size_taekwon = atoi(w2);
- if (fame_list_size_taekwon > MAX_FAME_LIST) {
- ShowWarning("Max fame list size is %d (fame_list_taekwon)\n", MAX_FAME_LIST);
- fame_list_size_taekwon = MAX_FAME_LIST;
- }
- } else if (strcmpi(w1, "guild_exp_rate") == 0) {
- guild_exp_rate = atoi(w2);
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- }
- }
- fclose(fp);
-
- ShowInfo("Done reading %s.\n", cfgName);
-
- return 0;
-}
-
-void set_server_type(void)
-{
- SERVER_TYPE = ATHENA_SERVER_CHAR;
-}
-
-static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
-{
- struct online_char_data *character= (struct online_char_data*)data;
- if (character->server == -2) //Unknown server.. set them offline
- set_char_offline(character->char_id, character->account_id);
- if (character->server < 0)
- //Free data from players that have not been online for a while.
- db_remove(online_char_db, key);
- return 0;
-}
-
-static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
-{
- online_char_db->foreach(online_char_db, online_data_cleanup_sub);
- return 0;
-}
-
-int do_init(int argc, char **argv){
- int i;
-
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- server_fd[i] = -1;
- }
-
- //Read map indexes
- mapindex_init();
- start_point.map = mapindex_name2id("new_zone01.gat");
-
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- char_lan_config_read((argc > 3) ? argv[3] : LAN_CONF_NAME);
- sql_config_read(SQL_CONF_NAME);
-
- if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
- ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
- ShowNotice("Please edit your 'login' table to create a proper inter-server user/password (gender 'S')\n");
- ShowNotice("And then change the user/password to use in conf/char_athena.conf (or conf/import/char_conf.txt)\n");
- }
-
- ShowInfo("Finished reading the char-server configuration.\n");
-
- inter_init_sql((argc > 2) ? argv[2] : inter_cfgName); // inter server ÃʱâÈ­
- ShowInfo("Finished reading the inter-server configuration.\n");
-
- //Read ItemDB
- do_init_itemdb();
-
- ShowInfo("Initializing char server.\n");
- online_char_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- mmo_char_sql_init();
- ShowInfo("char server initialized.\n");
-
-// ShowDebug("set parser -> parse_char()...\n");
- set_defaultparse(parse_char);
-
-// ShowDebug("set terminate function -> do_final().....\n");
-
- if ((naddr_ != 0) && (!login_ip || !char_ip)) {
- // The char server should know what IP address it is running on
- // - MouseJstr
- int localaddr = ntohl(addr_[0]);
- unsigned char *ptr = (unsigned char *) &localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
- if (naddr_ != 1)
- ShowStatus("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- ShowStatus("Defaulting to %s as our IP address\n", buf);
- if (!login_ip) {
- strcpy(login_ip_str, buf);
- login_ip = inet_addr(login_ip_str);
- }
- if (!char_ip) {
- strcpy(char_ip_str, buf);
- char_ip = inet_addr(char_ip_str);
- }
- if (ptr[0] == 192 && ptr[1] == 168)
- ShowWarning("Firewall detected.. edit subnet_athena.conf and char_athena.conf\n");
- }
-
- ShowInfo("open port %d.....\n",char_port);
- char_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,char_port);
-
- add_timer_func_list(check_connect_login_server, "check_connect_login_server");
- add_timer_func_list(send_users_tologin, "send_users_tologin");
- add_timer_func_list(send_accounts_tologin, "send_accounts_tologin");
- add_timer_func_list(chardb_waiting_disconnect, "chardb_waiting_disconnect");
-
- add_timer_func_list(online_data_cleanup, "online_data_cleanup");
- add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600 * 1000);
-
- // send ALIVE PING to login server.
- add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000);
- // send USER COUNT PING to login server.
- add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000);
- add_timer_interval(gettick() + 3600*1000, send_accounts_tologin, 0, 0, 3600 * 1000); //Sync online accounts every hour.
-
- char_read_fame_list(); //Read fame lists.
-
- if(char_gm_read)
- read_gm_account();
-
-
- if ( console ) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- //Cleaning the tables for NULL entrys @ startup [Sirius]
- //Chardb clean
- ShowInfo("Cleaning the '%s' table...\n", char_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //guilddb clean
- ShowInfo("Cleaning the '%s' table...\n", guild_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //guildmemberdb clean
- ShowInfo("Cleaning the '%s' table...\n", guild_member_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- ShowInfo("End of char server initilization function.\n");
- ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
- return 0;
-}
-
-#undef mysql_query
-
-int debug_mysql_query(char *file, int line, void *mysql, const char *q) {
-#ifdef TWILIGHT
- ShowDebug("sql: %s:%d# %s\n", file, line, q);
-#endif
- return mysql_query((MYSQL *) mysql, q);
-}
-
-int char_child(int parent_id, int child_id) {
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: child Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == child_id )
- return 1;
- else
- return 0;
-}
-
-int char_married(int pl1,int pl2) {
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: married Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == pl2 )
- return 1;
- else
- return 0;
-}
-
-int char_family(int pl1,int pl2,int pl3) {
- int charid, partnerid, childid;
- sprintf (tmp_sql, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- sql_res = mysql_store_result (&mysql_handle);
- if (!sql_res) return 0;
-
- while((sql_row = mysql_fetch_row(sql_res)))
- {
- charid = atoi(sql_row[0]);
- partnerid = atoi(sql_row[1]);
- childid = atoi(sql_row[2]);
- if (charid == pl1) {
- if ((pl2 == partnerid && pl3 == childid) ||
- (pl3 == partnerid && pl2 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
- }
- if(charid == pl2) {
- if ((pl1 == partnerid && pl3 == childid) ||
- (pl3 == partnerid && pl1 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
- }
- if(charid == pl3) {
- if ((pl1 == partnerid && pl2 == childid) ||
- (pl2 == partnerid && pl1 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
- }
- }
- mysql_free_result (sql_res);
- return 0;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by Jioh L. Jung
+// TXT 1.105
+#include <sys/types.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include <time.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "char.h"
+#include "../common/utils.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+#include "itemdb.h"
+#include "inter.h"
+#include "db.h"
+#include "malloc.h"
+#include "int_guild.h"
+
+#ifndef TXT_SQL_CONVERT
+static struct dbt *char_db_;
+#endif
+char char_db[256] = "char";
+char scdata_db[256] = "sc_data";
+char cart_db[256] = "cart_inventory";
+char inventory_db[256] = "inventory";
+char charlog_db[256] = "charlog";
+char storage_db[256] = "storage";
+char interlog_db[256] = "interlog";
+char reg_db[256] = "global_reg_value";
+char skill_db[256] = "skill";
+char memo_db[256] = "memo";
+char guild_db[256] = "guild";
+char guild_alliance_db[256] = "guild_alliance";
+char guild_castle_db[256] = "guild_castle";
+char guild_expulsion_db[256] = "guild_expulsion";
+char guild_member_db[256] = "guild_member";
+char guild_position_db[256] = "guild_position";
+char guild_skill_db[256] = "guild_skill";
+char guild_storage_db[256] = "guild_storage";
+char party_db[256] = "party";
+char pet_db[256] = "pet";
+char friend_db[256] = "friends";
+#ifdef TXT_SQL_CONVERT
+int save_log = 0; //Have the logs be off by default when converting
+#else
+int save_log = 1;
+int db_use_sqldbs;
+int connection_ping_interval = 0;
+
+char login_db[256] = "login";
+char login_db_account_id[32] = "account_id";
+char login_db_level[32] = "level";
+
+int lowest_gm_level = 1;
+
+char *SQL_CONF_NAME = "conf/inter_athena.conf";
+
+struct mmo_map_server{
+ long ip;
+ short port;
+ int users;
+ unsigned short map[MAX_MAP_PER_SERVER];
+} server[MAX_MAP_SERVERS];
+
+int server_fd[MAX_MAP_SERVERS];
+
+int login_fd, char_fd;
+char userid[24];
+char passwd[24];
+char server_name[20];
+char wisp_server_name[NAME_LENGTH] = "Server";
+char login_ip_str[128];
+in_addr_t login_ip = 0;
+int login_port = 6900;
+char char_ip_str[128];
+in_addr_t char_ip = 0;
+char bind_ip_str[128];
+in_addr_t bind_ip = 0;
+int char_port = 6121;
+int char_maintenance = 0;
+int char_new;
+int char_new_display;
+int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
+int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
+char char_name_letters[1024] = ""; // list of letters/symbols used to authorise or not a name of a character. by [Yor]
+//The following are characters that are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
+#define TRIM_CHARS "\032\t\x0A\x0D "
+int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
+int char_del_level = 0; //From which level u can delete character [Lupus]
+
+int log_char = 1; // loggin char or not [devil]
+int log_inter = 1; // loggin inter or not [devil]
+
+// Advanced subnet check [LuzZza]
+struct _subnet {
+ long subnet;
+ long mask;
+ long char_ip;
+ long map_ip;
+} subnet[16];
+
+int subnet_count = 0;
+
+char unknown_char_name[NAME_LENGTH] = "Unknown";
+char db_path[1024]="db";
+
+//These are used to aid the map server in identifying valid clients. [Skotlex]
+static int max_account_id = DEFAULT_MAX_ACCOUNT_ID, max_char_id = DEFAULT_MAX_CHAR_ID;
+static int online_check = 1; //If one, it won't let players connect when their account is already registered online and will send the relevant map server a kick user request. [Skotlex]
+
+struct char_session_data{
+ int account_id, login_id1, login_id2,sex;
+ int found_char[9];
+ char email[40]; // e-mail (default: a@a.com) by [Yor]
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+};
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag,sex;
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+} auth_fifo[AUTH_FIFO_SIZE];
+int auth_fifo_pos = 0;
+
+int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
+
+struct mmo_charstatus char_dat;
+int char_num,char_max;
+int max_connect_user = 0;
+int gm_allow_level = 99;
+int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int start_zeny = 0;
+int start_weapon = 1201;
+int start_armor = 2301;
+int guild_exp_rate = 100;
+
+//Custom limits for the fame lists. [Skotlex]
+int fame_list_size_chemist = MAX_FAME_LIST;
+int fame_list_size_smith = MAX_FAME_LIST;
+int fame_list_size_taekwon = MAX_FAME_LIST;
+
+// Char-server-side stored fame lists [DracoRPG]
+struct fame_list smith_fame_list[MAX_FAME_LIST];
+struct fame_list chemist_fame_list[MAX_FAME_LIST];
+struct fame_list taekwon_fame_list[MAX_FAME_LIST];
+
+// check for exit signal
+// 0 is saving complete
+// other is char_id
+unsigned int save_flag = 0;
+
+// start point (you can reset point on conf file)
+struct point start_point = { 0, 53, 111};
+
+bool char_gm_read = false;
+struct gm_account *gm_account = NULL;
+int GM_num = 0;
+
+int console = 0;
+
+//Structure for holding in memory which characters are online on the map servers connected.
+struct online_char_data {
+ int account_id;
+ int char_id;
+ short server;
+ unsigned waiting_disconnect :1;
+};
+
+struct dbt *online_char_db; //Holds all online characters.
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data);
+
+static void * create_online_char_data(DBKey key, va_list args) {
+ struct online_char_data* character;
+ character = aCalloc(1, sizeof(struct online_char_data));
+ character->account_id = key.i;
+ character->char_id = -1;
+ character->server = -1;
+ return character;
+}
+
+//-------------------------------------------------
+// Set Character online/offline [Wizputer]
+//-------------------------------------------------
+
+void set_char_online(int map_id, int char_id, int account_id) {
+ struct online_char_data* character;
+ if ( char_id != 99 ) {
+ sprintf(tmp_sql, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'",char_db,char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ if (max_account_id < account_id || max_char_id < char_id)
+ { //Notify map-server of the new max IDs [Skotlex]
+ if (account_id > max_account_id)
+ max_account_id = account_id;
+ if (char_id > max_char_id)
+ max_char_id = char_id;
+ mapif_send_maxid(max_account_id, max_char_id);
+ }
+ }
+
+ character = idb_ensure(online_char_db, account_id, create_online_char_data);
+ if (online_check && character->char_id != -1 && character->server > -1 && character->server != map_id)
+ {
+ //char == 99 <- Character logging in, so someone has logged in while one
+ //char is still on map-server, so kick him out, but don't print "error"
+ //as this is normal behaviour. [Skotlex]
+ if (char_id != 99)
+ ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
+ character->account_id, character->char_id, character->server, map_id, account_id, char_id);
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ }
+ character->char_id = (char_id==99)?-1:char_id;
+ character->server = (char_id==99)?-1:map_id;
+ character->waiting_disconnect = 0;
+ if (char_id != 99)
+ { //Set char online in guild cache. If char is in memory, use the guild id on it, otherwise seek it.
+ struct mmo_charstatus *cp;
+ cp = idb_get(char_db_,char_id);
+ inter_guild_CharOnline(char_id, cp?cp->guild_id:-1);
+ }
+ if (login_fd > 0 && !session[login_fd]->eof)
+ {
+ WFIFOHEAD(login_fd,6);
+ WFIFOW(login_fd,0) = 0x272b;
+ WFIFOL(login_fd,2) = account_id;
+ WFIFOSET(login_fd,6);
+ }
+}
+
+void set_char_offline(int char_id, int account_id) {
+ struct mmo_charstatus *cp;
+ struct online_char_data* character;
+
+ if ( char_id == 99 )
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
+ else {
+ cp = idb_get(char_db_,char_id);
+ inter_guild_CharOffline(char_id, cp?cp->guild_id:-1);
+ if (cp)
+ idb_remove(char_db_,char_id);
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
+
+ if (mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if ((character = idb_get(online_char_db, account_id)) != NULL)
+ { //We don't free yet to avoid aCalloc/aFree spamming during char change. [Skotlex]
+ character->char_id = -1;
+ character->server = -1;
+ character->waiting_disconnect = 0;
+ }
+
+ if (login_fd > 0 && !session[login_fd]->eof)
+ {
+ WFIFOHEAD(login_fd,6);
+ WFIFOW(login_fd,0) = 0x272c;
+ WFIFOL(login_fd,2) = account_id;
+ WFIFOSET(login_fd,6);
+ }
+}
+
+static int char_db_setoffline(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int server = va_arg(ap, int);
+ if (server == -1) {
+ character->char_id = -1;
+ character->server = -1;
+ character->waiting_disconnect = 0;
+ } else if (character->server == server)
+ character->server = -2; //In some map server that we aren't connected to.
+ return 0;
+}
+
+static int char_db_kickoffline(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int server = va_arg(ap, int);
+ if (server > -1 && character->server != server)
+ return 0;
+
+ //Kick out any connected characters, and set them offline as appropiate.
+ if (character->server > -1)
+ mapif_disconnectplayer(server_fd[character->server],
+ character->account_id, character->char_id, 1);
+ else if (!character->waiting_disconnect)
+ set_char_offline(character->char_id, character->account_id);
+ else return 0;
+ return 1;
+}
+
+void set_all_offline(int id) {
+ if (id < 0)
+ ShowNotice("Sending all users offline.\n");
+ else
+ ShowNotice("Sending users of map-server %d offline.\n",id);
+ online_char_db->foreach(online_char_db,char_db_kickoffline,id);
+
+ if (id >= 0 || login_fd <= 0 || session[login_fd]->eof)
+ return;
+ //Tell login-server to also mark all our characters as offline.
+ WFIFOHEAD(login_fd, 2);
+ WFIFOW(login_fd,0) = 0x2737;
+ WFIFOSET(login_fd,2);
+}
+
+void set_all_offline_sql(void) {
+ //Set all players to 'OFFLINE'
+ sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", char_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", guild_member_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql, "UPDATE `%s` SET `connect_member` = '0'", guild_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+}
+
+//----------------------------------------------------------------------
+// Determine if an account (id) is a GM account
+// and returns its level (or 0 if it isn't a GM account or if not found)
+//----------------------------------------------------------------------
+// Removed since nothing GM related goes on in the char server [CLOWNISIUS]
+int isGM(int account_id) {
+ int i;
+
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == account_id)
+ return gm_account[i].level;
+ return 0;
+}
+
+void read_gm_account(void) {
+ if(!char_gm_read)
+ return;
+
+ if (gm_account != NULL)
+ aFree(gm_account);
+ GM_num = 0;
+
+ sprintf(tmp_sql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level);
+ if (mysql_query(&lmysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ lsql_res = mysql_store_result(&lmysql_handle);
+ if (lsql_res) {
+ gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * (size_t)mysql_num_rows(lsql_res), 1);
+ while ((lsql_row = mysql_fetch_row(lsql_res))) {
+ gm_account[GM_num].account_id = atoi(lsql_row[0]);
+ gm_account[GM_num].level = atoi(lsql_row[1]);
+ GM_num++;
+ }
+ }
+
+ mysql_free_result(lsql_res);
+ mapif_send_gmaccounts();
+}
+#endif //TXT_SQL_CONVERT
+int compare_item(struct item *a, struct item *b) {
+
+ if(a->id == b->id &&
+ a->nameid == b->nameid &&
+ a->amount == b->amount &&
+ a->equip == b->equip &&
+ a->identify == b->identify &&
+ a->refine == b->refine &&
+ a->attribute == b->attribute)
+ {
+ int i;
+ for (i=0; i<MAX_SLOTS && a->card[i]==b->card[i]; i++);
+ return (i == MAX_SLOTS);
+ }
+ return 0;
+}
+
+#ifndef TXT_SQL_CONVERT
+static void* create_charstatus(DBKey key, va_list args) {
+ struct mmo_charstatus *cp;
+ cp = (struct mmo_charstatus *) aCalloc(1,sizeof(struct mmo_charstatus));
+ cp->char_id = key.i;
+ return cp;
+}
+#endif //TXT_SQL_CONVERT
+int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
+ int i=0,j;
+ int count = 0;
+ int diff = 0;
+ char *tmp_ptr; //Building a single query should be more efficient than running
+ //multiple queries for each thing about to be saved, right? [Skotlex]
+ char save_status[128]; //For displaying save information. [Skotlex]
+ struct mmo_charstatus *cp;
+ struct itemtmp mapitem[MAX_GUILD_STORAGE];
+
+ if (char_id!=p->char_id) return 0;
+
+#ifndef TXT_SQL_CONVERT
+ cp = idb_ensure(char_db_, char_id, create_charstatus);
+#else
+ cp = aCalloc(1, sizeof(struct mmo_charstatus));
+#endif
+
+ memset(save_status, 0, sizeof(save_status));
+ diff = 0;
+ //map inventory data
+ for(i=0;i<MAX_INVENTORY;i++){
+ if (!compare_item(&p->inventory[i], &cp->inventory[i]))
+ diff = 1;
+ if(p->inventory[i].nameid>0){
+ mapitem[count].flag=0;
+ mapitem[count].id = p->inventory[i].id;
+ mapitem[count].nameid=p->inventory[i].nameid;
+ mapitem[count].amount = p->inventory[i].amount;
+ mapitem[count].equip = p->inventory[i].equip;
+ mapitem[count].identify = p->inventory[i].identify;
+ mapitem[count].refine = p->inventory[i].refine;
+ mapitem[count].attribute = p->inventory[i].attribute;
+ for (j=0; j<MAX_SLOTS; j++)
+ mapitem[count].card[j] = p->inventory[i].card[j];
+ count++;
+ }
+ }
+ //printf("- Save item data to MySQL!\n");
+ if (diff)
+ if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_INVENTORY))
+ strcat(save_status, " inventory");
+
+ count = 0;
+ diff = 0;
+
+ //map cart data
+ for(i=0;i<MAX_CART;i++){
+ if (!compare_item(&p->cart[i], &cp->cart[i]))
+ diff = 1;
+ if(p->cart[i].nameid>0){
+ mapitem[count].flag=0;
+ mapitem[count].id = p->cart[i].id;
+ mapitem[count].nameid=p->cart[i].nameid;
+ mapitem[count].amount = p->cart[i].amount;
+ mapitem[count].equip = p->cart[i].equip;
+ mapitem[count].identify = p->cart[i].identify;
+ mapitem[count].refine = p->cart[i].refine;
+ mapitem[count].attribute = p->cart[i].attribute;
+ for (j=0; j<MAX_SLOTS; j++)
+ mapitem[count].card[j] = p->cart[i].card[j];
+ count++;
+ }
+ }
+
+ if (diff)
+ if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_CART))
+ strcat(save_status, " cart");
+#ifdef TXT_SQL_CONVERT
+{ //Insert the barebones to then update the rest.
+ char t_name[NAME_LENGTH*2];
+ jstrescapecpy(t_name, p->name);
+ sprintf(tmp_sql, "REPLACE INTO `%s` (`account_id`, `char_num`, `name`) VALUES ('%d', '%d', '%s')",
+ char_db, p->account_id, p->char_num, t_name);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " creation");
+}
+#endif
+
+ if (
+ (p->base_exp != cp->base_exp) || (p->base_level != cp->base_level) ||
+ (p->job_level != cp->job_level) || (p->job_exp != cp->job_exp) ||
+ (p->zeny != cp->zeny) ||
+ (p->last_point.x != cp->last_point.x) || (p->last_point.y != cp->last_point.y) ||
+ (p->max_hp != cp->max_hp) || (p->hp != cp->hp) ||
+ (p->max_sp != cp->max_sp) || (p->sp != cp->sp) ||
+ (p->status_point != cp->status_point) || (p->skill_point != cp->skill_point) ||
+ (p->str != cp->str) || (p->agi != cp->agi) || (p->vit != cp->vit) ||
+ (p->int_ != cp->int_) || (p->dex != cp->dex) || (p->luk != cp->luk) ||
+ (p->option != cp->option) ||
+ (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) ||
+ (p->pet_id != cp->pet_id) || (p->weapon != cp->weapon) || (p->hom_id != cp->hom_id) ||
+ (p->shield != cp->shield) || (p->head_top != cp->head_top) ||
+ (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom)
+ )
+ { //Save status
+ sprintf(tmp_sql ,"UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
+ "`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
+ "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
+ "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
+ "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d'," //[orn] add homun_id (homunculus id)
+ "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
+ "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d'"
+ " WHERE `account_id`='%d' AND `char_id` = '%d'",
+ char_db, p->base_level, p->job_level,
+ p->base_exp, p->job_exp, p->zeny,
+ p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point,
+ p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
+ p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, //[orn] add homun_id (homunculus id)
+ p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
+ mapindex_id2name(p->last_point.map), p->last_point.x, p->last_point.y,
+ mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y,
+ p->account_id, p->char_id
+ );
+
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " status");
+ }
+
+ //Values that will seldom change (to speed up saving)
+ if (
+ (p->hair != cp->hair) || (p->hair_color != cp->hair_color) || (p->clothes_color != cp->clothes_color) ||
+ (p->class_ != cp->class_) ||
+ (p->partner_id != cp->partner_id) || (p->father != cp->father) ||
+ (p->mother != cp->mother) || (p->child != cp->child) ||
+ (p->karma != cp->karma) || (p->manner != cp->manner) ||
+ (p->fame != cp->fame)
+ )
+ {
+ sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d',"
+ "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',"
+ "`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d',"
+ "`karma`='%d',`manner`='%d', `fame`='%d'"
+ " WHERE `account_id`='%d' AND `char_id` = '%d'",
+ char_db, p->class_,
+ p->hair, p->hair_color, p->clothes_color,
+ p->partner_id, p->father, p->mother, p->child,
+ p->karma, p->manner, p->fame,
+ p->account_id, p->char_id
+ );
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " status2");
+ }
+
+
+ diff = 0;
+
+ for(i=0;i<MAX_MEMOPOINTS;i++){
+ if(p->memo_point[i].map == cp->memo_point[i].map && p->memo_point[i].x == cp->memo_point[i].x && p->memo_point[i].y == cp->memo_point[i].y)
+ continue;
+ diff = 1;
+ break;
+ }
+
+ if (diff)
+ { //Save memo
+ //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //insert here.
+ tmp_ptr = tmp_sql;
+ tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ", memo_db);
+ count = 0;
+ for(i=0;i<MAX_MEMOPOINTS;i++){
+ if(p->memo_point[i].map){
+ tmp_ptr += sprintf(tmp_ptr,"('%d', '%s', '%d', '%d'),",
+ char_id, mapindex_id2name(p->memo_point[i].map), p->memo_point[i].x, p->memo_point[i].y);
+ count++;
+ }
+ }
+ if (count)
+ { //Dangerous? Only if none of the above sprintf worked. [Skotlex]
+ tmp_ptr[-1] = '\0'; //Remove the trailing comma.
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " memo");
+ } else //Memo Points cleared (how is this possible?).
+ strcat(save_status, " memo");
+ }
+
+ diff = 0;
+ for(i=0;i<MAX_SKILL;i++) {
+ if ((p->skill[i].lv != 0) && (p->skill[i].id == 0))
+ p->skill[i].id = i; // Fix skill tree
+
+ if((p->skill[i].id != cp->skill[i].id) || (p->skill[i].lv != cp->skill[i].lv) ||
+ (p->skill[i].flag != cp->skill[i].flag))
+ {
+ diff = 1;
+ break;
+ }
+ }
+
+ if (diff)
+ { //Save skills
+
+ //`skill` (`char_id`, `id`, `lv`)
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ tmp_ptr = tmp_sql;
+ tmp_ptr += sprintf(tmp_ptr,"INSERT INTO `%s`(`char_id`,`id`,`lv`) VALUES ", skill_db);
+ count = 0;
+ //insert here.
+ for(i=0;i<MAX_SKILL;i++){
+ if(p->skill[i].id && p->skill[i].flag!=1)
+ {
+ tmp_ptr += sprintf(tmp_ptr,"('%d','%d','%d'),",
+ char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
+ count++;
+ }
+ }
+
+ if (count)
+ {
+ tmp_ptr[-1] = '\0'; //Remove trailing comma.
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " skills");
+ } else //Skills removed (reset?)
+ strcat(save_status, " skills");
+ }
+ diff = 0;
+ for(i = 0; i < MAX_FRIENDS; i++){
+ if(p->friends[i].char_id != cp->friends[i].char_id ||
+ p->friends[i].account_id != cp->friends[i].account_id){
+ diff = 1;
+ break;
+ }
+ }
+
+ if(diff == 1)
+ { //Save friends
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ tmp_ptr = tmp_sql;
+ tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db);
+ count = 0;
+ for(i = 0; i < MAX_FRIENDS; i++){
+ if(p->friends[i].char_id > 0)
+ {
+ tmp_ptr += sprintf(tmp_ptr, "('%d','%d','%d'),", char_id, p->friends[i].account_id, p->friends[i].char_id);
+ count++;
+ }
+ }
+ if (count)
+ {
+ tmp_ptr[-1] = '\0'; //Remove the last comma. [Skotlex]
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else
+ strcat(save_status, " friends");
+ } else //Friend list cleared.
+ strcat(save_status, " friends");
+
+ }
+
+ if (save_status[0]!='\0' && save_log)
+ ShowInfo("Saved char %d - %s:%s.\n", char_id, p->name, save_status);
+#ifndef TXT_SQL_CONVERT
+ memcpy(cp, p, sizeof(struct mmo_charstatus));
+#else
+ aFree(cp);
+#endif
+ return 0;
+}
+
+// [Ilpalazzo-sama]
+int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
+{
+ int i,j, flag, id;
+ char *tablename;
+ char selectoption[16];
+ char * str_p = tmp_sql;
+
+ switch (tableswitch) {
+ case TABLE_INVENTORY:
+ tablename = inventory_db; // no need for sprintf here as *_db are char*.
+ sprintf(selectoption,"char_id");
+ break;
+ case TABLE_CART:
+ tablename = cart_db;
+ sprintf(selectoption,"char_id");
+ break;
+ case TABLE_STORAGE:
+ tablename = storage_db;
+ sprintf(selectoption,"account_id");
+ break;
+ case TABLE_GUILD_STORAGE:
+ tablename = guild_storage_db;
+ sprintf(selectoption,"guild_id");
+ break;
+ default:
+ ShowError("Invalid table name!\n");
+ return 1;
+ }
+
+ //=======================================mysql database data > memory===============================================
+
+ str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+
+ for (j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p, " FROM `%s` WHERE `%s`='%d'", tablename, selectoption, char_id);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 1;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ while ((sql_row = mysql_fetch_row(sql_res))) {
+ flag = 0;
+ id = atoi(sql_row[0]);
+ for(i = 0; i < count; i++) {
+ if(mapitem[i].flag == 1)
+ continue;
+ if(mapitem[i].nameid == atoi(sql_row[1])
+ && mapitem[i].card[0] == atoi(sql_row[7])
+ && mapitem[i].card[2] == atoi(sql_row[9])
+ && mapitem[i].card[3] == atoi(sql_row[10])
+ ) { //They are the same item.
+ for (j = 0; j<MAX_SLOTS && mapitem[i].card[j] == atoi(sql_row[7+j]); j++);
+ if (j == MAX_SLOTS &&
+ mapitem[i].amount == atoi(sql_row[2]) &&
+ mapitem[i].equip == atoi(sql_row[3]) &&
+ mapitem[i].identify == atoi(sql_row[4]) &&
+ mapitem[i].refine == atoi(sql_row[5]) &&
+ mapitem[i].attribute == atoi(sql_row[6]))
+ { //Do nothing.
+ } else
+//==============================================Memory data > SQL ===============================
+#ifndef TXT_SQL_CONVERT
+ if(!itemdb_isequip(mapitem[i].nameid))
+ { //Quick update of stackable items. Update Qty and Equip should be enough, but in case we are also updating identify
+ sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
+ tablename, mapitem[i].equip, mapitem[i].identify,mapitem[i].amount, id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ } else
+#endif //TXT_SQL_CONVERT
+ { //Equipment or Misc item, just update all fields.
+ str_p = tmp_sql;
+ str_p += sprintf(str_p,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',`attribute`='%d'",
+ tablename, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine, mapitem[i].attribute);
+
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`=%d", j, mapitem[i].card[j]);
+
+ str_p += sprintf(str_p,", `amount`='%d' WHERE `id`='%d' LIMIT 1",
+ mapitem[i].amount, id);
+
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ flag = mapitem[i].flag = 1; //Item dealt with,
+ break; //skip to next item in the db.
+ }
+ }
+ if(!flag) { //Item not updated, remove it.
+ sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ mysql_free_result(sql_res);
+ }
+
+ for(i = 0; i < count; i++) {
+ if(!mapitem[i].flag) {
+ str_p = tmp_sql;
+ str_p += sprintf(str_p,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`",
+ tablename, selectoption);
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p,", `card%d`", j);
+
+ str_p += sprintf(str_p,") VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d'",
+ char_id, mapitem[i].nameid, mapitem[i].amount, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine,
+ mapitem[i].attribute);
+
+ for(j=0; j<MAX_SLOTS; j++)
+ str_p +=sprintf(str_p,", '%d'",mapitem[i].card[j]);
+
+ strcat(tmp_sql, ")");
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+//=====================================================================================================
+int mmo_char_fromsql(int char_id, struct mmo_charstatus *p){
+ int i,j, n;
+ double exp;
+ char t_msg[128];
+ char *str_p = tmp_sql;
+ struct mmo_charstatus *cp;
+
+ memset(p, 0, sizeof(struct mmo_charstatus));
+ t_msg[0]= '\0';
+
+ p->char_id = char_id;
+ if (save_log)
+ ShowInfo("Char load request (%d)\n", char_id);
+ //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
+ //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
+ //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
+ //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
+ //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
+ //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
+ //splite 2 parts. cause veeeery long SQL syntax
+
+ sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
+ "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ if (!sql_row)
+ { //Just how does this happens? [Skotlex]
+ ShowError("Requested non-existant character id: %d!\n", char_id);
+ return 0;
+ }
+
+ p->char_id = char_id;
+ p->account_id = atoi(sql_row[1]);
+ p->char_num = atoi(sql_row[2]);
+ strcpy(p->name, sql_row[3]);
+ p->class_ = atoi(sql_row[4]);
+ p->base_level = atoi(sql_row[5]);
+ p->job_level = atoi(sql_row[6]);
+ exp = atof(sql_row[7]);
+ p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
+ exp = atof(sql_row[8]);
+ p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
+ p->zeny = atoi(sql_row[9]);
+ p->str = atoi(sql_row[10]);
+ p->agi = atoi(sql_row[11]);
+ p->vit = atoi(sql_row[12]);
+ p->int_ = atoi(sql_row[13]);
+ p->dex = atoi(sql_row[14]);
+ p->luk = atoi(sql_row[15]);
+ p->max_hp = atoi(sql_row[16]);
+ p->hp = atoi(sql_row[17]);
+ p->max_sp = atoi(sql_row[18]);
+ p->sp = atoi(sql_row[19]);
+ p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
+ p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
+ //free mysql result.
+ mysql_free_result(sql_res);
+ strcat (t_msg, " status");
+ } else
+ ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
+
+ sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`,"
+ "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,"
+ "`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id`, `father`, `mother`, `child`, `fame`, `homun_id`" //[orn] homun_id
+ "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
+ if (sql_row) {
+
+ p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
+ p->party_id = atoi(sql_row[3]); p->guild_id = atoi(sql_row[4]); p->pet_id = atoi(sql_row[5]);
+
+ p->hair = atoi(sql_row[6]); p->hair_color = atoi(sql_row[7]); p->clothes_color = atoi(sql_row[8]);
+ p->weapon = atoi(sql_row[9]); p->shield = atoi(sql_row[10]);
+ p->head_top = atoi(sql_row[11]); p->head_mid = atoi(sql_row[12]); p->head_bottom = atoi(sql_row[13]);
+ p->last_point.map = mapindex_name2id(sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
+ p->save_point.map = mapindex_name2id(sql_row[17]); p->save_point.x = atoi(sql_row[18]); p->save_point.y = atoi(sql_row[19]);
+ p->partner_id = atoi(sql_row[20]); p->father = atoi(sql_row[21]); p->mother = atoi(sql_row[22]); p->child = atoi(sql_row[23]);
+ p->fame = atoi(sql_row[24]);
+ p->hom_id = atoi(sql_row[25]); //[orn] homunculus id
+
+ strcat (t_msg, " status2");
+ } else
+ ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
+ //free mysql result.
+ if (sql_res)
+ mysql_free_result(sql_res);
+
+ //read memo data
+ //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
+ sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d' ORDER by `memo_id`",memo_db, char_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ p->memo_point[i].map = mapindex_name2id(sql_row[0]);
+ p->memo_point[i].x=atoi(sql_row[1]);
+ p->memo_point[i].y=atoi(sql_row[2]);
+ //i ++;
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " memo");
+ }
+
+ //read inventory
+ //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+
+ for (j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ p->inventory[i].id = atoi(sql_row[0]);
+ p->inventory[i].nameid = atoi(sql_row[1]);
+ p->inventory[i].amount = atoi(sql_row[2]);
+ p->inventory[i].equip = atoi(sql_row[3]);
+ p->inventory[i].identify = atoi(sql_row[4]);
+ p->inventory[i].refine = atoi(sql_row[5]);
+ p->inventory[i].attribute = atoi(sql_row[6]);
+ for (j=0; j<MAX_SLOTS; j++)
+ p->inventory[i].card[j] = atoi(sql_row[7+j]);
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " inventory");
+ }
+
+ //read cart.
+ //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ str_p = tmp_sql;
+ str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+
+ for (j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", cart_db, char_id);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ p->cart[i].id = atoi(sql_row[0]);
+ p->cart[i].nameid = atoi(sql_row[1]);
+ p->cart[i].amount = atoi(sql_row[2]);
+ p->cart[i].equip = atoi(sql_row[3]);
+ p->cart[i].identify = atoi(sql_row[4]);
+ p->cart[i].refine = atoi(sql_row[5]);
+ p->cart[i].attribute = atoi(sql_row[6]);
+ for(j=0; j<MAX_SLOTS; j++)
+ p->cart[i].card[j] = atoi(sql_row[7+j]);
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " cart");
+ }
+
+ //read skill
+ //`skill` (`char_id`, `id`, `lv`)
+ sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ n = atoi(sql_row[0]);
+ p->skill[n].id = n; //memory!? shit!.
+ p->skill[n].lv = atoi(sql_row[1]);
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " skills");
+ }
+/* Global-reg loading is now handled by the inter-server.
+ //global_reg
+ //`global_reg_value` (`char_id`, `str`, `value`)
+ sprintf(tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ i = 0;
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ strcpy (p->global_reg[i].str, sql_row[0]);
+ strcpy (p->global_reg[i].value, sql_row[1]);
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " reg_values");
+ }
+ p->global_reg_num=i;
+*/
+ //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
+ //Friend list
+ sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM `%s` f LEFT JOIN `%s` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", friend_db, char_db, char_id);
+
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ if(sql_res)
+ {
+ for(i = 0; (sql_row = mysql_fetch_row(sql_res)) && i<MAX_FRIENDS; i++)
+ {
+ if(sql_row) { //need to check if we have sql_row before we check if we have sql_row[2] because we don't want a segfault
+ if(sql_row[2]) {
+ p->friends[i].account_id = atoi(sql_row[0]);
+ p->friends[i].char_id = atoi(sql_row[1]);
+ strncpy(p->friends[i].name, sql_row[2], NAME_LENGTH-1); //The -1 is to avoid losing the ending \0 [Skotlex]
+ }
+ }
+ }
+ mysql_free_result(sql_res);
+ strcat (t_msg, " friends");
+ }
+
+ if (save_log)
+ ShowInfo("Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
+
+ cp = idb_ensure(char_db_, char_id, create_charstatus);
+ memcpy(cp, p, sizeof(struct mmo_charstatus));
+ return 1;
+}
+
+// For quick selection of data when displaying the char menu. [Skotlex]
+//
+int mmo_char_fromsql_short(int char_id, struct mmo_charstatus *p){
+ char t_msg[128];
+ double exp;
+ memset(p, 0, sizeof(struct mmo_charstatus));
+ t_msg[0]= '\0';
+
+ p->char_id = char_id;
+// ShowInfo("Quick Char load request (%d)\n", char_id);
+ //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
+ //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
+ //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
+ //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
+ //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
+ //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
+ //splite 2 parts. cause veeeery long SQL syntax
+
+ sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
+ "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ if (!sql_row)
+ { //Just how does this happens? [Skotlex]
+ ShowError("Requested non-existant character id: %d!\n", char_id);
+ mysql_free_result(sql_res);
+ return 0;
+ }
+ p->char_id = char_id;
+ p->account_id = atoi(sql_row[1]);
+ p->char_num = atoi(sql_row[2]);
+ strcpy(p->name, sql_row[3]);
+ p->class_ = atoi(sql_row[4]);
+ p->base_level = atoi(sql_row[5]);
+ p->job_level = atoi(sql_row[6]);
+ exp = atof(sql_row[7]);
+ p->base_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
+ exp = atof(sql_row[8]);
+ p->job_exp = exp<0?0:(exp>UINT_MAX?UINT_MAX:(unsigned int)exp);
+ p->zeny = atoi(sql_row[9]);
+ p->str = atoi(sql_row[10]);
+ p->agi = atoi(sql_row[11]);
+ p->vit = atoi(sql_row[12]);
+ p->int_ = atoi(sql_row[13]);
+ p->dex = atoi(sql_row[14]);
+ p->luk = atoi(sql_row[15]);
+ p->max_hp = atoi(sql_row[16]);
+ p->hp = atoi(sql_row[17]);
+ p->max_sp = atoi(sql_row[18]);
+ p->sp = atoi(sql_row[19]);
+ p->status_point = atoi(sql_row[20]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[20]);
+ p->skill_point = atoi(sql_row[21]) > USHRT_MAX ? USHRT_MAX : atoi(sql_row[21]);
+ //free mysql result.
+ mysql_free_result(sql_res);
+ strcat (t_msg, " status");
+ } else
+ ShowError("Load char failed (%d - table %s).\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
+
+ sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`hair`,`hair_color`,"
+ "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`"
+ "FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
+ if (sql_row) {
+
+ p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
+ p->hair = atoi(sql_row[3]); p->hair_color = atoi(sql_row[4]); p->clothes_color = atoi(sql_row[5]);
+ p->weapon = atoi(sql_row[6]); p->shield = atoi(sql_row[7]);
+ p->head_top = atoi(sql_row[8]); p->head_mid = atoi(sql_row[9]); p->head_bottom = atoi(sql_row[10]);
+
+ strcat (t_msg, " status2");
+ } else
+ ShowError("Char load failed (%d - table %s)\n", char_id, char_db); //Error?! ERRRRRR WHAT THAT SAY!?
+ //free mysql result.
+ if (sql_res)
+ mysql_free_result(sql_res);
+// if (save_log) //Too much spam :/
+// ShowInfo("Quick Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
+
+ return 1;
+}
+//==========================================================================================================
+int mmo_char_sql_init(void) {
+ ShowInfo("Begin Initializing.......\n");
+ char_db_= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA, sizeof(int));
+ // memory initialize
+ memset(&char_dat, 0, sizeof(struct mmo_charstatus));
+ if(char_per_account == 0){
+ ShowStatus("Chars per Account: 'Unlimited'.......\n");
+ }else{
+ ShowStatus("Chars per Account: '%d'.......\n", char_per_account);
+ }
+
+ //the 'set offline' part is now in check_login_conn ...
+ //if the server connects to loginserver
+ //it will dc all off players
+ //and send the loginserver the new state....
+
+ // Force all users offline in sql when starting char-server
+ // (useful when servers crashs and don't clean the database)
+ set_all_offline_sql();
+
+ ShowInfo("Finished initilizing.......\n");
+
+ return 0;
+}
+
+//==========================================================================================================
+
+int make_new_char_sql(int fd, unsigned char *dat) {
+ struct char_session_data *sd;
+ char name[NAME_LENGTH];
+ char t_name[NAME_LENGTH*2];
+ unsigned int i; // Used in for loop and comparing with strlen, safe to be unsigned. [Lance]
+ int char_id, temp;
+
+ strncpy(name, dat, NAME_LENGTH);
+ name[NAME_LENGTH-1] = '\0'; //Always terminate string.
+ trim(name,TRIM_CHARS); //Trim character name. [Skotlex]
+ jstrescapecpy(t_name, name);
+
+ // disabled until fixed >.>
+ // Note: escape characters should be added to jstrescape()!
+ //mysql_real_escape_string(&mysql_handle, t_name, t_name_temp, sizeof(t_name_temp));
+
+ if (!session_isValid(fd) || !(sd = (struct char_session_data*)session[fd]->session_data))
+ return -2;
+
+ ShowInfo("New character request (%d)\n", sd->account_id);
+
+ //check name != main chat nick [LuzZza]
+ if(strcmpi(name, main_chat_nick) == 0) {
+ ShowInfo("Create char failed (%d): this nick (%s) reserved for mainchat messages.\n", sd->account_id, name);
+ return -2;
+ }
+
+ //check for charcount (maxchars) :)
+ if(char_per_account != 0){
+ sprintf(tmp_sql, "SELECT `account_id` FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if(sql_res){
+ //ok
+ temp = (int)mysql_num_rows(sql_res);
+ if(temp >= char_per_account){
+ //hehe .. limit exceeded :P
+ ShowInfo("Create char failed (%d): charlimit exceeded.\n", sd->account_id);
+ mysql_free_result(sql_res);
+ return -2;
+ }
+ mysql_free_result(sql_res);
+ }
+ }
+
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL)
+ return -2;
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL)
+ return -2;
+ } // else, all letters/symbols are authorised (except control char removed before)
+
+ //check stat error
+ if ((dat[24]+dat[25]+dat[26]+dat[27]+dat[28]+dat[29]!=6*5 ) || // stats
+ (dat[30] >= 9) || // slots (dat[30] can not be negativ)
+ (dat[33] <= 0) || (dat[33] >= 24) || // hair style
+ (dat[31] >= 9)) { // hair color (dat[31] can not be negativ)
+ if (log_char) {
+ // char.log to charlog
+ sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
+ return -2;
+ } // for now we have checked: stat points used <31, char slot is less then 9, hair style/color values are acceptable
+
+ // check individual stat value
+ for(i = 24; i <= 29; i++) {
+ if (dat[i] < 1 || dat[i] > 9) {
+ if (log_char) {
+ // char.log to charlog
+ sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
+ return -2;
+ }
+ } // now we know that every stat has proper value but we have to check if str/int agi/luk vit/dex pairs are correct
+
+ if( ((dat[24]+dat[27]) > 10) || ((dat[25]+dat[29]) > 10) || ((dat[26]+dat[28]) > 10) ) {
+ if (log_char) {
+ // char.log to charlog
+ sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
+ return -2;
+ } // now when we have passed all stat checks
+
+ if (log_char) {
+ // char.log to charlog
+ sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db,"make new char", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ //printf("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d" RETCODE,
+ // fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+
+ //Check Name (already in use?)
+ sprintf(tmp_sql, "SELECT 1 FROM `%s` WHERE `name` = '%s'",char_db, t_name);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return -2;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if(sql_res){
+ temp = (int)mysql_num_rows(sql_res);
+ mysql_free_result(sql_res);
+ if (temp > 0) {
+ ShowInfo("Create char failed: charname already in use\n");
+ return -1;
+ }
+ }
+
+ // check char slot.
+ sprintf(tmp_sql, "SELECT `account_id`, `char_num` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if(sql_res){
+ temp = (int)mysql_num_rows(sql_res);
+ mysql_free_result(sql_res);
+ if (temp > 0) {
+ ShowWarning("Create char failed (%d, slot: %d), slot already in use\n", sd->account_id, dat[30]);
+ return -2;
+ }
+ }
+
+ //New Querys [Sirius]
+ //Insert the char to the 'chardb' ^^
+ sprintf(tmp_sql, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
+ "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
+ "'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
+ char_db, sd->account_id , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29],
+ (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31],
+ mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return -2; //No, stop the procedure!
+ }
+ //Now we need the charid from sql!
+ if(mysql_field_count(&mysql_handle) == 0 &&
+ mysql_insert_id(&mysql_handle) > 0)
+ char_id = (int)mysql_insert_id(&mysql_handle);
+ else {
+ //delete the char ..(no trash in DB!) but how is this possible?
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return -2; //XD end of the (World? :P) .. charcreate (denied)
+ }
+ //Give the char the default items
+ //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ if (start_weapon > 0) { //add Start Weapon (Knife?)
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_weapon,1,0x02,1);
+ if (mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ if (start_armor > 0) { //Add default armor (cotton shirt?)
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_armor,1,0x10,1);
+ if (mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ ShowInfo("Created char: account: %d, char: %d, slot: %d, name: %s\n", sd->account_id, char_id, dat[30], name);
+ return char_id;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+/* Delete char - davidsiaw */
+/*----------------------------------------------------------------------------------------------------------*/
+/* Returns 0 if successful
+ * Returns < 0 for error
+ */
+int delete_char_sql(int char_id, int partner_id)
+{
+ char char_name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Name needs be escaped.
+ int account_id=0, party_id=0, guild_id=0, char_base_level=0;
+
+ sprintf(tmp_sql, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level` FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if(sql_res)
+ sql_row = mysql_fetch_row(sql_res);
+
+ if (sql_res == NULL || sql_row == NULL)
+ {
+ ShowError("delete_char_sql: Unable to fetch character data, deletion aborted.\n");
+ if (sql_res)
+ mysql_free_result(sql_res);
+ return -1;
+ }
+ strncpy(char_name, sql_row[0], NAME_LENGTH);
+ char_name[NAME_LENGTH-1] = '\0';
+ jstrescapecpy(t_name, char_name); //Escape string for sql use... [Skotlex]
+ account_id = atoi(sql_row[1]);
+ party_id = atoi(sql_row[2]);
+ guild_id = atoi(sql_row[3]);
+ char_base_level = atoi(sql_row[4]);
+ mysql_free_result(sql_res); //Let's free this as soon as possible to avoid problems later on.
+
+ //check for config char del condition [Lupus]
+ if( ( char_del_level > 0 && char_base_level >= char_del_level )
+ || ( char_del_level < 0 && char_base_level <= -char_del_level )
+ ) {
+ ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n",char_name,char_base_level);
+ return -1;
+ }
+
+ /* Divorce [Wizputer] */
+ if (partner_id) {
+ sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,partner_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,partner_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ //Make the character leave the party [Skotlex]
+ if (party_id)
+ inter_party_leave(party_id, account_id, char_id);
+
+ /* delete char's pet */
+ //Delete the hatched pet if you have one...
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d' AND `incuvate` = '0'",pet_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ // Komurka's suggested way to clear pets, modified by [Skotlex] (because I always personalize what I do :X)
+ //Removing pets that are in the char's inventory....
+ { //NOTE: The syntax for multi-table deletes is a bit changed between 4.0 and 4.1 regarding aliases, so we have to consider the version... [Skotlex]
+ //Since we only care about the major and minor version, a double conversion is good enough. (4.1.20 -> 4.10000)
+ double mysql_version = atof(mysql_get_server_info(&mysql_handle));
+
+ sprintf(tmp_sql,
+ "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
+ (mysql_version<4.1?pet_db:"p"), char_db, inventory_db, pet_db, char_id);
+
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //Removing pets that are in the char's cart....
+ sprintf(tmp_sql,
+ "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
+ (mysql_version<4.1?pet_db:"p"), char_db, cart_db, pet_db, char_id);
+
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ /* delete char's friends list */
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'",friend_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete char from other's friend list */
+ //NOTE: Won't this cause problems for people who are already online? [Skotlex]
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `friend_id` = '%d'",friend_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete inventory */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete cart inventory */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete memo areas */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete character registry */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* delete skills */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+#ifdef ENABLE_SC_SAVING
+ /* status changes */
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
+ scdata_db, account_id, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+#endif
+
+ if (log_char) {
+ sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`char_msg`,`name`) VALUES (NOW(), '%d', '%d', 'Deleted char (CID %d)', '%s')",
+ charlog_db, account_id, 0, char_id, t_name);
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ /* delete character */
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ /* No need as we used inter_guild_leave [Skotlex]
+ // Also delete info from guildtables.
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ */
+
+ sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, t_name);
+
+ if (mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ } else {
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res == NULL) {
+ if (mysql_errno(&mysql_handle) != 0)
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return -1;
+ } else {
+ int rows = (int)mysql_num_rows(sql_res);
+ mysql_free_result(sql_res);
+ if (rows > 0) {
+ mapif_parse_BreakGuild(0,guild_id);
+ }
+ else if (guild_id) //Leave your guild.
+ inter_guild_leave(guild_id, account_id, char_id);
+ }
+ }
+ return 0;
+}
+
+//==========================================================================================================
+
+int count_users(void) {
+ int i, users;
+
+ if (login_fd > 0 && session[login_fd]){
+ users = 0;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] > 0) {
+ users += server[i].users;
+ }
+ }
+ return users;
+ }
+ return 0;
+}
+
+int mmo_char_send006b(int fd, struct char_session_data *sd) {
+ int i, j, found_num = 0;
+ struct mmo_charstatus *p = NULL;
+ const int offset = 24;
+ WFIFOHEAD(fd, offset +9*106);
+
+ set_char_online(-1, 99,sd->account_id);
+
+ //search char.
+ sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d'",char_db, sd->account_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ found_num = (int)mysql_num_rows(sql_res);
+// ShowInfo("number of chars: %d\n", found_num);
+ i = 0;
+ while((sql_row = mysql_fetch_row(sql_res))) {
+ sd->found_char[i] = atoi(sql_row[0]);
+ i++;
+ }
+ mysql_free_result(sql_res);
+ }
+
+ for(i = found_num; i < 9; i++)
+ sd->found_char[i] = -1;
+
+ memset(WFIFOP(fd, 0), 0, offset + found_num * 106);
+ WFIFOW(fd, 0) = 0x6b;
+ WFIFOW(fd, 2) = offset + found_num * 106;
+
+ if (save_log)
+ ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id);
+
+ for(i = 0; i < found_num; i++) {
+ mmo_char_fromsql_short(sd->found_char[i], &char_dat);
+
+ p = &char_dat;
+
+ j = offset + (i * 106); // increase speed of code
+
+ WFIFOL(fd,j) = p->char_id;
+ WFIFOL(fd,j+4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
+ WFIFOL(fd,j+8) = p->zeny;
+ WFIFOL(fd,j+12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
+ WFIFOL(fd,j+16) = p->job_level;
+
+ WFIFOL(fd,j+20) = 0;
+ WFIFOL(fd,j+24) = 0;
+ WFIFOL(fd,j+28) = p->option;
+
+ WFIFOL(fd,j+32) = p->karma;
+ WFIFOL(fd,j+36) = p->manner;
+
+ WFIFOW(fd,j+40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point;
+ WFIFOW(fd,j+42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
+ WFIFOW(fd,j+44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
+ WFIFOW(fd,j+46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
+ WFIFOW(fd,j+48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
+ WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
+ WFIFOW(fd,j+52) = p->class_;
+ WFIFOW(fd,j+54) = p->hair;
+ WFIFOW(fd,j+56) = p->option&0x20?0:p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
+ WFIFOW(fd,j+58) = p->base_level;
+ WFIFOW(fd,j+60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point;
+ WFIFOW(fd,j+62) = p->head_bottom;
+ WFIFOW(fd,j+64) = p->shield;
+ WFIFOW(fd,j+66) = p->head_top;
+ WFIFOW(fd,j+68) = p->head_mid;
+ WFIFOW(fd,j+70) = p->hair_color;
+ WFIFOW(fd,j+72) = p->clothes_color;
+
+ memcpy(WFIFOP(fd,j+74), p->name, NAME_LENGTH);
+
+ WFIFOB(fd,j+98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
+ WFIFOB(fd,j+99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
+ WFIFOB(fd,j+100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
+ WFIFOB(fd,j+101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
+ WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
+ WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
+ WFIFOB(fd,j+104) = p->char_num;
+ }
+
+ WFIFOSET(fd,WFIFOW(fd,2));
+// printf("mmo_char_send006b end..\n");
+ return 0;
+}
+
+int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
+
+int parse_tologin(int fd) {
+ int i;
+ struct char_session_data *sd;
+ RFIFOHEAD(fd);
+ // only login-server can have an access to here.
+ // so, if it isn't the login-server, we disconnect the session.
+ //session eof check!
+ if(fd != login_fd)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (fd == login_fd) {
+ ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
+ login_fd = -1;
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ // hehe. no need to set user limit on SQL version. :P
+ // but char limitation is good way to maintain server. :D
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
+
+ switch(RFIFOW(fd, 0)){
+ case 0x2711:
+ if (RFIFOREST(fd) < 3)
+ return 0;
+ if (RFIFOB(fd, 2)) {
+ //printf("connect login server error : %d\n", RFIFOB(fd, 2));
+ ShowError("Can not connect to login-server.\n");
+ ShowError("The server communication passwords (default s1/p1) are probably invalid.\n");
+ ShowError("Also, please make sure your login db has the correct coounication username/passwords and the gender of the account is S.\n");
+ ShowError("The communication passwords are set in map_athena.conf and char_athena.conf\n");
+ return 0;
+ //exit(1); //fixed for server shutdown.
+ }else {
+ ShowStatus("Connected to login-server (connection #%d).\n", fd);
+
+ //Send online accounts to login server.
+ send_accounts_tologin(-1, gettick(), 0, 0);
+
+ // if no map-server already connected, display a message...
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] > 0 && server[i].map[0]) // if map-server online and at least 1 map
+ break;
+ if (i == MAX_MAP_SERVERS)
+ ShowStatus("Awaiting maps from map-server.\n");
+ }
+ RFIFOSKIP(fd, 3);
+ break;
+
+ case 0x2713:
+ if(RFIFOREST(fd)<51)
+ return 0;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
+ WFIFOHEAD(i,3);
+ if (RFIFOB(fd,6) != 0) {
+ WFIFOW(i,0) = 0x6c;
+ WFIFOB(i,2) = 0x42;
+ WFIFOSET(i,3);
+ } else if (max_connect_user == 0 || count_users() < max_connect_user) {
+// if (max_connect_user == 0)
+// printf("max_connect_user (unlimited) -> accepted.\n");
+// else
+// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
+ sd->connect_until_time = (time_t)RFIFOL(fd,47);
+ memcpy(sd->email, RFIFOP(fd, 7), 40);
+ // send characters to player
+ mmo_char_send006b(i, sd);
+ } else if(isGM(sd->account_id) >= gm_allow_level) {
+ sd->connect_until_time = (time_t)RFIFOL(fd,47);
+ memcpy(sd->email, RFIFOP(fd, 7), 40);
+ // send characters to player
+ mmo_char_send006b(i, sd);
+ } else {
+ // refuse connection: too much online players
+// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
+ WFIFOW(i,0) = 0x6c;
+ WFIFOW(i,2) = 0;
+ WFIFOSET(i,3);
+ }
+ }
+ }
+ RFIFOSKIP(fd,51);
+ break;
+
+ case 0x2717:
+ if (RFIFOREST(fd) < 50)
+ return 0;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
+ if (sd->account_id == RFIFOL(fd,2)) {
+ memcpy(sd->email, RFIFOP(fd, 6), 40);
+ sd->connect_until_time = (time_t)RFIFOL(fd,46);
+ break;
+ }
+ }
+ }
+ RFIFOSKIP(fd,50);
+ break;
+
+ // login-server alive packet
+ case 0x2718:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ RFIFOSKIP(fd,2);
+ break;
+
+ // Receiving authentification from Freya-type login server (to avoid char->login->char)
+ case 0x2719:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ // to conserv a maximum of authentification, search if account is already authentified and replace it
+ // that will reduce multiple connection too
+ for(i = 0; i < AUTH_FIFO_SIZE; i++)
+ if (auth_fifo[i].account_id == RFIFOL(fd,2))
+ break;
+ // if not found, use next value
+ if (i == AUTH_FIFO_SIZE) {
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ i = auth_fifo_pos;
+ auth_fifo_pos++;
+ }
+ //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[i].account_id = RFIFOL(fd,2);
+ auth_fifo[i].char_id = 0;
+ auth_fifo[i].login_id1 = RFIFOL(fd,6);
+ auth_fifo[i].login_id2 = RFIFOL(fd,10);
+ auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
+ auth_fifo[i].char_pos = 0;
+ auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[i].ip = RFIFOL(fd,14);
+ //auth_fifo[i].map_auth = 0;
+ RFIFOSKIP(fd,18);
+ break;
+
+ case 0x2721: // gm reply. I don't want to support this function.
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ RFIFOSKIP(fd, 10);
+/* Note that this is the code from char-txt! Even uncommenting it will not work.
+ printf("0x2721:GM reply\n");
+ {
+ int oldacc, newacc;
+ unsigned char buf[64];
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ oldacc = RFIFOL(fd, 2);
+ newacc = RFIFOL(fd, 6);
+ RFIFOSKIP(fd, 10);
+ if (newacc > 0) {
+ for(i=0;i<char_num;i++){
+ if(char_dat[i].account_id==oldacc)
+ char_dat[i].account_id=newacc;
+ }
+ }
+ WBUFW(buf,0)=0x2b0b;
+ WBUFL(buf,2)=oldacc;
+ WBUFL(buf,6)=newacc;
+ mapif_sendall(buf,10);
+// printf("char -> map\n");
+ }
+*/
+ break;
+ case 0x2723: // changesex reply (modified by [Yor])
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ int acc, sex;
+ unsigned char buf[16];
+ MYSQL_RES* sql_res2;
+ acc = RFIFOL(fd,2);
+ sex = RFIFOB(fd,6);
+ RFIFOSKIP(fd, 7);
+ if (acc > 0) {
+ sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point`,`guild_id` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res2 = mysql_store_result(&mysql_handle);
+
+ while(sql_res2 && (sql_row = mysql_fetch_row(sql_res2))) {
+ int char_id, guild_id, jobclass, skill_point, class_;
+ char_id = atoi(sql_row[0]);
+ jobclass = atoi(sql_row[1]);
+ skill_point = atoi(sql_row[2]);
+ guild_id = atoi(sql_row[3]);
+ class_ = jobclass;
+ if (jobclass == JOB_BARD || jobclass == JOB_DANCER ||
+ jobclass == JOB_CLOWN || jobclass == JOB_GYPSY ||
+ jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
+ // job modification
+ if (jobclass == JOB_BARD || jobclass == JOB_DANCER) {
+ class_ = (sex) ? JOB_BARD : JOB_DANCER;
+ } else if (jobclass == JOB_CLOWN || jobclass == JOB_GYPSY) {
+ class_ = (sex) ? JOB_CLOWN : JOB_GYPSY;
+ } else if (jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
+ class_ = (sex) ? JOB_BABY_BARD : JOB_BABY_DANCER;
+ }
+ // remove specifical skills of classes 19,20 4020,4021 and 4042,4043
+ sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ while(( sql_row = mysql_fetch_row(sql_res))) {
+ skill_point += atoi(sql_row[0]);
+ }
+ mysql_free_result(sql_res);
+ }
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ // to avoid any problem with equipment and invalid sex, equipment is unequiped.
+ sprintf(tmp_sql, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'",inventory_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield`='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class_, skill_point, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ if (guild_id) //If there is a guild, update the guild_member data [Skotlex]
+ inter_guild_sex_changed(guild_id, acc, char_id, sex);
+ }
+ if (sql_res2)
+ mysql_free_result(sql_res2);
+ }
+ // disconnect player if online on char-server
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
+ if (sd->account_id == acc) {
+ session[i]->eof = 1;
+ break;
+ }
+ }
+ }
+
+ WBUFW(buf,0) = 0x2b0d;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+
+ mapif_sendall(buf, 7);
+ }
+ break;
+
+ // account_reg2•ÏX’Ê’m
+ case 0x2729:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ { //Receive account_reg2 registry, forward to map servers.
+ unsigned char buf[ACCOUNT_REG2_NUM*(256+32+2)+16];
+ memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
+// WBUFW(buf,0) = 0x2b11;
+ WBUFW(buf,0) = 0x3804; //Map server can now receive all kinds of reg values with the same packet. [Skotlex]
+ mapif_sendall(buf, WBUFW(buf,2));
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ }
+ break;
+
+ // State change of account/ban notification (from login-server) by [Yor]
+ case 0x2731:
+ if (RFIFOREST(fd) < 11)
+ return 0;
+ // send to all map-servers to disconnect the player
+ {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2b14;
+ WBUFL(buf,2) = RFIFOL(fd,2);
+ WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
+ WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
+ mapif_sendall(buf, 11);
+ }
+ // disconnect player if online on char-server
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
+ if (sd->account_id == RFIFOL(fd,2)) {
+ session[i]->eof = 1;
+ break;
+ }
+ }
+ }
+ RFIFOSKIP(fd,11);
+ break;
+
+ case 0x2732:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if(!char_gm_read) {
+ unsigned char buf[32000];
+ if (gm_account != NULL)
+ aFree(gm_account);
+ gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
+ GM_num = 0;
+ for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
+ gm_account[GM_num].account_id = RFIFOL(fd,i);
+ gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
+ //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
+ GM_num++;
+ }
+ ShowStatus("From login-server: receiving information of %d GM accounts.\n", GM_num);
+ // send new gm acccounts level to map-servers
+ memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf,0) = 0x2b15;
+ mapif_sendall(buf, RFIFOW(fd,2));
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // Receive GM accounts [Freya login server packet by Yor]
+ case 0x2733:
+ // add test here to remember that the login-server is Freya-type
+ // sprintf (login_server_type, "Freya");
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ int new_level = 0;
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == RFIFOL(fd,2)) {
+ if (gm_account[i].level != (int)RFIFOB(fd,6)) {
+ gm_account[i].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ }
+ break;
+ }
+ // if not found, add it
+ if (i == GM_num) {
+ // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
+ // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
+ if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
+ if (GM_num == 0) {
+ gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
+ } else {
+ gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
+ }
+ gm_account[GM_num].account_id = RFIFOL(fd,2);
+ gm_account[GM_num].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ GM_num++;
+ if (GM_num >= 4000)
+ ShowWarning("4000 GM accounts found. Next GM accounts are not readed.\n");
+ }
+ }
+ if (new_level == 1) {
+ ShowStatus("From login-server: receiving GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ mapif_send_gmaccounts();
+
+ //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
+ // send gm acccounts level to map-servers
+ }
+ }
+ RFIFOSKIP(fd,7);
+ break;
+
+ //Login server request to kick a character out. [Skotlex]
+ case 0x2734:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ struct online_char_data* character;
+ int aid = RFIFOL(fd,2);
+ if ((character = idb_get(online_char_db, aid)) != NULL)
+ { //Kick out this player.
+ if (character->server > -1)
+ { //Kick it from the map server it is on.
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ if (!character->waiting_disconnect)
+ add_timer(gettick()+15000, chardb_waiting_disconnect, character->account_id, 0);
+ character->waiting_disconnect = 1;
+ } else { //Manual kick from char server.
+ struct char_session_data *tsd;
+ int i;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == aid)
+ {
+ WFIFOHEAD(i,3);
+ WFIFOW(i,0) = 0x81;
+ WFIFOB(i,2) = 2;
+ WFIFOSET(i,3);
+ break;
+ }
+ }
+ if (i == fd_max) //Shouldn't happen, but just in case.
+ set_char_offline(99, aid);
+ }
+ }
+ RFIFOSKIP(fd,6);
+ }
+ break;
+
+ case 0x2735:
+ {
+ unsigned char buf[2];
+ in_addr_t new_ip = 0;
+ RFIFOSKIP(fd,2);
+
+ WBUFW(buf,0) = 0x2b1e;
+ mapif_sendall(buf, 2);
+
+ new_ip = resolve_hostbyname(login_ip_str, NULL, NULL);
+ if (new_ip && new_ip != login_ip) //Update login ip, too.
+ login_ip = new_ip;
+
+ new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
+ if (new_ip && new_ip != char_ip)
+ { //Update ip.
+ char_ip = new_ip;
+ ShowInfo("Updating IP for [%s].\n",char_ip_str);
+ WFIFOHEAD(fd,6);
+ WFIFOW(fd,0) = 0x2736;
+ WFIFOL(fd,2) = char_ip;
+ WFIFOSET(fd,6);
+ }
+ break;
+ }
+ default:
+ ShowError("Unknown packet 0x%04x from login server, disconnecting.\n", RFIFOW(fd, 0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ RFIFOFLUSH(fd);
+
+ return 0;
+}
+
+int request_accreg2(int account_id, int char_id) {
+ if (login_fd > 0) {
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd, 0) = 0x272e;
+ WFIFOL(login_fd, 2) = account_id;
+ WFIFOL(login_fd, 6) = char_id;
+ WFIFOSET(login_fd, 10);
+ return 1;
+ }
+ return 0;
+}
+//Send packet forward to login-server for account saving
+int save_accreg2(unsigned char* buf, int len) {
+ if (login_fd > 0) {
+ WFIFOHEAD(login_fd, len+4);
+ memcpy(WFIFOP(login_fd,4), buf, len);
+ WFIFOW(login_fd,0) = 0x2728;
+ WFIFOW(login_fd,2) = len+4;
+ WFIFOSET(login_fd,len+4);
+ return 1;
+ }
+ return 0;
+}
+
+void char_read_fame_list(void)
+{
+ int i;
+ struct fame_list fame_item;
+
+ // Empty ranking lists
+ memset(smith_fame_list, 0, sizeof(smith_fame_list));
+ memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
+ memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
+ // Build Blacksmith ranking list
+ sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, fame_list_size_smith);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ i = 0;
+ while((sql_row = mysql_fetch_row(sql_res))) {
+ fame_item.id = atoi(sql_row[0]);
+ fame_item.fame = atoi(sql_row[1]);
+ strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
+ memcpy(&smith_fame_list[i], &fame_item, sizeof(struct fame_list));
+
+ if (++i == fame_list_size_smith)
+ break;
+ }
+ mysql_free_result(sql_res);
+ }
+ // Build Alchemist ranking list
+ sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, fame_list_size_chemist);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ i = 0;
+ while((sql_row = mysql_fetch_row(sql_res))) {
+ fame_item.id = atoi(sql_row[0]);
+ fame_item.fame = atoi(sql_row[1]);
+ strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
+
+ memcpy(&chemist_fame_list[i], &fame_item, sizeof(struct fame_list));
+
+ if (++i == fame_list_size_chemist)
+ break;
+ }
+ mysql_free_result(sql_res);
+ }
+ // Build Taekwon ranking list
+ sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_TAEKWON, fame_list_size_taekwon);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ i = 0;
+ while((sql_row = mysql_fetch_row(sql_res))) {
+ fame_item.id = atoi(sql_row[0]);
+ fame_item.fame = atoi(sql_row[1]);
+ strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
+
+ memcpy(&taekwon_fame_list[i], &fame_item, sizeof(struct fame_list));
+
+ if (++i == fame_list_size_taekwon)
+ break;
+ }
+ mysql_free_result(sql_res);
+ }
+}
+
+// Send map-servers the fame ranking lists
+int char_send_fame_list(int fd) {
+ int i, len = 8;
+ unsigned char buf[32000];
+
+ WBUFW(buf,0) = 0x2b1b;
+
+ for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add blacksmith's block length
+ WBUFW(buf, 6) = len;
+
+ for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add alchemist's block length
+ WBUFW(buf, 4) = len;
+
+ for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ // add total packet length
+ WBUFW(buf, 2) = len;
+
+ if (fd != -1)
+ mapif_send(fd, buf, len);
+ else
+ mapif_sendall(buf, len);
+ return 0;
+}
+
+int search_mapserver(unsigned short map, long ip, short port);
+
+//Loads a character's name and stores it in the buffer given (must be NAME_LENGTH in size)
+//Returns 1 on found, 0 on not found (buffer is filled with Unknown char name)
+int char_loadName(int char_id, char* name)
+{
+ sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
+
+ if (sql_row)
+ memcpy(name, sql_row[0], NAME_LENGTH);
+ else
+ memcpy(name, unknown_char_name, NAME_LENGTH);
+ if (sql_res) mysql_free_result(sql_res);
+ return sql_row?1:0;
+}
+
+
+int parse_frommap(int fd) {
+ int i = 0, j = 0;
+ int id;
+ RFIFOHEAD(fd);
+
+ // Sometimes fd=0, and it will cause server crash. Don't know why. :(
+ if (fd <= 0) {
+ ShowError("parse_frommap error fd=%d\n", fd);
+ return 0;
+ }
+
+ for(id = 0; id < MAX_MAP_SERVERS; id++)
+ if (server_fd[id] == fd)
+ break;
+ if(id == MAX_MAP_SERVERS)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (id < MAX_MAP_SERVERS) {
+ unsigned char buf[16384];
+ ShowStatus("Map-server %d (session #%d) has disconnected.\n", id, fd);
+ //Notify other map servers that this one is gone. [Skotlex]
+ WBUFW(buf,0) = 0x2b20;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ j = 0;
+ for(i = 0; i < MAX_MAP_PER_SERVER; i++)
+ if (server[id].map[i])
+ WBUFW(buf,10+(j++)*4) = server[id].map[i];
+ if (j > 0) {
+ WBUFW(buf,2) = j * 4 + 10;
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+ }
+ memset(&server[id], 0, sizeof(struct mmo_map_server));
+ sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ server_fd[id] = -1;
+ online_char_db->foreach(online_char_db,char_db_setoffline,id); //Tag relevant chars as 'in disconnected' server.
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+ switch(RFIFOW(fd, 0)) {
+
+ // map-server alive packet
+ case 0x2718:
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x2af7:
+ RFIFOSKIP(fd,2);
+ if(char_gm_read) //Re-read gm accounts.
+ read_gm_account();
+ //Send to login request to reload gm accounts.
+ else if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 2);
+ WFIFOW(login_fd,0) = 0x2709;
+ WFIFOSET(login_fd, 2);
+ }
+ break;
+
+ // mapserver -> map names recv.
+ case 0x2afa:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ unsigned char *p = (unsigned char *)&server[id].ip;
+ unsigned char buf[16384];
+ int x;
+ WFIFOHEAD(fd,3+NAME_LENGTH);
+
+ memset(server[id].map, 0, sizeof(server[id].map));
+ j = 0;
+ for(i = 4; i < RFIFOW(fd,2); i += 4) {
+ server[id].map[j] = RFIFOW(fd,i);
+ j++;
+ }
+
+ ShowStatus("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
+ id, j, p[0], p[1], p[2], p[3], server[id].port);
+ ShowStatus("Map-server %d loading complete.\n", id);
+
+ if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
+ mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
+
+ WFIFOW(fd,0) = 0x2afb;
+ WFIFOB(fd,2) = 0;
+ // name for wisp to player
+ memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH);
+ WFIFOSET(fd,3+NAME_LENGTH);
+
+ char_send_fame_list(fd); //Send fame list.
+
+ if (j == 0)
+ ShowWarning("Map-Server %d have NO maps.\n", id);
+ else {
+ // Transmitting maps information to the other map-servers
+ WBUFW(buf,0) = 0x2b04;
+ WBUFW(buf,2) = j * 4 + 10;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 4);
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+ }
+ // Transmitting the maps of the other map-servers to the new map-server
+ for(x = 0; x < MAX_MAP_SERVERS; x++) {
+ if (server_fd[x] > 0 && x != id) {
+ WFIFOHEAD(fd, 10 +4*MAX_MAP_PER_SERVER);
+ WFIFOW(fd,0) = 0x2b04;
+ WFIFOL(fd,4) = server[x].ip;
+ WFIFOW(fd,8) = server[x].port;
+ j = 0;
+ for(i = 0; i < MAX_MAP_PER_SERVER; i++)
+ if (server[x].map[i])
+ WFIFOW(fd,10+(j++)*4) = server[x].map[i];
+ if (j > 0) {
+ WFIFOW(fd,2) = j * 4 + 10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ }
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ }
+ break;
+ //Packet command is now used for sc_data request. [Skotlex]
+ case 0x2afc:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int aid, cid;
+ aid = RFIFOL(fd,2);
+ cid = RFIFOL(fd,6);
+ RFIFOSKIP(fd, 10);
+#ifdef ENABLE_SC_SAVING
+ sprintf(tmp_sql, "SELECT type, tick, val1, val2, val3, val4 from `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
+ scdata_db, aid, cid);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ break;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ struct status_change_data data;
+ int count = 0;
+ WFIFOHEAD(fd, 14+50*sizeof(struct status_change_data));
+ WFIFOW(fd, 0) = 0x2b1d;
+ WFIFOL(fd, 4) = aid;
+ WFIFOL(fd, 8) = cid;
+ while((sql_row = mysql_fetch_row(sql_res)) && count < 50)
+ {
+ data.type = atoi(sql_row[0]);
+ data.tick = atoi(sql_row[1]);
+ data.val1 = atoi(sql_row[2]);
+ data.val2 = atoi(sql_row[3]);
+ data.val3 = atoi(sql_row[4]);
+ data.val4 = atoi(sql_row[5]);
+ memcpy(WFIFOP(fd, 14+count*sizeof(struct status_change_data)), &data, sizeof(struct status_change_data));
+ count++;
+ }
+ if (count >= 50)
+ ShowWarning("Too many status changes for %d:%d, some of them were not loaded.\n", aid, cid);
+ mysql_free_result(sql_res);
+ if (count > 0)
+ {
+ WFIFOW(fd, 2) = 14 + count*sizeof(struct status_change_data);
+ WFIFOW(fd, 12) = count;
+ WFIFOSET(fd, WFIFOW(fd,2));
+
+ //Clear the data once loaded.
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+#endif
+ break;
+ }
+ //set MAP user count
+ case 0x2afe:
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ if (RFIFOW(fd,2) != server[id].users) {
+ server[id].users = RFIFOW(fd,2);
+ ShowInfo("User Count: %d (Server: %d)\n", server[id].users, id);
+ }
+ RFIFOSKIP(fd, 4);
+ break;
+ // set MAP user
+ case 0x2aff:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ //TODO: When data mismatches memory, update guild/party online/offline states.
+ int i, aid, cid;
+ struct online_char_data* character;
+
+ online_char_db->foreach(online_char_db,char_db_setoffline,id); //Set all chars from this server as 'unknown'
+ server[id].users = RFIFOW(fd,4);
+ for(i = 0; i < server[id].users; i++) {
+ aid = RFIFOL(fd,6+i*8);
+ cid = RFIFOL(fd,6+i*8+4);
+ character = idb_ensure(online_char_db, aid, create_online_char_data);
+ if (character->server > -1 && character->server != id)
+ {
+ ShowNotice("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n",
+ character->account_id, character->char_id, character->server, id, aid, cid);
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ }
+ character->server = id;
+ character->char_id = cid;
+ }
+ //If any chars remain in -2, they will be cleaned in the cleanup timer.
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+ }
+ // char saving
+ case 0x2b01:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8), size = RFIFOW(fd,2);
+ struct online_char_data* character;
+ if (size - 13 != sizeof(struct mmo_charstatus))
+ {
+ ShowError("parse_from_map (save-char): Size mismatch! %d != %d\n", size-13, sizeof(struct mmo_charstatus));
+ RFIFOSKIP(fd,size);
+ break;
+ }
+ //Check account only if this ain't final save. Final-save goes through because of the char-map reconnect
+ if (RFIFOB(fd,12) || (
+ (character = idb_get(online_char_db, aid)) != NULL &&
+ character->char_id == cid))
+ {
+ memcpy(&char_dat, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
+ mmo_char_tosql(cid, &char_dat);
+ } else { //This may be valid on char-server reconnection, when re-sending characters that already logged off.
+ ShowError("parse_from_map (save-char): Received data for non-existant/offline character (%d:%d).\n", aid, cid);
+ set_char_online(id, cid, aid);
+ }
+
+ if (RFIFOB(fd,12))
+ { //Flag? Set character offline after saving [Skotlex]
+ set_char_offline(cid, aid);
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd, 0) = 0x2b21; //Save ack only needed on final save.
+ WFIFOL(fd, 2) = aid;
+ WFIFOL(fd, 6) = cid;
+ WFIFOSET(fd, 10);
+ }
+ RFIFOSKIP(fd,size);
+ break;
+ }
+ // req char selection
+ case 0x2b02:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
+ auth_fifo[auth_fifo_pos].char_id = 0;
+ auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6);
+ auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
+ auth_fifo[auth_fifo_pos].delflag = 2;
+ auth_fifo[auth_fifo_pos].char_pos = 0;
+ auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
+ auth_fifo_pos++;
+ {
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd, 0) = 0x2b03;
+ WFIFOL(fd, 2) = RFIFOL(fd, 2);
+ WFIFOB(fd, 6) = 0;
+ WFIFOSET(fd, 7);
+ }
+ RFIFOSKIP(fd, 18);
+ break;
+
+ // request "change map server"
+ case 0x2b05:
+ if (RFIFOREST(fd) < 35)
+ return 0;
+ {
+ unsigned short name;
+ int map_id, map_fd = -1;
+ struct online_char_data* data;
+ struct mmo_charstatus* char_data;
+ name = RFIFOW(fd,18);
+ map_id = search_mapserver(name, RFIFOL(fd,24), RFIFOW(fd,28)); //Locate mapserver by ip and port.
+ if (map_id >= 0)
+ map_fd = server_fd[map_id];
+ //Char should just had been saved before this packet, so this should be safe. [Skotlex]
+ char_data = uidb_get(char_db_,RFIFOL(fd,14));
+ if (char_data == NULL)
+ { //Really shouldn't happen.
+ mmo_char_fromsql(RFIFOL(fd,14), &char_dat);
+ char_data = &char_dat;
+ }
+ //Tell the new map server about this player using Kevin's new auth packet. [Skotlex]
+ if (map_fd>=0 && session[map_fd] && char_data)
+ { //Send the map server the auth of this player.
+ //Update the "last map" as this is where the player must be spawned on the new map server.
+ WFIFOHEAD(fd, 30);
+ WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
+ char_data->last_point.map = RFIFOW(fd,18);
+ char_data->last_point.x = RFIFOW(fd,20);
+ char_data->last_point.y = RFIFOW(fd,22);
+ char_data->sex = RFIFOB(fd,30); // Buuyo^
+
+ WFIFOW(map_fd,0) = 0x2afd;
+ WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
+ WFIFOL(map_fd,4) = RFIFOL(fd, 2); //Account ID
+ WFIFOL(map_fd,8) = RFIFOL(fd, 6); //Login1
+ WFIFOL(map_fd,16) = RFIFOL(fd,10); //Login2
+ WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
+ memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
+ WFIFOSET(map_fd, WFIFOW(map_fd,2));
+ data = idb_ensure(online_char_db, RFIFOL(fd, 2), create_online_char_data);
+ data->char_id = char_data->char_id;
+ data->server = map_id; //Update server where char is.
+
+ //Reply with an ack.
+ WFIFOW(fd, 0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
+ WFIFOSET(fd, 30);
+ } else { //Reply with nak
+ WFIFOHEAD(fd, 30);
+ WFIFOW(fd, 0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 28);
+ WFIFOL(fd, 6) = 0; //Set login1 to 0.
+ WFIFOSET(fd, 30);
+ }
+ RFIFOSKIP(fd, 35);
+ }
+ break;
+
+ // char name check
+ case 0x2b08:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ char name[NAME_LENGTH];
+ WFIFOHEAD(fd,30);
+ char_loadName((int)RFIFOL(fd,2), name);
+ WFIFOW(fd,0) = 0x2b09;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ memcpy(WFIFOP(fd,6), name, NAME_LENGTH);
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,6);
+ }
+ break;
+
+ // I want become GM - fuck!
+ case 0x2b0a:
+ if(RFIFOREST(fd)<4)
+ return 0;
+ if(RFIFOREST(fd)<RFIFOW(fd,2))
+ return 0;
+ /*
+ memcpy(WFIFOP(login_fd,2),RFIFOP(fd,2),RFIFOW(fd,2)-2);
+ WFIFOW(login_fd,0)=0x2720;
+ WFIFOSET(login_fd,RFIFOW(fd,2));
+// printf("char : change gm -> login %d %s %d\n", RFIFOL(fd, 4), RFIFOP(fd, 8), RFIFOW(fd, 2));
+ */
+ ShowWarning("packet 0x2ba (become GM) is not supported by the Char-Server.\n");
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ break;
+
+ // Map server send information to change an email of an account -> login-server
+ case 0x2b0c:
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 86);
+ memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
+ WFIFOW(login_fd,0) = 0x2722;
+ WFIFOSET(login_fd, 86);
+ }
+ RFIFOSKIP(fd, 86);
+ break;
+
+ // Receiving from map-server a status change resquest. Transmission to login-server (by Yor)
+ case 0x2b0e:
+ if (RFIFOREST(fd) < 44)
+ return 0;
+ {
+ char character_name[NAME_LENGTH], t_name[NAME_LENGTH*2];
+ int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
+ WFIFOHEAD(fd, 34);
+ memcpy(character_name, RFIFOP(fd,6), NAME_LENGTH);
+ character_name[NAME_LENGTH-1] = '\0';
+ jstrescapecpy(t_name, character_name); //Escape string for sql use... [Skotlex]
+ // prepare answer
+ WFIFOW(fd,0) = 0x2b0f; // answer
+ WFIFOL(fd,2) = acc; // who want do operation
+ WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban
+ sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, t_name);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ if (mysql_num_rows(sql_res)) {
+ sql_row = mysql_fetch_row(sql_res);
+ memcpy(WFIFOP(fd,6), sql_row[1], NAME_LENGTH); // put correct name if found
+ WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ switch(RFIFOW(fd, 30)) {
+ case 1: // block
+ if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
+ WFIFOL(login_fd,6) = 5; // status of the account
+ WFIFOSET(login_fd, 10);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 2: // ban
+ if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 18);
+ WFIFOW(login_fd, 0) = 0x2725;
+ WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
+ WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
+ WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
+ WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
+ WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
+ WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
+ WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
+ WFIFOSET(login_fd,18);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 3: // unblock
+ if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
+ WFIFOL(login_fd,6) = 0; // status of the account
+ WFIFOSET(login_fd, 10);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 4: // unban
+ if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd, 0) = 0x272a;
+ WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
+ WFIFOSET(login_fd, 6);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 5: // changesex
+ if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd, 0) = 0x2727;
+ WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
+ WFIFOSET(login_fd, 6);
+ } else
+ WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ }
+ } else {
+ // character name not found
+ memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
+ WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
+ }
+ // send answer if a player ask, not if the server ask
+ if (acc != -1) {
+ WFIFOSET(fd, 34);
+ }
+ mysql_free_result(sql_res);
+ }
+ }
+ RFIFOSKIP(fd, 44);
+ break;
+
+// case 0x2b0f: Not used anymore, available for future use
+
+ // Update and send fame ranking list [DracoRPG]
+ case 0x2b10:
+ if (RFIFOREST(fd) < 12)
+ return 0;
+ {
+ int cid = RFIFOL(fd, 2);
+ int fame = RFIFOL(fd, 6);
+ char type = RFIFOB(fd, 10);
+ char pos = RFIFOB(fd, 11);
+ int size = 0;
+ struct fame_list *list = NULL;
+ RFIFOSKIP(fd,12);
+
+ switch(type) {
+ case 1:
+ size = fame_list_size_smith;
+ list = smith_fame_list;
+ break;
+ case 2:
+ size = fame_list_size_chemist;
+ list = chemist_fame_list;
+ break;
+ case 3:
+ size = fame_list_size_taekwon;
+ list = taekwon_fame_list;
+ break;
+ }
+ if(!size) break; //No list.
+ if(pos)
+ {
+ pos--; //Convert from pos to index.
+ if(
+ (pos == 0 || fame < list[pos-1].fame) &&
+ (pos == size-1 || fame > list[pos+1].fame)
+ ) { //No change in order.
+ list[(int)pos].fame = fame;
+ char_send_fame_list(fd);
+ break;
+ }
+ // If the player's already in the list, remove the entry and shift the following ones 1 step up
+ memmove(list+pos, list+pos+1, (size-pos-1) * sizeof(struct fame_list));
+ //Clear out last entry.
+ list[size-1].id = 0;
+ list[size-1].fame = 0;
+ }
+
+ // Find the position where the player has to be inserted
+ for(i = 0; i < size && fame < list[i].fame; i++);
+ if(i>=size) break; //Out of ranking.
+ // When found someone with less or as much fame, insert just above
+ memmove(list+i+1, list+i, (size-i-1) * sizeof(struct fame_list));
+ list[i].id = cid;
+ list[i].fame = fame;
+ // Look for the player's name
+ char_loadName(list[i].id, list[i].name);
+ char_send_fame_list(-1);
+ }
+
+ break;
+
+ // Receive rates [Wizputer]
+ case 0x2b16:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
+ return 0;
+ {
+ char motd[256], t_name[512]; //Required for jstrescapecpy [Skotlex]
+ strncpy(motd, RFIFOP(fd,10), 255); //First copy it to make sure the motd fits.
+ motd[255]='\0';
+ jstrescapecpy(t_name,motd);
+
+ sprintf(tmp_sql, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'",
+ fd, server_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), t_name);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,8));
+ break;
+ }
+
+ // Character disconnected set online 0 [Wizputer]
+ case 0x2b17:
+ if (RFIFOREST(fd) < 6 )
+ return 0;
+ //printf("Setting %d char offline\n",RFIFOL(fd,2));
+ set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+ break;
+ // Reset all chars to offline [Wizputer]
+ case 0x2b18:
+ set_all_offline(id);
+ RFIFOSKIP(fd,2);
+ break;
+ // Character set online [Wizputer]
+ case 0x2b19:
+ if (RFIFOREST(fd) < 6 )
+ return 0;
+ set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+ break;
+
+ // Build and send fame ranking lists [DracoRPG]
+ case 0x2b1a:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ char_read_fame_list();
+ char_send_fame_list(-1);
+ RFIFOSKIP(fd,2);
+ break;
+
+ //Request saving sc_data of a player. [Skotlex]
+ case 0x2b1c:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+#ifdef ENABLE_SC_SAVING
+ int count, aid, cid, i;
+ struct status_change_data data;
+ char *p = tmp_sql;
+
+ aid = RFIFOL(fd, 4);
+ cid = RFIFOL(fd, 8);
+ count = RFIFOW(fd, 12);
+
+ p+= sprintf(p, "INSERT INTO `%s` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ", scdata_db);
+
+ for (i = 0; i < count; i++)
+ {
+ memcpy (&data, RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
+ p += sprintf (p, " ('%d','%d','%hu','%d','%d','%d','%d','%d'),", aid, cid,
+ data.type, data.tick, data.val1, data.val2, data.val3, data.val4);
+ }
+ if (count > 0)
+ {
+ *--p = '\0'; //Remove final comma.
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+#endif
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ break;
+ }
+
+ case 0x2736:
+ if (RFIFOREST(fd) < 6) return 0;
+ ShowInfo("Updated IP address of Server #%d to %d.%d.%d.%d.\n",id,
+ (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
+ (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
+ server[id].ip = RFIFOL(fd, 2);
+ RFIFOSKIP(fd,6);
+ break;
+
+ default:
+ // inter server - packet
+ {
+ int r = inter_parse_frommap(fd);
+ if (r == 1) break; // processed
+ if (r == 2) return 0; // need more packet
+ }
+
+ // no inter server packet. no char server packet -> disconnect
+ ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int search_mapserver(unsigned short map, long ip, short port) {
+ int i, j;
+
+ if (!map)
+ return -1;
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] > 0)
+ for (j = 0; server[i].map[j]; j++)
+ if (server[i].map[j] == map) {
+ if (ip > 0 && server[i].ip != ip)
+ continue;
+ if (port > 0 && server[i].port != port)
+ continue;
+ return i;
+ }
+
+ return -1;
+}
+
+int char_mapif_init(int fd) {
+ return inter_mapif_init(fd);
+}
+
+//--------------------------------------------
+// Test to know if an IP come from LAN or WAN.
+// Rewrote: Adnvanced subnet check [LuzZza]
+//--------------------------------------------
+int lan_subnetcheck(long *p) {
+
+ int i;
+ unsigned char *sbn, *msk, *src = (unsigned char *)p;
+
+ for(i=0; i<subnet_count; i++) {
+
+ if((subnet[i].subnet & subnet[i].mask) == (*p & subnet[i].mask)) {
+
+ sbn = (unsigned char *)&subnet[i].subnet;
+ msk = (unsigned char *)&subnet[i].mask;
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
+ src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
+
+ return subnet[i].map_ip;
+ }
+ }
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
+ return 0;
+}
+
+int parse_char(int fd) {
+
+ int i, ch = 0;
+ char email[40];
+ unsigned char buf[64];
+ unsigned short cmd;
+ int map_fd;
+ struct char_session_data *sd;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ long subnet_map_ip;
+ RFIFOHEAD(fd);
+
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ if(login_fd < 0)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (fd == login_fd)
+ login_fd = -1;
+ if (sd != NULL)
+ {
+ struct online_char_data* data = idb_get(online_char_db, sd->account_id);
+ if (!data || data->server== -1) //If it is not in any server, send it offline. [Skotlex]
+ set_char_offline(99,sd->account_id);
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2 && !session[fd]->eof) {
+ cmd = RFIFOW(fd,0);
+ // crc32‚̃XƒLƒbƒv—p
+ if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
+ RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
+ RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
+ cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
+ (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
+ RFIFOSKIP(fd,4);
+ cmd = RFIFOW(fd,0);
+ ShowDebug("parse_char : %d crc32 skipped\n",fd);
+ if(RFIFOREST(fd)==0)
+ return 0;
+ }
+
+//For use in packets that depend on an sd being present [Skotlex]
+#define FIFOSD_CHECK(rest) { if(RFIFOREST(fd) < rest) return 0; if (sd==NULL) { RFIFOSKIP(fd,rest); return 0; } }
+
+ switch(cmd){
+ case 0x20b: //20040622 encryption ragexe correspondence
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ RFIFOSKIP(fd,19);
+ break;
+
+ case 0x65: // request to connect
+ ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
+ if (RFIFOREST(fd) < 17)
+ return 0;
+ {
+ WFIFOHEAD(fd, 4);
+
+ if (sd) {
+ //Received again auth packet for already authentified account?? Discard it.
+ //TODO: Perhaps log this as a hack attempt?
+ RFIFOSKIP(fd,17);
+ break;
+ }
+ CREATE(session[fd]->session_data, struct char_session_data, 1);
+ sd = (struct char_session_data*)session[fd]->session_data;
+ sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
+ sd->account_id = RFIFOL(fd, 2);
+ sd->login_id1 = RFIFOL(fd, 6);
+ sd->login_id2 = RFIFOL(fd, 10);
+ sd->sex = RFIFOB(fd, 16);
+
+ WFIFOL(fd, 0) = RFIFOL(fd, 2);
+ WFIFOSET(fd, 4);
+
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == sd->account_id &&
+ auth_fifo[i].login_id1 == sd->login_id1 &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
+#endif
+ (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
+ auth_fifo[i].delflag == 2) {
+ auth_fifo[i].delflag = 1;
+
+ if (online_check)
+ { // check if character is not online already. [Skotlex]
+ struct online_char_data* character;
+ character = idb_get(online_char_db, sd->account_id);
+
+ if (character)
+ {
+ if (character->server > -1)
+ { //Character already online. KICK KICK KICK
+ mapif_disconnectplayer(server_fd[character->server], character->account_id, character->char_id, 2);
+ if (!character->waiting_disconnect)
+ add_timer(gettick()+20000, chardb_waiting_disconnect, character->account_id, 0);
+ character->waiting_disconnect = 1;
+ /* Not a good idea because this would trigger when you do a char-change from the map server! [Skotlex]
+ } else { //Kick from char server.
+ struct char_session_data *tsd;
+ int i;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && i != fd && (tsd = (struct char_session_data*)session[i]->session_data) && tsd->account_id == sd->account_id)
+ {
+ WFIFOW(i,0) = 0x81;
+ WFIFOB(i,2) = 2;
+ WFIFOSET(i,3);
+ break;
+ }
+ if (i == fd_max) //Shouldn't happen, but just in case.
+ set_char_offline(99, sd->account_id);
+ }
+ */
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 8;
+ WFIFOSET(fd,3);
+ break;
+ }
+ }
+ }
+
+ if (max_connect_user == 0 || count_users() < max_connect_user) {
+ if (login_fd > 0) { // don't send request if no login-server
+ // request to login-server to obtain e-mail/time limit
+ WFIFOHEAD(login_fd, 6);
+ WFIFOW(login_fd,0) = 0x2716;
+ WFIFOL(login_fd,2) = sd->account_id;
+ WFIFOSET(login_fd,6);
+ }
+ // send characters to player
+ mmo_char_send006b(fd, sd);
+ } else {
+ // refuse connection (over populated)
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOW(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+// printf("connection request> set delflag 1(o:2)- account_id:%d/login_id1:%d(fifo_id:%d)\n", sd->account_id, sd->login_id1, i);
+ break;
+ }
+ }
+ if (i == AUTH_FIFO_SIZE) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,19);
+ WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
+ WFIFOL(login_fd,2) = sd->account_id;
+ WFIFOL(login_fd,6) = sd->login_id1;
+ WFIFOL(login_fd,10) = sd->login_id2;
+ WFIFOB(login_fd,14) = sd->sex;
+ WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
+ WFIFOSET(login_fd,19);
+ } else { // if no login-server, we must refuse connection
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOB(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ }
+ }
+ RFIFOSKIP(fd, 17);
+ break;
+
+ case 0x66: // char select
+ FIFOSD_CHECK(3);
+
+ sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
+ RFIFOSKIP(fd, 3);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
+
+ if (sql_row)
+ {
+ int char_id = atoi(sql_row[0]);
+ mysql_free_result(sql_res); //Free'd as soon as possible
+ mmo_char_fromsql(char_id, &char_dat);
+ char_dat.sex = sd->sex;
+ } else {
+ mysql_free_result(sql_res);
+ break;
+ }
+
+ if (log_char) {
+ char escaped_name[NAME_LENGTH*2];
+ sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')",
+ charlog_db, sd->account_id, RFIFOB(fd, 2), jstrescapecpy(escaped_name, char_dat.name));
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ ShowInfo("Selected char: (Account %d: %d - %s)" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat.name);
+
+ i = search_mapserver(char_dat.last_point.map, -1, -1);
+
+ // if map is not found, we check major cities
+ if (i < 0) {
+ unsigned short j;
+ //First check that there's actually a map server online.
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0])
+ break;
+ if (j == MAX_MAP_SERVERS) {
+ ShowInfo("Connection Closed. No map servers available.\n");
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
+ if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 273;
+ char_dat.last_point.y = 354;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 120;
+ char_dat.last_point.y = 100;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 160;
+ char_dat.last_point.y = 94;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 116;
+ char_dat.last_point.y = 57;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 87;
+ char_dat.last_point.y = 117;
+ } else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
+ char_dat.last_point.x = 94;
+ char_dat.last_point.y = 103;
+ } else {
+ ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(char_dat.last_point.map));
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
+ ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(char_dat.last_point.map), mapindex_id2name(j));
+ char_dat.last_point.map = j;
+ }
+ { //Send player to map.
+ WFIFOHEAD(fd,28);
+ WFIFOW(fd, 0) =0x71;
+ WFIFOL(fd, 2) =char_dat.char_id;
+ memcpy(WFIFOP(fd,6), mapindex_id2name(char_dat.last_point.map), MAP_NAME_LENGTH);
+
+ // Advanced subnet check [LuzZza]
+ if((subnet_map_ip = lan_subnetcheck((long *)p)))
+ WFIFOL(fd,22) = subnet_map_ip;
+ else
+ WFIFOL(fd,22) = server[i].ip;
+
+ WFIFOW(fd,26) = server[i].port;
+ WFIFOSET(fd,28);
+ }
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE) {
+ auth_fifo_pos = 0;
+ }
+ auth_fifo[auth_fifo_pos].account_id = sd->account_id;
+ auth_fifo[auth_fifo_pos].char_id = char_dat.char_id;
+ auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
+ auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
+ auth_fifo[auth_fifo_pos].delflag = 0;
+ auth_fifo[auth_fifo_pos].char_pos = 0;
+ auth_fifo[auth_fifo_pos].sex = sd->sex;
+ auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
+ auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
+
+ //Send NEW auth packet [Kevin]
+ if ((map_fd = server_fd[i]) < 1 || session[map_fd] == NULL)
+ {
+ ShowError("parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", map_fd, i);
+ server_fd[i] = -1;
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ break;
+ }
+ { //Send auth ok to map server
+ WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
+ WFIFOW(map_fd,0) = 0x2afd;
+ WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
+ WFIFOL(map_fd,4) = auth_fifo[auth_fifo_pos].account_id;
+ WFIFOL(map_fd,8) = auth_fifo[auth_fifo_pos].login_id1;
+ WFIFOL(map_fd,16) = auth_fifo[auth_fifo_pos].login_id2;
+ WFIFOL(map_fd,12) = (unsigned long)auth_fifo[auth_fifo_pos].connect_until_time;
+ memcpy(WFIFOP(map_fd,20), &char_dat, sizeof(struct mmo_charstatus));
+ WFIFOSET(map_fd, WFIFOW(map_fd,2));
+ }
+
+ set_char_online(i, auth_fifo[auth_fifo_pos].char_id, auth_fifo[auth_fifo_pos].account_id);
+ //Checks to see if the even share setting of the party must be broken.
+ inter_party_logged(char_dat.party_id, char_dat.account_id, char_dat.char_id);
+ auth_fifo_pos++;
+ break;
+
+ case 0x67: // make new
+ FIFOSD_CHECK(37);
+
+ if(char_new == 0) //turn character creation on/off [Kevin]
+ i = -2;
+ else
+ i = make_new_char_sql(fd, RFIFOP(fd, 2));
+
+ //'Charname already exists' (-1), 'Char creation denied' (-2)
+ //And 'You are underaged' (-3) (XD) [Sirius]
+ if (i < 0)
+ {
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd, 0) = 0x6e;
+ switch (i) {
+ case -1: WFIFOB(fd, 2) = 0x00; break;
+ case -2: WFIFOB(fd, 2) = 0x02; break;
+ case -3: WFIFOB(fd, 2) = 0x01; break;
+ }
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 37);
+ break;
+ }
+ { //Send data.
+ WFIFOHEAD(fd, 108);
+ WFIFOW(fd, 0) = 0x6d;
+ memset(WFIFOP(fd, 2), 0x00, 106);
+
+ mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed.
+ WFIFOL(fd, 2) = char_dat.char_id;
+ WFIFOL(fd,2+4) = char_dat.base_exp>LONG_MAX?LONG_MAX:char_dat.base_exp;
+ WFIFOL(fd,2+8) = char_dat.zeny;
+ WFIFOL(fd,2+12) = char_dat.job_exp>LONG_MAX?LONG_MAX:char_dat.job_exp;
+ WFIFOL(fd,2+16) = char_dat.job_level;
+
+ WFIFOL(fd,2+28) = char_dat.karma;
+ WFIFOL(fd,2+32) = char_dat.manner;
+
+ WFIFOW(fd,2+40) = 0x30;
+ WFIFOW(fd,2+42) = (char_dat.hp > SHRT_MAX) ? SHRT_MAX : char_dat.hp;
+ WFIFOW(fd,2+44) = (char_dat.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat.max_hp;
+ WFIFOW(fd,2+46) = (char_dat.sp > SHRT_MAX) ? SHRT_MAX : char_dat.sp;
+ WFIFOW(fd,2+48) = (char_dat.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat.max_sp;
+ WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
+ WFIFOW(fd,2+52) = char_dat.class_;
+ WFIFOW(fd,2+54) = char_dat.hair;
+
+ WFIFOW(fd,2+58) = char_dat.base_level;
+ WFIFOW(fd,2+60) = (char_dat.skill_point > SHRT_MAX) ? SHRT_MAX : char_dat.skill_point;
+
+ WFIFOW(fd,2+64) = char_dat.shield;
+ WFIFOW(fd,2+66) = char_dat.head_top;
+ WFIFOW(fd,2+68) = char_dat.head_mid;
+ WFIFOW(fd,2+70) = char_dat.hair_color;
+
+ memcpy(WFIFOP(fd,2+74), char_dat.name, NAME_LENGTH);
+
+ WFIFOB(fd,2+98) = char_dat.str>UCHAR_MAX?UCHAR_MAX:char_dat.str;
+ WFIFOB(fd,2+99) = char_dat.agi>UCHAR_MAX?UCHAR_MAX:char_dat.agi;
+ WFIFOB(fd,2+100) = char_dat.vit>UCHAR_MAX?UCHAR_MAX:char_dat.vit;
+ WFIFOB(fd,2+101) = char_dat.int_>UCHAR_MAX?UCHAR_MAX:char_dat.int_;
+ WFIFOB(fd,2+102) = char_dat.dex>UCHAR_MAX?UCHAR_MAX:char_dat.dex;
+ WFIFOB(fd,2+103) = char_dat.luk>UCHAR_MAX?UCHAR_MAX:char_dat.luk;
+ WFIFOB(fd,2+104) = char_dat.char_num;
+
+ WFIFOSET(fd, 108);
+ RFIFOSKIP(fd, 37);
+ }
+ //to do
+ for(ch = 0; ch < 9; ch++) {
+ if (sd->found_char[ch] == -1) {
+ sd->found_char[ch] = char_dat.char_id;
+ break;
+ }
+ }
+ break;
+ case 0x68: /* delete char */
+ FIFOSD_CHECK(46);
+ {
+ int cid = RFIFOL(fd,2);
+ WFIFOHEAD(fd, 46);
+ ShowInfo(CL_RED" Request Char Deletion:"CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
+ memcpy(email, RFIFOP(fd,6), 40);
+
+ /* Check if e-mail is correct */
+ if(strcmpi(email, sd->email)){
+ if(strcmp("a@a.com", sd->email) == 0){
+ if(strcmp("a@a.com", email) == 0 || strcmp("", email) == 0){
+ //ignore
+ }else{
+ //del fail
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 46);
+ break;
+ }
+ }else{
+ //del fail
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 46);
+ break;
+ }
+ }
+
+ for(i = 0; i < 9; i++) {
+ /* Debug:
+ printf("Checking if char to be deleted: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id);
+ */
+ if (sd->found_char[i] == cid) {
+ for(ch = i; ch < 9-1; ch++)
+ sd->found_char[ch] = sd->found_char[ch+1];
+ sd->found_char[8] = -1;
+ break;
+ }
+ }
+ /* Such a character does not exist in the account */
+ /* If so, you are so screwed. */
+ if (i == 9) {
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ break;
+ }
+
+ /* Grab the partner id */
+ sprintf(tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, cid);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if(sql_res)
+ {
+ int char_pid=0;
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row)
+ char_pid = atoi(sql_row[0]);
+ mysql_free_result(sql_res);
+
+ /* Delete character and partner (if any) */
+ if(delete_char_sql(cid, char_pid)<0){
+ //can't delete the char
+ //either SQL error or can't delete by some CONFIG conditions
+ //del fail
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 46);
+ break;
+ }
+ if (char_pid != 0)
+ { /* If there is partner, tell map server to do divorce */
+ WBUFW(buf,0) = 0x2b12;
+ WBUFL(buf,2) = RFIFOL(fd,2);
+ WBUFL(buf,6) = char_pid;
+ mapif_sendall(buf,10);
+ }
+ }
+ /* Char successfully deleted.*/
+ WFIFOW(fd, 0) = 0x6f;
+ WFIFOSET(fd, 2);
+
+ RFIFOSKIP(fd, 46);
+ break;
+ }
+ case 0x2af8: // login as map-server
+ if (RFIFOREST(fd) < 60)
+ return 0;
+ {
+ char *l_userid = RFIFOP(fd,2);
+ char *l_password = RFIFOP(fd,26);
+ WFIFOHEAD(fd, 4+5*GM_num);
+
+ l_userid[23] = '\0';
+ l_password[23] = '\0';
+ WFIFOW(fd, 0) = 0x2af9;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] <= 0)
+ break;
+ }
+ if (i == MAX_MAP_SERVERS ||
+ strcmp(l_userid, userid) ||
+ strcmp(l_password, passwd)) {
+ WFIFOB(fd,2) = 3;
+ WFIFOSET(fd, 3);
+ } else {
+ int len;
+ WFIFOB(fd,2) = 0;
+ WFIFOSET(fd, 3);
+ session[fd]->func_parse = parse_frommap;
+ server_fd[i] = fd;
+ server[i].ip = RFIFOL(fd, 54);
+ server[i].port = RFIFOW(fd, 58);
+ server[i].users = 0;
+ memset(server[i].map, 0, sizeof(server[i].map));
+ realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ char_mapif_init(fd);
+ // send gm acccounts level to map-servers
+ len = 4;
+ WFIFOW(fd,0) = 0x2b15;
+ for(i = 0; i < GM_num; i++) {
+ WFIFOL(fd,len) = gm_account[i].account_id;
+ WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd,len);
+ }
+ RFIFOSKIP(fd,60);
+ break;
+ }
+ case 0x187: // Alive?
+ if (RFIFOREST(fd) < 6) {
+ return 0;
+ }
+ RFIFOSKIP(fd, 6);
+ break;
+
+ case 0x7530: // Athena info get
+ {
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd, 0) = 0x7531;
+ WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
+ WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
+ WFIFOB(fd, 4) = ATHENA_REVISION;
+ WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
+ WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
+ WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd, 10);
+ RFIFOSKIP(fd, 2);
+ return 0;
+ }
+ case 0x7532: // disconnect(default also disconnect)
+ default:
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ RFIFOFLUSH(fd);
+
+ return 0;
+}
+
+// Console Command Parser [Wizputer]
+int parse_console(char *buf) {
+ char *type,*command;
+
+ type = (char *)aMalloc(64);
+ command = (char *)aMalloc(64);
+
+ memset(type,0,64);
+ memset(command,0,64);
+
+ ShowNotice("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ ShowNotice("Type of command: %s || Command: %s \n",type,command);
+
+ if(buf) aFree(buf);
+ if(type) aFree(type);
+ if(command) aFree(command);
+
+ return 0;
+}
+
+// MAP send all
+int mapif_sendall(unsigned char *buf, unsigned int len) {
+ int i, c;
+ int fd;
+
+ c = 0;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if ((fd = server_fd[i]) > 0) { //0 Should not be a valid server_fd [Skotlex]
+ WFIFOHEAD(fd,len);
+#if 0 //This seems to have been fixed long long ago.
+ if (session[fd] == NULL)
+ { //Could this be the crash's source? [Skotlex]
+ ShowError("mapif_sendall: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", fd, i);
+ server_fd[i] = -1;
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ continue;
+ }
+#endif
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
+ int i, c;
+ int fd;
+
+ c = 0;
+ for(i=0, c=0;i<MAX_MAP_SERVERS;i++){
+ if ((fd = server_fd[i]) > 0 && fd != sfd) {
+ WFIFOHEAD(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd, len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+int mapif_send(int fd, unsigned char *buf, unsigned int len) {
+ int i;
+
+ if (fd >= 0) {
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (fd == server_fd[i]) {
+ WFIFOHEAD(fd,len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+int send_users_tologin(int tid, unsigned int tick, int id, int data) {
+ int users = count_users();
+ unsigned char buf[16];
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send number of user to login server
+ WFIFOHEAD(login_fd,6);
+ WFIFOW(login_fd,0) = 0x2714;
+ WFIFOL(login_fd,2) = users;
+ WFIFOSET(login_fd,6);
+ }
+ // send number of players to all map-servers
+ WBUFW(buf,0) = 0x2b00;
+ WBUFL(buf,2) = users;
+ mapif_sendall(buf, 6);
+
+ return 0;
+}
+
+static int send_accounts_tologin_sub(DBKey key, void* data, va_list ap) {
+ struct online_char_data* character = (struct online_char_data*)data;
+ int *i = va_arg(ap, int*);
+ int count = va_arg(ap, int);
+ if ((*i) >= count)
+ return 0; //This is an error that shouldn't happen....
+ if(character->server > -1) {
+ WFIFOHEAD(login_fd, 8+count*4);
+ WFIFOL(login_fd, 8+(*i)*4) =character->account_id;
+ (*i)++;
+ return 1;
+ }
+ return 0;
+}
+
+int send_accounts_tologin(int tid, unsigned int tick, int id, int data) {
+ int users = count_users(), i=0;
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send account list to login server
+ WFIFOHEAD(login_fd, 8+users*4);
+ WFIFOW(login_fd,0) = 0x272d;
+ WFIFOL(login_fd,4) = users;
+ online_char_db->foreach(online_char_db, send_accounts_tologin_sub, &i, users);
+ WFIFOW(login_fd,2) = 8+ i*4;
+ WFIFOSET(login_fd,WFIFOW(login_fd,2));
+ }
+ return 0;
+}
+
+int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
+ if (login_fd > 0 && session[login_fd] != NULL)
+ return 0;
+
+ ShowInfo("Attempt to connect to login-server...\n");
+ login_fd = make_connection(login_ip, login_port);
+ if (login_fd == -1)
+ { //Try again later. [Skotlex]
+ login_fd = 0;
+ return 0;
+ }
+ session[login_fd]->func_parse = parse_tologin;
+ realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ {
+ WFIFOHEAD(login_fd, 86);
+ WFIFOW(login_fd,0) = 0x2710;
+ memcpy(WFIFOP(login_fd,2), userid, 24);
+ memcpy(WFIFOP(login_fd,26), passwd, 24);
+ WFIFOL(login_fd,50) = 0;
+ WFIFOL(login_fd,54) = char_ip;
+ WFIFOL(login_fd,58) = char_port;
+ memcpy(WFIFOP(login_fd,60), server_name, 20);
+ WFIFOW(login_fd,80) = 0;
+ WFIFOW(login_fd,82) = char_maintenance;
+ WFIFOW(login_fd,84) = char_new_display; //only display (New) if they want to [Kevin]
+ WFIFOSET(login_fd,86);
+ }
+ return 0;
+}
+
+//------------------------------------------------
+//Invoked 15 seconds after mapif_disconnectplayer in case the map server doesn't
+//replies/disconnect the player we tried to kick. [Skotlex]
+//------------------------------------------------
+static int chardb_waiting_disconnect(int tid, unsigned int tick, int id, int data)
+{
+ struct online_char_data* character;
+ if ((character = idb_get(online_char_db, id)) != NULL && character->waiting_disconnect)
+ { //Mark it offline due to timeout.
+ set_char_offline(character->char_id, character->account_id);
+ }
+ return 0;
+}
+
+//----------------------------------------------------------
+// Return numerical value of a switch configuration by [Yor]
+// on/off, english, français, deutsch, español
+//----------------------------------------------------------
+int config_switch(const char *str) {
+ if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
+ return 1;
+ if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
+ return 0;
+
+ return atoi(str);
+}
+
+//----------------------------------
+// Reading Lan Support configuration
+// Rewrote: Anvanced subnet check [LuzZza]
+//----------------------------------
+int char_lan_config_read(const char *lancfgName) {
+
+ FILE *fp;
+ int line_num = 0;
+ char line[1024], w1[64], w2[64], w3[64], w4[64];
+
+ if((fp = fopen(lancfgName, "r")) == NULL) {
+ ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ ShowInfo("Reading the configuration file %s...\n", lancfgName);
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ line_num++;
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
+
+ ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
+ continue;
+ }
+
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+ remove_control_chars((unsigned char *)w3);
+ remove_control_chars((unsigned char *)w4);
+
+ if(strcmpi(w1, "subnet") == 0) {
+
+ subnet[subnet_count].mask = inet_addr(w2);
+ subnet[subnet_count].char_ip = inet_addr(w3);
+ subnet[subnet_count].map_ip = inet_addr(w4);
+ subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
+ if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
+ ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
+ continue;
+ }
+
+ subnet_count++;
+ }
+
+ ShowStatus("Read information about %d subnetworks.\n", subnet_count);
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+void do_final(void) {
+ ShowInfo("Doing final stage...\n");
+ //inter_save();
+ do_final_itemdb();
+ //check SQL save progress.
+ //wait until save char complete
+
+ set_all_offline(-1);
+ set_all_offline_sql();
+
+ inter_final();
+
+ flush_fifos();
+
+ mapindex_final();
+
+ sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
+ if (mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ if(gm_account) {
+ aFree(gm_account);
+ gm_account = 0;
+ }
+
+ delete_session(login_fd);
+ delete_session(char_fd);
+ char_db_->destroy(char_db_, NULL);
+ online_char_db->destroy(online_char_db, NULL);
+
+ mysql_close(&mysql_handle);
+ if(char_gm_read)
+ mysql_close(&lmysql_handle);
+
+ ShowInfo("ok! all done...\n");
+}
+#endif //TXT_SQL_CONVERT
+void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ ShowInfo("Reading file %s...\n", cfgName);
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ ShowFatalError("file not found: %s\n", cfgName);
+ exit(1);
+ }
+
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ if(strcmpi(w1,"char_db")==0){
+ strcpy(char_db,w2);
+#ifndef TXT_SQL_CONVERT
+ } else if(strcmpi(w1, "gm_read_method") == 0) {
+ if(atoi(w2) != 0)
+ char_gm_read = true;
+ else
+ char_gm_read = false;
+ //custom columns for login database
+ }else if(strcmpi(w1,"login_db")==0){
+ strcpy(login_db, w2);
+ }else if(strcmpi(w1,"login_db_level")==0){
+ strcpy(login_db_level,w2);
+ }else if(strcmpi(w1,"login_db_account_id")==0){
+ strcpy(login_db_account_id,w2);
+ }else if(strcmpi(w1,"lowest_gm_level")==0){
+ lowest_gm_level = atoi(w2);
+ ShowStatus("set lowest_gm_level : %s\n",w2);
+#endif
+ }else if(strcmpi(w1,"scdata_db")==0){
+ strcpy(scdata_db,w2);
+ }else if(strcmpi(w1,"cart_db")==0){
+ strcpy(cart_db,w2);
+ }else if(strcmpi(w1,"inventory_db")==0){
+ strcpy(inventory_db,w2);
+ }else if(strcmpi(w1,"charlog_db")==0){
+ strcpy(charlog_db,w2);
+ }else if(strcmpi(w1,"storage_db")==0){
+ strcpy(storage_db,w2);
+ }else if(strcmpi(w1,"reg_db")==0){
+ strcpy(reg_db,w2);
+ }else if(strcmpi(w1,"skill_db")==0){
+ strcpy(skill_db,w2);
+ }else if(strcmpi(w1,"interlog_db")==0){
+ strcpy(interlog_db,w2);
+ }else if(strcmpi(w1,"memo_db")==0){
+ strcpy(memo_db,w2);
+ }else if(strcmpi(w1,"guild_db")==0){
+ strcpy(guild_db,w2);
+ }else if(strcmpi(w1,"guild_alliance_db")==0){
+ strcpy(guild_alliance_db,w2);
+ }else if(strcmpi(w1,"guild_castle_db")==0){
+ strcpy(guild_castle_db,w2);
+ }else if(strcmpi(w1,"guild_expulsion_db")==0){
+ strcpy(guild_expulsion_db,w2);
+ }else if(strcmpi(w1,"guild_member_db")==0){
+ strcpy(guild_member_db,w2);
+ }else if(strcmpi(w1,"guild_skill_db")==0){
+ strcpy(guild_skill_db,w2);
+ }else if(strcmpi(w1,"guild_position_db")==0){
+ strcpy(guild_position_db,w2);
+ }else if(strcmpi(w1,"guild_storage_db")==0){
+ strcpy(guild_storage_db,w2);
+ }else if(strcmpi(w1,"party_db")==0){
+ strcpy(party_db,w2);
+ }else if(strcmpi(w1,"pet_db")==0){
+ strcpy(pet_db,w2);
+ }else if(strcmpi(w1,"friend_db")==0){
+ strcpy(friend_db,w2);
+#ifndef TXT_SQL_CONVERT
+ }else if(strcmpi(w1,"db_path")==0){
+ strcpy(db_path,w2);
+ //Map server option to use SQL db or not
+ }else if(strcmpi(w1,"use_sql_db")==0){ // added for sql item_db read for char server [Valaris]
+ db_use_sqldbs = config_switch(w2);
+ ShowStatus("Using SQL dbs: %s\n",w2);
+ }else if(strcmpi(w1,"item_db_db")==0){
+ strcpy(item_db_db,w2);
+ }else if(strcmpi(w1,"item_db2_db")==0){
+ strcpy(item_db2_db,w2);
+ } else if(strcmpi(w1,"connection_ping_interval")==0) {
+ connection_ping_interval = config_switch(w2);
+#endif
+ //support the import command, just like any other config
+ }else if(strcmpi(w1,"import")==0){
+ sql_config_read(w2);
+ }
+
+ }
+ fclose(fp);
+ ShowInfo("done reading %s.\n", cfgName);
+}
+#ifndef TXT_SQL_CONVERT
+
+int char_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ ShowFatalError("Configuration file not found: %s.\n", cfgName);
+ exit(1);
+ }
+
+ ShowInfo("Reading file %s...\n", cfgName);
+ while(fgets(line, sizeof(line)-1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ remove_control_chars((unsigned char *) w1);
+ remove_control_chars((unsigned char *) w2);
+ if(strcmpi(w1,"timestamp_format")==0) {
+ strncpy(timestamp_format, w2, 20);
+ } else if(strcmpi(w1,"console_silent")==0){
+ msg_silent = 0; //To always allow the next line to show up.
+ ShowInfo("Console Silent Setting: %d\n", atoi(w2));
+ msg_silent = atoi(w2);
+ } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
+ stdout_with_ansisequence = config_switch(w2);
+ } else if (strcmpi(w1, "userid") == 0) {
+ strncpy(userid, w2, 24);
+ } else if (strcmpi(w1, "passwd") == 0) {
+ strncpy(passwd, w2, 24);
+ } else if (strcmpi(w1, "server_name") == 0) {
+ strncpy(server_name, w2, 20);
+ server_name[sizeof(server_name) - 1] = '\0';
+ ShowStatus("%s server has been initialized\n", w2);
+ } else if (strcmpi(w1, "wisp_server_name") == 0) {
+ if (strlen(w2) >= 4) {
+ memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
+ wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
+ }
+ } else if (strcmpi(w1, "login_ip") == 0) {
+ unsigned char ip_str[16];
+ login_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (login_ip) {
+ strncpy(login_ip_str, w2, sizeof(login_ip_str));
+ ShowStatus("Login server IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "login_port") == 0) {
+ login_port=atoi(w2);
+ } else if (strcmpi(w1, "char_ip") == 0) {
+ unsigned char ip_str[16];
+ char_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (char_ip){
+ strncpy(char_ip_str, w2, sizeof(char_ip_str));
+ ShowStatus("Character server IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "bind_ip") == 0) {
+ unsigned char ip_str[16];
+ bind_ip = resolve_hostbyname(w2, NULL, ip_str);
+ if (bind_ip) {
+ strncpy(bind_ip_str, w2, sizeof(bind_ip_str));
+ ShowStatus("Character server binding IP address : %s -> %s\n", w2, ip_str);
+ }
+ } else if (strcmpi(w1, "char_port") == 0) {
+ char_port = atoi(w2);
+ } else if (strcmpi(w1, "char_maintenance") == 0) {
+ char_maintenance = atoi(w2);
+ } else if (strcmpi(w1, "char_new")==0){
+ char_new = atoi(w2);
+ } else if (strcmpi(w1, "char_new_display")==0){
+ char_new_display = atoi(w2);
+ } else if (strcmpi(w1, "max_connect_user") == 0) {
+ max_connect_user = atoi(w2);
+ if (max_connect_user < 0)
+ max_connect_user = 0; // unlimited online players
+ } else if(strcmpi(w1, "gm_allow_level") == 0) {
+ gm_allow_level = atoi(w2);
+ if(gm_allow_level < 0)
+ gm_allow_level = 99;
+ } else if (strcmpi(w1, "check_ip_flag") == 0) {
+ check_ip_flag = config_switch(w2);
+ } else if (strcmpi(w1, "online_check") == 0) {
+ online_check = config_switch(w2);
+ } else if (strcmpi(w1, "autosave_time") == 0) {
+ autosave_interval = atoi(w2)*1000;
+ if (autosave_interval <= 0)
+ autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+ } else if (strcmpi(w1, "save_log") == 0) {
+ save_log = config_switch(w2);
+ } else if (strcmpi(w1, "start_point") == 0) {
+ char map[MAP_NAME_LENGTH];
+ int x, y;
+ if (sscanf(w2,"%16[^,],%d,%d", map, &x, &y) < 3)
+ continue;
+ if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
+ start_point.map = mapindex_name2id(map);
+ if (!start_point.map)
+ ShowError("Specified start_point %s not found in map-index cache.\n", map);
+ start_point.x = x;
+ start_point.y = y;
+ }
+ } else if (strcmpi(w1, "start_zeny") == 0) {
+ start_zeny = atoi(w2);
+ if (start_zeny < 0)
+ start_zeny = 0;
+ } else if (strcmpi(w1, "start_weapon") == 0) {
+ start_weapon = atoi(w2);
+ if (start_weapon < 0)
+ start_weapon = 0;
+ } else if (strcmpi(w1, "start_armor") == 0) {
+ start_armor = atoi(w2);
+ if (start_armor < 0)
+ start_armor = 0;
+ } else if(strcmpi(w1,"log_char")==0){ //log char or not [devil]
+ log_char = atoi(w2);
+ } else if (strcmpi(w1, "unknown_char_name") == 0) {
+ strcpy(unknown_char_name, w2);
+ unknown_char_name[NAME_LENGTH-1] = 0;
+ } else if (strcmpi(w1, "name_ignoring_case") == 0) {
+ name_ignoring_case = config_switch(w2);
+ } else if (strcmpi(w1, "char_name_option") == 0) {
+ char_name_option = atoi(w2);
+ } else if (strcmpi(w1, "char_name_letters") == 0) {
+ strcpy(char_name_letters, w2);
+ } else if (strcmpi(w1, "check_ip_flag") == 0) {
+ check_ip_flag = config_switch(w2);
+ } else if (strcmpi(w1, "chars_per_account") == 0) { //maxchars per account [Sirius]
+ char_per_account = atoi(w2);
+ } else if (strcmpi(w1, "char_del_level") == 0) { //disable/enable char deletion by its level condition [Lupus]
+ char_del_level = atoi(w2);
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ } else if (strcmpi(w1, "fame_list_alchemist") == 0) {
+ fame_list_size_chemist = atoi(w2);
+ if (fame_list_size_chemist > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_alchemist)\n", MAX_FAME_LIST);
+ fame_list_size_chemist = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "fame_list_blacksmith") == 0) {
+ fame_list_size_smith = atoi(w2);
+ if (fame_list_size_smith > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_blacksmith)\n", MAX_FAME_LIST);
+ fame_list_size_smith = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "fame_list_taekwon") == 0) {
+ fame_list_size_taekwon = atoi(w2);
+ if (fame_list_size_taekwon > MAX_FAME_LIST) {
+ ShowWarning("Max fame list size is %d (fame_list_taekwon)\n", MAX_FAME_LIST);
+ fame_list_size_taekwon = MAX_FAME_LIST;
+ }
+ } else if (strcmpi(w1, "guild_exp_rate") == 0) {
+ guild_exp_rate = atoi(w2);
+ } else if (strcmpi(w1, "import") == 0) {
+ char_config_read(w2);
+ }
+ }
+ fclose(fp);
+
+ ShowInfo("Done reading %s.\n", cfgName);
+
+ return 0;
+}
+
+void set_server_type(void)
+{
+ SERVER_TYPE = ATHENA_SERVER_CHAR;
+}
+
+static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
+{
+ struct online_char_data *character= (struct online_char_data*)data;
+ if (character->server == -2) //Unknown server.. set them offline
+ set_char_offline(character->char_id, character->account_id);
+ if (character->server < 0)
+ //Free data from players that have not been online for a while.
+ db_remove(online_char_db, key);
+ return 0;
+}
+
+static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
+{
+ online_char_db->foreach(online_char_db, online_data_cleanup_sub);
+ return 0;
+}
+
+int do_init(int argc, char **argv){
+ int i;
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ server_fd[i] = -1;
+ }
+
+ //Read map indexes
+ mapindex_init();
+ start_point.map = mapindex_name2id("new_zone01.gat");
+
+ char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
+ char_lan_config_read((argc > 3) ? argv[3] : LAN_CONF_NAME);
+ sql_config_read(SQL_CONF_NAME);
+
+ if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
+ ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
+ ShowNotice("Please edit your 'login' table to create a proper inter-server user/password (gender 'S')\n");
+ ShowNotice("And then change the user/password to use in conf/char_athena.conf (or conf/import/char_conf.txt)\n");
+ }
+
+ ShowInfo("Finished reading the char-server configuration.\n");
+
+ inter_init_sql((argc > 2) ? argv[2] : inter_cfgName); // inter server ÃʱâÈ­
+ ShowInfo("Finished reading the inter-server configuration.\n");
+
+ //Read ItemDB
+ do_init_itemdb();
+
+ ShowInfo("Initializing char server.\n");
+ online_char_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ mmo_char_sql_init();
+ ShowInfo("char server initialized.\n");
+
+// ShowDebug("set parser -> parse_char()...\n");
+ set_defaultparse(parse_char);
+
+// ShowDebug("set terminate function -> do_final().....\n");
+
+ if ((naddr_ != 0) && (!login_ip || !char_ip)) {
+ // The char server should know what IP address it is running on
+ // - MouseJstr
+ int localaddr = ntohl(addr_[0]);
+ unsigned char *ptr = (unsigned char *) &localaddr;
+ char buf[16];
+ sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
+ if (naddr_ != 1)
+ ShowStatus("Multiple interfaces detected.. using %s as our IP address\n", buf);
+ else
+ ShowStatus("Defaulting to %s as our IP address\n", buf);
+ if (!login_ip) {
+ strcpy(login_ip_str, buf);
+ login_ip = inet_addr(login_ip_str);
+ }
+ if (!char_ip) {
+ strcpy(char_ip_str, buf);
+ char_ip = inet_addr(char_ip_str);
+ }
+ if (ptr[0] == 192 && ptr[1] == 168)
+ ShowWarning("Firewall detected.. edit subnet_athena.conf and char_athena.conf\n");
+ }
+
+ ShowInfo("open port %d.....\n",char_port);
+ char_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,char_port);
+
+ add_timer_func_list(check_connect_login_server, "check_connect_login_server");
+ add_timer_func_list(send_users_tologin, "send_users_tologin");
+ add_timer_func_list(send_accounts_tologin, "send_accounts_tologin");
+ add_timer_func_list(chardb_waiting_disconnect, "chardb_waiting_disconnect");
+
+ add_timer_func_list(online_data_cleanup, "online_data_cleanup");
+ add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600 * 1000);
+
+ // send ALIVE PING to login server.
+ add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000);
+ // send USER COUNT PING to login server.
+ add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000);
+ add_timer_interval(gettick() + 3600*1000, send_accounts_tologin, 0, 0, 3600 * 1000); //Sync online accounts every hour.
+
+ char_read_fame_list(); //Read fame lists.
+
+ if(char_gm_read)
+ read_gm_account();
+
+
+ if ( console ) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ //Cleaning the tables for NULL entrys @ startup [Sirius]
+ //Chardb clean
+ ShowInfo("Cleaning the '%s' table...\n", char_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //guilddb clean
+ ShowInfo("Cleaning the '%s' table...\n", guild_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //guildmemberdb clean
+ ShowInfo("Cleaning the '%s' table...\n", guild_member_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ ShowInfo("End of char server initilization function.\n");
+ ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
+ return 0;
+}
+
+#undef mysql_query
+
+int debug_mysql_query(char *file, int line, void *mysql, const char *q) {
+#ifdef TWILIGHT
+ ShowDebug("sql: %s:%d# %s\n", file, line, q);
+#endif
+ return mysql_query((MYSQL *) mysql, q);
+}
+
+int char_child(int parent_id, int child_id) {
+ int tmp_id = 0;
+ sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result (&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
+ if (sql_row)
+ tmp_id = atoi (sql_row[0]);
+ else
+ ShowError("CHAR: child Failed!\n");
+ if (sql_res) mysql_free_result (sql_res);
+ if ( tmp_id == child_id )
+ return 1;
+ else
+ return 0;
+}
+
+int char_married(int pl1,int pl2) {
+ int tmp_id = 0;
+ sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result (&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
+ if (sql_row)
+ tmp_id = atoi (sql_row[0]);
+ else
+ ShowError("CHAR: married Failed!\n");
+ if (sql_res) mysql_free_result (sql_res);
+ if ( tmp_id == pl2 )
+ return 1;
+ else
+ return 0;
+}
+
+int char_family(int pl1,int pl2,int pl3) {
+ int charid, partnerid, childid;
+ sprintf (tmp_sql, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ sql_res = mysql_store_result (&mysql_handle);
+ if (!sql_res) return 0;
+
+ while((sql_row = mysql_fetch_row(sql_res)))
+ {
+ charid = atoi(sql_row[0]);
+ partnerid = atoi(sql_row[1]);
+ childid = atoi(sql_row[2]);
+ if (charid == pl1) {
+ if ((pl2 == partnerid && pl3 == childid) ||
+ (pl3 == partnerid && pl2 == childid)
+ ) {
+ mysql_free_result (sql_res);
+ return childid;
+ }
+ }
+ if(charid == pl2) {
+ if ((pl1 == partnerid && pl3 == childid) ||
+ (pl3 == partnerid && pl1 == childid)
+ ) {
+ mysql_free_result (sql_res);
+ return childid;
+ }
+ }
+ if(charid == pl3) {
+ if ((pl1 == partnerid && pl2 == childid) ||
+ (pl2 == partnerid && pl1 == childid)
+ ) {
+ mysql_free_result (sql_res);
+ return childid;
+ }
+ }
+ }
+ mysql_free_result (sql_res);
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/char.h b/src/char_sql/char.h
index 70d8e3b13..1ad48fc9b 100644
--- a/src/char_sql/char.h
+++ b/src/char_sql/char.h
@@ -1,110 +1,110 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-#ifndef _CHARSQL_H_
-#define _CHARSQL_H_
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/mapindex.h"
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
-#include "itemdb.h"
-
-#define START_CHAR_NUM 150000
-#define MAX_MAP_SERVERS 30
-
-#define LAN_CONF_NAME "conf/subnet_athena.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct itemtmp {
- int flag;//checked = 1 else 0
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-enum {
- TABLE_INVENTORY,
- TABLE_CART,
- TABLE_STORAGE,
- TABLE_GUILD_STORAGE,
-};
-struct itemtemp{
- struct itemtmp equip[MAX_GUILD_STORAGE],notequip[MAX_GUILD_STORAGE];
-};
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
-
-//int memitemdataNEW_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
-int mapif_sendall(unsigned char *buf,unsigned int len);
-int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len);
-int mapif_send(int fd,unsigned char *buf,unsigned int len);
-
-int char_married(int pl1,int pl2);
-int char_child(int parent_id, int child_id);
-int char_family(int pl1,int pl2,int pl3);
-
-int char_loadName(int char_id, char* name);
-
-int request_accreg2(int account_id, int char_id);
-int save_accreg2(unsigned char* buf, int len);
-
-extern int char_name_option;
-extern char char_name_letters[];
-extern bool char_gm_read;
-extern int autosave_interval;
-extern int save_log;
-extern int charsave_method;
-extern char db_path[];
-extern char char_db[256];
-extern char scdata_db[256];
-extern char cart_db[256];
-extern char inventory_db[256];
-extern char charlog_db[256];
-extern char storage_db[256];
-extern char interlog_db[256];
-extern char reg_db[256];
-extern char skill_db[256];
-extern char memo_db[256];
-extern char guild_db[256];
-extern char guild_alliance_db[256];
-extern char guild_castle_db[256];
-extern char guild_expulsion_db[256];
-extern char guild_member_db[256];
-extern char guild_position_db[256];
-extern char guild_skill_db[256];
-extern char guild_storage_db[256];
-extern char party_db[256];
-extern char pet_db[256];
-
-extern int db_use_sqldbs; // added for sql item_db read for char server [Valaris]
-extern int connection_ping_interval;
-
-extern char login_db_level[32];
-extern char login_db_account_id[32];
-
-extern int lowest_gm_level;
-extern int GM_num;
-extern struct gm_account *gm_account;
-
-extern int guild_exp_rate;
-extern int log_inter;
-
-extern int debug_mysql_query(char *file, int line, void *mysql, const char *q);
-
-//Exported for use in the TXT-SQL converter.
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p);
-void sql_config_read(const char *cfgName);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+#ifndef _CHARSQL_H_
+#define _CHARSQL_H_
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/mmo.h"
+#include "../common/version.h"
+#include "../common/db.h"
+#include "../common/mapindex.h"
+
+#include "inter.h"
+#include "int_pet.h"
+#include "int_guild.h"
+#include "int_party.h"
+#include "int_storage.h"
+#include "itemdb.h"
+
+#define START_CHAR_NUM 150000
+#define MAX_MAP_SERVERS 30
+
+#define LAN_CONF_NAME "conf/subnet_athena.conf"
+
+#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+
+struct itemtmp {
+ int flag;//checked = 1 else 0
+ int id;
+ short nameid;
+ short amount;
+ unsigned short equip;
+ char identify;
+ char refine;
+ char attribute;
+ short card[4];
+};
+enum {
+ TABLE_INVENTORY,
+ TABLE_CART,
+ TABLE_STORAGE,
+ TABLE_GUILD_STORAGE,
+};
+struct itemtemp{
+ struct itemtmp equip[MAX_GUILD_STORAGE],notequip[MAX_GUILD_STORAGE];
+};
+int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
+
+//int memitemdataNEW_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
+int mapif_sendall(unsigned char *buf,unsigned int len);
+int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len);
+int mapif_send(int fd,unsigned char *buf,unsigned int len);
+
+int char_married(int pl1,int pl2);
+int char_child(int parent_id, int child_id);
+int char_family(int pl1,int pl2,int pl3);
+
+int char_loadName(int char_id, char* name);
+
+int request_accreg2(int account_id, int char_id);
+int save_accreg2(unsigned char* buf, int len);
+
+extern int char_name_option;
+extern char char_name_letters[];
+extern bool char_gm_read;
+extern int autosave_interval;
+extern int save_log;
+extern int charsave_method;
+extern char db_path[];
+extern char char_db[256];
+extern char scdata_db[256];
+extern char cart_db[256];
+extern char inventory_db[256];
+extern char charlog_db[256];
+extern char storage_db[256];
+extern char interlog_db[256];
+extern char reg_db[256];
+extern char skill_db[256];
+extern char memo_db[256];
+extern char guild_db[256];
+extern char guild_alliance_db[256];
+extern char guild_castle_db[256];
+extern char guild_expulsion_db[256];
+extern char guild_member_db[256];
+extern char guild_position_db[256];
+extern char guild_skill_db[256];
+extern char guild_storage_db[256];
+extern char party_db[256];
+extern char pet_db[256];
+
+extern int db_use_sqldbs; // added for sql item_db read for char server [Valaris]
+extern int connection_ping_interval;
+
+extern char login_db_level[32];
+extern char login_db_account_id[32];
+
+extern int lowest_gm_level;
+extern int GM_num;
+extern struct gm_account *gm_account;
+
+extern int guild_exp_rate;
+extern int log_inter;
+
+extern int debug_mysql_query(char *file, int line, void *mysql, const char *q);
+
+//Exported for use in the TXT-SQL converter.
+int mmo_char_tosql(int char_id, struct mmo_charstatus *p);
+void sql_config_read(const char *cfgName);
+#endif
diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c
index 8920ed948..dbb9bc1ad 100644
--- a/src/char_sql/int_guild.c
+++ b/src/char_sql/int_guild.c
@@ -1,2106 +1,2106 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by hack
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-// #include "int_storage.h"
-#include "inter.h"
-#include "int_guild.h"
-#include "mmo.h"
-#include "socket.h"
-#include "db.h"
-#include "malloc.h"
-
-#define GS_MEMBER_UNMODIFIED 0x00
-#define GS_MEMBER_MODIFIED 0x01
-#define GS_MEMBER_NEW 0x02
-
-#define GS_POSITION_UNMODIFIED 0x00
-#define GS_POSITION_MODIFIED 0x01
-
-// LSB = 0 => Alliance, LSB = 1 => Opposition
-#define GUILD_ALLIANCE_TYPE_MASK 0x01
-#define GUILD_ALLIANCE_REMOVE 0x08
-
-static char dataToHex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
-
-#ifndef TXT_SQL_CONVERT
-//Guild cache
-static struct dbt *guild_db_;
-
-struct guild_castle castles[MAX_GUILDCASTLE];
-
-static unsigned int guild_exp[100];
-
-int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes);
-int mapif_guild_broken(int guild_id,int flag);
-int guild_check_empty(struct guild *g);
-int guild_calcinfo(struct guild *g);
-int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
-int mapif_guild_info(int fd,struct guild *g);
-int guild_break_sub(int key,void *data,va_list ap);
-int inter_guild_tosql(struct guild *g,int flag);
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-static int guild_save(DBKey key, void *data, va_list ap) {
- struct guild *g = (struct guild*) data;
- int *last_id = va_arg(ap, int *);
- int *state = va_arg(ap, int *);
-
- if ((*state) == 0 && g->guild_id == (*last_id))
- (*state)++; //Save next guild in the list.
- else if (g->save_flag&GS_MASK && (*state) == 1) {
- inter_guild_tosql(g, g->save_flag&GS_MASK);
- g->save_flag &= ~GS_MASK;
-
- //Some guild saved.
- (*last_id) = g->guild_id;
- (*state)++;
- }
-
- if(g->save_flag == GS_REMOVE) { //Nothing to save, guild is ready for removal.
- if (save_log)
- ShowInfo("Guild Unloaded (%d - %s)\n", g->guild_id, g->name);
- db_remove(guild_db_, key);
- }
- return 0;
-}
-
-static int guild_save_timer(int tid, unsigned int tick, int id, int data) {
- static int last_id = 0; //To know in which guild we were.
- int state = 0; //0: Have not reached last guild. 1: Reached last guild, ready for save. 2: Some guild saved, don't do further saving.
- if (!last_id) //Save the first guild in the list.
- state = 1;
- guild_db_->foreach(guild_db_, guild_save, &last_id, &state);
- if (state != 2) //Reached the end of the guild db without saving.
- last_id = 0; //Reset guild saved, return to beginning.
-
- state = guild_db_->size(guild_db_);
- if (state < 1) state = 1; //Calculate the time slot for the next save.
- add_timer(tick + autosave_interval/state, guild_save_timer, 0, 0);
- return 0;
-}
-
-int inter_guild_removemember_tosql(int account_id, int char_id)
-{
- sprintf(tmp_sql,"DELETE from `%s` where `account_id` = '%d' and `char_id` = '%d'", guild_member_db, account_id, char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '0' WHERE `char_id` = '%d'", char_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-// Save guild into sql
-int inter_guild_tosql(struct guild *g,int flag)
-{
- // Table guild (GS_BASIC_MASK)
- // GS_EMBLEM `emblem_len`,`emblem_id`,`emblem_data`
- // GS_CONNECT `connect_member`,`average_lv`
- // GS_MES `mes1`,`mes2`
- // GS_LEVEL `guild_lv`,`max_member`,`exp`,`next_exp`,`skill_point`
- // GS_BASIC `name`,`master`,`char_id`
-
- // GS_MEMBER `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
- // GS_POSITION `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
- // GS_ALLIANCE `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
- // GS_EXPULSION `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
- // GS_SKILL `guild_skill` (`guild_id`,`id`,`lv`)
-
- // temporary storage for str convertion. They must be twice the size of the
- // original string to ensure no overflows will occur. [Skotlex]
- char t_name[NAME_LENGTH*2],
- t_master[NAME_LENGTH*2],
- t_mes1[120],
- t_mes2[240],
- t_member[NAME_LENGTH*2],
- t_position[NAME_LENGTH*2],
- t_alliance[NAME_LENGTH*2],
- t_ename[NAME_LENGTH*2],
- t_emes[80],
- t_info[240];
- char emblem_data[4096];
- char new_guild = 0;
- int i=0, sql_index;
-
- if (g->guild_id<=0 && g->guild_id != -1) return 0;
-
-#ifdef NOISY
- ShowInfo("Save guild request ("CL_BOLD"%d"CL_RESET" - flag 0x%x).",g->guild_id, flag);
-#endif
-
- jstrescapecpy(t_name, g->name);
-
- t_info[0]='\0';
-
-#ifndef TXT_SQL_CONVERT
- // Insert a new guild the guild
- if (flag&GS_BASIC && g->guild_id == -1)
- {
- strcat(t_info, " guild_create");
-
- // Create a new guild
- sprintf(tmp_sql,"INSERT INTO `%s` "
- "(`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
- "VALUES ('%s', '%s', '%d', '%d', '%d', '%d')",
- guild_db,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- if (g->guild_id == -1)
- return 0; //Failed to create guild!
- }
- else
- {
- //New guild, catch id
- if(mysql_field_count(&mysql_handle) == 0 && mysql_insert_id(&mysql_handle) != 0)
- {
- g->guild_id = (int)mysql_insert_id(&mysql_handle);
- new_guild = 1;
- }
- else
- return 0; //Failed to get ID??
- }
- }
-#else
- // Insert a new guild the guild
- if (flag&GS_BASIC)
- {
- strcat(t_info, " guild_create");
- // Since the PK is guild id + master id, a replace will not be enough if we are overwriting data, we need to wipe the previous guild.
- sprintf(tmp_sql,"DELETE FROM `%s` where `guild_id` = '%d'", guild_db,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- // Create a new guild
- sprintf(tmp_sql,"REPLACE INTO `%s` "
- "(`guild_id`,`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
- "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d')",
- guild_db,g->guild_id,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0; //Failed to create guild.
- }
- }
-#endif //TXT_SQL_CONVERT
- // If we need an update on an existing guild or more update on the new guild
- if (((flag & GS_BASIC_MASK) && !new_guild) || ((flag & (GS_BASIC_MASK & ~GS_BASIC)) && new_guild))
- {
- sql_index = sprintf(tmp_sql,"UPDATE `%s` SET ", guild_db);
-
- if (flag & GS_EMBLEM)
- {
- char * pData = emblem_data;
- strcat(t_info, " emblem");
- // Convert emblem_data to hex
- for(i=0; i<g->emblem_len; i++){
- *pData++ = dataToHex[(g->emblem_data[i] >> 4) & 0x0F];
- *pData++ = dataToHex[g->emblem_data[i] & 0x0F];
- }
- *pData = 0;
- sql_index += sprintf(tmp_sql + sql_index,"`emblem_len`=%d,`emblem_id`=%d,`emblem_data`='%s',",g->emblem_len,g->emblem_id,emblem_data);
- }
- if (flag & GS_BASIC)
- {
- strcat(t_info, " basic");
- sql_index += sprintf(tmp_sql + sql_index,"`name`='%s', `master`='%s', `char_id`=%d,",t_name,jstrescapecpy(t_master,g->master),g->member[0].char_id);
- }
- if (flag & GS_CONNECT)
- {
- strcat(t_info, " connect");
- sql_index += sprintf(tmp_sql + sql_index,"`connect_member`=%d,`average_lv`=%d,",g->connect_member, g->average_lv);
- }
- if (flag & GS_MES)
- {
- strcat(t_info, " mes");
- sql_index += sprintf(tmp_sql + sql_index,"`mes1`='%s',`mes2`='%s',",jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2));
- }
- if (flag & GS_LEVEL)
- {
- strcat(t_info, " level");
- sql_index += sprintf(tmp_sql + sql_index,"`guild_lv`=%d,`skill_point`=%d,`exp`=%u,`next_exp`=%u,`max_member`=%d,",g->guild_lv, g->skill_point, g->exp, g->next_exp, g->max_member);
- }
- sprintf(tmp_sql + sql_index -1," WHERE `guild_id`=%d", g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if (flag&GS_MEMBER)
- {
- struct guild_member *m;
- strcat(t_info, " members");
- // Update only needed players
- for(i=0;i<g->max_member;i++){
- m = &g->member[i];
-#ifndef TXT_SQL_CONVERT
- if (!m->modified)
- continue;
-#endif
- if(m->account_id) {
- //Since nothing references guild member table as foreign keys, it's safe to use REPLACE INTO
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`name`) "
- "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%u','%d','%d','%d','%s')",
- guild_member_db, g->guild_id, m->account_id,m->char_id,
- m->hair,m->hair_color,m->gender,
- m->class_,m->lv,m->exp,m->exp_payper,m->online,m->position,
- jstrescapecpy(t_member,m->name));
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- if (m->modified & GS_MEMBER_NEW)
- {
- sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '%d' WHERE `char_id` = '%d'",
- char_db, g->guild_id, m->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- m->modified = GS_MEMBER_UNMODIFIED;
- }
- }
- }
-
- if (flag&GS_POSITION){
- strcat(t_info, " positions");
- //printf("- Insert guild %d to guild_position\n",g->guild_id);
- for(i=0;i<MAX_GUILDPOSITION;i++){
- struct guild_position *p = &g->position[i];
-#ifndef TXT_SQL_CONVERT
- if (!p->modified)
- continue;
-#endif
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')",
- guild_position_db, g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- p->modified = GS_POSITION_UNMODIFIED;
- }
- }
-
- if (flag&GS_ALLIANCE)
- {
- // Delete current alliances
- // NOTE: no need to do it on both sides since both guilds in memory had
- // their info changed, not to mention this would also mess up oppositions!
- // [Skotlex]
-// sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- else
- {
- //printf("- Insert guild %d to guild_alliance\n",g->guild_id);
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- {
- struct guild_alliance *a=&g->alliance[i];
- if(a->guild_id>0)
- {
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
- "VALUES ('%d','%d','%d','%s')",
- guild_alliance_db, g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name));
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- }
- }
-
- if (flag&GS_EXPULSION){
- strcat(t_info, " expulsions");
- //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
- for(i=0;i<MAX_GUILDEXPULSION;i++){
- struct guild_expulsion *e=&g->expulsion[i];
- if(e->account_id>0){
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
- "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')",
- guild_expulsion_db, g->guild_id,
- jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 );
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- }
-
- if (flag&GS_SKILL){
- strcat(t_info, " skills");
- //printf("- Insert guild %d to guild_skill\n",g->guild_id);
- for(i=0;i<MAX_GUILDSKILL;i++){
- if (g->skill[i].id>0 && g->skill[i].lv>0){
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
- guild_skill_db, g->guild_id,g->skill[i].id,g->skill[i].lv);
- //printf("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- }
-
- if (save_log)
- ShowInfo("Saved guild (%d - %s):%s\n",g->guild_id,g->name,t_info);
- return 1;
-}
-#ifndef TXT_SQL_CONVERT
-// Read guild from sql
-struct guild * inter_guild_fromsql(int guild_id)
-{
- int i;
- char * pstr, * pEmblemData;
- struct guild *g;
-
- if (guild_id<=0) return NULL;
-
- g = idb_get(guild_db_,guild_id);
- if (g) return g;
-
- g = (struct guild*)aCalloc(sizeof(struct guild), 1);
-
-#ifdef NOISY
- ShowInfo("Guild load request (%d)...\n", guild_id);
-#endif
-
- sprintf(tmp_sql,"SELECT `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
- "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<1) {
- //Guild does not exists.
- if (sql_res) mysql_free_result(sql_res);
- aFree(g);
- return NULL;
- }
-
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL) {
- mysql_free_result(sql_res);
- aFree(g);
- return NULL;
- }
-
- g->guild_id=guild_id;
- strncpy(g->name,sql_row[0],NAME_LENGTH-1);
- strncpy(g->master,sql_row[1],NAME_LENGTH-1);
- g->guild_lv=atoi(sql_row[2]);
- g->connect_member=atoi(sql_row[3]);
- g->max_member = atoi(sql_row[4]);
- if (g->max_member > MAX_GUILD)
- { // Fix reduction of MAX_GUILD [PoW]
- ShowWarning("Guild %d:%s specifies higher capacity (%d) than MAX_GUILD (%d)\n", guild_id, g->name, g->max_member, MAX_GUILD);
- g->max_member = MAX_GUILD;
- }
- g->average_lv=atoi(sql_row[5]);
- g->exp=(unsigned int)atof(sql_row[6]);
- g->next_exp=(unsigned int)atof(sql_row[7]);
- g->skill_point=atoi(sql_row[8]);
- //There shouldn't be a need to copy the very last char, as it's the \0 [Skotlex]
- strncpy(g->mes1,sql_row[9],59);
- strncpy(g->mes2,sql_row[10],119);
- g->emblem_len=atoi(sql_row[11]);
- g->emblem_id=atoi(sql_row[12]);
- for(i=0,pstr=sql_row[13],pEmblemData=g->emblem_data; i < g->emblem_len; i++,pstr+=2){
- int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
- if(c1>='0' && c1<='9')
- x1=c1-'0';
- else if(c1>='a' && c1<='f')
- x1=c1-'a'+10;
- else if(c1>='A' && c1<='F')
- x1=c1-'A'+10;
- if(c2>='0' && c2<='9')
- x2=c2-'0';
- else if(c2>='a' && c2<='f')
- x2=c2-'a'+10;
- else if(c2>='A' && c2<='F')
- x2=c2-'A'+10;
- *pEmblemData++=(x1<<4)|x2;
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_member %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
- "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){
- struct guild_member *m = &g->member[i];
- m->account_id=atoi(sql_row[1]);
- m->char_id=atoi(sql_row[2]);
- m->hair=atoi(sql_row[3]);
- m->hair_color=atoi(sql_row[4]);
- m->gender=atoi(sql_row[5]);
- m->class_=atoi(sql_row[6]);
- m->lv=atoi(sql_row[7]);
- m->exp=strtoul(sql_row[8],NULL,10);
- m->exp_payper=atoi(sql_row[9]);
- m->online=atoi(sql_row[10]);
- m->position = atoi(sql_row[11]);
- if (m->position >= MAX_GUILDPOSITION) // Fix reduction of MAX_GUILDPOSITION [PoW]
- m->position = MAX_GUILDPOSITION - 1;
-
- strncpy(m->name,sql_row[14],NAME_LENGTH-1);
- m->modified = GS_MEMBER_UNMODIFIED;
- }
- mysql_free_result(sql_res);
- }
-
- //printf("- Read guild_position %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){
- int position = atoi(sql_row[1]);
- struct guild_position *p = &g->position[position];
- strncpy(p->name,sql_row[2],NAME_LENGTH-1);
- p->mode=atoi(sql_row[3]);
- p->exp_mode=atoi(sql_row[4]);
- p->modified = GS_POSITION_UNMODIFIED;
- }
- mysql_free_result(sql_res);
- }
-
- //printf("- Read guild_alliance %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){
- struct guild_alliance *a = &g->alliance[i];
- a->opposition=atoi(sql_row[1]);
- a->guild_id=atoi(sql_row[2]);
- strncpy(a->name,sql_row[3],NAME_LENGTH-1);
- }
- mysql_free_result(sql_res);
- }
-
- //printf("- Read guild_expulsion %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPULSION);i++){
- struct guild_expulsion *e = &g->expulsion[i];
-
- strncpy(e->name,sql_row[1],NAME_LENGTH-1);
- //No need to copy char 40, the null terminator. [Skotlex]
- strncpy(e->mes,sql_row[2],39);
- strncpy(e->acc,sql_row[3],39);
- e->account_id=atoi(sql_row[4]);
- e->rsv1=atoi(sql_row[5]);
- e->rsv2=atoi(sql_row[6]);
- e->rsv3=atoi(sql_row[7]);
- }
- mysql_free_result(sql_res);
- }
-
- //printf("- Read guild_skill %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
-
- for(i = 0; i < MAX_GUILDSKILL; i++)
- { //Skill IDs must always be initialized. [Skotlex]
- g->skill[i].id = i + GD_SKILLBASE;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))){
- int id = atoi(sql_row[1])-GD_SKILLBASE;
- if (id >= 0 && id < MAX_GUILDSKILL)
- //I know this seems ridiculous, but the skills HAVE to be placed on their 'correct' array slot or things break x.x [Skotlex]
- g->skill[id].lv=atoi(sql_row[2]);
- }
- mysql_free_result(sql_res);
- }
-
- idb_put(guild_db_, guild_id, g); //Add to cache
- g->save_flag |= GS_REMOVE; //But set it to be removed, in case it is not needed for long.
-
- if (save_log)
- ShowInfo("Guild loaded (%d - %s)\n", guild_id, g->name);
-
- return g;
-}
-
-#endif //TXT_SQL_CONVERT
-int inter_guildcastle_tosql(struct guild_castle *gc){
- // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`)
-
- if (gc==NULL) return 0;
- #ifdef GUILD_DEBUG
-ShowDebug("Save guild_castle (%d)\n", gc->castle_id);
- #endif
-
-// sql_query("DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
-
- sprintf(tmp_sql,"REPLACE INTO `%s` "
- "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`,"
- "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
- "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)"
- "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
- guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime,
- gc->createTime, gc->visibleC,
- gc->guardian[0].visible, gc->guardian[1].visible, gc->guardian[2].visible, gc->guardian[3].visible, gc->guardian[4].visible, gc->guardian[5].visible, gc->guardian[6].visible, gc->guardian[7].visible,
- gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp, gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
-#ifndef TXT_SQL_CONVERT
- memcpy(&castles[gc->castle_id],gc,sizeof(struct guild_castle));
-#endif //TXT_SQL_CONVERT
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-
-// Read guild_castle from sql
-int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
-{
- static int castles_init=0;
- if (gc==NULL) return 0;
- if (castle_id==-1) return 0;
-
- if(!castles_init)
- {
- int i;
- for(i=0;i<MAX_GUILDCASTLE;i++)
- castles[i].castle_id=-1;
- castles_init = 1;
- }
-
- if(castles[castle_id].castle_id == castle_id)
- {
- memcpy(gc,&castles[castle_id],sizeof(struct guild_castle));
- return 1;
- }
-
- memset(gc,0,sizeof(struct guild_castle));
- sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
- "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
- "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`"
- " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- // ARU: This needs to be set even if there are no SQL results
- gc->castle_id=castle_id;
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL){
- mysql_free_result(sql_res);
- return 1; //Assume empty castle.
- }
- gc->guild_id = atoi (sql_row[1]);
- gc->economy = atoi (sql_row[2]);
- gc->defense = atoi (sql_row[3]);
- gc->triggerE = atoi (sql_row[4]);
- gc->triggerD = atoi (sql_row[5]);
- gc->nextTime = atoi (sql_row[6]);
- gc->payTime = atoi (sql_row[7]);
- gc->createTime = atoi (sql_row[8]);
- gc->visibleC = atoi (sql_row[9]);
- gc->guardian[0].visible = atoi (sql_row[10]);
- gc->guardian[1].visible = atoi (sql_row[11]);
- gc->guardian[2].visible = atoi (sql_row[12]);
- gc->guardian[3].visible = atoi (sql_row[13]);
- gc->guardian[4].visible = atoi (sql_row[14]);
- gc->guardian[5].visible = atoi (sql_row[15]);
- gc->guardian[6].visible = atoi (sql_row[16]);
- gc->guardian[7].visible = atoi (sql_row[17]);
- gc->guardian[0].hp = atoi (sql_row[18]);
- gc->guardian[1].hp = atoi (sql_row[19]);
- gc->guardian[2].hp = atoi (sql_row[20]);
- gc->guardian[3].hp = atoi (sql_row[21]);
- gc->guardian[4].hp = atoi (sql_row[22]);
- gc->guardian[5].hp = atoi (sql_row[23]);
- gc->guardian[6].hp = atoi (sql_row[24]);
- gc->guardian[7].hp = atoi (sql_row[25]);
-
- if (save_log)
- ShowInfo("Loaded Castle %d (guild %d)\n",castle_id,gc->guild_id);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- memcpy(&castles[castle_id],gc,sizeof(struct guild_castle));
-
- return 1;
-}
-
-
-// Read exp_guild.txt
-int inter_guild_ReadEXP(void)
-{
- int i;
- FILE *fp;
- char line[1024];
- for (i=0;i<100;i++) guild_exp[i]=0;
-
- sprintf(line, "%s/exp_guild.txt", db_path);
- fp=fopen(line,"r");
- if(fp==NULL){
- ShowError("can't read %s\n", line);
- return 1;
- }
- i=0;
- while(fgets(line,256,fp) && i<100){
- if(line[0]=='/' && line[1]=='/')
- continue;
- guild_exp[i]=(unsigned int)atof(line);
- i++;
- }
- fclose(fp);
-
- return 0;
-}
-
-
-int inter_guild_CharOnline(int char_id, int guild_id) {
-
- struct guild *g;
- int i;
-
- if (guild_id == -1) {
- //Get guild_id from the database
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No guild?
-
- sql_row = mysql_fetch_row(sql_res);
- guild_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
- }
- if (guild_id == 0)
- return 0; //No guild...
-
- g = inter_guild_fromsql(guild_id);
- if(!g) {
- ShowError("Character %d's guild %d not found!\n", char_id, guild_id);
- return 0;
- }
-
- //Member has logged in before saving, tell saver not to delete
- if(g->save_flag & GS_REMOVE)
- g->save_flag &= ~GS_REMOVE;
-
- //Set member online
- for(i=0; i<g->max_member; i++) {
- if (g->member[i].char_id == char_id) {
- g->member[i].online = 1;
- g->member[i].modified = GS_MEMBER_MODIFIED;
- break;
- }
- }
- return 1;
-}
-
-int inter_guild_CharOffline(int char_id, int guild_id) {
- struct guild *g=NULL;
- int online_count=0, i;
-
- if (guild_id == -1) {
- //Get guild_id from the database
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No guild?
-
- sql_row = mysql_fetch_row(sql_res);
- guild_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
- }
- if (guild_id == 0)
- return 0; //No guild...
-
- //Character has a guild, set character offline and check if they were the only member online
- g = inter_guild_fromsql(guild_id);
- if (g == NULL) //Guild not found?
- return 0;
-
- //Set member offline
- for(i=0; i<g->max_member; i++) {
- if(g->member[i].char_id == char_id)
- {
- g->member[i].online = 0;
- g->member[i].modified = GS_MEMBER_MODIFIED;
- }
- if(g->member[i].online && !online_count)
- online_count++;
- }
-
- // Remove guild from memory if no players online
- if(online_count == 0)
- g->save_flag |= GS_REMOVE;
-
- return 1;
-}
-
-// Initialize guild sql
-int inter_guild_sql_init(void)
-{
- //Initialize the guild cache
- guild_db_= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- //Read exp file
- inter_guild_ReadEXP();
-
- add_timer_func_list(guild_save_timer, "guild_save_timer");
- add_timer(gettick() + 10000, guild_save_timer, 0, 0);
- return 0;
-}
-
-static int guild_db_final(DBKey key, void *data, va_list ap)
-{
- struct guild *g = (struct guild*)data;
- if (g->save_flag&GS_MASK) {
- inter_guild_tosql(g, g->save_flag&GS_MASK);
- return 1;
- }
- return 0;
-}
-
-void inter_guild_sql_final(void)
-{
- guild_db_->destroy(guild_db_, guild_db_final);
- return;
-}
-
-// Get guild_id by its name. Returns 0 if not found, -1 on error.
-int search_guildname(char *str)
-{
- int guild_id;
- char t_name[NAME_LENGTH*2];
-
- jstrescapecpy(t_name, str);
- //Lookup guilds with the same name
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE name='%s'", guild_db, t_name);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return -1;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
-
- guild_id = (sql_row&&sql_res&&sql_row[0])?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
- return guild_id;
-}
-
-// Check if guild is empty
-int guild_check_empty(struct guild *g)
-{
- int i;
- for(i=0;i<g->max_member;i++){
- if(g->member[i].account_id>0){
- return 0;
- }
- }
- //Let the calling function handle the guild removal in case they need
- //to do something else with it before freeing the data. [Skotlex]
- return 1;
-}
-
-unsigned int guild_nextexp(int level)
-{
- if (level == 0)
- return 1;
- if (level < 100 && level > 0) // Change by hack
- return guild_exp[level-1];
-
- return 0;
-}
-
-int guild_checkskill(struct guild *g,int id) {
-
- int idx = id - GD_SKILLBASE;
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
-
- return g->skill[idx].lv;
-}
-
-int guild_calcinfo(struct guild *g)
-{
- int i,c;
- unsigned int nextexp;
- struct guild before = *g; // Save guild current values
-
- if(g->guild_lv<=0)
- g->guild_lv = 1;
- nextexp = guild_nextexp(g->guild_lv);
-
- // Consume guild exp and increase guild level
- while(g->exp >= nextexp && nextexp > 0){ //fixed guild exp overflow [Kevin]
- g->exp-=nextexp;
- g->guild_lv++;
- g->skill_point++;
- nextexp = guild_nextexp(g->guild_lv);
- }
-
- // Save next exp step
- g->next_exp = nextexp;
-
- // Set the max number of members, Guild Extention skill - currently adds 6 to max per skill lv.
- g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6;
- if(g->max_member > MAX_GUILD)
- {
- ShowError("Guild %d:%s has capacity for too many guild members (%d), max supported is %d\n", g->guild_id, g->name, g->max_member, MAX_GUILD);
- g->max_member = MAX_GUILD;
- }
-
- // Compute the guild average level level
- g->average_lv=0;
- g->connect_member=0;
- for(i=c=0;i<g->max_member;i++)
- {
- if(g->member[i].account_id>0)
- {
- if (g->member[i].lv >= 0)
- {
- g->average_lv+=g->member[i].lv;
- c++;
- }
- else
- {
- ShowWarning("Guild %d:%s, member %d:%s has an invalid level %d\n", g->guild_id, g->name, g->member[i].char_id, g->member[i].name, g->member[i].lv);
- }
-
- if(g->member[i].online)
- g->connect_member++;
- }
- }
- if(c)
- g->average_lv /= c;
-
- // Check if guild stats has change
- if(g->max_member != before.max_member || g->guild_lv != before.guild_lv || g->skill_point != before.skill_point )
- {
- g->save_flag |= GS_LEVEL;
- mapif_guild_info(-1,g);
- return 1;
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// Packet sent to map server
-
-int mapif_guild_created(int fd,int account_id,struct guild *g)
-{
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0)=0x3830;
- WFIFOL(fd,2)=account_id;
- if(g != NULL)
- {
- WFIFOL(fd,6)=g->guild_id;
- ShowInfo("int_guild: Guild created (%d - %s)\n",g->guild_id,g->name);
- } else
- WFIFOL(fd,6)=0;
-
- WFIFOSET(fd,10);
- return 0;
-}
-// Guild not found
-int mapif_guild_noinfo(int fd,int guild_id)
-{
- unsigned char buf[12];
- WBUFW(buf,0)=0x3831;
- WBUFW(buf,2)=8;
- WBUFL(buf,4)=guild_id;
- ShowWarning("int_guild: info not found %d\n",guild_id);
- if(fd<0)
- mapif_sendall(buf,8);
- else
- mapif_send(fd,buf,8);
- return 0;
-}
-
-// Send guild info
-int mapif_guild_info(int fd,struct guild *g)
-{
- unsigned char buf[8+sizeof(struct guild)];
- WBUFW(buf,0)=0x3831;
- WBUFW(buf,2)=4+sizeof(struct guild);
- memcpy(buf+4,g,sizeof(struct guild));
- if(fd<0)
- mapif_sendall(buf,WBUFW(buf,2));
- else
- mapif_send(fd,buf,WBUFW(buf,2));
- return 0;
-}
-
-// ACK member add
-int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag)
-{
- WFIFOHEAD(fd, 15);
- WFIFOW(fd,0)=0x3832;
- WFIFOL(fd,2)=guild_id;
- WFIFOL(fd,6)=account_id;
- WFIFOL(fd,10)=char_id;
- WFIFOB(fd,14)=flag;
- WFIFOSET(fd,15);
- return 0;
-}
-
-// ACK member leave
-int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag, const char *name, const char *mes)
-{
- unsigned char buf[55+NAME_LENGTH];
- WBUFW(buf, 0)=0x3834;
- WBUFL(buf, 2)=guild_id;
- WBUFL(buf, 6)=account_id;
- WBUFL(buf,10)=char_id;
- WBUFB(buf,14)=flag;
- memcpy(WBUFP(buf,15),mes,40);
- memcpy(WBUFP(buf,55),name,NAME_LENGTH);
- mapif_sendall(buf,55+NAME_LENGTH);
- ShowInfo("int_guild: guild leaved (%d - %d: %s - %s)\n",guild_id,account_id,name,mes);
- return 0;
-}
-
-// Send short member's info
-int mapif_guild_memberinfoshort(struct guild *g,int idx)
-{
- unsigned char buf[19];
- WBUFW(buf, 0)=0x3835;
- WBUFL(buf, 2)=g->guild_id;
- WBUFL(buf, 6)=g->member[idx].account_id;
- WBUFL(buf,10)=g->member[idx].char_id;
- WBUFB(buf,14)=(unsigned char)g->member[idx].online;
- WBUFW(buf,15)=g->member[idx].lv;
- WBUFW(buf,17)=g->member[idx].class_;
- mapif_sendall(buf,19);
- return 0;
-}
-
-// Send guild broken
-int mapif_guild_broken(int guild_id,int flag)
-{
- unsigned char buf[7];
- WBUFW(buf,0)=0x3836;
- WBUFL(buf,2)=guild_id;
- WBUFB(buf,6)=flag;
- mapif_sendall(buf,7);
- ShowInfo("int_guild: Guild broken (%d)\n",guild_id);
- return 0;
-}
-
-// Send guild message
-int mapif_guild_message(int guild_id,int account_id,char *mes,int len, int sfd)
-{
- unsigned char buf[512];
- if (len > 500)
- len = 500;
- WBUFW(buf,0)=0x3837;
- WBUFW(buf,2)=len+12;
- WBUFL(buf,4)=guild_id;
- WBUFL(buf,8)=account_id;
- memcpy(WBUFP(buf,12),mes,len);
- mapif_sendallwos(sfd, buf,len+12);
- return 0;
-}
-
-// Send basic info
-int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len)
-{
- unsigned char buf[2048];
- if (len > 2038)
- len = 2038;
- WBUFW(buf, 0)=0x3839;
- WBUFW(buf, 2)=len+10;
- WBUFL(buf, 4)=guild_id;
- WBUFW(buf, 8)=type;
- memcpy(WBUFP(buf,10),data,len);
- mapif_sendall(buf,len+10);
- return 0;
-}
-
-// Send member info
-int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id, int type,const void *data,int len)
-{
- unsigned char buf[2048];
- if (len > 2030)
- len = 2030;
- WBUFW(buf, 0)=0x383a;
- WBUFW(buf, 2)=len+18;
- WBUFL(buf, 4)=guild_id;
- WBUFL(buf, 8)=account_id;
- WBUFL(buf,12)=char_id;
- WBUFW(buf,16)=type;
- memcpy(WBUFP(buf,18),data,len);
- mapif_sendall(buf,len+18);
- return 0;
-}
-
-// ACK guild skill up
-int mapif_guild_skillupack(int guild_id,int skill_num,int account_id)
-{
- unsigned char buf[14];
- WBUFW(buf, 0)=0x383c;
- WBUFL(buf, 2)=guild_id;
- WBUFL(buf, 6)=skill_num;
- WBUFL(buf,10)=account_id;
- mapif_sendall(buf,14);
- return 0;
-}
-
-// ACK guild alliance
-int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2)
-{
- unsigned char buf[19+2*NAME_LENGTH];
- WBUFW(buf, 0)=0x383d;
- WBUFL(buf, 2)=guild_id1;
- WBUFL(buf, 6)=guild_id2;
- WBUFL(buf,10)=account_id1;
- WBUFL(buf,14)=account_id2;
- WBUFB(buf,18)=flag;
- memcpy(WBUFP(buf,19),name1,NAME_LENGTH);
- memcpy(WBUFP(buf,19+NAME_LENGTH),name2,NAME_LENGTH);
- mapif_sendall(buf,19+2*NAME_LENGTH);
- return 0;
-}
-
-// Send a guild position desc
-int mapif_guild_position(struct guild *g,int idx)
-{
- unsigned char buf[12 + sizeof(struct guild_position)];
- WBUFW(buf,0)=0x383b;
- WBUFW(buf,2)=sizeof(struct guild_position)+12;
- WBUFL(buf,4)=g->guild_id;
- WBUFL(buf,8)=idx;
- memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position));
- mapif_sendall(buf,WBUFW(buf,2));
- return 0;
-}
-
-// Send the guild notice
-int mapif_guild_notice(struct guild *g)
-{
- unsigned char buf[256];
- WBUFW(buf,0)=0x383e;
- WBUFL(buf,2)=g->guild_id;
- memcpy(WBUFP(buf,6),g->mes1,60);
- memcpy(WBUFP(buf,66),g->mes2,120);
- mapif_sendall(buf,186);
- return 0;
-}
-
-// Send emblem data
-int mapif_guild_emblem(struct guild *g)
-{
- unsigned char buf[12 + sizeof(g->emblem_data)];
- WBUFW(buf,0)=0x383f;
- WBUFW(buf,2)=g->emblem_len+12;
- WBUFL(buf,4)=g->guild_id;
- WBUFL(buf,8)=g->emblem_id;
- memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len);
- mapif_sendall(buf,WBUFW(buf,2));
- return 0;
-}
-
-int mapif_guild_master_changed(struct guild *g, int position)
-{
- unsigned char buf[10];
- WBUFW(buf,0)=0x3843;
- WBUFL(buf,2)=g->guild_id;
- WBUFL(buf,6)=position;
- mapif_sendall(buf,10);
- return 0;
-}
-
-int mapif_guild_castle_dataload(int castle_id,int index,int value) // <Agit>
-{
- unsigned char buf[9];
- WBUFW(buf, 0)=0x3840;
- WBUFW(buf, 2)=castle_id;
- WBUFB(buf, 4)=index;
- WBUFL(buf, 5)=value;
- mapif_sendall(buf,9);
- return 0;
-}
-
-int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit>
-{
- unsigned char buf[9];
- WBUFW(buf, 0)=0x3841;
- WBUFW(buf, 2)=castle_id;
- WBUFB(buf, 4)=index;
- WBUFL(buf, 5)=value;
- mapif_sendall(buf,9);
- return 0;
-}
-
-int mapif_guild_castle_alldataload(int fd) {
- struct guild_castle* gc = (struct guild_castle *)aMalloc(sizeof(struct guild_castle));
- int i, len = 4;
- WFIFOHEAD(fd, len + MAX_GUILDCASTLE*sizeof(struct guild_castle));
- WFIFOW(fd,0) = 0x3842;
- sprintf(tmp_sql,"SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) {
- memset(gc, 0, sizeof(struct guild_castle));
- gc->castle_id = atoi(sql_row[0]);
- gc->guild_id = atoi(sql_row[1]);
- gc->economy = atoi(sql_row[2]);
- gc->defense = atoi(sql_row[3]);
- gc->triggerE = atoi(sql_row[4]);
- gc->triggerD = atoi(sql_row[5]);
- gc->nextTime = atoi(sql_row[6]);
- gc->payTime = atoi(sql_row[7]);
- gc->createTime = atoi(sql_row[8]);
- gc->visibleC = atoi(sql_row[9]);
- gc->guardian[0].visible = atoi(sql_row[10]);
- gc->guardian[1].visible = atoi(sql_row[11]);
- gc->guardian[2].visible = atoi(sql_row[12]);
- gc->guardian[3].visible = atoi(sql_row[13]);
- gc->guardian[4].visible = atoi(sql_row[14]);
- gc->guardian[5].visible = atoi(sql_row[15]);
- gc->guardian[6].visible = atoi(sql_row[16]);
- gc->guardian[7].visible = atoi(sql_row[17]);
- gc->guardian[0].visible = atoi(sql_row[18]);
- gc->guardian[1].visible = atoi(sql_row[19]);
- gc->guardian[2].visible = atoi(sql_row[20]);
- gc->guardian[3].visible = atoi(sql_row[21]);
- gc->guardian[4].visible = atoi(sql_row[22]);
- gc->guardian[5].visible = atoi(sql_row[23]);
- gc->guardian[6].visible = atoi(sql_row[24]);
- gc->guardian[7].visible = atoi(sql_row[25]);
- memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle));
- len += sizeof(struct guild_castle);
- }
- mysql_free_result(sql_res);
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
-
- aFree(gc);
-
- return 0;
-}
-
-
-//-------------------------------------------------------------------
-// Packet received from map server
-
-
-// ƒMƒ‹ƒh쬗v‹
-int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master)
-{
- struct guild *g;
- int i=0;
-#ifdef NOISY
- ShowInfo("Creating Guild (%s)\n", name);
-#endif
- if(search_guildname(name) != 0){
- ShowInfo("int_guild: guild with same name exists [%s]\n",name);
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- }
-
- g = (struct guild *)aMalloc(sizeof(struct guild));
- memset(g,0,sizeof(struct guild));
-
- memcpy(g->name,name,NAME_LENGTH);
- memcpy(g->master,master->name,NAME_LENGTH);
- memcpy(&g->member[0],master,sizeof(struct guild_member));
- g->member[0].modified = GS_MEMBER_MODIFIED;
-
- // Set default positions
- g->position[0].mode=0x11;
- strcpy(g->position[0].name,"GuildMaster");
- strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
- for(i=1;i<MAX_GUILDPOSITION-1;i++)
- sprintf(g->position[i].name,"Position %d",i+1);
-
- // Initialize guild property
- g->max_member=16;
- g->average_lv=master->lv;
- for(i=0;i<MAX_GUILDSKILL;i++)
- g->skill[i].id=i + GD_SKILLBASE;
- g->guild_id= -1; //Request to create guild.
-
- // Create the guild
- if (!inter_guild_tosql(g,GS_BASIC|GS_POSITION|GS_SKILL)) {
- //Failed to Create guild....
- ShowError("Failed to create Guild %s (Guild Master: %s)\n", g->name, g->master);
- mapif_guild_created(fd,account_id,NULL);
- aFree(g);
- return 0;
- }
- ShowInfo("Created Guild %d - %s (Guild Master: %s)\n", g->guild_id, g->name, g->master);
-
- //Add to cache
- idb_put(guild_db_, g->guild_id, g);
-
- // Report to client
- mapif_guild_created(fd,account_id,g);
- mapif_guild_info(fd,g);
-
- if(log_inter)
- inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
- name, g->guild_id, master->name, master->account_id );
-
- return 0;
-}
-
-// Return guild info to client
-int mapif_parse_GuildInfo(int fd,int guild_id)
-{
- struct guild * g = inter_guild_fromsql(guild_id); //We use this because on start-up the info of castle-owned guilds is requied. [Skotlex]
- if(g)
- {
- if (!guild_calcinfo(g))
- mapif_guild_info(fd,g);
- }
- else
- mapif_guild_noinfo(fd,guild_id); // Failed to load info
- return 0;
-}
-
-// Add member to guild
-int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
-{
- struct guild * g;
- int i;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL){
- // Failed to add
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
- return 0;
- }
-
- // Find an empty slot
- for(i=0;i<g->max_member;i++)
- {
- if(g->member[i].account_id==0)
- {
- memcpy(&g->member[i],m,sizeof(struct guild_member));
- g->member[i].modified = (GS_MEMBER_NEW | GS_MEMBER_MODIFIED);
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0);
- if (!guild_calcinfo(g)) //Send members if it was not invoked.
- mapif_guild_info(fd,g);
-
- g->save_flag |= GS_MEMBER;
- if (g->save_flag&GS_REMOVE)
- g->save_flag&=~GS_REMOVE;
- return 0;
- }
- }
-
- // Failed to add
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
- return 0;
-}
-
-// Delete member from guild
-int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes)
-{
- struct guild * g = inter_guild_fromsql(guild_id);
-
- if(g){
- int i;
- // Find the member
- for(i=0;i<g->max_member;i++){
- if( g->member[i].account_id==account_id && g->member[i].char_id==char_id)
- {
- if(flag)
- {
- // Write expulsion reason
- int j;
- // Find an empty slot
- for(j=0;j<MAX_GUILDEXPULSION;j++){
- if(g->expulsion[j].account_id==0)
- break;
- }
- // Expulsion list is full, flush the oldest one
- if(j==MAX_GUILDEXPULSION){
- for(j=0;j<MAX_GUILDEXPULSION-1;j++)
- g->expulsion[j]=g->expulsion[j+1];
- j=MAX_GUILDEXPULSION-1;
- }
- // Save the expulsion
- g->expulsion[j].account_id=account_id;
- memcpy(g->expulsion[j].acc,"dummy",NAME_LENGTH-1);
- memcpy(g->expulsion[j].name,g->member[i].name,NAME_LENGTH-1);
- memcpy(g->expulsion[j].mes,mes,40);
- }
-
- mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes);
- inter_guild_removemember_tosql(g->member[i].account_id,g->member[i].char_id);
-
- memset(&g->member[i],0,sizeof(struct guild_member));
-
- if(!guild_check_empty(g)) {
- break;
- }
- //Guild empty? break it.
- mapif_parse_BreakGuild(-1,guild_id); //Break the guild.
- return 0;
- }
- }
- //Update member info.
- if (!guild_calcinfo(g))
- mapif_guild_info(fd,g);
- g->save_flag |= GS_EXPULSION;
- }else{
- // Unknown guild, just update the player
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */
- }
-
- return 0;
-}
-
-// Change member info
-int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
- int account_id,int char_id,int online,int lv,int class_)
-{
- // Could speed up by manipulating only guild_member
- struct guild * g;
- int i,alv,c;
- int prev_count;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- prev_count = g->connect_member;
- g->connect_member=0;
-
- for(i=0,alv=0,c=0;i<g->max_member;i++)
- {
- // Found the member
- if(g->member[i].account_id==account_id && g->member[i].char_id==char_id)
- {
- g->member[i].online=online;
- g->member[i].lv=lv;
- g->member[i].class_=class_;
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfoshort(g,i);
- }
- if( g->member[i].account_id>0 )
- {
- if (g->member[i].lv > 0)
- {
- alv+=g->member[i].lv;
- c++;
- }
- else
- {
- ShowWarning("Guild %d:%s, member %d:%s has an invalid level %d\n", g->guild_id, g->name, g->member[i].char_id, g->member[i].name, g->member[i].lv);
- }
- }
- if( g->member[i].online )
- g->connect_member++;
- }
-
- if (c)
- {
- alv = alv/c;
- if (g->connect_member != prev_count || g->average_lv != alv)
- {
- g->average_lv=alv;
- g->save_flag |= GS_CONNECT;
- }
- if (g->save_flag & GS_REMOVE)
- g->save_flag &= ~GS_REMOVE;
- }
- g->save_flag |= GS_MEMBER; //Update guild member data
- return 0;
-}
-
-// BreakGuild
-int mapif_parse_BreakGuild(int fd,int guild_id)
-{
- struct guild * g;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- // Delete guild from sql
- //printf("- Delete guild %d from guild\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, guild_id, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //printf("- Update guild %d of char\n",guild_id);
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- mapif_guild_broken(guild_id,0);
-
- if(log_inter)
- inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id);
-
- //Remove the guild from memory. [Skotlex]
- idb_remove(guild_db_, guild_id);
- return 0;
-}
-
-// Forward Guild message to others map servers
-int mapif_parse_GuildMessage(int fd,int guild_id,int account_id,char *mes,int len)
-{
- return mapif_guild_message(guild_id,account_id,mes,len, fd);
-}
-
-// Modification of the guild
-int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,int type,const char *data,int len)
-{
- struct guild * g;
- short dw=*((short *)data);
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- switch(type)
- {
- case GBI_GUILDLV:
- ShowDebug("GBI_GUILDLV\n");
- if(dw>0 && g->guild_lv+dw<=50)
- {
- g->guild_lv+=dw;
- g->skill_point+=dw;
- }
- else if(dw<0 && g->guild_lv+dw>=1)
- g->guild_lv+=dw;
- mapif_guild_info(-1,g);
- g->save_flag |= GS_LEVEL;
- return 0;
- default:
- ShowError("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
- break;
- }
- mapif_guild_basicinfochanged(guild_id,type,data,len);
- return 0;
-}
-
-// Modification of the guild
-int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int char_id,
- int type,const char *data,int len)
-{
- // Could make some improvement in speed, because only change guild_member
- int i;
- struct guild * g;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- // Search the member
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id )
- break;
-
- // Not Found
- if(i==g->max_member){
- ShowWarning("int_guild: GuildMemberChange: Not found %d,%d in guild (%d - %s)\n",
- account_id,char_id,guild_id,g->name);
- return 0;
- }
-
- switch(type)
- {
- case GMI_POSITION:
- {
- g->member[i].position=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER;
- break;
- }
- case GMI_EXP:
- { // EXP
- unsigned int exp, old_exp=g->member[i].exp;
- g->member[i].exp=*((unsigned int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- if (g->member[i].exp > old_exp)
- {
- exp = g->member[i].exp - old_exp;
-
- // Compute gained exp
- if (guild_exp_rate != 100)
- exp = exp*guild_exp_rate/100;
-
- // Update guild exp
- if (exp > UINT_MAX - g->exp)
- g->exp = UINT_MAX;
- else
- g->exp+=exp;
-
- guild_calcinfo(g);
- mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
- g->save_flag |= GS_LEVEL;
- }
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER;
- break;
- }
- case GMI_HAIR:
- {
- g->member[i].hair=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER; //Save new data.
- break;
- }
- case GMI_HAIR_COLOR:
- {
- g->member[i].hair_color=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER; //Save new data.
- break;
- }
- case GMI_GENDER:
- {
- g->member[i].gender=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER; //Save new data.
- break;
- }
- case GMI_CLASS:
- {
- g->member[i].class_=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER; //Save new data.
- break;
- }
- case GMI_LEVEL:
- {
- g->member[i].lv=*((int *)data);
- g->member[i].modified = GS_MEMBER_MODIFIED;
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- g->save_flag |= GS_MEMBER; //Save new data.
- break;
- }
- default:
- ShowError("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
- break;
- }
- return 0;
-}
-
-int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender)
-{
- return mapif_parse_GuildMemberInfoChange(0, guild_id, account_id, char_id, GMI_GENDER, (const char*)&gender, sizeof(gender));
-}
-
-// Change a position desc
-int mapif_parse_GuildPosition(int fd,int guild_id,int idx,struct guild_position *p)
-{
- // Could make some improvement in speed, because only change guild_position
- struct guild * g;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION)
- return 0;
-
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- mapif_guild_position(g,idx);
- ShowInfo("int_guild: position data changed (Guild %d, position %d)\n",guild_id, idx);
- g->position[idx].modified = GS_POSITION_MODIFIED;
- g->save_flag |= GS_POSITION; // Change guild_position
- return 0;
-}
-
-// Guild Skill UP
-int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id)
-{
- struct guild * g;
- int idx = skill_num - GD_SKILLBASE;
-
- g = inter_guild_fromsql(guild_id);
- if(g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
-
- if(g->skill_point>0 && g->skill[idx].id>0 && g->skill[idx].lv<10 )
- {
- g->skill[idx].lv++;
- g->skill_point--;
- if (!guild_calcinfo(g))
- mapif_guild_info(-1,g);
- mapif_guild_skillupack(guild_id,skill_num,account_id);
- g->save_flag |= (GS_LEVEL|GS_SKILL); // Change guild & guild_skill
- }
- return 0;
-}
-
-//Manual deletion of an alliance when partnering guild does not exists. [Skotlex]
-static int mapif_parse_GuildDeleteAlliance(struct guild *g, int guild_id, int account_id1, int account_id2, int flag)
-{
- int i;
- char name[NAME_LENGTH];
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- if(g->alliance[i].guild_id == guild_id)
- {
- strcpy(name, g->alliance[i].name);
- g->alliance[i].guild_id=0;
- break;
- }
- if (i == MAX_GUILDALLIANCE)
- return -1;
-
- mapif_guild_alliance(g->guild_id,guild_id,account_id1,account_id2,flag,g->name,name);
- g->save_flag |= GS_ALLIANCE;
- return 0;
-}
-
-// Alliance modification
-int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2,
- int account_id1,int account_id2,int flag)
-{
- // Could speed up
- struct guild *g[2];
- int j,i;
- g[0] = inter_guild_fromsql(guild_id1);
- g[1] = inter_guild_fromsql(guild_id2);
-
- if(g[0] && g[1]==NULL && (flag & GUILD_ALLIANCE_REMOVE)) //Requested to remove an alliance with a not found guild.
- return mapif_parse_GuildDeleteAlliance(g[0], guild_id2, account_id1, account_id2, flag); //Try to do a manual removal of said guild.
-
- if(g[0]==NULL || g[1]==NULL)
- return 0;
-
- if(flag&GUILD_ALLIANCE_REMOVE)
- {
- // Remove alliance/opposition, in case of alliance, remove on both side
- for(i=0;i<2-(flag&GUILD_ALLIANCE_TYPE_MASK);i++)
- {
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- {
- if(g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag&GUILD_ALLIANCE_TYPE_MASK))
- {
- g[i]->alliance[j].guild_id=0;
- break;
- }
- }
- }
- }
- else
- {
- // Add alliance, in case of alliance, add on both side
- for(i=0;i<2-(flag&GUILD_ALLIANCE_TYPE_MASK);i++)
- {
- // Search an empty slot
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- {
- if(g[i]->alliance[j].guild_id==0)
- {
- g[i]->alliance[j].guild_id=g[1-i]->guild_id;
- memcpy(g[i]->alliance[j].name,g[1-i]->name,NAME_LENGTH-1);
- // Set alliance type
- g[i]->alliance[j].opposition = flag&GUILD_ALLIANCE_TYPE_MASK;
- break;
- }
- }
- }
- }
-
- // Send on all map the new alliance/opposition
- mapif_guild_alliance(guild_id1,guild_id2,account_id1,account_id2,flag,g[0]->name,g[1]->name);
-
- // Mark the two guild to be saved
- g[0]->save_flag |= GS_ALLIANCE;
- g[1]->save_flag |= GS_ALLIANCE;
- return 0;
-}
-
-// Change guild message
-int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes2)
-{
- struct guild *g;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- memcpy(g->mes1,mes1,60);
- memcpy(g->mes2,mes2,120);
- g->save_flag |= GS_MES; //Change mes of guild
- return mapif_guild_notice(g);
-}
-
-int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data)
-{
- struct guild * g;
-
- g = inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- if (len > sizeof(g->emblem_data))
- len = sizeof(g->emblem_data);
-
- memcpy(g->emblem_data,data,len);
- g->emblem_len=len;
- g->emblem_id++;
- g->save_flag |= GS_EMBLEM; //Change guild
- return mapif_guild_emblem(g);
-}
-
-int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
-{
- struct guild_castle gc;
- if (!inter_guildcastle_fromsql(castle_id, &gc)) {
- return mapif_guild_castle_dataload(castle_id,0,0);
- }
- switch(index){
- case 1: return mapif_guild_castle_dataload(gc.castle_id,index,gc.guild_id); break;
- case 2: return mapif_guild_castle_dataload(gc.castle_id,index,gc.economy); break;
- case 3: return mapif_guild_castle_dataload(gc.castle_id,index,gc.defense); break;
- case 4: return mapif_guild_castle_dataload(gc.castle_id,index,gc.triggerE); break;
- case 5: return mapif_guild_castle_dataload(gc.castle_id,index,gc.triggerD); break;
- case 6: return mapif_guild_castle_dataload(gc.castle_id,index,gc.nextTime); break;
- case 7: return mapif_guild_castle_dataload(gc.castle_id,index,gc.payTime); break;
- case 8: return mapif_guild_castle_dataload(gc.castle_id,index,gc.createTime); break;
- case 9: return mapif_guild_castle_dataload(gc.castle_id,index,gc.visibleC); break;
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- return mapif_guild_castle_dataload(gc.castle_id,index,gc.guardian[index-10].visible); break;
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- return mapif_guild_castle_dataload(gc.castle_id,index,gc.guardian[index-18].hp); break;
- default:
- ShowError("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-}
-
-int mapif_parse_GuildCastleDataSave(int fd,int castle_id,int index,int value) // <Agit>
-{
- struct guild_castle gc;
- if(!inter_guildcastle_fromsql(castle_id, &gc))
- return mapif_guild_castle_datasave(castle_id,index,value);
-
- switch(index){
- case 1:
- if( gc.guild_id!=value ){
- int gid=(value)?value:gc.guild_id;
- struct guild *g=idb_get(guild_db_, gid);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", castle_id);
- }
- gc.guild_id = value;
- if(gc.guild_id == 0) {
- //Delete guardians.
- memset(&gc.guardian, 0, sizeof(gc.guardian));
- }
- break;
- case 2: gc.economy = value; break;
- case 3: gc.defense = value; break;
- case 4: gc.triggerE = value; break;
- case 5: gc.triggerD = value; break;
- case 6: gc.nextTime = value; break;
- case 7: gc.payTime = value; break;
- case 8: gc.createTime = value; break;
- case 9: gc.visibleC = value; break;
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- gc.guardian[index-10].visible = value; break;
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- gc.guardian[index-18].hp = value; break; // end additions [Valaris]
- default:
- ShowError("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- inter_guildcastle_tosql(&gc);
- mapif_guild_castle_datasave(gc.castle_id,index,value);
- return 0;
-}
-
-int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int len)
-{
- struct guild * g;
- struct guild_member gm;
- int pos;
-
- g = inter_guild_fromsql(guild_id);
-
- if(g==NULL || len > NAME_LENGTH)
- return 0;
-
- // Find member (name)
- for (pos = 0; pos < g->max_member && strncmp(g->member[pos].name, name, len); pos++);
-
- if (pos == g->max_member)
- return 0; //Character not found??
-
- // Switch current and old GM
- memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
- memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
- memcpy(&g->member[0], &gm, sizeof(struct guild_member));
-
- // Switch positions
- g->member[pos].position = g->member[0].position;
- g->member[pos].modified = GS_MEMBER_MODIFIED;
- g->member[0].position = 0; //Position 0: guild Master.
- g->member[0].modified = GS_MEMBER_MODIFIED;
-
- strncpy(g->master, name, len);
- if (len < NAME_LENGTH)
- g->master[len] = '\0';
-
- ShowInfo("int_guild: Guildmaster Changed to %s (Guild %d - %s)\n",g->master, guild_id, g->name);
- g->save_flag |= (GS_BASIC|GS_MEMBER); //Save main data and member data.
- return mapif_guild_master_changed(g, pos);
-}
-
-// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
-int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id)
-{
- // What does this mean? Check if belong to another guild?
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_guild_parse_frommap(int fd)
-{
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)){
- case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),(char*)RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break;
- case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break;
- case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break;
- case 0x3033: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
- case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),(const char*)RFIFOP(fd,15)); break;
- case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break;
- case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break;
- case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
- case 0x3038: mapif_parse_GuildCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),(const char*)RFIFOP(fd,10),RFIFOW(fd,2)-10); break;
- case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),(const char*)RFIFOP(fd,18),RFIFOW(fd,2)-18); break;
- case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break;
- case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
- case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break;
- case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),(const char*)RFIFOP(fd,6),(const char*)RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),(const char*)RFIFOP(fd,12)); break;
- case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break;
- case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break;
-
- default:
- return 0;
- }
- return 1;
-}
-
-int inter_guild_mapif_init(int fd)
-{
- return mapif_guild_castle_alldataload(fd);
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_guild_leave(int guild_id,int account_id,int char_id)
-{
- return mapif_parse_GuildLeave(-1,guild_id,account_id,char_id,0,"** Character Deleted **");
-}
-
-int inter_guild_broken(int guild_id)
-{
- return mapif_guild_broken(guild_id, 0);
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by hack
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "char.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+// #include "int_storage.h"
+#include "inter.h"
+#include "int_guild.h"
+#include "mmo.h"
+#include "socket.h"
+#include "db.h"
+#include "malloc.h"
+
+#define GS_MEMBER_UNMODIFIED 0x00
+#define GS_MEMBER_MODIFIED 0x01
+#define GS_MEMBER_NEW 0x02
+
+#define GS_POSITION_UNMODIFIED 0x00
+#define GS_POSITION_MODIFIED 0x01
+
+// LSB = 0 => Alliance, LSB = 1 => Opposition
+#define GUILD_ALLIANCE_TYPE_MASK 0x01
+#define GUILD_ALLIANCE_REMOVE 0x08
+
+static char dataToHex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+#ifndef TXT_SQL_CONVERT
+//Guild cache
+static struct dbt *guild_db_;
+
+struct guild_castle castles[MAX_GUILDCASTLE];
+
+static unsigned int guild_exp[100];
+
+int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes);
+int mapif_guild_broken(int guild_id,int flag);
+int guild_check_empty(struct guild *g);
+int guild_calcinfo(struct guild *g);
+int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
+int mapif_guild_info(int fd,struct guild *g);
+int guild_break_sub(int key,void *data,va_list ap);
+int inter_guild_tosql(struct guild *g,int flag);
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+static int guild_save(DBKey key, void *data, va_list ap) {
+ struct guild *g = (struct guild*) data;
+ int *last_id = va_arg(ap, int *);
+ int *state = va_arg(ap, int *);
+
+ if ((*state) == 0 && g->guild_id == (*last_id))
+ (*state)++; //Save next guild in the list.
+ else if (g->save_flag&GS_MASK && (*state) == 1) {
+ inter_guild_tosql(g, g->save_flag&GS_MASK);
+ g->save_flag &= ~GS_MASK;
+
+ //Some guild saved.
+ (*last_id) = g->guild_id;
+ (*state)++;
+ }
+
+ if(g->save_flag == GS_REMOVE) { //Nothing to save, guild is ready for removal.
+ if (save_log)
+ ShowInfo("Guild Unloaded (%d - %s)\n", g->guild_id, g->name);
+ db_remove(guild_db_, key);
+ }
+ return 0;
+}
+
+static int guild_save_timer(int tid, unsigned int tick, int id, int data) {
+ static int last_id = 0; //To know in which guild we were.
+ int state = 0; //0: Have not reached last guild. 1: Reached last guild, ready for save. 2: Some guild saved, don't do further saving.
+ if (!last_id) //Save the first guild in the list.
+ state = 1;
+ guild_db_->foreach(guild_db_, guild_save, &last_id, &state);
+ if (state != 2) //Reached the end of the guild db without saving.
+ last_id = 0; //Reset guild saved, return to beginning.
+
+ state = guild_db_->size(guild_db_);
+ if (state < 1) state = 1; //Calculate the time slot for the next save.
+ add_timer(tick + autosave_interval/state, guild_save_timer, 0, 0);
+ return 0;
+}
+
+int inter_guild_removemember_tosql(int account_id, int char_id)
+{
+ sprintf(tmp_sql,"DELETE from `%s` where `account_id` = '%d' and `char_id` = '%d'", guild_member_db, account_id, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '0' WHERE `char_id` = '%d'", char_db, char_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+// Save guild into sql
+int inter_guild_tosql(struct guild *g,int flag)
+{
+ // Table guild (GS_BASIC_MASK)
+ // GS_EMBLEM `emblem_len`,`emblem_id`,`emblem_data`
+ // GS_CONNECT `connect_member`,`average_lv`
+ // GS_MES `mes1`,`mes2`
+ // GS_LEVEL `guild_lv`,`max_member`,`exp`,`next_exp`,`skill_point`
+ // GS_BASIC `name`,`master`,`char_id`
+
+ // GS_MEMBER `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
+ // GS_POSITION `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
+ // GS_ALLIANCE `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
+ // GS_EXPULSION `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
+ // GS_SKILL `guild_skill` (`guild_id`,`id`,`lv`)
+
+ // temporary storage for str convertion. They must be twice the size of the
+ // original string to ensure no overflows will occur. [Skotlex]
+ char t_name[NAME_LENGTH*2],
+ t_master[NAME_LENGTH*2],
+ t_mes1[120],
+ t_mes2[240],
+ t_member[NAME_LENGTH*2],
+ t_position[NAME_LENGTH*2],
+ t_alliance[NAME_LENGTH*2],
+ t_ename[NAME_LENGTH*2],
+ t_emes[80],
+ t_info[240];
+ char emblem_data[4096];
+ char new_guild = 0;
+ int i=0, sql_index;
+
+ if (g->guild_id<=0 && g->guild_id != -1) return 0;
+
+#ifdef NOISY
+ ShowInfo("Save guild request ("CL_BOLD"%d"CL_RESET" - flag 0x%x).",g->guild_id, flag);
+#endif
+
+ jstrescapecpy(t_name, g->name);
+
+ t_info[0]='\0';
+
+#ifndef TXT_SQL_CONVERT
+ // Insert a new guild the guild
+ if (flag&GS_BASIC && g->guild_id == -1)
+ {
+ strcat(t_info, " guild_create");
+
+ // Create a new guild
+ sprintf(tmp_sql,"INSERT INTO `%s` "
+ "(`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
+ "VALUES ('%s', '%s', '%d', '%d', '%d', '%d')",
+ guild_db,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if (g->guild_id == -1)
+ return 0; //Failed to create guild!
+ }
+ else
+ {
+ //New guild, catch id
+ if(mysql_field_count(&mysql_handle) == 0 && mysql_insert_id(&mysql_handle) != 0)
+ {
+ g->guild_id = (int)mysql_insert_id(&mysql_handle);
+ new_guild = 1;
+ }
+ else
+ return 0; //Failed to get ID??
+ }
+ }
+#else
+ // Insert a new guild the guild
+ if (flag&GS_BASIC)
+ {
+ strcat(t_info, " guild_create");
+ // Since the PK is guild id + master id, a replace will not be enough if we are overwriting data, we need to wipe the previous guild.
+ sprintf(tmp_sql,"DELETE FROM `%s` where `guild_id` = '%d'", guild_db,g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ // Create a new guild
+ sprintf(tmp_sql,"REPLACE INTO `%s` "
+ "(`guild_id`,`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
+ "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d')",
+ guild_db,g->guild_id,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0; //Failed to create guild.
+ }
+ }
+#endif //TXT_SQL_CONVERT
+ // If we need an update on an existing guild or more update on the new guild
+ if (((flag & GS_BASIC_MASK) && !new_guild) || ((flag & (GS_BASIC_MASK & ~GS_BASIC)) && new_guild))
+ {
+ sql_index = sprintf(tmp_sql,"UPDATE `%s` SET ", guild_db);
+
+ if (flag & GS_EMBLEM)
+ {
+ char * pData = emblem_data;
+ strcat(t_info, " emblem");
+ // Convert emblem_data to hex
+ for(i=0; i<g->emblem_len; i++){
+ *pData++ = dataToHex[(g->emblem_data[i] >> 4) & 0x0F];
+ *pData++ = dataToHex[g->emblem_data[i] & 0x0F];
+ }
+ *pData = 0;
+ sql_index += sprintf(tmp_sql + sql_index,"`emblem_len`=%d,`emblem_id`=%d,`emblem_data`='%s',",g->emblem_len,g->emblem_id,emblem_data);
+ }
+ if (flag & GS_BASIC)
+ {
+ strcat(t_info, " basic");
+ sql_index += sprintf(tmp_sql + sql_index,"`name`='%s', `master`='%s', `char_id`=%d,",t_name,jstrescapecpy(t_master,g->master),g->member[0].char_id);
+ }
+ if (flag & GS_CONNECT)
+ {
+ strcat(t_info, " connect");
+ sql_index += sprintf(tmp_sql + sql_index,"`connect_member`=%d,`average_lv`=%d,",g->connect_member, g->average_lv);
+ }
+ if (flag & GS_MES)
+ {
+ strcat(t_info, " mes");
+ sql_index += sprintf(tmp_sql + sql_index,"`mes1`='%s',`mes2`='%s',",jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2));
+ }
+ if (flag & GS_LEVEL)
+ {
+ strcat(t_info, " level");
+ sql_index += sprintf(tmp_sql + sql_index,"`guild_lv`=%d,`skill_point`=%d,`exp`=%u,`next_exp`=%u,`max_member`=%d,",g->guild_lv, g->skill_point, g->exp, g->next_exp, g->max_member);
+ }
+ sprintf(tmp_sql + sql_index -1," WHERE `guild_id`=%d", g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if (flag&GS_MEMBER)
+ {
+ struct guild_member *m;
+ strcat(t_info, " members");
+ // Update only needed players
+ for(i=0;i<g->max_member;i++){
+ m = &g->member[i];
+#ifndef TXT_SQL_CONVERT
+ if (!m->modified)
+ continue;
+#endif
+ if(m->account_id) {
+ //Since nothing references guild member table as foreign keys, it's safe to use REPLACE INTO
+ sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`name`) "
+ "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%u','%d','%d','%d','%s')",
+ guild_member_db, g->guild_id, m->account_id,m->char_id,
+ m->hair,m->hair_color,m->gender,
+ m->class_,m->lv,m->exp,m->exp_payper,m->online,m->position,
+ jstrescapecpy(t_member,m->name));
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ if (m->modified & GS_MEMBER_NEW)
+ {
+ sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '%d' WHERE `char_id` = '%d'",
+ char_db, g->guild_id, m->char_id);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ m->modified = GS_MEMBER_UNMODIFIED;
+ }
+ }
+ }
+
+ if (flag&GS_POSITION){
+ strcat(t_info, " positions");
+ //printf("- Insert guild %d to guild_position\n",g->guild_id);
+ for(i=0;i<MAX_GUILDPOSITION;i++){
+ struct guild_position *p = &g->position[i];
+#ifndef TXT_SQL_CONVERT
+ if (!p->modified)
+ continue;
+#endif
+ sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')",
+ guild_position_db, g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ p->modified = GS_POSITION_UNMODIFIED;
+ }
+ }
+
+ if (flag&GS_ALLIANCE)
+ {
+ // Delete current alliances
+ // NOTE: no need to do it on both sides since both guilds in memory had
+ // their info changed, not to mention this would also mess up oppositions!
+ // [Skotlex]
+// sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ else
+ {
+ //printf("- Insert guild %d to guild_alliance\n",g->guild_id);
+ for(i=0;i<MAX_GUILDALLIANCE;i++)
+ {
+ struct guild_alliance *a=&g->alliance[i];
+ if(a->guild_id>0)
+ {
+ sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
+ "VALUES ('%d','%d','%d','%s')",
+ guild_alliance_db, g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name));
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ }
+ }
+
+ if (flag&GS_EXPULSION){
+ strcat(t_info, " expulsions");
+ //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
+ for(i=0;i<MAX_GUILDEXPULSION;i++){
+ struct guild_expulsion *e=&g->expulsion[i];
+ if(e->account_id>0){
+ sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
+ "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')",
+ guild_expulsion_db, g->guild_id,
+ jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 );
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ }
+
+ if (flag&GS_SKILL){
+ strcat(t_info, " skills");
+ //printf("- Insert guild %d to guild_skill\n",g->guild_id);
+ for(i=0;i<MAX_GUILDSKILL;i++){
+ if (g->skill[i].id>0 && g->skill[i].lv>0){
+ sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
+ guild_skill_db, g->guild_id,g->skill[i].id,g->skill[i].lv);
+ //printf("%s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ }
+
+ if (save_log)
+ ShowInfo("Saved guild (%d - %s):%s\n",g->guild_id,g->name,t_info);
+ return 1;
+}
+#ifndef TXT_SQL_CONVERT
+// Read guild from sql
+struct guild * inter_guild_fromsql(int guild_id)
+{
+ int i;
+ char * pstr, * pEmblemData;
+ struct guild *g;
+
+ if (guild_id<=0) return NULL;
+
+ g = idb_get(guild_db_,guild_id);
+ if (g) return g;
+
+ g = (struct guild*)aCalloc(sizeof(struct guild), 1);
+
+#ifdef NOISY
+ ShowInfo("Guild load request (%d)...\n", guild_id);
+#endif
+
+ sprintf(tmp_sql,"SELECT `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
+ "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res==NULL || mysql_num_rows(sql_res)<1) {
+ //Guild does not exists.
+ if (sql_res) mysql_free_result(sql_res);
+ aFree(g);
+ return NULL;
+ }
+
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row==NULL) {
+ mysql_free_result(sql_res);
+ aFree(g);
+ return NULL;
+ }
+
+ g->guild_id=guild_id;
+ strncpy(g->name,sql_row[0],NAME_LENGTH-1);
+ strncpy(g->master,sql_row[1],NAME_LENGTH-1);
+ g->guild_lv=atoi(sql_row[2]);
+ g->connect_member=atoi(sql_row[3]);
+ g->max_member = atoi(sql_row[4]);
+ if (g->max_member > MAX_GUILD)
+ { // Fix reduction of MAX_GUILD [PoW]
+ ShowWarning("Guild %d:%s specifies higher capacity (%d) than MAX_GUILD (%d)\n", guild_id, g->name, g->max_member, MAX_GUILD);
+ g->max_member = MAX_GUILD;
+ }
+ g->average_lv=atoi(sql_row[5]);
+ g->exp=(unsigned int)atof(sql_row[6]);
+ g->next_exp=(unsigned int)atof(sql_row[7]);
+ g->skill_point=atoi(sql_row[8]);
+ //There shouldn't be a need to copy the very last char, as it's the \0 [Skotlex]
+ strncpy(g->mes1,sql_row[9],59);
+ strncpy(g->mes2,sql_row[10],119);
+ g->emblem_len=atoi(sql_row[11]);
+ g->emblem_id=atoi(sql_row[12]);
+ for(i=0,pstr=sql_row[13],pEmblemData=g->emblem_data; i < g->emblem_len; i++,pstr+=2){
+ int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
+ if(c1>='0' && c1<='9')
+ x1=c1-'0';
+ else if(c1>='a' && c1<='f')
+ x1=c1-'a'+10;
+ else if(c1>='A' && c1<='F')
+ x1=c1-'A'+10;
+ if(c2>='0' && c2<='9')
+ x2=c2-'0';
+ else if(c2>='a' && c2<='f')
+ x2=c2-'a'+10;
+ else if(c2>='A' && c2<='F')
+ x2=c2-'A'+10;
+ *pEmblemData++=(x1<<4)|x2;
+ }
+ mysql_free_result(sql_res);
+
+ //printf("- Read guild_member %d from sql \n",guild_id);
+ sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
+ "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){
+ struct guild_member *m = &g->member[i];
+ m->account_id=atoi(sql_row[1]);
+ m->char_id=atoi(sql_row[2]);
+ m->hair=atoi(sql_row[3]);
+ m->hair_color=atoi(sql_row[4]);
+ m->gender=atoi(sql_row[5]);
+ m->class_=atoi(sql_row[6]);
+ m->lv=atoi(sql_row[7]);
+ m->exp=strtoul(sql_row[8],NULL,10);
+ m->exp_payper=atoi(sql_row[9]);
+ m->online=atoi(sql_row[10]);
+ m->position = atoi(sql_row[11]);
+ if (m->position >= MAX_GUILDPOSITION) // Fix reduction of MAX_GUILDPOSITION [PoW]
+ m->position = MAX_GUILDPOSITION - 1;
+
+ strncpy(m->name,sql_row[14],NAME_LENGTH-1);
+ m->modified = GS_MEMBER_UNMODIFIED;
+ }
+ mysql_free_result(sql_res);
+ }
+
+ //printf("- Read guild_position %d from sql \n",guild_id);
+ sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){
+ int position = atoi(sql_row[1]);
+ struct guild_position *p = &g->position[position];
+ strncpy(p->name,sql_row[2],NAME_LENGTH-1);
+ p->mode=atoi(sql_row[3]);
+ p->exp_mode=atoi(sql_row[4]);
+ p->modified = GS_POSITION_UNMODIFIED;
+ }
+ mysql_free_result(sql_res);
+ }
+
+ //printf("- Read guild_alliance %d from sql \n",guild_id);
+ sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){
+ struct guild_alliance *a = &g->alliance[i];
+ a->opposition=atoi(sql_row[1]);
+ a->guild_id=atoi(sql_row[2]);
+ strncpy(a->name,sql_row[3],NAME_LENGTH-1);
+ }
+ mysql_free_result(sql_res);
+ }
+
+ //printf("- Read guild_expulsion %d from sql \n",guild_id);
+ sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPULSION);i++){
+ struct guild_expulsion *e = &g->expulsion[i];
+
+ strncpy(e->name,sql_row[1],NAME_LENGTH-1);
+ //No need to copy char 40, the null terminator. [Skotlex]
+ strncpy(e->mes,sql_row[2],39);
+ strncpy(e->acc,sql_row[3],39);
+ e->account_id=atoi(sql_row[4]);
+ e->rsv1=atoi(sql_row[5]);
+ e->rsv2=atoi(sql_row[6]);
+ e->rsv3=atoi(sql_row[7]);
+ }
+ mysql_free_result(sql_res);
+ }
+
+ //printf("- Read guild_skill %d from sql \n",guild_id);
+ sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(g);
+ return NULL;
+ }
+
+ for(i = 0; i < MAX_GUILDSKILL; i++)
+ { //Skill IDs must always be initialized. [Skotlex]
+ g->skill[i].id = i + GD_SKILLBASE;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ while ((sql_row = mysql_fetch_row(sql_res))){
+ int id = atoi(sql_row[1])-GD_SKILLBASE;
+ if (id >= 0 && id < MAX_GUILDSKILL)
+ //I know this seems ridiculous, but the skills HAVE to be placed on their 'correct' array slot or things break x.x [Skotlex]
+ g->skill[id].lv=atoi(sql_row[2]);
+ }
+ mysql_free_result(sql_res);
+ }
+
+ idb_put(guild_db_, guild_id, g); //Add to cache
+ g->save_flag |= GS_REMOVE; //But set it to be removed, in case it is not needed for long.
+
+ if (save_log)
+ ShowInfo("Guild loaded (%d - %s)\n", guild_id, g->name);
+
+ return g;
+}
+
+#endif //TXT_SQL_CONVERT
+int inter_guildcastle_tosql(struct guild_castle *gc){
+ // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`)
+
+ if (gc==NULL) return 0;
+ #ifdef GUILD_DEBUG
+ShowDebug("Save guild_castle (%d)\n", gc->castle_id);
+ #endif
+
+// sql_query("DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
+
+ sprintf(tmp_sql,"REPLACE INTO `%s` "
+ "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`,"
+ "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
+ "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)"
+ "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
+ guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime,
+ gc->createTime, gc->visibleC,
+ gc->guardian[0].visible, gc->guardian[1].visible, gc->guardian[2].visible, gc->guardian[3].visible, gc->guardian[4].visible, gc->guardian[5].visible, gc->guardian[6].visible, gc->guardian[7].visible,
+ gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp, gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp);
+
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+#ifndef TXT_SQL_CONVERT
+ memcpy(&castles[gc->castle_id],gc,sizeof(struct guild_castle));
+#endif //TXT_SQL_CONVERT
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+
+// Read guild_castle from sql
+int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
+{
+ static int castles_init=0;
+ if (gc==NULL) return 0;
+ if (castle_id==-1) return 0;
+
+ if(!castles_init)
+ {
+ int i;
+ for(i=0;i<MAX_GUILDCASTLE;i++)
+ castles[i].castle_id=-1;
+ castles_init = 1;
+ }
+
+ if(castles[castle_id].castle_id == castle_id)
+ {
+ memcpy(gc,&castles[castle_id],sizeof(struct guild_castle));
+ return 1;
+ }
+
+ memset(gc,0,sizeof(struct guild_castle));
+ sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
+ "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
+ "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`"
+ " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ // ARU: This needs to be set even if there are no SQL results
+ gc->castle_id=castle_id;
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row==NULL){
+ mysql_free_result(sql_res);
+ return 1; //Assume empty castle.
+ }
+ gc->guild_id = atoi (sql_row[1]);
+ gc->economy = atoi (sql_row[2]);
+ gc->defense = atoi (sql_row[3]);
+ gc->triggerE = atoi (sql_row[4]);
+ gc->triggerD = atoi (sql_row[5]);
+ gc->nextTime = atoi (sql_row[6]);
+ gc->payTime = atoi (sql_row[7]);
+ gc->createTime = atoi (sql_row[8]);
+ gc->visibleC = atoi (sql_row[9]);
+ gc->guardian[0].visible = atoi (sql_row[10]);
+ gc->guardian[1].visible = atoi (sql_row[11]);
+ gc->guardian[2].visible = atoi (sql_row[12]);
+ gc->guardian[3].visible = atoi (sql_row[13]);
+ gc->guardian[4].visible = atoi (sql_row[14]);
+ gc->guardian[5].visible = atoi (sql_row[15]);
+ gc->guardian[6].visible = atoi (sql_row[16]);
+ gc->guardian[7].visible = atoi (sql_row[17]);
+ gc->guardian[0].hp = atoi (sql_row[18]);
+ gc->guardian[1].hp = atoi (sql_row[19]);
+ gc->guardian[2].hp = atoi (sql_row[20]);
+ gc->guardian[3].hp = atoi (sql_row[21]);
+ gc->guardian[4].hp = atoi (sql_row[22]);
+ gc->guardian[5].hp = atoi (sql_row[23]);
+ gc->guardian[6].hp = atoi (sql_row[24]);
+ gc->guardian[7].hp = atoi (sql_row[25]);
+
+ if (save_log)
+ ShowInfo("Loaded Castle %d (guild %d)\n",castle_id,gc->guild_id);
+
+ }
+ mysql_free_result(sql_res) ; //resource free
+
+ memcpy(&castles[castle_id],gc,sizeof(struct guild_castle));
+
+ return 1;
+}
+
+
+// Read exp_guild.txt
+int inter_guild_ReadEXP(void)
+{
+ int i;
+ FILE *fp;
+ char line[1024];
+ for (i=0;i<100;i++) guild_exp[i]=0;
+
+ sprintf(line, "%s/exp_guild.txt", db_path);
+ fp=fopen(line,"r");
+ if(fp==NULL){
+ ShowError("can't read %s\n", line);
+ return 1;
+ }
+ i=0;
+ while(fgets(line,256,fp) && i<100){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ guild_exp[i]=(unsigned int)atof(line);
+ i++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+
+int inter_guild_CharOnline(int char_id, int guild_id) {
+
+ struct guild *g;
+ int i;
+
+ if (guild_id == -1) {
+ //Get guild_id from the database
+ sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if(sql_res == NULL)
+ return 0; //Eh? No guild?
+
+ sql_row = mysql_fetch_row(sql_res);
+ guild_id = sql_row?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+ }
+ if (guild_id == 0)
+ return 0; //No guild...
+
+ g = inter_guild_fromsql(guild_id);
+ if(!g) {
+ ShowError("Character %d's guild %d not found!\n", char_id, guild_id);
+ return 0;
+ }
+
+ //Member has logged in before saving, tell saver not to delete
+ if(g->save_flag & GS_REMOVE)
+ g->save_flag &= ~GS_REMOVE;
+
+ //Set member online
+ for(i=0; i<g->max_member; i++) {
+ if (g->member[i].char_id == char_id) {
+ g->member[i].online = 1;
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ break;
+ }
+ }
+ return 1;
+}
+
+int inter_guild_CharOffline(int char_id, int guild_id) {
+ struct guild *g=NULL;
+ int online_count=0, i;
+
+ if (guild_id == -1) {
+ //Get guild_id from the database
+ sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if(sql_res == NULL)
+ return 0; //Eh? No guild?
+
+ sql_row = mysql_fetch_row(sql_res);
+ guild_id = sql_row?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+ }
+ if (guild_id == 0)
+ return 0; //No guild...
+
+ //Character has a guild, set character offline and check if they were the only member online
+ g = inter_guild_fromsql(guild_id);
+ if (g == NULL) //Guild not found?
+ return 0;
+
+ //Set member offline
+ for(i=0; i<g->max_member; i++) {
+ if(g->member[i].char_id == char_id)
+ {
+ g->member[i].online = 0;
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ }
+ if(g->member[i].online && !online_count)
+ online_count++;
+ }
+
+ // Remove guild from memory if no players online
+ if(online_count == 0)
+ g->save_flag |= GS_REMOVE;
+
+ return 1;
+}
+
+// Initialize guild sql
+int inter_guild_sql_init(void)
+{
+ //Initialize the guild cache
+ guild_db_= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ //Read exp file
+ inter_guild_ReadEXP();
+
+ add_timer_func_list(guild_save_timer, "guild_save_timer");
+ add_timer(gettick() + 10000, guild_save_timer, 0, 0);
+ return 0;
+}
+
+static int guild_db_final(DBKey key, void *data, va_list ap)
+{
+ struct guild *g = (struct guild*)data;
+ if (g->save_flag&GS_MASK) {
+ inter_guild_tosql(g, g->save_flag&GS_MASK);
+ return 1;
+ }
+ return 0;
+}
+
+void inter_guild_sql_final(void)
+{
+ guild_db_->destroy(guild_db_, guild_db_final);
+ return;
+}
+
+// Get guild_id by its name. Returns 0 if not found, -1 on error.
+int search_guildname(char *str)
+{
+ int guild_id;
+ char t_name[NAME_LENGTH*2];
+
+ jstrescapecpy(t_name, str);
+ //Lookup guilds with the same name
+ sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE name='%s'", guild_db, t_name);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return -1;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if(sql_res)
+ sql_row = mysql_fetch_row(sql_res);
+
+ guild_id = (sql_row&&sql_res&&sql_row[0])?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+ return guild_id;
+}
+
+// Check if guild is empty
+int guild_check_empty(struct guild *g)
+{
+ int i;
+ for(i=0;i<g->max_member;i++){
+ if(g->member[i].account_id>0){
+ return 0;
+ }
+ }
+ //Let the calling function handle the guild removal in case they need
+ //to do something else with it before freeing the data. [Skotlex]
+ return 1;
+}
+
+unsigned int guild_nextexp(int level)
+{
+ if (level == 0)
+ return 1;
+ if (level < 100 && level > 0) // Change by hack
+ return guild_exp[level-1];
+
+ return 0;
+}
+
+int guild_checkskill(struct guild *g,int id) {
+
+ int idx = id - GD_SKILLBASE;
+
+ if(idx < 0 || idx >= MAX_GUILDSKILL)
+ return 0;
+
+ return g->skill[idx].lv;
+}
+
+int guild_calcinfo(struct guild *g)
+{
+ int i,c;
+ unsigned int nextexp;
+ struct guild before = *g; // Save guild current values
+
+ if(g->guild_lv<=0)
+ g->guild_lv = 1;
+ nextexp = guild_nextexp(g->guild_lv);
+
+ // Consume guild exp and increase guild level
+ while(g->exp >= nextexp && nextexp > 0){ //fixed guild exp overflow [Kevin]
+ g->exp-=nextexp;
+ g->guild_lv++;
+ g->skill_point++;
+ nextexp = guild_nextexp(g->guild_lv);
+ }
+
+ // Save next exp step
+ g->next_exp = nextexp;
+
+ // Set the max number of members, Guild Extention skill - currently adds 6 to max per skill lv.
+ g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6;
+ if(g->max_member > MAX_GUILD)
+ {
+ ShowError("Guild %d:%s has capacity for too many guild members (%d), max supported is %d\n", g->guild_id, g->name, g->max_member, MAX_GUILD);
+ g->max_member = MAX_GUILD;
+ }
+
+ // Compute the guild average level level
+ g->average_lv=0;
+ g->connect_member=0;
+ for(i=c=0;i<g->max_member;i++)
+ {
+ if(g->member[i].account_id>0)
+ {
+ if (g->member[i].lv >= 0)
+ {
+ g->average_lv+=g->member[i].lv;
+ c++;
+ }
+ else
+ {
+ ShowWarning("Guild %d:%s, member %d:%s has an invalid level %d\n", g->guild_id, g->name, g->member[i].char_id, g->member[i].name, g->member[i].lv);
+ }
+
+ if(g->member[i].online)
+ g->connect_member++;
+ }
+ }
+ if(c)
+ g->average_lv /= c;
+
+ // Check if guild stats has change
+ if(g->max_member != before.max_member || g->guild_lv != before.guild_lv || g->skill_point != before.skill_point )
+ {
+ g->save_flag |= GS_LEVEL;
+ mapif_guild_info(-1,g);
+ return 1;
+ }
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// Packet sent to map server
+
+int mapif_guild_created(int fd,int account_id,struct guild *g)
+{
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0)=0x3830;
+ WFIFOL(fd,2)=account_id;
+ if(g != NULL)
+ {
+ WFIFOL(fd,6)=g->guild_id;
+ ShowInfo("int_guild: Guild created (%d - %s)\n",g->guild_id,g->name);
+ } else
+ WFIFOL(fd,6)=0;
+
+ WFIFOSET(fd,10);
+ return 0;
+}
+// Guild not found
+int mapif_guild_noinfo(int fd,int guild_id)
+{
+ unsigned char buf[12];
+ WBUFW(buf,0)=0x3831;
+ WBUFW(buf,2)=8;
+ WBUFL(buf,4)=guild_id;
+ ShowWarning("int_guild: info not found %d\n",guild_id);
+ if(fd<0)
+ mapif_sendall(buf,8);
+ else
+ mapif_send(fd,buf,8);
+ return 0;
+}
+
+// Send guild info
+int mapif_guild_info(int fd,struct guild *g)
+{
+ unsigned char buf[8+sizeof(struct guild)];
+ WBUFW(buf,0)=0x3831;
+ WBUFW(buf,2)=4+sizeof(struct guild);
+ memcpy(buf+4,g,sizeof(struct guild));
+ if(fd<0)
+ mapif_sendall(buf,WBUFW(buf,2));
+ else
+ mapif_send(fd,buf,WBUFW(buf,2));
+ return 0;
+}
+
+// ACK member add
+int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag)
+{
+ WFIFOHEAD(fd, 15);
+ WFIFOW(fd,0)=0x3832;
+ WFIFOL(fd,2)=guild_id;
+ WFIFOL(fd,6)=account_id;
+ WFIFOL(fd,10)=char_id;
+ WFIFOB(fd,14)=flag;
+ WFIFOSET(fd,15);
+ return 0;
+}
+
+// ACK member leave
+int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag, const char *name, const char *mes)
+{
+ unsigned char buf[55+NAME_LENGTH];
+ WBUFW(buf, 0)=0x3834;
+ WBUFL(buf, 2)=guild_id;
+ WBUFL(buf, 6)=account_id;
+ WBUFL(buf,10)=char_id;
+ WBUFB(buf,14)=flag;
+ memcpy(WBUFP(buf,15),mes,40);
+ memcpy(WBUFP(buf,55),name,NAME_LENGTH);
+ mapif_sendall(buf,55+NAME_LENGTH);
+ ShowInfo("int_guild: guild leaved (%d - %d: %s - %s)\n",guild_id,account_id,name,mes);
+ return 0;
+}
+
+// Send short member's info
+int mapif_guild_memberinfoshort(struct guild *g,int idx)
+{
+ unsigned char buf[19];
+ WBUFW(buf, 0)=0x3835;
+ WBUFL(buf, 2)=g->guild_id;
+ WBUFL(buf, 6)=g->member[idx].account_id;
+ WBUFL(buf,10)=g->member[idx].char_id;
+ WBUFB(buf,14)=(unsigned char)g->member[idx].online;
+ WBUFW(buf,15)=g->member[idx].lv;
+ WBUFW(buf,17)=g->member[idx].class_;
+ mapif_sendall(buf,19);
+ return 0;
+}
+
+// Send guild broken
+int mapif_guild_broken(int guild_id,int flag)
+{
+ unsigned char buf[7];
+ WBUFW(buf,0)=0x3836;
+ WBUFL(buf,2)=guild_id;
+ WBUFB(buf,6)=flag;
+ mapif_sendall(buf,7);
+ ShowInfo("int_guild: Guild broken (%d)\n",guild_id);
+ return 0;
+}
+
+// Send guild message
+int mapif_guild_message(int guild_id,int account_id,char *mes,int len, int sfd)
+{
+ unsigned char buf[512];
+ if (len > 500)
+ len = 500;
+ WBUFW(buf,0)=0x3837;
+ WBUFW(buf,2)=len+12;
+ WBUFL(buf,4)=guild_id;
+ WBUFL(buf,8)=account_id;
+ memcpy(WBUFP(buf,12),mes,len);
+ mapif_sendallwos(sfd, buf,len+12);
+ return 0;
+}
+
+// Send basic info
+int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len)
+{
+ unsigned char buf[2048];
+ if (len > 2038)
+ len = 2038;
+ WBUFW(buf, 0)=0x3839;
+ WBUFW(buf, 2)=len+10;
+ WBUFL(buf, 4)=guild_id;
+ WBUFW(buf, 8)=type;
+ memcpy(WBUFP(buf,10),data,len);
+ mapif_sendall(buf,len+10);
+ return 0;
+}
+
+// Send member info
+int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id, int type,const void *data,int len)
+{
+ unsigned char buf[2048];
+ if (len > 2030)
+ len = 2030;
+ WBUFW(buf, 0)=0x383a;
+ WBUFW(buf, 2)=len+18;
+ WBUFL(buf, 4)=guild_id;
+ WBUFL(buf, 8)=account_id;
+ WBUFL(buf,12)=char_id;
+ WBUFW(buf,16)=type;
+ memcpy(WBUFP(buf,18),data,len);
+ mapif_sendall(buf,len+18);
+ return 0;
+}
+
+// ACK guild skill up
+int mapif_guild_skillupack(int guild_id,int skill_num,int account_id)
+{
+ unsigned char buf[14];
+ WBUFW(buf, 0)=0x383c;
+ WBUFL(buf, 2)=guild_id;
+ WBUFL(buf, 6)=skill_num;
+ WBUFL(buf,10)=account_id;
+ mapif_sendall(buf,14);
+ return 0;
+}
+
+// ACK guild alliance
+int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,
+ int flag,const char *name1,const char *name2)
+{
+ unsigned char buf[19+2*NAME_LENGTH];
+ WBUFW(buf, 0)=0x383d;
+ WBUFL(buf, 2)=guild_id1;
+ WBUFL(buf, 6)=guild_id2;
+ WBUFL(buf,10)=account_id1;
+ WBUFL(buf,14)=account_id2;
+ WBUFB(buf,18)=flag;
+ memcpy(WBUFP(buf,19),name1,NAME_LENGTH);
+ memcpy(WBUFP(buf,19+NAME_LENGTH),name2,NAME_LENGTH);
+ mapif_sendall(buf,19+2*NAME_LENGTH);
+ return 0;
+}
+
+// Send a guild position desc
+int mapif_guild_position(struct guild *g,int idx)
+{
+ unsigned char buf[12 + sizeof(struct guild_position)];
+ WBUFW(buf,0)=0x383b;
+ WBUFW(buf,2)=sizeof(struct guild_position)+12;
+ WBUFL(buf,4)=g->guild_id;
+ WBUFL(buf,8)=idx;
+ memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position));
+ mapif_sendall(buf,WBUFW(buf,2));
+ return 0;
+}
+
+// Send the guild notice
+int mapif_guild_notice(struct guild *g)
+{
+ unsigned char buf[256];
+ WBUFW(buf,0)=0x383e;
+ WBUFL(buf,2)=g->guild_id;
+ memcpy(WBUFP(buf,6),g->mes1,60);
+ memcpy(WBUFP(buf,66),g->mes2,120);
+ mapif_sendall(buf,186);
+ return 0;
+}
+
+// Send emblem data
+int mapif_guild_emblem(struct guild *g)
+{
+ unsigned char buf[12 + sizeof(g->emblem_data)];
+ WBUFW(buf,0)=0x383f;
+ WBUFW(buf,2)=g->emblem_len+12;
+ WBUFL(buf,4)=g->guild_id;
+ WBUFL(buf,8)=g->emblem_id;
+ memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len);
+ mapif_sendall(buf,WBUFW(buf,2));
+ return 0;
+}
+
+int mapif_guild_master_changed(struct guild *g, int position)
+{
+ unsigned char buf[10];
+ WBUFW(buf,0)=0x3843;
+ WBUFL(buf,2)=g->guild_id;
+ WBUFL(buf,6)=position;
+ mapif_sendall(buf,10);
+ return 0;
+}
+
+int mapif_guild_castle_dataload(int castle_id,int index,int value) // <Agit>
+{
+ unsigned char buf[9];
+ WBUFW(buf, 0)=0x3840;
+ WBUFW(buf, 2)=castle_id;
+ WBUFB(buf, 4)=index;
+ WBUFL(buf, 5)=value;
+ mapif_sendall(buf,9);
+ return 0;
+}
+
+int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit>
+{
+ unsigned char buf[9];
+ WBUFW(buf, 0)=0x3841;
+ WBUFW(buf, 2)=castle_id;
+ WBUFB(buf, 4)=index;
+ WBUFL(buf, 5)=value;
+ mapif_sendall(buf,9);
+ return 0;
+}
+
+int mapif_guild_castle_alldataload(int fd) {
+ struct guild_castle* gc = (struct guild_castle *)aMalloc(sizeof(struct guild_castle));
+ int i, len = 4;
+ WFIFOHEAD(fd, len + MAX_GUILDCASTLE*sizeof(struct guild_castle));
+ WFIFOW(fd,0) = 0x3842;
+ sprintf(tmp_sql,"SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) {
+ memset(gc, 0, sizeof(struct guild_castle));
+ gc->castle_id = atoi(sql_row[0]);
+ gc->guild_id = atoi(sql_row[1]);
+ gc->economy = atoi(sql_row[2]);
+ gc->defense = atoi(sql_row[3]);
+ gc->triggerE = atoi(sql_row[4]);
+ gc->triggerD = atoi(sql_row[5]);
+ gc->nextTime = atoi(sql_row[6]);
+ gc->payTime = atoi(sql_row[7]);
+ gc->createTime = atoi(sql_row[8]);
+ gc->visibleC = atoi(sql_row[9]);
+ gc->guardian[0].visible = atoi(sql_row[10]);
+ gc->guardian[1].visible = atoi(sql_row[11]);
+ gc->guardian[2].visible = atoi(sql_row[12]);
+ gc->guardian[3].visible = atoi(sql_row[13]);
+ gc->guardian[4].visible = atoi(sql_row[14]);
+ gc->guardian[5].visible = atoi(sql_row[15]);
+ gc->guardian[6].visible = atoi(sql_row[16]);
+ gc->guardian[7].visible = atoi(sql_row[17]);
+ gc->guardian[0].visible = atoi(sql_row[18]);
+ gc->guardian[1].visible = atoi(sql_row[19]);
+ gc->guardian[2].visible = atoi(sql_row[20]);
+ gc->guardian[3].visible = atoi(sql_row[21]);
+ gc->guardian[4].visible = atoi(sql_row[22]);
+ gc->guardian[5].visible = atoi(sql_row[23]);
+ gc->guardian[6].visible = atoi(sql_row[24]);
+ gc->guardian[7].visible = atoi(sql_row[25]);
+ memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle));
+ len += sizeof(struct guild_castle);
+ }
+ mysql_free_result(sql_res);
+ }
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd,len);
+
+ aFree(gc);
+
+ return 0;
+}
+
+
+//-------------------------------------------------------------------
+// Packet received from map server
+
+
+// ƒMƒ‹ƒh쬗v‹
+int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master)
+{
+ struct guild *g;
+ int i=0;
+#ifdef NOISY
+ ShowInfo("Creating Guild (%s)\n", name);
+#endif
+ if(search_guildname(name) != 0){
+ ShowInfo("int_guild: guild with same name exists [%s]\n",name);
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ }
+
+ g = (struct guild *)aMalloc(sizeof(struct guild));
+ memset(g,0,sizeof(struct guild));
+
+ memcpy(g->name,name,NAME_LENGTH);
+ memcpy(g->master,master->name,NAME_LENGTH);
+ memcpy(&g->member[0],master,sizeof(struct guild_member));
+ g->member[0].modified = GS_MEMBER_MODIFIED;
+
+ // Set default positions
+ g->position[0].mode=0x11;
+ strcpy(g->position[0].name,"GuildMaster");
+ strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
+ for(i=1;i<MAX_GUILDPOSITION-1;i++)
+ sprintf(g->position[i].name,"Position %d",i+1);
+
+ // Initialize guild property
+ g->max_member=16;
+ g->average_lv=master->lv;
+ for(i=0;i<MAX_GUILDSKILL;i++)
+ g->skill[i].id=i + GD_SKILLBASE;
+ g->guild_id= -1; //Request to create guild.
+
+ // Create the guild
+ if (!inter_guild_tosql(g,GS_BASIC|GS_POSITION|GS_SKILL)) {
+ //Failed to Create guild....
+ ShowError("Failed to create Guild %s (Guild Master: %s)\n", g->name, g->master);
+ mapif_guild_created(fd,account_id,NULL);
+ aFree(g);
+ return 0;
+ }
+ ShowInfo("Created Guild %d - %s (Guild Master: %s)\n", g->guild_id, g->name, g->master);
+
+ //Add to cache
+ idb_put(guild_db_, g->guild_id, g);
+
+ // Report to client
+ mapif_guild_created(fd,account_id,g);
+ mapif_guild_info(fd,g);
+
+ if(log_inter)
+ inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
+ name, g->guild_id, master->name, master->account_id );
+
+ return 0;
+}
+
+// Return guild info to client
+int mapif_parse_GuildInfo(int fd,int guild_id)
+{
+ struct guild * g = inter_guild_fromsql(guild_id); //We use this because on start-up the info of castle-owned guilds is requied. [Skotlex]
+ if(g)
+ {
+ if (!guild_calcinfo(g))
+ mapif_guild_info(fd,g);
+ }
+ else
+ mapif_guild_noinfo(fd,guild_id); // Failed to load info
+ return 0;
+}
+
+// Add member to guild
+int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
+{
+ struct guild * g;
+ int i;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL){
+ // Failed to add
+ mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
+ return 0;
+ }
+
+ // Find an empty slot
+ for(i=0;i<g->max_member;i++)
+ {
+ if(g->member[i].account_id==0)
+ {
+ memcpy(&g->member[i],m,sizeof(struct guild_member));
+ g->member[i].modified = (GS_MEMBER_NEW | GS_MEMBER_MODIFIED);
+ mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0);
+ if (!guild_calcinfo(g)) //Send members if it was not invoked.
+ mapif_guild_info(fd,g);
+
+ g->save_flag |= GS_MEMBER;
+ if (g->save_flag&GS_REMOVE)
+ g->save_flag&=~GS_REMOVE;
+ return 0;
+ }
+ }
+
+ // Failed to add
+ mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
+ return 0;
+}
+
+// Delete member from guild
+int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes)
+{
+ struct guild * g = inter_guild_fromsql(guild_id);
+
+ if(g){
+ int i;
+ // Find the member
+ for(i=0;i<g->max_member;i++){
+ if( g->member[i].account_id==account_id && g->member[i].char_id==char_id)
+ {
+ if(flag)
+ {
+ // Write expulsion reason
+ int j;
+ // Find an empty slot
+ for(j=0;j<MAX_GUILDEXPULSION;j++){
+ if(g->expulsion[j].account_id==0)
+ break;
+ }
+ // Expulsion list is full, flush the oldest one
+ if(j==MAX_GUILDEXPULSION){
+ for(j=0;j<MAX_GUILDEXPULSION-1;j++)
+ g->expulsion[j]=g->expulsion[j+1];
+ j=MAX_GUILDEXPULSION-1;
+ }
+ // Save the expulsion
+ g->expulsion[j].account_id=account_id;
+ memcpy(g->expulsion[j].acc,"dummy",NAME_LENGTH-1);
+ memcpy(g->expulsion[j].name,g->member[i].name,NAME_LENGTH-1);
+ memcpy(g->expulsion[j].mes,mes,40);
+ }
+
+ mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes);
+ inter_guild_removemember_tosql(g->member[i].account_id,g->member[i].char_id);
+
+ memset(&g->member[i],0,sizeof(struct guild_member));
+
+ if(!guild_check_empty(g)) {
+ break;
+ }
+ //Guild empty? break it.
+ mapif_parse_BreakGuild(-1,guild_id); //Break the guild.
+ return 0;
+ }
+ }
+ //Update member info.
+ if (!guild_calcinfo(g))
+ mapif_guild_info(fd,g);
+ g->save_flag |= GS_EXPULSION;
+ }else{
+ // Unknown guild, just update the player
+ sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */
+ }
+
+ return 0;
+}
+
+// Change member info
+int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
+ int account_id,int char_id,int online,int lv,int class_)
+{
+ // Could speed up by manipulating only guild_member
+ struct guild * g;
+ int i,alv,c;
+ int prev_count;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ prev_count = g->connect_member;
+ g->connect_member=0;
+
+ for(i=0,alv=0,c=0;i<g->max_member;i++)
+ {
+ // Found the member
+ if(g->member[i].account_id==account_id && g->member[i].char_id==char_id)
+ {
+ g->member[i].online=online;
+ g->member[i].lv=lv;
+ g->member[i].class_=class_;
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfoshort(g,i);
+ }
+ if( g->member[i].account_id>0 )
+ {
+ if (g->member[i].lv > 0)
+ {
+ alv+=g->member[i].lv;
+ c++;
+ }
+ else
+ {
+ ShowWarning("Guild %d:%s, member %d:%s has an invalid level %d\n", g->guild_id, g->name, g->member[i].char_id, g->member[i].name, g->member[i].lv);
+ }
+ }
+ if( g->member[i].online )
+ g->connect_member++;
+ }
+
+ if (c)
+ {
+ alv = alv/c;
+ if (g->connect_member != prev_count || g->average_lv != alv)
+ {
+ g->average_lv=alv;
+ g->save_flag |= GS_CONNECT;
+ }
+ if (g->save_flag & GS_REMOVE)
+ g->save_flag &= ~GS_REMOVE;
+ }
+ g->save_flag |= GS_MEMBER; //Update guild member data
+ return 0;
+}
+
+// BreakGuild
+int mapif_parse_BreakGuild(int fd,int guild_id)
+{
+ struct guild * g;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ // Delete guild from sql
+ //printf("- Delete guild %d from guild\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, guild_id, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //printf("- Update guild %d of char\n",guild_id);
+ sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ mapif_guild_broken(guild_id,0);
+
+ if(log_inter)
+ inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id);
+
+ //Remove the guild from memory. [Skotlex]
+ idb_remove(guild_db_, guild_id);
+ return 0;
+}
+
+// Forward Guild message to others map servers
+int mapif_parse_GuildMessage(int fd,int guild_id,int account_id,char *mes,int len)
+{
+ return mapif_guild_message(guild_id,account_id,mes,len, fd);
+}
+
+// Modification of the guild
+int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,int type,const char *data,int len)
+{
+ struct guild * g;
+ short dw=*((short *)data);
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ switch(type)
+ {
+ case GBI_GUILDLV:
+ ShowDebug("GBI_GUILDLV\n");
+ if(dw>0 && g->guild_lv+dw<=50)
+ {
+ g->guild_lv+=dw;
+ g->skill_point+=dw;
+ }
+ else if(dw<0 && g->guild_lv+dw>=1)
+ g->guild_lv+=dw;
+ mapif_guild_info(-1,g);
+ g->save_flag |= GS_LEVEL;
+ return 0;
+ default:
+ ShowError("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
+ break;
+ }
+ mapif_guild_basicinfochanged(guild_id,type,data,len);
+ return 0;
+}
+
+// Modification of the guild
+int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int char_id,
+ int type,const char *data,int len)
+{
+ // Could make some improvement in speed, because only change guild_member
+ int i;
+ struct guild * g;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ // Search the member
+ for(i=0;i<g->max_member;i++)
+ if( g->member[i].account_id==account_id &&
+ g->member[i].char_id==char_id )
+ break;
+
+ // Not Found
+ if(i==g->max_member){
+ ShowWarning("int_guild: GuildMemberChange: Not found %d,%d in guild (%d - %s)\n",
+ account_id,char_id,guild_id,g->name);
+ return 0;
+ }
+
+ switch(type)
+ {
+ case GMI_POSITION:
+ {
+ g->member[i].position=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER;
+ break;
+ }
+ case GMI_EXP:
+ { // EXP
+ unsigned int exp, old_exp=g->member[i].exp;
+ g->member[i].exp=*((unsigned int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ if (g->member[i].exp > old_exp)
+ {
+ exp = g->member[i].exp - old_exp;
+
+ // Compute gained exp
+ if (guild_exp_rate != 100)
+ exp = exp*guild_exp_rate/100;
+
+ // Update guild exp
+ if (exp > UINT_MAX - g->exp)
+ g->exp = UINT_MAX;
+ else
+ g->exp+=exp;
+
+ guild_calcinfo(g);
+ mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
+ g->save_flag |= GS_LEVEL;
+ }
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER;
+ break;
+ }
+ case GMI_HAIR:
+ {
+ g->member[i].hair=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER; //Save new data.
+ break;
+ }
+ case GMI_HAIR_COLOR:
+ {
+ g->member[i].hair_color=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER; //Save new data.
+ break;
+ }
+ case GMI_GENDER:
+ {
+ g->member[i].gender=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER; //Save new data.
+ break;
+ }
+ case GMI_CLASS:
+ {
+ g->member[i].class_=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER; //Save new data.
+ break;
+ }
+ case GMI_LEVEL:
+ {
+ g->member[i].lv=*((int *)data);
+ g->member[i].modified = GS_MEMBER_MODIFIED;
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ g->save_flag |= GS_MEMBER; //Save new data.
+ break;
+ }
+ default:
+ ShowError("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
+ break;
+ }
+ return 0;
+}
+
+int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender)
+{
+ return mapif_parse_GuildMemberInfoChange(0, guild_id, account_id, char_id, GMI_GENDER, (const char*)&gender, sizeof(gender));
+}
+
+// Change a position desc
+int mapif_parse_GuildPosition(int fd,int guild_id,int idx,struct guild_position *p)
+{
+ // Could make some improvement in speed, because only change guild_position
+ struct guild * g;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION)
+ return 0;
+
+ memcpy(&g->position[idx],p,sizeof(struct guild_position));
+ mapif_guild_position(g,idx);
+ ShowInfo("int_guild: position data changed (Guild %d, position %d)\n",guild_id, idx);
+ g->position[idx].modified = GS_POSITION_MODIFIED;
+ g->save_flag |= GS_POSITION; // Change guild_position
+ return 0;
+}
+
+// Guild Skill UP
+int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id)
+{
+ struct guild * g;
+ int idx = skill_num - GD_SKILLBASE;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
+ return 0;
+
+ if(g->skill_point>0 && g->skill[idx].id>0 && g->skill[idx].lv<10 )
+ {
+ g->skill[idx].lv++;
+ g->skill_point--;
+ if (!guild_calcinfo(g))
+ mapif_guild_info(-1,g);
+ mapif_guild_skillupack(guild_id,skill_num,account_id);
+ g->save_flag |= (GS_LEVEL|GS_SKILL); // Change guild & guild_skill
+ }
+ return 0;
+}
+
+//Manual deletion of an alliance when partnering guild does not exists. [Skotlex]
+static int mapif_parse_GuildDeleteAlliance(struct guild *g, int guild_id, int account_id1, int account_id2, int flag)
+{
+ int i;
+ char name[NAME_LENGTH];
+ for(i=0;i<MAX_GUILDALLIANCE;i++)
+ if(g->alliance[i].guild_id == guild_id)
+ {
+ strcpy(name, g->alliance[i].name);
+ g->alliance[i].guild_id=0;
+ break;
+ }
+ if (i == MAX_GUILDALLIANCE)
+ return -1;
+
+ mapif_guild_alliance(g->guild_id,guild_id,account_id1,account_id2,flag,g->name,name);
+ g->save_flag |= GS_ALLIANCE;
+ return 0;
+}
+
+// Alliance modification
+int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2,
+ int account_id1,int account_id2,int flag)
+{
+ // Could speed up
+ struct guild *g[2];
+ int j,i;
+ g[0] = inter_guild_fromsql(guild_id1);
+ g[1] = inter_guild_fromsql(guild_id2);
+
+ if(g[0] && g[1]==NULL && (flag & GUILD_ALLIANCE_REMOVE)) //Requested to remove an alliance with a not found guild.
+ return mapif_parse_GuildDeleteAlliance(g[0], guild_id2, account_id1, account_id2, flag); //Try to do a manual removal of said guild.
+
+ if(g[0]==NULL || g[1]==NULL)
+ return 0;
+
+ if(flag&GUILD_ALLIANCE_REMOVE)
+ {
+ // Remove alliance/opposition, in case of alliance, remove on both side
+ for(i=0;i<2-(flag&GUILD_ALLIANCE_TYPE_MASK);i++)
+ {
+ for(j=0;j<MAX_GUILDALLIANCE;j++)
+ {
+ if(g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag&GUILD_ALLIANCE_TYPE_MASK))
+ {
+ g[i]->alliance[j].guild_id=0;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ // Add alliance, in case of alliance, add on both side
+ for(i=0;i<2-(flag&GUILD_ALLIANCE_TYPE_MASK);i++)
+ {
+ // Search an empty slot
+ for(j=0;j<MAX_GUILDALLIANCE;j++)
+ {
+ if(g[i]->alliance[j].guild_id==0)
+ {
+ g[i]->alliance[j].guild_id=g[1-i]->guild_id;
+ memcpy(g[i]->alliance[j].name,g[1-i]->name,NAME_LENGTH-1);
+ // Set alliance type
+ g[i]->alliance[j].opposition = flag&GUILD_ALLIANCE_TYPE_MASK;
+ break;
+ }
+ }
+ }
+ }
+
+ // Send on all map the new alliance/opposition
+ mapif_guild_alliance(guild_id1,guild_id2,account_id1,account_id2,flag,g[0]->name,g[1]->name);
+
+ // Mark the two guild to be saved
+ g[0]->save_flag |= GS_ALLIANCE;
+ g[1]->save_flag |= GS_ALLIANCE;
+ return 0;
+}
+
+// Change guild message
+int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes2)
+{
+ struct guild *g;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ memcpy(g->mes1,mes1,60);
+ memcpy(g->mes2,mes2,120);
+ g->save_flag |= GS_MES; //Change mes of guild
+ return mapif_guild_notice(g);
+}
+
+int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data)
+{
+ struct guild * g;
+
+ g = inter_guild_fromsql(guild_id);
+ if(g==NULL)
+ return 0;
+
+ if (len > sizeof(g->emblem_data))
+ len = sizeof(g->emblem_data);
+
+ memcpy(g->emblem_data,data,len);
+ g->emblem_len=len;
+ g->emblem_id++;
+ g->save_flag |= GS_EMBLEM; //Change guild
+ return mapif_guild_emblem(g);
+}
+
+int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
+{
+ struct guild_castle gc;
+ if (!inter_guildcastle_fromsql(castle_id, &gc)) {
+ return mapif_guild_castle_dataload(castle_id,0,0);
+ }
+ switch(index){
+ case 1: return mapif_guild_castle_dataload(gc.castle_id,index,gc.guild_id); break;
+ case 2: return mapif_guild_castle_dataload(gc.castle_id,index,gc.economy); break;
+ case 3: return mapif_guild_castle_dataload(gc.castle_id,index,gc.defense); break;
+ case 4: return mapif_guild_castle_dataload(gc.castle_id,index,gc.triggerE); break;
+ case 5: return mapif_guild_castle_dataload(gc.castle_id,index,gc.triggerD); break;
+ case 6: return mapif_guild_castle_dataload(gc.castle_id,index,gc.nextTime); break;
+ case 7: return mapif_guild_castle_dataload(gc.castle_id,index,gc.payTime); break;
+ case 8: return mapif_guild_castle_dataload(gc.castle_id,index,gc.createTime); break;
+ case 9: return mapif_guild_castle_dataload(gc.castle_id,index,gc.visibleC); break;
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ return mapif_guild_castle_dataload(gc.castle_id,index,gc.guardian[index-10].visible); break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ return mapif_guild_castle_dataload(gc.castle_id,index,gc.guardian[index-18].hp); break;
+ default:
+ ShowError("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+}
+
+int mapif_parse_GuildCastleDataSave(int fd,int castle_id,int index,int value) // <Agit>
+{
+ struct guild_castle gc;
+ if(!inter_guildcastle_fromsql(castle_id, &gc))
+ return mapif_guild_castle_datasave(castle_id,index,value);
+
+ switch(index){
+ case 1:
+ if( gc.guild_id!=value ){
+ int gid=(value)?value:gc.guild_id;
+ struct guild *g=idb_get(guild_db_, gid);
+ if(log_inter)
+ inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
+ (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", castle_id);
+ }
+ gc.guild_id = value;
+ if(gc.guild_id == 0) {
+ //Delete guardians.
+ memset(&gc.guardian, 0, sizeof(gc.guardian));
+ }
+ break;
+ case 2: gc.economy = value; break;
+ case 3: gc.defense = value; break;
+ case 4: gc.triggerE = value; break;
+ case 5: gc.triggerD = value; break;
+ case 6: gc.nextTime = value; break;
+ case 7: gc.payTime = value; break;
+ case 8: gc.createTime = value; break;
+ case 9: gc.visibleC = value; break;
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ gc.guardian[index-10].visible = value; break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ gc.guardian[index-18].hp = value; break; // end additions [Valaris]
+ default:
+ ShowError("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+ inter_guildcastle_tosql(&gc);
+ mapif_guild_castle_datasave(gc.castle_id,index,value);
+ return 0;
+}
+
+int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int len)
+{
+ struct guild * g;
+ struct guild_member gm;
+ int pos;
+
+ g = inter_guild_fromsql(guild_id);
+
+ if(g==NULL || len > NAME_LENGTH)
+ return 0;
+
+ // Find member (name)
+ for (pos = 0; pos < g->max_member && strncmp(g->member[pos].name, name, len); pos++);
+
+ if (pos == g->max_member)
+ return 0; //Character not found??
+
+ // Switch current and old GM
+ memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
+ memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
+ memcpy(&g->member[0], &gm, sizeof(struct guild_member));
+
+ // Switch positions
+ g->member[pos].position = g->member[0].position;
+ g->member[pos].modified = GS_MEMBER_MODIFIED;
+ g->member[0].position = 0; //Position 0: guild Master.
+ g->member[0].modified = GS_MEMBER_MODIFIED;
+
+ strncpy(g->master, name, len);
+ if (len < NAME_LENGTH)
+ g->master[len] = '\0';
+
+ ShowInfo("int_guild: Guildmaster Changed to %s (Guild %d - %s)\n",g->master, guild_id, g->name);
+ g->save_flag |= (GS_BASIC|GS_MEMBER); //Save main data and member data.
+ return mapif_guild_master_changed(g, pos);
+}
+
+// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
+int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id)
+{
+ // What does this mean? Check if belong to another guild?
+ return 0;
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_guild_parse_frommap(int fd)
+{
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)){
+ case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),(char*)RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break;
+ case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break;
+ case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break;
+ case 0x3033: mapif_parse_GuildMasterChange(fd,RFIFOL(fd,4),(const char*)RFIFOP(fd,8),RFIFOW(fd,2)-8); break;
+ case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),(const char*)RFIFOP(fd,15)); break;
+ case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break;
+ case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break;
+ case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
+ case 0x3038: mapif_parse_GuildCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),(const char*)RFIFOP(fd,10),RFIFOW(fd,2)-10); break;
+ case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),(const char*)RFIFOP(fd,18),RFIFOW(fd,2)-18); break;
+ case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break;
+ case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
+ case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break;
+ case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),(const char*)RFIFOP(fd,6),(const char*)RFIFOP(fd,66)); break;
+ case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),(const char*)RFIFOP(fd,12)); break;
+ case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break;
+ case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break;
+
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+int inter_guild_mapif_init(int fd)
+{
+ return mapif_guild_castle_alldataload(fd);
+}
+
+// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
+int inter_guild_leave(int guild_id,int account_id,int char_id)
+{
+ return mapif_parse_GuildLeave(-1,guild_id,account_id,char_id,0,"** Character Deleted **");
+}
+
+int inter_guild_broken(int guild_id)
+{
+ return mapif_guild_broken(guild_id, 0);
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h
index 88836a2a1..4b153574b 100644
--- a/src/char_sql/int_guild.h
+++ b/src/char_sql/int_guild.h
@@ -1,35 +1,35 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_GUILD_SQL_H_
-#define _INT_GUILD_SQL_H_
-
-int inter_guild_parse_frommap(int fd);
-int inter_guild_sql_init(void);
-void inter_guild_sql_final(void);
-int inter_guild_mapif_init(int fd);
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-int mapif_parse_BreakGuild(int fd,int guild_id);
-int inter_guild_broken(int guild_id);
-int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
-int inter_guild_CharOnline(int char_id, int guild_id);
-int inter_guild_CharOffline(int char_id, int guild_id);
-
-#define GS_BASIC 0x0001
-#define GS_MEMBER 0x0002
-#define GS_POSITION 0x0004
-#define GS_ALLIANCE 0x0008
-#define GS_EXPULSION 0x0010
-#define GS_SKILL 0x0020
-#define GS_EMBLEM 0x0040
-#define GS_CONNECT 0x0080
-#define GS_LEVEL 0x0100
-#define GS_MES 0x0200
-#define GS_MASK 0x03FF
-#define GS_BASIC_MASK (GS_BASIC | GS_EMBLEM | GS_CONNECT | GS_LEVEL | GS_MES)
-#define GS_REMOVE 0x8000
-
-//For the TXT->SQL converter.
-int inter_guild_tosql(struct guild *g,int flag);
-int inter_guildcastle_tosql(struct guild_castle *gc);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_GUILD_SQL_H_
+#define _INT_GUILD_SQL_H_
+
+int inter_guild_parse_frommap(int fd);
+int inter_guild_sql_init(void);
+void inter_guild_sql_final(void);
+int inter_guild_mapif_init(int fd);
+int inter_guild_leave(int guild_id,int account_id,int char_id);
+int mapif_parse_BreakGuild(int fd,int guild_id);
+int inter_guild_broken(int guild_id);
+int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
+int inter_guild_CharOnline(int char_id, int guild_id);
+int inter_guild_CharOffline(int char_id, int guild_id);
+
+#define GS_BASIC 0x0001
+#define GS_MEMBER 0x0002
+#define GS_POSITION 0x0004
+#define GS_ALLIANCE 0x0008
+#define GS_EXPULSION 0x0010
+#define GS_SKILL 0x0020
+#define GS_EMBLEM 0x0040
+#define GS_CONNECT 0x0080
+#define GS_LEVEL 0x0100
+#define GS_MES 0x0200
+#define GS_MASK 0x03FF
+#define GS_BASIC_MASK (GS_BASIC | GS_EMBLEM | GS_CONNECT | GS_LEVEL | GS_MES)
+#define GS_REMOVE 0x8000
+
+//For the TXT->SQL converter.
+int inter_guild_tosql(struct guild *g,int flag);
+int inter_guildcastle_tosql(struct guild_castle *gc);
+#endif
diff --git a/src/char_sql/int_homun.c b/src/char_sql/int_homun.c
index d39114602..e726b15d3 100644
--- a/src/char_sql/int_homun.c
+++ b/src/char_sql/int_homun.c
@@ -1,296 +1,296 @@
-// Homunculus saving by Albator and Orn for eAthena.
-// GNU/GPL rulez !
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-
-struct s_homunculus *homun_pt;
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-
-int inter_homunculus_sql_init(void){
- //memory alloc
- homun_pt = (struct s_homunculus*)aCalloc(sizeof(struct s_homunculus), 1);
- return 0;
-}
-void inter_homunculus_sql_final(void){
- if (homun_pt) aFree(homun_pt);
- return;
-}
-
-int mapif_saved_homunculus(int fd, int account_id, unsigned char flag)
-{
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0) = 0x3892;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = flag;
- WFIFOSET(fd, 7);
- return 0;
-}
-int mapif_info_homunculus(int fd, int account_id, struct s_homunculus *hd)
-{
- WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
- WFIFOW(fd,0) = 0x3891;
- WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
- WFIFOL(fd,4) = account_id;
- WFIFOB(fd,8) = 1; // account loaded with success
-
- memcpy(WFIFOP(fd,9), hd, sizeof(struct s_homunculus));
- WFIFOSET(fd, sizeof(struct s_homunculus)+9);
- return 0;
-}
-
-int mapif_homunculus_deleted(int fd, int flag)
-{
- WFIFOHEAD(fd, 3);
- WFIFOW(fd, 0) = 0x3893;
- WFIFOB(fd,2) = flag; //Flag 1 = success
- WFIFOSET(fd, 3);
- return 0;
-
-}
-int mapif_homunculus_created(int fd, int account_id, struct s_homunculus *sh, unsigned char flag)
-{
- WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
- WFIFOW(fd,0) = 0x3890;
- WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
- WFIFOL(fd,4) = account_id;
- WFIFOB(fd,8)= flag;
- memcpy(WFIFOP(fd,9),sh,sizeof(struct s_homunculus));
- WFIFOSET(fd, WFIFOW(fd,2));
- return 0;
-}
-
-// Save/Update Homunculus Skills
-int mapif_save_homunculus_skills(struct s_homunculus *hd)
-{
- int i;
-
- for(i=0; i<MAX_HOMUNSKILL; i++)
- {
- if(hd->hskill[i].id != 0 && hd->hskill[i].lv != 0 )
- {
- sprintf(tmp_sql,"REPLACE INTO `skill_homunculus` (`homun_id`, `id`, `lv`) VALUES (%d, %d, %d)",
- hd->hom_id, hd->hskill[i].id, hd->hskill[i].lv);
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- }
- }
-
- return 1;
-}
-
-int mapif_save_homunculus(int fd, int account_id, struct s_homunculus *hd)
-{
- int flag =1;
- char t_name[NAME_LENGTH*2];
- jstrescapecpy(t_name, hd->name);
-
- if(hd->hom_id==0) // new homunculus
- {
- ShowInfo("New homunculus name : %s\n",hd->name);
-
- sprintf(tmp_sql, "INSERT INTO `homunculus` "
- "(`char_id`, `class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`, `rename_flag`, `vaporize`) "
- "VALUES ('%d', '%d', '%s', '%d', '%u', '%u', '%d', '%d', %d, '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
- hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize);
-
- }
- else
- {
- sprintf(tmp_sql, "UPDATE `homunculus` SET `char_id`='%d', `class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d' WHERE `homun_id`='%d'",
- hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
- hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->hom_id);
- }
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- flag = 0;
- }
-
- if(hd->hom_id==0 && flag!=0)
- hd->hom_id = (int)mysql_insert_id(&mysql_handle); // new homunculus
- else
- {
- flag = mapif_save_homunculus_skills(hd);
- mapif_saved_homunculus(fd, account_id, flag);
- }
- return flag;
-}
-
-
-
-// Load an homunculus
-int mapif_load_homunculus(int fd){
- int i;
- RFIFOHEAD(fd);
- memset(homun_pt, 0, sizeof(struct s_homunculus));
-
- sprintf(tmp_sql,"SELECT `homun_id`,`char_id`,`class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `homunculus` WHERE `homun_id`='%lu'", RFIFOL(fd,6));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
-
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- homun_pt->hom_id = RFIFOL(fd,6) ; //RFIFOL(fd,2);
- homun_pt->class_ = atoi(sql_row[2]);
- memcpy(homun_pt->name, sql_row[3],NAME_LENGTH-1);
- homun_pt->char_id = atoi(sql_row[1]);
- homun_pt->level = atoi(sql_row[4]);
- homun_pt->exp = atoi(sql_row[5]);
- homun_pt->intimacy = atoi(sql_row[6]);
- homun_pt->hunger = atoi(sql_row[7]);
- homun_pt->str = atoi(sql_row[8]);
- homun_pt->agi = atoi(sql_row[9]);
- homun_pt->vit = atoi(sql_row[10]);
- homun_pt->int_ = atoi(sql_row[11]);
- homun_pt->dex = atoi(sql_row[12]);
- homun_pt->luk = atoi(sql_row[13]);
- homun_pt->hp = atoi(sql_row[14]);
- homun_pt->max_hp = atoi(sql_row[15]);
- homun_pt->sp = atoi(sql_row[16]);
- homun_pt->max_sp = atoi(sql_row[17]);
- homun_pt->skillpts = atoi(sql_row[18]);
- homun_pt->rename_flag = atoi(sql_row[19]);
- homun_pt->vaporize = atoi(sql_row[20]);
- }
- if(homun_pt->hunger < 0)
- homun_pt->hunger = 0;
- else if(homun_pt->hunger > 100)
- homun_pt->hunger = 100;
- if(homun_pt->intimacy < 0)
- homun_pt->intimacy = 0;
- else if(homun_pt->intimacy > 100000)
- homun_pt->intimacy = 100000;
-
- mysql_free_result(sql_res);
-
- // Load Homunculus Skill
- memset(homun_pt->hskill, 0, sizeof(homun_pt->hskill));
-
- sprintf(tmp_sql,"SELECT `id`,`lv` FROM `skill_homunculus` WHERE `homun_id`=%d",homun_pt->hom_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- while((sql_row = mysql_fetch_row(sql_res))){
- i = (atoi(sql_row[0])-HM_SKILLBASE-1);
- homun_pt->hskill[i].id = atoi(sql_row[0]);
- homun_pt->hskill[i].lv = atoi(sql_row[1]);
- }
- }
-
- mysql_free_result(sql_res);
-
- ShowInfo("Homunculus loaded (%d - %s).\n", homun_pt->hom_id, homun_pt->name);
- return mapif_info_homunculus(fd, RFIFOL(fd,2), homun_pt);
-}
-
-
-
-int mapif_delete_homunculus(int fd)
-{
- RFIFOHEAD(fd);
- sprintf(tmp_sql, "DELETE FROM `homunculus` WHERE `homun_id` = '%lu'", RFIFOL(fd,2));
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return mapif_homunculus_deleted(fd, 0);
- }
-
- sprintf(tmp_sql, "DELETE FROM `skill_homunculus` WHERE `homun_id` = '%lu'", RFIFOL(fd,2));
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return mapif_homunculus_deleted(fd, 0);
- }
- return mapif_homunculus_deleted(fd, 1);
-}
-
-int mapif_rename_homun_ack(int fd, int account_id, int char_id, unsigned char flag, char *name){
- WFIFOHEAD(fd, NAME_LENGTH+12);
- WFIFOW(fd, 0) =0x3894;
- WFIFOL(fd, 2) =account_id;
- WFIFOL(fd, 6) =char_id;
- WFIFOB(fd, 10) =flag;
- memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
- WFIFOSET(fd, NAME_LENGTH+12);
-
- return 0;
-}
-
-int mapif_rename_homun(int fd, int account_id, int char_id, char *name){
- int i;
-
- // Check Authorised letters/symbols in the name of the homun
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- }
-
- mapif_rename_homun_ack(fd, account_id, char_id, 1, name);
- return 0;
-}
-
-int mapif_parse_CreateHomunculus(int fd)
-{
- RFIFOHEAD(fd);
- memcpy(homun_pt, RFIFOP(fd,8), sizeof(struct s_homunculus));
- // Save in sql db
- if(mapif_save_homunculus(fd,RFIFOL(fd,4), homun_pt))
- return mapif_homunculus_created(fd, RFIFOL(fd,4), homun_pt, 1); // send homun_id
- return mapif_homunculus_created(fd, RFIFOL(fd,4), homun_pt, 0); // fail
-}
-
-int inter_homunculus_parse_frommap(int fd){
- RFIFOHEAD(fd);
- switch(RFIFOW(fd, 0)){
- case 0x3090: mapif_parse_CreateHomunculus(fd); break;
- case 0x3091: mapif_load_homunculus(fd); break;
- case 0x3092: mapif_save_homunculus(fd, RFIFOW(fd,4), (struct s_homunculus*) RFIFOP(fd, 8)); break;
- case 0x3093: mapif_delete_homunculus(fd); break; // doesn't need to be parse, very simple packet...
- case 0x3094: mapif_rename_homun(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10)); break;
- default:
- return 0;
- }
- return 1;
-}
+// Homunculus saving by Albator and Orn for eAthena.
+// GNU/GPL rulez !
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "char.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+
+struct s_homunculus *homun_pt;
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+
+int inter_homunculus_sql_init(void){
+ //memory alloc
+ homun_pt = (struct s_homunculus*)aCalloc(sizeof(struct s_homunculus), 1);
+ return 0;
+}
+void inter_homunculus_sql_final(void){
+ if (homun_pt) aFree(homun_pt);
+ return;
+}
+
+int mapif_saved_homunculus(int fd, int account_id, unsigned char flag)
+{
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0) = 0x3892;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = flag;
+ WFIFOSET(fd, 7);
+ return 0;
+}
+int mapif_info_homunculus(int fd, int account_id, struct s_homunculus *hd)
+{
+ WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
+ WFIFOW(fd,0) = 0x3891;
+ WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
+ WFIFOL(fd,4) = account_id;
+ WFIFOB(fd,8) = 1; // account loaded with success
+
+ memcpy(WFIFOP(fd,9), hd, sizeof(struct s_homunculus));
+ WFIFOSET(fd, sizeof(struct s_homunculus)+9);
+ return 0;
+}
+
+int mapif_homunculus_deleted(int fd, int flag)
+{
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd, 0) = 0x3893;
+ WFIFOB(fd,2) = flag; //Flag 1 = success
+ WFIFOSET(fd, 3);
+ return 0;
+
+}
+int mapif_homunculus_created(int fd, int account_id, struct s_homunculus *sh, unsigned char flag)
+{
+ WFIFOHEAD(fd, sizeof(struct s_homunculus)+9);
+ WFIFOW(fd,0) = 0x3890;
+ WFIFOW(fd,2) = sizeof(struct s_homunculus)+9;
+ WFIFOL(fd,4) = account_id;
+ WFIFOB(fd,8)= flag;
+ memcpy(WFIFOP(fd,9),sh,sizeof(struct s_homunculus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ return 0;
+}
+
+// Save/Update Homunculus Skills
+int mapif_save_homunculus_skills(struct s_homunculus *hd)
+{
+ int i;
+
+ for(i=0; i<MAX_HOMUNSKILL; i++)
+ {
+ if(hd->hskill[i].id != 0 && hd->hskill[i].lv != 0 )
+ {
+ sprintf(tmp_sql,"REPLACE INTO `skill_homunculus` (`homun_id`, `id`, `lv`) VALUES (%d, %d, %d)",
+ hd->hom_id, hd->hskill[i].id, hd->hskill[i].lv);
+
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+int mapif_save_homunculus(int fd, int account_id, struct s_homunculus *hd)
+{
+ int flag =1;
+ char t_name[NAME_LENGTH*2];
+ jstrescapecpy(t_name, hd->name);
+
+ if(hd->hom_id==0) // new homunculus
+ {
+ ShowInfo("New homunculus name : %s\n",hd->name);
+
+ sprintf(tmp_sql, "INSERT INTO `homunculus` "
+ "(`char_id`, `class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`, `rename_flag`, `vaporize`) "
+ "VALUES ('%d', '%d', '%s', '%d', '%u', '%u', '%d', '%d', %d, '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
+ hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize);
+
+ }
+ else
+ {
+ sprintf(tmp_sql, "UPDATE `homunculus` SET `char_id`='%d', `class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d' WHERE `homun_id`='%d'",
+ hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
+ hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->hom_id);
+ }
+
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ flag = 0;
+ }
+
+ if(hd->hom_id==0 && flag!=0)
+ hd->hom_id = (int)mysql_insert_id(&mysql_handle); // new homunculus
+ else
+ {
+ flag = mapif_save_homunculus_skills(hd);
+ mapif_saved_homunculus(fd, account_id, flag);
+ }
+ return flag;
+}
+
+
+
+// Load an homunculus
+int mapif_load_homunculus(int fd){
+ int i;
+ RFIFOHEAD(fd);
+ memset(homun_pt, 0, sizeof(struct s_homunculus));
+
+ sprintf(tmp_sql,"SELECT `homun_id`,`char_id`,`class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `homunculus` WHERE `homun_id`='%lu'", RFIFOL(fd,6));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ sql_row = mysql_fetch_row(sql_res);
+
+ homun_pt->hom_id = RFIFOL(fd,6) ; //RFIFOL(fd,2);
+ homun_pt->class_ = atoi(sql_row[2]);
+ memcpy(homun_pt->name, sql_row[3],NAME_LENGTH-1);
+ homun_pt->char_id = atoi(sql_row[1]);
+ homun_pt->level = atoi(sql_row[4]);
+ homun_pt->exp = atoi(sql_row[5]);
+ homun_pt->intimacy = atoi(sql_row[6]);
+ homun_pt->hunger = atoi(sql_row[7]);
+ homun_pt->str = atoi(sql_row[8]);
+ homun_pt->agi = atoi(sql_row[9]);
+ homun_pt->vit = atoi(sql_row[10]);
+ homun_pt->int_ = atoi(sql_row[11]);
+ homun_pt->dex = atoi(sql_row[12]);
+ homun_pt->luk = atoi(sql_row[13]);
+ homun_pt->hp = atoi(sql_row[14]);
+ homun_pt->max_hp = atoi(sql_row[15]);
+ homun_pt->sp = atoi(sql_row[16]);
+ homun_pt->max_sp = atoi(sql_row[17]);
+ homun_pt->skillpts = atoi(sql_row[18]);
+ homun_pt->rename_flag = atoi(sql_row[19]);
+ homun_pt->vaporize = atoi(sql_row[20]);
+ }
+ if(homun_pt->hunger < 0)
+ homun_pt->hunger = 0;
+ else if(homun_pt->hunger > 100)
+ homun_pt->hunger = 100;
+ if(homun_pt->intimacy < 0)
+ homun_pt->intimacy = 0;
+ else if(homun_pt->intimacy > 100000)
+ homun_pt->intimacy = 100000;
+
+ mysql_free_result(sql_res);
+
+ // Load Homunculus Skill
+ memset(homun_pt->hskill, 0, sizeof(homun_pt->hskill));
+
+ sprintf(tmp_sql,"SELECT `id`,`lv` FROM `skill_homunculus` WHERE `homun_id`=%d",homun_pt->hom_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if(sql_res){
+ while((sql_row = mysql_fetch_row(sql_res))){
+ i = (atoi(sql_row[0])-HM_SKILLBASE-1);
+ homun_pt->hskill[i].id = atoi(sql_row[0]);
+ homun_pt->hskill[i].lv = atoi(sql_row[1]);
+ }
+ }
+
+ mysql_free_result(sql_res);
+
+ ShowInfo("Homunculus loaded (%d - %s).\n", homun_pt->hom_id, homun_pt->name);
+ return mapif_info_homunculus(fd, RFIFOL(fd,2), homun_pt);
+}
+
+
+
+int mapif_delete_homunculus(int fd)
+{
+ RFIFOHEAD(fd);
+ sprintf(tmp_sql, "DELETE FROM `homunculus` WHERE `homun_id` = '%lu'", RFIFOL(fd,2));
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return mapif_homunculus_deleted(fd, 0);
+ }
+
+ sprintf(tmp_sql, "DELETE FROM `skill_homunculus` WHERE `homun_id` = '%lu'", RFIFOL(fd,2));
+ if(mysql_query(&mysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return mapif_homunculus_deleted(fd, 0);
+ }
+ return mapif_homunculus_deleted(fd, 1);
+}
+
+int mapif_rename_homun_ack(int fd, int account_id, int char_id, unsigned char flag, char *name){
+ WFIFOHEAD(fd, NAME_LENGTH+12);
+ WFIFOW(fd, 0) =0x3894;
+ WFIFOL(fd, 2) =account_id;
+ WFIFOL(fd, 6) =char_id;
+ WFIFOB(fd, 10) =flag;
+ memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
+ WFIFOSET(fd, NAME_LENGTH+12);
+
+ return 0;
+}
+
+int mapif_rename_homun(int fd, int account_id, int char_id, char *name){
+ int i;
+
+ // Check Authorised letters/symbols in the name of the homun
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_rename_homun_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ }
+
+ mapif_rename_homun_ack(fd, account_id, char_id, 1, name);
+ return 0;
+}
+
+int mapif_parse_CreateHomunculus(int fd)
+{
+ RFIFOHEAD(fd);
+ memcpy(homun_pt, RFIFOP(fd,8), sizeof(struct s_homunculus));
+ // Save in sql db
+ if(mapif_save_homunculus(fd,RFIFOL(fd,4), homun_pt))
+ return mapif_homunculus_created(fd, RFIFOL(fd,4), homun_pt, 1); // send homun_id
+ return mapif_homunculus_created(fd, RFIFOL(fd,4), homun_pt, 0); // fail
+}
+
+int inter_homunculus_parse_frommap(int fd){
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd, 0)){
+ case 0x3090: mapif_parse_CreateHomunculus(fd); break;
+ case 0x3091: mapif_load_homunculus(fd); break;
+ case 0x3092: mapif_save_homunculus(fd, RFIFOW(fd,4), (struct s_homunculus*) RFIFOP(fd, 8)); break;
+ case 0x3093: mapif_delete_homunculus(fd); break; // doesn't need to be parse, very simple packet...
+ case 0x3094: mapif_rename_homun(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10)); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
diff --git a/src/char_sql/int_homun.h b/src/char_sql/int_homun.h
index e274c9ee1..cfc46ca24 100644
--- a/src/char_sql/int_homun.h
+++ b/src/char_sql/int_homun.h
@@ -1,14 +1,14 @@
-// Homunculus saving by Albator and Orn for eAthena.
-// GNU/GPL rulez !
-
-#ifndef _INT_HOMUN_H_
-#define _INT_HOMUN_H_
-
-int inter_homunculus_sql_init(void);
-void inter_homunculus_sql_final(void);
-int mapif_save_homunculus(struct s_homunculus *hd);
-int mapif_load_homunculus(int fd);
-int mapif_delete_homunculus(int fd);
-int inter_homunculus_parse_frommap(int fd);
-
-#endif
+// Homunculus saving by Albator and Orn for eAthena.
+// GNU/GPL rulez !
+
+#ifndef _INT_HOMUN_H_
+#define _INT_HOMUN_H_
+
+int inter_homunculus_sql_init(void);
+void inter_homunculus_sql_final(void);
+int mapif_save_homunculus(struct s_homunculus *hd);
+int mapif_load_homunculus(int fd);
+int mapif_delete_homunculus(int fd);
+int inter_homunculus_parse_frommap(int fd);
+
+#endif
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
index da5506903..e39c826d4 100644
--- a/src/char_sql/int_party.c
+++ b/src/char_sql/int_party.c
@@ -1,937 +1,937 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by hack
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include "char.h"
-#include "../common/db.h"
-#include "../common/strlib.h"
-#include "../common/socket.h"
-#include "../common/showmsg.h"
-
-#ifndef TXT_SQL_CONVERT
-struct party_data {
- struct party party;
- unsigned int min_lv, max_lv;
- int family; //Is this party a family? if so, this holds the child id.
- unsigned char size; //Total size of party.
-};
-
-static struct party_data *party_pt;
-static struct dbt *party_db_;
-
-int mapif_party_broken(int party_id,int flag);
-int party_check_empty(struct party_data *p);
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id);
-int party_check_exp_share(struct party_data *p);
-int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag);
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-//Updates party's level range and unsets even share if broken.
-static int int_party_check_lv(struct party_data *p) {
- int i;
- unsigned int lv;
- p->min_lv = UINT_MAX;
- p->max_lv = 0;
- for(i=0;i<MAX_PARTY;i++){
- if(!p->party.member[i].online)
- continue;
-
- lv=p->party.member[i].lv;
- if (lv < p->min_lv) p->min_lv = lv;
- if (lv > p->max_lv) p->max_lv = lv;
- }
-
- if (p->party.exp && !party_check_exp_share(p)) {
- p->party.exp = 0;
- mapif_party_optionchanged(0, &p->party, 0, 0);
- return 0;
- }
- return 1;
-}
-//Calculates the state of a party.
-static void int_party_calc_state(struct party_data *p)
-{
- int i;
- unsigned int lv;
- p->min_lv = UINT_MAX;
- p->max_lv = 0;
- p->party.count =
- p->size =
- p->family = 0;
-
- //Check party size
- for(i=0;i<MAX_PARTY;i++){
- if (!p->party.member[i].lv) continue;
- p->size++;
- if(p->party.member[i].online)
- p->party.count++;
- }
- if(p->size == 3) {
- //Check Family State.
- p->family = char_family(
- p->party.member[0].char_id,
- p->party.member[1].char_id,
- p->party.member[2].char_id
- );
- }
- //max/min levels.
- for(i=0;i<MAX_PARTY;i++){
- lv=p->party.member[i].lv;
- if (!lv) continue;
- if(p->party.member[i].online &&
- //On families, the kid is not counted towards exp share rules.
- p->party.member[i].char_id != p->family)
- {
- if( lv < p->min_lv ) p->min_lv=lv;
- if( p->max_lv < lv ) p->max_lv=lv;
- }
- }
-
- if (p->party.exp && !party_check_exp_share(p)) {
- p->party.exp = 0; //Set off even share.
- mapif_party_optionchanged(0, &p->party, 0, 0);
- }
- return;
-}
-#endif //TXT_SQL_CONVERT
-// Save party to mysql
-int inter_party_tosql(struct party *p, int flag, int index)
-{
- // 'party' ('party_id','name','exp','item','leader_id','leader_char')
- char t_name[NAME_LENGTH*2]; //Required for jstrescapecpy [Skotlex]
- int party_id;
- if (p == NULL || p->party_id == 0)
- return 0;
- party_id = p->party_id;
-
-#ifdef NOISY
- ShowInfo("Save party request ("CL_BOLD"%d"CL_RESET" - %s).\n", party_id, p->name);
-#endif
- jstrescapecpy(t_name, p->name);
-
-#ifndef TXT_SQL_CONVERT
- if (flag&PS_BREAK) { //Break the party
- // we'll skip name-checking and just reset everyone with the same party id [celest]
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `party_id`='%d'", party_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- //Remove from memory
- idb_remove(party_db_, party_id);
- return 1;
- }
-#endif //TXT_SQL_CONVERT
- if(flag&PS_CREATE) { //Create party
-#ifndef TXT_SQL_CONVERT
- sprintf(tmp_sql, "INSERT INTO `%s` "
- "(`name`, `exp`, `item`, `leader_id`, `leader_char`) "
- "VALUES ('%s', '%d', '%d', '%d', '%d')",
- party_db, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) != 0)
- party_id = p->party_id = (int)mysql_insert_id(&mysql_handle);
- else //Failed to retrieve ID??
- return 0;
-#else
- //During conversion, you want to specify the id, and allow overwriting
- //(in case someone is re-running the process.
- sprintf(tmp_sql, "REPLACE INTO `%s` "
- "(`party_id`, `name`, `exp`, `item`, `leader_id`, `leader_char`) "
- "VALUES ('%d', '%s', '%d', '%d', '%d', '%d')",
- party_db, p->party_id, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-#endif
- }
-
-#ifndef TXT_SQL_CONVERT
- if (flag&PS_BASIC) {
- //Update party info.
- sprintf(tmp_sql, "UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d' WHERE `party_id`='%d'",
- party_db, t_name, p->exp, p->item, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if (flag&PS_LEADER) {
- //Update leader
- sprintf(tmp_sql, "UPDATE `%s` SET `leader_id`='%d', `leader_char`='%d' WHERE `party_id`='%d'",
- party_db, p->member[index].account_id, p->member[index].char_id, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if (flag&PS_ADDMEMBER) {
- //Add one party member.
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",
- char_db, party_id, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if (flag&PS_DELMEMBER) {
- //Remove one party member.
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `char_id`='%d'",
- char_db, party_id, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-#endif //TXT_SQL_CONVERT
- if (save_log)
- ShowInfo("Party Saved (%d - %s)\n", party_id, p->name);
- return 1;
-}
-#ifndef TXT_SQL_CONVERT
-// Read party from mysql
-struct party_data *inter_party_fromsql(int party_id)
-{
- int leader_id = 0, leader_char = 0;
- struct party_data *p;
-#ifdef NOISY
- ShowInfo("Load party request ("CL_BOLD"%d"CL_RESET")\n", party_id);
-#endif
- if (party_id <=0)
- return NULL;
-
- //Load from memory
- if ((p = idb_get(party_db_, party_id)) != NULL)
- return p;
-
- p = party_pt;
- memset(p, 0, sizeof(struct party_data));
-
- sprintf(tmp_sql, "SELECT `party_id`, `name`,`exp`,`item`, `leader_id`, `leader_char` FROM `%s` WHERE `party_id`='%d'",
- party_db, party_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return NULL;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if (!sql_res)
- return NULL;
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row) {
- mysql_free_result(sql_res);
- return NULL;
- }
- p->party.party_id = party_id;
- memcpy(&p->party.name, sql_row[1], NAME_LENGTH-1);
- p->party.exp = atoi(sql_row[2])?1:0;
- p->party.item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- leader_char = atoi(sql_row[5]);
- mysql_free_result(sql_res);
-
- // Load members
- sprintf(tmp_sql,"SELECT `account_id`,`char_id`,`name`,`base_level`,`last_map`,`online`,`class` FROM `%s` WHERE `party_id`='%d'",
- char_db, party_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- int i;
- for (i = 0; i<MAX_PARTY && (sql_row = mysql_fetch_row(sql_res)); i++) {
- struct party_member *m = &p->party.member[i];
- m->account_id = atoi(sql_row[0]);
- m->char_id = atoi(sql_row[1]);
- m->leader = (m->account_id == leader_id && m->char_id == leader_char)?1:0;
- memcpy(m->name, sql_row[2], NAME_LENGTH);
- m->lv = atoi(sql_row[3]);
- m->map = mapindex_name2id(sql_row[4]);
- m->online = atoi(sql_row[5])?1:0;
- m->class_ = atoi(sql_row[6]);
- }
- mysql_free_result(sql_res);
- }
-
- if (save_log)
- ShowInfo("Party loaded (%d - %s).\n",party_id, p->party.name);
- //Add party to memory.
- p = aCalloc(1, sizeof(struct party_data));
- memcpy(p, party_pt, sizeof(struct party_data));
- //init state
- int_party_calc_state(p);
- idb_put(party_db_, party_id, p);
- return p;
-}
-
-int inter_party_sql_init(void){
- //memory alloc
- party_db_ = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- party_pt = (struct party_data*)aCalloc(sizeof(struct party_data), 1);
- if (!party_pt) {
- ShowFatalError("inter_party_sql_init: Out of Memory!\n");
- exit(1);
- }
-
- /* Uncomment the following if you want to do a party_db cleanup (remove parties with no members) on startup.[Skotlex]
- ShowStatus("cleaning party table...\n");
- sprintf (tmp_sql,
- "DELETE FROM `%s` USING `%s` LEFT JOIN `%s` ON `%s`.leader_id =`%s`.account_id AND `%s`.leader_char = `%s`.char_id WHERE `%s`.account_id IS NULL",
- party_db, party_db, char_db, party_db, char_db, party_db, char_db, char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- */
- return 0;
-}
-
-void inter_party_sql_final(void)
-{
- party_db_->destroy(party_db_, NULL);
- aFree(party_pt);
- return;
-}
-
-// Search for the party according to its name
-struct party_data* search_partyname(char *str)
-{
- char t_name[NAME_LENGTH*2];
- int party_id;
-
- sprintf(tmp_sql,"SELECT `party_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<=0)
- {
- if (sql_res) mysql_free_result(sql_res);
- return NULL;
- }
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
-
- return inter_party_fromsql(party_id);
-}
-
-// Returns whether this party can keep having exp share or not.
-int party_check_exp_share(struct party_data *p)
-{
- return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level);
-}
-
-// Is there any member in the party?
-int party_check_empty(struct party_data *p)
-{
- int i;
- if (p==NULL||p->party.party_id==0) return 1;
- for(i=0;i<MAX_PARTY && !p->party.member[i].account_id;i++);
- if (i < MAX_PARTY) return 0;
- // If there is no member, then break the party
- mapif_party_broken(p->party.party_id,0);
- inter_party_tosql(&p->party, PS_BREAK, 0);
- return 1;
-}
-
-
-// Check if a member is in two party, not necessary :)
-int party_check_conflict(int party_id,int account_id,int char_id)
-{
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp[ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id,int char_id,struct party *p)
-{
- WFIFOHEAD(fd, 39);
- WFIFOW(fd,0)=0x3820;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=char_id;
- if(p!=NULL){
- WFIFOB(fd,10)=0;
- WFIFOL(fd,11)=p->party_id;
- memcpy(WFIFOP(fd,15),p->name,NAME_LENGTH);
- ShowInfo("int_party: Party created (%d - %s)\n",p->party_id,p->name);
- }else{
- WFIFOB(fd,10)=1;
- WFIFOL(fd,11)=0;
- memset(WFIFOP(fd,15),0,NAME_LENGTH);
- }
- WFIFOSET(fd,39);
-
- return 0;
-}
-
-// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd,int party_id)
-{
- WFIFOHEAD(fd,8);
- WFIFOW(fd,0)=0x3821;
- WFIFOW(fd,2)=8;
- WFIFOL(fd,4)=party_id;
- WFIFOSET(fd,8);
- ShowWarning("int_party: info not found %d\n",party_id);
- return 0;
-}
-// ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_party_info(int fd,struct party *p)
-{
- unsigned char buf[5+sizeof(struct party)];
- WBUFW(buf,0)=0x3821;
- WBUFW(buf,2)=4+sizeof(struct party);
- memcpy(buf+4,p,sizeof(struct party));
-
- if(fd<0)
- mapif_sendall(buf,WBUFW(buf,2));
- else
- mapif_send(fd,buf,WBUFW(buf,2));
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd, int party_id, int account_id, int char_id, int flag) {
- WFIFOHEAD(fd, 15);
- WFIFOW(fd,0) = 0x3822;
- WFIFOL(fd,2) = party_id;
- WFIFOL(fd,6) = account_id;
- WFIFOL(fd,10) = char_id;
- WFIFOB(fd,14) = flag;
- WFIFOSET(fd,15);
-
- return 0;
-}
-
-// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
-int mapif_party_optionchanged(int fd,struct party *p,int account_id,int flag)
-{
- unsigned char buf[16];
- WBUFW(buf,0)=0x3823;
- WBUFL(buf,2)=p->party_id;
- WBUFL(buf,6)=account_id;
- WBUFW(buf,10)=p->exp;
- WBUFW(buf,12)=p->item;
- WBUFB(buf,14)=flag;
- if(flag==0)
- mapif_sendall(buf,15);
- else
- mapif_send(fd,buf,15);
- return 0;
-}
-
-//Checks whether the even-share setting of a party is broken when a character logs in. [Skotlex]
-int inter_party_logged(int party_id, int account_id, int char_id)
-{
- struct party_data *p;
- int i;
-
- if (party_id <= 0)
- return 0;
-
- if (!party_id)
- return 0;
- p = inter_party_fromsql(party_id);
- if(!p) //Non existant party?
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++)
- if(p->party.member[i].account_id==account_id &&
- p->party.member[i].char_id==char_id)
- {
- if (!p->party.member[i].online) {
- p->party.member[i].online = 1;
- p->party.count++;
- if(p->party.member[i].lv < p->min_lv ||
- p->party.member[i].lv > p->max_lv)
- int_party_check_lv(p);
- }
- break;
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id, int char_id) {
- unsigned char buf[16];
-
- WBUFW(buf,0) = 0x3824;
- WBUFL(buf,2) = party_id;
- WBUFL(buf,6) = account_id;
- WBUFL(buf,10) = char_id;
- mapif_sendall(buf, 14);
- return 0;
-}
-
-// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p,int idx)
-{
- unsigned char buf[20];
-
- WBUFW(buf,0) = 0x3825;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = p->member[idx].account_id;
- WBUFL(buf,10) = p->member[idx].char_id;
- WBUFW(buf,14) = p->member[idx].map;
- WBUFB(buf,16) = p->member[idx].online;
- WBUFW(buf,17) = p->member[idx].lv;
- mapif_sendall(buf, 19);
- return 0;
-}
-
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int mapif_party_broken(int party_id,int flag)
-{
- unsigned char buf[16];
- WBUFW(buf,0)=0x3826;
- WBUFL(buf,2)=party_id;
- WBUFB(buf,6)=flag;
- mapif_sendall(buf,7);
- //printf("int_party: broken %d\n",party_id);
- return 0;
-}
-// ƒp[ƒeƒB“à”­Œ¾
-int mapif_party_message(int party_id,int account_id,char *mes,int len, int sfd)
-{
- unsigned char buf[512];
- WBUFW(buf,0)=0x3827;
- WBUFW(buf,2)=len+12;
- WBUFL(buf,4)=party_id;
- WBUFL(buf,8)=account_id;
- memcpy(WBUFP(buf,12),mes,len);
- mapif_sendallwos(sfd, buf,len+12);
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// Create Party
-int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader)
-{
- struct party_data *p;
- int i;
- if( (p=search_partyname(name))!=NULL){
- mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
- return 0;
- }
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
- return 0;
- }
- }
-
- p= aCalloc(1, sizeof(struct party_data));
-
- memcpy(p->party.name,name,NAME_LENGTH);
- p->party.exp=0;
- p->party.item=(item?1:0)|(item2?2:0);
-
- memcpy(&p->party.member[0], leader, sizeof(struct party_member));
- p->party.member[0].leader=1;
- p->party.member[0].online=1;
-
- p->party.party_id=-1;//New party.
- if (inter_party_tosql(&p->party,PS_CREATE|PS_ADDMEMBER,0)) {
- //Add party to db
- int_party_calc_state(p);
- idb_put(party_db_, p->party.party_id, p);
- mapif_party_created(fd,leader->account_id,leader->char_id,&p->party);
- mapif_party_info(fd,&p->party);
- } else { //Failed to create party.
- aFree(p);
- mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
- }
-
- return 0;
-}
-// ƒp[ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd,int party_id)
-{
- struct party_data *p;
- p = inter_party_fromsql(party_id);
-
- if (p)
- mapif_party_info(fd,&p->party);
- else
- mapif_party_noinfo(fd,party_id);
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
- struct party_data *p;
- int i;
-
- p = inter_party_fromsql(party_id);
-
- if(!p || p->size == MAX_PARTY){
- mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->party.member[i].account_id)
- continue;
-
- memcpy(&p->party.member[i], member, sizeof(struct party_member));
- p->party.member[i].leader=0;
- if (p->party.member[i].online) p->party.count++;
- p->size++;
- if (p->size == 3) //Check family state.
- int_party_calc_state(p);
- else //Check even share range.
- if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
- if (p->family) p->family = 0; //Family state broken.
- int_party_check_lv(p);
- }
-
- mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,0);
- mapif_party_info(-1,&p->party);
- inter_party_tosql(&p->party, PS_ADDMEMBER, i);
- return 0;
- }
- //Party full
- mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
- return 0;
-}
-// ƒp[ƒeƒB[Ý’è•ÏX—v‹
-int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
-{
- struct party_data *p;
- int flag = 0;
- p = inter_party_fromsql(party_id);
-
- if(!p)
- return 0;
-
- p->party.exp=exp;
- if( exp && !party_check_exp_share(p) ){
- flag|=0x01;
- p->party.exp=0;
- }
- p->party.item = item&0x3; //Filter out invalid values.
- mapif_party_optionchanged(fd,&p->party,account_id,flag);
- inter_party_tosql(&p->party, PS_BASIC, 0);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ—v‹
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id)
-{
- struct party_data *p;
- int i,j=-1;
-
- p = inter_party_fromsql(party_id);
- if (!p) { //Party does not exists?
- sprintf(tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
- }
-
- for (i = 0; i < MAX_PARTY; i++) {
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id) {
- break;
- }
- }
- if (i >= MAX_PARTY)
- return 0; //Member not found?
-
- mapif_party_leaved(party_id, account_id, char_id);
-
- if (p->party.member[i].leader){
- p->party.member[i].account_id = 0;
- for (j = 0; j < MAX_PARTY; j++) {
- if (!p->party.member[j].account_id)
- continue;
- mapif_party_leaved(party_id, p->party.member[j].account_id, p->party.member[j].char_id);
- p->party.member[j].account_id = 0;
- }
- //Party gets deleted on the check_empty call below.
- } else {
- inter_party_tosql(&p->party,PS_DELMEMBER,i);
- j = p->party.member[i].lv;
- if(p->party.member[i].online) p->party.count--;
- memset(&p->party.member[i], 0, sizeof(struct party_member));
- p->size--;
- if (j == p->min_lv || j == p->max_lv || p->family)
- {
- if(p->family) p->family = 0; //Family state broken.
- int_party_check_lv(p);
- }
- }
-
- if (party_check_empty(p) == 0)
- mapif_party_info(-1,&p->party);
- return 0;
-}
-// When member goes to other map
-int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv)
-{
- struct party_data *p;
- int i;
-
- p = inter_party_fromsql(party_id);
- if (p == NULL)
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- p->party.member[i].map = map;
- if (p->party.member[i].online != online)
- {
- p->party.member[i].online = online;
- if (online)
- p->party.count++;
- else
- p->party.count--;
- // Even share check situations: Family state (always breaks)
- // character logging on/off is max/min level (update level range)
- // or character logging on/off has a different level (update level range using new level)
- if (p->family ||
- (p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
- (p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
- )
- {
- p->party.member[i].lv = lv;
- int_party_check_lv(p);
- }
- }
- if (p->party.member[i].lv != lv) {
- if(p->party.member[i].lv == p->min_lv ||
- p->party.member[i].lv == p->max_lv)
- {
- p->party.member[i].lv = lv;
- int_party_check_lv(p);
- } else
- p->party.member[i].lv = lv;
- }
- mapif_party_membermoved(&p->party, i);
- break;
- }
- }
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd,int party_id)
-{
- struct party_data *p;
-
- p = inter_party_fromsql(party_id);
-
- if(!p)
- return 0;
- inter_party_tosql(&p->party,PS_BREAK,0);
- mapif_party_broken(fd,party_id);
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
-int mapif_parse_PartyMessage(int fd,int party_id,int account_id,char *mes,int len)
-{
- return mapif_party_message(party_id,account_id,mes,len, fd);
-}
-// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd,int party_id,int account_id,int char_id)
-{
- return party_check_conflict(party_id,account_id,char_id);
-}
-
-int mapif_parse_PartyLeaderChange(int fd,int party_id,int account_id,int char_id)
-{
- struct party_data *p;
- int i;
-
- p = inter_party_fromsql(party_id);
-
- if(!p)
- return 0;
-
- for (i = 0; i < MAX_PARTY; i++)
- {
- if(p->party.member[i].leader)
- p->party.member[i].leader = 0;
- if(p->party.member[i].account_id == account_id &&
- p->party.member[i].char_id == char_id)
- {
- p->party.member[i].leader = 1;
- inter_party_tosql(&p->party,PS_LEADER, i);
- }
- }
- return 1;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_party_parse_frommap(int fd)
-{
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)) {
- case 0x3020: mapif_parse_CreateParty(fd, (char*)RFIFOP(fd,4), RFIFOB(fd,28), RFIFOB(fd,29), (struct party_member*)RFIFOP(fd,30)); break;
- case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,4), (struct party_member*)RFIFOP(fd,8)); break;
- case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
- case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOW(fd,14), RFIFOB(fd,16), RFIFOW(fd,17)); break;
- case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3029: mapif_parse_PartyLeaderChange(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- default:
- return 0;
- }
- return 1;
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_party_leave(int party_id,int account_id, int char_id)
-{
- return mapif_parse_PartyLeave(-1,party_id,account_id, char_id);
-}
-
-int inter_party_CharOnline(int char_id, int party_id) {
- struct party_data *p;
- int i;
-
- if (party_id == -1) {
- //Get party_id from the database
- sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No party?
-
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
- }
- if (party_id == 0)
- return 0; //No party...
-
- p = inter_party_fromsql(party_id);
- if(!p) {
- ShowError("Character %d's party %d not found!\n", char_id, party_id);
- return 0;
- }
-
- //Set member online
- for(i=0; i<MAX_PARTY; i++) {
- if (p->party.member[i].char_id == char_id) {
- if (!p->party.member[i].online) {
- p->party.member[i].online = 1;
- p->party.count++;
- if (p->party.member[i].lv < p->min_lv ||
- p->party.member[i].lv > p->max_lv)
- int_party_check_lv(p);
- }
- break;
- }
- }
- return 1;
-}
-
-int inter_party_CharOffline(int char_id, int party_id) {
- struct party_data *p=NULL;
- int i;
-
- if (party_id == -1) {
- //Get guild_id from the database
- sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No party?
-
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
- }
- if (party_id == 0)
- return 0; //No party...
-
- //Character has a party, set character offline and check if they were the only member online
- if ((p = inter_party_fromsql(party_id)) == NULL)
- return 0;
-
- //Set member offline
- for(i=0; i< MAX_PARTY; i++) {
- if(p->party.member[i].char_id == char_id)
- {
- p->party.member[i].online = 0;
- p->party.count--;
- if(p->party.member[i].lv == p->min_lv ||
- p->party.member[i].lv == p->max_lv)
- int_party_check_lv(p);
- break;
- }
- }
-
- if(!p->party.count)
- //Parties don't have any data that needs be saved at this point... so just remove it from memory.
- idb_remove(party_db_, party_id);
- return 1;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by hack
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include "char.h"
+#include "../common/db.h"
+#include "../common/strlib.h"
+#include "../common/socket.h"
+#include "../common/showmsg.h"
+
+#ifndef TXT_SQL_CONVERT
+struct party_data {
+ struct party party;
+ unsigned int min_lv, max_lv;
+ int family; //Is this party a family? if so, this holds the child id.
+ unsigned char size; //Total size of party.
+};
+
+static struct party_data *party_pt;
+static struct dbt *party_db_;
+
+int mapif_party_broken(int party_id,int flag);
+int party_check_empty(struct party_data *p);
+int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id);
+int party_check_exp_share(struct party_data *p);
+int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag);
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+//Updates party's level range and unsets even share if broken.
+static int int_party_check_lv(struct party_data *p) {
+ int i;
+ unsigned int lv;
+ p->min_lv = UINT_MAX;
+ p->max_lv = 0;
+ for(i=0;i<MAX_PARTY;i++){
+ if(!p->party.member[i].online)
+ continue;
+
+ lv=p->party.member[i].lv;
+ if (lv < p->min_lv) p->min_lv = lv;
+ if (lv > p->max_lv) p->max_lv = lv;
+ }
+
+ if (p->party.exp && !party_check_exp_share(p)) {
+ p->party.exp = 0;
+ mapif_party_optionchanged(0, &p->party, 0, 0);
+ return 0;
+ }
+ return 1;
+}
+//Calculates the state of a party.
+static void int_party_calc_state(struct party_data *p)
+{
+ int i;
+ unsigned int lv;
+ p->min_lv = UINT_MAX;
+ p->max_lv = 0;
+ p->party.count =
+ p->size =
+ p->family = 0;
+
+ //Check party size
+ for(i=0;i<MAX_PARTY;i++){
+ if (!p->party.member[i].lv) continue;
+ p->size++;
+ if(p->party.member[i].online)
+ p->party.count++;
+ }
+ if(p->size == 3) {
+ //Check Family State.
+ p->family = char_family(
+ p->party.member[0].char_id,
+ p->party.member[1].char_id,
+ p->party.member[2].char_id
+ );
+ }
+ //max/min levels.
+ for(i=0;i<MAX_PARTY;i++){
+ lv=p->party.member[i].lv;
+ if (!lv) continue;
+ if(p->party.member[i].online &&
+ //On families, the kid is not counted towards exp share rules.
+ p->party.member[i].char_id != p->family)
+ {
+ if( lv < p->min_lv ) p->min_lv=lv;
+ if( p->max_lv < lv ) p->max_lv=lv;
+ }
+ }
+
+ if (p->party.exp && !party_check_exp_share(p)) {
+ p->party.exp = 0; //Set off even share.
+ mapif_party_optionchanged(0, &p->party, 0, 0);
+ }
+ return;
+}
+#endif //TXT_SQL_CONVERT
+// Save party to mysql
+int inter_party_tosql(struct party *p, int flag, int index)
+{
+ // 'party' ('party_id','name','exp','item','leader_id','leader_char')
+ char t_name[NAME_LENGTH*2]; //Required for jstrescapecpy [Skotlex]
+ int party_id;
+ if (p == NULL || p->party_id == 0)
+ return 0;
+ party_id = p->party_id;
+
+#ifdef NOISY
+ ShowInfo("Save party request ("CL_BOLD"%d"CL_RESET" - %s).\n", party_id, p->name);
+#endif
+ jstrescapecpy(t_name, p->name);
+
+#ifndef TXT_SQL_CONVERT
+ if (flag&PS_BREAK) { //Break the party
+ // we'll skip name-checking and just reset everyone with the same party id [celest]
+ sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `party_id`='%d'", party_db, party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ //Remove from memory
+ idb_remove(party_db_, party_id);
+ return 1;
+ }
+#endif //TXT_SQL_CONVERT
+ if(flag&PS_CREATE) { //Create party
+#ifndef TXT_SQL_CONVERT
+ sprintf(tmp_sql, "INSERT INTO `%s` "
+ "(`name`, `exp`, `item`, `leader_id`, `leader_char`) "
+ "VALUES ('%s', '%d', '%d', '%d', '%d')",
+ party_db, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ if(mysql_field_count(&mysql_handle) == 0 &&
+ mysql_insert_id(&mysql_handle) != 0)
+ party_id = p->party_id = (int)mysql_insert_id(&mysql_handle);
+ else //Failed to retrieve ID??
+ return 0;
+#else
+ //During conversion, you want to specify the id, and allow overwriting
+ //(in case someone is re-running the process.
+ sprintf(tmp_sql, "REPLACE INTO `%s` "
+ "(`party_id`, `name`, `exp`, `item`, `leader_id`, `leader_char`) "
+ "VALUES ('%d', '%s', '%d', '%d', '%d', '%d')",
+ party_db, p->party_id, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+#endif
+ }
+
+#ifndef TXT_SQL_CONVERT
+ if (flag&PS_BASIC) {
+ //Update party info.
+ sprintf(tmp_sql, "UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d' WHERE `party_id`='%d'",
+ party_db, t_name, p->exp, p->item, party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if (flag&PS_LEADER) {
+ //Update leader
+ sprintf(tmp_sql, "UPDATE `%s` SET `leader_id`='%d', `leader_char`='%d' WHERE `party_id`='%d'",
+ party_db, p->member[index].account_id, p->member[index].char_id, party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if (flag&PS_ADDMEMBER) {
+ //Add one party member.
+ sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",
+ char_db, party_id, p->member[index].account_id, p->member[index].char_id);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if (flag&PS_DELMEMBER) {
+ //Remove one party member.
+ sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `char_id`='%d'",
+ char_db, party_id, p->member[index].account_id, p->member[index].char_id);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+#endif //TXT_SQL_CONVERT
+ if (save_log)
+ ShowInfo("Party Saved (%d - %s)\n", party_id, p->name);
+ return 1;
+}
+#ifndef TXT_SQL_CONVERT
+// Read party from mysql
+struct party_data *inter_party_fromsql(int party_id)
+{
+ int leader_id = 0, leader_char = 0;
+ struct party_data *p;
+#ifdef NOISY
+ ShowInfo("Load party request ("CL_BOLD"%d"CL_RESET")\n", party_id);
+#endif
+ if (party_id <=0)
+ return NULL;
+
+ //Load from memory
+ if ((p = idb_get(party_db_, party_id)) != NULL)
+ return p;
+
+ p = party_pt;
+ memset(p, 0, sizeof(struct party_data));
+
+ sprintf(tmp_sql, "SELECT `party_id`, `name`,`exp`,`item`, `leader_id`, `leader_char` FROM `%s` WHERE `party_id`='%d'",
+ party_db, party_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return NULL;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (!sql_res)
+ return NULL;
+ sql_row = mysql_fetch_row(sql_res);
+ if (!sql_row) {
+ mysql_free_result(sql_res);
+ return NULL;
+ }
+ p->party.party_id = party_id;
+ memcpy(&p->party.name, sql_row[1], NAME_LENGTH-1);
+ p->party.exp = atoi(sql_row[2])?1:0;
+ p->party.item = atoi(sql_row[3]);
+ leader_id = atoi(sql_row[4]);
+ leader_char = atoi(sql_row[5]);
+ mysql_free_result(sql_res);
+
+ // Load members
+ sprintf(tmp_sql,"SELECT `account_id`,`char_id`,`name`,`base_level`,`last_map`,`online`,`class` FROM `%s` WHERE `party_id`='%d'",
+ char_db, party_id); // TBR
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return NULL;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ int i;
+ for (i = 0; i<MAX_PARTY && (sql_row = mysql_fetch_row(sql_res)); i++) {
+ struct party_member *m = &p->party.member[i];
+ m->account_id = atoi(sql_row[0]);
+ m->char_id = atoi(sql_row[1]);
+ m->leader = (m->account_id == leader_id && m->char_id == leader_char)?1:0;
+ memcpy(m->name, sql_row[2], NAME_LENGTH);
+ m->lv = atoi(sql_row[3]);
+ m->map = mapindex_name2id(sql_row[4]);
+ m->online = atoi(sql_row[5])?1:0;
+ m->class_ = atoi(sql_row[6]);
+ }
+ mysql_free_result(sql_res);
+ }
+
+ if (save_log)
+ ShowInfo("Party loaded (%d - %s).\n",party_id, p->party.name);
+ //Add party to memory.
+ p = aCalloc(1, sizeof(struct party_data));
+ memcpy(p, party_pt, sizeof(struct party_data));
+ //init state
+ int_party_calc_state(p);
+ idb_put(party_db_, party_id, p);
+ return p;
+}
+
+int inter_party_sql_init(void){
+ //memory alloc
+ party_db_ = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ party_pt = (struct party_data*)aCalloc(sizeof(struct party_data), 1);
+ if (!party_pt) {
+ ShowFatalError("inter_party_sql_init: Out of Memory!\n");
+ exit(1);
+ }
+
+ /* Uncomment the following if you want to do a party_db cleanup (remove parties with no members) on startup.[Skotlex]
+ ShowStatus("cleaning party table...\n");
+ sprintf (tmp_sql,
+ "DELETE FROM `%s` USING `%s` LEFT JOIN `%s` ON `%s`.leader_id =`%s`.account_id AND `%s`.leader_char = `%s`.char_id WHERE `%s`.account_id IS NULL",
+ party_db, party_db, char_db, party_db, char_db, party_db, char_db, char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ */
+ return 0;
+}
+
+void inter_party_sql_final(void)
+{
+ party_db_->destroy(party_db_, NULL);
+ aFree(party_pt);
+ return;
+}
+
+// Search for the party according to its name
+struct party_data* search_partyname(char *str)
+{
+ char t_name[NAME_LENGTH*2];
+ int party_id;
+
+ sprintf(tmp_sql,"SELECT `party_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res==NULL || mysql_num_rows(sql_res)<=0)
+ {
+ if (sql_res) mysql_free_result(sql_res);
+ return NULL;
+ }
+ sql_row = mysql_fetch_row(sql_res);
+ party_id = sql_row?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+
+ return inter_party_fromsql(party_id);
+}
+
+// Returns whether this party can keep having exp share or not.
+int party_check_exp_share(struct party_data *p)
+{
+ return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level);
+}
+
+// Is there any member in the party?
+int party_check_empty(struct party_data *p)
+{
+ int i;
+ if (p==NULL||p->party.party_id==0) return 1;
+ for(i=0;i<MAX_PARTY && !p->party.member[i].account_id;i++);
+ if (i < MAX_PARTY) return 0;
+ // If there is no member, then break the party
+ mapif_party_broken(p->party.party_id,0);
+ inter_party_tosql(&p->party, PS_BREAK, 0);
+ return 1;
+}
+
+
+// Check if a member is in two party, not necessary :)
+int party_check_conflict(int party_id,int account_id,int char_id)
+{
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ƒp[ƒeƒB쬉”Û
+int mapif_party_created(int fd,int account_id,int char_id,struct party *p)
+{
+ WFIFOHEAD(fd, 39);
+ WFIFOW(fd,0)=0x3820;
+ WFIFOL(fd,2)=account_id;
+ WFIFOL(fd,6)=char_id;
+ if(p!=NULL){
+ WFIFOB(fd,10)=0;
+ WFIFOL(fd,11)=p->party_id;
+ memcpy(WFIFOP(fd,15),p->name,NAME_LENGTH);
+ ShowInfo("int_party: Party created (%d - %s)\n",p->party_id,p->name);
+ }else{
+ WFIFOB(fd,10)=1;
+ WFIFOL(fd,11)=0;
+ memset(WFIFOP(fd,15),0,NAME_LENGTH);
+ }
+ WFIFOSET(fd,39);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
+int mapif_party_noinfo(int fd,int party_id)
+{
+ WFIFOHEAD(fd,8);
+ WFIFOW(fd,0)=0x3821;
+ WFIFOW(fd,2)=8;
+ WFIFOL(fd,4)=party_id;
+ WFIFOSET(fd,8);
+ ShowWarning("int_party: info not found %d\n",party_id);
+ return 0;
+}
+// ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
+int mapif_party_info(int fd,struct party *p)
+{
+ unsigned char buf[5+sizeof(struct party)];
+ WBUFW(buf,0)=0x3821;
+ WBUFW(buf,2)=4+sizeof(struct party);
+ memcpy(buf+4,p,sizeof(struct party));
+
+ if(fd<0)
+ mapif_sendall(buf,WBUFW(buf,2));
+ else
+ mapif_send(fd,buf,WBUFW(buf,2));
+ return 0;
+}
+// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
+int mapif_party_memberadded(int fd, int party_id, int account_id, int char_id, int flag) {
+ WFIFOHEAD(fd, 15);
+ WFIFOW(fd,0) = 0x3822;
+ WFIFOL(fd,2) = party_id;
+ WFIFOL(fd,6) = account_id;
+ WFIFOL(fd,10) = char_id;
+ WFIFOB(fd,14) = flag;
+ WFIFOSET(fd,15);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
+int mapif_party_optionchanged(int fd,struct party *p,int account_id,int flag)
+{
+ unsigned char buf[16];
+ WBUFW(buf,0)=0x3823;
+ WBUFL(buf,2)=p->party_id;
+ WBUFL(buf,6)=account_id;
+ WBUFW(buf,10)=p->exp;
+ WBUFW(buf,12)=p->item;
+ WBUFB(buf,14)=flag;
+ if(flag==0)
+ mapif_sendall(buf,15);
+ else
+ mapif_send(fd,buf,15);
+ return 0;
+}
+
+//Checks whether the even-share setting of a party is broken when a character logs in. [Skotlex]
+int inter_party_logged(int party_id, int account_id, int char_id)
+{
+ struct party_data *p;
+ int i;
+
+ if (party_id <= 0)
+ return 0;
+
+ if (!party_id)
+ return 0;
+ p = inter_party_fromsql(party_id);
+ if(!p) //Non existant party?
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++)
+ if(p->party.member[i].account_id==account_id &&
+ p->party.member[i].char_id==char_id)
+ {
+ if (!p->party.member[i].online) {
+ p->party.member[i].online = 1;
+ p->party.count++;
+ if(p->party.member[i].lv < p->min_lv ||
+ p->party.member[i].lv > p->max_lv)
+ int_party_check_lv(p);
+ }
+ break;
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒB’E‘Þ’Ê’m
+int mapif_party_leaved(int party_id,int account_id, int char_id) {
+ unsigned char buf[16];
+
+ WBUFW(buf,0) = 0x3824;
+ WBUFL(buf,2) = party_id;
+ WBUFL(buf,6) = account_id;
+ WBUFL(buf,10) = char_id;
+ mapif_sendall(buf, 14);
+ return 0;
+}
+
+// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
+int mapif_party_membermoved(struct party *p,int idx)
+{
+ unsigned char buf[20];
+
+ WBUFW(buf,0) = 0x3825;
+ WBUFL(buf,2) = p->party_id;
+ WBUFL(buf,6) = p->member[idx].account_id;
+ WBUFL(buf,10) = p->member[idx].char_id;
+ WBUFW(buf,14) = p->member[idx].map;
+ WBUFB(buf,16) = p->member[idx].online;
+ WBUFW(buf,17) = p->member[idx].lv;
+ mapif_sendall(buf, 19);
+ return 0;
+}
+
+// ƒp[ƒeƒB‰ðŽU’Ê’m
+int mapif_party_broken(int party_id,int flag)
+{
+ unsigned char buf[16];
+ WBUFW(buf,0)=0x3826;
+ WBUFL(buf,2)=party_id;
+ WBUFB(buf,6)=flag;
+ mapif_sendall(buf,7);
+ //printf("int_party: broken %d\n",party_id);
+ return 0;
+}
+// ƒp[ƒeƒB“à”­Œ¾
+int mapif_party_message(int party_id,int account_id,char *mes,int len, int sfd)
+{
+ unsigned char buf[512];
+ WBUFW(buf,0)=0x3827;
+ WBUFW(buf,2)=len+12;
+ WBUFL(buf,4)=party_id;
+ WBUFL(buf,8)=account_id;
+ memcpy(WBUFP(buf,12),mes,len);
+ mapif_sendallwos(sfd, buf,len+12);
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+
+// Create Party
+int mapif_parse_CreateParty(int fd, char *name, int item, int item2, struct party_member *leader)
+{
+ struct party_data *p;
+ int i;
+ if( (p=search_partyname(name))!=NULL){
+ mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
+ return 0;
+ }
+ // Check Authorised letters/symbols in the name of the character
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
+ return 0;
+ }
+ }
+
+ p= aCalloc(1, sizeof(struct party_data));
+
+ memcpy(p->party.name,name,NAME_LENGTH);
+ p->party.exp=0;
+ p->party.item=(item?1:0)|(item2?2:0);
+
+ memcpy(&p->party.member[0], leader, sizeof(struct party_member));
+ p->party.member[0].leader=1;
+ p->party.member[0].online=1;
+
+ p->party.party_id=-1;//New party.
+ if (inter_party_tosql(&p->party,PS_CREATE|PS_ADDMEMBER,0)) {
+ //Add party to db
+ int_party_calc_state(p);
+ idb_put(party_db_, p->party.party_id, p);
+ mapif_party_created(fd,leader->account_id,leader->char_id,&p->party);
+ mapif_party_info(fd,&p->party);
+ } else { //Failed to create party.
+ aFree(p);
+ mapif_party_created(fd,leader->account_id,leader->char_id,NULL);
+ }
+
+ return 0;
+}
+// ƒp[ƒeƒBî•ñ—v‹
+int mapif_parse_PartyInfo(int fd,int party_id)
+{
+ struct party_data *p;
+ p = inter_party_fromsql(party_id);
+
+ if (p)
+ mapif_party_info(fd,&p->party);
+ else
+ mapif_party_noinfo(fd,party_id);
+ return 0;
+}
+// ƒp[ƒeƒB’ljÁ—v‹
+int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
+ struct party_data *p;
+ int i;
+
+ p = inter_party_fromsql(party_id);
+
+ if(!p || p->size == MAX_PARTY){
+ mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
+ return 0;
+ }
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->party.member[i].account_id)
+ continue;
+
+ memcpy(&p->party.member[i], member, sizeof(struct party_member));
+ p->party.member[i].leader=0;
+ if (p->party.member[i].online) p->party.count++;
+ p->size++;
+ if (p->size == 3) //Check family state.
+ int_party_calc_state(p);
+ else //Check even share range.
+ if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
+ if (p->family) p->family = 0; //Family state broken.
+ int_party_check_lv(p);
+ }
+
+ mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,0);
+ mapif_party_info(-1,&p->party);
+ inter_party_tosql(&p->party, PS_ADDMEMBER, i);
+ return 0;
+ }
+ //Party full
+ mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
+ return 0;
+}
+// ƒp[ƒeƒB[Ý’è•ÏX—v‹
+int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
+{
+ struct party_data *p;
+ int flag = 0;
+ p = inter_party_fromsql(party_id);
+
+ if(!p)
+ return 0;
+
+ p->party.exp=exp;
+ if( exp && !party_check_exp_share(p) ){
+ flag|=0x01;
+ p->party.exp=0;
+ }
+ p->party.item = item&0x3; //Filter out invalid values.
+ mapif_party_optionchanged(fd,&p->party,account_id,flag);
+ inter_party_tosql(&p->party, PS_BASIC, 0);
+ return 0;
+}
+// ƒp[ƒeƒB’E‘Þ—v‹
+int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id)
+{
+ struct party_data *p;
+ int i,j=-1;
+
+ p = inter_party_fromsql(party_id);
+ if (!p) { //Party does not exists?
+ sprintf(tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+ }
+
+ for (i = 0; i < MAX_PARTY; i++) {
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id) {
+ break;
+ }
+ }
+ if (i >= MAX_PARTY)
+ return 0; //Member not found?
+
+ mapif_party_leaved(party_id, account_id, char_id);
+
+ if (p->party.member[i].leader){
+ p->party.member[i].account_id = 0;
+ for (j = 0; j < MAX_PARTY; j++) {
+ if (!p->party.member[j].account_id)
+ continue;
+ mapif_party_leaved(party_id, p->party.member[j].account_id, p->party.member[j].char_id);
+ p->party.member[j].account_id = 0;
+ }
+ //Party gets deleted on the check_empty call below.
+ } else {
+ inter_party_tosql(&p->party,PS_DELMEMBER,i);
+ j = p->party.member[i].lv;
+ if(p->party.member[i].online) p->party.count--;
+ memset(&p->party.member[i], 0, sizeof(struct party_member));
+ p->size--;
+ if (j == p->min_lv || j == p->max_lv || p->family)
+ {
+ if(p->family) p->family = 0; //Family state broken.
+ int_party_check_lv(p);
+ }
+ }
+
+ if (party_check_empty(p) == 0)
+ mapif_party_info(-1,&p->party);
+ return 0;
+}
+// When member goes to other map
+int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv)
+{
+ struct party_data *p;
+ int i;
+
+ p = inter_party_fromsql(party_id);
+ if (p == NULL)
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ p->party.member[i].map = map;
+ if (p->party.member[i].online != online)
+ {
+ p->party.member[i].online = online;
+ if (online)
+ p->party.count++;
+ else
+ p->party.count--;
+ // Even share check situations: Family state (always breaks)
+ // character logging on/off is max/min level (update level range)
+ // or character logging on/off has a different level (update level range using new level)
+ if (p->family ||
+ (p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
+ (p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
+ )
+ {
+ p->party.member[i].lv = lv;
+ int_party_check_lv(p);
+ }
+ }
+ if (p->party.member[i].lv != lv) {
+ if(p->party.member[i].lv == p->min_lv ||
+ p->party.member[i].lv == p->max_lv)
+ {
+ p->party.member[i].lv = lv;
+ int_party_check_lv(p);
+ } else
+ p->party.member[i].lv = lv;
+ }
+ mapif_party_membermoved(&p->party, i);
+ break;
+ }
+ }
+ return 0;
+}
+// ƒp[ƒeƒB‰ðŽU—v‹
+int mapif_parse_BreakParty(int fd,int party_id)
+{
+ struct party_data *p;
+
+ p = inter_party_fromsql(party_id);
+
+ if(!p)
+ return 0;
+ inter_party_tosql(&p->party,PS_BREAK,0);
+ mapif_party_broken(fd,party_id);
+ return 0;
+}
+// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
+int mapif_parse_PartyMessage(int fd,int party_id,int account_id,char *mes,int len)
+{
+ return mapif_party_message(party_id,account_id,mes,len, fd);
+}
+// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
+int mapif_parse_PartyCheck(int fd,int party_id,int account_id,int char_id)
+{
+ return party_check_conflict(party_id,account_id,char_id);
+}
+
+int mapif_parse_PartyLeaderChange(int fd,int party_id,int account_id,int char_id)
+{
+ struct party_data *p;
+ int i;
+
+ p = inter_party_fromsql(party_id);
+
+ if(!p)
+ return 0;
+
+ for (i = 0; i < MAX_PARTY; i++)
+ {
+ if(p->party.member[i].leader)
+ p->party.member[i].leader = 0;
+ if(p->party.member[i].account_id == account_id &&
+ p->party.member[i].char_id == char_id)
+ {
+ p->party.member[i].leader = 1;
+ inter_party_tosql(&p->party,PS_LEADER, i);
+ }
+ }
+ return 1;
+}
+
+// map server ‚©‚ç‚Ì’ÊM
+// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
+// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
+// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
+// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
+int inter_party_parse_frommap(int fd)
+{
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)) {
+ case 0x3020: mapif_parse_CreateParty(fd, (char*)RFIFOP(fd,4), RFIFOB(fd,28), RFIFOB(fd,29), (struct party_member*)RFIFOP(fd,30)); break;
+ case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
+ case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,4), (struct party_member*)RFIFOP(fd,8)); break;
+ case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
+ case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOW(fd,14), RFIFOB(fd,16), RFIFOW(fd,17)); break;
+ case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
+ case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
+ case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ case 0x3029: mapif_parse_PartyLeaderChange(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
+int inter_party_leave(int party_id,int account_id, int char_id)
+{
+ return mapif_parse_PartyLeave(-1,party_id,account_id, char_id);
+}
+
+int inter_party_CharOnline(int char_id, int party_id) {
+ struct party_data *p;
+ int i;
+
+ if (party_id == -1) {
+ //Get party_id from the database
+ sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if(sql_res == NULL)
+ return 0; //Eh? No party?
+
+ sql_row = mysql_fetch_row(sql_res);
+ party_id = sql_row?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+ }
+ if (party_id == 0)
+ return 0; //No party...
+
+ p = inter_party_fromsql(party_id);
+ if(!p) {
+ ShowError("Character %d's party %d not found!\n", char_id, party_id);
+ return 0;
+ }
+
+ //Set member online
+ for(i=0; i<MAX_PARTY; i++) {
+ if (p->party.member[i].char_id == char_id) {
+ if (!p->party.member[i].online) {
+ p->party.member[i].online = 1;
+ p->party.count++;
+ if (p->party.member[i].lv < p->min_lv ||
+ p->party.member[i].lv > p->max_lv)
+ int_party_check_lv(p);
+ }
+ break;
+ }
+ }
+ return 1;
+}
+
+int inter_party_CharOffline(int char_id, int party_id) {
+ struct party_data *p=NULL;
+ int i;
+
+ if (party_id == -1) {
+ //Get guild_id from the database
+ sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if(sql_res == NULL)
+ return 0; //Eh? No party?
+
+ sql_row = mysql_fetch_row(sql_res);
+ party_id = sql_row?atoi(sql_row[0]):0;
+ mysql_free_result(sql_res);
+ }
+ if (party_id == 0)
+ return 0; //No party...
+
+ //Character has a party, set character offline and check if they were the only member online
+ if ((p = inter_party_fromsql(party_id)) == NULL)
+ return 0;
+
+ //Set member offline
+ for(i=0; i< MAX_PARTY; i++) {
+ if(p->party.member[i].char_id == char_id)
+ {
+ p->party.member[i].online = 0;
+ p->party.count--;
+ if(p->party.member[i].lv == p->min_lv ||
+ p->party.member[i].lv == p->max_lv)
+ int_party_check_lv(p);
+ break;
+ }
+ }
+
+ if(!p->party.count)
+ //Parties don't have any data that needs be saved at this point... so just remove it from memory.
+ idb_remove(party_db_, party_id);
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h
index 7e6219f9c..4691447e9 100644
--- a/src/char_sql/int_party.h
+++ b/src/char_sql/int_party.h
@@ -1,30 +1,30 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_PARTY_SQL_H_
-#define _INT_PARTY_SQL_H_
-
-//Party Flags on what to save/delete.
-//Create a new party entry (index holds leader's info)
-#define PS_CREATE 0x01
-//Update basic party info.
-#define PS_BASIC 0x02
-//Update party's leader
-#define PS_LEADER 0x04
-//Specify new party member (index specifies which party member)
-#define PS_ADDMEMBER 0x08
-//Specify member that left (index specifies which party member)
-#define PS_DELMEMBER 0x10
-//Specify that this party must be deleted.
-#define PS_BREAK 0x20
-
-int inter_party_parse_frommap(int fd);
-int inter_party_sql_init(void);
-void inter_party_sql_final(void);
-int inter_party_leave(int party_id,int account_id, int char_id);
-int inter_party_logged(int party_id, int account_id, int char_id);
-int inter_party_CharOnline(int char_id, int party_id);
-int inter_party_CharOffline(int char_id, int party_id);
-//Required for the TXT->SQL converter
-int inter_party_tosql(struct party *p, int flag, int index);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_PARTY_SQL_H_
+#define _INT_PARTY_SQL_H_
+
+//Party Flags on what to save/delete.
+//Create a new party entry (index holds leader's info)
+#define PS_CREATE 0x01
+//Update basic party info.
+#define PS_BASIC 0x02
+//Update party's leader
+#define PS_LEADER 0x04
+//Specify new party member (index specifies which party member)
+#define PS_ADDMEMBER 0x08
+//Specify member that left (index specifies which party member)
+#define PS_DELMEMBER 0x10
+//Specify that this party must be deleted.
+#define PS_BREAK 0x20
+
+int inter_party_parse_frommap(int fd);
+int inter_party_sql_init(void);
+void inter_party_sql_final(void);
+int inter_party_leave(int party_id,int account_id, int char_id);
+int inter_party_logged(int party_id, int account_id, int char_id);
+int inter_party_CharOnline(int char_id, int party_id);
+int inter_party_CharOffline(int char_id, int party_id);
+//Required for the TXT->SQL converter
+int inter_party_tosql(struct party *p, int flag, int index);
+#endif
diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c
index 69eb4ec02..ff4f0edb9 100644
--- a/src/char_sql/int_pet.c
+++ b/src/char_sql/int_pet.c
@@ -1,372 +1,372 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by Jioh L. Jung
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-
-struct s_pet *pet_pt;
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-//---------------------------------------------------------
-int inter_pet_tosql(int pet_id, struct s_pet *p) {
- //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
- char t_name[NAME_LENGTH*2];
-
- jstrescapecpy(t_name, p->name);
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
- if (pet_id == -1) //New pet.
- sprintf(tmp_sql,"INSERT INTO `%s` "
- "(`class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) "
- "VALUES ('%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate);
-
- else //Update pet.
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
- pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- } else if (pet_id == -1) { //New pet inserted.
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) != 0) {
- p->pet_id = pet_id = (int)mysql_insert_id(&mysql_handle);
- } else {
- ShowError("inter_pet_tosql: Failed to retrieve new pet_id for '%s'. Pet creation aborted.\n", p->name);
- return 0;
- }
- }
-
- if (save_log)
- ShowInfo("Pet saved %d - %s.\n", pet_id, p->name);
- return 1;
-}
-#ifndef TXT_SQL_CONVERT
-int inter_pet_fromsql(int pet_id, struct s_pet *p){
-
-#ifdef NOISY
- ShowInfo("Loading pet (%d)...\n",pet_id);
-#endif
- memset(p, 0, sizeof(struct s_pet));
-
- //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
-
- sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- p->pet_id = pet_id;
- p->class_ = atoi(sql_row[1]);
- memcpy(p->name, sql_row[2],NAME_LENGTH-1);
- p->account_id = atoi(sql_row[3]);
- p->char_id = atoi(sql_row[4]);
- p->level = atoi(sql_row[5]);
- p->egg_id = atoi(sql_row[6]);
- p->equip = atoi(sql_row[7]);
- p->intimate = atoi(sql_row[8]);
- p->hungry = atoi(sql_row[9]);
- p->rename_flag = atoi(sql_row[10]);
- p->incuvate = atoi(sql_row[11]);
- }
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- mysql_free_result(sql_res);
-
- if (save_log)
- ShowInfo("Pet loaded (%d - %s).\n", pet_id, p->name);
- return 0;
-}
-//----------------------------------------------
-
-int inter_pet_sql_init(void){
- //memory alloc
- pet_pt = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
- return 0;
-}
-void inter_pet_sql_final(void){
- if (pet_pt) aFree(pet_pt);
- return;
-}
-//----------------------------------
-int inter_pet_delete(int pet_id){
- ShowInfo("delete pet request: %d...\n",pet_id);
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
-}
-//------------------------------------------------------
-int mapif_pet_created(int fd, int account_id, struct s_pet *p)
-{
- WFIFOHEAD(fd, 11);
- WFIFOW(fd, 0) =0x3880;
- WFIFOL(fd, 2) =account_id;
- if(p!=NULL){
- WFIFOB(fd, 6)=0;
- WFIFOL(fd, 7) =p->pet_id;
- ShowInfo("int_pet: created pet %d - %s\n", p->pet_id, p->name);
- }else{
- WFIFOB(fd, 6)=1;
- WFIFOL(fd, 7)=0;
- }
- WFIFOSET(fd, 11);
-
- return 0;
-}
-
-int mapif_pet_info(int fd, int account_id, struct s_pet *p){
- WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
- WFIFOW(fd, 0) =0x3881;
- WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
- WFIFOL(fd, 4) =account_id;
- WFIFOB(fd, 8)=0;
- memcpy(WFIFOP(fd, 9), p, sizeof(struct s_pet));
- WFIFOSET(fd, WFIFOW(fd, 2));
-
- return 0;
-}
-
-int mapif_pet_noinfo(int fd, int account_id){
- WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
- WFIFOW(fd, 0) =0x3881;
- WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
- WFIFOL(fd, 4) =account_id;
- WFIFOB(fd, 8)=1;
- memset(WFIFOP(fd, 9), 0, sizeof(struct s_pet));
- WFIFOSET(fd, WFIFOW(fd, 2));
-
- return 0;
-}
-
-int mapif_save_pet_ack(int fd, int account_id, int flag){
- WFIFOHEAD(fd, 7);
- WFIFOW(fd, 0) =0x3882;
- WFIFOL(fd, 2) =account_id;
- WFIFOB(fd, 6) =flag;
- WFIFOSET(fd, 7);
-
- return 0;
-}
-
-int mapif_delete_pet_ack(int fd, int flag){
- WFIFOHEAD(fd, 3);
- WFIFOW(fd, 0) =0x3883;
- WFIFOB(fd, 2) =flag;
- WFIFOSET(fd, 3);
-
- return 0;
-}
-
-int mapif_rename_pet_ack(int fd, int account_id, int char_id, int flag, char *name){
- WFIFOHEAD(fd, NAME_LENGTH+12);
- WFIFOW(fd, 0) =0x3884;
- WFIFOL(fd, 2) =account_id;
- WFIFOL(fd, 6) =char_id;
- WFIFOB(fd, 10) =flag;
- memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
- WFIFOSET(fd, NAME_LENGTH+12);
-
- return 0;
-}
-
-
-int mapif_create_pet(int fd, int account_id, int char_id, short pet_class, short pet_lv, short pet_egg_id,
- short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name){
-
- memset(pet_pt, 0, sizeof(struct s_pet));
- memcpy(pet_pt->name, pet_name, NAME_LENGTH-1);
- if(incuvate == 1)
- pet_pt->account_id = pet_pt->char_id = 0;
- else {
- pet_pt->account_id = account_id;
- pet_pt->char_id = char_id;
- }
- pet_pt->class_ = pet_class;
- pet_pt->level = pet_lv;
- pet_pt->egg_id = pet_egg_id;
- pet_pt->equip = pet_equip;
- pet_pt->intimate = intimate;
- pet_pt->hungry = hungry;
- pet_pt->rename_flag = rename_flag;
- pet_pt->incuvate = incuvate;
-
- if(pet_pt->hungry < 0)
- pet_pt->hungry = 0;
- else if(pet_pt->hungry > 100)
- pet_pt->hungry = 100;
- if(pet_pt->intimate < 0)
- pet_pt->intimate = 0;
- else if(pet_pt->intimate > 1000)
- pet_pt->intimate = 1000;
-
- pet_pt->pet_id = -1; //Signal NEW pet.
- if (inter_pet_tosql(pet_pt->pet_id,pet_pt))
- mapif_pet_created(fd, account_id, pet_pt);
- else //Failed...
- mapif_pet_created(fd, account_id, NULL);
-
- return 0;
-}
-
-int mapif_load_pet(int fd, int account_id, int char_id, int pet_id){
- memset(pet_pt, 0, sizeof(struct s_pet));
-
- inter_pet_fromsql(pet_id, pet_pt);
-
- if(pet_pt!=NULL) {
- if(pet_pt->incuvate == 1) {
- pet_pt->account_id = pet_pt->char_id = 0;
- mapif_pet_info(fd, account_id, pet_pt);
- }
- else if(account_id == pet_pt->account_id && char_id == pet_pt->char_id)
- mapif_pet_info(fd, account_id, pet_pt);
- else
- mapif_pet_noinfo(fd, account_id);
- }
- else
- mapif_pet_noinfo(fd, account_id);
-
- return 0;
-}
-
-int mapif_save_pet(int fd, int account_id, struct s_pet *data) {
- //here process pet save request.
- int len;
- RFIFOHEAD(fd);
- len=RFIFOW(fd, 2);
- if(sizeof(struct s_pet)!=len-8) {
- ShowError("inter pet: data size error %d %d\n", sizeof(struct s_pet), len-8);
- }
-
- else{
- if(data->hungry < 0)
- data->hungry = 0;
- else if(data->hungry > 100)
- data->hungry = 100;
- if(data->intimate < 0)
- data->intimate = 0;
- else if(data->intimate > 1000)
- data->intimate = 1000;
- inter_pet_tosql(data->pet_id,data);
- mapif_save_pet_ack(fd, account_id, 0);
- }
-
- return 0;
-}
-
-int mapif_delete_pet(int fd, int pet_id){
- mapif_delete_pet_ack(fd, inter_pet_delete(pet_id));
-
- return 0;
-}
-
-int mapif_rename_pet(int fd, int account_id, int char_id, char *name){
- int i;
-
- // Check Authorised letters/symbols in the name of the pet
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) == NULL) {
- mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < NAME_LENGTH && name[i]; i++)
- if (strchr(char_name_letters, name[i]) != NULL) {
- mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
- return 0;
- }
- }
-
- mapif_rename_pet_ack(fd, account_id, char_id, 1, name);
- return 0;
-}
-
-int mapif_parse_CreatePet(int fd){
- RFIFOHEAD(fd);
- mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOW(fd, 18),
- RFIFOW(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), (char*)RFIFOP(fd, 24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd){
- RFIFOHEAD(fd);
- mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd){
- RFIFOHEAD(fd);
- mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd){
- RFIFOHEAD(fd);
- mapif_delete_pet(fd, RFIFOL(fd, 2));
- return 0;
-}
-
-int mapif_parse_RenamePet(int fd){
- RFIFOHEAD(fd);
- mapif_rename_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
- return 0;
-}
-
-int inter_pet_parse_frommap(int fd){
- RFIFOHEAD(fd);
- switch(RFIFOW(fd, 0)){
- case 0x3080: mapif_parse_CreatePet(fd); break;
- case 0x3081: mapif_parse_LoadPet(fd); break;
- case 0x3082: mapif_parse_SavePet(fd); break;
- case 0x3083: mapif_parse_DeletePet(fd); break;
- case 0x3084: mapif_parse_RenamePet(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by Jioh L. Jung
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "char.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+
+struct s_pet *pet_pt;
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+//---------------------------------------------------------
+int inter_pet_tosql(int pet_id, struct s_pet *p) {
+ //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
+ char t_name[NAME_LENGTH*2];
+
+ jstrescapecpy(t_name, p->name);
+
+ if(p->hungry < 0)
+ p->hungry = 0;
+ else if(p->hungry > 100)
+ p->hungry = 100;
+ if(p->intimate < 0)
+ p->intimate = 0;
+ else if(p->intimate > 1000)
+ p->intimate = 1000;
+ if (pet_id == -1) //New pet.
+ sprintf(tmp_sql,"INSERT INTO `%s` "
+ "(`class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) "
+ "VALUES ('%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
+ p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate);
+
+ else //Update pet.
+ sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
+ pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
+ p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ } else if (pet_id == -1) { //New pet inserted.
+ if(mysql_field_count(&mysql_handle) == 0 &&
+ mysql_insert_id(&mysql_handle) != 0) {
+ p->pet_id = pet_id = (int)mysql_insert_id(&mysql_handle);
+ } else {
+ ShowError("inter_pet_tosql: Failed to retrieve new pet_id for '%s'. Pet creation aborted.\n", p->name);
+ return 0;
+ }
+ }
+
+ if (save_log)
+ ShowInfo("Pet saved %d - %s.\n", pet_id, p->name);
+ return 1;
+}
+#ifndef TXT_SQL_CONVERT
+int inter_pet_fromsql(int pet_id, struct s_pet *p){
+
+#ifdef NOISY
+ ShowInfo("Loading pet (%d)...\n",pet_id);
+#endif
+ memset(p, 0, sizeof(struct s_pet));
+
+ //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
+
+ sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ sql_row = mysql_fetch_row(sql_res);
+
+ p->pet_id = pet_id;
+ p->class_ = atoi(sql_row[1]);
+ memcpy(p->name, sql_row[2],NAME_LENGTH-1);
+ p->account_id = atoi(sql_row[3]);
+ p->char_id = atoi(sql_row[4]);
+ p->level = atoi(sql_row[5]);
+ p->egg_id = atoi(sql_row[6]);
+ p->equip = atoi(sql_row[7]);
+ p->intimate = atoi(sql_row[8]);
+ p->hungry = atoi(sql_row[9]);
+ p->rename_flag = atoi(sql_row[10]);
+ p->incuvate = atoi(sql_row[11]);
+ }
+ if(p->hungry < 0)
+ p->hungry = 0;
+ else if(p->hungry > 100)
+ p->hungry = 100;
+ if(p->intimate < 0)
+ p->intimate = 0;
+ else if(p->intimate > 1000)
+ p->intimate = 1000;
+
+ mysql_free_result(sql_res);
+
+ if (save_log)
+ ShowInfo("Pet loaded (%d - %s).\n", pet_id, p->name);
+ return 0;
+}
+//----------------------------------------------
+
+int inter_pet_sql_init(void){
+ //memory alloc
+ pet_pt = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
+ return 0;
+}
+void inter_pet_sql_final(void){
+ if (pet_pt) aFree(pet_pt);
+ return;
+}
+//----------------------------------
+int inter_pet_delete(int pet_id){
+ ShowInfo("delete pet request: %d...\n",pet_id);
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+}
+//------------------------------------------------------
+int mapif_pet_created(int fd, int account_id, struct s_pet *p)
+{
+ WFIFOHEAD(fd, 11);
+ WFIFOW(fd, 0) =0x3880;
+ WFIFOL(fd, 2) =account_id;
+ if(p!=NULL){
+ WFIFOB(fd, 6)=0;
+ WFIFOL(fd, 7) =p->pet_id;
+ ShowInfo("int_pet: created pet %d - %s\n", p->pet_id, p->name);
+ }else{
+ WFIFOB(fd, 6)=1;
+ WFIFOL(fd, 7)=0;
+ }
+ WFIFOSET(fd, 11);
+
+ return 0;
+}
+
+int mapif_pet_info(int fd, int account_id, struct s_pet *p){
+ WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
+ WFIFOW(fd, 0) =0x3881;
+ WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
+ WFIFOL(fd, 4) =account_id;
+ WFIFOB(fd, 8)=0;
+ memcpy(WFIFOP(fd, 9), p, sizeof(struct s_pet));
+ WFIFOSET(fd, WFIFOW(fd, 2));
+
+ return 0;
+}
+
+int mapif_pet_noinfo(int fd, int account_id){
+ WFIFOHEAD(fd, sizeof(struct s_pet) + 9);
+ WFIFOW(fd, 0) =0x3881;
+ WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
+ WFIFOL(fd, 4) =account_id;
+ WFIFOB(fd, 8)=1;
+ memset(WFIFOP(fd, 9), 0, sizeof(struct s_pet));
+ WFIFOSET(fd, WFIFOW(fd, 2));
+
+ return 0;
+}
+
+int mapif_save_pet_ack(int fd, int account_id, int flag){
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd, 0) =0x3882;
+ WFIFOL(fd, 2) =account_id;
+ WFIFOB(fd, 6) =flag;
+ WFIFOSET(fd, 7);
+
+ return 0;
+}
+
+int mapif_delete_pet_ack(int fd, int flag){
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd, 0) =0x3883;
+ WFIFOB(fd, 2) =flag;
+ WFIFOSET(fd, 3);
+
+ return 0;
+}
+
+int mapif_rename_pet_ack(int fd, int account_id, int char_id, int flag, char *name){
+ WFIFOHEAD(fd, NAME_LENGTH+12);
+ WFIFOW(fd, 0) =0x3884;
+ WFIFOL(fd, 2) =account_id;
+ WFIFOL(fd, 6) =char_id;
+ WFIFOB(fd, 10) =flag;
+ memcpy(WFIFOP(fd, 11), name, NAME_LENGTH);
+ WFIFOSET(fd, NAME_LENGTH+12);
+
+ return 0;
+}
+
+
+int mapif_create_pet(int fd, int account_id, int char_id, short pet_class, short pet_lv, short pet_egg_id,
+ short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name){
+
+ memset(pet_pt, 0, sizeof(struct s_pet));
+ memcpy(pet_pt->name, pet_name, NAME_LENGTH-1);
+ if(incuvate == 1)
+ pet_pt->account_id = pet_pt->char_id = 0;
+ else {
+ pet_pt->account_id = account_id;
+ pet_pt->char_id = char_id;
+ }
+ pet_pt->class_ = pet_class;
+ pet_pt->level = pet_lv;
+ pet_pt->egg_id = pet_egg_id;
+ pet_pt->equip = pet_equip;
+ pet_pt->intimate = intimate;
+ pet_pt->hungry = hungry;
+ pet_pt->rename_flag = rename_flag;
+ pet_pt->incuvate = incuvate;
+
+ if(pet_pt->hungry < 0)
+ pet_pt->hungry = 0;
+ else if(pet_pt->hungry > 100)
+ pet_pt->hungry = 100;
+ if(pet_pt->intimate < 0)
+ pet_pt->intimate = 0;
+ else if(pet_pt->intimate > 1000)
+ pet_pt->intimate = 1000;
+
+ pet_pt->pet_id = -1; //Signal NEW pet.
+ if (inter_pet_tosql(pet_pt->pet_id,pet_pt))
+ mapif_pet_created(fd, account_id, pet_pt);
+ else //Failed...
+ mapif_pet_created(fd, account_id, NULL);
+
+ return 0;
+}
+
+int mapif_load_pet(int fd, int account_id, int char_id, int pet_id){
+ memset(pet_pt, 0, sizeof(struct s_pet));
+
+ inter_pet_fromsql(pet_id, pet_pt);
+
+ if(pet_pt!=NULL) {
+ if(pet_pt->incuvate == 1) {
+ pet_pt->account_id = pet_pt->char_id = 0;
+ mapif_pet_info(fd, account_id, pet_pt);
+ }
+ else if(account_id == pet_pt->account_id && char_id == pet_pt->char_id)
+ mapif_pet_info(fd, account_id, pet_pt);
+ else
+ mapif_pet_noinfo(fd, account_id);
+ }
+ else
+ mapif_pet_noinfo(fd, account_id);
+
+ return 0;
+}
+
+int mapif_save_pet(int fd, int account_id, struct s_pet *data) {
+ //here process pet save request.
+ int len;
+ RFIFOHEAD(fd);
+ len=RFIFOW(fd, 2);
+ if(sizeof(struct s_pet)!=len-8) {
+ ShowError("inter pet: data size error %d %d\n", sizeof(struct s_pet), len-8);
+ }
+
+ else{
+ if(data->hungry < 0)
+ data->hungry = 0;
+ else if(data->hungry > 100)
+ data->hungry = 100;
+ if(data->intimate < 0)
+ data->intimate = 0;
+ else if(data->intimate > 1000)
+ data->intimate = 1000;
+ inter_pet_tosql(data->pet_id,data);
+ mapif_save_pet_ack(fd, account_id, 0);
+ }
+
+ return 0;
+}
+
+int mapif_delete_pet(int fd, int pet_id){
+ mapif_delete_pet_ack(fd, inter_pet_delete(pet_id));
+
+ return 0;
+}
+
+int mapif_rename_pet(int fd, int account_id, int char_id, char *name){
+ int i;
+
+ // Check Authorised letters/symbols in the name of the pet
+ if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) == NULL) {
+ mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < NAME_LENGTH && name[i]; i++)
+ if (strchr(char_name_letters, name[i]) != NULL) {
+ mapif_rename_pet_ack(fd, account_id, char_id, 0, name);
+ return 0;
+ }
+ }
+
+ mapif_rename_pet_ack(fd, account_id, char_id, 1, name);
+ return 0;
+}
+
+int mapif_parse_CreatePet(int fd){
+ RFIFOHEAD(fd);
+ mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOW(fd, 18),
+ RFIFOW(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), (char*)RFIFOP(fd, 24));
+ return 0;
+}
+
+int mapif_parse_LoadPet(int fd){
+ RFIFOHEAD(fd);
+ mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
+ return 0;
+}
+
+int mapif_parse_SavePet(int fd){
+ RFIFOHEAD(fd);
+ mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8));
+ return 0;
+}
+
+int mapif_parse_DeletePet(int fd){
+ RFIFOHEAD(fd);
+ mapif_delete_pet(fd, RFIFOL(fd, 2));
+ return 0;
+}
+
+int mapif_parse_RenamePet(int fd){
+ RFIFOHEAD(fd);
+ mapif_rename_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOP(fd, 10));
+ return 0;
+}
+
+int inter_pet_parse_frommap(int fd){
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd, 0)){
+ case 0x3080: mapif_parse_CreatePet(fd); break;
+ case 0x3081: mapif_parse_LoadPet(fd); break;
+ case 0x3082: mapif_parse_SavePet(fd); break;
+ case 0x3083: mapif_parse_DeletePet(fd); break;
+ case 0x3084: mapif_parse_RenamePet(fd); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h
index fa5cbac0d..1b03c9768 100644
--- a/src/char_sql/int_pet.h
+++ b/src/char_sql/int_pet.h
@@ -1,18 +1,18 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_PET_SQL_H_
-#define _INT_PET_SQL_H_
-
-int inter_pet_init(void);
-void inter_pet_sql_final(void);
-int inter_pet_save(void);
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-int inter_pet_sql_init(void);
-//extern char pet_txt[256];
-
-//Exported for use in the TXT-SQL converter.
-int inter_pet_tosql(int pet_id, struct s_pet *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_PET_SQL_H_
+#define _INT_PET_SQL_H_
+
+int inter_pet_init(void);
+void inter_pet_sql_final(void);
+int inter_pet_save(void);
+int inter_pet_delete(int pet_id);
+
+int inter_pet_parse_frommap(int fd);
+int inter_pet_sql_init(void);
+//extern char pet_txt[256];
+
+//Exported for use in the TXT-SQL converter.
+int inter_pet_tosql(int pet_id, struct s_pet *p);
+#endif
diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c
index 578de6bc8..5ca2c25bb 100644
--- a/src/char_sql/int_storage.c
+++ b/src/char_sql/int_storage.c
@@ -1,379 +1,379 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by Jioh L. Jung
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "itemdb.h"
-#include "../common/showmsg.h"
-
-#define STORAGE_MEMINC 16
-
-#ifndef TXT_SQL_CONVERT
-// reset by inter_config_read()
-struct storage *storage_pt=NULL;
-struct guild_storage *guild_storage_pt=NULL;
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-#endif //TXT_SQL_CONVERT
-// storage data -> DB conversion
-int storage_tosql(int account_id,struct storage *p){
- int i,j;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_STORAGE];
- for(i=0;i<MAX_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- for(j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->storage_[i].card[j];
- count++;
- }
- }
-
- memitemdata_to_sql(mapitem, count, account_id,TABLE_STORAGE);
-
- //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-
-// DB -> storage data conversion
-int storage_fromsql(int account_id, struct storage *p){
- int i=0,j;
- char * str_p = tmp_sql;
-
- memset(p,0,sizeof(struct storage)); //clean up memory
- p->storage_amount = 0;
- p->account_id = account_id;
-
- // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p," FROM `%s` WHERE `account_id`='%d' ORDER BY `nameid`", storage_db, account_id);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res)) && i<MAX_STORAGE) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->storage_[i].card[j]= atoi(sql_row[7+j]);
- i++;
- }
- p->storage_amount = i;
- mysql_free_result(sql_res);
- }
-
- ShowInfo ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
- return 1;
-}
-#endif //TXT_SQL_CONVERT
-// Save guild_storage data to sql
-int guild_storage_tosql(int guild_id, struct guild_storage *p){
- int i,j;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->storage_[i].card[j];
- count++;
- }
- }
-
- memitemdata_to_sql(mapitem, count, guild_id,TABLE_GUILD_STORAGE);
-
- ShowInfo ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-// Load guild_storage data to mem
-int guild_storage_fromsql(int guild_id, struct guild_storage *p){
- int i=0,j;
- struct guild_storage *gs=guild_storage_pt;
- char * str_p = tmp_sql;
- p=gs;
-
- memset(p,0,sizeof(struct guild_storage)); //clean up memory
- p->storage_amount = 0;
- p->guild_id = guild_id;
-
- // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p," FROM `%s` WHERE `guild_id`='%d' ORDER BY `nameid`", guild_storage_db, guild_id);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILD_STORAGE) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->storage_[i].card[j] = atoi(sql_row[7+j]);
- i++;
- }
- p->storage_amount = i;
- mysql_free_result(sql_res);
- }
- ShowInfo ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
- return 0;
-}
-
-//---------------------------------------------------------
-// storage data initialize
-int inter_storage_sql_init(void){
-
- //memory alloc
- ShowDebug("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
- storage_pt = (struct storage*)aCalloc(sizeof(struct storage), 1);
- guild_storage_pt = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
-// memset(storage_pt,0,sizeof(struct storage)); //Calloc sets stuff to 0 already. [Skotlex]
-// memset(guild_storage_pt,0,sizeof(struct guild_storage));
-
- return 1;
-}
-// storage data finalize
-void inter_storage_sql_final(void)
-{
- if (storage_pt) aFree(storage_pt);
- if (guild_storage_pt) aFree(guild_storage_pt);
- return;
-}
-// q?f[^?
-int inter_storage_delete(int account_id)
-{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
-}
-int inter_guild_storage_delete(int guild_id)
-{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// packet from map server
-
-// recive packet about storage data
-int mapif_load_storage(int fd,int account_id){
- //load from DB
- WFIFOHEAD(fd, sizeof(struct storage)+8);
- storage_fromsql(account_id, storage_pt);
- WFIFOW(fd,0)=0x3810;
- WFIFOW(fd,2)=sizeof(struct storage)+8;
- WFIFOL(fd,4)=account_id;
- memcpy(WFIFOP(fd,8),storage_pt,sizeof(struct storage));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-// send ack to map server which is "storage data save ok."
-int mapif_save_storage_ack(int fd,int account_id){
- WFIFOHEAD(fd, 7);
- WFIFOW(fd,0)=0x3811;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=0;
- WFIFOSET(fd,7);
- return 0;
-}
-
-int mapif_load_guild_storage(int fd,int account_id,int guild_id)
-{
- int guild_exist=1;
- WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
- WFIFOW(fd,0)=0x3818;
-
-#if 0 // innodb guilds should render this check unnecessary [Aru]
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-#endif
- if(guild_exist==1) {
- guild_storage_fromsql(guild_id,guild_storage_pt);
- WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=guild_id;
- memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage));
- }
- else {
- WFIFOW(fd,2)=12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=0;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
-{
- WFIFOHEAD(fd,11);
- WFIFOW(fd,0)=0x3819;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=guild_id;
- WFIFOB(fd,10)=fail;
- WFIFOSET(fd,11);
- return 0;
-}
-
-//---------------------------------------------------------
-// packet from map server
-
-// recive request about storage data
-int mapif_parse_LoadStorage(int fd){
- RFIFOHEAD(fd);
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// storage data recive and save
-int mapif_parse_SaveStorage(int fd){
- int account_id;
- int len;
- RFIFOHEAD(fd);
- account_id=RFIFOL(fd,4);
- len=RFIFOW(fd,2);
- if(sizeof(struct storage)!=len-8){
- ShowError("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
- }else{
- memcpy(&storage_pt[0],RFIFOP(fd,8),sizeof(struct storage));
- storage_tosql(account_id, storage_pt);
- mapif_save_storage_ack(fd,account_id);
- }
- return 0;
-}
-
-int mapif_parse_LoadGuildStorage(int fd)
-{
- RFIFOHEAD(fd);
- mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-
-int mapif_parse_SaveGuildStorage(int fd)
-{
- int guild_exist=1;
- int guild_id;
- int len;
- RFIFOHEAD(fd);
- guild_id=RFIFOL(fd,8);
- len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- ShowError("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
- }
- else {
-#if 0 // Again, innodb key checks make the check pointless
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-#endif
- if(guild_exist==1) {
- memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage));
- guild_storage_tosql(guild_id,guild_storage_pt);
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
- }
- else
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
- }
- return 0;
-}
-
-
-int inter_storage_parse_frommap(int fd){
- RFIFOHEAD(fd);
- switch(RFIFOW(fd,0)){
- case 0x3010: mapif_parse_LoadStorage(fd); break;
- case 0x3011: mapif_parse_SaveStorage(fd); break;
- case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
- case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by Jioh L. Jung
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "char.h"
+#include "itemdb.h"
+#include "../common/showmsg.h"
+
+#define STORAGE_MEMINC 16
+
+#ifndef TXT_SQL_CONVERT
+// reset by inter_config_read()
+struct storage *storage_pt=NULL;
+struct guild_storage *guild_storage_pt=NULL;
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+#endif //TXT_SQL_CONVERT
+// storage data -> DB conversion
+int storage_tosql(int account_id,struct storage *p){
+ int i,j;
+// int eqcount=1;
+// int noteqcount=1;
+ int count=0;
+ struct itemtmp mapitem[MAX_STORAGE];
+ for(i=0;i<MAX_STORAGE;i++){
+ if(p->storage_[i].nameid>0){
+ mapitem[count].flag=0;
+ mapitem[count].id = p->storage_[i].id;
+ mapitem[count].nameid=p->storage_[i].nameid;
+ mapitem[count].amount = p->storage_[i].amount;
+ mapitem[count].equip = p->storage_[i].equip;
+ mapitem[count].identify = p->storage_[i].identify;
+ mapitem[count].refine = p->storage_[i].refine;
+ mapitem[count].attribute = p->storage_[i].attribute;
+ for(j=0; j<MAX_SLOTS; j++)
+ mapitem[count].card[j] = p->storage_[i].card[j];
+ count++;
+ }
+ }
+
+ memitemdata_to_sql(mapitem, count, account_id,TABLE_STORAGE);
+
+ //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+
+// DB -> storage data conversion
+int storage_fromsql(int account_id, struct storage *p){
+ int i=0,j;
+ char * str_p = tmp_sql;
+
+ memset(p,0,sizeof(struct storage)); //clean up memory
+ p->storage_amount = 0;
+ p->account_id = account_id;
+
+ // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
+ str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
+
+ for (j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p," FROM `%s` WHERE `account_id`='%d' ORDER BY `nameid`", storage_db, account_id);
+
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res)) && i<MAX_STORAGE) { //start to fetch
+ p->storage_[i].id= atoi(sql_row[0]);
+ p->storage_[i].nameid= atoi(sql_row[1]);
+ p->storage_[i].amount= atoi(sql_row[2]);
+ p->storage_[i].equip= atoi(sql_row[3]);
+ p->storage_[i].identify= atoi(sql_row[4]);
+ p->storage_[i].refine= atoi(sql_row[5]);
+ p->storage_[i].attribute= atoi(sql_row[6]);
+ for (j=0; j<MAX_SLOTS; j++)
+ p->storage_[i].card[j]= atoi(sql_row[7+j]);
+ i++;
+ }
+ p->storage_amount = i;
+ mysql_free_result(sql_res);
+ }
+
+ ShowInfo ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
+// Save guild_storage data to sql
+int guild_storage_tosql(int guild_id, struct guild_storage *p){
+ int i,j;
+// int eqcount=1;
+// int noteqcount=1;
+ int count=0;
+ struct itemtmp mapitem[MAX_GUILD_STORAGE];
+ for(i=0;i<MAX_GUILD_STORAGE;i++){
+ if(p->storage_[i].nameid>0){
+ mapitem[count].flag=0;
+ mapitem[count].id = p->storage_[i].id;
+ mapitem[count].nameid=p->storage_[i].nameid;
+ mapitem[count].amount = p->storage_[i].amount;
+ mapitem[count].equip = p->storage_[i].equip;
+ mapitem[count].identify = p->storage_[i].identify;
+ mapitem[count].refine = p->storage_[i].refine;
+ mapitem[count].attribute = p->storage_[i].attribute;
+ for (j=0; j<MAX_SLOTS; j++)
+ mapitem[count].card[j] = p->storage_[i].card[j];
+ count++;
+ }
+ }
+
+ memitemdata_to_sql(mapitem, count, guild_id,TABLE_GUILD_STORAGE);
+
+ ShowInfo ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+// Load guild_storage data to mem
+int guild_storage_fromsql(int guild_id, struct guild_storage *p){
+ int i=0,j;
+ struct guild_storage *gs=guild_storage_pt;
+ char * str_p = tmp_sql;
+ p=gs;
+
+ memset(p,0,sizeof(struct guild_storage)); //clean up memory
+ p->storage_amount = 0;
+ p->guild_id = guild_id;
+
+ // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
+ str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
+
+ for (j=0; j<MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p," FROM `%s` WHERE `guild_id`='%d' ORDER BY `nameid`", guild_storage_db, guild_id);
+
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILD_STORAGE) { //start to fetch
+ p->storage_[i].id= atoi(sql_row[0]);
+ p->storage_[i].nameid= atoi(sql_row[1]);
+ p->storage_[i].amount= atoi(sql_row[2]);
+ p->storage_[i].equip= atoi(sql_row[3]);
+ p->storage_[i].identify= atoi(sql_row[4]);
+ p->storage_[i].refine= atoi(sql_row[5]);
+ p->storage_[i].attribute= atoi(sql_row[6]);
+ for (j=0; j<MAX_SLOTS; j++)
+ p->storage_[i].card[j] = atoi(sql_row[7+j]);
+ i++;
+ }
+ p->storage_amount = i;
+ mysql_free_result(sql_res);
+ }
+ ShowInfo ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
+ return 0;
+}
+
+//---------------------------------------------------------
+// storage data initialize
+int inter_storage_sql_init(void){
+
+ //memory alloc
+ ShowDebug("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
+ storage_pt = (struct storage*)aCalloc(sizeof(struct storage), 1);
+ guild_storage_pt = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
+// memset(storage_pt,0,sizeof(struct storage)); //Calloc sets stuff to 0 already. [Skotlex]
+// memset(guild_storage_pt,0,sizeof(struct guild_storage));
+
+ return 1;
+}
+// storage data finalize
+void inter_storage_sql_final(void)
+{
+ if (storage_pt) aFree(storage_pt);
+ if (guild_storage_pt) aFree(guild_storage_pt);
+ return;
+}
+// q?f[^?
+int inter_storage_delete(int account_id)
+{
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+}
+int inter_guild_storage_delete(int guild_id)
+{
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+}
+
+//---------------------------------------------------------
+// packet from map server
+
+// recive packet about storage data
+int mapif_load_storage(int fd,int account_id){
+ //load from DB
+ WFIFOHEAD(fd, sizeof(struct storage)+8);
+ storage_fromsql(account_id, storage_pt);
+ WFIFOW(fd,0)=0x3810;
+ WFIFOW(fd,2)=sizeof(struct storage)+8;
+ WFIFOL(fd,4)=account_id;
+ memcpy(WFIFOP(fd,8),storage_pt,sizeof(struct storage));
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+// send ack to map server which is "storage data save ok."
+int mapif_save_storage_ack(int fd,int account_id){
+ WFIFOHEAD(fd, 7);
+ WFIFOW(fd,0)=0x3811;
+ WFIFOL(fd,2)=account_id;
+ WFIFOB(fd,6)=0;
+ WFIFOSET(fd,7);
+ return 0;
+}
+
+int mapif_load_guild_storage(int fd,int account_id,int guild_id)
+{
+ int guild_exist=1;
+ WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
+ WFIFOW(fd,0)=0x3818;
+
+#if 0 // innodb guilds should render this check unnecessary [Aru]
+ // Check if guild exists, I may write a function for this later, coz I use it several times.
+ //printf("- Check if guild %d exists\n",g->guild_id);
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ sql_row = mysql_fetch_row(sql_res);
+ guild_exist = atoi (sql_row[0]);
+ //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
+ }
+ mysql_free_result(sql_res) ; //resource free
+#endif
+ if(guild_exist==1) {
+ guild_storage_fromsql(guild_id,guild_storage_pt);
+ WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=guild_id;
+ memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage));
+ }
+ else {
+ WFIFOW(fd,2)=12;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=0;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
+{
+ WFIFOHEAD(fd,11);
+ WFIFOW(fd,0)=0x3819;
+ WFIFOL(fd,2)=account_id;
+ WFIFOL(fd,6)=guild_id;
+ WFIFOB(fd,10)=fail;
+ WFIFOSET(fd,11);
+ return 0;
+}
+
+//---------------------------------------------------------
+// packet from map server
+
+// recive request about storage data
+int mapif_parse_LoadStorage(int fd){
+ RFIFOHEAD(fd);
+ mapif_load_storage(fd,RFIFOL(fd,2));
+ return 0;
+}
+// storage data recive and save
+int mapif_parse_SaveStorage(int fd){
+ int account_id;
+ int len;
+ RFIFOHEAD(fd);
+ account_id=RFIFOL(fd,4);
+ len=RFIFOW(fd,2);
+ if(sizeof(struct storage)!=len-8){
+ ShowError("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
+ }else{
+ memcpy(&storage_pt[0],RFIFOP(fd,8),sizeof(struct storage));
+ storage_tosql(account_id, storage_pt);
+ mapif_save_storage_ack(fd,account_id);
+ }
+ return 0;
+}
+
+int mapif_parse_LoadGuildStorage(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
+ return 0;
+}
+
+int mapif_parse_SaveGuildStorage(int fd)
+{
+ int guild_exist=1;
+ int guild_id;
+ int len;
+ RFIFOHEAD(fd);
+ guild_id=RFIFOL(fd,8);
+ len=RFIFOW(fd,2);
+ if(sizeof(struct guild_storage)!=len-12){
+ ShowError("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
+ }
+ else {
+#if 0 // Again, innodb key checks make the check pointless
+ // Check if guild exists, I may write a function for this later, coz I use it several times.
+ //printf("- Check if guild %d exists\n",g->guild_id);
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ sql_row = mysql_fetch_row(sql_res);
+ guild_exist = atoi (sql_row[0]);
+ //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
+ }
+ mysql_free_result(sql_res) ; //resource free
+#endif
+ if(guild_exist==1) {
+ memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage));
+ guild_storage_tosql(guild_id,guild_storage_pt);
+ mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
+ }
+ else
+ mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
+ }
+ return 0;
+}
+
+
+int inter_storage_parse_frommap(int fd){
+ RFIFOHEAD(fd);
+ switch(RFIFOW(fd,0)){
+ case 0x3010: mapif_parse_LoadStorage(fd); break;
+ case 0x3011: mapif_parse_SaveStorage(fd); break;
+ case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
+ case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h
index c886a45e2..3cba41e64 100644
--- a/src/char_sql/int_storage.h
+++ b/src/char_sql/int_storage.h
@@ -1,17 +1,17 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INT_STORAGE_SQL_H_
-#define _INT_STORAGE_SQL_H_
-
-int inter_storage_sql_init(void);
-void inter_storage_sql_final(void);
-int inter_storage_delete(int account_id);
-int inter_guild_storage_delete(int guild_id);
-
-int inter_storage_parse_frommap(int fd);
-
-//Exported for use in the TXT-SQL converter.
-int storage_tosql(int account_id,struct storage *p);
-int guild_storage_tosql(int guild_id, struct guild_storage *p);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INT_STORAGE_SQL_H_
+#define _INT_STORAGE_SQL_H_
+
+int inter_storage_sql_init(void);
+void inter_storage_sql_final(void);
+int inter_storage_delete(int account_id);
+int inter_guild_storage_delete(int guild_id);
+
+int inter_storage_parse_frommap(int fd);
+
+//Exported for use in the TXT-SQL converter.
+int storage_tosql(int account_id,struct storage *p);
+int guild_storage_tosql(int guild_id, struct guild_storage *p);
+#endif
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c
index 5ce452717..64983cfc6 100644
--- a/src/char_sql/inter.c
+++ b/src/char_sql/inter.c
@@ -1,822 +1,822 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// original code from athena
-// SQL conversion by Jioh L. Jung
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "int_homun.h" //albator
-
-#define WISDATA_TTL (60*1000) // Wisƒf[ƒ^‚̶‘¶ŽžŠÔ(60•b)
-#define WISDELLIST_MAX 256 // Wisƒf[ƒ^휃ŠƒXƒg‚Ì—v‘f”
-
-
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-MYSQL lmysql_handle;
-MYSQL_RES* lsql_res ;
-MYSQL_ROW lsql_row ;
-
-int char_server_port = 3306;
-char char_server_ip[32] = "127.0.0.1";
-char char_server_id[32] = "ragnarok";
-char char_server_pw[32] = "ragnarok";
-char char_server_db[32] = "ragnarok";
-char default_codepage[32] = ""; //Feature by irmin.
-
-int login_server_port = 3306;
-char login_server_ip[32] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-
-#ifndef TXT_SQL_CONVERT
-
-static struct accreg *accreg_pt;
-unsigned int party_share_level = 10;
-char main_chat_nick[16] = "Main";
-
-// sending packet list
-// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
-int inter_send_packet_length[]={
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-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,
- 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// recv. packet list
-int inter_recv_packet_length[]={
- -1,-1, 7,-1, -1,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
- -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
- -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
- 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,14,-1, 6, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3080-0x308f
- -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
-};
-
-struct WisData {
- int id, fd, count,len;
- unsigned long tick;
- unsigned char src[24], dst[24], msg[512];
-};
-static struct dbt * wis_db = NULL;
-static int wis_dellist[WISDELLIST_MAX], wis_delnum;
-
-int inter_sql_test (void);
-
-#endif //TXT_SQL_CONVERT
-//--------------------------------------------------------
-// Save registry to sql
-int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type){
-
- int j;
- char temp_str[64]; //Needs be twice the source to ensure it fits [Skotlex]
- char temp_str2[512];
- if (account_id<=0) return 0;
- reg->account_id=account_id;
- reg->char_id = char_id;
-
- switch (type) {
- case 3: //Char Reg
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
- break;
- case 2: //Account Reg
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id);
- break;
- case 1: //Account2 Reg
- ShowError("inter_accreg_tosql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
- return 0;
- default:
- ShowError("inter_accreg_tosql: Invalid type %d\n", type);
- return 0;
-
- }
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- if (reg->reg_num<=0) return 0;
-
- for(j=0;j<reg->reg_num;j++){
- if(reg->reg[j].str != NULL){
- sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `char_id`, `str`, `value`) VALUES ('%d','%d','%d','%s','%s')",
- reg_db, type, type!=3?reg->account_id:0, type==3?reg->char_id:0,
- jstrescapecpy(temp_str,reg->reg[j].str), jstrescapecpy(temp_str2,reg->reg[j].value));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- return 1;
-}
-#ifndef TXT_SQL_CONVERT
-
-// Load account_reg from sql (type=2)
-int inter_accreg_fromsql(int account_id,int char_id, struct accreg *reg, int type)
-{
- int j=0;
- if (reg==NULL) return 0;
- memset(reg, 0, sizeof(struct accreg));
- reg->account_id=account_id;
- reg->char_id=char_id;
-
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- switch (type) {
- case 3: //char reg
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, reg->char_id);
- break;
- case 2: //account reg
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
- break;
- case 1: //account2 reg
- ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
- return 0;
- }
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
- strcpy(reg->reg[j].str, sql_row[0]);
- strcpy(reg->reg[j].value, sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- reg->reg_num=j;
- return 1;
-}
-
-// Initialize
-int inter_accreg_sql_init(void)
-{
- CREATE(accreg_pt, struct accreg, 1);
- return 0;
-
-}
-#endif //TXT_SQL_CONVERT
-
-/*==========================================
- * read config file
- *------------------------------------------
- */
-static int inter_config_read(const char *cfgName) {
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- ShowError("file not found: %s\n", cfgName);
- return 1;
- }
-
- ShowInfo("reading file %s...\n",cfgName);
-
- while(fgets(line, 1020, fp)){
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- if(strcmpi(w1,"char_server_ip")==0){
- strcpy(char_server_ip, w2);
- ShowStatus ("set char_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_port")==0){
- char_server_port=atoi(w2);
- ShowStatus ("set char_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_id")==0){
- strcpy(char_server_id, w2);
- ShowStatus ("set char_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_pw")==0){
- strcpy(char_server_pw, w2);
- ShowStatus ("set char_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_db")==0){
- strcpy(char_server_db, w2);
- ShowStatus ("set char_server_db : %s\n",w2);
- }
- else if(strcmpi(w1,"default_codepage")==0){
- strcpy(default_codepage, w2);
- ShowStatus ("set default_codepage : %s\n",w2);
- }
- //Logins information to be read from the inter_athena.conf
- //for character deletion (checks email in the loginDB)
- else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- ShowStatus ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- ShowStatus ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- ShowStatus ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- ShowStatus ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- ShowStatus ("set login_server_db : %s\n",w2);
- }
-#ifndef TXT_SQL_CONVERT
- else if(strcmpi(w1,"party_share_level")==0){
- party_share_level=(unsigned int)atof(w2);
- }
- else if(strcmpi(w1,"log_inter")==0){
- log_inter = atoi(w2);
- }
- else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
- strcpy(main_chat_nick, w2); //
- }
-#endif //TXT_SQL_CONVERT
- else if(strcmpi(w1,"import")==0){
- inter_config_read(w2);
- }
- }
- fclose(fp);
-
- ShowInfo ("done reading %s.\n", cfgName);
-
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-
-// Save interlog into sql
-int inter_log(char *fmt,...)
-{
- char str[255];
- char temp_str[510]; //Needs be twice as long as str[] //Skotlex
- va_list ap;
- va_start(ap,fmt);
-
- vsprintf(str,fmt,ap);
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- va_end(ap);
- return 0;
-}
-
-/*======================================================
- * Does a mysql_ping to all connection handles. [Skotlex]
- *------------------------------------------------------
- */
-int inter_sql_ping(int tid, unsigned int tick, int id, int data)
-{
- ShowInfo("Pinging SQL server to keep connection alive...\n");
- mysql_ping(&mysql_handle);
- if(char_gm_read)
- mysql_ping(&lmysql_handle);
- return 0;
-}
-#endif //TXT_SQL_CONVERT
-
-// initialize
-int inter_init_sql(const char *file)
-{
- //int i;
-
- ShowInfo ("interserver initialize...\n");
- inter_config_read(file);
-
- //DB connection initialized
- mysql_init(&mysql_handle);
- ShowInfo("Connect Character DB server.... (Character Server)\n");
- if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw,
- char_server_db ,char_server_port, (char *)NULL, 0)) {
- //pointer check
- ShowFatalError("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
-#ifndef TXT_SQL_CONVERT
- else if (inter_sql_test()) {
- ShowStatus("Connect Success! (Character Server)\n");
- }
-
- if(char_gm_read) {
- mysql_init(&lmysql_handle);
- ShowInfo("Connect Character DB server.... (login server)\n");
- if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db ,login_server_port, (char *)NULL, 0)) {
- //pointer check
- ShowFatalError("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }else {
- ShowStatus ("Connect Success! (Login Server)\n");
- }
- }
-#endif //TXT_SQL_CONVERT
- if(strlen(default_codepage) > 0 ) {
- sprintf( tmp_sql, "SET NAMES %s", default_codepage );
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-#ifndef TXT_SQL_CONVERT
- if(char_gm_read)
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-#endif //TXT_SQL_CONVERT
- }
-
-#ifndef TXT_SQL_CONVERT
- wis_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- inter_guild_sql_init();
- inter_storage_sql_init();
- inter_party_sql_init();
- inter_pet_sql_init();
- inter_homunculus_sql_init(); // albator
- inter_accreg_sql_init();
-
- if (connection_ping_interval) {
- add_timer_func_list(inter_sql_ping, "inter_sql_ping");
- add_timer_interval(gettick()+connection_ping_interval*60*60*1000,
- inter_sql_ping, 0, 0, connection_ping_interval*60*60*1000);
- }
-#endif //TXT_SQL_CONVERT
- return 0;
-}
-#ifndef TXT_SQL_CONVERT
-
-int inter_sql_test (void)
-{
- const char fields[][24] = {
- "father", // version 1363
- "fame", // version 1491
- };
- char buf[1024] = "";
- int i;
-
- sprintf(tmp_sql, "EXPLAIN `%s`",char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- // store DB fields
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) {
- strcat (buf, sql_row[0]);
- strcat (buf, " ");
- }
- }
-
- // check DB strings
- for (i = 0; i < (int)(sizeof(fields) / sizeof(fields[0])); i++) {
- if(!strstr(buf, fields[i])) {
- ShowSQL ("Field `%s` not be found in `%s`. Consider updating your database!\n", fields[i], char_db);
- exit(1);
- }
- }
-
- mysql_free_result(sql_res);
-
- return 1;
-}
-
-// finalize
-void inter_final(void) {
- wis_db->destroy(wis_db, NULL);
-
- inter_guild_sql_final();
- inter_storage_sql_final();
- inter_party_sql_final();
- inter_pet_sql_final();
- inter_homunculus_sql_final(); //[orn]
-
- if (accreg_pt) aFree(accreg_pt);
- return;
-}
-
-int inter_mapif_init(int fd) {
- inter_guild_mapif_init(fd);
-
- return 0;
-}
-
-
-//--------------------------------------------------------
-
-// GM message sending
-int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
- unsigned char buf[2048];
-
- if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
- WBUFW(buf, 0) = 0x3800;
- WBUFW(buf, 2) = len;
- WBUFL(buf, 4) = color;
- memcpy(WBUFP(buf, 8), mes, len-8);
- mapif_sendallwos(sfd, buf, len);
- return 0;
-}
-
-// Wis sending
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[2048];
- if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 +wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, NAME_LENGTH);
- memcpy(WBUFP(buf,32), wd->dst, NAME_LENGTH);
- memcpy(WBUFP(buf,56), wd->msg, wd->len);
- wd->count = mapif_sendall(buf,WBUFW(buf,2));
-
- return 0;
-}
-// Wis sending result
-int mapif_wis_end(struct WisData *wd,int flag)
-{
- unsigned char buf[27];
-
- WBUFW(buf, 0)=0x3802;
- memcpy(WBUFP(buf, 2),wd->src,24);
- WBUFB(buf,26)=flag;
- mapif_send(wd->fd,buf,27);
-// printf("inter server wis_end %d\n",flag);
- return 0;
-}
-
-int mapif_account_reg(int fd,unsigned char *src)
-{
-// unsigned char buf[WBUFW(src,2)]; <- Hey, can this really be done? [Skotlex]
- unsigned char *buf = aCalloc(1,WBUFW(src,2)); // [Lance] - Skot... Dynamic allocation is better :D
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0)=0x3804;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- aFree(buf);
- return 0;
-}
-
-// Send the requested account_reg
-int mapif_account_reg_reply(int fd,int account_id,int char_id, int type)
-{
- struct accreg *reg=accreg_pt;
- WFIFOHEAD(fd, 13 + 5000);
- inter_accreg_fromsql(account_id,char_id,reg,type);
-
- WFIFOW(fd,0)=0x3804;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=char_id;
- WFIFOB(fd,12)=type;
- if(reg->reg_num==0){
- WFIFOW(fd,2)=13;
- }else{
- int i,p;
- for (p=13,i = 0; i < reg->reg_num && p < 5000; i++) {
- p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].value)+1;
- }
- WFIFOW(fd,2)=p;
- if (p>= 5000)
- ShowWarning("Too many acc regs for %d:%d, not all values were loaded.\n", account_id, char_id);
- }
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-int mapif_send_gmaccounts()
-{
- int i, len = 4;
- unsigned char buf[32000];
-
- // forward the gm accounts to the map server
- len = 4;
- WBUFW(buf,0) = 0x2b15;
-
- for(i = 0; i < GM_num; i++) {
- WBUFL(buf, len) = gm_account[i].account_id;
- WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WBUFW(buf, 2) = len;
- mapif_sendall(buf, len);
-
- return 0;
-}
-
-//Sends to map server the current max Account/Char id [Skotlex]
-void mapif_send_maxid(int account_id, int char_id)
-{
- unsigned char buf[12];
-
- WBUFW(buf,0) = 0x2b07;
- WBUFL(buf,2) = account_id;
- WBUFL(buf,6) = char_id;
- mapif_sendall(buf, 10);
-}
-
-//Request to kick char from a certain map server. [Skotlex]
-int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
-{
- if (fd >= 0)
- {
- WFIFOHEAD(fd,7);
- WFIFOW(fd,0) = 0x2b1f;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = reason;
- WFIFOSET(fd,7);
- return 0;
- }
- return -1;
-}
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
- unsigned long tick;
- struct WisData *wd = (struct WisData *)data;
- tick = va_arg(ap, unsigned long);
-
- if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
- wis_dellist[wis_delnum++] = wd->id;
-
- return 0;
-}
-
-int check_ttl_wisdata(void) {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- wis_db->foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = idb_get(wis_db, wis_dellist[i]);
- ShowWarning("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
- // removed. not send information after a timeout. Just no answer for the player
- //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- idb_remove(wis_db, wd->id);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// GM message sending
-int mapif_parse_GMmessage(int fd)
-{
- RFIFOHEAD(fd);
- mapif_GMmessage(RFIFOP(fd, 8), RFIFOW(fd, 2), RFIFOL(fd, 4), fd);
- return 0;
-}
-
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct WisData* wd;
- static int wisid = 0;
- char name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Needs space to allocate names with escaped chars [Skotlex]
- RFIFOHEAD(fd);
- if ( fd <= 0 ) {return 0;} // check if we have a valid fd
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- ShowWarning("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- ShowError("inter: Wis message doesn't exist.\n");
- return 0;
- }
- memcpy(name, RFIFOP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex]
- name[NAME_LENGTH-1]= '\0';
-
- sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `name`='%s'",
- char_db, jstrescapecpy(t_name, name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- // search if character exists before to ask all map-servers
- if (!(sql_row = mysql_fetch_row(sql_res))) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- // Character exists. So, ask all map-servers
- } else {
- // to be sure of the correct name, rewrite it
- memset(name, 0, NAME_LENGTH);
- strncpy(name, sql_row[0], NAME_LENGTH);
- // if source is destination, don't ask other servers.
- if (strcmp((char*)RFIFOP(fd,4),name) == 0) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- } else {
-
- CREATE(wd, struct WisData, 1);
-
- // Whether the failure of previous wisp/page transmission (timeout)
- check_ttl_wisdata();
-
- wd->id = ++wisid;
- wd->fd = fd;
- wd->len= RFIFOW(fd,2)-52;
- memcpy(wd->src, RFIFOP(fd, 4), NAME_LENGTH);
- memcpy(wd->dst, RFIFOP(fd,28), NAME_LENGTH);
- memcpy(wd->msg, RFIFOP(fd,52), wd->len);
- wd->tick = gettick();
- idb_put(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- }
- }
-
- //Freeing ... O.o
- if(sql_res){
- mysql_free_result(sql_res);
- }
-
- return 0;
-}
-
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id, flag;
- struct WisData *wd;
- RFIFOHEAD(fd);
- id = RFIFOL(fd,2);
- flag = RFIFOB(fd,6);
- wd = idb_get(wis_db, id);
- if (wd == NULL)
- return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server
-
- if ((--wd->count) <= 0 || flag != 1) {
- mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- idb_remove(wis_db, id);
- }
-
- return 0;
-}
-
-// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
-int mapif_parse_WisToGM(int fd) {
- unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- RFIFOHEAD(fd);
- ShowDebug("Sent packet back!\n");
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf, 0) = 0x3803;
- mapif_sendall(buf, RFIFOW(fd,2));
-
- return 0;
-}
-
-// Save account_reg into sql (type=2)
-int mapif_parse_Registry(int fd)
-{
- int j,p,len, max;
- struct accreg *reg=accreg_pt;
- RFIFOHEAD(fd);
- memset(accreg_pt,0,sizeof(struct accreg));
- switch (RFIFOB(fd, 12)) {
- case 3: //Character registry
- max = GLOBAL_REG_NUM;
- break;
- case 2: //Account Registry
- max = ACCOUNT_REG_NUM;
- break;
- case 1: //Account2 registry, must be sent over to login server.
- return save_accreg2(RFIFOP(fd,4), RFIFOW(fd,2)-4);
- default:
- return 1;
- }
- for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
- sscanf(RFIFOP(fd,p), "%31c%n",reg->reg[j].str,&len);
- reg->reg[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf(RFIFOP(fd,p), "%255c%n",reg->reg[j].value,&len);
- reg->reg[j].value[len]='\0';
- p +=len+1;
- }
- reg->reg_num=j;
-
- inter_accreg_tosql(RFIFOL(fd,4),RFIFOL(fd,8),reg, RFIFOB(fd,12));
- mapif_account_reg(fd,RFIFOP(fd,0)); // Send updated accounts to other map servers.
- return 0;
-}
-
-// Request the value of all registries.
-int mapif_parse_RegistryRequest(int fd)
-{
- RFIFOHEAD(fd);
- //Load Char Registry
- if (RFIFOB(fd,12))
- mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
- //Load Account Registry
- if (RFIFOB(fd,11))
- mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
- //Ask Login Server for Account2 values.
- if (RFIFOB(fd,10))
- request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
- return 1;
-}
-
-//--------------------------------------------------------
-int inter_parse_frommap(int fd)
-{
- int cmd;
- int len=0;
- RFIFOHEAD(fd);
- cmd=RFIFOW(fd,0);
- // interŽIŠÇŠ‚©‚𒲂ׂ
- if(cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length)/
- sizeof(inter_recv_packet_length[0]) ) )
- return 0;
-
- if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
- return 0;
-
- // ƒpƒPƒbƒg’·‚𒲂ׂé
- if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
- return 2;
-
- switch(cmd){
- case 0x3000: mapif_parse_GMmessage(fd); break;
- case 0x3001: mapif_parse_WisRequest(fd); break;
- case 0x3002: mapif_parse_WisReply(fd); break;
- case 0x3003: mapif_parse_WisToGM(fd); break;
- case 0x3004: mapif_parse_Registry(fd); break;
- case 0x3005: mapif_parse_RegistryRequest(fd); break;
- default:
- if(inter_party_parse_frommap(fd))
- break;
- if(inter_guild_parse_frommap(fd))
- break;
- if(inter_storage_parse_frommap(fd))
- break;
- if(inter_pet_parse_frommap(fd))
- break;
- if(inter_homunculus_parse_frommap(fd)) //albator
- break;
- return 0;
- }
-
- RFIFOSKIP(fd, len);
- return 1;
-}
-
-// RFIFO check
-int inter_check_length(int fd, int length)
-{
- RFIFOHEAD(fd);
- if(length==-1){ // v-len packet
- if(RFIFOREST(fd)<4) // packet not yet
- return 0;
- length = RFIFOW(fd, 2);
- }
-
- if((int)RFIFOREST(fd) < length) // packet not yet
- return 0;
-
- return length;
-}
-#endif //TXT_SQL_CONVERT
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// original code from athena
+// SQL conversion by Jioh L. Jung
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "char.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+#include "inter.h"
+#include "int_party.h"
+#include "int_guild.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "int_homun.h" //albator
+
+#define WISDATA_TTL (60*1000) // Wisƒf[ƒ^‚̶‘¶ŽžŠÔ(60•b)
+#define WISDELLIST_MAX 256 // Wisƒf[ƒ^휃ŠƒXƒg‚Ì—v‘f”
+
+
+MYSQL mysql_handle;
+MYSQL_RES* sql_res ;
+MYSQL_ROW sql_row ;
+int sql_fields, sql_cnt;
+char tmp_sql[65535];
+
+MYSQL lmysql_handle;
+MYSQL_RES* lsql_res ;
+MYSQL_ROW lsql_row ;
+
+int char_server_port = 3306;
+char char_server_ip[32] = "127.0.0.1";
+char char_server_id[32] = "ragnarok";
+char char_server_pw[32] = "ragnarok";
+char char_server_db[32] = "ragnarok";
+char default_codepage[32] = ""; //Feature by irmin.
+
+int login_server_port = 3306;
+char login_server_ip[32] = "127.0.0.1";
+char login_server_id[32] = "ragnarok";
+char login_server_pw[32] = "ragnarok";
+char login_server_db[32] = "ragnarok";
+
+#ifndef TXT_SQL_CONVERT
+
+static struct accreg *accreg_pt;
+unsigned int party_share_level = 10;
+char main_chat_nick[16] = "Main";
+
+// sending packet list
+// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
+int inter_send_packet_length[]={
+ -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
+ 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
+ 9, 9,-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,
+ 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+// recv. packet list
+int inter_recv_packet_length[]={
+ -1,-1, 7,-1, -1,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
+ 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
+ -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
+ -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
+ 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48,14,-1, 6, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3080-0x308f
+ -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
+};
+
+struct WisData {
+ int id, fd, count,len;
+ unsigned long tick;
+ unsigned char src[24], dst[24], msg[512];
+};
+static struct dbt * wis_db = NULL;
+static int wis_dellist[WISDELLIST_MAX], wis_delnum;
+
+int inter_sql_test (void);
+
+#endif //TXT_SQL_CONVERT
+//--------------------------------------------------------
+// Save registry to sql
+int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type){
+
+ int j;
+ char temp_str[64]; //Needs be twice the source to ensure it fits [Skotlex]
+ char temp_str2[512];
+ if (account_id<=0) return 0;
+ reg->account_id=account_id;
+ reg->char_id = char_id;
+
+ switch (type) {
+ case 3: //Char Reg
+ //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
+ break;
+ case 2: //Account Reg
+ //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id);
+ break;
+ case 1: //Account2 Reg
+ ShowError("inter_accreg_tosql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
+ return 0;
+ default:
+ ShowError("inter_accreg_tosql: Invalid type %d\n", type);
+ return 0;
+
+ }
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ if (reg->reg_num<=0) return 0;
+
+ for(j=0;j<reg->reg_num;j++){
+ if(reg->reg[j].str != NULL){
+ sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `char_id`, `str`, `value`) VALUES ('%d','%d','%d','%s','%s')",
+ reg_db, type, type!=3?reg->account_id:0, type==3?reg->char_id:0,
+ jstrescapecpy(temp_str,reg->reg[j].str), jstrescapecpy(temp_str2,reg->reg[j].value));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ return 1;
+}
+#ifndef TXT_SQL_CONVERT
+
+// Load account_reg from sql (type=2)
+int inter_accreg_fromsql(int account_id,int char_id, struct accreg *reg, int type)
+{
+ int j=0;
+ if (reg==NULL) return 0;
+ memset(reg, 0, sizeof(struct accreg));
+ reg->account_id=account_id;
+ reg->char_id=char_id;
+
+ //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
+ switch (type) {
+ case 3: //char reg
+ sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, reg->char_id);
+ break;
+ case 2: //account reg
+ sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
+ break;
+ case 1: //account2 reg
+ ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
+ return 0;
+ }
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
+ strcpy(reg->reg[j].str, sql_row[0]);
+ strcpy(reg->reg[j].value, sql_row[1]);
+ }
+ mysql_free_result(sql_res);
+ }
+ reg->reg_num=j;
+ return 1;
+}
+
+// Initialize
+int inter_accreg_sql_init(void)
+{
+ CREATE(accreg_pt, struct accreg, 1);
+ return 0;
+
+}
+#endif //TXT_SQL_CONVERT
+
+/*==========================================
+ * read config file
+ *------------------------------------------
+ */
+static int inter_config_read(const char *cfgName) {
+ int i;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp=fopen(cfgName,"r");
+ if(fp==NULL){
+ ShowError("file not found: %s\n", cfgName);
+ return 1;
+ }
+
+ ShowInfo("reading file %s...\n",cfgName);
+
+ while(fgets(line, 1020, fp)){
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+
+ if(strcmpi(w1,"char_server_ip")==0){
+ strcpy(char_server_ip, w2);
+ ShowStatus ("set char_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_port")==0){
+ char_server_port=atoi(w2);
+ ShowStatus ("set char_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_id")==0){
+ strcpy(char_server_id, w2);
+ ShowStatus ("set char_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_pw")==0){
+ strcpy(char_server_pw, w2);
+ ShowStatus ("set char_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_db")==0){
+ strcpy(char_server_db, w2);
+ ShowStatus ("set char_server_db : %s\n",w2);
+ }
+ else if(strcmpi(w1,"default_codepage")==0){
+ strcpy(default_codepage, w2);
+ ShowStatus ("set default_codepage : %s\n",w2);
+ }
+ //Logins information to be read from the inter_athena.conf
+ //for character deletion (checks email in the loginDB)
+ else if(strcmpi(w1,"login_server_ip")==0){
+ strcpy(login_server_ip, w2);
+ ShowStatus ("set login_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_port")==0){
+ login_server_port=atoi(w2);
+ ShowStatus ("set login_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_id")==0){
+ strcpy(login_server_id, w2);
+ ShowStatus ("set login_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_pw")==0){
+ strcpy(login_server_pw, w2);
+ ShowStatus ("set login_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ ShowStatus ("set login_server_db : %s\n",w2);
+ }
+#ifndef TXT_SQL_CONVERT
+ else if(strcmpi(w1,"party_share_level")==0){
+ party_share_level=(unsigned int)atof(w2);
+ }
+ else if(strcmpi(w1,"log_inter")==0){
+ log_inter = atoi(w2);
+ }
+ else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
+ strcpy(main_chat_nick, w2); //
+ }
+#endif //TXT_SQL_CONVERT
+ else if(strcmpi(w1,"import")==0){
+ inter_config_read(w2);
+ }
+ }
+ fclose(fp);
+
+ ShowInfo ("done reading %s.\n", cfgName);
+
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+
+// Save interlog into sql
+int inter_log(char *fmt,...)
+{
+ char str[255];
+ char temp_str[510]; //Needs be twice as long as str[] //Skotlex
+ va_list ap;
+ va_start(ap,fmt);
+
+ vsprintf(str,fmt,ap);
+ sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ va_end(ap);
+ return 0;
+}
+
+/*======================================================
+ * Does a mysql_ping to all connection handles. [Skotlex]
+ *------------------------------------------------------
+ */
+int inter_sql_ping(int tid, unsigned int tick, int id, int data)
+{
+ ShowInfo("Pinging SQL server to keep connection alive...\n");
+ mysql_ping(&mysql_handle);
+ if(char_gm_read)
+ mysql_ping(&lmysql_handle);
+ return 0;
+}
+#endif //TXT_SQL_CONVERT
+
+// initialize
+int inter_init_sql(const char *file)
+{
+ //int i;
+
+ ShowInfo ("interserver initialize...\n");
+ inter_config_read(file);
+
+ //DB connection initialized
+ mysql_init(&mysql_handle);
+ ShowInfo("Connect Character DB server.... (Character Server)\n");
+ if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw,
+ char_server_db ,char_server_port, (char *)NULL, 0)) {
+ //pointer check
+ ShowFatalError("%s\n",mysql_error(&mysql_handle));
+ exit(1);
+ }
+#ifndef TXT_SQL_CONVERT
+ else if (inter_sql_test()) {
+ ShowStatus("Connect Success! (Character Server)\n");
+ }
+
+ if(char_gm_read) {
+ mysql_init(&lmysql_handle);
+ ShowInfo("Connect Character DB server.... (login server)\n");
+ if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
+ login_server_db ,login_server_port, (char *)NULL, 0)) {
+ //pointer check
+ ShowFatalError("%s\n",mysql_error(&lmysql_handle));
+ exit(1);
+ }else {
+ ShowStatus ("Connect Success! (Login Server)\n");
+ }
+ }
+#endif //TXT_SQL_CONVERT
+ if(strlen(default_codepage) > 0 ) {
+ sprintf( tmp_sql, "SET NAMES %s", default_codepage );
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+#ifndef TXT_SQL_CONVERT
+ if(char_gm_read)
+ if (mysql_query(&lmysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+#endif //TXT_SQL_CONVERT
+ }
+
+#ifndef TXT_SQL_CONVERT
+ wis_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ inter_guild_sql_init();
+ inter_storage_sql_init();
+ inter_party_sql_init();
+ inter_pet_sql_init();
+ inter_homunculus_sql_init(); // albator
+ inter_accreg_sql_init();
+
+ if (connection_ping_interval) {
+ add_timer_func_list(inter_sql_ping, "inter_sql_ping");
+ add_timer_interval(gettick()+connection_ping_interval*60*60*1000,
+ inter_sql_ping, 0, 0, connection_ping_interval*60*60*1000);
+ }
+#endif //TXT_SQL_CONVERT
+ return 0;
+}
+#ifndef TXT_SQL_CONVERT
+
+int inter_sql_test (void)
+{
+ const char fields[][24] = {
+ "father", // version 1363
+ "fame", // version 1491
+ };
+ char buf[1024] = "";
+ int i;
+
+ sprintf(tmp_sql, "EXPLAIN `%s`",char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ // store DB fields
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res))) {
+ strcat (buf, sql_row[0]);
+ strcat (buf, " ");
+ }
+ }
+
+ // check DB strings
+ for (i = 0; i < (int)(sizeof(fields) / sizeof(fields[0])); i++) {
+ if(!strstr(buf, fields[i])) {
+ ShowSQL ("Field `%s` not be found in `%s`. Consider updating your database!\n", fields[i], char_db);
+ exit(1);
+ }
+ }
+
+ mysql_free_result(sql_res);
+
+ return 1;
+}
+
+// finalize
+void inter_final(void) {
+ wis_db->destroy(wis_db, NULL);
+
+ inter_guild_sql_final();
+ inter_storage_sql_final();
+ inter_party_sql_final();
+ inter_pet_sql_final();
+ inter_homunculus_sql_final(); //[orn]
+
+ if (accreg_pt) aFree(accreg_pt);
+ return;
+}
+
+int inter_mapif_init(int fd) {
+ inter_guild_mapif_init(fd);
+
+ return 0;
+}
+
+
+//--------------------------------------------------------
+
+// GM message sending
+int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
+ unsigned char buf[2048];
+
+ if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
+ WBUFW(buf, 0) = 0x3800;
+ WBUFW(buf, 2) = len;
+ WBUFL(buf, 4) = color;
+ memcpy(WBUFP(buf, 8), mes, len-8);
+ mapif_sendallwos(sfd, buf, len);
+ return 0;
+}
+
+// Wis sending
+int mapif_wis_message(struct WisData *wd) {
+ unsigned char buf[2048];
+ if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
+
+ WBUFW(buf, 0) = 0x3801;
+ WBUFW(buf, 2) = 56 +wd->len;
+ WBUFL(buf, 4) = wd->id;
+ memcpy(WBUFP(buf, 8), wd->src, NAME_LENGTH);
+ memcpy(WBUFP(buf,32), wd->dst, NAME_LENGTH);
+ memcpy(WBUFP(buf,56), wd->msg, wd->len);
+ wd->count = mapif_sendall(buf,WBUFW(buf,2));
+
+ return 0;
+}
+// Wis sending result
+int mapif_wis_end(struct WisData *wd,int flag)
+{
+ unsigned char buf[27];
+
+ WBUFW(buf, 0)=0x3802;
+ memcpy(WBUFP(buf, 2),wd->src,24);
+ WBUFB(buf,26)=flag;
+ mapif_send(wd->fd,buf,27);
+// printf("inter server wis_end %d\n",flag);
+ return 0;
+}
+
+int mapif_account_reg(int fd,unsigned char *src)
+{
+// unsigned char buf[WBUFW(src,2)]; <- Hey, can this really be done? [Skotlex]
+ unsigned char *buf = aCalloc(1,WBUFW(src,2)); // [Lance] - Skot... Dynamic allocation is better :D
+ memcpy(WBUFP(buf,0),src,WBUFW(src,2));
+ WBUFW(buf, 0)=0x3804;
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+ aFree(buf);
+ return 0;
+}
+
+// Send the requested account_reg
+int mapif_account_reg_reply(int fd,int account_id,int char_id, int type)
+{
+ struct accreg *reg=accreg_pt;
+ WFIFOHEAD(fd, 13 + 5000);
+ inter_accreg_fromsql(account_id,char_id,reg,type);
+
+ WFIFOW(fd,0)=0x3804;
+ WFIFOL(fd,4)=account_id;
+ WFIFOL(fd,8)=char_id;
+ WFIFOB(fd,12)=type;
+ if(reg->reg_num==0){
+ WFIFOW(fd,2)=13;
+ }else{
+ int i,p;
+ for (p=13,i = 0; i < reg->reg_num && p < 5000; i++) {
+ p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].str)+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(fd,p), "%s", reg->reg[i].value)+1;
+ }
+ WFIFOW(fd,2)=p;
+ if (p>= 5000)
+ ShowWarning("Too many acc regs for %d:%d, not all values were loaded.\n", account_id, char_id);
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+int mapif_send_gmaccounts()
+{
+ int i, len = 4;
+ unsigned char buf[32000];
+
+ // forward the gm accounts to the map server
+ len = 4;
+ WBUFW(buf,0) = 0x2b15;
+
+ for(i = 0; i < GM_num; i++) {
+ WBUFL(buf, len) = gm_account[i].account_id;
+ WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WBUFW(buf, 2) = len;
+ mapif_sendall(buf, len);
+
+ return 0;
+}
+
+//Sends to map server the current max Account/Char id [Skotlex]
+void mapif_send_maxid(int account_id, int char_id)
+{
+ unsigned char buf[12];
+
+ WBUFW(buf,0) = 0x2b07;
+ WBUFL(buf,2) = account_id;
+ WBUFL(buf,6) = char_id;
+ mapif_sendall(buf, 10);
+}
+
+//Request to kick char from a certain map server. [Skotlex]
+int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
+{
+ if (fd >= 0)
+ {
+ WFIFOHEAD(fd,7);
+ WFIFOW(fd,0) = 0x2b1f;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = reason;
+ WFIFOSET(fd,7);
+ return 0;
+ }
+ return -1;
+}
+
+//--------------------------------------------------------
+
+// Existence check of WISP data
+int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
+ unsigned long tick;
+ struct WisData *wd = (struct WisData *)data;
+ tick = va_arg(ap, unsigned long);
+
+ if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
+ wis_dellist[wis_delnum++] = wd->id;
+
+ return 0;
+}
+
+int check_ttl_wisdata(void) {
+ unsigned long tick = gettick();
+ int i;
+
+ do {
+ wis_delnum = 0;
+ wis_db->foreach(wis_db, check_ttl_wisdata_sub, tick);
+ for(i = 0; i < wis_delnum; i++) {
+ struct WisData *wd = idb_get(wis_db, wis_dellist[i]);
+ ShowWarning("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
+ // removed. not send information after a timeout. Just no answer for the player
+ //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ idb_remove(wis_db, wd->id);
+ }
+ } while(wis_delnum >= WISDELLIST_MAX);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+
+// GM message sending
+int mapif_parse_GMmessage(int fd)
+{
+ RFIFOHEAD(fd);
+ mapif_GMmessage(RFIFOP(fd, 8), RFIFOW(fd, 2), RFIFOL(fd, 4), fd);
+ return 0;
+}
+
+
+// Wisp/page request to send
+int mapif_parse_WisRequest(int fd) {
+ struct WisData* wd;
+ static int wisid = 0;
+ char name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Needs space to allocate names with escaped chars [Skotlex]
+ RFIFOHEAD(fd);
+ if ( fd <= 0 ) {return 0;} // check if we have a valid fd
+
+ if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
+ ShowWarning("inter: Wis message size too long.\n");
+ return 0;
+ } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
+ ShowError("inter: Wis message doesn't exist.\n");
+ return 0;
+ }
+ memcpy(name, RFIFOP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex]
+ name[NAME_LENGTH-1]= '\0';
+
+ sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `name`='%s'",
+ char_db, jstrescapecpy(t_name, name));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ // search if character exists before to ask all map-servers
+ if (!(sql_row = mysql_fetch_row(sql_res))) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
+ WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(fd, buf, 27);
+ // Character exists. So, ask all map-servers
+ } else {
+ // to be sure of the correct name, rewrite it
+ memset(name, 0, NAME_LENGTH);
+ strncpy(name, sql_row[0], NAME_LENGTH);
+ // if source is destination, don't ask other servers.
+ if (strcmp((char*)RFIFOP(fd,4),name) == 0) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
+ WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(fd, buf, 27);
+ } else {
+
+ CREATE(wd, struct WisData, 1);
+
+ // Whether the failure of previous wisp/page transmission (timeout)
+ check_ttl_wisdata();
+
+ wd->id = ++wisid;
+ wd->fd = fd;
+ wd->len= RFIFOW(fd,2)-52;
+ memcpy(wd->src, RFIFOP(fd, 4), NAME_LENGTH);
+ memcpy(wd->dst, RFIFOP(fd,28), NAME_LENGTH);
+ memcpy(wd->msg, RFIFOP(fd,52), wd->len);
+ wd->tick = gettick();
+ idb_put(wis_db, wd->id, wd);
+ mapif_wis_message(wd);
+ }
+ }
+
+ //Freeing ... O.o
+ if(sql_res){
+ mysql_free_result(sql_res);
+ }
+
+ return 0;
+}
+
+
+// Wisp/page transmission result
+int mapif_parse_WisReply(int fd) {
+ int id, flag;
+ struct WisData *wd;
+ RFIFOHEAD(fd);
+ id = RFIFOL(fd,2);
+ flag = RFIFOB(fd,6);
+ wd = idb_get(wis_db, id);
+ if (wd == NULL)
+ return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server
+
+ if ((--wd->count) <= 0 || flag != 1) {
+ mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ idb_remove(wis_db, id);
+ }
+
+ return 0;
+}
+
+// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
+int mapif_parse_WisToGM(int fd) {
+ unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+ RFIFOHEAD(fd);
+ ShowDebug("Sent packet back!\n");
+ memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf, 0) = 0x3803;
+ mapif_sendall(buf, RFIFOW(fd,2));
+
+ return 0;
+}
+
+// Save account_reg into sql (type=2)
+int mapif_parse_Registry(int fd)
+{
+ int j,p,len, max;
+ struct accreg *reg=accreg_pt;
+ RFIFOHEAD(fd);
+ memset(accreg_pt,0,sizeof(struct accreg));
+ switch (RFIFOB(fd, 12)) {
+ case 3: //Character registry
+ max = GLOBAL_REG_NUM;
+ break;
+ case 2: //Account Registry
+ max = ACCOUNT_REG_NUM;
+ break;
+ case 1: //Account2 registry, must be sent over to login server.
+ return save_accreg2(RFIFOP(fd,4), RFIFOW(fd,2)-4);
+ default:
+ return 1;
+ }
+ for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
+ sscanf(RFIFOP(fd,p), "%31c%n",reg->reg[j].str,&len);
+ reg->reg[j].str[len]='\0';
+ p +=len+1; //+1 to skip the '\0' between strings.
+ sscanf(RFIFOP(fd,p), "%255c%n",reg->reg[j].value,&len);
+ reg->reg[j].value[len]='\0';
+ p +=len+1;
+ }
+ reg->reg_num=j;
+
+ inter_accreg_tosql(RFIFOL(fd,4),RFIFOL(fd,8),reg, RFIFOB(fd,12));
+ mapif_account_reg(fd,RFIFOP(fd,0)); // Send updated accounts to other map servers.
+ return 0;
+}
+
+// Request the value of all registries.
+int mapif_parse_RegistryRequest(int fd)
+{
+ RFIFOHEAD(fd);
+ //Load Char Registry
+ if (RFIFOB(fd,12))
+ mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
+ //Load Account Registry
+ if (RFIFOB(fd,11))
+ mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
+ //Ask Login Server for Account2 values.
+ if (RFIFOB(fd,10))
+ request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
+ return 1;
+}
+
+//--------------------------------------------------------
+int inter_parse_frommap(int fd)
+{
+ int cmd;
+ int len=0;
+ RFIFOHEAD(fd);
+ cmd=RFIFOW(fd,0);
+ // interŽIŠÇŠ‚©‚𒲂ׂ
+ if(cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length)/
+ sizeof(inter_recv_packet_length[0]) ) )
+ return 0;
+
+ if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
+ return 0;
+
+ // ƒpƒPƒbƒg’·‚𒲂ׂé
+ if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
+ return 2;
+
+ switch(cmd){
+ case 0x3000: mapif_parse_GMmessage(fd); break;
+ case 0x3001: mapif_parse_WisRequest(fd); break;
+ case 0x3002: mapif_parse_WisReply(fd); break;
+ case 0x3003: mapif_parse_WisToGM(fd); break;
+ case 0x3004: mapif_parse_Registry(fd); break;
+ case 0x3005: mapif_parse_RegistryRequest(fd); break;
+ default:
+ if(inter_party_parse_frommap(fd))
+ break;
+ if(inter_guild_parse_frommap(fd))
+ break;
+ if(inter_storage_parse_frommap(fd))
+ break;
+ if(inter_pet_parse_frommap(fd))
+ break;
+ if(inter_homunculus_parse_frommap(fd)) //albator
+ break;
+ return 0;
+ }
+
+ RFIFOSKIP(fd, len);
+ return 1;
+}
+
+// RFIFO check
+int inter_check_length(int fd, int length)
+{
+ RFIFOHEAD(fd);
+ if(length==-1){ // v-len packet
+ if(RFIFOREST(fd)<4) // packet not yet
+ return 0;
+ length = RFIFOW(fd, 2);
+ }
+
+ if((int)RFIFOREST(fd) < length) // packet not yet
+ return 0;
+
+ return length;
+}
+#endif //TXT_SQL_CONVERT
diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h
index 8dc6f3668..ecfde71c0 100644
--- a/src/char_sql/inter.h
+++ b/src/char_sql/inter.h
@@ -1,56 +1,56 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INTER_SQL_H_
-#define _INTER_SQL_H_
-
-int inter_init_sql(const char *file);
-void inter_final(void);
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-int mapif_send_gmaccounts(void);
-void mapif_send_maxid(int, int);
-int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason);
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern unsigned int party_share_level;
-extern char inter_log_filename[1024];
-
-#ifdef __WIN32
-//Windows.h need to be included before mysql.h
-#include <windows.h>
-#endif
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-extern MYSQL mysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-extern int sql_cnt;
-
-extern MYSQL lmysql_handle;
-extern MYSQL_RES* lsql_res ;
-extern MYSQL_ROW lsql_row ;
-
-extern int char_server_port;
-extern char char_server_ip[32];
-extern char char_server_id[32];
-extern char char_server_pw[32];
-extern char char_server_db[32];
-
-extern int login_db_server_port;
-extern char login_db_server_ip[32];
-extern char login_db_server_id[32];
-extern char login_db_server_pw[32];
-extern char login_db_server_db[32];
-
-extern char main_chat_nick[16];
-
-int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INTER_SQL_H_
+#define _INTER_SQL_H_
+
+int inter_init_sql(const char *file);
+void inter_final(void);
+int inter_parse_frommap(int fd);
+int inter_mapif_init(int fd);
+int mapif_send_gmaccounts(void);
+void mapif_send_maxid(int, int);
+int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason);
+
+int inter_check_length(int fd,int length);
+
+int inter_log(char *fmt,...);
+
+#define inter_cfgName "conf/inter_athena.conf"
+
+extern unsigned int party_share_level;
+extern char inter_log_filename[1024];
+
+#ifdef __WIN32
+//Windows.h need to be included before mysql.h
+#include <windows.h>
+#endif
+//add include for DBMS(mysql)
+#include <mysql.h>
+
+extern MYSQL mysql_handle;
+extern char tmp_sql[65535];
+extern MYSQL_RES* sql_res ;
+extern MYSQL_ROW sql_row ;
+extern int sql_cnt;
+
+extern MYSQL lmysql_handle;
+extern MYSQL_RES* lsql_res ;
+extern MYSQL_ROW lsql_row ;
+
+extern int char_server_port;
+extern char char_server_ip[32];
+extern char char_server_id[32];
+extern char char_server_pw[32];
+extern char char_server_db[32];
+
+extern int login_db_server_port;
+extern char login_db_server_ip[32];
+extern char login_db_server_id[32];
+extern char login_db_server_pw[32];
+extern char login_db_server_db[32];
+
+extern char main_chat_nick[16];
+
+int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type);
+#endif
diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c
index e3d37ca85..9f76eb21c 100644
--- a/src/char_sql/itemdb.c
+++ b/src/char_sql/itemdb.c
@@ -1,222 +1,222 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "itemdb.h"
-#include "db.h"
-#include "inter.h"
-#include "char.h"
-#include "utils.h"
-#include "../common/showmsg.h"
-
-#define MAX_RANDITEM 2000
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-char item_db_db[256]="item_db"; // added to specify item_db sql table [Valaris]
-char item_db2_db[256]="item_db2";
-
-static struct dbt* item_db;
-
-static void* create_item(DBKey key, va_list args) {
- struct item_data *id;
- int nameid = key.i;
- CREATE(id, struct item_data, 1);
- id->nameid = nameid;
- id->type = IT_ETC;
- return id;
-}
-/*==========================================
- * DB‚ÌŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- return idb_ensure(item_db,nameid,create_item);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-
-
-
-/*==========================================
- * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0,lines=0;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
- int i=0;
- char *filename[]={ "item_db.txt","item_db2.txt" };
-
- for(i=0;i<2;i++){
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp=fopen(line,"r");
- if(fp==NULL){
- if(i>0)
- continue;
- ShowFatalError("can't read %s\n",line);
- exit(1);
- }
-
- lines=0;
- while(fgets(line,1020,fp)){
- lines++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- malloc_tsetdword(str,0,sizeof(str));
- for(j=0,np=p=line;j<4 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p){ *p++=0; np=p; }
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0)
- continue;
- if (j < 4)
- { //Crash-fix on broken item lines. [Skotlex]
- ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid);
- continue;
- }
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View
- id=itemdb_search(nameid);
- strncpy(id->name, str[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1);
- id->type=atoi(str[3]);
- if (id->type == IT_DELAYCONSUME)
- id->type = IT_USABLE;
- }
- fclose(fp);
- if (ln > 0) {
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
- }
- ln=0; // reset to 0
- }
- return 0;
-}
-
-static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
-{
- unsigned short nameid;
- struct item_data *id;
- char *item_db_name[] = { item_db_db, item_db2_db };
- long unsigned int ln = 0;
- int i;
-
- // ----------
-
- for (i = 0; i < 2; i++) {
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]);
-
- // Execute the query; if the query execution succeeded...
- if (mysql_query(&mysql_handle, tmp_sql) == 0) {
- sql_res = mysql_store_result(&mysql_handle);
-
- // If the storage of the query result succeeded...
- if (sql_res) {
- // Parse each row in the query result into sql_row
- while ((sql_row = mysql_fetch_row(sql_res)))
- { /*Table structure is:
- 00 id
- 01 name_english
- 02 name_japanese
- 03 type
- ...
- */
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0)
- continue;
-
- ln++;
-
- // ----------
- id=itemdb_search(nameid);
-
- strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1);
-
- id->type = atoi(sql_row[3]);
- if (id->type == IT_DELAYCONSUME)
- id->type = IT_USABLE;
- }
- ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]);
- ln = 0;
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- // Free the query result
- mysql_free_result(sql_res);
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void do_final_itemdb(void)
-{
- if(item_db){
- item_db->destroy(item_db,NULL);
- item_db=NULL;
- }
-}
-int do_init_itemdb(void)
-{
- item_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris]
- itemdb_read_sqldb();
- else
- itemdb_readdb();
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "itemdb.h"
+#include "db.h"
+#include "inter.h"
+#include "char.h"
+#include "utils.h"
+#include "../common/showmsg.h"
+
+#define MAX_RANDITEM 2000
+
+// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
+// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
+//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
+
+char item_db_db[256]="item_db"; // added to specify item_db sql table [Valaris]
+char item_db2_db[256]="item_db2";
+
+static struct dbt* item_db;
+
+static void* create_item(DBKey key, va_list args) {
+ struct item_data *id;
+ int nameid = key.i;
+ CREATE(id, struct item_data, 1);
+ id->nameid = nameid;
+ id->type = IT_ETC;
+ return id;
+}
+/*==========================================
+ * DB‚ÌŒŸõ
+ *------------------------------------------
+ */
+struct item_data* itemdb_search(int nameid)
+{
+ return idb_ensure(item_db,nameid,create_item);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip(int nameid)
+{
+ int type=itemdb_type(nameid);
+ if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
+ return 0;
+ return 1;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip2(struct item_data *data)
+{
+ if(data) {
+ int type=data->type;
+ if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
+ return 0;
+ else
+ return 1;
+ }
+ return 0;
+}
+
+
+
+/*==========================================
+ * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static int itemdb_readdb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0,lines=0;
+ int nameid,j;
+ char *str[32],*p,*np;
+ struct item_data *id;
+ int i=0;
+ char *filename[]={ "item_db.txt","item_db2.txt" };
+
+ for(i=0;i<2;i++){
+ sprintf(line, "%s/%s", db_path, filename[i]);
+ fp=fopen(line,"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ ShowFatalError("can't read %s\n",line);
+ exit(1);
+ }
+
+ lines=0;
+ while(fgets(line,1020,fp)){
+ lines++;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ malloc_tsetdword(str,0,sizeof(str));
+ for(j=0,np=p=line;j<4 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p){ *p++=0; np=p; }
+ }
+ if(str[0]==NULL)
+ continue;
+
+ nameid=atoi(str[0]);
+ if(nameid<=0)
+ continue;
+ if (j < 4)
+ { //Crash-fix on broken item lines. [Skotlex]
+ ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid);
+ continue;
+ }
+ ln++;
+
+ //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View
+ id=itemdb_search(nameid);
+ strncpy(id->name, str[1], ITEM_NAME_LENGTH-1);
+ strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1);
+ id->type=atoi(str[3]);
+ if (id->type == IT_DELAYCONSUME)
+ id->type = IT_USABLE;
+ }
+ fclose(fp);
+ if (ln > 0) {
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
+ }
+ ln=0; // reset to 0
+ }
+ return 0;
+}
+
+static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
+{
+ unsigned short nameid;
+ struct item_data *id;
+ char *item_db_name[] = { item_db_db, item_db2_db };
+ long unsigned int ln = 0;
+ int i;
+
+ // ----------
+
+ for (i = 0; i < 2; i++) {
+ sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]);
+
+ // Execute the query; if the query execution succeeded...
+ if (mysql_query(&mysql_handle, tmp_sql) == 0) {
+ sql_res = mysql_store_result(&mysql_handle);
+
+ // If the storage of the query result succeeded...
+ if (sql_res) {
+ // Parse each row in the query result into sql_row
+ while ((sql_row = mysql_fetch_row(sql_res)))
+ { /*Table structure is:
+ 00 id
+ 01 name_english
+ 02 name_japanese
+ 03 type
+ ...
+ */
+ nameid = atoi(sql_row[0]);
+
+ // If the identifier is not within the valid range, process the next row
+ if (nameid == 0)
+ continue;
+
+ ln++;
+
+ // ----------
+ id=itemdb_search(nameid);
+
+ strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1);
+ strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1);
+
+ id->type = atoi(sql_row[3]);
+ if (id->type == IT_DELAYCONSUME)
+ id->type = IT_USABLE;
+ }
+ ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]);
+ ln = 0;
+ } else {
+ ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ // Free the query result
+ mysql_free_result(sql_res);
+ } else {
+ ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void do_final_itemdb(void)
+{
+ if(item_db){
+ item_db->destroy(item_db,NULL);
+ item_db=NULL;
+ }
+}
+int do_init_itemdb(void)
+{
+ item_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris]
+ itemdb_read_sqldb();
+ else
+ itemdb_readdb();
+ return 0;
+}
diff --git a/src/char_sql/itemdb.h b/src/char_sql/itemdb.h
index d19dd498c..53b1d3e02 100644
--- a/src/char_sql/itemdb.h
+++ b/src/char_sql/itemdb.h
@@ -1,43 +1,43 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-#include "mmo.h"
-
-//FIXME: Maybe it would be better to move this enum to mmo.h,
-//instead of having it twice on the map server and here? [Skotlex]
-enum {
- IT_HEALING = 0,
- IT_UNKNOWN, //1
- IT_USABLE, //2
- IT_ETC, //3
- IT_WEAPON, //4
- IT_ARMOR, //5
- IT_CARD, //6
- IT_PETEGG, //7
- IT_PETARMOR,//8
- IT_UNKNOWN2,//9
- IT_AMMO, //10
- IT_DELAYCONSUME,//11
- IT_MAX
-} item_types;
-
-struct item_data {
- int nameid;
- char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
- int type;
-};
-
-extern char item_db_db[256];
-extern char item_db2_db[256];
-struct item_data* itemdb_search(int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-
-void do_final_itemdb(void);
-int do_init_itemdb(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _ITEMDB_H_
+#define _ITEMDB_H_
+#include "mmo.h"
+
+//FIXME: Maybe it would be better to move this enum to mmo.h,
+//instead of having it twice on the map server and here? [Skotlex]
+enum {
+ IT_HEALING = 0,
+ IT_UNKNOWN, //1
+ IT_USABLE, //2
+ IT_ETC, //3
+ IT_WEAPON, //4
+ IT_ARMOR, //5
+ IT_CARD, //6
+ IT_PETEGG, //7
+ IT_PETARMOR,//8
+ IT_UNKNOWN2,//9
+ IT_AMMO, //10
+ IT_DELAYCONSUME,//11
+ IT_MAX
+} item_types;
+
+struct item_data {
+ int nameid;
+ char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
+ int type;
+};
+
+extern char item_db_db[256];
+extern char item_db2_db[256];
+struct item_data* itemdb_search(int nameid);
+#define itemdb_type(n) itemdb_search(n)->type
+
+int itemdb_isequip(int);
+int itemdb_isequip2(struct item_data *);
+
+void do_final_itemdb(void);
+int do_init_itemdb(void);
+
+#endif
diff --git a/src/common/core.c b/src/common/core.c
index 06ee6b2b8..7b977632d 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -1,303 +1,303 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-#include <signal.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "core.h"
-#include "../common/db.h"
-#include "../common/mmo.h"
-#include "../common/malloc.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/graph.h"
-#include "../common/plugins.h"
-#include "../common/version.h"
-#include "../common/showmsg.h"
-
-#ifndef _WIN32
- #include "svnversion.h"
-#endif
-
-int runflag = 1;
-int arg_c = 0;
-char **arg_v = NULL;
-
-char *SERVER_NAME = NULL;
-char SERVER_TYPE = ATHENA_SERVER_NONE;
-static void (*term_func)(void) = NULL;
-#ifndef SVNVERSION
- static char eA_svn_version[10];
-#endif
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_termfunc(void (*termfunc)(void))
-{
- term_func = termfunc;
-}
-
-#ifndef MINICORE // minimalist Core
-// Added by Gabuzomeu
-//
-// This is an implementation of signal() using sigaction() for portability.
-// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
-// Programming in the UNIX Environment_.
-//
-#ifdef WIN32 // windows don't have SIGPIPE
-#define SIGPIPE SIGINT
-#endif
-
-#ifndef POSIX
-#define compat_signal(signo, func) signal(signo, func)
-#else
-sigfunc *compat_signal(int signo, sigfunc *func)
-{
- struct sigaction sact, oact;
-
- sact.sa_handler = func;
- sigemptyset(&sact.sa_mask);
- sact.sa_flags = 0;
-#ifdef SA_INTERRUPT
- sact.sa_flags |= SA_INTERRUPT; /* SunOS */
-#endif
-
- if (sigaction(signo, &sact, &oact) < 0)
- return (SIG_ERR);
-
- return (oact.sa_handler);
-}
-#endif
-
-/*======================================
- * CORE : Signal Sub Function
- *--------------------------------------
- */
-static void sig_proc(int sn)
-{
- static int is_called = 0;
-
- switch (sn) {
- case SIGINT:
- case SIGTERM:
- if (++is_called > 3)
- exit(0);
- runflag = 0;
- break;
-#ifndef _WIN32
- case SIGXFSZ:
- // ignore and allow it to set errno to EFBIG
- ShowWarning ("Max file size reached!\n");
- //run_flag = 0; // should we quit?
- break;
- case SIGPIPE:
- ShowMessage ("Broken pipe found... closing socket\n"); // set to eof in socket.c
- break; // does nothing here
-#endif
- }
-}
-
-void signals_init (void)
-{
- compat_signal(SIGTERM, sig_proc);
- compat_signal(SIGINT, sig_proc);
-
- // Signal to create coredumps by system when necessary (crash)
- compat_signal(SIGSEGV, SIG_DFL);
- compat_signal(SIGFPE, SIG_DFL);
- compat_signal(SIGILL, SIG_DFL);
- #ifndef _WIN32
- compat_signal(SIGXFSZ, sig_proc);
- compat_signal(SIGPIPE, sig_proc);
- compat_signal(SIGBUS, SIG_DFL);
- compat_signal(SIGTRAP, SIG_DFL);
- #endif
-}
-#endif
-
-#ifdef SVNVERSION
- #define xstringify(x) stringify(x)
- #define stringify(x) #x
- const char *get_svn_revision(void)
- {
- return xstringify(SVNVERSION);
- }
-#else
-const char* get_svn_revision(void)
-{
- FILE *fp;
-
- if(*eA_svn_version)
- return eA_svn_version;
-
- if ((fp = fopen(".svn/entries", "r")))
- {
- char line[1024];
- int rev;
- // Check the version
- if (fgets(line,sizeof(line),fp))
- {
- if(!isdigit(line[0]))
- {
- // XML File format
- while (fgets(line,sizeof(line),fp))
- if (strstr(line,"revision=")) break;
- fclose(fp);
- if (sscanf(line," %*[^\"]\"%d%*[^\n]", &rev) == 1) {
- snprintf(eA_svn_version, sizeof(eA_svn_version), "%d", rev);
- }
- }
- else
- {
- // Bin File format
- fgets(line,sizeof(line),fp); // Get the name
- fgets(line,sizeof(line),fp); // Get the entries kind
- if(fgets(line,sizeof(line),fp)) // Get the rev numver
- {
- snprintf(eA_svn_version, sizeof(eA_svn_version), "%d", atoi(line));
- }
- }
- }
- }
-
- if(!(*eA_svn_version))
- snprintf(eA_svn_version, sizeof(eA_svn_version), "Unknown");
-
- return eA_svn_version;
-}
-#endif
-
-/*======================================
- * CORE : Display title
- *--------------------------------------
- */
-
-static void display_title(void)
-{
- //The clearscreeen is usually more of an annoyance than anything else... [Skotlex]
-// ClearScreen(); // clear screen and go up/left (0, 0 position in text)
- //ShowMessage("\n"); //A blank message??
- printf("\n");
- ShowMessage(""CL_WTBL" (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)"CL_CLL""CL_NORMAL"\n"); // white writing (37) on blue background (44), \033[K clean until end of file
- ShowMessage(""CL_XXBL" ("CL_BT_YELLOW" (c)2005 eAthena Development Team presents "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
- ShowMessage(""CL_XXBL" ("CL_BOLD" ______ __ __ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d "CL_XXBL")"CL_CLL""CL_NORMAL"\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" _ _ _ _ _ _ _ _ _ _ _ _ _ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
- ShowMessage(""CL_XXBL" ("CL_BOLD" "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
- ShowMessage(""CL_XXBL" ("CL_BT_YELLOW" Advanced Fusion Maps (c) 2003-2005 The Fusion Project "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
- ShowMessage(""CL_WTBL" (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)"CL_CLL""CL_NORMAL"\n\n"); // reset color
-
- ShowInfo("SVN Revision: '"CL_WHITE"%s"CL_RESET"'.\n", get_svn_revision());
-}
-
-// Warning if logged in as superuser (root)
-void usercheck(void){
-#ifndef _WIN32
- if ((getuid() == 0) && (getgid() == 0)) {
- ShowWarning ("You are running eAthena as the root superuser.\n");
- ShowWarning ("It is unnecessary and unsafe to run eAthena with root privileges.\n");
- sleep(3);
- }
-#endif
-}
-
-/*======================================
- * CORE : MAINROUTINE
- *--------------------------------------
- */
-#ifndef MINICORE // minimalist Core
-int main (int argc, char **argv)
-{
- int next;
-
- // initialise program arguments
- {
- char *p1 = SERVER_NAME = argv[0];
- char *p2 = p1;
- while ((p1 = strchr(p2, '/')) != NULL || (p1 = strchr(p2, '\\')) != NULL)
- {
- SERVER_NAME = ++p1;
- p2 = p1;
- }
- arg_c = argc;
- arg_v = argv;
- #ifndef SVNVERSION
- *eA_svn_version = '\0';
- #endif
- }
-
- set_server_type();
- display_title();
- usercheck();
-
- malloc_init(); /* ˆê”Ôʼn‚ÉŽÀs‚·‚é•K—v‚ª‚ ‚é */
- db_init();
- signals_init();
-
- timer_init();
- socket_init();
- plugins_init();
-
- do_init(argc,argv);
- graph_init();
- plugin_event_trigger("Athena_Init");
-
- while (runflag) {
- next = do_timer(gettick_nocache());
- do_sendrecv(next);
-#ifndef TURBO
- do_parsepacket();
-#endif
- }
-
- plugin_event_trigger("Athena_Final");
- graph_final();
- do_final();
-
- timer_final();
- plugins_final();
- socket_final();
- db_final();
- malloc_final();
-
- return 0;
-}
-#else
-int main (int argc, char **argv)
-{
- // initialise program arguments
- {
- char *p = SERVER_NAME = argv[0];
- while ((p = strchr(p, '/')) != NULL)
- SERVER_NAME = ++p;
- arg_c = argc;
- arg_v = argv;
- }
-
- display_title();
- usercheck();
- do_init(argc,argv);
- do_final();
-
- return 0;
-}
-#endif
-
-#ifdef BCHECK
-unsigned int __invalid_size_argument_for_IOC;
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <signal.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "core.h"
+#include "../common/db.h"
+#include "../common/mmo.h"
+#include "../common/malloc.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/graph.h"
+#include "../common/plugins.h"
+#include "../common/version.h"
+#include "../common/showmsg.h"
+
+#ifndef _WIN32
+ #include "svnversion.h"
+#endif
+
+int runflag = 1;
+int arg_c = 0;
+char **arg_v = NULL;
+
+char *SERVER_NAME = NULL;
+char SERVER_TYPE = ATHENA_SERVER_NONE;
+static void (*term_func)(void) = NULL;
+#ifndef SVNVERSION
+ static char eA_svn_version[10];
+#endif
+/*======================================
+ * CORE : Set function
+ *--------------------------------------
+ */
+void set_termfunc(void (*termfunc)(void))
+{
+ term_func = termfunc;
+}
+
+#ifndef MINICORE // minimalist Core
+// Added by Gabuzomeu
+//
+// This is an implementation of signal() using sigaction() for portability.
+// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
+// Programming in the UNIX Environment_.
+//
+#ifdef WIN32 // windows don't have SIGPIPE
+#define SIGPIPE SIGINT
+#endif
+
+#ifndef POSIX
+#define compat_signal(signo, func) signal(signo, func)
+#else
+sigfunc *compat_signal(int signo, sigfunc *func)
+{
+ struct sigaction sact, oact;
+
+ sact.sa_handler = func;
+ sigemptyset(&sact.sa_mask);
+ sact.sa_flags = 0;
+#ifdef SA_INTERRUPT
+ sact.sa_flags |= SA_INTERRUPT; /* SunOS */
+#endif
+
+ if (sigaction(signo, &sact, &oact) < 0)
+ return (SIG_ERR);
+
+ return (oact.sa_handler);
+}
+#endif
+
+/*======================================
+ * CORE : Signal Sub Function
+ *--------------------------------------
+ */
+static void sig_proc(int sn)
+{
+ static int is_called = 0;
+
+ switch (sn) {
+ case SIGINT:
+ case SIGTERM:
+ if (++is_called > 3)
+ exit(0);
+ runflag = 0;
+ break;
+#ifndef _WIN32
+ case SIGXFSZ:
+ // ignore and allow it to set errno to EFBIG
+ ShowWarning ("Max file size reached!\n");
+ //run_flag = 0; // should we quit?
+ break;
+ case SIGPIPE:
+ ShowMessage ("Broken pipe found... closing socket\n"); // set to eof in socket.c
+ break; // does nothing here
+#endif
+ }
+}
+
+void signals_init (void)
+{
+ compat_signal(SIGTERM, sig_proc);
+ compat_signal(SIGINT, sig_proc);
+
+ // Signal to create coredumps by system when necessary (crash)
+ compat_signal(SIGSEGV, SIG_DFL);
+ compat_signal(SIGFPE, SIG_DFL);
+ compat_signal(SIGILL, SIG_DFL);
+ #ifndef _WIN32
+ compat_signal(SIGXFSZ, sig_proc);
+ compat_signal(SIGPIPE, sig_proc);
+ compat_signal(SIGBUS, SIG_DFL);
+ compat_signal(SIGTRAP, SIG_DFL);
+ #endif
+}
+#endif
+
+#ifdef SVNVERSION
+ #define xstringify(x) stringify(x)
+ #define stringify(x) #x
+ const char *get_svn_revision(void)
+ {
+ return xstringify(SVNVERSION);
+ }
+#else
+const char* get_svn_revision(void)
+{
+ FILE *fp;
+
+ if(*eA_svn_version)
+ return eA_svn_version;
+
+ if ((fp = fopen(".svn/entries", "r")))
+ {
+ char line[1024];
+ int rev;
+ // Check the version
+ if (fgets(line,sizeof(line),fp))
+ {
+ if(!isdigit(line[0]))
+ {
+ // XML File format
+ while (fgets(line,sizeof(line),fp))
+ if (strstr(line,"revision=")) break;
+ fclose(fp);
+ if (sscanf(line," %*[^\"]\"%d%*[^\n]", &rev) == 1) {
+ snprintf(eA_svn_version, sizeof(eA_svn_version), "%d", rev);
+ }
+ }
+ else
+ {
+ // Bin File format
+ fgets(line,sizeof(line),fp); // Get the name
+ fgets(line,sizeof(line),fp); // Get the entries kind
+ if(fgets(line,sizeof(line),fp)) // Get the rev numver
+ {
+ snprintf(eA_svn_version, sizeof(eA_svn_version), "%d", atoi(line));
+ }
+ }
+ }
+ }
+
+ if(!(*eA_svn_version))
+ snprintf(eA_svn_version, sizeof(eA_svn_version), "Unknown");
+
+ return eA_svn_version;
+}
+#endif
+
+/*======================================
+ * CORE : Display title
+ *--------------------------------------
+ */
+
+static void display_title(void)
+{
+ //The clearscreeen is usually more of an annoyance than anything else... [Skotlex]
+// ClearScreen(); // clear screen and go up/left (0, 0 position in text)
+ //ShowMessage("\n"); //A blank message??
+ printf("\n");
+ ShowMessage(""CL_WTBL" (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)"CL_CLL""CL_NORMAL"\n"); // white writing (37) on blue background (44), \033[K clean until end of file
+ ShowMessage(""CL_XXBL" ("CL_BT_YELLOW" (c)2005 eAthena Development Team presents "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
+ ShowMessage(""CL_XXBL" ("CL_BOLD" ______ __ __ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d "CL_XXBL")"CL_CLL""CL_NORMAL"\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" _ _ _ _ _ _ _ _ _ _ _ _ _ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // 1: bold char, 0: normal char
+ ShowMessage(""CL_XXBL" ("CL_BOLD" "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
+ ShowMessage(""CL_XXBL" ("CL_BT_YELLOW" Advanced Fusion Maps (c) 2003-2005 The Fusion Project "CL_XXBL")"CL_CLL""CL_NORMAL"\n"); // yellow writing (33)
+ ShowMessage(""CL_WTBL" (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)"CL_CLL""CL_NORMAL"\n\n"); // reset color
+
+ ShowInfo("SVN Revision: '"CL_WHITE"%s"CL_RESET"'.\n", get_svn_revision());
+}
+
+// Warning if logged in as superuser (root)
+void usercheck(void){
+#ifndef _WIN32
+ if ((getuid() == 0) && (getgid() == 0)) {
+ ShowWarning ("You are running eAthena as the root superuser.\n");
+ ShowWarning ("It is unnecessary and unsafe to run eAthena with root privileges.\n");
+ sleep(3);
+ }
+#endif
+}
+
+/*======================================
+ * CORE : MAINROUTINE
+ *--------------------------------------
+ */
+#ifndef MINICORE // minimalist Core
+int main (int argc, char **argv)
+{
+ int next;
+
+ // initialise program arguments
+ {
+ char *p1 = SERVER_NAME = argv[0];
+ char *p2 = p1;
+ while ((p1 = strchr(p2, '/')) != NULL || (p1 = strchr(p2, '\\')) != NULL)
+ {
+ SERVER_NAME = ++p1;
+ p2 = p1;
+ }
+ arg_c = argc;
+ arg_v = argv;
+ #ifndef SVNVERSION
+ *eA_svn_version = '\0';
+ #endif
+ }
+
+ set_server_type();
+ display_title();
+ usercheck();
+
+ malloc_init(); /* ˆê”Ôʼn‚ÉŽÀs‚·‚é•K—v‚ª‚ ‚é */
+ db_init();
+ signals_init();
+
+ timer_init();
+ socket_init();
+ plugins_init();
+
+ do_init(argc,argv);
+ graph_init();
+ plugin_event_trigger("Athena_Init");
+
+ while (runflag) {
+ next = do_timer(gettick_nocache());
+ do_sendrecv(next);
+#ifndef TURBO
+ do_parsepacket();
+#endif
+ }
+
+ plugin_event_trigger("Athena_Final");
+ graph_final();
+ do_final();
+
+ timer_final();
+ plugins_final();
+ socket_final();
+ db_final();
+ malloc_final();
+
+ return 0;
+}
+#else
+int main (int argc, char **argv)
+{
+ // initialise program arguments
+ {
+ char *p = SERVER_NAME = argv[0];
+ while ((p = strchr(p, '/')) != NULL)
+ SERVER_NAME = ++p;
+ arg_c = argc;
+ arg_v = argv;
+ }
+
+ display_title();
+ usercheck();
+ do_init(argc,argv);
+ do_final();
+
+ return 0;
+}
+#endif
+
+#ifdef BCHECK
+unsigned int __invalid_size_argument_for_IOC;
+#endif
diff --git a/src/common/core.h b/src/common/core.h
index ce57c28a6..fffd44028 100644
--- a/src/common/core.h
+++ b/src/common/core.h
@@ -1,22 +1,22 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CORE_H_
-#define _CORE_H_
-
-//#define SQL_DEBUG //uncomment for debug_mysql_query instead of mysql_real_query
-
-extern int arg_c;
-extern char **arg_v;
-
-extern int runflag;
-extern char *SERVER_NAME;
-extern char SERVER_TYPE;
-
-extern const char *get_svn_revision(void);
-extern int do_init(int,char**);
-extern void set_server_type(void);
-extern void set_termfunc(void (*termfunc)(void));
-extern void do_final(void);
-
-#endif // _CORE_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CORE_H_
+#define _CORE_H_
+
+//#define SQL_DEBUG //uncomment for debug_mysql_query instead of mysql_real_query
+
+extern int arg_c;
+extern char **arg_v;
+
+extern int runflag;
+extern char *SERVER_NAME;
+extern char SERVER_TYPE;
+
+extern const char *get_svn_revision(void);
+extern int do_init(int,char**);
+extern void set_server_type(void);
+extern void set_termfunc(void (*termfunc)(void));
+extern void do_final(void);
+
+#endif // _CORE_H_
diff --git a/src/common/db.c b/src/common/db.c
index ebb5b9a30..28b5721e9 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -1,2448 +1,2448 @@
-/*****************************************************************************\
- * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
- * For more information, see LICENCE in the main folder *
- * *
- * This file is separated in five sections: *
- * (1) Private typedefs, enums, structures, defines and gblobal variables *
- * (2) Private functions *
- * (3) Protected functions used internally *
- * (4) Protected functions used in the interface of the database *
- * (5) Public functions *
- * *
- * The databases are structured as a hashtable of RED-BLACK trees. *
- * *
- * <B>Properties of the RED-BLACK trees being used:</B> *
- * 1. The value of any node is greater than the value of its left child and *
- * less than the value of its right child. *
- * 2. Every node is colored either RED or BLACK. *
- * 3. Every red node that is not a leaf has only black children. *
- * 4. Every path from the root to a leaf contains the same number of black *
- * nodes. *
- * 5. The root node is black. *
- * An <code>n</code> node in a RED-BLACK tree has the property that its *
- * height is <code>O(lg(n))</code>. *
- * Another important property is that after adding a node to a RED-BLACK *
- * tree, the tree can be readjusted in <code>O(lg(n))</code> time. *
- * Similarly, after deleting a node from a RED-BLACK tree, the tree can be *
- * readjusted in <code>O(lg(n))</code> time. *
- * {@link http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic18/} *
- * *
- * <B>How to add new database types:</B> *
- * 1. Add the identifier of the new database type to the enum DBType *
- * 2. If not already there, add the data type of the key to the union DBKey *
- * 3. If the key can be considered NULL, update the function db_is_key_null *
- * 4. If the key can be duplicated, update the functions db_dup_key and *
- * db_dup_key_free *
- * 5. Create a comparator and update the function db_default_cmp *
- * 6. Create a hasher and update the function db_default_hash *
- * 7. If the new database type requires or does not support some options, *
- * update the function db_fix_options *
- * *
- * TODO: *
- * - create test cases to test the database system thoroughly *
- * - make data an enumeration *
- * - finish this header describing the database system *
- * - create custom database allocator *
- * - make the system thread friendly *
- * - change the structure of the database to T-Trees *
- * - create a db that organizes itself by splaying *
- * *
- * HISTORY: *
- * 2.1 (Athena build #???#) - Portability fix *
- * - Fixed the portability of casting to union and added the functions *
- * {@link DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)} and *
- * {@link DBInterface#clear(DBInterface,DBApply,...)}. *
- * 2.0 (Athena build 4859) - Transition version *
- * - Almost everything recoded with a strategy similar to objects, *
- * database structure is maintained. *
- * 1.0 (up to Athena build 4706) *
- * - Previous database system. *
- * *
- * @version 2.1 (Athena build #???#) - Portability fix *
- * @author (Athena build 4859) Flavio @ Amazon Project *
- * @author (up to Athena build 4706) Athena Dev Teams *
- * @encoding US-ASCII *
- * @see common#db.h *
-\*****************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "../common/mmo.h"
-#include "../common/utils.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-#include "../common/ers.h"
-
-/*****************************************************************************\
- * (1) Private typedefs, enums, structures, defines and global variables of *
- * the database system. *
- * DB_ENABLE_STATS - Define to enable database statistics. *
- * HASH_SIZE - Define with the size of the hashtable. *
- * DBNColor - Enumeration of colors of the nodes. *
- * DBNode - Structure of a node in RED-BLACK trees. *
- * struct db_free - Structure that holds a deleted node to be freed. *
- * Database - Struture of the database. *
- * stats - Statistics about the database system. *
-\*****************************************************************************/
-
-/**
- * If defined statistics about database nodes, database creating/destruction
- * and function usage are keept and displayed when finalizing the database
- * system.
- * WARNING: This adds overhead to every database operation (not shure how much).
- * @private
- * @see #DBStats
- * @see #stats
- * @see #db_final(void)
- */
-//#define DB_ENABLE_STATS
-
-/**
- * Size of the hashtable in the database.
- * @private
- * @see Database#ht
- */
-#define HASH_SIZE (256+27)
-
-/**
- * A node in a RED-BLACK tree of the database.
- * @param parent Parent node
- * @param left Left child node
- * @param right Right child node
- * @param key Key of this database entry
- * @param data Data of this database entry
- * @param deleted If the node is deleted
- * @param color Color of the node
- * @private
- * @see Database#ht
- */
-typedef struct dbn {
- // Tree structure
- struct dbn *parent;
- struct dbn *left;
- struct dbn *right;
- // Node data
- DBKey key;
- void *data;
- // Other
- enum {RED, BLACK} color;
- unsigned deleted : 1;
-} *DBNode;
-
-/**
- * Structure that holds a deleted node.
- * @param node Deleted node
- * @param root Address to the root of the tree
- * @private
- * @see Database#free_list
- */
-struct db_free {
- DBNode node;
- DBNode *root;
-};
-
-/**
- * Complete database structure.
- * @param dbi Interface of the database
- * @param alloc_file File where the database was allocated
- * @param alloc_line Line in the file where the database was allocated
- * @param free_list Array of deleted nodes to be freed
- * @param free_count Number of deleted nodes in free_list
- * @param free_max Current maximum capacity of free_list
- * @param free_lock Lock for freeing the nodes
- * @param nodes Manager of reusable tree nodes
- * @param cmp Comparator of the database
- * @param hash Hasher of the database
- * @param release Releaser of the database
- * @param ht Hashtable of RED-BLACK trees
- * @param type Type of the database
- * @param options Options of the database
- * @param item_count Number of items in the database
- * @param maxlen Maximum length of strings in DB_STRING and DB_ISTRING databases
- * @param global_lock Global lock of the database
- * @private
- * @see common\db.h#DBInterface
- * @see #HASH_SIZE
- * @see #DBNode
- * @see #struct db_free
- * @see common\db.h#DBComparator(void *,void *)
- * @see common\db.h#DBHasher(void *)
- * @see common\db.h#DBReleaser(void *,void *,DBRelease)
- * @see common\db.h#DBOptions
- * @see common\db.h#DBType
- * @see #db_alloc(const char *,int,DBOptions,DBType,...)
- */
-typedef struct db {
- // Database interface
- struct dbt dbi;
- // File and line of allocation
- const char *alloc_file;
- int alloc_line;
- // Lock system
- struct db_free *free_list;
- unsigned int free_count;
- unsigned int free_max;
- unsigned int free_lock;
- // Other
- ERInterface nodes;
- DBComparator cmp;
- DBHasher hash;
- DBReleaser release;
- DBNode ht[HASH_SIZE];
- DBType type;
- DBOptions options;
- unsigned int item_count;
- unsigned short maxlen;
- unsigned global_lock : 1;
-} *Database;
-
-#ifdef DB_ENABLE_STATS
-/**
- * Structure with what is counted when the database estatistics are enabled.
- * @private
- * @see #DB_ENABLE_STATS
- * @see #stats
- */
-static struct {
- // Node alloc/free
- unsigned int db_node_alloc;
- unsigned int db_node_free;
- // Database creating/destruction counters
- unsigned int db_int_alloc;
- unsigned int db_uint_alloc;
- unsigned int db_string_alloc;
- unsigned int db_istring_alloc;
- unsigned int db_int_destroy;
- unsigned int db_uint_destroy;
- unsigned int db_string_destroy;
- unsigned int db_istring_destroy;
- // Function usage counters
- unsigned int db_rotate_left;
- unsigned int db_rotate_right;
- unsigned int db_rebalance;
- unsigned int db_rebalance_erase;
- unsigned int db_is_key_null;
- unsigned int db_dup_key;
- unsigned int db_dup_key_free;
- unsigned int db_free_add;
- unsigned int db_free_remove;
- unsigned int db_free_lock;
- unsigned int db_free_unlock;
- unsigned int db_int_cmp;
- unsigned int db_uint_cmp;
- unsigned int db_string_cmp;
- unsigned int db_istring_cmp;
- unsigned int db_int_hash;
- unsigned int db_uint_hash;
- unsigned int db_string_hash;
- unsigned int db_istring_hash;
- unsigned int db_release_nothing;
- unsigned int db_release_key;
- unsigned int db_release_data;
- unsigned int db_release_both;
- unsigned int db_get;
- unsigned int db_getall;
- unsigned int db_vgetall;
- unsigned int db_ensure;
- unsigned int db_vensure;
- unsigned int db_put;
- unsigned int db_remove;
- unsigned int db_foreach;
- unsigned int db_vforeach;
- unsigned int db_clear;
- unsigned int db_vclear;
- unsigned int db_destroy;
- unsigned int db_vdestroy;
- unsigned int db_size;
- unsigned int db_type;
- unsigned int db_options;
- unsigned int db_fix_options;
- unsigned int db_default_cmp;
- unsigned int db_default_hash;
- unsigned int db_default_release;
- unsigned int db_custom_release;
- unsigned int db_alloc;
- unsigned int db_i2key;
- unsigned int db_ui2key;
- unsigned int db_str2key;
- unsigned int db_init;
- unsigned int db_final;
-} stats = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
-};
-#endif /* DB_ENABLE_STATS */
-
-/*****************************************************************************\
- * (2) Section of private functions used by the database system. *
- * db_rotate_left - Rotate a tree node to the left. *
- * db_rotate_right - Rotate a tree node to the right. *
- * db_rebalance - Rebalance the tree. *
- * db_rebalance_erase - Rebalance the tree after a BLACK node was erased. *
- * db_is_key_null - Returns not 0 if the key is considered NULL. *
- * db_dup_key - Duplicate a key for internal use. *
- * db_dup_key_free - Free the duplicated key. *
- * db_free_add - Add a node to the free_list of a database. *
- * db_free_remove - Remove a node from the free_list of a database. *
- * db_free_lock - Increment the free_lock of a database. *
- * db_free_unlock - Decrement the free_lock of a database. *
- * If it was the last lock, frees the nodes in free_list. *
- * NOTE: Keeps the database trees balanced. *
-\*****************************************************************************/
-
-/**
- * Rotate a node to the left.
- * @param node Node to be rotated
- * @param root Pointer to the root of the tree
- * @private
- * @see #db_rebalance(DBNode,DBNode *)
- * @see #db_rebalance_erase(DBNode,DBNode *)
- */
-static void db_rotate_left(DBNode node, DBNode *root)
-{
- DBNode y = node->right;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_rotate_left != (unsigned int)~0) stats.db_rotate_left++;
-#endif /* DB_ENABLE_STATS */
- // put the left of y at the right of node
- node->right = y->left;
- if (y->left)
- y->left->parent = node;
- y->parent = node->parent;
- // link y and node's parent
- if (node == *root) {
- *root = y; // node was root
- } else if (node == node->parent->left) {
- node->parent->left = y; // node was at the left
- } else {
- node->parent->right = y; // node was at the right
- }
- // put node at the left of y
- y->left = node;
- node->parent = y;
-}
-
-/**
- * Rotate a node to the right
- * @param node Node to be rotated
- * @param root Pointer to the root of the tree
- * @private
- * @see #db_rebalance(DBNode,DBNode *)
- * @see #db_rebalance_erase(DBNode,DBNode *)
- */
-static void db_rotate_right(DBNode node, DBNode *root)
-{
- DBNode y = node->left;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_rotate_right != (unsigned int)~0) stats.db_rotate_right++;
-#endif /* DB_ENABLE_STATS */
- // put the right of y at the left of node
- node->left = y->right;
- if (y->right != 0)
- y->right->parent = node;
- y->parent = node->parent;
- // link y and node's parent
- if (node == *root) {
- *root = y; // node was root
- } else if (node == node->parent->right) {
- node->parent->right = y; // node was at the right
- } else {
- node->parent->left = y; // node was at the left
- }
- // put node at the right of y
- y->right = node;
- node->parent = y;
-}
-
-/**
- * Rebalance the RED-BLACK tree.
- * Called when the node and it's parent are both RED.
- * @param node Node to be rebalanced
- * @param root Pointer to the root of the tree
- * @private
- * @see #db_rotate_left(DBNode,DBNode *)
- * @see #db_rotate_right(DBNode,DBNode *)
- * @see #db_put(DBInterface,DBKey,void *)
- */
-static void db_rebalance(DBNode node, DBNode *root)
-{
- DBNode y;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_rebalance != (unsigned int)~0) stats.db_rebalance++;
-#endif /* DB_ENABLE_STATS */
- // Restore the RED-BLACK properties
- node->color = RED;
- while (node != *root && node->parent->color == RED) {
- if (node->parent == node->parent->parent->left) {
- // If node's parent is a left, y is node's right 'uncle'
- y = node->parent->parent->right;
- if (y && y->color == RED) { // case 1
- // change the colors and move up the tree
- node->parent->color = BLACK;
- y->color = BLACK;
- node->parent->parent->color = RED;
- node = node->parent->parent;
- } else {
- if (node == node->parent->right) { // case 2
- // move up and rotate
- node = node->parent;
- db_rotate_left(node, root);
- }
- // case 3
- node->parent->color = BLACK;
- node->parent->parent->color = RED;
- db_rotate_right(node->parent->parent, root);
- }
- } else {
- // If node's parent is a right, y is node's left 'uncle'
- y = node->parent->parent->left;
- if (y && y->color == RED) { // case 1
- // change the colors and move up the tree
- node->parent->color = BLACK;
- y->color = BLACK;
- node->parent->parent->color = RED;
- node = node->parent->parent;
- } else {
- if (node == node->parent->left) { // case 2
- // move up and rotate
- node = node->parent;
- db_rotate_right(node, root);
- }
- // case 3
- node->parent->color = BLACK;
- node->parent->parent->color = RED;
- db_rotate_left(node->parent->parent, root);
- }
- }
- }
- (*root)->color = BLACK; // the root can and should always be black
-}
-
-/**
- * Erase a node from the RED-BLACK tree, keeping the tree balanced.
- * @param node Node to be erased from the tree
- * @param root Root of the tree
- * @private
- * @see #db_rotate_left(DBNode,DBNode *)
- * @see #db_rotate_right(DBNode,DBNode *)
- * @see #db_free_unlock(Database)
- */
-static void db_rebalance_erase(DBNode node, DBNode *root)
-{
- DBNode y = node;
- DBNode x = NULL;
- DBNode x_parent = NULL;
- DBNode w;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_rebalance_erase != (unsigned int)~0) stats.db_rebalance_erase++;
-#endif /* DB_ENABLE_STATS */
- // Select where to change the tree
- if (y->left == NULL) { // no left
- x = y->right;
- } else if (y->right == NULL) { // no right
- x = y->left;
- } else { // both exist, go to the leftmost node of the right sub-tree
- y = y->right;
- while (y->left != NULL)
- y = y->left;
- x = y->right;
- }
-
- // Remove the node from the tree
- if (y != node) { // both childs existed
- // put the left of 'node' in the left of 'y'
- node->left->parent = y;
- y->left = node->left;
-
- // 'y' is not the direct child of 'node'
- if (y != node->right) {
- // put 'x' in the old position of 'y'
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- y->parent->left = x;
- // put the right of 'node' in 'y'
- y->right = node->right;
- node->right->parent = y;
- // 'y' is a direct child of 'node'
- } else {
- x_parent = y;
- }
-
- // link 'y' and the parent of 'node'
- if (*root == node) {
- *root = y; // 'node' was the root
- } else if (node->parent->left == node) {
- node->parent->left = y; // 'node' was at the left
- } else {
- node->parent->right = y; // 'node' was at the right
- }
- y->parent = node->parent;
- // switch colors
- {
- int tmp = y->color;
- y->color = node->color;
- node->color = tmp;
- }
- y = node;
- } else { // one child did not exist
- // put x in node's position
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- // link x and node's parent
- if (*root == node) {
- *root = x; // node was the root
- } else if (node->parent->left == node) {
- node->parent->left = x; // node was at the left
- } else {
- node->parent->right = x; // node was at the right
- }
- }
-
- // Restore the RED-BLACK properties
- if (y->color != RED) {
- while (x != *root && (x == NULL || x->color == BLACK)) {
- if (x == x_parent->left) {
- w = x_parent->right;
- if (w->color == RED) {
- w->color = BLACK;
- x_parent->color = RED;
- db_rotate_left(x_parent, root);
- w = x_parent->right;
- }
- if ((w->left == NULL || w->left->color == BLACK) &&
- (w->right == NULL || w->right->color == BLACK)) {
- w->color = RED;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->right == NULL || w->right->color == BLACK) {
- if (w->left) w->left->color = BLACK;
- w->color = RED;
- db_rotate_right(w, root);
- w = x_parent->right;
- }
- w->color = x_parent->color;
- x_parent->color = BLACK;
- if (w->right) w->right->color = BLACK;
- db_rotate_left(x_parent, root);
- break;
- }
- } else {
- w = x_parent->left;
- if (w->color == RED) {
- w->color = BLACK;
- x_parent->color = RED;
- db_rotate_right(x_parent, root);
- w = x_parent->left;
- }
- if ((w->right == NULL || w->right->color == BLACK) &&
- (w->left == NULL || w->left->color == BLACK)) {
- w->color = RED;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->left == NULL || w->left->color == BLACK) {
- if (w->right) w->right->color = BLACK;
- w->color = RED;
- db_rotate_left(w, root);
- w = x_parent->left;
- }
- w->color = x_parent->color;
- x_parent->color = BLACK;
- if (w->left) w->left->color = BLACK;
- db_rotate_right(x_parent, root);
- break;
- }
- }
- }
- if (x) x->color = BLACK;
- }
-}
-
-/**
- * Returns not 0 if the key is considerd to be NULL.
- * @param type Type of database
- * @param key Key being tested
- * @return not 0 if considered NULL, 0 otherwise
- * @private
- * @see common\db.h#DBType
- * @see common\db.h#DBKey
- * @see #db_get(DBInterface,DBKey)
- * @see #db_put(DBInterface,DBKey,void *)
- * @see #db_remove(DBInterface,DBKey)
- */
-static int db_is_key_null(DBType type, DBKey key)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_is_key_null != (unsigned int)~0) stats.db_is_key_null++;
-#endif /* DB_ENABLE_STATS */
- switch (type) {
- case DB_STRING:
- case DB_ISTRING:
- return (key.str == NULL);
-
- default: // Not a pointer
- return 0;
- }
-}
-
-/**
- * Duplicate the key used in the database.
- * @param db Database the key is being used in
- * @param key Key to be duplicated
- * @param Duplicated key
- * @private
- * @see #db_free_add(Database,DBNode,DBNode *)
- * @see #db_free_remove(Database,DBNode)
- * @see #db_put(DBInterface,DBKey,void *)
- * @see #db_dup_key_free(Database,DBKey)
- */
-static DBKey db_dup_key(Database db, DBKey key)
-{
- unsigned char *str;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_dup_key != (unsigned int)~0) stats.db_dup_key++;
-#endif /* DB_ENABLE_STATS */
- switch (db->type) {
- case DB_STRING:
- case DB_ISTRING:
- if (db->maxlen) {
- CREATE(str, unsigned char, db->maxlen +1);
- memcpy(str, key.str, db->maxlen);
- str[db->maxlen] = '\0';
- key.str = str;
- } else {
- key.str = (unsigned char *)aStrdup((const char *)key.str);
- }
- return key;
-
- default:
- return key;
- }
-}
-
-/**
- * Free a key duplicated by db_dup_key.
- * @param db Database the key is being used in
- * @param key Key to be freed
- * @private
- * @see #db_dup_key(Database,DBKey)
- */
-static void db_dup_key_free(Database db, DBKey key)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_dup_key_free != (unsigned int)~0) stats.db_dup_key_free++;
-#endif /* DB_ENABLE_STATS */
- switch (db->type) {
- case DB_STRING:
- case DB_ISTRING:
- aFree(key.str);
- return;
-
- default:
- return;
- }
-}
-
-/**
- * Add a node to the free_list of the database.
- * Marks the node as deleted.
- * If the key isn't duplicated, the key is duplicated and released.
- * @param db Target database
- * @param root Root of the tree from the node
- * @param node Target node
- * @private
- * @see #struct db_free
- * @see Database#free_list
- * @see Database#free_count
- * @see Database#free_max
- * @see #db_remove(DBInterface,DBKey)
- * @see #db_free_remove(Database,DBNode)
- */
-static void db_free_add(Database db, DBNode node, DBNode *root)
-{
- DBKey old_key;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_free_add != (unsigned int)~0) stats.db_free_add++;
-#endif /* DB_ENABLE_STATS */
- if (db->free_lock == (unsigned int)~0) {
- ShowFatalError("db_free_add: free_lock overflow\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- exit(EXIT_FAILURE);
- }
- if (!(db->options&DB_OPT_DUP_KEY)) { // Make shure we have a key until the node is freed
- old_key = node->key;
- node->key = db_dup_key(db, node->key);
- db->release(old_key, node->data, DB_RELEASE_KEY);
- }
- if (db->free_count == db->free_max) { // No more space, expand free_list
- db->free_max = (db->free_max<<2) +3; // = db->free_max*4 +3
- if (db->free_max <= db->free_count) {
- if (db->free_count == (unsigned int)~0) {
- ShowFatalError("db_free_add: free_count overflow\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- exit(EXIT_FAILURE);
- }
- db->free_max = (unsigned int)~0;
- }
- RECREATE(db->free_list, struct db_free, db->free_max);
- }
- node->deleted = 1;
- db->free_list[db->free_count].node = node;
- db->free_list[db->free_count].root = root;
- db->free_count++;
- db->item_count--;
-}
-
-/**
- * Remove a node from the free_list of the database.
- * Marks the node as not deleted.
- * NOTE: Frees the duplicated key of the node.
- * @param db Target database
- * @param node Node being removed from free_list
- * @private
- * @see #struct db_free
- * @see Database#free_list
- * @see Database#free_count
- * @see #db_put(DBInterface,DBKey,void *)
- * @see #db_free_add(Database,DBNode *,DBNode)
- */
-static void db_free_remove(Database db, DBNode node)
-{
- unsigned int i;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_free_remove != (unsigned int)~0) stats.db_free_remove++;
-#endif /* DB_ENABLE_STATS */
- for (i = 0; i < db->free_count; i++) {
- if (db->free_list[i].node == node) {
- if (i < db->free_count -1) // copy the last item to where the removed one was
- memcpy(&db->free_list[i], &db->free_list[db->free_count -1], sizeof(struct db_free));
- db_dup_key_free(db, node->key);
- break;
- }
- }
- node->deleted = 0;
- if (i == db->free_count) {
- ShowWarning("db_free_remove: node was not found - database allocated at %s:%d\n", db->alloc_file, db->alloc_line);
- } else {
- db->free_count--;
- }
- db->item_count++;
-}
-
-/**
- * Increment the free_lock of the database.
- * @param db Target database
- * @private
- * @see Database#free_lock
- * @see #db_unlock(Database)
- */
-static void db_free_lock(Database db)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_free_lock != (unsigned int)~0) stats.db_free_lock++;
-#endif /* DB_ENABLE_STATS */
- if (db->free_lock == (unsigned int)~0) {
- ShowFatalError("db_free_lock: free_lock overflow\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- exit(EXIT_FAILURE);
- }
- db->free_lock++;
-}
-
-/**
- * Decrement the free_lock of the database.
- * If it was the last lock, frees the nodes of the database.
- * Keeps the tree balanced.
- * NOTE: Frees the duplicated keys of the nodes
- * @param db Target database
- * @private
- * @see Database#free_lock
- * @see #db_free_dbn(DBNode)
- * @see #db_lock(Database)
- */
-static void db_free_unlock(Database db)
-{
- unsigned int i;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_free_unlock != (unsigned int)~0) stats.db_free_unlock++;
-#endif /* DB_ENABLE_STATS */
- if (db->free_lock == 0) {
- ShowWarning("db_free_unlock: free_lock was already 0\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- } else {
- db->free_lock--;
- }
- if (db->free_lock)
- return; // Not last lock
-
- for (i = 0; i < db->free_count ; i++) {
- db_rebalance_erase(db->free_list[i].node, db->free_list[i].root);
- db_dup_key_free(db, db->free_list[i].node->key);
-#ifdef DB_ENABLE_STATS
- if (stats.db_node_free != (unsigned int)~0) stats.db_node_free++;
-#endif /* DB_ENABLE_STATS */
- ers_free(db->nodes, db->free_list[i].node);
- }
- db->free_count = 0;
-}
-
-/*****************************************************************************\
- * (3) Section of protected functions used internally. *
- * NOTE: the protected functions used in the database interface are in the *
- * next section. *
- * db_int_cmp - Default comparator for DB_INT databases. *
- * db_uint_cmp - Default comparator for DB_UINT databases. *
- * db_string_cmp - Default comparator for DB_STRING databases. *
- * db_istring_cmp - Default comparator for DB_ISTRING databases. *
- * db_int_hash - Default hasher for DB_INT databases. *
- * db_uint_hash - Default hasher for DB_UINT databases. *
- * db_string_hash - Default hasher for DB_STRING databases. *
- * db_istring_hash - Default hasher for DB_ISTRING databases. *
- * db_release_nothing - Releaser that releases nothing. *
- * db_release_key - Releaser that only releases the key. *
- * db_release_data - Releaser that only releases the data. *
- * db_release_both - Releaser that releases key and data. *
-\*****************************************************************************/
-
-/**
- * Default comparator for DB_INT databases.
- * Compares key1 to key2.
- * Return 0 if equal, negative if lower and positive if higher.
- * <code>maxlen</code> is ignored.
- * @param key1 Key to be compared
- * @param key2 Key being compared to
- * @param maxlen Maximum length of the key to hash
- * @return 0 if equal, negative if lower and positive if higher
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_INT
- * @see common\db.h#DBComparator
- * @see #db_default_cmp(DBType)
- */
-static int db_int_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_int_cmp != (unsigned int)~0) stats.db_int_cmp++;
-#endif /* DB_ENABLE_STATS */
- if (key1.i < key2.i) return -1;
- if (key1.i > key2.i) return 1;
- return 0;
-}
-
-/**
- * Default comparator for DB_UINT databases.
- * Compares key1 to key2.
- * Return 0 if equal, negative if lower and positive if higher.
- * <code>maxlen</code> is ignored.
- * @param key1 Key to be compared
- * @param key2 Key being compared to
- * @param maxlen Maximum length of the key to hash
- * @return 0 if equal, negative if lower and positive if higher
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_UINT
- * @see common\db.h#DBComparator
- * @see #db_default_cmp(DBType)
- */
-static int db_uint_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_uint_cmp != (unsigned int)~0) stats.db_uint_cmp++;
-#endif /* DB_ENABLE_STATS */
- if (key1.ui < key2.ui) return -1;
- if (key1.ui > key2.ui) return 1;
- return 0;
-}
-
-/**
- * Default comparator for DB_STRING databases.
- * Compares key1 to key2.
- * Return 0 if equal, negative if lower and positive if higher.
- * @param key1 Key to be compared
- * @param key2 Key being compared to
- * @param maxlen Maximum length of the key to hash
- * @return 0 if equal, negative if lower and positive if higher
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_STRING
- * @see common\db.h#DBComparator
- * @see #db_default_cmp(DBType)
- */
-static int db_string_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_string_cmp != (unsigned int)~0) stats.db_string_cmp++;
-#endif /* DB_ENABLE_STATS */
- if (maxlen == 0) maxlen = (unsigned short)~0;
- return strncmp((const char *)key1.str, (const char *)key2.str, maxlen);
-}
-
-/**
- * Default comparator for DB_ISTRING databases.
- * Compares key1 to key2 case insensitively.
- * Return 0 if equal, negative if lower and positive if higher.
- * @param key1 Key to be compared
- * @param key2 Key being compared to
- * @param maxlen Maximum length of the key to hash
- * @return 0 if equal, negative if lower and positive if higher
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_ISTRING
- * @see common\db.h#DBComparator
- * @see #db_default_cmp(DBType)
- */
-static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_istring_cmp != (unsigned int)~0) stats.db_istring_cmp++;
-#endif /* DB_ENABLE_STATS */
- if (maxlen == 0) maxlen = (unsigned short)~0;
- return strncasecmp((const char *)key1.str, (const char *)key2.str, maxlen);
-}
-
-/**
- * Default hasher for DB_INT databases.
- * Returns the value of the key as an unsigned int.
- * <code>maxlen</code> is ignored.
- * @param key Key to be hashed
- * @param maxlen Maximum length of the key to hash
- * @return hash of the key
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_INT
- * @see common\db.h#DBHasher
- * @see #db_default_hash(DBType)
- */
-static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_int_hash != (unsigned int)~0) stats.db_int_hash++;
-#endif /* DB_ENABLE_STATS */
- return (unsigned int)key.i;
-}
-
-/**
- * Default hasher for DB_UINT databases.
- * Just returns the value of the key.
- * <code>maxlen</code> is ignored.
- * @param key Key to be hashed
- * @param maxlen Maximum length of the key to hash
- * @return hash of the key
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_UINT
- * @see #db_default_hash(DBType)
- */
-static unsigned int db_uint_hash(DBKey key, unsigned short maxlen)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_uint_hash != (unsigned int)~0) stats.db_uint_hash++;
-#endif /* DB_ENABLE_STATS */
- return key.ui;
-}
-
-/**
- * Default hasher for DB_STRING databases.
- * If maxlen if 0, the maximum number of maxlen is used instead.
- * @param key Key to be hashed
- * @param maxlen Maximum length of the key to hash
- * @return hash of the key
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_STRING
- * @see #db_default_hash(DBType)
- */
-static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
-{
- unsigned char *k = key.str;
- unsigned int hash = 0;
- unsigned short i;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_string_hash != (unsigned int)~0) stats.db_string_hash++;
-#endif /* DB_ENABLE_STATS */
- if (maxlen == 0)
- maxlen = (unsigned short)~0; // Maximum
-
- for (i = 0; *k; i++) {
- hash = (hash*33 + *k++)^(hash>>24);
- if (i == maxlen)
- break;
- }
-
- return hash;
-}
-
-/**
- * Default hasher for DB_ISTRING databases.
- * If maxlen if 0, the maximum number of maxlen is used instead.
- * @param key Key to be hashed
- * @param maxlen Maximum length of the key to hash
- * @return hash of the key
- * @see common\db.h#DBKey
- * @see common\db.h\DBType#DB_ISTRING
- * @see #db_default_hash(DBType)
- */
-static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
-{
- unsigned char *k = key.str;
- unsigned int hash = 0;
- unsigned short i;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_istring_hash != (unsigned int)~0) stats.db_istring_hash++;
-#endif /* DB_ENABLE_STATS */
- if (maxlen == 0)
- maxlen = (unsigned short)~0; // Maximum
-
- for (i = 0; *k; i++) {
- hash = (hash*33 + LOWER(*k))^(hash>>24);
- k++;
- if (i == maxlen)
- break;
- }
-
- return hash;
-}
-
-/**
- * Releaser that releases nothing.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param which What is being requested to be released
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
- * @see #db_default_releaser(DBType,DBOptions)
- */
-static void db_release_nothing(DBKey key, void *data, DBRelease which)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_release_nothing != (unsigned int)~0) stats.db_release_nothing++;
-#endif /* DB_ENABLE_STATS */
-}
-
-/**
- * Releaser that only releases the key.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param which What is being requested to be released
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
- * @see #db_default_release(DBType,DBOptions)
- */
-static void db_release_key(DBKey key, void *data, DBRelease which)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_release_key != (unsigned int)~0) stats.db_release_key++;
-#endif /* DB_ENABLE_STATS */
- if (which&DB_RELEASE_KEY) aFree(key.str); // needs to be a pointer
-}
-
-/**
- * Releaser that only releases the data.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param which What is being requested to be released
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
- * @see #db_default_release(DBType,DBOptions)
- */
-static void db_release_data(DBKey key, void *data, DBRelease which)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_release_data != (unsigned int)~0) stats.db_release_data++;
-#endif /* DB_ENABLE_STATS */
- if (which&DB_RELEASE_DATA) aFree(data);
-}
-
-/**
- * Releaser that releases both key and data.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param which What is being requested to be released
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
- * @see #db_default_release(DBType,DBOptions)
- */
-static void db_release_both(DBKey key, void *data, DBRelease which)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_release_both != (unsigned int)~0) stats.db_release_both++;
-#endif /* DB_ENABLE_STATS */
- if (which&DB_RELEASE_KEY) aFree(key.str); // needs to be a pointer
- if (which&DB_RELEASE_DATA) aFree(data);
-}
-
-/*****************************************************************************\
- * (4) Section with protected functions used in the interface of the *
- * database. *
- * db_obj_get - Get the data identified by the key. *
- * db_obj_vgetall - Get the data of the matched entries. *
- * db_obj_getall - Get the data of the matched entries. *
- * db_obj_vensure - Get the data identified by the key, creating if it *
- * doesn't exist yet. *
- * db_obj_ensure - Get the data identified by the key, creating if it *
- * doesn't exist yet. *
- * db_obj_put - Put data identified by the key in the database. *
- * db_obj_remove - Remove an entry from the database. *
- * db_obj_vforeach - Apply a function to every entry in the database. *
- * db_obj_foreach - Apply a function to every entry in the database. *
- * db_obj_vclear - Remove all entries from the database. *
- * db_obj_clear - Remove all entries from the database. *
- * db_obj_vdestroy - Destroy the database, freeing all the used memory. *
- * db_obj_destroy - Destroy the database, freeing all the used memory. *
- * db_obj_size - Return the size of the database. *
- * db_obj_type - Return the type of the database. *
- * db_obj_options - Return the options of the database. *
-\*****************************************************************************/
-
-/**
- * Get the data of the entry identifid by the key.
- * @param self Interface of the database
- * @param key Key that identifies the entry
- * @return Data of the entry or NULL if not found
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#get(DBInterface,DBKey)
- */
-static void *db_obj_get(DBInterface self, DBKey key)
-{
- Database db = (Database)self;
- DBNode node;
- int c;
- void *data = NULL;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_get != (unsigned int)~0) stats.db_get++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return NULL; // nullpo candidate
- if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
- ShowError("db_get: Attempted to retrieve non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
-
- db_free_lock(db);
- node = db->ht[db->hash(key, db->maxlen)%HASH_SIZE];
- while (node) {
- c = db->cmp(key, node->key, db->maxlen);
- if (c == 0) {
- data = node->data;
- break;
- }
- if (c < 0)
- node = node->left;
- else
- node = node->right;
- }
- db_free_unlock(db);
- return data;
-}
-
-/**
- * Get the data of the entries matched by <code>match</code>.
- * It puts a maximum of <code>max</code> entries into <code>buf</code>.
- * If <code>buf</code> is NULL, it only counts the matches.
- * Returns the number of entries that matched.
- * NOTE: if the value returned is greater than <code>max</code>, only the
- * first <code>max</code> entries found are put into the buffer.
- * @param self Interface of the database
- * @param buf Buffer to put the data of the matched entries
- * @param max Maximum number of data entries to be put into buf
- * @param match Function that matches the database entries
- * @param ... Extra arguments for match
- * @return The number of entries that matched
- * @protected
- * @see common\db.h#DBInterface
- * @see common\db.h#DBMatcher(DBKey key, void *data, va_list args)
- * @see common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
- */
-static unsigned int db_obj_vgetall(DBInterface self, void **buf, unsigned int max, DBMatcher match, va_list args)
-{
- Database db = (Database)self;
- unsigned int i;
- DBNode node;
- DBNode parent;
- unsigned int ret = 0;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_vgetall != (unsigned int)~0) stats.db_vgetall++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return 0; // nullpo candidate
- if (match == NULL) return 0; // nullpo candidate
-
- db_free_lock(db);
- for (i = 0; i < HASH_SIZE; i++) {
- // Match in the order: current node, left tree, right tree
- node = db->ht[i];
- while (node) {
- parent = node->parent;
- if (!(node->deleted) && match(node->key, node->data, args) == 0) {
- if (buf && ret < max)
- buf[ret] = node->data;
- ret++;
- }
- if (node->left) {
- node = node->left;
- continue;
- }
- if (node->right) {
- node = node->right;
- continue;
- }
- while (node) {
- parent = node->parent;
- if (parent && parent->right && parent->left == node) {
- node = parent->right;
- break;
- }
- node = parent;
- }
- }
- }
- db_free_unlock(db);
- return ret;
-}
-
-/**
- * Just calls {@link common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)}.
- * Get the data of the entries matched by <code>match</code>.
- * It puts a maximum of <code>max</code> entries into <code>buf</code>.
- * If <code>buf</code> is NULL, it only counts the matches.
- * Returns the number of entries that matched.
- * NOTE: if the value returned is greater than <code>max</code>, only the
- * first <code>max</code> entries found are put into the buffer.
- * @param self Interface of the database
- * @param buf Buffer to put the data of the matched entries
- * @param max Maximum number of data entries to be put into buf
- * @param match Function that matches the database entries
- * @param ... Extra arguments for match
- * @return The number of entries that matched
- * @protected
- * @see common\db.h#DBMatcher(DBKey key, void *data, va_list args)
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
- * @see common\db.h\DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
- */
-static unsigned int db_obj_getall(DBInterface self, void **buf, unsigned int max, DBMatcher match, ...)
-{
- va_list args;
- unsigned int ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_getall != (unsigned int)~0) stats.db_getall++;
-#endif /* DB_ENABLE_STATS */
- if (self == NULL) return 0; // nullpo candidate
-
- va_start(args, match);
- ret = self->vgetall(self, buf, max, match, args);
- va_end(args);
- return ret;
-}
-
-/**
- * Get the data of the entry identified by the key.
- * If the entry does not exist, an entry is added with the data returned by
- * <code>create</code>.
- * @param self Interface of the database
- * @param key Key that identifies the entry
- * @param create Function used to create the data if the entry doesn't exist
- * @param args Extra arguments for create
- * @return Data of the entry
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBCreateData
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
- */
-static void *db_obj_vensure(DBInterface self, DBKey key, DBCreateData create, va_list args)
-{
- Database db = (Database)self;
- DBNode node;
- DBNode parent = NULL;
- unsigned int hash;
- int c = 0;
- void *data = NULL;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_vensure != (unsigned int)~0) stats.db_vensure++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return NULL; // nullpo candidate
- if (create == NULL) {
- ShowError("db_ensure: Create function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
- if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
- ShowError("db_ensure: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
-
- db_free_lock(db);
- hash = db->hash(key, db->maxlen)%HASH_SIZE;
- node = db->ht[hash];
- while (node) {
- c = db->cmp(key, node->key, db->maxlen);
- if (c == 0) {
- break;
- }
- parent = node;
- if (c < 0)
- node = node->left;
- else
- node = node->right;
- }
- // Create node if necessary
- if (node == NULL) {
- if (db->item_count == (unsigned int)~0) {
- ShowError("db_vensure: item_count overflow, aborting item insertion.\n"
- "Database allocated at %s:%d",
- db->alloc_file, db->alloc_line);
- return NULL;
- }
-#ifdef DB_ENABLE_STATS
- if (stats.db_node_alloc != (unsigned int)~0) stats.db_node_alloc++;
-#endif /* DB_ENABLE_STATS */
- node = ers_alloc(db->nodes, struct dbn);
- node->left = NULL;
- node->right = NULL;
- node->deleted = 0;
- db->item_count++;
- if (c == 0) { // hash entry is empty
- node->color = BLACK;
- node->parent = NULL;
- db->ht[hash] = node;
- } else {
- node->color = RED;
- if (c < 0) { // put at the left
- parent->left = node;
- node->parent = parent;
- } else { // put at the right
- parent->right = node;
- node->parent = parent;
- }
- if (parent->color == RED) // two consecutive RED nodes, must rebalance
- db_rebalance(node, &db->ht[hash]);
- }
- // put key and data in the node
- if (db->options&DB_OPT_DUP_KEY) {
- node->key = db_dup_key(db, key);
- if (db->options&DB_OPT_RELEASE_KEY)
- db->release(key, data, DB_RELEASE_KEY);
- } else {
- node->key = key;
- }
- node->data = create(key, args);
- }
- data = node->data;
- db_free_unlock(db);
- return data;
-}
-
-/**
- * Just calls {@link common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)}.
- * Get the data of the entry identified by the key.
- * If the entry does not exist, an entry is added with the data returned by
- * <code>create</code>.
- * @param self Interface of the database
- * @param key Key that identifies the entry
- * @param create Function used to create the data if the entry doesn't exist
- * @param ... Extra arguments for create
- * @return Data of the entry
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBCreateData
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
- * @see common\db.h\DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
- */
-static void *db_obj_ensure(DBInterface self, DBKey key, DBCreateData create, ...)
-{
- va_list args;
- void *ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_ensure != (unsigned int)~0) stats.db_ensure++;
-#endif /* DB_ENABLE_STATS */
- if (self == NULL) return 0; // nullpo candidate
-
- va_start(args, create);
- ret = self->vensure(self, key, create, args);
- va_end(args);
- return ret;
-}
-
-/**
- * Put the data identified by the key in the database.
- * Returns the previous data if the entry exists or NULL.
- * NOTE: Uses the new key, the old one is released.
- * @param self Interface of the database
- * @param key Key that identifies the data
- * @param data Data to be put in the database
- * @return The previous data if the entry exists or NULL
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBInterface
- * @see #db_malloc_dbn(void)
- * @see common\db.h\DBInterface#put(DBInterface,DBKey,void *)
- */
-static void *db_obj_put(DBInterface self, DBKey key, void *data)
-{
- Database db = (Database)self;
- DBNode node;
- DBNode parent = NULL;
- int c = 0;
- unsigned int hash;
- void *old_data = NULL;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_put != (unsigned int)~0) stats.db_put++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return NULL; // nullpo candidate
- if (db->global_lock) {
- ShowError("db_put: Database is being destroyed, aborting entry insertion.\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
- if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
- ShowError("db_put: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
- if (!(data || db->options&DB_OPT_ALLOW_NULL_DATA)) {
- ShowError("db_put: Attempted to use non-allowed NULL data for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
-
- if (db->item_count == (unsigned int)~0) {
- ShowError("db_put: item_count overflow, aborting item insertion.\n"
- "Database allocated at %s:%d",
- db->alloc_file, db->alloc_line);
- return NULL;
- }
- // search for an equal node
- db_free_lock(db);
- hash = db->hash(key, db->maxlen)%HASH_SIZE;
- for (node = db->ht[hash]; node; ) {
- c = db->cmp(key, node->key, db->maxlen);
- if (c == 0) { // equal entry, replace
- if (node->deleted) {
- db_free_remove(db, node);
- } else {
- db->release(node->key, node->data, DB_RELEASE_BOTH);
- }
- old_data = node->data;
- break;
- }
- parent = node;
- if (c < 0) {
- node = node->left;
- } else {
- node = node->right;
- }
- }
- // allocate a new node if necessary
- if (node == NULL) {
-#ifdef DB_ENABLE_STATS
- if (stats.db_node_alloc != (unsigned int)~0) stats.db_node_alloc++;
-#endif /* DB_ENABLE_STATS */
- node = ers_alloc(db->nodes, struct dbn);
- node->left = NULL;
- node->right = NULL;
- node->deleted = 0;
- db->item_count++;
- if (c == 0) { // hash entry is empty
- node->color = BLACK;
- node->parent = NULL;
- db->ht[hash] = node;
- } else {
- node->color = RED;
- if (c < 0) { // put at the left
- parent->left = node;
- node->parent = parent;
- } else { // put at the right
- parent->right = node;
- node->parent = parent;
- }
- if (parent->color == RED) // two consecutive RED nodes, must rebalance
- db_rebalance(node, &db->ht[hash]);
- }
- }
- // put key and data in the node
- if (db->options&DB_OPT_DUP_KEY) {
- node->key = db_dup_key(db, key);
- if (db->options&DB_OPT_RELEASE_KEY)
- db->release(key, data, DB_RELEASE_KEY);
- } else {
- node->key = key;
- }
- node->data = data;
- db_free_unlock(db);
- return old_data;
-}
-
-/**
- * Remove an entry from the database.
- * Returns the data of the entry.
- * NOTE: The key (of the database) is released in {@link #db_free_add(Database,DBNode,DBNode *)}.
- * @param self Interface of the database
- * @param key Key that identifies the entry
- * @return The data of the entry or NULL if not found
- * @protected
- * @see common\db.h#DBKey
- * @see common\db.h#DBInterface
- * @see #db_free_add(Database,DBNode,DBNode *)
- * @see common\db.h\DBInterface#remove(DBInterface,DBKey)
- */
-static void *db_obj_remove(DBInterface self, DBKey key)
-{
- Database db = (Database)self;
- void *data = NULL;
- DBNode node;
- unsigned int hash;
- int c = 0;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_remove != (unsigned int)~0) stats.db_remove++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return NULL; // nullpo candidate
- if (db->global_lock) {
- ShowError("db_remove: Database is being destroyed. Aborting entry deletion.\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
- if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
- ShowError("db_remove: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return NULL; // nullpo candidate
- }
-
- db_free_lock(db);
- hash = db->hash(key, db->maxlen)%HASH_SIZE;
- for(node = db->ht[hash]; node; ){
- c = db->cmp(key, node->key, db->maxlen);
- if (c == 0) {
- if (!(node->deleted)) {
- data = node->data;
- db->release(node->key, node->data, DB_RELEASE_DATA);
- db_free_add(db, node, &db->ht[hash]);
- }
- break;
- }
- if (c < 0)
- node = node->left;
- else
- node = node->right;
- }
- db_free_unlock(db);
- return data;
-}
-
-/**
- * Apply <code>func</code> to every entry in the database.
- * Returns the sum of values returned by func.
- * @param self Interface of the database
- * @param func Function to be applyed
- * @param args Extra arguments for func
- * @return Sum of the values returned by func
- * @protected
- * @see common\db.h#DBInterface
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)
- */
-static int db_obj_vforeach(DBInterface self, DBApply func, va_list args)
-{
- Database db = (Database)self;
- unsigned int i;
- int sum = 0;
- DBNode node;
- DBNode parent;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_vforeach != (unsigned int)~0) stats.db_vforeach++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return 0; // nullpo candidate
- if (func == NULL) {
- ShowError("db_foreach: Passed function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
- return 0; // nullpo candidate
- }
-
- db_free_lock(db);
- for (i = 0; i < HASH_SIZE; i++) {
- // Apply func in the order: current node, left node, right node
- node = db->ht[i];
- while (node) {
- parent = node->parent;
- if (!(node->deleted))
- sum += func(node->key, node->data, args);
- if (node->left) {
- node = node->left;
- continue;
- }
- if (node->right) {
- node = node->right;
- continue;
- }
- while (node) {
- parent = node->parent;
- if (parent && parent->right && parent->left == node) {
- node = parent->right;
- break;
- }
- node = parent;
- }
- }
- }
- db_free_unlock(db);
- return sum;
-}
-
-/**
- * Just calls {@link common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)}.
- * Apply <code>func</code> to every entry in the database.
- * Returns the sum of values returned by func.
- * @param self Interface of the database
- * @param func Function to be applyed
- * @param ... Extra arguments for func
- * @return Sum of the values returned by func
- * @protected
- * @see common\db.h#DBInterface
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)
- * @see common\db.h\DBInterface#foreach(DBInterface,DBApply,...)
- */
-static int db_obj_foreach(DBInterface self, DBApply func, ...)
-{
- va_list args;
- int ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_foreach != (unsigned int)~0) stats.db_foreach++;
-#endif /* DB_ENABLE_STATS */
- if (self == NULL) return 0; // nullpo candidate
-
- va_start(args, func);
- ret = self->vforeach(self, func, args);
- va_end(args);
- return ret;
-}
-
-/**
- * Removes all entries from the database.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * @param self Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param args Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)
- */
-static int db_obj_vclear(DBInterface self, DBApply func, va_list args)
-{
- Database db = (Database)self;
- int sum = 0;
- unsigned int i;
- DBNode node;
- DBNode parent;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_vclear != (unsigned int)~0) stats.db_vclear++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return 0; // nullpo candidate
-
- db_free_lock(db);
- for (i = 0; i < HASH_SIZE; i++) {
- // Apply the func and delete in the order: left tree, right tree, current node
- node = db->ht[i];
- db->ht[i] = NULL;
- while (node) {
- parent = node->parent;
- if (node->left) {
- node = node->left;
- continue;
- }
- if (node->right) {
- node = node->right;
- continue;
- }
- if (node->deleted) {
- db_dup_key_free(db, node->key);
- } else {
- if (func)
- sum += func(node->key, node->data, args);
- db->release(node->key, node->data, DB_RELEASE_BOTH);
- node->deleted = 1;
- }
-#ifdef DB_ENABLE_STATS
- if (stats.db_node_free != (unsigned int)~0) stats.db_node_free++;
-#endif /* DB_ENABLE_STATS */
- ers_free(db->nodes, node);
- if (parent) {
- if (parent->left == node)
- parent->left = NULL;
- else
- parent->right = NULL;
- }
- node = parent;
- }
- db->ht[i] = NULL;
- }
- db->free_count = 0;
- db->item_count = 0;
- db_free_unlock(db);
- return sum;
-}
-
-/**
- * Just calls {@link common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)}.
- * Removes all entries from the database.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * NOTE: This locks the database globally. Any attempt to insert or remove
- * a database entry will give an error and be aborted (except for clearing).
- * @param self Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param ... Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)
- * @see common\db.h\DBInterface#clear(DBInterface,DBApply,...)
- */
-static int db_obj_clear(DBInterface self, DBApply func, ...)
-{
- va_list args;
- int ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_clear != (unsigned int)~0) stats.db_clear++;
-#endif /* DB_ENABLE_STATS */
- if (self == NULL) return 0; // nullpo candidate
-
- va_start(args, func);
- ret = self->vclear(self, func, args);
- va_end(args);
- return ret;
-}
-
-/**
- * Finalize the database, feeing all the memory it uses.
- * Before deleting an entry, func is applyed to it.
- * Returns the sum of values returned by func, if it exists.
- * NOTE: This locks the database globally. Any attempt to insert or remove
- * a database entry will give an error and be aborted (except for clearing).
- * @param self Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param args Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vdestroy(DBInterface,DBApply,va_list)
- */
-static int db_obj_vdestroy(DBInterface self, DBApply func, va_list args)
-{
- Database db = (Database)self;
- int sum;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_vdestroy != (unsigned int)~0) stats.db_vdestroy++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return 0; // nullpo candidate
- if (db->global_lock) {
- ShowError("db_vdestroy: Database is already locked for destruction. Aborting second database destruction.\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line);
- return 0;
- }
- if (db->free_lock)
- ShowWarning("db_vdestroy: Database is still in use, %u lock(s) left. Continuing database destruction.\n"
- "Database allocated at %s:%d\n",
- db->alloc_file, db->alloc_line, db->free_lock);
-
-#ifdef DB_ENABLE_STATS
- switch (db->type) {
- case DB_INT:
- stats.db_int_destroy++;
- break;
- case DB_UINT:
- stats.db_uint_destroy++;
- break;
- case DB_STRING:
- stats.db_string_destroy++;
- break;
- case DB_ISTRING:
- stats.db_istring_destroy++;
- break;
- }
-#endif /* DB_ENABLE_STATS */
- db_free_lock(db);
- db->global_lock = 1;
- sum = self->vclear(self, func, args);
- aFree(db->free_list);
- db->free_list = NULL;
- db->free_max = 0;
- ers_destroy(db->nodes);
- db_free_unlock(db);
- aFree(db);
- return sum;
-}
-
-/**
- * Just calls {@link common\db.h\DBInterface#db_vdestroy(DBInterface,DBApply,va_list)}.
- * Finalize the database, feeing all the memory it uses.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * NOTE: This locks the database globally. Any attempt to insert or remove
- * a database entry will give an error and be aborted.
- * @param self Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param ... Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see common\db.h#DBApply(DBKey,void *,va_list)
- * @see common\db.h#DBInterface
- * @see common\db.h\DBInterface#vdestroy(DBInterface,DBApply,va_list)
- * @see common\db.h\DBInterface#destroy(DBInterface,DBApply,...)
- */
-static int db_obj_destroy(DBInterface self, DBApply func, ...)
-{
- va_list args;
- int ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_destroy != (unsigned int)~0) stats.db_destroy++;
-#endif /* DB_ENABLE_STATS */
- if (self == NULL) return 0; // nullpo candidate
-
- va_start(args, func);
- ret = self->vdestroy(self, func, args);
- va_end(args);
- return ret;
-}
-
-/**
- * Return the size of the database (number of items in the database).
- * @param self Interface of the database
- * @return Size of the database
- * @protected
- * @see common\db.h#DBInterface
- * @see Database#item_count
- * @see common\db.h\DBInterface#size(DBInterface)
- */
-static unsigned int db_obj_size(DBInterface self)
-{
- Database db = (Database)self;
- unsigned int item_count;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_size != (unsigned int)~0) stats.db_size++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return 0; // nullpo candidate
-
- db_free_lock(db);
- item_count = db->item_count;
- db_free_unlock(db);
-
- return item_count;
-}
-
-/**
- * Return the type of database.
- * @param self Interface of the database
- * @return Type of the database
- * @protected
- * @see common\db.h#DBType
- * @see common\db.h#DBInterface
- * @see Database#type
- * @see common\db.h\DBInterface#type(DBInterface)
- */
-static DBType db_obj_type(DBInterface self)
-{
- Database db = (Database)self;
- DBType type;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_type != (unsigned int)~0) stats.db_type++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return -1; // nullpo candidate - TODO what should this return?
-
- db_free_lock(db);
- type = db->type;
- db_free_unlock(db);
-
- return type;
-}
-
-/**
- * Return the options of the database.
- * @param self Interface of the database
- * @return Options of the database
- * @protected
- * @see common\db.h#DBOptions
- * @see common\db.h#DBInterface
- * @see Database#options
- * @see common\db.h\DBInterface#options(DBInterface)
- */
-static DBOptions db_obj_options(DBInterface self)
-{
- Database db = (Database)self;
- DBOptions options;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_options != (unsigned int)~0) stats.db_options++;
-#endif /* DB_ENABLE_STATS */
- if (db == NULL) return DB_OPT_BASE; // nullpo candidate - TODO what should this return?
-
- db_free_lock(db);
- options = db->options;
- db_free_unlock(db);
-
- return options;
-}
-
-/*****************************************************************************\
- * (5) Section with public functions. *
- * db_fix_options - Apply database type restrictions to the options. *
- * db_default_cmp - Get the default comparator for a type of database. *
- * db_default_hash - Get the default hasher for a type of database. *
- * db_default_release - Get the default releaser for a type of database *
- * with the specified options. *
- * db_custom_release - Get a releaser that behaves a certains way. *
- * db_alloc - Allocate a new database. *
- * db_i2key - Manual cast from 'int' to 'DBKey'. *
- * db_ui2key - Manual cast from 'unsigned int' to 'DBKey'. *
- * db_str2key - Manual cast from 'unsigned char *' to 'DBKey'. *
- * db_init - Initialize the database system. *
- * db_final - Finalize the database system. *
-\*****************************************************************************/
-
-/**
- * Returns the fixed options according to the database type.
- * Sets required options and unsets unsupported options.
- * For numeric databases DB_OPT_DUP_KEY and DB_OPT_RELEASE_KEY are unset.
- * @param type Type of the database
- * @param options Original options of the database
- * @return Fixed options of the database
- * @private
- * @see common\db.h#DBType
- * @see common\db.h#DBOptions
- * @see #db_default_release(DBType,DBOptions)
- * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
- * @see common\db.h#db_fix_options(DBType,DBOptions)
- */
-DBOptions db_fix_options(DBType type, DBOptions options)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_fix_options != (unsigned int)~0) stats.db_fix_options++;
-#endif /* DB_ENABLE_STATS */
- switch (type) {
- case DB_INT:
- case DB_UINT: // Numeric database, do nothing with the keys
- return options&~(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY);
-
- default:
- ShowError("db_fix_options: Unknown database type %u with options %x\n", type, options);
- case DB_STRING:
- case DB_ISTRING: // String databases, no fix required
- return options;
- }
-}
-
-/**
- * Returns the default comparator for the specified type of database.
- * @param type Type of database
- * @return Comparator for the type of database or NULL if unknown database
- * @public
- * @see common\db.h#DBType
- * @see #db_int_cmp(DBKey,DBKey,unsigned short)
- * @see #db_uint_cmp(DBKey,DBKey,unsigned short)
- * @see #db_string_cmp(DBKey,DBKey,unsigned short)
- * @see #db_istring_cmp(DBKey,DBKey,unsigned short)
- * @see common\db.h#db_default_cmp(DBType)
- */
-DBComparator db_default_cmp(DBType type)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_default_cmp != (unsigned int)~0) stats.db_default_cmp++;
-#endif /* DB_ENABLE_STATS */
- switch (type) {
- case DB_INT: return db_int_cmp;
- case DB_UINT: return db_uint_cmp;
- case DB_STRING: return db_string_cmp;
- case DB_ISTRING: return db_istring_cmp;
- default:
- ShowError("db_default_cmp: Unknown database type %u\n", type);
- return NULL;
- }
-}
-
-/**
- * Returns the default hasher for the specified type of database.
- * @param type Type of database
- * @return Hasher of the type of database or NULL if unknown database
- * @public
- * @see common\db.h#DBType
- * @see #db_int_hash(DBKey,unsigned short)
- * @see #db_uint_hash(DBKey,unsigned short)
- * @see #db_string_hash(DBKey,unsigned short)
- * @see #db_istring_hash(DBKey,unsigned short)
- * @see common\db.h#db_default_hash(DBType)
- */
-DBHasher db_default_hash(DBType type)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_default_hash != (unsigned int)~0) stats.db_default_hash++;
-#endif /* DB_ENABLE_STATS */
- switch (type) {
- case DB_INT: return db_int_hash;
- case DB_UINT: return db_uint_hash;
- case DB_STRING: return db_string_hash;
- case DB_ISTRING: return db_istring_hash;
- default:
- ShowError("db_default_hash: Unknown database type %u\n", type);
- return NULL;
- }
-}
-
-/**
- * Returns the default releaser for the specified type of database with the
- * specified options.
- * NOTE: the options are fixed with {@link #db_fix_options(DBType,DBOptions)}
- * before choosing the releaser.
- * @param type Type of database
- * @param options Options of the database
- * @return Default releaser for the type of database with the specified options
- * @public
- * @see common\db.h#DBType
- * @see common\db.h#DBOptions
- * @see common\db.h#DBReleaser
- * @see #db_release_nothing(DBKey,void *,DBRelease)
- * @see #db_release_key(DBKey,void *,DBRelease)
- * @see #db_release_data(DBKey,void *,DBRelease)
- * @see #db_release_both(DBKey,void *,DBRelease)
- * @see #db_custom_release(DBRelease)
- * @see common\db.h#db_default_release(DBType,DBOptions)
- */
-DBReleaser db_default_release(DBType type, DBOptions options)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_default_release != (unsigned int)~0) stats.db_default_release++;
-#endif /* DB_ENABLE_STATS */
- options = db_fix_options(type, options);
- if (options&DB_OPT_RELEASE_DATA) { // Release data, what about the key?
- if (options&(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY))
- return db_release_both; // Release both key and data
- return db_release_data; // Only release data
- }
- if (options&(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY))
- return db_release_key; // Only release key
- return db_release_nothing; // Release nothing
-}
-
-/**
- * Returns the releaser that releases the specified release options.
- * @param which Options that specified what the releaser releases
- * @return Releaser for the specified release options
- * @public
- * @see common\db.h#DBRelease
- * @see common\db.h#DBReleaser
- * @see #db_release_nothing(DBKey,void *,DBRelease)
- * @see #db_release_key(DBKey,void *,DBRelease)
- * @see #db_release_data(DBKey,void *,DBRelease)
- * @see #db_release_both(DBKey,void *,DBRelease)
- * @see #db_default_release(DBType,DBOptions)
- * @see common\db.h#db_custom_release(DBRelease)
- */
-DBReleaser db_custom_release(DBRelease which)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_custom_release != (unsigned int)~0) stats.db_custom_release++;
-#endif /* DB_ENABLE_STATS */
- switch (which) {
- case DB_RELEASE_NOTHING: return db_release_nothing;
- case DB_RELEASE_KEY: return db_release_key;
- case DB_RELEASE_DATA: return db_release_data;
- case DB_RELEASE_BOTH: return db_release_both;
- default:
- ShowError("db_custom_release: Unknown release options %u\n", which);
- return NULL;
- }
-}
-
-/**
- * Allocate a new database of the specified type.
- * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
- * before creating the database.
- * @param file File where the database is being allocated
- * @param line Line of the file where the database is being allocated
- * @param type Type of database
- * @param options Options of the database
- * @param maxlen Maximum length of the string to be used as key in string
- * databases
- * @return The interface of the database
- * @public
- * @see common\db.h#DBType
- * @see common\db.h#DBInterface
- * @see #Database
- * @see #db_fix_options(DBType,DBOptions)
- * @see common\db.h#db_alloc(const char *,int,DBType,unsigned short)
- */
-DBInterface db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen)
-{
- Database db;
- unsigned int i;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_alloc != (unsigned int)~0) stats.db_alloc++;
- switch (type) {
- case DB_INT:
- stats.db_int_alloc++;
- break;
- case DB_UINT:
- stats.db_uint_alloc++;
- break;
- case DB_STRING:
- stats.db_string_alloc++;
- break;
- case DB_ISTRING:
- stats.db_istring_alloc++;
- break;
- }
-#endif /* DB_ENABLE_STATS */
- CREATE(db, struct db, 1);
-
- options = db_fix_options(type, options);
- /* Interface of the database */
- db->dbi.get = db_obj_get;
- db->dbi.getall = db_obj_getall;
- db->dbi.vgetall = db_obj_vgetall;
- db->dbi.ensure = db_obj_ensure;
- db->dbi.vensure = db_obj_vensure;
- db->dbi.put = db_obj_put;
- db->dbi.remove = db_obj_remove;
- db->dbi.foreach = db_obj_foreach;
- db->dbi.vforeach = db_obj_vforeach;
- db->dbi.clear = db_obj_clear;
- db->dbi.vclear = db_obj_vclear;
- db->dbi.destroy = db_obj_destroy;
- db->dbi.vdestroy = db_obj_vdestroy;
- db->dbi.size = db_obj_size;
- db->dbi.type = db_obj_type;
- db->dbi.options = db_obj_options;
- /* File and line of allocation */
- db->alloc_file = file;
- db->alloc_line = line;
- /* Lock system */
- db->free_list = NULL;
- db->free_count = 0;
- db->free_max = 0;
- db->free_lock = 0;
- /* Other */
- db->nodes = ers_new((uint32)sizeof(struct dbn));
- db->cmp = db_default_cmp(type);
- db->hash = db_default_hash(type);
- db->release = db_default_release(type, options);
- for (i = 0; i < HASH_SIZE; i++)
- db->ht[i] = NULL;
- db->type = type;
- db->options = options;
- db->item_count = 0;
- db->maxlen = maxlen;
- db->global_lock = 0;
-
- return &db->dbi;
-}
-
-#ifdef DB_MANUAL_CAST_TO_UNION
-/**
- * Manual cast from 'int' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see common\db.h#DB_MANUAL_CAST_TO_UNION
- * @see #db_ui2key(unsigned int)
- * @see #db_str2key(unsigned char *)
- * @see common\db.h#db_i2key(int)
- */
-DBKey db_i2key(int key)
-{
- DBKey ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_i2key != (unsigned int)~0) stats.db_i2key++;
-#endif /* DB_ENABLE_STATS */
- ret.i = key;
- return ret;
-}
-
-/**
- * Manual cast from 'unsigned int' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see common\db.h#DB_MANUAL_CAST_TO_UNION
- * @see #db_i2key(int)
- * @see #db_str2key(unsigned char *)
- * @see common\db.h#db_ui2key(unsigned int)
- */
-DBKey db_ui2key(unsigned int key)
-{
- DBKey ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_ui2key != (unsigned int)~0) stats.db_ui2key++;
-#endif /* DB_ENABLE_STATS */
- ret.ui = key;
- return ret;
-}
-
-/**
- * Manual cast from 'unsigned char *' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see common\db.h#DB_MANUAL_CAST_TO_UNION
- * @see #db_i2key(int)
- * @see #db_ui2key(unsigned int)
- * @see common\db.h#db_str2key(unsigned char *)
- */
-DBKey db_str2key(unsigned char *key)
-{
- DBKey ret;
-
-#ifdef DB_ENABLE_STATS
- if (stats.db_str2key != (unsigned int)~0) stats.db_str2key++;
-#endif /* DB_ENABLE_STATS */
- ret.str = key;
- return ret;
-}
-#endif /* DB_MANUAL_CAST_TO_UNION */
-
-/**
- * Initialize the database system.
- * @public
- * @see #db_final(void)
- * @see common\db.h#db_init(void)
- */
-void db_init(void)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_init != (unsigned int)~0) stats.db_init++;
-#endif /* DB_ENABLE_STATS */
-}
-
-/**
- * Finalize the database system.
- * Frees the memory used by the block reusage system.
- * @public
- * @see common\db.h#DB_FINAL_NODE_CHECK
- * @see #db_init(void)
- * @see common\db.h#db_final(void)
- */
-void db_final(void)
-{
-#ifdef DB_ENABLE_STATS
- if (stats.db_final != (unsigned int)~0)
- stats.db_final++;
- ShowInfo(CL_WHITE"Database nodes"CL_RESET":\n"
- "allocated %u, freed %u\n",
- stats.db_node_alloc, stats.db_node_free);
- ShowInfo(CL_WHITE"Database types"CL_RESET":\n"
- "DB_INT : allocated %10u, destroyed %10u\n"
- "DB_UINT : allocated %10u, destroyed %10u\n"
- "DB_STRING : allocated %10u, destroyed %10u\n"
- "DB_ISTRING : allocated %10u, destroyed %10u\n",
- stats.db_int_alloc, stats.db_int_destroy,
- stats.db_uint_alloc, stats.db_uint_destroy,
- stats.db_string_alloc, stats.db_string_destroy,
- stats.db_istring_alloc, stats.db_istring_destroy);
- ShowInfo(CL_WHITE"Database function counters"CL_RESET":\n"
- "db_rotate_left %10u, db_rotate_right %10u,\n"
- "db_rebalance %10u, db_rebalance_erase %10u,\n"
- "db_is_key_null %10u,\n"
- "db_dup_key %10u, db_dup_key_free %10u,\n"
- "db_free_add %10u, db_free_remove %10u,\n"
- "db_free_lock %10u, db_free_unlock %10u,\n"
- "db_int_cmp %10u, db_uint_cmp %10u,\n"
- "db_string_cmp %10u, db_istring_cmp %10u,\n"
- "db_int_hash %10u, db_uint_hash %10u,\n"
- "db_string_hash %10u, db_istring_hash %10u,\n"
- "db_release_nothing %10u, db_release_key %10u,\n"
- "db_release_data %10u, db_release_both %10u,\n"
- "db_get %10u,\n"
- "db_getall %10u, db_vgetall %10u,\n"
- "db_ensure %10u, db_vensure %10u,\n"
- "db_put %10u, db_remove %10u,\n"
- "db_foreach %10u, db_vforeach %10u,\n"
- "db_clear %10u, db_vclear %10u,\n"
- "db_destroy %10u, db_vdestroy %10u,\n"
- "db_size %10u, db_type %10u,\n"
- "db_options %10u, db_fix_options %10u,\n"
- "db_default_cmp %10u, db_default_hash %10u,\n"
- "db_default_release %10u, db_custom_release %10u,\n"
- "db_alloc %10u, db_i2key %10u,\n"
- "db_ui2key %10u, db_str2key %10u,\n"
- "db_init %10u, db_final %10u\n",
- stats.db_rotate_left, stats.db_rotate_right,
- stats.db_rebalance, stats.db_rebalance_erase,
- stats.db_is_key_null,
- stats.db_dup_key, stats.db_dup_key_free,
- stats.db_free_add, stats.db_free_remove,
- stats.db_free_lock, stats.db_free_unlock,
- stats.db_int_cmp, stats.db_uint_cmp,
- stats.db_string_cmp, stats.db_istring_cmp,
- stats.db_int_hash, stats.db_uint_hash,
- stats.db_string_hash, stats.db_istring_hash,
- stats.db_release_nothing, stats.db_release_key,
- stats.db_release_data, stats.db_release_both,
- stats.db_get,
- stats.db_getall, stats.db_vgetall,
- stats.db_ensure, stats.db_vensure,
- stats.db_put, stats.db_remove,
- stats.db_foreach, stats.db_vforeach,
- stats.db_clear, stats.db_vclear,
- stats.db_destroy, stats.db_vdestroy,
- stats.db_size, stats.db_type,
- stats.db_options, stats.db_fix_options,
- stats.db_default_cmp, stats.db_default_hash,
- stats.db_default_release, stats.db_custom_release,
- stats.db_alloc, stats.db_i2key,
- stats.db_ui2key, stats.db_str2key,
- stats.db_init, stats.db_final);
-#endif /* DB_ENABLE_STATS */
-}
-
-// Link DB System - jAthena
-void linkdb_insert( struct linkdb_node** head, void *key, void* data) {
- struct linkdb_node *node;
- if( head == NULL ) return ;
- node = aMalloc( sizeof(struct linkdb_node) );
- if( *head == NULL ) {
- // first node
- *head = node;
- node->prev = NULL;
- node->next = NULL;
- } else {
- // link nodes
- node->next = *head;
- node->prev = (*head)->prev;
- (*head)->prev = node;
- (*head) = node;
- }
- node->key = key;
- node->data = data;
-}
-
-void* linkdb_search( struct linkdb_node** head, void *key) {
- int n = 0;
- struct linkdb_node *node;
- if( head == NULL ) return NULL;
- node = *head;
- while( node ) {
- if( node->key == key ) {
- if( node->prev && n > 5 ) {
- // ˆ—Œø—¦‰ü‘P‚ׂ̈Éhead‚Ɉړ®‚³‚¹‚é
- if(node->prev) node->prev->next = node->next;
- if(node->next) node->next->prev = node->prev;
- node->next = *head;
- node->prev = (*head)->prev;
- (*head)->prev = node;
- (*head) = node;
- }
- return node->data;
- }
- node = node->next;
- n++;
- }
- return NULL;
-}
-
-void* linkdb_erase( struct linkdb_node** head, void *key) {
- struct linkdb_node *node;
- if( head == NULL ) return NULL;
- node = *head;
- while( node ) {
- if( node->key == key ) {
- void *data = node->data;
- if( node->prev == NULL )
- *head = node->next;
- else
- node->prev->next = node->next;
- if( node->next )
- node->next->prev = node->prev;
- aFree( node );
- return data;
- }
- node = node->next;
- }
- return NULL;
-}
-
-void linkdb_replace( struct linkdb_node** head, void *key, void *data ) {
- int n = 0;
- struct linkdb_node *node;
- if( head == NULL ) return ;
- node = *head;
- while( node ) {
- if( node->key == key ) {
- if( node->prev && n > 5 ) {
- // ˆ—Œø—¦‰ü‘P‚ׂ̈Éhead‚Ɉړ®‚³‚¹‚é
- if(node->prev) node->prev->next = node->next;
- if(node->next) node->next->prev = node->prev;
- node->next = *head;
- node->prev = (*head)->prev;
- (*head)->prev = node;
- (*head) = node;
- }
- node->data = data;
- return ;
- }
- node = node->next;
- n++;
- }
- // Œ©‚‚©‚ç‚È‚¢‚Ì‚Å‘}“ü
- linkdb_insert( head, key, data );
-}
-
-void linkdb_final( struct linkdb_node** head ) {
- struct linkdb_node *node, *node2;
- if( head == NULL ) return ;
- node = *head;
- while( node ) {
- node2 = node->next;
- aFree( node );
- node = node2;
- }
- *head = NULL;
-}
-
+/*****************************************************************************\
+ * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
+ * For more information, see LICENCE in the main folder *
+ * *
+ * This file is separated in five sections: *
+ * (1) Private typedefs, enums, structures, defines and gblobal variables *
+ * (2) Private functions *
+ * (3) Protected functions used internally *
+ * (4) Protected functions used in the interface of the database *
+ * (5) Public functions *
+ * *
+ * The databases are structured as a hashtable of RED-BLACK trees. *
+ * *
+ * <B>Properties of the RED-BLACK trees being used:</B> *
+ * 1. The value of any node is greater than the value of its left child and *
+ * less than the value of its right child. *
+ * 2. Every node is colored either RED or BLACK. *
+ * 3. Every red node that is not a leaf has only black children. *
+ * 4. Every path from the root to a leaf contains the same number of black *
+ * nodes. *
+ * 5. The root node is black. *
+ * An <code>n</code> node in a RED-BLACK tree has the property that its *
+ * height is <code>O(lg(n))</code>. *
+ * Another important property is that after adding a node to a RED-BLACK *
+ * tree, the tree can be readjusted in <code>O(lg(n))</code> time. *
+ * Similarly, after deleting a node from a RED-BLACK tree, the tree can be *
+ * readjusted in <code>O(lg(n))</code> time. *
+ * {@link http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic18/} *
+ * *
+ * <B>How to add new database types:</B> *
+ * 1. Add the identifier of the new database type to the enum DBType *
+ * 2. If not already there, add the data type of the key to the union DBKey *
+ * 3. If the key can be considered NULL, update the function db_is_key_null *
+ * 4. If the key can be duplicated, update the functions db_dup_key and *
+ * db_dup_key_free *
+ * 5. Create a comparator and update the function db_default_cmp *
+ * 6. Create a hasher and update the function db_default_hash *
+ * 7. If the new database type requires or does not support some options, *
+ * update the function db_fix_options *
+ * *
+ * TODO: *
+ * - create test cases to test the database system thoroughly *
+ * - make data an enumeration *
+ * - finish this header describing the database system *
+ * - create custom database allocator *
+ * - make the system thread friendly *
+ * - change the structure of the database to T-Trees *
+ * - create a db that organizes itself by splaying *
+ * *
+ * HISTORY: *
+ * 2.1 (Athena build #???#) - Portability fix *
+ * - Fixed the portability of casting to union and added the functions *
+ * {@link DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)} and *
+ * {@link DBInterface#clear(DBInterface,DBApply,...)}. *
+ * 2.0 (Athena build 4859) - Transition version *
+ * - Almost everything recoded with a strategy similar to objects, *
+ * database structure is maintained. *
+ * 1.0 (up to Athena build 4706) *
+ * - Previous database system. *
+ * *
+ * @version 2.1 (Athena build #???#) - Portability fix *
+ * @author (Athena build 4859) Flavio @ Amazon Project *
+ * @author (up to Athena build 4706) Athena Dev Teams *
+ * @encoding US-ASCII *
+ * @see common#db.h *
+\*****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "db.h"
+#include "../common/mmo.h"
+#include "../common/utils.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+#include "../common/ers.h"
+
+/*****************************************************************************\
+ * (1) Private typedefs, enums, structures, defines and global variables of *
+ * the database system. *
+ * DB_ENABLE_STATS - Define to enable database statistics. *
+ * HASH_SIZE - Define with the size of the hashtable. *
+ * DBNColor - Enumeration of colors of the nodes. *
+ * DBNode - Structure of a node in RED-BLACK trees. *
+ * struct db_free - Structure that holds a deleted node to be freed. *
+ * Database - Struture of the database. *
+ * stats - Statistics about the database system. *
+\*****************************************************************************/
+
+/**
+ * If defined statistics about database nodes, database creating/destruction
+ * and function usage are keept and displayed when finalizing the database
+ * system.
+ * WARNING: This adds overhead to every database operation (not shure how much).
+ * @private
+ * @see #DBStats
+ * @see #stats
+ * @see #db_final(void)
+ */
+//#define DB_ENABLE_STATS
+
+/**
+ * Size of the hashtable in the database.
+ * @private
+ * @see Database#ht
+ */
+#define HASH_SIZE (256+27)
+
+/**
+ * A node in a RED-BLACK tree of the database.
+ * @param parent Parent node
+ * @param left Left child node
+ * @param right Right child node
+ * @param key Key of this database entry
+ * @param data Data of this database entry
+ * @param deleted If the node is deleted
+ * @param color Color of the node
+ * @private
+ * @see Database#ht
+ */
+typedef struct dbn {
+ // Tree structure
+ struct dbn *parent;
+ struct dbn *left;
+ struct dbn *right;
+ // Node data
+ DBKey key;
+ void *data;
+ // Other
+ enum {RED, BLACK} color;
+ unsigned deleted : 1;
+} *DBNode;
+
+/**
+ * Structure that holds a deleted node.
+ * @param node Deleted node
+ * @param root Address to the root of the tree
+ * @private
+ * @see Database#free_list
+ */
+struct db_free {
+ DBNode node;
+ DBNode *root;
+};
+
+/**
+ * Complete database structure.
+ * @param dbi Interface of the database
+ * @param alloc_file File where the database was allocated
+ * @param alloc_line Line in the file where the database was allocated
+ * @param free_list Array of deleted nodes to be freed
+ * @param free_count Number of deleted nodes in free_list
+ * @param free_max Current maximum capacity of free_list
+ * @param free_lock Lock for freeing the nodes
+ * @param nodes Manager of reusable tree nodes
+ * @param cmp Comparator of the database
+ * @param hash Hasher of the database
+ * @param release Releaser of the database
+ * @param ht Hashtable of RED-BLACK trees
+ * @param type Type of the database
+ * @param options Options of the database
+ * @param item_count Number of items in the database
+ * @param maxlen Maximum length of strings in DB_STRING and DB_ISTRING databases
+ * @param global_lock Global lock of the database
+ * @private
+ * @see common\db.h#DBInterface
+ * @see #HASH_SIZE
+ * @see #DBNode
+ * @see #struct db_free
+ * @see common\db.h#DBComparator(void *,void *)
+ * @see common\db.h#DBHasher(void *)
+ * @see common\db.h#DBReleaser(void *,void *,DBRelease)
+ * @see common\db.h#DBOptions
+ * @see common\db.h#DBType
+ * @see #db_alloc(const char *,int,DBOptions,DBType,...)
+ */
+typedef struct db {
+ // Database interface
+ struct dbt dbi;
+ // File and line of allocation
+ const char *alloc_file;
+ int alloc_line;
+ // Lock system
+ struct db_free *free_list;
+ unsigned int free_count;
+ unsigned int free_max;
+ unsigned int free_lock;
+ // Other
+ ERInterface nodes;
+ DBComparator cmp;
+ DBHasher hash;
+ DBReleaser release;
+ DBNode ht[HASH_SIZE];
+ DBType type;
+ DBOptions options;
+ unsigned int item_count;
+ unsigned short maxlen;
+ unsigned global_lock : 1;
+} *Database;
+
+#ifdef DB_ENABLE_STATS
+/**
+ * Structure with what is counted when the database estatistics are enabled.
+ * @private
+ * @see #DB_ENABLE_STATS
+ * @see #stats
+ */
+static struct {
+ // Node alloc/free
+ unsigned int db_node_alloc;
+ unsigned int db_node_free;
+ // Database creating/destruction counters
+ unsigned int db_int_alloc;
+ unsigned int db_uint_alloc;
+ unsigned int db_string_alloc;
+ unsigned int db_istring_alloc;
+ unsigned int db_int_destroy;
+ unsigned int db_uint_destroy;
+ unsigned int db_string_destroy;
+ unsigned int db_istring_destroy;
+ // Function usage counters
+ unsigned int db_rotate_left;
+ unsigned int db_rotate_right;
+ unsigned int db_rebalance;
+ unsigned int db_rebalance_erase;
+ unsigned int db_is_key_null;
+ unsigned int db_dup_key;
+ unsigned int db_dup_key_free;
+ unsigned int db_free_add;
+ unsigned int db_free_remove;
+ unsigned int db_free_lock;
+ unsigned int db_free_unlock;
+ unsigned int db_int_cmp;
+ unsigned int db_uint_cmp;
+ unsigned int db_string_cmp;
+ unsigned int db_istring_cmp;
+ unsigned int db_int_hash;
+ unsigned int db_uint_hash;
+ unsigned int db_string_hash;
+ unsigned int db_istring_hash;
+ unsigned int db_release_nothing;
+ unsigned int db_release_key;
+ unsigned int db_release_data;
+ unsigned int db_release_both;
+ unsigned int db_get;
+ unsigned int db_getall;
+ unsigned int db_vgetall;
+ unsigned int db_ensure;
+ unsigned int db_vensure;
+ unsigned int db_put;
+ unsigned int db_remove;
+ unsigned int db_foreach;
+ unsigned int db_vforeach;
+ unsigned int db_clear;
+ unsigned int db_vclear;
+ unsigned int db_destroy;
+ unsigned int db_vdestroy;
+ unsigned int db_size;
+ unsigned int db_type;
+ unsigned int db_options;
+ unsigned int db_fix_options;
+ unsigned int db_default_cmp;
+ unsigned int db_default_hash;
+ unsigned int db_default_release;
+ unsigned int db_custom_release;
+ unsigned int db_alloc;
+ unsigned int db_i2key;
+ unsigned int db_ui2key;
+ unsigned int db_str2key;
+ unsigned int db_init;
+ unsigned int db_final;
+} stats = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif /* DB_ENABLE_STATS */
+
+/*****************************************************************************\
+ * (2) Section of private functions used by the database system. *
+ * db_rotate_left - Rotate a tree node to the left. *
+ * db_rotate_right - Rotate a tree node to the right. *
+ * db_rebalance - Rebalance the tree. *
+ * db_rebalance_erase - Rebalance the tree after a BLACK node was erased. *
+ * db_is_key_null - Returns not 0 if the key is considered NULL. *
+ * db_dup_key - Duplicate a key for internal use. *
+ * db_dup_key_free - Free the duplicated key. *
+ * db_free_add - Add a node to the free_list of a database. *
+ * db_free_remove - Remove a node from the free_list of a database. *
+ * db_free_lock - Increment the free_lock of a database. *
+ * db_free_unlock - Decrement the free_lock of a database. *
+ * If it was the last lock, frees the nodes in free_list. *
+ * NOTE: Keeps the database trees balanced. *
+\*****************************************************************************/
+
+/**
+ * Rotate a node to the left.
+ * @param node Node to be rotated
+ * @param root Pointer to the root of the tree
+ * @private
+ * @see #db_rebalance(DBNode,DBNode *)
+ * @see #db_rebalance_erase(DBNode,DBNode *)
+ */
+static void db_rotate_left(DBNode node, DBNode *root)
+{
+ DBNode y = node->right;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_rotate_left != (unsigned int)~0) stats.db_rotate_left++;
+#endif /* DB_ENABLE_STATS */
+ // put the left of y at the right of node
+ node->right = y->left;
+ if (y->left)
+ y->left->parent = node;
+ y->parent = node->parent;
+ // link y and node's parent
+ if (node == *root) {
+ *root = y; // node was root
+ } else if (node == node->parent->left) {
+ node->parent->left = y; // node was at the left
+ } else {
+ node->parent->right = y; // node was at the right
+ }
+ // put node at the left of y
+ y->left = node;
+ node->parent = y;
+}
+
+/**
+ * Rotate a node to the right
+ * @param node Node to be rotated
+ * @param root Pointer to the root of the tree
+ * @private
+ * @see #db_rebalance(DBNode,DBNode *)
+ * @see #db_rebalance_erase(DBNode,DBNode *)
+ */
+static void db_rotate_right(DBNode node, DBNode *root)
+{
+ DBNode y = node->left;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_rotate_right != (unsigned int)~0) stats.db_rotate_right++;
+#endif /* DB_ENABLE_STATS */
+ // put the right of y at the left of node
+ node->left = y->right;
+ if (y->right != 0)
+ y->right->parent = node;
+ y->parent = node->parent;
+ // link y and node's parent
+ if (node == *root) {
+ *root = y; // node was root
+ } else if (node == node->parent->right) {
+ node->parent->right = y; // node was at the right
+ } else {
+ node->parent->left = y; // node was at the left
+ }
+ // put node at the right of y
+ y->right = node;
+ node->parent = y;
+}
+
+/**
+ * Rebalance the RED-BLACK tree.
+ * Called when the node and it's parent are both RED.
+ * @param node Node to be rebalanced
+ * @param root Pointer to the root of the tree
+ * @private
+ * @see #db_rotate_left(DBNode,DBNode *)
+ * @see #db_rotate_right(DBNode,DBNode *)
+ * @see #db_put(DBInterface,DBKey,void *)
+ */
+static void db_rebalance(DBNode node, DBNode *root)
+{
+ DBNode y;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_rebalance != (unsigned int)~0) stats.db_rebalance++;
+#endif /* DB_ENABLE_STATS */
+ // Restore the RED-BLACK properties
+ node->color = RED;
+ while (node != *root && node->parent->color == RED) {
+ if (node->parent == node->parent->parent->left) {
+ // If node's parent is a left, y is node's right 'uncle'
+ y = node->parent->parent->right;
+ if (y && y->color == RED) { // case 1
+ // change the colors and move up the tree
+ node->parent->color = BLACK;
+ y->color = BLACK;
+ node->parent->parent->color = RED;
+ node = node->parent->parent;
+ } else {
+ if (node == node->parent->right) { // case 2
+ // move up and rotate
+ node = node->parent;
+ db_rotate_left(node, root);
+ }
+ // case 3
+ node->parent->color = BLACK;
+ node->parent->parent->color = RED;
+ db_rotate_right(node->parent->parent, root);
+ }
+ } else {
+ // If node's parent is a right, y is node's left 'uncle'
+ y = node->parent->parent->left;
+ if (y && y->color == RED) { // case 1
+ // change the colors and move up the tree
+ node->parent->color = BLACK;
+ y->color = BLACK;
+ node->parent->parent->color = RED;
+ node = node->parent->parent;
+ } else {
+ if (node == node->parent->left) { // case 2
+ // move up and rotate
+ node = node->parent;
+ db_rotate_right(node, root);
+ }
+ // case 3
+ node->parent->color = BLACK;
+ node->parent->parent->color = RED;
+ db_rotate_left(node->parent->parent, root);
+ }
+ }
+ }
+ (*root)->color = BLACK; // the root can and should always be black
+}
+
+/**
+ * Erase a node from the RED-BLACK tree, keeping the tree balanced.
+ * @param node Node to be erased from the tree
+ * @param root Root of the tree
+ * @private
+ * @see #db_rotate_left(DBNode,DBNode *)
+ * @see #db_rotate_right(DBNode,DBNode *)
+ * @see #db_free_unlock(Database)
+ */
+static void db_rebalance_erase(DBNode node, DBNode *root)
+{
+ DBNode y = node;
+ DBNode x = NULL;
+ DBNode x_parent = NULL;
+ DBNode w;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_rebalance_erase != (unsigned int)~0) stats.db_rebalance_erase++;
+#endif /* DB_ENABLE_STATS */
+ // Select where to change the tree
+ if (y->left == NULL) { // no left
+ x = y->right;
+ } else if (y->right == NULL) { // no right
+ x = y->left;
+ } else { // both exist, go to the leftmost node of the right sub-tree
+ y = y->right;
+ while (y->left != NULL)
+ y = y->left;
+ x = y->right;
+ }
+
+ // Remove the node from the tree
+ if (y != node) { // both childs existed
+ // put the left of 'node' in the left of 'y'
+ node->left->parent = y;
+ y->left = node->left;
+
+ // 'y' is not the direct child of 'node'
+ if (y != node->right) {
+ // put 'x' in the old position of 'y'
+ x_parent = y->parent;
+ if (x) x->parent = y->parent;
+ y->parent->left = x;
+ // put the right of 'node' in 'y'
+ y->right = node->right;
+ node->right->parent = y;
+ // 'y' is a direct child of 'node'
+ } else {
+ x_parent = y;
+ }
+
+ // link 'y' and the parent of 'node'
+ if (*root == node) {
+ *root = y; // 'node' was the root
+ } else if (node->parent->left == node) {
+ node->parent->left = y; // 'node' was at the left
+ } else {
+ node->parent->right = y; // 'node' was at the right
+ }
+ y->parent = node->parent;
+ // switch colors
+ {
+ int tmp = y->color;
+ y->color = node->color;
+ node->color = tmp;
+ }
+ y = node;
+ } else { // one child did not exist
+ // put x in node's position
+ x_parent = y->parent;
+ if (x) x->parent = y->parent;
+ // link x and node's parent
+ if (*root == node) {
+ *root = x; // node was the root
+ } else if (node->parent->left == node) {
+ node->parent->left = x; // node was at the left
+ } else {
+ node->parent->right = x; // node was at the right
+ }
+ }
+
+ // Restore the RED-BLACK properties
+ if (y->color != RED) {
+ while (x != *root && (x == NULL || x->color == BLACK)) {
+ if (x == x_parent->left) {
+ w = x_parent->right;
+ if (w->color == RED) {
+ w->color = BLACK;
+ x_parent->color = RED;
+ db_rotate_left(x_parent, root);
+ w = x_parent->right;
+ }
+ if ((w->left == NULL || w->left->color == BLACK) &&
+ (w->right == NULL || w->right->color == BLACK)) {
+ w->color = RED;
+ x = x_parent;
+ x_parent = x_parent->parent;
+ } else {
+ if (w->right == NULL || w->right->color == BLACK) {
+ if (w->left) w->left->color = BLACK;
+ w->color = RED;
+ db_rotate_right(w, root);
+ w = x_parent->right;
+ }
+ w->color = x_parent->color;
+ x_parent->color = BLACK;
+ if (w->right) w->right->color = BLACK;
+ db_rotate_left(x_parent, root);
+ break;
+ }
+ } else {
+ w = x_parent->left;
+ if (w->color == RED) {
+ w->color = BLACK;
+ x_parent->color = RED;
+ db_rotate_right(x_parent, root);
+ w = x_parent->left;
+ }
+ if ((w->right == NULL || w->right->color == BLACK) &&
+ (w->left == NULL || w->left->color == BLACK)) {
+ w->color = RED;
+ x = x_parent;
+ x_parent = x_parent->parent;
+ } else {
+ if (w->left == NULL || w->left->color == BLACK) {
+ if (w->right) w->right->color = BLACK;
+ w->color = RED;
+ db_rotate_left(w, root);
+ w = x_parent->left;
+ }
+ w->color = x_parent->color;
+ x_parent->color = BLACK;
+ if (w->left) w->left->color = BLACK;
+ db_rotate_right(x_parent, root);
+ break;
+ }
+ }
+ }
+ if (x) x->color = BLACK;
+ }
+}
+
+/**
+ * Returns not 0 if the key is considerd to be NULL.
+ * @param type Type of database
+ * @param key Key being tested
+ * @return not 0 if considered NULL, 0 otherwise
+ * @private
+ * @see common\db.h#DBType
+ * @see common\db.h#DBKey
+ * @see #db_get(DBInterface,DBKey)
+ * @see #db_put(DBInterface,DBKey,void *)
+ * @see #db_remove(DBInterface,DBKey)
+ */
+static int db_is_key_null(DBType type, DBKey key)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_is_key_null != (unsigned int)~0) stats.db_is_key_null++;
+#endif /* DB_ENABLE_STATS */
+ switch (type) {
+ case DB_STRING:
+ case DB_ISTRING:
+ return (key.str == NULL);
+
+ default: // Not a pointer
+ return 0;
+ }
+}
+
+/**
+ * Duplicate the key used in the database.
+ * @param db Database the key is being used in
+ * @param key Key to be duplicated
+ * @param Duplicated key
+ * @private
+ * @see #db_free_add(Database,DBNode,DBNode *)
+ * @see #db_free_remove(Database,DBNode)
+ * @see #db_put(DBInterface,DBKey,void *)
+ * @see #db_dup_key_free(Database,DBKey)
+ */
+static DBKey db_dup_key(Database db, DBKey key)
+{
+ unsigned char *str;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_dup_key != (unsigned int)~0) stats.db_dup_key++;
+#endif /* DB_ENABLE_STATS */
+ switch (db->type) {
+ case DB_STRING:
+ case DB_ISTRING:
+ if (db->maxlen) {
+ CREATE(str, unsigned char, db->maxlen +1);
+ memcpy(str, key.str, db->maxlen);
+ str[db->maxlen] = '\0';
+ key.str = str;
+ } else {
+ key.str = (unsigned char *)aStrdup((const char *)key.str);
+ }
+ return key;
+
+ default:
+ return key;
+ }
+}
+
+/**
+ * Free a key duplicated by db_dup_key.
+ * @param db Database the key is being used in
+ * @param key Key to be freed
+ * @private
+ * @see #db_dup_key(Database,DBKey)
+ */
+static void db_dup_key_free(Database db, DBKey key)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_dup_key_free != (unsigned int)~0) stats.db_dup_key_free++;
+#endif /* DB_ENABLE_STATS */
+ switch (db->type) {
+ case DB_STRING:
+ case DB_ISTRING:
+ aFree(key.str);
+ return;
+
+ default:
+ return;
+ }
+}
+
+/**
+ * Add a node to the free_list of the database.
+ * Marks the node as deleted.
+ * If the key isn't duplicated, the key is duplicated and released.
+ * @param db Target database
+ * @param root Root of the tree from the node
+ * @param node Target node
+ * @private
+ * @see #struct db_free
+ * @see Database#free_list
+ * @see Database#free_count
+ * @see Database#free_max
+ * @see #db_remove(DBInterface,DBKey)
+ * @see #db_free_remove(Database,DBNode)
+ */
+static void db_free_add(Database db, DBNode node, DBNode *root)
+{
+ DBKey old_key;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_free_add != (unsigned int)~0) stats.db_free_add++;
+#endif /* DB_ENABLE_STATS */
+ if (db->free_lock == (unsigned int)~0) {
+ ShowFatalError("db_free_add: free_lock overflow\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ exit(EXIT_FAILURE);
+ }
+ if (!(db->options&DB_OPT_DUP_KEY)) { // Make shure we have a key until the node is freed
+ old_key = node->key;
+ node->key = db_dup_key(db, node->key);
+ db->release(old_key, node->data, DB_RELEASE_KEY);
+ }
+ if (db->free_count == db->free_max) { // No more space, expand free_list
+ db->free_max = (db->free_max<<2) +3; // = db->free_max*4 +3
+ if (db->free_max <= db->free_count) {
+ if (db->free_count == (unsigned int)~0) {
+ ShowFatalError("db_free_add: free_count overflow\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ exit(EXIT_FAILURE);
+ }
+ db->free_max = (unsigned int)~0;
+ }
+ RECREATE(db->free_list, struct db_free, db->free_max);
+ }
+ node->deleted = 1;
+ db->free_list[db->free_count].node = node;
+ db->free_list[db->free_count].root = root;
+ db->free_count++;
+ db->item_count--;
+}
+
+/**
+ * Remove a node from the free_list of the database.
+ * Marks the node as not deleted.
+ * NOTE: Frees the duplicated key of the node.
+ * @param db Target database
+ * @param node Node being removed from free_list
+ * @private
+ * @see #struct db_free
+ * @see Database#free_list
+ * @see Database#free_count
+ * @see #db_put(DBInterface,DBKey,void *)
+ * @see #db_free_add(Database,DBNode *,DBNode)
+ */
+static void db_free_remove(Database db, DBNode node)
+{
+ unsigned int i;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_free_remove != (unsigned int)~0) stats.db_free_remove++;
+#endif /* DB_ENABLE_STATS */
+ for (i = 0; i < db->free_count; i++) {
+ if (db->free_list[i].node == node) {
+ if (i < db->free_count -1) // copy the last item to where the removed one was
+ memcpy(&db->free_list[i], &db->free_list[db->free_count -1], sizeof(struct db_free));
+ db_dup_key_free(db, node->key);
+ break;
+ }
+ }
+ node->deleted = 0;
+ if (i == db->free_count) {
+ ShowWarning("db_free_remove: node was not found - database allocated at %s:%d\n", db->alloc_file, db->alloc_line);
+ } else {
+ db->free_count--;
+ }
+ db->item_count++;
+}
+
+/**
+ * Increment the free_lock of the database.
+ * @param db Target database
+ * @private
+ * @see Database#free_lock
+ * @see #db_unlock(Database)
+ */
+static void db_free_lock(Database db)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_free_lock != (unsigned int)~0) stats.db_free_lock++;
+#endif /* DB_ENABLE_STATS */
+ if (db->free_lock == (unsigned int)~0) {
+ ShowFatalError("db_free_lock: free_lock overflow\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ exit(EXIT_FAILURE);
+ }
+ db->free_lock++;
+}
+
+/**
+ * Decrement the free_lock of the database.
+ * If it was the last lock, frees the nodes of the database.
+ * Keeps the tree balanced.
+ * NOTE: Frees the duplicated keys of the nodes
+ * @param db Target database
+ * @private
+ * @see Database#free_lock
+ * @see #db_free_dbn(DBNode)
+ * @see #db_lock(Database)
+ */
+static void db_free_unlock(Database db)
+{
+ unsigned int i;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_free_unlock != (unsigned int)~0) stats.db_free_unlock++;
+#endif /* DB_ENABLE_STATS */
+ if (db->free_lock == 0) {
+ ShowWarning("db_free_unlock: free_lock was already 0\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ } else {
+ db->free_lock--;
+ }
+ if (db->free_lock)
+ return; // Not last lock
+
+ for (i = 0; i < db->free_count ; i++) {
+ db_rebalance_erase(db->free_list[i].node, db->free_list[i].root);
+ db_dup_key_free(db, db->free_list[i].node->key);
+#ifdef DB_ENABLE_STATS
+ if (stats.db_node_free != (unsigned int)~0) stats.db_node_free++;
+#endif /* DB_ENABLE_STATS */
+ ers_free(db->nodes, db->free_list[i].node);
+ }
+ db->free_count = 0;
+}
+
+/*****************************************************************************\
+ * (3) Section of protected functions used internally. *
+ * NOTE: the protected functions used in the database interface are in the *
+ * next section. *
+ * db_int_cmp - Default comparator for DB_INT databases. *
+ * db_uint_cmp - Default comparator for DB_UINT databases. *
+ * db_string_cmp - Default comparator for DB_STRING databases. *
+ * db_istring_cmp - Default comparator for DB_ISTRING databases. *
+ * db_int_hash - Default hasher for DB_INT databases. *
+ * db_uint_hash - Default hasher for DB_UINT databases. *
+ * db_string_hash - Default hasher for DB_STRING databases. *
+ * db_istring_hash - Default hasher for DB_ISTRING databases. *
+ * db_release_nothing - Releaser that releases nothing. *
+ * db_release_key - Releaser that only releases the key. *
+ * db_release_data - Releaser that only releases the data. *
+ * db_release_both - Releaser that releases key and data. *
+\*****************************************************************************/
+
+/**
+ * Default comparator for DB_INT databases.
+ * Compares key1 to key2.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * <code>maxlen</code> is ignored.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_INT
+ * @see common\db.h#DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_int_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_int_cmp != (unsigned int)~0) stats.db_int_cmp++;
+#endif /* DB_ENABLE_STATS */
+ if (key1.i < key2.i) return -1;
+ if (key1.i > key2.i) return 1;
+ return 0;
+}
+
+/**
+ * Default comparator for DB_UINT databases.
+ * Compares key1 to key2.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * <code>maxlen</code> is ignored.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_UINT
+ * @see common\db.h#DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_uint_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_uint_cmp != (unsigned int)~0) stats.db_uint_cmp++;
+#endif /* DB_ENABLE_STATS */
+ if (key1.ui < key2.ui) return -1;
+ if (key1.ui > key2.ui) return 1;
+ return 0;
+}
+
+/**
+ * Default comparator for DB_STRING databases.
+ * Compares key1 to key2.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_STRING
+ * @see common\db.h#DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_string_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_string_cmp != (unsigned int)~0) stats.db_string_cmp++;
+#endif /* DB_ENABLE_STATS */
+ if (maxlen == 0) maxlen = (unsigned short)~0;
+ return strncmp((const char *)key1.str, (const char *)key2.str, maxlen);
+}
+
+/**
+ * Default comparator for DB_ISTRING databases.
+ * Compares key1 to key2 case insensitively.
+ * Return 0 if equal, negative if lower and positive if higher.
+ * @param key1 Key to be compared
+ * @param key2 Key being compared to
+ * @param maxlen Maximum length of the key to hash
+ * @return 0 if equal, negative if lower and positive if higher
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_ISTRING
+ * @see common\db.h#DBComparator
+ * @see #db_default_cmp(DBType)
+ */
+static int db_istring_cmp(DBKey key1, DBKey key2, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_istring_cmp != (unsigned int)~0) stats.db_istring_cmp++;
+#endif /* DB_ENABLE_STATS */
+ if (maxlen == 0) maxlen = (unsigned short)~0;
+ return strncasecmp((const char *)key1.str, (const char *)key2.str, maxlen);
+}
+
+/**
+ * Default hasher for DB_INT databases.
+ * Returns the value of the key as an unsigned int.
+ * <code>maxlen</code> is ignored.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_INT
+ * @see common\db.h#DBHasher
+ * @see #db_default_hash(DBType)
+ */
+static unsigned int db_int_hash(DBKey key, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_int_hash != (unsigned int)~0) stats.db_int_hash++;
+#endif /* DB_ENABLE_STATS */
+ return (unsigned int)key.i;
+}
+
+/**
+ * Default hasher for DB_UINT databases.
+ * Just returns the value of the key.
+ * <code>maxlen</code> is ignored.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_UINT
+ * @see #db_default_hash(DBType)
+ */
+static unsigned int db_uint_hash(DBKey key, unsigned short maxlen)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_uint_hash != (unsigned int)~0) stats.db_uint_hash++;
+#endif /* DB_ENABLE_STATS */
+ return key.ui;
+}
+
+/**
+ * Default hasher for DB_STRING databases.
+ * If maxlen if 0, the maximum number of maxlen is used instead.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_STRING
+ * @see #db_default_hash(DBType)
+ */
+static unsigned int db_string_hash(DBKey key, unsigned short maxlen)
+{
+ unsigned char *k = key.str;
+ unsigned int hash = 0;
+ unsigned short i;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_string_hash != (unsigned int)~0) stats.db_string_hash++;
+#endif /* DB_ENABLE_STATS */
+ if (maxlen == 0)
+ maxlen = (unsigned short)~0; // Maximum
+
+ for (i = 0; *k; i++) {
+ hash = (hash*33 + *k++)^(hash>>24);
+ if (i == maxlen)
+ break;
+ }
+
+ return hash;
+}
+
+/**
+ * Default hasher for DB_ISTRING databases.
+ * If maxlen if 0, the maximum number of maxlen is used instead.
+ * @param key Key to be hashed
+ * @param maxlen Maximum length of the key to hash
+ * @return hash of the key
+ * @see common\db.h#DBKey
+ * @see common\db.h\DBType#DB_ISTRING
+ * @see #db_default_hash(DBType)
+ */
+static unsigned int db_istring_hash(DBKey key, unsigned short maxlen)
+{
+ unsigned char *k = key.str;
+ unsigned int hash = 0;
+ unsigned short i;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_istring_hash != (unsigned int)~0) stats.db_istring_hash++;
+#endif /* DB_ENABLE_STATS */
+ if (maxlen == 0)
+ maxlen = (unsigned short)~0; // Maximum
+
+ for (i = 0; *k; i++) {
+ hash = (hash*33 + LOWER(*k))^(hash>>24);
+ k++;
+ if (i == maxlen)
+ break;
+ }
+
+ return hash;
+}
+
+/**
+ * Releaser that releases nothing.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param which What is being requested to be released
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBRelease
+ * @see common\db.h#DBReleaser
+ * @see #db_default_releaser(DBType,DBOptions)
+ */
+static void db_release_nothing(DBKey key, void *data, DBRelease which)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_release_nothing != (unsigned int)~0) stats.db_release_nothing++;
+#endif /* DB_ENABLE_STATS */
+}
+
+/**
+ * Releaser that only releases the key.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param which What is being requested to be released
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBRelease
+ * @see common\db.h#DBReleaser
+ * @see #db_default_release(DBType,DBOptions)
+ */
+static void db_release_key(DBKey key, void *data, DBRelease which)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_release_key != (unsigned int)~0) stats.db_release_key++;
+#endif /* DB_ENABLE_STATS */
+ if (which&DB_RELEASE_KEY) aFree(key.str); // needs to be a pointer
+}
+
+/**
+ * Releaser that only releases the data.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param which What is being requested to be released
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBRelease
+ * @see common\db.h#DBReleaser
+ * @see #db_default_release(DBType,DBOptions)
+ */
+static void db_release_data(DBKey key, void *data, DBRelease which)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_release_data != (unsigned int)~0) stats.db_release_data++;
+#endif /* DB_ENABLE_STATS */
+ if (which&DB_RELEASE_DATA) aFree(data);
+}
+
+/**
+ * Releaser that releases both key and data.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param which What is being requested to be released
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBRelease
+ * @see common\db.h#DBReleaser
+ * @see #db_default_release(DBType,DBOptions)
+ */
+static void db_release_both(DBKey key, void *data, DBRelease which)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_release_both != (unsigned int)~0) stats.db_release_both++;
+#endif /* DB_ENABLE_STATS */
+ if (which&DB_RELEASE_KEY) aFree(key.str); // needs to be a pointer
+ if (which&DB_RELEASE_DATA) aFree(data);
+}
+
+/*****************************************************************************\
+ * (4) Section with protected functions used in the interface of the *
+ * database. *
+ * db_obj_get - Get the data identified by the key. *
+ * db_obj_vgetall - Get the data of the matched entries. *
+ * db_obj_getall - Get the data of the matched entries. *
+ * db_obj_vensure - Get the data identified by the key, creating if it *
+ * doesn't exist yet. *
+ * db_obj_ensure - Get the data identified by the key, creating if it *
+ * doesn't exist yet. *
+ * db_obj_put - Put data identified by the key in the database. *
+ * db_obj_remove - Remove an entry from the database. *
+ * db_obj_vforeach - Apply a function to every entry in the database. *
+ * db_obj_foreach - Apply a function to every entry in the database. *
+ * db_obj_vclear - Remove all entries from the database. *
+ * db_obj_clear - Remove all entries from the database. *
+ * db_obj_vdestroy - Destroy the database, freeing all the used memory. *
+ * db_obj_destroy - Destroy the database, freeing all the used memory. *
+ * db_obj_size - Return the size of the database. *
+ * db_obj_type - Return the type of the database. *
+ * db_obj_options - Return the options of the database. *
+\*****************************************************************************/
+
+/**
+ * Get the data of the entry identifid by the key.
+ * @param self Interface of the database
+ * @param key Key that identifies the entry
+ * @return Data of the entry or NULL if not found
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#get(DBInterface,DBKey)
+ */
+static void *db_obj_get(DBInterface self, DBKey key)
+{
+ Database db = (Database)self;
+ DBNode node;
+ int c;
+ void *data = NULL;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_get != (unsigned int)~0) stats.db_get++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return NULL; // nullpo candidate
+ if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
+ ShowError("db_get: Attempted to retrieve non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+
+ db_free_lock(db);
+ node = db->ht[db->hash(key, db->maxlen)%HASH_SIZE];
+ while (node) {
+ c = db->cmp(key, node->key, db->maxlen);
+ if (c == 0) {
+ data = node->data;
+ break;
+ }
+ if (c < 0)
+ node = node->left;
+ else
+ node = node->right;
+ }
+ db_free_unlock(db);
+ return data;
+}
+
+/**
+ * Get the data of the entries matched by <code>match</code>.
+ * It puts a maximum of <code>max</code> entries into <code>buf</code>.
+ * If <code>buf</code> is NULL, it only counts the matches.
+ * Returns the number of entries that matched.
+ * NOTE: if the value returned is greater than <code>max</code>, only the
+ * first <code>max</code> entries found are put into the buffer.
+ * @param self Interface of the database
+ * @param buf Buffer to put the data of the matched entries
+ * @param max Maximum number of data entries to be put into buf
+ * @param match Function that matches the database entries
+ * @param ... Extra arguments for match
+ * @return The number of entries that matched
+ * @protected
+ * @see common\db.h#DBInterface
+ * @see common\db.h#DBMatcher(DBKey key, void *data, va_list args)
+ * @see common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
+ */
+static unsigned int db_obj_vgetall(DBInterface self, void **buf, unsigned int max, DBMatcher match, va_list args)
+{
+ Database db = (Database)self;
+ unsigned int i;
+ DBNode node;
+ DBNode parent;
+ unsigned int ret = 0;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_vgetall != (unsigned int)~0) stats.db_vgetall++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return 0; // nullpo candidate
+ if (match == NULL) return 0; // nullpo candidate
+
+ db_free_lock(db);
+ for (i = 0; i < HASH_SIZE; i++) {
+ // Match in the order: current node, left tree, right tree
+ node = db->ht[i];
+ while (node) {
+ parent = node->parent;
+ if (!(node->deleted) && match(node->key, node->data, args) == 0) {
+ if (buf && ret < max)
+ buf[ret] = node->data;
+ ret++;
+ }
+ if (node->left) {
+ node = node->left;
+ continue;
+ }
+ if (node->right) {
+ node = node->right;
+ continue;
+ }
+ while (node) {
+ parent = node->parent;
+ if (parent && parent->right && parent->left == node) {
+ node = parent->right;
+ break;
+ }
+ node = parent;
+ }
+ }
+ }
+ db_free_unlock(db);
+ return ret;
+}
+
+/**
+ * Just calls {@link common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)}.
+ * Get the data of the entries matched by <code>match</code>.
+ * It puts a maximum of <code>max</code> entries into <code>buf</code>.
+ * If <code>buf</code> is NULL, it only counts the matches.
+ * Returns the number of entries that matched.
+ * NOTE: if the value returned is greater than <code>max</code>, only the
+ * first <code>max</code> entries found are put into the buffer.
+ * @param self Interface of the database
+ * @param buf Buffer to put the data of the matched entries
+ * @param max Maximum number of data entries to be put into buf
+ * @param match Function that matches the database entries
+ * @param ... Extra arguments for match
+ * @return The number of entries that matched
+ * @protected
+ * @see common\db.h#DBMatcher(DBKey key, void *data, va_list args)
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
+ * @see common\db.h\DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
+ */
+static unsigned int db_obj_getall(DBInterface self, void **buf, unsigned int max, DBMatcher match, ...)
+{
+ va_list args;
+ unsigned int ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_getall != (unsigned int)~0) stats.db_getall++;
+#endif /* DB_ENABLE_STATS */
+ if (self == NULL) return 0; // nullpo candidate
+
+ va_start(args, match);
+ ret = self->vgetall(self, buf, max, match, args);
+ va_end(args);
+ return ret;
+}
+
+/**
+ * Get the data of the entry identified by the key.
+ * If the entry does not exist, an entry is added with the data returned by
+ * <code>create</code>.
+ * @param self Interface of the database
+ * @param key Key that identifies the entry
+ * @param create Function used to create the data if the entry doesn't exist
+ * @param args Extra arguments for create
+ * @return Data of the entry
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBCreateData
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
+ */
+static void *db_obj_vensure(DBInterface self, DBKey key, DBCreateData create, va_list args)
+{
+ Database db = (Database)self;
+ DBNode node;
+ DBNode parent = NULL;
+ unsigned int hash;
+ int c = 0;
+ void *data = NULL;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_vensure != (unsigned int)~0) stats.db_vensure++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return NULL; // nullpo candidate
+ if (create == NULL) {
+ ShowError("db_ensure: Create function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+ if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
+ ShowError("db_ensure: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+
+ db_free_lock(db);
+ hash = db->hash(key, db->maxlen)%HASH_SIZE;
+ node = db->ht[hash];
+ while (node) {
+ c = db->cmp(key, node->key, db->maxlen);
+ if (c == 0) {
+ break;
+ }
+ parent = node;
+ if (c < 0)
+ node = node->left;
+ else
+ node = node->right;
+ }
+ // Create node if necessary
+ if (node == NULL) {
+ if (db->item_count == (unsigned int)~0) {
+ ShowError("db_vensure: item_count overflow, aborting item insertion.\n"
+ "Database allocated at %s:%d",
+ db->alloc_file, db->alloc_line);
+ return NULL;
+ }
+#ifdef DB_ENABLE_STATS
+ if (stats.db_node_alloc != (unsigned int)~0) stats.db_node_alloc++;
+#endif /* DB_ENABLE_STATS */
+ node = ers_alloc(db->nodes, struct dbn);
+ node->left = NULL;
+ node->right = NULL;
+ node->deleted = 0;
+ db->item_count++;
+ if (c == 0) { // hash entry is empty
+ node->color = BLACK;
+ node->parent = NULL;
+ db->ht[hash] = node;
+ } else {
+ node->color = RED;
+ if (c < 0) { // put at the left
+ parent->left = node;
+ node->parent = parent;
+ } else { // put at the right
+ parent->right = node;
+ node->parent = parent;
+ }
+ if (parent->color == RED) // two consecutive RED nodes, must rebalance
+ db_rebalance(node, &db->ht[hash]);
+ }
+ // put key and data in the node
+ if (db->options&DB_OPT_DUP_KEY) {
+ node->key = db_dup_key(db, key);
+ if (db->options&DB_OPT_RELEASE_KEY)
+ db->release(key, data, DB_RELEASE_KEY);
+ } else {
+ node->key = key;
+ }
+ node->data = create(key, args);
+ }
+ data = node->data;
+ db_free_unlock(db);
+ return data;
+}
+
+/**
+ * Just calls {@link common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)}.
+ * Get the data of the entry identified by the key.
+ * If the entry does not exist, an entry is added with the data returned by
+ * <code>create</code>.
+ * @param self Interface of the database
+ * @param key Key that identifies the entry
+ * @param create Function used to create the data if the entry doesn't exist
+ * @param ... Extra arguments for create
+ * @return Data of the entry
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBCreateData
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
+ * @see common\db.h\DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
+ */
+static void *db_obj_ensure(DBInterface self, DBKey key, DBCreateData create, ...)
+{
+ va_list args;
+ void *ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_ensure != (unsigned int)~0) stats.db_ensure++;
+#endif /* DB_ENABLE_STATS */
+ if (self == NULL) return 0; // nullpo candidate
+
+ va_start(args, create);
+ ret = self->vensure(self, key, create, args);
+ va_end(args);
+ return ret;
+}
+
+/**
+ * Put the data identified by the key in the database.
+ * Returns the previous data if the entry exists or NULL.
+ * NOTE: Uses the new key, the old one is released.
+ * @param self Interface of the database
+ * @param key Key that identifies the data
+ * @param data Data to be put in the database
+ * @return The previous data if the entry exists or NULL
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBInterface
+ * @see #db_malloc_dbn(void)
+ * @see common\db.h\DBInterface#put(DBInterface,DBKey,void *)
+ */
+static void *db_obj_put(DBInterface self, DBKey key, void *data)
+{
+ Database db = (Database)self;
+ DBNode node;
+ DBNode parent = NULL;
+ int c = 0;
+ unsigned int hash;
+ void *old_data = NULL;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_put != (unsigned int)~0) stats.db_put++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return NULL; // nullpo candidate
+ if (db->global_lock) {
+ ShowError("db_put: Database is being destroyed, aborting entry insertion.\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+ if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
+ ShowError("db_put: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+ if (!(data || db->options&DB_OPT_ALLOW_NULL_DATA)) {
+ ShowError("db_put: Attempted to use non-allowed NULL data for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+
+ if (db->item_count == (unsigned int)~0) {
+ ShowError("db_put: item_count overflow, aborting item insertion.\n"
+ "Database allocated at %s:%d",
+ db->alloc_file, db->alloc_line);
+ return NULL;
+ }
+ // search for an equal node
+ db_free_lock(db);
+ hash = db->hash(key, db->maxlen)%HASH_SIZE;
+ for (node = db->ht[hash]; node; ) {
+ c = db->cmp(key, node->key, db->maxlen);
+ if (c == 0) { // equal entry, replace
+ if (node->deleted) {
+ db_free_remove(db, node);
+ } else {
+ db->release(node->key, node->data, DB_RELEASE_BOTH);
+ }
+ old_data = node->data;
+ break;
+ }
+ parent = node;
+ if (c < 0) {
+ node = node->left;
+ } else {
+ node = node->right;
+ }
+ }
+ // allocate a new node if necessary
+ if (node == NULL) {
+#ifdef DB_ENABLE_STATS
+ if (stats.db_node_alloc != (unsigned int)~0) stats.db_node_alloc++;
+#endif /* DB_ENABLE_STATS */
+ node = ers_alloc(db->nodes, struct dbn);
+ node->left = NULL;
+ node->right = NULL;
+ node->deleted = 0;
+ db->item_count++;
+ if (c == 0) { // hash entry is empty
+ node->color = BLACK;
+ node->parent = NULL;
+ db->ht[hash] = node;
+ } else {
+ node->color = RED;
+ if (c < 0) { // put at the left
+ parent->left = node;
+ node->parent = parent;
+ } else { // put at the right
+ parent->right = node;
+ node->parent = parent;
+ }
+ if (parent->color == RED) // two consecutive RED nodes, must rebalance
+ db_rebalance(node, &db->ht[hash]);
+ }
+ }
+ // put key and data in the node
+ if (db->options&DB_OPT_DUP_KEY) {
+ node->key = db_dup_key(db, key);
+ if (db->options&DB_OPT_RELEASE_KEY)
+ db->release(key, data, DB_RELEASE_KEY);
+ } else {
+ node->key = key;
+ }
+ node->data = data;
+ db_free_unlock(db);
+ return old_data;
+}
+
+/**
+ * Remove an entry from the database.
+ * Returns the data of the entry.
+ * NOTE: The key (of the database) is released in {@link #db_free_add(Database,DBNode,DBNode *)}.
+ * @param self Interface of the database
+ * @param key Key that identifies the entry
+ * @return The data of the entry or NULL if not found
+ * @protected
+ * @see common\db.h#DBKey
+ * @see common\db.h#DBInterface
+ * @see #db_free_add(Database,DBNode,DBNode *)
+ * @see common\db.h\DBInterface#remove(DBInterface,DBKey)
+ */
+static void *db_obj_remove(DBInterface self, DBKey key)
+{
+ Database db = (Database)self;
+ void *data = NULL;
+ DBNode node;
+ unsigned int hash;
+ int c = 0;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_remove != (unsigned int)~0) stats.db_remove++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return NULL; // nullpo candidate
+ if (db->global_lock) {
+ ShowError("db_remove: Database is being destroyed. Aborting entry deletion.\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+ if (!(db->options&DB_OPT_ALLOW_NULL_KEY) && db_is_key_null(db->type, key)) {
+ ShowError("db_remove: Attempted to use non-allowed NULL key for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return NULL; // nullpo candidate
+ }
+
+ db_free_lock(db);
+ hash = db->hash(key, db->maxlen)%HASH_SIZE;
+ for(node = db->ht[hash]; node; ){
+ c = db->cmp(key, node->key, db->maxlen);
+ if (c == 0) {
+ if (!(node->deleted)) {
+ data = node->data;
+ db->release(node->key, node->data, DB_RELEASE_DATA);
+ db_free_add(db, node, &db->ht[hash]);
+ }
+ break;
+ }
+ if (c < 0)
+ node = node->left;
+ else
+ node = node->right;
+ }
+ db_free_unlock(db);
+ return data;
+}
+
+/**
+ * Apply <code>func</code> to every entry in the database.
+ * Returns the sum of values returned by func.
+ * @param self Interface of the database
+ * @param func Function to be applyed
+ * @param args Extra arguments for func
+ * @return Sum of the values returned by func
+ * @protected
+ * @see common\db.h#DBInterface
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)
+ */
+static int db_obj_vforeach(DBInterface self, DBApply func, va_list args)
+{
+ Database db = (Database)self;
+ unsigned int i;
+ int sum = 0;
+ DBNode node;
+ DBNode parent;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_vforeach != (unsigned int)~0) stats.db_vforeach++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return 0; // nullpo candidate
+ if (func == NULL) {
+ ShowError("db_foreach: Passed function is NULL for db allocated at %s:%d\n",db->alloc_file, db->alloc_line);
+ return 0; // nullpo candidate
+ }
+
+ db_free_lock(db);
+ for (i = 0; i < HASH_SIZE; i++) {
+ // Apply func in the order: current node, left node, right node
+ node = db->ht[i];
+ while (node) {
+ parent = node->parent;
+ if (!(node->deleted))
+ sum += func(node->key, node->data, args);
+ if (node->left) {
+ node = node->left;
+ continue;
+ }
+ if (node->right) {
+ node = node->right;
+ continue;
+ }
+ while (node) {
+ parent = node->parent;
+ if (parent && parent->right && parent->left == node) {
+ node = parent->right;
+ break;
+ }
+ node = parent;
+ }
+ }
+ }
+ db_free_unlock(db);
+ return sum;
+}
+
+/**
+ * Just calls {@link common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)}.
+ * Apply <code>func</code> to every entry in the database.
+ * Returns the sum of values returned by func.
+ * @param self Interface of the database
+ * @param func Function to be applyed
+ * @param ... Extra arguments for func
+ * @return Sum of the values returned by func
+ * @protected
+ * @see common\db.h#DBInterface
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h\DBInterface#vforeach(DBInterface,DBApply,va_list)
+ * @see common\db.h\DBInterface#foreach(DBInterface,DBApply,...)
+ */
+static int db_obj_foreach(DBInterface self, DBApply func, ...)
+{
+ va_list args;
+ int ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_foreach != (unsigned int)~0) stats.db_foreach++;
+#endif /* DB_ENABLE_STATS */
+ if (self == NULL) return 0; // nullpo candidate
+
+ va_start(args, func);
+ ret = self->vforeach(self, func, args);
+ va_end(args);
+ return ret;
+}
+
+/**
+ * Removes all entries from the database.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * @param self Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param args Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)
+ */
+static int db_obj_vclear(DBInterface self, DBApply func, va_list args)
+{
+ Database db = (Database)self;
+ int sum = 0;
+ unsigned int i;
+ DBNode node;
+ DBNode parent;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_vclear != (unsigned int)~0) stats.db_vclear++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return 0; // nullpo candidate
+
+ db_free_lock(db);
+ for (i = 0; i < HASH_SIZE; i++) {
+ // Apply the func and delete in the order: left tree, right tree, current node
+ node = db->ht[i];
+ db->ht[i] = NULL;
+ while (node) {
+ parent = node->parent;
+ if (node->left) {
+ node = node->left;
+ continue;
+ }
+ if (node->right) {
+ node = node->right;
+ continue;
+ }
+ if (node->deleted) {
+ db_dup_key_free(db, node->key);
+ } else {
+ if (func)
+ sum += func(node->key, node->data, args);
+ db->release(node->key, node->data, DB_RELEASE_BOTH);
+ node->deleted = 1;
+ }
+#ifdef DB_ENABLE_STATS
+ if (stats.db_node_free != (unsigned int)~0) stats.db_node_free++;
+#endif /* DB_ENABLE_STATS */
+ ers_free(db->nodes, node);
+ if (parent) {
+ if (parent->left == node)
+ parent->left = NULL;
+ else
+ parent->right = NULL;
+ }
+ node = parent;
+ }
+ db->ht[i] = NULL;
+ }
+ db->free_count = 0;
+ db->item_count = 0;
+ db_free_unlock(db);
+ return sum;
+}
+
+/**
+ * Just calls {@link common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)}.
+ * Removes all entries from the database.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * NOTE: This locks the database globally. Any attempt to insert or remove
+ * a database entry will give an error and be aborted (except for clearing).
+ * @param self Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param ... Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vclear(DBInterface,DBApply,va_list)
+ * @see common\db.h\DBInterface#clear(DBInterface,DBApply,...)
+ */
+static int db_obj_clear(DBInterface self, DBApply func, ...)
+{
+ va_list args;
+ int ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_clear != (unsigned int)~0) stats.db_clear++;
+#endif /* DB_ENABLE_STATS */
+ if (self == NULL) return 0; // nullpo candidate
+
+ va_start(args, func);
+ ret = self->vclear(self, func, args);
+ va_end(args);
+ return ret;
+}
+
+/**
+ * Finalize the database, feeing all the memory it uses.
+ * Before deleting an entry, func is applyed to it.
+ * Returns the sum of values returned by func, if it exists.
+ * NOTE: This locks the database globally. Any attempt to insert or remove
+ * a database entry will give an error and be aborted (except for clearing).
+ * @param self Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param args Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vdestroy(DBInterface,DBApply,va_list)
+ */
+static int db_obj_vdestroy(DBInterface self, DBApply func, va_list args)
+{
+ Database db = (Database)self;
+ int sum;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_vdestroy != (unsigned int)~0) stats.db_vdestroy++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return 0; // nullpo candidate
+ if (db->global_lock) {
+ ShowError("db_vdestroy: Database is already locked for destruction. Aborting second database destruction.\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line);
+ return 0;
+ }
+ if (db->free_lock)
+ ShowWarning("db_vdestroy: Database is still in use, %u lock(s) left. Continuing database destruction.\n"
+ "Database allocated at %s:%d\n",
+ db->alloc_file, db->alloc_line, db->free_lock);
+
+#ifdef DB_ENABLE_STATS
+ switch (db->type) {
+ case DB_INT:
+ stats.db_int_destroy++;
+ break;
+ case DB_UINT:
+ stats.db_uint_destroy++;
+ break;
+ case DB_STRING:
+ stats.db_string_destroy++;
+ break;
+ case DB_ISTRING:
+ stats.db_istring_destroy++;
+ break;
+ }
+#endif /* DB_ENABLE_STATS */
+ db_free_lock(db);
+ db->global_lock = 1;
+ sum = self->vclear(self, func, args);
+ aFree(db->free_list);
+ db->free_list = NULL;
+ db->free_max = 0;
+ ers_destroy(db->nodes);
+ db_free_unlock(db);
+ aFree(db);
+ return sum;
+}
+
+/**
+ * Just calls {@link common\db.h\DBInterface#db_vdestroy(DBInterface,DBApply,va_list)}.
+ * Finalize the database, feeing all the memory it uses.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * NOTE: This locks the database globally. Any attempt to insert or remove
+ * a database entry will give an error and be aborted.
+ * @param self Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param ... Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see common\db.h#DBApply(DBKey,void *,va_list)
+ * @see common\db.h#DBInterface
+ * @see common\db.h\DBInterface#vdestroy(DBInterface,DBApply,va_list)
+ * @see common\db.h\DBInterface#destroy(DBInterface,DBApply,...)
+ */
+static int db_obj_destroy(DBInterface self, DBApply func, ...)
+{
+ va_list args;
+ int ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_destroy != (unsigned int)~0) stats.db_destroy++;
+#endif /* DB_ENABLE_STATS */
+ if (self == NULL) return 0; // nullpo candidate
+
+ va_start(args, func);
+ ret = self->vdestroy(self, func, args);
+ va_end(args);
+ return ret;
+}
+
+/**
+ * Return the size of the database (number of items in the database).
+ * @param self Interface of the database
+ * @return Size of the database
+ * @protected
+ * @see common\db.h#DBInterface
+ * @see Database#item_count
+ * @see common\db.h\DBInterface#size(DBInterface)
+ */
+static unsigned int db_obj_size(DBInterface self)
+{
+ Database db = (Database)self;
+ unsigned int item_count;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_size != (unsigned int)~0) stats.db_size++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return 0; // nullpo candidate
+
+ db_free_lock(db);
+ item_count = db->item_count;
+ db_free_unlock(db);
+
+ return item_count;
+}
+
+/**
+ * Return the type of database.
+ * @param self Interface of the database
+ * @return Type of the database
+ * @protected
+ * @see common\db.h#DBType
+ * @see common\db.h#DBInterface
+ * @see Database#type
+ * @see common\db.h\DBInterface#type(DBInterface)
+ */
+static DBType db_obj_type(DBInterface self)
+{
+ Database db = (Database)self;
+ DBType type;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_type != (unsigned int)~0) stats.db_type++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return -1; // nullpo candidate - TODO what should this return?
+
+ db_free_lock(db);
+ type = db->type;
+ db_free_unlock(db);
+
+ return type;
+}
+
+/**
+ * Return the options of the database.
+ * @param self Interface of the database
+ * @return Options of the database
+ * @protected
+ * @see common\db.h#DBOptions
+ * @see common\db.h#DBInterface
+ * @see Database#options
+ * @see common\db.h\DBInterface#options(DBInterface)
+ */
+static DBOptions db_obj_options(DBInterface self)
+{
+ Database db = (Database)self;
+ DBOptions options;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_options != (unsigned int)~0) stats.db_options++;
+#endif /* DB_ENABLE_STATS */
+ if (db == NULL) return DB_OPT_BASE; // nullpo candidate - TODO what should this return?
+
+ db_free_lock(db);
+ options = db->options;
+ db_free_unlock(db);
+
+ return options;
+}
+
+/*****************************************************************************\
+ * (5) Section with public functions. *
+ * db_fix_options - Apply database type restrictions to the options. *
+ * db_default_cmp - Get the default comparator for a type of database. *
+ * db_default_hash - Get the default hasher for a type of database. *
+ * db_default_release - Get the default releaser for a type of database *
+ * with the specified options. *
+ * db_custom_release - Get a releaser that behaves a certains way. *
+ * db_alloc - Allocate a new database. *
+ * db_i2key - Manual cast from 'int' to 'DBKey'. *
+ * db_ui2key - Manual cast from 'unsigned int' to 'DBKey'. *
+ * db_str2key - Manual cast from 'unsigned char *' to 'DBKey'. *
+ * db_init - Initialize the database system. *
+ * db_final - Finalize the database system. *
+\*****************************************************************************/
+
+/**
+ * Returns the fixed options according to the database type.
+ * Sets required options and unsets unsupported options.
+ * For numeric databases DB_OPT_DUP_KEY and DB_OPT_RELEASE_KEY are unset.
+ * @param type Type of the database
+ * @param options Original options of the database
+ * @return Fixed options of the database
+ * @private
+ * @see common\db.h#DBType
+ * @see common\db.h#DBOptions
+ * @see #db_default_release(DBType,DBOptions)
+ * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ * @see common\db.h#db_fix_options(DBType,DBOptions)
+ */
+DBOptions db_fix_options(DBType type, DBOptions options)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_fix_options != (unsigned int)~0) stats.db_fix_options++;
+#endif /* DB_ENABLE_STATS */
+ switch (type) {
+ case DB_INT:
+ case DB_UINT: // Numeric database, do nothing with the keys
+ return options&~(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY);
+
+ default:
+ ShowError("db_fix_options: Unknown database type %u with options %x\n", type, options);
+ case DB_STRING:
+ case DB_ISTRING: // String databases, no fix required
+ return options;
+ }
+}
+
+/**
+ * Returns the default comparator for the specified type of database.
+ * @param type Type of database
+ * @return Comparator for the type of database or NULL if unknown database
+ * @public
+ * @see common\db.h#DBType
+ * @see #db_int_cmp(DBKey,DBKey,unsigned short)
+ * @see #db_uint_cmp(DBKey,DBKey,unsigned short)
+ * @see #db_string_cmp(DBKey,DBKey,unsigned short)
+ * @see #db_istring_cmp(DBKey,DBKey,unsigned short)
+ * @see common\db.h#db_default_cmp(DBType)
+ */
+DBComparator db_default_cmp(DBType type)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_default_cmp != (unsigned int)~0) stats.db_default_cmp++;
+#endif /* DB_ENABLE_STATS */
+ switch (type) {
+ case DB_INT: return db_int_cmp;
+ case DB_UINT: return db_uint_cmp;
+ case DB_STRING: return db_string_cmp;
+ case DB_ISTRING: return db_istring_cmp;
+ default:
+ ShowError("db_default_cmp: Unknown database type %u\n", type);
+ return NULL;
+ }
+}
+
+/**
+ * Returns the default hasher for the specified type of database.
+ * @param type Type of database
+ * @return Hasher of the type of database or NULL if unknown database
+ * @public
+ * @see common\db.h#DBType
+ * @see #db_int_hash(DBKey,unsigned short)
+ * @see #db_uint_hash(DBKey,unsigned short)
+ * @see #db_string_hash(DBKey,unsigned short)
+ * @see #db_istring_hash(DBKey,unsigned short)
+ * @see common\db.h#db_default_hash(DBType)
+ */
+DBHasher db_default_hash(DBType type)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_default_hash != (unsigned int)~0) stats.db_default_hash++;
+#endif /* DB_ENABLE_STATS */
+ switch (type) {
+ case DB_INT: return db_int_hash;
+ case DB_UINT: return db_uint_hash;
+ case DB_STRING: return db_string_hash;
+ case DB_ISTRING: return db_istring_hash;
+ default:
+ ShowError("db_default_hash: Unknown database type %u\n", type);
+ return NULL;
+ }
+}
+
+/**
+ * Returns the default releaser for the specified type of database with the
+ * specified options.
+ * NOTE: the options are fixed with {@link #db_fix_options(DBType,DBOptions)}
+ * before choosing the releaser.
+ * @param type Type of database
+ * @param options Options of the database
+ * @return Default releaser for the type of database with the specified options
+ * @public
+ * @see common\db.h#DBType
+ * @see common\db.h#DBOptions
+ * @see common\db.h#DBReleaser
+ * @see #db_release_nothing(DBKey,void *,DBRelease)
+ * @see #db_release_key(DBKey,void *,DBRelease)
+ * @see #db_release_data(DBKey,void *,DBRelease)
+ * @see #db_release_both(DBKey,void *,DBRelease)
+ * @see #db_custom_release(DBRelease)
+ * @see common\db.h#db_default_release(DBType,DBOptions)
+ */
+DBReleaser db_default_release(DBType type, DBOptions options)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_default_release != (unsigned int)~0) stats.db_default_release++;
+#endif /* DB_ENABLE_STATS */
+ options = db_fix_options(type, options);
+ if (options&DB_OPT_RELEASE_DATA) { // Release data, what about the key?
+ if (options&(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY))
+ return db_release_both; // Release both key and data
+ return db_release_data; // Only release data
+ }
+ if (options&(DB_OPT_DUP_KEY|DB_OPT_RELEASE_KEY))
+ return db_release_key; // Only release key
+ return db_release_nothing; // Release nothing
+}
+
+/**
+ * Returns the releaser that releases the specified release options.
+ * @param which Options that specified what the releaser releases
+ * @return Releaser for the specified release options
+ * @public
+ * @see common\db.h#DBRelease
+ * @see common\db.h#DBReleaser
+ * @see #db_release_nothing(DBKey,void *,DBRelease)
+ * @see #db_release_key(DBKey,void *,DBRelease)
+ * @see #db_release_data(DBKey,void *,DBRelease)
+ * @see #db_release_both(DBKey,void *,DBRelease)
+ * @see #db_default_release(DBType,DBOptions)
+ * @see common\db.h#db_custom_release(DBRelease)
+ */
+DBReleaser db_custom_release(DBRelease which)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_custom_release != (unsigned int)~0) stats.db_custom_release++;
+#endif /* DB_ENABLE_STATS */
+ switch (which) {
+ case DB_RELEASE_NOTHING: return db_release_nothing;
+ case DB_RELEASE_KEY: return db_release_key;
+ case DB_RELEASE_DATA: return db_release_data;
+ case DB_RELEASE_BOTH: return db_release_both;
+ default:
+ ShowError("db_custom_release: Unknown release options %u\n", which);
+ return NULL;
+ }
+}
+
+/**
+ * Allocate a new database of the specified type.
+ * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
+ * before creating the database.
+ * @param file File where the database is being allocated
+ * @param line Line of the file where the database is being allocated
+ * @param type Type of database
+ * @param options Options of the database
+ * @param maxlen Maximum length of the string to be used as key in string
+ * databases
+ * @return The interface of the database
+ * @public
+ * @see common\db.h#DBType
+ * @see common\db.h#DBInterface
+ * @see #Database
+ * @see #db_fix_options(DBType,DBOptions)
+ * @see common\db.h#db_alloc(const char *,int,DBType,unsigned short)
+ */
+DBInterface db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen)
+{
+ Database db;
+ unsigned int i;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_alloc != (unsigned int)~0) stats.db_alloc++;
+ switch (type) {
+ case DB_INT:
+ stats.db_int_alloc++;
+ break;
+ case DB_UINT:
+ stats.db_uint_alloc++;
+ break;
+ case DB_STRING:
+ stats.db_string_alloc++;
+ break;
+ case DB_ISTRING:
+ stats.db_istring_alloc++;
+ break;
+ }
+#endif /* DB_ENABLE_STATS */
+ CREATE(db, struct db, 1);
+
+ options = db_fix_options(type, options);
+ /* Interface of the database */
+ db->dbi.get = db_obj_get;
+ db->dbi.getall = db_obj_getall;
+ db->dbi.vgetall = db_obj_vgetall;
+ db->dbi.ensure = db_obj_ensure;
+ db->dbi.vensure = db_obj_vensure;
+ db->dbi.put = db_obj_put;
+ db->dbi.remove = db_obj_remove;
+ db->dbi.foreach = db_obj_foreach;
+ db->dbi.vforeach = db_obj_vforeach;
+ db->dbi.clear = db_obj_clear;
+ db->dbi.vclear = db_obj_vclear;
+ db->dbi.destroy = db_obj_destroy;
+ db->dbi.vdestroy = db_obj_vdestroy;
+ db->dbi.size = db_obj_size;
+ db->dbi.type = db_obj_type;
+ db->dbi.options = db_obj_options;
+ /* File and line of allocation */
+ db->alloc_file = file;
+ db->alloc_line = line;
+ /* Lock system */
+ db->free_list = NULL;
+ db->free_count = 0;
+ db->free_max = 0;
+ db->free_lock = 0;
+ /* Other */
+ db->nodes = ers_new((uint32)sizeof(struct dbn));
+ db->cmp = db_default_cmp(type);
+ db->hash = db_default_hash(type);
+ db->release = db_default_release(type, options);
+ for (i = 0; i < HASH_SIZE; i++)
+ db->ht[i] = NULL;
+ db->type = type;
+ db->options = options;
+ db->item_count = 0;
+ db->maxlen = maxlen;
+ db->global_lock = 0;
+
+ return &db->dbi;
+}
+
+#ifdef DB_MANUAL_CAST_TO_UNION
+/**
+ * Manual cast from 'int' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see common\db.h#DB_MANUAL_CAST_TO_UNION
+ * @see #db_ui2key(unsigned int)
+ * @see #db_str2key(unsigned char *)
+ * @see common\db.h#db_i2key(int)
+ */
+DBKey db_i2key(int key)
+{
+ DBKey ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_i2key != (unsigned int)~0) stats.db_i2key++;
+#endif /* DB_ENABLE_STATS */
+ ret.i = key;
+ return ret;
+}
+
+/**
+ * Manual cast from 'unsigned int' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see common\db.h#DB_MANUAL_CAST_TO_UNION
+ * @see #db_i2key(int)
+ * @see #db_str2key(unsigned char *)
+ * @see common\db.h#db_ui2key(unsigned int)
+ */
+DBKey db_ui2key(unsigned int key)
+{
+ DBKey ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_ui2key != (unsigned int)~0) stats.db_ui2key++;
+#endif /* DB_ENABLE_STATS */
+ ret.ui = key;
+ return ret;
+}
+
+/**
+ * Manual cast from 'unsigned char *' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see common\db.h#DB_MANUAL_CAST_TO_UNION
+ * @see #db_i2key(int)
+ * @see #db_ui2key(unsigned int)
+ * @see common\db.h#db_str2key(unsigned char *)
+ */
+DBKey db_str2key(unsigned char *key)
+{
+ DBKey ret;
+
+#ifdef DB_ENABLE_STATS
+ if (stats.db_str2key != (unsigned int)~0) stats.db_str2key++;
+#endif /* DB_ENABLE_STATS */
+ ret.str = key;
+ return ret;
+}
+#endif /* DB_MANUAL_CAST_TO_UNION */
+
+/**
+ * Initialize the database system.
+ * @public
+ * @see #db_final(void)
+ * @see common\db.h#db_init(void)
+ */
+void db_init(void)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_init != (unsigned int)~0) stats.db_init++;
+#endif /* DB_ENABLE_STATS */
+}
+
+/**
+ * Finalize the database system.
+ * Frees the memory used by the block reusage system.
+ * @public
+ * @see common\db.h#DB_FINAL_NODE_CHECK
+ * @see #db_init(void)
+ * @see common\db.h#db_final(void)
+ */
+void db_final(void)
+{
+#ifdef DB_ENABLE_STATS
+ if (stats.db_final != (unsigned int)~0)
+ stats.db_final++;
+ ShowInfo(CL_WHITE"Database nodes"CL_RESET":\n"
+ "allocated %u, freed %u\n",
+ stats.db_node_alloc, stats.db_node_free);
+ ShowInfo(CL_WHITE"Database types"CL_RESET":\n"
+ "DB_INT : allocated %10u, destroyed %10u\n"
+ "DB_UINT : allocated %10u, destroyed %10u\n"
+ "DB_STRING : allocated %10u, destroyed %10u\n"
+ "DB_ISTRING : allocated %10u, destroyed %10u\n",
+ stats.db_int_alloc, stats.db_int_destroy,
+ stats.db_uint_alloc, stats.db_uint_destroy,
+ stats.db_string_alloc, stats.db_string_destroy,
+ stats.db_istring_alloc, stats.db_istring_destroy);
+ ShowInfo(CL_WHITE"Database function counters"CL_RESET":\n"
+ "db_rotate_left %10u, db_rotate_right %10u,\n"
+ "db_rebalance %10u, db_rebalance_erase %10u,\n"
+ "db_is_key_null %10u,\n"
+ "db_dup_key %10u, db_dup_key_free %10u,\n"
+ "db_free_add %10u, db_free_remove %10u,\n"
+ "db_free_lock %10u, db_free_unlock %10u,\n"
+ "db_int_cmp %10u, db_uint_cmp %10u,\n"
+ "db_string_cmp %10u, db_istring_cmp %10u,\n"
+ "db_int_hash %10u, db_uint_hash %10u,\n"
+ "db_string_hash %10u, db_istring_hash %10u,\n"
+ "db_release_nothing %10u, db_release_key %10u,\n"
+ "db_release_data %10u, db_release_both %10u,\n"
+ "db_get %10u,\n"
+ "db_getall %10u, db_vgetall %10u,\n"
+ "db_ensure %10u, db_vensure %10u,\n"
+ "db_put %10u, db_remove %10u,\n"
+ "db_foreach %10u, db_vforeach %10u,\n"
+ "db_clear %10u, db_vclear %10u,\n"
+ "db_destroy %10u, db_vdestroy %10u,\n"
+ "db_size %10u, db_type %10u,\n"
+ "db_options %10u, db_fix_options %10u,\n"
+ "db_default_cmp %10u, db_default_hash %10u,\n"
+ "db_default_release %10u, db_custom_release %10u,\n"
+ "db_alloc %10u, db_i2key %10u,\n"
+ "db_ui2key %10u, db_str2key %10u,\n"
+ "db_init %10u, db_final %10u\n",
+ stats.db_rotate_left, stats.db_rotate_right,
+ stats.db_rebalance, stats.db_rebalance_erase,
+ stats.db_is_key_null,
+ stats.db_dup_key, stats.db_dup_key_free,
+ stats.db_free_add, stats.db_free_remove,
+ stats.db_free_lock, stats.db_free_unlock,
+ stats.db_int_cmp, stats.db_uint_cmp,
+ stats.db_string_cmp, stats.db_istring_cmp,
+ stats.db_int_hash, stats.db_uint_hash,
+ stats.db_string_hash, stats.db_istring_hash,
+ stats.db_release_nothing, stats.db_release_key,
+ stats.db_release_data, stats.db_release_both,
+ stats.db_get,
+ stats.db_getall, stats.db_vgetall,
+ stats.db_ensure, stats.db_vensure,
+ stats.db_put, stats.db_remove,
+ stats.db_foreach, stats.db_vforeach,
+ stats.db_clear, stats.db_vclear,
+ stats.db_destroy, stats.db_vdestroy,
+ stats.db_size, stats.db_type,
+ stats.db_options, stats.db_fix_options,
+ stats.db_default_cmp, stats.db_default_hash,
+ stats.db_default_release, stats.db_custom_release,
+ stats.db_alloc, stats.db_i2key,
+ stats.db_ui2key, stats.db_str2key,
+ stats.db_init, stats.db_final);
+#endif /* DB_ENABLE_STATS */
+}
+
+// Link DB System - jAthena
+void linkdb_insert( struct linkdb_node** head, void *key, void* data) {
+ struct linkdb_node *node;
+ if( head == NULL ) return ;
+ node = aMalloc( sizeof(struct linkdb_node) );
+ if( *head == NULL ) {
+ // first node
+ *head = node;
+ node->prev = NULL;
+ node->next = NULL;
+ } else {
+ // link nodes
+ node->next = *head;
+ node->prev = (*head)->prev;
+ (*head)->prev = node;
+ (*head) = node;
+ }
+ node->key = key;
+ node->data = data;
+}
+
+void* linkdb_search( struct linkdb_node** head, void *key) {
+ int n = 0;
+ struct linkdb_node *node;
+ if( head == NULL ) return NULL;
+ node = *head;
+ while( node ) {
+ if( node->key == key ) {
+ if( node->prev && n > 5 ) {
+ // ˆ—Œø—¦‰ü‘P‚ׂ̈Éhead‚Ɉړ®‚³‚¹‚é
+ if(node->prev) node->prev->next = node->next;
+ if(node->next) node->next->prev = node->prev;
+ node->next = *head;
+ node->prev = (*head)->prev;
+ (*head)->prev = node;
+ (*head) = node;
+ }
+ return node->data;
+ }
+ node = node->next;
+ n++;
+ }
+ return NULL;
+}
+
+void* linkdb_erase( struct linkdb_node** head, void *key) {
+ struct linkdb_node *node;
+ if( head == NULL ) return NULL;
+ node = *head;
+ while( node ) {
+ if( node->key == key ) {
+ void *data = node->data;
+ if( node->prev == NULL )
+ *head = node->next;
+ else
+ node->prev->next = node->next;
+ if( node->next )
+ node->next->prev = node->prev;
+ aFree( node );
+ return data;
+ }
+ node = node->next;
+ }
+ return NULL;
+}
+
+void linkdb_replace( struct linkdb_node** head, void *key, void *data ) {
+ int n = 0;
+ struct linkdb_node *node;
+ if( head == NULL ) return ;
+ node = *head;
+ while( node ) {
+ if( node->key == key ) {
+ if( node->prev && n > 5 ) {
+ // ˆ—Œø—¦‰ü‘P‚ׂ̈Éhead‚Ɉړ®‚³‚¹‚é
+ if(node->prev) node->prev->next = node->next;
+ if(node->next) node->next->prev = node->prev;
+ node->next = *head;
+ node->prev = (*head)->prev;
+ (*head)->prev = node;
+ (*head) = node;
+ }
+ node->data = data;
+ return ;
+ }
+ node = node->next;
+ n++;
+ }
+ // Œ©‚‚©‚ç‚È‚¢‚Ì‚Å‘}“ü
+ linkdb_insert( head, key, data );
+}
+
+void linkdb_final( struct linkdb_node** head ) {
+ struct linkdb_node *node, *node2;
+ if( head == NULL ) return ;
+ node = *head;
+ while( node ) {
+ node2 = node->next;
+ aFree( node );
+ node = node2;
+ }
+ *head = NULL;
+}
+
diff --git a/src/common/db.h b/src/common/db.h
index 0b6fc08c5..b17ae27f9 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -1,748 +1,748 @@
-/*****************************************************************************\
- * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
- * For more information, see LICENCE in the main folder *
- * *
- * This file is separated in two sections: *
- * (1) public typedefs, enums, unions, structures and defines *
- * (2) public functions *
- * *
- * <B>Notes on the release system:</B> *
- * Whenever an entry is removed from the database both the key and the *
- * data are requested to be released. *
- * At least one entry is removed when replacing an entry, removing an *
- * entry, clearing the database or destroying the database. *
- * What is actually released is defined by the release function, the *
- * functions of the database only ask for the key and/or data to be *
- * released. *
- * *
- * TODO: *
- * - create an enum for the data (with int, unsigned int and void *) *
- * - create a custom database allocator *
- * - see what functions need or should be added to the database interface *
- * *
- * HISTORY: *
- * 2.1 (Athena build #???#) - Portability fix *
- * - Fixed the portability of casting to union and added the functions *
- * {@link DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)} and *
- * {@link DBInterface#clear(DBInterface,DBApply,...)}. *
- * 2.0 (Athena build 4859) - Transition version *
- * - Almost everything recoded with a strategy similar to objects, *
- * database structure is maintained. *
- * 1.0 (up to Athena build 4706) *
- * - Previous database system. *
- * *
- * @version 2.1 (Athena build #???#) - Portability fix *
- * @author (Athena build 4859) Flavio @ Amazon Project *
- * @author (up to Athena build 4706) Athena Dev Teams *
- * @encoding US-ASCII *
- * @see common#db.c *
-\*****************************************************************************/
-#ifndef _DB_H_
-#define _DB_H_
-
-#include <stdarg.h>
-
-/*****************************************************************************\
- * (1) Section with public typedefs, enums, unions, structures and defines. *
- * DB_MANUAL_CAST_TO_UNION - Define when the compiler doesn't allow casting *
- * to unions. *
- * DBRelease - Enumeration of release options. *
- * DBType - Enumeration of database types. *
- * DBOptions - Bitfield enumeration of database options. *
- * DBKey - Union of used key types. *
- * DBApply - Format of functions applyed to the databases. *
- * DBMatcher - Format of matchers used in DBInterface->getall. *
- * DBComparator - Format of the comparators used by the databases. *
- * DBHasher - Format of the hashers used by the databases. *
- * DBReleaser - Format of the releasers used by the databases. *
- * DBInterface - Structure of the interface of the database. *
-\*****************************************************************************/
-
-/**
- * Define this to enable the functions that cast to unions.
- * Required when the compiler doesn't support casting to unions.
- * NOTE: It is recommened that the conditional tests to determine if this
- * should be defined be located in a makefile or a header file specific for
- * of compatibility and portability issues.
- * @public
- * @see #db_i2key(int)
- * @see #db_ui2key(unsigned int)
- * @see #db_str2key(unsigned char *)
- */
-//#define DB_MANUAL_CAST_TO_UNION
-
-/**
- * Bitfield with what should be released by the releaser function (if the
- * function supports it).
- * @public
- * @see #DBReleaser
- * @see #db_custom_release(DBRelease)
- */
-typedef enum {
- DB_RELEASE_NOTHING = 0,
- DB_RELEASE_KEY = 1,
- DB_RELEASE_DATA = 2,
- DB_RELEASE_BOTH = 3
-} DBRelease;
-
-/**
- * Supported types of database.
- * See {@link #db_fix_options(DBType,DBOptions)} for restrictions of the
- * types of databases.
- * @param DB_INT Uses int's for keys
- * @param DB_UINT Uses unsigned int's for keys
- * @param DB_STRING Uses strings for keys.
- * @param DB_ISTRING Uses case insensitive strings for keys.
- * @public
- * @see #DBOptions
- * @see #DBKey
- * @see #db_fix_options(DBType,DBOptions)
- * @see #db_default_cmp(DBType)
- * @see #db_default_hash(DBType)
- * @see #db_default_release(DBType,DBOptions)
- * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
- */
-typedef enum {
- DB_INT,
- DB_UINT,
- DB_STRING,
- DB_ISTRING
-} DBType;
-
-/**
- * Bitfield of options that define the behaviour of the database.
- * See {@link #db_fix_options(DBType,DBOptions)} for restrictions of the
- * types of databases.
- * @param DB_OPT_BASE Base options: does not duplicate keys, releases nothing
- * and does not allow NULL keys or NULL data.
- * @param DB_OPT_DUP_KEY Duplicates the keys internally. If DB_OPT_RELEASE_KEY
- * is defined, the real key is freed as soon as the entry is added.
- * @param DB_OPT_RELEASE_KEY Releases the key.
- * @param DB_OPT_RELEASE_DATA Releases the data whenever an entry is removed
- * from the database.
- * WARNING: for funtions that return the data (like DBInterface->remove),
- * a dangling pointer will be returned.
- * @param DB_OPT_RELEASE_BOTH Releases both key and data.
- * @param DB_OPT_ALLOW_NULL_KEY Allow NULL keys in the database.
- * @param DB_OPT_ALLOW_NULL_DATA Allow NULL data in the database.
- * @public
- * @see #db_fix_options(DBType,DBOptions)
- * @see #db_default_release(DBType,DBOptions)
- * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
- */
-typedef enum {
- DB_OPT_BASE = 0,
- DB_OPT_DUP_KEY = 1,
- DB_OPT_RELEASE_KEY = 2,
- DB_OPT_RELEASE_DATA = 4,
- DB_OPT_RELEASE_BOTH = 6,
- DB_OPT_ALLOW_NULL_KEY = 8,
- DB_OPT_ALLOW_NULL_DATA = 16,
-} DBOptions;
-
-/**
- * Union of key types used by the database.
- * @param i Type of key for DB_INT databases
- * @param ui Type of key for DB_UINT databases
- * @param str Type of key for DB_STRING and DB_ISTRING databases
- * @public
- * @see #DBType
- * @see #DBApply(DBKey,void *,va_list)
- * @see #DBMatcher(DBKey,void *,va_list)
- * @see #DBComparator(DBKey,DBKey,unsigned short)
- * @see #DBHasher(DBKey,unsigned short)
- * @see #DBReleaser(DBKey,void *,DBRelease)
- * @see DBInterface#get(DBInterface,DBKey)
- * @see DBInterface#put(DBInterface,DBKey,void *)
- * @see DBInterface#remove(DBInterface,DBKey)
- */
-typedef union {
- int i;
- unsigned int ui;
- unsigned char *str;
-} DBKey;
-
-/**
- * Format of funtions that create the data for the key when the entry doesn't
- * exist in the database yet.
- * @param key Key of the database entry
- * @param args Extra arguments of the funtion
- * @return Data identified by the key to be put in the database
- * @public
- * @see #DBKey
- * @see DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
- * @see DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
- */
-typedef void *(*DBCreateData)(DBKey key, va_list args);
-
-/**
- * Format of functions to be applyed to an unspecified quantity of entries of
- * a database.
- * Any function that applyes this function to the database will return the sum
- * of values returned by this function.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param args Extra arguments of the funtion
- * @return Value to be added up by the funtion that is applying this
- * @public
- * @see #DBKey
- * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
- * @see DBInterface#foreach(DBInterface,DBApply,...)
- * @see DBInterface#vdestroy(DBInterface,DBApply,va_list)
- * @see DBInterface#destroy(DBInterface,DBApply,...)
- */
-typedef int (*DBApply)(DBKey key, void *data, va_list args);
-
-/**
- * Format of functions that match database entries.
- * The purpose of the match depends on the function that is calling the matcher.
- * Returns 0 if it is a match, another number otherwise.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param args Extra arguments of the function
- * @return 0 if a match, another number otherwise
- * @public
- * @see #DBKey
- * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatcher,...)
- */
-typedef int (*DBMatcher)(DBKey key, void *data, va_list args);
-
-/**
- * Format of the comparators used internally by the database system.
- * Compares key1 to key2.
- * <code>maxlen</code> is the maximum number of character used in DB_STRING and
- * DB_ISTRING databases. If 0, the maximum number of maxlen is used (64K).
- * Returns 0 is equal, negative if lower and positive is higher.
- * @param key1 Key being compared
- * @param key2 Key we are comparing to
- * @param maxlen Maximum number of characters used in DB_STRING and DB_ISTRING
- * databases.
- * @return 0 if equal, negative if lower and positive if higher
- * @public
- * @see #DBKey
- * @see #db_default_cmp(DBType)
- */
-typedef int (*DBComparator)(DBKey key1, DBKey key2, unsigned short maxlen);
-
-/**
- * Format of the hashers used internally by the database system.
- * Creates the hash of the key.
- * <code>maxlen</code> is the maximum number of character used in DB_STRING and
- * DB_ISTRING databases. If 0, the maximum number of maxlen is used (64K).
- * @param key Key being hashed
- * @param maxlen Maximum number of characters used in DB_STRING and DB_ISTRING
- * databases.
- * @return Hash of the key
- * @public
- * @see #DBKey
- * @see #db_default_hash(DBType)
- */
-typedef unsigned int (*DBHasher)(DBKey key, unsigned short maxlen);
-
-/**
- * Format of the releaser used by the database system.
- * Releases nothing, the key, the data or both.
- * All standard releasers use aFree to release.
- * @param key Key of the database entry
- * @param data Data of the database entry
- * @param which What is being requested to be released
- * @public
- * @see #DBRelease
- * @see #DBKey
- * @see #db_default_releaser(DBType,DBOptions)
- * @see #db_custom_release(DBRelease)
- */
-typedef void (*DBReleaser)(DBKey key, void *data, DBRelease which);
-
-/**
- * Public interface of a database. Only contains funtions.
- * All the functions take the interface as the first argument.
- * @public
- * @see DBInterface#get(DBInterface,DBKey)
- * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
- * @see DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
- * @see DBInterface#put(DBInterface,DBKey,void *)
- * @see DBInterface#remove(DBInterface,DBKey)
- * @see DBInterface#foreach(DBInterface,DBApply,...)
- * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
- * @see DBInterface#destroy(DBInterface,DBApply,...)
- * @see DBInterface#destroy(DBInterface,DBApply,va_list)
- * @see DBInterface#size(DBInterface)
- * @see DBInterface#type(DBInterface)
- * @see DBInterface#options(DBInterface)
- * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
- */
-typedef struct dbt {
-
- /**
- * Get the data of the entry identifid by the key.
- * @param dbi Interface of the database
- * @param key Key that identifies the entry
- * @return Data of the entry or NULL if not found
- * @protected
- * @see #DBKey
- * @see #DBInterface
- * @see common\db.c#db_get(DBInterface,DBKey)
- */
- void *(*get)(struct dbt *dbi, DBKey key);
-
- /**
- * Just calls {@link DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)}.
- * Get the data of the entries matched by <code>match</code>.
- * It puts a maximum of <code>max</code> entries into <code>buf</code>.
- * If <code>buf</code> is NULL, it only counts the matches.
- * Returns the number of entries that matched.
- * NOTE: if the value returned is greater than <code>max</code>, only the
- * first <code>max</code> entries found are put into the buffer.
- * @param dbi Interface of the database
- * @param buf Buffer to put the data of the matched entries
- * @param max Maximum number of data entries to be put into buf
- * @param match Function that matches the database entries
- * @param ... Extra arguments for match
- * @return The number of entries that matched
- * @protected
- * @see #DBMatcher(DBKey key, void *data, va_list args)
- * @see #DBInterface
- * @see DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
- * @see common\db.c#db_getall(DBInterface,void **,unsigned int,DBMatch,...)
- */
- unsigned int (*getall)(struct dbt *dbi, void **buf, unsigned int max, DBMatcher match, ...);
-
- /**
- * Get the data of the entries matched by <code>match</code>.
- * It puts a maximum of <code>max</code> entries into <code>buf</code>.
- * If <code>buf</code> is NULL, it only counts the matches.
- * Returns the number of entries that matched.
- * NOTE: if the value returned is greater than <code>max</code>, only the
- * first <code>max</code> entries found are put into the buffer.
- * @param dbi Interface of the database
- * @param buf Buffer to put the data of the matched entries
- * @param max Maximum number of data entries to be put into buf
- * @param match Function that matches the database entries
- * @param ... Extra arguments for match
- * @return The number of entries that matched
- * @protected
- * @see #DBMatcher(DBKey key, void *data, va_list args)
- * @see #DBInterface
- * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
- * @see common\db.c#db_vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
- */
- unsigned int (*vgetall)(struct dbt *dbi, void **buf, unsigned int max, DBMatcher match, va_list args);
-
- /**
- * Just calls {@link common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)}.
- * Get the data of the entry identified by the key.
- * If the entry does not exist, an entry is added with the data returned by
- * <code>create</code>.
- * @param dbi Interface of the database
- * @param key Key that identifies the entry
- * @param create Function used to create the data if the entry doesn't exist
- * @param ... Extra arguments for create
- * @return Data of the entry
- * @protected
- * @see #DBKey
- * @see #DBCreateData
- * @see #DBInterface
- * @see DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
- * @see common\db.c#db_ensure(DBInterface,DBKey,DBCreateData,...)
- */
- void *(*ensure)(struct dbt *dbi, DBKey key, DBCreateData create, ...);
-
- /**
- * Get the data of the entry identified by the key.
- * If the entry does not exist, an entry is added with the data returned by
- * <code>create</code>.
- * @param dbi Interface of the database
- * @param key Key that identifies the entry
- * @param create Function used to create the data if the entry doesn't exist
- * @param args Extra arguments for create
- * @return Data of the entry
- * @protected
- * @see #DBKey
- * @see #DBCreateData
- * @see #DBInterface
- * @see DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
- * @see common\db.c#db_vensure(DBInterface,DBKey,DBCreateData,va_list)
- */
- void *(*vensure)(struct dbt *dbi, DBKey key, DBCreateData create, va_list args);
-
- /**
- * Put the data identified by the key in the database.
- * Returns the previous data if the entry exists or NULL.
- * NOTE: Uses the new key, the old one is released.
- * @param dbi Interface of the database
- * @param key Key that identifies the data
- * @param data Data to be put in the database
- * @return The previous data if the entry exists or NULL
- * @protected
- * @see #DBKey
- * @see #DBInterface
- * @see common\db.c#db_put(DBInterface,DBKey,void *)
- */
- void *(*put)(struct dbt *dbi, DBKey key, void *data);
-
- /**
- * Remove an entry from the database.
- * Returns the data of the entry.
- * NOTE: The key (of the database) is released.
- * @param dbi Interface of the database
- * @param key Key that identifies the entry
- * @return The data of the entry or NULL if not found
- * @protected
- * @see #DBKey
- * @see #DBInterface
- * @see common\db.c#db_remove(DBInterface,DBKey)
- */
- void *(*remove)(struct dbt *dbi, DBKey key);
-
- /**
- * Just calls {@link DBInterface#vforeach(DBInterface,DBApply,va_list)}.
- * Apply <code>func</code> to every entry in the database.
- * Returns the sum of values returned by func.
- * @param dbi Interface of the database
- * @param func Function to be applyed
- * @param ... Extra arguments for func
- * @return Sum of the values returned by func
- * @protected
- * @see #DBInterface
- * @see #DBApply(DBKey,void *,va_list)
- * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
- * @see common\db.c#db_foreach(DBInterface,DBApply,...)
- */
- int (*foreach)(struct dbt *dbi, DBApply func, ...);
-
- /**
- * Apply <code>func</code> to every entry in the database.
- * Returns the sum of values returned by func.
- * @param dbi Interface of the database
- * @param func Function to be applyed
- * @param args Extra arguments for func
- * @return Sum of the values returned by func
- * @protected
- * @see #DBApply(DBKey,void *,va_list)
- * @see #DBInterface
- * @see DBInterface#foreach(DBInterface,DBApply,...)
- * @see common\db.c#db_vforeach(DBInterface,DBApply,va_list)
- */
- int (*vforeach)(struct dbt *dbi, DBApply func, va_list args);
-
- /**
- * Just calls {@link DBInterface#vclear(DBInterface,DBApply,va_list)}.
- * Removes all entries from the database.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * @param dbi Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param ... Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see #DBApply(DBKey,void *,va_list)
- * @see #DBInterface
- * @see DBInterface#vclear(DBInterface,DBApply,va_list)
- * @see common\db.c#db_clear(DBInterface,DBApply,...)
- */
- int (*clear)(struct dbt *dbi, DBApply func, ...);
-
- /**
- * Removes all entries from the database.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * @param dbi Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param args Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see #DBApply(DBKey,void *,va_list)
- * @see #DBInterface
- * @see DBInterface#clear(DBInterface,DBApply,...)
- * @see common\db.c#vclear(DBInterface,DBApply,va_list)
- */
- int (*vclear)(struct dbt *dbi, DBApply func, va_list args);
-
- /**
- * Just calls {@link DBInterface#vdestroy(DBInterface,DBApply,va_list)}.
- * Finalize the database, feeing all the memory it uses.
- * Before deleting an entry, func is applyed to it.
- * Releases the key and the data.
- * Returns the sum of values returned by func, if it exists.
- * NOTE: This locks the database globally. Any attempt to insert or remove
- * a database entry will give an error and be aborted (except for clearing).
- * @param dbi Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param ... Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see #DBApply(DBKey,void *,va_list)
- * @see #DBInterface
- * @see DBInterface#vdestroy(DBInterface,DBApply,va_list)
- * @see common\db.c#db_destroy(DBInterface,DBApply,...)
- */
- int (*destroy)(struct dbt *dbi, DBApply func, ...);
-
- /**
- * Finalize the database, feeing all the memory it uses.
- * Before deleting an entry, func is applyed to it.
- * Returns the sum of values returned by func, if it exists.
- * NOTE: This locks the database globally. Any attempt to insert or remove
- * a database entry will give an error and be aborted (except for clearing).
- * @param dbi Interface of the database
- * @param func Function to be applyed to every entry before deleting
- * @param args Extra arguments for func
- * @return Sum of values returned by func
- * @protected
- * @see #DBInterface
- * @see #DBApply(DBKey,void *,va_list)
- * @see DBInterface#destroy(DBInterface,DBApply,...)
- * @see common\db.c#db_vdestroy(DBInterface,DBApply,va_list)
- */
- int (*vdestroy)(struct dbt *dbi, DBApply func, va_list args);
-
- /**
- * Return the size of the database (number of items in the database).
- * @param dbi Interface of the database
- * @return Size of the database
- * @protected
- * @see #DBInterface
- * @see common\db.c#db_size(DBInterface)
- */
- unsigned int (*size)(struct dbt *dbi);
-
- /**
- * Return the type of the database.
- * @param dbi Interface of the database
- * @return Type of the database
- * @protected
- * @see #DBType
- * @see #DBInterface
- * @see common\db.c#db_type(DBInterface)
- */
- DBType (*type)(struct dbt *dbi);
-
- /**
- * Return the options of the database.
- * @param dbi Interface of the database
- * @return Options of the database
- * @protected
- * @see #DBOptions
- * @see #DBInterface
- * @see common\db.c#db_options(DBInterface)
- */
- DBOptions (*options)(struct dbt *dbi);
-
-} *DBInterface;
-
-//For easy access to the common functions.
-#ifdef DB_MANUAL_CAST_TO_UNION
-# define i2key db_i2key
-# define ui2key db_ui2key
-# define str2key db_str2key
-#else /* not DB_MANUAL_CAST_TO_UNION */
-# define i2key(k) ((DBKey)(int)(k))
-# define ui2key(k) ((DBKey)(unsigned int)(k))
-# define str2key(k) ((DBKey)(unsigned char *)(k))
-#endif /* DB_MANUAL_CAST_TO_UNION / not DB_MANUAL_CAST_TO_UNION */
-
-#define db_get(db,k) (db)->get((db),(k))
-#define idb_get(db,k) (db)->get((db),i2key(k))
-#define uidb_get(db,k) (db)->get((db),ui2key(k))
-#define strdb_get(db,k) (db)->get((db),str2key(k))
-
-#define db_put(db,k,d) (db)->put((db),(k),(d))
-#define idb_put(db,k,d) (db)->put((db),i2key(k),(d))
-#define uidb_put(db,k,d) (db)->put((db),ui2key(k),(d))
-#define strdb_put(db,k,d) (db)->put((db),str2key(k),(d))
-
-#define db_remove(db,k) (db)->remove((db),(k))
-#define idb_remove(db,k) (db)->remove((db),i2key(k))
-#define uidb_remove(db,k) (db)->remove((db),ui2key(k))
-#define strdb_remove(db,k) (db)->remove((db),str2key(k))
-
-//These are discarding the possible vargs you could send to the function, so those
-//that require vargs must not use these defines.
-#define db_ensure(db,k,f) (db)->ensure((db),(k),f)
-#define idb_ensure(db,k,f) (db)->ensure((db),i2key(k),f)
-#define uidb_ensure(db,k,f) (db)->ensure((db),ui2key(k),f)
-#define strdb_ensure(db,k,f) (db)->ensure((db),str2key(k),f)
-
-/*****************************************************************************\
- * (2) Section with public functions. *
- * db_fix_options - Fix the options for a type of database. *
- * db_default_cmp - Get the default comparator for a type of database. *
- * db_default_hash - Get the default hasher for a type of database. *
- * db_default_release - Get the default releaser for a type of database *
- * with the fixed options. *
- * db_custom_release - Get the releaser that behaves as specified. *
- * db_alloc - Allocate a new database. *
- * db_i2key - Manual cast from 'int' to 'DBKey'. *
- * db_ui2key - Manual cast from 'unsigned int' to 'DBKey'. *
- * db_str2key - Manual cast from 'unsigned char *' to 'DBKey'. *
- * db_init - Initialise the database system. *
- * db_final - Finalise the database system. *
-\*****************************************************************************/
-
-/**
- * Returns the fixed options according to the database type.
- * Sets required options and unsets unsupported options.
- * For numeric databases DB_OPT_DUP_KEY and DB_OPT_RELEASE_KEY are unset.
- * @param type Type of the database
- * @param options Original options of the database
- * @return Fixed options of the database
- * @private
- * @see #DBType
- * @see #DBOptions
- * @see #db_default_release(DBType,DBOptions)
- * @see common\db.c#db_fix_options(DBType,DBOptions)
- */
-DBOptions db_fix_options(DBType type, DBOptions options);
-
-/**
- * Returns the default comparator for the type of database.
- * @param type Type of database
- * @return Comparator for the type of database or NULL if unknown database
- * @public
- * @see #DBType
- * @see #DBComparator
- * @see common\db.c#db_default_cmp(DBType)
- */
-DBComparator db_default_cmp(DBType type);
-
-/**
- * Returns the default hasher for the specified type of database.
- * @param type Type of database
- * @return Hasher of the type of database or NULL if unknown database
- * @public
- * @see #DBType
- * @see #DBHasher
- * @see common\db.c#db_default_hash(DBType)
- */
-DBHasher db_default_hash(DBType type);
-
-/**
- * Returns the default releaser for the specified type of database with the
- * specified options.
- * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
- * before choosing the releaser
- * @param type Type of database
- * @param options Options of the database
- * @return Default releaser for the type of database with the fixed options
- * @public
- * @see #DBType
- * @see #DBOptions
- * @see #DBReleaser
- * @see #db_fix_options(DBType,DBOptions)
- * @see #db_custom_release(DBRelease)
- * @see common\db.c#db_default_release(DBType,DBOptions)
- */
-DBReleaser db_default_release(DBType type, DBOptions options);
-
-/**
- * Returns the releaser that behaves as <code>which</code> specifies.
- * @param which Defines what the releaser releases
- * @return Releaser for the specified release options
- * @public
- * @see #DBRelease
- * @see #DBReleaser
- * @see #db_default_release(DBType,DBOptions)
- * @see common\db.c#db_custom_release(DBRelease)
- */
-DBReleaser db_custom_release(DBRelease which);
-
-/**
- * Allocate a new database of the specified type.
- * It uses the default comparator, hasher and releaser of the specified
- * database type and fixed options.
- * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
- * before creating the database.
- * @param file File where the database is being allocated
- * @param line Line of the file where the database is being allocated
- * @param type Type of database
- * @param options Options of the database
- * @param maxlen Maximum length of the string to be used as key in string
- * databases
- * @return The interface of the database
- * @public
- * @see #DBType
- * @see #DBInterface
- * @see #db_default_cmp(DBType)
- * @see #db_default_hash(DBType)
- * @see #db_default_release(DBType,DBOptions)
- * @see #db_fix_options(DBType,DBOptions)
- * @see common\db.c#db_alloc(const char *,int,DBType,DBOptions,unsigned short)
- */
-DBInterface db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen);
-
-#ifdef DB_MANUAL_CAST_TO_UNION
-/**
- * Manual cast from 'int' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see #DB_MANUAL_CAST_TO_UNION
- * @see #db_ui2key(unsigned int)
- * @see #db_str2key(unsigned char *)
- * @see common\db.c#db_i2key(int)
- */
-DBKey db_i2key(int key);
-
-/**
- * Manual cast from 'unsigned int' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see #DB_MANUAL_CAST_TO_UNION
- * @see #db_i2key(int)
- * @see #db_str2key(unsigned char *)
- * @see common\db.c#db_ui2key(unsigned int)
- */
-DBKey db_ui2key(unsigned int key);
-
-/**
- * Manual cast from 'unsigned char *' to the union DBKey.
- * Created for compilers that don't support casting to unions.
- * @param key Key to be casted
- * @return The key as a DBKey union
- * @public
- * @see #DB_MANUAL_CAST_TO_UNION
- * @see #db_i2key(int)
- * @see #db_ui2key(unsigned int)
- * @see common\db.c#db_str2key(unsigned char *)
- */
-DBKey db_str2key(unsigned char *key);
-#endif /* DB_MANUAL_CAST_TO_UNION */
-
-/**
- * Initialize the database system.
- * @public
- * @see #db_final(void)
- * @see common\db.c#db_init(void)
- */
-void db_init(void);
-
-/**
- * Finalize the database system.
- * Frees the memory used by the block reusage system.
- * @public
- * @see #db_init(void)
- * @see common\db.c#db_final(void)
- */
-void db_final(void);
-
-// Link DB System - From jAthena
-struct linkdb_node {
- struct linkdb_node *next;
- struct linkdb_node *prev;
- void *key;
- void *data;
-};
-
-void linkdb_insert ( struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚µ‚È‚¢
-void linkdb_replace( struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚·‚é
-void* linkdb_search ( struct linkdb_node** head, void *key);
-void* linkdb_erase ( struct linkdb_node** head, void *key);
-void linkdb_final ( struct linkdb_node** head );
-
-#endif
+/*****************************************************************************\
+ * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
+ * For more information, see LICENCE in the main folder *
+ * *
+ * This file is separated in two sections: *
+ * (1) public typedefs, enums, unions, structures and defines *
+ * (2) public functions *
+ * *
+ * <B>Notes on the release system:</B> *
+ * Whenever an entry is removed from the database both the key and the *
+ * data are requested to be released. *
+ * At least one entry is removed when replacing an entry, removing an *
+ * entry, clearing the database or destroying the database. *
+ * What is actually released is defined by the release function, the *
+ * functions of the database only ask for the key and/or data to be *
+ * released. *
+ * *
+ * TODO: *
+ * - create an enum for the data (with int, unsigned int and void *) *
+ * - create a custom database allocator *
+ * - see what functions need or should be added to the database interface *
+ * *
+ * HISTORY: *
+ * 2.1 (Athena build #???#) - Portability fix *
+ * - Fixed the portability of casting to union and added the functions *
+ * {@link DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)} and *
+ * {@link DBInterface#clear(DBInterface,DBApply,...)}. *
+ * 2.0 (Athena build 4859) - Transition version *
+ * - Almost everything recoded with a strategy similar to objects, *
+ * database structure is maintained. *
+ * 1.0 (up to Athena build 4706) *
+ * - Previous database system. *
+ * *
+ * @version 2.1 (Athena build #???#) - Portability fix *
+ * @author (Athena build 4859) Flavio @ Amazon Project *
+ * @author (up to Athena build 4706) Athena Dev Teams *
+ * @encoding US-ASCII *
+ * @see common#db.c *
+\*****************************************************************************/
+#ifndef _DB_H_
+#define _DB_H_
+
+#include <stdarg.h>
+
+/*****************************************************************************\
+ * (1) Section with public typedefs, enums, unions, structures and defines. *
+ * DB_MANUAL_CAST_TO_UNION - Define when the compiler doesn't allow casting *
+ * to unions. *
+ * DBRelease - Enumeration of release options. *
+ * DBType - Enumeration of database types. *
+ * DBOptions - Bitfield enumeration of database options. *
+ * DBKey - Union of used key types. *
+ * DBApply - Format of functions applyed to the databases. *
+ * DBMatcher - Format of matchers used in DBInterface->getall. *
+ * DBComparator - Format of the comparators used by the databases. *
+ * DBHasher - Format of the hashers used by the databases. *
+ * DBReleaser - Format of the releasers used by the databases. *
+ * DBInterface - Structure of the interface of the database. *
+\*****************************************************************************/
+
+/**
+ * Define this to enable the functions that cast to unions.
+ * Required when the compiler doesn't support casting to unions.
+ * NOTE: It is recommened that the conditional tests to determine if this
+ * should be defined be located in a makefile or a header file specific for
+ * of compatibility and portability issues.
+ * @public
+ * @see #db_i2key(int)
+ * @see #db_ui2key(unsigned int)
+ * @see #db_str2key(unsigned char *)
+ */
+//#define DB_MANUAL_CAST_TO_UNION
+
+/**
+ * Bitfield with what should be released by the releaser function (if the
+ * function supports it).
+ * @public
+ * @see #DBReleaser
+ * @see #db_custom_release(DBRelease)
+ */
+typedef enum {
+ DB_RELEASE_NOTHING = 0,
+ DB_RELEASE_KEY = 1,
+ DB_RELEASE_DATA = 2,
+ DB_RELEASE_BOTH = 3
+} DBRelease;
+
+/**
+ * Supported types of database.
+ * See {@link #db_fix_options(DBType,DBOptions)} for restrictions of the
+ * types of databases.
+ * @param DB_INT Uses int's for keys
+ * @param DB_UINT Uses unsigned int's for keys
+ * @param DB_STRING Uses strings for keys.
+ * @param DB_ISTRING Uses case insensitive strings for keys.
+ * @public
+ * @see #DBOptions
+ * @see #DBKey
+ * @see #db_fix_options(DBType,DBOptions)
+ * @see #db_default_cmp(DBType)
+ * @see #db_default_hash(DBType)
+ * @see #db_default_release(DBType,DBOptions)
+ * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ */
+typedef enum {
+ DB_INT,
+ DB_UINT,
+ DB_STRING,
+ DB_ISTRING
+} DBType;
+
+/**
+ * Bitfield of options that define the behaviour of the database.
+ * See {@link #db_fix_options(DBType,DBOptions)} for restrictions of the
+ * types of databases.
+ * @param DB_OPT_BASE Base options: does not duplicate keys, releases nothing
+ * and does not allow NULL keys or NULL data.
+ * @param DB_OPT_DUP_KEY Duplicates the keys internally. If DB_OPT_RELEASE_KEY
+ * is defined, the real key is freed as soon as the entry is added.
+ * @param DB_OPT_RELEASE_KEY Releases the key.
+ * @param DB_OPT_RELEASE_DATA Releases the data whenever an entry is removed
+ * from the database.
+ * WARNING: for funtions that return the data (like DBInterface->remove),
+ * a dangling pointer will be returned.
+ * @param DB_OPT_RELEASE_BOTH Releases both key and data.
+ * @param DB_OPT_ALLOW_NULL_KEY Allow NULL keys in the database.
+ * @param DB_OPT_ALLOW_NULL_DATA Allow NULL data in the database.
+ * @public
+ * @see #db_fix_options(DBType,DBOptions)
+ * @see #db_default_release(DBType,DBOptions)
+ * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ */
+typedef enum {
+ DB_OPT_BASE = 0,
+ DB_OPT_DUP_KEY = 1,
+ DB_OPT_RELEASE_KEY = 2,
+ DB_OPT_RELEASE_DATA = 4,
+ DB_OPT_RELEASE_BOTH = 6,
+ DB_OPT_ALLOW_NULL_KEY = 8,
+ DB_OPT_ALLOW_NULL_DATA = 16,
+} DBOptions;
+
+/**
+ * Union of key types used by the database.
+ * @param i Type of key for DB_INT databases
+ * @param ui Type of key for DB_UINT databases
+ * @param str Type of key for DB_STRING and DB_ISTRING databases
+ * @public
+ * @see #DBType
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see #DBMatcher(DBKey,void *,va_list)
+ * @see #DBComparator(DBKey,DBKey,unsigned short)
+ * @see #DBHasher(DBKey,unsigned short)
+ * @see #DBReleaser(DBKey,void *,DBRelease)
+ * @see DBInterface#get(DBInterface,DBKey)
+ * @see DBInterface#put(DBInterface,DBKey,void *)
+ * @see DBInterface#remove(DBInterface,DBKey)
+ */
+typedef union {
+ int i;
+ unsigned int ui;
+ unsigned char *str;
+} DBKey;
+
+/**
+ * Format of funtions that create the data for the key when the entry doesn't
+ * exist in the database yet.
+ * @param key Key of the database entry
+ * @param args Extra arguments of the funtion
+ * @return Data identified by the key to be put in the database
+ * @public
+ * @see #DBKey
+ * @see DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
+ * @see DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
+ */
+typedef void *(*DBCreateData)(DBKey key, va_list args);
+
+/**
+ * Format of functions to be applyed to an unspecified quantity of entries of
+ * a database.
+ * Any function that applyes this function to the database will return the sum
+ * of values returned by this function.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param args Extra arguments of the funtion
+ * @return Value to be added up by the funtion that is applying this
+ * @public
+ * @see #DBKey
+ * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
+ * @see DBInterface#foreach(DBInterface,DBApply,...)
+ * @see DBInterface#vdestroy(DBInterface,DBApply,va_list)
+ * @see DBInterface#destroy(DBInterface,DBApply,...)
+ */
+typedef int (*DBApply)(DBKey key, void *data, va_list args);
+
+/**
+ * Format of functions that match database entries.
+ * The purpose of the match depends on the function that is calling the matcher.
+ * Returns 0 if it is a match, another number otherwise.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param args Extra arguments of the function
+ * @return 0 if a match, another number otherwise
+ * @public
+ * @see #DBKey
+ * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatcher,...)
+ */
+typedef int (*DBMatcher)(DBKey key, void *data, va_list args);
+
+/**
+ * Format of the comparators used internally by the database system.
+ * Compares key1 to key2.
+ * <code>maxlen</code> is the maximum number of character used in DB_STRING and
+ * DB_ISTRING databases. If 0, the maximum number of maxlen is used (64K).
+ * Returns 0 is equal, negative if lower and positive is higher.
+ * @param key1 Key being compared
+ * @param key2 Key we are comparing to
+ * @param maxlen Maximum number of characters used in DB_STRING and DB_ISTRING
+ * databases.
+ * @return 0 if equal, negative if lower and positive if higher
+ * @public
+ * @see #DBKey
+ * @see #db_default_cmp(DBType)
+ */
+typedef int (*DBComparator)(DBKey key1, DBKey key2, unsigned short maxlen);
+
+/**
+ * Format of the hashers used internally by the database system.
+ * Creates the hash of the key.
+ * <code>maxlen</code> is the maximum number of character used in DB_STRING and
+ * DB_ISTRING databases. If 0, the maximum number of maxlen is used (64K).
+ * @param key Key being hashed
+ * @param maxlen Maximum number of characters used in DB_STRING and DB_ISTRING
+ * databases.
+ * @return Hash of the key
+ * @public
+ * @see #DBKey
+ * @see #db_default_hash(DBType)
+ */
+typedef unsigned int (*DBHasher)(DBKey key, unsigned short maxlen);
+
+/**
+ * Format of the releaser used by the database system.
+ * Releases nothing, the key, the data or both.
+ * All standard releasers use aFree to release.
+ * @param key Key of the database entry
+ * @param data Data of the database entry
+ * @param which What is being requested to be released
+ * @public
+ * @see #DBRelease
+ * @see #DBKey
+ * @see #db_default_releaser(DBType,DBOptions)
+ * @see #db_custom_release(DBRelease)
+ */
+typedef void (*DBReleaser)(DBKey key, void *data, DBRelease which);
+
+/**
+ * Public interface of a database. Only contains funtions.
+ * All the functions take the interface as the first argument.
+ * @public
+ * @see DBInterface#get(DBInterface,DBKey)
+ * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
+ * @see DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
+ * @see DBInterface#put(DBInterface,DBKey,void *)
+ * @see DBInterface#remove(DBInterface,DBKey)
+ * @see DBInterface#foreach(DBInterface,DBApply,...)
+ * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
+ * @see DBInterface#destroy(DBInterface,DBApply,...)
+ * @see DBInterface#destroy(DBInterface,DBApply,va_list)
+ * @see DBInterface#size(DBInterface)
+ * @see DBInterface#type(DBInterface)
+ * @see DBInterface#options(DBInterface)
+ * @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ */
+typedef struct dbt {
+
+ /**
+ * Get the data of the entry identifid by the key.
+ * @param dbi Interface of the database
+ * @param key Key that identifies the entry
+ * @return Data of the entry or NULL if not found
+ * @protected
+ * @see #DBKey
+ * @see #DBInterface
+ * @see common\db.c#db_get(DBInterface,DBKey)
+ */
+ void *(*get)(struct dbt *dbi, DBKey key);
+
+ /**
+ * Just calls {@link DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)}.
+ * Get the data of the entries matched by <code>match</code>.
+ * It puts a maximum of <code>max</code> entries into <code>buf</code>.
+ * If <code>buf</code> is NULL, it only counts the matches.
+ * Returns the number of entries that matched.
+ * NOTE: if the value returned is greater than <code>max</code>, only the
+ * first <code>max</code> entries found are put into the buffer.
+ * @param dbi Interface of the database
+ * @param buf Buffer to put the data of the matched entries
+ * @param max Maximum number of data entries to be put into buf
+ * @param match Function that matches the database entries
+ * @param ... Extra arguments for match
+ * @return The number of entries that matched
+ * @protected
+ * @see #DBMatcher(DBKey key, void *data, va_list args)
+ * @see #DBInterface
+ * @see DBInterface#vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
+ * @see common\db.c#db_getall(DBInterface,void **,unsigned int,DBMatch,...)
+ */
+ unsigned int (*getall)(struct dbt *dbi, void **buf, unsigned int max, DBMatcher match, ...);
+
+ /**
+ * Get the data of the entries matched by <code>match</code>.
+ * It puts a maximum of <code>max</code> entries into <code>buf</code>.
+ * If <code>buf</code> is NULL, it only counts the matches.
+ * Returns the number of entries that matched.
+ * NOTE: if the value returned is greater than <code>max</code>, only the
+ * first <code>max</code> entries found are put into the buffer.
+ * @param dbi Interface of the database
+ * @param buf Buffer to put the data of the matched entries
+ * @param max Maximum number of data entries to be put into buf
+ * @param match Function that matches the database entries
+ * @param ... Extra arguments for match
+ * @return The number of entries that matched
+ * @protected
+ * @see #DBMatcher(DBKey key, void *data, va_list args)
+ * @see #DBInterface
+ * @see DBInterface#getall(DBInterface,void **,unsigned int,DBMatch,...)
+ * @see common\db.c#db_vgetall(DBInterface,void **,unsigned int,DBMatch,va_list)
+ */
+ unsigned int (*vgetall)(struct dbt *dbi, void **buf, unsigned int max, DBMatcher match, va_list args);
+
+ /**
+ * Just calls {@link common\db.h\DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)}.
+ * Get the data of the entry identified by the key.
+ * If the entry does not exist, an entry is added with the data returned by
+ * <code>create</code>.
+ * @param dbi Interface of the database
+ * @param key Key that identifies the entry
+ * @param create Function used to create the data if the entry doesn't exist
+ * @param ... Extra arguments for create
+ * @return Data of the entry
+ * @protected
+ * @see #DBKey
+ * @see #DBCreateData
+ * @see #DBInterface
+ * @see DBInterface#vensure(DBInterface,DBKey,DBCreateData,va_list)
+ * @see common\db.c#db_ensure(DBInterface,DBKey,DBCreateData,...)
+ */
+ void *(*ensure)(struct dbt *dbi, DBKey key, DBCreateData create, ...);
+
+ /**
+ * Get the data of the entry identified by the key.
+ * If the entry does not exist, an entry is added with the data returned by
+ * <code>create</code>.
+ * @param dbi Interface of the database
+ * @param key Key that identifies the entry
+ * @param create Function used to create the data if the entry doesn't exist
+ * @param args Extra arguments for create
+ * @return Data of the entry
+ * @protected
+ * @see #DBKey
+ * @see #DBCreateData
+ * @see #DBInterface
+ * @see DBInterface#ensure(DBInterface,DBKey,DBCreateData,...)
+ * @see common\db.c#db_vensure(DBInterface,DBKey,DBCreateData,va_list)
+ */
+ void *(*vensure)(struct dbt *dbi, DBKey key, DBCreateData create, va_list args);
+
+ /**
+ * Put the data identified by the key in the database.
+ * Returns the previous data if the entry exists or NULL.
+ * NOTE: Uses the new key, the old one is released.
+ * @param dbi Interface of the database
+ * @param key Key that identifies the data
+ * @param data Data to be put in the database
+ * @return The previous data if the entry exists or NULL
+ * @protected
+ * @see #DBKey
+ * @see #DBInterface
+ * @see common\db.c#db_put(DBInterface,DBKey,void *)
+ */
+ void *(*put)(struct dbt *dbi, DBKey key, void *data);
+
+ /**
+ * Remove an entry from the database.
+ * Returns the data of the entry.
+ * NOTE: The key (of the database) is released.
+ * @param dbi Interface of the database
+ * @param key Key that identifies the entry
+ * @return The data of the entry or NULL if not found
+ * @protected
+ * @see #DBKey
+ * @see #DBInterface
+ * @see common\db.c#db_remove(DBInterface,DBKey)
+ */
+ void *(*remove)(struct dbt *dbi, DBKey key);
+
+ /**
+ * Just calls {@link DBInterface#vforeach(DBInterface,DBApply,va_list)}.
+ * Apply <code>func</code> to every entry in the database.
+ * Returns the sum of values returned by func.
+ * @param dbi Interface of the database
+ * @param func Function to be applyed
+ * @param ... Extra arguments for func
+ * @return Sum of the values returned by func
+ * @protected
+ * @see #DBInterface
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see DBInterface#vforeach(DBInterface,DBApply,va_list)
+ * @see common\db.c#db_foreach(DBInterface,DBApply,...)
+ */
+ int (*foreach)(struct dbt *dbi, DBApply func, ...);
+
+ /**
+ * Apply <code>func</code> to every entry in the database.
+ * Returns the sum of values returned by func.
+ * @param dbi Interface of the database
+ * @param func Function to be applyed
+ * @param args Extra arguments for func
+ * @return Sum of the values returned by func
+ * @protected
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see #DBInterface
+ * @see DBInterface#foreach(DBInterface,DBApply,...)
+ * @see common\db.c#db_vforeach(DBInterface,DBApply,va_list)
+ */
+ int (*vforeach)(struct dbt *dbi, DBApply func, va_list args);
+
+ /**
+ * Just calls {@link DBInterface#vclear(DBInterface,DBApply,va_list)}.
+ * Removes all entries from the database.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * @param dbi Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param ... Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see #DBInterface
+ * @see DBInterface#vclear(DBInterface,DBApply,va_list)
+ * @see common\db.c#db_clear(DBInterface,DBApply,...)
+ */
+ int (*clear)(struct dbt *dbi, DBApply func, ...);
+
+ /**
+ * Removes all entries from the database.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * @param dbi Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param args Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see #DBInterface
+ * @see DBInterface#clear(DBInterface,DBApply,...)
+ * @see common\db.c#vclear(DBInterface,DBApply,va_list)
+ */
+ int (*vclear)(struct dbt *dbi, DBApply func, va_list args);
+
+ /**
+ * Just calls {@link DBInterface#vdestroy(DBInterface,DBApply,va_list)}.
+ * Finalize the database, feeing all the memory it uses.
+ * Before deleting an entry, func is applyed to it.
+ * Releases the key and the data.
+ * Returns the sum of values returned by func, if it exists.
+ * NOTE: This locks the database globally. Any attempt to insert or remove
+ * a database entry will give an error and be aborted (except for clearing).
+ * @param dbi Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param ... Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see #DBInterface
+ * @see DBInterface#vdestroy(DBInterface,DBApply,va_list)
+ * @see common\db.c#db_destroy(DBInterface,DBApply,...)
+ */
+ int (*destroy)(struct dbt *dbi, DBApply func, ...);
+
+ /**
+ * Finalize the database, feeing all the memory it uses.
+ * Before deleting an entry, func is applyed to it.
+ * Returns the sum of values returned by func, if it exists.
+ * NOTE: This locks the database globally. Any attempt to insert or remove
+ * a database entry will give an error and be aborted (except for clearing).
+ * @param dbi Interface of the database
+ * @param func Function to be applyed to every entry before deleting
+ * @param args Extra arguments for func
+ * @return Sum of values returned by func
+ * @protected
+ * @see #DBInterface
+ * @see #DBApply(DBKey,void *,va_list)
+ * @see DBInterface#destroy(DBInterface,DBApply,...)
+ * @see common\db.c#db_vdestroy(DBInterface,DBApply,va_list)
+ */
+ int (*vdestroy)(struct dbt *dbi, DBApply func, va_list args);
+
+ /**
+ * Return the size of the database (number of items in the database).
+ * @param dbi Interface of the database
+ * @return Size of the database
+ * @protected
+ * @see #DBInterface
+ * @see common\db.c#db_size(DBInterface)
+ */
+ unsigned int (*size)(struct dbt *dbi);
+
+ /**
+ * Return the type of the database.
+ * @param dbi Interface of the database
+ * @return Type of the database
+ * @protected
+ * @see #DBType
+ * @see #DBInterface
+ * @see common\db.c#db_type(DBInterface)
+ */
+ DBType (*type)(struct dbt *dbi);
+
+ /**
+ * Return the options of the database.
+ * @param dbi Interface of the database
+ * @return Options of the database
+ * @protected
+ * @see #DBOptions
+ * @see #DBInterface
+ * @see common\db.c#db_options(DBInterface)
+ */
+ DBOptions (*options)(struct dbt *dbi);
+
+} *DBInterface;
+
+//For easy access to the common functions.
+#ifdef DB_MANUAL_CAST_TO_UNION
+# define i2key db_i2key
+# define ui2key db_ui2key
+# define str2key db_str2key
+#else /* not DB_MANUAL_CAST_TO_UNION */
+# define i2key(k) ((DBKey)(int)(k))
+# define ui2key(k) ((DBKey)(unsigned int)(k))
+# define str2key(k) ((DBKey)(unsigned char *)(k))
+#endif /* DB_MANUAL_CAST_TO_UNION / not DB_MANUAL_CAST_TO_UNION */
+
+#define db_get(db,k) (db)->get((db),(k))
+#define idb_get(db,k) (db)->get((db),i2key(k))
+#define uidb_get(db,k) (db)->get((db),ui2key(k))
+#define strdb_get(db,k) (db)->get((db),str2key(k))
+
+#define db_put(db,k,d) (db)->put((db),(k),(d))
+#define idb_put(db,k,d) (db)->put((db),i2key(k),(d))
+#define uidb_put(db,k,d) (db)->put((db),ui2key(k),(d))
+#define strdb_put(db,k,d) (db)->put((db),str2key(k),(d))
+
+#define db_remove(db,k) (db)->remove((db),(k))
+#define idb_remove(db,k) (db)->remove((db),i2key(k))
+#define uidb_remove(db,k) (db)->remove((db),ui2key(k))
+#define strdb_remove(db,k) (db)->remove((db),str2key(k))
+
+//These are discarding the possible vargs you could send to the function, so those
+//that require vargs must not use these defines.
+#define db_ensure(db,k,f) (db)->ensure((db),(k),f)
+#define idb_ensure(db,k,f) (db)->ensure((db),i2key(k),f)
+#define uidb_ensure(db,k,f) (db)->ensure((db),ui2key(k),f)
+#define strdb_ensure(db,k,f) (db)->ensure((db),str2key(k),f)
+
+/*****************************************************************************\
+ * (2) Section with public functions. *
+ * db_fix_options - Fix the options for a type of database. *
+ * db_default_cmp - Get the default comparator for a type of database. *
+ * db_default_hash - Get the default hasher for a type of database. *
+ * db_default_release - Get the default releaser for a type of database *
+ * with the fixed options. *
+ * db_custom_release - Get the releaser that behaves as specified. *
+ * db_alloc - Allocate a new database. *
+ * db_i2key - Manual cast from 'int' to 'DBKey'. *
+ * db_ui2key - Manual cast from 'unsigned int' to 'DBKey'. *
+ * db_str2key - Manual cast from 'unsigned char *' to 'DBKey'. *
+ * db_init - Initialise the database system. *
+ * db_final - Finalise the database system. *
+\*****************************************************************************/
+
+/**
+ * Returns the fixed options according to the database type.
+ * Sets required options and unsets unsupported options.
+ * For numeric databases DB_OPT_DUP_KEY and DB_OPT_RELEASE_KEY are unset.
+ * @param type Type of the database
+ * @param options Original options of the database
+ * @return Fixed options of the database
+ * @private
+ * @see #DBType
+ * @see #DBOptions
+ * @see #db_default_release(DBType,DBOptions)
+ * @see common\db.c#db_fix_options(DBType,DBOptions)
+ */
+DBOptions db_fix_options(DBType type, DBOptions options);
+
+/**
+ * Returns the default comparator for the type of database.
+ * @param type Type of database
+ * @return Comparator for the type of database or NULL if unknown database
+ * @public
+ * @see #DBType
+ * @see #DBComparator
+ * @see common\db.c#db_default_cmp(DBType)
+ */
+DBComparator db_default_cmp(DBType type);
+
+/**
+ * Returns the default hasher for the specified type of database.
+ * @param type Type of database
+ * @return Hasher of the type of database or NULL if unknown database
+ * @public
+ * @see #DBType
+ * @see #DBHasher
+ * @see common\db.c#db_default_hash(DBType)
+ */
+DBHasher db_default_hash(DBType type);
+
+/**
+ * Returns the default releaser for the specified type of database with the
+ * specified options.
+ * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
+ * before choosing the releaser
+ * @param type Type of database
+ * @param options Options of the database
+ * @return Default releaser for the type of database with the fixed options
+ * @public
+ * @see #DBType
+ * @see #DBOptions
+ * @see #DBReleaser
+ * @see #db_fix_options(DBType,DBOptions)
+ * @see #db_custom_release(DBRelease)
+ * @see common\db.c#db_default_release(DBType,DBOptions)
+ */
+DBReleaser db_default_release(DBType type, DBOptions options);
+
+/**
+ * Returns the releaser that behaves as <code>which</code> specifies.
+ * @param which Defines what the releaser releases
+ * @return Releaser for the specified release options
+ * @public
+ * @see #DBRelease
+ * @see #DBReleaser
+ * @see #db_default_release(DBType,DBOptions)
+ * @see common\db.c#db_custom_release(DBRelease)
+ */
+DBReleaser db_custom_release(DBRelease which);
+
+/**
+ * Allocate a new database of the specified type.
+ * It uses the default comparator, hasher and releaser of the specified
+ * database type and fixed options.
+ * NOTE: the options are fixed by {@link #db_fix_options(DBType,DBOptions)}
+ * before creating the database.
+ * @param file File where the database is being allocated
+ * @param line Line of the file where the database is being allocated
+ * @param type Type of database
+ * @param options Options of the database
+ * @param maxlen Maximum length of the string to be used as key in string
+ * databases
+ * @return The interface of the database
+ * @public
+ * @see #DBType
+ * @see #DBInterface
+ * @see #db_default_cmp(DBType)
+ * @see #db_default_hash(DBType)
+ * @see #db_default_release(DBType,DBOptions)
+ * @see #db_fix_options(DBType,DBOptions)
+ * @see common\db.c#db_alloc(const char *,int,DBType,DBOptions,unsigned short)
+ */
+DBInterface db_alloc(const char *file, int line, DBType type, DBOptions options, unsigned short maxlen);
+
+#ifdef DB_MANUAL_CAST_TO_UNION
+/**
+ * Manual cast from 'int' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see #DB_MANUAL_CAST_TO_UNION
+ * @see #db_ui2key(unsigned int)
+ * @see #db_str2key(unsigned char *)
+ * @see common\db.c#db_i2key(int)
+ */
+DBKey db_i2key(int key);
+
+/**
+ * Manual cast from 'unsigned int' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see #DB_MANUAL_CAST_TO_UNION
+ * @see #db_i2key(int)
+ * @see #db_str2key(unsigned char *)
+ * @see common\db.c#db_ui2key(unsigned int)
+ */
+DBKey db_ui2key(unsigned int key);
+
+/**
+ * Manual cast from 'unsigned char *' to the union DBKey.
+ * Created for compilers that don't support casting to unions.
+ * @param key Key to be casted
+ * @return The key as a DBKey union
+ * @public
+ * @see #DB_MANUAL_CAST_TO_UNION
+ * @see #db_i2key(int)
+ * @see #db_ui2key(unsigned int)
+ * @see common\db.c#db_str2key(unsigned char *)
+ */
+DBKey db_str2key(unsigned char *key);
+#endif /* DB_MANUAL_CAST_TO_UNION */
+
+/**
+ * Initialize the database system.
+ * @public
+ * @see #db_final(void)
+ * @see common\db.c#db_init(void)
+ */
+void db_init(void);
+
+/**
+ * Finalize the database system.
+ * Frees the memory used by the block reusage system.
+ * @public
+ * @see #db_init(void)
+ * @see common\db.c#db_final(void)
+ */
+void db_final(void);
+
+// Link DB System - From jAthena
+struct linkdb_node {
+ struct linkdb_node *next;
+ struct linkdb_node *prev;
+ void *key;
+ void *data;
+};
+
+void linkdb_insert ( struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚µ‚È‚¢
+void linkdb_replace( struct linkdb_node** head, void *key, void* data); // d•¡‚ðl—¶‚·‚é
+void* linkdb_search ( struct linkdb_node** head, void *key);
+void* linkdb_erase ( struct linkdb_node** head, void *key);
+void linkdb_final ( struct linkdb_node** head );
+
+#endif
diff --git a/src/common/ers.h b/src/common/ers.h
index a512f6365..9b6b4b62d 100644
--- a/src/common/ers.h
+++ b/src/common/ers.h
@@ -1,193 +1,193 @@
-/*****************************************************************************\
- * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
- * For more information, see LICENCE in the main folder *
- * *
- * <H1>Entry Reusage System</H1> *
- * *
- * There are several root entry managers, each with a different entry size. *
- * Each manager will keep track of how many instances have been 'created'. *
- * They will only automatically destroy themselves after the last instance *
- * is destroyed. *
- * *
- * Entries can be allocated from the managers. *
- * If it has reusable entries (freed entry), it uses one. *
- * So no assumption should be made about the data of the entry. *
- * Entries should be freed in the manager they where allocated from. *
- * Failure to do so can lead to unexpected behaviours. *
- * *
- * <H2>Advantages:</H2> *
- * - The same manager is used for entries of the same size. *
- * So entries freed in one instance of the manager can be used by other *
- * instances of the manager. *
- * - Much less memory allocation/deallocation - program will be faster. *
- * - Avoids memory fragmentaion - program will run better for longer. *
- * *
- * <H2>Disavantages:</H2> *
- * - Unused entries are almost inevitable - memory being wasted. *
- * - A manager will only auto-destroy when all of its instances are *
- * destroyed so memory will usually only be recovered near the end. *
- * - Always wastes space for entries smaller than a pointer. *
- * *
- * WARNING: The system is not thread-safe at the moment. *
- * *
- * HISTORY: *
- * 0.1 - Initial version *
- * *
- * @version 0.1 - Initial version *
- * @author Flavio @ Amazon Project *
- * @encoding US-ASCII *
- * @see common#ers.c *
-\*****************************************************************************/
-#ifndef _ERS_H_
-#define _ERS_H_
-
-#include "../common/cbasetypes.h"
-
-/*****************************************************************************\
- * (1) All public parts of the Entry Reusage System. *
- * DISABLE_ERS - Define to disable this system. *
- * ERS_ALIGNED - Alignment of the entries in the blocks. *
- * ERInterface - Interface of the entry manager. *
- * ers_new - Allocate an instance of an entry manager. *
- * ers_report - Print a report about the current state. *
- * ers_force_destroy_all - Force the destruction of all the managers. *
-\*****************************************************************************/
-
-/**
- * Define this to disable the Entry Reusage System.
- * All code except the typedef of ERInterface will be disabled.
- * To allow a smooth transition,
- * @public
- */
-//#define DISABLE_ERS
-
-/**
- * Entries are aligned to ERS_ALIGNED bytes in the blocks of entries.
- * By default it aligns to one byte, using the "natural order" of the entries.
- * This should NEVER be set to zero or less.
- * If greater than one, some memory can be wasted. This should never be needed
- * but is here just in case some aligment issues arise.
- * @public
- * @see #ers_new(uint32)
- */
-#ifndef ERS_ALIGNED
-# define ERS_ALIGNED 1
-#endif /* not ERS_ALIGN_ENTRY */
-
-/**
- * Public interface of the entry manager.
- * @param alloc Allocate an entry from this manager
- * @param free Free an entry allocated from this manager
- * @param entry_size Return the size of the entries of this manager
- * @param destroy Destroy this instance of the manager
- * @public
- * @see #ers_new(uint32)
- */
-typedef struct eri {
-
- /**
- * Allocate an entry from this entry manager.
- * If there are reusable entries available, it reuses one instead.
- * @param self Interface of the entry manager
- * @return An entry
- * @protected
- * @see #ERInterface
- * @see ERInterface#free(ERInterface,void *)
- */
- void *(*alloc)(struct eri *self);
-
- /**
- * Free an entry allocated from this manager.
- * WARNING: Does not check if the entry was allocated by this manager.
- * Freeing such an entry can lead to unexpected behaviour.
- * @param self Interface of the entry manager
- * @param entry Entry to be freed
- * @protected
- * @see #ERInterface
- * @see ERInterface#alloc(ERInterface)
- */
- void (*free)(struct eri *self, void *entry);
-
- /**
- * Return the size of the entries allocated from this manager.
- * @param self Interface of the entry manager
- * @return Size of the entries of this manager in bytes
- * @protected
- * @see #ERInterface
- */
- uint32 (*entry_size)(struct eri *self);
-
- /**
- * Destroy this instance of the manager.
- * The manager is actually only destroyed when all the instances are destroyed.
- * When destroying the manager a warning is shown if the manager has
- * missing/extra entries.
- * @param self Interface of the entry manager
- * @protected
- * @see #ERInterface
- * @see #ers_new(uint32)
- */
- void (*destroy)(struct eri *self);
-
-} *ERInterface;
-
-#ifdef DISABLE_ERS
-// Use memory manager to allocate/free and disable other interface functions
-# define ers_alloc(obj,type) (type *)aMalloc(sizeof(type))
-# define ers_free(obj,entry) aFree(entry)
-# define ers_entry_size(obj) (uint32)0
-# define ers_destroy(obj)
-// Disable the public functions
-# define ers_new(size) NULL
-# define ers_report()
-# define ers_force_destroy_all()
-#else /* not DISABLE_ERS */
-// These defines should be used to allow the code to keep working whenever
-// the system is disabled
-# define ers_alloc(obj,type) (type *)(obj)->alloc(obj)
-# define ers_free(obj,entry) (obj)->free((obj),(entry))
-# define ers_entry_size(obj) (obj)->entry_size(obj)
-# define ers_destroy(obj) (obj)->destroy(obj)
-
-/**
- * Get a new instance of the manager that handles the specified entry size.
- * Size has to greater than 0.
- * If the specified size is smaller than a pointer, the size of a pointer is
- * used instead.
- * It's also aligned to ERS_ALIGNED bytes, so the smallest multiple of
- * ERS_ALIGNED that is greater or equal to size is what's actually used.
- * @param The requested size of the entry in bytes
- * @return Interface of the object
- * @public
- * @see #ERS_ALIGNED
- * @see #ERInterface
- * @see ERInterface#destroy(ERInterface)
- * @see common\ers.c#ers_new(uint32)
- */
-ERInterface ers_new(uint32 size);
-
-/**
- * Print a report about the current state of the Entry Reusage System.
- * Shows information about the global system and each entry manager.
- * The number of entries are checked and a warning is shown if extra reusable
- * entries are found.
- * The extra entries are included in the count of reusable entries.
- * @public
- * @see common\ers.c#ers_report(void)
- */
-void ers_report(void);
-
-/**
- * Forcibly destroy all the entry managers, checking for nothing.
- * The system is left as if no instances or entries had ever been allocated.
- * All previous entries and instances of the managers become invalid.
- * The use of this is NOT recommended.
- * It should only be used in extreme situations to make shure all the memory
- * allocated by this system is released.
- * @public
- * @see common\ers.c#ers_force_destroy_all(void)
- */
-void ers_force_destroy_all(void);
-#endif /* DISABLE_ERS / not DISABLE_ERS */
-
-#endif /* _ERS_H_ */
+/*****************************************************************************\
+ * Copyright (c) Athena Dev Teams - Licensed under GNU GPL *
+ * For more information, see LICENCE in the main folder *
+ * *
+ * <H1>Entry Reusage System</H1> *
+ * *
+ * There are several root entry managers, each with a different entry size. *
+ * Each manager will keep track of how many instances have been 'created'. *
+ * They will only automatically destroy themselves after the last instance *
+ * is destroyed. *
+ * *
+ * Entries can be allocated from the managers. *
+ * If it has reusable entries (freed entry), it uses one. *
+ * So no assumption should be made about the data of the entry. *
+ * Entries should be freed in the manager they where allocated from. *
+ * Failure to do so can lead to unexpected behaviours. *
+ * *
+ * <H2>Advantages:</H2> *
+ * - The same manager is used for entries of the same size. *
+ * So entries freed in one instance of the manager can be used by other *
+ * instances of the manager. *
+ * - Much less memory allocation/deallocation - program will be faster. *
+ * - Avoids memory fragmentaion - program will run better for longer. *
+ * *
+ * <H2>Disavantages:</H2> *
+ * - Unused entries are almost inevitable - memory being wasted. *
+ * - A manager will only auto-destroy when all of its instances are *
+ * destroyed so memory will usually only be recovered near the end. *
+ * - Always wastes space for entries smaller than a pointer. *
+ * *
+ * WARNING: The system is not thread-safe at the moment. *
+ * *
+ * HISTORY: *
+ * 0.1 - Initial version *
+ * *
+ * @version 0.1 - Initial version *
+ * @author Flavio @ Amazon Project *
+ * @encoding US-ASCII *
+ * @see common#ers.c *
+\*****************************************************************************/
+#ifndef _ERS_H_
+#define _ERS_H_
+
+#include "../common/cbasetypes.h"
+
+/*****************************************************************************\
+ * (1) All public parts of the Entry Reusage System. *
+ * DISABLE_ERS - Define to disable this system. *
+ * ERS_ALIGNED - Alignment of the entries in the blocks. *
+ * ERInterface - Interface of the entry manager. *
+ * ers_new - Allocate an instance of an entry manager. *
+ * ers_report - Print a report about the current state. *
+ * ers_force_destroy_all - Force the destruction of all the managers. *
+\*****************************************************************************/
+
+/**
+ * Define this to disable the Entry Reusage System.
+ * All code except the typedef of ERInterface will be disabled.
+ * To allow a smooth transition,
+ * @public
+ */
+//#define DISABLE_ERS
+
+/**
+ * Entries are aligned to ERS_ALIGNED bytes in the blocks of entries.
+ * By default it aligns to one byte, using the "natural order" of the entries.
+ * This should NEVER be set to zero or less.
+ * If greater than one, some memory can be wasted. This should never be needed
+ * but is here just in case some aligment issues arise.
+ * @public
+ * @see #ers_new(uint32)
+ */
+#ifndef ERS_ALIGNED
+# define ERS_ALIGNED 1
+#endif /* not ERS_ALIGN_ENTRY */
+
+/**
+ * Public interface of the entry manager.
+ * @param alloc Allocate an entry from this manager
+ * @param free Free an entry allocated from this manager
+ * @param entry_size Return the size of the entries of this manager
+ * @param destroy Destroy this instance of the manager
+ * @public
+ * @see #ers_new(uint32)
+ */
+typedef struct eri {
+
+ /**
+ * Allocate an entry from this entry manager.
+ * If there are reusable entries available, it reuses one instead.
+ * @param self Interface of the entry manager
+ * @return An entry
+ * @protected
+ * @see #ERInterface
+ * @see ERInterface#free(ERInterface,void *)
+ */
+ void *(*alloc)(struct eri *self);
+
+ /**
+ * Free an entry allocated from this manager.
+ * WARNING: Does not check if the entry was allocated by this manager.
+ * Freeing such an entry can lead to unexpected behaviour.
+ * @param self Interface of the entry manager
+ * @param entry Entry to be freed
+ * @protected
+ * @see #ERInterface
+ * @see ERInterface#alloc(ERInterface)
+ */
+ void (*free)(struct eri *self, void *entry);
+
+ /**
+ * Return the size of the entries allocated from this manager.
+ * @param self Interface of the entry manager
+ * @return Size of the entries of this manager in bytes
+ * @protected
+ * @see #ERInterface
+ */
+ uint32 (*entry_size)(struct eri *self);
+
+ /**
+ * Destroy this instance of the manager.
+ * The manager is actually only destroyed when all the instances are destroyed.
+ * When destroying the manager a warning is shown if the manager has
+ * missing/extra entries.
+ * @param self Interface of the entry manager
+ * @protected
+ * @see #ERInterface
+ * @see #ers_new(uint32)
+ */
+ void (*destroy)(struct eri *self);
+
+} *ERInterface;
+
+#ifdef DISABLE_ERS
+// Use memory manager to allocate/free and disable other interface functions
+# define ers_alloc(obj,type) (type *)aMalloc(sizeof(type))
+# define ers_free(obj,entry) aFree(entry)
+# define ers_entry_size(obj) (uint32)0
+# define ers_destroy(obj)
+// Disable the public functions
+# define ers_new(size) NULL
+# define ers_report()
+# define ers_force_destroy_all()
+#else /* not DISABLE_ERS */
+// These defines should be used to allow the code to keep working whenever
+// the system is disabled
+# define ers_alloc(obj,type) (type *)(obj)->alloc(obj)
+# define ers_free(obj,entry) (obj)->free((obj),(entry))
+# define ers_entry_size(obj) (obj)->entry_size(obj)
+# define ers_destroy(obj) (obj)->destroy(obj)
+
+/**
+ * Get a new instance of the manager that handles the specified entry size.
+ * Size has to greater than 0.
+ * If the specified size is smaller than a pointer, the size of a pointer is
+ * used instead.
+ * It's also aligned to ERS_ALIGNED bytes, so the smallest multiple of
+ * ERS_ALIGNED that is greater or equal to size is what's actually used.
+ * @param The requested size of the entry in bytes
+ * @return Interface of the object
+ * @public
+ * @see #ERS_ALIGNED
+ * @see #ERInterface
+ * @see ERInterface#destroy(ERInterface)
+ * @see common\ers.c#ers_new(uint32)
+ */
+ERInterface ers_new(uint32 size);
+
+/**
+ * Print a report about the current state of the Entry Reusage System.
+ * Shows information about the global system and each entry manager.
+ * The number of entries are checked and a warning is shown if extra reusable
+ * entries are found.
+ * The extra entries are included in the count of reusable entries.
+ * @public
+ * @see common\ers.c#ers_report(void)
+ */
+void ers_report(void);
+
+/**
+ * Forcibly destroy all the entry managers, checking for nothing.
+ * The system is left as if no instances or entries had ever been allocated.
+ * All previous entries and instances of the managers become invalid.
+ * The use of this is NOT recommended.
+ * It should only be used in extreme situations to make shure all the memory
+ * allocated by this system is released.
+ * @public
+ * @see common\ers.c#ers_force_destroy_all(void)
+ */
+void ers_force_destroy_all(void);
+#endif /* DISABLE_ERS / not DISABLE_ERS */
+
+#endif /* _ERS_H_ */
diff --git a/src/common/graph.c b/src/common/graph.c
index 3602f511f..e56783816 100644
--- a/src/common/graph.c
+++ b/src/common/graph.c
@@ -1,318 +1,318 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// graph creation is enabled
-// #define ENABLE_GRAPH
-
-#ifdef ENABLE_GRAPH
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef _WIN32
- #include <unistd.h>
-#endif
-#ifdef MINGW
- #include <io.h>
-#endif
-
-#include "../common/core.h"
-#include "../common/timer.h"
-#include "../common/grfio.h"
-#include "../common/malloc.h"
-#include "graph.h"
-
-struct graph {
- int width;
- int height;
- int pallet_count;
- int png_len;
- int png_dirty;
- unsigned char* raw_data;
- unsigned char* png_data;
- int * graph_value;
- int graph_max;
-};
-
-void graph_write_dword(unsigned char* p,unsigned int v) {
- p[0] = (unsigned char)((v >> 24) & 0xFF);
- p[1] = (unsigned char)((v >> 16) & 0xFF);
- p[2] = (unsigned char)((v >> 8) & 0xFF);
- p[3] = (unsigned char)(v & 0xFF);
-}
-
-struct graph* graph_create(unsigned int x,unsigned int y) {
- struct graph *g = (struct graph*)aCalloc(sizeof(struct graph),1);
- if(g == NULL) return NULL;
- // 256 * 3 : ƒpƒŒƒbƒgƒf[ƒ^
- // x * y * 2 : ƒCƒ[ƒW‚̃oƒbƒtƒ@
- // 256 : ƒ`ƒƒƒ“ƒNƒf[ƒ^‚È‚Ç‚Ì—\”õ
- g->png_data = (unsigned char *) aMalloc(4 * 256 + (x + 1) * y * 2);
- g->raw_data = (unsigned char *) aCalloc( (x + 1) * y , 1);
- memcpy(
- g->png_data,
- "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52"
- "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x08\x03\x00\x00\x00\xFF\xFF\xFF"
- "\xFF\x00\x00\x00\x03\x50\x4C\x54\x45\xFF\xFF\xFF\xA7\xC4\x1B\xC8",0x30
- );
- graph_write_dword(g->png_data + 0x10,x);
- graph_write_dword(g->png_data + 0x14,y);
- graph_write_dword(g->png_data + 0x1D,grfio_crc32(g->png_data+0x0C,0x11));
- g->pallet_count = 1;
- g->width = x;
- g->height = y;
- g->png_dirty = 1;
- g->graph_value = (int *) aCalloc(x,sizeof(int));
- g->graph_max = 1;
- return g;
-}
-
-void graph_pallet(struct graph* g, int index,unsigned long c) {
- if(g == NULL || c >= 256) return;
-
- if(g->pallet_count <= index) {
- malloc_set(g->png_data + 0x29 + 3 * g->pallet_count,0,(index - g->pallet_count) * 3);
- g->pallet_count = index + 1;
- }
- g->png_data[0x29 + index * 3 ] = (unsigned char)((c >> 16) & 0xFF); // R
- g->png_data[0x29 + index * 3 + 1] = (unsigned char)((c >> 8) & 0xFF); // G
- g->png_data[0x29 + index * 3 + 2] = (unsigned char)( c & 0xFF); // B
- graph_write_dword(g->png_data + 0x21,g->pallet_count * 3);
- graph_write_dword(
- g->png_data + 0x29 + g->pallet_count * 3,
- grfio_crc32(g->png_data + 0x25,g->pallet_count * 3 + 4)
- );
- g->png_dirty = 1;
-}
-
-void graph_setpixel(struct graph* g,int x,int y,int color) {
- if(g == NULL || color >= 256) { return; }
- if(x < 0) x = 0;
- if(y < 0) y = 0;
- if(x >= g->width) { x = g->width - 1; }
- if(y >= g->height) { y = g->height - 1; }
- if(color >= g->pallet_count) { graph_pallet(g,color,graph_rgb(0,0,0)); }
-
- g->raw_data[y * (g->width + 1) + x + 1] = (unsigned char)color;
- g->png_dirty = 1;
-}
-
-int graph_getpixel(struct graph* g,int x,int y) {
- if(x < 0) x = 0;
- if(y < 0) y = 0;
- if(x >= g->width) { x = g->width - 1; }
- if(y >= g->height) { y = g->height - 1; }
- return g->raw_data[y * (g->width + 1) + x + 1];
-}
-
-const unsigned char* graph_output(struct graph* g,int *len) {
- unsigned long inflate_len;
- unsigned char *p;
-
- if(g == NULL) return NULL;
- if(g->png_dirty == 0) {
- *len = g->png_len;
- return g->png_data;
- }
-
- p = g->png_data + 0x2D + 3 * g->pallet_count;
- inflate_len = 2 * (g->width + 1) * g->height;
- memcpy(p + 4,"IDAT",4);
- encode_zip(p + 8,&inflate_len,g->raw_data,(g->width + 1) * g->height);
- graph_write_dword(p,inflate_len);
- graph_write_dword(p + 8 + inflate_len,grfio_crc32(p + 4, inflate_len + 4));
-
- p += 0x0C + inflate_len;
- memcpy(p,"\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",0x0C);
- p += 0x0C;
- g->png_len = p - g->png_data;
- g->png_dirty = 0;
- *len = g->png_len;
- return g->png_data;
-}
-
-void graph_free(struct graph* g) {
- if(g != NULL) {
- aFree(g->png_data);
- aFree(g->raw_data);
- aFree(g->graph_value);
- aFree(g);
- }
-}
-
-// ‚Æ‚è‚ ‚¦‚¸•sŒø—¦”ÅBŒã‚Ù‚Ç‘‚«’¼‚µ—\’è
-void graph_square(struct graph* g,int x,int y,int xe,int ye,int color) {
- int i,j;
- if(g == NULL) return;
- if(x < 0) { x = 0; }
- if(y < 0) { y = 0; }
- if(xe > g->width) { xe = g->width; }
- if(ye > g->height) { ye = g->height; }
- for(i = y;i < ye ; i++) {
- for(j = x; j < xe ; j++) {
- graph_setpixel(g,j,i,color);
- }
- }
-}
-
-// ‚Æ‚è‚ ‚¦‚¸•sŒø—¦”ÅBŒã‚Ù‚Ç‘‚«’¼‚µ—\’è
-void graph_scroll(struct graph* g,int n,int color) {
- int x,y;
- if(g == NULL) return;
- for(y = 0; y < g->height; y++) {
- for(x = 0; x < g->width - n; x++) {
- graph_setpixel(g,x,y,graph_getpixel(g,x + n,y));
- }
- for( ; x < g->width; x++) {
- graph_setpixel(g,x,y,color);
- }
- }
-}
-
-void graph_data(struct graph* g,int value) {
- int i, j, start;
- if(g == NULL) return;
- memmove(&g->graph_value[0],&g->graph_value[1],sizeof(int) * (g->width - 1));
- g->graph_value[g->width - 1] = value;
- if(value > g->graph_max) {
- // Å‘å’l‚ð’´‚¦‚½‚Ì‚ÅÄ•`‰æ
- g->graph_max = value;
- graph_square(g,0,0,g->width,g->height,0);
- start = 0;
- } else {
- // ƒXƒNƒ[ƒ‹‚µ‚ă|ƒCƒ“ƒg‘Å‚Â
- graph_scroll(g,1,0);
- start = g->width - 1;
- }
- for(i = start; i < g->width; i++) {
- int h0 = (i == 0 ? 0 : g->graph_value[i - 1]) * g->height / g->graph_max;
- int h1 = (g->graph_value[i] ) * g->height / g->graph_max;
- int h2 = (h0 < h1 ? 1 : -1);
- for(j = h0; j != h1; j += h2) {
- graph_setpixel(g,i,g->height - 1 - j,1);
- }
- graph_setpixel(g,i,g->height - 1 - h1,1);
- }
-}
-
-// ã‚ÌŠÖ”ŒQ‚ð—˜—p‚µ‚ÄAŽ©“®“I‚ɃOƒ‰ƒt‚ð쬂·‚éƒ^ƒCƒ}[ŒQ
-
-#define GRP_WIDTH 300 // ƒOƒ‰ƒt‚Ì•
-#define GRP_HEIGHT 200 // ƒOƒ‰ƒt‚Ì‚‚³
-#define GRP_COLOR graph_rgb(0,0,255) // ƒOƒ‰ƒt‚ÌF
-#define GRP_INTERVEL 60*1000 // ƒOƒ‰ƒt‚ÌXVŠÔŠu
-
-#define GRP_PATH "httpd/"
-
-struct graph_sensor {
- struct graph* graph;
- char* str;
- char hash[32];
- int scanid;
- int drawid;
- int interval;
- unsigned int (*func)(void);
-};
-
-static struct graph_sensor *sensor;
-static int sensor_max;
-
-static int graph_scan_timer(int tid,unsigned int tick,int id,int data)
-{
- if(id >= 0 && id < sensor_max)
- graph_data(sensor[id].graph,sensor[id].func());
- return 0;
-}
-
-// modified by Celest -- i'm trying to separate it from httpd if possible ^^;
-static int graph_draw_timer(int tid,unsigned int tick,int id,int data)
-{
- char png_file[24];
- FILE *fp;
-
- // create/update the png file
- do {
- const char *png_data;
- int len;
- sprintf (png_file, GRP_PATH"%s.png", sensor[id].hash);
- fp = fopen(png_file, "w");
- // if another png of the same hash exists
- // (i.e 2nd login server with the same sensors)
- // this will fail = not good >.<
- if (fp == NULL)
- break;
- png_data = graph_output(sensor[id].graph, &len);
- fwrite(png_data,1,len,fp);
- fclose(fp);
- } while (0);
-
- // create/update text snippet
- do {
- char buf[8192], *p;
- p = buf;
- sprintf (png_file, GRP_PATH"%s.graph", sensor[id].hash);
- fp = fopen(png_file, "w");
- if (fp == NULL)
- break;
- p += sprintf(p,"<h2>%s</h2>\n\n",
- sensor[id].str);
- p += sprintf(p,"<p><img src=\"%s.png\" width=\"%d\" height=\"%d\"></p>\n",
- sensor[id].hash, GRP_WIDTH,GRP_HEIGHT);
- p += sprintf(p,"<p>Max: %d, Interval: %d sec</p>\n\n",
- sensor[id].graph->graph_max, sensor[id].interval / 1000);
- fprintf(fp, buf);
- fclose(fp);
- } while (0);
-
- return 0;
-}
-
-void graph_add_sensor(const unsigned char* string, int interval, unsigned int (*callback_func)(void))
-{
- int draw_interval = interval * 2;
- struct graph *g = graph_create(GRP_WIDTH,GRP_HEIGHT);
- graph_pallet(g,1,GRP_COLOR);
-
- sensor = (struct graph_sensor *) aRealloc(sensor, sizeof(struct graph_sensor) * (sensor_max + 1));
- sensor[sensor_max].graph = g;
- sensor[sensor_max].str = aStrdup(string);
- // create crc32 hash of the sensor's name
- sprintf (sensor[sensor_max].hash, "%lu%c", grfio_crc32(string,strlen(string)), 'a' + SERVER_TYPE);
- sensor[sensor_max].func = callback_func;
- sensor[sensor_max].scanid = add_timer_interval(gettick() + 500, graph_scan_timer, sensor_max, 0, interval);
- sensor[sensor_max].drawid = add_timer_interval(gettick() + 1000, graph_draw_timer, sensor_max, 0, draw_interval < 60000 ? 60000 : draw_interval);
- sensor[sensor_max].interval = interval;
- sensor_max++;
-
-}
-
-void graph_final (void)
-{
- int i;
- for(i = 0; i < sensor_max; i++) {
- char png_file[24];
- // remove the png and snippet file
- sprintf (png_file, GRP_PATH"%s.png", sensor[i].hash);
- unlink (png_file);
- sprintf (png_file, GRP_PATH"%s.graph", sensor[i].hash);
- unlink (png_file);
- graph_free(sensor[i].graph);
- aFree(sensor[i].str);
- //delete_timer(sensor[i].scanid,graph_scan_timer);
- //delete_timer(sensor[i].drawid,graph_draw_timer);
- }
- aFree(sensor);
- sensor_max = 0;
-}
-
-void graph_init (void)
-{
- graph_add_sensor ("Memory Usage", 1000, malloc_usage);
- add_timer_func_list(graph_scan_timer, "graph_scan_timer");
- add_timer_func_list(graph_draw_timer, "graph_draw_timer");
-}
-
-#else
-void graph_init (void) {}
-void graph_final (void) {}
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// graph creation is enabled
+// #define ENABLE_GRAPH
+
+#ifdef ENABLE_GRAPH
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef _WIN32
+ #include <unistd.h>
+#endif
+#ifdef MINGW
+ #include <io.h>
+#endif
+
+#include "../common/core.h"
+#include "../common/timer.h"
+#include "../common/grfio.h"
+#include "../common/malloc.h"
+#include "graph.h"
+
+struct graph {
+ int width;
+ int height;
+ int pallet_count;
+ int png_len;
+ int png_dirty;
+ unsigned char* raw_data;
+ unsigned char* png_data;
+ int * graph_value;
+ int graph_max;
+};
+
+void graph_write_dword(unsigned char* p,unsigned int v) {
+ p[0] = (unsigned char)((v >> 24) & 0xFF);
+ p[1] = (unsigned char)((v >> 16) & 0xFF);
+ p[2] = (unsigned char)((v >> 8) & 0xFF);
+ p[3] = (unsigned char)(v & 0xFF);
+}
+
+struct graph* graph_create(unsigned int x,unsigned int y) {
+ struct graph *g = (struct graph*)aCalloc(sizeof(struct graph),1);
+ if(g == NULL) return NULL;
+ // 256 * 3 : ƒpƒŒƒbƒgƒf[ƒ^
+ // x * y * 2 : ƒCƒ[ƒW‚̃oƒbƒtƒ@
+ // 256 : ƒ`ƒƒƒ“ƒNƒf[ƒ^‚È‚Ç‚Ì—\”õ
+ g->png_data = (unsigned char *) aMalloc(4 * 256 + (x + 1) * y * 2);
+ g->raw_data = (unsigned char *) aCalloc( (x + 1) * y , 1);
+ memcpy(
+ g->png_data,
+ "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52"
+ "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x08\x03\x00\x00\x00\xFF\xFF\xFF"
+ "\xFF\x00\x00\x00\x03\x50\x4C\x54\x45\xFF\xFF\xFF\xA7\xC4\x1B\xC8",0x30
+ );
+ graph_write_dword(g->png_data + 0x10,x);
+ graph_write_dword(g->png_data + 0x14,y);
+ graph_write_dword(g->png_data + 0x1D,grfio_crc32(g->png_data+0x0C,0x11));
+ g->pallet_count = 1;
+ g->width = x;
+ g->height = y;
+ g->png_dirty = 1;
+ g->graph_value = (int *) aCalloc(x,sizeof(int));
+ g->graph_max = 1;
+ return g;
+}
+
+void graph_pallet(struct graph* g, int index,unsigned long c) {
+ if(g == NULL || c >= 256) return;
+
+ if(g->pallet_count <= index) {
+ malloc_set(g->png_data + 0x29 + 3 * g->pallet_count,0,(index - g->pallet_count) * 3);
+ g->pallet_count = index + 1;
+ }
+ g->png_data[0x29 + index * 3 ] = (unsigned char)((c >> 16) & 0xFF); // R
+ g->png_data[0x29 + index * 3 + 1] = (unsigned char)((c >> 8) & 0xFF); // G
+ g->png_data[0x29 + index * 3 + 2] = (unsigned char)( c & 0xFF); // B
+ graph_write_dword(g->png_data + 0x21,g->pallet_count * 3);
+ graph_write_dword(
+ g->png_data + 0x29 + g->pallet_count * 3,
+ grfio_crc32(g->png_data + 0x25,g->pallet_count * 3 + 4)
+ );
+ g->png_dirty = 1;
+}
+
+void graph_setpixel(struct graph* g,int x,int y,int color) {
+ if(g == NULL || color >= 256) { return; }
+ if(x < 0) x = 0;
+ if(y < 0) y = 0;
+ if(x >= g->width) { x = g->width - 1; }
+ if(y >= g->height) { y = g->height - 1; }
+ if(color >= g->pallet_count) { graph_pallet(g,color,graph_rgb(0,0,0)); }
+
+ g->raw_data[y * (g->width + 1) + x + 1] = (unsigned char)color;
+ g->png_dirty = 1;
+}
+
+int graph_getpixel(struct graph* g,int x,int y) {
+ if(x < 0) x = 0;
+ if(y < 0) y = 0;
+ if(x >= g->width) { x = g->width - 1; }
+ if(y >= g->height) { y = g->height - 1; }
+ return g->raw_data[y * (g->width + 1) + x + 1];
+}
+
+const unsigned char* graph_output(struct graph* g,int *len) {
+ unsigned long inflate_len;
+ unsigned char *p;
+
+ if(g == NULL) return NULL;
+ if(g->png_dirty == 0) {
+ *len = g->png_len;
+ return g->png_data;
+ }
+
+ p = g->png_data + 0x2D + 3 * g->pallet_count;
+ inflate_len = 2 * (g->width + 1) * g->height;
+ memcpy(p + 4,"IDAT",4);
+ encode_zip(p + 8,&inflate_len,g->raw_data,(g->width + 1) * g->height);
+ graph_write_dword(p,inflate_len);
+ graph_write_dword(p + 8 + inflate_len,grfio_crc32(p + 4, inflate_len + 4));
+
+ p += 0x0C + inflate_len;
+ memcpy(p,"\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",0x0C);
+ p += 0x0C;
+ g->png_len = p - g->png_data;
+ g->png_dirty = 0;
+ *len = g->png_len;
+ return g->png_data;
+}
+
+void graph_free(struct graph* g) {
+ if(g != NULL) {
+ aFree(g->png_data);
+ aFree(g->raw_data);
+ aFree(g->graph_value);
+ aFree(g);
+ }
+}
+
+// ‚Æ‚è‚ ‚¦‚¸•sŒø—¦”ÅBŒã‚Ù‚Ç‘‚«’¼‚µ—\’è
+void graph_square(struct graph* g,int x,int y,int xe,int ye,int color) {
+ int i,j;
+ if(g == NULL) return;
+ if(x < 0) { x = 0; }
+ if(y < 0) { y = 0; }
+ if(xe > g->width) { xe = g->width; }
+ if(ye > g->height) { ye = g->height; }
+ for(i = y;i < ye ; i++) {
+ for(j = x; j < xe ; j++) {
+ graph_setpixel(g,j,i,color);
+ }
+ }
+}
+
+// ‚Æ‚è‚ ‚¦‚¸•sŒø—¦”ÅBŒã‚Ù‚Ç‘‚«’¼‚µ—\’è
+void graph_scroll(struct graph* g,int n,int color) {
+ int x,y;
+ if(g == NULL) return;
+ for(y = 0; y < g->height; y++) {
+ for(x = 0; x < g->width - n; x++) {
+ graph_setpixel(g,x,y,graph_getpixel(g,x + n,y));
+ }
+ for( ; x < g->width; x++) {
+ graph_setpixel(g,x,y,color);
+ }
+ }
+}
+
+void graph_data(struct graph* g,int value) {
+ int i, j, start;
+ if(g == NULL) return;
+ memmove(&g->graph_value[0],&g->graph_value[1],sizeof(int) * (g->width - 1));
+ g->graph_value[g->width - 1] = value;
+ if(value > g->graph_max) {
+ // Å‘å’l‚ð’´‚¦‚½‚Ì‚ÅÄ•`‰æ
+ g->graph_max = value;
+ graph_square(g,0,0,g->width,g->height,0);
+ start = 0;
+ } else {
+ // ƒXƒNƒ[ƒ‹‚µ‚ă|ƒCƒ“ƒg‘Å‚Â
+ graph_scroll(g,1,0);
+ start = g->width - 1;
+ }
+ for(i = start; i < g->width; i++) {
+ int h0 = (i == 0 ? 0 : g->graph_value[i - 1]) * g->height / g->graph_max;
+ int h1 = (g->graph_value[i] ) * g->height / g->graph_max;
+ int h2 = (h0 < h1 ? 1 : -1);
+ for(j = h0; j != h1; j += h2) {
+ graph_setpixel(g,i,g->height - 1 - j,1);
+ }
+ graph_setpixel(g,i,g->height - 1 - h1,1);
+ }
+}
+
+// ã‚ÌŠÖ”ŒQ‚ð—˜—p‚µ‚ÄAŽ©“®“I‚ɃOƒ‰ƒt‚ð쬂·‚éƒ^ƒCƒ}[ŒQ
+
+#define GRP_WIDTH 300 // ƒOƒ‰ƒt‚Ì•
+#define GRP_HEIGHT 200 // ƒOƒ‰ƒt‚Ì‚‚³
+#define GRP_COLOR graph_rgb(0,0,255) // ƒOƒ‰ƒt‚ÌF
+#define GRP_INTERVEL 60*1000 // ƒOƒ‰ƒt‚ÌXVŠÔŠu
+
+#define GRP_PATH "httpd/"
+
+struct graph_sensor {
+ struct graph* graph;
+ char* str;
+ char hash[32];
+ int scanid;
+ int drawid;
+ int interval;
+ unsigned int (*func)(void);
+};
+
+static struct graph_sensor *sensor;
+static int sensor_max;
+
+static int graph_scan_timer(int tid,unsigned int tick,int id,int data)
+{
+ if(id >= 0 && id < sensor_max)
+ graph_data(sensor[id].graph,sensor[id].func());
+ return 0;
+}
+
+// modified by Celest -- i'm trying to separate it from httpd if possible ^^;
+static int graph_draw_timer(int tid,unsigned int tick,int id,int data)
+{
+ char png_file[24];
+ FILE *fp;
+
+ // create/update the png file
+ do {
+ const char *png_data;
+ int len;
+ sprintf (png_file, GRP_PATH"%s.png", sensor[id].hash);
+ fp = fopen(png_file, "w");
+ // if another png of the same hash exists
+ // (i.e 2nd login server with the same sensors)
+ // this will fail = not good >.<
+ if (fp == NULL)
+ break;
+ png_data = graph_output(sensor[id].graph, &len);
+ fwrite(png_data,1,len,fp);
+ fclose(fp);
+ } while (0);
+
+ // create/update text snippet
+ do {
+ char buf[8192], *p;
+ p = buf;
+ sprintf (png_file, GRP_PATH"%s.graph", sensor[id].hash);
+ fp = fopen(png_file, "w");
+ if (fp == NULL)
+ break;
+ p += sprintf(p,"<h2>%s</h2>\n\n",
+ sensor[id].str);
+ p += sprintf(p,"<p><img src=\"%s.png\" width=\"%d\" height=\"%d\"></p>\n",
+ sensor[id].hash, GRP_WIDTH,GRP_HEIGHT);
+ p += sprintf(p,"<p>Max: %d, Interval: %d sec</p>\n\n",
+ sensor[id].graph->graph_max, sensor[id].interval / 1000);
+ fprintf(fp, buf);
+ fclose(fp);
+ } while (0);
+
+ return 0;
+}
+
+void graph_add_sensor(const unsigned char* string, int interval, unsigned int (*callback_func)(void))
+{
+ int draw_interval = interval * 2;
+ struct graph *g = graph_create(GRP_WIDTH,GRP_HEIGHT);
+ graph_pallet(g,1,GRP_COLOR);
+
+ sensor = (struct graph_sensor *) aRealloc(sensor, sizeof(struct graph_sensor) * (sensor_max + 1));
+ sensor[sensor_max].graph = g;
+ sensor[sensor_max].str = aStrdup(string);
+ // create crc32 hash of the sensor's name
+ sprintf (sensor[sensor_max].hash, "%lu%c", grfio_crc32(string,strlen(string)), 'a' + SERVER_TYPE);
+ sensor[sensor_max].func = callback_func;
+ sensor[sensor_max].scanid = add_timer_interval(gettick() + 500, graph_scan_timer, sensor_max, 0, interval);
+ sensor[sensor_max].drawid = add_timer_interval(gettick() + 1000, graph_draw_timer, sensor_max, 0, draw_interval < 60000 ? 60000 : draw_interval);
+ sensor[sensor_max].interval = interval;
+ sensor_max++;
+
+}
+
+void graph_final (void)
+{
+ int i;
+ for(i = 0; i < sensor_max; i++) {
+ char png_file[24];
+ // remove the png and snippet file
+ sprintf (png_file, GRP_PATH"%s.png", sensor[i].hash);
+ unlink (png_file);
+ sprintf (png_file, GRP_PATH"%s.graph", sensor[i].hash);
+ unlink (png_file);
+ graph_free(sensor[i].graph);
+ aFree(sensor[i].str);
+ //delete_timer(sensor[i].scanid,graph_scan_timer);
+ //delete_timer(sensor[i].drawid,graph_draw_timer);
+ }
+ aFree(sensor);
+ sensor_max = 0;
+}
+
+void graph_init (void)
+{
+ graph_add_sensor ("Memory Usage", 1000, malloc_usage);
+ add_timer_func_list(graph_scan_timer, "graph_scan_timer");
+ add_timer_func_list(graph_draw_timer, "graph_draw_timer");
+}
+
+#else
+void graph_init (void) {}
+void graph_final (void) {}
+#endif
diff --git a/src/common/graph.h b/src/common/graph.h
index 6c80dd41c..9c8b73580 100644
--- a/src/common/graph.h
+++ b/src/common/graph.h
@@ -1,27 +1,27 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _GRAPH_H_
-#define _GRAPH_H_
-
-void graph_init (void);
-void graph_final (void);
-
-struct graph* graph_create(unsigned int x,unsigned int y);
-void graph_pallet(struct graph* g, int index,unsigned long c);
-const unsigned char* graph_output(struct graph* g,int *len);
-void graph_setpixel(struct graph* g,int x,int y,int color);
-void graph_scroll(struct graph* g,int n,int color);
-void graph_square(struct graph* g,int x,int y,int xe,int ye,int color);
-
-// athena‚Ìó‘Ԃ𒲸‚·‚éƒZƒ“ƒT[‚ð’ljÁ‚·‚éB
-// string : ƒZƒ“ƒT[‚Ì–¼Ì(Login Users ‚È‚Ç)
-// inetrval : ƒZƒ“ƒT[‚Ì’l‚ðŠ“¾‚·‚éŠÔŠu(msec)
-// callback_func : ƒZƒ“ƒT[‚Ì’l‚ð•Ô‚·ŠÖ”( unsigned int login_users(void); ‚È‚Ç)
-
-void graph_add_sensor(const char* string, int interval, unsigned int (*callback_func)(void));
-
-#define graph_rgb(r,g,b) (((r) << 16) | ((g) << 8) | (b))
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _GRAPH_H_
+#define _GRAPH_H_
+
+void graph_init (void);
+void graph_final (void);
+
+struct graph* graph_create(unsigned int x,unsigned int y);
+void graph_pallet(struct graph* g, int index,unsigned long c);
+const unsigned char* graph_output(struct graph* g,int *len);
+void graph_setpixel(struct graph* g,int x,int y,int color);
+void graph_scroll(struct graph* g,int n,int color);
+void graph_square(struct graph* g,int x,int y,int xe,int ye,int color);
+
+// athena‚Ìó‘Ԃ𒲸‚·‚éƒZƒ“ƒT[‚ð’ljÁ‚·‚éB
+// string : ƒZƒ“ƒT[‚Ì–¼Ì(Login Users ‚È‚Ç)
+// inetrval : ƒZƒ“ƒT[‚Ì’l‚ðŠ“¾‚·‚éŠÔŠu(msec)
+// callback_func : ƒZƒ“ƒT[‚Ì’l‚ð•Ô‚·ŠÖ”( unsigned int login_users(void); ‚È‚Ç)
+
+void graph_add_sensor(const char* string, int interval, unsigned int (*callback_func)(void));
+
+#define graph_rgb(r,g,b) (((r) << 16) | ((g) << 8) | (b))
+
+#endif
+
diff --git a/src/common/grfio.c b/src/common/grfio.c
index 5597177c5..a821ee269 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -1,1031 +1,1031 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-/*********************************************************************
- *
- * Ragnarok Online Emulator : grfio.c -- grf file I/O Module
- *--------------------------------------------------------------------
- * special need library : zlib
- *********************************************************************
- * $Id: grfio.c,v 1.2 2004/09/29 17:31:49 kalaspuff Exp $
- *
- * 2002/12/18... the original edition
- * 2003/01/23 ... Code correction
- * 2003/02/01 ... An addition and decryption processing are improved for LocalFile and two or more GRF(s) check processing.
- * 2003/02/02 ... Even if there is no grf it does not stop -- as -- correction
- * 2003/02/02... grf reading specification can be added later -- as -- correction (grfio_add function addition)
- * 2003/02 / 03... at the time of grfio_resourcecheck processing the entry addition processing method -- correction
- * 2003/02/05... change of the processing in grfio_init
- * 2003/02/23... a local file check -- GRFIO_LOCAL -- switch (Defoe -- Function Off)
- * 2003/10/21 ... The data of alpha client was read.
- * 2003/11/10 ... Ready new grf format.
- * 2003/11/11 ... version check fix & bug fix
- * 2006/04/16 ... fixed crash grfio_find_file when file is not found.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#include "grfio.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
-#include "../zlib/unzip.h"
-
-#define CHUNK 16384
-
-#ifdef __WIN32
- #include "../zlib/zlib.h"
- #include "../zlib/iowin32.h"
-#else
- #ifndef __FREEBSD__
- #include <zlib.h>
- #endif
-#endif
-
-typedef unsigned char BYTE;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-
-//static char data_file[1024] = ""; // "data.grf";
-//static char sdata_file[1024] = ""; // "sdata.grf";
-//static char adata_file[1024] = ""; // "adata.grf";
-static char data_dir[1024] = ""; // "../";
-
-//----------------------------
-// file entry table struct
-//----------------------------
-typedef struct {
- int srclen; // compressed size
- int srclen_aligned; //
- int declen; // original size
- int srcpos;
- short next;
- int cycle;
- char type;
- char fn[128-4*5]; // file name
- char *fnd;
- signed char gentry; // read grf file select
-} FILELIST;
-//gentry ... 0 : It acquires from a local file.
-// It acquires from the resource file of 1>=:gentry_table[gentry-1].
-// 1<=: Check a local file.
-// If it is, after re-setting to 0, it acquires from a local file.
-// If there is nothing, mark reversal will be carried out, and it will re-set, and will acquire from a resource file as well as 1>=.
-
-//Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces.
-
-#define GENTRY_LIMIT 512
-#define FILELIST_LIMIT 1048576 // temporary maximum, and a theory top maximum are 2G.
-
-static FILELIST *filelist = NULL;
-static int filelist_entrys = 0;
-static int filelist_maxentry = 0;
-
-static char **gentry_table = NULL;
-static int gentry_entrys = 0;
-static int gentry_maxentry = 0;
-
-//----------------------------
-// file list hash table
-//----------------------------
-static int filelist_hash[256];
-
-//----------------------------
-// grf decode data table
-//----------------------------
-static unsigned char BitMaskTable[8] = {
- 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-static char BitSwapTable1[64] = {
- 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
-};
-static char BitSwapTable2[64] = {
- 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
-};
-static char BitSwapTable3[32] = {
- 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
- 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
-};
-
-static unsigned char NibbleData[4][64]={
- {
- 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22, 0xb3, 0xd8, 0x84, 0x1e,
- 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59, 0x05, 0x3b, 0x7a, 0x85,
- 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f, 0x2d, 0x14, 0xb1, 0x72,
- 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05, 0x52, 0x6e, 0x0f, 0xd9,
- }, {
- 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36, 0x4f, 0xf9, 0x60, 0x5a, 0xa3,
- 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c, 0xba, 0x24, 0xfe, 0x8f, 0x19,
- 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb, 0x91, 0x37, 0x8d, 0x0d, 0x78,
- 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2, 0x57, 0xe8, 0x22, 0x74, 0xce,
- }, {
- 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2, 0x7c, 0xb6, 0xd9, 0x68, 0x15,
- 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07, 0x9b, 0xe5, 0x83, 0x9b, 0x68,
- 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8, 0xe5, 0x7c, 0x2f, 0x83, 0xda,
- 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d, 0x40, 0x0b, 0x58, 0xe6, 0x3d,
- }, {
- 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a, 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4,
- 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20, 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62,
- 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14, 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d,
- 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3, 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb,
- }
-};
-/*-----------------
- * long data get
- */
-static unsigned int getlong(unsigned char *p)
-{
-// return *p+p[1]*256+(p[2]+p[3]*256)*65536;
- return p[0]
- | p[1] << 0x08
- | p[2] << 0x10
- | p[3] << 0x18; // Shinomori
-}
-
-/*==========================================
- * Grf data decode : Subs
- *------------------------------------------
- */
-static void NibbleSwap(BYTE *Src, int len)
-{
- for(;0<len;len--,Src++) {
- *Src = (*Src>>4) | (*Src<<4);
- }
-}
-
-static void BitConvert(BYTE *Src,char *BitSwapTable)
-{
- int lop,prm;
- BYTE tmp[8];
-// *(DWORD*)tmp=*(DWORD*)(tmp+4)=0;
- malloc_tsetdword(tmp,0,8);
- for(lop=0;lop!=64;lop++) {
- prm = BitSwapTable[lop]-1;
- if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7]) {
- tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7];
- }
- }
-// *(DWORD*)Src = *(DWORD*)tmp;
-// *(DWORD*)(Src+4) = *(DWORD*)(tmp+4);
- memcpy(Src,tmp,8);
-}
-
-static void BitConvert4(BYTE *Src)
-{
- int lop,prm;
- BYTE tmp[8];
- tmp[0] = ((Src[7]<<5) | (Src[4]>>3)) & 0x3f; // ..0 vutsr
- tmp[1] = ((Src[4]<<1) | (Src[5]>>7)) & 0x3f; // ..srqpo n
- tmp[2] = ((Src[4]<<5) | (Src[5]>>3)) & 0x3f; // ..o nmlkj
- tmp[3] = ((Src[5]<<1) | (Src[6]>>7)) & 0x3f; // ..kjihg f
- tmp[4] = ((Src[5]<<5) | (Src[6]>>3)) & 0x3f; // ..g fedcb
- tmp[5] = ((Src[6]<<1) | (Src[7]>>7)) & 0x3f; // ..cba98 7
- tmp[6] = ((Src[6]<<5) | (Src[7]>>3)) & 0x3f; // ..8 76543
- tmp[7] = ((Src[7]<<1) | (Src[4]>>7)) & 0x3f; // ..43210 v
-
- for(lop=0;lop!=4;lop++) {
- tmp[lop] = (NibbleData[lop][tmp[lop*2]] & 0xf0)
- | (NibbleData[lop][tmp[lop*2+1]] & 0x0f);
- }
-
- *(DWORD*)(tmp+4)=0;
- for(lop=0;lop!=32;lop++) {
- prm = BitSwapTable3[lop]-1;
- if (tmp[prm >> 3] & BitMaskTable[prm & 7]) {
- tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7];
- }
- }
-// *(DWORD*)Src ^= *(DWORD*)(tmp+4);
- Src[0] ^= tmp[4];
- Src[1] ^= tmp[5];
- Src[2] ^= tmp[6];
- Src[3] ^= tmp[7];
-}
-
-static void decode_des_etc(BYTE *buf,int len,int type,int cycle)
-{
- int lop,cnt=0;
- if(cycle<3) cycle=3;
- else if(cycle<5) cycle++;
- else if(cycle<7) cycle+=9;
- else cycle+=15;
-
- for(lop=0;lop*8<len;lop++,buf+=8) {
- if(lop<20 || (type==0 && lop%cycle==0)){ // des
- BitConvert(buf,BitSwapTable1);
- BitConvert4(buf);
- BitConvert(buf,BitSwapTable2);
- } else {
- if(cnt==7 && type==0){
- int a;
- BYTE tmp[8];
- *(DWORD*)tmp = *(DWORD*)buf;
- *(DWORD*)(tmp+4) = *(DWORD*)(buf+4);
- cnt=0;
- buf[0]=tmp[3];
- buf[1]=tmp[4];
- buf[2]=tmp[6];
- buf[3]=tmp[0];
- buf[4]=tmp[1];
- buf[5]=tmp[2];
- buf[6]=tmp[5];
- a=tmp[7];
- if(a==0x00) a=0x2b;
- else if(a==0x2b) a=0x00;
- else if(a==0x01) a=0x68;
- else if(a==0x68) a=0x01;
- else if(a==0x48) a=0x77;
- else if(a==0x77) a=0x48;
- else if(a==0x60) a=0xff;
- else if(a==0xff) a=0x60;
- else if(a==0x6c) a=0x80;
- else if(a==0x80) a=0x6c;
- else if(a==0xb9) a=0xc0;
- else if(a==0xc0) a=0xb9;
- else if(a==0xeb) a=0xfe;
- else if(a==0xfe) a=0xeb;
- buf[7]=a;
- }
- cnt++;
- }
- }
-}
-/*==========================================
- * Grf data decode sub : zip
- *------------------------------------------
- */
-int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen)
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
- stream.next_out = (Bytef*) dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
-
- err = inflateInit(&stream);
- if (err != Z_OK) return err;
-
- err = inflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- inflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = inflateEnd(&stream);
- return err;
-}
-
-int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen) {
- z_stream stream;
- int err;
- malloc_tsetdword(&stream, 0, sizeof(stream));
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
- stream.next_out = (Bytef*) dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
-
- err = deflateInit(&stream,Z_DEFAULT_COMPRESSION);
- if (err != Z_OK) return err;
-
- err = deflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- inflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = deflateEnd(&stream);
- return err;
-}
-
-/* ===================================
-* Unzips a file. 1: success, 0: error
-* Adapted from miniunz.c [Celest]
-* Version 1.01b, May 30th, 2004
-* Copyright (C) 1998-2004 Gilles Vollant
-* -------------------------------------
-*/
-int deflate_file (const char *source, const char *filename)
-{
-#ifdef _WIN32
- zlib_filefunc_def ffunc;
-#endif
- unzFile uf = NULL;
- int err = UNZ_OK;
- uInt size_buf = 8192;
- FILE *fout = NULL;
- void *buf;
-
-#ifdef _WIN32
- fill_win32_filefunc(&ffunc);
- uf = unzOpen2(source, &ffunc);
-#else
- uf = unzOpen(source);
-#endif
-
- if (uf == NULL) {
- //printf("Cannot open %s\n", source);
- return 0;
- }
- //printf("%s opened\n", source);
-
- if (unzLocateFile(uf, filename, 0) != UNZ_OK) {
- //printf("file %s not found in the zipfile\n", filename);
- return 0;
- }
-
- err = unzOpenCurrentFilePassword(uf, NULL);
- //if (err != UNZ_OK)
- // printf("error %d with zipfile in unzOpenCurrentFilePassword\n", err);
-
- fout = fopen(filename,"wb");
- if (fout == NULL) {
- //printf("error opening %s\n", filename);
- return 0;
- }
-
- buf = (void *)aMalloc(size_buf);
- do {
- err = unzReadCurrentFile(uf, buf, size_buf);
- if (err < 0) {
- //printf("error %d with zipfile in unzReadCurrentFile\n", err);
- break;
- }
- if (err > 0 &&
- fwrite(buf, err, 1, fout)!=1)
- {
- //printf("error in writing extracted file\n");
- err = UNZ_ERRNO;
- break;
- }
- } while (err > 0);
-
- if (fout) fclose(fout);
-
- if (err == UNZ_OK) {
- err = unzCloseCurrentFile (uf);
- //if (err != UNZ_OK)
- // printf("error %d with zipfile in unzCloseCurrentFile\n", err);
- aFree(buf);
- return (err == UNZ_OK);
- }
-
- unzCloseCurrentFile(uf); /* don't lose the error */
-
- return 0;
-}
-
-unsigned long grfio_crc32 (const unsigned char *buf, unsigned int len)
-{
- return crc32(crc32(0L, Z_NULL, 0), buf, len);
-}
-
-/***********************************************************
- *** File List Subroutines ***
- ***********************************************************/
-
-/*==========================================
- * File List : Hash make
- *------------------------------------------
- */
-static int filehash(unsigned char *fname)
-{
- unsigned int hash=0;
- while(*fname) {
- hash = ((hash<<1)+(hash>>7)*9+tolower(*fname));
- fname++;
- }
- return hash & 255;
-}
-
-/*==========================================
- * File List : Hash initalize
- *------------------------------------------
- */
-static void hashinit(void)
-{
- int lop;
- for (lop = 0; lop < 256; lop++)
- filelist_hash[lop] = -1;
-}
-
-/*==========================================
- * File List : File find
- *------------------------------------------
- */
-static FILELIST *filelist_find(char *fname)
-{
- int hash;
-
- if (!filelist)
- return NULL;
-
- for (hash = filelist_hash[filehash((unsigned char *) fname)]; hash >= 0; hash = filelist[hash].next) {
- if(strcmpi(filelist[hash].fn, fname) == 0)
- break;
- }
-
- return (hash >= 0) ? &filelist[hash] : NULL;
-}
-
-char *grfio_find_file(char *fname){
- FILELIST *filelist = filelist_find(fname);
- if (!filelist) return NULL;
- return (!filelist->fnd?filelist->fn:filelist->fnd);
-}
-
-/*==========================================
- * File List : Filelist add
- *------------------------------------------
- */
-#define FILELIST_ADDS 1024 // number increment of file lists `
-
-static FILELIST* filelist_add(FILELIST *entry)
-{
- int hash;
-
- if (filelist_entrys >= FILELIST_LIMIT) {
- ShowFatalError("GRF filelist limit reached (filelist_add)!\n");
- exit(1);
- }
-
- if (filelist_entrys >= filelist_maxentry) {
- filelist = (FILELIST *)aRealloc(filelist, (filelist_maxentry + FILELIST_ADDS) * sizeof(FILELIST));
- malloc_tsetdword(filelist + filelist_maxentry, '\0', FILELIST_ADDS * sizeof(FILELIST));
- filelist_maxentry += FILELIST_ADDS;
- }
-
- memcpy (&filelist[filelist_entrys], entry, sizeof(FILELIST));
-
- hash = filehash((unsigned char *) entry->fn);
- filelist[filelist_entrys].next = filelist_hash[hash];
- filelist_hash[hash] = filelist_entrys;
-
- filelist_entrys++;
-
- return &filelist[filelist_entrys - 1];
-}
-
-static FILELIST* filelist_modify(FILELIST *entry)
-{
- FILELIST *fentry;
- if ((fentry = filelist_find(entry->fn)) != NULL) {
- int tmp = fentry->next;
- memcpy(fentry, entry, sizeof(FILELIST));
- fentry->next = tmp;
- } else {
- fentry = filelist_add(entry);
- }
- return fentry;
-}
-
-/*==========================================
- * File List : filelist size adjust
- *------------------------------------------
- */
-static void filelist_adjust(void)
-{
- if (filelist != NULL) {
- if (filelist_maxentry > filelist_entrys) {
- filelist = (FILELIST *)aRealloc(
- filelist, filelist_entrys * sizeof(FILELIST));
- filelist_maxentry = filelist_entrys;
- }
- }
-}
-
-/***********************************************************
- *** Grfio Sobroutines ***
- ***********************************************************/
-
-/*==========================================
- * Grfio : Resource file size get
- *------------------------------------------
- */
-int grfio_size(char *fname)
-{
- FILELIST *entry;
-
- entry = filelist_find(fname);
-
- if (entry == NULL || entry->gentry < 0) { // LocalFileCheck
- char lfname[256], *p;
- FILELIST lentry;
- struct stat st;
-
- sprintf(lfname, "%s%s", data_dir, fname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p=='\\') *p = '/'; // * At the time of Unix
-
- if (stat(lfname, &st) == 0) {
- strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
- lentry.fnd = NULL;
- lentry.declen = st.st_size;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else if (entry == NULL) {
- ShowError("%s not found (grfio_size)\n", fname);
- //exit(1);
- return -1;
- }
- }
- return entry->declen;
-}
-
-/*==========================================
- * Grfio : Resource file read & size get
- *------------------------------------------
- */
-void* grfio_reads(char *fname, int *size)
-{
- FILE *in;
- FILELIST *entry;
- unsigned char *buf2 = NULL;
-
- entry = filelist_find(fname);
-
- if (entry == NULL || entry->gentry <= 0) { // LocalFileCheck
- char lfname[256], *p;
- FILELIST lentry;
-
- sprintf(lfname, "%s%s", data_dir, fname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p == '\\') *p = '/'; // * At the time of Unix
-
- in = fopen(lfname, "rb");
- if (in != NULL) {
- if (entry != NULL && entry->gentry == 0) {
- lentry.declen = entry->declen;
- } else {
- fseek(in,0,2); // SEEK_END
- lentry.declen = ftell(in);
- }
- fseek(in,0,0); // SEEK_SET
- buf2 = (unsigned char *)aMallocA(lentry.declen + 1024);
- fread(buf2, 1, lentry.declen, in);
- fclose(in);
- strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
- lentry.fnd = NULL;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else {
- if (entry != NULL && entry->gentry < 0) {
- entry->gentry = -entry->gentry; // local file checked
- } else {
- ShowError("%s not found (grfio_reads - local file %s)\n", fname, lfname);
- return NULL;
- }
- }
- }
- if (entry != NULL && entry->gentry > 0) { // Archive[GRF] File Read
- char *gfname = gentry_table[entry->gentry - 1];
- in = fopen(gfname, "rb");
- if(in != NULL) {
- unsigned char *buf = (unsigned char *)aMallocA(entry->srclen_aligned + 1024);
- fseek(in, entry->srcpos, 0);
- fread(buf, 1, entry->srclen_aligned, in);
- fclose(in);
- buf2 = (unsigned char *)aMallocA(entry->declen + 1024);
- if (entry->type == 1 || entry->type == 3 || entry->type == 5) {
- uLongf len;
- if (entry->cycle >= 0)
- decode_des_etc(buf, entry->srclen_aligned, entry->cycle == 0, entry->cycle);
- len = entry->declen;
- decode_zip(buf2, &len, buf, entry->srclen);
- if (len != entry->declen) {
- ShowError("decode_zip size miss match err: %d != %d\n", (int)len, entry->declen);
- aFree(buf);
- aFree(buf2);
- return NULL;
- }
- } else {
- memcpy(buf2, buf, entry->declen);
- }
- aFree(buf);
- } else {
- ShowError("%s not found (grfio_reads - grf file %s)\n", fname, gfname);
- return NULL;
- }
- }
- if (size != NULL && entry != NULL)
- *size = entry->declen;
-
- return buf2;
-}
-
-/*==========================================
- * Resource filename decode
- *------------------------------------------
- */
-static char * decode_filename(unsigned char *buf,int len)
-{
- int lop;
- for(lop=0;lop<len;lop+=8) {
- NibbleSwap(&buf[lop],8);
- BitConvert(&buf[lop],BitSwapTable1);
- BitConvert4(&buf[lop]);
- BitConvert(&buf[lop],BitSwapTable2);
- }
- return (char*)buf;
-}
-
-/*==========================================
- * Grfio : Entry table read
- *------------------------------------------
- */
-static int grfio_entryread(char *gfname,int gentry)
-{
- FILE *fp;
- long grf_size,list_size;
- unsigned char grf_header[0x2e];
- int lop,entry,entrys,ofs,grf_version;
- char *fname;
- unsigned char *grf_filelist;
-
- fp = fopen(gfname, "rb");
- if (fp == NULL) {
- ShowWarning("GRF Data File not found: '"CL_WHITE"%s"CL_RESET"'.\n",gfname);
- return 1; // 1:not found error
- }
-
- fseek(fp,0,2); // SEEK_END
- grf_size = ftell(fp);
- fseek(fp,0,0); // SEEK_SET
- fread(grf_header,1,0x2e,fp);
- if (strcmp((const char *) grf_header,"Master of Magic") ||
- fseek(fp,getlong(grf_header+0x1e),1)) // SEEK_CUR
- {
- fclose(fp);
- ShowError("GRF %s read error\n",gfname);
- return 2; // 2:file format error
- }
-
- grf_version = getlong(grf_header+0x2a) >> 8;
-
- if (grf_version == 0x01) { //****** Grf version 01xx ******
- list_size = grf_size - ftell(fp);
- grf_filelist = (unsigned char *) aMallocA(list_size);
- /*if (grf_filelist == NULL){
- fclose(fp);
- ShowError("out of memory : grf_filelist\n");
- return 3; // 3:memory alloc error
- }*/
- fread(grf_filelist,1,list_size,fp);
- fclose(fp);
-
- entrys = getlong(grf_header+0x26) - getlong(grf_header+0x22) - 7;
-
- // Get an entry
- for (entry = 0,ofs = 0; entry < entrys; entry++) {
- int ofs2, srclen, srccount, type;
- char *period_ptr;
- FILELIST aentry;
-
- ofs2 = ofs+getlong(grf_filelist+ofs)+4;
- type = grf_filelist[ofs2+12];
- if (type != 0) { // Directory Index ... skip
- fname = decode_filename(grf_filelist+ofs+6, grf_filelist[ofs]-6);
- if (strlen(fname) > sizeof(aentry.fn) - 1) {
- ShowFatalError("GRF file name %s is too long\n", fname);
- aFree(grf_filelist);
- exit(1);
- }
- srclen = 0;
- if ((period_ptr = strrchr(fname, '.')) != NULL) {
- for(lop = 0; lop < 4; lop++) {
- if (strcmpi(period_ptr, ".gnd\0.gat\0.act\0.str"+lop*5) == 0)
- break;
- }
- srclen = getlong(grf_filelist+ofs2) - getlong(grf_filelist+ofs2+8) - 715;
- if(lop == 4) {
- for(lop = 10, srccount = 1; srclen >= lop; lop = lop * 10, srccount++);
- } else {
- srccount = 0;
- }
- } else {
- srccount = 0;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned = getlong(grf_filelist+ofs2+4)-37579;
- aentry.declen = getlong(grf_filelist+ofs2+8);
- aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy(aentry.fn, fname,sizeof(aentry.fn)-1);
- aentry.fnd = NULL;
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry+1; // With no first time LocalFileCheck
-#endif
- filelist_modify(&aentry);
- }
- ofs = ofs2 + 17;
- }
- aFree(grf_filelist);
-
- } else if (grf_version == 0x02) { //****** Grf version 02xx ******
- unsigned char eheader[8];
- unsigned char *rBuf;
- uLongf rSize, eSize;
-
- fread(eheader,1,8,fp);
- rSize = getlong(eheader); // Read Size
- eSize = getlong(eheader+4); // Extend Size
-
- if ((long)rSize > grf_size-ftell(fp)) { // Warning fix [Lance]
- fclose(fp);
- ShowError("Illegal data format : grf compress entry size\n");
- return 4;
- }
-
- rBuf = (unsigned char *)aMallocA(rSize); // Get a Read Size
- /*if (rBuf==NULL) {
- fclose(fp);
- ShowError("out of memory : grf compress entry table buffer\n");
- return 3;
- }*/
- grf_filelist = (unsigned char *)aMallocA(eSize); // Get a Extend Size
- /*if (grf_filelist==NULL) {
- aFree(rBuf);
- fclose(fp);
- ShowError("out of memory : grf extract entry table buffer\n");
- return 3;
- }*/
- fread(rBuf,1,rSize,fp);
- fclose(fp);
- decode_zip(grf_filelist, &eSize, rBuf, rSize); // Decode function
- list_size = eSize;
- aFree(rBuf);
-
- entrys = getlong(grf_header+0x26) - 7;
-
- // Get an entry
- for(entry = 0, ofs = 0; entry < entrys; entry++){
- int ofs2, srclen, srccount, type;
- FILELIST aentry;
-
- fname = (char*)(grf_filelist+ofs);
- if (strlen(fname) > sizeof(aentry.fn)-1) {
- ShowFatalError("GRF file name %s is too long\n", fname);
- aFree(grf_filelist);
- exit(1);
- }
- //ofs2 = ofs+strlen((char*)(grf_filelist+ofs))+1;
- ofs2 = ofs + strlen(fname)+1;
- type = grf_filelist[ofs2+12];
- if (type == 1 || type == 3 || type == 5) {
- srclen = getlong(grf_filelist+ofs2);
- if (grf_filelist[ofs2+12] == 3) {
- for (lop = 10, srccount = 1; srclen >= lop; lop = lop * 10, srccount++);
- } else if (grf_filelist[ofs2+12] == 5) {
- srccount = 0;
- } else { // if (grf_filelist[ofs2+12]==1) {
- srccount = -1;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned = getlong(grf_filelist+ofs2+4);
- aentry.declen = getlong(grf_filelist+ofs2+8);
- aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy(aentry.fn,fname,sizeof(aentry.fn)-1);
- aentry.fnd = NULL;
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry+1; // With no first time LocalFileCheck
-#endif
- filelist_modify(&aentry);
- }
- ofs = ofs2 + 17;
- }
- aFree(grf_filelist);
-
- } else { //****** Grf Other version ******
- fclose(fp);
- ShowError("GRF version %04x not supported\n",getlong(grf_header+0x2a));
- return 4;
- }
-
- filelist_adjust(); // Unnecessary area release of filelist
-
- return 0; // 0:no error
-}
-
-/*==========================================
- * Grfio : Resource file check
- *------------------------------------------
- */
-static void grfio_resourcecheck(void)
-{
- char w1[256], w2[256], src[256], dst[256], restable[256], line[256];
- char *ptr, *buf;
- FILELIST *entry;
- int size, i = 0;
- FILE *fp;
-
- // read resnametable from data directory and return if successful
- sprintf(restable, "%sdata\\resnametable.txt", data_dir);
- for (ptr = &restable[0]; *ptr != 0; ptr++)
- if (*ptr == '\\') *ptr = '/';
-
- fp = fopen(restable,"rb");
- if (fp) {
- while (fgets(line, sizeof(line) - 1, fp)) {
- if (sscanf(line, "%[^#]#%[^#]#", w1, w2) == 2 &&
- // we only need the map names and text files
- (strstr(w2, ".gat") || strstr(w2, ".txt")))
- {
- sprintf(src, "data\\%s", w1);
- sprintf(dst, "data\\%s", w2);
- entry = filelist_find(dst);
- // create new entries reusing the original's info
- if (entry != NULL) {
- FILELIST fentry;
- memcpy(&fentry, entry, sizeof(FILELIST));
- strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
- fentry.fnd = grfio_alloc_ptr(dst);
- filelist_modify(&fentry);
- i++;
- }
- }
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, "resnametable.txt");
- return; // we're done here!
- }
-
- // read resnametable from loaded GRF's, only if it cannot be
- // loaded from the data directory
- buf = (char *)grfio_reads("data\\resnametable.txt", &size);
- if (buf) {
- buf[size] = 0;
- ptr = buf;
-
- while (ptr - buf < size) {
- if (sscanf(ptr, "%[^#]#%[^#]#", w1, w2) == 2 &&
- (strstr(w2, ".gat") || strstr(w2, ".txt")))
- {
- sprintf(src, "data\\%s", w1);
- sprintf(dst, "data\\%s", w2);
- entry = filelist_find(dst);
- if (entry != NULL) {
- FILELIST fentry;
- memcpy(&fentry, entry, sizeof(FILELIST));
- strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
- fentry.fnd = grfio_alloc_ptr(dst);
- filelist_modify(&fentry);
- i++;
- }
- }
- ptr = strchr(ptr,'\n'); // Next line
- if (!ptr) break;
- ptr++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, "data\\resnametable.txt");
- return;
- }
-
- //ShowWarning("GRF: No resnametable found! Panic?\n");
-}
-
-/*==========================================
- * Grfio : Resource add
- *------------------------------------------
- */
-#define GENTRY_ADDS 4 // The number increment of gentry_table entries
-
-static int grfio_add(char *fname)
-{
- grfio_alloc_ptr(fname);
-
- return grfio_entryread(fname, gentry_entrys - 1);
-}
-
-char *grfio_alloc_ptr(char *fname)
-{
- int len;
- char *buf;
-
- if (gentry_entrys >= GENTRY_LIMIT) {
- ShowFatalError("gentrys limit : grfio_add\n");
- exit(1);
- }
-
- if (gentry_entrys >= gentry_maxentry) {
- gentry_maxentry += GENTRY_ADDS;
- gentry_table = (char**)aRealloc(gentry_table, gentry_maxentry * sizeof(char*));
- malloc_tsetdword(gentry_table + (gentry_maxentry - GENTRY_ADDS), 0, sizeof(char*) * GENTRY_ADDS);
- }
- len = strlen( fname );
- buf = (char*)aMallocA(len + 1);
- strcpy(buf, fname);
- gentry_table[gentry_entrys++] = buf;
-
- return buf;
-}
-
-/*==========================================
- * Grfio : Finalize
- *------------------------------------------
- */
-void grfio_final(void)
-{
- if (filelist != NULL)
- aFree(filelist);
-
- filelist_entrys = filelist_maxentry = 0;
-
- if (gentry_table != NULL) {
- int lop;
- for (lop = 0; lop < gentry_entrys; lop++) {
- if (gentry_table[lop] != NULL)
- aFree(gentry_table[lop]);
- }
- aFree(gentry_table);
- }
- gentry_table = NULL;
- gentry_entrys = gentry_maxentry = 0;
-}
-
-/*==========================================
- * Grfio : Initialize
- *------------------------------------------
- */
-void grfio_init(char *fname)
-{
- FILE *data_conf;
- char line[1024], w1[1024], w2[1024];
- int result = 0;
-
- hashinit(); // hash table initialization
-
- data_conf = fopen(fname, "r");
- // It will read, if there is grf-files.txt.
- if (data_conf) {
- while(fgets(line, sizeof(line) - 1, data_conf)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
- // Entry table reading
- if(strcmp(w1, "grf") == 0 ||
- strcmp(w1, "data") == 0 || // Primary data file
- strcmp(w1, "sdata") == 0 || // Sakray data file
- strcmp(w1, "adata") == 0) // Alpha version data file
- // increment if successfully loaded
- result += (grfio_add(w2) == 0);
- else if(strcmp(w1,"data_dir") == 0) // Data directory
- strcpy(data_dir, w2);
- }
-
- fclose(data_conf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", fname);
- } // end of reading grf-files.txt
-
- if (result == 0) {
- ShowInfo("No grf's loaded.. using default data directory\n");
- //exit(1); // It ends, if a resource cannot read one.
- }
-
- // Unnecessary area release of filelist
- filelist_adjust();
- // Resource check
- grfio_resourcecheck();
-
- return;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+/*********************************************************************
+ *
+ * Ragnarok Online Emulator : grfio.c -- grf file I/O Module
+ *--------------------------------------------------------------------
+ * special need library : zlib
+ *********************************************************************
+ * $Id: grfio.c,v 1.2 2004/09/29 17:31:49 kalaspuff Exp $
+ *
+ * 2002/12/18... the original edition
+ * 2003/01/23 ... Code correction
+ * 2003/02/01 ... An addition and decryption processing are improved for LocalFile and two or more GRF(s) check processing.
+ * 2003/02/02 ... Even if there is no grf it does not stop -- as -- correction
+ * 2003/02/02... grf reading specification can be added later -- as -- correction (grfio_add function addition)
+ * 2003/02 / 03... at the time of grfio_resourcecheck processing the entry addition processing method -- correction
+ * 2003/02/05... change of the processing in grfio_init
+ * 2003/02/23... a local file check -- GRFIO_LOCAL -- switch (Defoe -- Function Off)
+ * 2003/10/21 ... The data of alpha client was read.
+ * 2003/11/10 ... Ready new grf format.
+ * 2003/11/11 ... version check fix & bug fix
+ * 2006/04/16 ... fixed crash grfio_find_file when file is not found.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "grfio.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+#include "../common/malloc.h"
+#include "../zlib/unzip.h"
+
+#define CHUNK 16384
+
+#ifdef __WIN32
+ #include "../zlib/zlib.h"
+ #include "../zlib/iowin32.h"
+#else
+ #ifndef __FREEBSD__
+ #include <zlib.h>
+ #endif
+#endif
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned long DWORD;
+
+//static char data_file[1024] = ""; // "data.grf";
+//static char sdata_file[1024] = ""; // "sdata.grf";
+//static char adata_file[1024] = ""; // "adata.grf";
+static char data_dir[1024] = ""; // "../";
+
+//----------------------------
+// file entry table struct
+//----------------------------
+typedef struct {
+ int srclen; // compressed size
+ int srclen_aligned; //
+ int declen; // original size
+ int srcpos;
+ short next;
+ int cycle;
+ char type;
+ char fn[128-4*5]; // file name
+ char *fnd;
+ signed char gentry; // read grf file select
+} FILELIST;
+//gentry ... 0 : It acquires from a local file.
+// It acquires from the resource file of 1>=:gentry_table[gentry-1].
+// 1<=: Check a local file.
+// If it is, after re-setting to 0, it acquires from a local file.
+// If there is nothing, mark reversal will be carried out, and it will re-set, and will acquire from a resource file as well as 1>=.
+
+//Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces.
+
+#define GENTRY_LIMIT 512
+#define FILELIST_LIMIT 1048576 // temporary maximum, and a theory top maximum are 2G.
+
+static FILELIST *filelist = NULL;
+static int filelist_entrys = 0;
+static int filelist_maxentry = 0;
+
+static char **gentry_table = NULL;
+static int gentry_entrys = 0;
+static int gentry_maxentry = 0;
+
+//----------------------------
+// file list hash table
+//----------------------------
+static int filelist_hash[256];
+
+//----------------------------
+// grf decode data table
+//----------------------------
+static unsigned char BitMaskTable[8] = {
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
+};
+
+static char BitSwapTable1[64] = {
+ 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
+ 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
+ 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
+ 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
+};
+static char BitSwapTable2[64] = {
+ 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
+ 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
+ 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
+ 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
+};
+static char BitSwapTable3[32] = {
+ 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
+ 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
+};
+
+static unsigned char NibbleData[4][64]={
+ {
+ 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22, 0xb3, 0xd8, 0x84, 0x1e,
+ 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59, 0x05, 0x3b, 0x7a, 0x85,
+ 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f, 0x2d, 0x14, 0xb1, 0x72,
+ 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05, 0x52, 0x6e, 0x0f, 0xd9,
+ }, {
+ 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36, 0x4f, 0xf9, 0x60, 0x5a, 0xa3,
+ 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c, 0xba, 0x24, 0xfe, 0x8f, 0x19,
+ 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb, 0x91, 0x37, 0x8d, 0x0d, 0x78,
+ 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2, 0x57, 0xe8, 0x22, 0x74, 0xce,
+ }, {
+ 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2, 0x7c, 0xb6, 0xd9, 0x68, 0x15,
+ 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07, 0x9b, 0xe5, 0x83, 0x9b, 0x68,
+ 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8, 0xe5, 0x7c, 0x2f, 0x83, 0xda,
+ 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d, 0x40, 0x0b, 0x58, 0xe6, 0x3d,
+ }, {
+ 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a, 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4,
+ 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20, 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62,
+ 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14, 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d,
+ 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3, 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb,
+ }
+};
+/*-----------------
+ * long data get
+ */
+static unsigned int getlong(unsigned char *p)
+{
+// return *p+p[1]*256+(p[2]+p[3]*256)*65536;
+ return p[0]
+ | p[1] << 0x08
+ | p[2] << 0x10
+ | p[3] << 0x18; // Shinomori
+}
+
+/*==========================================
+ * Grf data decode : Subs
+ *------------------------------------------
+ */
+static void NibbleSwap(BYTE *Src, int len)
+{
+ for(;0<len;len--,Src++) {
+ *Src = (*Src>>4) | (*Src<<4);
+ }
+}
+
+static void BitConvert(BYTE *Src,char *BitSwapTable)
+{
+ int lop,prm;
+ BYTE tmp[8];
+// *(DWORD*)tmp=*(DWORD*)(tmp+4)=0;
+ malloc_tsetdword(tmp,0,8);
+ for(lop=0;lop!=64;lop++) {
+ prm = BitSwapTable[lop]-1;
+ if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7]) {
+ tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7];
+ }
+ }
+// *(DWORD*)Src = *(DWORD*)tmp;
+// *(DWORD*)(Src+4) = *(DWORD*)(tmp+4);
+ memcpy(Src,tmp,8);
+}
+
+static void BitConvert4(BYTE *Src)
+{
+ int lop,prm;
+ BYTE tmp[8];
+ tmp[0] = ((Src[7]<<5) | (Src[4]>>3)) & 0x3f; // ..0 vutsr
+ tmp[1] = ((Src[4]<<1) | (Src[5]>>7)) & 0x3f; // ..srqpo n
+ tmp[2] = ((Src[4]<<5) | (Src[5]>>3)) & 0x3f; // ..o nmlkj
+ tmp[3] = ((Src[5]<<1) | (Src[6]>>7)) & 0x3f; // ..kjihg f
+ tmp[4] = ((Src[5]<<5) | (Src[6]>>3)) & 0x3f; // ..g fedcb
+ tmp[5] = ((Src[6]<<1) | (Src[7]>>7)) & 0x3f; // ..cba98 7
+ tmp[6] = ((Src[6]<<5) | (Src[7]>>3)) & 0x3f; // ..8 76543
+ tmp[7] = ((Src[7]<<1) | (Src[4]>>7)) & 0x3f; // ..43210 v
+
+ for(lop=0;lop!=4;lop++) {
+ tmp[lop] = (NibbleData[lop][tmp[lop*2]] & 0xf0)
+ | (NibbleData[lop][tmp[lop*2+1]] & 0x0f);
+ }
+
+ *(DWORD*)(tmp+4)=0;
+ for(lop=0;lop!=32;lop++) {
+ prm = BitSwapTable3[lop]-1;
+ if (tmp[prm >> 3] & BitMaskTable[prm & 7]) {
+ tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7];
+ }
+ }
+// *(DWORD*)Src ^= *(DWORD*)(tmp+4);
+ Src[0] ^= tmp[4];
+ Src[1] ^= tmp[5];
+ Src[2] ^= tmp[6];
+ Src[3] ^= tmp[7];
+}
+
+static void decode_des_etc(BYTE *buf,int len,int type,int cycle)
+{
+ int lop,cnt=0;
+ if(cycle<3) cycle=3;
+ else if(cycle<5) cycle++;
+ else if(cycle<7) cycle+=9;
+ else cycle+=15;
+
+ for(lop=0;lop*8<len;lop++,buf+=8) {
+ if(lop<20 || (type==0 && lop%cycle==0)){ // des
+ BitConvert(buf,BitSwapTable1);
+ BitConvert4(buf);
+ BitConvert(buf,BitSwapTable2);
+ } else {
+ if(cnt==7 && type==0){
+ int a;
+ BYTE tmp[8];
+ *(DWORD*)tmp = *(DWORD*)buf;
+ *(DWORD*)(tmp+4) = *(DWORD*)(buf+4);
+ cnt=0;
+ buf[0]=tmp[3];
+ buf[1]=tmp[4];
+ buf[2]=tmp[6];
+ buf[3]=tmp[0];
+ buf[4]=tmp[1];
+ buf[5]=tmp[2];
+ buf[6]=tmp[5];
+ a=tmp[7];
+ if(a==0x00) a=0x2b;
+ else if(a==0x2b) a=0x00;
+ else if(a==0x01) a=0x68;
+ else if(a==0x68) a=0x01;
+ else if(a==0x48) a=0x77;
+ else if(a==0x77) a=0x48;
+ else if(a==0x60) a=0xff;
+ else if(a==0xff) a=0x60;
+ else if(a==0x6c) a=0x80;
+ else if(a==0x80) a=0x6c;
+ else if(a==0xb9) a=0xc0;
+ else if(a==0xc0) a=0xb9;
+ else if(a==0xeb) a=0xfe;
+ else if(a==0xfe) a=0xeb;
+ buf[7]=a;
+ }
+ cnt++;
+ }
+ }
+}
+/*==========================================
+ * Grf data decode sub : zip
+ *------------------------------------------
+ */
+int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen)
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = (Bytef*)source;
+ stream.avail_in = (uInt)sourceLen;
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+ stream.next_out = (Bytef*) dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+
+ err = inflateInit(&stream);
+ if (err != Z_OK) return err;
+
+ err = inflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = inflateEnd(&stream);
+ return err;
+}
+
+int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen) {
+ z_stream stream;
+ int err;
+ malloc_tsetdword(&stream, 0, sizeof(stream));
+ stream.next_in = (Bytef*)source;
+ stream.avail_in = (uInt)sourceLen;
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+ stream.next_out = (Bytef*) dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+
+ err = deflateInit(&stream,Z_DEFAULT_COMPRESSION);
+ if (err != Z_OK) return err;
+
+ err = deflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = deflateEnd(&stream);
+ return err;
+}
+
+/* ===================================
+* Unzips a file. 1: success, 0: error
+* Adapted from miniunz.c [Celest]
+* Version 1.01b, May 30th, 2004
+* Copyright (C) 1998-2004 Gilles Vollant
+* -------------------------------------
+*/
+int deflate_file (const char *source, const char *filename)
+{
+#ifdef _WIN32
+ zlib_filefunc_def ffunc;
+#endif
+ unzFile uf = NULL;
+ int err = UNZ_OK;
+ uInt size_buf = 8192;
+ FILE *fout = NULL;
+ void *buf;
+
+#ifdef _WIN32
+ fill_win32_filefunc(&ffunc);
+ uf = unzOpen2(source, &ffunc);
+#else
+ uf = unzOpen(source);
+#endif
+
+ if (uf == NULL) {
+ //printf("Cannot open %s\n", source);
+ return 0;
+ }
+ //printf("%s opened\n", source);
+
+ if (unzLocateFile(uf, filename, 0) != UNZ_OK) {
+ //printf("file %s not found in the zipfile\n", filename);
+ return 0;
+ }
+
+ err = unzOpenCurrentFilePassword(uf, NULL);
+ //if (err != UNZ_OK)
+ // printf("error %d with zipfile in unzOpenCurrentFilePassword\n", err);
+
+ fout = fopen(filename,"wb");
+ if (fout == NULL) {
+ //printf("error opening %s\n", filename);
+ return 0;
+ }
+
+ buf = (void *)aMalloc(size_buf);
+ do {
+ err = unzReadCurrentFile(uf, buf, size_buf);
+ if (err < 0) {
+ //printf("error %d with zipfile in unzReadCurrentFile\n", err);
+ break;
+ }
+ if (err > 0 &&
+ fwrite(buf, err, 1, fout)!=1)
+ {
+ //printf("error in writing extracted file\n");
+ err = UNZ_ERRNO;
+ break;
+ }
+ } while (err > 0);
+
+ if (fout) fclose(fout);
+
+ if (err == UNZ_OK) {
+ err = unzCloseCurrentFile (uf);
+ //if (err != UNZ_OK)
+ // printf("error %d with zipfile in unzCloseCurrentFile\n", err);
+ aFree(buf);
+ return (err == UNZ_OK);
+ }
+
+ unzCloseCurrentFile(uf); /* don't lose the error */
+
+ return 0;
+}
+
+unsigned long grfio_crc32 (const unsigned char *buf, unsigned int len)
+{
+ return crc32(crc32(0L, Z_NULL, 0), buf, len);
+}
+
+/***********************************************************
+ *** File List Subroutines ***
+ ***********************************************************/
+
+/*==========================================
+ * File List : Hash make
+ *------------------------------------------
+ */
+static int filehash(unsigned char *fname)
+{
+ unsigned int hash=0;
+ while(*fname) {
+ hash = ((hash<<1)+(hash>>7)*9+tolower(*fname));
+ fname++;
+ }
+ return hash & 255;
+}
+
+/*==========================================
+ * File List : Hash initalize
+ *------------------------------------------
+ */
+static void hashinit(void)
+{
+ int lop;
+ for (lop = 0; lop < 256; lop++)
+ filelist_hash[lop] = -1;
+}
+
+/*==========================================
+ * File List : File find
+ *------------------------------------------
+ */
+static FILELIST *filelist_find(char *fname)
+{
+ int hash;
+
+ if (!filelist)
+ return NULL;
+
+ for (hash = filelist_hash[filehash((unsigned char *) fname)]; hash >= 0; hash = filelist[hash].next) {
+ if(strcmpi(filelist[hash].fn, fname) == 0)
+ break;
+ }
+
+ return (hash >= 0) ? &filelist[hash] : NULL;
+}
+
+char *grfio_find_file(char *fname){
+ FILELIST *filelist = filelist_find(fname);
+ if (!filelist) return NULL;
+ return (!filelist->fnd?filelist->fn:filelist->fnd);
+}
+
+/*==========================================
+ * File List : Filelist add
+ *------------------------------------------
+ */
+#define FILELIST_ADDS 1024 // number increment of file lists `
+
+static FILELIST* filelist_add(FILELIST *entry)
+{
+ int hash;
+
+ if (filelist_entrys >= FILELIST_LIMIT) {
+ ShowFatalError("GRF filelist limit reached (filelist_add)!\n");
+ exit(1);
+ }
+
+ if (filelist_entrys >= filelist_maxentry) {
+ filelist = (FILELIST *)aRealloc(filelist, (filelist_maxentry + FILELIST_ADDS) * sizeof(FILELIST));
+ malloc_tsetdword(filelist + filelist_maxentry, '\0', FILELIST_ADDS * sizeof(FILELIST));
+ filelist_maxentry += FILELIST_ADDS;
+ }
+
+ memcpy (&filelist[filelist_entrys], entry, sizeof(FILELIST));
+
+ hash = filehash((unsigned char *) entry->fn);
+ filelist[filelist_entrys].next = filelist_hash[hash];
+ filelist_hash[hash] = filelist_entrys;
+
+ filelist_entrys++;
+
+ return &filelist[filelist_entrys - 1];
+}
+
+static FILELIST* filelist_modify(FILELIST *entry)
+{
+ FILELIST *fentry;
+ if ((fentry = filelist_find(entry->fn)) != NULL) {
+ int tmp = fentry->next;
+ memcpy(fentry, entry, sizeof(FILELIST));
+ fentry->next = tmp;
+ } else {
+ fentry = filelist_add(entry);
+ }
+ return fentry;
+}
+
+/*==========================================
+ * File List : filelist size adjust
+ *------------------------------------------
+ */
+static void filelist_adjust(void)
+{
+ if (filelist != NULL) {
+ if (filelist_maxentry > filelist_entrys) {
+ filelist = (FILELIST *)aRealloc(
+ filelist, filelist_entrys * sizeof(FILELIST));
+ filelist_maxentry = filelist_entrys;
+ }
+ }
+}
+
+/***********************************************************
+ *** Grfio Sobroutines ***
+ ***********************************************************/
+
+/*==========================================
+ * Grfio : Resource file size get
+ *------------------------------------------
+ */
+int grfio_size(char *fname)
+{
+ FILELIST *entry;
+
+ entry = filelist_find(fname);
+
+ if (entry == NULL || entry->gentry < 0) { // LocalFileCheck
+ char lfname[256], *p;
+ FILELIST lentry;
+ struct stat st;
+
+ sprintf(lfname, "%s%s", data_dir, fname);
+
+ for (p = &lfname[0]; *p != 0; p++)
+ if (*p=='\\') *p = '/'; // * At the time of Unix
+
+ if (stat(lfname, &st) == 0) {
+ strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
+ lentry.fnd = NULL;
+ lentry.declen = st.st_size;
+ lentry.gentry = 0; // 0:LocalFile
+ entry = filelist_modify(&lentry);
+ } else if (entry == NULL) {
+ ShowError("%s not found (grfio_size)\n", fname);
+ //exit(1);
+ return -1;
+ }
+ }
+ return entry->declen;
+}
+
+/*==========================================
+ * Grfio : Resource file read & size get
+ *------------------------------------------
+ */
+void* grfio_reads(char *fname, int *size)
+{
+ FILE *in;
+ FILELIST *entry;
+ unsigned char *buf2 = NULL;
+
+ entry = filelist_find(fname);
+
+ if (entry == NULL || entry->gentry <= 0) { // LocalFileCheck
+ char lfname[256], *p;
+ FILELIST lentry;
+
+ sprintf(lfname, "%s%s", data_dir, fname);
+
+ for (p = &lfname[0]; *p != 0; p++)
+ if (*p == '\\') *p = '/'; // * At the time of Unix
+
+ in = fopen(lfname, "rb");
+ if (in != NULL) {
+ if (entry != NULL && entry->gentry == 0) {
+ lentry.declen = entry->declen;
+ } else {
+ fseek(in,0,2); // SEEK_END
+ lentry.declen = ftell(in);
+ }
+ fseek(in,0,0); // SEEK_SET
+ buf2 = (unsigned char *)aMallocA(lentry.declen + 1024);
+ fread(buf2, 1, lentry.declen, in);
+ fclose(in);
+ strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1);
+ lentry.fnd = NULL;
+ lentry.gentry = 0; // 0:LocalFile
+ entry = filelist_modify(&lentry);
+ } else {
+ if (entry != NULL && entry->gentry < 0) {
+ entry->gentry = -entry->gentry; // local file checked
+ } else {
+ ShowError("%s not found (grfio_reads - local file %s)\n", fname, lfname);
+ return NULL;
+ }
+ }
+ }
+ if (entry != NULL && entry->gentry > 0) { // Archive[GRF] File Read
+ char *gfname = gentry_table[entry->gentry - 1];
+ in = fopen(gfname, "rb");
+ if(in != NULL) {
+ unsigned char *buf = (unsigned char *)aMallocA(entry->srclen_aligned + 1024);
+ fseek(in, entry->srcpos, 0);
+ fread(buf, 1, entry->srclen_aligned, in);
+ fclose(in);
+ buf2 = (unsigned char *)aMallocA(entry->declen + 1024);
+ if (entry->type == 1 || entry->type == 3 || entry->type == 5) {
+ uLongf len;
+ if (entry->cycle >= 0)
+ decode_des_etc(buf, entry->srclen_aligned, entry->cycle == 0, entry->cycle);
+ len = entry->declen;
+ decode_zip(buf2, &len, buf, entry->srclen);
+ if (len != entry->declen) {
+ ShowError("decode_zip size miss match err: %d != %d\n", (int)len, entry->declen);
+ aFree(buf);
+ aFree(buf2);
+ return NULL;
+ }
+ } else {
+ memcpy(buf2, buf, entry->declen);
+ }
+ aFree(buf);
+ } else {
+ ShowError("%s not found (grfio_reads - grf file %s)\n", fname, gfname);
+ return NULL;
+ }
+ }
+ if (size != NULL && entry != NULL)
+ *size = entry->declen;
+
+ return buf2;
+}
+
+/*==========================================
+ * Resource filename decode
+ *------------------------------------------
+ */
+static char * decode_filename(unsigned char *buf,int len)
+{
+ int lop;
+ for(lop=0;lop<len;lop+=8) {
+ NibbleSwap(&buf[lop],8);
+ BitConvert(&buf[lop],BitSwapTable1);
+ BitConvert4(&buf[lop]);
+ BitConvert(&buf[lop],BitSwapTable2);
+ }
+ return (char*)buf;
+}
+
+/*==========================================
+ * Grfio : Entry table read
+ *------------------------------------------
+ */
+static int grfio_entryread(char *gfname,int gentry)
+{
+ FILE *fp;
+ long grf_size,list_size;
+ unsigned char grf_header[0x2e];
+ int lop,entry,entrys,ofs,grf_version;
+ char *fname;
+ unsigned char *grf_filelist;
+
+ fp = fopen(gfname, "rb");
+ if (fp == NULL) {
+ ShowWarning("GRF Data File not found: '"CL_WHITE"%s"CL_RESET"'.\n",gfname);
+ return 1; // 1:not found error
+ }
+
+ fseek(fp,0,2); // SEEK_END
+ grf_size = ftell(fp);
+ fseek(fp,0,0); // SEEK_SET
+ fread(grf_header,1,0x2e,fp);
+ if (strcmp((const char *) grf_header,"Master of Magic") ||
+ fseek(fp,getlong(grf_header+0x1e),1)) // SEEK_CUR
+ {
+ fclose(fp);
+ ShowError("GRF %s read error\n",gfname);
+ return 2; // 2:file format error
+ }
+
+ grf_version = getlong(grf_header+0x2a) >> 8;
+
+ if (grf_version == 0x01) { //****** Grf version 01xx ******
+ list_size = grf_size - ftell(fp);
+ grf_filelist = (unsigned char *) aMallocA(list_size);
+ /*if (grf_filelist == NULL){
+ fclose(fp);
+ ShowError("out of memory : grf_filelist\n");
+ return 3; // 3:memory alloc error
+ }*/
+ fread(grf_filelist,1,list_size,fp);
+ fclose(fp);
+
+ entrys = getlong(grf_header+0x26) - getlong(grf_header+0x22) - 7;
+
+ // Get an entry
+ for (entry = 0,ofs = 0; entry < entrys; entry++) {
+ int ofs2, srclen, srccount, type;
+ char *period_ptr;
+ FILELIST aentry;
+
+ ofs2 = ofs+getlong(grf_filelist+ofs)+4;
+ type = grf_filelist[ofs2+12];
+ if (type != 0) { // Directory Index ... skip
+ fname = decode_filename(grf_filelist+ofs+6, grf_filelist[ofs]-6);
+ if (strlen(fname) > sizeof(aentry.fn) - 1) {
+ ShowFatalError("GRF file name %s is too long\n", fname);
+ aFree(grf_filelist);
+ exit(1);
+ }
+ srclen = 0;
+ if ((period_ptr = strrchr(fname, '.')) != NULL) {
+ for(lop = 0; lop < 4; lop++) {
+ if (strcmpi(period_ptr, ".gnd\0.gat\0.act\0.str"+lop*5) == 0)
+ break;
+ }
+ srclen = getlong(grf_filelist+ofs2) - getlong(grf_filelist+ofs2+8) - 715;
+ if(lop == 4) {
+ for(lop = 10, srccount = 1; srclen >= lop; lop = lop * 10, srccount++);
+ } else {
+ srccount = 0;
+ }
+ } else {
+ srccount = 0;
+ }
+
+ aentry.srclen = srclen;
+ aentry.srclen_aligned = getlong(grf_filelist+ofs2+4)-37579;
+ aentry.declen = getlong(grf_filelist+ofs2+8);
+ aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
+ aentry.cycle = srccount;
+ aentry.type = type;
+ strncpy(aentry.fn, fname,sizeof(aentry.fn)-1);
+ aentry.fnd = NULL;
+#ifdef GRFIO_LOCAL
+ aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
+#else
+ aentry.gentry = gentry+1; // With no first time LocalFileCheck
+#endif
+ filelist_modify(&aentry);
+ }
+ ofs = ofs2 + 17;
+ }
+ aFree(grf_filelist);
+
+ } else if (grf_version == 0x02) { //****** Grf version 02xx ******
+ unsigned char eheader[8];
+ unsigned char *rBuf;
+ uLongf rSize, eSize;
+
+ fread(eheader,1,8,fp);
+ rSize = getlong(eheader); // Read Size
+ eSize = getlong(eheader+4); // Extend Size
+
+ if ((long)rSize > grf_size-ftell(fp)) { // Warning fix [Lance]
+ fclose(fp);
+ ShowError("Illegal data format : grf compress entry size\n");
+ return 4;
+ }
+
+ rBuf = (unsigned char *)aMallocA(rSize); // Get a Read Size
+ /*if (rBuf==NULL) {
+ fclose(fp);
+ ShowError("out of memory : grf compress entry table buffer\n");
+ return 3;
+ }*/
+ grf_filelist = (unsigned char *)aMallocA(eSize); // Get a Extend Size
+ /*if (grf_filelist==NULL) {
+ aFree(rBuf);
+ fclose(fp);
+ ShowError("out of memory : grf extract entry table buffer\n");
+ return 3;
+ }*/
+ fread(rBuf,1,rSize,fp);
+ fclose(fp);
+ decode_zip(grf_filelist, &eSize, rBuf, rSize); // Decode function
+ list_size = eSize;
+ aFree(rBuf);
+
+ entrys = getlong(grf_header+0x26) - 7;
+
+ // Get an entry
+ for(entry = 0, ofs = 0; entry < entrys; entry++){
+ int ofs2, srclen, srccount, type;
+ FILELIST aentry;
+
+ fname = (char*)(grf_filelist+ofs);
+ if (strlen(fname) > sizeof(aentry.fn)-1) {
+ ShowFatalError("GRF file name %s is too long\n", fname);
+ aFree(grf_filelist);
+ exit(1);
+ }
+ //ofs2 = ofs+strlen((char*)(grf_filelist+ofs))+1;
+ ofs2 = ofs + strlen(fname)+1;
+ type = grf_filelist[ofs2+12];
+ if (type == 1 || type == 3 || type == 5) {
+ srclen = getlong(grf_filelist+ofs2);
+ if (grf_filelist[ofs2+12] == 3) {
+ for (lop = 10, srccount = 1; srclen >= lop; lop = lop * 10, srccount++);
+ } else if (grf_filelist[ofs2+12] == 5) {
+ srccount = 0;
+ } else { // if (grf_filelist[ofs2+12]==1) {
+ srccount = -1;
+ }
+
+ aentry.srclen = srclen;
+ aentry.srclen_aligned = getlong(grf_filelist+ofs2+4);
+ aentry.declen = getlong(grf_filelist+ofs2+8);
+ aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
+ aentry.cycle = srccount;
+ aentry.type = type;
+ strncpy(aentry.fn,fname,sizeof(aentry.fn)-1);
+ aentry.fnd = NULL;
+#ifdef GRFIO_LOCAL
+ aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
+#else
+ aentry.gentry = gentry+1; // With no first time LocalFileCheck
+#endif
+ filelist_modify(&aentry);
+ }
+ ofs = ofs2 + 17;
+ }
+ aFree(grf_filelist);
+
+ } else { //****** Grf Other version ******
+ fclose(fp);
+ ShowError("GRF version %04x not supported\n",getlong(grf_header+0x2a));
+ return 4;
+ }
+
+ filelist_adjust(); // Unnecessary area release of filelist
+
+ return 0; // 0:no error
+}
+
+/*==========================================
+ * Grfio : Resource file check
+ *------------------------------------------
+ */
+static void grfio_resourcecheck(void)
+{
+ char w1[256], w2[256], src[256], dst[256], restable[256], line[256];
+ char *ptr, *buf;
+ FILELIST *entry;
+ int size, i = 0;
+ FILE *fp;
+
+ // read resnametable from data directory and return if successful
+ sprintf(restable, "%sdata\\resnametable.txt", data_dir);
+ for (ptr = &restable[0]; *ptr != 0; ptr++)
+ if (*ptr == '\\') *ptr = '/';
+
+ fp = fopen(restable,"rb");
+ if (fp) {
+ while (fgets(line, sizeof(line) - 1, fp)) {
+ if (sscanf(line, "%[^#]#%[^#]#", w1, w2) == 2 &&
+ // we only need the map names and text files
+ (strstr(w2, ".gat") || strstr(w2, ".txt")))
+ {
+ sprintf(src, "data\\%s", w1);
+ sprintf(dst, "data\\%s", w2);
+ entry = filelist_find(dst);
+ // create new entries reusing the original's info
+ if (entry != NULL) {
+ FILELIST fentry;
+ memcpy(&fentry, entry, sizeof(FILELIST));
+ strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
+ fentry.fnd = grfio_alloc_ptr(dst);
+ filelist_modify(&fentry);
+ i++;
+ }
+ }
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, "resnametable.txt");
+ return; // we're done here!
+ }
+
+ // read resnametable from loaded GRF's, only if it cannot be
+ // loaded from the data directory
+ buf = (char *)grfio_reads("data\\resnametable.txt", &size);
+ if (buf) {
+ buf[size] = 0;
+ ptr = buf;
+
+ while (ptr - buf < size) {
+ if (sscanf(ptr, "%[^#]#%[^#]#", w1, w2) == 2 &&
+ (strstr(w2, ".gat") || strstr(w2, ".txt")))
+ {
+ sprintf(src, "data\\%s", w1);
+ sprintf(dst, "data\\%s", w2);
+ entry = filelist_find(dst);
+ if (entry != NULL) {
+ FILELIST fentry;
+ memcpy(&fentry, entry, sizeof(FILELIST));
+ strncpy(fentry.fn, src, sizeof(fentry.fn) - 1);
+ fentry.fnd = grfio_alloc_ptr(dst);
+ filelist_modify(&fentry);
+ i++;
+ }
+ }
+ ptr = strchr(ptr,'\n'); // Next line
+ if (!ptr) break;
+ ptr++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, "data\\resnametable.txt");
+ return;
+ }
+
+ //ShowWarning("GRF: No resnametable found! Panic?\n");
+}
+
+/*==========================================
+ * Grfio : Resource add
+ *------------------------------------------
+ */
+#define GENTRY_ADDS 4 // The number increment of gentry_table entries
+
+static int grfio_add(char *fname)
+{
+ grfio_alloc_ptr(fname);
+
+ return grfio_entryread(fname, gentry_entrys - 1);
+}
+
+char *grfio_alloc_ptr(char *fname)
+{
+ int len;
+ char *buf;
+
+ if (gentry_entrys >= GENTRY_LIMIT) {
+ ShowFatalError("gentrys limit : grfio_add\n");
+ exit(1);
+ }
+
+ if (gentry_entrys >= gentry_maxentry) {
+ gentry_maxentry += GENTRY_ADDS;
+ gentry_table = (char**)aRealloc(gentry_table, gentry_maxentry * sizeof(char*));
+ malloc_tsetdword(gentry_table + (gentry_maxentry - GENTRY_ADDS), 0, sizeof(char*) * GENTRY_ADDS);
+ }
+ len = strlen( fname );
+ buf = (char*)aMallocA(len + 1);
+ strcpy(buf, fname);
+ gentry_table[gentry_entrys++] = buf;
+
+ return buf;
+}
+
+/*==========================================
+ * Grfio : Finalize
+ *------------------------------------------
+ */
+void grfio_final(void)
+{
+ if (filelist != NULL)
+ aFree(filelist);
+
+ filelist_entrys = filelist_maxentry = 0;
+
+ if (gentry_table != NULL) {
+ int lop;
+ for (lop = 0; lop < gentry_entrys; lop++) {
+ if (gentry_table[lop] != NULL)
+ aFree(gentry_table[lop]);
+ }
+ aFree(gentry_table);
+ }
+ gentry_table = NULL;
+ gentry_entrys = gentry_maxentry = 0;
+}
+
+/*==========================================
+ * Grfio : Initialize
+ *------------------------------------------
+ */
+void grfio_init(char *fname)
+{
+ FILE *data_conf;
+ char line[1024], w1[1024], w2[1024];
+ int result = 0;
+
+ hashinit(); // hash table initialization
+
+ data_conf = fopen(fname, "r");
+ // It will read, if there is grf-files.txt.
+ if (data_conf) {
+ while(fgets(line, sizeof(line) - 1, data_conf)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+ // Entry table reading
+ if(strcmp(w1, "grf") == 0 ||
+ strcmp(w1, "data") == 0 || // Primary data file
+ strcmp(w1, "sdata") == 0 || // Sakray data file
+ strcmp(w1, "adata") == 0) // Alpha version data file
+ // increment if successfully loaded
+ result += (grfio_add(w2) == 0);
+ else if(strcmp(w1,"data_dir") == 0) // Data directory
+ strcpy(data_dir, w2);
+ }
+
+ fclose(data_conf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", fname);
+ } // end of reading grf-files.txt
+
+ if (result == 0) {
+ ShowInfo("No grf's loaded.. using default data directory\n");
+ //exit(1); // It ends, if a resource cannot read one.
+ }
+
+ // Unnecessary area release of filelist
+ filelist_adjust();
+ // Resource check
+ grfio_resourcecheck();
+
+ return;
+}
diff --git a/src/common/grfio.h b/src/common/grfio.h
index 4ccdd00c7..572258b04 100644
--- a/src/common/grfio.h
+++ b/src/common/grfio.h
@@ -1,22 +1,22 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _GRFIO_H_
-#define _GRFIO_H_
-
-void grfio_init(char*); // GRFIO Initialize
-void grfio_final(void); // GRFIO Finalize
-void* grfio_reads(char*,int*); // GRFIO data file read & size get
-char *grfio_find_file(char *fname);
-char *grfio_alloc_ptr(char *fname);
-
-#define grfio_read(fn) grfio_reads(fn, NULL)
-
-int grfio_size(char*); // GRFIO data file size get
-unsigned long grfio_crc32(const unsigned char *buf, unsigned int len);
-
-int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
-int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
-int deflate_file (const char *source, const char *filename);
-
-#endif // _GRFIO_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _GRFIO_H_
+#define _GRFIO_H_
+
+void grfio_init(char*); // GRFIO Initialize
+void grfio_final(void); // GRFIO Finalize
+void* grfio_reads(char*,int*); // GRFIO data file read & size get
+char *grfio_find_file(char *fname);
+char *grfio_alloc_ptr(char *fname);
+
+#define grfio_read(fn) grfio_reads(fn, NULL)
+
+int grfio_size(char*); // GRFIO data file size get
+unsigned long grfio_crc32(const unsigned char *buf, unsigned int len);
+
+int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
+int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
+int deflate_file (const char *source, const char *filename);
+
+#endif // _GRFIO_H_
diff --git a/src/common/lock.c b/src/common/lock.c
index c7bf623e5..18091820d 100644
--- a/src/common/lock.c
+++ b/src/common/lock.c
@@ -1,71 +1,71 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#ifndef WIN32
-#include <unistd.h>
-#else
-#include <windows.h>
-#define F_OK 0x0
-#define R_OK 0x4
-#endif
-#include "lock.h"
-#include "showmsg.h"
-
-#ifndef _WIN32
- #define exists(filename) (!access(filename, F_OK))
-#else
-// could be speed up maybe?
-int exists(char *file) {
- FILE *fp;
- if ((fp = fopen(file,"r")) && fclose(fp) == 0) return 1;
- return 0;
-}
-#endif
-
-// ‘‚«ž‚݃tƒ@ƒCƒ‹‚̕ی숗
-// i‘‚«ž‚Ý‚ªI‚í‚é‚Ü‚ÅA‹Œƒtƒ@ƒCƒ‹‚ð•ÛŠÇ‚µ‚Ä‚¨‚­j
-
-// V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚ÝŠJŽn
-FILE* lock_fopen (const char* filename, int *info) {
- char newfile[512];
- FILE *fp;
- int no = 0;
-
- // ˆÀ‘S‚ȃtƒ@ƒCƒ‹–¼‚𓾂éiŽè”²‚«j
- do {
- sprintf(newfile, "%s_%04d.tmp", filename, ++no);
- } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999));
- *info = no;
- return fopen(newfile,"w");
-}
-
-// ‹Œƒtƒ@ƒCƒ‹‚ð휕Vƒtƒ@ƒCƒ‹‚ðƒŠƒl[ƒ€
-int lock_fclose (FILE *fp, const char* filename, int *info) {
- int ret = 1;
- char newfile[512];
- char oldfile[512];
- if (fp != NULL) {
- ret = fclose(fp);
- sprintf(newfile, "%s_%04d.tmp", filename, *info);
- sprintf(oldfile, "%s.bak", filename); // old backup file
-
- if (exists(oldfile)) remove(oldfile); // remove backup file if it already exists
- rename (filename, oldfile); // backup our older data instead of deleting it
-
- // ‚±‚̃^ƒCƒ~ƒ“ƒO‚Å—Ž‚¿‚é‚Æň«B
- if ((ret = rename(newfile,filename)) != 0) { // rename our temporary file to its correct name
-#if defined(__NETBSD__) || defined(_WIN32) || defined(sun) || defined (_sun) || defined (__sun__)
- ShowError("%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile);
-#else
- char ebuf[255];
- ShowError("%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror_r(errno, ebuf, sizeof(ebuf)), newfile);
-#endif
- }
- }
-
- return ret;
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <windows.h>
+#define F_OK 0x0
+#define R_OK 0x4
+#endif
+#include "lock.h"
+#include "showmsg.h"
+
+#ifndef _WIN32
+ #define exists(filename) (!access(filename, F_OK))
+#else
+// could be speed up maybe?
+int exists(char *file) {
+ FILE *fp;
+ if ((fp = fopen(file,"r")) && fclose(fp) == 0) return 1;
+ return 0;
+}
+#endif
+
+// ‘‚«ž‚݃tƒ@ƒCƒ‹‚̕ی숗
+// i‘‚«ž‚Ý‚ªI‚í‚é‚Ü‚ÅA‹Œƒtƒ@ƒCƒ‹‚ð•ÛŠÇ‚µ‚Ä‚¨‚­j
+
+// V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚ÝŠJŽn
+FILE* lock_fopen (const char* filename, int *info) {
+ char newfile[512];
+ FILE *fp;
+ int no = 0;
+
+ // ˆÀ‘S‚ȃtƒ@ƒCƒ‹–¼‚𓾂éiŽè”²‚«j
+ do {
+ sprintf(newfile, "%s_%04d.tmp", filename, ++no);
+ } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999));
+ *info = no;
+ return fopen(newfile,"w");
+}
+
+// ‹Œƒtƒ@ƒCƒ‹‚ð휕Vƒtƒ@ƒCƒ‹‚ðƒŠƒl[ƒ€
+int lock_fclose (FILE *fp, const char* filename, int *info) {
+ int ret = 1;
+ char newfile[512];
+ char oldfile[512];
+ if (fp != NULL) {
+ ret = fclose(fp);
+ sprintf(newfile, "%s_%04d.tmp", filename, *info);
+ sprintf(oldfile, "%s.bak", filename); // old backup file
+
+ if (exists(oldfile)) remove(oldfile); // remove backup file if it already exists
+ rename (filename, oldfile); // backup our older data instead of deleting it
+
+ // ‚±‚̃^ƒCƒ~ƒ“ƒO‚Å—Ž‚¿‚é‚Æň«B
+ if ((ret = rename(newfile,filename)) != 0) { // rename our temporary file to its correct name
+#if defined(__NETBSD__) || defined(_WIN32) || defined(sun) || defined (_sun) || defined (__sun__)
+ ShowError("%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile);
+#else
+ char ebuf[255];
+ ShowError("%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror_r(errno, ebuf, sizeof(ebuf)), newfile);
+#endif
+ }
+ }
+
+ return ret;
+}
+
diff --git a/src/common/lock.h b/src/common/lock.h
index 5c846eb73..e2247fc68 100644
--- a/src/common/lock.h
+++ b/src/common/lock.h
@@ -1,11 +1,11 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _LOCK_H_
-#define _LOCK_H_
-
-FILE* lock_fopen(const char* filename,int *info);
-int lock_fclose(FILE *fp,const char* filename,int *info);
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _LOCK_H_
+#define _LOCK_H_
+
+FILE* lock_fopen(const char* filename,int *info);
+int lock_fclose(FILE *fp,const char* filename,int *info);
+
+#endif
+
diff --git a/src/common/malloc.c b/src/common/malloc.c
index 1a4729fa2..d4dda5b4c 100644
--- a/src/common/malloc.c
+++ b/src/common/malloc.c
@@ -1,733 +1,733 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "../common/malloc.h"
-#include "../common/core.h"
-#include "../common/showmsg.h"
-
-#ifdef MINICORE
- #undef LOG_MEMMGR
-#endif
-
-void* aMalloc_(size_t size, const char *file, int line, const char *func)
-{
- void *ret = MALLOC(size, file, line, func);
- // ShowMessage("%s:%d: in func %s: aMalloc %d\n",file,line,func,size);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aMalloc error out of memory!\n",file,line,func);
- exit(1);
- }
-
- return ret;
-}
-void* aMallocA_(size_t size, const char *file, int line, const char *func)
-{
- void *ret = MALLOCA(size, file, line, func);
- // ShowMessage("%s:%d: in func %s: aMallocA %d\n",file,line,func,size);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aMallocA error out of memory!\n",file,line,func);
- exit(1);
- }
-
- return ret;
-}
-void* aCalloc_(size_t num, size_t size, const char *file, int line, const char *func)
-{
- void *ret = CALLOC(num, size, file, line, func);
- // ShowMessage("%s:%d: in func %s: aCalloc %d %d\n",file,line,func,num,size);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aCalloc error out of memory!\n", file, line, func);
- exit(1);
- }
- return ret;
-}
-void* aCallocA_(size_t num, size_t size, const char *file, int line, const char *func)
-{
- void *ret = CALLOCA(num, size, file, line, func);
- // ShowMessage("%s:%d: in func %s: aCallocA %d %d\n",file,line,func,num,size);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aCallocA error out of memory!\n",file,line,func);
- exit(1);
- }
- return ret;
-}
-void* aRealloc_(void *p, size_t size, const char *file, int line, const char *func)
-{
- void *ret = REALLOC(p, size, file, line, func);
- // ShowMessage("%s:%d: in func %s: aRealloc %p %d\n",file,line,func,p,size);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aRealloc error out of memory!\n",file,line,func);
- exit(1);
- }
- return ret;
-}
-char* aStrdup_(const char *p, const char *file, int line, const char *func)
-{
- char *ret = STRDUP(p, file, line, func);
- // ShowMessage("%s:%d: in func %s: aStrdup %p\n",file,line,func,p);
- if (ret == NULL){
- ShowFatalError("%s:%d: in func %s: aStrdup error out of memory!\n", file, line, func);
- exit(1);
- }
- return ret;
-}
-void aFree_(void *p, const char *file, int line, const char *func)
-{
- // ShowMessage("%s:%d: in func %s: aFree %p\n",file,line,func,p);
- if (p)
- FREE(p, file, line, func);
-
- p = NULL;
-}
-
-#ifdef GCOLLECT
-
-void* _bcallocA(size_t size, size_t cnt)
-{
- void *ret = MALLOCA(size * cnt);
- if (ret) //malloc_set(ret, 0, size * cnt);
- malloc_set(ret, 0, size*cnt);
- return ret;
-}
-void* _bcalloc(size_t size, size_t cnt)
-{
- void *ret = MALLOC(size * cnt);
- if (ret) //malloc_set(ret, 0, size * cnt);
- malloc_set(ret, 0, size*cnt);
- return ret;
-}
-char* _bstrdup(const char *chr)
-{
- int len = strlen(chr);
- char *ret = (char*)MALLOC(len + 1);
- if (ret) memcpy(ret, chr, len + 1);
- return ret;
-}
-
-#endif
-
-#ifdef USE_MEMMGR
-
-/* USE_MEMMGR */
-
-/*
- * ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ
- * malloc , free ‚̈—‚ðŒø—¦“I‚Éo—ˆ‚é‚悤‚É‚µ‚½‚à‚ÌB
- * •¡ŽG‚Ȉ—‚ðs‚Á‚Ä‚¢‚é‚Ì‚ÅAŽáŠ±d‚­‚È‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- *
- * ƒf[ƒ^\‘¢‚È‚Çià–¾‰ºŽè‚Å‚·‚¢‚Ü‚¹‚ñ^^; j
- * Eƒƒ‚ƒŠ‚ð•¡”‚ÌuƒuƒƒbƒNv‚É•ª‚¯‚ÄA‚³‚ç‚ɃuƒƒbƒN‚ð•¡”‚Ìuƒ†ƒjƒbƒgv
- * ‚É•ª‚¯‚Ä‚¢‚Ü‚·Bƒ†ƒjƒbƒg‚̃TƒCƒY‚ÍA‚PƒuƒƒbƒN‚Ì—e—Ê‚ð•¡”ŒÂ‚É‹Ï“™”z•ª
- * ‚µ‚½‚à‚Ì‚Å‚·B‚½‚Æ‚¦‚ÎA‚Pƒ†ƒjƒbƒg32KB‚Ìê‡AƒuƒƒbƒN‚P‚‚Í32Byte‚̃†
- * ƒjƒbƒg‚ªA1024ŒÂW‚Ü‚Á‚Äo—ˆ‚Ä‚¢‚½‚èA64Byte‚̃†ƒjƒbƒg‚ª 512ŒÂW‚Ü‚Á‚Ä
- * o—ˆ‚Ä‚¢‚½‚肵‚Ü‚·Bipadding,unit_head ‚𜂭j
- *
- * EƒuƒƒbƒN“¯Žm‚̓Šƒ“ƒNƒŠƒXƒg(block_prev,block_next) ‚ł‚Ȃª‚èA“¯‚¶ƒTƒC
- * ƒY‚ðŽ‚ƒuƒƒbƒN“¯Žm‚àƒŠƒ“ƒNƒŠƒXƒg(samesize_prev,samesize_nect) ‚ł‚È
- * ‚ª‚Á‚Ä‚¢‚Ü‚·B‚»‚ê‚É‚æ‚èA•s—v‚Æ‚È‚Á‚½ƒƒ‚ƒŠ‚ÌÄ—˜—p‚ªŒø—¦“I‚És‚¦‚Ü‚·B
- */
-
-/* ƒuƒƒbƒN‚É“ü‚éƒf[ƒ^—Ê */
-#define BLOCK_DATA_SIZE 80*1024
-
-/* ˆê“x‚ÉŠm•Û‚·‚éƒuƒƒbƒN‚Ì”B */
-#define BLOCK_ALLOC 32
-
-/* ƒuƒƒbƒN‚̃Aƒ‰ƒCƒƒ“ƒg */
-#define BLOCK_ALIGNMENT 64
-
-/* ƒuƒƒbƒN */
-struct block {
- int block_no; /* ƒuƒƒbƒN”Ô† */
- struct block* block_prev; /* ‘O‚ÉŠm•Û‚µ‚½—̈æ */
- struct block* block_next; /* ŽŸ‚ÉŠm•Û‚µ‚½—̈æ */
- int samesize_no; /* “¯‚¶ƒTƒCƒY‚̔Ԇ */
- struct block* samesize_prev; /* “¯‚¶ƒTƒCƒY‚Ì‘O‚̗̈æ */
- struct block* samesize_next; /* “¯‚¶ƒTƒCƒY‚ÌŽŸ‚̗̈æ */
- size_t unit_size; /* ƒ†ƒjƒbƒg‚̃oƒCƒg” 0=–¢Žg—p */
- size_t unit_hash; /* ƒ†ƒjƒbƒg‚̃nƒbƒVƒ… */
- int unit_count; /* ƒ†ƒjƒbƒg‚Ì” */
- int unit_used; /* Žg—pς݃†ƒjƒbƒg */
- char data[BLOCK_DATA_SIZE];
-};
-
-struct unit_head {
- struct block* block;
- size_t size;
- const char* file;
- int line;
- unsigned int checksum;
-};
-
-struct chunk {
- char *block;
- struct chunk *next;
-};
-
-static struct block* block_first = NULL;
-static struct block* block_last = NULL;
-static struct block* block_unused = NULL;
-
-/* ƒ†ƒjƒbƒg‚ւ̃nƒbƒVƒ…B80KB/64Byte = 1280ŒÂ */
-static struct block* unit_first[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ʼn */
-static struct block* unit_unfill[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* –„‚Ü‚Á‚Ä‚È‚¢ */
-static struct block* unit_last[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ÅŒã */
-
-/* ƒƒ‚ƒŠ‚ðŽg‚¢‰ñ‚¹‚È‚¢—̈æ—p‚̃f[ƒ^ */
-struct unit_head_large {
- struct unit_head_large* prev;
- struct unit_head_large* next;
- struct unit_head unit_head;
-};
-static struct unit_head_large *unit_head_large_first = NULL;
-
-static struct chunk *chunk_first = NULL;
-
-static struct block* block_malloc(void);
-static void block_free(struct block* p);
-static void memmgr_info(void);
-static unsigned int memmgr_usage_bytes = 0;
-
-void* _mmalloc(size_t size, const char *file, int line, const char *func ) {
- int i;
- struct block *block;
- size_t size_hash;
-
- if (((long) size) < 0) {
- printf("_mmalloc: %d\n", size);
- return 0;
- }
-
- size_hash = (size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT;
- if(size == 0) {
- return NULL;
- }
- memmgr_usage_bytes += size;
-
- /* ƒuƒƒbƒN’·‚ð’´‚¦‚é—̈æ‚ÌŠm•Û‚É‚ÍAmalloc() ‚ð—p‚¢‚é */
- /* ‚»‚ÌÛAunit_head.block ‚É NULL ‚ð‘ã“ü‚µ‚Ä‹æ•Ê‚·‚é */
- if(size_hash * BLOCK_ALIGNMENT > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
- struct unit_head_large* p = (struct unit_head_large*)MALLOC(sizeof(struct unit_head_large)+size,file,line,func);
- if(p != NULL) {
- p->unit_head.block = NULL;
- p->unit_head.size = size;
- p->unit_head.file = file;
- p->unit_head.line = line;
- p->prev = NULL;
- if (unit_head_large_first == NULL)
- p->next = NULL;
- else {
- unit_head_large_first->prev = p;
- p->next = unit_head_large_first;
- }
- unit_head_large_first = p;
- *(int*)((char*)p + sizeof(struct unit_head_large) - sizeof(int) + size) = 0xdeadbeaf;
- return (char *)p + sizeof(struct unit_head_large) - sizeof(int);
- } else {
- ShowFatalError("Memory manager::memmgr_alloc failed (allocating %d+%d bytes at %s:%d).\n", sizeof(struct unit_head_large), size, file, line);
- exit(1);
- }
- }
-
- /* “¯ˆêƒTƒCƒY‚̃uƒƒbƒN‚ªŠm•Û‚³‚ê‚Ä‚¢‚È‚¢ŽžAV‚½‚ÉŠm•Û‚·‚é */
- if(unit_unfill[size_hash] == NULL) {
- block = block_malloc();
- if(unit_first[size_hash] == NULL) {
- /* ‰‰ñŠm•Û */
- unit_first[size_hash] = block;
- unit_last[size_hash] = block;
- block->samesize_no = 0;
- block->samesize_prev = NULL;
- block->samesize_next = NULL;
- } else {
- /* ˜AŒ‹ì‹Æ */
- unit_last[size_hash]->samesize_next = block;
- block->samesize_no = unit_last[size_hash]->samesize_no + 1;
- block->samesize_prev = unit_last[size_hash];
- block->samesize_next = NULL;
- unit_last[size_hash] = block;
- }
- unit_unfill[size_hash] = block;
- block->unit_size = size_hash * BLOCK_ALIGNMENT + sizeof(struct unit_head);
- block->unit_count = (int)(BLOCK_DATA_SIZE / block->unit_size);
- block->unit_used = 0;
- block->unit_hash = size_hash;
- /* –¢Žg—pFlag‚𗧂Ăé */
- for(i=0;i<block->unit_count;i++) {
- ((struct unit_head*)(&block->data[block->unit_size * i]))->block = NULL;
- }
- }
- /* ƒ†ƒjƒbƒgŽg—pŒÂ”‰ÁŽZ */
- block = unit_unfill[size_hash];
- block->unit_used++;
-
- /* ƒ†ƒjƒbƒg“à‚ð‘S‚ÄŽg‚¢‰Ê‚½‚µ‚½ */
- if(block->unit_count == block->unit_used) {
- do {
- unit_unfill[size_hash] = unit_unfill[size_hash]->samesize_next;
- } while(
- unit_unfill[size_hash] != NULL &&
- unit_unfill[size_hash]->unit_count == unit_unfill[size_hash]->unit_used
- );
- }
-
- /* ƒuƒƒbƒN‚Ì’†‚̋󂫃†ƒjƒbƒg‘{õ */
- for(i=0;i<block->unit_count;i++) {
- struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
- if(head->block == NULL) {
- head->block = block;
- head->size = size;
- head->line = line;
- head->file = file;
- *(int*)((char*)head + sizeof(struct unit_head) - sizeof(int) + size) = 0xdeadbeaf;
- return (char *)head + sizeof(struct unit_head) - sizeof(int);
- }
- }
- // ‚±‚±‚É—ˆ‚Ä‚Í‚¢‚¯‚È‚¢B
- ShowFatalError("Memory manager::memmgr_malloc() serious error (allocating %d+%d bytes at %s:%d)\n", sizeof(struct unit_head_large), size, file, line);
- memmgr_info();
- exit(1);
- return NULL;
-};
-
-void* _mcalloc(size_t num, size_t size, const char *file, int line, const char *func ) {
- void *p = _mmalloc(num * size,file,line,func);
- //malloc_set(p,0,num * size);
- malloc_set(p,0,num*size);
- return p;
-}
-
-void* _mrealloc(void *memblock, size_t size, const char *file, int line, const char *func ) {
- size_t old_size;
- if(memblock == NULL) {
- return _mmalloc(size,file,line,func);
- }
-
- old_size = ((struct unit_head *)((char *)memblock - sizeof(struct unit_head) + sizeof(int)))->size;
- if(old_size > size) {
- // ƒTƒCƒYk¬ -> ‚»‚Ì‚Ü‚Ü•Ô‚·iŽè”²‚«j
- return memblock;
- } else {
- // ƒTƒCƒYŠg‘å
- void *p = _mmalloc(size,file,line,func);
- if(p != NULL) {
- memcpy(p,memblock,old_size);
- }
- _mfree(memblock,file,line,func);
- return p;
- }
-}
-
-char* _mstrdup(const char *p, const char *file, int line, const char *func ) {
- if(p == NULL) {
- return NULL;
- } else {
- size_t len = strlen(p);
- char *string = (char *)_mmalloc(len + 1,file,line,func);
- memcpy(string,p,len+1);
- return string;
- }
-}
-
-void _mfree(void *ptr, const char *file, int line, const char *func ) {
- struct unit_head *head;
- size_t size_hash;
-
- if (ptr == NULL)
- return;
-
- head = (struct unit_head *)((char *)ptr - sizeof(struct unit_head) + sizeof(int));
- size_hash = (head->size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT;
-
- if(head->block == NULL) {
- if(size_hash * BLOCK_ALIGNMENT > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
- /* malloc() ‚Å’¼‚ÉŠm•Û‚³‚ꂽ—̈æ */
- struct unit_head_large *head_large = (struct unit_head_large *)((char *)ptr - sizeof(struct unit_head_large) + sizeof(int));
- if(
- *(int*)((char*)head_large + sizeof(struct unit_head_large) - sizeof(int) + head->size)
- != 0xdeadbeaf)
- {
- ShowError("Memory manager: args of aFree is overflowed pointer %s line %d\n", file, line);
- }
- if(head_large->prev) {
- head_large->prev->next = head_large->next;
- } else {
- unit_head_large_first = head_large->next;
- }
- if(head_large->next) {
- head_large->next->prev = head_large->prev;
- }
- head->block = NULL;
- memmgr_usage_bytes -= head->size;
- FREE(head_large,file,line,func);
- } else {
- ShowError("Memory manager: args of aFree is freed pointer %s:%d@%s\n", file, line, func);
- }
- ptr = NULL;
- return;
- } else {
- /* ƒ†ƒjƒbƒg‰ð•ú */
- struct block *block = head->block;
- if((unsigned long)block % sizeof(struct block) != 0) {
- ShowError("Memory manager: args of aFree is not valid pointer %s line %d\n", file, line);
- } else if(*(int*)((char*)head + sizeof(struct unit_head) - sizeof(int) + head->size) != 0xdeadbeaf) {
- ShowError("Memory manager: args of aFree is overflowed pointer %s line %d\n", file, line);
- } else {
- head->block = NULL;
- memmgr_usage_bytes -= head->size;
- if(--block->unit_used == 0) {
- /* ƒuƒƒbƒN‚̉ð•ú */
- if(unit_unfill[block->unit_hash] == block) {
- /* ‹ó‚«ƒ†ƒjƒbƒg‚ÉŽw’肳‚ê‚Ä‚¢‚é */
- do {
- unit_unfill[block->unit_hash] = unit_unfill[block->unit_hash]->samesize_next;
- } while(
- unit_unfill[block->unit_hash] != NULL &&
- unit_unfill[block->unit_hash]->unit_count == unit_unfill[block->unit_hash]->unit_used
- );
- }
- if(block->samesize_prev == NULL && block->samesize_next == NULL) {
- /* “Æ—§ƒuƒƒbƒN‚̉ð•ú */
- unit_first[block->unit_hash] = NULL;
- unit_last[block->unit_hash] = NULL;
- unit_unfill[block->unit_hash] = NULL;
- } else if(block->samesize_prev == NULL) {
- /* 擪ƒuƒƒbƒN‚̉ð•ú */
- unit_first[block->unit_hash] = block->samesize_next;
- (block->samesize_next)->samesize_prev = NULL;
- } else if(block->samesize_next == NULL) {
- /* ––’[ƒuƒƒbƒN‚̉ð•ú */
- unit_last[block->unit_hash] = block->samesize_prev;
- (block->samesize_prev)->samesize_next = NULL;
- } else {
- /* ’†ŠÔƒuƒƒbƒN‚̉ð•ú */
- (block->samesize_next)->samesize_prev = block->samesize_prev;
- (block->samesize_prev)->samesize_next = block->samesize_next;
- }
- block_free(block);
- } else {
- /* ‹ó‚«ƒ†ƒjƒbƒg‚ÌÄÝ’è */
- if(
- unit_unfill[block->unit_hash] == NULL ||
- unit_unfill[block->unit_hash]->samesize_no > block->samesize_no
- ) {
- unit_unfill[block->unit_hash] = block;
- }
- }
- ptr = NULL;
- }
- }
-}
-
-/* Œ»Ý‚Ì󋵂ð•\Ž¦‚·‚é */
-static void memmgr_info(void) {
- int i;
- struct block *p;
- ShowInfo("** Memory Manager Information **\n");
- if(block_first == NULL) {
- ShowMessage("Uninitialized.\n");
- return;
- }
- ShowMessage(
- "Blocks: %04u , BlockSize: %06u Byte , Used: %08uKB\n",
- block_last->block_no+1,sizeof(struct block),
- (block_last->block_no+1) * sizeof(struct block) / 1024
- );
- p = block_first;
- for(i=0;i<=block_last->block_no;i++) {
- ShowMessage(" Block #%04u : ",p->block_no);
- if(p->unit_size == 0) {
- ShowMessage("unused.\n");
- } else {
- ShowMessage(
- "size: %05u byte. used: %04u/%04u prev:",
- p->unit_size - sizeof(struct unit_head),p->unit_used,p->unit_count
- );
- if(p->samesize_prev == NULL) {
- ShowMessage("NULL");
- } else {
- ShowMessage("%04u",(p->samesize_prev)->block_no);
- }
- ShowMessage(" next:");
- if(p->samesize_next == NULL) {
- ShowMessage("NULL");
- } else {
- ShowMessage("%04u",(p->samesize_next)->block_no);
- }
- ShowMessage("\n");
- }
- p = p->block_next;
- }
-}
-
-/* ƒuƒƒbƒN‚ðŠm•Û‚·‚é */
-static struct block* block_malloc(void) {
- if(block_unused != NULL) {
- /* ƒuƒƒbƒN—p‚̗̈æ‚ÍŠm•ÛÏ‚Ý */
- struct block* ret = block_unused;
- do {
- block_unused = block_unused->block_next;
- } while(block_unused != NULL && block_unused->unit_size != 0);
- return ret;
- } else {
- /* ƒuƒƒbƒN—p‚̗̈æ‚ðV‚½‚ÉŠm•Û‚·‚é */
- int i;
- int block_no;
- struct block* p;
- struct chunk* chunk;
- char *pb = (char *)CALLOC(sizeof(struct block),BLOCK_ALLOC+1,file,line,func);
- if(pb == NULL) {
- ShowFatalError("Memory manager::block_alloc failed.\n");
- exit(1);
- }
-
- // store original block address in chunk
- chunk = (struct chunk *)MALLOC(sizeof(struct chunk),file,line,func);
- if (chunk == NULL) {
- ShowFatalError("Memory manager::block_alloc failed.\n");
- exit(1);
- }
- chunk->block = pb;
- chunk->next = (chunk_first) ? chunk_first : NULL;
- chunk_first = chunk;
-
- // ƒuƒƒbƒN‚̃|ƒCƒ“ƒ^‚Ì擪‚ðsizeof(block) ƒAƒ‰ƒCƒƒ“ƒg‚É‘µ‚¦‚é
- // ‚±‚̃AƒhƒŒƒX‚ðfree() ‚·‚邱‚Æ‚Í‚È‚¢‚Ì‚ÅA’¼Úƒ|ƒCƒ“ƒ^‚ð•ÏX‚µ‚Ä‚¢‚éB
- pb += sizeof(struct block) - ((unsigned long)pb % sizeof(struct block));
- p = (struct block*)pb;
- if(block_first == NULL) {
- /* ‰‰ñŠm•Û */
- block_no = 0;
- block_first = p;
- } else {
- block_no = block_last->block_no + 1;
- block_last->block_next = p;
- p->block_prev = block_last;
- }
- block_last = &p[BLOCK_ALLOC - 1];
- /* ƒuƒƒbƒN‚ð˜AŒ‹‚³‚¹‚é */
- for(i=0;i<BLOCK_ALLOC;i++) {
- if(i != 0) {
- p[i].block_prev = &p[i-1];
- }
- if(i != BLOCK_ALLOC -1) {
- p[i].block_next = &p[i+1];
- }
- p[i].block_no = block_no + i;
- }
-
- /* –¢Žg—pƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ðXV */
- block_unused = &p[1];
- p->unit_size = 1;
- return p;
- }
-}
-
-static void block_free(struct block* p) {
- /* free() ‚¹‚¸‚ÉA–¢Žg—pƒtƒ‰ƒO‚ð•t‚¯‚邾‚¯ */
- p->unit_size = 0;
- /* –¢Žg—pƒ|ƒCƒ“ƒ^[‚ðXV‚·‚é */
- if(block_unused == NULL) {
- block_unused = p;
- } else if(block_unused->block_no > p->block_no) {
- block_unused = p;
- }
-}
-
-unsigned int memmgr_usage (void)
-{
- return memmgr_usage_bytes / 1024;
-}
-
-#ifdef LOG_MEMMGR
-static char memmer_logfile[128];
-static FILE *log_fp;
-
-static void memmgr_log (char *buf)
-{
- if (!log_fp) {
- log_fp = fopen(memmer_logfile,"w");
- if (!log_fp) log_fp = stdout;
- fprintf(log_fp, "Memory manager: Memory leaks found (Revision %s).\n", get_svn_revision());
- }
- fprintf(log_fp, buf);
- return;
-}
-#endif
-
-static void memmgr_final (void)
-{
- struct block *block = block_first;
- struct chunk *chunk = chunk_first, *chunk2;
- struct unit_head_large *large = unit_head_large_first, *large2;
- int i;
-
-#ifdef LOG_MEMMGR
- int count = 0;
- char buf[128];
-#endif
-
- while (block) {
- if (block->unit_size) {
- for (i = 0; i < block->unit_count; i++) {
- struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
- if(head->block != NULL)
- {
- #ifdef LOG_MEMMGR
- sprintf (buf,
- "%04d : %s line %d size %d\n", ++count,
- head->file, head->line, head->size);
- memmgr_log (buf);
- #endif
- // get block pointer and free it [celest]
- _mfree ((char *)head + sizeof(struct unit_head) - sizeof(int), ALC_MARK);
- }
- }
- }
- //if (block->block_no >= block2->block_no + BLOCK_ALLOC - 1) {
- // reached a new block array
- //block = block->block_next;
-
- /* Okay wise guys... this is how block2 was allocated: [Skotlex]
- struct block* p;
- char *pb = (char *) CALLOC (sizeof(struct block),BLOCK_ALLOC + 1);
- pb += sizeof(struct block) - ((unsigned long)pb % sizeof(struct block));
- p = (struct block*)pb;
-
- The reason we get an invalid pointer is that we allocated pb, not p.
- So how do you get pb when you only have p?
- The answer is, you can't, because the original pointer was lost when
- memory-aligning the block. So we either forget this FREE or use a
- self-reference...
- Since we are already quitting, it might be ok to just not free the block
- as it is.
- */
- // didn't realise that before o.o -- block chunks are now freed below [celest]
- // FREE(block2);
- //block2 = block;
- //continue;
- //}
- block = block->block_next;
- }
-
- // free the allocated block chunks
- chunk = chunk_first;
- while (chunk) {
- chunk2 = chunk->next;
- FREE(chunk->block,file,line,func);
- FREE(chunk,file,line,func);
- chunk = chunk2;
- }
-
- while(large) {
- large2 = large->next;
- #ifdef LOG_MEMMGR
- sprintf (buf,
- "%04d : %s line %d size %d\n", ++count,
- large->unit_head.file, large->unit_head.line, large->unit_head.size);
- memmgr_log (buf);
- #endif
- FREE(large,file,line,func);
- large = large2;
- }
-#ifdef LOG_MEMMGR
- if(count == 0) {
- ShowInfo("Memory manager: No memory leaks found.\n");
- } else {
- ShowWarning("Memory manager: Memory leaks found and fixed.\n");
- fclose(log_fp);
- }
-#endif
- return;
-}
-
-static void memmgr_init (void)
-{
- #ifdef LOG_MEMMGR
- sprintf(memmer_logfile, "log/%s.leaks", SERVER_NAME);
- ShowStatus("Memory manager initialised: "CL_WHITE"%s"CL_RESET"\n", memmer_logfile);
- #endif
- return;
-}
-#endif
-
-#if defined(MEMSET_TURBO) && defined(_WIN32)
- void malloc_set(void *dest, int value, int count){
- _asm
- {
- mov eax, value
- mov ecx, count
- mov ebx, ecx
- mov edi, dest
- shr ecx, 2
- test ecx, ecx
- jz ByteOp
- shl ecx, 2
- sub ebx, ecx
- shr ecx, 2
- rep stosd
- test ebx, ebx
- jz Done
- ByteOp:
- mov ecx, ebx
- rep stosb
- Done:
- }
- }
- // Sets 32-bit aligned memory.
- void malloc_tsetdword(void *dest, int value, int count){
- _asm
- {
- mov edi, dest
- mov ecx, count
- shr ecx, 2
- mov eax, value
- rep stosd
- }
- }
-
- // Sets 16-bit aligned memory.
- void malloc_tsetword(void *dest, short value, int count){
- _asm
- {
- mov edi, dest
- mov ecx, count
- shr ecx, 1
- mov ax, value
- rep stosw
- }
- }
-#endif
-
-/*======================================
- * Initialise
- *--------------------------------------
- */
-
-unsigned int malloc_usage (void)
-{
-#ifdef USE_MEMMGR
- return memmgr_usage ();
-#else
- return 0;
-#endif
-}
-
-void malloc_final (void)
-{
-#ifdef USE_MEMMGR
- memmgr_final ();
-#endif
- return;
-}
-
-void malloc_init (void)
-{
-#ifdef USE_MEMMGR
- memmgr_init ();
-#endif
- return;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../common/malloc.h"
+#include "../common/core.h"
+#include "../common/showmsg.h"
+
+#ifdef MINICORE
+ #undef LOG_MEMMGR
+#endif
+
+void* aMalloc_(size_t size, const char *file, int line, const char *func)
+{
+ void *ret = MALLOC(size, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aMalloc %d\n",file,line,func,size);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aMalloc error out of memory!\n",file,line,func);
+ exit(1);
+ }
+
+ return ret;
+}
+void* aMallocA_(size_t size, const char *file, int line, const char *func)
+{
+ void *ret = MALLOCA(size, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aMallocA %d\n",file,line,func,size);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aMallocA error out of memory!\n",file,line,func);
+ exit(1);
+ }
+
+ return ret;
+}
+void* aCalloc_(size_t num, size_t size, const char *file, int line, const char *func)
+{
+ void *ret = CALLOC(num, size, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aCalloc %d %d\n",file,line,func,num,size);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aCalloc error out of memory!\n", file, line, func);
+ exit(1);
+ }
+ return ret;
+}
+void* aCallocA_(size_t num, size_t size, const char *file, int line, const char *func)
+{
+ void *ret = CALLOCA(num, size, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aCallocA %d %d\n",file,line,func,num,size);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aCallocA error out of memory!\n",file,line,func);
+ exit(1);
+ }
+ return ret;
+}
+void* aRealloc_(void *p, size_t size, const char *file, int line, const char *func)
+{
+ void *ret = REALLOC(p, size, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aRealloc %p %d\n",file,line,func,p,size);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aRealloc error out of memory!\n",file,line,func);
+ exit(1);
+ }
+ return ret;
+}
+char* aStrdup_(const char *p, const char *file, int line, const char *func)
+{
+ char *ret = STRDUP(p, file, line, func);
+ // ShowMessage("%s:%d: in func %s: aStrdup %p\n",file,line,func,p);
+ if (ret == NULL){
+ ShowFatalError("%s:%d: in func %s: aStrdup error out of memory!\n", file, line, func);
+ exit(1);
+ }
+ return ret;
+}
+void aFree_(void *p, const char *file, int line, const char *func)
+{
+ // ShowMessage("%s:%d: in func %s: aFree %p\n",file,line,func,p);
+ if (p)
+ FREE(p, file, line, func);
+
+ p = NULL;
+}
+
+#ifdef GCOLLECT
+
+void* _bcallocA(size_t size, size_t cnt)
+{
+ void *ret = MALLOCA(size * cnt);
+ if (ret) //malloc_set(ret, 0, size * cnt);
+ malloc_set(ret, 0, size*cnt);
+ return ret;
+}
+void* _bcalloc(size_t size, size_t cnt)
+{
+ void *ret = MALLOC(size * cnt);
+ if (ret) //malloc_set(ret, 0, size * cnt);
+ malloc_set(ret, 0, size*cnt);
+ return ret;
+}
+char* _bstrdup(const char *chr)
+{
+ int len = strlen(chr);
+ char *ret = (char*)MALLOC(len + 1);
+ if (ret) memcpy(ret, chr, len + 1);
+ return ret;
+}
+
+#endif
+
+#ifdef USE_MEMMGR
+
+/* USE_MEMMGR */
+
+/*
+ * ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ
+ * malloc , free ‚̈—‚ðŒø—¦“I‚Éo—ˆ‚é‚悤‚É‚µ‚½‚à‚ÌB
+ * •¡ŽG‚Ȉ—‚ðs‚Á‚Ä‚¢‚é‚Ì‚ÅAŽáŠ±d‚­‚È‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
+ *
+ * ƒf[ƒ^\‘¢‚È‚Çià–¾‰ºŽè‚Å‚·‚¢‚Ü‚¹‚ñ^^; j
+ * Eƒƒ‚ƒŠ‚ð•¡”‚ÌuƒuƒƒbƒNv‚É•ª‚¯‚ÄA‚³‚ç‚ɃuƒƒbƒN‚ð•¡”‚Ìuƒ†ƒjƒbƒgv
+ * ‚É•ª‚¯‚Ä‚¢‚Ü‚·Bƒ†ƒjƒbƒg‚̃TƒCƒY‚ÍA‚PƒuƒƒbƒN‚Ì—e—Ê‚ð•¡”ŒÂ‚É‹Ï“™”z•ª
+ * ‚µ‚½‚à‚Ì‚Å‚·B‚½‚Æ‚¦‚ÎA‚Pƒ†ƒjƒbƒg32KB‚Ìê‡AƒuƒƒbƒN‚P‚‚Í32Byte‚̃†
+ * ƒjƒbƒg‚ªA1024ŒÂW‚Ü‚Á‚Äo—ˆ‚Ä‚¢‚½‚èA64Byte‚̃†ƒjƒbƒg‚ª 512ŒÂW‚Ü‚Á‚Ä
+ * o—ˆ‚Ä‚¢‚½‚肵‚Ü‚·Bipadding,unit_head ‚𜂭j
+ *
+ * EƒuƒƒbƒN“¯Žm‚̓Šƒ“ƒNƒŠƒXƒg(block_prev,block_next) ‚ł‚Ȃª‚èA“¯‚¶ƒTƒC
+ * ƒY‚ðŽ‚ƒuƒƒbƒN“¯Žm‚àƒŠƒ“ƒNƒŠƒXƒg(samesize_prev,samesize_nect) ‚ł‚È
+ * ‚ª‚Á‚Ä‚¢‚Ü‚·B‚»‚ê‚É‚æ‚èA•s—v‚Æ‚È‚Á‚½ƒƒ‚ƒŠ‚ÌÄ—˜—p‚ªŒø—¦“I‚És‚¦‚Ü‚·B
+ */
+
+/* ƒuƒƒbƒN‚É“ü‚éƒf[ƒ^—Ê */
+#define BLOCK_DATA_SIZE 80*1024
+
+/* ˆê“x‚ÉŠm•Û‚·‚éƒuƒƒbƒN‚Ì”B */
+#define BLOCK_ALLOC 32
+
+/* ƒuƒƒbƒN‚̃Aƒ‰ƒCƒƒ“ƒg */
+#define BLOCK_ALIGNMENT 64
+
+/* ƒuƒƒbƒN */
+struct block {
+ int block_no; /* ƒuƒƒbƒN”Ô† */
+ struct block* block_prev; /* ‘O‚ÉŠm•Û‚µ‚½—̈æ */
+ struct block* block_next; /* ŽŸ‚ÉŠm•Û‚µ‚½—̈æ */
+ int samesize_no; /* “¯‚¶ƒTƒCƒY‚̔Ԇ */
+ struct block* samesize_prev; /* “¯‚¶ƒTƒCƒY‚Ì‘O‚̗̈æ */
+ struct block* samesize_next; /* “¯‚¶ƒTƒCƒY‚ÌŽŸ‚̗̈æ */
+ size_t unit_size; /* ƒ†ƒjƒbƒg‚̃oƒCƒg” 0=–¢Žg—p */
+ size_t unit_hash; /* ƒ†ƒjƒbƒg‚̃nƒbƒVƒ… */
+ int unit_count; /* ƒ†ƒjƒbƒg‚Ì” */
+ int unit_used; /* Žg—pς݃†ƒjƒbƒg */
+ char data[BLOCK_DATA_SIZE];
+};
+
+struct unit_head {
+ struct block* block;
+ size_t size;
+ const char* file;
+ int line;
+ unsigned int checksum;
+};
+
+struct chunk {
+ char *block;
+ struct chunk *next;
+};
+
+static struct block* block_first = NULL;
+static struct block* block_last = NULL;
+static struct block* block_unused = NULL;
+
+/* ƒ†ƒjƒbƒg‚ւ̃nƒbƒVƒ…B80KB/64Byte = 1280ŒÂ */
+static struct block* unit_first[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ʼn */
+static struct block* unit_unfill[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* –„‚Ü‚Á‚Ä‚È‚¢ */
+static struct block* unit_last[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ÅŒã */
+
+/* ƒƒ‚ƒŠ‚ðŽg‚¢‰ñ‚¹‚È‚¢—̈æ—p‚̃f[ƒ^ */
+struct unit_head_large {
+ struct unit_head_large* prev;
+ struct unit_head_large* next;
+ struct unit_head unit_head;
+};
+static struct unit_head_large *unit_head_large_first = NULL;
+
+static struct chunk *chunk_first = NULL;
+
+static struct block* block_malloc(void);
+static void block_free(struct block* p);
+static void memmgr_info(void);
+static unsigned int memmgr_usage_bytes = 0;
+
+void* _mmalloc(size_t size, const char *file, int line, const char *func ) {
+ int i;
+ struct block *block;
+ size_t size_hash;
+
+ if (((long) size) < 0) {
+ printf("_mmalloc: %d\n", size);
+ return 0;
+ }
+
+ size_hash = (size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT;
+ if(size == 0) {
+ return NULL;
+ }
+ memmgr_usage_bytes += size;
+
+ /* ƒuƒƒbƒN’·‚ð’´‚¦‚é—̈æ‚ÌŠm•Û‚É‚ÍAmalloc() ‚ð—p‚¢‚é */
+ /* ‚»‚ÌÛAunit_head.block ‚É NULL ‚ð‘ã“ü‚µ‚Ä‹æ•Ê‚·‚é */
+ if(size_hash * BLOCK_ALIGNMENT > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
+ struct unit_head_large* p = (struct unit_head_large*)MALLOC(sizeof(struct unit_head_large)+size,file,line,func);
+ if(p != NULL) {
+ p->unit_head.block = NULL;
+ p->unit_head.size = size;
+ p->unit_head.file = file;
+ p->unit_head.line = line;
+ p->prev = NULL;
+ if (unit_head_large_first == NULL)
+ p->next = NULL;
+ else {
+ unit_head_large_first->prev = p;
+ p->next = unit_head_large_first;
+ }
+ unit_head_large_first = p;
+ *(int*)((char*)p + sizeof(struct unit_head_large) - sizeof(int) + size) = 0xdeadbeaf;
+ return (char *)p + sizeof(struct unit_head_large) - sizeof(int);
+ } else {
+ ShowFatalError("Memory manager::memmgr_alloc failed (allocating %d+%d bytes at %s:%d).\n", sizeof(struct unit_head_large), size, file, line);
+ exit(1);
+ }
+ }
+
+ /* “¯ˆêƒTƒCƒY‚̃uƒƒbƒN‚ªŠm•Û‚³‚ê‚Ä‚¢‚È‚¢ŽžAV‚½‚ÉŠm•Û‚·‚é */
+ if(unit_unfill[size_hash] == NULL) {
+ block = block_malloc();
+ if(unit_first[size_hash] == NULL) {
+ /* ‰‰ñŠm•Û */
+ unit_first[size_hash] = block;
+ unit_last[size_hash] = block;
+ block->samesize_no = 0;
+ block->samesize_prev = NULL;
+ block->samesize_next = NULL;
+ } else {
+ /* ˜AŒ‹ì‹Æ */
+ unit_last[size_hash]->samesize_next = block;
+ block->samesize_no = unit_last[size_hash]->samesize_no + 1;
+ block->samesize_prev = unit_last[size_hash];
+ block->samesize_next = NULL;
+ unit_last[size_hash] = block;
+ }
+ unit_unfill[size_hash] = block;
+ block->unit_size = size_hash * BLOCK_ALIGNMENT + sizeof(struct unit_head);
+ block->unit_count = (int)(BLOCK_DATA_SIZE / block->unit_size);
+ block->unit_used = 0;
+ block->unit_hash = size_hash;
+ /* –¢Žg—pFlag‚𗧂Ăé */
+ for(i=0;i<block->unit_count;i++) {
+ ((struct unit_head*)(&block->data[block->unit_size * i]))->block = NULL;
+ }
+ }
+ /* ƒ†ƒjƒbƒgŽg—pŒÂ”‰ÁŽZ */
+ block = unit_unfill[size_hash];
+ block->unit_used++;
+
+ /* ƒ†ƒjƒbƒg“à‚ð‘S‚ÄŽg‚¢‰Ê‚½‚µ‚½ */
+ if(block->unit_count == block->unit_used) {
+ do {
+ unit_unfill[size_hash] = unit_unfill[size_hash]->samesize_next;
+ } while(
+ unit_unfill[size_hash] != NULL &&
+ unit_unfill[size_hash]->unit_count == unit_unfill[size_hash]->unit_used
+ );
+ }
+
+ /* ƒuƒƒbƒN‚Ì’†‚̋󂫃†ƒjƒbƒg‘{õ */
+ for(i=0;i<block->unit_count;i++) {
+ struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
+ if(head->block == NULL) {
+ head->block = block;
+ head->size = size;
+ head->line = line;
+ head->file = file;
+ *(int*)((char*)head + sizeof(struct unit_head) - sizeof(int) + size) = 0xdeadbeaf;
+ return (char *)head + sizeof(struct unit_head) - sizeof(int);
+ }
+ }
+ // ‚±‚±‚É—ˆ‚Ä‚Í‚¢‚¯‚È‚¢B
+ ShowFatalError("Memory manager::memmgr_malloc() serious error (allocating %d+%d bytes at %s:%d)\n", sizeof(struct unit_head_large), size, file, line);
+ memmgr_info();
+ exit(1);
+ return NULL;
+};
+
+void* _mcalloc(size_t num, size_t size, const char *file, int line, const char *func ) {
+ void *p = _mmalloc(num * size,file,line,func);
+ //malloc_set(p,0,num * size);
+ malloc_set(p,0,num*size);
+ return p;
+}
+
+void* _mrealloc(void *memblock, size_t size, const char *file, int line, const char *func ) {
+ size_t old_size;
+ if(memblock == NULL) {
+ return _mmalloc(size,file,line,func);
+ }
+
+ old_size = ((struct unit_head *)((char *)memblock - sizeof(struct unit_head) + sizeof(int)))->size;
+ if(old_size > size) {
+ // ƒTƒCƒYk¬ -> ‚»‚Ì‚Ü‚Ü•Ô‚·iŽè”²‚«j
+ return memblock;
+ } else {
+ // ƒTƒCƒYŠg‘å
+ void *p = _mmalloc(size,file,line,func);
+ if(p != NULL) {
+ memcpy(p,memblock,old_size);
+ }
+ _mfree(memblock,file,line,func);
+ return p;
+ }
+}
+
+char* _mstrdup(const char *p, const char *file, int line, const char *func ) {
+ if(p == NULL) {
+ return NULL;
+ } else {
+ size_t len = strlen(p);
+ char *string = (char *)_mmalloc(len + 1,file,line,func);
+ memcpy(string,p,len+1);
+ return string;
+ }
+}
+
+void _mfree(void *ptr, const char *file, int line, const char *func ) {
+ struct unit_head *head;
+ size_t size_hash;
+
+ if (ptr == NULL)
+ return;
+
+ head = (struct unit_head *)((char *)ptr - sizeof(struct unit_head) + sizeof(int));
+ size_hash = (head->size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT;
+
+ if(head->block == NULL) {
+ if(size_hash * BLOCK_ALIGNMENT > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
+ /* malloc() ‚Å’¼‚ÉŠm•Û‚³‚ꂽ—̈æ */
+ struct unit_head_large *head_large = (struct unit_head_large *)((char *)ptr - sizeof(struct unit_head_large) + sizeof(int));
+ if(
+ *(int*)((char*)head_large + sizeof(struct unit_head_large) - sizeof(int) + head->size)
+ != 0xdeadbeaf)
+ {
+ ShowError("Memory manager: args of aFree is overflowed pointer %s line %d\n", file, line);
+ }
+ if(head_large->prev) {
+ head_large->prev->next = head_large->next;
+ } else {
+ unit_head_large_first = head_large->next;
+ }
+ if(head_large->next) {
+ head_large->next->prev = head_large->prev;
+ }
+ head->block = NULL;
+ memmgr_usage_bytes -= head->size;
+ FREE(head_large,file,line,func);
+ } else {
+ ShowError("Memory manager: args of aFree is freed pointer %s:%d@%s\n", file, line, func);
+ }
+ ptr = NULL;
+ return;
+ } else {
+ /* ƒ†ƒjƒbƒg‰ð•ú */
+ struct block *block = head->block;
+ if((unsigned long)block % sizeof(struct block) != 0) {
+ ShowError("Memory manager: args of aFree is not valid pointer %s line %d\n", file, line);
+ } else if(*(int*)((char*)head + sizeof(struct unit_head) - sizeof(int) + head->size) != 0xdeadbeaf) {
+ ShowError("Memory manager: args of aFree is overflowed pointer %s line %d\n", file, line);
+ } else {
+ head->block = NULL;
+ memmgr_usage_bytes -= head->size;
+ if(--block->unit_used == 0) {
+ /* ƒuƒƒbƒN‚̉ð•ú */
+ if(unit_unfill[block->unit_hash] == block) {
+ /* ‹ó‚«ƒ†ƒjƒbƒg‚ÉŽw’肳‚ê‚Ä‚¢‚é */
+ do {
+ unit_unfill[block->unit_hash] = unit_unfill[block->unit_hash]->samesize_next;
+ } while(
+ unit_unfill[block->unit_hash] != NULL &&
+ unit_unfill[block->unit_hash]->unit_count == unit_unfill[block->unit_hash]->unit_used
+ );
+ }
+ if(block->samesize_prev == NULL && block->samesize_next == NULL) {
+ /* “Æ—§ƒuƒƒbƒN‚̉ð•ú */
+ unit_first[block->unit_hash] = NULL;
+ unit_last[block->unit_hash] = NULL;
+ unit_unfill[block->unit_hash] = NULL;
+ } else if(block->samesize_prev == NULL) {
+ /* 擪ƒuƒƒbƒN‚̉ð•ú */
+ unit_first[block->unit_hash] = block->samesize_next;
+ (block->samesize_next)->samesize_prev = NULL;
+ } else if(block->samesize_next == NULL) {
+ /* ––’[ƒuƒƒbƒN‚̉ð•ú */
+ unit_last[block->unit_hash] = block->samesize_prev;
+ (block->samesize_prev)->samesize_next = NULL;
+ } else {
+ /* ’†ŠÔƒuƒƒbƒN‚̉ð•ú */
+ (block->samesize_next)->samesize_prev = block->samesize_prev;
+ (block->samesize_prev)->samesize_next = block->samesize_next;
+ }
+ block_free(block);
+ } else {
+ /* ‹ó‚«ƒ†ƒjƒbƒg‚ÌÄÝ’è */
+ if(
+ unit_unfill[block->unit_hash] == NULL ||
+ unit_unfill[block->unit_hash]->samesize_no > block->samesize_no
+ ) {
+ unit_unfill[block->unit_hash] = block;
+ }
+ }
+ ptr = NULL;
+ }
+ }
+}
+
+/* Œ»Ý‚Ì󋵂ð•\Ž¦‚·‚é */
+static void memmgr_info(void) {
+ int i;
+ struct block *p;
+ ShowInfo("** Memory Manager Information **\n");
+ if(block_first == NULL) {
+ ShowMessage("Uninitialized.\n");
+ return;
+ }
+ ShowMessage(
+ "Blocks: %04u , BlockSize: %06u Byte , Used: %08uKB\n",
+ block_last->block_no+1,sizeof(struct block),
+ (block_last->block_no+1) * sizeof(struct block) / 1024
+ );
+ p = block_first;
+ for(i=0;i<=block_last->block_no;i++) {
+ ShowMessage(" Block #%04u : ",p->block_no);
+ if(p->unit_size == 0) {
+ ShowMessage("unused.\n");
+ } else {
+ ShowMessage(
+ "size: %05u byte. used: %04u/%04u prev:",
+ p->unit_size - sizeof(struct unit_head),p->unit_used,p->unit_count
+ );
+ if(p->samesize_prev == NULL) {
+ ShowMessage("NULL");
+ } else {
+ ShowMessage("%04u",(p->samesize_prev)->block_no);
+ }
+ ShowMessage(" next:");
+ if(p->samesize_next == NULL) {
+ ShowMessage("NULL");
+ } else {
+ ShowMessage("%04u",(p->samesize_next)->block_no);
+ }
+ ShowMessage("\n");
+ }
+ p = p->block_next;
+ }
+}
+
+/* ƒuƒƒbƒN‚ðŠm•Û‚·‚é */
+static struct block* block_malloc(void) {
+ if(block_unused != NULL) {
+ /* ƒuƒƒbƒN—p‚̗̈æ‚ÍŠm•ÛÏ‚Ý */
+ struct block* ret = block_unused;
+ do {
+ block_unused = block_unused->block_next;
+ } while(block_unused != NULL && block_unused->unit_size != 0);
+ return ret;
+ } else {
+ /* ƒuƒƒbƒN—p‚̗̈æ‚ðV‚½‚ÉŠm•Û‚·‚é */
+ int i;
+ int block_no;
+ struct block* p;
+ struct chunk* chunk;
+ char *pb = (char *)CALLOC(sizeof(struct block),BLOCK_ALLOC+1,file,line,func);
+ if(pb == NULL) {
+ ShowFatalError("Memory manager::block_alloc failed.\n");
+ exit(1);
+ }
+
+ // store original block address in chunk
+ chunk = (struct chunk *)MALLOC(sizeof(struct chunk),file,line,func);
+ if (chunk == NULL) {
+ ShowFatalError("Memory manager::block_alloc failed.\n");
+ exit(1);
+ }
+ chunk->block = pb;
+ chunk->next = (chunk_first) ? chunk_first : NULL;
+ chunk_first = chunk;
+
+ // ƒuƒƒbƒN‚̃|ƒCƒ“ƒ^‚Ì擪‚ðsizeof(block) ƒAƒ‰ƒCƒƒ“ƒg‚É‘µ‚¦‚é
+ // ‚±‚̃AƒhƒŒƒX‚ðfree() ‚·‚邱‚Æ‚Í‚È‚¢‚Ì‚ÅA’¼Úƒ|ƒCƒ“ƒ^‚ð•ÏX‚µ‚Ä‚¢‚éB
+ pb += sizeof(struct block) - ((unsigned long)pb % sizeof(struct block));
+ p = (struct block*)pb;
+ if(block_first == NULL) {
+ /* ‰‰ñŠm•Û */
+ block_no = 0;
+ block_first = p;
+ } else {
+ block_no = block_last->block_no + 1;
+ block_last->block_next = p;
+ p->block_prev = block_last;
+ }
+ block_last = &p[BLOCK_ALLOC - 1];
+ /* ƒuƒƒbƒN‚ð˜AŒ‹‚³‚¹‚é */
+ for(i=0;i<BLOCK_ALLOC;i++) {
+ if(i != 0) {
+ p[i].block_prev = &p[i-1];
+ }
+ if(i != BLOCK_ALLOC -1) {
+ p[i].block_next = &p[i+1];
+ }
+ p[i].block_no = block_no + i;
+ }
+
+ /* –¢Žg—pƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ðXV */
+ block_unused = &p[1];
+ p->unit_size = 1;
+ return p;
+ }
+}
+
+static void block_free(struct block* p) {
+ /* free() ‚¹‚¸‚ÉA–¢Žg—pƒtƒ‰ƒO‚ð•t‚¯‚邾‚¯ */
+ p->unit_size = 0;
+ /* –¢Žg—pƒ|ƒCƒ“ƒ^[‚ðXV‚·‚é */
+ if(block_unused == NULL) {
+ block_unused = p;
+ } else if(block_unused->block_no > p->block_no) {
+ block_unused = p;
+ }
+}
+
+unsigned int memmgr_usage (void)
+{
+ return memmgr_usage_bytes / 1024;
+}
+
+#ifdef LOG_MEMMGR
+static char memmer_logfile[128];
+static FILE *log_fp;
+
+static void memmgr_log (char *buf)
+{
+ if (!log_fp) {
+ log_fp = fopen(memmer_logfile,"w");
+ if (!log_fp) log_fp = stdout;
+ fprintf(log_fp, "Memory manager: Memory leaks found (Revision %s).\n", get_svn_revision());
+ }
+ fprintf(log_fp, buf);
+ return;
+}
+#endif
+
+static void memmgr_final (void)
+{
+ struct block *block = block_first;
+ struct chunk *chunk = chunk_first, *chunk2;
+ struct unit_head_large *large = unit_head_large_first, *large2;
+ int i;
+
+#ifdef LOG_MEMMGR
+ int count = 0;
+ char buf[128];
+#endif
+
+ while (block) {
+ if (block->unit_size) {
+ for (i = 0; i < block->unit_count; i++) {
+ struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
+ if(head->block != NULL)
+ {
+ #ifdef LOG_MEMMGR
+ sprintf (buf,
+ "%04d : %s line %d size %d\n", ++count,
+ head->file, head->line, head->size);
+ memmgr_log (buf);
+ #endif
+ // get block pointer and free it [celest]
+ _mfree ((char *)head + sizeof(struct unit_head) - sizeof(int), ALC_MARK);
+ }
+ }
+ }
+ //if (block->block_no >= block2->block_no + BLOCK_ALLOC - 1) {
+ // reached a new block array
+ //block = block->block_next;
+
+ /* Okay wise guys... this is how block2 was allocated: [Skotlex]
+ struct block* p;
+ char *pb = (char *) CALLOC (sizeof(struct block),BLOCK_ALLOC + 1);
+ pb += sizeof(struct block) - ((unsigned long)pb % sizeof(struct block));
+ p = (struct block*)pb;
+
+ The reason we get an invalid pointer is that we allocated pb, not p.
+ So how do you get pb when you only have p?
+ The answer is, you can't, because the original pointer was lost when
+ memory-aligning the block. So we either forget this FREE or use a
+ self-reference...
+ Since we are already quitting, it might be ok to just not free the block
+ as it is.
+ */
+ // didn't realise that before o.o -- block chunks are now freed below [celest]
+ // FREE(block2);
+ //block2 = block;
+ //continue;
+ //}
+ block = block->block_next;
+ }
+
+ // free the allocated block chunks
+ chunk = chunk_first;
+ while (chunk) {
+ chunk2 = chunk->next;
+ FREE(chunk->block,file,line,func);
+ FREE(chunk,file,line,func);
+ chunk = chunk2;
+ }
+
+ while(large) {
+ large2 = large->next;
+ #ifdef LOG_MEMMGR
+ sprintf (buf,
+ "%04d : %s line %d size %d\n", ++count,
+ large->unit_head.file, large->unit_head.line, large->unit_head.size);
+ memmgr_log (buf);
+ #endif
+ FREE(large,file,line,func);
+ large = large2;
+ }
+#ifdef LOG_MEMMGR
+ if(count == 0) {
+ ShowInfo("Memory manager: No memory leaks found.\n");
+ } else {
+ ShowWarning("Memory manager: Memory leaks found and fixed.\n");
+ fclose(log_fp);
+ }
+#endif
+ return;
+}
+
+static void memmgr_init (void)
+{
+ #ifdef LOG_MEMMGR
+ sprintf(memmer_logfile, "log/%s.leaks", SERVER_NAME);
+ ShowStatus("Memory manager initialised: "CL_WHITE"%s"CL_RESET"\n", memmer_logfile);
+ #endif
+ return;
+}
+#endif
+
+#if defined(MEMSET_TURBO) && defined(_WIN32)
+ void malloc_set(void *dest, int value, int count){
+ _asm
+ {
+ mov eax, value
+ mov ecx, count
+ mov ebx, ecx
+ mov edi, dest
+ shr ecx, 2
+ test ecx, ecx
+ jz ByteOp
+ shl ecx, 2
+ sub ebx, ecx
+ shr ecx, 2
+ rep stosd
+ test ebx, ebx
+ jz Done
+ ByteOp:
+ mov ecx, ebx
+ rep stosb
+ Done:
+ }
+ }
+ // Sets 32-bit aligned memory.
+ void malloc_tsetdword(void *dest, int value, int count){
+ _asm
+ {
+ mov edi, dest
+ mov ecx, count
+ shr ecx, 2
+ mov eax, value
+ rep stosd
+ }
+ }
+
+ // Sets 16-bit aligned memory.
+ void malloc_tsetword(void *dest, short value, int count){
+ _asm
+ {
+ mov edi, dest
+ mov ecx, count
+ shr ecx, 1
+ mov ax, value
+ rep stosw
+ }
+ }
+#endif
+
+/*======================================
+ * Initialise
+ *--------------------------------------
+ */
+
+unsigned int malloc_usage (void)
+{
+#ifdef USE_MEMMGR
+ return memmgr_usage ();
+#else
+ return 0;
+#endif
+}
+
+void malloc_final (void)
+{
+#ifdef USE_MEMMGR
+ memmgr_final ();
+#endif
+ return;
+}
+
+void malloc_init (void)
+{
+#ifdef USE_MEMMGR
+ memmgr_init ();
+#endif
+ return;
+}
diff --git a/src/common/malloc.h b/src/common/malloc.h
index f65593eb1..503eba75b 100644
--- a/src/common/malloc.h
+++ b/src/common/malloc.h
@@ -1,178 +1,178 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-// Q: What are the 'a'-variant allocation functions?
-// A: They allocate memory from the stack, which is automatically
-// freed when the invoking function returns.
-// But it's not portable (http://c-faq.com/malloc/alloca.html)
-// and I have doubts our implementation works.
-// -> They should NOT be used, period.
-
-#define MEMSET_TURBO
-
-#ifndef __NETBSD__
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-#endif
-#define ALC_MARK __FILE__, __LINE__, __func__
-
-//////////////////////////////////////////////////////////////////////
-// Whether to use Athena's built-in Memory Manager (enabled by default)
-// To disable just comment the following line
-#if !defined(DMALLOC) && !defined(BCHECK)
- #define USE_MEMMGR
-#endif
-// Whether to enable Memory Manager's logging
-#define LOG_MEMMGR
-
-#ifdef USE_MEMMGR
-
-# define aMalloc(n) _mmalloc(n,ALC_MARK)
-# define aMallocA(n) _mmalloc(n,ALC_MARK)
-# define aCalloc(m,n) _mcalloc(m,n,ALC_MARK)
-# define aCallocA(m,n) _mcalloc(m,n,ALC_MARK)
-# define aRealloc(p,n) _mrealloc(p,n,ALC_MARK)
-# define aStrdup(p) _mstrdup(p,ALC_MARK)
-# define aFree(p) _mfree(p,ALC_MARK)
-
- void* _mmalloc (size_t size, const char *file, int line, const char *func);
- void* _mcalloc (size_t num, size_t size, const char *file, int line, const char *func);
- void* _mrealloc (void *p, size_t size, const char *file, int line, const char *func);
- char* _mstrdup (const char *p, const char *file, int line, const char *func);
- void _mfree (void *p, const char *file, int line, const char *func);
-
-#else
-
-# define aMalloc(n) aMalloc_((n),ALC_MARK)
-# define aMallocA(n) aMallocA_((n),ALC_MARK)
-# define aCalloc(m,n) aCalloc_((m),(n),ALC_MARK)
-# define aCallocA(m,n) aCallocA_(m,n,ALC_MARK)
-# define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
-# define aStrdup(p) aStrdup_(p,ALC_MARK)
-# define aFree(p) aFree_(p,ALC_MARK)
-
- void* aMalloc_ (size_t size, const char *file, int line, const char *func);
- void* aMallocA_ (size_t size, const char *file, int line, const char *func);
- void* aCalloc_ (size_t num, size_t size, const char *file, int line, const char *func);
- void* aCallocA_ (size_t num, size_t size, const char *file, int line, const char *func);
- void* aRealloc_ (void *p, size_t size, const char *file, int line, const char *func);
- char* aStrdup_ (const char *p, const char *file, int line, const char *func);
- void aFree_ (void *p, const char *file, int line, const char *func);
-
-#endif
-
-////////////// Memory Managers //////////////////
-
-#ifdef MEMWATCH
-
-# include "memwatch.h"
-# define MALLOC(n,file,line,func) mwMalloc((n),(file),(line))
-# define MALLOCA(n,file,line,func) mwMalloc((n),(file),(line))
-# define CALLOC(m,n,file,line,func) mwCalloc((m),(n),(file),(line))
-# define CALLOCA(m,n,file,line,func) mwCalloc((m),(n),(file),(line))
-# define REALLOC(p,n,file,line,func) mwRealloc((p),(n),(file),(line))
-# define STRDUP(p,file,line,func) mwStrdup((p),(file),(line))
-# define FREE(p,file,line,func) mwFree((p),(file),(line))
-
-#elif defined(DMALLOC)
-
-# include "dmalloc.h"
-# define MALLOC(n,file,line,func) dmalloc_malloc((file),(line),(n),DMALLOC_FUNC_MALLOC,0,0)
-# define MALLOCA(n,file,line,func) dmalloc_malloc((file),(line),(n),DMALLOC_FUNC_MALLOC,0,0)
-# define CALLOC(m,n,file,line,func) dmalloc_malloc((file),(line),(m)*(n),DMALLOC_FUNC_CALLOC,0,0)
-# define CALLOCA(m,n,file,line,func) dmalloc_malloc((file),(line),(m)*(n),DMALLOC_FUNC_CALLOC,0,0)
-# define REALLOC(p,n,file,line,func) dmalloc_realloc((file),(line),(p),(n),DMALLOC_FUNC_REALLOC,0)
-# define STRDUP(p,file,line,func) strdup(p)
-# define FREE(p,file,line,func) free(p)
-
-#elif defined(GCOLLECT)
-
-# include "gc.h"
-# define MALLOC(n,file,line,func) GC_MALLOC(n)
-# define MALLOCA(n,file,line,func) GC_MALLOC_ATOMIC(n)
-# define CALLOC(m,n,file,line,func) _bcalloc((m),(n))
-# define CALLOCA(m,n,file,line,func) _bcallocA((m),(n))
-# define REALLOC(p,n,file,line,func) GC_REALLOC((p),(n))
-# define STRDUP(p,file,line,func) _bstrdup(p)
-# define FREE(p,file,line,func) GC_FREE(p)
-
- void * _bcalloc(size_t, size_t);
- void * _bcallocA(size_t, size_t);
- char * _bstrdup(const char *);
-
-/* FIXME Why is this the same as #else? [FlavioJS]
-#elif defined(BCHECK)
-
-# define MALLOC(n,file,line,func) malloc(n)
-# define MALLOCA(n,file,line,func) malloc(n)
-# define CALLOC(m,n,file,line,func) calloc((m),(n))
-# define CALLOCA(m,n,file,line,func) calloc((m),(n))
-# define REALLOC(p,n,file,line,func) realloc((p),(n))
-# define STRDUP(p,file,line,func) strdup(p)
-# define FREE(p,file,line,func) free(p)
-*/
-#else
-
-# define MALLOC(n,file,line,func) malloc(n)
-# define MALLOCA(n,file,line,func) malloc(n)
-# define CALLOC(m,n,file,line,func) calloc((m),(n))
-# define CALLOCA(m,n,file,line,func) calloc((m),(n))
-# define REALLOC(p,n,file,line,func) realloc((p),(n))
-# define STRDUP(p,file,line,func) strdup(p)
-# define FREE(p,file,line,func) free(p)
-
-#endif
-
-/////////////// Buffer Creation /////////////////
-// Full credit for this goes to Shinomori [Ajarn]
-
-#ifdef __GNUC__ // GCC has variable length arrays
-
- #define CREATE_BUFFER(name, type, size) type name[size]
- #define DELETE_BUFFER(name)
-
-#else // others don't, so we emulate them
-
- #define CREATE_BUFFER(name, type, size) type *name = (type *) aCalloc (size, sizeof(type))
- #define DELETE_BUFFER(name) aFree(name)
-
-#endif
-
-////////////// Others //////////////////////////
-// should be merged with any of above later
-#define CREATE(result, type, number) (result) = (type *) aCalloc ((number), sizeof(type));
-
-#define CREATE_A(result, type, number) (result) = (type *) aCallocA ((number), sizeof(type));
-
-#define RECREATE(result, type, number) (result) = (type *) aRealloc ((result), sizeof(type) * (number));
-
-////////////////////////////////////////////////
-
-unsigned int malloc_usage (void);
-#ifndef INLINE
- #ifdef _WIN32
- #define INLINE
- #else
- #define INLINE inline
- #endif
-#endif
-#if defined(MEMSET_TURBO) && defined(_WIN32)
- INLINE void malloc_set(void *, int, int);
- INLINE void malloc_tsetdword(void *, int, int);
- INLINE void malloc_tsetword(void *, short, int);
-#else
- #define malloc_set(x,y,z) memset(x,y,z)
- #define malloc_tsetdword(x,y,z) memset(x,y,z)
- #define malloc_tsetword(x,y,z) memset(x,y,z)
-#endif
-void malloc_init (void);
-void malloc_final (void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _MALLOC_H_
+#define _MALLOC_H_
+// Q: What are the 'a'-variant allocation functions?
+// A: They allocate memory from the stack, which is automatically
+// freed when the invoking function returns.
+// But it's not portable (http://c-faq.com/malloc/alloca.html)
+// and I have doubts our implementation works.
+// -> They should NOT be used, period.
+
+#define MEMSET_TURBO
+
+#ifndef __NETBSD__
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __func__ __FUNCTION__
+# else
+# define __func__ ""
+# endif
+#endif
+#endif
+#define ALC_MARK __FILE__, __LINE__, __func__
+
+//////////////////////////////////////////////////////////////////////
+// Whether to use Athena's built-in Memory Manager (enabled by default)
+// To disable just comment the following line
+#if !defined(DMALLOC) && !defined(BCHECK)
+ #define USE_MEMMGR
+#endif
+// Whether to enable Memory Manager's logging
+#define LOG_MEMMGR
+
+#ifdef USE_MEMMGR
+
+# define aMalloc(n) _mmalloc(n,ALC_MARK)
+# define aMallocA(n) _mmalloc(n,ALC_MARK)
+# define aCalloc(m,n) _mcalloc(m,n,ALC_MARK)
+# define aCallocA(m,n) _mcalloc(m,n,ALC_MARK)
+# define aRealloc(p,n) _mrealloc(p,n,ALC_MARK)
+# define aStrdup(p) _mstrdup(p,ALC_MARK)
+# define aFree(p) _mfree(p,ALC_MARK)
+
+ void* _mmalloc (size_t size, const char *file, int line, const char *func);
+ void* _mcalloc (size_t num, size_t size, const char *file, int line, const char *func);
+ void* _mrealloc (void *p, size_t size, const char *file, int line, const char *func);
+ char* _mstrdup (const char *p, const char *file, int line, const char *func);
+ void _mfree (void *p, const char *file, int line, const char *func);
+
+#else
+
+# define aMalloc(n) aMalloc_((n),ALC_MARK)
+# define aMallocA(n) aMallocA_((n),ALC_MARK)
+# define aCalloc(m,n) aCalloc_((m),(n),ALC_MARK)
+# define aCallocA(m,n) aCallocA_(m,n,ALC_MARK)
+# define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
+# define aStrdup(p) aStrdup_(p,ALC_MARK)
+# define aFree(p) aFree_(p,ALC_MARK)
+
+ void* aMalloc_ (size_t size, const char *file, int line, const char *func);
+ void* aMallocA_ (size_t size, const char *file, int line, const char *func);
+ void* aCalloc_ (size_t num, size_t size, const char *file, int line, const char *func);
+ void* aCallocA_ (size_t num, size_t size, const char *file, int line, const char *func);
+ void* aRealloc_ (void *p, size_t size, const char *file, int line, const char *func);
+ char* aStrdup_ (const char *p, const char *file, int line, const char *func);
+ void aFree_ (void *p, const char *file, int line, const char *func);
+
+#endif
+
+////////////// Memory Managers //////////////////
+
+#ifdef MEMWATCH
+
+# include "memwatch.h"
+# define MALLOC(n,file,line,func) mwMalloc((n),(file),(line))
+# define MALLOCA(n,file,line,func) mwMalloc((n),(file),(line))
+# define CALLOC(m,n,file,line,func) mwCalloc((m),(n),(file),(line))
+# define CALLOCA(m,n,file,line,func) mwCalloc((m),(n),(file),(line))
+# define REALLOC(p,n,file,line,func) mwRealloc((p),(n),(file),(line))
+# define STRDUP(p,file,line,func) mwStrdup((p),(file),(line))
+# define FREE(p,file,line,func) mwFree((p),(file),(line))
+
+#elif defined(DMALLOC)
+
+# include "dmalloc.h"
+# define MALLOC(n,file,line,func) dmalloc_malloc((file),(line),(n),DMALLOC_FUNC_MALLOC,0,0)
+# define MALLOCA(n,file,line,func) dmalloc_malloc((file),(line),(n),DMALLOC_FUNC_MALLOC,0,0)
+# define CALLOC(m,n,file,line,func) dmalloc_malloc((file),(line),(m)*(n),DMALLOC_FUNC_CALLOC,0,0)
+# define CALLOCA(m,n,file,line,func) dmalloc_malloc((file),(line),(m)*(n),DMALLOC_FUNC_CALLOC,0,0)
+# define REALLOC(p,n,file,line,func) dmalloc_realloc((file),(line),(p),(n),DMALLOC_FUNC_REALLOC,0)
+# define STRDUP(p,file,line,func) strdup(p)
+# define FREE(p,file,line,func) free(p)
+
+#elif defined(GCOLLECT)
+
+# include "gc.h"
+# define MALLOC(n,file,line,func) GC_MALLOC(n)
+# define MALLOCA(n,file,line,func) GC_MALLOC_ATOMIC(n)
+# define CALLOC(m,n,file,line,func) _bcalloc((m),(n))
+# define CALLOCA(m,n,file,line,func) _bcallocA((m),(n))
+# define REALLOC(p,n,file,line,func) GC_REALLOC((p),(n))
+# define STRDUP(p,file,line,func) _bstrdup(p)
+# define FREE(p,file,line,func) GC_FREE(p)
+
+ void * _bcalloc(size_t, size_t);
+ void * _bcallocA(size_t, size_t);
+ char * _bstrdup(const char *);
+
+/* FIXME Why is this the same as #else? [FlavioJS]
+#elif defined(BCHECK)
+
+# define MALLOC(n,file,line,func) malloc(n)
+# define MALLOCA(n,file,line,func) malloc(n)
+# define CALLOC(m,n,file,line,func) calloc((m),(n))
+# define CALLOCA(m,n,file,line,func) calloc((m),(n))
+# define REALLOC(p,n,file,line,func) realloc((p),(n))
+# define STRDUP(p,file,line,func) strdup(p)
+# define FREE(p,file,line,func) free(p)
+*/
+#else
+
+# define MALLOC(n,file,line,func) malloc(n)
+# define MALLOCA(n,file,line,func) malloc(n)
+# define CALLOC(m,n,file,line,func) calloc((m),(n))
+# define CALLOCA(m,n,file,line,func) calloc((m),(n))
+# define REALLOC(p,n,file,line,func) realloc((p),(n))
+# define STRDUP(p,file,line,func) strdup(p)
+# define FREE(p,file,line,func) free(p)
+
+#endif
+
+/////////////// Buffer Creation /////////////////
+// Full credit for this goes to Shinomori [Ajarn]
+
+#ifdef __GNUC__ // GCC has variable length arrays
+
+ #define CREATE_BUFFER(name, type, size) type name[size]
+ #define DELETE_BUFFER(name)
+
+#else // others don't, so we emulate them
+
+ #define CREATE_BUFFER(name, type, size) type *name = (type *) aCalloc (size, sizeof(type))
+ #define DELETE_BUFFER(name) aFree(name)
+
+#endif
+
+////////////// Others //////////////////////////
+// should be merged with any of above later
+#define CREATE(result, type, number) (result) = (type *) aCalloc ((number), sizeof(type));
+
+#define CREATE_A(result, type, number) (result) = (type *) aCallocA ((number), sizeof(type));
+
+#define RECREATE(result, type, number) (result) = (type *) aRealloc ((result), sizeof(type) * (number));
+
+////////////////////////////////////////////////
+
+unsigned int malloc_usage (void);
+#ifndef INLINE
+ #ifdef _WIN32
+ #define INLINE
+ #else
+ #define INLINE inline
+ #endif
+#endif
+#if defined(MEMSET_TURBO) && defined(_WIN32)
+ INLINE void malloc_set(void *, int, int);
+ INLINE void malloc_tsetdword(void *, int, int);
+ INLINE void malloc_tsetword(void *, short, int);
+#else
+ #define malloc_set(x,y,z) memset(x,y,z)
+ #define malloc_tsetdword(x,y,z) memset(x,y,z)
+ #define malloc_tsetword(x,y,z) memset(x,y,z)
+#endif
+void malloc_init (void);
+void malloc_final (void);
+
+#endif
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
index 8508f1333..931846bd6 100644
--- a/src/common/nullpo.c
+++ b/src/common/nullpo.c
@@ -1,94 +1,94 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include "nullpo.h"
-#include "../common/showmsg.h"
-// #include "logs.h" // •z΂µ‚Ä‚Ý‚é
-
-static void nullpo_info_core(const char *file, int line, const char *func,
- const char *fmt, va_list ap);
-
-/*======================================
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
- *--------------------------------------
- */
-int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
- const char *fmt, ...)
-{
- va_list ap;
-
- if (target != NULL)
- return 0;
-
- va_start(ap, fmt);
- nullpo_info_core(file, line, func, fmt, ap);
- va_end(ap);
- return 1;
-}
-
-int nullpo_chk(const char *file, int line, const char *func, const void *target)
-{
- if (target != NULL)
- return 0;
-
- nullpo_info_core(file, line, func, NULL, NULL);
- return 1;
-}
-
-
-/*======================================
- * nullpoî•ño—Í(ŠO•”ŒÄo‚µŒü‚¯ƒ‰ƒbƒp)
- *--------------------------------------
- */
-void nullpo_info_f(const char *file, int line, const char *func,
- const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- nullpo_info_core(file, line, func, fmt, ap);
- va_end(ap);
-}
-
-void nullpo_info(const char *file, int line, const char *func)
-{
- nullpo_info_core(file, line, func, NULL, NULL);
-}
-
-
-/*======================================
- * nullpoî•ño—Í(Main)
- *--------------------------------------
- */
-static void nullpo_info_core(const char *file, int line, const char *func,
- const char *fmt, va_list ap)
-{
- if (file == NULL)
- file = "??";
-
- func =
- func == NULL ? "unknown":
- func[0] == '\0' ? "unknown":
- func;
-
- ShowMessage("--- nullpo info --------------------------------------------\n");
- ShowMessage("%s:%d: in func `%s'\n", file, line, func);
- if (fmt != NULL)
- {
- if (fmt[0] != '\0')
- {
- vprintf(fmt, ap);
-
- // ÅŒã‚ɉüs‚µ‚½‚©Šm”F
- if (fmt[strlen(fmt)-1] != '\n')
- ShowMessage("\n");
- }
- }
- ShowMessage("--- end nullpo info ----------------------------------------\n");
-
- // ‚±‚±‚ç‚ÅnullpoƒƒO‚ðƒtƒ@ƒCƒ‹‚É‘‚«o‚¹‚½‚ç
- // ‚Ü‚Æ‚ß‚Ä’ño‚Å‚«‚é‚È‚ÆŽv‚Á‚Ä‚¢‚½‚èB
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "nullpo.h"
+#include "../common/showmsg.h"
+// #include "logs.h" // •z΂µ‚Ä‚Ý‚é
+
+static void nullpo_info_core(const char *file, int line, const char *func,
+ const char *fmt, va_list ap);
+
+/*======================================
+ * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
+ *--------------------------------------
+ */
+int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ if (target != NULL)
+ return 0;
+
+ va_start(ap, fmt);
+ nullpo_info_core(file, line, func, fmt, ap);
+ va_end(ap);
+ return 1;
+}
+
+int nullpo_chk(const char *file, int line, const char *func, const void *target)
+{
+ if (target != NULL)
+ return 0;
+
+ nullpo_info_core(file, line, func, NULL, NULL);
+ return 1;
+}
+
+
+/*======================================
+ * nullpoî•ño—Í(ŠO•”ŒÄo‚µŒü‚¯ƒ‰ƒbƒp)
+ *--------------------------------------
+ */
+void nullpo_info_f(const char *file, int line, const char *func,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ nullpo_info_core(file, line, func, fmt, ap);
+ va_end(ap);
+}
+
+void nullpo_info(const char *file, int line, const char *func)
+{
+ nullpo_info_core(file, line, func, NULL, NULL);
+}
+
+
+/*======================================
+ * nullpoî•ño—Í(Main)
+ *--------------------------------------
+ */
+static void nullpo_info_core(const char *file, int line, const char *func,
+ const char *fmt, va_list ap)
+{
+ if (file == NULL)
+ file = "??";
+
+ func =
+ func == NULL ? "unknown":
+ func[0] == '\0' ? "unknown":
+ func;
+
+ ShowMessage("--- nullpo info --------------------------------------------\n");
+ ShowMessage("%s:%d: in func `%s'\n", file, line, func);
+ if (fmt != NULL)
+ {
+ if (fmt[0] != '\0')
+ {
+ vprintf(fmt, ap);
+
+ // ÅŒã‚ɉüs‚µ‚½‚©Šm”F
+ if (fmt[strlen(fmt)-1] != '\n')
+ ShowMessage("\n");
+ }
+ }
+ ShowMessage("--- end nullpo info ----------------------------------------\n");
+
+ // ‚±‚±‚ç‚ÅnullpoƒƒO‚ðƒtƒ@ƒCƒ‹‚É‘‚«o‚¹‚½‚ç
+ // ‚Ü‚Æ‚ß‚Ä’ño‚Å‚«‚é‚È‚ÆŽv‚Á‚Ä‚¢‚½‚èB
+}
diff --git a/src/common/nullpo.h b/src/common/nullpo.h
index 66d984224..d5ccb8f95 100644
--- a/src/common/nullpo.h
+++ b/src/common/nullpo.h
@@ -1,237 +1,237 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _NULLPO_H_
-#define _NULLPO_H_
-
-
-#define NULLPO_CHECK 1
- // ‘S‘̂̃XƒCƒbƒ`‚ð錾‚µ‚Ä‚¢‚éƒwƒbƒ_‚ª‚ ‚ê‚Î
- // ‚»‚±‚Ɉړ®‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Æ
-
-#ifndef __NETBSD__
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-#endif
-
-#ifdef _WIN32
-#define __attribute__(x) /* nothing */
-#endif
-
-
-#define NLP_MARK __FILE__, __LINE__, __func__
-
-/*----------------------------------------------------------------------------
- * Macros
- *----------------------------------------------------------------------------
- */
-/*======================================
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—ÍŒã return
- *E“WŠJ‚·‚é‚Æif‚Æ‚©return“™‚ªo‚é‚Ì‚Å
- * ˆês’P‘Ì‚ÅŽg‚Á‚Ä‚­‚¾‚³‚¢B
- *Enullpo_ret(x = func());
- * ‚̂悤‚ÈŽg—p–@‚à‘z’肵‚Ä‚¢‚Ü‚·B
- *--------------------------------------
- * nullpo_ret(t)
- * –ß‚è’l 0ŒÅ’è
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_retv(t)
- * –ß‚è’l ‚È‚µ
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_retr(ret, t)
- * –ß‚è’l Žw’è
- * [ˆø”]
- * ret return(ret);
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_ret_f(t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l 0
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- * nullpo_retv_f(t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l ‚È‚µ
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- * nullpo_retr_f(ret, t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l Žw’è
- * [ˆø”]
- * ret return(ret);
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- */
-
-#if NULLPO_CHECK
-
-#define nullpo_ret(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
-
-#define nullpo_retv(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
-
-#define nullpo_retr(ret, t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
-
-#define nullpo_retb(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
-
-// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
-#if __STDC_VERSION__ >= 199901L
-/* C99‚ɑΉž */
-#define nullpo_ret_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
-
-#define nullpo_retb_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
-
-#elif __GNUC__ >= 2
-/* GCC—p */
-#define nullpo_ret_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
-
-#define nullpo_retb_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
-
-#else
-
-/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
-
-#endif
-
-#else /* NULLPO_CHECK */
-/* No Nullpo check */
-
-// if((t)){;}
-// —Ç‚¢•û–@‚ªŽv‚¢‚‚©‚È‚©‚Á‚½‚Ì‚ÅEEE‹ê“÷‚Ìô‚Å‚·B
-// ˆê‰žƒ[ƒjƒ“ƒO‚Ío‚È‚¢‚Í‚¸
-
-#define nullpo_ret(t) if((t)){;}
-#define nullpo_retv(t) if((t)){;}
-#define nullpo_retr(ret, t) if((t)){;}
-#define nullpo_retb(t) if((t)){;}
-
-// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
-#if __STDC_VERSION__ >= 199901L
-/* C99‚ɑΉž */
-#define nullpo_ret_f(t, fmt, ...) if((t)){;}
-#define nullpo_retv_f(t, fmt, ...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
-#define nullpo_retb_f(t, fmt, ...) if((t)){;}
-
-#elif __GNUC__ >= 2
-/* GCC—p */
-#define nullpo_ret_f(t, fmt, args...) if((t)){;}
-#define nullpo_retv_f(t, fmt, args...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
-#define nullpo_retb_f(t, fmt, args...) if((t)){;}
-
-#else
-/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
-#endif
-
-#endif /* NULLPO_CHECK */
-
-/*----------------------------------------------------------------------------
- * Functions
- *----------------------------------------------------------------------------
- */
-/*======================================
- * nullpo_chk
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * target ƒ`ƒFƒbƒN‘ÎÛ
- * [•Ô‚è’l]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk(const char *file, int line, const char *func, const void *target);
-
-
-/*======================================
- * nullpo_chk_f
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ ÚׂÈî•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * target ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- * [•Ô‚è’l]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
- const char *fmt, ...)
- __attribute__((format(printf,5,6)));
-
-
-/*======================================
- * nullpo_info
- * nullpoî•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- *--------------------------------------
- */
-void nullpo_info(const char *file, int line, const char *func);
-
-
-/*======================================
- * nullpo_info_f
- * nullpoÚ×î•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- */
-void nullpo_info_f(const char *file, int line, const char *func,
- const char *fmt, ...)
- __attribute__((format(printf,4,5)));
-
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _NULLPO_H_
+#define _NULLPO_H_
+
+
+#define NULLPO_CHECK 1
+ // ‘S‘̂̃XƒCƒbƒ`‚ð錾‚µ‚Ä‚¢‚éƒwƒbƒ_‚ª‚ ‚ê‚Î
+ // ‚»‚±‚Ɉړ®‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Æ
+
+#ifndef __NETBSD__
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __func__ __FUNCTION__
+# else
+# define __func__ ""
+# endif
+#endif
+#endif
+
+#ifdef _WIN32
+#define __attribute__(x) /* nothing */
+#endif
+
+
+#define NLP_MARK __FILE__, __LINE__, __func__
+
+/*----------------------------------------------------------------------------
+ * Macros
+ *----------------------------------------------------------------------------
+ */
+/*======================================
+ * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—ÍŒã return
+ *E“WŠJ‚·‚é‚Æif‚Æ‚©return“™‚ªo‚é‚Ì‚Å
+ * ˆês’P‘Ì‚ÅŽg‚Á‚Ä‚­‚¾‚³‚¢B
+ *Enullpo_ret(x = func());
+ * ‚̂悤‚ÈŽg—p–@‚à‘z’肵‚Ä‚¢‚Ü‚·B
+ *--------------------------------------
+ * nullpo_ret(t)
+ * –ß‚è’l 0ŒÅ’è
+ * [ˆø”]
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ *--------------------------------------
+ * nullpo_retv(t)
+ * –ß‚è’l ‚È‚µ
+ * [ˆø”]
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ *--------------------------------------
+ * nullpo_retr(ret, t)
+ * –ß‚è’l Žw’è
+ * [ˆø”]
+ * ret return(ret);
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ *--------------------------------------
+ * nullpo_ret_f(t, fmt, ...)
+ * Ú×î•ño—Í—p
+ * –ß‚è’l 0
+ * [ˆø”]
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ * fmt ... vprintf‚É“n‚³‚ê‚é
+ * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
+ *--------------------------------------
+ * nullpo_retv_f(t, fmt, ...)
+ * Ú×î•ño—Í—p
+ * –ß‚è’l ‚È‚µ
+ * [ˆø”]
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ * fmt ... vprintf‚É“n‚³‚ê‚é
+ * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
+ *--------------------------------------
+ * nullpo_retr_f(ret, t, fmt, ...)
+ * Ú×î•ño—Í—p
+ * –ß‚è’l Žw’è
+ * [ˆø”]
+ * ret return(ret);
+ * t ƒ`ƒFƒbƒN‘ÎÛ
+ * fmt ... vprintf‚É“n‚³‚ê‚é
+ * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
+ *--------------------------------------
+ */
+
+#if NULLPO_CHECK
+
+#define nullpo_ret(t) \
+ if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
+
+#define nullpo_retv(t) \
+ if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
+
+#define nullpo_retr(ret, t) \
+ if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
+
+#define nullpo_retb(t) \
+ if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
+
+// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
+#if __STDC_VERSION__ >= 199901L
+/* C99‚ɑΉž */
+#define nullpo_ret_f(t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
+
+#define nullpo_retv_f(t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
+
+#define nullpo_retr_f(ret, t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
+
+#define nullpo_retb_f(t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
+
+#elif __GNUC__ >= 2
+/* GCC—p */
+#define nullpo_ret_f(t, fmt, args...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
+
+#define nullpo_retv_f(t, fmt, args...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
+
+#define nullpo_retr_f(ret, t, fmt, args...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
+
+#define nullpo_retb_f(t, fmt, args...) \
+ if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
+
+#else
+
+/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
+
+#endif
+
+#else /* NULLPO_CHECK */
+/* No Nullpo check */
+
+// if((t)){;}
+// —Ç‚¢•û–@‚ªŽv‚¢‚‚©‚È‚©‚Á‚½‚Ì‚ÅEEE‹ê“÷‚Ìô‚Å‚·B
+// ˆê‰žƒ[ƒjƒ“ƒO‚Ío‚È‚¢‚Í‚¸
+
+#define nullpo_ret(t) if((t)){;}
+#define nullpo_retv(t) if((t)){;}
+#define nullpo_retr(ret, t) if((t)){;}
+#define nullpo_retb(t) if((t)){;}
+
+// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
+#if __STDC_VERSION__ >= 199901L
+/* C99‚ɑΉž */
+#define nullpo_ret_f(t, fmt, ...) if((t)){;}
+#define nullpo_retv_f(t, fmt, ...) if((t)){;}
+#define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
+#define nullpo_retb_f(t, fmt, ...) if((t)){;}
+
+#elif __GNUC__ >= 2
+/* GCC—p */
+#define nullpo_ret_f(t, fmt, args...) if((t)){;}
+#define nullpo_retv_f(t, fmt, args...) if((t)){;}
+#define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
+#define nullpo_retb_f(t, fmt, args...) if((t)){;}
+
+#else
+/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
+#endif
+
+#endif /* NULLPO_CHECK */
+
+/*----------------------------------------------------------------------------
+ * Functions
+ *----------------------------------------------------------------------------
+ */
+/*======================================
+ * nullpo_chk
+ * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
+ * [ˆø”]
+ * file __FILE__
+ * line __LINE__
+ * func __func__ (ŠÖ”–¼)
+ * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
+ * target ƒ`ƒFƒbƒN‘ÎÛ
+ * [•Ô‚è’l]
+ * 0 OK
+ * 1 NULL
+ *--------------------------------------
+ */
+int nullpo_chk(const char *file, int line, const char *func, const void *target);
+
+
+/*======================================
+ * nullpo_chk_f
+ * Nullƒ`ƒFƒbƒN ‹y‚Ñ ÚׂÈî•ño—Í
+ * [ˆø”]
+ * file __FILE__
+ * line __LINE__
+ * func __func__ (ŠÖ”–¼)
+ * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
+ * target ƒ`ƒFƒbƒN‘ÎÛ
+ * fmt ... vprintf‚É“n‚³‚ê‚é
+ * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
+ * [•Ô‚è’l]
+ * 0 OK
+ * 1 NULL
+ *--------------------------------------
+ */
+int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
+ const char *fmt, ...)
+ __attribute__((format(printf,5,6)));
+
+
+/*======================================
+ * nullpo_info
+ * nullpoî•ño—Í
+ * [ˆø”]
+ * file __FILE__
+ * line __LINE__
+ * func __func__ (ŠÖ”–¼)
+ * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
+ *--------------------------------------
+ */
+void nullpo_info(const char *file, int line, const char *func);
+
+
+/*======================================
+ * nullpo_info_f
+ * nullpoÚ×î•ño—Í
+ * [ˆø”]
+ * file __FILE__
+ * line __LINE__
+ * func __func__ (ŠÖ”–¼)
+ * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
+ * fmt ... vprintf‚É“n‚³‚ê‚é
+ * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
+ *--------------------------------------
+ */
+void nullpo_info_f(const char *file, int line, const char *func,
+ const char *fmt, ...)
+ __attribute__((format(printf,4,5)));
+
+
+#endif
diff --git a/src/common/plugin.h b/src/common/plugin.h
index 2ccefb6bd..402636b1d 100644
--- a/src/common/plugin.h
+++ b/src/common/plugin.h
@@ -1,40 +1,40 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PLUGIN_H_
-#define _PLUGIN_H_
-
-////// Plugin functions ///////////////
-
-#define PLUGIN_VERSION "1.02"
-
-typedef struct _Plugin_Info {
- char *name;
- char type;
- char *version;
- char *req_version;
- char *description;
-} Plugin_Info;
-
-typedef struct _Plugin_Event_Table {
- char *func_name;
- char *event_name;
-} Plugin_Event_Table;
-
-////// Plugin Export functions /////////////
-
-#define PLUGIN_ALL 0
-#define PLUGIN_LOGIN 1
-#define PLUGIN_CHAR 2
-#define PLUGIN_MAP 8
-#define PLUGIN_CORE 16
-
-#define IMPORT_SYMBOL(s,n) (s) = plugin_call_table[n]
-
-////// Global Plugin variables /////////////
-
-#define PLUGIN_INFO struct _Plugin_Info plugin_info
-#define PLUGIN_EVENTS_TABLE struct _Plugin_Event_Table plugin_event_table[]
-void **plugin_call_table;
-
-#endif // _PLUGIN_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _PLUGIN_H_
+#define _PLUGIN_H_
+
+////// Plugin functions ///////////////
+
+#define PLUGIN_VERSION "1.02"
+
+typedef struct _Plugin_Info {
+ char *name;
+ char type;
+ char *version;
+ char *req_version;
+ char *description;
+} Plugin_Info;
+
+typedef struct _Plugin_Event_Table {
+ char *func_name;
+ char *event_name;
+} Plugin_Event_Table;
+
+////// Plugin Export functions /////////////
+
+#define PLUGIN_ALL 0
+#define PLUGIN_LOGIN 1
+#define PLUGIN_CHAR 2
+#define PLUGIN_MAP 8
+#define PLUGIN_CORE 16
+
+#define IMPORT_SYMBOL(s,n) (s) = plugin_call_table[n]
+
+////// Global Plugin variables /////////////
+
+#define PLUGIN_INFO struct _Plugin_Info plugin_info
+#define PLUGIN_EVENTS_TABLE struct _Plugin_Event_Table plugin_event_table[]
+void **plugin_call_table;
+
+#endif // _PLUGIN_H_
diff --git a/src/common/plugins.c b/src/common/plugins.c
index a057190b9..5951885a1 100644
--- a/src/common/plugins.c
+++ b/src/common/plugins.c
@@ -1,367 +1,367 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-
-#include "plugin.h"
-#include "plugins.h"
-#include "../common/mmo.h"
-#include "../common/core.h"
-#include "../common/timer.h"
-#include "../common/utils.h"
-#include "../common/socket.h"
-#include "../common/malloc.h"
-#include "../common/version.h"
-#include "../common/showmsg.h"
-
-//////////////////////////////////////////////
-
-typedef struct _Plugin_Event {
- void (*func)(void);
- struct _Plugin_Event *next;
-} Plugin_Event;
-
-typedef struct _Plugin_Event_List {
- char *name;
- struct _Plugin_Event_List *next;
- struct _Plugin_Event *events;
-} Plugin_Event_List;
-
-static int auto_search = 1;
-static int load_priority = 0;
-Plugin_Event_List *event_head = NULL;
-Plugin *plugin_head = NULL;
-
-Plugin_Info default_info = { "Unknown", PLUGIN_ALL, "0", PLUGIN_VERSION, "Unknown" };
-
-static size_t call_table_size = 0;
-static size_t max_call_table = 0;
-
-////// Plugin Events Functions //////////////////
-
-int register_plugin_func (char *name)
-{
- Plugin_Event_List *evl;
- if (name) {
- evl = (Plugin_Event_List *) aMalloc(sizeof(Plugin_Event_List));
- evl->name = (char *) aMalloc (strlen(name) + 1);
-
- evl->next = event_head;
- strcpy(evl->name, name);
- evl->events = NULL;
- event_head = evl;
- }
- return 0;
-}
-
-Plugin_Event_List *search_plugin_func (char *name)
-{
- Plugin_Event_List *evl = event_head;
- while (evl) {
- if (strcmpi(evl->name, name) == 0)
- return evl;
- evl = evl->next;
- }
- return NULL;
-}
-
-int register_plugin_event (void (*func)(void), char* name)
-{
- Plugin_Event_List *evl = search_plugin_func(name);
- if (!evl) {
- // register event if it doesn't exist already
- register_plugin_func(name);
- // relocate the new event list
- evl = search_plugin_func(name);
- }
- if (evl) {
- Plugin_Event *ev;
-
- ev = (Plugin_Event *) aMalloc(sizeof(Plugin_Event));
- ev->func = func;
- ev->next = NULL;
-
- if (evl->events == NULL)
- evl->events = ev;
- else {
- Plugin_Event *ev2 = evl->events;
- while (ev2) {
- if (ev2->next == NULL) {
- ev2->next = ev;
- break;
- }
- ev2 = ev2->next;
- }
- }
- }
- return 0;
-}
-
-int plugin_event_trigger (char *name)
-{
- int c = 0;
- Plugin_Event_List *evl = search_plugin_func(name);
- if (evl) {
- Plugin_Event *ev = evl->events;
- while (ev) {
- ev->func();
- ev = ev->next;
- c++;
- }
- }
- return c;
-}
-
-////// Plugins Call Table Functions /////////
-
-int export_symbol (void *var, int offset)
-{
- //printf ("0x%x\n", var);
-
- // add to the end of the list
- if (offset < 0)
- offset = call_table_size;
-
- // realloc if not large enough
- if ((size_t)offset >= max_call_table) {
- max_call_table = 1 + offset;
- plugin_call_table = (void**)aRealloc(plugin_call_table, max_call_table*sizeof(void*));
-
- // clear the new alloced block
- malloc_tsetdword(plugin_call_table + call_table_size, 0, (max_call_table-call_table_size)*sizeof(void*));
- }
-
- // the new table size is delimited by the new element at the end
- if ((size_t)offset >= call_table_size)
- call_table_size = offset+1;
-
- // put the pointer at the selected place
- plugin_call_table[offset] = var;
- return 0;
-}
-
-////// Plugins Core /////////////////////////
-
-Plugin *plugin_open (const char *filename)
-{
- Plugin *plugin;
- Plugin_Info *info;
- Plugin_Event_Table *events;
- void **procs;
- int init_flag = 1;
-
- //printf ("loading %s\n", filename);
-
- // Check if the plugin has been loaded before
- plugin = plugin_head;
- while (plugin) {
- // returns handle to the already loaded plugin
- if (plugin->state && strcmpi(plugin->filename, filename) == 0) {
- //printf ("not loaded (duplicate) : %s\n", filename);
- return plugin;
- }
- plugin = plugin->next;
- }
-
- plugin = (Plugin *)aCalloc(1, sizeof(Plugin));
- plugin->state = -1; // not loaded
-
- plugin->dll = DLL_OPEN(filename);
- if (!plugin->dll) {
- //printf ("not loaded (invalid file) : %s\n", filename);
- plugin_unload(plugin);
- return NULL;
- }
-
- // Retrieve plugin information
- plugin->state = 0; // initialising
- DLL_SYM (info, plugin->dll, "plugin_info");
- // For high priority plugins (those that are explicitly loaded from the conf file)
- // we'll ignore them even (could be a 3rd party dll file)
- if ((!info && load_priority == 0) ||
- (info && ((atof(info->req_version) < atof(PLUGIN_VERSION)) || // plugin is based on older code
- (info->type != PLUGIN_ALL && info->type != PLUGIN_CORE && info->type != SERVER_TYPE) || // plugin is not for this server
- (info->type == PLUGIN_CORE && SERVER_TYPE != PLUGIN_LOGIN && SERVER_TYPE != PLUGIN_CHAR && SERVER_TYPE != PLUGIN_MAP))))
- {
- //printf ("not loaded (incompatible) : %s\n", filename);
- plugin_unload(plugin);
- return NULL;
- }
- plugin->info = (info) ? info : &default_info;
-
- plugin->filename = (char *) aMalloc (strlen(filename) + 1);
- strcpy(plugin->filename, filename);
-
- // Initialise plugin call table (For exporting procedures)
- DLL_SYM (procs, plugin->dll, "plugin_call_table");
- if (procs) *procs = plugin_call_table;
-
- // Register plugin events
- DLL_SYM (events, plugin->dll, "plugin_event_table");
- if (events) {
- int i = 0;
- while (events[i].func_name) {
- if (strcmpi(events[i].event_name, "Plugin_Test") == 0) {
- int (*test_func)(void);
- DLL_SYM (test_func, plugin->dll, events[i].func_name);
- if (test_func && test_func() == 0) {
- // plugin has failed test, disabling
- //printf ("disabled (failed test) : %s\n", filename);
- init_flag = 0;
- }
- } else {
- void (*func)(void);
- DLL_SYM (func, plugin->dll, events[i].func_name);
- if (func) register_plugin_event (func, events[i].event_name);
- }
- i++;
- }
- }
-
- plugin->next = plugin_head;
- plugin_head = plugin;
-
- plugin->state = init_flag; // fully loaded
- ShowStatus ("Done loading plugin '"CL_WHITE"%s"CL_RESET"'\n", (info) ? plugin->info->name : filename);
-
- return plugin;
-}
-
-void plugin_load (const char *filename)
-{
- plugin_open(filename);
-}
-
-void plugin_unload (Plugin *plugin)
-{
- if (plugin == NULL)
- return;
- if (plugin->filename) aFree(plugin->filename);
- if (plugin->dll) DLL_CLOSE(plugin->dll);
- aFree(plugin);
-}
-
-#ifdef _WIN32
-char *DLL_ERROR(void)
-{
- static char dllbuf[80];
- DWORD dw = GetLastError();
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, 0, dllbuf, 80, NULL);
- return dllbuf;
-}
-#endif
-
-////// Initialize/Finalize ////////////////////
-
-int plugins_config_read(const char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- ShowError("File not found: %s\n", cfgName);
- return 1;
- }
- while (fgets(line, 1020, fp)) {
- if(line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if (strcmpi(w1, "auto_search") == 0) {
- if(strcmpi(w2, "yes")==0)
- auto_search = 1;
- else if(strcmpi(w2, "no")==0)
- auto_search = 0;
- else auto_search = atoi(w2);
- } else if (strcmpi(w1, "plugin") == 0) {
- char filename[128];
- sprintf (filename, "plugins/%s%s", w2, DLL_EXT);
- plugin_load(filename);
- } else if (strcmpi(w1, "import") == 0)
- plugins_config_read(w2);
- }
- fclose(fp);
- return 0;
-}
-
-void plugins_init (void)
-{
- char *PLUGIN_CONF_FILENAME = "conf/plugin_athena.conf";
- register_plugin_func("Plugin_Init");
- register_plugin_func("Plugin_Final");
- register_plugin_func("Athena_Init");
- register_plugin_func("Athena_Final");
-
- // networking
- export_symbol (func_parse_table, 18);
- export_symbol (RFIFOSKIP, 17);
- export_symbol (WFIFOSET, 16);
- export_symbol (delete_session, 15);
- export_symbol (session, 14);
- export_symbol (&fd_max, 13);
- export_symbol (addr_, 12);
- // timers
- export_symbol (get_uptime, 11);
- export_symbol (delete_timer, 10);
- export_symbol (add_timer_func_list, 9);
- export_symbol (add_timer_interval, 8);
- export_symbol (add_timer, 7);
- export_symbol ((void *)get_svn_revision, 6);
- export_symbol (gettick, 5);
- // core
- export_symbol (&runflag, 4);
- export_symbol (arg_v, 3);
- export_symbol (&arg_c, 2);
- export_symbol (SERVER_NAME, 1);
- export_symbol (&SERVER_TYPE, 0);
-
- load_priority = 1;
- plugins_config_read (PLUGIN_CONF_FILENAME);
- load_priority = 0;
-
- if (auto_search)
- findfile("plugins", DLL_EXT, plugin_load);
-
- plugin_event_trigger("Plugin_Init");
-
- return;
-}
-
-void plugins_final (void)
-{
- Plugin *plugin = plugin_head, *plugin2;
- Plugin_Event_List *evl = event_head, *evl2;
- Plugin_Event *ev, *ev2;
-
- plugin_event_trigger("Plugin_Final");
-
- while (plugin) {
- plugin2 = plugin->next;
- plugin_unload(plugin);
- plugin = plugin2;
- }
-
- while (evl) {
- ev = evl->events;
- while (ev) {
- ev2 = ev->next;
- aFree(ev);
- ev = ev2;
- }
- evl2 = evl->next;
- aFree(evl->name);
- aFree(evl);
- evl = evl2;
- }
-
- aFree(plugin_call_table);
-
- return;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include "plugin.h"
+#include "plugins.h"
+#include "../common/mmo.h"
+#include "../common/core.h"
+#include "../common/timer.h"
+#include "../common/utils.h"
+#include "../common/socket.h"
+#include "../common/malloc.h"
+#include "../common/version.h"
+#include "../common/showmsg.h"
+
+//////////////////////////////////////////////
+
+typedef struct _Plugin_Event {
+ void (*func)(void);
+ struct _Plugin_Event *next;
+} Plugin_Event;
+
+typedef struct _Plugin_Event_List {
+ char *name;
+ struct _Plugin_Event_List *next;
+ struct _Plugin_Event *events;
+} Plugin_Event_List;
+
+static int auto_search = 1;
+static int load_priority = 0;
+Plugin_Event_List *event_head = NULL;
+Plugin *plugin_head = NULL;
+
+Plugin_Info default_info = { "Unknown", PLUGIN_ALL, "0", PLUGIN_VERSION, "Unknown" };
+
+static size_t call_table_size = 0;
+static size_t max_call_table = 0;
+
+////// Plugin Events Functions //////////////////
+
+int register_plugin_func (char *name)
+{
+ Plugin_Event_List *evl;
+ if (name) {
+ evl = (Plugin_Event_List *) aMalloc(sizeof(Plugin_Event_List));
+ evl->name = (char *) aMalloc (strlen(name) + 1);
+
+ evl->next = event_head;
+ strcpy(evl->name, name);
+ evl->events = NULL;
+ event_head = evl;
+ }
+ return 0;
+}
+
+Plugin_Event_List *search_plugin_func (char *name)
+{
+ Plugin_Event_List *evl = event_head;
+ while (evl) {
+ if (strcmpi(evl->name, name) == 0)
+ return evl;
+ evl = evl->next;
+ }
+ return NULL;
+}
+
+int register_plugin_event (void (*func)(void), char* name)
+{
+ Plugin_Event_List *evl = search_plugin_func(name);
+ if (!evl) {
+ // register event if it doesn't exist already
+ register_plugin_func(name);
+ // relocate the new event list
+ evl = search_plugin_func(name);
+ }
+ if (evl) {
+ Plugin_Event *ev;
+
+ ev = (Plugin_Event *) aMalloc(sizeof(Plugin_Event));
+ ev->func = func;
+ ev->next = NULL;
+
+ if (evl->events == NULL)
+ evl->events = ev;
+ else {
+ Plugin_Event *ev2 = evl->events;
+ while (ev2) {
+ if (ev2->next == NULL) {
+ ev2->next = ev;
+ break;
+ }
+ ev2 = ev2->next;
+ }
+ }
+ }
+ return 0;
+}
+
+int plugin_event_trigger (char *name)
+{
+ int c = 0;
+ Plugin_Event_List *evl = search_plugin_func(name);
+ if (evl) {
+ Plugin_Event *ev = evl->events;
+ while (ev) {
+ ev->func();
+ ev = ev->next;
+ c++;
+ }
+ }
+ return c;
+}
+
+////// Plugins Call Table Functions /////////
+
+int export_symbol (void *var, int offset)
+{
+ //printf ("0x%x\n", var);
+
+ // add to the end of the list
+ if (offset < 0)
+ offset = call_table_size;
+
+ // realloc if not large enough
+ if ((size_t)offset >= max_call_table) {
+ max_call_table = 1 + offset;
+ plugin_call_table = (void**)aRealloc(plugin_call_table, max_call_table*sizeof(void*));
+
+ // clear the new alloced block
+ malloc_tsetdword(plugin_call_table + call_table_size, 0, (max_call_table-call_table_size)*sizeof(void*));
+ }
+
+ // the new table size is delimited by the new element at the end
+ if ((size_t)offset >= call_table_size)
+ call_table_size = offset+1;
+
+ // put the pointer at the selected place
+ plugin_call_table[offset] = var;
+ return 0;
+}
+
+////// Plugins Core /////////////////////////
+
+Plugin *plugin_open (const char *filename)
+{
+ Plugin *plugin;
+ Plugin_Info *info;
+ Plugin_Event_Table *events;
+ void **procs;
+ int init_flag = 1;
+
+ //printf ("loading %s\n", filename);
+
+ // Check if the plugin has been loaded before
+ plugin = plugin_head;
+ while (plugin) {
+ // returns handle to the already loaded plugin
+ if (plugin->state && strcmpi(plugin->filename, filename) == 0) {
+ //printf ("not loaded (duplicate) : %s\n", filename);
+ return plugin;
+ }
+ plugin = plugin->next;
+ }
+
+ plugin = (Plugin *)aCalloc(1, sizeof(Plugin));
+ plugin->state = -1; // not loaded
+
+ plugin->dll = DLL_OPEN(filename);
+ if (!plugin->dll) {
+ //printf ("not loaded (invalid file) : %s\n", filename);
+ plugin_unload(plugin);
+ return NULL;
+ }
+
+ // Retrieve plugin information
+ plugin->state = 0; // initialising
+ DLL_SYM (info, plugin->dll, "plugin_info");
+ // For high priority plugins (those that are explicitly loaded from the conf file)
+ // we'll ignore them even (could be a 3rd party dll file)
+ if ((!info && load_priority == 0) ||
+ (info && ((atof(info->req_version) < atof(PLUGIN_VERSION)) || // plugin is based on older code
+ (info->type != PLUGIN_ALL && info->type != PLUGIN_CORE && info->type != SERVER_TYPE) || // plugin is not for this server
+ (info->type == PLUGIN_CORE && SERVER_TYPE != PLUGIN_LOGIN && SERVER_TYPE != PLUGIN_CHAR && SERVER_TYPE != PLUGIN_MAP))))
+ {
+ //printf ("not loaded (incompatible) : %s\n", filename);
+ plugin_unload(plugin);
+ return NULL;
+ }
+ plugin->info = (info) ? info : &default_info;
+
+ plugin->filename = (char *) aMalloc (strlen(filename) + 1);
+ strcpy(plugin->filename, filename);
+
+ // Initialise plugin call table (For exporting procedures)
+ DLL_SYM (procs, plugin->dll, "plugin_call_table");
+ if (procs) *procs = plugin_call_table;
+
+ // Register plugin events
+ DLL_SYM (events, plugin->dll, "plugin_event_table");
+ if (events) {
+ int i = 0;
+ while (events[i].func_name) {
+ if (strcmpi(events[i].event_name, "Plugin_Test") == 0) {
+ int (*test_func)(void);
+ DLL_SYM (test_func, plugin->dll, events[i].func_name);
+ if (test_func && test_func() == 0) {
+ // plugin has failed test, disabling
+ //printf ("disabled (failed test) : %s\n", filename);
+ init_flag = 0;
+ }
+ } else {
+ void (*func)(void);
+ DLL_SYM (func, plugin->dll, events[i].func_name);
+ if (func) register_plugin_event (func, events[i].event_name);
+ }
+ i++;
+ }
+ }
+
+ plugin->next = plugin_head;
+ plugin_head = plugin;
+
+ plugin->state = init_flag; // fully loaded
+ ShowStatus ("Done loading plugin '"CL_WHITE"%s"CL_RESET"'\n", (info) ? plugin->info->name : filename);
+
+ return plugin;
+}
+
+void plugin_load (const char *filename)
+{
+ plugin_open(filename);
+}
+
+void plugin_unload (Plugin *plugin)
+{
+ if (plugin == NULL)
+ return;
+ if (plugin->filename) aFree(plugin->filename);
+ if (plugin->dll) DLL_CLOSE(plugin->dll);
+ aFree(plugin);
+}
+
+#ifdef _WIN32
+char *DLL_ERROR(void)
+{
+ static char dllbuf[80];
+ DWORD dw = GetLastError();
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, 0, dllbuf, 80, NULL);
+ return dllbuf;
+}
+#endif
+
+////// Initialize/Finalize ////////////////////
+
+int plugins_config_read(const char *cfgName)
+{
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp = fopen(cfgName, "r");
+ if (fp == NULL) {
+ ShowError("File not found: %s\n", cfgName);
+ return 1;
+ }
+ while (fgets(line, 1020, fp)) {
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ if (strcmpi(w1, "auto_search") == 0) {
+ if(strcmpi(w2, "yes")==0)
+ auto_search = 1;
+ else if(strcmpi(w2, "no")==0)
+ auto_search = 0;
+ else auto_search = atoi(w2);
+ } else if (strcmpi(w1, "plugin") == 0) {
+ char filename[128];
+ sprintf (filename, "plugins/%s%s", w2, DLL_EXT);
+ plugin_load(filename);
+ } else if (strcmpi(w1, "import") == 0)
+ plugins_config_read(w2);
+ }
+ fclose(fp);
+ return 0;
+}
+
+void plugins_init (void)
+{
+ char *PLUGIN_CONF_FILENAME = "conf/plugin_athena.conf";
+ register_plugin_func("Plugin_Init");
+ register_plugin_func("Plugin_Final");
+ register_plugin_func("Athena_Init");
+ register_plugin_func("Athena_Final");
+
+ // networking
+ export_symbol (func_parse_table, 18);
+ export_symbol (RFIFOSKIP, 17);
+ export_symbol (WFIFOSET, 16);
+ export_symbol (delete_session, 15);
+ export_symbol (session, 14);
+ export_symbol (&fd_max, 13);
+ export_symbol (addr_, 12);
+ // timers
+ export_symbol (get_uptime, 11);
+ export_symbol (delete_timer, 10);
+ export_symbol (add_timer_func_list, 9);
+ export_symbol (add_timer_interval, 8);
+ export_symbol (add_timer, 7);
+ export_symbol ((void *)get_svn_revision, 6);
+ export_symbol (gettick, 5);
+ // core
+ export_symbol (&runflag, 4);
+ export_symbol (arg_v, 3);
+ export_symbol (&arg_c, 2);
+ export_symbol (SERVER_NAME, 1);
+ export_symbol (&SERVER_TYPE, 0);
+
+ load_priority = 1;
+ plugins_config_read (PLUGIN_CONF_FILENAME);
+ load_priority = 0;
+
+ if (auto_search)
+ findfile("plugins", DLL_EXT, plugin_load);
+
+ plugin_event_trigger("Plugin_Init");
+
+ return;
+}
+
+void plugins_final (void)
+{
+ Plugin *plugin = plugin_head, *plugin2;
+ Plugin_Event_List *evl = event_head, *evl2;
+ Plugin_Event *ev, *ev2;
+
+ plugin_event_trigger("Plugin_Final");
+
+ while (plugin) {
+ plugin2 = plugin->next;
+ plugin_unload(plugin);
+ plugin = plugin2;
+ }
+
+ while (evl) {
+ ev = evl->events;
+ while (ev) {
+ ev2 = ev->next;
+ aFree(ev);
+ ev = ev2;
+ }
+ evl2 = evl->next;
+ aFree(evl->name);
+ aFree(evl);
+ evl = evl2;
+ }
+
+ aFree(plugin_call_table);
+
+ return;
+}
diff --git a/src/common/plugins.h b/src/common/plugins.h
index d642b5965..34fd18a64 100644
--- a/src/common/plugins.h
+++ b/src/common/plugins.h
@@ -1,61 +1,61 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PLUGINS_H_
-#define _PLUGINS_H_
-
-////// Dynamic Link Library functions ///////////////
-
-#ifdef _WIN32
-
- #include <windows.h>
- #define DLL_OPEN(x) LoadLibrary(x)
- #define DLL_SYM(x,y,z) (FARPROC)(x) = GetProcAddress(y,z)
- #define DLL_CLOSE(x) FreeLibrary(x)
- #define DLL_EXT ".dll"
- #define DLL HINSTANCE
- char *DLL_ERROR(void);
-
-#else
-
- #include <dlfcn.h>
- #define DLL_OPEN(x) dlopen(x,RTLD_NOW)
- #define DLL_SYM(x,y,z) (x) = (void *)dlsym(y,z)
- #define DLL_CLOSE(x) dlclose(x)
- #define DLL_ERROR dlerror
-
- #ifdef CYGWIN
- #define DLL_EXT ".dll"
- #else
- #define DLL_EXT ".so"
- #endif
- #define DLL void *
-
-#endif
-
-////// Plugin Definitions ///////////////////
-
-typedef struct _Plugin {
- DLL dll;
- char state;
- char *filename;
- struct _Plugin_Info *info;
- struct _Plugin *next;
-} Plugin;
-
-/////////////////////////////////////////////
-
-int register_plugin_func (char *);
-int register_plugin_event (void (*)(void), char *);
-int plugin_event_trigger (char *);
-
-int export_symbol (void *, int);
-#define EXPORT_SYMBOL(s) export_symbol((s), -1);
-
-Plugin *plugin_open (const char *);
-void plugin_load (const char *);
-void plugin_unload (Plugin *);
-void plugins_init (void);
-void plugins_final (void);
-
-#endif // _PLUGINS_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _PLUGINS_H_
+#define _PLUGINS_H_
+
+////// Dynamic Link Library functions ///////////////
+
+#ifdef _WIN32
+
+ #include <windows.h>
+ #define DLL_OPEN(x) LoadLibrary(x)
+ #define DLL_SYM(x,y,z) (FARPROC)(x) = GetProcAddress(y,z)
+ #define DLL_CLOSE(x) FreeLibrary(x)
+ #define DLL_EXT ".dll"
+ #define DLL HINSTANCE
+ char *DLL_ERROR(void);
+
+#else
+
+ #include <dlfcn.h>
+ #define DLL_OPEN(x) dlopen(x,RTLD_NOW)
+ #define DLL_SYM(x,y,z) (x) = (void *)dlsym(y,z)
+ #define DLL_CLOSE(x) dlclose(x)
+ #define DLL_ERROR dlerror
+
+ #ifdef CYGWIN
+ #define DLL_EXT ".dll"
+ #else
+ #define DLL_EXT ".so"
+ #endif
+ #define DLL void *
+
+#endif
+
+////// Plugin Definitions ///////////////////
+
+typedef struct _Plugin {
+ DLL dll;
+ char state;
+ char *filename;
+ struct _Plugin_Info *info;
+ struct _Plugin *next;
+} Plugin;
+
+/////////////////////////////////////////////
+
+int register_plugin_func (char *);
+int register_plugin_event (void (*)(void), char *);
+int plugin_event_trigger (char *);
+
+int export_symbol (void *, int);
+#define EXPORT_SYMBOL(s) export_symbol((s), -1);
+
+Plugin *plugin_open (const char *);
+void plugin_load (const char *);
+void plugin_unload (Plugin *);
+void plugins_init (void);
+void plugins_final (void);
+
+#endif // _PLUGINS_H_
diff --git a/src/common/showmsg.c b/src/common/showmsg.c
index b0f1d1d8f..fd376f100 100644
--- a/src/common/showmsg.c
+++ b/src/common/showmsg.c
@@ -1,826 +1,826 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include <time.h>
-#include <stdlib.h> // atexit
-#include "../common/cbasetypes.h"
-#include "showmsg.h"
-
-#ifdef _WIN32
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
-
- #ifdef DEBUGLOGMAP
- #define DEBUGLOGPATH "log\\map-server.log"
- #else
- #ifdef DEBUGLOGCHAR
- #define DEBUGLOGPATH "log\\char-server.log"
- #else
- #ifdef DEBUGLOGLOGIN
- #define DEBUGLOGPATH "log\\login-server.log"
- #endif
- #endif
- #endif
-#else
- #include <unistd.h>
- #include <ctype.h>
-
- #ifdef DEBUGLOGMAP
- #define DEBUGLOGPATH "log/map-server.log"
- #else
- #ifdef DEBUGLOGCHAR
- #define DEBUGLOGPATH "log/char-server.log"
- #else
- #ifdef DEBUGLOGLOGIN
- #define DEBUGLOGPATH "log/login-server.log"
- #endif
- #endif
- #endif
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-/// behavioral parameter.
-/// when true, prints ansi sequences also when redirecting outputs to file
-/// otherwise remove them
-int stdout_with_ansisequence = 1;
-
-int msg_silent; //Specifies how silent the console is.
-
-///////////////////////////////////////////////////////////////////////////////
-/// small reallocating temporary printer buffer
-static char *tempbuf = NULL;
-static size_t sz = 0;
-#define tempbuf_size() (sz)
-static void tempbuf_free(void){ free(tempbuf); }
-static void tempbuf_alloc(void){ sz = 256; tempbuf = (char *)malloc(sz); atexit(tempbuf_free); }
-static void tempbuf_realloc(void){ sz <<= 1; tempbuf = (char *)realloc(tempbuf,sz); }
-
-///////////////////////////////////////////////////////////////////////////////
-#ifdef _WIN32
-// XXX adapted from eApp (comments are left untouched) [flaviojs]
-
-///////////////////////////////////////////////////////////////////////////////
-// ansi compatible printf with control sequence parser for windows
-// fast hack, handle with care, not everything implemented
-//
-// \033[#;...;#m - Set Graphics Rendition (SGR)
-//
-// printf("\x1b[1;31;40m"); // Bright red on black
-// printf("\x1b[3;33;45m"); // Blinking yellow on magenta (blink not implemented)
-// printf("\x1b[1;30;47m"); // Bright black (grey) on dim white
-//
-// Style Foreground Background
-// 1st Digit 2nd Digit 3rd Digit RGB
-// 0 - Reset 30 - Black 40 - Black 000
-// 1 - FG Bright 31 - Red 41 - Red 100
-// 2 - Unknown 32 - Green 42 - Green 010
-// 3 - Blink 33 - Yellow 43 - Yellow 110
-// 4 - Underline 34 - Blue 44 - Blue 001
-// 5 - BG Bright 35 - Magenta 45 - Magenta 101
-// 6 - Unknown 36 - Cyan 46 - Cyan 011
-// 7 - Reverse 37 - White 47 - White 111
-// 8 - Concealed (invisible)
-//
-// \033[#A - Cursor Up (CUU)
-// Moves the cursor up by the specified number of lines without changing columns.
-// If the cursor is already on the top line, this sequence is ignored. \e[A is equivalent to \e[1A.
-//
-// \033[#B - Cursor Down (CUD)
-// Moves the cursor down by the specified number of lines without changing columns.
-// If the cursor is already on the bottom line, this sequence is ignored. \e[B is equivalent to \e[1B.
-//
-// \033[#C - Cursor Forward (CUF)
-// Moves the cursor forward by the specified number of columns without changing lines.
-// If the cursor is already in the rightmost column, this sequence is ignored. \e[C is equivalent to \e[1C.
-//
-// \033[#D - Cursor Backward (CUB)
-// Moves the cursor back by the specified number of columns without changing lines.
-// If the cursor is already in the leftmost column, this sequence is ignored. \e[D is equivalent to \e[1D.
-//
-// \033[#E - Cursor Next Line (CNL)
-// Moves the cursor down the indicated # of rows, to column 1. \e[E is equivalent to \e[1E.
-//
-// \033[#F - Cursor Preceding Line (CPL)
-// Moves the cursor up the indicated # of rows, to column 1. \e[F is equivalent to \e[1F.
-//
-// \033[#G - Cursor Horizontal Absolute (CHA)
-// Moves the cursor to indicated column in current row. \e[G is equivalent to \e[1G.
-//
-// \033[#;#H - Cursor Position (CUP)
-// Moves the cursor to the specified position. The first # specifies the line number,
-// the second # specifies the column. If you do not specify a position, the cursor moves to the home position:
-// the upper-left corner of the screen (line 1, column 1).
-//
-// \033[#;#f - Horizontal & Vertical Position
-// (same as \033[#;#H)
-//
-// \033[s - Save Cursor Position (SCP)
-// The current cursor position is saved.
-//
-// \033[u - Restore cursor position (RCP)
-// Restores the cursor position saved with the (SCP) sequence \033[s.
-// (addition, restore to 0,0 if nothinh was saved before)
-//
-
-// \033[#J - Erase Display (ED)
-// Clears the screen and moves to the home position
-// \033[0J - Clears the screen from cursor to end of display. The cursor position is unchanged. (default)
-// \033[1J - Clears the screen from start to cursor. The cursor position is unchanged.
-// \033[2J - Clears the screen and moves the cursor to the home position (line 1, column 1).
-//
-// \033[#K - Erase Line (EL)
-// Clears the current line from the cursor position
-// \033[0K - Clears all characters from the cursor position to the end of the line (including the character at the cursor position). The cursor position is unchanged. (default)
-// \033[1K - Clears all characters from start of line to the cursor position. (including the character at the cursor position). The cursor position is unchanged.
-// \033[2K - Clears all characters of the whole line. The cursor position is unchanged.
-
-
-/*
-not implemented
-
-\033[#L
-IL: Insert Lines: The cursor line and all lines below it move down # lines, leaving blank space. The cursor position is unchanged. The bottommost # lines are lost. \e[L is equivalent to \e[1L.
-\033[#M
-DL: Delete Line: The block of # lines at and below the cursor are deleted; all lines below them move up # lines to fill in the gap, leaving # blank lines at the bottom of the screen. The cursor position is unchanged. \e[M is equivalent to \e[1M.
-\033[#\@
-ICH: Insert CHaracter: The cursor character and all characters to the right of it move right # columns, leaving behind blank space. The cursor position is unchanged. The rightmost # characters on the line are lost. \e[\@ is equivalent to \e[1\@.
-\033[#P
-DCH: Delete CHaracter: The block of # characters at and to the right of the cursor are deleted; all characters to the right of it move left # columns, leaving behind blank space. The cursor position is unchanged. \e[P is equivalent to \e[1P.
-
-Escape sequences for Select Character Set
-*/
-
-#define is_console(handle) (FILE_TYPE_CHAR==GetFileType(handle))
-
-///////////////////////////////////////////////////////////////////////////////
-int VFPRINTF(HANDLE handle, const char *fmt, va_list argptr)
-{
- /////////////////////////////////////////////////////////////////
- /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
- static COORD saveposition = {0,0};
- */
-
- /////////////////////////////////////////////////////////////////
- unsigned long written;
- char *p, *q;
-
- if(!fmt || !*fmt)
- return 0;
-
- if(tempbuf == NULL)
- tempbuf_alloc();
- for(; vsnprintf(tempbuf, tempbuf_size(), fmt, argptr)<0; tempbuf_realloc());
- // vsnprintf returns -1 in case of insufficient buffer size
- // tempbuf_realloc doubles the size of the buffer in this case
-
- if( !is_console(handle) && stdout_with_ansisequence )
- {
- WriteFile(handle,tempbuf, strlen(tempbuf), &written, 0);
- return 0;
- }
-
- // start with processing
- p = tempbuf;
- while ((q = strchr(p, 0x1b)) != NULL)
- { // find the escape character
- if( 0==WriteConsole(handle, p, q-p, &written, 0) ) // write up to the escape
- WriteFile(handle, p, q-p, &written, 0);
-
- if( q[1]!='[' )
- { // write the escape char (whatever purpose it has)
- if(0==WriteConsole(handle, q, 1, &written, 0) )
- WriteFile(handle,q, 1, &written, 0);
- p=q+1; //and start searching again
- }
- else
- { // from here, we will skip the '\033['
- // we break at the first unprocessible position
- // assuming regular text is starting there
- uchar numbers[16], numpoint=0;
- CONSOLE_SCREEN_BUFFER_INFO info;
-
- // initialize
- GetConsoleScreenBufferInfo(handle, &info);
- memset(numbers,0,sizeof(numbers));
-
- // skip escape and bracket
- q=q+2;
- while(1)
- {
- if( isdigit((int)((unsigned char)*q)) )
- { // add number to number array, only accept 2digits, shift out the rest
- // so // \033[123456789m will become \033[89m
- numbers[numpoint] = (numbers[numpoint]<<4) | (*q-'0');
- ++q;
- // and next character
- continue;
- }
- else if( *q == ';' )
- { // delimiter
- if(numpoint<sizeof(numbers)/sizeof(*numbers))
- { // go to next array position
- numpoint++;
- }
- else
- { // array is full, so we 'forget' the first value
- memmove(numbers,numbers+1,sizeof(numbers)/sizeof(*numbers)-1);
- numbers[sizeof(numbers)/sizeof(*numbers)-1]=0;
- }
- ++q;
- // and next number
- continue;
- }
- else if( *q == 'm' )
- { // \033[#;...;#m - Set Graphics Rendition (SGR)
- uint i;
- for(i=0; i<= numpoint; ++i)
- {
- if( 0x00 == (0xF0 & numbers[i]) )
- { // upper nibble 0
- if( 0 == numbers[i] )
- { // reset
- info.wAttributes = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
- }
- else if( 1==numbers[i] )
- { // set foreground intensity
- info.wAttributes |= FOREGROUND_INTENSITY;
- }
- else if( 5==numbers[i] )
- { // set background intensity
- info.wAttributes |= BACKGROUND_INTENSITY;
- }
- else if( 7==numbers[i] )
- { // reverse colors (just xor them)
- info.wAttributes ^= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
- BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
- }
- //case '2': // not existing
- //case '3': // blinking (not implemented)
- //case '4': // unterline (not implemented)
- //case '6': // not existing
- //case '8': // concealed (not implemented)
- //case '9': // not existing
- }
- else if( 0x20 == (0xF0 & numbers[i]) )
- { // off
-
- if( 1==numbers[i] )
- { // set foreground intensity off
- info.wAttributes &= ~FOREGROUND_INTENSITY;
- }
- else if( 5==numbers[i] )
- { // set background intensity off
- info.wAttributes &= ~BACKGROUND_INTENSITY;
- }
- else if( 7==numbers[i] )
- { // reverse colors (just xor them)
- info.wAttributes ^= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
- BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
- }
- }
- else if( 0x30 == (0xF0 & numbers[i]) )
- { // foreground
- uint num = numbers[i]&0x0F;
- if(num==9) info.wAttributes |= FOREGROUND_INTENSITY;
- if(num>7) num=7; // set white for 37, 38 and 39
- info.wAttributes &= ~(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
- if( (num & 0x01)>0 ) // lowest bit set = red
- info.wAttributes |= FOREGROUND_RED;
- if( (num & 0x02)>0 ) // second bit set = green
- info.wAttributes |= FOREGROUND_GREEN;
- if( (num & 0x04)>0 ) // third bit set = blue
- info.wAttributes |= FOREGROUND_BLUE;
- }
- else if( 0x40 == (0xF0 & numbers[i]) )
- { // background
- uint num = numbers[i]&0x0F;
- if(num==9) info.wAttributes |= BACKGROUND_INTENSITY;
- if(num>7) num=7; // set white for 47, 48 and 49
- info.wAttributes &= ~(BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
- if( (num & 0x01)>0 ) // lowest bit set = red
- info.wAttributes |= BACKGROUND_RED;
- if( (num & 0x02)>0 ) // second bit set = green
- info.wAttributes |= BACKGROUND_GREEN;
- if( (num & 0x04)>0 ) // third bit set = blue
- info.wAttributes |= BACKGROUND_BLUE;
- }
- }
- // set the attributes
- SetConsoleTextAttribute(handle, info.wAttributes);
- }
- else if( *q=='J' )
- { // \033[#J - Erase Display (ED)
- // \033[0J - Clears the screen from cursor to end of display. The cursor position is unchanged.
- // \033[1J - Clears the screen from start to cursor. The cursor position is unchanged.
- // \033[2J - Clears the screen and moves the cursor to the home position (line 1, column 1).
- uint num = (numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F);
- int cnt;
- COORD origin = {0,0};
- if(num==1)
- { // chars from start up to and including cursor
- cnt = info.dwSize.X * info.dwCursorPosition.Y + info.dwCursorPosition.X + 1;
- }
- else if(num==2)
- { // Number of chars on screen.
- cnt = info.dwSize.X * info.dwSize.Y;
- SetConsoleCursorPosition(handle, origin);
- }
- else// 0 and default
- { // number of chars from cursor to end
- origin = info.dwCursorPosition;
- cnt = info.dwSize.X * (info.dwSize.Y - info.dwCursorPosition.Y) - info.dwCursorPosition.X;
- }
- FillConsoleOutputAttribute(handle,info.wAttributes,cnt,origin,NULL);
- FillConsoleOutputCharacter(handle,' ', cnt,origin,NULL);
- }
- else if( *q=='K' )
- { // \033[K : clear line from actual position to end of the line
- // \033[0K - Clears all characters from the cursor position to the end of the line.
- // \033[1K - Clears all characters from start of line to the cursor position.
- // \033[2K - Clears all characters of the whole line.
-
- uint num = (numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F);
- COORD origin = {0,info.dwCursorPosition.Y};
- SHORT cnt;
- if(num==1)
- {
- cnt = info.dwCursorPosition.X + 1;
- }
- else if(num==2)
- {
- cnt = info.dwSize.X;
- }
- else// 0 and default
- {
- origin = info.dwCursorPosition;
- cnt = info.dwSize.X - info.dwCursorPosition.X; // how many spaces until line is full
- }
- FillConsoleOutputAttribute(handle, info.wAttributes, cnt, origin, NULL);
- FillConsoleOutputCharacter(handle, ' ', cnt, origin, NULL);
- }
- else if( *q == 'H' || *q == 'f' )
- { // \033[#;#H - Cursor Position (CUP)
- // \033[#;#f - Horizontal & Vertical Position
- // The first # specifies the line number, the second # specifies the column.
- // The default for both is 1
- info.dwCursorPosition.X = (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F-1):0;
- info.dwCursorPosition.Y = (numpoint && numbers[numpoint-1])?(numbers[numpoint-1]>>4)*10+(numbers[numpoint-1]&0x0F-1):0;
-
- if( info.dwCursorPosition.X >= info.dwSize.X ) info.dwCursorPosition.Y = info.dwSize.X-1;
- if( info.dwCursorPosition.Y >= info.dwSize.Y ) info.dwCursorPosition.Y = info.dwSize.Y-1;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q=='s' )
- { // \033[s - Save Cursor Position (SCP)
- /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
- CONSOLE_SCREEN_BUFFER_INFO info;
- GetConsoleScreenBufferInfo(handle, &info);
- saveposition = info.dwCursorPosition;
- */
- }
- else if( *q=='u' )
- { // \033[u - Restore cursor position (RCP)
- /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
- SetConsoleCursorPosition(handle, saveposition);
- */
- }
- else if( *q == 'A' )
- { // \033[#A - Cursor Up (CUU)
- // Moves the cursor UP # number of lines
- info.dwCursorPosition.Y -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
-
- if( info.dwCursorPosition.Y < 0 )
- info.dwCursorPosition.Y = 0;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'B' )
- { // \033[#B - Cursor Down (CUD)
- // Moves the cursor DOWN # number of lines
- info.dwCursorPosition.Y += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
-
- if( info.dwCursorPosition.Y >= info.dwSize.Y )
- info.dwCursorPosition.Y = info.dwSize.Y-1;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'C' )
- { // \033[#C - Cursor Forward (CUF)
- // Moves the cursor RIGHT # number of columns
- info.dwCursorPosition.X += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
-
- if( info.dwCursorPosition.X >= info.dwSize.X )
- info.dwCursorPosition.X = info.dwSize.X-1;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'D' )
- { // \033[#D - Cursor Backward (CUB)
- // Moves the cursor LEFT # number of columns
- info.dwCursorPosition.X -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
-
- if( info.dwCursorPosition.X < 0 )
- info.dwCursorPosition.X = 0;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'E' )
- { // \033[#E - Cursor Next Line (CNL)
- // Moves the cursor down the indicated # of rows, to column 1
- info.dwCursorPosition.Y += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
- info.dwCursorPosition.X = 0;
-
- if( info.dwCursorPosition.Y >= info.dwSize.Y )
- info.dwCursorPosition.Y = info.dwSize.Y-1;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'F' )
- { // \033[#F - Cursor Preceding Line (CPL)
- // Moves the cursor up the indicated # of rows, to column 1.
- info.dwCursorPosition.Y -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
- info.dwCursorPosition.X = 0;
-
- if( info.dwCursorPosition.Y < 0 )
- info.dwCursorPosition.Y = 0;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'G' )
- { // \033[#G - Cursor Horizontal Absolute (CHA)
- // Moves the cursor to indicated column in current row.
- info.dwCursorPosition.X = (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F-1):0;
-
- if( info.dwCursorPosition.X >= info.dwSize.X )
- info.dwCursorPosition.X = info.dwSize.X-1;
- SetConsoleCursorPosition(handle, info.dwCursorPosition);
- }
- else if( *q == 'L' || *q == 'M' || *q == '@' || *q == 'P')
- { // not implemented, just skip
- }
- else
- { // no number nor valid sequencer
- // something is fishy, we break and give the current char free
- --q;
- }
- // skip the sequencer and search again
- p = q+1;
- break;
- }// end while
- }
- }
- if (*p) // write the rest of the buffer
- if( 0==WriteConsole(handle, p, strlen(p), &written, 0) )
- WriteFile(handle,p, strlen(p), &written, 0);
- return 0;
-}
-
-int FPRINTF(HANDLE handle, const char *fmt, ...)
-{
- int ret;
- va_list argptr;
- va_start(argptr, fmt);
- ret = VFPRINTF(handle,fmt,argptr);
- va_end(argptr);
- return ret;
-}
-
-#define FFLUSH(handle)
-
-#define STDOUT GetStdHandle(STD_OUTPUT_HANDLE)
-#define STDERR GetStdHandle(STD_ERROR_HANDLE)
-
-#else // not _WIN32
-
-
-//#define VPRINTF vprintf
-//#define PRINTF printf
-
-#define is_console(file) (0!=isatty(fileno(file)))
-
-//vprintf_without_ansiformats
-int VFPRINTF(FILE *file, const char *fmt, va_list argptr)
-{
- char *p, *q;
-
- if(!fmt || !*fmt)
- return 0;
-
- if( is_console(file) || stdout_with_ansisequence )
- {
- vfprintf(file, fmt, argptr);
- return 0;
- }
-
- if(tempbuf == NULL)
- tempbuf_alloc();
- for(; vsnprintf(tempbuf, tempbuf_size(), fmt, argptr)<0; tempbuf_realloc());
- // vsnprintf returns -1 in case of insufficient buffer size
- // tempbuf.realloc doubles the size of the buffer in this case
-
- // start with processing
- p = tempbuf;
- while ((q = strchr(p, 0x1b)) != NULL)
- { // find the escape character
- fprintf(file, "%.*s", (int)(q-p), p); // write up to the escape
- if( q[1]!='[' )
- { // write the escape char (whatever purpose it has)
- fprintf(file, "%.*s", 1, q);
- p=q+1; //and start searching again
- }
- else
- { // from here, we will skip the '\033['
- // we break at the first unprocessible position
- // assuming regular text is starting there
-
- // skip escape and bracket
- q=q+2;
- while(1)
- {
- if( isdigit((int)((unsigned char)*q)) )
- {
- ++q;
- // and next character
- continue;
- }
- else if( *q == ';' )
- { // delimiter
- ++q;
- // and next number
- continue;
- }
- else if( *q == 'm' )
- { // \033[#;...;#m - Set Graphics Rendition (SGR)
- // set the attributes
- }
- else if( *q=='J' )
- { // \033[#J - Erase Display (ED)
- }
- else if( *q=='K' )
- { // \033[K : clear line from actual position to end of the line
- }
- else if( *q == 'H' || *q == 'f' )
- { // \033[#;#H - Cursor Position (CUP)
- // \033[#;#f - Horizontal & Vertical Position
- }
- else if( *q=='s' )
- { // \033[s - Save Cursor Position (SCP)
- }
- else if( *q=='u' )
- { // \033[u - Restore cursor position (RCP)
- }
- else if( *q == 'A' )
- { // \033[#A - Cursor Up (CUU)
- // Moves the cursor UP # number of lines
- }
- else if( *q == 'B' )
- { // \033[#B - Cursor Down (CUD)
- // Moves the cursor DOWN # number of lines
- }
- else if( *q == 'C' )
- { // \033[#C - Cursor Forward (CUF)
- // Moves the cursor RIGHT # number of columns
- }
- else if( *q == 'D' )
- { // \033[#D - Cursor Backward (CUB)
- // Moves the cursor LEFT # number of columns
- }
- else if( *q == 'E' )
- { // \033[#E - Cursor Next Line (CNL)
- // Moves the cursor down the indicated # of rows, to column 1
- }
- else if( *q == 'F' )
- { // \033[#F - Cursor Preceding Line (CPL)
- // Moves the cursor up the indicated # of rows, to column 1.
- }
- else if( *q == 'G' )
- { // \033[#G - Cursor Horizontal Absolute (CHA)
- // Moves the cursor to indicated column in current row.
- }
- else if( *q == 'L' || *q == 'M' || *q == '@' || *q == 'P')
- { // not implemented, just skip
- }
- else
- { // no number nor valid sequencer
- // something is fishy, we break and give the current char free
- --q;
- }
- // skip the sequencer and search again
- p = q+1;
- break;
- }// end while
- }
- }
- if (*p) // write the rest of the buffer
- fprintf(file, "%s", p);
- return 0;
-}
-int FPRINTF(FILE *file, const char *fmt, ...)
-{
- int ret;
- va_list argptr;
- va_start(argptr, fmt);
- ret = VFPRINTF(file,fmt,argptr);
- va_end(argptr);
- return ret;
-}
-
-#define FFLUSH fflush
-
-#define STDOUT stdout
-#define STDERR stderr
-
-#endif// not _WIN32
-
-
-
-
-
-
-
-
-
-
-char timestamp_format[20] = ""; //For displaying Timestamps
-
-// by MC Cameri
-int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
-{
- // _ShowMessage MUST be used instead of printf as of 10/24/2004.
- // Return: 0 = Successful, 1 = Failed.
-// int ret = 0;
- char prefix[100];
-#if defined(DEBUGLOGMAP) || defined(DEBUGLOGCHAR) || defined(DEBUGLOGLOGIN)
- FILE *fp;
-#endif
-
- if (!string || *string == '\0') {
- ShowError("Empty string passed to _vShowMessage().\n");
- return 1;
- }
- if ((flag == MSG_DEBUG && !SHOW_DEBUG_MSG) ||
- (flag == MSG_INFORMATION && msg_silent&1) ||
- (flag == MSG_STATUS && msg_silent&2) ||
- (flag == MSG_NOTICE && msg_silent&4) ||
- (flag == MSG_WARNING && msg_silent&8) ||
- (flag == MSG_ERROR && msg_silent&16) ||
- (flag == MSG_SQL && msg_silent&16))
- return 0; //Do not print it.
-
- if (timestamp_format[0])
- { //Display time format. [Skotlex]
- time_t t = time(NULL);
- strftime(prefix, 80, timestamp_format, localtime(&t));
- } else prefix[0]='\0';
-
- switch (flag) {
- case MSG_NONE: // direct printf replacement
- break;
- case MSG_STATUS: //Bright Green (To inform about good things)
- strcat(prefix,CL_GREEN"[Status]"CL_RESET":");
- break;
- case MSG_SQL: //Bright Violet (For dumping out anything related with SQL) <- Actually, this is mostly used for SQL errors with the database, as successes can as well just be anything else... [Skotlex]
- strcat(prefix,CL_MAGENTA"[SQL]"CL_RESET":");
- break;
- case MSG_INFORMATION: //Bright White (Variable information)
- strcat(prefix,CL_WHITE"[Info]"CL_RESET":");
- break;
- case MSG_NOTICE: //Bright White (Less than a warning)
- strcat(prefix,CL_WHITE"[Notice]"CL_RESET":");
- break;
- case MSG_WARNING: //Bright Yellow
- strcat(prefix,CL_YELLOW"[Warning]"CL_RESET":");
- break;
- case MSG_DEBUG: //Bright Cyan, important stuff!
- strcat(prefix,CL_CYAN"[Debug]"CL_RESET":");
- break;
- case MSG_ERROR: //Bright Red (Regular errors)
- strcat(prefix,CL_RED"[Error]"CL_RESET":");
- break;
- case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible)
- strcat(prefix,CL_RED"[Fatal Error]"CL_RESET":");
- break;
- default:
- ShowError("In function _vShowMessage() -> Invalid flag passed.\n");
- return 1;
- }
-
- if (flag == MSG_ERROR || flag == MSG_FATALERROR || flag == MSG_SQL)
- { //Send Errors to StdErr [Skotlex]
- FPRINTF(STDERR, "%s ", prefix);
- VFPRINTF(STDERR, string, ap);
- FFLUSH(STDERR);
- } else {
- if (flag != MSG_NONE)
- FPRINTF(STDOUT, "%s ", prefix);
- VFPRINTF(STDOUT, string, ap);
- FFLUSH(STDOUT);
- }
-
-#if defined(DEBUGLOGMAP) || defined(DEBUGLOGCHAR) || defined(DEBUGLOGLOGIN)
- if(strlen(DEBUGLOGPATH) > 0) {
- fp=fopen(DEBUGLOGPATH,"a");
- if (fp == NULL) {
- FPRINTF(STDERR, CL_RED"[ERROR]"CL_RESET": Could not open '"CL_WHITE"%s"CL_RESET"', access denied.\n", DEBUGLOGPATH);
- FFLUSH(STDERR);
- } else {
- fprintf(fp,"%s ", prefix);
- vfprintf(fp,string,ap);
- fclose(fp);
- }
- } else {
- FPRINTF(STDERR, CL_RED"[ERROR]"CL_RESET": DEBUGLOGPATH not defined!\n");
- FFLUSH(STDERR);
- }
-#endif
-
- va_end(ap);
- return 0;
-}
-
-void ClearScreen(void)
-{
-#ifndef _WIN32
- ShowMessage(CL_CLS); // to prevent empty string passed messages
-#endif
-}
-int _ShowMessage(enum msg_type flag, const char *string, ...)
-{
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(flag, string, ap);
- va_end(ap);
- return ret;
-}
-
-// direct printf replacement
-int ShowMessage(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_NONE, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowStatus(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_STATUS, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowSQL(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_SQL, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowInfo(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_INFORMATION, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowNotice(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_NOTICE, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowWarning(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_WARNING, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowDebug(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_DEBUG, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowError(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_ERROR, string, ap);
- va_end(ap);
- return ret;
-}
-int ShowFatalError(const char *string, ...) {
- int ret;
- va_list ap;
- va_start(ap, string);
- ret = _vShowMessage(MSG_FATALERROR, string, ap);
- va_end(ap);
- return ret;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+#include <stdlib.h> // atexit
+#include "../common/cbasetypes.h"
+#include "showmsg.h"
+
+#ifdef _WIN32
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+
+ #ifdef DEBUGLOGMAP
+ #define DEBUGLOGPATH "log\\map-server.log"
+ #else
+ #ifdef DEBUGLOGCHAR
+ #define DEBUGLOGPATH "log\\char-server.log"
+ #else
+ #ifdef DEBUGLOGLOGIN
+ #define DEBUGLOGPATH "log\\login-server.log"
+ #endif
+ #endif
+ #endif
+#else
+ #include <unistd.h>
+ #include <ctype.h>
+
+ #ifdef DEBUGLOGMAP
+ #define DEBUGLOGPATH "log/map-server.log"
+ #else
+ #ifdef DEBUGLOGCHAR
+ #define DEBUGLOGPATH "log/char-server.log"
+ #else
+ #ifdef DEBUGLOGLOGIN
+ #define DEBUGLOGPATH "log/login-server.log"
+ #endif
+ #endif
+ #endif
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+/// behavioral parameter.
+/// when true, prints ansi sequences also when redirecting outputs to file
+/// otherwise remove them
+int stdout_with_ansisequence = 1;
+
+int msg_silent; //Specifies how silent the console is.
+
+///////////////////////////////////////////////////////////////////////////////
+/// small reallocating temporary printer buffer
+static char *tempbuf = NULL;
+static size_t sz = 0;
+#define tempbuf_size() (sz)
+static void tempbuf_free(void){ free(tempbuf); }
+static void tempbuf_alloc(void){ sz = 256; tempbuf = (char *)malloc(sz); atexit(tempbuf_free); }
+static void tempbuf_realloc(void){ sz <<= 1; tempbuf = (char *)realloc(tempbuf,sz); }
+
+///////////////////////////////////////////////////////////////////////////////
+#ifdef _WIN32
+// XXX adapted from eApp (comments are left untouched) [flaviojs]
+
+///////////////////////////////////////////////////////////////////////////////
+// ansi compatible printf with control sequence parser for windows
+// fast hack, handle with care, not everything implemented
+//
+// \033[#;...;#m - Set Graphics Rendition (SGR)
+//
+// printf("\x1b[1;31;40m"); // Bright red on black
+// printf("\x1b[3;33;45m"); // Blinking yellow on magenta (blink not implemented)
+// printf("\x1b[1;30;47m"); // Bright black (grey) on dim white
+//
+// Style Foreground Background
+// 1st Digit 2nd Digit 3rd Digit RGB
+// 0 - Reset 30 - Black 40 - Black 000
+// 1 - FG Bright 31 - Red 41 - Red 100
+// 2 - Unknown 32 - Green 42 - Green 010
+// 3 - Blink 33 - Yellow 43 - Yellow 110
+// 4 - Underline 34 - Blue 44 - Blue 001
+// 5 - BG Bright 35 - Magenta 45 - Magenta 101
+// 6 - Unknown 36 - Cyan 46 - Cyan 011
+// 7 - Reverse 37 - White 47 - White 111
+// 8 - Concealed (invisible)
+//
+// \033[#A - Cursor Up (CUU)
+// Moves the cursor up by the specified number of lines without changing columns.
+// If the cursor is already on the top line, this sequence is ignored. \e[A is equivalent to \e[1A.
+//
+// \033[#B - Cursor Down (CUD)
+// Moves the cursor down by the specified number of lines without changing columns.
+// If the cursor is already on the bottom line, this sequence is ignored. \e[B is equivalent to \e[1B.
+//
+// \033[#C - Cursor Forward (CUF)
+// Moves the cursor forward by the specified number of columns without changing lines.
+// If the cursor is already in the rightmost column, this sequence is ignored. \e[C is equivalent to \e[1C.
+//
+// \033[#D - Cursor Backward (CUB)
+// Moves the cursor back by the specified number of columns without changing lines.
+// If the cursor is already in the leftmost column, this sequence is ignored. \e[D is equivalent to \e[1D.
+//
+// \033[#E - Cursor Next Line (CNL)
+// Moves the cursor down the indicated # of rows, to column 1. \e[E is equivalent to \e[1E.
+//
+// \033[#F - Cursor Preceding Line (CPL)
+// Moves the cursor up the indicated # of rows, to column 1. \e[F is equivalent to \e[1F.
+//
+// \033[#G - Cursor Horizontal Absolute (CHA)
+// Moves the cursor to indicated column in current row. \e[G is equivalent to \e[1G.
+//
+// \033[#;#H - Cursor Position (CUP)
+// Moves the cursor to the specified position. The first # specifies the line number,
+// the second # specifies the column. If you do not specify a position, the cursor moves to the home position:
+// the upper-left corner of the screen (line 1, column 1).
+//
+// \033[#;#f - Horizontal & Vertical Position
+// (same as \033[#;#H)
+//
+// \033[s - Save Cursor Position (SCP)
+// The current cursor position is saved.
+//
+// \033[u - Restore cursor position (RCP)
+// Restores the cursor position saved with the (SCP) sequence \033[s.
+// (addition, restore to 0,0 if nothinh was saved before)
+//
+
+// \033[#J - Erase Display (ED)
+// Clears the screen and moves to the home position
+// \033[0J - Clears the screen from cursor to end of display. The cursor position is unchanged. (default)
+// \033[1J - Clears the screen from start to cursor. The cursor position is unchanged.
+// \033[2J - Clears the screen and moves the cursor to the home position (line 1, column 1).
+//
+// \033[#K - Erase Line (EL)
+// Clears the current line from the cursor position
+// \033[0K - Clears all characters from the cursor position to the end of the line (including the character at the cursor position). The cursor position is unchanged. (default)
+// \033[1K - Clears all characters from start of line to the cursor position. (including the character at the cursor position). The cursor position is unchanged.
+// \033[2K - Clears all characters of the whole line. The cursor position is unchanged.
+
+
+/*
+not implemented
+
+\033[#L
+IL: Insert Lines: The cursor line and all lines below it move down # lines, leaving blank space. The cursor position is unchanged. The bottommost # lines are lost. \e[L is equivalent to \e[1L.
+\033[#M
+DL: Delete Line: The block of # lines at and below the cursor are deleted; all lines below them move up # lines to fill in the gap, leaving # blank lines at the bottom of the screen. The cursor position is unchanged. \e[M is equivalent to \e[1M.
+\033[#\@
+ICH: Insert CHaracter: The cursor character and all characters to the right of it move right # columns, leaving behind blank space. The cursor position is unchanged. The rightmost # characters on the line are lost. \e[\@ is equivalent to \e[1\@.
+\033[#P
+DCH: Delete CHaracter: The block of # characters at and to the right of the cursor are deleted; all characters to the right of it move left # columns, leaving behind blank space. The cursor position is unchanged. \e[P is equivalent to \e[1P.
+
+Escape sequences for Select Character Set
+*/
+
+#define is_console(handle) (FILE_TYPE_CHAR==GetFileType(handle))
+
+///////////////////////////////////////////////////////////////////////////////
+int VFPRINTF(HANDLE handle, const char *fmt, va_list argptr)
+{
+ /////////////////////////////////////////////////////////////////
+ /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
+ static COORD saveposition = {0,0};
+ */
+
+ /////////////////////////////////////////////////////////////////
+ unsigned long written;
+ char *p, *q;
+
+ if(!fmt || !*fmt)
+ return 0;
+
+ if(tempbuf == NULL)
+ tempbuf_alloc();
+ for(; vsnprintf(tempbuf, tempbuf_size(), fmt, argptr)<0; tempbuf_realloc());
+ // vsnprintf returns -1 in case of insufficient buffer size
+ // tempbuf_realloc doubles the size of the buffer in this case
+
+ if( !is_console(handle) && stdout_with_ansisequence )
+ {
+ WriteFile(handle,tempbuf, strlen(tempbuf), &written, 0);
+ return 0;
+ }
+
+ // start with processing
+ p = tempbuf;
+ while ((q = strchr(p, 0x1b)) != NULL)
+ { // find the escape character
+ if( 0==WriteConsole(handle, p, q-p, &written, 0) ) // write up to the escape
+ WriteFile(handle, p, q-p, &written, 0);
+
+ if( q[1]!='[' )
+ { // write the escape char (whatever purpose it has)
+ if(0==WriteConsole(handle, q, 1, &written, 0) )
+ WriteFile(handle,q, 1, &written, 0);
+ p=q+1; //and start searching again
+ }
+ else
+ { // from here, we will skip the '\033['
+ // we break at the first unprocessible position
+ // assuming regular text is starting there
+ uchar numbers[16], numpoint=0;
+ CONSOLE_SCREEN_BUFFER_INFO info;
+
+ // initialize
+ GetConsoleScreenBufferInfo(handle, &info);
+ memset(numbers,0,sizeof(numbers));
+
+ // skip escape and bracket
+ q=q+2;
+ while(1)
+ {
+ if( isdigit((int)((unsigned char)*q)) )
+ { // add number to number array, only accept 2digits, shift out the rest
+ // so // \033[123456789m will become \033[89m
+ numbers[numpoint] = (numbers[numpoint]<<4) | (*q-'0');
+ ++q;
+ // and next character
+ continue;
+ }
+ else if( *q == ';' )
+ { // delimiter
+ if(numpoint<sizeof(numbers)/sizeof(*numbers))
+ { // go to next array position
+ numpoint++;
+ }
+ else
+ { // array is full, so we 'forget' the first value
+ memmove(numbers,numbers+1,sizeof(numbers)/sizeof(*numbers)-1);
+ numbers[sizeof(numbers)/sizeof(*numbers)-1]=0;
+ }
+ ++q;
+ // and next number
+ continue;
+ }
+ else if( *q == 'm' )
+ { // \033[#;...;#m - Set Graphics Rendition (SGR)
+ uint i;
+ for(i=0; i<= numpoint; ++i)
+ {
+ if( 0x00 == (0xF0 & numbers[i]) )
+ { // upper nibble 0
+ if( 0 == numbers[i] )
+ { // reset
+ info.wAttributes = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
+ }
+ else if( 1==numbers[i] )
+ { // set foreground intensity
+ info.wAttributes |= FOREGROUND_INTENSITY;
+ }
+ else if( 5==numbers[i] )
+ { // set background intensity
+ info.wAttributes |= BACKGROUND_INTENSITY;
+ }
+ else if( 7==numbers[i] )
+ { // reverse colors (just xor them)
+ info.wAttributes ^= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
+ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
+ }
+ //case '2': // not existing
+ //case '3': // blinking (not implemented)
+ //case '4': // unterline (not implemented)
+ //case '6': // not existing
+ //case '8': // concealed (not implemented)
+ //case '9': // not existing
+ }
+ else if( 0x20 == (0xF0 & numbers[i]) )
+ { // off
+
+ if( 1==numbers[i] )
+ { // set foreground intensity off
+ info.wAttributes &= ~FOREGROUND_INTENSITY;
+ }
+ else if( 5==numbers[i] )
+ { // set background intensity off
+ info.wAttributes &= ~BACKGROUND_INTENSITY;
+ }
+ else if( 7==numbers[i] )
+ { // reverse colors (just xor them)
+ info.wAttributes ^= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
+ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
+ }
+ }
+ else if( 0x30 == (0xF0 & numbers[i]) )
+ { // foreground
+ uint num = numbers[i]&0x0F;
+ if(num==9) info.wAttributes |= FOREGROUND_INTENSITY;
+ if(num>7) num=7; // set white for 37, 38 and 39
+ info.wAttributes &= ~(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
+ if( (num & 0x01)>0 ) // lowest bit set = red
+ info.wAttributes |= FOREGROUND_RED;
+ if( (num & 0x02)>0 ) // second bit set = green
+ info.wAttributes |= FOREGROUND_GREEN;
+ if( (num & 0x04)>0 ) // third bit set = blue
+ info.wAttributes |= FOREGROUND_BLUE;
+ }
+ else if( 0x40 == (0xF0 & numbers[i]) )
+ { // background
+ uint num = numbers[i]&0x0F;
+ if(num==9) info.wAttributes |= BACKGROUND_INTENSITY;
+ if(num>7) num=7; // set white for 47, 48 and 49
+ info.wAttributes &= ~(BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
+ if( (num & 0x01)>0 ) // lowest bit set = red
+ info.wAttributes |= BACKGROUND_RED;
+ if( (num & 0x02)>0 ) // second bit set = green
+ info.wAttributes |= BACKGROUND_GREEN;
+ if( (num & 0x04)>0 ) // third bit set = blue
+ info.wAttributes |= BACKGROUND_BLUE;
+ }
+ }
+ // set the attributes
+ SetConsoleTextAttribute(handle, info.wAttributes);
+ }
+ else if( *q=='J' )
+ { // \033[#J - Erase Display (ED)
+ // \033[0J - Clears the screen from cursor to end of display. The cursor position is unchanged.
+ // \033[1J - Clears the screen from start to cursor. The cursor position is unchanged.
+ // \033[2J - Clears the screen and moves the cursor to the home position (line 1, column 1).
+ uint num = (numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F);
+ int cnt;
+ COORD origin = {0,0};
+ if(num==1)
+ { // chars from start up to and including cursor
+ cnt = info.dwSize.X * info.dwCursorPosition.Y + info.dwCursorPosition.X + 1;
+ }
+ else if(num==2)
+ { // Number of chars on screen.
+ cnt = info.dwSize.X * info.dwSize.Y;
+ SetConsoleCursorPosition(handle, origin);
+ }
+ else// 0 and default
+ { // number of chars from cursor to end
+ origin = info.dwCursorPosition;
+ cnt = info.dwSize.X * (info.dwSize.Y - info.dwCursorPosition.Y) - info.dwCursorPosition.X;
+ }
+ FillConsoleOutputAttribute(handle,info.wAttributes,cnt,origin,NULL);
+ FillConsoleOutputCharacter(handle,' ', cnt,origin,NULL);
+ }
+ else if( *q=='K' )
+ { // \033[K : clear line from actual position to end of the line
+ // \033[0K - Clears all characters from the cursor position to the end of the line.
+ // \033[1K - Clears all characters from start of line to the cursor position.
+ // \033[2K - Clears all characters of the whole line.
+
+ uint num = (numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F);
+ COORD origin = {0,info.dwCursorPosition.Y};
+ SHORT cnt;
+ if(num==1)
+ {
+ cnt = info.dwCursorPosition.X + 1;
+ }
+ else if(num==2)
+ {
+ cnt = info.dwSize.X;
+ }
+ else// 0 and default
+ {
+ origin = info.dwCursorPosition;
+ cnt = info.dwSize.X - info.dwCursorPosition.X; // how many spaces until line is full
+ }
+ FillConsoleOutputAttribute(handle, info.wAttributes, cnt, origin, NULL);
+ FillConsoleOutputCharacter(handle, ' ', cnt, origin, NULL);
+ }
+ else if( *q == 'H' || *q == 'f' )
+ { // \033[#;#H - Cursor Position (CUP)
+ // \033[#;#f - Horizontal & Vertical Position
+ // The first # specifies the line number, the second # specifies the column.
+ // The default for both is 1
+ info.dwCursorPosition.X = (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F-1):0;
+ info.dwCursorPosition.Y = (numpoint && numbers[numpoint-1])?(numbers[numpoint-1]>>4)*10+(numbers[numpoint-1]&0x0F-1):0;
+
+ if( info.dwCursorPosition.X >= info.dwSize.X ) info.dwCursorPosition.Y = info.dwSize.X-1;
+ if( info.dwCursorPosition.Y >= info.dwSize.Y ) info.dwCursorPosition.Y = info.dwSize.Y-1;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q=='s' )
+ { // \033[s - Save Cursor Position (SCP)
+ /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ GetConsoleScreenBufferInfo(handle, &info);
+ saveposition = info.dwCursorPosition;
+ */
+ }
+ else if( *q=='u' )
+ { // \033[u - Restore cursor position (RCP)
+ /* XXX Two streams are being used. Disabled to avoid inconsistency [flaviojs]
+ SetConsoleCursorPosition(handle, saveposition);
+ */
+ }
+ else if( *q == 'A' )
+ { // \033[#A - Cursor Up (CUU)
+ // Moves the cursor UP # number of lines
+ info.dwCursorPosition.Y -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+
+ if( info.dwCursorPosition.Y < 0 )
+ info.dwCursorPosition.Y = 0;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'B' )
+ { // \033[#B - Cursor Down (CUD)
+ // Moves the cursor DOWN # number of lines
+ info.dwCursorPosition.Y += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+
+ if( info.dwCursorPosition.Y >= info.dwSize.Y )
+ info.dwCursorPosition.Y = info.dwSize.Y-1;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'C' )
+ { // \033[#C - Cursor Forward (CUF)
+ // Moves the cursor RIGHT # number of columns
+ info.dwCursorPosition.X += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+
+ if( info.dwCursorPosition.X >= info.dwSize.X )
+ info.dwCursorPosition.X = info.dwSize.X-1;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'D' )
+ { // \033[#D - Cursor Backward (CUB)
+ // Moves the cursor LEFT # number of columns
+ info.dwCursorPosition.X -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+
+ if( info.dwCursorPosition.X < 0 )
+ info.dwCursorPosition.X = 0;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'E' )
+ { // \033[#E - Cursor Next Line (CNL)
+ // Moves the cursor down the indicated # of rows, to column 1
+ info.dwCursorPosition.Y += (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+ info.dwCursorPosition.X = 0;
+
+ if( info.dwCursorPosition.Y >= info.dwSize.Y )
+ info.dwCursorPosition.Y = info.dwSize.Y-1;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'F' )
+ { // \033[#F - Cursor Preceding Line (CPL)
+ // Moves the cursor up the indicated # of rows, to column 1.
+ info.dwCursorPosition.Y -= (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F):1;
+ info.dwCursorPosition.X = 0;
+
+ if( info.dwCursorPosition.Y < 0 )
+ info.dwCursorPosition.Y = 0;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'G' )
+ { // \033[#G - Cursor Horizontal Absolute (CHA)
+ // Moves the cursor to indicated column in current row.
+ info.dwCursorPosition.X = (numbers[numpoint])?(numbers[numpoint]>>4)*10+(numbers[numpoint]&0x0F-1):0;
+
+ if( info.dwCursorPosition.X >= info.dwSize.X )
+ info.dwCursorPosition.X = info.dwSize.X-1;
+ SetConsoleCursorPosition(handle, info.dwCursorPosition);
+ }
+ else if( *q == 'L' || *q == 'M' || *q == '@' || *q == 'P')
+ { // not implemented, just skip
+ }
+ else
+ { // no number nor valid sequencer
+ // something is fishy, we break and give the current char free
+ --q;
+ }
+ // skip the sequencer and search again
+ p = q+1;
+ break;
+ }// end while
+ }
+ }
+ if (*p) // write the rest of the buffer
+ if( 0==WriteConsole(handle, p, strlen(p), &written, 0) )
+ WriteFile(handle,p, strlen(p), &written, 0);
+ return 0;
+}
+
+int FPRINTF(HANDLE handle, const char *fmt, ...)
+{
+ int ret;
+ va_list argptr;
+ va_start(argptr, fmt);
+ ret = VFPRINTF(handle,fmt,argptr);
+ va_end(argptr);
+ return ret;
+}
+
+#define FFLUSH(handle)
+
+#define STDOUT GetStdHandle(STD_OUTPUT_HANDLE)
+#define STDERR GetStdHandle(STD_ERROR_HANDLE)
+
+#else // not _WIN32
+
+
+//#define VPRINTF vprintf
+//#define PRINTF printf
+
+#define is_console(file) (0!=isatty(fileno(file)))
+
+//vprintf_without_ansiformats
+int VFPRINTF(FILE *file, const char *fmt, va_list argptr)
+{
+ char *p, *q;
+
+ if(!fmt || !*fmt)
+ return 0;
+
+ if( is_console(file) || stdout_with_ansisequence )
+ {
+ vfprintf(file, fmt, argptr);
+ return 0;
+ }
+
+ if(tempbuf == NULL)
+ tempbuf_alloc();
+ for(; vsnprintf(tempbuf, tempbuf_size(), fmt, argptr)<0; tempbuf_realloc());
+ // vsnprintf returns -1 in case of insufficient buffer size
+ // tempbuf.realloc doubles the size of the buffer in this case
+
+ // start with processing
+ p = tempbuf;
+ while ((q = strchr(p, 0x1b)) != NULL)
+ { // find the escape character
+ fprintf(file, "%.*s", (int)(q-p), p); // write up to the escape
+ if( q[1]!='[' )
+ { // write the escape char (whatever purpose it has)
+ fprintf(file, "%.*s", 1, q);
+ p=q+1; //and start searching again
+ }
+ else
+ { // from here, we will skip the '\033['
+ // we break at the first unprocessible position
+ // assuming regular text is starting there
+
+ // skip escape and bracket
+ q=q+2;
+ while(1)
+ {
+ if( isdigit((int)((unsigned char)*q)) )
+ {
+ ++q;
+ // and next character
+ continue;
+ }
+ else if( *q == ';' )
+ { // delimiter
+ ++q;
+ // and next number
+ continue;
+ }
+ else if( *q == 'm' )
+ { // \033[#;...;#m - Set Graphics Rendition (SGR)
+ // set the attributes
+ }
+ else if( *q=='J' )
+ { // \033[#J - Erase Display (ED)
+ }
+ else if( *q=='K' )
+ { // \033[K : clear line from actual position to end of the line
+ }
+ else if( *q == 'H' || *q == 'f' )
+ { // \033[#;#H - Cursor Position (CUP)
+ // \033[#;#f - Horizontal & Vertical Position
+ }
+ else if( *q=='s' )
+ { // \033[s - Save Cursor Position (SCP)
+ }
+ else if( *q=='u' )
+ { // \033[u - Restore cursor position (RCP)
+ }
+ else if( *q == 'A' )
+ { // \033[#A - Cursor Up (CUU)
+ // Moves the cursor UP # number of lines
+ }
+ else if( *q == 'B' )
+ { // \033[#B - Cursor Down (CUD)
+ // Moves the cursor DOWN # number of lines
+ }
+ else if( *q == 'C' )
+ { // \033[#C - Cursor Forward (CUF)
+ // Moves the cursor RIGHT # number of columns
+ }
+ else if( *q == 'D' )
+ { // \033[#D - Cursor Backward (CUB)
+ // Moves the cursor LEFT # number of columns
+ }
+ else if( *q == 'E' )
+ { // \033[#E - Cursor Next Line (CNL)
+ // Moves the cursor down the indicated # of rows, to column 1
+ }
+ else if( *q == 'F' )
+ { // \033[#F - Cursor Preceding Line (CPL)
+ // Moves the cursor up the indicated # of rows, to column 1.
+ }
+ else if( *q == 'G' )
+ { // \033[#G - Cursor Horizontal Absolute (CHA)
+ // Moves the cursor to indicated column in current row.
+ }
+ else if( *q == 'L' || *q == 'M' || *q == '@' || *q == 'P')
+ { // not implemented, just skip
+ }
+ else
+ { // no number nor valid sequencer
+ // something is fishy, we break and give the current char free
+ --q;
+ }
+ // skip the sequencer and search again
+ p = q+1;
+ break;
+ }// end while
+ }
+ }
+ if (*p) // write the rest of the buffer
+ fprintf(file, "%s", p);
+ return 0;
+}
+int FPRINTF(FILE *file, const char *fmt, ...)
+{
+ int ret;
+ va_list argptr;
+ va_start(argptr, fmt);
+ ret = VFPRINTF(file,fmt,argptr);
+ va_end(argptr);
+ return ret;
+}
+
+#define FFLUSH fflush
+
+#define STDOUT stdout
+#define STDERR stderr
+
+#endif// not _WIN32
+
+
+
+
+
+
+
+
+
+
+char timestamp_format[20] = ""; //For displaying Timestamps
+
+// by MC Cameri
+int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
+{
+ // _ShowMessage MUST be used instead of printf as of 10/24/2004.
+ // Return: 0 = Successful, 1 = Failed.
+// int ret = 0;
+ char prefix[100];
+#if defined(DEBUGLOGMAP) || defined(DEBUGLOGCHAR) || defined(DEBUGLOGLOGIN)
+ FILE *fp;
+#endif
+
+ if (!string || *string == '\0') {
+ ShowError("Empty string passed to _vShowMessage().\n");
+ return 1;
+ }
+ if ((flag == MSG_DEBUG && !SHOW_DEBUG_MSG) ||
+ (flag == MSG_INFORMATION && msg_silent&1) ||
+ (flag == MSG_STATUS && msg_silent&2) ||
+ (flag == MSG_NOTICE && msg_silent&4) ||
+ (flag == MSG_WARNING && msg_silent&8) ||
+ (flag == MSG_ERROR && msg_silent&16) ||
+ (flag == MSG_SQL && msg_silent&16))
+ return 0; //Do not print it.
+
+ if (timestamp_format[0])
+ { //Display time format. [Skotlex]
+ time_t t = time(NULL);
+ strftime(prefix, 80, timestamp_format, localtime(&t));
+ } else prefix[0]='\0';
+
+ switch (flag) {
+ case MSG_NONE: // direct printf replacement
+ break;
+ case MSG_STATUS: //Bright Green (To inform about good things)
+ strcat(prefix,CL_GREEN"[Status]"CL_RESET":");
+ break;
+ case MSG_SQL: //Bright Violet (For dumping out anything related with SQL) <- Actually, this is mostly used for SQL errors with the database, as successes can as well just be anything else... [Skotlex]
+ strcat(prefix,CL_MAGENTA"[SQL]"CL_RESET":");
+ break;
+ case MSG_INFORMATION: //Bright White (Variable information)
+ strcat(prefix,CL_WHITE"[Info]"CL_RESET":");
+ break;
+ case MSG_NOTICE: //Bright White (Less than a warning)
+ strcat(prefix,CL_WHITE"[Notice]"CL_RESET":");
+ break;
+ case MSG_WARNING: //Bright Yellow
+ strcat(prefix,CL_YELLOW"[Warning]"CL_RESET":");
+ break;
+ case MSG_DEBUG: //Bright Cyan, important stuff!
+ strcat(prefix,CL_CYAN"[Debug]"CL_RESET":");
+ break;
+ case MSG_ERROR: //Bright Red (Regular errors)
+ strcat(prefix,CL_RED"[Error]"CL_RESET":");
+ break;
+ case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible)
+ strcat(prefix,CL_RED"[Fatal Error]"CL_RESET":");
+ break;
+ default:
+ ShowError("In function _vShowMessage() -> Invalid flag passed.\n");
+ return 1;
+ }
+
+ if (flag == MSG_ERROR || flag == MSG_FATALERROR || flag == MSG_SQL)
+ { //Send Errors to StdErr [Skotlex]
+ FPRINTF(STDERR, "%s ", prefix);
+ VFPRINTF(STDERR, string, ap);
+ FFLUSH(STDERR);
+ } else {
+ if (flag != MSG_NONE)
+ FPRINTF(STDOUT, "%s ", prefix);
+ VFPRINTF(STDOUT, string, ap);
+ FFLUSH(STDOUT);
+ }
+
+#if defined(DEBUGLOGMAP) || defined(DEBUGLOGCHAR) || defined(DEBUGLOGLOGIN)
+ if(strlen(DEBUGLOGPATH) > 0) {
+ fp=fopen(DEBUGLOGPATH,"a");
+ if (fp == NULL) {
+ FPRINTF(STDERR, CL_RED"[ERROR]"CL_RESET": Could not open '"CL_WHITE"%s"CL_RESET"', access denied.\n", DEBUGLOGPATH);
+ FFLUSH(STDERR);
+ } else {
+ fprintf(fp,"%s ", prefix);
+ vfprintf(fp,string,ap);
+ fclose(fp);
+ }
+ } else {
+ FPRINTF(STDERR, CL_RED"[ERROR]"CL_RESET": DEBUGLOGPATH not defined!\n");
+ FFLUSH(STDERR);
+ }
+#endif
+
+ va_end(ap);
+ return 0;
+}
+
+void ClearScreen(void)
+{
+#ifndef _WIN32
+ ShowMessage(CL_CLS); // to prevent empty string passed messages
+#endif
+}
+int _ShowMessage(enum msg_type flag, const char *string, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(flag, string, ap);
+ va_end(ap);
+ return ret;
+}
+
+// direct printf replacement
+int ShowMessage(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_NONE, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowStatus(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_STATUS, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowSQL(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_SQL, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowInfo(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_INFORMATION, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowNotice(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_NOTICE, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowWarning(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_WARNING, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowDebug(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_DEBUG, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowError(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_ERROR, string, ap);
+ va_end(ap);
+ return ret;
+}
+int ShowFatalError(const char *string, ...) {
+ int ret;
+ va_list ap;
+ va_start(ap, string);
+ ret = _vShowMessage(MSG_FATALERROR, string, ap);
+ va_end(ap);
+ return ret;
+}
diff --git a/src/common/showmsg.h b/src/common/showmsg.h
index f947b34e3..cf9c16d23 100644
--- a/src/common/showmsg.h
+++ b/src/common/showmsg.h
@@ -1,96 +1,96 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _SHOWMSG_H_
-#define _SHOWMSG_H_
-
-#define SHOW_DEBUG_MSG 1
-// for help with the console colors look here:
-// http://www.edoceo.com/liberum/?doc=printf-with-color
-// some code explanation (used here):
-// \033[2J : clear screen and go up/left (0, 0 position)
-// \033[K : clear line from actual position to end of the line
-// \033[0m : reset color parameter
-// \033[1m : use bold for font
-
-#define CL_RESET "\033[0m"
-#define CL_CLS "\033[2J"
-#define CL_CLL "\033[K"
-
-// font settings
-#define CL_BOLD "\033[1m"
-#define CL_NORM CL_RESET
-#define CL_NORMAL CL_RESET
-#define CL_NONE CL_RESET
-// foreground color and bold font (bright color on windows)
-#define CL_WHITE "\033[1;37m"
-#define CL_GRAY "\033[1;30m"
-#define CL_RED "\033[1;31m"
-#define CL_GREEN "\033[1;32m"
-#define CL_YELLOW "\033[1;33m"
-#define CL_BLUE "\033[1;34m"
-#define CL_MAGENTA "\033[1;35m"
-#define CL_CYAN "\033[1;36m"
-
-// background color
-#define CL_BG_BLACK "\033[40m"
-#define CL_BG_RED "\033[41m"
-#define CL_BG_GREEN "\033[42m"
-#define CL_BG_YELLOW "\033[43m"
-#define CL_BG_BLUE "\033[44m"
-#define CL_BG_MAGENTA "\033[45m"
-#define CL_BG_CYAN "\033[46m"
-#define CL_BG_WHITE "\033[47m"
-// foreground color and normal font (normal color on windows)
-#define CL_LT_BLACK "\033[0;30m"
-#define CL_LT_RED "\033[0;31m"
-#define CL_LT_GREEN "\033[0;32m"
-#define CL_LT_YELLOW "\033[0;33m"
-#define CL_LT_BLUE "\033[0;34m"
-#define CL_LT_MAGENTA "\033[0;35m"
-#define CL_LT_CYAN "\033[0;36m"
-#define CL_LT_WHITE "\033[0;37m"
-// foreground color and bold font (bright color on windows)
-#define CL_BT_BLACK "\033[1;30m"
-#define CL_BT_RED "\033[1;31m"
-#define CL_BT_GREEN "\033[1;32m"
-#define CL_BT_YELLOW "\033[1;33m"
-#define CL_BT_BLUE "\033[1;34m"
-#define CL_BT_MAGENTA "\033[1;35m"
-#define CL_BT_CYAN "\033[1;36m"
-#define CL_BT_WHITE "\033[1;37m"
-
-#define CL_WTBL "\033[37;44m" // white on blue
-#define CL_XXBL "\033[0;44m" // default on blue
-#define CL_PASS "\033[0;32;42m" // green on green
-
-#define CL_SPACE " " // space aquivalent of the print messages
-
-extern int stdout_with_ansisequence; //If the color ansi sequences are to be used. [flaviojs]
-extern int msg_silent; //Specifies how silent the console is. [Skotlex]
-extern char timestamp_format[20]; //For displaying Timestamps [Skotlex]
-
-enum msg_type {
- MSG_NONE,
- MSG_STATUS,
- MSG_SQL,
- MSG_INFORMATION,
- MSG_NOTICE,
- MSG_WARNING,
- MSG_DEBUG,
- MSG_ERROR,
- MSG_FATALERROR
-};
-
-extern void ClearScreen(void);
-extern int ShowMessage(const char *, ...);
-extern int ShowStatus(const char *, ...);
-extern int ShowSQL(const char *, ...);
-extern int ShowInfo(const char *, ...);
-extern int ShowNotice(const char *, ...);
-extern int ShowWarning(const char *, ...);
-extern int ShowDebug(const char *, ...);
-extern int ShowError(const char *, ...);
-extern int ShowFatalError(const char *, ...);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _SHOWMSG_H_
+#define _SHOWMSG_H_
+
+#define SHOW_DEBUG_MSG 1
+// for help with the console colors look here:
+// http://www.edoceo.com/liberum/?doc=printf-with-color
+// some code explanation (used here):
+// \033[2J : clear screen and go up/left (0, 0 position)
+// \033[K : clear line from actual position to end of the line
+// \033[0m : reset color parameter
+// \033[1m : use bold for font
+
+#define CL_RESET "\033[0m"
+#define CL_CLS "\033[2J"
+#define CL_CLL "\033[K"
+
+// font settings
+#define CL_BOLD "\033[1m"
+#define CL_NORM CL_RESET
+#define CL_NORMAL CL_RESET
+#define CL_NONE CL_RESET
+// foreground color and bold font (bright color on windows)
+#define CL_WHITE "\033[1;37m"
+#define CL_GRAY "\033[1;30m"
+#define CL_RED "\033[1;31m"
+#define CL_GREEN "\033[1;32m"
+#define CL_YELLOW "\033[1;33m"
+#define CL_BLUE "\033[1;34m"
+#define CL_MAGENTA "\033[1;35m"
+#define CL_CYAN "\033[1;36m"
+
+// background color
+#define CL_BG_BLACK "\033[40m"
+#define CL_BG_RED "\033[41m"
+#define CL_BG_GREEN "\033[42m"
+#define CL_BG_YELLOW "\033[43m"
+#define CL_BG_BLUE "\033[44m"
+#define CL_BG_MAGENTA "\033[45m"
+#define CL_BG_CYAN "\033[46m"
+#define CL_BG_WHITE "\033[47m"
+// foreground color and normal font (normal color on windows)
+#define CL_LT_BLACK "\033[0;30m"
+#define CL_LT_RED "\033[0;31m"
+#define CL_LT_GREEN "\033[0;32m"
+#define CL_LT_YELLOW "\033[0;33m"
+#define CL_LT_BLUE "\033[0;34m"
+#define CL_LT_MAGENTA "\033[0;35m"
+#define CL_LT_CYAN "\033[0;36m"
+#define CL_LT_WHITE "\033[0;37m"
+// foreground color and bold font (bright color on windows)
+#define CL_BT_BLACK "\033[1;30m"
+#define CL_BT_RED "\033[1;31m"
+#define CL_BT_GREEN "\033[1;32m"
+#define CL_BT_YELLOW "\033[1;33m"
+#define CL_BT_BLUE "\033[1;34m"
+#define CL_BT_MAGENTA "\033[1;35m"
+#define CL_BT_CYAN "\033[1;36m"
+#define CL_BT_WHITE "\033[1;37m"
+
+#define CL_WTBL "\033[37;44m" // white on blue
+#define CL_XXBL "\033[0;44m" // default on blue
+#define CL_PASS "\033[0;32;42m" // green on green
+
+#define CL_SPACE " " // space aquivalent of the print messages
+
+extern int stdout_with_ansisequence; //If the color ansi sequences are to be used. [flaviojs]
+extern int msg_silent; //Specifies how silent the console is. [Skotlex]
+extern char timestamp_format[20]; //For displaying Timestamps [Skotlex]
+
+enum msg_type {
+ MSG_NONE,
+ MSG_STATUS,
+ MSG_SQL,
+ MSG_INFORMATION,
+ MSG_NOTICE,
+ MSG_WARNING,
+ MSG_DEBUG,
+ MSG_ERROR,
+ MSG_FATALERROR
+};
+
+extern void ClearScreen(void);
+extern int ShowMessage(const char *, ...);
+extern int ShowStatus(const char *, ...);
+extern int ShowSQL(const char *, ...);
+extern int ShowInfo(const char *, ...);
+extern int ShowNotice(const char *, ...);
+extern int ShowWarning(const char *, ...);
+extern int ShowDebug(const char *, ...);
+extern int ShowError(const char *, ...);
+extern int ShowFatalError(const char *, ...);
+
+#endif
diff --git a/src/common/strlib.h b/src/common/strlib.h
index 225228c74..d3b9a1dec 100644
--- a/src/common/strlib.h
+++ b/src/common/strlib.h
@@ -1,24 +1,24 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _J_STR_LIB_H_
-#define _J_STR_LIB_H_
-#define J_MAX_MALLOC_SIZE 65535
-// String function library.
-// code by Jioh L. Jung (ziozzang@4wish.net)
-// This code is under license "BSD"
-char* jstrescape (char* pt);
-char* jstrescapecpy (char* pt,char* spt);
-int jmemescapecpy (char* pt,char* spt, int size);
-
-#ifdef __WIN32
-#define HAVE_STRTOK_R
-#define strtok_r(s,delim,save_ptr) _strtok_r((s),(delim),(save_ptr))
-char *_strtok_r(char *s1, const char *s2, char **lasts);
-#endif
-
-// custom functions
-int remove_control_chars(unsigned char *);
-char *trim(char *str, const char *delim);
-const char *stristr(const char *haystack, const char *needle);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _J_STR_LIB_H_
+#define _J_STR_LIB_H_
+#define J_MAX_MALLOC_SIZE 65535
+// String function library.
+// code by Jioh L. Jung (ziozzang@4wish.net)
+// This code is under license "BSD"
+char* jstrescape (char* pt);
+char* jstrescapecpy (char* pt,char* spt);
+int jmemescapecpy (char* pt,char* spt, int size);
+
+#ifdef __WIN32
+#define HAVE_STRTOK_R
+#define strtok_r(s,delim,save_ptr) _strtok_r((s),(delim),(save_ptr))
+char *_strtok_r(char *s1, const char *s2, char **lasts);
+#endif
+
+// custom functions
+int remove_control_chars(unsigned char *);
+char *trim(char *str, const char *delim);
+const char *stristr(const char *haystack, const char *needle);
+#endif
diff --git a/src/common/timer.c b/src/common/timer.c
index a848266ac..77d88d17d 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -1,436 +1,436 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <sys/types.h>
-
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-// Well, this won't last another 30++ years (where conversion will truncate).
-//#define _USE_32BIT_TIME_T // use 32 bit time variables on 64bit windows
-#include <windows.h>
-#else
-#include <sys/socket.h>
-#include <sys/time.h>
-#endif
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "timer.h"
-#include "malloc.h"
-#include "showmsg.h"
-
-// ƒ^ƒCƒ}[ŠÔŠu‚ÌŬ’lBƒ‚ƒ“ƒXƒ^[‚Ì‘å—Ê¢ŠÒŽžA‘½”‚̃Nƒ‰ƒCƒAƒ“ƒgÚ‘±Žž‚É
-// ƒT[ƒo[‚ª”½‰ž‚µ‚È‚­‚È‚éꇂÍATIMER_MIN_INTERVAL ‚ð‘‚₵‚Ä‚­‚¾‚³‚¢B
-
-// If the server shows no reaction when processing thousands of monsters
-// or connected by many clients, please increase TIMER_MIN_INTERVAL.
-
-#define TIMER_MIN_INTERVAL 50
-
-static struct TimerData* timer_data = NULL;
-static int timer_data_max = 0;
-static int timer_data_num = 0;
-
-static int* free_timer_list = NULL;
-static int free_timer_list_max = 0;
-static int free_timer_list_pos = 0;
-
-static int timer_heap_num = 0;
-static int timer_heap_max = 0;
-static int* timer_heap = NULL;
-
-static int fix_heap_flag =0; //Flag for fixing the stack only once per tick loop. May not be the best way, but it's all I can think of currently :X [Skotlex]
-
-// for debug
-struct timer_func_list {
- int (*func)(int,unsigned int,int,int);
- struct timer_func_list* next;
- char* name;
-};
-static struct timer_func_list* tfl_root;
-
-time_t start_time;
-
-#ifdef __WIN32
-/* Modified struct timezone to void - we pass NULL anyway */
-void gettimeofday (struct timeval *t, void *dummy)
-{
- DWORD millisec = GetTickCount();
-
- t->tv_sec = (int) (millisec / 1000);
- t->tv_usec = (millisec % 1000) * 1000;
-}
-#endif
-
-//
-int add_timer_func_list(int (*func)(int,unsigned int,int,int), char* name)
-{
- struct timer_func_list* tfl;
-
- if (name) {
- tfl = (struct timer_func_list*) aCalloc (sizeof(struct timer_func_list), 1);
- tfl->name = (char *) aMalloc (strlen(name) + 1);
-
- tfl->next = tfl_root;
- tfl->func = func;
- strcpy(tfl->name, name);
- tfl_root = tfl;
- }
- return 0;
-}
-
-char* search_timer_func_list(int (*func)(int,unsigned int,int,int))
-{
- struct timer_func_list* tfl = tfl_root;
- while (tfl) {
- if (func == tfl->func)
- return tfl->name;
- tfl = tfl->next;
- }
-
- return "unknown timer function";
-}
-
-/*----------------------------
- * Get tick time
- *----------------------------*/
-static unsigned int gettick_cache;
-static int gettick_count;
-
-unsigned int gettick_nocache(void)
-{
- struct timeval tval;
-
- gettimeofday(&tval, NULL);
- gettick_count = 256;
-
- return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000;
-}
-
-unsigned int gettick(void)
-{
- gettick_count--;
- if (gettick_count < 0)
- return gettick_nocache();
-
- return gettick_cache;
-}
-
-/*======================================
- * CORE : Timer Heap
- *--------------------------------------
- */
-static void push_timer_heap(int index)
-{
- int i, j;
- int min, max, pivot; // for sorting
-
- // check number of element
- if (timer_heap_num >= timer_heap_max) {
- if (timer_heap_max == 0) {
- timer_heap_max = 256;
- timer_heap = (int *) aCalloc( sizeof(int) , 256);
- } else {
- timer_heap_max += 256;
- timer_heap = (int *) aRealloc( timer_heap, sizeof(int) * timer_heap_max);
- malloc_tsetdword(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
- }
- }
-
- // do a sorting from higher to lower
- j = timer_data[index].tick; // speed up
- // with less than 4 values, it's speeder to use simple loop
- if (timer_heap_num < 4) {
- for(i = timer_heap_num; i > 0; i--)
-// if (j < timer_data[timer_heap[i - 1]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
- if (DIFF_TICK(j, timer_data[timer_heap[i - 1]].tick) < 0)
- break;
- else
- timer_heap[i] = timer_heap[i - 1];
- timer_heap[i] = index;
- // searching by dichotomie
- } else {
- // if lower actual item is higher than new
-// if (j < timer_data[timer_heap[timer_heap_num - 1]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
- if (DIFF_TICK(j, timer_data[timer_heap[timer_heap_num - 1]].tick) < 0)
- timer_heap[timer_heap_num] = index;
- else {
- // searching position
- min = 0;
- max = timer_heap_num - 1;
- while (min < max) {
- pivot = (min + max) / 2;
-// if (j < timer_data[timer_heap[pivot]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
- if (DIFF_TICK(j, timer_data[timer_heap[pivot]].tick) < 0)
- min = pivot + 1;
- else
- max = pivot;
- }
- // move elements - do loop if there are a little number of elements to move
- if (timer_heap_num - min < 5) {
- for(i = timer_heap_num; i > min; i--)
- timer_heap[i] = timer_heap[i - 1];
- // move elements - else use memmove (speeder for a lot of elements)
- } else
- memmove(&timer_heap[min + 1], &timer_heap[min], sizeof(int) * (timer_heap_num - min));
- // save new element
- timer_heap[min] = index;
- }
- }
-
- timer_heap_num++;
-}
-
-/*==========================
- * Timer Management
- *--------------------------
- */
-
-int acquire_timer (void)
-{
- int i;
-
- if (free_timer_list_pos) {
- do {
- i = free_timer_list[--free_timer_list_pos];
- } while(i >= timer_data_num && free_timer_list_pos > 0);
- } else
- i = timer_data_num;
-
- if (i >= timer_data_num)
- for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++);
- if (i >= timer_data_num && i >= timer_data_max) {
- if (timer_data_max == 0) {
- timer_data_max = 256;
- timer_data = (struct TimerData*) aCalloc( sizeof(struct TimerData) , timer_data_max);
- } else {
- timer_data_max += 256;
- timer_data = (struct TimerData *) aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max);
- malloc_tsetdword(timer_data + (timer_data_max - 256), 0, sizeof(struct TimerData) * 256);
- }
- }
-
- return i;
-}
-
-int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int), int id, int data)
-{
- int tid = acquire_timer();
-
- timer_data[tid].tick = tick;
- timer_data[tid].func = func;
- timer_data[tid].id = id;
- timer_data[tid].data = data;
- timer_data[tid].type = TIMER_ONCE_AUTODEL;
- timer_data[tid].interval = 1000;
- push_timer_heap(tid);
-
- if (tid >= timer_data_num)
- timer_data_num = tid + 1;
-
- return tid;
-}
-
-int add_timer_interval(unsigned int tick, int (*func)(int,unsigned int,int,int), int id, int data, int interval)
-{
- int tid;
-
- if (interval < 1) {
- ShowError("add_timer_interval : function %08x(%s) has invalid interval %d!\n",
- (int)func, search_timer_func_list(func), interval);
- return -1;
- }
-
- tid = acquire_timer();
- timer_data[tid].tick = tick;
- timer_data[tid].func = func;
- timer_data[tid].id = id;
- timer_data[tid].data = data;
- timer_data[tid].type = TIMER_INTERVAL;
- timer_data[tid].interval = interval;
- push_timer_heap(tid);
-
- if (tid >= timer_data_num)
- timer_data_num = tid + 1;
-
- return tid;
-}
-
-int delete_timer(int id, int (*func)(int,unsigned int,int,int))
-{
- if (id <= 0 || id >= timer_data_num) {
- ShowError("delete_timer error : no such timer %d (%08x(%s))\n", id, (int)func, search_timer_func_list(func));
- return -1;
- }
- if (timer_data[id].func != func) {
- ShowError("delete_timer error : function mismatch %08x(%s) != %08x(%s)\n",
- (int)timer_data[id].func, search_timer_func_list(timer_data[id].func),
- (int)func, search_timer_func_list(func));
- return -2;
- }
- // ‚»‚Ì‚¤‚¿Á‚¦‚é‚É‚Ü‚©‚¹‚é
- timer_data[id].func = NULL;
- timer_data[id].type = TIMER_ONCE_AUTODEL;
-
- return 0;
-}
-
-int addtick_timer(int tid, unsigned int tick)
-{
- return timer_data[tid].tick += tick;
-}
-
-//Sets the tick at which the timer triggers directly (meant as a replacement of delete_timer + add_timer) [Skotlex]
-//FIXME: DON'T use this function yet, it is not correctly reorganizing the timer stack causing unexpected problems later on!
-int settick_timer(int tid, unsigned int tick)
-{
- int i,j;
- if (timer_data[tid].tick == tick)
- return tick;
-
- //FIXME: This search is not all that effective... there doesn't seems to be a better way to locate an element in the heap.
- for(i = timer_heap_num-1; i >= 0 && timer_heap[i] != tid; i--);
-
- if (i < 0)
- return -1; //Sort of impossible, isn't it?
- if (DIFF_TICK(timer_data[tid].tick, tick) > 0)
- { //Timer is accelerated, shift timer near the end of the heap.
- if (i == timer_heap_num-1) //Nothing to shift.
- j = timer_heap_num-1;
- else {
- for (j = i+1; j < timer_heap_num && DIFF_TICK(timer_data[j].tick, tick) > 0; j++);
- j--;
- memmove(&timer_heap[i], &timer_heap[i+1], (j-i)*sizeof(int));
- }
- } else { //Timer is delayed, shift timer near the beginning of the heap.
- if (i == 0) //Nothing to shift.
- j = 0;
- else {
- for (j = i-1; j >= 0 && DIFF_TICK(timer_data[j].tick, tick) < 0; j--);
- j++;
- memmove(&timer_heap[j+1], &timer_heap[j], (i-j)*sizeof(int));
- }
- }
- timer_heap[j] = tid;
- timer_data[tid].tick = tick;
- return tick;
-}
-
-struct TimerData* get_timer(int tid)
-{
- return &timer_data[tid];
-}
-
-//Correcting the heap when the tick overflows is an idea taken from jA to
-//prevent timer problems. Thanks to [End of Exam] for providing the required data. [Skotlex]
-//This funtion will rearrange the heap and assign new tick values.
-static void fix_timer_heap(unsigned int tick)
-{
- if (timer_heap_num >= 0 && tick < 0x00010000 && timer_data[timer_heap[0]].tick > 0xf0000000)
- { //The last timer is way too far into the future, and the current tick is too close to 0, overflow was very likely
- //(not perfect, but will work as long as the timer is not expected to happen 50 or so days into the future)
- int i;
- int *tmp_heap;
- for (i=0; i < timer_heap_num && timer_data[timer_heap[i]].tick > 0xf0000000; i++)
- { //All functions with high tick value should had been executed already...
- timer_data[timer_heap[i]].tick = 0;
- }
- //Move elements to readjust the heap.
- tmp_heap = aCalloc(sizeof(int), i);
- memmove(&tmp_heap[0], &timer_heap[0], i*sizeof(int));
- memmove(&timer_heap[0], &timer_heap[i], (timer_heap_num-i)*sizeof(int));
- memmove(&timer_heap[timer_heap_num-i], &tmp_heap[0], i*sizeof(int));
- aFree(tmp_heap);
- }
-}
-
-int do_timer(unsigned int tick)
-{
- int i, nextmin = 1000;
-
- if (tick < 0x010000 && fix_heap_flag)
- {
- fix_timer_heap(tick);
- fix_heap_flag = 0;
- }
-
- while(timer_heap_num) {
- i = timer_heap[timer_heap_num - 1]; // next shorter element
- if ((nextmin = DIFF_TICK(timer_data[i].tick, tick)) > 0)
- break;
- if (timer_heap_num > 0) // suppress the actual element from the table
- timer_heap_num--;
- timer_data[i].type |= TIMER_REMOVE_HEAP;
- if (timer_data[i].func) {
- if (nextmin < -1000) {
- // 1•bˆÈã‚Ì‘å•‚È’x‰„‚ª”­¶‚µ‚Ä‚¢‚é‚Ì‚ÅA
- // timerˆ—ƒ^ƒCƒ~ƒ“ƒO‚ðŒ»Ý’l‚Æ‚·‚鎖‚Å
- // ŒÄ‚Ño‚µŽžƒ^ƒCƒ~ƒ“ƒO(ˆø”‚Ìtick)‘Š‘΂ň—‚µ‚Ä‚é
- // timerŠÖ”‚ÌŽŸ‰ñˆ—ƒ^ƒCƒ~ƒ“ƒO‚ð’x‚点‚é
- timer_data[i].func(i, tick, timer_data[i].id, timer_data[i].data);
- } else {
- timer_data[i].func(i, timer_data[i].tick, timer_data[i].id, timer_data[i].data);
- }
- }
- if (timer_data[i].type & TIMER_REMOVE_HEAP) {
- switch(timer_data[i].type & ~TIMER_REMOVE_HEAP) {
- case TIMER_ONCE_AUTODEL:
- timer_data[i].type = 0;
- if (free_timer_list_pos >= free_timer_list_max) {
- free_timer_list_max += 256;
- free_timer_list = (int *) aRealloc(free_timer_list, sizeof(int) * free_timer_list_max);
- malloc_tsetdword(free_timer_list + (free_timer_list_max - 256), 0, 256 * sizeof(int));
- }
- free_timer_list[free_timer_list_pos++] = i;
- break;
- case TIMER_INTERVAL:
- if (DIFF_TICK(timer_data[i].tick , tick) < -1000) {
- timer_data[i].tick = tick + timer_data[i].interval;
- } else {
- timer_data[i].tick += timer_data[i].interval;
- }
- timer_data[i].type &= ~TIMER_REMOVE_HEAP;
- push_timer_heap(i);
- break;
- }
- }
- }
-
- if (nextmin < TIMER_MIN_INTERVAL)
- nextmin = TIMER_MIN_INTERVAL;
-
- if ((unsigned int)(tick + nextmin) < tick) //Tick will loop, rearrange the heap on the next iteration.
- fix_heap_flag = 1;
- return nextmin;
-}
-
-unsigned long get_uptime (void)
-{
- return (unsigned long) difftime (time(NULL), start_time);
-}
-
-void timer_init(void)
-{
- time(&start_time);
-}
-
-void timer_final(void)
-{
- struct timer_func_list* tfl = tfl_root, *tfl2;
-
- while (tfl) {
- tfl2 = tfl->next; // copy next pointer
- aFree(tfl->name); // free structures
- aFree(tfl);
- tfl = tfl2; // use copied pointer for next cycle
- }
-
- if (timer_data) aFree(timer_data);
- if (timer_heap) aFree(timer_heap);
- if (free_timer_list) aFree(free_timer_list);
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <sys/types.h>
+
+#ifdef __WIN32
+#define __USE_W32_SOCKETS
+// Well, this won't last another 30++ years (where conversion will truncate).
+//#define _USE_32BIT_TIME_T // use 32 bit time variables on 64bit windows
+#include <windows.h>
+#else
+#include <sys/socket.h>
+#include <sys/time.h>
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "timer.h"
+#include "malloc.h"
+#include "showmsg.h"
+
+// ƒ^ƒCƒ}[ŠÔŠu‚ÌŬ’lBƒ‚ƒ“ƒXƒ^[‚Ì‘å—Ê¢ŠÒŽžA‘½”‚̃Nƒ‰ƒCƒAƒ“ƒgÚ‘±Žž‚É
+// ƒT[ƒo[‚ª”½‰ž‚µ‚È‚­‚È‚éꇂÍATIMER_MIN_INTERVAL ‚ð‘‚₵‚Ä‚­‚¾‚³‚¢B
+
+// If the server shows no reaction when processing thousands of monsters
+// or connected by many clients, please increase TIMER_MIN_INTERVAL.
+
+#define TIMER_MIN_INTERVAL 50
+
+static struct TimerData* timer_data = NULL;
+static int timer_data_max = 0;
+static int timer_data_num = 0;
+
+static int* free_timer_list = NULL;
+static int free_timer_list_max = 0;
+static int free_timer_list_pos = 0;
+
+static int timer_heap_num = 0;
+static int timer_heap_max = 0;
+static int* timer_heap = NULL;
+
+static int fix_heap_flag =0; //Flag for fixing the stack only once per tick loop. May not be the best way, but it's all I can think of currently :X [Skotlex]
+
+// for debug
+struct timer_func_list {
+ int (*func)(int,unsigned int,int,int);
+ struct timer_func_list* next;
+ char* name;
+};
+static struct timer_func_list* tfl_root;
+
+time_t start_time;
+
+#ifdef __WIN32
+/* Modified struct timezone to void - we pass NULL anyway */
+void gettimeofday (struct timeval *t, void *dummy)
+{
+ DWORD millisec = GetTickCount();
+
+ t->tv_sec = (int) (millisec / 1000);
+ t->tv_usec = (millisec % 1000) * 1000;
+}
+#endif
+
+//
+int add_timer_func_list(int (*func)(int,unsigned int,int,int), char* name)
+{
+ struct timer_func_list* tfl;
+
+ if (name) {
+ tfl = (struct timer_func_list*) aCalloc (sizeof(struct timer_func_list), 1);
+ tfl->name = (char *) aMalloc (strlen(name) + 1);
+
+ tfl->next = tfl_root;
+ tfl->func = func;
+ strcpy(tfl->name, name);
+ tfl_root = tfl;
+ }
+ return 0;
+}
+
+char* search_timer_func_list(int (*func)(int,unsigned int,int,int))
+{
+ struct timer_func_list* tfl = tfl_root;
+ while (tfl) {
+ if (func == tfl->func)
+ return tfl->name;
+ tfl = tfl->next;
+ }
+
+ return "unknown timer function";
+}
+
+/*----------------------------
+ * Get tick time
+ *----------------------------*/
+static unsigned int gettick_cache;
+static int gettick_count;
+
+unsigned int gettick_nocache(void)
+{
+ struct timeval tval;
+
+ gettimeofday(&tval, NULL);
+ gettick_count = 256;
+
+ return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000;
+}
+
+unsigned int gettick(void)
+{
+ gettick_count--;
+ if (gettick_count < 0)
+ return gettick_nocache();
+
+ return gettick_cache;
+}
+
+/*======================================
+ * CORE : Timer Heap
+ *--------------------------------------
+ */
+static void push_timer_heap(int index)
+{
+ int i, j;
+ int min, max, pivot; // for sorting
+
+ // check number of element
+ if (timer_heap_num >= timer_heap_max) {
+ if (timer_heap_max == 0) {
+ timer_heap_max = 256;
+ timer_heap = (int *) aCalloc( sizeof(int) , 256);
+ } else {
+ timer_heap_max += 256;
+ timer_heap = (int *) aRealloc( timer_heap, sizeof(int) * timer_heap_max);
+ malloc_tsetdword(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
+ }
+ }
+
+ // do a sorting from higher to lower
+ j = timer_data[index].tick; // speed up
+ // with less than 4 values, it's speeder to use simple loop
+ if (timer_heap_num < 4) {
+ for(i = timer_heap_num; i > 0; i--)
+// if (j < timer_data[timer_heap[i - 1]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
+ if (DIFF_TICK(j, timer_data[timer_heap[i - 1]].tick) < 0)
+ break;
+ else
+ timer_heap[i] = timer_heap[i - 1];
+ timer_heap[i] = index;
+ // searching by dichotomie
+ } else {
+ // if lower actual item is higher than new
+// if (j < timer_data[timer_heap[timer_heap_num - 1]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
+ if (DIFF_TICK(j, timer_data[timer_heap[timer_heap_num - 1]].tick) < 0)
+ timer_heap[timer_heap_num] = index;
+ else {
+ // searching position
+ min = 0;
+ max = timer_heap_num - 1;
+ while (min < max) {
+ pivot = (min + max) / 2;
+// if (j < timer_data[timer_heap[pivot]].tick) //Plain comparisons break on bound looping timers. [Skotlex]
+ if (DIFF_TICK(j, timer_data[timer_heap[pivot]].tick) < 0)
+ min = pivot + 1;
+ else
+ max = pivot;
+ }
+ // move elements - do loop if there are a little number of elements to move
+ if (timer_heap_num - min < 5) {
+ for(i = timer_heap_num; i > min; i--)
+ timer_heap[i] = timer_heap[i - 1];
+ // move elements - else use memmove (speeder for a lot of elements)
+ } else
+ memmove(&timer_heap[min + 1], &timer_heap[min], sizeof(int) * (timer_heap_num - min));
+ // save new element
+ timer_heap[min] = index;
+ }
+ }
+
+ timer_heap_num++;
+}
+
+/*==========================
+ * Timer Management
+ *--------------------------
+ */
+
+int acquire_timer (void)
+{
+ int i;
+
+ if (free_timer_list_pos) {
+ do {
+ i = free_timer_list[--free_timer_list_pos];
+ } while(i >= timer_data_num && free_timer_list_pos > 0);
+ } else
+ i = timer_data_num;
+
+ if (i >= timer_data_num)
+ for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++);
+ if (i >= timer_data_num && i >= timer_data_max) {
+ if (timer_data_max == 0) {
+ timer_data_max = 256;
+ timer_data = (struct TimerData*) aCalloc( sizeof(struct TimerData) , timer_data_max);
+ } else {
+ timer_data_max += 256;
+ timer_data = (struct TimerData *) aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max);
+ malloc_tsetdword(timer_data + (timer_data_max - 256), 0, sizeof(struct TimerData) * 256);
+ }
+ }
+
+ return i;
+}
+
+int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int), int id, int data)
+{
+ int tid = acquire_timer();
+
+ timer_data[tid].tick = tick;
+ timer_data[tid].func = func;
+ timer_data[tid].id = id;
+ timer_data[tid].data = data;
+ timer_data[tid].type = TIMER_ONCE_AUTODEL;
+ timer_data[tid].interval = 1000;
+ push_timer_heap(tid);
+
+ if (tid >= timer_data_num)
+ timer_data_num = tid + 1;
+
+ return tid;
+}
+
+int add_timer_interval(unsigned int tick, int (*func)(int,unsigned int,int,int), int id, int data, int interval)
+{
+ int tid;
+
+ if (interval < 1) {
+ ShowError("add_timer_interval : function %08x(%s) has invalid interval %d!\n",
+ (int)func, search_timer_func_list(func), interval);
+ return -1;
+ }
+
+ tid = acquire_timer();
+ timer_data[tid].tick = tick;
+ timer_data[tid].func = func;
+ timer_data[tid].id = id;
+ timer_data[tid].data = data;
+ timer_data[tid].type = TIMER_INTERVAL;
+ timer_data[tid].interval = interval;
+ push_timer_heap(tid);
+
+ if (tid >= timer_data_num)
+ timer_data_num = tid + 1;
+
+ return tid;
+}
+
+int delete_timer(int id, int (*func)(int,unsigned int,int,int))
+{
+ if (id <= 0 || id >= timer_data_num) {
+ ShowError("delete_timer error : no such timer %d (%08x(%s))\n", id, (int)func, search_timer_func_list(func));
+ return -1;
+ }
+ if (timer_data[id].func != func) {
+ ShowError("delete_timer error : function mismatch %08x(%s) != %08x(%s)\n",
+ (int)timer_data[id].func, search_timer_func_list(timer_data[id].func),
+ (int)func, search_timer_func_list(func));
+ return -2;
+ }
+ // ‚»‚Ì‚¤‚¿Á‚¦‚é‚É‚Ü‚©‚¹‚é
+ timer_data[id].func = NULL;
+ timer_data[id].type = TIMER_ONCE_AUTODEL;
+
+ return 0;
+}
+
+int addtick_timer(int tid, unsigned int tick)
+{
+ return timer_data[tid].tick += tick;
+}
+
+//Sets the tick at which the timer triggers directly (meant as a replacement of delete_timer + add_timer) [Skotlex]
+//FIXME: DON'T use this function yet, it is not correctly reorganizing the timer stack causing unexpected problems later on!
+int settick_timer(int tid, unsigned int tick)
+{
+ int i,j;
+ if (timer_data[tid].tick == tick)
+ return tick;
+
+ //FIXME: This search is not all that effective... there doesn't seems to be a better way to locate an element in the heap.
+ for(i = timer_heap_num-1; i >= 0 && timer_heap[i] != tid; i--);
+
+ if (i < 0)
+ return -1; //Sort of impossible, isn't it?
+ if (DIFF_TICK(timer_data[tid].tick, tick) > 0)
+ { //Timer is accelerated, shift timer near the end of the heap.
+ if (i == timer_heap_num-1) //Nothing to shift.
+ j = timer_heap_num-1;
+ else {
+ for (j = i+1; j < timer_heap_num && DIFF_TICK(timer_data[j].tick, tick) > 0; j++);
+ j--;
+ memmove(&timer_heap[i], &timer_heap[i+1], (j-i)*sizeof(int));
+ }
+ } else { //Timer is delayed, shift timer near the beginning of the heap.
+ if (i == 0) //Nothing to shift.
+ j = 0;
+ else {
+ for (j = i-1; j >= 0 && DIFF_TICK(timer_data[j].tick, tick) < 0; j--);
+ j++;
+ memmove(&timer_heap[j+1], &timer_heap[j], (i-j)*sizeof(int));
+ }
+ }
+ timer_heap[j] = tid;
+ timer_data[tid].tick = tick;
+ return tick;
+}
+
+struct TimerData* get_timer(int tid)
+{
+ return &timer_data[tid];
+}
+
+//Correcting the heap when the tick overflows is an idea taken from jA to
+//prevent timer problems. Thanks to [End of Exam] for providing the required data. [Skotlex]
+//This funtion will rearrange the heap and assign new tick values.
+static void fix_timer_heap(unsigned int tick)
+{
+ if (timer_heap_num >= 0 && tick < 0x00010000 && timer_data[timer_heap[0]].tick > 0xf0000000)
+ { //The last timer is way too far into the future, and the current tick is too close to 0, overflow was very likely
+ //(not perfect, but will work as long as the timer is not expected to happen 50 or so days into the future)
+ int i;
+ int *tmp_heap;
+ for (i=0; i < timer_heap_num && timer_data[timer_heap[i]].tick > 0xf0000000; i++)
+ { //All functions with high tick value should had been executed already...
+ timer_data[timer_heap[i]].tick = 0;
+ }
+ //Move elements to readjust the heap.
+ tmp_heap = aCalloc(sizeof(int), i);
+ memmove(&tmp_heap[0], &timer_heap[0], i*sizeof(int));
+ memmove(&timer_heap[0], &timer_heap[i], (timer_heap_num-i)*sizeof(int));
+ memmove(&timer_heap[timer_heap_num-i], &tmp_heap[0], i*sizeof(int));
+ aFree(tmp_heap);
+ }
+}
+
+int do_timer(unsigned int tick)
+{
+ int i, nextmin = 1000;
+
+ if (tick < 0x010000 && fix_heap_flag)
+ {
+ fix_timer_heap(tick);
+ fix_heap_flag = 0;
+ }
+
+ while(timer_heap_num) {
+ i = timer_heap[timer_heap_num - 1]; // next shorter element
+ if ((nextmin = DIFF_TICK(timer_data[i].tick, tick)) > 0)
+ break;
+ if (timer_heap_num > 0) // suppress the actual element from the table
+ timer_heap_num--;
+ timer_data[i].type |= TIMER_REMOVE_HEAP;
+ if (timer_data[i].func) {
+ if (nextmin < -1000) {
+ // 1•bˆÈã‚Ì‘å•‚È’x‰„‚ª”­¶‚µ‚Ä‚¢‚é‚Ì‚ÅA
+ // timerˆ—ƒ^ƒCƒ~ƒ“ƒO‚ðŒ»Ý’l‚Æ‚·‚鎖‚Å
+ // ŒÄ‚Ño‚µŽžƒ^ƒCƒ~ƒ“ƒO(ˆø”‚Ìtick)‘Š‘΂ň—‚µ‚Ä‚é
+ // timerŠÖ”‚ÌŽŸ‰ñˆ—ƒ^ƒCƒ~ƒ“ƒO‚ð’x‚点‚é
+ timer_data[i].func(i, tick, timer_data[i].id, timer_data[i].data);
+ } else {
+ timer_data[i].func(i, timer_data[i].tick, timer_data[i].id, timer_data[i].data);
+ }
+ }
+ if (timer_data[i].type & TIMER_REMOVE_HEAP) {
+ switch(timer_data[i].type & ~TIMER_REMOVE_HEAP) {
+ case TIMER_ONCE_AUTODEL:
+ timer_data[i].type = 0;
+ if (free_timer_list_pos >= free_timer_list_max) {
+ free_timer_list_max += 256;
+ free_timer_list = (int *) aRealloc(free_timer_list, sizeof(int) * free_timer_list_max);
+ malloc_tsetdword(free_timer_list + (free_timer_list_max - 256), 0, 256 * sizeof(int));
+ }
+ free_timer_list[free_timer_list_pos++] = i;
+ break;
+ case TIMER_INTERVAL:
+ if (DIFF_TICK(timer_data[i].tick , tick) < -1000) {
+ timer_data[i].tick = tick + timer_data[i].interval;
+ } else {
+ timer_data[i].tick += timer_data[i].interval;
+ }
+ timer_data[i].type &= ~TIMER_REMOVE_HEAP;
+ push_timer_heap(i);
+ break;
+ }
+ }
+ }
+
+ if (nextmin < TIMER_MIN_INTERVAL)
+ nextmin = TIMER_MIN_INTERVAL;
+
+ if ((unsigned int)(tick + nextmin) < tick) //Tick will loop, rearrange the heap on the next iteration.
+ fix_heap_flag = 1;
+ return nextmin;
+}
+
+unsigned long get_uptime (void)
+{
+ return (unsigned long) difftime (time(NULL), start_time);
+}
+
+void timer_init(void)
+{
+ time(&start_time);
+}
+
+void timer_final(void)
+{
+ struct timer_func_list* tfl = tfl_root, *tfl2;
+
+ while (tfl) {
+ tfl2 = tfl->next; // copy next pointer
+ aFree(tfl->name); // free structures
+ aFree(tfl);
+ tfl = tfl2; // use copied pointer for next cycle
+ }
+
+ if (timer_data) aFree(timer_data);
+ if (timer_heap) aFree(timer_heap);
+ if (free_timer_list) aFree(free_timer_list);
+}
+
diff --git a/src/common/timer.h b/src/common/timer.h
index aafefd1e2..9acc7c640 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -1,60 +1,60 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _TIMER_H_
-#define _TIMER_H_
-
-#ifdef __WIN32
-/* We need winsock lib to have timeval struct - windows is weirdo */
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#endif
-
-#define BASE_TICK 5
-
-#define TIMER_ONCE_AUTODEL 1
-#define TIMER_INTERVAL 2
-#define TIMER_REMOVE_HEAP 16
-
-#define DIFF_TICK(a,b) ((int)((a)-(b)))
-
-// Struct declaration
-
-struct TimerData {
- unsigned int tick;
- int (*func)(int,unsigned int,int,int);
- int id;
- int data;
- int type;
- int interval;
- int heap_pos;
-};
-
-// Function prototype declaration
-
-#ifdef __WIN32
-void gettimeofday(struct timeval *t, void *dummy);
-#endif
-
-unsigned int gettick_nocache(void);
-unsigned int gettick(void);
-
-int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int);
-int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
-int delete_timer(int,int (*)(int,unsigned int,int,int));
-
-int addtick_timer(int tid,unsigned int tick);
-int settick_timer(int tid,unsigned int tick);
-struct TimerData *get_timer(int tid);
-
-int do_timer(unsigned int tick);
-
-int add_timer_func_list(int (*)(int,unsigned int,int,int),char*);
-char* search_timer_func_list(int (*)(int,unsigned int,int,int));
-
-unsigned long get_uptime(void);
-
-void timer_init(void);
-void timer_final(void);
-
-#endif // _TIMER_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _TIMER_H_
+#define _TIMER_H_
+
+#ifdef __WIN32
+/* We need winsock lib to have timeval struct - windows is weirdo */
+#define __USE_W32_SOCKETS
+#include <windows.h>
+#endif
+
+#define BASE_TICK 5
+
+#define TIMER_ONCE_AUTODEL 1
+#define TIMER_INTERVAL 2
+#define TIMER_REMOVE_HEAP 16
+
+#define DIFF_TICK(a,b) ((int)((a)-(b)))
+
+// Struct declaration
+
+struct TimerData {
+ unsigned int tick;
+ int (*func)(int,unsigned int,int,int);
+ int id;
+ int data;
+ int type;
+ int interval;
+ int heap_pos;
+};
+
+// Function prototype declaration
+
+#ifdef __WIN32
+void gettimeofday(struct timeval *t, void *dummy);
+#endif
+
+unsigned int gettick_nocache(void);
+unsigned int gettick(void);
+
+int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int);
+int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
+int delete_timer(int,int (*)(int,unsigned int,int,int));
+
+int addtick_timer(int tid,unsigned int tick);
+int settick_timer(int tid,unsigned int tick);
+struct TimerData *get_timer(int tid);
+
+int do_timer(unsigned int tick);
+
+int add_timer_func_list(int (*)(int,unsigned int,int,int),char*);
+char* search_timer_func_list(int (*)(int,unsigned int,int,int));
+
+unsigned long get_uptime(void);
+
+void timer_init(void);
+void timer_final(void);
+
+#endif // _TIMER_H_
diff --git a/src/common/utils.c b/src/common/utils.c
index bbf9f8398..3172e89d9 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -1,384 +1,384 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef WIN32
- #include <windows.h>
- #define PATHSEP '\\'
-#else
- #include <unistd.h>
- #include <dirent.h>
- #include <sys/stat.h>
- #define PATHSEP '/'
-#endif
-
-#include "utils.h"
-#include "../common/mmo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-void dump(unsigned char *buffer, int num)
-{
- int icnt,jcnt;
-
- printf(" Hex ASCII\n");
- printf(" ----------------------------------------------- ----------------");
-
- for (icnt=0;icnt<num;icnt+=16) {
- printf("\n%p ",&buffer[icnt]);
- for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
- if (jcnt < num) {
- printf("%02hX ",buffer[jcnt]);
- } else
- printf(" ");
- }
-
- printf(" | ");
-
- for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
- if (jcnt < num) {
- if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
- printf("%c",buffer[jcnt]);
- else
- printf(".");
- } else
- printf(" ");
- }
- }
- printf("\n");
-}
-
-//NOTE: There is no need to use this function as the standard sqrt is plenty fast as it is. [Skotlex]
-int newt_sqrt(int input)
-{
- int new_value, value = input/2, count = 0;
- if (!value) //Division by zero fix, pointed out by Shinomori. [Skotlex]
- return input;
- do
- {
- new_value = (value + input/value)>>1;
- if (abs(value - new_value) <= 1)
- return new_value;
- value = new_value;
- }
- while (count++ < 25);
- return new_value;
-}
-
-#if defined(_WIN32) && !defined(MINGW)
-char *rindex(char *str, char c)
-{
- char *sptr;
-
- sptr = str;
- while(*sptr)
- ++sptr;
- if (c == '\0')
- return(sptr);
- while(str != sptr)
- if (*sptr-- == c)
- return(++sptr);
- return(NULL);
-}
-
-int strcasecmp(const char *arg1, const char *arg2)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL) {
- ShowError("strcasecmp: received a NULL pointer, %p or %p.\n", arg1, arg2);
- return (0);
- }
-
- for (i = 0; arg1[i] || arg2[i]; i++)
- if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-int strncasecmp(const char *arg1, const char *arg2, size_t n)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL) {
- ShowError("strncasecmp(): received a NULL pointer, %p or %p.\n", arg1, arg2);
- return (0);
- }
-
- for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--)
- if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-void str_upper(char *name)
-{
-
- int len = (int)strlen(name);
- while (len--) {
- if (*name >= 'a' && *name <= 'z')
- *name -= ('a' - 'A');
- name++;
- }
-}
-
-void str_lower(char *name)
-{
- int len = (int)strlen(name);
-
- while (len--) {
- if (*name >= 'A' && *name <= 'Z')
- *name += ('a' - 'A');
- name++;
- }
-}
-
-#endif
-
-// Allocate a StringBuf [MouseJstr]
-struct StringBuf * StringBuf_Malloc()
-{
- struct StringBuf * ret = (struct StringBuf *) aMallocA(sizeof(struct StringBuf));
- StringBuf_Init(ret);
- return ret;
-}
-
-// Initialize a previously allocated StringBuf [MouseJstr]
-void StringBuf_Init(struct StringBuf * sbuf) {
- sbuf->max_ = 1024;
- sbuf->ptr_ = sbuf->buf_ = (char *) aMallocA(sbuf->max_ + 1);
-}
-
-// printf into a StringBuf, moving the pointer [MouseJstr]
-int StringBuf_Printf(struct StringBuf *sbuf,const char *fmt,...)
-{
- va_list ap;
- int n, size, off;
-
- while (1) {
- /* Try to print in the allocated space. */
- va_start(ap, fmt);
- size = sbuf->max_ - (sbuf->ptr_ - sbuf->buf_);
- n = vsnprintf (sbuf->ptr_, size, fmt, ap);
- va_end(ap);
- /* If that worked, return the length. */
- if (n > -1 && n < size) {
- sbuf->ptr_ += n;
- return (int)(sbuf->ptr_ - sbuf->buf_);
- }
- /* Else try again with more space. */
- sbuf->max_ *= 2; // twice the old size
- off = (int)(sbuf->ptr_ - sbuf->buf_);
- sbuf->buf_ = (char *) aRealloc(sbuf->buf_, sbuf->max_ + 1);
- sbuf->ptr_ = sbuf->buf_ + off;
- }
-}
-
-// Append buf2 onto the end of buf1 [MouseJstr]
-int StringBuf_Append(struct StringBuf *buf1,const struct StringBuf *buf2)
-{
- int buf1_avail = buf1->max_ - (buf1->ptr_ - buf1->buf_);
- int size2 = (int)(buf2->ptr_ - buf2->buf_);
-
- if (size2 >= buf1_avail) {
- int off = (int)(buf1->ptr_ - buf1->buf_);
- buf1->max_ += size2;
- buf1->buf_ = (char *) aRealloc(buf1->buf_, buf1->max_ + 1);
- buf1->ptr_ = buf1->buf_ + off;
- }
-
- memcpy(buf1->ptr_, buf2->buf_, size2);
- buf1->ptr_ += size2;
- return (int)(buf1->ptr_ - buf1->buf_);
-}
-
-// Destroy a StringBuf [MouseJstr]
-void StringBuf_Destroy(struct StringBuf *sbuf)
-{
- aFree(sbuf->buf_);
- sbuf->ptr_ = sbuf->buf_ = 0;
-}
-
-// Free a StringBuf returned by StringBuf_Malloc [MouseJstr]
-void StringBuf_Free(struct StringBuf *sbuf)
-{
- StringBuf_Destroy(sbuf);
- aFree(sbuf);
-}
-
-// Return the built string from the StringBuf [MouseJstr]
-char * StringBuf_Value(struct StringBuf *sbuf)
-{
- *sbuf->ptr_ = '\0';
- return sbuf->buf_;
-}
-
-#ifdef WIN32
-
-char* checkpath(char *path, const char *srcpath)
-{ // just make sure the char*path is not const
- char *p=path;
- if(NULL!=path && NULL!=srcpath)
- while(*srcpath) {
- if (*srcpath=='/') {
- *p++ = '\\';
- srcpath++;
- }
- else
- *p++ = *srcpath++;
- }
- *p = *srcpath; //EOS
- return path;
-}
-
-void findfile(const char *p, const char *pat, void (func)(const char*))
-{
- WIN32_FIND_DATA FindFileData;
- HANDLE hFind;
- char tmppath[MAX_PATH+1];
-
- const char *path = (p ==NULL)? "." : p;
- const char *pattern = (pat==NULL)? "" : pat;
-
- checkpath(tmppath,path);
- if( PATHSEP != tmppath[strlen(tmppath)-1])
- strcat(tmppath, "\\*");
- else
- strcat(tmppath, "*");
-
- hFind = FindFirstFile(tmppath, &FindFileData);
- if (hFind != INVALID_HANDLE_VALUE)
- {
- do
- {
- if (strcmp(FindFileData.cFileName, ".") == 0)
- continue;
- if (strcmp(FindFileData.cFileName, "..") == 0)
- continue;
-
- sprintf(tmppath,"%s%c%s",path,PATHSEP,FindFileData.cFileName);
-
- if (FindFileData.cFileName && strstr(FindFileData.cFileName, pattern)) {
- func( tmppath );
- }
-
-
- if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
- {
- findfile(tmppath, pat, func);
- }
- }while (FindNextFile(hFind, &FindFileData) != 0);
- FindClose(hFind);
- }
- return;
-}
-#else
-
-#define MAX_DIR_PATH 2048
-
-char* checkpath(char *path, const char*srcpath)
-{ // just make sure the char*path is not const
- char *p=path;
- if(NULL!=path && NULL!=srcpath)
- while(*srcpath) {
- if (*srcpath=='\\') {
- *p++ = '/';
- srcpath++;
- }
- else
- *p++ = *srcpath++;
- }
- *p = *srcpath; //EOS
- return path;
-}
-
-void findfile(const char *p, const char *pat, void (func)(const char*))
-{
- DIR* dir; // pointer to the scanned directory.
- struct dirent* entry; // pointer to one directory entry.
- struct stat dir_stat; // used by stat().
- char tmppath[MAX_DIR_PATH+1];
- char path[MAX_DIR_PATH+1]= ".";
- const char *pattern = (pat==NULL)? "" : pat;
- if(p!=NULL) strcpy(path,p);
-
- // open the directory for reading
- dir = opendir( checkpath(path, path) );
- if (!dir) {
- ShowError("Cannot read directory '%s'\n", path);
- return;
- }
-
- // scan the directory, traversing each sub-directory
- // matching the pattern for each file name.
- while ((entry = readdir(dir))) {
- // skip the "." and ".." entries.
- if (strcmp(entry->d_name, ".") == 0)
- continue;
- if (strcmp(entry->d_name, "..") == 0)
- continue;
-
- sprintf(tmppath,"%s%c%s",path, PATHSEP, entry->d_name);
-
- // check if the pattern matchs.
- if (entry->d_name && strstr(entry->d_name, pattern)) {
- func( tmppath );
- }
- // check if it is a directory.
- if (stat(tmppath, &dir_stat) == -1) {
- ShowError("stat error %s\n': ", tmppath);
- continue;
- }
- // is this a directory?
- if (S_ISDIR(dir_stat.st_mode)) {
- // decent recursivly
- findfile(tmppath, pat, func);
- }
- }//end while
-}
-#endif
-
-unsigned char GetByte(unsigned long val, size_t num)
-{
- switch(num)
- {
- case 0:
- return (unsigned char)((val & 0x000000FF) );
- case 1:
- return (unsigned char)((val & 0x0000FF00)>>0x08);
- case 2:
- return (unsigned char)((val & 0x00FF0000)>>0x10);
- case 3:
- return (unsigned char)((val & 0xFF000000)>>0x18);
- default:
- return 0; //better throw something here
- }
-}
-unsigned short GetWord(unsigned long val, size_t num)
-{
- switch(num)
- {
- case 0:
- return (unsigned short)((val & 0x0000FFFF) );
- case 1:
- return (unsigned short)((val & 0xFFFF0000)>>0x10);
- default:
- return 0; //better throw something here
- }
-}
-unsigned short MakeWord(unsigned char byte0, unsigned char byte1)
-{
- return byte0 | (byte1<<0x08);
-}
-unsigned long MakeDWord(unsigned short word0, unsigned short word1)
-{
- return ((unsigned long)word0)
- | ((unsigned long)word1<<0x10);
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WIN32
+ #include <windows.h>
+ #define PATHSEP '\\'
+#else
+ #include <unistd.h>
+ #include <dirent.h>
+ #include <sys/stat.h>
+ #define PATHSEP '/'
+#endif
+
+#include "utils.h"
+#include "../common/mmo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
+void dump(unsigned char *buffer, int num)
+{
+ int icnt,jcnt;
+
+ printf(" Hex ASCII\n");
+ printf(" ----------------------------------------------- ----------------");
+
+ for (icnt=0;icnt<num;icnt+=16) {
+ printf("\n%p ",&buffer[icnt]);
+ for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
+ if (jcnt < num) {
+ printf("%02hX ",buffer[jcnt]);
+ } else
+ printf(" ");
+ }
+
+ printf(" | ");
+
+ for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
+ if (jcnt < num) {
+ if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
+ printf("%c",buffer[jcnt]);
+ else
+ printf(".");
+ } else
+ printf(" ");
+ }
+ }
+ printf("\n");
+}
+
+//NOTE: There is no need to use this function as the standard sqrt is plenty fast as it is. [Skotlex]
+int newt_sqrt(int input)
+{
+ int new_value, value = input/2, count = 0;
+ if (!value) //Division by zero fix, pointed out by Shinomori. [Skotlex]
+ return input;
+ do
+ {
+ new_value = (value + input/value)>>1;
+ if (abs(value - new_value) <= 1)
+ return new_value;
+ value = new_value;
+ }
+ while (count++ < 25);
+ return new_value;
+}
+
+#if defined(_WIN32) && !defined(MINGW)
+char *rindex(char *str, char c)
+{
+ char *sptr;
+
+ sptr = str;
+ while(*sptr)
+ ++sptr;
+ if (c == '\0')
+ return(sptr);
+ while(str != sptr)
+ if (*sptr-- == c)
+ return(++sptr);
+ return(NULL);
+}
+
+int strcasecmp(const char *arg1, const char *arg2)
+{
+ int chk, i;
+
+ if (arg1 == NULL || arg2 == NULL) {
+ ShowError("strcasecmp: received a NULL pointer, %p or %p.\n", arg1, arg2);
+ return (0);
+ }
+
+ for (i = 0; arg1[i] || arg2[i]; i++)
+ if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
+ return (chk); /* not equal */
+
+ return (0);
+}
+
+int strncasecmp(const char *arg1, const char *arg2, size_t n)
+{
+ int chk, i;
+
+ if (arg1 == NULL || arg2 == NULL) {
+ ShowError("strncasecmp(): received a NULL pointer, %p or %p.\n", arg1, arg2);
+ return (0);
+ }
+
+ for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--)
+ if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
+ return (chk); /* not equal */
+
+ return (0);
+}
+
+void str_upper(char *name)
+{
+
+ int len = (int)strlen(name);
+ while (len--) {
+ if (*name >= 'a' && *name <= 'z')
+ *name -= ('a' - 'A');
+ name++;
+ }
+}
+
+void str_lower(char *name)
+{
+ int len = (int)strlen(name);
+
+ while (len--) {
+ if (*name >= 'A' && *name <= 'Z')
+ *name += ('a' - 'A');
+ name++;
+ }
+}
+
+#endif
+
+// Allocate a StringBuf [MouseJstr]
+struct StringBuf * StringBuf_Malloc()
+{
+ struct StringBuf * ret = (struct StringBuf *) aMallocA(sizeof(struct StringBuf));
+ StringBuf_Init(ret);
+ return ret;
+}
+
+// Initialize a previously allocated StringBuf [MouseJstr]
+void StringBuf_Init(struct StringBuf * sbuf) {
+ sbuf->max_ = 1024;
+ sbuf->ptr_ = sbuf->buf_ = (char *) aMallocA(sbuf->max_ + 1);
+}
+
+// printf into a StringBuf, moving the pointer [MouseJstr]
+int StringBuf_Printf(struct StringBuf *sbuf,const char *fmt,...)
+{
+ va_list ap;
+ int n, size, off;
+
+ while (1) {
+ /* Try to print in the allocated space. */
+ va_start(ap, fmt);
+ size = sbuf->max_ - (sbuf->ptr_ - sbuf->buf_);
+ n = vsnprintf (sbuf->ptr_, size, fmt, ap);
+ va_end(ap);
+ /* If that worked, return the length. */
+ if (n > -1 && n < size) {
+ sbuf->ptr_ += n;
+ return (int)(sbuf->ptr_ - sbuf->buf_);
+ }
+ /* Else try again with more space. */
+ sbuf->max_ *= 2; // twice the old size
+ off = (int)(sbuf->ptr_ - sbuf->buf_);
+ sbuf->buf_ = (char *) aRealloc(sbuf->buf_, sbuf->max_ + 1);
+ sbuf->ptr_ = sbuf->buf_ + off;
+ }
+}
+
+// Append buf2 onto the end of buf1 [MouseJstr]
+int StringBuf_Append(struct StringBuf *buf1,const struct StringBuf *buf2)
+{
+ int buf1_avail = buf1->max_ - (buf1->ptr_ - buf1->buf_);
+ int size2 = (int)(buf2->ptr_ - buf2->buf_);
+
+ if (size2 >= buf1_avail) {
+ int off = (int)(buf1->ptr_ - buf1->buf_);
+ buf1->max_ += size2;
+ buf1->buf_ = (char *) aRealloc(buf1->buf_, buf1->max_ + 1);
+ buf1->ptr_ = buf1->buf_ + off;
+ }
+
+ memcpy(buf1->ptr_, buf2->buf_, size2);
+ buf1->ptr_ += size2;
+ return (int)(buf1->ptr_ - buf1->buf_);
+}
+
+// Destroy a StringBuf [MouseJstr]
+void StringBuf_Destroy(struct StringBuf *sbuf)
+{
+ aFree(sbuf->buf_);
+ sbuf->ptr_ = sbuf->buf_ = 0;
+}
+
+// Free a StringBuf returned by StringBuf_Malloc [MouseJstr]
+void StringBuf_Free(struct StringBuf *sbuf)
+{
+ StringBuf_Destroy(sbuf);
+ aFree(sbuf);
+}
+
+// Return the built string from the StringBuf [MouseJstr]
+char * StringBuf_Value(struct StringBuf *sbuf)
+{
+ *sbuf->ptr_ = '\0';
+ return sbuf->buf_;
+}
+
+#ifdef WIN32
+
+char* checkpath(char *path, const char *srcpath)
+{ // just make sure the char*path is not const
+ char *p=path;
+ if(NULL!=path && NULL!=srcpath)
+ while(*srcpath) {
+ if (*srcpath=='/') {
+ *p++ = '\\';
+ srcpath++;
+ }
+ else
+ *p++ = *srcpath++;
+ }
+ *p = *srcpath; //EOS
+ return path;
+}
+
+void findfile(const char *p, const char *pat, void (func)(const char*))
+{
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ char tmppath[MAX_PATH+1];
+
+ const char *path = (p ==NULL)? "." : p;
+ const char *pattern = (pat==NULL)? "" : pat;
+
+ checkpath(tmppath,path);
+ if( PATHSEP != tmppath[strlen(tmppath)-1])
+ strcat(tmppath, "\\*");
+ else
+ strcat(tmppath, "*");
+
+ hFind = FindFirstFile(tmppath, &FindFileData);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (strcmp(FindFileData.cFileName, ".") == 0)
+ continue;
+ if (strcmp(FindFileData.cFileName, "..") == 0)
+ continue;
+
+ sprintf(tmppath,"%s%c%s",path,PATHSEP,FindFileData.cFileName);
+
+ if (FindFileData.cFileName && strstr(FindFileData.cFileName, pattern)) {
+ func( tmppath );
+ }
+
+
+ if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
+ {
+ findfile(tmppath, pat, func);
+ }
+ }while (FindNextFile(hFind, &FindFileData) != 0);
+ FindClose(hFind);
+ }
+ return;
+}
+#else
+
+#define MAX_DIR_PATH 2048
+
+char* checkpath(char *path, const char*srcpath)
+{ // just make sure the char*path is not const
+ char *p=path;
+ if(NULL!=path && NULL!=srcpath)
+ while(*srcpath) {
+ if (*srcpath=='\\') {
+ *p++ = '/';
+ srcpath++;
+ }
+ else
+ *p++ = *srcpath++;
+ }
+ *p = *srcpath; //EOS
+ return path;
+}
+
+void findfile(const char *p, const char *pat, void (func)(const char*))
+{
+ DIR* dir; // pointer to the scanned directory.
+ struct dirent* entry; // pointer to one directory entry.
+ struct stat dir_stat; // used by stat().
+ char tmppath[MAX_DIR_PATH+1];
+ char path[MAX_DIR_PATH+1]= ".";
+ const char *pattern = (pat==NULL)? "" : pat;
+ if(p!=NULL) strcpy(path,p);
+
+ // open the directory for reading
+ dir = opendir( checkpath(path, path) );
+ if (!dir) {
+ ShowError("Cannot read directory '%s'\n", path);
+ return;
+ }
+
+ // scan the directory, traversing each sub-directory
+ // matching the pattern for each file name.
+ while ((entry = readdir(dir))) {
+ // skip the "." and ".." entries.
+ if (strcmp(entry->d_name, ".") == 0)
+ continue;
+ if (strcmp(entry->d_name, "..") == 0)
+ continue;
+
+ sprintf(tmppath,"%s%c%s",path, PATHSEP, entry->d_name);
+
+ // check if the pattern matchs.
+ if (entry->d_name && strstr(entry->d_name, pattern)) {
+ func( tmppath );
+ }
+ // check if it is a directory.
+ if (stat(tmppath, &dir_stat) == -1) {
+ ShowError("stat error %s\n': ", tmppath);
+ continue;
+ }
+ // is this a directory?
+ if (S_ISDIR(dir_stat.st_mode)) {
+ // decent recursivly
+ findfile(tmppath, pat, func);
+ }
+ }//end while
+}
+#endif
+
+unsigned char GetByte(unsigned long val, size_t num)
+{
+ switch(num)
+ {
+ case 0:
+ return (unsigned char)((val & 0x000000FF) );
+ case 1:
+ return (unsigned char)((val & 0x0000FF00)>>0x08);
+ case 2:
+ return (unsigned char)((val & 0x00FF0000)>>0x10);
+ case 3:
+ return (unsigned char)((val & 0xFF000000)>>0x18);
+ default:
+ return 0; //better throw something here
+ }
+}
+unsigned short GetWord(unsigned long val, size_t num)
+{
+ switch(num)
+ {
+ case 0:
+ return (unsigned short)((val & 0x0000FFFF) );
+ case 1:
+ return (unsigned short)((val & 0xFFFF0000)>>0x10);
+ default:
+ return 0; //better throw something here
+ }
+}
+unsigned short MakeWord(unsigned char byte0, unsigned char byte1)
+{
+ return byte0 | (byte1<<0x08);
+}
+unsigned long MakeDWord(unsigned short word0, unsigned short word1)
+{
+ return ((unsigned long)word0)
+ | ((unsigned long)word1<<0x10);
+}
+
diff --git a/src/common/utils.h b/src/common/utils.h
index 7c3c1f40c..1f7eeba5c 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -1,52 +1,52 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef COMMON_UTILS_H
-#define COMMON_UTILS_H
-
-
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-#define LOWER(c) (((c)>='A' && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))
-#define UPPER(c) (((c)>='a' && (c) <= 'z') ? ((c)+('A'-'a')) : (c) )
-
-/* strcasecmp -> stricmp -> str_cmp */
-#if defined(_WIN32) && !defined(MINGW)
- int strcasecmp(const char *arg1, const char *arg2);
- int strncasecmp(const char *arg1, const char *arg2, size_t n);
- void str_upper(char *name);
- void str_lower(char *name);
- char *rindex(char *str, char c);
-#endif
-
-void dump(unsigned char *buffer, int num);
-int newt_sqrt(int value); //Newton aproximation for getting a fast sqrt.
-
-struct StringBuf {
- char *buf_;
- char *ptr_;
- unsigned int max_;
-};
-
-struct StringBuf * StringBuf_Malloc(void);
-void StringBuf_Init(struct StringBuf *);
-int StringBuf_Printf(struct StringBuf *,const char *,...);
-int StringBuf_Append(struct StringBuf *,const struct StringBuf *);
-char * StringBuf_Value(struct StringBuf *);
-void StringBuf_Destroy(struct StringBuf *);
-void StringBuf_Free(struct StringBuf *);
-
-void findfile(const char *p, const char *pat, void (func)(const char*));
-
-//////////////////////////////////////////////////////////////////////////
-// byte word dword access [Shinomori]
-//////////////////////////////////////////////////////////////////////////
-
-extern unsigned char GetByte(unsigned long val, size_t num);
-extern unsigned short GetWord(unsigned long val, size_t num);
-extern unsigned short MakeWord(unsigned char byte0, unsigned char byte1);
-extern unsigned long MakeDWord(unsigned short word0, unsigned short word1);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef COMMON_UTILS_H
+#define COMMON_UTILS_H
+
+
+#ifndef NULL
+#define NULL (void *)0
+#endif
+
+#define LOWER(c) (((c)>='A' && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))
+#define UPPER(c) (((c)>='a' && (c) <= 'z') ? ((c)+('A'-'a')) : (c) )
+
+/* strcasecmp -> stricmp -> str_cmp */
+#if defined(_WIN32) && !defined(MINGW)
+ int strcasecmp(const char *arg1, const char *arg2);
+ int strncasecmp(const char *arg1, const char *arg2, size_t n);
+ void str_upper(char *name);
+ void str_lower(char *name);
+ char *rindex(char *str, char c);
+#endif
+
+void dump(unsigned char *buffer, int num);
+int newt_sqrt(int value); //Newton aproximation for getting a fast sqrt.
+
+struct StringBuf {
+ char *buf_;
+ char *ptr_;
+ unsigned int max_;
+};
+
+struct StringBuf * StringBuf_Malloc(void);
+void StringBuf_Init(struct StringBuf *);
+int StringBuf_Printf(struct StringBuf *,const char *,...);
+int StringBuf_Append(struct StringBuf *,const struct StringBuf *);
+char * StringBuf_Value(struct StringBuf *);
+void StringBuf_Destroy(struct StringBuf *);
+void StringBuf_Free(struct StringBuf *);
+
+void findfile(const char *p, const char *pat, void (func)(const char*));
+
+//////////////////////////////////////////////////////////////////////////
+// byte word dword access [Shinomori]
+//////////////////////////////////////////////////////////////////////////
+
+extern unsigned char GetByte(unsigned long val, size_t num);
+extern unsigned short GetWord(unsigned long val, size_t num);
+extern unsigned short MakeWord(unsigned char byte0, unsigned char byte1);
+extern unsigned long MakeDWord(unsigned short word0, unsigned short word1);
+
+#endif
diff --git a/src/common/version.h b/src/common/version.h
index 1c7961ee1..2560c1019 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -1,30 +1,30 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _VERSION_H_
-#define _VERSION_H_
-
-#define ATHENA_MAJOR_VERSION 1 // Major Version
-#define ATHENA_MINOR_VERSION 0 // Minor Version
-#define ATHENA_REVISION 0 // Revision
-
-#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
-#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
-
-#define ATHENA_SERVER_NONE 0 // not defined
-#define ATHENA_SERVER_LOGIN 1 // login server
-#define ATHENA_SERVER_CHAR 2 // char server
-#define ATHENA_SERVER_INTER 4 // inter server
-#define ATHENA_SERVER_MAP 8 // map server
-
-// ATHENA_MOD_VERSION‚̓pƒbƒ`”Ô†‚Å‚·B
-// ‚±‚ê‚Í–³—‚É•Ï‚¦‚È‚­‚Ä‚à‹C‚ªŒü‚¢‚½‚ç•Ï‚¦‚é’ö“x‚̈µ‚¢‚ÅB
-// i–ˆ‰ñƒAƒbƒvƒ[ƒh‚Ì“x‚É•ÏX‚·‚é‚Ì‚à–Ê“|‚ÆŽv‚í‚ê‚邵A‚»‚à‚»‚à
-// @‚±‚Ì€–Ú‚ðŽQÆ‚·‚él‚ª‚¢‚é‚©‚Ç‚¤‚©‚Å‹^–₾‚©‚çBj
-// ‚»‚Ì’ö“x‚̈µ‚¢‚È‚Ì‚ÅAƒT[ƒo[‚É–â‚¢‡‚킹‚鑤‚àA‚ ‚­‚Ü‚Å–ÚˆÀ’ö“x‚̈µ‚¢‚Å
-// ‚ ‚ñ‚Ü‚èM—p‚µ‚È‚¢‚±‚ÆB
-// ŽIsnapshot‚ÌŽž‚âA‘å‚«‚È•ÏX‚ª‚ ‚Á‚½ê‡‚Íݒ肵‚Ä‚Ù‚µ‚¢‚Å‚·B
-// CŒ¾Œê‚ÌŽd—lãAʼn‚É0‚ð•t‚¯‚é‚Æ8i”‚É‚È‚é‚̂ŊԈႦ‚È‚¢‚ʼnº‚³‚¢B
-#define ATHENA_MOD_VERSION 1249 // mod version (patch No.)
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _VERSION_H_
+#define _VERSION_H_
+
+#define ATHENA_MAJOR_VERSION 1 // Major Version
+#define ATHENA_MINOR_VERSION 0 // Minor Version
+#define ATHENA_REVISION 0 // Revision
+
+#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
+#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
+
+#define ATHENA_SERVER_NONE 0 // not defined
+#define ATHENA_SERVER_LOGIN 1 // login server
+#define ATHENA_SERVER_CHAR 2 // char server
+#define ATHENA_SERVER_INTER 4 // inter server
+#define ATHENA_SERVER_MAP 8 // map server
+
+// ATHENA_MOD_VERSION‚̓pƒbƒ`”Ô†‚Å‚·B
+// ‚±‚ê‚Í–³—‚É•Ï‚¦‚È‚­‚Ä‚à‹C‚ªŒü‚¢‚½‚ç•Ï‚¦‚é’ö“x‚̈µ‚¢‚ÅB
+// i–ˆ‰ñƒAƒbƒvƒ[ƒh‚Ì“x‚É•ÏX‚·‚é‚Ì‚à–Ê“|‚ÆŽv‚í‚ê‚邵A‚»‚à‚»‚à
+// @‚±‚Ì€–Ú‚ðŽQÆ‚·‚él‚ª‚¢‚é‚©‚Ç‚¤‚©‚Å‹^–₾‚©‚çBj
+// ‚»‚Ì’ö“x‚̈µ‚¢‚È‚Ì‚ÅAƒT[ƒo[‚É–â‚¢‡‚킹‚鑤‚àA‚ ‚­‚Ü‚Å–ÚˆÀ’ö“x‚̈µ‚¢‚Å
+// ‚ ‚ñ‚Ü‚èM—p‚µ‚È‚¢‚±‚ÆB
+// ŽIsnapshot‚ÌŽž‚âA‘å‚«‚È•ÏX‚ª‚ ‚Á‚½ê‡‚Íݒ肵‚Ä‚Ù‚µ‚¢‚Å‚·B
+// CŒ¾Œê‚ÌŽd—lãAʼn‚É0‚ð•t‚¯‚é‚Æ8i”‚É‚È‚é‚̂ŊԈႦ‚È‚¢‚ʼnº‚³‚¢B
+#define ATHENA_MOD_VERSION 1249 // mod version (patch No.)
+
+#endif
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
index 64214f352..848c6f3de 100644
--- a/src/ladmin/ladmin.c
+++ b/src/ladmin/ladmin.c
@@ -1,4436 +1,4436 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-///////////////////////////////////////////////////////////////////////////
-// EAthena login-server remote administration tool
-// Ladamin in C by [Yor]
-// if you modify this software, modify ladmin in tool too.
-///////////////////////////////////////////////////////////////////////////
-
-#include <sys/types.h>
-#include <time.h>
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <winsock2.h>
-void Gettimeofday(struct timeval *timenow)
-{
- time_t t;
- t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
- return;
-}
-#define gettimeofday(timenow, dummy) Gettimeofday(timenow)
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h> // gettimeofday
-#include <sys/ioctl.h>
-#include <unistd.h> // close
-#include <arpa/inet.h> // inet_addr
-#include <netdb.h> // gethostbyname
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h> // str*
-#include <stdarg.h> // valist
-#include <ctype.h> // tolower
-
-#include "../common/core.h"
-#include "../common/strlib.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "ladmin.h"
-#include "../common/version.h"
-#include "../common/mmo.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-//-------------------------------INSTRUCTIONS------------------------------
-// Set the variables below:
-// IP of the login server.
-// Port where the login-server listens incoming packets.
-// Password of administration (same of config_athena.conf).
-// Displayed language of the sofware (if not correct, english is used).
-// IMPORTANT:
-// Be sure that you authorize remote administration in login-server
-// (see login_athena.conf, 'admin_state' parameter)
-//-------------------------------------------------------------------------
-char loginserverip[16] = "127.0.0.1"; // IP of login-server
-int loginserverport = 6900; // Port of login-server
-char loginserveradminpassword[24] = "admin"; // Administration password
-#ifdef PASSWORDENC
-int passenc = 2; // Encoding type of the password
-#else
-int passenc = 0; // Encoding type of the password
-#endif
-char defaultlanguage = 'E'; // Default language (F: Français/E: English)
- // (if it's not 'F', default is English)
-char ladmin_log_filename[1024] = "log/ladmin.log";
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-//-------------------------------------------------------------------------
-// LIST of COMMANDs that you can type at the prompt:
-// To use these commands you can only type only the first letters.
-// You must type a minimum of letters (you can not type 'a',
-// because ladmin doesn't know if it's for 'aide' or for 'add')
-// <Example> q <= quit, li <= list, pass <= passwd, etc.
-//
-// Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
-//
-// aide/help/?
-// Display the description of the commands
-// aide/help/? [command]
-// Display the description of the specified command
-//
-// add <account_name> <sex> <password>
-// Create an account with the default email (a@a.com).
-// Concerning the sex, only the first letter is used (F or M).
-// The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
-// When the password is omitted, the input is done without displaying of the pressed keys.
-// <example> add testname Male testpass
-//
-// ban/banish yyyy/mm/dd hh:mm:ss <account name>
-// Changes the final date of a banishment of an account.
-// Like banset, but <account name> is at end.
-//
-// banadd <account_name> <modifier>
-// Adds or substracts time from the final date of a banishment of an account.
-// Modifier is done as follows:
-// Adjustment value (-1, 1, +1, etc...)
-// Modified element:
-// a or y: year
-// m: month
-// j or d: day
-// h: hour
-// mn: minute
-// s: second
-// <example> banadd testname +1m-2mn1s-6y
-// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-// NOTE: If you modify the final date of a non-banished account,
-// you fix the final date to (actual time +- adjustments)
-//
-// banset <account_name> yyyy/mm/dd [hh:mm:ss]
-// Changes the final date of a banishment of an account.
-// Default time [hh:mm:ss]: 23:59:59.
-// banset <account_name> 0
-// Set a non-banished account (0 = unbanished).
-//
-// block <account name>
-// Set state 5 (You have been blocked by the GM Team) to an account.
-// Like state <account name> 5.
-//
-// check <account_name> <password>
-// Check the validity of a password for an account
-// NOTE: Server will never sends back a password.
-// It's the only method you have to know if a password is correct.
-// The other method is to have a ('physical') access to the accounts file.
-//
-// create <account_name> <sex> <email> <password>
-// Like the 'add' command, but with e-mail moreover.
-// <example> create testname Male my@mail.com testpass
-//
-// del <account name>
-// Remove an account.
-// This order requires confirmation. After confirmation, the account is deleted.
-//
-// email <account_name> <email>
-// Modify the e-mail of an account.
-//
-// getcount
-// Give the number of players online on all char-servers.
-//
-// gm <account_name> [GM_level]
-// Modify the GM level of an account.
-// Default value remove GM level (GM level = 0).
-// <example> gm testname 80
-//
-// id <account name>
-// Give the id of an account.
-//
-// info <account_id>
-// Display complete information of an account.
-//
-// kami <message>
-// Sends a broadcast message on all map-server (in yellow).
-// kamib <message>
-// Sends a broadcast message on all map-server (in blue).
-//
-// language <language>
-// Change the language of displaying.
-//
-// list/ls [start_id [end_id]]
-// Display a list of accounts.
-// 'start_id', 'end_id': indicate end and start identifiers.
-// Research by name is not possible with this command.
-// <example> list 10 9999999
-//
-// listBan/lsBan [start_id [end_id]]
-// Like list/ls, but only for accounts with state or banished
-//
-// listGM/lsGM [start_id [end_id]]
-// Like list/ls, but only for GM accounts
-//
-// listOK/lsOK [start_id [end_id]]
-// Like list/ls, but only for accounts without state and not banished
-//
-// memo <account_name> <memo>
-// Modify the memo of an account.
-// 'memo': it can have until 253 characters (with spaces or not).
-//
-// name <account_id>
-// Give the name of an account.
-//
-// passwd <account_name> <new_password>
-// Change the password of an account.
-// When new password is omitted, the input is done without displaying of the pressed keys.
-//
-// quit/end/exit
-// End of the program of administration
-//
-// reloadGM
-// Reload GM configuration file
-//
-// search <expression>
-// Seek accounts.
-// Displays the accounts whose names correspond.
-// search -r/-e/--expr/--regex <expression>
-// Seek accounts by regular expression.
-// Displays the accounts whose names correspond.
-//
-// sex <account_name> <sex>
-// Modify the sex of an account.
-// <example> sex testname Male
-//
-// state <account_name> <new_state> <error_message_#7>
-// Change the state of an account.
-// 'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
-// 0 = Account ok 6 = Your Game's EXE file is not the latest version
-// 1 = Unregistered ID 7 = You are Prohibited to log in until %s
-// 2 = Incorrect Password 8 = Server is jammed due to over populated
-// 3 = This ID is expired 9 = No MSG
-// 4 = Rejected from Server 100 = This ID has been totally erased
-// 5 = You have been blocked by the GM Team
-// all other values are 'No MSG', then use state 9 please.
-// 'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
-//
-// timeadd <account_name> <modifier>
-// Adds or substracts time from the validity limit of an account.
-// Modifier is done as follows:
-// Adjustment value (-1, 1, +1, etc...)
-// Modified element:
-// a or y: year
-// m: month
-// j or d: day
-// h: hour
-// mn: minute
-// s: second
-// <example> timeadd testname +1m-2mn1s-6y
-// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-// NOTE: You can not modify a unlimited validity limit.
-// If you want modify it, you want probably create a limited validity limit.
-// So, at first, you must set the validity limit to a date/time.
-//
-// timeset <account_name> yyyy/mm/dd [hh:mm:ss]
-// Changes the validity limit of an account.
-// Default time [hh:mm:ss]: 23:59:59.
-// timeset <account_name> 0
-// Gives an unlimited validity limit (0 = unlimited).
-//
-// unban/unbanish <account name>
-// Unban an account.
-// Like banset <account name> 0.
-//
-// unblock <account name>
-// Set state 0 (Account ok) to an account.
-// Like state <account name> 0.
-//
-// version
-// Display the version of the login-server.
-//
-// who <account name>
-// Displays complete information of an account.
-//
-//-------------------------------------------------------------------------
-int login_fd;
-int login_ip;
-int bytes_to_read = 0; // flag to know if we waiting bytes from login-server
-char command[1024];
-char parameters[1024];
-int list_first, list_last, list_type, list_count; // parameter to display a list of accounts
-int already_exit_function = 0; // sometimes, the exit function is called twice... so, don't log twice the message
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int ladmin_log(char *fmt, ...) {
- FILE *logfp;
- va_list ap;
- struct timeval tv;
- char tmpstr[2048];
-
- va_start(ap, fmt);
-
- logfp = fopen(ladmin_log_filename, "a");
- if (logfp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(logfp, RETCODE);
- else {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
- vfprintf(logfp, tmpstr, ap);
- }
- fclose(logfp);
- }
-
- va_end(ap);
- return 0;
-}
-
-//---------------------------------------------
-// Function to return ordonal text of a number.
-//---------------------------------------------
-char* makeordinal(int number) {
- if (defaultlanguage == 'F') {
- if (number == 0)
- return "";
- else if (number == 1)
- return "er";
- else
- return "ème";
- } else {
- if ((number % 10) < 4 && (number % 10) != 0 && (number < 10 || number > 20)) {
- if ((number % 10) == 1)
- return "st";
- else if ((number % 10) == 2)
- return "nd";
- else
- return "rd";
- } else {
- return "th";
- }
- }
- return "";
-}
-
-//-----------------------------------------------------------------------------------------
-// Function to test of the validity of an account name (return 0 if incorrect, and 1 if ok)
-//-----------------------------------------------------------------------------------------
-int verify_accountname(char* account_name) {
- int i;
-
- for(i = 0; account_name[i]; i++) {
- if (account_name[i] < 32) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit trouvé dans le nom du compte (%d%s caractère).\n", i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
- } else {
- printf("Illegal character found in the account name (%d%s character).\n", i+1, makeordinal(i+1));
- ladmin_log("Illegal character found in the account name (%d%s character)." RETCODE, i+1, makeordinal(i+1));
- }
- return 0;
- }
- }
-
- if (strlen(account_name) < 4) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- if (strlen(account_name) > 23) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too long. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too long. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- return 1;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//----------------------------------
-// Sub-function: Input of a password
-//----------------------------------
-int typepasswd(char * password) {
- char password1[1023], password2[1023];
- int letter;
- int i;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Aucun mot de passe n'a été donné. Demande d'un mot de passe." RETCODE);
- } else {
- ladmin_log("No password was given. Request to obtain a password." RETCODE);
- }
-
- memset(password1, '\0', sizeof(password1));
- memset(password2, '\0', sizeof(password2));
- if (defaultlanguage == 'F')
- printf("\033[1;36m Entrez le mot de passe > \033[0;32;42m");
- else
- printf("\033[1;36m Type the password > \033[0;32;42m");
- i = 0;
- while ((letter = getchar()) != '\n')
- password1[i++] = letter;
- if (defaultlanguage == 'F')
- printf("\033[0m\033[1;36m Ré-entrez le mot de passe > \033[0;32;42m");
- else
- printf("\033[0m\033[1;36m Verify the password > \033[0;32;42m");
- i = 0;
- while ((letter = getchar()) != '\n')
- password2[i++] = letter;
-
- printf("\033[0m");
- fflush(stdout);
- fflush(stdin);
-
- if (strcmp(password1, password2) != 0) {
- if (defaultlanguage == 'F') {
- printf("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n");
- ladmin_log("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp." RETCODE);
- ladmin_log(" Premier mot de passe: %s, second mot de passe: %s." RETCODE, password1, password2);
- } else {
- printf("Password verification failed. Please input same password.\n");
- ladmin_log("Password verification failed. Please input same password." RETCODE);
- ladmin_log(" First password: %s, second password: %s." RETCODE, password1, password2);
- }
- return 0;
- }
- if (defaultlanguage == 'F') {
- ladmin_log("Mot de passe saisi: %s." RETCODE, password1);
- } else {
- ladmin_log("Typed password: %s." RETCODE, password1);
- }
- strcpy(password, password1);
- return 1;
-}
-
-//------------------------------------------------------------------------------------
-// Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
-//------------------------------------------------------------------------------------
-int verify_password(char * password) {
- int i;
-
- for(i = 0; password[i]; i++) {
- if (password[i] < 32) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit trouvé dans le mot de passe (%d%s caractère).\n", i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
- } else {
- printf("Illegal character found in the password (%d%s character).\n", i+1, makeordinal(i+1));
- ladmin_log("Illegal character found in the password (%d%s character)." RETCODE, i+1, makeordinal(i+1));
- }
- return 0;
- }
- }
-
- if (strlen(password) < 4) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- if (strlen(password) > 23) {
- if (defaultlanguage == 'F') {
- printf("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n");
- ladmin_log("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères." RETCODE);
- } else {
- printf("Password is too long. Please input a password of 4-23 bytes.\n");
- ladmin_log("Password is too long. Please input a password of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- return 1;
-}
-
-//------------------------------------------------------------------
-// Sub-function: Check the name of a command (return complete name)
-//-----------------------------------------------------------------
-int check_command(char * command) {
-// help
- if (strncmp(command, "aide", 2) == 0 && strncmp(command, "aide", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
- strcpy(command, "aide");
- else if (strncmp(command, "help", 1) == 0 && strncmp(command, "help", strlen(command)) == 0)
- strcpy(command, "help");
-// general commands
- else if (strncmp(command, "add", 2) == 0 && strncmp(command, "add", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
- strcpy(command, "add");
- else if ((strncmp(command, "ban", 3) == 0 && strncmp(command, "ban", strlen(command)) == 0) ||
- (strncmp(command, "banish", 4) == 0 && strncmp(command, "banish", strlen(command)) == 0))
- strcpy(command, "ban");
- else if ((strncmp(command, "banadd", 4) == 0 && strncmp(command, "banadd", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
- strcmp(command, "ba") == 0)
- strcpy(command, "banadd");
- else if ((strncmp(command, "banset", 4) == 0 && strncmp(command, "banset", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
- strcmp(command, "bs") == 0)
- strcpy(command, "banset");
- else if (strncmp(command, "block", 2) == 0 && strncmp(command, "block", strlen(command)) == 0)
- strcpy(command, "block");
- else if (strncmp(command, "check", 2) == 0 && strncmp(command, "check", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
- strcpy(command, "check");
- else if (strncmp(command, "create", 2) == 0 && strncmp(command, "create", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
- strcpy(command, "create");
- else if (strncmp(command, "delete", 1) == 0 && strncmp(command, "delete", strlen(command)) == 0)
- strcpy(command, "delete");
- else if ((strncmp(command, "email", 2) == 0 && strncmp(command, "email", strlen(command)) == 0) || // not 1 letter command: 'email', 'end' or 'exit'?
- (strncmp(command, "e-mail", 2) == 0 && strncmp(command, "e-mail", strlen(command)) == 0))
- strcpy(command, "email");
- else if (strncmp(command, "getcount", 2) == 0 && strncmp(command, "getcount", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
- strcpy(command, "getcount");
-// else if (strncmp(command, "gm", 2) == 0 && strncmp(command, "gm", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
-// strcpy(command, "gm");
-// else if (strncmp(command, "id", 2) == 0 && strncmp(command, "id", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
-// strcpy(command, "id");
- else if (strncmp(command, "info", 2) == 0 && strncmp(command, "info", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
- strcpy(command, "info");
-// else if (strncmp(command, "kami", 4) == 0 && strncmp(command, "kami", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
-// strcpy(command, "kami");
-// else if (strncmp(command, "kamib", 5) == 0 && strncmp(command, "kamib", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
-// strcpy(command, "kamib");
- else if ((strncmp(command, "language", 2) == 0 && strncmp(command, "language", strlen(command)) == 0)) // not 1 letter command: 'language' or 'list'?
- strcpy(command, "language");
- else if ((strncmp(command, "list", 2) == 0 && strncmp(command, "list", strlen(command)) == 0) || // 'list' is default list command // not 1 letter command: 'language' or 'list'?
- strcmp(command, "ls") == 0)
- strcpy(command, "list");
- else if ((strncmp(command, "listban", 5) == 0 && strncmp(command, "listban", strlen(command)) == 0) ||
- (strncmp(command, "lsban", 3) == 0 && strncmp(command, "lsban", strlen(command)) == 0) ||
- strcmp(command, "lb") == 0)
- strcpy(command, "listban");
- else if ((strncmp(command, "listgm", 5) == 0 && strncmp(command, "listgm", strlen(command)) == 0) ||
- (strncmp(command, "lsgm", 3) == 0 && strncmp(command, "lsgm", strlen(command)) == 0) ||
- strcmp(command, "lg") == 0)
- strcpy(command, "listgm");
- else if ((strncmp(command, "listok", 5) == 0 && strncmp(command, "listok", strlen(command)) == 0) ||
- (strncmp(command, "lsok", 3) == 0 && strncmp(command, "lsok", strlen(command)) == 0) ||
- strcmp(command, "lo") == 0)
- strcpy(command, "listok");
- else if (strncmp(command, "memo", 1) == 0 && strncmp(command, "memo", strlen(command)) == 0)
- strcpy(command, "memo");
- else if (strncmp(command, "name", 1) == 0 && strncmp(command, "name", strlen(command)) == 0)
- strcpy(command, "name");
- else if ((strncmp(command, "password", 1) == 0 && strncmp(command, "password", strlen(command)) == 0) ||
- strcmp(command, "passwd") == 0)
- strcpy(command, "password");
- else if (strncmp(command, "reloadgm", 1) == 0 && strncmp(command, "reloadgm", strlen(command)) == 0)
- strcpy(command, "reloadgm");
- else if (strncmp(command, "search", 3) == 0 && strncmp(command, "search", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
- strcpy(command, "search"); // not 2 letters command: 'search' or 'sex'?
-// else if (strncmp(command, "sex", 3) == 0 && strncmp(command, "sex", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
-// strcpy(command, "sex"); // not 2 letters command: 'search' or 'sex'?
- else if (strncmp(command, "state", 2) == 0 && strncmp(command, "state", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
- strcpy(command, "state");
- else if ((strncmp(command, "timeadd", 5) == 0 && strncmp(command, "timeadd", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
- strcmp(command, "ta") == 0)
- strcpy(command, "timeadd");
- else if ((strncmp(command, "timeset", 5) == 0 && strncmp(command, "timeset", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
- strcmp(command, "ts") == 0)
- strcpy(command, "timeset");
- else if ((strncmp(command, "unban", 5) == 0 && strncmp(command, "unban", strlen(command)) == 0) ||
- (strncmp(command, "unbanish", 4) == 0 && strncmp(command, "unbanish", strlen(command)) == 0))
- strcpy(command, "unban");
- else if (strncmp(command, "unblock", 4) == 0 && strncmp(command, "unblock", strlen(command)) == 0)
- strcpy(command, "unblock");
- else if (strncmp(command, "version", 1) == 0 && strncmp(command, "version", strlen(command)) == 0)
- strcpy(command, "version");
- else if (strncmp(command, "who", 1) == 0 && strncmp(command, "who", strlen(command)) == 0)
- strcpy(command, "who");
-// quit
- else if (strncmp(command, "quit", 1) == 0 && strncmp(command, "quit", strlen(command)) == 0)
- strcpy(command, "quit");
- else if (strncmp(command, "exit", 2) == 0 && strncmp(command, "exit", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
- strcpy(command, "exit");
- else if (strncmp(command, "end", 2) == 0 && strncmp(command, "end", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
- strcpy(command, "end");
-
- return 0;
-}
-
-//-----------------------------------------
-// Sub-function: Display commands of ladmin
-//-----------------------------------------
-void display_help(char* param, int language) {
- char command[1023];
- int i;
-
- memset(command, '\0', sizeof(command));
-
- if (sscanf(param, "%s ", command) < 1 || strlen(command) == 0)
- strcpy(command, ""); // any value that is not a command
-
- if (command[0] == '?') {
- if (defaultlanguage == 'F')
- strcpy(command, "aide");
- else
- strcpy(command, "help");
- }
-
- // lowercase for command
- for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
-
- // Analyse of the command
- check_command(command); // give complete name to the command
-
- if (defaultlanguage == 'F') {
- ladmin_log("Affichage des commandes ou d'une commande." RETCODE);
- } else {
- ladmin_log("Displaying of the commands or a command." RETCODE);
- }
-
- if (language == 1) {
- if (strcmp(command, "aide") == 0) {
- printf("aide/help/?\n");
- printf(" Affiche la description des commandes\n");
- printf("aide/help/? [commande]\n");
- printf(" Affiche la description de la commande specifiée\n");
- } else if (strcmp(command, "help") == 0 ) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
-// general commands
- } else if (strcmp(command, "add") == 0) {
- printf("add <nomcompte> <sexe> <motdepasse>\n");
- printf(" Crée un compte avec l'email par défaut (a@a.com).\n");
- printf(" Concernant le sexe, seule la première lettre compte (F ou M).\n");
- printf(" L'e-mail est a@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n");
- printf(" Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n");
- printf(" <exemple> add testname Male testpass\n");
- } else if (strcmp(command, "ban") == 0) {
- printf("ban/banish aaaa/mm/jj hh:mm:ss <nom compte>\n");
- printf(" Change la date de fin de bannissement d'un compte.\n");
- printf(" Comme banset, mais <nom compte> est à la fin.\n");
- } else if (strcmp(command, "banadd") == 0) {
- printf("banadd <nomcompte> <Modificateur>\n");
- printf(" Ajoute ou soustrait du temps à la date de banissement d'un compte.\n");
- printf(" Les modificateurs sont construits comme suit:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> banadd testname +1m-2mn1s-6a\n");
- printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- printf("NOTE: Si vous modifez la date de banissement d'un compte non bani,\n");
- printf(" vous indiquez comme date (le moment actuel +- les ajustements)\n");
- } else if (strcmp(command, "banset") == 0) {
- printf("banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" Change la date de fin de bannissement d'un compte.\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- printf("banset <nomcompte> 0\n");
- printf(" Débanni un compte (0 = de-banni).\n");
- } else if (strcmp(command, "block") == 0) {
- printf("block <nom compte>\n");
- printf(" Place le status d'un compte à 5 (You have been blocked by the GM Team).\n");
- printf(" La commande est l'équivalent de state <nom_compte> 5.\n");
- } else if (strcmp(command, "check") == 0) {
- printf("check <nomcompte> <motdepasse>\n");
- printf(" Vérifie la validité d'un mot de passe pour un compte\n");
- printf(" NOTE: Le serveur n'enverra jamais un mot de passe.\n");
- printf(" C'est la seule méthode que vous possédez pour savoir\n");
- printf(" si un mot de passe est le bon. L'autre méthode est\n");
- printf(" d'avoir un accès ('physique') au fichier des comptes.\n");
- } else if (strcmp(command, "create") == 0) {
- printf("create <nomcompte> <sexe> <email> <motdepasse>\n");
- printf(" Comme la commande add, mais avec l'e-mail en plus.\n");
- printf(" <exemple> create testname Male mon@mail.com testpass\n");
- } else if (strcmp(command, "delete") == 0) {
- printf("del <nom compte>\n");
- printf(" Supprime un compte.\n");
- printf(" La commande demande confirmation. Après confirmation, le compte est détruit.\n");
- } else if (strcmp(command, "email") == 0) {
- printf("email <nomcompte> <email>\n");
- printf(" Modifie l'e-mail d'un compte.\n");
- } else if (strcmp(command, "getcount") == 0) {
- printf("getcount\n");
- printf(" Donne le nombre de joueurs en ligne par serveur de char.\n");
- } else if (strcmp(command, "gm") == 0) {
- printf("gm <nomcompte> [Niveau_GM]\n");
- printf(" Modifie le niveau de GM d'un compte.\n");
- printf(" Valeur par défaut: 0 (suppression du niveau de GM).\n");
- printf(" <exemple> gm nomtest 80\n");
- } else if (strcmp(command, "id") == 0) {
- printf("id <nom compte>\n");
- printf(" Donne l'id d'un compte.\n");
- } else if (strcmp(command, "info") == 0) {
- printf("info <idcompte>\n");
- printf(" Affiche les informations sur un compte.\n");
- } else if (strcmp(command, "kami") == 0) {
- printf("kami <message>\n");
- printf(" Envoi un message général sur tous les serveurs de map (en jaune).\n");
- } else if (strcmp(command, "kamib") == 0) {
- printf("kamib <message>\n");
- printf(" Envoi un message général sur tous les serveurs de map (en bleu).\n");
- } else if (strcmp(command, "language") == 0) {
- printf("language <langue>\n");
- printf(" Change la langue d'affichage.\n");
- printf(" Langues possibles: 'Français' ou 'English'.\n");
- } else if (strcmp(command, "list") == 0) {
- printf("list/ls [Premier_id [Dernier_id]]\n");
- printf(" Affiche une liste de comptes.\n");
- printf(" 'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n");
- printf(" La recherche par nom n'est pas possible avec cette commande.\n");
- printf(" <example> list 10 9999999\n");
- } else if (strcmp(command, "listban") == 0) {
- printf("listBan/lsBan [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes avec statut ou bannis.\n");
- } else if (strcmp(command, "listgm") == 0) {
- printf("listGM/lsGM [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes GM.\n");
- } else if (strcmp(command, "listok") == 0) {
- printf("listOK/lsOK [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n");
- } else if (strcmp(command, "memo") == 0) {
- printf("memo <nomcompte> <memo>\n");
- printf(" Modifie le mémo d'un compte.\n");
- printf(" 'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n");
- } else if (strcmp(command, "name") == 0) {
- printf("name <idcompte>\n");
- printf(" Donne le nom d'un compte.\n");
- } else if (strcmp(command, "password") == 0) {
- printf("passwd <nomcompte> <nouveaumotdepasse>\n");
- printf(" Change le mot de passe d'un compte.\n");
- printf(" Lorsque nouveaumotdepasse est omis,\n");
- printf(" la saisie se fait sans que la frappe ne se voit.\n");
- } else if (strcmp(command, "reloadgm") == 0) {
- printf("reloadGM\n");
- printf(" Reload GM configuration file\n");
- } else if (strcmp(command, "search") == 0) {
- printf("search <expression>\n");
- printf(" Cherche des comptes.\n");
- printf(" Affiche les comptes dont les noms correspondent.\n");
-// printf("search -r/-e/--expr/--regex <expression>\n");
-// printf(" Cherche des comptes par expression regulière.\n");
-// printf(" Affiche les comptes dont les noms correspondent.\n");
- } else if (strcmp(command, "sex") == 0) {
- printf("sex <nomcompte> <sexe>\n");
- printf(" Modifie le sexe d'un compte.\n");
- printf(" <exemple> sex testname Male\n");
- } else if (strcmp(command, "state") == 0) {
- printf("state <nomcompte> <nouveaustatut> <message_erreur_7>\n");
- printf(" Change le statut d'un compte.\n");
- printf(" 'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n");
- printf(" les possibilités sont:\n");
- printf(" 0 = Compte ok\n");
- printf(" 1 = Unregistered ID\n");
- printf(" 2 = Incorrect Password\n");
- printf(" 3 = This ID is expired\n");
- printf(" 4 = Rejected from Server\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- printf(" 6 = Your Game's EXE file is not the latest version\n");
- printf(" 7 = You are Prohibited to log in until...\n");
- printf(" 8 = Server is jammed due to over populated\n");
- printf(" 9 = No MSG\n");
- printf(" 100 = This ID has been totally erased\n");
- printf(" all other values are 'No MSG', then use state 9 please.\n");
- printf(" 'message_erreur_7': message du code erreur 6 =\n");
- printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeadd <nomcompte> <modificateur>\n");
- printf(" Ajoute/soustrait du temps à la limite de validité d'un compte.\n");
- printf(" Le modificateur est composé comme suit:\n");
- printf(" Valeur modificatrice (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> timeadd testname +1m-2mn1s-6a\n");
- printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- printf("NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n");
- printf(" désirez le faire, c'est que vous voulez probablement créer un limite de\n");
- printf(" validité limitée. Donc, en premier, fixé une limite de valitidé.\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" Change la limite de validité d'un compte.\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- printf("timeset <nomcompte> 0\n");
- printf(" Donne une limite de validité illimitée (0 = illimitée).\n");
- } else if (strcmp(command, "unban") == 0) {
- printf("unban/unbanish <nom compte>\n");
- printf(" Ote le banissement d'un compte.\n");
- printf(" La commande est l'équivalent de banset <nom_compte> 0.\n");
- } else if (strcmp(command, "unblock") == 0) {
- printf("unblock <nom compte>\n");
- printf(" Place le status d'un compte à 0 (Compte ok).\n");
- printf(" La commande est l'équivalent de state <nom_compte> 0.\n");
- } else if (strcmp(command, "version") == 0) {
- printf("version\n");
- printf(" Affiche la version du login-serveur.\n");
- } else if (strcmp(command, "who") == 0) {
- printf("who <nom compte>\n");
- printf(" Affiche les informations sur un compte.\n");
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- printf("quit/end/exit\n");
- printf(" Fin du programme d'administration.\n");
-// unknown command
- } else {
- if (strlen(command) > 0)
- printf("Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", command);
- printf(" aide/help/? -- Affiche cet aide\n");
- printf(" aide/help/? [commande] -- Affiche l'aide de la commande\n");
- printf(" add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom compte> -- Fixe la date finale de banismnt\n");
- printf(" banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
- printf(" exemple: ba moncompte +1m-2mn1s-2y date finale de banissement\n");
- printf(" banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt\n");
- printf(" banset/bs <nomcompte> 0 -- Dé-banis un compte.\n");
- printf(" block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)\n");
- printf(" check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte\n");
- printf(" create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)\n");
- printf(" del <nom compte> -- Supprime un compte\n");
- printf(" email <nomcompte> <email> -- Modifie l'e-mail d'un compte\n");
- printf(" getcount -- Donne le nb de joueurs en ligne\n");
- printf(" gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte\n");
- printf(" id <nom compte> -- Donne l'id d'un compte\n");
- printf(" info <idcompte> -- Affiche les infos sur un compte\n");
- printf(" kami <message> -- Envoi un message général (en jaune)\n");
- printf(" kamib <message> -- Envoi un message général (en bleu)\n");
- printf(" language <langue> -- Change la langue d'affichage.\n");
- printf(" list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" listBan/lsBan [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" avec un statut ou bannis\n");
- printf(" listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM\n");
- printf(" listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" sans status et non bannis\n");
- printf(" memo <nomcompte> <memo> -- Modifie le memo d'un compte\n");
- printf(" name <idcompte> -- Donne le nom d'un compte\n");
- printf(" passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte\n");
- printf(" quit/end/exit -- Fin du programme d'administation\n");
- printf(" reloadGM -- Recharger le fichier de config des GM\n");
- printf(" search <expression> -- Cherche des comptes\n");
-// printf(" search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX\n");
- printf(" sex <nomcompte> <sexe> -- Modifie le sexe d'un compte\n");
- printf(" state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte\n");
- printf(" timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
- printf(" exemple: ta moncompte +1m-2mn1s-2y limite de validité\n");
- printf(" timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité\n");
- printf(" timeset/ts <nomcompte> 0 -- limite de validité = illimitée\n");
- printf(" unban/unbanish <nom compte> -- Ote le banissement d'un compte\n");
- printf(" unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)\n");
- printf(" version -- Donne la version du login-serveur\n");
- printf(" who <nom compte> -- Affiche les infos sur un compte\n");
- printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
- }
- } else {
- if (strcmp(command, "aide") == 0) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
- } else if (strcmp(command, "help") == 0 ) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
-// general commands
- } else if (strcmp(command, "add") == 0) {
- printf("add <account_name> <sex> <password>\n");
- printf(" Create an account with the default email (a@a.com).\n");
- printf(" Concerning the sex, only the first letter is used (F or M).\n");
- printf(" The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.\n");
- printf(" When the password is omitted,\n");
- printf(" the input is done without displaying of the pressed keys.\n");
- printf(" <example> add testname Male testpass\n");
- } else if (strcmp(command, "ban") == 0) {
- printf("ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" Changes the final date of a banishment of an account.\n");
- printf(" Like banset, but <account name> is at end.\n");
- } else if (strcmp(command, "banadd") == 0) {
- printf("banadd <account_name> <modifier>\n");
- printf(" Adds or substracts time from the final date of a banishment of an account.\n");
- printf(" Modifier is done as follows:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- printf("NOTE: If you modify the final date of a non-banished account,\n");
- printf(" you fix the final date to (actual time +- adjustments)\n");
- } else if (strcmp(command, "banset") == 0) {
- printf("banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" Changes the final date of a banishment of an account.\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- printf("banset <account_name> 0\n");
- printf(" Set a non-banished account (0 = unbanished).\n");
- } else if (strcmp(command, "block") == 0) {
- printf("block <account name>\n");
- printf(" Set state 5 (You have been blocked by the GM Team) to an account.\n");
- printf(" This command works like state <account_name> 5.\n");
- } else if (strcmp(command, "check") == 0) {
- printf("check <account_name> <password>\n");
- printf(" Check the validity of a password for an account.\n");
- printf(" NOTE: Server will never sends back a password.\n");
- printf(" It's the only method you have to know if a password is correct.\n");
- printf(" The other method is to have a ('physical') access to the accounts file.\n");
- } else if (strcmp(command, "create") == 0) {
- printf("create <account_name> <sex> <email> <password>\n");
- printf(" Like the 'add' command, but with e-mail moreover.\n");
- printf(" <example> create testname Male my@mail.com testpass\n");
- } else if (strcmp(command, "delete") == 0) {
- printf("del <account name>\n");
- printf(" Remove an account.\n");
- printf(" This order requires confirmation. After confirmation, the account is deleted.\n");
- } else if (strcmp(command, "email") == 0) {
- printf("email <account_name> <email>\n");
- printf(" Modify the e-mail of an account.\n");
- } else if (strcmp(command, "getcount") == 0) {
- printf("getcount\n");
- printf(" Give the number of players online on all char-servers.\n");
- } else if (strcmp(command, "gm") == 0) {
- printf("gm <account_name> [GM_level]\n");
- printf(" Modify the GM level of an account.\n");
- printf(" Default value remove GM level (GM level = 0).\n");
- printf(" <example> gm testname 80\n");
- } else if (strcmp(command, "id") == 0) {
- printf("id <account name>\n");
- printf(" Give the id of an account.\n");
- } else if (strcmp(command, "info") == 0) {
- printf("info <account_id>\n");
- printf(" Display complete information of an account.\n");
- } else if (strcmp(command, "kami") == 0) {
- printf("kami <message>\n");
- printf(" Sends a broadcast message on all map-server (in yellow).\n");
- } else if (strcmp(command, "kamib") == 0) {
- printf("kamib <message>\n");
- printf(" Sends a broadcast message on all map-server (in blue).\n");
- } else if (strcmp(command, "language") == 0) {
- printf("language <language>\n");
- printf(" Change the language of displaying.\n");
- printf(" Possible languages: Français or English.\n");
- } else if (strcmp(command, "list") == 0) {
- printf("list/ls [start_id [end_id]]\n");
- printf(" Display a list of accounts.\n");
- printf(" 'start_id', 'end_id': indicate end and start identifiers.\n");
- printf(" Research by name is not possible with this command.\n");
- printf(" <example> list 10 9999999\n");
- } else if (strcmp(command, "listban") == 0) {
- printf("listBan/lsBan [start_id [end_id]]\n");
- printf(" Like list/ls, but only for accounts with state or banished.\n");
- } else if (strcmp(command, "listgm") == 0) {
- printf("listGM/lsGM [start_id [end_id]]\n");
- printf(" Like list/ls, but only for GM accounts.\n");
- } else if (strcmp(command, "listok") == 0) {
- printf("listOK/lsOK [start_id [end_id]]\n");
- printf(" Like list/ls, but only for accounts without state and not banished.\n");
- } else if (strcmp(command, "memo") == 0) {
- printf("memo <account_name> <memo>\n");
- printf(" Modify the memo of an account.\n");
- printf(" 'memo': it can have until 253 characters (with spaces or not).\n");
- } else if (strcmp(command, "name") == 0) {
- printf("name <account_id>\n");
- printf(" Give the name of an account.\n");
- } else if (strcmp(command, "password") == 0) {
- printf("passwd <account_name> <new_password>\n");
- printf(" Change the password of an account.\n");
- printf(" When new password is omitted,\n");
- printf(" the input is done without displaying of the pressed keys.\n");
- } else if (strcmp(command, "reloadgm") == 0) {
- printf("reloadGM\n");
- printf(" Reload GM configuration file\n");
- } else if (strcmp(command, "search") == 0) {
- printf("search <expression>\n");
- printf(" Seek accounts.\n");
- printf(" Displays the accounts whose names correspond.\n");
-// printf("search -r/-e/--expr/--regex <expression>\n");
-// printf(" Seek accounts by regular expression.\n");
-// printf(" Displays the accounts whose names correspond.\n");
- } else if (strcmp(command, "sex") == 0) {
- printf("sex <account_name> <sex>\n");
- printf(" Modify the sex of an account.\n");
- printf(" <example> sex testname Male\n");
- } else if (strcmp(command, "state") == 0) {
- printf("state <account_name> <new_state> <error_message_#7>\n");
- printf(" Change the state of an account.\n");
- printf(" 'new_state': state is the state of the packet 0x006a + 1.\n");
- printf(" The possibilities are:\n");
- printf(" 0 = Account ok\n");
- printf(" 1 = Unregistered ID\n");
- printf(" 2 = Incorrect Password\n");
- printf(" 3 = This ID is expired\n");
- printf(" 4 = Rejected from Server\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- printf(" 6 = Your Game's EXE file is not the latest version\n");
- printf(" 7 = You are Prohibited to log in until...\n");
- printf(" 8 = Server is jammed due to over populated\n");
- printf(" 9 = No MSG\n");
- printf(" 100 = This ID has been totally erased\n");
- printf(" all other values are 'No MSG', then use state 9 please.\n");
- printf(" 'error_message_#7': message of the code error 6\n");
- printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeadd <account_name> <modifier>\n");
- printf(" Adds or substracts time from the validity limit of an account.\n");
- printf(" Modifier is done as follows:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- printf("NOTE: You can not modify a unlimited validity limit.\n");
- printf(" If you want modify it, you want probably create a limited validity limit.\n");
- printf(" So, at first, you must set the validity limit to a date/time.\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" Changes the validity limit of an account.\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- printf("timeset <account_name> 0\n");
- printf(" Gives an unlimited validity limit (0 = unlimited).\n");
- } else if (strcmp(command, "unban") == 0) {
- printf("unban/unbanish <account name>\n");
- printf(" Remove the banishment of an account.\n");
- printf(" This command works like banset <account_name> 0.\n");
- } else if (strcmp(command, "unblock") == 0) {
- printf("unblock <account name>\n");
- printf(" Set state 0 (Account ok) to an account.\n");
- printf(" This command works like state <account_name> 0.\n");
- } else if (strcmp(command, "version") == 0) {
- printf("version\n");
- printf(" Display the version of the login-server.\n");
- } else if (strcmp(command, "who") == 0) {
- printf("who <account name>\n");
- printf(" Displays complete information of an account.\n");
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- printf("quit/end/exit\n");
- printf(" End of the program of administration.\n");
-// unknown command
- } else {
- if (strlen(command) > 0)
- printf("Unknown command [%s] for help. Displaying of all commands.\n", command);
- printf(" aide/help/? -- Display this help\n");
- printf(" aide/help/? [command] -- Display the help of the command\n");
- printf(" add <account_name> <sex> <password> -- Create an account with default email\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name> -- Change final date of a ban\n");
- printf(" banadd/ba <account_name> <modifier> -- Add or substract time from the final\n");
- printf(" example: ba apple +1m-2mn1s-2y date of a banishment of an account\n");
- printf(" banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban\n");
- printf(" banset/bs <account_name> 0 -- Un-banish an account\n");
- printf(" block <account name> -- Set state 5 (blocked by the GM Team) to an account\n");
- printf(" check <account_name> <password> -- Check the validity of a password\n");
- printf(" create <account_name> <sex> <email> <passwrd> -- Create an account with email\n");
- printf(" del <account name> -- Remove an account\n");
- printf(" email <account_name> <email> -- Modify an email of an account\n");
- printf(" getcount -- Give the number of players online\n");
- printf(" gm <account_name> [GM_level] -- Modify the GM level of an account\n");
- printf(" id <account name> -- Give the id of an account\n");
- printf(" info <account_id> -- Display all information of an account\n");
- printf(" kami <message> -- Sends a broadcast message (in yellow)\n");
- printf(" kamib <message> -- Sends a broadcast message (in blue)\n");
- printf(" language <language> -- Change the language of displaying.\n");
- printf(" list/ls [First_id [Last_id]] -- Display a list of accounts\n");
- printf(" listBan/lsBan [First_id [Last_id] ] -- Display a list of accounts\n");
- printf(" with state or banished\n");
- printf(" listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts\n");
- printf(" listOK/lsOK [First_id [Last_id] ] -- Display a list of accounts\n");
- printf(" without state and not banished\n");
- printf(" memo <account_name> <memo> -- Modify the memo of an account\n");
- printf(" name <account_id> -- Give the name of an account\n");
- printf(" passwd <account_name> <new_password> -- Change the password of an account\n");
- printf(" quit/end/exit -- End of the program of administation\n");
- printf(" reloadGM -- Reload GM configuration file\n");
- printf(" search <expression> -- Seek accounts\n");
-// printf(" search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression\n");
- printf(" sex <nomcompte> <sexe> -- Modify the sex of an account\n");
- printf(" state <account_name> <new_state> <error_message_#7> -- Change the state\n");
- printf(" timeadd/ta <account_name> <modifier> -- Add or substract time from the\n");
- printf(" example: ta apple +1m-2mn1s-2y validity limit of an account\n");
- printf(" timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit\n");
- printf(" timeset/ts <account_name> 0 -- Give a unlimited validity limit\n");
- printf(" unban/unbanish <account name> -- Remove the banishment of an account\n");
- printf(" unblock <account name> -- Set state 0 (Account ok) to an account\n");
- printf(" version -- Gives the version of the login-server\n");
- printf(" who <account name> -- Display all information of an account\n");
- printf(" who <account name> -- Display all information of an account\n");
- printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
- }
- }
-}
-
-//-----------------------------
-// Sub-function: add an account
-//-----------------------------
-int addaccount(char* param, int emailflag) {
- char name[1023], sex[1023], email[1023], password[1023];
-// int i;
- WFIFOHEAD(login_fd,91);
-
- memset(name, '\0', sizeof(name));
- memset(sex, '\0', sizeof(sex));
- memset(email, '\0', sizeof(email));
- memset(password, '\0', sizeof(password));
-
- if (emailflag == 0) { // add command
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, sex, password) < 2 && // password can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, sex, password) < 2 && // password can be void
- sscanf(param, "%s %s %[^\r\n]", name, sex, password) < 2) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
- printf("<exemple> add nomtest Male motdepassetest\n");
- ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'add')." RETCODE);
- } else {
- printf("Please input an account name, a sex and a password.\n");
- printf("<example> add testname Male testpass\n");
- ladmin_log("Incomplete parameters to create an account ('add' command)." RETCODE);
- }
- return 136;
- }
- strcpy(email, "a@a.com"); // default email
- } else { // 1: create command
- if (sscanf(param, "\"%[^\"]\" %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
- sscanf(param, "'%[^']' %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
- sscanf(param, "%s %s %s %[^\r\n]", name, sex, email, password) < 3) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
- printf("<exemple> create nomtest Male mo@mail.com motdepassetest\n");
- ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'create')." RETCODE);
- } else {
- printf("Please input an account name, a sex and a password.\n");
- printf("<example> create testname Male my@mail.com testpass\n");
- ladmin_log("Incomplete parameters to create an account ('create' command)." RETCODE);
- }
- return 136;
- }
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
-/* for(i = 0; name[i]; i++) {
- if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_", name[i]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère).\n", name[i], i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère)." RETCODE, name[i], i+1, makeordinal(i+1));
- } else {
- printf("Illegal character (%c) found in the account name (%d%s character).\n", name[i], i+1, makeordinal(i+1));
- ladmin_log("Illegal character (%c) found in the account name (%d%s character)." RETCODE, name[i], i+1, makeordinal(i+1));
- }
- return 101;
- }
- }*/
-
- sex[0] = toupper(sex[0]);
- if (strchr("MF", sex[0]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
- ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
- } else {
- printf("Illegal gender [%s]. Please input M or F.\n", sex);
- ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
- }
- return 103;
- }
-
- if (strlen(email) < 3) {
- if (defaultlanguage == 'F') {
- printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
- if (strlen(email) > 39) {
- if (defaultlanguage == 'F') {
- printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
- ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
- } else {
- printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
- ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
- }
- return 109;
- }
- if (e_mail_check(email) == 0) {
- if (defaultlanguage == 'F') {
- printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 108;
- }
- if (verify_password(password) == 0)
- return 104;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour créer un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to create an account." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7930;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOB(login_fd,50) = sex[0];
- memcpy(WFIFOP(login_fd,51), email, 40);
- WFIFOSET(login_fd,91);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------------------------------------------
-// Sub-function: Add/substract time to the final date of a banishment of an account
-//---------------------------------------------------------------------------------
-int banaddaccount(char* param) {
- char name[1023], modif[1023];
- int year, month, day, hour, minute, second;
- char * p_modif;
- int value, i;
- WFIFOHEAD(login_fd,38);
-
- memset(name, '\0', sizeof(name));
- memset(modif, '\0', sizeof(modif));
- year = month = day = hour = minute = second = 0;
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un modificateur svp.\n");
- printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Nombre incorrect de paramètres pour modifier la fin de ban d'un compte (commande 'banadd')." RETCODE);
- } else {
- printf("Please input an account name and a modifier.\n");
- printf(" <example>: banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("Incomplete parameters to modify the ban date/time of an account ('banadd' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- // lowercase for modif
- for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
- p_modif = modif;
- while (strlen(p_modif) > 0) {
- value = atoi(p_modif);
- if (value == 0) {
- p_modif++;
- } else {
- if (p_modif[0] == '-' || p_modif[0] == '+')
- p_modif++;
- while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
- p_modif++;
- }
- if (p_modif[0] == 's') {
- second = value;
- p_modif++;
- } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
- minute = value;
- p_modif += 2;
- } else if (p_modif[0] == 'h') {
- hour = value;
- p_modif++;
- } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
- day = value;
- p_modif += 2;
- } else if (p_modif[0] == 'm') {
- month = value;
- p_modif++;
- } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
- year = value;
- p_modif++;
- } else {
- p_modif++;
- }
- }
- }
-
- if (defaultlanguage == 'F') {
- printf(" année: %d\n", year);
- printf(" mois: %d\n", month);
- printf(" jour: %d\n", day);
- printf(" heure: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" seconde: %d\n", second);
- } else {
- printf(" year: %d\n", year);
- printf(" month: %d\n", month);
- printf(" day: %d\n", day);
- printf(" hour: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" second: %d\n", second);
- }
-
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- if (defaultlanguage == 'F') {
- printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Element modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'banadd')." RETCODE);
- } else {
- printf("Please give an adjustment with this command:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("No adjustment isn't an adjustment ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (year > 127 || year < -127) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
- ladmin_log("Ajustement de l'année hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the years (from -127 to 127).\n");
- ladmin_log("Abnormal adjustement for the year ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (month > 255 || month < -255) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
- ladmin_log("Ajustement du mois hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the months (from -255 to 255).\n");
- ladmin_log("Abnormal adjustement for the month ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (day > 32767 || day < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des jours hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the days ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (hour > 32767 || hour < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des heures hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the hours ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (minute > 32767 || minute < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des minutes hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the minutes ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (second > 32767 || second < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des secondes hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the seconds ('banadd' command)." RETCODE);
- }
- return 137;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour modifier la date d'un bannissement." RETCODE);
- } else {
- ladmin_log("Request to login-server to modify a ban date/time." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x794c;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = (short)year;
- WFIFOW(login_fd,28) = (short)month;
- WFIFOW(login_fd,30) = (short)day;
- WFIFOW(login_fd,32) = (short)hour;
- WFIFOW(login_fd,34) = (short)minute;
- WFIFOW(login_fd,36) = (short)second;
- WFIFOSET(login_fd,38);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------------------------------
-// Sub-function of sub-function banaccount, unbanaccount or bansetaccount
-// Set the final date of a banishment of an account
-//-----------------------------------------------------------------------
-int bansetaccountsub(char* name, char* date, char* time) {
- int year, month, day, hour, minute, second;
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- struct tm *tmtime;
- WFIFOHEAD(login_fd,30);
-
- year = month = day = hour = minute = second = 0;
- ban_until_time = 0;
- tmtime = localtime(&ban_until_time); // initialize
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (atoi(date) != 0 &&
- ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d.%d.%d", &year, &month, &day) < 3) ||
- sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
- if (defaultlanguage == 'F') {
- printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
- printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
- ladmin_log("Format incorrect pour la date/heure (commande'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
- printf("You can imput 0 instead of if you use 'banset' command.\n");
- ladmin_log("Invalid format for the date/time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
-
- if (atoi(date) == 0) {
- ban_until_time = 0;
- } else {
- if (year < 70) {
- year = year + 100;
- }
- if (year >= 1900) {
- year = year - 1900;
- }
- if (month < 1 || month > 12) {
- if (defaultlanguage == 'F') {
- printf("Entrez un mois correct svp (entre 1 et 12).\n");
- ladmin_log("Mois incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the month (from 1 to 12).\n");
- ladmin_log("Invalid month for the date ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- month = month - 1;
- if (day < 1 || day > 31) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct svp (entre 1 et 31).\n");
- ladmin_log("Jour incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the day (from 1 to 31).\n");
- ladmin_log("Invalid day for the date ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
- (month == 1 && day > 29)) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
- ladmin_log("Jour incorrect pour ce mois correspondant (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for a day of this month (%d).\n", month);
- ladmin_log("Invalid day for this month ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (hour < 0 || hour > 23) {
- if (defaultlanguage == 'F') {
- printf("Entrez une heure correcte svp (entre 0 et 23).\n");
- ladmin_log("Heure incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the hour (from 0 to 23).\n");
- ladmin_log("Invalid hour for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (minute < 0 || minute > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
- ladmin_log("Minute incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the minutes (from 0 to 59).\n");
- ladmin_log("Invalid minute for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (second < 0 || second > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
- ladmin_log("Seconde incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the seconds (from 0 to 59).\n");
- ladmin_log("Invalid second for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- tmtime->tm_year = year;
- tmtime->tm_mon = month;
- tmtime->tm_mday = day;
- tmtime->tm_hour = hour;
- tmtime->tm_min = minute;
- tmtime->tm_sec = second;
- tmtime->tm_isdst = -1; // -1: no winter/summer time modification
- ban_until_time = mktime(tmtime);
- if (ban_until_time == -1) {
- if (defaultlanguage == 'F') {
- printf("Date incorrecte.\n");
- printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
- printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
- ladmin_log("Date incorrecte. (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Invalid date.\n");
- printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
- printf("You can imput 0 instead of if you use 'banset' command.\n");
- ladmin_log("Invalid date. ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour fixer un ban." RETCODE);
- } else {
- ladmin_log("Request to login-server to set a ban." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x794a;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = (int)ban_until_time;
- WFIFOSET(login_fd,30);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------------------------------
-// Sub-function: Set the final date of a banishment of an account (ban)
-//---------------------------------------------------------------------
-int banaccount(char* param) {
- char name[1023], date[1023], time[1023];
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
-
- if (sscanf(param, "%s %s \"%[^\"]\"", date, time, name) < 3 &&
- sscanf(param, "%s %s '%[^']'", date, time, name) < 3 &&
- sscanf(param, "%s %s %[^\r\n]", date, time, name) < 3) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
- }
- return 136;
- }
-
- return bansetaccountsub(name, date, time);
-}
-
-//------------------------------------------------------------------------
-// Sub-function: Set the final date of a banishment of an account (banset)
-//------------------------------------------------------------------------
-int bansetaccount(char* param) {
- char name[1023], date[1023], time[1023];
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
-
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
- }
- return 136;
- }
-
- if (time[0] == '\0')
- strcpy(time, "23:59:59");
-
- return bansetaccountsub(name, date, time);
-}
-
-//-------------------------------------------------
-// Sub-function: unbanishment of an account (unban)
-//-------------------------------------------------
-int unbanaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'unban')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('unban' command)." RETCODE);
- }
- return 136;
- }
-
- return bansetaccountsub(name, "0", "");
-}
-
-//---------------------------------------------------------
-// Sub-function: Asking to check the validity of a password
-// (Note: never send back a password with login-server!! security of passwords)
-//---------------------------------------------------------
-int checkaccount(char* param) {
- char name[1023], password[1023];
- WFIFOHEAD(login_fd,50);
-
- memset(name, '\0', sizeof(name));
- memset(password, '\0', sizeof(password));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && // password can be void
- sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 && // password can be void
- sscanf(param, "%s %[^\r\n]", name, password) < 1) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> check testname motdepasse\n");
- ladmin_log("Nombre incorrect de paramètres pour tester le mot d'un passe d'un compte (commande 'check')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> check testname password\n");
- ladmin_log("Incomplete parameters to check the password of an account ('check' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 134;
- }
- if (verify_password(password) == 0)
- return 131;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour test un mot de passe." RETCODE);
- } else {
- ladmin_log("Request to login-server to check a password." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793a;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------------
-// Sub-function: Asking for deletion of an account
-//------------------------------------------------
-int delaccount(char* param) {
- char name[1023];
- char letter;
- char confirm[1023];
- int i;
- WFIFOHEAD(login_fd,26);
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> del nomtestasupprimer\n");
- ladmin_log("Aucun nom donné pour supprimer un compte (commande 'delete')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> del testnametodelete\n");
- ladmin_log("No name given to delete an account ('delete' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- memset(confirm, '\0', sizeof(confirm));
- while ((confirm[0] != 'o' || defaultlanguage != 'F') && confirm[0] != 'n' && (confirm[0] != 'y' || defaultlanguage == 'F')) {
- if (defaultlanguage == 'F')
- printf("\033[1;36m ** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) > \033[0m");
- else
- printf("\033[1;36m ** Are you really sure to DELETE account [$userid]? (y/n) > \033[0m");
- fflush(stdout);
- memset(confirm, '\0', sizeof(confirm));
- i = 0;
- while ((letter = getchar()) != '\n')
- confirm[i++] = letter;
- }
-
- if (confirm[0] == 'n') {
- if (defaultlanguage == 'F') {
- printf("Suppression annulée.\n");
- ladmin_log("Suppression annulée par l'utilisateur (commande 'delete')." RETCODE);
- } else {
- printf("Deletion canceled.\n");
- ladmin_log("Deletion canceled by user ('delete' command)." RETCODE);
- }
- return 121;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour détruire un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to delete an acount." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7932;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------
-// Sub-function: Asking to modification of an account e-mail
-//----------------------------------------------------------
-int changeemail(char* param) {
- char name[1023], email[1023];
- WFIFOHEAD(login_fd,66);
-
- memset(name, '\0', sizeof(name));
- memset(email, '\0', sizeof(email));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, email) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, email) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, email) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et une email svp.\n");
- printf("<exemple> email testname nouveauemail\n");
- ladmin_log("Nombre incorrect de paramètres pour changer l'email d'un compte (commande 'email')." RETCODE);
- } else {
- printf("Please input an account name and an email.\n");
- printf("<example> email testname newemail\n");
- ladmin_log("Incomplete parameters to change the email of an account ('email' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(email) < 3) {
- if (defaultlanguage == 'F') {
- printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
- if (strlen(email) > 39) {
- if (defaultlanguage == 'F') {
- printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
- ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
- } else {
- printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
- ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
- }
- return 109;
- }
- if (e_mail_check(email) == 0) {
- if (defaultlanguage == 'F') {
- printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer une email." RETCODE);
- } else {
- ladmin_log("Request to login-server to change an email." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7940;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), email, 40);
- WFIFOSET(login_fd,66);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------------
-// Sub-function: Asking of the number of online players
-//-----------------------------------------------------
-int getlogincount(void) {
- WFIFOHEAD(login_fd,2);
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le nombre de joueurs en jeu." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain the # of online players." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7938;
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------
-// Sub-function: Asking to modify the GM level of an account
-//----------------------------------------------------------
-int changegmlevel(char* param) {
- char name[1023];
- int GM_level;
- WFIFOHEAD(login_fd,27);
-
- memset(name, '\0', sizeof(name));
- GM_level = 0;
-
- if (sscanf(param, "\"%[^\"]\" %d", name, &GM_level) < 1 &&
- sscanf(param, "'%[^']' %d", name, &GM_level) < 1 &&
- sscanf(param, "%s %d", name, &GM_level) < 1) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un niveau de GM svp.\n");
- printf("<exemple> gm nomtest 80\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le Niveau de GM d'un compte (commande 'gm')." RETCODE);
- } else {
- printf("Please input an account name and a GM level.\n");
- printf("<example> gm testname 80\n");
- ladmin_log("Incomplete parameters to change the GM level of an account ('gm' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (GM_level < 0 || GM_level > 99) {
- if (defaultlanguage == 'F') {
- printf("Niveau de GM incorrect [%d]. Entrez une valeur de 0 à 99 svp.\n", GM_level);
- ladmin_log("Niveau de GM incorrect [%d]. La valeur peut être de 0 à 99." RETCODE, GM_level);
- } else {
- printf("Illegal GM level [%d]. Please input a value from 0 to 99.\n", GM_level);
- ladmin_log("Illegal GM level [%d]. The value can be from 0 to 99." RETCODE, GM_level);
- }
- return 103;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un niveau de GM." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a GM level." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793e;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOB(login_fd,26) = GM_level;
- WFIFOSET(login_fd,27);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------
-// Sub-function: Asking to obtain an account id
-//---------------------------------------------
-int idaccount(char* param) {
- char name[1023];
- WFIFOHEAD(login_fd,26);
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> id nomtest\n");
- ladmin_log("Aucun nom donné pour rechecher l'id d'un compte (commande 'id')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> id testname\n");
- ladmin_log("No name given to search an account id ('id' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour connaître l'id d'un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to know an account id." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7944;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------------------------
-// Sub-function: Asking to displaying information about an account (by its id)
-//----------------------------------------------------------------------------
-int infoaccount(int account_id) {
- WFIFOHEAD(login_fd,6);
- if (account_id < 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un id ayant une valeur positive svp.\n");
- ladmin_log("Une valeur négative a été donné pour trouver le compte." RETCODE);
- } else {
- printf("Please input a positive value for the id.\n");
- ladmin_log("Negative value was given to found the account." RETCODE);
- }
- return 136;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par l'id)." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain information about an account (by its id)." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7954;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------
-// Sub-function: Send a broadcast message
-//---------------------------------------
-int sendbroadcast(short type, char* message) {
- int len = strlen(message);
- WFIFOHEAD(login_fd,9+len);
- if (len == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un message svp.\n");
- if (type == 0) {
- printf("<exemple> kami un message\n");
- } else {
- printf("<exemple> kamib un message\n");
- }
- ladmin_log("Le message est vide (commande 'kami(b)')." RETCODE);
- } else {
- printf("Please input a message.\n");
- if (type == 0) {
- printf("<example> kami a message\n");
- } else {
- printf("<example> kamib a message\n");
- }
- ladmin_log("The message is void ('kami(b)' command)." RETCODE);
- }
- return 136;
- }
- len++; //+'\0'
- WFIFOW(login_fd,0) = 0x794e;
- WFIFOW(login_fd,2) = type;
- WFIFOL(login_fd,4) = len;
- memcpy(WFIFOP(login_fd,8), message, len);
- WFIFOSET(login_fd,8+len);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//--------------------------------------------
-// Sub-function: Change language of displaying
-//--------------------------------------------
-int changelanguage(char* language) {
- if (strlen(language) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez une langue svp.\n");
- printf("<exemple> language english\n");
- printf(" language français\n");
- ladmin_log("La langue est vide (commande 'language')." RETCODE);
- } else {
- printf("Please input a language.\n");
- printf("<example> language english\n");
- printf(" language français\n");
- ladmin_log("The language is void ('language' command)." RETCODE);
- }
- return 136;
- }
-
- language[0] = toupper(language[0]);
- if (language[0] == 'F' || language[0] == 'E') {
- defaultlanguage = language[0];
- if (defaultlanguage == 'F') {
- printf("Changement de la langue d'affichage en Français.\n");
- ladmin_log("Changement de la langue d'affichage en Français." RETCODE);
- } else {
- printf("Displaying language changed to English.\n");
- ladmin_log("Displaying language changed to English." RETCODE);
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
- ladmin_log("Langue non paramétrée (Français ou English nécessaire)." RETCODE);
- } else {
- printf("Undefined language (possible languages: Français or English).\n");
- ladmin_log("Undefined language (must be Français or English)." RETCODE);
- }
- }
-
- return 0;
-}
-
-//--------------------------------------------------------
-// Sub-function: Asking to Displaying of the accounts list
-//--------------------------------------------------------
-int listaccount(char* param, int type) {
-//int list_first, list_last, list_type; // parameter to display a list of accounts
- int i;
- WFIFOHEAD(login_fd,10);
-
- list_type = type;
-
- // set default values
- list_first = 0;
- list_last = 0;
-
- if (list_type == 1) { // if listgm
- // get all accounts = use default
- } else if (list_type == 2) { // if search
- for (i = 0; param[i]; i++)
- param[i] = tolower(param[i]);
- // get all accounts = use default
- } else if (list_type == 3) { // if listban
- // get all accounts = use default
- } else if (list_type == 4) { // if listok
- // get all accounts = use default
- } else { // if list (list_type == 0)
- switch(sscanf(param, "%d %d", &list_first, &list_last)) {
- case 0:
- // get all accounts = use default
- break;
- case 1:
- list_last = 0;
- // use tests of the following value
- default:
- if (list_first < 0)
- list_first = 0;
- if (list_last < list_first || list_last < 0)
- list_last = 0;
- break;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d." RETCODE, list_first, list_last);
- } else {
- ladmin_log("Request to login-server to obtain the list of accounts from %d to %d." RETCODE, list_first, list_last);
- }
-
- WFIFOW(login_fd,0) = 0x7920;
- WFIFOL(login_fd,2) = list_first;
- WFIFOL(login_fd,6) = list_last;
- WFIFOSET(login_fd,10);
- bytes_to_read = 1;
-
- // 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if (defaultlanguage == 'F') {
- printf(" id_compte GM nom_utilisateur sexe count statut\n");
- } else {
- printf("account_id GM user_name sex count state\n");
- }
- printf("-------------------------------------------------------------------------------\n");
- list_count = 0;
-
- return 0;
-}
-
-//--------------------------------------------
-// Sub-function: Asking to modify a memo field
-//--------------------------------------------
-int changememo(char* param) {
- char name[1023], memo[1023];
- WFIFOHEAD(login_fd,28+255);
-
- memset(name, '\0', sizeof(name));
- memset(memo, '\0', sizeof(memo));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, memo) < 1 && // memo can be void
- sscanf(param, "'%[^']' %[^\r\n]", name, memo) < 1 && // memo can be void
- sscanf(param, "%s %[^\r\n]", name, memo) < 1) { // memo can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un mémo svp.\n");
- printf("<exemple> memo nomtest nouveau memo\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le mémo d'un compte (commande 'email')." RETCODE);
- } else {
- printf("Please input an account name and a memo.\n");
- printf("<example> memo testname new memo\n");
- ladmin_log("Incomplete parameters to change the memo of an account ('email' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(memo) > 254) {
- if (defaultlanguage == 'F') {
- printf("Mémo trop long (%d caractères).\n", strlen(memo));
- printf("Entrez un mémo de 254 caractères maximum svp.\n");
- ladmin_log("Mémo trop long (%d caractères). Entrez un mémo de 254 caractères maximum svp." RETCODE, strlen(memo));
- } else {
- printf("Memo is too long (%d characters).\n", strlen(memo));
- printf("Please input a memo of 254 bytes at the maximum.\n");
- ladmin_log("Email is too long (%d characters). Please input a memo of 254 bytes at the maximum." RETCODE, strlen(memo));
- }
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un mémo." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a memo." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7942;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = strlen(memo);
- if (strlen(memo) > 0)
- memcpy(WFIFOP(login_fd,28), memo, strlen(memo));
- WFIFOSET(login_fd,28+strlen(memo));
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------
-// Sub-function: Asking to obtain an account name
-//-----------------------------------------------
-int nameaccount(int id) {
- WFIFOHEAD(login_fd,6);
- if (id < 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un id ayant une valeur positive svp.\n");
- ladmin_log("Id négatif donné pour rechecher le nom d'un compte (commande 'name')." RETCODE);
- } else {
- printf("Please input a positive value for the id.\n");
- ladmin_log("Negativ id given to search an account name ('name' command)." RETCODE);
- }
- return 136;
- }
-
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour connaître le nom d'un compte." RETCODE);
- else
- ladmin_log("Request to login-server to know an account name." RETCODE);
-
- WFIFOW(login_fd,0) = 0x7946;
- WFIFOL(login_fd,2) = id;
- WFIFOSET(login_fd,6);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------
-// Sub-function: Asking to modify a password
-// (Note: never send back a password with login-server!! security of passwords)
-//------------------------------------------
-int changepasswd(char* param) {
- char name[1023], password[1023];
- WFIFOHEAD(login_fd,50);
-
- memset(name, '\0', sizeof(name));
- memset(password, '\0', sizeof(password));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 &&
- sscanf(param, "%s %[^\r\n]", name, password) < 1) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> passwd nomtest nouveaumotdepasse\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le mot d'un passe d'un compte (commande 'password')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> passwd testname newpassword\n");
- ladmin_log("Incomplete parameters to change the password of an account ('password' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 134;
- }
- if (verify_password(password) == 0)
- return 131;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un mot de passe." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a password." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7934;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Sub-function: Request to login-server to reload GM configuration file
-// this function have no answer
-//----------------------------------------------------------------------
-int reloadGM(void) {
- WFIFOHEAD(login_fd,2);
- WFIFOW(login_fd,0) = 0x7955;
- WFIFOSET(login_fd,2);
- bytes_to_read = 0;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Demande de recharger le fichier de configuration des GM envoyée." RETCODE);
- printf("Demande de recharger le fichier de configuration des GM envoyée.\n");
- printf("Vérifiez les comptes GM actuels (après rechargement):\n");
- } else {
- ladmin_log("Request to reload the GM configuration file sended." RETCODE);
- printf("Request to reload the GM configuration file sended.\n");
- printf("Check the actual GM accounts (after reloading):\n");
- }
- listaccount(parameters, 1); // 1: to list only GM
-
- return 180;
-}
-
-//-----------------------------------------------------
-// Sub-function: Asking to modify the sex of an account
-//-----------------------------------------------------
-int changesex(char* param) {
- char name[1023], sex[1023];
- WFIFOHEAD(login_fd,27);
-
- memset(name, '\0', sizeof(name));
- memset(sex, '\0', sizeof(sex));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, sex) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, sex) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, sex) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un sexe svp.\n");
- printf("<exemple> sex nomtest Male\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le sexe d'un compte (commande 'sex')." RETCODE);
- } else {
- printf("Please input an account name and a sex.\n");
- printf("<example> sex testname Male\n");
- ladmin_log("Incomplete parameters to change the sex of an account ('sex' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- sex[0] = toupper(sex[0]);
- if (strchr("MF", sex[0]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
- ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
- } else {
- printf("Illegal gender [%s]. Please input M or F.\n", sex);
- ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
- }
- return 103;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un sexe." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a sex." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793c;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOB(login_fd,26) = sex[0];
- WFIFOSET(login_fd,27);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------------------------------
-// Sub-function of sub-function changestate, blockaccount or unblockaccount
-// Asking to modify the state of an account
-//-------------------------------------------------------------------------
-int changestatesub(char* name, int state, char* error_message7) {
- char error_message[1023]; // need to use, because we can modify error_message7
- WFIFOHEAD(login_fd,50);
-
- memset(error_message, '\0', sizeof(error_message));
- strncpy(error_message, error_message7, sizeof(error_message)-1);
-
- if ((state < 0 || state > 9) && state != 100) { // Valid values: 0: ok, or value of the 0x006a packet + 1
- if (defaultlanguage == 'F') {
- printf("Entrez une des statuts suivantes svp:\n");
- printf(" 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n");
- } else {
- printf("Please input one of these states:\n");
- printf(" 0 = Account ok 6 = Your Game's EXE file is not the latest version\n");
- }
- printf(" 1 = Unregistered ID 7 = You are Prohibited to log in until + message\n");
- printf(" 2 = Incorrect Password 8 = Server is jammed due to over populated\n");
- printf(" 3 = This ID is expired 9 = No MSG\n");
- printf(" 4 = Rejected from Server 100 = This ID has been totally erased\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- if (defaultlanguage == 'F') {
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Valeur incorrecte pour le statut d'un compte (commande 'state', 'block' ou 'unblock')." RETCODE);
- } else {
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Invalid value for the state of an account ('state', 'block' or 'unblock' command)." RETCODE);
- }
- return 151;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (state != 7) {
- strcpy(error_message, "-");
- } else {
- if (strlen(error_message) < 1) {
- if (defaultlanguage == 'F') {
- printf("Message d'erreur trop court. Entrez un message de 1-19 caractères.\n");
- ladmin_log("Message d'erreur trop court. Entrez un message de 1-19 caractères." RETCODE);
- } else {
- printf("Error message is too short. Please input a message of 1-19 bytes.\n");
- ladmin_log("Error message is too short. Please input a message of 1-19 bytes." RETCODE);
- }
- return 102;
- }
- if (strlen(error_message) > 19) {
- if (defaultlanguage == 'F') {
- printf("Message d'erreur trop long. Entrez un message de 1-19 caractères.\n");
- ladmin_log("Message d'erreur trop long. Entrez un message de 1-19 caractères." RETCODE);
- } else {
- printf("Error message is too long. Please input a message of 1-19 bytes.\n");
- ladmin_log("Error message is too long. Please input a message of 1-19 bytes." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un statut." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a state." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7936;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = state;
- memcpy(WFIFOP(login_fd,30), error_message, 20);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------------
-// Sub-function: Asking to modify the state of an account
-//-------------------------------------------------------
-int changestate(char* param) {
- char name[1023], error_message[1023];
- int state;
-
- memset(name, '\0', sizeof(name));
- memset(error_message, '\0', sizeof(error_message));
-
- if (sscanf(param, "\"%[^\"]\" %d %[^\r\n]", name, &state, error_message) < 2 &&
- sscanf(param, "'%[^']' %d %[^\r\n]", name, &state, error_message) < 2 &&
- sscanf(param, "%s %d %[^\r\n]", name, &state, error_message) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un statut svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'state')." RETCODE);
- } else {
- printf("Please input an account name and a state.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('state' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, state, error_message);
-}
-
-//-------------------------------------------
-// Sub-function: Asking to unblock an account
-//-------------------------------------------
-int unblockaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'unblock')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('unblock' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, 0, "-"); // state 0, no error message
-}
-
-//-------------------------------------------
-// Sub-function: Asking to unblock an account
-//-------------------------------------------
-int blockaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'block')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('block' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, 5, "-"); // state 5, no error message
-}
-
-//---------------------------------------------------------------------
-// Sub-function: Add/substract time to the validity limit of an account
-//---------------------------------------------------------------------
-int timeaddaccount(char* param) {
- char name[1023], modif[1023];
- int year, month, day, hour, minute, second;
- char * p_modif;
- int value, i;
- WFIFOHEAD(login_fd,38);
-
- memset(name, '\0', sizeof(name));
- memset(modif, '\0', sizeof(modif));
- year = month = day = hour = minute = second = 0;
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un modificateur svp.\n");
- printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Nombre incorrect de paramètres pour modifier une date limite d'utilisation (commande 'timeadd')." RETCODE);
- } else {
- printf("Please input an account name and a modifier.\n");
- printf(" <example>: timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("Incomplete parameters to modify a limit time ('timeadd' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- // lowercase for modif
- for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
- p_modif = modif;
- while (strlen(p_modif) > 0) {
- value = atoi(p_modif);
- if (value == 0) {
- p_modif++;
- } else {
- if (p_modif[0] == '-' || p_modif[0] == '+')
- p_modif++;
- while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
- p_modif++;
- }
- if (p_modif[0] == 's') {
- second = value;
- p_modif++;
- } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
- minute = value;
- p_modif += 2;
- } else if (p_modif[0] == 'h') {
- hour = value;
- p_modif++;
- } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
- day = value;
- p_modif += 2;
- } else if (p_modif[0] == 'm') {
- month = value;
- p_modif++;
- } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
- year = value;
- p_modif++;
- } else {
- p_modif++;
- }
- }
- }
-
- if (defaultlanguage == 'F') {
- printf(" année: %d\n", year);
- printf(" mois: %d\n", month);
- printf(" jour: %d\n", day);
- printf(" heure: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" seconde: %d\n", second);
- } else {
- printf(" year: %d\n", year);
- printf(" month: %d\n", month);
- printf(" day: %d\n", day);
- printf(" hour: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" second: %d\n", second);
- }
-
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- if (defaultlanguage == 'F') {
- printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'timeadd')." RETCODE);
- } else {
- printf("Please give an adjustment with this command:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("No adjustment isn't an adjustment ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (year > 127 || year < -127) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
- ladmin_log("Ajustement de l'année hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the years (from -127 to 127).\n");
- ladmin_log("Abnormal adjustement for the year ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (month > 255 || month < -255) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
- ladmin_log("Ajustement du mois hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the months (from -255 to 255).\n");
- ladmin_log("Abnormal adjustement for the month ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (day > 32767 || day < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des jours hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the days ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (hour > 32767 || hour < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des heures hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the hours ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (minute > 32767 || minute < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des minutes hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the minutes ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (second > 32767 || second < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des secondes hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the seconds ('timeadd' command)." RETCODE);
- }
- return 137;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour modifier une date limite d'utilisation." RETCODE);
- } else {
- ladmin_log("Request to login-server to modify a time limit." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7950;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = (short)year;
- WFIFOW(login_fd,28) = (short)month;
- WFIFOW(login_fd,30) = (short)day;
- WFIFOW(login_fd,32) = (short)hour;
- WFIFOW(login_fd,34) = (short)minute;
- WFIFOW(login_fd,36) = (short)second;
- WFIFOSET(login_fd,38);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------
-// Sub-function: Set a validity limit of an account
-//-------------------------------------------------
-int timesetaccount(char* param) {
- char name[1023], date[1023], time[1023];
- int year, month, day, hour, minute, second;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- struct tm *tmtime;
- WFIFOHEAD(login_fd,30);
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
- year = month = day = hour = minute = second = 0;
- connect_until_time = 0;
- tmtime = localtime(&connect_until_time); // initialize
-
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" timeset <nom_du_compte> 0 (0 = illimité)\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer une date limite d'utilisation (commande 'timeset')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" timeset <account_name> 0 (0 = unlimited)\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a limit time ('timeset' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (time[0] == '\0')
- strcpy(time, "23:59:59");
-
- if (atoi(date) != 0 &&
- ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d.%d.%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d'%d'%d", &year, &month, &day) < 3) ||
- sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
- if (defaultlanguage == 'F') {
- printf("Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
- ladmin_log("Format incorrect pour la date/heure ('timeset' command)." RETCODE);
- } else {
- printf("Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
- ladmin_log("Invalid format for the date/time ('timeset' command)." RETCODE);
- }
- return 102;
- }
-
- if (atoi(date) == 0) {
- connect_until_time = 0;
- } else {
- if (year < 70) {
- year = year + 100;
- }
- if (year >= 1900) {
- year = year - 1900;
- }
- if (month < 1 || month > 12) {
- if (defaultlanguage == 'F') {
- printf("Entrez un mois correct svp (entre 1 et 12).\n");
- ladmin_log("Mois incorrect pour la date ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the month (from 1 to 12).\n");
- ladmin_log("Invalid month for the date ('timeset' command)." RETCODE);
- }
- return 102;
- }
- month = month - 1;
- if (day < 1 || day > 31) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct svp (entre 1 et 31).\n");
- ladmin_log("Jour incorrect pour la date ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the day (from 1 to 31).\n");
- ladmin_log("Invalid day for the date ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
- (month == 1 && day > 29)) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
- ladmin_log("Jour incorrect pour ce mois correspondant ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for a day of this month (%d).\n", month);
- ladmin_log("Invalid day for this month ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (hour < 0 || hour > 23) {
- if (defaultlanguage == 'F') {
- printf("Entrez une heure correcte svp (entre 0 et 23).\n");
- ladmin_log("Heure incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the hour (from 0 to 23).\n");
- ladmin_log("Invalid hour for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (minute < 0 || minute > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
- ladmin_log("Minute incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the minutes (from 0 to 59).\n");
- ladmin_log("Invalid minute for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (second < 0 || second > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
- ladmin_log("Seconde incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the seconds (from 0 to 59).\n");
- ladmin_log("Invalid second for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- tmtime->tm_year = year;
- tmtime->tm_mon = month;
- tmtime->tm_mday = day;
- tmtime->tm_hour = hour;
- tmtime->tm_min = minute;
- tmtime->tm_sec = second;
- tmtime->tm_isdst = -1; // -1: no winter/summer time modification
- connect_until_time = mktime(tmtime);
- if (connect_until_time == -1) {
- if (defaultlanguage == 'F') {
- printf("Date incorrecte.\n");
- printf("Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
- ladmin_log("Date incorrecte. ('timeset' command)." RETCODE);
- } else {
- printf("Invalid date.\n");
- printf("Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
- ladmin_log("Invalid date. ('timeset' command)." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour fixer une date limite d'utilisation." RETCODE);
- } else {
- ladmin_log("Request to login-server to set a time limit." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7948;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = (int)connect_until_time;
- WFIFOSET(login_fd,30);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------------------------------------------
-// Sub-function: Asking to displaying information about an account (by its name)
-//------------------------------------------------------------------------------
-int whoaccount(char* param) {
- char name[1023];
- WFIFOHEAD(login_fd,26);
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> who nomtest\n");
- ladmin_log("Aucun nom n'a été donné pour trouver le compte." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> who testname\n");
- ladmin_log("No name was given to found the account." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par le nom)." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain information about an account (by its name)." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7952;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//--------------------------------------------------------
-// Sub-function: Asking of the version of the login-server
-//--------------------------------------------------------
-int checkloginversion(void) {
- WFIFOHEAD(login_fd,2);
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir sa version." RETCODE);
- else
- ladmin_log("Request to login-server to obtain its version." RETCODE);
-
- WFIFOW(login_fd,0) = 0x7530;
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------
-// Prompt function
-// this function wait until user type a command
-// and analyse the command.
-//---------------------------------------------
-int prompt(void) {
- int i, j;
- char buf[1024];
- char *p;
-
- // while we don't wait new packets
- while (bytes_to_read == 0) {
- // for help with the console colors look here:
- // http://www.edoceo.com/liberum/?doc=printf-with-color
- // some code explanation (used here):
- // \033[2J : clear screen and go up/left (0, 0 position)
- // \033[K : clear line from actual position to end of the line
- // \033[0m : reset color parameter
- // \033[1m : use bold for font
- printf("\n");
- if (defaultlanguage == 'F')
- printf("\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n");
- else
- printf("\033[32mTo list the commands, type 'enter'.\033[0m\n");
- printf("\033[0;36mLadmin-> \033[0m");
- printf("\033[1m");
- fflush(stdout);
-
- // get command and parameter
- memset(buf, '\0', sizeof(buf));
- fflush(stdin);
- fgets(buf, 1023, stdin);
- buf[1023] = '\0';
-
- printf("\033[0m");
- fflush(stdout);
-
- // remove final \n
- if((p = strrchr(buf, '\n')) != NULL)
- p[0] = '\0';
- // remove all control char
- for (i = 0; buf[i]; i++)
- if (buf[i] < 32) {
- // remove cursor control.
- if (buf[i] == 27 && buf[i+1] == '[' &&
- (buf[i+2] == 'H' || // home position (cursor)
- buf[i+2] == 'J' || // clear screen
- buf[i+2] == 'A' || // up 1 line
- buf[i+2] == 'B' || // down 1 line
- buf[i+2] == 'C' || // right 1 position
- buf[i+2] == 'D' || // left 1 position
- buf[i+2] == 'G')) { // center cursor (windows)
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+3];
- } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+2] == '2' && buf[i+3] == 'J') { // clear screen
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+4];
- } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+3] == '~' &&
- (buf[i+2] == '1' || // home (windows)
- buf[i+2] == '2' || // insert (windows)
- buf[i+2] == '3' || // del (windows)
- buf[i+2] == '4' || // end (windows)
- buf[i+2] == '5' || // pgup (windows)
- buf[i+2] == '6')) { // pgdown (windows)
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+4];
- } else {
- // remove other control char.
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+1];
- }
- i--;
- }
-
- // extract command name and parameters
- memset(command, '\0', sizeof(command));
- memset(parameters, '\0', sizeof(parameters));
- sscanf(buf, "%1023s %[^\n]", command, parameters);
- command[1023] = '\0';
- parameters[1023] = '\0';
-
- // lowercase for command line
- for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
-
- if (command[0] == '?' || strlen(command) == 0) {
- if (defaultlanguage == 'F') {
- strcpy(buf, "aide");
- strcpy(command, "aide");
- } else {
- strcpy(buf, "help");
- strcpy(command, "help");
- }
- }
-
- // Analyse of the command
- check_command(command); // give complete name to the command
-
- if (strlen(parameters) == 0) {
- if (defaultlanguage == 'F') {
- ladmin_log("Commande: '%s' (sans paramètre)" RETCODE, command, parameters);
- } else {
- ladmin_log("Command: '%s' (without parameters)" RETCODE, command, parameters);
- }
- } else {
- if (defaultlanguage == 'F') {
- ladmin_log("Commande: '%s', paramètres: '%s'" RETCODE, command, parameters);
- } else {
- ladmin_log("Command: '%s', parameters: '%s'" RETCODE, command, parameters);
- }
- }
-
- // Analyse of the command
-// help
- if (strcmp(command, "aide") == 0) {
- display_help(parameters, 1); // 1: french
- } else if (strcmp(command, "help") == 0 ) {
- display_help(parameters, 0); // 0: english
-// general commands
- } else if (strcmp(command, "add") == 0) {
- addaccount(parameters, 0); // 0: no email
- } else if (strcmp(command, "ban") == 0) {
- banaccount(parameters);
- } else if (strcmp(command, "banadd") == 0) {
- banaddaccount(parameters);
- } else if (strcmp(command, "banset") == 0) {
- bansetaccount(parameters);
- } else if (strcmp(command, "block") == 0) {
- blockaccount(parameters);
- } else if (strcmp(command, "check") == 0) {
- checkaccount(parameters);
- } else if (strcmp(command, "create") == 0) {
- addaccount(parameters, 1); // 1: with email
- } else if (strcmp(command, "delete") == 0) {
- delaccount(parameters);
- } else if (strcmp(command, "email") == 0) {
- changeemail(parameters);
- } else if (strcmp(command, "getcount") == 0) {
- getlogincount();
- } else if (strcmp(command, "gm") == 0) {
- changegmlevel(parameters);
- } else if (strcmp(command, "id") == 0) {
- idaccount(parameters);
- } else if (strcmp(command, "info") == 0) {
- infoaccount(atoi(parameters));
- } else if (strcmp(command, "kami") == 0) {
- sendbroadcast(0, parameters); // flag for normal
- } else if (strcmp(command, "kamib") == 0) {
- sendbroadcast(0x10, parameters); // flag for blue
- } else if (strcmp(command, "language") == 0) {
- changelanguage(parameters);
- } else if (strcmp(command, "list") == 0) {
- listaccount(parameters, 0); // 0: to list all
- } else if (strcmp(command, "listban") == 0) {
- listaccount(parameters, 3); // 3: to list only accounts with state or bannished
- } else if (strcmp(command, "listgm") == 0) {
- listaccount(parameters, 1); // 1: to list only GM
- } else if (strcmp(command, "listok") == 0) {
- listaccount(parameters, 4); // 4: to list only accounts without state and not bannished
- } else if (strcmp(command, "memo") == 0) {
- changememo(parameters);
- } else if (strcmp(command, "name") == 0) {
- nameaccount(atoi(parameters));
- } else if (strcmp(command, "password") == 0) {
- changepasswd(parameters);
- } else if (strcmp(command, "reloadgm") == 0) {
- reloadGM();
- } else if (strcmp(command, "search") == 0) { // no regex in C version
- listaccount(parameters, 2); // 2: to list with pattern
- } else if (strcmp(command, "sex") == 0) {
- changesex(parameters);
- } else if (strcmp(command, "state") == 0) {
- changestate(parameters);
- } else if (strcmp(command, "timeadd") == 0) {
- timeaddaccount(parameters);
- } else if (strcmp(command, "timeset") == 0) {
- timesetaccount(parameters);
- } else if (strcmp(command, "unban") == 0) {
- unbanaccount(parameters);
- } else if (strcmp(command, "unblock") == 0) {
- unblockaccount(parameters);
- } else if (strcmp(command, "version") == 0) {
- checkloginversion();
- } else if (strcmp(command, "who") == 0) {
- whoaccount(parameters);
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- if (defaultlanguage == 'F') {
- printf("Au revoir.\n");
- } else {
- printf("Bye.\n");
- }
- exit(0);
-// unknown command
- } else {
- if (defaultlanguage == 'F') {
- printf("Commande inconnue [%s].\n", buf);
- ladmin_log("Commande inconnue [%s]." RETCODE, buf);
- } else {
- printf("Unknown command [%s].\n", buf);
- ladmin_log("Unknown command [%s]." RETCODE, buf);
- }
- }
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------
-// Function: Parse receiving informations from the login-server
-//-------------------------------------------------------------
-int parse_fromlogin(int fd) {
- struct char_session_data *sd;
- int id;
- RFIFOHEAD(fd);
- if (session[fd]->eof) {
- if (defaultlanguage == 'F') {
- printf("Impossible de se connecter au serveur de login [%s:%d] !\n", loginserverip, loginserverport);
- ladmin_log("Impossible de se connecter au serveur de login [%s:%d] !" RETCODE, loginserverip, loginserverport);
- } else {
- printf("Impossible to have a connection with the login-server [%s:%d] !\n", loginserverip, loginserverport);
- ladmin_log("Impossible to have a connection with the login-server [%s:%d] !" RETCODE, loginserverip, loginserverport);
- }
- close(fd);
- delete_session(fd);
- exit (0);
- }
-
-// printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
- sd = (struct char_session_data*)session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2) {
- switch(RFIFOW(fd,0)) {
- case 0x7919: // answer of a connection request
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd,2) != 0) {
- if (defaultlanguage == 'F') {
- printf("Erreur de login:\n");
- printf(" - mot de passe incorrect,\n");
- printf(" - système d'administration non activé, ou\n");
- printf(" - IP non autorisée.\n");
- ladmin_log("Erreur de login: mot de passe incorrect, système d'administration non activé, ou IP non autorisée." RETCODE);
- } else {
- printf("Error at login:\n");
- printf(" - incorrect password,\n");
- printf(" - administration system not activated, or\n");
- printf(" - unauthorised IP.\n");
- ladmin_log("Error at login: incorrect password, administration system not activated, or unauthorised IP." RETCODE);
- }
- session[fd]->eof = 1;
- //bytes_to_read = 1; // not stop at prompt
- } else {
- if (defaultlanguage == 'F') {
- printf("Connexion établie.\n");
- ladmin_log("Connexion établie." RETCODE);
- printf("Lecture de la version du serveur de login...\n");
- ladmin_log("Lecture de la version du serveur de login..." RETCODE);
- } else {
- printf("Established connection.\n");
- ladmin_log("Established connection." RETCODE);
- printf("Reading of the version of the login-server...\n");
- ladmin_log("Reading of the version of the login-server..." RETCODE);
- }
- //bytes_to_read = 1; // unchanged
- checkloginversion();
- }
- RFIFOSKIP(fd,3);
- break;
-
-#ifdef PASSWORDENC
- case 0x01dc: // answer of a coding key request
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- char md5str[64] = "", md5bin[32];
- WFIFOHEAD(login_fd, 20);
- if (passenc == 1) {
- strncpy(md5str, (const char*)RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- strcat(md5str, loginserveradminpassword);
- } else if (passenc == 2) {
- strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword));
- strcat(md5str, (const char*)RFIFOP(fd,4));
- }
- MD5_String2binary(md5str, md5bin);
- WFIFOW(login_fd,0) = 0x7918; // Request for administation login (encrypted password)
- WFIFOW(login_fd,2) = passenc; // Encrypted type
- memcpy(WFIFOP(login_fd,4), md5bin, 16);
- WFIFOSET(login_fd,20);
- if (defaultlanguage == 'F') {
- printf("Réception de la clef MD5.\n");
- ladmin_log("Réception de la clef MD5." RETCODE);
- printf("Envoi du mot de passe crypté...\n");
- ladmin_log("Envoi du mot de passe crypté..." RETCODE);
- } else {
- printf("Receiving of the MD5 key.\n");
- ladmin_log("Receiving of the MD5 key." RETCODE);
- printf("Sending of the encrypted password...\n");
- ladmin_log("Sending of the encrypted password..." RETCODE);
- }
- }
- bytes_to_read = 1;
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-#endif
-
- case 0x7531: // Displaying of the version of the login-server
- if (RFIFOREST(fd) < 10)
- return 0;
- printf(" Login-Server [%s:%d]\n", loginserverip, loginserverport);
- if (((int)RFIFOB(login_fd,5)) == 0) {
- printf(" eAthena version stable-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
- } else {
- printf(" eAthena version dev-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
- }
- if (((int)RFIFOB(login_fd,4)) == 0)
- printf(" revision %d", (int)RFIFOB(login_fd,4));
- if (((int)RFIFOB(login_fd,6)) == 0)
- printf("%d.\n", RFIFOW(login_fd,8));
- else
- printf("-mod%d.\n", RFIFOW(login_fd,8));
- bytes_to_read = 0;
- RFIFOSKIP(fd,10);
- break;
-
- case 0x7921: // Displaying of the list of accounts
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (RFIFOW(fd,2) < 5) {
- if (defaultlanguage == 'F') {
- ladmin_log(" Réception d'une liste des comptes vide." RETCODE);
- if (list_count == 0)
- printf("Aucun compte trouvé.\n");
- else if (list_count == 1)
- printf("1 compte trouvé.\n");
- else
- printf("%d comptes trouvés.\n", list_count);
- } else {
- ladmin_log(" Receiving of a void accounts list." RETCODE);
- if (list_count == 0)
- printf("No account found.\n");
- else if (list_count == 1)
- printf("1 account found.\n");
- else
- printf("%d accounts found.\n", list_count);
- }
- bytes_to_read = 0;
- } else {
- int i;
- WFIFOHEAD(login_fd,10);
- if (defaultlanguage == 'F')
- ladmin_log(" Réception d'une liste des comptes." RETCODE);
- else
- ladmin_log(" Receiving of a accounts list." RETCODE);
- for(i = 4; i < RFIFOW(fd,2); i += 38) {
- int j;
- char userid[24];
- char lower_userid[24];
- memcpy(userid, RFIFOP(fd,i + 5), sizeof(userid));
- userid[sizeof(userid)-1] = '\0';
- memset(lower_userid, '\0', sizeof(lower_userid));
- for (j = 0; userid[j]; j++)
- lower_userid[j] = tolower(userid[j]);
- list_first = RFIFOL(fd,i) + 1;
- // here are checks...
- if (list_type == 0 ||
- (list_type == 1 && RFIFOB(fd,i+4) > 0) ||
- (list_type == 2 && strstr(lower_userid, parameters) != NULL) ||
- (list_type == 3 && RFIFOL(fd,i+34) != 0) ||
- (list_type == 4 && RFIFOL(fd,i+34) == 0)) {
- printf("%10d ", (int)RFIFOL(fd,i));
- if (RFIFOB(fd,i+4) == 0)
- printf(" ");
- else
- printf("%2d ", (int)RFIFOB(fd,i+4));
- printf("%-24s", userid);
- if (defaultlanguage == 'F') {
- if (RFIFOB(fd,i+29) == 0)
- printf("%-5s ", "Femme");
- else if (RFIFOB(fd,i+29) == 1)
- printf("%-5s ", "Male");
- else
- printf("%-5s ", "Servr");
- } else {
- if (RFIFOB(fd,i+29) == 0)
- printf("%-5s ", "Femal");
- else if (RFIFOB(fd,i+29) == 1)
- printf("%-5s ", "Male");
- else
- printf("%-5s ", "Servr");
- }
- printf("%6d ", (int)RFIFOL(fd,i+30));
- switch(RFIFOL(fd,i+34)) {
- case 0:
- if (defaultlanguage == 'F')
- printf("%-27s\n", "Compte Ok");
- else
- printf("%-27s\n", "Account OK");
- break;
- case 1:
- printf("%-27s\n", "Unregistered ID");
- break;
- case 2:
- printf("%-27s\n", "Incorrect Password");
- break;
- case 3:
- printf("%-27s\n", "This ID is expired");
- break;
- case 4:
- printf("%-27s\n", "Rejected from Server");
- break;
- case 5:
- printf("%-27s\n", "Blocked by the GM Team"); // You have been blocked by the GM Team
- break;
- case 6:
- printf("%-27s\n", "Your EXE file is too old"); // Your Game's EXE file is not the latest version
- break;
- case 7:
- printf("%-27s\n", "Banishement or");
- printf(" Prohibited to login until...\n"); // You are Prohibited to log in until %s
- break;
- case 8:
- printf("%-27s\n", "Server is over populated");
- break;
- case 9:
- printf("%-27s\n", "No MSG");
- break;
- default: // 100
- printf("%-27s\n", "This ID is totally erased"); // This ID has been totally erased
- break;
- }
- list_count++;
- }
- }
- // asking of the following acounts
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d (complément)." RETCODE, list_first, list_last);
- else
- ladmin_log("Request to login-server to obtain the list of accounts from %d to %d (complement)." RETCODE, list_first, list_last);
- WFIFOW(login_fd,0) = 0x7920;
- WFIFOL(login_fd,2) = list_first;
- WFIFOL(login_fd,6) = list_last;
- WFIFOSET(login_fd,10);
- bytes_to_read = 1;
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x7931: // Answer of login-server about an account creation
- if (RFIFOREST(fd) < 30)
- return 0;
- id=RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec à la création du compte [%s]. Un compte identique existe déjà.\n", RFIFOP(fd,6));
- ladmin_log("Echec à la création du compte [%s]. Un compte identique existe déjà." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] creation failed. Same account already exists.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] creation failed. Same account already exists." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Compte [%s] créé avec succès [id: %d].\n", RFIFOP(fd,6), id);
- ladmin_log("Compte [%s] créé avec succès [id: %d]." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), id);
- ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7933: // Answer of login-server about an account deletion
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la suppression du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la suppression du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] deletion failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] deletion failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Compte [%s][id: %d] SUPPRIME avec succès.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
- ladmin_log("Compte [%s][id: %d] SUPPRIME avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] is successfully DELETED.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] is successfully DELETED." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7935: // answer of the change of an account password
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du mot de passe du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification du mot de passe du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] password changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account password changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Modification du mot de passe du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
- ladmin_log("Modification du mot de passe du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), (int)RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), (int)RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7937: // answer of the change of an account state
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement du statut du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement du statut du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] state changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] state changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- char tmpstr[256];
- if (defaultlanguage == 'F') {
- sprintf(tmpstr, "Statut du compte [%s] changé avec succès en [", RFIFOP(fd,6));
- } else {
- sprintf(tmpstr, "Account [%s] state successfully changed in [", RFIFOP(fd,6));
- }
- switch(RFIFOL(fd,30)) {
- case 0:
- if (defaultlanguage == 'F')
- strcat(tmpstr, "0: Compte Ok");
- else
- strcat(tmpstr, "0: Account OK");
- break;
- case 1:
- strcat(tmpstr, "1: Unregistered ID");
- break;
- case 2:
- strcat(tmpstr, "2: Incorrect Password");
- break;
- case 3:
- strcat(tmpstr, "3: This ID is expired");
- break;
- case 4:
- strcat(tmpstr, "4: Rejected from Server");
- break;
- case 5:
- strcat(tmpstr, "5: You have been blocked by the GM Team");
- break;
- case 6:
- strcat(tmpstr, "6: [Your Game's EXE file is not the latest version");
- break;
- case 7:
- strcat(tmpstr, "7: You are Prohibited to log in until...");
- break;
- case 8:
- strcat(tmpstr, "8: Server is jammed due to over populated");
- break;
- case 9:
- strcat(tmpstr, "9: No MSG");
- break;
- default: // 100
- strcat(tmpstr, "100: This ID is totally erased");
- break;
- }
- strcat(tmpstr, "]");
- printf("%s\n", tmpstr);
- ladmin_log("%s%s", tmpstr, RETCODE);
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x7939: // answer of the number of online players
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- // Get length of the received packet
- int i;
- char name[20];
- if (defaultlanguage == 'F') {
- ladmin_log(" Réception du nombre de joueurs en ligne." RETCODE);
- } else {
- ladmin_log(" Receiving of the number of online players." RETCODE);
- }
- // Read information of the servers
- if (RFIFOW(fd,2) < 5) {
- if (defaultlanguage == 'F') {
- printf(" Aucun serveur n'est connecté au login serveur.\n");
- } else {
- printf(" No server is connected to the login-server.\n");
- }
- } else {
- if (defaultlanguage == 'F') {
- printf(" Nombre de joueurs en ligne (serveur: nb):\n");
- } else {
- printf(" Number of online players (server: number).\n");
- }
- // Displaying of result
- for(i = 4; i < RFIFOW(fd,2); i += 32) {
- memcpy(name, RFIFOP(fd,i+6), sizeof(name));
- name[sizeof(name) - 1] = '\0';
- printf(" %-20s : %5d\n", name, RFIFOW(fd,i+26));
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x793b: // answer of the check of a password
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Le compte [%s] n'existe pas ou le mot de passe est incorrect.\n", RFIFOP(fd,6));
- ladmin_log("Le compte [%s] n'existe pas ou le mot de passe est incorrect." RETCODE, RFIFOP(fd,6));
- } else {
- printf("The account [%s] doesn't exist or the password is incorrect.\n", RFIFOP(fd,6));
- ladmin_log("The account [%s] doesn't exist or the password is incorrect." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le mot de passe donné correspond bien au compte [%s][id: %d].\n", RFIFOP(fd,6), id);
- ladmin_log("Le mot de passe donné correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), id);
- ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x793d: // answer of the change of an account sex
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du sexe du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas ou le sexe est déjà celui demandé.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification du sexe du compte. Le compte [%s] n'existe pas ou le sexe est déjà celui demandé." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] sex changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist or the sex is already the good sex.\n", RFIFOP(fd,6));
- ladmin_log("Account sex changing failed. The compte [%s] doesn't exist or the sex is already the good sex." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Sexe du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
- ladmin_log("Sexe du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), id);
- ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x793f: // answer of the change of an account GM level
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du niveau de GM du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé\n", RFIFOP(fd,6));
- printf("ou il est impossible de modifier le fichier des comptes GM.\n");
- ladmin_log("Echec de la modification du niveau de GM du compte. Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé ou il est impossible de modifier le fichier des comptes GM." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] GM level changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist, the GM level is already the good GM level\n", RFIFOP(fd,6));
- printf("or it's impossible to modify the GM accounts file.\n");
- ladmin_log("Account GM level changing failed. The compte [%s] doesn't exist, the GM level is already the good sex or it's impossible to modify the GM accounts file." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Niveau de GM du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
- ladmin_log("Niveau de GM du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), id);
- ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7941: // answer of the change of an account email
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification de l'e-mail du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification de l'e-mail du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] e-mail changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account e-mail changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Modification de l'e-mail du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), id);
- ladmin_log("Modification de l'e-mail du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), id);
- ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7943: // answer of the change of an account memo
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement du mémo du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement du mémo du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] memo changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] memo changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Mémo du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
- ladmin_log("Mémo du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), id);
- ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7945: // answer of an account id search
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Unable to find the account [%s] id. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Unable to find the account [%s] id. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le compte [%s] a pour id: %d.\n", RFIFOP(fd,6), id);
- ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), id);
- ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), id);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7947: // answer of an account name search
- if (RFIFOREST(fd) < 30)
- return 0;
- id = RFIFOL(fd,2);
- if (strcmp((const char*)RFIFOP(fd,6), "") == 0) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", id);
- ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, id);
- } else {
- printf("Unable to find the account [%d] name. Account doesn't exist.\n", id);
- ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, id);
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le compte [id: %d] a pour nom: %s.\n", id, RFIFOP(fd,6));
- ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, id, RFIFOP(fd,6));
- } else {
- printf("The account [id: %d] have the name: %s.\n", id, RFIFOP(fd,6));
- ladmin_log("The account [id: %d] have the name: %s." RETCODE, id, RFIFOP(fd,6));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7949: // answer of an account validity limit set
- if (RFIFOREST(fd) < 34)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité].\n", RFIFOP(fd,6), id);
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité]." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), id);
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), id);
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794b: // answer of an account ban set
- if (RFIFOREST(fd) < 34)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), id);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), id);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), id);
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794d: // answer of an account ban date/time changing
- if (RFIFOREST(fd) < 34)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), id);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), id);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), id);
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794f: // answer of a broadcast
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOW(fd,2) == (unsigned short)-1) {
- if (defaultlanguage == 'F') {
- printf("Echec de l'envoi du message. Aucun server de char en ligne.\n");
- ladmin_log("Echec de l'envoi du message. Aucun server de char en ligne." RETCODE);
- } else {
- printf("Message sending failed. No online char-server.\n");
- ladmin_log("Message sending failed. No online char-server." RETCODE);
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Message transmis au server de logins avec succès.\n");
- ladmin_log("Message transmis au server de logins avec succès." RETCODE);
- } else {
- printf("Message successfully sended to login-server.\n");
- ladmin_log("Message successfully sended to login-server." RETCODE);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,4);
- break;
-
- case 0x7951: // answer of an account validity limit changing
- if (RFIFOREST(fd) < 34)
- return 0;
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] inchangée.\n", RFIFOP(fd,6), id);
- printf("Le compte a une validité illimitée ou\n");
- printf("la modification est impossible avec les ajustements demandés.\n");
- ladmin_log("Limite de validité du compte [%s][id: %d] inchangée. Le compte a une validité illimitée ou la modification est impossible avec les ajustements demandés." RETCODE, RFIFOP(fd,6), id);
- } else {
- printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), id);
- printf("The account have an unlimited validity limit or\n");
- printf("the changing is impossible with the proposed adjustments.\n");
- ladmin_log("Validity limit of the account [%s][id: %d] unchanged. The account have an unlimited validity limit or the changing is impossible with the proposed adjustments." RETCODE, RFIFOP(fd,6), id);
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- } else {
- printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
- ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x7953: // answer of a request about informations of an account (by account name/id)
- if (RFIFOREST(fd) < 150 || RFIFOREST(fd) < (150 + RFIFOW(fd,148)))
- return 0;
- {
- char userid[24], error_message[20], lastlogin[24], last_ip[16], email[40], memo[255];
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- memcpy(userid, RFIFOP(fd,7), sizeof(userid));
- userid[sizeof(userid)-1] = '\0';
- memcpy(error_message, RFIFOP(fd,40), sizeof(error_message));
- error_message[sizeof(error_message)-1] = '\0';
- memcpy(lastlogin, RFIFOP(fd,60), sizeof(lastlogin));
- lastlogin[sizeof(lastlogin)-1] = '\0';
- memcpy(last_ip, RFIFOP(fd,84), sizeof(last_ip));
- last_ip[sizeof(last_ip)-1] = '\0';
- memcpy(email, RFIFOP(fd,100), sizeof(email));
- email[sizeof(email)-1] = '\0';
- connect_until_time = (time_t)RFIFOL(fd,140);
- ban_until_time = (time_t)RFIFOL(fd,144);
- memset(memo, '\0', sizeof(memo));
- strncpy(memo, (const char*)RFIFOP(fd,150), RFIFOW(fd,148));
- id = RFIFOL(fd,2);
- if (id == -1) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le compte [%s]. Le compte n'existe pas.\n", parameters);
- ladmin_log("Impossible de trouver le compte [%s]. Le compte n'existe pas." RETCODE, parameters);
- } else {
- printf("Unabled to find the account [%s]. Account doesn't exist.\n", parameters);
- ladmin_log("Unabled to find the account [%s]. Account doesn't exist." RETCODE, parameters);
- }
- } else if (strlen(userid) == 0) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le compte [id: %s]. Le compte n'existe pas.\n", parameters);
- ladmin_log("Impossible de trouver le compte [id: %s]. Le compte n'existe pas." RETCODE, parameters);
- } else {
- printf("Unabled to find the account [id: %s]. Account doesn't exist.\n", parameters);
- ladmin_log("Unabled to find the account [id: %s]. Account doesn't exist." RETCODE, parameters);
- }
- } else {
- if (defaultlanguage == 'F') {
- ladmin_log("Réception d'information concernant un compte." RETCODE);
- printf("Le compte a les caractéristiques suivantes:\n");
- } else {
- ladmin_log("Receiving information about an account." RETCODE);
- printf("The account is set with:\n");
- }
- if (RFIFOB(fd,6) == 0) {
- printf(" Id: %d (non-GM)\n", id);
- } else {
- if (defaultlanguage == 'F') {
- printf(" Id: %d (GM niveau %d)\n", id, (int)RFIFOB(fd,6));
- } else {
- printf(" Id: %d (GM level %d)\n", id, (int)RFIFOB(fd,6));
- }
- }
- if (defaultlanguage == 'F') {
- printf(" Nom: '%s'\n", userid);
- if (RFIFOB(fd,31) == 0)
- printf(" Sexe: Femme\n");
- else if (RFIFOB(fd,31) == 1)
- printf(" Sexe: Male\n");
- else
- printf(" Sexe: Serveur\n");
- } else {
- printf(" Name: '%s'\n", userid);
- if (RFIFOB(fd,31) == 0)
- printf(" Sex: Female\n");
- else if (RFIFOB(fd,31) == 1)
- printf(" Sex: Male\n");
- else
- printf(" Sex: Server\n");
- }
- printf(" E-mail: %s\n", email);
- switch(RFIFOL(fd,36)) {
- case 0:
- if (defaultlanguage == 'F')
- printf(" Statut: 0 [Compte Ok]\n");
- else
- printf(" Statut: 0 [Account OK]\n");
- break;
- case 1:
- printf(" Statut: 1 [Unregistered ID]\n");
- break;
- case 2:
- printf(" Statut: 2 [Incorrect Password]\n");
- break;
- case 3:
- printf(" Statut: 3 [This ID is expired]\n");
- break;
- case 4:
- printf(" Statut: 4 [Rejected from Server]\n");
- break;
- case 5:
- printf(" Statut: 5 [You have been blocked by the GM Team]\n");
- break;
- case 6:
- printf(" Statut: 6 [Your Game's EXE file is not the latest version]\n");
- break;
- case 7:
- printf(" Statut: 7 [You are Prohibited to log in until %s]\n", error_message);
- break;
- case 8:
- printf(" Statut: 8 [Server is jammed due to over populated]\n");
- break;
- case 9:
- printf(" Statut: 9 [No MSG]\n");
- break;
- default: // 100
- printf(" Statut: %d [This ID is totally erased]\n", (int)RFIFOL(fd,36));
- break;
- }
- if (defaultlanguage == 'F') {
- if (ban_until_time == 0) {
- printf(" Banissement: non banni.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
- printf(" Banissement: jusqu'au %s.\n", tmpstr);
- }
- if (RFIFOL(fd,32) > 1)
- printf(" Compteur: %d connexions.\n", (int)RFIFOL(fd,32));
- else
- printf(" Compteur: %d connexion.\n", (int)RFIFOL(fd,32));
- printf(" Dernière connexion le: %s (ip: %s)\n", lastlogin, last_ip);
- if (connect_until_time == 0) {
- printf(" Limite de validité: illimité.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
- printf(" Limite de validité: jusqu'au %s.\n", tmpstr);
- }
- } else {
- if (ban_until_time == 0) {
- printf(" Banishment: not banished.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
- printf(" Banishment: until %s.\n", tmpstr);
- }
- if (RFIFOL(fd,32) > 1)
- printf(" Count: %d connections.\n", (int)RFIFOL(fd,32));
- else
- printf(" Count: %d connection.\n", (int)RFIFOL(fd,32));
- printf(" Last connection at: %s (ip: %s)\n", lastlogin, last_ip);
- if (connect_until_time == 0) {
- printf(" Validity limit: unlimited.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
- printf(" Validity limit: until %s.\n", tmpstr);
- }
- }
- printf(" Memo: '%s'\n", memo);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,150 + RFIFOW(fd,148));
- break;
-
- default:
- printf("Remote administration has been disconnected (unknown packet).\n");
- ladmin_log("'End of connection, unknown packet." RETCODE);
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- // if we don't wait new packets, do the prompt
- prompt();
-
- return 0;
-}
-
-//------------------------------------
-// Function to connect to login-server
-//------------------------------------
-int Connect_login_server(void) {
- if (defaultlanguage == 'F') {
- printf("Essai de connection au server de logins...\n");
- ladmin_log("Essai de connection au server de logins..." RETCODE);
- } else {
- printf("Attempt to connect to login-server...\n");
- ladmin_log("Attempt to connect to login-server..." RETCODE);
- }
-
- login_fd = make_connection(login_ip, loginserverport);
- if (login_fd == -1)
- { //Might not be the most elegant way to handle this, but I've never used ladmin so I dunno what else you could do. [Skotlex]
- printf("Error: Failed to connect to Login Server\n");
- exit(1);
- }
-#ifdef PASSWORDENC
- if (passenc == 0) {
-#endif
- WFIFOHEAD(login_fd,28);
- WFIFOW(login_fd,0) = 0x7918; // Request for administation login
- WFIFOW(login_fd,2) = 0; // no encrypted
- memcpy(WFIFOP(login_fd,4), loginserveradminpassword, 24);
- WFIFOSET(login_fd,28);
- bytes_to_read = 1;
- if (defaultlanguage == 'F') {
- printf("Envoi du mot de passe...\n");
- ladmin_log("Envoi du mot de passe..." RETCODE);
- } else {
- printf("Sending of the password...\n");
- ladmin_log("Sending of the password..." RETCODE);
- }
-#ifdef PASSWORDENC
- } else {
- WFIFOHEAD(login_fd,2);
- WFIFOW(login_fd,0) = 0x791a; // Sending request about the coding key
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
- if (defaultlanguage == 'F') {
- printf("Demande de la clef MD5...\n");
- ladmin_log("Demande de la clef MD5..." RETCODE);
- } else {
- printf("Request about the MD5 key...\n");
- ladmin_log("Request about the MD5 key..." RETCODE);
- }
- }
-#endif
-
- return 0;
-}
-
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//-----------------------------------
-// Reading general configuration file
-//-----------------------------------
-int ladmin_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- if (defaultlanguage == 'F') {
- printf("\033[0mFichier de configuration (%s) non trouvé.\n", cfgName);
- } else {
- printf("\033[0mConfiguration file (%s) not found.\n", cfgName);
- }
- return 1;
- }
-
- if (defaultlanguage == 'F') {
- printf("\033[0m---Début de lecture du fichier de configuration Ladmin (%s)\n", cfgName);
- } else {
- printf("\033[0m---Start reading of Ladmin configuration file (%s)\n", cfgName);
- }
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- remove_control_chars((unsigned char *) w1);
- remove_control_chars((unsigned char *) w2);
-
- if(strcmpi(w1,"login_ip")==0){
- struct hostent *h = gethostbyname (w2);
- if (h != NULL) {
- if (defaultlanguage == 'F') {
- printf("Adresse du serveur de logins: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else {
- printf("Login server IP address: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- }
- sprintf(loginserverip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(loginserverip, w2, 16);
- } else if (strcmpi(w1, "login_port") == 0) {
- loginserverport = atoi(w2);
- } else if (strcmpi(w1, "admin_pass") == 0) {
- strncpy(loginserveradminpassword, w2, sizeof(loginserveradminpassword));
- loginserveradminpassword[sizeof(loginserveradminpassword)-1] = '\0';
-#ifdef PASSWORDENC
- } else if (strcmpi(w1, "passenc") == 0) {
- passenc = atoi(w2);
- if (passenc < 0 || passenc > 2)
- passenc = 0;
-#endif
- } else if (strcmpi(w1, "defaultlanguage") == 0) {
- if (w2[0] == 'F' || w2[0] == 'E')
- defaultlanguage = w2[0];
- } else if (strcmpi(w1, "ladmin_log_filename") == 0) {
- strncpy(ladmin_log_filename, w2, sizeof(ladmin_log_filename));
- ladmin_log_filename[sizeof(ladmin_log_filename)-1] = '\0';
- } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- } else if (strcmpi(w1, "import") == 0) {
- ladmin_config_read(w2);
- }
- }
- }
- fclose(fp);
-
- login_ip = inet_addr(loginserverip);
-
- if (defaultlanguage == 'F') {
- printf("---Lecture du fichier de configuration Ladmin terminée.\n");
- } else {
- printf("---End reading of Ladmin configuration file.\n");
- }
-
- return 0;
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-void do_final(void) {
-
- if (already_exit_function == 0) {
- delete_session(login_fd);
-
- if (defaultlanguage == 'F') {
- printf("\033[0m----Fin de Ladmin (fin normale avec fermeture de tous les fichiers).\n");
- ladmin_log("----Fin de Ladmin (fin normale avec fermeture de tous les fichiers)." RETCODE);
- } else {
- printf("\033[0m----End of Ladmin (normal end with closing of all files).\n");
- ladmin_log("----End of Ladmin (normal end with closing of all files)." RETCODE);
- }
-
- already_exit_function = 1;
- }
-}
-
-//------------------------
-// Main function of ladmin
-//------------------------
-int do_init(int argc, char **argv)
-{
- int next;
- socket_init();
-
- // read ladmin configuration
- ladmin_config_read((argc > 1) ? argv[1] : LADMIN_CONF_NAME);
-
- ladmin_log("");
- if (defaultlanguage == 'F') {
- ladmin_log("Fichier de configuration lu." RETCODE);
- } else {
- ladmin_log("Configuration file readed." RETCODE);
- }
-
- srand(time(NULL));
-
- set_defaultparse(parse_fromlogin);
-
- if (defaultlanguage == 'F') {
- printf("Outil d'administration à distance de eAthena.\n");
- printf("(pour eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
- } else {
- printf("EAthena login-server administration tool.\n");
- printf("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Ladmin est prêt." RETCODE);
- printf("Ladmin est \033[1;32mprêt\033[0m.\n\n");
- } else {
- ladmin_log("Ladmin is ready." RETCODE);
- printf("Ladmin is \033[1;32mready\033[0m.\n\n");
- }
-
- Connect_login_server();
-
- // minimalist core doesn't have sockets parsing,
- // so we have to do this ourselves
- while (runflag) {
- next = do_timer(gettick_nocache());
- do_sendrecv(next);
-#ifndef TURBO
- do_parsepacket();
-#endif
- }
-
- return 0;
-}
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+///////////////////////////////////////////////////////////////////////////
+// EAthena login-server remote administration tool
+// Ladamin in C by [Yor]
+// if you modify this software, modify ladmin in tool too.
+///////////////////////////////////////////////////////////////////////////
+
+#include <sys/types.h>
+#include <time.h>
+#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+void Gettimeofday(struct timeval *timenow)
+{
+ time_t t;
+ t = clock();
+ timenow->tv_usec = t;
+ timenow->tv_sec = t / CLK_TCK;
+ return;
+}
+#define gettimeofday(timenow, dummy) Gettimeofday(timenow)
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/time.h> // gettimeofday
+#include <sys/ioctl.h>
+#include <unistd.h> // close
+#include <arpa/inet.h> // inet_addr
+#include <netdb.h> // gethostbyname
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h> // str*
+#include <stdarg.h> // valist
+#include <ctype.h> // tolower
+
+#include "../common/core.h"
+#include "../common/strlib.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "ladmin.h"
+#include "../common/version.h"
+#include "../common/mmo.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+//-------------------------------INSTRUCTIONS------------------------------
+// Set the variables below:
+// IP of the login server.
+// Port where the login-server listens incoming packets.
+// Password of administration (same of config_athena.conf).
+// Displayed language of the sofware (if not correct, english is used).
+// IMPORTANT:
+// Be sure that you authorize remote administration in login-server
+// (see login_athena.conf, 'admin_state' parameter)
+//-------------------------------------------------------------------------
+char loginserverip[16] = "127.0.0.1"; // IP of login-server
+int loginserverport = 6900; // Port of login-server
+char loginserveradminpassword[24] = "admin"; // Administration password
+#ifdef PASSWORDENC
+int passenc = 2; // Encoding type of the password
+#else
+int passenc = 0; // Encoding type of the password
+#endif
+char defaultlanguage = 'E'; // Default language (F: Français/E: English)
+ // (if it's not 'F', default is English)
+char ladmin_log_filename[1024] = "log/ladmin.log";
+char date_format[32] = "%Y-%m-%d %H:%M:%S";
+//-------------------------------------------------------------------------
+// LIST of COMMANDs that you can type at the prompt:
+// To use these commands you can only type only the first letters.
+// You must type a minimum of letters (you can not type 'a',
+// because ladmin doesn't know if it's for 'aide' or for 'add')
+// <Example> q <= quit, li <= list, pass <= passwd, etc.
+//
+// Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
+//
+// aide/help/?
+// Display the description of the commands
+// aide/help/? [command]
+// Display the description of the specified command
+//
+// add <account_name> <sex> <password>
+// Create an account with the default email (a@a.com).
+// Concerning the sex, only the first letter is used (F or M).
+// The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
+// When the password is omitted, the input is done without displaying of the pressed keys.
+// <example> add testname Male testpass
+//
+// ban/banish yyyy/mm/dd hh:mm:ss <account name>
+// Changes the final date of a banishment of an account.
+// Like banset, but <account name> is at end.
+//
+// banadd <account_name> <modifier>
+// Adds or substracts time from the final date of a banishment of an account.
+// Modifier is done as follows:
+// Adjustment value (-1, 1, +1, etc...)
+// Modified element:
+// a or y: year
+// m: month
+// j or d: day
+// h: hour
+// mn: minute
+// s: second
+// <example> banadd testname +1m-2mn1s-6y
+// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
+// NOTE: If you modify the final date of a non-banished account,
+// you fix the final date to (actual time +- adjustments)
+//
+// banset <account_name> yyyy/mm/dd [hh:mm:ss]
+// Changes the final date of a banishment of an account.
+// Default time [hh:mm:ss]: 23:59:59.
+// banset <account_name> 0
+// Set a non-banished account (0 = unbanished).
+//
+// block <account name>
+// Set state 5 (You have been blocked by the GM Team) to an account.
+// Like state <account name> 5.
+//
+// check <account_name> <password>
+// Check the validity of a password for an account
+// NOTE: Server will never sends back a password.
+// It's the only method you have to know if a password is correct.
+// The other method is to have a ('physical') access to the accounts file.
+//
+// create <account_name> <sex> <email> <password>
+// Like the 'add' command, but with e-mail moreover.
+// <example> create testname Male my@mail.com testpass
+//
+// del <account name>
+// Remove an account.
+// This order requires confirmation. After confirmation, the account is deleted.
+//
+// email <account_name> <email>
+// Modify the e-mail of an account.
+//
+// getcount
+// Give the number of players online on all char-servers.
+//
+// gm <account_name> [GM_level]
+// Modify the GM level of an account.
+// Default value remove GM level (GM level = 0).
+// <example> gm testname 80
+//
+// id <account name>
+// Give the id of an account.
+//
+// info <account_id>
+// Display complete information of an account.
+//
+// kami <message>
+// Sends a broadcast message on all map-server (in yellow).
+// kamib <message>
+// Sends a broadcast message on all map-server (in blue).
+//
+// language <language>
+// Change the language of displaying.
+//
+// list/ls [start_id [end_id]]
+// Display a list of accounts.
+// 'start_id', 'end_id': indicate end and start identifiers.
+// Research by name is not possible with this command.
+// <example> list 10 9999999
+//
+// listBan/lsBan [start_id [end_id]]
+// Like list/ls, but only for accounts with state or banished
+//
+// listGM/lsGM [start_id [end_id]]
+// Like list/ls, but only for GM accounts
+//
+// listOK/lsOK [start_id [end_id]]
+// Like list/ls, but only for accounts without state and not banished
+//
+// memo <account_name> <memo>
+// Modify the memo of an account.
+// 'memo': it can have until 253 characters (with spaces or not).
+//
+// name <account_id>
+// Give the name of an account.
+//
+// passwd <account_name> <new_password>
+// Change the password of an account.
+// When new password is omitted, the input is done without displaying of the pressed keys.
+//
+// quit/end/exit
+// End of the program of administration
+//
+// reloadGM
+// Reload GM configuration file
+//
+// search <expression>
+// Seek accounts.
+// Displays the accounts whose names correspond.
+// search -r/-e/--expr/--regex <expression>
+// Seek accounts by regular expression.
+// Displays the accounts whose names correspond.
+//
+// sex <account_name> <sex>
+// Modify the sex of an account.
+// <example> sex testname Male
+//
+// state <account_name> <new_state> <error_message_#7>
+// Change the state of an account.
+// 'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
+// 0 = Account ok 6 = Your Game's EXE file is not the latest version
+// 1 = Unregistered ID 7 = You are Prohibited to log in until %s
+// 2 = Incorrect Password 8 = Server is jammed due to over populated
+// 3 = This ID is expired 9 = No MSG
+// 4 = Rejected from Server 100 = This ID has been totally erased
+// 5 = You have been blocked by the GM Team
+// all other values are 'No MSG', then use state 9 please.
+// 'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
+//
+// timeadd <account_name> <modifier>
+// Adds or substracts time from the validity limit of an account.
+// Modifier is done as follows:
+// Adjustment value (-1, 1, +1, etc...)
+// Modified element:
+// a or y: year
+// m: month
+// j or d: day
+// h: hour
+// mn: minute
+// s: second
+// <example> timeadd testname +1m-2mn1s-6y
+// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
+// NOTE: You can not modify a unlimited validity limit.
+// If you want modify it, you want probably create a limited validity limit.
+// So, at first, you must set the validity limit to a date/time.
+//
+// timeset <account_name> yyyy/mm/dd [hh:mm:ss]
+// Changes the validity limit of an account.
+// Default time [hh:mm:ss]: 23:59:59.
+// timeset <account_name> 0
+// Gives an unlimited validity limit (0 = unlimited).
+//
+// unban/unbanish <account name>
+// Unban an account.
+// Like banset <account name> 0.
+//
+// unblock <account name>
+// Set state 0 (Account ok) to an account.
+// Like state <account name> 0.
+//
+// version
+// Display the version of the login-server.
+//
+// who <account name>
+// Displays complete information of an account.
+//
+//-------------------------------------------------------------------------
+int login_fd;
+int login_ip;
+int bytes_to_read = 0; // flag to know if we waiting bytes from login-server
+char command[1024];
+char parameters[1024];
+int list_first, list_last, list_type, list_count; // parameter to display a list of accounts
+int already_exit_function = 0; // sometimes, the exit function is called twice... so, don't log twice the message
+
+//------------------------------
+// Writing function of logs file
+//------------------------------
+int ladmin_log(char *fmt, ...) {
+ FILE *logfp;
+ va_list ap;
+ struct timeval tv;
+ char tmpstr[2048];
+
+ va_start(ap, fmt);
+
+ logfp = fopen(ladmin_log_filename, "a");
+ if (logfp) {
+ if (fmt[0] == '\0') // jump a line if no message
+ fprintf(logfp, RETCODE);
+ else {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
+ sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
+ vfprintf(logfp, tmpstr, ap);
+ }
+ fclose(logfp);
+ }
+
+ va_end(ap);
+ return 0;
+}
+
+//---------------------------------------------
+// Function to return ordonal text of a number.
+//---------------------------------------------
+char* makeordinal(int number) {
+ if (defaultlanguage == 'F') {
+ if (number == 0)
+ return "";
+ else if (number == 1)
+ return "er";
+ else
+ return "ème";
+ } else {
+ if ((number % 10) < 4 && (number % 10) != 0 && (number < 10 || number > 20)) {
+ if ((number % 10) == 1)
+ return "st";
+ else if ((number % 10) == 2)
+ return "nd";
+ else
+ return "rd";
+ } else {
+ return "th";
+ }
+ }
+ return "";
+}
+
+//-----------------------------------------------------------------------------------------
+// Function to test of the validity of an account name (return 0 if incorrect, and 1 if ok)
+//-----------------------------------------------------------------------------------------
+int verify_accountname(char* account_name) {
+ int i;
+
+ for(i = 0; account_name[i]; i++) {
+ if (account_name[i] < 32) {
+ if (defaultlanguage == 'F') {
+ printf("Caractère interdit trouvé dans le nom du compte (%d%s caractère).\n", i+1, makeordinal(i+1));
+ ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
+ } else {
+ printf("Illegal character found in the account name (%d%s character).\n", i+1, makeordinal(i+1));
+ ladmin_log("Illegal character found in the account name (%d%s character)." RETCODE, i+1, makeordinal(i+1));
+ }
+ return 0;
+ }
+ }
+
+ if (strlen(account_name) < 4) {
+ if (defaultlanguage == 'F') {
+ printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
+ ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
+ } else {
+ printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
+ ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
+ }
+ return 0;
+ }
+
+ if (strlen(account_name) > 23) {
+ if (defaultlanguage == 'F') {
+ printf("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n");
+ ladmin_log("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères." RETCODE);
+ } else {
+ printf("Account name is too long. Please input an account name of 4-23 bytes.\n");
+ ladmin_log("Account name is too long. Please input an account name of 4-23 bytes." RETCODE);
+ }
+ return 0;
+ }
+
+ return 1;
+}
+
+//---------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid).
+//---------------------------------------------------
+int e_mail_check(char *email) {
+ char ch;
+ char* last_arobas;
+
+ // athena limits
+ if (strlen(email) < 3 || strlen(email) > 39)
+ return 0;
+
+ // part of RFC limits (official reference of e-mail description)
+ if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
+ return 0;
+
+ if (email[strlen(email)-1] == '.')
+ return 0;
+
+ last_arobas = strrchr(email, '@');
+
+ if (strstr(last_arobas, "@.") != NULL ||
+ strstr(last_arobas, "..") != NULL)
+ return 0;
+
+ for(ch = 1; ch < 32; ch++) {
+ if (strchr(last_arobas, ch) != NULL) {
+ return 0;
+ break;
+ }
+ }
+
+ if (strchr(last_arobas, ' ') != NULL ||
+ strchr(last_arobas, ';') != NULL)
+ return 0;
+
+ // all correct
+ return 1;
+}
+
+//----------------------------------
+// Sub-function: Input of a password
+//----------------------------------
+int typepasswd(char * password) {
+ char password1[1023], password2[1023];
+ int letter;
+ int i;
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Aucun mot de passe n'a été donné. Demande d'un mot de passe." RETCODE);
+ } else {
+ ladmin_log("No password was given. Request to obtain a password." RETCODE);
+ }
+
+ memset(password1, '\0', sizeof(password1));
+ memset(password2, '\0', sizeof(password2));
+ if (defaultlanguage == 'F')
+ printf("\033[1;36m Entrez le mot de passe > \033[0;32;42m");
+ else
+ printf("\033[1;36m Type the password > \033[0;32;42m");
+ i = 0;
+ while ((letter = getchar()) != '\n')
+ password1[i++] = letter;
+ if (defaultlanguage == 'F')
+ printf("\033[0m\033[1;36m Ré-entrez le mot de passe > \033[0;32;42m");
+ else
+ printf("\033[0m\033[1;36m Verify the password > \033[0;32;42m");
+ i = 0;
+ while ((letter = getchar()) != '\n')
+ password2[i++] = letter;
+
+ printf("\033[0m");
+ fflush(stdout);
+ fflush(stdin);
+
+ if (strcmp(password1, password2) != 0) {
+ if (defaultlanguage == 'F') {
+ printf("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n");
+ ladmin_log("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp." RETCODE);
+ ladmin_log(" Premier mot de passe: %s, second mot de passe: %s." RETCODE, password1, password2);
+ } else {
+ printf("Password verification failed. Please input same password.\n");
+ ladmin_log("Password verification failed. Please input same password." RETCODE);
+ ladmin_log(" First password: %s, second password: %s." RETCODE, password1, password2);
+ }
+ return 0;
+ }
+ if (defaultlanguage == 'F') {
+ ladmin_log("Mot de passe saisi: %s." RETCODE, password1);
+ } else {
+ ladmin_log("Typed password: %s." RETCODE, password1);
+ }
+ strcpy(password, password1);
+ return 1;
+}
+
+//------------------------------------------------------------------------------------
+// Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
+//------------------------------------------------------------------------------------
+int verify_password(char * password) {
+ int i;
+
+ for(i = 0; password[i]; i++) {
+ if (password[i] < 32) {
+ if (defaultlanguage == 'F') {
+ printf("Caractère interdit trouvé dans le mot de passe (%d%s caractère).\n", i+1, makeordinal(i+1));
+ ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
+ } else {
+ printf("Illegal character found in the password (%d%s character).\n", i+1, makeordinal(i+1));
+ ladmin_log("Illegal character found in the password (%d%s character)." RETCODE, i+1, makeordinal(i+1));
+ }
+ return 0;
+ }
+ }
+
+ if (strlen(password) < 4) {
+ if (defaultlanguage == 'F') {
+ printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
+ ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
+ } else {
+ printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
+ ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
+ }
+ return 0;
+ }
+
+ if (strlen(password) > 23) {
+ if (defaultlanguage == 'F') {
+ printf("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n");
+ ladmin_log("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères." RETCODE);
+ } else {
+ printf("Password is too long. Please input a password of 4-23 bytes.\n");
+ ladmin_log("Password is too long. Please input a password of 4-23 bytes." RETCODE);
+ }
+ return 0;
+ }
+
+ return 1;
+}
+
+//------------------------------------------------------------------
+// Sub-function: Check the name of a command (return complete name)
+//-----------------------------------------------------------------
+int check_command(char * command) {
+// help
+ if (strncmp(command, "aide", 2) == 0 && strncmp(command, "aide", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
+ strcpy(command, "aide");
+ else if (strncmp(command, "help", 1) == 0 && strncmp(command, "help", strlen(command)) == 0)
+ strcpy(command, "help");
+// general commands
+ else if (strncmp(command, "add", 2) == 0 && strncmp(command, "add", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
+ strcpy(command, "add");
+ else if ((strncmp(command, "ban", 3) == 0 && strncmp(command, "ban", strlen(command)) == 0) ||
+ (strncmp(command, "banish", 4) == 0 && strncmp(command, "banish", strlen(command)) == 0))
+ strcpy(command, "ban");
+ else if ((strncmp(command, "banadd", 4) == 0 && strncmp(command, "banadd", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
+ strcmp(command, "ba") == 0)
+ strcpy(command, "banadd");
+ else if ((strncmp(command, "banset", 4) == 0 && strncmp(command, "banset", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
+ strcmp(command, "bs") == 0)
+ strcpy(command, "banset");
+ else if (strncmp(command, "block", 2) == 0 && strncmp(command, "block", strlen(command)) == 0)
+ strcpy(command, "block");
+ else if (strncmp(command, "check", 2) == 0 && strncmp(command, "check", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
+ strcpy(command, "check");
+ else if (strncmp(command, "create", 2) == 0 && strncmp(command, "create", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
+ strcpy(command, "create");
+ else if (strncmp(command, "delete", 1) == 0 && strncmp(command, "delete", strlen(command)) == 0)
+ strcpy(command, "delete");
+ else if ((strncmp(command, "email", 2) == 0 && strncmp(command, "email", strlen(command)) == 0) || // not 1 letter command: 'email', 'end' or 'exit'?
+ (strncmp(command, "e-mail", 2) == 0 && strncmp(command, "e-mail", strlen(command)) == 0))
+ strcpy(command, "email");
+ else if (strncmp(command, "getcount", 2) == 0 && strncmp(command, "getcount", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
+ strcpy(command, "getcount");
+// else if (strncmp(command, "gm", 2) == 0 && strncmp(command, "gm", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
+// strcpy(command, "gm");
+// else if (strncmp(command, "id", 2) == 0 && strncmp(command, "id", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
+// strcpy(command, "id");
+ else if (strncmp(command, "info", 2) == 0 && strncmp(command, "info", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
+ strcpy(command, "info");
+// else if (strncmp(command, "kami", 4) == 0 && strncmp(command, "kami", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
+// strcpy(command, "kami");
+// else if (strncmp(command, "kamib", 5) == 0 && strncmp(command, "kamib", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
+// strcpy(command, "kamib");
+ else if ((strncmp(command, "language", 2) == 0 && strncmp(command, "language", strlen(command)) == 0)) // not 1 letter command: 'language' or 'list'?
+ strcpy(command, "language");
+ else if ((strncmp(command, "list", 2) == 0 && strncmp(command, "list", strlen(command)) == 0) || // 'list' is default list command // not 1 letter command: 'language' or 'list'?
+ strcmp(command, "ls") == 0)
+ strcpy(command, "list");
+ else if ((strncmp(command, "listban", 5) == 0 && strncmp(command, "listban", strlen(command)) == 0) ||
+ (strncmp(command, "lsban", 3) == 0 && strncmp(command, "lsban", strlen(command)) == 0) ||
+ strcmp(command, "lb") == 0)
+ strcpy(command, "listban");
+ else if ((strncmp(command, "listgm", 5) == 0 && strncmp(command, "listgm", strlen(command)) == 0) ||
+ (strncmp(command, "lsgm", 3) == 0 && strncmp(command, "lsgm", strlen(command)) == 0) ||
+ strcmp(command, "lg") == 0)
+ strcpy(command, "listgm");
+ else if ((strncmp(command, "listok", 5) == 0 && strncmp(command, "listok", strlen(command)) == 0) ||
+ (strncmp(command, "lsok", 3) == 0 && strncmp(command, "lsok", strlen(command)) == 0) ||
+ strcmp(command, "lo") == 0)
+ strcpy(command, "listok");
+ else if (strncmp(command, "memo", 1) == 0 && strncmp(command, "memo", strlen(command)) == 0)
+ strcpy(command, "memo");
+ else if (strncmp(command, "name", 1) == 0 && strncmp(command, "name", strlen(command)) == 0)
+ strcpy(command, "name");
+ else if ((strncmp(command, "password", 1) == 0 && strncmp(command, "password", strlen(command)) == 0) ||
+ strcmp(command, "passwd") == 0)
+ strcpy(command, "password");
+ else if (strncmp(command, "reloadgm", 1) == 0 && strncmp(command, "reloadgm", strlen(command)) == 0)
+ strcpy(command, "reloadgm");
+ else if (strncmp(command, "search", 3) == 0 && strncmp(command, "search", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
+ strcpy(command, "search"); // not 2 letters command: 'search' or 'sex'?
+// else if (strncmp(command, "sex", 3) == 0 && strncmp(command, "sex", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
+// strcpy(command, "sex"); // not 2 letters command: 'search' or 'sex'?
+ else if (strncmp(command, "state", 2) == 0 && strncmp(command, "state", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
+ strcpy(command, "state");
+ else if ((strncmp(command, "timeadd", 5) == 0 && strncmp(command, "timeadd", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
+ strcmp(command, "ta") == 0)
+ strcpy(command, "timeadd");
+ else if ((strncmp(command, "timeset", 5) == 0 && strncmp(command, "timeset", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
+ strcmp(command, "ts") == 0)
+ strcpy(command, "timeset");
+ else if ((strncmp(command, "unban", 5) == 0 && strncmp(command, "unban", strlen(command)) == 0) ||
+ (strncmp(command, "unbanish", 4) == 0 && strncmp(command, "unbanish", strlen(command)) == 0))
+ strcpy(command, "unban");
+ else if (strncmp(command, "unblock", 4) == 0 && strncmp(command, "unblock", strlen(command)) == 0)
+ strcpy(command, "unblock");
+ else if (strncmp(command, "version", 1) == 0 && strncmp(command, "version", strlen(command)) == 0)
+ strcpy(command, "version");
+ else if (strncmp(command, "who", 1) == 0 && strncmp(command, "who", strlen(command)) == 0)
+ strcpy(command, "who");
+// quit
+ else if (strncmp(command, "quit", 1) == 0 && strncmp(command, "quit", strlen(command)) == 0)
+ strcpy(command, "quit");
+ else if (strncmp(command, "exit", 2) == 0 && strncmp(command, "exit", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
+ strcpy(command, "exit");
+ else if (strncmp(command, "end", 2) == 0 && strncmp(command, "end", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
+ strcpy(command, "end");
+
+ return 0;
+}
+
+//-----------------------------------------
+// Sub-function: Display commands of ladmin
+//-----------------------------------------
+void display_help(char* param, int language) {
+ char command[1023];
+ int i;
+
+ memset(command, '\0', sizeof(command));
+
+ if (sscanf(param, "%s ", command) < 1 || strlen(command) == 0)
+ strcpy(command, ""); // any value that is not a command
+
+ if (command[0] == '?') {
+ if (defaultlanguage == 'F')
+ strcpy(command, "aide");
+ else
+ strcpy(command, "help");
+ }
+
+ // lowercase for command
+ for (i = 0; command[i]; i++)
+ command[i] = tolower(command[i]);
+
+ // Analyse of the command
+ check_command(command); // give complete name to the command
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Affichage des commandes ou d'une commande." RETCODE);
+ } else {
+ ladmin_log("Displaying of the commands or a command." RETCODE);
+ }
+
+ if (language == 1) {
+ if (strcmp(command, "aide") == 0) {
+ printf("aide/help/?\n");
+ printf(" Affiche la description des commandes\n");
+ printf("aide/help/? [commande]\n");
+ printf(" Affiche la description de la commande specifiée\n");
+ } else if (strcmp(command, "help") == 0 ) {
+ printf("aide/help/?\n");
+ printf(" Display the description of the commands\n");
+ printf("aide/help/? [command]\n");
+ printf(" Display the description of the specified command\n");
+// general commands
+ } else if (strcmp(command, "add") == 0) {
+ printf("add <nomcompte> <sexe> <motdepasse>\n");
+ printf(" Crée un compte avec l'email par défaut (a@a.com).\n");
+ printf(" Concernant le sexe, seule la première lettre compte (F ou M).\n");
+ printf(" L'e-mail est a@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n");
+ printf(" Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n");
+ printf(" <exemple> add testname Male testpass\n");
+ } else if (strcmp(command, "ban") == 0) {
+ printf("ban/banish aaaa/mm/jj hh:mm:ss <nom compte>\n");
+ printf(" Change la date de fin de bannissement d'un compte.\n");
+ printf(" Comme banset, mais <nom compte> est à la fin.\n");
+ } else if (strcmp(command, "banadd") == 0) {
+ printf("banadd <nomcompte> <Modificateur>\n");
+ printf(" Ajoute ou soustrait du temps à la date de banissement d'un compte.\n");
+ printf(" Les modificateurs sont construits comme suit:\n");
+ printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
+ printf(" Elément modifié:\n");
+ printf(" a ou y: année\n");
+ printf(" m: mois\n");
+ printf(" j ou d: jour\n");
+ printf(" h: heure\n");
+ printf(" mn: minute\n");
+ printf(" s: seconde\n");
+ printf(" <exemple> banadd testname +1m-2mn1s-6a\n");
+ printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ printf("NOTE: Si vous modifez la date de banissement d'un compte non bani,\n");
+ printf(" vous indiquez comme date (le moment actuel +- les ajustements)\n");
+ } else if (strcmp(command, "banset") == 0) {
+ printf("banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" Change la date de fin de bannissement d'un compte.\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ printf("banset <nomcompte> 0\n");
+ printf(" Débanni un compte (0 = de-banni).\n");
+ } else if (strcmp(command, "block") == 0) {
+ printf("block <nom compte>\n");
+ printf(" Place le status d'un compte à 5 (You have been blocked by the GM Team).\n");
+ printf(" La commande est l'équivalent de state <nom_compte> 5.\n");
+ } else if (strcmp(command, "check") == 0) {
+ printf("check <nomcompte> <motdepasse>\n");
+ printf(" Vérifie la validité d'un mot de passe pour un compte\n");
+ printf(" NOTE: Le serveur n'enverra jamais un mot de passe.\n");
+ printf(" C'est la seule méthode que vous possédez pour savoir\n");
+ printf(" si un mot de passe est le bon. L'autre méthode est\n");
+ printf(" d'avoir un accès ('physique') au fichier des comptes.\n");
+ } else if (strcmp(command, "create") == 0) {
+ printf("create <nomcompte> <sexe> <email> <motdepasse>\n");
+ printf(" Comme la commande add, mais avec l'e-mail en plus.\n");
+ printf(" <exemple> create testname Male mon@mail.com testpass\n");
+ } else if (strcmp(command, "delete") == 0) {
+ printf("del <nom compte>\n");
+ printf(" Supprime un compte.\n");
+ printf(" La commande demande confirmation. Après confirmation, le compte est détruit.\n");
+ } else if (strcmp(command, "email") == 0) {
+ printf("email <nomcompte> <email>\n");
+ printf(" Modifie l'e-mail d'un compte.\n");
+ } else if (strcmp(command, "getcount") == 0) {
+ printf("getcount\n");
+ printf(" Donne le nombre de joueurs en ligne par serveur de char.\n");
+ } else if (strcmp(command, "gm") == 0) {
+ printf("gm <nomcompte> [Niveau_GM]\n");
+ printf(" Modifie le niveau de GM d'un compte.\n");
+ printf(" Valeur par défaut: 0 (suppression du niveau de GM).\n");
+ printf(" <exemple> gm nomtest 80\n");
+ } else if (strcmp(command, "id") == 0) {
+ printf("id <nom compte>\n");
+ printf(" Donne l'id d'un compte.\n");
+ } else if (strcmp(command, "info") == 0) {
+ printf("info <idcompte>\n");
+ printf(" Affiche les informations sur un compte.\n");
+ } else if (strcmp(command, "kami") == 0) {
+ printf("kami <message>\n");
+ printf(" Envoi un message général sur tous les serveurs de map (en jaune).\n");
+ } else if (strcmp(command, "kamib") == 0) {
+ printf("kamib <message>\n");
+ printf(" Envoi un message général sur tous les serveurs de map (en bleu).\n");
+ } else if (strcmp(command, "language") == 0) {
+ printf("language <langue>\n");
+ printf(" Change la langue d'affichage.\n");
+ printf(" Langues possibles: 'Français' ou 'English'.\n");
+ } else if (strcmp(command, "list") == 0) {
+ printf("list/ls [Premier_id [Dernier_id]]\n");
+ printf(" Affiche une liste de comptes.\n");
+ printf(" 'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n");
+ printf(" La recherche par nom n'est pas possible avec cette commande.\n");
+ printf(" <example> list 10 9999999\n");
+ } else if (strcmp(command, "listban") == 0) {
+ printf("listBan/lsBan [Premier_id [Dernier_id]]\n");
+ printf(" Comme list/ls, mais seulement pour les comptes avec statut ou bannis.\n");
+ } else if (strcmp(command, "listgm") == 0) {
+ printf("listGM/lsGM [Premier_id [Dernier_id]]\n");
+ printf(" Comme list/ls, mais seulement pour les comptes GM.\n");
+ } else if (strcmp(command, "listok") == 0) {
+ printf("listOK/lsOK [Premier_id [Dernier_id]]\n");
+ printf(" Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n");
+ } else if (strcmp(command, "memo") == 0) {
+ printf("memo <nomcompte> <memo>\n");
+ printf(" Modifie le mémo d'un compte.\n");
+ printf(" 'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n");
+ } else if (strcmp(command, "name") == 0) {
+ printf("name <idcompte>\n");
+ printf(" Donne le nom d'un compte.\n");
+ } else if (strcmp(command, "password") == 0) {
+ printf("passwd <nomcompte> <nouveaumotdepasse>\n");
+ printf(" Change le mot de passe d'un compte.\n");
+ printf(" Lorsque nouveaumotdepasse est omis,\n");
+ printf(" la saisie se fait sans que la frappe ne se voit.\n");
+ } else if (strcmp(command, "reloadgm") == 0) {
+ printf("reloadGM\n");
+ printf(" Reload GM configuration file\n");
+ } else if (strcmp(command, "search") == 0) {
+ printf("search <expression>\n");
+ printf(" Cherche des comptes.\n");
+ printf(" Affiche les comptes dont les noms correspondent.\n");
+// printf("search -r/-e/--expr/--regex <expression>\n");
+// printf(" Cherche des comptes par expression regulière.\n");
+// printf(" Affiche les comptes dont les noms correspondent.\n");
+ } else if (strcmp(command, "sex") == 0) {
+ printf("sex <nomcompte> <sexe>\n");
+ printf(" Modifie le sexe d'un compte.\n");
+ printf(" <exemple> sex testname Male\n");
+ } else if (strcmp(command, "state") == 0) {
+ printf("state <nomcompte> <nouveaustatut> <message_erreur_7>\n");
+ printf(" Change le statut d'un compte.\n");
+ printf(" 'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n");
+ printf(" les possibilités sont:\n");
+ printf(" 0 = Compte ok\n");
+ printf(" 1 = Unregistered ID\n");
+ printf(" 2 = Incorrect Password\n");
+ printf(" 3 = This ID is expired\n");
+ printf(" 4 = Rejected from Server\n");
+ printf(" 5 = You have been blocked by the GM Team\n");
+ printf(" 6 = Your Game's EXE file is not the latest version\n");
+ printf(" 7 = You are Prohibited to log in until...\n");
+ printf(" 8 = Server is jammed due to over populated\n");
+ printf(" 9 = No MSG\n");
+ printf(" 100 = This ID has been totally erased\n");
+ printf(" all other values are 'No MSG', then use state 9 please.\n");
+ printf(" 'message_erreur_7': message du code erreur 6 =\n");
+ printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
+ } else if (strcmp(command, "timeadd") == 0) {
+ printf("timeadd <nomcompte> <modificateur>\n");
+ printf(" Ajoute/soustrait du temps à la limite de validité d'un compte.\n");
+ printf(" Le modificateur est composé comme suit:\n");
+ printf(" Valeur modificatrice (-1, 1, +1, etc...)\n");
+ printf(" Elément modifié:\n");
+ printf(" a ou y: année\n");
+ printf(" m: mois\n");
+ printf(" j ou d: jour\n");
+ printf(" h: heure\n");
+ printf(" mn: minute\n");
+ printf(" s: seconde\n");
+ printf(" <exemple> timeadd testname +1m-2mn1s-6a\n");
+ printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ printf("NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n");
+ printf(" désirez le faire, c'est que vous voulez probablement créer un limite de\n");
+ printf(" validité limitée. Donc, en premier, fixé une limite de valitidé.\n");
+ } else if (strcmp(command, "timeadd") == 0) {
+ printf("timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" Change la limite de validité d'un compte.\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ printf("timeset <nomcompte> 0\n");
+ printf(" Donne une limite de validité illimitée (0 = illimitée).\n");
+ } else if (strcmp(command, "unban") == 0) {
+ printf("unban/unbanish <nom compte>\n");
+ printf(" Ote le banissement d'un compte.\n");
+ printf(" La commande est l'équivalent de banset <nom_compte> 0.\n");
+ } else if (strcmp(command, "unblock") == 0) {
+ printf("unblock <nom compte>\n");
+ printf(" Place le status d'un compte à 0 (Compte ok).\n");
+ printf(" La commande est l'équivalent de state <nom_compte> 0.\n");
+ } else if (strcmp(command, "version") == 0) {
+ printf("version\n");
+ printf(" Affiche la version du login-serveur.\n");
+ } else if (strcmp(command, "who") == 0) {
+ printf("who <nom compte>\n");
+ printf(" Affiche les informations sur un compte.\n");
+// quit
+ } else if (strcmp(command, "quit") == 0 ||
+ strcmp(command, "exit") == 0 ||
+ strcmp(command, "end") == 0) {
+ printf("quit/end/exit\n");
+ printf(" Fin du programme d'administration.\n");
+// unknown command
+ } else {
+ if (strlen(command) > 0)
+ printf("Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", command);
+ printf(" aide/help/? -- Affiche cet aide\n");
+ printf(" aide/help/? [commande] -- Affiche l'aide de la commande\n");
+ printf(" add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)\n");
+ printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom compte> -- Fixe la date finale de banismnt\n");
+ printf(" banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
+ printf(" exemple: ba moncompte +1m-2mn1s-2y date finale de banissement\n");
+ printf(" banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt\n");
+ printf(" banset/bs <nomcompte> 0 -- Dé-banis un compte.\n");
+ printf(" block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)\n");
+ printf(" check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte\n");
+ printf(" create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)\n");
+ printf(" del <nom compte> -- Supprime un compte\n");
+ printf(" email <nomcompte> <email> -- Modifie l'e-mail d'un compte\n");
+ printf(" getcount -- Donne le nb de joueurs en ligne\n");
+ printf(" gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte\n");
+ printf(" id <nom compte> -- Donne l'id d'un compte\n");
+ printf(" info <idcompte> -- Affiche les infos sur un compte\n");
+ printf(" kami <message> -- Envoi un message général (en jaune)\n");
+ printf(" kamib <message> -- Envoi un message général (en bleu)\n");
+ printf(" language <langue> -- Change la langue d'affichage.\n");
+ printf(" list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
+ printf(" listBan/lsBan [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
+ printf(" avec un statut ou bannis\n");
+ printf(" listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM\n");
+ printf(" listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
+ printf(" sans status et non bannis\n");
+ printf(" memo <nomcompte> <memo> -- Modifie le memo d'un compte\n");
+ printf(" name <idcompte> -- Donne le nom d'un compte\n");
+ printf(" passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte\n");
+ printf(" quit/end/exit -- Fin du programme d'administation\n");
+ printf(" reloadGM -- Recharger le fichier de config des GM\n");
+ printf(" search <expression> -- Cherche des comptes\n");
+// printf(" search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX\n");
+ printf(" sex <nomcompte> <sexe> -- Modifie le sexe d'un compte\n");
+ printf(" state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte\n");
+ printf(" timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
+ printf(" exemple: ta moncompte +1m-2mn1s-2y limite de validité\n");
+ printf(" timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité\n");
+ printf(" timeset/ts <nomcompte> 0 -- limite de validité = illimitée\n");
+ printf(" unban/unbanish <nom compte> -- Ote le banissement d'un compte\n");
+ printf(" unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)\n");
+ printf(" version -- Donne la version du login-serveur\n");
+ printf(" who <nom compte> -- Affiche les infos sur un compte\n");
+ printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
+ }
+ } else {
+ if (strcmp(command, "aide") == 0) {
+ printf("aide/help/?\n");
+ printf(" Display the description of the commands\n");
+ printf("aide/help/? [command]\n");
+ printf(" Display the description of the specified command\n");
+ } else if (strcmp(command, "help") == 0 ) {
+ printf("aide/help/?\n");
+ printf(" Display the description of the commands\n");
+ printf("aide/help/? [command]\n");
+ printf(" Display the description of the specified command\n");
+// general commands
+ } else if (strcmp(command, "add") == 0) {
+ printf("add <account_name> <sex> <password>\n");
+ printf(" Create an account with the default email (a@a.com).\n");
+ printf(" Concerning the sex, only the first letter is used (F or M).\n");
+ printf(" The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.\n");
+ printf(" When the password is omitted,\n");
+ printf(" the input is done without displaying of the pressed keys.\n");
+ printf(" <example> add testname Male testpass\n");
+ } else if (strcmp(command, "ban") == 0) {
+ printf("ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
+ printf(" Changes the final date of a banishment of an account.\n");
+ printf(" Like banset, but <account name> is at end.\n");
+ } else if (strcmp(command, "banadd") == 0) {
+ printf("banadd <account_name> <modifier>\n");
+ printf(" Adds or substracts time from the final date of a banishment of an account.\n");
+ printf(" Modifier is done as follows:\n");
+ printf(" Adjustment value (-1, 1, +1, etc...)\n");
+ printf(" Modified element:\n");
+ printf(" a or y: year\n");
+ printf(" m: month\n");
+ printf(" j or d: day\n");
+ printf(" h: hour\n");
+ printf(" mn: minute\n");
+ printf(" s: second\n");
+ printf(" <example> banadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ printf("NOTE: If you modify the final date of a non-banished account,\n");
+ printf(" you fix the final date to (actual time +- adjustments)\n");
+ } else if (strcmp(command, "banset") == 0) {
+ printf("banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" Changes the final date of a banishment of an account.\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ printf("banset <account_name> 0\n");
+ printf(" Set a non-banished account (0 = unbanished).\n");
+ } else if (strcmp(command, "block") == 0) {
+ printf("block <account name>\n");
+ printf(" Set state 5 (You have been blocked by the GM Team) to an account.\n");
+ printf(" This command works like state <account_name> 5.\n");
+ } else if (strcmp(command, "check") == 0) {
+ printf("check <account_name> <password>\n");
+ printf(" Check the validity of a password for an account.\n");
+ printf(" NOTE: Server will never sends back a password.\n");
+ printf(" It's the only method you have to know if a password is correct.\n");
+ printf(" The other method is to have a ('physical') access to the accounts file.\n");
+ } else if (strcmp(command, "create") == 0) {
+ printf("create <account_name> <sex> <email> <password>\n");
+ printf(" Like the 'add' command, but with e-mail moreover.\n");
+ printf(" <example> create testname Male my@mail.com testpass\n");
+ } else if (strcmp(command, "delete") == 0) {
+ printf("del <account name>\n");
+ printf(" Remove an account.\n");
+ printf(" This order requires confirmation. After confirmation, the account is deleted.\n");
+ } else if (strcmp(command, "email") == 0) {
+ printf("email <account_name> <email>\n");
+ printf(" Modify the e-mail of an account.\n");
+ } else if (strcmp(command, "getcount") == 0) {
+ printf("getcount\n");
+ printf(" Give the number of players online on all char-servers.\n");
+ } else if (strcmp(command, "gm") == 0) {
+ printf("gm <account_name> [GM_level]\n");
+ printf(" Modify the GM level of an account.\n");
+ printf(" Default value remove GM level (GM level = 0).\n");
+ printf(" <example> gm testname 80\n");
+ } else if (strcmp(command, "id") == 0) {
+ printf("id <account name>\n");
+ printf(" Give the id of an account.\n");
+ } else if (strcmp(command, "info") == 0) {
+ printf("info <account_id>\n");
+ printf(" Display complete information of an account.\n");
+ } else if (strcmp(command, "kami") == 0) {
+ printf("kami <message>\n");
+ printf(" Sends a broadcast message on all map-server (in yellow).\n");
+ } else if (strcmp(command, "kamib") == 0) {
+ printf("kamib <message>\n");
+ printf(" Sends a broadcast message on all map-server (in blue).\n");
+ } else if (strcmp(command, "language") == 0) {
+ printf("language <language>\n");
+ printf(" Change the language of displaying.\n");
+ printf(" Possible languages: Français or English.\n");
+ } else if (strcmp(command, "list") == 0) {
+ printf("list/ls [start_id [end_id]]\n");
+ printf(" Display a list of accounts.\n");
+ printf(" 'start_id', 'end_id': indicate end and start identifiers.\n");
+ printf(" Research by name is not possible with this command.\n");
+ printf(" <example> list 10 9999999\n");
+ } else if (strcmp(command, "listban") == 0) {
+ printf("listBan/lsBan [start_id [end_id]]\n");
+ printf(" Like list/ls, but only for accounts with state or banished.\n");
+ } else if (strcmp(command, "listgm") == 0) {
+ printf("listGM/lsGM [start_id [end_id]]\n");
+ printf(" Like list/ls, but only for GM accounts.\n");
+ } else if (strcmp(command, "listok") == 0) {
+ printf("listOK/lsOK [start_id [end_id]]\n");
+ printf(" Like list/ls, but only for accounts without state and not banished.\n");
+ } else if (strcmp(command, "memo") == 0) {
+ printf("memo <account_name> <memo>\n");
+ printf(" Modify the memo of an account.\n");
+ printf(" 'memo': it can have until 253 characters (with spaces or not).\n");
+ } else if (strcmp(command, "name") == 0) {
+ printf("name <account_id>\n");
+ printf(" Give the name of an account.\n");
+ } else if (strcmp(command, "password") == 0) {
+ printf("passwd <account_name> <new_password>\n");
+ printf(" Change the password of an account.\n");
+ printf(" When new password is omitted,\n");
+ printf(" the input is done without displaying of the pressed keys.\n");
+ } else if (strcmp(command, "reloadgm") == 0) {
+ printf("reloadGM\n");
+ printf(" Reload GM configuration file\n");
+ } else if (strcmp(command, "search") == 0) {
+ printf("search <expression>\n");
+ printf(" Seek accounts.\n");
+ printf(" Displays the accounts whose names correspond.\n");
+// printf("search -r/-e/--expr/--regex <expression>\n");
+// printf(" Seek accounts by regular expression.\n");
+// printf(" Displays the accounts whose names correspond.\n");
+ } else if (strcmp(command, "sex") == 0) {
+ printf("sex <account_name> <sex>\n");
+ printf(" Modify the sex of an account.\n");
+ printf(" <example> sex testname Male\n");
+ } else if (strcmp(command, "state") == 0) {
+ printf("state <account_name> <new_state> <error_message_#7>\n");
+ printf(" Change the state of an account.\n");
+ printf(" 'new_state': state is the state of the packet 0x006a + 1.\n");
+ printf(" The possibilities are:\n");
+ printf(" 0 = Account ok\n");
+ printf(" 1 = Unregistered ID\n");
+ printf(" 2 = Incorrect Password\n");
+ printf(" 3 = This ID is expired\n");
+ printf(" 4 = Rejected from Server\n");
+ printf(" 5 = You have been blocked by the GM Team\n");
+ printf(" 6 = Your Game's EXE file is not the latest version\n");
+ printf(" 7 = You are Prohibited to log in until...\n");
+ printf(" 8 = Server is jammed due to over populated\n");
+ printf(" 9 = No MSG\n");
+ printf(" 100 = This ID has been totally erased\n");
+ printf(" all other values are 'No MSG', then use state 9 please.\n");
+ printf(" 'error_message_#7': message of the code error 6\n");
+ printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
+ } else if (strcmp(command, "timeadd") == 0) {
+ printf("timeadd <account_name> <modifier>\n");
+ printf(" Adds or substracts time from the validity limit of an account.\n");
+ printf(" Modifier is done as follows:\n");
+ printf(" Adjustment value (-1, 1, +1, etc...)\n");
+ printf(" Modified element:\n");
+ printf(" a or y: year\n");
+ printf(" m: month\n");
+ printf(" j or d: day\n");
+ printf(" h: hour\n");
+ printf(" mn: minute\n");
+ printf(" s: second\n");
+ printf(" <example> timeadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ printf("NOTE: You can not modify a unlimited validity limit.\n");
+ printf(" If you want modify it, you want probably create a limited validity limit.\n");
+ printf(" So, at first, you must set the validity limit to a date/time.\n");
+ } else if (strcmp(command, "timeadd") == 0) {
+ printf("timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" Changes the validity limit of an account.\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ printf("timeset <account_name> 0\n");
+ printf(" Gives an unlimited validity limit (0 = unlimited).\n");
+ } else if (strcmp(command, "unban") == 0) {
+ printf("unban/unbanish <account name>\n");
+ printf(" Remove the banishment of an account.\n");
+ printf(" This command works like banset <account_name> 0.\n");
+ } else if (strcmp(command, "unblock") == 0) {
+ printf("unblock <account name>\n");
+ printf(" Set state 0 (Account ok) to an account.\n");
+ printf(" This command works like state <account_name> 0.\n");
+ } else if (strcmp(command, "version") == 0) {
+ printf("version\n");
+ printf(" Display the version of the login-server.\n");
+ } else if (strcmp(command, "who") == 0) {
+ printf("who <account name>\n");
+ printf(" Displays complete information of an account.\n");
+// quit
+ } else if (strcmp(command, "quit") == 0 ||
+ strcmp(command, "exit") == 0 ||
+ strcmp(command, "end") == 0) {
+ printf("quit/end/exit\n");
+ printf(" End of the program of administration.\n");
+// unknown command
+ } else {
+ if (strlen(command) > 0)
+ printf("Unknown command [%s] for help. Displaying of all commands.\n", command);
+ printf(" aide/help/? -- Display this help\n");
+ printf(" aide/help/? [command] -- Display the help of the command\n");
+ printf(" add <account_name> <sex> <password> -- Create an account with default email\n");
+ printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name> -- Change final date of a ban\n");
+ printf(" banadd/ba <account_name> <modifier> -- Add or substract time from the final\n");
+ printf(" example: ba apple +1m-2mn1s-2y date of a banishment of an account\n");
+ printf(" banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban\n");
+ printf(" banset/bs <account_name> 0 -- Un-banish an account\n");
+ printf(" block <account name> -- Set state 5 (blocked by the GM Team) to an account\n");
+ printf(" check <account_name> <password> -- Check the validity of a password\n");
+ printf(" create <account_name> <sex> <email> <passwrd> -- Create an account with email\n");
+ printf(" del <account name> -- Remove an account\n");
+ printf(" email <account_name> <email> -- Modify an email of an account\n");
+ printf(" getcount -- Give the number of players online\n");
+ printf(" gm <account_name> [GM_level] -- Modify the GM level of an account\n");
+ printf(" id <account name> -- Give the id of an account\n");
+ printf(" info <account_id> -- Display all information of an account\n");
+ printf(" kami <message> -- Sends a broadcast message (in yellow)\n");
+ printf(" kamib <message> -- Sends a broadcast message (in blue)\n");
+ printf(" language <language> -- Change the language of displaying.\n");
+ printf(" list/ls [First_id [Last_id]] -- Display a list of accounts\n");
+ printf(" listBan/lsBan [First_id [Last_id] ] -- Display a list of accounts\n");
+ printf(" with state or banished\n");
+ printf(" listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts\n");
+ printf(" listOK/lsOK [First_id [Last_id] ] -- Display a list of accounts\n");
+ printf(" without state and not banished\n");
+ printf(" memo <account_name> <memo> -- Modify the memo of an account\n");
+ printf(" name <account_id> -- Give the name of an account\n");
+ printf(" passwd <account_name> <new_password> -- Change the password of an account\n");
+ printf(" quit/end/exit -- End of the program of administation\n");
+ printf(" reloadGM -- Reload GM configuration file\n");
+ printf(" search <expression> -- Seek accounts\n");
+// printf(" search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression\n");
+ printf(" sex <nomcompte> <sexe> -- Modify the sex of an account\n");
+ printf(" state <account_name> <new_state> <error_message_#7> -- Change the state\n");
+ printf(" timeadd/ta <account_name> <modifier> -- Add or substract time from the\n");
+ printf(" example: ta apple +1m-2mn1s-2y validity limit of an account\n");
+ printf(" timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit\n");
+ printf(" timeset/ts <account_name> 0 -- Give a unlimited validity limit\n");
+ printf(" unban/unbanish <account name> -- Remove the banishment of an account\n");
+ printf(" unblock <account name> -- Set state 0 (Account ok) to an account\n");
+ printf(" version -- Gives the version of the login-server\n");
+ printf(" who <account name> -- Display all information of an account\n");
+ printf(" who <account name> -- Display all information of an account\n");
+ printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
+ }
+ }
+}
+
+//-----------------------------
+// Sub-function: add an account
+//-----------------------------
+int addaccount(char* param, int emailflag) {
+ char name[1023], sex[1023], email[1023], password[1023];
+// int i;
+ WFIFOHEAD(login_fd,91);
+
+ memset(name, '\0', sizeof(name));
+ memset(sex, '\0', sizeof(sex));
+ memset(email, '\0', sizeof(email));
+ memset(password, '\0', sizeof(password));
+
+ if (emailflag == 0) { // add command
+ if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, sex, password) < 2 && // password can be void
+ sscanf(param, "'%[^']' %s %[^\r\n]", name, sex, password) < 2 && // password can be void
+ sscanf(param, "%s %s %[^\r\n]", name, sex, password) < 2) { // password can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
+ printf("<exemple> add nomtest Male motdepassetest\n");
+ ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'add')." RETCODE);
+ } else {
+ printf("Please input an account name, a sex and a password.\n");
+ printf("<example> add testname Male testpass\n");
+ ladmin_log("Incomplete parameters to create an account ('add' command)." RETCODE);
+ }
+ return 136;
+ }
+ strcpy(email, "a@a.com"); // default email
+ } else { // 1: create command
+ if (sscanf(param, "\"%[^\"]\" %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
+ sscanf(param, "'%[^']' %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
+ sscanf(param, "%s %s %s %[^\r\n]", name, sex, email, password) < 3) { // password can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
+ printf("<exemple> create nomtest Male mo@mail.com motdepassetest\n");
+ ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'create')." RETCODE);
+ } else {
+ printf("Please input an account name, a sex and a password.\n");
+ printf("<example> create testname Male my@mail.com testpass\n");
+ ladmin_log("Incomplete parameters to create an account ('create' command)." RETCODE);
+ }
+ return 136;
+ }
+ }
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+/* for(i = 0; name[i]; i++) {
+ if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_", name[i]) == NULL) {
+ if (defaultlanguage == 'F') {
+ printf("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère).\n", name[i], i+1, makeordinal(i+1));
+ ladmin_log("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère)." RETCODE, name[i], i+1, makeordinal(i+1));
+ } else {
+ printf("Illegal character (%c) found in the account name (%d%s character).\n", name[i], i+1, makeordinal(i+1));
+ ladmin_log("Illegal character (%c) found in the account name (%d%s character)." RETCODE, name[i], i+1, makeordinal(i+1));
+ }
+ return 101;
+ }
+ }*/
+
+ sex[0] = toupper(sex[0]);
+ if (strchr("MF", sex[0]) == NULL) {
+ if (defaultlanguage == 'F') {
+ printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
+ ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
+ } else {
+ printf("Illegal gender [%s]. Please input M or F.\n", sex);
+ ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
+ }
+ return 103;
+ }
+
+ if (strlen(email) < 3) {
+ if (defaultlanguage == 'F') {
+ printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
+ ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
+ } else {
+ printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
+ ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
+ }
+ return 109;
+ }
+ if (strlen(email) > 39) {
+ if (defaultlanguage == 'F') {
+ printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
+ ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
+ } else {
+ printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
+ ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
+ }
+ return 109;
+ }
+ if (e_mail_check(email) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
+ ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
+ } else {
+ printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
+ ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
+ }
+ return 109;
+ }
+
+ if (strlen(password) == 0) {
+ if (typepasswd(password) == 0)
+ return 108;
+ }
+ if (verify_password(password) == 0)
+ return 104;
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour créer un compte." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to create an account." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7930;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ memcpy(WFIFOP(login_fd,26), password, 24);
+ WFIFOB(login_fd,50) = sex[0];
+ memcpy(WFIFOP(login_fd,51), email, 40);
+ WFIFOSET(login_fd,91);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------------
+// Sub-function: Add/substract time to the final date of a banishment of an account
+//---------------------------------------------------------------------------------
+int banaddaccount(char* param) {
+ char name[1023], modif[1023];
+ int year, month, day, hour, minute, second;
+ char * p_modif;
+ int value, i;
+ WFIFOHEAD(login_fd,38);
+
+ memset(name, '\0', sizeof(name));
+ memset(modif, '\0', sizeof(modif));
+ year = month = day = hour = minute = second = 0;
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
+ sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
+ sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un modificateur svp.\n");
+ printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
+ printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ ladmin_log("Nombre incorrect de paramètres pour modifier la fin de ban d'un compte (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please input an account name and a modifier.\n");
+ printf(" <example>: banadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ ladmin_log("Incomplete parameters to modify the ban date/time of an account ('banadd' command)." RETCODE);
+ }
+ return 136;
+ }
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ // lowercase for modif
+ for (i = 0; modif[i]; i++)
+ modif[i] = tolower(modif[i]);
+ p_modif = modif;
+ while (strlen(p_modif) > 0) {
+ value = atoi(p_modif);
+ if (value == 0) {
+ p_modif++;
+ } else {
+ if (p_modif[0] == '-' || p_modif[0] == '+')
+ p_modif++;
+ while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
+ p_modif++;
+ }
+ if (p_modif[0] == 's') {
+ second = value;
+ p_modif++;
+ } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
+ minute = value;
+ p_modif += 2;
+ } else if (p_modif[0] == 'h') {
+ hour = value;
+ p_modif++;
+ } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
+ day = value;
+ p_modif += 2;
+ } else if (p_modif[0] == 'm') {
+ month = value;
+ p_modif++;
+ } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
+ year = value;
+ p_modif++;
+ } else {
+ p_modif++;
+ }
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ printf(" année: %d\n", year);
+ printf(" mois: %d\n", month);
+ printf(" jour: %d\n", day);
+ printf(" heure: %d\n", hour);
+ printf(" minute: %d\n", minute);
+ printf(" seconde: %d\n", second);
+ } else {
+ printf(" year: %d\n", year);
+ printf(" month: %d\n", month);
+ printf(" day: %d\n", day);
+ printf(" hour: %d\n", hour);
+ printf(" minute: %d\n", minute);
+ printf(" second: %d\n", second);
+ }
+
+ if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
+ printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
+ printf(" Element modifié:\n");
+ printf(" a ou y: année\n");
+ printf(" m: mois\n");
+ printf(" j ou d: jour\n");
+ printf(" h: heure\n");
+ printf(" mn: minute\n");
+ printf(" s: seconde\n");
+ printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
+ printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give an adjustment with this command:\n");
+ printf(" Adjustment value (-1, 1, +1, etc...)\n");
+ printf(" Modified element:\n");
+ printf(" a or y: year\n");
+ printf(" m: month\n");
+ printf(" j or d: day\n");
+ printf(" h: hour\n");
+ printf(" mn: minute\n");
+ printf(" s: second\n");
+ printf(" <example> banadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ ladmin_log("No adjustment isn't an adjustment ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (year > 127 || year < -127) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
+ ladmin_log("Ajustement de l'année hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the years (from -127 to 127).\n");
+ ladmin_log("Abnormal adjustement for the year ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (month > 255 || month < -255) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
+ ladmin_log("Ajustement du mois hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the months (from -255 to 255).\n");
+ ladmin_log("Abnormal adjustement for the month ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (day > 32767 || day < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des jours hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the days ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (hour > 32767 || hour < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des heures hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the hours ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (minute > 32767 || minute < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des minutes hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the minutes ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (second > 32767 || second < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des secondes hors norme (commande 'banadd')." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the seconds ('banadd' command)." RETCODE);
+ }
+ return 137;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour modifier la date d'un bannissement." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to modify a ban date/time." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x794c;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOW(login_fd,26) = (short)year;
+ WFIFOW(login_fd,28) = (short)month;
+ WFIFOW(login_fd,30) = (short)day;
+ WFIFOW(login_fd,32) = (short)hour;
+ WFIFOW(login_fd,34) = (short)minute;
+ WFIFOW(login_fd,36) = (short)second;
+ WFIFOSET(login_fd,38);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-----------------------------------------------------------------------
+// Sub-function of sub-function banaccount, unbanaccount or bansetaccount
+// Set the final date of a banishment of an account
+//-----------------------------------------------------------------------
+int bansetaccountsub(char* name, char* date, char* time) {
+ int year, month, day, hour, minute, second;
+ time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
+ struct tm *tmtime;
+ WFIFOHEAD(login_fd,30);
+
+ year = month = day = hour = minute = second = 0;
+ ban_until_time = 0;
+ tmtime = localtime(&ban_until_time); // initialize
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (atoi(date) != 0 &&
+ ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
+ sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
+ sscanf(date, "%d.%d.%d", &year, &month, &day) < 3) ||
+ sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
+ printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
+ ladmin_log("Format incorrect pour la date/heure (commande'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
+ printf("You can imput 0 instead of if you use 'banset' command.\n");
+ ladmin_log("Invalid format for the date/time ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+
+ if (atoi(date) == 0) {
+ ban_until_time = 0;
+ } else {
+ if (year < 70) {
+ year = year + 100;
+ }
+ if (year >= 1900) {
+ year = year - 1900;
+ }
+ if (month < 1 || month > 12) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un mois correct svp (entre 1 et 12).\n");
+ ladmin_log("Mois incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for the month (from 1 to 12).\n");
+ ladmin_log("Invalid month for the date ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ month = month - 1;
+ if (day < 1 || day > 31) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un jour correct svp (entre 1 et 31).\n");
+ ladmin_log("Jour incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for the day (from 1 to 31).\n");
+ ladmin_log("Invalid day for the date ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
+ (month == 1 && day > 29)) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
+ ladmin_log("Jour incorrect pour ce mois correspondant (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for a day of this month (%d).\n", month);
+ ladmin_log("Invalid day for this month ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (hour < 0 || hour > 23) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez une heure correcte svp (entre 0 et 23).\n");
+ ladmin_log("Heure incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for the hour (from 0 to 23).\n");
+ ladmin_log("Invalid hour for the time ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (minute < 0 || minute > 59) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
+ ladmin_log("Minute incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for the minutes (from 0 to 59).\n");
+ ladmin_log("Invalid minute for the time ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (second < 0 || second > 59) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
+ ladmin_log("Seconde incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please give a correct value for the seconds (from 0 to 59).\n");
+ ladmin_log("Invalid second for the time ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ tmtime->tm_year = year;
+ tmtime->tm_mon = month;
+ tmtime->tm_mday = day;
+ tmtime->tm_hour = hour;
+ tmtime->tm_min = minute;
+ tmtime->tm_sec = second;
+ tmtime->tm_isdst = -1; // -1: no winter/summer time modification
+ ban_until_time = mktime(tmtime);
+ if (ban_until_time == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Date incorrecte.\n");
+ printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
+ printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
+ ladmin_log("Date incorrecte. (command 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Invalid date.\n");
+ printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
+ printf("You can imput 0 instead of if you use 'banset' command.\n");
+ ladmin_log("Invalid date. ('banset' or 'ban' command)." RETCODE);
+ }
+ return 102;
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour fixer un ban." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to set a ban." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x794a;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOL(login_fd,26) = (int)ban_until_time;
+ WFIFOSET(login_fd,30);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//---------------------------------------------------------------------
+// Sub-function: Set the final date of a banishment of an account (ban)
+//---------------------------------------------------------------------
+int banaccount(char* param) {
+ char name[1023], date[1023], time[1023];
+
+ memset(name, '\0', sizeof(name));
+ memset(date, '\0', sizeof(date));
+ memset(time, '\0', sizeof(time));
+
+ if (sscanf(param, "%s %s \"%[^\"]\"", date, time, name) < 3 &&
+ sscanf(param, "%s %s '%[^']'", date, time, name) < 3 &&
+ sscanf(param, "%s %s %[^\r\n]", date, time, name) < 3) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte, une date et une heure svp.\n");
+ printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
+ printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
+ printf(" unban/unbanish <nom du compte>\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please input an account name, a date and a hour.\n");
+ printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" banset <account_name> 0 (0 = un-banished)\n");
+ printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
+ printf(" unban/unbanish <account name>\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ return bansetaccountsub(name, date, time);
+}
+
+//------------------------------------------------------------------------
+// Sub-function: Set the final date of a banishment of an account (banset)
+//------------------------------------------------------------------------
+int bansetaccount(char* param) {
+ char name[1023], date[1023], time[1023];
+
+ memset(name, '\0', sizeof(name));
+ memset(date, '\0', sizeof(date));
+ memset(time, '\0', sizeof(time));
+
+ if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
+ sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
+ sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte, une date et une heure svp.\n");
+ printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
+ printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
+ printf(" unban/unbanish <nom du compte>\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
+ } else {
+ printf("Please input an account name, a date and a hour.\n");
+ printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" banset <account_name> 0 (0 = un-banished)\n");
+ printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
+ printf(" unban/unbanish <account name>\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (time[0] == '\0')
+ strcpy(time, "23:59:59");
+
+ return bansetaccountsub(name, date, time);
+}
+
+//-------------------------------------------------
+// Sub-function: unbanishment of an account (unban)
+//-------------------------------------------------
+int unbanaccount(char* param) {
+ char name[1023];
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
+ printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
+ printf(" unban/unbanish <nom du compte>\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'unban')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" banset <account_name> 0 (0 = un-banished)\n");
+ printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
+ printf(" unban/unbanish <account name>\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Incomplete parameters to set a ban ('unban' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ return bansetaccountsub(name, "0", "");
+}
+
+//---------------------------------------------------------
+// Sub-function: Asking to check the validity of a password
+// (Note: never send back a password with login-server!! security of passwords)
+//---------------------------------------------------------
+int checkaccount(char* param) {
+ char name[1023], password[1023];
+ WFIFOHEAD(login_fd,50);
+
+ memset(name, '\0', sizeof(name));
+ memset(password, '\0', sizeof(password));
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && // password can be void
+ sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 && // password can be void
+ sscanf(param, "%s %[^\r\n]", name, password) < 1) { // password can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple> check testname motdepasse\n");
+ ladmin_log("Nombre incorrect de paramètres pour tester le mot d'un passe d'un compte (commande 'check')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example> check testname password\n");
+ ladmin_log("Incomplete parameters to check the password of an account ('check' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (strlen(password) == 0) {
+ if (typepasswd(password) == 0)
+ return 134;
+ }
+ if (verify_password(password) == 0)
+ return 131;
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour test un mot de passe." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to check a password." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x793a;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ memcpy(WFIFOP(login_fd,26), password, 24);
+ WFIFOSET(login_fd,50);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//------------------------------------------------
+// Sub-function: Asking for deletion of an account
+//------------------------------------------------
+int delaccount(char* param) {
+ char name[1023];
+ char letter;
+ char confirm[1023];
+ int i;
+ WFIFOHEAD(login_fd,26);
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple> del nomtestasupprimer\n");
+ ladmin_log("Aucun nom donné pour supprimer un compte (commande 'delete')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example> del testnametodelete\n");
+ ladmin_log("No name given to delete an account ('delete' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ memset(confirm, '\0', sizeof(confirm));
+ while ((confirm[0] != 'o' || defaultlanguage != 'F') && confirm[0] != 'n' && (confirm[0] != 'y' || defaultlanguage == 'F')) {
+ if (defaultlanguage == 'F')
+ printf("\033[1;36m ** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) > \033[0m");
+ else
+ printf("\033[1;36m ** Are you really sure to DELETE account [$userid]? (y/n) > \033[0m");
+ fflush(stdout);
+ memset(confirm, '\0', sizeof(confirm));
+ i = 0;
+ while ((letter = getchar()) != '\n')
+ confirm[i++] = letter;
+ }
+
+ if (confirm[0] == 'n') {
+ if (defaultlanguage == 'F') {
+ printf("Suppression annulée.\n");
+ ladmin_log("Suppression annulée par l'utilisateur (commande 'delete')." RETCODE);
+ } else {
+ printf("Deletion canceled.\n");
+ ladmin_log("Deletion canceled by user ('delete' command)." RETCODE);
+ }
+ return 121;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour détruire un compte." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to delete an acount." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7932;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOSET(login_fd,26);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//----------------------------------------------------------
+// Sub-function: Asking to modification of an account e-mail
+//----------------------------------------------------------
+int changeemail(char* param) {
+ char name[1023], email[1023];
+ WFIFOHEAD(login_fd,66);
+
+ memset(name, '\0', sizeof(name));
+ memset(email, '\0', sizeof(email));
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, email) < 2 &&
+ sscanf(param, "'%[^']' %[^\r\n]", name, email) < 2 &&
+ sscanf(param, "%s %[^\r\n]", name, email) < 2) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et une email svp.\n");
+ printf("<exemple> email testname nouveauemail\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer l'email d'un compte (commande 'email')." RETCODE);
+ } else {
+ printf("Please input an account name and an email.\n");
+ printf("<example> email testname newemail\n");
+ ladmin_log("Incomplete parameters to change the email of an account ('email' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (strlen(email) < 3) {
+ if (defaultlanguage == 'F') {
+ printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
+ ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
+ } else {
+ printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
+ ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
+ }
+ return 109;
+ }
+ if (strlen(email) > 39) {
+ if (defaultlanguage == 'F') {
+ printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
+ ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
+ } else {
+ printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
+ ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
+ }
+ return 109;
+ }
+ if (e_mail_check(email) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
+ ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
+ } else {
+ printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
+ ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
+ }
+ return 109;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer une email." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change an email." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7940;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ memcpy(WFIFOP(login_fd,26), email, 40);
+ WFIFOSET(login_fd,66);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-----------------------------------------------------
+// Sub-function: Asking of the number of online players
+//-----------------------------------------------------
+int getlogincount(void) {
+ WFIFOHEAD(login_fd,2);
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le nombre de joueurs en jeu." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to obtain the # of online players." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7938;
+ WFIFOSET(login_fd,2);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//----------------------------------------------------------
+// Sub-function: Asking to modify the GM level of an account
+//----------------------------------------------------------
+int changegmlevel(char* param) {
+ char name[1023];
+ int GM_level;
+ WFIFOHEAD(login_fd,27);
+
+ memset(name, '\0', sizeof(name));
+ GM_level = 0;
+
+ if (sscanf(param, "\"%[^\"]\" %d", name, &GM_level) < 1 &&
+ sscanf(param, "'%[^']' %d", name, &GM_level) < 1 &&
+ sscanf(param, "%s %d", name, &GM_level) < 1) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un niveau de GM svp.\n");
+ printf("<exemple> gm nomtest 80\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le Niveau de GM d'un compte (commande 'gm')." RETCODE);
+ } else {
+ printf("Please input an account name and a GM level.\n");
+ printf("<example> gm testname 80\n");
+ ladmin_log("Incomplete parameters to change the GM level of an account ('gm' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (GM_level < 0 || GM_level > 99) {
+ if (defaultlanguage == 'F') {
+ printf("Niveau de GM incorrect [%d]. Entrez une valeur de 0 à 99 svp.\n", GM_level);
+ ladmin_log("Niveau de GM incorrect [%d]. La valeur peut être de 0 à 99." RETCODE, GM_level);
+ } else {
+ printf("Illegal GM level [%d]. Please input a value from 0 to 99.\n", GM_level);
+ ladmin_log("Illegal GM level [%d]. The value can be from 0 to 99." RETCODE, GM_level);
+ }
+ return 103;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer un niveau de GM." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change a GM level." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x793e;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOB(login_fd,26) = GM_level;
+ WFIFOSET(login_fd,27);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//---------------------------------------------
+// Sub-function: Asking to obtain an account id
+//---------------------------------------------
+int idaccount(char* param) {
+ char name[1023];
+ WFIFOHEAD(login_fd,26);
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple> id nomtest\n");
+ ladmin_log("Aucun nom donné pour rechecher l'id d'un compte (commande 'id')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example> id testname\n");
+ ladmin_log("No name given to search an account id ('id' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour connaître l'id d'un compte." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to know an account id." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7944;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOSET(login_fd,26);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//----------------------------------------------------------------------------
+// Sub-function: Asking to displaying information about an account (by its id)
+//----------------------------------------------------------------------------
+int infoaccount(int account_id) {
+ WFIFOHEAD(login_fd,6);
+ if (account_id < 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un id ayant une valeur positive svp.\n");
+ ladmin_log("Une valeur négative a été donné pour trouver le compte." RETCODE);
+ } else {
+ printf("Please input a positive value for the id.\n");
+ ladmin_log("Negative value was given to found the account." RETCODE);
+ }
+ return 136;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par l'id)." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to obtain information about an account (by its id)." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7954;
+ WFIFOL(login_fd,2) = account_id;
+ WFIFOSET(login_fd,6);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//---------------------------------------
+// Sub-function: Send a broadcast message
+//---------------------------------------
+int sendbroadcast(short type, char* message) {
+ int len = strlen(message);
+ WFIFOHEAD(login_fd,9+len);
+ if (len == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un message svp.\n");
+ if (type == 0) {
+ printf("<exemple> kami un message\n");
+ } else {
+ printf("<exemple> kamib un message\n");
+ }
+ ladmin_log("Le message est vide (commande 'kami(b)')." RETCODE);
+ } else {
+ printf("Please input a message.\n");
+ if (type == 0) {
+ printf("<example> kami a message\n");
+ } else {
+ printf("<example> kamib a message\n");
+ }
+ ladmin_log("The message is void ('kami(b)' command)." RETCODE);
+ }
+ return 136;
+ }
+ len++; //+'\0'
+ WFIFOW(login_fd,0) = 0x794e;
+ WFIFOW(login_fd,2) = type;
+ WFIFOL(login_fd,4) = len;
+ memcpy(WFIFOP(login_fd,8), message, len);
+ WFIFOSET(login_fd,8+len);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//--------------------------------------------
+// Sub-function: Change language of displaying
+//--------------------------------------------
+int changelanguage(char* language) {
+ if (strlen(language) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez une langue svp.\n");
+ printf("<exemple> language english\n");
+ printf(" language français\n");
+ ladmin_log("La langue est vide (commande 'language')." RETCODE);
+ } else {
+ printf("Please input a language.\n");
+ printf("<example> language english\n");
+ printf(" language français\n");
+ ladmin_log("The language is void ('language' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ language[0] = toupper(language[0]);
+ if (language[0] == 'F' || language[0] == 'E') {
+ defaultlanguage = language[0];
+ if (defaultlanguage == 'F') {
+ printf("Changement de la langue d'affichage en Français.\n");
+ ladmin_log("Changement de la langue d'affichage en Français." RETCODE);
+ } else {
+ printf("Displaying language changed to English.\n");
+ ladmin_log("Displaying language changed to English." RETCODE);
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
+ ladmin_log("Langue non paramétrée (Français ou English nécessaire)." RETCODE);
+ } else {
+ printf("Undefined language (possible languages: Français or English).\n");
+ ladmin_log("Undefined language (must be Français or English)." RETCODE);
+ }
+ }
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// Sub-function: Asking to Displaying of the accounts list
+//--------------------------------------------------------
+int listaccount(char* param, int type) {
+//int list_first, list_last, list_type; // parameter to display a list of accounts
+ int i;
+ WFIFOHEAD(login_fd,10);
+
+ list_type = type;
+
+ // set default values
+ list_first = 0;
+ list_last = 0;
+
+ if (list_type == 1) { // if listgm
+ // get all accounts = use default
+ } else if (list_type == 2) { // if search
+ for (i = 0; param[i]; i++)
+ param[i] = tolower(param[i]);
+ // get all accounts = use default
+ } else if (list_type == 3) { // if listban
+ // get all accounts = use default
+ } else if (list_type == 4) { // if listok
+ // get all accounts = use default
+ } else { // if list (list_type == 0)
+ switch(sscanf(param, "%d %d", &list_first, &list_last)) {
+ case 0:
+ // get all accounts = use default
+ break;
+ case 1:
+ list_last = 0;
+ // use tests of the following value
+ default:
+ if (list_first < 0)
+ list_first = 0;
+ if (list_last < list_first || list_last < 0)
+ list_last = 0;
+ break;
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d." RETCODE, list_first, list_last);
+ } else {
+ ladmin_log("Request to login-server to obtain the list of accounts from %d to %d." RETCODE, list_first, list_last);
+ }
+
+ WFIFOW(login_fd,0) = 0x7920;
+ WFIFOL(login_fd,2) = list_first;
+ WFIFOL(login_fd,6) = list_last;
+ WFIFOSET(login_fd,10);
+ bytes_to_read = 1;
+
+ // 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
+ if (defaultlanguage == 'F') {
+ printf(" id_compte GM nom_utilisateur sexe count statut\n");
+ } else {
+ printf("account_id GM user_name sex count state\n");
+ }
+ printf("-------------------------------------------------------------------------------\n");
+ list_count = 0;
+
+ return 0;
+}
+
+//--------------------------------------------
+// Sub-function: Asking to modify a memo field
+//--------------------------------------------
+int changememo(char* param) {
+ char name[1023], memo[1023];
+ WFIFOHEAD(login_fd,28+255);
+
+ memset(name, '\0', sizeof(name));
+ memset(memo, '\0', sizeof(memo));
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, memo) < 1 && // memo can be void
+ sscanf(param, "'%[^']' %[^\r\n]", name, memo) < 1 && // memo can be void
+ sscanf(param, "%s %[^\r\n]", name, memo) < 1) { // memo can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un mémo svp.\n");
+ printf("<exemple> memo nomtest nouveau memo\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le mémo d'un compte (commande 'email')." RETCODE);
+ } else {
+ printf("Please input an account name and a memo.\n");
+ printf("<example> memo testname new memo\n");
+ ladmin_log("Incomplete parameters to change the memo of an account ('email' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (strlen(memo) > 254) {
+ if (defaultlanguage == 'F') {
+ printf("Mémo trop long (%d caractères).\n", strlen(memo));
+ printf("Entrez un mémo de 254 caractères maximum svp.\n");
+ ladmin_log("Mémo trop long (%d caractères). Entrez un mémo de 254 caractères maximum svp." RETCODE, strlen(memo));
+ } else {
+ printf("Memo is too long (%d characters).\n", strlen(memo));
+ printf("Please input a memo of 254 bytes at the maximum.\n");
+ ladmin_log("Email is too long (%d characters). Please input a memo of 254 bytes at the maximum." RETCODE, strlen(memo));
+ }
+ return 102;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer un mémo." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change a memo." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7942;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOW(login_fd,26) = strlen(memo);
+ if (strlen(memo) > 0)
+ memcpy(WFIFOP(login_fd,28), memo, strlen(memo));
+ WFIFOSET(login_fd,28+strlen(memo));
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-----------------------------------------------
+// Sub-function: Asking to obtain an account name
+//-----------------------------------------------
+int nameaccount(int id) {
+ WFIFOHEAD(login_fd,6);
+ if (id < 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un id ayant une valeur positive svp.\n");
+ ladmin_log("Id négatif donné pour rechecher le nom d'un compte (commande 'name')." RETCODE);
+ } else {
+ printf("Please input a positive value for the id.\n");
+ ladmin_log("Negativ id given to search an account name ('name' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (defaultlanguage == 'F')
+ ladmin_log("Envoi d'un requête au serveur de logins pour connaître le nom d'un compte." RETCODE);
+ else
+ ladmin_log("Request to login-server to know an account name." RETCODE);
+
+ WFIFOW(login_fd,0) = 0x7946;
+ WFIFOL(login_fd,2) = id;
+ WFIFOSET(login_fd,6);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//------------------------------------------
+// Sub-function: Asking to modify a password
+// (Note: never send back a password with login-server!! security of passwords)
+//------------------------------------------
+int changepasswd(char* param) {
+ char name[1023], password[1023];
+ WFIFOHEAD(login_fd,50);
+
+ memset(name, '\0', sizeof(name));
+ memset(password, '\0', sizeof(password));
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 &&
+ sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 &&
+ sscanf(param, "%s %[^\r\n]", name, password) < 1) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple> passwd nomtest nouveaumotdepasse\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le mot d'un passe d'un compte (commande 'password')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example> passwd testname newpassword\n");
+ ladmin_log("Incomplete parameters to change the password of an account ('password' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (strlen(password) == 0) {
+ if (typepasswd(password) == 0)
+ return 134;
+ }
+ if (verify_password(password) == 0)
+ return 131;
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer un mot de passe." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change a password." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7934;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ memcpy(WFIFOP(login_fd,26), password, 24);
+ WFIFOSET(login_fd,50);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// Sub-function: Request to login-server to reload GM configuration file
+// this function have no answer
+//----------------------------------------------------------------------
+int reloadGM(void) {
+ WFIFOHEAD(login_fd,2);
+ WFIFOW(login_fd,0) = 0x7955;
+ WFIFOSET(login_fd,2);
+ bytes_to_read = 0;
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Demande de recharger le fichier de configuration des GM envoyée." RETCODE);
+ printf("Demande de recharger le fichier de configuration des GM envoyée.\n");
+ printf("Vérifiez les comptes GM actuels (après rechargement):\n");
+ } else {
+ ladmin_log("Request to reload the GM configuration file sended." RETCODE);
+ printf("Request to reload the GM configuration file sended.\n");
+ printf("Check the actual GM accounts (after reloading):\n");
+ }
+ listaccount(parameters, 1); // 1: to list only GM
+
+ return 180;
+}
+
+//-----------------------------------------------------
+// Sub-function: Asking to modify the sex of an account
+//-----------------------------------------------------
+int changesex(char* param) {
+ char name[1023], sex[1023];
+ WFIFOHEAD(login_fd,27);
+
+ memset(name, '\0', sizeof(name));
+ memset(sex, '\0', sizeof(sex));
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, sex) < 2 &&
+ sscanf(param, "'%[^']' %[^\r\n]", name, sex) < 2 &&
+ sscanf(param, "%s %[^\r\n]", name, sex) < 2) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un sexe svp.\n");
+ printf("<exemple> sex nomtest Male\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le sexe d'un compte (commande 'sex')." RETCODE);
+ } else {
+ printf("Please input an account name and a sex.\n");
+ printf("<example> sex testname Male\n");
+ ladmin_log("Incomplete parameters to change the sex of an account ('sex' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ sex[0] = toupper(sex[0]);
+ if (strchr("MF", sex[0]) == NULL) {
+ if (defaultlanguage == 'F') {
+ printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
+ ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
+ } else {
+ printf("Illegal gender [%s]. Please input M or F.\n", sex);
+ ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
+ }
+ return 103;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer un sexe." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change a sex." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x793c;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOB(login_fd,26) = sex[0];
+ WFIFOSET(login_fd,27);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+// Sub-function of sub-function changestate, blockaccount or unblockaccount
+// Asking to modify the state of an account
+//-------------------------------------------------------------------------
+int changestatesub(char* name, int state, char* error_message7) {
+ char error_message[1023]; // need to use, because we can modify error_message7
+ WFIFOHEAD(login_fd,50);
+
+ memset(error_message, '\0', sizeof(error_message));
+ strncpy(error_message, error_message7, sizeof(error_message)-1);
+
+ if ((state < 0 || state > 9) && state != 100) { // Valid values: 0: ok, or value of the 0x006a packet + 1
+ if (defaultlanguage == 'F') {
+ printf("Entrez une des statuts suivantes svp:\n");
+ printf(" 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n");
+ } else {
+ printf("Please input one of these states:\n");
+ printf(" 0 = Account ok 6 = Your Game's EXE file is not the latest version\n");
+ }
+ printf(" 1 = Unregistered ID 7 = You are Prohibited to log in until + message\n");
+ printf(" 2 = Incorrect Password 8 = Server is jammed due to over populated\n");
+ printf(" 3 = This ID is expired 9 = No MSG\n");
+ printf(" 4 = Rejected from Server 100 = This ID has been totally erased\n");
+ printf(" 5 = You have been blocked by the GM Team\n");
+ if (defaultlanguage == 'F') {
+ printf("<exemples> state nomtest 5\n");
+ printf(" state nomtest 7 fin de votre ban\n");
+ printf(" block <nom compte>\n");
+ printf(" unblock <nom compte>\n");
+ ladmin_log("Valeur incorrecte pour le statut d'un compte (commande 'state', 'block' ou 'unblock')." RETCODE);
+ } else {
+ printf("<examples> state testname 5\n");
+ printf(" state testname 7 end of your ban\n");
+ printf(" block <account name>\n");
+ printf(" unblock <account name>\n");
+ ladmin_log("Invalid value for the state of an account ('state', 'block' or 'unblock' command)." RETCODE);
+ }
+ return 151;
+ }
+
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (state != 7) {
+ strcpy(error_message, "-");
+ } else {
+ if (strlen(error_message) < 1) {
+ if (defaultlanguage == 'F') {
+ printf("Message d'erreur trop court. Entrez un message de 1-19 caractères.\n");
+ ladmin_log("Message d'erreur trop court. Entrez un message de 1-19 caractères." RETCODE);
+ } else {
+ printf("Error message is too short. Please input a message of 1-19 bytes.\n");
+ ladmin_log("Error message is too short. Please input a message of 1-19 bytes." RETCODE);
+ }
+ return 102;
+ }
+ if (strlen(error_message) > 19) {
+ if (defaultlanguage == 'F') {
+ printf("Message d'erreur trop long. Entrez un message de 1-19 caractères.\n");
+ ladmin_log("Message d'erreur trop long. Entrez un message de 1-19 caractères." RETCODE);
+ } else {
+ printf("Error message is too long. Please input a message of 1-19 bytes.\n");
+ ladmin_log("Error message is too long. Please input a message of 1-19 bytes." RETCODE);
+ }
+ return 102;
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour changer un statut." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to change a state." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7936;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOL(login_fd,26) = state;
+ memcpy(WFIFOP(login_fd,30), error_message, 20);
+ WFIFOSET(login_fd,50);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-------------------------------------------------------
+// Sub-function: Asking to modify the state of an account
+//-------------------------------------------------------
+int changestate(char* param) {
+ char name[1023], error_message[1023];
+ int state;
+
+ memset(name, '\0', sizeof(name));
+ memset(error_message, '\0', sizeof(error_message));
+
+ if (sscanf(param, "\"%[^\"]\" %d %[^\r\n]", name, &state, error_message) < 2 &&
+ sscanf(param, "'%[^']' %d %[^\r\n]", name, &state, error_message) < 2 &&
+ sscanf(param, "%s %d %[^\r\n]", name, &state, error_message) < 2) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un statut svp.\n");
+ printf("<exemples> state nomtest 5\n");
+ printf(" state nomtest 7 fin de votre ban\n");
+ printf(" block <nom compte>\n");
+ printf(" unblock <nom compte>\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'state')." RETCODE);
+ } else {
+ printf("Please input an account name and a state.\n");
+ printf("<examples> state testname 5\n");
+ printf(" state testname 7 end of your ban\n");
+ printf(" block <account name>\n");
+ printf(" unblock <account name>\n");
+ ladmin_log("Incomplete parameters to change the state of an account ('state' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ return changestatesub(name, state, error_message);
+}
+
+//-------------------------------------------
+// Sub-function: Asking to unblock an account
+//-------------------------------------------
+int unblockaccount(char* param) {
+ char name[1023];
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemples> state nomtest 5\n");
+ printf(" state nomtest 7 fin de votre ban\n");
+ printf(" block <nom compte>\n");
+ printf(" unblock <nom compte>\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'unblock')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<examples> state testname 5\n");
+ printf(" state testname 7 end of your ban\n");
+ printf(" block <account name>\n");
+ printf(" unblock <account name>\n");
+ ladmin_log("Incomplete parameters to change the state of an account ('unblock' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ return changestatesub(name, 0, "-"); // state 0, no error message
+}
+
+//-------------------------------------------
+// Sub-function: Asking to unblock an account
+//-------------------------------------------
+int blockaccount(char* param) {
+ char name[1023];
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemples> state nomtest 5\n");
+ printf(" state nomtest 7 fin de votre ban\n");
+ printf(" block <nom compte>\n");
+ printf(" unblock <nom compte>\n");
+ ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'block')." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<examples> state testname 5\n");
+ printf(" state testname 7 end of your ban\n");
+ printf(" block <account name>\n");
+ printf(" unblock <account name>\n");
+ ladmin_log("Incomplete parameters to change the state of an account ('block' command)." RETCODE);
+ }
+ return 136;
+ }
+
+ return changestatesub(name, 5, "-"); // state 5, no error message
+}
+
+//---------------------------------------------------------------------
+// Sub-function: Add/substract time to the validity limit of an account
+//---------------------------------------------------------------------
+int timeaddaccount(char* param) {
+ char name[1023], modif[1023];
+ int year, month, day, hour, minute, second;
+ char * p_modif;
+ int value, i;
+ WFIFOHEAD(login_fd,38);
+
+ memset(name, '\0', sizeof(name));
+ memset(modif, '\0', sizeof(modif));
+ year = month = day = hour = minute = second = 0;
+
+ if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
+ sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
+ sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte et un modificateur svp.\n");
+ printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
+ printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ ladmin_log("Nombre incorrect de paramètres pour modifier une date limite d'utilisation (commande 'timeadd')." RETCODE);
+ } else {
+ printf("Please input an account name and a modifier.\n");
+ printf(" <example>: timeadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ ladmin_log("Incomplete parameters to modify a limit time ('timeadd' command)." RETCODE);
+ }
+ return 136;
+ }
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ // lowercase for modif
+ for (i = 0; modif[i]; i++)
+ modif[i] = tolower(modif[i]);
+ p_modif = modif;
+ while (strlen(p_modif) > 0) {
+ value = atoi(p_modif);
+ if (value == 0) {
+ p_modif++;
+ } else {
+ if (p_modif[0] == '-' || p_modif[0] == '+')
+ p_modif++;
+ while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
+ p_modif++;
+ }
+ if (p_modif[0] == 's') {
+ second = value;
+ p_modif++;
+ } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
+ minute = value;
+ p_modif += 2;
+ } else if (p_modif[0] == 'h') {
+ hour = value;
+ p_modif++;
+ } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
+ day = value;
+ p_modif += 2;
+ } else if (p_modif[0] == 'm') {
+ month = value;
+ p_modif++;
+ } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
+ year = value;
+ p_modif++;
+ } else {
+ p_modif++;
+ }
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ printf(" année: %d\n", year);
+ printf(" mois: %d\n", month);
+ printf(" jour: %d\n", day);
+ printf(" heure: %d\n", hour);
+ printf(" minute: %d\n", minute);
+ printf(" seconde: %d\n", second);
+ } else {
+ printf(" year: %d\n", year);
+ printf(" month: %d\n", month);
+ printf(" day: %d\n", day);
+ printf(" hour: %d\n", hour);
+ printf(" minute: %d\n", minute);
+ printf(" second: %d\n", second);
+ }
+
+ if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
+ printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
+ printf(" Elément modifié:\n");
+ printf(" a ou y: année\n");
+ printf(" m: mois\n");
+ printf(" j ou d: jour\n");
+ printf(" h: heure\n");
+ printf(" mn: minute\n");
+ printf(" s: seconde\n");
+ printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
+ printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
+ printf(" et 6 ans dans le même temps.\n");
+ ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'timeadd')." RETCODE);
+ } else {
+ printf("Please give an adjustment with this command:\n");
+ printf(" Adjustment value (-1, 1, +1, etc...)\n");
+ printf(" Modified element:\n");
+ printf(" a or y: year\n");
+ printf(" m: month\n");
+ printf(" j or d: day\n");
+ printf(" h: hour\n");
+ printf(" mn: minute\n");
+ printf(" s: second\n");
+ printf(" <example> timeadd testname +1m-2mn1s-6y\n");
+ printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
+ printf(" and 6 years at the same time.\n");
+ ladmin_log("No adjustment isn't an adjustment ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (year > 127 || year < -127) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
+ ladmin_log("Ajustement de l'année hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the years (from -127 to 127).\n");
+ ladmin_log("Abnormal adjustement for the year ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (month > 255 || month < -255) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
+ ladmin_log("Ajustement du mois hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the months (from -255 to 255).\n");
+ ladmin_log("Abnormal adjustement for the month ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (day > 32767 || day < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des jours hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the days ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (hour > 32767 || hour < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des heures hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the hours ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (minute > 32767 || minute < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des minutes hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the minutes ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+ if (second > 32767 || second < -32767) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
+ ladmin_log("Ajustement des secondes hors norme ('timeadd' command)." RETCODE);
+ } else {
+ printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
+ ladmin_log("Abnormal adjustement for the seconds ('timeadd' command)." RETCODE);
+ }
+ return 137;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour modifier une date limite d'utilisation." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to modify a time limit." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7950;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOW(login_fd,26) = (short)year;
+ WFIFOW(login_fd,28) = (short)month;
+ WFIFOW(login_fd,30) = (short)day;
+ WFIFOW(login_fd,32) = (short)hour;
+ WFIFOW(login_fd,34) = (short)minute;
+ WFIFOW(login_fd,36) = (short)second;
+ WFIFOSET(login_fd,38);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//-------------------------------------------------
+// Sub-function: Set a validity limit of an account
+//-------------------------------------------------
+int timesetaccount(char* param) {
+ char name[1023], date[1023], time[1023];
+ int year, month, day, hour, minute, second;
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+ struct tm *tmtime;
+ WFIFOHEAD(login_fd,30);
+
+ memset(name, '\0', sizeof(name));
+ memset(date, '\0', sizeof(date));
+ memset(time, '\0', sizeof(time));
+ year = month = day = hour = minute = second = 0;
+ connect_until_time = 0;
+ tmtime = localtime(&connect_until_time); // initialize
+
+ if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
+ sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
+ sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte, une date et une heure svp.\n");
+ printf("<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
+ printf(" timeset <nom_du_compte> 0 (0 = illimité)\n");
+ printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Nombre incorrect de paramètres pour fixer une date limite d'utilisation (commande 'timeset')." RETCODE);
+ } else {
+ printf("Please input an account name, a date and a hour.\n");
+ printf("<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
+ printf(" timeset <account_name> 0 (0 = unlimited)\n");
+ printf(" Default time [hh:mm:ss]: 23:59:59.\n");
+ ladmin_log("Incomplete parameters to set a limit time ('timeset' command)." RETCODE);
+ }
+ return 136;
+ }
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (time[0] == '\0')
+ strcpy(time, "23:59:59");
+
+ if (atoi(date) != 0 &&
+ ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
+ sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
+ sscanf(date, "%d.%d.%d", &year, &month, &day) < 3 &&
+ sscanf(date, "%d'%d'%d", &year, &month, &day) < 3) ||
+ sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
+ ladmin_log("Format incorrect pour la date/heure ('timeset' command)." RETCODE);
+ } else {
+ printf("Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
+ ladmin_log("Invalid format for the date/time ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+
+ if (atoi(date) == 0) {
+ connect_until_time = 0;
+ } else {
+ if (year < 70) {
+ year = year + 100;
+ }
+ if (year >= 1900) {
+ year = year - 1900;
+ }
+ if (month < 1 || month > 12) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un mois correct svp (entre 1 et 12).\n");
+ ladmin_log("Mois incorrect pour la date ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for the month (from 1 to 12).\n");
+ ladmin_log("Invalid month for the date ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ month = month - 1;
+ if (day < 1 || day > 31) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un jour correct svp (entre 1 et 31).\n");
+ ladmin_log("Jour incorrect pour la date ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for the day (from 1 to 31).\n");
+ ladmin_log("Invalid day for the date ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
+ (month == 1 && day > 29)) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
+ ladmin_log("Jour incorrect pour ce mois correspondant ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for a day of this month (%d).\n", month);
+ ladmin_log("Invalid day for this month ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (hour < 0 || hour > 23) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez une heure correcte svp (entre 0 et 23).\n");
+ ladmin_log("Heure incorrecte pour l'heure ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for the hour (from 0 to 23).\n");
+ ladmin_log("Invalid hour for the time ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (minute < 0 || minute > 59) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
+ ladmin_log("Minute incorrecte pour l'heure ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for the minutes (from 0 to 59).\n");
+ ladmin_log("Invalid minute for the time ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ if (second < 0 || second > 59) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
+ ladmin_log("Seconde incorrecte pour l'heure ('timeset' command)." RETCODE);
+ } else {
+ printf("Please give a correct value for the seconds (from 0 to 59).\n");
+ ladmin_log("Invalid second for the time ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ tmtime->tm_year = year;
+ tmtime->tm_mon = month;
+ tmtime->tm_mday = day;
+ tmtime->tm_hour = hour;
+ tmtime->tm_min = minute;
+ tmtime->tm_sec = second;
+ tmtime->tm_isdst = -1; // -1: no winter/summer time modification
+ connect_until_time = mktime(tmtime);
+ if (connect_until_time == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Date incorrecte.\n");
+ printf("Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
+ ladmin_log("Date incorrecte. ('timeset' command)." RETCODE);
+ } else {
+ printf("Invalid date.\n");
+ printf("Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
+ ladmin_log("Invalid date. ('timeset' command)." RETCODE);
+ }
+ return 102;
+ }
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour fixer une date limite d'utilisation." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to set a time limit." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7948;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOL(login_fd,26) = (int)connect_until_time;
+ WFIFOSET(login_fd,30);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+// Sub-function: Asking to displaying information about an account (by its name)
+//------------------------------------------------------------------------------
+int whoaccount(char* param) {
+ char name[1023];
+ WFIFOHEAD(login_fd,26);
+
+ memset(name, '\0', sizeof(name));
+
+ if (strlen(param) == 0 ||
+ (sscanf(param, "\"%[^\"]\"", name) < 1 &&
+ sscanf(param, "'%[^']'", name) < 1 &&
+ sscanf(param, "%[^\r\n]", name) < 1) ||
+ strlen(name) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Entrez un nom de compte svp.\n");
+ printf("<exemple> who nomtest\n");
+ ladmin_log("Aucun nom n'a été donné pour trouver le compte." RETCODE);
+ } else {
+ printf("Please input an account name.\n");
+ printf("<example> who testname\n");
+ ladmin_log("No name was given to found the account." RETCODE);
+ }
+ return 136;
+ }
+ if (verify_accountname(name) == 0) {
+ return 102;
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par le nom)." RETCODE);
+ } else {
+ ladmin_log("Request to login-server to obtain information about an account (by its name)." RETCODE);
+ }
+
+ WFIFOW(login_fd,0) = 0x7952;
+ memcpy(WFIFOP(login_fd,2), name, 24);
+ WFIFOSET(login_fd,26);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// Sub-function: Asking of the version of the login-server
+//--------------------------------------------------------
+int checkloginversion(void) {
+ WFIFOHEAD(login_fd,2);
+ if (defaultlanguage == 'F')
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir sa version." RETCODE);
+ else
+ ladmin_log("Request to login-server to obtain its version." RETCODE);
+
+ WFIFOW(login_fd,0) = 0x7530;
+ WFIFOSET(login_fd,2);
+ bytes_to_read = 1;
+
+ return 0;
+}
+
+//---------------------------------------------
+// Prompt function
+// this function wait until user type a command
+// and analyse the command.
+//---------------------------------------------
+int prompt(void) {
+ int i, j;
+ char buf[1024];
+ char *p;
+
+ // while we don't wait new packets
+ while (bytes_to_read == 0) {
+ // for help with the console colors look here:
+ // http://www.edoceo.com/liberum/?doc=printf-with-color
+ // some code explanation (used here):
+ // \033[2J : clear screen and go up/left (0, 0 position)
+ // \033[K : clear line from actual position to end of the line
+ // \033[0m : reset color parameter
+ // \033[1m : use bold for font
+ printf("\n");
+ if (defaultlanguage == 'F')
+ printf("\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n");
+ else
+ printf("\033[32mTo list the commands, type 'enter'.\033[0m\n");
+ printf("\033[0;36mLadmin-> \033[0m");
+ printf("\033[1m");
+ fflush(stdout);
+
+ // get command and parameter
+ memset(buf, '\0', sizeof(buf));
+ fflush(stdin);
+ fgets(buf, 1023, stdin);
+ buf[1023] = '\0';
+
+ printf("\033[0m");
+ fflush(stdout);
+
+ // remove final \n
+ if((p = strrchr(buf, '\n')) != NULL)
+ p[0] = '\0';
+ // remove all control char
+ for (i = 0; buf[i]; i++)
+ if (buf[i] < 32) {
+ // remove cursor control.
+ if (buf[i] == 27 && buf[i+1] == '[' &&
+ (buf[i+2] == 'H' || // home position (cursor)
+ buf[i+2] == 'J' || // clear screen
+ buf[i+2] == 'A' || // up 1 line
+ buf[i+2] == 'B' || // down 1 line
+ buf[i+2] == 'C' || // right 1 position
+ buf[i+2] == 'D' || // left 1 position
+ buf[i+2] == 'G')) { // center cursor (windows)
+ for (j = i; buf[j]; j++)
+ buf[j] = buf[j+3];
+ } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+2] == '2' && buf[i+3] == 'J') { // clear screen
+ for (j = i; buf[j]; j++)
+ buf[j] = buf[j+4];
+ } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+3] == '~' &&
+ (buf[i+2] == '1' || // home (windows)
+ buf[i+2] == '2' || // insert (windows)
+ buf[i+2] == '3' || // del (windows)
+ buf[i+2] == '4' || // end (windows)
+ buf[i+2] == '5' || // pgup (windows)
+ buf[i+2] == '6')) { // pgdown (windows)
+ for (j = i; buf[j]; j++)
+ buf[j] = buf[j+4];
+ } else {
+ // remove other control char.
+ for (j = i; buf[j]; j++)
+ buf[j] = buf[j+1];
+ }
+ i--;
+ }
+
+ // extract command name and parameters
+ memset(command, '\0', sizeof(command));
+ memset(parameters, '\0', sizeof(parameters));
+ sscanf(buf, "%1023s %[^\n]", command, parameters);
+ command[1023] = '\0';
+ parameters[1023] = '\0';
+
+ // lowercase for command line
+ for (i = 0; command[i]; i++)
+ command[i] = tolower(command[i]);
+
+ if (command[0] == '?' || strlen(command) == 0) {
+ if (defaultlanguage == 'F') {
+ strcpy(buf, "aide");
+ strcpy(command, "aide");
+ } else {
+ strcpy(buf, "help");
+ strcpy(command, "help");
+ }
+ }
+
+ // Analyse of the command
+ check_command(command); // give complete name to the command
+
+ if (strlen(parameters) == 0) {
+ if (defaultlanguage == 'F') {
+ ladmin_log("Commande: '%s' (sans paramètre)" RETCODE, command, parameters);
+ } else {
+ ladmin_log("Command: '%s' (without parameters)" RETCODE, command, parameters);
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ ladmin_log("Commande: '%s', paramètres: '%s'" RETCODE, command, parameters);
+ } else {
+ ladmin_log("Command: '%s', parameters: '%s'" RETCODE, command, parameters);
+ }
+ }
+
+ // Analyse of the command
+// help
+ if (strcmp(command, "aide") == 0) {
+ display_help(parameters, 1); // 1: french
+ } else if (strcmp(command, "help") == 0 ) {
+ display_help(parameters, 0); // 0: english
+// general commands
+ } else if (strcmp(command, "add") == 0) {
+ addaccount(parameters, 0); // 0: no email
+ } else if (strcmp(command, "ban") == 0) {
+ banaccount(parameters);
+ } else if (strcmp(command, "banadd") == 0) {
+ banaddaccount(parameters);
+ } else if (strcmp(command, "banset") == 0) {
+ bansetaccount(parameters);
+ } else if (strcmp(command, "block") == 0) {
+ blockaccount(parameters);
+ } else if (strcmp(command, "check") == 0) {
+ checkaccount(parameters);
+ } else if (strcmp(command, "create") == 0) {
+ addaccount(parameters, 1); // 1: with email
+ } else if (strcmp(command, "delete") == 0) {
+ delaccount(parameters);
+ } else if (strcmp(command, "email") == 0) {
+ changeemail(parameters);
+ } else if (strcmp(command, "getcount") == 0) {
+ getlogincount();
+ } else if (strcmp(command, "gm") == 0) {
+ changegmlevel(parameters);
+ } else if (strcmp(command, "id") == 0) {
+ idaccount(parameters);
+ } else if (strcmp(command, "info") == 0) {
+ infoaccount(atoi(parameters));
+ } else if (strcmp(command, "kami") == 0) {
+ sendbroadcast(0, parameters); // flag for normal
+ } else if (strcmp(command, "kamib") == 0) {
+ sendbroadcast(0x10, parameters); // flag for blue
+ } else if (strcmp(command, "language") == 0) {
+ changelanguage(parameters);
+ } else if (strcmp(command, "list") == 0) {
+ listaccount(parameters, 0); // 0: to list all
+ } else if (strcmp(command, "listban") == 0) {
+ listaccount(parameters, 3); // 3: to list only accounts with state or bannished
+ } else if (strcmp(command, "listgm") == 0) {
+ listaccount(parameters, 1); // 1: to list only GM
+ } else if (strcmp(command, "listok") == 0) {
+ listaccount(parameters, 4); // 4: to list only accounts without state and not bannished
+ } else if (strcmp(command, "memo") == 0) {
+ changememo(parameters);
+ } else if (strcmp(command, "name") == 0) {
+ nameaccount(atoi(parameters));
+ } else if (strcmp(command, "password") == 0) {
+ changepasswd(parameters);
+ } else if (strcmp(command, "reloadgm") == 0) {
+ reloadGM();
+ } else if (strcmp(command, "search") == 0) { // no regex in C version
+ listaccount(parameters, 2); // 2: to list with pattern
+ } else if (strcmp(command, "sex") == 0) {
+ changesex(parameters);
+ } else if (strcmp(command, "state") == 0) {
+ changestate(parameters);
+ } else if (strcmp(command, "timeadd") == 0) {
+ timeaddaccount(parameters);
+ } else if (strcmp(command, "timeset") == 0) {
+ timesetaccount(parameters);
+ } else if (strcmp(command, "unban") == 0) {
+ unbanaccount(parameters);
+ } else if (strcmp(command, "unblock") == 0) {
+ unblockaccount(parameters);
+ } else if (strcmp(command, "version") == 0) {
+ checkloginversion();
+ } else if (strcmp(command, "who") == 0) {
+ whoaccount(parameters);
+// quit
+ } else if (strcmp(command, "quit") == 0 ||
+ strcmp(command, "exit") == 0 ||
+ strcmp(command, "end") == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Au revoir.\n");
+ } else {
+ printf("Bye.\n");
+ }
+ exit(0);
+// unknown command
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Commande inconnue [%s].\n", buf);
+ ladmin_log("Commande inconnue [%s]." RETCODE, buf);
+ } else {
+ printf("Unknown command [%s].\n", buf);
+ ladmin_log("Unknown command [%s]." RETCODE, buf);
+ }
+ }
+ }
+
+ return 0;
+}
+
+//-------------------------------------------------------------
+// Function: Parse receiving informations from the login-server
+//-------------------------------------------------------------
+int parse_fromlogin(int fd) {
+ struct char_session_data *sd;
+ int id;
+ RFIFOHEAD(fd);
+ if (session[fd]->eof) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de se connecter au serveur de login [%s:%d] !\n", loginserverip, loginserverport);
+ ladmin_log("Impossible de se connecter au serveur de login [%s:%d] !" RETCODE, loginserverip, loginserverport);
+ } else {
+ printf("Impossible to have a connection with the login-server [%s:%d] !\n", loginserverip, loginserverport);
+ ladmin_log("Impossible to have a connection with the login-server [%s:%d] !" RETCODE, loginserverip, loginserverport);
+ }
+ close(fd);
+ delete_session(fd);
+ exit (0);
+ }
+
+// printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
+ sd = (struct char_session_data*)session[fd]->session_data;
+
+ while(RFIFOREST(fd) >= 2) {
+ switch(RFIFOW(fd,0)) {
+ case 0x7919: // answer of a connection request
+ if (RFIFOREST(fd) < 3)
+ return 0;
+ if (RFIFOB(fd,2) != 0) {
+ if (defaultlanguage == 'F') {
+ printf("Erreur de login:\n");
+ printf(" - mot de passe incorrect,\n");
+ printf(" - système d'administration non activé, ou\n");
+ printf(" - IP non autorisée.\n");
+ ladmin_log("Erreur de login: mot de passe incorrect, système d'administration non activé, ou IP non autorisée." RETCODE);
+ } else {
+ printf("Error at login:\n");
+ printf(" - incorrect password,\n");
+ printf(" - administration system not activated, or\n");
+ printf(" - unauthorised IP.\n");
+ ladmin_log("Error at login: incorrect password, administration system not activated, or unauthorised IP." RETCODE);
+ }
+ session[fd]->eof = 1;
+ //bytes_to_read = 1; // not stop at prompt
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Connexion établie.\n");
+ ladmin_log("Connexion établie." RETCODE);
+ printf("Lecture de la version du serveur de login...\n");
+ ladmin_log("Lecture de la version du serveur de login..." RETCODE);
+ } else {
+ printf("Established connection.\n");
+ ladmin_log("Established connection." RETCODE);
+ printf("Reading of the version of the login-server...\n");
+ ladmin_log("Reading of the version of the login-server..." RETCODE);
+ }
+ //bytes_to_read = 1; // unchanged
+ checkloginversion();
+ }
+ RFIFOSKIP(fd,3);
+ break;
+
+#ifdef PASSWORDENC
+ case 0x01dc: // answer of a coding key request
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ char md5str[64] = "", md5bin[32];
+ WFIFOHEAD(login_fd, 20);
+ if (passenc == 1) {
+ strncpy(md5str, (const char*)RFIFOP(fd,4), RFIFOW(fd,2) - 4);
+ strcat(md5str, loginserveradminpassword);
+ } else if (passenc == 2) {
+ strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword));
+ strcat(md5str, (const char*)RFIFOP(fd,4));
+ }
+ MD5_String2binary(md5str, md5bin);
+ WFIFOW(login_fd,0) = 0x7918; // Request for administation login (encrypted password)
+ WFIFOW(login_fd,2) = passenc; // Encrypted type
+ memcpy(WFIFOP(login_fd,4), md5bin, 16);
+ WFIFOSET(login_fd,20);
+ if (defaultlanguage == 'F') {
+ printf("Réception de la clef MD5.\n");
+ ladmin_log("Réception de la clef MD5." RETCODE);
+ printf("Envoi du mot de passe crypté...\n");
+ ladmin_log("Envoi du mot de passe crypté..." RETCODE);
+ } else {
+ printf("Receiving of the MD5 key.\n");
+ ladmin_log("Receiving of the MD5 key." RETCODE);
+ printf("Sending of the encrypted password...\n");
+ ladmin_log("Sending of the encrypted password..." RETCODE);
+ }
+ }
+ bytes_to_read = 1;
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+#endif
+
+ case 0x7531: // Displaying of the version of the login-server
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ printf(" Login-Server [%s:%d]\n", loginserverip, loginserverport);
+ if (((int)RFIFOB(login_fd,5)) == 0) {
+ printf(" eAthena version stable-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
+ } else {
+ printf(" eAthena version dev-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
+ }
+ if (((int)RFIFOB(login_fd,4)) == 0)
+ printf(" revision %d", (int)RFIFOB(login_fd,4));
+ if (((int)RFIFOB(login_fd,6)) == 0)
+ printf("%d.\n", RFIFOW(login_fd,8));
+ else
+ printf("-mod%d.\n", RFIFOW(login_fd,8));
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,10);
+ break;
+
+ case 0x7921: // Displaying of the list of accounts
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (RFIFOW(fd,2) < 5) {
+ if (defaultlanguage == 'F') {
+ ladmin_log(" Réception d'une liste des comptes vide." RETCODE);
+ if (list_count == 0)
+ printf("Aucun compte trouvé.\n");
+ else if (list_count == 1)
+ printf("1 compte trouvé.\n");
+ else
+ printf("%d comptes trouvés.\n", list_count);
+ } else {
+ ladmin_log(" Receiving of a void accounts list." RETCODE);
+ if (list_count == 0)
+ printf("No account found.\n");
+ else if (list_count == 1)
+ printf("1 account found.\n");
+ else
+ printf("%d accounts found.\n", list_count);
+ }
+ bytes_to_read = 0;
+ } else {
+ int i;
+ WFIFOHEAD(login_fd,10);
+ if (defaultlanguage == 'F')
+ ladmin_log(" Réception d'une liste des comptes." RETCODE);
+ else
+ ladmin_log(" Receiving of a accounts list." RETCODE);
+ for(i = 4; i < RFIFOW(fd,2); i += 38) {
+ int j;
+ char userid[24];
+ char lower_userid[24];
+ memcpy(userid, RFIFOP(fd,i + 5), sizeof(userid));
+ userid[sizeof(userid)-1] = '\0';
+ memset(lower_userid, '\0', sizeof(lower_userid));
+ for (j = 0; userid[j]; j++)
+ lower_userid[j] = tolower(userid[j]);
+ list_first = RFIFOL(fd,i) + 1;
+ // here are checks...
+ if (list_type == 0 ||
+ (list_type == 1 && RFIFOB(fd,i+4) > 0) ||
+ (list_type == 2 && strstr(lower_userid, parameters) != NULL) ||
+ (list_type == 3 && RFIFOL(fd,i+34) != 0) ||
+ (list_type == 4 && RFIFOL(fd,i+34) == 0)) {
+ printf("%10d ", (int)RFIFOL(fd,i));
+ if (RFIFOB(fd,i+4) == 0)
+ printf(" ");
+ else
+ printf("%2d ", (int)RFIFOB(fd,i+4));
+ printf("%-24s", userid);
+ if (defaultlanguage == 'F') {
+ if (RFIFOB(fd,i+29) == 0)
+ printf("%-5s ", "Femme");
+ else if (RFIFOB(fd,i+29) == 1)
+ printf("%-5s ", "Male");
+ else
+ printf("%-5s ", "Servr");
+ } else {
+ if (RFIFOB(fd,i+29) == 0)
+ printf("%-5s ", "Femal");
+ else if (RFIFOB(fd,i+29) == 1)
+ printf("%-5s ", "Male");
+ else
+ printf("%-5s ", "Servr");
+ }
+ printf("%6d ", (int)RFIFOL(fd,i+30));
+ switch(RFIFOL(fd,i+34)) {
+ case 0:
+ if (defaultlanguage == 'F')
+ printf("%-27s\n", "Compte Ok");
+ else
+ printf("%-27s\n", "Account OK");
+ break;
+ case 1:
+ printf("%-27s\n", "Unregistered ID");
+ break;
+ case 2:
+ printf("%-27s\n", "Incorrect Password");
+ break;
+ case 3:
+ printf("%-27s\n", "This ID is expired");
+ break;
+ case 4:
+ printf("%-27s\n", "Rejected from Server");
+ break;
+ case 5:
+ printf("%-27s\n", "Blocked by the GM Team"); // You have been blocked by the GM Team
+ break;
+ case 6:
+ printf("%-27s\n", "Your EXE file is too old"); // Your Game's EXE file is not the latest version
+ break;
+ case 7:
+ printf("%-27s\n", "Banishement or");
+ printf(" Prohibited to login until...\n"); // You are Prohibited to log in until %s
+ break;
+ case 8:
+ printf("%-27s\n", "Server is over populated");
+ break;
+ case 9:
+ printf("%-27s\n", "No MSG");
+ break;
+ default: // 100
+ printf("%-27s\n", "This ID is totally erased"); // This ID has been totally erased
+ break;
+ }
+ list_count++;
+ }
+ }
+ // asking of the following acounts
+ if (defaultlanguage == 'F')
+ ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d (complément)." RETCODE, list_first, list_last);
+ else
+ ladmin_log("Request to login-server to obtain the list of accounts from %d to %d (complement)." RETCODE, list_first, list_last);
+ WFIFOW(login_fd,0) = 0x7920;
+ WFIFOL(login_fd,2) = list_first;
+ WFIFOL(login_fd,6) = list_last;
+ WFIFOSET(login_fd,10);
+ bytes_to_read = 1;
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ case 0x7931: // Answer of login-server about an account creation
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id=RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec à la création du compte [%s]. Un compte identique existe déjà.\n", RFIFOP(fd,6));
+ ladmin_log("Echec à la création du compte [%s]. Un compte identique existe déjà." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] creation failed. Same account already exists.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] creation failed. Same account already exists." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Compte [%s] créé avec succès [id: %d].\n", RFIFOP(fd,6), id);
+ ladmin_log("Compte [%s] créé avec succès [id: %d]." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), id);
+ ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7933: // Answer of login-server about an account deletion
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de la suppression du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec de la suppression du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] deletion failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] deletion failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Compte [%s][id: %d] SUPPRIME avec succès.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ ladmin_log("Compte [%s][id: %d] SUPPRIME avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] is successfully DELETED.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] is successfully DELETED." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7935: // answer of the change of an account password
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de la modification du mot de passe du compte [%s].\n", RFIFOP(fd,6));
+ printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec de la modification du mot de passe du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] password changing failed.\n", RFIFOP(fd,6));
+ printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account password changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Modification du mot de passe du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ ladmin_log("Modification du mot de passe du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), (int)RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7937: // answer of the change of an account state
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ if (RFIFOL(fd,2) == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement du statut du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement du statut du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] state changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] state changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ char tmpstr[256];
+ if (defaultlanguage == 'F') {
+ sprintf(tmpstr, "Statut du compte [%s] changé avec succès en [", RFIFOP(fd,6));
+ } else {
+ sprintf(tmpstr, "Account [%s] state successfully changed in [", RFIFOP(fd,6));
+ }
+ switch(RFIFOL(fd,30)) {
+ case 0:
+ if (defaultlanguage == 'F')
+ strcat(tmpstr, "0: Compte Ok");
+ else
+ strcat(tmpstr, "0: Account OK");
+ break;
+ case 1:
+ strcat(tmpstr, "1: Unregistered ID");
+ break;
+ case 2:
+ strcat(tmpstr, "2: Incorrect Password");
+ break;
+ case 3:
+ strcat(tmpstr, "3: This ID is expired");
+ break;
+ case 4:
+ strcat(tmpstr, "4: Rejected from Server");
+ break;
+ case 5:
+ strcat(tmpstr, "5: You have been blocked by the GM Team");
+ break;
+ case 6:
+ strcat(tmpstr, "6: [Your Game's EXE file is not the latest version");
+ break;
+ case 7:
+ strcat(tmpstr, "7: You are Prohibited to log in until...");
+ break;
+ case 8:
+ strcat(tmpstr, "8: Server is jammed due to over populated");
+ break;
+ case 9:
+ strcat(tmpstr, "9: No MSG");
+ break;
+ default: // 100
+ strcat(tmpstr, "100: This ID is totally erased");
+ break;
+ }
+ strcat(tmpstr, "]");
+ printf("%s\n", tmpstr);
+ ladmin_log("%s%s", tmpstr, RETCODE);
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x7939: // answer of the number of online players
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ // Get length of the received packet
+ int i;
+ char name[20];
+ if (defaultlanguage == 'F') {
+ ladmin_log(" Réception du nombre de joueurs en ligne." RETCODE);
+ } else {
+ ladmin_log(" Receiving of the number of online players." RETCODE);
+ }
+ // Read information of the servers
+ if (RFIFOW(fd,2) < 5) {
+ if (defaultlanguage == 'F') {
+ printf(" Aucun serveur n'est connecté au login serveur.\n");
+ } else {
+ printf(" No server is connected to the login-server.\n");
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf(" Nombre de joueurs en ligne (serveur: nb):\n");
+ } else {
+ printf(" Number of online players (server: number).\n");
+ }
+ // Displaying of result
+ for(i = 4; i < RFIFOW(fd,2); i += 32) {
+ memcpy(name, RFIFOP(fd,i+6), sizeof(name));
+ name[sizeof(name) - 1] = '\0';
+ printf(" %-20s : %5d\n", name, RFIFOW(fd,i+26));
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ case 0x793b: // answer of the check of a password
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Le compte [%s] n'existe pas ou le mot de passe est incorrect.\n", RFIFOP(fd,6));
+ ladmin_log("Le compte [%s] n'existe pas ou le mot de passe est incorrect." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("The account [%s] doesn't exist or the password is incorrect.\n", RFIFOP(fd,6));
+ ladmin_log("The account [%s] doesn't exist or the password is incorrect." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Le mot de passe donné correspond bien au compte [%s][id: %d].\n", RFIFOP(fd,6), id);
+ ladmin_log("Le mot de passe donné correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), id);
+ ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x793d: // answer of the change of an account sex
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de la modification du sexe du compte [%s].\n", RFIFOP(fd,6));
+ printf("Le compte [%s] n'existe pas ou le sexe est déjà celui demandé.\n", RFIFOP(fd,6));
+ ladmin_log("Echec de la modification du sexe du compte. Le compte [%s] n'existe pas ou le sexe est déjà celui demandé." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] sex changing failed.\n", RFIFOP(fd,6));
+ printf("Account [%s] doesn't exist or the sex is already the good sex.\n", RFIFOP(fd,6));
+ ladmin_log("Account sex changing failed. The compte [%s] doesn't exist or the sex is already the good sex." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Sexe du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
+ ladmin_log("Sexe du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), id);
+ ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x793f: // answer of the change of an account GM level
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de la modification du niveau de GM du compte [%s].\n", RFIFOP(fd,6));
+ printf("Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé\n", RFIFOP(fd,6));
+ printf("ou il est impossible de modifier le fichier des comptes GM.\n");
+ ladmin_log("Echec de la modification du niveau de GM du compte. Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé ou il est impossible de modifier le fichier des comptes GM." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] GM level changing failed.\n", RFIFOP(fd,6));
+ printf("Account [%s] doesn't exist, the GM level is already the good GM level\n", RFIFOP(fd,6));
+ printf("or it's impossible to modify the GM accounts file.\n");
+ ladmin_log("Account GM level changing failed. The compte [%s] doesn't exist, the GM level is already the good sex or it's impossible to modify the GM accounts file." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Niveau de GM du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
+ ladmin_log("Niveau de GM du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), id);
+ ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7941: // answer of the change of an account email
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de la modification de l'e-mail du compte [%s].\n", RFIFOP(fd,6));
+ printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec de la modification de l'e-mail du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] e-mail changing failed.\n", RFIFOP(fd,6));
+ printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account e-mail changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Modification de l'e-mail du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), id);
+ ladmin_log("Modification de l'e-mail du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), id);
+ ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7943: // answer of the change of an account memo
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement du mémo du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement du mémo du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] memo changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] memo changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Mémo du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), id);
+ ladmin_log("Mémo du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), id);
+ ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7945: // answer of an account id search
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Unable to find the account [%s] id. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Unable to find the account [%s] id. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Le compte [%s] a pour id: %d.\n", RFIFOP(fd,6), id);
+ ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), id);
+ ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), id);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7947: // answer of an account name search
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (strcmp((const char*)RFIFOP(fd,6), "") == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", id);
+ ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, id);
+ } else {
+ printf("Unable to find the account [%d] name. Account doesn't exist.\n", id);
+ ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, id);
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Le compte [id: %d] a pour nom: %s.\n", id, RFIFOP(fd,6));
+ ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, id, RFIFOP(fd,6));
+ } else {
+ printf("The account [id: %d] have the name: %s.\n", id, RFIFOP(fd,6));
+ ladmin_log("The account [id: %d] have the name: %s." RETCODE, id, RFIFOP(fd,6));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7949: // answer of an account validity limit set
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ time_t timestamp = RFIFOL(fd,30);
+ if (timestamp == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité].\n", RFIFOP(fd,6), id);
+ ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité]." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), id);
+ ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), id);
+ }
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ if (defaultlanguage == 'F') {
+ printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ } else {
+ printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x794b: // answer of an account ban set
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ time_t timestamp = RFIFOL(fd,30);
+ if (timestamp == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), id);
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), id);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), id);
+ }
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ if (defaultlanguage == 'F') {
+ printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x794d: // answer of an account ban date/time changing
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ time_t timestamp = RFIFOL(fd,30);
+ if (timestamp == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), id);
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), id);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), id);
+ }
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ if (defaultlanguage == 'F') {
+ printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x794f: // answer of a broadcast
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ if (RFIFOW(fd,2) == (unsigned short)-1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec de l'envoi du message. Aucun server de char en ligne.\n");
+ ladmin_log("Echec de l'envoi du message. Aucun server de char en ligne." RETCODE);
+ } else {
+ printf("Message sending failed. No online char-server.\n");
+ ladmin_log("Message sending failed. No online char-server." RETCODE);
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Message transmis au server de logins avec succès.\n");
+ ladmin_log("Message transmis au server de logins avec succès." RETCODE);
+ } else {
+ printf("Message successfully sended to login-server.\n");
+ ladmin_log("Message successfully sended to login-server." RETCODE);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,4);
+ break;
+
+ case 0x7951: // answer of an account validity limit changing
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
+ ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
+ } else {
+ printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
+ ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
+ }
+ } else {
+ time_t timestamp = RFIFOL(fd,30);
+ if (timestamp == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Limite de validité du compte [%s][id: %d] inchangée.\n", RFIFOP(fd,6), id);
+ printf("Le compte a une validité illimitée ou\n");
+ printf("la modification est impossible avec les ajustements demandés.\n");
+ ladmin_log("Limite de validité du compte [%s][id: %d] inchangée. Le compte a une validité illimitée ou la modification est impossible avec les ajustements demandés." RETCODE, RFIFOP(fd,6), id);
+ } else {
+ printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), id);
+ printf("The account have an unlimited validity limit or\n");
+ printf("the changing is impossible with the proposed adjustments.\n");
+ ladmin_log("Validity limit of the account [%s][id: %d] unchanged. The account have an unlimited validity limit or the changing is impossible with the proposed adjustments." RETCODE, RFIFOP(fd,6), id);
+ }
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ if (defaultlanguage == 'F') {
+ printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ } else {
+ printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), id, tmpstr);
+ ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), id, tmpstr);
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x7953: // answer of a request about informations of an account (by account name/id)
+ if (RFIFOREST(fd) < 150 || RFIFOREST(fd) < (150 + RFIFOW(fd,148)))
+ return 0;
+ {
+ char userid[24], error_message[20], lastlogin[24], last_ip[16], email[40], memo[255];
+ time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+ memcpy(userid, RFIFOP(fd,7), sizeof(userid));
+ userid[sizeof(userid)-1] = '\0';
+ memcpy(error_message, RFIFOP(fd,40), sizeof(error_message));
+ error_message[sizeof(error_message)-1] = '\0';
+ memcpy(lastlogin, RFIFOP(fd,60), sizeof(lastlogin));
+ lastlogin[sizeof(lastlogin)-1] = '\0';
+ memcpy(last_ip, RFIFOP(fd,84), sizeof(last_ip));
+ last_ip[sizeof(last_ip)-1] = '\0';
+ memcpy(email, RFIFOP(fd,100), sizeof(email));
+ email[sizeof(email)-1] = '\0';
+ connect_until_time = (time_t)RFIFOL(fd,140);
+ ban_until_time = (time_t)RFIFOL(fd,144);
+ memset(memo, '\0', sizeof(memo));
+ strncpy(memo, (const char*)RFIFOP(fd,150), RFIFOW(fd,148));
+ id = RFIFOL(fd,2);
+ if (id == -1) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de trouver le compte [%s]. Le compte n'existe pas.\n", parameters);
+ ladmin_log("Impossible de trouver le compte [%s]. Le compte n'existe pas." RETCODE, parameters);
+ } else {
+ printf("Unabled to find the account [%s]. Account doesn't exist.\n", parameters);
+ ladmin_log("Unabled to find the account [%s]. Account doesn't exist." RETCODE, parameters);
+ }
+ } else if (strlen(userid) == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de trouver le compte [id: %s]. Le compte n'existe pas.\n", parameters);
+ ladmin_log("Impossible de trouver le compte [id: %s]. Le compte n'existe pas." RETCODE, parameters);
+ } else {
+ printf("Unabled to find the account [id: %s]. Account doesn't exist.\n", parameters);
+ ladmin_log("Unabled to find the account [id: %s]. Account doesn't exist." RETCODE, parameters);
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ ladmin_log("Réception d'information concernant un compte." RETCODE);
+ printf("Le compte a les caractéristiques suivantes:\n");
+ } else {
+ ladmin_log("Receiving information about an account." RETCODE);
+ printf("The account is set with:\n");
+ }
+ if (RFIFOB(fd,6) == 0) {
+ printf(" Id: %d (non-GM)\n", id);
+ } else {
+ if (defaultlanguage == 'F') {
+ printf(" Id: %d (GM niveau %d)\n", id, (int)RFIFOB(fd,6));
+ } else {
+ printf(" Id: %d (GM level %d)\n", id, (int)RFIFOB(fd,6));
+ }
+ }
+ if (defaultlanguage == 'F') {
+ printf(" Nom: '%s'\n", userid);
+ if (RFIFOB(fd,31) == 0)
+ printf(" Sexe: Femme\n");
+ else if (RFIFOB(fd,31) == 1)
+ printf(" Sexe: Male\n");
+ else
+ printf(" Sexe: Serveur\n");
+ } else {
+ printf(" Name: '%s'\n", userid);
+ if (RFIFOB(fd,31) == 0)
+ printf(" Sex: Female\n");
+ else if (RFIFOB(fd,31) == 1)
+ printf(" Sex: Male\n");
+ else
+ printf(" Sex: Server\n");
+ }
+ printf(" E-mail: %s\n", email);
+ switch(RFIFOL(fd,36)) {
+ case 0:
+ if (defaultlanguage == 'F')
+ printf(" Statut: 0 [Compte Ok]\n");
+ else
+ printf(" Statut: 0 [Account OK]\n");
+ break;
+ case 1:
+ printf(" Statut: 1 [Unregistered ID]\n");
+ break;
+ case 2:
+ printf(" Statut: 2 [Incorrect Password]\n");
+ break;
+ case 3:
+ printf(" Statut: 3 [This ID is expired]\n");
+ break;
+ case 4:
+ printf(" Statut: 4 [Rejected from Server]\n");
+ break;
+ case 5:
+ printf(" Statut: 5 [You have been blocked by the GM Team]\n");
+ break;
+ case 6:
+ printf(" Statut: 6 [Your Game's EXE file is not the latest version]\n");
+ break;
+ case 7:
+ printf(" Statut: 7 [You are Prohibited to log in until %s]\n", error_message);
+ break;
+ case 8:
+ printf(" Statut: 8 [Server is jammed due to over populated]\n");
+ break;
+ case 9:
+ printf(" Statut: 9 [No MSG]\n");
+ break;
+ default: // 100
+ printf(" Statut: %d [This ID is totally erased]\n", (int)RFIFOL(fd,36));
+ break;
+ }
+ if (defaultlanguage == 'F') {
+ if (ban_until_time == 0) {
+ printf(" Banissement: non banni.\n");
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
+ printf(" Banissement: jusqu'au %s.\n", tmpstr);
+ }
+ if (RFIFOL(fd,32) > 1)
+ printf(" Compteur: %d connexions.\n", (int)RFIFOL(fd,32));
+ else
+ printf(" Compteur: %d connexion.\n", (int)RFIFOL(fd,32));
+ printf(" Dernière connexion le: %s (ip: %s)\n", lastlogin, last_ip);
+ if (connect_until_time == 0) {
+ printf(" Limite de validité: illimité.\n");
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
+ printf(" Limite de validité: jusqu'au %s.\n", tmpstr);
+ }
+ } else {
+ if (ban_until_time == 0) {
+ printf(" Banishment: not banished.\n");
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
+ printf(" Banishment: until %s.\n", tmpstr);
+ }
+ if (RFIFOL(fd,32) > 1)
+ printf(" Count: %d connections.\n", (int)RFIFOL(fd,32));
+ else
+ printf(" Count: %d connection.\n", (int)RFIFOL(fd,32));
+ printf(" Last connection at: %s (ip: %s)\n", lastlogin, last_ip);
+ if (connect_until_time == 0) {
+ printf(" Validity limit: unlimited.\n");
+ } else {
+ char tmpstr[128];
+ strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
+ printf(" Validity limit: until %s.\n", tmpstr);
+ }
+ }
+ printf(" Memo: '%s'\n", memo);
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,150 + RFIFOW(fd,148));
+ break;
+
+ default:
+ printf("Remote administration has been disconnected (unknown packet).\n");
+ ladmin_log("'End of connection, unknown packet." RETCODE);
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ // if we don't wait new packets, do the prompt
+ prompt();
+
+ return 0;
+}
+
+//------------------------------------
+// Function to connect to login-server
+//------------------------------------
+int Connect_login_server(void) {
+ if (defaultlanguage == 'F') {
+ printf("Essai de connection au server de logins...\n");
+ ladmin_log("Essai de connection au server de logins..." RETCODE);
+ } else {
+ printf("Attempt to connect to login-server...\n");
+ ladmin_log("Attempt to connect to login-server..." RETCODE);
+ }
+
+ login_fd = make_connection(login_ip, loginserverport);
+ if (login_fd == -1)
+ { //Might not be the most elegant way to handle this, but I've never used ladmin so I dunno what else you could do. [Skotlex]
+ printf("Error: Failed to connect to Login Server\n");
+ exit(1);
+ }
+#ifdef PASSWORDENC
+ if (passenc == 0) {
+#endif
+ WFIFOHEAD(login_fd,28);
+ WFIFOW(login_fd,0) = 0x7918; // Request for administation login
+ WFIFOW(login_fd,2) = 0; // no encrypted
+ memcpy(WFIFOP(login_fd,4), loginserveradminpassword, 24);
+ WFIFOSET(login_fd,28);
+ bytes_to_read = 1;
+ if (defaultlanguage == 'F') {
+ printf("Envoi du mot de passe...\n");
+ ladmin_log("Envoi du mot de passe..." RETCODE);
+ } else {
+ printf("Sending of the password...\n");
+ ladmin_log("Sending of the password..." RETCODE);
+ }
+#ifdef PASSWORDENC
+ } else {
+ WFIFOHEAD(login_fd,2);
+ WFIFOW(login_fd,0) = 0x791a; // Sending request about the coding key
+ WFIFOSET(login_fd,2);
+ bytes_to_read = 1;
+ if (defaultlanguage == 'F') {
+ printf("Demande de la clef MD5...\n");
+ ladmin_log("Demande de la clef MD5..." RETCODE);
+ } else {
+ printf("Request about the MD5 key...\n");
+ ladmin_log("Request about the MD5 key..." RETCODE);
+ }
+ }
+#endif
+
+ return 0;
+}
+
+//-------------------------------------------------
+// Return numerical value of a switch configuration
+// on/off, english, français, deutsch, español
+//-------------------------------------------------
+int config_switch(const char *str) {
+ if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
+ return 1;
+ if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
+ return 0;
+
+ return atoi(str);
+}
+
+//-----------------------------------
+// Reading general configuration file
+//-----------------------------------
+int ladmin_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp = fopen(cfgName, "r");
+ if (fp == NULL) {
+ if (defaultlanguage == 'F') {
+ printf("\033[0mFichier de configuration (%s) non trouvé.\n", cfgName);
+ } else {
+ printf("\033[0mConfiguration file (%s) not found.\n", cfgName);
+ }
+ return 1;
+ }
+
+ if (defaultlanguage == 'F') {
+ printf("\033[0m---Début de lecture du fichier de configuration Ladmin (%s)\n", cfgName);
+ } else {
+ printf("\033[0m---Start reading of Ladmin configuration file (%s)\n", cfgName);
+ }
+ while(fgets(line, sizeof(line)-1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
+ remove_control_chars((unsigned char *) w1);
+ remove_control_chars((unsigned char *) w2);
+
+ if(strcmpi(w1,"login_ip")==0){
+ struct hostent *h = gethostbyname (w2);
+ if (h != NULL) {
+ if (defaultlanguage == 'F') {
+ printf("Adresse du serveur de logins: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
+ } else {
+ printf("Login server IP address: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
+ }
+ sprintf(loginserverip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
+ } else
+ memcpy(loginserverip, w2, 16);
+ } else if (strcmpi(w1, "login_port") == 0) {
+ loginserverport = atoi(w2);
+ } else if (strcmpi(w1, "admin_pass") == 0) {
+ strncpy(loginserveradminpassword, w2, sizeof(loginserveradminpassword));
+ loginserveradminpassword[sizeof(loginserveradminpassword)-1] = '\0';
+#ifdef PASSWORDENC
+ } else if (strcmpi(w1, "passenc") == 0) {
+ passenc = atoi(w2);
+ if (passenc < 0 || passenc > 2)
+ passenc = 0;
+#endif
+ } else if (strcmpi(w1, "defaultlanguage") == 0) {
+ if (w2[0] == 'F' || w2[0] == 'E')
+ defaultlanguage = w2[0];
+ } else if (strcmpi(w1, "ladmin_log_filename") == 0) {
+ strncpy(ladmin_log_filename, w2, sizeof(ladmin_log_filename));
+ ladmin_log_filename[sizeof(ladmin_log_filename)-1] = '\0';
+ } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
+ switch (atoi(w2)) {
+ case 0:
+ strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
+ break;
+ case 1:
+ strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
+ break;
+ case 2:
+ strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
+ break;
+ case 3:
+ strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
+ break;
+ }
+ } else if (strcmpi(w1, "import") == 0) {
+ ladmin_config_read(w2);
+ }
+ }
+ }
+ fclose(fp);
+
+ login_ip = inet_addr(loginserverip);
+
+ if (defaultlanguage == 'F') {
+ printf("---Lecture du fichier de configuration Ladmin terminée.\n");
+ } else {
+ printf("---End reading of Ladmin configuration file.\n");
+ }
+
+ return 0;
+}
+
+//--------------------------------------
+// Function called at exit of the server
+//--------------------------------------
+void do_final(void) {
+
+ if (already_exit_function == 0) {
+ delete_session(login_fd);
+
+ if (defaultlanguage == 'F') {
+ printf("\033[0m----Fin de Ladmin (fin normale avec fermeture de tous les fichiers).\n");
+ ladmin_log("----Fin de Ladmin (fin normale avec fermeture de tous les fichiers)." RETCODE);
+ } else {
+ printf("\033[0m----End of Ladmin (normal end with closing of all files).\n");
+ ladmin_log("----End of Ladmin (normal end with closing of all files)." RETCODE);
+ }
+
+ already_exit_function = 1;
+ }
+}
+
+//------------------------
+// Main function of ladmin
+//------------------------
+int do_init(int argc, char **argv)
+{
+ int next;
+ socket_init();
+
+ // read ladmin configuration
+ ladmin_config_read((argc > 1) ? argv[1] : LADMIN_CONF_NAME);
+
+ ladmin_log("");
+ if (defaultlanguage == 'F') {
+ ladmin_log("Fichier de configuration lu." RETCODE);
+ } else {
+ ladmin_log("Configuration file readed." RETCODE);
+ }
+
+ srand(time(NULL));
+
+ set_defaultparse(parse_fromlogin);
+
+ if (defaultlanguage == 'F') {
+ printf("Outil d'administration à distance de eAthena.\n");
+ printf("(pour eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
+ } else {
+ printf("EAthena login-server administration tool.\n");
+ printf("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
+ }
+
+ if (defaultlanguage == 'F') {
+ ladmin_log("Ladmin est prêt." RETCODE);
+ printf("Ladmin est \033[1;32mprêt\033[0m.\n\n");
+ } else {
+ ladmin_log("Ladmin is ready." RETCODE);
+ printf("Ladmin is \033[1;32mready\033[0m.\n\n");
+ }
+
+ Connect_login_server();
+
+ // minimalist core doesn't have sockets parsing,
+ // so we have to do this ourselves
+ while (runflag) {
+ next = do_timer(gettick_nocache());
+ do_sendrecv(next);
+#ifndef TURBO
+ do_parsepacket();
+#endif
+ }
+
+ return 0;
+}
diff --git a/src/ladmin/ladmin.h b/src/ladmin/ladmin.h
index 5a1e8311a..64a67146e 100644
--- a/src/ladmin/ladmin.h
+++ b/src/ladmin/ladmin.h
@@ -1,13 +1,13 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _LADMIN_H_
-#define _LADMIN_H_
-
-#define LADMIN_CONF_NAME "conf/ladmin_athena.conf"
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-
-#endif
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _LADMIN_H_
+#define _LADMIN_H_
+
+#define LADMIN_CONF_NAME "conf/ladmin_athena.conf"
+#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
+ // It is 1 at the time of passwordencrypt.
+ // It is made into 2 at the time of passwordencrypt2.
+ // When it is made 3, it corresponds to both.
+
+#endif
diff --git a/src/ladmin/md5calc.c b/src/ladmin/md5calc.c
index f0acb4679..b50071ee3 100644
--- a/src/ladmin/md5calc.c
+++ b/src/ladmin/md5calc.c
@@ -1,239 +1,239 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+/***********************************************************
+ * md5 calculation algorithm
+ *
+ * The source code referred to the following URL.
+ * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
+ *
+ ***********************************************************/
+
+#include "md5calc.h"
+#include <string.h>
+#include <stdio.h>
+
+#ifndef UINT_MAX
+#define UINT_MAX 4294967295U
+#endif
+
+// Global variable
+static unsigned int *pX;
+
+// Stirng Table
+static const unsigned int T[] = {
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
+ 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
+};
+
+// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+// The function used for other calculation
+static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Y) | (~X & Z);
+}
+static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Z) | (Y & ~Z);
+}
+static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return X ^ Y ^ Z;
+}
+static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return Y ^ (X | ~Z);
+}
+
+static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
+ unsigned int k, unsigned int s, unsigned int i)
+{
+ return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
+}
+
+static void Round1(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, F(b,c,d), k, s, i);
+}
+static void Round2(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, G(b,c,d), k, s, i);
+}
+static void Round3(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, H(b,c,d), k, s, i);
+}
+static void Round4(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, I(b,c,d), k, s, i);
+}
+
+static void MD5_Round_Calculate(const unsigned char *block,
+ unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
+{
+ //create X It is since it is required.
+ unsigned int X[16]; //512bit 64byte
+ int j,k;
+
+ //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
+ unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
+ unsigned int AA = A,BB = B,CC = C,DD = D;
+
+ //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
+ pX = X;
+
+ //Copy block(padding_message) i into X
+ for (j=0,k=0; j<64; j+=4,k++)
+ X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
+ | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
+ | ( ((unsigned int )block[j+2]) << 16 )
+ | ( ((unsigned int )block[j+3]) << 24 );
+
+
+ //Round 1
+ Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
+ Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
+ Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
+ Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
+
+ //Round 2
+ Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
+ Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
+ Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
+ Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
+
+ //Round 3
+ Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
+ Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
+ Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
+ Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
+
+ //Round 4
+ Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
+ Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
+ Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
+ Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
+
+ // Then perform the following additions. (let's add)
+ *A2 = A + AA;
+ *B2 = B + BB;
+ *C2 = C + CC;
+ *D2 = D + DD;
+
+ //The clearance of confidential information
+ memset(pX, 0, sizeof(X));
+}
+
+//-------------------------------------------------------------------
+// The function for the exteriors
+
+/** output is the coded binary in the character sequence which wants to code string. */
+void MD5_String2binary(const char * string, char * output)
+{
+//var
+ /*8bit*/
+ unsigned char padding_message[64]; //Extended message 512bit 64byte
+ unsigned char *pstring; //The position of string in the present scanning notes is held.
+
+// unsigned char digest[16];
+ /*32bit*/
+ unsigned int string_byte_len, //The byte chief of string is held.
+ string_bit_len, //The bit length of string is held.
+ copy_len, //The number of bytes which is used by 1-3 and which remained
+ msg_digest[4]; //Message digest 128bit 4byte
+ unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
+ *B = &msg_digest[1],
+ *C = &msg_digest[2],
+ *D = &msg_digest[3];
+ int i;
+
+//prog
+ //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
+ *A = 0x67452301;
+ *B = 0xefcdab89;
+ *C = 0x98badcfe;
+ *D = 0x10325476;
+
+ //Step 1.Append Padding Bits (extension of a mark bit)
+ //1-1
+ string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
+ pstring = (unsigned char *)string; //The position of the present character sequence is set.
+
+ //1-2 Repeat calculation until length becomes less than 64 bytes.
+ for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
+ MD5_Round_Calculate(pstring, A,B,C,D);
+
+ //1-3
+ copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
+ strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
+ memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
+ padding_message[copy_len] |= 0x80; //The next of a message is 1.
+
+ //1-4
+ //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
+ if (56 <= copy_len) {
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+ memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
+ }
+
+
+ //Step 2.Append Length (the information on length is added)
+ string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
+ memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
+
+ //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
+ if (UINT_MAX / 8 < string_byte_len) {
+ unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
+ memcpy(&padding_message[60], &high, 4);
+ } else
+ memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
+
+ //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+
+
+ //Step 5.Output (output)
+ memcpy(output,msg_digest,16);
+// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
+/* sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);*/
+}
+
+/** output is the coded character sequence in the character sequence which wants to code string. */
+void MD5_String(const char * string, char * output)
+{
+ unsigned char digest[16];
+
+ MD5_String2binary(string,(char*)digest);
+ sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);
+}
+
diff --git a/src/ladmin/md5calc.h b/src/ladmin/md5calc.h
index 1c42b16d9..ad46af760 100644
--- a/src/ladmin/md5calc.h
+++ b/src/ladmin/md5calc.h
@@ -1,10 +1,10 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _MD5CALC_H_
+#define _MD5CALC_H_
+
+void MD5_String(const char * string, char * output);
+void MD5_String2binary(const char * string, char * output);
+
+#endif
diff --git a/src/login/login.c b/src/login/login.c
index 4582a9c00..e30b44f3e 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1,4198 +1,4198 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// new version of the login-server by [Yor]
-
-#include <sys/types.h>
-#ifdef __WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/malloc.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-#include "login.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-in_addr_t bind_ip= 0;
-char bind_ip_str[128];
-int login_port = 6900;
-
-// Advanced subnet check [LuzZza]
-struct _subnet {
- long subnet;
- long mask;
- long char_ip;
- long map_ip;
-} subnet[16];
-
-int subnet_count = 0;
-
-int use_dnsbl=0; // [Zido]
-char dnsbl_servs[1024]; // [Zido]
-
-char account_filename[1024] = "save/account.txt";
-char GM_account_filename[1024] = "conf/GM_account.txt";
-char login_log_filename[1024] = "log/login.log";
-FILE *log_fp = NULL;
-char login_log_unknown_packets_filename[1024] = "log/login_unknown_packets.log";
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-int save_unknown_packets = 0;
-long creation_time_GM_account_file;
-int gm_account_filename_check_timer = 15; // Timer to check if GM_account file has been changed and reload GM account automaticaly (in seconds; default: 15)
-
-int log_login = 1;
-
-int display_parse_login = 0; // 0: no, 1: yes
-int display_parse_admin = 0; // 0: no, 1: yes
-int display_parse_fromchar = 0; // 0: no, 1: yes (without packet 0x2714), 2: all packets
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-int login_fd;
-
-static int online_check=1; //When set to 1, login server rejects incoming players that are already registered as online. [Skotlex]
-//Account flood protection [Kevin]
-unsigned int new_reg_tick=0;
-int allowed_regs=1;
-int num_regs=0;
-int time_allowed=10; //Init this to 10 seconds. [Skotlex]
-
-enum {
- ACO_DENY_ALLOW = 0,
- ACO_ALLOW_DENY,
- ACO_MUTUAL_FAILTURE,
- ACO_STRSIZE = 128,
-};
-
-int access_order = ACO_DENY_ALLOW;
-int access_allownum = 0;
-int access_denynum = 0;
-char *access_allow = NULL;
-char *access_deny = NULL;
-
-int access_ladmin_allownum = 0;
-char *access_ladmin_allow = NULL;
-
-int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
-int add_to_unlimited_account = 0; // Give possibility or not to adjust (ladmin command: timeadd) the time of an unlimited account.
-int start_limited_time = -1; // Starting additional sec from now for the limited time at creation of accounts (-1: unlimited time, 0 or more: additional sec from now)
-int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-
-int check_client_version = 0; //Client version check ON/OFF .. (sirius)
-int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
-static int ip_sync_interval = 0;
-
-
-struct login_session_data {
- unsigned int md5keylen;
- char md5key[20];
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, login_id1, login_id2;
- int ip, sex, delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-struct online_login_data {
- int account_id;
- short char_server;
- short waiting_disconnect;
-};
-
-struct auth_dat {
- int account_id, sex;
- char userid[24], pass[33], lastlogin[24]; // 33 for 32 + NULL terminated
- int logincount;
- int state; // packet 0x006a value + 1 (0: compte OK)
- char email[40]; // e-mail (by default: a@a.com)
- char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a)
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- char last_ip[16]; // save of last IP of connection
- char memo[255]; // a memo field
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-} *auth_dat = NULL;
-
-unsigned int auth_num = 0, auth_max = 0;
-
-// define the number of times that some players must authentify them before to save account file.
-// it's just about normal authentification. If an account is created or modified, save is immediatly done.
-// An authentification just change last connected IP and date. It already save in log file.
-// set minimum auth change before save:
-#define AUTH_BEFORE_SAVE_FILE 10
-// set divider of auth_num to found number of change before save
-#define AUTH_SAVE_FILE_DIVIDER 50
-int auth_before_save_file = 0; // Counter. First save when 1st char-server do connection.
-
-int admin_state = 0;
-char admin_pass[24] = "";
-unsigned int GM_num;
-unsigned int GM_max=256;
-char gm_pass[64] = "";
-int level_new_gm = 60;
-
-struct gm_account *gm_account_db;
-
-static struct dbt *online_db;
-
-int dynamic_pass_failure_ban = 1;
-int dynamic_pass_failure_ban_time = 5;
-int dynamic_pass_failure_ban_how_many = 3;
-int dynamic_pass_failure_ban_how_long = 1;
-
-int use_md5_passwds = 0;
-
-int console = 0;
-
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len);
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int login_log(char *fmt, ...) {
- if (log_login) {
- va_list ap;
- time_t raw_time;
- char tmpstr[2048];
-
- if(!log_fp)
- log_fp = fopen(login_log_filename, "a");
-
- if (log_fp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(log_fp, RETCODE);
- else {
- va_start(ap, fmt);
- // Platform/Compiler dependant clock() for time check is removed. [Lance]
- // clock() is originally used to track processing ticks on program execution.
- time(&raw_time);
- strftime(tmpstr, 24, date_format, localtime(&raw_time));
- sprintf(tmpstr + strlen(tmpstr), ": %s", fmt);
- vfprintf(log_fp, tmpstr, ap);
- va_end(ap);
- }
- fflush(log_fp); // under cygwin or windows, if software is stopped, data are not written in the file -> fflush at every line
- }
- }
-
- return 0;
-}
-
-static void* create_online_user(DBKey key, va_list args) {
- struct online_login_data *p;
- p = aCalloc(1, sizeof(struct online_login_data));
- p->account_id = key.i;
- p->char_server = -1;
- return p;
-}
-//-----------------------------------------------------
-// Online User Database [Wizputer]
-//-----------------------------------------------------
-
-void add_online_user (int char_server, int account_id) {
- struct online_login_data *p;
- if (!online_check)
- return;
- p = idb_ensure(online_db, account_id, create_online_user);
- p->char_server = char_server;
- p->waiting_disconnect = 0;
-}
-int is_user_online (int account_id) {
- return (idb_get(online_db, account_id) != NULL);
-}
-void remove_online_user (int account_id) {
- if(!online_check)
- return;
- if (account_id == 99) { // reset all to offline
- online_db->clear(online_db, NULL); // purge db
- return;
- }
- idb_remove(online_db,account_id);
-}
-
-int waiting_disconnect_timer(int tid, unsigned int tick, int id, int data)
-{
- struct online_login_data *p;
- if ((p= idb_get(online_db, id)) != NULL && p->waiting_disconnect)
- remove_online_user(p->account_id);
- return 0;
-}
-
-static int sync_ip_addresses(int tid, unsigned int tick, int id, int data){
- unsigned char buf[2];
- ShowInfo("IP Sync in progress...\n");
- WBUFW(buf,0) = 0x2735;
- charif_sendallwos(-1, buf, 2);
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-int isGM(int account_id) {
- unsigned int i;
- for(i=0; i < GM_num; i++)
- if(gm_account_db[i].account_id == account_id)
- return gm_account_db[i].level;
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Adds a new GM using acc id and level
-//----------------------------------------------------------------------
-void addGM(int account_id, int level) {
- unsigned int i;
- int do_add = 0;
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id==account_id) {
- do_add = 1;
- break;
- }
- }
- for(i = 0; i < GM_num; i++)
- if (gm_account_db[i].account_id == account_id) {
- if (gm_account_db[i].level == level)
- ShowWarning("addGM: GM account %d defined twice (same level: %d).\n", account_id, level);
- else {
- ShowWarning("addGM: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
- gm_account_db[i].level = level;
- }
- return;
- }
-
- // if new account
- if (i == GM_num && do_add) {
- if (GM_num >= GM_max) {
- GM_max += 256;
- gm_account_db = (struct gm_account*)aRealloc(gm_account_db, sizeof(struct gm_account) * GM_max);
- memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256);
- }
- gm_account_db[GM_num].account_id = account_id;
- gm_account_db[GM_num].level = level;
- GM_num++;
- if (GM_num >= 4000) {
- ShowWarning("4000 GM accounts found. Next GM accounts are not read.\n");
- login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not read." RETCODE);
- }
- }
-}
-
-//-------------------------------------------------------
-// Reading function of GM accounts file (and their level)
-//-------------------------------------------------------
-int read_gm_account(void) {
- char line[512];
- FILE *fp;
- int account_id, level;
- int line_counter;
- struct stat file_stat;
- int start_range = 0, end_range = 0, is_range = 0, current_id = 0;
-
- if(gm_account_db) aFree(gm_account_db);
- GM_num = 0;
- if(GM_max < 0) GM_max = 256;
- gm_account_db = (struct gm_account*)aCalloc(GM_max, sizeof(struct gm_account));
-
- // get last modify time/date
- if (stat(GM_account_filename, &file_stat))
- creation_time_GM_account_file = 0; // error
- else
- creation_time_GM_account_file = (long)file_stat.st_mtime;
-
- if ((fp = fopen(GM_account_filename, "r")) == NULL) {
- ShowError("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename);
- ShowError(" Actually, there is no GM accounts on the server.\n");
- login_log("read_gm_account: GM accounts file [%s] not found." RETCODE, GM_account_filename);
- login_log(" Actually, there is no GM accounts on the server." RETCODE);
- return 1;
- }
-
- line_counter = 0;
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- while(fgets(line, sizeof(line)-1, fp) && GM_num < 4000) {
- line_counter++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
- continue;
- is_range = (sscanf(line, "%d%*[-~]%d %d",&start_range,&end_range,&level)==3); // ID Range [MC Cameri]
- if (!is_range && sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
- ShowError("read_gm_account: file [%s], invalid 'acount_id|range level' format (line #%d).\n", GM_account_filename, line_counter);
- else if (level <= 0)
- ShowError("read_gm_account: file [%s] %dth account (line #%d) (invalid level [0 or negative]: %d).\n", GM_account_filename, GM_num+1, line_counter, level);
- else {
- if (level > 99) {
- ShowNotice("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
- level = 99;
- }
- if (is_range) {
- if (start_range==end_range)
- ShowError("read_gm_account: file [%s] invalid range, beginning of range is equal to end of range (line #%d).\n", GM_account_filename, line_counter);
- else if (start_range>end_range)
- ShowError("read_gm_account: file [%s] invalid range, beginning of range must be lower than end of range (line #%d).\n", GM_account_filename, line_counter);
- else
- for (current_id = start_range;current_id<=end_range;current_id++)
- addGM(current_id,level);
- } else {
- addGM(account_id,level);
- }
- }
- }
- fclose(fp);
-
- ShowStatus("read_gm_account: file '%s' read (%d GM accounts found).\n", GM_account_filename, GM_num);
- login_log("read_gm_account: file '%s' read (%d GM accounts found)." RETCODE, GM_account_filename, GM_num);
-
- return 0;
-}
-
-//--------------------------------------------------------------
-// Test of the IP mask
-// (ip: IP to be tested, str: mask x.x.x.x/# or x.x.x.x/y.y.y.y)
-//--------------------------------------------------------------
-int check_ipmask(unsigned int ip, const unsigned char *str) {
- unsigned int mask = 0, i = 0, m, ip2, a0, a1, a2, a3;
- unsigned char *p = (unsigned char *)&ip2, *p2 = (unsigned char *)&mask;
-
- if (sscanf((const char*)str, "%d.%d.%d.%d/%n", &a0, &a1, &a2, &a3, &i) != 4 || i == 0)
- return 0;
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
-
- if (sscanf((const char*)str+i, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) == 4) {
- p2[0] = a0; p2[1] = a1; p2[2] = a2; p2[3] = a3;
- mask = ntohl(mask);
- } else if (sscanf((const char*)(str+i), "%d", &m) == 1 && m >= 0 && m <= 32) {
- for(i = 0; i < m && i < 32; i++)
- mask = (mask >> 1) | 0x80000000;
- } else {
- ShowError("check_ipmask: invalid mask [%s].\n", str);
- return 0;
- }
-
-// printf("Tested IP: %08x, network: %08x, network mask: %08x\n",
-// (unsigned int)ntohl(ip), (unsigned int)ntohl(ip2), (unsigned int)mask);
- return ((ntohl(ip) & mask) == (ntohl(ip2) & mask));
-}
-
-//---------------------
-// Access control by IP
-//---------------------
-int check_ip(unsigned int ip) {
- int i;
- unsigned char *p = (unsigned char *)&ip;
- char buf[20];
- char * access_ip;
- enum { ACF_DEF, ACF_ALLOW, ACF_DENY } flag = ACF_DEF;
-
- if (access_allownum == 0 && access_denynum == 0)
- return 1; // When there is no restriction, all IP are authorised.
-
-// + 012.345.: front match form, or
-// all: all IP are matched, or
-// 012.345.678.901/24: network form (mask with # of bits), or
-// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
-// + Note about the DNS resolution (like www.ne.jp, etc.):
-// There is no guarantee to have an answer.
-// If we have an answer, there is no guarantee to have a 100% correct value.
-// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
-// So, DNS notation isn't authorised for ip checking.
- sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
-
- for(i = 0; i < access_allownum; i++) {
- access_ip = access_allow + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- if(access_order == ACO_ALLOW_DENY)
- return 1; // With 'allow, deny' (deny if not allow), allow has priority
- flag = ACF_ALLOW;
- break;
- }
- }
-
- for(i = 0; i < access_denynum; i++) {
- access_ip = access_deny + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- //flag = ACF_DENY; // not necessary to define flag
- return 0; // At this point, if it's 'deny', we refuse connection.
- }
- }
-
- return (flag == ACF_ALLOW || access_order == ACO_DENY_ALLOW) ? 1:0;
- // With 'mutual-failture', only 'allow' and non 'deny' IP are authorised.
- // A non 'allow' (even non 'deny') IP is not authorised. It's like: if allowed and not denied, it's authorised.
- // So, it's disapproval if you have no description at the time of 'mutual-failture'.
- // With 'deny,allow' (allow if not deny), because here it's not deny, we authorise.
-}
-
-//--------------------------------
-// Access control by IP for ladmin
-//--------------------------------
-int check_ladminip(unsigned int ip) {
- int i;
- unsigned char *p = (unsigned char *)&ip;
- char buf[20];
- char * access_ip;
-
- if (access_ladmin_allownum == 0)
- return 1; // When there is no restriction, all IP are authorised.
-
-// + 012.345.: front match form, or
-// all: all IP are matched, or
-// 012.345.678.901/24: network form (mask with # of bits), or
-// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
-// + Note about the DNS resolution (like www.ne.jp, etc.):
-// There is no guarantee to have an answer.
-// If we have an answer, there is no guarantee to have a 100% correct value.
-// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
-// So, DNS notation isn't authorised for ip checking.
- sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
-
- for(i = 0; i < access_ladmin_allownum; i++) {
- access_ip = access_ladmin_allow + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- return 1;
- }
- }
-
- return 0;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++)
- if (strchr(last_arobas, ch) != NULL)
- return 0;
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//-----------------------------------------------
-// Search an account id
-// (return account index or -1 (if not found))
-// If exact account name is not found,
-// the function checks without case sensitive
-// and returns index if only 1 account is found
-// and similar to the searched name.
-//-----------------------------------------------
-int search_account_index(char* account_name) {
- unsigned int i, quantity;
- int index;
-
- quantity = 0;
- index = -1;
-
- for(i = 0; i < auth_num; i++) {
- // Without case sensitive check (increase the number of similar account names found)
- if (stricmp(auth_dat[i].userid, account_name) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(auth_dat[i].userid, account_name) == 0)
- return i;
- quantity++;
- index = i;
- }
- }
- // Here, the exact account name is not found
- // We return the found index of a similar account ONLY if there is 1 similar account
- if (quantity == 1)
- return index;
-
- // Exact account name is not found and 0 or more than 1 similar accounts have been found ==> we say not found
- return -1;
-}
-
-//--------------------------------------------------------
-// Create a string to save the account in the account file
-//--------------------------------------------------------
-int mmo_auth_tostr(char *str, struct auth_dat *p) {
- int i;
- char *str_p = str;
-
- str_p += sprintf(str_p, "%d\t%s\t%s\t%s\t%c\t%d\t%d\t"
- "%s\t%s\t%ld\t%s\t%s\t%ld\t",
- p->account_id, p->userid, p->pass, p->lastlogin,
- (p->sex == 2) ? 'S' : (p->sex ? 'M' : 'F'),
- p->logincount, p->state,
- p->email, p->error_message,
- (long)p->connect_until_time, p->last_ip, p->memo, (long)p->ban_until_time);
-
- for(i = 0; i < p->account_reg2_num; i++)
- if (p->account_reg2[i].str[0])
- str_p += sprintf(str_p, "%s,%s ", p->account_reg2[i].str, p->account_reg2[i].value);
-
- return 0;
-}
-
-//---------------------------------
-// Reading of the accounts database
-//---------------------------------
-int mmo_auth_init(void) {
- FILE *fp;
- int account_id, logincount, state, n, i;
- unsigned int j;
- char line[2048], *p, userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
- long ban_until_time;
- long connect_until_time;
- char str[2048];
- char v[2048];
- int GM_count = 0;
- int server_count = 0;
-
- auth_max = 256;
- auth_dat = (struct auth_dat*)aCalloc(auth_max, sizeof(struct auth_dat));
-
- if ((fp = fopen(account_filename, "r")) == NULL) {
- // no account file -> no account -> no login, including char-server (ERROR)
- ShowError(CL_RED"mmmo_auth_init: Accounts file [%s] not found."CL_RESET"\n", account_filename);
- return 0;
- }
-
- while(fgets(line, sizeof(line)-1, fp) != NULL) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
- // remove carriage return if exist
- while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
- line[strlen(line)-1] = '\0';
- p = line;
-
- memset(userid, 0, sizeof(userid));
- memset(pass, 0, sizeof(pass));
- memset(lastlogin, 0, sizeof(lastlogin));
- memset(email, 0, sizeof(email));
- memset(error_message, 0, sizeof(error_message));
- memset(last_ip, 0, sizeof(last_ip));
- memset(memo, 0, sizeof(memo));
-
- // database version reading (v2)
- if (((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n)) == 13 && line[n] == '\t') ||
- ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &n)) == 12 && line[n] == '\t')) {
- n = n + 1;
-
- // Some checks
- if (account_id > END_ACCOUNT_NUM) {
- ShowError(CL_RED"mmmo_auth_init: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- ShowError(" account id #%d -> account not read (saved in log file)."CL_RESET"\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
- login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- continue;
- }
- userid[23] = '\0';
- remove_control_chars((unsigned char *)userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- ShowError(CL_RED"mmmo_auth_init: an account has an identical id to another.\n");
- ShowError(" account id #%d -> new account not read (saved in log file)."CL_RED"\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- } else if (strcmp(auth_dat[j].userid, userid) == 0) {
- ShowError(CL_RED"mmmo_auth_init: account name already exists.\n");
- ShowError(" account name '%s' -> new account not read (saved in log file)."CL_RESET"\n", userid); // 2 lines, account name can be long.
- login_log("mmmo_auth_init: ******Error: an account has an identical name to another." RETCODE);
- login_log(" account name '%s' -> new account not read (saved in next line):" RETCODE, userid);
- login_log("%s", line);
- break;
- }
- }
- if (j != auth_num)
- continue;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
-
- auth_dat[auth_num].account_id = account_id;
-
- strncpy(auth_dat[auth_num].userid, userid, 24);
-
- pass[23] = '\0';
- remove_control_chars((unsigned char *)pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars((unsigned char *)lastlogin);
- strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
-
- auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
-
- if (logincount >= 0)
- auth_dat[auth_num].logincount = logincount;
- else
- auth_dat[auth_num].logincount = 0;
-
- if (state > 255)
- auth_dat[auth_num].state = 100;
- else if (state < 0)
- auth_dat[auth_num].state = 0;
- else
- auth_dat[auth_num].state = state;
-
- if (e_mail_check(email) == 0) {
- ShowNotice("Account %s (%d): invalid e-mail (replaced par a@a.com).\n", auth_dat[auth_num].userid, auth_dat[auth_num].account_id);
- strncpy(auth_dat[auth_num].email, "a@a.com", 40);
- } else {
- remove_control_chars((unsigned char *)email);
- strncpy(auth_dat[auth_num].email, email, 40);
- }
-
- error_message[19] = '\0';
- remove_control_chars((unsigned char *)error_message);
- if (error_message[0] == '\0' || state != 7) { // 7, because state is packet 0x006a value + 1
- strncpy(auth_dat[auth_num].error_message, "-", 20);
- } else {
- strncpy(auth_dat[auth_num].error_message, error_message, 20);
- }
-
- if (i == 13)
- auth_dat[auth_num].ban_until_time = (time_t)ban_until_time;
- else
- auth_dat[auth_num].ban_until_time = 0;
-
- auth_dat[auth_num].connect_until_time = (time_t)connect_until_time;
-
- last_ip[15] = '\0';
- remove_control_chars((unsigned char *)last_ip);
- strncpy(auth_dat[auth_num].last_ip, last_ip, 16);
-
- memo[254] = '\0';
- remove_control_chars((unsigned char *)memo);
- strncpy(auth_dat[auth_num].memo, memo, 255);
-
- for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
- p += n;
- if (sscanf(p, "%[^\t,],%[^\t ] %n", str, v, &n) != 2) {
- // We must check if a str is void. If it's, we can continue to read other REG2.
- // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
- if (p[0] == ',' && sscanf(p, ",%[^\t ] %n", v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars((unsigned char *)str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- strncpy(auth_dat[auth_num].account_reg2[j].value,v,256);
- }
- auth_dat[auth_num].account_reg2_num = j;
-
- if (isGM(account_id) > 0)
- GM_count++;
- if (auth_dat[auth_num].sex == 2)
- server_count++;
-
- auth_num++;
- if (account_id >= account_id_count)
- account_id_count = account_id + 1;
-
- // Old athena database version reading (v1)
- } else if ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state, &n)) >= 5) {
- if (account_id > END_ACCOUNT_NUM) {
- ShowError(CL_RED"mmmo_auth_init: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- ShowError(" account id #%d -> account not read (saved in log file)."CL_RESET"\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
- login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- continue;
- }
- userid[23] = '\0';
- remove_control_chars((unsigned char *)userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- ShowError(CL_RED"mmo_auth_init: an account has an identical id to another.\n");
- ShowError(" account id #%d -> new account not read (saved in log file)."CL_RESET"\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- } else if (strcmp(auth_dat[j].userid, userid) == 0) {
- ShowError(CL_RED"mmo_auth_init: account name already exists.\n");
- ShowError(" account name '%s' -> new account not read (saved in log file)."CL_RESET"\n", userid);
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- }
- }
- if (j != auth_num)
- continue;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
-
- auth_dat[auth_num].account_id = account_id;
-
- strncpy(auth_dat[auth_num].userid, userid, 24);
-
- pass[23] = '\0';
- remove_control_chars((unsigned char *)pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars((unsigned char *)lastlogin);
- strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
-
- auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
-
- if (i >= 6) {
- if (logincount >= 0)
- auth_dat[auth_num].logincount = logincount;
- else
- auth_dat[auth_num].logincount = 0;
- } else
- auth_dat[auth_num].logincount = 0;
-
- if (i >= 7) {
- if (state > 255)
- auth_dat[auth_num].state = 100;
- else if (state < 0)
- auth_dat[auth_num].state = 0;
- else
- auth_dat[auth_num].state = state;
- } else
- auth_dat[auth_num].state = 0;
-
- // Initialization of new data
- strncpy(auth_dat[auth_num].email, "a@a.com", 40);
- strncpy(auth_dat[auth_num].error_message, "-", 20);
- auth_dat[auth_num].ban_until_time = 0;
- auth_dat[auth_num].connect_until_time = 0;
- strncpy(auth_dat[auth_num].last_ip, "-", 16);
- strncpy(auth_dat[auth_num].memo, "-", 255);
-
- for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
- p += n;
- if (sscanf(p, "%[^\t,],%[^\t ] %n", str, v, &n) != 2) {
- // We must check if a str is void. If it's, we can continue to read other REG2.
- // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
- if (p[0] == ',' && sscanf(p, ",%[^\t ] %n", v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars((unsigned char *)str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- strncpy(auth_dat[auth_num].account_reg2[j].value,v,256);
- }
- auth_dat[auth_num].account_reg2_num = j;
-
- if (isGM(account_id) > 0)
- GM_count++;
- if (auth_dat[auth_num].sex == 2)
- server_count++;
-
- auth_num++;
- if (account_id >= account_id_count)
- account_id_count = account_id + 1;
-
- } else {
- i = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &account_id, &i) == 1 &&
- i > 0 && account_id > account_id_count)
- account_id_count = account_id;
- }
- }
- fclose(fp);
-
- if (auth_num == 0) {
- ShowNotice("mmo_auth_init: No account found in %s.\n", account_filename);
- sprintf(line, "No account found in %s.", account_filename);
- } else {
- if (auth_num == 1) {
- ShowStatus("mmo_auth_init: 1 account read in %s,\n", account_filename);
- sprintf(line, "1 account read in %s,", account_filename);
- } else {
- ShowStatus("mmo_auth_init: %d accounts read in %s,\n", auth_num, account_filename);
- sprintf(line, "%d accounts read in %s,", auth_num, account_filename);
- }
- if (GM_count == 0) {
- ShowStatus(" of which is no GM account, and ");
- sprintf(str, "%s of which is no GM account and", line);
- } else if (GM_count == 1) {
- ShowStatus(" of which is 1 GM account, and ");
- sprintf(str, "%s of which is 1 GM account and", line);
- } else {
- ShowStatus(" of which is %d GM accounts, and ", GM_count);
- sprintf(str, "%s of which is %d GM accounts and", line, GM_count);
- }
- if (server_count == 0) {
- printf("no server account ('S').\n");
- sprintf(line, "%s no server account ('S').", str);
- } else if (server_count == 1) {
- printf("1 server account ('S').\n");
- sprintf(line, "%s 1 server account ('S').", str);
- } else {
- printf("%d server accounts ('S').\n", server_count);
- sprintf(line, "%s %d server accounts ('S').", str, server_count);
- }
- }
- login_log("%s" RETCODE, line);
-
- return 0;
-}
-
-//------------------------------------------
-// Writing of the accounts database file
-// (accounts are sorted by id before save)
-//------------------------------------------
-void mmo_auth_sync(void) {
- FILE *fp;
- unsigned int i, j, k;
- int lock;
- int account_id;
- //int id[auth_num];
- //int *id = (int *)aCalloc(auth_num, sizeof(int));
- CREATE_BUFFER(id, int, auth_num);
- char line[65536];
-
- // Sorting before save
- for(i = 0; i < auth_num; i++) {
- id[i] = i;
- account_id = auth_dat[i].account_id;
- for(j = 0; j < i; j++) {
- if (account_id < auth_dat[id[j]].account_id) {
- for(k = i; k > j; k--)
- id[k] = id[k-1];
- id[j] = i; // id[i]
- break;
- }
- }
- }
-
- // Data save
- if ((fp = lock_fopen(account_filename, &lock)) == NULL) {
- //if (id) aFree(id); // aFree, right?
- DELETE_BUFFER(id);
- return;
- }
-
- fprintf(fp, "// Accounts file: here are saved all information about the accounts.\n");
- fprintf(fp, "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n");
- fprintf(fp, "// Some explanations:\n");
- fprintf(fp, "// account name : between 4 to 23 char for a normal account (standard client can't send less than 4 char).\n");
- fprintf(fp, "// account password: between 4 to 23 char\n");
- fprintf(fp, "// sex : M or F for normal accounts, S for server accounts\n");
- fprintf(fp, "// state : 0: account is ok, 1 to 256: error code of packet 0x006a + 1\n");
- fprintf(fp, "// email : between 3 to 39 char (a@a.com is like no email)\n");
- fprintf(fp, "// error message : text for the state 7: 'Your are Prohibited to login until <text>'. Max 19 char\n");
- fprintf(fp, "// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
- fprintf(fp, "// memo field : max 254 char\n");
- fprintf(fp, "// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
- for(i = 0; i < auth_num; i++) {
- k = id[i]; // use of sorted index
- if (auth_dat[k].account_id < 0)
- continue;
-
- mmo_auth_tostr(line, &auth_dat[k]);
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%\n", account_id_count);
-
- lock_fclose(fp, account_filename, &lock);
-
- // set new counter to minimum number of auth before save
- auth_before_save_file = auth_num / AUTH_SAVE_FILE_DIVIDER; // Re-initialise counter. We have save.
- if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE)
- auth_before_save_file = AUTH_BEFORE_SAVE_FILE;
-
- //if (id) aFree(id);
- DELETE_BUFFER(id);
-
- return;
-}
-
-//-----------------------------------------------------
-// Check if we must save accounts file or not
-// every minute, we check if we must save because we
-// have do some authentifications without arrive to
-// the minimum of authentifications for the save.
-// Note: all other modification of accounts (deletion,
-// change of some informations excepted lastip/
-// lastlogintime, creation) are always save
-// immediatly and set the minimum of
-// authentifications to its initialization value.
-//-----------------------------------------------------
-int check_auth_sync(int tid, unsigned int tick, int id, int data) {
- // we only save if necessary:
- // we have do some authentifications without do saving
- if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE ||
- auth_before_save_file < (int)(auth_num / AUTH_SAVE_FILE_DIVIDER))
- mmo_auth_sync();
-
- return 0;
-}
-
-//--------------------------------------------------------------------
-// Packet send to all char-servers, except one (wos: without our self)
-//--------------------------------------------------------------------
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c, fd;
-
- for(i = 0, c = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0 && fd != sfd) {
- WFIFOHEAD(fd, len);
- if (WFIFOSPACE(fd) < len) //Increase buffer size.
- realloc_writefifo(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
- return c;
-}
-
-//-----------------------------------------------------
-// Send GM accounts to all char-server
-//-----------------------------------------------------
-void send_GM_accounts(void) {
- unsigned int i;
- unsigned char buf[32767];
- int len;
-
- len = 4;
- WBUFW(buf,0) = 0x2732;
- for(i = 0; i < GM_num; i++)
- // send only existing accounts. We can not create a GM account when server is online.
- if (gm_account_db[i].level > 0) {
- WBUFL(buf,len) = gm_account_db[i].account_id;
- WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level;
- len += 5;
- if (len >= 32000) {
- ShowWarning("send_GM_accounts: Too many accounts! Only %d out of %d were sent.\n", i, GM_num);
- break;
- }
- }
- WBUFW(buf,2) = len;
- charif_sendallwos(-1, buf, len);
-
- return;
-}
-
-//-----------------------------------------------------
-// Check if GM file account have been changed
-//-----------------------------------------------------
-int check_GM_file(int tid, unsigned int tick, int id, int data) {
- struct stat file_stat;
- long new_time;
-
- // if we would not check
- if (gm_account_filename_check_timer < 1)
- return 0;
-
- // get last modify time/date
- if (stat(GM_account_filename, &file_stat))
- new_time = 0; // error
- else
- new_time = (long)file_stat.st_mtime;
-
- if (new_time != creation_time_GM_account_file) {
- read_gm_account();
- send_GM_accounts();
- }
-
- return 0;
-}
-
-//-------------------------------------
-// Account creation (with e-mail check)
-//-------------------------------------
-int mmo_auth_new(struct mmo_account* account, char sex, char* email) {
- time_t timestamp, timestamp_temp;
- struct tm *tmtime;
- int i = auth_num;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[i], '\0', sizeof(struct auth_dat));
-
- while (isGM(account_id_count) > 0)
- account_id_count++;
-
- auth_dat[i].account_id = account_id_count++;
-
- strncpy(auth_dat[i].userid, account->userid, NAME_LENGTH);
- auth_dat[i].userid[23] = '\0';
-
- strncpy(auth_dat[i].pass, account->passwd, NAME_LENGTH);
- auth_dat[i].pass[23] = '\0';
-
- memcpy(auth_dat[i].lastlogin, "-", 2);
-
- auth_dat[i].sex = (sex == 'M' || sex == 'm');
-
- auth_dat[i].logincount = 0;
-
- auth_dat[i].state = 0;
-
- if (e_mail_check(email) == 0)
- strncpy(auth_dat[i].email, "a@a.com", 40);
- else
- strncpy(auth_dat[i].email, email, 40);
-
- strncpy(auth_dat[i].error_message, "-", 20);
-
- auth_dat[i].ban_until_time = 0;
-
- if (start_limited_time < 0)
- auth_dat[i].connect_until_time = 0; // unlimited
- else { // limited time
- timestamp = time(NULL) + start_limited_time;
- // double conversion to be sure that it is possible
- tmtime = localtime(&timestamp);
- timestamp_temp = mktime(tmtime);
- if (timestamp_temp != -1 && (timestamp_temp + 3600) >= timestamp) // check possible value and overflow (and avoid summer/winter hour)
- auth_dat[i].connect_until_time = timestamp_temp;
- else
- auth_dat[i].connect_until_time = 0; // unlimited
- }
-
- strncpy(auth_dat[i].last_ip, "-", 16);
-
- strncpy(auth_dat[i].memo, "-", 255);
-
- auth_dat[i].account_reg2_num = 0;
-
- auth_num++;
-
- return (account_id_count - 1);
-}
-
-//---------------------------------------
-// Check/authentification of a connection
-//---------------------------------------
-int mmo_auth(struct mmo_account* account, int fd) {
- char *dnsbl_serv;
- unsigned int i;
- time_t raw_time;
- char tmpstr[256];
- int len, newaccount = 0;
-#ifdef PASSWORDENC
- struct login_session_data *ld;
-#endif
- int encpasswdok;
- char md5str[64], md5bin[32];
- char ip[16];
- unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr;
- char user_password[256];
- char r_ip[16]; // [Zido]
- char ip_dnsbl[256]; // [Zido]
-
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
-
- // Start DNS Blacklist check [Zido]
- if(use_dnsbl) {
- sprintf(r_ip, "%d.%d.%d.%d", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
-
- dnsbl_serv=strtok(dnsbl_servs,",");
- sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-// Using directly gethostbyname should be quicker. [Skotlex]
-// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
- if(gethostbyname(ip_dnsbl)) {
- ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
- return 3;
- }
-
- while((dnsbl_serv=strtok(dnsbl_servs,","))) {
- sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-// Using directly gethostbyname should be quicker. [Skotlex]
-// if(resolve_hostbyname(ip_dnsbl,NULL,NULL)!=0) {
- if(gethostbyname(ip_dnsbl)) {
- ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
- return 3;
- }
- }
-
- }
- // End DNS Blacklist check [Zido]
-
-
- len = strlen(account->userid) - 2;
- // Account creation with _M/_F
- if (account->passwdenc == 0 && account->userid[len] == '_' &&
- (account->userid[len+1] == 'F' || account->userid[len+1] == 'M' ||
- account->userid[len+1] == 'f' || account->userid[len+1] == 'm')
- && new_account_flag && account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
-
- //only continue if amount in this time limit is allowed (account registration flood protection)[Kevin]
- if(gettick() <= new_reg_tick && num_regs >= allowed_regs) {
- ShowNotice("Account registration denied (registration limit exceeded) to %s!\n", ip);
- login_log("Notice: Account registration denied (registration limit exceeded) to %s!", ip);
- return 3;
- } else {
- num_regs=0;
- }
-
- newaccount = 1;
- account->userid[len] = '\0';
- }
-
- //EXE Version check [Sirius]
- if (check_client_version == 1 && account->version != 0 &&
- account->version != client_version_to_connect)
- return 5;
-
- // Strict account search
- for(i = 0; i < auth_num; i++) {
- if (strcmp(account->userid, auth_dat[i].userid) == 0)
- break;
- }
- // if there is no creation request and strict account search fails, we do a no sensitive case research for index
- if (!newaccount && i == auth_num) {
- i = search_account_index(account->userid);
- if (i == -1)
- i = auth_num;
- else
- memcpy(account->userid, auth_dat[i].userid, NAME_LENGTH); // for the possible tests/checks afterwards (copy correcte sensitive case).
- }
-
- if (i != auth_num) {
- if (newaccount) {
- login_log("Attempt of creation of an already existant account (account: %s_%c, pass: %s, received pass: %s, ip: %s)" RETCODE,
- account->userid, account->userid[len+1], auth_dat[i].pass, account->passwd, ip);
- return 1; // 1 = Incorrect Password
- }
- if(use_md5_passwds)
- MD5_String(account->passwd, user_password);
- else
- memcpy(user_password, account->passwd, NAME_LENGTH);
- encpasswdok = 0;
-#ifdef PASSWORDENC
- ld = (struct login_session_data*)session[fd]->session_data;
- if (account->passwdenc > 0) {
- int j = account->passwdenc;
- if (!ld) {
- login_log("Md5 key not created (account: %s, ip: %s)" RETCODE, account->userid, ip);
- return 1; // 1 = Incorrect Password
- }
- if (j > 2)
- j = 1;
- do {
- if (j == 1) {
- sprintf(md5str, "%s%s", ld->md5key, auth_dat[i].pass); // 20 + 24
- } else if (j == 2) {
- sprintf(md5str, "%s%s", auth_dat[i].pass, ld->md5key); // 24 + 20
- } else
- md5str[0] = '\0';
- md5str[sizeof(md5str)-1] = '\0'; // 64
- MD5_String2binary(md5str, md5bin);
- encpasswdok = (memcmp(account->passwd, md5bin, 16) == 0);
- } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
-// printf("key[%s] md5 [%s] ", md5key, md5);
-// printf("client [%s] accountpass [%s]\n", account->passwd, auth_dat[i].pass);
- }
-#endif
- if ((strcmp(account->passwd, auth_dat[i].pass) && !encpasswdok)) {
- if (account->passwdenc == 0)
- login_log("Invalid password (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE, account->userid, auth_dat[i].pass, account->passwd, ip);
-#ifdef PASSWORDENC
- else {
- char logbuf[512], *p = logbuf;
- unsigned int j;
- p += sprintf(p, "Invalid password (account: %s, received md5[", account->userid);
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)account->passwd)[j]);
- p += sprintf(p,"] calculated md5[");
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
- p += sprintf(p, "] md5 key[");
- for(j = 0; j < ld->md5keylen; j++)
- p += sprintf(p, "%02x", ((unsigned char *)ld->md5key)[j]);
- p += sprintf(p, "], ip: %s)" RETCODE, ip);
- login_log(logbuf);
- }
-#endif
- return 1; // 1 = Incorrect Password
- }
-
- if (auth_dat[i].state) {
- login_log("Connection refused (account: %s, pass: %s, state: %d, ip: %s)" RETCODE,
- account->userid, account->passwd, auth_dat[i].state, ip);
- switch(auth_dat[i].state) { // packet 0x006a value + 1
- case 1: // 0 = Unregistered ID
- case 2: // 1 = Incorrect Password
- case 3: // 2 = This ID is expired
- case 4: // 3 = Rejected from Server
- case 5: // 4 = You have been blocked by the GM Team
- case 6: // 5 = Your Game's EXE file is not the latest version
- case 7: // 6 = Your are Prohibited to log in until %s
- case 8: // 7 = Server is jammed due to over populated
- case 9: // 8 = No more accounts may be connected from this company
- case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
- case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
- case 12: // 11 = MSI_REFUSE_BAN_BY_GM
- case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
- case 14: // 13 = MSI_REFUSE_SELF_LOCK
- case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 100: // 99 = This ID has been totally erased
- case 101: // 100 = Login information remains at %s.
- case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
- case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
- case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
- case 105: // 104 = Your spouse character is being deleted. Login is temporarily unavailable for the time being
- return auth_dat[i].state - 1;
- default:
- return 99; // 99 = ID has been totally erased
- }
- }
-
- if (online_check) {
- unsigned char buf[8];
- struct online_login_data* data = idb_get(online_db,auth_dat[i].account_id);
- if (data && data->char_server > -1) {
- //Request char servers to kick this account out. [Skotlex]
- ShowWarning("User [%d] is already online - Rejected.\n",auth_dat[i].account_id);
- WBUFW(buf,0) = 0x2734;
- WBUFL(buf,2) = auth_dat[i].account_id;
- charif_sendallwos(-1, buf, 6);
- if (!data->waiting_disconnect)
- add_timer(gettick()+30000, waiting_disconnect_timer,auth_dat[i].account_id, 0);
- data->waiting_disconnect = 1;
- return 3; // Rejected
- }
- }
-
- if (auth_dat[i].ban_until_time != 0) { // if account is banned
- strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
- tmpstr[19] = '\0';
- if (auth_dat[i].ban_until_time > time(NULL)) { // always banned
- login_log("Connection refused (account: %s, pass: %s, banned until %s, ip: %s)" RETCODE,
- account->userid, account->passwd, tmpstr, ip);
- return 6; // 6 = Your are Prohibited to log in until %s
- } else { // ban is finished
- login_log("End of ban (account: %s, pass: %s, previously banned until %s -> not more banned, ip: %s)" RETCODE,
- account->userid, account->passwd, tmpstr, ip);
- auth_dat[i].ban_until_time = 0; // reset the ban time
- }
- }
-
- if (auth_dat[i].connect_until_time != 0 && auth_dat[i].connect_until_time < time(NULL)) {
- login_log("Connection refused (account: %s, pass: %s, expired ID, ip: %s)" RETCODE,
- account->userid, account->passwd, ip);
- return 2; // 2 = This ID is expired
- }
-
- login_log("Authentification accepted (account: %s (id: %d), ip: %s)" RETCODE, account->userid, auth_dat[i].account_id, ip);
- } else {
- if (!newaccount) {
- login_log("Unknown account (account: %s, received pass: %s, ip: %s)" RETCODE,
- account->userid, account->passwd, ip);
- return 0; // 0 = Unregistered ID
- } else {
- int new_id = mmo_auth_new(account, account->userid[len+1], "a@a.com");
- login_log("Account creation and authentification accepted (account %s (id: %d), pass: %s, sex: %c, connection with _F/_M, ip: %s)" RETCODE,
- account->userid, new_id, account->passwd, account->userid[len+1], ip);
- auth_before_save_file = 0; // Creation of an account -> save accounts file immediatly
-
- //restart ticker (account registration flood protection)[Kevin]
- if(num_regs==0) {
- new_reg_tick=gettick()+time_allowed*1000;
- }
- num_regs++;
- }
- }
-
- // auth start : time seed
- // Platform/Compiler dependant clock() for time check is removed. [Lance]
- // clock() is originally used to track processing ticks on program execution.
- time(&raw_time);
- strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&raw_time));
-
- account->account_id = auth_dat[i].account_id;
- account->login_id1 = rand();
- account->login_id2 = rand();
- memcpy(account->lastlogin, auth_dat[i].lastlogin, 24);
- memcpy(auth_dat[i].lastlogin, tmpstr, 24);
- account->sex = auth_dat[i].sex;
- if (account->sex != 2 && account->account_id < 700000)
- ShowWarning("Account %s has account id %d! Account IDs must be over 700000 to work properly!\n", account->userid, account->account_id);
-
- strncpy(auth_dat[i].last_ip, ip, 16);
- auth_dat[i].logincount++;
-
- // Save until for change ip/time of auth is not very useful => limited save for that
- // Save there informations isnot necessary, because they are saved in log file.
- if (--auth_before_save_file <= 0) // Reduce counter. 0 or less, we save
- mmo_auth_sync();
-
- return -1; // account OK
-}
-
-static int online_db_setoffline(DBKey key, void* data, va_list ap) {
- struct online_login_data *p = (struct online_login_data *)data;
- int server = va_arg(ap, int);
- if (server == -1) {
- p->char_server = -1;
- p->waiting_disconnect = 0;
- } else if (p->char_server == server)
- p->char_server = -2; //Char server disconnected.
- return 0;
-}
-
-//--------------------------------
-// Packet parsing for char-servers
-//--------------------------------
-int parse_fromchar(int fd) {
- unsigned int i;
- int j, id;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
- int acc;
- RFIFOHEAD(fd);
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- for(id = 0; id < MAX_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if (id == MAX_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_SERVERS) {
- ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
- login_log("Char-server '%s' has disconnected (ip: %s)." RETCODE,
- server[id].name, ip);
- server_fd[id] = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
- online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char server to offline.
- }
- do_close(fd);
- return 0;
- }
-
- while (RFIFOREST(fd) >= 2) {
-
- if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && RFIFOW(fd,0) != 0x2714)) // 0x2714 is done very often (number of players)
- ShowDebug("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch (RFIFOW(fd,0)) {
- // request from map-server via char-server to reload GM accounts (by Yor).
- case 0x2709:
- login_log("Char-server '%s': Request to re-load GM configuration file (ip: %s)." RETCODE, server[id].name, ip);
- read_gm_account();
- // send GM accounts to all char-servers
- send_GM_accounts();
- RFIFOSKIP(fd,2);
- break;
-
- case 0x2712: // request from char-server to authentify an account
- if (RFIFOREST(fd) < 19)
- return 0;
- {
- int acc;
- acc = RFIFOL(fd,2); // speed up
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == acc &&
- auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
-#endif
- auth_fifo[i].sex == RFIFOB(fd,14) &&
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,15)) &&
- !auth_fifo[i].delflag) {
- unsigned int k;
- time_t connect_until_time = 0;
- char email[40] = "";
- WFIFOHEAD(fd,51);
- auth_fifo[i].delflag = 1;
- login_log("Char-server '%s': authentification of the account %d accepted (ip: %s)." RETCODE,
- server[id].name, acc, ip);
-// printf("%d\n", i);
- for(k = 0; k < auth_num; k++) {
- if (auth_dat[k].account_id == acc) {
- strcpy(email, auth_dat[k].email);
- connect_until_time = auth_dat[k].connect_until_time;
- break;
- }
- }
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = acc;
- WFIFOB(fd,6) = 0;
- memcpy(WFIFOP(fd, 7), email, 40);
- WFIFOL(fd,47) = (unsigned long)connect_until_time;
- WFIFOSET(fd,51);
- break;
- }
- }
- // authentification not found
- if (i == AUTH_FIFO_SIZE) {
- login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s)." RETCODE,
- server[id].name, acc, ip);
- WFIFOHEAD(fd, 51);
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = acc;
- WFIFOB(fd,6) = 1;
- // It is unnecessary to send email
- // It is unnecessary to send validity date of the account
- WFIFOSET(fd,51);
- }
- }
- RFIFOSKIP(fd,19);
- break;
-
- case 0x2714:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2));
- server[id].users = RFIFOL(fd,2);
- // send some answer
- WFIFOHEAD(fd, 2);
- WFIFOW(fd,0) = 0x2718;
- WFIFOSET(fd,2);
-
- RFIFOSKIP(fd,6);
- break;
-
- // we receive a e-mail creation of an account with a default e-mail (no answer)
- case 0x2715:
- if (RFIFOREST(fd) < 46)
- return 0;
- {
- char email[40];
- acc = RFIFOL(fd,2); // speed up
- memcpy(email, RFIFOP(fd,6), 40);
- email[39] = '\0';
- remove_control_chars((unsigned char *)email);
- //printf("parse_fromchar: an e-mail creation of an account with a default e-mail: server '%s', account: %d, e-mail: '%s'.\n", server[id].name, acc, RFIFOP(fd,6));
- if (e_mail_check(email) == 0)
- login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc && (strcmp(auth_dat[i].email, "a@a.com") == 0 || auth_dat[i].email[0] == '\0')) {
- memcpy(auth_dat[i].email, email, 40);
- login_log("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, email, ip);
- // Save
- mmo_auth_sync();
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd,46);
- break;
-
- // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
- case 0x2716:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- login_log("Char-server '%s': e-mail of the account %d found (ip: %s)." RETCODE,
- server[id].name, RFIFOL(fd,2), ip);
- WFIFOW(fd,0) = 0x2717;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memcpy(WFIFOP(fd, 6), auth_dat[i].email, 40);
- WFIFOL(fd,46) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOSET(fd,50);
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': e-mail of the account %d NOT found (ip: %s)." RETCODE,
- server[id].name, RFIFOL(fd,2), ip);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2720: // To become GM request
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned char buf[10];
- FILE *fp;
- acc = RFIFOL(fd,4);
- //printf("parse_fromchar: Request to become a GM acount from %d account.\n", acc);
- WBUFW(buf,0) = 0x2721;
- WBUFL(buf,2) = acc;
- WBUFL(buf,6) = 0;
- if (strcmp((char*)RFIFOP(fd,8), gm_pass) == 0) {
- // only non-GM can become GM
- if (isGM(acc) == 0) {
- // if we autorise creation
- if (level_new_gm > 0) {
- // if we can open the file to add the new GM
- if ((fp = fopen(GM_account_filename, "a")) != NULL) {
- char tmpstr[24];
- time_t raw_time;
- time(&raw_time);
- strftime(tmpstr, 23, date_format, localtime(&raw_time));
- fprintf(fp, RETCODE "// %s: @GM command on account %d" RETCODE "%d %d" RETCODE, tmpstr, acc, acc, level_new_gm);
- fclose(fp);
- WBUFL(buf,6) = level_new_gm;
- read_gm_account();
- send_GM_accounts();
- ShowNotice("GM Change of the account %d: level 0 -> %d.\n", acc, level_new_gm);
- login_log("Char-server '%s': GM Change of the account %d: level 0 -> %d (ip: %s)." RETCODE,
- server[id].name, acc, level_new_gm, ip);
- } else {
- ShowError("Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file)\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- ShowError("Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0))\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0), ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- ShowError("Error of GM change (suggested account: %d (already GM), correct password).\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d (already GM), correct password, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- ShowError("Error of GM change (suggested account: %d, invalid password).\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, invalid password, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- charif_sendallwos(-1, buf, 10);
- }
- RFIFOSKIP(fd, RFIFOW(fd,2));
- return 0;
-
- // Map server send information to change an email of an account via char-server
- case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- char actual_email[40], new_email[40];
- acc = RFIFOL(fd,2);
- memcpy(actual_email, RFIFOP(fd,6), 40);
- actual_email[39] = '\0';
- remove_control_chars((unsigned char *)actual_email);
- memcpy(new_email, RFIFOP(fd,46), 40);
- new_email[39] = '\0';
- remove_control_chars((unsigned char *)new_email);
- if (e_mail_check(actual_email) == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (e_mail_check(new_email) == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (strcmpi(new_email, "a@a.com") == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (strcmpi(auth_dat[i].email, actual_email) == 0) {
- memcpy(auth_dat[i].email, new_email, 40);
- login_log("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].userid, new_email, ip);
- // Save
- mmo_auth_sync();
- } else
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].userid, auth_dat[i].email, actual_email, ip);
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but account doesn't exist (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Receiving of map-server via char-server a status change resquest (by Yor)
- case 0x2724:
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int acc, statut;
- acc = RFIFOL(fd,2);
- statut = RFIFOL(fd,6);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].state != statut) {
- login_log("Char-server '%s': Status change (account: %d, new status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- if (statut != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].state = statut;
- // Save
- mmo_auth_sync();
- } else
- login_log("Char-server '%s': Error of Status change - actual status is already the good status (account: %d, status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- break;
- }
- }
- if (i == auth_num) {
- login_log("Char-server '%s': Error of Status change (account: %d not found, suggested status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- }
- RFIFOSKIP(fd,10);
- }
- return 0;
-
- case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
- if (RFIFOREST(fd) < 18)
- return 0;
- {
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- time_t timestamp;
- struct tm *tmtime;
- if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = auth_dat[i].ban_until_time;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- char tmpstr[2048];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- login_log("Char-server '%s': Ban request (account: %d, new final date of banishment: %d (%s), ip: %s)." RETCODE,
- server[id].name, acc, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, new date unbans the account, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- auth_dat[i].ban_until_time = timestamp;
- // Save
- mmo_auth_sync();
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, no change for ban date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, invalid date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of ban request (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,18);
- }
- return 0;
-
- case 0x2727: // Change of sex (sex is reversed)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int sex;
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
-// printf("%d,", auth_dat[i].account_id);
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].sex == 2)
- login_log("Char-server '%s': Error of sex change - Server account (suggested account: %d, actual sex %d (Server), ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].sex, ip);
- else {
- unsigned char buf[16];
- if (auth_dat[i].sex == 0)
- sex = 1;
- else
- sex = 0;
- login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = sex;
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- // Save
- mmo_auth_sync();
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of sex change (account: %d not found, sex would be reversed, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x2728: // We receive account_reg2 from a char-server, and we send them to other map-servers.
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int p;
- acc = RFIFOL(fd,4);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- //unsigned char buf[rfifow(fd,2)+1];
- unsigned char *buf;
- int len;
- buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char));
- login_log("char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- for(j=0,p=13;j<ACCOUNT_REG2_NUM && p<RFIFOW(fd,2);j++){
- sscanf(RFIFOP(fd,p), "%31c%n",auth_dat[i].account_reg2[j].str,&len);
- auth_dat[i].account_reg2[j].str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf(RFIFOP(fd,p), "%255c%n",auth_dat[i].account_reg2[j].value,&len);
- auth_dat[i].account_reg2[j].value[len]='\0';
- p +=len+1;
- remove_control_chars((unsigned char *)auth_dat[i].account_reg2[j].str);
- remove_control_chars((unsigned char *)auth_dat[i].account_reg2[j].value);
- }
- auth_dat[i].account_reg2_num = j;
- // Sending information towards the other char-servers.
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2729;
- charif_sendallwos(fd, buf, WBUFW(buf,2));
- // Save
- mmo_auth_sync();
-// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc);
- if (buf) aFree(buf);
- break;
- }
- }
- if (i == auth_num) {
-// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (unknwon account id: %d).\n", acc);
- login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].ban_until_time != 0) {
- auth_dat[i].ban_until_time = 0;
- login_log("Char-server '%s': UnBan request (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- } else {
- login_log("Char-server '%s': Error of UnBan request (account: %d, no change for unban date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of UnBan request (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x272b: // Set account_id to online [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- add_online_user(id, RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x272c: // Set account_id to offline [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- remove_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x272d: // Receive list of all online accounts. [Skotlex]
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (!online_check) {
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
- }
- {
- struct online_login_data *p;
- int aid;
- unsigned int users;
- online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
- users = RFIFOW(fd,4);
- for (i = 0; i < users; i++) {
- aid = RFIFOL(fd,6+i*4);
- p = idb_ensure(online_db, aid, create_online_user);
- p->char_server = id;
- p->waiting_disconnect = 0;
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
- }
- case 0x272e: //Request account_reg2 for a character.
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int account_id = RFIFOL(fd, 2);
- int char_id = RFIFOL(fd, 6);
- int p;
- RFIFOSKIP(fd,10);
- WFIFOW(fd,0) = 0x2729;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = char_id;
- WFIFOB(fd,12) = 1; //Type 1 for Account2 registry
- for(i = 0; i < auth_num && auth_dat[i].account_id != account_id; i++);
- if (i == auth_num) {
- //Account not found? Send at least empty data, map servers need a reply!
- WFIFOW(fd,2) = 13;
- WFIFOSET(fd,WFIFOW(fd,2));
- break;
- }
- for(p = 13,j=0;j<auth_dat[i].account_reg2_num;j++){
- if (auth_dat[i].account_reg2[j].str[0]) {
- p+= sprintf(WFIFOP(fd,p), "%s", auth_dat[i].account_reg2[j].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(fd,p), "%s", auth_dat[i].account_reg2[j].value)+1;
- }
- }
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- break;
-
- case 0x2736: // WAN IP update from char-server
- if (RFIFOREST(fd) < 6)
- return 0;
- ShowInfo("Updated IP of Server #%d to %d.%d.%d.%d.\n",id,
- (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
- (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
- server[id].ip = RFIFOL(fd,2);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2737: //Request to set all offline.
- ShowInfo("Setting accounts from char-server %d offline.\n", id);
- online_db->foreach(online_db,online_db_setoffline,id);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x3000: //change sex for chrif_changesex()
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned int sex;
- acc = RFIFOL(fd,4);
- sex = RFIFOB(fd,8);
- if (sex != 0 && sex != 1)
- sex = 0;
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- unsigned char buf[16];
- login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- auth_fifo[i].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = sex;
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- break;
- }
- }
- if (i == auth_num) {
- login_log("Char-server '%s': Error of Sex change (account: %d not found, suggested sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- }
- return 0;
-
- default:
- {
- FILE *logfp;
- char tmpstr[24];
- time_t raw_time;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- time(&raw_time);
- strftime(tmpstr, 23, date_format, localtime(&raw_time));
- fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
- fprintf(logfp, "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- ShowWarning("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- ShowStatus("Char-server has been disconnected (unknown packet).\n");
- return 0;
- }
- }
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-//---------------------------------------
-// Packet parsing for administation login
-//---------------------------------------
-int parse_admin(int fd) {
- unsigned int i, j;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char* account_name;
- char ip[16];
- RFIFOHEAD(fd);
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- if (session[fd]->eof) {
- do_close(fd);
- ShowInfo("Remote administration has disconnected (session #%d).\n", fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_admin == 1) {
-
- ShowDebug("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
- }
-
- switch(RFIFOW(fd,0)) {
- case 0x7530: // Request of the server version
- login_log("'ladmin': Sending of the server version (ip: %s)" RETCODE, ip);
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x7532: // Request of end of connection
- login_log("'ladmin': End of connection (ip: %s)" RETCODE, ip);
- RFIFOSKIP(fd,2);
- session[fd]->eof = 1;
- break;
-
- case 0x7920: // Request of an accounts list
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int st, ed, len;
- //int id[auth_num];
- //int *id=(int *)aCalloc(auth_num, sizeof(int));
- CREATE_BUFFER(id, int, auth_num);
- st = RFIFOL(fd,2);
- ed = RFIFOL(fd,6);
- RFIFOSKIP(fd,10);
- WFIFOW(fd,0) = 0x7921;
- if (st < 0)
- st = 0;
- if (ed > END_ACCOUNT_NUM || ed < st || ed <= 0)
- ed = END_ACCOUNT_NUM;
- login_log("'ladmin': Sending an accounts list (ask: from %d to %d, ip: %s)" RETCODE, st, ed, ip);
- // Sort before send
- for(i = 0; i < auth_num; i++) {
- unsigned int k;
- id[i] = i;
- for(j = 0; j < i; j++) {
- if (auth_dat[id[i]].account_id < auth_dat[id[j]].account_id) {
- for(k = i; k > j; k--) {
- id[k] = id[k-1];
- }
- id[j] = i; // id[i]
- break;
- }
- }
- }
- // Sending accounts information
- len = 4;
- for(i = 0; i < auth_num && len < 30000; i++) {
- int account_id = auth_dat[id[i]].account_id; // use sorted index
- if (account_id >= st && account_id <= ed) {
- j = id[i];
- WFIFOL(fd,len) = account_id;
- WFIFOB(fd,len+4) = (unsigned char)isGM(account_id);
- memcpy(WFIFOP(fd,len+5), auth_dat[j].userid, 24);
- WFIFOB(fd,len+29) = auth_dat[j].sex;
- WFIFOL(fd,len+30) = auth_dat[j].logincount;
- if (auth_dat[j].state == 0 && auth_dat[j].ban_until_time != 0) // if no state and banished
- WFIFOL(fd,len+34) = 7; // 6 = Your are Prohibited to log in until %s
- else
- WFIFOL(fd,len+34) = auth_dat[j].state;
- len += 38;
- }
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- //if (id) free(id);
- DELETE_BUFFER(id);
- }
- break;
-
- case 0x7930: // Request for an account creation
- if (RFIFOREST(fd) < 91)
- return 0;
- {
- struct mmo_account ma;
- memcpy(ma.userid,RFIFOP(fd, 2),NAME_LENGTH);
- ma.userid[23] = '\0';
- memcpy(ma.passwd, RFIFOP(fd, 26), NAME_LENGTH);
- ma.passwd[23] = '\0';
- memcpy(ma.lastlogin, "-", 2);
- ma.sex = RFIFOB(fd,50);
- WFIFOW(fd,0) = 0x7931;
- WFIFOL(fd,2) = 0xffffffff;
- memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24);
- if (strlen(ma.userid) < 4 || strlen(ma.passwd) < 4) {
- login_log("'ladmin': Attempt to create an invalid account (account or pass is too short, ip: %s)" RETCODE,
- ip);
- } else if (ma.sex != 'F' && ma.sex != 'M') {
- login_log("'ladmin': Attempt to create an invalid account (account: %s, received pass: %s, invalid sex, ip: %s)" RETCODE,
- ma.userid, ma.passwd, ip);
- } else if (account_id_count > END_ACCOUNT_NUM) {
- login_log("'ladmin': Attempt to create an account, but there is no more available id number (account: %s, pass: %s, sex: %c, ip: %s)" RETCODE,
- ma.userid, ma.passwd, ma.sex, ip);
- } else {
- remove_control_chars((unsigned char *)ma.userid);
- remove_control_chars((unsigned char *)ma.passwd);
- for(i = 0; i < auth_num; i++) {
- if (strncmp(auth_dat[i].userid, ma.userid, 24) == 0) {
- login_log("'ladmin': Attempt to create an already existing account (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ma.passwd, ip);
- break;
- }
- }
- if (i == auth_num) {
- int new_id;
- char email[40];
- memcpy(email, RFIFOP(fd,51), 40);
- email[39] = '\0';
- remove_control_chars((unsigned char *)email);
- new_id = mmo_auth_new(&ma, ma.sex, email);
- login_log("'ladmin': Account creation (account: %s (id: %d), pass: %s, sex: %c, email: %s, ip: %s)" RETCODE,
- ma.userid, new_id, ma.passwd, ma.sex, auth_dat[i].email, ip);
- WFIFOL(fd,2) = new_id;
- mmo_auth_sync();
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,91);
- }
- break;
-
- case 0x7932: // Request for an account deletion
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7933;
- WFIFOL(fd,2) = 0xFFFFFFFF;
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- // Char-server is notified of deletion (for characters deletion).
- unsigned char buf[65535];
- WBUFW(buf,0) = 0x2730;
- WBUFL(buf,2) = auth_dat[i].account_id;
- charif_sendallwos(-1, buf, 6);
- // send answer
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- // save deleted account in log file
- login_log("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- mmo_auth_tostr((char*)buf, &auth_dat[i]);
- login_log("%s" RETCODE, buf);
- // delete account
- memset(auth_dat[i].userid, '\0', sizeof(auth_dat[i].userid));
- auth_dat[i].account_id = -1;
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to delete an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7934: // Request to change a password
- if (RFIFOREST(fd) < 50)
- return 0;
- WFIFOW(fd,0) = 0x7935;
- WFIFOL(fd,2) = 0xFFFFFFFF; /// WTF??? an unsigned being set to a -1
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(auth_dat[i].pass, RFIFOP(fd,26), 24);
- auth_dat[i].pass[23] = '\0';
- remove_control_chars((unsigned char *)auth_dat[i].pass);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of a password (account: %s, new password: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ip);
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the password of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x7936: // Request to modify a state
- if (RFIFOREST(fd) < 50)
- return 0;
- {
- char error_message[20];
- int statut;
- WFIFOW(fd,0) = 0x7937;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- statut = RFIFOL(fd,26);
- memcpy(error_message, RFIFOP(fd,30), 20);
- error_message[19] = '\0';
- remove_control_chars((unsigned char *)error_message);
- if (statut != 7 || error_message[0] == '\0') { // 7: // 6 = Your are Prohibited to log in until %s
- strcpy(error_message, "-");
- }
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- if (auth_dat[i].state == statut && strcmp(auth_dat[i].error_message, error_message) == 0)
- login_log("'ladmin': Modification of a state, but the state of the account is already the good state (account: %s, received state: %d, ip: %s)" RETCODE,
- account_name, statut, ip);
- else {
- if (statut == 7)
- login_log("'ladmin': Modification of a state (account: %s, new state: %d - prohibited to login until '%s', ip: %s)" RETCODE,
- auth_dat[i].userid, statut, error_message, ip);
- else
- login_log("'ladmin': Modification of a state (account: %s, new state: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, statut, ip);
- if (auth_dat[i].state == 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].state = statut;
- memcpy(auth_dat[i].error_message, error_message, 20);
- mmo_auth_sync();
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the state of an unknown account (account: %s, received state: %d, ip: %s)" RETCODE,
- account_name, statut, ip);
- }
- WFIFOL(fd,30) = statut;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x7938: // Request for servers list and # of online players
- login_log("'ladmin': Sending of servers list (ip: %s)" RETCODE, ip);
- server_num = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- WFIFOL(fd,4+server_num*32) = server[i].ip;
- WFIFOW(fd,4+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,4+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,4+server_num*32+26) = server[i].users;
- WFIFOW(fd,4+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,4+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- WFIFOW(fd,0) = 0x7939;
- WFIFOW(fd,2) = 4 + 32 * server_num;
- WFIFOSET(fd,4+32*server_num);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x793a: // Request to password check
- if (RFIFOREST(fd) < 50)
- return 0;
- WFIFOW(fd,0) = 0x793b;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- char pass[25];
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(pass, RFIFOP(fd,26), 24);
- pass[24] = '\0';
- remove_control_chars((unsigned char *)pass);
- if (strcmp(auth_dat[i].pass, pass) == 0) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Check of password OK (account: %s, password: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ip);
- } else {
- login_log("'ladmin': Failure of password check (account: %s, proposed pass: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, pass, ip);
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to check the password of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x793c: // Request to modify sex
- if (RFIFOREST(fd) < 27)
- return 0;
- WFIFOW(fd,0) = 0x793d;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char sex;
- sex = RFIFOB(fd,26);
- if (sex != 'F' && sex != 'M') {
- if (sex > 31)
- login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: %c, ip: %s)" RETCODE,
- account_name, sex, ip);
- else
- login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: 'control char', ip: %s)" RETCODE,
- account_name, ip);
- } else {
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (auth_dat[i].sex != ((sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'))) {
- unsigned char buf[16];
- WFIFOL(fd,2) = auth_dat[i].account_id;
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
- login_log("'ladmin': Modification of a sex (account: %s, new sex: %c, ip: %s)" RETCODE,
- auth_dat[i].userid, sex, ip);
- mmo_auth_sync();
- // send to all char-server the change
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = auth_dat[i].sex;
- charif_sendallwos(-1, buf, 7);
- } else {
- login_log("'ladmin': Modification of a sex, but the sex is already the good sex (account: %s, sex: %c, ip: %s)" RETCODE,
- auth_dat[i].userid, sex, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify the sex of an unknown account (account: %s, received sex: %c, ip: %s)" RETCODE,
- account_name, sex, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,27);
- break;
-
- case 0x793e: // Request to modify GM level
- if (RFIFOREST(fd) < 27)
- return 0;
- WFIFOW(fd,0) = 0x793f;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char new_gm_level;
- new_gm_level = RFIFOB(fd,26);
- if (new_gm_level < 0 || new_gm_level > 99) {
- login_log("'ladmin': Attempt to give an invalid GM level (account: %s, received GM level: %d, ip: %s)" RETCODE,
- account_name, (int)new_gm_level, ip);
- } else {
- i = search_account_index(account_name);
- if (i != -1) {
- int acc = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (isGM(acc) != new_gm_level) {
- // modification of the file
- FILE *fp, *fp2;
- int lock;
- char line[512];
- int GM_account, GM_level;
- int modify_flag;
- char tmpstr[24];
- time_t raw_time;
- if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) {
- if ((fp = fopen(GM_account_filename, "r")) != NULL) {
- time(&raw_time);
- strftime(tmpstr, 23, date_format, localtime(&raw_time));
- modify_flag = 0;
- // read/write GM file
- while(fgets(line, sizeof(line)-1, fp)) {
- while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
- line[strlen(line)-1] = '\0';
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\0')
- fprintf(fp2, "%s" RETCODE, line);
- else {
- if (sscanf(line, "%d %d", &GM_account, &GM_level) != 2 && sscanf(line, "%d: %d", &GM_account, &GM_level) != 2)
- fprintf(fp2, "%s" RETCODE, line);
- else if (GM_account != acc)
- fprintf(fp2, "%s" RETCODE, line);
- else if (new_gm_level < 1) {
- fprintf(fp2, "// %s: 'ladmin' GM level removed on account %d '%s' (previous level: %d)" RETCODE "//%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
- modify_flag = 1;
- } else {
- fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: %d)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
- modify_flag = 1;
- }
- }
- }
- if (modify_flag == 0)
- fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: 0)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, acc, new_gm_level);
- fclose(fp);
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to read GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- if (lock_fclose(fp2, GM_account_filename, &lock) == 0) {
- WFIFOL(fd,2) = acc;
- login_log("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- // read and send new GM informations
- read_gm_account();
- send_GM_accounts();
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify of a GM level, but the GM level is already the good GM level (account: %s (%d), GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify the GM level of an unknown account (account: %s, received GM level: %d, ip: %s)" RETCODE,
- account_name, (int)new_gm_level, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,27);
- break;
-
- case 0x7940: // Request to modify e-mail
- if (RFIFOREST(fd) < 66)
- return 0;
- WFIFOW(fd,0) = 0x7941;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char email[40];
- memcpy(email, RFIFOP(fd,26), 40);
- if (e_mail_check(email) == 0) {
- login_log("'ladmin': Attempt to give an invalid e-mail (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- } else {
- remove_control_chars((unsigned char *)email);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(auth_dat[i].email, email, 40);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of an email (account: %s, new e-mail: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, email, ip);
- mmo_auth_sync();
- } else {
- login_log("'ladmin': Attempt to modify the e-mail of an unknown account (account: %s, received e-mail: %s, ip: %s)" RETCODE,
- account_name, email, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,66);
- break;
-
- case 0x7942: // Request to modify memo field
- if ((int)RFIFOREST(fd) < 28 || (int)RFIFOREST(fd) < (28 + RFIFOW(fd,26)))
- return 0;
- WFIFOW(fd,0) = 0x7943;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- int size_of_memo = sizeof(auth_dat[i].memo);
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memset(auth_dat[i].memo, '\0', size_of_memo);
- if (RFIFOW(fd,26) == 0) {
- strncpy(auth_dat[i].memo, "-", size_of_memo);
- } else if (RFIFOW(fd,26) > size_of_memo - 1) {
- memcpy(auth_dat[i].memo, RFIFOP(fd,28), size_of_memo - 1);
- } else {
- memcpy(auth_dat[i].memo, RFIFOP(fd,28), RFIFOW(fd,26));
- }
- auth_dat[i].memo[size_of_memo - 1] = '\0';
- remove_control_chars((unsigned char *)auth_dat[i].memo);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of a memo field (account: %s, new memo: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].memo, ip);
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the memo field of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,28 + RFIFOW(fd,26));
- break;
-
- case 0x7944: // Request to found an account id
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7945;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Request (by the name) of an account id (account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': ID request (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7946: // Request to found an account name
- if (RFIFOREST(fd) < 6)
- return 0;
- WFIFOW(fd,0) = 0x7947;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memset(WFIFOP(fd,6), '\0', 24);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- strncpy((char*)WFIFOP(fd,6), auth_dat[i].userid, 24);
- login_log("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, RFIFOL(fd,2), ip);
- break;
- }
- }
- if (i == auth_num) {
- login_log("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" RETCODE,
- RFIFOL(fd,2), ip);
- strncpy((char*)WFIFOP(fd,6), "", 24);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x7948: // Request to change the validity limit (timestamp) (absolute value)
- if (RFIFOREST(fd) < 30)
- return 0;
- {
- time_t timestamp;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x7949;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- timestamp = (time_t)RFIFOL(fd,26);
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- login_log("'ladmin': Change of a validity limit (account: %s, new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
- auth_dat[i].connect_until_time = timestamp;
- WFIFOL(fd,2) = auth_dat[i].account_id;
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to change the validity limit of an unknown account (account: %s, received validity: %d (%s), ip: %s)" RETCODE,
- account_name, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
- }
- WFIFOL(fd,30) = (unsigned int)timestamp;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,30);
- break;
-
- case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value)
- if (RFIFOREST(fd) < 30)
- return 0;
- {
- time_t timestamp;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x794b;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- timestamp = (time_t)RFIFOL(fd,26);
- if (timestamp <= time(NULL))
- timestamp = 0;
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Change of the final date of a banishment (account: %s, new final date of banishment: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].ban_until_time = timestamp;
- mmo_auth_sync();
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to change the final date of a banishment of an unknown account (account: %s, received final date of banishment: %d (%s), ip: %s)" RETCODE,
- account_name, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- }
- WFIFOL(fd,30) = (unsigned int)timestamp;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,30);
- break;
-
- case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change)
- if (RFIFOREST(fd) < 38)
- return 0;
- {
- time_t timestamp;
- struct tm *tmtime;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x794d;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = auth_dat[i].ban_until_time;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- login_log("'ladmin': Adjustment of a final date of a banishment (account: %s, (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].ban_until_time = timestamp;
- mmo_auth_sync();
- }
- } else {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].ban_until_time));
- login_log("'ladmin': Impossible to adjust the final date of a banishment (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].ban_until_time, (auth_dat[i].ban_until_time == 0 ? "no banishment" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
- }
- WFIFOL(fd,30) = (unsigned long)auth_dat[i].ban_until_time;
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to adjust the final date of a banishment of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOL(fd,30) = 0;
- }
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,38);
- break;
-
- case 0x794e: // Request to send a broadcast message
- if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
- return 0;
- WFIFOW(fd,0) = 0x794f;
- WFIFOW(fd,2) = 0xFFFF; // WTF???
- if (RFIFOL(fd,4) < 1) {
- login_log("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" RETCODE,
- ip);
- } else {
- // at least 1 char-server
- for(i = 0; i < MAX_SERVERS; i++)
- if (server_fd[i] >= 0)
- break;
- if (i == MAX_SERVERS) {
- login_log("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" RETCODE,
- ip);
- } else {
- unsigned char buf[32000];
- char message[32000];
- WFIFOW(fd,2) = 0;
- memset(message, '\0', sizeof(message));
- memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
- message[sizeof(message)-1] = '\0';
- remove_control_chars((unsigned char *)message);
- if (RFIFOW(fd,2) == 0)
- login_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s, ip: %s)" RETCODE,
- message, ip);
- else
- login_log("'ladmin': Receiving a message for broadcast (message (in blue): %s, ip: %s)" RETCODE,
- message, ip);
- // send same message to all char-servers (no answer)
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), 8 + RFIFOL(fd,4));
- WBUFW(buf,0) = 0x2726;
- charif_sendallwos(-1, buf, 8 + RFIFOL(fd,4));
- }
- }
- WFIFOSET(fd,4);
- RFIFOSKIP(fd,8 + RFIFOL(fd,4));
- break;
-
- case 0x7950: // Request to change the validity limite (timestamp) (relative change)
- if (RFIFOREST(fd) < 38)
- return 0;
- {
- time_t timestamp;
- struct tm *tmtime;
- char tmpstr[2048];
- char tmpstr2[2048];
- WFIFOW(fd,0) = 0x7951;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- timestamp = auth_dat[i].connect_until_time;
- if (add_to_unlimited_account == 0 && timestamp == 0) {
- login_log("'ladmin': Attempt to adjust the validity limit of an unlimited account (account: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, ip);
- WFIFOL(fd,30) = 0;
- } else {
- if (timestamp == 0 || timestamp < time(NULL))
- timestamp = time(NULL);
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
- strftime(tmpstr2, 24, date_format, localtime(&timestamp));
- login_log("'ladmin': Adjustment of a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "unlimited" : tmpstr2), ip);
- auth_dat[i].connect_until_time = timestamp;
- mmo_auth_sync();
- WFIFOL(fd,30) = (unsigned long)auth_dat[i].connect_until_time;
- } else {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
- login_log("'ladmin': Impossible to adjust a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
- WFIFOL(fd,30) = 0;
- }
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to adjust the validity limit of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOL(fd,30) = 0;
- }
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,38);
- break;
-
- case 0x7952: // Request about informations of an account (by account name)
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7953;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
- memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
- WFIFOB(fd,31) = auth_dat[i].sex;
- WFIFOL(fd,32) = auth_dat[i].logincount;
- WFIFOL(fd,36) = auth_dat[i].state;
- memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
- memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
- memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
- memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
- WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
- WFIFOW(fd,148) = strlen(auth_dat[i].memo);
- if (auth_dat[i].memo[0]) {
- memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
- }
- login_log("'ladmin': Sending information of an account (request by the name; account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- WFIFOSET(fd,150+strlen(auth_dat[i].memo));
- } else {
- memcpy(WFIFOP(fd,7), account_name, 24);
- WFIFOW(fd,148) = 0;
- login_log("'ladmin': Attempt to obtain information (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOSET(fd,150);
- }
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7954: // Request about information of an account (by account id)
- if (RFIFOREST(fd) < 6)
- return 0;
- WFIFOW(fd,0) = 0x7953;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memset(WFIFOP(fd,7), '\0', 24);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- login_log("'ladmin': Sending information of an account (request by the id; account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, RFIFOL(fd,2), ip);
- WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
- memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
- WFIFOB(fd,31) = auth_dat[i].sex;
- WFIFOL(fd,32) = auth_dat[i].logincount;
- WFIFOL(fd,36) = auth_dat[i].state;
- memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
- memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
- memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
- memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
- WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
- WFIFOW(fd,148) = strlen(auth_dat[i].memo);
- if (auth_dat[i].memo[0]) {
- memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
- }
- WFIFOSET(fd,150+strlen(auth_dat[i].memo));
- break;
- }
- }
- if (i == auth_num) {
- login_log("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" RETCODE,
- RFIFOL(fd,2), ip);
- strncpy((char*)WFIFOP(fd,7), "", 24);
- WFIFOW(fd,148) = 0;
- WFIFOSET(fd,150);
- }
- RFIFOSKIP(fd,6);
- break;
-
- case 0x7955: // Request to reload GM file (no answer)
- login_log("'ladmin': Request to re-load GM configuration file (ip: %s)." RETCODE, ip);
- read_gm_account();
- // send GM accounts to all char-servers
- send_GM_accounts();
- RFIFOSKIP(fd,2);
- break;
-
- default:
- {
- FILE *logfp;
- char tmpstr[24];
- time_t raw_time;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- time(&raw_time);
- strftime(tmpstr, 23, date_format, localtime(&raw_time));
- fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
- fprintf(logfp, "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- login_log("'ladmin': End of connection, unknown packet (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- ShowWarning("Remote administration has been disconnected (unknown packet).\n");
- return 0;
- }
- //WFIFOW(fd,0) = 0x791f;
- //WFIFOSET(fd,2);
- }
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-// Rewrote: Adnvanced subnet check [LuzZza]
-//--------------------------------------------
-int lan_subnetcheck(long *p) {
-
- int i;
- unsigned char *sbn, *msk, *src = (unsigned char *)p;
-
- for(i=0; i<subnet_count; i++) {
-
- if(subnet[i].subnet == (*p & subnet[i].mask)) {
-
- sbn = (char *)&subnet[i].subnet;
- msk = (char *)&subnet[i].mask;
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
- src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
-
- return subnet[i].char_ip;
- }
- }
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
- return 0;
-}
-
-//----------------------------------------------------------------------------------------
-// Default packet parsing (normal players or administation/char-server connexion requests)
-//----------------------------------------------------------------------------------------
-int parse_login(int fd) {
-
- struct mmo_account account;
- int result, j;
- unsigned int i;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
- long subnet_char_ip;
-
- RFIFOHEAD(fd);
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- memset(&account, 0, sizeof(account));
-
- if (session[fd]->eof) {
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_login == 1) {
- if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) {
- if ((int)RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
- ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d), account: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,6));
- } else if (RFIFOW(fd,0) == 0x2710) {
- if (RFIFOREST(fd) >= 86)
- ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60));
- } else
- ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
- }
-
- switch(RFIFOW(fd,0)) {
- case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
- if (RFIFOREST(fd) < 26)
- return 0;
- RFIFOSKIP(fd,26);
- break;
-
- case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
- if (RFIFOREST(fd) < 18)
- return 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x277: // New login packet
- case 0x64: // request client login
- case 0x01dd: // request client login with encrypt
- {
- int packet_len = RFIFOREST(fd);
-
- switch(RFIFOW(fd, 0)){
- case 0x64:
- if(packet_len < 55)
- return 0;
- break;
- case 0x01dd:
- if(packet_len < 47)
- return 0;
- break;
- case 0x277:
- if(packet_len < 84)
- return 0;
- break;
- }
-
- account.version = RFIFOL(fd, 2); //for exe version check [Sirius]
- if (!account.version) account.version = 1; //Force some version...
- memcpy(account.userid,RFIFOP(fd,6),NAME_LENGTH);
- account.userid[23] = '\0';
- remove_control_chars((unsigned char *)account.userid);
- if (RFIFOW(fd,0) != 0x01dd) {
- login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
- memcpy(account.passwd, RFIFOP(fd,30), NAME_LENGTH);
- account.passwd[23] = '\0';
- remove_control_chars((unsigned char *)account.passwd);
- } else {
- login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
- // If remove control characters from received password encrypted by md5,
- // there would be a wrong result and failed to authentication. [End_of_exam]
- memcpy(account.passwd, RFIFOP(fd,30), 16);
- account.passwd[16] = '\0';
- }
-#ifdef PASSWORDENC
- account.passwdenc = (RFIFOW(fd,0) != 0x01dd) ? 0 : PASSWORDENC;
-#else
- account.passwdenc = 0;
-#endif
-
- if (!check_ip(session[fd]->client_addr.sin_addr.s_addr)) {
- login_log("Connection refused: IP isn't authorised (deny/allow, ip: %s)." RETCODE, ip);
- WFIFOHEAD(fd, 23);
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = 3; // 3 = Rejected from Server
- WFIFOSET(fd,23);
- RFIFOSKIP(fd,packet_len);
- break;
- }
-
- result = mmo_auth(&account, fd);
- if (result == -1) {
- int gm_level = isGM(account.account_id);
- if (min_level_to_connect > gm_level) {
- login_log("Connection refused: the minimum GM level for connection is %d (account: %s, GM level: %d, ip: %s)." RETCODE,
- min_level_to_connect, account.userid, gm_level, ip);
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
- if (gm_level)
- ShowInfo("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
- else
- ShowInfo("Connection of the account '%s' accepted.\n", account.userid);
- server_num = 0;
- WFIFOHEAD(fd, 47+32*MAX_SERVERS);
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- // Andvanced subnet check [LuzZza]
- if((subnet_char_ip = lan_subnetcheck((long*)p)))
- WFIFOL(fd,47+server_num*32) = subnet_char_ip;
- else
- WFIFOL(fd,47+server_num*32) = server[i].ip;
- WFIFOW(fd,47+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,47+server_num*32+26) = server[i].users;
- WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,47+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- // if at least 1 char-server
- if (server_num > 0) {
- WFIFOW(fd,0) = 0x69;
- WFIFOW(fd,2) = 47+32*server_num;
- WFIFOL(fd,4) = account.login_id1;
- WFIFOL(fd,8) = account.account_id;
- WFIFOL(fd,12) = account.login_id2;
- WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used)
- memcpy(WFIFOP(fd,20), account.lastlogin, 24); // in old version, that was for name (not more used)
- WFIFOB(fd,46) = account.sex;
- WFIFOSET(fd,47+32*server_num);
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- auth_fifo[auth_fifo_pos].account_id = account.account_id;
- auth_fifo[auth_fifo_pos].login_id1 = account.login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = account.login_id2;
- auth_fifo[auth_fifo_pos].sex = account.sex;
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
- // if no char-server, don't send void list of servers, just disconnect the player with proper message
- } else {
- login_log("Connection refused: there is no char-server online (account: %s, ip: %s)." RETCODE,
- account.userid, ip);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- WFIFOHEAD(fd, 23);
- memset(WFIFOP(fd,0), '\0', 23);
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = result;
- if (result == 6) { // 6 = Your are Prohibited to log in until %s
- i = search_account_index(account.userid);
- if (i != -1) {
- if (auth_dat[i].ban_until_time != 0) { // if account is banned, we send ban timestamp
- char tmpstr[256];
- strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
- tmpstr[19] = '\0';
- memcpy(WFIFOP(fd,3), tmpstr, 20);
- } else { // we send error message
- memcpy(WFIFOP(fd,3), auth_dat[i].error_message, 20);
- }
- }
- }
- WFIFOSET(fd,23);
- }
- RFIFOSKIP(fd,packet_len);
- break;
- }
- case 0x01db: // Sending request of the coding key
- case 0x791a: // Sending request of the coding key (administration packet)
- {
- struct login_session_data *ld;
- if (session[fd]->session_data) {
- ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- ld = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
- session[fd]->session_data = ld;
- if (!ld) {
- ShowFatalError("login: Request for md5 key: memory allocation failure (malloc)!\n");
- session[fd]->eof = 1;
- return 0;
- }
- if (RFIFOW(fd,0) == 0x01db)
- login_log("Sending request of the coding key (ip: %s)" RETCODE, ip);
- else
- login_log("'ladmin': Sending request of the coding key (ip: %s)" RETCODE, ip);
- // Creation of the coding key
- memset(ld->md5key, '\0', sizeof(ld->md5key));
- ld->md5keylen = rand() % 4 + 12;
- for(i = 0; i < ld->md5keylen; i++)
- ld->md5key[i] = rand() % 255 + 1;
- RFIFOSKIP(fd,2);
- WFIFOHEAD(fd, 4 + ld->md5keylen);
- WFIFOW(fd,0) = 0x01dc;
- WFIFOW(fd,2) = 4 + ld->md5keylen;
- memcpy(WFIFOP(fd,4), ld->md5key, ld->md5keylen);
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- break;
-
- case 0x2710: // Connection request of a char-server
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- int GM_value, len;
- char* server_name;
- WFIFOHEAD(fd, 3);
- memcpy(account.userid,RFIFOP(fd,2),NAME_LENGTH);
- account.userid[23] = '\0';
- remove_control_chars((unsigned char *)account.userid);
- memcpy(account.passwd, RFIFOP(fd,26), NAME_LENGTH);
- account.passwd[23] = '\0';
- remove_control_chars((unsigned char *)account.passwd);
- account.passwdenc = 0;
- server_name = (char*)RFIFOP(fd,60);
- server_name[20] = '\0';
- remove_control_chars((unsigned char *)server_name);
- login_log("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" RETCODE,
- server_name, RFIFOB(fd,54), RFIFOB(fd,55), RFIFOB(fd,56), RFIFOB(fd,57), RFIFOW(fd,58), ip);
- result = mmo_auth(&account, fd);
- if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) {
- login_log("Connection of the char-server '%s' accepted (account: %s, pass: %s, ip: %s)" RETCODE,
- server_name, account.userid, account.passwd, ip);
- ShowStatus("Connection of the char-server '%s' accepted.\n", server_name);
- memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
- server[account.account_id].ip = RFIFOL(fd,54);
- server[account.account_id].port = RFIFOW(fd,58);
- memcpy(server[account.account_id].name, server_name, 20);
- server[account.account_id].users = 0;
- server[account.account_id].maintenance = RFIFOW(fd,82);
- server[account.account_id].new_ = RFIFOW(fd,84);
- server_fd[account.account_id] = fd;
- WFIFOW(fd,0) = 0x2711;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- session[fd]->func_parse = parse_fromchar;
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- // send GM account to char-server
- len = 4;
- WFIFOW(fd,0) = 0x2732;
- for(i = 0; i < auth_num; i++)
- // send only existing accounts. We can not create a GM account when server is online.
- if ((GM_value = isGM(auth_dat[i].account_id)) > 0) {
- WFIFOL(fd,len) = auth_dat[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)GM_value;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- } else {
- if (server_fd[account.account_id] != -1) {
- ShowNotice("Connection of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)\n",
- server_name, account.account_id, account.userid, account.passwd, ip);
- login_log("Connexion of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)" RETCODE,
- server_name, account.account_id, account.userid, account.passwd, ip);
- } else {
- ShowNotice("Connection of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s).\n", server_name, account.userid, account.passwd, ip);
- login_log("Connexion of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s)" RETCODE,
- server_name, account.userid, account.passwd, ip);
- }
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x2711;
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd,3);
- }
- }
- RFIFOSKIP(fd,86);
- return 0;
-
- case 0x7530: // Request of the server version
- login_log("Sending of the server version (ip: %s)" RETCODE, ip);
- WFIFOHEAD(fd, 10);
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x7532: // Request to end connection
- login_log("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
-
- case 0x7918: // Request for administation login
- if ((int)RFIFOREST(fd) < 4 || (int)RFIFOREST(fd) < ((RFIFOW(fd,2) == 0) ? 28 : 20))
- return 0;
- WFIFOW(fd,0) = 0x7919;
- WFIFOB(fd,2) = 1;
- if (!check_ladminip(session[fd]->client_addr.sin_addr.s_addr)) {
- login_log("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." RETCODE, ip);
- } else {
- struct login_session_data *ld = (struct login_session_data*)session[fd]->session_data;
- if (RFIFOW(fd,2) == 0) { // non encrypted password
- char password[25];
- memcpy(password, RFIFOP(fd,4), 24);
- password[24] = '\0';
- remove_control_chars((unsigned char *)password);
- // If remote administration is enabled and password sent by client matches password read from login server configuration file
- if ((admin_state == 1) && (strcmp(password, admin_pass) == 0)) {
- login_log("'ladmin'-login: Connection in administration mode accepted (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- ShowNotice("Connection of a remote administration accepted (non encrypted password).\n");
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_admin;
- } else if (admin_state != 1)
- login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- else
- login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- } else { // encrypted password
- if (!ld)
- ShowError("'ladmin'-login: error! MD5 key not created/requested for an administration login.\n");
- else {
- char md5str[64] = "", md5bin[32];
- if (RFIFOW(fd,2) == 1) {
- sprintf(md5str, "%s%s", ld->md5key, admin_pass); // 20 24
- } else if (RFIFOW(fd,2) == 2) {
- sprintf(md5str, "%s%s", admin_pass, ld->md5key); // 24 20
- }
- MD5_String2binary(md5str, md5bin);
- // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file
- if ((admin_state == 1) && (memcmp(md5bin, RFIFOP(fd,4), 16) == 0)) {
- login_log("'ladmin'-login: Connection in administration mode accepted (encrypted password, ip: %s)" RETCODE, ip);
- ShowNotice("Connection of a remote administration accepted (encrypted password).\n");
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_admin;
- } else if (admin_state != 1)
- login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (encrypted password, ip: %s)" RETCODE, ip);
- else
- login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (encrypted password, ip: %s)" RETCODE, ip);
- }
- }
- }
- WFIFOSET(fd,3);
- RFIFOSKIP(fd, (RFIFOW(fd,2) == 0) ? 28 : 20);
- break;
-
- default:
- if (save_unknown_packets) {
- FILE *logfp;
- char tmpstr[24];
- time_t raw_time;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- time(&raw_time);
- strftime(tmpstr, 23, date_format, localtime(&raw_time));
- fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
- fprintf(logfp, "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- login_log("End of connection, unknown packet (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-//-----------------------
-// Console Command Parser [Wizputer]
-//-----------------------
-int parse_console(char *buf) {
- char command[256];
-
- memset(command,0,sizeof(command));
-
- sscanf(buf, "%[^\n]", command);
-
- login_log("Console command :%s" RETCODE, command);
-
- if(strcmpi("shutdown", command) == 0 ||
- strcmpi("exit", command) == 0 ||
- strcmpi("quit", command) == 0 ||
- strcmpi("end", command) == 0)
- runflag = 0;
- else if(strcmpi("alive", command) == 0 ||
- strcmpi("status", command) == 0)
- ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
- else if(strcmpi("help", command) == 0) {
- printf(CL_BOLD"Help of commands:"CL_RESET"\n");
- printf(" To shutdown the server:\n");
- printf(" 'shutdown|exit|qui|end'\n");
- printf(" To know if server is alive:\n");
- printf(" 'alive|status'\n");
- }
-
- return 0;
-}
-
-static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
-{
- struct online_login_data *character= (struct online_login_data*)data;
- if (character->char_server == -2) //Unknown server.. set them offline
- remove_online_user(character->account_id);
- else if (character->char_server < 0)
- //Free data from players that have not been online for a while.
- db_remove(online_db, key);
- return 0;
-}
-
-static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
-{
- online_db->foreach(online_db, online_data_cleanup_sub);
- return 0;
-}
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//----------------------------------
-// Reading Lan Support configuration
-// Rewrote: Anvanced subnet check [LuzZza]
-//----------------------------------
-int login_lan_config_read(const char *lancfgName) {
-
- FILE *fp;
- int line_num = 0;
- char line[1024], w1[64], w2[64], w3[64], w4[64];
-
- if((fp = fopen(lancfgName, "r")) == NULL) {
- ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- ShowInfo("Reading the configuration file %s...\n", lancfgName);
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- line_num++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
-
- ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
- continue;
- }
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- remove_control_chars((unsigned char *)w3);
- remove_control_chars((unsigned char *)w4);
-
- if(strcmpi(w1, "subnet") == 0) {
-
- subnet[subnet_count].mask = inet_addr(w2);
- subnet[subnet_count].char_ip = inet_addr(w3);
- subnet[subnet_count].map_ip = inet_addr(w4);
- subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
- if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
- ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
- continue;
- }
-
- subnet_count++;
- }
-
- ShowStatus("Read information about %d subnetworks.\n", subnet_count);
- }
-
- fclose(fp);
- return 0;
-}
-
-//-----------------------------------
-// Reading general configuration file
-//-----------------------------------
-int login_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowError("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
-
- ShowInfo("Reading configuration file %s...\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- memset(w2, 0, sizeof(w2));
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
-
- if(strcmpi(w1,"timestamp_format") == 0) {
- strncpy(timestamp_format, w2, 20);
- } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
- stdout_with_ansisequence = config_switch(w2);
- } else if(strcmpi(w1,"console_silent")==0){
- msg_silent = 0; //To always allow the next line to show up.
- ShowInfo("Console Silent Setting: %d\n", atoi(w2));
- msg_silent = atoi(w2);
- } else if (strcmpi(w1, "admin_state") == 0) {
- admin_state = config_switch(w2);
- } else if (strcmpi(w1, "admin_pass") == 0) {
- memset(admin_pass, 0, sizeof(admin_pass));
- strncpy(admin_pass, w2, sizeof(admin_pass));
- admin_pass[sizeof(admin_pass)-1] = '\0';
- } else if (strcmpi(w1, "ladminallowip") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_ladmin_allow)
- aFree(access_ladmin_allow);
- access_ladmin_allow = NULL;
- access_ladmin_allownum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_ladmin_allow)
- aFree(access_ladmin_allow);
- // set to all
- access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_ladmin_allownum = 1;
- access_ladmin_allow[0] = '\0';
- } else if (w2[0] && !(access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { // don't add IP if already 'all'
- if (access_ladmin_allow)
- access_ladmin_allow = (char*)aRealloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE);
- else
- access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_ladmin_allow + (access_ladmin_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_ladmin_allow[access_ladmin_allownum * ACO_STRSIZE - 1] = '\0';
- }
- }
- } else if (strcmpi(w1, "gm_pass") == 0) {
- memset(gm_pass, 0, sizeof(gm_pass));
- strncpy(gm_pass, w2, sizeof(gm_pass));
- gm_pass[sizeof(gm_pass)-1] = '\0';
- } else if (strcmpi(w1, "level_new_gm") == 0) {
- level_new_gm = atoi(w2);
- } else if (strcmpi(w1, "new_account") == 0) {
- new_account_flag = config_switch(w2);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- bind_ip = resolve_hostbyname(w2, NULL, bind_ip_str);
- if (bind_ip)
- ShowStatus("Login server binding IP address : %s -> %s\n", w2, bind_ip_str);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port = atoi(w2);
- } else if (strcmpi(w1, "account_filename") == 0) {
- memset(account_filename, 0, sizeof(account_filename));
- strncpy(account_filename, w2, sizeof(account_filename));
- account_filename[sizeof(account_filename)-1] = '\0';
- } else if (strcmpi(w1, "gm_account_filename") == 0) {
- memset(GM_account_filename, 0, sizeof(GM_account_filename));
- strncpy(GM_account_filename, w2, sizeof(GM_account_filename));
- GM_account_filename[sizeof(GM_account_filename)-1] = '\0';
- } else if (strcmpi(w1, "gm_account_filename_check_timer") == 0) {
- gm_account_filename_check_timer = atoi(w2);
- } else if (strcmpi(w1, "use_MD5_passwords") == 0) {
- use_md5_passwds = config_switch(w2);
- } else if (strcmpi(w1, "login_log_filename") == 0) {
- memset(login_log_filename, 0, sizeof(login_log_filename));
- strncpy(login_log_filename, w2, sizeof(login_log_filename));
- login_log_filename[sizeof(login_log_filename)-1] = '\0';
- } else if (strcmpi(w1, "log_login") == 0) {
- log_login = atoi(w2);
- } else if (strcmpi(w1, "login_log_unknown_packets_filename") == 0) {
- memset(login_log_unknown_packets_filename, 0, sizeof(login_log_unknown_packets_filename));
- strncpy(login_log_unknown_packets_filename, w2, sizeof(login_log_unknown_packets_filename));
- login_log_unknown_packets_filename[sizeof(login_log_unknown_packets_filename)-1] = '\0';
- } else if (strcmpi(w1, "save_unknown_packets") == 0) {
- save_unknown_packets = config_switch(w2);
- } else if (strcmpi(w1, "display_parse_login") == 0) {
- display_parse_login = config_switch(w2); // 0: no, 1: yes
- } else if (strcmpi(w1, "display_parse_admin") == 0) {
- display_parse_admin = config_switch(w2); // 0: no, 1: yes
- } else if (strcmpi(w1, "display_parse_fromchar") == 0) {
- display_parse_fromchar = config_switch(w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets
- } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- memset(date_format, 0, sizeof(date_format));
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- } else if (strcmpi(w1, "min_level_to_connect") == 0) {
- min_level_to_connect = atoi(w2);
- } else if (strcmpi(w1, "add_to_unlimited_account") == 0) {
- add_to_unlimited_account = config_switch(w2);
- } else if (strcmpi(w1, "start_limited_time") == 0) {
- start_limited_time = atoi(w2);
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "order") == 0) {
- access_order = atoi(w2);
- if (strcmpi(w2, "deny,allow") == 0 ||
- strcmpi(w2, "deny, allow") == 0) access_order = ACO_DENY_ALLOW;
- if (strcmpi(w2, "allow,deny") == 0 ||
- strcmpi(w2, "allow, deny") == 0) access_order = ACO_ALLOW_DENY;
- if (strcmpi(w2, "mutual-failture") == 0 ||
- strcmpi(w2, "mutual-failure") == 0) access_order = ACO_MUTUAL_FAILTURE;
- } else if (strcmpi(w1, "allow") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_allow)
- aFree(access_allow);
- access_allow = NULL;
- access_allownum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_allow)
- aFree(access_allow);
- // set to all
- access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_allownum = 1;
- access_allow[0] = '\0';
- } else if (w2[0] && !(access_allownum == 1 && access_allow[0] == '\0')) { // don't add IP if already 'all'
- if (access_allow)
- access_allow = (char*)aRealloc(access_allow, (access_allownum+1) * ACO_STRSIZE);
- else
- access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_allow + (access_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_allow[access_allownum * ACO_STRSIZE - 1] = '\0';
- }
- }
- } else if (strcmpi(w1, "deny") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_deny)
- aFree(access_deny);
- access_deny = NULL;
- access_denynum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_deny)
- aFree(access_deny);
- // set to all
- access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_denynum = 1;
- access_deny[0] = '\0';
- } else if (w2[0] && !(access_denynum == 1 && access_deny[0] == '\0')) { // don't add IP if already 'all'
- if (access_deny)
- access_deny = (char*)aRealloc(access_deny, (access_denynum+1) * ACO_STRSIZE);
- else
- access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_deny + (access_denynum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_deny[access_denynum * ACO_STRSIZE - 1] = '\0';
- }
- }
- // dynamic password error ban
- } else if (strcmpi(w1, "dynamic_pass_failure_ban") == 0) {
- dynamic_pass_failure_ban = config_switch(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_time") == 0) {
- dynamic_pass_failure_ban_time = atoi(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_many") == 0) {
- dynamic_pass_failure_ban_how_many = atoi(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_long") == 0) {
- dynamic_pass_failure_ban_how_long = atoi(w2);
- } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
- check_client_version = 1;
- }
- if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
- check_client_version = 0;
- }
- }else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
- client_version_to_connect = atoi(w2); //Added by Sirius for client version check
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- } else if (strcmpi(w1, "allowed_regs") == 0) { //account flood protection system [Kevin]
- allowed_regs = atoi(w2);
- } else if (strcmpi(w1, "time_allowed") == 0) {
- time_allowed = atoi(w2);
- } else if (strcmpi(w1, "online_check") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- online_check = 1;
- else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
- online_check = 0;
- else
- online_check = atoi(w2);
- } else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"use_dnsbl")==0) { // [Zido]
- use_dnsbl=atoi(w2);
- } else if(strcmpi(w1,"dnsbl_servers")==0) { // [Zido]
- strcpy(dnsbl_servs,w2);
- } else if(strcmpi(w1,"ip_sync_interval")==0) {
- ip_sync_interval = 1000*60*atoi(w2); //w2 comes in minutes.
- }
- }
- }
- fclose(fp);
-
- ShowInfo("Finished reading %s.\n", cfgName);
-
- return 0;
-}
-
-//-------------------------------------
-// Displaying of configuration warnings
-//-------------------------------------
-void display_conf_warnings(void) {
- if (admin_state != 0 && admin_state != 1) {
- ShowWarning("Invalid value for admin_state parameter -> setting to 0 (no remote admin).\n");
- admin_state = 0;
- }
-
- if (admin_state == 1) {
- if (admin_pass[0] == '\0') {
- ShowWarning("Administrator password is void (admin_pass).\n");
- } else if (strcmp(admin_pass, "admin") == 0) {
- ShowWarning("You are using the default administrator password (admin_pass).\n");
- ShowWarning(" We highly recommend that you change it.\n");
- }
- }
-
- if (gm_pass[0] == '\0') {
- ShowWarning("'To GM become' password is void (gm_pass).\n");
- ShowWarning(" We highly recommend that you set one password.\n");
- } else if (strcmp(gm_pass, "gm") == 0) {
- ShowWarning("You are using the default GM password (gm_pass).\n");
- ShowWarning(" We highly recommend that you change it.\n");
- }
-
- if (level_new_gm < 0 || level_new_gm > 99) {
- ShowWarning("Invalid value for level_new_gm parameter -> setting to 60 (default).\n");
- level_new_gm = 60;
- }
-
- if (new_account_flag != 0 && new_account_flag != 1) {
- ShowWarning("Invalid value for new_account parameter -> setting to 0 (no new account).\n");
- new_account_flag = 0;
- }
-
- if (login_port < 1024 || login_port > 65535) {
- ShowWarning("Invalid value for login_port parameter -> setting to 6900 (default).\n");
- login_port = 6900;
- }
-
- if (gm_account_filename_check_timer < 0) {
- ShowWarning("Invalid value for gm_account_filename_check_timer parameter. Setting to 15 sec (default).\n");
- gm_account_filename_check_timer = 15;
- } else if (gm_account_filename_check_timer == 1) {
- ShowWarning("Invalid value for gm_account_filename_check_timer parameter. Setting to 2 sec (minimum value).\n");
- gm_account_filename_check_timer = 2;
- }
-
- if (save_unknown_packets != 0 && save_unknown_packets != 1) {
- ShowWarning("Invalid value for save_unknown_packets parameter -> setting to 0-no save.\n");
- save_unknown_packets = 0;
- }
-
- if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes
- ShowWarning("Invalid value for display_parse_login parameter -> setting to 0 (no display).\n");
- display_parse_login = 0;
- }
-
- if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes
- ShowWarning("Invalid value for display_parse_admin parameter -> setting to 0 (no display).\n");
- display_parse_admin = 0;
- }
-
- if (display_parse_fromchar < 0 || display_parse_fromchar > 2) { // 0: no, 1: yes (without packet 0x2714), 2: all packets
- ShowWarning("Invalid value for display_parse_fromchar parameter -> setting to 0 (no display).\n");
- display_parse_fromchar = 0;
- }
-
- if (min_level_to_connect < 0) { // 0: all players, 1-99 at least gm level x
- ShowWarning("Invalid value for min_level_to_connect (%d) parameter -> setting 0 (any player).\n", min_level_to_connect);
- min_level_to_connect = 0;
- } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x
- ShowWarning("Invalid value for min_level_to_connect (%d) parameter -> setting to 99 (only GM level 99)\n", min_level_to_connect);
- min_level_to_connect = 99;
- }
-
- if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes
- ShowWarning("Invalid value for add_to_unlimited_account parameter\n");
- ShowWarning(" -> setting to 0 (impossible to add a time to an unlimited account).\n");
- add_to_unlimited_account = 0;
- }
-
- if (start_limited_time < -1) { // -1: create unlimited account, 0 or more: additionnal sec from now to create limited time
- ShowWarning("Invalid value for start_limited_time parameter\n");
- ShowWarning(" -> setting to -1 (new accounts are created with unlimited time).\n");
- start_limited_time = -1;
- }
-
- if (check_ip_flag != 0 && check_ip_flag != 1) { // 0: no, 1: yes
- ShowWarning("Invalid value for check_ip_flag parameter\n");
- ShowWarning(" -> setting to 1 (check players ip between login-server & char-server).\n");
- check_ip_flag = 1;
- }
-
- if (access_order == ACO_DENY_ALLOW) {
- if (access_denynum == 1 && access_deny[0] == '\0') {
- ShowWarning("The IP security order is 'deny,allow' (allow if not deny) and you refuse ALL IP.\n");
- }
- } else if (access_order == ACO_ALLOW_DENY) {
- if (access_allownum == 0) {
- ShowWarning("The IP security order is 'allow,deny' (deny if not allow) but, NO IP IS AUTHORISED!\n");
- }
- } else { // ACO_MUTUAL_FAILTURE
- if (access_allownum == 0) {
- ShowWarning("The IP security order is 'mutual-failture'\n");
- ShowWarning(" (allow if in the allow list and not in the deny list).\n");
- ShowWarning(" But, NO IP IS AUTHORISED!\n");
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- ShowWarning("The IP security order is mutual-failture\n");
- ShowWarning(" (allow if in the allow list and not in the deny list).\n");
- ShowWarning(" But, you refuse ALL IP!\n");
- }
- }
-
- if (dynamic_pass_failure_ban != 0) {
- if (dynamic_pass_failure_ban_time < 1) {
- ShowWarning("Invalid value for dynamic_pass_failure_ban_time (%d) parameter\n", dynamic_pass_failure_ban_time);
- ShowWarning(" -> setting to 5 (5 minutes to look number of invalid passwords.\n");
- dynamic_pass_failure_ban_time = 5;
- }
- if (dynamic_pass_failure_ban_how_many < 1) {
- ShowWarning("Invalid value for dynamic_pass_failure_ban_how_many (%d) parameter\n", dynamic_pass_failure_ban_how_many);
- ShowWarning(" -> setting to 3 (3 invalid passwords before to temporarily ban.\n");
- dynamic_pass_failure_ban_how_many = 3;
- }
- if (dynamic_pass_failure_ban_how_long < 1) {
- ShowWarning("Invalid value for dynamic_pass_failure_ban_how_long (%d) parameter\n", dynamic_pass_failure_ban_how_long);
- ShowWarning(" -> setting to 1 (1 minute of temporarily ban.\n");
- dynamic_pass_failure_ban_how_long = 1;
- }
- }
-
- return;
-}
-
-//-------------------------------
-// Save configuration in log file
-//-------------------------------
-void save_config_in_log(void) {
- int i;
-
- // a newline in the log...
- login_log("");
- login_log("The login-server starting..." RETCODE);
-
- // save configuration in log file
- login_log("The configuration of the server is set:" RETCODE);
-
- if (admin_state != 1)
- login_log("- with no remote administration." RETCODE);
- else if (admin_pass[0] == '\0')
- login_log("- with a remote administration with a VOID password." RETCODE);
- else if (strcmp(admin_pass, "admin") == 0)
- login_log("- with a remote administration with the DEFAULT password." RETCODE);
- else
- login_log("- with a remote administration with the password of %d character(s)." RETCODE, strlen(admin_pass));
- if (access_ladmin_allownum == 0 || (access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) {
- login_log("- to accept any IP for remote administration" RETCODE);
- } else {
- login_log("- to accept following IP for remote administration:" RETCODE);
- for(i = 0; i < access_ladmin_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_ladmin_allow + i * ACO_STRSIZE));
- }
-
- if (gm_pass[0] == '\0')
- login_log("- with a VOID 'To GM become' password (gm_pass)." RETCODE);
- else if (strcmp(gm_pass, "gm") == 0)
- login_log("- with the DEFAULT 'To GM become' password (gm_pass)." RETCODE);
- else
- login_log("- with a 'To GM become' password (gm_pass) of %d character(s)." RETCODE, strlen(gm_pass));
- if (level_new_gm == 0)
- login_log("- to refuse any creation of GM with @gm." RETCODE);
- else
- login_log("- to create GM with level '%d' when @gm is used." RETCODE, level_new_gm);
-
- if (new_account_flag == 1)
- login_log("- to ALLOW new users (with _F/_M)." RETCODE);
- else
- login_log("- to NOT ALLOW new users (with _F/_M)." RETCODE);
- login_log("- with port: %d." RETCODE, login_port);
- login_log("- with the accounts file name: '%s'." RETCODE, account_filename);
- login_log("- with the GM accounts file name: '%s'." RETCODE, GM_account_filename);
- if (gm_account_filename_check_timer == 0)
- login_log("- to NOT check GM accounts file modifications." RETCODE);
- else
- login_log("- to check GM accounts file modifications every %d seconds." RETCODE, gm_account_filename_check_timer);
-
- if (use_md5_passwds == 0)
- login_log("- to save password in plain text." RETCODE);
- else
- login_log("- to save password with MD5 encrypting." RETCODE);
-
- // not necessary to log the 'login_log_filename', we are inside :)
-
- login_log("- with the unknown packets file name: '%s'." RETCODE, login_log_unknown_packets_filename);
- if (save_unknown_packets)
- login_log("- to SAVE all unkown packets." RETCODE);
- else
- login_log("- to SAVE only unkown packets sending by a char-server or a remote administration." RETCODE);
- if (display_parse_login)
- login_log("- to display normal parse packets on console." RETCODE);
- else
- login_log("- to NOT display normal parse packets on console." RETCODE);
- if (display_parse_admin)
- login_log("- to display administration parse packets on console." RETCODE);
- else
- login_log("- to NOT display administration parse packets on console." RETCODE);
- if (display_parse_fromchar)
- login_log("- to display char-server parse packets on console." RETCODE);
- else
- login_log("- to NOT display char-server parse packets on console." RETCODE);
-
- if (min_level_to_connect == 0) // 0: all players, 1-99 at least gm level x
- login_log("- with no minimum level for connection." RETCODE);
- else if (min_level_to_connect == 99)
- login_log("- to accept only GM with level 99." RETCODE);
- else
- login_log("- to accept only GM with level %d or more." RETCODE, min_level_to_connect);
-
- if (add_to_unlimited_account)
- login_log("- to authorize adjustment (with timeadd ladmin) on an unlimited account." RETCODE);
- else
- login_log("- to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before." RETCODE);
-
- if (start_limited_time < 0)
- login_log("- to create new accounts with an unlimited time." RETCODE);
- else if (start_limited_time == 0)
- login_log("- to create new accounts with a limited time: time of creation." RETCODE);
- else
- login_log("- to create new accounts with a limited time: time of creation + %d second(s)." RETCODE, start_limited_time);
-
- if (check_ip_flag)
- login_log("- with control of players IP between login-server and char-server." RETCODE);
- else
- login_log("- to not check players IP between login-server and char-server." RETCODE);
-
- if (access_order == ACO_DENY_ALLOW) {
- if (access_denynum == 0) {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP." RETCODE);
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse ALL IP." RETCODE);
- } else {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). Refused IP are:" RETCODE);
- for(i = 0; i < access_denynum; i++)
- login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
- }
- } else if (access_order == ACO_ALLOW_DENY) {
- if (access_allownum == 0) {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). But, NO IP IS AUTHORISED!" RETCODE);
- } else if (access_allownum == 1 && access_allow[0] == '\0') {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). You authorise ALL IP." RETCODE);
- } else {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). Authorised IP are:" RETCODE);
- for(i = 0; i < access_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
- }
- } else { // ACO_MUTUAL_FAILTURE
- login_log("- with the IP security order: 'mutual-failture' (allow if in the allow list and not in the deny list)." RETCODE);
- if (access_allownum == 0) {
- login_log(" But, NO IP IS AUTHORISED!" RETCODE);
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- login_log(" But, you refuse ALL IP!" RETCODE);
- } else {
- if (access_allownum == 1 && access_allow[0] == '\0') {
- login_log(" You authorise ALL IP." RETCODE);
- } else {
- login_log(" Authorised IP are:" RETCODE);
- for(i = 0; i < access_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
- }
- login_log(" Refused IP are:" RETCODE);
- for(i = 0; i < access_denynum; i++)
- login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
- }
-
- // dynamic password error ban
- if (dynamic_pass_failure_ban == 0)
- login_log("- with NO dynamic password error ban." RETCODE);
- else {
- login_log("- with a dynamic password error ban:" RETCODE);
- login_log(" After %d invalid password in %d minutes" RETCODE, dynamic_pass_failure_ban_how_many, dynamic_pass_failure_ban_time);
- login_log(" IP is banned for %d minutes" RETCODE, dynamic_pass_failure_ban_how_long);
- }
- }
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-void do_final(void) {
- int i, fd;
- ShowInfo("Terminating...\n");
- fflush(stdout);
- mmo_auth_sync();
- online_db->destroy(online_db, NULL);
-
- if(auth_dat) aFree(auth_dat);
- if(gm_account_db) aFree(gm_account_db);
- if(access_ladmin_allow) aFree(access_ladmin_allow);
- if(access_allow) aFree(access_allow);
- if(access_deny) aFree(access_deny);
- for (i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0) {
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_char_server));
- do_close(fd);
- }
- }
- do_close(login_fd);
-
- login_log("----End of login-server (normal end with closing of all files)." RETCODE);
-
- if(log_fp)
- fclose(log_fp);
- ShowStatus("Finished.\n");
-}
-
-//------------------------------
-// Main function of login-server
-//------------------------------
-void set_server_type(void)
-{
- SERVER_TYPE = ATHENA_SERVER_LOGIN;
-}
-int do_init(int argc, char **argv) {
- int i, j;
-
- // read login-server configuration
- login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME);
- display_conf_warnings(); // not in login_config_read, because we can use 'import' option, and display same message twice or more
- save_config_in_log(); // not before, because log file name can be changed
- login_lan_config_read((argc > 2) ? argv[2] : LAN_CONF_NAME);
-
- srand((unsigned int)time(NULL));
-
- for(i = 0; i< AUTH_FIFO_SIZE; i++)
- auth_fifo[i].delflag = 1;
- for(i = 0; i < MAX_SERVERS; i++)
- server_fd[i] = -1;
-
- gm_account_db = NULL;
- GM_num = 0;
- GM_max = 0;
- mmo_auth_init();
- read_gm_account();
- set_defaultparse(parse_login);
- // Online user database init
- online_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); // reinitialise
- add_timer_func_list(waiting_disconnect_timer, "waiting_disconnect_timer");
-
- login_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,login_port);
-
- add_timer_func_list(check_auth_sync, "check_auth_sync");
- add_timer_interval(gettick() + 60000, check_auth_sync, 0, 0, 60000); // every 60 sec we check if we must save accounts file (only if necessary to save)
-
- // add timer to check GM accounts file modification
- j = gm_account_filename_check_timer;
- if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists)
- j = 60;
-
- add_timer_func_list(check_GM_file, "check_GM_file");
- add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
-
-
- add_timer_func_list(online_data_cleanup, "online_data_cleanup");
- add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600*1000); // every 10 minutes cleanup online account db.
-
- if (ip_sync_interval) {
- add_timer_func_list(sync_ip_addresses, "sync_ip_addresses");
- add_timer_interval(gettick() + ip_sync_interval, sync_ip_addresses, 0, 0, ip_sync_interval);
- }
- if(console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- login_log("The login-server is ready (Server is listening on the port %d)." RETCODE, login_port);
- ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", login_port);
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// new version of the login-server by [Yor]
+
+#include <sys/types.h>
+#ifdef __WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+#include "../common/version.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/malloc.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+#include "login.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+int account_id_count = START_ACCOUNT_NUM;
+int server_num;
+int new_account_flag = 0;
+in_addr_t bind_ip= 0;
+char bind_ip_str[128];
+int login_port = 6900;
+
+// Advanced subnet check [LuzZza]
+struct _subnet {
+ long subnet;
+ long mask;
+ long char_ip;
+ long map_ip;
+} subnet[16];
+
+int subnet_count = 0;
+
+int use_dnsbl=0; // [Zido]
+char dnsbl_servs[1024]; // [Zido]
+
+char account_filename[1024] = "save/account.txt";
+char GM_account_filename[1024] = "conf/GM_account.txt";
+char login_log_filename[1024] = "log/login.log";
+FILE *log_fp = NULL;
+char login_log_unknown_packets_filename[1024] = "log/login_unknown_packets.log";
+char date_format[32] = "%Y-%m-%d %H:%M:%S";
+int save_unknown_packets = 0;
+long creation_time_GM_account_file;
+int gm_account_filename_check_timer = 15; // Timer to check if GM_account file has been changed and reload GM account automaticaly (in seconds; default: 15)
+
+int log_login = 1;
+
+int display_parse_login = 0; // 0: no, 1: yes
+int display_parse_admin = 0; // 0: no, 1: yes
+int display_parse_fromchar = 0; // 0: no, 1: yes (without packet 0x2714), 2: all packets
+
+struct mmo_char_server server[MAX_SERVERS];
+int server_fd[MAX_SERVERS];
+
+int login_fd;
+
+static int online_check=1; //When set to 1, login server rejects incoming players that are already registered as online. [Skotlex]
+//Account flood protection [Kevin]
+unsigned int new_reg_tick=0;
+int allowed_regs=1;
+int num_regs=0;
+int time_allowed=10; //Init this to 10 seconds. [Skotlex]
+
+enum {
+ ACO_DENY_ALLOW = 0,
+ ACO_ALLOW_DENY,
+ ACO_MUTUAL_FAILTURE,
+ ACO_STRSIZE = 128,
+};
+
+int access_order = ACO_DENY_ALLOW;
+int access_allownum = 0;
+int access_denynum = 0;
+char *access_allow = NULL;
+char *access_deny = NULL;
+
+int access_ladmin_allownum = 0;
+char *access_ladmin_allow = NULL;
+
+int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
+int add_to_unlimited_account = 0; // Give possibility or not to adjust (ladmin command: timeadd) the time of an unlimited account.
+int start_limited_time = -1; // Starting additional sec from now for the limited time at creation of accounts (-1: unlimited time, 0 or more: additional sec from now)
+int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
+
+int check_client_version = 0; //Client version check ON/OFF .. (sirius)
+int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
+static int ip_sync_interval = 0;
+
+
+struct login_session_data {
+ unsigned int md5keylen;
+ char md5key[20];
+};
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id, login_id1, login_id2;
+ int ip, sex, delflag;
+} auth_fifo[AUTH_FIFO_SIZE];
+int auth_fifo_pos = 0;
+
+struct online_login_data {
+ int account_id;
+ short char_server;
+ short waiting_disconnect;
+};
+
+struct auth_dat {
+ int account_id, sex;
+ char userid[24], pass[33], lastlogin[24]; // 33 for 32 + NULL terminated
+ int logincount;
+ int state; // packet 0x006a value + 1 (0: compte OK)
+ char email[40]; // e-mail (by default: a@a.com)
+ char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a)
+ time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+ char last_ip[16]; // save of last IP of connection
+ char memo[255]; // a memo field
+ int account_reg2_num;
+ struct global_reg account_reg2[ACCOUNT_REG2_NUM];
+} *auth_dat = NULL;
+
+unsigned int auth_num = 0, auth_max = 0;
+
+// define the number of times that some players must authentify them before to save account file.
+// it's just about normal authentification. If an account is created or modified, save is immediatly done.
+// An authentification just change last connected IP and date. It already save in log file.
+// set minimum auth change before save:
+#define AUTH_BEFORE_SAVE_FILE 10
+// set divider of auth_num to found number of change before save
+#define AUTH_SAVE_FILE_DIVIDER 50
+int auth_before_save_file = 0; // Counter. First save when 1st char-server do connection.
+
+int admin_state = 0;
+char admin_pass[24] = "";
+unsigned int GM_num;
+unsigned int GM_max=256;
+char gm_pass[64] = "";
+int level_new_gm = 60;
+
+struct gm_account *gm_account_db;
+
+static struct dbt *online_db;
+
+int dynamic_pass_failure_ban = 1;
+int dynamic_pass_failure_ban_time = 5;
+int dynamic_pass_failure_ban_how_many = 3;
+int dynamic_pass_failure_ban_how_long = 1;
+
+int use_md5_passwds = 0;
+
+int console = 0;
+
+int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len);
+
+//------------------------------
+// Writing function of logs file
+//------------------------------
+int login_log(char *fmt, ...) {
+ if (log_login) {
+ va_list ap;
+ time_t raw_time;
+ char tmpstr[2048];
+
+ if(!log_fp)
+ log_fp = fopen(login_log_filename, "a");
+
+ if (log_fp) {
+ if (fmt[0] == '\0') // jump a line if no message
+ fprintf(log_fp, RETCODE);
+ else {
+ va_start(ap, fmt);
+ // Platform/Compiler dependant clock() for time check is removed. [Lance]
+ // clock() is originally used to track processing ticks on program execution.
+ time(&raw_time);
+ strftime(tmpstr, 24, date_format, localtime(&raw_time));
+ sprintf(tmpstr + strlen(tmpstr), ": %s", fmt);
+ vfprintf(log_fp, tmpstr, ap);
+ va_end(ap);
+ }
+ fflush(log_fp); // under cygwin or windows, if software is stopped, data are not written in the file -> fflush at every line
+ }
+ }
+
+ return 0;
+}
+
+static void* create_online_user(DBKey key, va_list args) {
+ struct online_login_data *p;
+ p = aCalloc(1, sizeof(struct online_login_data));
+ p->account_id = key.i;
+ p->char_server = -1;
+ return p;
+}
+//-----------------------------------------------------
+// Online User Database [Wizputer]
+//-----------------------------------------------------
+
+void add_online_user (int char_server, int account_id) {
+ struct online_login_data *p;
+ if (!online_check)
+ return;
+ p = idb_ensure(online_db, account_id, create_online_user);
+ p->char_server = char_server;
+ p->waiting_disconnect = 0;
+}
+int is_user_online (int account_id) {
+ return (idb_get(online_db, account_id) != NULL);
+}
+void remove_online_user (int account_id) {
+ if(!online_check)
+ return;
+ if (account_id == 99) { // reset all to offline
+ online_db->clear(online_db, NULL); // purge db
+ return;
+ }
+ idb_remove(online_db,account_id);
+}
+
+int waiting_disconnect_timer(int tid, unsigned int tick, int id, int data)
+{
+ struct online_login_data *p;
+ if ((p= idb_get(online_db, id)) != NULL && p->waiting_disconnect)
+ remove_online_user(p->account_id);
+ return 0;
+}
+
+static int sync_ip_addresses(int tid, unsigned int tick, int id, int data){
+ unsigned char buf[2];
+ ShowInfo("IP Sync in progress...\n");
+ WBUFW(buf,0) = 0x2735;
+ charif_sendallwos(-1, buf, 2);
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// Determine if an account (id) is a GM account
+// and returns its level (or 0 if it isn't a GM account or if not found)
+//----------------------------------------------------------------------
+int isGM(int account_id) {
+ unsigned int i;
+ for(i=0; i < GM_num; i++)
+ if(gm_account_db[i].account_id == account_id)
+ return gm_account_db[i].level;
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// Adds a new GM using acc id and level
+//----------------------------------------------------------------------
+void addGM(int account_id, int level) {
+ unsigned int i;
+ int do_add = 0;
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id==account_id) {
+ do_add = 1;
+ break;
+ }
+ }
+ for(i = 0; i < GM_num; i++)
+ if (gm_account_db[i].account_id == account_id) {
+ if (gm_account_db[i].level == level)
+ ShowWarning("addGM: GM account %d defined twice (same level: %d).\n", account_id, level);
+ else {
+ ShowWarning("addGM: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
+ gm_account_db[i].level = level;
+ }
+ return;
+ }
+
+ // if new account
+ if (i == GM_num && do_add) {
+ if (GM_num >= GM_max) {
+ GM_max += 256;
+ gm_account_db = (struct gm_account*)aRealloc(gm_account_db, sizeof(struct gm_account) * GM_max);
+ memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256);
+ }
+ gm_account_db[GM_num].account_id = account_id;
+ gm_account_db[GM_num].level = level;
+ GM_num++;
+ if (GM_num >= 4000) {
+ ShowWarning("4000 GM accounts found. Next GM accounts are not read.\n");
+ login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not read." RETCODE);
+ }
+ }
+}
+
+//-------------------------------------------------------
+// Reading function of GM accounts file (and their level)
+//-------------------------------------------------------
+int read_gm_account(void) {
+ char line[512];
+ FILE *fp;
+ int account_id, level;
+ int line_counter;
+ struct stat file_stat;
+ int start_range = 0, end_range = 0, is_range = 0, current_id = 0;
+
+ if(gm_account_db) aFree(gm_account_db);
+ GM_num = 0;
+ if(GM_max < 0) GM_max = 256;
+ gm_account_db = (struct gm_account*)aCalloc(GM_max, sizeof(struct gm_account));
+
+ // get last modify time/date
+ if (stat(GM_account_filename, &file_stat))
+ creation_time_GM_account_file = 0; // error
+ else
+ creation_time_GM_account_file = (long)file_stat.st_mtime;
+
+ if ((fp = fopen(GM_account_filename, "r")) == NULL) {
+ ShowError("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename);
+ ShowError(" Actually, there is no GM accounts on the server.\n");
+ login_log("read_gm_account: GM accounts file [%s] not found." RETCODE, GM_account_filename);
+ login_log(" Actually, there is no GM accounts on the server." RETCODE);
+ return 1;
+ }
+
+ line_counter = 0;
+ // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
+ // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
+ while(fgets(line, sizeof(line)-1, fp) && GM_num < 4000) {
+ line_counter++;
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
+ continue;
+ is_range = (sscanf(line, "%d%*[-~]%d %d",&start_range,&end_range,&level)==3); // ID Range [MC Cameri]
+ if (!is_range && sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
+ ShowError("read_gm_account: file [%s], invalid 'acount_id|range level' format (line #%d).\n", GM_account_filename, line_counter);
+ else if (level <= 0)
+ ShowError("read_gm_account: file [%s] %dth account (line #%d) (invalid level [0 or negative]: %d).\n", GM_account_filename, GM_num+1, line_counter, level);
+ else {
+ if (level > 99) {
+ ShowNotice("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
+ level = 99;
+ }
+ if (is_range) {
+ if (start_range==end_range)
+ ShowError("read_gm_account: file [%s] invalid range, beginning of range is equal to end of range (line #%d).\n", GM_account_filename, line_counter);
+ else if (start_range>end_range)
+ ShowError("read_gm_account: file [%s] invalid range, beginning of range must be lower than end of range (line #%d).\n", GM_account_filename, line_counter);
+ else
+ for (current_id = start_range;current_id<=end_range;current_id++)
+ addGM(current_id,level);
+ } else {
+ addGM(account_id,level);
+ }
+ }
+ }
+ fclose(fp);
+
+ ShowStatus("read_gm_account: file '%s' read (%d GM accounts found).\n", GM_account_filename, GM_num);
+ login_log("read_gm_account: file '%s' read (%d GM accounts found)." RETCODE, GM_account_filename, GM_num);
+
+ return 0;
+}
+
+//--------------------------------------------------------------
+// Test of the IP mask
+// (ip: IP to be tested, str: mask x.x.x.x/# or x.x.x.x/y.y.y.y)
+//--------------------------------------------------------------
+int check_ipmask(unsigned int ip, const unsigned char *str) {
+ unsigned int mask = 0, i = 0, m, ip2, a0, a1, a2, a3;
+ unsigned char *p = (unsigned char *)&ip2, *p2 = (unsigned char *)&mask;
+
+ if (sscanf((const char*)str, "%d.%d.%d.%d/%n", &a0, &a1, &a2, &a3, &i) != 4 || i == 0)
+ return 0;
+ p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
+
+ if (sscanf((const char*)str+i, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) == 4) {
+ p2[0] = a0; p2[1] = a1; p2[2] = a2; p2[3] = a3;
+ mask = ntohl(mask);
+ } else if (sscanf((const char*)(str+i), "%d", &m) == 1 && m >= 0 && m <= 32) {
+ for(i = 0; i < m && i < 32; i++)
+ mask = (mask >> 1) | 0x80000000;
+ } else {
+ ShowError("check_ipmask: invalid mask [%s].\n", str);
+ return 0;
+ }
+
+// printf("Tested IP: %08x, network: %08x, network mask: %08x\n",
+// (unsigned int)ntohl(ip), (unsigned int)ntohl(ip2), (unsigned int)mask);
+ return ((ntohl(ip) & mask) == (ntohl(ip2) & mask));
+}
+
+//---------------------
+// Access control by IP
+//---------------------
+int check_ip(unsigned int ip) {
+ int i;
+ unsigned char *p = (unsigned char *)&ip;
+ char buf[20];
+ char * access_ip;
+ enum { ACF_DEF, ACF_ALLOW, ACF_DENY } flag = ACF_DEF;
+
+ if (access_allownum == 0 && access_denynum == 0)
+ return 1; // When there is no restriction, all IP are authorised.
+
+// + 012.345.: front match form, or
+// all: all IP are matched, or
+// 012.345.678.901/24: network form (mask with # of bits), or
+// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
+// + Note about the DNS resolution (like www.ne.jp, etc.):
+// There is no guarantee to have an answer.
+// If we have an answer, there is no guarantee to have a 100% correct value.
+// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
+// So, DNS notation isn't authorised for ip checking.
+ sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
+
+ for(i = 0; i < access_allownum; i++) {
+ access_ip = access_allow + i * ACO_STRSIZE;
+ if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
+ if(access_order == ACO_ALLOW_DENY)
+ return 1; // With 'allow, deny' (deny if not allow), allow has priority
+ flag = ACF_ALLOW;
+ break;
+ }
+ }
+
+ for(i = 0; i < access_denynum; i++) {
+ access_ip = access_deny + i * ACO_STRSIZE;
+ if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
+ //flag = ACF_DENY; // not necessary to define flag
+ return 0; // At this point, if it's 'deny', we refuse connection.
+ }
+ }
+
+ return (flag == ACF_ALLOW || access_order == ACO_DENY_ALLOW) ? 1:0;
+ // With 'mutual-failture', only 'allow' and non 'deny' IP are authorised.
+ // A non 'allow' (even non 'deny') IP is not authorised. It's like: if allowed and not denied, it's authorised.
+ // So, it's disapproval if you have no description at the time of 'mutual-failture'.
+ // With 'deny,allow' (allow if not deny), because here it's not deny, we authorise.
+}
+
+//--------------------------------
+// Access control by IP for ladmin
+//--------------------------------
+int check_ladminip(unsigned int ip) {
+ int i;
+ unsigned char *p = (unsigned char *)&ip;
+ char buf[20];
+ char * access_ip;
+
+ if (access_ladmin_allownum == 0)
+ return 1; // When there is no restriction, all IP are authorised.
+
+// + 012.345.: front match form, or
+// all: all IP are matched, or
+// 012.345.678.901/24: network form (mask with # of bits), or
+// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
+// + Note about the DNS resolution (like www.ne.jp, etc.):
+// There is no guarantee to have an answer.
+// If we have an answer, there is no guarantee to have a 100% correct value.
+// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
+// So, DNS notation isn't authorised for ip checking.
+ sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
+
+ for(i = 0; i < access_ladmin_allownum; i++) {
+ access_ip = access_ladmin_allow + i * ACO_STRSIZE;
+ if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+//---------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid).
+//---------------------------------------------------
+int e_mail_check(char *email) {
+ char ch;
+ char* last_arobas;
+
+ // athena limits
+ if (strlen(email) < 3 || strlen(email) > 39)
+ return 0;
+
+ // part of RFC limits (official reference of e-mail description)
+ if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
+ return 0;
+
+ if (email[strlen(email)-1] == '.')
+ return 0;
+
+ last_arobas = strrchr(email, '@');
+
+ if (strstr(last_arobas, "@.") != NULL ||
+ strstr(last_arobas, "..") != NULL)
+ return 0;
+
+ for(ch = 1; ch < 32; ch++)
+ if (strchr(last_arobas, ch) != NULL)
+ return 0;
+
+ if (strchr(last_arobas, ' ') != NULL ||
+ strchr(last_arobas, ';') != NULL)
+ return 0;
+
+ // all correct
+ return 1;
+}
+
+//-----------------------------------------------
+// Search an account id
+// (return account index or -1 (if not found))
+// If exact account name is not found,
+// the function checks without case sensitive
+// and returns index if only 1 account is found
+// and similar to the searched name.
+//-----------------------------------------------
+int search_account_index(char* account_name) {
+ unsigned int i, quantity;
+ int index;
+
+ quantity = 0;
+ index = -1;
+
+ for(i = 0; i < auth_num; i++) {
+ // Without case sensitive check (increase the number of similar account names found)
+ if (stricmp(auth_dat[i].userid, account_name) == 0) {
+ // Strict comparison (if found, we finish the function immediatly with correct value)
+ if (strcmp(auth_dat[i].userid, account_name) == 0)
+ return i;
+ quantity++;
+ index = i;
+ }
+ }
+ // Here, the exact account name is not found
+ // We return the found index of a similar account ONLY if there is 1 similar account
+ if (quantity == 1)
+ return index;
+
+ // Exact account name is not found and 0 or more than 1 similar accounts have been found ==> we say not found
+ return -1;
+}
+
+//--------------------------------------------------------
+// Create a string to save the account in the account file
+//--------------------------------------------------------
+int mmo_auth_tostr(char *str, struct auth_dat *p) {
+ int i;
+ char *str_p = str;
+
+ str_p += sprintf(str_p, "%d\t%s\t%s\t%s\t%c\t%d\t%d\t"
+ "%s\t%s\t%ld\t%s\t%s\t%ld\t",
+ p->account_id, p->userid, p->pass, p->lastlogin,
+ (p->sex == 2) ? 'S' : (p->sex ? 'M' : 'F'),
+ p->logincount, p->state,
+ p->email, p->error_message,
+ (long)p->connect_until_time, p->last_ip, p->memo, (long)p->ban_until_time);
+
+ for(i = 0; i < p->account_reg2_num; i++)
+ if (p->account_reg2[i].str[0])
+ str_p += sprintf(str_p, "%s,%s ", p->account_reg2[i].str, p->account_reg2[i].value);
+
+ return 0;
+}
+
+//---------------------------------
+// Reading of the accounts database
+//---------------------------------
+int mmo_auth_init(void) {
+ FILE *fp;
+ int account_id, logincount, state, n, i;
+ unsigned int j;
+ char line[2048], *p, userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
+ long ban_until_time;
+ long connect_until_time;
+ char str[2048];
+ char v[2048];
+ int GM_count = 0;
+ int server_count = 0;
+
+ auth_max = 256;
+ auth_dat = (struct auth_dat*)aCalloc(auth_max, sizeof(struct auth_dat));
+
+ if ((fp = fopen(account_filename, "r")) == NULL) {
+ // no account file -> no account -> no login, including char-server (ERROR)
+ ShowError(CL_RED"mmmo_auth_init: Accounts file [%s] not found."CL_RESET"\n", account_filename);
+ return 0;
+ }
+
+ while(fgets(line, sizeof(line)-1, fp) != NULL) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ line[sizeof(line)-1] = '\0';
+ // remove carriage return if exist
+ while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
+ line[strlen(line)-1] = '\0';
+ p = line;
+
+ memset(userid, 0, sizeof(userid));
+ memset(pass, 0, sizeof(pass));
+ memset(lastlogin, 0, sizeof(lastlogin));
+ memset(email, 0, sizeof(email));
+ memset(error_message, 0, sizeof(error_message));
+ memset(last_ip, 0, sizeof(last_ip));
+ memset(memo, 0, sizeof(memo));
+
+ // database version reading (v2)
+ if (((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
+ "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
+ &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
+ email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n)) == 13 && line[n] == '\t') ||
+ ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
+ "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]%n",
+ &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
+ email, error_message, &connect_until_time, last_ip, memo, &n)) == 12 && line[n] == '\t')) {
+ n = n + 1;
+
+ // Some checks
+ if (account_id > END_ACCOUNT_NUM) {
+ ShowError(CL_RED"mmmo_auth_init: an account has an id higher than %d\n", END_ACCOUNT_NUM);
+ ShowError(" account id #%d -> account not read (saved in log file)."CL_RESET"\n", account_id);
+ login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
+ login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
+ login_log("%s", line);
+ continue;
+ }
+ userid[23] = '\0';
+ remove_control_chars((unsigned char *)userid);
+ for(j = 0; j < auth_num; j++) {
+ if (auth_dat[j].account_id == account_id) {
+ ShowError(CL_RED"mmmo_auth_init: an account has an identical id to another.\n");
+ ShowError(" account id #%d -> new account not read (saved in log file)."CL_RED"\n", account_id);
+ login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
+ login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
+ login_log("%s", line);
+ break;
+ } else if (strcmp(auth_dat[j].userid, userid) == 0) {
+ ShowError(CL_RED"mmmo_auth_init: account name already exists.\n");
+ ShowError(" account name '%s' -> new account not read (saved in log file)."CL_RESET"\n", userid); // 2 lines, account name can be long.
+ login_log("mmmo_auth_init: ******Error: an account has an identical name to another." RETCODE);
+ login_log(" account name '%s' -> new account not read (saved in next line):" RETCODE, userid);
+ login_log("%s", line);
+ break;
+ }
+ }
+ if (j != auth_num)
+ continue;
+
+ if (auth_num >= auth_max) {
+ auth_max += 256;
+ auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
+ }
+
+ memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
+
+ auth_dat[auth_num].account_id = account_id;
+
+ strncpy(auth_dat[auth_num].userid, userid, 24);
+
+ pass[23] = '\0';
+ remove_control_chars((unsigned char *)pass);
+ strncpy(auth_dat[auth_num].pass, pass, 24);
+
+ lastlogin[23] = '\0';
+ remove_control_chars((unsigned char *)lastlogin);
+ strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
+
+ auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
+
+ if (logincount >= 0)
+ auth_dat[auth_num].logincount = logincount;
+ else
+ auth_dat[auth_num].logincount = 0;
+
+ if (state > 255)
+ auth_dat[auth_num].state = 100;
+ else if (state < 0)
+ auth_dat[auth_num].state = 0;
+ else
+ auth_dat[auth_num].state = state;
+
+ if (e_mail_check(email) == 0) {
+ ShowNotice("Account %s (%d): invalid e-mail (replaced par a@a.com).\n", auth_dat[auth_num].userid, auth_dat[auth_num].account_id);
+ strncpy(auth_dat[auth_num].email, "a@a.com", 40);
+ } else {
+ remove_control_chars((unsigned char *)email);
+ strncpy(auth_dat[auth_num].email, email, 40);
+ }
+
+ error_message[19] = '\0';
+ remove_control_chars((unsigned char *)error_message);
+ if (error_message[0] == '\0' || state != 7) { // 7, because state is packet 0x006a value + 1
+ strncpy(auth_dat[auth_num].error_message, "-", 20);
+ } else {
+ strncpy(auth_dat[auth_num].error_message, error_message, 20);
+ }
+
+ if (i == 13)
+ auth_dat[auth_num].ban_until_time = (time_t)ban_until_time;
+ else
+ auth_dat[auth_num].ban_until_time = 0;
+
+ auth_dat[auth_num].connect_until_time = (time_t)connect_until_time;
+
+ last_ip[15] = '\0';
+ remove_control_chars((unsigned char *)last_ip);
+ strncpy(auth_dat[auth_num].last_ip, last_ip, 16);
+
+ memo[254] = '\0';
+ remove_control_chars((unsigned char *)memo);
+ strncpy(auth_dat[auth_num].memo, memo, 255);
+
+ for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
+ p += n;
+ if (sscanf(p, "%[^\t,],%[^\t ] %n", str, v, &n) != 2) {
+ // We must check if a str is void. If it's, we can continue to read other REG2.
+ // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
+ if (p[0] == ',' && sscanf(p, ",%[^\t ] %n", v, &n) == 1) {
+ j--;
+ continue;
+ } else
+ break;
+ }
+ str[31] = '\0';
+ remove_control_chars((unsigned char *)str);
+ strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
+ strncpy(auth_dat[auth_num].account_reg2[j].value,v,256);
+ }
+ auth_dat[auth_num].account_reg2_num = j;
+
+ if (isGM(account_id) > 0)
+ GM_count++;
+ if (auth_dat[auth_num].sex == 2)
+ server_count++;
+
+ auth_num++;
+ if (account_id >= account_id_count)
+ account_id_count = account_id + 1;
+
+ // Old athena database version reading (v1)
+ } else if ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%n",
+ &account_id, userid, pass, lastlogin, &sex, &logincount, &state, &n)) >= 5) {
+ if (account_id > END_ACCOUNT_NUM) {
+ ShowError(CL_RED"mmmo_auth_init: an account has an id higher than %d\n", END_ACCOUNT_NUM);
+ ShowError(" account id #%d -> account not read (saved in log file)."CL_RESET"\n", account_id);
+ login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
+ login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
+ login_log("%s", line);
+ continue;
+ }
+ userid[23] = '\0';
+ remove_control_chars((unsigned char *)userid);
+ for(j = 0; j < auth_num; j++) {
+ if (auth_dat[j].account_id == account_id) {
+ ShowError(CL_RED"mmo_auth_init: an account has an identical id to another.\n");
+ ShowError(" account id #%d -> new account not read (saved in log file)."CL_RESET"\n", account_id);
+ login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
+ login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
+ login_log("%s", line);
+ break;
+ } else if (strcmp(auth_dat[j].userid, userid) == 0) {
+ ShowError(CL_RED"mmo_auth_init: account name already exists.\n");
+ ShowError(" account name '%s' -> new account not read (saved in log file)."CL_RESET"\n", userid);
+ login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
+ login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
+ login_log("%s", line);
+ break;
+ }
+ }
+ if (j != auth_num)
+ continue;
+
+ if (auth_num >= auth_max) {
+ auth_max += 256;
+ auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
+ }
+
+ memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
+
+ auth_dat[auth_num].account_id = account_id;
+
+ strncpy(auth_dat[auth_num].userid, userid, 24);
+
+ pass[23] = '\0';
+ remove_control_chars((unsigned char *)pass);
+ strncpy(auth_dat[auth_num].pass, pass, 24);
+
+ lastlogin[23] = '\0';
+ remove_control_chars((unsigned char *)lastlogin);
+ strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
+
+ auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
+
+ if (i >= 6) {
+ if (logincount >= 0)
+ auth_dat[auth_num].logincount = logincount;
+ else
+ auth_dat[auth_num].logincount = 0;
+ } else
+ auth_dat[auth_num].logincount = 0;
+
+ if (i >= 7) {
+ if (state > 255)
+ auth_dat[auth_num].state = 100;
+ else if (state < 0)
+ auth_dat[auth_num].state = 0;
+ else
+ auth_dat[auth_num].state = state;
+ } else
+ auth_dat[auth_num].state = 0;
+
+ // Initialization of new data
+ strncpy(auth_dat[auth_num].email, "a@a.com", 40);
+ strncpy(auth_dat[auth_num].error_message, "-", 20);
+ auth_dat[auth_num].ban_until_time = 0;
+ auth_dat[auth_num].connect_until_time = 0;
+ strncpy(auth_dat[auth_num].last_ip, "-", 16);
+ strncpy(auth_dat[auth_num].memo, "-", 255);
+
+ for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
+ p += n;
+ if (sscanf(p, "%[^\t,],%[^\t ] %n", str, v, &n) != 2) {
+ // We must check if a str is void. If it's, we can continue to read other REG2.
+ // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
+ if (p[0] == ',' && sscanf(p, ",%[^\t ] %n", v, &n) == 1) {
+ j--;
+ continue;
+ } else
+ break;
+ }
+ str[31] = '\0';
+ remove_control_chars((unsigned char *)str);
+ strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
+ strncpy(auth_dat[auth_num].account_reg2[j].value,v,256);
+ }
+ auth_dat[auth_num].account_reg2_num = j;
+
+ if (isGM(account_id) > 0)
+ GM_count++;
+ if (auth_dat[auth_num].sex == 2)
+ server_count++;
+
+ auth_num++;
+ if (account_id >= account_id_count)
+ account_id_count = account_id + 1;
+
+ } else {
+ i = 0;
+ if (sscanf(line, "%d\t%%newid%%\n%n", &account_id, &i) == 1 &&
+ i > 0 && account_id > account_id_count)
+ account_id_count = account_id;
+ }
+ }
+ fclose(fp);
+
+ if (auth_num == 0) {
+ ShowNotice("mmo_auth_init: No account found in %s.\n", account_filename);
+ sprintf(line, "No account found in %s.", account_filename);
+ } else {
+ if (auth_num == 1) {
+ ShowStatus("mmo_auth_init: 1 account read in %s,\n", account_filename);
+ sprintf(line, "1 account read in %s,", account_filename);
+ } else {
+ ShowStatus("mmo_auth_init: %d accounts read in %s,\n", auth_num, account_filename);
+ sprintf(line, "%d accounts read in %s,", auth_num, account_filename);
+ }
+ if (GM_count == 0) {
+ ShowStatus(" of which is no GM account, and ");
+ sprintf(str, "%s of which is no GM account and", line);
+ } else if (GM_count == 1) {
+ ShowStatus(" of which is 1 GM account, and ");
+ sprintf(str, "%s of which is 1 GM account and", line);
+ } else {
+ ShowStatus(" of which is %d GM accounts, and ", GM_count);
+ sprintf(str, "%s of which is %d GM accounts and", line, GM_count);
+ }
+ if (server_count == 0) {
+ printf("no server account ('S').\n");
+ sprintf(line, "%s no server account ('S').", str);
+ } else if (server_count == 1) {
+ printf("1 server account ('S').\n");
+ sprintf(line, "%s 1 server account ('S').", str);
+ } else {
+ printf("%d server accounts ('S').\n", server_count);
+ sprintf(line, "%s %d server accounts ('S').", str, server_count);
+ }
+ }
+ login_log("%s" RETCODE, line);
+
+ return 0;
+}
+
+//------------------------------------------
+// Writing of the accounts database file
+// (accounts are sorted by id before save)
+//------------------------------------------
+void mmo_auth_sync(void) {
+ FILE *fp;
+ unsigned int i, j, k;
+ int lock;
+ int account_id;
+ //int id[auth_num];
+ //int *id = (int *)aCalloc(auth_num, sizeof(int));
+ CREATE_BUFFER(id, int, auth_num);
+ char line[65536];
+
+ // Sorting before save
+ for(i = 0; i < auth_num; i++) {
+ id[i] = i;
+ account_id = auth_dat[i].account_id;
+ for(j = 0; j < i; j++) {
+ if (account_id < auth_dat[id[j]].account_id) {
+ for(k = i; k > j; k--)
+ id[k] = id[k-1];
+ id[j] = i; // id[i]
+ break;
+ }
+ }
+ }
+
+ // Data save
+ if ((fp = lock_fopen(account_filename, &lock)) == NULL) {
+ //if (id) aFree(id); // aFree, right?
+ DELETE_BUFFER(id);
+ return;
+ }
+
+ fprintf(fp, "// Accounts file: here are saved all information about the accounts.\n");
+ fprintf(fp, "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n");
+ fprintf(fp, "// Some explanations:\n");
+ fprintf(fp, "// account name : between 4 to 23 char for a normal account (standard client can't send less than 4 char).\n");
+ fprintf(fp, "// account password: between 4 to 23 char\n");
+ fprintf(fp, "// sex : M or F for normal accounts, S for server accounts\n");
+ fprintf(fp, "// state : 0: account is ok, 1 to 256: error code of packet 0x006a + 1\n");
+ fprintf(fp, "// email : between 3 to 39 char (a@a.com is like no email)\n");
+ fprintf(fp, "// error message : text for the state 7: 'Your are Prohibited to login until <text>'. Max 19 char\n");
+ fprintf(fp, "// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
+ fprintf(fp, "// memo field : max 254 char\n");
+ fprintf(fp, "// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
+ for(i = 0; i < auth_num; i++) {
+ k = id[i]; // use of sorted index
+ if (auth_dat[k].account_id < 0)
+ continue;
+
+ mmo_auth_tostr(line, &auth_dat[k]);
+ fprintf(fp, "%s" RETCODE, line);
+ }
+ fprintf(fp, "%d\t%%newid%%\n", account_id_count);
+
+ lock_fclose(fp, account_filename, &lock);
+
+ // set new counter to minimum number of auth before save
+ auth_before_save_file = auth_num / AUTH_SAVE_FILE_DIVIDER; // Re-initialise counter. We have save.
+ if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE)
+ auth_before_save_file = AUTH_BEFORE_SAVE_FILE;
+
+ //if (id) aFree(id);
+ DELETE_BUFFER(id);
+
+ return;
+}
+
+//-----------------------------------------------------
+// Check if we must save accounts file or not
+// every minute, we check if we must save because we
+// have do some authentifications without arrive to
+// the minimum of authentifications for the save.
+// Note: all other modification of accounts (deletion,
+// change of some informations excepted lastip/
+// lastlogintime, creation) are always save
+// immediatly and set the minimum of
+// authentifications to its initialization value.
+//-----------------------------------------------------
+int check_auth_sync(int tid, unsigned int tick, int id, int data) {
+ // we only save if necessary:
+ // we have do some authentifications without do saving
+ if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE ||
+ auth_before_save_file < (int)(auth_num / AUTH_SAVE_FILE_DIVIDER))
+ mmo_auth_sync();
+
+ return 0;
+}
+
+//--------------------------------------------------------------------
+// Packet send to all char-servers, except one (wos: without our self)
+//--------------------------------------------------------------------
+int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
+ int i, c, fd;
+
+ for(i = 0, c = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server_fd[i]) >= 0 && fd != sfd) {
+ WFIFOHEAD(fd, len);
+ if (WFIFOSPACE(fd) < len) //Increase buffer size.
+ realloc_writefifo(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd, len);
+ c++;
+ }
+ }
+ return c;
+}
+
+//-----------------------------------------------------
+// Send GM accounts to all char-server
+//-----------------------------------------------------
+void send_GM_accounts(void) {
+ unsigned int i;
+ unsigned char buf[32767];
+ int len;
+
+ len = 4;
+ WBUFW(buf,0) = 0x2732;
+ for(i = 0; i < GM_num; i++)
+ // send only existing accounts. We can not create a GM account when server is online.
+ if (gm_account_db[i].level > 0) {
+ WBUFL(buf,len) = gm_account_db[i].account_id;
+ WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level;
+ len += 5;
+ if (len >= 32000) {
+ ShowWarning("send_GM_accounts: Too many accounts! Only %d out of %d were sent.\n", i, GM_num);
+ break;
+ }
+ }
+ WBUFW(buf,2) = len;
+ charif_sendallwos(-1, buf, len);
+
+ return;
+}
+
+//-----------------------------------------------------
+// Check if GM file account have been changed
+//-----------------------------------------------------
+int check_GM_file(int tid, unsigned int tick, int id, int data) {
+ struct stat file_stat;
+ long new_time;
+
+ // if we would not check
+ if (gm_account_filename_check_timer < 1)
+ return 0;
+
+ // get last modify time/date
+ if (stat(GM_account_filename, &file_stat))
+ new_time = 0; // error
+ else
+ new_time = (long)file_stat.st_mtime;
+
+ if (new_time != creation_time_GM_account_file) {
+ read_gm_account();
+ send_GM_accounts();
+ }
+
+ return 0;
+}
+
+//-------------------------------------
+// Account creation (with e-mail check)
+//-------------------------------------
+int mmo_auth_new(struct mmo_account* account, char sex, char* email) {
+ time_t timestamp, timestamp_temp;
+ struct tm *tmtime;
+ int i = auth_num;
+
+ if (auth_num >= auth_max) {
+ auth_max += 256;
+ auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
+ }
+
+ memset(&auth_dat[i], '\0', sizeof(struct auth_dat));
+
+ while (isGM(account_id_count) > 0)
+ account_id_count++;
+
+ auth_dat[i].account_id = account_id_count++;
+
+ strncpy(auth_dat[i].userid, account->userid, NAME_LENGTH);
+ auth_dat[i].userid[23] = '\0';
+
+ strncpy(auth_dat[i].pass, account->passwd, NAME_LENGTH);
+ auth_dat[i].pass[23] = '\0';
+
+ memcpy(auth_dat[i].lastlogin, "-", 2);
+
+ auth_dat[i].sex = (sex == 'M' || sex == 'm');
+
+ auth_dat[i].logincount = 0;
+
+ auth_dat[i].state = 0;
+
+ if (e_mail_check(email) == 0)
+ strncpy(auth_dat[i].email, "a@a.com", 40);
+ else
+ strncpy(auth_dat[i].email, email, 40);
+
+ strncpy(auth_dat[i].error_message, "-", 20);
+
+ auth_dat[i].ban_until_time = 0;
+
+ if (start_limited_time < 0)
+ auth_dat[i].connect_until_time = 0; // unlimited
+ else { // limited time
+ timestamp = time(NULL) + start_limited_time;
+ // double conversion to be sure that it is possible
+ tmtime = localtime(&timestamp);
+ timestamp_temp = mktime(tmtime);
+ if (timestamp_temp != -1 && (timestamp_temp + 3600) >= timestamp) // check possible value and overflow (and avoid summer/winter hour)
+ auth_dat[i].connect_until_time = timestamp_temp;
+ else
+ auth_dat[i].connect_until_time = 0; // unlimited
+ }
+
+ strncpy(auth_dat[i].last_ip, "-", 16);
+
+ strncpy(auth_dat[i].memo, "-", 255);
+
+ auth_dat[i].account_reg2_num = 0;
+
+ auth_num++;
+
+ return (account_id_count - 1);
+}
+
+//---------------------------------------
+// Check/authentification of a connection
+//---------------------------------------
+int mmo_auth(struct mmo_account* account, int fd) {
+ char *dnsbl_serv;
+ unsigned int i;
+ time_t raw_time;
+ char tmpstr[256];
+ int len, newaccount = 0;
+#ifdef PASSWORDENC
+ struct login_session_data *ld;
+#endif
+ int encpasswdok;
+ char md5str[64], md5bin[32];
+ char ip[16];
+ unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr;
+ char user_password[256];
+ char r_ip[16]; // [Zido]
+ char ip_dnsbl[256]; // [Zido]
+
+ sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
+
+ // Start DNS Blacklist check [Zido]
+ if(use_dnsbl) {
+ sprintf(r_ip, "%d.%d.%d.%d", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
+
+ dnsbl_serv=strtok(dnsbl_servs,",");
+ sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
+// Using directly gethostbyname should be quicker. [Skotlex]
+// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+ if(gethostbyname(ip_dnsbl)) {
+ ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
+ return 3;
+ }
+
+ while((dnsbl_serv=strtok(dnsbl_servs,","))) {
+ sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
+// Using directly gethostbyname should be quicker. [Skotlex]
+// if(resolve_hostbyname(ip_dnsbl,NULL,NULL)!=0) {
+ if(gethostbyname(ip_dnsbl)) {
+ ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
+ return 3;
+ }
+ }
+
+ }
+ // End DNS Blacklist check [Zido]
+
+
+ len = strlen(account->userid) - 2;
+ // Account creation with _M/_F
+ if (account->passwdenc == 0 && account->userid[len] == '_' &&
+ (account->userid[len+1] == 'F' || account->userid[len+1] == 'M' ||
+ account->userid[len+1] == 'f' || account->userid[len+1] == 'm')
+ && new_account_flag && account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
+
+ //only continue if amount in this time limit is allowed (account registration flood protection)[Kevin]
+ if(gettick() <= new_reg_tick && num_regs >= allowed_regs) {
+ ShowNotice("Account registration denied (registration limit exceeded) to %s!\n", ip);
+ login_log("Notice: Account registration denied (registration limit exceeded) to %s!", ip);
+ return 3;
+ } else {
+ num_regs=0;
+ }
+
+ newaccount = 1;
+ account->userid[len] = '\0';
+ }
+
+ //EXE Version check [Sirius]
+ if (check_client_version == 1 && account->version != 0 &&
+ account->version != client_version_to_connect)
+ return 5;
+
+ // Strict account search
+ for(i = 0; i < auth_num; i++) {
+ if (strcmp(account->userid, auth_dat[i].userid) == 0)
+ break;
+ }
+ // if there is no creation request and strict account search fails, we do a no sensitive case research for index
+ if (!newaccount && i == auth_num) {
+ i = search_account_index(account->userid);
+ if (i == -1)
+ i = auth_num;
+ else
+ memcpy(account->userid, auth_dat[i].userid, NAME_LENGTH); // for the possible tests/checks afterwards (copy correcte sensitive case).
+ }
+
+ if (i != auth_num) {
+ if (newaccount) {
+ login_log("Attempt of creation of an already existant account (account: %s_%c, pass: %s, received pass: %s, ip: %s)" RETCODE,
+ account->userid, account->userid[len+1], auth_dat[i].pass, account->passwd, ip);
+ return 1; // 1 = Incorrect Password
+ }
+ if(use_md5_passwds)
+ MD5_String(account->passwd, user_password);
+ else
+ memcpy(user_password, account->passwd, NAME_LENGTH);
+ encpasswdok = 0;
+#ifdef PASSWORDENC
+ ld = (struct login_session_data*)session[fd]->session_data;
+ if (account->passwdenc > 0) {
+ int j = account->passwdenc;
+ if (!ld) {
+ login_log("Md5 key not created (account: %s, ip: %s)" RETCODE, account->userid, ip);
+ return 1; // 1 = Incorrect Password
+ }
+ if (j > 2)
+ j = 1;
+ do {
+ if (j == 1) {
+ sprintf(md5str, "%s%s", ld->md5key, auth_dat[i].pass); // 20 + 24
+ } else if (j == 2) {
+ sprintf(md5str, "%s%s", auth_dat[i].pass, ld->md5key); // 24 + 20
+ } else
+ md5str[0] = '\0';
+ md5str[sizeof(md5str)-1] = '\0'; // 64
+ MD5_String2binary(md5str, md5bin);
+ encpasswdok = (memcmp(account->passwd, md5bin, 16) == 0);
+ } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
+// printf("key[%s] md5 [%s] ", md5key, md5);
+// printf("client [%s] accountpass [%s]\n", account->passwd, auth_dat[i].pass);
+ }
+#endif
+ if ((strcmp(account->passwd, auth_dat[i].pass) && !encpasswdok)) {
+ if (account->passwdenc == 0)
+ login_log("Invalid password (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE, account->userid, auth_dat[i].pass, account->passwd, ip);
+#ifdef PASSWORDENC
+ else {
+ char logbuf[512], *p = logbuf;
+ unsigned int j;
+ p += sprintf(p, "Invalid password (account: %s, received md5[", account->userid);
+ for(j = 0; j < 16; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)account->passwd)[j]);
+ p += sprintf(p,"] calculated md5[");
+ for(j = 0; j < 16; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
+ p += sprintf(p, "] md5 key[");
+ for(j = 0; j < ld->md5keylen; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)ld->md5key)[j]);
+ p += sprintf(p, "], ip: %s)" RETCODE, ip);
+ login_log(logbuf);
+ }
+#endif
+ return 1; // 1 = Incorrect Password
+ }
+
+ if (auth_dat[i].state) {
+ login_log("Connection refused (account: %s, pass: %s, state: %d, ip: %s)" RETCODE,
+ account->userid, account->passwd, auth_dat[i].state, ip);
+ switch(auth_dat[i].state) { // packet 0x006a value + 1
+ case 1: // 0 = Unregistered ID
+ case 2: // 1 = Incorrect Password
+ case 3: // 2 = This ID is expired
+ case 4: // 3 = Rejected from Server
+ case 5: // 4 = You have been blocked by the GM Team
+ case 6: // 5 = Your Game's EXE file is not the latest version
+ case 7: // 6 = Your are Prohibited to log in until %s
+ case 8: // 7 = Server is jammed due to over populated
+ case 9: // 8 = No more accounts may be connected from this company
+ case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
+ case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
+ case 12: // 11 = MSI_REFUSE_BAN_BY_GM
+ case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
+ case 14: // 13 = MSI_REFUSE_SELF_LOCK
+ case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ case 100: // 99 = This ID has been totally erased
+ case 101: // 100 = Login information remains at %s.
+ case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
+ case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
+ case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
+ case 105: // 104 = Your spouse character is being deleted. Login is temporarily unavailable for the time being
+ return auth_dat[i].state - 1;
+ default:
+ return 99; // 99 = ID has been totally erased
+ }
+ }
+
+ if (online_check) {
+ unsigned char buf[8];
+ struct online_login_data* data = idb_get(online_db,auth_dat[i].account_id);
+ if (data && data->char_server > -1) {
+ //Request char servers to kick this account out. [Skotlex]
+ ShowWarning("User [%d] is already online - Rejected.\n",auth_dat[i].account_id);
+ WBUFW(buf,0) = 0x2734;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ charif_sendallwos(-1, buf, 6);
+ if (!data->waiting_disconnect)
+ add_timer(gettick()+30000, waiting_disconnect_timer,auth_dat[i].account_id, 0);
+ data->waiting_disconnect = 1;
+ return 3; // Rejected
+ }
+ }
+
+ if (auth_dat[i].ban_until_time != 0) { // if account is banned
+ strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
+ tmpstr[19] = '\0';
+ if (auth_dat[i].ban_until_time > time(NULL)) { // always banned
+ login_log("Connection refused (account: %s, pass: %s, banned until %s, ip: %s)" RETCODE,
+ account->userid, account->passwd, tmpstr, ip);
+ return 6; // 6 = Your are Prohibited to log in until %s
+ } else { // ban is finished
+ login_log("End of ban (account: %s, pass: %s, previously banned until %s -> not more banned, ip: %s)" RETCODE,
+ account->userid, account->passwd, tmpstr, ip);
+ auth_dat[i].ban_until_time = 0; // reset the ban time
+ }
+ }
+
+ if (auth_dat[i].connect_until_time != 0 && auth_dat[i].connect_until_time < time(NULL)) {
+ login_log("Connection refused (account: %s, pass: %s, expired ID, ip: %s)" RETCODE,
+ account->userid, account->passwd, ip);
+ return 2; // 2 = This ID is expired
+ }
+
+ login_log("Authentification accepted (account: %s (id: %d), ip: %s)" RETCODE, account->userid, auth_dat[i].account_id, ip);
+ } else {
+ if (!newaccount) {
+ login_log("Unknown account (account: %s, received pass: %s, ip: %s)" RETCODE,
+ account->userid, account->passwd, ip);
+ return 0; // 0 = Unregistered ID
+ } else {
+ int new_id = mmo_auth_new(account, account->userid[len+1], "a@a.com");
+ login_log("Account creation and authentification accepted (account %s (id: %d), pass: %s, sex: %c, connection with _F/_M, ip: %s)" RETCODE,
+ account->userid, new_id, account->passwd, account->userid[len+1], ip);
+ auth_before_save_file = 0; // Creation of an account -> save accounts file immediatly
+
+ //restart ticker (account registration flood protection)[Kevin]
+ if(num_regs==0) {
+ new_reg_tick=gettick()+time_allowed*1000;
+ }
+ num_regs++;
+ }
+ }
+
+ // auth start : time seed
+ // Platform/Compiler dependant clock() for time check is removed. [Lance]
+ // clock() is originally used to track processing ticks on program execution.
+ time(&raw_time);
+ strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&raw_time));
+
+ account->account_id = auth_dat[i].account_id;
+ account->login_id1 = rand();
+ account->login_id2 = rand();
+ memcpy(account->lastlogin, auth_dat[i].lastlogin, 24);
+ memcpy(auth_dat[i].lastlogin, tmpstr, 24);
+ account->sex = auth_dat[i].sex;
+ if (account->sex != 2 && account->account_id < 700000)
+ ShowWarning("Account %s has account id %d! Account IDs must be over 700000 to work properly!\n", account->userid, account->account_id);
+
+ strncpy(auth_dat[i].last_ip, ip, 16);
+ auth_dat[i].logincount++;
+
+ // Save until for change ip/time of auth is not very useful => limited save for that
+ // Save there informations isnot necessary, because they are saved in log file.
+ if (--auth_before_save_file <= 0) // Reduce counter. 0 or less, we save
+ mmo_auth_sync();
+
+ return -1; // account OK
+}
+
+static int online_db_setoffline(DBKey key, void* data, va_list ap) {
+ struct online_login_data *p = (struct online_login_data *)data;
+ int server = va_arg(ap, int);
+ if (server == -1) {
+ p->char_server = -1;
+ p->waiting_disconnect = 0;
+ } else if (p->char_server == server)
+ p->char_server = -2; //Char server disconnected.
+ return 0;
+}
+
+//--------------------------------
+// Packet parsing for char-servers
+//--------------------------------
+int parse_fromchar(int fd) {
+ unsigned int i;
+ int j, id;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char ip[16];
+ int acc;
+ RFIFOHEAD(fd);
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ for(id = 0; id < MAX_SERVERS; id++)
+ if (server_fd[id] == fd)
+ break;
+ if (id == MAX_SERVERS)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (id < MAX_SERVERS) {
+ ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
+ login_log("Char-server '%s' has disconnected (ip: %s)." RETCODE,
+ server[id].name, ip);
+ server_fd[id] = -1;
+ memset(&server[id], 0, sizeof(struct mmo_char_server));
+ online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char server to offline.
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ while (RFIFOREST(fd) >= 2) {
+
+ if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && RFIFOW(fd,0) != 0x2714)) // 0x2714 is done very often (number of players)
+ ShowDebug("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+
+ switch (RFIFOW(fd,0)) {
+ // request from map-server via char-server to reload GM accounts (by Yor).
+ case 0x2709:
+ login_log("Char-server '%s': Request to re-load GM configuration file (ip: %s)." RETCODE, server[id].name, ip);
+ read_gm_account();
+ // send GM accounts to all char-servers
+ send_GM_accounts();
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x2712: // request from char-server to authentify an account
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ {
+ int acc;
+ acc = RFIFOL(fd,2); // speed up
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == acc &&
+ auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
+#endif
+ auth_fifo[i].sex == RFIFOB(fd,14) &&
+ (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,15)) &&
+ !auth_fifo[i].delflag) {
+ unsigned int k;
+ time_t connect_until_time = 0;
+ char email[40] = "";
+ WFIFOHEAD(fd,51);
+ auth_fifo[i].delflag = 1;
+ login_log("Char-server '%s': authentification of the account %d accepted (ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+// printf("%d\n", i);
+ for(k = 0; k < auth_num; k++) {
+ if (auth_dat[k].account_id == acc) {
+ strcpy(email, auth_dat[k].email);
+ connect_until_time = auth_dat[k].connect_until_time;
+ break;
+ }
+ }
+ WFIFOW(fd,0) = 0x2713;
+ WFIFOL(fd,2) = acc;
+ WFIFOB(fd,6) = 0;
+ memcpy(WFIFOP(fd, 7), email, 40);
+ WFIFOL(fd,47) = (unsigned long)connect_until_time;
+ WFIFOSET(fd,51);
+ break;
+ }
+ }
+ // authentification not found
+ if (i == AUTH_FIFO_SIZE) {
+ login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ WFIFOHEAD(fd, 51);
+ WFIFOW(fd,0) = 0x2713;
+ WFIFOL(fd,2) = acc;
+ WFIFOB(fd,6) = 1;
+ // It is unnecessary to send email
+ // It is unnecessary to send validity date of the account
+ WFIFOSET(fd,51);
+ }
+ }
+ RFIFOSKIP(fd,19);
+ break;
+
+ case 0x2714:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2));
+ server[id].users = RFIFOL(fd,2);
+ // send some answer
+ WFIFOHEAD(fd, 2);
+ WFIFOW(fd,0) = 0x2718;
+ WFIFOSET(fd,2);
+
+ RFIFOSKIP(fd,6);
+ break;
+
+ // we receive a e-mail creation of an account with a default e-mail (no answer)
+ case 0x2715:
+ if (RFIFOREST(fd) < 46)
+ return 0;
+ {
+ char email[40];
+ acc = RFIFOL(fd,2); // speed up
+ memcpy(email, RFIFOP(fd,6), 40);
+ email[39] = '\0';
+ remove_control_chars((unsigned char *)email);
+ //printf("parse_fromchar: an e-mail creation of an account with a default e-mail: server '%s', account: %d, e-mail: '%s'.\n", server[id].name, acc, RFIFOP(fd,6));
+ if (e_mail_check(email) == 0)
+ login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else {
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc && (strcmp(auth_dat[i].email, "a@a.com") == 0 || auth_dat[i].email[0] == '\0')) {
+ memcpy(auth_dat[i].email, email, 40);
+ login_log("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s)." RETCODE,
+ server[id].name, acc, email, ip);
+ // Save
+ mmo_auth_sync();
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ }
+ RFIFOSKIP(fd,46);
+ break;
+
+ // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
+ case 0x2716:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == RFIFOL(fd,2)) {
+ login_log("Char-server '%s': e-mail of the account %d found (ip: %s)." RETCODE,
+ server[id].name, RFIFOL(fd,2), ip);
+ WFIFOW(fd,0) = 0x2717;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ memcpy(WFIFOP(fd, 6), auth_dat[i].email, 40);
+ WFIFOL(fd,46) = (unsigned long)auth_dat[i].connect_until_time;
+ WFIFOSET(fd,50);
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': e-mail of the account %d NOT found (ip: %s)." RETCODE,
+ server[id].name, RFIFOL(fd,2), ip);
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x2720: // To become GM request
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ unsigned char buf[10];
+ FILE *fp;
+ acc = RFIFOL(fd,4);
+ //printf("parse_fromchar: Request to become a GM acount from %d account.\n", acc);
+ WBUFW(buf,0) = 0x2721;
+ WBUFL(buf,2) = acc;
+ WBUFL(buf,6) = 0;
+ if (strcmp((char*)RFIFOP(fd,8), gm_pass) == 0) {
+ // only non-GM can become GM
+ if (isGM(acc) == 0) {
+ // if we autorise creation
+ if (level_new_gm > 0) {
+ // if we can open the file to add the new GM
+ if ((fp = fopen(GM_account_filename, "a")) != NULL) {
+ char tmpstr[24];
+ time_t raw_time;
+ time(&raw_time);
+ strftime(tmpstr, 23, date_format, localtime(&raw_time));
+ fprintf(fp, RETCODE "// %s: @GM command on account %d" RETCODE "%d %d" RETCODE, tmpstr, acc, acc, level_new_gm);
+ fclose(fp);
+ WBUFL(buf,6) = level_new_gm;
+ read_gm_account();
+ send_GM_accounts();
+ ShowNotice("GM Change of the account %d: level 0 -> %d.\n", acc, level_new_gm);
+ login_log("Char-server '%s': GM Change of the account %d: level 0 -> %d (ip: %s)." RETCODE,
+ server[id].name, acc, level_new_gm, ip);
+ } else {
+ ShowError("Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file)\n", acc);
+ login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ } else {
+ ShowError("Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0))\n", acc);
+ login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0), ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ } else {
+ ShowError("Error of GM change (suggested account: %d (already GM), correct password).\n", acc);
+ login_log("Char-server '%s': Error of GM change (suggested account: %d (already GM), correct password, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ } else {
+ ShowError("Error of GM change (suggested account: %d, invalid password).\n", acc);
+ login_log("Char-server '%s': Error of GM change (suggested account: %d, invalid password, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ charif_sendallwos(-1, buf, 10);
+ }
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ return 0;
+
+ // Map server send information to change an email of an account via char-server
+ case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ {
+ char actual_email[40], new_email[40];
+ acc = RFIFOL(fd,2);
+ memcpy(actual_email, RFIFOP(fd,6), 40);
+ actual_email[39] = '\0';
+ remove_control_chars((unsigned char *)actual_email);
+ memcpy(new_email, RFIFOP(fd,46), 40);
+ new_email[39] = '\0';
+ remove_control_chars((unsigned char *)new_email);
+ if (e_mail_check(actual_email) == 0)
+ login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else if (e_mail_check(new_email) == 0)
+ login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else if (strcmpi(new_email, "a@a.com") == 0)
+ login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else {
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ if (strcmpi(auth_dat[i].email, actual_email) == 0) {
+ memcpy(auth_dat[i].email, new_email, 40);
+ login_log("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
+ server[id].name, acc, auth_dat[i].userid, new_email, ip);
+ // Save
+ mmo_auth_sync();
+ } else
+ login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s)." RETCODE,
+ server[id].name, acc, auth_dat[i].userid, auth_dat[i].email, actual_email, ip);
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but account doesn't exist (account: %d, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ }
+ RFIFOSKIP(fd, 86);
+ break;
+
+ // Receiving of map-server via char-server a status change resquest (by Yor)
+ case 0x2724:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int acc, statut;
+ acc = RFIFOL(fd,2);
+ statut = RFIFOL(fd,6);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ if (auth_dat[i].state != statut) {
+ login_log("Char-server '%s': Status change (account: %d, new status %d, ip: %s)." RETCODE,
+ server[id].name, acc, statut, ip);
+ if (statut != 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = statut; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == acc)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ }
+ auth_dat[i].state = statut;
+ // Save
+ mmo_auth_sync();
+ } else
+ login_log("Char-server '%s': Error of Status change - actual status is already the good status (account: %d, status %d, ip: %s)." RETCODE,
+ server[id].name, acc, statut, ip);
+ break;
+ }
+ }
+ if (i == auth_num) {
+ login_log("Char-server '%s': Error of Status change (account: %d not found, suggested status %d, ip: %s)." RETCODE,
+ server[id].name, acc, statut, ip);
+ }
+ RFIFOSKIP(fd,10);
+ }
+ return 0;
+
+ case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ {
+ acc = RFIFOL(fd,2);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ time_t timestamp;
+ struct tm *tmtime;
+ if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
+ timestamp = time(NULL);
+ else
+ timestamp = auth_dat[i].ban_until_time;
+ tmtime = localtime(&timestamp);
+ tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
+ tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
+ tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
+ tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
+ tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
+ tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
+ timestamp = mktime(tmtime);
+ if (timestamp != -1) {
+ if (timestamp <= time(NULL))
+ timestamp = 0;
+ if (auth_dat[i].ban_until_time != timestamp) {
+ if (timestamp != 0) {
+ unsigned char buf[16];
+ char tmpstr[2048];
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ login_log("Char-server '%s': Ban request (account: %d, new final date of banishment: %d (%s), ip: %s)." RETCODE,
+ server[id].name, acc, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == acc)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ } else {
+ login_log("Char-server '%s': Error of ban request (account: %d, new date unbans the account, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ auth_dat[i].ban_until_time = timestamp;
+ // Save
+ mmo_auth_sync();
+ } else {
+ login_log("Char-server '%s': Error of ban request (account: %d, no change for ban date, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ } else {
+ login_log("Char-server '%s': Error of ban request (account: %d, invalid date, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': Error of ban request (account: %d not found, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ RFIFOSKIP(fd,18);
+ }
+ return 0;
+
+ case 0x2727: // Change of sex (sex is reversed)
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ int sex;
+ acc = RFIFOL(fd,2);
+ for(i = 0; i < auth_num; i++) {
+// printf("%d,", auth_dat[i].account_id);
+ if (auth_dat[i].account_id == acc) {
+ if (auth_dat[i].sex == 2)
+ login_log("Char-server '%s': Error of sex change - Server account (suggested account: %d, actual sex %d (Server), ip: %s)." RETCODE,
+ server[id].name, acc, auth_dat[i].sex, ip);
+ else {
+ unsigned char buf[16];
+ if (auth_dat[i].sex == 0)
+ sex = 1;
+ else
+ sex = 0;
+ login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
+ server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == acc)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ auth_dat[i].sex = sex;
+ WBUFW(buf,0) = 0x2723;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+ charif_sendallwos(-1, buf, 7);
+ // Save
+ mmo_auth_sync();
+ }
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': Error of sex change (account: %d not found, sex would be reversed, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ RFIFOSKIP(fd,6);
+ }
+ return 0;
+
+ case 0x2728: // We receive account_reg2 from a char-server, and we send them to other map-servers.
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ int p;
+ acc = RFIFOL(fd,4);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ //unsigned char buf[rfifow(fd,2)+1];
+ unsigned char *buf;
+ int len;
+ buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char));
+ login_log("char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ for(j=0,p=13;j<ACCOUNT_REG2_NUM && p<RFIFOW(fd,2);j++){
+ sscanf(RFIFOP(fd,p), "%31c%n",auth_dat[i].account_reg2[j].str,&len);
+ auth_dat[i].account_reg2[j].str[len]='\0';
+ p +=len+1; //+1 to skip the '\0' between strings.
+ sscanf(RFIFOP(fd,p), "%255c%n",auth_dat[i].account_reg2[j].value,&len);
+ auth_dat[i].account_reg2[j].value[len]='\0';
+ p +=len+1;
+ remove_control_chars((unsigned char *)auth_dat[i].account_reg2[j].str);
+ remove_control_chars((unsigned char *)auth_dat[i].account_reg2[j].value);
+ }
+ auth_dat[i].account_reg2_num = j;
+ // Sending information towards the other char-servers.
+ memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf,0) = 0x2729;
+ charif_sendallwos(fd, buf, WBUFW(buf,2));
+ // Save
+ mmo_auth_sync();
+// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc);
+ if (buf) aFree(buf);
+ break;
+ }
+ }
+ if (i == auth_num) {
+// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (unknwon account id: %d).\n", acc);
+ login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ acc = RFIFOL(fd,2);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ if (auth_dat[i].ban_until_time != 0) {
+ auth_dat[i].ban_until_time = 0;
+ login_log("Char-server '%s': UnBan request (account: %d, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ } else {
+ login_log("Char-server '%s': Error of UnBan request (account: %d, no change for unban date, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ }
+ break;
+ }
+ }
+ if (i == auth_num)
+ login_log("Char-server '%s': Error of UnBan request (account: %d not found, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ RFIFOSKIP(fd,6);
+ }
+ return 0;
+
+ case 0x272b: // Set account_id to online [Wizputer]
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ add_online_user(id, RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x272c: // Set account_id to offline [Wizputer]
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ remove_online_user(RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x272d: // Receive list of all online accounts. [Skotlex]
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (!online_check) {
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+ }
+ {
+ struct online_login_data *p;
+ int aid;
+ unsigned int users;
+ online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
+ users = RFIFOW(fd,4);
+ for (i = 0; i < users; i++) {
+ aid = RFIFOL(fd,6+i*4);
+ p = idb_ensure(online_db, aid, create_online_user);
+ p->char_server = id;
+ p->waiting_disconnect = 0;
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+ }
+ case 0x272e: //Request account_reg2 for a character.
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int account_id = RFIFOL(fd, 2);
+ int char_id = RFIFOL(fd, 6);
+ int p;
+ RFIFOSKIP(fd,10);
+ WFIFOW(fd,0) = 0x2729;
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = char_id;
+ WFIFOB(fd,12) = 1; //Type 1 for Account2 registry
+ for(i = 0; i < auth_num && auth_dat[i].account_id != account_id; i++);
+ if (i == auth_num) {
+ //Account not found? Send at least empty data, map servers need a reply!
+ WFIFOW(fd,2) = 13;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ break;
+ }
+ for(p = 13,j=0;j<auth_dat[i].account_reg2_num;j++){
+ if (auth_dat[i].account_reg2[j].str[0]) {
+ p+= sprintf(WFIFOP(fd,p), "%s", auth_dat[i].account_reg2[j].str)+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(fd,p), "%s", auth_dat[i].account_reg2[j].value)+1;
+ }
+ }
+ WFIFOW(fd,2) = p;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ break;
+
+ case 0x2736: // WAN IP update from char-server
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ ShowInfo("Updated IP of Server #%d to %d.%d.%d.%d.\n",id,
+ (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
+ (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
+ server[id].ip = RFIFOL(fd,2);
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x2737: //Request to set all offline.
+ ShowInfo("Setting accounts from char-server %d offline.\n", id);
+ online_db->foreach(online_db,online_db_setoffline,id);
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x3000: //change sex for chrif_changesex()
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ unsigned int sex;
+ acc = RFIFOL(fd,4);
+ sex = RFIFOB(fd,8);
+ if (sex != 0 && sex != 1)
+ sex = 0;
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == acc) {
+ unsigned char buf[16];
+ login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
+ server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
+ auth_fifo[i].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ auth_dat[i].sex = sex;
+ WBUFW(buf,0) = 0x2723;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+ charif_sendallwos(-1, buf, 7);
+ break;
+ }
+ }
+ if (i == auth_num) {
+ login_log("Char-server '%s': Error of Sex change (account: %d not found, suggested sex %c, ip: %s)." RETCODE,
+ server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ }
+ return 0;
+
+ default:
+ {
+ FILE *logfp;
+ char tmpstr[24];
+ time_t raw_time;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ time(&raw_time);
+ strftime(tmpstr, 23, date_format, localtime(&raw_time));
+ fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
+ fprintf(logfp, "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
+ fprintf(logfp, "Detail (in hex):" RETCODE);
+ fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ for(i = 0; i < RFIFOREST(fd); i++) {
+ if ((i & 15) == 0)
+ fprintf(logfp, "%04X ",i);
+ fprintf(logfp, "%02x ", RFIFOB(fd,i));
+ if (RFIFOB(fd,i) > 0x1f)
+ tmpstr[i % 16] = RFIFOB(fd,i);
+ else
+ tmpstr[i % 16] = '.';
+ if ((i - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ else if ((i + 1) % 16 == 0) {
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ }
+ }
+ if (i % 16 != 0) {
+ for(j = i; j % 16 != 0; j++) {
+ fprintf(logfp, " ");
+ if ((j - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ }
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ }
+ fprintf(logfp, RETCODE);
+ fclose(logfp);
+ }
+ }
+ ShowWarning("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ ShowStatus("Char-server has been disconnected (unknown packet).\n");
+ return 0;
+ }
+ }
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+//---------------------------------------
+// Packet parsing for administation login
+//---------------------------------------
+int parse_admin(int fd) {
+ unsigned int i, j;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char* account_name;
+ char ip[16];
+ RFIFOHEAD(fd);
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ if (session[fd]->eof) {
+ do_close(fd);
+ ShowInfo("Remote administration has disconnected (session #%d).\n", fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+ if (display_parse_admin == 1) {
+
+ ShowDebug("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+ }
+
+ switch(RFIFOW(fd,0)) {
+ case 0x7530: // Request of the server version
+ login_log("'ladmin': Sending of the server version (ip: %s)" RETCODE, ip);
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0) = 0x7531;
+ WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
+ WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
+ WFIFOB(fd,4) = ATHENA_REVISION;
+ WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
+ WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
+ WFIFOW(fd,8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd,10);
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x7532: // Request of end of connection
+ login_log("'ladmin': End of connection (ip: %s)" RETCODE, ip);
+ RFIFOSKIP(fd,2);
+ session[fd]->eof = 1;
+ break;
+
+ case 0x7920: // Request of an accounts list
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int st, ed, len;
+ //int id[auth_num];
+ //int *id=(int *)aCalloc(auth_num, sizeof(int));
+ CREATE_BUFFER(id, int, auth_num);
+ st = RFIFOL(fd,2);
+ ed = RFIFOL(fd,6);
+ RFIFOSKIP(fd,10);
+ WFIFOW(fd,0) = 0x7921;
+ if (st < 0)
+ st = 0;
+ if (ed > END_ACCOUNT_NUM || ed < st || ed <= 0)
+ ed = END_ACCOUNT_NUM;
+ login_log("'ladmin': Sending an accounts list (ask: from %d to %d, ip: %s)" RETCODE, st, ed, ip);
+ // Sort before send
+ for(i = 0; i < auth_num; i++) {
+ unsigned int k;
+ id[i] = i;
+ for(j = 0; j < i; j++) {
+ if (auth_dat[id[i]].account_id < auth_dat[id[j]].account_id) {
+ for(k = i; k > j; k--) {
+ id[k] = id[k-1];
+ }
+ id[j] = i; // id[i]
+ break;
+ }
+ }
+ }
+ // Sending accounts information
+ len = 4;
+ for(i = 0; i < auth_num && len < 30000; i++) {
+ int account_id = auth_dat[id[i]].account_id; // use sorted index
+ if (account_id >= st && account_id <= ed) {
+ j = id[i];
+ WFIFOL(fd,len) = account_id;
+ WFIFOB(fd,len+4) = (unsigned char)isGM(account_id);
+ memcpy(WFIFOP(fd,len+5), auth_dat[j].userid, 24);
+ WFIFOB(fd,len+29) = auth_dat[j].sex;
+ WFIFOL(fd,len+30) = auth_dat[j].logincount;
+ if (auth_dat[j].state == 0 && auth_dat[j].ban_until_time != 0) // if no state and banished
+ WFIFOL(fd,len+34) = 7; // 6 = Your are Prohibited to log in until %s
+ else
+ WFIFOL(fd,len+34) = auth_dat[j].state;
+ len += 38;
+ }
+ }
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd,len);
+ //if (id) free(id);
+ DELETE_BUFFER(id);
+ }
+ break;
+
+ case 0x7930: // Request for an account creation
+ if (RFIFOREST(fd) < 91)
+ return 0;
+ {
+ struct mmo_account ma;
+ memcpy(ma.userid,RFIFOP(fd, 2),NAME_LENGTH);
+ ma.userid[23] = '\0';
+ memcpy(ma.passwd, RFIFOP(fd, 26), NAME_LENGTH);
+ ma.passwd[23] = '\0';
+ memcpy(ma.lastlogin, "-", 2);
+ ma.sex = RFIFOB(fd,50);
+ WFIFOW(fd,0) = 0x7931;
+ WFIFOL(fd,2) = 0xffffffff;
+ memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24);
+ if (strlen(ma.userid) < 4 || strlen(ma.passwd) < 4) {
+ login_log("'ladmin': Attempt to create an invalid account (account or pass is too short, ip: %s)" RETCODE,
+ ip);
+ } else if (ma.sex != 'F' && ma.sex != 'M') {
+ login_log("'ladmin': Attempt to create an invalid account (account: %s, received pass: %s, invalid sex, ip: %s)" RETCODE,
+ ma.userid, ma.passwd, ip);
+ } else if (account_id_count > END_ACCOUNT_NUM) {
+ login_log("'ladmin': Attempt to create an account, but there is no more available id number (account: %s, pass: %s, sex: %c, ip: %s)" RETCODE,
+ ma.userid, ma.passwd, ma.sex, ip);
+ } else {
+ remove_control_chars((unsigned char *)ma.userid);
+ remove_control_chars((unsigned char *)ma.passwd);
+ for(i = 0; i < auth_num; i++) {
+ if (strncmp(auth_dat[i].userid, ma.userid, 24) == 0) {
+ login_log("'ladmin': Attempt to create an already existing account (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].pass, ma.passwd, ip);
+ break;
+ }
+ }
+ if (i == auth_num) {
+ int new_id;
+ char email[40];
+ memcpy(email, RFIFOP(fd,51), 40);
+ email[39] = '\0';
+ remove_control_chars((unsigned char *)email);
+ new_id = mmo_auth_new(&ma, ma.sex, email);
+ login_log("'ladmin': Account creation (account: %s (id: %d), pass: %s, sex: %c, email: %s, ip: %s)" RETCODE,
+ ma.userid, new_id, ma.passwd, ma.sex, auth_dat[i].email, ip);
+ WFIFOL(fd,2) = new_id;
+ mmo_auth_sync();
+ }
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,91);
+ }
+ break;
+
+ case 0x7932: // Request for an account deletion
+ if (RFIFOREST(fd) < 26)
+ return 0;
+ WFIFOW(fd,0) = 0x7933;
+ WFIFOL(fd,2) = 0xFFFFFFFF;
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ // Char-server is notified of deletion (for characters deletion).
+ unsigned char buf[65535];
+ WBUFW(buf,0) = 0x2730;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ charif_sendallwos(-1, buf, 6);
+ // send answer
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ // save deleted account in log file
+ login_log("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" RETCODE,
+ auth_dat[i].userid, auth_dat[i].account_id, ip);
+ mmo_auth_tostr((char*)buf, &auth_dat[i]);
+ login_log("%s" RETCODE, buf);
+ // delete account
+ memset(auth_dat[i].userid, '\0', sizeof(auth_dat[i].userid));
+ auth_dat[i].account_id = -1;
+ mmo_auth_sync();
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to delete an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,26);
+ break;
+
+ case 0x7934: // Request to change a password
+ if (RFIFOREST(fd) < 50)
+ return 0;
+ WFIFOW(fd,0) = 0x7935;
+ WFIFOL(fd,2) = 0xFFFFFFFF; /// WTF??? an unsigned being set to a -1
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ memcpy(auth_dat[i].pass, RFIFOP(fd,26), 24);
+ auth_dat[i].pass[23] = '\0';
+ remove_control_chars((unsigned char *)auth_dat[i].pass);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Modification of a password (account: %s, new password: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].pass, ip);
+ mmo_auth_sync();
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to modify the password of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,50);
+ break;
+
+ case 0x7936: // Request to modify a state
+ if (RFIFOREST(fd) < 50)
+ return 0;
+ {
+ char error_message[20];
+ int statut;
+ WFIFOW(fd,0) = 0x7937;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ statut = RFIFOL(fd,26);
+ memcpy(error_message, RFIFOP(fd,30), 20);
+ error_message[19] = '\0';
+ remove_control_chars((unsigned char *)error_message);
+ if (statut != 7 || error_message[0] == '\0') { // 7: // 6 = Your are Prohibited to log in until %s
+ strcpy(error_message, "-");
+ }
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ if (auth_dat[i].state == statut && strcmp(auth_dat[i].error_message, error_message) == 0)
+ login_log("'ladmin': Modification of a state, but the state of the account is already the good state (account: %s, received state: %d, ip: %s)" RETCODE,
+ account_name, statut, ip);
+ else {
+ if (statut == 7)
+ login_log("'ladmin': Modification of a state (account: %s, new state: %d - prohibited to login until '%s', ip: %s)" RETCODE,
+ auth_dat[i].userid, statut, error_message, ip);
+ else
+ login_log("'ladmin': Modification of a state (account: %s, new state: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, statut, ip);
+ if (auth_dat[i].state == 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = statut; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == auth_dat[i].account_id)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ }
+ auth_dat[i].state = statut;
+ memcpy(auth_dat[i].error_message, error_message, 20);
+ mmo_auth_sync();
+ }
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to modify the state of an unknown account (account: %s, received state: %d, ip: %s)" RETCODE,
+ account_name, statut, ip);
+ }
+ WFIFOL(fd,30) = statut;
+ }
+ WFIFOSET(fd,34);
+ RFIFOSKIP(fd,50);
+ break;
+
+ case 0x7938: // Request for servers list and # of online players
+ login_log("'ladmin': Sending of servers list (ip: %s)" RETCODE, ip);
+ server_num = 0;
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {
+ WFIFOL(fd,4+server_num*32) = server[i].ip;
+ WFIFOW(fd,4+server_num*32+4) = server[i].port;
+ memcpy(WFIFOP(fd,4+server_num*32+6), server[i].name, 20);
+ WFIFOW(fd,4+server_num*32+26) = server[i].users;
+ WFIFOW(fd,4+server_num*32+28) = server[i].maintenance;
+ WFIFOW(fd,4+server_num*32+30) = server[i].new_;
+ server_num++;
+ }
+ }
+ WFIFOW(fd,0) = 0x7939;
+ WFIFOW(fd,2) = 4 + 32 * server_num;
+ WFIFOSET(fd,4+32*server_num);
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x793a: // Request to password check
+ if (RFIFOREST(fd) < 50)
+ return 0;
+ WFIFOW(fd,0) = 0x793b;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ char pass[25];
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ memcpy(pass, RFIFOP(fd,26), 24);
+ pass[24] = '\0';
+ remove_control_chars((unsigned char *)pass);
+ if (strcmp(auth_dat[i].pass, pass) == 0) {
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Check of password OK (account: %s, password: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].pass, ip);
+ } else {
+ login_log("'ladmin': Failure of password check (account: %s, proposed pass: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, pass, ip);
+ }
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to check the password of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,50);
+ break;
+
+ case 0x793c: // Request to modify sex
+ if (RFIFOREST(fd) < 27)
+ return 0;
+ WFIFOW(fd,0) = 0x793d;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ {
+ char sex;
+ sex = RFIFOB(fd,26);
+ if (sex != 'F' && sex != 'M') {
+ if (sex > 31)
+ login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: %c, ip: %s)" RETCODE,
+ account_name, sex, ip);
+ else
+ login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: 'control char', ip: %s)" RETCODE,
+ account_name, ip);
+ } else {
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ if (auth_dat[i].sex != ((sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'))) {
+ unsigned char buf[16];
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == auth_dat[i].account_id)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ auth_dat[i].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
+ login_log("'ladmin': Modification of a sex (account: %s, new sex: %c, ip: %s)" RETCODE,
+ auth_dat[i].userid, sex, ip);
+ mmo_auth_sync();
+ // send to all char-server the change
+ WBUFW(buf,0) = 0x2723;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ WBUFB(buf,6) = auth_dat[i].sex;
+ charif_sendallwos(-1, buf, 7);
+ } else {
+ login_log("'ladmin': Modification of a sex, but the sex is already the good sex (account: %s, sex: %c, ip: %s)" RETCODE,
+ auth_dat[i].userid, sex, ip);
+ }
+ } else {
+ login_log("'ladmin': Attempt to modify the sex of an unknown account (account: %s, received sex: %c, ip: %s)" RETCODE,
+ account_name, sex, ip);
+ }
+ }
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,27);
+ break;
+
+ case 0x793e: // Request to modify GM level
+ if (RFIFOREST(fd) < 27)
+ return 0;
+ WFIFOW(fd,0) = 0x793f;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ {
+ char new_gm_level;
+ new_gm_level = RFIFOB(fd,26);
+ if (new_gm_level < 0 || new_gm_level > 99) {
+ login_log("'ladmin': Attempt to give an invalid GM level (account: %s, received GM level: %d, ip: %s)" RETCODE,
+ account_name, (int)new_gm_level, ip);
+ } else {
+ i = search_account_index(account_name);
+ if (i != -1) {
+ int acc = auth_dat[i].account_id;
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ if (isGM(acc) != new_gm_level) {
+ // modification of the file
+ FILE *fp, *fp2;
+ int lock;
+ char line[512];
+ int GM_account, GM_level;
+ int modify_flag;
+ char tmpstr[24];
+ time_t raw_time;
+ if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) {
+ if ((fp = fopen(GM_account_filename, "r")) != NULL) {
+ time(&raw_time);
+ strftime(tmpstr, 23, date_format, localtime(&raw_time));
+ modify_flag = 0;
+ // read/write GM file
+ while(fgets(line, sizeof(line)-1, fp)) {
+ while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
+ line[strlen(line)-1] = '\0';
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\0')
+ fprintf(fp2, "%s" RETCODE, line);
+ else {
+ if (sscanf(line, "%d %d", &GM_account, &GM_level) != 2 && sscanf(line, "%d: %d", &GM_account, &GM_level) != 2)
+ fprintf(fp2, "%s" RETCODE, line);
+ else if (GM_account != acc)
+ fprintf(fp2, "%s" RETCODE, line);
+ else if (new_gm_level < 1) {
+ fprintf(fp2, "// %s: 'ladmin' GM level removed on account %d '%s' (previous level: %d)" RETCODE "//%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
+ modify_flag = 1;
+ } else {
+ fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: %d)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
+ modify_flag = 1;
+ }
+ }
+ }
+ if (modify_flag == 0)
+ fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: 0)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, acc, new_gm_level);
+ fclose(fp);
+ } else {
+ login_log("'ladmin': Attempt to modify of a GM level - impossible to read GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, acc, (int)new_gm_level, ip);
+ }
+ if (lock_fclose(fp2, GM_account_filename, &lock) == 0) {
+ WFIFOL(fd,2) = acc;
+ login_log("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, acc, (int)new_gm_level, ip);
+ // read and send new GM informations
+ read_gm_account();
+ send_GM_accounts();
+ } else {
+ login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, acc, (int)new_gm_level, ip);
+ }
+ } else {
+ login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, acc, (int)new_gm_level, ip);
+ }
+ } else {
+ login_log("'ladmin': Attempt to modify of a GM level, but the GM level is already the good GM level (account: %s (%d), GM level: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, acc, (int)new_gm_level, ip);
+ }
+ } else {
+ login_log("'ladmin': Attempt to modify the GM level of an unknown account (account: %s, received GM level: %d, ip: %s)" RETCODE,
+ account_name, (int)new_gm_level, ip);
+ }
+ }
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,27);
+ break;
+
+ case 0x7940: // Request to modify e-mail
+ if (RFIFOREST(fd) < 66)
+ return 0;
+ WFIFOW(fd,0) = 0x7941;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ {
+ char email[40];
+ memcpy(email, RFIFOP(fd,26), 40);
+ if (e_mail_check(email) == 0) {
+ login_log("'ladmin': Attempt to give an invalid e-mail (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ } else {
+ remove_control_chars((unsigned char *)email);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ memcpy(auth_dat[i].email, email, 40);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Modification of an email (account: %s, new e-mail: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, email, ip);
+ mmo_auth_sync();
+ } else {
+ login_log("'ladmin': Attempt to modify the e-mail of an unknown account (account: %s, received e-mail: %s, ip: %s)" RETCODE,
+ account_name, email, ip);
+ }
+ }
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,66);
+ break;
+
+ case 0x7942: // Request to modify memo field
+ if ((int)RFIFOREST(fd) < 28 || (int)RFIFOREST(fd) < (28 + RFIFOW(fd,26)))
+ return 0;
+ WFIFOW(fd,0) = 0x7943;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ int size_of_memo = sizeof(auth_dat[i].memo);
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ memset(auth_dat[i].memo, '\0', size_of_memo);
+ if (RFIFOW(fd,26) == 0) {
+ strncpy(auth_dat[i].memo, "-", size_of_memo);
+ } else if (RFIFOW(fd,26) > size_of_memo - 1) {
+ memcpy(auth_dat[i].memo, RFIFOP(fd,28), size_of_memo - 1);
+ } else {
+ memcpy(auth_dat[i].memo, RFIFOP(fd,28), RFIFOW(fd,26));
+ }
+ auth_dat[i].memo[size_of_memo - 1] = '\0';
+ remove_control_chars((unsigned char *)auth_dat[i].memo);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Modification of a memo field (account: %s, new memo: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].memo, ip);
+ mmo_auth_sync();
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to modify the memo field of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,28 + RFIFOW(fd,26));
+ break;
+
+ case 0x7944: // Request to found an account id
+ if (RFIFOREST(fd) < 26)
+ return 0;
+ WFIFOW(fd,0) = 0x7945;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Request (by the name) of an account id (account: %s, id: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].account_id, ip);
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': ID request (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,26);
+ break;
+
+ case 0x7946: // Request to found an account name
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ WFIFOW(fd,0) = 0x7947;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ memset(WFIFOP(fd,6), '\0', 24);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == RFIFOL(fd,2)) {
+ strncpy((char*)WFIFOP(fd,6), auth_dat[i].userid, 24);
+ login_log("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, RFIFOL(fd,2), ip);
+ break;
+ }
+ }
+ if (i == auth_num) {
+ login_log("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" RETCODE,
+ RFIFOL(fd,2), ip);
+ strncpy((char*)WFIFOP(fd,6), "", 24);
+ }
+ WFIFOSET(fd,30);
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x7948: // Request to change the validity limit (timestamp) (absolute value)
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ {
+ time_t timestamp;
+ char tmpstr[2048];
+ WFIFOW(fd,0) = 0x7949;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ timestamp = (time_t)RFIFOL(fd,26);
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ login_log("'ladmin': Change of a validity limit (account: %s, new validity: %d (%s), ip: %s)" RETCODE,
+ auth_dat[i].userid, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
+ auth_dat[i].connect_until_time = timestamp;
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ mmo_auth_sync();
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to change the validity limit of an unknown account (account: %s, received validity: %d (%s), ip: %s)" RETCODE,
+ account_name, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
+ }
+ WFIFOL(fd,30) = (unsigned int)timestamp;
+ }
+ WFIFOSET(fd,34);
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value)
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ {
+ time_t timestamp;
+ char tmpstr[2048];
+ WFIFOW(fd,0) = 0x794b;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ timestamp = (time_t)RFIFOL(fd,26);
+ if (timestamp <= time(NULL))
+ timestamp = 0;
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ i = search_account_index(account_name);
+ if (i != -1) {
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ login_log("'ladmin': Change of the final date of a banishment (account: %s, new final date of banishment: %d (%s), ip: %s)" RETCODE,
+ auth_dat[i].userid, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
+ if (auth_dat[i].ban_until_time != timestamp) {
+ if (timestamp != 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == auth_dat[i].account_id)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ }
+ auth_dat[i].ban_until_time = timestamp;
+ mmo_auth_sync();
+ }
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to change the final date of a banishment of an unknown account (account: %s, received final date of banishment: %d (%s), ip: %s)" RETCODE,
+ account_name, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
+ }
+ WFIFOL(fd,30) = (unsigned int)timestamp;
+ }
+ WFIFOSET(fd,34);
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change)
+ if (RFIFOREST(fd) < 38)
+ return 0;
+ {
+ time_t timestamp;
+ struct tm *tmtime;
+ char tmpstr[2048];
+ WFIFOW(fd,0) = 0x794d;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
+ timestamp = time(NULL);
+ else
+ timestamp = auth_dat[i].ban_until_time;
+ tmtime = localtime(&timestamp);
+ tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
+ tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
+ tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
+ tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
+ tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
+ tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
+ timestamp = mktime(tmtime);
+ if (timestamp != -1) {
+ if (timestamp <= time(NULL))
+ timestamp = 0;
+ strftime(tmpstr, 24, date_format, localtime(&timestamp));
+ login_log("'ladmin': Adjustment of a final date of a banishment (account: %s, (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
+ auth_dat[i].userid, (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
+ if (auth_dat[i].ban_until_time != timestamp) {
+ if (timestamp != 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ for(j = 0; j < AUTH_FIFO_SIZE; j++)
+ if (auth_fifo[j].account_id == auth_dat[i].account_id)
+ auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
+ }
+ auth_dat[i].ban_until_time = timestamp;
+ mmo_auth_sync();
+ }
+ } else {
+ strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].ban_until_time));
+ login_log("'ladmin': Impossible to adjust the final date of a banishment (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].ban_until_time, (auth_dat[i].ban_until_time == 0 ? "no banishment" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
+ }
+ WFIFOL(fd,30) = (unsigned long)auth_dat[i].ban_until_time;
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to adjust the final date of a banishment of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ WFIFOL(fd,30) = 0;
+ }
+ }
+ WFIFOSET(fd,34);
+ RFIFOSKIP(fd,38);
+ break;
+
+ case 0x794e: // Request to send a broadcast message
+ if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
+ return 0;
+ WFIFOW(fd,0) = 0x794f;
+ WFIFOW(fd,2) = 0xFFFF; // WTF???
+ if (RFIFOL(fd,4) < 1) {
+ login_log("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" RETCODE,
+ ip);
+ } else {
+ // at least 1 char-server
+ for(i = 0; i < MAX_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ break;
+ if (i == MAX_SERVERS) {
+ login_log("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" RETCODE,
+ ip);
+ } else {
+ unsigned char buf[32000];
+ char message[32000];
+ WFIFOW(fd,2) = 0;
+ memset(message, '\0', sizeof(message));
+ memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
+ message[sizeof(message)-1] = '\0';
+ remove_control_chars((unsigned char *)message);
+ if (RFIFOW(fd,2) == 0)
+ login_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s, ip: %s)" RETCODE,
+ message, ip);
+ else
+ login_log("'ladmin': Receiving a message for broadcast (message (in blue): %s, ip: %s)" RETCODE,
+ message, ip);
+ // send same message to all char-servers (no answer)
+ memcpy(WBUFP(buf,0), RFIFOP(fd,0), 8 + RFIFOL(fd,4));
+ WBUFW(buf,0) = 0x2726;
+ charif_sendallwos(-1, buf, 8 + RFIFOL(fd,4));
+ }
+ }
+ WFIFOSET(fd,4);
+ RFIFOSKIP(fd,8 + RFIFOL(fd,4));
+ break;
+
+ case 0x7950: // Request to change the validity limite (timestamp) (relative change)
+ if (RFIFOREST(fd) < 38)
+ return 0;
+ {
+ time_t timestamp;
+ struct tm *tmtime;
+ char tmpstr[2048];
+ char tmpstr2[2048];
+ WFIFOW(fd,0) = 0x7951;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
+ timestamp = auth_dat[i].connect_until_time;
+ if (add_to_unlimited_account == 0 && timestamp == 0) {
+ login_log("'ladmin': Attempt to adjust the validity limit of an unlimited account (account: %s, ip: %s)" RETCODE,
+ auth_dat[i].userid, ip);
+ WFIFOL(fd,30) = 0;
+ } else {
+ if (timestamp == 0 || timestamp < time(NULL))
+ timestamp = time(NULL);
+ tmtime = localtime(&timestamp);
+ tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
+ tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
+ tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
+ tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
+ tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
+ tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
+ timestamp = mktime(tmtime);
+ if (timestamp != -1) {
+ strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
+ strftime(tmpstr2, 24, date_format, localtime(&timestamp));
+ login_log("'ladmin': Adjustment of a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "unlimited" : tmpstr2), ip);
+ auth_dat[i].connect_until_time = timestamp;
+ mmo_auth_sync();
+ WFIFOL(fd,30) = (unsigned long)auth_dat[i].connect_until_time;
+ } else {
+ strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
+ login_log("'ladmin': Impossible to adjust a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
+ WFIFOL(fd,30) = 0;
+ }
+ }
+ } else {
+ memcpy(WFIFOP(fd,6), account_name, 24);
+ login_log("'ladmin': Attempt to adjust the validity limit of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ WFIFOL(fd,30) = 0;
+ }
+ }
+ WFIFOSET(fd,34);
+ RFIFOSKIP(fd,38);
+ break;
+
+ case 0x7952: // Request about informations of an account (by account name)
+ if (RFIFOREST(fd) < 26)
+ return 0;
+ WFIFOW(fd,0) = 0x7953;
+ WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
+ account_name = (char*)RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars((unsigned char *)account_name);
+ i = search_account_index(account_name);
+ if (i != -1) {
+ WFIFOL(fd,2) = auth_dat[i].account_id;
+ WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
+ memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
+ WFIFOB(fd,31) = auth_dat[i].sex;
+ WFIFOL(fd,32) = auth_dat[i].logincount;
+ WFIFOL(fd,36) = auth_dat[i].state;
+ memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
+ memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
+ memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
+ memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
+ WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
+ WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
+ WFIFOW(fd,148) = strlen(auth_dat[i].memo);
+ if (auth_dat[i].memo[0]) {
+ memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
+ }
+ login_log("'ladmin': Sending information of an account (request by the name; account: %s, id: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, auth_dat[i].account_id, ip);
+ WFIFOSET(fd,150+strlen(auth_dat[i].memo));
+ } else {
+ memcpy(WFIFOP(fd,7), account_name, 24);
+ WFIFOW(fd,148) = 0;
+ login_log("'ladmin': Attempt to obtain information (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
+ account_name, ip);
+ WFIFOSET(fd,150);
+ }
+ RFIFOSKIP(fd,26);
+ break;
+
+ case 0x7954: // Request about information of an account (by account id)
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ WFIFOW(fd,0) = 0x7953;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ memset(WFIFOP(fd,7), '\0', 24);
+ for(i = 0; i < auth_num; i++) {
+ if (auth_dat[i].account_id == RFIFOL(fd,2)) {
+ login_log("'ladmin': Sending information of an account (request by the id; account: %s, id: %d, ip: %s)" RETCODE,
+ auth_dat[i].userid, RFIFOL(fd,2), ip);
+ WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
+ memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
+ WFIFOB(fd,31) = auth_dat[i].sex;
+ WFIFOL(fd,32) = auth_dat[i].logincount;
+ WFIFOL(fd,36) = auth_dat[i].state;
+ memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
+ memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
+ memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
+ memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
+ WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
+ WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
+ WFIFOW(fd,148) = strlen(auth_dat[i].memo);
+ if (auth_dat[i].memo[0]) {
+ memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
+ }
+ WFIFOSET(fd,150+strlen(auth_dat[i].memo));
+ break;
+ }
+ }
+ if (i == auth_num) {
+ login_log("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" RETCODE,
+ RFIFOL(fd,2), ip);
+ strncpy((char*)WFIFOP(fd,7), "", 24);
+ WFIFOW(fd,148) = 0;
+ WFIFOSET(fd,150);
+ }
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x7955: // Request to reload GM file (no answer)
+ login_log("'ladmin': Request to re-load GM configuration file (ip: %s)." RETCODE, ip);
+ read_gm_account();
+ // send GM accounts to all char-servers
+ send_GM_accounts();
+ RFIFOSKIP(fd,2);
+ break;
+
+ default:
+ {
+ FILE *logfp;
+ char tmpstr[24];
+ time_t raw_time;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ time(&raw_time);
+ strftime(tmpstr, 23, date_format, localtime(&raw_time));
+ fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
+ fprintf(logfp, "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
+ fprintf(logfp, "Detail (in hex):" RETCODE);
+ fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ for(i = 0; i < RFIFOREST(fd); i++) {
+ if ((i & 15) == 0)
+ fprintf(logfp, "%04X ",i);
+ fprintf(logfp, "%02x ", RFIFOB(fd,i));
+ if (RFIFOB(fd,i) > 0x1f)
+ tmpstr[i % 16] = RFIFOB(fd,i);
+ else
+ tmpstr[i % 16] = '.';
+ if ((i - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ else if ((i + 1) % 16 == 0) {
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ }
+ }
+ if (i % 16 != 0) {
+ for(j = i; j % 16 != 0; j++) {
+ fprintf(logfp, " ");
+ if ((j - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ }
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ }
+ fprintf(logfp, RETCODE);
+ fclose(logfp);
+ }
+ }
+ login_log("'ladmin': End of connection, unknown packet (ip: %s)" RETCODE, ip);
+ session[fd]->eof = 1;
+ ShowWarning("Remote administration has been disconnected (unknown packet).\n");
+ return 0;
+ }
+ //WFIFOW(fd,0) = 0x791f;
+ //WFIFOSET(fd,2);
+ }
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+//--------------------------------------------
+// Test to know if an IP come from LAN or WAN.
+// Rewrote: Adnvanced subnet check [LuzZza]
+//--------------------------------------------
+int lan_subnetcheck(long *p) {
+
+ int i;
+ unsigned char *sbn, *msk, *src = (unsigned char *)p;
+
+ for(i=0; i<subnet_count; i++) {
+
+ if(subnet[i].subnet == (*p & subnet[i].mask)) {
+
+ sbn = (char *)&subnet[i].subnet;
+ msk = (char *)&subnet[i].mask;
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
+ src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
+
+ return subnet[i].char_ip;
+ }
+ }
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
+ return 0;
+}
+
+//----------------------------------------------------------------------------------------
+// Default packet parsing (normal players or administation/char-server connexion requests)
+//----------------------------------------------------------------------------------------
+int parse_login(int fd) {
+
+ struct mmo_account account;
+ int result, j;
+ unsigned int i;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char ip[16];
+ long subnet_char_ip;
+
+ RFIFOHEAD(fd);
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ memset(&account, 0, sizeof(account));
+
+ if (session[fd]->eof) {
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+ if (display_parse_login == 1) {
+ if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) {
+ if ((int)RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
+ ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d), account: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,6));
+ } else if (RFIFOW(fd,0) == 0x2710) {
+ if (RFIFOREST(fd) >= 86)
+ ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60));
+ } else
+ ShowDebug("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+ }
+
+ switch(RFIFOW(fd,0)) {
+ case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
+ if (RFIFOREST(fd) < 26)
+ return 0;
+ RFIFOSKIP(fd,26);
+ break;
+
+ case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ RFIFOSKIP(fd,18);
+ break;
+
+ case 0x277: // New login packet
+ case 0x64: // request client login
+ case 0x01dd: // request client login with encrypt
+ {
+ int packet_len = RFIFOREST(fd);
+
+ switch(RFIFOW(fd, 0)){
+ case 0x64:
+ if(packet_len < 55)
+ return 0;
+ break;
+ case 0x01dd:
+ if(packet_len < 47)
+ return 0;
+ break;
+ case 0x277:
+ if(packet_len < 84)
+ return 0;
+ break;
+ }
+
+ account.version = RFIFOL(fd, 2); //for exe version check [Sirius]
+ if (!account.version) account.version = 1; //Force some version...
+ memcpy(account.userid,RFIFOP(fd,6),NAME_LENGTH);
+ account.userid[23] = '\0';
+ remove_control_chars((unsigned char *)account.userid);
+ if (RFIFOW(fd,0) != 0x01dd) {
+ login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
+ memcpy(account.passwd, RFIFOP(fd,30), NAME_LENGTH);
+ account.passwd[23] = '\0';
+ remove_control_chars((unsigned char *)account.passwd);
+ } else {
+ login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
+ // If remove control characters from received password encrypted by md5,
+ // there would be a wrong result and failed to authentication. [End_of_exam]
+ memcpy(account.passwd, RFIFOP(fd,30), 16);
+ account.passwd[16] = '\0';
+ }
+#ifdef PASSWORDENC
+ account.passwdenc = (RFIFOW(fd,0) != 0x01dd) ? 0 : PASSWORDENC;
+#else
+ account.passwdenc = 0;
+#endif
+
+ if (!check_ip(session[fd]->client_addr.sin_addr.s_addr)) {
+ login_log("Connection refused: IP isn't authorised (deny/allow, ip: %s)." RETCODE, ip);
+ WFIFOHEAD(fd, 23);
+ WFIFOW(fd,0) = 0x6a;
+ WFIFOB(fd,2) = 3; // 3 = Rejected from Server
+ WFIFOSET(fd,23);
+ RFIFOSKIP(fd,packet_len);
+ break;
+ }
+
+ result = mmo_auth(&account, fd);
+ if (result == -1) {
+ int gm_level = isGM(account.account_id);
+ if (min_level_to_connect > gm_level) {
+ login_log("Connection refused: the minimum GM level for connection is %d (account: %s, GM level: %d, ip: %s)." RETCODE,
+ min_level_to_connect, account.userid, gm_level, ip);
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ } else {
+ if (gm_level)
+ ShowInfo("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
+ else
+ ShowInfo("Connection of the account '%s' accepted.\n", account.userid);
+ server_num = 0;
+ WFIFOHEAD(fd, 47+32*MAX_SERVERS);
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {
+ // Andvanced subnet check [LuzZza]
+ if((subnet_char_ip = lan_subnetcheck((long*)p)))
+ WFIFOL(fd,47+server_num*32) = subnet_char_ip;
+ else
+ WFIFOL(fd,47+server_num*32) = server[i].ip;
+ WFIFOW(fd,47+server_num*32+4) = server[i].port;
+ memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
+ WFIFOW(fd,47+server_num*32+26) = server[i].users;
+ WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
+ WFIFOW(fd,47+server_num*32+30) = server[i].new_;
+ server_num++;
+ }
+ }
+ // if at least 1 char-server
+ if (server_num > 0) {
+ WFIFOW(fd,0) = 0x69;
+ WFIFOW(fd,2) = 47+32*server_num;
+ WFIFOL(fd,4) = account.login_id1;
+ WFIFOL(fd,8) = account.account_id;
+ WFIFOL(fd,12) = account.login_id2;
+ WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used)
+ memcpy(WFIFOP(fd,20), account.lastlogin, 24); // in old version, that was for name (not more used)
+ WFIFOB(fd,46) = account.sex;
+ WFIFOSET(fd,47+32*server_num);
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ auth_fifo[auth_fifo_pos].account_id = account.account_id;
+ auth_fifo[auth_fifo_pos].login_id1 = account.login_id1;
+ auth_fifo[auth_fifo_pos].login_id2 = account.login_id2;
+ auth_fifo[auth_fifo_pos].sex = account.sex;
+ auth_fifo[auth_fifo_pos].delflag = 0;
+ auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
+ auth_fifo_pos++;
+ // if no char-server, don't send void list of servers, just disconnect the player with proper message
+ } else {
+ login_log("Connection refused: there is no char-server online (account: %s, ip: %s)." RETCODE,
+ account.userid, ip);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ }
+ }
+ } else {
+ WFIFOHEAD(fd, 23);
+ memset(WFIFOP(fd,0), '\0', 23);
+ WFIFOW(fd,0) = 0x6a;
+ WFIFOB(fd,2) = result;
+ if (result == 6) { // 6 = Your are Prohibited to log in until %s
+ i = search_account_index(account.userid);
+ if (i != -1) {
+ if (auth_dat[i].ban_until_time != 0) { // if account is banned, we send ban timestamp
+ char tmpstr[256];
+ strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
+ tmpstr[19] = '\0';
+ memcpy(WFIFOP(fd,3), tmpstr, 20);
+ } else { // we send error message
+ memcpy(WFIFOP(fd,3), auth_dat[i].error_message, 20);
+ }
+ }
+ }
+ WFIFOSET(fd,23);
+ }
+ RFIFOSKIP(fd,packet_len);
+ break;
+ }
+ case 0x01db: // Sending request of the coding key
+ case 0x791a: // Sending request of the coding key (administration packet)
+ {
+ struct login_session_data *ld;
+ if (session[fd]->session_data) {
+ ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ ld = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
+ session[fd]->session_data = ld;
+ if (!ld) {
+ ShowFatalError("login: Request for md5 key: memory allocation failure (malloc)!\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ if (RFIFOW(fd,0) == 0x01db)
+ login_log("Sending request of the coding key (ip: %s)" RETCODE, ip);
+ else
+ login_log("'ladmin': Sending request of the coding key (ip: %s)" RETCODE, ip);
+ // Creation of the coding key
+ memset(ld->md5key, '\0', sizeof(ld->md5key));
+ ld->md5keylen = rand() % 4 + 12;
+ for(i = 0; i < ld->md5keylen; i++)
+ ld->md5key[i] = rand() % 255 + 1;
+ RFIFOSKIP(fd,2);
+ WFIFOHEAD(fd, 4 + ld->md5keylen);
+ WFIFOW(fd,0) = 0x01dc;
+ WFIFOW(fd,2) = 4 + ld->md5keylen;
+ memcpy(WFIFOP(fd,4), ld->md5key, ld->md5keylen);
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ break;
+
+ case 0x2710: // Connection request of a char-server
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ {
+ int GM_value, len;
+ char* server_name;
+ WFIFOHEAD(fd, 3);
+ memcpy(account.userid,RFIFOP(fd,2),NAME_LENGTH);
+ account.userid[23] = '\0';
+ remove_control_chars((unsigned char *)account.userid);
+ memcpy(account.passwd, RFIFOP(fd,26), NAME_LENGTH);
+ account.passwd[23] = '\0';
+ remove_control_chars((unsigned char *)account.passwd);
+ account.passwdenc = 0;
+ server_name = (char*)RFIFOP(fd,60);
+ server_name[20] = '\0';
+ remove_control_chars((unsigned char *)server_name);
+ login_log("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" RETCODE,
+ server_name, RFIFOB(fd,54), RFIFOB(fd,55), RFIFOB(fd,56), RFIFOB(fd,57), RFIFOW(fd,58), ip);
+ result = mmo_auth(&account, fd);
+ if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) {
+ login_log("Connection of the char-server '%s' accepted (account: %s, pass: %s, ip: %s)" RETCODE,
+ server_name, account.userid, account.passwd, ip);
+ ShowStatus("Connection of the char-server '%s' accepted.\n", server_name);
+ memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
+ server[account.account_id].ip = RFIFOL(fd,54);
+ server[account.account_id].port = RFIFOW(fd,58);
+ memcpy(server[account.account_id].name, server_name, 20);
+ server[account.account_id].users = 0;
+ server[account.account_id].maintenance = RFIFOW(fd,82);
+ server[account.account_id].new_ = RFIFOW(fd,84);
+ server_fd[account.account_id] = fd;
+ WFIFOW(fd,0) = 0x2711;
+ WFIFOB(fd,2) = 0;
+ WFIFOSET(fd,3);
+ session[fd]->func_parse = parse_fromchar;
+ realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ // send GM account to char-server
+ len = 4;
+ WFIFOW(fd,0) = 0x2732;
+ for(i = 0; i < auth_num; i++)
+ // send only existing accounts. We can not create a GM account when server is online.
+ if ((GM_value = isGM(auth_dat[i].account_id)) > 0) {
+ WFIFOL(fd,len) = auth_dat[i].account_id;
+ WFIFOB(fd,len+4) = (unsigned char)GM_value;
+ len += 5;
+ }
+ WFIFOW(fd,2) = len;
+ WFIFOSET(fd,len);
+ } else {
+ if (server_fd[account.account_id] != -1) {
+ ShowNotice("Connection of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)\n",
+ server_name, account.account_id, account.userid, account.passwd, ip);
+ login_log("Connexion of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)" RETCODE,
+ server_name, account.account_id, account.userid, account.passwd, ip);
+ } else {
+ ShowNotice("Connection of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s).\n", server_name, account.userid, account.passwd, ip);
+ login_log("Connexion of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s)" RETCODE,
+ server_name, account.userid, account.passwd, ip);
+ }
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x2711;
+ WFIFOB(fd,2) = 3;
+ WFIFOSET(fd,3);
+ }
+ }
+ RFIFOSKIP(fd,86);
+ return 0;
+
+ case 0x7530: // Request of the server version
+ login_log("Sending of the server version (ip: %s)" RETCODE, ip);
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd,0) = 0x7531;
+ WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
+ WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
+ WFIFOB(fd,4) = ATHENA_REVISION;
+ WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
+ WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
+ WFIFOW(fd,8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd,10);
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x7532: // Request to end connection
+ login_log("End of connection (ip: %s)" RETCODE, ip);
+ session[fd]->eof = 1;
+ return 0;
+
+ case 0x7918: // Request for administation login
+ if ((int)RFIFOREST(fd) < 4 || (int)RFIFOREST(fd) < ((RFIFOW(fd,2) == 0) ? 28 : 20))
+ return 0;
+ WFIFOW(fd,0) = 0x7919;
+ WFIFOB(fd,2) = 1;
+ if (!check_ladminip(session[fd]->client_addr.sin_addr.s_addr)) {
+ login_log("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." RETCODE, ip);
+ } else {
+ struct login_session_data *ld = (struct login_session_data*)session[fd]->session_data;
+ if (RFIFOW(fd,2) == 0) { // non encrypted password
+ char password[25];
+ memcpy(password, RFIFOP(fd,4), 24);
+ password[24] = '\0';
+ remove_control_chars((unsigned char *)password);
+ // If remote administration is enabled and password sent by client matches password read from login server configuration file
+ if ((admin_state == 1) && (strcmp(password, admin_pass) == 0)) {
+ login_log("'ladmin'-login: Connection in administration mode accepted (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
+ ShowNotice("Connection of a remote administration accepted (non encrypted password).\n");
+ WFIFOB(fd,2) = 0;
+ session[fd]->func_parse = parse_admin;
+ } else if (admin_state != 1)
+ login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
+ else
+ login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
+ } else { // encrypted password
+ if (!ld)
+ ShowError("'ladmin'-login: error! MD5 key not created/requested for an administration login.\n");
+ else {
+ char md5str[64] = "", md5bin[32];
+ if (RFIFOW(fd,2) == 1) {
+ sprintf(md5str, "%s%s", ld->md5key, admin_pass); // 20 24
+ } else if (RFIFOW(fd,2) == 2) {
+ sprintf(md5str, "%s%s", admin_pass, ld->md5key); // 24 20
+ }
+ MD5_String2binary(md5str, md5bin);
+ // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file
+ if ((admin_state == 1) && (memcmp(md5bin, RFIFOP(fd,4), 16) == 0)) {
+ login_log("'ladmin'-login: Connection in administration mode accepted (encrypted password, ip: %s)" RETCODE, ip);
+ ShowNotice("Connection of a remote administration accepted (encrypted password).\n");
+ WFIFOB(fd,2) = 0;
+ session[fd]->func_parse = parse_admin;
+ } else if (admin_state != 1)
+ login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (encrypted password, ip: %s)" RETCODE, ip);
+ else
+ login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (encrypted password, ip: %s)" RETCODE, ip);
+ }
+ }
+ }
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd, (RFIFOW(fd,2) == 0) ? 28 : 20);
+ break;
+
+ default:
+ if (save_unknown_packets) {
+ FILE *logfp;
+ char tmpstr[24];
+ time_t raw_time;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ time(&raw_time);
+ strftime(tmpstr, 23, date_format, localtime(&raw_time));
+ fprintf(logfp, "%s: receiving of an unknown packet -> disconnection" RETCODE, tmpstr);
+ fprintf(logfp, "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
+ fprintf(logfp, "Detail (in hex):" RETCODE);
+ fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ for(i = 0; i < RFIFOREST(fd); i++) {
+ if ((i & 15) == 0)
+ fprintf(logfp, "%04X ",i);
+ fprintf(logfp, "%02x ", RFIFOB(fd,i));
+ if (RFIFOB(fd,i) > 0x1f)
+ tmpstr[i % 16] = RFIFOB(fd,i);
+ else
+ tmpstr[i % 16] = '.';
+ if ((i - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ else if ((i + 1) % 16 == 0) {
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ memset(tmpstr, '\0', sizeof(tmpstr));
+ }
+ }
+ if (i % 16 != 0) {
+ for(j = i; j % 16 != 0; j++) {
+ fprintf(logfp, " ");
+ if ((j - 7) % 16 == 0) // -8 + 1
+ fprintf(logfp, " ");
+ }
+ fprintf(logfp, " %s" RETCODE, tmpstr);
+ }
+ fprintf(logfp, RETCODE);
+ fclose(logfp);
+ }
+ }
+ login_log("End of connection, unknown packet (ip: %s)" RETCODE, ip);
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+//-----------------------
+// Console Command Parser [Wizputer]
+//-----------------------
+int parse_console(char *buf) {
+ char command[256];
+
+ memset(command,0,sizeof(command));
+
+ sscanf(buf, "%[^\n]", command);
+
+ login_log("Console command :%s" RETCODE, command);
+
+ if(strcmpi("shutdown", command) == 0 ||
+ strcmpi("exit", command) == 0 ||
+ strcmpi("quit", command) == 0 ||
+ strcmpi("end", command) == 0)
+ runflag = 0;
+ else if(strcmpi("alive", command) == 0 ||
+ strcmpi("status", command) == 0)
+ ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
+ else if(strcmpi("help", command) == 0) {
+ printf(CL_BOLD"Help of commands:"CL_RESET"\n");
+ printf(" To shutdown the server:\n");
+ printf(" 'shutdown|exit|qui|end'\n");
+ printf(" To know if server is alive:\n");
+ printf(" 'alive|status'\n");
+ }
+
+ return 0;
+}
+
+static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
+{
+ struct online_login_data *character= (struct online_login_data*)data;
+ if (character->char_server == -2) //Unknown server.. set them offline
+ remove_online_user(character->account_id);
+ else if (character->char_server < 0)
+ //Free data from players that have not been online for a while.
+ db_remove(online_db, key);
+ return 0;
+}
+
+static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
+{
+ online_db->foreach(online_db, online_data_cleanup_sub);
+ return 0;
+}
+//-------------------------------------------------
+// Return numerical value of a switch configuration
+// on/off, english, français, deutsch, español
+//-------------------------------------------------
+int config_switch(const char *str) {
+ if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
+ return 1;
+ if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
+ return 0;
+
+ return atoi(str);
+}
+
+//----------------------------------
+// Reading Lan Support configuration
+// Rewrote: Anvanced subnet check [LuzZza]
+//----------------------------------
+int login_lan_config_read(const char *lancfgName) {
+
+ FILE *fp;
+ int line_num = 0;
+ char line[1024], w1[64], w2[64], w3[64], w4[64];
+
+ if((fp = fopen(lancfgName, "r")) == NULL) {
+ ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ ShowInfo("Reading the configuration file %s...\n", lancfgName);
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ line_num++;
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
+
+ ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
+ continue;
+ }
+
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+ remove_control_chars((unsigned char *)w3);
+ remove_control_chars((unsigned char *)w4);
+
+ if(strcmpi(w1, "subnet") == 0) {
+
+ subnet[subnet_count].mask = inet_addr(w2);
+ subnet[subnet_count].char_ip = inet_addr(w3);
+ subnet[subnet_count].map_ip = inet_addr(w4);
+ subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
+ if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
+ ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
+ continue;
+ }
+
+ subnet_count++;
+ }
+
+ ShowStatus("Read information about %d subnetworks.\n", subnet_count);
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+//-----------------------------------
+// Reading general configuration file
+//-----------------------------------
+int login_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ ShowError("Configuration file (%s) not found.\n", cfgName);
+ return 1;
+ }
+
+ ShowInfo("Reading configuration file %s...\n", cfgName);
+ while(fgets(line, sizeof(line)-1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ memset(w2, 0, sizeof(w2));
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+
+ if(strcmpi(w1,"timestamp_format") == 0) {
+ strncpy(timestamp_format, w2, 20);
+ } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
+ stdout_with_ansisequence = config_switch(w2);
+ } else if(strcmpi(w1,"console_silent")==0){
+ msg_silent = 0; //To always allow the next line to show up.
+ ShowInfo("Console Silent Setting: %d\n", atoi(w2));
+ msg_silent = atoi(w2);
+ } else if (strcmpi(w1, "admin_state") == 0) {
+ admin_state = config_switch(w2);
+ } else if (strcmpi(w1, "admin_pass") == 0) {
+ memset(admin_pass, 0, sizeof(admin_pass));
+ strncpy(admin_pass, w2, sizeof(admin_pass));
+ admin_pass[sizeof(admin_pass)-1] = '\0';
+ } else if (strcmpi(w1, "ladminallowip") == 0) {
+ if (strcmpi(w2, "clear") == 0) {
+ if (access_ladmin_allow)
+ aFree(access_ladmin_allow);
+ access_ladmin_allow = NULL;
+ access_ladmin_allownum = 0;
+ } else {
+ if (strcmpi(w2, "all") == 0) {
+ // reset all previous values
+ if (access_ladmin_allow)
+ aFree(access_ladmin_allow);
+ // set to all
+ access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ access_ladmin_allownum = 1;
+ access_ladmin_allow[0] = '\0';
+ } else if (w2[0] && !(access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { // don't add IP if already 'all'
+ if (access_ladmin_allow)
+ access_ladmin_allow = (char*)aRealloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE);
+ else
+ access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ strncpy(access_ladmin_allow + (access_ladmin_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
+ access_ladmin_allow[access_ladmin_allownum * ACO_STRSIZE - 1] = '\0';
+ }
+ }
+ } else if (strcmpi(w1, "gm_pass") == 0) {
+ memset(gm_pass, 0, sizeof(gm_pass));
+ strncpy(gm_pass, w2, sizeof(gm_pass));
+ gm_pass[sizeof(gm_pass)-1] = '\0';
+ } else if (strcmpi(w1, "level_new_gm") == 0) {
+ level_new_gm = atoi(w2);
+ } else if (strcmpi(w1, "new_account") == 0) {
+ new_account_flag = config_switch(w2);
+ } else if (strcmpi(w1, "bind_ip") == 0) {
+ bind_ip = resolve_hostbyname(w2, NULL, bind_ip_str);
+ if (bind_ip)
+ ShowStatus("Login server binding IP address : %s -> %s\n", w2, bind_ip_str);
+ } else if (strcmpi(w1, "login_port") == 0) {
+ login_port = atoi(w2);
+ } else if (strcmpi(w1, "account_filename") == 0) {
+ memset(account_filename, 0, sizeof(account_filename));
+ strncpy(account_filename, w2, sizeof(account_filename));
+ account_filename[sizeof(account_filename)-1] = '\0';
+ } else if (strcmpi(w1, "gm_account_filename") == 0) {
+ memset(GM_account_filename, 0, sizeof(GM_account_filename));
+ strncpy(GM_account_filename, w2, sizeof(GM_account_filename));
+ GM_account_filename[sizeof(GM_account_filename)-1] = '\0';
+ } else if (strcmpi(w1, "gm_account_filename_check_timer") == 0) {
+ gm_account_filename_check_timer = atoi(w2);
+ } else if (strcmpi(w1, "use_MD5_passwords") == 0) {
+ use_md5_passwds = config_switch(w2);
+ } else if (strcmpi(w1, "login_log_filename") == 0) {
+ memset(login_log_filename, 0, sizeof(login_log_filename));
+ strncpy(login_log_filename, w2, sizeof(login_log_filename));
+ login_log_filename[sizeof(login_log_filename)-1] = '\0';
+ } else if (strcmpi(w1, "log_login") == 0) {
+ log_login = atoi(w2);
+ } else if (strcmpi(w1, "login_log_unknown_packets_filename") == 0) {
+ memset(login_log_unknown_packets_filename, 0, sizeof(login_log_unknown_packets_filename));
+ strncpy(login_log_unknown_packets_filename, w2, sizeof(login_log_unknown_packets_filename));
+ login_log_unknown_packets_filename[sizeof(login_log_unknown_packets_filename)-1] = '\0';
+ } else if (strcmpi(w1, "save_unknown_packets") == 0) {
+ save_unknown_packets = config_switch(w2);
+ } else if (strcmpi(w1, "display_parse_login") == 0) {
+ display_parse_login = config_switch(w2); // 0: no, 1: yes
+ } else if (strcmpi(w1, "display_parse_admin") == 0) {
+ display_parse_admin = config_switch(w2); // 0: no, 1: yes
+ } else if (strcmpi(w1, "display_parse_fromchar") == 0) {
+ display_parse_fromchar = config_switch(w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets
+ } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
+ memset(date_format, 0, sizeof(date_format));
+ switch (atoi(w2)) {
+ case 0:
+ strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
+ break;
+ case 1:
+ strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
+ break;
+ case 2:
+ strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
+ break;
+ case 3:
+ strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
+ break;
+ }
+ } else if (strcmpi(w1, "min_level_to_connect") == 0) {
+ min_level_to_connect = atoi(w2);
+ } else if (strcmpi(w1, "add_to_unlimited_account") == 0) {
+ add_to_unlimited_account = config_switch(w2);
+ } else if (strcmpi(w1, "start_limited_time") == 0) {
+ start_limited_time = atoi(w2);
+ } else if (strcmpi(w1, "check_ip_flag") == 0) {
+ check_ip_flag = config_switch(w2);
+ } else if (strcmpi(w1, "order") == 0) {
+ access_order = atoi(w2);
+ if (strcmpi(w2, "deny,allow") == 0 ||
+ strcmpi(w2, "deny, allow") == 0) access_order = ACO_DENY_ALLOW;
+ if (strcmpi(w2, "allow,deny") == 0 ||
+ strcmpi(w2, "allow, deny") == 0) access_order = ACO_ALLOW_DENY;
+ if (strcmpi(w2, "mutual-failture") == 0 ||
+ strcmpi(w2, "mutual-failure") == 0) access_order = ACO_MUTUAL_FAILTURE;
+ } else if (strcmpi(w1, "allow") == 0) {
+ if (strcmpi(w2, "clear") == 0) {
+ if (access_allow)
+ aFree(access_allow);
+ access_allow = NULL;
+ access_allownum = 0;
+ } else {
+ if (strcmpi(w2, "all") == 0) {
+ // reset all previous values
+ if (access_allow)
+ aFree(access_allow);
+ // set to all
+ access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ access_allownum = 1;
+ access_allow[0] = '\0';
+ } else if (w2[0] && !(access_allownum == 1 && access_allow[0] == '\0')) { // don't add IP if already 'all'
+ if (access_allow)
+ access_allow = (char*)aRealloc(access_allow, (access_allownum+1) * ACO_STRSIZE);
+ else
+ access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ strncpy(access_allow + (access_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
+ access_allow[access_allownum * ACO_STRSIZE - 1] = '\0';
+ }
+ }
+ } else if (strcmpi(w1, "deny") == 0) {
+ if (strcmpi(w2, "clear") == 0) {
+ if (access_deny)
+ aFree(access_deny);
+ access_deny = NULL;
+ access_denynum = 0;
+ } else {
+ if (strcmpi(w2, "all") == 0) {
+ // reset all previous values
+ if (access_deny)
+ aFree(access_deny);
+ // set to all
+ access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ access_denynum = 1;
+ access_deny[0] = '\0';
+ } else if (w2[0] && !(access_denynum == 1 && access_deny[0] == '\0')) { // don't add IP if already 'all'
+ if (access_deny)
+ access_deny = (char*)aRealloc(access_deny, (access_denynum+1) * ACO_STRSIZE);
+ else
+ access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
+ strncpy(access_deny + (access_denynum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
+ access_deny[access_denynum * ACO_STRSIZE - 1] = '\0';
+ }
+ }
+ // dynamic password error ban
+ } else if (strcmpi(w1, "dynamic_pass_failure_ban") == 0) {
+ dynamic_pass_failure_ban = config_switch(w2);
+ } else if (strcmpi(w1, "dynamic_pass_failure_ban_time") == 0) {
+ dynamic_pass_failure_ban_time = atoi(w2);
+ } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_many") == 0) {
+ dynamic_pass_failure_ban_how_many = atoi(w2);
+ } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_long") == 0) {
+ dynamic_pass_failure_ban_how_long = atoi(w2);
+ } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
+ check_client_version = 1;
+ }
+ if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
+ check_client_version = 0;
+ }
+ }else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
+ client_version_to_connect = atoi(w2); //Added by Sirius for client version check
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ } else if (strcmpi(w1, "allowed_regs") == 0) { //account flood protection system [Kevin]
+ allowed_regs = atoi(w2);
+ } else if (strcmpi(w1, "time_allowed") == 0) {
+ time_allowed = atoi(w2);
+ } else if (strcmpi(w1, "online_check") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ online_check = 1;
+ else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
+ online_check = 0;
+ else
+ online_check = atoi(w2);
+ } else if (strcmpi(w1, "import") == 0) {
+ login_config_read(w2);
+ } else if(strcmpi(w1,"use_dnsbl")==0) { // [Zido]
+ use_dnsbl=atoi(w2);
+ } else if(strcmpi(w1,"dnsbl_servers")==0) { // [Zido]
+ strcpy(dnsbl_servs,w2);
+ } else if(strcmpi(w1,"ip_sync_interval")==0) {
+ ip_sync_interval = 1000*60*atoi(w2); //w2 comes in minutes.
+ }
+ }
+ }
+ fclose(fp);
+
+ ShowInfo("Finished reading %s.\n", cfgName);
+
+ return 0;
+}
+
+//-------------------------------------
+// Displaying of configuration warnings
+//-------------------------------------
+void display_conf_warnings(void) {
+ if (admin_state != 0 && admin_state != 1) {
+ ShowWarning("Invalid value for admin_state parameter -> setting to 0 (no remote admin).\n");
+ admin_state = 0;
+ }
+
+ if (admin_state == 1) {
+ if (admin_pass[0] == '\0') {
+ ShowWarning("Administrator password is void (admin_pass).\n");
+ } else if (strcmp(admin_pass, "admin") == 0) {
+ ShowWarning("You are using the default administrator password (admin_pass).\n");
+ ShowWarning(" We highly recommend that you change it.\n");
+ }
+ }
+
+ if (gm_pass[0] == '\0') {
+ ShowWarning("'To GM become' password is void (gm_pass).\n");
+ ShowWarning(" We highly recommend that you set one password.\n");
+ } else if (strcmp(gm_pass, "gm") == 0) {
+ ShowWarning("You are using the default GM password (gm_pass).\n");
+ ShowWarning(" We highly recommend that you change it.\n");
+ }
+
+ if (level_new_gm < 0 || level_new_gm > 99) {
+ ShowWarning("Invalid value for level_new_gm parameter -> setting to 60 (default).\n");
+ level_new_gm = 60;
+ }
+
+ if (new_account_flag != 0 && new_account_flag != 1) {
+ ShowWarning("Invalid value for new_account parameter -> setting to 0 (no new account).\n");
+ new_account_flag = 0;
+ }
+
+ if (login_port < 1024 || login_port > 65535) {
+ ShowWarning("Invalid value for login_port parameter -> setting to 6900 (default).\n");
+ login_port = 6900;
+ }
+
+ if (gm_account_filename_check_timer < 0) {
+ ShowWarning("Invalid value for gm_account_filename_check_timer parameter. Setting to 15 sec (default).\n");
+ gm_account_filename_check_timer = 15;
+ } else if (gm_account_filename_check_timer == 1) {
+ ShowWarning("Invalid value for gm_account_filename_check_timer parameter. Setting to 2 sec (minimum value).\n");
+ gm_account_filename_check_timer = 2;
+ }
+
+ if (save_unknown_packets != 0 && save_unknown_packets != 1) {
+ ShowWarning("Invalid value for save_unknown_packets parameter -> setting to 0-no save.\n");
+ save_unknown_packets = 0;
+ }
+
+ if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes
+ ShowWarning("Invalid value for display_parse_login parameter -> setting to 0 (no display).\n");
+ display_parse_login = 0;
+ }
+
+ if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes
+ ShowWarning("Invalid value for display_parse_admin parameter -> setting to 0 (no display).\n");
+ display_parse_admin = 0;
+ }
+
+ if (display_parse_fromchar < 0 || display_parse_fromchar > 2) { // 0: no, 1: yes (without packet 0x2714), 2: all packets
+ ShowWarning("Invalid value for display_parse_fromchar parameter -> setting to 0 (no display).\n");
+ display_parse_fromchar = 0;
+ }
+
+ if (min_level_to_connect < 0) { // 0: all players, 1-99 at least gm level x
+ ShowWarning("Invalid value for min_level_to_connect (%d) parameter -> setting 0 (any player).\n", min_level_to_connect);
+ min_level_to_connect = 0;
+ } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x
+ ShowWarning("Invalid value for min_level_to_connect (%d) parameter -> setting to 99 (only GM level 99)\n", min_level_to_connect);
+ min_level_to_connect = 99;
+ }
+
+ if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes
+ ShowWarning("Invalid value for add_to_unlimited_account parameter\n");
+ ShowWarning(" -> setting to 0 (impossible to add a time to an unlimited account).\n");
+ add_to_unlimited_account = 0;
+ }
+
+ if (start_limited_time < -1) { // -1: create unlimited account, 0 or more: additionnal sec from now to create limited time
+ ShowWarning("Invalid value for start_limited_time parameter\n");
+ ShowWarning(" -> setting to -1 (new accounts are created with unlimited time).\n");
+ start_limited_time = -1;
+ }
+
+ if (check_ip_flag != 0 && check_ip_flag != 1) { // 0: no, 1: yes
+ ShowWarning("Invalid value for check_ip_flag parameter\n");
+ ShowWarning(" -> setting to 1 (check players ip between login-server & char-server).\n");
+ check_ip_flag = 1;
+ }
+
+ if (access_order == ACO_DENY_ALLOW) {
+ if (access_denynum == 1 && access_deny[0] == '\0') {
+ ShowWarning("The IP security order is 'deny,allow' (allow if not deny) and you refuse ALL IP.\n");
+ }
+ } else if (access_order == ACO_ALLOW_DENY) {
+ if (access_allownum == 0) {
+ ShowWarning("The IP security order is 'allow,deny' (deny if not allow) but, NO IP IS AUTHORISED!\n");
+ }
+ } else { // ACO_MUTUAL_FAILTURE
+ if (access_allownum == 0) {
+ ShowWarning("The IP security order is 'mutual-failture'\n");
+ ShowWarning(" (allow if in the allow list and not in the deny list).\n");
+ ShowWarning(" But, NO IP IS AUTHORISED!\n");
+ } else if (access_denynum == 1 && access_deny[0] == '\0') {
+ ShowWarning("The IP security order is mutual-failture\n");
+ ShowWarning(" (allow if in the allow list and not in the deny list).\n");
+ ShowWarning(" But, you refuse ALL IP!\n");
+ }
+ }
+
+ if (dynamic_pass_failure_ban != 0) {
+ if (dynamic_pass_failure_ban_time < 1) {
+ ShowWarning("Invalid value for dynamic_pass_failure_ban_time (%d) parameter\n", dynamic_pass_failure_ban_time);
+ ShowWarning(" -> setting to 5 (5 minutes to look number of invalid passwords.\n");
+ dynamic_pass_failure_ban_time = 5;
+ }
+ if (dynamic_pass_failure_ban_how_many < 1) {
+ ShowWarning("Invalid value for dynamic_pass_failure_ban_how_many (%d) parameter\n", dynamic_pass_failure_ban_how_many);
+ ShowWarning(" -> setting to 3 (3 invalid passwords before to temporarily ban.\n");
+ dynamic_pass_failure_ban_how_many = 3;
+ }
+ if (dynamic_pass_failure_ban_how_long < 1) {
+ ShowWarning("Invalid value for dynamic_pass_failure_ban_how_long (%d) parameter\n", dynamic_pass_failure_ban_how_long);
+ ShowWarning(" -> setting to 1 (1 minute of temporarily ban.\n");
+ dynamic_pass_failure_ban_how_long = 1;
+ }
+ }
+
+ return;
+}
+
+//-------------------------------
+// Save configuration in log file
+//-------------------------------
+void save_config_in_log(void) {
+ int i;
+
+ // a newline in the log...
+ login_log("");
+ login_log("The login-server starting..." RETCODE);
+
+ // save configuration in log file
+ login_log("The configuration of the server is set:" RETCODE);
+
+ if (admin_state != 1)
+ login_log("- with no remote administration." RETCODE);
+ else if (admin_pass[0] == '\0')
+ login_log("- with a remote administration with a VOID password." RETCODE);
+ else if (strcmp(admin_pass, "admin") == 0)
+ login_log("- with a remote administration with the DEFAULT password." RETCODE);
+ else
+ login_log("- with a remote administration with the password of %d character(s)." RETCODE, strlen(admin_pass));
+ if (access_ladmin_allownum == 0 || (access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) {
+ login_log("- to accept any IP for remote administration" RETCODE);
+ } else {
+ login_log("- to accept following IP for remote administration:" RETCODE);
+ for(i = 0; i < access_ladmin_allownum; i++)
+ login_log(" %s" RETCODE, (char *)(access_ladmin_allow + i * ACO_STRSIZE));
+ }
+
+ if (gm_pass[0] == '\0')
+ login_log("- with a VOID 'To GM become' password (gm_pass)." RETCODE);
+ else if (strcmp(gm_pass, "gm") == 0)
+ login_log("- with the DEFAULT 'To GM become' password (gm_pass)." RETCODE);
+ else
+ login_log("- with a 'To GM become' password (gm_pass) of %d character(s)." RETCODE, strlen(gm_pass));
+ if (level_new_gm == 0)
+ login_log("- to refuse any creation of GM with @gm." RETCODE);
+ else
+ login_log("- to create GM with level '%d' when @gm is used." RETCODE, level_new_gm);
+
+ if (new_account_flag == 1)
+ login_log("- to ALLOW new users (with _F/_M)." RETCODE);
+ else
+ login_log("- to NOT ALLOW new users (with _F/_M)." RETCODE);
+ login_log("- with port: %d." RETCODE, login_port);
+ login_log("- with the accounts file name: '%s'." RETCODE, account_filename);
+ login_log("- with the GM accounts file name: '%s'." RETCODE, GM_account_filename);
+ if (gm_account_filename_check_timer == 0)
+ login_log("- to NOT check GM accounts file modifications." RETCODE);
+ else
+ login_log("- to check GM accounts file modifications every %d seconds." RETCODE, gm_account_filename_check_timer);
+
+ if (use_md5_passwds == 0)
+ login_log("- to save password in plain text." RETCODE);
+ else
+ login_log("- to save password with MD5 encrypting." RETCODE);
+
+ // not necessary to log the 'login_log_filename', we are inside :)
+
+ login_log("- with the unknown packets file name: '%s'." RETCODE, login_log_unknown_packets_filename);
+ if (save_unknown_packets)
+ login_log("- to SAVE all unkown packets." RETCODE);
+ else
+ login_log("- to SAVE only unkown packets sending by a char-server or a remote administration." RETCODE);
+ if (display_parse_login)
+ login_log("- to display normal parse packets on console." RETCODE);
+ else
+ login_log("- to NOT display normal parse packets on console." RETCODE);
+ if (display_parse_admin)
+ login_log("- to display administration parse packets on console." RETCODE);
+ else
+ login_log("- to NOT display administration parse packets on console." RETCODE);
+ if (display_parse_fromchar)
+ login_log("- to display char-server parse packets on console." RETCODE);
+ else
+ login_log("- to NOT display char-server parse packets on console." RETCODE);
+
+ if (min_level_to_connect == 0) // 0: all players, 1-99 at least gm level x
+ login_log("- with no minimum level for connection." RETCODE);
+ else if (min_level_to_connect == 99)
+ login_log("- to accept only GM with level 99." RETCODE);
+ else
+ login_log("- to accept only GM with level %d or more." RETCODE, min_level_to_connect);
+
+ if (add_to_unlimited_account)
+ login_log("- to authorize adjustment (with timeadd ladmin) on an unlimited account." RETCODE);
+ else
+ login_log("- to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before." RETCODE);
+
+ if (start_limited_time < 0)
+ login_log("- to create new accounts with an unlimited time." RETCODE);
+ else if (start_limited_time == 0)
+ login_log("- to create new accounts with a limited time: time of creation." RETCODE);
+ else
+ login_log("- to create new accounts with a limited time: time of creation + %d second(s)." RETCODE, start_limited_time);
+
+ if (check_ip_flag)
+ login_log("- with control of players IP between login-server and char-server." RETCODE);
+ else
+ login_log("- to not check players IP between login-server and char-server." RETCODE);
+
+ if (access_order == ACO_DENY_ALLOW) {
+ if (access_denynum == 0) {
+ login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP." RETCODE);
+ } else if (access_denynum == 1 && access_deny[0] == '\0') {
+ login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse ALL IP." RETCODE);
+ } else {
+ login_log("- with the IP security order: 'deny,allow' (allow if not deny). Refused IP are:" RETCODE);
+ for(i = 0; i < access_denynum; i++)
+ login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
+ }
+ } else if (access_order == ACO_ALLOW_DENY) {
+ if (access_allownum == 0) {
+ login_log("- with the IP security order: 'allow,deny' (deny if not allow). But, NO IP IS AUTHORISED!" RETCODE);
+ } else if (access_allownum == 1 && access_allow[0] == '\0') {
+ login_log("- with the IP security order: 'allow,deny' (deny if not allow). You authorise ALL IP." RETCODE);
+ } else {
+ login_log("- with the IP security order: 'allow,deny' (deny if not allow). Authorised IP are:" RETCODE);
+ for(i = 0; i < access_allownum; i++)
+ login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
+ }
+ } else { // ACO_MUTUAL_FAILTURE
+ login_log("- with the IP security order: 'mutual-failture' (allow if in the allow list and not in the deny list)." RETCODE);
+ if (access_allownum == 0) {
+ login_log(" But, NO IP IS AUTHORISED!" RETCODE);
+ } else if (access_denynum == 1 && access_deny[0] == '\0') {
+ login_log(" But, you refuse ALL IP!" RETCODE);
+ } else {
+ if (access_allownum == 1 && access_allow[0] == '\0') {
+ login_log(" You authorise ALL IP." RETCODE);
+ } else {
+ login_log(" Authorised IP are:" RETCODE);
+ for(i = 0; i < access_allownum; i++)
+ login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
+ }
+ login_log(" Refused IP are:" RETCODE);
+ for(i = 0; i < access_denynum; i++)
+ login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
+ }
+
+ // dynamic password error ban
+ if (dynamic_pass_failure_ban == 0)
+ login_log("- with NO dynamic password error ban." RETCODE);
+ else {
+ login_log("- with a dynamic password error ban:" RETCODE);
+ login_log(" After %d invalid password in %d minutes" RETCODE, dynamic_pass_failure_ban_how_many, dynamic_pass_failure_ban_time);
+ login_log(" IP is banned for %d minutes" RETCODE, dynamic_pass_failure_ban_how_long);
+ }
+ }
+}
+
+//--------------------------------------
+// Function called at exit of the server
+//--------------------------------------
+void do_final(void) {
+ int i, fd;
+ ShowInfo("Terminating...\n");
+ fflush(stdout);
+ mmo_auth_sync();
+ online_db->destroy(online_db, NULL);
+
+ if(auth_dat) aFree(auth_dat);
+ if(gm_account_db) aFree(gm_account_db);
+ if(access_ladmin_allow) aFree(access_ladmin_allow);
+ if(access_allow) aFree(access_allow);
+ if(access_deny) aFree(access_deny);
+ for (i = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server_fd[i]) >= 0) {
+ server_fd[i] = -1;
+ memset(&server[i], 0, sizeof(struct mmo_char_server));
+ do_close(fd);
+ }
+ }
+ do_close(login_fd);
+
+ login_log("----End of login-server (normal end with closing of all files)." RETCODE);
+
+ if(log_fp)
+ fclose(log_fp);
+ ShowStatus("Finished.\n");
+}
+
+//------------------------------
+// Main function of login-server
+//------------------------------
+void set_server_type(void)
+{
+ SERVER_TYPE = ATHENA_SERVER_LOGIN;
+}
+int do_init(int argc, char **argv) {
+ int i, j;
+
+ // read login-server configuration
+ login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME);
+ display_conf_warnings(); // not in login_config_read, because we can use 'import' option, and display same message twice or more
+ save_config_in_log(); // not before, because log file name can be changed
+ login_lan_config_read((argc > 2) ? argv[2] : LAN_CONF_NAME);
+
+ srand((unsigned int)time(NULL));
+
+ for(i = 0; i< AUTH_FIFO_SIZE; i++)
+ auth_fifo[i].delflag = 1;
+ for(i = 0; i < MAX_SERVERS; i++)
+ server_fd[i] = -1;
+
+ gm_account_db = NULL;
+ GM_num = 0;
+ GM_max = 0;
+ mmo_auth_init();
+ read_gm_account();
+ set_defaultparse(parse_login);
+ // Online user database init
+ online_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); // reinitialise
+ add_timer_func_list(waiting_disconnect_timer, "waiting_disconnect_timer");
+
+ login_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,login_port);
+
+ add_timer_func_list(check_auth_sync, "check_auth_sync");
+ add_timer_interval(gettick() + 60000, check_auth_sync, 0, 0, 60000); // every 60 sec we check if we must save accounts file (only if necessary to save)
+
+ // add timer to check GM accounts file modification
+ j = gm_account_filename_check_timer;
+ if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists)
+ j = 60;
+
+ add_timer_func_list(check_GM_file, "check_GM_file");
+ add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
+
+
+ add_timer_func_list(online_data_cleanup, "online_data_cleanup");
+ add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600*1000); // every 10 minutes cleanup online account db.
+
+ if (ip_sync_interval) {
+ add_timer_func_list(sync_ip_addresses, "sync_ip_addresses");
+ add_timer_interval(gettick() + ip_sync_interval, sync_ip_addresses, 0, 0, ip_sync_interval);
+ }
+ if(console) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ login_log("The login-server is ready (Server is listening on the port %d)." RETCODE, login_port);
+ ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", login_port);
+
+ return 0;
+}
diff --git a/src/login/md5calc.c b/src/login/md5calc.c
index 5c52670c7..fd8ffd5d3 100644
--- a/src/login/md5calc.c
+++ b/src/login/md5calc.c
@@ -1,236 +1,236 @@
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// String Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
+/***********************************************************
+ * md5 calculation algorithm
+ *
+ * The source code referred to the following URL.
+ * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
+ *
+ ***********************************************************/
+
+#include "md5calc.h"
+#include <string.h>
+#include <stdio.h>
+
+#ifndef UINT_MAX
+#define UINT_MAX 4294967295U
+#endif
+
+// Global variable
+static unsigned int *pX;
+
+// String Table
+static const unsigned int T[] = {
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
+ 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
+};
+
+// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+// The function used for other calculation
+static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Y) | (~X & Z);
+}
+static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Z) | (Y & ~Z);
+}
+static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return X ^ Y ^ Z;
+}
+static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return Y ^ (X | ~Z);
+}
+
+static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
+ unsigned int k, unsigned int s, unsigned int i)
+{
+ return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
+}
+
+static void Round1(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, F(b,c,d), k, s, i);
+}
+static void Round2(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, G(b,c,d), k, s, i);
+}
+static void Round3(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, H(b,c,d), k, s, i);
+}
+static void Round4(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, I(b,c,d), k, s, i);
+}
+
+static void MD5_Round_Calculate(const unsigned char *block,
+ unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
+{
+ //create X It is since it is required.
+ unsigned int X[16]; //512bit 64byte
+ int j,k;
+
+ //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
+ unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
+ unsigned int AA = A,BB = B,CC = C,DD = D;
+
+ //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
+ pX = X;
+
+ //Copy block(padding_message) i into X
+ for (j=0,k=0; j<64; j+=4,k++)
+ X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
+ | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
+ | ( ((unsigned int )block[j+2]) << 16 )
+ | ( ((unsigned int )block[j+3]) << 24 );
+
+
+ //Round 1
+ Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
+ Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
+ Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
+ Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
+
+ //Round 2
+ Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
+ Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
+ Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
+ Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
+
+ //Round 3
+ Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
+ Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
+ Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
+ Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
+
+ //Round 4
+ Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
+ Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
+ Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
+ Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
+
+ // Then perform the following additions. (let's add)
+ *A2 = A + AA;
+ *B2 = B + BB;
+ *C2 = C + CC;
+ *D2 = D + DD;
+
+ //The clearance of confidential information
+ memset(pX, 0, sizeof(X));
+}
+
+//-------------------------------------------------------------------
+// The function for the exteriors
+
+/** output is the coded binary in the character sequence which wants to code string. */
+void MD5_String2binary(const char * string, char * output)
+{
+//var
+ /*8bit*/
+ unsigned char padding_message[64]; //Extended message 512bit 64byte
+ unsigned char *pstring; //The position of string in the present scanning notes is held.
+
+// unsigned char digest[16];
+ /*32bit*/
+ unsigned int string_byte_len, //The byte chief of string is held.
+ string_bit_len, //The bit length of string is held.
+ copy_len, //The number of bytes which is used by 1-3 and which remained
+ msg_digest[4]; //Message digest 128bit 4byte
+ unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
+ *B = &msg_digest[1],
+ *C = &msg_digest[2],
+ *D = &msg_digest[3];
+ int i;
+
+//prog
+ //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
+ *A = 0x67452301;
+ *B = 0xefcdab89;
+ *C = 0x98badcfe;
+ *D = 0x10325476;
+
+ //Step 1.Append Padding Bits (extension of a mark bit)
+ //1-1
+ string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
+ pstring = (unsigned char *)string; //The position of the present character sequence is set.
+
+ //1-2 Repeat calculation until length becomes less than 64 bytes.
+ for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
+ MD5_Round_Calculate(pstring, A,B,C,D);
+
+ //1-3
+ copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
+ strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
+ memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
+ padding_message[copy_len] |= 0x80; //The next of a message is 1.
+
+ //1-4
+ //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
+ if (56 <= copy_len) {
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+ memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
+ }
+
+
+ //Step 2.Append Length (the information on length is added)
+ string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
+ memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
+
+ //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
+ if (UINT_MAX / 8 < string_byte_len) {
+ unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
+ memcpy(&padding_message[60], &high, 4);
+ } else
+ memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
+
+ //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+
+
+ //Step 5.Output (output)
+ memcpy(output,msg_digest,16);
+// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
+/* sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);*/
+}
+
+/** output is the coded character sequence in the character sequence which wants to code string. */
+void MD5_String(const char * string, char * output)
+{
+ unsigned char digest[16];
+
+ MD5_String2binary(string,(char*)digest);
+ sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);
+}
+
diff --git a/src/login/md5calc.h b/src/login/md5calc.h
index 04fb2d8c5..9bc554f69 100644
--- a/src/login/md5calc.h
+++ b/src/login/md5calc.h
@@ -1,7 +1,7 @@
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
+#ifndef _MD5CALC_H_
+#define _MD5CALC_H_
+
+void MD5_String(const char * string, char * output);
+void MD5_String2binary(const char * string, char * output);
+
+#endif
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
index a0b3770ed..c37329694 100644
--- a/src/login_sql/login.c
+++ b/src/login_sql/login.c
@@ -1,2398 +1,2398 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <sys/types.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#ifdef __WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/malloc.h"
-#include "../common/db.h"
-#include "../common/timer.h"
-#include "../common/strlib.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/version.h"
-#include "../common/cbasetypes.h"
-#include "login.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#define J_MAX_MALLOC_SIZE 65535
-
-//-----------------------------------------------------
-// global variable
-//-----------------------------------------------------
-int use_dnsbl=0; // [Zido]
-char dnsbl_servs[1024];
-int server_num;
-int new_account_flag = 0; //Set from config too XD [Sirius]
-in_addr_t bind_ip= 0;
-char bind_ip_str[128];
-int login_port = 6900;
-
-// Advanced subnet check [LuzZza]
-struct _subnet {
- long subnet;
- long mask;
- long char_ip;
- long map_ip;
-} subnet[16];
-
-int subnet_count = 0;
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-int login_fd;
-
-//Account flood protection [Kevin]
-unsigned int new_reg_tick=0;
-int allowed_regs=1;
-int num_regs=0;
-int time_allowed=10; //Init this to 10 secs, not 10K secs [Skotlex]
-
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-unsigned int auth_num = 0, auth_max = 0;
-
-int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
-int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-int check_client_version = 0; //Client version check ON/OFF .. (sirius)
-int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
-static int online_check=1; //When set to 1, login server rejects incoming players that are already registered as online. [Skotlex]
-static int ip_sync_interval = 0;
-
-MYSQL mysql_handle;
-
-int ipban = 1;
-int dynamic_account_ban = 1;
-int dynamic_account_ban_class = 0;
-int dynamic_pass_failure_ban = 1;
-int dynamic_pass_failure_ban_time = 5;
-int dynamic_pass_failure_ban_how_many = 3;
-int dynamic_pass_failure_ban_how_long = 60;
-
-int login_server_port = 3306;
-char login_server_ip[32] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-char default_codepage[32] = ""; //Feature by irmin.
-int use_md5_passwds = 0;
-char login_db[256] = "login";
-int log_login=1; //Whether to log the logins or not. [Skotlex]
-char loginlog_db[256] = "loginlog";
-bool login_gm_read = true;
-int connection_ping_interval = 0;
-
-// added to help out custom login tables, without having to recompile
-// source so options are kept in the login_athena.conf or the inter_athena.conf
-char login_db_account_id[256] = "account_id";
-char login_db_userid[256] = "userid";
-char login_db_user_pass[256] = "user_pass";
-char login_db_level[256] = "level";
-
-char gm_db[256] = "gm_accounts";
-
-char reg_db[256] = "global_reg_value";
-
-struct gm_account *gm_account_db;
-int GM_num;
-char tmpsql[65535], tmp_sql[65535];
-
-int console = 0;
-
-int case_sensitive = 1;
-
-//-----------------------------------------------------
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id,login_id1,login_id2;
- int ip,sex,delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-
-int auth_fifo_pos = 0;
-
-struct online_login_data {
- int account_id;
- short char_server;
- short waiting_disconnect;
-};
-
-//-----------------------------------------------------
-
-static char md5key[20], md5keylen = 16;
-
-struct dbt *online_db;
-
-static void* create_online_user(DBKey key, va_list args) {
- struct online_login_data *p;
- p = aCalloc(1, sizeof(struct online_login_data));
- p->account_id = key.i;
- p->char_server = -1;
- return p;
-}
-
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len);
-
-//-----------------------------------------------------
-// Online User Database [Wizputer]
-//-----------------------------------------------------
-
-void add_online_user(int char_server, int account_id) {
- struct online_login_data *p;
- if (!online_check)
- return;
- p = idb_ensure(online_db, account_id, create_online_user);
- p->char_server = char_server;
- p->waiting_disconnect = 0;
-}
-
-int is_user_online(int account_id) {
- return (idb_get(online_db, account_id) != NULL);
-}
-
-void remove_online_user(int account_id) {
- if(!online_check)
- return;
- if (account_id == 99) { // reset all to offline
- online_db->clear(online_db, NULL);
- return;
- }
- idb_remove(online_db,account_id);
-}
-
-int waiting_disconnect_timer(int tid, unsigned int tick, int id, int data)
-{
- struct online_login_data *p;
- if ((p= idb_get(online_db, id)) != NULL && p->waiting_disconnect)
- remove_online_user(id);
- return 0;
-}
-
-static int sync_ip_addresses(int tid, unsigned int tick, int id, int data){
- unsigned char buf[2];
- ShowInfo("IP Sync in progress...\n");
- WBUFW(buf,0) = 0x2735;
- charif_sendallwos(-1, buf, 2);
- return 0;
-}
-
-//-----------------------------------------------------
-// Read GM accounts
-//-----------------------------------------------------
-void read_gm_account(void) {
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row;
-
- if(!login_gm_read)
- return;
- sprintf(tmp_sql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`> '0'",login_db_account_id,login_db_level,login_db,login_db_level);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return; //Failed to read GM list!
- }
-
- if (gm_account_db != NULL)
- {
- aFree(gm_account_db);
- gm_account_db = NULL;
- }
- GM_num = 0;
-
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- gm_account_db = (struct gm_account*)aCalloc((size_t)mysql_num_rows(sql_res), sizeof(struct gm_account));
- while ((sql_row = mysql_fetch_row(sql_res))) {
- gm_account_db[GM_num].account_id = atoi(sql_row[0]);
- gm_account_db[GM_num].level = atoi(sql_row[1]);
- GM_num++;
- }
- mysql_free_result(sql_res);
- }
-}
-
-//-----------------------------------------------------
-// Send GM accounts to all char-server
-//-----------------------------------------------------
-void send_GM_accounts(int fd) {
- int i;
- unsigned char buf[32767];
- int len;
-
- if(!login_gm_read)
- return;
- len = 4;
- WBUFW(buf,0) = 0x2732;
- for(i = 0; i < GM_num; i++)
- // send only existing accounts. We can not create a GM account when server is online.
- if (gm_account_db[i].level > 0) {
- WBUFL(buf,len) = gm_account_db[i].account_id;
- WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level;
- len += 5;
- if (len >= 32000) {
- ShowWarning("send_GM_accounts: Too many accounts! Only %d out of %d were sent.\n", i, GM_num);
- break;
- }
- }
- WBUFW(buf,2) = len;
- if (fd == -1)
- charif_sendallwos(-1, buf, len);
- else
- {
- WFIFOHEAD(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- }
- return;
-}
-
-//-----------------------------------------------------
-// check user level
-//-----------------------------------------------------
-/*
-int isGM(int account_id) {
- int level;
-
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row;
- level = 0;
- sprintf(tmpsql,"SELECT `%s` FROM `%s` WHERE `%s`='%d'", login_db_level, login_db, login_db_account_id, account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- level = atoi(sql_row[0]);
- if (level > 99)
- level = 99;
- }
-
- if (level == 0) {
- return 0;
- //not GM
- }
-
- mysql_free_result(sql_res);
-
- return level;
-}
-*/
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-/*======================================================
- * Does a mysql_ping to all connection handles. [Skotlex]
- *------------------------------------------------------
- */
-int login_sql_ping(int tid, unsigned int tick, int id, int data)
-{
- ShowInfo("Pinging SQL server to keep connection alive...\n");
- mysql_ping(&mysql_handle);
- return 0;
-}
-
-//-----------------------------------------------------
-// Read Account database - mysql db
-//-----------------------------------------------------
-int mmo_auth_sqldb_init(void) {
-
- ShowStatus("Login server init....\n");
-
- // memory initialize
- ShowStatus("memory initialize....\n");
-
- mysql_init(&mysql_handle);
-
- // DB connection start
- ShowStatus("Connect Login Database Server....\n");
- if (!mysql_real_connect(&mysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db, login_server_port, (char *)NULL, 0)) {
- // pointer check
- ShowFatalError("%s\n", mysql_error(&mysql_handle));
- exit(1);
- } else {
- ShowStatus("Connect success!\n");
- }
- if( strlen(default_codepage) > 0 ) {
- sprintf( tmpsql, "SET NAMES %s", default_codepage );
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
-
- if (log_login)
- {
- sprintf(tmpsql, "INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '0', 'lserver','100','login server started')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
-
- if (connection_ping_interval) {
- add_timer_func_list(login_sql_ping, "login_sql_ping");
- add_timer_interval(gettick()+connection_ping_interval*60*60*1000,
- login_sql_ping, 0, 0, connection_ping_interval*60*60*1000);
- }
- return 0;
-}
-
-//-----------------------------------------------------
-// DB server connect check
-//-----------------------------------------------------
-void mmo_auth_sqldb_sync(void) {
- // db connect check? or close?
- // ping pong DB server -if losted? then connect try. else crash.
-}
-
-//-----------------------------------------------------
-// close DB
-//-----------------------------------------------------
-void mmo_db_close(void) {
- int i, fd;
-
- //set log.
- if (log_login)
- {
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '0', 'lserver','100', 'login server shutdown')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
-/*
- //delete all server status
- sprintf(tmpsql,"DELETE FROM `sstatus`");
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- mysql_close(&mysql_handle);
- ShowStatus("close DB connect....\n");
-*/
-
- for (i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0)
- { //Clean only data related to servers we are connected to. [Skotlex]
- sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index` = '%d'", i);
- if (mysql_query(&mysql_handle, tmpsql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- delete_session(fd);
- }
- }
- mysql_close(&mysql_handle);
- ShowStatus("close DB connect....\n");
- delete_session(login_fd);
-}
-
-//-----------------------------------------------------
-// Make new account
-//-----------------------------------------------------
-int mmo_auth_new(struct mmo_account* account, char sex)
-{
- MYSQL_RES* sql_res;
- unsigned int tick = gettick();
- char user_password[256];
- //Account Registration Flood Protection by [Kevin]
- if(tick <= new_reg_tick && num_regs >= allowed_regs) {
- ShowNotice("Account registration denied (registration limit exceeded)\n");
- return 3;
- }
-
- //Check for preexisting account
- sprintf(tmp_sql, "SELECT `%s` FROM `%s` WHERE `userid` = '%s'", login_db_userid, login_db, account->userid);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 1; //Return Incorrect user/pass?
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if(mysql_num_rows(sql_res) > 0){
- mysql_free_result(sql_res);
- return 1; //Already exists, return incorrect user/pass.
- }
- mysql_free_result(sql_res); //Only needed for the already-exists check...
-
- mysql_real_escape_string(&mysql_handle, account->userid, account->userid, strlen(account->userid));
- mysql_real_escape_string(&mysql_handle, account->passwd, account->passwd, strlen(account->passwd));
-
- if (sex == 'f') sex = 'F';
- else if (sex == 'm') sex = 'M';
- if (use_md5_passwds)
- MD5_String(account->passwd,user_password);
- else
- jstrescapecpy(user_password, account->passwd);
-
- ShowInfo("New account: user: %s with passwd: %s sex: %c\n", account->userid, user_password, sex);
-
- sprintf(tmp_sql, "INSERT INTO `%s` (`%s`, `%s`, `sex`, `email`) VALUES ('%s', '%s', '%c', '%s')", login_db, login_db_userid, login_db_user_pass, account->userid, user_password, sex, "a@a.com");
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- //Failed to insert new acc :/
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 1;
- }
-
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) < START_ACCOUNT_NUM) {
- //Invalid Account ID! Must update it.
- int id = (int)mysql_insert_id(&mysql_handle);
- sprintf(tmp_sql, "UPDATE `%s` SET `%s`='%d' WHERE `%s`='%d'", login_db, login_db_account_id, START_ACCOUNT_NUM, login_db_account_id, id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowError("New account %s has an invalid account ID [%d] which could not be updated (account_id must be %d or higher).", account->userid, id, START_ACCOUNT_NUM);
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- //Just delete it and fail.
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 1;
- }
- ShowNotice("Updated New account %s's ID %d->%d (account_id must be %d or higher).", account->userid, id, START_ACCOUNT_NUM, START_ACCOUNT_NUM);
- }
- if(tick > new_reg_tick)
- { //Update the registration check.
- num_regs=0;
- new_reg_tick=gettick()+time_allowed*1000;
- }
- num_regs++;
-
- return 0;
-}
-
-// Send to char
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c;
- int fd;
-
- c = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) > 0 && fd != sfd) {
- WFIFOHEAD(fd,len);
- if (WFIFOSPACE(fd) < len) //Increase buffer size.
- realloc_writefifo(fd, len);
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
-
- return c;
-}
-
-//-----------------------------------------------------
-// Auth
-//-----------------------------------------------------
-int mmo_auth( struct mmo_account* account , int fd){
- time_t ban_until_time, raw_time;
- char tmpstr[256];
- char t_uid[256], t_pass[256];
- char user_password[256];
- char *dnsbl_serv;
-
- //added for account creation _M _F
- int len;
-
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row;
- //int sql_fields, sql_cnt;
- char md5str[64], md5bin[32];
-
- char ip[16];
-
- unsigned char * sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr.s_addr;
-
- char r_ip[16]; // [Zido]
- char ip_dnsbl[256]; // [Zido]
-
- // Start DNS Blacklist check [Zido]
- if(use_dnsbl) {
- sprintf(r_ip, "%d.%d.%d.%d", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
-
- dnsbl_serv=strtok(dnsbl_servs,",");
- sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-// Using directly gethostbyname should be quicker. [Skotlex]
-// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
- if(gethostbyname(ip_dnsbl)) {
- ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
- return 3;
- }
-
- while((dnsbl_serv=strtok(dnsbl_servs,","))!=NULL) {
- sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-// Using directly gethostbyname should be quicker. [Skotlex]
-// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
- if(gethostbyname(ip_dnsbl)) {
- ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
- return 3;
- }
- }
-
- }
- // End DNS Blacklist check [Zido]
-
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
- //ShowInfo("auth start for %s...\n", ip);
-
- //accountreg with _M/_F .. [Sirius]
- len = strlen(account->userid) -2;
-
- if (account->passwdenc == 0 && account->userid[len] == '_' &&
- (account->userid[len+1] == 'F' || account->userid[len+1] == 'M' ||
- account->userid[len+1] == 'f' || account->userid[len+1] == 'm') &&
- new_account_flag == 1 &&
- len >= 4 && strlen(account->passwd) >= 4)
- {
- int result;
- account->userid[len] = '\0'; //Terminating the name.
- if ((result = mmo_auth_new(account, account->userid[len+1])))
- return result; //Failed to make account. [Skotlex].
- }
-
- // auth start : time seed
- // Platform/Compiler dependant clock() for time check is removed. [Lance]
- // clock() is originally used to track processing ticks on program execution.
- time(&raw_time);
- strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&raw_time));
-
- jstrescapecpy(t_uid,account->userid);
-
- if (account->passwdenc==PASSWORDENC) {
- memcpy(t_pass, account->passwd, NAME_LENGTH);
- t_pass[NAME_LENGTH] = '\0';
- } else
- jstrescapecpy(t_pass, account->passwd);
-
-
- // make query
- sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`,`%s`"
- " FROM `%s` WHERE `%s`= %s '%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
- //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state/10-level}
-
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) {
- //there's no id.
- ShowNotice("auth failed: no such account %s %s %s\n", tmpstr, account->userid, account->passwd);
- mysql_free_result(sql_res);
- return 0;
- }
- } else {
- ShowError("mmo_auth DB result error ! \n");
- return 0;
- }
-
- //Client Version check[Sirius]
- if(check_client_version == 1 && account->version != 0){
- if(account->version != client_version_to_connect){
- mysql_free_result(sql_res);
- return 5;
- }
- }
-
- // Documented by CLOWNISIUS || LLRO || Gunstar lead this one with me
- // IF changed to diferent returns~ you get diferent responses from your msgstringtable.txt
- //Ireturn 2 == line 9
- //Ireturn 5 == line 311
- //Ireturn 6 == line 450
- //Ireturn 7 == line 440
- //Ireturn 8 == line 682
- //Ireturn 9 == line 704
- //Ireturn 10 == line 705
- //Ireturn 11 == line 706
- //Ireturn 12 == line 707
- //Ireturn 13 == line 708
- //Ireturn 14 == line 709
- //Ireturn 15 == line 710
- //Ireturn -1 == line 010
- // Check status
- {
- int encpasswdok = 0;
-
- if (atoi(sql_row[9]) == -3) {
- //id is banned
- mysql_free_result(sql_res);
- return -3;
- } else if (atoi(sql_row[9]) == -2) { //dynamic ban
- //id is banned
- mysql_free_result(sql_res);
- //add IP list.
- return -2;
- }
-
- if (use_md5_passwds) {
- MD5_String(account->passwd,user_password);
- } else {
- jstrescapecpy(user_password, account->passwd);
- }
- //ShowInfo("account id ok encval:%d\n",account->passwdenc);
-#ifdef PASSWORDENC
- if (account->passwdenc > 0) {
- int j = account->passwdenc;
- //ShowInfo("start md5calc..\n");
- if (j > 2)
- j = 1;
- do {
- if (j == 1) {
- sprintf(md5str, "%s%s", md5key,sql_row[2]);
- } else if (j == 2) {
- sprintf(md5str, "%s%s", sql_row[2], md5key);
- } else
- md5str[0] = 0;
- //ShowDebug("j:%d mdstr:%s\n", j, md5str);
- MD5_String2binary(md5str, md5bin);
- encpasswdok = (memcmp(user_password, md5bin, 16) == 0);
- } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
- //printf("key[%s] md5 [%s] ", md5key, md5);
- //ShowInfo("client [%s] accountpass [%s]\n", user_password, sql_row[2]);
- //ShowInfo("end md5calc..\n");
- }
-#endif
- if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) {
- if (account->passwdenc == 0) {
- ShowNotice("auth failed pass error %s %s %s" RETCODE, tmpstr, account->userid, user_password);
-#ifdef PASSWORDENC
- } else {
- char logbuf[1024], *p = logbuf;
- int j;
- p += sprintf(p, "auth failed pass error %s %s recv-md5[", tmpstr, account->userid);
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)user_password)[j]);
- p += sprintf(p, "] calc-md5[");
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
- p += sprintf(p, "] md5key[");
- for(j = 0; j < md5keylen; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5key)[j]);
- p += sprintf(p, "]" RETCODE);
- ShowNotice("%s\n", p);
-#endif
- }
- return 1;
- }
- //ShowInfo("auth ok %s %s" RETCODE, tmpstr, account->userid);
- }
-
-/*
-// do not remove this section. this is meant for future, and current forums usage
-// as a login manager and CP for login server. [CLOWNISIUS]
- if (atoi(sql_row[10]) == 1) {
- return 4;
- }
-
- if (atoi(sql_row[10]) >= 5) {
- switch(atoi(sql_row[10])) {
- case 5:
- return 5;
- break;
- case 6:
- return 7;
- break;
- case 7:
- return 9;
- break;
- case 8:
- return 10;
- break;
- case 9:
- return 11;
- break;
- default:
- return 10;
- break;
- }
- }
-*/
- ban_until_time = atol(sql_row[8]);
-
- //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state}
- if (ban_until_time != 0) { // if account is banned
- if (ban_until_time > time(NULL)) // always banned
- return 6; // 6 = Your are Prohibited to log in until %s
-
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE `%s`= %s '%s'", login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
-
- if (atoi(sql_row[9])) {
- switch(atoi(sql_row[9])) { // packet 0x006a value + 1
- case 1: // 0 = Unregistered ID
- case 2: // 1 = Incorrect Password
- case 3: // 2 = This ID is expired
- case 4: // 3 = Rejected from Server
- case 5: // 4 = You have been blocked by the GM Team
- case 6: // 5 = Your Game's EXE file is not the latest version
- case 7: // 6 = Your are Prohibited to log in until %s
- case 8: // 7 = Server is jammed due to over populated
- case 9: // 8 = No more accounts may be connected from this company
- case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
- case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
- case 12: // 11 = MSI_REFUSE_BAN_BY_GM
- case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
- case 14: // 13 = MSI_REFUSE_SELF_LOCK
- case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
- case 100: // 99 = This ID has been totally erased
- case 101: // 100 = Login information remains at %s.
- case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
- case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
- case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
- case 105: // 104 = Your spouse character is being deleted. Login is temporarily unavailable for the time being
- ShowNotice("Auth Error #%d\n", atoi(sql_row[9]));
- return atoi(sql_row[9]) - 1;
- break;
- default:
- return 99; // 99 = ID has been totally erased
- break;
- }
- }
-
- if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) {
- return 2; // 2 = This ID is expired
- }
-
- if (online_check) {
- struct online_login_data* data = idb_get(online_db,atoi(sql_row[0]));
- unsigned char buf[8];
- if (data && data->char_server > -1) {
- //Request char servers to kick this account out. [Skotlex]
- ShowWarning("User [%s] is already online - Rejected.\n",sql_row[1]);
- WBUFW(buf,0) = 0x2734;
- WBUFL(buf,2) = atol(sql_row[0]);
- charif_sendallwos(-1, buf, 6);
- if (!data->waiting_disconnect)
- add_timer(gettick()+30000, waiting_disconnect_timer, atol(sql_row[0]), 0);
- data->waiting_disconnect = 1;
- return 3; // Rejected
- }
- }
-
- account->account_id = atoi(sql_row[0]);
- account->login_id1 = rand();
- account->login_id2 = rand();
- memcpy(tmpstr, sql_row[3], 19);
- memcpy(account->lastlogin, tmpstr, 24);
- account->sex = sql_row[5][0] == 'S' ? 2 : sql_row[5][0]=='M';
- account->level = atoi(sql_row[10]) > 99 ? 99 : atoi(sql_row[10]); // as was in isGM() [zzo]
-
- if (account->sex != 2 && account->account_id < START_ACCOUNT_NUM)
- ShowWarning("Account %s has account id %d! Account IDs must be over %d to work properly!\n", account->userid, account->account_id, START_ACCOUNT_NUM);
- sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE `%s` = %s '%s'",
- login_db, ip, login_db_userid, case_sensitive ? "BINARY" : "", sql_row[1]);
- mysql_free_result(sql_res) ; //resource free
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
-
- return -1;
-}
-
-static int online_db_setoffline(DBKey key, void* data, va_list ap) {
- struct online_login_data *p = (struct online_login_data *)data;
- int server = va_arg(ap, int);
- if (server == -1) {
- p->char_server = -1;
- p->waiting_disconnect = 0;
- } else if (p->char_server == server)
- p->char_server = -2; //Char server disconnected.
- return 0;
-}
-
-//-----------------------------------------------------
-// char-server packet parse
-//-----------------------------------------------------
-int parse_fromchar(int fd){
- int i, id;
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row = NULL;
-
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr.s_addr;
- unsigned long ipl = session[fd]->client_addr.sin_addr.s_addr;
- char ip[16];
- RFIFOHEAD(fd);
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- for(id = 0; id < MAX_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
-
- if (id == MAX_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_SERVERS) {
- ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
- server_fd[id] = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
- online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char server to offline.
- // server delete
- sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
-
- switch (RFIFOW(fd,0)) {
- case 0x2709:
- if (log_login)
- {
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`log`) VALUES (NOW(), '%u', '%s', 'GM reload request')", loginlog_db, (unsigned int)ntohl(ipl),server[id].name);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- read_gm_account();
- // send GM accounts to all char-servers
- send_GM_accounts(-1);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x2712:
- if (RFIFOREST(fd) < 19)
- return 0;
- {
- int account_id;
- WFIFOHEAD(fd,51);
- account_id = RFIFOL(fd,2); // speed up
- for(i=0;i<AUTH_FIFO_SIZE;i++){
- if (auth_fifo[i].account_id == account_id &&
- auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
-#endif
- auth_fifo[i].sex == RFIFOB(fd,14) &&
-#if CMP_AUTHFIFO_IP != 0
- auth_fifo[i].ip == RFIFOL(fd,15) &&
-#endif
- !auth_fifo[i].delflag)
- {
- auth_fifo[i].delflag = 1;
- ShowDebug("auth -> %d\n", i);
- break;
- }
- }
-
- if (i != AUTH_FIFO_SIZE && account_id > 0) { // send ack
- time_t connect_until_time = 0;
- char email[40] = "";
- account_id=RFIFOL(fd,2);
- sprintf(tmpsql, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- connect_until_time = atol(sql_row[1]);
- strcpy(email, sql_row[0]);
- mysql_free_result(sql_res);
- }
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = 0;
- memcpy(WFIFOP(fd, 7), email, 40);
- WFIFOL(fd,47) = (unsigned long) connect_until_time;
- WFIFOSET(fd,51);
- } else {
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = 1;
- WFIFOSET(fd,51);
- }
- RFIFOSKIP(fd,19);
- break;
- }
-
- case 0x2714:
- if (RFIFOREST(fd) < 6)
- return 0;
- // how many users on world? (update)
- if (server[id].users != RFIFOL(fd,2))
- {
- ShowStatus("set users %s : %d\n", server[id].name, RFIFOL(fd,2));
-
- server[id].users = RFIFOL(fd,2);
- sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- { // send some answer
- WFIFOHEAD(fd,6);
- WFIFOW(fd,0) = 0x2718;
- WFIFOSET(fd,2);
- }
- RFIFOSKIP(fd,6);
- break;
-
- // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
- case 0x2716:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int account_id;
- time_t connect_until_time = 0;
- char email[40] = "";
- WFIFOHEAD(fd,50);
- account_id=RFIFOL(fd,2);
- sprintf(tmpsql,"SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, account_id);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- connect_until_time = atol(sql_row[1]);
- strcpy(email, sql_row[0]);
- }
- mysql_free_result(sql_res);
- //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
- WFIFOW(fd,0) = 0x2717;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memcpy(WFIFOP(fd, 6), email, 40);
- WFIFOL(fd,46) = (unsigned long) connect_until_time;
- WFIFOSET(fd,50);
- }
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2720: // GM
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- //oldacc = RFIFOL(fd,4);
- ShowWarning("change GM isn't supported in this login server version.\n");
- ShowError("change GM error 0 %s\n", RFIFOP(fd, 8));
-
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- {
- WFIFOHEAD(fd, 10);
- WFIFOW(fd, 0) = 0x2721;
- WFIFOL(fd, 2) = RFIFOL(fd,4); // oldacc;
- WFIFOL(fd, 6) = 0; // newacc;
- WFIFOSET(fd, 10);
- }
- return 0;
-
- // Map server send information to change an email of an account via char-server
- case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- int acc;
- char actual_email[40], new_email[40];
- acc = RFIFOL(fd,2);
- memcpy(actual_email, RFIFOP(fd,6), 40);
- memcpy(new_email, RFIFOP(fd,46), 40);
- if (e_mail_check(actual_email) == 0)
- ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (e_mail_check(new_email) == 0)
- ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (strcmpi(new_email, "a@a.com") == 0)
- ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- sprintf(tmpsql, "SELECT `%s`,`email` FROM `%s` WHERE `%s` = '%d'", login_db_userid, login_db, login_db_account_id, acc);
- if (mysql_query(&mysql_handle, tmpsql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (strcmpi(sql_row[1], actual_email) == 0) {
- sprintf(tmpsql, "UPDATE `%s` SET `email` = '%s' WHERE `%s` = '%d'", login_db, new_email, login_db_account_id, acc);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- ShowInfo("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, sql_row[0], actual_email, ip);
- }
- }
-
- }
- RFIFOSKIP(fd, 86);
- break;
- }
-
- case 0x2724: // Receiving of map-server via char-server a status change resquest (by Yor)
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int acc, statut;
- acc = RFIFOL(fd,2);
- statut = RFIFOL(fd,6);
- sprintf(tmpsql, "SELECT `state` FROM `%s` WHERE `%s` = '%d'", login_db, login_db_account_id, acc);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); // row fetching
- }
- if (atoi(sql_row[0]) != statut && statut != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- }
- sprintf(tmpsql,"UPDATE `%s` SET `state` = '%d' WHERE `%s` = '%d'", login_db, statut,login_db_account_id,acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- RFIFOSKIP(fd,10);
- break;
- }
-
- case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
- if (RFIFOREST(fd) < 18)
- return 0;
- {
- int acc;
- struct tm *tmtime;
- time_t timestamp, tmptime;
- acc = RFIFOL(fd,2);
- sprintf(tmpsql, "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); // row fetching
- }
- tmptime = atol(sql_row[0]);
- if (tmptime == 0 || tmptime < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = tmptime;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- if (tmptime != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- }
- ShowNotice("Account: %d Banned until: %ld\n", acc, timestamp);
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld' WHERE `%s` = '%d'", login_db, (unsigned long)timestamp, login_db_account_id, acc);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- }
- RFIFOSKIP(fd,18);
- break;
- }
-
- case 0x2727:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int acc,sex;
- unsigned char buf[16];
- acc=RFIFOL(fd,2);
- sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
-
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- if (mysql_num_rows(sql_res) == 0) {
- mysql_free_result(sql_res);
- return 0;
- }
- sql_row = mysql_fetch_row(sql_res); //row fetching
- }
-
- if (strcmpi(sql_row[0], "M") == 0)
- sex = 0; //Change to female
- else
- sex = 1; //Change to make
- sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex?'M':'F'), login_db_account_id, acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- RFIFOSKIP(fd,6);
- break;
- }
-
- case 0x2728: // save account_reg2
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (RFIFOL(fd,4) > 0) {
- int acc,p,j,len;
- char str[32];
- char temp_str[64]; //Needs twice as much space as the original string.
- char temp_str2[512];
- char value[256];
- unsigned char *buf;
- acc=RFIFOL(fd,4);
- buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char));
- //Delete all global account variables....
- sprintf(tmpsql,"DELETE FROM `%s` WHERE `type`='1' AND `account_id`='%d';",reg_db,acc);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- //Proceed to insert them....
- for(j=0,p=13;j<ACCOUNT_REG2_NUM && p<RFIFOW(fd,2);j++){
- sscanf(RFIFOP(fd,p), "%31c%n",str,&len);
- str[len]='\0';
- p +=len+1; //+1 to skip the '\0' between strings.
- sscanf(RFIFOP(fd,p), "%255c%n",value,&len);
- value[len]='\0';
- p +=len+1;
-
- sprintf(tmpsql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%s');", reg_db, acc, jstrescapecpy(temp_str,str), jstrescapecpy(temp_str2,value));
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
-
- // Send to char
- memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2));
- WBUFW(buf,0)=0x2729;
- charif_sendallwos(fd,buf,WBUFW(buf,2));
- if (buf) aFree(buf);
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- //printf("login: save account_reg (from char)\n");
- break;
-
- case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int acc;
- acc = RFIFOL(fd,2);
- sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res && mysql_num_rows(sql_res) > 0) { //Found a match
- sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- if (sql_res) mysql_free_result(sql_res);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x272b: // Set account_id to online [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- add_online_user(id, RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x272c: // Set account_id to offline [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- remove_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
- case 0x272d: // Receive list of all online accounts. [Skotlex]
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (!online_check) {
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
- }
- {
- struct online_login_data *p;
- int aid, users;
- online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
- users = RFIFOW(fd,4);
- for (i = 0; i < users; i++) {
- aid = RFIFOL(fd,6+i*4);
- p = idb_ensure(online_db, aid, create_online_user);
- p->char_server = id;
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
- }
- case 0x272e: //Request account_reg2 for a character.
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int account_id = RFIFOL(fd, 2);
- int char_id = RFIFOL(fd, 6);
- int p;
- WFIFOHEAD(fd,10000);
- RFIFOSKIP(fd,10);
- sprintf(tmpsql, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'",reg_db, account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- break;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (!sql_res) {
- break;
- }
- WFIFOW(fd,0) = 0x2729;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = char_id;
- WFIFOB(fd,12) = 1; //Type 1 for Account2 registry
- for(p = 13; (sql_row = mysql_fetch_row(sql_res)) && p < 9000;){
- if (sql_row[0][0]) {
- p+= sprintf(WFIFOP(fd,p), "%s", sql_row[0])+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(fd,p), "%s", sql_row[1])+1;
- }
- }
- if (p >= 9000)
- ShowWarning("Too many account2 registries for AID %d. Some registries were not sent.\n", account_id);
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,WFIFOW(fd,2));
- mysql_free_result(sql_res);
- }
- break;
-
- case 0x2736: // WAN IP update from char-server
- if (RFIFOREST(fd) < 6)
- return 0;
- ShowInfo("Updated IP of Server #%d to %d.%d.%d.%d.\n",id,
- (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
- (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
- server[id].ip = RFIFOL(fd,2);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2737: //Request to set all offline.
- ShowInfo("Setting accounts from char-server %d offline.\n", id);
- online_db->foreach(online_db,online_db_setoffline,id);
- RFIFOSKIP(fd,2);
- break;
-
- default:
- ShowError("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-// Rewrote: Adnvanced subnet check [LuzZza]
-//--------------------------------------------
-int lan_subnetcheck(long p) {
-
- int i;
- unsigned char *sbn, *msk, *src = (unsigned char *)&p;
-
- for(i=0; i<subnet_count; i++) {
-
- if(subnet[i].subnet == (p & subnet[i].mask)) {
-
- sbn = (unsigned char *)&subnet[i].subnet;
- msk = (unsigned char *)&subnet[i].mask;
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
- src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
-
- return subnet[i].char_ip;
- }
- }
-
- ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
- return 0;
-}
-
-int login_ip_ban_check(unsigned char *p, unsigned long ipl)
-{
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row;
- //ip ban
- //p[0], p[1], p[2], p[3]
- //request DB connection
- //check
- sprintf(tmpsql, "SELECT count(*) FROM `ipbanlist` WHERE `list` = '%d.*.*.*' OR `list` = '%d.%d.*.*' OR `list` = '%d.%d.%d.*' OR `list` = '%d.%d.%d.%d'",
- p[0], p[0], p[1], p[0], p[1], p[2], p[0], p[1], p[2], p[3]);
- if (mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- // close connection because we can't verify their connectivity.
- return 1;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
-
- if(!sql_row) return 1; //Shouldn't happen, but just in case...
-
- if (atoi(sql_row[0]) == 0) { //No ban
- mysql_free_result(sql_res);
- return 0;
- }
-
- // ip ban ok.
- ShowWarning("packet from banned ip : %d.%d.%d.%d\n" RETCODE, p[0], p[1], p[2], p[3]);
-
- if (log_login)
- {
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', 'unknown','-3', 'ip banned')", loginlog_db, (unsigned int)ntohl(ipl));
- // query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- mysql_free_result(sql_res);
- return 1;
-}
-//----------------------------------------------------------------------------------------
-// Default packet parsing (normal players or administation/char-server connection requests)
-//----------------------------------------------------------------------------------------
-int parse_login(int fd) {
- //int len;
-
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row = NULL;
-
- char t_uid[100];
- struct mmo_account account;
- long subnet_char_ip;
- int packet_len;
-
- int result, i;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr.s_addr;
- unsigned long ipl = session[fd]->client_addr.sin_addr.s_addr;
- char ip[16];
- RFIFOHEAD(fd);
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- memset(&account, 0, sizeof(account));
-
- if (session[fd]->eof) {
- for(i = 0; i < MAX_SERVERS; i++)
- if (server_fd[i] == fd)
- server_fd[i] = -1;
- do_close(fd);
- return 0;
- }
-
- while(RFIFOREST(fd)>=2 && !session[fd]->eof){
-// ShowDebug("parse_login : %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
-
- switch(RFIFOW(fd,0)){
- case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
- if (RFIFOREST(fd) < 26)
- return 0;
- RFIFOSKIP(fd,26);
- break;
-
- case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
- if (RFIFOREST(fd) < 18)
- return 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x277: // New login packet
- case 0x64: // request client login
- case 0x01dd: // request client login with encrypt
-
- packet_len = RFIFOREST(fd);
-
- //Perform ip-ban check ONLY on login packets
- if (ipban > 0 && login_ip_ban_check(p,ipl))
- {
- RFIFOSKIP(fd,packet_len);
- session[fd]->eof = 1;
- break;
- }
-
- switch(RFIFOW(fd,0)){
- case 0x64:
- if(packet_len < 55)
- return 0;
- break;
- case 0x01dd:
- if(packet_len < 47)
- return 0;
- break;
- case 0x277:
- if(packet_len < 84)
- return 0;
- break;
- }
-
- account.version = RFIFOL(fd, 2);
- if (!account.version) account.version = 1; //Force some version...
- memcpy(account.userid,RFIFOP(fd, 6),NAME_LENGTH);
- account.userid[23] = '\0';
- memcpy(account.passwd,RFIFOP(fd, 30),NAME_LENGTH);
- account.passwd[23] = '\0';
-
- ShowInfo("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]);
-#ifdef PASSWORDENC
- account.passwdenc= (RFIFOW(fd,0)!=0x01dd)?0:PASSWORDENC;
-#else
- account.passwdenc=0;
-#endif
- result=mmo_auth(&account, fd);
-
-
- jstrescapecpy(t_uid,account.userid);
- if(result==-1){
- // as we have queried account level earlier in mmo_auth anyway, no need to do this again [zzo]
- // int gm_level = isGM(account.account_id); // removed by [zzo]
-
- if (min_level_to_connect > account.level) {
- WFIFOHEAD(fd,3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
- WFIFOHEAD(fd,47+32*MAX_SERVERS);
- if (p[0] != 127 && log_login) {
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s','100', 'login ok')", loginlog_db, (unsigned int)ntohl(ipl), t_uid);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- if (account.level)
- ShowStatus("Connection of the GM (level:%d) account '%s' accepted.\n", account.level, account.userid);
- else
- ShowStatus("Connection of the account '%s' accepted.\n", account.userid);
- server_num=0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- // Advanced subnet check [LuzZza]
- if((subnet_char_ip = lan_subnetcheck(ipl)))
- WFIFOL(fd,47+server_num*32) = subnet_char_ip;
- else
- WFIFOL(fd,47+server_num*32) = server[i].ip;
- WFIFOW(fd,47+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,47+server_num*32+26) = server[i].users;
- WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,47+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- // if at least 1 char-server
- if (server_num > 0) {
- WFIFOW(fd,0)=0x69;
- WFIFOW(fd,2)=47+32*server_num;
- WFIFOL(fd,4)=account.login_id1;
- WFIFOL(fd,8)=account.account_id;
- WFIFOL(fd,12)=account.login_id2;
- WFIFOL(fd,16)=0;
- memcpy(WFIFOP(fd,20),account.lastlogin,24);
- WFIFOB(fd,46)=account.sex;
- WFIFOSET(fd,47+32*server_num);
- if(auth_fifo_pos>=AUTH_FIFO_SIZE)
- auth_fifo_pos=0;
- auth_fifo[auth_fifo_pos].account_id=account.account_id;
- auth_fifo[auth_fifo_pos].login_id1=account.login_id1;
- auth_fifo[auth_fifo_pos].login_id2=account.login_id2;
- auth_fifo[auth_fifo_pos].sex=account.sex;
- auth_fifo[auth_fifo_pos].delflag=0;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
- } else {
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- char tmp_sql[512];
- char error[64];
- WFIFOHEAD(fd,23);
- if (log_login)
- {
- sprintf(tmp_sql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s', '%d','login failed : %%s')", loginlog_db, (unsigned int)ntohl(ipl), t_uid, result);
- switch((result + 1)) {
- case -2: //-3 = Account Banned
- sprintf(tmpsql,tmp_sql,"Account banned.");
- sprintf(error,"Account banned.");
- break;
- case -1: //-2 = Dynamic Ban
- sprintf(tmpsql,tmp_sql,"dynamic ban (ip and account).");
- sprintf(error,"dynamic ban (ip and account).");
- break;
- case 1: // 0 = Unregistered ID
- sprintf(tmpsql,tmp_sql,"Unregisterd ID.");
- sprintf(error,"Unregisterd ID.");
- break;
- case 2: // 1 = Incorrect Password
- sprintf(tmpsql,tmp_sql,"Incorrect Password.");
- sprintf(error,"Incorrect Password.");
- break;
- case 3: // 2 = This ID is expired
- sprintf(tmpsql,tmp_sql,"Account Expired.");
- sprintf(error,"Account Expired.");
- break;
- case 4: // 3 = Rejected from Server
- sprintf(tmpsql,tmp_sql,"Rejected from server.");
- sprintf(error,"Rejected from server.");
- break;
- case 5: // 4 = You have been blocked by the GM Team
- sprintf(tmpsql,tmp_sql,"Blocked by GM.");
- sprintf(error,"Blocked by GM.");
- break;
- case 6: // 5 = Your Game's EXE file is not the latest version
- sprintf(tmpsql,tmp_sql,"Not latest game EXE.");
- sprintf(error,"Not latest game EXE.");
- break;
- case 7: // 6 = Your are Prohibited to log in until %s
- sprintf(tmpsql,tmp_sql,"Banned.");
- sprintf(error,"Banned.");
- break;
- case 8: // 7 = Server is jammed due to over populated
- sprintf(tmpsql,tmp_sql,"Server Over-population.");
- sprintf(error,"Server Over-population.");
- break;
- case 9: // 8 = No more accounts may be connected from this company
- sprintf(tmpsql,tmp_sql,"Account limit from company");
- sprintf(error,"Account limit from company");
- break;
- case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
- sprintf(tmpsql,tmp_sql,"Ban by DBA");
- sprintf(error,"Ban by DBA");
- break;
- case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
- sprintf(tmpsql,tmp_sql,"Email not confirmed");
- sprintf(error,"Email not confirmed");
- break;
- case 12: // 11 = MSI_REFUSE_BAN_BY_GM
- sprintf(tmpsql,tmp_sql,"Ban by GM");
- sprintf(error,"Ban by GM");
- break;
- case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
- sprintf(tmpsql,tmp_sql,"Working in DB");
- sprintf(error,"Working in DB");
- break;
- case 14: // 13 = MSI_REFUSE_SELF_LOCK
- sprintf(tmpsql,tmp_sql,"Self Lock");
- sprintf(error,"Self Lock");
- break;
- case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
- sprintf(tmpsql,tmp_sql,"Not Permitted Group");
- sprintf(error,"Not Permitted Group");
- break;
- case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
- sprintf(tmpsql,tmp_sql,"Not Permitted Group");
- sprintf(error,"Not Permitted Group");
- break;
- case 100: // 99 = This ID has been totally erased
- sprintf(tmpsql,tmp_sql,"Account gone.");
- sprintf(error,"Account gone.");
- break;
- case 101: // 100 = Login information remains at %s
- sprintf(tmpsql,tmp_sql,"Login info remains.");
- sprintf(error,"Login info remains.");
- break;
- case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
- sprintf(tmpsql,tmp_sql,"Hacking investigation.");
- sprintf(error,"Hacking investigation.");
- break;
- case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
- sprintf(tmpsql,tmp_sql,"Bug investigation.");
- sprintf(error,"Bug investigation.");
- break;
- case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
- sprintf(tmpsql,tmp_sql,"Deleting char.");
- sprintf(error,"Deleting char.");
- break;
- case 105: // 104 = This character is being deleted. Login is temporarily unavailable for the time being
- sprintf(tmpsql,tmp_sql,"Deleting spouse char.");
- sprintf(error,"Deleting spouse char.");
- break;
- default:
- sprintf(tmpsql,tmp_sql,"Unknown Error.");
- sprintf(error,"Unknown Error.");
- break;
- }
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- } //End login log of error.
- if ((result == 1) && (dynamic_pass_failure_ban != 0) && log_login){ // failed password
- sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%u' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE",
- loginlog_db,(unsigned int)ntohl(ipl), dynamic_pass_failure_ban_time); //how many times filed account? in one ip.
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- //check query result
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
-
- if (sql_row && atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) {
- sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban: %s')", p[0], p[1], p[2], dynamic_pass_failure_ban_how_long, t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- if(sql_res) mysql_free_result(sql_res);
- }
- else if (result == -2){ //dynamic banned - add ip to ban list.
- sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", p[0], p[1], p[2], t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- result = -3;
- }else if(result == 6){ //not lastet version ..
- //result = 5;
- }
-
- sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = %s '%s'",login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
- //cannot connect login failed
- memset(WFIFOP(fd,0),'\0',23);
- WFIFOW(fd,0)=0x6a;
- WFIFOB(fd,2)=result;
- if (result == 6) { // 6 = Your are Prohibited to log in until %s
- if (sql_row && atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp
- char tmpstr[256];
- time_t ban_until_time;
- ban_until_time = atol(sql_row[0]);
- strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
- tmpstr[19] = '\0';
- memcpy(WFIFOP(fd,3), tmpstr, 20);
- } else { // we send error message
- memcpy(WFIFOP(fd,3), error, 20);
- }
- }
- WFIFOSET(fd,23);
- }
- RFIFOSKIP(fd,packet_len);
- break;
-
- case 0x01db: // request password key
- if (session[fd]->session_data) {
- ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- {
- WFIFOHEAD(fd,4+md5keylen);
- WFIFOW(fd,0)=0x01dc;
- WFIFOW(fd,2)=4+md5keylen;
- memcpy(WFIFOP(fd,4),md5key,md5keylen);
- WFIFOSET(fd,WFIFOW(fd,2));
-
- ShowDebug("Request Password key -%s\n",md5key);
- RFIFOSKIP(fd,2);
- }
- break;
-
- case 0x2710: // request Char-server connection
- if(RFIFOREST(fd)<86)
- return 0;
- {
- unsigned char* server_name;
- WFIFOHEAD(fd, 3);
- memcpy(account.userid,RFIFOP(fd, 2),NAME_LENGTH);
- account.userid[23] = '\0';
- memcpy(account.passwd,RFIFOP(fd, 26),NAME_LENGTH);
- account.passwd[23] = '\0';
- account.passwdenc = 0;
- server_name = RFIFOP(fd,60);
- server_name[20] = '\0';
- ShowInfo("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n",
- server_name, RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58),
- p[0], p[1], p[2], p[3]);
- jstrescapecpy(t_uid,server_name);
- if (log_login)
- {
- char t_login[50];
- jstrescapecpy(t_login,account.userid);
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')",
- loginlog_db, (unsigned int)ntohl(ipl),
- t_login, t_uid, t_uid,
- RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57),
- RFIFOW(fd, 58));
-
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- }
- result = mmo_auth(&account, fd);
- //printf("Result: %d - Sex: %d - Account ID: %d\n",result,account.sex,(int) account.account_id);
-
- if(result == -1 && account.sex==2 && account.account_id<MAX_SERVERS && server_fd[account.account_id]==-1){
- ShowStatus("Connection of the char-server '%s' accepted.\n", server_name);
- memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
- server[account.account_id].ip=RFIFOL(fd,54);
- server[account.account_id].port=RFIFOW(fd,58);
- memcpy(server[account.account_id].name,server_name,20);
- server[account.account_id].users=0;
- server[account.account_id].maintenance=RFIFOW(fd,82);
- server[account.account_id].new_=RFIFOW(fd,84);
- server_fd[account.account_id]=fd;
- sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
-
- sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')",
- account.account_id, t_uid,0);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
- }
- WFIFOW(fd,0)=0x2711;
- WFIFOB(fd,2)=0;
- WFIFOSET(fd,3);
- session[fd]->func_parse=parse_fromchar;
- realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);
- // send GM account to char-server
- send_GM_accounts(fd);
- } else {
- WFIFOW(fd, 0) =0x2711;
- WFIFOB(fd, 2)=3;
- WFIFOSET(fd, 3);
- }
- }
- RFIFOSKIP(fd, 86);
- return 0;
-
- case 0x7530: // request Athena information
- {
- WFIFOHEAD(fd,10);
- WFIFOW(fd,0)=0x7531;
- WFIFOB(fd,2)=ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3)=ATHENA_MINOR_VERSION;
- WFIFOB(fd,4)=ATHENA_REVISION;
- WFIFOB(fd,5)=ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6)=ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7)=ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8)=ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- ShowInfo ("Athena version check...\n");
- break;
- }
- case 0x7532:
- ShowStatus ("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- break;
- default:
- ShowStatus ("Abnormal end of connection (ip: %s): Unknown packet 0x%x " RETCODE, ip, RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aMalloc(64);
- command = (char *)aMalloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- ShowInfo("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- ShowInfo("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
-{
- struct online_login_data *character= (struct online_login_data*)data;
- if (character->char_server == -2) //Unknown server.. set them offline
- remove_online_user(character->account_id);
- else if (character->char_server < 0)
- //Free data from players that have not been online for a while.
- db_remove(online_db, key);
- return 0;
-}
-
-static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
-{
- online_db->foreach(online_db, online_data_cleanup_sub);
- return 0;
-}
-
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-
-//----------------------------------
-// Reading Lan Support configuration
-// Rewrote: Anvanced subnet check [LuzZza]
-//----------------------------------
-int login_lan_config_read(const char *lancfgName) {
-
- FILE *fp;
- int line_num = 0;
- char line[1024], w1[64], w2[64], w3[64], w4[64];
-
- if((fp = fopen(lancfgName, "r")) == NULL) {
- ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- ShowInfo("Reading the configuration file %s...\n", lancfgName);
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- line_num++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
-
- ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
- continue;
- }
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- remove_control_chars((unsigned char *)w3);
- remove_control_chars((unsigned char *)w4);
-
- if(strcmpi(w1, "subnet") == 0) {
-
- subnet[subnet_count].mask = inet_addr(w2);
- subnet[subnet_count].char_ip = inet_addr(w3);
- subnet[subnet_count].map_ip = inet_addr(w4);
- subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
- if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
- ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
- continue;
- }
-
- subnet_count++;
- }
-
- ShowStatus("Read information about %d subnetworks.\n", subnet_count);
- }
-
- fclose(fp);
- return 0;
-}
-
-//-----------------------------------------------------
-//BANNED IP CHECK.
-//-----------------------------------------------------
-int ip_ban_check(int tid, unsigned int tick, int id, int data){
-
- //query
- if(mysql_query(&mysql_handle, "DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()")) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()\n", __FILE__,__LINE__);
- }
-
- return 0;
-}
-
-//-----------------------------------------------------
-// reading configuration
-//-----------------------------------------------------
-int login_config_read(const char *cfgName){
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp=fopen(cfgName,"r");
-
- if(fp==NULL){
- ShowError("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
- ShowInfo("reading configuration file %s...\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- remove_control_chars((unsigned char *) w1);
- remove_control_chars((unsigned char *) w2);
- if(strcmpi(w1,"timestamp_format") == 0) {
- strncpy(timestamp_format, w2, 20);
- } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
- stdout_with_ansisequence = config_switch(w2);
- } else if(strcmpi(w1,"console_silent")==0){
- msg_silent = 0; //To always allow the next line to show up.
- ShowInfo("Console Silent Setting: %d\n", atoi(w2));
- msg_silent = atoi(w2);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- bind_ip = resolve_hostbyname(w2, NULL, bind_ip_str);
- if (bind_ip)
- ShowStatus("Login server binding IP address : %s -> %s\n", w2, bind_ip_str);
- } else if(strcmpi(w1,"login_port")==0){
- login_port=atoi(w2);
- ShowStatus("set login_port : %s\n",w2);
- }
- else if(strcmpi(w1,"ipban")==0){
- ipban=atoi(w2);
- ShowStatus("set ipban : %d\n",ipban);
- }
- //account ban -> ip ban
- else if(strcmpi(w1,"dynamic_account_ban")==0){
- dynamic_account_ban=atoi(w2);
- ShowStatus("set dynamic_account_ban : %d\n",dynamic_account_ban);
- }
- else if(strcmpi(w1,"dynamic_account_ban_class")==0){
- dynamic_account_ban_class=atoi(w2);
- ShowStatus("set dynamic_account_ban_class : %d\n",dynamic_account_ban_class);
- }
- //dynamic password error ban
- else if(strcmpi(w1,"dynamic_pass_failure_ban")==0){
- dynamic_pass_failure_ban=atoi(w2);
- ShowStatus("set dynamic_pass_failure_ban : %d\n",dynamic_pass_failure_ban);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_time")==0){
- dynamic_pass_failure_ban_time=atoi(w2);
- ShowStatus("set dynamic_pass_failure_ban_time : %d\n",dynamic_pass_failure_ban_time);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_how_many")==0){
- dynamic_pass_failure_ban_how_many=atoi(w2);
- ShowStatus("set dynamic_pass_failure_ban_how_many : %d\n",dynamic_pass_failure_ban_how_many);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){
- dynamic_pass_failure_ban_how_long=atoi(w2);
- ShowStatus("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
- } else if(strcmpi(w1, "new_account") == 0){ //Added by Sirius for new account _M/_F
- new_account_flag = atoi(w2); //Added by Sirius for new account _M/_F
- } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
- //check_client_version = config_switch(w2); //Added by Sirius for client version check
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
- check_client_version = 1;
- } else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
- check_client_version = 0;
- }
- } else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
- client_version_to_connect = atoi(w2); //Added by SIrius for client version check
- } else if(strcmpi(w1,"use_MD5_passwords")==0){
- if (!strcmpi(w2,"yes")) {
- use_md5_passwds=1;
- } else if (!strcmpi(w2,"no")){
- use_md5_passwds=0;
- }
- ShowStatus("Using MD5 Passwords: %s \n",w2);
- }
- else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- }
- else if (strcmpi(w1, "min_level_to_connect") == 0) {
- min_level_to_connect = atoi(w2);
- }
- else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- }
- else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- else if (strcmpi(w1, "case_sensitive") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- case_sensitive = 1;
- if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
- case_sensitive = 0;
- else
- case_sensitive = atoi(w2);
- } else if (strcmpi(w1, "allowed_regs") == 0) { //account flood protection system [Kevin]
- allowed_regs = atoi(w2);
- } else if (strcmpi(w1, "time_allowed") == 0) {
- time_allowed = atoi(w2);
- } else if (strcmpi(w1, "online_check") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- online_check = 1;
- else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
- online_check = 0;
- else
- online_check = atoi(w2);
- } else if (strcmpi(w1, "log_login") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- log_login = 1;
- else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
- log_login = 0;
- else
- log_login = atoi(w2);
- } else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"use_dnsbl")==0) { // [Zido]
- use_dnsbl=atoi(w2);
- } else if(strcmpi(w1,"dnsbl_servers")==0) { // [Zido]
- strcpy(dnsbl_servs,w2);
- } else if(strcmpi(w1,"ip_sync_interval")==0) {
- ip_sync_interval = 1000*60*atoi(w2); //w2 comes in minutes.
- }
- }
- fclose(fp);
- ShowInfo("done reading %s.\n", cfgName);
- return 0;
-}
-
-void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp=fopen(cfgName,"r");
- if(fp==NULL){
- ShowFatalError("file not found: %s\n",cfgName);
- exit(1);
- }
- ShowInfo("reading configuration file %s...\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1, "gm_read_method") == 0) {
- if(atoi(w2) == 0)
- login_gm_read = true;
- else
- login_gm_read = false;
- } else if(strcmpi(w1, "gm_db") == 0) {
- strcpy(gm_db, w2);
- } else if (strcmpi(w1, "login_db") == 0) {
- strcpy(login_db, w2);
- }
- //add for DB connection
- else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- ShowStatus ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- ShowStatus ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- ShowStatus ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- ShowStatus ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- ShowStatus ("set login_server_db : %s\n",w2);
- }
- else if(strcmpi(w1,"connection_ping_interval")==0) {
- connection_ping_interval = atoi(w2);
- }
- else if(strcmpi(w1,"default_codepage")==0){
- strcpy(default_codepage, w2);
- ShowStatus ("set default_codepage : %s\n",w2);
- }
- //added for custom column names for custom login table
- else if(strcmpi(w1,"login_db_account_id")==0){
- strcpy(login_db_account_id, w2);
- }
- else if(strcmpi(w1,"login_db_userid")==0){
- strcpy(login_db_userid, w2);
- }
- else if(strcmpi(w1,"login_db_user_pass")==0){
- strcpy(login_db_user_pass, w2);
- }
- else if(strcmpi(w1,"login_db_level")==0){
- strcpy(login_db_level, w2);
- }
- else if (strcmpi(w1, "loginlog_db") == 0) {
- strcpy(loginlog_db, w2);
- }
- else if (strcmpi(w1, "reg_db") == 0) {
- strcpy(reg_db, w2);
- }
- //support the import command, just like any other config
- else if(strcmpi(w1,"import")==0){
- sql_config_read(w2);
- }
- }
- fclose(fp);
- ShowInfo("done reading %s.\n", cfgName);
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-void do_final(void) {
- //sync account when terminating.
- //but no need when you using DBMS (mysql)
- ShowStatus("Terminating...\n");
- mmo_db_close();
- online_db->destroy(online_db, NULL);
- if (gm_account_db)
- aFree(gm_account_db);
-}
-
-void set_server_type(void)
-{
- SERVER_TYPE = ATHENA_SERVER_LOGIN;
-}
-int do_init(int argc,char **argv){
- //initialize login server
- int i;
-
- //read login configue
- login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME );
- sql_config_read(SQL_CONF_NAME);
- login_lan_config_read((argc > 2) ? argv[2] : LAN_CONF_NAME);
- //Generate Passworded Key.
- ShowInfo("Initializing md5key...\n");
- memset(md5key, 0, sizeof(md5key));
- md5keylen=rand()%4+12;
- for(i=0;i<md5keylen;i++)
- md5key[i]=rand()%255+1;
- ShowInfo("md5key setup complete\n");
-
-
- ShowInfo("set FIFO Size\n");
- for(i=0;i<AUTH_FIFO_SIZE;i++)
- auth_fifo[i].delflag=1;
- ShowInfo("set FIFO Size complete\n");
-
- ShowInfo("set max servers\n");
- for(i=0;i<MAX_SERVERS;i++)
- server_fd[i]=-1;
- ShowInfo("set max servers complete\n");
- //server port open & binding
-
- // Online user database init
- online_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); // reinitialise
- add_timer_func_list(waiting_disconnect_timer, "waiting_disconnect_timer");
-
- login_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,login_port);
-
- //Auth start
- ShowInfo("Running mmo_auth_sqldb_init()\n");
- mmo_auth_sqldb_init();
- ShowInfo("finished mmo_auth_sqldb_init()\n");
-
- if(login_gm_read)
- //Read account information.
- read_gm_account();
-
- //set default parser as parse_login function
- set_defaultparse(parse_login);
-
- // ban deleter timer - 1 minute term
- ShowStatus("add interval tic (ip_ban_check)....\n");
- add_timer_func_list(ip_ban_check,"ip_ban_check");
- add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000);
-
- add_timer_func_list(online_data_cleanup, "online_data_cleanup");
- add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600*1000); // every 10 minutes cleanup online account db.
-
- if (ip_sync_interval) {
- add_timer_func_list(sync_ip_addresses, "sync_ip_addresses");
- add_timer_interval(gettick() + ip_sync_interval, sync_ip_addresses, 0, 0, ip_sync_interval);
- }
-
- if (console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", login_port);
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <sys/types.h>
+
+#ifdef LCCWIN32
+#include <winsock.h>
+#else
+#ifdef __WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
+//add include for DBMS(mysql)
+#include <mysql.h>
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/malloc.h"
+#include "../common/db.h"
+#include "../common/timer.h"
+#include "../common/strlib.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+#include "../common/version.h"
+#include "../common/cbasetypes.h"
+#include "login.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+#define J_MAX_MALLOC_SIZE 65535
+
+//-----------------------------------------------------
+// global variable
+//-----------------------------------------------------
+int use_dnsbl=0; // [Zido]
+char dnsbl_servs[1024];
+int server_num;
+int new_account_flag = 0; //Set from config too XD [Sirius]
+in_addr_t bind_ip= 0;
+char bind_ip_str[128];
+int login_port = 6900;
+
+// Advanced subnet check [LuzZza]
+struct _subnet {
+ long subnet;
+ long mask;
+ long char_ip;
+ long map_ip;
+} subnet[16];
+
+int subnet_count = 0;
+
+struct mmo_char_server server[MAX_SERVERS];
+int server_fd[MAX_SERVERS];
+
+int login_fd;
+
+//Account flood protection [Kevin]
+unsigned int new_reg_tick=0;
+int allowed_regs=1;
+int num_regs=0;
+int time_allowed=10; //Init this to 10 secs, not 10K secs [Skotlex]
+
+char date_format[32] = "%Y-%m-%d %H:%M:%S";
+unsigned int auth_num = 0, auth_max = 0;
+
+int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
+int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
+int check_client_version = 0; //Client version check ON/OFF .. (sirius)
+int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
+static int online_check=1; //When set to 1, login server rejects incoming players that are already registered as online. [Skotlex]
+static int ip_sync_interval = 0;
+
+MYSQL mysql_handle;
+
+int ipban = 1;
+int dynamic_account_ban = 1;
+int dynamic_account_ban_class = 0;
+int dynamic_pass_failure_ban = 1;
+int dynamic_pass_failure_ban_time = 5;
+int dynamic_pass_failure_ban_how_many = 3;
+int dynamic_pass_failure_ban_how_long = 60;
+
+int login_server_port = 3306;
+char login_server_ip[32] = "127.0.0.1";
+char login_server_id[32] = "ragnarok";
+char login_server_pw[32] = "ragnarok";
+char login_server_db[32] = "ragnarok";
+char default_codepage[32] = ""; //Feature by irmin.
+int use_md5_passwds = 0;
+char login_db[256] = "login";
+int log_login=1; //Whether to log the logins or not. [Skotlex]
+char loginlog_db[256] = "loginlog";
+bool login_gm_read = true;
+int connection_ping_interval = 0;
+
+// added to help out custom login tables, without having to recompile
+// source so options are kept in the login_athena.conf or the inter_athena.conf
+char login_db_account_id[256] = "account_id";
+char login_db_userid[256] = "userid";
+char login_db_user_pass[256] = "user_pass";
+char login_db_level[256] = "level";
+
+char gm_db[256] = "gm_accounts";
+
+char reg_db[256] = "global_reg_value";
+
+struct gm_account *gm_account_db;
+int GM_num;
+char tmpsql[65535], tmp_sql[65535];
+
+int console = 0;
+
+int case_sensitive = 1;
+
+//-----------------------------------------------------
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id,login_id1,login_id2;
+ int ip,sex,delflag;
+} auth_fifo[AUTH_FIFO_SIZE];
+
+int auth_fifo_pos = 0;
+
+struct online_login_data {
+ int account_id;
+ short char_server;
+ short waiting_disconnect;
+};
+
+//-----------------------------------------------------
+
+static char md5key[20], md5keylen = 16;
+
+struct dbt *online_db;
+
+static void* create_online_user(DBKey key, va_list args) {
+ struct online_login_data *p;
+ p = aCalloc(1, sizeof(struct online_login_data));
+ p->account_id = key.i;
+ p->char_server = -1;
+ return p;
+}
+
+int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len);
+
+//-----------------------------------------------------
+// Online User Database [Wizputer]
+//-----------------------------------------------------
+
+void add_online_user(int char_server, int account_id) {
+ struct online_login_data *p;
+ if (!online_check)
+ return;
+ p = idb_ensure(online_db, account_id, create_online_user);
+ p->char_server = char_server;
+ p->waiting_disconnect = 0;
+}
+
+int is_user_online(int account_id) {
+ return (idb_get(online_db, account_id) != NULL);
+}
+
+void remove_online_user(int account_id) {
+ if(!online_check)
+ return;
+ if (account_id == 99) { // reset all to offline
+ online_db->clear(online_db, NULL);
+ return;
+ }
+ idb_remove(online_db,account_id);
+}
+
+int waiting_disconnect_timer(int tid, unsigned int tick, int id, int data)
+{
+ struct online_login_data *p;
+ if ((p= idb_get(online_db, id)) != NULL && p->waiting_disconnect)
+ remove_online_user(id);
+ return 0;
+}
+
+static int sync_ip_addresses(int tid, unsigned int tick, int id, int data){
+ unsigned char buf[2];
+ ShowInfo("IP Sync in progress...\n");
+ WBUFW(buf,0) = 0x2735;
+ charif_sendallwos(-1, buf, 2);
+ return 0;
+}
+
+//-----------------------------------------------------
+// Read GM accounts
+//-----------------------------------------------------
+void read_gm_account(void) {
+ MYSQL_RES* sql_res ;
+ MYSQL_ROW sql_row;
+
+ if(!login_gm_read)
+ return;
+ sprintf(tmp_sql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`> '0'",login_db_account_id,login_db_level,login_db,login_db_level);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return; //Failed to read GM list!
+ }
+
+ if (gm_account_db != NULL)
+ {
+ aFree(gm_account_db);
+ gm_account_db = NULL;
+ }
+ GM_num = 0;
+
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ gm_account_db = (struct gm_account*)aCalloc((size_t)mysql_num_rows(sql_res), sizeof(struct gm_account));
+ while ((sql_row = mysql_fetch_row(sql_res))) {
+ gm_account_db[GM_num].account_id = atoi(sql_row[0]);
+ gm_account_db[GM_num].level = atoi(sql_row[1]);
+ GM_num++;
+ }
+ mysql_free_result(sql_res);
+ }
+}
+
+//-----------------------------------------------------
+// Send GM accounts to all char-server
+//-----------------------------------------------------
+void send_GM_accounts(int fd) {
+ int i;
+ unsigned char buf[32767];
+ int len;
+
+ if(!login_gm_read)
+ return;
+ len = 4;
+ WBUFW(buf,0) = 0x2732;
+ for(i = 0; i < GM_num; i++)
+ // send only existing accounts. We can not create a GM account when server is online.
+ if (gm_account_db[i].level > 0) {
+ WBUFL(buf,len) = gm_account_db[i].account_id;
+ WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level;
+ len += 5;
+ if (len >= 32000) {
+ ShowWarning("send_GM_accounts: Too many accounts! Only %d out of %d were sent.\n", i, GM_num);
+ break;
+ }
+ }
+ WBUFW(buf,2) = len;
+ if (fd == -1)
+ charif_sendallwos(-1, buf, len);
+ else
+ {
+ WFIFOHEAD(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd, len);
+ }
+ return;
+}
+
+//-----------------------------------------------------
+// check user level
+//-----------------------------------------------------
+/*
+int isGM(int account_id) {
+ int level;
+
+ MYSQL_RES* sql_res;
+ MYSQL_ROW sql_row;
+ level = 0;
+ sprintf(tmpsql,"SELECT `%s` FROM `%s` WHERE `%s`='%d'", login_db_level, login_db, login_db_account_id, account_id);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ level = atoi(sql_row[0]);
+ if (level > 99)
+ level = 99;
+ }
+
+ if (level == 0) {
+ return 0;
+ //not GM
+ }
+
+ mysql_free_result(sql_res);
+
+ return level;
+}
+*/
+
+//---------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid).
+//---------------------------------------------------
+int e_mail_check(char *email) {
+ char ch;
+ char* last_arobas;
+
+ // athena limits
+ if (strlen(email) < 3 || strlen(email) > 39)
+ return 0;
+
+ // part of RFC limits (official reference of e-mail description)
+ if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
+ return 0;
+
+ if (email[strlen(email)-1] == '.')
+ return 0;
+
+ last_arobas = strrchr(email, '@');
+
+ if (strstr(last_arobas, "@.") != NULL ||
+ strstr(last_arobas, "..") != NULL)
+ return 0;
+
+ for(ch = 1; ch < 32; ch++) {
+ if (strchr(last_arobas, ch) != NULL) {
+ return 0;
+ break;
+ }
+ }
+
+ if (strchr(last_arobas, ' ') != NULL ||
+ strchr(last_arobas, ';') != NULL)
+ return 0;
+
+ // all correct
+ return 1;
+}
+
+/*======================================================
+ * Does a mysql_ping to all connection handles. [Skotlex]
+ *------------------------------------------------------
+ */
+int login_sql_ping(int tid, unsigned int tick, int id, int data)
+{
+ ShowInfo("Pinging SQL server to keep connection alive...\n");
+ mysql_ping(&mysql_handle);
+ return 0;
+}
+
+//-----------------------------------------------------
+// Read Account database - mysql db
+//-----------------------------------------------------
+int mmo_auth_sqldb_init(void) {
+
+ ShowStatus("Login server init....\n");
+
+ // memory initialize
+ ShowStatus("memory initialize....\n");
+
+ mysql_init(&mysql_handle);
+
+ // DB connection start
+ ShowStatus("Connect Login Database Server....\n");
+ if (!mysql_real_connect(&mysql_handle, login_server_ip, login_server_id, login_server_pw,
+ login_server_db, login_server_port, (char *)NULL, 0)) {
+ // pointer check
+ ShowFatalError("%s\n", mysql_error(&mysql_handle));
+ exit(1);
+ } else {
+ ShowStatus("Connect success!\n");
+ }
+ if( strlen(default_codepage) > 0 ) {
+ sprintf( tmpsql, "SET NAMES %s", default_codepage );
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+
+ if (log_login)
+ {
+ sprintf(tmpsql, "INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '0', 'lserver','100','login server started')", loginlog_db);
+
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+
+ if (connection_ping_interval) {
+ add_timer_func_list(login_sql_ping, "login_sql_ping");
+ add_timer_interval(gettick()+connection_ping_interval*60*60*1000,
+ login_sql_ping, 0, 0, connection_ping_interval*60*60*1000);
+ }
+ return 0;
+}
+
+//-----------------------------------------------------
+// DB server connect check
+//-----------------------------------------------------
+void mmo_auth_sqldb_sync(void) {
+ // db connect check? or close?
+ // ping pong DB server -if losted? then connect try. else crash.
+}
+
+//-----------------------------------------------------
+// close DB
+//-----------------------------------------------------
+void mmo_db_close(void) {
+ int i, fd;
+
+ //set log.
+ if (log_login)
+ {
+ sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '0', 'lserver','100', 'login server shutdown')", loginlog_db);
+
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+/*
+ //delete all server status
+ sprintf(tmpsql,"DELETE FROM `sstatus`");
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ mysql_close(&mysql_handle);
+ ShowStatus("close DB connect....\n");
+*/
+
+ for (i = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server_fd[i]) >= 0)
+ { //Clean only data related to servers we are connected to. [Skotlex]
+ sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index` = '%d'", i);
+ if (mysql_query(&mysql_handle, tmpsql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ delete_session(fd);
+ }
+ }
+ mysql_close(&mysql_handle);
+ ShowStatus("close DB connect....\n");
+ delete_session(login_fd);
+}
+
+//-----------------------------------------------------
+// Make new account
+//-----------------------------------------------------
+int mmo_auth_new(struct mmo_account* account, char sex)
+{
+ MYSQL_RES* sql_res;
+ unsigned int tick = gettick();
+ char user_password[256];
+ //Account Registration Flood Protection by [Kevin]
+ if(tick <= new_reg_tick && num_regs >= allowed_regs) {
+ ShowNotice("Account registration denied (registration limit exceeded)\n");
+ return 3;
+ }
+
+ //Check for preexisting account
+ sprintf(tmp_sql, "SELECT `%s` FROM `%s` WHERE `userid` = '%s'", login_db_userid, login_db, account->userid);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 1; //Return Incorrect user/pass?
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ if(mysql_num_rows(sql_res) > 0){
+ mysql_free_result(sql_res);
+ return 1; //Already exists, return incorrect user/pass.
+ }
+ mysql_free_result(sql_res); //Only needed for the already-exists check...
+
+ mysql_real_escape_string(&mysql_handle, account->userid, account->userid, strlen(account->userid));
+ mysql_real_escape_string(&mysql_handle, account->passwd, account->passwd, strlen(account->passwd));
+
+ if (sex == 'f') sex = 'F';
+ else if (sex == 'm') sex = 'M';
+ if (use_md5_passwds)
+ MD5_String(account->passwd,user_password);
+ else
+ jstrescapecpy(user_password, account->passwd);
+
+ ShowInfo("New account: user: %s with passwd: %s sex: %c\n", account->userid, user_password, sex);
+
+ sprintf(tmp_sql, "INSERT INTO `%s` (`%s`, `%s`, `sex`, `email`) VALUES ('%s', '%s', '%c', '%s')", login_db, login_db_userid, login_db_user_pass, account->userid, user_password, sex, "a@a.com");
+
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ //Failed to insert new acc :/
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 1;
+ }
+
+ if(mysql_field_count(&mysql_handle) == 0 &&
+ mysql_insert_id(&mysql_handle) < START_ACCOUNT_NUM) {
+ //Invalid Account ID! Must update it.
+ int id = (int)mysql_insert_id(&mysql_handle);
+ sprintf(tmp_sql, "UPDATE `%s` SET `%s`='%d' WHERE `%s`='%d'", login_db, login_db_account_id, START_ACCOUNT_NUM, login_db_account_id, id);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowError("New account %s has an invalid account ID [%d] which could not be updated (account_id must be %d or higher).", account->userid, id, START_ACCOUNT_NUM);
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ //Just delete it and fail.
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, id);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 1;
+ }
+ ShowNotice("Updated New account %s's ID %d->%d (account_id must be %d or higher).", account->userid, id, START_ACCOUNT_NUM, START_ACCOUNT_NUM);
+ }
+ if(tick > new_reg_tick)
+ { //Update the registration check.
+ num_regs=0;
+ new_reg_tick=gettick()+time_allowed*1000;
+ }
+ num_regs++;
+
+ return 0;
+}
+
+// Send to char
+int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
+ int i, c;
+ int fd;
+
+ c = 0;
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server_fd[i]) > 0 && fd != sfd) {
+ WFIFOHEAD(fd,len);
+ if (WFIFOSPACE(fd) < len) //Increase buffer size.
+ realloc_writefifo(fd, len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+//-----------------------------------------------------
+// Auth
+//-----------------------------------------------------
+int mmo_auth( struct mmo_account* account , int fd){
+ time_t ban_until_time, raw_time;
+ char tmpstr[256];
+ char t_uid[256], t_pass[256];
+ char user_password[256];
+ char *dnsbl_serv;
+
+ //added for account creation _M _F
+ int len;
+
+ MYSQL_RES* sql_res;
+ MYSQL_ROW sql_row;
+ //int sql_fields, sql_cnt;
+ char md5str[64], md5bin[32];
+
+ char ip[16];
+
+ unsigned char * sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr.s_addr;
+
+ char r_ip[16]; // [Zido]
+ char ip_dnsbl[256]; // [Zido]
+
+ // Start DNS Blacklist check [Zido]
+ if(use_dnsbl) {
+ sprintf(r_ip, "%d.%d.%d.%d", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
+
+ dnsbl_serv=strtok(dnsbl_servs,",");
+ sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
+// Using directly gethostbyname should be quicker. [Skotlex]
+// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+ if(gethostbyname(ip_dnsbl)) {
+ ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
+ return 3;
+ }
+
+ while((dnsbl_serv=strtok(dnsbl_servs,","))!=NULL) {
+ sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
+// Using directly gethostbyname should be quicker. [Skotlex]
+// if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+ if(gethostbyname(ip_dnsbl)) {
+ ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
+ return 3;
+ }
+ }
+
+ }
+ // End DNS Blacklist check [Zido]
+
+ sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
+ //ShowInfo("auth start for %s...\n", ip);
+
+ //accountreg with _M/_F .. [Sirius]
+ len = strlen(account->userid) -2;
+
+ if (account->passwdenc == 0 && account->userid[len] == '_' &&
+ (account->userid[len+1] == 'F' || account->userid[len+1] == 'M' ||
+ account->userid[len+1] == 'f' || account->userid[len+1] == 'm') &&
+ new_account_flag == 1 &&
+ len >= 4 && strlen(account->passwd) >= 4)
+ {
+ int result;
+ account->userid[len] = '\0'; //Terminating the name.
+ if ((result = mmo_auth_new(account, account->userid[len+1])))
+ return result; //Failed to make account. [Skotlex].
+ }
+
+ // auth start : time seed
+ // Platform/Compiler dependant clock() for time check is removed. [Lance]
+ // clock() is originally used to track processing ticks on program execution.
+ time(&raw_time);
+ strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&raw_time));
+
+ jstrescapecpy(t_uid,account->userid);
+
+ if (account->passwdenc==PASSWORDENC) {
+ memcpy(t_pass, account->passwd, NAME_LENGTH);
+ t_pass[NAME_LENGTH] = '\0';
+ } else
+ jstrescapecpy(t_pass, account->passwd);
+
+
+ // make query
+ sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`,`%s`"
+ " FROM `%s` WHERE `%s`= %s '%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
+ //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state/10-level}
+
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+ if (!sql_row) {
+ //there's no id.
+ ShowNotice("auth failed: no such account %s %s %s\n", tmpstr, account->userid, account->passwd);
+ mysql_free_result(sql_res);
+ return 0;
+ }
+ } else {
+ ShowError("mmo_auth DB result error ! \n");
+ return 0;
+ }
+
+ //Client Version check[Sirius]
+ if(check_client_version == 1 && account->version != 0){
+ if(account->version != client_version_to_connect){
+ mysql_free_result(sql_res);
+ return 5;
+ }
+ }
+
+ // Documented by CLOWNISIUS || LLRO || Gunstar lead this one with me
+ // IF changed to diferent returns~ you get diferent responses from your msgstringtable.txt
+ //Ireturn 2 == line 9
+ //Ireturn 5 == line 311
+ //Ireturn 6 == line 450
+ //Ireturn 7 == line 440
+ //Ireturn 8 == line 682
+ //Ireturn 9 == line 704
+ //Ireturn 10 == line 705
+ //Ireturn 11 == line 706
+ //Ireturn 12 == line 707
+ //Ireturn 13 == line 708
+ //Ireturn 14 == line 709
+ //Ireturn 15 == line 710
+ //Ireturn -1 == line 010
+ // Check status
+ {
+ int encpasswdok = 0;
+
+ if (atoi(sql_row[9]) == -3) {
+ //id is banned
+ mysql_free_result(sql_res);
+ return -3;
+ } else if (atoi(sql_row[9]) == -2) { //dynamic ban
+ //id is banned
+ mysql_free_result(sql_res);
+ //add IP list.
+ return -2;
+ }
+
+ if (use_md5_passwds) {
+ MD5_String(account->passwd,user_password);
+ } else {
+ jstrescapecpy(user_password, account->passwd);
+ }
+ //ShowInfo("account id ok encval:%d\n",account->passwdenc);
+#ifdef PASSWORDENC
+ if (account->passwdenc > 0) {
+ int j = account->passwdenc;
+ //ShowInfo("start md5calc..\n");
+ if (j > 2)
+ j = 1;
+ do {
+ if (j == 1) {
+ sprintf(md5str, "%s%s", md5key,sql_row[2]);
+ } else if (j == 2) {
+ sprintf(md5str, "%s%s", sql_row[2], md5key);
+ } else
+ md5str[0] = 0;
+ //ShowDebug("j:%d mdstr:%s\n", j, md5str);
+ MD5_String2binary(md5str, md5bin);
+ encpasswdok = (memcmp(user_password, md5bin, 16) == 0);
+ } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
+ //printf("key[%s] md5 [%s] ", md5key, md5);
+ //ShowInfo("client [%s] accountpass [%s]\n", user_password, sql_row[2]);
+ //ShowInfo("end md5calc..\n");
+ }
+#endif
+ if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) {
+ if (account->passwdenc == 0) {
+ ShowNotice("auth failed pass error %s %s %s" RETCODE, tmpstr, account->userid, user_password);
+#ifdef PASSWORDENC
+ } else {
+ char logbuf[1024], *p = logbuf;
+ int j;
+ p += sprintf(p, "auth failed pass error %s %s recv-md5[", tmpstr, account->userid);
+ for(j = 0; j < 16; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)user_password)[j]);
+ p += sprintf(p, "] calc-md5[");
+ for(j = 0; j < 16; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
+ p += sprintf(p, "] md5key[");
+ for(j = 0; j < md5keylen; j++)
+ p += sprintf(p, "%02x", ((unsigned char *)md5key)[j]);
+ p += sprintf(p, "]" RETCODE);
+ ShowNotice("%s\n", p);
+#endif
+ }
+ return 1;
+ }
+ //ShowInfo("auth ok %s %s" RETCODE, tmpstr, account->userid);
+ }
+
+/*
+// do not remove this section. this is meant for future, and current forums usage
+// as a login manager and CP for login server. [CLOWNISIUS]
+ if (atoi(sql_row[10]) == 1) {
+ return 4;
+ }
+
+ if (atoi(sql_row[10]) >= 5) {
+ switch(atoi(sql_row[10])) {
+ case 5:
+ return 5;
+ break;
+ case 6:
+ return 7;
+ break;
+ case 7:
+ return 9;
+ break;
+ case 8:
+ return 10;
+ break;
+ case 9:
+ return 11;
+ break;
+ default:
+ return 10;
+ break;
+ }
+ }
+*/
+ ban_until_time = atol(sql_row[8]);
+
+ //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state}
+ if (ban_until_time != 0) { // if account is banned
+ if (ban_until_time > time(NULL)) // always banned
+ return 6; // 6 = Your are Prohibited to log in until %s
+
+ sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE `%s`= %s '%s'", login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+
+ if (atoi(sql_row[9])) {
+ switch(atoi(sql_row[9])) { // packet 0x006a value + 1
+ case 1: // 0 = Unregistered ID
+ case 2: // 1 = Incorrect Password
+ case 3: // 2 = This ID is expired
+ case 4: // 3 = Rejected from Server
+ case 5: // 4 = You have been blocked by the GM Team
+ case 6: // 5 = Your Game's EXE file is not the latest version
+ case 7: // 6 = Your are Prohibited to log in until %s
+ case 8: // 7 = Server is jammed due to over populated
+ case 9: // 8 = No more accounts may be connected from this company
+ case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
+ case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
+ case 12: // 11 = MSI_REFUSE_BAN_BY_GM
+ case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
+ case 14: // 13 = MSI_REFUSE_SELF_LOCK
+ case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ case 100: // 99 = This ID has been totally erased
+ case 101: // 100 = Login information remains at %s.
+ case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
+ case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
+ case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
+ case 105: // 104 = Your spouse character is being deleted. Login is temporarily unavailable for the time being
+ ShowNotice("Auth Error #%d\n", atoi(sql_row[9]));
+ return atoi(sql_row[9]) - 1;
+ break;
+ default:
+ return 99; // 99 = ID has been totally erased
+ break;
+ }
+ }
+
+ if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) {
+ return 2; // 2 = This ID is expired
+ }
+
+ if (online_check) {
+ struct online_login_data* data = idb_get(online_db,atoi(sql_row[0]));
+ unsigned char buf[8];
+ if (data && data->char_server > -1) {
+ //Request char servers to kick this account out. [Skotlex]
+ ShowWarning("User [%s] is already online - Rejected.\n",sql_row[1]);
+ WBUFW(buf,0) = 0x2734;
+ WBUFL(buf,2) = atol(sql_row[0]);
+ charif_sendallwos(-1, buf, 6);
+ if (!data->waiting_disconnect)
+ add_timer(gettick()+30000, waiting_disconnect_timer, atol(sql_row[0]), 0);
+ data->waiting_disconnect = 1;
+ return 3; // Rejected
+ }
+ }
+
+ account->account_id = atoi(sql_row[0]);
+ account->login_id1 = rand();
+ account->login_id2 = rand();
+ memcpy(tmpstr, sql_row[3], 19);
+ memcpy(account->lastlogin, tmpstr, 24);
+ account->sex = sql_row[5][0] == 'S' ? 2 : sql_row[5][0]=='M';
+ account->level = atoi(sql_row[10]) > 99 ? 99 : atoi(sql_row[10]); // as was in isGM() [zzo]
+
+ if (account->sex != 2 && account->account_id < START_ACCOUNT_NUM)
+ ShowWarning("Account %s has account id %d! Account IDs must be over %d to work properly!\n", account->userid, account->account_id, START_ACCOUNT_NUM);
+ sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE `%s` = %s '%s'",
+ login_db, ip, login_db_userid, case_sensitive ? "BINARY" : "", sql_row[1]);
+ mysql_free_result(sql_res) ; //resource free
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+
+ return -1;
+}
+
+static int online_db_setoffline(DBKey key, void* data, va_list ap) {
+ struct online_login_data *p = (struct online_login_data *)data;
+ int server = va_arg(ap, int);
+ if (server == -1) {
+ p->char_server = -1;
+ p->waiting_disconnect = 0;
+ } else if (p->char_server == server)
+ p->char_server = -2; //Char server disconnected.
+ return 0;
+}
+
+//-----------------------------------------------------
+// char-server packet parse
+//-----------------------------------------------------
+int parse_fromchar(int fd){
+ int i, id;
+ MYSQL_RES* sql_res;
+ MYSQL_ROW sql_row = NULL;
+
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr.s_addr;
+ unsigned long ipl = session[fd]->client_addr.sin_addr.s_addr;
+ char ip[16];
+ RFIFOHEAD(fd);
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ for(id = 0; id < MAX_SERVERS; id++)
+ if (server_fd[id] == fd)
+ break;
+
+ if (id == MAX_SERVERS)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (id < MAX_SERVERS) {
+ ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
+ server_fd[id] = -1;
+ memset(&server[id], 0, sizeof(struct mmo_char_server));
+ online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char server to offline.
+ // server delete
+ sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+// printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
+
+ switch (RFIFOW(fd,0)) {
+ case 0x2709:
+ if (log_login)
+ {
+ sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`log`) VALUES (NOW(), '%u', '%s', 'GM reload request')", loginlog_db, (unsigned int)ntohl(ipl),server[id].name);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ read_gm_account();
+ // send GM accounts to all char-servers
+ send_GM_accounts(-1);
+ RFIFOSKIP(fd,2);
+ break;
+
+ case 0x2712:
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ {
+ int account_id;
+ WFIFOHEAD(fd,51);
+ account_id = RFIFOL(fd,2); // speed up
+ for(i=0;i<AUTH_FIFO_SIZE;i++){
+ if (auth_fifo[i].account_id == account_id &&
+ auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
+#endif
+ auth_fifo[i].sex == RFIFOB(fd,14) &&
+#if CMP_AUTHFIFO_IP != 0
+ auth_fifo[i].ip == RFIFOL(fd,15) &&
+#endif
+ !auth_fifo[i].delflag)
+ {
+ auth_fifo[i].delflag = 1;
+ ShowDebug("auth -> %d\n", i);
+ break;
+ }
+ }
+
+ if (i != AUTH_FIFO_SIZE && account_id > 0) { // send ack
+ time_t connect_until_time = 0;
+ char email[40] = "";
+ account_id=RFIFOL(fd,2);
+ sprintf(tmpsql, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ connect_until_time = atol(sql_row[1]);
+ strcpy(email, sql_row[0]);
+ mysql_free_result(sql_res);
+ }
+ WFIFOW(fd,0) = 0x2713;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = 0;
+ memcpy(WFIFOP(fd, 7), email, 40);
+ WFIFOL(fd,47) = (unsigned long) connect_until_time;
+ WFIFOSET(fd,51);
+ } else {
+ WFIFOW(fd,0) = 0x2713;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = 1;
+ WFIFOSET(fd,51);
+ }
+ RFIFOSKIP(fd,19);
+ break;
+ }
+
+ case 0x2714:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ // how many users on world? (update)
+ if (server[id].users != RFIFOL(fd,2))
+ {
+ ShowStatus("set users %s : %d\n", server[id].name, RFIFOL(fd,2));
+
+ server[id].users = RFIFOL(fd,2);
+ sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ { // send some answer
+ WFIFOHEAD(fd,6);
+ WFIFOW(fd,0) = 0x2718;
+ WFIFOSET(fd,2);
+ }
+ RFIFOSKIP(fd,6);
+ break;
+
+ // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
+ case 0x2716:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ int account_id;
+ time_t connect_until_time = 0;
+ char email[40] = "";
+ WFIFOHEAD(fd,50);
+ account_id=RFIFOL(fd,2);
+ sprintf(tmpsql,"SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, account_id);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ connect_until_time = atol(sql_row[1]);
+ strcpy(email, sql_row[0]);
+ }
+ mysql_free_result(sql_res);
+ //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
+ WFIFOW(fd,0) = 0x2717;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ memcpy(WFIFOP(fd, 6), email, 40);
+ WFIFOL(fd,46) = (unsigned long) connect_until_time;
+ WFIFOSET(fd,50);
+ }
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x2720: // GM
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ if (RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ //oldacc = RFIFOL(fd,4);
+ ShowWarning("change GM isn't supported in this login server version.\n");
+ ShowError("change GM error 0 %s\n", RFIFOP(fd, 8));
+
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ {
+ WFIFOHEAD(fd, 10);
+ WFIFOW(fd, 0) = 0x2721;
+ WFIFOL(fd, 2) = RFIFOL(fd,4); // oldacc;
+ WFIFOL(fd, 6) = 0; // newacc;
+ WFIFOSET(fd, 10);
+ }
+ return 0;
+
+ // Map server send information to change an email of an account via char-server
+ case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ {
+ int acc;
+ char actual_email[40], new_email[40];
+ acc = RFIFOL(fd,2);
+ memcpy(actual_email, RFIFOP(fd,6), 40);
+ memcpy(new_email, RFIFOP(fd,46), 40);
+ if (e_mail_check(actual_email) == 0)
+ ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else if (e_mail_check(new_email) == 0)
+ ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else if (strcmpi(new_email, "a@a.com") == 0)
+ ShowWarning("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
+ server[id].name, acc, ip);
+ else {
+ sprintf(tmpsql, "SELECT `%s`,`email` FROM `%s` WHERE `%s` = '%d'", login_db_userid, login_db, login_db_account_id, acc);
+ if (mysql_query(&mysql_handle, tmpsql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+
+ if (strcmpi(sql_row[1], actual_email) == 0) {
+ sprintf(tmpsql, "UPDATE `%s` SET `email` = '%s' WHERE `%s` = '%d'", login_db, new_email, login_db_account_id, acc);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ ShowInfo("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
+ server[id].name, acc, sql_row[0], actual_email, ip);
+ }
+ }
+
+ }
+ RFIFOSKIP(fd, 86);
+ break;
+ }
+
+ case 0x2724: // Receiving of map-server via char-server a status change resquest (by Yor)
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int acc, statut;
+ acc = RFIFOL(fd,2);
+ statut = RFIFOL(fd,6);
+ sprintf(tmpsql, "SELECT `state` FROM `%s` WHERE `%s` = '%d'", login_db, login_db_account_id, acc);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); // row fetching
+ }
+ if (atoi(sql_row[0]) != statut && statut != 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = statut; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ }
+ sprintf(tmpsql,"UPDATE `%s` SET `state` = '%d' WHERE `%s` = '%d'", login_db, statut,login_db_account_id,acc);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ RFIFOSKIP(fd,10);
+ break;
+ }
+
+ case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ {
+ int acc;
+ struct tm *tmtime;
+ time_t timestamp, tmptime;
+ acc = RFIFOL(fd,2);
+ sprintf(tmpsql, "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); // row fetching
+ }
+ tmptime = atol(sql_row[0]);
+ if (tmptime == 0 || tmptime < time(NULL))
+ timestamp = time(NULL);
+ else
+ timestamp = tmptime;
+ tmtime = localtime(&timestamp);
+ tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
+ tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
+ tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
+ tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
+ tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
+ tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
+ timestamp = mktime(tmtime);
+ if (timestamp != -1) {
+ if (timestamp <= time(NULL))
+ timestamp = 0;
+ if (tmptime != timestamp) {
+ if (timestamp != 0) {
+ unsigned char buf[16];
+ WBUFW(buf,0) = 0x2731;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
+ WBUFL(buf,7) = (unsigned int)timestamp; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ }
+ ShowNotice("Account: %d Banned until: %ld\n", acc, timestamp);
+ sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld' WHERE `%s` = '%d'", login_db, (unsigned long)timestamp, login_db_account_id, acc);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ }
+ RFIFOSKIP(fd,18);
+ break;
+ }
+
+ case 0x2727:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ int acc,sex;
+ unsigned char buf[16];
+ acc=RFIFOL(fd,2);
+ sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
+
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ return 0;
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ if (sql_res) {
+ if (mysql_num_rows(sql_res) == 0) {
+ mysql_free_result(sql_res);
+ return 0;
+ }
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+ }
+
+ if (strcmpi(sql_row[0], "M") == 0)
+ sex = 0; //Change to female
+ else
+ sex = 1; //Change to make
+ sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex?'M':'F'), login_db_account_id, acc);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ WBUFW(buf,0) = 0x2723;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+ charif_sendallwos(-1, buf, 7);
+ RFIFOSKIP(fd,6);
+ break;
+ }
+
+ case 0x2728: // save account_reg2
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (RFIFOL(fd,4) > 0) {
+ int acc,p,j,len;
+ char str[32];
+ char temp_str[64]; //Needs twice as much space as the original string.
+ char temp_str2[512];
+ char value[256];
+ unsigned char *buf;
+ acc=RFIFOL(fd,4);
+ buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char));
+ //Delete all global account variables....
+ sprintf(tmpsql,"DELETE FROM `%s` WHERE `type`='1' AND `account_id`='%d';",reg_db,acc);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ //Proceed to insert them....
+ for(j=0,p=13;j<ACCOUNT_REG2_NUM && p<RFIFOW(fd,2);j++){
+ sscanf(RFIFOP(fd,p), "%31c%n",str,&len);
+ str[len]='\0';
+ p +=len+1; //+1 to skip the '\0' between strings.
+ sscanf(RFIFOP(fd,p), "%255c%n",value,&len);
+ value[len]='\0';
+ p +=len+1;
+
+ sprintf(tmpsql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%s');", reg_db, acc, jstrescapecpy(temp_str,str), jstrescapecpy(temp_str2,value));
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+
+ // Send to char
+ memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2));
+ WBUFW(buf,0)=0x2729;
+ charif_sendallwos(fd,buf,WBUFW(buf,2));
+ if (buf) aFree(buf);
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ //printf("login: save account_reg (from char)\n");
+ break;
+
+ case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ int acc;
+ acc = RFIFOL(fd,2);
+ sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res && mysql_num_rows(sql_res) > 0) { //Found a match
+ sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ if (sql_res) mysql_free_result(sql_res);
+ RFIFOSKIP(fd,6);
+ }
+ return 0;
+
+ case 0x272b: // Set account_id to online [Wizputer]
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ add_online_user(id, RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x272c: // Set account_id to offline [Wizputer]
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ remove_online_user(RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+ break;
+ case 0x272d: // Receive list of all online accounts. [Skotlex]
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (!online_check) {
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+ }
+ {
+ struct online_login_data *p;
+ int aid, users;
+ online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
+ users = RFIFOW(fd,4);
+ for (i = 0; i < users; i++) {
+ aid = RFIFOL(fd,6+i*4);
+ p = idb_ensure(online_db, aid, create_online_user);
+ p->char_server = id;
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+ }
+ case 0x272e: //Request account_reg2 for a character.
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ int account_id = RFIFOL(fd, 2);
+ int char_id = RFIFOL(fd, 6);
+ int p;
+ WFIFOHEAD(fd,10000);
+ RFIFOSKIP(fd,10);
+ sprintf(tmpsql, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'",reg_db, account_id);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ break;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (!sql_res) {
+ break;
+ }
+ WFIFOW(fd,0) = 0x2729;
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = char_id;
+ WFIFOB(fd,12) = 1; //Type 1 for Account2 registry
+ for(p = 13; (sql_row = mysql_fetch_row(sql_res)) && p < 9000;){
+ if (sql_row[0][0]) {
+ p+= sprintf(WFIFOP(fd,p), "%s", sql_row[0])+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(fd,p), "%s", sql_row[1])+1;
+ }
+ }
+ if (p >= 9000)
+ ShowWarning("Too many account2 registries for AID %d. Some registries were not sent.\n", account_id);
+ WFIFOW(fd,2) = p;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ mysql_free_result(sql_res);
+ }
+ break;
+
+ case 0x2736: // WAN IP update from char-server
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ ShowInfo("Updated IP of Server #%d to %d.%d.%d.%d.\n",id,
+ (int)RFIFOB(fd,2),(int)RFIFOB(fd,3),
+ (int)RFIFOB(fd,4),(int)RFIFOB(fd,5));
+ server[id].ip = RFIFOL(fd,2);
+ RFIFOSKIP(fd,6);
+ break;
+
+ case 0x2737: //Request to set all offline.
+ ShowInfo("Setting accounts from char-server %d offline.\n", id);
+ online_db->foreach(online_db,online_db_setoffline,id);
+ RFIFOSKIP(fd,2);
+ break;
+
+ default:
+ ShowError("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+//--------------------------------------------
+// Test to know if an IP come from LAN or WAN.
+// Rewrote: Adnvanced subnet check [LuzZza]
+//--------------------------------------------
+int lan_subnetcheck(long p) {
+
+ int i;
+ unsigned char *sbn, *msk, *src = (unsigned char *)&p;
+
+ for(i=0; i<subnet_count; i++) {
+
+ if(subnet[i].subnet == (p & subnet[i].mask)) {
+
+ sbn = (unsigned char *)&subnet[i].subnet;
+ msk = (unsigned char *)&subnet[i].mask;
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
+ src[0], src[1], src[2], src[3], sbn[0], sbn[1], sbn[2], sbn[3], msk[0], msk[1], msk[2], msk[3]);
+
+ return subnet[i].char_ip;
+ }
+ }
+
+ ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", src[0], src[1], src[2], src[3]);
+ return 0;
+}
+
+int login_ip_ban_check(unsigned char *p, unsigned long ipl)
+{
+ MYSQL_RES* sql_res;
+ MYSQL_ROW sql_row;
+ //ip ban
+ //p[0], p[1], p[2], p[3]
+ //request DB connection
+ //check
+ sprintf(tmpsql, "SELECT count(*) FROM `ipbanlist` WHERE `list` = '%d.*.*.*' OR `list` = '%d.%d.*.*' OR `list` = '%d.%d.%d.*' OR `list` = '%d.%d.%d.%d'",
+ p[0], p[0], p[1], p[0], p[1], p[2], p[0], p[1], p[2], p[3]);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ // close connection because we can't verify their connectivity.
+ return 1;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
+
+ if(!sql_row) return 1; //Shouldn't happen, but just in case...
+
+ if (atoi(sql_row[0]) == 0) { //No ban
+ mysql_free_result(sql_res);
+ return 0;
+ }
+
+ // ip ban ok.
+ ShowWarning("packet from banned ip : %d.%d.%d.%d\n" RETCODE, p[0], p[1], p[2], p[3]);
+
+ if (log_login)
+ {
+ sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', 'unknown','-3', 'ip banned')", loginlog_db, (unsigned int)ntohl(ipl));
+ // query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ mysql_free_result(sql_res);
+ return 1;
+}
+//----------------------------------------------------------------------------------------
+// Default packet parsing (normal players or administation/char-server connection requests)
+//----------------------------------------------------------------------------------------
+int parse_login(int fd) {
+ //int len;
+
+ MYSQL_RES* sql_res ;
+ MYSQL_ROW sql_row = NULL;
+
+ char t_uid[100];
+ struct mmo_account account;
+ long subnet_char_ip;
+ int packet_len;
+
+ int result, i;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr.s_addr;
+ unsigned long ipl = session[fd]->client_addr.sin_addr.s_addr;
+ char ip[16];
+ RFIFOHEAD(fd);
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ memset(&account, 0, sizeof(account));
+
+ if (session[fd]->eof) {
+ for(i = 0; i < MAX_SERVERS; i++)
+ if (server_fd[i] == fd)
+ server_fd[i] = -1;
+ do_close(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd)>=2 && !session[fd]->eof){
+// ShowDebug("parse_login : %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
+
+ switch(RFIFOW(fd,0)){
+ case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
+ if (RFIFOREST(fd) < 26)
+ return 0;
+ RFIFOSKIP(fd,26);
+ break;
+
+ case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ RFIFOSKIP(fd,18);
+ break;
+
+ case 0x277: // New login packet
+ case 0x64: // request client login
+ case 0x01dd: // request client login with encrypt
+
+ packet_len = RFIFOREST(fd);
+
+ //Perform ip-ban check ONLY on login packets
+ if (ipban > 0 && login_ip_ban_check(p,ipl))
+ {
+ RFIFOSKIP(fd,packet_len);
+ session[fd]->eof = 1;
+ break;
+ }
+
+ switch(RFIFOW(fd,0)){
+ case 0x64:
+ if(packet_len < 55)
+ return 0;
+ break;
+ case 0x01dd:
+ if(packet_len < 47)
+ return 0;
+ break;
+ case 0x277:
+ if(packet_len < 84)
+ return 0;
+ break;
+ }
+
+ account.version = RFIFOL(fd, 2);
+ if (!account.version) account.version = 1; //Force some version...
+ memcpy(account.userid,RFIFOP(fd, 6),NAME_LENGTH);
+ account.userid[23] = '\0';
+ memcpy(account.passwd,RFIFOP(fd, 30),NAME_LENGTH);
+ account.passwd[23] = '\0';
+
+ ShowInfo("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]);
+#ifdef PASSWORDENC
+ account.passwdenc= (RFIFOW(fd,0)!=0x01dd)?0:PASSWORDENC;
+#else
+ account.passwdenc=0;
+#endif
+ result=mmo_auth(&account, fd);
+
+
+ jstrescapecpy(t_uid,account.userid);
+ if(result==-1){
+ // as we have queried account level earlier in mmo_auth anyway, no need to do this again [zzo]
+ // int gm_level = isGM(account.account_id); // removed by [zzo]
+
+ if (min_level_to_connect > account.level) {
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ } else {
+ WFIFOHEAD(fd,47+32*MAX_SERVERS);
+ if (p[0] != 127 && log_login) {
+ sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s','100', 'login ok')", loginlog_db, (unsigned int)ntohl(ipl), t_uid);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ if (account.level)
+ ShowStatus("Connection of the GM (level:%d) account '%s' accepted.\n", account.level, account.userid);
+ else
+ ShowStatus("Connection of the account '%s' accepted.\n", account.userid);
+ server_num=0;
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {
+ // Advanced subnet check [LuzZza]
+ if((subnet_char_ip = lan_subnetcheck(ipl)))
+ WFIFOL(fd,47+server_num*32) = subnet_char_ip;
+ else
+ WFIFOL(fd,47+server_num*32) = server[i].ip;
+ WFIFOW(fd,47+server_num*32+4) = server[i].port;
+ memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
+ WFIFOW(fd,47+server_num*32+26) = server[i].users;
+ WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
+ WFIFOW(fd,47+server_num*32+30) = server[i].new_;
+ server_num++;
+ }
+ }
+ // if at least 1 char-server
+ if (server_num > 0) {
+ WFIFOW(fd,0)=0x69;
+ WFIFOW(fd,2)=47+32*server_num;
+ WFIFOL(fd,4)=account.login_id1;
+ WFIFOL(fd,8)=account.account_id;
+ WFIFOL(fd,12)=account.login_id2;
+ WFIFOL(fd,16)=0;
+ memcpy(WFIFOP(fd,20),account.lastlogin,24);
+ WFIFOB(fd,46)=account.sex;
+ WFIFOSET(fd,47+32*server_num);
+ if(auth_fifo_pos>=AUTH_FIFO_SIZE)
+ auth_fifo_pos=0;
+ auth_fifo[auth_fifo_pos].account_id=account.account_id;
+ auth_fifo[auth_fifo_pos].login_id1=account.login_id1;
+ auth_fifo[auth_fifo_pos].login_id2=account.login_id2;
+ auth_fifo[auth_fifo_pos].sex=account.sex;
+ auth_fifo[auth_fifo_pos].delflag=0;
+ auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
+ auth_fifo_pos++;
+ } else {
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ }
+ }
+ } else {
+ char tmp_sql[512];
+ char error[64];
+ WFIFOHEAD(fd,23);
+ if (log_login)
+ {
+ sprintf(tmp_sql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s', '%d','login failed : %%s')", loginlog_db, (unsigned int)ntohl(ipl), t_uid, result);
+ switch((result + 1)) {
+ case -2: //-3 = Account Banned
+ sprintf(tmpsql,tmp_sql,"Account banned.");
+ sprintf(error,"Account banned.");
+ break;
+ case -1: //-2 = Dynamic Ban
+ sprintf(tmpsql,tmp_sql,"dynamic ban (ip and account).");
+ sprintf(error,"dynamic ban (ip and account).");
+ break;
+ case 1: // 0 = Unregistered ID
+ sprintf(tmpsql,tmp_sql,"Unregisterd ID.");
+ sprintf(error,"Unregisterd ID.");
+ break;
+ case 2: // 1 = Incorrect Password
+ sprintf(tmpsql,tmp_sql,"Incorrect Password.");
+ sprintf(error,"Incorrect Password.");
+ break;
+ case 3: // 2 = This ID is expired
+ sprintf(tmpsql,tmp_sql,"Account Expired.");
+ sprintf(error,"Account Expired.");
+ break;
+ case 4: // 3 = Rejected from Server
+ sprintf(tmpsql,tmp_sql,"Rejected from server.");
+ sprintf(error,"Rejected from server.");
+ break;
+ case 5: // 4 = You have been blocked by the GM Team
+ sprintf(tmpsql,tmp_sql,"Blocked by GM.");
+ sprintf(error,"Blocked by GM.");
+ break;
+ case 6: // 5 = Your Game's EXE file is not the latest version
+ sprintf(tmpsql,tmp_sql,"Not latest game EXE.");
+ sprintf(error,"Not latest game EXE.");
+ break;
+ case 7: // 6 = Your are Prohibited to log in until %s
+ sprintf(tmpsql,tmp_sql,"Banned.");
+ sprintf(error,"Banned.");
+ break;
+ case 8: // 7 = Server is jammed due to over populated
+ sprintf(tmpsql,tmp_sql,"Server Over-population.");
+ sprintf(error,"Server Over-population.");
+ break;
+ case 9: // 8 = No more accounts may be connected from this company
+ sprintf(tmpsql,tmp_sql,"Account limit from company");
+ sprintf(error,"Account limit from company");
+ break;
+ case 10: // 9 = MSI_REFUSE_BAN_BY_DBA
+ sprintf(tmpsql,tmp_sql,"Ban by DBA");
+ sprintf(error,"Ban by DBA");
+ break;
+ case 11: // 10 = MSI_REFUSE_EMAIL_NOT_CONFIRMED
+ sprintf(tmpsql,tmp_sql,"Email not confirmed");
+ sprintf(error,"Email not confirmed");
+ break;
+ case 12: // 11 = MSI_REFUSE_BAN_BY_GM
+ sprintf(tmpsql,tmp_sql,"Ban by GM");
+ sprintf(error,"Ban by GM");
+ break;
+ case 13: // 12 = MSI_REFUSE_TEMP_BAN_FOR_DBWORK
+ sprintf(tmpsql,tmp_sql,"Working in DB");
+ sprintf(error,"Working in DB");
+ break;
+ case 14: // 13 = MSI_REFUSE_SELF_LOCK
+ sprintf(tmpsql,tmp_sql,"Self Lock");
+ sprintf(error,"Self Lock");
+ break;
+ case 15: // 14 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ sprintf(tmpsql,tmp_sql,"Not Permitted Group");
+ sprintf(error,"Not Permitted Group");
+ break;
+ case 16: // 15 = MSI_REFUSE_NOT_PERMITTED_GROUP
+ sprintf(tmpsql,tmp_sql,"Not Permitted Group");
+ sprintf(error,"Not Permitted Group");
+ break;
+ case 100: // 99 = This ID has been totally erased
+ sprintf(tmpsql,tmp_sql,"Account gone.");
+ sprintf(error,"Account gone.");
+ break;
+ case 101: // 100 = Login information remains at %s
+ sprintf(tmpsql,tmp_sql,"Login info remains.");
+ sprintf(error,"Login info remains.");
+ break;
+ case 102: // 101 = Account has been locked for a hacking investigation. Please contact the GM Team for more information
+ sprintf(tmpsql,tmp_sql,"Hacking investigation.");
+ sprintf(error,"Hacking investigation.");
+ break;
+ case 103: // 102 = This account has been temporarily prohibited from login due to a bug-related investigation
+ sprintf(tmpsql,tmp_sql,"Bug investigation.");
+ sprintf(error,"Bug investigation.");
+ break;
+ case 104: // 103 = This character is being deleted. Login is temporarily unavailable for the time being
+ sprintf(tmpsql,tmp_sql,"Deleting char.");
+ sprintf(error,"Deleting char.");
+ break;
+ case 105: // 104 = This character is being deleted. Login is temporarily unavailable for the time being
+ sprintf(tmpsql,tmp_sql,"Deleting spouse char.");
+ sprintf(error,"Deleting spouse char.");
+ break;
+ default:
+ sprintf(tmpsql,tmp_sql,"Unknown Error.");
+ sprintf(error,"Unknown Error.");
+ break;
+ }
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ } //End login log of error.
+ if ((result == 1) && (dynamic_pass_failure_ban != 0) && log_login){ // failed password
+ sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%u' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE",
+ loginlog_db,(unsigned int)ntohl(ipl), dynamic_pass_failure_ban_time); //how many times filed account? in one ip.
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ //check query result
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
+
+ if (sql_row && atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) {
+ sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban: %s')", p[0], p[1], p[2], dynamic_pass_failure_ban_how_long, t_uid);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ if(sql_res) mysql_free_result(sql_res);
+ }
+ else if (result == -2){ //dynamic banned - add ip to ban list.
+ sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", p[0], p[1], p[2], t_uid);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ result = -3;
+ }else if(result == 6){ //not lastet version ..
+ //result = 5;
+ }
+
+ sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = %s '%s'",login_db, login_db_userid, case_sensitive ? "BINARY" : "", t_uid);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //row fetching
+ //cannot connect login failed
+ memset(WFIFOP(fd,0),'\0',23);
+ WFIFOW(fd,0)=0x6a;
+ WFIFOB(fd,2)=result;
+ if (result == 6) { // 6 = Your are Prohibited to log in until %s
+ if (sql_row && atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp
+ char tmpstr[256];
+ time_t ban_until_time;
+ ban_until_time = atol(sql_row[0]);
+ strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
+ tmpstr[19] = '\0';
+ memcpy(WFIFOP(fd,3), tmpstr, 20);
+ } else { // we send error message
+ memcpy(WFIFOP(fd,3), error, 20);
+ }
+ }
+ WFIFOSET(fd,23);
+ }
+ RFIFOSKIP(fd,packet_len);
+ break;
+
+ case 0x01db: // request password key
+ if (session[fd]->session_data) {
+ ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ {
+ WFIFOHEAD(fd,4+md5keylen);
+ WFIFOW(fd,0)=0x01dc;
+ WFIFOW(fd,2)=4+md5keylen;
+ memcpy(WFIFOP(fd,4),md5key,md5keylen);
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ ShowDebug("Request Password key -%s\n",md5key);
+ RFIFOSKIP(fd,2);
+ }
+ break;
+
+ case 0x2710: // request Char-server connection
+ if(RFIFOREST(fd)<86)
+ return 0;
+ {
+ unsigned char* server_name;
+ WFIFOHEAD(fd, 3);
+ memcpy(account.userid,RFIFOP(fd, 2),NAME_LENGTH);
+ account.userid[23] = '\0';
+ memcpy(account.passwd,RFIFOP(fd, 26),NAME_LENGTH);
+ account.passwd[23] = '\0';
+ account.passwdenc = 0;
+ server_name = RFIFOP(fd,60);
+ server_name[20] = '\0';
+ ShowInfo("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n",
+ server_name, RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58),
+ p[0], p[1], p[2], p[3]);
+ jstrescapecpy(t_uid,server_name);
+ if (log_login)
+ {
+ char t_login[50];
+ jstrescapecpy(t_login,account.userid);
+ sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')",
+ loginlog_db, (unsigned int)ntohl(ipl),
+ t_login, t_uid, t_uid,
+ RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57),
+ RFIFOW(fd, 58));
+
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ }
+ result = mmo_auth(&account, fd);
+ //printf("Result: %d - Sex: %d - Account ID: %d\n",result,account.sex,(int) account.account_id);
+
+ if(result == -1 && account.sex==2 && account.account_id<MAX_SERVERS && server_fd[account.account_id]==-1){
+ ShowStatus("Connection of the char-server '%s' accepted.\n", server_name);
+ memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
+ server[account.account_id].ip=RFIFOL(fd,54);
+ server[account.account_id].port=RFIFOW(fd,58);
+ memcpy(server[account.account_id].name,server_name,20);
+ server[account.account_id].users=0;
+ server[account.account_id].maintenance=RFIFOW(fd,82);
+ server[account.account_id].new_=RFIFOW(fd,84);
+ server_fd[account.account_id]=fd;
+ sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+
+ sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')",
+ account.account_id, t_uid,0);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql);
+ }
+ WFIFOW(fd,0)=0x2711;
+ WFIFOB(fd,2)=0;
+ WFIFOSET(fd,3);
+ session[fd]->func_parse=parse_fromchar;
+ realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);
+ // send GM account to char-server
+ send_GM_accounts(fd);
+ } else {
+ WFIFOW(fd, 0) =0x2711;
+ WFIFOB(fd, 2)=3;
+ WFIFOSET(fd, 3);
+ }
+ }
+ RFIFOSKIP(fd, 86);
+ return 0;
+
+ case 0x7530: // request Athena information
+ {
+ WFIFOHEAD(fd,10);
+ WFIFOW(fd,0)=0x7531;
+ WFIFOB(fd,2)=ATHENA_MAJOR_VERSION;
+ WFIFOB(fd,3)=ATHENA_MINOR_VERSION;
+ WFIFOB(fd,4)=ATHENA_REVISION;
+ WFIFOB(fd,5)=ATHENA_RELEASE_FLAG;
+ WFIFOB(fd,6)=ATHENA_OFFICIAL_FLAG;
+ WFIFOB(fd,7)=ATHENA_SERVER_LOGIN;
+ WFIFOW(fd,8)=ATHENA_MOD_VERSION;
+ WFIFOSET(fd,10);
+ RFIFOSKIP(fd,2);
+ ShowInfo ("Athena version check...\n");
+ break;
+ }
+ case 0x7532:
+ ShowStatus ("End of connection (ip: %s)" RETCODE, ip);
+ session[fd]->eof = 1;
+ break;
+ default:
+ ShowStatus ("Abnormal end of connection (ip: %s): Unknown packet 0x%x " RETCODE, ip, RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+// Console Command Parser [Wizputer]
+int parse_console(char *buf) {
+ char *type,*command;
+
+ type = (char *)aMalloc(64);
+ command = (char *)aMalloc(64);
+
+ memset(type,0,64);
+ memset(command,0,64);
+
+ ShowInfo("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ ShowInfo("Type of command: %s || Command: %s \n",type,command);
+
+ if(buf) aFree(buf);
+ if(type) aFree(type);
+ if(command) aFree(command);
+
+ return 0;
+}
+
+static int online_data_cleanup_sub(DBKey key, void *data, va_list ap)
+{
+ struct online_login_data *character= (struct online_login_data*)data;
+ if (character->char_server == -2) //Unknown server.. set them offline
+ remove_online_user(character->account_id);
+ else if (character->char_server < 0)
+ //Free data from players that have not been online for a while.
+ db_remove(online_db, key);
+ return 0;
+}
+
+static int online_data_cleanup(int tid, unsigned int tick, int id, int data)
+{
+ online_db->foreach(online_db, online_data_cleanup_sub);
+ return 0;
+}
+
+//-------------------------------------------------
+// Return numerical value of a switch configuration
+// on/off, english, français, deutsch, español
+//-------------------------------------------------
+int config_switch(const char *str) {
+ if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
+ return 1;
+ if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
+ return 0;
+
+ return atoi(str);
+}
+
+
+//----------------------------------
+// Reading Lan Support configuration
+// Rewrote: Anvanced subnet check [LuzZza]
+//----------------------------------
+int login_lan_config_read(const char *lancfgName) {
+
+ FILE *fp;
+ int line_num = 0;
+ char line[1024], w1[64], w2[64], w3[64], w4[64];
+
+ if((fp = fopen(lancfgName, "r")) == NULL) {
+ ShowWarning("LAN Support configuration file is not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ ShowInfo("Reading the configuration file %s...\n", lancfgName);
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ line_num++;
+ if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
+ continue;
+
+ line[sizeof(line)-1] = '\0';
+ if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
+
+ ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
+ continue;
+ }
+
+ remove_control_chars((unsigned char *)w1);
+ remove_control_chars((unsigned char *)w2);
+ remove_control_chars((unsigned char *)w3);
+ remove_control_chars((unsigned char *)w4);
+
+ if(strcmpi(w1, "subnet") == 0) {
+
+ subnet[subnet_count].mask = inet_addr(w2);
+ subnet[subnet_count].char_ip = inet_addr(w3);
+ subnet[subnet_count].map_ip = inet_addr(w4);
+ subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
+ if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
+ ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
+ continue;
+ }
+
+ subnet_count++;
+ }
+
+ ShowStatus("Read information about %d subnetworks.\n", subnet_count);
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+//-----------------------------------------------------
+//BANNED IP CHECK.
+//-----------------------------------------------------
+int ip_ban_check(int tid, unsigned int tick, int id, int data){
+
+ //query
+ if(mysql_query(&mysql_handle, "DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()")) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()\n", __FILE__,__LINE__);
+ }
+
+ return 0;
+}
+
+//-----------------------------------------------------
+// reading configuration
+//-----------------------------------------------------
+int login_config_read(const char *cfgName){
+ int i;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp=fopen(cfgName,"r");
+
+ if(fp==NULL){
+ ShowError("Configuration file (%s) not found.\n", cfgName);
+ return 1;
+ }
+ ShowInfo("reading configuration file %s...\n", cfgName);
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+
+ remove_control_chars((unsigned char *) w1);
+ remove_control_chars((unsigned char *) w2);
+ if(strcmpi(w1,"timestamp_format") == 0) {
+ strncpy(timestamp_format, w2, 20);
+ } else if(strcmpi(w1,"stdout_with_ansisequence")==0){
+ stdout_with_ansisequence = config_switch(w2);
+ } else if(strcmpi(w1,"console_silent")==0){
+ msg_silent = 0; //To always allow the next line to show up.
+ ShowInfo("Console Silent Setting: %d\n", atoi(w2));
+ msg_silent = atoi(w2);
+ } else if (strcmpi(w1, "bind_ip") == 0) {
+ bind_ip = resolve_hostbyname(w2, NULL, bind_ip_str);
+ if (bind_ip)
+ ShowStatus("Login server binding IP address : %s -> %s\n", w2, bind_ip_str);
+ } else if(strcmpi(w1,"login_port")==0){
+ login_port=atoi(w2);
+ ShowStatus("set login_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"ipban")==0){
+ ipban=atoi(w2);
+ ShowStatus("set ipban : %d\n",ipban);
+ }
+ //account ban -> ip ban
+ else if(strcmpi(w1,"dynamic_account_ban")==0){
+ dynamic_account_ban=atoi(w2);
+ ShowStatus("set dynamic_account_ban : %d\n",dynamic_account_ban);
+ }
+ else if(strcmpi(w1,"dynamic_account_ban_class")==0){
+ dynamic_account_ban_class=atoi(w2);
+ ShowStatus("set dynamic_account_ban_class : %d\n",dynamic_account_ban_class);
+ }
+ //dynamic password error ban
+ else if(strcmpi(w1,"dynamic_pass_failure_ban")==0){
+ dynamic_pass_failure_ban=atoi(w2);
+ ShowStatus("set dynamic_pass_failure_ban : %d\n",dynamic_pass_failure_ban);
+ }
+ else if(strcmpi(w1,"dynamic_pass_failure_ban_time")==0){
+ dynamic_pass_failure_ban_time=atoi(w2);
+ ShowStatus("set dynamic_pass_failure_ban_time : %d\n",dynamic_pass_failure_ban_time);
+ }
+ else if(strcmpi(w1,"dynamic_pass_failure_ban_how_many")==0){
+ dynamic_pass_failure_ban_how_many=atoi(w2);
+ ShowStatus("set dynamic_pass_failure_ban_how_many : %d\n",dynamic_pass_failure_ban_how_many);
+ }
+ else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){
+ dynamic_pass_failure_ban_how_long=atoi(w2);
+ ShowStatus("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
+ } else if(strcmpi(w1, "new_account") == 0){ //Added by Sirius for new account _M/_F
+ new_account_flag = atoi(w2); //Added by Sirius for new account _M/_F
+ } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
+ //check_client_version = config_switch(w2); //Added by Sirius for client version check
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
+ check_client_version = 1;
+ } else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
+ check_client_version = 0;
+ }
+ } else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
+ client_version_to_connect = atoi(w2); //Added by SIrius for client version check
+ } else if(strcmpi(w1,"use_MD5_passwords")==0){
+ if (!strcmpi(w2,"yes")) {
+ use_md5_passwds=1;
+ } else if (!strcmpi(w2,"no")){
+ use_md5_passwds=0;
+ }
+ ShowStatus("Using MD5 Passwords: %s \n",w2);
+ }
+ else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
+ switch (atoi(w2)) {
+ case 0:
+ strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
+ break;
+ case 1:
+ strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
+ break;
+ case 2:
+ strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
+ break;
+ case 3:
+ strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
+ break;
+ }
+ }
+ else if (strcmpi(w1, "min_level_to_connect") == 0) {
+ min_level_to_connect = atoi(w2);
+ }
+ else if (strcmpi(w1, "check_ip_flag") == 0) {
+ check_ip_flag = config_switch(w2);
+ }
+ else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ }
+ else if (strcmpi(w1, "case_sensitive") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ case_sensitive = 1;
+ if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
+ case_sensitive = 0;
+ else
+ case_sensitive = atoi(w2);
+ } else if (strcmpi(w1, "allowed_regs") == 0) { //account flood protection system [Kevin]
+ allowed_regs = atoi(w2);
+ } else if (strcmpi(w1, "time_allowed") == 0) {
+ time_allowed = atoi(w2);
+ } else if (strcmpi(w1, "online_check") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ online_check = 1;
+ else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
+ online_check = 0;
+ else
+ online_check = atoi(w2);
+ } else if (strcmpi(w1, "log_login") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ log_login = 1;
+ else if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
+ log_login = 0;
+ else
+ log_login = atoi(w2);
+ } else if (strcmpi(w1, "import") == 0) {
+ login_config_read(w2);
+ } else if(strcmpi(w1,"use_dnsbl")==0) { // [Zido]
+ use_dnsbl=atoi(w2);
+ } else if(strcmpi(w1,"dnsbl_servers")==0) { // [Zido]
+ strcpy(dnsbl_servs,w2);
+ } else if(strcmpi(w1,"ip_sync_interval")==0) {
+ ip_sync_interval = 1000*60*atoi(w2); //w2 comes in minutes.
+ }
+ }
+ fclose(fp);
+ ShowInfo("done reading %s.\n", cfgName);
+ return 0;
+}
+
+void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
+ int i;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp=fopen(cfgName,"r");
+ if(fp==NULL){
+ ShowFatalError("file not found: %s\n",cfgName);
+ exit(1);
+ }
+ ShowInfo("reading configuration file %s...\n", cfgName);
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+ if(strcmpi(w1, "gm_read_method") == 0) {
+ if(atoi(w2) == 0)
+ login_gm_read = true;
+ else
+ login_gm_read = false;
+ } else if(strcmpi(w1, "gm_db") == 0) {
+ strcpy(gm_db, w2);
+ } else if (strcmpi(w1, "login_db") == 0) {
+ strcpy(login_db, w2);
+ }
+ //add for DB connection
+ else if(strcmpi(w1,"login_server_ip")==0){
+ strcpy(login_server_ip, w2);
+ ShowStatus ("set login_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_port")==0){
+ login_server_port=atoi(w2);
+ ShowStatus ("set login_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_id")==0){
+ strcpy(login_server_id, w2);
+ ShowStatus ("set login_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_pw")==0){
+ strcpy(login_server_pw, w2);
+ ShowStatus ("set login_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ ShowStatus ("set login_server_db : %s\n",w2);
+ }
+ else if(strcmpi(w1,"connection_ping_interval")==0) {
+ connection_ping_interval = atoi(w2);
+ }
+ else if(strcmpi(w1,"default_codepage")==0){
+ strcpy(default_codepage, w2);
+ ShowStatus ("set default_codepage : %s\n",w2);
+ }
+ //added for custom column names for custom login table
+ else if(strcmpi(w1,"login_db_account_id")==0){
+ strcpy(login_db_account_id, w2);
+ }
+ else if(strcmpi(w1,"login_db_userid")==0){
+ strcpy(login_db_userid, w2);
+ }
+ else if(strcmpi(w1,"login_db_user_pass")==0){
+ strcpy(login_db_user_pass, w2);
+ }
+ else if(strcmpi(w1,"login_db_level")==0){
+ strcpy(login_db_level, w2);
+ }
+ else if (strcmpi(w1, "loginlog_db") == 0) {
+ strcpy(loginlog_db, w2);
+ }
+ else if (strcmpi(w1, "reg_db") == 0) {
+ strcpy(reg_db, w2);
+ }
+ //support the import command, just like any other config
+ else if(strcmpi(w1,"import")==0){
+ sql_config_read(w2);
+ }
+ }
+ fclose(fp);
+ ShowInfo("done reading %s.\n", cfgName);
+}
+
+//--------------------------------------
+// Function called at exit of the server
+//--------------------------------------
+void do_final(void) {
+ //sync account when terminating.
+ //but no need when you using DBMS (mysql)
+ ShowStatus("Terminating...\n");
+ mmo_db_close();
+ online_db->destroy(online_db, NULL);
+ if (gm_account_db)
+ aFree(gm_account_db);
+}
+
+void set_server_type(void)
+{
+ SERVER_TYPE = ATHENA_SERVER_LOGIN;
+}
+int do_init(int argc,char **argv){
+ //initialize login server
+ int i;
+
+ //read login configue
+ login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME );
+ sql_config_read(SQL_CONF_NAME);
+ login_lan_config_read((argc > 2) ? argv[2] : LAN_CONF_NAME);
+ //Generate Passworded Key.
+ ShowInfo("Initializing md5key...\n");
+ memset(md5key, 0, sizeof(md5key));
+ md5keylen=rand()%4+12;
+ for(i=0;i<md5keylen;i++)
+ md5key[i]=rand()%255+1;
+ ShowInfo("md5key setup complete\n");
+
+
+ ShowInfo("set FIFO Size\n");
+ for(i=0;i<AUTH_FIFO_SIZE;i++)
+ auth_fifo[i].delflag=1;
+ ShowInfo("set FIFO Size complete\n");
+
+ ShowInfo("set max servers\n");
+ for(i=0;i<MAX_SERVERS;i++)
+ server_fd[i]=-1;
+ ShowInfo("set max servers complete\n");
+ //server port open & binding
+
+ // Online user database init
+ online_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int)); // reinitialise
+ add_timer_func_list(waiting_disconnect_timer, "waiting_disconnect_timer");
+
+ login_fd = make_listen_bind(bind_ip?bind_ip:INADDR_ANY,login_port);
+
+ //Auth start
+ ShowInfo("Running mmo_auth_sqldb_init()\n");
+ mmo_auth_sqldb_init();
+ ShowInfo("finished mmo_auth_sqldb_init()\n");
+
+ if(login_gm_read)
+ //Read account information.
+ read_gm_account();
+
+ //set default parser as parse_login function
+ set_defaultparse(parse_login);
+
+ // ban deleter timer - 1 minute term
+ ShowStatus("add interval tic (ip_ban_check)....\n");
+ add_timer_func_list(ip_ban_check,"ip_ban_check");
+ add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000);
+
+ add_timer_func_list(online_data_cleanup, "online_data_cleanup");
+ add_timer_interval(gettick() + 600*1000, online_data_cleanup, 0, 0, 600*1000); // every 10 minutes cleanup online account db.
+
+ if (ip_sync_interval) {
+ add_timer_func_list(sync_ip_addresses, "sync_ip_addresses");
+ add_timer_interval(gettick() + ip_sync_interval, sync_ip_addresses, 0, 0, ip_sync_interval);
+ }
+
+ if (console) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", login_port);
+
+ return 0;
+}
diff --git a/src/login_sql/login.h b/src/login_sql/login.h
index b215c7266..ca5844443 100644
--- a/src/login_sql/login.h
+++ b/src/login_sql/login.h
@@ -1,57 +1,57 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _LOGIN_H_
-#define _LOGIN_H_
-
-#define MAX_SERVERS 30
-
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define SQL_CONF_NAME "conf/inter_athena.conf"
-#define LAN_CONF_NAME "conf/subnet_athena.conf"
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-struct mmo_account {
- int version; //Added by sirius for versioncheck
- char userid[NAME_LENGTH];
- char passwd[NAME_LENGTH];
- int passwdenc;
-
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
- int level; // added [zzo]
-};
-
-struct mmo_char_server {
- char name[20];
- long ip;
- short port;
- int users;
- int maintenance;
- int new_;
-};
-
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _LOGIN_H_
+#define _LOGIN_H_
+
+#define MAX_SERVERS 30
+
+#define LOGIN_CONF_NAME "conf/login_athena.conf"
+#define SQL_CONF_NAME "conf/inter_athena.conf"
+#define LAN_CONF_NAME "conf/subnet_athena.conf"
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
+ // It is 1 at the time of passwordencrypt.
+ // It is made into 2 at the time of passwordencrypt2.
+ // When it is made 3, it corresponds to both.
+
+#define START_ACCOUNT_NUM 2000000
+#define END_ACCOUNT_NUM 100000000
+
+struct mmo_account {
+ int version; //Added by sirius for versioncheck
+ char userid[NAME_LENGTH];
+ char passwd[NAME_LENGTH];
+ int passwdenc;
+
+
+ long account_id;
+ long login_id1;
+ long login_id2;
+ long char_id;
+ char lastlogin[24];
+ int sex;
+ int level; // added [zzo]
+};
+
+struct mmo_char_server {
+ char name[20];
+ long ip;
+ short port;
+ int users;
+ int maintenance;
+ int new_;
+};
+
+
+#endif
diff --git a/src/login_sql/md5calc.c b/src/login_sql/md5calc.c
index 704a94fd4..09c59dd60 100644
--- a/src/login_sql/md5calc.c
+++ b/src/login_sql/md5calc.c
@@ -1,239 +1,239 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+/***********************************************************
+ * md5 calculation algorithm
+ *
+ * The source code referred to the following URL.
+ * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
+ *
+ ***********************************************************/
+
+#include "md5calc.h"
+#include <string.h>
+#include <stdio.h>
+
+#ifndef UINT_MAX
+#define UINT_MAX 4294967295U
+#endif
+
+// Global variable
+static unsigned int *pX;
+
+// Stirng Table
+static const unsigned int T[] = {
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
+ 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
+};
+
+// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+// The function used for other calculation
+static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Y) | (~X & Z);
+}
+static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return (X & Z) | (Y & ~Z);
+}
+static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return X ^ Y ^ Z;
+}
+static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
+{
+ return Y ^ (X | ~Z);
+}
+
+static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
+ unsigned int k, unsigned int s, unsigned int i)
+{
+ return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
+}
+
+static void Round1(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, F(b,c,d), k, s, i);
+}
+static void Round2(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, G(b,c,d), k, s, i);
+}
+static void Round3(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, H(b,c,d), k, s, i);
+}
+static void Round4(unsigned int *a, unsigned int b, unsigned int c,
+ unsigned int d,unsigned int k, unsigned int s, unsigned int i)
+{
+ *a = Round(*a, b, I(b,c,d), k, s, i);
+}
+
+static void MD5_Round_Calculate(const unsigned char *block,
+ unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
+{
+ //create X It is since it is required.
+ unsigned int X[16]; //512bit 64byte
+ int j,k;
+
+ //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
+ unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
+ unsigned int AA = A,BB = B,CC = C,DD = D;
+
+ //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
+ pX = X;
+
+ //Copy block(padding_message) i into X
+ for (j=0,k=0; j<64; j+=4,k++)
+ X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
+ | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
+ | ( ((unsigned int )block[j+2]) << 16 )
+ | ( ((unsigned int )block[j+3]) << 24 );
+
+
+ //Round 1
+ Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
+ Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
+ Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
+ Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
+
+ //Round 2
+ Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
+ Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
+ Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
+ Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
+
+ //Round 3
+ Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
+ Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
+ Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
+ Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
+
+ //Round 4
+ Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
+ Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
+ Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
+ Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
+
+ // Then perform the following additions. (let's add)
+ *A2 = A + AA;
+ *B2 = B + BB;
+ *C2 = C + CC;
+ *D2 = D + DD;
+
+ //The clearance of confidential information
+ memset(pX, 0, sizeof(X));
+}
+
+//-------------------------------------------------------------------
+// The function for the exteriors
+
+/** output is the coded binary in the character sequence which wants to code string. */
+void MD5_String2binary(const char * string, char * output)
+{
+//var
+ /*8bit*/
+ unsigned char padding_message[64]; //Extended message 512bit 64byte
+ unsigned char *pstring; //The position of string in the present scanning notes is held.
+
+// unsigned char digest[16];
+ /*32bit*/
+ unsigned int string_byte_len, //The byte chief of string is held.
+ string_bit_len, //The bit length of string is held.
+ copy_len, //The number of bytes which is used by 1-3 and which remained
+ msg_digest[4]; //Message digest 128bit 4byte
+ unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
+ *B = &msg_digest[1],
+ *C = &msg_digest[2],
+ *D = &msg_digest[3];
+ int i;
+
+//prog
+ //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
+ *A = 0x67452301;
+ *B = 0xefcdab89;
+ *C = 0x98badcfe;
+ *D = 0x10325476;
+
+ //Step 1.Append Padding Bits (extension of a mark bit)
+ //1-1
+ string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
+ pstring = (unsigned char *)string; //The position of the present character sequence is set.
+
+ //1-2 Repeat calculation until length becomes less than 64 bytes.
+ for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
+ MD5_Round_Calculate(pstring, A,B,C,D);
+
+ //1-3
+ copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
+ strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
+ memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
+ padding_message[copy_len] |= 0x80; //The next of a message is 1.
+
+ //1-4
+ //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
+ if (56 <= copy_len) {
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+ memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
+ }
+
+
+ //Step 2.Append Length (the information on length is added)
+ string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
+ memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
+
+ //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
+ if (UINT_MAX / 8 < string_byte_len) {
+ unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
+ memcpy(&padding_message[60], &high, 4);
+ } else
+ memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
+
+ //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
+ MD5_Round_Calculate(padding_message, A,B,C,D);
+
+
+ //Step 5.Output (output)
+ memcpy(output,msg_digest,16);
+// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
+/* sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);*/
+}
+
+/** output is the coded character sequence in the character sequence which wants to code string. */
+void MD5_String(const char * string, char * output)
+{
+ unsigned char digest[16];
+
+ MD5_String2binary(string,(char*)digest);
+ sprintf(output,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ digest[ 0], digest[ 1], digest[ 2], digest[ 3],
+ digest[ 4], digest[ 5], digest[ 6], digest[ 7],
+ digest[ 8], digest[ 9], digest[10], digest[11],
+ digest[12], digest[13], digest[14], digest[15]);
+}
+
diff --git a/src/login_sql/md5calc.h b/src/login_sql/md5calc.h
index b3735788c..505959c6a 100644
--- a/src/login_sql/md5calc.h
+++ b/src/login_sql/md5calc.h
@@ -1,10 +1,10 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _MD5CALC_H_
+#define _MD5CALC_H_
+
+void MD5_String(const char * string, char * output);
+void MD5_String2binary(const char * string, char * output);
+
+#endif
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
index aebe49965..f3be9b0a0 100644
--- a/src/map/atcommand.h
+++ b/src/map/atcommand.h
@@ -1,335 +1,335 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _ATCOMMAND_H_
-#define _ATCOMMAND_H_
-
-enum AtCommandType {
- AtCommand_None = -1,
- AtCommand_Broadcast = 0,
- AtCommand_LocalBroadcast,
- AtCommand_MapMove,
- AtCommand_ResetState,
- AtCommand_RuraP,
- AtCommand_Rura,
- AtCommand_Warp,
- AtCommand_Where,
- AtCommand_JumpTo,
- AtCommand_Jump,
- AtCommand_Who,
- AtCommand_Who2,
- AtCommand_Who3,
- AtCommand_WhoMap,
- AtCommand_WhoMap2,
- AtCommand_WhoMap3,
- AtCommand_WhoGM,
- AtCommand_Save,
- AtCommand_Load,
- AtCommand_Speed,
- AtCommand_CharSpeed,
- AtCommand_Storage,
- AtCommand_GuildStorage,
- AtCommand_Option,
- AtCommand_Hide,
- AtCommand_JobChange,
- AtCommand_JobChange2,
- AtCommand_JobChange3,
- AtCommand_Die,
- AtCommand_Kill,
- AtCommand_Alive,
- AtCommand_Kami,
- AtCommand_KamiB,
- AtCommand_KamiC, //LuzZza
- AtCommand_Heal,
- AtCommand_Item,
- AtCommand_Item2,
- AtCommand_ItemReset,
- AtCommand_BaseLevelUp,
- AtCommand_JobLevelUp,
- AtCommand_H,
- AtCommand_Help,
- AtCommand_H2,
- AtCommand_Help2,
- AtCommand_GM,
- AtCommand_PvPOff,
- AtCommand_PvPOn,
- AtCommand_GvGOff,
- AtCommand_GvGOn,
- AtCommand_Model,
- AtCommand_Go,
- AtCommand_Spawn,
- //AtCommand_Monster, // removed for Skots [Reddozen]
- AtCommand_MonsterSmall,
- AtCommand_MonsterBig,
- AtCommand_KillMonster,
- AtCommand_KillMonster2,
- AtCommand_Refine,
- AtCommand_Produce,
- AtCommand_Memo,
- AtCommand_GAT,
- AtCommand_Packet,
- AtCommand_WaterLevel,
- AtCommand_StatusPoint,
- AtCommand_SkillPoint,
- AtCommand_Zeny,
- AtCommand_Param,
- AtCommand_Strength,
- AtCommand_Agility,
- AtCommand_Vitality,
- AtCommand_Intelligence,
- AtCommand_Dexterity,
- AtCommand_Luck,
- AtCommand_GuildLevelUp,
- AtCommand_MakeEgg,
- AtCommand_PetFriendly,
- AtCommand_PetHungry,
- AtCommand_PetRename,
- AtCommand_Recall,
- AtCommand_Revive,
- AtCommand_CharacterStatsAll,
- AtCommand_CharacterLoad,
- AtCommand_Night,
- AtCommand_Day,
- AtCommand_Doom,
- AtCommand_DoomMap,
- AtCommand_Raise,
- AtCommand_RaiseMap,
- AtCommand_Kick,
- AtCommand_KickAll,
- AtCommand_AllSkill,
- AtCommand_QuestSkill,
- AtCommand_LostSkill,
- AtCommand_SpiritBall,
- AtCommand_Party,
- AtCommand_Guild,
- AtCommand_AgitStart,
- AtCommand_AgitEnd,
- AtCommand_MapExit,
- AtCommand_IDSearch,
- AtCommand_RecallAll,
- AtCommand_ReloadItemDB,
- AtCommand_ReloadMobDB,
- AtCommand_ReloadSkillDB,
- AtCommand_ReloadScript,
- AtCommand_ReloadGMDB,
- AtCommand_ReloadAtcommand,
- AtCommand_ReloadBattleConf,
- AtCommand_ReloadStatusDB,
- AtCommand_ReloadPcDB,
- AtCommand_ReloadMOTD, // [Valaris]
- AtCommand_MapInfo,
- AtCommand_Dye,
- AtCommand_Hstyle,
- AtCommand_Hcolor,
- AtCommand_StatAll,
- AtCommand_CharBlock, // by Yor
- AtCommand_CharBan, // by Yor
- AtCommand_CharUnBlock, // by Yor
- AtCommand_CharUnBan, // by Yor
- AtCommand_MountPeco, // by Valaris
- AtCommand_CharMountPeco, // by Yor
- AtCommand_GuildSpy, // [Syrus22]
- AtCommand_PartySpy, // [Syrus22]
- AtCommand_RepairAll, // [Valaris]
- AtCommand_GuildRecall, // by Yor
- AtCommand_PartyRecall, // by Yor
- AtCommand_Nuke, // [Valaris]
- AtCommand_Shownpc,
- AtCommand_Hidenpc,
- AtCommand_Loadnpc,
- AtCommand_Unloadnpc,
- AtCommand_ServerTime, // by Yor
- AtCommand_CharDelItem, // by Yor
- AtCommand_Jail, // by Yor
- AtCommand_UnJail, // by Yor
- AtCommand_JailFor, // Meruru
- AtCommand_JailTime, // Coltaro
- AtCommand_CharJailTime, // Coltaro
- AtCommand_Disguise, // [Valaris]
- AtCommand_UnDisguise, // by Yor
- AtCommand_CharDisguise, // Kalaspuff
- AtCommand_CharUnDisguise, // Kalaspuff
- AtCommand_EMail, // by Yor
- AtCommand_Hatch,
- AtCommand_Effect, // by Apple
- AtCommand_Char_Cart_List, // by Yor
- AtCommand_AddWarp, // by MouseJstr
- AtCommand_Follow, // by MouseJstr
- AtCommand_SkillOn, // by MouseJstr
- AtCommand_SkillOff, // by MouseJstr
- AtCommand_Killer, // by MouseJstr
- AtCommand_NpcMove, // by MouseJstr
- AtCommand_Killable, // by MouseJstr
- AtCommand_CharKillable, // by MouseJstr
- AtCommand_Dropall, // by MouseJstr
- AtCommand_Chardropall, // by MouseJstr
- AtCommand_Storeall, // by MouseJstr
- AtCommand_Charstoreall, // by MouseJstr
- AtCommand_Skillid, // by MouseJstr
- AtCommand_Useskill, // by MouseJstr
- AtCommand_Summon,
- AtCommand_Rain,
- AtCommand_Snow,
- AtCommand_Sakura,
- AtCommand_Clouds,
- AtCommand_Clouds2, // [Valaris]
- AtCommand_Fog,
- AtCommand_Fireworks,
- AtCommand_Leaves,
- AtCommand_AdjGmLvl, // MouseJstr
- AtCommand_AdjCmdLvl, // MouseJstr
- AtCommand_Trade, // MouseJstr
- AtCommand_Send,
- AtCommand_SetBattleFlag,
- AtCommand_UnMute,
- AtCommand_Clearweather, // by Dexity
- AtCommand_UpTime, // by MC Cameri
- AtCommand_ChangeSex, // by MC Cameri
- AtCommand_Mute, // [celest]
- AtCommand_WhoZeny, // [Valaris] <-- LOL...(MC Cameri) worth it.
- AtCommand_HappyHappyJoyJoy, // [Valaris]
- AtCommand_Refresh, // by MC Cameri
- AtCommand_PetId, // by MC Cameri
- AtCommand_Identify, // by MC Cameri
- AtCommand_Gmotd, // Added by MC Cameri, created by davidsiaw
- AtCommand_MiscEffect, // by MC Cameri
- AtCommand_MobSearch,
- AtCommand_CleanMap,
- AtCommand_NpcTalk,
- AtCommand_PetTalk,
- AtCommand_Users,
- // SQL-only commands start
-#ifndef TXT_ONLY
- AtCommand_CheckMail, // [Valaris]
- AtCommand_ListMail, // [Valaris]
- AtCommand_ListNewMail, // [Valaris]
- AtCommand_ReadMail, // [Valaris]
- AtCommand_SendMail, // [Valaris]
- AtCommand_DeleteMail, // [Valaris]
- AtCommand_SendPriorityMail, // [Valaris]
- AtCommand_RefreshOnline, // [Valaris]
- // SQL-only commands end
-#endif
- AtCommand_SkillTree, // by MouseJstr
- AtCommand_Marry, // by MouseJstr
- AtCommand_Divorce, // by MouseJstr
- AtCommand_Grind, // by MouseJstr
- AtCommand_Grind2, // by MouseJstr
-
- AtCommand_Me, //added by massdriller, code by lordalfa
-
- AtCommand_DMStart, // by MouseJstr
- AtCommand_DMTick, // by MouseJstr
-
- AtCommand_JumpToId, // by Dino9021
- AtCommand_JumpToId2, // by Dino9021
- AtCommand_RecallId, // by Dino9021
- AtCommand_RecallId2, // by Dino9021
- AtCommand_KickId, // by Dino9021
- AtCommand_KickId2, // by Dino9021
- AtCommand_ReviveId, // by Dino9021
- AtCommand_ReviveId2, // by Dino9021
- AtCommand_KillId, // by Dino9021
- AtCommand_KillId2, // by Dino9021
- AtCommand_CharKillableId, // by Dino9021
- AtCommand_CharKillableId2, // by Dino9021
- AtCommand_Sound,
- AtCommand_UndisguiseAll,
- AtCommand_DisguiseAll,
- AtCommand_ChangeLook,
- AtCommand_AutoLoot, //by Upa-Kun
- AtCommand_MobInfo, //by Lupus
- AtCommand_Exp, // by Skotlex
- AtCommand_Adopt, // by Veider
- AtCommand_Version, // by Ancyker
-
- AtCommand_MuteArea, // MouseJstr
- AtCommand_Shuffle, // MouseJstr
- AtCommand_Rates, // MouseJstr
-
- AtCommand_ItemInfo, // Lupus
- AtCommand_WhoDrops, // Skotlex
- AtCommand_MapFlag, // Lupus
- AtCommand_MonsterIgnore, // [Valaris]
- AtCommand_FakeName, // [Valaris]
- AtCommand_Size, // [Valaris]
- AtCommand_ShowDelay,
- AtCommand_ShowExp,
- AtCommand_ShowZeny,
- AtCommand_AutoTrade,//durf
- AtCommand_ChangeGM,//durf
- AtCommand_ChangeLeader,
- AtCommand_PartyOption,
-
- AtCommand_Invite, // By LuzZza
- AtCommand_Duel, // By LuzZza
- AtCommand_Leave, // By LuzZza
- AtCommand_Accept, // By LuzZza
- AtCommand_Reject, // By LuzZza
-
- AtCommand_Away, // LuzZza
- AtCommand_Main, // LuzZza
-
- AtCommand_Clone, // [Valaris]
- AtCommand_ToNPC, // LuzZza
- AtCommand_Commands, // [Skotlex]
- AtCommand_NoAsk, // [LuzZza]
- AtCommand_Request, // [Skotlex], supposedly taken from Freya (heard the command was there, but I haven't seen the code yet)
- AtCommand_HomLevel, //[orn]
- AtCommand_HomEvolution, //[orn]
- AtCommand_MakeHomun, //[orn]
- AtCommand_HomFriendly, //[orn]
- AtCommand_HomHungry, //[orn]
- AtCommand_HomTalk, //[orn]
- AtCommand_HomInfo, //[Toms]
- AtCommand_ShowMobs, //KarLaeda
- // end <- Ahem, guys, don't place AtCommands after AtCommand_Unknown! [Skotlex]
- AtCommand_Unknown,
- AtCommand_MAX
-};
-
-typedef enum AtCommandType AtCommandType;
-
-typedef struct AtCommandInfo {
- AtCommandType type;
- const char* command;
- int level;
- int (*proc)(const int, struct map_session_data*,
- const char* command, const char* message);
-} AtCommandInfo;
-
-AtCommandType
-is_atcommand(const int fd, struct map_session_data* sd, const char* message);
-AtCommandType
-atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
-
-AtCommandType atcommand(
- struct map_session_data *sd,
- const int level, const char* message, AtCommandInfo* info);
-int get_atcommand_level(const AtCommandType type);
-
-char * msg_txt(int msg_number); // [Yor]
-char * player_title_txt(int level); // [Lupus]
-
-void do_init_atcommand(void);
-void do_final_atcommand(void);
-
-int atcommand_item(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Valaris]
-int atcommand_rura(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Yor]
-int atcommand_jumpto(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
-int atcommand_recall(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
-int atcommand_monster(const int fd, struct map_session_data* sd, const char* command, const char* message);
-
-int atcommand_config_read(const char *cfgName);
-int msg_config_read(const char *cfgName);
-void do_final_msg(void);
-
-char *estr_lower(char *str);
-
-int e_mail_check(char *email);
-
-#define MAX_MSG 1000
-extern char *msg_table[MAX_MSG];
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _ATCOMMAND_H_
+#define _ATCOMMAND_H_
+
+enum AtCommandType {
+ AtCommand_None = -1,
+ AtCommand_Broadcast = 0,
+ AtCommand_LocalBroadcast,
+ AtCommand_MapMove,
+ AtCommand_ResetState,
+ AtCommand_RuraP,
+ AtCommand_Rura,
+ AtCommand_Warp,
+ AtCommand_Where,
+ AtCommand_JumpTo,
+ AtCommand_Jump,
+ AtCommand_Who,
+ AtCommand_Who2,
+ AtCommand_Who3,
+ AtCommand_WhoMap,
+ AtCommand_WhoMap2,
+ AtCommand_WhoMap3,
+ AtCommand_WhoGM,
+ AtCommand_Save,
+ AtCommand_Load,
+ AtCommand_Speed,
+ AtCommand_CharSpeed,
+ AtCommand_Storage,
+ AtCommand_GuildStorage,
+ AtCommand_Option,
+ AtCommand_Hide,
+ AtCommand_JobChange,
+ AtCommand_JobChange2,
+ AtCommand_JobChange3,
+ AtCommand_Die,
+ AtCommand_Kill,
+ AtCommand_Alive,
+ AtCommand_Kami,
+ AtCommand_KamiB,
+ AtCommand_KamiC, //LuzZza
+ AtCommand_Heal,
+ AtCommand_Item,
+ AtCommand_Item2,
+ AtCommand_ItemReset,
+ AtCommand_BaseLevelUp,
+ AtCommand_JobLevelUp,
+ AtCommand_H,
+ AtCommand_Help,
+ AtCommand_H2,
+ AtCommand_Help2,
+ AtCommand_GM,
+ AtCommand_PvPOff,
+ AtCommand_PvPOn,
+ AtCommand_GvGOff,
+ AtCommand_GvGOn,
+ AtCommand_Model,
+ AtCommand_Go,
+ AtCommand_Spawn,
+ //AtCommand_Monster, // removed for Skots [Reddozen]
+ AtCommand_MonsterSmall,
+ AtCommand_MonsterBig,
+ AtCommand_KillMonster,
+ AtCommand_KillMonster2,
+ AtCommand_Refine,
+ AtCommand_Produce,
+ AtCommand_Memo,
+ AtCommand_GAT,
+ AtCommand_Packet,
+ AtCommand_WaterLevel,
+ AtCommand_StatusPoint,
+ AtCommand_SkillPoint,
+ AtCommand_Zeny,
+ AtCommand_Param,
+ AtCommand_Strength,
+ AtCommand_Agility,
+ AtCommand_Vitality,
+ AtCommand_Intelligence,
+ AtCommand_Dexterity,
+ AtCommand_Luck,
+ AtCommand_GuildLevelUp,
+ AtCommand_MakeEgg,
+ AtCommand_PetFriendly,
+ AtCommand_PetHungry,
+ AtCommand_PetRename,
+ AtCommand_Recall,
+ AtCommand_Revive,
+ AtCommand_CharacterStatsAll,
+ AtCommand_CharacterLoad,
+ AtCommand_Night,
+ AtCommand_Day,
+ AtCommand_Doom,
+ AtCommand_DoomMap,
+ AtCommand_Raise,
+ AtCommand_RaiseMap,
+ AtCommand_Kick,
+ AtCommand_KickAll,
+ AtCommand_AllSkill,
+ AtCommand_QuestSkill,
+ AtCommand_LostSkill,
+ AtCommand_SpiritBall,
+ AtCommand_Party,
+ AtCommand_Guild,
+ AtCommand_AgitStart,
+ AtCommand_AgitEnd,
+ AtCommand_MapExit,
+ AtCommand_IDSearch,
+ AtCommand_RecallAll,
+ AtCommand_ReloadItemDB,
+ AtCommand_ReloadMobDB,
+ AtCommand_ReloadSkillDB,
+ AtCommand_ReloadScript,
+ AtCommand_ReloadGMDB,
+ AtCommand_ReloadAtcommand,
+ AtCommand_ReloadBattleConf,
+ AtCommand_ReloadStatusDB,
+ AtCommand_ReloadPcDB,
+ AtCommand_ReloadMOTD, // [Valaris]
+ AtCommand_MapInfo,
+ AtCommand_Dye,
+ AtCommand_Hstyle,
+ AtCommand_Hcolor,
+ AtCommand_StatAll,
+ AtCommand_CharBlock, // by Yor
+ AtCommand_CharBan, // by Yor
+ AtCommand_CharUnBlock, // by Yor
+ AtCommand_CharUnBan, // by Yor
+ AtCommand_MountPeco, // by Valaris
+ AtCommand_CharMountPeco, // by Yor
+ AtCommand_GuildSpy, // [Syrus22]
+ AtCommand_PartySpy, // [Syrus22]
+ AtCommand_RepairAll, // [Valaris]
+ AtCommand_GuildRecall, // by Yor
+ AtCommand_PartyRecall, // by Yor
+ AtCommand_Nuke, // [Valaris]
+ AtCommand_Shownpc,
+ AtCommand_Hidenpc,
+ AtCommand_Loadnpc,
+ AtCommand_Unloadnpc,
+ AtCommand_ServerTime, // by Yor
+ AtCommand_CharDelItem, // by Yor
+ AtCommand_Jail, // by Yor
+ AtCommand_UnJail, // by Yor
+ AtCommand_JailFor, // Meruru
+ AtCommand_JailTime, // Coltaro
+ AtCommand_CharJailTime, // Coltaro
+ AtCommand_Disguise, // [Valaris]
+ AtCommand_UnDisguise, // by Yor
+ AtCommand_CharDisguise, // Kalaspuff
+ AtCommand_CharUnDisguise, // Kalaspuff
+ AtCommand_EMail, // by Yor
+ AtCommand_Hatch,
+ AtCommand_Effect, // by Apple
+ AtCommand_Char_Cart_List, // by Yor
+ AtCommand_AddWarp, // by MouseJstr
+ AtCommand_Follow, // by MouseJstr
+ AtCommand_SkillOn, // by MouseJstr
+ AtCommand_SkillOff, // by MouseJstr
+ AtCommand_Killer, // by MouseJstr
+ AtCommand_NpcMove, // by MouseJstr
+ AtCommand_Killable, // by MouseJstr
+ AtCommand_CharKillable, // by MouseJstr
+ AtCommand_Dropall, // by MouseJstr
+ AtCommand_Chardropall, // by MouseJstr
+ AtCommand_Storeall, // by MouseJstr
+ AtCommand_Charstoreall, // by MouseJstr
+ AtCommand_Skillid, // by MouseJstr
+ AtCommand_Useskill, // by MouseJstr
+ AtCommand_Summon,
+ AtCommand_Rain,
+ AtCommand_Snow,
+ AtCommand_Sakura,
+ AtCommand_Clouds,
+ AtCommand_Clouds2, // [Valaris]
+ AtCommand_Fog,
+ AtCommand_Fireworks,
+ AtCommand_Leaves,
+ AtCommand_AdjGmLvl, // MouseJstr
+ AtCommand_AdjCmdLvl, // MouseJstr
+ AtCommand_Trade, // MouseJstr
+ AtCommand_Send,
+ AtCommand_SetBattleFlag,
+ AtCommand_UnMute,
+ AtCommand_Clearweather, // by Dexity
+ AtCommand_UpTime, // by MC Cameri
+ AtCommand_ChangeSex, // by MC Cameri
+ AtCommand_Mute, // [celest]
+ AtCommand_WhoZeny, // [Valaris] <-- LOL...(MC Cameri) worth it.
+ AtCommand_HappyHappyJoyJoy, // [Valaris]
+ AtCommand_Refresh, // by MC Cameri
+ AtCommand_PetId, // by MC Cameri
+ AtCommand_Identify, // by MC Cameri
+ AtCommand_Gmotd, // Added by MC Cameri, created by davidsiaw
+ AtCommand_MiscEffect, // by MC Cameri
+ AtCommand_MobSearch,
+ AtCommand_CleanMap,
+ AtCommand_NpcTalk,
+ AtCommand_PetTalk,
+ AtCommand_Users,
+ // SQL-only commands start
+#ifndef TXT_ONLY
+ AtCommand_CheckMail, // [Valaris]
+ AtCommand_ListMail, // [Valaris]
+ AtCommand_ListNewMail, // [Valaris]
+ AtCommand_ReadMail, // [Valaris]
+ AtCommand_SendMail, // [Valaris]
+ AtCommand_DeleteMail, // [Valaris]
+ AtCommand_SendPriorityMail, // [Valaris]
+ AtCommand_RefreshOnline, // [Valaris]
+ // SQL-only commands end
+#endif
+ AtCommand_SkillTree, // by MouseJstr
+ AtCommand_Marry, // by MouseJstr
+ AtCommand_Divorce, // by MouseJstr
+ AtCommand_Grind, // by MouseJstr
+ AtCommand_Grind2, // by MouseJstr
+
+ AtCommand_Me, //added by massdriller, code by lordalfa
+
+ AtCommand_DMStart, // by MouseJstr
+ AtCommand_DMTick, // by MouseJstr
+
+ AtCommand_JumpToId, // by Dino9021
+ AtCommand_JumpToId2, // by Dino9021
+ AtCommand_RecallId, // by Dino9021
+ AtCommand_RecallId2, // by Dino9021
+ AtCommand_KickId, // by Dino9021
+ AtCommand_KickId2, // by Dino9021
+ AtCommand_ReviveId, // by Dino9021
+ AtCommand_ReviveId2, // by Dino9021
+ AtCommand_KillId, // by Dino9021
+ AtCommand_KillId2, // by Dino9021
+ AtCommand_CharKillableId, // by Dino9021
+ AtCommand_CharKillableId2, // by Dino9021
+ AtCommand_Sound,
+ AtCommand_UndisguiseAll,
+ AtCommand_DisguiseAll,
+ AtCommand_ChangeLook,
+ AtCommand_AutoLoot, //by Upa-Kun
+ AtCommand_MobInfo, //by Lupus
+ AtCommand_Exp, // by Skotlex
+ AtCommand_Adopt, // by Veider
+ AtCommand_Version, // by Ancyker
+
+ AtCommand_MuteArea, // MouseJstr
+ AtCommand_Shuffle, // MouseJstr
+ AtCommand_Rates, // MouseJstr
+
+ AtCommand_ItemInfo, // Lupus
+ AtCommand_WhoDrops, // Skotlex
+ AtCommand_MapFlag, // Lupus
+ AtCommand_MonsterIgnore, // [Valaris]
+ AtCommand_FakeName, // [Valaris]
+ AtCommand_Size, // [Valaris]
+ AtCommand_ShowDelay,
+ AtCommand_ShowExp,
+ AtCommand_ShowZeny,
+ AtCommand_AutoTrade,//durf
+ AtCommand_ChangeGM,//durf
+ AtCommand_ChangeLeader,
+ AtCommand_PartyOption,
+
+ AtCommand_Invite, // By LuzZza
+ AtCommand_Duel, // By LuzZza
+ AtCommand_Leave, // By LuzZza
+ AtCommand_Accept, // By LuzZza
+ AtCommand_Reject, // By LuzZza
+
+ AtCommand_Away, // LuzZza
+ AtCommand_Main, // LuzZza
+
+ AtCommand_Clone, // [Valaris]
+ AtCommand_ToNPC, // LuzZza
+ AtCommand_Commands, // [Skotlex]
+ AtCommand_NoAsk, // [LuzZza]
+ AtCommand_Request, // [Skotlex], supposedly taken from Freya (heard the command was there, but I haven't seen the code yet)
+ AtCommand_HomLevel, //[orn]
+ AtCommand_HomEvolution, //[orn]
+ AtCommand_MakeHomun, //[orn]
+ AtCommand_HomFriendly, //[orn]
+ AtCommand_HomHungry, //[orn]
+ AtCommand_HomTalk, //[orn]
+ AtCommand_HomInfo, //[Toms]
+ AtCommand_ShowMobs, //KarLaeda
+ // end <- Ahem, guys, don't place AtCommands after AtCommand_Unknown! [Skotlex]
+ AtCommand_Unknown,
+ AtCommand_MAX
+};
+
+typedef enum AtCommandType AtCommandType;
+
+typedef struct AtCommandInfo {
+ AtCommandType type;
+ const char* command;
+ int level;
+ int (*proc)(const int, struct map_session_data*,
+ const char* command, const char* message);
+} AtCommandInfo;
+
+AtCommandType
+is_atcommand(const int fd, struct map_session_data* sd, const char* message);
+AtCommandType
+atcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
+
+AtCommandType atcommand(
+ struct map_session_data *sd,
+ const int level, const char* message, AtCommandInfo* info);
+int get_atcommand_level(const AtCommandType type);
+
+char * msg_txt(int msg_number); // [Yor]
+char * player_title_txt(int level); // [Lupus]
+
+void do_init_atcommand(void);
+void do_final_atcommand(void);
+
+int atcommand_item(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Valaris]
+int atcommand_rura(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Yor]
+int atcommand_jumpto(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
+int atcommand_recall(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
+int atcommand_monster(const int fd, struct map_session_data* sd, const char* command, const char* message);
+
+int atcommand_config_read(const char *cfgName);
+int msg_config_read(const char *cfgName);
+void do_final_msg(void);
+
+char *estr_lower(char *str);
+
+int e_mail_check(char *email);
+
+#define MAX_MSG 1000
+extern char *msg_table[MAX_MSG];
+
+#endif
+
diff --git a/src/map/battle.h b/src/map/battle.h
index 709cc3c78..94ced24f7 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -1,455 +1,455 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _BATTLE_H_
-#define _BATTLE_H_
-
-// ƒ_ƒ[ƒW
-struct Damage {
- int damage,damage2;
- int type,div_;
- int amotion,dmotion;
- int blewcount;
- int flag;
- int dmg_lv; //ATK_LUCKY,ATK_FLEE,ATK_DEF
-};
-
-// ‘®«•\i“Ç‚Ýž‚Ý‚Ípc.cAbattle_attr_fix‚ÅŽg—pj
-extern int attr_fix_table[4][10][10];
-
-struct map_session_data;
-struct mob_data;
-struct block_list;
-
-// ƒ_ƒ[ƒWŒvŽZ
-
-struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-
-int battle_calc_return_damage(struct block_list *bl, int skill, int *damage, int flag);
-
-void battle_drain(struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss);
-
-int battle_attr_fix(struct block_list *src, struct block_list *target, int damage,int atk_elem,int def_type, int def_lv);
-
-// ƒ_ƒ[ƒWÅIŒvŽZ
-int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag);
-int battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag);
-
-enum { // ÅIŒvŽZ‚̃tƒ‰ƒO
- BF_WEAPON = 0x0001,
- BF_MAGIC = 0x0002,
- BF_MISC = 0x0004,
- BF_SHORT = 0x0010,
- BF_LONG = 0x0040,
- BF_SKILL = 0x0100,
- BF_NORMAL = 0x0200,
- BF_WEAPONMASK=0x000f,
- BF_RANGEMASK= 0x00f0,
- BF_SKILLMASK= 0x0f00,
-};
-
-int battle_delay_damage (unsigned int tick, struct block_list *src, struct block_list *target, int attack_type, int skill_id, int skill_lv, int damage, int dmg_lv, int ddelay);
-
-// ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
-int battle_weapon_attack( struct block_list *bl,struct block_list *target,
- unsigned int tick,int flag);
-
-// ŠeŽíƒpƒ‰ƒ[ƒ^‚𓾂é
-struct block_list* battle_get_master(struct block_list *src);
-struct block_list* battle_gettargeted(struct block_list *target);
-int battle_gettarget(struct block_list *bl);
-int battle_getcurrentskill(struct block_list *bl);
-
-//New definitions [Skotlex]
-#define BCT_ENEMY 0x020000
-//This should be (~BCT_ENEMY&BCT_ALL)
-#define BCT_NOENEMY 0x1d0000
-#define BCT_PARTY 0x040000
-//This should be (~BCT_PARTY&BCT_ALL)
-#define BCT_NOPARTY 0x1b0000
-#define BCT_GUILD 0x080000
-//This should be (~BCT_GUILD&BCT_ALL)
-#define BCT_NOGUILD 0x170000
-#define BCT_ALL 0x1f0000
-#define BCT_NOONE 0x000000
-#define BCT_SELF 0x010000
-#define BCT_NEUTRAL 0x100000
-
-#define is_boss(bl) (status_get_mode(bl)&MD_BOSS) // Can refine later [Aru]
-
-int battle_check_undead(int race,int element);
-int battle_check_target(struct block_list *src, struct block_list *target,int flag);
-int battle_check_range(struct block_list *src,struct block_list *bl,int range);
-
-void battle_consume_ammo(struct map_session_data* sd, int skill, int lv);
-// Ý’è
-
-int battle_config_switch(const char *str); // [Valaris]
-
-extern struct Battle_Config {
- unsigned short warp_point_debug;
- unsigned short enable_critical;
- unsigned short mob_critical_rate;
- unsigned short critical_rate;
- unsigned short enable_baseatk;
- unsigned short enable_perfect_flee;
- unsigned short cast_rate,delay_rate,delay_dependon_agi;
- unsigned short sdelay_attack_enable;
- unsigned short left_cardfix_to_right;
- unsigned short skill_add_range;
- unsigned short skill_out_range_consume;
- unsigned short skillrange_by_distance; //[Skotlex]
- unsigned short use_weapon_skill_range; //[Skotlex]
- unsigned short pc_damage_delay_rate;
- unsigned short defnotenemy;
- unsigned short vs_traps_bctall;
- unsigned short traps_setting;
- unsigned short summon_flora; //[Skotlex]
- unsigned short clear_unit_ondeath; //[Skotlex]
- unsigned short clear_unit_onwarp; //[Skotlex]
- unsigned short random_monster_checklv;
- unsigned short attr_recover;
- unsigned short flooritem_lifetime;
- unsigned short item_auto_get;
- int item_first_get_time;
- int item_second_get_time;
- int item_third_get_time;
- int mvp_item_first_get_time;
- int mvp_item_second_get_time;
- int mvp_item_third_get_time;
- int base_exp_rate,job_exp_rate;
- unsigned short drop_rate0item;
- unsigned short death_penalty_type;
- unsigned short death_penalty_base,death_penalty_job;
- unsigned short pvp_exp; // [MouseJstr]
- unsigned short gtb_sc_immunity;
- int zeny_penalty;
- unsigned short restart_hp_rate;
- unsigned short restart_sp_rate;
- int mvp_exp_rate;
- unsigned short mvp_hp_rate;
- unsigned short monster_hp_rate;
- unsigned short monster_max_aspd;
- unsigned short view_range_rate;
- unsigned short chase_range_rate;
- unsigned short atc_gmonly;
- unsigned short atc_spawn_quantity_limit;
- unsigned short atc_slave_clone_limit;
- unsigned short partial_name_scan;
- unsigned short gm_allskill;
- unsigned short gm_allequip;
- unsigned short gm_skilluncond;
- unsigned short gm_join_chat;
- unsigned short gm_kick_chat;
- unsigned short skillfree;
- unsigned short skillup_limit;
- unsigned short wp_rate;
- unsigned short pp_rate;
- unsigned short monster_active_enable;
- unsigned short monster_damage_delay_rate;
- unsigned short monster_loot_type;
- unsigned short mob_skill_rate; //[Skotlex]
- unsigned short mob_skill_delay; //[Skotlex]
- unsigned short mob_count_rate;
- unsigned short no_spawn_on_player; //[Skotlex]
- unsigned short force_random_spawn; //[Skotlex]
- unsigned short mob_spawn_delay, plant_spawn_delay, boss_spawn_delay; // [Skotlex]
- unsigned short slaves_inherit_mode;
- unsigned short slaves_inherit_speed;
- unsigned short summons_trigger_autospells;
- unsigned short pc_walk_delay_rate; //Adjusts can't walk delay after being hit for players. [Skotlex]
- unsigned short walk_delay_rate; //Adjusts can't walk delay after being hit. [Skotlex]
- unsigned short multihit_delay; //Adjusts can't walk delay per hit on multi-hitting skills. [Skotlex]
- unsigned short quest_skill_learn;
- unsigned short quest_skill_reset;
- unsigned short basic_skill_check;
- unsigned short guild_emperium_check;
- unsigned short guild_exp_limit;
- unsigned short guild_max_castles;
- unsigned short emergency_call;
- unsigned short guild_aura;
- unsigned short pc_invincible_time;
- unsigned short pet_catch_rate;
- unsigned short pet_rename;
- unsigned short pet_friendly_rate;
- unsigned short pet_hungry_delay_rate;
- unsigned short pet_hungry_friendly_decrease;
- unsigned short pet_status_support;
- unsigned short pet_attack_support;
- unsigned short pet_damage_support;
- unsigned short pet_support_min_friendly; //[Skotlex]
- unsigned short pet_support_rate;
- unsigned short pet_attack_exp_to_master;
- unsigned short pet_attack_exp_rate;
- unsigned short pet_lv_rate; //[Skotlex]
- unsigned short pet_max_stats; //[Skotlex]
- unsigned short pet_max_atk1; //[Skotlex]
- unsigned short pet_max_atk2; //[Skotlex]
- unsigned short pet_no_gvg; //Disables pets in gvg. [Skotlex]
- unsigned short skill_min_damage;
- unsigned short finger_offensive_type;
- unsigned short heal_exp;
- unsigned short max_heal_lv;
- int max_heal; //Mitternacht
- unsigned short resurrection_exp;
- unsigned short shop_exp;
- unsigned short combo_delay_rate;
- unsigned short item_check;
- unsigned short item_use_interval; //[Skotlex]
- unsigned short wedding_modifydisplay;
- unsigned short wedding_ignorepalette; //[Skotlex]
- unsigned short xmas_ignorepalette; // [Valaris]
- int natural_healhp_interval;
- int natural_healsp_interval;
- int natural_heal_skill_interval;
- unsigned short natural_heal_weight_rate;
- unsigned short item_name_override_grffile;
- unsigned short indoors_override_grffile; // [Celest]
- unsigned short skill_sp_override_grffile; // [Celest]
- unsigned short cardillust_read_grffile;
- unsigned short item_equip_override_grffile;
- unsigned short item_slots_override_grffile;
- unsigned short arrow_decrement;
- unsigned short max_aspd;
- unsigned short max_walk_speed; //Maximum walking speed after buffs [Skotlex]
- int max_hp;
- int max_sp;
- unsigned short max_lv, aura_lv;
- unsigned short max_parameter, max_baby_parameter;
- int max_cart_weight;
- unsigned short skill_log;
- unsigned short battle_log;
- unsigned short save_log;
- unsigned short error_log;
- unsigned short etc_log;
- unsigned short save_clothcolor;
- unsigned short undead_detect_type;
- unsigned short auto_counter_type;
- unsigned short min_hitrate; //[Skotlex]
- unsigned short max_hitrate; //[Skotlex]
- unsigned short agi_penalty_target;
- unsigned short agi_penalty_type;
- unsigned short agi_penalty_count;
- unsigned short agi_penalty_num;
- unsigned short vit_penalty_target;
- unsigned short vit_penalty_type;
- unsigned short vit_penalty_count;
- unsigned short vit_penalty_num;
- unsigned short weapon_defense_type;
- unsigned short magic_defense_type;
- unsigned short skill_reiteration;
- unsigned short skill_nofootset;
- unsigned short pc_cloak_check_type;
- unsigned short monster_cloak_check_type;
- unsigned short estimation_type;
- unsigned short gvg_short_damage_rate;
- unsigned short gvg_long_damage_rate;
- unsigned short gvg_weapon_damage_rate;
- unsigned short gvg_magic_damage_rate;
- unsigned short gvg_misc_damage_rate;
- unsigned short gvg_flee_penalty;
- int gvg_eliminate_time;
- unsigned short pk_short_damage_rate;
- unsigned short pk_long_damage_rate;
- unsigned short pk_weapon_damage_rate;
- unsigned short pk_magic_damage_rate;
- unsigned short pk_misc_damage_rate;
- unsigned short mob_changetarget_byskill;
- unsigned short attack_direction_change;
- unsigned short land_skill_limit;
- unsigned short party_skill_penalty;
- unsigned short monster_class_change_full_recover;
- unsigned short produce_item_name_input;
- unsigned short produce_potion_name_input;
- unsigned short making_arrow_name_input;
- unsigned short holywater_name_input;
- unsigned short cdp_name_input;
- unsigned short display_skill_fail;
- unsigned short chat_warpportal;
- unsigned short mob_warp;
- unsigned short dead_branch_active;
- unsigned int vending_max_value;
- unsigned short show_steal_in_same_party;
- unsigned short party_share_type;
- unsigned short party_hp_mode;
- unsigned short party_show_share_picker;
- unsigned short attack_attr_none;
- int item_rate_mvp, item_rate_common, item_rate_common_boss, item_rate_card, item_rate_card_boss, // added support for MVP drops [Reddozen]
- item_rate_equip, item_rate_equip_boss, item_rate_heal, item_rate_heal_boss, item_rate_use,
- item_rate_use_boss, item_rate_treasure, // Added by RoVeRT, Additional Heal and Usable item rate by Val
- item_rate_adddrop;
-
- unsigned short logarithmic_drops;
- unsigned short item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
- unsigned short item_drop_card_min,item_drop_card_max;
- unsigned short item_drop_equip_min,item_drop_equip_max;
- unsigned short item_drop_mvp_min,item_drop_mvp_max; // End Addition
- unsigned short item_drop_heal_min,item_drop_heal_max; // Added by Valatris
- unsigned short item_drop_use_min,item_drop_use_max; //End
- unsigned short item_drop_treasure_min,item_drop_treasure_max; //by [Skotlex]
- unsigned short item_drop_adddrop_min,item_drop_adddrop_max; //[Skotlex]
- unsigned short prevent_logout; // Added by RoVeRT
-
- unsigned short alchemist_summon_reward; // [Valaris]
- unsigned short drops_by_luk;
- unsigned short drops_by_luk2;
- unsigned short equip_natural_break_rate; //Base Natural break rate for attacks.
- unsigned short equip_self_break_rate; //Natural & Penalty skills break rate
- unsigned short equip_skill_break_rate; //Offensive skills break rate
- unsigned short pet_equip_required;
- unsigned short multi_level_up;
- unsigned short max_exp_gain_rate; //Max amount of exp bar % you can get in one go.
- unsigned short pk_mode;
- unsigned short pk_level_range;
-
- unsigned short manner_system; // end additions [Valaris]
- unsigned short show_mob_info;
-
- unsigned short agi_penalty_count_lv;
- unsigned short vit_penalty_count_lv;
-
- unsigned short gx_allhit;
- unsigned short gx_disptype;
- unsigned short devotion_level_difference;
- unsigned short player_skill_partner_check;
- unsigned short hide_GM_session;
- unsigned short invite_request_check;
- unsigned short skill_removetrap_type;
- unsigned short disp_experience;
- unsigned short disp_zeny;
- unsigned short castle_defense_rate;
- unsigned short backstab_bow_penalty;
- unsigned short hp_rate;
- unsigned short sp_rate;
- unsigned short gm_cant_drop_min_lv;
- unsigned short gm_cant_drop_max_lv;
- unsigned short disp_hpmeter;
- unsigned short bone_drop;
- unsigned short buyer_name;
-
-// eAthena additions
- unsigned short night_at_start; // added by [Yor]
- int day_duration; // added by [Yor]
- int night_duration; // added by [Yor]
- short ban_hack_trade; // added by [Yor]
- unsigned short hack_info_GM_level; // added by [Yor]
- unsigned short any_warp_GM_min_level; // added by [Yor]
- unsigned short packet_ver_flag; // added by [Yor]
-
- unsigned short min_hair_style; // added by [MouseJstr]
- unsigned short max_hair_style; // added by [MouseJstr]
- unsigned short min_hair_color; // added by [MouseJstr]
- unsigned short max_hair_color; // added by [MouseJstr]
- unsigned short min_cloth_color; // added by [MouseJstr]
- unsigned short max_cloth_color; // added by [MouseJstr]
- unsigned short pet_hair_style; // added by [Skotlex]
-
- unsigned short castrate_dex_scale; // added by [MouseJstr]
- unsigned short area_size; // added by [MouseJstr]
-
- unsigned short max_def, over_def_bonus; //added by [Skotlex]
-
- unsigned short zeny_from_mobs; // [Valaris]
- unsigned short mobs_level_up; // [Valaris]
- unsigned short mobs_level_up_exp_rate; // [Valaris]
- unsigned short pk_min_level; // [celest]
- unsigned short skill_steal_type; // [celest]
- unsigned short skill_steal_rate; // [celest]
- unsigned short skill_steal_max_tries; //max steal skill tries on a mob. if 0, then w/o limit [Lupus]
- unsigned short motd_type; // [celest]
- unsigned short finding_ore_rate; // orn
- unsigned short exp_calc_type;
- unsigned short exp_bonus_attacker;
- unsigned short exp_bonus_max_attacker;
- unsigned short min_skill_delay_limit;
- unsigned short default_skill_delay;
- unsigned short no_skill_delay;
- unsigned short attack_walk_delay;
- unsigned short require_glory_guild;
- unsigned short idle_no_share;
- unsigned short party_update_interval;
- unsigned short party_even_share_bonus;
- unsigned short delay_battle_damage;
- unsigned short hide_woe_damage;
- unsigned short display_version;
- unsigned short who_display_aid;
-
- unsigned short display_hallucination; // [Skotlex]
- unsigned short use_statpoint_table; // [Skotlex]
-
- unsigned short ignore_items_gender; //[Lupus]
-
- unsigned short copyskill_restrict; // [Aru]
- unsigned short berserk_cancels_buffs; // [Aru]
- unsigned short debuff_on_logout; // Removes a few "official" negative Scs on logout. [Skotlex]
- unsigned short mob_ai; //Configures various mob_ai settings to make them smarter or dumber(official). [Skotlex]
- unsigned short dynamic_mobs; // Dynamic Mobs [Wizputer] - battle_athena flag implemented by [random]
- unsigned short mob_remove_damaged; // Dynamic Mobs - Remove mobs even if damaged [Wizputer]
- int mob_remove_delay; // Dynamic Mobs - delay before removing mobs from a map [Skotlex]
-
- unsigned short show_hp_sp_drain, show_hp_sp_gain; //[Skotlex]
-
- unsigned short mob_npc_event_type; //Determines on who the npc_event is executed. [Skotlex]
- unsigned short mob_clear_delay; // [Valaris]
-
- unsigned short character_size; // if riders have size=2, and baby class riders size=1 [Lupus]
- unsigned short mob_max_skilllvl; // Max possible skill level [Lupus]
- unsigned short rare_drop_announce; // chance <= to show rare drops global announces
-
- unsigned short retaliate_to_master; //Whether when a mob is attacked by another mob, it will retaliate versus the mob or the mob's master. [Skotlex]
- unsigned short firewall_hits_on_undead; //Number of hits firewall does at a time on undead. [Skotlex]
-
- unsigned short title_lvl1; // Players titles [Lupus]
- unsigned short title_lvl2; // Players titles [Lupus]
- unsigned short title_lvl3; // Players titles [Lupus]
- unsigned short title_lvl4; // Players titles [Lupus]
- unsigned short title_lvl5; // Players titles [Lupus]
- unsigned short title_lvl6; // Players titles [Lupus]
- unsigned short title_lvl7; // Players titles [Lupus]
- unsigned short title_lvl8; // Players titles [Lupus]
-
- unsigned short duel_enable; // [LuzZza]
- unsigned short duel_allow_pvp; // [LuzZza]
- unsigned short duel_allow_gvg; // [LuzZza]
- unsigned short duel_allow_teleport; // [LuzZza]
- unsigned short duel_autoleave_when_die; // [LuzZza]
- unsigned short duel_time_interval; // [LuzZza]
- unsigned short duel_only_on_same_map; // [Toms]
-
- unsigned short skip_teleport_lv1_menu; // possibility to disable (skip) Teleport Lv1 menu, that have only two lines `Random` and `Cancel` [LuzZza]
-
- unsigned short allow_skill_without_day; // [Komurka]
- unsigned short allow_es_magic_pc; // [Skotlex]
- unsigned short skill_wall_check; // [Skotlex]
- unsigned short cell_stack_limit; // [Skotlex]
- unsigned short skill_caster_check; // [Skotlex]
- unsigned short sc_castcancel; // [Skotlex]
- unsigned short pc_sc_def_rate; // [Skotlex]
- unsigned short mob_sc_def_rate;
- unsigned short pc_luk_sc_def;
- unsigned short mob_luk_sc_def;
- unsigned short pc_max_sc_def;
- unsigned short mob_max_sc_def;
-
- unsigned short sg_angel_skill_ratio;
- unsigned short sg_miracle_skill_ratio;
- int sg_miracle_skill_duration_min;
- int sg_miracle_skill_duration_max;
- unsigned short autospell_stacking; //Enables autospell cards to stack. [Skotlex]
- unsigned short override_mob_names; //Enables overriding spawn mob names with the mob_db names. [Skotlex]
- unsigned short min_chat_delay; //Minimum time between client messages. [Skotlex]
- unsigned short friend_auto_add; //When accepting friends, both get friended. [Skotlex]
- unsigned int hvan_explosion_intimate ; // fix [albator]
- unsigned short homunculus_show_growth ; //[orn]
- unsigned short homunculus_friendly_rate;
-} battle_config;
-
-void do_init_battle(void);
-void do_final_battle(void);
-extern int battle_config_read(const char *cfgName);
-extern void battle_validate_conf(void);
-extern void battle_set_defaults(void);
-extern int battle_set_value(char *, char *);
-int battle_get_value(char *);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _BATTLE_H_
+#define _BATTLE_H_
+
+// ƒ_ƒ[ƒW
+struct Damage {
+ int damage,damage2;
+ int type,div_;
+ int amotion,dmotion;
+ int blewcount;
+ int flag;
+ int dmg_lv; //ATK_LUCKY,ATK_FLEE,ATK_DEF
+};
+
+// ‘®«•\i“Ç‚Ýž‚Ý‚Ípc.cAbattle_attr_fix‚ÅŽg—pj
+extern int attr_fix_table[4][10][10];
+
+struct map_session_data;
+struct mob_data;
+struct block_list;
+
+// ƒ_ƒ[ƒWŒvŽZ
+
+struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
+
+int battle_calc_return_damage(struct block_list *bl, int skill, int *damage, int flag);
+
+void battle_drain(struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss);
+
+int battle_attr_fix(struct block_list *src, struct block_list *target, int damage,int atk_elem,int def_type, int def_lv);
+
+// ƒ_ƒ[ƒWÅIŒvŽZ
+int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag);
+int battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag);
+
+enum { // ÅIŒvŽZ‚̃tƒ‰ƒO
+ BF_WEAPON = 0x0001,
+ BF_MAGIC = 0x0002,
+ BF_MISC = 0x0004,
+ BF_SHORT = 0x0010,
+ BF_LONG = 0x0040,
+ BF_SKILL = 0x0100,
+ BF_NORMAL = 0x0200,
+ BF_WEAPONMASK=0x000f,
+ BF_RANGEMASK= 0x00f0,
+ BF_SKILLMASK= 0x0f00,
+};
+
+int battle_delay_damage (unsigned int tick, struct block_list *src, struct block_list *target, int attack_type, int skill_id, int skill_lv, int damage, int dmg_lv, int ddelay);
+
+// ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
+int battle_weapon_attack( struct block_list *bl,struct block_list *target,
+ unsigned int tick,int flag);
+
+// ŠeŽíƒpƒ‰ƒ[ƒ^‚𓾂é
+struct block_list* battle_get_master(struct block_list *src);
+struct block_list* battle_gettargeted(struct block_list *target);
+int battle_gettarget(struct block_list *bl);
+int battle_getcurrentskill(struct block_list *bl);
+
+//New definitions [Skotlex]
+#define BCT_ENEMY 0x020000
+//This should be (~BCT_ENEMY&BCT_ALL)
+#define BCT_NOENEMY 0x1d0000
+#define BCT_PARTY 0x040000
+//This should be (~BCT_PARTY&BCT_ALL)
+#define BCT_NOPARTY 0x1b0000
+#define BCT_GUILD 0x080000
+//This should be (~BCT_GUILD&BCT_ALL)
+#define BCT_NOGUILD 0x170000
+#define BCT_ALL 0x1f0000
+#define BCT_NOONE 0x000000
+#define BCT_SELF 0x010000
+#define BCT_NEUTRAL 0x100000
+
+#define is_boss(bl) (status_get_mode(bl)&MD_BOSS) // Can refine later [Aru]
+
+int battle_check_undead(int race,int element);
+int battle_check_target(struct block_list *src, struct block_list *target,int flag);
+int battle_check_range(struct block_list *src,struct block_list *bl,int range);
+
+void battle_consume_ammo(struct map_session_data* sd, int skill, int lv);
+// Ý’è
+
+int battle_config_switch(const char *str); // [Valaris]
+
+extern struct Battle_Config {
+ unsigned short warp_point_debug;
+ unsigned short enable_critical;
+ unsigned short mob_critical_rate;
+ unsigned short critical_rate;
+ unsigned short enable_baseatk;
+ unsigned short enable_perfect_flee;
+ unsigned short cast_rate,delay_rate,delay_dependon_agi;
+ unsigned short sdelay_attack_enable;
+ unsigned short left_cardfix_to_right;
+ unsigned short skill_add_range;
+ unsigned short skill_out_range_consume;
+ unsigned short skillrange_by_distance; //[Skotlex]
+ unsigned short use_weapon_skill_range; //[Skotlex]
+ unsigned short pc_damage_delay_rate;
+ unsigned short defnotenemy;
+ unsigned short vs_traps_bctall;
+ unsigned short traps_setting;
+ unsigned short summon_flora; //[Skotlex]
+ unsigned short clear_unit_ondeath; //[Skotlex]
+ unsigned short clear_unit_onwarp; //[Skotlex]
+ unsigned short random_monster_checklv;
+ unsigned short attr_recover;
+ unsigned short flooritem_lifetime;
+ unsigned short item_auto_get;
+ int item_first_get_time;
+ int item_second_get_time;
+ int item_third_get_time;
+ int mvp_item_first_get_time;
+ int mvp_item_second_get_time;
+ int mvp_item_third_get_time;
+ int base_exp_rate,job_exp_rate;
+ unsigned short drop_rate0item;
+ unsigned short death_penalty_type;
+ unsigned short death_penalty_base,death_penalty_job;
+ unsigned short pvp_exp; // [MouseJstr]
+ unsigned short gtb_sc_immunity;
+ int zeny_penalty;
+ unsigned short restart_hp_rate;
+ unsigned short restart_sp_rate;
+ int mvp_exp_rate;
+ unsigned short mvp_hp_rate;
+ unsigned short monster_hp_rate;
+ unsigned short monster_max_aspd;
+ unsigned short view_range_rate;
+ unsigned short chase_range_rate;
+ unsigned short atc_gmonly;
+ unsigned short atc_spawn_quantity_limit;
+ unsigned short atc_slave_clone_limit;
+ unsigned short partial_name_scan;
+ unsigned short gm_allskill;
+ unsigned short gm_allequip;
+ unsigned short gm_skilluncond;
+ unsigned short gm_join_chat;
+ unsigned short gm_kick_chat;
+ unsigned short skillfree;
+ unsigned short skillup_limit;
+ unsigned short wp_rate;
+ unsigned short pp_rate;
+ unsigned short monster_active_enable;
+ unsigned short monster_damage_delay_rate;
+ unsigned short monster_loot_type;
+ unsigned short mob_skill_rate; //[Skotlex]
+ unsigned short mob_skill_delay; //[Skotlex]
+ unsigned short mob_count_rate;
+ unsigned short no_spawn_on_player; //[Skotlex]
+ unsigned short force_random_spawn; //[Skotlex]
+ unsigned short mob_spawn_delay, plant_spawn_delay, boss_spawn_delay; // [Skotlex]
+ unsigned short slaves_inherit_mode;
+ unsigned short slaves_inherit_speed;
+ unsigned short summons_trigger_autospells;
+ unsigned short pc_walk_delay_rate; //Adjusts can't walk delay after being hit for players. [Skotlex]
+ unsigned short walk_delay_rate; //Adjusts can't walk delay after being hit. [Skotlex]
+ unsigned short multihit_delay; //Adjusts can't walk delay per hit on multi-hitting skills. [Skotlex]
+ unsigned short quest_skill_learn;
+ unsigned short quest_skill_reset;
+ unsigned short basic_skill_check;
+ unsigned short guild_emperium_check;
+ unsigned short guild_exp_limit;
+ unsigned short guild_max_castles;
+ unsigned short emergency_call;
+ unsigned short guild_aura;
+ unsigned short pc_invincible_time;
+ unsigned short pet_catch_rate;
+ unsigned short pet_rename;
+ unsigned short pet_friendly_rate;
+ unsigned short pet_hungry_delay_rate;
+ unsigned short pet_hungry_friendly_decrease;
+ unsigned short pet_status_support;
+ unsigned short pet_attack_support;
+ unsigned short pet_damage_support;
+ unsigned short pet_support_min_friendly; //[Skotlex]
+ unsigned short pet_support_rate;
+ unsigned short pet_attack_exp_to_master;
+ unsigned short pet_attack_exp_rate;
+ unsigned short pet_lv_rate; //[Skotlex]
+ unsigned short pet_max_stats; //[Skotlex]
+ unsigned short pet_max_atk1; //[Skotlex]
+ unsigned short pet_max_atk2; //[Skotlex]
+ unsigned short pet_no_gvg; //Disables pets in gvg. [Skotlex]
+ unsigned short skill_min_damage;
+ unsigned short finger_offensive_type;
+ unsigned short heal_exp;
+ unsigned short max_heal_lv;
+ int max_heal; //Mitternacht
+ unsigned short resurrection_exp;
+ unsigned short shop_exp;
+ unsigned short combo_delay_rate;
+ unsigned short item_check;
+ unsigned short item_use_interval; //[Skotlex]
+ unsigned short wedding_modifydisplay;
+ unsigned short wedding_ignorepalette; //[Skotlex]
+ unsigned short xmas_ignorepalette; // [Valaris]
+ int natural_healhp_interval;
+ int natural_healsp_interval;
+ int natural_heal_skill_interval;
+ unsigned short natural_heal_weight_rate;
+ unsigned short item_name_override_grffile;
+ unsigned short indoors_override_grffile; // [Celest]
+ unsigned short skill_sp_override_grffile; // [Celest]
+ unsigned short cardillust_read_grffile;
+ unsigned short item_equip_override_grffile;
+ unsigned short item_slots_override_grffile;
+ unsigned short arrow_decrement;
+ unsigned short max_aspd;
+ unsigned short max_walk_speed; //Maximum walking speed after buffs [Skotlex]
+ int max_hp;
+ int max_sp;
+ unsigned short max_lv, aura_lv;
+ unsigned short max_parameter, max_baby_parameter;
+ int max_cart_weight;
+ unsigned short skill_log;
+ unsigned short battle_log;
+ unsigned short save_log;
+ unsigned short error_log;
+ unsigned short etc_log;
+ unsigned short save_clothcolor;
+ unsigned short undead_detect_type;
+ unsigned short auto_counter_type;
+ unsigned short min_hitrate; //[Skotlex]
+ unsigned short max_hitrate; //[Skotlex]
+ unsigned short agi_penalty_target;
+ unsigned short agi_penalty_type;
+ unsigned short agi_penalty_count;
+ unsigned short agi_penalty_num;
+ unsigned short vit_penalty_target;
+ unsigned short vit_penalty_type;
+ unsigned short vit_penalty_count;
+ unsigned short vit_penalty_num;
+ unsigned short weapon_defense_type;
+ unsigned short magic_defense_type;
+ unsigned short skill_reiteration;
+ unsigned short skill_nofootset;
+ unsigned short pc_cloak_check_type;
+ unsigned short monster_cloak_check_type;
+ unsigned short estimation_type;
+ unsigned short gvg_short_damage_rate;
+ unsigned short gvg_long_damage_rate;
+ unsigned short gvg_weapon_damage_rate;
+ unsigned short gvg_magic_damage_rate;
+ unsigned short gvg_misc_damage_rate;
+ unsigned short gvg_flee_penalty;
+ int gvg_eliminate_time;
+ unsigned short pk_short_damage_rate;
+ unsigned short pk_long_damage_rate;
+ unsigned short pk_weapon_damage_rate;
+ unsigned short pk_magic_damage_rate;
+ unsigned short pk_misc_damage_rate;
+ unsigned short mob_changetarget_byskill;
+ unsigned short attack_direction_change;
+ unsigned short land_skill_limit;
+ unsigned short party_skill_penalty;
+ unsigned short monster_class_change_full_recover;
+ unsigned short produce_item_name_input;
+ unsigned short produce_potion_name_input;
+ unsigned short making_arrow_name_input;
+ unsigned short holywater_name_input;
+ unsigned short cdp_name_input;
+ unsigned short display_skill_fail;
+ unsigned short chat_warpportal;
+ unsigned short mob_warp;
+ unsigned short dead_branch_active;
+ unsigned int vending_max_value;
+ unsigned short show_steal_in_same_party;
+ unsigned short party_share_type;
+ unsigned short party_hp_mode;
+ unsigned short party_show_share_picker;
+ unsigned short attack_attr_none;
+ int item_rate_mvp, item_rate_common, item_rate_common_boss, item_rate_card, item_rate_card_boss, // added support for MVP drops [Reddozen]
+ item_rate_equip, item_rate_equip_boss, item_rate_heal, item_rate_heal_boss, item_rate_use,
+ item_rate_use_boss, item_rate_treasure, // Added by RoVeRT, Additional Heal and Usable item rate by Val
+ item_rate_adddrop;
+
+ unsigned short logarithmic_drops;
+ unsigned short item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
+ unsigned short item_drop_card_min,item_drop_card_max;
+ unsigned short item_drop_equip_min,item_drop_equip_max;
+ unsigned short item_drop_mvp_min,item_drop_mvp_max; // End Addition
+ unsigned short item_drop_heal_min,item_drop_heal_max; // Added by Valatris
+ unsigned short item_drop_use_min,item_drop_use_max; //End
+ unsigned short item_drop_treasure_min,item_drop_treasure_max; //by [Skotlex]
+ unsigned short item_drop_adddrop_min,item_drop_adddrop_max; //[Skotlex]
+ unsigned short prevent_logout; // Added by RoVeRT
+
+ unsigned short alchemist_summon_reward; // [Valaris]
+ unsigned short drops_by_luk;
+ unsigned short drops_by_luk2;
+ unsigned short equip_natural_break_rate; //Base Natural break rate for attacks.
+ unsigned short equip_self_break_rate; //Natural & Penalty skills break rate
+ unsigned short equip_skill_break_rate; //Offensive skills break rate
+ unsigned short pet_equip_required;
+ unsigned short multi_level_up;
+ unsigned short max_exp_gain_rate; //Max amount of exp bar % you can get in one go.
+ unsigned short pk_mode;
+ unsigned short pk_level_range;
+
+ unsigned short manner_system; // end additions [Valaris]
+ unsigned short show_mob_info;
+
+ unsigned short agi_penalty_count_lv;
+ unsigned short vit_penalty_count_lv;
+
+ unsigned short gx_allhit;
+ unsigned short gx_disptype;
+ unsigned short devotion_level_difference;
+ unsigned short player_skill_partner_check;
+ unsigned short hide_GM_session;
+ unsigned short invite_request_check;
+ unsigned short skill_removetrap_type;
+ unsigned short disp_experience;
+ unsigned short disp_zeny;
+ unsigned short castle_defense_rate;
+ unsigned short backstab_bow_penalty;
+ unsigned short hp_rate;
+ unsigned short sp_rate;
+ unsigned short gm_cant_drop_min_lv;
+ unsigned short gm_cant_drop_max_lv;
+ unsigned short disp_hpmeter;
+ unsigned short bone_drop;
+ unsigned short buyer_name;
+
+// eAthena additions
+ unsigned short night_at_start; // added by [Yor]
+ int day_duration; // added by [Yor]
+ int night_duration; // added by [Yor]
+ short ban_hack_trade; // added by [Yor]
+ unsigned short hack_info_GM_level; // added by [Yor]
+ unsigned short any_warp_GM_min_level; // added by [Yor]
+ unsigned short packet_ver_flag; // added by [Yor]
+
+ unsigned short min_hair_style; // added by [MouseJstr]
+ unsigned short max_hair_style; // added by [MouseJstr]
+ unsigned short min_hair_color; // added by [MouseJstr]
+ unsigned short max_hair_color; // added by [MouseJstr]
+ unsigned short min_cloth_color; // added by [MouseJstr]
+ unsigned short max_cloth_color; // added by [MouseJstr]
+ unsigned short pet_hair_style; // added by [Skotlex]
+
+ unsigned short castrate_dex_scale; // added by [MouseJstr]
+ unsigned short area_size; // added by [MouseJstr]
+
+ unsigned short max_def, over_def_bonus; //added by [Skotlex]
+
+ unsigned short zeny_from_mobs; // [Valaris]
+ unsigned short mobs_level_up; // [Valaris]
+ unsigned short mobs_level_up_exp_rate; // [Valaris]
+ unsigned short pk_min_level; // [celest]
+ unsigned short skill_steal_type; // [celest]
+ unsigned short skill_steal_rate; // [celest]
+ unsigned short skill_steal_max_tries; //max steal skill tries on a mob. if 0, then w/o limit [Lupus]
+ unsigned short motd_type; // [celest]
+ unsigned short finding_ore_rate; // orn
+ unsigned short exp_calc_type;
+ unsigned short exp_bonus_attacker;
+ unsigned short exp_bonus_max_attacker;
+ unsigned short min_skill_delay_limit;
+ unsigned short default_skill_delay;
+ unsigned short no_skill_delay;
+ unsigned short attack_walk_delay;
+ unsigned short require_glory_guild;
+ unsigned short idle_no_share;
+ unsigned short party_update_interval;
+ unsigned short party_even_share_bonus;
+ unsigned short delay_battle_damage;
+ unsigned short hide_woe_damage;
+ unsigned short display_version;
+ unsigned short who_display_aid;
+
+ unsigned short display_hallucination; // [Skotlex]
+ unsigned short use_statpoint_table; // [Skotlex]
+
+ unsigned short ignore_items_gender; //[Lupus]
+
+ unsigned short copyskill_restrict; // [Aru]
+ unsigned short berserk_cancels_buffs; // [Aru]
+ unsigned short debuff_on_logout; // Removes a few "official" negative Scs on logout. [Skotlex]
+ unsigned short mob_ai; //Configures various mob_ai settings to make them smarter or dumber(official). [Skotlex]
+ unsigned short dynamic_mobs; // Dynamic Mobs [Wizputer] - battle_athena flag implemented by [random]
+ unsigned short mob_remove_damaged; // Dynamic Mobs - Remove mobs even if damaged [Wizputer]
+ int mob_remove_delay; // Dynamic Mobs - delay before removing mobs from a map [Skotlex]
+
+ unsigned short show_hp_sp_drain, show_hp_sp_gain; //[Skotlex]
+
+ unsigned short mob_npc_event_type; //Determines on who the npc_event is executed. [Skotlex]
+ unsigned short mob_clear_delay; // [Valaris]
+
+ unsigned short character_size; // if riders have size=2, and baby class riders size=1 [Lupus]
+ unsigned short mob_max_skilllvl; // Max possible skill level [Lupus]
+ unsigned short rare_drop_announce; // chance <= to show rare drops global announces
+
+ unsigned short retaliate_to_master; //Whether when a mob is attacked by another mob, it will retaliate versus the mob or the mob's master. [Skotlex]
+ unsigned short firewall_hits_on_undead; //Number of hits firewall does at a time on undead. [Skotlex]
+
+ unsigned short title_lvl1; // Players titles [Lupus]
+ unsigned short title_lvl2; // Players titles [Lupus]
+ unsigned short title_lvl3; // Players titles [Lupus]
+ unsigned short title_lvl4; // Players titles [Lupus]
+ unsigned short title_lvl5; // Players titles [Lupus]
+ unsigned short title_lvl6; // Players titles [Lupus]
+ unsigned short title_lvl7; // Players titles [Lupus]
+ unsigned short title_lvl8; // Players titles [Lupus]
+
+ unsigned short duel_enable; // [LuzZza]
+ unsigned short duel_allow_pvp; // [LuzZza]
+ unsigned short duel_allow_gvg; // [LuzZza]
+ unsigned short duel_allow_teleport; // [LuzZza]
+ unsigned short duel_autoleave_when_die; // [LuzZza]
+ unsigned short duel_time_interval; // [LuzZza]
+ unsigned short duel_only_on_same_map; // [Toms]
+
+ unsigned short skip_teleport_lv1_menu; // possibility to disable (skip) Teleport Lv1 menu, that have only two lines `Random` and `Cancel` [LuzZza]
+
+ unsigned short allow_skill_without_day; // [Komurka]
+ unsigned short allow_es_magic_pc; // [Skotlex]
+ unsigned short skill_wall_check; // [Skotlex]
+ unsigned short cell_stack_limit; // [Skotlex]
+ unsigned short skill_caster_check; // [Skotlex]
+ unsigned short sc_castcancel; // [Skotlex]
+ unsigned short pc_sc_def_rate; // [Skotlex]
+ unsigned short mob_sc_def_rate;
+ unsigned short pc_luk_sc_def;
+ unsigned short mob_luk_sc_def;
+ unsigned short pc_max_sc_def;
+ unsigned short mob_max_sc_def;
+
+ unsigned short sg_angel_skill_ratio;
+ unsigned short sg_miracle_skill_ratio;
+ int sg_miracle_skill_duration_min;
+ int sg_miracle_skill_duration_max;
+ unsigned short autospell_stacking; //Enables autospell cards to stack. [Skotlex]
+ unsigned short override_mob_names; //Enables overriding spawn mob names with the mob_db names. [Skotlex]
+ unsigned short min_chat_delay; //Minimum time between client messages. [Skotlex]
+ unsigned short friend_auto_add; //When accepting friends, both get friended. [Skotlex]
+ unsigned int hvan_explosion_intimate ; // fix [albator]
+ unsigned short homunculus_show_growth ; //[orn]
+ unsigned short homunculus_friendly_rate;
+} battle_config;
+
+void do_init_battle(void);
+void do_final_battle(void);
+extern int battle_config_read(const char *cfgName);
+extern void battle_validate_conf(void);
+extern void battle_set_defaults(void);
+extern int battle_set_value(char *, char *);
+int battle_get_value(char *);
+
+#endif
diff --git a/src/map/charcommand.c b/src/map/charcommand.c
index 0e796fba6..32290d8fd 100644
--- a/src/map/charcommand.c
+++ b/src/map/charcommand.c
@@ -1,1846 +1,1846 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-#include <limits.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "log.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "charcommand.h"
-#include "atcommand.h"
-
-static char command_symbol = '#';
-
-extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#define CCMD_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-CCMD_FUNC(jobchange);
-CCMD_FUNC(petrename);
-CCMD_FUNC(petfriendly);
-CCMD_FUNC(stats);
-CCMD_FUNC(option);
-CCMD_FUNC(save);
-CCMD_FUNC(stats_all);
-CCMD_FUNC(reset);
-CCMD_FUNC(spiritball);
-CCMD_FUNC(itemlist);
-CCMD_FUNC(effect);
-CCMD_FUNC(storagelist);
-CCMD_FUNC(item);
-CCMD_FUNC(warp);
-CCMD_FUNC(zeny);
-CCMD_FUNC(fakename);
-CCMD_FUNC(baselevel);
-CCMD_FUNC(joblevel);
-CCMD_FUNC(questskill);
-CCMD_FUNC(lostskill);
-CCMD_FUNC(skreset);
-CCMD_FUNC(streset);
-CCMD_FUNC(model);
-CCMD_FUNC(stpoint);
-CCMD_FUNC(skpoint);
-CCMD_FUNC(changesex);
-CCMD_FUNC(feelreset);
-CCMD_FUNC(help);
-
-
-/*==========================================
- *CharCommandInfo charcommand_info[]\‘¢‘Ì‚Ì’è‹`
- *------------------------------------------
- */
-
-// First char of commands is configured in charcommand_athena.conf. Leave # in this list for default value.
-// to set default level, read charcommand_athena.conf first please.
-static CharCommandInfo charcommand_info[] = {
- { CharCommandJobChange, "#job", 60, charcommand_jobchange },
- { CharCommandJobChange, "#jobchange", 60, charcommand_jobchange },
- { CharCommandPetRename, "#petrename", 50, charcommand_petrename },
- { CharCommandPetFriendly, "#petfriendly", 50, charcommand_petfriendly },
- { CharCommandStats, "#stats", 40, charcommand_stats },
- { CharCommandOption, "#option", 60, charcommand_option },
- { CharCommandReset, "#reset", 60, charcommand_reset },
- { CharCommandSave, "#save", 60, charcommand_save },
- { CharCommandStatsAll, "#statsall", 40, charcommand_stats_all },
- { CharCommandSpiritball, "#spiritball", 40, charcommand_spiritball },
- { CharCommandItemList, "#itemlist", 40, charcommand_itemlist },
- { CharCommandEffect, "#effect", 40, charcommand_effect },
- { CharCommandStorageList, "#storagelist", 40, charcommand_storagelist },
- { CharCommandItem, "#item", 60, charcommand_item },
- { CharCommandWarp, "#warp", 60, charcommand_warp },
- { CharCommandWarp, "#rura", 60, charcommand_warp },
- { CharCommandWarp, "#rura+", 60, charcommand_warp },
- { CharCommandZeny, "#zeny", 60, charcommand_zeny },
- { CharCommandFakeName, "#fakename", 20, charcommand_fakename},
-
- //*********************************Recently added commands*********************************************
- { CharCommandBaseLevel, "#baselvl", 20, charcommand_baselevel},
- { CharCommandBaseLevel, "#blvl", 60, charcommand_baselevel},
- { CharCommandBaseLevel, "#baselvlup", 60, charcommand_baselevel},
- { CharCommandJobLevel, "#joblvl", 60, charcommand_joblevel},
- { CharCommandJobLevel, "#jlvl", 60, charcommand_joblevel},
- { CharCommandJobLevel, "#joblvlup", 60, charcommand_joblevel},
- { CharCommandQuestSkill, "#questskill", 60, charcommand_questskill },
- { CharCommandLostSkill, "#lostskill", 60, charcommand_lostskill },
- { CharCommandSkReset, "#skreset", 60, charcommand_skreset },
- { CharCommandStReset, "#streset", 60, charcommand_streset },
- { CharCommandModel, "#model", 50, charcommand_model },
- { CharCommandSKPoint, "#skpoint", 60, charcommand_skpoint },
- { CharCommandSTPoint, "#stpoint", 60, charcommand_stpoint },
- { CharCommandChangeSex, "#changesex", 60, charcommand_changesex },
- { CharCommandFeelReset, "#feelreset", 60, charcommand_feelreset },
- { CharCommandHelp, "#help", 20, charcommand_help },
-// add new commands before this line
- { CharCommand_Unknown, NULL, 1, NULL }
-};
-
-int get_charcommand_level(const CharCommandType type) {
- int i;
-
- for (i = 0; charcommand_info[i].type != CharCommand_None; i++)
- if (charcommand_info[i].type == type)
- return charcommand_info[i].level;
-
- return 100; // 100: command can not be used
-}
-
-CharCommandType
-charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl) {
- CharCommandInfo info;
- CharCommandType type;
-
- malloc_set(&info, 0, sizeof(info));
-
- type = charcommand(sd, gmlvl, str, &info);
- if (type != CharCommand_None) {
- char command[100];
- char output[200];
- const char* p = str;
-
- if (map[sd->bl.m].nocommand &&
- gmlvl < map[sd->bl.m].nocommand)
- { //Command not allowed on this map.
- sprintf(output, msg_txt(143));
- clif_displaymessage(fd, output);
- return AtCommand_None;
- }
-
- malloc_tsetdword(command, '\0', sizeof(command));
- malloc_tsetdword(output, '\0', sizeof(output));
- while (*p && !isspace(*p))
- p++;
- if (p - str >= sizeof(command)) // too long
- return CharCommand_Unknown;
- strncpy(command, str, p - str);
- while (isspace(*p))
- p++;
-
- if (type == CharCommand_Unknown || info.proc == NULL) {
- snprintf(output, sizeof(output),msg_txt(153), command); // %s is Unknown Command.
- clif_displaymessage(fd, output);
- } else {
- if (info.proc(fd, sd, command, p) != 0) {
- // Command can not be executed
- snprintf(output, sizeof(output), msg_txt(154), command); // %s failed.
- clif_displaymessage(fd, output);
- }
- }
-
- return info.type;
- }
-
- return CharCommand_None;
-}
-
-/*==========================================
- *is_charcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
- *------------------------------------------
- */
-CharCommandType
-is_charcommand(const int fd, struct map_session_data* sd, const char* message) {
- const char* str = message;
- int s_flag = 0;
-
- nullpo_retr(CharCommand_None, sd);
-
- if (!message || !*message)
- return CharCommand_None;
-
- str += strlen(sd->status.name);
- while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
- if (*str == ':')
- s_flag = 1;
- str++;
- }
-
- if (!*str)
- return CharCommand_None;
-
- return charcommand_sub(fd,sd,str,pc_isGM(sd));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-CharCommandType charcommand(struct map_session_data* sd, const int level, const char* message, CharCommandInfo* info) {
- char* p = (char *)message;
-
- if (!info)
- return CharCommand_None;
- if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
- return CharCommand_None;
- if (!p || !*p) {
- ShowError("char command message is empty\n");
- return CharCommand_None;
- }
-
- if(p[0] == '|')
- p += 3;
-
- if (*p == command_symbol) { // check first char, try to skip |00 (or something else) [Lance]
- char command[101];
- int i = 0;
- malloc_set(info, 0, sizeof(CharCommandInfo));
- sscanf(p, "%100s", command);
- command[sizeof(command)-1] = '\0';
-
- while (charcommand_info[i].type != CharCommand_Unknown) {
- if (strcmpi(command+1, charcommand_info[i].command+1) == 0 && level >= charcommand_info[i].level) {
- p[0] = charcommand_info[i].command[0]; // set correct first symbol for after.
- break;
- }
- i++;
- }
-
- if (charcommand_info[i].type == CharCommand_Unknown) {
- // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
- if (level == 0)
- return CharCommand_None;
- else
- return CharCommand_Unknown;
- } else if((log_config.gm) && (charcommand_info[i].level >= log_config.gm)) {
- log_atcommand(sd, message);
- }
- memcpy(info, &charcommand_info[i], sizeof charcommand_info[i]);
- } else {
- return CharCommand_None;
- }
-
- return info->type;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-static CharCommandInfo* get_charcommandinfo_byname(const char* name) {
- int i;
-
- for (i = 0; charcommand_info[i].type != CharCommand_Unknown; i++)
- if (strcmpi(charcommand_info[i].command + 1, name) == 0)
- return &charcommand_info[i];
-
- return NULL;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- CharCommandInfo* p;
- FILE* fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowError("CharCommands configuration file not found: %s\n", cfgName);
- return 1;
- }
-
- while (fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2)
- continue;
- p = get_charcommandinfo_byname(w1);
- if (p != NULL) {
- p->level = atoi(w2);
- if (p->level > 100)
- p->level = 100;
- else if (p->level < 0)
- p->level = 0;
- }
-
- if (strcmpi(w1, "import") == 0)
- charcommand_config_read(w2);
- else if (strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 &&
- w2[0] != '/' && // symbol of standard ragnarok GM commands
- w2[0] != '%' && // symbol of party chat speaking
- w2[0] != '$' && // symbol of guild chat speaking
- w2[0] != '@') // symbol of atcommand
- command_symbol = w2[0];
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * ‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ð“]E‚³‚¹‚é upperŽw’è‚Å“]¶‚â—{Žq‚à‰Â”\
- *------------------------------------------
- */
-int charcommand_jobchange(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data* pl_sd;
- int job = 0, upper = -1;
-
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
- return -1;
- }
-
- if (sscanf(message, "%d %d %99[^\n]", &job, &upper, character) < 3) { //upperŽw’肵‚Ä‚ ‚é
- upper = -1;
- if (sscanf(message, "%d %99[^\n]", &job, character) < 2) { //upperŽw’肵‚Ä‚È‚¢ã‚ɉ½‚©‘«‚è‚È‚¢
- clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
- return -1;
- }
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- int j;
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job only to lower or same level
- if ((job >= 0 && job < MAX_PC_CLASS)) {
- for (j=0; j < MAX_INVENTORY; j++) {
- if(pl_sd->status.inventory[j].nameid>0 && pl_sd->status.inventory[j].equip!=0)
- pc_unequipitem(pl_sd, j, 3);
- }
- if (pc_jobchange(pl_sd, job, upper) == 0)
- clif_displaymessage(fd, msg_table[48]); // Character's job changed.
- else {
- clif_displaymessage(fd, msg_table[192]); // Impossible to change the character's job.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[49]); // Invalid job ID.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_petrename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[NAME_LENGTH];
- struct map_session_data *pl_sd;
- struct pet_data *pd;
-
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #petrename <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) == NULL) {
- clif_displaymessage(fd, msg_txt(3)); // Character not found.
- return -1;
- }
-
- if (!pl_sd->status.pet_id || !pl_sd->pd) {
- clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
- return -1;
- }
-
- pd = pl_sd->pd;
-
- if (pd->pet.rename_flag) {
- clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
- return -1;
- }
- pd->pet.rename_flag = 0;
- intif_save_petdata(pl_sd->status.account_id, &pd->pet);
- clif_send_petstatus(pl_sd);
- clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_petfriendly(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int friendly = 0;
- char character[NAME_LENGTH];
- struct map_session_data *pl_sd;
- struct pet_data *pd;
-
- malloc_tsetdword(character, '\0', sizeof(character));
- if (!message || !*message || sscanf(message,"%d %23s",&friendly,character) < 2) {
- clif_displaymessage(fd, "Please, enter a valid value (usage: "
- "#petfriendly <0-1000> <player>).");
- return -1;
- }
-
- if (((pl_sd = map_nick2sd(character)) == NULL) ||
- pc_isGM(sd)<pc_isGM(pl_sd)) {
- clif_displaymessage(fd, msg_txt(3)); // Character not found.
- return -1;
- }
-
- if (!pl_sd->status.pet_id || !pl_sd->pd) {
- clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
- return -1;
- }
-
- if (friendly < 0 || friendly > 1000) {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- pd = pl_sd->pd;
- if (friendly == pd->pet.intimate) {
- clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
- return -1;
- }
-
- pd->pet.intimate = friendly;
- clif_send_petstatus(pl_sd);
- clif_pet_emotion(pd,0);
- clif_displaymessage(pl_sd->fd, msg_table[182]); // Pet friendly value changed!
- clif_displaymessage(sd->fd, msg_table[182]); // Pet friendly value changed!
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_stats(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[NAME_LENGTH];
- char job_jobname[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i;
-
- malloc_tsetdword(character, '\0', sizeof(character));
- malloc_tsetdword(job_jobname, '\0', sizeof(job_jobname));
- malloc_tsetdword(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #stats <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- struct {
- const char* format;
- int value;
- } output_table[] = {
- { "Base Level - %d", 0 },
- { NULL, 0 },
- { "Hp - %d", 0 },
- { "MaxHp - %d", 0 },
- { "Sp - %d", 0 },
- { "MaxSp - %d", 0 },
- { "Str - %3d", 0 },
- { "Agi - %3d", 0 },
- { "Vit - %3d", 0 },
- { "Int - %3d", 0 },
- { "Dex - %3d", 0 },
- { "Luk - %3d", 0 },
- { "Zeny - %d", 0 },
- { NULL, 0 }
- };
- //direct array initialization with variables is not standard C compliant.
- output_table[0].value = pl_sd->status.base_level;
- output_table[1].format = job_jobname;
- output_table[1].value = pl_sd->status.job_level;
- output_table[2].value = pl_sd->status.hp;
- output_table[3].value = pl_sd->status.max_hp;
- output_table[4].value = pl_sd->status.sp;
- output_table[5].value = pl_sd->status.max_sp;
- output_table[6].value = pl_sd->status.str;
- output_table[7].value = pl_sd->status.agi;
- output_table[8].value = pl_sd->status.vit;
- output_table[9].value = pl_sd->status.int_;
- output_table[10].value = pl_sd->status.dex;
- output_table[11].value = pl_sd->status.luk;
- output_table[12].value = pl_sd->status.zeny;
- sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class_), "(level %d)");
- sprintf(output, msg_table[53], pl_sd->status.name); // '%s' stats:
- clif_displaymessage(fd, output);
- for (i = 0; output_table[i].format != NULL; i++) {
- sprintf(output, output_table[i].format, output_table[i].value);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Reset
- *------------------------------------------
- */
-int charcommand_reset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[NAME_LENGTH];
- char output[200];
- struct map_session_data *pl_sd;
-
- malloc_tsetdword(character, '\0', sizeof(character));
- malloc_tsetdword(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #reset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
- pc_resetstate(pl_sd);
- pc_resetskill(pl_sd,1);
- sprintf(output, msg_table[208], character); // '%s' skill and stats points reseted!
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_option(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[NAME_LENGTH];
- int opt1 = 0, opt2 = 0, opt3 = 0;
- struct map_session_data* pl_sd;
-
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message ||
- sscanf(message, "%d %d %d %23[^\n]", &opt1, &opt2, &opt3, character) < 4 ||
- opt1 < 0 || opt2 < 0 || opt3 < 0) {
- clif_displaymessage(fd, "Please, enter valid options and a player name (usage: #option <param1> <param2> <param3> <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change option only to lower or same level
- pl_sd->sc.opt1 = opt1;
- pl_sd->sc.opt2 = opt2;
- pc_setoption(pl_sd, opt3);
- clif_displaymessage(fd, msg_table[58]); // Character's options changed.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_save(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[MAP_NAME_LENGTH];
- char character[NAME_LENGTH];
- struct map_session_data* pl_sd;
- int x = 0, y = 0;
- int m;
-
- malloc_tsetdword(map_name, '\0', sizeof(map_name));
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4 || x < 0 || y < 0) {
- clif_displaymessage(fd, "Please, enter a valid save point and a player name (usage: #save <map> <x> <y> <charname>).");
- return -1;
- }
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < MAP_NAME_LENGTH-4) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change save point only to lower or same gm level
- m = map_mapname2mapid(map_name);
- if (m < 0 && !mapindex_name2id(map_name)) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- } else {
- //FIXME: What do you do if the map is in another map server with the nowarpto flag?
- if (m>=0 && map[m].flag.nosave && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to set this map as a save map.");
- return -1;
- }
- if (m>=0)
- pc_setsavepoint(pl_sd, map[m].index, x, y);
- else
- pc_setsavepoint(pl_sd, mapindex_name2id(map_name), x, y);
- clif_displaymessage(fd, msg_table[57]); // Character's respawn point changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-//** Character Stats All by fritz
-int charcommand_stats_all(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- char output[1024], gmlevel[1024];
- int i;
- int count, users;
- struct map_session_data *pl_sd, **pl_allsd;
-
- malloc_tsetdword(output, '\0', sizeof(output));
- malloc_tsetdword(gmlevel, '\0', sizeof(gmlevel));
-
- count = 0;
- pl_allsd = map_getallusers(&users);
- for(i = 0; i < users; i++) {
- if ((pl_sd = pl_allsd[i]))
- {
- if (pc_isGM(pl_sd) > 0)
- sprintf(gmlevel, "| GM Lvl: %d", pc_isGM(pl_sd));
- else
- sprintf(gmlevel, " ");
-
- sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level, pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp, pl_sd->status.max_sp);
- clif_displaymessage(fd, output);
- sprintf(output, "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s", pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit, pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk, pl_sd->status.zeny, gmlevel);
- clif_displaymessage(fd, output);
- clif_displaymessage(fd, "--------");
- count++;
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- * CharSpiritBall Function by PalasX
- *------------------------------------------
- */
-int charcommand_spiritball(const int fd, struct map_session_data* sd,const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[NAME_LENGTH];
- int spirit = 0;
-
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if(!message || !*message || sscanf(message, "%d %23[^\n]", &spirit, character) < 2 || spirit < 0 || spirit > 1000) {
- clif_displaymessage(fd, "Usage: @spiritball <number: 0-1000>) <CHARACTER_NAME>.");
- return -1;
- }
-
- if((pl_sd = map_nick2sd(character)) != NULL) {
- if (spirit >= 0 && spirit <= 0x7FFF) {
- if (pl_sd->spiritball != spirit || spirit > 999) {
- if (pl_sd->spiritball > 0)
- pc_delspiritball(pl_sd, pl_sd->spiritball, 1);
- pl_sd->spiritball = spirit;
- clif_spiritball(pl_sd);
- // no message, player can look the difference
- if (spirit > 1000)
- clif_displaymessage(fd, msg_table[204]); // WARNING: more than 1000 spiritballs can CRASH your server and/or client!
- } else {
- clif_displaymessage(fd, msg_table[205]); // You already have this number of spiritballs.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- return 0;
-}
-
-/*==========================================
- * #itemlist <character>: Displays the list of a player's items.
- *------------------------------------------
- */
-int
-charcommand_itemlist(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- struct item_data *item_data, *item_temp;
- int i, j, equip, count, counter, counter2;
- char character[NAME_LENGTH], output[200], equipstr[100], outputtmp[200];
- struct item *i_item; //Current inventory item.
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(character, '\0', sizeof(character));
- malloc_tsetdword(output, '\0', sizeof(output));
- malloc_tsetdword(equipstr, '\0', sizeof(equipstr));
- malloc_tsetdword(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- counter = 0;
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- i_item = &pl_sd->status.inventory[i];
- if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_exists(i_item->nameid)) != NULL) {
- counter = counter + i_item->amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if ((equip = i_item->equip)) {
- strcpy(equipstr, "| equiped: ");
- if (equip & EQP_GARMENT)
- strcat(equipstr, "robe/gargment, ");
- if (equip & EQP_ACC_L)
- strcat(equipstr, "left accessory, ");
- if (equip & EQP_ARMOR)
- strcat(equipstr, "body/armor, ");
- if ((equip & EQP_ARMS) == EQP_HAND_R)
- strcat(equipstr, "right hand, ");
- if ((equip & EQP_ARMS) == EQP_HAND_L)
- strcat(equipstr, "left hand, ");
- if ((equip & EQP_ARMS) == EQP_ARMS)
- strcat(equipstr, "both hands, ");
- if (equip & EQP_SHOES)
- strcat(equipstr, "feet, ");
- if (equip & EQP_ACC_R)
- strcat(equipstr, "right accessory, ");
- if ((equip & EQP_HELM) == EQP_HEAD_LOW)
- strcat(equipstr, "lower head, ");
- if ((equip & EQP_HELM) == EQP_HEAD_TOP)
- strcat(equipstr, "top head, ");
- if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_TOP))
- strcat(equipstr, "lower/top head, ");
- if ((equip & EQP_HELM) == EQP_HEAD_MID)
- strcat(equipstr, "mid head, ");
- if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_MID))
- strcat(equipstr, "lower/mid head, ");
- if ((equip & EQP_HELM) == EQP_HELM)
- strcat(equipstr, "lower/mid/top head, ");
- // remove final ', '
- equipstr[strlen(equipstr) - 2] = '\0';
- } else
- malloc_tsetdword(equipstr, '\0', sizeof(equipstr));
- if (i_item->refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", i_item->amount, item_data->name, i_item->refine, item_data->jname, i_item->refine, i_item->nameid, equipstr);
- else
- sprintf(output, "%d %s (%s, id: %d) %s", i_item->amount, item_data->name, item_data->jname, i_item->nameid, equipstr);
- clif_displaymessage(fd, output);
- malloc_tsetdword(output, '\0', sizeof(output));
- counter2 = 0;
-
- if(i_item->card[0]==CARD0_PET) { //pet eggs
- if (i_item->card[3])
- sprintf(outputtmp, " -> (pet egg, pet id: %u, named)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
- else
- sprintf(outputtmp, " -> (pet egg, pet id: %u, unnamed)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
- strcat(output, outputtmp);
- } else
- if(i_item->card[0]==CARD0_FORGE) { //forged items.
- sprintf(outputtmp, " -> (crafted item, creator id: %u, star crumbs %d, element %d)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]), i_item->card[1]>>8, i_item->card[1]&0x0f);
- } else
- if(i_item->card[0]==CARD0_CREATE) { //created items.
- sprintf(outputtmp, " -> (produced item, creator id: %u)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]));
- strcat(output, outputtmp);
- } else //Normal slots
- for (j = 0; j < item_data->slot; j++) {
- if (pl_sd->status.inventory[i].card[j]) {
- if ((item_temp = itemdb_exists(i_item->card[j])) != NULL) {
- if (output[0] == '\0')
- sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- else
- sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- strcat(output, outputtmp);
- }
- }
- }
- if (output[0] != '\0') {
- output[strlen(output) - 2] = ')';
- output[strlen(output) - 1] = '\0';
- clif_displaymessage(fd, output);
- }
- }
- }
- if (count == 0)
- clif_displaymessage(fd, "No item found on this player.");
- else {
- sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #effect by [MouseJstr]
- *
- * Create a effect localized on another character
- *------------------------------------------
- */
-int
-charcommand_effect(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- char target[255];
- int type = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) {
- clif_displaymessage(fd, "usage: #effect <type+> <target>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) target)) == NULL)
- return -1;
-
- clif_specialeffect(&pl_sd->bl, type, AREA);
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
-
- return 0;
-}
-
-/*==========================================
- * #storagelist <character>: Displays the items list of a player's storage.
- *------------------------------------------
- */
-int
-charcommand_storagelist(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct storage *stor;
- struct map_session_data *pl_sd;
- struct item_data *item_data, *item_temp;
- int i, j, count, counter, counter2;
- char character[NAME_LENGTH], output[200], outputtmp[200];
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(character, '\0', sizeof(character));
- malloc_tsetdword(output, '\0', sizeof(output));
- malloc_tsetdword(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- if((stor = account2storage2(pl_sd->status.account_id)) != NULL) {
- counter = 0;
- count = 0;
- for (i = 0; i < MAX_STORAGE; i++) {
- if (stor->storage_[i].nameid > 0 && (item_data = itemdb_search(stor->storage_[i].nameid)) != NULL) {
- counter = counter + stor->storage_[i].amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Storage items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if (stor->storage_[i].refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d)", stor->storage_[i].amount, item_data->name, stor->storage_[i].refine, item_data->jname, stor->storage_[i].refine, stor->storage_[i].nameid);
- else
- sprintf(output, "%d %s (%s, id: %d)", stor->storage_[i].amount, item_data->name, item_data->jname, stor->storage_[i].nameid);
- clif_displaymessage(fd, output);
- malloc_tsetdword(output, '\0', sizeof(output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (stor->storage_[i].card[j]) {
- if ((item_temp = itemdb_search(stor->storage_[i].card[j])) != NULL) {
- if (output[0] == '\0')
- sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- else
- sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- strcat(output, outputtmp);
- }
- }
- }
- if (output[0] != '\0') {
- output[strlen(output) - 2] = ')';
- output[strlen(output) - 1] = '\0';
- clif_displaymessage(fd, output);
- }
- }
- }
- if (count == 0)
- clif_displaymessage(fd, "No item found in the storage of this player.");
- else {
- sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, "This player has no storage.");
- return 0;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-static void
-charcommand_giveitem_sub(struct map_session_data *sd,struct item_data *item_data,int number)
-{
- int flag = 0;
- int loop = 1, get_count = number,i;
- struct item item_tmp;
-
- if(sd && item_data){
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- loop = number;
- get_count = 1;
- }
- for (i = 0; i < loop; i++) {
- malloc_set(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_data->nameid;
- item_tmp.identify = 1;
-
- if ((flag = pc_additem((struct map_session_data*)sd,
- &item_tmp, get_count)))
- clif_additem((struct map_session_data*)sd, 0, 0, flag);
- }
- //Logs (A)dmins items [Lupus]
- if(log_config.enable_logs&0x400)
- log_pick_pc(sd, "A", item_tmp.nameid, number, &item_tmp);
-
- }
-}
-/*==========================================
- * #item command (usage: #item <name/id_of_item> <quantity> <player>)
- * by MC Cameri
- *------------------------------------------
- */
-int charcommand_item(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- char character[NAME_LENGTH];
- struct map_session_data *pl_sd;
- int number = 0, item_id, flag;
- struct item item_tmp;
- struct item_data *item_data;
- int get_count, i, pet_id;
- char tmp_cmdoutput[1024];
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %23[^\n]", item_name, &number, character) < 3) {
- clif_displaymessage(fd, "Please, enter an item name/id (usage: #item <item name or ID> <quantity> <char name>).");
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (item_id >= 500) {
- get_count = number;
- // check pet egg
- pet_id = search_petDB_index(item_id, PET_EGG);
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- get_count = 1;
- }
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- for (i = 0; i < number; i += get_count) {
- // if pet egg
- if (pet_id >= 0) {
- pl_sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(pl_sd->status.account_id, pl_sd->status.char_id,
- (short)pet_db[pet_id].class_, (short)mob_db(pet_db[pet_id].class_)->lv,
- (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- // if not pet egg
- } else {
- malloc_set(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- item_tmp.identify = 1;
-
- if ((flag = pc_additem(pl_sd, &item_tmp, get_count)))
- clif_additem(pl_sd, 0, 0, flag);
- }
- }
-
- //Logs (A)dmins items [Lupus]
- if(log_config.enable_logs&0x400)
- log_pick_pc(sd, "A", item_tmp.nameid, number, &item_tmp);
-
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else if(/* from jA's @giveitem */strcmpi(character,"all")==0 || strcmpi(character,"everyone")==0){
- struct map_session_data **pl_allsd;
- int users;
- pl_allsd = map_getallusers(&users);
- for (i = 0; i < users; i++) {
- if ((pl_sd = pl_allsd[i])) {
- charcommand_giveitem_sub(pl_sd,item_data,number);
- snprintf(tmp_cmdoutput, sizeof(tmp_cmdoutput), "You got %s %d.", item_name,number);
- clif_displaymessage(pl_sd->fd, tmp_cmdoutput);
- }
- }
- snprintf(tmp_cmdoutput, sizeof(tmp_cmdoutput), "%s received %s %d.","Everyone",item_name,number);
- clif_displaymessage(fd, tmp_cmdoutput);
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #warp/#rura/#rura+ <mapname> <x> <y> <char name>
- *------------------------------------------
- */
-int charcommand_warp(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[MAP_NAME_LENGTH];
- char character[NAME_LENGTH];
- int x = 0, y = 0;
- struct map_session_data *pl_sd;
- int m;
-
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(map_name, '\0', sizeof(map_name));
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4) {
- clif_displaymessage(fd, "Usage: #warp/#rura/#rura+ <mapname> <x> <y> <char name>");
- return -1;
- }
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < MAP_NAME_LENGTH-4) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((pl_sd = map_nick2sd(character)) == NULL) {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- if (pc_isGM(sd) < pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- m = map_mapname2mapid(map_name);
- if (m < 0) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- if ((x || y) && map_getcell(m, x, y, CELL_CHKNOREACH)) {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- x = y = 0;
- }
- if (map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp someone to this map.");
- return -1;
- }
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp this player from its actual map.");
- return -1;
- }
- if (pc_setpos(pl_sd, map[m].index, x, y, 3) == 0) {
- clif_displaymessage(pl_sd->fd, msg_table[0]); // Warped.
- clif_displaymessage(fd, msg_table[15]); // Player warped (message sends to player too).
- return 0;
- }
- //No error message specified...?
- return -1;
-}
-
-/*==========================================
- * #zeny <charname>
- *------------------------------------------
- */
-int charcommand_zeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[NAME_LENGTH];
- int zeny = 0, new_zeny;
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &zeny, character) < 2 || zeny == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: #zeny <zeny> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- new_zeny = pl_sd->status.zeny + zeny;
- if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
- new_zeny = MAX_ZENY;
- else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow
- new_zeny = 0;
- if (new_zeny != pl_sd->status.zeny) {
- pl_sd->status.zeny = new_zeny;
- clif_updatestatus(pl_sd, SP_ZENY);
- clif_displaymessage(fd, msg_table[211]); // Character's number of zenys changed!
- } else {
- if (zeny < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #fakename <char name> <fake name>
- *------------------------------------------
- */
-
-int charcommand_fakename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char name[NAME_LENGTH];
- char char_name[NAME_LENGTH];
-
- nullpo_retr(-1, sd);
-
- name[0] = '\0'; //If you don't pass a second word, name is left as garbage, most definitely not a blank name! [Skotlex]
- if (!message || !*message || sscanf(message, "%23s %23[^\n]", char_name, name) < 1) {
- clif_displaymessage(sd->fd,"Usage: #fakename <char name> <fake name>.");
- clif_displaymessage(sd->fd,"Or: #fakename <char name> to disable.");
- return 0;
- }
-
- if(!(pl_sd = map_nick2sd(char_name))) {
- clif_displaymessage(sd->fd,"Character not found.");
- return -1;
- }
-
- if(strlen(name) < 1 || !name) {
- if(strlen(pl_sd->fakename) > 1) {
- pl_sd->fakename[0]='\0';
- clif_charnameack(0, &pl_sd->bl);
- clif_displaymessage(sd->fd,"Returned to real name.");
- } else {
- clif_displaymessage(sd->fd,"Character does not has a fake name.");
- }
- return 0;
- }
-
- if(strlen(name) < 2) {
- clif_displaymessage(sd->fd,"Fake name must be at least two characters.");
- return 0;
- }
-
- memcpy(pl_sd->fakename,name, NAME_LENGTH-1);
- clif_charnameack(0, &pl_sd->bl);
- clif_displaymessage(sd->fd,"Fake name enabled.");
-
- return 0;
-}
-
-
-/*==========================================
- * #baselvl <#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------
-*/
-int charcommand_baselevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int level = 0, i, status_point=0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: #baselvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change base level only lower or same gm level
-
- if (level > 0) {
- if (pl_sd->status.base_level == pc_maxbaselv(sd)) { // check for max level by Valaris
- clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher.
- return 0;
- } // End Addition
- if ((unsigned int)level > pc_maxbaselv(pl_sd) ||
- pl_sd->status.base_level > pc_maxbaselv(pl_sd) -level)
- level = pc_maxbaselv(pl_sd) - pl_sd->status.base_level;
- for (i = 1; i <= level; i++)
- status_point += (pl_sd->status.base_level + i + 14) / 5;
- if (pl_sd->status.status_point > USHRT_MAX - status_point)
- pl_sd->status.status_point = USHRT_MAX;
- else
- pl_sd->status.status_point += status_point;
- pl_sd->status.base_level += (unsigned int)level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- status_calc_pc(pl_sd, 0);
- status_percent_heal(&pl_sd->bl, 100, 100);
- clif_misceffect(&pl_sd->bl, 0);
- clif_displaymessage(fd, msg_table[65]); // Character's base level raised.
- } else {
- if (pl_sd->status.base_level == 1) {
- clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower.
- return -1;
- }
- level *= -1;
- if ((unsigned int)level >= pl_sd->status.base_level)
- level = pl_sd->status.base_level -1;
- if (pl_sd->status.status_point > 0) {
- for (i = 0; i > -level; i--)
- status_point += (pl_sd->status.base_level +i + 14) / 5;
- if (pl_sd->status.status_point < status_point)
- pc_resetstate(pl_sd);
- if (pl_sd->status.status_point < status_point)
- pl_sd->status.status_point = 0;
- else
- pl_sd->status.status_point -= status_point;
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- } // to add: remove status points from stats
- pl_sd->status.base_level -= (unsigned int)level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- status_calc_pc(pl_sd, 0);
- clif_displaymessage(fd, msg_table[66]); // Character's base level lowered.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0; //³íI—¹
-}
-
-/*==========================================
- * #jlvl <#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------
- */
-int charcommand_joblevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int level = 0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: #joblvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
- if (level > 0) {
- if (pl_sd->status.job_level == pc_maxjoblv(pl_sd)) {
- clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher.
- return -1;
- }
- if ((unsigned int)level > pc_maxjoblv(pl_sd) ||
- pl_sd->status.job_level > pc_maxjoblv(pl_sd) -level)
- level = pc_maxjoblv(pl_sd) - pl_sd->status.job_level;
- pl_sd->status.job_level += (unsigned int)level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
-
- if (pl_sd->status.skill_point > USHRT_MAX - level)
- pl_sd->status.skill_point = USHRT_MAX;
- else
- pl_sd->status.skill_point += level;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- status_calc_pc(pl_sd, 0);
- clif_misceffect(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[68]); // character's job level raised.
- } else {
- if (pl_sd->status.job_level == 1) {
- clif_displaymessage(fd, msg_table[194]); // Character's job level can't go any lower.
- return -1;
- }
- level*=-1;
- if ((unsigned int)level >= pl_sd->status.job_level)
- level = pl_sd->status.job_level-1;
- pl_sd->status.job_level -= (unsigned int)level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
- if (pl_sd->status.skill_point < level)
- pc_resetskill(pl_sd, 0); //Need more skill points to substract
- if (pl_sd->status.skill_point < level)
- pl_sd->status.skill_point = 0;
- else
- pl_sd->status.skill_point -= level;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- status_calc_pc(pl_sd, 0);
- clif_displaymessage(fd, msg_table[69]); // Character's job level lowered.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-
-/*==========================================
- * #questskill <skill_#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------
- */
-int charcommand_questskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int skill_id = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: #questskill <#:0+> <nickname>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
- if (skill_get_inf2(skill_id) & INF2_QUEST_SKILL) {
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_checkskill(pl_sd, skill_id) == 0) {
- pc_skill(pl_sd, skill_id, 1, 0);
- clif_displaymessage(fd, msg_table[199]); // This player has learned the skill.
- } else {
- clif_displaymessage(fd, msg_table[200]); // This player already has this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-
-/*==========================================
- * #lostskill <skill_#> <nickname>
- * Transferred by: Kevin
- *------------------------------------------
- */
-int charcommand_lostskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int skill_id = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL) {
- if (skill_get_inf2(skill_id) & INF2_QUEST_SKILL) {
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_checkskill(pl_sd, skill_id) > 0) {
- pl_sd->status.skill[skill_id].lv = 0;
- pl_sd->status.skill[skill_id].flag = 0;
- clif_skillinfoblock(pl_sd);
- clif_displaymessage(fd, msg_table[202]); // This player has forgotten the skill.
- } else {
- clif_displaymessage(fd, msg_table[203]); // This player doesn't have this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Skill Reset
- *------------------------------------------
- */
-int charcommand_skreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- char tmp_cmdoutput[1024];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
- pc_resetskill(pl_sd,1);
- sprintf(tmp_cmdoutput, msg_table[206], player); // '%s' skill points reseted!
- clif_displaymessage(fd, tmp_cmdoutput);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Stat Reset
- *------------------------------------------
- */
-int charcommand_streset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- char tmp_cmdoutput[1024];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset stats points only lower or same gm level
- pc_resetstate(pl_sd);
- sprintf(tmp_cmdoutput, msg_table[207], player); // '%s' stats points reseted!
- clif_displaymessage(fd, tmp_cmdoutput);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Model by chbrules
- *------------------------------------------
- */
-int charcommand_model(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hair_style = 0, hair_color = 0, cloth_color = 0;
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- char tmp_cmdoutput[1024];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %d %d %23[^\n]", &hair_style, &hair_color, &cloth_color, player) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
- sprintf(tmp_cmdoutput, "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, tmp_cmdoutput);
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
- hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
- cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
- /* Removed this check for being too strange. [Skotlex]
- if (cloth_color != 0 &&
- pl_sd->status.sex == 1 &&
- (pl_sd->status.class_ == JOB_ASSASSIN || pl_sd->status.class_ == JOB_ROGUE)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- */
- pc_changelook(pl_sd, LOOK_HAIR, hair_style);
- pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
-// }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Skill Point (Rewritten by [Yor])
- *------------------------------------------
- */
-int charcommand_skpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int new_skill_point;
- int point = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charskpoint <amount> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (point > 0 && pl_sd->status.skill_point > USHRT_MAX - point)
- new_skill_point = USHRT_MAX;
- else if (point < 0 && pl_sd->status.skill_point < -point)
- new_skill_point = 0;
- else
- new_skill_point = pl_sd->status.skill_point + point;
- if (new_skill_point != (int)pl_sd->status.skill_point) {
- pl_sd->status.skill_point = new_skill_point;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- clif_displaymessage(fd, msg_table[209]); // Character's number of skill points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Status Point (rewritten by [Yor])
- *------------------------------------------
- */
-int charcommand_stpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char player[NAME_LENGTH];
- int new_status_point;
- int point = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charstpoint <amount> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(player)) != NULL) {
- if (point > 0 && pl_sd->status.status_point > USHRT_MAX - point)
- new_status_point = USHRT_MAX;
- else if (point < 0 && pl_sd->status.status_point < -point)
- new_status_point = 0;
- else
- new_status_point = pl_sd->status.status_point + point;
- if (new_status_point != (int)pl_sd->status.status_point) {
- pl_sd->status.status_point = new_status_point;
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- clif_displaymessage(fd, msg_table[210]); // Character's number of status points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * charchangesex command (usage: charchangesex <player_name>)
- *------------------------------------------
- */
-int charcommand_changesex(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char player[NAME_LENGTH];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
- return -1;
- }
-
- // check player name
- if (strlen(player) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(player) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- chrif_char_ask_name(sd->status.account_id, player, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * Feel (SG save map) Reset
- *------------------------------------------
- */
-int charcommand_feelreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[NAME_LENGTH];
- char output[200];
- struct map_session_data *pl_sd;
-
- malloc_tsetdword(character, '\0', sizeof(character));
- malloc_tsetdword(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #feelreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
- pc_resetfeel(pl_sd);
- sprintf(output, msg_table[267], character); // '%s' designated maps reseted!
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #help - Char commands [Kayla]
- *------------------------------------------
- */
-int charcommand_help(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char buf[2048], w1[2048], w2[2048];
- int i, gm_level;
- FILE* fp;
- nullpo_retr(-1, sd);
-
- malloc_tsetdword(buf, '\0', sizeof(buf));
-
- if ((fp = fopen(charhelp_txt, "r")) != NULL) {
- clif_displaymessage(fd, msg_table[26]); /* Help commands: */
- gm_level = pc_isGM(sd);
- while(fgets(buf, sizeof(buf) - 1, fp) != NULL) {
- if (buf[0] == '/' && buf[1] == '/')
- continue;
- for (i = 0; buf[i] != '\0'; i++) {
- if (buf[i] == '\r' || buf[i] == '\n') {
- buf[i] = '\0';
- break;
- }
- }
- if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
- clif_displaymessage(fd, buf);
- else if (gm_level >= atoi(w1))
- clif_displaymessage(fd, w2);
- }
- fclose(fp);
- } else {
- clif_displaymessage(fd, msg_table[27]); /* File help.txt not found. */
- return -1;
- }
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/showmsg.h"
+
+#include "log.h"
+#include "clif.h"
+#include "chrif.h"
+#include "intif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "pc.h"
+#include "status.h"
+#include "skill.h"
+#include "mob.h"
+#include "pet.h"
+#include "battle.h"
+#include "charcommand.h"
+#include "atcommand.h"
+
+static char command_symbol = '#';
+
+extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
+
+#define CCMD_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
+CCMD_FUNC(jobchange);
+CCMD_FUNC(petrename);
+CCMD_FUNC(petfriendly);
+CCMD_FUNC(stats);
+CCMD_FUNC(option);
+CCMD_FUNC(save);
+CCMD_FUNC(stats_all);
+CCMD_FUNC(reset);
+CCMD_FUNC(spiritball);
+CCMD_FUNC(itemlist);
+CCMD_FUNC(effect);
+CCMD_FUNC(storagelist);
+CCMD_FUNC(item);
+CCMD_FUNC(warp);
+CCMD_FUNC(zeny);
+CCMD_FUNC(fakename);
+CCMD_FUNC(baselevel);
+CCMD_FUNC(joblevel);
+CCMD_FUNC(questskill);
+CCMD_FUNC(lostskill);
+CCMD_FUNC(skreset);
+CCMD_FUNC(streset);
+CCMD_FUNC(model);
+CCMD_FUNC(stpoint);
+CCMD_FUNC(skpoint);
+CCMD_FUNC(changesex);
+CCMD_FUNC(feelreset);
+CCMD_FUNC(help);
+
+
+/*==========================================
+ *CharCommandInfo charcommand_info[]\‘¢‘Ì‚Ì’è‹`
+ *------------------------------------------
+ */
+
+// First char of commands is configured in charcommand_athena.conf. Leave # in this list for default value.
+// to set default level, read charcommand_athena.conf first please.
+static CharCommandInfo charcommand_info[] = {
+ { CharCommandJobChange, "#job", 60, charcommand_jobchange },
+ { CharCommandJobChange, "#jobchange", 60, charcommand_jobchange },
+ { CharCommandPetRename, "#petrename", 50, charcommand_petrename },
+ { CharCommandPetFriendly, "#petfriendly", 50, charcommand_petfriendly },
+ { CharCommandStats, "#stats", 40, charcommand_stats },
+ { CharCommandOption, "#option", 60, charcommand_option },
+ { CharCommandReset, "#reset", 60, charcommand_reset },
+ { CharCommandSave, "#save", 60, charcommand_save },
+ { CharCommandStatsAll, "#statsall", 40, charcommand_stats_all },
+ { CharCommandSpiritball, "#spiritball", 40, charcommand_spiritball },
+ { CharCommandItemList, "#itemlist", 40, charcommand_itemlist },
+ { CharCommandEffect, "#effect", 40, charcommand_effect },
+ { CharCommandStorageList, "#storagelist", 40, charcommand_storagelist },
+ { CharCommandItem, "#item", 60, charcommand_item },
+ { CharCommandWarp, "#warp", 60, charcommand_warp },
+ { CharCommandWarp, "#rura", 60, charcommand_warp },
+ { CharCommandWarp, "#rura+", 60, charcommand_warp },
+ { CharCommandZeny, "#zeny", 60, charcommand_zeny },
+ { CharCommandFakeName, "#fakename", 20, charcommand_fakename},
+
+ //*********************************Recently added commands*********************************************
+ { CharCommandBaseLevel, "#baselvl", 20, charcommand_baselevel},
+ { CharCommandBaseLevel, "#blvl", 60, charcommand_baselevel},
+ { CharCommandBaseLevel, "#baselvlup", 60, charcommand_baselevel},
+ { CharCommandJobLevel, "#joblvl", 60, charcommand_joblevel},
+ { CharCommandJobLevel, "#jlvl", 60, charcommand_joblevel},
+ { CharCommandJobLevel, "#joblvlup", 60, charcommand_joblevel},
+ { CharCommandQuestSkill, "#questskill", 60, charcommand_questskill },
+ { CharCommandLostSkill, "#lostskill", 60, charcommand_lostskill },
+ { CharCommandSkReset, "#skreset", 60, charcommand_skreset },
+ { CharCommandStReset, "#streset", 60, charcommand_streset },
+ { CharCommandModel, "#model", 50, charcommand_model },
+ { CharCommandSKPoint, "#skpoint", 60, charcommand_skpoint },
+ { CharCommandSTPoint, "#stpoint", 60, charcommand_stpoint },
+ { CharCommandChangeSex, "#changesex", 60, charcommand_changesex },
+ { CharCommandFeelReset, "#feelreset", 60, charcommand_feelreset },
+ { CharCommandHelp, "#help", 20, charcommand_help },
+// add new commands before this line
+ { CharCommand_Unknown, NULL, 1, NULL }
+};
+
+int get_charcommand_level(const CharCommandType type) {
+ int i;
+
+ for (i = 0; charcommand_info[i].type != CharCommand_None; i++)
+ if (charcommand_info[i].type == type)
+ return charcommand_info[i].level;
+
+ return 100; // 100: command can not be used
+}
+
+CharCommandType
+charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl) {
+ CharCommandInfo info;
+ CharCommandType type;
+
+ malloc_set(&info, 0, sizeof(info));
+
+ type = charcommand(sd, gmlvl, str, &info);
+ if (type != CharCommand_None) {
+ char command[100];
+ char output[200];
+ const char* p = str;
+
+ if (map[sd->bl.m].nocommand &&
+ gmlvl < map[sd->bl.m].nocommand)
+ { //Command not allowed on this map.
+ sprintf(output, msg_txt(143));
+ clif_displaymessage(fd, output);
+ return AtCommand_None;
+ }
+
+ malloc_tsetdword(command, '\0', sizeof(command));
+ malloc_tsetdword(output, '\0', sizeof(output));
+ while (*p && !isspace(*p))
+ p++;
+ if (p - str >= sizeof(command)) // too long
+ return CharCommand_Unknown;
+ strncpy(command, str, p - str);
+ while (isspace(*p))
+ p++;
+
+ if (type == CharCommand_Unknown || info.proc == NULL) {
+ snprintf(output, sizeof(output),msg_txt(153), command); // %s is Unknown Command.
+ clif_displaymessage(fd, output);
+ } else {
+ if (info.proc(fd, sd, command, p) != 0) {
+ // Command can not be executed
+ snprintf(output, sizeof(output), msg_txt(154), command); // %s failed.
+ clif_displaymessage(fd, output);
+ }
+ }
+
+ return info.type;
+ }
+
+ return CharCommand_None;
+}
+
+/*==========================================
+ *is_charcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
+ *------------------------------------------
+ */
+CharCommandType
+is_charcommand(const int fd, struct map_session_data* sd, const char* message) {
+ const char* str = message;
+ int s_flag = 0;
+
+ nullpo_retr(CharCommand_None, sd);
+
+ if (!message || !*message)
+ return CharCommand_None;
+
+ str += strlen(sd->status.name);
+ while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
+ if (*str == ':')
+ s_flag = 1;
+ str++;
+ }
+
+ if (!*str)
+ return CharCommand_None;
+
+ return charcommand_sub(fd,sd,str,pc_isGM(sd));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+CharCommandType charcommand(struct map_session_data* sd, const int level, const char* message, CharCommandInfo* info) {
+ char* p = (char *)message;
+
+ if (!info)
+ return CharCommand_None;
+ if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
+ return CharCommand_None;
+ if (!p || !*p) {
+ ShowError("char command message is empty\n");
+ return CharCommand_None;
+ }
+
+ if(p[0] == '|')
+ p += 3;
+
+ if (*p == command_symbol) { // check first char, try to skip |00 (or something else) [Lance]
+ char command[101];
+ int i = 0;
+ malloc_set(info, 0, sizeof(CharCommandInfo));
+ sscanf(p, "%100s", command);
+ command[sizeof(command)-1] = '\0';
+
+ while (charcommand_info[i].type != CharCommand_Unknown) {
+ if (strcmpi(command+1, charcommand_info[i].command+1) == 0 && level >= charcommand_info[i].level) {
+ p[0] = charcommand_info[i].command[0]; // set correct first symbol for after.
+ break;
+ }
+ i++;
+ }
+
+ if (charcommand_info[i].type == CharCommand_Unknown) {
+ // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
+ if (level == 0)
+ return CharCommand_None;
+ else
+ return CharCommand_Unknown;
+ } else if((log_config.gm) && (charcommand_info[i].level >= log_config.gm)) {
+ log_atcommand(sd, message);
+ }
+ memcpy(info, &charcommand_info[i], sizeof charcommand_info[i]);
+ } else {
+ return CharCommand_None;
+ }
+
+ return info->type;
+}
+
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static CharCommandInfo* get_charcommandinfo_byname(const char* name) {
+ int i;
+
+ for (i = 0; charcommand_info[i].type != CharCommand_Unknown; i++)
+ if (strcmpi(charcommand_info[i].command + 1, name) == 0)
+ return &charcommand_info[i];
+
+ return NULL;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ CharCommandInfo* p;
+ FILE* fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ ShowError("CharCommands configuration file not found: %s\n", cfgName);
+ return 1;
+ }
+
+ while (fgets(line, sizeof(line)-1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2)
+ continue;
+ p = get_charcommandinfo_byname(w1);
+ if (p != NULL) {
+ p->level = atoi(w2);
+ if (p->level > 100)
+ p->level = 100;
+ else if (p->level < 0)
+ p->level = 0;
+ }
+
+ if (strcmpi(w1, "import") == 0)
+ charcommand_config_read(w2);
+ else if (strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 &&
+ w2[0] != '/' && // symbol of standard ragnarok GM commands
+ w2[0] != '%' && // symbol of party chat speaking
+ w2[0] != '$' && // symbol of guild chat speaking
+ w2[0] != '@') // symbol of atcommand
+ command_symbol = w2[0];
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ð“]E‚³‚¹‚é upperŽw’è‚Å“]¶‚â—{Žq‚à‰Â”\
+ *------------------------------------------
+ */
+int charcommand_jobchange(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data* pl_sd;
+ int job = 0, upper = -1;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
+ return -1;
+ }
+
+ if (sscanf(message, "%d %d %99[^\n]", &job, &upper, character) < 3) { //upperŽw’肵‚Ä‚ ‚é
+ upper = -1;
+ if (sscanf(message, "%d %99[^\n]", &job, character) < 2) { //upperŽw’肵‚Ä‚È‚¢ã‚ɉ½‚©‘«‚è‚È‚¢
+ clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
+ return -1;
+ }
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ int j;
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job only to lower or same level
+ if ((job >= 0 && job < MAX_PC_CLASS)) {
+ for (j=0; j < MAX_INVENTORY; j++) {
+ if(pl_sd->status.inventory[j].nameid>0 && pl_sd->status.inventory[j].equip!=0)
+ pc_unequipitem(pl_sd, j, 3);
+ }
+ if (pc_jobchange(pl_sd, job, upper) == 0)
+ clif_displaymessage(fd, msg_table[48]); // Character's job changed.
+ else {
+ clif_displaymessage(fd, msg_table[192]); // Impossible to change the character's job.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[49]); // Invalid job ID.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_petrename(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[NAME_LENGTH];
+ struct map_session_data *pl_sd;
+ struct pet_data *pd;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #petrename <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) == NULL) {
+ clif_displaymessage(fd, msg_txt(3)); // Character not found.
+ return -1;
+ }
+
+ if (!pl_sd->status.pet_id || !pl_sd->pd) {
+ clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
+ return -1;
+ }
+
+ pd = pl_sd->pd;
+
+ if (pd->pet.rename_flag) {
+ clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
+ return -1;
+ }
+ pd->pet.rename_flag = 0;
+ intif_save_petdata(pl_sd->status.account_id, &pd->pet);
+ clif_send_petstatus(pl_sd);
+ clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
+ return 0;
+}
+
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_petfriendly(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int friendly = 0;
+ char character[NAME_LENGTH];
+ struct map_session_data *pl_sd;
+ struct pet_data *pd;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ if (!message || !*message || sscanf(message,"%d %23s",&friendly,character) < 2) {
+ clif_displaymessage(fd, "Please, enter a valid value (usage: "
+ "#petfriendly <0-1000> <player>).");
+ return -1;
+ }
+
+ if (((pl_sd = map_nick2sd(character)) == NULL) ||
+ pc_isGM(sd)<pc_isGM(pl_sd)) {
+ clif_displaymessage(fd, msg_txt(3)); // Character not found.
+ return -1;
+ }
+
+ if (!pl_sd->status.pet_id || !pl_sd->pd) {
+ clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
+ return -1;
+ }
+
+ if (friendly < 0 || friendly > 1000) {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+
+ pd = pl_sd->pd;
+ if (friendly == pd->pet.intimate) {
+ clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
+ return -1;
+ }
+
+ pd->pet.intimate = friendly;
+ clif_send_petstatus(pl_sd);
+ clif_pet_emotion(pd,0);
+ clif_displaymessage(pl_sd->fd, msg_table[182]); // Pet friendly value changed!
+ clif_displaymessage(sd->fd, msg_table[182]); // Pet friendly value changed!
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_stats(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[NAME_LENGTH];
+ char job_jobname[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ malloc_tsetdword(job_jobname, '\0', sizeof(job_jobname));
+ malloc_tsetdword(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #stats <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ struct {
+ const char* format;
+ int value;
+ } output_table[] = {
+ { "Base Level - %d", 0 },
+ { NULL, 0 },
+ { "Hp - %d", 0 },
+ { "MaxHp - %d", 0 },
+ { "Sp - %d", 0 },
+ { "MaxSp - %d", 0 },
+ { "Str - %3d", 0 },
+ { "Agi - %3d", 0 },
+ { "Vit - %3d", 0 },
+ { "Int - %3d", 0 },
+ { "Dex - %3d", 0 },
+ { "Luk - %3d", 0 },
+ { "Zeny - %d", 0 },
+ { NULL, 0 }
+ };
+ //direct array initialization with variables is not standard C compliant.
+ output_table[0].value = pl_sd->status.base_level;
+ output_table[1].format = job_jobname;
+ output_table[1].value = pl_sd->status.job_level;
+ output_table[2].value = pl_sd->status.hp;
+ output_table[3].value = pl_sd->status.max_hp;
+ output_table[4].value = pl_sd->status.sp;
+ output_table[5].value = pl_sd->status.max_sp;
+ output_table[6].value = pl_sd->status.str;
+ output_table[7].value = pl_sd->status.agi;
+ output_table[8].value = pl_sd->status.vit;
+ output_table[9].value = pl_sd->status.int_;
+ output_table[10].value = pl_sd->status.dex;
+ output_table[11].value = pl_sd->status.luk;
+ output_table[12].value = pl_sd->status.zeny;
+ sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class_), "(level %d)");
+ sprintf(output, msg_table[53], pl_sd->status.name); // '%s' stats:
+ clif_displaymessage(fd, output);
+ for (i = 0; output_table[i].format != NULL; i++) {
+ sprintf(output, output_table[i].format, output_table[i].value);
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Reset
+ *------------------------------------------
+ */
+int charcommand_reset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[NAME_LENGTH];
+ char output[200];
+ struct map_session_data *pl_sd;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ malloc_tsetdword(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #reset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
+ pc_resetstate(pl_sd);
+ pc_resetskill(pl_sd,1);
+ sprintf(output, msg_table[208], character); // '%s' skill and stats points reseted!
+ clif_displaymessage(fd, output);
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_option(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[NAME_LENGTH];
+ int opt1 = 0, opt2 = 0, opt3 = 0;
+ struct map_session_data* pl_sd;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message ||
+ sscanf(message, "%d %d %d %23[^\n]", &opt1, &opt2, &opt3, character) < 4 ||
+ opt1 < 0 || opt2 < 0 || opt3 < 0) {
+ clif_displaymessage(fd, "Please, enter valid options and a player name (usage: #option <param1> <param2> <param3> <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change option only to lower or same level
+ pl_sd->sc.opt1 = opt1;
+ pl_sd->sc.opt2 = opt2;
+ pc_setoption(pl_sd, opt3);
+ clif_displaymessage(fd, msg_table[58]); // Character's options changed.
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int charcommand_save(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char map_name[MAP_NAME_LENGTH];
+ char character[NAME_LENGTH];
+ struct map_session_data* pl_sd;
+ int x = 0, y = 0;
+ int m;
+
+ malloc_tsetdword(map_name, '\0', sizeof(map_name));
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4 || x < 0 || y < 0) {
+ clif_displaymessage(fd, "Please, enter a valid save point and a player name (usage: #save <map> <x> <y> <charname>).");
+ return -1;
+ }
+
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < MAP_NAME_LENGTH-4) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change save point only to lower or same gm level
+ m = map_mapname2mapid(map_name);
+ if (m < 0 && !mapindex_name2id(map_name)) {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ } else {
+ //FIXME: What do you do if the map is in another map server with the nowarpto flag?
+ if (m>=0 && map[m].flag.nosave && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to set this map as a save map.");
+ return -1;
+ }
+ if (m>=0)
+ pc_setsavepoint(pl_sd, map[m].index, x, y);
+ else
+ pc_setsavepoint(pl_sd, mapindex_name2id(map_name), x, y);
+ clif_displaymessage(fd, msg_table[57]); // Character's respawn point changed.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+//** Character Stats All by fritz
+int charcommand_stats_all(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+ char output[1024], gmlevel[1024];
+ int i;
+ int count, users;
+ struct map_session_data *pl_sd, **pl_allsd;
+
+ malloc_tsetdword(output, '\0', sizeof(output));
+ malloc_tsetdword(gmlevel, '\0', sizeof(gmlevel));
+
+ count = 0;
+ pl_allsd = map_getallusers(&users);
+ for(i = 0; i < users; i++) {
+ if ((pl_sd = pl_allsd[i]))
+ {
+ if (pc_isGM(pl_sd) > 0)
+ sprintf(gmlevel, "| GM Lvl: %d", pc_isGM(pl_sd));
+ else
+ sprintf(gmlevel, " ");
+
+ sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level, pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp, pl_sd->status.max_sp);
+ clif_displaymessage(fd, output);
+ sprintf(output, "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s", pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit, pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk, pl_sd->status.zeny, gmlevel);
+ clif_displaymessage(fd, output);
+ clif_displaymessage(fd, "--------");
+ count++;
+ }
+ }
+
+ if (count == 0)
+ clif_displaymessage(fd, msg_table[28]); // No player found.
+ else if (count == 1)
+ clif_displaymessage(fd, msg_table[29]); // 1 player found.
+ else {
+ sprintf(output, msg_table[30], count); // %d players found.
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * CharSpiritBall Function by PalasX
+ *------------------------------------------
+ */
+int charcommand_spiritball(const int fd, struct map_session_data* sd,const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[NAME_LENGTH];
+ int spirit = 0;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if(!message || !*message || sscanf(message, "%d %23[^\n]", &spirit, character) < 2 || spirit < 0 || spirit > 1000) {
+ clif_displaymessage(fd, "Usage: @spiritball <number: 0-1000>) <CHARACTER_NAME>.");
+ return -1;
+ }
+
+ if((pl_sd = map_nick2sd(character)) != NULL) {
+ if (spirit >= 0 && spirit <= 0x7FFF) {
+ if (pl_sd->spiritball != spirit || spirit > 999) {
+ if (pl_sd->spiritball > 0)
+ pc_delspiritball(pl_sd, pl_sd->spiritball, 1);
+ pl_sd->spiritball = spirit;
+ clif_spiritball(pl_sd);
+ // no message, player can look the difference
+ if (spirit > 1000)
+ clif_displaymessage(fd, msg_table[204]); // WARNING: more than 1000 spiritballs can CRASH your server and/or client!
+ } else {
+ clif_displaymessage(fd, msg_table[205]); // You already have this number of spiritballs.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * #itemlist <character>: Displays the list of a player's items.
+ *------------------------------------------
+ */
+int
+charcommand_itemlist(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ struct item_data *item_data, *item_temp;
+ int i, j, equip, count, counter, counter2;
+ char character[NAME_LENGTH], output[200], equipstr[100], outputtmp[200];
+ struct item *i_item; //Current inventory item.
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ malloc_tsetdword(output, '\0', sizeof(output));
+ malloc_tsetdword(equipstr, '\0', sizeof(equipstr));
+ malloc_tsetdword(outputtmp, '\0', sizeof(outputtmp));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
+ counter = 0;
+ count = 0;
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ i_item = &pl_sd->status.inventory[i];
+ if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_exists(i_item->nameid)) != NULL) {
+ counter = counter + i_item->amount;
+ count++;
+ if (count == 1) {
+ sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
+ clif_displaymessage(fd, output);
+ }
+ if ((equip = i_item->equip)) {
+ strcpy(equipstr, "| equiped: ");
+ if (equip & EQP_GARMENT)
+ strcat(equipstr, "robe/gargment, ");
+ if (equip & EQP_ACC_L)
+ strcat(equipstr, "left accessory, ");
+ if (equip & EQP_ARMOR)
+ strcat(equipstr, "body/armor, ");
+ if ((equip & EQP_ARMS) == EQP_HAND_R)
+ strcat(equipstr, "right hand, ");
+ if ((equip & EQP_ARMS) == EQP_HAND_L)
+ strcat(equipstr, "left hand, ");
+ if ((equip & EQP_ARMS) == EQP_ARMS)
+ strcat(equipstr, "both hands, ");
+ if (equip & EQP_SHOES)
+ strcat(equipstr, "feet, ");
+ if (equip & EQP_ACC_R)
+ strcat(equipstr, "right accessory, ");
+ if ((equip & EQP_HELM) == EQP_HEAD_LOW)
+ strcat(equipstr, "lower head, ");
+ if ((equip & EQP_HELM) == EQP_HEAD_TOP)
+ strcat(equipstr, "top head, ");
+ if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_TOP))
+ strcat(equipstr, "lower/top head, ");
+ if ((equip & EQP_HELM) == EQP_HEAD_MID)
+ strcat(equipstr, "mid head, ");
+ if ((equip & EQP_HELM) == (EQP_HEAD_LOW|EQP_HEAD_MID))
+ strcat(equipstr, "lower/mid head, ");
+ if ((equip & EQP_HELM) == EQP_HELM)
+ strcat(equipstr, "lower/mid/top head, ");
+ // remove final ', '
+ equipstr[strlen(equipstr) - 2] = '\0';
+ } else
+ malloc_tsetdword(equipstr, '\0', sizeof(equipstr));
+ if (i_item->refine)
+ sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", i_item->amount, item_data->name, i_item->refine, item_data->jname, i_item->refine, i_item->nameid, equipstr);
+ else
+ sprintf(output, "%d %s (%s, id: %d) %s", i_item->amount, item_data->name, item_data->jname, i_item->nameid, equipstr);
+ clif_displaymessage(fd, output);
+ malloc_tsetdword(output, '\0', sizeof(output));
+ counter2 = 0;
+
+ if(i_item->card[0]==CARD0_PET) { //pet eggs
+ if (i_item->card[3])
+ sprintf(outputtmp, " -> (pet egg, pet id: %u, named)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
+ else
+ sprintf(outputtmp, " -> (pet egg, pet id: %u, unnamed)", (unsigned int)MakeDWord(i_item->card[1], i_item->card[2]));
+ strcat(output, outputtmp);
+ } else
+ if(i_item->card[0]==CARD0_FORGE) { //forged items.
+ sprintf(outputtmp, " -> (crafted item, creator id: %u, star crumbs %d, element %d)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]), i_item->card[1]>>8, i_item->card[1]&0x0f);
+ } else
+ if(i_item->card[0]==CARD0_CREATE) { //created items.
+ sprintf(outputtmp, " -> (produced item, creator id: %u)", (unsigned int)MakeDWord(i_item->card[2], i_item->card[3]));
+ strcat(output, outputtmp);
+ } else //Normal slots
+ for (j = 0; j < item_data->slot; j++) {
+ if (pl_sd->status.inventory[i].card[j]) {
+ if ((item_temp = itemdb_exists(i_item->card[j])) != NULL) {
+ if (output[0] == '\0')
+ sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
+ else
+ sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
+ strcat(output, outputtmp);
+ }
+ }
+ }
+ if (output[0] != '\0') {
+ output[strlen(output) - 2] = ')';
+ output[strlen(output) - 1] = '\0';
+ clif_displaymessage(fd, output);
+ }
+ }
+ }
+ if (count == 0)
+ clif_displaymessage(fd, "No item found on this player.");
+ else {
+ sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * #effect by [MouseJstr]
+ *
+ * Create a effect localized on another character
+ *------------------------------------------
+ */
+int
+charcommand_effect(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+ char target[255];
+ int type = 0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) {
+ clif_displaymessage(fd, "usage: #effect <type+> <target>.");
+ return -1;
+ }
+
+ if((pl_sd=map_nick2sd((char *) target)) == NULL)
+ return -1;
+
+ clif_specialeffect(&pl_sd->bl, type, AREA);
+ clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
+
+ return 0;
+}
+
+/*==========================================
+ * #storagelist <character>: Displays the items list of a player's storage.
+ *------------------------------------------
+ */
+int
+charcommand_storagelist(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct storage *stor;
+ struct map_session_data *pl_sd;
+ struct item_data *item_data, *item_temp;
+ int i, j, count, counter, counter2;
+ char character[NAME_LENGTH], output[200], outputtmp[200];
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ malloc_tsetdword(output, '\0', sizeof(output));
+ malloc_tsetdword(outputtmp, '\0', sizeof(outputtmp));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
+ if((stor = account2storage2(pl_sd->status.account_id)) != NULL) {
+ counter = 0;
+ count = 0;
+ for (i = 0; i < MAX_STORAGE; i++) {
+ if (stor->storage_[i].nameid > 0 && (item_data = itemdb_search(stor->storage_[i].nameid)) != NULL) {
+ counter = counter + stor->storage_[i].amount;
+ count++;
+ if (count == 1) {
+ sprintf(output, "------ Storage items list of '%s' ------", pl_sd->status.name);
+ clif_displaymessage(fd, output);
+ }
+ if (stor->storage_[i].refine)
+ sprintf(output, "%d %s %+d (%s %+d, id: %d)", stor->storage_[i].amount, item_data->name, stor->storage_[i].refine, item_data->jname, stor->storage_[i].refine, stor->storage_[i].nameid);
+ else
+ sprintf(output, "%d %s (%s, id: %d)", stor->storage_[i].amount, item_data->name, item_data->jname, stor->storage_[i].nameid);
+ clif_displaymessage(fd, output);
+ malloc_tsetdword(output, '\0', sizeof(output));
+ counter2 = 0;
+ for (j = 0; j < item_data->slot; j++) {
+ if (stor->storage_[i].card[j]) {
+ if ((item_temp = itemdb_search(stor->storage_[i].card[j])) != NULL) {
+ if (output[0] == '\0')
+ sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
+ else
+ sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
+ strcat(output, outputtmp);
+ }
+ }
+ }
+ if (output[0] != '\0') {
+ output[strlen(output) - 2] = ')';
+ output[strlen(output) - 1] = '\0';
+ clif_displaymessage(fd, output);
+ }
+ }
+ }
+ if (count == 0)
+ clif_displaymessage(fd, "No item found in the storage of this player.");
+ else {
+ sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, "This player has no storage.");
+ return 0;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+static void
+charcommand_giveitem_sub(struct map_session_data *sd,struct item_data *item_data,int number)
+{
+ int flag = 0;
+ int loop = 1, get_count = number,i;
+ struct item item_tmp;
+
+ if(sd && item_data){
+ if (item_data->type == 4 || item_data->type == 5 ||
+ item_data->type == 7 || item_data->type == 8) {
+ loop = number;
+ get_count = 1;
+ }
+ for (i = 0; i < loop; i++) {
+ malloc_set(&item_tmp, 0, sizeof(item_tmp));
+ item_tmp.nameid = item_data->nameid;
+ item_tmp.identify = 1;
+
+ if ((flag = pc_additem((struct map_session_data*)sd,
+ &item_tmp, get_count)))
+ clif_additem((struct map_session_data*)sd, 0, 0, flag);
+ }
+ //Logs (A)dmins items [Lupus]
+ if(log_config.enable_logs&0x400)
+ log_pick_pc(sd, "A", item_tmp.nameid, number, &item_tmp);
+
+ }
+}
+/*==========================================
+ * #item command (usage: #item <name/id_of_item> <quantity> <player>)
+ * by MC Cameri
+ *------------------------------------------
+ */
+int charcommand_item(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char item_name[100];
+ char character[NAME_LENGTH];
+ struct map_session_data *pl_sd;
+ int number = 0, item_id, flag;
+ struct item item_tmp;
+ struct item_data *item_data;
+ int get_count, i, pet_id;
+ char tmp_cmdoutput[1024];
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(item_name, '\0', sizeof(item_name));
+
+ if (!message || !*message || sscanf(message, "%99s %d %23[^\n]", item_name, &number, character) < 3) {
+ clif_displaymessage(fd, "Please, enter an item name/id (usage: #item <item name or ID> <quantity> <char name>).");
+ return -1;
+ }
+
+ if (number <= 0)
+ number = 1;
+
+ item_id = 0;
+ if ((item_data = itemdb_searchname(item_name)) != NULL ||
+ (item_data = itemdb_exists(atoi(item_name))) != NULL)
+ item_id = item_data->nameid;
+
+ if (item_id >= 500) {
+ get_count = number;
+ // check pet egg
+ pet_id = search_petDB_index(item_id, PET_EGG);
+ if (item_data->type == 4 || item_data->type == 5 ||
+ item_data->type == 7 || item_data->type == 8) {
+ get_count = 1;
+ }
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
+ for (i = 0; i < number; i += get_count) {
+ // if pet egg
+ if (pet_id >= 0) {
+ pl_sd->catch_target_class = pet_db[pet_id].class_;
+ intif_create_pet(pl_sd->status.account_id, pl_sd->status.char_id,
+ (short)pet_db[pet_id].class_, (short)mob_db(pet_db[pet_id].class_)->lv,
+ (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
+ 100, 0, 1, pet_db[pet_id].jname);
+ // if not pet egg
+ } else {
+ malloc_set(&item_tmp, 0, sizeof(item_tmp));
+ item_tmp.nameid = item_id;
+ item_tmp.identify = 1;
+
+ if ((flag = pc_additem(pl_sd, &item_tmp, get_count)))
+ clif_additem(pl_sd, 0, 0, flag);
+ }
+ }
+
+ //Logs (A)dmins items [Lupus]
+ if(log_config.enable_logs&0x400)
+ log_pick_pc(sd, "A", item_tmp.nameid, number, &item_tmp);
+
+ clif_displaymessage(fd, msg_table[18]); // Item created.
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else if(/* from jA's @giveitem */strcmpi(character,"all")==0 || strcmpi(character,"everyone")==0){
+ struct map_session_data **pl_allsd;
+ int users;
+ pl_allsd = map_getallusers(&users);
+ for (i = 0; i < users; i++) {
+ if ((pl_sd = pl_allsd[i])) {
+ charcommand_giveitem_sub(pl_sd,item_data,number);
+ snprintf(tmp_cmdoutput, sizeof(tmp_cmdoutput), "You got %s %d.", item_name,number);
+ clif_displaymessage(pl_sd->fd, tmp_cmdoutput);
+ }
+ }
+ snprintf(tmp_cmdoutput, sizeof(tmp_cmdoutput), "%s received %s %d.","Everyone",item_name,number);
+ clif_displaymessage(fd, tmp_cmdoutput);
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * #warp/#rura/#rura+ <mapname> <x> <y> <char name>
+ *------------------------------------------
+ */
+int charcommand_warp(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char map_name[MAP_NAME_LENGTH];
+ char character[NAME_LENGTH];
+ int x = 0, y = 0;
+ struct map_session_data *pl_sd;
+ int m;
+
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(map_name, '\0', sizeof(map_name));
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%15s %d %d %23[^\n]", map_name, &x, &y, character) < 4) {
+ clif_displaymessage(fd, "Usage: #warp/#rura/#rura+ <mapname> <x> <y> <char name>");
+ return -1;
+ }
+
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < MAP_NAME_LENGTH-4) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+
+ if ((pl_sd = map_nick2sd(character)) == NULL) {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+ if (pc_isGM(sd) < pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ m = map_mapname2mapid(map_name);
+ if (m < 0) {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+ if ((x || y) && map_getcell(m, x, y, CELL_CHKNOREACH)) {
+ clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
+ x = y = 0;
+ }
+ if (map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp someone to this map.");
+ return -1;
+ }
+ if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp this player from its actual map.");
+ return -1;
+ }
+ if (pc_setpos(pl_sd, map[m].index, x, y, 3) == 0) {
+ clif_displaymessage(pl_sd->fd, msg_table[0]); // Warped.
+ clif_displaymessage(fd, msg_table[15]); // Player warped (message sends to player too).
+ return 0;
+ }
+ //No error message specified...?
+ return -1;
+}
+
+/*==========================================
+ * #zeny <charname>
+ *------------------------------------------
+ */
+int charcommand_zeny(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[NAME_LENGTH];
+ int zeny = 0, new_zeny;
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &zeny, character) < 2 || zeny == 0) {
+ clif_displaymessage(fd, "Please, enter a number and a player name (usage: #zeny <zeny> <name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ new_zeny = pl_sd->status.zeny + zeny;
+ if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
+ new_zeny = MAX_ZENY;
+ else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow
+ new_zeny = 0;
+ if (new_zeny != pl_sd->status.zeny) {
+ pl_sd->status.zeny = new_zeny;
+ clif_updatestatus(pl_sd, SP_ZENY);
+ clif_displaymessage(fd, msg_table[211]); // Character's number of zenys changed!
+ } else {
+ if (zeny < 0)
+ clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
+ else
+ clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * #fakename <char name> <fake name>
+ *------------------------------------------
+ */
+
+int charcommand_fakename(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char name[NAME_LENGTH];
+ char char_name[NAME_LENGTH];
+
+ nullpo_retr(-1, sd);
+
+ name[0] = '\0'; //If you don't pass a second word, name is left as garbage, most definitely not a blank name! [Skotlex]
+ if (!message || !*message || sscanf(message, "%23s %23[^\n]", char_name, name) < 1) {
+ clif_displaymessage(sd->fd,"Usage: #fakename <char name> <fake name>.");
+ clif_displaymessage(sd->fd,"Or: #fakename <char name> to disable.");
+ return 0;
+ }
+
+ if(!(pl_sd = map_nick2sd(char_name))) {
+ clif_displaymessage(sd->fd,"Character not found.");
+ return -1;
+ }
+
+ if(strlen(name) < 1 || !name) {
+ if(strlen(pl_sd->fakename) > 1) {
+ pl_sd->fakename[0]='\0';
+ clif_charnameack(0, &pl_sd->bl);
+ clif_displaymessage(sd->fd,"Returned to real name.");
+ } else {
+ clif_displaymessage(sd->fd,"Character does not has a fake name.");
+ }
+ return 0;
+ }
+
+ if(strlen(name) < 2) {
+ clif_displaymessage(sd->fd,"Fake name must be at least two characters.");
+ return 0;
+ }
+
+ memcpy(pl_sd->fakename,name, NAME_LENGTH-1);
+ clif_charnameack(0, &pl_sd->bl);
+ clif_displaymessage(sd->fd,"Fake name enabled.");
+
+ return 0;
+}
+
+
+/*==========================================
+ * #baselvl <#> <nickname>
+ * Transferred by: Kevin
+ *------------------------------------------
+*/
+int charcommand_baselevel(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int level = 0, i, status_point=0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: #baselvl <#> <nickname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change base level only lower or same gm level
+
+ if (level > 0) {
+ if (pl_sd->status.base_level == pc_maxbaselv(sd)) { // check for max level by Valaris
+ clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher.
+ return 0;
+ } // End Addition
+ if ((unsigned int)level > pc_maxbaselv(pl_sd) ||
+ pl_sd->status.base_level > pc_maxbaselv(pl_sd) -level)
+ level = pc_maxbaselv(pl_sd) - pl_sd->status.base_level;
+ for (i = 1; i <= level; i++)
+ status_point += (pl_sd->status.base_level + i + 14) / 5;
+ if (pl_sd->status.status_point > USHRT_MAX - status_point)
+ pl_sd->status.status_point = USHRT_MAX;
+ else
+ pl_sd->status.status_point += status_point;
+ pl_sd->status.base_level += (unsigned int)level;
+ clif_updatestatus(pl_sd, SP_BASELEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
+ clif_updatestatus(pl_sd, SP_STATUSPOINT);
+ status_calc_pc(pl_sd, 0);
+ status_percent_heal(&pl_sd->bl, 100, 100);
+ clif_misceffect(&pl_sd->bl, 0);
+ clif_displaymessage(fd, msg_table[65]); // Character's base level raised.
+ } else {
+ if (pl_sd->status.base_level == 1) {
+ clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower.
+ return -1;
+ }
+ level *= -1;
+ if ((unsigned int)level >= pl_sd->status.base_level)
+ level = pl_sd->status.base_level -1;
+ if (pl_sd->status.status_point > 0) {
+ for (i = 0; i > -level; i--)
+ status_point += (pl_sd->status.base_level +i + 14) / 5;
+ if (pl_sd->status.status_point < status_point)
+ pc_resetstate(pl_sd);
+ if (pl_sd->status.status_point < status_point)
+ pl_sd->status.status_point = 0;
+ else
+ pl_sd->status.status_point -= status_point;
+ clif_updatestatus(pl_sd, SP_STATUSPOINT);
+ } // to add: remove status points from stats
+ pl_sd->status.base_level -= (unsigned int)level;
+ clif_updatestatus(pl_sd, SP_BASELEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
+ status_calc_pc(pl_sd, 0);
+ clif_displaymessage(fd, msg_table[66]); // Character's base level lowered.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0; //³íI—¹
+}
+
+/*==========================================
+ * #jlvl <#> <nickname>
+ * Transferred by: Kevin
+ *------------------------------------------
+ */
+int charcommand_joblevel(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int level = 0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &level, player) < 2 || level == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: #joblvl <#> <nickname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
+ if (level > 0) {
+ if (pl_sd->status.job_level == pc_maxjoblv(pl_sd)) {
+ clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher.
+ return -1;
+ }
+ if ((unsigned int)level > pc_maxjoblv(pl_sd) ||
+ pl_sd->status.job_level > pc_maxjoblv(pl_sd) -level)
+ level = pc_maxjoblv(pl_sd) - pl_sd->status.job_level;
+ pl_sd->status.job_level += (unsigned int)level;
+ clif_updatestatus(pl_sd, SP_JOBLEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
+
+ if (pl_sd->status.skill_point > USHRT_MAX - level)
+ pl_sd->status.skill_point = USHRT_MAX;
+ else
+ pl_sd->status.skill_point += level;
+ clif_updatestatus(pl_sd, SP_SKILLPOINT);
+ status_calc_pc(pl_sd, 0);
+ clif_misceffect(&pl_sd->bl, 1);
+ clif_displaymessage(fd, msg_table[68]); // character's job level raised.
+ } else {
+ if (pl_sd->status.job_level == 1) {
+ clif_displaymessage(fd, msg_table[194]); // Character's job level can't go any lower.
+ return -1;
+ }
+ level*=-1;
+ if ((unsigned int)level >= pl_sd->status.job_level)
+ level = pl_sd->status.job_level-1;
+ pl_sd->status.job_level -= (unsigned int)level;
+ clif_updatestatus(pl_sd, SP_JOBLEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
+ if (pl_sd->status.skill_point < level)
+ pc_resetskill(pl_sd, 0); //Need more skill points to substract
+ if (pl_sd->status.skill_point < level)
+ pl_sd->status.skill_point = 0;
+ else
+ pl_sd->status.skill_point -= level;
+ clif_updatestatus(pl_sd, SP_SKILLPOINT);
+ status_calc_pc(pl_sd, 0);
+ clif_displaymessage(fd, msg_table[69]); // Character's job level lowered.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*==========================================
+ * #questskill <skill_#> <nickname>
+ * Transferred by: Kevin
+ *------------------------------------------
+ */
+int charcommand_questskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int skill_id = 0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
+ clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: #questskill <#:0+> <nickname>).");
+ return -1;
+ }
+
+ if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
+ if (skill_get_inf2(skill_id) & INF2_QUEST_SKILL) {
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_checkskill(pl_sd, skill_id) == 0) {
+ pc_skill(pl_sd, skill_id, 1, 0);
+ clif_displaymessage(fd, msg_table[199]); // This player has learned the skill.
+ } else {
+ clif_displaymessage(fd, msg_table[200]); // This player already has this quest skill.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*==========================================
+ * #lostskill <skill_#> <nickname>
+ * Transferred by: Kevin
+ *------------------------------------------
+ */
+int charcommand_lostskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int skill_id = 0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &skill_id, player) < 2 || skill_id < 0) {
+ clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>).");
+ return -1;
+ }
+
+ if (skill_id >= 0 && skill_id < MAX_SKILL) {
+ if (skill_get_inf2(skill_id) & INF2_QUEST_SKILL) {
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_checkskill(pl_sd, skill_id) > 0) {
+ pl_sd->status.skill[skill_id].lv = 0;
+ pl_sd->status.skill[skill_id].flag = 0;
+ clif_skillinfoblock(pl_sd);
+ clif_displaymessage(fd, msg_table[202]); // This player has forgotten the skill.
+ } else {
+ clif_displaymessage(fd, msg_table[203]); // This player doesn't have this quest skill.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Skill Reset
+ *------------------------------------------
+ */
+int charcommand_skreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ char tmp_cmdoutput[1024];
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
+ pc_resetskill(pl_sd,1);
+ sprintf(tmp_cmdoutput, msg_table[206], player); // '%s' skill points reseted!
+ clif_displaymessage(fd, tmp_cmdoutput);
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Stat Reset
+ *------------------------------------------
+ */
+int charcommand_streset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ char tmp_cmdoutput[1024];
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset stats points only lower or same gm level
+ pc_resetstate(pl_sd);
+ sprintf(tmp_cmdoutput, msg_table[207], player); // '%s' stats points reseted!
+ clif_displaymessage(fd, tmp_cmdoutput);
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Model by chbrules
+ *------------------------------------------
+ */
+int charcommand_model(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int hair_style = 0, hair_color = 0, cloth_color = 0;
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ char tmp_cmdoutput[1024];
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %d %d %23[^\n]", &hair_style, &hair_color, &cloth_color, player) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
+ sprintf(tmp_cmdoutput, "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
+ MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, tmp_cmdoutput);
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
+ hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
+ cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
+ /* Removed this check for being too strange. [Skotlex]
+ if (cloth_color != 0 &&
+ pl_sd->status.sex == 1 &&
+ (pl_sd->status.class_ == JOB_ASSASSIN || pl_sd->status.class_ == JOB_ROGUE)) {
+ clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
+ return -1;
+ } else {
+ */
+ pc_changelook(pl_sd, LOOK_HAIR, hair_style);
+ pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color);
+ pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
+ clif_displaymessage(fd, msg_table[36]); // Appearence changed.
+// }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Skill Point (Rewritten by [Yor])
+ *------------------------------------------
+ */
+int charcommand_skpoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int new_skill_point;
+ int point = 0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
+ clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charskpoint <amount> <name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (point > 0 && pl_sd->status.skill_point > USHRT_MAX - point)
+ new_skill_point = USHRT_MAX;
+ else if (point < 0 && pl_sd->status.skill_point < -point)
+ new_skill_point = 0;
+ else
+ new_skill_point = pl_sd->status.skill_point + point;
+ if (new_skill_point != (int)pl_sd->status.skill_point) {
+ pl_sd->status.skill_point = new_skill_point;
+ clif_updatestatus(pl_sd, SP_SKILLPOINT);
+ clif_displaymessage(fd, msg_table[209]); // Character's number of skill points changed!
+ } else {
+ if (point < 0)
+ clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
+ else
+ clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Character Status Point (rewritten by [Yor])
+ *------------------------------------------
+ */
+int charcommand_stpoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char player[NAME_LENGTH];
+ int new_status_point;
+ int point = 0;
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%d %23[^\n]", &point, player) < 2 || point == 0) {
+ clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charstpoint <amount> <name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(player)) != NULL) {
+ if (point > 0 && pl_sd->status.status_point > USHRT_MAX - point)
+ new_status_point = USHRT_MAX;
+ else if (point < 0 && pl_sd->status.status_point < -point)
+ new_status_point = 0;
+ else
+ new_status_point = pl_sd->status.status_point + point;
+ if (new_status_point != (int)pl_sd->status.status_point) {
+ pl_sd->status.status_point = new_status_point;
+ clif_updatestatus(pl_sd, SP_STATUSPOINT);
+ clif_displaymessage(fd, msg_table[210]); // Character's number of status points changed!
+ } else {
+ if (point < 0)
+ clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
+ else
+ clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * charchangesex command (usage: charchangesex <player_name>)
+ *------------------------------------------
+ */
+int charcommand_changesex(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char player[NAME_LENGTH];
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", player) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
+ return -1;
+ }
+
+ // check player name
+ if (strlen(player) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(player) > 23) {
+ clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
+ return -1;
+ } else {
+ chrif_char_ask_name(sd->status.account_id, player, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
+ clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Feel (SG save map) Reset
+ *------------------------------------------
+ */
+int charcommand_feelreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[NAME_LENGTH];
+ char output[200];
+ struct map_session_data *pl_sd;
+
+ malloc_tsetdword(character, '\0', sizeof(character));
+ malloc_tsetdword(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%23[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: #feelreset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
+ pc_resetfeel(pl_sd);
+ sprintf(output, msg_table[267], character); // '%s' designated maps reseted!
+ clif_displaymessage(fd, output);
+ } else {
+ clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * #help - Char commands [Kayla]
+ *------------------------------------------
+ */
+int charcommand_help(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char buf[2048], w1[2048], w2[2048];
+ int i, gm_level;
+ FILE* fp;
+ nullpo_retr(-1, sd);
+
+ malloc_tsetdword(buf, '\0', sizeof(buf));
+
+ if ((fp = fopen(charhelp_txt, "r")) != NULL) {
+ clif_displaymessage(fd, msg_table[26]); /* Help commands: */
+ gm_level = pc_isGM(sd);
+ while(fgets(buf, sizeof(buf) - 1, fp) != NULL) {
+ if (buf[0] == '/' && buf[1] == '/')
+ continue;
+ for (i = 0; buf[i] != '\0'; i++) {
+ if (buf[i] == '\r' || buf[i] == '\n') {
+ buf[i] = '\0';
+ break;
+ }
+ }
+ if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
+ clif_displaymessage(fd, buf);
+ else if (gm_level >= atoi(w1))
+ clif_displaymessage(fd, w2);
+ }
+ fclose(fp);
+ } else {
+ clif_displaymessage(fd, msg_table[27]); /* File help.txt not found. */
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/map/charcommand.h b/src/map/charcommand.h
index 2f75f75c5..54215257e 100644
--- a/src/map/charcommand.h
+++ b/src/map/charcommand.h
@@ -1,74 +1,74 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHARCOMMAND_H_
-#define _CHARCOMMAND_H_
-
-enum CharCommandType {
- CharCommand_None = -1,
- CharCommandJobChange,
- CharCommandPetRename,
- CharCommandPetFriendly,
- CharCommandReset,
- CharCommandStats,
- CharCommandOption,
- CharCommandSave,
- CharCommandStatsAll,
- CharCommandSpiritball,
- CharCommandItemList,
- CharCommandEffect,
- CharCommandStorageList,
- CharCommandItem, // by MC Cameri
- CharCommandWarp,
- CharCommandZeny,
- CharCommandFakeName,
- CharCommandBaseLevel,
- CharCommandJobLevel,
- CharCommandQuestSkill,
- CharCommandLostSkill,
- CharCommandSkReset,
- CharCommandStReset,
- CharCommandModel,
- CharCommandSKPoint,
- CharCommandSTPoint,
- CharCommandChangeSex,
- CharCommandFeelReset, // Komurka
- CharCommandHelp,
-
-#ifdef TXT_ONLY
-/* TXT_ONLY */
-
-/* TXT_ONLY */
-#else
-/* SQL-only */
-
-/* SQL Only */
-#endif
-
- // End. No more commans after this line.
- CharCommand_Unknown,
- CharCommand_MAX
-};
-
-typedef enum CharCommandType CharCommandType;
-typedef struct CharCommandInfo {
- CharCommandType type;
- const char* command;
- int level;
- int (*proc)(const int, struct map_session_data*,
- const char* command, const char* message);
-} CharCommandInfo;
-
-CharCommandType
-is_charcommand(const int fd, struct map_session_data* sd, const char* message);
-CharCommandType
-charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
-
-CharCommandType charcommand(
- struct map_session_data* sd, const int level, const char* message, CharCommandInfo* info);
-int get_charcommand_level(const CharCommandType type);
-
-int charcommand_config_read(const char *cfgName);
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CHARCOMMAND_H_
+#define _CHARCOMMAND_H_
+
+enum CharCommandType {
+ CharCommand_None = -1,
+ CharCommandJobChange,
+ CharCommandPetRename,
+ CharCommandPetFriendly,
+ CharCommandReset,
+ CharCommandStats,
+ CharCommandOption,
+ CharCommandSave,
+ CharCommandStatsAll,
+ CharCommandSpiritball,
+ CharCommandItemList,
+ CharCommandEffect,
+ CharCommandStorageList,
+ CharCommandItem, // by MC Cameri
+ CharCommandWarp,
+ CharCommandZeny,
+ CharCommandFakeName,
+ CharCommandBaseLevel,
+ CharCommandJobLevel,
+ CharCommandQuestSkill,
+ CharCommandLostSkill,
+ CharCommandSkReset,
+ CharCommandStReset,
+ CharCommandModel,
+ CharCommandSKPoint,
+ CharCommandSTPoint,
+ CharCommandChangeSex,
+ CharCommandFeelReset, // Komurka
+ CharCommandHelp,
+
+#ifdef TXT_ONLY
+/* TXT_ONLY */
+
+/* TXT_ONLY */
+#else
+/* SQL-only */
+
+/* SQL Only */
+#endif
+
+ // End. No more commans after this line.
+ CharCommand_Unknown,
+ CharCommand_MAX
+};
+
+typedef enum CharCommandType CharCommandType;
+typedef struct CharCommandInfo {
+ CharCommandType type;
+ const char* command;
+ int level;
+ int (*proc)(const int, struct map_session_data*,
+ const char* command, const char* message);
+} CharCommandInfo;
+
+CharCommandType
+is_charcommand(const int fd, struct map_session_data* sd, const char* message);
+CharCommandType
+charcommand_sub(const int fd, struct map_session_data* sd, const char* str, int gmlvl);
+
+CharCommandType charcommand(
+ struct map_session_data* sd, const int level, const char* message, CharCommandInfo* info);
+int get_charcommand_level(const CharCommandType type);
+
+int charcommand_config_read(const char *cfgName);
+
+#endif
+
diff --git a/src/map/charsave.c b/src/map/charsave.c
index 1be249e5a..abcd7d152 100644
--- a/src/map/charsave.c
+++ b/src/map/charsave.c
@@ -1,523 +1,523 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/mmo.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
-
-#include "charsave.h"
-#include "map.h"
-
-#ifndef TXT_ONLY
-
-struct mmo_charstatus *charsave_loadchar(int charid){
- int i,j, friends;
- struct mmo_charstatus *c;
- char *str_p;
- double exp;
- friends = 0;
-
- c = (struct mmo_charstatus *)aCalloc(1,sizeof(struct mmo_charstatus));
-
- if(charid <= 0){
- ShowError("charsave_loadchar() charid <= 0! (%d)", charid);
- aFree(c);
- return NULL;
- }
- // add homun_id [albator]
- //Tested, Mysql 4.1.9+ has no problems with the long query, the buf is 65k big and the sql server needs for it 0.00009 secs on an athlon xp 2400+ WinXP (1GB Mem) .. [Sirius]
- sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, `str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`, `clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, `last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id`, `father`, `mother`, `child`, `fame`, `homun_id` FROM `char` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(mysql_num_rows(charsql_res) <= 0){
- ShowWarning("charsave_loadchar() -> CHARACTER NOT FOUND! (id: %d)\n", charid);
- mysql_free_result(charsql_res);
- aFree(c);
- return NULL;
- }
-
- //fetch data
- charsql_row = mysql_fetch_row(charsql_res);
-
- //fill with data
- c->char_id = charid;
- c->account_id = atoi(charsql_row[1]);
- c->char_num = atoi(charsql_row[2]);
- strcpy(c->name, charsql_row[3]);
- c->class_ = atoi(charsql_row[4]);
- c->base_level = atoi(charsql_row[5]);
- c->job_level = atoi(charsql_row[6]);
- exp = atof(charsql_row[7]);
- c->base_exp = (unsigned int)cap_value(exp,0,UINT_MAX);
- exp = atof(charsql_row[8]);
- c->job_exp = (unsigned int)cap_value(exp,0,UINT_MAX);
- c->zeny = atoi(charsql_row[9]);
- c->str = atoi(charsql_row[10]);
- c->agi = atoi(charsql_row[11]);
- c->vit = atoi(charsql_row[12]);
- c->int_ = atoi(charsql_row[13]);
- c->dex = atoi(charsql_row[14]);
- c->luk = atoi(charsql_row[15]);
- c->max_hp = atoi(charsql_row[16]);
- c->hp = atoi(charsql_row[17]);
- c->max_sp = atoi(charsql_row[18]);
- c->sp = atoi(charsql_row[19]);
- c->status_point = atoi(charsql_row[20]) > USHRT_MAX? USHRT_MAX : atoi(charsql_row[20]);
- c->skill_point = atoi(charsql_row[21]) > USHRT_MAX? USHRT_MAX : atoi(charsql_row[21]);
- c->option = atoi(charsql_row[22]);
- c->karma = atoi(charsql_row[23]);
- c->manner = atoi(charsql_row[24]);
- c->party_id = atoi(charsql_row[25]);
- c->guild_id = atoi(charsql_row[26]);
- c->pet_id = atoi(charsql_row[27]);
- c->hair = atoi(charsql_row[28]);
- c->hair_color = atoi(charsql_row[29]);
- c->clothes_color = atoi(charsql_row[30]);
- c->weapon = atoi(charsql_row[31]);
- c->shield = atoi(charsql_row[32]);
- c->head_top = atoi(charsql_row[33]);
- c->head_mid = atoi(charsql_row[34]);
- c->head_bottom = atoi(charsql_row[35]);
- c->last_point.map = mapindex_name2id(charsql_row[36]);
- c->last_point.x = atoi(charsql_row[37]);
- c->last_point.y = atoi(charsql_row[38]);
- c->save_point.map = mapindex_name2id(charsql_row[39]);
- c->save_point.x = atoi(charsql_row[40]);
- c->save_point.y = atoi(charsql_row[41]);
- c->partner_id = atoi(charsql_row[42]);
- c->father = atoi(charsql_row[43]);
- c->mother = atoi(charsql_row[44]);
- c->child = atoi(charsql_row[45]);
- c->fame = atoi(charsql_row[46]);
- c->hom_id = atoi(charsql_row[47]); // albator
-
- mysql_free_result(charsql_res);
-
- //Check for '0' Savepoint / LastPoint
- if (c->last_point.x == 0 || c->last_point.y == 0 || c->last_point.map == 0){
- c->last_point.map = mapindex_name2id(MAP_PRONTERA);
- c->last_point.x = 100;
- c->last_point.y = 100;
- }
-
- if (c->save_point.x == 0 || c->save_point.y == 0 || c->save_point.map == 0){
- c->save_point.map = mapindex_name2id(MAP_PRONTERA);
- c->save_point.x = 100;
- c->save_point.y = 100;
- }
-
-
- //read the memo points
- sprintf(tmp_sql, "SELECT `memo_id`, `char_id`, `map`, `x`, `y` FROM `memo` WHERE `char_id` = '%d' ORDER BY `memo_id`", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(charsql_res){
- for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
- c->memo_point[i].map = mapindex_name2id(charsql_row[2]);
- c->memo_point[i].x = atoi(charsql_row[3]);
- c->memo_point[i].y = atoi(charsql_row[4]);
- }
- mysql_free_result(charsql_res);
- }
-
- //read inventory...
- str_p = tmp_sql;
- str_p += sprintf(str_p, "SELECT `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (i = 0; i < MAX_SLOTS; i++)
- str_p += sprintf(str_p, ", `card%d`", i);
- str_p += sprintf(str_p, " FROM `inventory` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(charsql_res){
- for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
- //c->inventory[i].id = atoi(charsql_row[0]);
- c->inventory[i].nameid = atoi(charsql_row[0]);
- c->inventory[i].amount = atoi(charsql_row[1]);
- c->inventory[i].equip = atoi(charsql_row[2]);
- c->inventory[i].identify = atoi(charsql_row[3]);
- c->inventory[i].refine = atoi(charsql_row[4]);
- c->inventory[i].attribute = atoi(charsql_row[5]);
- for (j = 0; j < MAX_SLOTS; j++)
- c->inventory[i].card[j] = atoi(charsql_row[6+j]);
- }
- mysql_free_result(charsql_res);
- }
-
-
- //cart inventory ..
- str_p = tmp_sql;
- str_p += sprintf(str_p, "SELECT `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (i = 0; i < MAX_SLOTS; i++)
- str_p += sprintf(str_p, ", `card%d`", i);
- str_p += sprintf(str_p, " FROM `cart_inventory` WHERE `char_id` = '%d'", charid);
-
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(charsql_res){
- for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
- //c->cart[i].id = atoi(charsql_row[0]);
- c->cart[i].nameid = atoi(charsql_row[0]);
- c->cart[i].amount = atoi(charsql_row[1]);
- c->cart[i].equip = atoi(charsql_row[2]);
- c->cart[i].identify = atoi(charsql_row[3]);
- c->cart[i].refine = atoi(charsql_row[4]);
- c->cart[i].attribute = atoi(charsql_row[5]);
- for (j = 0; j < MAX_SLOTS; j++)
- c->cart[i].card[j] = atoi(charsql_row[6+j]);
- }
- mysql_free_result(charsql_res);
- }
-
-
- //Skills...
- sprintf(tmp_sql, "SELECT `char_id`, `id`, `lv` FROM `skill` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(charsql_res){
- while((charsql_row = mysql_fetch_row(charsql_res))){
- i = atoi(charsql_row[1]);
- c->skill[i].id = i;
- c->skill[i].lv = atoi(charsql_row[2]);
- }
- mysql_free_result(charsql_res);
- }
-/* Reg values are handled by the char server.
- //Global REG
- sprintf(tmp_sql, "SELECT `char_id`, `str`, `value` FROM `global_reg_value` WHERE `type` = '3' AND `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(c);
- return NULL;
- }
-
- charsql_res = mysql_store_result(&charsql_handle);
- if(charsql_res){
- for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
- strcpy(c->global_reg[i].str, charsql_row[1]);
- strcpy(c->global_reg[i].value, charsql_row[2]);
- }
- mysql_free_result(charsql_res);
- c->global_reg_num = i;
- }
-*/
-
- //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
- //Friend list
- sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM friends f LEFT JOIN `char` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", charid);
-
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- sql_res = NULL; //To avoid trying to read data.
- }
- else
- sql_res = mysql_store_result(&charsql_handle);
-
- if(sql_res)
- {
- for(i = 0; (sql_row = mysql_fetch_row(sql_res)) && i<MAX_FRIENDS; i++)
- {
- if (sql_row[2] != NULL)
- {
- c->friends[i].account_id = atoi(sql_row[0]);
- c->friends[i].char_id = atoi(sql_row[1]);
- strncpy(c->friends[i].name, sql_row[2], NAME_LENGTH-1); //The -1 is to avoid losing the ending \0 [Skotlex]
- }
- }
- mysql_free_result(sql_res);
- }
-
- ShowInfo("charsql_loadchar(): loading of '%d' (%s) complete.\n", charid, c->name);
- return c;
-}
-
-int charsave_savechar(int charid, struct mmo_charstatus *c){
- int i,j;
- char *str_p;
-// char tmp_str[64];
-// char tmp_str2[512];
- //First save the 'char'
- sprintf(tmp_sql ,"UPDATE `char` SET `class`='%d', `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
- "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
- "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
- "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',"
- "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
- "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d',"
- "`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d', `fame`='%d', `homun_id`='%d'"
- "WHERE `account_id`='%d' AND `char_id` = '%d'",
- c->class_, c->base_level, c->job_level,
- c->base_exp, c->job_exp, c->zeny,
- c->max_hp, c->hp, c->max_sp, c->sp, c->status_point, c->skill_point,
- c->str, c->agi, c->vit, c->int_, c->dex, c->luk,
- c->option, c->karma, c->manner, c->party_id, c->guild_id, c->pet_id,
- c->hair, c->hair_color, c->clothes_color,
- c->weapon, c->shield, c->head_top, c->head_mid, c->head_bottom,
- mapindex_id2name(c->last_point.map), c->last_point.x, c->last_point.y,
- mapindex_id2name(c->save_point.map), c->save_point.x, c->save_point.y, c->partner_id, c->father, c->mother,
- c->child, c->fame, c->hom_id, c->account_id, c->char_id
- );
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
-
- //Save the inventory
- sprintf(tmp_sql, "DELETE FROM `inventory` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < MAX_INVENTORY; i++){
- if(c->inventory[i].nameid > 0){
- str_p = tmp_sql;
- str_p += sprintf(str_p, "INSERT INTO `inventory` (`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (j = 0; j < MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, ") VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d'",
- charid, c->inventory[i].nameid, c->inventory[i].amount, c->inventory[i].equip,
- c->inventory[i].identify, c->inventory[i].refine, c->inventory[i].attribute);
-
- for (j = 0; j < MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", '%d'", c->inventory[i].card[j]);
-
- strcat(tmp_sql,")");
-
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-
- //Save the cart
- sprintf(tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < MAX_CART; i++){
- if(c->cart[i].nameid > 0){
- str_p = tmp_sql;
- str_p += sprintf(str_p, "INSERT INTO `cart_inventory` (`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (j = 0; j < MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, ") VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d'",
- charid, c->cart[i].nameid, c->cart[i].amount, c->cart[i].equip,
- c->cart[i].identify, c->cart[i].refine, c->cart[i].attribute);
-
- for (j = 0; j < MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", '%d'", c->cart[i].card[j]);
-
- strcat(tmp_sql,")");
-
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-
-
- //Save memo points
- sprintf(tmp_sql, "DELETE FROM `memo` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < MAX_MEMOPOINTS; i++){
- if(c->memo_point[i].map && c->memo_point[i].x > 0 && c->memo_point[i].y > 0){
- sprintf(tmp_sql, "INSERT INTO `memo` ( `char_id`, `map`, `x`, `y` ) VALUES ('%d', '%s', '%d', '%d')", charid, mapindex_id2name(c->memo_point[i].map), c->memo_point[i].x, c->memo_point[i].y);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-
-
- //Save skills
- sprintf(tmp_sql, "DELETE FROM `skill` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < MAX_SKILL; i++){
- if(c->skill[i].id > 0){
- sprintf(tmp_sql, "INSERT INTO `skill` (`char_id`, `id`, `lv`) VALUES ('%d', '%d', '%d')", charid, c->skill[i].id, c->skill[i].lv);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-
-
-/* Reg values are handled by the char server.
- //global_reg_value saving
- sprintf(tmp_sql, "DELETE FROM `global_reg_value` WHERE `type`=3 AND `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < c->global_reg_num; i++){
- if(c->global_reg[i].str){
- if(c->global_reg[i].value){
- //jstrescapecpy(tmp_str, c->global_reg[i].str);
- sprintf(tmp_sql, "INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s', '%s')", charid, jstrescapecpy(tmp_str,c->global_reg[i].str), jstrescapecpy(tmp_str2,c->global_reg[i].value));
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- }
-*/
-
- //friendlist saving
- sprintf(tmp_sql, "DELETE FROM `friends` WHERE `char_id` = '%d'", charid);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- for(i = 0; i < MAX_FRIENDS; i++){
- if(c->friends[i].char_id > 0){
- sprintf(tmp_sql, "INSERT INTO `friends` (`char_id`, `friend_account`, `friend_id`) VALUES ('%d','%d','%d')", charid, c->friends[i].account_id, c->friends[i].char_id);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
-
- ShowInfo("charsql_savechar(): saving of '%d' (%s) complete.\n", charid, c->name);
- return 0;
-}
-
-int charsave_load_scdata(int account_id, int char_id)
-{ //Loads character's sc_data
- struct map_session_data *sd;
-
- sd = map_id2sd(account_id);
- if (!sd)
- {
- ShowError("charsave_load_scdata: Player of AID %d not found!\n", account_id);
- return -1;
- }
- if (sd->status.char_id != char_id)
- {
- ShowError("charsave_load_scdata: Receiving data for account %d, char id does not matches (%d != %d)!\n", account_id, sd->status.char_id, char_id);
- return -1;
- }
- sprintf(tmp_sql, "SELECT `type`, `tick`, `val1`, `val2`, `val3`, `val4` FROM `sc_data`"
- "WHERE `account_id`='%d' AND `char_id`='%d'", account_id, char_id);
-
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return -1;
- }
-
- sql_res = mysql_store_result(&charsql_handle);
- if(sql_res)
- {
- while ((sql_row = mysql_fetch_row(sql_res)))
- {
- if (atoi(sql_row[1]) < 1)
- { //Protection against invalid tick values. [Skotlex]
- ShowWarning("charsave_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", atoi(sql_row[1]), sd->status.name);
- continue;
- }
-
- status_change_start(&sd->bl, atoi(sql_row[0]), 10000, atoi(sql_row[2]), atoi(sql_row[3]),
- atoi(sql_row[4]), atoi(sql_row[5]), atoi(sql_row[1]), 15);
- }
- }
-
- //Once loaded, sc_data must be disposed.
- sprintf(tmp_sql, "DELETE FROM `sc_data` WHERE `account_id`='%d' AND `char_id`='%d'", account_id, char_id);
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return 0;
-}
-
-void charsave_save_scdata(int account_id, int char_id, struct status_change* sc_data, int max_sc)
-{ //Saves character's sc_data.
- int i,count =0;
- struct TimerData *timer;
- unsigned int tick = gettick();
- char *p = tmp_sql;
-
- p += sprintf(p, "INSERT INTO `sc_data` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ");
-
- for(i = 0; i < max_sc; i++)
- {
- if (sc_data->data[i].timer == -1)
- continue;
- timer = get_timer(sc_data->data[i].timer);
- if (timer == NULL || timer->func != status_change_timer || DIFF_TICK(timer->tick,tick) < 0)
- continue;
-
- p += sprintf(p, " ('%d','%d','%hu','%d','%d','%d','%d','%d'),", account_id, char_id,
- i, DIFF_TICK(timer->tick,tick), sc_data->data[i].val1, sc_data->data[i].val2, sc_data->data[i].val3, sc_data->data[i].val4);
-
- count++;
- }
- if (count > 0)
- {
- *--p = '\0'; //Remove the trailing comma.
- if(mysql_query(&charsql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- ShowInfo("charsql_save_scdata(): saved %d status changes of '%d:%d'.\n", count, account_id, char_id);
- return;
-}
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/mmo.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+#include "../common/malloc.h"
+
+#include "charsave.h"
+#include "map.h"
+
+#ifndef TXT_ONLY
+
+struct mmo_charstatus *charsave_loadchar(int charid){
+ int i,j, friends;
+ struct mmo_charstatus *c;
+ char *str_p;
+ double exp;
+ friends = 0;
+
+ c = (struct mmo_charstatus *)aCalloc(1,sizeof(struct mmo_charstatus));
+
+ if(charid <= 0){
+ ShowError("charsave_loadchar() charid <= 0! (%d)", charid);
+ aFree(c);
+ return NULL;
+ }
+ // add homun_id [albator]
+ //Tested, Mysql 4.1.9+ has no problems with the long query, the buf is 65k big and the sql server needs for it 0.00009 secs on an athlon xp 2400+ WinXP (1GB Mem) .. [Sirius]
+ sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, `str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`, `clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, `last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id`, `father`, `mother`, `child`, `fame`, `homun_id` FROM `char` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(mysql_num_rows(charsql_res) <= 0){
+ ShowWarning("charsave_loadchar() -> CHARACTER NOT FOUND! (id: %d)\n", charid);
+ mysql_free_result(charsql_res);
+ aFree(c);
+ return NULL;
+ }
+
+ //fetch data
+ charsql_row = mysql_fetch_row(charsql_res);
+
+ //fill with data
+ c->char_id = charid;
+ c->account_id = atoi(charsql_row[1]);
+ c->char_num = atoi(charsql_row[2]);
+ strcpy(c->name, charsql_row[3]);
+ c->class_ = atoi(charsql_row[4]);
+ c->base_level = atoi(charsql_row[5]);
+ c->job_level = atoi(charsql_row[6]);
+ exp = atof(charsql_row[7]);
+ c->base_exp = (unsigned int)cap_value(exp,0,UINT_MAX);
+ exp = atof(charsql_row[8]);
+ c->job_exp = (unsigned int)cap_value(exp,0,UINT_MAX);
+ c->zeny = atoi(charsql_row[9]);
+ c->str = atoi(charsql_row[10]);
+ c->agi = atoi(charsql_row[11]);
+ c->vit = atoi(charsql_row[12]);
+ c->int_ = atoi(charsql_row[13]);
+ c->dex = atoi(charsql_row[14]);
+ c->luk = atoi(charsql_row[15]);
+ c->max_hp = atoi(charsql_row[16]);
+ c->hp = atoi(charsql_row[17]);
+ c->max_sp = atoi(charsql_row[18]);
+ c->sp = atoi(charsql_row[19]);
+ c->status_point = atoi(charsql_row[20]) > USHRT_MAX? USHRT_MAX : atoi(charsql_row[20]);
+ c->skill_point = atoi(charsql_row[21]) > USHRT_MAX? USHRT_MAX : atoi(charsql_row[21]);
+ c->option = atoi(charsql_row[22]);
+ c->karma = atoi(charsql_row[23]);
+ c->manner = atoi(charsql_row[24]);
+ c->party_id = atoi(charsql_row[25]);
+ c->guild_id = atoi(charsql_row[26]);
+ c->pet_id = atoi(charsql_row[27]);
+ c->hair = atoi(charsql_row[28]);
+ c->hair_color = atoi(charsql_row[29]);
+ c->clothes_color = atoi(charsql_row[30]);
+ c->weapon = atoi(charsql_row[31]);
+ c->shield = atoi(charsql_row[32]);
+ c->head_top = atoi(charsql_row[33]);
+ c->head_mid = atoi(charsql_row[34]);
+ c->head_bottom = atoi(charsql_row[35]);
+ c->last_point.map = mapindex_name2id(charsql_row[36]);
+ c->last_point.x = atoi(charsql_row[37]);
+ c->last_point.y = atoi(charsql_row[38]);
+ c->save_point.map = mapindex_name2id(charsql_row[39]);
+ c->save_point.x = atoi(charsql_row[40]);
+ c->save_point.y = atoi(charsql_row[41]);
+ c->partner_id = atoi(charsql_row[42]);
+ c->father = atoi(charsql_row[43]);
+ c->mother = atoi(charsql_row[44]);
+ c->child = atoi(charsql_row[45]);
+ c->fame = atoi(charsql_row[46]);
+ c->hom_id = atoi(charsql_row[47]); // albator
+
+ mysql_free_result(charsql_res);
+
+ //Check for '0' Savepoint / LastPoint
+ if (c->last_point.x == 0 || c->last_point.y == 0 || c->last_point.map == 0){
+ c->last_point.map = mapindex_name2id(MAP_PRONTERA);
+ c->last_point.x = 100;
+ c->last_point.y = 100;
+ }
+
+ if (c->save_point.x == 0 || c->save_point.y == 0 || c->save_point.map == 0){
+ c->save_point.map = mapindex_name2id(MAP_PRONTERA);
+ c->save_point.x = 100;
+ c->save_point.y = 100;
+ }
+
+
+ //read the memo points
+ sprintf(tmp_sql, "SELECT `memo_id`, `char_id`, `map`, `x`, `y` FROM `memo` WHERE `char_id` = '%d' ORDER BY `memo_id`", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(charsql_res){
+ for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
+ c->memo_point[i].map = mapindex_name2id(charsql_row[2]);
+ c->memo_point[i].x = atoi(charsql_row[3]);
+ c->memo_point[i].y = atoi(charsql_row[4]);
+ }
+ mysql_free_result(charsql_res);
+ }
+
+ //read inventory...
+ str_p = tmp_sql;
+ str_p += sprintf(str_p, "SELECT `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for (i = 0; i < MAX_SLOTS; i++)
+ str_p += sprintf(str_p, ", `card%d`", i);
+ str_p += sprintf(str_p, " FROM `inventory` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(charsql_res){
+ for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
+ //c->inventory[i].id = atoi(charsql_row[0]);
+ c->inventory[i].nameid = atoi(charsql_row[0]);
+ c->inventory[i].amount = atoi(charsql_row[1]);
+ c->inventory[i].equip = atoi(charsql_row[2]);
+ c->inventory[i].identify = atoi(charsql_row[3]);
+ c->inventory[i].refine = atoi(charsql_row[4]);
+ c->inventory[i].attribute = atoi(charsql_row[5]);
+ for (j = 0; j < MAX_SLOTS; j++)
+ c->inventory[i].card[j] = atoi(charsql_row[6+j]);
+ }
+ mysql_free_result(charsql_res);
+ }
+
+
+ //cart inventory ..
+ str_p = tmp_sql;
+ str_p += sprintf(str_p, "SELECT `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for (i = 0; i < MAX_SLOTS; i++)
+ str_p += sprintf(str_p, ", `card%d`", i);
+ str_p += sprintf(str_p, " FROM `cart_inventory` WHERE `char_id` = '%d'", charid);
+
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(charsql_res){
+ for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
+ //c->cart[i].id = atoi(charsql_row[0]);
+ c->cart[i].nameid = atoi(charsql_row[0]);
+ c->cart[i].amount = atoi(charsql_row[1]);
+ c->cart[i].equip = atoi(charsql_row[2]);
+ c->cart[i].identify = atoi(charsql_row[3]);
+ c->cart[i].refine = atoi(charsql_row[4]);
+ c->cart[i].attribute = atoi(charsql_row[5]);
+ for (j = 0; j < MAX_SLOTS; j++)
+ c->cart[i].card[j] = atoi(charsql_row[6+j]);
+ }
+ mysql_free_result(charsql_res);
+ }
+
+
+ //Skills...
+ sprintf(tmp_sql, "SELECT `char_id`, `id`, `lv` FROM `skill` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(charsql_res){
+ while((charsql_row = mysql_fetch_row(charsql_res))){
+ i = atoi(charsql_row[1]);
+ c->skill[i].id = i;
+ c->skill[i].lv = atoi(charsql_row[2]);
+ }
+ mysql_free_result(charsql_res);
+ }
+/* Reg values are handled by the char server.
+ //Global REG
+ sprintf(tmp_sql, "SELECT `char_id`, `str`, `value` FROM `global_reg_value` WHERE `type` = '3' AND `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ aFree(c);
+ return NULL;
+ }
+
+ charsql_res = mysql_store_result(&charsql_handle);
+ if(charsql_res){
+ for(i = 0; (charsql_row = mysql_fetch_row(charsql_res)); i++){
+ strcpy(c->global_reg[i].str, charsql_row[1]);
+ strcpy(c->global_reg[i].value, charsql_row[2]);
+ }
+ mysql_free_result(charsql_res);
+ c->global_reg_num = i;
+ }
+*/
+
+ //Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
+ //Friend list
+ sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM friends f LEFT JOIN `char` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", charid);
+
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ sql_res = NULL; //To avoid trying to read data.
+ }
+ else
+ sql_res = mysql_store_result(&charsql_handle);
+
+ if(sql_res)
+ {
+ for(i = 0; (sql_row = mysql_fetch_row(sql_res)) && i<MAX_FRIENDS; i++)
+ {
+ if (sql_row[2] != NULL)
+ {
+ c->friends[i].account_id = atoi(sql_row[0]);
+ c->friends[i].char_id = atoi(sql_row[1]);
+ strncpy(c->friends[i].name, sql_row[2], NAME_LENGTH-1); //The -1 is to avoid losing the ending \0 [Skotlex]
+ }
+ }
+ mysql_free_result(sql_res);
+ }
+
+ ShowInfo("charsql_loadchar(): loading of '%d' (%s) complete.\n", charid, c->name);
+ return c;
+}
+
+int charsave_savechar(int charid, struct mmo_charstatus *c){
+ int i,j;
+ char *str_p;
+// char tmp_str[64];
+// char tmp_str2[512];
+ //First save the 'char'
+ sprintf(tmp_sql ,"UPDATE `char` SET `class`='%d', `base_level`='%d', `job_level`='%d',"
+ "`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
+ "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
+ "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
+ "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',"
+ "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
+ "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d',"
+ "`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d', `fame`='%d', `homun_id`='%d'"
+ "WHERE `account_id`='%d' AND `char_id` = '%d'",
+ c->class_, c->base_level, c->job_level,
+ c->base_exp, c->job_exp, c->zeny,
+ c->max_hp, c->hp, c->max_sp, c->sp, c->status_point, c->skill_point,
+ c->str, c->agi, c->vit, c->int_, c->dex, c->luk,
+ c->option, c->karma, c->manner, c->party_id, c->guild_id, c->pet_id,
+ c->hair, c->hair_color, c->clothes_color,
+ c->weapon, c->shield, c->head_top, c->head_mid, c->head_bottom,
+ mapindex_id2name(c->last_point.map), c->last_point.x, c->last_point.y,
+ mapindex_id2name(c->save_point.map), c->save_point.x, c->save_point.y, c->partner_id, c->father, c->mother,
+ c->child, c->fame, c->hom_id, c->account_id, c->char_id
+ );
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+
+ //Save the inventory
+ sprintf(tmp_sql, "DELETE FROM `inventory` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < MAX_INVENTORY; i++){
+ if(c->inventory[i].nameid > 0){
+ str_p = tmp_sql;
+ str_p += sprintf(str_p, "INSERT INTO `inventory` (`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for (j = 0; j < MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p, ") VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d'",
+ charid, c->inventory[i].nameid, c->inventory[i].amount, c->inventory[i].equip,
+ c->inventory[i].identify, c->inventory[i].refine, c->inventory[i].attribute);
+
+ for (j = 0; j < MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", '%d'", c->inventory[i].card[j]);
+
+ strcat(tmp_sql,")");
+
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+
+ //Save the cart
+ sprintf(tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < MAX_CART; i++){
+ if(c->cart[i].nameid > 0){
+ str_p = tmp_sql;
+ str_p += sprintf(str_p, "INSERT INTO `cart_inventory` (`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for (j = 0; j < MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", `card%d`", j);
+
+ str_p += sprintf(str_p, ") VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d'",
+ charid, c->cart[i].nameid, c->cart[i].amount, c->cart[i].equip,
+ c->cart[i].identify, c->cart[i].refine, c->cart[i].attribute);
+
+ for (j = 0; j < MAX_SLOTS; j++)
+ str_p += sprintf(str_p, ", '%d'", c->cart[i].card[j]);
+
+ strcat(tmp_sql,")");
+
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+
+
+ //Save memo points
+ sprintf(tmp_sql, "DELETE FROM `memo` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < MAX_MEMOPOINTS; i++){
+ if(c->memo_point[i].map && c->memo_point[i].x > 0 && c->memo_point[i].y > 0){
+ sprintf(tmp_sql, "INSERT INTO `memo` ( `char_id`, `map`, `x`, `y` ) VALUES ('%d', '%s', '%d', '%d')", charid, mapindex_id2name(c->memo_point[i].map), c->memo_point[i].x, c->memo_point[i].y);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+
+
+ //Save skills
+ sprintf(tmp_sql, "DELETE FROM `skill` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < MAX_SKILL; i++){
+ if(c->skill[i].id > 0){
+ sprintf(tmp_sql, "INSERT INTO `skill` (`char_id`, `id`, `lv`) VALUES ('%d', '%d', '%d')", charid, c->skill[i].id, c->skill[i].lv);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+
+
+/* Reg values are handled by the char server.
+ //global_reg_value saving
+ sprintf(tmp_sql, "DELETE FROM `global_reg_value` WHERE `type`=3 AND `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < c->global_reg_num; i++){
+ if(c->global_reg[i].str){
+ if(c->global_reg[i].value){
+ //jstrescapecpy(tmp_str, c->global_reg[i].str);
+ sprintf(tmp_sql, "INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s', '%s')", charid, jstrescapecpy(tmp_str,c->global_reg[i].str), jstrescapecpy(tmp_str2,c->global_reg[i].value));
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+ }
+*/
+
+ //friendlist saving
+ sprintf(tmp_sql, "DELETE FROM `friends` WHERE `char_id` = '%d'", charid);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ for(i = 0; i < MAX_FRIENDS; i++){
+ if(c->friends[i].char_id > 0){
+ sprintf(tmp_sql, "INSERT INTO `friends` (`char_id`, `friend_account`, `friend_id`) VALUES ('%d','%d','%d')", charid, c->friends[i].account_id, c->friends[i].char_id);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ }
+
+ ShowInfo("charsql_savechar(): saving of '%d' (%s) complete.\n", charid, c->name);
+ return 0;
+}
+
+int charsave_load_scdata(int account_id, int char_id)
+{ //Loads character's sc_data
+ struct map_session_data *sd;
+
+ sd = map_id2sd(account_id);
+ if (!sd)
+ {
+ ShowError("charsave_load_scdata: Player of AID %d not found!\n", account_id);
+ return -1;
+ }
+ if (sd->status.char_id != char_id)
+ {
+ ShowError("charsave_load_scdata: Receiving data for account %d, char id does not matches (%d != %d)!\n", account_id, sd->status.char_id, char_id);
+ return -1;
+ }
+ sprintf(tmp_sql, "SELECT `type`, `tick`, `val1`, `val2`, `val3`, `val4` FROM `sc_data`"
+ "WHERE `account_id`='%d' AND `char_id`='%d'", account_id, char_id);
+
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return -1;
+ }
+
+ sql_res = mysql_store_result(&charsql_handle);
+ if(sql_res)
+ {
+ while ((sql_row = mysql_fetch_row(sql_res)))
+ {
+ if (atoi(sql_row[1]) < 1)
+ { //Protection against invalid tick values. [Skotlex]
+ ShowWarning("charsave_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", atoi(sql_row[1]), sd->status.name);
+ continue;
+ }
+
+ status_change_start(&sd->bl, atoi(sql_row[0]), 10000, atoi(sql_row[2]), atoi(sql_row[3]),
+ atoi(sql_row[4]), atoi(sql_row[5]), atoi(sql_row[1]), 15);
+ }
+ }
+
+ //Once loaded, sc_data must be disposed.
+ sprintf(tmp_sql, "DELETE FROM `sc_data` WHERE `account_id`='%d' AND `char_id`='%d'", account_id, char_id);
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ return 0;
+}
+
+void charsave_save_scdata(int account_id, int char_id, struct status_change* sc_data, int max_sc)
+{ //Saves character's sc_data.
+ int i,count =0;
+ struct TimerData *timer;
+ unsigned int tick = gettick();
+ char *p = tmp_sql;
+
+ p += sprintf(p, "INSERT INTO `sc_data` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ");
+
+ for(i = 0; i < max_sc; i++)
+ {
+ if (sc_data->data[i].timer == -1)
+ continue;
+ timer = get_timer(sc_data->data[i].timer);
+ if (timer == NULL || timer->func != status_change_timer || DIFF_TICK(timer->tick,tick) < 0)
+ continue;
+
+ p += sprintf(p, " ('%d','%d','%hu','%d','%d','%d','%d','%d'),", account_id, char_id,
+ i, DIFF_TICK(timer->tick,tick), sc_data->data[i].val1, sc_data->data[i].val2, sc_data->data[i].val3, sc_data->data[i].val4);
+
+ count++;
+ }
+ if (count > 0)
+ {
+ *--p = '\0'; //Remove the trailing comma.
+ if(mysql_query(&charsql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&charsql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+ ShowInfo("charsql_save_scdata(): saved %d status changes of '%d:%d'.\n", count, account_id, char_id);
+ return;
+}
+#endif
diff --git a/src/map/charsave.h b/src/map/charsave.h
index 049efebda..5743c1c65 100644
--- a/src/map/charsave.h
+++ b/src/map/charsave.h
@@ -1,21 +1,21 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHARSAVE_H_
-#define _CHARSAVE_H_
-
-#include "status.h"
-
-#ifndef TXT_ONLY
- int charsave_loadHomunculus(int hom_id, struct homun_data *p);
- int charsave_saveHomunculus(struct homun_data *hd);
- int charsave_saveHomunculusSkills(struct homun_data *hd);
- int charsave_deleteHomunculus(struct homun_data *hd);
-
- struct mmo_charstatus *charsave_loadchar(int charid);
- int charsave_savechar(int charid, struct mmo_charstatus *c);
- int charsave_load_scdata(int account_id, int char_id);
- void charsave_save_scdata(int account_id, int char_id, struct status_change* sc_data, int max_sc);
-#endif
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CHARSAVE_H_
+#define _CHARSAVE_H_
+
+#include "status.h"
+
+#ifndef TXT_ONLY
+ int charsave_loadHomunculus(int hom_id, struct homun_data *p);
+ int charsave_saveHomunculus(struct homun_data *hd);
+ int charsave_saveHomunculusSkills(struct homun_data *hd);
+ int charsave_deleteHomunculus(struct homun_data *hd);
+
+ struct mmo_charstatus *charsave_loadchar(int charid);
+ int charsave_savechar(int charid, struct mmo_charstatus *c);
+ int charsave_load_scdata(int account_id, int char_id);
+ void charsave_save_scdata(int account_id, int char_id, struct status_change* sc_data, int max_sc);
+#endif
+
+#endif
diff --git a/src/map/chat.c b/src/map/chat.c
index 9cc06a4ec..8a0844015 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -1,390 +1,390 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "battle.h"
-#include "chat.h"
-#include "map.h"
-#include "clif.h"
-#include "pc.h"
-#include "npc.h"
-#include "atcommand.h"
-
-int chat_triggerevent(struct chat_data *cd);
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
- *------------------------------------------
- */
-int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, sd);
-
- if (sd->chatID)
- return 0; //Prevent people abusing the chat system by creating multiple chats, as pointed out by End of Exam. [Skotlex]
-
- if (map[sd->bl.m].flag.nochat) {
- clif_displaymessage (sd->fd, msg_txt(281));
- return 0; //Can't create chatrooms on this map.
- }
- pc_stop_walking(sd,1);
- cd = (struct chat_data *) aMalloc(sizeof(struct chat_data));
-
- cd->limit = limit;
- cd->pub = pub;
- cd->users = 1;
- memcpy(cd->pass,pass,8);
- cd->pass[7]= '\0'; //Overflow check... [Skotlex]
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- cd->owner = (struct block_list **)(&cd->usersd[0]);
- cd->usersd[0] = sd;
- cd->bl.m = sd->bl.m;
- cd->bl.x = sd->bl.x;
- cd->bl.y = sd->bl.y;
- cd->bl.type = BL_CHAT;
- cd->bl.next = cd->bl.prev = NULL;
- cd->bl.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- clif_createchat(sd,1);
- aFree(cd);
- return 0;
- }
- pc_setchatid(sd,cd->bl.id);
-
- clif_createchat(sd,0);
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * Šù‘¶ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÉŽQ‰Á
- *------------------------------------------
- */
-int chat_joinchat (struct map_session_data *sd, int chatid, char* pass)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, sd);
- cd = (struct chat_data*)map_id2bl(chatid);
-
- //No need for a nullpo check. The chatid was sent by the client, if they lag or mess with the packet
- //a wrong chat id can be received. [Skotlex]
- if (cd == NULL)
- return 1;
- if (cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->vender_id || sd->chatID || cd->limit <= cd->users) {
- clif_joinchatfail(sd,0);
- return 0;
- }
- //Allows Gm access to protected room with any password they want by valaris
- if ((cd->pub == 0 && strncmp(pass, (char *)cd->pass, 8) && (pc_isGM(sd) < battle_config.gm_join_chat || !battle_config.gm_join_chat)) ||
- chatid == (int)sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe
- {
- clif_joinchatfail(sd,1);
- return 0;
- }
-
- pc_stop_walking(sd,1);
- cd->usersd[cd->users] = sd;
- cd->users++;
-
- pc_setchatid(sd,cd->bl.id);
-
- clif_joinchatok(sd,cd); // V‚½‚ÉŽQ‰Á‚µ‚½l‚É‚Í‘Sˆõ‚̃ŠƒXƒg
- clif_addchat(cd,sd); // Šù‚É’†‚É‹‚½l‚ɂ͒ljÁ‚µ‚½l‚Ì•ñ
- clif_dispchat(cd,0); // ŽüˆÍ‚Ìl‚É‚Íl”•Ï‰»•ñ
-
- chat_triggerevent(cd); // ƒCƒxƒ“ƒg
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚甲‚¯‚é
- *------------------------------------------
- */
-int chat_leavechat(struct map_session_data *sd)
-{
- struct chat_data *cd;
- int i,leavechar;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL) {
- sd->chatID = 0;
- return 1;
- }
-
- for(i = 0,leavechar=-1;i < cd->users;i++){
- if(cd->usersd[i] == sd){
- leavechar=i;
- break;
- }
- }
- if(leavechar<0)
- { //Not found in the chatroom?
- sd->chatID = 0;
- return -1;
- }
-
- if(leavechar==0 && cd->users>1 && (*cd->owner)->type==BL_PC){
- // Š—LŽÒ‚¾‚Á‚½&‘¼‚Él‚ª‹‚é&PC‚̃`ƒƒƒbƒg
- clif_changechatowner(cd,cd->usersd[1]);
- clif_clearchat(cd,0);
- }
-
- // ”²‚¯‚éPC‚É‚à‘—‚é‚Ì‚Åusers‚ðŒ¸‚ç‚·‘O‚ÉŽÀs
- clif_leavechat(cd,sd);
-
- cd->users--;
- pc_setchatid(sd,0);
-
- if(cd->users == 0 && (*cd->owner)->type==BL_PC){
- //Delete empty chatroom
- clif_clearchat(cd,0);
- map_delobject(cd->bl.id);
- return 1;
- }
- for(i=leavechar;i < cd->users;i++)
- cd->usersd[i] = cd->usersd[i+1];
-
- if(leavechar==0 && (*cd->owner)->type==BL_PC){
- //Adjust Chat location after owner has been changed.
- map_delblock( &cd->bl );
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
- map_addblock( &cd->bl );
- }
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÌŽ‚¿Žå‚ð÷‚é
- *------------------------------------------
- */
-int chat_changechatowner(struct map_session_data *sd,char *nextownername)
-{
- struct chat_data *cd;
- struct map_session_data *tmp_sd;
- int i, nextowner;
-
- nullpo_retr(1, sd);
-
- cd = (struct chat_data*)map_id2bl(sd->chatID);
- if (cd == NULL || (struct block_list *)sd != (*cd->owner))
- return 1;
-
- for(i = 1,nextowner=-1;i < cd->users;i++){
- if(strcmp(cd->usersd[i]->status.name,nextownername)==0){
- nextowner=i;
- break;
- }
- }
- if(nextowner<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
- return -1;
-
- clif_changechatowner(cd,cd->usersd[nextowner]);
- // ˆê’UÁ‚·
- clif_clearchat(cd,0);
-
- // userlist‚̇”Ô•ÏX (0‚ªŠ—LŽÒ‚È‚Ì‚Å)
- if( (tmp_sd = cd->usersd[0]) == NULL ) //FIXME: How is this even possible!? Invoking character should be owner, hence, it SHOULD be on sc->usersd[0]!
- return 1; //‚ ‚肦‚é‚Ì‚©‚ÈH
- cd->usersd[0] = cd->usersd[nextowner];
- cd->usersd[nextowner] = tmp_sd;
-
- map_delblock( &cd->bl );
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
- map_addblock( &cd->bl );
-
- // Ä“x•\Ž¦
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒg‚Ìó‘Ô(ƒ^ƒCƒgƒ‹“™)‚ð•ÏX
- *------------------------------------------
- */
-int chat_changechatstatus(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL || (struct block_list *)sd != (*cd->owner))
- return 1;
-
- cd->limit = limit;
- cd->pub = pub;
- memcpy(cd->pass,pass,8);
- cd->pass[7]= '\0'; //Overflow check... [Skotlex]
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- clif_changechatstatus(cd);
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚çR‚èo‚·
- *------------------------------------------
- */
-int chat_kickchat(struct map_session_data *sd,char *kickusername)
-{
- struct chat_data *cd;
- int i;
-
- nullpo_retr(1, sd);
-
- cd = (struct chat_data *)map_id2bl(sd->chatID);
-
- if (!cd) return -1;
-
- for(i = 0; i < cd->users; i++) {
- if (strcmp(cd->usersd[i]->status.name, kickusername) == 0) {
- if (battle_config.gm_kick_chat && pc_isGM(cd->usersd[i]) >= battle_config.gm_kick_chat)
- //gm kick protection by valaris
- return 0;
-
- chat_leavechat(cd->usersd[i]);
- return 0;
- }
- }
-
- return -1;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
- *------------------------------------------
- */
-int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev)
-{
- struct chat_data *cd;
-
- nullpo_retr(1, nd);
-
- cd = (struct chat_data *) aMalloc(sizeof(struct chat_data));
-
- cd->limit = cd->trigger = limit;
- if(trigger>0)
- cd->trigger = trigger;
- cd->pub = pub;
- cd->users = 0;
- memcpy(cd->pass,"",1);
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- cd->bl.m = nd->bl.m;
- cd->bl.x = nd->bl.x;
- cd->bl.y = nd->bl.y;
- cd->bl.type = BL_CHAT;
- cd->bl.prev= cd->bl.next = NULL;
- cd->owner_ = (struct block_list *)nd;
- cd->owner = &cd->owner_;
- if (strlen(ev) > 49)
- { //npc_event is a char[50] [Skotlex]
- memcpy(cd->npc_event,ev,49);
- cd->npc_event[49] = '\0';
- } else
- memcpy(cd->npc_event,ev,strlen(ev)+1); //Include the \0
-
- cd->bl.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- aFree(cd);
- return 0;
- }
- nd->chat_id=cd->bl.id;
-
- clif_dispchat(cd,0);
-
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒ‹[ƒ€íœ
- *------------------------------------------
- */
-int chat_deletenpcchat(struct npc_data *nd)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, nd);
- nullpo_retr(0, cd=(struct chat_data*)map_id2bl(nd->chat_id));
-
- chat_npckickall(cd);
- clif_clearchat(cd,0);
- map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
- nd->chat_id=0;
-
- return 0;
-}
-
-/*==========================================
- * ‹K’èl”ˆÈã‚ŃCƒxƒ“ƒg‚ª’è‹`‚³‚ê‚Ä‚é‚È‚çŽÀs
- *------------------------------------------
- */
-int chat_triggerevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- if(cd->users>=cd->trigger && cd->npc_event[0])
- npc_event_do(cd->npc_event);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì—LŒø‰»
- *------------------------------------------
- */
-int chat_enableevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- cd->trigger&=0x7f;
- chat_triggerevent(cd);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì–³Œø‰»
- *------------------------------------------
- */
-int chat_disableevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- cd->trigger|=0x80;
- return 0;
-}
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚ç‘SˆõR‚èo‚·
- *------------------------------------------
- */
-int chat_npckickall(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- while(cd->users>0){
- chat_leavechat(cd->usersd[cd->users-1]);
- }
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <string.h>
+
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "battle.h"
+#include "chat.h"
+#include "map.h"
+#include "clif.h"
+#include "pc.h"
+#include "npc.h"
+#include "atcommand.h"
+
+int chat_triggerevent(struct chat_data *cd);
+
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
+ *------------------------------------------
+ */
+int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
+{
+ struct chat_data *cd;
+
+ nullpo_retr(0, sd);
+
+ if (sd->chatID)
+ return 0; //Prevent people abusing the chat system by creating multiple chats, as pointed out by End of Exam. [Skotlex]
+
+ if (map[sd->bl.m].flag.nochat) {
+ clif_displaymessage (sd->fd, msg_txt(281));
+ return 0; //Can't create chatrooms on this map.
+ }
+ pc_stop_walking(sd,1);
+ cd = (struct chat_data *) aMalloc(sizeof(struct chat_data));
+
+ cd->limit = limit;
+ cd->pub = pub;
+ cd->users = 1;
+ memcpy(cd->pass,pass,8);
+ cd->pass[7]= '\0'; //Overflow check... [Skotlex]
+ if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
+ memcpy(cd->title,title,titlelen);
+ cd->title[titlelen]=0;
+
+ cd->owner = (struct block_list **)(&cd->usersd[0]);
+ cd->usersd[0] = sd;
+ cd->bl.m = sd->bl.m;
+ cd->bl.x = sd->bl.x;
+ cd->bl.y = sd->bl.y;
+ cd->bl.type = BL_CHAT;
+ cd->bl.next = cd->bl.prev = NULL;
+ cd->bl.id = map_addobject(&cd->bl);
+ if(cd->bl.id==0){
+ clif_createchat(sd,1);
+ aFree(cd);
+ return 0;
+ }
+ pc_setchatid(sd,cd->bl.id);
+
+ clif_createchat(sd,0);
+ clif_dispchat(cd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * Šù‘¶ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÉŽQ‰Á
+ *------------------------------------------
+ */
+int chat_joinchat (struct map_session_data *sd, int chatid, char* pass)
+{
+ struct chat_data *cd;
+
+ nullpo_retr(0, sd);
+ cd = (struct chat_data*)map_id2bl(chatid);
+
+ //No need for a nullpo check. The chatid was sent by the client, if they lag or mess with the packet
+ //a wrong chat id can be received. [Skotlex]
+ if (cd == NULL)
+ return 1;
+ if (cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->vender_id || sd->chatID || cd->limit <= cd->users) {
+ clif_joinchatfail(sd,0);
+ return 0;
+ }
+ //Allows Gm access to protected room with any password they want by valaris
+ if ((cd->pub == 0 && strncmp(pass, (char *)cd->pass, 8) && (pc_isGM(sd) < battle_config.gm_join_chat || !battle_config.gm_join_chat)) ||
+ chatid == (int)sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe
+ {
+ clif_joinchatfail(sd,1);
+ return 0;
+ }
+
+ pc_stop_walking(sd,1);
+ cd->usersd[cd->users] = sd;
+ cd->users++;
+
+ pc_setchatid(sd,cd->bl.id);
+
+ clif_joinchatok(sd,cd); // V‚½‚ÉŽQ‰Á‚µ‚½l‚É‚Í‘Sˆõ‚̃ŠƒXƒg
+ clif_addchat(cd,sd); // Šù‚É’†‚É‹‚½l‚ɂ͒ljÁ‚µ‚½l‚Ì•ñ
+ clif_dispchat(cd,0); // ŽüˆÍ‚Ìl‚É‚Íl”•Ï‰»•ñ
+
+ chat_triggerevent(cd); // ƒCƒxƒ“ƒg
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚甲‚¯‚é
+ *------------------------------------------
+ */
+int chat_leavechat(struct map_session_data *sd)
+{
+ struct chat_data *cd;
+ int i,leavechar;
+
+ nullpo_retr(1, sd);
+
+ cd=(struct chat_data*)map_id2bl(sd->chatID);
+ if(cd==NULL) {
+ sd->chatID = 0;
+ return 1;
+ }
+
+ for(i = 0,leavechar=-1;i < cd->users;i++){
+ if(cd->usersd[i] == sd){
+ leavechar=i;
+ break;
+ }
+ }
+ if(leavechar<0)
+ { //Not found in the chatroom?
+ sd->chatID = 0;
+ return -1;
+ }
+
+ if(leavechar==0 && cd->users>1 && (*cd->owner)->type==BL_PC){
+ // Š—LŽÒ‚¾‚Á‚½&‘¼‚Él‚ª‹‚é&PC‚̃`ƒƒƒbƒg
+ clif_changechatowner(cd,cd->usersd[1]);
+ clif_clearchat(cd,0);
+ }
+
+ // ”²‚¯‚éPC‚É‚à‘—‚é‚Ì‚Åusers‚ðŒ¸‚ç‚·‘O‚ÉŽÀs
+ clif_leavechat(cd,sd);
+
+ cd->users--;
+ pc_setchatid(sd,0);
+
+ if(cd->users == 0 && (*cd->owner)->type==BL_PC){
+ //Delete empty chatroom
+ clif_clearchat(cd,0);
+ map_delobject(cd->bl.id);
+ return 1;
+ }
+ for(i=leavechar;i < cd->users;i++)
+ cd->usersd[i] = cd->usersd[i+1];
+
+ if(leavechar==0 && (*cd->owner)->type==BL_PC){
+ //Adjust Chat location after owner has been changed.
+ map_delblock( &cd->bl );
+ cd->bl.x=cd->usersd[0]->bl.x;
+ cd->bl.y=cd->usersd[0]->bl.y;
+ map_addblock( &cd->bl );
+ }
+ clif_dispchat(cd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÌŽ‚¿Žå‚ð÷‚é
+ *------------------------------------------
+ */
+int chat_changechatowner(struct map_session_data *sd,char *nextownername)
+{
+ struct chat_data *cd;
+ struct map_session_data *tmp_sd;
+ int i, nextowner;
+
+ nullpo_retr(1, sd);
+
+ cd = (struct chat_data*)map_id2bl(sd->chatID);
+ if (cd == NULL || (struct block_list *)sd != (*cd->owner))
+ return 1;
+
+ for(i = 1,nextowner=-1;i < cd->users;i++){
+ if(strcmp(cd->usersd[i]->status.name,nextownername)==0){
+ nextowner=i;
+ break;
+ }
+ }
+ if(nextowner<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
+ return -1;
+
+ clif_changechatowner(cd,cd->usersd[nextowner]);
+ // ˆê’UÁ‚·
+ clif_clearchat(cd,0);
+
+ // userlist‚̇”Ô•ÏX (0‚ªŠ—LŽÒ‚È‚Ì‚Å)
+ if( (tmp_sd = cd->usersd[0]) == NULL ) //FIXME: How is this even possible!? Invoking character should be owner, hence, it SHOULD be on sc->usersd[0]!
+ return 1; //‚ ‚肦‚é‚Ì‚©‚ÈH
+ cd->usersd[0] = cd->usersd[nextowner];
+ cd->usersd[nextowner] = tmp_sd;
+
+ map_delblock( &cd->bl );
+ cd->bl.x=cd->usersd[0]->bl.x;
+ cd->bl.y=cd->usersd[0]->bl.y;
+ map_addblock( &cd->bl );
+
+ // Ä“x•\Ž¦
+ clif_dispchat(cd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ`ƒƒƒbƒg‚Ìó‘Ô(ƒ^ƒCƒgƒ‹“™)‚ð•ÏX
+ *------------------------------------------
+ */
+int chat_changechatstatus(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
+{
+ struct chat_data *cd;
+
+ nullpo_retr(1, sd);
+
+ cd=(struct chat_data*)map_id2bl(sd->chatID);
+ if(cd==NULL || (struct block_list *)sd != (*cd->owner))
+ return 1;
+
+ cd->limit = limit;
+ cd->pub = pub;
+ memcpy(cd->pass,pass,8);
+ cd->pass[7]= '\0'; //Overflow check... [Skotlex]
+ if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
+ memcpy(cd->title,title,titlelen);
+ cd->title[titlelen]=0;
+
+ clif_changechatstatus(cd);
+ clif_dispchat(cd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚çR‚èo‚·
+ *------------------------------------------
+ */
+int chat_kickchat(struct map_session_data *sd,char *kickusername)
+{
+ struct chat_data *cd;
+ int i;
+
+ nullpo_retr(1, sd);
+
+ cd = (struct chat_data *)map_id2bl(sd->chatID);
+
+ if (!cd) return -1;
+
+ for(i = 0; i < cd->users; i++) {
+ if (strcmp(cd->usersd[i]->status.name, kickusername) == 0) {
+ if (battle_config.gm_kick_chat && pc_isGM(cd->usersd[i]) >= battle_config.gm_kick_chat)
+ //gm kick protection by valaris
+ return 0;
+
+ chat_leavechat(cd->usersd[i]);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+/*==========================================
+ * npcƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
+ *------------------------------------------
+ */
+int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev)
+{
+ struct chat_data *cd;
+
+ nullpo_retr(1, nd);
+
+ cd = (struct chat_data *) aMalloc(sizeof(struct chat_data));
+
+ cd->limit = cd->trigger = limit;
+ if(trigger>0)
+ cd->trigger = trigger;
+ cd->pub = pub;
+ cd->users = 0;
+ memcpy(cd->pass,"",1);
+ if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
+ memcpy(cd->title,title,titlelen);
+ cd->title[titlelen]=0;
+
+ cd->bl.m = nd->bl.m;
+ cd->bl.x = nd->bl.x;
+ cd->bl.y = nd->bl.y;
+ cd->bl.type = BL_CHAT;
+ cd->bl.prev= cd->bl.next = NULL;
+ cd->owner_ = (struct block_list *)nd;
+ cd->owner = &cd->owner_;
+ if (strlen(ev) > 49)
+ { //npc_event is a char[50] [Skotlex]
+ memcpy(cd->npc_event,ev,49);
+ cd->npc_event[49] = '\0';
+ } else
+ memcpy(cd->npc_event,ev,strlen(ev)+1); //Include the \0
+
+ cd->bl.id = map_addobject(&cd->bl);
+ if(cd->bl.id==0){
+ aFree(cd);
+ return 0;
+ }
+ nd->chat_id=cd->bl.id;
+
+ clif_dispchat(cd,0);
+
+ return 0;
+}
+/*==========================================
+ * npcƒ`ƒƒƒbƒgƒ‹[ƒ€íœ
+ *------------------------------------------
+ */
+int chat_deletenpcchat(struct npc_data *nd)
+{
+ struct chat_data *cd;
+
+ nullpo_retr(0, nd);
+ nullpo_retr(0, cd=(struct chat_data*)map_id2bl(nd->chat_id));
+
+ chat_npckickall(cd);
+ clif_clearchat(cd,0);
+ map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
+ nd->chat_id=0;
+
+ return 0;
+}
+
+/*==========================================
+ * ‹K’èl”ˆÈã‚ŃCƒxƒ“ƒg‚ª’è‹`‚³‚ê‚Ä‚é‚È‚çŽÀs
+ *------------------------------------------
+ */
+int chat_triggerevent(struct chat_data *cd)
+{
+ nullpo_retr(0, cd);
+
+ if(cd->users>=cd->trigger && cd->npc_event[0])
+ npc_event_do(cd->npc_event);
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒg‚Ì—LŒø‰»
+ *------------------------------------------
+ */
+int chat_enableevent(struct chat_data *cd)
+{
+ nullpo_retr(0, cd);
+
+ cd->trigger&=0x7f;
+ chat_triggerevent(cd);
+ return 0;
+}
+/*==========================================
+ * ƒCƒxƒ“ƒg‚Ì–³Œø‰»
+ *------------------------------------------
+ */
+int chat_disableevent(struct chat_data *cd)
+{
+ nullpo_retr(0, cd);
+
+ cd->trigger|=0x80;
+ return 0;
+}
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚ç‘SˆõR‚èo‚·
+ *------------------------------------------
+ */
+int chat_npckickall(struct chat_data *cd)
+{
+ nullpo_retr(0, cd);
+
+ while(cd->users>0){
+ chat_leavechat(cd->usersd[cd->users-1]);
+ }
+ return 0;
+}
diff --git a/src/map/chat.h b/src/map/chat.h
index 1251ad98c..702fd7dad 100644
--- a/src/map/chat.h
+++ b/src/map/chat.h
@@ -1,22 +1,22 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHAT_H_
-#define _CHAT_H_
-
-#include "map.h"
-
-int chat_createchat(struct map_session_data *,int,int,char*,char*,int);
-int chat_joinchat(struct map_session_data *,int,char*);
-int chat_leavechat(struct map_session_data* );
-int chat_changechatowner(struct map_session_data *,char *);
-int chat_changechatstatus(struct map_session_data *,int,int,char*,char*,int);
-int chat_kickchat(struct map_session_data *,char *);
-
-int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev);
-int chat_deletenpcchat(struct npc_data *nd);
-int chat_enableevent(struct chat_data *cd);
-int chat_disableevent(struct chat_data *cd);
-int chat_npckickall(struct chat_data *cd);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CHAT_H_
+#define _CHAT_H_
+
+#include "map.h"
+
+int chat_createchat(struct map_session_data *,int,int,char*,char*,int);
+int chat_joinchat(struct map_session_data *,int,char*);
+int chat_leavechat(struct map_session_data* );
+int chat_changechatowner(struct map_session_data *,char *);
+int chat_changechatstatus(struct map_session_data *,int,int,char*,char*,int);
+int chat_kickchat(struct map_session_data *,char *);
+
+int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev);
+int chat_deletenpcchat(struct npc_data *nd);
+int chat_enableevent(struct chat_data *cd);
+int chat_disableevent(struct chat_data *cd);
+int chat_npckickall(struct chat_data *cd);
+
+#endif
diff --git a/src/map/chrif.c b/src/map/chrif.c
index df37aaf1d..1e8183641 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1,1636 +1,1636 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <time.h>
-#include <limits.h>
-
-#include "../common/malloc.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "npc.h"
-#include "pc.h"
-#include "status.h"
-#include "mercenary.h"
-#ifndef TXT_ONLY
-#include "charsave.h"
-#endif
-//Updated table (only doc^^) [Sirius]
-//Used Packets: U->2af8
-//Free Packets: F->2af8
-
-struct dbt *auth_db;
-
-static const int packet_len_table[0x3d] = {
- 60, 3,-1,27,10,-1, 6,-1, // 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff
- 6,-1,18, 7,-1,49,30,10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07
- 6,30,-1,10,86, 7,44,34, // 2b08-2b0f: U->2b08, U->2b09, U->2b0a, U->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f
- 0,-1,10, 6,11,-1, 0, 0, // 2b10-2b17: U->2b10, U->2b11, U->2b12, U->2b13, U->2b14, U->2b15, U->2b16, U->2b17
- -1,-1,-1,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f
- -1,10,-1,-1,-1,-1,-1,-1, // 2b20-2b27: U->2b20, U->2b21, F->2b22, F->2b23, F->2b24, F->2b25, F->2b26, F->2b27
-};
-
-//Used Packets:
-//2af8: Outgoing, chrif_connect -> 'connect to charserver / auth @ charserver'
-//2af9: Incomming, chrif_connectack -> 'answer of the 2af8 login(ok / fail)'
-//2afa: Outgoing, chrif_sendmap -> 'sending our maps'
-//2afb: Incomming, chrif_sendmapack -> 'Maps received successfully / or not ..'
-//2afc: Outgoing, chrif_scdata_request -> request sc_data for pc_authok'ed char. <- new command reuses previous one.
-//2afd: Incomming, chrif_authok -> 'character selected, add to auth db'
-//2afe: Outgoing, send_usercount_tochar -> 'sends player count of this map server to charserver'
-//2aff: Outgoing, send_users_tochar -> 'sends all actual connected character ids to charserver'
-//2b00: Incomming, map_setusers -> 'set the actual usercount? PACKET.2B COUNT.L.. ?' (not sure)
-//2b01: Outgoing, chrif_save -> 'charsave of char XY account XY (complete struct)'
-//2b02: Outgoing, chrif_charselectreq -> 'player returns from ingame to charserver to select another char.., this packets includes sessid etc' ? (not 100% sure)
-//2b03: Incomming, clif_charselectok -> '' (i think its the packet after enterworld?) (not sure)
-//2b04: Incomming, chrif_recvmap -> 'getting maps from charserver of other mapserver's'
-//2b05: Outgoing, chrif_changemapserver -> 'Tell the charserver the mapchange / quest for ok...'
-//2b06: Incomming, chrif_changemapserverack -> 'awnser of 2b05, ok/fail, data: dunno^^'
-//2b07: Incoming, clif_updatemaxid -> Received when updating the max account/char known
-//2b08: Outgoing, chrif_searchcharid -> '...'
-//2b09: Incomming, map_addchariddb -> 'Adds a name to the nick db'
-//2b0a: Outgoing, chrif_changegm -> 'level change of acc/char XY'
-//2b0b: Incomming, chrif_changedgm -> 'answer of 2b0a..'
-//2b0c: Outgoing, chrif_changeemail -> 'change mail address ...'
-//2b0d: Incomming, chrif_changedsex -> 'Change sex of acc XY'
-//2b0e: Outgoing, chrif_char_ask_name -> 'Do some operations (change sex, ban / unban etc)'
-//2b0f: Incomming, chrif_char_ask_name_answer -> 'answer of the 2b0e'
-//2b10: Outgoing, chrif_updatefamelist -> 'Update the fame ranking lists and send them'
-//2b11: Outgoing, chrif_changesex -> 'change sex of acc X'
-//2b12: Incomming, chrif_divorce -> 'divorce a wedding of charid X and partner id X'
-//2b13: Incomming, chrif_accountdeletion -> 'Delete acc XX, if the player is on, kick ....'
-//2b14: Incomming, chrif_accountban -> 'not sure: kick the player with message XY'
-//2b15: Incomming, chrif_recvgmaccounts -> 'recieve gm accs from charserver (seems to be incomplete !)'
-//2b16: Outgoing, chrif_ragsrvinfo -> 'sends motd / rates ....'
-//2b17: Outgoing, chrif_char_offline -> 'tell the charserver that the char is now offline'
-//2b18: Outgoing, chrif_char_reset_offline -> 'set all players OFF!'
-//2b19: Outgoing, chrif_char_online -> 'tell the charserver that the char .. is online'
-//2b1a: Outgoing, chrif_buildfamelist -> 'Build the fame ranking lists and send them'
-//2b1b: Incomming, chrif_recvfamelist -> 'Receive fame ranking lists'
-//2b1c: Outgoing, chrif_save_scdata -> 'Send sc_data of player for saving.'
-//2b1d: Incomming, chrif_load_scdata -> 'received sc_data of player for loading.'
-//2b1e: Incoming, chrif_update_ip -> 'Reqest forwarded from char-server for interserver IP sync.' [Lance]
-//2b1f: Incomming, chrif_disconnectplayer -> 'disconnects a player (aid X) with the message XY ... 0x81 ..' [Sirius]
-//2b20: Incomming, chrif_removemap -> 'remove maps of a server (sample: its going offline)' [Sirius]
-//2b21: Incomming, chrif_save_ack. Returned after a character has been "final saved" on the char-server. [Skotlex]
-//2b22-2b27: FREE
-
-int chrif_connected = 0;
-int char_fd = 0; //Using 0 instead of -1 is safer against crashes. [Skotlex]
-int srvinfo;
-static char char_ip_str[128];
-static in_addr_t char_ip= 0;
-static int char_port = 6121;
-static char userid[NAME_LENGTH], passwd[NAME_LENGTH];
-static int chrif_state = 0;
-static int char_init_done = 0;
-int other_mapserver_count=0; //Holds count of how many other map servers are online (apart of this instance) [Skotlex]
-
-//Interval at which map server updates online listing. [Valaris]
-#define CHECK_INTERVAL 3600000
-//Interval at which map server sends number of connected users. [Skotlex]
-#define UPDATE_INTERVAL 10000
-//This define should spare writing the check in every function. [Skotlex]
-#define chrif_check(a) { if(!chrif_isconnect()) return a; }
-
-// Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚ÝŠÖŒW
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setuserid(char *id)
-{
- memcpy(userid, id, NAME_LENGTH);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setpasswd(char *pwd)
-{
- memcpy(passwd, pwd, NAME_LENGTH);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_checkdefaultlogin(void)
-{
- if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
- ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
-#ifdef TXT_ONLY
- ShowNotice("Please edit your save/account.txt file to create a proper inter-server user/password (gender 'S')\n");
-#else
- ShowNotice("Please edit your 'login' table to create a proper inter-server user/password (gender 'S')\n");
-#endif
- ShowNotice("and then edit your user/password in conf/map_athena.conf (or conf/import/map_conf.txt)\n");
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_setip(char *ip)
-{
- char ip_str[16];
- char_ip = resolve_hostbyname(ip,NULL,ip_str);
-
- if (!char_ip) {
- ShowWarning("Failed to Resolve Char Server Address! (%s)\n", ip);
- return 0;
- }
- strncpy(char_ip_str, ip, sizeof(char_ip_str));
- ShowInfo("Char Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%s"CL_RESET"'.\n", ip, ip_str);
- return 1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setport(int port)
-{
- char_port = port;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_isconnect(void)
-{
- return (char_fd > 0 && session[char_fd] != NULL && chrif_state == 2);
-}
-
-/*==========================================
- * Saves char.
- * Flag = 1: Character is quitting.
- * Flag = 2: Character is changing map-servers
- *------------------------------------------
- */
-int chrif_save(struct map_session_data *sd, int flag)
-{
- nullpo_retr(-1, sd);
-
- pc_makesavestatus(sd);
- if(!chrif_isconnect())
- {
- if (flag) sd->state.finalsave = 1; //Will save character on reconnect.
- return -1;
- }
-
- if (sd->state.finalsave)
- return -1; //Refuse to save a char already tagged for final saving. [Skotlex]
- //For data sync
- if (sd->state.storage_flag == 1)
- storage_storage_save(sd->status.account_id, flag);
- else if (sd->state.storage_flag == 2)
- storage_guild_storagesave(sd->status.account_id, sd->status.guild_id, flag);
- if (flag) sd->state.storage_flag = 0; //Force close it.
-
- //Saving of registry values.
- if (sd->state.reg_dirty&4)
- intif_saveregistry(sd, 3); //Save char regs
- if (sd->state.reg_dirty&2)
- intif_saveregistry(sd, 2); //Save account regs
- if (sd->state.reg_dirty&1)
- intif_saveregistry(sd, 1); //Save account2 regs
-#ifndef TXT_ONLY
- if(charsave_method){ //New 'Local' save
- charsave_savechar(sd->status.char_id, &sd->status);
- if (flag) //Character final saved.
- sd->state.finalsave = 1;
- if (flag == 1)
- chrif_char_offline(sd); //Tell char server that character went offline.
- return 0;
- }
-#endif
- WFIFOHEAD(char_fd, sizeof(sd->status) + 13);
- WFIFOW(char_fd,0) = 0x2b01;
- WFIFOW(char_fd,2) = sizeof(sd->status) + 13;
- WFIFOL(char_fd,4) = sd->status.account_id;
- WFIFOL(char_fd,8) = sd->status.char_id;
- WFIFOB(char_fd,12) = (flag==1)?1:0; //Flag to tell char-server this character is quitting.
- memcpy(WFIFOP(char_fd,13), &sd->status, sizeof(sd->status));
- WFIFOSET(char_fd, WFIFOW(char_fd,2));
-
- if (sd->hd && merc_is_hom_active(sd->hd))
- merc_save(sd->hd);
-
- if (flag)
- sd->state.finalsave = 1; //Mark the last save as done.
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connect(int fd)
-{
- ShowStatus("Logging in to char server...\n", char_fd);
- WFIFOHEAD(fd, 60);
- WFIFOW(fd,0) = 0x2af8;
- memcpy(WFIFOP(fd,2), userid, NAME_LENGTH);
- memcpy(WFIFOP(fd,26), passwd, NAME_LENGTH);
- WFIFOL(fd,50) = 0;
- WFIFOL(fd,54) = clif_getip_long();
- WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov
- WFIFOSET(fd,60);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒv‘—M
- *------------------------------------------
- */
-int chrif_sendmap(int fd)
-{
- int i;
- ShowStatus("Sending maps to char server...\n");
- WFIFOHEAD(fd, 4 + map_num * 4);
- WFIFOW(fd,0) = 0x2afa;
- for(i = 0; i < map_num; i++)
- WFIFOW(fd,4+i*4) = map[i].index;
- WFIFOW(fd,2) = 4 + i * 4;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽóM
- *------------------------------------------
- */
-int chrif_recvmap(int fd)
-{
- int i, j, ip, port;
- unsigned char *p = (unsigned char *)&ip;
- RFIFOHEAD(fd);
- ip = RFIFOL(fd,4);
- port = RFIFOW(fd,8);
- for(i = 10, j = 0; i < RFIFOW(fd,2); i += 4, j++) {
- map_setipport(RFIFOW(fd,i), ip, port);
-// if (battle_config.etc_log)
-// printf("recv map %d %s\n", j, RFIFOP(fd,i));
- }
- if (battle_config.etc_log)
- ShowStatus("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
-
- other_mapserver_count++;
- return 0;
-}
-
-/*==========================================
- * Delete maps of other servers, (if an other mapserver is going OFF)
- *------------------------------------------
- */
-int chrif_removemap(int fd){
- int i, j, ip, port;
- unsigned char *p = (unsigned char *)&ip;
- RFIFOHEAD(fd);
-
- ip = RFIFOL(fd, 4);
- port = RFIFOW(fd, 8);
-
- for(i = 10, j = 0; i < RFIFOW(fd, 2); i += 4, j++){
- map_eraseipport(RFIFOW(fd, i), ip, port);
- }
-
- other_mapserver_count--;
- if(battle_config.etc_log)
- ShowStatus("remove map of server %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
- return 0;
-}
-
-int chrif_save_ack(int fd) {
- struct map_session_data *sd;
- RFIFOHEAD(fd);
- sd = map_id2sd(RFIFOL(fd,2));
-
- if (sd && sd->status.char_id == RFIFOL(fd,6))
- map_quit_ack(sd);
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®‚Ì‚½‚߂̃f[ƒ^€”õ—v‹
- *------------------------------------------
- */
-int chrif_changemapserver(struct map_session_data *sd, short map, int x, int y, int ip, short port)
-{
- int s_ip;
-
- nullpo_retr(-1, sd);
-
- chrif_check(-1);
-
- if (other_mapserver_count < 1)
- { //No other map servers are online!
- clif_authfail_fd(sd->fd, 0);
- return -1;
- }
-
- if (sd->fd && sd->fd < fd_max && session[sd->fd])
- s_ip = session[sd->fd]->client_addr.sin_addr.s_addr;
- else //Not connected? Can't retrieve IP
- s_ip = 0;
-
- WFIFOHEAD(char_fd, 35);
- WFIFOW(char_fd, 0) = 0x2b05;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->login_id1;
- WFIFOL(char_fd,10) = sd->login_id2;
- WFIFOL(char_fd,14) = sd->status.char_id;
- WFIFOW(char_fd,18) = map;
- WFIFOW(char_fd,20) = x;
- WFIFOW(char_fd,22) = y;
- WFIFOL(char_fd,24) = ip;
- WFIFOW(char_fd,28) = port;
- WFIFOB(char_fd,30) = sd->status.sex;
- WFIFOL(char_fd,31) = s_ip;
- WFIFOSET(char_fd,35);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®ack
- *------------------------------------------
- */
-int chrif_changemapserverack(int fd)
-{
- struct map_session_data *sd;
- RFIFOHEAD(fd);
- sd = map_id2sd(RFIFOL(fd,2));
-
- if (sd == NULL || sd->status.char_id != RFIFOL(fd,14))
- return -1;
-
- if (RFIFOL(fd,6) == 1) {
- if (battle_config.error_log)
- ShowError("map server change failed.\n");
- clif_authfail_fd(sd->fd, 0);
- return 0;
- }
- clif_changemapserver(sd, (char*)mapindex_id2name(RFIFOW(fd,18)), RFIFOW(fd,20), RFIFOW(fd,22), RFIFOL(fd,24), RFIFOW(fd,28));
-
- //Player has been saved already, remove him from memory. [Skotlex]
- map_quit(sd);
- map_quit_ack(sd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connectack(int fd)
-{
- RFIFOHEAD(fd);
- if (RFIFOB(fd,2)) {
- ShowFatalError("Connection to char-server failed %d.\n", RFIFOB(fd,2));
- exit(1);
- }
- ShowStatus("Successfully logged on to Char Server (Connection: '"CL_WHITE"%d"CL_RESET"').\n",fd);
- chrif_state = 1;
- chrif_connected=1;
-
- chrif_sendmap(fd);
-
- ShowStatus("Event '"CL_WHITE"OnCharIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnCharIfInit"));
- ShowStatus("Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
- if(!char_init_done) {
- char_init_done = 1;
- ShowStatus("Event '"CL_WHITE"OnInterIfInitOnce"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInitOnce"));
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_sendmapack(int fd)
-{
- RFIFOHEAD(fd);
- if (RFIFOB(fd,2)) {
- ShowFatalError("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
- exit(1);
- }
- memcpy(wisp_server_name, RFIFOP(fd,3), NAME_LENGTH);
- ShowStatus("Map sending complete. Map Server is now online.\n");
- chrif_state = 2;
-
- //If there are players online, send them to the char-server. [Skotlex]
- send_users_tochar(-1, gettick(), 0, 0);
-
- //Re-save any storages that were modified in the disconnection time. [Skotlex]
- do_reconnect_map();
- do_reconnect_storage();
-
- return 0;
-}
-
-/*==========================================
- * Request sc_data from charserver [Skotlex]
- *------------------------------------------
- */
-int chrif_scdata_request(int account_id, int char_id)
-{
-#ifdef ENABLE_SC_SAVING
-#ifndef TXT_ONLY
- if (charsave_method)
- return charsave_load_scdata(account_id, char_id);
-#endif
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 10);
- WFIFOW(char_fd, 0) = 0x2afc;
- WFIFOL(char_fd, 2) = account_id;
- WFIFOL(char_fd, 6) = char_id;
- WFIFOSET(char_fd,10);
-#endif
- return 0;
-}
-
-/*==========================================
- * new auth system [Kevin]
- *------------------------------------------
- */
-void chrif_authreq(struct map_session_data *sd)
-{
- struct auth_node *auth_data;
- auth_data=idb_get(auth_db, sd->bl.id);
-
- if(auth_data) {
- if(auth_data->char_dat &&
- auth_data->account_id== sd->bl.id &&
- auth_data->login_id1 == sd->login_id1)
- { //auth ok
- pc_authok(sd, auth_data->login_id2, auth_data->connect_until_time, auth_data->char_dat);
- } else { //auth failed
- pc_authfail(sd);
- chrif_char_offline(sd); //Set him offline, the char server likely has it set as online already.
- }
- if (auth_data->char_dat)
- aFree(auth_data->char_dat);
- idb_remove(auth_db, sd->bl.id);
- } else { //data from char server has not arrived yet.
- auth_data = aCalloc(1,sizeof(struct auth_node));
- auth_data->sd = sd;
- auth_data->fd = sd->fd;
- auth_data->account_id = sd->bl.id;
- auth_data->login_id1 = sd->login_id1;
- auth_data->node_created = gettick();
- uidb_put(auth_db, sd->bl.id, auth_data);
- }
- return;
-}
-
-//character selected, insert into auth db
-void chrif_authok(int fd) {
- struct auth_node *auth_data;
- RFIFOHEAD(fd);
-
- if (map_id2sd(RFIFOL(fd, 4)) != NULL)
- //Someone with this account is already in! Do not store the info to prevent possible sync exploits. [Skotlex]
- return;
-
- if ((auth_data =uidb_get(auth_db, RFIFOL(fd, 4))) != NULL)
- { //Is the character already awaiting authorization?
- if (auth_data->sd)
- {
- //First, check to see if the session data still exists (avoid dangling pointers)
- if(session[auth_data->fd] && session[auth_data->fd]->session_data == auth_data->sd)
- {
- if (auth_data->char_dat == NULL &&
- auth_data->account_id == RFIFOL(fd, 4) &&
- auth_data->login_id1 == RFIFOL(fd, 8))
- { //Auth Ok
- pc_authok(auth_data->sd, RFIFOL(fd, 16), RFIFOL(fd, 12), (struct mmo_charstatus*)RFIFOP(fd, 20));
- } else { //Auth Failed
- pc_authfail(auth_data->sd);
- chrif_char_offline(auth_data->sd); //Set him offline, the char server likely has it set as online already.
- }
- } //else: Character no longer exists, just go through.
- }
- //Delete the data of this node...
- if (auth_data->char_dat)
- aFree (auth_data->char_dat);
- uidb_remove(auth_db, RFIFOL(fd, 4));
- return;
- }
- // Awaiting for client to connect.
- auth_data = (struct auth_node *)aCalloc(1,sizeof(struct auth_node));
- auth_data->char_dat = (struct mmo_charstatus *) aCalloc(1,sizeof(struct mmo_charstatus));
-
- auth_data->account_id=RFIFOL(fd, 4);
- auth_data->login_id1=RFIFOL(fd, 8);
- auth_data->connect_until_time=RFIFOL(fd, 12);
- auth_data->login_id2=RFIFOL(fd, 16);
- memcpy(auth_data->char_dat,RFIFOP(fd, 20),sizeof(struct mmo_charstatus));
- auth_data->node_created=gettick();
- uidb_put(auth_db, RFIFOL(fd, 4), auth_data);
-}
-
-int auth_db_cleanup_sub(DBKey key,void *data,va_list ap)
-{
- struct auth_node *node=(struct auth_node*)data;
-
- if(DIFF_TICK(gettick(),node->node_created)>30000) {
- ShowNotice("Character (aid: %d) not authed within 30 seconds of character select!\n", node->account_id);
- if (node->char_dat)
- aFree(node->char_dat);
- db_remove(auth_db, key);
- return 1;
- }
- return 0;
-}
-
-int auth_db_cleanup(int tid, unsigned int tick, int id, int data) {
- auth_db->foreach(auth_db, auth_db_cleanup_sub);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_charselectreq(struct map_session_data *sd, unsigned long s_ip)
-{
- nullpo_retr(-1, sd);
-
- if( !sd || !sd->bl.id || !sd->login_id1 )
- return -1;
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 18);
- WFIFOW(char_fd, 0) = 0x2b02;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->login_id1;
- WFIFOL(char_fd,10) = sd->login_id2;
- WFIFOL(char_fd,14) = s_ip;
- WFIFOSET(char_fd,18);
-
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰–¼–â‚¢‡‚킹
- *------------------------------------------
- */
-int chrif_searchcharid(int char_id)
-{
- if( !char_id )
- return -1;
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 6);
- WFIFOW(char_fd,0) = 0x2b08;
- WFIFOL(char_fd,2) = char_id;
- WFIFOSET(char_fd,6);
-
- return 0;
-}
-
-/*==========================================
- * GM‚ɕω»—v‹
- *------------------------------------------
- */
-int chrif_changegm(int id, const char *pass, int len)
-{
- if (battle_config.etc_log)
- ShowInfo("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
-
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, len + 8);
- WFIFOW(char_fd,0) = 0x2b0a;
- WFIFOW(char_fd,2) = len + 8;
- WFIFOL(char_fd,4) = id;
- memcpy(WFIFOP(char_fd,8), pass, len);
- WFIFOSET(char_fd, len + 8);
-
- return 0;
-}
-
-/*==========================================
- * Change Email
- *------------------------------------------
- */
-int chrif_changeemail(int id, const char *actual_email, const char *new_email)
-{
- if (battle_config.etc_log)
- ShowInfo("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email);
-
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 86);
- WFIFOW(char_fd,0) = 0x2b0c;
- WFIFOL(char_fd,2) = id;
- memcpy(WFIFOP(char_fd,6), actual_email, 40);
- memcpy(WFIFOP(char_fd,46), new_email, 40);
- WFIFOSET(char_fd,86);
-
- return 0;
-}
-
-/*==========================================
- * Send message to char-server with a character name to do some operations (by Yor)
- * Used to ask Char-server about a character name to have the account number to modify account file in login-server.
- * type of operation:
- * 1: block
- * 2: ban
- * 3: unblock
- * 4: unban
- * 5: changesex
- *------------------------------------------
- */
-int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second)
-{
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 44);
- WFIFOW(char_fd, 0) = 0x2b0e;
- WFIFOL(char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody
- memcpy(WFIFOP(char_fd,6), character_name, NAME_LENGTH);
- WFIFOW(char_fd, 30) = operation_type; // type of operation
- if (operation_type == 2) {
- WFIFOW(char_fd, 32) = year;
- WFIFOW(char_fd, 34) = month;
- WFIFOW(char_fd, 36) = day;
- WFIFOW(char_fd, 38) = hour;
- WFIFOW(char_fd, 40) = minute;
- WFIFOW(char_fd, 42) = second;
- }
-// ShowInfo("chrif : sent 0x2b0e\n");
- WFIFOSET(char_fd,44);
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•Ï‰»—v‹
- *------------------------------------------
- */
-int chrif_changesex(int id, int sex) {
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 9);
- WFIFOW(char_fd,0) = 0x2b11;
- WFIFOW(char_fd,2) = 9;
- WFIFOL(char_fd,4) = id;
- WFIFOB(char_fd,8) = sex;
-// ShowInfo("chrif : sent 0x3000(changesex)\n");
- WFIFOSET(char_fd,9);
- return 0;
-}
-
-/*==========================================
- * Answer after a request about a character name to do some operations (by Yor)
- * Used to answer of chrif_char_ask_name.
- * type of operation:
- * 1: block
- * 2: ban
- * 3: unblock
- * 4: unban
- * 5: changesex
- * type of answer:
- * 0: login-server resquest done
- * 1: player not found
- * 2: gm level too low
- * 3: login-server offline
- *------------------------------------------
- */
-int chrif_char_ask_name_answer(int fd)
-{
- int acc;
- struct map_session_data *sd;
- char output[256];
- char player_name[NAME_LENGTH];
- RFIFOHEAD(fd);
-
- acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
- memcpy(player_name, RFIFOP(fd,6), NAME_LENGTH-1);
- player_name[NAME_LENGTH-1] = '\0';
-
- sd = map_id2sd(acc);
- if (acc >= 0 && sd != NULL) {
- if (RFIFOW(fd, 32) == 1) // player not found
- sprintf(output, "The player '%s' doesn't exist.", player_name);
- else {
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to block the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to block the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to block the the player '%s'.", player_name);
- break;
- }
- break;
- case 2: // ban
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to ban the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to ban the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to ban the the player '%s'.", player_name);
- break;
- }
- break;
- case 3: // unblock
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to unblock the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to unblock the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to unblock the the player '%s'.", player_name);
- break;
- }
- break;
- case 4: // unban
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to unban the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to unban the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to unban the the player '%s'.", player_name);
- break;
- }
- break;
- case 5: // changesex
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to change the sex of the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to change the sex of the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to change the sex of the the player '%s'.", player_name);
- break;
- }
- break;
- }
- }
- if (output[0] != '\0') {
- output[sizeof(output)-1] = '\0';
- clif_displaymessage(sd->fd, output);
- }
- } else
- ShowError("chrif_char_ask_name_answer failed - player not online.\n");
-
- return 0;
-}
-
-/*==========================================
- * End of GM change (@GM) (modified by Yor)
- *------------------------------------------
- */
-int chrif_changedgm(int fd)
-{
- int acc, level;
- struct map_session_data *sd = NULL;
- RFIFOHEAD(fd);
-
- acc = RFIFOL(fd,2);
- level = RFIFOL(fd,6);
-
- sd = map_id2sd(acc);
-
- if (battle_config.etc_log)
- ShowNotice("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc, level);
- if (sd != NULL) {
- if (level > 0)
- clif_displaymessage(sd->fd, "GM modification success.");
- else
- clif_displaymessage(sd->fd, "Failure of GM modification.");
- }
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•Ï‰»I—¹ (modified by Yor)
- *------------------------------------------
- */
-int chrif_changedsex(int fd)
-{
- int acc, sex, i;
- struct map_session_data *sd;
- RFIFOHEAD(fd);
-
- acc = RFIFOL(fd,2);
- sex = RFIFOL(fd,6);
- if (battle_config.etc_log)
- ShowNotice("chrif_changedsex %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL && sd->status.sex != sex) {
- sd->status.sex = !sd->status.sex;
-
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && sd->status.inventory[i].equip)
- pc_unequipitem((struct map_session_data*)sd, i, 2);
- }
- // reset skill of some job
- if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER) {
- // remove specifical skills of Bard classes
- for(i = 315; i <= 322; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- if (sd->status.skill_point > USHRT_MAX - sd->status.skill[i].lv)
- sd->status.skill_point = USHRT_MAX;
- else
- sd->status.skill_point += sd->status.skill[i].lv;
- sd->status.skill[i].id = 0;
- sd->status.skill[i].lv = 0;
- }
- }
- // remove specifical skills of Dancer classes
- for(i = 323; i <= 330; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- if (sd->status.skill_point > USHRT_MAX - sd->status.skill[i].lv)
- sd->status.skill_point = USHRT_MAX;
- else
- sd->status.skill_point += sd->status.skill[i].lv;
- sd->status.skill[i].id = 0;
- sd->status.skill[i].lv = 0;
- }
- }
- clif_updatestatus(sd, SP_SKILLPOINT);
- // change job if necessary
- if (sd->status.sex) //Changed from Dancer
- sd->status.class_ -= 1;
- else //Changed from Bard
- sd->status.class_ += 1;
- //sd->class_ needs not be updated as both Dancer/Bard are the same.
- }
- // save character
- //chrif_save(sd,1); Character will be saved on session closed -> map_quit
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it)
- clif_displaymessage(sd->fd, "Your sex has been changed (need disconnection by the server)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL) {
- ShowError("chrif_changedsex failed.\n");
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * —£¥î•ñ“¯Šú—v‹
- *------------------------------------------
- */
-int chrif_divorce(int char_id, int partner_id)
-{
- struct map_session_data *sd = NULL;
-
- if (!char_id || !partner_id)
- return 0;
-
- nullpo_retr(0, sd = map_nick2sd(map_charid2nick(partner_id)));
- if (sd->status.partner_id == char_id) {
- int i;
- //—£¥(‘Š•û‚ÍŠù‚ɃLƒƒƒ‰‚ªÁ‚¦‚Ä‚¢‚锤‚È‚Ì‚Å)
- sd->status.partner_id = 0;
-
- //‘Š•û‚ÌŒ‹¥Žw—Ö‚ð”’D
- for(i = 0; i < MAX_INVENTORY; i++)
- if (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc_delitem(sd, i, 1, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * Disconnection of a player (account has been deleted in login-server) by [Yor]
- *------------------------------------------
- */
-int chrif_accountdeletion(int fd)
-{
- int acc;
- struct map_session_data *sd;
- RFIFOHEAD(fd);
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- ShowNotice("chrif_accountdeletion %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL) {
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- clif_displaymessage(sd->fd, "Your account has been deleted (disconnection)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL)
- ShowError("chrif_accountdeletion failed - player not online.\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * Disconnection of a player (account has been banned of has a status, from login-server) by [Yor]
- *------------------------------------------
- */
-int chrif_accountban(int fd)
-{
- int acc;
- struct map_session_data *sd;
- RFIFOHEAD(fd);
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- ShowNotice("chrif_accountban %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL) {
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- if (RFIFOB(fd,6) == 0) { // 0: change of statut, 1: ban
- switch (RFIFOL(fd,7)) { // status or final date of a banishment
- case 1: // 0 = Unregistered ID
- clif_displaymessage(sd->fd, "Your account has 'Unregistered'.");
- break;
- case 2: // 1 = Incorrect Password
- clif_displaymessage(sd->fd, "Your account has an 'Incorrect Password'...");
- break;
- case 3: // 2 = This ID is expired
- clif_displaymessage(sd->fd, "Your account has expired.");
- break;
- case 4: // 3 = Rejected from Server
- clif_displaymessage(sd->fd, "Your account has been rejected from server.");
- break;
- case 5: // 4 = You have been blocked by the GM Team
- clif_displaymessage(sd->fd, "Your account has been blocked by the GM Team.");
- break;
- case 6: // 5 = Your Game's EXE file is not the latest version
- clif_displaymessage(sd->fd, "Your Game's EXE file is not the latest version.");
- break;
- case 7: // 6 = Your are Prohibited to log in until %s
- clif_displaymessage(sd->fd, "Your account has been prohibited to log in.");
- break;
- case 8: // 7 = Server is jammed due to over populated
- clif_displaymessage(sd->fd, "Server is jammed due to over populated.");
- break;
- case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- clif_displaymessage(sd->fd, "Your account has not more authorised.");
- break;
- case 100: // 99 = This ID has been totally erased
- clif_displaymessage(sd->fd, "Your account has been totally erased.");
- break;
- default:
- clif_displaymessage(sd->fd, "Your account has not more authorised.");
- break;
- }
- } else if (RFIFOB(fd,6) == 1) { // 0: change of statut, 1: ban
- time_t timestamp;
- char tmpstr[2048];
- timestamp = (time_t)RFIFOL(fd,7); // status or final date of a banishment
- strcpy(tmpstr, "Your account has been banished until ");
- strftime(tmpstr + strlen(tmpstr), 24, "%d-%m-%Y %H:%M:%S", localtime(&timestamp));
- clif_displaymessage(sd->fd, tmpstr);
- }
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL)
- ShowError("chrif_accountban failed - player not online.\n");
- }
-
- return 0;
-}
-
-//Disconnect the player out of the game, simple packet
-//packet.w AID.L WHY.B 2+4+1 = 7byte
-int chrif_disconnectplayer(int fd){
- struct map_session_data *sd;
- RFIFOHEAD(fd);
-
- sd = map_id2sd(RFIFOL(fd, 2));
-
- if(sd == NULL){
- return -1;
- }
-
- if (!sd->fd)
- { //No connection
- if (sd->state.autotrade)
- map_quit(sd); //Remove it.
- //Else we don't remove it because the char should have a timer to remove the player because it force-quit before,
- //and we don't want them kicking their previous instance before the 10 secs penalty time passes. [Skotlex]
- return 0;
- }
-
- switch(RFIFOB(fd, 6)){
- //clif_authfail_fd
- case 1: //server closed
- clif_authfail_fd(sd->fd, 1);
- break;
-
- case 2: //someone else logged in
- clif_authfail_fd(sd->fd, 2);
- break;
-
- case 3: //server overpopulated
- clif_authfail_fd(sd->fd, 4);
-
- break;
-
- case 4: //out of time payd for .. (avail)
- clif_authfail_fd(sd->fd, 10);
- break;
-
- case 5: //forced to dc by gm
- clif_authfail_fd(sd->fd, 15);
- break;
- }
-
-return 0;
-}
-
-/*==========================================
- * Request to reload GM accounts and their levels: send to char-server by [Yor]
- *------------------------------------------
- */
-int chrif_reloadGMdb(void)
-{
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 2);
- WFIFOW(char_fd,0) = 0x2af7;
- WFIFOSET(char_fd, 2);
-
- return 0;
-}
-
-/*==========================================
- * Receiving GM accounts and their levels from char-server by [Yor]
- *------------------------------------------
- */
-int chrif_recvgmaccounts(int fd)
-{
- ShowInfo("From login-server: receiving information of '"CL_WHITE"%d"CL_RESET"' GM accounts.\n", pc_read_gm_account(fd));
- return 0;
-}
-
-/*==========================================
- * Request/Receive top 10 Fame character list
- *------------------------------------------
- */
-
-int chrif_updatefamelist(struct map_session_data *sd)
-{
- char type;
- chrif_check(-1);
-
- switch(sd->class_&MAPID_UPPERMASK) {
- case MAPID_BLACKSMITH:
- type = 1;
- break;
- case MAPID_ALCHEMIST:
- type = 2;
- break;
- case MAPID_TAEKWON:
- type = 3;
- break;
- default:
- return 0;
- }
-
- WFIFOHEAD(char_fd, 12);
- WFIFOW(char_fd, 0) = 0x2b10;
- WFIFOL(char_fd, 2) = sd->status.char_id;
- WFIFOL(char_fd, 6) = sd->status.fame;
- WFIFOB(char_fd, 10) = type;
- WFIFOB(char_fd, 11) = pc_famerank(sd->status.char_id, sd->class_&MAPID_UPPERMASK);
- WFIFOSET(char_fd, 12);
-
- return 0;
-}
-
-int chrif_buildfamelist(void)
-{
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 2);
- WFIFOW(char_fd, 0) = 0x2b1a;
- WFIFOSET(char_fd, 2);
-
- return 0;
-}
-
-int chrif_recvfamelist(int fd)
-{
- int num, size;
- int total = 0, len = 8;
- RFIFOHEAD(fd);
-
- malloc_tsetdword (smith_fame_list, 0, sizeof(smith_fame_list));
- malloc_tsetdword (chemist_fame_list, 0, sizeof(chemist_fame_list));
- malloc_tsetdword (taekwon_fame_list, 0, sizeof(taekwon_fame_list));
-
- size = RFIFOW(fd, 6); //Blacksmith block size
- for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
- memcpy(&smith_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- total += num;
-
- size = RFIFOW(fd, 4); //Alchemist block size
- for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
- memcpy(&chemist_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- total += num;
-
- size = RFIFOW(fd, 2); //Total packet length
- for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
- memcpy(&taekwon_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
- len += sizeof(struct fame_list);
- }
- total += num;
-
- ShowInfo("Received Fame List of '"CL_WHITE"%d"CL_RESET"' characters.\n", total);
-
- return 0;
-}
-
-int chrif_save_scdata(struct map_session_data *sd)
-{ //parses the sc_data of the player and sends it to the char-server for saving. [Skotlex]
-#ifdef ENABLE_SC_SAVING
- int i, count=0;
- unsigned int tick;
- struct status_change_data data;
- struct TimerData *timer;
-
- if (sd->state.finalsave) //Character was already saved?
- return -1;
-#ifndef TXT_ONLY
- if(charsave_method) //New 'Local' save
- {
- charsave_save_scdata(sd->status.account_id, sd->status.char_id, &sd->sc, MAX_STATUSCHANGE);
- return 0;
- }
-#endif
-
- chrif_check(-1);
- tick = gettick();
-
- WFIFOHEAD(char_fd, 14 + SC_MAX*sizeof(struct status_change_data));
- WFIFOW(char_fd,0) = 0x2b1c;
- WFIFOL(char_fd,4) = sd->status.account_id;
- WFIFOL(char_fd,8) = sd->status.char_id;
- for (i = 0; i < SC_MAX; i++)
- {
- if (sd->sc.data[i].timer == -1)
- continue;
- timer = get_timer(sd->sc.data[i].timer);
- if (timer == NULL || timer->func != status_change_timer || DIFF_TICK(timer->tick,tick) < 0)
- continue;
- data.tick = DIFF_TICK(timer->tick,tick); //Duration that is left before ending.
- data.type = i;
- data.val1 = sd->sc.data[i].val1;
- data.val2 = sd->sc.data[i].val2;
- data.val3 = sd->sc.data[i].val3;
- data.val4 = sd->sc.data[i].val4;
- memcpy(WFIFOP(char_fd,14 +count*sizeof(struct status_change_data)),
- &data, sizeof(struct status_change_data));
- count++;
- }
- if (count == 0)
- return 0; //Nothing to save.
- WFIFOW(char_fd,12) = count;
- WFIFOW(char_fd,2) = 14 +count*sizeof(struct status_change_data); //Total packet size
- WFIFOSET(char_fd,WFIFOW(char_fd,2));
-#endif
- return 0;
-}
-
-int chrif_load_scdata(int fd)
-{ //Retrieve and load sc_data for a player. [Skotlex]
-#ifdef ENABLE_SC_SAVING
- struct map_session_data *sd;
- struct status_change_data *data;
- int aid, cid, i, count;
- RFIFOHEAD(fd);
-
- aid = RFIFOL(fd,4); //Player Account ID
- cid = RFIFOL(fd,8); //Player Char ID
-
- sd = map_id2sd(aid);
- if (!sd)
- {
- ShowError("chrif_load_scdata: Player of AID %d not found!\n", aid);
- return -1;
- }
- if (sd->status.char_id != cid)
- {
- ShowError("chrif_load_scdata: Receiving data for account %d, char id does not matches (%d != %d)!\n", aid, sd->status.char_id, cid);
- return -1;
- }
- count = RFIFOW(fd,12); //sc_count
- for (i = 0; i < count; i++)
- {
- data = (struct status_change_data*)RFIFOP(fd,14 + i*sizeof(struct status_change_data));
- if (data->tick < 1)
- { //Protection against invalid tick values. [Skotlex]
- ShowWarning("chrif_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", data->tick, data->type, sd->status.name);
- continue;
- }
- status_change_start(&sd->bl, data->type, 10000, data->val1, data->val2, data->val3, data->val4, data->tick, 15);
- }
-#endif
- return 0;
-}
-
-/*==========================================
- * Send rates and motd to char server [Wizputer]
- *------------------------------------------
- */
- int chrif_ragsrvinfo(int base_rate, int job_rate, int drop_rate)
-{
- char buf[256];
- FILE *fp;
- int i;
-
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, sizeof(buf) + 10);
- WFIFOW(char_fd,0) = 0x2b16;
- WFIFOW(char_fd,2) = base_rate;
- WFIFOW(char_fd,4) = job_rate;
- WFIFOW(char_fd,6) = drop_rate;
-
- if ((fp = fopen(motd_txt, "r")) != NULL) {
- if (fgets(buf, 250, fp) != NULL) {
- for(i = 0; buf[i]; i++) {
- if (buf[i] == '\r' || buf[i] == '\n') {
- buf[i] = 0;
- break;
- }
- }
- WFIFOW(char_fd,8) = sizeof(buf) + 10;
- memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
- }
- fclose(fp);
- } else {
- malloc_tsetdword(buf, 0, sizeof(buf)); //No data found, send empty packets?
- WFIFOW(char_fd,8) = sizeof(buf) + 10;
- memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
- }
- WFIFOSET(char_fd,WFIFOW(char_fd,8));
- return 0;
-}
-
-
-/*=========================================
- * Tell char-server charcter disconnected [Wizputer]
- *-----------------------------------------
- */
-
-int chrif_char_offline(struct map_session_data *sd)
-{
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 10);
- WFIFOW(char_fd,0) = 0x2b17;
- WFIFOL(char_fd,2) = sd->status.char_id;
- WFIFOL(char_fd,6) = sd->status.account_id;
- WFIFOSET(char_fd,10);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server to reset all chars offline [Wizputer]
- *-----------------------------------------
- */
-int chrif_flush_fifo(void) {
- chrif_check(-1);
-
- set_nonblocking(char_fd, 0);
- flush_fifos();
- set_nonblocking(char_fd, 1);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server to reset all chars offline [Wizputer]
- *-----------------------------------------
- */
-int chrif_char_reset_offline(void) {
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 2);
- WFIFOW(char_fd,0) = 0x2b18;
- WFIFOSET(char_fd,2);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server charcter is online [Wizputer]
- *-----------------------------------------
- */
-
-int chrif_char_online(struct map_session_data *sd)
-{
- chrif_check(-1);
-
- WFIFOHEAD(char_fd, 10);
- WFIFOW(char_fd,0) = 0x2b19;
- WFIFOL(char_fd,2) = sd->status.char_id;
- WFIFOL(char_fd,6) = sd->status.account_id;
- WFIFOSET(char_fd,10);
-
- return 0;
-}
-
-int chrif_disconnect(int fd) {
- if(fd == char_fd) {
- char_fd = 0;
- ShowWarning("Map Server disconnected from Char Server.\n\n");
- chrif_connected = 0;
-
- other_mapserver_count=0; //Reset counter. We receive ALL maps from all map-servers on reconnect.
- map_eraseallipport();
-
- //Attempt to reconnect in a second. [Skotlex]
- add_timer(gettick() + 1000, check_connect_char_server, 0, 0);
- }
- return 0;
-}
-
-void chrif_update_ip(int fd){
- unsigned long new_ip;
- WFIFOHEAD(fd, 6);
- new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
- if (new_ip && new_ip != char_ip)
- char_ip = new_ip; //Update char_ip
-
- new_ip = clif_refresh_ip();
- if (!new_ip) return; //No change
- WFIFOW(fd, 0) = 0x2736;
- WFIFOL(fd, 2) = new_ip;
- WFIFOSET(fd, 6);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_parse(int fd)
-{
- int packet_len, cmd;
- // only char-server can have an access to here.
- // so, if it isn't the char-server, we disconnect the session (fd != char_fd).
- if (fd != char_fd || session[fd]->eof) {
- if (fd == char_fd && chrif_connected == 1) {
- chrif_disconnect (fd);
- }
- else if (fd != char_fd)
- ShowDebug("chrif_parse: Disconnecting invalid session #%d (is not the char-server)\n", fd);
-
- do_close(fd);
- return 0;
- }
-
- while (RFIFOREST(fd) >= 2 && !session[fd]->eof) { //Infinite loop on broken pipe fix. [Skotlex]
- RFIFOHEAD(fd);
- cmd = RFIFOW(fd,0);
- if (cmd < 0x2af8 || cmd >= 0x2af8 + (sizeof(packet_len_table) / sizeof(packet_len_table[0])) ||
- packet_len_table[cmd-0x2af8] == 0) {
-
- int r = intif_parse(fd); // intif‚É“n‚·
-
- if (r == 1) continue; // intif‚ň—‚µ‚½
- if (r == 2) return 0; // intif‚ň—‚µ‚½‚ªAƒf[ƒ^‚ª‘«‚è‚È‚¢
-
- session[fd]->eof = 1;
- ShowWarning("chrif_parse: session #%d, intif_parse failed -> disconnected.\n", fd);
- return 0;
- }
- packet_len = packet_len_table[cmd-0x2af8];
- if (packet_len == -1) {
- if (RFIFOREST(fd) < 4)
- return 0;
- packet_len = RFIFOW(fd,2);
- }
- if ((int)RFIFOREST(fd) < packet_len)
- return 0;
-
- switch(cmd) {
- case 0x2af9: chrif_connectack(fd); break;
- case 0x2afb: chrif_sendmapack(fd); break;
- case 0x2afd: chrif_authok(fd); break;
- case 0x2b00: map_setusers(fd); break;
- case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
- case 0x2b04: chrif_recvmap(fd); break;
- case 0x2b06: chrif_changemapserverack(fd); break;
- case 0x2b07: clif_updatemaxid(RFIFOL(fd,2), RFIFOL(fd,6)); break;
- case 0x2b09: map_addchariddb(RFIFOL(fd,2), (char*)RFIFOP(fd,6)); break;
- case 0x2b0b: chrif_changedgm(fd); break;
- case 0x2b0d: chrif_changedsex(fd); break;
- case 0x2b0f: chrif_char_ask_name_answer(fd); break;
- case 0x2b12: chrif_divorce(RFIFOL(fd,2), RFIFOL(fd,6)); break;
- case 0x2b13: chrif_accountdeletion(fd); break;
- case 0x2b14: chrif_accountban(fd); break;
- case 0x2b15: chrif_recvgmaccounts(fd); break;
- case 0x2b1b: chrif_recvfamelist(fd); break;
- case 0x2b1d: chrif_load_scdata(fd); break;
- case 0x2b1e: chrif_update_ip(fd); break;
- case 0x2b1f: chrif_disconnectplayer(fd); break;
- case 0x2b20: chrif_removemap(fd); break;
- case 0x2b21: chrif_save_ack(fd); break;
-
- default:
- if (battle_config.error_log)
- ShowError("chrif_parse : unknown packet (session #%d): 0x%x. Disconnecting.\n", fd, cmd);
- session[fd]->eof = 1;
- return 0;
- }
- if (fd == char_fd) //There's the slight chance we lost the connection during parse, in which case this would segfault if not checked [Skotlex]
- RFIFOSKIP(fd, packet_len);
- }
-
- return 0;
-}
-
-int send_usercount_tochar(int tid, unsigned int tick, int id, int data) {
- int count;
- static int last_count = 0;
-
- chrif_check(-1);
-
- map_getallusers(&count);
-
- if (count == last_count) //No need to waste packets.
- return 0;
- last_count = count;
-
- WFIFOHEAD(char_fd, 4);
- WFIFOW(char_fd,0) = 0x2afe;
- WFIFOW(char_fd,2) = count;
- WFIFOSET(char_fd,4);
- return 0;
-}
-
-/*==========================================
- * timerŠÖ”
- * ¡‚±‚ÌmapŽI‚ÉŒq‚ª‚Á‚Ä‚¢‚éƒNƒ‰ƒCƒAƒ“ƒgl”‚ðcharŽI‚Ö‘—‚é
- *------------------------------------------
- */
-int send_users_tochar(int tid, unsigned int tick, int id, int data) {
- int count, users=0, i;
- struct map_session_data **all_sd;
-
- chrif_check(-1);
-
- all_sd = map_getallusers(&count);
- WFIFOHEAD(char_fd, 6+8*users);
- WFIFOW(char_fd,0) = 0x2aff;
- for (i = 0; i < count; i++) {
- WFIFOL(char_fd,6+8*users) = all_sd[i]->status.account_id;
- WFIFOL(char_fd,6+8*users+4) = all_sd[i]->status.char_id;
- users++;
- }
- WFIFOW(char_fd,2) = 6 + 8 * users;
- WFIFOW(char_fd,4) = users;
- WFIFOSET(char_fd,6+8*users);
-
- return 0;
-}
-
-/*==========================================
- * timerŠÖ”
- * charŽI‚Æ‚ÌÚ‘±‚ðŠm”F‚µA‚à‚µØ‚ê‚Ä‚¢‚½‚çÄ“xÚ‘±‚·‚é
- *------------------------------------------
- */
-int check_connect_char_server(int tid, unsigned int tick, int id, int data) {
- static int displayed = 0;
- if (char_fd <= 0 || session[char_fd] == NULL) {
- if (!displayed) {
- ShowStatus("Attempting to connect to Char Server. Please wait.\n");
- displayed = 1;
- }
- chrif_state = 0;
- char_fd = make_connection(char_ip, char_port);
- if (char_fd == -1)
- { //Attempt to connect later. [Skotlex]
- char_fd = 0;
- return 0;
- }
- session[char_fd]->func_parse = chrif_parse;
- realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
-
- chrif_connect(char_fd);
- chrif_connected = (chrif_state == 2);
-#ifndef TXT_ONLY
- srvinfo = 0;
-#endif /* not TXT_ONLY */
- } else {
-#ifndef TXT_ONLY
- if (srvinfo == 0) {
- chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common);
- srvinfo = 1;
- }
-#endif /* not TXT_ONLY */
-/* There is no need, the connection is TCP, so the packet is assured to arrive unless the connection dies [Skotlex]
- //If for some reason the next iteration (10 secs) we are still not connected,
- //assume the packets got lost, so we need to resend them. [Skotlex]
- if (chrif_state == 0)
- chrif_connect(char_fd);
- else if (chrif_state == 1)
- chrif_sendmap(char_fd);
-*/
- }
- if (chrif_isconnect()) displayed = 0;
- return 0;
-}
-
-int auth_db_final(DBKey k,void *d,va_list ap) {
- struct auth_node *node=(struct auth_node*)d;
- if (node->char_dat)
- aFree(node->char_dat);
- return 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_chrif(void)
-{
- delete_session(char_fd);
- auth_db->destroy(auth_db, auth_db_final);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_chrif(void)
-{
- add_timer_func_list(check_connect_char_server, "check_connect_char_server");
- add_timer_func_list(send_usercount_tochar, "send_usercount_tochar");
- add_timer_func_list(send_users_tochar, "send_users_tochar");
- add_timer_func_list(auth_db_cleanup, "auth_db_cleanup");
- add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
-#ifdef TXT_ONLY
- //Txt needs this more frequently because it is used for the online.html file.
- add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, UPDATE_INTERVAL);
-#else
- add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, CHECK_INTERVAL);
- add_timer_interval(gettick() + 1000, send_usercount_tochar, 0, 0, UPDATE_INTERVAL);
-#endif
- add_timer_interval(gettick() + 1000, auth_db_cleanup, 0, 0, 30 * 1000);
-
- auth_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <time.h>
+#include <limits.h>
+
+#include "../common/malloc.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/showmsg.h"
+
+#include "map.h"
+#include "battle.h"
+#include "chrif.h"
+#include "clif.h"
+#include "intif.h"
+#include "npc.h"
+#include "pc.h"
+#include "status.h"
+#include "mercenary.h"
+#ifndef TXT_ONLY
+#include "charsave.h"
+#endif
+//Updated table (only doc^^) [Sirius]
+//Used Packets: U->2af8
+//Free Packets: F->2af8
+
+struct dbt *auth_db;
+
+static const int packet_len_table[0x3d] = {
+ 60, 3,-1,27,10,-1, 6,-1, // 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff
+ 6,-1,18, 7,-1,49,30,10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07
+ 6,30,-1,10,86, 7,44,34, // 2b08-2b0f: U->2b08, U->2b09, U->2b0a, U->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f
+ 0,-1,10, 6,11,-1, 0, 0, // 2b10-2b17: U->2b10, U->2b11, U->2b12, U->2b13, U->2b14, U->2b15, U->2b16, U->2b17
+ -1,-1,-1,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f
+ -1,10,-1,-1,-1,-1,-1,-1, // 2b20-2b27: U->2b20, U->2b21, F->2b22, F->2b23, F->2b24, F->2b25, F->2b26, F->2b27
+};
+
+//Used Packets:
+//2af8: Outgoing, chrif_connect -> 'connect to charserver / auth @ charserver'
+//2af9: Incomming, chrif_connectack -> 'answer of the 2af8 login(ok / fail)'
+//2afa: Outgoing, chrif_sendmap -> 'sending our maps'
+//2afb: Incomming, chrif_sendmapack -> 'Maps received successfully / or not ..'
+//2afc: Outgoing, chrif_scdata_request -> request sc_data for pc_authok'ed char. <- new command reuses previous one.
+//2afd: Incomming, chrif_authok -> 'character selected, add to auth db'
+//2afe: Outgoing, send_usercount_tochar -> 'sends player count of this map server to charserver'
+//2aff: Outgoing, send_users_tochar -> 'sends all actual connected character ids to charserver'
+//2b00: Incomming, map_setusers -> 'set the actual usercount? PACKET.2B COUNT.L.. ?' (not sure)
+//2b01: Outgoing, chrif_save -> 'charsave of char XY account XY (complete struct)'
+//2b02: Outgoing, chrif_charselectreq -> 'player returns from ingame to charserver to select another char.., this packets includes sessid etc' ? (not 100% sure)
+//2b03: Incomming, clif_charselectok -> '' (i think its the packet after enterworld?) (not sure)
+//2b04: Incomming, chrif_recvmap -> 'getting maps from charserver of other mapserver's'
+//2b05: Outgoing, chrif_changemapserver -> 'Tell the charserver the mapchange / quest for ok...'
+//2b06: Incomming, chrif_changemapserverack -> 'awnser of 2b05, ok/fail, data: dunno^^'
+//2b07: Incoming, clif_updatemaxid -> Received when updating the max account/char known
+//2b08: Outgoing, chrif_searchcharid -> '...'
+//2b09: Incomming, map_addchariddb -> 'Adds a name to the nick db'
+//2b0a: Outgoing, chrif_changegm -> 'level change of acc/char XY'
+//2b0b: Incomming, chrif_changedgm -> 'answer of 2b0a..'
+//2b0c: Outgoing, chrif_changeemail -> 'change mail address ...'
+//2b0d: Incomming, chrif_changedsex -> 'Change sex of acc XY'
+//2b0e: Outgoing, chrif_char_ask_name -> 'Do some operations (change sex, ban / unban etc)'
+//2b0f: Incomming, chrif_char_ask_name_answer -> 'answer of the 2b0e'
+//2b10: Outgoing, chrif_updatefamelist -> 'Update the fame ranking lists and send them'
+//2b11: Outgoing, chrif_changesex -> 'change sex of acc X'
+//2b12: Incomming, chrif_divorce -> 'divorce a wedding of charid X and partner id X'
+//2b13: Incomming, chrif_accountdeletion -> 'Delete acc XX, if the player is on, kick ....'
+//2b14: Incomming, chrif_accountban -> 'not sure: kick the player with message XY'
+//2b15: Incomming, chrif_recvgmaccounts -> 'recieve gm accs from charserver (seems to be incomplete !)'
+//2b16: Outgoing, chrif_ragsrvinfo -> 'sends motd / rates ....'
+//2b17: Outgoing, chrif_char_offline -> 'tell the charserver that the char is now offline'
+//2b18: Outgoing, chrif_char_reset_offline -> 'set all players OFF!'
+//2b19: Outgoing, chrif_char_online -> 'tell the charserver that the char .. is online'
+//2b1a: Outgoing, chrif_buildfamelist -> 'Build the fame ranking lists and send them'
+//2b1b: Incomming, chrif_recvfamelist -> 'Receive fame ranking lists'
+//2b1c: Outgoing, chrif_save_scdata -> 'Send sc_data of player for saving.'
+//2b1d: Incomming, chrif_load_scdata -> 'received sc_data of player for loading.'
+//2b1e: Incoming, chrif_update_ip -> 'Reqest forwarded from char-server for interserver IP sync.' [Lance]
+//2b1f: Incomming, chrif_disconnectplayer -> 'disconnects a player (aid X) with the message XY ... 0x81 ..' [Sirius]
+//2b20: Incomming, chrif_removemap -> 'remove maps of a server (sample: its going offline)' [Sirius]
+//2b21: Incomming, chrif_save_ack. Returned after a character has been "final saved" on the char-server. [Skotlex]
+//2b22-2b27: FREE
+
+int chrif_connected = 0;
+int char_fd = 0; //Using 0 instead of -1 is safer against crashes. [Skotlex]
+int srvinfo;
+static char char_ip_str[128];
+static in_addr_t char_ip= 0;
+static int char_port = 6121;
+static char userid[NAME_LENGTH], passwd[NAME_LENGTH];
+static int chrif_state = 0;
+static int char_init_done = 0;
+int other_mapserver_count=0; //Holds count of how many other map servers are online (apart of this instance) [Skotlex]
+
+//Interval at which map server updates online listing. [Valaris]
+#define CHECK_INTERVAL 3600000
+//Interval at which map server sends number of connected users. [Skotlex]
+#define UPDATE_INTERVAL 10000
+//This define should spare writing the check in every function. [Skotlex]
+#define chrif_check(a) { if(!chrif_isconnect()) return a; }
+
+// Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚ÝŠÖŒW
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setuserid(char *id)
+{
+ memcpy(userid, id, NAME_LENGTH);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setpasswd(char *pwd)
+{
+ memcpy(passwd, pwd, NAME_LENGTH);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_checkdefaultlogin(void)
+{
+ if (strcmp(userid, "s1")==0 && strcmp(passwd, "p1")==0) {
+ ShowError("Using the default user/password s1/p1 is NOT RECOMMENDED.\n");
+#ifdef TXT_ONLY
+ ShowNotice("Please edit your save/account.txt file to create a proper inter-server user/password (gender 'S')\n");
+#else
+ ShowNotice("Please edit your 'login' table to create a proper inter-server user/password (gender 'S')\n");
+#endif
+ ShowNotice("and then edit your user/password in conf/map_athena.conf (or conf/import/map_conf.txt)\n");
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_setip(char *ip)
+{
+ char ip_str[16];
+ char_ip = resolve_hostbyname(ip,NULL,ip_str);
+
+ if (!char_ip) {
+ ShowWarning("Failed to Resolve Char Server Address! (%s)\n", ip);
+ return 0;
+ }
+ strncpy(char_ip_str, ip, sizeof(char_ip_str));
+ ShowInfo("Char Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%s"CL_RESET"'.\n", ip, ip_str);
+ return 1;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setport(int port)
+{
+ char_port = port;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_isconnect(void)
+{
+ return (char_fd > 0 && session[char_fd] != NULL && chrif_state == 2);
+}
+
+/*==========================================
+ * Saves char.
+ * Flag = 1: Character is quitting.
+ * Flag = 2: Character is changing map-servers
+ *------------------------------------------
+ */
+int chrif_save(struct map_session_data *sd, int flag)
+{
+ nullpo_retr(-1, sd);
+
+ pc_makesavestatus(sd);
+ if(!chrif_isconnect())
+ {
+ if (flag) sd->state.finalsave = 1; //Will save character on reconnect.
+ return -1;
+ }
+
+ if (sd->state.finalsave)
+ return -1; //Refuse to save a char already tagged for final saving. [Skotlex]
+ //For data sync
+ if (sd->state.storage_flag == 1)
+ storage_storage_save(sd->status.account_id, flag);
+ else if (sd->state.storage_flag == 2)
+ storage_guild_storagesave(sd->status.account_id, sd->status.guild_id, flag);
+ if (flag) sd->state.storage_flag = 0; //Force close it.
+
+ //Saving of registry values.
+ if (sd->state.reg_dirty&4)
+ intif_saveregistry(sd, 3); //Save char regs
+ if (sd->state.reg_dirty&2)
+ intif_saveregistry(sd, 2); //Save account regs
+ if (sd->state.reg_dirty&1)
+ intif_saveregistry(sd, 1); //Save account2 regs
+#ifndef TXT_ONLY
+ if(charsave_method){ //New 'Local' save
+ charsave_savechar(sd->status.char_id, &sd->status);
+ if (flag) //Character final saved.
+ sd->state.finalsave = 1;
+ if (flag == 1)
+ chrif_char_offline(sd); //Tell char server that character went offline.
+ return 0;
+ }
+#endif
+ WFIFOHEAD(char_fd, sizeof(sd->status) + 13);
+ WFIFOW(char_fd,0) = 0x2b01;
+ WFIFOW(char_fd,2) = sizeof(sd->status) + 13;
+ WFIFOL(char_fd,4) = sd->status.account_id;
+ WFIFOL(char_fd,8) = sd->status.char_id;
+ WFIFOB(char_fd,12) = (flag==1)?1:0; //Flag to tell char-server this character is quitting.
+ memcpy(WFIFOP(char_fd,13), &sd->status, sizeof(sd->status));
+ WFIFOSET(char_fd, WFIFOW(char_fd,2));
+
+ if (sd->hd && merc_is_hom_active(sd->hd))
+ merc_save(sd->hd);
+
+ if (flag)
+ sd->state.finalsave = 1; //Mark the last save as done.
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_connect(int fd)
+{
+ ShowStatus("Logging in to char server...\n", char_fd);
+ WFIFOHEAD(fd, 60);
+ WFIFOW(fd,0) = 0x2af8;
+ memcpy(WFIFOP(fd,2), userid, NAME_LENGTH);
+ memcpy(WFIFOP(fd,26), passwd, NAME_LENGTH);
+ WFIFOL(fd,50) = 0;
+ WFIFOL(fd,54) = clif_getip_long();
+ WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov
+ WFIFOSET(fd,60);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒv‘—M
+ *------------------------------------------
+ */
+int chrif_sendmap(int fd)
+{
+ int i;
+ ShowStatus("Sending maps to char server...\n");
+ WFIFOHEAD(fd, 4 + map_num * 4);
+ WFIFOW(fd,0) = 0x2afa;
+ for(i = 0; i < map_num; i++)
+ WFIFOW(fd,4+i*4) = map[i].index;
+ WFIFOW(fd,2) = 4 + i * 4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvŽóM
+ *------------------------------------------
+ */
+int chrif_recvmap(int fd)
+{
+ int i, j, ip, port;
+ unsigned char *p = (unsigned char *)&ip;
+ RFIFOHEAD(fd);
+ ip = RFIFOL(fd,4);
+ port = RFIFOW(fd,8);
+ for(i = 10, j = 0; i < RFIFOW(fd,2); i += 4, j++) {
+ map_setipport(RFIFOW(fd,i), ip, port);
+// if (battle_config.etc_log)
+// printf("recv map %d %s\n", j, RFIFOP(fd,i));
+ }
+ if (battle_config.etc_log)
+ ShowStatus("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
+
+ other_mapserver_count++;
+ return 0;
+}
+
+/*==========================================
+ * Delete maps of other servers, (if an other mapserver is going OFF)
+ *------------------------------------------
+ */
+int chrif_removemap(int fd){
+ int i, j, ip, port;
+ unsigned char *p = (unsigned char *)&ip;
+ RFIFOHEAD(fd);
+
+ ip = RFIFOL(fd, 4);
+ port = RFIFOW(fd, 8);
+
+ for(i = 10, j = 0; i < RFIFOW(fd, 2); i += 4, j++){
+ map_eraseipport(RFIFOW(fd, i), ip, port);
+ }
+
+ other_mapserver_count--;
+ if(battle_config.etc_log)
+ ShowStatus("remove map of server %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
+ return 0;
+}
+
+int chrif_save_ack(int fd) {
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+ sd = map_id2sd(RFIFOL(fd,2));
+
+ if (sd && sd->status.char_id == RFIFOL(fd,6))
+ map_quit_ack(sd);
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvŽIŠÔˆÚ“®‚Ì‚½‚߂̃f[ƒ^€”õ—v‹
+ *------------------------------------------
+ */
+int chrif_changemapserver(struct map_session_data *sd, short map, int x, int y, int ip, short port)
+{
+ int s_ip;
+
+ nullpo_retr(-1, sd);
+
+ chrif_check(-1);
+
+ if (other_mapserver_count < 1)
+ { //No other map servers are online!
+ clif_authfail_fd(sd->fd, 0);
+ return -1;
+ }
+
+ if (sd->fd && sd->fd < fd_max && session[sd->fd])
+ s_ip = session[sd->fd]->client_addr.sin_addr.s_addr;
+ else //Not connected? Can't retrieve IP
+ s_ip = 0;
+
+ WFIFOHEAD(char_fd, 35);
+ WFIFOW(char_fd, 0) = 0x2b05;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->login_id1;
+ WFIFOL(char_fd,10) = sd->login_id2;
+ WFIFOL(char_fd,14) = sd->status.char_id;
+ WFIFOW(char_fd,18) = map;
+ WFIFOW(char_fd,20) = x;
+ WFIFOW(char_fd,22) = y;
+ WFIFOL(char_fd,24) = ip;
+ WFIFOW(char_fd,28) = port;
+ WFIFOB(char_fd,30) = sd->status.sex;
+ WFIFOL(char_fd,31) = s_ip;
+ WFIFOSET(char_fd,35);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvŽIŠÔˆÚ“®ack
+ *------------------------------------------
+ */
+int chrif_changemapserverack(int fd)
+{
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+ sd = map_id2sd(RFIFOL(fd,2));
+
+ if (sd == NULL || sd->status.char_id != RFIFOL(fd,14))
+ return -1;
+
+ if (RFIFOL(fd,6) == 1) {
+ if (battle_config.error_log)
+ ShowError("map server change failed.\n");
+ clif_authfail_fd(sd->fd, 0);
+ return 0;
+ }
+ clif_changemapserver(sd, (char*)mapindex_id2name(RFIFOW(fd,18)), RFIFOW(fd,20), RFIFOW(fd,22), RFIFOL(fd,24), RFIFOW(fd,28));
+
+ //Player has been saved already, remove him from memory. [Skotlex]
+ map_quit(sd);
+ map_quit_ack(sd);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_connectack(int fd)
+{
+ RFIFOHEAD(fd);
+ if (RFIFOB(fd,2)) {
+ ShowFatalError("Connection to char-server failed %d.\n", RFIFOB(fd,2));
+ exit(1);
+ }
+ ShowStatus("Successfully logged on to Char Server (Connection: '"CL_WHITE"%d"CL_RESET"').\n",fd);
+ chrif_state = 1;
+ chrif_connected=1;
+
+ chrif_sendmap(fd);
+
+ ShowStatus("Event '"CL_WHITE"OnCharIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnCharIfInit"));
+ ShowStatus("Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
+ if(!char_init_done) {
+ char_init_done = 1;
+ ShowStatus("Event '"CL_WHITE"OnInterIfInitOnce"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInitOnce"));
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_sendmapack(int fd)
+{
+ RFIFOHEAD(fd);
+ if (RFIFOB(fd,2)) {
+ ShowFatalError("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
+ exit(1);
+ }
+ memcpy(wisp_server_name, RFIFOP(fd,3), NAME_LENGTH);
+ ShowStatus("Map sending complete. Map Server is now online.\n");
+ chrif_state = 2;
+
+ //If there are players online, send them to the char-server. [Skotlex]
+ send_users_tochar(-1, gettick(), 0, 0);
+
+ //Re-save any storages that were modified in the disconnection time. [Skotlex]
+ do_reconnect_map();
+ do_reconnect_storage();
+
+ return 0;
+}
+
+/*==========================================
+ * Request sc_data from charserver [Skotlex]
+ *------------------------------------------
+ */
+int chrif_scdata_request(int account_id, int char_id)
+{
+#ifdef ENABLE_SC_SAVING
+#ifndef TXT_ONLY
+ if (charsave_method)
+ return charsave_load_scdata(account_id, char_id);
+#endif
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 10);
+ WFIFOW(char_fd, 0) = 0x2afc;
+ WFIFOL(char_fd, 2) = account_id;
+ WFIFOL(char_fd, 6) = char_id;
+ WFIFOSET(char_fd,10);
+#endif
+ return 0;
+}
+
+/*==========================================
+ * new auth system [Kevin]
+ *------------------------------------------
+ */
+void chrif_authreq(struct map_session_data *sd)
+{
+ struct auth_node *auth_data;
+ auth_data=idb_get(auth_db, sd->bl.id);
+
+ if(auth_data) {
+ if(auth_data->char_dat &&
+ auth_data->account_id== sd->bl.id &&
+ auth_data->login_id1 == sd->login_id1)
+ { //auth ok
+ pc_authok(sd, auth_data->login_id2, auth_data->connect_until_time, auth_data->char_dat);
+ } else { //auth failed
+ pc_authfail(sd);
+ chrif_char_offline(sd); //Set him offline, the char server likely has it set as online already.
+ }
+ if (auth_data->char_dat)
+ aFree(auth_data->char_dat);
+ idb_remove(auth_db, sd->bl.id);
+ } else { //data from char server has not arrived yet.
+ auth_data = aCalloc(1,sizeof(struct auth_node));
+ auth_data->sd = sd;
+ auth_data->fd = sd->fd;
+ auth_data->account_id = sd->bl.id;
+ auth_data->login_id1 = sd->login_id1;
+ auth_data->node_created = gettick();
+ uidb_put(auth_db, sd->bl.id, auth_data);
+ }
+ return;
+}
+
+//character selected, insert into auth db
+void chrif_authok(int fd) {
+ struct auth_node *auth_data;
+ RFIFOHEAD(fd);
+
+ if (map_id2sd(RFIFOL(fd, 4)) != NULL)
+ //Someone with this account is already in! Do not store the info to prevent possible sync exploits. [Skotlex]
+ return;
+
+ if ((auth_data =uidb_get(auth_db, RFIFOL(fd, 4))) != NULL)
+ { //Is the character already awaiting authorization?
+ if (auth_data->sd)
+ {
+ //First, check to see if the session data still exists (avoid dangling pointers)
+ if(session[auth_data->fd] && session[auth_data->fd]->session_data == auth_data->sd)
+ {
+ if (auth_data->char_dat == NULL &&
+ auth_data->account_id == RFIFOL(fd, 4) &&
+ auth_data->login_id1 == RFIFOL(fd, 8))
+ { //Auth Ok
+ pc_authok(auth_data->sd, RFIFOL(fd, 16), RFIFOL(fd, 12), (struct mmo_charstatus*)RFIFOP(fd, 20));
+ } else { //Auth Failed
+ pc_authfail(auth_data->sd);
+ chrif_char_offline(auth_data->sd); //Set him offline, the char server likely has it set as online already.
+ }
+ } //else: Character no longer exists, just go through.
+ }
+ //Delete the data of this node...
+ if (auth_data->char_dat)
+ aFree (auth_data->char_dat);
+ uidb_remove(auth_db, RFIFOL(fd, 4));
+ return;
+ }
+ // Awaiting for client to connect.
+ auth_data = (struct auth_node *)aCalloc(1,sizeof(struct auth_node));
+ auth_data->char_dat = (struct mmo_charstatus *) aCalloc(1,sizeof(struct mmo_charstatus));
+
+ auth_data->account_id=RFIFOL(fd, 4);
+ auth_data->login_id1=RFIFOL(fd, 8);
+ auth_data->connect_until_time=RFIFOL(fd, 12);
+ auth_data->login_id2=RFIFOL(fd, 16);
+ memcpy(auth_data->char_dat,RFIFOP(fd, 20),sizeof(struct mmo_charstatus));
+ auth_data->node_created=gettick();
+ uidb_put(auth_db, RFIFOL(fd, 4), auth_data);
+}
+
+int auth_db_cleanup_sub(DBKey key,void *data,va_list ap)
+{
+ struct auth_node *node=(struct auth_node*)data;
+
+ if(DIFF_TICK(gettick(),node->node_created)>30000) {
+ ShowNotice("Character (aid: %d) not authed within 30 seconds of character select!\n", node->account_id);
+ if (node->char_dat)
+ aFree(node->char_dat);
+ db_remove(auth_db, key);
+ return 1;
+ }
+ return 0;
+}
+
+int auth_db_cleanup(int tid, unsigned int tick, int id, int data) {
+ auth_db->foreach(auth_db, auth_db_cleanup_sub);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_charselectreq(struct map_session_data *sd, unsigned long s_ip)
+{
+ nullpo_retr(-1, sd);
+
+ if( !sd || !sd->bl.id || !sd->login_id1 )
+ return -1;
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 18);
+ WFIFOW(char_fd, 0) = 0x2b02;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->login_id1;
+ WFIFOL(char_fd,10) = sd->login_id2;
+ WFIFOL(char_fd,14) = s_ip;
+ WFIFOSET(char_fd,18);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒLƒƒƒ‰–¼–â‚¢‡‚킹
+ *------------------------------------------
+ */
+int chrif_searchcharid(int char_id)
+{
+ if( !char_id )
+ return -1;
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 6);
+ WFIFOW(char_fd,0) = 0x2b08;
+ WFIFOL(char_fd,2) = char_id;
+ WFIFOSET(char_fd,6);
+
+ return 0;
+}
+
+/*==========================================
+ * GM‚ɕω»—v‹
+ *------------------------------------------
+ */
+int chrif_changegm(int id, const char *pass, int len)
+{
+ if (battle_config.etc_log)
+ ShowInfo("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
+
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, len + 8);
+ WFIFOW(char_fd,0) = 0x2b0a;
+ WFIFOW(char_fd,2) = len + 8;
+ WFIFOL(char_fd,4) = id;
+ memcpy(WFIFOP(char_fd,8), pass, len);
+ WFIFOSET(char_fd, len + 8);
+
+ return 0;
+}
+
+/*==========================================
+ * Change Email
+ *------------------------------------------
+ */
+int chrif_changeemail(int id, const char *actual_email, const char *new_email)
+{
+ if (battle_config.etc_log)
+ ShowInfo("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email);
+
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 86);
+ WFIFOW(char_fd,0) = 0x2b0c;
+ WFIFOL(char_fd,2) = id;
+ memcpy(WFIFOP(char_fd,6), actual_email, 40);
+ memcpy(WFIFOP(char_fd,46), new_email, 40);
+ WFIFOSET(char_fd,86);
+
+ return 0;
+}
+
+/*==========================================
+ * Send message to char-server with a character name to do some operations (by Yor)
+ * Used to ask Char-server about a character name to have the account number to modify account file in login-server.
+ * type of operation:
+ * 1: block
+ * 2: ban
+ * 3: unblock
+ * 4: unban
+ * 5: changesex
+ *------------------------------------------
+ */
+int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second)
+{
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 44);
+ WFIFOW(char_fd, 0) = 0x2b0e;
+ WFIFOL(char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody
+ memcpy(WFIFOP(char_fd,6), character_name, NAME_LENGTH);
+ WFIFOW(char_fd, 30) = operation_type; // type of operation
+ if (operation_type == 2) {
+ WFIFOW(char_fd, 32) = year;
+ WFIFOW(char_fd, 34) = month;
+ WFIFOW(char_fd, 36) = day;
+ WFIFOW(char_fd, 38) = hour;
+ WFIFOW(char_fd, 40) = minute;
+ WFIFOW(char_fd, 42) = second;
+ }
+// ShowInfo("chrif : sent 0x2b0e\n");
+ WFIFOSET(char_fd,44);
+
+ return 0;
+}
+
+/*==========================================
+ * «•Ê•Ï‰»—v‹
+ *------------------------------------------
+ */
+int chrif_changesex(int id, int sex) {
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 9);
+ WFIFOW(char_fd,0) = 0x2b11;
+ WFIFOW(char_fd,2) = 9;
+ WFIFOL(char_fd,4) = id;
+ WFIFOB(char_fd,8) = sex;
+// ShowInfo("chrif : sent 0x3000(changesex)\n");
+ WFIFOSET(char_fd,9);
+ return 0;
+}
+
+/*==========================================
+ * Answer after a request about a character name to do some operations (by Yor)
+ * Used to answer of chrif_char_ask_name.
+ * type of operation:
+ * 1: block
+ * 2: ban
+ * 3: unblock
+ * 4: unban
+ * 5: changesex
+ * type of answer:
+ * 0: login-server resquest done
+ * 1: player not found
+ * 2: gm level too low
+ * 3: login-server offline
+ *------------------------------------------
+ */
+int chrif_char_ask_name_answer(int fd)
+{
+ int acc;
+ struct map_session_data *sd;
+ char output[256];
+ char player_name[NAME_LENGTH];
+ RFIFOHEAD(fd);
+
+ acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
+ memcpy(player_name, RFIFOP(fd,6), NAME_LENGTH-1);
+ player_name[NAME_LENGTH-1] = '\0';
+
+ sd = map_id2sd(acc);
+ if (acc >= 0 && sd != NULL) {
+ if (RFIFOW(fd, 32) == 1) // player not found
+ sprintf(output, "The player '%s' doesn't exist.", player_name);
+ else {
+ switch(RFIFOW(fd, 30)) {
+ case 1: // block
+ switch(RFIFOW(fd, 32)) {
+ case 0: // login-server resquest done
+ sprintf(output, "Login-server has been asked to block the player '%s'.", player_name);
+ break;
+ //case 1: // player not found
+ case 2: // gm level too low
+ sprintf(output, "Your GM level don't authorise you to block the player '%s'.", player_name);
+ break;
+ case 3: // login-server offline
+ sprintf(output, "Login-server is offline. Impossible to block the the player '%s'.", player_name);
+ break;
+ }
+ break;
+ case 2: // ban
+ switch(RFIFOW(fd, 32)) {
+ case 0: // login-server resquest done
+ sprintf(output, "Login-server has been asked to ban the player '%s'.", player_name);
+ break;
+ //case 1: // player not found
+ case 2: // gm level too low
+ sprintf(output, "Your GM level don't authorise you to ban the player '%s'.", player_name);
+ break;
+ case 3: // login-server offline
+ sprintf(output, "Login-server is offline. Impossible to ban the the player '%s'.", player_name);
+ break;
+ }
+ break;
+ case 3: // unblock
+ switch(RFIFOW(fd, 32)) {
+ case 0: // login-server resquest done
+ sprintf(output, "Login-server has been asked to unblock the player '%s'.", player_name);
+ break;
+ //case 1: // player not found
+ case 2: // gm level too low
+ sprintf(output, "Your GM level don't authorise you to unblock the player '%s'.", player_name);
+ break;
+ case 3: // login-server offline
+ sprintf(output, "Login-server is offline. Impossible to unblock the the player '%s'.", player_name);
+ break;
+ }
+ break;
+ case 4: // unban
+ switch(RFIFOW(fd, 32)) {
+ case 0: // login-server resquest done
+ sprintf(output, "Login-server has been asked to unban the player '%s'.", player_name);
+ break;
+ //case 1: // player not found
+ case 2: // gm level too low
+ sprintf(output, "Your GM level don't authorise you to unban the player '%s'.", player_name);
+ break;
+ case 3: // login-server offline
+ sprintf(output, "Login-server is offline. Impossible to unban the the player '%s'.", player_name);
+ break;
+ }
+ break;
+ case 5: // changesex
+ switch(RFIFOW(fd, 32)) {
+ case 0: // login-server resquest done
+ sprintf(output, "Login-server has been asked to change the sex of the player '%s'.", player_name);
+ break;
+ //case 1: // player not found
+ case 2: // gm level too low
+ sprintf(output, "Your GM level don't authorise you to change the sex of the player '%s'.", player_name);
+ break;
+ case 3: // login-server offline
+ sprintf(output, "Login-server is offline. Impossible to change the sex of the the player '%s'.", player_name);
+ break;
+ }
+ break;
+ }
+ }
+ if (output[0] != '\0') {
+ output[sizeof(output)-1] = '\0';
+ clif_displaymessage(sd->fd, output);
+ }
+ } else
+ ShowError("chrif_char_ask_name_answer failed - player not online.\n");
+
+ return 0;
+}
+
+/*==========================================
+ * End of GM change (@GM) (modified by Yor)
+ *------------------------------------------
+ */
+int chrif_changedgm(int fd)
+{
+ int acc, level;
+ struct map_session_data *sd = NULL;
+ RFIFOHEAD(fd);
+
+ acc = RFIFOL(fd,2);
+ level = RFIFOL(fd,6);
+
+ sd = map_id2sd(acc);
+
+ if (battle_config.etc_log)
+ ShowNotice("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc, level);
+ if (sd != NULL) {
+ if (level > 0)
+ clif_displaymessage(sd->fd, "GM modification success.");
+ else
+ clif_displaymessage(sd->fd, "Failure of GM modification.");
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * «•Ê•Ï‰»I—¹ (modified by Yor)
+ *------------------------------------------
+ */
+int chrif_changedsex(int fd)
+{
+ int acc, sex, i;
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+
+ acc = RFIFOL(fd,2);
+ sex = RFIFOL(fd,6);
+ if (battle_config.etc_log)
+ ShowNotice("chrif_changedsex %d.\n", acc);
+ sd = map_id2sd(acc);
+ if (acc > 0) {
+ if (sd != NULL && sd->status.sex != sex) {
+ sd->status.sex = !sd->status.sex;
+
+ // to avoid any problem with equipment and invalid sex, equipment is unequiped.
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].nameid && sd->status.inventory[i].equip)
+ pc_unequipitem((struct map_session_data*)sd, i, 2);
+ }
+ // reset skill of some job
+ if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER) {
+ // remove specifical skills of Bard classes
+ for(i = 315; i <= 322; i++) {
+ if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
+ if (sd->status.skill_point > USHRT_MAX - sd->status.skill[i].lv)
+ sd->status.skill_point = USHRT_MAX;
+ else
+ sd->status.skill_point += sd->status.skill[i].lv;
+ sd->status.skill[i].id = 0;
+ sd->status.skill[i].lv = 0;
+ }
+ }
+ // remove specifical skills of Dancer classes
+ for(i = 323; i <= 330; i++) {
+ if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
+ if (sd->status.skill_point > USHRT_MAX - sd->status.skill[i].lv)
+ sd->status.skill_point = USHRT_MAX;
+ else
+ sd->status.skill_point += sd->status.skill[i].lv;
+ sd->status.skill[i].id = 0;
+ sd->status.skill[i].lv = 0;
+ }
+ }
+ clif_updatestatus(sd, SP_SKILLPOINT);
+ // change job if necessary
+ if (sd->status.sex) //Changed from Dancer
+ sd->status.class_ -= 1;
+ else //Changed from Bard
+ sd->status.class_ += 1;
+ //sd->class_ needs not be updated as both Dancer/Bard are the same.
+ }
+ // save character
+ //chrif_save(sd,1); Character will be saved on session closed -> map_quit
+ sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
+ // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it)
+ clif_displaymessage(sd->fd, "Your sex has been changed (need disconnection by the server)...");
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
+ }
+ } else {
+ if (sd != NULL) {
+ ShowError("chrif_changedsex failed.\n");
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * —£¥î•ñ“¯Šú—v‹
+ *------------------------------------------
+ */
+int chrif_divorce(int char_id, int partner_id)
+{
+ struct map_session_data *sd = NULL;
+
+ if (!char_id || !partner_id)
+ return 0;
+
+ nullpo_retr(0, sd = map_nick2sd(map_charid2nick(partner_id)));
+ if (sd->status.partner_id == char_id) {
+ int i;
+ //—£¥(‘Š•û‚ÍŠù‚ɃLƒƒƒ‰‚ªÁ‚¦‚Ä‚¢‚锤‚È‚Ì‚Å)
+ sd->status.partner_id = 0;
+
+ //‘Š•û‚ÌŒ‹¥Žw—Ö‚ð”’D
+ for(i = 0; i < MAX_INVENTORY; i++)
+ if (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
+ pc_delitem(sd, i, 1, 0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Disconnection of a player (account has been deleted in login-server) by [Yor]
+ *------------------------------------------
+ */
+int chrif_accountdeletion(int fd)
+{
+ int acc;
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+
+ acc = RFIFOL(fd,2);
+ if (battle_config.etc_log)
+ ShowNotice("chrif_accountdeletion %d.\n", acc);
+ sd = map_id2sd(acc);
+ if (acc > 0) {
+ if (sd != NULL) {
+ sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
+ clif_displaymessage(sd->fd, "Your account has been deleted (disconnection)...");
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
+ }
+ } else {
+ if (sd != NULL)
+ ShowError("chrif_accountdeletion failed - player not online.\n");
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Disconnection of a player (account has been banned of has a status, from login-server) by [Yor]
+ *------------------------------------------
+ */
+int chrif_accountban(int fd)
+{
+ int acc;
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+
+ acc = RFIFOL(fd,2);
+ if (battle_config.etc_log)
+ ShowNotice("chrif_accountban %d.\n", acc);
+ sd = map_id2sd(acc);
+ if (acc > 0) {
+ if (sd != NULL) {
+ sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
+ if (RFIFOB(fd,6) == 0) { // 0: change of statut, 1: ban
+ switch (RFIFOL(fd,7)) { // status or final date of a banishment
+ case 1: // 0 = Unregistered ID
+ clif_displaymessage(sd->fd, "Your account has 'Unregistered'.");
+ break;
+ case 2: // 1 = Incorrect Password
+ clif_displaymessage(sd->fd, "Your account has an 'Incorrect Password'...");
+ break;
+ case 3: // 2 = This ID is expired
+ clif_displaymessage(sd->fd, "Your account has expired.");
+ break;
+ case 4: // 3 = Rejected from Server
+ clif_displaymessage(sd->fd, "Your account has been rejected from server.");
+ break;
+ case 5: // 4 = You have been blocked by the GM Team
+ clif_displaymessage(sd->fd, "Your account has been blocked by the GM Team.");
+ break;
+ case 6: // 5 = Your Game's EXE file is not the latest version
+ clif_displaymessage(sd->fd, "Your Game's EXE file is not the latest version.");
+ break;
+ case 7: // 6 = Your are Prohibited to log in until %s
+ clif_displaymessage(sd->fd, "Your account has been prohibited to log in.");
+ break;
+ case 8: // 7 = Server is jammed due to over populated
+ clif_displaymessage(sd->fd, "Server is jammed due to over populated.");
+ break;
+ case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
+ clif_displaymessage(sd->fd, "Your account has not more authorised.");
+ break;
+ case 100: // 99 = This ID has been totally erased
+ clif_displaymessage(sd->fd, "Your account has been totally erased.");
+ break;
+ default:
+ clif_displaymessage(sd->fd, "Your account has not more authorised.");
+ break;
+ }
+ } else if (RFIFOB(fd,6) == 1) { // 0: change of statut, 1: ban
+ time_t timestamp;
+ char tmpstr[2048];
+ timestamp = (time_t)RFIFOL(fd,7); // status or final date of a banishment
+ strcpy(tmpstr, "Your account has been banished until ");
+ strftime(tmpstr + strlen(tmpstr), 24, "%d-%m-%Y %H:%M:%S", localtime(&timestamp));
+ clif_displaymessage(sd->fd, tmpstr);
+ }
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
+ }
+ } else {
+ if (sd != NULL)
+ ShowError("chrif_accountban failed - player not online.\n");
+ }
+
+ return 0;
+}
+
+//Disconnect the player out of the game, simple packet
+//packet.w AID.L WHY.B 2+4+1 = 7byte
+int chrif_disconnectplayer(int fd){
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+
+ sd = map_id2sd(RFIFOL(fd, 2));
+
+ if(sd == NULL){
+ return -1;
+ }
+
+ if (!sd->fd)
+ { //No connection
+ if (sd->state.autotrade)
+ map_quit(sd); //Remove it.
+ //Else we don't remove it because the char should have a timer to remove the player because it force-quit before,
+ //and we don't want them kicking their previous instance before the 10 secs penalty time passes. [Skotlex]
+ return 0;
+ }
+
+ switch(RFIFOB(fd, 6)){
+ //clif_authfail_fd
+ case 1: //server closed
+ clif_authfail_fd(sd->fd, 1);
+ break;
+
+ case 2: //someone else logged in
+ clif_authfail_fd(sd->fd, 2);
+ break;
+
+ case 3: //server overpopulated
+ clif_authfail_fd(sd->fd, 4);
+
+ break;
+
+ case 4: //out of time payd for .. (avail)
+ clif_authfail_fd(sd->fd, 10);
+ break;
+
+ case 5: //forced to dc by gm
+ clif_authfail_fd(sd->fd, 15);
+ break;
+ }
+
+return 0;
+}
+
+/*==========================================
+ * Request to reload GM accounts and their levels: send to char-server by [Yor]
+ *------------------------------------------
+ */
+int chrif_reloadGMdb(void)
+{
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 2);
+ WFIFOW(char_fd,0) = 0x2af7;
+ WFIFOSET(char_fd, 2);
+
+ return 0;
+}
+
+/*==========================================
+ * Receiving GM accounts and their levels from char-server by [Yor]
+ *------------------------------------------
+ */
+int chrif_recvgmaccounts(int fd)
+{
+ ShowInfo("From login-server: receiving information of '"CL_WHITE"%d"CL_RESET"' GM accounts.\n", pc_read_gm_account(fd));
+ return 0;
+}
+
+/*==========================================
+ * Request/Receive top 10 Fame character list
+ *------------------------------------------
+ */
+
+int chrif_updatefamelist(struct map_session_data *sd)
+{
+ char type;
+ chrif_check(-1);
+
+ switch(sd->class_&MAPID_UPPERMASK) {
+ case MAPID_BLACKSMITH:
+ type = 1;
+ break;
+ case MAPID_ALCHEMIST:
+ type = 2;
+ break;
+ case MAPID_TAEKWON:
+ type = 3;
+ break;
+ default:
+ return 0;
+ }
+
+ WFIFOHEAD(char_fd, 12);
+ WFIFOW(char_fd, 0) = 0x2b10;
+ WFIFOL(char_fd, 2) = sd->status.char_id;
+ WFIFOL(char_fd, 6) = sd->status.fame;
+ WFIFOB(char_fd, 10) = type;
+ WFIFOB(char_fd, 11) = pc_famerank(sd->status.char_id, sd->class_&MAPID_UPPERMASK);
+ WFIFOSET(char_fd, 12);
+
+ return 0;
+}
+
+int chrif_buildfamelist(void)
+{
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 2);
+ WFIFOW(char_fd, 0) = 0x2b1a;
+ WFIFOSET(char_fd, 2);
+
+ return 0;
+}
+
+int chrif_recvfamelist(int fd)
+{
+ int num, size;
+ int total = 0, len = 8;
+ RFIFOHEAD(fd);
+
+ malloc_tsetdword (smith_fame_list, 0, sizeof(smith_fame_list));
+ malloc_tsetdword (chemist_fame_list, 0, sizeof(chemist_fame_list));
+ malloc_tsetdword (taekwon_fame_list, 0, sizeof(taekwon_fame_list));
+
+ size = RFIFOW(fd, 6); //Blacksmith block size
+ for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
+ memcpy(&smith_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ total += num;
+
+ size = RFIFOW(fd, 4); //Alchemist block size
+ for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
+ memcpy(&chemist_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ total += num;
+
+ size = RFIFOW(fd, 2); //Total packet length
+ for (num = 0; len < size && num < MAX_FAME_LIST; num++) {
+ memcpy(&taekwon_fame_list[num], RFIFOP(fd,len), sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+ total += num;
+
+ ShowInfo("Received Fame List of '"CL_WHITE"%d"CL_RESET"' characters.\n", total);
+
+ return 0;
+}
+
+int chrif_save_scdata(struct map_session_data *sd)
+{ //parses the sc_data of the player and sends it to the char-server for saving. [Skotlex]
+#ifdef ENABLE_SC_SAVING
+ int i, count=0;
+ unsigned int tick;
+ struct status_change_data data;
+ struct TimerData *timer;
+
+ if (sd->state.finalsave) //Character was already saved?
+ return -1;
+#ifndef TXT_ONLY
+ if(charsave_method) //New 'Local' save
+ {
+ charsave_save_scdata(sd->status.account_id, sd->status.char_id, &sd->sc, MAX_STATUSCHANGE);
+ return 0;
+ }
+#endif
+
+ chrif_check(-1);
+ tick = gettick();
+
+ WFIFOHEAD(char_fd, 14 + SC_MAX*sizeof(struct status_change_data));
+ WFIFOW(char_fd,0) = 0x2b1c;
+ WFIFOL(char_fd,4) = sd->status.account_id;
+ WFIFOL(char_fd,8) = sd->status.char_id;
+ for (i = 0; i < SC_MAX; i++)
+ {
+ if (sd->sc.data[i].timer == -1)
+ continue;
+ timer = get_timer(sd->sc.data[i].timer);
+ if (timer == NULL || timer->func != status_change_timer || DIFF_TICK(timer->tick,tick) < 0)
+ continue;
+ data.tick = DIFF_TICK(timer->tick,tick); //Duration that is left before ending.
+ data.type = i;
+ data.val1 = sd->sc.data[i].val1;
+ data.val2 = sd->sc.data[i].val2;
+ data.val3 = sd->sc.data[i].val3;
+ data.val4 = sd->sc.data[i].val4;
+ memcpy(WFIFOP(char_fd,14 +count*sizeof(struct status_change_data)),
+ &data, sizeof(struct status_change_data));
+ count++;
+ }
+ if (count == 0)
+ return 0; //Nothing to save.
+ WFIFOW(char_fd,12) = count;
+ WFIFOW(char_fd,2) = 14 +count*sizeof(struct status_change_data); //Total packet size
+ WFIFOSET(char_fd,WFIFOW(char_fd,2));
+#endif
+ return 0;
+}
+
+int chrif_load_scdata(int fd)
+{ //Retrieve and load sc_data for a player. [Skotlex]
+#ifdef ENABLE_SC_SAVING
+ struct map_session_data *sd;
+ struct status_change_data *data;
+ int aid, cid, i, count;
+ RFIFOHEAD(fd);
+
+ aid = RFIFOL(fd,4); //Player Account ID
+ cid = RFIFOL(fd,8); //Player Char ID
+
+ sd = map_id2sd(aid);
+ if (!sd)
+ {
+ ShowError("chrif_load_scdata: Player of AID %d not found!\n", aid);
+ return -1;
+ }
+ if (sd->status.char_id != cid)
+ {
+ ShowError("chrif_load_scdata: Receiving data for account %d, char id does not matches (%d != %d)!\n", aid, sd->status.char_id, cid);
+ return -1;
+ }
+ count = RFIFOW(fd,12); //sc_count
+ for (i = 0; i < count; i++)
+ {
+ data = (struct status_change_data*)RFIFOP(fd,14 + i*sizeof(struct status_change_data));
+ if (data->tick < 1)
+ { //Protection against invalid tick values. [Skotlex]
+ ShowWarning("chrif_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", data->tick, data->type, sd->status.name);
+ continue;
+ }
+ status_change_start(&sd->bl, data->type, 10000, data->val1, data->val2, data->val3, data->val4, data->tick, 15);
+ }
+#endif
+ return 0;
+}
+
+/*==========================================
+ * Send rates and motd to char server [Wizputer]
+ *------------------------------------------
+ */
+ int chrif_ragsrvinfo(int base_rate, int job_rate, int drop_rate)
+{
+ char buf[256];
+ FILE *fp;
+ int i;
+
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, sizeof(buf) + 10);
+ WFIFOW(char_fd,0) = 0x2b16;
+ WFIFOW(char_fd,2) = base_rate;
+ WFIFOW(char_fd,4) = job_rate;
+ WFIFOW(char_fd,6) = drop_rate;
+
+ if ((fp = fopen(motd_txt, "r")) != NULL) {
+ if (fgets(buf, 250, fp) != NULL) {
+ for(i = 0; buf[i]; i++) {
+ if (buf[i] == '\r' || buf[i] == '\n') {
+ buf[i] = 0;
+ break;
+ }
+ }
+ WFIFOW(char_fd,8) = sizeof(buf) + 10;
+ memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
+ }
+ fclose(fp);
+ } else {
+ malloc_tsetdword(buf, 0, sizeof(buf)); //No data found, send empty packets?
+ WFIFOW(char_fd,8) = sizeof(buf) + 10;
+ memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
+ }
+ WFIFOSET(char_fd,WFIFOW(char_fd,8));
+ return 0;
+}
+
+
+/*=========================================
+ * Tell char-server charcter disconnected [Wizputer]
+ *-----------------------------------------
+ */
+
+int chrif_char_offline(struct map_session_data *sd)
+{
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 10);
+ WFIFOW(char_fd,0) = 0x2b17;
+ WFIFOL(char_fd,2) = sd->status.char_id;
+ WFIFOL(char_fd,6) = sd->status.account_id;
+ WFIFOSET(char_fd,10);
+
+ return 0;
+}
+
+/*=========================================
+ * Tell char-server to reset all chars offline [Wizputer]
+ *-----------------------------------------
+ */
+int chrif_flush_fifo(void) {
+ chrif_check(-1);
+
+ set_nonblocking(char_fd, 0);
+ flush_fifos();
+ set_nonblocking(char_fd, 1);
+
+ return 0;
+}
+
+/*=========================================
+ * Tell char-server to reset all chars offline [Wizputer]
+ *-----------------------------------------
+ */
+int chrif_char_reset_offline(void) {
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 2);
+ WFIFOW(char_fd,0) = 0x2b18;
+ WFIFOSET(char_fd,2);
+
+ return 0;
+}
+
+/*=========================================
+ * Tell char-server charcter is online [Wizputer]
+ *-----------------------------------------
+ */
+
+int chrif_char_online(struct map_session_data *sd)
+{
+ chrif_check(-1);
+
+ WFIFOHEAD(char_fd, 10);
+ WFIFOW(char_fd,0) = 0x2b19;
+ WFIFOL(char_fd,2) = sd->status.char_id;
+ WFIFOL(char_fd,6) = sd->status.account_id;
+ WFIFOSET(char_fd,10);
+
+ return 0;
+}
+
+int chrif_disconnect(int fd) {
+ if(fd == char_fd) {
+ char_fd = 0;
+ ShowWarning("Map Server disconnected from Char Server.\n\n");
+ chrif_connected = 0;
+
+ other_mapserver_count=0; //Reset counter. We receive ALL maps from all map-servers on reconnect.
+ map_eraseallipport();
+
+ //Attempt to reconnect in a second. [Skotlex]
+ add_timer(gettick() + 1000, check_connect_char_server, 0, 0);
+ }
+ return 0;
+}
+
+void chrif_update_ip(int fd){
+ unsigned long new_ip;
+ WFIFOHEAD(fd, 6);
+ new_ip = resolve_hostbyname(char_ip_str, NULL, NULL);
+ if (new_ip && new_ip != char_ip)
+ char_ip = new_ip; //Update char_ip
+
+ new_ip = clif_refresh_ip();
+ if (!new_ip) return; //No change
+ WFIFOW(fd, 0) = 0x2736;
+ WFIFOL(fd, 2) = new_ip;
+ WFIFOSET(fd, 6);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_parse(int fd)
+{
+ int packet_len, cmd;
+ // only char-server can have an access to here.
+ // so, if it isn't the char-server, we disconnect the session (fd != char_fd).
+ if (fd != char_fd || session[fd]->eof) {
+ if (fd == char_fd && chrif_connected == 1) {
+ chrif_disconnect (fd);
+ }
+ else if (fd != char_fd)
+ ShowDebug("chrif_parse: Disconnecting invalid session #%d (is not the char-server)\n", fd);
+
+ do_close(fd);
+ return 0;
+ }
+
+ while (RFIFOREST(fd) >= 2 && !session[fd]->eof) { //Infinite loop on broken pipe fix. [Skotlex]
+ RFIFOHEAD(fd);
+ cmd = RFIFOW(fd,0);
+ if (cmd < 0x2af8 || cmd >= 0x2af8 + (sizeof(packet_len_table) / sizeof(packet_len_table[0])) ||
+ packet_len_table[cmd-0x2af8] == 0) {
+
+ int r = intif_parse(fd); // intif‚É“n‚·
+
+ if (r == 1) continue; // intif‚ň—‚µ‚½
+ if (r == 2) return 0; // intif‚ň—‚µ‚½‚ªAƒf[ƒ^‚ª‘«‚è‚È‚¢
+
+ session[fd]->eof = 1;
+ ShowWarning("chrif_parse: session #%d, intif_parse failed -> disconnected.\n", fd);
+ return 0;
+ }
+ packet_len = packet_len_table[cmd-0x2af8];
+ if (packet_len == -1) {
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ packet_len = RFIFOW(fd,2);
+ }
+ if ((int)RFIFOREST(fd) < packet_len)
+ return 0;
+
+ switch(cmd) {
+ case 0x2af9: chrif_connectack(fd); break;
+ case 0x2afb: chrif_sendmapack(fd); break;
+ case 0x2afd: chrif_authok(fd); break;
+ case 0x2b00: map_setusers(fd); break;
+ case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
+ case 0x2b04: chrif_recvmap(fd); break;
+ case 0x2b06: chrif_changemapserverack(fd); break;
+ case 0x2b07: clif_updatemaxid(RFIFOL(fd,2), RFIFOL(fd,6)); break;
+ case 0x2b09: map_addchariddb(RFIFOL(fd,2), (char*)RFIFOP(fd,6)); break;
+ case 0x2b0b: chrif_changedgm(fd); break;
+ case 0x2b0d: chrif_changedsex(fd); break;
+ case 0x2b0f: chrif_char_ask_name_answer(fd); break;
+ case 0x2b12: chrif_divorce(RFIFOL(fd,2), RFIFOL(fd,6)); break;
+ case 0x2b13: chrif_accountdeletion(fd); break;
+ case 0x2b14: chrif_accountban(fd); break;
+ case 0x2b15: chrif_recvgmaccounts(fd); break;
+ case 0x2b1b: chrif_recvfamelist(fd); break;
+ case 0x2b1d: chrif_load_scdata(fd); break;
+ case 0x2b1e: chrif_update_ip(fd); break;
+ case 0x2b1f: chrif_disconnectplayer(fd); break;
+ case 0x2b20: chrif_removemap(fd); break;
+ case 0x2b21: chrif_save_ack(fd); break;
+
+ default:
+ if (battle_config.error_log)
+ ShowError("chrif_parse : unknown packet (session #%d): 0x%x. Disconnecting.\n", fd, cmd);
+ session[fd]->eof = 1;
+ return 0;
+ }
+ if (fd == char_fd) //There's the slight chance we lost the connection during parse, in which case this would segfault if not checked [Skotlex]
+ RFIFOSKIP(fd, packet_len);
+ }
+
+ return 0;
+}
+
+int send_usercount_tochar(int tid, unsigned int tick, int id, int data) {
+ int count;
+ static int last_count = 0;
+
+ chrif_check(-1);
+
+ map_getallusers(&count);
+
+ if (count == last_count) //No need to waste packets.
+ return 0;
+ last_count = count;
+
+ WFIFOHEAD(char_fd, 4);
+ WFIFOW(char_fd,0) = 0x2afe;
+ WFIFOW(char_fd,2) = count;
+ WFIFOSET(char_fd,4);
+ return 0;
+}
+
+/*==========================================
+ * timerŠÖ”
+ * ¡‚±‚ÌmapŽI‚ÉŒq‚ª‚Á‚Ä‚¢‚éƒNƒ‰ƒCƒAƒ“ƒgl”‚ðcharŽI‚Ö‘—‚é
+ *------------------------------------------
+ */
+int send_users_tochar(int tid, unsigned int tick, int id, int data) {
+ int count, users=0, i;
+ struct map_session_data **all_sd;
+
+ chrif_check(-1);
+
+ all_sd = map_getallusers(&count);
+ WFIFOHEAD(char_fd, 6+8*users);
+ WFIFOW(char_fd,0) = 0x2aff;
+ for (i = 0; i < count; i++) {
+ WFIFOL(char_fd,6+8*users) = all_sd[i]->status.account_id;
+ WFIFOL(char_fd,6+8*users+4) = all_sd[i]->status.char_id;
+ users++;
+ }
+ WFIFOW(char_fd,2) = 6 + 8 * users;
+ WFIFOW(char_fd,4) = users;
+ WFIFOSET(char_fd,6+8*users);
+
+ return 0;
+}
+
+/*==========================================
+ * timerŠÖ”
+ * charŽI‚Æ‚ÌÚ‘±‚ðŠm”F‚µA‚à‚µØ‚ê‚Ä‚¢‚½‚çÄ“xÚ‘±‚·‚é
+ *------------------------------------------
+ */
+int check_connect_char_server(int tid, unsigned int tick, int id, int data) {
+ static int displayed = 0;
+ if (char_fd <= 0 || session[char_fd] == NULL) {
+ if (!displayed) {
+ ShowStatus("Attempting to connect to Char Server. Please wait.\n");
+ displayed = 1;
+ }
+ chrif_state = 0;
+ char_fd = make_connection(char_ip, char_port);
+ if (char_fd == -1)
+ { //Attempt to connect later. [Skotlex]
+ char_fd = 0;
+ return 0;
+ }
+ session[char_fd]->func_parse = chrif_parse;
+ realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+
+ chrif_connect(char_fd);
+ chrif_connected = (chrif_state == 2);
+#ifndef TXT_ONLY
+ srvinfo = 0;
+#endif /* not TXT_ONLY */
+ } else {
+#ifndef TXT_ONLY
+ if (srvinfo == 0) {
+ chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common);
+ srvinfo = 1;
+ }
+#endif /* not TXT_ONLY */
+/* There is no need, the connection is TCP, so the packet is assured to arrive unless the connection dies [Skotlex]
+ //If for some reason the next iteration (10 secs) we are still not connected,
+ //assume the packets got lost, so we need to resend them. [Skotlex]
+ if (chrif_state == 0)
+ chrif_connect(char_fd);
+ else if (chrif_state == 1)
+ chrif_sendmap(char_fd);
+*/
+ }
+ if (chrif_isconnect()) displayed = 0;
+ return 0;
+}
+
+int auth_db_final(DBKey k,void *d,va_list ap) {
+ struct auth_node *node=(struct auth_node*)d;
+ if (node->char_dat)
+ aFree(node->char_dat);
+ return 0;
+}
+
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+int do_final_chrif(void)
+{
+ delete_session(char_fd);
+ auth_db->destroy(auth_db, auth_db_final);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int do_init_chrif(void)
+{
+ add_timer_func_list(check_connect_char_server, "check_connect_char_server");
+ add_timer_func_list(send_usercount_tochar, "send_usercount_tochar");
+ add_timer_func_list(send_users_tochar, "send_users_tochar");
+ add_timer_func_list(auth_db_cleanup, "auth_db_cleanup");
+ add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
+#ifdef TXT_ONLY
+ //Txt needs this more frequently because it is used for the online.html file.
+ add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, UPDATE_INTERVAL);
+#else
+ add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, CHECK_INTERVAL);
+ add_timer_interval(gettick() + 1000, send_usercount_tochar, 0, 0, UPDATE_INTERVAL);
+#endif
+ add_timer_interval(gettick() + 1000, auth_db_cleanup, 0, 0, 30 * 1000);
+
+ auth_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+
+ return 0;
+}
diff --git a/src/map/chrif.h b/src/map/chrif.h
index fc87f9b18..302b31f56 100644
--- a/src/map/chrif.h
+++ b/src/map/chrif.h
@@ -1,58 +1,58 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CHRIF_H_
-#define _CHRIF_H_
-
-struct auth_node{
- int account_id, login_id1, login_id2, sex, fd;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- struct map_session_data *sd; //Data from logged on char.
- struct mmo_charstatus *char_dat; //Data from char server.
- unsigned int node_created; //For node auto-deleting
-};
-
-void chrif_setuserid(char*);
-void chrif_setpasswd(char*);
-void chrif_checkdefaultlogin(void);
-int chrif_setip(char*);
-void chrif_setport(int);
-
-int chrif_isconnect(void);
-
-extern int chrif_connected;
-extern int other_mapserver_count;
-
-void chrif_authreq(struct map_session_data *);
-void chrif_authok(int fd);
-int chrif_scdata_request(int account_id, int char_id);
-int chrif_save(struct map_session_data*, int flag);
-int chrif_charselectreq(struct map_session_data *sd, unsigned long s_ip);
-void check_fake_id(int fd, struct map_session_data *sd, int target_id);
-int chrif_changemapserver(struct map_session_data *sd,short map,int x,int y,int ip,short port);
-
-int chrif_searchcharid(int char_id);
-int chrif_changegm(int id,const char *pass,int len);
-int chrif_changeemail(int id, const char *actual_email, const char *new_email);
-int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second);
-int chrif_reloadGMdb(void);
-int chrif_updatefamelist(struct map_session_data *sd);
-int chrif_buildfamelist(void);
-int chrif_save_scdata(struct map_session_data *sd);
-int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate);
-int chrif_char_offline(struct map_session_data *sd);
-int chrif_char_reset_offline(void);
-int send_users_tochar(int tid, unsigned int tick, int id, int data);
-int chrif_char_online(struct map_session_data *sd);
-int chrif_changesex(int id, int sex);
-int chrif_chardisconnect(struct map_session_data *sd);
-int check_connect_char_server(int tid, unsigned int tick, int id, int data);
-
-int chrif_pcauthok(int fd);
-
-int do_final_chrif(void);
-int do_init_chrif(void);
-
-int chrif_flush_fifo(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CHRIF_H_
+#define _CHRIF_H_
+
+struct auth_node{
+ int account_id, login_id1, login_id2, sex, fd;
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+ struct map_session_data *sd; //Data from logged on char.
+ struct mmo_charstatus *char_dat; //Data from char server.
+ unsigned int node_created; //For node auto-deleting
+};
+
+void chrif_setuserid(char*);
+void chrif_setpasswd(char*);
+void chrif_checkdefaultlogin(void);
+int chrif_setip(char*);
+void chrif_setport(int);
+
+int chrif_isconnect(void);
+
+extern int chrif_connected;
+extern int other_mapserver_count;
+
+void chrif_authreq(struct map_session_data *);
+void chrif_authok(int fd);
+int chrif_scdata_request(int account_id, int char_id);
+int chrif_save(struct map_session_data*, int flag);
+int chrif_charselectreq(struct map_session_data *sd, unsigned long s_ip);
+void check_fake_id(int fd, struct map_session_data *sd, int target_id);
+int chrif_changemapserver(struct map_session_data *sd,short map,int x,int y,int ip,short port);
+
+int chrif_searchcharid(int char_id);
+int chrif_changegm(int id,const char *pass,int len);
+int chrif_changeemail(int id, const char *actual_email, const char *new_email);
+int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second);
+int chrif_reloadGMdb(void);
+int chrif_updatefamelist(struct map_session_data *sd);
+int chrif_buildfamelist(void);
+int chrif_save_scdata(struct map_session_data *sd);
+int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate);
+int chrif_char_offline(struct map_session_data *sd);
+int chrif_char_reset_offline(void);
+int send_users_tochar(int tid, unsigned int tick, int id, int data);
+int chrif_char_online(struct map_session_data *sd);
+int chrif_changesex(int id, int sex);
+int chrif_chardisconnect(struct map_session_data *sd);
+int check_connect_char_server(int tid, unsigned int tick, int id, int data);
+
+int chrif_pcauthok(int fd);
+
+int do_final_chrif(void);
+int do_init_chrif(void);
+
+int chrif_flush_fifo(void);
+
+#endif
diff --git a/src/map/clif.h b/src/map/clif.h
index 5ba025065..df8ac3441 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -1,368 +1,368 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _CLIF_H_
-#define _CLIF_H_
-
-#include "map.h"
-
-// protocol version
-#define PACKETVER 7
-
-// packet DB
-#define MAX_PACKET_DB 0x25f
-#define MAX_PACKET_VER 25
-
-struct packet_db {
- short len;
- void (*func)(int, struct map_session_data *);
- short pos[20];
-};
-
-// local define
-enum {
- ALL_CLIENT,
- ALL_SAMEMAP,
- AREA,
- AREA_WOS,
- AREA_WOC,
- AREA_WOSC,
- AREA_CHAT_WOC,
- CHAT,
- CHAT_WOS,
- CHAT_MAINCHAT,
- PARTY,
- PARTY_WOS,
- PARTY_SAMEMAP,
- PARTY_SAMEMAP_WOS,
- PARTY_AREA,
- PARTY_AREA_WOS,
- GUILD,
- GUILD_WOS,
- GUILD_SAMEMAP, // [Valaris]
- GUILD_SAMEMAP_WOS,
- GUILD_AREA,
- GUILD_AREA_WOS, // end additions [Valaris]
- SELF,
- DUEL,
- DUEL_WOS
-};
-
-extern struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB];
-
-int clif_setip(char*);
-void clif_setbindip(char*);
-void clif_setport(int);
-
-unsigned long clif_getip_long(void);
-unsigned long clif_refresh_ip(void);
-int clif_getport(void);
-int clif_countusers(void);
-void clif_setwaitclose(int);
-
-int clif_authok(struct map_session_data *);
-int clif_authfail_fd(int,int);
-void clif_updatemaxid(int, int);
-int clif_charselectok(int);
-void check_fake_id(int fd, struct map_session_data *sd, int target_id);
-int clif_dropflooritem(struct flooritem_data *);
-int clif_clearflooritem(struct flooritem_data *,int);
-int clif_clearchar(struct block_list*,int); // area or fd
-int clif_clearchar_delay(unsigned int,struct block_list *,int);
-#define clif_clearchar_area(bl,type) clif_clearchar(bl,type)
-int clif_clearchar_id(int,int,int);
-int clif_spawn(struct block_list*); //area
-int clif_walkok(struct map_session_data*); // self
-int clif_move(struct block_list*); // area
-int clif_changemap(struct map_session_data*,short,int,int); //self
-int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self
-int clif_blown(struct block_list *); // area
-int clif_slide(struct block_list *,int,int); // area
-int clif_fixpos(struct block_list *); // area
-int clif_fixpos2(struct block_list *); // area
-int clif_npcbuysell(struct map_session_data*,int); //self
-int clif_buylist(struct map_session_data*,struct npc_data*); //self
-int clif_selllist(struct map_session_data*); //self
-int clif_scriptmes(struct map_session_data*,int,char*); //self
-int clif_scriptnext(struct map_session_data*,int); //self
-int clif_scriptclose(struct map_session_data*,int); //self
-int clif_scriptmenu(struct map_session_data*,int,char*); //self
-int clif_scriptinput(struct map_session_data*,int); //self
-int clif_scriptinputstr(struct map_session_data *sd,int npcid); // self
-int clif_cutin(struct map_session_data*,char*,int); //self
-int clif_viewpoint(struct map_session_data*,int,int,int,int,int,int); //self
-int clif_additem(struct map_session_data*,int,int,int); //self
-int clif_delitem(struct map_session_data*,int,int); //self
-int clif_updatestatus(struct map_session_data*,int); //self
-int clif_changestatus(struct block_list*,int,int); //area
-int clif_damage(struct block_list *,struct block_list *,unsigned int,int,int,int,int,int,int); // area
-#define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0)
-int clif_changelook(struct block_list *,int,int); // area
-void clif_changetraplook(struct block_list *bl,int val); // area
-void clif_refreshlook(struct block_list *bl,int id,int type,int val,int area); //area specified in 'area'
-int clif_arrowequip(struct map_session_data *sd,int val); //self
-int clif_arrow_fail(struct map_session_data *sd,int type); //self
-int clif_arrow_create_list(struct map_session_data *sd); //self
-int clif_statusupack(struct map_session_data *,int,int,int); // self
-int clif_equipitemack(struct map_session_data *,int,int,int); // self
-int clif_unequipitemack(struct map_session_data *,int,int,int); // self
-int clif_misceffect(struct block_list*,int); // area
-int clif_misceffect2(struct block_list *bl,int type);
-int clif_changeoption(struct block_list*); // area
-int clif_useitemack(struct map_session_data*,int,int,int); // self
-void clif_GlobalMessage(struct block_list *bl,char *message);
-int clif_createchat(struct map_session_data*,int); // self
-int clif_dispchat(struct chat_data*,int); // area or fd
-int clif_joinchatfail(struct map_session_data*,int); // self
-int clif_joinchatok(struct map_session_data*,struct chat_data*); // self
-int clif_addchat(struct chat_data*,struct map_session_data*); // chat
-int clif_changechatowner(struct chat_data*,struct map_session_data*); // chat
-int clif_clearchat(struct chat_data*,int); // area or fd
-int clif_leavechat(struct chat_data*,struct map_session_data*); // chat
-int clif_changechatstatus(struct chat_data*); // chat
-int clif_refresh(struct map_session_data*); // self
-
-int clif_fame_blacksmith(struct map_session_data *, int);
-int clif_fame_alchemist(struct map_session_data *, int);
-int clif_fame_taekwon(struct map_session_data *, int);
-
-void clif_emotion(struct block_list *bl,int type);
-void clif_talkiebox(struct block_list *bl,char* talkie);
-void clif_wedding_effect(struct block_list *bl);
-void clif_divorced(struct map_session_data *sd, char *);
-//void clif_sitting(int fd, struct map_session_data *sd);
-//void clif_callpartner(struct map_session_data *sd);
-void clif_adopt_process(struct map_session_data *sd);
-void clif_sitting(struct map_session_data *sd);
-void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type);
-int clif_soundeffectall(struct block_list *bl, char *name, int type, int coverage);
-void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, unsigned int tick);
-void clif_parse_LoadEndAck(int fd,struct map_session_data *sd);
-
-// trade
-int clif_traderequest(struct map_session_data *sd,char *name);
-int clif_tradestart(struct map_session_data *sd,int type);
-int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount);
-int clif_tradeitemok(struct map_session_data *sd,int index,int fail);
-int clif_tradedeal_lock(struct map_session_data *sd,int fail);
-int clif_tradecancelled(struct map_session_data *sd);
-int clif_tradecompleted(struct map_session_data *sd,int fail);
-
-// storage
-#include "storage.h"
-void clif_storagelist(struct map_session_data *sd,struct storage *stor);
-int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor);
-int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount);
-int clif_storageitemremoved(struct map_session_data *sd,int index,int amount);
-int clif_storageclose(struct map_session_data *sd);
-void clif_guildstoragelist(struct map_session_data *sd,struct guild_storage *stor);
-int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor);
-int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount);
-
-int clif_insight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_outsight(struct block_list *,va_list); // map_forallinmovearea callback
-
-int clif_class_change(struct block_list *bl,int class_,int type);
-#define clif_mob_class_change(md, class_) clif_class_change(&md->bl, class_, 1)
-int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris]
-
-int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range);
-int clif_skillinfoblock(struct map_session_data *sd);
-int clif_skillup(struct map_session_data *sd,int skill_num);
-
-int clif_skillcasting(struct block_list* bl,
- int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime);
-int clif_skillcastcancel(struct block_list* bl);
-int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype);
-int clif_skill_damage(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,
- int skill_id,int skill_lv,int type);
-int clif_skill_damage2(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,
- int skill_id,int skill_lv,int type);
-int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
- int skill_id,int heal,int fail);
-int clif_skill_poseffect(struct block_list *src,int skill_id,
- int val,int x,int y,int tick);
-int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst);
-int clif_skill_warppoint(struct map_session_data *sd,int skill_num, int skill_lv,
- const char *map1,const char *map2,const char *map3,const char *map4);
-int clif_skill_memo(struct map_session_data *sd,int flag);
-int clif_skill_teleportmessage(struct map_session_data *sd,int flag);
-int clif_skill_produce_mix_list(struct map_session_data *sd, int trigger);
-
-int clif_produceeffect(struct map_session_data *sd,int flag,int nameid);
-
-int clif_skill_setunit(struct skill_unit *unit);
-int clif_skill_delunit(struct skill_unit *unit);
-
-int clif_01ac(struct block_list *bl);
-
-int clif_autospell(struct map_session_data *sd,int skilllv);
-int clif_devotion(struct map_session_data *sd);
-int clif_marionette(struct block_list *src, struct block_list *target);
-int clif_spiritball(struct map_session_data *sd);
-int clif_combo_delay(struct block_list *src,int wait);
-int clif_bladestop(struct block_list *src,struct block_list *dst,int bool_);
-int clif_changemapcell(int m,int x,int y,int cell_type,int type);
-
-int clif_status_load(struct block_list *bl,int type, int flag);
-int clif_status_change(struct block_list *bl,int type,int flag);
-
-int clif_wis_message(int fd,char *nick,char *mes,int mes_len);
-int clif_wis_end(int fd,int flag);
-
-int clif_solved_charname(struct map_session_data *sd,int char_id);
-int clif_charnameack(int fd, struct block_list *bl);
-int clif_charnameupdate(struct map_session_data *ssd);
-
-int clif_use_card(struct map_session_data *sd,int idx);
-int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag);
-
-void clif_inventorylist(struct map_session_data *sd);
-void clif_equiplist(struct map_session_data *sd);
-
-int clif_cart_additem(struct map_session_data*,int,int,int);
-int clif_cart_delitem(struct map_session_data*,int,int);
-void clif_cartlist(struct map_session_data *sd);
-
-int clif_item_identify_list(struct map_session_data *sd);
-int clif_item_identified(struct map_session_data *sd,int idx,int flag);
-int clif_item_repair_list (struct map_session_data *sd, struct map_session_data *dstsd);
-int clif_item_repaireffect(struct map_session_data *sd, int nameid, int flag);
-int clif_item_refine_list(struct map_session_data *sd);
-
-int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name);
-
-int clif_mvp_effect(struct map_session_data *sd);
-int clif_mvp_item(struct map_session_data *sd,int nameid);
-int clif_mvp_exp(struct map_session_data *sd,unsigned long exp);
-void clif_changed_dir(struct block_list *bl, int area);
-
-// vending
-int clif_openvendingreq(struct map_session_data *sd,int num);
-int clif_showvendingboard(struct block_list* bl,char *message,int fd);
-int clif_closevendingboard(struct block_list* bl,int fd);
-int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending);
-int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail);
-int clif_openvending(struct map_session_data *sd,int id,struct vending *vending);
-int clif_vendingreport(struct map_session_data *sd,int index,int amount);
-
-int clif_movetoattack(struct map_session_data *sd,struct block_list *bl);
-
-// party
-int clif_party_created(struct map_session_data *sd,int flag);
-int clif_party_main_info(struct party_data *p, int fd);
-int clif_party_join_info(struct party *p, struct map_session_data *sd);
-int clif_party_info(struct party_data *p,int fd);
-int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd);
-int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag);
-int clif_party_option(struct party_data *p,struct map_session_data *sd,int flag);
-int clif_party_leaved(struct party_data *p,struct map_session_data *sd,int account_id,char *name,int flag);
-int clif_party_message(struct party_data *p,int account_id,char *mes,int len);
-int clif_party_move(struct party *p,struct map_session_data *sd,int online);
-int clif_party_xy(struct map_session_data *sd);
-int clif_party_xy_single(int fd, struct map_session_data *sd);
-int clif_party_hp(struct map_session_data *sd);
-int clif_hpmeter(struct map_session_data *sd);
-
-// guild
-int clif_guild_created(struct map_session_data *sd,int flag);
-int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g);
-int clif_guild_basicinfo(struct map_session_data *sd);
-int clif_guild_allianceinfo(struct map_session_data *sd);
-int clif_guild_memberlist(struct map_session_data *sd);
-int clif_guild_skillinfo(struct map_session_data *sd);
-int clif_guild_send_onlineinfo(struct map_session_data *sd); //[LuzZza]
-int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag);
-int clif_guild_invite(struct map_session_data *sd,struct guild *g);
-int clif_guild_inviteack(struct map_session_data *sd,int flag);
-int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes);
-int clif_guild_expulsion(struct map_session_data *sd,const char *name,const char *mes,int account_id);
-int clif_guild_positionchanged(struct guild *g,int idx);
-int clif_guild_memberpositionchanged(struct guild *g,int idx);
-int clif_guild_emblem(struct map_session_data *sd,struct guild *g);
-int clif_guild_notice(struct map_session_data *sd,struct guild *g);
-int clif_guild_message(struct guild *g,int account_id,const char *mes,int len);
-int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv);
-int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name);
-int clif_guild_allianceack(struct map_session_data *sd,int flag);
-int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
-int clif_guild_oppositionack(struct map_session_data *sd,int flag);
-int clif_guild_broken(struct map_session_data *sd,int flag);
-int clif_guild_xy(struct map_session_data *sd);
-int clif_guild_xy_single(int fd, struct map_session_data *sd);
-int clif_guild_xy_remove(struct map_session_data *sd);
-
-
-// atcommand
-int clif_displaymessage(const int fd,char* mes);
-int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len);
-void clif_disp_message(struct block_list *src, char *mes, int len, int type);
-int clif_GMmessage(struct block_list *bl,char* mes,int len,int flag);
-void clif_MainChatMessage(char* message); //luzza
-int clif_announce(struct block_list *bl, char* mes, int len, unsigned long color, int flag);
-int clif_heal(int fd,int type,int val);
-int clif_resurrection(struct block_list *bl,int type);
-int clif_set0199(int fd,int type);
-int clif_pvpset(struct map_session_data *sd, int pvprank, int pvpnum,int type);
-int clif_send0199(int map,int type);
-int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val);
-
-//petsystem
-int clif_catch_process(struct map_session_data *sd);
-int clif_pet_rulet(struct map_session_data *sd,int data);
-int clif_sendegg(struct map_session_data *sd);
-int clif_send_petdata(struct map_session_data *sd,int type,int param);
-int clif_send_petstatus(struct map_session_data *sd);
-int clif_pet_emotion(struct pet_data *pd,int param);
-int clif_pet_performance(struct block_list *bl,int param);
-int clif_pet_equip(struct pet_data *pd);
-int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
-int clif_send (unsigned char *buf, int len, struct block_list *bl, int type);
-int clif_send_debug(struct map_session_data *sd, int cmd, int* args, int args_num);
-
-//friends list
-int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap);
-void clif_friendslist_send(struct map_session_data *sd);
-void clif_friendslist_reqack(struct map_session_data *sd, struct map_session_data *f_sd, int type);
-
-// [Valaris]
-int clif_mob_hp(struct mob_data *md);
-int clif_weather(int m); // [Valaris]
-int clif_specialeffect(struct block_list *bl,int type, int flag); // special effects [Valaris]
-int clif_message(struct block_list *bl, char* msg); // messages (from mobs/npcs) [Valaris]
-
-int clif_GM_kickack(struct map_session_data *sd,int id);
-int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type);
-int clif_GM_silence(struct map_session_data *sd,struct map_session_data *tsd,int type);
-int clif_timedout(struct map_session_data *sd);
-
-int clif_foreachclient(int (*)(struct map_session_data*,va_list),...);
-int clif_disp_overhead(struct map_session_data *sd, char* mes);
-
-int do_final_clif(void);
-int do_init_clif(void);
-
-void clif_get_weapon_view(TBL_PC* sd, unsigned short *rhand, unsigned short *lhand);
-
-int clif_party_xy_remove(struct map_session_data *sd); //Fix for minimap [Kevin]
-void clif_gospel_info(struct map_session_data *sd, int type);
-void clif_parse_ReqFeel(int fd, struct map_session_data *sd, int skilllv);
-void clif_feel_info(struct map_session_data *sd, unsigned char feel_level, unsigned char type);
-void clif_hate_info(struct map_session_data *sd, unsigned char hate_level,int class_, unsigned char type);
-void clif_mission_info(struct map_session_data *sd, int mob_id, unsigned char progress);
-void clif_feel_hate_reset(struct map_session_data *sd);
-
-// [blackhole89]
-int clif_spawnhomun(struct homun_data *hd);
-int clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag);
-int clif_homskillinfoblock(struct map_session_data *sd);
-void clif_homskillup(struct map_session_data *sd, int skill_num) ; //[orn]
-int clif_hom_food(struct map_session_data *sd,int foodid,int fail); //[orn]
-void clif_send_homdata(struct map_session_data *sd, int type, int param); //[orn]
-int clif_hwalkok(struct homun_data *hd); //[orn]
-
-#endif
-
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _CLIF_H_
+#define _CLIF_H_
+
+#include "map.h"
+
+// protocol version
+#define PACKETVER 7
+
+// packet DB
+#define MAX_PACKET_DB 0x25f
+#define MAX_PACKET_VER 25
+
+struct packet_db {
+ short len;
+ void (*func)(int, struct map_session_data *);
+ short pos[20];
+};
+
+// local define
+enum {
+ ALL_CLIENT,
+ ALL_SAMEMAP,
+ AREA,
+ AREA_WOS,
+ AREA_WOC,
+ AREA_WOSC,
+ AREA_CHAT_WOC,
+ CHAT,
+ CHAT_WOS,
+ CHAT_MAINCHAT,
+ PARTY,
+ PARTY_WOS,
+ PARTY_SAMEMAP,
+ PARTY_SAMEMAP_WOS,
+ PARTY_AREA,
+ PARTY_AREA_WOS,
+ GUILD,
+ GUILD_WOS,
+ GUILD_SAMEMAP, // [Valaris]
+ GUILD_SAMEMAP_WOS,
+ GUILD_AREA,
+ GUILD_AREA_WOS, // end additions [Valaris]
+ SELF,
+ DUEL,
+ DUEL_WOS
+};
+
+extern struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB];
+
+int clif_setip(char*);
+void clif_setbindip(char*);
+void clif_setport(int);
+
+unsigned long clif_getip_long(void);
+unsigned long clif_refresh_ip(void);
+int clif_getport(void);
+int clif_countusers(void);
+void clif_setwaitclose(int);
+
+int clif_authok(struct map_session_data *);
+int clif_authfail_fd(int,int);
+void clif_updatemaxid(int, int);
+int clif_charselectok(int);
+void check_fake_id(int fd, struct map_session_data *sd, int target_id);
+int clif_dropflooritem(struct flooritem_data *);
+int clif_clearflooritem(struct flooritem_data *,int);
+int clif_clearchar(struct block_list*,int); // area or fd
+int clif_clearchar_delay(unsigned int,struct block_list *,int);
+#define clif_clearchar_area(bl,type) clif_clearchar(bl,type)
+int clif_clearchar_id(int,int,int);
+int clif_spawn(struct block_list*); //area
+int clif_walkok(struct map_session_data*); // self
+int clif_move(struct block_list*); // area
+int clif_changemap(struct map_session_data*,short,int,int); //self
+int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self
+int clif_blown(struct block_list *); // area
+int clif_slide(struct block_list *,int,int); // area
+int clif_fixpos(struct block_list *); // area
+int clif_fixpos2(struct block_list *); // area
+int clif_npcbuysell(struct map_session_data*,int); //self
+int clif_buylist(struct map_session_data*,struct npc_data*); //self
+int clif_selllist(struct map_session_data*); //self
+int clif_scriptmes(struct map_session_data*,int,char*); //self
+int clif_scriptnext(struct map_session_data*,int); //self
+int clif_scriptclose(struct map_session_data*,int); //self
+int clif_scriptmenu(struct map_session_data*,int,char*); //self
+int clif_scriptinput(struct map_session_data*,int); //self
+int clif_scriptinputstr(struct map_session_data *sd,int npcid); // self
+int clif_cutin(struct map_session_data*,char*,int); //self
+int clif_viewpoint(struct map_session_data*,int,int,int,int,int,int); //self
+int clif_additem(struct map_session_data*,int,int,int); //self
+int clif_delitem(struct map_session_data*,int,int); //self
+int clif_updatestatus(struct map_session_data*,int); //self
+int clif_changestatus(struct block_list*,int,int); //area
+int clif_damage(struct block_list *,struct block_list *,unsigned int,int,int,int,int,int,int); // area
+#define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0)
+int clif_changelook(struct block_list *,int,int); // area
+void clif_changetraplook(struct block_list *bl,int val); // area
+void clif_refreshlook(struct block_list *bl,int id,int type,int val,int area); //area specified in 'area'
+int clif_arrowequip(struct map_session_data *sd,int val); //self
+int clif_arrow_fail(struct map_session_data *sd,int type); //self
+int clif_arrow_create_list(struct map_session_data *sd); //self
+int clif_statusupack(struct map_session_data *,int,int,int); // self
+int clif_equipitemack(struct map_session_data *,int,int,int); // self
+int clif_unequipitemack(struct map_session_data *,int,int,int); // self
+int clif_misceffect(struct block_list*,int); // area
+int clif_misceffect2(struct block_list *bl,int type);
+int clif_changeoption(struct block_list*); // area
+int clif_useitemack(struct map_session_data*,int,int,int); // self
+void clif_GlobalMessage(struct block_list *bl,char *message);
+int clif_createchat(struct map_session_data*,int); // self
+int clif_dispchat(struct chat_data*,int); // area or fd
+int clif_joinchatfail(struct map_session_data*,int); // self
+int clif_joinchatok(struct map_session_data*,struct chat_data*); // self
+int clif_addchat(struct chat_data*,struct map_session_data*); // chat
+int clif_changechatowner(struct chat_data*,struct map_session_data*); // chat
+int clif_clearchat(struct chat_data*,int); // area or fd
+int clif_leavechat(struct chat_data*,struct map_session_data*); // chat
+int clif_changechatstatus(struct chat_data*); // chat
+int clif_refresh(struct map_session_data*); // self
+
+int clif_fame_blacksmith(struct map_session_data *, int);
+int clif_fame_alchemist(struct map_session_data *, int);
+int clif_fame_taekwon(struct map_session_data *, int);
+
+void clif_emotion(struct block_list *bl,int type);
+void clif_talkiebox(struct block_list *bl,char* talkie);
+void clif_wedding_effect(struct block_list *bl);
+void clif_divorced(struct map_session_data *sd, char *);
+//void clif_sitting(int fd, struct map_session_data *sd);
+//void clif_callpartner(struct map_session_data *sd);
+void clif_adopt_process(struct map_session_data *sd);
+void clif_sitting(struct map_session_data *sd);
+void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type);
+int clif_soundeffectall(struct block_list *bl, char *name, int type, int coverage);
+void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, unsigned int tick);
+void clif_parse_LoadEndAck(int fd,struct map_session_data *sd);
+
+// trade
+int clif_traderequest(struct map_session_data *sd,char *name);
+int clif_tradestart(struct map_session_data *sd,int type);
+int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount);
+int clif_tradeitemok(struct map_session_data *sd,int index,int fail);
+int clif_tradedeal_lock(struct map_session_data *sd,int fail);
+int clif_tradecancelled(struct map_session_data *sd);
+int clif_tradecompleted(struct map_session_data *sd,int fail);
+
+// storage
+#include "storage.h"
+void clif_storagelist(struct map_session_data *sd,struct storage *stor);
+int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor);
+int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount);
+int clif_storageitemremoved(struct map_session_data *sd,int index,int amount);
+int clif_storageclose(struct map_session_data *sd);
+void clif_guildstoragelist(struct map_session_data *sd,struct guild_storage *stor);
+int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor);
+int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount);
+
+int clif_insight(struct block_list *,va_list); // map_forallinmovearea callback
+int clif_outsight(struct block_list *,va_list); // map_forallinmovearea callback
+
+int clif_class_change(struct block_list *bl,int class_,int type);
+#define clif_mob_class_change(md, class_) clif_class_change(&md->bl, class_, 1)
+int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris]
+
+int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range);
+int clif_skillinfoblock(struct map_session_data *sd);
+int clif_skillup(struct map_session_data *sd,int skill_num);
+
+int clif_skillcasting(struct block_list* bl,
+ int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime);
+int clif_skillcastcancel(struct block_list* bl);
+int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype);
+int clif_skill_damage(struct block_list *src,struct block_list *dst,
+ unsigned int tick,int sdelay,int ddelay,int damage,int div,
+ int skill_id,int skill_lv,int type);
+int clif_skill_damage2(struct block_list *src,struct block_list *dst,
+ unsigned int tick,int sdelay,int ddelay,int damage,int div,
+ int skill_id,int skill_lv,int type);
+int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
+ int skill_id,int heal,int fail);
+int clif_skill_poseffect(struct block_list *src,int skill_id,
+ int val,int x,int y,int tick);
+int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst);
+int clif_skill_warppoint(struct map_session_data *sd,int skill_num, int skill_lv,
+ const char *map1,const char *map2,const char *map3,const char *map4);
+int clif_skill_memo(struct map_session_data *sd,int flag);
+int clif_skill_teleportmessage(struct map_session_data *sd,int flag);
+int clif_skill_produce_mix_list(struct map_session_data *sd, int trigger);
+
+int clif_produceeffect(struct map_session_data *sd,int flag,int nameid);
+
+int clif_skill_setunit(struct skill_unit *unit);
+int clif_skill_delunit(struct skill_unit *unit);
+
+int clif_01ac(struct block_list *bl);
+
+int clif_autospell(struct map_session_data *sd,int skilllv);
+int clif_devotion(struct map_session_data *sd);
+int clif_marionette(struct block_list *src, struct block_list *target);
+int clif_spiritball(struct map_session_data *sd);
+int clif_combo_delay(struct block_list *src,int wait);
+int clif_bladestop(struct block_list *src,struct block_list *dst,int bool_);
+int clif_changemapcell(int m,int x,int y,int cell_type,int type);
+
+int clif_status_load(struct block_list *bl,int type, int flag);
+int clif_status_change(struct block_list *bl,int type,int flag);
+
+int clif_wis_message(int fd,char *nick,char *mes,int mes_len);
+int clif_wis_end(int fd,int flag);
+
+int clif_solved_charname(struct map_session_data *sd,int char_id);
+int clif_charnameack(int fd, struct block_list *bl);
+int clif_charnameupdate(struct map_session_data *ssd);
+
+int clif_use_card(struct map_session_data *sd,int idx);
+int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag);
+
+void clif_inventorylist(struct map_session_data *sd);
+void clif_equiplist(struct map_session_data *sd);
+
+int clif_cart_additem(struct map_session_data*,int,int,int);
+int clif_cart_delitem(struct map_session_data*,int,int);
+void clif_cartlist(struct map_session_data *sd);
+
+int clif_item_identify_list(struct map_session_data *sd);
+int clif_item_identified(struct map_session_data *sd,int idx,int flag);
+int clif_item_repair_list (struct map_session_data *sd, struct map_session_data *dstsd);
+int clif_item_repaireffect(struct map_session_data *sd, int nameid, int flag);
+int clif_item_refine_list(struct map_session_data *sd);
+
+int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name);
+
+int clif_mvp_effect(struct map_session_data *sd);
+int clif_mvp_item(struct map_session_data *sd,int nameid);
+int clif_mvp_exp(struct map_session_data *sd,unsigned long exp);
+void clif_changed_dir(struct block_list *bl, int area);
+
+// vending
+int clif_openvendingreq(struct map_session_data *sd,int num);
+int clif_showvendingboard(struct block_list* bl,char *message,int fd);
+int clif_closevendingboard(struct block_list* bl,int fd);
+int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending);
+int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail);
+int clif_openvending(struct map_session_data *sd,int id,struct vending *vending);
+int clif_vendingreport(struct map_session_data *sd,int index,int amount);
+
+int clif_movetoattack(struct map_session_data *sd,struct block_list *bl);
+
+// party
+int clif_party_created(struct map_session_data *sd,int flag);
+int clif_party_main_info(struct party_data *p, int fd);
+int clif_party_join_info(struct party *p, struct map_session_data *sd);
+int clif_party_info(struct party_data *p,int fd);
+int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd);
+int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag);
+int clif_party_option(struct party_data *p,struct map_session_data *sd,int flag);
+int clif_party_leaved(struct party_data *p,struct map_session_data *sd,int account_id,char *name,int flag);
+int clif_party_message(struct party_data *p,int account_id,char *mes,int len);
+int clif_party_move(struct party *p,struct map_session_data *sd,int online);
+int clif_party_xy(struct map_session_data *sd);
+int clif_party_xy_single(int fd, struct map_session_data *sd);
+int clif_party_hp(struct map_session_data *sd);
+int clif_hpmeter(struct map_session_data *sd);
+
+// guild
+int clif_guild_created(struct map_session_data *sd,int flag);
+int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g);
+int clif_guild_basicinfo(struct map_session_data *sd);
+int clif_guild_allianceinfo(struct map_session_data *sd);
+int clif_guild_memberlist(struct map_session_data *sd);
+int clif_guild_skillinfo(struct map_session_data *sd);
+int clif_guild_send_onlineinfo(struct map_session_data *sd); //[LuzZza]
+int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag);
+int clif_guild_invite(struct map_session_data *sd,struct guild *g);
+int clif_guild_inviteack(struct map_session_data *sd,int flag);
+int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes);
+int clif_guild_expulsion(struct map_session_data *sd,const char *name,const char *mes,int account_id);
+int clif_guild_positionchanged(struct guild *g,int idx);
+int clif_guild_memberpositionchanged(struct guild *g,int idx);
+int clif_guild_emblem(struct map_session_data *sd,struct guild *g);
+int clif_guild_notice(struct map_session_data *sd,struct guild *g);
+int clif_guild_message(struct guild *g,int account_id,const char *mes,int len);
+int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv);
+int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name);
+int clif_guild_allianceack(struct map_session_data *sd,int flag);
+int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
+int clif_guild_oppositionack(struct map_session_data *sd,int flag);
+int clif_guild_broken(struct map_session_data *sd,int flag);
+int clif_guild_xy(struct map_session_data *sd);
+int clif_guild_xy_single(int fd, struct map_session_data *sd);
+int clif_guild_xy_remove(struct map_session_data *sd);
+
+
+// atcommand
+int clif_displaymessage(const int fd,char* mes);
+int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len);
+void clif_disp_message(struct block_list *src, char *mes, int len, int type);
+int clif_GMmessage(struct block_list *bl,char* mes,int len,int flag);
+void clif_MainChatMessage(char* message); //luzza
+int clif_announce(struct block_list *bl, char* mes, int len, unsigned long color, int flag);
+int clif_heal(int fd,int type,int val);
+int clif_resurrection(struct block_list *bl,int type);
+int clif_set0199(int fd,int type);
+int clif_pvpset(struct map_session_data *sd, int pvprank, int pvpnum,int type);
+int clif_send0199(int map,int type);
+int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val);
+
+//petsystem
+int clif_catch_process(struct map_session_data *sd);
+int clif_pet_rulet(struct map_session_data *sd,int data);
+int clif_sendegg(struct map_session_data *sd);
+int clif_send_petdata(struct map_session_data *sd,int type,int param);
+int clif_send_petstatus(struct map_session_data *sd);
+int clif_pet_emotion(struct pet_data *pd,int param);
+int clif_pet_performance(struct block_list *bl,int param);
+int clif_pet_equip(struct pet_data *pd);
+int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
+int clif_send (unsigned char *buf, int len, struct block_list *bl, int type);
+int clif_send_debug(struct map_session_data *sd, int cmd, int* args, int args_num);
+
+//friends list
+int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap);
+void clif_friendslist_send(struct map_session_data *sd);
+void clif_friendslist_reqack(struct map_session_data *sd, struct map_session_data *f_sd, int type);
+
+// [Valaris]
+int clif_mob_hp(struct mob_data *md);
+int clif_weather(int m); // [Valaris]
+int clif_specialeffect(struct block_list *bl,int type, int flag); // special effects [Valaris]
+int clif_message(struct block_list *bl, char* msg); // messages (from mobs/npcs) [Valaris]
+
+int clif_GM_kickack(struct map_session_data *sd,int id);
+int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type);
+int clif_GM_silence(struct map_session_data *sd,struct map_session_data *tsd,int type);
+int clif_timedout(struct map_session_data *sd);
+
+int clif_foreachclient(int (*)(struct map_session_data*,va_list),...);
+int clif_disp_overhead(struct map_session_data *sd, char* mes);
+
+int do_final_clif(void);
+int do_init_clif(void);
+
+void clif_get_weapon_view(TBL_PC* sd, unsigned short *rhand, unsigned short *lhand);
+
+int clif_party_xy_remove(struct map_session_data *sd); //Fix for minimap [Kevin]
+void clif_gospel_info(struct map_session_data *sd, int type);
+void clif_parse_ReqFeel(int fd, struct map_session_data *sd, int skilllv);
+void clif_feel_info(struct map_session_data *sd, unsigned char feel_level, unsigned char type);
+void clif_hate_info(struct map_session_data *sd, unsigned char hate_level,int class_, unsigned char type);
+void clif_mission_info(struct map_session_data *sd, int mob_id, unsigned char progress);
+void clif_feel_hate_reset(struct map_session_data *sd);
+
+// [blackhole89]
+int clif_spawnhomun(struct homun_data *hd);
+int clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag);
+int clif_homskillinfoblock(struct map_session_data *sd);
+void clif_homskillup(struct map_session_data *sd, int skill_num) ; //[orn]
+int clif_hom_food(struct map_session_data *sd,int foodid,int fail); //[orn]
+void clif_send_homdata(struct map_session_data *sd, int type, int param); //[orn]
+int clif_hwalkok(struct homun_data *hd); //[orn]
+
+#endif
+
+
diff --git a/src/map/date.c b/src/map/date.c
index 3bb7dca66..4643d6780 100644
--- a/src/map/date.c
+++ b/src/map/date.c
@@ -1,72 +1,72 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include "date.h"
-#include <time.h>
-
-int date_get_year(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_year+1900;
-}
-int date_get_month(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_mon+1;
-}
-int date_get_day(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_mday;
-}
-int date_get_hour(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_hour;
-}
-
-int date_get_min(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_min;
-}
-
-int date_get_sec(void)
-{
- time_t t;
- struct tm * lt;
- t = time(NULL);
- lt = localtime(&t);
- return lt->tm_sec;
-}
-
-int is_day_of_sun(void)
-{
- return date_get_day()%2 == 0;
-}
-
-int is_day_of_moon(void)
-{
- return date_get_day()%2 == 1;
-}
-
-int is_day_of_star(void)
-{
- return date_get_day()%5 == 0;
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include "date.h"
+#include <time.h>
+
+int date_get_year(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_year+1900;
+}
+int date_get_month(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_mon+1;
+}
+int date_get_day(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_mday;
+}
+int date_get_hour(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_hour;
+}
+
+int date_get_min(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_min;
+}
+
+int date_get_sec(void)
+{
+ time_t t;
+ struct tm * lt;
+ t = time(NULL);
+ lt = localtime(&t);
+ return lt->tm_sec;
+}
+
+int is_day_of_sun(void)
+{
+ return date_get_day()%2 == 0;
+}
+
+int is_day_of_moon(void)
+{
+ return date_get_day()%2 == 1;
+}
+
+int is_day_of_star(void)
+{
+ return date_get_day()%5 == 0;
+}
+
diff --git a/src/map/date.h b/src/map/date.h
index 2dfbf58dd..2b8ffe991 100644
--- a/src/map/date.h
+++ b/src/map/date.h
@@ -1,17 +1,17 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _DATE_H_
-#define _DATE_H_
-#endif
-
-int date_get_year(void);
-int date_get_month(void);
-int date_get_day(void);
-int date_get_hour(void);
-int date_get_min(void);
-int date_get_sec(void);
-
-int is_day_of_sun(void);
-int is_day_of_moon(void);
-int is_day_of_star(void);
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _DATE_H_
+#define _DATE_H_
+#endif
+
+int date_get_year(void);
+int date_get_month(void);
+int date_get_day(void);
+int date_get_hour(void);
+int date_get_min(void);
+int date_get_sec(void);
+
+int is_day_of_sun(void);
+int is_day_of_moon(void);
+int is_day_of_star(void);
diff --git a/src/map/guild.c b/src/map/guild.c
index 1fe0f526d..0b3be181b 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -1,2017 +1,2017 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-#include "../common/ers.h"
-
-#include "map.h"
-#include "guild.h"
-#include "storage.h"
-#include "battle.h"
-#include "npc.h"
-#include "pc.h"
-#include "status.h"
-#include "mob.h"
-#include "intif.h"
-#include "clif.h"
-#include "skill.h"
-#include "log.h"
-
-static struct guild* guild_cache; //For fast retrieval of the same guild over and over. [Skotlex]
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-static struct dbt *guild_expcache_db;
-static struct dbt *guild_infoevent_db;
-static struct dbt *guild_castleinfoevent_db;
-
-struct eventlist {
- char name[50];
- struct eventlist *next;
-};
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚̃tƒ‰ƒbƒVƒ…‚ÉŠÖ˜A‚·‚é’è”
-#define GUILD_SEND_XY_INVERVAL 5000 // À•W‚â‚g‚o‘—M‚ÌŠÔŠu
-#define GUILD_PAYEXP_INVERVAL 10000 // ŠÔŠu(ƒLƒƒƒbƒVƒ…‚Ìő嶑¶ŽžŠÔAƒ~ƒŠ•b)
-#define GUILD_PAYEXP_LIST 8192 // ƒLƒƒƒbƒVƒ…‚ÌÅ‘å”
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…
-struct guild_expcache {
- int guild_id, account_id, char_id;
- unsigned int exp;
-};
-static struct eri *expcache_ers; //For handling of guild exp payment.
-
-struct{
- int id;
- int max;
- struct{
- short id;
- short lv;
- }need[6];
-} guild_skill_tree[MAX_GUILDSKILL];
-
-// timer for auto saving guild data during WoE
-#define GUILD_SAVE_INTERVAL 300000
-int guild_save_timer = -1;
-
-int guild_payexp_timer(int tid,unsigned int tick,int id,int data);
-int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data);
-int guild_save_sub(int tid,unsigned int tick,int id,int data);
-static int guild_send_xy_timer(int tid,unsigned int tick,int id,int data);
-
- // Modified [Komurka]
-int guild_skill_get_max (int id)
-{
- if (id < GD_SKILLBASE || id > GD_SKILLBASE+MAX_GUILDSKILL)
- return 0;
- return guild_skill_tree[id-GD_SKILLBASE].max;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g,int id)
-{
- int idx = id-GD_SKILLBASE;
- if (idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
- return g->skill[idx].lv;
-}
-
-/*==========================================
- * guild_skill_tree.txt reading - from jA [Komurka]
- *------------------------------------------
- */
-int guild_read_guildskill_tree_db(void)
-{
- int i,k,id=0,ln=0;
- FILE *fp;
- char line[1024],*p;
-
- malloc_set(guild_skill_tree,0,sizeof(guild_skill_tree));
- sprintf(line, "%s/guild_skill_tree.txt", db_path);
- if( (fp=fopen(line,"r"))==NULL){
- ShowError("can't read %s\n", line);
- return -1;
- }
- while(fgets(line,1020,fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(i=0,p=line;i<12 && p;i++){
- split[i]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(i<12)
- continue;
- id = atoi(split[0]) - GD_SKILLBASE;
- if(id<0 || id>=MAX_GUILDSKILL)
- continue;
- guild_skill_tree[id].id=atoi(split[0]);
- guild_skill_tree[id].max=atoi(split[1]);
- if (guild_skill_tree[id].id==GD_GLORYGUILD && battle_config.require_glory_guild && guild_skill_tree[id].max==0) guild_skill_tree[id].max=1;
- for(k=0;k<5;k++){
- guild_skill_tree[id].need[k].id=atoi(split[k*2+2]);
- guild_skill_tree[id].need[k].lv=atoi(split[k*2+3]);
- }
- ln++;
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"guild_skill_tree.txt");
-
- return 0;
-}
-
-/*==========================================
- * Guild skill check - from jA [Komurka]
- *------------------------------------------
- */
-int guild_check_skill_require(struct guild *g,int id)
-{
- int i;
- int idx = id-GD_SKILLBASE;
-
- if(g == NULL)
- return 0;
-
- if (idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
-
- for(i=0;i<5;i++)
- {
- if(guild_skill_tree[idx].need[i].id == 0) break;
- if(guild_skill_tree[idx].need[i].lv > guild_checkskill(g,guild_skill_tree[idx].need[i].id))
- return 0;
- }
- return 1;
-}
-
-static int guild_read_castledb(void)
-{
- FILE *fp;
- char line[1024];
- int j,ln=0;
- char *str[32],*p;
- struct guild_castle *gc;
-
- sprintf(line, "%s/castle_db.txt", db_path);
- if( (fp=fopen(line,"r"))==NULL){
- ShowError("can't read %s\n", line);
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- malloc_tsetdword(str,0,sizeof(str));
- for(j=0,p=line;j<6 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if (j < 4) //Insufficient data for castle. [Skotlex]
- {
- ShowError("castle_db.txt: invalid line '%s'\n", line);
- continue;
- }
-
- gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
- gc->castle_id=atoi(str[0]);
- memcpy(gc->map_name,str[1],MAP_NAME_LENGTH-1);
- memcpy(gc->castle_name,str[2],NAME_LENGTH-1);
- memcpy(gc->castle_event,str[3],NAME_LENGTH-1);
-
- idb_put(castle_db,gc->castle_id,gc);
-
- //intif_guild_castle_info(gc->castle_id);
-
- ln++;
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"castle_db.txt");
- return 0;
-}
-
-// ‰Šú‰»
-void do_init_guild(void)
-{
- guild_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- castle_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- guild_expcache_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
- guild_infoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
- expcache_ers = ers_new((uint32)sizeof(struct guild_expcache));
- guild_castleinfoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
-
- guild_read_castledb();
-
- guild_read_guildskill_tree_db(); //guild skill tree [Komurka]
-
- add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer");
- add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
- add_timer_func_list(guild_save_sub, "guild_save_sub");
- add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer");
- add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
- add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL);
-}
-
-
-// ŒŸõ
-struct guild *guild_search(int guild_id)
-{
- if(guild_cache && guild_cache->guild_id == guild_id)
- return guild_cache;
- guild_cache = idb_get(guild_db,guild_id);
- return guild_cache;
-}
-int guild_searchname_sub(DBKey key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct guild **);
- if(strcmpi(g->name,str)==0)
- *dst=g;
- return 0;
-}
-// ƒMƒ‹ƒh–¼ŒŸõ
-struct guild* guild_searchname(char *str)
-{
- struct guild *g=NULL;
- guild_db->foreach(guild_db,guild_searchname_sub,str,&g);
- return g;
-}
-struct guild_castle *guild_castle_search(int gcid)
-{
- return idb_get(castle_db,gcid);
-}
-
-// mapname‚ɑΉž‚µ‚½ƒAƒWƒg‚Ìgc‚ð•Ô‚·
-struct guild_castle *guild_mapname2gc(char *mapname)
-{
- int i;
- struct guild_castle *gc=NULL;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(strcmp(gc->map_name,mapname)==0) return gc;
- }
- return NULL;
-}
-
-struct guild_castle *guild_mapindex2gc(short mapname)
-{
- int i;
- struct guild_castle *gc=NULL;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(strcmp(gc->map_name,mapindex_id2name(mapname))==0) return gc;
- }
- return NULL;
-}
-
-
-
-// ƒƒOƒCƒ“’†‚̃Mƒ‹ƒhƒƒ“ƒo[‚Ì‚Pl‚Ìsd‚ð•Ô‚·
-struct map_session_data *guild_getavailablesd(struct guild *g)
-{
- int i;
-
- nullpo_retr(NULL, g);
-
- for(i=0;i<g->max_member;i++)
- if(g->member[i].sd!=NULL)
- return g->member[i].sd;
- return NULL;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒo[‚̃Cƒ“ƒfƒbƒNƒX‚ð•Ô‚·
-int guild_getindex(struct guild *g,int account_id,int char_id)
-{
- int i;
- if(g==NULL)
- return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id )
- return i;
- return -1;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo[‚Ì–ðE‚ð•Ô‚·
-int guild_getposition(struct map_session_data *sd,struct guild *g)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- if(g==NULL && (g=guild_search(sd->status.guild_id))==NULL)
- return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==sd->status.account_id &&
- g->member[i].char_id==sd->status.char_id )
- return g->member[i].position;
- return -1;
-}
-
-// ƒƒ“ƒo[î•ñ‚Ìì¬
-void guild_makemember(struct guild_member *m,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- malloc_set(m,0,sizeof(struct guild_member));
- m->account_id =sd->status.account_id;
- m->char_id =sd->status.char_id;
- m->hair =sd->status.hair;
- m->hair_color =sd->status.hair_color;
- m->gender =sd->status.sex;
- m->class_ =sd->status.class_;
- m->lv =sd->status.base_level;
-// m->exp =0;
-// m->exp_payper =0;
- m->online =1;
- m->position =MAX_GUILDPOSITION-1;
- memcpy(m->name,sd->status.name,NAME_LENGTH-1);
- return;
-}
-// ƒMƒ‹ƒh‹£‡Šm”F
-int guild_check_conflict(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- intif_guild_checkconflict(sd->status.guild_id,
- sd->status.account_id,sd->status.char_id);
- return 0;
-}
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚ðinterŽI‚Ƀtƒ‰ƒbƒVƒ…‚·‚é
-int guild_payexp_timer_sub(DBKey dataid, void *data, va_list ap)
-{
- int i;
- struct guild_expcache *c;
- struct guild *g;
-
- c = (struct guild_expcache *)data;
-
- if (
- (g = guild_search(c->guild_id)) == NULL ||
- (i = guild_getindex(g, c->account_id, c->char_id)) < 0
- ) {
- ers_free(expcache_ers, data);
- return 0;
- }
-
- if (g->member[i].exp > UINT_MAX - c->exp)
- g->member[i].exp = UINT_MAX;
- else
- g->member[i].exp+= c->exp;
-
- intif_guild_change_memberinfo(g->guild_id,c->account_id,c->char_id,
- GMI_EXP,&g->member[i].exp,sizeof(g->member[i].exp));
- c->exp=0;
-
- ers_free(expcache_ers, data);
- return 0;
-}
-
-int guild_payexp_timer(int tid, unsigned int tick, int id, int data)
-{
- guild_expcache_db->clear(guild_expcache_db,guild_payexp_timer_sub);
- return 0;
-}
-
-//Taken from party_send_xy_timer_sub. [Skotlex]
-int guild_send_xy_timer_sub(DBKey key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data;
- int i;
-
- nullpo_retr(0, g);
-
- for(i=0;i<g->max_member;i++){
- struct map_session_data *sd;
- if((sd=g->member[i].sd)!=NULL){
- if(sd->guild_x!=sd->bl.x || sd->guild_y!=sd->bl.y){
- clif_guild_xy(sd);
- sd->guild_x=sd->bl.x;
- sd->guild_y=sd->bl.y;
- }
- }
- }
- return 0;
-}
-
-//Code from party_send_xy_timer [Skotlex]
-static int guild_send_xy_timer(int tid,unsigned int tick,int id,int data)
-{
- guild_db->foreach(guild_db,guild_send_xy_timer_sub,tick);
- return 0;
-}
-
-int guild_send_dot_remove(struct map_session_data *sd)
-{
- if (sd->status.guild_id)
- clif_guild_xy_remove(sd);
- return 0;
-}
-//------------------------------------------------------------------------
-
-// 쬗v‹
-int guild_create(struct map_session_data *sd,char *name)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id)
- {
- clif_guild_created(sd,1); // ‚·‚Å‚ÉŠ‘®‚µ‚Ä‚¢‚é
- return 0;
- }
- if(!battle_config.guild_emperium_check || pc_search_inventory(sd,714) >= 0) {
- struct guild_member m;
- guild_makemember(&m,sd);
- m.position=0;
- intif_guild_create(name,&m);
- return 1;
- }
- clif_guild_created(sd,3); // ƒGƒ“ƒyƒŠƒEƒ€‚ª‚¢‚È‚¢
- return 0;
-}
-
-// 쬉”Û
-int guild_created(int account_id,int guild_id)
-{
- struct map_session_data *sd=map_id2sd(account_id);
-
- if(sd==NULL)
- return 0;
- if(!guild_id) {
- clif_guild_created(sd,2); // 쬎¸”si“¯–¼ƒMƒ‹ƒh‘¶Ýj
- return 0;
- }
- //struct guild *g;
- sd->status.guild_id=guild_id;
- sd->state.guild_sent=0;
- clif_guild_created(sd,0);
- if(battle_config.guild_emperium_check)
- pc_delitem(sd,pc_search_inventory(sd,714),1,0); // ƒGƒ“ƒyƒŠƒEƒ€Á–Õ
- return 0;
-}
-
-// î•ñ—v‹
-int guild_request_info(int guild_id)
-{
-// if(battle_config.etc_log)
-// printf("guild_request_info\n");
- return intif_guild_request_info(guild_id);
-}
-// ƒCƒxƒ“ƒg•t‚«î•ñ—v‹
-int guild_npc_request_info(int guild_id,const char *event)
-{
- struct eventlist *ev;
-
- if( guild_search(guild_id) ){
- if(event && *event)
- npc_event_do(event);
- return 0;
- }
-
- if(event==NULL || *event==0)
- return guild_request_info(guild_id);
-
- ev=(struct eventlist *)aCalloc(sizeof(struct eventlist),1);
- memcpy(ev->name,event,strlen(event));
- //The one in the db becomes the next event from this.
- ev->next=idb_put(guild_infoevent_db,guild_id,ev);
- return guild_request_info(guild_id);
-}
-
-// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
-int guild_check_member(struct guild *g)
-{
- int i, j, users;
- struct map_session_data *sd, **all_sd;
-
- nullpo_retr(0, g);
-
- all_sd = map_getallusers(&users);
-
- for(i=0;i<users;i++){
- sd=all_sd[i];
- if(sd->status.guild_id==g->guild_id){
- j=guild_getindex(g,sd->status.account_id,sd->status.char_id);
- if (j < 0) {
- sd->status.guild_id=0;
- sd->state.guild_sent=0;
- sd->guild_emblem_id=0;
- if(battle_config.error_log)
- ShowWarning("guild: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
- }
- }
- }
- return 0;
-}
-// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
-int guild_recv_noinfo(int guild_id)
-{
- int i, users;
- struct map_session_data *sd, **all_sd;
-
- all_sd = map_getallusers(&users);
-
- for(i=0;i<users;i++){
- if((sd=all_sd[i])){
- if(sd->status.guild_id==guild_id)
- sd->status.guild_id=0;
- }
- }
- return 0;
-}
-// î•ñŠ“¾
-int guild_recv_info(struct guild *sg)
-{
- struct guild *g,before;
- int i,bm,m;
- struct eventlist *ev,*ev2;
-
- nullpo_retr(0, sg);
-
- if((g=idb_get(guild_db,sg->guild_id))==NULL){
- struct map_session_data *sd;
- g=(struct guild *)aCalloc(1,sizeof(struct guild));
- idb_put(guild_db,sg->guild_id,g);
- before=*sg;
-
- // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
- guild_check_member(sg);
- //If the guild master is online the first time the guild_info is received, that means he was the first to join,
- //and as such, his guild skills should be blocked to avoid login/logout abuse [Skotlex]
- if ((sd = map_nick2sd(sg->master)) != NULL)
- {
- guild_block_skill(sd, 300000);
- //Also set the guild master flag.
- sd->state.gmaster_flag = g;
- clif_charnameupdate(sd); // [LuzZza]
- }
- }else
- before=*g;
- memcpy(g,sg,sizeof(struct guild));
-
- if(g->max_member > MAX_GUILD)
- {
- if (battle_config.error_log)
- ShowError("guild_recv_info: Received guild with %d members, but MAX_GUILD is only %d. Extra guild-members have been lost!\n", g->max_member, MAX_GUILD);
- g->max_member = MAX_GUILD;
- }
-
- for(i=bm=m=0;i<g->max_member;i++){ // sd‚ÌÝ’è‚Æl”‚ÌŠm”F
- if(g->member[i].account_id>0){
- struct map_session_data *sd = map_id2sd(g->member[i].account_id);
- if (sd && sd->status.char_id == g->member[i].char_id &&
- sd->status.guild_id == g->guild_id &&
- !sd->state.waitingdisconnect) {
- g->member[i].sd = sd;
- clif_charnameupdate(sd); // [LuzZza]
- } else g->member[i].sd = NULL;
- m++;
- }else
- g->member[i].sd=NULL;
- if(before.member[i].account_id>0)
- bm++;
- }
-
- for(i=0;i<g->max_member;i++){ // î•ñ‚Ì‘—M
- struct map_session_data *sd = g->member[i].sd;
- if( sd==NULL )
- continue;
-
- if( before.guild_lv!=g->guild_lv || bm!=m ||
- before.max_member!=g->max_member ){
- clif_guild_basicinfo(sd); // Šî–{î•ñ‘—M
- clif_guild_emblem(sd,g); // ƒGƒ“ƒuƒŒƒ€‘—M
- }
-
- if(bm!=m){ // ƒƒ“ƒo[î•ñ‘—M
- clif_guild_memberlist(g->member[i].sd);
- }
-
- if( before.skill_point!=g->skill_point)
- clif_guild_skillinfo(sd); // ƒXƒLƒ‹î•ñ‘—M
-
- if( sd->state.guild_sent==0){ // –¢‘—M‚Ȃ犑®î•ñ‚à‘—‚é
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
- sd->guild_emblem_id=g->emblem_id;
- sd->state.guild_sent=1;
- }
- }
-
- // ƒCƒxƒ“ƒg‚Ì”­¶
- if( (ev=idb_remove(guild_infoevent_db,sg->guild_id))!=NULL ){
- while(ev){
- npc_event_do(ev->name);
- ev2=ev->next;
- aFree(ev);
- ev=ev2;
- }
- }
-
- return 0;
-}
-
-
-// ƒMƒ‹ƒh‚Ö‚ÌŠ©—U
-int guild_invite(struct map_session_data *sd,struct map_session_data *tsd)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g=guild_search(sd->status.guild_id);
-
- if(tsd==NULL || g==NULL)
- return 0;
-
- if(!battle_config.invite_request_check) {
- if (tsd->party_invite>0 || tsd->trade_partner) { // ‘ŠŽè‚ªŽæˆø’†‚©‚Ç‚¤‚©
- clif_guild_inviteack(sd,0);
- return 0;
- }
- }
- if(tsd->status.guild_id>0 ||
- tsd->guild_invite>0 ||
- map[tsd->bl.m].flag.gvg_castle)
- { //Can't invite people inside castles. [Skotlex]
- clif_guild_inviteack(sd,0);
- return 0;
- }
-
- // ’èˆõŠm”F
- for(i=0;i<g->max_member;i++)
- if(g->member[i].account_id==0)
- break;
- if(i==g->max_member){
- clif_guild_inviteack(sd,3);
- return 0;
- }
-
- tsd->guild_invite=sd->status.guild_id;
- tsd->guild_invite_account=sd->status.account_id;
-
- clif_guild_invite(tsd,g);
- return 0;
-}
-// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
-int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr(0, sd);
-
- //nullpo_retr(0, tsd= map_id2sd( sd->guild_invite_account ));
- //I checked the code, and there's no "check" for the case where the guy
- //that invites another to a guild quits the map-server before being replied.
- //Hence that's a valid null pointer scenario. :) [Skotlex]
- if ((tsd= map_id2sd( sd->guild_invite_account )) == NULL)
- { //Do we send a "invitation failed" msg or something to the player?
- //Or should we accept the invitation and add it to the guild anyway?
- //afterall, guild_invite holds the guild id that the player was invited to.
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- return 0;
- }
-
- if(sd->guild_invite!=guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
- return 0;
-
- if(flag==1){ // ³‘ø
- struct guild_member m;
- struct guild *g;
- int i;
-
- // ’èˆõŠm”F
- if( (g=guild_search(tsd->status.guild_id))==NULL ){
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- return 0;
- }
- for(i=0;i<g->max_member;i++)
- if(g->member[i].account_id==0)
- break;
- if(i==g->max_member){
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- clif_guild_inviteack(tsd,3);
- return 0;
- }
-
-
- //interŽI‚֒ljÁ—v‹
- guild_makemember(&m,sd);
- intif_guild_addmember( sd->guild_invite, &m );
- return 0;
- }else{ // ‹‘”Û
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- clif_guild_inviteack(tsd,1);
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚ª’ljÁ‚³‚ꂽ
-int guild_member_added(int guild_id,int account_id,int char_id,int flag)
-{
- struct map_session_data *sd= map_id2sd(account_id),*sd2;
- struct guild *g;
-
- if( (g=guild_search(guild_id))==NULL )
- return 0;
-
- if(sd==NULL || sd->guild_invite==0){
- // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
- if (flag == 0) {
- if(battle_config.error_log)
- ShowError("guild: member added error %d is not online\n",account_id);
- intif_guild_leave(guild_id,account_id,char_id,0,"**“o˜^Ž¸”s**");
- }
- return 0;
- }
- sd2 = map_id2sd(sd->guild_invite_account);
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
-
- if(flag==1){ // Ž¸”s
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,3);
- return 0;
- }
-
- // ¬Œ÷
- sd->state.guild_sent=0;
- sd->status.guild_id=guild_id;
-
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,2);
-
- // ‚¢‚¿‚¨‚¤‹£‡Šm”F
- guild_check_conflict(sd);
- //Next line commented because it do nothing, look at guild_recv_info [LuzZza]
- //clif_charnameupdate(sd); //Update display name [Skotlex]
- return 0;
-}
-
-// ƒMƒ‹ƒh’E‘Þ—v‹
-int guild_leave(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g = guild_search(sd->status.guild_id);
-
- if(g==NULL)
- return 0;
-
- if( sd->status.account_id!=account_id ||
- sd->status.char_id!=char_id || sd->status.guild_id!=guild_id ||
- map[sd->bl.m].flag.gvg_castle) //Can't leave inside guild castles.
- return 0;
-
- for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
- if( g->member[i].account_id==sd->status.account_id &&
- g->member[i].char_id==sd->status.char_id ){
- intif_guild_leave(g->guild_id,sd->status.account_id,sd->status.char_id,0,mes);
- return 0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒh’Ç•ú—v‹
-int guild_expulsion(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes)
-{
- struct guild *g;
- int i,ps;
-
- nullpo_retr(0, sd);
-
- g = guild_search(sd->status.guild_id);
-
- if(g==NULL)
- return 0;
-
- if(sd->status.guild_id!=guild_id || map[sd->bl.m].flag.gvg_castle) //Can't leave inside guild castles.
- return 0;
-
- if( (ps=guild_getposition(sd,g))<0 || !(g->position[ps].mode&0x0010) )
- return 0; // ˆ”±Œ ŒÀ–³‚µ
-
- for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id ){
- intif_guild_leave(g->guild_id,account_id,char_id,1,mes);
- //It's wrong way, member info will erased later
- //see guild_member_leaved [LuzZza]
- //malloc_set(&g->member[i],0,sizeof(struct guild_member));
- return 0;
- }
- }
- return 0;
-}
-
-int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes) // rewrote [LuzZza]
-{
- int i;
- struct guild *g = guild_search(guild_id);
- struct map_session_data *sd = map_charid2sd(char_id);
- struct map_session_data *online_member_sd;
-
- if(g == NULL)
- return 0;
-
- for(i=0;i<g->max_member;i++) {
- if( g->member[i].account_id == account_id &&
- g->member[i].char_id == char_id ){
-
- if((online_member_sd = guild_getavailablesd(g)) == NULL)
- return 0;
-
- if(!flag)
- clif_guild_leave(online_member_sd, name, mes);
- else
- clif_guild_expulsion(online_member_sd, name, mes, account_id);
-
- malloc_set(&g->member[i],0,sizeof(struct guild_member));
- clif_guild_memberlist(online_member_sd);
-
- if(sd != NULL && sd->status.guild_id == guild_id) {
- if (sd->state.storage_flag == 2) //Close the guild storage.
- storage_guild_storageclose(sd);
- sd->status.guild_id=0;
- sd->guild_emblem_id=0;
- sd->state.guild_sent=0;
-
- guild_send_dot_remove(sd);
- clif_charnameupdate(sd); //Update display name [Skotlex]
- }
- return 0;
- }
-
- }
-
- return 0;
-}
-
-int guild_send_memberinfoshort(struct map_session_data *sd,int online)
-{ // cleaned up [LuzZza]
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- if(!(g = guild_search(sd->status.guild_id)))
- return 0;
-
- //Moved to place before intif_guild_memberinfoshort because
- //If it's not a member, needn't send it's info to intif. [LuzZza]
- guild_check_member(g);
-
- if(sd->status.guild_id <= 0)
- return 0;
-
- intif_guild_memberinfoshort(g->guild_id,
- sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_);
-
- if(!online){
- int i=guild_getindex(g,sd->status.account_id,sd->status.char_id);
- if(i>=0)
- g->member[i].sd=NULL;
- return 0;
- }
-
- if(sd->state.guild_sent)
- return 0;
-
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
-
- sd->state.guild_sent = 1;
- sd->guild_emblem_id = g->emblem_id;
-
- return 0;
-}
-
-int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_)
-{ // cleaned up [LuzZza]
-
- int i,alv,c,idx=-1,om=0,oldonline=-1;
- struct guild *g = guild_search(guild_id);
-
- if(g == NULL)
- return 0;
-
- for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){
- struct guild_member *m=&g->member[i];
- if(m->account_id==account_id && m->char_id==char_id ){
- oldonline=m->online;
- m->online=online;
- m->lv=lv;
- m->class_=class_;
- idx=i;
- }
- if(m->account_id>0){
- alv+=m->lv;
- c++;
- }
- if(m->online)
- om++;
- }
-
- if(idx == -1 || c == 0) {
- // ƒMƒ‹ƒh‚̃ƒ“ƒo[ŠO‚È‚Ì‚Å’Ç•úˆµ‚¢‚·‚é
- struct map_session_data *sd = map_id2sd(account_id);
- if(sd && sd->status.char_id == char_id) {
- sd->status.guild_id=0;
- sd->guild_emblem_id=0;
- sd->state.guild_sent=0;
- }
- if(battle_config.error_log)
- ShowWarning("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name);
- return 0;
- }
-
- g->average_lv=alv/c;
- g->connect_member=om;
-
- for(i=0;i<g->max_member;i++) {
- struct map_session_data *sd= map_id2sd(g->member[i].account_id);
- g->member[i].sd = (sd && sd->status.char_id == g->member[i].char_id &&
- sd->status.guild_id == g->guild_id && !sd->state.waitingdisconnect) ? sd : NULL;
- }
-
- if(oldonline!=online)
- clif_guild_memberlogin_notice(g, idx, online);
-
-
- if(!g->member[idx].sd)
- return 0;
-
- //Send XY dot updates. [Skotlex]
- //Moved from guild_send_memberinfoshort [LuzZza]
- for(i=0; i < g->max_member; i++) {
-
- if(!g->member[i].sd || i == idx ||
- g->member[i].sd->bl.m != g->member[idx].sd->bl.m)
- continue;
-
- clif_guild_xy_single(g->member[idx].sd->fd, g->member[i].sd);
- }
-
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜b‘—M
-int guild_send_message(struct map_session_data *sd,char *mes,int len)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0)
- return 0;
- intif_guild_message(sd->status.guild_id,sd->status.account_id,mes,len);
- guild_recv_message(sd->status.guild_id,sd->status.account_id,mes,len);
-
- //Chatlogging type 'G'
- if(log_config.chat&1 //we log everything then
- || ( log_config.chat&8 //if Guild bit is on
- && ( !agit_flag || !(log_config.chat&16) ))) //if WOE ONLY flag is off or AGIT is OFF
- log_chat("G", sd->status.guild_id, sd->status.char_id, sd->status.account_id, (char*)mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes);
-
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜bŽóM
-int guild_recv_message(int guild_id,int account_id,char *mes,int len)
-{
- struct guild *g;
- if( (g=guild_search(guild_id))==NULL)
- return 0;
- clif_guild_message(g,account_id,mes,len);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX
-int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx)
-{
- return intif_guild_change_memberinfo(
- guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx));
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX’Ê’m
-int guild_memberposition_changed(struct guild *g,int idx,int pos)
-{
- nullpo_retr(0, g);
-
- g->member[idx].position=pos;
- clif_guild_memberpositionchanged(g,idx);
-
- // Update char position in client [LuzZza]
- if(g->member[idx].sd != NULL)
- clif_charnameupdate(g->member[idx].sd);
- return 0;
-}
-// ƒMƒ‹ƒh–ðE•ÏX
-int guild_change_position(struct map_session_data *sd,int idx,
- int mode,int exp_mode,const char *name)
-{
- struct guild_position p;
-
- nullpo_retr(0, sd);
-
- if(exp_mode>battle_config.guild_exp_limit)
- exp_mode=battle_config.guild_exp_limit;
- if(exp_mode<0)exp_mode=0;
- p.mode=mode;
- p.exp_mode=exp_mode;
- memcpy(p.name,name,NAME_LENGTH-1);
- p.name[NAME_LENGTH-1] = '\0'; //Security check... [Skotlex]
- return intif_guild_position(sd->status.guild_id,idx,&p);
-}
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int guild_position_changed(int guild_id,int idx,struct guild_position *p)
-{
- struct guild *g=guild_search(guild_id);
- int i;
- if(g==NULL)
- return 0;
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- clif_guild_positionchanged(g,idx);
-
- // Update char name in client [LuzZza]
- for(i=0;i<g->max_member;i++)
- if(g->member[i].position == idx && g->member[i].sd != NULL)
- clif_charnameupdate(g->member[i].sd);
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX
-int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2)
-{
- nullpo_retr(0, sd);
-
- if(guild_id!=sd->status.guild_id)
- return 0;
- return intif_guild_notice(guild_id,mes1,mes2);
-}
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int guild_notice_changed(int guild_id,const char *mes1,const char *mes2)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
-
- memcpy(g->mes1,mes1,60);
- memcpy(g->mes2,mes2,120);
-
- for(i=0;i<g->max_member;i++){
- if((sd=g->member[i].sd)!=NULL)
- clif_guild_notice(sd,g);
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
-int guild_change_emblem(struct map_session_data *sd,int len,const char *data)
-{
- struct guild *g;
- nullpo_retr(0, sd);
-
- if (battle_config.require_glory_guild &&
- !((g = guild_search(sd->status.guild_id)) && guild_checkskill(g, GD_GLORYGUILD)>0)) {
- clif_skill_fail(sd,GD_GLORYGUILD,0,0);
- return 0;
- }
-
- return intif_guild_emblem(sd->status.guild_id,len,data);
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
-
- memcpy(g->emblem_data,data,len);
- g->emblem_len=len;
- g->emblem_id=emblem_id;
-
- for(i=0;i<g->max_member;i++){
- if((sd=g->member[i].sd)!=NULL){
- sd->guild_emblem_id=emblem_id;
- clif_guild_belonginfo(sd,g);
- clif_guild_emblem(sd,g);
- }
- }
- return 0;
-}
-
-static void* create_expcache(DBKey key, va_list args) {
- struct guild_expcache *c;
- struct map_session_data *sd = va_arg(args, struct map_session_data*);
-
- c = ers_alloc(expcache_ers, struct guild_expcache);
- c->guild_id = sd->status.guild_id;
- c->account_id = sd->status.account_id;
- c->char_id = sd->status.char_id;
- c->exp = 0;
- return c;
-}
-
-// ƒMƒ‹ƒh‚ÌEXPã”[
-unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
- int per;
-
- nullpo_retr(0, sd);
-
- if (!exp) return 0;
-
- if (sd->status.guild_id == 0 ||
- (g = guild_search(sd->status.guild_id)) == NULL ||
- (per = guild_getposition(sd,g)) < 0 ||
- (per = g->position[per].exp_mode) < 1)
- return 0;
-
-
- if (per < 100)
- exp = (unsigned int) exp * per / 100;
- //Otherwise tax everything.
-
- c = guild_expcache_db->ensure(guild_expcache_db, i2key(sd->status.char_id), create_expcache, sd);
-
- if (c->exp > UINT_MAX - exp)
- c->exp = UINT_MAX;
- else
- c->exp += exp;
-
- return exp;
-}
-
-// Celest
-int guild_getexp(struct map_session_data *sd,int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
- nullpo_retr(0, sd);
-
- if (sd->status.guild_id == 0 || (g = guild_search(sd->status.guild_id)) == NULL)
- return 0;
-
- c = guild_expcache_db->ensure(guild_expcache_db, i2key(sd->status.char_id), create_expcache, sd);
- if (c->exp > UINT_MAX - exp)
- c->exp = UINT_MAX;
- else
- c->exp += exp;
- return exp;
-}
-
-// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
-int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
-{
- struct guild *g;
- int idx = skill_num - GD_SKILLBASE;
-
- nullpo_retr(0, sd);
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
-
- return 0;
- if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL)
- return 0;
- if(strcmp(sd->status.name,g->master))
- return 0;
-
- if( (g->skill_point>0 || flag&1) &&
- g->skill[idx].id!=0 &&
- g->skill[idx].lv < guild_skill_get_max(skill_num) ){
- intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
- }
- return 0;
-}
-// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è’Ê’m
-int guild_skillupack(int guild_id,int skill_num,int account_id)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct guild *g=guild_search(guild_id);
- int i;
- if(g==NULL)
- return 0;
- if(sd!=NULL)
- clif_guild_skillup(sd,skill_num,g->skill[skill_num-GD_SKILLBASE].lv);
- // ‘Sˆõ‚É’Ê’m
- for(i=0;i<g->max_member;i++)
- if((sd=g->member[i].sd)!=NULL)
- clif_guild_skillinfo(sd);
- return 0;
-}
-
-// ƒMƒ‹ƒh“¯–¿”Š“¾
-int guild_get_alliance_count(struct guild *g,int flag)
-{
- int i,c;
-
- nullpo_retr(0, g);
-
- for(i=c=0;i<MAX_GUILDALLIANCE;i++){
- if( g->alliance[i].guild_id>0 &&
- g->alliance[i].opposition==flag )
- c++;
- }
- return c;
-}
-
-// Blocks all guild skills which have a common delay time.
-void guild_block_skill(struct map_session_data *sd, int time) {
- int skill_num[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL };
- int i;
- for (i = 0; i < 4; i++)
- skill_blockpc_start(sd, skill_num[i], time);
-}
-
-// “¯–¿ŠÖŒW‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-// “¯–¿‚È‚ç1A‚»‚êˆÈŠO‚Í0
-int guild_check_alliance(int guild_id1, int guild_id2, int flag)
-{
- struct guild *g;
- int i;
-
- g = guild_search(guild_id1);
- if (g == NULL)
- return 0;
-
- for (i=0; i<MAX_GUILDALLIANCE; i++)
- if ((g->alliance[i].guild_id == guild_id2) && (g->alliance[i].opposition == flag))
- return 1;
-
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿—v‹
-int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd)
-{
- struct guild *g[2];
- int i;
-
- if(agit_flag) { // Disable alliance creation during woe [Valaris]
- clif_displaymessage(sd->fd,"Alliances cannot be made during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
-
- nullpo_retr(0, sd);
-
- if(tsd==NULL || tsd->status.guild_id<=0)
- return 0;
-
- g[0]=guild_search(sd->status.guild_id);
- g[1]=guild_search(tsd->status.guild_id);
-
- if(g[0]==NULL || g[1]==NULL)
- return 0;
-
- // Prevent creation alliance with same guilds [LuzZza]
- if(sd->status.guild_id == tsd->status.guild_id)
- return 0;
-
- if( guild_get_alliance_count(g[0],0)>=3 ) {
- clif_guild_allianceack(sd,4);
- return 0;
- }
- if( guild_get_alliance_count(g[1],0)>=3 ) {
- clif_guild_allianceack(sd,3);
- return 0;
- }
-
- if( tsd->guild_alliance>0 ){
- clif_guild_allianceack(sd,1);
- return 0;
- }
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚É“¯–¿ó‘Ô‚©Šm”F
- if( g[0]->alliance[i].guild_id==tsd->status.guild_id &&
- g[0]->alliance[i].opposition==0){
- clif_guild_allianceack(sd,0);
- return 0;
- }
- }
-
- tsd->guild_alliance=sd->status.guild_id;
- tsd->guild_alliance_account=sd->status.account_id;
-
- clif_guild_reqalliance(tsd,sd->status.account_id,g[0]->name);
- return 0;
-}
-// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
-int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr(0, sd);
- tsd= map_id2sd( account_id );
- if (!tsd) { //Character left? Cancel alliance.
- clif_guild_allianceack(sd,3);
- return 0;
- }
-
- if(sd->guild_alliance!=tsd->status.guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
- return 0;
-
- if(flag==1){ // ³‘ø
- int i;
-
- struct guild *g,*tg; // “¯–¿”ÄŠm”F
- g=guild_search(sd->status.guild_id);
- tg=guild_search(tsd->status.guild_id);
-
- if(g==NULL || guild_get_alliance_count(g,0)>=3){
- clif_guild_allianceack(sd,4);
- clif_guild_allianceack(tsd,3);
- return 0;
- }
- if(tg==NULL || guild_get_alliance_count(tg,0)>=3){
- clif_guild_allianceack(sd,3);
- clif_guild_allianceack(tsd,4);
- return 0;
- }
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if(g->alliance[i].guild_id==tsd->status.guild_id &&
- g->alliance[i].opposition==1)
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,9 );
- }
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if(tg->alliance[i].guild_id==sd->status.guild_id &&
- tg->alliance[i].opposition==1)
- intif_guild_alliance( tsd->status.guild_id,sd->status.guild_id,
- tsd->status.account_id,sd->status.account_id,9 );
- }
-
- // interŽI‚Ö“¯–¿—v¿
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,0 );
- return 0;
- }else{ // ‹‘”Û
- sd->guild_alliance=0;
- sd->guild_alliance_account=0;
- if(tsd!=NULL)
- clif_guild_allianceack(tsd,3);
- }
- return 0;
-}
-// ƒMƒ‹ƒhŠÖŒW‰ðÁ
-int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
-{
- nullpo_retr(0, sd);
-
- if(agit_flag) { // Disable alliance breaking during woe [Valaris]
- clif_displaymessage(sd->fd,"Alliances cannot be broken during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
- intif_guild_alliance( sd->status.guild_id,guild_id,
- sd->status.account_id,0,flag|8 );
- return 0;
-}
-// ƒMƒ‹ƒh“G‘Î
-int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g=guild_search(sd->status.guild_id);
- if(g==NULL || tsd==NULL)
- return 0;
-
- // Prevent creation opposition with same guilds [LuzZza]
- if(sd->status.guild_id == tsd->status.guild_id)
- return 0;
-
- if( guild_get_alliance_count(g,1)>=3 ) {
- clif_guild_oppositionack(sd,1);
- return 0;
- }
-
- if(agit_flag) {
- clif_displaymessage(sd->fd,"You cannot make oppositions during Guild Wars!");
- return 0;
- }
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚ÉŠÖŒW‚ðŽ‚Á‚Ä‚¢‚é‚©Šm”F
- if(g->alliance[i].guild_id==tsd->status.guild_id){
- if(g->alliance[i].opposition==1){ // ‚·‚Å‚É“G‘Î
- clif_guild_oppositionack(sd,2);
- return 0;
- }
- //Change alliance to opposition.
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,8 );
- }
- }
-
- // interŽI‚É“G‘Ηv¿
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,1 );
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2)
-{
- struct guild *g[2];
- int guild_id[2];
- const char *guild_name[2];
- struct map_session_data *sd[2];
- int j,i;
-
- guild_id[0] = guild_id1;
- guild_id[1] = guild_id2;
- guild_name[0] = name1;
- guild_name[1] = name2;
- sd[0] = map_id2sd(account_id1);
- sd[1] = map_id2sd(account_id2);
-
- g[0]=guild_search(guild_id1);
- g[1]=guild_search(guild_id2);
-
- if(sd[0]!=NULL && (flag&0x0f)==0){
- sd[0]->guild_alliance=0;
- sd[0]->guild_alliance_account=0;
- }
-
- if(flag&0x70){ // Ž¸”s
- for(i=0;i<2-(flag&1);i++)
- if( sd[i]!=NULL )
- clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4);
- return 0;
- }
-// if(battle_config.etc_log)
-// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2);
-
- if(!(flag&0x08)){ // ŠÖŒW’ljÁ
- for(i=0;i<2-(flag&1);i++)
- if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if(g[i]->alliance[j].guild_id==0){
- g[i]->alliance[j].guild_id=guild_id[1-i];
- memcpy(g[i]->alliance[j].name,guild_name[1-i],NAME_LENGTH-1);
- g[i]->alliance[j].opposition=flag&1;
- break;
- }
- }else{ // ŠÖŒW‰ðÁ
- for(i=0;i<2-(flag&1);i++){
- if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if( g[i]->alliance[j].guild_id==guild_id[1-i] &&
- g[i]->alliance[j].opposition==(flag&1)){
- g[i]->alliance[j].guild_id=0;
- break;
- }
- if( sd[i]!=NULL ) // ‰ðÁ’Ê’m
- clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
- }
- }
-
- if((flag&0x0f)==0){ // “¯–¿’Ê’m
- if( sd[1]!=NULL )
- clif_guild_allianceack(sd[1],2);
- }else if((flag&0x0f)==1){ // “G‘Î’Ê’m
- if( sd[0]!=NULL )
- clif_guild_oppositionack(sd[0],0);
- }
-
-
- for(i=0;i<2-(flag&1);i++){ // “¯–¿/“G‘΃ŠƒXƒg‚ÌÄ‘—M
- struct map_session_data *sd;
- if(g[i]!=NULL)
- for(j=0;j<g[i]->max_member;j++)
- if((sd=g[i]->member[j].sd)!=NULL)
- clif_guild_allianceinfo(sd);
- }
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m—p
-int guild_broken_sub(DBKey key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data;
- int guild_id=va_arg(ap,int);
- int i,j;
- struct map_session_data *sd=NULL;
-
- nullpo_retr(0, g);
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ŠÖŒW‚ð”jŠü
- if(g->alliance[i].guild_id==guild_id){
- for(j=0;j<g->max_member;j++)
- if( (sd=g->member[j].sd)!=NULL )
- clif_guild_delalliance(sd,guild_id,g->alliance[i].opposition);
- intif_guild_alliance(g->guild_id, guild_id,0,0,g->alliance[i].opposition|8);
- g->alliance[i].guild_id=0;
- }
- }
- return 0;
-}
-
-//Invoked on Castles when a guild is broken. [Skotlex]
-int castle_guild_broken_sub(DBKey key,void *data,va_list ap)
-{
- struct guild_castle *gc=(struct guild_castle *)data;
- int guild_id=va_arg(ap,int);
-
- nullpo_retr(0, gc);
-
- if (gc->guild_id == guild_id)
- { //Save the new 'owner', this should invoke guardian clean up and other such things.
- gc->guild_id = 0;
- guild_castledatasave(gc->castle_id, 1, 0);
- }
- return 0;
-}
-
-//Innvoked on /breakguild "Guild name"
-int guild_broken(int guild_id,int flag)
-{
- struct guild *g=guild_search(guild_id);
-// struct guild_castle *gc=NULL;
- struct map_session_data *sd;
- int i;
-// char *name;;
-
- if(flag!=0 || g==NULL)
- return 0;
-
- //we call castle_event::OnGuildBreak of all castlesof the guild
- //you can set all castle_events in the castle_db.txt
-/* name=(char *)aCalloc(50,sizeof(char)); //24 char = event name, + space for "::OnGuildBreak"
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(gc->guild_id == guild_id){
- memcpy(name,gc->castle_event,50);
- npc_event_do(strcat(name,"::OnGuildBreak"));
- }
- }
- }
- free(name);
-*/
- for(i=0;i<g->max_member;i++){ // ƒMƒ‹ƒh‰ðŽU‚ð’Ê’m
- if((sd=g->member[i].sd)!=NULL){
- if(sd->state.storage_flag == 2)
- storage_guild_storage_quit(sd,1);
- sd->status.guild_id=0;
- sd->state.guild_sent=0;
- clif_guild_broken(g->member[i].sd,0);
- clif_charnameupdate(sd); // [LuzZza]
- }
- }
-
- guild_db->foreach(guild_db,guild_broken_sub,guild_id);
- castle_db->foreach(castle_db,castle_guild_broken_sub,guild_id);
- if (guild_cache && guild_cache->guild_id == guild_id)
- guild_cache = NULL;
- guild_storage_delete(guild_id);
- idb_remove(guild_db,guild_id);
- return 0;
-}
-
-//Changes the Guild Master to the specified player. [Skotlex]
-int guild_gm_change(int guild_id, struct map_session_data *sd)
-{
- struct guild *g;
- nullpo_retr(0, sd);
-
- if (sd->status.guild_id != guild_id)
- return 0;
-
- g=guild_search(guild_id);
-
- nullpo_retr(0, g);
-
- if (strcmp(g->master, sd->status.name) == 0) //Nothing to change.
- return 0;
-
- //Notify servers that master has changed.
- intif_guild_change_gm(guild_id, sd->status.name, strlen(sd->status.name));
- return 1;
-}
-
-//Notification from Char server that a guild's master has changed. [Skotlex]
-int guild_gm_changed(int guild_id, int pos)
-{
- struct guild *g;
- struct guild_member gm;
-
- g=guild_search(guild_id);
-
- if (!g || pos < 0 || pos > g->max_member)
- return 0;
-
- memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
- memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
- memcpy(&g->member[0], &gm, sizeof(struct guild_member));
-
- g->member[pos].position = g->member[0].position;
- g->member[0].position = 0; //Position 0: guild Master.
- strcpy(g->master, g->member[0].name);
-
- if (g->member[pos].sd && g->member[pos].sd->fd)
- {
- clif_displaymessage(g->member[pos].sd->fd, "You no longer are the Guild Master.");
- g->member[pos].sd->state.gmaster_flag = 0;
- }
-
- if (g->member[0].sd && g->member[0].sd->fd)
- {
- clif_displaymessage(g->member[0].sd->fd, "You have become the Guild Master!");
- g->member[0].sd->state.gmaster_flag = g;
- //Block his skills for 5 minutes to prevent abuse.
- guild_block_skill(g->member[0].sd, 300000);
- }
- return 1;
-}
-
-// ƒMƒ‹ƒh‰ðŽU
-int guild_break(struct map_session_data *sd,char *name)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (g=guild_search(sd->status.guild_id))==NULL )
- return 0;
- if(strcmp(g->name,name)!=0)
- return 0;
- if(strcmp(sd->status.name,g->master)!=0)
- return 0;
- for(i=0;i<g->max_member;i++){
- if( g->member[i].account_id>0 && (
- g->member[i].account_id!=sd->status.account_id ||
- g->member[i].char_id!=sd->status.char_id ))
- break;
- }
- if(i<g->max_member){
- clif_guild_broken(sd,2);
- return 0;
- }
-
- intif_guild_break(g->guild_id);
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹
-int guild_castledataload(int castle_id,int index)
-{
- return intif_guild_castle_dataload(castle_id,index);
-}
-// ƒMƒ‹ƒhéî•ñŠ“¾ŽžƒCƒxƒ“ƒg’ljÁ
-int guild_addcastleinfoevent(int castle_id,int index,const char *name)
-{
- struct eventlist *ev;
- int code=castle_id|(index<<16);
-
- if( name==NULL || *name==0 )
- return 0;
-
- ev=(struct eventlist *)aMalloc(sizeof(struct eventlist));
- memcpy(ev->name,name,sizeof(ev->name));
- //The next event becomes whatever was currently stored.
- ev->next= idb_put(guild_castleinfoevent_db,code,ev);
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
-int guild_castledataloadack(int castle_id,int index,int value)
-{
- struct guild_castle *gc=guild_castle_search(castle_id);
- int code=castle_id|(index<<16);
- struct eventlist *ev,*ev2;
-
- if(gc==NULL){
- return 0;
- }
- switch(index){
- case 1:
- gc->guild_id = value;
- if (value && guild_search(value)==NULL) //Request guild data which will be required for spawned guardians. [Skotlex]
- guild_request_info(value);
- break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- gc->guardian[index-10].visible = value; break;
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- gc->guardian[index-18].hp = value; break;
- default:
- ShowError("guild_castledataloadack ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- if( (ev=idb_remove(guild_castleinfoevent_db,code))!=NULL ){
- while(ev){
- npc_event_do(ev->name);
- ev2=ev->next;
- aFree(ev);
- ev=ev2;
- }
- }
- return 1;
-}
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX—v‹
-int guild_castledatasave(int castle_id,int index,int value)
-{
- if (index == 1)
- { //The castle's owner has changed? Update Guardian ownership, too. [Skotlex]
- struct guild_castle *gc = guild_castle_search(castle_id);
- int m = -1;
- if (gc) m = map_mapname2mapid(gc->map_name);
- if (m != -1)
- map_foreachinmap(mob_guardian_guildchange, m, BL_MOB);
- }
- return intif_guild_castle_datasave(castle_id,index,value);
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
-int guild_castledatasaveack(int castle_id,int index,int value)
-{
- struct guild_castle *gc=guild_castle_search(castle_id);
- if(gc==NULL){
- return 0;
- }
- switch(index){
- case 1: gc->guild_id = value; break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- gc->guardian[index-10].visible = value; break;
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- gc->guardian[index-18].hp = value; break;
- default:
- ShowError("guild_castledatasaveack ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- return 1;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^ˆêŠ‡ŽóMi‰Šú‰»Žžj
-int guild_castlealldataload(int len,struct guild_castle *gc)
-{
- int i;
- int n = (len-4) / sizeof(struct guild_castle), ev = -1;
-
- nullpo_retr(0, gc);
-
- //Last owned castle in the list invokes ::OnAgitinit
- for(i = 0; i < n; i++) {
- if ((gc + i)->guild_id)
- ev = i;
- }
-
- // éƒf[ƒ^Ši”[‚ƃMƒ‹ƒhî•ñ—v‹
- for(i = 0; i < n; i++, gc++) {
- struct guild_castle *c = guild_castle_search(gc->castle_id);
- if (!c) {
- ShowError("guild_castlealldataload Castle id=%d not found.\n", gc->castle_id);
- continue;
- }
- memcpy(&c->guild_id,&gc->guild_id,
- sizeof(struct guild_castle) - ((int)&c->guild_id - (int)c) );
- if( c->guild_id ){
- if(i!=ev)
- guild_request_info(c->guild_id);
- else
- guild_npc_request_info(c->guild_id, "::OnAgitInit");
- }
- }
- if (ev == -1) //No castles owned, invoke OnAgitInit as it is.
- npc_event_doall("OnAgitInit");
- return 0;
-}
-
-int guild_agit_start(void)
-{ // Run All NPC_Event[OnAgitStart]
- int c = npc_event_doall("OnAgitStart");
- ShowStatus("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c);
- // Start auto saving
- guild_save_timer = add_timer_interval (gettick() + GUILD_SAVE_INTERVAL, guild_save_sub, 0, 0, GUILD_SAVE_INTERVAL);
- return 0;
-}
-
-int guild_agit_end(void)
-{ // Run All NPC_Event[OnAgitEnd]
- int c = npc_event_doall("OnAgitEnd");
- ShowStatus("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c);
- // Stop auto saving
- delete_timer (guild_save_timer, guild_save_sub);
- return 0;
-}
-
-int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
-{ // Run One NPC_Event[OnAgitEliminate]
- char *name = (char*)data;
- size_t len = (name) ? strlen(name) : 0;
- // the rest is dangerous, but let it crash,
- // if this happens, it's ruined anyway
- int c=0;
-
- if(agit_flag) // Agit not already End
- {
- char *evname=(char*)aMalloc( (len + 10) * sizeof(char));
- memcpy(evname,name,len - 5);
- strcpy(evname + len - 5,"Eliminate");
- c = npc_event_do(evname);
- ShowStatus("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
- aFree(evname); // [Lance] Should fix this
- }
- if(name) aFree(name);
- return 0;
-}
-
-static int Ghp[MAX_GUILDCASTLE][MAX_GUARDIANS]; // so save only if HP are changed // experimental code [Yor]
-static int Gid[MAX_GUILDCASTLE];
-int guild_save_sub(int tid,unsigned int tick,int id,int data)
-{
- struct guild_castle *gc;
- int i,j;
-
- for(i = 0; i < MAX_GUILDCASTLE; i++) { // [Yor]
- gc = guild_castle_search(i);
- if (!gc) continue;
- if (gc->guild_id != Gid[i]) {
- // Re-save guild id if its owner guild has changed
- guild_castledatasave(gc->castle_id, 1, gc->guild_id);
- Gid[i] = gc->guild_id;
- }
- for (j = 0; j < MAX_GUARDIANS; j++)
- {
- if (gc->guardian[j].visible && Ghp[i][j] != gc->guardian[j].hp)
- guild_castledatasave(gc->castle_id, 18+j, gc->guardian[j].hp);
- }
- }
-
- return 0;
-}
-
-int guild_agit_break(struct mob_data *md)
-{ // Run One NPC_Event[OnAgitBreak]
- char *evname;
-
- nullpo_retr(0, md);
-
- evname=(char *)aMallocA((strlen(md->npc_event) + 1)*sizeof(char));
-
- strcpy(evname,md->npc_event);
-// Now By User to Run [OnAgitBreak] NPC Event...
-// It's a little impossible to null point with player disconnect in this!
-// But Script will be stop, so nothing...
-// Maybe will be changed in the futher..
-// int c = npc_event_do(evname);
- if(!agit_flag) return 0; // Agit already End
- add_timer(gettick()+battle_config.gvg_eliminate_time,guild_gvg_eliminate_timer,md->bl.m,(int)evname);
- return 0;
-}
-
-// [MouseJstr]
-// How many castles does this guild have?
-int guild_checkcastles(struct guild *g) {
- int i,nb_cas=0, id,cas_id=0;
- struct guild_castle *gc;
- id=g->guild_id;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- cas_id=gc->guild_id;
- if(g->guild_id==cas_id)
- nb_cas=nb_cas+1;
- } //end for
- return nb_cas;
-}
-
-// [MouseJstr]
-// is this guild allied with this castle?
-int guild_isallied(struct guild *g, struct guild_castle *gc)
-{
- int i;
-
- nullpo_retr(0, g);
-
- if(g->guild_id == gc->guild_id)
- return 1;
-
- if (gc->guild_id == 0)
- return 0;
-
-
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- if(g->alliance[i].guild_id == gc->guild_id) {
- if(g->alliance[i].opposition == 0)
- return 1;
- else
- return 0;
- }
-
- return 0;
-}
-
-int guild_idisallied(int guild_id, int guild_id2)
-{
- int i;
- struct guild *g;
-
- if (guild_id <= 0 || guild_id2 <= 0)
- return 0;
-
- if(guild_id == guild_id2)
- return 1;
-
- g = guild_search(guild_id);
-
- nullpo_retr(0, g);
-
-
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- if(g->alliance[i].guild_id == guild_id2) {
- if(g->alliance[i].opposition == 0)
- return 1;
- else
- return 0;
- }
-
- return 0;
-}
-
-static int guild_infoevent_db_final(DBKey key,void *data,va_list ap)
-{
- aFree(data);
- return 0;
-}
-
-static int guild_expcache_db_final(DBKey key,void *data,va_list ap)
-{
- ers_free(expcache_ers, data);
- return 0;
-}
-
-void do_final_guild(void)
-{
- guild_db->destroy(guild_db,NULL);
- castle_db->destroy(castle_db,NULL);
- guild_expcache_db->destroy(guild_expcache_db,guild_expcache_db_final);
- guild_infoevent_db->destroy(guild_infoevent_db,guild_infoevent_db_final);
- guild_castleinfoevent_db->destroy(guild_castleinfoevent_db,guild_infoevent_db_final);
- ers_destroy(expcache_ers);
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+#include "../common/ers.h"
+
+#include "map.h"
+#include "guild.h"
+#include "storage.h"
+#include "battle.h"
+#include "npc.h"
+#include "pc.h"
+#include "status.h"
+#include "mob.h"
+#include "intif.h"
+#include "clif.h"
+#include "skill.h"
+#include "log.h"
+
+static struct guild* guild_cache; //For fast retrieval of the same guild over and over. [Skotlex]
+static struct dbt *guild_db;
+static struct dbt *castle_db;
+static struct dbt *guild_expcache_db;
+static struct dbt *guild_infoevent_db;
+static struct dbt *guild_castleinfoevent_db;
+
+struct eventlist {
+ char name[50];
+ struct eventlist *next;
+};
+
+// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚̃tƒ‰ƒbƒVƒ…‚ÉŠÖ˜A‚·‚é’è”
+#define GUILD_SEND_XY_INVERVAL 5000 // À•W‚â‚g‚o‘—M‚ÌŠÔŠu
+#define GUILD_PAYEXP_INVERVAL 10000 // ŠÔŠu(ƒLƒƒƒbƒVƒ…‚Ìő嶑¶ŽžŠÔAƒ~ƒŠ•b)
+#define GUILD_PAYEXP_LIST 8192 // ƒLƒƒƒbƒVƒ…‚ÌÅ‘å”
+
+// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…
+struct guild_expcache {
+ int guild_id, account_id, char_id;
+ unsigned int exp;
+};
+static struct eri *expcache_ers; //For handling of guild exp payment.
+
+struct{
+ int id;
+ int max;
+ struct{
+ short id;
+ short lv;
+ }need[6];
+} guild_skill_tree[MAX_GUILDSKILL];
+
+// timer for auto saving guild data during WoE
+#define GUILD_SAVE_INTERVAL 300000
+int guild_save_timer = -1;
+
+int guild_payexp_timer(int tid,unsigned int tick,int id,int data);
+int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data);
+int guild_save_sub(int tid,unsigned int tick,int id,int data);
+static int guild_send_xy_timer(int tid,unsigned int tick,int id,int data);
+
+ // Modified [Komurka]
+int guild_skill_get_max (int id)
+{
+ if (id < GD_SKILLBASE || id > GD_SKILLBASE+MAX_GUILDSKILL)
+ return 0;
+ return guild_skill_tree[id-GD_SKILLBASE].max;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
+int guild_checkskill(struct guild *g,int id)
+{
+ int idx = id-GD_SKILLBASE;
+ if (idx < 0 || idx >= MAX_GUILDSKILL)
+ return 0;
+ return g->skill[idx].lv;
+}
+
+/*==========================================
+ * guild_skill_tree.txt reading - from jA [Komurka]
+ *------------------------------------------
+ */
+int guild_read_guildskill_tree_db(void)
+{
+ int i,k,id=0,ln=0;
+ FILE *fp;
+ char line[1024],*p;
+
+ malloc_set(guild_skill_tree,0,sizeof(guild_skill_tree));
+ sprintf(line, "%s/guild_skill_tree.txt", db_path);
+ if( (fp=fopen(line,"r"))==NULL){
+ ShowError("can't read %s\n", line);
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ char *split[50];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(i=0,p=line;i<12 && p;i++){
+ split[i]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(i<12)
+ continue;
+ id = atoi(split[0]) - GD_SKILLBASE;
+ if(id<0 || id>=MAX_GUILDSKILL)
+ continue;
+ guild_skill_tree[id].id=atoi(split[0]);
+ guild_skill_tree[id].max=atoi(split[1]);
+ if (guild_skill_tree[id].id==GD_GLORYGUILD && battle_config.require_glory_guild && guild_skill_tree[id].max==0) guild_skill_tree[id].max=1;
+ for(k=0;k<5;k++){
+ guild_skill_tree[id].need[k].id=atoi(split[k*2+2]);
+ guild_skill_tree[id].need[k].lv=atoi(split[k*2+3]);
+ }
+ ln++;
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"guild_skill_tree.txt");
+
+ return 0;
+}
+
+/*==========================================
+ * Guild skill check - from jA [Komurka]
+ *------------------------------------------
+ */
+int guild_check_skill_require(struct guild *g,int id)
+{
+ int i;
+ int idx = id-GD_SKILLBASE;
+
+ if(g == NULL)
+ return 0;
+
+ if (idx < 0 || idx >= MAX_GUILDSKILL)
+ return 0;
+
+ for(i=0;i<5;i++)
+ {
+ if(guild_skill_tree[idx].need[i].id == 0) break;
+ if(guild_skill_tree[idx].need[i].lv > guild_checkskill(g,guild_skill_tree[idx].need[i].id))
+ return 0;
+ }
+ return 1;
+}
+
+static int guild_read_castledb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int j,ln=0;
+ char *str[32],*p;
+ struct guild_castle *gc;
+
+ sprintf(line, "%s/castle_db.txt", db_path);
+ if( (fp=fopen(line,"r"))==NULL){
+ ShowError("can't read %s\n", line);
+ return -1;
+ }
+
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ malloc_tsetdword(str,0,sizeof(str));
+ for(j=0,p=line;j<6 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if (j < 4) //Insufficient data for castle. [Skotlex]
+ {
+ ShowError("castle_db.txt: invalid line '%s'\n", line);
+ continue;
+ }
+
+ gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
+ gc->castle_id=atoi(str[0]);
+ memcpy(gc->map_name,str[1],MAP_NAME_LENGTH-1);
+ memcpy(gc->castle_name,str[2],NAME_LENGTH-1);
+ memcpy(gc->castle_event,str[3],NAME_LENGTH-1);
+
+ idb_put(castle_db,gc->castle_id,gc);
+
+ //intif_guild_castle_info(gc->castle_id);
+
+ ln++;
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"castle_db.txt");
+ return 0;
+}
+
+// ‰Šú‰»
+void do_init_guild(void)
+{
+ guild_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ castle_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ guild_expcache_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+ guild_infoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+ expcache_ers = ers_new((uint32)sizeof(struct guild_expcache));
+ guild_castleinfoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+
+ guild_read_castledb();
+
+ guild_read_guildskill_tree_db(); //guild skill tree [Komurka]
+
+ add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer");
+ add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
+ add_timer_func_list(guild_save_sub, "guild_save_sub");
+ add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer");
+ add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
+ add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL);
+}
+
+
+// ŒŸõ
+struct guild *guild_search(int guild_id)
+{
+ if(guild_cache && guild_cache->guild_id == guild_id)
+ return guild_cache;
+ guild_cache = idb_get(guild_db,guild_id);
+ return guild_cache;
+}
+int guild_searchname_sub(DBKey key,void *data,va_list ap)
+{
+ struct guild *g=(struct guild *)data,**dst;
+ char *str;
+ str=va_arg(ap,char *);
+ dst=va_arg(ap,struct guild **);
+ if(strcmpi(g->name,str)==0)
+ *dst=g;
+ return 0;
+}
+// ƒMƒ‹ƒh–¼ŒŸõ
+struct guild* guild_searchname(char *str)
+{
+ struct guild *g=NULL;
+ guild_db->foreach(guild_db,guild_searchname_sub,str,&g);
+ return g;
+}
+struct guild_castle *guild_castle_search(int gcid)
+{
+ return idb_get(castle_db,gcid);
+}
+
+// mapname‚ɑΉž‚µ‚½ƒAƒWƒg‚Ìgc‚ð•Ô‚·
+struct guild_castle *guild_mapname2gc(char *mapname)
+{
+ int i;
+ struct guild_castle *gc=NULL;
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
+ if(!gc) continue;
+ if(strcmp(gc->map_name,mapname)==0) return gc;
+ }
+ return NULL;
+}
+
+struct guild_castle *guild_mapindex2gc(short mapname)
+{
+ int i;
+ struct guild_castle *gc=NULL;
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
+ if(!gc) continue;
+ if(strcmp(gc->map_name,mapindex_id2name(mapname))==0) return gc;
+ }
+ return NULL;
+}
+
+
+
+// ƒƒOƒCƒ“’†‚̃Mƒ‹ƒhƒƒ“ƒo[‚Ì‚Pl‚Ìsd‚ð•Ô‚·
+struct map_session_data *guild_getavailablesd(struct guild *g)
+{
+ int i;
+
+ nullpo_retr(NULL, g);
+
+ for(i=0;i<g->max_member;i++)
+ if(g->member[i].sd!=NULL)
+ return g->member[i].sd;
+ return NULL;
+}
+
+// ƒMƒ‹ƒhƒƒ“ƒo[‚̃Cƒ“ƒfƒbƒNƒX‚ð•Ô‚·
+int guild_getindex(struct guild *g,int account_id,int char_id)
+{
+ int i;
+ if(g==NULL)
+ return -1;
+ for(i=0;i<g->max_member;i++)
+ if( g->member[i].account_id==account_id &&
+ g->member[i].char_id==char_id )
+ return i;
+ return -1;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo[‚Ì–ðE‚ð•Ô‚·
+int guild_getposition(struct map_session_data *sd,struct guild *g)
+{
+ int i;
+
+ nullpo_retr(-1, sd);
+
+ if(g==NULL && (g=guild_search(sd->status.guild_id))==NULL)
+ return -1;
+ for(i=0;i<g->max_member;i++)
+ if( g->member[i].account_id==sd->status.account_id &&
+ g->member[i].char_id==sd->status.char_id )
+ return g->member[i].position;
+ return -1;
+}
+
+// ƒƒ“ƒo[î•ñ‚Ìì¬
+void guild_makemember(struct guild_member *m,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ malloc_set(m,0,sizeof(struct guild_member));
+ m->account_id =sd->status.account_id;
+ m->char_id =sd->status.char_id;
+ m->hair =sd->status.hair;
+ m->hair_color =sd->status.hair_color;
+ m->gender =sd->status.sex;
+ m->class_ =sd->status.class_;
+ m->lv =sd->status.base_level;
+// m->exp =0;
+// m->exp_payper =0;
+ m->online =1;
+ m->position =MAX_GUILDPOSITION-1;
+ memcpy(m->name,sd->status.name,NAME_LENGTH-1);
+ return;
+}
+// ƒMƒ‹ƒh‹£‡Šm”F
+int guild_check_conflict(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ intif_guild_checkconflict(sd->status.guild_id,
+ sd->status.account_id,sd->status.char_id);
+ return 0;
+}
+
+// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚ðinterŽI‚Ƀtƒ‰ƒbƒVƒ…‚·‚é
+int guild_payexp_timer_sub(DBKey dataid, void *data, va_list ap)
+{
+ int i;
+ struct guild_expcache *c;
+ struct guild *g;
+
+ c = (struct guild_expcache *)data;
+
+ if (
+ (g = guild_search(c->guild_id)) == NULL ||
+ (i = guild_getindex(g, c->account_id, c->char_id)) < 0
+ ) {
+ ers_free(expcache_ers, data);
+ return 0;
+ }
+
+ if (g->member[i].exp > UINT_MAX - c->exp)
+ g->member[i].exp = UINT_MAX;
+ else
+ g->member[i].exp+= c->exp;
+
+ intif_guild_change_memberinfo(g->guild_id,c->account_id,c->char_id,
+ GMI_EXP,&g->member[i].exp,sizeof(g->member[i].exp));
+ c->exp=0;
+
+ ers_free(expcache_ers, data);
+ return 0;
+}
+
+int guild_payexp_timer(int tid, unsigned int tick, int id, int data)
+{
+ guild_expcache_db->clear(guild_expcache_db,guild_payexp_timer_sub);
+ return 0;
+}
+
+//Taken from party_send_xy_timer_sub. [Skotlex]
+int guild_send_xy_timer_sub(DBKey key,void *data,va_list ap)
+{
+ struct guild *g=(struct guild *)data;
+ int i;
+
+ nullpo_retr(0, g);
+
+ for(i=0;i<g->max_member;i++){
+ struct map_session_data *sd;
+ if((sd=g->member[i].sd)!=NULL){
+ if(sd->guild_x!=sd->bl.x || sd->guild_y!=sd->bl.y){
+ clif_guild_xy(sd);
+ sd->guild_x=sd->bl.x;
+ sd->guild_y=sd->bl.y;
+ }
+ }
+ }
+ return 0;
+}
+
+//Code from party_send_xy_timer [Skotlex]
+static int guild_send_xy_timer(int tid,unsigned int tick,int id,int data)
+{
+ guild_db->foreach(guild_db,guild_send_xy_timer_sub,tick);
+ return 0;
+}
+
+int guild_send_dot_remove(struct map_session_data *sd)
+{
+ if (sd->status.guild_id)
+ clif_guild_xy_remove(sd);
+ return 0;
+}
+//------------------------------------------------------------------------
+
+// 쬗v‹
+int guild_create(struct map_session_data *sd,char *name)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id)
+ {
+ clif_guild_created(sd,1); // ‚·‚Å‚ÉŠ‘®‚µ‚Ä‚¢‚é
+ return 0;
+ }
+ if(!battle_config.guild_emperium_check || pc_search_inventory(sd,714) >= 0) {
+ struct guild_member m;
+ guild_makemember(&m,sd);
+ m.position=0;
+ intif_guild_create(name,&m);
+ return 1;
+ }
+ clif_guild_created(sd,3); // ƒGƒ“ƒyƒŠƒEƒ€‚ª‚¢‚È‚¢
+ return 0;
+}
+
+// 쬉”Û
+int guild_created(int account_id,int guild_id)
+{
+ struct map_session_data *sd=map_id2sd(account_id);
+
+ if(sd==NULL)
+ return 0;
+ if(!guild_id) {
+ clif_guild_created(sd,2); // 쬎¸”si“¯–¼ƒMƒ‹ƒh‘¶Ýj
+ return 0;
+ }
+ //struct guild *g;
+ sd->status.guild_id=guild_id;
+ sd->state.guild_sent=0;
+ clif_guild_created(sd,0);
+ if(battle_config.guild_emperium_check)
+ pc_delitem(sd,pc_search_inventory(sd,714),1,0); // ƒGƒ“ƒyƒŠƒEƒ€Á–Õ
+ return 0;
+}
+
+// î•ñ—v‹
+int guild_request_info(int guild_id)
+{
+// if(battle_config.etc_log)
+// printf("guild_request_info\n");
+ return intif_guild_request_info(guild_id);
+}
+// ƒCƒxƒ“ƒg•t‚«î•ñ—v‹
+int guild_npc_request_info(int guild_id,const char *event)
+{
+ struct eventlist *ev;
+
+ if( guild_search(guild_id) ){
+ if(event && *event)
+ npc_event_do(event);
+ return 0;
+ }
+
+ if(event==NULL || *event==0)
+ return guild_request_info(guild_id);
+
+ ev=(struct eventlist *)aCalloc(sizeof(struct eventlist),1);
+ memcpy(ev->name,event,strlen(event));
+ //The one in the db becomes the next event from this.
+ ev->next=idb_put(guild_infoevent_db,guild_id,ev);
+ return guild_request_info(guild_id);
+}
+
+// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
+int guild_check_member(struct guild *g)
+{
+ int i, j, users;
+ struct map_session_data *sd, **all_sd;
+
+ nullpo_retr(0, g);
+
+ all_sd = map_getallusers(&users);
+
+ for(i=0;i<users;i++){
+ sd=all_sd[i];
+ if(sd->status.guild_id==g->guild_id){
+ j=guild_getindex(g,sd->status.account_id,sd->status.char_id);
+ if (j < 0) {
+ sd->status.guild_id=0;
+ sd->state.guild_sent=0;
+ sd->guild_emblem_id=0;
+ if(battle_config.error_log)
+ ShowWarning("guild: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
+ }
+ }
+ }
+ return 0;
+}
+// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
+int guild_recv_noinfo(int guild_id)
+{
+ int i, users;
+ struct map_session_data *sd, **all_sd;
+
+ all_sd = map_getallusers(&users);
+
+ for(i=0;i<users;i++){
+ if((sd=all_sd[i])){
+ if(sd->status.guild_id==guild_id)
+ sd->status.guild_id=0;
+ }
+ }
+ return 0;
+}
+// î•ñŠ“¾
+int guild_recv_info(struct guild *sg)
+{
+ struct guild *g,before;
+ int i,bm,m;
+ struct eventlist *ev,*ev2;
+
+ nullpo_retr(0, sg);
+
+ if((g=idb_get(guild_db,sg->guild_id))==NULL){
+ struct map_session_data *sd;
+ g=(struct guild *)aCalloc(1,sizeof(struct guild));
+ idb_put(guild_db,sg->guild_id,g);
+ before=*sg;
+
+ // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
+ guild_check_member(sg);
+ //If the guild master is online the first time the guild_info is received, that means he was the first to join,
+ //and as such, his guild skills should be blocked to avoid login/logout abuse [Skotlex]
+ if ((sd = map_nick2sd(sg->master)) != NULL)
+ {
+ guild_block_skill(sd, 300000);
+ //Also set the guild master flag.
+ sd->state.gmaster_flag = g;
+ clif_charnameupdate(sd); // [LuzZza]
+ }
+ }else
+ before=*g;
+ memcpy(g,sg,sizeof(struct guild));
+
+ if(g->max_member > MAX_GUILD)
+ {
+ if (battle_config.error_log)
+ ShowError("guild_recv_info: Received guild with %d members, but MAX_GUILD is only %d. Extra guild-members have been lost!\n", g->max_member, MAX_GUILD);
+ g->max_member = MAX_GUILD;
+ }
+
+ for(i=bm=m=0;i<g->max_member;i++){ // sd‚ÌÝ’è‚Æl”‚ÌŠm”F
+ if(g->member[i].account_id>0){
+ struct map_session_data *sd = map_id2sd(g->member[i].account_id);
+ if (sd && sd->status.char_id == g->member[i].char_id &&
+ sd->status.guild_id == g->guild_id &&
+ !sd->state.waitingdisconnect) {
+ g->member[i].sd = sd;
+ clif_charnameupdate(sd); // [LuzZza]
+ } else g->member[i].sd = NULL;
+ m++;
+ }else
+ g->member[i].sd=NULL;
+ if(before.member[i].account_id>0)
+ bm++;
+ }
+
+ for(i=0;i<g->max_member;i++){ // î•ñ‚Ì‘—M
+ struct map_session_data *sd = g->member[i].sd;
+ if( sd==NULL )
+ continue;
+
+ if( before.guild_lv!=g->guild_lv || bm!=m ||
+ before.max_member!=g->max_member ){
+ clif_guild_basicinfo(sd); // Šî–{î•ñ‘—M
+ clif_guild_emblem(sd,g); // ƒGƒ“ƒuƒŒƒ€‘—M
+ }
+
+ if(bm!=m){ // ƒƒ“ƒo[î•ñ‘—M
+ clif_guild_memberlist(g->member[i].sd);
+ }
+
+ if( before.skill_point!=g->skill_point)
+ clif_guild_skillinfo(sd); // ƒXƒLƒ‹î•ñ‘—M
+
+ if( sd->state.guild_sent==0){ // –¢‘—M‚Ȃ犑®î•ñ‚à‘—‚é
+ clif_guild_belonginfo(sd,g);
+ clif_guild_notice(sd,g);
+ sd->guild_emblem_id=g->emblem_id;
+ sd->state.guild_sent=1;
+ }
+ }
+
+ // ƒCƒxƒ“ƒg‚Ì”­¶
+ if( (ev=idb_remove(guild_infoevent_db,sg->guild_id))!=NULL ){
+ while(ev){
+ npc_event_do(ev->name);
+ ev2=ev->next;
+ aFree(ev);
+ ev=ev2;
+ }
+ }
+
+ return 0;
+}
+
+
+// ƒMƒ‹ƒh‚Ö‚ÌŠ©—U
+int guild_invite(struct map_session_data *sd,struct map_session_data *tsd)
+{
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ g=guild_search(sd->status.guild_id);
+
+ if(tsd==NULL || g==NULL)
+ return 0;
+
+ if(!battle_config.invite_request_check) {
+ if (tsd->party_invite>0 || tsd->trade_partner) { // ‘ŠŽè‚ªŽæˆø’†‚©‚Ç‚¤‚©
+ clif_guild_inviteack(sd,0);
+ return 0;
+ }
+ }
+ if(tsd->status.guild_id>0 ||
+ tsd->guild_invite>0 ||
+ map[tsd->bl.m].flag.gvg_castle)
+ { //Can't invite people inside castles. [Skotlex]
+ clif_guild_inviteack(sd,0);
+ return 0;
+ }
+
+ // ’èˆõŠm”F
+ for(i=0;i<g->max_member;i++)
+ if(g->member[i].account_id==0)
+ break;
+ if(i==g->max_member){
+ clif_guild_inviteack(sd,3);
+ return 0;
+ }
+
+ tsd->guild_invite=sd->status.guild_id;
+ tsd->guild_invite_account=sd->status.account_id;
+
+ clif_guild_invite(tsd,g);
+ return 0;
+}
+// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
+int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag)
+{
+ struct map_session_data *tsd;
+
+ nullpo_retr(0, sd);
+
+ //nullpo_retr(0, tsd= map_id2sd( sd->guild_invite_account ));
+ //I checked the code, and there's no "check" for the case where the guy
+ //that invites another to a guild quits the map-server before being replied.
+ //Hence that's a valid null pointer scenario. :) [Skotlex]
+ if ((tsd= map_id2sd( sd->guild_invite_account )) == NULL)
+ { //Do we send a "invitation failed" msg or something to the player?
+ //Or should we accept the invitation and add it to the guild anyway?
+ //afterall, guild_invite holds the guild id that the player was invited to.
+ sd->guild_invite=0;
+ sd->guild_invite_account=0;
+ return 0;
+ }
+
+ if(sd->guild_invite!=guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
+ return 0;
+
+ if(flag==1){ // ³‘ø
+ struct guild_member m;
+ struct guild *g;
+ int i;
+
+ // ’èˆõŠm”F
+ if( (g=guild_search(tsd->status.guild_id))==NULL ){
+ sd->guild_invite=0;
+ sd->guild_invite_account=0;
+ return 0;
+ }
+ for(i=0;i<g->max_member;i++)
+ if(g->member[i].account_id==0)
+ break;
+ if(i==g->max_member){
+ sd->guild_invite=0;
+ sd->guild_invite_account=0;
+ clif_guild_inviteack(tsd,3);
+ return 0;
+ }
+
+
+ //interŽI‚֒ljÁ—v‹
+ guild_makemember(&m,sd);
+ intif_guild_addmember( sd->guild_invite, &m );
+ return 0;
+ }else{ // ‹‘”Û
+ sd->guild_invite=0;
+ sd->guild_invite_account=0;
+ clif_guild_inviteack(tsd,1);
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚ª’ljÁ‚³‚ꂽ
+int guild_member_added(int guild_id,int account_id,int char_id,int flag)
+{
+ struct map_session_data *sd= map_id2sd(account_id),*sd2;
+ struct guild *g;
+
+ if( (g=guild_search(guild_id))==NULL )
+ return 0;
+
+ if(sd==NULL || sd->guild_invite==0){
+ // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
+ if (flag == 0) {
+ if(battle_config.error_log)
+ ShowError("guild: member added error %d is not online\n",account_id);
+ intif_guild_leave(guild_id,account_id,char_id,0,"**“o˜^Ž¸”s**");
+ }
+ return 0;
+ }
+ sd2 = map_id2sd(sd->guild_invite_account);
+ sd->guild_invite = 0;
+ sd->guild_invite_account = 0;
+
+ if(flag==1){ // Ž¸”s
+ if( sd2!=NULL )
+ clif_guild_inviteack(sd2,3);
+ return 0;
+ }
+
+ // ¬Œ÷
+ sd->state.guild_sent=0;
+ sd->status.guild_id=guild_id;
+
+ if( sd2!=NULL )
+ clif_guild_inviteack(sd2,2);
+
+ // ‚¢‚¿‚¨‚¤‹£‡Šm”F
+ guild_check_conflict(sd);
+ //Next line commented because it do nothing, look at guild_recv_info [LuzZza]
+ //clif_charnameupdate(sd); //Update display name [Skotlex]
+ return 0;
+}
+
+// ƒMƒ‹ƒh’E‘Þ—v‹
+int guild_leave(struct map_session_data *sd,int guild_id,
+ int account_id,int char_id,const char *mes)
+{
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ g = guild_search(sd->status.guild_id);
+
+ if(g==NULL)
+ return 0;
+
+ if( sd->status.account_id!=account_id ||
+ sd->status.char_id!=char_id || sd->status.guild_id!=guild_id ||
+ map[sd->bl.m].flag.gvg_castle) //Can't leave inside guild castles.
+ return 0;
+
+ for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
+ if( g->member[i].account_id==sd->status.account_id &&
+ g->member[i].char_id==sd->status.char_id ){
+ intif_guild_leave(g->guild_id,sd->status.account_id,sd->status.char_id,0,mes);
+ return 0;
+ }
+ }
+ return 0;
+}
+// ƒMƒ‹ƒh’Ç•ú—v‹
+int guild_expulsion(struct map_session_data *sd,int guild_id,
+ int account_id,int char_id,const char *mes)
+{
+ struct guild *g;
+ int i,ps;
+
+ nullpo_retr(0, sd);
+
+ g = guild_search(sd->status.guild_id);
+
+ if(g==NULL)
+ return 0;
+
+ if(sd->status.guild_id!=guild_id || map[sd->bl.m].flag.gvg_castle) //Can't leave inside guild castles.
+ return 0;
+
+ if( (ps=guild_getposition(sd,g))<0 || !(g->position[ps].mode&0x0010) )
+ return 0; // ˆ”±Œ ŒÀ–³‚µ
+
+ for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
+ if( g->member[i].account_id==account_id &&
+ g->member[i].char_id==char_id ){
+ intif_guild_leave(g->guild_id,account_id,char_id,1,mes);
+ //It's wrong way, member info will erased later
+ //see guild_member_leaved [LuzZza]
+ //malloc_set(&g->member[i],0,sizeof(struct guild_member));
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
+ const char *name,const char *mes) // rewrote [LuzZza]
+{
+ int i;
+ struct guild *g = guild_search(guild_id);
+ struct map_session_data *sd = map_charid2sd(char_id);
+ struct map_session_data *online_member_sd;
+
+ if(g == NULL)
+ return 0;
+
+ for(i=0;i<g->max_member;i++) {
+ if( g->member[i].account_id == account_id &&
+ g->member[i].char_id == char_id ){
+
+ if((online_member_sd = guild_getavailablesd(g)) == NULL)
+ return 0;
+
+ if(!flag)
+ clif_guild_leave(online_member_sd, name, mes);
+ else
+ clif_guild_expulsion(online_member_sd, name, mes, account_id);
+
+ malloc_set(&g->member[i],0,sizeof(struct guild_member));
+ clif_guild_memberlist(online_member_sd);
+
+ if(sd != NULL && sd->status.guild_id == guild_id) {
+ if (sd->state.storage_flag == 2) //Close the guild storage.
+ storage_guild_storageclose(sd);
+ sd->status.guild_id=0;
+ sd->guild_emblem_id=0;
+ sd->state.guild_sent=0;
+
+ guild_send_dot_remove(sd);
+ clif_charnameupdate(sd); //Update display name [Skotlex]
+ }
+ return 0;
+ }
+
+ }
+
+ return 0;
+}
+
+int guild_send_memberinfoshort(struct map_session_data *sd,int online)
+{ // cleaned up [LuzZza]
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ if(!(g = guild_search(sd->status.guild_id)))
+ return 0;
+
+ //Moved to place before intif_guild_memberinfoshort because
+ //If it's not a member, needn't send it's info to intif. [LuzZza]
+ guild_check_member(g);
+
+ if(sd->status.guild_id <= 0)
+ return 0;
+
+ intif_guild_memberinfoshort(g->guild_id,
+ sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_);
+
+ if(!online){
+ int i=guild_getindex(g,sd->status.account_id,sd->status.char_id);
+ if(i>=0)
+ g->member[i].sd=NULL;
+ return 0;
+ }
+
+ if(sd->state.guild_sent)
+ return 0;
+
+ clif_guild_belonginfo(sd,g);
+ clif_guild_notice(sd,g);
+
+ sd->state.guild_sent = 1;
+ sd->guild_emblem_id = g->emblem_id;
+
+ return 0;
+}
+
+int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_)
+{ // cleaned up [LuzZza]
+
+ int i,alv,c,idx=-1,om=0,oldonline=-1;
+ struct guild *g = guild_search(guild_id);
+
+ if(g == NULL)
+ return 0;
+
+ for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){
+ struct guild_member *m=&g->member[i];
+ if(m->account_id==account_id && m->char_id==char_id ){
+ oldonline=m->online;
+ m->online=online;
+ m->lv=lv;
+ m->class_=class_;
+ idx=i;
+ }
+ if(m->account_id>0){
+ alv+=m->lv;
+ c++;
+ }
+ if(m->online)
+ om++;
+ }
+
+ if(idx == -1 || c == 0) {
+ // ƒMƒ‹ƒh‚̃ƒ“ƒo[ŠO‚È‚Ì‚Å’Ç•úˆµ‚¢‚·‚é
+ struct map_session_data *sd = map_id2sd(account_id);
+ if(sd && sd->status.char_id == char_id) {
+ sd->status.guild_id=0;
+ sd->guild_emblem_id=0;
+ sd->state.guild_sent=0;
+ }
+ if(battle_config.error_log)
+ ShowWarning("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name);
+ return 0;
+ }
+
+ g->average_lv=alv/c;
+ g->connect_member=om;
+
+ for(i=0;i<g->max_member;i++) {
+ struct map_session_data *sd= map_id2sd(g->member[i].account_id);
+ g->member[i].sd = (sd && sd->status.char_id == g->member[i].char_id &&
+ sd->status.guild_id == g->guild_id && !sd->state.waitingdisconnect) ? sd : NULL;
+ }
+
+ if(oldonline!=online)
+ clif_guild_memberlogin_notice(g, idx, online);
+
+
+ if(!g->member[idx].sd)
+ return 0;
+
+ //Send XY dot updates. [Skotlex]
+ //Moved from guild_send_memberinfoshort [LuzZza]
+ for(i=0; i < g->max_member; i++) {
+
+ if(!g->member[i].sd || i == idx ||
+ g->member[i].sd->bl.m != g->member[idx].sd->bl.m)
+ continue;
+
+ clif_guild_xy_single(g->member[idx].sd->fd, g->member[i].sd);
+ }
+
+ return 0;
+}
+// ƒMƒ‹ƒh‰ï˜b‘—M
+int guild_send_message(struct map_session_data *sd,char *mes,int len)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id==0)
+ return 0;
+ intif_guild_message(sd->status.guild_id,sd->status.account_id,mes,len);
+ guild_recv_message(sd->status.guild_id,sd->status.account_id,mes,len);
+
+ //Chatlogging type 'G'
+ if(log_config.chat&1 //we log everything then
+ || ( log_config.chat&8 //if Guild bit is on
+ && ( !agit_flag || !(log_config.chat&16) ))) //if WOE ONLY flag is off or AGIT is OFF
+ log_chat("G", sd->status.guild_id, sd->status.char_id, sd->status.account_id, (char*)mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes);
+
+ return 0;
+}
+// ƒMƒ‹ƒh‰ï˜bŽóM
+int guild_recv_message(int guild_id,int account_id,char *mes,int len)
+{
+ struct guild *g;
+ if( (g=guild_search(guild_id))==NULL)
+ return 0;
+ clif_guild_message(g,account_id,mes,len);
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX
+int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx)
+{
+ return intif_guild_change_memberinfo(
+ guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx));
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX’Ê’m
+int guild_memberposition_changed(struct guild *g,int idx,int pos)
+{
+ nullpo_retr(0, g);
+
+ g->member[idx].position=pos;
+ clif_guild_memberpositionchanged(g,idx);
+
+ // Update char position in client [LuzZza]
+ if(g->member[idx].sd != NULL)
+ clif_charnameupdate(g->member[idx].sd);
+ return 0;
+}
+// ƒMƒ‹ƒh–ðE•ÏX
+int guild_change_position(struct map_session_data *sd,int idx,
+ int mode,int exp_mode,const char *name)
+{
+ struct guild_position p;
+
+ nullpo_retr(0, sd);
+
+ if(exp_mode>battle_config.guild_exp_limit)
+ exp_mode=battle_config.guild_exp_limit;
+ if(exp_mode<0)exp_mode=0;
+ p.mode=mode;
+ p.exp_mode=exp_mode;
+ memcpy(p.name,name,NAME_LENGTH-1);
+ p.name[NAME_LENGTH-1] = '\0'; //Security check... [Skotlex]
+ return intif_guild_position(sd->status.guild_id,idx,&p);
+}
+// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+int guild_position_changed(int guild_id,int idx,struct guild_position *p)
+{
+ struct guild *g=guild_search(guild_id);
+ int i;
+ if(g==NULL)
+ return 0;
+ memcpy(&g->position[idx],p,sizeof(struct guild_position));
+ clif_guild_positionchanged(g,idx);
+
+ // Update char name in client [LuzZza]
+ for(i=0;i<g->max_member;i++)
+ if(g->member[i].position == idx && g->member[i].sd != NULL)
+ clif_charnameupdate(g->member[i].sd);
+ return 0;
+}
+// ƒMƒ‹ƒh’m•ÏX
+int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2)
+{
+ nullpo_retr(0, sd);
+
+ if(guild_id!=sd->status.guild_id)
+ return 0;
+ return intif_guild_notice(guild_id,mes1,mes2);
+}
+// ƒMƒ‹ƒh’m•ÏX’Ê’m
+int guild_notice_changed(int guild_id,const char *mes1,const char *mes2)
+{
+ int i;
+ struct map_session_data *sd;
+ struct guild *g=guild_search(guild_id);
+ if(g==NULL)
+ return 0;
+
+ memcpy(g->mes1,mes1,60);
+ memcpy(g->mes2,mes2,120);
+
+ for(i=0;i<g->max_member;i++){
+ if((sd=g->member[i].sd)!=NULL)
+ clif_guild_notice(sd,g);
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
+int guild_change_emblem(struct map_session_data *sd,int len,const char *data)
+{
+ struct guild *g;
+ nullpo_retr(0, sd);
+
+ if (battle_config.require_glory_guild &&
+ !((g = guild_search(sd->status.guild_id)) && guild_checkskill(g, GD_GLORYGUILD)>0)) {
+ clif_skill_fail(sd,GD_GLORYGUILD,0,0);
+ return 0;
+ }
+
+ return intif_guild_emblem(sd->status.guild_id,len,data);
+}
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
+int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data)
+{
+ int i;
+ struct map_session_data *sd;
+ struct guild *g=guild_search(guild_id);
+ if(g==NULL)
+ return 0;
+
+ memcpy(g->emblem_data,data,len);
+ g->emblem_len=len;
+ g->emblem_id=emblem_id;
+
+ for(i=0;i<g->max_member;i++){
+ if((sd=g->member[i].sd)!=NULL){
+ sd->guild_emblem_id=emblem_id;
+ clif_guild_belonginfo(sd,g);
+ clif_guild_emblem(sd,g);
+ }
+ }
+ return 0;
+}
+
+static void* create_expcache(DBKey key, va_list args) {
+ struct guild_expcache *c;
+ struct map_session_data *sd = va_arg(args, struct map_session_data*);
+
+ c = ers_alloc(expcache_ers, struct guild_expcache);
+ c->guild_id = sd->status.guild_id;
+ c->account_id = sd->status.account_id;
+ c->char_id = sd->status.char_id;
+ c->exp = 0;
+ return c;
+}
+
+// ƒMƒ‹ƒh‚ÌEXPã”[
+unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp)
+{
+ struct guild *g;
+ struct guild_expcache *c;
+ int per;
+
+ nullpo_retr(0, sd);
+
+ if (!exp) return 0;
+
+ if (sd->status.guild_id == 0 ||
+ (g = guild_search(sd->status.guild_id)) == NULL ||
+ (per = guild_getposition(sd,g)) < 0 ||
+ (per = g->position[per].exp_mode) < 1)
+ return 0;
+
+
+ if (per < 100)
+ exp = (unsigned int) exp * per / 100;
+ //Otherwise tax everything.
+
+ c = guild_expcache_db->ensure(guild_expcache_db, i2key(sd->status.char_id), create_expcache, sd);
+
+ if (c->exp > UINT_MAX - exp)
+ c->exp = UINT_MAX;
+ else
+ c->exp += exp;
+
+ return exp;
+}
+
+// Celest
+int guild_getexp(struct map_session_data *sd,int exp)
+{
+ struct guild *g;
+ struct guild_expcache *c;
+ nullpo_retr(0, sd);
+
+ if (sd->status.guild_id == 0 || (g = guild_search(sd->status.guild_id)) == NULL)
+ return 0;
+
+ c = guild_expcache_db->ensure(guild_expcache_db, i2key(sd->status.char_id), create_expcache, sd);
+ if (c->exp > UINT_MAX - exp)
+ c->exp = UINT_MAX;
+ else
+ c->exp += exp;
+ return exp;
+}
+
+// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
+int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
+{
+ struct guild *g;
+ int idx = skill_num - GD_SKILLBASE;
+
+ nullpo_retr(0, sd);
+
+ if(idx < 0 || idx >= MAX_GUILDSKILL)
+
+ return 0;
+ if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL)
+ return 0;
+ if(strcmp(sd->status.name,g->master))
+ return 0;
+
+ if( (g->skill_point>0 || flag&1) &&
+ g->skill[idx].id!=0 &&
+ g->skill[idx].lv < guild_skill_get_max(skill_num) ){
+ intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
+ }
+ return 0;
+}
+// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è’Ê’m
+int guild_skillupack(int guild_id,int skill_num,int account_id)
+{
+ struct map_session_data *sd=map_id2sd(account_id);
+ struct guild *g=guild_search(guild_id);
+ int i;
+ if(g==NULL)
+ return 0;
+ if(sd!=NULL)
+ clif_guild_skillup(sd,skill_num,g->skill[skill_num-GD_SKILLBASE].lv);
+ // ‘Sˆõ‚É’Ê’m
+ for(i=0;i<g->max_member;i++)
+ if((sd=g->member[i].sd)!=NULL)
+ clif_guild_skillinfo(sd);
+ return 0;
+}
+
+// ƒMƒ‹ƒh“¯–¿”Š“¾
+int guild_get_alliance_count(struct guild *g,int flag)
+{
+ int i,c;
+
+ nullpo_retr(0, g);
+
+ for(i=c=0;i<MAX_GUILDALLIANCE;i++){
+ if( g->alliance[i].guild_id>0 &&
+ g->alliance[i].opposition==flag )
+ c++;
+ }
+ return c;
+}
+
+// Blocks all guild skills which have a common delay time.
+void guild_block_skill(struct map_session_data *sd, int time) {
+ int skill_num[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL };
+ int i;
+ for (i = 0; i < 4; i++)
+ skill_blockpc_start(sd, skill_num[i], time);
+}
+
+// “¯–¿ŠÖŒW‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+// “¯–¿‚È‚ç1A‚»‚êˆÈŠO‚Í0
+int guild_check_alliance(int guild_id1, int guild_id2, int flag)
+{
+ struct guild *g;
+ int i;
+
+ g = guild_search(guild_id1);
+ if (g == NULL)
+ return 0;
+
+ for (i=0; i<MAX_GUILDALLIANCE; i++)
+ if ((g->alliance[i].guild_id == guild_id2) && (g->alliance[i].opposition == flag))
+ return 1;
+
+ return 0;
+}
+// ƒMƒ‹ƒh“¯–¿—v‹
+int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd)
+{
+ struct guild *g[2];
+ int i;
+
+ if(agit_flag) { // Disable alliance creation during woe [Valaris]
+ clif_displaymessage(sd->fd,"Alliances cannot be made during Guild Wars!");
+ return 0;
+ } // end addition [Valaris]
+
+
+ nullpo_retr(0, sd);
+
+ if(tsd==NULL || tsd->status.guild_id<=0)
+ return 0;
+
+ g[0]=guild_search(sd->status.guild_id);
+ g[1]=guild_search(tsd->status.guild_id);
+
+ if(g[0]==NULL || g[1]==NULL)
+ return 0;
+
+ // Prevent creation alliance with same guilds [LuzZza]
+ if(sd->status.guild_id == tsd->status.guild_id)
+ return 0;
+
+ if( guild_get_alliance_count(g[0],0)>=3 ) {
+ clif_guild_allianceack(sd,4);
+ return 0;
+ }
+ if( guild_get_alliance_count(g[1],0)>=3 ) {
+ clif_guild_allianceack(sd,3);
+ return 0;
+ }
+
+ if( tsd->guild_alliance>0 ){
+ clif_guild_allianceack(sd,1);
+ return 0;
+ }
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚É“¯–¿ó‘Ô‚©Šm”F
+ if( g[0]->alliance[i].guild_id==tsd->status.guild_id &&
+ g[0]->alliance[i].opposition==0){
+ clif_guild_allianceack(sd,0);
+ return 0;
+ }
+ }
+
+ tsd->guild_alliance=sd->status.guild_id;
+ tsd->guild_alliance_account=sd->status.account_id;
+
+ clif_guild_reqalliance(tsd,sd->status.account_id,g[0]->name);
+ return 0;
+}
+// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
+int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag)
+{
+ struct map_session_data *tsd;
+
+ nullpo_retr(0, sd);
+ tsd= map_id2sd( account_id );
+ if (!tsd) { //Character left? Cancel alliance.
+ clif_guild_allianceack(sd,3);
+ return 0;
+ }
+
+ if(sd->guild_alliance!=tsd->status.guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
+ return 0;
+
+ if(flag==1){ // ³‘ø
+ int i;
+
+ struct guild *g,*tg; // “¯–¿”ÄŠm”F
+ g=guild_search(sd->status.guild_id);
+ tg=guild_search(tsd->status.guild_id);
+
+ if(g==NULL || guild_get_alliance_count(g,0)>=3){
+ clif_guild_allianceack(sd,4);
+ clif_guild_allianceack(tsd,3);
+ return 0;
+ }
+ if(tg==NULL || guild_get_alliance_count(tg,0)>=3){
+ clif_guild_allianceack(sd,3);
+ clif_guild_allianceack(tsd,4);
+ return 0;
+ }
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++){
+ if(g->alliance[i].guild_id==tsd->status.guild_id &&
+ g->alliance[i].opposition==1)
+ intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
+ sd->status.account_id,tsd->status.account_id,9 );
+ }
+ for(i=0;i<MAX_GUILDALLIANCE;i++){
+ if(tg->alliance[i].guild_id==sd->status.guild_id &&
+ tg->alliance[i].opposition==1)
+ intif_guild_alliance( tsd->status.guild_id,sd->status.guild_id,
+ tsd->status.account_id,sd->status.account_id,9 );
+ }
+
+ // interŽI‚Ö“¯–¿—v¿
+ intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
+ sd->status.account_id,tsd->status.account_id,0 );
+ return 0;
+ }else{ // ‹‘”Û
+ sd->guild_alliance=0;
+ sd->guild_alliance_account=0;
+ if(tsd!=NULL)
+ clif_guild_allianceack(tsd,3);
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhŠÖŒW‰ðÁ
+int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
+{
+ nullpo_retr(0, sd);
+
+ if(agit_flag) { // Disable alliance breaking during woe [Valaris]
+ clif_displaymessage(sd->fd,"Alliances cannot be broken during Guild Wars!");
+ return 0;
+ } // end addition [Valaris]
+
+ intif_guild_alliance( sd->status.guild_id,guild_id,
+ sd->status.account_id,0,flag|8 );
+ return 0;
+}
+// ƒMƒ‹ƒh“G‘Î
+int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd)
+{
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL || tsd==NULL)
+ return 0;
+
+ // Prevent creation opposition with same guilds [LuzZza]
+ if(sd->status.guild_id == tsd->status.guild_id)
+ return 0;
+
+ if( guild_get_alliance_count(g,1)>=3 ) {
+ clif_guild_oppositionack(sd,1);
+ return 0;
+ }
+
+ if(agit_flag) {
+ clif_displaymessage(sd->fd,"You cannot make oppositions during Guild Wars!");
+ return 0;
+ }
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚ÉŠÖŒW‚ðŽ‚Á‚Ä‚¢‚é‚©Šm”F
+ if(g->alliance[i].guild_id==tsd->status.guild_id){
+ if(g->alliance[i].opposition==1){ // ‚·‚Å‚É“G‘Î
+ clif_guild_oppositionack(sd,2);
+ return 0;
+ }
+ //Change alliance to opposition.
+ intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
+ sd->status.account_id,tsd->status.account_id,8 );
+ }
+ }
+
+ // interŽI‚É“G‘Ηv¿
+ intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
+ sd->status.account_id,tsd->status.account_id,1 );
+ return 0;
+}
+// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
+int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
+ int flag,const char *name1,const char *name2)
+{
+ struct guild *g[2];
+ int guild_id[2];
+ const char *guild_name[2];
+ struct map_session_data *sd[2];
+ int j,i;
+
+ guild_id[0] = guild_id1;
+ guild_id[1] = guild_id2;
+ guild_name[0] = name1;
+ guild_name[1] = name2;
+ sd[0] = map_id2sd(account_id1);
+ sd[1] = map_id2sd(account_id2);
+
+ g[0]=guild_search(guild_id1);
+ g[1]=guild_search(guild_id2);
+
+ if(sd[0]!=NULL && (flag&0x0f)==0){
+ sd[0]->guild_alliance=0;
+ sd[0]->guild_alliance_account=0;
+ }
+
+ if(flag&0x70){ // Ž¸”s
+ for(i=0;i<2-(flag&1);i++)
+ if( sd[i]!=NULL )
+ clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4);
+ return 0;
+ }
+// if(battle_config.etc_log)
+// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2);
+
+ if(!(flag&0x08)){ // ŠÖŒW’ljÁ
+ for(i=0;i<2-(flag&1);i++)
+ if(g[i]!=NULL)
+ for(j=0;j<MAX_GUILDALLIANCE;j++)
+ if(g[i]->alliance[j].guild_id==0){
+ g[i]->alliance[j].guild_id=guild_id[1-i];
+ memcpy(g[i]->alliance[j].name,guild_name[1-i],NAME_LENGTH-1);
+ g[i]->alliance[j].opposition=flag&1;
+ break;
+ }
+ }else{ // ŠÖŒW‰ðÁ
+ for(i=0;i<2-(flag&1);i++){
+ if(g[i]!=NULL)
+ for(j=0;j<MAX_GUILDALLIANCE;j++)
+ if( g[i]->alliance[j].guild_id==guild_id[1-i] &&
+ g[i]->alliance[j].opposition==(flag&1)){
+ g[i]->alliance[j].guild_id=0;
+ break;
+ }
+ if( sd[i]!=NULL ) // ‰ðÁ’Ê’m
+ clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
+ }
+ }
+
+ if((flag&0x0f)==0){ // “¯–¿’Ê’m
+ if( sd[1]!=NULL )
+ clif_guild_allianceack(sd[1],2);
+ }else if((flag&0x0f)==1){ // “G‘Î’Ê’m
+ if( sd[0]!=NULL )
+ clif_guild_oppositionack(sd[0],0);
+ }
+
+
+ for(i=0;i<2-(flag&1);i++){ // “¯–¿/“G‘΃ŠƒXƒg‚ÌÄ‘—M
+ struct map_session_data *sd;
+ if(g[i]!=NULL)
+ for(j=0;j<g[i]->max_member;j++)
+ if((sd=g[i]->member[j].sd)!=NULL)
+ clif_guild_allianceinfo(sd);
+ }
+ return 0;
+}
+// ƒMƒ‹ƒh‰ðŽU’Ê’m—p
+int guild_broken_sub(DBKey key,void *data,va_list ap)
+{
+ struct guild *g=(struct guild *)data;
+ int guild_id=va_arg(ap,int);
+ int i,j;
+ struct map_session_data *sd=NULL;
+
+ nullpo_retr(0, g);
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++){ // ŠÖŒW‚ð”jŠü
+ if(g->alliance[i].guild_id==guild_id){
+ for(j=0;j<g->max_member;j++)
+ if( (sd=g->member[j].sd)!=NULL )
+ clif_guild_delalliance(sd,guild_id,g->alliance[i].opposition);
+ intif_guild_alliance(g->guild_id, guild_id,0,0,g->alliance[i].opposition|8);
+ g->alliance[i].guild_id=0;
+ }
+ }
+ return 0;
+}
+
+//Invoked on Castles when a guild is broken. [Skotlex]
+int castle_guild_broken_sub(DBKey key,void *data,va_list ap)
+{
+ struct guild_castle *gc=(struct guild_castle *)data;
+ int guild_id=va_arg(ap,int);
+
+ nullpo_retr(0, gc);
+
+ if (gc->guild_id == guild_id)
+ { //Save the new 'owner', this should invoke guardian clean up and other such things.
+ gc->guild_id = 0;
+ guild_castledatasave(gc->castle_id, 1, 0);
+ }
+ return 0;
+}
+
+//Innvoked on /breakguild "Guild name"
+int guild_broken(int guild_id,int flag)
+{
+ struct guild *g=guild_search(guild_id);
+// struct guild_castle *gc=NULL;
+ struct map_session_data *sd;
+ int i;
+// char *name;;
+
+ if(flag!=0 || g==NULL)
+ return 0;
+
+ //we call castle_event::OnGuildBreak of all castlesof the guild
+ //you can set all castle_events in the castle_db.txt
+/* name=(char *)aCalloc(50,sizeof(char)); //24 char = event name, + space for "::OnGuildBreak"
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ if( (gc=guild_castle_search(i)) != NULL ){
+ if(gc->guild_id == guild_id){
+ memcpy(name,gc->castle_event,50);
+ npc_event_do(strcat(name,"::OnGuildBreak"));
+ }
+ }
+ }
+ free(name);
+*/
+ for(i=0;i<g->max_member;i++){ // ƒMƒ‹ƒh‰ðŽU‚ð’Ê’m
+ if((sd=g->member[i].sd)!=NULL){
+ if(sd->state.storage_flag == 2)
+ storage_guild_storage_quit(sd,1);
+ sd->status.guild_id=0;
+ sd->state.guild_sent=0;
+ clif_guild_broken(g->member[i].sd,0);
+ clif_charnameupdate(sd); // [LuzZza]
+ }
+ }
+
+ guild_db->foreach(guild_db,guild_broken_sub,guild_id);
+ castle_db->foreach(castle_db,castle_guild_broken_sub,guild_id);
+ if (guild_cache && guild_cache->guild_id == guild_id)
+ guild_cache = NULL;
+ guild_storage_delete(guild_id);
+ idb_remove(guild_db,guild_id);
+ return 0;
+}
+
+//Changes the Guild Master to the specified player. [Skotlex]
+int guild_gm_change(int guild_id, struct map_session_data *sd)
+{
+ struct guild *g;
+ nullpo_retr(0, sd);
+
+ if (sd->status.guild_id != guild_id)
+ return 0;
+
+ g=guild_search(guild_id);
+
+ nullpo_retr(0, g);
+
+ if (strcmp(g->master, sd->status.name) == 0) //Nothing to change.
+ return 0;
+
+ //Notify servers that master has changed.
+ intif_guild_change_gm(guild_id, sd->status.name, strlen(sd->status.name));
+ return 1;
+}
+
+//Notification from Char server that a guild's master has changed. [Skotlex]
+int guild_gm_changed(int guild_id, int pos)
+{
+ struct guild *g;
+ struct guild_member gm;
+
+ g=guild_search(guild_id);
+
+ if (!g || pos < 0 || pos > g->max_member)
+ return 0;
+
+ memcpy(&gm, &g->member[pos], sizeof (struct guild_member));
+ memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member));
+ memcpy(&g->member[0], &gm, sizeof(struct guild_member));
+
+ g->member[pos].position = g->member[0].position;
+ g->member[0].position = 0; //Position 0: guild Master.
+ strcpy(g->master, g->member[0].name);
+
+ if (g->member[pos].sd && g->member[pos].sd->fd)
+ {
+ clif_displaymessage(g->member[pos].sd->fd, "You no longer are the Guild Master.");
+ g->member[pos].sd->state.gmaster_flag = 0;
+ }
+
+ if (g->member[0].sd && g->member[0].sd->fd)
+ {
+ clif_displaymessage(g->member[0].sd->fd, "You have become the Guild Master!");
+ g->member[0].sd->state.gmaster_flag = g;
+ //Block his skills for 5 minutes to prevent abuse.
+ guild_block_skill(g->member[0].sd, 300000);
+ }
+ return 1;
+}
+
+// ƒMƒ‹ƒh‰ðŽU
+int guild_break(struct map_session_data *sd,char *name)
+{
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if( (g=guild_search(sd->status.guild_id))==NULL )
+ return 0;
+ if(strcmp(g->name,name)!=0)
+ return 0;
+ if(strcmp(sd->status.name,g->master)!=0)
+ return 0;
+ for(i=0;i<g->max_member;i++){
+ if( g->member[i].account_id>0 && (
+ g->member[i].account_id!=sd->status.account_id ||
+ g->member[i].char_id!=sd->status.char_id ))
+ break;
+ }
+ if(i<g->max_member){
+ clif_guild_broken(sd,2);
+ return 0;
+ }
+
+ intif_guild_break(g->guild_id);
+ return 0;
+}
+
+// ƒMƒ‹ƒhéƒf[ƒ^—v‹
+int guild_castledataload(int castle_id,int index)
+{
+ return intif_guild_castle_dataload(castle_id,index);
+}
+// ƒMƒ‹ƒhéî•ñŠ“¾ŽžƒCƒxƒ“ƒg’ljÁ
+int guild_addcastleinfoevent(int castle_id,int index,const char *name)
+{
+ struct eventlist *ev;
+ int code=castle_id|(index<<16);
+
+ if( name==NULL || *name==0 )
+ return 0;
+
+ ev=(struct eventlist *)aMalloc(sizeof(struct eventlist));
+ memcpy(ev->name,name,sizeof(ev->name));
+ //The next event becomes whatever was currently stored.
+ ev->next= idb_put(guild_castleinfoevent_db,code,ev);
+ return 0;
+}
+
+// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
+int guild_castledataloadack(int castle_id,int index,int value)
+{
+ struct guild_castle *gc=guild_castle_search(castle_id);
+ int code=castle_id|(index<<16);
+ struct eventlist *ev,*ev2;
+
+ if(gc==NULL){
+ return 0;
+ }
+ switch(index){
+ case 1:
+ gc->guild_id = value;
+ if (value && guild_search(value)==NULL) //Request guild data which will be required for spawned guardians. [Skotlex]
+ guild_request_info(value);
+ break;
+ case 2: gc->economy = value; break;
+ case 3: gc->defense = value; break;
+ case 4: gc->triggerE = value; break;
+ case 5: gc->triggerD = value; break;
+ case 6: gc->nextTime = value; break;
+ case 7: gc->payTime = value; break;
+ case 8: gc->createTime = value; break;
+ case 9: gc->visibleC = value; break;
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ gc->guardian[index-10].visible = value; break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ gc->guardian[index-18].hp = value; break;
+ default:
+ ShowError("guild_castledataloadack ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+ if( (ev=idb_remove(guild_castleinfoevent_db,code))!=NULL ){
+ while(ev){
+ npc_event_do(ev->name);
+ ev2=ev->next;
+ aFree(ev);
+ ev=ev2;
+ }
+ }
+ return 1;
+}
+// ƒMƒ‹ƒhéƒf[ƒ^•ÏX—v‹
+int guild_castledatasave(int castle_id,int index,int value)
+{
+ if (index == 1)
+ { //The castle's owner has changed? Update Guardian ownership, too. [Skotlex]
+ struct guild_castle *gc = guild_castle_search(castle_id);
+ int m = -1;
+ if (gc) m = map_mapname2mapid(gc->map_name);
+ if (m != -1)
+ map_foreachinmap(mob_guardian_guildchange, m, BL_MOB);
+ }
+ return intif_guild_castle_datasave(castle_id,index,value);
+}
+
+// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
+int guild_castledatasaveack(int castle_id,int index,int value)
+{
+ struct guild_castle *gc=guild_castle_search(castle_id);
+ if(gc==NULL){
+ return 0;
+ }
+ switch(index){
+ case 1: gc->guild_id = value; break;
+ case 2: gc->economy = value; break;
+ case 3: gc->defense = value; break;
+ case 4: gc->triggerE = value; break;
+ case 5: gc->triggerD = value; break;
+ case 6: gc->nextTime = value; break;
+ case 7: gc->payTime = value; break;
+ case 8: gc->createTime = value; break;
+ case 9: gc->visibleC = value; break;
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ gc->guardian[index-10].visible = value; break;
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ gc->guardian[index-18].hp = value; break;
+ default:
+ ShowError("guild_castledatasaveack ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+ return 1;
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^ˆêŠ‡ŽóMi‰Šú‰»Žžj
+int guild_castlealldataload(int len,struct guild_castle *gc)
+{
+ int i;
+ int n = (len-4) / sizeof(struct guild_castle), ev = -1;
+
+ nullpo_retr(0, gc);
+
+ //Last owned castle in the list invokes ::OnAgitinit
+ for(i = 0; i < n; i++) {
+ if ((gc + i)->guild_id)
+ ev = i;
+ }
+
+ // éƒf[ƒ^Ši”[‚ƃMƒ‹ƒhî•ñ—v‹
+ for(i = 0; i < n; i++, gc++) {
+ struct guild_castle *c = guild_castle_search(gc->castle_id);
+ if (!c) {
+ ShowError("guild_castlealldataload Castle id=%d not found.\n", gc->castle_id);
+ continue;
+ }
+ memcpy(&c->guild_id,&gc->guild_id,
+ sizeof(struct guild_castle) - ((int)&c->guild_id - (int)c) );
+ if( c->guild_id ){
+ if(i!=ev)
+ guild_request_info(c->guild_id);
+ else
+ guild_npc_request_info(c->guild_id, "::OnAgitInit");
+ }
+ }
+ if (ev == -1) //No castles owned, invoke OnAgitInit as it is.
+ npc_event_doall("OnAgitInit");
+ return 0;
+}
+
+int guild_agit_start(void)
+{ // Run All NPC_Event[OnAgitStart]
+ int c = npc_event_doall("OnAgitStart");
+ ShowStatus("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c);
+ // Start auto saving
+ guild_save_timer = add_timer_interval (gettick() + GUILD_SAVE_INTERVAL, guild_save_sub, 0, 0, GUILD_SAVE_INTERVAL);
+ return 0;
+}
+
+int guild_agit_end(void)
+{ // Run All NPC_Event[OnAgitEnd]
+ int c = npc_event_doall("OnAgitEnd");
+ ShowStatus("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c);
+ // Stop auto saving
+ delete_timer (guild_save_timer, guild_save_sub);
+ return 0;
+}
+
+int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
+{ // Run One NPC_Event[OnAgitEliminate]
+ char *name = (char*)data;
+ size_t len = (name) ? strlen(name) : 0;
+ // the rest is dangerous, but let it crash,
+ // if this happens, it's ruined anyway
+ int c=0;
+
+ if(agit_flag) // Agit not already End
+ {
+ char *evname=(char*)aMalloc( (len + 10) * sizeof(char));
+ memcpy(evname,name,len - 5);
+ strcpy(evname + len - 5,"Eliminate");
+ c = npc_event_do(evname);
+ ShowStatus("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
+ aFree(evname); // [Lance] Should fix this
+ }
+ if(name) aFree(name);
+ return 0;
+}
+
+static int Ghp[MAX_GUILDCASTLE][MAX_GUARDIANS]; // so save only if HP are changed // experimental code [Yor]
+static int Gid[MAX_GUILDCASTLE];
+int guild_save_sub(int tid,unsigned int tick,int id,int data)
+{
+ struct guild_castle *gc;
+ int i,j;
+
+ for(i = 0; i < MAX_GUILDCASTLE; i++) { // [Yor]
+ gc = guild_castle_search(i);
+ if (!gc) continue;
+ if (gc->guild_id != Gid[i]) {
+ // Re-save guild id if its owner guild has changed
+ guild_castledatasave(gc->castle_id, 1, gc->guild_id);
+ Gid[i] = gc->guild_id;
+ }
+ for (j = 0; j < MAX_GUARDIANS; j++)
+ {
+ if (gc->guardian[j].visible && Ghp[i][j] != gc->guardian[j].hp)
+ guild_castledatasave(gc->castle_id, 18+j, gc->guardian[j].hp);
+ }
+ }
+
+ return 0;
+}
+
+int guild_agit_break(struct mob_data *md)
+{ // Run One NPC_Event[OnAgitBreak]
+ char *evname;
+
+ nullpo_retr(0, md);
+
+ evname=(char *)aMallocA((strlen(md->npc_event) + 1)*sizeof(char));
+
+ strcpy(evname,md->npc_event);
+// Now By User to Run [OnAgitBreak] NPC Event...
+// It's a little impossible to null point with player disconnect in this!
+// But Script will be stop, so nothing...
+// Maybe will be changed in the futher..
+// int c = npc_event_do(evname);
+ if(!agit_flag) return 0; // Agit already End
+ add_timer(gettick()+battle_config.gvg_eliminate_time,guild_gvg_eliminate_timer,md->bl.m,(int)evname);
+ return 0;
+}
+
+// [MouseJstr]
+// How many castles does this guild have?
+int guild_checkcastles(struct guild *g) {
+ int i,nb_cas=0, id,cas_id=0;
+ struct guild_castle *gc;
+ id=g->guild_id;
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
+ cas_id=gc->guild_id;
+ if(g->guild_id==cas_id)
+ nb_cas=nb_cas+1;
+ } //end for
+ return nb_cas;
+}
+
+// [MouseJstr]
+// is this guild allied with this castle?
+int guild_isallied(struct guild *g, struct guild_castle *gc)
+{
+ int i;
+
+ nullpo_retr(0, g);
+
+ if(g->guild_id == gc->guild_id)
+ return 1;
+
+ if (gc->guild_id == 0)
+ return 0;
+
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++)
+ if(g->alliance[i].guild_id == gc->guild_id) {
+ if(g->alliance[i].opposition == 0)
+ return 1;
+ else
+ return 0;
+ }
+
+ return 0;
+}
+
+int guild_idisallied(int guild_id, int guild_id2)
+{
+ int i;
+ struct guild *g;
+
+ if (guild_id <= 0 || guild_id2 <= 0)
+ return 0;
+
+ if(guild_id == guild_id2)
+ return 1;
+
+ g = guild_search(guild_id);
+
+ nullpo_retr(0, g);
+
+
+ for(i=0;i<MAX_GUILDALLIANCE;i++)
+ if(g->alliance[i].guild_id == guild_id2) {
+ if(g->alliance[i].opposition == 0)
+ return 1;
+ else
+ return 0;
+ }
+
+ return 0;
+}
+
+static int guild_infoevent_db_final(DBKey key,void *data,va_list ap)
+{
+ aFree(data);
+ return 0;
+}
+
+static int guild_expcache_db_final(DBKey key,void *data,va_list ap)
+{
+ ers_free(expcache_ers, data);
+ return 0;
+}
+
+void do_final_guild(void)
+{
+ guild_db->destroy(guild_db,NULL);
+ castle_db->destroy(castle_db,NULL);
+ guild_expcache_db->destroy(guild_expcache_db,guild_expcache_db_final);
+ guild_infoevent_db->destroy(guild_infoevent_db,guild_infoevent_db_final);
+ guild_castleinfoevent_db->destroy(guild_castleinfoevent_db,guild_infoevent_db_final);
+ ers_destroy(expcache_ers);
+}
diff --git a/src/map/guild.h b/src/map/guild.h
index 5a71c4525..69174e021 100644
--- a/src/map/guild.h
+++ b/src/map/guild.h
@@ -1,95 +1,95 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _GUILD_H_
-#define _GUILD_H_
-
-struct map_session_data;
-struct mob_data;
-struct guild;
-struct guild_member;
-struct guild_position;
-struct guild_castle;
-
-int guild_skill_get_max(int id);
-
-int guild_checkskill(struct guild *g,int id);
-int guild_check_skill_require(struct guild *g,int id); // [Komurka]
-int guild_checkcastles(struct guild *g); // [MouseJstr]
-int guild_isallied(struct guild *g, struct guild_castle *gc);
-int guild_idisallied(int guild_id, int guild_id2); //Checks alliance based on guild Ids. [Skotlex]
-
-void do_init_guild(void);
-struct guild *guild_search(int guild_id);
-struct guild *guild_searchname(char *str);
-struct guild_castle *guild_castle_search(int gcid);
-
-struct guild_castle *guild_mapname2gc(char *mapname);
-struct guild_castle *guild_mapindex2gc(short mapname);
-
-struct map_session_data *guild_getavailablesd(struct guild *g);
-int guild_getindex(struct guild *g,int account_id,int char_id);
-int guild_getposition(struct map_session_data *sd,struct guild *g);
-unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp);
-int guild_getexp(struct map_session_data *sd,int exp); // [Celest]
-
-int guild_create(struct map_session_data *sd,char *name);
-int guild_created(int account_id,int guild_id);
-int guild_request_info(int guild_id);
-int guild_recv_noinfo(int guild_id);
-int guild_recv_info(struct guild *sg);
-int guild_npc_request_info(int guild_id,const char *ev);
-int guild_invite(struct map_session_data *sd,struct map_session_data *tsd);
-int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag);
-int guild_member_added(int guild_id,int account_id,int char_id,int flag);
-int guild_leave(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes);
-int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes);
-int guild_expulsion(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes);
-int guild_skillup(struct map_session_data *sd,int skill_num,int flag);
-void guild_block_skill(struct map_session_data *sd, int time);
-int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd);
-int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag);
-int guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2);
-int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2);
-int guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
-int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd);
-int guild_check_alliance(int guild_id1, int guild_id2, int flag);
-
-int guild_send_memberinfoshort(struct map_session_data *sd,int online);
-int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_);
-int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx);
-int guild_memberposition_changed(struct guild *g,int idx,int pos);
-int guild_change_position(struct map_session_data *sd,int idx,
- int mode,int exp_mode,const char *name);
-int guild_position_changed(int guild_id,int idx,struct guild_position *p);
-int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2);
-int guild_notice_changed(int guild_id,const char *mes1,const char *mes2);
-int guild_change_emblem(struct map_session_data *sd,int len,const char *data);
-int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data);
-int guild_send_message(struct map_session_data *sd,char *mes,int len);
-int guild_recv_message(int guild_id,int account_id,char *mes,int len);
-int guild_send_dot_remove(struct map_session_data *sd);
-int guild_skillupack(int guild_id,int skill_num,int account_id);
-int guild_break(struct map_session_data *sd,char *name);
-int guild_broken(int guild_id,int flag);
-int guild_gm_change(int guild_id, struct map_session_data *sd);
-int guild_gm_changed(int guild_id, int pos);
-
-int guild_addcastleinfoevent(int castle_id,int index,const char *name);
-int guild_castledataload(int castle_id,int index);
-int guild_castledataloadack(int castle_id,int index,int value);
-int guild_castledatasave(int castle_id,int index,int value);
-int guild_castledatasaveack(int castle_id,int index,int value);
-int guild_castlealldataload(int len,struct guild_castle *gc);
-
-int guild_agit_start(void);
-int guild_agit_end(void);
-int guild_agit_break(struct mob_data *md);
-
-void do_final_guild(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _GUILD_H_
+#define _GUILD_H_
+
+struct map_session_data;
+struct mob_data;
+struct guild;
+struct guild_member;
+struct guild_position;
+struct guild_castle;
+
+int guild_skill_get_max(int id);
+
+int guild_checkskill(struct guild *g,int id);
+int guild_check_skill_require(struct guild *g,int id); // [Komurka]
+int guild_checkcastles(struct guild *g); // [MouseJstr]
+int guild_isallied(struct guild *g, struct guild_castle *gc);
+int guild_idisallied(int guild_id, int guild_id2); //Checks alliance based on guild Ids. [Skotlex]
+
+void do_init_guild(void);
+struct guild *guild_search(int guild_id);
+struct guild *guild_searchname(char *str);
+struct guild_castle *guild_castle_search(int gcid);
+
+struct guild_castle *guild_mapname2gc(char *mapname);
+struct guild_castle *guild_mapindex2gc(short mapname);
+
+struct map_session_data *guild_getavailablesd(struct guild *g);
+int guild_getindex(struct guild *g,int account_id,int char_id);
+int guild_getposition(struct map_session_data *sd,struct guild *g);
+unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp);
+int guild_getexp(struct map_session_data *sd,int exp); // [Celest]
+
+int guild_create(struct map_session_data *sd,char *name);
+int guild_created(int account_id,int guild_id);
+int guild_request_info(int guild_id);
+int guild_recv_noinfo(int guild_id);
+int guild_recv_info(struct guild *sg);
+int guild_npc_request_info(int guild_id,const char *ev);
+int guild_invite(struct map_session_data *sd,struct map_session_data *tsd);
+int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag);
+int guild_member_added(int guild_id,int account_id,int char_id,int flag);
+int guild_leave(struct map_session_data *sd,int guild_id,
+ int account_id,int char_id,const char *mes);
+int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
+ const char *name,const char *mes);
+int guild_expulsion(struct map_session_data *sd,int guild_id,
+ int account_id,int char_id,const char *mes);
+int guild_skillup(struct map_session_data *sd,int skill_num,int flag);
+void guild_block_skill(struct map_session_data *sd, int time);
+int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd);
+int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag);
+int guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2);
+int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
+ int flag,const char *name1,const char *name2);
+int guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
+int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd);
+int guild_check_alliance(int guild_id1, int guild_id2, int flag);
+
+int guild_send_memberinfoshort(struct map_session_data *sd,int online);
+int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_);
+int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx);
+int guild_memberposition_changed(struct guild *g,int idx,int pos);
+int guild_change_position(struct map_session_data *sd,int idx,
+ int mode,int exp_mode,const char *name);
+int guild_position_changed(int guild_id,int idx,struct guild_position *p);
+int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2);
+int guild_notice_changed(int guild_id,const char *mes1,const char *mes2);
+int guild_change_emblem(struct map_session_data *sd,int len,const char *data);
+int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data);
+int guild_send_message(struct map_session_data *sd,char *mes,int len);
+int guild_recv_message(int guild_id,int account_id,char *mes,int len);
+int guild_send_dot_remove(struct map_session_data *sd);
+int guild_skillupack(int guild_id,int skill_num,int account_id);
+int guild_break(struct map_session_data *sd,char *name);
+int guild_broken(int guild_id,int flag);
+int guild_gm_change(int guild_id, struct map_session_data *sd);
+int guild_gm_changed(int guild_id, int pos);
+
+int guild_addcastleinfoevent(int castle_id,int index,const char *name);
+int guild_castledataload(int castle_id,int index);
+int guild_castledataloadack(int castle_id,int index,int value);
+int guild_castledatasave(int castle_id,int index,int value);
+int guild_castledatasaveack(int castle_id,int index,int value);
+int guild_castlealldataload(int len,struct guild_castle *gc);
+
+int guild_agit_start(void);
+int guild_agit_end(void);
+int guild_agit_break(struct mob_data *md);
+
+void do_final_guild(void);
+
+#endif
diff --git a/src/map/intif.h b/src/map/intif.h
index 0351642b1..8fc005508 100644
--- a/src/map/intif.h
+++ b/src/map/intif.h
@@ -1,72 +1,72 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _INTIF_H_
-#define _INFIF_H_
-
-int intif_parse(int fd);
-
-int intif_GMmessage(char* mes,int len,int flag);
-int intif_announce(char* mes,int len, unsigned long color, int flag);
-
-int intif_wis_message(struct map_session_data *sd,char *nick,char *mes,int mes_len);
-int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes);
-
-int intif_saveregistry(struct map_session_data *sd, int type);
-int intif_request_registry(struct map_session_data *sd, int flag);
-
-int intif_request_storage(int account_id);
-int intif_send_storage(struct storage *stor);
-int intif_request_guild_storage(int account_id, int guild_id);
-int intif_send_guild_storage(int account_id, struct guild_storage *gstor);
-
-
-int intif_create_party(struct party_member *member,char *name,int item,int item2);
-int intif_request_partyinfo(int party_id);
-
-int intif_party_addmember(int party_id,struct party_member *member);
-int intif_party_changeoption(int party_id, int account_id, int exp, int item);
-int intif_party_leave(int party_id,int account_id, int char_id);
-int intif_party_changemap(struct map_session_data *sd, int online);
-int intif_break_party(int party_id);
-int intif_party_message(int party_id, int account_id, char *mes,int len);
-int intif_party_checkconflict(int party_id,int account_id,int char_id);
-int intif_party_leaderchange(int party_id,int account_id,int char_id);
-
-
-int intif_guild_create(const char *name, const struct guild_member *master);
-int intif_guild_request_info(int guild_id);
-int intif_guild_addmember(int guild_id, struct guild_member *m);
-int intif_guild_leave(int guild_id, int account_id, int char_id, int flag, const char *mes);
-int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class_);
-int intif_guild_break(int guild_id);
-int intif_guild_message(int guild_id, int account_id, char *mes, int len);
-int intif_guild_checkconflict(int guild_id, int account_id, int char_id);
-int intif_guild_change_gm(int guild_id, const char* name, int len);
-int intif_guild_change_basicinfo(int guild_id, int type, const void *data, int len);
-int intif_guild_change_memberinfo(int guild_id, int account_id, int char_id, int type, const void *data, int len);
-int intif_guild_position(int guild_id, int idx, struct guild_position *p);
-int intif_guild_skillup(int guild_id, int skill_num, int account_id, int flag);
-int intif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag);
-int intif_guild_notice(int guild_id, const char *mes1, const char *mes2);
-int intif_guild_emblem(int guild_id, int len, const char *data);
-int intif_guild_castle_dataload(int castle_id, int index);
-int intif_guild_castle_datasave(int castle_id, int index, int value);
-
-int intif_create_pet(int account_id, int char_id, short pet_type, short pet_lv, short pet_egg_id,
- short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name);
-int intif_request_petdata(int account_id, int char_id, int pet_id);
-int intif_save_petdata(int account_id, struct s_pet *p);
-int intif_delete_petdata(int pet_id);
-int intif_rename_pet(struct map_session_data *sd, char *name);
-
-
-int intif_homunculus_create(int account_id, struct s_homunculus *sh);
-int intif_homunculus_requestload(int account_id, int homun_id);
-int intif_homunculus_requestsave(int account_id, struct s_homunculus* sh);
-int intif_homunculus_requestdelete(int homun_id);
-
-
-int CheckForCharServer(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _INTIF_H_
+#define _INFIF_H_
+
+int intif_parse(int fd);
+
+int intif_GMmessage(char* mes,int len,int flag);
+int intif_announce(char* mes,int len, unsigned long color, int flag);
+
+int intif_wis_message(struct map_session_data *sd,char *nick,char *mes,int mes_len);
+int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes);
+
+int intif_saveregistry(struct map_session_data *sd, int type);
+int intif_request_registry(struct map_session_data *sd, int flag);
+
+int intif_request_storage(int account_id);
+int intif_send_storage(struct storage *stor);
+int intif_request_guild_storage(int account_id, int guild_id);
+int intif_send_guild_storage(int account_id, struct guild_storage *gstor);
+
+
+int intif_create_party(struct party_member *member,char *name,int item,int item2);
+int intif_request_partyinfo(int party_id);
+
+int intif_party_addmember(int party_id,struct party_member *member);
+int intif_party_changeoption(int party_id, int account_id, int exp, int item);
+int intif_party_leave(int party_id,int account_id, int char_id);
+int intif_party_changemap(struct map_session_data *sd, int online);
+int intif_break_party(int party_id);
+int intif_party_message(int party_id, int account_id, char *mes,int len);
+int intif_party_checkconflict(int party_id,int account_id,int char_id);
+int intif_party_leaderchange(int party_id,int account_id,int char_id);
+
+
+int intif_guild_create(const char *name, const struct guild_member *master);
+int intif_guild_request_info(int guild_id);
+int intif_guild_addmember(int guild_id, struct guild_member *m);
+int intif_guild_leave(int guild_id, int account_id, int char_id, int flag, const char *mes);
+int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class_);
+int intif_guild_break(int guild_id);
+int intif_guild_message(int guild_id, int account_id, char *mes, int len);
+int intif_guild_checkconflict(int guild_id, int account_id, int char_id);
+int intif_guild_change_gm(int guild_id, const char* name, int len);
+int intif_guild_change_basicinfo(int guild_id, int type, const void *data, int len);
+int intif_guild_change_memberinfo(int guild_id, int account_id, int char_id, int type, const void *data, int len);
+int intif_guild_position(int guild_id, int idx, struct guild_position *p);
+int intif_guild_skillup(int guild_id, int skill_num, int account_id, int flag);
+int intif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag);
+int intif_guild_notice(int guild_id, const char *mes1, const char *mes2);
+int intif_guild_emblem(int guild_id, int len, const char *data);
+int intif_guild_castle_dataload(int castle_id, int index);
+int intif_guild_castle_datasave(int castle_id, int index, int value);
+
+int intif_create_pet(int account_id, int char_id, short pet_type, short pet_lv, short pet_egg_id,
+ short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name);
+int intif_request_petdata(int account_id, int char_id, int pet_id);
+int intif_save_petdata(int account_id, struct s_pet *p);
+int intif_delete_petdata(int pet_id);
+int intif_rename_pet(struct map_session_data *sd, char *name);
+
+
+int intif_homunculus_create(int account_id, struct s_homunculus *sh);
+int intif_homunculus_requestload(int account_id, int homun_id);
+int intif_homunculus_requestsave(int account_id, struct s_homunculus* sh);
+int intif_homunculus_requestdelete(int homun_id);
+
+
+int CheckForCharServer(void);
+
+#endif
diff --git a/src/map/irc.c b/src/map/irc.c
index 4b9187107..4722e9c2e 100644
--- a/src/map/irc.c
+++ b/src/map/irc.c
@@ -1,543 +1,543 @@
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/malloc.h"
-#include "../common/db.h"
-#include "../common/timer.h"
-#include "../common/strlib.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/version.h"
-#include "../common/nullpo.h"
-
-#include "map.h"
-#include "pc.h"
-#include "irc.h"
-#include "intif.h" //For GM Broadcast [Zido]
-
-short use_irc=0;
-
-short irc_autojoin=0;
-
-short irc_announce_flag=1;
-short irc_announce_mvp_flag=1;
-short irc_announce_jobchange_flag=1;
-short irc_announce_shop_flag=1;
-
-IRC_SI *irc_si=NULL;
-
-char irc_nick[30]="";
-char irc_password[32]="";
-
-char irc_channel[32]="";
-char irc_channel_pass[32]="";
-char irc_trade_channel[32]="";
-
-unsigned char irc_ip_str[128]="";
-unsigned long irc_ip=0;
-unsigned short irc_port = 6667;
-int irc_fd=0;
-
-struct channel_data cd;
-int last_cd_user=0;
-
-int irc_connect_timer(int tid, unsigned int tick, int id, int data)
-{
- if(irc_si && session[irc_si->fd])
- return 0;
- //Ok, this ShowInfo and printf are a little ugly, but they are meant to
- //debug just how long the code freezes here. [Skotlex]
- ShowInfo("(IRC) Connecting to %s... ", irc_ip_str);
- irc_fd = make_connection(irc_ip,irc_port);
- if(irc_fd > 0){
- printf("ok\n");
- session[irc_fd]->func_parse = irc_parse;
- } else
- printf("failed\n");
- return 0;
-}
-
-void irc_announce(char *buf)
-{
- char send_string[256];
- // malloc_tsetdword(send_string,'\0',256); // NOT REQUIRED
-
- sprintf(send_string,"PRIVMSG %s :",irc_channel);
- strcat(send_string, buf);
- irc_send(send_string);
-}
-
-void irc_announce_jobchange(struct map_session_data *sd)
-{
- char send_string[256];
-
- nullpo_retv(sd);
- malloc_tsetdword(send_string,'\0',256);
-
- sprintf(send_string,"PRIVMSG %s :%s has changed into a %s.",irc_channel,sd->status.name,job_name(sd->status.class_));
- irc_send(send_string);
-}
-
-void irc_announce_shop(struct map_session_data *sd, int flag)
-{
- char send_string[256];
- char mapname[16];
- int maplen = 0;
- nullpo_retv(sd);
-
- malloc_tsetdword(send_string,'\0',256);
- malloc_tsetdword(mapname,'\0',16);
-
- if(flag){
- strcpy(mapname, map[sd->bl.m].name);
- maplen = strcspn(mapname,".");
- mapname[maplen] = '\0';
- mapname[0]=toupper(mapname[0]);
-
- sprintf(send_string,"PRIVMSG %s :%s has opened a shop, %s, at <%d,%d> in %s.",irc_trade_channel,sd->status.name,sd->message,sd->bl.x,sd->bl.y,mapname);
- } else
- sprintf(send_string,"PRIVMSG %s :%s has closed their shop.",irc_trade_channel,sd->status.name);
-
- irc_send(send_string);
-}
-
-void irc_announce_mvp(struct map_session_data *sd, struct mob_data *md)
-{
- char send_string[256];
- char mapname[16];
- int maplen = 0;
-
- nullpo_retv(sd);
- nullpo_retv(md);
-
- malloc_tsetdword(send_string,'\0',256);
- malloc_tsetdword(mapname,'\0',16);
- mapname[15]='\0'; // 15 is the final index, not 16 [Lance]
- strcpy(mapname, map[md->bl.m].name);
- maplen = strcspn(mapname,".");
- mapname[maplen] = '\0';
- mapname[0]=toupper(mapname[0]);
-
- sprintf(send_string,"PRIVMSG %s :%s the %s has MVP'd %s in %s.",irc_channel,sd->status.name,job_name(sd->status.class_),md->name, mapname);
- irc_send(send_string);
-}
-
-int irc_parse(int fd)
-{
- if (session[fd]->eof){
- do_close(fd);
- irc_si = NULL;
- add_timer(gettick() + 15000, irc_connect_timer, 0, 0);
- return 0;
- }
- if (session[fd]->session_data == NULL){
- irc_si = (struct IRC_Session_Info*)aMalloc(sizeof(struct IRC_Session_Info));
- irc_si->fd = fd;
- irc_si->state = 0;
- session[fd]->session_data = irc_si;
- } else if (!irc_si) {
- irc_si = (struct IRC_Session_Info*)session[fd]->session_data;
- irc_si->fd = fd;
- }
- if(RFIFOREST(fd) > 0){
- char *incoming_string=aMalloc(RFIFOREST(fd)*sizeof(char));
- RFIFOHEAD(fd);
- memcpy(incoming_string,RFIFOP(fd,0),RFIFOREST(fd));
- send_to_parser(fd,incoming_string,"\n");
- RFIFOSKIP(fd,RFIFOREST(fd));
- aFree(incoming_string);
- }
- return 0;
-}
-
-int irc_keepalive_timer(int tid, unsigned int tick, int id, int data)
-{
- char send_string[128];
- malloc_tsetdword(send_string,'\0',128);
-
- sprintf(send_string,"PRIVMSG %s : ", irc_nick);
- irc_send(send_string);
- add_timer(gettick() + 30000, irc_keepalive_timer, 0, 0);
- return 0;
-}
-
-void irc_send_sub(int fd, char transmit[4096])
-{
- sprintf(transmit,"%s%c",transmit,10);
- WFIFOHEAD(fd,strlen(transmit));
- memcpy(WFIFOP(fd,0),transmit, strlen(transmit));
- WFIFOSET(fd,strlen(transmit));
-}
-
-void irc_send(char *buf)
-{
- char transmit[4096];
-
- if(!irc_si || !session[irc_si->fd])
- return;
-
- malloc_tsetdword(transmit,'\0',4096);
-
- sprintf(transmit,buf);
- irc_send_sub(irc_si->fd,transmit);
-}
-
-void irc_parse_sub(int fd, char *incoming_string)
-{
- char source[256];
- char command[256];
- char target[256];
- char message[8192];
- char send_string[8192];
- char *source_nick=NULL;
- char *source_ident=NULL;
- char *source_host=NULL;
- char *state_mgr=NULL;
-
- char cmd1[256];
- char cmd2[256];
- char cmdname[256];
- char cmdargs[256];
-
- int users=0;
- int i=0;
-
- struct map_session_data **allsd;
-
- malloc_tsetdword(source,'\0',256);
- malloc_tsetdword(command,'\0',256);
- malloc_tsetdword(target,'\0',256);
- malloc_tsetdword(message,'\0',8192);
- malloc_tsetdword(send_string,'\0',8192);
-
- malloc_tsetdword(cmd1,'\0',256);
- malloc_tsetdword(cmd2,'\0',256);
- malloc_tsetdword(cmdname,'\0',256);
- malloc_tsetdword(cmdargs,'\0',256);
-
- sscanf(incoming_string, ":%255s %255s %255s :%4095[^\r\n]", source, command, target, message);
- if (source != NULL) {
- if (strstr(source,"!") != NULL) {
- source_nick = strtok_r(source,"!",&state_mgr);
- source_ident = strtok_r(NULL,"@",&state_mgr);
- source_host = strtok_r(NULL,"%%",&state_mgr);
- }
- }
- if (irc_si->state == 0){
- sprintf(send_string, "NICK %s", irc_nick);
- irc_send(send_string);
- sprintf(send_string, "USER eABot 8 * : eABot");
- irc_send(send_string);
- irc_si->state = 1;
- }
- else if (irc_si->state == 1){
- if(!strcmp(command,"001")){
- ShowStatus("IRC: Connected to IRC.\n");
- sprintf(send_string, "PRIVMSG nickserv :identify %s", irc_password);
- irc_send(send_string);
- sprintf(send_string, "JOIN %s %s", irc_channel, irc_channel_pass);
- irc_send(send_string);
- sprintf(send_string,"NAMES %s",irc_channel);
- irc_send(send_string);
- irc_si->state = 2;
- }
- else if(!strcmp(command,"433")){
- ShowError("IRC: Nickname %s is already taken, IRC Client unable to connect.\n", irc_nick);
- sprintf(send_string, "QUIT");
- irc_send(send_string);
- if(session[fd])
- session[fd]->eof=1;
- }
- }
- else if (irc_si->state == 2){
- if(!strcmp(source, "PING")){
- sprintf(send_string, "PONG %s", command);
- irc_send(send_string);
- }
-
- else if((strcmpi(target,irc_channel)==0)||(strcmpi(target,irc_channel+1)==0)) {
-
- // Broadcast [Zido] (Work in Progress)
- if((strcmpi(command,"privmsg")==0)&&(sscanf(message,"@%255s %255[^\r\n]",cmdname,cmdargs)>0)&&(target[0]=='#')) {
- if(strcmpi(cmdname,"kami")==0) {
- if(get_access(source_nick)<ACCESS_OP)
- sprintf(send_string,"NOTICE %s :Access Denied",source_nick);
- else {
- sprintf(send_string,"%s: %s",source_nick,cmdargs);
- intif_GMmessage(send_string,strlen(send_string)+1,0);
- sprintf(send_string,"NOTICE %s :Message Sent",source_nick);
- }
- irc_send(send_string);
- // Number of users online [Zido]
- } else if(strcmpi(cmdname,"users")==0) {
- map_getallusers(&users);
- sprintf(send_string,"PRIVMSG %s :Users Online: %d",irc_channel,users);
- irc_send(send_string);
- // List all users online [Zido]
- } else if(strcmpi(cmdname,"who")==0) {
- allsd=map_getallusers(&users);
- if(users>0) {
- sprintf(send_string,"NOTICE %s :%d Users Online",source_nick,users);
- irc_send(send_string);
- for(i=0;i<users;i++) {
- sprintf(send_string,"NOTICE %s :Name: \"%s\"",source_nick,allsd[i]->status.name);
- irc_send(send_string);
- }
- } else {
- sprintf(send_string,"NOTICE %s :No Users Online",source_nick);
- irc_send(send_string);
- }
- }
- }
-
- // Refresh Names [Zido]
- else if((strcmpi(command,"join")==0)||(strcmpi(command,"part")==0)||(strcmpi(command,"mode")==0)||(strcmpi(command,"nick")==0)) {
- ShowInfo("IRC: Refreshing User List");
- irc_rmnames();
- printf("...");
- sprintf(send_string,"NAMES %s",irc_channel);
- printf("...");
- irc_send(send_string);
- printf("Done\n");
- }
-
- // Autojoin on kick [Zido]
- else if((strcmpi(command,"kick")==0)&&(irc_autojoin==1)) {
- sprintf(send_string, "JOIN %s %s", target, irc_channel_pass);
- irc_send(send_string);
- }
- }
-
- // Names Reply [Zido]
- else if((strcmpi(command,"353")==0)) {
- ShowInfo("IRC: NAMES recieved\n");
- parse_names_packet(incoming_string);
- }
- }
-
- return;
-}
-
-int send_to_parser(int fd, char *input,char key[2])
-{
- char *temp_string=NULL;
- char *state_mgr=NULL;
- int total_loops=0;
-
- temp_string = strtok_r(input,key,&state_mgr);
- while (temp_string != NULL){
- total_loops = total_loops+1;
- irc_parse_sub(fd,temp_string);
- temp_string = strtok_r(NULL,key,&state_mgr);
- }
- return total_loops;
-}
-
-void do_final_irc(void)
-{
-
-}
-
-void do_init_irc(void)
-{
- if(!use_irc)
- return;
- if (irc_ip_str[strlen(irc_ip_str)-1] == '\n')
- irc_ip_str[strlen(irc_ip_str)-1] = '\0';
- irc_ip = resolve_hostbyname(irc_ip_str, NULL, irc_ip_str);
- if (!irc_ip)
- {
- ShowError("Unable to resolve %s! Cannot connect to IRC server, disabling irc_bot.\n", irc_ip_str);
- use_irc = 0;
- return;
- }
-
- irc_connect_timer(0, 0, 0, 0);
-
- add_timer_func_list(irc_connect_timer, "irc_connect_timer");
- add_timer_func_list(irc_keepalive_timer, "irc_keepalive_timer");
- add_timer(gettick() + 30000, irc_keepalive_timer, 0, 0);
-}
-
-//NAMES Packet(353) parser [Zido]
-int parse_names_packet(char *str) {
- char *tok;
- char source[256];
- char numeric[10];
- char target[256];
- char channel[256];
- char names[1024];
-
- malloc_tsetdword(source,'\0',256);
- malloc_tsetword(numeric,'\0',10);
- malloc_tsetdword(target,'\0',256);
- malloc_tsetdword(channel,'\0',256);
- malloc_tsetdword(names,'\0',1024);
-
- tok=strtok(str,"\r\n");
- sscanf(tok,":%255s %10s %255s %*1[=@] %255s :%1023[^\r\n]",source,numeric,target,channel,names);
- if(strcmpi(numeric,"353")==0)
- parse_names(names);
-
- while((tok=strtok(NULL,"\r\n"))!=NULL) {
- sscanf(tok,":%255s %10s %255s %*1[=@] %255s :%1023[^\r\n]",source,numeric,target,channel,names);
- if(strcmpi(numeric,"353")==0)
- parse_names(names);
- }
-
- return 0;
-}
-
-//User access level prefix parser [Zido]
-int parse_names(char *str) {
- char *tok;
- if (str == NULL) return 0; //Nothing to parse!
- tok=strtok(str," ");
- switch(tok[0]) {
- case '~':
- set_access(tok+1,ACCESS_OWNER);
- break;
- case '&':
- set_access(tok+1,ACCESS_SOP);
- break;
- case '@':
- set_access(tok+1,ACCESS_OP);
- break;
- case '%':
- set_access(tok+1,ACCESS_HOP);
- break;
- case '+':
- set_access(tok+1,ACCESS_VOICE);
- break;
- default:
- set_access(tok,ACCESS_NORM);
- break;
- }
-
- while((tok=strtok(NULL," "))!=NULL) {
- switch(tok[0]) {
- case '~':
- set_access(tok+1,ACCESS_OWNER);
- break;
- case '&':
- set_access(tok+1,ACCESS_SOP);
- break;
- case '@':
- set_access(tok+1,ACCESS_OP);
- break;
- case '%':
- set_access(tok+1,ACCESS_HOP);
- break;
- case '+':
- set_access(tok+1,ACCESS_VOICE);
- break;
- default:
- set_access(tok,ACCESS_NORM);
- break;
- }
- }
-
- return 1;
-}
-
-//Store user's access level [Zido]
-int set_access(char *nick,int newlevel) {
- int i=0;
-
- for(i=0;i<=MAX_CHANNEL_USERS;i++) {
- if(strcmpi(cd.user[i].name,nick)==0) {
- cd.user[i].level=newlevel;
- return 1;
- }
- }
-
- strcpy(cd.user[last_cd_user].name,nick);
- cd.user[last_cd_user].level=newlevel;
- last_cd_user++;
-
- return 0;
-}
-
-//Returns users access level [Zido]
-int get_access(char *nick) {
- int i=0;
-
- for(i=0;i<=MAX_CHANNEL_USERS;i++) {
- if(strcmpi(cd.user[i].name,nick)==0) {
- return (cd.user[i].level);
- }
- }
-
- return -1;
-}
-
-int irc_rmnames() {
- int i=0;
-
- for(i=0;i<=MAX_CHANNEL_USERS;i++) {
- //malloc_tsetdword(cd.user[i].name,'\0',256);
- cd.user[i].level=0;
- }
-
- last_cd_user=0;
-
-
- return 0;
-}
-
-int irc_read_conf(char *file) {
- FILE *fp=NULL;
- char w1[256];
- char w2[256];
- char path[256];
- char row[1024];
-
- malloc_tsetdword(w1,'\0',256);
- malloc_tsetdword(w2,'\0',256);
- malloc_tsetdword(path,'\0',256);
- malloc_tsetdword(row,'\0',256);
-
- sprintf(path,"conf/%s",file);
-
- if(!(fp=fopen(path,"r"))) {
- ShowError("Cannot find file: %s\n",path);
- return 0;
- }
-
- while(fgets(row,1023,fp)!=NULL) {
- if(row[0]=='/'&&row[1]=='/')
- continue;
- sscanf(row,"%[^:]: %255[^\r\n]",w1,w2);
- if(strcmpi(w1,"use_irc")==0) {
- if(strcmpi(w2,"on")==0)
- use_irc=1;
- else
- use_irc=0;
- }
- else if(strcmpi(w1,"irc_server")==0)
- strcpy(irc_ip_str,w2);
- else if(strcmpi(w1,"irc_port")==0)
- irc_port=atoi(w2);
- else if(strcmpi(w1,"irc_autojoin")==0)
- irc_autojoin=atoi(w2);
- else if(strcmpi(w1,"irc_channel")==0)
- strcpy(irc_channel,w2);
- else if(strcmpi(w1,"irc_channel_pass")==0)
- strcpy(irc_channel_pass,w2);
- else if(strcmpi(w1,"irc_trade_channel")==0)
- strcpy(irc_trade_channel,w2);
- else if(strcmpi(w1,"irc_nick")==0)
- strcpy(irc_nick,w2);
- else if(strcmpi(w1,"irc_pass")==0) {
- if(strcmpi(w2,"0")!=0)
- strcpy(irc_password,w2);
- }
- }
-
- ShowInfo("IRC Config read successfully\n");
-
- return 1;
-}
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/malloc.h"
+#include "../common/db.h"
+#include "../common/timer.h"
+#include "../common/strlib.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+#include "../common/version.h"
+#include "../common/nullpo.h"
+
+#include "map.h"
+#include "pc.h"
+#include "irc.h"
+#include "intif.h" //For GM Broadcast [Zido]
+
+short use_irc=0;
+
+short irc_autojoin=0;
+
+short irc_announce_flag=1;
+short irc_announce_mvp_flag=1;
+short irc_announce_jobchange_flag=1;
+short irc_announce_shop_flag=1;
+
+IRC_SI *irc_si=NULL;
+
+char irc_nick[30]="";
+char irc_password[32]="";
+
+char irc_channel[32]="";
+char irc_channel_pass[32]="";
+char irc_trade_channel[32]="";
+
+unsigned char irc_ip_str[128]="";
+unsigned long irc_ip=0;
+unsigned short irc_port = 6667;
+int irc_fd=0;
+
+struct channel_data cd;
+int last_cd_user=0;
+
+int irc_connect_timer(int tid, unsigned int tick, int id, int data)
+{
+ if(irc_si && session[irc_si->fd])
+ return 0;
+ //Ok, this ShowInfo and printf are a little ugly, but they are meant to
+ //debug just how long the code freezes here. [Skotlex]
+ ShowInfo("(IRC) Connecting to %s... ", irc_ip_str);
+ irc_fd = make_connection(irc_ip,irc_port);
+ if(irc_fd > 0){
+ printf("ok\n");
+ session[irc_fd]->func_parse = irc_parse;
+ } else
+ printf("failed\n");
+ return 0;
+}
+
+void irc_announce(char *buf)
+{
+ char send_string[256];
+ // malloc_tsetdword(send_string,'\0',256); // NOT REQUIRED
+
+ sprintf(send_string,"PRIVMSG %s :",irc_channel);
+ strcat(send_string, buf);
+ irc_send(send_string);
+}
+
+void irc_announce_jobchange(struct map_session_data *sd)
+{
+ char send_string[256];
+
+ nullpo_retv(sd);
+ malloc_tsetdword(send_string,'\0',256);
+
+ sprintf(send_string,"PRIVMSG %s :%s has changed into a %s.",irc_channel,sd->status.name,job_name(sd->status.class_));
+ irc_send(send_string);
+}
+
+void irc_announce_shop(struct map_session_data *sd, int flag)
+{
+ char send_string[256];
+ char mapname[16];
+ int maplen = 0;
+ nullpo_retv(sd);
+
+ malloc_tsetdword(send_string,'\0',256);
+ malloc_tsetdword(mapname,'\0',16);
+
+ if(flag){
+ strcpy(mapname, map[sd->bl.m].name);
+ maplen = strcspn(mapname,".");
+ mapname[maplen] = '\0';
+ mapname[0]=toupper(mapname[0]);
+
+ sprintf(send_string,"PRIVMSG %s :%s has opened a shop, %s, at <%d,%d> in %s.",irc_trade_channel,sd->status.name,sd->message,sd->bl.x,sd->bl.y,mapname);
+ } else
+ sprintf(send_string,"PRIVMSG %s :%s has closed their shop.",irc_trade_channel,sd->status.name);
+
+ irc_send(send_string);
+}
+
+void irc_announce_mvp(struct map_session_data *sd, struct mob_data *md)
+{
+ char send_string[256];
+ char mapname[16];
+ int maplen = 0;
+
+ nullpo_retv(sd);
+ nullpo_retv(md);
+
+ malloc_tsetdword(send_string,'\0',256);
+ malloc_tsetdword(mapname,'\0',16);
+ mapname[15]='\0'; // 15 is the final index, not 16 [Lance]
+ strcpy(mapname, map[md->bl.m].name);
+ maplen = strcspn(mapname,".");
+ mapname[maplen] = '\0';
+ mapname[0]=toupper(mapname[0]);
+
+ sprintf(send_string,"PRIVMSG %s :%s the %s has MVP'd %s in %s.",irc_channel,sd->status.name,job_name(sd->status.class_),md->name, mapname);
+ irc_send(send_string);
+}
+
+int irc_parse(int fd)
+{
+ if (session[fd]->eof){
+ do_close(fd);
+ irc_si = NULL;
+ add_timer(gettick() + 15000, irc_connect_timer, 0, 0);
+ return 0;
+ }
+ if (session[fd]->session_data == NULL){
+ irc_si = (struct IRC_Session_Info*)aMalloc(sizeof(struct IRC_Session_Info));
+ irc_si->fd = fd;
+ irc_si->state = 0;
+ session[fd]->session_data = irc_si;
+ } else if (!irc_si) {
+ irc_si = (struct IRC_Session_Info*)session[fd]->session_data;
+ irc_si->fd = fd;
+ }
+ if(RFIFOREST(fd) > 0){
+ char *incoming_string=aMalloc(RFIFOREST(fd)*sizeof(char));
+ RFIFOHEAD(fd);
+ memcpy(incoming_string,RFIFOP(fd,0),RFIFOREST(fd));
+ send_to_parser(fd,incoming_string,"\n");
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ aFree(incoming_string);
+ }
+ return 0;
+}
+
+int irc_keepalive_timer(int tid, unsigned int tick, int id, int data)
+{
+ char send_string[128];
+ malloc_tsetdword(send_string,'\0',128);
+
+ sprintf(send_string,"PRIVMSG %s : ", irc_nick);
+ irc_send(send_string);
+ add_timer(gettick() + 30000, irc_keepalive_timer, 0, 0);
+ return 0;
+}
+
+void irc_send_sub(int fd, char transmit[4096])
+{
+ sprintf(transmit,"%s%c",transmit,10);
+ WFIFOHEAD(fd,strlen(transmit));
+ memcpy(WFIFOP(fd,0),transmit, strlen(transmit));
+ WFIFOSET(fd,strlen(transmit));
+}
+
+void irc_send(char *buf)
+{
+ char transmit[4096];
+
+ if(!irc_si || !session[irc_si->fd])
+ return;
+
+ malloc_tsetdword(transmit,'\0',4096);
+
+ sprintf(transmit,buf);
+ irc_send_sub(irc_si->fd,transmit);
+}
+
+void irc_parse_sub(int fd, char *incoming_string)
+{
+ char source[256];
+ char command[256];
+ char target[256];
+ char message[8192];
+ char send_string[8192];
+ char *source_nick=NULL;
+ char *source_ident=NULL;
+ char *source_host=NULL;
+ char *state_mgr=NULL;
+
+ char cmd1[256];
+ char cmd2[256];
+ char cmdname[256];
+ char cmdargs[256];
+
+ int users=0;
+ int i=0;
+
+ struct map_session_data **allsd;
+
+ malloc_tsetdword(source,'\0',256);
+ malloc_tsetdword(command,'\0',256);
+ malloc_tsetdword(target,'\0',256);
+ malloc_tsetdword(message,'\0',8192);
+ malloc_tsetdword(send_string,'\0',8192);
+
+ malloc_tsetdword(cmd1,'\0',256);
+ malloc_tsetdword(cmd2,'\0',256);
+ malloc_tsetdword(cmdname,'\0',256);
+ malloc_tsetdword(cmdargs,'\0',256);
+
+ sscanf(incoming_string, ":%255s %255s %255s :%4095[^\r\n]", source, command, target, message);
+ if (source != NULL) {
+ if (strstr(source,"!") != NULL) {
+ source_nick = strtok_r(source,"!",&state_mgr);
+ source_ident = strtok_r(NULL,"@",&state_mgr);
+ source_host = strtok_r(NULL,"%%",&state_mgr);
+ }
+ }
+ if (irc_si->state == 0){
+ sprintf(send_string, "NICK %s", irc_nick);
+ irc_send(send_string);
+ sprintf(send_string, "USER eABot 8 * : eABot");
+ irc_send(send_string);
+ irc_si->state = 1;
+ }
+ else if (irc_si->state == 1){
+ if(!strcmp(command,"001")){
+ ShowStatus("IRC: Connected to IRC.\n");
+ sprintf(send_string, "PRIVMSG nickserv :identify %s", irc_password);
+ irc_send(send_string);
+ sprintf(send_string, "JOIN %s %s", irc_channel, irc_channel_pass);
+ irc_send(send_string);
+ sprintf(send_string,"NAMES %s",irc_channel);
+ irc_send(send_string);
+ irc_si->state = 2;
+ }
+ else if(!strcmp(command,"433")){
+ ShowError("IRC: Nickname %s is already taken, IRC Client unable to connect.\n", irc_nick);
+ sprintf(send_string, "QUIT");
+ irc_send(send_string);
+ if(session[fd])
+ session[fd]->eof=1;
+ }
+ }
+ else if (irc_si->state == 2){
+ if(!strcmp(source, "PING")){
+ sprintf(send_string, "PONG %s", command);
+ irc_send(send_string);
+ }
+
+ else if((strcmpi(target,irc_channel)==0)||(strcmpi(target,irc_channel+1)==0)) {
+
+ // Broadcast [Zido] (Work in Progress)
+ if((strcmpi(command,"privmsg")==0)&&(sscanf(message,"@%255s %255[^\r\n]",cmdname,cmdargs)>0)&&(target[0]=='#')) {
+ if(strcmpi(cmdname,"kami")==0) {
+ if(get_access(source_nick)<ACCESS_OP)
+ sprintf(send_string,"NOTICE %s :Access Denied",source_nick);
+ else {
+ sprintf(send_string,"%s: %s",source_nick,cmdargs);
+ intif_GMmessage(send_string,strlen(send_string)+1,0);
+ sprintf(send_string,"NOTICE %s :Message Sent",source_nick);
+ }
+ irc_send(send_string);
+ // Number of users online [Zido]
+ } else if(strcmpi(cmdname,"users")==0) {
+ map_getallusers(&users);
+ sprintf(send_string,"PRIVMSG %s :Users Online: %d",irc_channel,users);
+ irc_send(send_string);
+ // List all users online [Zido]
+ } else if(strcmpi(cmdname,"who")==0) {
+ allsd=map_getallusers(&users);
+ if(users>0) {
+ sprintf(send_string,"NOTICE %s :%d Users Online",source_nick,users);
+ irc_send(send_string);
+ for(i=0;i<users;i++) {
+ sprintf(send_string,"NOTICE %s :Name: \"%s\"",source_nick,allsd[i]->status.name);
+ irc_send(send_string);
+ }
+ } else {
+ sprintf(send_string,"NOTICE %s :No Users Online",source_nick);
+ irc_send(send_string);
+ }
+ }
+ }
+
+ // Refresh Names [Zido]
+ else if((strcmpi(command,"join")==0)||(strcmpi(command,"part")==0)||(strcmpi(command,"mode")==0)||(strcmpi(command,"nick")==0)) {
+ ShowInfo("IRC: Refreshing User List");
+ irc_rmnames();
+ printf("...");
+ sprintf(send_string,"NAMES %s",irc_channel);
+ printf("...");
+ irc_send(send_string);
+ printf("Done\n");
+ }
+
+ // Autojoin on kick [Zido]
+ else if((strcmpi(command,"kick")==0)&&(irc_autojoin==1)) {
+ sprintf(send_string, "JOIN %s %s", target, irc_channel_pass);
+ irc_send(send_string);
+ }
+ }
+
+ // Names Reply [Zido]
+ else if((strcmpi(command,"353")==0)) {
+ ShowInfo("IRC: NAMES recieved\n");
+ parse_names_packet(incoming_string);
+ }
+ }
+
+ return;
+}
+
+int send_to_parser(int fd, char *input,char key[2])
+{
+ char *temp_string=NULL;
+ char *state_mgr=NULL;
+ int total_loops=0;
+
+ temp_string = strtok_r(input,key,&state_mgr);
+ while (temp_string != NULL){
+ total_loops = total_loops+1;
+ irc_parse_sub(fd,temp_string);
+ temp_string = strtok_r(NULL,key,&state_mgr);
+ }
+ return total_loops;
+}
+
+void do_final_irc(void)
+{
+
+}
+
+void do_init_irc(void)
+{
+ if(!use_irc)
+ return;
+ if (irc_ip_str[strlen(irc_ip_str)-1] == '\n')
+ irc_ip_str[strlen(irc_ip_str)-1] = '\0';
+ irc_ip = resolve_hostbyname(irc_ip_str, NULL, irc_ip_str);
+ if (!irc_ip)
+ {
+ ShowError("Unable to resolve %s! Cannot connect to IRC server, disabling irc_bot.\n", irc_ip_str);
+ use_irc = 0;
+ return;
+ }
+
+ irc_connect_timer(0, 0, 0, 0);
+
+ add_timer_func_list(irc_connect_timer, "irc_connect_timer");
+ add_timer_func_list(irc_keepalive_timer, "irc_keepalive_timer");
+ add_timer(gettick() + 30000, irc_keepalive_timer, 0, 0);
+}
+
+//NAMES Packet(353) parser [Zido]
+int parse_names_packet(char *str) {
+ char *tok;
+ char source[256];
+ char numeric[10];
+ char target[256];
+ char channel[256];
+ char names[1024];
+
+ malloc_tsetdword(source,'\0',256);
+ malloc_tsetword(numeric,'\0',10);
+ malloc_tsetdword(target,'\0',256);
+ malloc_tsetdword(channel,'\0',256);
+ malloc_tsetdword(names,'\0',1024);
+
+ tok=strtok(str,"\r\n");
+ sscanf(tok,":%255s %10s %255s %*1[=@] %255s :%1023[^\r\n]",source,numeric,target,channel,names);
+ if(strcmpi(numeric,"353")==0)
+ parse_names(names);
+
+ while((tok=strtok(NULL,"\r\n"))!=NULL) {
+ sscanf(tok,":%255s %10s %255s %*1[=@] %255s :%1023[^\r\n]",source,numeric,target,channel,names);
+ if(strcmpi(numeric,"353")==0)
+ parse_names(names);
+ }
+
+ return 0;
+}
+
+//User access level prefix parser [Zido]
+int parse_names(char *str) {
+ char *tok;
+ if (str == NULL) return 0; //Nothing to parse!
+ tok=strtok(str," ");
+ switch(tok[0]) {
+ case '~':
+ set_access(tok+1,ACCESS_OWNER);
+ break;
+ case '&':
+ set_access(tok+1,ACCESS_SOP);
+ break;
+ case '@':
+ set_access(tok+1,ACCESS_OP);
+ break;
+ case '%':
+ set_access(tok+1,ACCESS_HOP);
+ break;
+ case '+':
+ set_access(tok+1,ACCESS_VOICE);
+ break;
+ default:
+ set_access(tok,ACCESS_NORM);
+ break;
+ }
+
+ while((tok=strtok(NULL," "))!=NULL) {
+ switch(tok[0]) {
+ case '~':
+ set_access(tok+1,ACCESS_OWNER);
+ break;
+ case '&':
+ set_access(tok+1,ACCESS_SOP);
+ break;
+ case '@':
+ set_access(tok+1,ACCESS_OP);
+ break;
+ case '%':
+ set_access(tok+1,ACCESS_HOP);
+ break;
+ case '+':
+ set_access(tok+1,ACCESS_VOICE);
+ break;
+ default:
+ set_access(tok,ACCESS_NORM);
+ break;
+ }
+ }
+
+ return 1;
+}
+
+//Store user's access level [Zido]
+int set_access(char *nick,int newlevel) {
+ int i=0;
+
+ for(i=0;i<=MAX_CHANNEL_USERS;i++) {
+ if(strcmpi(cd.user[i].name,nick)==0) {
+ cd.user[i].level=newlevel;
+ return 1;
+ }
+ }
+
+ strcpy(cd.user[last_cd_user].name,nick);
+ cd.user[last_cd_user].level=newlevel;
+ last_cd_user++;
+
+ return 0;
+}
+
+//Returns users access level [Zido]
+int get_access(char *nick) {
+ int i=0;
+
+ for(i=0;i<=MAX_CHANNEL_USERS;i++) {
+ if(strcmpi(cd.user[i].name,nick)==0) {
+ return (cd.user[i].level);
+ }
+ }
+
+ return -1;
+}
+
+int irc_rmnames() {
+ int i=0;
+
+ for(i=0;i<=MAX_CHANNEL_USERS;i++) {
+ //malloc_tsetdword(cd.user[i].name,'\0',256);
+ cd.user[i].level=0;
+ }
+
+ last_cd_user=0;
+
+
+ return 0;
+}
+
+int irc_read_conf(char *file) {
+ FILE *fp=NULL;
+ char w1[256];
+ char w2[256];
+ char path[256];
+ char row[1024];
+
+ malloc_tsetdword(w1,'\0',256);
+ malloc_tsetdword(w2,'\0',256);
+ malloc_tsetdword(path,'\0',256);
+ malloc_tsetdword(row,'\0',256);
+
+ sprintf(path,"conf/%s",file);
+
+ if(!(fp=fopen(path,"r"))) {
+ ShowError("Cannot find file: %s\n",path);
+ return 0;
+ }
+
+ while(fgets(row,1023,fp)!=NULL) {
+ if(row[0]=='/'&&row[1]=='/')
+ continue;
+ sscanf(row,"%[^:]: %255[^\r\n]",w1,w2);
+ if(strcmpi(w1,"use_irc")==0) {
+ if(strcmpi(w2,"on")==0)
+ use_irc=1;
+ else
+ use_irc=0;
+ }
+ else if(strcmpi(w1,"irc_server")==0)
+ strcpy(irc_ip_str,w2);
+ else if(strcmpi(w1,"irc_port")==0)
+ irc_port=atoi(w2);
+ else if(strcmpi(w1,"irc_autojoin")==0)
+ irc_autojoin=atoi(w2);
+ else if(strcmpi(w1,"irc_channel")==0)
+ strcpy(irc_channel,w2);
+ else if(strcmpi(w1,"irc_channel_pass")==0)
+ strcpy(irc_channel_pass,w2);
+ else if(strcmpi(w1,"irc_trade_channel")==0)
+ strcpy(irc_trade_channel,w2);
+ else if(strcmpi(w1,"irc_nick")==0)
+ strcpy(irc_nick,w2);
+ else if(strcmpi(w1,"irc_pass")==0) {
+ if(strcmpi(w2,"0")!=0)
+ strcpy(irc_password,w2);
+ }
+ }
+
+ ShowInfo("IRC Config read successfully\n");
+
+ return 1;
+}
diff --git a/src/map/irc.h b/src/map/irc.h
index 5c321605b..2297f013b 100644
--- a/src/map/irc.h
+++ b/src/map/irc.h
@@ -1,55 +1,55 @@
-#include "map.h"
-
-// IRC .conf file [Zido]
-#define IRC_CONF "irc_athena.conf"
-
-// IRC Access levels [Zido]
-#define ACCESS_OWNER 5
-#define ACCESS_SOP 4
-#define ACCESS_OP 3
-#define ACCESS_HOP 2
-#define ACCESS_VOICE 1
-#define ACCESS_NORM 0
-
-#define MAX_CHANNEL_USERS 500
-
-extern short use_irc;
-
-extern short irc_announce_flag;
-extern short irc_announce_mvp_flag;
-extern short irc_announce_shop_flag;
-extern short irc_announce_jobchange_flag;
-
-void irc_announce(char *buf);
-void irc_announce_jobchange(struct map_session_data *sd);
-void irc_announce_shop(struct map_session_data *sd,int flag);
-void irc_announce_mvp(struct map_session_data *sd, struct mob_data *md);
-
-int irc_parse(int fd);
-void do_final_irc(void);
-void do_init_irc(void);
-void irc_send(char *buf);
-void irc_parse_sub(int fd, char *incoming_string);
-int send_to_parser(int fd, char *input,char key[2]);
-struct IRC_Session_Info {
- int state;
- int fd;
- char username[30];
- char password[33];
-};
-
-typedef struct IRC_Session_Info IRC_SI;
-
-struct channel_data {
- struct {
- char name[256];
- int level;
- }user[MAX_CHANNEL_USERS];
-};
-
-int parse_names_packet(char *str); // [Zido]
-int parse_names(char *str); // [Zido]
-int set_access(char *nick,int level); // [Zido]
-int get_access(char *nick); // [Zido]
-int irc_rmnames(void); // [Zido]
-int irc_read_conf(char *file); // [Zido]
+#include "map.h"
+
+// IRC .conf file [Zido]
+#define IRC_CONF "irc_athena.conf"
+
+// IRC Access levels [Zido]
+#define ACCESS_OWNER 5
+#define ACCESS_SOP 4
+#define ACCESS_OP 3
+#define ACCESS_HOP 2
+#define ACCESS_VOICE 1
+#define ACCESS_NORM 0
+
+#define MAX_CHANNEL_USERS 500
+
+extern short use_irc;
+
+extern short irc_announce_flag;
+extern short irc_announce_mvp_flag;
+extern short irc_announce_shop_flag;
+extern short irc_announce_jobchange_flag;
+
+void irc_announce(char *buf);
+void irc_announce_jobchange(struct map_session_data *sd);
+void irc_announce_shop(struct map_session_data *sd,int flag);
+void irc_announce_mvp(struct map_session_data *sd, struct mob_data *md);
+
+int irc_parse(int fd);
+void do_final_irc(void);
+void do_init_irc(void);
+void irc_send(char *buf);
+void irc_parse_sub(int fd, char *incoming_string);
+int send_to_parser(int fd, char *input,char key[2]);
+struct IRC_Session_Info {
+ int state;
+ int fd;
+ char username[30];
+ char password[33];
+};
+
+typedef struct IRC_Session_Info IRC_SI;
+
+struct channel_data {
+ struct {
+ char name[256];
+ int level;
+ }user[MAX_CHANNEL_USERS];
+};
+
+int parse_names_packet(char *str); // [Zido]
+int parse_names(char *str); // [Zido]
+int set_access(char *nick,int level); // [Zido]
+int get_access(char *nick); // [Zido]
+int irc_rmnames(void); // [Zido]
+int irc_read_conf(char *file); // [Zido]
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index 62d40fe51..b6626fa41 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -1,1277 +1,1277 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-#include "../common/grfio.h"
-#include "../common/strlib.h"
-#include "map.h"
-#include "battle.h"
-#include "itemdb.h"
-#include "script.h"
-#include "pc.h"
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-static struct dbt* item_db;
-
-static struct item_group itemgroup_db[MAX_ITEMGROUP];
-
-struct item_data dummy_item; //This is the default dummy item used for non-existant items. [Skotlex]
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ—p
- *------------------------------------------
- */
-// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
-int itemdb_searchname_sub(DBKey key,void *data,va_list ap)
-{
- struct item_data *item=(struct item_data *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct item_data **);
- if(item == &dummy_item) return 0;
- if( strcmpi(item->name,str)==0 ) //by lupus
- *dst=item;
- return 0;
-}
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ—p
- *------------------------------------------
- */
-int itemdb_searchjname_sub(int key,void *data,va_list ap)
-{
- struct item_data *item=(struct item_data *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct item_data **);
- if(item == &dummy_item) return 0;
- if( strcmpi(item->jname,str)==0 )
- *dst=item;
- return 0;
-}
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_searchname(const char *str)
-{
- struct item_data *item=NULL;
- item_db->foreach(item_db,itemdb_searchname_sub,str,&item);
- return item;
-}
-
-static int itemdb_searchname_array_sub(DBKey key,void * data,va_list ap)
-{
- struct item_data *item=(struct item_data *)data;
- char *str;
- str=va_arg(ap,char *);
- if (item == &dummy_item)
- return 1; //Invalid item.
- if(stristr(item->jname,str))
- return 0;
- if(stristr(item->name,str))
- return 0;
- return strcmpi(item->jname,str);
-}
-
-/*==========================================
- * Founds up to N matches. Returns number of matches [Skotlex]
- *------------------------------------------
- */
-int itemdb_searchname_array(struct item_data** data, int size, const char *str)
-{
- return item_db->getall(item_db,(void**)data,size,itemdb_searchname_array_sub,str);
-}
-
-
-/*==========================================
- * ” ŒnƒAƒCƒeƒ€ŒŸõ
- *------------------------------------------
- */
-int itemdb_searchrandomid(int group)
-{
- if(group<1 || group>=MAX_ITEMGROUP) {
- if (battle_config.error_log)
- ShowError("itemdb_searchrandomid: Invalid group id %d\n", group);
- return UNKNOWN_ITEM_ID;
- }
- if (itemgroup_db[group].qty)
- return itemgroup_db[group].nameid[rand()%itemgroup_db[group].qty];
-
- if (battle_config.error_log)
- ShowError("itemdb_searchrandomid: No item entries for group id %d\n", group);
- return UNKNOWN_ITEM_ID;
-}
-
-/*==========================================
- * Calculates total item-group related bonuses for the given item. [Skotlex]
- *------------------------------------------
- */
-int itemdb_group_bonus(struct map_session_data *sd, int itemid)
-{
- int bonus = 0, i, j;
- for (i=0; i < MAX_ITEMGROUP; i++) {
- if (!sd->itemgrouphealrate[i])
- continue;
- for (j=0; j < itemgroup_db[i].qty; j++) {
- if (itemgroup_db[i].nameid[j] == itemid)
- {
- bonus += sd->itemgrouphealrate[i];
- continue;
- }
- }
- }
- return bonus;
-}
-
-/*==========================================
- * DB‚Ì‘¶ÝŠm”F
- *------------------------------------------
- */
-struct item_data* itemdb_exists(int nameid)
-{
- struct item_data* id;
- if (!nameid) return NULL;
- id = idb_get(item_db,nameid);
- //Adjust nameid in case it's used outside. [Skotlex]
- if (id == &dummy_item)
- dummy_item.nameid = nameid;
- return id;
-}
-
-/*==========================================
- * Converts the jobid from the format in itemdb
- * to the format used by the map server. [Skotlex]
- *------------------------------------------
- */
-static void itemdb_jobid2mapid(unsigned int *bclass, unsigned int jobmask)
-{
- int i;
- bclass[0]= bclass[1]= bclass[2]= 0;
- //Base classes
- if (jobmask & 1<<JOB_NOVICE)
- { //Both Novice/Super-Novice are counted with the same ID
- bclass[0] |= 1<<MAPID_NOVICE;
- bclass[1] |= 1<<MAPID_NOVICE;
- }
- for (i = JOB_NOVICE+1; i <= JOB_THIEF; i++)
- {
- if (jobmask & 1<<i)
- bclass[0] |= 1<<(MAPID_NOVICE+i);
- }
- //2-1 classes
- if (jobmask & 1<<JOB_KNIGHT)
- bclass[1] |= 1<<MAPID_SWORDMAN;
- if (jobmask & 1<<JOB_PRIEST)
- bclass[1] |= 1<<MAPID_ACOLYTE;
- if (jobmask & 1<<JOB_WIZARD)
- bclass[1] |= 1<<MAPID_MAGE;
- if (jobmask & 1<<JOB_BLACKSMITH)
- bclass[1] |= 1<<MAPID_MERCHANT;
- if (jobmask & 1<<JOB_HUNTER)
- bclass[1] |= 1<<MAPID_ARCHER;
- if (jobmask & 1<<JOB_ASSASSIN)
- bclass[1] |= 1<<MAPID_THIEF;
- //2-2 classes
- if (jobmask & 1<<JOB_CRUSADER)
- bclass[2] |= 1<<MAPID_SWORDMAN;
- if (jobmask & 1<<JOB_MONK)
- bclass[2] |= 1<<MAPID_ACOLYTE;
- if (jobmask & 1<<JOB_SAGE)
- bclass[2] |= 1<<MAPID_MAGE;
- if (jobmask & 1<<JOB_ALCHEMIST)
- bclass[2] |= 1<<MAPID_MERCHANT;
- if (jobmask & 1<<JOB_BARD)
- bclass[2] |= 1<<MAPID_ARCHER;
-// Bard/Dancer share the same slot now.
-// if (jobmask & 1<<JOB_DANCER)
-// bclass[2] |= 1<<MAPID_ARCHER;
- if (jobmask & 1<<JOB_ROGUE)
- bclass[2] |= 1<<MAPID_THIEF;
- //Special classes that don't fit above.
- if (jobmask & 1<<21) //Taekwon boy
- bclass[0] |= 1<<MAPID_TAEKWON;
- if (jobmask & 1<<22) //Star Gladiator
- bclass[1] |= 1<<MAPID_TAEKWON;
- if (jobmask & 1<<23) //Soul Linker
- bclass[2] |= 1<<MAPID_TAEKWON;
- if (jobmask & 1<<JOB_GUNSLINGER)
- bclass[0] |= 1<<MAPID_GUNSLINGER;
- if (jobmask & 1<<JOB_NINJA)
- bclass[0] |= 1<<MAPID_NINJA;
-}
-
-static void create_dummy_data(void) {
- malloc_set(&dummy_item, 0, sizeof(struct item_data));
- dummy_item.nameid=500;
- dummy_item.weight=1;
- dummy_item.value_sell = 1;
- dummy_item.type=3; //Etc item
- strncpy(dummy_item.name,"UNKNOWN_ITEM",ITEM_NAME_LENGTH-1);
- strncpy(dummy_item.jname,"UNKNOWN_ITEM",ITEM_NAME_LENGTH-1);
- dummy_item.view_id = UNKNOWN_ITEM_ID;
-}
-
-static void* create_item_data(DBKey key, va_list args) {
- struct item_data *id;
- id=(struct item_data *)aCalloc(1,sizeof(struct item_data));
- id->nameid = key.i;
- id->weight=1;
- id->type=IT_ETC;
- return id;
-}
-
-/*==========================================
- * Loads (and creates if not found) an item from the db.
- *------------------------------------------
- */
-struct item_data* itemdb_load(int nameid)
-{
- struct item_data *id = idb_ensure(item_db,nameid,create_item_data);
- if (id == &dummy_item)
- { //Remove dummy_item, replace by real data.
- DBKey key;
- key.i = nameid;
- idb_remove(item_db,nameid);
- id = create_item_data(key, NULL);
- idb_put(item_db,nameid,id);
- }
- return id;
-}
-
-static void* return_dummy_data(DBKey key, va_list args) {
- if (battle_config.error_log)
- ShowWarning("itemdb_search: Item ID %d does not exists in the item_db. Using dummy data.\n", key.i);
- dummy_item.nameid = key.i;
- return &dummy_item;
-}
-
-/*==========================================
- * Loads an item from the db. If not found, it will return the dummy item.
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- return idb_ensure(item_db,nameid,return_dummy_data);
-}
-
-/*==========================================
- * Returns if given item is a player-equippable piece.
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- switch (type) {
- case IT_WEAPON:
- case IT_ARMOR:
- case IT_AMMO:
- return 1;
- default:
- return 0;
- }
-}
-
-/*==========================================
- * Alternate version of itemdb_isequip
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- nullpo_retr(0, data);
- switch(data->type) {
- case IT_WEAPON:
- case IT_ARMOR:
- case IT_AMMO:
- return 1;
- default:
- return 0;
- }
-}
-
-/*==========================================
-* Returns if given item's type is stackable.
-*------------------------------------------
-*/
-int itemdb_isstackable(int nameid)
-{
- int type=itemdb_type(nameid);
- switch(type) {
- case IT_WEAPON:
- case IT_ARMOR:
- case IT_PETEGG:
- case IT_PETARMOR:
- return 0;
- default:
- return 1;
- }
-}
-
-/*==========================================
-* Alternate version of itemdb_isstackable
-*------------------------------------------
-*/
-int itemdb_isstackable2(struct item_data *data)
-{
- nullpo_retr(0, data);
- switch(data->type) {
- case IT_WEAPON:
- case IT_ARMOR:
- case IT_PETEGG:
- case IT_PETARMOR:
- return 0;
- default:
- return 1;
- }
-}
-
-
-/*==========================================
- * Trade Restriction functions [Skotlex]
- *------------------------------------------
- */
-int itemdb_isdropable_sub(struct item_data *item, int gmlv, int unused)
-{
- return (item && (!(item->flag.trade_restriction&1) || gmlv >= item->gm_lv_trade_override));
-}
-
-int itemdb_cantrade_sub(struct item_data* item, int gmlv, int gmlv2)
-{
- return (item && (!(item->flag.trade_restriction&2) || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
-}
-
-int itemdb_canpartnertrade_sub(struct item_data* item, int gmlv, int gmlv2)
-{
- return (item && (item->flag.trade_restriction&4 || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
-}
-
-int itemdb_cansell_sub(struct item_data* item, int gmlv, int unused)
-{
- return (item && (!(item->flag.trade_restriction&8) || gmlv >= item->gm_lv_trade_override));
-}
-
-int itemdb_cancartstore_sub(struct item_data* item, int gmlv, int unused)
-{
- return (item && (!(item->flag.trade_restriction&16) || gmlv >= item->gm_lv_trade_override));
-}
-
-int itemdb_canstore_sub(struct item_data* item, int gmlv, int unused)
-{
- return (item && (!(item->flag.trade_restriction&32) || gmlv >= item->gm_lv_trade_override));
-}
-
-int itemdb_canguildstore_sub(struct item_data* item, int gmlv, int unused)
-{
- return (item && (!(item->flag.trade_restriction&64) || gmlv >= item->gm_lv_trade_override));
-}
-
-int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int))
-{
- struct item_data* item_data = itemdb_search(item->nameid);
- int i;
-
- if (!func(item_data, gmlv, gmlv2))
- return 0;
-
- if(item_data->slot == 0 || itemdb_isspecial(item->card[0]))
- return 1;
-
- for(i = 0; i < item_data->slot; i++) {
- if (!item->card[i]) continue;
- if (!func(itemdb_search(item->card[i]), gmlv, gmlv2))
- return 0;
- }
- return 1;
-}
-
-/*==========================================
- * Specifies if item-type should drop unidentified.
- *------------------------------------------
- */
-int itemdb_isidentified(int nameid)
-{
- int type=itemdb_type(nameid);
- switch (type) {
- case IT_WEAPON:
- case IT_ARMOR:
- case IT_PETARMOR:
- return 0;
- default:
- return 1;
- }
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€Žg—p‰Â”\ƒtƒ‰ƒO‚̃I[ƒo[ƒ‰ƒCƒh
- *------------------------------------------
- */
-static int itemdb_read_itemavail (void)
-{
- FILE *fp;
- int nameid, j, k, ln = 0;
- char line[1024], *str[10], *p;
- struct item_data *id;
-
- sprintf(line, "%s/item_avail.txt", db_path);
- if ((fp = fopen(line,"r")) == NULL) {
- ShowError("can't read %s\n", line);
- return -1;
- }
-
- while (fgets(line, sizeof(line) - 1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- malloc_tsetdword(str, 0, sizeof(str));
- for (j = 0, p = line; j < 2 && p; j++) {
- str[j] = p;
- p = strchr(p, ',');
- if(p) *p++ = 0;
- }
-
- if (j < 2 || str[0] == NULL ||
- (nameid = atoi(str[0])) < 0 || !(id = itemdb_exists(nameid)))
- continue;
-
- k = atoi(str[1]);
- if (k > 0) {
- id->flag.available = 1;
- id->view_id = k;
- } else
- id->flag.available = 0;
- ln++;
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, "item_avail.txt");
-
- return 0;
-}
-
-/*==========================================
- * read item group data
- *------------------------------------------
- */
-static void itemdb_read_itemgroup_sub(const char* filename)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int groupid,j,k,nameid;
- char *str[3],*p;
- char w1[1024], w2[1024];
-
- if( (fp=fopen(filename,"r"))==NULL ){
- ShowError("can't read %s\n", line);
- return;
- }
-
- while(fgets(line,1020,fp)){
- ln++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(strstr(line,"import")) {
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2 &&
- strcmpi(w1, "import") == 0) {
- itemdb_read_itemgroup_sub(w2);
- continue;
- }
- }
- malloc_tsetdword(str,0,sizeof(str));
- for(j=0,p=line;j<3 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(str[0]==NULL)
- continue;
- if (j<3) {
- if (j>1) //Or else it barks on blank lines...
- ShowWarning("itemdb_read_itemgroup: Insufficient fields for entry at %s:%d\n", filename, ln);
- continue;
- }
- groupid = atoi(str[0]);
- if (groupid < 0 || groupid >= MAX_ITEMGROUP) {
- ShowWarning("itemdb_read_itemgroup: Invalid group %d in %s:%d\n", groupid, filename, ln);
- continue;
- }
- nameid = atoi(str[1]);
- if (!itemdb_exists(nameid)) {
- ShowWarning("itemdb_read_itemgroup: Non-existant item %d in %s:%d\n", nameid, filename, ln);
- continue;
- }
- k = atoi(str[2]);
- if (itemgroup_db[groupid].qty+k > MAX_RANDITEM) {
- ShowWarning("itemdb_read_itemgroup: Group %d is full (%d entries) in %s:%d\n", groupid, MAX_RANDITEM, filename, ln);
- continue;
- }
- for(j=0;j<k;j++)
- itemgroup_db[groupid].nameid[itemgroup_db[groupid].qty++] = nameid;
- }
- fclose(fp);
- return;
-}
-
-static void itemdb_read_itemgroup(void)
-{
- char path[256];
- int i;
- const char* groups[] = {
- "Blue Box",
- "Violet Box",
- "Card Album",
- "Gift Box",
- "Scroll Box",
- "Finding Ore",
- "Cookie Bag",
- "Potion",
- "Herbs",
- "Fruits",
- "Meat",
- "Candy",
- "Juice",
- "Fish",
- "Boxes",
- "Gemstone",
- "Jellopy",
- "Ore",
- "Food",
- "Recovery",
- "Minerals",
- "Taming",
- "Scrolls",
- "Quivers",
- "Masks",
- "Accesory",
- "Jewels",
- "Gift Box 1",
- "Gift Box 2",
- "Gift Box 3",
- "Gift Box 4",
- "Egg Boy",
- "Egg Girl",
- "Gift Box China",
- "Lotto Box",
- };
- malloc_tsetdword(&itemgroup_db, 0, sizeof(itemgroup_db));
- snprintf(path, 255, "%s/item_group_db.txt", db_path);
- itemdb_read_itemgroup_sub(path);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","item_group_db.txt");
- if (battle_config.etc_log) {
- for (i = 1; i < MAX_ITEMGROUP; i++)
- ShowInfo("Group %s: %d entries.\n", groups[i-1], itemgroup_db[i].qty);
- }
- return;
-}
-/*==========================================
- * ƒAƒCƒeƒ€‚Ì–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_itemnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_reads("data\\idnum2itemdisplaynametable.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid;
- char buf2[64]; //Why 64? What's this for, other than holding an item's name? [Skotlex]
-
- if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
-
-#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
- if( itemdb_exists(nameid) &&
- strncmp(itemdb_search(nameid)->jname,buf2,ITEM_NAME_LENGTH)!=0 ){
- ShowNotice("[override] %d %s => %s\n",nameid
- ,itemdb_search(nameid)->jname,buf2);
- }
-#endif
-
- strncpy(itemdb_search(nameid)->jname,buf2,ITEM_NAME_LENGTH-1);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\idnum2itemdisplaynametable.txt");
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒhƒCƒ‰ƒXƒg‚̃Šƒ\[ƒX–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_cardillustnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_reads("data\\num2cardillustnametable.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid;
- char buf2[64];
-
- if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
- strcat(buf2,".bmp");
- memcpy(itemdb_search(nameid)->cardillustname,buf2,64);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\num2cardillustnametable.txt");
-
- return 0;
-}
-
-//
-// ‰Šú‰»
-//
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_read_itemslottable(void)
-{
- char *buf, *p;
- int s;
-
- buf = (char *)grfio_reads("data\\itemslottable.txt", &s);
- if (buf == NULL)
- return -1;
- buf[s] = 0;
- for (p = buf; p - buf < s; ) {
- int nameid, equip;
- struct item_data* item;
- sscanf(p, "%d#%d#", &nameid, &equip);
- item = itemdb_search(nameid);
- if (equip && item && itemdb_isequip2(item))
- item->equip = equip;
- p = strchr(p, 10);
- if(!p) break;
- p++;
- p=strchr(p, 10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslottable.txt");
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_read_itemslotcounttable(void)
-{
- char *buf, *p;
- int s;
-
- buf = (char *)grfio_reads("data\\itemslotcounttable.txt", &s);
- if (buf == NULL)
- return -1;
- buf[s] = 0;
- for (p = buf; p - buf < s;){
- int nameid, slot;
- sscanf(p, "%d#%d#", &nameid, &slot);
- if (slot > MAX_SLOTS)
- {
- ShowWarning("itemdb_read_itemslotcounttable: Item %d specifies %d slots, but the server only supports up to %d\n", nameid, slot, MAX_SLOTS);
- slot = MAX_SLOTS;
- }
- itemdb_slot(nameid) = slot;
- p = strchr(p,10);
- if(!p) break;
- p++;
- p = strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "data\\itemslotcounttable.txt");
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ§ŒÀƒtƒ@ƒCƒ‹“Ç‚Ýo‚µ
- *------------------------------------------
- */
-static int itemdb_read_noequip(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,j;
- char *str[32],*p;
- struct item_data *id;
-
- sprintf(line, "%s/item_noequip.txt", db_path);
- if( (fp=fopen(line,"r"))==NULL ){
- ShowError("can't read %s\n", line);
- return -1;
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- malloc_tsetdword(str,0,sizeof(str));
- for(j=0,p=line;j<2 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0 || !(id=itemdb_exists(nameid)))
- continue;
-
- id->flag.no_equip=atoi(str[1]);
-
- ln++;
-
- }
- fclose(fp);
- if (ln > 0) {
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"item_noequip.txt");
- }
- return 0;
-}
-
-/*==========================================
- * Reads item trade restrictions [Skotlex]
- *------------------------------------------
- */
-static int itemdb_read_itemtrade(void)
-{
- FILE *fp;
- int nameid, j, flag, gmlv, ln = 0;
- char line[1024], *str[10], *p;
- struct item_data *id;
-
- sprintf(line, "%s/item_trade.txt", db_path);
- if ((fp = fopen(line,"r")) == NULL) {
- ShowError("can't read %s\n", line);
- return -1;
- }
-
- while (fgets(line, sizeof(line) - 1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- malloc_tsetdword(str, 0, sizeof(str));
- for (j = 0, p = line; j < 3 && p; j++) {
- str[j] = p;
- p = strchr(p, ',');
- if(p) *p++ = 0;
- }
-
- if (j < 3 || str[0] == NULL ||
- (nameid = atoi(str[0])) < 0 || !(id = itemdb_exists(nameid)))
- continue;
-
- flag = atoi(str[1]);
- gmlv = atoi(str[2]);
-
- if (flag > 0 && flag < 128 && gmlv > 0) { //Check range
- id->flag.trade_restriction = flag;
- id->gm_lv_trade_override = gmlv;
- ln++;
- }
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, "item_trade.txt");
-
- return 0;
-}
-
-/*======================================
- * Applies gender restrictions according to settings. [Skotlex]
- *======================================
- */
-static int itemdb_gendercheck(struct item_data *id)
-{
- if (id->nameid == WEDDING_RING_M) //Grom Ring
- return 1;
- if (id->nameid == WEDDING_RING_F) //Bride Ring
- return 0;
- if (id->look == W_MUSICAL && id->type == IT_WEAPON) //Musical instruments are always male-only
- return 1;
- if (id->look == W_WHIP && id->type == IT_WEAPON) //Whips are always female-only
- return 0;
-
- return (battle_config.ignore_items_gender?2:id->sex);
-}
-#ifndef TXT_ONLY
-
-/*======================================
-* SQL
-*===================================
-*/
-static int itemdb_read_sqldb(void)
-{
- unsigned short nameid;
- struct item_data *id;
- char script[65535 + 2 + 1]; // Maximum length of MySQL TEXT type (65535) + 2 bytes for curly brackets + 1 byte for terminator
- char *item_db_name[] = { item_db_db, item_db2_db };
- long unsigned int ln = 0;
- int i;
-
- // ----------
-
- for (i = 0; i < 2; i++) {
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]);
-
- // Execute the query; if the query execution succeeded...
- if (mysql_query(&mmysql_handle, tmp_sql) == 0) {
- sql_res = mysql_store_result(&mmysql_handle);
-
- // If the storage of the query result succeeded...
- if (sql_res) {
- // Parse each row in the query result into sql_row
- while ((sql_row = mysql_fetch_row(sql_res)))
- { /*Table structure is:
- 00 id
- 01 name_english
- 02 name_japanese
- 03 type
- 04 price_buy
- 05 price_sell
- 06 weight
- 07 attack
- 08 defence
- 09 range
- 10 slots
- 11 equip_jobs
- 12 equip_upper
- 13 equip_genders
- 14 equip_locations
- 15 weapon_level
- 16 equip_level
- 17 refineable
- 18 view
- 19 script
- 20 equip_script
- 21 unequip_script
- */
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0)
- continue;
-
- ln++;
-
- // ----------
- id = itemdb_load(nameid);
-
- strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1);
-
- id->type = atoi(sql_row[3]);
- if (id->type == IT_DELAYCONSUME)
- { //Items that are consumed upon target confirmation
- //(yggdrasil leaf, spells & pet lures) [Skotlex]
- id->type = IT_USABLE;
- id->flag.delay_consume=1;
- }
-
- // If price_buy is not NULL and price_sell is not NULL...
- if ((sql_row[4] != NULL) && (sql_row[5] != NULL)) {
- id->value_buy = atoi(sql_row[4]);
- id->value_sell = atoi(sql_row[5]);
- }
- // If price_buy is not NULL and price_sell is NULL...
- else if ((sql_row[4] != NULL) && (sql_row[5] == NULL)) {
- id->value_buy = atoi(sql_row[4]);
- id->value_sell = atoi(sql_row[4]) / 2;
- }
- // If price_buy is NULL and price_sell is not NULL...
- else if ((sql_row[4] == NULL) && (sql_row[5] != NULL)) {
- id->value_buy = atoi(sql_row[5]) * 2;
- id->value_sell = atoi(sql_row[5]);
- }
- // If price_buy is NULL and price_sell is NULL...
- if ((sql_row[4] == NULL) && (sql_row[5] == NULL)) {
- id->value_buy = 0;
- id->value_sell = 0;
- }
-
- id->weight = atoi(sql_row[6]);
- id->atk = (sql_row[7] != NULL) ? atoi(sql_row[7]) : 0;
- id->def = (sql_row[8] != NULL) ? atoi(sql_row[8]) : 0;
- id->range = (sql_row[9] != NULL) ? atoi(sql_row[9]) : 0;
- id->slot = (sql_row[10] != NULL) ? atoi(sql_row[10]) : 0;
- if (id->slot > MAX_SLOTS)
- {
- ShowWarning("itemdb_read_sqldb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS);
- id->slot = MAX_SLOTS;
- }
- itemdb_jobid2mapid(id->class_base, (sql_row[11] != NULL) ? (unsigned int)strtoul(sql_row[11], NULL, 0) : 0);
- id->class_upper= (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0;
- id->sex = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0;
- id->equip = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0;
- if (!id->equip && itemdb_isequip2(id))
- {
- ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname);
- id->type = 3;
- }
- id->wlv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0;
- id->elv = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0;
- id->flag.no_refine = (sql_row[17] == NULL || atoi(sql_row[17]) == 1)?0:1;
- id->look = (sql_row[18] != NULL) ? atoi(sql_row[18]) : 0;
- id->view_id = 0;
- id->sex = itemdb_gendercheck(id); //Apply gender filtering.
-
- // ----------
-
- if (id->script)
- script_free_code(id->script);
- if (sql_row[19] != NULL) {
- if (sql_row[19][0] == '{')
- id->script = parse_script((unsigned char *) sql_row[19],item_db_name[i], 0);
- else {
- sprintf(script, "{%s}", sql_row[19]);
- id->script = parse_script((unsigned char *) script, item_db_name[i], 0);
- }
- } else id->script = NULL;
-
- if (id->equip_script)
- script_free_code(id->equip_script);
- if (sql_row[20] != NULL) {
- if (sql_row[20][0] == '{')
- id->equip_script = parse_script((unsigned char *) sql_row[20], item_db_name[i], 0);
- else {
- sprintf(script, "{%s}", sql_row[20]);
- id->equip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
- }
- } else id->equip_script = NULL;
-
- if (id->unequip_script)
- script_free_code(id->unequip_script);
- if (sql_row[21] != NULL) {
- if (sql_row[21][0] == '{')
- id->unequip_script = parse_script((unsigned char *) sql_row[21],item_db_name[i], 0);
- else {
- sprintf(script, "{%s}", sql_row[21]);
- id->unequip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
- }
- } else id->unequip_script = NULL;
-
- // ----------
-
- id->flag.available = 1;
- id->flag.value_notdc = 0;
- id->flag.value_notoc = 0;
- }
-
- ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]);
- ln = 0;
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- // Free the query result
- mysql_free_result(sql_res);
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- return 0;
-}
-#endif /* not TXT_ONLY */
-
-/*==========================================
- * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0,lines=0;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
- int i=0;
- char *filename[]={ "item_db.txt","item_db2.txt" };
-
- for(i=0;i<2;i++){
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp=fopen(line,"r");
- if(fp==NULL){
- if(i>0)
- continue;
- ShowFatalError("can't read %s\n",line);
- exit(1);
- }
-
- lines=0;
- while(fgets(line,1020,fp)){
- lines++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- malloc_tsetdword(str,0,sizeof(str));
- for(j=0,np=p=line;j<19 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p){ *p++=0; np=p; }
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0)
- continue;
- if (j < 19)
- { //Crash-fix on broken item lines. [Skotlex]
- ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid);
- continue;
- }
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View
- id=itemdb_load(nameid);
- strncpy(id->name, str[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1);
- id->type=atoi(str[3]);
- if (id->type == IT_DELAYCONSUME)
- { //Items that are consumed upon target confirmation
- //(yggdrasil leaf, spells & pet lures) [Skotlex]
- id->type = IT_USABLE;
- id->flag.delay_consume=1;
- }
-
- {
- int buy = atoi(str[4]), sell = atoi(str[5]);
- // if buying price > selling price * 2 consider it valid and don't change it [celest]
- if (buy && sell && buy > sell*2){
- id->value_buy = buy;
- id->value_sell = sell;
- } else {
- // buy‚sell*2 ‚Í item_value_db.txt ‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
- if (sell) { // sell’l‚ð—Dæ‚Æ‚·‚é
- id->value_buy = sell*2;
- id->value_sell = sell;
- } else {
- id->value_buy = buy;
- id->value_sell = buy/2;
- }
- }
- // check for bad prices that can possibly cause exploits
- if (id->value_buy*75/100 < id->value_sell*124/100) {
- ShowWarning ("Item %s [%d] buying:%d < selling:%d\n",
- id->name, id->nameid, id->value_buy*75/100, id->value_sell*124/100);
- }
- }
- id->weight=atoi(str[6]);
- id->atk=atoi(str[7]);
- id->def=atoi(str[8]);
- id->range=atoi(str[9]);
- id->slot=atoi(str[10]);
- if (id->slot > MAX_SLOTS)
- {
- ShowWarning("itemdb_readdb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS);
- id->slot = MAX_SLOTS;
- }
- itemdb_jobid2mapid(id->class_base, (unsigned int)strtoul(str[11],NULL,0));
- id->class_upper = atoi(str[12]);
- id->sex = atoi(str[13]);
- if(id->equip != atoi(str[14])){
- id->equip=atoi(str[14]);
- }
- if (!id->equip && itemdb_isequip2(id))
- {
- ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname);
- id->type = 3;
- }
- id->wlv=atoi(str[15]);
- id->elv=atoi(str[16]);
- id->flag.no_refine = atoi(str[17])?0:1; //If the refine column is 1, no_refine is 0
- id->look=atoi(str[18]);
- id->flag.available=1;
- id->flag.value_notdc=0;
- id->flag.value_notoc=0;
- id->view_id=0;
- id->sex = itemdb_gendercheck(id); //Apply gender filtering.
-
- if (id->script) {
- script_free_code(id->script);
- id->script=NULL;
- }
- if (id->equip_script) {
- script_free_code(id->equip_script);
- id->equip_script=NULL;
- }
- if (id->unequip_script) {
- script_free_code(id->unequip_script);
- id->unequip_script=NULL;
- }
-
- if((p=strchr(np,'{'))==NULL)
- continue;
-
- str[19] = p; //Script
- np = strchr(p,'}');
-
- while (np && np[1] && np[1] != ',')
- np = strchr(np+1,'}'); //Jump close brackets until the next field is found.
- if (!np || !np[1]) {
- //Couldn't find the end of the script field.
- id->script = parse_script((unsigned char *) str[19],filename[i],lines);
- continue;
- }
- np[1] = '\0'; //Set end of script
- id->script = parse_script((unsigned char *) str[19],filename[i],lines);
- np+=2; //Skip to next field
-
- if(!np || (p=strchr(np,'{'))==NULL)
- continue;
-
- str[20] = p; //Equip Script
- np = strchr(p,'}');
-
- while (np && np[1] && np[1] != ',')
- np = strchr(np+1,'}'); //Jump close brackets until the next field is found.
- if (!np || !np[1]) {
- //Couldn't find the end of the script field.
- id->equip_script = parse_script((unsigned char *) str[20],filename[i],lines);
- continue;
- }
-
- np[1] = '\0'; //Set end of script
- id->equip_script = parse_script((unsigned char *) str[20],filename[i],lines);
- np+=2; //Skip comma, to next field
-
- if(!np || (p=strchr(np,'{'))==NULL)
- continue;
- //Unequip script, last column.
- id->unequip_script = parse_script((unsigned char *) p,filename[i],lines);
- }
- fclose(fp);
- if (ln > 0) {
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
- }
- ln=0; // reset to 0
- }
- return 0;
-}
-
-/*====================================
- * Removed item_value_db, don't re-add
- *------------------------------------
- */
-static void itemdb_read(void)
-{
-#ifndef TXT_ONLY
- if (db_use_sqldbs)
- itemdb_read_sqldb();
- else
-#endif
- itemdb_readdb();
-
- itemdb_read_itemgroup();
- itemdb_read_itemavail();
- itemdb_read_noequip();
- itemdb_read_itemtrade();
- if (battle_config.cardillust_read_grffile)
- itemdb_read_cardillustnametable();
- if (battle_config.item_equip_override_grffile)
- itemdb_read_itemslottable();
- if (battle_config.item_slots_override_grffile)
- itemdb_read_itemslotcounttable();
- if (battle_config.item_name_override_grffile)
- itemdb_read_itemnametable();
-}
-
-/*==========================================
- * Initialize / Finalize
- *------------------------------------------
- */
-static int itemdb_final_sub (DBKey key,void *data,va_list ap)
-{
- int flag;
- struct item_data *id = (struct item_data *)data;
-
- flag = va_arg(ap, int);
- if (id->script)
- {
- script_free_code(id->script);
- id->script = NULL;
- }
- if (id->equip_script)
- {
- script_free_code(id->equip_script);
- id->equip_script = NULL;
- }
- if (id->unequip_script)
- {
- script_free_code(id->unequip_script);
- id->unequip_script = NULL;
- }
- // Whether to clear the item data (exception: do not clear the dummy item data
- if (flag && id != &dummy_item)
- aFree(id);
-
- return 0;
-}
-
-void itemdb_reload(void)
-{
- //Just read, the function takes care of freeing scripts.
- itemdb_read();
-}
-
-void do_final_itemdb(void)
-{
- item_db->destroy(item_db, itemdb_final_sub, 1);
- if (dummy_item.script) {
- script_free_code(dummy_item.script);
- dummy_item.script = NULL;
- }
- if (dummy_item.equip_script) {
- script_free_code(dummy_item.equip_script);
- dummy_item.equip_script = NULL;
- }
- if (dummy_item.unequip_script) {
- script_free_code(dummy_item.unequip_script);
- dummy_item.unequip_script = NULL;
- }
-}
-
-int do_init_itemdb(void)
-{
- item_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
- create_dummy_data(); //Dummy data item.
- itemdb_read();
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+#include "../common/grfio.h"
+#include "../common/strlib.h"
+#include "map.h"
+#include "battle.h"
+#include "itemdb.h"
+#include "script.h"
+#include "pc.h"
+
+// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
+// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
+//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
+
+static struct dbt* item_db;
+
+static struct item_group itemgroup_db[MAX_ITEMGROUP];
+
+struct item_data dummy_item; //This is the default dummy item used for non-existant items. [Skotlex]
+
+/*==========================================
+ * –¼‘O‚ÅŒŸõ—p
+ *------------------------------------------
+ */
+// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
+int itemdb_searchname_sub(DBKey key,void *data,va_list ap)
+{
+ struct item_data *item=(struct item_data *)data,**dst;
+ char *str;
+ str=va_arg(ap,char *);
+ dst=va_arg(ap,struct item_data **);
+ if(item == &dummy_item) return 0;
+ if( strcmpi(item->name,str)==0 ) //by lupus
+ *dst=item;
+ return 0;
+}
+
+/*==========================================
+ * –¼‘O‚ÅŒŸõ—p
+ *------------------------------------------
+ */
+int itemdb_searchjname_sub(int key,void *data,va_list ap)
+{
+ struct item_data *item=(struct item_data *)data,**dst;
+ char *str;
+ str=va_arg(ap,char *);
+ dst=va_arg(ap,struct item_data **);
+ if(item == &dummy_item) return 0;
+ if( strcmpi(item->jname,str)==0 )
+ *dst=item;
+ return 0;
+}
+
+/*==========================================
+ * –¼‘O‚ÅŒŸõ
+ *------------------------------------------
+ */
+struct item_data* itemdb_searchname(const char *str)
+{
+ struct item_data *item=NULL;
+ item_db->foreach(item_db,itemdb_searchname_sub,str,&item);
+ return item;
+}
+
+static int itemdb_searchname_array_sub(DBKey key,void * data,va_list ap)
+{
+ struct item_data *item=(struct item_data *)data;
+ char *str;
+ str=va_arg(ap,char *);
+ if (item == &dummy_item)
+ return 1; //Invalid item.
+ if(stristr(item->jname,str))
+ return 0;
+ if(stristr(item->name,str))
+ return 0;
+ return strcmpi(item->jname,str);
+}
+
+/*==========================================
+ * Founds up to N matches. Returns number of matches [Skotlex]
+ *------------------------------------------
+ */
+int itemdb_searchname_array(struct item_data** data, int size, const char *str)
+{
+ return item_db->getall(item_db,(void**)data,size,itemdb_searchname_array_sub,str);
+}
+
+
+/*==========================================
+ * ” ŒnƒAƒCƒeƒ€ŒŸõ
+ *------------------------------------------
+ */
+int itemdb_searchrandomid(int group)
+{
+ if(group<1 || group>=MAX_ITEMGROUP) {
+ if (battle_config.error_log)
+ ShowError("itemdb_searchrandomid: Invalid group id %d\n", group);
+ return UNKNOWN_ITEM_ID;
+ }
+ if (itemgroup_db[group].qty)
+ return itemgroup_db[group].nameid[rand()%itemgroup_db[group].qty];
+
+ if (battle_config.error_log)
+ ShowError("itemdb_searchrandomid: No item entries for group id %d\n", group);
+ return UNKNOWN_ITEM_ID;
+}
+
+/*==========================================
+ * Calculates total item-group related bonuses for the given item. [Skotlex]
+ *------------------------------------------
+ */
+int itemdb_group_bonus(struct map_session_data *sd, int itemid)
+{
+ int bonus = 0, i, j;
+ for (i=0; i < MAX_ITEMGROUP; i++) {
+ if (!sd->itemgrouphealrate[i])
+ continue;
+ for (j=0; j < itemgroup_db[i].qty; j++) {
+ if (itemgroup_db[i].nameid[j] == itemid)
+ {
+ bonus += sd->itemgrouphealrate[i];
+ continue;
+ }
+ }
+ }
+ return bonus;
+}
+
+/*==========================================
+ * DB‚Ì‘¶ÝŠm”F
+ *------------------------------------------
+ */
+struct item_data* itemdb_exists(int nameid)
+{
+ struct item_data* id;
+ if (!nameid) return NULL;
+ id = idb_get(item_db,nameid);
+ //Adjust nameid in case it's used outside. [Skotlex]
+ if (id == &dummy_item)
+ dummy_item.nameid = nameid;
+ return id;
+}
+
+/*==========================================
+ * Converts the jobid from the format in itemdb
+ * to the format used by the map server. [Skotlex]
+ *------------------------------------------
+ */
+static void itemdb_jobid2mapid(unsigned int *bclass, unsigned int jobmask)
+{
+ int i;
+ bclass[0]= bclass[1]= bclass[2]= 0;
+ //Base classes
+ if (jobmask & 1<<JOB_NOVICE)
+ { //Both Novice/Super-Novice are counted with the same ID
+ bclass[0] |= 1<<MAPID_NOVICE;
+ bclass[1] |= 1<<MAPID_NOVICE;
+ }
+ for (i = JOB_NOVICE+1; i <= JOB_THIEF; i++)
+ {
+ if (jobmask & 1<<i)
+ bclass[0] |= 1<<(MAPID_NOVICE+i);
+ }
+ //2-1 classes
+ if (jobmask & 1<<JOB_KNIGHT)
+ bclass[1] |= 1<<MAPID_SWORDMAN;
+ if (jobmask & 1<<JOB_PRIEST)
+ bclass[1] |= 1<<MAPID_ACOLYTE;
+ if (jobmask & 1<<JOB_WIZARD)
+ bclass[1] |= 1<<MAPID_MAGE;
+ if (jobmask & 1<<JOB_BLACKSMITH)
+ bclass[1] |= 1<<MAPID_MERCHANT;
+ if (jobmask & 1<<JOB_HUNTER)
+ bclass[1] |= 1<<MAPID_ARCHER;
+ if (jobmask & 1<<JOB_ASSASSIN)
+ bclass[1] |= 1<<MAPID_THIEF;
+ //2-2 classes
+ if (jobmask & 1<<JOB_CRUSADER)
+ bclass[2] |= 1<<MAPID_SWORDMAN;
+ if (jobmask & 1<<JOB_MONK)
+ bclass[2] |= 1<<MAPID_ACOLYTE;
+ if (jobmask & 1<<JOB_SAGE)
+ bclass[2] |= 1<<MAPID_MAGE;
+ if (jobmask & 1<<JOB_ALCHEMIST)
+ bclass[2] |= 1<<MAPID_MERCHANT;
+ if (jobmask & 1<<JOB_BARD)
+ bclass[2] |= 1<<MAPID_ARCHER;
+// Bard/Dancer share the same slot now.
+// if (jobmask & 1<<JOB_DANCER)
+// bclass[2] |= 1<<MAPID_ARCHER;
+ if (jobmask & 1<<JOB_ROGUE)
+ bclass[2] |= 1<<MAPID_THIEF;
+ //Special classes that don't fit above.
+ if (jobmask & 1<<21) //Taekwon boy
+ bclass[0] |= 1<<MAPID_TAEKWON;
+ if (jobmask & 1<<22) //Star Gladiator
+ bclass[1] |= 1<<MAPID_TAEKWON;
+ if (jobmask & 1<<23) //Soul Linker
+ bclass[2] |= 1<<MAPID_TAEKWON;
+ if (jobmask & 1<<JOB_GUNSLINGER)
+ bclass[0] |= 1<<MAPID_GUNSLINGER;
+ if (jobmask & 1<<JOB_NINJA)
+ bclass[0] |= 1<<MAPID_NINJA;
+}
+
+static void create_dummy_data(void) {
+ malloc_set(&dummy_item, 0, sizeof(struct item_data));
+ dummy_item.nameid=500;
+ dummy_item.weight=1;
+ dummy_item.value_sell = 1;
+ dummy_item.type=3; //Etc item
+ strncpy(dummy_item.name,"UNKNOWN_ITEM",ITEM_NAME_LENGTH-1);
+ strncpy(dummy_item.jname,"UNKNOWN_ITEM",ITEM_NAME_LENGTH-1);
+ dummy_item.view_id = UNKNOWN_ITEM_ID;
+}
+
+static void* create_item_data(DBKey key, va_list args) {
+ struct item_data *id;
+ id=(struct item_data *)aCalloc(1,sizeof(struct item_data));
+ id->nameid = key.i;
+ id->weight=1;
+ id->type=IT_ETC;
+ return id;
+}
+
+/*==========================================
+ * Loads (and creates if not found) an item from the db.
+ *------------------------------------------
+ */
+struct item_data* itemdb_load(int nameid)
+{
+ struct item_data *id = idb_ensure(item_db,nameid,create_item_data);
+ if (id == &dummy_item)
+ { //Remove dummy_item, replace by real data.
+ DBKey key;
+ key.i = nameid;
+ idb_remove(item_db,nameid);
+ id = create_item_data(key, NULL);
+ idb_put(item_db,nameid,id);
+ }
+ return id;
+}
+
+static void* return_dummy_data(DBKey key, va_list args) {
+ if (battle_config.error_log)
+ ShowWarning("itemdb_search: Item ID %d does not exists in the item_db. Using dummy data.\n", key.i);
+ dummy_item.nameid = key.i;
+ return &dummy_item;
+}
+
+/*==========================================
+ * Loads an item from the db. If not found, it will return the dummy item.
+ *------------------------------------------
+ */
+struct item_data* itemdb_search(int nameid)
+{
+ return idb_ensure(item_db,nameid,return_dummy_data);
+}
+
+/*==========================================
+ * Returns if given item is a player-equippable piece.
+ *------------------------------------------
+ */
+int itemdb_isequip(int nameid)
+{
+ int type=itemdb_type(nameid);
+ switch (type) {
+ case IT_WEAPON:
+ case IT_ARMOR:
+ case IT_AMMO:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/*==========================================
+ * Alternate version of itemdb_isequip
+ *------------------------------------------
+ */
+int itemdb_isequip2(struct item_data *data)
+{
+ nullpo_retr(0, data);
+ switch(data->type) {
+ case IT_WEAPON:
+ case IT_ARMOR:
+ case IT_AMMO:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/*==========================================
+* Returns if given item's type is stackable.
+*------------------------------------------
+*/
+int itemdb_isstackable(int nameid)
+{
+ int type=itemdb_type(nameid);
+ switch(type) {
+ case IT_WEAPON:
+ case IT_ARMOR:
+ case IT_PETEGG:
+ case IT_PETARMOR:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+/*==========================================
+* Alternate version of itemdb_isstackable
+*------------------------------------------
+*/
+int itemdb_isstackable2(struct item_data *data)
+{
+ nullpo_retr(0, data);
+ switch(data->type) {
+ case IT_WEAPON:
+ case IT_ARMOR:
+ case IT_PETEGG:
+ case IT_PETARMOR:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+
+/*==========================================
+ * Trade Restriction functions [Skotlex]
+ *------------------------------------------
+ */
+int itemdb_isdropable_sub(struct item_data *item, int gmlv, int unused)
+{
+ return (item && (!(item->flag.trade_restriction&1) || gmlv >= item->gm_lv_trade_override));
+}
+
+int itemdb_cantrade_sub(struct item_data* item, int gmlv, int gmlv2)
+{
+ return (item && (!(item->flag.trade_restriction&2) || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
+}
+
+int itemdb_canpartnertrade_sub(struct item_data* item, int gmlv, int gmlv2)
+{
+ return (item && (item->flag.trade_restriction&4 || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
+}
+
+int itemdb_cansell_sub(struct item_data* item, int gmlv, int unused)
+{
+ return (item && (!(item->flag.trade_restriction&8) || gmlv >= item->gm_lv_trade_override));
+}
+
+int itemdb_cancartstore_sub(struct item_data* item, int gmlv, int unused)
+{
+ return (item && (!(item->flag.trade_restriction&16) || gmlv >= item->gm_lv_trade_override));
+}
+
+int itemdb_canstore_sub(struct item_data* item, int gmlv, int unused)
+{
+ return (item && (!(item->flag.trade_restriction&32) || gmlv >= item->gm_lv_trade_override));
+}
+
+int itemdb_canguildstore_sub(struct item_data* item, int gmlv, int unused)
+{
+ return (item && (!(item->flag.trade_restriction&64) || gmlv >= item->gm_lv_trade_override));
+}
+
+int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int))
+{
+ struct item_data* item_data = itemdb_search(item->nameid);
+ int i;
+
+ if (!func(item_data, gmlv, gmlv2))
+ return 0;
+
+ if(item_data->slot == 0 || itemdb_isspecial(item->card[0]))
+ return 1;
+
+ for(i = 0; i < item_data->slot; i++) {
+ if (!item->card[i]) continue;
+ if (!func(itemdb_search(item->card[i]), gmlv, gmlv2))
+ return 0;
+ }
+ return 1;
+}
+
+/*==========================================
+ * Specifies if item-type should drop unidentified.
+ *------------------------------------------
+ */
+int itemdb_isidentified(int nameid)
+{
+ int type=itemdb_type(nameid);
+ switch (type) {
+ case IT_WEAPON:
+ case IT_ARMOR:
+ case IT_PETARMOR:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€Žg—p‰Â”\ƒtƒ‰ƒO‚̃I[ƒo[ƒ‰ƒCƒh
+ *------------------------------------------
+ */
+static int itemdb_read_itemavail (void)
+{
+ FILE *fp;
+ int nameid, j, k, ln = 0;
+ char line[1024], *str[10], *p;
+ struct item_data *id;
+
+ sprintf(line, "%s/item_avail.txt", db_path);
+ if ((fp = fopen(line,"r")) == NULL) {
+ ShowError("can't read %s\n", line);
+ return -1;
+ }
+
+ while (fgets(line, sizeof(line) - 1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ malloc_tsetdword(str, 0, sizeof(str));
+ for (j = 0, p = line; j < 2 && p; j++) {
+ str[j] = p;
+ p = strchr(p, ',');
+ if(p) *p++ = 0;
+ }
+
+ if (j < 2 || str[0] == NULL ||
+ (nameid = atoi(str[0])) < 0 || !(id = itemdb_exists(nameid)))
+ continue;
+
+ k = atoi(str[1]);
+ if (k > 0) {
+ id->flag.available = 1;
+ id->view_id = k;
+ } else
+ id->flag.available = 0;
+ ln++;
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, "item_avail.txt");
+
+ return 0;
+}
+
+/*==========================================
+ * read item group data
+ *------------------------------------------
+ */
+static void itemdb_read_itemgroup_sub(const char* filename)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0;
+ int groupid,j,k,nameid;
+ char *str[3],*p;
+ char w1[1024], w2[1024];
+
+ if( (fp=fopen(filename,"r"))==NULL ){
+ ShowError("can't read %s\n", line);
+ return;
+ }
+
+ while(fgets(line,1020,fp)){
+ ln++;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ if(strstr(line,"import")) {
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2 &&
+ strcmpi(w1, "import") == 0) {
+ itemdb_read_itemgroup_sub(w2);
+ continue;
+ }
+ }
+ malloc_tsetdword(str,0,sizeof(str));
+ for(j=0,p=line;j<3 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(str[0]==NULL)
+ continue;
+ if (j<3) {
+ if (j>1) //Or else it barks on blank lines...
+ ShowWarning("itemdb_read_itemgroup: Insufficient fields for entry at %s:%d\n", filename, ln);
+ continue;
+ }
+ groupid = atoi(str[0]);
+ if (groupid < 0 || groupid >= MAX_ITEMGROUP) {
+ ShowWarning("itemdb_read_itemgroup: Invalid group %d in %s:%d\n", groupid, filename, ln);
+ continue;
+ }
+ nameid = atoi(str[1]);
+ if (!itemdb_exists(nameid)) {
+ ShowWarning("itemdb_read_itemgroup: Non-existant item %d in %s:%d\n", nameid, filename, ln);
+ continue;
+ }
+ k = atoi(str[2]);
+ if (itemgroup_db[groupid].qty+k > MAX_RANDITEM) {
+ ShowWarning("itemdb_read_itemgroup: Group %d is full (%d entries) in %s:%d\n", groupid, MAX_RANDITEM, filename, ln);
+ continue;
+ }
+ for(j=0;j<k;j++)
+ itemgroup_db[groupid].nameid[itemgroup_db[groupid].qty++] = nameid;
+ }
+ fclose(fp);
+ return;
+}
+
+static void itemdb_read_itemgroup(void)
+{
+ char path[256];
+ int i;
+ const char* groups[] = {
+ "Blue Box",
+ "Violet Box",
+ "Card Album",
+ "Gift Box",
+ "Scroll Box",
+ "Finding Ore",
+ "Cookie Bag",
+ "Potion",
+ "Herbs",
+ "Fruits",
+ "Meat",
+ "Candy",
+ "Juice",
+ "Fish",
+ "Boxes",
+ "Gemstone",
+ "Jellopy",
+ "Ore",
+ "Food",
+ "Recovery",
+ "Minerals",
+ "Taming",
+ "Scrolls",
+ "Quivers",
+ "Masks",
+ "Accesory",
+ "Jewels",
+ "Gift Box 1",
+ "Gift Box 2",
+ "Gift Box 3",
+ "Gift Box 4",
+ "Egg Boy",
+ "Egg Girl",
+ "Gift Box China",
+ "Lotto Box",
+ };
+ malloc_tsetdword(&itemgroup_db, 0, sizeof(itemgroup_db));
+ snprintf(path, 255, "%s/item_group_db.txt", db_path);
+ itemdb_read_itemgroup_sub(path);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","item_group_db.txt");
+ if (battle_config.etc_log) {
+ for (i = 1; i < MAX_ITEMGROUP; i++)
+ ShowInfo("Group %s: %d entries.\n", groups[i-1], itemgroup_db[i].qty);
+ }
+ return;
+}
+/*==========================================
+ * ƒAƒCƒeƒ€‚Ì–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+static int itemdb_read_itemnametable(void)
+{
+ char *buf,*p;
+ int s;
+
+ buf=(char *) grfio_reads("data\\idnum2itemdisplaynametable.txt",&s);
+
+ if(buf==NULL)
+ return -1;
+
+ buf[s]=0;
+ for(p=buf;p-buf<s;){
+ int nameid;
+ char buf2[64]; //Why 64? What's this for, other than holding an item's name? [Skotlex]
+
+ if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
+
+#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
+ if( itemdb_exists(nameid) &&
+ strncmp(itemdb_search(nameid)->jname,buf2,ITEM_NAME_LENGTH)!=0 ){
+ ShowNotice("[override] %d %s => %s\n",nameid
+ ,itemdb_search(nameid)->jname,buf2);
+ }
+#endif
+
+ strncpy(itemdb_search(nameid)->jname,buf2,ITEM_NAME_LENGTH-1);
+ }
+
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\idnum2itemdisplaynametable.txt");
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒhƒCƒ‰ƒXƒg‚̃Šƒ\[ƒX–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+static int itemdb_read_cardillustnametable(void)
+{
+ char *buf,*p;
+ int s;
+
+ buf=(char *) grfio_reads("data\\num2cardillustnametable.txt",&s);
+
+ if(buf==NULL)
+ return -1;
+
+ buf[s]=0;
+ for(p=buf;p-buf<s;){
+ int nameid;
+ char buf2[64];
+
+ if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
+ strcat(buf2,".bmp");
+ memcpy(itemdb_search(nameid)->cardillustname,buf2,64);
+ }
+
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\num2cardillustnametable.txt");
+
+ return 0;
+}
+
+//
+// ‰Šú‰»
+//
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int itemdb_read_itemslottable(void)
+{
+ char *buf, *p;
+ int s;
+
+ buf = (char *)grfio_reads("data\\itemslottable.txt", &s);
+ if (buf == NULL)
+ return -1;
+ buf[s] = 0;
+ for (p = buf; p - buf < s; ) {
+ int nameid, equip;
+ struct item_data* item;
+ sscanf(p, "%d#%d#", &nameid, &equip);
+ item = itemdb_search(nameid);
+ if (equip && item && itemdb_isequip2(item))
+ item->equip = equip;
+ p = strchr(p, 10);
+ if(!p) break;
+ p++;
+ p=strchr(p, 10);
+ if(!p) break;
+ p++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslottable.txt");
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int itemdb_read_itemslotcounttable(void)
+{
+ char *buf, *p;
+ int s;
+
+ buf = (char *)grfio_reads("data\\itemslotcounttable.txt", &s);
+ if (buf == NULL)
+ return -1;
+ buf[s] = 0;
+ for (p = buf; p - buf < s;){
+ int nameid, slot;
+ sscanf(p, "%d#%d#", &nameid, &slot);
+ if (slot > MAX_SLOTS)
+ {
+ ShowWarning("itemdb_read_itemslotcounttable: Item %d specifies %d slots, but the server only supports up to %d\n", nameid, slot, MAX_SLOTS);
+ slot = MAX_SLOTS;
+ }
+ itemdb_slot(nameid) = slot;
+ p = strchr(p,10);
+ if(!p) break;
+ p++;
+ p = strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "data\\itemslotcounttable.txt");
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ§ŒÀƒtƒ@ƒCƒ‹“Ç‚Ýo‚µ
+ *------------------------------------------
+ */
+static int itemdb_read_noequip(void)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0;
+ int nameid,j;
+ char *str[32],*p;
+ struct item_data *id;
+
+ sprintf(line, "%s/item_noequip.txt", db_path);
+ if( (fp=fopen(line,"r"))==NULL ){
+ ShowError("can't read %s\n", line);
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ malloc_tsetdword(str,0,sizeof(str));
+ for(j=0,p=line;j<2 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(str[0]==NULL)
+ continue;
+
+ nameid=atoi(str[0]);
+ if(nameid<=0 || !(id=itemdb_exists(nameid)))
+ continue;
+
+ id->flag.no_equip=atoi(str[1]);
+
+ ln++;
+
+ }
+ fclose(fp);
+ if (ln > 0) {
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"item_noequip.txt");
+ }
+ return 0;
+}
+
+/*==========================================
+ * Reads item trade restrictions [Skotlex]
+ *------------------------------------------
+ */
+static int itemdb_read_itemtrade(void)
+{
+ FILE *fp;
+ int nameid, j, flag, gmlv, ln = 0;
+ char line[1024], *str[10], *p;
+ struct item_data *id;
+
+ sprintf(line, "%s/item_trade.txt", db_path);
+ if ((fp = fopen(line,"r")) == NULL) {
+ ShowError("can't read %s\n", line);
+ return -1;
+ }
+
+ while (fgets(line, sizeof(line) - 1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ malloc_tsetdword(str, 0, sizeof(str));
+ for (j = 0, p = line; j < 3 && p; j++) {
+ str[j] = p;
+ p = strchr(p, ',');
+ if(p) *p++ = 0;
+ }
+
+ if (j < 3 || str[0] == NULL ||
+ (nameid = atoi(str[0])) < 0 || !(id = itemdb_exists(nameid)))
+ continue;
+
+ flag = atoi(str[1]);
+ gmlv = atoi(str[2]);
+
+ if (flag > 0 && flag < 128 && gmlv > 0) { //Check range
+ id->flag.trade_restriction = flag;
+ id->gm_lv_trade_override = gmlv;
+ ln++;
+ }
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, "item_trade.txt");
+
+ return 0;
+}
+
+/*======================================
+ * Applies gender restrictions according to settings. [Skotlex]
+ *======================================
+ */
+static int itemdb_gendercheck(struct item_data *id)
+{
+ if (id->nameid == WEDDING_RING_M) //Grom Ring
+ return 1;
+ if (id->nameid == WEDDING_RING_F) //Bride Ring
+ return 0;
+ if (id->look == W_MUSICAL && id->type == IT_WEAPON) //Musical instruments are always male-only
+ return 1;
+ if (id->look == W_WHIP && id->type == IT_WEAPON) //Whips are always female-only
+ return 0;
+
+ return (battle_config.ignore_items_gender?2:id->sex);
+}
+#ifndef TXT_ONLY
+
+/*======================================
+* SQL
+*===================================
+*/
+static int itemdb_read_sqldb(void)
+{
+ unsigned short nameid;
+ struct item_data *id;
+ char script[65535 + 2 + 1]; // Maximum length of MySQL TEXT type (65535) + 2 bytes for curly brackets + 1 byte for terminator
+ char *item_db_name[] = { item_db_db, item_db2_db };
+ long unsigned int ln = 0;
+ int i;
+
+ // ----------
+
+ for (i = 0; i < 2; i++) {
+ sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]);
+
+ // Execute the query; if the query execution succeeded...
+ if (mysql_query(&mmysql_handle, tmp_sql) == 0) {
+ sql_res = mysql_store_result(&mmysql_handle);
+
+ // If the storage of the query result succeeded...
+ if (sql_res) {
+ // Parse each row in the query result into sql_row
+ while ((sql_row = mysql_fetch_row(sql_res)))
+ { /*Table structure is:
+ 00 id
+ 01 name_english
+ 02 name_japanese
+ 03 type
+ 04 price_buy
+ 05 price_sell
+ 06 weight
+ 07 attack
+ 08 defence
+ 09 range
+ 10 slots
+ 11 equip_jobs
+ 12 equip_upper
+ 13 equip_genders
+ 14 equip_locations
+ 15 weapon_level
+ 16 equip_level
+ 17 refineable
+ 18 view
+ 19 script
+ 20 equip_script
+ 21 unequip_script
+ */
+ nameid = atoi(sql_row[0]);
+
+ // If the identifier is not within the valid range, process the next row
+ if (nameid == 0)
+ continue;
+
+ ln++;
+
+ // ----------
+ id = itemdb_load(nameid);
+
+ strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1);
+ strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1);
+
+ id->type = atoi(sql_row[3]);
+ if (id->type == IT_DELAYCONSUME)
+ { //Items that are consumed upon target confirmation
+ //(yggdrasil leaf, spells & pet lures) [Skotlex]
+ id->type = IT_USABLE;
+ id->flag.delay_consume=1;
+ }
+
+ // If price_buy is not NULL and price_sell is not NULL...
+ if ((sql_row[4] != NULL) && (sql_row[5] != NULL)) {
+ id->value_buy = atoi(sql_row[4]);
+ id->value_sell = atoi(sql_row[5]);
+ }
+ // If price_buy is not NULL and price_sell is NULL...
+ else if ((sql_row[4] != NULL) && (sql_row[5] == NULL)) {
+ id->value_buy = atoi(sql_row[4]);
+ id->value_sell = atoi(sql_row[4]) / 2;
+ }
+ // If price_buy is NULL and price_sell is not NULL...
+ else if ((sql_row[4] == NULL) && (sql_row[5] != NULL)) {
+ id->value_buy = atoi(sql_row[5]) * 2;
+ id->value_sell = atoi(sql_row[5]);
+ }
+ // If price_buy is NULL and price_sell is NULL...
+ if ((sql_row[4] == NULL) && (sql_row[5] == NULL)) {
+ id->value_buy = 0;
+ id->value_sell = 0;
+ }
+
+ id->weight = atoi(sql_row[6]);
+ id->atk = (sql_row[7] != NULL) ? atoi(sql_row[7]) : 0;
+ id->def = (sql_row[8] != NULL) ? atoi(sql_row[8]) : 0;
+ id->range = (sql_row[9] != NULL) ? atoi(sql_row[9]) : 0;
+ id->slot = (sql_row[10] != NULL) ? atoi(sql_row[10]) : 0;
+ if (id->slot > MAX_SLOTS)
+ {
+ ShowWarning("itemdb_read_sqldb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS);
+ id->slot = MAX_SLOTS;
+ }
+ itemdb_jobid2mapid(id->class_base, (sql_row[11] != NULL) ? (unsigned int)strtoul(sql_row[11], NULL, 0) : 0);
+ id->class_upper= (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0;
+ id->sex = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0;
+ id->equip = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0;
+ if (!id->equip && itemdb_isequip2(id))
+ {
+ ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname);
+ id->type = 3;
+ }
+ id->wlv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0;
+ id->elv = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0;
+ id->flag.no_refine = (sql_row[17] == NULL || atoi(sql_row[17]) == 1)?0:1;
+ id->look = (sql_row[18] != NULL) ? atoi(sql_row[18]) : 0;
+ id->view_id = 0;
+ id->sex = itemdb_gendercheck(id); //Apply gender filtering.
+
+ // ----------
+
+ if (id->script)
+ script_free_code(id->script);
+ if (sql_row[19] != NULL) {
+ if (sql_row[19][0] == '{')
+ id->script = parse_script((unsigned char *) sql_row[19],item_db_name[i], 0);
+ else {
+ sprintf(script, "{%s}", sql_row[19]);
+ id->script = parse_script((unsigned char *) script, item_db_name[i], 0);
+ }
+ } else id->script = NULL;
+
+ if (id->equip_script)
+ script_free_code(id->equip_script);
+ if (sql_row[20] != NULL) {
+ if (sql_row[20][0] == '{')
+ id->equip_script = parse_script((unsigned char *) sql_row[20], item_db_name[i], 0);
+ else {
+ sprintf(script, "{%s}", sql_row[20]);
+ id->equip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
+ }
+ } else id->equip_script = NULL;
+
+ if (id->unequip_script)
+ script_free_code(id->unequip_script);
+ if (sql_row[21] != NULL) {
+ if (sql_row[21][0] == '{')
+ id->unequip_script = parse_script((unsigned char *) sql_row[21],item_db_name[i], 0);
+ else {
+ sprintf(script, "{%s}", sql_row[21]);
+ id->unequip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
+ }
+ } else id->unequip_script = NULL;
+
+ // ----------
+
+ id->flag.available = 1;
+ id->flag.value_notdc = 0;
+ id->flag.value_notoc = 0;
+ }
+
+ ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]);
+ ln = 0;
+ } else {
+ ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ // Free the query result
+ mysql_free_result(sql_res);
+ } else {
+ ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ return 0;
+}
+#endif /* not TXT_ONLY */
+
+/*==========================================
+ * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static int itemdb_readdb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0,lines=0;
+ int nameid,j;
+ char *str[32],*p,*np;
+ struct item_data *id;
+ int i=0;
+ char *filename[]={ "item_db.txt","item_db2.txt" };
+
+ for(i=0;i<2;i++){
+ sprintf(line, "%s/%s", db_path, filename[i]);
+ fp=fopen(line,"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ ShowFatalError("can't read %s\n",line);
+ exit(1);
+ }
+
+ lines=0;
+ while(fgets(line,1020,fp)){
+ lines++;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ malloc_tsetdword(str,0,sizeof(str));
+ for(j=0,np=p=line;j<19 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p){ *p++=0; np=p; }
+ }
+ if(str[0]==NULL)
+ continue;
+
+ nameid=atoi(str[0]);
+ if(nameid<=0)
+ continue;
+ if (j < 19)
+ { //Crash-fix on broken item lines. [Skotlex]
+ ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid);
+ continue;
+ }
+ ln++;
+
+ //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View
+ id=itemdb_load(nameid);
+ strncpy(id->name, str[1], ITEM_NAME_LENGTH-1);
+ strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1);
+ id->type=atoi(str[3]);
+ if (id->type == IT_DELAYCONSUME)
+ { //Items that are consumed upon target confirmation
+ //(yggdrasil leaf, spells & pet lures) [Skotlex]
+ id->type = IT_USABLE;
+ id->flag.delay_consume=1;
+ }
+
+ {
+ int buy = atoi(str[4]), sell = atoi(str[5]);
+ // if buying price > selling price * 2 consider it valid and don't change it [celest]
+ if (buy && sell && buy > sell*2){
+ id->value_buy = buy;
+ id->value_sell = sell;
+ } else {
+ // buy‚sell*2 ‚Í item_value_db.txt ‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
+ if (sell) { // sell’l‚ð—Dæ‚Æ‚·‚é
+ id->value_buy = sell*2;
+ id->value_sell = sell;
+ } else {
+ id->value_buy = buy;
+ id->value_sell = buy/2;
+ }
+ }
+ // check for bad prices that can possibly cause exploits
+ if (id->value_buy*75/100 < id->value_sell*124/100) {
+ ShowWarning ("Item %s [%d] buying:%d < selling:%d\n",
+ id->name, id->nameid, id->value_buy*75/100, id->value_sell*124/100);
+ }
+ }
+ id->weight=atoi(str[6]);
+ id->atk=atoi(str[7]);
+ id->def=atoi(str[8]);
+ id->range=atoi(str[9]);
+ id->slot=atoi(str[10]);
+ if (id->slot > MAX_SLOTS)
+ {
+ ShowWarning("itemdb_readdb: Item %d (%s) specifies %d slots, but the server only supports up to %d\n", nameid, id->jname, id->slot, MAX_SLOTS);
+ id->slot = MAX_SLOTS;
+ }
+ itemdb_jobid2mapid(id->class_base, (unsigned int)strtoul(str[11],NULL,0));
+ id->class_upper = atoi(str[12]);
+ id->sex = atoi(str[13]);
+ if(id->equip != atoi(str[14])){
+ id->equip=atoi(str[14]);
+ }
+ if (!id->equip && itemdb_isequip2(id))
+ {
+ ShowWarning("Item %d (%s) is an equipment with no equip-field! Making it an etc item.\n", nameid, id->jname);
+ id->type = 3;
+ }
+ id->wlv=atoi(str[15]);
+ id->elv=atoi(str[16]);
+ id->flag.no_refine = atoi(str[17])?0:1; //If the refine column is 1, no_refine is 0
+ id->look=atoi(str[18]);
+ id->flag.available=1;
+ id->flag.value_notdc=0;
+ id->flag.value_notoc=0;
+ id->view_id=0;
+ id->sex = itemdb_gendercheck(id); //Apply gender filtering.
+
+ if (id->script) {
+ script_free_code(id->script);
+ id->script=NULL;
+ }
+ if (id->equip_script) {
+ script_free_code(id->equip_script);
+ id->equip_script=NULL;
+ }
+ if (id->unequip_script) {
+ script_free_code(id->unequip_script);
+ id->unequip_script=NULL;
+ }
+
+ if((p=strchr(np,'{'))==NULL)
+ continue;
+
+ str[19] = p; //Script
+ np = strchr(p,'}');
+
+ while (np && np[1] && np[1] != ',')
+ np = strchr(np+1,'}'); //Jump close brackets until the next field is found.
+ if (!np || !np[1]) {
+ //Couldn't find the end of the script field.
+ id->script = parse_script((unsigned char *) str[19],filename[i],lines);
+ continue;
+ }
+ np[1] = '\0'; //Set end of script
+ id->script = parse_script((unsigned char *) str[19],filename[i],lines);
+ np+=2; //Skip to next field
+
+ if(!np || (p=strchr(np,'{'))==NULL)
+ continue;
+
+ str[20] = p; //Equip Script
+ np = strchr(p,'}');
+
+ while (np && np[1] && np[1] != ',')
+ np = strchr(np+1,'}'); //Jump close brackets until the next field is found.
+ if (!np || !np[1]) {
+ //Couldn't find the end of the script field.
+ id->equip_script = parse_script((unsigned char *) str[20],filename[i],lines);
+ continue;
+ }
+
+ np[1] = '\0'; //Set end of script
+ id->equip_script = parse_script((unsigned char *) str[20],filename[i],lines);
+ np+=2; //Skip comma, to next field
+
+ if(!np || (p=strchr(np,'{'))==NULL)
+ continue;
+ //Unequip script, last column.
+ id->unequip_script = parse_script((unsigned char *) p,filename[i],lines);
+ }
+ fclose(fp);
+ if (ln > 0) {
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
+ }
+ ln=0; // reset to 0
+ }
+ return 0;
+}
+
+/*====================================
+ * Removed item_value_db, don't re-add
+ *------------------------------------
+ */
+static void itemdb_read(void)
+{
+#ifndef TXT_ONLY
+ if (db_use_sqldbs)
+ itemdb_read_sqldb();
+ else
+#endif
+ itemdb_readdb();
+
+ itemdb_read_itemgroup();
+ itemdb_read_itemavail();
+ itemdb_read_noequip();
+ itemdb_read_itemtrade();
+ if (battle_config.cardillust_read_grffile)
+ itemdb_read_cardillustnametable();
+ if (battle_config.item_equip_override_grffile)
+ itemdb_read_itemslottable();
+ if (battle_config.item_slots_override_grffile)
+ itemdb_read_itemslotcounttable();
+ if (battle_config.item_name_override_grffile)
+ itemdb_read_itemnametable();
+}
+
+/*==========================================
+ * Initialize / Finalize
+ *------------------------------------------
+ */
+static int itemdb_final_sub (DBKey key,void *data,va_list ap)
+{
+ int flag;
+ struct item_data *id = (struct item_data *)data;
+
+ flag = va_arg(ap, int);
+ if (id->script)
+ {
+ script_free_code(id->script);
+ id->script = NULL;
+ }
+ if (id->equip_script)
+ {
+ script_free_code(id->equip_script);
+ id->equip_script = NULL;
+ }
+ if (id->unequip_script)
+ {
+ script_free_code(id->unequip_script);
+ id->unequip_script = NULL;
+ }
+ // Whether to clear the item data (exception: do not clear the dummy item data
+ if (flag && id != &dummy_item)
+ aFree(id);
+
+ return 0;
+}
+
+void itemdb_reload(void)
+{
+ //Just read, the function takes care of freeing scripts.
+ itemdb_read();
+}
+
+void do_final_itemdb(void)
+{
+ item_db->destroy(item_db, itemdb_final_sub, 1);
+ if (dummy_item.script) {
+ script_free_code(dummy_item.script);
+ dummy_item.script = NULL;
+ }
+ if (dummy_item.equip_script) {
+ script_free_code(dummy_item.equip_script);
+ dummy_item.equip_script = NULL;
+ }
+ if (dummy_item.unequip_script) {
+ script_free_code(dummy_item.unequip_script);
+ dummy_item.unequip_script = NULL;
+ }
+}
+
+int do_init_itemdb(void)
+{
+ item_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+ create_dummy_data(); //Dummy data item.
+ itemdb_read();
+
+ return 0;
+}
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index b141abbfc..f1e97227c 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -1,148 +1,148 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-#include "map.h"
-#define MAX_RANDITEM 10000
-
-enum {
- IT_HEALING = 0,
- IT_UNKNOWN, //1
- IT_USABLE, //2
- IT_ETC, //3
- IT_WEAPON, //4
- IT_ARMOR, //5
- IT_CARD, //6
- IT_PETEGG, //7
- IT_PETARMOR,//8
- IT_UNKNOWN2,//9
- IT_AMMO, //10
- IT_DELAYCONSUME,//11
- IT_MAX
-} item_types;
-
-#define CARD0_FORGE 0x00FF
-#define CARD0_CREATE 0x00FE
-#define CARD0_PET ((short)0xFF00)
-
-//Marks if the card0 given is "special" (non-item id used to mark pets/created items. [Skotlex]
-#define itemdb_isspecial(i) (i == CARD0_FORGE || i == CARD0_CREATE || i == CARD0_PET)
-
-//Use apple for unknown items.
-#define UNKNOWN_ITEM_ID 512
-
-struct item_data {
- int nameid;
- char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
- char prefix[NAME_LENGTH],suffix[NAME_LENGTH];
- char cardillustname[64];
- //Do not add stuff between value_buy and wlv (see how getiteminfo works)
- int value_buy;
- int value_sell;
- int type;
- int maxchance; //For logs, for external game info, for scripts: Max drop chance of this item (e.g. 0.01% , etc.. if it = 0, then monsters don't drop it) [Lupus]
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int slot;
- int look;
- int elv;
- int wlv;
-//Lupus: I rearranged order of these fields due to compatibility with ITEMINFO script command
-// some script commands should be revised as well...
- unsigned int class_base[3]; //Specifies if the base can wear this item (split in 3 indexes per type: 1-1, 2-1, 2-2)
- unsigned class_upper : 3; //Specifies if the upper-type can equip it (1: normal, 2: upper, 3: baby)
- struct {
- unsigned short chance;
- int id;
- } mob[MAX_SEARCH]; //Holds the mobs that have the highest drop rate for this item. [Skotlex]
- struct script_code *script; //Default script for everything.
- struct script_code *equip_script; //Script executed once when equipping.
- struct script_code *unequip_script;//Script executed once when unequipping.
- struct {
- unsigned available : 1;
- unsigned value_notdc : 1;
- unsigned value_notoc : 1;
- short no_equip;
- unsigned no_use : 1;
- unsigned no_refine : 1; // [celest]
- unsigned delay_consume : 1; // Signifies items that are not consumed inmediately upon double-click [Skotlex]
- unsigned trade_restriction : 7; //Item restrictions mask [Skotlex]
- unsigned autoequip: 1;
- } flag;
- short gm_lv_trade_override; //GM-level to override trade_restriction
- int view_id;
-};
-
-struct item_group {
- int nameid[MAX_RANDITEM];
- int qty; //Counts amount of items in the group.
-};
-
-struct item_data* itemdb_searchname(const char *name);
-int itemdb_searchname_array(struct item_data** data, int size, const char *str);
-struct item_data* itemdb_load(int nameid);
-struct item_data* itemdb_search(int nameid);
-struct item_data* itemdb_exists(int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-#define itemdb_atk(n) itemdb_search(n)->atk
-#define itemdb_def(n) itemdb_search(n)->def
-#define itemdb_look(n) itemdb_search(n)->look
-#define itemdb_weight(n) itemdb_search(n)->weight
-#define itemdb_equip(n) itemdb_search(n)->equip
-#define itemdb_usescript(n) itemdb_search(n)->script
-#define itemdb_equipscript(n) itemdb_search(n)->script
-#define itemdb_wlv(n) itemdb_search(n)->wlv
-#define itemdb_range(n) itemdb_search(n)->range
-#define itemdb_slot(n) itemdb_search(n)->slot
-#define itemdb_available(n) (itemdb_exists(n) && itemdb_search(n)->flag.available)
-#define itemdb_viewid(n) (itemdb_search(n)->view_id)
-#define itemdb_autoequip(n) (itemdb_search(n)->flag.autoequip)
-int itemdb_group_bonus(struct map_session_data *sd, int itemid);
-
-int itemdb_searchrandomid(int flags);
-
-#define itemdb_value_buy(n) itemdb_search(n)->value_buy
-#define itemdb_value_sell(n) itemdb_search(n)->value_sell
-#define itemdb_value_notdc(n) itemdb_search(n)->flag.value_notdc
-#define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc
-#define itemdb_canrefine(n) itemdb_search(n)->flag.no_refine
-//Item trade restrictions [Skotlex]
-int itemdb_isdropable_sub(struct item_data *, int, int);
-int itemdb_cantrade_sub(struct item_data*, int, int);
-int itemdb_canpartnertrade_sub(struct item_data*, int, int);
-int itemdb_cansell_sub(struct item_data*,int, int);
-int itemdb_cancartstore_sub(struct item_data*, int, int);
-int itemdb_canstore_sub(struct item_data*, int, int);
-int itemdb_canguildstore_sub(struct item_data*, int, int);
-int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int));
-#define itemdb_isdropable(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_isdropable_sub)
-#define itemdb_cantrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_cantrade_sub)
-#define itemdb_canpartnertrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_canpartnertrade_sub)
-#define itemdb_cansell(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cansell_sub)
-#define itemdb_cancartstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cancartstore_sub)
-#define itemdb_canstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_canstore_sub)
-#define itemdb_canguildstore(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canguildstore_sub)
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-int itemdb_isidentified(int);
-int itemdb_isstackable(int);
-int itemdb_isstackable2(struct item_data *);
-
-// itemdb_equipƒ}ƒNƒ‚Æitemdb_equippoint‚Ƃ̈Ⴂ‚Í
-// ‘OŽÒ‚ªŽI‘¤db‚Å’è‹`‚³‚ꂽ’l‚»‚Ì‚à‚Ì‚ð•Ô‚·‚̂ɑ΂µ
-// ŒãŽÒ‚Ísessiondata‚ðl—¶‚µ‚½ˆÆ‘¤‚Å‚Ì‘•”õ‰Â”\êŠ
-// ‚·‚ׂĂ̑g‚݇‚킹‚ð•Ô‚·
-
-void itemdb_reload(void);
-
-void do_final_itemdb(void);
-int do_init_itemdb(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _ITEMDB_H_
+#define _ITEMDB_H_
+
+#include "map.h"
+#define MAX_RANDITEM 10000
+
+enum {
+ IT_HEALING = 0,
+ IT_UNKNOWN, //1
+ IT_USABLE, //2
+ IT_ETC, //3
+ IT_WEAPON, //4
+ IT_ARMOR, //5
+ IT_CARD, //6
+ IT_PETEGG, //7
+ IT_PETARMOR,//8
+ IT_UNKNOWN2,//9
+ IT_AMMO, //10
+ IT_DELAYCONSUME,//11
+ IT_MAX
+} item_types;
+
+#define CARD0_FORGE 0x00FF
+#define CARD0_CREATE 0x00FE
+#define CARD0_PET ((short)0xFF00)
+
+//Marks if the card0 given is "special" (non-item id used to mark pets/created items. [Skotlex]
+#define itemdb_isspecial(i) (i == CARD0_FORGE || i == CARD0_CREATE || i == CARD0_PET)
+
+//Use apple for unknown items.
+#define UNKNOWN_ITEM_ID 512
+
+struct item_data {
+ int nameid;
+ char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
+ char prefix[NAME_LENGTH],suffix[NAME_LENGTH];
+ char cardillustname[64];
+ //Do not add stuff between value_buy and wlv (see how getiteminfo works)
+ int value_buy;
+ int value_sell;
+ int type;
+ int maxchance; //For logs, for external game info, for scripts: Max drop chance of this item (e.g. 0.01% , etc.. if it = 0, then monsters don't drop it) [Lupus]
+ int sex;
+ int equip;
+ int weight;
+ int atk;
+ int def;
+ int range;
+ int slot;
+ int look;
+ int elv;
+ int wlv;
+//Lupus: I rearranged order of these fields due to compatibility with ITEMINFO script command
+// some script commands should be revised as well...
+ unsigned int class_base[3]; //Specifies if the base can wear this item (split in 3 indexes per type: 1-1, 2-1, 2-2)
+ unsigned class_upper : 3; //Specifies if the upper-type can equip it (1: normal, 2: upper, 3: baby)
+ struct {
+ unsigned short chance;
+ int id;
+ } mob[MAX_SEARCH]; //Holds the mobs that have the highest drop rate for this item. [Skotlex]
+ struct script_code *script; //Default script for everything.
+ struct script_code *equip_script; //Script executed once when equipping.
+ struct script_code *unequip_script;//Script executed once when unequipping.
+ struct {
+ unsigned available : 1;
+ unsigned value_notdc : 1;
+ unsigned value_notoc : 1;
+ short no_equip;
+ unsigned no_use : 1;
+ unsigned no_refine : 1; // [celest]
+ unsigned delay_consume : 1; // Signifies items that are not consumed inmediately upon double-click [Skotlex]
+ unsigned trade_restriction : 7; //Item restrictions mask [Skotlex]
+ unsigned autoequip: 1;
+ } flag;
+ short gm_lv_trade_override; //GM-level to override trade_restriction
+ int view_id;
+};
+
+struct item_group {
+ int nameid[MAX_RANDITEM];
+ int qty; //Counts amount of items in the group.
+};
+
+struct item_data* itemdb_searchname(const char *name);
+int itemdb_searchname_array(struct item_data** data, int size, const char *str);
+struct item_data* itemdb_load(int nameid);
+struct item_data* itemdb_search(int nameid);
+struct item_data* itemdb_exists(int nameid);
+#define itemdb_type(n) itemdb_search(n)->type
+#define itemdb_atk(n) itemdb_search(n)->atk
+#define itemdb_def(n) itemdb_search(n)->def
+#define itemdb_look(n) itemdb_search(n)->look
+#define itemdb_weight(n) itemdb_search(n)->weight
+#define itemdb_equip(n) itemdb_search(n)->equip
+#define itemdb_usescript(n) itemdb_search(n)->script
+#define itemdb_equipscript(n) itemdb_search(n)->script
+#define itemdb_wlv(n) itemdb_search(n)->wlv
+#define itemdb_range(n) itemdb_search(n)->range
+#define itemdb_slot(n) itemdb_search(n)->slot
+#define itemdb_available(n) (itemdb_exists(n) && itemdb_search(n)->flag.available)
+#define itemdb_viewid(n) (itemdb_search(n)->view_id)
+#define itemdb_autoequip(n) (itemdb_search(n)->flag.autoequip)
+int itemdb_group_bonus(struct map_session_data *sd, int itemid);
+
+int itemdb_searchrandomid(int flags);
+
+#define itemdb_value_buy(n) itemdb_search(n)->value_buy
+#define itemdb_value_sell(n) itemdb_search(n)->value_sell
+#define itemdb_value_notdc(n) itemdb_search(n)->flag.value_notdc
+#define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc
+#define itemdb_canrefine(n) itemdb_search(n)->flag.no_refine
+//Item trade restrictions [Skotlex]
+int itemdb_isdropable_sub(struct item_data *, int, int);
+int itemdb_cantrade_sub(struct item_data*, int, int);
+int itemdb_canpartnertrade_sub(struct item_data*, int, int);
+int itemdb_cansell_sub(struct item_data*,int, int);
+int itemdb_cancartstore_sub(struct item_data*, int, int);
+int itemdb_canstore_sub(struct item_data*, int, int);
+int itemdb_canguildstore_sub(struct item_data*, int, int);
+int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int));
+#define itemdb_isdropable(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_isdropable_sub)
+#define itemdb_cantrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_cantrade_sub)
+#define itemdb_canpartnertrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_canpartnertrade_sub)
+#define itemdb_cansell(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cansell_sub)
+#define itemdb_cancartstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cancartstore_sub)
+#define itemdb_canstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_canstore_sub)
+#define itemdb_canguildstore(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canguildstore_sub)
+
+int itemdb_isequip(int);
+int itemdb_isequip2(struct item_data *);
+int itemdb_isidentified(int);
+int itemdb_isstackable(int);
+int itemdb_isstackable2(struct item_data *);
+
+// itemdb_equipƒ}ƒNƒ‚Æitemdb_equippoint‚Ƃ̈Ⴂ‚Í
+// ‘OŽÒ‚ªŽI‘¤db‚Å’è‹`‚³‚ꂽ’l‚»‚Ì‚à‚Ì‚ð•Ô‚·‚̂ɑ΂µ
+// ŒãŽÒ‚Ísessiondata‚ðl—¶‚µ‚½ˆÆ‘¤‚Å‚Ì‘•”õ‰Â”\êŠ
+// ‚·‚ׂĂ̑g‚݇‚킹‚ð•Ô‚·
+
+void itemdb_reload(void);
+
+void do_final_itemdb(void);
+int do_init_itemdb(void);
+
+#endif
diff --git a/src/map/log.c b/src/map/log.c
index 0d6f010f2..209b81d32 100644
--- a/src/map/log.c
+++ b/src/map/log.c
@@ -1,532 +1,532 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// Logging functions by Azndragon & Codemaster
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/strlib.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
-#include "itemdb.h"
-#include "map.h"
-#include "log.h"
-
-#ifndef SQL_DEBUG
-
-#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
-
-#else
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-#endif
-
-struct Log_Config log_config;
-
-char timestring[255];
-time_t curtime;
-
-//FILTER OPTIONS
-//0 = Don't log
-//1 = Log any item
-//Bits: ||
-//2 - Healing items (0)
-//3 - Etc Items(3) + Arrows (10)
-//4 - Usable Items(2) + Scrolls,Lures(11)
-//5 - Weapon(4)
-//6 - Shields,Armor,Headgears,Accessories,etc(5)
-//7 - Cards(6)
-//8 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
-//9 - Log expensive items ( >= price_log)
-//10 - Log big amount of items ( >= amount_log)
-//11 - Log refined items (if their refine >= refine_log )
-//12 - Log rare items (if their drop chance <= rare_log )
-
-//check if this item should be logged according the settings
-int should_log_item(int filter, int nameid, int amount) {
- struct item_data *item_data;
- if ((item_data= itemdb_exists(nameid)) == NULL) return 0;
- if ((filter&1) || // Filter = 1, we log any item
- (filter&2 && item_data->type == IT_HEALING ) ||
- (filter&4 && (item_data->type == IT_ETC || item_data->type == IT_AMMO) ) ||
- (filter&8 && item_data->type == IT_USABLE ) ||
- (filter&16 && item_data->type == IT_WEAPON ) ||
- (filter&32 && item_data->type == IT_ARMOR ) ||
- (filter&64 && item_data->type == IT_CARD ) ||
- (filter&128 && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR) ) ||
- (filter&256 && item_data->value_buy >= log_config.price_items_log ) || //expensive items
- (filter&512 && abs(amount) >= log_config.amount_items_log ) || //big amount of items
- (filter&2048 && ((item_data->maxchance <= log_config.rare_items_log) || item_data->nameid == 714) ) //Rare items or Emperium
- ) return item_data->nameid;
-
- return 0;
-}
-
-int log_branch(struct map_session_data *sd)
-{
-#ifndef TXT_ONLY
- char t_name[NAME_LENGTH*2];
-#endif
- FILE *logfp;
-
- if(!log_config.enable_logs)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`branch_date`, `account_id`, `char_id`, `char_name`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%s')",
- log_config.log_branch_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex));
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_branch,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%s%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, mapindex_id2name(sd->mapindex), RETCODE);
- fclose(logfp);
- return 1;
-}
-
-
-int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm)
-{
- FILE *logfp;
- char *mapname;
-
- nullpo_retr(0, sd);
- //Should we log this item? [Lupus]
- if (!should_log_item(log_config.filter,nameid, amount))
- return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus]
-
- mapname = (char*)mapindex_id2name(sd->mapindex);
-
- if(mapname==NULL)
- mapname="";
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- if (itm==NULL) {
- //We log common item
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')",
- log_config.log_pick_db, sd->status.char_id, type, nameid, amount, mapname);
- } else {
- //We log Extended item
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",
- log_config.log_pick_db, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname);
- }
-
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_pick,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
-
- if (itm==NULL) {
- //We log common item
- fprintf(logfp,"%s - %d\t%s\t%d,%d,%s%s",
- timestring, sd->status.char_id, type, nameid, amount, mapname, RETCODE);
-
- } else {
- //We log Extended item
- fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s%s",
- timestring, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname, RETCODE);
- }
- fclose(logfp);
- return 1; //Logged
-}
-
-//Mob picked item
-int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm)
-{
- FILE *logfp;
- char *mapname;
-
- nullpo_retr(0, md);
- //Should we log this item? [Lupus]
- if (!should_log_item(log_config.filter,nameid, amount))
- return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus]
-
- //either PLAYER or MOB (here we get map name and objects ID)
- mapname = map[md->bl.m].name;
- if(mapname==NULL)
- mapname="";
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- if (itm==NULL) {
- //We log common item
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')",
- log_config.log_pick_db, md->class_, type, nameid, amount, mapname);
- } else {
- //We log Extended item
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",
- log_config.log_pick_db, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname);
- }
-
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_pick,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
-
- if (itm==NULL) {
- //We log common item
- fprintf(logfp,"%s - %d\t%s\t%d,%d,%s%s",
- timestring, md->class_, type, nameid, amount, mapname, RETCODE);
-
- } else {
- //We log Extended item
- fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s%s",
- timestring, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname, RETCODE);
- }
- fclose(logfp);
- return 1; //Logged
-}
-
-int log_zeny(struct map_session_data *sd, char *type, struct map_session_data *src_sd, int amount)
-{
-// FILE *logfp;
- if(!log_config.enable_logs || (log_config.zeny!=1 && abs(amount)<log_config.zeny))
- return 0;
-
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `src_id`, `type`, `amount`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%s')",
- log_config.log_zeny_db, sd->status.char_id, src_sd->status.char_id, type, amount, mapindex_id2name(sd->mapindex));
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
-// if((logfp=fopen(log_config.log_zeny,"a+")) == NULL)
-// return 0;
-// time(&curtime);
-// strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
-// fprintf(logfp,"%s - %s[%d]\t%s[%d]\t%d\t%s", timestring, sd->status.name, sd->status.account_id, target_sd->status.name, target_sd->status.account_id, sd->deal.zeny, RETCODE);
-// fclose(logfp);
-// return 1;
- return 0;
-}
-
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp)
-{
- FILE *logfp;
-
- if(!log_config.enable_logs)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`mvp_date`, `kill_char_id`, `monster_id`, `prize`, `mvpexp`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%s') ", log_config.log_mvpdrop_db, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], mapindex_id2name(sd->mapindex));
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_mvpdrop,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], RETCODE);
- fclose(logfp);
- return 0;
-}
-
-
-int log_atcommand(struct map_session_data *sd, const char *message)
-{
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[NAME_LENGTH*2];
- char t_msg[MESSAGE_SIZE*2+1]; //These are the contents of an @ call, so there shouldn't be overflow danger here?
-#endif
-
- if(!log_config.enable_logs)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
- log_config.log_gm_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message));
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_gm,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
- fclose(logfp);
- return 1;
-}
-
-int log_npc(struct map_session_data *sd, const char *message)
-{ //[Lupus]
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[NAME_LENGTH*2];
- char t_msg[255+1]; //it's 255 chars MAX.
-#endif
-
- if(!log_config.enable_logs)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`npc_date`, `account_id`, `char_id`, `char_name`, `map`, `mes`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
- log_config.log_npc_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message));
- if(mysql_query(&logmysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp=fopen(log_config.log_npc,"a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
- fclose(logfp);
- return 1;
-}
-
-//ChatLogging
-// Log CHAT (currently only: Party, Guild, Whisper)
-// LOGGING FILTERS [Lupus]
-//=============================================================
-//0 = Don't log at all
-//1 = Log any chat messages
-//Advanced Filter Bits: ||
-//2 - Log Whisper messages
-//3 - Log Party messages
-//4 - Log Guild messages
-//5 - Log Common messages (not implemented)
-//6 - Don't log when WOE is on
-//Example:
-//log_chat: 1 = logs ANY messages
-//log_chat: 6 = logs both Whisper & Party messages
-//log_chat: 8 = logs only Guild messages
-//log_chat: 18 = logs only Whisper, when WOE is off
-
-int log_chat(char *type, int type_id, int src_charid, int src_accid, char *map, int x, int y, char *dst_charname, char *message){
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_charname[NAME_LENGTH*2];
- char t_msg[MESSAGE_SIZE*2+1]; //Chat line fully escaped, with an extra space just in case.
-#endif
-
- //Check ON/OFF
- if(log_config.chat <= 0)
- return 0; //Deactivated
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0){
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `type`, `type_id`, `src_charid`, `src_accountid`, `src_map`, `src_map_x`, `src_map_y`, `dst_charname`, `message`) VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%s')",
- log_config.log_chat_db, type, type_id, src_charid, src_accid, map, x, y, jstrescapecpy(t_charname, dst_charname), jstrescapecpy(t_msg, message));
-
- if(mysql_query(&logmysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- return 1;
- }
-#endif
- if((logfp = fopen(log_config.log_chat, "a+")) == NULL)
- return 0;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- //DATE - type,type_id,src_charid,src_accountid,src_map,src_x,src_y,dst_charname,message
- fprintf(logfp, "%s - %s,%d,%d,%d,%s,%d,%d,%s,%s%s",
- timestring, type, type_id, src_charid, src_accid, map, x, y, dst_charname, message, RETCODE);
- fclose(logfp);
- return 1;
-}
-
-
-void log_set_defaults(void)
-{
- malloc_set(&log_config, 0, sizeof(log_config));
-
- //LOG FILTER Default values
- log_config.refine_items_log = 5; //log refined items, with refine >= +7
- log_config.rare_items_log = 100; //log rare items. drop chance <= 1%
- log_config.price_items_log = 1000; //1000z
- log_config.amount_items_log = 100;
-}
-
-int log_config_read(char *cfgName)
-{
- static int count = 0;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((count++) == 0)
- log_set_defaults();
-
- if((fp = fopen(cfgName, "r")) == NULL)
- {
- ShowError("Log configuration file not found at: %s\n", cfgName);
- return 1;
- }
-
- while(fgets(line, sizeof(line) -1, fp))
- {
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- if(sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2)
- {
- if(strcmpi(w1,"enable_logs") == 0) {
- log_config.enable_logs = (atoi(w2));
- if (log_config.enable_logs&1) //Log everything.
- log_config.enable_logs=0xFFFFFFFF;
- } else if(strcmpi(w1,"sql_logs") == 0) {
- log_config.sql_logs = (atoi(w2));
-//start of common filter settings
- } else if(strcmpi(w1,"rare_items_log") == 0) {
- log_config.rare_items_log = (atoi(w2));
- } else if(strcmpi(w1,"refine_items_log") == 0) {
- log_config.refine_items_log = (atoi(w2));
- } else if(strcmpi(w1,"price_items_log") == 0) {
- log_config.price_items_log = (atoi(w2));
- } else if(strcmpi(w1,"amount_items_log") == 0) {
- log_config.amount_items_log = (atoi(w2));
-//end of common filter settings
- } else if(strcmpi(w1,"log_branch") == 0) {
- log_config.branch = (atoi(w2));
- } else if(strcmpi(w1,"log_filter") == 0) {
- log_config.filter = (atoi(w2));
- } else if(strcmpi(w1,"log_zeny") == 0) {
- log_config.zeny = (atoi(w2));
- } else if(strcmpi(w1,"log_gm") == 0) {
- log_config.gm = (atoi(w2));
- } else if(strcmpi(w1,"log_npc") == 0) {
- log_config.npc = (atoi(w2));
- } else if(strcmpi(w1, "log_chat") == 0) {
- log_config.chat = (atoi(w2));
- } else if(strcmpi(w1,"log_mvpdrop") == 0) {
- log_config.mvpdrop = (atoi(w2));
- }
-
-#ifndef TXT_ONLY
- else if(strcmpi(w1, "log_branch_db") == 0) {
- strcpy(log_config.log_branch_db, w2);
- if(log_config.branch == 1)
- ShowNotice("Logging Dead Branch Usage to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_pick_db") == 0) {
- strcpy(log_config.log_pick_db, w2);
- if(log_config.filter)
- ShowNotice("Logging Item Picks to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_zeny_db") == 0) {
- strcpy(log_config.log_zeny_db, w2);
- if(log_config.zeny == 1)
- ShowNotice("Logging Zeny to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_mvpdrop_db") == 0) {
- strcpy(log_config.log_mvpdrop_db, w2);
- if(log_config.mvpdrop == 1)
- ShowNotice("Logging MVP Drops to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_gm_db") == 0) {
- strcpy(log_config.log_gm_db, w2);
- if(log_config.gm > 0)
- ShowNotice("Logging GM Level %d Commands to table `%s`\n", log_config.gm, w2);
- } else if(strcmpi(w1, "log_npc_db") == 0) {
- strcpy(log_config.log_npc_db, w2);
- if(log_config.npc > 0)
- ShowNotice("Logging NPC 'logmes' to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_chat_db") == 0) {
- strcpy(log_config.log_chat_db, w2);
- if(log_config.chat > 0)
- ShowNotice("Logging CHAT to table `%s`\n", w2);
- }
-#endif
-
- else if(strcmpi(w1, "log_branch_file") == 0) {
- strcpy(log_config.log_branch, w2);
- if(log_config.branch > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging Dead Branch Usage to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_pick_file") == 0) {
- strcpy(log_config.log_pick, w2);
- if(log_config.filter > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging Item Picks to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_zeny_file") == 0) {
- strcpy(log_config.log_zeny, w2);
- if(log_config.zeny > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging Zeny to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_mvpdrop_file") == 0) {
- strcpy(log_config.log_mvpdrop, w2);
- if(log_config.mvpdrop > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging MVP Drops to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_gm_file") == 0) {
- strcpy(log_config.log_gm, w2);
- if(log_config.gm > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging GM Level %d Commands to file `%s`.txt\n", log_config.gm, w2);
- } else if(strcmpi(w1, "log_npc_file") == 0) {
- strcpy(log_config.log_npc, w2);
- if(log_config.npc > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging NPC 'logmes' to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_chat_file") == 0) {
- strcpy(log_config.log_chat, w2);
- if(log_config.chat > 0 && log_config.sql_logs < 1)
- ShowNotice("Logging CHAT to file `%s`.txt\n", w2);
- //support the import command, just like any other config
- } else if(strcmpi(w1,"import") == 0) {
- log_config_read(w2);
- }
- }
- }
-
- fclose(fp);
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// Logging functions by Azndragon & Codemaster
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../common/strlib.h"
+#include "../common/nullpo.h"
+#include "../common/showmsg.h"
+#include "../common/malloc.h"
+#include "itemdb.h"
+#include "map.h"
+#include "log.h"
+
+#ifndef SQL_DEBUG
+
+#define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y)) //supports ' in names and runs faster [Kevin]
+
+#else
+
+#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+#endif
+
+struct Log_Config log_config;
+
+char timestring[255];
+time_t curtime;
+
+//FILTER OPTIONS
+//0 = Don't log
+//1 = Log any item
+//Bits: ||
+//2 - Healing items (0)
+//3 - Etc Items(3) + Arrows (10)
+//4 - Usable Items(2) + Scrolls,Lures(11)
+//5 - Weapon(4)
+//6 - Shields,Armor,Headgears,Accessories,etc(5)
+//7 - Cards(6)
+//8 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
+//9 - Log expensive items ( >= price_log)
+//10 - Log big amount of items ( >= amount_log)
+//11 - Log refined items (if their refine >= refine_log )
+//12 - Log rare items (if their drop chance <= rare_log )
+
+//check if this item should be logged according the settings
+int should_log_item(int filter, int nameid, int amount) {
+ struct item_data *item_data;
+ if ((item_data= itemdb_exists(nameid)) == NULL) return 0;
+ if ((filter&1) || // Filter = 1, we log any item
+ (filter&2 && item_data->type == IT_HEALING ) ||
+ (filter&4 && (item_data->type == IT_ETC || item_data->type == IT_AMMO) ) ||
+ (filter&8 && item_data->type == IT_USABLE ) ||
+ (filter&16 && item_data->type == IT_WEAPON ) ||
+ (filter&32 && item_data->type == IT_ARMOR ) ||
+ (filter&64 && item_data->type == IT_CARD ) ||
+ (filter&128 && (item_data->type == IT_PETEGG || item_data->type == IT_PETARMOR) ) ||
+ (filter&256 && item_data->value_buy >= log_config.price_items_log ) || //expensive items
+ (filter&512 && abs(amount) >= log_config.amount_items_log ) || //big amount of items
+ (filter&2048 && ((item_data->maxchance <= log_config.rare_items_log) || item_data->nameid == 714) ) //Rare items or Emperium
+ ) return item_data->nameid;
+
+ return 0;
+}
+
+int log_branch(struct map_session_data *sd)
+{
+#ifndef TXT_ONLY
+ char t_name[NAME_LENGTH*2];
+#endif
+ FILE *logfp;
+
+ if(!log_config.enable_logs)
+ return 0;
+ nullpo_retr(0, sd);
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`branch_date`, `account_id`, `char_id`, `char_name`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%s')",
+ log_config.log_branch_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex));
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_branch,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+ fprintf(logfp,"%s - %s[%d:%d]\t%s%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, mapindex_id2name(sd->mapindex), RETCODE);
+ fclose(logfp);
+ return 1;
+}
+
+
+int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm)
+{
+ FILE *logfp;
+ char *mapname;
+
+ nullpo_retr(0, sd);
+ //Should we log this item? [Lupus]
+ if (!should_log_item(log_config.filter,nameid, amount))
+ return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus]
+
+ mapname = (char*)mapindex_id2name(sd->mapindex);
+
+ if(mapname==NULL)
+ mapname="";
+
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ if (itm==NULL) {
+ //We log common item
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')",
+ log_config.log_pick_db, sd->status.char_id, type, nameid, amount, mapname);
+ } else {
+ //We log Extended item
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",
+ log_config.log_pick_db, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname);
+ }
+
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_pick,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+
+ if (itm==NULL) {
+ //We log common item
+ fprintf(logfp,"%s - %d\t%s\t%d,%d,%s%s",
+ timestring, sd->status.char_id, type, nameid, amount, mapname, RETCODE);
+
+ } else {
+ //We log Extended item
+ fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s%s",
+ timestring, sd->status.char_id, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname, RETCODE);
+ }
+ fclose(logfp);
+ return 1; //Logged
+}
+
+//Mob picked item
+int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm)
+{
+ FILE *logfp;
+ char *mapname;
+
+ nullpo_retr(0, md);
+ //Should we log this item? [Lupus]
+ if (!should_log_item(log_config.filter,nameid, amount))
+ return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus]
+
+ //either PLAYER or MOB (here we get map name and objects ID)
+ mapname = map[md->bl.m].name;
+ if(mapname==NULL)
+ mapname="";
+
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ if (itm==NULL) {
+ //We log common item
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%s')",
+ log_config.log_pick_db, md->class_, type, nameid, amount, mapname);
+ } else {
+ //We log Extended item
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",
+ log_config.log_pick_db, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname);
+ }
+
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_pick,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+
+ if (itm==NULL) {
+ //We log common item
+ fprintf(logfp,"%s - %d\t%s\t%d,%d,%s%s",
+ timestring, md->class_, type, nameid, amount, mapname, RETCODE);
+
+ } else {
+ //We log Extended item
+ fprintf(logfp,"%s - %d\t%s\t%d,%d,%d,%d,%d,%d,%d,%s%s",
+ timestring, md->class_, type, itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], mapname, RETCODE);
+ }
+ fclose(logfp);
+ return 1; //Logged
+}
+
+int log_zeny(struct map_session_data *sd, char *type, struct map_session_data *src_sd, int amount)
+{
+// FILE *logfp;
+ if(!log_config.enable_logs || (log_config.zeny!=1 && abs(amount)<log_config.zeny))
+ return 0;
+
+ nullpo_retr(0, sd);
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `char_id`, `src_id`, `type`, `amount`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%s')",
+ log_config.log_zeny_db, sd->status.char_id, src_sd->status.char_id, type, amount, mapindex_id2name(sd->mapindex));
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+// if((logfp=fopen(log_config.log_zeny,"a+")) == NULL)
+// return 0;
+// time(&curtime);
+// strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+// fprintf(logfp,"%s - %s[%d]\t%s[%d]\t%d\t%s", timestring, sd->status.name, sd->status.account_id, target_sd->status.name, target_sd->status.account_id, sd->deal.zeny, RETCODE);
+// fclose(logfp);
+// return 1;
+ return 0;
+}
+
+int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp)
+{
+ FILE *logfp;
+
+ if(!log_config.enable_logs)
+ return 0;
+ nullpo_retr(0, sd);
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`mvp_date`, `kill_char_id`, `monster_id`, `prize`, `mvpexp`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%s') ", log_config.log_mvpdrop_db, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], mapindex_id2name(sd->mapindex));
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_mvpdrop,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+ fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], RETCODE);
+ fclose(logfp);
+ return 0;
+}
+
+
+int log_atcommand(struct map_session_data *sd, const char *message)
+{
+ FILE *logfp;
+#ifndef TXT_ONLY
+ char t_name[NAME_LENGTH*2];
+ char t_msg[MESSAGE_SIZE*2+1]; //These are the contents of an @ call, so there shouldn't be overflow danger here?
+#endif
+
+ if(!log_config.enable_logs)
+ return 0;
+ nullpo_retr(0, sd);
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
+ log_config.log_gm_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message));
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_gm,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+ fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
+ fclose(logfp);
+ return 1;
+}
+
+int log_npc(struct map_session_data *sd, const char *message)
+{ //[Lupus]
+ FILE *logfp;
+#ifndef TXT_ONLY
+ char t_name[NAME_LENGTH*2];
+ char t_msg[255+1]; //it's 255 chars MAX.
+#endif
+
+ if(!log_config.enable_logs)
+ return 0;
+ nullpo_retr(0, sd);
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0)
+ {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`npc_date`, `account_id`, `char_id`, `char_name`, `map`, `mes`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
+ log_config.log_npc_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), mapindex_id2name(sd->mapindex), jstrescapecpy(t_msg, (char *)message));
+ if(mysql_query(&logmysql_handle, tmp_sql))
+ {
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp=fopen(log_config.log_npc,"a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+ fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
+ fclose(logfp);
+ return 1;
+}
+
+//ChatLogging
+// Log CHAT (currently only: Party, Guild, Whisper)
+// LOGGING FILTERS [Lupus]
+//=============================================================
+//0 = Don't log at all
+//1 = Log any chat messages
+//Advanced Filter Bits: ||
+//2 - Log Whisper messages
+//3 - Log Party messages
+//4 - Log Guild messages
+//5 - Log Common messages (not implemented)
+//6 - Don't log when WOE is on
+//Example:
+//log_chat: 1 = logs ANY messages
+//log_chat: 6 = logs both Whisper & Party messages
+//log_chat: 8 = logs only Guild messages
+//log_chat: 18 = logs only Whisper, when WOE is off
+
+int log_chat(char *type, int type_id, int src_charid, int src_accid, char *map, int x, int y, char *dst_charname, char *message){
+ FILE *logfp;
+#ifndef TXT_ONLY
+ char t_charname[NAME_LENGTH*2];
+ char t_msg[MESSAGE_SIZE*2+1]; //Chat line fully escaped, with an extra space just in case.
+#endif
+
+ //Check ON/OFF
+ if(log_config.chat <= 0)
+ return 0; //Deactivated
+
+#ifndef TXT_ONLY
+ if(log_config.sql_logs > 0){
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`time`, `type`, `type_id`, `src_charid`, `src_accountid`, `src_map`, `src_map_x`, `src_map_y`, `dst_charname`, `message`) VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%s')",
+ log_config.log_chat_db, type, type_id, src_charid, src_accid, map, x, y, jstrescapecpy(t_charname, dst_charname), jstrescapecpy(t_msg, message));
+
+ if(mysql_query(&logmysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&logmysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ return 1;
+ }
+#endif
+ if((logfp = fopen(log_config.log_chat, "a+")) == NULL)
+ return 0;
+ time(&curtime);
+ strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+ //DATE - type,type_id,src_charid,src_accountid,src_map,src_x,src_y,dst_charname,message
+ fprintf(logfp, "%s - %s,%d,%d,%d,%s,%d,%d,%s,%s%s",
+ timestring, type, type_id, src_charid, src_accid, map, x, y, dst_charname, message, RETCODE);
+ fclose(logfp);
+ return 1;
+}
+
+
+void log_set_defaults(void)
+{
+ malloc_set(&log_config, 0, sizeof(log_config));
+
+ //LOG FILTER Default values
+ log_config.refine_items_log = 5; //log refined items, with refine >= +7
+ log_config.rare_items_log = 100; //log rare items. drop chance <= 1%
+ log_config.price_items_log = 1000; //1000z
+ log_config.amount_items_log = 100;
+}
+
+int log_config_read(char *cfgName)
+{
+ static int count = 0;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if ((count++) == 0)
+ log_set_defaults();
+
+ if((fp = fopen(cfgName, "r")) == NULL)
+ {
+ ShowError("Log configuration file not found at: %s\n", cfgName);
+ return 1;
+ }
+
+ while(fgets(line, sizeof(line) -1, fp))
+ {
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ if(sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2)
+ {
+ if(strcmpi(w1,"enable_logs") == 0) {
+ log_config.enable_logs = (atoi(w2));
+ if (log_config.enable_logs&1) //Log everything.
+ log_config.enable_logs=0xFFFFFFFF;
+ } else if(strcmpi(w1,"sql_logs") == 0) {
+ log_config.sql_logs = (atoi(w2));
+//start of common filter settings
+ } else if(strcmpi(w1,"rare_items_log") == 0) {
+ log_config.rare_items_log = (atoi(w2));
+ } else if(strcmpi(w1,"refine_items_log") == 0) {
+ log_config.refine_items_log = (atoi(w2));
+ } else if(strcmpi(w1,"price_items_log") == 0) {
+ log_config.price_items_log = (atoi(w2));
+ } else if(strcmpi(w1,"amount_items_log") == 0) {
+ log_config.amount_items_log = (atoi(w2));
+//end of common filter settings
+ } else if(strcmpi(w1,"log_branch") == 0) {
+ log_config.branch = (atoi(w2));
+ } else if(strcmpi(w1,"log_filter") == 0) {
+ log_config.filter = (atoi(w2));
+ } else if(strcmpi(w1,"log_zeny") == 0) {
+ log_config.zeny = (atoi(w2));
+ } else if(strcmpi(w1,"log_gm") == 0) {
+ log_config.gm = (atoi(w2));
+ } else if(strcmpi(w1,"log_npc") == 0) {
+ log_config.npc = (atoi(w2));
+ } else if(strcmpi(w1, "log_chat") == 0) {
+ log_config.chat = (atoi(w2));
+ } else if(strcmpi(w1,"log_mvpdrop") == 0) {
+ log_config.mvpdrop = (atoi(w2));
+ }
+
+#ifndef TXT_ONLY
+ else if(strcmpi(w1, "log_branch_db") == 0) {
+ strcpy(log_config.log_branch_db, w2);
+ if(log_config.branch == 1)
+ ShowNotice("Logging Dead Branch Usage to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_pick_db") == 0) {
+ strcpy(log_config.log_pick_db, w2);
+ if(log_config.filter)
+ ShowNotice("Logging Item Picks to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_zeny_db") == 0) {
+ strcpy(log_config.log_zeny_db, w2);
+ if(log_config.zeny == 1)
+ ShowNotice("Logging Zeny to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_mvpdrop_db") == 0) {
+ strcpy(log_config.log_mvpdrop_db, w2);
+ if(log_config.mvpdrop == 1)
+ ShowNotice("Logging MVP Drops to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_gm_db") == 0) {
+ strcpy(log_config.log_gm_db, w2);
+ if(log_config.gm > 0)
+ ShowNotice("Logging GM Level %d Commands to table `%s`\n", log_config.gm, w2);
+ } else if(strcmpi(w1, "log_npc_db") == 0) {
+ strcpy(log_config.log_npc_db, w2);
+ if(log_config.npc > 0)
+ ShowNotice("Logging NPC 'logmes' to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_chat_db") == 0) {
+ strcpy(log_config.log_chat_db, w2);
+ if(log_config.chat > 0)
+ ShowNotice("Logging CHAT to table `%s`\n", w2);
+ }
+#endif
+
+ else if(strcmpi(w1, "log_branch_file") == 0) {
+ strcpy(log_config.log_branch, w2);
+ if(log_config.branch > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging Dead Branch Usage to file `%s`.txt\n", w2);
+ } else if(strcmpi(w1, "log_pick_file") == 0) {
+ strcpy(log_config.log_pick, w2);
+ if(log_config.filter > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging Item Picks to file `%s`.txt\n", w2);
+ } else if(strcmpi(w1, "log_zeny_file") == 0) {
+ strcpy(log_config.log_zeny, w2);
+ if(log_config.zeny > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging Zeny to file `%s`.txt\n", w2);
+ } else if(strcmpi(w1, "log_mvpdrop_file") == 0) {
+ strcpy(log_config.log_mvpdrop, w2);
+ if(log_config.mvpdrop > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging MVP Drops to file `%s`.txt\n", w2);
+ } else if(strcmpi(w1, "log_gm_file") == 0) {
+ strcpy(log_config.log_gm, w2);
+ if(log_config.gm > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging GM Level %d Commands to file `%s`.txt\n", log_config.gm, w2);
+ } else if(strcmpi(w1, "log_npc_file") == 0) {
+ strcpy(log_config.log_npc, w2);
+ if(log_config.npc > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging NPC 'logmes' to file `%s`.txt\n", w2);
+ } else if(strcmpi(w1, "log_chat_file") == 0) {
+ strcpy(log_config.log_chat, w2);
+ if(log_config.chat > 0 && log_config.sql_logs < 1)
+ ShowNotice("Logging CHAT to file `%s`.txt\n", w2);
+ //support the import command, just like any other config
+ } else if(strcmpi(w1,"import") == 0) {
+ log_config_read(w2);
+ }
+ }
+ }
+
+ fclose(fp);
+ return 0;
+}
diff --git a/src/map/log.h b/src/map/log.h
index 32f3853ef..1cc2247db 100644
--- a/src/map/log.h
+++ b/src/map/log.h
@@ -1,43 +1,43 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#include "map.h"
-
-#ifndef TXT_ONLY
-
-extern char db_server_logdb[32];
-
-#endif //NOT TXT_ONLY
-
-//New logs
-int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm);
-int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm);
-int log_zeny(struct map_session_data *sd, char *type, struct map_session_data *src_sd, int amount);
-
-int log_npc(struct map_session_data *sd, const char *message);
-int log_chat(char *type, int type_id, int src_charid, int src_accid, char *map, int x, int y, char *dst_charname, char *message);
-int log_atcommand(struct map_session_data *sd, const char *message);
-
-//Old, but useful logs
-int log_branch(struct map_session_data *sd);
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp);
-
-int log_config_read(char *cfgName);
-
-int should_log_item(int filter, int nameid, int amount); //log filter check
-
-extern struct Log_Config {
- int enable_logs, filter;
- int sql_logs;
- int rare_items_log,refine_items_log,price_items_log,amount_items_log; //for filter
- int branch, drop, mvpdrop, zeny, gm, npc, chat;
- char log_branch[32], log_pick[32], log_zeny[32], log_mvpdrop[32], log_gm[32], log_npc[32], log_chat[32];
- char log_branch_db[32], log_pick_db[32], log_zeny_db[32], log_mvpdrop_db[32], log_gm_db[32], log_npc_db[32], log_chat_db[32];
- int uptime;
- char log_uptime[32];
-} log_config;
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _LOG_H_
+#define _LOG_H_
+
+#include "map.h"
+
+#ifndef TXT_ONLY
+
+extern char db_server_logdb[32];
+
+#endif //NOT TXT_ONLY
+
+//New logs
+int log_pick_pc(struct map_session_data *sd, const char *type, int nameid, int amount, struct item *itm);
+int log_pick_mob(struct mob_data *md, const char *type, int nameid, int amount, struct item *itm);
+int log_zeny(struct map_session_data *sd, char *type, struct map_session_data *src_sd, int amount);
+
+int log_npc(struct map_session_data *sd, const char *message);
+int log_chat(char *type, int type_id, int src_charid, int src_accid, char *map, int x, int y, char *dst_charname, char *message);
+int log_atcommand(struct map_session_data *sd, const char *message);
+
+//Old, but useful logs
+int log_branch(struct map_session_data *sd);
+int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp);
+
+int log_config_read(char *cfgName);
+
+int should_log_item(int filter, int nameid, int amount); //log filter check
+
+extern struct Log_Config {
+ int enable_logs, filter;
+ int sql_logs;
+ int rare_items_log,refine_items_log,price_items_log,amount_items_log; //for filter
+ int branch, drop, mvpdrop, zeny, gm, npc, chat;
+ char log_branch[32], log_pick[32], log_zeny[32], log_mvpdrop[32], log_gm[32], log_npc[32], log_chat[32];
+ char log_branch_db[32], log_pick_db[32], log_zeny_db[32], log_mvpdrop_db[32], log_gm_db[32], log_npc_db[32], log_chat_db[32];
+ int uptime;
+ char log_uptime[32];
+} log_config;
+
+#endif
diff --git a/src/map/mail.c b/src/map/mail.c
index 316bc9c18..cd1f63b1e 100644
--- a/src/map/mail.c
+++ b/src/map/mail.c
@@ -1,356 +1,356 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef TXT_ONLY
-// Mail System for eAthena SQL
-// Created by Valaris
-// moved all strings to msg_athena.conf [Lupus]
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/strlib.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "map.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "atcommand.h"
-#include "pc.h"
-#include "mail.h"
-
-#ifndef TXT_ONLY
- #ifndef SQL_DEBUG
-
- #define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y))
-
- #else
-
- #define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
- #endif
-#endif
-
-int MAIL_CHECK_TIME = 120000;
-int mail_timer;
-//extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-int mail_check(struct map_session_data *sd,int type)
-{
- int i = 0, new_ = 0, priority = 0;
- char message[80];
-
- nullpo_retr (0, sd);
-
- sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`read_flag`,`priority`,`check_flag` "
- "FROM `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id`", mail_db, sd->status.account_id);
-
- if (mysql_query(&mail_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- //clif_displaymessage(sd->fd,"You have no messages.");
- clif_displaymessage(sd->fd, msg_txt(516));
-
- mysql_free_result(mail_res);
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- i++;
- if(!atoi(mail_row[5])) {
- sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- if(!atoi(mail_row[3])) {
- new_++;
- if(atoi(mail_row[4]))
- priority++;
- if(type==2 || type==3) {
- if(atoi(mail_row[4])) {
- snprintf(message, 80, msg_txt(511), i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- } else {
- //sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
- snprintf(message, 80, msg_txt(512), i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- }
- }
- } else if(type==2){
- snprintf(message, 80, msg_txt(513), i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- }
- }
-
- mysql_free_result(mail_res);
- } else {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- if(i>0 && new_>0 && type==1) {
- //sprintf(message, "You have %d new messages.", new_);
- sprintf(message, msg_txt(514), new_);
-
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- if(i>0 && new_>0 && priority>0 && type==1) {
- //sprintf(message, "You have %d unread priority messages.", priority);
- sprintf(message, msg_txt(515), priority);
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- if(!new_) {
- //clif_displaymessage(sd->fd, "You have no new messages.");
- clif_displaymessage(sd->fd, msg_txt(516));
- }
-
- return 0;
-}
-
-int mail_read(struct map_session_data *sd, int message_id)
-{
-
- char message[80];
-
- nullpo_retr (0, sd);
-
- sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`message`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
-
- if (mysql_query(&mail_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_txt(517));
- return 0;
- }
-
- if ((mail_row = mysql_fetch_row(mail_res))) {
- if(!atoi(mail_row[6])) {
- sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- //sprintf(message, "Reading message from %s", mail_row[2]);
- sprintf(message, msg_txt(518), mail_row[2]);
- clif_displaymessage(sd->fd, jstrescape(message));
-
- sprintf(message, "%s", mail_row[3]);
- clif_displaymessage(sd->fd, jstrescape(message));
-
- sprintf(tmp_sql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- mysql_free_result(mail_res);
-
- } else {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- return 0;
-}
-
-int mail_delete(struct map_session_data *sd, int message_id)
-{
- nullpo_retr (0, sd);
-
- sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
-
- if (mysql_query(&mail_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_txt(517));
- return 0;
- }
-
- if ((mail_row = mysql_fetch_row(mail_res))) {
- if(!atoi(mail_row[2]) && atoi(mail_row[3])) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"Cannot delete unread priority mail.");
- clif_displaymessage(sd->fd,msg_txt(519));
-
- return 0;
- }
- if(!atoi(mail_row[4])) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"You have recieved new mail, use @listmail before deleting.");
- clif_displaymessage(sd->fd,msg_txt(520));
- return 0;
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_sql) ) {
- mysql_free_result(mail_res);
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- //else clif_displaymessage(sd->fd,"Message deleted.");
- else clif_displaymessage(sd->fd,msg_txt(521));
- }
-
- mysql_free_result(mail_res);
-
- } else {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- return 0;
-}
-
-int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
-{
- nullpo_retr (0, sd);
-
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
- //clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
- clif_displaymessage(sd->fd,msg_txt(522));
- return 0;
- }
-
- if(strcmp(name,"*")==0) {
- if(pc_isGM(sd) < 80) {
- //clif_displaymessage(sd->fd, "Access Denied.");
- clif_displaymessage(sd->fd, msg_txt(523));
- return 0;
- }
- else
- sprintf(tmp_sql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id);
- }
- else
- sprintf(tmp_sql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name));
-
- if (mysql_query(&mail_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"Character does not exist.");
- clif_displaymessage(sd->fd,msg_txt(524));
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- if(strcmp(name,"*")==0) {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`from_account_id`,`from_char_name`,`message`,`priority`)"
- " VALUES ('%d', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), sd->status.account_id, sd->status.name, jstrescape(message), flag);
- }
- else {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`)"
- " VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag);
- if(pc_isGM(sd) < 80)
- sd->mail_counter=5;
- }
-
- if(mysql_query(&mail_handle, tmp_sql) ) {
- mysql_free_result(mail_res);
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- }
- }
-
- //clif_displaymessage(sd->fd,"Mail has been sent.");
- clif_displaymessage(sd->fd,msg_txt(525));
-
- return 0;
-}
-
-static int mail_check_timer_sub(struct map_session_data *sd, va_list va)
-{
- int id = va_arg(va, int);
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0)
- sd->mail_counter--;
- if(sd->status.account_id==id)
- clif_displaymessage(sd->fd, msg_txt(526)); //you got new email.
- return 0;
-}
-
-int mail_check_timer(int tid,unsigned int tick,int id,int data)
-{
- if(mail_timer != tid)
- return 0;
-
- sprintf(tmp_sql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db);
-
- if (mysql_query(&mail_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
-
- if (mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res)))
- clif_foreachclient(mail_check_timer_sub, atoi(mail_row[0]));
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db);
- if(mysql_query(&mail_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
-}
-
-int do_init_mail(void)
-{
- add_timer_func_list(mail_check_timer,"mail_check_timer");
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
-}
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef TXT_ONLY
+// Mail System for eAthena SQL
+// Created by Valaris
+// moved all strings to msg_athena.conf [Lupus]
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/strlib.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/showmsg.h"
+
+#include "map.h"
+#include "clif.h"
+#include "chrif.h"
+#include "intif.h"
+#include "atcommand.h"
+#include "pc.h"
+#include "mail.h"
+
+#ifndef TXT_ONLY
+ #ifndef SQL_DEBUG
+
+ #define mysql_query(_x, _y) mysql_real_query(_x, _y, strlen(_y))
+
+ #else
+
+ #define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
+
+ #endif
+#endif
+
+int MAIL_CHECK_TIME = 120000;
+int mail_timer;
+//extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
+
+int mail_check(struct map_session_data *sd,int type)
+{
+ int i = 0, new_ = 0, priority = 0;
+ char message[80];
+
+ nullpo_retr (0, sd);
+
+ sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`read_flag`,`priority`,`check_flag` "
+ "FROM `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id`", mail_db, sd->status.account_id);
+
+ if (mysql_query(&mail_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ mail_res = mysql_store_result(&mail_handle);
+ if(mail_res) {
+ if (mysql_num_rows(mail_res) == 0) {
+ //clif_displaymessage(sd->fd,"You have no messages.");
+ clif_displaymessage(sd->fd, msg_txt(516));
+
+ mysql_free_result(mail_res);
+ return 0;
+ }
+
+ while ((mail_row = mysql_fetch_row(mail_res))) {
+ i++;
+ if(!atoi(mail_row[5])) {
+ sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ if(!atoi(mail_row[3])) {
+ new_++;
+ if(atoi(mail_row[4]))
+ priority++;
+ if(type==2 || type==3) {
+ if(atoi(mail_row[4])) {
+ snprintf(message, 80, msg_txt(511), i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ } else {
+ //sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
+ snprintf(message, 80, msg_txt(512), i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ }
+ }
+ } else if(type==2){
+ snprintf(message, 80, msg_txt(513), i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ }
+ }
+
+ mysql_free_result(mail_res);
+ } else {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ if(i>0 && new_>0 && type==1) {
+ //sprintf(message, "You have %d new messages.", new_);
+ sprintf(message, msg_txt(514), new_);
+
+ clif_displaymessage(sd->fd, jstrescape(message));
+ }
+ if(i>0 && new_>0 && priority>0 && type==1) {
+ //sprintf(message, "You have %d unread priority messages.", priority);
+ sprintf(message, msg_txt(515), priority);
+ clif_displaymessage(sd->fd, jstrescape(message));
+ }
+ if(!new_) {
+ //clif_displaymessage(sd->fd, "You have no new messages.");
+ clif_displaymessage(sd->fd, msg_txt(516));
+ }
+
+ return 0;
+}
+
+int mail_read(struct map_session_data *sd, int message_id)
+{
+
+ char message[80];
+
+ nullpo_retr (0, sd);
+
+ sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`message`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
+
+ if (mysql_query(&mail_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ mail_res = mysql_store_result(&mail_handle);
+ if(mail_res) {
+ if (mysql_num_rows(mail_res) == 0) {
+ mysql_free_result(mail_res);
+ //clif_displaymessage(sd->fd, "Message not found.");
+ clif_displaymessage(sd->fd, msg_txt(517));
+ return 0;
+ }
+
+ if ((mail_row = mysql_fetch_row(mail_res))) {
+ if(!atoi(mail_row[6])) {
+ sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ //sprintf(message, "Reading message from %s", mail_row[2]);
+ sprintf(message, msg_txt(518), mail_row[2]);
+ clif_displaymessage(sd->fd, jstrescape(message));
+
+ sprintf(message, "%s", mail_row[3]);
+ clif_displaymessage(sd->fd, jstrescape(message));
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ }
+
+ mysql_free_result(mail_res);
+
+ } else {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ return 0;
+}
+
+int mail_delete(struct map_session_data *sd, int message_id)
+{
+ nullpo_retr (0, sd);
+
+ sprintf(tmp_sql,"SELECT `message_id`,`to_account_id`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
+
+ if (mysql_query(&mail_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ mail_res = mysql_store_result(&mail_handle);
+ if(mail_res) {
+ if (mysql_num_rows(mail_res) == 0) {
+ mysql_free_result(mail_res);
+ //clif_displaymessage(sd->fd, "Message not found.");
+ clif_displaymessage(sd->fd, msg_txt(517));
+ return 0;
+ }
+
+ if ((mail_row = mysql_fetch_row(mail_res))) {
+ if(!atoi(mail_row[2]) && atoi(mail_row[3])) {
+ mysql_free_result(mail_res);
+ //clif_displaymessage(sd->fd,"Cannot delete unread priority mail.");
+ clif_displaymessage(sd->fd,msg_txt(519));
+
+ return 0;
+ }
+ if(!atoi(mail_row[4])) {
+ mysql_free_result(mail_res);
+ //clif_displaymessage(sd->fd,"You have recieved new mail, use @listmail before deleting.");
+ clif_displaymessage(sd->fd,msg_txt(520));
+ return 0;
+ }
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ mysql_free_result(mail_res);
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ //else clif_displaymessage(sd->fd,"Message deleted.");
+ else clif_displaymessage(sd->fd,msg_txt(521));
+ }
+
+ mysql_free_result(mail_res);
+
+ } else {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ return 0;
+}
+
+int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
+{
+ nullpo_retr (0, sd);
+
+ if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
+ //clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
+ clif_displaymessage(sd->fd,msg_txt(522));
+ return 0;
+ }
+
+ if(strcmp(name,"*")==0) {
+ if(pc_isGM(sd) < 80) {
+ //clif_displaymessage(sd->fd, "Access Denied.");
+ clif_displaymessage(sd->fd, msg_txt(523));
+ return 0;
+ }
+ else
+ sprintf(tmp_sql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id);
+ }
+ else
+ sprintf(tmp_sql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name));
+
+ if (mysql_query(&mail_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+
+ mail_res = mysql_store_result(&mail_handle);
+ if(mail_res) {
+ if (mysql_num_rows(mail_res) == 0) {
+ mysql_free_result(mail_res);
+ //clif_displaymessage(sd->fd,"Character does not exist.");
+ clif_displaymessage(sd->fd,msg_txt(524));
+ return 0;
+ }
+
+ while ((mail_row = mysql_fetch_row(mail_res))) {
+ if(strcmp(name,"*")==0) {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`from_account_id`,`from_char_name`,`message`,`priority`)"
+ " VALUES ('%d', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), sd->status.account_id, sd->status.name, jstrescape(message), flag);
+ }
+ else {
+ sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`)"
+ " VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag);
+ if(pc_isGM(sd) < 80)
+ sd->mail_counter=5;
+ }
+
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ mysql_free_result(mail_res);
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ return 0;
+ }
+ }
+ }
+
+ //clif_displaymessage(sd->fd,"Mail has been sent.");
+ clif_displaymessage(sd->fd,msg_txt(525));
+
+ return 0;
+}
+
+static int mail_check_timer_sub(struct map_session_data *sd, va_list va)
+{
+ int id = va_arg(va, int);
+ if(pc_isGM(sd) < 80 && sd->mail_counter > 0)
+ sd->mail_counter--;
+ if(sd->status.account_id==id)
+ clif_displaymessage(sd->fd, msg_txt(526)); //you got new email.
+ return 0;
+}
+
+int mail_check_timer(int tid,unsigned int tick,int id,int data)
+{
+ if(mail_timer != tid)
+ return 0;
+
+ sprintf(tmp_sql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db);
+
+ if (mysql_query(&mail_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
+ return 0;
+ }
+
+ mail_res = mysql_store_result(&mail_handle);
+
+ if (mail_res) {
+ if (mysql_num_rows(mail_res) == 0) {
+ mysql_free_result(mail_res);
+ mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
+ return 0;
+ }
+
+ while ((mail_row = mysql_fetch_row(mail_res)))
+ clif_foreachclient(mail_check_timer_sub, atoi(mail_row[0]));
+ }
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db);
+ if(mysql_query(&mail_handle, tmp_sql) ) {
+ ShowSQL("DB error - %s\n",mysql_error(&mail_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
+ return 0;
+}
+
+int do_init_mail(void)
+{
+ add_timer_func_list(mail_check_timer,"mail_check_timer");
+ mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
+ return 0;
+}
+
+#endif
diff --git a/src/map/mail.h b/src/map/mail.h
index 2460de238..d6f865f78 100644
--- a/src/map/mail.h
+++ b/src/map/mail.h
@@ -1,12 +1,12 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-// Mail System for eAthena
-// Created by Valaris
-
-int mail_check(struct map_session_data *sd, int type);
-int mail_read(struct map_session_data *sd, int message_id);
-int mail_delete(struct map_session_data *sd, int message_id);
-int mail_send(struct map_session_data *sd, char *name, char *message, int flag);
-
-int do_init_mail(void);
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+// Mail System for eAthena
+// Created by Valaris
+
+int mail_check(struct map_session_data *sd, int type);
+int mail_read(struct map_session_data *sd, int message_id);
+int mail_delete(struct map_session_data *sd, int message_id);
+int mail_send(struct map_session_data *sd, char *name, char *message, int flag);
+
+int do_init_mail(void);
diff --git a/src/map/map.h b/src/map/map.h
index 0cb147e83..2f61a07d5 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -1,1491 +1,1491 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MAP_H_
-#define _MAP_H_
-
-#include <stdarg.h>
-#include "../common/mmo.h"
-#include "../common/mapindex.h"
-#include "../common/db.h"
-
-//Uncomment to enable the Cell Stack Limit mod.
-//It's only config is the battle_config cell_stack_limit.
-//Only chars affected are those defined in BL_CHAR (mobs and players currently)
-//#define CELL_NOSTACK
-
-//Uncomment to enable circular area checks.
-//By default, all range checks in Aegis are of Square shapes, so a weapon range
-// of 10 allows you to attack from anywhere within a 21x21 area.
-//Enabling this changes such checks to circular checks, which is more realistic,
-// but is not the official behaviour.
-//#define CIRCULAR_AREA
-
-#define MAX_PC_CLASS 4050
-#define PC_CLASS_BASE 0
-#define PC_CLASS_BASE2 (PC_CLASS_BASE + 4001)
-#define PC_CLASS_BASE3 (PC_CLASS_BASE2 + 22)
-#define MAX_NPC_PER_MAP 512
-#define BLOCK_SIZE 8
-#define AREA_SIZE battle_config.area_size
-#define LIFETIME_FLOORITEM 60
-#define DAMAGELOG_SIZE 30
-#define LOOTITEM_SIZE 10
-#define MAX_STATUSCHANGE 250
-//Quick defines to know which are the min-max common ailments. [Skotlex]
-//Because of the way the headers are included.. these must be replaced for actual values.
-//Remember to update as needed! Min is SC_STONE and max is SC_DPOISON currently.
-#define SC_COMMON_MIN 0
-#define SC_COMMON_MAX 10
-
-#define MAX_SKILL_LEVEL 100
-#define MAX_SKILLUNITGROUP 25
-#define MAX_SKILLUNITGROUPTICKSET 25
-#define MAX_SKILLTIMERSKILL 15
-#define MAX_MOBSKILL 50
-#define MAX_MOB_LIST_PER_MAP 128
-#define MAX_EVENTQUEUE 2
-#define MAX_EVENTTIMER 32
-#define NATURAL_HEAL_INTERVAL 500
-#define MAX_FLOORITEM 500000
-#define MAX_LEVEL 1000
-#define MAX_WALKPATH 32
-#define MAX_DROP_PER_MAP 48
-#define MAX_IGNORE_LIST 80
-#define MAX_VENDING 12
-#define MOBID_EMPERIUM 1288
-
-#define MAX_PC_BONUS 10
-//Designed for search functions, species max number of matches to display.
-#define MAX_SEARCH 5
-#define MAX_DUEL 1024
-
-#define map_id2index(id) map[(id)].index
-
-//The following system marks a different job ID system used by the map server,
-//which makes a lot more sense than the normal one. [Skotlex]
-//
-//These marks the "level" of the job.
-#define JOBL_2_1 0x100 //256
-#define JOBL_2_2 0x200 //512
-#define JOBL_2 0x300
-
-#define JOBL_UPPER 0x1000 //4096
-#define JOBL_BABY 0x2000 //8192
-
-//for filtering and quick checking.
-#define MAPID_UPPERMASK 0x0fff
-#define MAPID_BASEMASK 0x00ff
-//First Jobs
-//Note the oddity of the novice:
-//Super Novices are considered the 2-1 version of the novice! Novices are considered a first class type, too...
-enum {
- MAPID_NOVICE = 0x0,
- MAPID_SWORDMAN,
- MAPID_MAGE,
- MAPID_ARCHER,
- MAPID_ACOLYTE,
- MAPID_MERCHANT,
- MAPID_THIEF,
- MAPID_TAEKWON,
- MAPID_WEDDING,
- MAPID_GUNSLINGER,
- MAPID_NINJA,
- MAPID_XMAS, // [Valaris]
-//2_1 classes
- MAPID_SUPER_NOVICE = JOBL_2_1|0x0,
- MAPID_KNIGHT,
- MAPID_WIZARD,
- MAPID_HUNTER,
- MAPID_PRIEST,
- MAPID_BLACKSMITH,
- MAPID_ASSASSIN,
- MAPID_STAR_GLADIATOR,
-//2_2 classes
- MAPID_CRUSADER = JOBL_2_2|0x1,
- MAPID_SAGE,
- MAPID_BARDDANCER,
- MAPID_MONK,
- MAPID_ALCHEMIST,
- MAPID_ROGUE,
- MAPID_SOUL_LINKER,
-//1-1, advanced
- MAPID_NOVICE_HIGH = JOBL_UPPER|0x0,
- MAPID_SWORDMAN_HIGH,
- MAPID_MAGE_HIGH,
- MAPID_ARCHER_HIGH,
- MAPID_ACOLYTE_HIGH,
- MAPID_MERCHANT_HIGH,
- MAPID_THIEF_HIGH,
-//2_1 advanced
- MAPID_LORD_KNIGHT = JOBL_UPPER|JOBL_2_1|0x1,
- MAPID_HIGH_WIZARD,
- MAPID_SNIPER,
- MAPID_HIGH_PRIEST,
- MAPID_WHITESMITH,
- MAPID_ASSASSIN_CROSS,
-//2_2 advanced
- MAPID_PALADIN = JOBL_UPPER|JOBL_2_2|0x1,
- MAPID_PROFESSOR,
- MAPID_CLOWNGYPSY,
- MAPID_CHAMPION,
- MAPID_CREATOR,
- MAPID_STALKER,
-//1-1 baby
- MAPID_BABY = JOBL_BABY|0x0,
- MAPID_BABY_SWORDMAN,
- MAPID_BABY_MAGE,
- MAPID_BABY_ARCHER,
- MAPID_BABY_ACOLYTE,
- MAPID_BABY_MERCHANT,
- MAPID_BABY_THIEF,
- MAPID_BABY_TAEKWON,
-//2_1 baby
- MAPID_SUPER_BABY = JOBL_BABY|JOBL_2_1|0x0,
- MAPID_BABY_KNIGHT,
- MAPID_BABY_WIZARD,
- MAPID_BABY_HUNTER,
- MAPID_BABY_PRIEST,
- MAPID_BABY_BLACKSMITH,
- MAPID_BABY_ASSASSIN,
- MAPID_BABY_STAR_GLADIATOR,
-//2_2 baby
- MAPID_BABY_CRUSADER = JOBL_BABY|JOBL_2_2|0x1,
- MAPID_BABY_SAGE,
- MAPID_BABY_BARDDANCER,
- MAPID_BABY_MONK,
- MAPID_BABY_ALCHEMIST,
- MAPID_BABY_ROGUE,
- MAPID_BABY_SOUL_LINKER,
-};
-
-//Don't change this, as the client seems to always send/receive 80 characters as it currently is. [Skotlex]
-#define MESSAGE_SIZE 80
-
-#define DEFAULT_AUTOSAVE_INTERVAL 5*60*1000
-
-//Specifies maps where players may hit each other
-#define map_flag_vs(m) (map[m].flag.pvp || map[m].flag.gvg_dungeon || map[m].flag.gvg || (agit_flag && map[m].flag.gvg_castle))
-//Specifies maps that have special GvG/WoE restrictions
-#define map_flag_gvg(m) (map[m].flag.gvg || (agit_flag && map[m].flag.gvg_castle))
-//Specifies if the map is tagged as GvG/WoE (regardless of agit_flag status)
-#define map_flag_gvg2(m) (map[m].flag.gvg || map[m].flag.gvg_castle)
-//Caps values to min/max
-#define cap_value(a, min, max) (a>=max?max:a<=min?min:a)
-
-//This stackable implementation does not means a BL can be more than one type at a time, but it's
-//meant to make it easier to check for multiple types at a time on invocations such as
-// map_foreach* calls [Skotlex]
-enum {
- BL_NUL = 0x000,
- BL_PC = 0x001,
- BL_MOB = 0x002,
- BL_PET = 0x004,
- BL_HOM = 0x008, //[blackhole89]
- BL_ITEM = 0x010,
- BL_SKILL = 0x020,
- BL_NPC = 0x040,
- BL_CHAT = 0x080,
-};
-
-//For common mapforeach calls. Since pets cannot be affected, they aren't included here yet.
-#define BL_CHAR (BL_PC|BL_MOB|BL_HOM)
-#define BL_ALL 0xfff
-
-enum { WARP, SHOP, SCRIPT, MONS };
-
-enum {
- RC_FORMLESS=0,
- RC_UNDEAD,
- RC_BRUTE,
- RC_PLANT,
- RC_INSECT,
- RC_FISH,
- RC_DEMON,
- RC_DEMIHUMAN,
- RC_ANGEL,
- RC_DRAGON,
- RC_BOSS,
- RC_NONBOSS,
- RC_MAX
-};
-
-enum {
- ELE_NEUTRAL=0,
- ELE_WATER,
- ELE_EARTH,
- ELE_FIRE,
- ELE_WIND,
- ELE_POISON,
- ELE_HOLY,
- ELE_DARK,
- ELE_GHOST,
- ELE_UNDEAD,
- ELE_MAX
-};
-
-enum {
- IG_BLUEBOX=1,
- IG_VIOLETBOX, //2
- IG_CARDALBUM, //3
- IG_GIFTBOX, //4
- IG_SCROLLBOX, //5
- IG_FINDINGORE, //6
- IG_COOKIEBAG, //7
- IG_POTION, //8
- IG_HERBS, //9
- IG_FRUITS, //10
- IG_MEAT, //11
- IG_CANDY, //12
- IG_JUICE, //13
- IG_FISH, //14
- IG_BOXES, //15
- IG_GEMSTONE, //16
- IG_JELLOPY, //17
- IG_ORE, //18
- IG_FOOD, //19
- IG_RECOVERY, //20
- IG_MINERALS, //21
- IG_TAMING, //22
- IG_SCROLLS, //23
- IG_QUIVERS, //24
- IG_MASKS, //25
- IG_ACCESORY, //26
- IG_JEWELS, //27
- IG_GIFTBOX_1, //28
- IG_GIFTBOX_2, //29
- IG_GIFTBOX_3, //30
- IG_GIFTBOX_4, //31
- IG_EGGBOY, //32
- IG_EGGGIRL, //33
- IG_GIFTBOXCHINA, //34
- IG_LOTTOBOX, //35
- MAX_ITEMGROUP,
-} item_group_list;
-
-enum {
- ATF_SELF=0x01,
- ATF_TARGET=0x02,
- ATF_SHORT=0x04,
- ATF_LONG=0x08
-} auto_trigger_flag;
-
-struct block_list {
- struct block_list *next,*prev;
- int id;
- short m,x,y;
- unsigned char type;
- unsigned char subtype;
-};
-
-struct walkpath_data {
- unsigned char path_len,path_pos,path_half;
- unsigned char path[MAX_WALKPATH];
-};
-struct shootpath_data {
- int rx,ry,len;
- int x[MAX_WALKPATH];
- int y[MAX_WALKPATH];
-};
-
-struct skill_timerskill {
- int timer;
- int src_id;
- int target_id;
- int map;
- short x,y;
- short skill_id,skill_lv;
- int type;
- int flag;
-};
-
-struct skill_unit_group;
-struct skill_unit {
- struct block_list bl;
-
- struct skill_unit_group *group;
-
- int limit;
- int val1,val2;
- short alive,range;
-};
-
-struct skill_unit_group {
- int src_id;
- int party_id;
- int guild_id;
- int map;
- int target_flag; //Holds BCT_* flag for battle_check_target
- int bl_flag; //Holds BL_* flag for map_foreachin* functions
- unsigned int tick;
- int limit,interval;
-
- int skill_id,skill_lv;
- int val1,val2,val3;
- char *valstr;
- int unit_id;
- int group_id;
- int unit_count,alive_count;
- struct skill_unit *unit;
- struct {
- unsigned ammo_consume : 1;
- unsigned magic_power : 1;
- unsigned into_abyss : 1;
- unsigned song_dance : 2; //0x1 Song/Dance, 0x2 Ensemble
- } state;
-};
-struct skill_unit_group_tickset {
- unsigned int tick;
- int id;
-};
-
-struct unit_data {
- struct block_list *bl;
- struct walkpath_data walkpath;
- struct skill_timerskill *skilltimerskill[MAX_SKILLTIMERSKILL];
- struct skill_unit_group *skillunit[MAX_SKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- short attacktarget_lv;
- short to_x,to_y;
- short skillx,skilly;
- short skillid,skilllv;
- int skilltarget;
- int skilltimer;
- int target;
- int attacktimer;
- int walktimer;
- int chaserange;
- unsigned int attackabletime;
- unsigned int canact_tick;
- unsigned int canmove_tick;
- unsigned char dir;
- unsigned char walk_count;
- struct {
- unsigned change_walk_target : 1 ;
- unsigned skillcastcancel : 1 ;
- unsigned attack_continue : 1 ;
- unsigned walk_easy : 1 ;
- unsigned running : 1;
- } state;
-};
-
-//Basic damage info of a weapon
-//Required because players have two of these, one in status_data and another
-//for their left hand weapon.
-struct weapon_atk {
- unsigned short atk, atk2;
- unsigned short range;
- unsigned char ele;
-};
-
-//For holding basic status (which can be modified by status changes)
-struct status_data {
- unsigned int
- hp, sp,
- max_hp, max_sp;
- unsigned short
- str, agi, vit, int_, dex, luk,
- batk,
- matk_min, matk_max,
- speed,
- amotion, adelay, dmotion,
- mode;
- short
- hit, flee, cri, flee2,
- def2, mdef2,
- aspd_rate;
- unsigned char
- def_ele, ele_lv,
- size, race;
- signed char
- def, mdef;
- struct weapon_atk rhw, *lhw; //Right Hand/Left Hand Weapon. Only players have a lhw (hence it's a pointer)
-};
-
-struct script_reg {
- int index;
- int data;
-};
-struct script_regstr {
- int index;
- char data[256];
-};
-
-struct status_change_entry {
- int timer;
- int val1,val2,val3,val4;
-};
-
-struct status_change {
- struct status_change_entry data[MAX_STATUSCHANGE];
- short count;
- unsigned short opt1,opt2;
- unsigned int opt3, option; //Note that older packet versions use short here.
-};
-
-struct vending {
- short index;
- unsigned short amount;
- unsigned int value;
-};
-
-struct weapon_data {
- int atkmods[3];
- // all the variables except atkmods get zero'ed in each call of status_calc_pc
- // NOTE: if you want to add a non-zeroed variable, you need to update the malloc_set call
- // in status_calc_pc as well! All the following are automatically zero'ed. [Skotlex]
- int overrefine;
- int star;
- int ignore_def_ele;
- int ignore_def_race;
- int def_ratio_atk_ele;
- int def_ratio_atk_race;
- int addele[ELE_MAX];
- int addrace[RC_MAX];
- int addrace2[RC_MAX];
- int addsize[3];
-
- short ignore_def_mob;
- struct drain_data {
- short rate;
- short per;
- short value;
- unsigned type:1;
- } hp_drain[RC_MAX], sp_drain[RC_MAX];
-
- short add_damage_classid[MAX_PC_BONUS];
- int add_damage_classrate[MAX_PC_BONUS];
- int add_damage_class_count;
-};
-
-struct view_data {
- unsigned short
- class_,
- weapon,
- shield, //Or left-hand weapon.
- head_top,
- head_mid,
- head_bottom,
- hair_style,
- hair_color,
- cloth_color;
- char sex;
- unsigned dead_sit : 2;
-};
-
-//Additional regen data that only players have.
-struct regen_data_sub {
- unsigned short
- hp,sp;
-
- //tick accumulation before healing.
- struct {
- unsigned int hp,sp;
- } tick;
-
- //Regen rates (where every 1 means +100% regen)
- struct {
- unsigned char hp,sp;
- } rate;
-};
-
-struct regen_data {
-
- unsigned short flag; //Marks what stuff you may heal or not.
- unsigned short
- hp,sp,shp,ssp;
-
- //tick accumulation before healing.
- struct {
- unsigned int hp,sp,shp,ssp;
- } tick;
-
- //Regen rates (where every 1 means +100% regen)
- struct {
- unsigned char
- hp,sp,shp,ssp;
- } rate;
-
- struct {
- unsigned walk:1; //Can you regen even when walking?
- unsigned gc:1; //Tags when you should have double regen due to GVG castle
- unsigned overweight :2; //overweight state (1: 50%, 2: 90%)
- unsigned block :2; //Block regen flag (1: Hp, 2: Sp)
- } state;
-
- //skill-regen, sitting-skill-regen (since not all chars with regen need it)
- struct regen_data_sub *sregen, *ssregen;
-};
-
-struct party_member_data {
- struct map_session_data *sd;
- unsigned int hp; //For HP,x,y refreshing.
- unsigned short x, y;
-};
-
-struct party_data {
- struct party party;
- struct party_member_data data[MAX_PARTY];
- unsigned char itemc; //For item distribution.
- struct {
- unsigned monk : 1; //There's at least one monk in party?
- unsigned sg : 1; //There's at least one Star Gladiator in party?
- unsigned snovice :1; //There's a Super Novice
- unsigned tk : 1; //There's a taekwon
- } state;
-};
-
-struct npc_data;
-struct pet_db;
-struct homunculus_db; //[orn]
-struct item_data;
-struct square;
-
-struct map_session_data {
- struct block_list bl;
- struct unit_data ud;
- struct view_data vd;
- struct status_data base_status, battle_status;
- struct weapon_atk base_lhw, battle_lhw; //Left-hand weapon atk data.
- struct status_change sc;
- struct regen_data regen;
- struct regen_data_sub sregen, ssregen;
- //NOTE: When deciding to add a flag to state or special_state, take into consideration that state is preserved in
- //status_calc_pc, while special_state is recalculated in each call. [Skotlex]
- struct {
- unsigned auth : 1;
- unsigned menu_or_input : 1;
- unsigned dead_sit : 2;
- unsigned waitingdisconnect : 1;
- unsigned lr_flag : 2;
- unsigned connect_new : 1;
- unsigned arrow_atk : 1;
- unsigned skill_flag : 1;
- unsigned gangsterparadise : 1;
- unsigned rest : 1;
- unsigned storage_flag : 2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex]
- unsigned snovice_flag : 4;
- // originally by Qamera, adapted by celest
- unsigned event_death : 1;
- unsigned event_kill_pc : 1;
- unsigned event_disconnect : 1;
- unsigned event_kill_mob : 1;
- unsigned event_baselvup : 1;
- unsigned event_joblvup : 1;
- unsigned event_loadmap : 1;
- // Abracadabra bugfix by Aru
- unsigned abra_flag : 1;
- unsigned autotrade : 1; //By Fantik
- unsigned reg_dirty : 3; //By Skotlex (marks whether registry variables have been saved or not yet)
- unsigned showdelay :1;
- unsigned showexp :1;
- unsigned showzeny :1;
- unsigned mainchat :1; //[LuzZza]
- unsigned noask :1; // [LuzZza]
- unsigned trading :1; //[Skotlex] is 1 only after a trade has started.
- unsigned deal_locked :2; //1: Clicked on OK. 2: Clicked on TRADE
- unsigned party_sent :1;
- unsigned guild_sent :1;
- unsigned monster_ignore :1; // for monsters to ignore a character [Valaris] [zzo]
- unsigned size :2; // for tiny/large types
- unsigned night :1; //Holds whether or not the player currently has the SI_NIGHT effect on. [Skotlex]
- unsigned finalsave :1; //Signals whether the final save for the char was done or not yet. Meant to prevent exploits and the like. [Skotlex]
- unsigned blockedmove :1;
- unsigned using_fake_npc :1;
- unsigned rewarp :1; //Signals that a player should warp as soon as he is done loading a map. [Skotlex]
- unsigned killer : 1;
- unsigned killable : 1;
- unsigned doridori : 1;
- unsigned ignoreAll : 1;
- unsigned short autoloot;
- struct guild *gmaster_flag;
- } state;
- struct {
- unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
- unsigned restart_full_recover : 1;
- unsigned no_castcancel : 1;
- unsigned no_castcancel2 : 1;
- unsigned no_sizefix : 1;
- unsigned no_gemstone : 1;
- unsigned intravision : 1; // Maya Purple Card effect allowing to see Hiding/Cloaking people [DracoRPG]
- unsigned perfect_hiding : 1; // [Valaris]
- } special_state;
- int login_id1, login_id2;
- unsigned short class_; //This is the internal job ID used by the map server to simplify comparisons/queries/etc. [Skotlex]
-
- int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 ... 18
- struct mmo_charstatus status;
- struct registry save_reg;
-
- struct item_data *inventory_data[MAX_INVENTORY];
- short equip_index[11];
- unsigned int weight,max_weight;
- int cart_weight,cart_max_weight,cart_num,cart_max_num;
- int fd;
- unsigned short mapindex;
- unsigned short prev_speed,prev_adelay;
- unsigned char head_dir; //0: Look forward. 1: Look right, 2: Look left.
- unsigned int client_tick;
- int npc_id,areanpc_id,npc_shopid;
- int npc_item_flag; //Marks the npc_id with which you can use items during interactions with said npc (see script command enable_itemuse)
- int npc_menu, max_menu;
- int npc_amount;
- struct script_state *st;
- char npc_str[256];
- int npc_timer_id; //For player attached npc timers. [Skotlex]
- unsigned int chatID;
- time_t idletime;
-
- struct{
- char name[NAME_LENGTH];
- } ignore[MAX_IGNORE_LIST];
-
- int followtimer; // [MouseJstr]
- int followtarget;
-
- time_t emotionlasttime; // to limit flood with emotion packets
-
- short skillitem,skillitemlv;
- short skillid_old,skilllv_old;
- short skillid_dance,skilllv_dance;
- char blockskill[MAX_SKILL]; // [celest]
- int cloneskill_id;
- int menuskill_id, menuskill_lv;
-
- int invincible_timer;
- unsigned int canlog_tick;
- unsigned int canuseitem_tick; // [Skotlex]
- unsigned int cantalk_tick;
-
- short weapontype1,weapontype2;
- short disguise; // [Valaris]
-
- struct weapon_data right_weapon, left_weapon;
-
- // here start arrays to be globally zeroed at the beginning of status_calc_pc()
- int param_bonus[6],param_equip[6]; //Stores card/equipment bonuses.
- int subele[ELE_MAX];
- int subrace[RC_MAX];
- int subrace2[RC_MAX];
- int subsize[3];
- int reseff[SC_COMMON_MAX-SC_COMMON_MIN+1];
- int weapon_coma_ele[ELE_MAX];
- int weapon_coma_race[RC_MAX];
- int weapon_atk[16];
- int weapon_atk_rate[16];
- int arrow_addele[ELE_MAX];
- int arrow_addrace[RC_MAX];
- int arrow_addsize[3];
- int magic_addele[ELE_MAX];
- int magic_addrace[RC_MAX];
- int magic_addsize[3];
- int critaddrace[RC_MAX];
- int expaddrace[RC_MAX];
- int itemgrouphealrate[MAX_ITEMGROUP];
- short sp_gain_race[RC_MAX];
- // zeroed arrays end here.
- // zeroed structures start here
- struct s_autospell{
- short id, lv, rate, card_id;
- } autospell[MAX_PC_BONUS], autospell2[MAX_PC_BONUS];
- struct s_addeffect{
- short id, rate, arrow_rate;
- unsigned char flag;
- } addeff[MAX_PC_BONUS], addeff2[MAX_PC_BONUS];
- struct { //skillatk raises bonus dmg% of skills, skillblown increases bonus blewcount for some skills.
- short id, val;
- } skillatk[MAX_PC_BONUS], skillblown[MAX_PC_BONUS];
- struct {
- short class_, rate;
- } add_def[MAX_PC_BONUS], add_mdef[MAX_PC_BONUS],
- add_dmg[MAX_PC_BONUS], add_mdmg[MAX_PC_BONUS];
- struct s_add_drop {
- short id, group;
- int race, rate;
- } add_drop[MAX_PC_BONUS];
- struct {
- int nameid;
- int rate;
- } itemhealrate[MAX_PC_BONUS];
- // zeroed structures end here
- // zeroed vars start here.
- int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
- int nsshealhp,nsshealsp;
- int critical_def,double_rate;
- int long_attack_atk_rate; //Long range atk rate, not weapon based. [Skotlex]
- int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
- int ignore_mdef_ele;
- int ignore_mdef_race;
- int perfect_hit;
- int perfect_hit_add;
- int get_zeny_rate;
- int get_zeny_num; //Added Get Zeny Rate [Skotlex]
- int double_add_rate;
- int short_weapon_damage_return,long_weapon_damage_return;
- int magic_damage_return; // AppleGirl Was Here
- int random_attack_increase_add,random_attack_increase_per; // [Valaris]
- int break_weapon_rate,break_armor_rate;
- int crit_atk_rate;
- int hp_loss_rate;
- int sp_loss_rate;
- int classchange; // [Valaris]
- int speed_add_rate, aspd_add_rate;
- unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
-
- short splash_range, splash_add_range;
- short add_steal_rate;
- short hp_loss_value;
- short sp_loss_value;
- short hp_loss_type;
- short sp_gain_value, hp_gain_value;
- short sp_vanish_rate;
- short sp_vanish_per;
- short add_drop_count;
- unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
- unsigned short unbreakable_equip; //100% break resistance on certain equipment
- unsigned short unstripable_equip;
- short add_def_count,add_mdef_count;
- short add_dmg_count,add_mdmg_count;
-
- // zeroed vars end here.
-
- int castrate,delayrate,hprate,sprate,dsprate;
- int atk_rate;
- int speed_rate,hprecov_rate,sprecov_rate;
- int matk_rate;
- int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
-
- int hp_loss_tick;
- int sp_loss_tick;
-
- int itemid;
- short itemindex; //Used item's index in sd->inventory [Skotlex]
-
- short catch_target_class; // pet catching, stores a pet class to catch (short now) [zzo]
-
- short spiritball, spiritball_old;
- int spirit_timer[MAX_SKILL_LEVEL];
-
- unsigned char potion_success_counter; //Potion successes in row counter
- unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
- short mission_mobid; //Stores the target mob_id for TK_MISSION
- int die_counter; //Total number of times you've died
- int devotion[5]; //Stores the char IDs of chars devoted to.
- int reg_num; //Number of registries (type numeric)
- int regstr_num; //Number of registries (type string)
-
- struct script_reg *reg;
- struct script_regstr *regstr;
-
- int trade_partner;
- struct {
- struct {
- int index, amount;
- } item[10];
- int zeny, weight;
- } deal;
-
- int party_invite,party_invite_account;
-
- int guild_invite,guild_invite_account;
- int guild_emblem_id,guild_alliance,guild_alliance_account;
- short guild_x,guild_y; // For guildmate position display. [Skotlex] should be short [zzo]
- int guildspy; // [Syrus22]
- int partyspy; // [Syrus22]
-
- int vender_id;
- int vend_num;
- char message[MESSAGE_SIZE];
- struct vending vending[MAX_VENDING];
-
- struct pet_data *pd;
- struct homun_data *hd; // [blackhole89]
-
- struct{
- int m; //-1 - none, other: map index corresponding to map name.
- unsigned short index; //map index
- }feel_map[3];// 0 - Sun; 1 - Moon; 2 - Stars
- short hate_mob[3];
-
- unsigned int pvp_timer;
- short pvp_point;
- unsigned short pvp_rank, pvp_lastusers;
- unsigned short pvp_won, pvp_lost;
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
- unsigned short eventcount; // [celest]
-
- unsigned char change_level; // [celest]
-
- char fakename[NAME_LENGTH]; // fake names [Valaris]
-
-#ifndef TXT_ONLY
- int mail_counter; // mail counter for mail system [Valaris]
-#endif
-
- int duel_group; // duel vars [LuzZza]
- int duel_invite;
-
- char away_message[128]; // [LuzZza]
-
-};
-
-struct {
- int members_count;
- int invites_count;
- int max_players_limit;
-} duel_list[MAX_DUEL];
-
-int duel_count;
-
-struct npc_timerevent_list {
- int timer,pos;
-};
-struct npc_label_list {
- char name[NAME_LENGTH];
- int pos;
-};
-struct npc_item_list {
- unsigned int nameid,value;
-};
-struct npc_data {
- struct block_list bl;
- struct unit_data ud; //Because they need to be able to move....
- struct view_data *vd;
- struct status_change sc; //They can't have status changes, but.. they want the visual opt values.
- short n;
- short class_;
- short speed;
- unsigned char name[NAME_LENGTH];
- unsigned char exname[NAME_LENGTH];
- int chat_id;
- unsigned int next_walktime;
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
- short arenaflag;
-
- void *chatdb;
- struct npc_data *master_nd;
-
- union {
- struct {
- struct script_code *script;
- short xs,ys;
- int guild_id;
- int timer,timerid,timeramount,rid;
- unsigned int timertick;
- struct npc_timerevent_list *timer_event;
- int label_list_num;
- struct npc_label_list *label_list;
- int src_id;
- } scr;
- struct npc_item_list shop_item[1];
- struct {
- short xs,ys;
- short x,y;
- unsigned short mapindex;
- } warp;
- } u;
- //Do NOT place anything afterwards... shop data NPC will override any variables from here and on! [Skotlex]
-};
-
-//For quick linking to a guardian's info. [Skotlex]
-struct guardian_data {
- int number; //0-MAX_GUARDIANS-1 = Guardians. MAX_GUARDIANS = Emperium.
- int guild_id;
- int emblem_id;
- int guardup_lv; //Level of GD_GUARDUP skill.
- char guild_name[NAME_LENGTH];
- struct guild_castle* castle;
-};
-
-// Mob List Held in memory for Dynamic Mobs [Wizputer]
-// Expanded to specify all mob-related spawn data by [Skotlex]
-struct spawn_data {
- short class_; //Class, used because a mob can change it's class
- unsigned short m,x,y; //Spawn information (map, point, spawn-area around point)
- signed short xs,ys;
- unsigned short num; //Number of mobs using this structure.
- unsigned int level; //Custom level.
- unsigned int delay1,delay2; //Min delay before respawning after spawn/death
- struct {
- unsigned size :2; //Holds if mob has to be tiny/large
- unsigned ai :2; //Holds if mob is special ai.
- } state;
- char name[NAME_LENGTH],eventname[50]; //Name/event
-};
-
-
-struct mob_data {
- struct block_list bl;
- struct unit_data ud;
- struct view_data *vd;
- struct status_data status, *base_status; //Second one is in case of leveling up mobs, or tiny/large mobs.
- struct status_change sc;
- struct mob_db *db; //For quick data access (saves doing mob_db(md->class_) all the time) [Skotlex]
- char name[NAME_LENGTH];
- struct {
- unsigned size : 2; //Small/Big monsters.
- unsigned cached : 1; //Cached mobs for dynamic mob unloading [Skotlex]
- unsigned ai : 2; //Special ai for summoned monsters.
- //0: Normal mob.
- //1: Standard summon, attacks mobs.
- //2: Alchemist Marine Sphere
- //3: Alchemist Summon Flora
- } special_state; //Special mob information that does not needs to be zero'ed on mob respawn.
- struct {
- unsigned skillstate : 8;
- unsigned aggressive : 1; //Signals whether the mob AI is in aggressive mode or reactive mode. [Skotlex]
- unsigned char steal_flag; //number of steal tries (to prevent steal exploit on mobs with few items) [Lupus]
- unsigned steal_coin_flag : 1;
- unsigned soul_change_flag : 1; // Celest
- unsigned alchemist: 1;
- unsigned no_random_walk: 1;
- unsigned killer: 1;
- int provoke_flag; // Celest
- } state;
- struct guardian_data* guardian_data;
- struct {
- int id;
- int dmg;
- unsigned flag : 1; //0: Normal. 1: Homunc exp
- } dmglog[DAMAGELOG_SIZE];
- struct spawn_data *spawn; //Spawn data.
- struct item *lootitem;
- short spawn_n; //Spawn data index on the map server.
- short class_;
- short attacked_count;
- unsigned char attacked_players;
- unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
- int level;
- int target_id,attacked_id;
- unsigned int next_walktime;
- unsigned int last_deadtime,last_spawntime,last_thinktime,last_linktime;
- short move_fail_count;
- short lootitem_count;
- short min_chase;
-
- int deletetimer;
- int master_id,master_dist;
-
- struct npc_data *nd;
- unsigned short callback_flag;
-
- short skillidx;
- unsigned int skilldelay[MAX_MOBSKILL];
- char npc_event[50];
-};
-
-/* [blackhole89] */
-struct homun_data {
- struct block_list bl;
- struct unit_data ud;
- struct view_data *vd;
- struct status_data base_status, battle_status;
- struct status_change sc;
- struct regen_data regen;
- struct homunculus_db *homunculusDB; //[orn]
- struct s_homunculus homunculus ; //[orn]
-
- struct map_session_data *master; //pointer back to its master
- int hungry_timer; //[orn]
- unsigned int exp_next;
- char blockskill[MAX_SKILL]; // [orn]
-};
-
-struct pet_data {
- struct block_list bl;
- struct unit_data ud;
- struct view_data vd;
- struct s_pet pet;
- struct status_data status;
- struct mob_db *db;
- struct pet_db *petDB;
- int pet_hungry_timer;
- int target_id;
- short n;
- struct {
- unsigned skillbonus : 1;
- } state;
- int move_fail_count;
- unsigned int next_walktime,last_thinktime;
- short rate_fix; //Support rate as modified by intimacy (1000 = 100%) [Skotlex]
-
- struct pet_recovery { //Stat recovery
- unsigned short type; //Status Change id
- unsigned short delay; //How long before curing (secs).
- int timer;
- } *recovery; //[Valaris] / Reimplemented by [Skotlex]
-
- struct pet_bonus {
- unsigned short type; //bStr, bVit?
- unsigned short val; //Qty
- unsigned short duration; //in secs
- unsigned short delay; //Time before recasting (secs)
- int timer;
- } *bonus; //[Valaris] / Reimplemented by [Skotlex]
-
- struct pet_skill_attack { //Attack Skill
- unsigned short id;
- unsigned short lv;
- unsigned short div_; //0 = Normal skill. >0 = Fixed damage (lv), fixed div_.
- unsigned short rate; //Base chance of skill ocurrance (10 = 10% of attacks)
- unsigned short bonusrate; //How being 100% loyal affects cast rate (10 = At 1000 intimacy->rate+10%
- } *a_skill; //[Skotlex]
-
- struct pet_skill_support { //Support Skill
- unsigned short id;
- unsigned short lv;
- unsigned short hp; //Max HP% for skill to trigger (50 -> 50% for Magnificat)
- unsigned short sp; //Max SP% for skill to trigger (100 = no check)
- unsigned short delay; //Time (secs) between being able to recast.
- int timer;
- } *s_skill; //[Skotlex]
-
- struct pet_loot {
- struct item *item;
- unsigned short count;
- unsigned short weight;
- unsigned short max;
- } *loot; //[Valaris] / Rewritten by [Skotlex]
-
- struct map_session_data *msd;
-};
-
-enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // ˆÍ‚Ü‚êƒyƒiƒ‹ƒeƒBŒvŽZ—p
-
-struct map_data {
- char name[MAP_NAME_LENGTH];
- unsigned short index; //Index is the map index used by the mapindex* functions.
- unsigned char *gat; // NULL‚Ȃ牺‚Ìmap_data_other_server‚Æ‚µ‚Ĉµ‚¤
- unsigned char *cell; //Contains temporary cell data that is set/unset on tiles.
-#ifdef CELL_NOSTACK
- unsigned char *cell_bl; //Holds amount of bls in any given cell.
-#endif
- char *alias; // [MouseJstr]
- struct block_list **block;
- struct block_list **block_mob;
- int *block_count,*block_mob_count;
- int m;
- short xs,ys;
- short bxs,bys;
- int water_height;
- int npc_num;
- int users;
- struct {
- unsigned alias : 1;
- unsigned nomemo : 1;
- unsigned noteleport : 1;
- unsigned noreturn : 1;
- unsigned monster_noteleport : 1;
- unsigned nosave : 1;
- unsigned nobranch : 1;
- unsigned noexppenalty : 1;
- unsigned pvp : 1;
- unsigned pvp_noparty : 1;
- unsigned pvp_noguild : 1;
- unsigned pvp_nightmaredrop :1;
- unsigned pvp_nocalcrank : 1;
- unsigned gvg_castle : 1;
- unsigned gvg : 1; // Now it identifies gvg versus maps that are active 24/7
- unsigned gvg_dungeon : 1; // Celest
- unsigned gvg_noparty : 1;
- unsigned nozenypenalty : 1;
- unsigned notrade : 1;
- unsigned noskill : 1;
- unsigned nowarp : 1;
- unsigned nowarpto : 1;
- unsigned noicewall : 1; // [Valaris]
- unsigned snow : 1; // [Valaris]
- unsigned clouds : 1;
- unsigned clouds2 : 1; // [Valaris]
- unsigned fog : 1; // [Valaris]
- unsigned fireworks : 1;
- unsigned sakura : 1; // [Valaris]
- unsigned leaves : 1; // [Valaris]
- unsigned rain : 1; // [Valaris]
- unsigned indoors : 1; // celest
- unsigned nogo : 1; // [Valaris]
- unsigned nobaseexp : 1; // [Lorky] added by Lupus
- unsigned nojobexp : 1; // [Lorky]
- unsigned nomobloot : 1; // [Lorky]
- unsigned nomvploot : 1; // [Lorky]
- unsigned nightenabled :1; //For night display. [Skotlex]
- unsigned restricted : 1; // [Komurka]
- unsigned nodrop : 1;
- unsigned novending : 1;
- unsigned loadevent : 1;
- unsigned nochat :1;
- unsigned partylock :1;
- unsigned guildlock :1;
- } flag;
- struct point save;
- struct npc_data *npc[MAX_NPC_PER_MAP];
- struct {
- int drop_id;
- int drop_type;
- int drop_per;
- } drop_list[MAX_DROP_PER_MAP];
-
- struct spawn_data *moblist[MAX_MOB_LIST_PER_MAP]; // [Wizputer]
- int mob_delete_timer; // [Skotlex]
- int zone; // [Komurka]
- int jexp; // map experience multiplicator
- int bexp; // map experience multiplicator
- int nocommand; //Blocks @/# commands for non-gms. [Skotlex]
-};
-
-struct map_data_other_server {
- char name[MAP_NAME_LENGTH];
- unsigned short index; //Index is the map index used by the mapindex* functions.
- unsigned char *gat; // NULLŒÅ’è‚É‚µ‚Ä”»’f
- unsigned long ip;
- unsigned int port;
-};
-
-struct flooritem_data {
- struct block_list bl;
- unsigned char subx,suby;
- int cleartimer;
- int first_get_id,second_get_id,third_get_id;
- unsigned int first_get_tick,second_get_tick,third_get_tick;
- struct item item_data;
-};
-
-enum {
- SP_SPEED,SP_BASEEXP,SP_JOBEXP,SP_KARMA,SP_MANNER,SP_HP,SP_MAXHP,SP_SP, // 0-7
- SP_MAXSP,SP_STATUSPOINT,SP_0a,SP_BASELEVEL,SP_SKILLPOINT,SP_STR,SP_AGI,SP_VIT, // 8-15
- SP_INT,SP_DEX,SP_LUK,SP_CLASS,SP_ZENY,SP_SEX,SP_NEXTBASEEXP,SP_NEXTJOBEXP, // 16-23
- SP_WEIGHT,SP_MAXWEIGHT,SP_1a,SP_1b,SP_1c,SP_1d,SP_1e,SP_1f, // 24-31
- SP_USTR,SP_UAGI,SP_UVIT,SP_UINT,SP_UDEX,SP_ULUK,SP_26,SP_27, // 32-39
- SP_28,SP_ATK1,SP_ATK2,SP_MATK1,SP_MATK2,SP_DEF1,SP_DEF2,SP_MDEF1, // 40-47
- SP_MDEF2,SP_HIT,SP_FLEE1,SP_FLEE2,SP_CRITICAL,SP_ASPD,SP_36,SP_JOBLEVEL, // 48-55
- SP_UPPER,SP_PARTNER,SP_CART,SP_FAME,SP_UNBREAKABLE, //56-60
- SP_CARTINFO=99, // 99
-
- SP_BASEJOB=119, // 100+19 - celest
- SP_BASECLASS=120, //Hmm.. why 100+19? I just use the next one... [Skotlex]
-
- // original 1000-
- SP_ATTACKRANGE=1000, SP_ATKELE,SP_DEFELE, // 1000-1002
- SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006
- SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011
- SP_ADDEFF, SP_RESEFF, // 1012-1013
- SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, // 1014-1018
- SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, // 1019-1021
- SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025
- SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, // 1026-1027
- SP_ATK_RATE,SP_SPEED_ADDRATE,SP_ASPD_ADDRATE, // 1028-1030
- SP_MAGIC_ATK_DEF,SP_MISC_ATK_DEF, // 1031-1032
- SP_IGNORE_MDEF_ELE,SP_IGNORE_MDEF_RACE, // 1033-1034
- SP_MAGIC_ADDELE,SP_MAGIC_ADDRACE,SP_MAGIC_ADDSIZE, // 1035-1037
- SP_PERFECT_HIT_RATE,SP_PERFECT_HIT_ADD_RATE,SP_CRITICAL_RATE,SP_GET_ZENY_NUM,SP_ADD_GET_ZENY_NUM, // 1038-1042
- SP_ADD_DAMAGE_CLASS,SP_ADD_MAGIC_DAMAGE_CLASS,SP_ADD_DEF_CLASS,SP_ADD_MDEF_CLASS, // 1043-1046
- SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_ADD_SPEED, // 1047-1050
- SP_HIT_RATE,SP_FLEE_RATE,SP_FLEE2_RATE,SP_DEF_RATE,SP_DEF2_RATE,SP_MDEF_RATE,SP_MDEF2_RATE, // 1051-1057
- SP_SPLASH_RANGE,SP_SPLASH_ADD_RANGE,SP_AUTOSPELL,SP_HP_DRAIN_RATE,SP_SP_DRAIN_RATE, // 1058-1062
- SP_SHORT_WEAPON_DAMAGE_RETURN,SP_LONG_WEAPON_DAMAGE_RETURN,SP_WEAPON_COMA_ELE,SP_WEAPON_COMA_RACE, // 1063-1066
- SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070
- SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
- SP_FREE,SP_CLASSCHANGE, // 1077-1078
- SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
- SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
- SP_DELAYRATE,SP_HP_DRAIN_RATE_RACE,SP_SP_DRAIN_RATE_RACE, // 1083-1085
-
- SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
- SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
- SP_UNBREAKABLE_SHIELD, SP_LONG_ATK_RATE, // 2011-2012
-
- SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
- SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020
- SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
- SP_SUBSIZE, SP_HP_DRAIN_VALUE_RACE, SP_ADD_ITEM_HEAL_RATE, SP_SP_DRAIN_VALUE_RACE, SP_EXP_ADDRACE, // 2026-2030
- SP_SP_GAIN_RACE, SP_SUBRACE2, SP_ADDEFF_WHENHIT_SHORT, // 2031-2033
- SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD, // 2034-2037
- SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040
- SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE //2041
- //Before adding another, note that
- //1077 (SP_FREE, previously disguise),
- //are available!
-};
-
-enum {
- LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES
-};
-
-// CELLs for non-permanent cell-based effects (Pneuma, Basilica, Npcs, etc)
-#define CELL_NPC 0x1
-#define CELL_REGEN 0x2
-#define CELL_PNEUMA 0x4
-#define CELL_SAFETYWALL 0x8
-#define CELL_LANDPROTECTOR 0x10
-#define CELL_BASILICA 0x20
-#define CELL_ICEWALL 0x80
-/*
- * map_getcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
- */
-typedef enum {
- CELL_CHKWALL=0, // •Ç(ƒZƒ‹ƒ^ƒCƒv1)
- CELL_CHKWATER, // …ê(ƒZƒ‹ƒ^ƒCƒv3)
- CELL_CHKGROUND, // ’n–ÊáŠQ•¨(ƒZƒ‹ƒ^ƒCƒv5)
- CELL_CHKPASS, // ’ʉ߉”\(ƒZƒ‹ƒ^ƒCƒv1,5ˆÈŠO)
- CELL_CHKREACH, // Same as PASS, but ignores the cell-stacking mod.
- CELL_CHKNOPASS, // ’ʉߕs‰Â(ƒZƒ‹ƒ^ƒCƒv1,5)
- CELL_CHKNOREACH, // Same as NOPASS, but ignores the cell-stacking mod.
- CELL_GETTYPE, // ƒZƒ‹ƒ^ƒCƒv‚ð•Ô‚·
- CELL_GETCELLTYPE,
- CELL_CHKNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC(ƒZƒ‹ƒ^ƒCƒv0x80ƒtƒ‰ƒO)
- CELL_CHKREGEN, // cells that improve regeneration
- CELL_CHKPNEUMA,
- CELL_CHKSAFETYWALL,
- CELL_CHKBASILICA, // ƒoƒWƒŠƒJ(ƒZƒ‹ƒ^ƒCƒv0x40ƒtƒ‰ƒO)
- CELL_CHKLANDPROTECTOR,
- CELL_CHKICEWALL,
- CELL_CHKSTACK,
-} cell_t;
-// map_setcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
-enum {
- CELL_SETNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC‚ðƒZƒbƒg
- CELL_CLRNPC,
- CELL_SETBASILICA, // ƒoƒWƒŠƒJ‚ðƒZƒbƒg
- CELL_CLRBASILICA, // ƒoƒWƒŠƒJ‚ðƒNƒŠƒA
- CELL_SETREGEN, // set regen cell
- CELL_SETLANDPROTECTOR, //Set/Clear Magnetic Earth
- CELL_CLRLANDPROTECTOR,
- CELL_SETPNEUMA,
- CELL_CLRPNEUMA,
- CELL_SETSAFETYWALL,
- CELL_CLRSAFETYWALL,
- CELL_SETICEWALL,
- CELL_CLRICEWALL,
-};
-
-struct chat_data {
- struct block_list bl;
-
- unsigned char pass[8]; /* password */
- unsigned char title[61]; /* room title MAX 60 */
- unsigned char limit; /* join limit */
- unsigned char trigger;
- unsigned char users; /* current users */
- unsigned char pub; /* room attribute */
- struct map_session_data *usersd[20];
- struct block_list *owner_;
- struct block_list **owner;
- char npc_event[50];
-};
-
-extern struct map_data map[];
-extern int map_num;
-extern int autosave_interval;
-extern int minsave_interval;
-extern int save_settings;
-extern int agit_flag;
-extern int night_flag; // 0=day, 1=night [Yor]
-extern int enable_spy; //Determines if @spy commands are active.
-extern char db_path[256];
-
-// gat?Ö§
-int map_getcell(int,int,int,cell_t);
-int map_getcellp(struct map_data*,int,int,cell_t);
-void map_setcell(int,int,int,int);
-extern int map_read_flag; // 0: grf«Õ«¡«¤«E1: «­«ã«Ã«·«E2: «­«ã«Ã«·«E?õê)
-enum {
- READ_FROM_GAT, READ_FROM_AFM,
- READ_FROM_BITMAP, CREATE_BITMAP,
- READ_FROM_BITMAP_COMPRESSED, CREATE_BITMAP_COMPRESSED
-};
-
-extern char motd_txt[];
-extern char help_txt[];
-extern char help2_txt[];
-extern char charhelp_txt[];
-
-extern char talkie_mes[];
-
-extern char wisp_server_name[];
-
-// ŽI‘S‘Ìî•ñ
-void map_setusers(int);
-int map_getusers(void);
-// block휊֘A
-int map_freeblock(struct block_list *bl);
-int map_freeblock_lock(void);
-//int map_freeblock_unlock(void);
-int map_freeblock_unlock_sub (char *file, int lineno);
-#define map_freeblock_unlock() map_freeblock_unlock_sub (__FILE__, __LINE__)
-// blockŠÖ˜A
-int map_addblock_sub(struct block_list *, int);
-int map_delblock_sub(struct block_list *, int);
-#define map_addblock(bl) map_addblock_sub(bl,1)
-#define map_delblock(bl) map_delblock_sub(bl,1)
-int map_moveblock(struct block_list *, int, int, unsigned int);
-int map_foreachinrange(int (*)(struct block_list*,va_list),struct block_list *,int,int,...);
-int map_foreachinshootrange(int (*)(struct block_list*,va_list),struct block_list *,int,int,...);
-int map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...);
-// -- moonsoul (added map_foreachincell)
-int map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...);
-int map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...);
-int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int range,int type,...); // Celest
-int map_foreachinmap(int (*)(struct block_list*,va_list),int,int,...);
-int map_countnearpc(int,int,int);
-//blockŠÖ˜A‚ɒljÁ
-int map_count_oncell(int m,int x,int y,int type);
-struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int x,int y,int skill_id,struct skill_unit *);
-// ˆêŽž“IobjectŠÖ˜A
-int map_addobject(struct block_list *);
-int map_delobject(int);
-int map_delobjectnofree(int id);
-void map_foreachobject(int (*)(struct block_list*,va_list),int,...);
-int map_search_freecell(struct block_list *src, int m, short *x, short *y, int rx, int ry, int flag);
-//
-int map_quit(struct map_session_data *);
-void map_quit_ack(struct map_session_data *);
-// npc
-int map_addnpc(int,struct npc_data *);
-
-// °ƒAƒCƒeƒ€ŠÖ˜A
-int map_clearflooritem_timer(int,unsigned int,int,int);
-int map_removemobs_timer(int,unsigned int,int,int);
-#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
-int map_addflooritem(struct item *,int,int,int,int,struct map_session_data *,struct map_session_data *,struct map_session_data *,int);
-
-// ƒLƒƒƒ‰id„ƒLƒƒƒ‰–¼ •ÏŠ·ŠÖ˜A
-void map_addchariddb(int charid,char *name);
-void map_delchariddb(int charid);
-int map_reqchariddb(struct map_session_data * sd,int charid);
-char * map_charid2nick(int);
-struct map_session_data * map_charid2sd(int);
-
-struct map_session_data * map_id2sd(int);
-struct block_list * map_id2bl(int);
-int map_mapindex2mapid(unsigned short mapindex);
-int map_mapname2mapid(char*);
-int map_mapname2ipport(unsigned short,int*,int*);
-int map_setipport(unsigned short map,unsigned long ip,int port);
-int map_eraseipport(unsigned short map,unsigned long ip,int port);
-int map_eraseallipport(void);
-void map_addiddb(struct block_list *);
-void map_deliddb(struct block_list *bl);
-struct map_session_data** map_getallusers(int *users);
-void map_foreachpc(int (*func)(DBKey,void*,va_list),...);
-int map_foreachiddb(int (*)(DBKey,void*,va_list),...);
-void map_addnickdb(struct map_session_data *);
-struct map_session_data * map_nick2sd(char*);
-int compare_item(struct item *a, struct item *b);
-
-// ‚»‚Ì‘¼
-int map_check_dir(int s_dir,int t_dir);
-int map_calc_dir( struct block_list *src,int x,int y);
-int map_random_dir(struct block_list *bl, short *x, short *y); // [Skotlex]
-
-// Water functions...
-//
-int map_setwaterheight(int m, char *mapname, int height);
-int map_waterheight(char *mapname);
-
-// path.c‚æ‚è
-int path_search_real(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag,cell_t flag2);
-#define path_search(wpd,m,x0,y0,x1,y1,flag) path_search_real(wpd,m,x0,y0,x1,y1,flag,CELL_CHKNOPASS)
-#define path_search2(wpd,m,x0,y0,x1,y1,flag) path_search_real(wpd,m,x0,y0,x1,y1,flag,CELL_CHKWALL)
-
-int path_search_long_real(struct shootpath_data *spd,int m,int x0,int y0,int x1,int y1,cell_t flag);
-#define path_search_long(spd,m,x0,y0,x1,y1) path_search_long_real(spd,m,x0,y0,x1,y1,CELL_CHKWALL)
-
-int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
-
-// distance related functions [Skotlex]
-#define check_distance_bl(bl1, bl2, distance) check_distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y, distance)
-#define check_distance_blxy(bl, x1, y1, distance) check_distance((bl)->x-(x1), (bl)->y-(y1), distance)
-#define check_distance_xy(x0, y0, x1, y1, distance) check_distance((x0)-(x1), (y0)-(y1), distance)
-int check_distance(int dx, int dy, int distance);
-
-#define distance_bl(bl1, bl2) distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y)
-#define distance_blxy(bl, x1, y1) distance((bl)->x-(x1), (bl)->y-(y1))
-#define distance_xy(x0, y0, x1, y1) distance((x0)-(x1), (y0)-(y1))
-unsigned int distance(int dx, int dy);
-
-int cleanup_sub(struct block_list *bl, va_list ap);
-
-void map_helpscreen(int flag); // [Valaris]
-int map_delmap(char *mapname);
-
-int map_addmobtolist(unsigned short m, struct spawn_data *spawn); // [Wizputer]
-void map_spawnmobs(int); // [Wizputer]
-void map_removemobs(int); // [Wizputer]
-void do_reconnect_map(void); //Invoked on map-char reconnection [Skotlex]
-
-//Added for own save method
-int charsql_db_init(int method);
-
-extern char *INTER_CONF_NAME;
-extern char *LOG_CONF_NAME;
-extern char *MAP_CONF_NAME;
-extern char *BATTLE_CONF_FILENAME;
-extern char *ATCOMMAND_CONF_FILENAME;
-extern char *CHARCOMMAND_CONF_FILENAME;
-extern char *SCRIPT_CONF_NAME;
-extern char *MSG_CONF_NAME;
-extern char *GRF_PATH_FILENAME;
-
-
-extern int charsave_method; //needed ..
-extern char *map_server_dns;
-
-#ifndef TXT_ONLY
-
-// MySQL
-#ifdef __WIN32
-#include <my_global.h>
-#include <my_sys.h>
-#endif
-#include <mysql.h>
-
-extern char tmp_sql[65535];
-
-extern int db_use_sqldbs;
-extern MYSQL mmysql_handle;
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-
-extern MYSQL charsql_handle;
-extern MYSQL_RES* charsql_res;
-extern MYSQL_ROW charsql_row;
-
-extern MYSQL logmysql_handle;
-extern MYSQL_RES* logsql_res ;
-extern MYSQL_ROW logsql_row ;
-
-extern int mail_server_enable;
-extern MYSQL mail_handle;
-extern MYSQL_RES* mail_res ;
-extern MYSQL_ROW mail_row ;
-
-extern char item_db_db[32];
-extern char item_db2_db[32];
-extern char mob_db_db[32];
-extern char mob_db2_db[32];
-extern char char_db[32];
-extern char mail_db[32];
-
-#endif /* not TXT_ONLY */
-//Useful typedefs from jA [Skotlex]
-typedef struct map_session_data TBL_PC;
-typedef struct npc_data TBL_NPC;
-typedef struct mob_data TBL_MOB;
-typedef struct flooritem_data TBL_ITEM;
-typedef struct chat_data TBL_CHAT;
-typedef struct skill_unit TBL_SKILL;
-typedef struct pet_data TBL_PET;
-typedef struct homun_data TBL_HOM;
-
-#define BL_CAST(type_, bl , dest) \
- (((bl) == NULL || (bl)->type != type_) ? ((dest) = NULL, 0) : ((dest) = (T ## type_ *)(bl), 1))
-
-
-extern int lowest_gm_level;
-extern char main_chat_nick[16];
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _MAP_H_
+#define _MAP_H_
+
+#include <stdarg.h>
+#include "../common/mmo.h"
+#include "../common/mapindex.h"
+#include "../common/db.h"
+
+//Uncomment to enable the Cell Stack Limit mod.
+//It's only config is the battle_config cell_stack_limit.
+//Only chars affected are those defined in BL_CHAR (mobs and players currently)
+//#define CELL_NOSTACK
+
+//Uncomment to enable circular area checks.
+//By default, all range checks in Aegis are of Square shapes, so a weapon range
+// of 10 allows you to attack from anywhere within a 21x21 area.
+//Enabling this changes such checks to circular checks, which is more realistic,
+// but is not the official behaviour.
+//#define CIRCULAR_AREA
+
+#define MAX_PC_CLASS 4050
+#define PC_CLASS_BASE 0
+#define PC_CLASS_BASE2 (PC_CLASS_BASE + 4001)
+#define PC_CLASS_BASE3 (PC_CLASS_BASE2 + 22)
+#define MAX_NPC_PER_MAP 512
+#define BLOCK_SIZE 8
+#define AREA_SIZE battle_config.area_size
+#define LIFETIME_FLOORITEM 60
+#define DAMAGELOG_SIZE 30
+#define LOOTITEM_SIZE 10
+#define MAX_STATUSCHANGE 250
+//Quick defines to know which are the min-max common ailments. [Skotlex]
+//Because of the way the headers are included.. these must be replaced for actual values.
+//Remember to update as needed! Min is SC_STONE and max is SC_DPOISON currently.
+#define SC_COMMON_MIN 0
+#define SC_COMMON_MAX 10
+
+#define MAX_SKILL_LEVEL 100
+#define MAX_SKILLUNITGROUP 25
+#define MAX_SKILLUNITGROUPTICKSET 25
+#define MAX_SKILLTIMERSKILL 15
+#define MAX_MOBSKILL 50
+#define MAX_MOB_LIST_PER_MAP 128
+#define MAX_EVENTQUEUE 2
+#define MAX_EVENTTIMER 32
+#define NATURAL_HEAL_INTERVAL 500
+#define MAX_FLOORITEM 500000
+#define MAX_LEVEL 1000
+#define MAX_WALKPATH 32
+#define MAX_DROP_PER_MAP 48
+#define MAX_IGNORE_LIST 80
+#define MAX_VENDING 12
+#define MOBID_EMPERIUM 1288
+
+#define MAX_PC_BONUS 10
+//Designed for search functions, species max number of matches to display.
+#define MAX_SEARCH 5
+#define MAX_DUEL 1024
+
+#define map_id2index(id) map[(id)].index
+
+//The following system marks a different job ID system used by the map server,
+//which makes a lot more sense than the normal one. [Skotlex]
+//
+//These marks the "level" of the job.
+#define JOBL_2_1 0x100 //256
+#define JOBL_2_2 0x200 //512
+#define JOBL_2 0x300
+
+#define JOBL_UPPER 0x1000 //4096
+#define JOBL_BABY 0x2000 //8192
+
+//for filtering and quick checking.
+#define MAPID_UPPERMASK 0x0fff
+#define MAPID_BASEMASK 0x00ff
+//First Jobs
+//Note the oddity of the novice:
+//Super Novices are considered the 2-1 version of the novice! Novices are considered a first class type, too...
+enum {
+ MAPID_NOVICE = 0x0,
+ MAPID_SWORDMAN,
+ MAPID_MAGE,
+ MAPID_ARCHER,
+ MAPID_ACOLYTE,
+ MAPID_MERCHANT,
+ MAPID_THIEF,
+ MAPID_TAEKWON,
+ MAPID_WEDDING,
+ MAPID_GUNSLINGER,
+ MAPID_NINJA,
+ MAPID_XMAS, // [Valaris]
+//2_1 classes
+ MAPID_SUPER_NOVICE = JOBL_2_1|0x0,
+ MAPID_KNIGHT,
+ MAPID_WIZARD,
+ MAPID_HUNTER,
+ MAPID_PRIEST,
+ MAPID_BLACKSMITH,
+ MAPID_ASSASSIN,
+ MAPID_STAR_GLADIATOR,
+//2_2 classes
+ MAPID_CRUSADER = JOBL_2_2|0x1,
+ MAPID_SAGE,
+ MAPID_BARDDANCER,
+ MAPID_MONK,
+ MAPID_ALCHEMIST,
+ MAPID_ROGUE,
+ MAPID_SOUL_LINKER,
+//1-1, advanced
+ MAPID_NOVICE_HIGH = JOBL_UPPER|0x0,
+ MAPID_SWORDMAN_HIGH,
+ MAPID_MAGE_HIGH,
+ MAPID_ARCHER_HIGH,
+ MAPID_ACOLYTE_HIGH,
+ MAPID_MERCHANT_HIGH,
+ MAPID_THIEF_HIGH,
+//2_1 advanced
+ MAPID_LORD_KNIGHT = JOBL_UPPER|JOBL_2_1|0x1,
+ MAPID_HIGH_WIZARD,
+ MAPID_SNIPER,
+ MAPID_HIGH_PRIEST,
+ MAPID_WHITESMITH,
+ MAPID_ASSASSIN_CROSS,
+//2_2 advanced
+ MAPID_PALADIN = JOBL_UPPER|JOBL_2_2|0x1,
+ MAPID_PROFESSOR,
+ MAPID_CLOWNGYPSY,
+ MAPID_CHAMPION,
+ MAPID_CREATOR,
+ MAPID_STALKER,
+//1-1 baby
+ MAPID_BABY = JOBL_BABY|0x0,
+ MAPID_BABY_SWORDMAN,
+ MAPID_BABY_MAGE,
+ MAPID_BABY_ARCHER,
+ MAPID_BABY_ACOLYTE,
+ MAPID_BABY_MERCHANT,
+ MAPID_BABY_THIEF,
+ MAPID_BABY_TAEKWON,
+//2_1 baby
+ MAPID_SUPER_BABY = JOBL_BABY|JOBL_2_1|0x0,
+ MAPID_BABY_KNIGHT,
+ MAPID_BABY_WIZARD,
+ MAPID_BABY_HUNTER,
+ MAPID_BABY_PRIEST,
+ MAPID_BABY_BLACKSMITH,
+ MAPID_BABY_ASSASSIN,
+ MAPID_BABY_STAR_GLADIATOR,
+//2_2 baby
+ MAPID_BABY_CRUSADER = JOBL_BABY|JOBL_2_2|0x1,
+ MAPID_BABY_SAGE,
+ MAPID_BABY_BARDDANCER,
+ MAPID_BABY_MONK,
+ MAPID_BABY_ALCHEMIST,
+ MAPID_BABY_ROGUE,
+ MAPID_BABY_SOUL_LINKER,
+};
+
+//Don't change this, as the client seems to always send/receive 80 characters as it currently is. [Skotlex]
+#define MESSAGE_SIZE 80
+
+#define DEFAULT_AUTOSAVE_INTERVAL 5*60*1000
+
+//Specifies maps where players may hit each other
+#define map_flag_vs(m) (map[m].flag.pvp || map[m].flag.gvg_dungeon || map[m].flag.gvg || (agit_flag && map[m].flag.gvg_castle))
+//Specifies maps that have special GvG/WoE restrictions
+#define map_flag_gvg(m) (map[m].flag.gvg || (agit_flag && map[m].flag.gvg_castle))
+//Specifies if the map is tagged as GvG/WoE (regardless of agit_flag status)
+#define map_flag_gvg2(m) (map[m].flag.gvg || map[m].flag.gvg_castle)
+//Caps values to min/max
+#define cap_value(a, min, max) (a>=max?max:a<=min?min:a)
+
+//This stackable implementation does not means a BL can be more than one type at a time, but it's
+//meant to make it easier to check for multiple types at a time on invocations such as
+// map_foreach* calls [Skotlex]
+enum {
+ BL_NUL = 0x000,
+ BL_PC = 0x001,
+ BL_MOB = 0x002,
+ BL_PET = 0x004,
+ BL_HOM = 0x008, //[blackhole89]
+ BL_ITEM = 0x010,
+ BL_SKILL = 0x020,
+ BL_NPC = 0x040,
+ BL_CHAT = 0x080,
+};
+
+//For common mapforeach calls. Since pets cannot be affected, they aren't included here yet.
+#define BL_CHAR (BL_PC|BL_MOB|BL_HOM)
+#define BL_ALL 0xfff
+
+enum { WARP, SHOP, SCRIPT, MONS };
+
+enum {
+ RC_FORMLESS=0,
+ RC_UNDEAD,
+ RC_BRUTE,
+ RC_PLANT,
+ RC_INSECT,
+ RC_FISH,
+ RC_DEMON,
+ RC_DEMIHUMAN,
+ RC_ANGEL,
+ RC_DRAGON,
+ RC_BOSS,
+ RC_NONBOSS,
+ RC_MAX
+};
+
+enum {
+ ELE_NEUTRAL=0,
+ ELE_WATER,
+ ELE_EARTH,
+ ELE_FIRE,
+ ELE_WIND,
+ ELE_POISON,
+ ELE_HOLY,
+ ELE_DARK,
+ ELE_GHOST,
+ ELE_UNDEAD,
+ ELE_MAX
+};
+
+enum {
+ IG_BLUEBOX=1,
+ IG_VIOLETBOX, //2
+ IG_CARDALBUM, //3
+ IG_GIFTBOX, //4
+ IG_SCROLLBOX, //5
+ IG_FINDINGORE, //6
+ IG_COOKIEBAG, //7
+ IG_POTION, //8
+ IG_HERBS, //9
+ IG_FRUITS, //10
+ IG_MEAT, //11
+ IG_CANDY, //12
+ IG_JUICE, //13
+ IG_FISH, //14
+ IG_BOXES, //15
+ IG_GEMSTONE, //16
+ IG_JELLOPY, //17
+ IG_ORE, //18
+ IG_FOOD, //19
+ IG_RECOVERY, //20
+ IG_MINERALS, //21
+ IG_TAMING, //22
+ IG_SCROLLS, //23
+ IG_QUIVERS, //24
+ IG_MASKS, //25
+ IG_ACCESORY, //26
+ IG_JEWELS, //27
+ IG_GIFTBOX_1, //28
+ IG_GIFTBOX_2, //29
+ IG_GIFTBOX_3, //30
+ IG_GIFTBOX_4, //31
+ IG_EGGBOY, //32
+ IG_EGGGIRL, //33
+ IG_GIFTBOXCHINA, //34
+ IG_LOTTOBOX, //35
+ MAX_ITEMGROUP,
+} item_group_list;
+
+enum {
+ ATF_SELF=0x01,
+ ATF_TARGET=0x02,
+ ATF_SHORT=0x04,
+ ATF_LONG=0x08
+} auto_trigger_flag;
+
+struct block_list {
+ struct block_list *next,*prev;
+ int id;
+ short m,x,y;
+ unsigned char type;
+ unsigned char subtype;
+};
+
+struct walkpath_data {
+ unsigned char path_len,path_pos,path_half;
+ unsigned char path[MAX_WALKPATH];
+};
+struct shootpath_data {
+ int rx,ry,len;
+ int x[MAX_WALKPATH];
+ int y[MAX_WALKPATH];
+};
+
+struct skill_timerskill {
+ int timer;
+ int src_id;
+ int target_id;
+ int map;
+ short x,y;
+ short skill_id,skill_lv;
+ int type;
+ int flag;
+};
+
+struct skill_unit_group;
+struct skill_unit {
+ struct block_list bl;
+
+ struct skill_unit_group *group;
+
+ int limit;
+ int val1,val2;
+ short alive,range;
+};
+
+struct skill_unit_group {
+ int src_id;
+ int party_id;
+ int guild_id;
+ int map;
+ int target_flag; //Holds BCT_* flag for battle_check_target
+ int bl_flag; //Holds BL_* flag for map_foreachin* functions
+ unsigned int tick;
+ int limit,interval;
+
+ int skill_id,skill_lv;
+ int val1,val2,val3;
+ char *valstr;
+ int unit_id;
+ int group_id;
+ int unit_count,alive_count;
+ struct skill_unit *unit;
+ struct {
+ unsigned ammo_consume : 1;
+ unsigned magic_power : 1;
+ unsigned into_abyss : 1;
+ unsigned song_dance : 2; //0x1 Song/Dance, 0x2 Ensemble
+ } state;
+};
+struct skill_unit_group_tickset {
+ unsigned int tick;
+ int id;
+};
+
+struct unit_data {
+ struct block_list *bl;
+ struct walkpath_data walkpath;
+ struct skill_timerskill *skilltimerskill[MAX_SKILLTIMERSKILL];
+ struct skill_unit_group *skillunit[MAX_SKILLUNITGROUP];
+ struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
+ short attacktarget_lv;
+ short to_x,to_y;
+ short skillx,skilly;
+ short skillid,skilllv;
+ int skilltarget;
+ int skilltimer;
+ int target;
+ int attacktimer;
+ int walktimer;
+ int chaserange;
+ unsigned int attackabletime;
+ unsigned int canact_tick;
+ unsigned int canmove_tick;
+ unsigned char dir;
+ unsigned char walk_count;
+ struct {
+ unsigned change_walk_target : 1 ;
+ unsigned skillcastcancel : 1 ;
+ unsigned attack_continue : 1 ;
+ unsigned walk_easy : 1 ;
+ unsigned running : 1;
+ } state;
+};
+
+//Basic damage info of a weapon
+//Required because players have two of these, one in status_data and another
+//for their left hand weapon.
+struct weapon_atk {
+ unsigned short atk, atk2;
+ unsigned short range;
+ unsigned char ele;
+};
+
+//For holding basic status (which can be modified by status changes)
+struct status_data {
+ unsigned int
+ hp, sp,
+ max_hp, max_sp;
+ unsigned short
+ str, agi, vit, int_, dex, luk,
+ batk,
+ matk_min, matk_max,
+ speed,
+ amotion, adelay, dmotion,
+ mode;
+ short
+ hit, flee, cri, flee2,
+ def2, mdef2,
+ aspd_rate;
+ unsigned char
+ def_ele, ele_lv,
+ size, race;
+ signed char
+ def, mdef;
+ struct weapon_atk rhw, *lhw; //Right Hand/Left Hand Weapon. Only players have a lhw (hence it's a pointer)
+};
+
+struct script_reg {
+ int index;
+ int data;
+};
+struct script_regstr {
+ int index;
+ char data[256];
+};
+
+struct status_change_entry {
+ int timer;
+ int val1,val2,val3,val4;
+};
+
+struct status_change {
+ struct status_change_entry data[MAX_STATUSCHANGE];
+ short count;
+ unsigned short opt1,opt2;
+ unsigned int opt3, option; //Note that older packet versions use short here.
+};
+
+struct vending {
+ short index;
+ unsigned short amount;
+ unsigned int value;
+};
+
+struct weapon_data {
+ int atkmods[3];
+ // all the variables except atkmods get zero'ed in each call of status_calc_pc
+ // NOTE: if you want to add a non-zeroed variable, you need to update the malloc_set call
+ // in status_calc_pc as well! All the following are automatically zero'ed. [Skotlex]
+ int overrefine;
+ int star;
+ int ignore_def_ele;
+ int ignore_def_race;
+ int def_ratio_atk_ele;
+ int def_ratio_atk_race;
+ int addele[ELE_MAX];
+ int addrace[RC_MAX];
+ int addrace2[RC_MAX];
+ int addsize[3];
+
+ short ignore_def_mob;
+ struct drain_data {
+ short rate;
+ short per;
+ short value;
+ unsigned type:1;
+ } hp_drain[RC_MAX], sp_drain[RC_MAX];
+
+ short add_damage_classid[MAX_PC_BONUS];
+ int add_damage_classrate[MAX_PC_BONUS];
+ int add_damage_class_count;
+};
+
+struct view_data {
+ unsigned short
+ class_,
+ weapon,
+ shield, //Or left-hand weapon.
+ head_top,
+ head_mid,
+ head_bottom,
+ hair_style,
+ hair_color,
+ cloth_color;
+ char sex;
+ unsigned dead_sit : 2;
+};
+
+//Additional regen data that only players have.
+struct regen_data_sub {
+ unsigned short
+ hp,sp;
+
+ //tick accumulation before healing.
+ struct {
+ unsigned int hp,sp;
+ } tick;
+
+ //Regen rates (where every 1 means +100% regen)
+ struct {
+ unsigned char hp,sp;
+ } rate;
+};
+
+struct regen_data {
+
+ unsigned short flag; //Marks what stuff you may heal or not.
+ unsigned short
+ hp,sp,shp,ssp;
+
+ //tick accumulation before healing.
+ struct {
+ unsigned int hp,sp,shp,ssp;
+ } tick;
+
+ //Regen rates (where every 1 means +100% regen)
+ struct {
+ unsigned char
+ hp,sp,shp,ssp;
+ } rate;
+
+ struct {
+ unsigned walk:1; //Can you regen even when walking?
+ unsigned gc:1; //Tags when you should have double regen due to GVG castle
+ unsigned overweight :2; //overweight state (1: 50%, 2: 90%)
+ unsigned block :2; //Block regen flag (1: Hp, 2: Sp)
+ } state;
+
+ //skill-regen, sitting-skill-regen (since not all chars with regen need it)
+ struct regen_data_sub *sregen, *ssregen;
+};
+
+struct party_member_data {
+ struct map_session_data *sd;
+ unsigned int hp; //For HP,x,y refreshing.
+ unsigned short x, y;
+};
+
+struct party_data {
+ struct party party;
+ struct party_member_data data[MAX_PARTY];
+ unsigned char itemc; //For item distribution.
+ struct {
+ unsigned monk : 1; //There's at least one monk in party?
+ unsigned sg : 1; //There's at least one Star Gladiator in party?
+ unsigned snovice :1; //There's a Super Novice
+ unsigned tk : 1; //There's a taekwon
+ } state;
+};
+
+struct npc_data;
+struct pet_db;
+struct homunculus_db; //[orn]
+struct item_data;
+struct square;
+
+struct map_session_data {
+ struct block_list bl;
+ struct unit_data ud;
+ struct view_data vd;
+ struct status_data base_status, battle_status;
+ struct weapon_atk base_lhw, battle_lhw; //Left-hand weapon atk data.
+ struct status_change sc;
+ struct regen_data regen;
+ struct regen_data_sub sregen, ssregen;
+ //NOTE: When deciding to add a flag to state or special_state, take into consideration that state is preserved in
+ //status_calc_pc, while special_state is recalculated in each call. [Skotlex]
+ struct {
+ unsigned auth : 1;
+ unsigned menu_or_input : 1;
+ unsigned dead_sit : 2;
+ unsigned waitingdisconnect : 1;
+ unsigned lr_flag : 2;
+ unsigned connect_new : 1;
+ unsigned arrow_atk : 1;
+ unsigned skill_flag : 1;
+ unsigned gangsterparadise : 1;
+ unsigned rest : 1;
+ unsigned storage_flag : 2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex]
+ unsigned snovice_flag : 4;
+ // originally by Qamera, adapted by celest
+ unsigned event_death : 1;
+ unsigned event_kill_pc : 1;
+ unsigned event_disconnect : 1;
+ unsigned event_kill_mob : 1;
+ unsigned event_baselvup : 1;
+ unsigned event_joblvup : 1;
+ unsigned event_loadmap : 1;
+ // Abracadabra bugfix by Aru
+ unsigned abra_flag : 1;
+ unsigned autotrade : 1; //By Fantik
+ unsigned reg_dirty : 3; //By Skotlex (marks whether registry variables have been saved or not yet)
+ unsigned showdelay :1;
+ unsigned showexp :1;
+ unsigned showzeny :1;
+ unsigned mainchat :1; //[LuzZza]
+ unsigned noask :1; // [LuzZza]
+ unsigned trading :1; //[Skotlex] is 1 only after a trade has started.
+ unsigned deal_locked :2; //1: Clicked on OK. 2: Clicked on TRADE
+ unsigned party_sent :1;
+ unsigned guild_sent :1;
+ unsigned monster_ignore :1; // for monsters to ignore a character [Valaris] [zzo]
+ unsigned size :2; // for tiny/large types
+ unsigned night :1; //Holds whether or not the player currently has the SI_NIGHT effect on. [Skotlex]
+ unsigned finalsave :1; //Signals whether the final save for the char was done or not yet. Meant to prevent exploits and the like. [Skotlex]
+ unsigned blockedmove :1;
+ unsigned using_fake_npc :1;
+ unsigned rewarp :1; //Signals that a player should warp as soon as he is done loading a map. [Skotlex]
+ unsigned killer : 1;
+ unsigned killable : 1;
+ unsigned doridori : 1;
+ unsigned ignoreAll : 1;
+ unsigned short autoloot;
+ struct guild *gmaster_flag;
+ } state;
+ struct {
+ unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
+ unsigned restart_full_recover : 1;
+ unsigned no_castcancel : 1;
+ unsigned no_castcancel2 : 1;
+ unsigned no_sizefix : 1;
+ unsigned no_gemstone : 1;
+ unsigned intravision : 1; // Maya Purple Card effect allowing to see Hiding/Cloaking people [DracoRPG]
+ unsigned perfect_hiding : 1; // [Valaris]
+ } special_state;
+ int login_id1, login_id2;
+ unsigned short class_; //This is the internal job ID used by the map server to simplify comparisons/queries/etc. [Skotlex]
+
+ int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 ... 18
+ struct mmo_charstatus status;
+ struct registry save_reg;
+
+ struct item_data *inventory_data[MAX_INVENTORY];
+ short equip_index[11];
+ unsigned int weight,max_weight;
+ int cart_weight,cart_max_weight,cart_num,cart_max_num;
+ int fd;
+ unsigned short mapindex;
+ unsigned short prev_speed,prev_adelay;
+ unsigned char head_dir; //0: Look forward. 1: Look right, 2: Look left.
+ unsigned int client_tick;
+ int npc_id,areanpc_id,npc_shopid;
+ int npc_item_flag; //Marks the npc_id with which you can use items during interactions with said npc (see script command enable_itemuse)
+ int npc_menu, max_menu;
+ int npc_amount;
+ struct script_state *st;
+ char npc_str[256];
+ int npc_timer_id; //For player attached npc timers. [Skotlex]
+ unsigned int chatID;
+ time_t idletime;
+
+ struct{
+ char name[NAME_LENGTH];
+ } ignore[MAX_IGNORE_LIST];
+
+ int followtimer; // [MouseJstr]
+ int followtarget;
+
+ time_t emotionlasttime; // to limit flood with emotion packets
+
+ short skillitem,skillitemlv;
+ short skillid_old,skilllv_old;
+ short skillid_dance,skilllv_dance;
+ char blockskill[MAX_SKILL]; // [celest]
+ int cloneskill_id;
+ int menuskill_id, menuskill_lv;
+
+ int invincible_timer;
+ unsigned int canlog_tick;
+ unsigned int canuseitem_tick; // [Skotlex]
+ unsigned int cantalk_tick;
+
+ short weapontype1,weapontype2;
+ short disguise; // [Valaris]
+
+ struct weapon_data right_weapon, left_weapon;
+
+ // here start arrays to be globally zeroed at the beginning of status_calc_pc()
+ int param_bonus[6],param_equip[6]; //Stores card/equipment bonuses.
+ int subele[ELE_MAX];
+ int subrace[RC_MAX];
+ int subrace2[RC_MAX];
+ int subsize[3];
+ int reseff[SC_COMMON_MAX-SC_COMMON_MIN+1];
+ int weapon_coma_ele[ELE_MAX];
+ int weapon_coma_race[RC_MAX];
+ int weapon_atk[16];
+ int weapon_atk_rate[16];
+ int arrow_addele[ELE_MAX];
+ int arrow_addrace[RC_MAX];
+ int arrow_addsize[3];
+ int magic_addele[ELE_MAX];
+ int magic_addrace[RC_MAX];
+ int magic_addsize[3];
+ int critaddrace[RC_MAX];
+ int expaddrace[RC_MAX];
+ int itemgrouphealrate[MAX_ITEMGROUP];
+ short sp_gain_race[RC_MAX];
+ // zeroed arrays end here.
+ // zeroed structures start here
+ struct s_autospell{
+ short id, lv, rate, card_id;
+ } autospell[MAX_PC_BONUS], autospell2[MAX_PC_BONUS];
+ struct s_addeffect{
+ short id, rate, arrow_rate;
+ unsigned char flag;
+ } addeff[MAX_PC_BONUS], addeff2[MAX_PC_BONUS];
+ struct { //skillatk raises bonus dmg% of skills, skillblown increases bonus blewcount for some skills.
+ short id, val;
+ } skillatk[MAX_PC_BONUS], skillblown[MAX_PC_BONUS];
+ struct {
+ short class_, rate;
+ } add_def[MAX_PC_BONUS], add_mdef[MAX_PC_BONUS],
+ add_dmg[MAX_PC_BONUS], add_mdmg[MAX_PC_BONUS];
+ struct s_add_drop {
+ short id, group;
+ int race, rate;
+ } add_drop[MAX_PC_BONUS];
+ struct {
+ int nameid;
+ int rate;
+ } itemhealrate[MAX_PC_BONUS];
+ // zeroed structures end here
+ // zeroed vars start here.
+ int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
+ int nsshealhp,nsshealsp;
+ int critical_def,double_rate;
+ int long_attack_atk_rate; //Long range atk rate, not weapon based. [Skotlex]
+ int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
+ int ignore_mdef_ele;
+ int ignore_mdef_race;
+ int perfect_hit;
+ int perfect_hit_add;
+ int get_zeny_rate;
+ int get_zeny_num; //Added Get Zeny Rate [Skotlex]
+ int double_add_rate;
+ int short_weapon_damage_return,long_weapon_damage_return;
+ int magic_damage_return; // AppleGirl Was Here
+ int random_attack_increase_add,random_attack_increase_per; // [Valaris]
+ int break_weapon_rate,break_armor_rate;
+ int crit_atk_rate;
+ int hp_loss_rate;
+ int sp_loss_rate;
+ int classchange; // [Valaris]
+ int speed_add_rate, aspd_add_rate;
+ unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
+
+ short splash_range, splash_add_range;
+ short add_steal_rate;
+ short hp_loss_value;
+ short sp_loss_value;
+ short hp_loss_type;
+ short sp_gain_value, hp_gain_value;
+ short sp_vanish_rate;
+ short sp_vanish_per;
+ short add_drop_count;
+ unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
+ unsigned short unbreakable_equip; //100% break resistance on certain equipment
+ unsigned short unstripable_equip;
+ short add_def_count,add_mdef_count;
+ short add_dmg_count,add_mdmg_count;
+
+ // zeroed vars end here.
+
+ int castrate,delayrate,hprate,sprate,dsprate;
+ int atk_rate;
+ int speed_rate,hprecov_rate,sprecov_rate;
+ int matk_rate;
+ int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
+
+ int hp_loss_tick;
+ int sp_loss_tick;
+
+ int itemid;
+ short itemindex; //Used item's index in sd->inventory [Skotlex]
+
+ short catch_target_class; // pet catching, stores a pet class to catch (short now) [zzo]
+
+ short spiritball, spiritball_old;
+ int spirit_timer[MAX_SKILL_LEVEL];
+
+ unsigned char potion_success_counter; //Potion successes in row counter
+ unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
+ short mission_mobid; //Stores the target mob_id for TK_MISSION
+ int die_counter; //Total number of times you've died
+ int devotion[5]; //Stores the char IDs of chars devoted to.
+ int reg_num; //Number of registries (type numeric)
+ int regstr_num; //Number of registries (type string)
+
+ struct script_reg *reg;
+ struct script_regstr *regstr;
+
+ int trade_partner;
+ struct {
+ struct {
+ int index, amount;
+ } item[10];
+ int zeny, weight;
+ } deal;
+
+ int party_invite,party_invite_account;
+
+ int guild_invite,guild_invite_account;
+ int guild_emblem_id,guild_alliance,guild_alliance_account;
+ short guild_x,guild_y; // For guildmate position display. [Skotlex] should be short [zzo]
+ int guildspy; // [Syrus22]
+ int partyspy; // [Syrus22]
+
+ int vender_id;
+ int vend_num;
+ char message[MESSAGE_SIZE];
+ struct vending vending[MAX_VENDING];
+
+ struct pet_data *pd;
+ struct homun_data *hd; // [blackhole89]
+
+ struct{
+ int m; //-1 - none, other: map index corresponding to map name.
+ unsigned short index; //map index
+ }feel_map[3];// 0 - Sun; 1 - Moon; 2 - Stars
+ short hate_mob[3];
+
+ unsigned int pvp_timer;
+ short pvp_point;
+ unsigned short pvp_rank, pvp_lastusers;
+ unsigned short pvp_won, pvp_lost;
+
+ char eventqueue[MAX_EVENTQUEUE][50];
+ int eventtimer[MAX_EVENTTIMER];
+ unsigned short eventcount; // [celest]
+
+ unsigned char change_level; // [celest]
+
+ char fakename[NAME_LENGTH]; // fake names [Valaris]
+
+#ifndef TXT_ONLY
+ int mail_counter; // mail counter for mail system [Valaris]
+#endif
+
+ int duel_group; // duel vars [LuzZza]
+ int duel_invite;
+
+ char away_message[128]; // [LuzZza]
+
+};
+
+struct {
+ int members_count;
+ int invites_count;
+ int max_players_limit;
+} duel_list[MAX_DUEL];
+
+int duel_count;
+
+struct npc_timerevent_list {
+ int timer,pos;
+};
+struct npc_label_list {
+ char name[NAME_LENGTH];
+ int pos;
+};
+struct npc_item_list {
+ unsigned int nameid,value;
+};
+struct npc_data {
+ struct block_list bl;
+ struct unit_data ud; //Because they need to be able to move....
+ struct view_data *vd;
+ struct status_change sc; //They can't have status changes, but.. they want the visual opt values.
+ short n;
+ short class_;
+ short speed;
+ unsigned char name[NAME_LENGTH];
+ unsigned char exname[NAME_LENGTH];
+ int chat_id;
+ unsigned int next_walktime;
+
+ char eventqueue[MAX_EVENTQUEUE][50];
+ int eventtimer[MAX_EVENTTIMER];
+ short arenaflag;
+
+ void *chatdb;
+ struct npc_data *master_nd;
+
+ union {
+ struct {
+ struct script_code *script;
+ short xs,ys;
+ int guild_id;
+ int timer,timerid,timeramount,rid;
+ unsigned int timertick;
+ struct npc_timerevent_list *timer_event;
+ int label_list_num;
+ struct npc_label_list *label_list;
+ int src_id;
+ } scr;
+ struct npc_item_list shop_item[1];
+ struct {
+ short xs,ys;
+ short x,y;
+ unsigned short mapindex;
+ } warp;
+ } u;
+ //Do NOT place anything afterwards... shop data NPC will override any variables from here and on! [Skotlex]
+};
+
+//For quick linking to a guardian's info. [Skotlex]
+struct guardian_data {
+ int number; //0-MAX_GUARDIANS-1 = Guardians. MAX_GUARDIANS = Emperium.
+ int guild_id;
+ int emblem_id;
+ int guardup_lv; //Level of GD_GUARDUP skill.
+ char guild_name[NAME_LENGTH];
+ struct guild_castle* castle;
+};
+
+// Mob List Held in memory for Dynamic Mobs [Wizputer]
+// Expanded to specify all mob-related spawn data by [Skotlex]
+struct spawn_data {
+ short class_; //Class, used because a mob can change it's class
+ unsigned short m,x,y; //Spawn information (map, point, spawn-area around point)
+ signed short xs,ys;
+ unsigned short num; //Number of mobs using this structure.
+ unsigned int level; //Custom level.
+ unsigned int delay1,delay2; //Min delay before respawning after spawn/death
+ struct {
+ unsigned size :2; //Holds if mob has to be tiny/large
+ unsigned ai :2; //Holds if mob is special ai.
+ } state;
+ char name[NAME_LENGTH],eventname[50]; //Name/event
+};
+
+
+struct mob_data {
+ struct block_list bl;
+ struct unit_data ud;
+ struct view_data *vd;
+ struct status_data status, *base_status; //Second one is in case of leveling up mobs, or tiny/large mobs.
+ struct status_change sc;
+ struct mob_db *db; //For quick data access (saves doing mob_db(md->class_) all the time) [Skotlex]
+ char name[NAME_LENGTH];
+ struct {
+ unsigned size : 2; //Small/Big monsters.
+ unsigned cached : 1; //Cached mobs for dynamic mob unloading [Skotlex]
+ unsigned ai : 2; //Special ai for summoned monsters.
+ //0: Normal mob.
+ //1: Standard summon, attacks mobs.
+ //2: Alchemist Marine Sphere
+ //3: Alchemist Summon Flora
+ } special_state; //Special mob information that does not needs to be zero'ed on mob respawn.
+ struct {
+ unsigned skillstate : 8;
+ unsigned aggressive : 1; //Signals whether the mob AI is in aggressive mode or reactive mode. [Skotlex]
+ unsigned char steal_flag; //number of steal tries (to prevent steal exploit on mobs with few items) [Lupus]
+ unsigned steal_coin_flag : 1;
+ unsigned soul_change_flag : 1; // Celest
+ unsigned alchemist: 1;
+ unsigned no_random_walk: 1;
+ unsigned killer: 1;
+ int provoke_flag; // Celest
+ } state;
+ struct guardian_data* guardian_data;
+ struct {
+ int id;
+ int dmg;
+ unsigned flag : 1; //0: Normal. 1: Homunc exp
+ } dmglog[DAMAGELOG_SIZE];
+ struct spawn_data *spawn; //Spawn data.
+ struct item *lootitem;
+ short spawn_n; //Spawn data index on the map server.
+ short class_;
+ short attacked_count;
+ unsigned char attacked_players;
+ unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
+ int level;
+ int target_id,attacked_id;
+ unsigned int next_walktime;
+ unsigned int last_deadtime,last_spawntime,last_thinktime,last_linktime;
+ short move_fail_count;
+ short lootitem_count;
+ short min_chase;
+
+ int deletetimer;
+ int master_id,master_dist;
+
+ struct npc_data *nd;
+ unsigned short callback_flag;
+
+ short skillidx;
+ unsigned int skilldelay[MAX_MOBSKILL];
+ char npc_event[50];
+};
+
+/* [blackhole89] */
+struct homun_data {
+ struct block_list bl;
+ struct unit_data ud;
+ struct view_data *vd;
+ struct status_data base_status, battle_status;
+ struct status_change sc;
+ struct regen_data regen;
+ struct homunculus_db *homunculusDB; //[orn]
+ struct s_homunculus homunculus ; //[orn]
+
+ struct map_session_data *master; //pointer back to its master
+ int hungry_timer; //[orn]
+ unsigned int exp_next;
+ char blockskill[MAX_SKILL]; // [orn]
+};
+
+struct pet_data {
+ struct block_list bl;
+ struct unit_data ud;
+ struct view_data vd;
+ struct s_pet pet;
+ struct status_data status;
+ struct mob_db *db;
+ struct pet_db *petDB;
+ int pet_hungry_timer;
+ int target_id;
+ short n;
+ struct {
+ unsigned skillbonus : 1;
+ } state;
+ int move_fail_count;
+ unsigned int next_walktime,last_thinktime;
+ short rate_fix; //Support rate as modified by intimacy (1000 = 100%) [Skotlex]
+
+ struct pet_recovery { //Stat recovery
+ unsigned short type; //Status Change id
+ unsigned short delay; //How long before curing (secs).
+ int timer;
+ } *recovery; //[Valaris] / Reimplemented by [Skotlex]
+
+ struct pet_bonus {
+ unsigned short type; //bStr, bVit?
+ unsigned short val; //Qty
+ unsigned short duration; //in secs
+ unsigned short delay; //Time before recasting (secs)
+ int timer;
+ } *bonus; //[Valaris] / Reimplemented by [Skotlex]
+
+ struct pet_skill_attack { //Attack Skill
+ unsigned short id;
+ unsigned short lv;
+ unsigned short div_; //0 = Normal skill. >0 = Fixed damage (lv), fixed div_.
+ unsigned short rate; //Base chance of skill ocurrance (10 = 10% of attacks)
+ unsigned short bonusrate; //How being 100% loyal affects cast rate (10 = At 1000 intimacy->rate+10%
+ } *a_skill; //[Skotlex]
+
+ struct pet_skill_support { //Support Skill
+ unsigned short id;
+ unsigned short lv;
+ unsigned short hp; //Max HP% for skill to trigger (50 -> 50% for Magnificat)
+ unsigned short sp; //Max SP% for skill to trigger (100 = no check)
+ unsigned short delay; //Time (secs) between being able to recast.
+ int timer;
+ } *s_skill; //[Skotlex]
+
+ struct pet_loot {
+ struct item *item;
+ unsigned short count;
+ unsigned short weight;
+ unsigned short max;
+ } *loot; //[Valaris] / Rewritten by [Skotlex]
+
+ struct map_session_data *msd;
+};
+
+enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // ˆÍ‚Ü‚êƒyƒiƒ‹ƒeƒBŒvŽZ—p
+
+struct map_data {
+ char name[MAP_NAME_LENGTH];
+ unsigned short index; //Index is the map index used by the mapindex* functions.
+ unsigned char *gat; // NULL‚Ȃ牺‚Ìmap_data_other_server‚Æ‚µ‚Ĉµ‚¤
+ unsigned char *cell; //Contains temporary cell data that is set/unset on tiles.
+#ifdef CELL_NOSTACK
+ unsigned char *cell_bl; //Holds amount of bls in any given cell.
+#endif
+ char *alias; // [MouseJstr]
+ struct block_list **block;
+ struct block_list **block_mob;
+ int *block_count,*block_mob_count;
+ int m;
+ short xs,ys;
+ short bxs,bys;
+ int water_height;
+ int npc_num;
+ int users;
+ struct {
+ unsigned alias : 1;
+ unsigned nomemo : 1;
+ unsigned noteleport : 1;
+ unsigned noreturn : 1;
+ unsigned monster_noteleport : 1;
+ unsigned nosave : 1;
+ unsigned nobranch : 1;
+ unsigned noexppenalty : 1;
+ unsigned pvp : 1;
+ unsigned pvp_noparty : 1;
+ unsigned pvp_noguild : 1;
+ unsigned pvp_nightmaredrop :1;
+ unsigned pvp_nocalcrank : 1;
+ unsigned gvg_castle : 1;
+ unsigned gvg : 1; // Now it identifies gvg versus maps that are active 24/7
+ unsigned gvg_dungeon : 1; // Celest
+ unsigned gvg_noparty : 1;
+ unsigned nozenypenalty : 1;
+ unsigned notrade : 1;
+ unsigned noskill : 1;
+ unsigned nowarp : 1;
+ unsigned nowarpto : 1;
+ unsigned noicewall : 1; // [Valaris]
+ unsigned snow : 1; // [Valaris]
+ unsigned clouds : 1;
+ unsigned clouds2 : 1; // [Valaris]
+ unsigned fog : 1; // [Valaris]
+ unsigned fireworks : 1;
+ unsigned sakura : 1; // [Valaris]
+ unsigned leaves : 1; // [Valaris]
+ unsigned rain : 1; // [Valaris]
+ unsigned indoors : 1; // celest
+ unsigned nogo : 1; // [Valaris]
+ unsigned nobaseexp : 1; // [Lorky] added by Lupus
+ unsigned nojobexp : 1; // [Lorky]
+ unsigned nomobloot : 1; // [Lorky]
+ unsigned nomvploot : 1; // [Lorky]
+ unsigned nightenabled :1; //For night display. [Skotlex]
+ unsigned restricted : 1; // [Komurka]
+ unsigned nodrop : 1;
+ unsigned novending : 1;
+ unsigned loadevent : 1;
+ unsigned nochat :1;
+ unsigned partylock :1;
+ unsigned guildlock :1;
+ } flag;
+ struct point save;
+ struct npc_data *npc[MAX_NPC_PER_MAP];
+ struct {
+ int drop_id;
+ int drop_type;
+ int drop_per;
+ } drop_list[MAX_DROP_PER_MAP];
+
+ struct spawn_data *moblist[MAX_MOB_LIST_PER_MAP]; // [Wizputer]
+ int mob_delete_timer; // [Skotlex]
+ int zone; // [Komurka]
+ int jexp; // map experience multiplicator
+ int bexp; // map experience multiplicator
+ int nocommand; //Blocks @/# commands for non-gms. [Skotlex]
+};
+
+struct map_data_other_server {
+ char name[MAP_NAME_LENGTH];
+ unsigned short index; //Index is the map index used by the mapindex* functions.
+ unsigned char *gat; // NULLŒÅ’è‚É‚µ‚Ä”»’f
+ unsigned long ip;
+ unsigned int port;
+};
+
+struct flooritem_data {
+ struct block_list bl;
+ unsigned char subx,suby;
+ int cleartimer;
+ int first_get_id,second_get_id,third_get_id;
+ unsigned int first_get_tick,second_get_tick,third_get_tick;
+ struct item item_data;
+};
+
+enum {
+ SP_SPEED,SP_BASEEXP,SP_JOBEXP,SP_KARMA,SP_MANNER,SP_HP,SP_MAXHP,SP_SP, // 0-7
+ SP_MAXSP,SP_STATUSPOINT,SP_0a,SP_BASELEVEL,SP_SKILLPOINT,SP_STR,SP_AGI,SP_VIT, // 8-15
+ SP_INT,SP_DEX,SP_LUK,SP_CLASS,SP_ZENY,SP_SEX,SP_NEXTBASEEXP,SP_NEXTJOBEXP, // 16-23
+ SP_WEIGHT,SP_MAXWEIGHT,SP_1a,SP_1b,SP_1c,SP_1d,SP_1e,SP_1f, // 24-31
+ SP_USTR,SP_UAGI,SP_UVIT,SP_UINT,SP_UDEX,SP_ULUK,SP_26,SP_27, // 32-39
+ SP_28,SP_ATK1,SP_ATK2,SP_MATK1,SP_MATK2,SP_DEF1,SP_DEF2,SP_MDEF1, // 40-47
+ SP_MDEF2,SP_HIT,SP_FLEE1,SP_FLEE2,SP_CRITICAL,SP_ASPD,SP_36,SP_JOBLEVEL, // 48-55
+ SP_UPPER,SP_PARTNER,SP_CART,SP_FAME,SP_UNBREAKABLE, //56-60
+ SP_CARTINFO=99, // 99
+
+ SP_BASEJOB=119, // 100+19 - celest
+ SP_BASECLASS=120, //Hmm.. why 100+19? I just use the next one... [Skotlex]
+
+ // original 1000-
+ SP_ATTACKRANGE=1000, SP_ATKELE,SP_DEFELE, // 1000-1002
+ SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006
+ SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011
+ SP_ADDEFF, SP_RESEFF, // 1012-1013
+ SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, // 1014-1018
+ SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, // 1019-1021
+ SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025
+ SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, // 1026-1027
+ SP_ATK_RATE,SP_SPEED_ADDRATE,SP_ASPD_ADDRATE, // 1028-1030
+ SP_MAGIC_ATK_DEF,SP_MISC_ATK_DEF, // 1031-1032
+ SP_IGNORE_MDEF_ELE,SP_IGNORE_MDEF_RACE, // 1033-1034
+ SP_MAGIC_ADDELE,SP_MAGIC_ADDRACE,SP_MAGIC_ADDSIZE, // 1035-1037
+ SP_PERFECT_HIT_RATE,SP_PERFECT_HIT_ADD_RATE,SP_CRITICAL_RATE,SP_GET_ZENY_NUM,SP_ADD_GET_ZENY_NUM, // 1038-1042
+ SP_ADD_DAMAGE_CLASS,SP_ADD_MAGIC_DAMAGE_CLASS,SP_ADD_DEF_CLASS,SP_ADD_MDEF_CLASS, // 1043-1046
+ SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_ADD_SPEED, // 1047-1050
+ SP_HIT_RATE,SP_FLEE_RATE,SP_FLEE2_RATE,SP_DEF_RATE,SP_DEF2_RATE,SP_MDEF_RATE,SP_MDEF2_RATE, // 1051-1057
+ SP_SPLASH_RANGE,SP_SPLASH_ADD_RANGE,SP_AUTOSPELL,SP_HP_DRAIN_RATE,SP_SP_DRAIN_RATE, // 1058-1062
+ SP_SHORT_WEAPON_DAMAGE_RETURN,SP_LONG_WEAPON_DAMAGE_RETURN,SP_WEAPON_COMA_ELE,SP_WEAPON_COMA_RACE, // 1063-1066
+ SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070
+ SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
+ SP_FREE,SP_CLASSCHANGE, // 1077-1078
+ SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
+ SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
+ SP_DELAYRATE,SP_HP_DRAIN_RATE_RACE,SP_SP_DRAIN_RATE_RACE, // 1083-1085
+
+ SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
+ SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
+ SP_UNBREAKABLE_SHIELD, SP_LONG_ATK_RATE, // 2011-2012
+
+ SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
+ SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020
+ SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
+ SP_SUBSIZE, SP_HP_DRAIN_VALUE_RACE, SP_ADD_ITEM_HEAL_RATE, SP_SP_DRAIN_VALUE_RACE, SP_EXP_ADDRACE, // 2026-2030
+ SP_SP_GAIN_RACE, SP_SUBRACE2, SP_ADDEFF_WHENHIT_SHORT, // 2031-2033
+ SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD, // 2034-2037
+ SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040
+ SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE //2041
+ //Before adding another, note that
+ //1077 (SP_FREE, previously disguise),
+ //are available!
+};
+
+enum {
+ LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES
+};
+
+// CELLs for non-permanent cell-based effects (Pneuma, Basilica, Npcs, etc)
+#define CELL_NPC 0x1
+#define CELL_REGEN 0x2
+#define CELL_PNEUMA 0x4
+#define CELL_SAFETYWALL 0x8
+#define CELL_LANDPROTECTOR 0x10
+#define CELL_BASILICA 0x20
+#define CELL_ICEWALL 0x80
+/*
+ * map_getcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
+ */
+typedef enum {
+ CELL_CHKWALL=0, // •Ç(ƒZƒ‹ƒ^ƒCƒv1)
+ CELL_CHKWATER, // …ê(ƒZƒ‹ƒ^ƒCƒv3)
+ CELL_CHKGROUND, // ’n–ÊáŠQ•¨(ƒZƒ‹ƒ^ƒCƒv5)
+ CELL_CHKPASS, // ’ʉ߉”\(ƒZƒ‹ƒ^ƒCƒv1,5ˆÈŠO)
+ CELL_CHKREACH, // Same as PASS, but ignores the cell-stacking mod.
+ CELL_CHKNOPASS, // ’ʉߕs‰Â(ƒZƒ‹ƒ^ƒCƒv1,5)
+ CELL_CHKNOREACH, // Same as NOPASS, but ignores the cell-stacking mod.
+ CELL_GETTYPE, // ƒZƒ‹ƒ^ƒCƒv‚ð•Ô‚·
+ CELL_GETCELLTYPE,
+ CELL_CHKNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC(ƒZƒ‹ƒ^ƒCƒv0x80ƒtƒ‰ƒO)
+ CELL_CHKREGEN, // cells that improve regeneration
+ CELL_CHKPNEUMA,
+ CELL_CHKSAFETYWALL,
+ CELL_CHKBASILICA, // ƒoƒWƒŠƒJ(ƒZƒ‹ƒ^ƒCƒv0x40ƒtƒ‰ƒO)
+ CELL_CHKLANDPROTECTOR,
+ CELL_CHKICEWALL,
+ CELL_CHKSTACK,
+} cell_t;
+// map_setcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
+enum {
+ CELL_SETNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC‚ðƒZƒbƒg
+ CELL_CLRNPC,
+ CELL_SETBASILICA, // ƒoƒWƒŠƒJ‚ðƒZƒbƒg
+ CELL_CLRBASILICA, // ƒoƒWƒŠƒJ‚ðƒNƒŠƒA
+ CELL_SETREGEN, // set regen cell
+ CELL_SETLANDPROTECTOR, //Set/Clear Magnetic Earth
+ CELL_CLRLANDPROTECTOR,
+ CELL_SETPNEUMA,
+ CELL_CLRPNEUMA,
+ CELL_SETSAFETYWALL,
+ CELL_CLRSAFETYWALL,
+ CELL_SETICEWALL,
+ CELL_CLRICEWALL,
+};
+
+struct chat_data {
+ struct block_list bl;
+
+ unsigned char pass[8]; /* password */
+ unsigned char title[61]; /* room title MAX 60 */
+ unsigned char limit; /* join limit */
+ unsigned char trigger;
+ unsigned char users; /* current users */
+ unsigned char pub; /* room attribute */
+ struct map_session_data *usersd[20];
+ struct block_list *owner_;
+ struct block_list **owner;
+ char npc_event[50];
+};
+
+extern struct map_data map[];
+extern int map_num;
+extern int autosave_interval;
+extern int minsave_interval;
+extern int save_settings;
+extern int agit_flag;
+extern int night_flag; // 0=day, 1=night [Yor]
+extern int enable_spy; //Determines if @spy commands are active.
+extern char db_path[256];
+
+// gat?Ö§
+int map_getcell(int,int,int,cell_t);
+int map_getcellp(struct map_data*,int,int,cell_t);
+void map_setcell(int,int,int,int);
+extern int map_read_flag; // 0: grf«Õ«¡«¤«E1: «­«ã«Ã«·«E2: «­«ã«Ã«·«E?õê)
+enum {
+ READ_FROM_GAT, READ_FROM_AFM,
+ READ_FROM_BITMAP, CREATE_BITMAP,
+ READ_FROM_BITMAP_COMPRESSED, CREATE_BITMAP_COMPRESSED
+};
+
+extern char motd_txt[];
+extern char help_txt[];
+extern char help2_txt[];
+extern char charhelp_txt[];
+
+extern char talkie_mes[];
+
+extern char wisp_server_name[];
+
+// ŽI‘S‘Ìî•ñ
+void map_setusers(int);
+int map_getusers(void);
+// block휊֘A
+int map_freeblock(struct block_list *bl);
+int map_freeblock_lock(void);
+//int map_freeblock_unlock(void);
+int map_freeblock_unlock_sub (char *file, int lineno);
+#define map_freeblock_unlock() map_freeblock_unlock_sub (__FILE__, __LINE__)
+// blockŠÖ˜A
+int map_addblock_sub(struct block_list *, int);
+int map_delblock_sub(struct block_list *, int);
+#define map_addblock(bl) map_addblock_sub(bl,1)
+#define map_delblock(bl) map_delblock_sub(bl,1)
+int map_moveblock(struct block_list *, int, int, unsigned int);
+int map_foreachinrange(int (*)(struct block_list*,va_list),struct block_list *,int,int,...);
+int map_foreachinshootrange(int (*)(struct block_list*,va_list),struct block_list *,int,int,...);
+int map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...);
+// -- moonsoul (added map_foreachincell)
+int map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...);
+int map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...);
+int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int range,int type,...); // Celest
+int map_foreachinmap(int (*)(struct block_list*,va_list),int,int,...);
+int map_countnearpc(int,int,int);
+//blockŠÖ˜A‚ɒljÁ
+int map_count_oncell(int m,int x,int y,int type);
+struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int x,int y,int skill_id,struct skill_unit *);
+// ˆêŽž“IobjectŠÖ˜A
+int map_addobject(struct block_list *);
+int map_delobject(int);
+int map_delobjectnofree(int id);
+void map_foreachobject(int (*)(struct block_list*,va_list),int,...);
+int map_search_freecell(struct block_list *src, int m, short *x, short *y, int rx, int ry, int flag);
+//
+int map_quit(struct map_session_data *);
+void map_quit_ack(struct map_session_data *);
+// npc
+int map_addnpc(int,struct npc_data *);
+
+// °ƒAƒCƒeƒ€ŠÖ˜A
+int map_clearflooritem_timer(int,unsigned int,int,int);
+int map_removemobs_timer(int,unsigned int,int,int);
+#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
+int map_addflooritem(struct item *,int,int,int,int,struct map_session_data *,struct map_session_data *,struct map_session_data *,int);
+
+// ƒLƒƒƒ‰id„ƒLƒƒƒ‰–¼ •ÏŠ·ŠÖ˜A
+void map_addchariddb(int charid,char *name);
+void map_delchariddb(int charid);
+int map_reqchariddb(struct map_session_data * sd,int charid);
+char * map_charid2nick(int);
+struct map_session_data * map_charid2sd(int);
+
+struct map_session_data * map_id2sd(int);
+struct block_list * map_id2bl(int);
+int map_mapindex2mapid(unsigned short mapindex);
+int map_mapname2mapid(char*);
+int map_mapname2ipport(unsigned short,int*,int*);
+int map_setipport(unsigned short map,unsigned long ip,int port);
+int map_eraseipport(unsigned short map,unsigned long ip,int port);
+int map_eraseallipport(void);
+void map_addiddb(struct block_list *);
+void map_deliddb(struct block_list *bl);
+struct map_session_data** map_getallusers(int *users);
+void map_foreachpc(int (*func)(DBKey,void*,va_list),...);
+int map_foreachiddb(int (*)(DBKey,void*,va_list),...);
+void map_addnickdb(struct map_session_data *);
+struct map_session_data * map_nick2sd(char*);
+int compare_item(struct item *a, struct item *b);
+
+// ‚»‚Ì‘¼
+int map_check_dir(int s_dir,int t_dir);
+int map_calc_dir( struct block_list *src,int x,int y);
+int map_random_dir(struct block_list *bl, short *x, short *y); // [Skotlex]
+
+// Water functions...
+//
+int map_setwaterheight(int m, char *mapname, int height);
+int map_waterheight(char *mapname);
+
+// path.c‚æ‚è
+int path_search_real(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag,cell_t flag2);
+#define path_search(wpd,m,x0,y0,x1,y1,flag) path_search_real(wpd,m,x0,y0,x1,y1,flag,CELL_CHKNOPASS)
+#define path_search2(wpd,m,x0,y0,x1,y1,flag) path_search_real(wpd,m,x0,y0,x1,y1,flag,CELL_CHKWALL)
+
+int path_search_long_real(struct shootpath_data *spd,int m,int x0,int y0,int x1,int y1,cell_t flag);
+#define path_search_long(spd,m,x0,y0,x1,y1) path_search_long_real(spd,m,x0,y0,x1,y1,CELL_CHKWALL)
+
+int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
+
+// distance related functions [Skotlex]
+#define check_distance_bl(bl1, bl2, distance) check_distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y, distance)
+#define check_distance_blxy(bl, x1, y1, distance) check_distance((bl)->x-(x1), (bl)->y-(y1), distance)
+#define check_distance_xy(x0, y0, x1, y1, distance) check_distance((x0)-(x1), (y0)-(y1), distance)
+int check_distance(int dx, int dy, int distance);
+
+#define distance_bl(bl1, bl2) distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y)
+#define distance_blxy(bl, x1, y1) distance((bl)->x-(x1), (bl)->y-(y1))
+#define distance_xy(x0, y0, x1, y1) distance((x0)-(x1), (y0)-(y1))
+unsigned int distance(int dx, int dy);
+
+int cleanup_sub(struct block_list *bl, va_list ap);
+
+void map_helpscreen(int flag); // [Valaris]
+int map_delmap(char *mapname);
+
+int map_addmobtolist(unsigned short m, struct spawn_data *spawn); // [Wizputer]
+void map_spawnmobs(int); // [Wizputer]
+void map_removemobs(int); // [Wizputer]
+void do_reconnect_map(void); //Invoked on map-char reconnection [Skotlex]
+
+//Added for own save method
+int charsql_db_init(int method);
+
+extern char *INTER_CONF_NAME;
+extern char *LOG_CONF_NAME;
+extern char *MAP_CONF_NAME;
+extern char *BATTLE_CONF_FILENAME;
+extern char *ATCOMMAND_CONF_FILENAME;
+extern char *CHARCOMMAND_CONF_FILENAME;
+extern char *SCRIPT_CONF_NAME;
+extern char *MSG_CONF_NAME;
+extern char *GRF_PATH_FILENAME;
+
+
+extern int charsave_method; //needed ..
+extern char *map_server_dns;
+
+#ifndef TXT_ONLY
+
+// MySQL
+#ifdef __WIN32
+#include <my_global.h>
+#include <my_sys.h>
+#endif
+#include <mysql.h>
+
+extern char tmp_sql[65535];
+
+extern int db_use_sqldbs;
+extern MYSQL mmysql_handle;
+extern MYSQL_RES* sql_res ;
+extern MYSQL_ROW sql_row ;
+
+extern MYSQL charsql_handle;
+extern MYSQL_RES* charsql_res;
+extern MYSQL_ROW charsql_row;
+
+extern MYSQL logmysql_handle;
+extern MYSQL_RES* logsql_res ;
+extern MYSQL_ROW logsql_row ;
+
+extern int mail_server_enable;
+extern MYSQL mail_handle;
+extern MYSQL_RES* mail_res ;
+extern MYSQL_ROW mail_row ;
+
+extern char item_db_db[32];
+extern char item_db2_db[32];
+extern char mob_db_db[32];
+extern char mob_db2_db[32];
+extern char char_db[32];
+extern char mail_db[32];
+
+#endif /* not TXT_ONLY */
+//Useful typedefs from jA [Skotlex]
+typedef struct map_session_data TBL_PC;
+typedef struct npc_data TBL_NPC;
+typedef struct mob_data TBL_MOB;
+typedef struct flooritem_data TBL_ITEM;
+typedef struct chat_data TBL_CHAT;
+typedef struct skill_unit TBL_SKILL;
+typedef struct pet_data TBL_PET;
+typedef struct homun_data TBL_HOM;
+
+#define BL_CAST(type_, bl , dest) \
+ (((bl) == NULL || (bl)->type != type_) ? ((dest) = NULL, 0) : ((dest) = (T ## type_ *)(bl), 1))
+
+
+extern int lowest_gm_level;
+extern char main_chat_nick[16];
+
+#endif
diff --git a/src/map/mercenary.c b/src/map/mercenary.c
index f83d3673c..3ae9f8ffb 100644
--- a/src/map/mercenary.c
+++ b/src/map/mercenary.c
@@ -1,957 +1,957 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-#include <limits.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-
-#include "log.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "party.h"
-#include "guild.h"
-#include "atcommand.h"
-#include "script.h"
-#include "npc.h"
-#include "trade.h"
-#include "unit.h"
-
-#include "mercenary.h"
-#include "charsave.h"
-
-//Better equiprobability than rand()% [orn]
-#define rand(a, b) a+(int) ((float)(b-a+1)*rand()/(RAND_MAX+1.0))
-
-struct homunculus_db homunculus_db[MAX_HOMUNCULUS_CLASS]; //[orn]
-struct skill_tree_entry hskill_tree[MAX_HOMUNCULUS_CLASS][MAX_SKILL_TREE];
-
-static int merc_hom_hungry(int tid,unsigned int tick,int id,int data);
-
-static unsigned int hexptbl[MAX_LEVEL];
-
-void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp)
-{
- clif_hominfo(hd->master,hd,0);
-}
-
-int merc_hom_dead(struct homun_data *hd, struct block_list *src)
-{
- //There's no intimacy penalties on death (from Tharis)
- struct map_session_data *sd = hd->master;
-
- clif_emotion(&hd->bl, 16) ; //wah
-
- //Delete timers when dead.
- merc_hom_hungry_timer_delete(hd);
- hd->homunculus.hp = 0;
-
- if (!sd) //unit remove map will invoke unit free
- return 3;
-
- clif_hominfo(sd,hd,0); // Send dead flag
- clif_emotion(&sd->bl, 28) ; //sob
- //Remove from map (if it has no intimacy, it is auto-removed from memory)
- return 3;
-}
-
-//Vaporize a character's homun. If flag, HP needs to be 80% or above.
-int merc_hom_vaporize(struct map_session_data *sd, int flag)
-{
- struct homun_data *hd;
-
- nullpo_retr(0, sd);
-
- hd = sd->hd;
- if (!hd || hd->homunculus.vaporize)
- return 0;
-
- if (status_isdead(&hd->bl))
- return 0; //Can't vaporize a dead homun.
-
- if (flag && hd->battle_status.hp < (hd->battle_status.max_hp*80/100))
- return 0;
-
- hd->regen.state.block = 3; //Block regen while vaporized.
- //Delete timers when vaporized.
- merc_hom_hungry_timer_delete(hd);
- hd->homunculus.vaporize = 1;
- clif_hominfo(sd, sd->hd, 0);
- merc_save(hd);
- return unit_remove_map(&hd->bl, 0);
-}
-
-//delete a homunculus, completely "killing it".
-//Emote is the emotion the master should use, send negative to disable.
-int merc_hom_delete(struct homun_data *hd, int emote)
-{
- struct map_session_data *sd;
- nullpo_retr(0, hd);
- sd = hd->master;
-
- if (!sd)
- return unit_free(&hd->bl,1);
-
- if (emote >= 0)
- clif_emotion(&sd->bl, emote);
-
- //This makes it be deleted right away.
- hd->homunculus.intimacy = 0;
- // Send homunculus_dead to client
- hd->homunculus.hp = 0;
- clif_hominfo(sd, hd, 0);
- return unit_remove_map(&hd->bl,0);
-}
-
-int merc_hom_calc_skilltree(struct homun_data *hd)
-{
- int i,id=0 ;
- int j,f=1;
- int c=0;
-
- nullpo_retr(0, hd);
- c = hd->homunculus.class_ - HM_CLASS_BASE;
-
- for(i=0;i < MAX_SKILL_TREE && (id = hskill_tree[c][i].id) > 0;i++)
- {
- if(hd->homunculus.hskill[id-HM_SKILLBASE-1].id)
- continue; //Skill already known.
- if(!battle_config.skillfree)
- {
- for(j=0;j<5;j++)
- {
- if( hskill_tree[c][i].need[j].id &&
- merc_hom_checkskill(hd,hskill_tree[c][i].need[j].id) < hskill_tree[c][i].need[j].lv)
- {
- f=0;
- break;
- }
- }
- }
- if (f)
- hd->homunculus.hskill[id-HM_SKILLBASE-1].id = id ;
- }
- return 0;
-}
-
-int merc_hom_checkskill(struct homun_data *hd,int skill_id)
-{
- int i = skill_id - HM_SKILLBASE - 1;
- if(!hd)
- return 0;
-
- if(hd->homunculus.hskill[i].id == skill_id)
- return (hd->homunculus.hskill[i].lv);
-
- return 0;
-}
-
-int merc_skill_tree_get_max(int id, int b_class){
- int i, skillid;
- b_class -= HM_CLASS_BASE;
- for(i=0;(skillid=hskill_tree[b_class][i].id)>0;i++)
- if (id == skillid)
- return hskill_tree[b_class][i].max;
- return skill_get_max(id);
-}
-
-void merc_hom_skillup(struct homun_data *hd,int skillnum)
-{
- int i = 0 ;
- nullpo_retv(hd);
-
- if(!hd->homunculus.vaporize)
- {
- i = skillnum - HM_SKILLBASE - 1 ;
- if( hd->homunculus.skillpts > 0 &&
- hd->homunculus.hskill[i].id &&
- hd->homunculus.hskill[i].flag == 0 && //Don't allow raising while you have granted skills. [Skotlex]
- hd->homunculus.hskill[i].lv < merc_skill_tree_get_max(skillnum, hd->homunculus.class_)
- )
- {
- hd->homunculus.hskill[i].lv++ ;
- hd->homunculus.skillpts-- ;
- status_calc_homunculus(hd,0) ;
- if (hd->master) {
- clif_homskillup(hd->master, skillnum);
- clif_hominfo(hd->master,hd,0);
- clif_homskillinfoblock(hd->master);
- }
- }
- }
-}
-
-int merc_hom_levelup(struct homun_data *hd)
-{
- int growth_str, growth_agi, growth_vit, growth_int, growth_dex, growth_luk ;
- int growth_max_hp, growth_max_sp ;
- char output[256] ;
-
- if (hd->homunculus.level == MAX_LEVEL || !hd->exp_next || hd->homunculus.exp < hd->exp_next)
- return 0 ;
-
- hd->homunculus.level++ ;
- if (!(hd->homunculus.level % 3))
- hd->homunculus.skillpts++ ; //1 skillpoint each 3 base level
-
- hd->homunculus.exp -= hd->exp_next ;
- hd->exp_next = hexptbl[hd->homunculus.level - 1] ;
-
- if ( hd->homunculusDB->gmaxHP <= hd->homunculusDB->gminHP )
- growth_max_hp = hd->homunculusDB->gminHP ;
- else
- growth_max_hp = rand(hd->homunculusDB->gminHP, hd->homunculusDB->gmaxHP) ;
- if ( hd->homunculusDB->gmaxSP <= hd->homunculusDB->gminSP )
- growth_max_sp = hd->homunculusDB->gminSP ;
- else
- growth_max_sp = rand(hd->homunculusDB->gminSP, hd->homunculusDB->gmaxSP) ;
- if ( hd->homunculusDB->gmaxSTR <= hd->homunculusDB->gminSTR )
- growth_str = hd->homunculusDB->gminSTR ;
- else
- growth_str = rand(hd->homunculusDB->gminSTR, hd->homunculusDB->gmaxSTR) ;
- if ( hd->homunculusDB->gmaxAGI <= hd->homunculusDB->gminAGI )
- growth_agi = hd->homunculusDB->gminAGI ;
- else
- growth_agi = rand(hd->homunculusDB->gminAGI, hd->homunculusDB->gmaxAGI) ;
- if ( hd->homunculusDB->gmaxVIT <= hd->homunculusDB->gminVIT )
- growth_vit = hd->homunculusDB->gminVIT ;
- else
- growth_vit = rand(hd->homunculusDB->gminVIT, hd->homunculusDB->gmaxVIT) ;
- if ( hd->homunculusDB->gmaxDEX <= hd->homunculusDB->gminDEX )
- growth_dex = hd->homunculusDB->gminDEX ;
- else
- growth_dex = rand(hd->homunculusDB->gminDEX, hd->homunculusDB->gmaxDEX) ;
- if ( hd->homunculusDB->gmaxINT <= hd->homunculusDB->gminINT )
- growth_int = hd->homunculusDB->gminINT ;
- else
- growth_int = rand(hd->homunculusDB->gminINT, hd->homunculusDB->gmaxINT) ;
- if ( hd->homunculusDB->gmaxLUK <= hd->homunculusDB->gminLUK )
- growth_luk = hd->homunculusDB->gminLUK ;
- else
- growth_luk = rand(hd->homunculusDB->gminLUK, hd->homunculusDB->gmaxLUK) ;
-
- hd->homunculus.max_hp += growth_max_hp;
- hd->homunculus.max_sp += growth_max_sp;
- hd->homunculus.str += growth_str ;
- hd->homunculus.agi += growth_agi ;
- hd->homunculus.vit += growth_vit ;
- hd->homunculus.dex += growth_dex ;
- hd->homunculus.int_ += growth_int ;
- hd->homunculus.luk += growth_luk ;
-
- if ( battle_config.homunculus_show_growth ) {
- sprintf(output,
- "Growth : hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ", growth_max_hp, growth_max_sp, growth_str/(float)10, growth_agi/(float)10, growth_vit/(float)10, growth_int/(float)10, growth_dex/(float)10, growth_luk/(float)10 ) ;
- clif_disp_onlyself(hd->master,output,strlen(output));
- }
- return 1 ;
-}
-
-int merc_hom_change_class(struct homun_data *hd, short class_)
-{
- int i;
- i = search_homunculusDB_index(class_,HOMUNCULUS_CLASS);
- if(i < 0)
- return 0;
- hd->homunculusDB = &homunculus_db[i];
- hd->homunculus.class_ = class_;
- status_set_viewdata(&hd->bl, class_);
- merc_hom_calc_skilltree(hd);
- return 1;
-}
-
-int merc_hom_evolution(struct homun_data *hd)
-{
- struct map_session_data *sd;
- nullpo_retr(0, hd);
-
- if(!hd->homunculusDB->evo_class)
- {
- clif_emotion(&hd->bl, 4) ; //swt
- return 0 ;
- }
- sd = hd->master;
- if (!sd)
- return 0;
-
- merc_hom_vaporize(sd, 0);
-
- if (!merc_hom_change_class(hd, hd->homunculusDB->evo_class)) {
- ShowError("merc_hom_evolution: Can't evoluate homunc from %d to %d", hd->homunculus.class_, hd->homunculusDB->evo_class);
- return 0;
- }
- hd->homunculus.intimacy = 500;
- merc_call_homunculus(sd);
- clif_emotion(&sd->bl, 21); //no1
- clif_misceffect2(&hd->bl,568);
- return 1 ;
-}
-
-int merc_hom_gainexp(struct homun_data *hd,int exp)
-{
- if(hd->homunculus.vaporize)
- return 1;
-
- if( hd->exp_next == 0 ) {
- hd->homunculus.exp = 0 ;
- return 0;
- }
-
- hd->homunculus.exp += exp;
-
- if(hd->homunculus.exp < hd->exp_next) {
- clif_hominfo(hd->master,hd,0);
- return 0;
- }
-
- //levelup
- do
- {
- merc_hom_levelup(hd) ;
- }
- while(hd->homunculus.exp > hd->exp_next && hd->exp_next != 0 );
-
- if( hd->exp_next == 0 )
- hd->homunculus.exp = 0 ;
-
- clif_misceffect2(&hd->bl,568);
- status_calc_homunculus(hd,0);
- status_percent_heal(&hd->bl, 100, 100);
- return 0;
-}
-
-// Return the new value
-int merc_hom_increase_intimacy(struct homun_data * hd, unsigned int value)
-{
- if (battle_config.homunculus_friendly_rate != 100)
- value = (value * battle_config.homunculus_friendly_rate) / 100;
-
- if (hd->homunculus.intimacy + value <= 100000)
- hd->homunculus.intimacy += value;
- else
- hd->homunculus.intimacy = 100000;
- return hd->homunculus.intimacy;
-}
-
-// Return 0 if decrease fails or intimacy became 0 else the new value
-int merc_hom_decrease_intimacy(struct homun_data * hd, unsigned int value)
-{
- if (hd->homunculus.intimacy >= value)
- hd->homunculus.intimacy -= value;
- else
- hd->homunculus.intimacy = 0;
-
- return hd->homunculus.intimacy;
-}
-
-void merc_hom_heal(struct homun_data *hd,int hp,int sp)
-{
- clif_hominfo(hd->master,hd,0);
-}
-
-void merc_save(struct homun_data *hd)
-{
- // copy data that must be saved in homunculus struct ( hp / sp )
- TBL_PC * sd = hd->master;
- //Do not check for max_hp/max_sp caps as current could be higher to max due
- //to status changes/skills (they will be capped as needed upon stat
- //calculation on login)
- hd->homunculus.hp = hd->battle_status.hp;
- hd->homunculus.sp = hd->battle_status.sp;
- intif_homunculus_requestsave(sd->status.account_id, &hd->homunculus) ;
-}
-
-int merc_menu(struct map_session_data *sd,int menunum)
-{
- nullpo_retr(0, sd);
- if (sd->hd == NULL)
- return 1;
-
- switch(menunum) {
- case 0:
- break;
- case 1:
- merc_hom_food(sd, sd->hd);
- break;
- case 2:
- merc_hom_delete(sd->hd, -1);
- break;
- default:
- ShowError("merc_menu : unknown menu choice : %d\n", menunum) ;
- break;
- }
- return 0;
-}
-
-int merc_hom_food(struct map_session_data *sd, struct homun_data *hd)
-{
- int i, foodID, emotion;
-
- if(hd->homunculus.vaporize)
- return 1 ;
-
- foodID = hd->homunculusDB->foodID;
- i = pc_search_inventory(sd,foodID);
- if(i < 0) {
- clif_hom_food(sd,foodID,0);
- return 1;
- }
- pc_delitem(sd,i,1,0);
-
- if ( hd->homunculus.hunger >= 91 ) {
- merc_hom_decrease_intimacy(hd, 50);
- emotion = 16;
- } else if ( hd->homunculus.hunger >= 76 ) {
- merc_hom_decrease_intimacy(hd, 5);
- emotion = 19;
- } else if ( hd->homunculus.hunger >= 26 ) {
- merc_hom_increase_intimacy(hd, 75);
- emotion = 2;
- } else if ( hd->homunculus.hunger >= 11 ) {
- merc_hom_increase_intimacy(hd, 100);
- emotion = 2;
- } else {
- merc_hom_increase_intimacy(hd, 50);
- emotion = 2;
- }
-
- hd->homunculus.hunger += 10; //dunno increase value for each food
- if(hd->homunculus.hunger > 100)
- hd->homunculus.hunger = 100;
-
- clif_emotion(&hd->bl,emotion) ;
- clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger);
- clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100);
- clif_hom_food(sd,foodID,1);
-
- // Too much food :/
- if(hd->homunculus.intimacy == 0)
- return merc_hom_delete(sd->hd, 23); //omg
-
- return 0;
-}
-
-static int merc_hom_hungry(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- struct homun_data *hd;
-
- sd=map_id2sd(id);
- if(!sd)
- return 1;
-
- if(!sd->status.hom_id || !(hd=sd->hd))
- return 1;
-
- if(hd->hungry_timer != tid){
- if(battle_config.error_log)
- ShowError("merc_hom_hungry_timer %d != %d\n",hd->hungry_timer,tid);
- return 0;
- }
-
- hd->hungry_timer = -1;
-
- hd->homunculus.hunger-- ;
- if(hd->homunculus.hunger <= 10) {
- clif_emotion(&hd->bl, 6) ; //an
- } else if(hd->homunculus.hunger == 25) {
- clif_emotion(&hd->bl, 20) ; //hmm
- } else if(hd->homunculus.hunger == 75) {
- clif_emotion(&hd->bl, 33) ; //ok
- }
-
- if(hd->homunculus.hunger < 0) {
- hd->homunculus.hunger = 0;
- // Delete the homunculus if intimacy <= 100
- if ( !merc_hom_decrease_intimacy(hd, 100) )
- return merc_hom_delete(hd, 23); //omg
- clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100);
- }
-
- clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger);
- hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,merc_hom_hungry,sd->bl.id,0); //simple Fix albator
- return 0;
-}
-
-int merc_hom_hungry_timer_delete(struct homun_data *hd)
-{
- nullpo_retr(0, hd);
- if(hd->hungry_timer != -1) {
- delete_timer(hd->hungry_timer,merc_hom_hungry);
- hd->hungry_timer = -1;
- }
- return 1;
-}
-
-int search_homunculusDB_index(int key,int type)
-{
- int i;
-
- for(i=0;i<MAX_HOMUNCULUS_CLASS;i++) {
- if(homunculus_db[i].class_ <= 0)
- continue;
- switch(type) {
- case HOMUNCULUS_CLASS:
- if(homunculus_db[i].class_ == key)
- return i;
- break;
- case HOMUNCULUS_FOOD:
- if(homunculus_db[i].foodID == key)
- return i;
- break;
- default:
- return -1;
- }
- }
- return -1;
-}
-
-// Create homunc structure
-int merc_hom_alloc(struct map_session_data *sd, struct s_homunculus *hom)
-{
- struct homun_data *hd;
- int i = 0;
- short x,y;
-
- nullpo_retr(1, sd);
-
- Assert((sd->status.hom_id == 0 || sd->hd == 0) || sd->hd->master == sd);
-
- i = search_homunculusDB_index(hom->class_,HOMUNCULUS_CLASS);
- if(i < 0) {
- ShowError("merc_hom_alloc: unknown homunculus class [%d]", hom->class_);
- sd->status.hom_id = 0;
- intif_homunculus_requestdelete(hom->hom_id);
- return 1;
- }
- sd->hd = hd = aCalloc(1,sizeof(struct homun_data));
- hd->bl.subtype = MONS;
- hd->bl.type = BL_HOM;
- hd->bl.id = npc_get_new_npc_id();
-
- hd->master = sd;
- hd->homunculusDB = &homunculus_db[i];
- memcpy(&hd->homunculus, hom, sizeof(struct s_homunculus));
- hd->exp_next = hexptbl[hd->homunculus.level - 1];
-
- status_set_viewdata(&hd->bl, hd->homunculus.class_);
- status_change_init(&hd->bl);
- unit_dataset(&hd->bl);
- hd->ud.dir = sd->ud.dir;
-
- // Find a random valid pos around the player
- hd->bl.m = sd->bl.m;
- hd->bl.x = sd->bl.x;
- hd->bl.y = sd->bl.y;
- x = sd->bl.x + 1;
- y = sd->bl.y + 1;
- map_random_dir(&hd->bl, &x, &y);
- hd->bl.x = x;
- hd->bl.y = y;
-
- map_addiddb(&hd->bl);
- status_calc_homunculus(hd,1);
-
- hd->hungry_timer = -1;
- return 0;
-}
-
-void merc_hom_init_timers(struct homun_data * hd)
-{
- if (hd->hungry_timer == -1)
- hd->hungry_timer = add_timer(gettick()+hd->homunculusDB->hungryDelay,merc_hom_hungry,hd->master->bl.id,0);
- hd->regen.state.block = 0; //Restore HP/SP block.
-}
-
-int merc_call_homunculus(struct map_session_data *sd)
-{
- struct homun_data *hd;
-
- if (!sd->status.hom_id) //Create a new homun.
- return merc_create_homunculus_request(sd, HM_CLASS_BASE + rand(0, 7)) ;
-
- // If homunc not yet loaded, load it
- if (!sd->hd)
- return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id);
-
- hd = sd->hd;
-
- if (!hd->homunculus.vaporize)
- return 0; //Can't use this if homun wasn't vaporized.
-
- merc_hom_init_timers(hd);
- hd->homunculus.vaporize = 0;
- if (hd->bl.prev == NULL)
- { //Spawn him
- hd->bl.x = sd->bl.x;
- hd->bl.y = sd->bl.y;
- hd->bl.m = sd->bl.m;
- map_addblock(&hd->bl);
- clif_spawn(&hd->bl);
- clif_send_homdata(sd,SP_ACK,0);
- clif_hominfo(sd,hd,1);
- clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
- clif_homskillinfoblock(sd);
- merc_save(hd);
- } else
- //Warp him to master.
- unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,0);
- return 1;
-}
-
-// Recv homunculus data from char server
-int merc_hom_recv_data(int account_id, struct s_homunculus *sh, int flag)
-{
- struct map_session_data *sd;
- struct homun_data *hd;
-
- sd = map_id2sd(account_id);
- if(!sd)
- return 0;
- if (sd->status.char_id != sh->char_id)
- {
- if (sd->status.hom_id == sh->hom_id)
- sh->char_id = sd->status.char_id; //Correct char id.
- else
- return 0;
- }
- if(!flag) { // Failed to load
- sd->status.hom_id = 0;
- return 0;
- }
-
- if (!sd->status.hom_id) //Hom just created.
- sd->status.hom_id = sh->hom_id;
- if (sd->hd) //uh? Overwrite the data.
- memcpy(&sd->hd->homunculus, sh, sizeof(struct s_homunculus));
- else
- merc_hom_alloc(sd, sh);
-
- hd = sd->hd;
- if(hd->homunculus.hp && !hd->homunculus.vaporize &&
- hd->bl.prev == NULL && sd->bl.prev != NULL)
- {
- map_addblock(&hd->bl);
- clif_spawn(&hd->bl);
- clif_hominfo(sd,hd,1);
- clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
- clif_homskillinfoblock(sd);
- clif_hominfo(sd,hd,0);
- clif_send_homdata(sd,SP_ACK,0);
- merc_hom_init_timers(hd);
- }
- return 1;
-}
-
-// Ask homunculus creation to char server
-int merc_create_homunculus_request(struct map_session_data *sd, int class_)
-{
- struct s_homunculus homun;
- int i;
-
- nullpo_retr(1, sd);
-
- i = search_homunculusDB_index(class_,HOMUNCULUS_CLASS);
- if(i < 0) return 0;
-
- memset(&homun, 0, sizeof(struct s_homunculus));
- //Initial data
- strncpy(homun.name, homunculus_db[i].name, NAME_LENGTH-1);
- homun.class_ = class_;
- homun.level = 1;
-// FIXME: Commented value is what the map-server had as initial value,
-// Uncommented value is what the char-server was overwriting it with
-// So which one is correct?
-// homun.hunger = 50;
- homun.hunger = 32;
-// homun.intimacy = 500;
- homun.intimacy = 21;
- homun.char_id = sd->status.char_id;
-
- homun.hp = 10 ;
- homun.max_hp = homunculus_db[i].basemaxHP;
- homun.max_sp = homunculus_db[i].basemaxSP;
- homun.str = homunculus_db[i].baseSTR * 10;
- homun.agi = homunculus_db[i].baseAGI * 10;
- homun.vit = homunculus_db[i].baseVIT * 10;
- homun.int_ = homunculus_db[i].baseINT * 10;
- homun.dex = homunculus_db[i].baseDEX * 10;
- homun.luk = homunculus_db[i].baseLUK * 10;
-
- // Request homunculus creation
- intif_homunculus_create(sd->status.account_id, &homun);
- return 1;
-}
-
-int merc_resurrect_homunculus(struct map_session_data *sd, unsigned char per, short x, short y)
-{
- struct homun_data *hd;
- nullpo_retr(0, sd);
- if (!sd->status.hom_id)
- return 0;
-
- if (!sd->hd) //Load homun data;
- return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id);
-
- hd = sd->hd;
-
- if (hd->homunculus.vaporize)
- return 0;
-
- if (!status_isdead(&hd->bl))
- return 0;
-
- merc_hom_init_timers(hd);
-
- if (!hd->bl.prev)
- { //Add it back to the map.
- hd->bl.m = sd->bl.m;
- hd->bl.x = x;
- hd->bl.y = y;
- map_addblock(&hd->bl);
- clif_spawn(&hd->bl);
- }
- status_revive(&hd->bl, per, 0);
- return 1;
-}
-
-void merc_hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp)
-{
- struct map_session_data *sd = hd->master;
- hd->homunculus.hp = hd->battle_status.hp;
- if (!sd)
- return;
- clif_send_homdata(sd,SP_ACK,0);
- clif_hominfo(sd,hd,1);
- clif_hominfo(sd,hd,0);
- clif_homskillinfoblock(sd);
-}
-
-int read_homunculusdb(void)
-{
- FILE *fp;
- char line[1024], *p;
- int i, k, classid;
- int j = 0;
- char *filename[]={"homunculus_db.txt","homunculus_db2.txt"};
- char *str[36];
-
- malloc_set(homunculus_db,0,sizeof(homunculus_db));
- for(i = 0; i<2; i++)
- {
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp = fopen(line,"r");
- if(!fp){
- if(i != 0)
- continue;
- ShowError("read_homunculusdb : can't read %s\n", line);
- return -1;
- }
-
- while(fgets(line,sizeof(line)-1,fp) && j < MAX_HOMUNCULUS_CLASS)
- {
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- k = 0;
- p = strtok (line,",");
- while (p != NULL && k < 36)
- {
- str[k++] = p;
- p = strtok (NULL, ",");
- }
-
- classid = atoi(str[0]);
- if (k != 36 || classid < HM_CLASS_BASE || classid > HM_CLASS_MAX)
- {
- ShowError("read_homunculusdb : Error reading %s", filename[i]);
- continue;
- }
-
- //Class,Homunculus,HP,SP,ATK,MATK,HIT,CRI,DEF,MDEF,FLEE,ASPD,STR,AGI,VIT,INT,DEX,LUK
- homunculus_db[j].class_ = classid;
- strncpy(homunculus_db[j].name,str[1],NAME_LENGTH-1);
- homunculus_db[j].basemaxHP = atoi(str[2]);
- homunculus_db[j].basemaxSP = atoi(str[3]);
- homunculus_db[j].baseSTR = atoi(str[4]);
- homunculus_db[j].baseAGI = atoi(str[5]);
- homunculus_db[j].baseVIT = atoi(str[6]);
- homunculus_db[j].baseINT = atoi(str[7]);
- homunculus_db[j].baseDEX = atoi(str[8]);
- homunculus_db[j].baseLUK = atoi(str[9]);
- homunculus_db[j].baseIntimacy = atoi(str[10]);
- homunculus_db[j].baseHungry = atoi(str[11]);
- homunculus_db[j].hungryDelay = atoi(str[12]);
- homunculus_db[j].foodID = atoi(str[13]);
- homunculus_db[j].gminHP = atoi(str[14]);
- homunculus_db[j].gmaxHP = atoi(str[15]);
- homunculus_db[j].gminSP = atoi(str[16]);
- homunculus_db[j].gmaxSP = atoi(str[17]);
- homunculus_db[j].gminSTR = atoi(str[18]);
- homunculus_db[j].gmaxSTR = atoi(str[19]);
- homunculus_db[j].gminAGI = atoi(str[20]);
- homunculus_db[j].gmaxAGI = atoi(str[21]);
- homunculus_db[j].gminVIT = atoi(str[22]);
- homunculus_db[j].gmaxVIT = atoi(str[23]);
- homunculus_db[j].gminINT = atoi(str[24]);
- homunculus_db[j].gmaxINT = atoi(str[25]);
- homunculus_db[j].gminDEX = atoi(str[26]);
- homunculus_db[j].gmaxDEX = atoi(str[27]);
- homunculus_db[j].gminLUK = atoi(str[28]);
- homunculus_db[j].gmaxLUK = atoi(str[29]);
- homunculus_db[j].evo_class = atoi(str[30]);
- homunculus_db[j].baseASPD = atoi(str[31]);
- homunculus_db[j].size = atoi(str[32]);
- homunculus_db[j].race = atoi(str[33]);
- homunculus_db[j].element = atoi(str[34]);
- homunculus_db[j].accessID = atoi(str[35]);
- j++;
- }
- if (j > MAX_HOMUNCULUS_CLASS)
- ShowWarning("read_homunculusdb: Reached max number of homunculus [%d]. Remaining homunculus were not read.\n ", MAX_HOMUNCULUS_CLASS);
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' homunculus in '"CL_WHITE"db/%s"CL_RESET"'.\n",j,filename[i]);
- }
- return 0;
-}
-
-int read_homunculus_skilldb(void)
-{
- FILE *fp;
- char line[1024], *p;
- int k, classid;
- int j = 0;
- char *split[15];
-
- malloc_tsetdword(hskill_tree,0,sizeof(hskill_tree));
- sprintf(line, "%s/homun_skill_tree.txt", db_path);
- fp=fopen(line,"r");
- if(fp==NULL){
- ShowError("can't read %s\n", line);
- return 1;
- }
-
- while(fgets(line, sizeof(line)-1, fp))
- {
- int minJobLevelPresent = 0;
-
- if(line[0]=='/' && line[1]=='/')
- continue;
-
- k = 0;
- p = strtok(line,",");
- while (p != NULL && k < 15)
- {
- split[k++] = p;
- p = strtok(NULL, ",");
- }
-
- if(k < 13)
- continue;
-
- if (k == 14)
- minJobLevelPresent = 1; // MinJobLvl has been added
-
- // check for bounds [celest]
- classid = atoi(split[0]) - HM_CLASS_BASE;
- if ( classid >= MAX_HOMUNCULUS_CLASS )
- continue;
-
- k = atoi(split[1]); //This is to avoid adding two lines for the same skill. [Skotlex]
- // Search an empty line or a line with the same skill_id (stored in j)
- for(j = 0; j < MAX_SKILL_TREE && hskill_tree[classid][j].id && hskill_tree[classid][j].id != k; j++);
-
- if (j == MAX_SKILL_TREE)
- {
- ShowWarning("Unable to load skill %d into homunculus %d's tree. Maximum number of skills per class has been reached.\n", k, classid);
- continue;
- }
-
- hskill_tree[classid][j].id=k;
- hskill_tree[classid][j].max=atoi(split[2]);
- if (minJobLevelPresent)
- hskill_tree[classid][j].joblv=atoi(split[3]);
-
- for(k=0;k<5;k++){
- hskill_tree[classid][j].need[k].id=atoi(split[3+k*2+minJobLevelPresent]);
- hskill_tree[classid][j].need[k].lv=atoi(split[3+k*2+minJobLevelPresent+1]);
- }
- }
-
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","homun_skill_tree.txt");
- return 0;
-}
-
-void read_homunculus_expdb(void)
-{
- FILE *fp;
- char line[1024];
- int i, j=0;
- char *filename[]={"exp_homun.txt","exp_homun2.txt"};
-
- malloc_tsetdword(hexptbl,0,sizeof(hexptbl));
- for(i=0; i<2; i++){
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp=fopen(line,"r");
- if(fp == NULL){
- if(i != 0)
- continue;
- ShowError("can't read %s\n",line);
- return;
- }
- while(fgets(line,sizeof(line)-1,fp) && j < MAX_LEVEL)
- {
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- hexptbl[j] = strtoul(line, NULL, 10);
- if (!hexptbl[j++])
- break;
- }
- if (hexptbl[MAX_LEVEL - 1]) // Last permitted level have to be 0!
- {
- ShowWarning("read_hexptbl: Reached max level in exp_homun [%d]. Remaining lines were not read.\n ", MAX_LEVEL);
- hexptbl[MAX_LEVEL - 1] = 0;
- }
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' levels in '"CL_WHITE"%s"CL_RESET"'.\n", j, filename[i]);
- }
-}
-
-void merc_reload(void)
-{
- read_homunculusdb();
- read_homunculus_expdb();
-}
-
-void merc_skill_reload(void)
-{
- read_homunculus_skilldb();
-}
-
-int do_init_merc(void)
-{
- read_homunculusdb();
- read_homunculus_expdb();
- read_homunculus_skilldb();
- // Add homunc timer function to timer func list [Toms]
- add_timer_func_list(merc_hom_hungry, "merc_hom_hungry");
- return 0;
-}
-
-int do_final_merc(void);
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+
+#include "log.h"
+#include "clif.h"
+#include "chrif.h"
+#include "intif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "pc.h"
+#include "status.h"
+#include "skill.h"
+#include "mob.h"
+#include "pet.h"
+#include "battle.h"
+#include "party.h"
+#include "guild.h"
+#include "atcommand.h"
+#include "script.h"
+#include "npc.h"
+#include "trade.h"
+#include "unit.h"
+
+#include "mercenary.h"
+#include "charsave.h"
+
+//Better equiprobability than rand()% [orn]
+#define rand(a, b) a+(int) ((float)(b-a+1)*rand()/(RAND_MAX+1.0))
+
+struct homunculus_db homunculus_db[MAX_HOMUNCULUS_CLASS]; //[orn]
+struct skill_tree_entry hskill_tree[MAX_HOMUNCULUS_CLASS][MAX_SKILL_TREE];
+
+static int merc_hom_hungry(int tid,unsigned int tick,int id,int data);
+
+static unsigned int hexptbl[MAX_LEVEL];
+
+void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp)
+{
+ clif_hominfo(hd->master,hd,0);
+}
+
+int merc_hom_dead(struct homun_data *hd, struct block_list *src)
+{
+ //There's no intimacy penalties on death (from Tharis)
+ struct map_session_data *sd = hd->master;
+
+ clif_emotion(&hd->bl, 16) ; //wah
+
+ //Delete timers when dead.
+ merc_hom_hungry_timer_delete(hd);
+ hd->homunculus.hp = 0;
+
+ if (!sd) //unit remove map will invoke unit free
+ return 3;
+
+ clif_hominfo(sd,hd,0); // Send dead flag
+ clif_emotion(&sd->bl, 28) ; //sob
+ //Remove from map (if it has no intimacy, it is auto-removed from memory)
+ return 3;
+}
+
+//Vaporize a character's homun. If flag, HP needs to be 80% or above.
+int merc_hom_vaporize(struct map_session_data *sd, int flag)
+{
+ struct homun_data *hd;
+
+ nullpo_retr(0, sd);
+
+ hd = sd->hd;
+ if (!hd || hd->homunculus.vaporize)
+ return 0;
+
+ if (status_isdead(&hd->bl))
+ return 0; //Can't vaporize a dead homun.
+
+ if (flag && hd->battle_status.hp < (hd->battle_status.max_hp*80/100))
+ return 0;
+
+ hd->regen.state.block = 3; //Block regen while vaporized.
+ //Delete timers when vaporized.
+ merc_hom_hungry_timer_delete(hd);
+ hd->homunculus.vaporize = 1;
+ clif_hominfo(sd, sd->hd, 0);
+ merc_save(hd);
+ return unit_remove_map(&hd->bl, 0);
+}
+
+//delete a homunculus, completely "killing it".
+//Emote is the emotion the master should use, send negative to disable.
+int merc_hom_delete(struct homun_data *hd, int emote)
+{
+ struct map_session_data *sd;
+ nullpo_retr(0, hd);
+ sd = hd->master;
+
+ if (!sd)
+ return unit_free(&hd->bl,1);
+
+ if (emote >= 0)
+ clif_emotion(&sd->bl, emote);
+
+ //This makes it be deleted right away.
+ hd->homunculus.intimacy = 0;
+ // Send homunculus_dead to client
+ hd->homunculus.hp = 0;
+ clif_hominfo(sd, hd, 0);
+ return unit_remove_map(&hd->bl,0);
+}
+
+int merc_hom_calc_skilltree(struct homun_data *hd)
+{
+ int i,id=0 ;
+ int j,f=1;
+ int c=0;
+
+ nullpo_retr(0, hd);
+ c = hd->homunculus.class_ - HM_CLASS_BASE;
+
+ for(i=0;i < MAX_SKILL_TREE && (id = hskill_tree[c][i].id) > 0;i++)
+ {
+ if(hd->homunculus.hskill[id-HM_SKILLBASE-1].id)
+ continue; //Skill already known.
+ if(!battle_config.skillfree)
+ {
+ for(j=0;j<5;j++)
+ {
+ if( hskill_tree[c][i].need[j].id &&
+ merc_hom_checkskill(hd,hskill_tree[c][i].need[j].id) < hskill_tree[c][i].need[j].lv)
+ {
+ f=0;
+ break;
+ }
+ }
+ }
+ if (f)
+ hd->homunculus.hskill[id-HM_SKILLBASE-1].id = id ;
+ }
+ return 0;
+}
+
+int merc_hom_checkskill(struct homun_data *hd,int skill_id)
+{
+ int i = skill_id - HM_SKILLBASE - 1;
+ if(!hd)
+ return 0;
+
+ if(hd->homunculus.hskill[i].id == skill_id)
+ return (hd->homunculus.hskill[i].lv);
+
+ return 0;
+}
+
+int merc_skill_tree_get_max(int id, int b_class){
+ int i, skillid;
+ b_class -= HM_CLASS_BASE;
+ for(i=0;(skillid=hskill_tree[b_class][i].id)>0;i++)
+ if (id == skillid)
+ return hskill_tree[b_class][i].max;
+ return skill_get_max(id);
+}
+
+void merc_hom_skillup(struct homun_data *hd,int skillnum)
+{
+ int i = 0 ;
+ nullpo_retv(hd);
+
+ if(!hd->homunculus.vaporize)
+ {
+ i = skillnum - HM_SKILLBASE - 1 ;
+ if( hd->homunculus.skillpts > 0 &&
+ hd->homunculus.hskill[i].id &&
+ hd->homunculus.hskill[i].flag == 0 && //Don't allow raising while you have granted skills. [Skotlex]
+ hd->homunculus.hskill[i].lv < merc_skill_tree_get_max(skillnum, hd->homunculus.class_)
+ )
+ {
+ hd->homunculus.hskill[i].lv++ ;
+ hd->homunculus.skillpts-- ;
+ status_calc_homunculus(hd,0) ;
+ if (hd->master) {
+ clif_homskillup(hd->master, skillnum);
+ clif_hominfo(hd->master,hd,0);
+ clif_homskillinfoblock(hd->master);
+ }
+ }
+ }
+}
+
+int merc_hom_levelup(struct homun_data *hd)
+{
+ int growth_str, growth_agi, growth_vit, growth_int, growth_dex, growth_luk ;
+ int growth_max_hp, growth_max_sp ;
+ char output[256] ;
+
+ if (hd->homunculus.level == MAX_LEVEL || !hd->exp_next || hd->homunculus.exp < hd->exp_next)
+ return 0 ;
+
+ hd->homunculus.level++ ;
+ if (!(hd->homunculus.level % 3))
+ hd->homunculus.skillpts++ ; //1 skillpoint each 3 base level
+
+ hd->homunculus.exp -= hd->exp_next ;
+ hd->exp_next = hexptbl[hd->homunculus.level - 1] ;
+
+ if ( hd->homunculusDB->gmaxHP <= hd->homunculusDB->gminHP )
+ growth_max_hp = hd->homunculusDB->gminHP ;
+ else
+ growth_max_hp = rand(hd->homunculusDB->gminHP, hd->homunculusDB->gmaxHP) ;
+ if ( hd->homunculusDB->gmaxSP <= hd->homunculusDB->gminSP )
+ growth_max_sp = hd->homunculusDB->gminSP ;
+ else
+ growth_max_sp = rand(hd->homunculusDB->gminSP, hd->homunculusDB->gmaxSP) ;
+ if ( hd->homunculusDB->gmaxSTR <= hd->homunculusDB->gminSTR )
+ growth_str = hd->homunculusDB->gminSTR ;
+ else
+ growth_str = rand(hd->homunculusDB->gminSTR, hd->homunculusDB->gmaxSTR) ;
+ if ( hd->homunculusDB->gmaxAGI <= hd->homunculusDB->gminAGI )
+ growth_agi = hd->homunculusDB->gminAGI ;
+ else
+ growth_agi = rand(hd->homunculusDB->gminAGI, hd->homunculusDB->gmaxAGI) ;
+ if ( hd->homunculusDB->gmaxVIT <= hd->homunculusDB->gminVIT )
+ growth_vit = hd->homunculusDB->gminVIT ;
+ else
+ growth_vit = rand(hd->homunculusDB->gminVIT, hd->homunculusDB->gmaxVIT) ;
+ if ( hd->homunculusDB->gmaxDEX <= hd->homunculusDB->gminDEX )
+ growth_dex = hd->homunculusDB->gminDEX ;
+ else
+ growth_dex = rand(hd->homunculusDB->gminDEX, hd->homunculusDB->gmaxDEX) ;
+ if ( hd->homunculusDB->gmaxINT <= hd->homunculusDB->gminINT )
+ growth_int = hd->homunculusDB->gminINT ;
+ else
+ growth_int = rand(hd->homunculusDB->gminINT, hd->homunculusDB->gmaxINT) ;
+ if ( hd->homunculusDB->gmaxLUK <= hd->homunculusDB->gminLUK )
+ growth_luk = hd->homunculusDB->gminLUK ;
+ else
+ growth_luk = rand(hd->homunculusDB->gminLUK, hd->homunculusDB->gmaxLUK) ;
+
+ hd->homunculus.max_hp += growth_max_hp;
+ hd->homunculus.max_sp += growth_max_sp;
+ hd->homunculus.str += growth_str ;
+ hd->homunculus.agi += growth_agi ;
+ hd->homunculus.vit += growth_vit ;
+ hd->homunculus.dex += growth_dex ;
+ hd->homunculus.int_ += growth_int ;
+ hd->homunculus.luk += growth_luk ;
+
+ if ( battle_config.homunculus_show_growth ) {
+ sprintf(output,
+ "Growth : hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ", growth_max_hp, growth_max_sp, growth_str/(float)10, growth_agi/(float)10, growth_vit/(float)10, growth_int/(float)10, growth_dex/(float)10, growth_luk/(float)10 ) ;
+ clif_disp_onlyself(hd->master,output,strlen(output));
+ }
+ return 1 ;
+}
+
+int merc_hom_change_class(struct homun_data *hd, short class_)
+{
+ int i;
+ i = search_homunculusDB_index(class_,HOMUNCULUS_CLASS);
+ if(i < 0)
+ return 0;
+ hd->homunculusDB = &homunculus_db[i];
+ hd->homunculus.class_ = class_;
+ status_set_viewdata(&hd->bl, class_);
+ merc_hom_calc_skilltree(hd);
+ return 1;
+}
+
+int merc_hom_evolution(struct homun_data *hd)
+{
+ struct map_session_data *sd;
+ nullpo_retr(0, hd);
+
+ if(!hd->homunculusDB->evo_class)
+ {
+ clif_emotion(&hd->bl, 4) ; //swt
+ return 0 ;
+ }
+ sd = hd->master;
+ if (!sd)
+ return 0;
+
+ merc_hom_vaporize(sd, 0);
+
+ if (!merc_hom_change_class(hd, hd->homunculusDB->evo_class)) {
+ ShowError("merc_hom_evolution: Can't evoluate homunc from %d to %d", hd->homunculus.class_, hd->homunculusDB->evo_class);
+ return 0;
+ }
+ hd->homunculus.intimacy = 500;
+ merc_call_homunculus(sd);
+ clif_emotion(&sd->bl, 21); //no1
+ clif_misceffect2(&hd->bl,568);
+ return 1 ;
+}
+
+int merc_hom_gainexp(struct homun_data *hd,int exp)
+{
+ if(hd->homunculus.vaporize)
+ return 1;
+
+ if( hd->exp_next == 0 ) {
+ hd->homunculus.exp = 0 ;
+ return 0;
+ }
+
+ hd->homunculus.exp += exp;
+
+ if(hd->homunculus.exp < hd->exp_next) {
+ clif_hominfo(hd->master,hd,0);
+ return 0;
+ }
+
+ //levelup
+ do
+ {
+ merc_hom_levelup(hd) ;
+ }
+ while(hd->homunculus.exp > hd->exp_next && hd->exp_next != 0 );
+
+ if( hd->exp_next == 0 )
+ hd->homunculus.exp = 0 ;
+
+ clif_misceffect2(&hd->bl,568);
+ status_calc_homunculus(hd,0);
+ status_percent_heal(&hd->bl, 100, 100);
+ return 0;
+}
+
+// Return the new value
+int merc_hom_increase_intimacy(struct homun_data * hd, unsigned int value)
+{
+ if (battle_config.homunculus_friendly_rate != 100)
+ value = (value * battle_config.homunculus_friendly_rate) / 100;
+
+ if (hd->homunculus.intimacy + value <= 100000)
+ hd->homunculus.intimacy += value;
+ else
+ hd->homunculus.intimacy = 100000;
+ return hd->homunculus.intimacy;
+}
+
+// Return 0 if decrease fails or intimacy became 0 else the new value
+int merc_hom_decrease_intimacy(struct homun_data * hd, unsigned int value)
+{
+ if (hd->homunculus.intimacy >= value)
+ hd->homunculus.intimacy -= value;
+ else
+ hd->homunculus.intimacy = 0;
+
+ return hd->homunculus.intimacy;
+}
+
+void merc_hom_heal(struct homun_data *hd,int hp,int sp)
+{
+ clif_hominfo(hd->master,hd,0);
+}
+
+void merc_save(struct homun_data *hd)
+{
+ // copy data that must be saved in homunculus struct ( hp / sp )
+ TBL_PC * sd = hd->master;
+ //Do not check for max_hp/max_sp caps as current could be higher to max due
+ //to status changes/skills (they will be capped as needed upon stat
+ //calculation on login)
+ hd->homunculus.hp = hd->battle_status.hp;
+ hd->homunculus.sp = hd->battle_status.sp;
+ intif_homunculus_requestsave(sd->status.account_id, &hd->homunculus) ;
+}
+
+int merc_menu(struct map_session_data *sd,int menunum)
+{
+ nullpo_retr(0, sd);
+ if (sd->hd == NULL)
+ return 1;
+
+ switch(menunum) {
+ case 0:
+ break;
+ case 1:
+ merc_hom_food(sd, sd->hd);
+ break;
+ case 2:
+ merc_hom_delete(sd->hd, -1);
+ break;
+ default:
+ ShowError("merc_menu : unknown menu choice : %d\n", menunum) ;
+ break;
+ }
+ return 0;
+}
+
+int merc_hom_food(struct map_session_data *sd, struct homun_data *hd)
+{
+ int i, foodID, emotion;
+
+ if(hd->homunculus.vaporize)
+ return 1 ;
+
+ foodID = hd->homunculusDB->foodID;
+ i = pc_search_inventory(sd,foodID);
+ if(i < 0) {
+ clif_hom_food(sd,foodID,0);
+ return 1;
+ }
+ pc_delitem(sd,i,1,0);
+
+ if ( hd->homunculus.hunger >= 91 ) {
+ merc_hom_decrease_intimacy(hd, 50);
+ emotion = 16;
+ } else if ( hd->homunculus.hunger >= 76 ) {
+ merc_hom_decrease_intimacy(hd, 5);
+ emotion = 19;
+ } else if ( hd->homunculus.hunger >= 26 ) {
+ merc_hom_increase_intimacy(hd, 75);
+ emotion = 2;
+ } else if ( hd->homunculus.hunger >= 11 ) {
+ merc_hom_increase_intimacy(hd, 100);
+ emotion = 2;
+ } else {
+ merc_hom_increase_intimacy(hd, 50);
+ emotion = 2;
+ }
+
+ hd->homunculus.hunger += 10; //dunno increase value for each food
+ if(hd->homunculus.hunger > 100)
+ hd->homunculus.hunger = 100;
+
+ clif_emotion(&hd->bl,emotion) ;
+ clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger);
+ clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100);
+ clif_hom_food(sd,foodID,1);
+
+ // Too much food :/
+ if(hd->homunculus.intimacy == 0)
+ return merc_hom_delete(sd->hd, 23); //omg
+
+ return 0;
+}
+
+static int merc_hom_hungry(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd;
+ struct homun_data *hd;
+
+ sd=map_id2sd(id);
+ if(!sd)
+ return 1;
+
+ if(!sd->status.hom_id || !(hd=sd->hd))
+ return 1;
+
+ if(hd->hungry_timer != tid){
+ if(battle_config.error_log)
+ ShowError("merc_hom_hungry_timer %d != %d\n",hd->hungry_timer,tid);
+ return 0;
+ }
+
+ hd->hungry_timer = -1;
+
+ hd->homunculus.hunger-- ;
+ if(hd->homunculus.hunger <= 10) {
+ clif_emotion(&hd->bl, 6) ; //an
+ } else if(hd->homunculus.hunger == 25) {
+ clif_emotion(&hd->bl, 20) ; //hmm
+ } else if(hd->homunculus.hunger == 75) {
+ clif_emotion(&hd->bl, 33) ; //ok
+ }
+
+ if(hd->homunculus.hunger < 0) {
+ hd->homunculus.hunger = 0;
+ // Delete the homunculus if intimacy <= 100
+ if ( !merc_hom_decrease_intimacy(hd, 100) )
+ return merc_hom_delete(hd, 23); //omg
+ clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100);
+ }
+
+ clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger);
+ hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,merc_hom_hungry,sd->bl.id,0); //simple Fix albator
+ return 0;
+}
+
+int merc_hom_hungry_timer_delete(struct homun_data *hd)
+{
+ nullpo_retr(0, hd);
+ if(hd->hungry_timer != -1) {
+ delete_timer(hd->hungry_timer,merc_hom_hungry);
+ hd->hungry_timer = -1;
+ }
+ return 1;
+}
+
+int search_homunculusDB_index(int key,int type)
+{
+ int i;
+
+ for(i=0;i<MAX_HOMUNCULUS_CLASS;i++) {
+ if(homunculus_db[i].class_ <= 0)
+ continue;
+ switch(type) {
+ case HOMUNCULUS_CLASS:
+ if(homunculus_db[i].class_ == key)
+ return i;
+ break;
+ case HOMUNCULUS_FOOD:
+ if(homunculus_db[i].foodID == key)
+ return i;
+ break;
+ default:
+ return -1;
+ }
+ }
+ return -1;
+}
+
+// Create homunc structure
+int merc_hom_alloc(struct map_session_data *sd, struct s_homunculus *hom)
+{
+ struct homun_data *hd;
+ int i = 0;
+ short x,y;
+
+ nullpo_retr(1, sd);
+
+ Assert((sd->status.hom_id == 0 || sd->hd == 0) || sd->hd->master == sd);
+
+ i = search_homunculusDB_index(hom->class_,HOMUNCULUS_CLASS);
+ if(i < 0) {
+ ShowError("merc_hom_alloc: unknown homunculus class [%d]", hom->class_);
+ sd->status.hom_id = 0;
+ intif_homunculus_requestdelete(hom->hom_id);
+ return 1;
+ }
+ sd->hd = hd = aCalloc(1,sizeof(struct homun_data));
+ hd->bl.subtype = MONS;
+ hd->bl.type = BL_HOM;
+ hd->bl.id = npc_get_new_npc_id();
+
+ hd->master = sd;
+ hd->homunculusDB = &homunculus_db[i];
+ memcpy(&hd->homunculus, hom, sizeof(struct s_homunculus));
+ hd->exp_next = hexptbl[hd->homunculus.level - 1];
+
+ status_set_viewdata(&hd->bl, hd->homunculus.class_);
+ status_change_init(&hd->bl);
+ unit_dataset(&hd->bl);
+ hd->ud.dir = sd->ud.dir;
+
+ // Find a random valid pos around the player
+ hd->bl.m = sd->bl.m;
+ hd->bl.x = sd->bl.x;
+ hd->bl.y = sd->bl.y;
+ x = sd->bl.x + 1;
+ y = sd->bl.y + 1;
+ map_random_dir(&hd->bl, &x, &y);
+ hd->bl.x = x;
+ hd->bl.y = y;
+
+ map_addiddb(&hd->bl);
+ status_calc_homunculus(hd,1);
+
+ hd->hungry_timer = -1;
+ return 0;
+}
+
+void merc_hom_init_timers(struct homun_data * hd)
+{
+ if (hd->hungry_timer == -1)
+ hd->hungry_timer = add_timer(gettick()+hd->homunculusDB->hungryDelay,merc_hom_hungry,hd->master->bl.id,0);
+ hd->regen.state.block = 0; //Restore HP/SP block.
+}
+
+int merc_call_homunculus(struct map_session_data *sd)
+{
+ struct homun_data *hd;
+
+ if (!sd->status.hom_id) //Create a new homun.
+ return merc_create_homunculus_request(sd, HM_CLASS_BASE + rand(0, 7)) ;
+
+ // If homunc not yet loaded, load it
+ if (!sd->hd)
+ return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id);
+
+ hd = sd->hd;
+
+ if (!hd->homunculus.vaporize)
+ return 0; //Can't use this if homun wasn't vaporized.
+
+ merc_hom_init_timers(hd);
+ hd->homunculus.vaporize = 0;
+ if (hd->bl.prev == NULL)
+ { //Spawn him
+ hd->bl.x = sd->bl.x;
+ hd->bl.y = sd->bl.y;
+ hd->bl.m = sd->bl.m;
+ map_addblock(&hd->bl);
+ clif_spawn(&hd->bl);
+ clif_send_homdata(sd,SP_ACK,0);
+ clif_hominfo(sd,hd,1);
+ clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
+ clif_homskillinfoblock(sd);
+ merc_save(hd);
+ } else
+ //Warp him to master.
+ unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,0);
+ return 1;
+}
+
+// Recv homunculus data from char server
+int merc_hom_recv_data(int account_id, struct s_homunculus *sh, int flag)
+{
+ struct map_session_data *sd;
+ struct homun_data *hd;
+
+ sd = map_id2sd(account_id);
+ if(!sd)
+ return 0;
+ if (sd->status.char_id != sh->char_id)
+ {
+ if (sd->status.hom_id == sh->hom_id)
+ sh->char_id = sd->status.char_id; //Correct char id.
+ else
+ return 0;
+ }
+ if(!flag) { // Failed to load
+ sd->status.hom_id = 0;
+ return 0;
+ }
+
+ if (!sd->status.hom_id) //Hom just created.
+ sd->status.hom_id = sh->hom_id;
+ if (sd->hd) //uh? Overwrite the data.
+ memcpy(&sd->hd->homunculus, sh, sizeof(struct s_homunculus));
+ else
+ merc_hom_alloc(sd, sh);
+
+ hd = sd->hd;
+ if(hd->homunculus.hp && !hd->homunculus.vaporize &&
+ hd->bl.prev == NULL && sd->bl.prev != NULL)
+ {
+ map_addblock(&hd->bl);
+ clif_spawn(&hd->bl);
+ clif_hominfo(sd,hd,1);
+ clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
+ clif_homskillinfoblock(sd);
+ clif_hominfo(sd,hd,0);
+ clif_send_homdata(sd,SP_ACK,0);
+ merc_hom_init_timers(hd);
+ }
+ return 1;
+}
+
+// Ask homunculus creation to char server
+int merc_create_homunculus_request(struct map_session_data *sd, int class_)
+{
+ struct s_homunculus homun;
+ int i;
+
+ nullpo_retr(1, sd);
+
+ i = search_homunculusDB_index(class_,HOMUNCULUS_CLASS);
+ if(i < 0) return 0;
+
+ memset(&homun, 0, sizeof(struct s_homunculus));
+ //Initial data
+ strncpy(homun.name, homunculus_db[i].name, NAME_LENGTH-1);
+ homun.class_ = class_;
+ homun.level = 1;
+// FIXME: Commented value is what the map-server had as initial value,
+// Uncommented value is what the char-server was overwriting it with
+// So which one is correct?
+// homun.hunger = 50;
+ homun.hunger = 32;
+// homun.intimacy = 500;
+ homun.intimacy = 21;
+ homun.char_id = sd->status.char_id;
+
+ homun.hp = 10 ;
+ homun.max_hp = homunculus_db[i].basemaxHP;
+ homun.max_sp = homunculus_db[i].basemaxSP;
+ homun.str = homunculus_db[i].baseSTR * 10;
+ homun.agi = homunculus_db[i].baseAGI * 10;
+ homun.vit = homunculus_db[i].baseVIT * 10;
+ homun.int_ = homunculus_db[i].baseINT * 10;
+ homun.dex = homunculus_db[i].baseDEX * 10;
+ homun.luk = homunculus_db[i].baseLUK * 10;
+
+ // Request homunculus creation
+ intif_homunculus_create(sd->status.account_id, &homun);
+ return 1;
+}
+
+int merc_resurrect_homunculus(struct map_session_data *sd, unsigned char per, short x, short y)
+{
+ struct homun_data *hd;
+ nullpo_retr(0, sd);
+ if (!sd->status.hom_id)
+ return 0;
+
+ if (!sd->hd) //Load homun data;
+ return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id);
+
+ hd = sd->hd;
+
+ if (hd->homunculus.vaporize)
+ return 0;
+
+ if (!status_isdead(&hd->bl))
+ return 0;
+
+ merc_hom_init_timers(hd);
+
+ if (!hd->bl.prev)
+ { //Add it back to the map.
+ hd->bl.m = sd->bl.m;
+ hd->bl.x = x;
+ hd->bl.y = y;
+ map_addblock(&hd->bl);
+ clif_spawn(&hd->bl);
+ }
+ status_revive(&hd->bl, per, 0);
+ return 1;
+}
+
+void merc_hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp)
+{
+ struct map_session_data *sd = hd->master;
+ hd->homunculus.hp = hd->battle_status.hp;
+ if (!sd)
+ return;
+ clif_send_homdata(sd,SP_ACK,0);
+ clif_hominfo(sd,hd,1);
+ clif_hominfo(sd,hd,0);
+ clif_homskillinfoblock(sd);
+}
+
+int read_homunculusdb(void)
+{
+ FILE *fp;
+ char line[1024], *p;
+ int i, k, classid;
+ int j = 0;
+ char *filename[]={"homunculus_db.txt","homunculus_db2.txt"};
+ char *str[36];
+
+ malloc_set(homunculus_db,0,sizeof(homunculus_db));
+ for(i = 0; i<2; i++)
+ {
+ sprintf(line, "%s/%s", db_path, filename[i]);
+ fp = fopen(line,"r");
+ if(!fp){
+ if(i != 0)
+ continue;
+ ShowError("read_homunculusdb : can't read %s\n", line);
+ return -1;
+ }
+
+ while(fgets(line,sizeof(line)-1,fp) && j < MAX_HOMUNCULUS_CLASS)
+ {
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ k = 0;
+ p = strtok (line,",");
+ while (p != NULL && k < 36)
+ {
+ str[k++] = p;
+ p = strtok (NULL, ",");
+ }
+
+ classid = atoi(str[0]);
+ if (k != 36 || classid < HM_CLASS_BASE || classid > HM_CLASS_MAX)
+ {
+ ShowError("read_homunculusdb : Error reading %s", filename[i]);
+ continue;
+ }
+
+ //Class,Homunculus,HP,SP,ATK,MATK,HIT,CRI,DEF,MDEF,FLEE,ASPD,STR,AGI,VIT,INT,DEX,LUK
+ homunculus_db[j].class_ = classid;
+ strncpy(homunculus_db[j].name,str[1],NAME_LENGTH-1);
+ homunculus_db[j].basemaxHP = atoi(str[2]);
+ homunculus_db[j].basemaxSP = atoi(str[3]);
+ homunculus_db[j].baseSTR = atoi(str[4]);
+ homunculus_db[j].baseAGI = atoi(str[5]);
+ homunculus_db[j].baseVIT = atoi(str[6]);
+ homunculus_db[j].baseINT = atoi(str[7]);
+ homunculus_db[j].baseDEX = atoi(str[8]);
+ homunculus_db[j].baseLUK = atoi(str[9]);
+ homunculus_db[j].baseIntimacy = atoi(str[10]);
+ homunculus_db[j].baseHungry = atoi(str[11]);
+ homunculus_db[j].hungryDelay = atoi(str[12]);
+ homunculus_db[j].foodID = atoi(str[13]);
+ homunculus_db[j].gminHP = atoi(str[14]);
+ homunculus_db[j].gmaxHP = atoi(str[15]);
+ homunculus_db[j].gminSP = atoi(str[16]);
+ homunculus_db[j].gmaxSP = atoi(str[17]);
+ homunculus_db[j].gminSTR = atoi(str[18]);
+ homunculus_db[j].gmaxSTR = atoi(str[19]);
+ homunculus_db[j].gminAGI = atoi(str[20]);
+ homunculus_db[j].gmaxAGI = atoi(str[21]);
+ homunculus_db[j].gminVIT = atoi(str[22]);
+ homunculus_db[j].gmaxVIT = atoi(str[23]);
+ homunculus_db[j].gminINT = atoi(str[24]);
+ homunculus_db[j].gmaxINT = atoi(str[25]);
+ homunculus_db[j].gminDEX = atoi(str[26]);
+ homunculus_db[j].gmaxDEX = atoi(str[27]);
+ homunculus_db[j].gminLUK = atoi(str[28]);
+ homunculus_db[j].gmaxLUK = atoi(str[29]);
+ homunculus_db[j].evo_class = atoi(str[30]);
+ homunculus_db[j].baseASPD = atoi(str[31]);
+ homunculus_db[j].size = atoi(str[32]);
+ homunculus_db[j].race = atoi(str[33]);
+ homunculus_db[j].element = atoi(str[34]);
+ homunculus_db[j].accessID = atoi(str[35]);
+ j++;
+ }
+ if (j > MAX_HOMUNCULUS_CLASS)
+ ShowWarning("read_homunculusdb: Reached max number of homunculus [%d]. Remaining homunculus were not read.\n ", MAX_HOMUNCULUS_CLASS);
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' homunculus in '"CL_WHITE"db/%s"CL_RESET"'.\n",j,filename[i]);
+ }
+ return 0;
+}
+
+int read_homunculus_skilldb(void)
+{
+ FILE *fp;
+ char line[1024], *p;
+ int k, classid;
+ int j = 0;
+ char *split[15];
+
+ malloc_tsetdword(hskill_tree,0,sizeof(hskill_tree));
+ sprintf(line, "%s/homun_skill_tree.txt", db_path);
+ fp=fopen(line,"r");
+ if(fp==NULL){
+ ShowError("can't read %s\n", line);
+ return 1;
+ }
+
+ while(fgets(line, sizeof(line)-1, fp))
+ {
+ int minJobLevelPresent = 0;
+
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+
+ k = 0;
+ p = strtok(line,",");
+ while (p != NULL && k < 15)
+ {
+ split[k++] = p;
+ p = strtok(NULL, ",");
+ }
+
+ if(k < 13)
+ continue;
+
+ if (k == 14)
+ minJobLevelPresent = 1; // MinJobLvl has been added
+
+ // check for bounds [celest]
+ classid = atoi(split[0]) - HM_CLASS_BASE;
+ if ( classid >= MAX_HOMUNCULUS_CLASS )
+ continue;
+
+ k = atoi(split[1]); //This is to avoid adding two lines for the same skill. [Skotlex]
+ // Search an empty line or a line with the same skill_id (stored in j)
+ for(j = 0; j < MAX_SKILL_TREE && hskill_tree[classid][j].id && hskill_tree[classid][j].id != k; j++);
+
+ if (j == MAX_SKILL_TREE)
+ {
+ ShowWarning("Unable to load skill %d into homunculus %d's tree. Maximum number of skills per class has been reached.\n", k, classid);
+ continue;
+ }
+
+ hskill_tree[classid][j].id=k;
+ hskill_tree[classid][j].max=atoi(split[2]);
+ if (minJobLevelPresent)
+ hskill_tree[classid][j].joblv=atoi(split[3]);
+
+ for(k=0;k<5;k++){
+ hskill_tree[classid][j].need[k].id=atoi(split[3+k*2+minJobLevelPresent]);
+ hskill_tree[classid][j].need[k].lv=atoi(split[3+k*2+minJobLevelPresent+1]);
+ }
+ }
+
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","homun_skill_tree.txt");
+ return 0;
+}
+
+void read_homunculus_expdb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int i, j=0;
+ char *filename[]={"exp_homun.txt","exp_homun2.txt"};
+
+ malloc_tsetdword(hexptbl,0,sizeof(hexptbl));
+ for(i=0; i<2; i++){
+ sprintf(line, "%s/%s", db_path, filename[i]);
+ fp=fopen(line,"r");
+ if(fp == NULL){
+ if(i != 0)
+ continue;
+ ShowError("can't read %s\n",line);
+ return;
+ }
+ while(fgets(line,sizeof(line)-1,fp) && j < MAX_LEVEL)
+ {
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ hexptbl[j] = strtoul(line, NULL, 10);
+ if (!hexptbl[j++])
+ break;
+ }
+ if (hexptbl[MAX_LEVEL - 1]) // Last permitted level have to be 0!
+ {
+ ShowWarning("read_hexptbl: Reached max level in exp_homun [%d]. Remaining lines were not read.\n ", MAX_LEVEL);
+ hexptbl[MAX_LEVEL - 1] = 0;
+ }
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' levels in '"CL_WHITE"%s"CL_RESET"'.\n", j, filename[i]);
+ }
+}
+
+void merc_reload(void)
+{
+ read_homunculusdb();
+ read_homunculus_expdb();
+}
+
+void merc_skill_reload(void)
+{
+ read_homunculus_skilldb();
+}
+
+int do_init_merc(void)
+{
+ read_homunculusdb();
+ read_homunculus_expdb();
+ read_homunculus_skilldb();
+ // Add homunc timer function to timer func list [Toms]
+ add_timer_func_list(merc_hom_hungry, "merc_hom_hungry");
+ return 0;
+}
+
+int do_final_merc(void);
diff --git a/src/map/mercenary.h b/src/map/mercenary.h
index 73f791c68..e5ba86cfe 100644
--- a/src/map/mercenary.h
+++ b/src/map/mercenary.h
@@ -1,79 +1,79 @@
-// Homunculus and future Mercenary system code go here [Celest]
-// implemented by [orn]
-struct homunculus_db {
- int class_ ;
- char name[NAME_LENGTH];
- int basemaxHP ;
- int basemaxSP ;
- int baseSTR ;
- int baseAGI ;
- int baseVIT ;
- int baseINT ;
- int baseDEX ;
- int baseLUK ;
- int foodID ;
- int baseIntimacy ;
- short baseHungry ;
- long hungryDelay ;
- int gminHP ;
- int gmaxHP ;
- int gminSP ;
- int gmaxSP ;
- int gminSTR ;
- int gmaxSTR ;
- int gminAGI ;
- int gmaxAGI ;
- int gminVIT ;
- int gmaxVIT ;
- int gminINT ;
- int gmaxINT ;
- int gminDEX ;
- int gmaxDEX ;
- int gminLUK ;
- int gmaxLUK ;
- int evo_class ;
- int baseASPD ;
- unsigned char element, race, size;
- int accessID ;
-};
-extern struct homunculus_db homuncumlus_db[MAX_HOMUNCULUS_CLASS];
-enum { HOMUNCULUS_CLASS, HOMUNCULUS_FOOD };
-enum {
- SP_ACK = 0x00,
- SP_INTIMATE = 0x100,
- SP_HUNGRY = 0x200
-};
-// merc_is_hom_alive(struct homun_data *)
-#define merc_is_hom_active(x) (x && x->homunculus.vaporize != 1 && x->battle_status.hp > 0)
-int do_init_merc(void);
-int merc_hom_recv_data(int account_id, struct s_homunculus *sh, int flag); //albator
-void merc_load_sub(struct homun_data *hd, struct map_session_data *sd);
-void merc_load_exptables(void);
-char *merc_hom_skill_get_name(int id);
-void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp);
-int merc_hom_dead(struct homun_data *hd, struct block_list *src);
-void merc_hom_skillup(struct homun_data *hd,int skillnum);
-int merc_hom_calc_skilltree(struct homun_data *hd) ;
-int merc_hom_checkskill(struct homun_data *hd,int skill_id) ;
-int merc_hom_gainexp(struct homun_data *hd,int exp) ;
-int merc_hom_levelup(struct homun_data *hd) ;
-int merc_hom_evolution(struct homun_data *hd) ;
-void merc_hom_heal(struct homun_data *hd,int hp,int sp);
-int merc_hom_vaporize(struct map_session_data *sd, int flag);
-int merc_resurrect_homunculus(struct map_session_data *sd, unsigned char per, short x, short y);
-void merc_hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp);
-void merc_save(struct homun_data *hd);
-int merc_call_homunculus(struct map_session_data *sd);
-int merc_create_homunculus_request(struct map_session_data *sd, int class_);
-int search_homunculusDB_index(int key,int type);
-int merc_menu(struct map_session_data *sd,int menunum);
-int merc_hom_food(struct map_session_data *sd, struct homun_data *hd);
-int merc_hom_hungry_timer_delete(struct homun_data *hd);
-#define merc_stop_walking(hd, type) { if((hd)->ud.walktimer != -1) unit_stop_walking(&(hd)->bl, type); }
-#define merc_stop_attack(hd) { if((hd)->ud.attacktimer != -1) unit_stop_attack(&(hd)->bl); hd->ud.target = 0; }
-int merc_hom_increase_intimacy(struct homun_data * hd, unsigned int value);
-int merc_hom_decrease_intimacy(struct homun_data * hd, unsigned int value);
-int merc_skill_tree_get_max(int id, int b_class);
-void merc_hom_init_timers(struct homun_data * hd);
-void merc_skill_reload(void);
-void merc_reload(void);
+// Homunculus and future Mercenary system code go here [Celest]
+// implemented by [orn]
+struct homunculus_db {
+ int class_ ;
+ char name[NAME_LENGTH];
+ int basemaxHP ;
+ int basemaxSP ;
+ int baseSTR ;
+ int baseAGI ;
+ int baseVIT ;
+ int baseINT ;
+ int baseDEX ;
+ int baseLUK ;
+ int foodID ;
+ int baseIntimacy ;
+ short baseHungry ;
+ long hungryDelay ;
+ int gminHP ;
+ int gmaxHP ;
+ int gminSP ;
+ int gmaxSP ;
+ int gminSTR ;
+ int gmaxSTR ;
+ int gminAGI ;
+ int gmaxAGI ;
+ int gminVIT ;
+ int gmaxVIT ;
+ int gminINT ;
+ int gmaxINT ;
+ int gminDEX ;
+ int gmaxDEX ;
+ int gminLUK ;
+ int gmaxLUK ;
+ int evo_class ;
+ int baseASPD ;
+ unsigned char element, race, size;
+ int accessID ;
+};
+extern struct homunculus_db homuncumlus_db[MAX_HOMUNCULUS_CLASS];
+enum { HOMUNCULUS_CLASS, HOMUNCULUS_FOOD };
+enum {
+ SP_ACK = 0x00,
+ SP_INTIMATE = 0x100,
+ SP_HUNGRY = 0x200
+};
+// merc_is_hom_alive(struct homun_data *)
+#define merc_is_hom_active(x) (x && x->homunculus.vaporize != 1 && x->battle_status.hp > 0)
+int do_init_merc(void);
+int merc_hom_recv_data(int account_id, struct s_homunculus *sh, int flag); //albator
+void merc_load_sub(struct homun_data *hd, struct map_session_data *sd);
+void merc_load_exptables(void);
+char *merc_hom_skill_get_name(int id);
+void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp);
+int merc_hom_dead(struct homun_data *hd, struct block_list *src);
+void merc_hom_skillup(struct homun_data *hd,int skillnum);
+int merc_hom_calc_skilltree(struct homun_data *hd) ;
+int merc_hom_checkskill(struct homun_data *hd,int skill_id) ;
+int merc_hom_gainexp(struct homun_data *hd,int exp) ;
+int merc_hom_levelup(struct homun_data *hd) ;
+int merc_hom_evolution(struct homun_data *hd) ;
+void merc_hom_heal(struct homun_data *hd,int hp,int sp);
+int merc_hom_vaporize(struct map_session_data *sd, int flag);
+int merc_resurrect_homunculus(struct map_session_data *sd, unsigned char per, short x, short y);
+void merc_hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp);
+void merc_save(struct homun_data *hd);
+int merc_call_homunculus(struct map_session_data *sd);
+int merc_create_homunculus_request(struct map_session_data *sd, int class_);
+int search_homunculusDB_index(int key,int type);
+int merc_menu(struct map_session_data *sd,int menunum);
+int merc_hom_food(struct map_session_data *sd, struct homun_data *hd);
+int merc_hom_hungry_timer_delete(struct homun_data *hd);
+#define merc_stop_walking(hd, type) { if((hd)->ud.walktimer != -1) unit_stop_walking(&(hd)->bl, type); }
+#define merc_stop_attack(hd) { if((hd)->ud.attacktimer != -1) unit_stop_attack(&(hd)->bl); hd->ud.target = 0; }
+int merc_hom_increase_intimacy(struct homun_data * hd, unsigned int value);
+int merc_hom_decrease_intimacy(struct homun_data * hd, unsigned int value);
+int merc_skill_tree_get_max(int id, int b_class);
+void merc_hom_init_timers(struct homun_data * hd);
+void merc_skill_reload(void);
+void merc_reload(void);
diff --git a/src/map/mob.h b/src/map/mob.h
index 7dedf948b..03d35b076 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -1,207 +1,207 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MOB_H_
-#define _MOB_H_
-
-#include "unit.h"
-#include "map.h"
-
-#define MAX_RANDOMMONSTER 3
-#define MAX_MOB_RACE_DB 6
- /* Change this to increase the table size in your mob_db to accomodate
- a larger mob database. Be sure to note that IDs 4001 to 4048 are reserved for advanced/baby/expanded classes.
- */
-#define MAX_MOB_DB 10000
-
-//The number of drops all mobs have and the max drop-slot that the steal skill
-//will attempt to steal from.
-#define MAX_MOB_DROP 10
-#define MAX_STEAL_DROP 7
-
-//Min time before mobs do a check to call nearby friends for help (or for slaves to support their master)
-#define MIN_MOBLINKTIME 1000
-
-//Distance that slaves should keep from their master.
-#define MOB_SLAVEDISTANCE 2
-
-// These define the range of available IDs for clones. [Valaris]
-#define MOB_CLONE_START 9001
-#define MOB_CLONE_END 10000
-
-// Scripted Mob AI Constants
-#define CALLBACK_NPCCLICK 0x100
-#define CALLBACK_ATTACK 0x80
-#define CALLBACK_DETECT 0x40
-#define CALLBACK_DEAD 0x20
-#define CALLBACK_ASSIST 0x10
-#define CALLBACK_KILL 0x08
-#define CALLBACK_UNLOCK 0x04
-#define CALLBACK_WALKACK 0x02
-#define CALLBACK_WARPACK 0x01
-
-int mob_script_callback(struct mob_data *md, struct block_list *target, short action_type);
-
-struct mob_skill {
- short state;
- short skill_id,skill_lv;
- short permillage;
- int casttime,delay;
- short cancel;
- short cond1,cond2;
- short target;
- int val[5];
- short emotion;
-};
-
-struct mob_db {
- char sprite[NAME_LENGTH],name[NAME_LENGTH],jname[NAME_LENGTH];
- unsigned int base_exp,job_exp;
- unsigned int mexp,mexpper;
- unsigned int min_thinktime; //Min think time, Recharge Time as aegis calls it.
- int range2,range3;
- short race2; // celest
- unsigned short lv;
- struct { int nameid,p; } dropitem[MAX_MOB_DROP];
- struct { int nameid,p; } mvpitem[3];
- struct status_data status;
- struct view_data vd;
- short option;
- int summonper[MAX_RANDOMMONSTER];
- int maxskill;
- struct mob_skill skill[MAX_MOBSKILL];
-};
-
-enum {
- MST_TARGET = 0,
- MST_SELF,
- MST_FRIEND,
- MST_MASTER,
- MST_AROUND5,
- MST_AROUND6,
- MST_AROUND7,
- MST_AROUND8,
- MST_AROUND1,
- MST_AROUND2,
- MST_AROUND3,
- MST_AROUND4,
- MST_AROUND = MST_AROUND4,
-
- MSC_ALWAYS = 0x0000,
- MSC_MYHPLTMAXRATE,
- MSC_MYHPINRATE,
- MSC_FRIENDHPLTMAXRATE,
- MSC_FRIENDHPINRATE,
- MSC_MYSTATUSON,
- MSC_MYSTATUSOFF,
- MSC_FRIENDSTATUSON,
- MSC_FRIENDSTATUSOFF,
- MSC_ATTACKPCGT,
- MSC_ATTACKPCGE,
- MSC_SLAVELT,
- MSC_SLAVELE,
- MSC_CLOSEDATTACKED,
- MSC_LONGRANGEATTACKED,
- MSC_AFTERSKILL,
- MSC_SKILLUSED ,
- MSC_CASTTARGETED,
- MSC_RUDEATTACKED,
- MSC_MASTERHPLTMAXRATE,
- MSC_MASTERATTACKED,
- MSC_ALCHEMIST,
- MSC_SPAWN,
-};
-
-//Mob skill states.
-enum {
- MSS_ANY = -1,
- MSS_IDLE,
- MSS_WALK,
- MSS_LOOT,
- MSS_DEAD,
- MSS_BERSERK, //Aggressive mob attacking
- MSS_ANGRY, //Mob retaliating from being attacked.
- MSS_RUSH, //Mob following a player after being attacked.
- MSS_FOLLOW, //Mob following a player without being attacked.
- MSS_ANYTARGET,
-};
-
-
-/*==========================================
- * The structure object for item drop with delay
- * Since it is only two being able to pass [ int ] a timer function
- * Data is put in and passed to this structure object.
- *------------------------------------------
- */
-struct item_drop {
- struct item item_data;
- struct item_drop *next;
-};
-
-struct item_drop_list {
- int m,x,y;
- struct map_session_data *first_sd,*second_sd,*third_sd;
- struct item_drop *item;
-};
-
-struct mob_db* mob_db(int class_);
-int mobdb_searchname(const char *str);
-int mobdb_searchname_array(struct mob_db** data, int size, const char *str);
-int mobdb_checkid(const int id);
-struct view_data* mob_get_viewdata(int class_);
-struct mob_data *mob_once_spawn_sub(struct block_list *bl, int m,
- short x, short y, const char *mobname, int class_, const char *event);
-int mob_once_spawn(struct map_session_data *sd,char *mapname,
- short x,short y,const char *mobname,int class_,int amount,const char *event);
-int mob_once_spawn_area(struct map_session_data *sd,char *mapname,
- int x0,int y0,int x1,int y1,
- const char *mobname,int class_,int amount,const char *event);
-
-int mob_spawn_guardian(struct map_session_data *sd,char *mapname, // Spawning Guardians [Valaris]
- int x,int y,const char *mobname,int class_,int amount,const char *event,int guardian); // Spawning Guardians [Valaris]
-int mob_guardian_guildchange(struct block_list *bl,va_list ap); //Change Guardian's ownership. [Skotlex]
-
-int mob_randomwalk(struct mob_data *md,int tick);
-
-int mob_target(struct mob_data *md,struct block_list *bl,int dist);
-int mob_unlocktarget(struct mob_data *md,int tick);
-struct mob_data* mob_spawn_dataset(struct spawn_data *data);
-int mob_spawn(struct mob_data *md);
-int mob_setdelayspawn(struct mob_data *md);
-int mob_parse_dataset(struct spawn_data *data);
-void mob_damage(struct mob_data *md, struct block_list *src, int damage);
-int mob_dead(struct mob_data *md, struct block_list *src, int type);
-void mob_revive(struct mob_data *md, unsigned int hp);
-void mob_heal(struct mob_data *md,unsigned int heal);
-
-#define mob_stop_walking(md, type) { if (md->ud.walktimer != -1) unit_stop_walking(&md->bl, type); }
-#define mob_stop_attack(md) { if (md->ud.attacktimer != -1) unit_stop_attack(&md->bl); }
-
-int do_init_mob(void);
-int do_final_mob(void);
-
-int mob_timer_delete(int tid, unsigned int tick, int id, int data);
-int mob_deleteslave(struct mob_data *md);
-
-int mob_random_class (int *value, size_t count);
-int mob_get_random_id(int type, int flag, int lv);
-int mob_class_change(struct mob_data *md,int class_);
-int mob_warpslave(struct block_list *bl, int range);
-int mob_linksearch(struct block_list *bl,va_list ap);
-
-int mobskill_use(struct mob_data *md,unsigned int tick,int event);
-int mobskill_event(struct mob_data *md,struct block_list *src,unsigned int tick, int flag);
-int mobskill_castend_id( int tid, unsigned int tick, int id,int data );
-int mobskill_castend_pos( int tid, unsigned int tick, int id,int data );
-int mob_summonslave(struct mob_data *md2,int *value,int amount,int skill_id);
-int mob_countslave(struct block_list *bl);
-int mob_convertslave(struct mob_data *md);
-
-int mob_is_clone(int class_);
-
-int mob_clone_spawn(struct map_session_data *sd, int m, int x, int y, const char *event, int master_id, int mode, int flag, unsigned int duration);
-int mob_clone_delete(int class_);
-
-void mob_reload(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _MOB_H_
+#define _MOB_H_
+
+#include "unit.h"
+#include "map.h"
+
+#define MAX_RANDOMMONSTER 3
+#define MAX_MOB_RACE_DB 6
+ /* Change this to increase the table size in your mob_db to accomodate
+ a larger mob database. Be sure to note that IDs 4001 to 4048 are reserved for advanced/baby/expanded classes.
+ */
+#define MAX_MOB_DB 10000
+
+//The number of drops all mobs have and the max drop-slot that the steal skill
+//will attempt to steal from.
+#define MAX_MOB_DROP 10
+#define MAX_STEAL_DROP 7
+
+//Min time before mobs do a check to call nearby friends for help (or for slaves to support their master)
+#define MIN_MOBLINKTIME 1000
+
+//Distance that slaves should keep from their master.
+#define MOB_SLAVEDISTANCE 2
+
+// These define the range of available IDs for clones. [Valaris]
+#define MOB_CLONE_START 9001
+#define MOB_CLONE_END 10000
+
+// Scripted Mob AI Constants
+#define CALLBACK_NPCCLICK 0x100
+#define CALLBACK_ATTACK 0x80
+#define CALLBACK_DETECT 0x40
+#define CALLBACK_DEAD 0x20
+#define CALLBACK_ASSIST 0x10
+#define CALLBACK_KILL 0x08
+#define CALLBACK_UNLOCK 0x04
+#define CALLBACK_WALKACK 0x02
+#define CALLBACK_WARPACK 0x01
+
+int mob_script_callback(struct mob_data *md, struct block_list *target, short action_type);
+
+struct mob_skill {
+ short state;
+ short skill_id,skill_lv;
+ short permillage;
+ int casttime,delay;
+ short cancel;
+ short cond1,cond2;
+ short target;
+ int val[5];
+ short emotion;
+};
+
+struct mob_db {
+ char sprite[NAME_LENGTH],name[NAME_LENGTH],jname[NAME_LENGTH];
+ unsigned int base_exp,job_exp;
+ unsigned int mexp,mexpper;
+ unsigned int min_thinktime; //Min think time, Recharge Time as aegis calls it.
+ int range2,range3;
+ short race2; // celest
+ unsigned short lv;
+ struct { int nameid,p; } dropitem[MAX_MOB_DROP];
+ struct { int nameid,p; } mvpitem[3];
+ struct status_data status;
+ struct view_data vd;
+ short option;
+ int summonper[MAX_RANDOMMONSTER];
+ int maxskill;
+ struct mob_skill skill[MAX_MOBSKILL];
+};
+
+enum {
+ MST_TARGET = 0,
+ MST_SELF,
+ MST_FRIEND,
+ MST_MASTER,
+ MST_AROUND5,
+ MST_AROUND6,
+ MST_AROUND7,
+ MST_AROUND8,
+ MST_AROUND1,
+ MST_AROUND2,
+ MST_AROUND3,
+ MST_AROUND4,
+ MST_AROUND = MST_AROUND4,
+
+ MSC_ALWAYS = 0x0000,
+ MSC_MYHPLTMAXRATE,
+ MSC_MYHPINRATE,
+ MSC_FRIENDHPLTMAXRATE,
+ MSC_FRIENDHPINRATE,
+ MSC_MYSTATUSON,
+ MSC_MYSTATUSOFF,
+ MSC_FRIENDSTATUSON,
+ MSC_FRIENDSTATUSOFF,
+ MSC_ATTACKPCGT,
+ MSC_ATTACKPCGE,
+ MSC_SLAVELT,
+ MSC_SLAVELE,
+ MSC_CLOSEDATTACKED,
+ MSC_LONGRANGEATTACKED,
+ MSC_AFTERSKILL,
+ MSC_SKILLUSED ,
+ MSC_CASTTARGETED,
+ MSC_RUDEATTACKED,
+ MSC_MASTERHPLTMAXRATE,
+ MSC_MASTERATTACKED,
+ MSC_ALCHEMIST,
+ MSC_SPAWN,
+};
+
+//Mob skill states.
+enum {
+ MSS_ANY = -1,
+ MSS_IDLE,
+ MSS_WALK,
+ MSS_LOOT,
+ MSS_DEAD,
+ MSS_BERSERK, //Aggressive mob attacking
+ MSS_ANGRY, //Mob retaliating from being attacked.
+ MSS_RUSH, //Mob following a player after being attacked.
+ MSS_FOLLOW, //Mob following a player without being attacked.
+ MSS_ANYTARGET,
+};
+
+
+/*==========================================
+ * The structure object for item drop with delay
+ * Since it is only two being able to pass [ int ] a timer function
+ * Data is put in and passed to this structure object.
+ *------------------------------------------
+ */
+struct item_drop {
+ struct item item_data;
+ struct item_drop *next;
+};
+
+struct item_drop_list {
+ int m,x,y;
+ struct map_session_data *first_sd,*second_sd,*third_sd;
+ struct item_drop *item;
+};
+
+struct mob_db* mob_db(int class_);
+int mobdb_searchname(const char *str);
+int mobdb_searchname_array(struct mob_db** data, int size, const char *str);
+int mobdb_checkid(const int id);
+struct view_data* mob_get_viewdata(int class_);
+struct mob_data *mob_once_spawn_sub(struct block_list *bl, int m,
+ short x, short y, const char *mobname, int class_, const char *event);
+int mob_once_spawn(struct map_session_data *sd,char *mapname,
+ short x,short y,const char *mobname,int class_,int amount,const char *event);
+int mob_once_spawn_area(struct map_session_data *sd,char *mapname,
+ int x0,int y0,int x1,int y1,
+ const char *mobname,int class_,int amount,const char *event);
+
+int mob_spawn_guardian(struct map_session_data *sd,char *mapname, // Spawning Guardians [Valaris]
+ int x,int y,const char *mobname,int class_,int amount,const char *event,int guardian); // Spawning Guardians [Valaris]
+int mob_guardian_guildchange(struct block_list *bl,va_list ap); //Change Guardian's ownership. [Skotlex]
+
+int mob_randomwalk(struct mob_data *md,int tick);
+
+int mob_target(struct mob_data *md,struct block_list *bl,int dist);
+int mob_unlocktarget(struct mob_data *md,int tick);
+struct mob_data* mob_spawn_dataset(struct spawn_data *data);
+int mob_spawn(struct mob_data *md);
+int mob_setdelayspawn(struct mob_data *md);
+int mob_parse_dataset(struct spawn_data *data);
+void mob_damage(struct mob_data *md, struct block_list *src, int damage);
+int mob_dead(struct mob_data *md, struct block_list *src, int type);
+void mob_revive(struct mob_data *md, unsigned int hp);
+void mob_heal(struct mob_data *md,unsigned int heal);
+
+#define mob_stop_walking(md, type) { if (md->ud.walktimer != -1) unit_stop_walking(&md->bl, type); }
+#define mob_stop_attack(md) { if (md->ud.attacktimer != -1) unit_stop_attack(&md->bl); }
+
+int do_init_mob(void);
+int do_final_mob(void);
+
+int mob_timer_delete(int tid, unsigned int tick, int id, int data);
+int mob_deleteslave(struct mob_data *md);
+
+int mob_random_class (int *value, size_t count);
+int mob_get_random_id(int type, int flag, int lv);
+int mob_class_change(struct mob_data *md,int class_);
+int mob_warpslave(struct block_list *bl, int range);
+int mob_linksearch(struct block_list *bl,va_list ap);
+
+int mobskill_use(struct mob_data *md,unsigned int tick,int event);
+int mobskill_event(struct mob_data *md,struct block_list *src,unsigned int tick, int flag);
+int mobskill_castend_id( int tid, unsigned int tick, int id,int data );
+int mobskill_castend_pos( int tid, unsigned int tick, int id,int data );
+int mob_summonslave(struct mob_data *md2,int *value,int amount,int skill_id);
+int mob_countslave(struct block_list *bl);
+int mob_convertslave(struct mob_data *md);
+
+int mob_is_clone(int class_);
+
+int mob_clone_spawn(struct map_session_data *sd, int m, int x, int y, const char *event, int master_id, int mode, int flag, unsigned int duration);
+int mob_clone_delete(int class_);
+
+void mob_reload(void);
+
+#endif
diff --git a/src/map/npc.c b/src/map/npc.c
index fbedef5da..46fd4c4ab 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1,3084 +1,3084 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
-#include <limits.h>
-
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/grfio.h"
-#include "../common/showmsg.h"
-#include "../common/ers.h"
-#include "../common/db.h"
-#include "map.h"
-#include "log.h"
-#include "npc.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "status.h"
-#include "itemdb.h"
-#include "script.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "skill.h"
-#include "unit.h"
-
-#ifdef _WIN32
-#undef isspace
-#define isspace(x) (x == ' ' || x == '\t')
-#endif
-
-struct npc_src_list {
- struct npc_src_list * next;
-// struct npc_src_list * prev; //[Shinomori]
- char name[4];
-};
-
-static struct npc_src_list *npc_src_first=NULL;
-static struct npc_src_list *npc_src_last=NULL;
-static int npc_id=START_NPC_NUM;
-static int npc_warp=0;
-static int npc_shop=0;
-static int npc_script=0;
-static int npc_mob=0;
-static int npc_delay_mob=0;
-static int npc_cache_mob=0;
-char *current_file = NULL;
-int npc_get_new_npc_id(void){ return npc_id++; }
-
-static struct dbt *ev_db;
-static struct dbt *npcname_db;
-
-struct event_data {
- struct npc_data *nd;
- int pos;
-};
-static struct tm ev_tm_b; // ŽžŒvƒCƒxƒ“ƒg—p
-
-static struct eri *timer_event_ers; //For the npc timer data. [Skotlex]
-
-//For holding the view data of npc classes. [Skotlex]
-static struct view_data npc_viewdb[MAX_NPC_CLASS];
-
-static struct
-{ //Holds pointers to the commonly executed scripts for speedup. [Skotlex]
- struct npc_data *nd;
- struct event_data *event[UCHAR_MAX];
- unsigned char *event_name[UCHAR_MAX];
- unsigned char event_count;
-} script_event[NPCE_MAX];
-
-struct view_data* npc_get_viewdata(int class_)
-{ //Returns the viewdata for normal npc classes.
- if (class_ == INVISIBLE_CLASS)
- return &npc_viewdb[0];
- if (npcdb_checkid(class_) || class_ == WARP_CLASS)
- return &npc_viewdb[class_];
- return NULL;
-}
-/*==========================================
- * NPC‚Ì–³Œø‰»/—LŒø‰»
- * npc_enable
- * npc_enable_sub —LŒøŽž‚ÉOnTouchƒCƒxƒ“ƒg‚ðŽÀs
- *------------------------------------------
- */
-int npc_enable_sub( struct block_list *bl, va_list ap )
-{
- struct map_session_data *sd;
- struct npc_data *nd;
- //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
- if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
- char name[50]; // need 24 + 9 for the "::OnTouch"
-
- if (nd->sc.option&OPTION_INVISIBLE) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- if(sd->areanpc_id==nd->bl.id)
- return 1;
- sd->areanpc_id=nd->bl.id;
-
- snprintf(name, 50, "%s::OnTouch", nd->exname); // exname to be specific. exname is the unique identifier for script events. [Lance]
- npc_event(sd,name,0);
- }
- //aFree(name);
- return 0;
-}
-int npc_enable(const char *name,int flag)
-{
- struct npc_data *nd= strdb_get(npcname_db,(unsigned char*)name);
- if (nd==NULL)
- return 0;
-
- if (flag&1)
- nd->sc.option&=~OPTION_INVISIBLE;
- else if (flag&2)
- nd->sc.option&=~OPTION_HIDE;
- else if (flag&4)
- nd->sc.option|= OPTION_HIDE;
- else //Can't change the view_data to invisible class because the view_data for all npcs is shared! [Skotlex]
- nd->sc.option|= OPTION_INVISIBLE;
-
- if (nd->class_ == WARP_CLASS)
- { //Client won't display option changes for warp portals [Toms]
- if (nd->sc.option&(OPTION_HIDE|OPTION_INVISIBLE))
- clif_clearchar(&nd->bl, 0);
- else
- clif_spawn(&nd->bl);
- } else
- clif_changeoption(&nd->bl);
-
- if(flag&3 && (nd->u.scr.xs > 0 || nd->u.scr.ys >0))
- map_foreachinarea( npc_enable_sub,nd->bl.m,nd->bl.x-nd->u.scr.xs,nd->bl.y-nd->u.scr.ys,nd->bl.x+nd->u.scr.xs,nd->bl.y+nd->u.scr.ys,BL_PC,nd);
-
- return 0;
-}
-
-/*==========================================
- * NPC‚𖼑O‚Å’T‚·
- *------------------------------------------
- */
-struct npc_data* npc_name2id(const char *name)
-{
- return (struct npc_data *) strdb_get(npcname_db,(unsigned char*)name);
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
- *------------------------------------------
- */
-int npc_event_dequeue(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if (!sd->eventqueue[0][0])
- return 0; //Nothing to dequeue
-
- if (!pc_addeventtimer(sd,100,sd->eventqueue[0]))
- { //Failed to dequeue, couldn't set a timer.
- ShowWarning("npc_event_dequeue: event timer is full !\n");
- return 0;
- }
- //Event dequeued successfully, shift other elements.
- sd->npc_id=0; //FIXME: Shouldn't dequeueing fail when you have an npc_id set?
- memmove(sd->eventqueue[0], sd->eventqueue[1], (MAX_EVENTQUEUE-1)*sizeof(sd->eventqueue[0]));
- sd->eventqueue[MAX_EVENTQUEUE-1][0]=0;
- return 1;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì’x‰„ŽÀs
- *------------------------------------------
- */
-int npc_event_timer(int tid,unsigned int tick,int id,int data)
-{
- unsigned char *eventname = (unsigned char *)data;
- struct event_data *ev = strdb_get(ev_db,eventname);
- struct npc_data *nd;
- struct map_session_data *sd=map_id2sd(id);
- size_t i;
-
- if((ev==NULL || (nd=ev->nd)==NULL))
- {
- if(battle_config.error_log)
- ShowWarning("npc_event: event not found [%s]\n",eventname);
- }
- else
- {
- for(i=0;i<MAX_EVENTTIMER;i++) {
- if( nd->eventtimer[i]==tid ) {
- nd->eventtimer[i]=-1;
- npc_event(sd,eventname,0); // sd NULL check is within
- break;
- }
- }
- if(i==MAX_EVENTTIMER && battle_config.error_log)
- ShowWarning("npc_event_timer: event timer not found [%s]!\n",eventname);
- }
-
- aFree(eventname);
- return 0;
-}
-
-int npc_timer_event(const unsigned char *eventname) // Added by RoVeRT
-{
- struct event_data *ev=strdb_get(ev_db,(unsigned char*)eventname);
- struct npc_data *nd;
-// int xs,ys;
-
- if((ev==NULL || (nd=ev->nd)==NULL)){
- ShowWarning("npc_timer_event: event not found [%s]\n",eventname);
- return 0;
- }
-
- run_script(nd->u.scr.script,ev->pos,nd->bl.id,nd->bl.id);
-
- return 0;
-}
-/*
-int npc_timer_sub_sub(DBKey key,void *data,va_list ap) // Added by RoVeRT
-{
- char *p=(char *)key;
- struct event_data *ev=(struct event_data *)data;
- int *c=va_arg(ap,int *);
- int tick=0,ctick=gettick();
- char temp[10];
- char event[100];
-
- if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){
- sscanf(&p[9],"%s",temp);
- tick=atoi(temp);
-
- strcpy( event, ev->nd->name);
- strcat( event, p);
-
- if (ctick >= ev->nd->lastaction && ctick - ev->nd->timer >= tick) {
- npc_timer_event(event);
- ev->nd->lastaction = ctick;
- }
- }
- return 0;
-}
-
-int npc_timer_sub(DBKey key,void *data,va_list ap) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data*)data;
-
- if(nd->timer == -1)
- return 0;
-
- sv_db->foreach(ev_db,npc_timer_sub_sub,&nd->bl.id);
-
- return 0;
-}
-
-int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT
-{
- npcname_db->foreach(npcname_db,npc_timer_sub);
-
- aFree((void*)data);
- return 0;
-}*/
-/*==========================================
- * ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚̃GƒNƒXƒ|[ƒg
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_event_export(char *lname,void *data,va_list ap)
-{
- int pos=(int)data;
- struct npc_data *nd=va_arg(ap,struct npc_data *);
-
- if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) {
- struct event_data *ev;
- unsigned char buf[51];
- char *p=strchr(lname,':');
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
- ev=(struct event_data *) aMalloc(sizeof(struct event_data));
- if (ev==NULL) {
- ShowFatalError("npc_event_export: out of memory !\n");
- exit(1);
- }else if (p==NULL || (p-lname)>NAME_LENGTH) {
- ShowFatalError("npc_event_export: label name error !\n");
- exit(1);
- }else{
- ev->nd=nd;
- ev->pos=pos;
- *p='\0';
- sprintf(buf,"%s::%s",nd->exname,lname);
- *p=':';
- strdb_put(ev_db,buf,ev);
- }
- }
- return 0;
-}
-
-int npc_event_sub(struct map_session_data *, struct event_data *, const unsigned char *); //[Lance]
-/*==========================================
- * ‘S‚Ä‚ÌNPC‚ÌOn*ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_event_doall_sub(DBKey key,void *data,va_list ap)
-{
- unsigned char*p = key.str;
- struct event_data *ev;
- int *c;
- int rid;
- unsigned char *name;
-
- ev=(struct event_data *)data;
- c=va_arg(ap,int *);
- name=va_arg(ap,unsigned char *);
- rid=va_arg(ap, int);
-
- if( (p=strchr(p,':')) && p && strcmpi(name,p)==0 ){
- if(rid)
- npc_event_sub(((struct map_session_data *)map_id2bl(rid)),ev,key.str);
- else
- run_script(ev->nd->u.scr.script,ev->pos,rid,ev->nd->bl.id);
- (*c)++;
- }
-
- return 0;
-}
-int npc_event_doall(const unsigned char *name)
-{
- int c=0;
- unsigned char buf[64]="::";
-
- strncpy(buf+2,name,62);
- ev_db->foreach(ev_db,npc_event_doall_sub,&c,buf,0);
- return c;
-}
-int npc_event_doall_id(const unsigned char *name, int rid)
-{
- int c=0;
- unsigned char buf[64]="::";
-
- strncpy(buf+2,name,62);
- ev_db->foreach(ev_db,npc_event_doall_sub,&c,buf,rid);
- return c;
-}
-
-int npc_event_do_sub(DBKey key,void *data,va_list ap)
-{
- unsigned char *p = key.str;
- struct event_data *ev;
- int *c;
- const unsigned char *name;
-
- nullpo_retr(0, ev=(struct event_data *)data);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
-
- name=va_arg(ap,const unsigned char *);
-
- if (p && strcmpi(name,p)==0 ) {
- run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
- (*c)++;
- }
-
- return 0;
-}
-int npc_event_do(const unsigned char *name)
-{
- int c=0;
-
- if (*name==':' && name[1]==':') {
- return npc_event_doall(name+2);
- }
-
- ev_db->foreach(ev_db,npc_event_do_sub,&c,name);
- return c;
-}
-
-/*==========================================
- * ŽžŒvƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_event_do_clock(int tid,unsigned int tick,int id,int data)
-{
- time_t timer;
- struct tm *t;
- char buf[64];
- char *day="";
- int c=0;
-
- time(&timer);
- t=localtime(&timer);
-
- switch (t->tm_wday) {
- case 0: day = "Sun"; break;
- case 1: day = "Mon"; break;
- case 2: day = "Tue"; break;
- case 3: day = "Wed"; break;
- case 4: day = "Thu"; break;
- case 5: day = "Fri"; break;
- case 6: day = "Sat"; break;
- }
-
- if (t->tm_min != ev_tm_b.tm_min ) {
- sprintf(buf,"OnMinute%02d",t->tm_min);
- c+=npc_event_doall(buf);
- sprintf(buf,"OnClock%02d%02d",t->tm_hour,t->tm_min);
- c+=npc_event_doall(buf);
- sprintf(buf,"On%s%02d%02d",day,t->tm_hour,t->tm_min);
- c+=npc_event_doall(buf);
- }
- if (t->tm_hour!= ev_tm_b.tm_hour) {
- sprintf(buf,"OnHour%02d",t->tm_hour);
- c+=npc_event_doall(buf);
- }
- if (t->tm_mday!= ev_tm_b.tm_mday) {
- sprintf(buf,"OnDay%02d%02d",t->tm_mon+1,t->tm_mday);
- c+=npc_event_doall(buf);
- }
- memcpy(&ev_tm_b,t,sizeof(ev_tm_b));
- return c;
-}
-/*==========================================
- * OnInitƒCƒxƒ“ƒgŽÀs(&ŽžŒvƒCƒxƒ“ƒgŠJŽn)
- *------------------------------------------
- */
-int npc_event_do_oninit(void)
-{
-// int c = npc_event_doall("OnInit");
- ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
- CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
-
- add_timer_interval(gettick()+100,
- npc_event_do_clock,0,0,1000);
-
- return 0;
-}
-/*==========================================
- * OnTimer NPC event - by RoVeRT
- *------------------------------------------
- */
-int npc_addeventtimer(struct npc_data *nd,int tick,const char *name)
-{
- int i;
- unsigned char *evname;
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]==-1 )
- break;
- if(i<MAX_EVENTTIMER){
- if (!strdb_get(ev_db,(unsigned char*)name)) {
- if (battle_config.error_log)
- ShowError("npc_addeventimer: Event %s does not exists.\n", name);
- return 1; //Event does not exists!
- }
- evname =(unsigned char *) aMallocA(NAME_LENGTH*sizeof(char));
- if(evname==NULL){
- ShowFatalError("npc_addeventtimer: out of memory !\n");exit(1);
- }
- memcpy(evname,name,NAME_LENGTH-1);
- evname[NAME_LENGTH-1] = '\0';
- nd->eventtimer[i]=add_timer(gettick()+tick,
- npc_event_timer,nd->bl.id,(int)evname);
- }else
- ShowWarning("npc_addtimer: event timer is full !\n");
-
- return 0;
-}
-
-int npc_deleventtimer(struct npc_data *nd,const unsigned char *name)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]!=-1 && strcmp(
- (unsigned char *)(get_timer(nd->eventtimer[i])->data), name)==0 ){
- delete_timer(nd->eventtimer[i],npc_event_timer);
- nd->eventtimer[i]=-1;
- break;
- }
-
- return 0;
-}
-
-int npc_cleareventtimer(struct npc_data *nd)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]!=-1 ){
- delete_timer(nd->eventtimer[i],npc_event_timer);
- nd->eventtimer[i]=-1;
- }
-
- return 0;
-}
-
-int npc_do_ontimer_sub(DBKey key,void *data,va_list ap)
-{
- unsigned char *p = key.str;
- struct event_data *ev = (struct event_data *)data;
- int *c = va_arg(ap,int *);
-// struct map_session_data *sd=va_arg(ap,struct map_session_data *);
- int option = va_arg(ap,int);
- int tick = 0;
- char temp[10];
- char event[50];
-
- if(ev->nd->bl.id == (int)*c && (p = strchr(p,':')) && strnicmp("::OnTimer",p,8) == 0){
- sscanf(&p[9], "%s", temp);
- tick = atoi(temp);
-
- strcpy(event, ev->nd->name);
- strcat(event, p);
-
- if (option!=0) {
- npc_addeventtimer(ev->nd, tick, event);
- } else {
- npc_deleventtimer(ev->nd, event);
- }
- }
- return 0;
-}
-int npc_do_ontimer(int npc_id, int option)
-{
- ev_db->foreach(ev_db, npc_do_ontimer_sub, &npc_id, option);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚ÌŽæ‚èž‚Ý
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_timerevent_import(char *lname,void *data,va_list ap)
-{
- int pos=(int)data;
- struct npc_data *nd=va_arg(ap,struct npc_data *);
- int t=0,i=0;
-
- if(sscanf(lname,"OnTimer%d%n",&t,&i)==1 && lname[i]==':') {
- // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
- struct npc_timerevent_list *te=nd->u.scr.timer_event;
- int j,i=nd->u.scr.timeramount;
- if(te==NULL) te=(struct npc_timerevent_list*)aMallocA(sizeof(struct npc_timerevent_list));
- else te= (struct npc_timerevent_list*)aRealloc( te, sizeof(struct npc_timerevent_list) * (i+1) );
- if(te==NULL){
- ShowFatalError("npc_timerevent_import: out of memory !\n");
- exit(1);
- }
- for(j=0;j<i;j++){
- if(te[j].timer>t){
- memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(i-j));
- break;
- }
- }
- te[j].timer=t;
- te[j].pos=pos;
- nd->u.scr.timer_event=te;
- nd->u.scr.timeramount++;
- }
- return 0;
-}
-struct timer_event_data {
- int rid; //Attached player for this timer.
- int next; //timer index (starts with 0, then goes up to nd->u.scr.timeramount
- int time; //holds total time elapsed for the script since time 0 (whenthe timers started)
- unsigned int otick; //Holds tick value at which timer sequence was started (that is, it stores the tick value for which T= 0
-};
-
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_timerevent(int tid,unsigned int tick,int id,int data)
-{
- int next,t,old_rid,old_timer;
- unsigned int old_tick;
- struct npc_data* nd=(struct npc_data *)map_id2bl(id);
- struct npc_timerevent_list *te;
- struct timer_event_data *ted = (struct timer_event_data*)data;
- struct map_session_data *sd=NULL;
-
- if( nd==NULL ){
- ShowError("npc_timerevent: NPC not found??\n");
- return 0;
- }
- if (ted->rid) {
- sd = map_id2sd(ted->rid);
- if (!sd) {
- if(battle_config.error_log)
- ShowError("npc_timerevent: Attached player not found.\n");
- ers_free(timer_event_ers, ted);
- return 0;
- }
- }
- old_rid = nd->u.scr.rid; //To restore it later.
- nd->u.scr.rid = sd?sd->bl.id:0;
-
- old_tick = nd->u.scr.timertick;
- nd->u.scr.timertick=ted->otick;
- te=nd->u.scr.timer_event+ ted->next;
-
- old_timer = nd->u.scr.timer;
- t = nd->u.scr.timer=ted->time;
- ted->next++;
-
- if( nd->u.scr.timeramount> ted->next){
- next= nd->u.scr.timer_event[ ted->next ].timer
- - nd->u.scr.timer_event[ ted->next-1 ].timer;
- ted->time+=next;
- if (sd)
- sd->npc_timer_id = add_timer(tick+next,npc_timerevent,id,(int)ted);
- else
- nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,(int)ted);
- } else {
- if (sd)
- sd->npc_timer_id = -1;
- else
- nd->u.scr.timerid = -1;
- ers_free(timer_event_ers, ted);
- }
- run_script(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id);
- //Restore previous data, only if this timer is a player-attached one.
- if (sd) {
- nd->u.scr.rid = old_rid;
- nd->u.scr.timer = old_timer;
- nd->u.scr.timertick = old_tick;
- }
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŠJŽn
- *------------------------------------------
- */
-int npc_timerevent_start(struct npc_data *nd, int rid)
-{
- int j,n, next;
- struct map_session_data *sd=NULL; //Player to whom script is attached.
- struct timer_event_data *ted;
-
- nullpo_retr(0, nd);
-
- n=nd->u.scr.timeramount;
- if( n==0 )
- return 0;
-
- for(j=0;j<n;j++){
- if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer )
- break;
- }
- if(j>=n) // check if there is a timer to use !!BEFORE!! you write stuff to the structures [Shinomori]
- return 0;
- if (nd->u.scr.rid > 0) {
- //Try to attach timer to this player.
- sd = map_id2sd(nd->u.scr.rid);
- if (!sd) {
- if(battle_config.error_log)
- ShowError("npc_timerevent_start: Attached player not found!\n");
- return 1;
- }
- }
- //Check if timer is already started.
- if (sd) {
- if (sd->npc_timer_id != -1)
- return 0;
- } else if (nd->u.scr.timerid != -1)
- return 0;
-
- ted = ers_alloc(timer_event_ers, struct timer_event_data);
- ted->next = j;
- nd->u.scr.timertick=ted->otick=gettick();
-
- //Attach only the player if attachplayerrid was used.
- ted->rid = sd?sd->bl.id:0;
-
-// Do not store it to make way to two types of timers: globals and personals.
-// if (rid >= 0) nd->u.scr.rid=rid; // changed to: attaching to given rid by default [Shinomori]
- // if rid is less than 0 leave it unchanged [celest]
-
- next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
- ted->time = nd->u.scr.timer_event[j].timer;
- if (sd)
- sd->npc_timer_id = add_timer(gettick()+next,npc_timerevent,nd->bl.id,(int)ted);
- else
- nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,(int)ted);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgI—¹
- *------------------------------------------
- */
-int npc_timerevent_stop(struct npc_data *nd)
-{
- struct map_session_data *sd =NULL;
- struct TimerData *td = NULL;
- int *tid;
- nullpo_retr(0, nd);
- if (nd->u.scr.rid) {
- sd = map_id2sd(nd->u.scr.rid);
- if (!sd) {
- if(battle_config.error_log)
- ShowError("npc_timerevent_stop: Attached player not found!\n");
- return 1;
- }
- }
-
- tid = sd?&sd->npc_timer_id:&nd->u.scr.timerid;
-
- if (*tid == -1) //Nothing to stop
- return 0;
- td = get_timer(*tid);
- if (td && td->data)
- ers_free(timer_event_ers, (struct event_timer_data*)td->data);
- delete_timer(*tid,npc_timerevent);
- *tid = -1;
- //Set the timer tick to the time that has passed since the beginning of the timers and now.
- nd->u.scr.timer = DIFF_TICK(gettick(),nd->u.scr.timertick);
-// nd->u.scr.rid = 0; //Eh? why detach?
- return 0;
-}
-/*==========================================
- * Aborts a running npc timer that is attached to a player.
- *------------------------------------------
- */
-void npc_timerevent_quit(struct map_session_data *sd) {
- struct TimerData *td;
- if (sd->npc_timer_id == -1)
- return;
- td = get_timer(sd->npc_timer_id);
- if (!td) {
- sd->npc_timer_id = -1;
- return; //??
- }
- delete_timer(sd->npc_timer_id,npc_timerevent);
- sd->npc_timer_id = -1;
- ers_free(timer_event_ers, (struct event_timer_data*)td->data);
-}
-
-/*==========================================
- * ƒ^ƒCƒ}[’l‚ÌŠ“¾
- *------------------------------------------
- */
-int npc_gettimerevent_tick(struct npc_data *nd)
-{
- int tick;
- nullpo_retr(0, nd);
-
- tick=nd->u.scr.timer;
- if (nd->u.scr.timertick)
- tick+=DIFF_TICK(gettick(), nd->u.scr.timertick);
- return tick;
-}
-/*==========================================
- * ƒ^ƒCƒ}[’l‚ÌÝ’è
- *------------------------------------------
- */
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer)
-{
- int flag;
- struct map_session_data *sd=NULL;
-
- nullpo_retr(0, nd);
-
- if (nd->u.scr.rid) {
- sd = map_id2sd(nd->u.scr.rid);
- if (!sd) {
- if(battle_config.error_log)
- ShowError("npc_settimerevent_tick: Attached player not found!\n");
- return 1;
- }
- flag= sd->npc_timer_id != -1 ;
- } else
- flag= nd->u.scr.timerid != -1 ;
-
- if(flag)
- npc_timerevent_stop(nd);
- nd->u.scr.timer=newtimer;
- if(flag)
- npc_timerevent_start(nd, -1);
- return 0;
-}
-
-int npc_event_sub(struct map_session_data *sd, struct event_data *ev, const unsigned char *eventname){
-
- if ( sd->npc_id!=0) {
- //Enqueue the event trigger.
- int i;
- for(i=0;i<MAX_EVENTQUEUE && sd->eventqueue[i][0];i++);
-
- if (i==MAX_EVENTQUEUE) {
- if (battle_config.error_log)
- ShowWarning("npc_event: event queue is full !\n");
- }else //Event enqueued.
- memcpy(sd->eventqueue[i],eventname,50);
- return 1;
- }
- if (ev->nd->sc.option&OPTION_INVISIBLE) {
- //Disabled npc, shouldn't trigger event.
- npc_event_dequeue(sd);
- return 2;
- }
- run_script(ev->nd->u.scr.script,ev->pos,sd->bl.id,ev->nd->bl.id);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgŒ^‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_event (struct map_session_data *sd, const unsigned char *eventname, int mob_kill)
-{
- struct event_data *ev=strdb_get(ev_db,(unsigned char*)eventname);
- struct npc_data *nd;
- int xs,ys;
- unsigned char mobevent[100];
-
- if (sd == NULL) {
- nullpo_info(NLP_MARK);
- return 0;
- }
-
- if (ev == NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0)
- return 1;
-
- if (ev == NULL || (nd = ev->nd) == NULL) {
- if (mob_kill) {
- strcpy( mobevent, eventname);
- strcat( mobevent, "::OnMyMobDead");
- ev = strdb_get(ev_db, mobevent);
- if (ev == NULL || (nd = ev->nd) == NULL) {
- if (strnicmp(eventname, "GM_MONSTER",10) != 0)
- ShowError("npc_event: (mob_kill) event not found [%s]\n", mobevent);
- return 0;
- }
- } else {
- if (battle_config.error_log)
- ShowError("npc_event: event not found [%s]\n", eventname);
- return 0;
- }
- }
-
- xs=nd->u.scr.xs;
- ys=nd->u.scr.ys;
- if (xs>=0 && ys>=0 && (strcmp(((eventname)+strlen(eventname)-6),"Global") != 0) )
- {
- if (nd->bl.m >= 0) { //Non-invisible npc
- if (nd->bl.m != sd->bl.m )
- return 1;
- if ( xs>0 && (sd->bl.x<nd->bl.x-xs/2 || nd->bl.x+xs/2<sd->bl.x) )
- return 1;
- if ( ys>0 && (sd->bl.y<nd->bl.y-ys/2 || nd->bl.y+ys/2<sd->bl.y) )
- return 1;
- }
- }
-
- return npc_event_sub(sd,ev,eventname);
-}
-
-
-int npc_command_sub(DBKey key,void *data,va_list ap)
-{
- unsigned char *p = key.str;
- struct event_data *ev=(struct event_data *)data;
- unsigned char *npcname=va_arg(ap,char *);
- char *command=va_arg(ap,char *);
- unsigned char temp[100];
-
- if(strcmp(ev->nd->name,npcname)==0 && (p=strchr(p,':')) && p && strnicmp("::OnCommand",p,10)==0 ){
- sscanf(&p[11],"%s",temp);
-
- if (strcmp(command,temp)==0)
- run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
- }
-
- return 0;
-}
-
-int npc_command(struct map_session_data *sd,const unsigned char *npcname,char *command)
-{
- ev_db->foreach(ev_db,npc_command_sub,npcname,command);
-
- return 0;
-}
-/*==========================================
- * ÚGŒ^‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y)
-{
- int i,f=1;
- int xs,ys;
-
- nullpo_retr(1, sd);
-
- if(sd->npc_id)
- return 1;
-
- for(i=0;i<map[m].npc_num;i++) {
- if (map[m].npc[i]->sc.option&OPTION_INVISIBLE) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- f=0;
- continue;
- }
-
- switch(map[m].npc[i]->bl.subtype) {
- case WARP:
- xs=map[m].npc[i]->u.warp.xs;
- ys=map[m].npc[i]->u.warp.ys;
- break;
- case SCRIPT:
- xs=map[m].npc[i]->u.scr.xs;
- ys=map[m].npc[i]->u.scr.ys;
- break;
- default:
- continue;
- }
- if (x >= map[m].npc[i]->bl.x-xs/2 && x < map[m].npc[i]->bl.x-xs/2+xs &&
- y >= map[m].npc[i]->bl.y-ys/2 && y < map[m].npc[i]->bl.y-ys/2+ys)
- break;
- }
- if (i==map[m].npc_num) {
- if (f) {
- if (battle_config.error_log)
- ShowError("npc_touch_areanpc : some bug \n");
- }
- return 1;
- }
- switch(map[m].npc[i]->bl.subtype) {
- case WARP:
- // hidden chars cannot use warps -- is it the same for scripts too?
- if (sd->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) ||
- (!battle_config.duel_allow_teleport && sd->duel_group)) // duel rstrct [LuzZza]
- break;
- pc_setpos(sd,map[m].npc[i]->u.warp.mapindex,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0);
- break;
- case SCRIPT:
- {
- //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
- char name[50]; // need 24 max + 9 for "::OnTouch"
-
- if(sd->areanpc_id == map[m].npc[i]->bl.id)
- return 1;
- sd->areanpc_id = map[m].npc[i]->bl.id;
-
- sprintf(name,"%s::OnTouch", map[m].npc[i]->exname); // It goes here too. exname being the unique identifier. [Lance]
-
- if( npc_event(sd,name,0)>0 ) {
- pc_stop_walking(sd,1); //Make it stop walking!
- npc_click(sd,map[m].npc[i]);
- }
- //aFree(name);
- break;
- }
- }
- return 0;
-}
-
-int npc_touch_areanpc2(struct block_list *bl)
-{
- int i,m=bl->m;
- int xs,ys;
-
- for(i=0;i<map[m].npc_num;i++) {
- if (map[m].npc[i]->sc.option&OPTION_INVISIBLE)
- continue;
-
- if (map[m].npc[i]->bl.subtype!=WARP)
- continue;
-
- xs=map[m].npc[i]->u.warp.xs;
- ys=map[m].npc[i]->u.warp.ys;
-
- if (bl->x >= map[m].npc[i]->bl.x-xs/2 && bl->x < map[m].npc[i]->bl.x-xs/2+xs &&
- bl->y >= map[m].npc[i]->bl.y-ys/2 && bl->y < map[m].npc[i]->bl.y-ys/2+ys)
- break;
- }
- if (i==map[m].npc_num)
- return 0;
-
- xs = map_mapindex2mapid(map[m].npc[i]->u.warp.mapindex);
- if (xs < 0) // Can't warp object between map servers...
- return 0;
-
- if (unit_warp(bl, xs, map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0))
- return 0; //Failed to warp.
-
- return 1;
-}
-
-/*==========================================
- * ‹ß‚­‚©‚Ç‚¤‚©‚Ì”»’è
- *------------------------------------------
- */
-int npc_checknear2(struct map_session_data *sd,struct block_list *bl)
-{
- nullpo_retr(1, sd);
- if(bl == NULL) return 1;
-
- if(sd->state.using_fake_npc && sd->npc_id == bl->id)
- return 0;
-
- if (status_get_class(bl)<0) //Class-less npc, enable click from anywhere.
- return 0;
-
- if (bl->m!=sd->bl.m ||
- bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 ||
- bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)
- return 1;
-
- return 0;
-}
-
-TBL_NPC *npc_checknear(struct map_session_data *sd,struct block_list *bl)
-{
- struct npc_data *nd;
-
- nullpo_retr(NULL, sd);
- if(bl == NULL) return NULL;
- if(bl->type != BL_NPC) return NULL;
- nd = (TBL_NPC*)bl;
-
- if(sd->state.using_fake_npc && sd->npc_id == bl->id)
- return nd;
-
- if (nd->class_<0) //Class-less npc, enable click from anywhere.
- return nd;
-
- if (bl->m!=sd->bl.m ||
- bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 ||
- bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)
- return NULL;
-
- return nd;
-}
-
-/*==========================================
- * NPC‚̃I[ƒvƒ“ƒ`ƒƒƒbƒg”­Œ¾
- *------------------------------------------
- */
-int npc_globalmessage(const char *name,char *mes)
-{
- struct npc_data *nd=(struct npc_data *) strdb_get(npcname_db,(unsigned char*)name);
- char temp[100];
-
- if (!nd)
- return 0;
-
- snprintf(temp, sizeof temp ,"%s : %s",name,mes);
- clif_GlobalMessage(&nd->bl,temp);
-
- return 0;
-}
-
-/*==========================================
- * ƒNƒŠƒbƒNŽž‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_click(struct map_session_data *sd,struct npc_data *nd)
-{
- nullpo_retr(1, sd);
-
- if (sd->npc_id != 0) {
- if (battle_config.error_log)
- ShowError("npc_click: npc_id != 0\n");
- return 1;
- }
-
- if(!nd) return 1;
- if ((nd = npc_checknear(sd,&nd->bl)) == NULL)
- return 1;
- //Hidden/Disabled npc.
- if (nd->class_ < 0 || nd->sc.option&OPTION_INVISIBLE)
- return 1;
-
- switch(nd->bl.subtype) {
- case SHOP:
- clif_npcbuysell(sd,nd->bl.id);
- npc_event_dequeue(sd);
- break;
- case SCRIPT:
- run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_scriptcont(struct map_session_data *sd,int id)
-{
- nullpo_retr(1, sd);
-
- if (id!=sd->npc_id){
- ShowWarning("npc_scriptcont: sd->npc_id (%d) is not id (%d).\n", sd->npc_id, id);
- return 1;
- }
-
- if(id != fake_nd->bl.id) { // Not item script
- if ((npc_checknear(sd,map_id2bl(id))) == NULL){
- ShowWarning("npc_scriptcont: failed npc_checknear test.\n");
- return 1;
- }
- }
- run_script_main(sd->st);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_buysellsel(struct map_session_data *sd,int id,int type)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if ((nd = npc_checknear(sd,map_id2bl(id))) == NULL)
- return 1;
-
- if (nd->bl.subtype!=SHOP) {
- if (battle_config.error_log)
- ShowError("no such shop npc : %d\n",id);
- if (sd->npc_id == id)
- sd->npc_id=0;
- return 1;
- }
- if (nd->sc.option&OPTION_INVISIBLE) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- sd->npc_shopid=id;
- if (type==0) {
- clif_buylist(sd,nd);
- } else {
- clif_selllist(sd);
- }
- return 0;
-}
-
-//npc_buylist for script-controlled shops.
-static int npc_buylist_sub(
- struct map_session_data *sd,int n,
- unsigned short *item_list, struct npc_data *nd)
-{
- unsigned char npc_ev[51];
- int i;
- int regkey = add_str("@bought_nameid");
- int regkey2 = add_str("@bought_quantity");
- sprintf(npc_ev, "%s::OnBuyItem", nd->exname);
- for(i=0;i<n;i++){
- pc_setreg(sd,regkey+(i<<24),(int)item_list[i*2+1]);
- pc_setreg(sd,regkey2+(i<<24),(int)item_list[i*2]);
- }
- npc_event(sd, npc_ev, 0);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list)
-{
- struct npc_data *nd;
- double z;
- int i,j,w,skill,itemamount=0,new_=0;
-
- nullpo_retr(3, sd);
- nullpo_retr(3, item_list);
-
- if ((nd = npc_checknear(sd,map_id2bl(sd->npc_shopid))) == NULL)
- return 3;
-
- if (nd->master_nd) //Script-based shops.
- return npc_buylist_sub(sd,n,item_list,nd->master_nd);
-
- if (nd->bl.subtype!=SHOP)
- return 3;
-
- for(i=0,w=0,z=0;i<n;i++) {
- for(j=0;nd->u.shop_item[j].nameid;j++) {
- if (nd->u.shop_item[j].nameid==item_list[i*2+1] || //Normal items
- itemdb_viewid(nd->u.shop_item[j].nameid)==item_list[i*2+1]) //item_avail replacement
- break;
- }
- if (nd->u.shop_item[j].nameid==0)
- return 3;
-
- if (!itemdb_isstackable(nd->u.shop_item[j].nameid) && item_list[i*2] > 1)
- { //Exploit? You can't buy more than 1 of equipment types o.O
- ShowWarning("Player %s (%d:%d) sent a hexed packet trying to buy %d of nonstackable item %d!\n",
- sd->status.name, sd->status.account_id, sd->status.char_id, item_list[i*2], nd->u.shop_item[j].nameid);
- item_list[i*2] = 1;
- }
- if (itemdb_value_notdc(nd->u.shop_item[j].nameid))
- z+=(double)nd->u.shop_item[j].value * item_list[i*2];
- else
- z+=(double)pc_modifybuyvalue(sd,nd->u.shop_item[j].value) * item_list[i*2];
- itemamount+=item_list[i*2];
-
- switch(pc_checkadditem(sd,item_list[i*2+1],item_list[i*2])) {
- case ADDITEM_EXIST:
- break;
- case ADDITEM_NEW:
- new_++;
- break;
- case ADDITEM_OVERAMOUNT:
- return 2;
- }
-
- w+=itemdb_weight(item_list[i*2+1]) * item_list[i*2];
- }
- if (z > (double)sd->status.zeny)
- return 1; // zeny•s‘«
- if (w+sd->weight > sd->max_weight)
- return 2; // d—Ê’´‰ß
- if (pc_inventoryblank(sd)<new_)
- return 3; // Ží—Þ”’´‰ß
-
- //Logs (S)hopping Zeny [Lupus]
- if(log_config.zeny > 0 )
- log_zeny(sd, "S", sd, -(int)z);
- //Logs
-
- pc_payzeny(sd,(int)z);
- for(i=0;i<n;i++) {
- struct item item_tmp;
-
- malloc_set(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = item_list[i*2+1];
- item_tmp.identify = 1; // npc”Ì”„ƒAƒCƒeƒ€‚ÍŠÓ’èÏ‚Ý
-
- pc_additem(sd,&item_tmp,item_list[i*2]);
-
- //Logs items, Bought in NPC (S)hop [Lupus]
- if(log_config.enable_logs&0x20)
- log_pick_pc(sd, "S", item_tmp.nameid, item_list[i*2], NULL);
- //Logs
- }
-
- //¤lŒoŒ±’l
- if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0) {
- if (sd->status.skill[MC_DISCOUNT].flag != 0)
- skill = sd->status.skill[MC_DISCOUNT].flag - 2;
- if (skill > 0) {
- z = z * (double)skill * (double)battle_config.shop_exp/10000.;
- if (z < 1)
- z = 1;
- pc_gainexp(sd,NULL,0,(int)z);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list)
-{
- double z;
- int i,skill,itemamount=0;
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_list);
-
- if ((nd = npc_checknear(sd,map_id2bl(sd->npc_shopid))) == NULL)
- return 1;
- nd = nd->master_nd; //For OnSell triggers.
-
- for(i=0,z=0;i<n;i++) {
- int nameid, idx, qty;
- idx = item_list[i*2]-2;
- qty = item_list[i*2+1];
-
- if (idx <0 || idx >=MAX_INVENTORY || qty < 0)
- break;
-
- nameid=sd->status.inventory[idx].nameid;
- if (nameid == 0 || !sd->inventory_data[idx] ||
- sd->status.inventory[idx].amount < qty)
- break;
-
- if (sd->inventory_data[idx]->flag.value_notoc)
- z+=(double)qty*sd->inventory_data[idx]->value_sell;
- else
- z+=(double)qty*pc_modifysellvalue(sd,sd->inventory_data[idx]->value_sell);
-
- if(sd->inventory_data[idx]->type==7 && sd->status.inventory[idx].card[0] == (short)0xff00)
- {
- if(search_petDB_index(sd->status.inventory[idx].nameid, PET_EGG) >= 0)
- intif_delete_petdata(MakeDWord(sd->status.inventory[idx].card[1],sd->status.inventory[idx].card[2]));
- }
-
- if(log_config.enable_logs&0x20) //Logs items, Sold to NPC (S)hop [Lupus]
- log_pick_pc(sd, "S", nameid, -qty, &sd->status.inventory[idx]);
-
- if(nd) {
- pc_setreg(sd,add_str("@sold_nameid")+(i<<24),(int)sd->status.inventory[idx].nameid);
- pc_setreg(sd,add_str("@sold_quantity")+(i<<24),qty);
- }
- itemamount+=qty;
- pc_delitem(sd,idx,qty,0);
- }
-
- if (z > MAX_ZENY) z = MAX_ZENY;
-
- if(log_config.zeny) //Logs (S)hopping Zeny [Lupus]
- log_zeny(sd, "S", sd, (int)z);
-
- pc_getzeny(sd,(int)z);
-
- if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_OVERCHARGE)) > 0) {
- if (sd->status.skill[MC_OVERCHARGE].flag != 0)
- skill = sd->status.skill[MC_OVERCHARGE].flag - 2;
- if (skill > 0) {
- z = z * (double)skill * (double)battle_config.shop_exp/10000.;
- if (z < 1)
- z = 1;
- pc_gainexp(sd,NULL,0,(int)z);
- }
- }
-
- if(nd) {
- unsigned char npc_ev[51];
- sprintf(npc_ev, "%s::OnSellItem", nd->exname);
- npc_event(sd, npc_ev, 0);
- }
-
- if (i<n) {
- //Error/Exploit... of some sort. If we return 1, the client will not mark
- //any item as deleted even though a few were sold. In such a case, we
- //have no recourse but to kick them out so their inventory will refresh
- //correctly on relog. [Skotlex]
- if (i) clif_setwaitclose(sd->fd);
- return 1;
- }
- return 0;
-}
-
-int npc_remove_map (struct npc_data *nd)
-{
- int m,i;
- nullpo_retr(1, nd);
-
- if(nd->bl.prev == NULL || nd->bl.m < 0)
- return 1; //Not assigned to a map.
- m = nd->bl.m;
-#ifdef PCRE_SUPPORT
- npc_chat_finalize(nd);
-#endif
- clif_clearchar_area(&nd->bl,2);
- strdb_remove(npcname_db, (nd->bl.subtype < SCRIPT) ? nd->name : nd->exname);
- //Remove corresponding NPC CELLs
- if (nd->bl.subtype == WARP) {
- int j, xs, ys, x, y;
- x = nd->bl.x;
- y = nd->bl.y;
- xs = nd->u.warp.xs;
- ys = nd->u.warp.ys;
-
- for (i = 0; i < ys; i++) {
- for (j = 0; j < xs; j++) {
- if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNPC))
- map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_CLRNPC);
- }
- }
- }
- map_delblock(&nd->bl);
- map_deliddb(&nd->bl);
- //Remove npc from map[].npc list. [Skotlex]
- for(i=0;i<map[m].npc_num && map[m].npc[i] != nd;i++);
- if (i >= map[m].npc_num) return 2; //failed to find it?
-
- map[m].npc_num--;
- for(; i<map[m].npc_num; i++)
- map[m].npc[i]=map[m].npc[i+1];
- return 0;
-}
-
-static int npc_unload_ev(DBKey key,void *data,va_list ap) {
- struct event_data *ev=(struct event_data *)data;
- unsigned char *npcname=va_arg(ap,unsigned char *);
-
- if(strcmp(ev->nd->exname,npcname)==0){
- db_remove(ev_db, key);
- return 1;
- }
- return 0;
-}
-
-static int npc_unload_dup_sub(DBKey key,void * data,va_list ap)
-{
- struct npc_data *nd = (struct npc_data *)data;
- int src_id;
-
- if(nd->bl.type!=BL_NPC || nd->bl.subtype != SCRIPT)
- return 0;
-
- src_id=va_arg(ap,int);
- if (nd->u.scr.src_id == src_id)
- npc_unload(nd);
- return 0;
-}
-//Removes all npcs that are duplicates of the passed one. [Skotlex]
-void npc_unload_duplicates (struct npc_data *nd)
-{
- map_foreachiddb(npc_unload_dup_sub,nd->bl.id);
-}
-
-int npc_unload (struct npc_data *nd)
-{
- nullpo_ret(nd);
-
- npc_remove_map (nd);
- map_deliddb(&nd->bl);
-
- if (nd->chat_id) {
- struct chat_data *cd = (struct chat_data*)map_id2bl(nd->chat_id);
- if (cd) aFree (cd);
- cd = NULL;
- }
- if (nd->bl.subtype == SCRIPT) {
- ev_db->foreach(ev_db,npc_unload_ev,nd->exname); //Clean up all events related.
- if (nd->u.scr.timerid != -1) {
- struct TimerData *td = NULL;
- td = get_timer(nd->u.scr.timerid);
- if (td && td->data)
- ers_free(timer_event_ers, (struct event_timer_data*)td->data);
- delete_timer(nd->u.scr.timerid, npc_timerevent);
- }
- npc_cleareventtimer (nd);
- if (nd->u.scr.timer_event)
- aFree(nd->u.scr.timer_event);
- if (nd->u.scr.src_id == 0) {
- if(nd->u.scr.script) {
- script_free_code(nd->u.scr.script);
- nd->u.scr.script = NULL;
- }
- if (nd->u.scr.label_list) {
- aFree(nd->u.scr.label_list);
- nd->u.scr.label_list = NULL;
- }
- }
- }
- aFree(nd);
-
- return 0;
-}
-
-//
-// ‰Šú‰»ŠÖŒW
-//
-
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̃NƒŠƒA
- *------------------------------------------
- */
-void npc_clearsrcfile (void)
-{
- struct npc_src_list *p = npc_src_first, *p2;
-
- while (p) {
- p2 = p;
- p = p->next;
- aFree(p2);
- }
- npc_src_first = NULL;
- npc_src_last = NULL;
-}
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̒ljÁ
- *------------------------------------------
- */
-void npc_addsrcfile (char *name)
-{
- struct npc_src_list *nsl;
-
- if (strcmpi(name, "clear") == 0) {
- npc_clearsrcfile();
- return;
- }
-
- // prevent multiple insert of source files
- nsl = npc_src_first;
- while (nsl)
- { // found the file, no need to insert it again
- if (0 == strcmp(name, nsl->name))
- return;
- nsl = nsl->next;
- }
-
- nsl = (struct npc_src_list *) aMalloc (sizeof(*nsl) + strlen(name));
- nsl->next = NULL;
- strncpy(nsl->name, name, strlen(name) + 1);
- if (npc_src_first == NULL)
- npc_src_first = nsl;
- if (npc_src_last)
- npc_src_last->next = nsl;
- npc_src_last = nsl;
-}
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚Ìíœ
- *------------------------------------------
- */
-void npc_delsrcfile (char *name)
-{
- struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first;
-
- if (strcmpi(name, "all") == 0) {
- npc_clearsrcfile();
- return;
- }
-
- while (p) {
- if (strcmp(p->name, name) == 0) {
- *lp = p->next;
- if (npc_src_last == p)
- npc_src_last = pp;
- aFree(p);
- break;
- }
- lp = &p->next;
- pp = p;
- p = p->next;
- }
-}
-
-/*==========================================
- * warps‰ðÍ
- *------------------------------------------
- */
-int npc_parse_warp (char *w1,char *w2,char *w3,char *w4)
-{
- int x, y, xs, ys, to_x, to_y, m;
- int i, j;
- char mapname[MAP_NAME_LENGTH], to_mapname[MAP_NAME_LENGTH];
- struct npc_data *nd;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%15[^,],%d,%d", mapname, &x, &y) != 3 ||
- sscanf(w4, "%d,%d,%15[^,],%d,%d", &xs, &ys, to_mapname, &to_x, &to_y) != 5) {
- ShowError("bad warp line : %s\n", w3);
- return 1;
- }
-
- m = map_mapname2mapid(mapname);
- i = mapindex_name2id(to_mapname);
- if (!i) {
- ShowError("bad warp line (destination map not found): %s\n", w3);
- return 1;
- }
-
- nd = (struct npc_data *) aCalloc (1, sizeof(struct npc_data));
-
- nd->bl.id = npc_get_new_npc_id();
- nd->n = map_addnpc(m, nd);
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m = m;
- nd->bl.x = x;
- nd->bl.y = y;
- memcpy(nd->name, w3, NAME_LENGTH-1);
- memcpy(nd->exname, w3, NAME_LENGTH-1);
-
- if (!battle_config.warp_point_debug)
- nd->class_ = WARP_CLASS;
- else
- nd->class_ = WARP_DEBUG_CLASS;
- nd->speed = 200;
-
- nd->u.warp.mapindex = (short)i;
- xs += 2;
- ys += 2;
- nd->u.warp.x = to_x;
- nd->u.warp.y = to_y;
- nd->u.warp.xs = xs;
- nd->u.warp.ys = ys;
-
- for (i = 0; i < ys; i++) {
- for (j = 0; j < xs; j++) {
- if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNOPASS))
- continue;
- map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_SETNPC);
- }
- }
-
- npc_warp++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = WARP;
- map_addblock(&nd->bl);
- status_set_viewdata(&nd->bl, nd->class_);
- status_change_init(&nd->bl);
- unit_dataset(&nd->bl);
- clif_spawn(&nd->bl);
- strdb_put(npcname_db, nd->name, nd);
-
- return 0;
-}
-
-/*==========================================
- * shops‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
-{
- #define MAX_SHOPITEM 100
- char *p;
- int x, y, dir, m, pos = 0;
- char mapname[MAP_NAME_LENGTH];
- struct npc_data *nd;
-
- if (strcmp(w1, "-") == 0) {
- x = 0; y = 0; dir = 0; m = -1;
- } else {
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%15[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- strchr(w4, ',') == NULL) {
- ShowError("bad shop line : %s\n", w3);
- return 1;
- }
- m = map_mapname2mapid(mapname);
- }
-
- nd = (struct npc_data *) aCalloc (1, sizeof(struct npc_data) +
- sizeof(nd->u.shop_item[0]) * (MAX_SHOPITEM + 1));
- p = strchr(w4, ',');
-
- while (p && pos < MAX_SHOPITEM) {
- int nameid, value;
- struct item_data *id;
- p++;
- if (sscanf(p, "%d:%d", &nameid, &value) != 2)
- break;
- nd->u.shop_item[pos].nameid = nameid;
- id = itemdb_search(nameid);
- if (value < 0)
- value = id->value_buy;
- nd->u.shop_item[pos].value = value;
- // check for bad prices that can possibly cause exploits
- if (value/124. < id->value_sell/75.) { //Clened up formula to prevent overflows.
- printf("\r"); //Carriage return to clear the 'loading..' line. [Skotlex]
- if (value < id->value_sell)
- ShowWarning ("Item %s [%d] buying price (%d) is less than selling price (%d) at %s\n",
- id->name, id->nameid, value, id->value_sell, current_file);
- else
- ShowWarning ("Item %s [%d] discounted buying price (%d) is less than overcharged selling price (%d) at %s\n",
- id->name, id->nameid, value/100*75, id->value_sell/100*124, current_file);
- }
- //for logs filters, atcommands and iteminfo script command
- if (id->maxchance<=0)
- id->maxchance = 10000; //10000 (100% drop chance)would show that the item's sold in NPC Shop
-
- pos++;
- p = strchr(p, ',');
- }
- if (pos == 0) {
- aFree(nd);
- return 1;
- }
- nd->u.shop_item[pos++].nameid = 0;
-
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m = m;
- nd->bl.x = x;
- nd->bl.y = y;
- nd->bl.id = npc_get_new_npc_id();
- memcpy(nd->name, w3, NAME_LENGTH-1);
- nd->name[NAME_LENGTH-1] = '\0';
- nd->class_ = m==-1?-1:atoi(w4);
- nd->speed = 200;
-
- nd = (struct npc_data *)aRealloc(nd,
- sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
-
- npc_shop++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = SHOP;
- if (m >= 0) {
- nd->n = map_addnpc(m,nd);
- map_addblock(&nd->bl);
- status_set_viewdata(&nd->bl, nd->class_);
- status_change_init(&nd->bl);
- unit_dataset(&nd->bl);
- nd->ud.dir = dir;
- clif_spawn(&nd->bl);
- } else
- // we skip map_addnpc, but still add it to the list of ID's
- map_addiddb(&nd->bl);
- strdb_put(npcname_db, nd->name,nd);
-
- return 0;
-}
-
-/*==========================================
- * NPC‚̃‰ƒxƒ‹ƒf[ƒ^ƒRƒ“ƒo[ƒg
- *------------------------------------------
- */
-int npc_convertlabel_db (DBKey key, void *data, va_list ap)
-{
- unsigned char *lname = key.str;
- int pos = (int)data;
- struct npc_data *nd;
- struct npc_label_list *lst;
- int num;
- char *p;
- char c;
-
- nullpo_retr(0, ap);
- nullpo_retr(0, nd = va_arg(ap,struct npc_data *));
-
- lst = nd->u.scr.label_list;
- num = nd->u.scr.label_list_num;
- if (!lst) {
- lst = (struct npc_label_list *) aCallocA (1, sizeof(struct npc_label_list));
- num = 0;
- } else
- lst = (struct npc_label_list *) aRealloc (lst, sizeof(struct npc_label_list)*(num+1));
-
- // In case of labels not terminated with ':', for user defined function support
- p = lname;
- while(isalnum(*(unsigned char*)p) || *p == '_') { p++; }
- c = *p;
- *p='\0';
-
- // here we check if the label fit into the buffer
- if (strlen(lname) > 23) {
- ShowError("npc_parse_script: label name longer than 23 chars! '%s'\n (%s)", lname, current_file);
- exit(1);
- }
- memcpy(lst[num].name, lname, strlen(lname)+1); //including EOS
-
- *p = c;
- lst[num].pos = pos;
- nd->u.scr.label_list = lst;
- nd->u.scr.label_list_num = num+1;
-
- return 0;
-}
-
-/*==========================================
- * scripts‰ðÍ
- *------------------------------------------
- */
-static void npc_parse_script_line(unsigned char *p,int *curly_count,int line) {
- int i = strlen((char *)p),j;
- int string_flag = 0;
- static int comment_flag = 0;
- for(j = 0; j < i ; j++) {
- if(comment_flag) {
- if(p[j] == '*' && p[j+1] == '/') {
- // ƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒgI—¹
- j++;
- (*curly_count)--;
- comment_flag = 0;
- }
- } else if(string_flag) {
- if(p[j] == '"') {
- string_flag = 0;
- } else if(p[j] == '\\' && p[j-1]<=0x7e) {
- // ƒGƒXƒP[ƒv
- j++;
- }
- } else {
- if(p[j] == '"') {
- string_flag = 1;
- } else if(p[j] == '}') {
- if(*curly_count == 0) {
- break;
- } else {
- (*curly_count)--;
- }
- } else if(p[j] == '{') {
- (*curly_count)++;
- } else if(p[j] == '/' && p[j+1] == '/') {
- // ƒRƒƒ“ƒg
- break;
- } else if(p[j] == '/' && p[j+1] == '*') {
- // ƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒg
- j++;
- (*curly_count)++;
- comment_flag = 1;
- }
- }
- }
- if(string_flag) {
- printf("Missing '\"' at file %s line %d\n",current_file,line);
- exit(1);
- }
-}
-
-// Like npc_parse_script, except it's sole use is to skip the contents of a script. [Skotlex]
-static int npc_skip_script (char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
-{
- unsigned char *srcbuf = NULL;
- int srcsize = 65536;
- int startline = 0;
- unsigned char line[1024];
- int curly_count = 0;
-
- srcbuf = (unsigned char *)aMallocA(srcsize*sizeof(char));
- if (strchr(first_line, '{')) {
- strcpy((char *)srcbuf, strchr(first_line, '{'));
- startline = *lines;
- } else
- srcbuf[0] = 0;
- npc_parse_script_line(srcbuf,&curly_count,*lines);
- while (curly_count > 0) {
- fgets ((char *)line, 1020, fp);
- (*lines)++;
- npc_parse_script_line(line,&curly_count,*lines);
- if (feof(fp))
- break;
- if (strlen((char *)srcbuf) + strlen((char *)line) + 1 >= (size_t)srcsize) {
- srcsize += 65536;
- srcbuf = (unsigned char *)aRealloc(srcbuf, srcsize);
- malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0] != '{') {
- if (strchr((char *) line,'{')) {
- strcpy((char *) srcbuf, strchr((const char *) line, '{'));
- startline = *lines;
- }
- } else
- strcat((char *) srcbuf, (const char *) line);
- }
- if(curly_count > 0)
- ShowError("Missing right curly at file %s, line %d\n",current_file, *lines);
- aFree(srcbuf);
- return 0;
-}
-
-static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines,const char* file)
-{
- int x, y, dir = 0, m, xs = 0, ys = 0, class_ = 0; // [Valaris] thanks to fov
- char mapname[MAP_NAME_LENGTH];
- unsigned char *srcbuf = NULL;
- struct script_code *script;
- int srcsize = 65536;
- int startline = 0;
- unsigned char line[1024];
- int i;
- struct npc_data *nd, *dnd;
- struct dbt *label_db;
- char *p;
- struct npc_label_list *label_dup = NULL;
- int label_dupnum = 0;
- int src_id = 0;
-
- if (strcmp(w1, "-") == 0) {
- x = 0; y = 0; m = -1;
- } else {
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%15[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- (strcmp(w2, "script") == 0 && strchr(w4,',') == NULL)) {
- ShowError("bad script line (in file %s): %s\n", file, w3);
- return 1;
- }
- m = map_mapname2mapid(mapname);
- }
-
- if (strcmp(w2, "script") == 0){
- // parsing script with curly
- int curly_count = 0;
- srcbuf = (unsigned char *)aMallocA(srcsize*sizeof(char));
- if (strchr(first_line, '{')) {
- strcpy((char *)srcbuf, strchr(first_line, '{'));
- startline = *lines;
- } else
- srcbuf[0] = 0;
- npc_parse_script_line(srcbuf,&curly_count,*lines);
- while (curly_count > 0) {
- fgets ((char *)line, 1020, fp);
- (*lines)++;
- npc_parse_script_line(line,&curly_count,*lines);
- if (feof(fp))
- break;
- if (strlen((char *)srcbuf) + strlen((char *)line) + 1 >= (size_t)srcsize) {
- srcsize += 65536;
- srcbuf = (unsigned char *)aRealloc(srcbuf, srcsize);
- malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0] != '{') {
- if (strchr((char *) line,'{')) {
- strcpy((char *) srcbuf, strchr((const char *) line, '{'));
- startline = *lines;
- }
- } else
- strcat((char *) srcbuf, (const char *) line);
- }
- if(curly_count > 0) {
- ShowError("Missing right curly at file %s, line %d\n",file, *lines);
- script = NULL;
- } else {
- // printf("Ok line %d\n",*lines);
- script = parse_script((unsigned char *) srcbuf, file, startline);
- }
- if (script == NULL) {
- // script parse error?
- aFree(srcbuf);
- return 1;
- }
- } else {
- // duplicate‚·‚é
- char srcname[128];
- struct npc_data *dnd;
- if (sscanf(w2, "duplicate(%[^)])", srcname) != 1) {
- ShowError("bad duplicate name (in %s)! : %s", file, w2);
- return 0;
- }
- if ((dnd = npc_name2id(srcname)) == NULL) {
- ShowError("bad duplicate name (in %s)! (not exist) : %s\n", file, srcname);
- return 0;
- }
- script = dnd->u.scr.script;
- label_dup = dnd->u.scr.label_list;
- label_dupnum = dnd->u.scr.label_list_num;
- src_id = dnd->bl.id;
-
- }// end of ƒXƒNƒŠƒvƒg‰ðÍ
-
- nd = (struct npc_data *)aCalloc(1, sizeof(struct npc_data));
-
- if (sscanf(w4, "%d,%d,%d", &class_, &xs, &ys) == 3) {
- // ÚGŒ^NPC
- int i, j;
-
- if (xs >= 0) xs = xs * 2 + 1;
- if (ys >= 0) ys = ys * 2 + 1;
-
- if (m >= 0) {
- for (i = 0; i < ys; i++) {
- for (j = 0; j < xs; j++) {
- if (map_getcell(m, x - xs/2 + j, y - ys/2 + i, CELL_CHKNOPASS))
- continue;
- map_setcell(m, x - xs/2 + j, y - ys/2 + i, CELL_SETNPC);
- }
- }
- }
- nd->u.scr.xs = xs;
- nd->u.scr.ys = ys;
- } else {
- // ƒNƒŠƒbƒNŒ^NPC
- class_ = atoi(w4);
- nd->u.scr.xs = 0;
- nd->u.scr.ys = 0;
- }
-
- while ((p = strchr(w3,':'))) {
- if (p[1] == ':') break;
- }
- if (p) {
- *p = 0;
- memcpy(nd->name, w3, NAME_LENGTH-1);
- memcpy(nd->exname, p+2, NAME_LENGTH-1);
- } else {
- memcpy(nd->name, w3, NAME_LENGTH-1);
- memcpy(nd->exname, w3, NAME_LENGTH-1);
- }
-
- if((dnd = npc_name2id(nd->exname))){
- if(battle_config.etc_log)
- ShowInfo("npc_parse_script: Overriding NPC '%s::%s' to '%s::%d'.. in file '%s' (Duplicated System Name - Lazy scripters >_>) \n",nd->name,nd->exname,nd->name,npc_script,file);
- sprintf(nd->exname, "%d", npc_script);
- }
-
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m = m;
- nd->bl.x = x;
- nd->bl.y = y;
- nd->bl.id = npc_get_new_npc_id();
- nd->class_ = class_;
- nd->speed = 200;
- nd->u.scr.script = script;
- nd->u.scr.src_id = src_id;
-
- npc_script++;
- nd->bl.type = BL_NPC;
- nd->bl.subtype = SCRIPT;
-
- for (i = 0; i < MAX_EVENTTIMER; i++)
- nd->eventtimer[i] = -1;
- if (m >= 0) {
- nd->n = map_addnpc(m, nd);
- status_change_init(&nd->bl);
- unit_dataset(&nd->bl);
- nd->ud.dir = dir;
- map_addblock(&nd->bl);
- // Unused. You can always use xxx::OnXXXX events. Have this removed to improve perfomance.
- /*if (evflag) { // ƒCƒxƒ“ƒgŒ^
- struct event_data *ev = (struct event_data *)aCalloc(1, sizeof(struct event_data));
- ev->nd = nd;
- ev->pos = 0;
- strdb_put(ev_db, nd->exname, ev);
- } else {
- clif_spawn(&nd->bl);
- }*/
- if (class_ >= 0){
- status_set_viewdata(&nd->bl, nd->class_);
- clif_spawn(&nd->bl);
- }
- } else {
- // we skip map_addnpc, but still add it to the list of ID's
- map_addiddb(&nd->bl);
- }
- strdb_put(npcname_db, nd->exname, nd);
-
- //-----------------------------------------
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚Ì€”õ
- if (srcbuf){
- // script–{‘Ì‚ª‚ ‚éꇂ̈—
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚̃Rƒ“ƒo[ƒg
- label_db = script_get_label_db();
- label_db->foreach(label_db, npc_convertlabel_db, nd);
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- aFree(srcbuf);
- } else {
- // duplicate
- nd->u.scr.label_list = label_dup; // ƒ‰ƒxƒ‹ƒf[ƒ^‹¤—L
- nd->u.scr.label_list_num = label_dupnum;
- }
-
- //-----------------------------------------
- // ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹ƒf[ƒ^‚̃GƒNƒXƒ|[ƒg
- for (i = 0; i < nd->u.scr.label_list_num; i++){
- char *lname = nd->u.scr.label_list[i].name;
- int pos = nd->u.scr.label_list[i].pos;
-
- if ((lname[0] == 'O' || lname[0] == 'o') && (lname[1] == 'N' || lname[1] == 'n')) {
- // this check is useless here because the buffer is only 24 chars
- // and already overwritten if this is here is reached
- // I leave the check anyway but place it correctly to npc_convertlabel_db
- if (strlen(lname)>NAME_LENGTH-1) {
- ShowError("npc_parse_script: label name longer than %d chars! '%s' (%s)\n", NAME_LENGTH-1, lname, file);
- exit(1);
- } else {
- struct event_data *ev;
- unsigned char buf[51];
- // 51 comes from: 24 for npc name + 24 for label + 2 for a "::" and 1 for EOS
- sprintf(buf,"%s::%s",nd->exname,lname);
-
- // remember the label is max 50 chars + eos; see the strdb_init below
- // generate the data and insert it
- ev=(struct event_data *)aMalloc(sizeof(struct event_data));
- ev->nd=nd;
- ev->pos=pos;
- if (strdb_put(ev_db,buf,ev) != NULL) //There was already another event of the same name?
- ShowWarning("npc_parse_script : duplicate event %s (%s)\n",buf, file);
- }
- }
- }
-
- //-----------------------------------------
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚©‚çƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽæ‚èž‚Ý
- for (i = 0; i < nd->u.scr.label_list_num; i++){
- int t = 0, k = 0;
- char *lname = nd->u.scr.label_list[i].name;
- int pos = nd->u.scr.label_list[i].pos;
- if (sscanf(lname, "OnTimer%d%n", &t, &k) == 1 && lname[k] == '\0') {
- // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
- struct npc_timerevent_list *te = nd->u.scr.timer_event;
- int j, k = nd->u.scr.timeramount;
- if (te == NULL)
- te = (struct npc_timerevent_list *)aMallocA(sizeof(struct npc_timerevent_list));
- else
- te = (struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) );
- for (j = 0; j < k; j++){
- if (te[j].timer > t){
- memmove(te+j+1, te+j, sizeof(struct npc_timerevent_list)*(k-j));
- break;
- }
- }
- te[j].timer = t;
- te[j].pos = pos;
- nd->u.scr.timer_event = te;
- nd->u.scr.timeramount++;
- }
- }
- nd->u.scr.timerid = -1;
-
- return 0;
-}
-
-/*==========================================
- * functions‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_function (char *w1, char *w2, char *w3, char *w4, char *first_line, FILE *fp, int *lines,const char* file)
-{
- unsigned char *srcbuf, *p;
- struct script_code *script;
- struct script_code *oldscript;
- int srcsize = 65536;
- int startline = 0;
- char line[1024];
- int curly_count = 0;
- struct dbt *user_db;
-
- // ƒXƒNƒŠƒvƒg‚̉ðÍ
- srcbuf = (unsigned char *) aMallocA (srcsize*sizeof(char));
- if (strchr(first_line,'{')) {
- strcpy(srcbuf, strchr(first_line,'{'));
- startline = *lines;
- } else
- srcbuf[0] = 0;
- npc_parse_script_line(srcbuf,&curly_count,*lines);
-
- while (curly_count > 0) {
- fgets(line, sizeof(line) - 1, fp);
- (*lines)++;
- npc_parse_script_line(line,&curly_count,*lines);
- if (feof(fp))
- break;
- if (strlen(srcbuf)+strlen(line)+1 >= (unsigned int)srcsize) {
- srcsize += 65536;
- srcbuf = (char *)aRealloc(srcbuf, srcsize);
- malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0]!='{') {
- if (strchr(line,'{')) {
- strcpy(srcbuf, strchr(line,'{'));
- startline = *lines;
- }
- } else
- strcat(srcbuf,line);
- }
- if(curly_count > 0) {
- ShowError("Missing right curly at file %s, line %d\n",file, *lines);
- script = NULL;
- } else {
- script = parse_script(srcbuf, file, startline);
- }
- if (script == NULL) {
- // script parse error?
- aFree(srcbuf);
- return 1;
- }
-
- p = (char *) aMallocA (50*sizeof(char));
- strncpy(p, w3, 50);
-
- user_db = script_get_userfunc_db();
- oldscript = (struct script_code *)strdb_get(user_db, p);
- if(oldscript != NULL) {
- printf("\r"); //Carriage return to clear the 'loading..' line. [Skotlex]
- ShowInfo("parse_function: Overwriting user function [%s] (%s:%d)\n", p, file, *lines);
- script_free_code(oldscript);
- user_db->remove(user_db,str2key(p));
- strdb_put(user_db, p, script);
- } else
- strdb_put(user_db, p, script);
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- aFree(srcbuf);
-
-// printf("function %s => %p\n",p,script);
-
- return 0;
-}
-
-
-/*==========================================
- * Parse Mob 1 - Parse mob list into each map
- * Parse Mob 2 - Actually Spawns Mob
- * [Wizputer]
- * If cached =1, it is a dynamic cached mob
- * index points to the index in the mob_list of the map_data cache.
- * -1 indicates that it is not stored on the map.
- *------------------------------------------
- */
-int npc_parse_mob2 (struct spawn_data *mob, int index)
-{
- int i;
- struct mob_data *md;
-
- for (i = 0; i < mob->num; i++) {
- md = mob_spawn_dataset(mob);
- md->spawn = mob;
- md->spawn_n = index;
- md->special_state.cached = (index>=0); //If mob is cached on map, it is dynamically removed
- mob_spawn(md);
- }
-
- return 1;
-}
-
-int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
-{
- int level, num, class_, mode, x,y,xs,ys;
- char mapname[MAP_NAME_LENGTH];
- char mobname[NAME_LENGTH];
- struct spawn_data mob, *data;
-
- malloc_set(&mob, 0, sizeof(struct spawn_data));
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%15[^,],%d,%d,%d,%d", mapname, &x, &y, &xs, &ys) < 3 ||
- sscanf(w4, "%d,%d,%u,%u,%49[^\r\n]", &class_, &num, &mob.delay1, &mob.delay2, mob.eventname) < 2 ) {
- ShowError("bad monster line : %s %s %s (file %s)\n", w1, w3, w4, current_file);
- return 1;
- }
- if (!mapindex_name2id(mapname)) {
- ShowError("wrong map name : %s %s (file %s)\n", w1,w3, current_file);
- return 1;
- }
- mode = map_mapname2mapid(mapname);
- if (mode < 0) //Not loaded on this map-server instance.
- return 1;
- mob.m = (unsigned short)mode;
-
- if (x < 0 || map[mob.m].xs <= x || y < 0 || map[mob.m].ys <= y) {
- ShowError("Out of range spawn coordinates: %s (%d,%d), map size is (%d,%d) - %s %s (file %s)\n", map[mob.m].name, x, y, map[mob.m].xs-1, map[mob.m].ys-1, w1,w3, current_file);
- return 1;
- }
-
- // check monster ID if exists!
- if (mobdb_checkid(class_)==0) {
- ShowError("bad monster ID : %s %s (file %s)\n", w3, w4, current_file);
- return 1;
- }
-
- if (num < 1 || num>1000 ) {
- ShowError("wrong number of monsters : %s %s (file %s)\n", w3, w4, current_file);
- return 1;
- }
-
- mob.num = (unsigned short)num;
- mob.class_ = (short) class_;
- mob.x = (unsigned short)x;
- mob.y = (unsigned short)y;
- mob.xs = (signed short)xs;
- mob.ys = (signed short)ys;
-
- if (mob.num > 1 && battle_config.mob_count_rate != 100) {
- if ((mob.num = mob.num * battle_config.mob_count_rate / 100) < 1)
- mob.num = 1;
- }
-
- if (battle_config.force_random_spawn || (mob.x == 0 && mob.y == 0))
- { //Force a random spawn anywhere on the map.
- mob.x = mob.y = 0;
- mob.xs = mob.ys = -1;
- }
-
- //Apply the spawn delay fix [Skotlex]
- mode = mob_db(class_)->status.mode;
- if (mode & MD_BOSS) { //Bosses
- if (battle_config.boss_spawn_delay != 100)
- {
- mob.delay1 = mob.delay1*battle_config.boss_spawn_delay/100;
- mob.delay2 = mob.delay2*battle_config.boss_spawn_delay/100;
- }
- } else if (mode&MD_PLANT) { //Plants
- if (battle_config.plant_spawn_delay != 100)
- {
- mob.delay1 = mob.delay1*battle_config.plant_spawn_delay/100;
- mob.delay2 = mob.delay2*battle_config.plant_spawn_delay/100;
- }
- } else if (battle_config.mob_spawn_delay != 100)
- { //Normal mobs
- mob.delay1 = mob.delay1*battle_config.mob_spawn_delay/100;
- mob.delay2 = mob.delay2*battle_config.mob_spawn_delay/100;
- }
-
- // parse MOB_NAME,[MOB LEVEL]
- if (sscanf(w3, "%23[^,],%d", mobname, &level) > 1)
- mob.level = level;
-
- if(mob.delay1>0xfffffff || mob.delay2>0xfffffff) {
- ShowError("wrong monsters spawn delays : %s %s (file %s)\n", w3, w4, current_file);
- return 1;
- }
-
- //Use db names instead of the spawn file ones.
- if(battle_config.override_mob_names==1)
- strcpy(mob.name,"--en--");
- else if (battle_config.override_mob_names==2)
- strcpy(mob.name,"--ja--");
- else
- strncpy(mob.name, mobname, NAME_LENGTH-1);
-
- if (!mob_parse_dataset(&mob)) //Verify dataset.
- return 1;
-
- //Now that all has been validated. We allocate the actual memory
- //that the re-spawn data will use.
- data = aMalloc(sizeof(struct spawn_data));
- memcpy(data, &mob, sizeof(struct spawn_data));
-
- if( !battle_config.dynamic_mobs || mob.delay1 || mob.delay2 ) {
- npc_parse_mob2(data,-1);
- npc_delay_mob += mob.num;
- } else {
- int index = map_addmobtolist(data->m, data);
- if( index >= 0 ) {
- // check if target map has players
- // (usually shouldn't occur when map server is just starting,
- // but not the case when we do @reloadscript
- if (map[mob.m].users > 0)
- npc_parse_mob2(data,index);
- npc_cache_mob += mob.num;
- } else {
- // mobcache is full
- // create them as delayed with one second
- mob.delay1 = 1000;
- mob.delay2 = 1000;
- npc_parse_mob2(data,-1);
- npc_delay_mob += mob.num;
- }
- }
-
- npc_mob++;
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvƒtƒ‰ƒOs‚̉ðÍ
- *------------------------------------------
- */
-static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
-{
- int m;
- char mapname[MAP_NAME_LENGTH];
- int state = 1;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%15[^,]",mapname) != 1)
- return 1;
-
- m = map_mapname2mapid(mapname);
- if (m < 0)
- return 1;
- if (w4 && strcmpi(w4, "off") == 0)
- state = 0; //Disable mapflag rather than enable it. [Skotlex]
-
-//ƒ}ƒbƒvƒtƒ‰ƒO
- if (strcmpi(w3, "nosave") == 0) {
- char savemap[MAP_NAME_LENGTH];
- int savex, savey;
- if (state == 0)
- ; //Map flag disabled.
- else if (strcmp(w4, "SavePoint") == 0) {
- map[m].save.map = 0;
- map[m].save.x = -1;
- map[m].save.y = -1;
- } else if (sscanf(w4, "%15[^,],%d,%d", savemap, &savex, &savey) == 3) {
- map[m].save.map = mapindex_name2id(savemap);
- map[m].save.x = savex;
- map[m].save.y = savey;
- if (!map[m].save.map) {
- ShowWarning("Specified save point map '%s' for mapflag 'nosave' not found (file %s), using 'SavePoint'.\n",savemap,current_file);
- map[m].save.x = -1;
- map[m].save.y = -1;
- }
- }
- map[m].flag.nosave = state;
- }
- else if (strcmpi(w3,"nomemo")==0) {
- map[m].flag.nomemo=state;
- }
- else if (strcmpi(w3,"noteleport")==0) {
- map[m].flag.noteleport=state;
- }
- else if (strcmpi(w3,"nowarp")==0) {
- map[m].flag.nowarp=state;
- }
- else if (strcmpi(w3,"nowarpto")==0) {
- map[m].flag.nowarpto=state;
- }
- else if (strcmpi(w3,"noreturn")==0) {
- map[m].flag.noreturn=state;
- }
- else if (strcmpi(w3,"monster_noteleport")==0) {
- map[m].flag.monster_noteleport=state;
- }
- else if (strcmpi(w3,"nobranch")==0) {
- map[m].flag.nobranch=state;
- }
- else if (strcmpi(w3,"nopenalty")==0) {
- map[m].flag.noexppenalty=state;
- map[m].flag.nozenypenalty=state;
- }
- else if (strcmpi(w3,"pvp")==0) {
- map[m].flag.pvp=state;
- if (state) {
- map[m].flag.gvg=0;
- map[m].flag.gvg=0;
- map[m].flag.gvg_dungeon=0;
- map[m].flag.gvg_castle=0;
- }
- }
- else if (strcmpi(w3,"pvp_noparty")==0) {
- map[m].flag.pvp_noparty=state;
- }
- else if (strcmpi(w3,"pvp_noguild")==0) {
- map[m].flag.pvp_noguild=state;
- }
- else if (strcmpi(w3, "pvp_nightmaredrop") == 0) {
- char drop_arg1[16], drop_arg2[16];
- int drop_id = 0, drop_type = 0, drop_per = 0;
- if (sscanf(w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) == 3) {
- int i;
- if (strcmp(drop_arg1, "random") == 0)
- drop_id = -1;
- else if (itemdb_exists((drop_id = atoi(drop_arg1))) == NULL)
- drop_id = 0;
- if (strcmp(drop_arg2, "inventory") == 0)
- drop_type = 1;
- else if (strcmp(drop_arg2,"equip") == 0)
- drop_type = 2;
- else if (strcmp(drop_arg2,"all") == 0)
- drop_type = 3;
-
- if (drop_id != 0){
- for (i = 0; i < MAX_DROP_PER_MAP; i++) {
- if (map[m].drop_list[i].drop_id == 0){
- map[m].drop_list[i].drop_id = drop_id;
- map[m].drop_list[i].drop_type = drop_type;
- map[m].drop_list[i].drop_per = drop_per;
- break;
- }
- }
- map[m].flag.pvp_nightmaredrop = 1;
- }
- } else if (!state) //Disable
- map[m].flag.pvp_nightmaredrop = 0;
- }
- else if (strcmpi(w3,"pvp_nocalcrank")==0) {
- map[m].flag.pvp_nocalcrank=state;
- }
- else if (strcmpi(w3,"gvg")==0) {
- map[m].flag.gvg=state;
- if (state) map[m].flag.pvp=0;
- }
- else if (strcmpi(w3,"gvg_noparty")==0) {
- map[m].flag.gvg_noparty=state;
- }
- else if (strcmpi(w3,"gvg_dungeon")==0) {
- map[m].flag.gvg_dungeon=state;
- if (state) map[m].flag.pvp=0;
- }
- else if (strcmpi(w3,"gvg_castle")==0) {
- map[m].flag.gvg_castle=state;
- if (state) map[m].flag.pvp=0;
- }
- else if (strcmpi(w3,"noexppenalty")==0) {
- map[m].flag.noexppenalty=state;
- }
- else if (strcmpi(w3,"nozenypenalty")==0) {
- map[m].flag.nozenypenalty=state;
- }
- else if (strcmpi(w3,"notrade")==0) {
- map[m].flag.notrade=state;
- }
- else if (strcmpi(w3,"novending")==0) {
- map[m].flag.novending=state;
- }
- else if (strcmpi(w3,"nodrop")==0) {
- map[m].flag.nodrop=state;
- }
- else if (strcmpi(w3,"noskill")==0) {
- map[m].flag.noskill=state;
- }
- else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
- map[m].flag.noicewall=state;
- }
- else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
- map[m].flag.snow=state;
- }
- else if (strcmpi(w3,"clouds")==0) {
- map[m].flag.clouds=state;
- }
- else if (strcmpi(w3,"clouds2")==0) { // clouds2 [Valaris]
- map[m].flag.clouds2=state;
- }
- else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
- map[m].flag.fog=state;
- }
- else if (strcmpi(w3,"fireworks")==0) {
- map[m].flag.fireworks=state;
- }
- else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
- map[m].flag.sakura=state;
- }
- else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
- map[m].flag.leaves=state;
- }
- else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
- map[m].flag.rain=state;
- }
- else if (strcmpi(w3,"indoors")==0) { // celest
- map[m].flag.indoors=state;
- }
- else if (strcmpi(w3,"nightenabled")==0) { // Skotlex
- map[m].flag.nightenabled=state;
- }
- else if (strcmpi(w3,"nogo")==0) { // celest
- map[m].flag.nogo=state;
- }
- else if (strcmpi(w3,"noexp")==0) { // Lorky
- map[m].flag.nobaseexp=state;
- map[m].flag.nojobexp=state;
- }
- else if (strcmpi(w3,"nobaseexp")==0) { // Lorky
- map[m].flag.nobaseexp=state;
- }
- else if (strcmpi(w3,"nojobexp")==0) { // Lorky
- map[m].flag.nojobexp=state;
- }
- else if (strcmpi(w3,"noloot")==0) { // Lorky
- map[m].flag.nomobloot=state;
- map[m].flag.nomvploot=state;
- }
- else if (strcmpi(w3,"nomobloot")==0) { // Lorky
- map[m].flag.nomobloot=state;
- }
- else if (strcmpi(w3,"nomvploot")==0) { // Lorky
- map[m].flag.nomvploot=state;
- }
- else if (strcmpi(w3,"nocommand")==0) { // Skotlex
- if (state) {
- if (sscanf(w4, "%d", &state) == 1)
- map[m].nocommand =state;
- else //No level specified, block everyone.
- map[m].nocommand =100;
- } else
- map[m].nocommand=0;
- }
- else if (strcmpi(w3,"restricted")==0) { // Komurka
- if (state) {
- map[m].flag.restricted=1;
- sscanf(w4, "%d", &state);
- map[m].zone |= 1<<(state+1);
- } else {
- map[m].flag.restricted=0;
- map[m].zone = 0;
- }
- }
- else if (strcmpi(w3,"jexp")==0) {
- map[m].jexp = (state) ? atoi(w4) : 100;
- if( map[m].jexp < 0 ) map[m].jexp = 100;
- map[m].flag.nojobexp = (map[m].jexp==0)?1:0;
- }
- else if (strcmpi(w3,"bexp")==0) {
- map[m].bexp = (state) ? atoi(w4) : 100;
- if( map[m].bexp < 0 ) map[m].bexp = 100;
- map[m].flag.nobaseexp = (map[m].bexp==0)?1:0;
- }
- else if (strcmpi(w3,"loadevent")==0) { // Skotlex
- map[m].flag.loadevent=state;
- }
- else if (strcmpi(w3,"nochat")==0) { // Skotlex
- map[m].flag.nochat=state;
- }
- else if (strcmpi(w3,"partylock")==0) { // Skotlex
- map[m].flag.partylock=state;
- }
- else if (strcmpi(w3,"guildlock")==0) { // Skotlex
- map[m].flag.guildlock=state;
- }
-
- return 0;
-}
-
-/*==========================================
- * Setting up map cells
- *------------------------------------------
- */
-static int npc_parse_mapcell (char *w1, char *w2, char *w3, char *w4)
-{
- int m, cell, x, y, x0, y0, x1, y1;
- char type[24], mapname[MAP_NAME_LENGTH];
-
- if (sscanf(w1, "%15[^,]", mapname) != 1)
- return 1;
-
- m = map_mapname2mapid(mapname);
- if (m < 0)
- return 1;
-
- if (sscanf(w3, "%23[^,],%d,%d,%d,%d", type, &x0, &y0, &x1, &y1) < 4) {
- ShowError("Bad setcell line : %s\n",w3);
- return 1;
- }
- cell = strtol(type, (char **)NULL, 0);
- //printf ("0x%x %d %d %d %d\n", cell, x0, y0, x1, y1);
-
- if (x0 > x1) { int t = x0; x0 = x1; x1 = t; }
- if (y0 > y1) { int t = y0; y0 = y1; y1 = t; }
-
- for (x = x0; x <= x1; x++) {
- for (y = y0; y <= y1; y++) {
- map_setcell(m, x, y, cell);
- //printf ("setcell 0x%x %d %d %d\n", cell, m, x, y);
- }
- }
-
- return 0;
-}
-
-void npc_parsesrcfile (char *name)
-{
- int m, lines = 0;
- char line[2048];
-
- FILE *fp = fopen (name,"r");
- if (fp == NULL) {
- ShowError ("File not found : %s\n", name);
- return;
- }
- current_file = name;
-
- while (fgets(line, sizeof(line) - 1, fp)) {
- char w1[2048], w2[2048], w3[2048], w4[2048], mapname[2048];
- int i, w4pos, count;
- lines++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (!sscanf(line, " %n", &i) && i == strlen(line)) // just whitespace
- continue;
-
- // ʼn‚̓^ƒu‹æØ‚è‚Ń`ƒFƒbƒN‚µ‚Ä‚Ý‚ÄAƒ_ƒ‚È‚çƒXƒy[ƒX‹æØ‚è‚ÅŠm”F
- w1[0] = w2[0] = w3[0] = w4[0] = '\0'; //It's best to initialize values
- //to prevent passing previously parsed values to the parsers when not all
- //fields are specified. [Skotlex]
- if ((count = sscanf(line, "%[^\t\r\n]\t%[^\t\r\n]\t%[^\t\r\n]\t%n%[^\r\n]", w1, w2, w3, &w4pos, w4)) < 3)
- {
- if ((count = sscanf(line, "%s %s %[^\t]\t %n%[^\n]", w1, w2, w3, &w4pos, w4)) == 4 ||
- (count = sscanf(line, "%s %s %s %n%[^\n]\n", w1, w2, w3, &w4pos, w4)) >= 3)
- {
- ShowWarning("\r");
- ShowWarning("Incorrect separator syntax in file '%s', line '%i'. Use tabs instead of spaces!\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
- } else {
- ShowError("\r"); //Erase the npc spinner.
- ShowError("Could not parse file '%s', line '%i'.\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
- continue;
- }
- }
-
- // ƒ}ƒbƒv‚Ì‘¶ÝŠm”F
- if (strcmp(w1,"-") !=0 && strcmpi(w1,"function") != 0 ){
- sscanf(w1,"%[^,]",mapname);
- if (!mapindex_name2id(mapname)) { //Incorrect map
- ShowError("Invalid map '%s' in line %d, file %s\n", mapname, lines, current_file);
- if (strcmpi(w2,"script") == 0 && count > 3) //we must skip the script info...
- npc_skip_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
- continue;
- }
- if ((m = map_mapname2mapid(mapname)) < 0) {
- // "mapname" is not assigned to this server
- // we must skip the script info...
- if (strcmpi(w2,"script") == 0 && count > 3)
- npc_skip_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
- continue;
- }
- }
- if (strcmpi(w2,"warp") == 0 && count > 3) {
- npc_parse_warp(w1,w2,w3,w4);
- } else if (strcmpi(w2,"shop") == 0 && count > 3) {
- npc_parse_shop(w1,w2,w3,w4);
- } else if (strcmpi(w2,"script") == 0 && count > 3) {
- if (strcmpi(w1,"function") == 0) {
- npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
- } else {
- npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
- }
- } else if ((i = 0, sscanf(w2,"duplicate%n",&i), (i > 0 && w2[i] == '(')) && count > 3) {
- npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
- } else if (strcmpi(w2,"monster") == 0 && count > 3) {
- npc_parse_mob(w1,w2,w3,w4);
- } else if (strcmpi(w2,"mapflag") == 0 && count >= 3) {
- npc_parse_mapflag(w1,w2,w3,w4);
- } else if (strcmpi(w2,"setcell") == 0 && count >= 3) {
- npc_parse_mapcell(w1,w2,w3,w4);
- } else {
- ShowError("Probably TAB is missing in file '%s', line '%i':\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
- }
- }
- fclose(fp);
-
- return;
-}
-
-int npc_script_event(TBL_PC* sd, int type) {
- int i;
- if (type < 0 || type >= NPCE_MAX)
- return 0;
- if (!sd) {
- if (battle_config.error_log)
- ShowError("npc_script_event: NULL sd. Event Type %d\n", type);
- return 0;
- }
- if (script_event[type].nd) {
- TBL_NPC *nd = script_event[type].nd;
- run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
- return 1;
- } else if (script_event[type].event_count) {
- for (i = 0; i<script_event[type].event_count; i++) {
- npc_event_sub(sd,script_event[type].event[i],script_event[type].event_name[i]);
- }
- return i;
- }
- return 0;
-}
-
-static int npc_read_event_script_sub(DBKey key,void *data,va_list ap)
-{
- unsigned char *p = key.str;
- unsigned char *name = va_arg(ap,unsigned char *);
- struct event_data **event_buf = va_arg(ap,struct event_data**);
- unsigned char **event_name = va_arg(ap,unsigned char **);
- unsigned char *count = va_arg(ap,char *);;
-
- if (*count >= UCHAR_MAX) return 0;
-
- if((p=strchr(p,':')) && p && strcmpi(name,p)==0 )
- {
- event_buf[*count] = (struct event_data *)data;
- event_name[*count] = key.str;
- (*count)++;
- return 1;
- }
- return 0;
-}
-
-static void npc_read_event_script(void)
-{
- int i;
- unsigned char buf[64]="::";
- struct {
- char *name;
- char *event_name;
- } config[] = {
- {"Login Event",script_config.login_event_name},
- {"Logout Event",script_config.logout_event_name},
- {"Load Map Event",script_config.loadmap_event_name},
- {"Base LV Up Event",script_config.baselvup_event_name},
- {"Job LV Up Event",script_config.joblvup_event_name},
- {"Die Event",script_config.die_event_name},
- {"Kill PC Event",script_config.kill_pc_event_name},
- {"Kill NPC Event",script_config.kill_mob_event_name},
- };
-
- for (i = 0; i < NPCE_MAX; i++) {
- if (script_event[i].nd)
- script_event[i].nd = NULL;
- if (script_event[i].event_count)
- script_event[i].event_count = 0;
- if (!script_config.event_script_type) {
- //Use a single NPC as event source.
- script_event[i].nd = npc_name2id(config[i].event_name);
- } else {
- //Use an array of Events
- strncpy(buf+2,config[i].event_name,62);
- ev_db->foreach(ev_db,npc_read_event_script_sub,buf,
- &script_event[i].event,
- &script_event[i].event_name,
- &script_event[i].event_count);
- }
- }
- if (battle_config.etc_log) {
- //Print summary.
- for (i = 0; i < NPCE_MAX; i++) {
- if(!script_config.event_script_type) {
- if (script_event[i].nd)
- ShowInfo("%s: Using NPC named '%s'.\n", config[i].name, config[i].event_name);
- else
- ShowInfo("%s: No NPC found with name '%s'.\n", config[i].name, config[i].event_name);
- } else
- ShowInfo("%s: %d '%s' events.\n", config[i].name, script_event[i].event_count, config[i].event_name);
- }
- }
-}
-static int npc_read_indoors (void)
-{
- char *buf, *p;
- int s, m;
-
- buf = (char *)grfio_reads("data\\indoorrswtable.txt",&s);
- if (buf == NULL)
- return -1;
- buf[s] = 0;
-
- for (p = buf; p - buf < s; ) {
- char map_name[64];
- if (sscanf(p, "%15[^#]#", map_name) == 1) {
- size_t pos = strlen(map_name) - 4; // replace '.xxx' extension
- memcpy(map_name+pos,".gat",4); // with '.gat'
- if ((m = map_mapname2mapid(map_name)) >= 0)
- map[m].flag.indoors = 1;
- }
-
- p = strchr(p, 10);
- if (!p) break;
- p++;
- }
- aFree(buf);
- ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\indoorrswtable.txt");
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-
-static int npc_cleanup_sub (struct block_list *bl, va_list ap) {
- nullpo_retr(0, bl);
-
- switch(bl->type) {
- case BL_NPC:
- npc_unload((struct npc_data *)bl);
- break;
- case BL_MOB:
- //This is used only on reloading npcs, so let's not free spawn-once mobs. [Skotlex]
- if (((TBL_MOB*)bl)->spawn)
- unit_free(bl,0);
- break;
- }
-
- return 0;
-}
-
-static int npc_cleanup_dbsub(DBKey key,void * data,va_list ap) {
- return npc_cleanup_sub((struct block_list*)data, 0);
-}
-
-int npc_reload (void)
-{
- struct npc_src_list *nsl;
- int m, i;
- time_t last_time = time(0);
- int busy = 0, npc_new_min = npc_id;
- char c = '-';
-
- //Remove all npcs/mobs. [Skotlex]
- map_foreachiddb(npc_cleanup_dbsub);
- for (m = 0; m < map_num; m++) {
- if(battle_config.dynamic_mobs) { //dynamic check by [random]
- for (i = 0; i < MAX_MOB_LIST_PER_MAP; i++)
- if (map[m].moblist[i]) aFree(map[m].moblist[i]);
- malloc_set (map[m].moblist, 0, sizeof(map[m].moblist));
- }
- if (map[m].npc_num > 0 && battle_config.error_log)
- ShowWarning("npc_reload: %d npcs weren't removed at map %s!\n", map[m].npc_num, map[m].name);
- }
-
- // anything else we should cleanup?
- // Reloading npc's now
- ev_db->clear(ev_db,NULL);
- npcname_db->clear(npcname_db,NULL);
- npc_warp = npc_shop = npc_script = 0;
- npc_mob = npc_cache_mob = npc_delay_mob = 0;
-
- for (nsl = npc_src_first; nsl; nsl = nsl->next) {
- npc_parsesrcfile(nsl->name);
- if (script_config.verbose_mode) {
- printf("\r");
- ShowStatus("Loading NPCs... %-53s", nsl->name);
- } else {
- if (last_time != time(0)) {
- printf("\r");
- ShowStatus("Loading NPCs... Working: ");
- last_time = time(0);
- switch(busy) {
- case 0: c='\\'; busy++; break;
- case 1: c='|'; busy++; break;
- case 2: c='/'; busy++; break;
- case 3: c='-'; busy=0;
- }
- printf("[%c]",c);
- }
- }
- fflush(stdout);
- }
- printf("\r");
- ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
- CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
- CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
- CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs Cached\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs Not Cached\n",
- npc_id - npc_new_min, "", npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
-
- //Re-read the NPC Script Events cache.
- npc_read_event_script();
-
- //Execute the OnInit event for freshly loaded npcs. [Skotlex]
- ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
- CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
- // Execute rest of the startup events if connected to char-server. [Lance]
- if(!CheckForCharServer()){
- ShowStatus("Event '"CL_WHITE"OnCharIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnCharIfInit"));
- ShowStatus("Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
- ShowStatus("Event '"CL_WHITE"OnInterIfInitOnce"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInitOnce"));
- }
- return 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_npc(void)
-{
- int i;
- struct block_list *bl;
-
- for (i = START_NPC_NUM; i < npc_id; i++){
- if ((bl = map_id2bl(i))){
- if (bl->type == BL_NPC)
- npc_unload((struct npc_data *)bl);
- else if (bl->type&(BL_MOB|BL_PET))
- unit_free(bl, 0);
- }
- }
-
- ev_db->destroy(ev_db, NULL);
- //There is no free function for npcname_db because at this point there shouldn't be any npcs left!
- //So if there is anything remaining, let the memory manager catch it and report it.
- npcname_db->destroy(npcname_db, NULL);
- ers_destroy(timer_event_ers);
- npc_clearsrcfile();
-
- return 0;
-}
-
-static void npc_debug_warps_sub(struct npc_data *nd)
-{
- int m;
- if (nd->bl.type != BL_NPC || nd->bl.subtype != WARP || nd->bl.m < 0)
- return;
-
- m = map_mapindex2mapid(nd->u.warp.mapindex);
- if (m < 0) return; //Warps to another map, nothing to do about it.
-
- if (map_getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNPC)) {
- ShowWarning("Warp %s at %s(%d,%d) warps directly on top of an area npc at %s(%d,%d)\n",
- nd->name,
- map[nd->bl.m].name, nd->bl.x, nd->bl.y,
- map[m].name, nd->u.warp.x, nd->u.warp.y
- );
- }
- if (map_getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNOPASS)) {
- ShowWarning("Warp %s at %s(%d,%d) warps to a non-walkable tile at %s(%d,%d)\n",
- nd->name,
- map[nd->bl.m].name, nd->bl.x, nd->bl.y,
- map[m].name, nd->u.warp.x, nd->u.warp.y
- );
- }
-}
-
-static void npc_debug_warps(void)
-{
- int m, i;
- for (m = 0; m < map_num; m++)
- for (i = 0; i < map[m].npc_num; i++)
- npc_debug_warps_sub(map[m].npc[i]);
-}
-
-/*==========================================
- * npc‰Šú‰»
- *------------------------------------------
- */
-int do_init_npc(void)
-{
- struct npc_src_list *nsl;
- time_t last_time = time(0);
- int busy, i;
- char c = '-';
-
- //Stock view data for normal npcs.
- malloc_set(&npc_viewdb, 0, sizeof(npc_viewdb));
- npc_viewdb[0].class_ = INVISIBLE_CLASS; //Invisible class is stored here.
- for (busy = 1; busy < MAX_NPC_CLASS; busy++)
- npc_viewdb[busy].class_ = busy;
- busy = 0;
- // indoorrswtable.txt and etcinfo.txt [Celest]
- if (battle_config.indoors_override_grffile)
- npc_read_indoors();
-
- // comparing only the first 24 chars of labels that are 50 chars long isn't that nice
- // will cause "duplicated" labels where actually no dup is...
- ev_db = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA,51);
- npcname_db = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_BASE,NAME_LENGTH);
-
- malloc_set(&ev_tm_b, -1, sizeof(ev_tm_b));
- timer_event_ers = ers_new((uint32)sizeof(struct timer_event_data));
-
- for (nsl = npc_src_first; nsl; nsl = nsl->next) {
- npc_parsesrcfile(nsl->name);
- current_file = NULL;
- printf("\r");
- if (script_config.verbose_mode)
- ShowStatus ("Loading NPCs... %-53s", nsl->name);
- else {
- ShowStatus("Loading NPCs... Working: ");
- if (last_time != time(0)) {
- last_time = time(0);
- switch(busy) {
- case 0: c='\\'; busy++; break;
- case 1: c='|'; busy++; break;
- case 2: c='/'; busy++; break;
- case 3: c='-'; busy=0;
- }
- }
- printf("[%c]",c);
- }
- fflush(stdout);
- }
- printf("\r");
- ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
- CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
- CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
- CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs Cached\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs Not Cached\n",
- npc_id - START_NPC_NUM, "", npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
-
- malloc_set(script_event, 0, sizeof(script_event));
- npc_read_event_script();
- //Debug function to locate all endless loop warps.
- if (battle_config.warp_point_debug)
- npc_debug_warps();
-
- add_timer_func_list(npc_event_timer,"npc_event_timer");
- add_timer_func_list(npc_event_do_clock,"npc_event_do_clock");
- add_timer_func_list(npc_timerevent,"npc_timerevent");
-
- // Init dummy NPC
- fake_nd = (struct npc_data *)aCalloc(sizeof(struct npc_data),1);
- fake_nd->bl.prev = fake_nd->bl.next = NULL;
- fake_nd->bl.m = -1;
- fake_nd->bl.x = 0;
- fake_nd->bl.y = 0;
- fake_nd->bl.id = npc_get_new_npc_id();
- fake_nd->class_ = -1;
- fake_nd->speed = 200;
- fake_nd->u.scr.script = NULL;
- fake_nd->u.scr.src_id = 0;
- fake_nd->chatdb = NULL;
- for (i = 0; i < MAX_EVENTTIMER; i++)
- fake_nd->eventtimer[i] = -1;
- strcpy(fake_nd->name,"FAKE_NPC");
- memcpy(fake_nd->exname, fake_nd->name, 9);
-
- npc_script++;
- fake_nd->bl.type = BL_NPC;
- fake_nd->bl.subtype = SCRIPT;
-
- strdb_put(npcname_db, fake_nd->exname, fake_nd);
- fake_nd->u.scr.timerid = -1;
- map_addiddb(&fake_nd->bl);
- // End of initialization
-
- return 0;
-}
-// [Lance]
-int npc_changename(const char *name, const char *newname, short look){
- struct npc_data *nd= (struct npc_data *) strdb_remove(npcname_db,(unsigned char*)name);
- if (nd==NULL)
- return 0;
- npc_enable(name,0);
- strcpy(nd->name,newname);
- nd->class_ = look;
- npc_enable(newname,1);
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <limits.h>
+
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/grfio.h"
+#include "../common/showmsg.h"
+#include "../common/ers.h"
+#include "../common/db.h"
+#include "map.h"
+#include "log.h"
+#include "npc.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "status.h"
+#include "itemdb.h"
+#include "script.h"
+#include "mob.h"
+#include "pet.h"
+#include "battle.h"
+#include "skill.h"
+#include "unit.h"
+
+#ifdef _WIN32
+#undef isspace
+#define isspace(x) (x == ' ' || x == '\t')
+#endif
+
+struct npc_src_list {
+ struct npc_src_list * next;
+// struct npc_src_list * prev; //[Shinomori]
+ char name[4];
+};
+
+static struct npc_src_list *npc_src_first=NULL;
+static struct npc_src_list *npc_src_last=NULL;
+static int npc_id=START_NPC_NUM;
+static int npc_warp=0;
+static int npc_shop=0;
+static int npc_script=0;
+static int npc_mob=0;
+static int npc_delay_mob=0;
+static int npc_cache_mob=0;
+char *current_file = NULL;
+int npc_get_new_npc_id(void){ return npc_id++; }
+
+static struct dbt *ev_db;
+static struct dbt *npcname_db;
+
+struct event_data {
+ struct npc_data *nd;
+ int pos;
+};
+static struct tm ev_tm_b; // ŽžŒvƒCƒxƒ“ƒg—p
+
+static struct eri *timer_event_ers; //For the npc timer data. [Skotlex]
+
+//For holding the view data of npc classes. [Skotlex]
+static struct view_data npc_viewdb[MAX_NPC_CLASS];
+
+static struct
+{ //Holds pointers to the commonly executed scripts for speedup. [Skotlex]
+ struct npc_data *nd;
+ struct event_data *event[UCHAR_MAX];
+ unsigned char *event_name[UCHAR_MAX];
+ unsigned char event_count;
+} script_event[NPCE_MAX];
+
+struct view_data* npc_get_viewdata(int class_)
+{ //Returns the viewdata for normal npc classes.
+ if (class_ == INVISIBLE_CLASS)
+ return &npc_viewdb[0];
+ if (npcdb_checkid(class_) || class_ == WARP_CLASS)
+ return &npc_viewdb[class_];
+ return NULL;
+}
+/*==========================================
+ * NPC‚Ì–³Œø‰»/—LŒø‰»
+ * npc_enable
+ * npc_enable_sub —LŒøŽž‚ÉOnTouchƒCƒxƒ“ƒg‚ðŽÀs
+ *------------------------------------------
+ */
+int npc_enable_sub( struct block_list *bl, va_list ap )
+{
+ struct map_session_data *sd;
+ struct npc_data *nd;
+ //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
+ if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
+ char name[50]; // need 24 + 9 for the "::OnTouch"
+
+ if (nd->sc.option&OPTION_INVISIBLE) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ return 1;
+
+ if(sd->areanpc_id==nd->bl.id)
+ return 1;
+ sd->areanpc_id=nd->bl.id;
+
+ snprintf(name, 50, "%s::OnTouch", nd->exname); // exname to be specific. exname is the unique identifier for script events. [Lance]
+ npc_event(sd,name,0);
+ }
+ //aFree(name);
+ return 0;
+}
+int npc_enable(const char *name,int flag)
+{
+ struct npc_data *nd= strdb_get(npcname_db,(unsigned char*)name);
+ if (nd==NULL)
+ return 0;
+
+ if (flag&1)
+ nd->sc.option&=~OPTION_INVISIBLE;
+ else if (flag&2)
+ nd->sc.option&=~OPTION_HIDE;
+ else if (flag&4)
+ nd->sc.option|= OPTION_HIDE;
+ else //Can't change the view_data to invisible class because the view_data for all npcs is shared! [Skotlex]
+ nd->sc.option|= OPTION_INVISIBLE;
+
+ if (nd->class_ == WARP_CLASS)
+ { //Client won't display option changes for warp portals [Toms]
+ if (nd->sc.option&(OPTION_HIDE|OPTION_INVISIBLE))
+ clif_clearchar(&nd->bl, 0);
+ else
+ clif_spawn(&nd->bl);
+ } else
+ clif_changeoption(&nd->bl);
+
+ if(flag&3 && (nd->u.scr.xs > 0 || nd->u.scr.ys >0))
+ map_foreachinarea( npc_enable_sub,nd->bl.m,nd->bl.x-nd->u.scr.xs,nd->bl.y-nd->u.scr.ys,nd->bl.x+nd->u.scr.xs,nd->bl.y+nd->u.scr.ys,BL_PC,nd);
+
+ return 0;
+}
+
+/*==========================================
+ * NPC‚𖼑O‚Å’T‚·
+ *------------------------------------------
+ */
+struct npc_data* npc_name2id(const char *name)
+{
+ return (struct npc_data *) strdb_get(npcname_db,(unsigned char*)name);
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
+ *------------------------------------------
+ */
+int npc_event_dequeue(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if (!sd->eventqueue[0][0])
+ return 0; //Nothing to dequeue
+
+ if (!pc_addeventtimer(sd,100,sd->eventqueue[0]))
+ { //Failed to dequeue, couldn't set a timer.
+ ShowWarning("npc_event_dequeue: event timer is full !\n");
+ return 0;
+ }
+ //Event dequeued successfully, shift other elements.
+ sd->npc_id=0; //FIXME: Shouldn't dequeueing fail when you have an npc_id set?
+ memmove(sd->eventqueue[0], sd->eventqueue[1], (MAX_EVENTQUEUE-1)*sizeof(sd->eventqueue[0]));
+ sd->eventqueue[MAX_EVENTQUEUE-1][0]=0;
+ return 1;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒg‚Ì’x‰„ŽÀs
+ *------------------------------------------
+ */
+int npc_event_timer(int tid,unsigned int tick,int id,int data)
+{
+ unsigned char *eventname = (unsigned char *)data;
+ struct event_data *ev = strdb_get(ev_db,eventname);
+ struct npc_data *nd;
+ struct map_session_data *sd=map_id2sd(id);
+ size_t i;
+
+ if((ev==NULL || (nd=ev->nd)==NULL))
+ {
+ if(battle_config.error_log)
+ ShowWarning("npc_event: event not found [%s]\n",eventname);
+ }
+ else
+ {
+ for(i=0;i<MAX_EVENTTIMER;i++) {
+ if( nd->eventtimer[i]==tid ) {
+ nd->eventtimer[i]=-1;
+ npc_event(sd,eventname,0); // sd NULL check is within
+ break;
+ }
+ }
+ if(i==MAX_EVENTTIMER && battle_config.error_log)
+ ShowWarning("npc_event_timer: event timer not found [%s]!\n",eventname);
+ }
+
+ aFree(eventname);
+ return 0;
+}
+
+int npc_timer_event(const unsigned char *eventname) // Added by RoVeRT
+{
+ struct event_data *ev=strdb_get(ev_db,(unsigned char*)eventname);
+ struct npc_data *nd;
+// int xs,ys;
+
+ if((ev==NULL || (nd=ev->nd)==NULL)){
+ ShowWarning("npc_timer_event: event not found [%s]\n",eventname);
+ return 0;
+ }
+
+ run_script(nd->u.scr.script,ev->pos,nd->bl.id,nd->bl.id);
+
+ return 0;
+}
+/*
+int npc_timer_sub_sub(DBKey key,void *data,va_list ap) // Added by RoVeRT
+{
+ char *p=(char *)key;
+ struct event_data *ev=(struct event_data *)data;
+ int *c=va_arg(ap,int *);
+ int tick=0,ctick=gettick();
+ char temp[10];
+ char event[100];
+
+ if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){
+ sscanf(&p[9],"%s",temp);
+ tick=atoi(temp);
+
+ strcpy( event, ev->nd->name);
+ strcat( event, p);
+
+ if (ctick >= ev->nd->lastaction && ctick - ev->nd->timer >= tick) {
+ npc_timer_event(event);
+ ev->nd->lastaction = ctick;
+ }
+ }
+ return 0;
+}
+
+int npc_timer_sub(DBKey key,void *data,va_list ap) // Added by RoVeRT
+{
+ struct npc_data *nd=(struct npc_data*)data;
+
+ if(nd->timer == -1)
+ return 0;
+
+ sv_db->foreach(ev_db,npc_timer_sub_sub,&nd->bl.id);
+
+ return 0;
+}
+
+int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT
+{
+ npcname_db->foreach(npcname_db,npc_timer_sub);
+
+ aFree((void*)data);
+ return 0;
+}*/
+/*==========================================
+ * ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚̃GƒNƒXƒ|[ƒg
+ * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
+ *------------------------------------------
+ */
+int npc_event_export(char *lname,void *data,va_list ap)
+{
+ int pos=(int)data;
+ struct npc_data *nd=va_arg(ap,struct npc_data *);
+
+ if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) {
+ struct event_data *ev;
+ unsigned char buf[51];
+ char *p=strchr(lname,':');
+ // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
+ ev=(struct event_data *) aMalloc(sizeof(struct event_data));
+ if (ev==NULL) {
+ ShowFatalError("npc_event_export: out of memory !\n");
+ exit(1);
+ }else if (p==NULL || (p-lname)>NAME_LENGTH) {
+ ShowFatalError("npc_event_export: label name error !\n");
+ exit(1);
+ }else{
+ ev->nd=nd;
+ ev->pos=pos;
+ *p='\0';
+ sprintf(buf,"%s::%s",nd->exname,lname);
+ *p=':';
+ strdb_put(ev_db,buf,ev);
+ }
+ }
+ return 0;
+}
+
+int npc_event_sub(struct map_session_data *, struct event_data *, const unsigned char *); //[Lance]
+/*==========================================
+ * ‘S‚Ä‚ÌNPC‚ÌOn*ƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int npc_event_doall_sub(DBKey key,void *data,va_list ap)
+{
+ unsigned char*p = key.str;
+ struct event_data *ev;
+ int *c;
+ int rid;
+ unsigned char *name;
+
+ ev=(struct event_data *)data;
+ c=va_arg(ap,int *);
+ name=va_arg(ap,unsigned char *);
+ rid=va_arg(ap, int);
+
+ if( (p=strchr(p,':')) && p && strcmpi(name,p)==0 ){
+ if(rid)
+ npc_event_sub(((struct map_session_data *)map_id2bl(rid)),ev,key.str);
+ else
+ run_script(ev->nd->u.scr.script,ev->pos,rid,ev->nd->bl.id);
+ (*c)++;
+ }
+
+ return 0;
+}
+int npc_event_doall(const unsigned char *name)
+{
+ int c=0;
+ unsigned char buf[64]="::";
+
+ strncpy(buf+2,name,62);
+ ev_db->foreach(ev_db,npc_event_doall_sub,&c,buf,0);
+ return c;
+}
+int npc_event_doall_id(const unsigned char *name, int rid)
+{
+ int c=0;
+ unsigned char buf[64]="::";
+
+ strncpy(buf+2,name,62);
+ ev_db->foreach(ev_db,npc_event_doall_sub,&c,buf,rid);
+ return c;
+}
+
+int npc_event_do_sub(DBKey key,void *data,va_list ap)
+{
+ unsigned char *p = key.str;
+ struct event_data *ev;
+ int *c;
+ const unsigned char *name;
+
+ nullpo_retr(0, ev=(struct event_data *)data);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, c=va_arg(ap,int *));
+
+ name=va_arg(ap,const unsigned char *);
+
+ if (p && strcmpi(name,p)==0 ) {
+ run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
+ (*c)++;
+ }
+
+ return 0;
+}
+int npc_event_do(const unsigned char *name)
+{
+ int c=0;
+
+ if (*name==':' && name[1]==':') {
+ return npc_event_doall(name+2);
+ }
+
+ ev_db->foreach(ev_db,npc_event_do_sub,&c,name);
+ return c;
+}
+
+/*==========================================
+ * ŽžŒvƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int npc_event_do_clock(int tid,unsigned int tick,int id,int data)
+{
+ time_t timer;
+ struct tm *t;
+ char buf[64];
+ char *day="";
+ int c=0;
+
+ time(&timer);
+ t=localtime(&timer);
+
+ switch (t->tm_wday) {
+ case 0: day = "Sun"; break;
+ case 1: day = "Mon"; break;
+ case 2: day = "Tue"; break;
+ case 3: day = "Wed"; break;
+ case 4: day = "Thu"; break;
+ case 5: day = "Fri"; break;
+ case 6: day = "Sat"; break;
+ }
+
+ if (t->tm_min != ev_tm_b.tm_min ) {
+ sprintf(buf,"OnMinute%02d",t->tm_min);
+ c+=npc_event_doall(buf);
+ sprintf(buf,"OnClock%02d%02d",t->tm_hour,t->tm_min);
+ c+=npc_event_doall(buf);
+ sprintf(buf,"On%s%02d%02d",day,t->tm_hour,t->tm_min);
+ c+=npc_event_doall(buf);
+ }
+ if (t->tm_hour!= ev_tm_b.tm_hour) {
+ sprintf(buf,"OnHour%02d",t->tm_hour);
+ c+=npc_event_doall(buf);
+ }
+ if (t->tm_mday!= ev_tm_b.tm_mday) {
+ sprintf(buf,"OnDay%02d%02d",t->tm_mon+1,t->tm_mday);
+ c+=npc_event_doall(buf);
+ }
+ memcpy(&ev_tm_b,t,sizeof(ev_tm_b));
+ return c;
+}
+/*==========================================
+ * OnInitƒCƒxƒ“ƒgŽÀs(&ŽžŒvƒCƒxƒ“ƒgŠJŽn)
+ *------------------------------------------
+ */
+int npc_event_do_oninit(void)
+{
+// int c = npc_event_doall("OnInit");
+ ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
+ CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
+
+ add_timer_interval(gettick()+100,
+ npc_event_do_clock,0,0,1000);
+
+ return 0;
+}
+/*==========================================
+ * OnTimer NPC event - by RoVeRT
+ *------------------------------------------
+ */
+int npc_addeventtimer(struct npc_data *nd,int tick,const char *name)
+{
+ int i;
+ unsigned char *evname;
+
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( nd->eventtimer[i]==-1 )
+ break;
+ if(i<MAX_EVENTTIMER){
+ if (!strdb_get(ev_db,(unsigned char*)name)) {
+ if (battle_config.error_log)
+ ShowError("npc_addeventimer: Event %s does not exists.\n", name);
+ return 1; //Event does not exists!
+ }
+ evname =(unsigned char *) aMallocA(NAME_LENGTH*sizeof(char));
+ if(evname==NULL){
+ ShowFatalError("npc_addeventtimer: out of memory !\n");exit(1);
+ }
+ memcpy(evname,name,NAME_LENGTH-1);
+ evname[NAME_LENGTH-1] = '\0';
+ nd->eventtimer[i]=add_timer(gettick()+tick,
+ npc_event_timer,nd->bl.id,(int)evname);
+ }else
+ ShowWarning("npc_addtimer: event timer is full !\n");
+
+ return 0;
+}
+
+int npc_deleventtimer(struct npc_data *nd,const unsigned char *name)
+{
+ int i;
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( nd->eventtimer[i]!=-1 && strcmp(
+ (unsigned char *)(get_timer(nd->eventtimer[i])->data), name)==0 ){
+ delete_timer(nd->eventtimer[i],npc_event_timer);
+ nd->eventtimer[i]=-1;
+ break;
+ }
+
+ return 0;
+}
+
+int npc_cleareventtimer(struct npc_data *nd)
+{
+ int i;
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( nd->eventtimer[i]!=-1 ){
+ delete_timer(nd->eventtimer[i],npc_event_timer);
+ nd->eventtimer[i]=-1;
+ }
+
+ return 0;
+}
+
+int npc_do_ontimer_sub(DBKey key,void *data,va_list ap)
+{
+ unsigned char *p = key.str;
+ struct event_data *ev = (struct event_data *)data;
+ int *c = va_arg(ap,int *);
+// struct map_session_data *sd=va_arg(ap,struct map_session_data *);
+ int option = va_arg(ap,int);
+ int tick = 0;
+ char temp[10];
+ char event[50];
+
+ if(ev->nd->bl.id == (int)*c && (p = strchr(p,':')) && strnicmp("::OnTimer",p,8) == 0){
+ sscanf(&p[9], "%s", temp);
+ tick = atoi(temp);
+
+ strcpy(event, ev->nd->name);
+ strcat(event, p);
+
+ if (option!=0) {
+ npc_addeventtimer(ev->nd, tick, event);
+ } else {
+ npc_deleventtimer(ev->nd, event);
+ }
+ }
+ return 0;
+}
+int npc_do_ontimer(int npc_id, int option)
+{
+ ev_db->foreach(ev_db, npc_do_ontimer_sub, &npc_id, option);
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚ÌŽæ‚èž‚Ý
+ * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
+ *------------------------------------------
+ */
+int npc_timerevent_import(char *lname,void *data,va_list ap)
+{
+ int pos=(int)data;
+ struct npc_data *nd=va_arg(ap,struct npc_data *);
+ int t=0,i=0;
+
+ if(sscanf(lname,"OnTimer%d%n",&t,&i)==1 && lname[i]==':') {
+ // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
+ struct npc_timerevent_list *te=nd->u.scr.timer_event;
+ int j,i=nd->u.scr.timeramount;
+ if(te==NULL) te=(struct npc_timerevent_list*)aMallocA(sizeof(struct npc_timerevent_list));
+ else te= (struct npc_timerevent_list*)aRealloc( te, sizeof(struct npc_timerevent_list) * (i+1) );
+ if(te==NULL){
+ ShowFatalError("npc_timerevent_import: out of memory !\n");
+ exit(1);
+ }
+ for(j=0;j<i;j++){
+ if(te[j].timer>t){
+ memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(i-j));
+ break;
+ }
+ }
+ te[j].timer=t;
+ te[j].pos=pos;
+ nd->u.scr.timer_event=te;
+ nd->u.scr.timeramount++;
+ }
+ return 0;
+}
+struct timer_event_data {
+ int rid; //Attached player for this timer.
+ int next; //timer index (starts with 0, then goes up to nd->u.scr.timeramount
+ int time; //holds total time elapsed for the script since time 0 (whenthe timers started)
+ unsigned int otick; //Holds tick value at which timer sequence was started (that is, it stores the tick value for which T= 0
+};
+
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int npc_timerevent(int tid,unsigned int tick,int id,int data)
+{
+ int next,t,old_rid,old_timer;
+ unsigned int old_tick;
+ struct npc_data* nd=(struct npc_data *)map_id2bl(id);
+ struct npc_timerevent_list *te;
+ struct timer_event_data *ted = (struct timer_event_data*)data;
+ struct map_session_data *sd=NULL;
+
+ if( nd==NULL ){
+ ShowError("npc_timerevent: NPC not found??\n");
+ return 0;
+ }
+ if (ted->rid) {
+ sd = map_id2sd(ted->rid);
+ if (!sd) {
+ if(battle_config.error_log)
+ ShowError("npc_timerevent: Attached player not found.\n");
+ ers_free(timer_event_ers, ted);
+ return 0;
+ }
+ }
+ old_rid = nd->u.scr.rid; //To restore it later.
+ nd->u.scr.rid = sd?sd->bl.id:0;
+
+ old_tick = nd->u.scr.timertick;
+ nd->u.scr.timertick=ted->otick;
+ te=nd->u.scr.timer_event+ ted->next;
+
+ old_timer = nd->u.scr.timer;
+ t = nd->u.scr.timer=ted->time;
+ ted->next++;
+
+ if( nd->u.scr.timeramount> ted->next){
+ next= nd->u.scr.timer_event[ ted->next ].timer
+ - nd->u.scr.timer_event[ ted->next-1 ].timer;
+ ted->time+=next;
+ if (sd)
+ sd->npc_timer_id = add_timer(tick+next,npc_timerevent,id,(int)ted);
+ else
+ nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,(int)ted);
+ } else {
+ if (sd)
+ sd->npc_timer_id = -1;
+ else
+ nd->u.scr.timerid = -1;
+ ers_free(timer_event_ers, ted);
+ }
+ run_script(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id);
+ //Restore previous data, only if this timer is a player-attached one.
+ if (sd) {
+ nd->u.scr.rid = old_rid;
+ nd->u.scr.timer = old_timer;
+ nd->u.scr.timertick = old_tick;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŠJŽn
+ *------------------------------------------
+ */
+int npc_timerevent_start(struct npc_data *nd, int rid)
+{
+ int j,n, next;
+ struct map_session_data *sd=NULL; //Player to whom script is attached.
+ struct timer_event_data *ted;
+
+ nullpo_retr(0, nd);
+
+ n=nd->u.scr.timeramount;
+ if( n==0 )
+ return 0;
+
+ for(j=0;j<n;j++){
+ if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer )
+ break;
+ }
+ if(j>=n) // check if there is a timer to use !!BEFORE!! you write stuff to the structures [Shinomori]
+ return 0;
+ if (nd->u.scr.rid > 0) {
+ //Try to attach timer to this player.
+ sd = map_id2sd(nd->u.scr.rid);
+ if (!sd) {
+ if(battle_config.error_log)
+ ShowError("npc_timerevent_start: Attached player not found!\n");
+ return 1;
+ }
+ }
+ //Check if timer is already started.
+ if (sd) {
+ if (sd->npc_timer_id != -1)
+ return 0;
+ } else if (nd->u.scr.timerid != -1)
+ return 0;
+
+ ted = ers_alloc(timer_event_ers, struct timer_event_data);
+ ted->next = j;
+ nd->u.scr.timertick=ted->otick=gettick();
+
+ //Attach only the player if attachplayerrid was used.
+ ted->rid = sd?sd->bl.id:0;
+
+// Do not store it to make way to two types of timers: globals and personals.
+// if (rid >= 0) nd->u.scr.rid=rid; // changed to: attaching to given rid by default [Shinomori]
+ // if rid is less than 0 leave it unchanged [celest]
+
+ next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
+ ted->time = nd->u.scr.timer_event[j].timer;
+ if (sd)
+ sd->npc_timer_id = add_timer(gettick()+next,npc_timerevent,nd->bl.id,(int)ted);
+ else
+ nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,(int)ted);
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgI—¹
+ *------------------------------------------
+ */
+int npc_timerevent_stop(struct npc_data *nd)
+{
+ struct map_session_data *sd =NULL;
+ struct TimerData *td = NULL;
+ int *tid;
+ nullpo_retr(0, nd);
+ if (nd->u.scr.rid) {
+ sd = map_id2sd(nd->u.scr.rid);
+ if (!sd) {
+ if(battle_config.error_log)
+ ShowError("npc_timerevent_stop: Attached player not found!\n");
+ return 1;
+ }
+ }
+
+ tid = sd?&sd->npc_timer_id:&nd->u.scr.timerid;
+
+ if (*tid == -1) //Nothing to stop
+ return 0;
+ td = get_timer(*tid);
+ if (td && td->data)
+ ers_free(timer_event_ers, (struct event_timer_data*)td->data);
+ delete_timer(*tid,npc_timerevent);
+ *tid = -1;
+ //Set the timer tick to the time that has passed since the beginning of the timers and now.
+ nd->u.scr.timer = DIFF_TICK(gettick(),nd->u.scr.timertick);
+// nd->u.scr.rid = 0; //Eh? why detach?
+ return 0;
+}
+/*==========================================
+ * Aborts a running npc timer that is attached to a player.
+ *------------------------------------------
+ */
+void npc_timerevent_quit(struct map_session_data *sd) {
+ struct TimerData *td;
+ if (sd->npc_timer_id == -1)
+ return;
+ td = get_timer(sd->npc_timer_id);
+ if (!td) {
+ sd->npc_timer_id = -1;
+ return; //??
+ }
+ delete_timer(sd->npc_timer_id,npc_timerevent);
+ sd->npc_timer_id = -1;
+ ers_free(timer_event_ers, (struct event_timer_data*)td->data);
+}
+
+/*==========================================
+ * ƒ^ƒCƒ}[’l‚ÌŠ“¾
+ *------------------------------------------
+ */
+int npc_gettimerevent_tick(struct npc_data *nd)
+{
+ int tick;
+ nullpo_retr(0, nd);
+
+ tick=nd->u.scr.timer;
+ if (nd->u.scr.timertick)
+ tick+=DIFF_TICK(gettick(), nd->u.scr.timertick);
+ return tick;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[’l‚ÌÝ’è
+ *------------------------------------------
+ */
+int npc_settimerevent_tick(struct npc_data *nd,int newtimer)
+{
+ int flag;
+ struct map_session_data *sd=NULL;
+
+ nullpo_retr(0, nd);
+
+ if (nd->u.scr.rid) {
+ sd = map_id2sd(nd->u.scr.rid);
+ if (!sd) {
+ if(battle_config.error_log)
+ ShowError("npc_settimerevent_tick: Attached player not found!\n");
+ return 1;
+ }
+ flag= sd->npc_timer_id != -1 ;
+ } else
+ flag= nd->u.scr.timerid != -1 ;
+
+ if(flag)
+ npc_timerevent_stop(nd);
+ nd->u.scr.timer=newtimer;
+ if(flag)
+ npc_timerevent_start(nd, -1);
+ return 0;
+}
+
+int npc_event_sub(struct map_session_data *sd, struct event_data *ev, const unsigned char *eventname){
+
+ if ( sd->npc_id!=0) {
+ //Enqueue the event trigger.
+ int i;
+ for(i=0;i<MAX_EVENTQUEUE && sd->eventqueue[i][0];i++);
+
+ if (i==MAX_EVENTQUEUE) {
+ if (battle_config.error_log)
+ ShowWarning("npc_event: event queue is full !\n");
+ }else //Event enqueued.
+ memcpy(sd->eventqueue[i],eventname,50);
+ return 1;
+ }
+ if (ev->nd->sc.option&OPTION_INVISIBLE) {
+ //Disabled npc, shouldn't trigger event.
+ npc_event_dequeue(sd);
+ return 2;
+ }
+ run_script(ev->nd->u.scr.script,ev->pos,sd->bl.id,ev->nd->bl.id);
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgŒ^‚ÌNPCˆ—
+ *------------------------------------------
+ */
+int npc_event (struct map_session_data *sd, const unsigned char *eventname, int mob_kill)
+{
+ struct event_data *ev=strdb_get(ev_db,(unsigned char*)eventname);
+ struct npc_data *nd;
+ int xs,ys;
+ unsigned char mobevent[100];
+
+ if (sd == NULL) {
+ nullpo_info(NLP_MARK);
+ return 0;
+ }
+
+ if (ev == NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0)
+ return 1;
+
+ if (ev == NULL || (nd = ev->nd) == NULL) {
+ if (mob_kill) {
+ strcpy( mobevent, eventname);
+ strcat( mobevent, "::OnMyMobDead");
+ ev = strdb_get(ev_db, mobevent);
+ if (ev == NULL || (nd = ev->nd) == NULL) {
+ if (strnicmp(eventname, "GM_MONSTER",10) != 0)
+ ShowError("npc_event: (mob_kill) event not found [%s]\n", mobevent);
+ return 0;
+ }
+ } else {
+ if (battle_config.error_log)
+ ShowError("npc_event: event not found [%s]\n", eventname);
+ return 0;
+ }
+ }
+
+ xs=nd->u.scr.xs;
+ ys=nd->u.scr.ys;
+ if (xs>=0 && ys>=0 && (strcmp(((eventname)+strlen(eventname)-6),"Global") != 0) )
+ {
+ if (nd->bl.m >= 0) { //Non-invisible npc
+ if (nd->bl.m != sd->bl.m )
+ return 1;
+ if ( xs>0 && (sd->bl.x<nd->bl.x-xs/2 || nd->bl.x+xs/2<sd->bl.x) )
+ return 1;
+ if ( ys>0 && (sd->bl.y<nd->bl.y-ys/2 || nd->bl.y+ys/2<sd->bl.y) )
+ return 1;
+ }
+ }
+
+ return npc_event_sub(sd,ev,eventname);
+}
+
+
+int npc_command_sub(DBKey key,void *data,va_list ap)
+{
+ unsigned char *p = key.str;
+ struct event_data *ev=(struct event_data *)data;
+ unsigned char *npcname=va_arg(ap,char *);
+ char *command=va_arg(ap,char *);
+ unsigned char temp[100];
+
+ if(strcmp(ev->nd->name,npcname)==0 && (p=strchr(p,':')) && p && strnicmp("::OnCommand",p,10)==0 ){
+ sscanf(&p[11],"%s",temp);
+
+ if (strcmp(command,temp)==0)
+ run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
+ }
+
+ return 0;
+}
+
+int npc_command(struct map_session_data *sd,const unsigned char *npcname,char *command)
+{
+ ev_db->foreach(ev_db,npc_command_sub,npcname,command);
+
+ return 0;
+}
+/*==========================================
+ * ÚGŒ^‚ÌNPCˆ—
+ *------------------------------------------
+ */
+int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y)
+{
+ int i,f=1;
+ int xs,ys;
+
+ nullpo_retr(1, sd);
+
+ if(sd->npc_id)
+ return 1;
+
+ for(i=0;i<map[m].npc_num;i++) {
+ if (map[m].npc[i]->sc.option&OPTION_INVISIBLE) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ f=0;
+ continue;
+ }
+
+ switch(map[m].npc[i]->bl.subtype) {
+ case WARP:
+ xs=map[m].npc[i]->u.warp.xs;
+ ys=map[m].npc[i]->u.warp.ys;
+ break;
+ case SCRIPT:
+ xs=map[m].npc[i]->u.scr.xs;
+ ys=map[m].npc[i]->u.scr.ys;
+ break;
+ default:
+ continue;
+ }
+ if (x >= map[m].npc[i]->bl.x-xs/2 && x < map[m].npc[i]->bl.x-xs/2+xs &&
+ y >= map[m].npc[i]->bl.y-ys/2 && y < map[m].npc[i]->bl.y-ys/2+ys)
+ break;
+ }
+ if (i==map[m].npc_num) {
+ if (f) {
+ if (battle_config.error_log)
+ ShowError("npc_touch_areanpc : some bug \n");
+ }
+ return 1;
+ }
+ switch(map[m].npc[i]->bl.subtype) {
+ case WARP:
+ // hidden chars cannot use warps -- is it the same for scripts too?
+ if (sd->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) ||
+ (!battle_config.duel_allow_teleport && sd->duel_group)) // duel rstrct [LuzZza]
+ break;
+ pc_setpos(sd,map[m].npc[i]->u.warp.mapindex,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0);
+ break;
+ case SCRIPT:
+ {
+ //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
+ char name[50]; // need 24 max + 9 for "::OnTouch"
+
+ if(sd->areanpc_id == map[m].npc[i]->bl.id)
+ return 1;
+ sd->areanpc_id = map[m].npc[i]->bl.id;
+
+ sprintf(name,"%s::OnTouch", map[m].npc[i]->exname); // It goes here too. exname being the unique identifier. [Lance]
+
+ if( npc_event(sd,name,0)>0 ) {
+ pc_stop_walking(sd,1); //Make it stop walking!
+ npc_click(sd,map[m].npc[i]);
+ }
+ //aFree(name);
+ break;
+ }
+ }
+ return 0;
+}
+
+int npc_touch_areanpc2(struct block_list *bl)
+{
+ int i,m=bl->m;
+ int xs,ys;
+
+ for(i=0;i<map[m].npc_num;i++) {
+ if (map[m].npc[i]->sc.option&OPTION_INVISIBLE)
+ continue;
+
+ if (map[m].npc[i]->bl.subtype!=WARP)
+ continue;
+
+ xs=map[m].npc[i]->u.warp.xs;
+ ys=map[m].npc[i]->u.warp.ys;
+
+ if (bl->x >= map[m].npc[i]->bl.x-xs/2 && bl->x < map[m].npc[i]->bl.x-xs/2+xs &&
+ bl->y >= map[m].npc[i]->bl.y-ys/2 && bl->y < map[m].npc[i]->bl.y-ys/2+ys)
+ break;
+ }
+ if (i==map[m].npc_num)
+ return 0;
+
+ xs = map_mapindex2mapid(map[m].npc[i]->u.warp.mapindex);
+ if (xs < 0) // Can't warp object between map servers...
+ return 0;
+
+ if (unit_warp(bl, xs, map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0))
+ return 0; //Failed to warp.
+
+ return 1;
+}
+
+/*==========================================
+ * ‹ß‚­‚©‚Ç‚¤‚©‚Ì”»’è
+ *------------------------------------------
+ */
+int npc_checknear2(struct map_session_data *sd,struct block_list *bl)
+{
+ nullpo_retr(1, sd);
+ if(bl == NULL) return 1;
+
+ if(sd->state.using_fake_npc && sd->npc_id == bl->id)
+ return 0;
+
+ if (status_get_class(bl)<0) //Class-less npc, enable click from anywhere.
+ return 0;
+
+ if (bl->m!=sd->bl.m ||
+ bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 ||
+ bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)
+ return 1;
+
+ return 0;
+}
+
+TBL_NPC *npc_checknear(struct map_session_data *sd,struct block_list *bl)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(NULL, sd);
+ if(bl == NULL) return NULL;
+ if(bl->type != BL_NPC) return NULL;
+ nd = (TBL_NPC*)bl;
+
+ if(sd->state.using_fake_npc && sd->npc_id == bl->id)
+ return nd;
+
+ if (nd->class_<0) //Class-less npc, enable click from anywhere.
+ return nd;
+
+ if (bl->m!=sd->bl.m ||
+ bl->x<sd->bl.x-AREA_SIZE-1 || bl->x>sd->bl.x+AREA_SIZE+1 ||
+ bl->y<sd->bl.y-AREA_SIZE-1 || bl->y>sd->bl.y+AREA_SIZE+1)
+ return NULL;
+
+ return nd;
+}
+
+/*==========================================
+ * NPC‚̃I[ƒvƒ“ƒ`ƒƒƒbƒg”­Œ¾
+ *------------------------------------------
+ */
+int npc_globalmessage(const char *name,char *mes)
+{
+ struct npc_data *nd=(struct npc_data *) strdb_get(npcname_db,(unsigned char*)name);
+ char temp[100];
+
+ if (!nd)
+ return 0;
+
+ snprintf(temp, sizeof temp ,"%s : %s",name,mes);
+ clif_GlobalMessage(&nd->bl,temp);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒNƒŠƒbƒNŽž‚ÌNPCˆ—
+ *------------------------------------------
+ */
+int npc_click(struct map_session_data *sd,struct npc_data *nd)
+{
+ nullpo_retr(1, sd);
+
+ if (sd->npc_id != 0) {
+ if (battle_config.error_log)
+ ShowError("npc_click: npc_id != 0\n");
+ return 1;
+ }
+
+ if(!nd) return 1;
+ if ((nd = npc_checknear(sd,&nd->bl)) == NULL)
+ return 1;
+ //Hidden/Disabled npc.
+ if (nd->class_ < 0 || nd->sc.option&OPTION_INVISIBLE)
+ return 1;
+
+ switch(nd->bl.subtype) {
+ case SHOP:
+ clif_npcbuysell(sd,nd->bl.id);
+ npc_event_dequeue(sd);
+ break;
+ case SCRIPT:
+ run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_scriptcont(struct map_session_data *sd,int id)
+{
+ nullpo_retr(1, sd);
+
+ if (id!=sd->npc_id){
+ ShowWarning("npc_scriptcont: sd->npc_id (%d) is not id (%d).\n", sd->npc_id, id);
+ return 1;
+ }
+
+ if(id != fake_nd->bl.id) { // Not item script
+ if ((npc_checknear(sd,map_id2bl(id))) == NULL){
+ ShowWarning("npc_scriptcont: failed npc_checknear test.\n");
+ return 1;
+ }
+ }
+ run_script_main(sd->st);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_buysellsel(struct map_session_data *sd,int id,int type)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(1, sd);
+
+ if ((nd = npc_checknear(sd,map_id2bl(id))) == NULL)
+ return 1;
+
+ if (nd->bl.subtype!=SHOP) {
+ if (battle_config.error_log)
+ ShowError("no such shop npc : %d\n",id);
+ if (sd->npc_id == id)
+ sd->npc_id=0;
+ return 1;
+ }
+ if (nd->sc.option&OPTION_INVISIBLE) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ return 1;
+
+ sd->npc_shopid=id;
+ if (type==0) {
+ clif_buylist(sd,nd);
+ } else {
+ clif_selllist(sd);
+ }
+ return 0;
+}
+
+//npc_buylist for script-controlled shops.
+static int npc_buylist_sub(
+ struct map_session_data *sd,int n,
+ unsigned short *item_list, struct npc_data *nd)
+{
+ unsigned char npc_ev[51];
+ int i;
+ int regkey = add_str("@bought_nameid");
+ int regkey2 = add_str("@bought_quantity");
+ sprintf(npc_ev, "%s::OnBuyItem", nd->exname);
+ for(i=0;i<n;i++){
+ pc_setreg(sd,regkey+(i<<24),(int)item_list[i*2+1]);
+ pc_setreg(sd,regkey2+(i<<24),(int)item_list[i*2]);
+ }
+ npc_event(sd, npc_ev, 0);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list)
+{
+ struct npc_data *nd;
+ double z;
+ int i,j,w,skill,itemamount=0,new_=0;
+
+ nullpo_retr(3, sd);
+ nullpo_retr(3, item_list);
+
+ if ((nd = npc_checknear(sd,map_id2bl(sd->npc_shopid))) == NULL)
+ return 3;
+
+ if (nd->master_nd) //Script-based shops.
+ return npc_buylist_sub(sd,n,item_list,nd->master_nd);
+
+ if (nd->bl.subtype!=SHOP)
+ return 3;
+
+ for(i=0,w=0,z=0;i<n;i++) {
+ for(j=0;nd->u.shop_item[j].nameid;j++) {
+ if (nd->u.shop_item[j].nameid==item_list[i*2+1] || //Normal items
+ itemdb_viewid(nd->u.shop_item[j].nameid)==item_list[i*2+1]) //item_avail replacement
+ break;
+ }
+ if (nd->u.shop_item[j].nameid==0)
+ return 3;
+
+ if (!itemdb_isstackable(nd->u.shop_item[j].nameid) && item_list[i*2] > 1)
+ { //Exploit? You can't buy more than 1 of equipment types o.O
+ ShowWarning("Player %s (%d:%d) sent a hexed packet trying to buy %d of nonstackable item %d!\n",
+ sd->status.name, sd->status.account_id, sd->status.char_id, item_list[i*2], nd->u.shop_item[j].nameid);
+ item_list[i*2] = 1;
+ }
+ if (itemdb_value_notdc(nd->u.shop_item[j].nameid))
+ z+=(double)nd->u.shop_item[j].value * item_list[i*2];
+ else
+ z+=(double)pc_modifybuyvalue(sd,nd->u.shop_item[j].value) * item_list[i*2];
+ itemamount+=item_list[i*2];
+
+ switch(pc_checkadditem(sd,item_list[i*2+1],item_list[i*2])) {
+ case ADDITEM_EXIST:
+ break;
+ case ADDITEM_NEW:
+ new_++;
+ break;
+ case ADDITEM_OVERAMOUNT:
+ return 2;
+ }
+
+ w+=itemdb_weight(item_list[i*2+1]) * item_list[i*2];
+ }
+ if (z > (double)sd->status.zeny)
+ return 1; // zeny•s‘«
+ if (w+sd->weight > sd->max_weight)
+ return 2; // d—Ê’´‰ß
+ if (pc_inventoryblank(sd)<new_)
+ return 3; // Ží—Þ”’´‰ß
+
+ //Logs (S)hopping Zeny [Lupus]
+ if(log_config.zeny > 0 )
+ log_zeny(sd, "S", sd, -(int)z);
+ //Logs
+
+ pc_payzeny(sd,(int)z);
+ for(i=0;i<n;i++) {
+ struct item item_tmp;
+
+ malloc_set(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid = item_list[i*2+1];
+ item_tmp.identify = 1; // npc”Ì”„ƒAƒCƒeƒ€‚ÍŠÓ’èÏ‚Ý
+
+ pc_additem(sd,&item_tmp,item_list[i*2]);
+
+ //Logs items, Bought in NPC (S)hop [Lupus]
+ if(log_config.enable_logs&0x20)
+ log_pick_pc(sd, "S", item_tmp.nameid, item_list[i*2], NULL);
+ //Logs
+ }
+
+ //¤lŒoŒ±’l
+ if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0) {
+ if (sd->status.skill[MC_DISCOUNT].flag != 0)
+ skill = sd->status.skill[MC_DISCOUNT].flag - 2;
+ if (skill > 0) {
+ z = z * (double)skill * (double)battle_config.shop_exp/10000.;
+ if (z < 1)
+ z = 1;
+ pc_gainexp(sd,NULL,0,(int)z);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list)
+{
+ double z;
+ int i,skill,itemamount=0;
+ struct npc_data *nd;
+
+ nullpo_retr(1, sd);
+ nullpo_retr(1, item_list);
+
+ if ((nd = npc_checknear(sd,map_id2bl(sd->npc_shopid))) == NULL)
+ return 1;
+ nd = nd->master_nd; //For OnSell triggers.
+
+ for(i=0,z=0;i<n;i++) {
+ int nameid, idx, qty;
+ idx = item_list[i*2]-2;
+ qty = item_list[i*2+1];
+
+ if (idx <0 || idx >=MAX_INVENTORY || qty < 0)
+ break;
+
+ nameid=sd->status.inventory[idx].nameid;
+ if (nameid == 0 || !sd->inventory_data[idx] ||
+ sd->status.inventory[idx].amount < qty)
+ break;
+
+ if (sd->inventory_data[idx]->flag.value_notoc)
+ z+=(double)qty*sd->inventory_data[idx]->value_sell;
+ else
+ z+=(double)qty*pc_modifysellvalue(sd,sd->inventory_data[idx]->value_sell);
+
+ if(sd->inventory_data[idx]->type==7 && sd->status.inventory[idx].card[0] == (short)0xff00)
+ {
+ if(search_petDB_index(sd->status.inventory[idx].nameid, PET_EGG) >= 0)
+ intif_delete_petdata(MakeDWord(sd->status.inventory[idx].card[1],sd->status.inventory[idx].card[2]));
+ }
+
+ if(log_config.enable_logs&0x20) //Logs items, Sold to NPC (S)hop [Lupus]
+ log_pick_pc(sd, "S", nameid, -qty, &sd->status.inventory[idx]);
+
+ if(nd) {
+ pc_setreg(sd,add_str("@sold_nameid")+(i<<24),(int)sd->status.inventory[idx].nameid);
+ pc_setreg(sd,add_str("@sold_quantity")+(i<<24),qty);
+ }
+ itemamount+=qty;
+ pc_delitem(sd,idx,qty,0);
+ }
+
+ if (z > MAX_ZENY) z = MAX_ZENY;
+
+ if(log_config.zeny) //Logs (S)hopping Zeny [Lupus]
+ log_zeny(sd, "S", sd, (int)z);
+
+ pc_getzeny(sd,(int)z);
+
+ if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_OVERCHARGE)) > 0) {
+ if (sd->status.skill[MC_OVERCHARGE].flag != 0)
+ skill = sd->status.skill[MC_OVERCHARGE].flag - 2;
+ if (skill > 0) {
+ z = z * (double)skill * (double)battle_config.shop_exp/10000.;
+ if (z < 1)
+ z = 1;
+ pc_gainexp(sd,NULL,0,(int)z);
+ }
+ }
+
+ if(nd) {
+ unsigned char npc_ev[51];
+ sprintf(npc_ev, "%s::OnSellItem", nd->exname);
+ npc_event(sd, npc_ev, 0);
+ }
+
+ if (i<n) {
+ //Error/Exploit... of some sort. If we return 1, the client will not mark
+ //any item as deleted even though a few were sold. In such a case, we
+ //have no recourse but to kick them out so their inventory will refresh
+ //correctly on relog. [Skotlex]
+ if (i) clif_setwaitclose(sd->fd);
+ return 1;
+ }
+ return 0;
+}
+
+int npc_remove_map (struct npc_data *nd)
+{
+ int m,i;
+ nullpo_retr(1, nd);
+
+ if(nd->bl.prev == NULL || nd->bl.m < 0)
+ return 1; //Not assigned to a map.
+ m = nd->bl.m;
+#ifdef PCRE_SUPPORT
+ npc_chat_finalize(nd);
+#endif
+ clif_clearchar_area(&nd->bl,2);
+ strdb_remove(npcname_db, (nd->bl.subtype < SCRIPT) ? nd->name : nd->exname);
+ //Remove corresponding NPC CELLs
+ if (nd->bl.subtype == WARP) {
+ int j, xs, ys, x, y;
+ x = nd->bl.x;
+ y = nd->bl.y;
+ xs = nd->u.warp.xs;
+ ys = nd->u.warp.ys;
+
+ for (i = 0; i < ys; i++) {
+ for (j = 0; j < xs; j++) {
+ if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNPC))
+ map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_CLRNPC);
+ }
+ }
+ }
+ map_delblock(&nd->bl);
+ map_deliddb(&nd->bl);
+ //Remove npc from map[].npc list. [Skotlex]
+ for(i=0;i<map[m].npc_num && map[m].npc[i] != nd;i++);
+ if (i >= map[m].npc_num) return 2; //failed to find it?
+
+ map[m].npc_num--;
+ for(; i<map[m].npc_num; i++)
+ map[m].npc[i]=map[m].npc[i+1];
+ return 0;
+}
+
+static int npc_unload_ev(DBKey key,void *data,va_list ap) {
+ struct event_data *ev=(struct event_data *)data;
+ unsigned char *npcname=va_arg(ap,unsigned char *);
+
+ if(strcmp(ev->nd->exname,npcname)==0){
+ db_remove(ev_db, key);
+ return 1;
+ }
+ return 0;
+}
+
+static int npc_unload_dup_sub(DBKey key,void * data,va_list ap)
+{
+ struct npc_data *nd = (struct npc_data *)data;
+ int src_id;
+
+ if(nd->bl.type!=BL_NPC || nd->bl.subtype != SCRIPT)
+ return 0;
+
+ src_id=va_arg(ap,int);
+ if (nd->u.scr.src_id == src_id)
+ npc_unload(nd);
+ return 0;
+}
+//Removes all npcs that are duplicates of the passed one. [Skotlex]
+void npc_unload_duplicates (struct npc_data *nd)
+{
+ map_foreachiddb(npc_unload_dup_sub,nd->bl.id);
+}
+
+int npc_unload (struct npc_data *nd)
+{
+ nullpo_ret(nd);
+
+ npc_remove_map (nd);
+ map_deliddb(&nd->bl);
+
+ if (nd->chat_id) {
+ struct chat_data *cd = (struct chat_data*)map_id2bl(nd->chat_id);
+ if (cd) aFree (cd);
+ cd = NULL;
+ }
+ if (nd->bl.subtype == SCRIPT) {
+ ev_db->foreach(ev_db,npc_unload_ev,nd->exname); //Clean up all events related.
+ if (nd->u.scr.timerid != -1) {
+ struct TimerData *td = NULL;
+ td = get_timer(nd->u.scr.timerid);
+ if (td && td->data)
+ ers_free(timer_event_ers, (struct event_timer_data*)td->data);
+ delete_timer(nd->u.scr.timerid, npc_timerevent);
+ }
+ npc_cleareventtimer (nd);
+ if (nd->u.scr.timer_event)
+ aFree(nd->u.scr.timer_event);
+ if (nd->u.scr.src_id == 0) {
+ if(nd->u.scr.script) {
+ script_free_code(nd->u.scr.script);
+ nd->u.scr.script = NULL;
+ }
+ if (nd->u.scr.label_list) {
+ aFree(nd->u.scr.label_list);
+ nd->u.scr.label_list = NULL;
+ }
+ }
+ }
+ aFree(nd);
+
+ return 0;
+}
+
+//
+// ‰Šú‰»ŠÖŒW
+//
+
+/*==========================================
+ * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̃NƒŠƒA
+ *------------------------------------------
+ */
+void npc_clearsrcfile (void)
+{
+ struct npc_src_list *p = npc_src_first, *p2;
+
+ while (p) {
+ p2 = p;
+ p = p->next;
+ aFree(p2);
+ }
+ npc_src_first = NULL;
+ npc_src_last = NULL;
+}
+/*==========================================
+ * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̒ljÁ
+ *------------------------------------------
+ */
+void npc_addsrcfile (char *name)
+{
+ struct npc_src_list *nsl;
+
+ if (strcmpi(name, "clear") == 0) {
+ npc_clearsrcfile();
+ return;
+ }
+
+ // prevent multiple insert of source files
+ nsl = npc_src_first;
+ while (nsl)
+ { // found the file, no need to insert it again
+ if (0 == strcmp(name, nsl->name))
+ return;
+ nsl = nsl->next;
+ }
+
+ nsl = (struct npc_src_list *) aMalloc (sizeof(*nsl) + strlen(name));
+ nsl->next = NULL;
+ strncpy(nsl->name, name, strlen(name) + 1);
+ if (npc_src_first == NULL)
+ npc_src_first = nsl;
+ if (npc_src_last)
+ npc_src_last->next = nsl;
+ npc_src_last = nsl;
+}
+/*==========================================
+ * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚Ìíœ
+ *------------------------------------------
+ */
+void npc_delsrcfile (char *name)
+{
+ struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first;
+
+ if (strcmpi(name, "all") == 0) {
+ npc_clearsrcfile();
+ return;
+ }
+
+ while (p) {
+ if (strcmp(p->name, name) == 0) {
+ *lp = p->next;
+ if (npc_src_last == p)
+ npc_src_last = pp;
+ aFree(p);
+ break;
+ }
+ lp = &p->next;
+ pp = p;
+ p = p->next;
+ }
+}
+
+/*==========================================
+ * warps‰ðÍ
+ *------------------------------------------
+ */
+int npc_parse_warp (char *w1,char *w2,char *w3,char *w4)
+{
+ int x, y, xs, ys, to_x, to_y, m;
+ int i, j;
+ char mapname[MAP_NAME_LENGTH], to_mapname[MAP_NAME_LENGTH];
+ struct npc_data *nd;
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%15[^,],%d,%d", mapname, &x, &y) != 3 ||
+ sscanf(w4, "%d,%d,%15[^,],%d,%d", &xs, &ys, to_mapname, &to_x, &to_y) != 5) {
+ ShowError("bad warp line : %s\n", w3);
+ return 1;
+ }
+
+ m = map_mapname2mapid(mapname);
+ i = mapindex_name2id(to_mapname);
+ if (!i) {
+ ShowError("bad warp line (destination map not found): %s\n", w3);
+ return 1;
+ }
+
+ nd = (struct npc_data *) aCalloc (1, sizeof(struct npc_data));
+
+ nd->bl.id = npc_get_new_npc_id();
+ nd->n = map_addnpc(m, nd);
+ nd->bl.prev = nd->bl.next = NULL;
+ nd->bl.m = m;
+ nd->bl.x = x;
+ nd->bl.y = y;
+ memcpy(nd->name, w3, NAME_LENGTH-1);
+ memcpy(nd->exname, w3, NAME_LENGTH-1);
+
+ if (!battle_config.warp_point_debug)
+ nd->class_ = WARP_CLASS;
+ else
+ nd->class_ = WARP_DEBUG_CLASS;
+ nd->speed = 200;
+
+ nd->u.warp.mapindex = (short)i;
+ xs += 2;
+ ys += 2;
+ nd->u.warp.x = to_x;
+ nd->u.warp.y = to_y;
+ nd->u.warp.xs = xs;
+ nd->u.warp.ys = ys;
+
+ for (i = 0; i < ys; i++) {
+ for (j = 0; j < xs; j++) {
+ if (map_getcell(m, x-xs/2+j, y-ys/2+i, CELL_CHKNOPASS))
+ continue;
+ map_setcell(m, x-xs/2+j, y-ys/2+i, CELL_SETNPC);
+ }
+ }
+
+ npc_warp++;
+ nd->bl.type = BL_NPC;
+ nd->bl.subtype = WARP;
+ map_addblock(&nd->bl);
+ status_set_viewdata(&nd->bl, nd->class_);
+ status_change_init(&nd->bl);
+ unit_dataset(&nd->bl);
+ clif_spawn(&nd->bl);
+ strdb_put(npcname_db, nd->name, nd);
+
+ return 0;
+}
+
+/*==========================================
+ * shops‰ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
+{
+ #define MAX_SHOPITEM 100
+ char *p;
+ int x, y, dir, m, pos = 0;
+ char mapname[MAP_NAME_LENGTH];
+ struct npc_data *nd;
+
+ if (strcmp(w1, "-") == 0) {
+ x = 0; y = 0; dir = 0; m = -1;
+ } else {
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%15[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
+ strchr(w4, ',') == NULL) {
+ ShowError("bad shop line : %s\n", w3);
+ return 1;
+ }
+ m = map_mapname2mapid(mapname);
+ }
+
+ nd = (struct npc_data *) aCalloc (1, sizeof(struct npc_data) +
+ sizeof(nd->u.shop_item[0]) * (MAX_SHOPITEM + 1));
+ p = strchr(w4, ',');
+
+ while (p && pos < MAX_SHOPITEM) {
+ int nameid, value;
+ struct item_data *id;
+ p++;
+ if (sscanf(p, "%d:%d", &nameid, &value) != 2)
+ break;
+ nd->u.shop_item[pos].nameid = nameid;
+ id = itemdb_search(nameid);
+ if (value < 0)
+ value = id->value_buy;
+ nd->u.shop_item[pos].value = value;
+ // check for bad prices that can possibly cause exploits
+ if (value/124. < id->value_sell/75.) { //Clened up formula to prevent overflows.
+ printf("\r"); //Carriage return to clear the 'loading..' line. [Skotlex]
+ if (value < id->value_sell)
+ ShowWarning ("Item %s [%d] buying price (%d) is less than selling price (%d) at %s\n",
+ id->name, id->nameid, value, id->value_sell, current_file);
+ else
+ ShowWarning ("Item %s [%d] discounted buying price (%d) is less than overcharged selling price (%d) at %s\n",
+ id->name, id->nameid, value/100*75, id->value_sell/100*124, current_file);
+ }
+ //for logs filters, atcommands and iteminfo script command
+ if (id->maxchance<=0)
+ id->maxchance = 10000; //10000 (100% drop chance)would show that the item's sold in NPC Shop
+
+ pos++;
+ p = strchr(p, ',');
+ }
+ if (pos == 0) {
+ aFree(nd);
+ return 1;
+ }
+ nd->u.shop_item[pos++].nameid = 0;
+
+ nd->bl.prev = nd->bl.next = NULL;
+ nd->bl.m = m;
+ nd->bl.x = x;
+ nd->bl.y = y;
+ nd->bl.id = npc_get_new_npc_id();
+ memcpy(nd->name, w3, NAME_LENGTH-1);
+ nd->name[NAME_LENGTH-1] = '\0';
+ nd->class_ = m==-1?-1:atoi(w4);
+ nd->speed = 200;
+
+ nd = (struct npc_data *)aRealloc(nd,
+ sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
+
+ npc_shop++;
+ nd->bl.type = BL_NPC;
+ nd->bl.subtype = SHOP;
+ if (m >= 0) {
+ nd->n = map_addnpc(m,nd);
+ map_addblock(&nd->bl);
+ status_set_viewdata(&nd->bl, nd->class_);
+ status_change_init(&nd->bl);
+ unit_dataset(&nd->bl);
+ nd->ud.dir = dir;
+ clif_spawn(&nd->bl);
+ } else
+ // we skip map_addnpc, but still add it to the list of ID's
+ map_addiddb(&nd->bl);
+ strdb_put(npcname_db, nd->name,nd);
+
+ return 0;
+}
+
+/*==========================================
+ * NPC‚̃‰ƒxƒ‹ƒf[ƒ^ƒRƒ“ƒo[ƒg
+ *------------------------------------------
+ */
+int npc_convertlabel_db (DBKey key, void *data, va_list ap)
+{
+ unsigned char *lname = key.str;
+ int pos = (int)data;
+ struct npc_data *nd;
+ struct npc_label_list *lst;
+ int num;
+ char *p;
+ char c;
+
+ nullpo_retr(0, ap);
+ nullpo_retr(0, nd = va_arg(ap,struct npc_data *));
+
+ lst = nd->u.scr.label_list;
+ num = nd->u.scr.label_list_num;
+ if (!lst) {
+ lst = (struct npc_label_list *) aCallocA (1, sizeof(struct npc_label_list));
+ num = 0;
+ } else
+ lst = (struct npc_label_list *) aRealloc (lst, sizeof(struct npc_label_list)*(num+1));
+
+ // In case of labels not terminated with ':', for user defined function support
+ p = lname;
+ while(isalnum(*(unsigned char*)p) || *p == '_') { p++; }
+ c = *p;
+ *p='\0';
+
+ // here we check if the label fit into the buffer
+ if (strlen(lname) > 23) {
+ ShowError("npc_parse_script: label name longer than 23 chars! '%s'\n (%s)", lname, current_file);
+ exit(1);
+ }
+ memcpy(lst[num].name, lname, strlen(lname)+1); //including EOS
+
+ *p = c;
+ lst[num].pos = pos;
+ nd->u.scr.label_list = lst;
+ nd->u.scr.label_list_num = num+1;
+
+ return 0;
+}
+
+/*==========================================
+ * scripts‰ðÍ
+ *------------------------------------------
+ */
+static void npc_parse_script_line(unsigned char *p,int *curly_count,int line) {
+ int i = strlen((char *)p),j;
+ int string_flag = 0;
+ static int comment_flag = 0;
+ for(j = 0; j < i ; j++) {
+ if(comment_flag) {
+ if(p[j] == '*' && p[j+1] == '/') {
+ // ƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒgI—¹
+ j++;
+ (*curly_count)--;
+ comment_flag = 0;
+ }
+ } else if(string_flag) {
+ if(p[j] == '"') {
+ string_flag = 0;
+ } else if(p[j] == '\\' && p[j-1]<=0x7e) {
+ // ƒGƒXƒP[ƒv
+ j++;
+ }
+ } else {
+ if(p[j] == '"') {
+ string_flag = 1;
+ } else if(p[j] == '}') {
+ if(*curly_count == 0) {
+ break;
+ } else {
+ (*curly_count)--;
+ }
+ } else if(p[j] == '{') {
+ (*curly_count)++;
+ } else if(p[j] == '/' && p[j+1] == '/') {
+ // ƒRƒƒ“ƒg
+ break;
+ } else if(p[j] == '/' && p[j+1] == '*') {
+ // ƒ}ƒ‹ƒ`ƒ‰ƒCƒ“ƒRƒƒ“ƒg
+ j++;
+ (*curly_count)++;
+ comment_flag = 1;
+ }
+ }
+ }
+ if(string_flag) {
+ printf("Missing '\"' at file %s line %d\n",current_file,line);
+ exit(1);
+ }
+}
+
+// Like npc_parse_script, except it's sole use is to skip the contents of a script. [Skotlex]
+static int npc_skip_script (char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
+{
+ unsigned char *srcbuf = NULL;
+ int srcsize = 65536;
+ int startline = 0;
+ unsigned char line[1024];
+ int curly_count = 0;
+
+ srcbuf = (unsigned char *)aMallocA(srcsize*sizeof(char));
+ if (strchr(first_line, '{')) {
+ strcpy((char *)srcbuf, strchr(first_line, '{'));
+ startline = *lines;
+ } else
+ srcbuf[0] = 0;
+ npc_parse_script_line(srcbuf,&curly_count,*lines);
+ while (curly_count > 0) {
+ fgets ((char *)line, 1020, fp);
+ (*lines)++;
+ npc_parse_script_line(line,&curly_count,*lines);
+ if (feof(fp))
+ break;
+ if (strlen((char *)srcbuf) + strlen((char *)line) + 1 >= (size_t)srcsize) {
+ srcsize += 65536;
+ srcbuf = (unsigned char *)aRealloc(srcbuf, srcsize);
+ malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
+ }
+ if (srcbuf[0] != '{') {
+ if (strchr((char *) line,'{')) {
+ strcpy((char *) srcbuf, strchr((const char *) line, '{'));
+ startline = *lines;
+ }
+ } else
+ strcat((char *) srcbuf, (const char *) line);
+ }
+ if(curly_count > 0)
+ ShowError("Missing right curly at file %s, line %d\n",current_file, *lines);
+ aFree(srcbuf);
+ return 0;
+}
+
+static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines,const char* file)
+{
+ int x, y, dir = 0, m, xs = 0, ys = 0, class_ = 0; // [Valaris] thanks to fov
+ char mapname[MAP_NAME_LENGTH];
+ unsigned char *srcbuf = NULL;
+ struct script_code *script;
+ int srcsize = 65536;
+ int startline = 0;
+ unsigned char line[1024];
+ int i;
+ struct npc_data *nd, *dnd;
+ struct dbt *label_db;
+ char *p;
+ struct npc_label_list *label_dup = NULL;
+ int label_dupnum = 0;
+ int src_id = 0;
+
+ if (strcmp(w1, "-") == 0) {
+ x = 0; y = 0; m = -1;
+ } else {
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%15[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
+ (strcmp(w2, "script") == 0 && strchr(w4,',') == NULL)) {
+ ShowError("bad script line (in file %s): %s\n", file, w3);
+ return 1;
+ }
+ m = map_mapname2mapid(mapname);
+ }
+
+ if (strcmp(w2, "script") == 0){
+ // parsing script with curly
+ int curly_count = 0;
+ srcbuf = (unsigned char *)aMallocA(srcsize*sizeof(char));
+ if (strchr(first_line, '{')) {
+ strcpy((char *)srcbuf, strchr(first_line, '{'));
+ startline = *lines;
+ } else
+ srcbuf[0] = 0;
+ npc_parse_script_line(srcbuf,&curly_count,*lines);
+ while (curly_count > 0) {
+ fgets ((char *)line, 1020, fp);
+ (*lines)++;
+ npc_parse_script_line(line,&curly_count,*lines);
+ if (feof(fp))
+ break;
+ if (strlen((char *)srcbuf) + strlen((char *)line) + 1 >= (size_t)srcsize) {
+ srcsize += 65536;
+ srcbuf = (unsigned char *)aRealloc(srcbuf, srcsize);
+ malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
+ }
+ if (srcbuf[0] != '{') {
+ if (strchr((char *) line,'{')) {
+ strcpy((char *) srcbuf, strchr((const char *) line, '{'));
+ startline = *lines;
+ }
+ } else
+ strcat((char *) srcbuf, (const char *) line);
+ }
+ if(curly_count > 0) {
+ ShowError("Missing right curly at file %s, line %d\n",file, *lines);
+ script = NULL;
+ } else {
+ // printf("Ok line %d\n",*lines);
+ script = parse_script((unsigned char *) srcbuf, file, startline);
+ }
+ if (script == NULL) {
+ // script parse error?
+ aFree(srcbuf);
+ return 1;
+ }
+ } else {
+ // duplicate‚·‚é
+ char srcname[128];
+ struct npc_data *dnd;
+ if (sscanf(w2, "duplicate(%[^)])", srcname) != 1) {
+ ShowError("bad duplicate name (in %s)! : %s", file, w2);
+ return 0;
+ }
+ if ((dnd = npc_name2id(srcname)) == NULL) {
+ ShowError("bad duplicate name (in %s)! (not exist) : %s\n", file, srcname);
+ return 0;
+ }
+ script = dnd->u.scr.script;
+ label_dup = dnd->u.scr.label_list;
+ label_dupnum = dnd->u.scr.label_list_num;
+ src_id = dnd->bl.id;
+
+ }// end of ƒXƒNƒŠƒvƒg‰ðÍ
+
+ nd = (struct npc_data *)aCalloc(1, sizeof(struct npc_data));
+
+ if (sscanf(w4, "%d,%d,%d", &class_, &xs, &ys) == 3) {
+ // ÚGŒ^NPC
+ int i, j;
+
+ if (xs >= 0) xs = xs * 2 + 1;
+ if (ys >= 0) ys = ys * 2 + 1;
+
+ if (m >= 0) {
+ for (i = 0; i < ys; i++) {
+ for (j = 0; j < xs; j++) {
+ if (map_getcell(m, x - xs/2 + j, y - ys/2 + i, CELL_CHKNOPASS))
+ continue;
+ map_setcell(m, x - xs/2 + j, y - ys/2 + i, CELL_SETNPC);
+ }
+ }
+ }
+ nd->u.scr.xs = xs;
+ nd->u.scr.ys = ys;
+ } else {
+ // ƒNƒŠƒbƒNŒ^NPC
+ class_ = atoi(w4);
+ nd->u.scr.xs = 0;
+ nd->u.scr.ys = 0;
+ }
+
+ while ((p = strchr(w3,':'))) {
+ if (p[1] == ':') break;
+ }
+ if (p) {
+ *p = 0;
+ memcpy(nd->name, w3, NAME_LENGTH-1);
+ memcpy(nd->exname, p+2, NAME_LENGTH-1);
+ } else {
+ memcpy(nd->name, w3, NAME_LENGTH-1);
+ memcpy(nd->exname, w3, NAME_LENGTH-1);
+ }
+
+ if((dnd = npc_name2id(nd->exname))){
+ if(battle_config.etc_log)
+ ShowInfo("npc_parse_script: Overriding NPC '%s::%s' to '%s::%d'.. in file '%s' (Duplicated System Name - Lazy scripters >_>) \n",nd->name,nd->exname,nd->name,npc_script,file);
+ sprintf(nd->exname, "%d", npc_script);
+ }
+
+ nd->bl.prev = nd->bl.next = NULL;
+ nd->bl.m = m;
+ nd->bl.x = x;
+ nd->bl.y = y;
+ nd->bl.id = npc_get_new_npc_id();
+ nd->class_ = class_;
+ nd->speed = 200;
+ nd->u.scr.script = script;
+ nd->u.scr.src_id = src_id;
+
+ npc_script++;
+ nd->bl.type = BL_NPC;
+ nd->bl.subtype = SCRIPT;
+
+ for (i = 0; i < MAX_EVENTTIMER; i++)
+ nd->eventtimer[i] = -1;
+ if (m >= 0) {
+ nd->n = map_addnpc(m, nd);
+ status_change_init(&nd->bl);
+ unit_dataset(&nd->bl);
+ nd->ud.dir = dir;
+ map_addblock(&nd->bl);
+ // Unused. You can always use xxx::OnXXXX events. Have this removed to improve perfomance.
+ /*if (evflag) { // ƒCƒxƒ“ƒgŒ^
+ struct event_data *ev = (struct event_data *)aCalloc(1, sizeof(struct event_data));
+ ev->nd = nd;
+ ev->pos = 0;
+ strdb_put(ev_db, nd->exname, ev);
+ } else {
+ clif_spawn(&nd->bl);
+ }*/
+ if (class_ >= 0){
+ status_set_viewdata(&nd->bl, nd->class_);
+ clif_spawn(&nd->bl);
+ }
+ } else {
+ // we skip map_addnpc, but still add it to the list of ID's
+ map_addiddb(&nd->bl);
+ }
+ strdb_put(npcname_db, nd->exname, nd);
+
+ //-----------------------------------------
+ // ƒ‰ƒxƒ‹ƒf[ƒ^‚Ì€”õ
+ if (srcbuf){
+ // script–{‘Ì‚ª‚ ‚éꇂ̈—
+ // ƒ‰ƒxƒ‹ƒf[ƒ^‚̃Rƒ“ƒo[ƒg
+ label_db = script_get_label_db();
+ label_db->foreach(label_db, npc_convertlabel_db, nd);
+
+ // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
+ aFree(srcbuf);
+ } else {
+ // duplicate
+ nd->u.scr.label_list = label_dup; // ƒ‰ƒxƒ‹ƒf[ƒ^‹¤—L
+ nd->u.scr.label_list_num = label_dupnum;
+ }
+
+ //-----------------------------------------
+ // ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹ƒf[ƒ^‚̃GƒNƒXƒ|[ƒg
+ for (i = 0; i < nd->u.scr.label_list_num; i++){
+ char *lname = nd->u.scr.label_list[i].name;
+ int pos = nd->u.scr.label_list[i].pos;
+
+ if ((lname[0] == 'O' || lname[0] == 'o') && (lname[1] == 'N' || lname[1] == 'n')) {
+ // this check is useless here because the buffer is only 24 chars
+ // and already overwritten if this is here is reached
+ // I leave the check anyway but place it correctly to npc_convertlabel_db
+ if (strlen(lname)>NAME_LENGTH-1) {
+ ShowError("npc_parse_script: label name longer than %d chars! '%s' (%s)\n", NAME_LENGTH-1, lname, file);
+ exit(1);
+ } else {
+ struct event_data *ev;
+ unsigned char buf[51];
+ // 51 comes from: 24 for npc name + 24 for label + 2 for a "::" and 1 for EOS
+ sprintf(buf,"%s::%s",nd->exname,lname);
+
+ // remember the label is max 50 chars + eos; see the strdb_init below
+ // generate the data and insert it
+ ev=(struct event_data *)aMalloc(sizeof(struct event_data));
+ ev->nd=nd;
+ ev->pos=pos;
+ if (strdb_put(ev_db,buf,ev) != NULL) //There was already another event of the same name?
+ ShowWarning("npc_parse_script : duplicate event %s (%s)\n",buf, file);
+ }
+ }
+ }
+
+ //-----------------------------------------
+ // ƒ‰ƒxƒ‹ƒf[ƒ^‚©‚çƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽæ‚èž‚Ý
+ for (i = 0; i < nd->u.scr.label_list_num; i++){
+ int t = 0, k = 0;
+ char *lname = nd->u.scr.label_list[i].name;
+ int pos = nd->u.scr.label_list[i].pos;
+ if (sscanf(lname, "OnTimer%d%n", &t, &k) == 1 && lname[k] == '\0') {
+ // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
+ struct npc_timerevent_list *te = nd->u.scr.timer_event;
+ int j, k = nd->u.scr.timeramount;
+ if (te == NULL)
+ te = (struct npc_timerevent_list *)aMallocA(sizeof(struct npc_timerevent_list));
+ else
+ te = (struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) );
+ for (j = 0; j < k; j++){
+ if (te[j].timer > t){
+ memmove(te+j+1, te+j, sizeof(struct npc_timerevent_list)*(k-j));
+ break;
+ }
+ }
+ te[j].timer = t;
+ te[j].pos = pos;
+ nd->u.scr.timer_event = te;
+ nd->u.scr.timeramount++;
+ }
+ }
+ nd->u.scr.timerid = -1;
+
+ return 0;
+}
+
+/*==========================================
+ * functions‰ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_function (char *w1, char *w2, char *w3, char *w4, char *first_line, FILE *fp, int *lines,const char* file)
+{
+ unsigned char *srcbuf, *p;
+ struct script_code *script;
+ struct script_code *oldscript;
+ int srcsize = 65536;
+ int startline = 0;
+ char line[1024];
+ int curly_count = 0;
+ struct dbt *user_db;
+
+ // ƒXƒNƒŠƒvƒg‚̉ðÍ
+ srcbuf = (unsigned char *) aMallocA (srcsize*sizeof(char));
+ if (strchr(first_line,'{')) {
+ strcpy(srcbuf, strchr(first_line,'{'));
+ startline = *lines;
+ } else
+ srcbuf[0] = 0;
+ npc_parse_script_line(srcbuf,&curly_count,*lines);
+
+ while (curly_count > 0) {
+ fgets(line, sizeof(line) - 1, fp);
+ (*lines)++;
+ npc_parse_script_line(line,&curly_count,*lines);
+ if (feof(fp))
+ break;
+ if (strlen(srcbuf)+strlen(line)+1 >= (unsigned int)srcsize) {
+ srcsize += 65536;
+ srcbuf = (char *)aRealloc(srcbuf, srcsize);
+ malloc_tsetdword(srcbuf + srcsize - 65536, '\0', 65536);
+ }
+ if (srcbuf[0]!='{') {
+ if (strchr(line,'{')) {
+ strcpy(srcbuf, strchr(line,'{'));
+ startline = *lines;
+ }
+ } else
+ strcat(srcbuf,line);
+ }
+ if(curly_count > 0) {
+ ShowError("Missing right curly at file %s, line %d\n",file, *lines);
+ script = NULL;
+ } else {
+ script = parse_script(srcbuf, file, startline);
+ }
+ if (script == NULL) {
+ // script parse error?
+ aFree(srcbuf);
+ return 1;
+ }
+
+ p = (char *) aMallocA (50*sizeof(char));
+ strncpy(p, w3, 50);
+
+ user_db = script_get_userfunc_db();
+ oldscript = (struct script_code *)strdb_get(user_db, p);
+ if(oldscript != NULL) {
+ printf("\r"); //Carriage return to clear the 'loading..' line. [Skotlex]
+ ShowInfo("parse_function: Overwriting user function [%s] (%s:%d)\n", p, file, *lines);
+ script_free_code(oldscript);
+ user_db->remove(user_db,str2key(p));
+ strdb_put(user_db, p, script);
+ } else
+ strdb_put(user_db, p, script);
+
+ // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
+ aFree(srcbuf);
+
+// printf("function %s => %p\n",p,script);
+
+ return 0;
+}
+
+
+/*==========================================
+ * Parse Mob 1 - Parse mob list into each map
+ * Parse Mob 2 - Actually Spawns Mob
+ * [Wizputer]
+ * If cached =1, it is a dynamic cached mob
+ * index points to the index in the mob_list of the map_data cache.
+ * -1 indicates that it is not stored on the map.
+ *------------------------------------------
+ */
+int npc_parse_mob2 (struct spawn_data *mob, int index)
+{
+ int i;
+ struct mob_data *md;
+
+ for (i = 0; i < mob->num; i++) {
+ md = mob_spawn_dataset(mob);
+ md->spawn = mob;
+ md->spawn_n = index;
+ md->special_state.cached = (index>=0); //If mob is cached on map, it is dynamically removed
+ mob_spawn(md);
+ }
+
+ return 1;
+}
+
+int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
+{
+ int level, num, class_, mode, x,y,xs,ys;
+ char mapname[MAP_NAME_LENGTH];
+ char mobname[NAME_LENGTH];
+ struct spawn_data mob, *data;
+
+ malloc_set(&mob, 0, sizeof(struct spawn_data));
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%15[^,],%d,%d,%d,%d", mapname, &x, &y, &xs, &ys) < 3 ||
+ sscanf(w4, "%d,%d,%u,%u,%49[^\r\n]", &class_, &num, &mob.delay1, &mob.delay2, mob.eventname) < 2 ) {
+ ShowError("bad monster line : %s %s %s (file %s)\n", w1, w3, w4, current_file);
+ return 1;
+ }
+ if (!mapindex_name2id(mapname)) {
+ ShowError("wrong map name : %s %s (file %s)\n", w1,w3, current_file);
+ return 1;
+ }
+ mode = map_mapname2mapid(mapname);
+ if (mode < 0) //Not loaded on this map-server instance.
+ return 1;
+ mob.m = (unsigned short)mode;
+
+ if (x < 0 || map[mob.m].xs <= x || y < 0 || map[mob.m].ys <= y) {
+ ShowError("Out of range spawn coordinates: %s (%d,%d), map size is (%d,%d) - %s %s (file %s)\n", map[mob.m].name, x, y, map[mob.m].xs-1, map[mob.m].ys-1, w1,w3, current_file);
+ return 1;
+ }
+
+ // check monster ID if exists!
+ if (mobdb_checkid(class_)==0) {
+ ShowError("bad monster ID : %s %s (file %s)\n", w3, w4, current_file);
+ return 1;
+ }
+
+ if (num < 1 || num>1000 ) {
+ ShowError("wrong number of monsters : %s %s (file %s)\n", w3, w4, current_file);
+ return 1;
+ }
+
+ mob.num = (unsigned short)num;
+ mob.class_ = (short) class_;
+ mob.x = (unsigned short)x;
+ mob.y = (unsigned short)y;
+ mob.xs = (signed short)xs;
+ mob.ys = (signed short)ys;
+
+ if (mob.num > 1 && battle_config.mob_count_rate != 100) {
+ if ((mob.num = mob.num * battle_config.mob_count_rate / 100) < 1)
+ mob.num = 1;
+ }
+
+ if (battle_config.force_random_spawn || (mob.x == 0 && mob.y == 0))
+ { //Force a random spawn anywhere on the map.
+ mob.x = mob.y = 0;
+ mob.xs = mob.ys = -1;
+ }
+
+ //Apply the spawn delay fix [Skotlex]
+ mode = mob_db(class_)->status.mode;
+ if (mode & MD_BOSS) { //Bosses
+ if (battle_config.boss_spawn_delay != 100)
+ {
+ mob.delay1 = mob.delay1*battle_config.boss_spawn_delay/100;
+ mob.delay2 = mob.delay2*battle_config.boss_spawn_delay/100;
+ }
+ } else if (mode&MD_PLANT) { //Plants
+ if (battle_config.plant_spawn_delay != 100)
+ {
+ mob.delay1 = mob.delay1*battle_config.plant_spawn_delay/100;
+ mob.delay2 = mob.delay2*battle_config.plant_spawn_delay/100;
+ }
+ } else if (battle_config.mob_spawn_delay != 100)
+ { //Normal mobs
+ mob.delay1 = mob.delay1*battle_config.mob_spawn_delay/100;
+ mob.delay2 = mob.delay2*battle_config.mob_spawn_delay/100;
+ }
+
+ // parse MOB_NAME,[MOB LEVEL]
+ if (sscanf(w3, "%23[^,],%d", mobname, &level) > 1)
+ mob.level = level;
+
+ if(mob.delay1>0xfffffff || mob.delay2>0xfffffff) {
+ ShowError("wrong monsters spawn delays : %s %s (file %s)\n", w3, w4, current_file);
+ return 1;
+ }
+
+ //Use db names instead of the spawn file ones.
+ if(battle_config.override_mob_names==1)
+ strcpy(mob.name,"--en--");
+ else if (battle_config.override_mob_names==2)
+ strcpy(mob.name,"--ja--");
+ else
+ strncpy(mob.name, mobname, NAME_LENGTH-1);
+
+ if (!mob_parse_dataset(&mob)) //Verify dataset.
+ return 1;
+
+ //Now that all has been validated. We allocate the actual memory
+ //that the re-spawn data will use.
+ data = aMalloc(sizeof(struct spawn_data));
+ memcpy(data, &mob, sizeof(struct spawn_data));
+
+ if( !battle_config.dynamic_mobs || mob.delay1 || mob.delay2 ) {
+ npc_parse_mob2(data,-1);
+ npc_delay_mob += mob.num;
+ } else {
+ int index = map_addmobtolist(data->m, data);
+ if( index >= 0 ) {
+ // check if target map has players
+ // (usually shouldn't occur when map server is just starting,
+ // but not the case when we do @reloadscript
+ if (map[mob.m].users > 0)
+ npc_parse_mob2(data,index);
+ npc_cache_mob += mob.num;
+ } else {
+ // mobcache is full
+ // create them as delayed with one second
+ mob.delay1 = 1000;
+ mob.delay2 = 1000;
+ npc_parse_mob2(data,-1);
+ npc_delay_mob += mob.num;
+ }
+ }
+
+ npc_mob++;
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvƒtƒ‰ƒOs‚̉ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
+{
+ int m;
+ char mapname[MAP_NAME_LENGTH];
+ int state = 1;
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%15[^,]",mapname) != 1)
+ return 1;
+
+ m = map_mapname2mapid(mapname);
+ if (m < 0)
+ return 1;
+ if (w4 && strcmpi(w4, "off") == 0)
+ state = 0; //Disable mapflag rather than enable it. [Skotlex]
+
+//ƒ}ƒbƒvƒtƒ‰ƒO
+ if (strcmpi(w3, "nosave") == 0) {
+ char savemap[MAP_NAME_LENGTH];
+ int savex, savey;
+ if (state == 0)
+ ; //Map flag disabled.
+ else if (strcmp(w4, "SavePoint") == 0) {
+ map[m].save.map = 0;
+ map[m].save.x = -1;
+ map[m].save.y = -1;
+ } else if (sscanf(w4, "%15[^,],%d,%d", savemap, &savex, &savey) == 3) {
+ map[m].save.map = mapindex_name2id(savemap);
+ map[m].save.x = savex;
+ map[m].save.y = savey;
+ if (!map[m].save.map) {
+ ShowWarning("Specified save point map '%s' for mapflag 'nosave' not found (file %s), using 'SavePoint'.\n",savemap,current_file);
+ map[m].save.x = -1;
+ map[m].save.y = -1;
+ }
+ }
+ map[m].flag.nosave = state;
+ }
+ else if (strcmpi(w3,"nomemo")==0) {
+ map[m].flag.nomemo=state;
+ }
+ else if (strcmpi(w3,"noteleport")==0) {
+ map[m].flag.noteleport=state;
+ }
+ else if (strcmpi(w3,"nowarp")==0) {
+ map[m].flag.nowarp=state;
+ }
+ else if (strcmpi(w3,"nowarpto")==0) {
+ map[m].flag.nowarpto=state;
+ }
+ else if (strcmpi(w3,"noreturn")==0) {
+ map[m].flag.noreturn=state;
+ }
+ else if (strcmpi(w3,"monster_noteleport")==0) {
+ map[m].flag.monster_noteleport=state;
+ }
+ else if (strcmpi(w3,"nobranch")==0) {
+ map[m].flag.nobranch=state;
+ }
+ else if (strcmpi(w3,"nopenalty")==0) {
+ map[m].flag.noexppenalty=state;
+ map[m].flag.nozenypenalty=state;
+ }
+ else if (strcmpi(w3,"pvp")==0) {
+ map[m].flag.pvp=state;
+ if (state) {
+ map[m].flag.gvg=0;
+ map[m].flag.gvg=0;
+ map[m].flag.gvg_dungeon=0;
+ map[m].flag.gvg_castle=0;
+ }
+ }
+ else if (strcmpi(w3,"pvp_noparty")==0) {
+ map[m].flag.pvp_noparty=state;
+ }
+ else if (strcmpi(w3,"pvp_noguild")==0) {
+ map[m].flag.pvp_noguild=state;
+ }
+ else if (strcmpi(w3, "pvp_nightmaredrop") == 0) {
+ char drop_arg1[16], drop_arg2[16];
+ int drop_id = 0, drop_type = 0, drop_per = 0;
+ if (sscanf(w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) == 3) {
+ int i;
+ if (strcmp(drop_arg1, "random") == 0)
+ drop_id = -1;
+ else if (itemdb_exists((drop_id = atoi(drop_arg1))) == NULL)
+ drop_id = 0;
+ if (strcmp(drop_arg2, "inventory") == 0)
+ drop_type = 1;
+ else if (strcmp(drop_arg2,"equip") == 0)
+ drop_type = 2;
+ else if (strcmp(drop_arg2,"all") == 0)
+ drop_type = 3;
+
+ if (drop_id != 0){
+ for (i = 0; i < MAX_DROP_PER_MAP; i++) {
+ if (map[m].drop_list[i].drop_id == 0){
+ map[m].drop_list[i].drop_id = drop_id;
+ map[m].drop_list[i].drop_type = drop_type;
+ map[m].drop_list[i].drop_per = drop_per;
+ break;
+ }
+ }
+ map[m].flag.pvp_nightmaredrop = 1;
+ }
+ } else if (!state) //Disable
+ map[m].flag.pvp_nightmaredrop = 0;
+ }
+ else if (strcmpi(w3,"pvp_nocalcrank")==0) {
+ map[m].flag.pvp_nocalcrank=state;
+ }
+ else if (strcmpi(w3,"gvg")==0) {
+ map[m].flag.gvg=state;
+ if (state) map[m].flag.pvp=0;
+ }
+ else if (strcmpi(w3,"gvg_noparty")==0) {
+ map[m].flag.gvg_noparty=state;
+ }
+ else if (strcmpi(w3,"gvg_dungeon")==0) {
+ map[m].flag.gvg_dungeon=state;
+ if (state) map[m].flag.pvp=0;
+ }
+ else if (strcmpi(w3,"gvg_castle")==0) {
+ map[m].flag.gvg_castle=state;
+ if (state) map[m].flag.pvp=0;
+ }
+ else if (strcmpi(w3,"noexppenalty")==0) {
+ map[m].flag.noexppenalty=state;
+ }
+ else if (strcmpi(w3,"nozenypenalty")==0) {
+ map[m].flag.nozenypenalty=state;
+ }
+ else if (strcmpi(w3,"notrade")==0) {
+ map[m].flag.notrade=state;
+ }
+ else if (strcmpi(w3,"novending")==0) {
+ map[m].flag.novending=state;
+ }
+ else if (strcmpi(w3,"nodrop")==0) {
+ map[m].flag.nodrop=state;
+ }
+ else if (strcmpi(w3,"noskill")==0) {
+ map[m].flag.noskill=state;
+ }
+ else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
+ map[m].flag.noicewall=state;
+ }
+ else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
+ map[m].flag.snow=state;
+ }
+ else if (strcmpi(w3,"clouds")==0) {
+ map[m].flag.clouds=state;
+ }
+ else if (strcmpi(w3,"clouds2")==0) { // clouds2 [Valaris]
+ map[m].flag.clouds2=state;
+ }
+ else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
+ map[m].flag.fog=state;
+ }
+ else if (strcmpi(w3,"fireworks")==0) {
+ map[m].flag.fireworks=state;
+ }
+ else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
+ map[m].flag.sakura=state;
+ }
+ else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
+ map[m].flag.leaves=state;
+ }
+ else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
+ map[m].flag.rain=state;
+ }
+ else if (strcmpi(w3,"indoors")==0) { // celest
+ map[m].flag.indoors=state;
+ }
+ else if (strcmpi(w3,"nightenabled")==0) { // Skotlex
+ map[m].flag.nightenabled=state;
+ }
+ else if (strcmpi(w3,"nogo")==0) { // celest
+ map[m].flag.nogo=state;
+ }
+ else if (strcmpi(w3,"noexp")==0) { // Lorky
+ map[m].flag.nobaseexp=state;
+ map[m].flag.nojobexp=state;
+ }
+ else if (strcmpi(w3,"nobaseexp")==0) { // Lorky
+ map[m].flag.nobaseexp=state;
+ }
+ else if (strcmpi(w3,"nojobexp")==0) { // Lorky
+ map[m].flag.nojobexp=state;
+ }
+ else if (strcmpi(w3,"noloot")==0) { // Lorky
+ map[m].flag.nomobloot=state;
+ map[m].flag.nomvploot=state;
+ }
+ else if (strcmpi(w3,"nomobloot")==0) { // Lorky
+ map[m].flag.nomobloot=state;
+ }
+ else if (strcmpi(w3,"nomvploot")==0) { // Lorky
+ map[m].flag.nomvploot=state;
+ }
+ else if (strcmpi(w3,"nocommand")==0) { // Skotlex
+ if (state) {
+ if (sscanf(w4, "%d", &state) == 1)
+ map[m].nocommand =state;
+ else //No level specified, block everyone.
+ map[m].nocommand =100;
+ } else
+ map[m].nocommand=0;
+ }
+ else if (strcmpi(w3,"restricted")==0) { // Komurka
+ if (state) {
+ map[m].flag.restricted=1;
+ sscanf(w4, "%d", &state);
+ map[m].zone |= 1<<(state+1);
+ } else {
+ map[m].flag.restricted=0;
+ map[m].zone = 0;
+ }
+ }
+ else if (strcmpi(w3,"jexp")==0) {
+ map[m].jexp = (state) ? atoi(w4) : 100;
+ if( map[m].jexp < 0 ) map[m].jexp = 100;
+ map[m].flag.nojobexp = (map[m].jexp==0)?1:0;
+ }
+ else if (strcmpi(w3,"bexp")==0) {
+ map[m].bexp = (state) ? atoi(w4) : 100;
+ if( map[m].bexp < 0 ) map[m].bexp = 100;
+ map[m].flag.nobaseexp = (map[m].bexp==0)?1:0;
+ }
+ else if (strcmpi(w3,"loadevent")==0) { // Skotlex
+ map[m].flag.loadevent=state;
+ }
+ else if (strcmpi(w3,"nochat")==0) { // Skotlex
+ map[m].flag.nochat=state;
+ }
+ else if (strcmpi(w3,"partylock")==0) { // Skotlex
+ map[m].flag.partylock=state;
+ }
+ else if (strcmpi(w3,"guildlock")==0) { // Skotlex
+ map[m].flag.guildlock=state;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Setting up map cells
+ *------------------------------------------
+ */
+static int npc_parse_mapcell (char *w1, char *w2, char *w3, char *w4)
+{
+ int m, cell, x, y, x0, y0, x1, y1;
+ char type[24], mapname[MAP_NAME_LENGTH];
+
+ if (sscanf(w1, "%15[^,]", mapname) != 1)
+ return 1;
+
+ m = map_mapname2mapid(mapname);
+ if (m < 0)
+ return 1;
+
+ if (sscanf(w3, "%23[^,],%d,%d,%d,%d", type, &x0, &y0, &x1, &y1) < 4) {
+ ShowError("Bad setcell line : %s\n",w3);
+ return 1;
+ }
+ cell = strtol(type, (char **)NULL, 0);
+ //printf ("0x%x %d %d %d %d\n", cell, x0, y0, x1, y1);
+
+ if (x0 > x1) { int t = x0; x0 = x1; x1 = t; }
+ if (y0 > y1) { int t = y0; y0 = y1; y1 = t; }
+
+ for (x = x0; x <= x1; x++) {
+ for (y = y0; y <= y1; y++) {
+ map_setcell(m, x, y, cell);
+ //printf ("setcell 0x%x %d %d %d\n", cell, m, x, y);
+ }
+ }
+
+ return 0;
+}
+
+void npc_parsesrcfile (char *name)
+{
+ int m, lines = 0;
+ char line[2048];
+
+ FILE *fp = fopen (name,"r");
+ if (fp == NULL) {
+ ShowError ("File not found : %s\n", name);
+ return;
+ }
+ current_file = name;
+
+ while (fgets(line, sizeof(line) - 1, fp)) {
+ char w1[2048], w2[2048], w3[2048], w4[2048], mapname[2048];
+ int i, w4pos, count;
+ lines++;
+
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (!sscanf(line, " %n", &i) && i == strlen(line)) // just whitespace
+ continue;
+
+ // ʼn‚̓^ƒu‹æØ‚è‚Ń`ƒFƒbƒN‚µ‚Ä‚Ý‚ÄAƒ_ƒ‚È‚çƒXƒy[ƒX‹æØ‚è‚ÅŠm”F
+ w1[0] = w2[0] = w3[0] = w4[0] = '\0'; //It's best to initialize values
+ //to prevent passing previously parsed values to the parsers when not all
+ //fields are specified. [Skotlex]
+ if ((count = sscanf(line, "%[^\t\r\n]\t%[^\t\r\n]\t%[^\t\r\n]\t%n%[^\r\n]", w1, w2, w3, &w4pos, w4)) < 3)
+ {
+ if ((count = sscanf(line, "%s %s %[^\t]\t %n%[^\n]", w1, w2, w3, &w4pos, w4)) == 4 ||
+ (count = sscanf(line, "%s %s %s %n%[^\n]\n", w1, w2, w3, &w4pos, w4)) >= 3)
+ {
+ ShowWarning("\r");
+ ShowWarning("Incorrect separator syntax in file '%s', line '%i'. Use tabs instead of spaces!\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
+ } else {
+ ShowError("\r"); //Erase the npc spinner.
+ ShowError("Could not parse file '%s', line '%i'.\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
+ continue;
+ }
+ }
+
+ // ƒ}ƒbƒv‚Ì‘¶ÝŠm”F
+ if (strcmp(w1,"-") !=0 && strcmpi(w1,"function") != 0 ){
+ sscanf(w1,"%[^,]",mapname);
+ if (!mapindex_name2id(mapname)) { //Incorrect map
+ ShowError("Invalid map '%s' in line %d, file %s\n", mapname, lines, current_file);
+ if (strcmpi(w2,"script") == 0 && count > 3) //we must skip the script info...
+ npc_skip_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
+ continue;
+ }
+ if ((m = map_mapname2mapid(mapname)) < 0) {
+ // "mapname" is not assigned to this server
+ // we must skip the script info...
+ if (strcmpi(w2,"script") == 0 && count > 3)
+ npc_skip_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
+ continue;
+ }
+ }
+ if (strcmpi(w2,"warp") == 0 && count > 3) {
+ npc_parse_warp(w1,w2,w3,w4);
+ } else if (strcmpi(w2,"shop") == 0 && count > 3) {
+ npc_parse_shop(w1,w2,w3,w4);
+ } else if (strcmpi(w2,"script") == 0 && count > 3) {
+ if (strcmpi(w1,"function") == 0) {
+ npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
+ } else {
+ npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
+ }
+ } else if ((i = 0, sscanf(w2,"duplicate%n",&i), (i > 0 && w2[i] == '(')) && count > 3) {
+ npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines,name);
+ } else if (strcmpi(w2,"monster") == 0 && count > 3) {
+ npc_parse_mob(w1,w2,w3,w4);
+ } else if (strcmpi(w2,"mapflag") == 0 && count >= 3) {
+ npc_parse_mapflag(w1,w2,w3,w4);
+ } else if (strcmpi(w2,"setcell") == 0 && count >= 3) {
+ npc_parse_mapcell(w1,w2,w3,w4);
+ } else {
+ ShowError("Probably TAB is missing in file '%s', line '%i':\n * %s %s %s %s\n",current_file,lines,w1,w2,w3,w4);
+ }
+ }
+ fclose(fp);
+
+ return;
+}
+
+int npc_script_event(TBL_PC* sd, int type) {
+ int i;
+ if (type < 0 || type >= NPCE_MAX)
+ return 0;
+ if (!sd) {
+ if (battle_config.error_log)
+ ShowError("npc_script_event: NULL sd. Event Type %d\n", type);
+ return 0;
+ }
+ if (script_event[type].nd) {
+ TBL_NPC *nd = script_event[type].nd;
+ run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
+ return 1;
+ } else if (script_event[type].event_count) {
+ for (i = 0; i<script_event[type].event_count; i++) {
+ npc_event_sub(sd,script_event[type].event[i],script_event[type].event_name[i]);
+ }
+ return i;
+ }
+ return 0;
+}
+
+static int npc_read_event_script_sub(DBKey key,void *data,va_list ap)
+{
+ unsigned char *p = key.str;
+ unsigned char *name = va_arg(ap,unsigned char *);
+ struct event_data **event_buf = va_arg(ap,struct event_data**);
+ unsigned char **event_name = va_arg(ap,unsigned char **);
+ unsigned char *count = va_arg(ap,char *);;
+
+ if (*count >= UCHAR_MAX) return 0;
+
+ if((p=strchr(p,':')) && p && strcmpi(name,p)==0 )
+ {
+ event_buf[*count] = (struct event_data *)data;
+ event_name[*count] = key.str;
+ (*count)++;
+ return 1;
+ }
+ return 0;
+}
+
+static void npc_read_event_script(void)
+{
+ int i;
+ unsigned char buf[64]="::";
+ struct {
+ char *name;
+ char *event_name;
+ } config[] = {
+ {"Login Event",script_config.login_event_name},
+ {"Logout Event",script_config.logout_event_name},
+ {"Load Map Event",script_config.loadmap_event_name},
+ {"Base LV Up Event",script_config.baselvup_event_name},
+ {"Job LV Up Event",script_config.joblvup_event_name},
+ {"Die Event",script_config.die_event_name},
+ {"Kill PC Event",script_config.kill_pc_event_name},
+ {"Kill NPC Event",script_config.kill_mob_event_name},
+ };
+
+ for (i = 0; i < NPCE_MAX; i++) {
+ if (script_event[i].nd)
+ script_event[i].nd = NULL;
+ if (script_event[i].event_count)
+ script_event[i].event_count = 0;
+ if (!script_config.event_script_type) {
+ //Use a single NPC as event source.
+ script_event[i].nd = npc_name2id(config[i].event_name);
+ } else {
+ //Use an array of Events
+ strncpy(buf+2,config[i].event_name,62);
+ ev_db->foreach(ev_db,npc_read_event_script_sub,buf,
+ &script_event[i].event,
+ &script_event[i].event_name,
+ &script_event[i].event_count);
+ }
+ }
+ if (battle_config.etc_log) {
+ //Print summary.
+ for (i = 0; i < NPCE_MAX; i++) {
+ if(!script_config.event_script_type) {
+ if (script_event[i].nd)
+ ShowInfo("%s: Using NPC named '%s'.\n", config[i].name, config[i].event_name);
+ else
+ ShowInfo("%s: No NPC found with name '%s'.\n", config[i].name, config[i].event_name);
+ } else
+ ShowInfo("%s: %d '%s' events.\n", config[i].name, script_event[i].event_count, config[i].event_name);
+ }
+ }
+}
+static int npc_read_indoors (void)
+{
+ char *buf, *p;
+ int s, m;
+
+ buf = (char *)grfio_reads("data\\indoorrswtable.txt",&s);
+ if (buf == NULL)
+ return -1;
+ buf[s] = 0;
+
+ for (p = buf; p - buf < s; ) {
+ char map_name[64];
+ if (sscanf(p, "%15[^#]#", map_name) == 1) {
+ size_t pos = strlen(map_name) - 4; // replace '.xxx' extension
+ memcpy(map_name+pos,".gat",4); // with '.gat'
+ if ((m = map_mapname2mapid(map_name)) >= 0)
+ map[m].flag.indoors = 1;
+ }
+
+ p = strchr(p, 10);
+ if (!p) break;
+ p++;
+ }
+ aFree(buf);
+ ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\indoorrswtable.txt");
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+
+static int npc_cleanup_sub (struct block_list *bl, va_list ap) {
+ nullpo_retr(0, bl);
+
+ switch(bl->type) {
+ case BL_NPC:
+ npc_unload((struct npc_data *)bl);
+ break;
+ case BL_MOB:
+ //This is used only on reloading npcs, so let's not free spawn-once mobs. [Skotlex]
+ if (((TBL_MOB*)bl)->spawn)
+ unit_free(bl,0);
+ break;
+ }
+
+ return 0;
+}
+
+static int npc_cleanup_dbsub(DBKey key,void * data,va_list ap) {
+ return npc_cleanup_sub((struct block_list*)data, 0);
+}
+
+int npc_reload (void)
+{
+ struct npc_src_list *nsl;
+ int m, i;
+ time_t last_time = time(0);
+ int busy = 0, npc_new_min = npc_id;
+ char c = '-';
+
+ //Remove all npcs/mobs. [Skotlex]
+ map_foreachiddb(npc_cleanup_dbsub);
+ for (m = 0; m < map_num; m++) {
+ if(battle_config.dynamic_mobs) { //dynamic check by [random]
+ for (i = 0; i < MAX_MOB_LIST_PER_MAP; i++)
+ if (map[m].moblist[i]) aFree(map[m].moblist[i]);
+ malloc_set (map[m].moblist, 0, sizeof(map[m].moblist));
+ }
+ if (map[m].npc_num > 0 && battle_config.error_log)
+ ShowWarning("npc_reload: %d npcs weren't removed at map %s!\n", map[m].npc_num, map[m].name);
+ }
+
+ // anything else we should cleanup?
+ // Reloading npc's now
+ ev_db->clear(ev_db,NULL);
+ npcname_db->clear(npcname_db,NULL);
+ npc_warp = npc_shop = npc_script = 0;
+ npc_mob = npc_cache_mob = npc_delay_mob = 0;
+
+ for (nsl = npc_src_first; nsl; nsl = nsl->next) {
+ npc_parsesrcfile(nsl->name);
+ if (script_config.verbose_mode) {
+ printf("\r");
+ ShowStatus("Loading NPCs... %-53s", nsl->name);
+ } else {
+ if (last_time != time(0)) {
+ printf("\r");
+ ShowStatus("Loading NPCs... Working: ");
+ last_time = time(0);
+ switch(busy) {
+ case 0: c='\\'; busy++; break;
+ case 1: c='|'; busy++; break;
+ case 2: c='/'; busy++; break;
+ case 3: c='-'; busy=0;
+ }
+ printf("[%c]",c);
+ }
+ }
+ fflush(stdout);
+ }
+ printf("\r");
+ ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs Cached\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs Not Cached\n",
+ npc_id - npc_new_min, "", npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
+
+ //Re-read the NPC Script Events cache.
+ npc_read_event_script();
+
+ //Execute the OnInit event for freshly loaded npcs. [Skotlex]
+ ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
+ CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
+ // Execute rest of the startup events if connected to char-server. [Lance]
+ if(!CheckForCharServer()){
+ ShowStatus("Event '"CL_WHITE"OnCharIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnCharIfInit"));
+ ShowStatus("Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
+ ShowStatus("Event '"CL_WHITE"OnInterIfInitOnce"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInitOnce"));
+ }
+ return 0;
+}
+
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+int do_final_npc(void)
+{
+ int i;
+ struct block_list *bl;
+
+ for (i = START_NPC_NUM; i < npc_id; i++){
+ if ((bl = map_id2bl(i))){
+ if (bl->type == BL_NPC)
+ npc_unload((struct npc_data *)bl);
+ else if (bl->type&(BL_MOB|BL_PET))
+ unit_free(bl, 0);
+ }
+ }
+
+ ev_db->destroy(ev_db, NULL);
+ //There is no free function for npcname_db because at this point there shouldn't be any npcs left!
+ //So if there is anything remaining, let the memory manager catch it and report it.
+ npcname_db->destroy(npcname_db, NULL);
+ ers_destroy(timer_event_ers);
+ npc_clearsrcfile();
+
+ return 0;
+}
+
+static void npc_debug_warps_sub(struct npc_data *nd)
+{
+ int m;
+ if (nd->bl.type != BL_NPC || nd->bl.subtype != WARP || nd->bl.m < 0)
+ return;
+
+ m = map_mapindex2mapid(nd->u.warp.mapindex);
+ if (m < 0) return; //Warps to another map, nothing to do about it.
+
+ if (map_getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNPC)) {
+ ShowWarning("Warp %s at %s(%d,%d) warps directly on top of an area npc at %s(%d,%d)\n",
+ nd->name,
+ map[nd->bl.m].name, nd->bl.x, nd->bl.y,
+ map[m].name, nd->u.warp.x, nd->u.warp.y
+ );
+ }
+ if (map_getcell(m, nd->u.warp.x, nd->u.warp.y, CELL_CHKNOPASS)) {
+ ShowWarning("Warp %s at %s(%d,%d) warps to a non-walkable tile at %s(%d,%d)\n",
+ nd->name,
+ map[nd->bl.m].name, nd->bl.x, nd->bl.y,
+ map[m].name, nd->u.warp.x, nd->u.warp.y
+ );
+ }
+}
+
+static void npc_debug_warps(void)
+{
+ int m, i;
+ for (m = 0; m < map_num; m++)
+ for (i = 0; i < map[m].npc_num; i++)
+ npc_debug_warps_sub(map[m].npc[i]);
+}
+
+/*==========================================
+ * npc‰Šú‰»
+ *------------------------------------------
+ */
+int do_init_npc(void)
+{
+ struct npc_src_list *nsl;
+ time_t last_time = time(0);
+ int busy, i;
+ char c = '-';
+
+ //Stock view data for normal npcs.
+ malloc_set(&npc_viewdb, 0, sizeof(npc_viewdb));
+ npc_viewdb[0].class_ = INVISIBLE_CLASS; //Invisible class is stored here.
+ for (busy = 1; busy < MAX_NPC_CLASS; busy++)
+ npc_viewdb[busy].class_ = busy;
+ busy = 0;
+ // indoorrswtable.txt and etcinfo.txt [Celest]
+ if (battle_config.indoors_override_grffile)
+ npc_read_indoors();
+
+ // comparing only the first 24 chars of labels that are 50 chars long isn't that nice
+ // will cause "duplicated" labels where actually no dup is...
+ ev_db = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA,51);
+ npcname_db = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_BASE,NAME_LENGTH);
+
+ malloc_set(&ev_tm_b, -1, sizeof(ev_tm_b));
+ timer_event_ers = ers_new((uint32)sizeof(struct timer_event_data));
+
+ for (nsl = npc_src_first; nsl; nsl = nsl->next) {
+ npc_parsesrcfile(nsl->name);
+ current_file = NULL;
+ printf("\r");
+ if (script_config.verbose_mode)
+ ShowStatus ("Loading NPCs... %-53s", nsl->name);
+ else {
+ ShowStatus("Loading NPCs... Working: ");
+ if (last_time != time(0)) {
+ last_time = time(0);
+ switch(busy) {
+ case 0: c='\\'; busy++; break;
+ case 1: c='|'; busy++; break;
+ case 2: c='/'; busy++; break;
+ case 3: c='-'; busy=0;
+ }
+ }
+ printf("[%c]",c);
+ }
+ fflush(stdout);
+ }
+ printf("\r");
+ ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs Cached\n\t-'"
+ CL_WHITE"%d"CL_RESET"' Mobs Not Cached\n",
+ npc_id - START_NPC_NUM, "", npc_warp, npc_shop, npc_script, npc_mob, npc_cache_mob, npc_delay_mob);
+
+ malloc_set(script_event, 0, sizeof(script_event));
+ npc_read_event_script();
+ //Debug function to locate all endless loop warps.
+ if (battle_config.warp_point_debug)
+ npc_debug_warps();
+
+ add_timer_func_list(npc_event_timer,"npc_event_timer");
+ add_timer_func_list(npc_event_do_clock,"npc_event_do_clock");
+ add_timer_func_list(npc_timerevent,"npc_timerevent");
+
+ // Init dummy NPC
+ fake_nd = (struct npc_data *)aCalloc(sizeof(struct npc_data),1);
+ fake_nd->bl.prev = fake_nd->bl.next = NULL;
+ fake_nd->bl.m = -1;
+ fake_nd->bl.x = 0;
+ fake_nd->bl.y = 0;
+ fake_nd->bl.id = npc_get_new_npc_id();
+ fake_nd->class_ = -1;
+ fake_nd->speed = 200;
+ fake_nd->u.scr.script = NULL;
+ fake_nd->u.scr.src_id = 0;
+ fake_nd->chatdb = NULL;
+ for (i = 0; i < MAX_EVENTTIMER; i++)
+ fake_nd->eventtimer[i] = -1;
+ strcpy(fake_nd->name,"FAKE_NPC");
+ memcpy(fake_nd->exname, fake_nd->name, 9);
+
+ npc_script++;
+ fake_nd->bl.type = BL_NPC;
+ fake_nd->bl.subtype = SCRIPT;
+
+ strdb_put(npcname_db, fake_nd->exname, fake_nd);
+ fake_nd->u.scr.timerid = -1;
+ map_addiddb(&fake_nd->bl);
+ // End of initialization
+
+ return 0;
+}
+// [Lance]
+int npc_changename(const char *name, const char *newname, short look){
+ struct npc_data *nd= (struct npc_data *) strdb_remove(npcname_db,(unsigned char*)name);
+ if (nd==NULL)
+ return 0;
+ npc_enable(name,0);
+ strcpy(nd->name,newname);
+ nd->class_ = look;
+ npc_enable(newname,1);
+ return 0;
+}
diff --git a/src/map/npc.h b/src/map/npc.h
index 2ea4f7eb7..63772089c 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -1,90 +1,90 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _NPC_H_
-#define _NPC_H_
-
-#define START_NPC_NUM 110000000
-
-#define WARP_CLASS 45
-#define WARP_DEBUG_CLASS 722
-#define INVISIBLE_CLASS 32767
-
-#define MAX_NPC_CLASS 1000
-//Checks if a given id is a valid npc id. [Skotlex]
-//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
-#define npcdb_checkid(id) ((id >= 46 && id <= 125) || id == 139 || (id >= 700 && id <= MAX_NPC_CLASS) || id == INVISIBLE_CLASS)
-
-#ifdef PCRE_SUPPORT
-void npc_chat_finalize(struct npc_data *nd);
-int mob_chat_sub(struct block_list *bl, va_list ap);
-#endif
-
-//Script NPC events.
-enum {
- NPCE_LOGIN,
- NPCE_LOGOUT,
- NPCE_LOADMAP,
- NPCE_BASELVUP,
- NPCE_JOBLVUP,
- NPCE_DIE,
- NPCE_KILLPC,
- NPCE_KILLNPC,
- NPCE_MAX
-};
-struct view_data* npc_get_viewdata(int class_);
-int npc_chat_sub(struct block_list *bl, va_list ap);
-int npc_event_dequeue(struct map_session_data *sd);
-int npc_event_timer(int tid,unsigned int tick,int id,int data);
-int npc_event(struct map_session_data *sd,const unsigned char *npcname,int);
-int npc_timer_event(const unsigned char *eventname); // Added by RoVeRT
-int npc_command(struct map_session_data *sd,const unsigned char *npcname,char *command);
-int npc_touch_areanpc(struct map_session_data *,int,int,int);
-int npc_touch_areanpc2(struct block_list *bl); // [Skotlex]
-int npc_click(struct map_session_data *sd,struct npc_data *nd);
-int npc_scriptcont(struct map_session_data *,int);
-TBL_NPC *npc_checknear(struct map_session_data *sd,struct block_list *bl);
-int npc_checknear2(struct map_session_data *sd,struct block_list *bl);
-int npc_buysellsel(struct map_session_data *,int,int);
-int npc_buylist(struct map_session_data *,int,unsigned short *);
-int npc_selllist(struct map_session_data *,int,unsigned short *);
-int npc_parse_mob(char *w1,char *w2,char *w3,char *w4);
-int npc_parse_mob2 (struct spawn_data*, int index); // [Wizputer]
-int npc_parse_warp(char *w1,char *w2,char *w3,char *w4);
-int npc_globalmessage(const char *name,char *mes);
-
-int npc_enable(const char *name,int flag);
-int npc_changename(const char *name, const char *newname, short look); // [Lance]
-struct npc_data* npc_name2id(const char *name);
-
-int npc_get_new_npc_id(void);
-
-void npc_addsrcfile(char *);
-void npc_delsrcfile(char *);
-void npc_parsesrcfile(char *);
-int do_final_npc(void);
-int do_init_npc(void);
-int npc_event_do_oninit(void);
-int npc_do_ontimer(int,int);
-
-int npc_event_doall(const unsigned char *name);
-int npc_event_do(const unsigned char *name);
-int npc_event_doall_id(const unsigned char *name, int id);
-
-int npc_timerevent_start(struct npc_data *nd, int rid);
-int npc_timerevent_stop(struct npc_data *nd);
-void npc_timerevent_quit(struct map_session_data *sd);
-int npc_gettimerevent_tick(struct npc_data *nd);
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer);
-int npc_remove_map(struct npc_data *nd);
-void npc_unload_duplicates (struct npc_data *nd);
-int npc_unload(struct npc_data *nd);
-int npc_reload(void);
-int npc_script_event(TBL_PC* sd, int type);
-
-extern char *current_file;
-
-struct npc_data *fake_nd;
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _NPC_H_
+#define _NPC_H_
+
+#define START_NPC_NUM 110000000
+
+#define WARP_CLASS 45
+#define WARP_DEBUG_CLASS 722
+#define INVISIBLE_CLASS 32767
+
+#define MAX_NPC_CLASS 1000
+//Checks if a given id is a valid npc id. [Skotlex]
+//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
+#define npcdb_checkid(id) ((id >= 46 && id <= 125) || id == 139 || (id >= 700 && id <= MAX_NPC_CLASS) || id == INVISIBLE_CLASS)
+
+#ifdef PCRE_SUPPORT
+void npc_chat_finalize(struct npc_data *nd);
+int mob_chat_sub(struct block_list *bl, va_list ap);
+#endif
+
+//Script NPC events.
+enum {
+ NPCE_LOGIN,
+ NPCE_LOGOUT,
+ NPCE_LOADMAP,
+ NPCE_BASELVUP,
+ NPCE_JOBLVUP,
+ NPCE_DIE,
+ NPCE_KILLPC,
+ NPCE_KILLNPC,
+ NPCE_MAX
+};
+struct view_data* npc_get_viewdata(int class_);
+int npc_chat_sub(struct block_list *bl, va_list ap);
+int npc_event_dequeue(struct map_session_data *sd);
+int npc_event_timer(int tid,unsigned int tick,int id,int data);
+int npc_event(struct map_session_data *sd,const unsigned char *npcname,int);
+int npc_timer_event(const unsigned char *eventname); // Added by RoVeRT
+int npc_command(struct map_session_data *sd,const unsigned char *npcname,char *command);
+int npc_touch_areanpc(struct map_session_data *,int,int,int);
+int npc_touch_areanpc2(struct block_list *bl); // [Skotlex]
+int npc_click(struct map_session_data *sd,struct npc_data *nd);
+int npc_scriptcont(struct map_session_data *,int);
+TBL_NPC *npc_checknear(struct map_session_data *sd,struct block_list *bl);
+int npc_checknear2(struct map_session_data *sd,struct block_list *bl);
+int npc_buysellsel(struct map_session_data *,int,int);
+int npc_buylist(struct map_session_data *,int,unsigned short *);
+int npc_selllist(struct map_session_data *,int,unsigned short *);
+int npc_parse_mob(char *w1,char *w2,char *w3,char *w4);
+int npc_parse_mob2 (struct spawn_data*, int index); // [Wizputer]
+int npc_parse_warp(char *w1,char *w2,char *w3,char *w4);
+int npc_globalmessage(const char *name,char *mes);
+
+int npc_enable(const char *name,int flag);
+int npc_changename(const char *name, const char *newname, short look); // [Lance]
+struct npc_data* npc_name2id(const char *name);
+
+int npc_get_new_npc_id(void);
+
+void npc_addsrcfile(char *);
+void npc_delsrcfile(char *);
+void npc_parsesrcfile(char *);
+int do_final_npc(void);
+int do_init_npc(void);
+int npc_event_do_oninit(void);
+int npc_do_ontimer(int,int);
+
+int npc_event_doall(const unsigned char *name);
+int npc_event_do(const unsigned char *name);
+int npc_event_doall_id(const unsigned char *name, int id);
+
+int npc_timerevent_start(struct npc_data *nd, int rid);
+int npc_timerevent_stop(struct npc_data *nd);
+void npc_timerevent_quit(struct map_session_data *sd);
+int npc_gettimerevent_tick(struct npc_data *nd);
+int npc_settimerevent_tick(struct npc_data *nd,int newtimer);
+int npc_remove_map(struct npc_data *nd);
+void npc_unload_duplicates (struct npc_data *nd);
+int npc_unload(struct npc_data *nd);
+int npc_reload(void);
+int npc_script_event(TBL_PC* sd, int type);
+
+extern char *current_file;
+
+struct npc_data *fake_nd;
+
+#endif
+
diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c
index 1e5da1277..f7c955257 100644
--- a/src/map/npc_chat.c
+++ b/src/map/npc_chat.c
@@ -1,517 +1,517 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifdef PCRE_SUPPORT
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <time.h>
-
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/version.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "map.h"
-#include "status.h"
-#include "npc.h"
-#include "chat.h"
-#include "script.h"
-#include "battle.h"
-
-#include "pcre.h"
-
-/**
- * Written by MouseJstr in a vision... (2/21/2005)
- *
- * This allows you to make npc listen for spoken text (global
- * messages) and pattern match against that spoken text using perl
- * regular expressions.
- *
- * Please feel free to copy this code into your own personal ragnarok
- * servers or distributions but please leave my name. Also, please
- * wait until I've put it into the main eA branch which means I
- * believe it is ready for distribution.
- *
- * So, how do people use this?
- *
- * The first and most important function is defpattern
- *
- * defpattern 1, "[^:]+: (.*) loves (.*)", "label";
- *
- * this defines a new pattern in set 1 using perl syntax
- * (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm)
- * and tells it to jump to the supplied label when the pattern
- * is matched.
- *
- * each of the matched Groups will result in a variable being
- * set ($p1$ through $p9$ with $p0$ being the entire string)
- * before the script gets executed.
- *
- * activatepset 1;
- *
- * This activates a set of patterns.. You can have many pattern
- * sets defined and many active all at once. This feature allows
- * you to set up "conversations" and ever changing expectations of
- * the pattern matcher
- *
- * deactivatepset 1;
- *
- * turns off a pattern set;
- *
- * deactivatepset -1;
- *
- * turns off ALL pattern sets;
- *
- * deletepset 1;
- *
- * deletes a pset
- */
-
-/* Structure containing all info associated with a single pattern
- block */
-
-struct pcrematch_entry {
- struct pcrematch_entry *next_;
- char *pattern_;
- pcre *pcre_;
- pcre_extra *pcre_extra_;
- char *label_;
-};
-
-/* A set of patterns that can be activated and deactived with a single
- command */
-
-struct pcrematch_set {
- struct pcrematch_set *next_, *prev_;
- struct pcrematch_entry *head_;
- int setid_;
-};
-
-/*
- * Entire data structure hung off a NPC
- *
- * The reason I have done it this way (a void * in npc_data and then
- * this) was to reduce the number of patches that needed to be applied
- * to a ragnarok distribution to bring this code online. I
- * also wanted people to be able to grab this one file to get updates
- * without having to do a large number of changes.
- */
-
-struct npc_parse {
- struct pcrematch_set *active_;
- struct pcrematch_set *inactive_;
-};
-
-
-/**
- * delete everythign associated with a entry
- *
- * This does NOT do the list management
- */
-
-void finalize_pcrematch_entry(struct pcrematch_entry *e) {
-//TODO: For some odd reason this causes a already-free'd error under Windows, but not *nix! [Skotlex]
-#ifndef _WIN32
- if (e->pcre_) {
- free(e->pcre_);
- e->pcre_ = NULL;
- }
-#endif
- if (e->pcre_extra_) {
- free(e->pcre_extra_);
- e->pcre_ = NULL;
- }
- aFree(e->pattern_);
- aFree(e->label_);
-}
-
-/**
- * Lookup (and possibly create) a new set of patterns by the set id
- */
-static struct pcrematch_set * lookup_pcreset(struct npc_data *nd,int setid)
-{
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- nd->chatdb = npcParse = (struct npc_parse *)
- aCalloc(sizeof(struct npc_parse), 1);
-
- pcreset = npcParse->active_;
-
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- pcreset = npcParse->inactive_;
-
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
-
- if (pcreset == NULL) {
- pcreset = (struct pcrematch_set *)
- aCalloc(sizeof(struct pcrematch_set), 1);
- pcreset->next_ = npcParse->inactive_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- pcreset->prev_ = 0;
- npcParse->inactive_ = pcreset;
- pcreset->setid_ = setid;
- }
-
- return pcreset;
-}
-
-/**
- * activate a set of patterns.
- *
- * if the setid does not exist, this will silently return
- */
-
-static void activate_pcreset(struct npc_data *nd,int setid) {
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to activate...
- pcreset = npcParse->inactive_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- return; // not in inactive list
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
- else
- npcParse->inactive_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = npcParse->active_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- npcParse->active_ = pcreset;
-}
-
-/**
- * deactivate a set of patterns.
- *
- * if the setid does not exist, this will silently return
- */
-
-static void deactivate_pcreset(struct npc_data *nd,int setid) {
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to deactivate...
- if (setid == -1) {
- while(npcParse->active_ != NULL)
- deactivate_pcreset(nd, npcParse->active_->setid_);
- return;
- }
- pcreset = npcParse->active_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- return; // not in active list
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
- else
- npcParse->active_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = npcParse->inactive_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- npcParse->inactive_ = pcreset;
-}
-
-/**
- * delete a set of patterns.
- */
-static void delete_pcreset(struct npc_data *nd,int setid) {
- int active = 1;
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to deactivate...
- pcreset = npcParse->active_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL) {
- active = 0;
- pcreset = npcParse->inactive_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- }
- if (pcreset == NULL)
- return;
-
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
-
- if(active)
- npcParse->active_ = pcreset->next_;
- else
- npcParse->inactive_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = NULL;
-
- while (pcreset->head_) {
- struct pcrematch_entry *n = pcreset->head_->next_;
- finalize_pcrematch_entry(pcreset->head_);
- aFree(pcreset->head_); // Cleanin' the last ones.. [Lance]
- pcreset->head_ = n;
- }
-
- aFree(pcreset);
-}
-
-/**
- * create a new pattern entry
- */
-static struct pcrematch_entry *create_pcrematch_entry(struct pcrematch_set * set) {
- struct pcrematch_entry * e = (struct pcrematch_entry *)
- aCalloc(sizeof(struct pcrematch_entry), 1);
- struct pcrematch_entry * last = set->head_;
-
- // Normally we would have just stuck it at the end of the list but
- // this doesn't sink up with peoples usage pattern. They wanted
- // the items defined first to have a higher priority then the
- // items defined later.. as a result, we have to do some work up
- // front..
-
- /* if we are the first pattern, stick us at the end */
- if (last == NULL) {
- set->head_ = e;
- return e;
- }
-
- /* Look for the last entry */
- while (last->next_ != NULL)
- last = last->next_;
-
- last->next_ = e;
- e->next_ = NULL;
-
- return e;
-}
-
-/**
- * define/compile a new pattern
- */
-
-void npc_chat_def_pattern(struct npc_data *nd, int setid,
- const char *pattern, const char *label)
-{
- const char *err;
- int erroff;
-
- struct pcrematch_set * s = lookup_pcreset(nd, setid);
- struct pcrematch_entry *e = create_pcrematch_entry(s);
- e->pattern_ = aStrdup(pattern);
- e->label_ = aStrdup(label);
- e->pcre_ = pcre_compile(pattern, PCRE_CASELESS, &err, &erroff, NULL);
- e->pcre_extra_ = pcre_study(e->pcre_, 0, &err);
-}
-
-/**
- * Delete everything associated with a NPC concerning the pattern
- * matching code
- *
- * this could be more efficent but.. how often do you do this?
- */
-void npc_chat_finalize(struct npc_data *nd)
-{
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return;
-
- while(npcParse->active_)
- delete_pcreset(nd, npcParse->active_->setid_);
-
- while(npcParse->inactive_)
- delete_pcreset(nd, npcParse->inactive_->setid_);
-
- // Additional cleaning up [Lance]
- aFree(npcParse);
-}
-
-/**
- * Handler called whenever a global message is spoken in a NPC's area
- */
-int npc_chat_sub(struct block_list *bl, va_list ap)
-{
- struct npc_data *nd = (struct npc_data *)bl;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- unsigned char *msg;
- int len, pos, i;
- struct map_session_data *sd;
- struct npc_label_list *lst;
- struct pcrematch_set *pcreset;
-
- // Not interested in anything you might have to say...
- if (npcParse == NULL || npcParse->active_ == NULL)
- return 0;
-
- msg = va_arg(ap,unsigned char*);
- len = va_arg(ap,int);
- sd = va_arg(ap,struct map_session_data *);
-
- // grab the active list
- pcreset = npcParse->active_;
-
- // interate across all active sets
- while (pcreset != NULL) {
- struct pcrematch_entry *e = pcreset->head_;
- // interate across all patterns in that set
- while (e != NULL) {
- int offsets[20];
- char buf[255];
- // perform pattern match
- int r = pcre_exec(e->pcre_, e->pcre_extra_, msg, len, 0,
- 0, offsets, sizeof(offsets) / sizeof(offsets[0]));
- if (r >= 0) {
- // save out the matched strings
- switch (r) {
- case 10:
- memcpy(buf, &msg[offsets[18]], offsets[19]);
- buf[offsets[19]] = '\0';
- set_var(sd, "$p9$", buf);
- case 9:
- memcpy(buf, &msg[offsets[16]], offsets[17]);
- buf[offsets[17]] = '\0';
- set_var(sd, "$p8$", buf);
- case 8:
- memcpy(buf, &msg[offsets[14]], offsets[15]);
- buf[offsets[15]] = '\0';
- set_var(sd, "$p7$", buf);
- case 7:
- memcpy(buf, &msg[offsets[12]], offsets[13]);
- buf[offsets[13]] = '\0';
- set_var(sd, "$p6$", buf);
- case 6:
- memcpy(buf, &msg[offsets[10]], offsets[11]);
- buf[offsets[11]] = '\0';
- set_var(sd, "$p5$", buf);
- case 5:
- memcpy(buf, &msg[offsets[8]], offsets[9]);
- buf[offsets[9]] = '\0';
- set_var(sd, "$p4$", buf);
- case 4:
- memcpy(buf, &msg[offsets[6]], offsets[7]);
- buf[offsets[7]] = '\0';
- set_var(sd, "$p3$", buf);
- case 3:
- memcpy(buf, &msg[offsets[4]], offsets[5]);
- buf[offsets[5]] = '\0';
- set_var(sd, "$p2$", buf);
- case 2:
- memcpy(buf, &msg[offsets[2]], offsets[3]);
- buf[offsets[3]] = '\0';
- set_var(sd, "$p1$", buf);
- case 1:
- memcpy(buf, &msg[offsets[0]], offsets[1]);
- buf[offsets[1]] = '\0';
- set_var(sd, "$p0$", buf);
- }
-
- // find the target label.. this sucks..
- lst=nd->u.scr.label_list;
- pos = -1;
- for (i = 0; i < nd->u.scr.label_list_num; i++) {
- if (strncmp(lst[i].name, e->label_, sizeof(lst[i].name)) == 0) {
- pos = lst[i].pos;
- break;
- }
- }
- if (pos == -1) {
- ShowWarning("Unable to find label: %s", e->label_);
- // unable to find label... do something..
- return 0;
- }
- // run the npc script
- run_script(nd->u.scr.script,pos,sd->bl.id,nd->bl.id);
- return 0;
- }
- e = e->next_;
- }
- pcreset = pcreset->next_;
- }
-
- return 0;
-}
-
-int mob_chat_sub(struct block_list *bl, va_list ap){
- struct mob_data *md = (struct mob_data *)bl;
- if(md->nd){
- npc_chat_sub(&md->nd->bl, ap);
- }
- return 0;
-}
-
-// Various script builtins used to support these functions
-
-int buildin_defpattern(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- char *pattern=conv_str(st,& (st->stack->stack_data[st->start+3]));
- char *label=conv_str(st,& (st->stack->stack_data[st->start+4]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_chat_def_pattern(nd, setid, pattern, label);
-
- return 0;
-}
-
-int buildin_activatepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- activate_pcreset(nd, setid);
-
- return 0;
-}
-int buildin_deactivatepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- deactivate_pcreset(nd, setid);
-
- return 0;
-}
-int buildin_deletepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- delete_pcreset(nd, setid);
-
- return 0;
-}
-
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifdef PCRE_SUPPORT
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include "../common/timer.h"
+#include "../common/malloc.h"
+#include "../common/version.h"
+#include "../common/nullpo.h"
+#include "../common/showmsg.h"
+
+#include "map.h"
+#include "status.h"
+#include "npc.h"
+#include "chat.h"
+#include "script.h"
+#include "battle.h"
+
+#include "pcre.h"
+
+/**
+ * Written by MouseJstr in a vision... (2/21/2005)
+ *
+ * This allows you to make npc listen for spoken text (global
+ * messages) and pattern match against that spoken text using perl
+ * regular expressions.
+ *
+ * Please feel free to copy this code into your own personal ragnarok
+ * servers or distributions but please leave my name. Also, please
+ * wait until I've put it into the main eA branch which means I
+ * believe it is ready for distribution.
+ *
+ * So, how do people use this?
+ *
+ * The first and most important function is defpattern
+ *
+ * defpattern 1, "[^:]+: (.*) loves (.*)", "label";
+ *
+ * this defines a new pattern in set 1 using perl syntax
+ * (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm)
+ * and tells it to jump to the supplied label when the pattern
+ * is matched.
+ *
+ * each of the matched Groups will result in a variable being
+ * set ($p1$ through $p9$ with $p0$ being the entire string)
+ * before the script gets executed.
+ *
+ * activatepset 1;
+ *
+ * This activates a set of patterns.. You can have many pattern
+ * sets defined and many active all at once. This feature allows
+ * you to set up "conversations" and ever changing expectations of
+ * the pattern matcher
+ *
+ * deactivatepset 1;
+ *
+ * turns off a pattern set;
+ *
+ * deactivatepset -1;
+ *
+ * turns off ALL pattern sets;
+ *
+ * deletepset 1;
+ *
+ * deletes a pset
+ */
+
+/* Structure containing all info associated with a single pattern
+ block */
+
+struct pcrematch_entry {
+ struct pcrematch_entry *next_;
+ char *pattern_;
+ pcre *pcre_;
+ pcre_extra *pcre_extra_;
+ char *label_;
+};
+
+/* A set of patterns that can be activated and deactived with a single
+ command */
+
+struct pcrematch_set {
+ struct pcrematch_set *next_, *prev_;
+ struct pcrematch_entry *head_;
+ int setid_;
+};
+
+/*
+ * Entire data structure hung off a NPC
+ *
+ * The reason I have done it this way (a void * in npc_data and then
+ * this) was to reduce the number of patches that needed to be applied
+ * to a ragnarok distribution to bring this code online. I
+ * also wanted people to be able to grab this one file to get updates
+ * without having to do a large number of changes.
+ */
+
+struct npc_parse {
+ struct pcrematch_set *active_;
+ struct pcrematch_set *inactive_;
+};
+
+
+/**
+ * delete everythign associated with a entry
+ *
+ * This does NOT do the list management
+ */
+
+void finalize_pcrematch_entry(struct pcrematch_entry *e) {
+//TODO: For some odd reason this causes a already-free'd error under Windows, but not *nix! [Skotlex]
+#ifndef _WIN32
+ if (e->pcre_) {
+ free(e->pcre_);
+ e->pcre_ = NULL;
+ }
+#endif
+ if (e->pcre_extra_) {
+ free(e->pcre_extra_);
+ e->pcre_ = NULL;
+ }
+ aFree(e->pattern_);
+ aFree(e->label_);
+}
+
+/**
+ * Lookup (and possibly create) a new set of patterns by the set id
+ */
+static struct pcrematch_set * lookup_pcreset(struct npc_data *nd,int setid)
+{
+ struct pcrematch_set *pcreset;
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ if (npcParse == NULL)
+ nd->chatdb = npcParse = (struct npc_parse *)
+ aCalloc(sizeof(struct npc_parse), 1);
+
+ pcreset = npcParse->active_;
+
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+ if (pcreset == NULL)
+ pcreset = npcParse->inactive_;
+
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+
+ if (pcreset == NULL) {
+ pcreset = (struct pcrematch_set *)
+ aCalloc(sizeof(struct pcrematch_set), 1);
+ pcreset->next_ = npcParse->inactive_;
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset;
+ pcreset->prev_ = 0;
+ npcParse->inactive_ = pcreset;
+ pcreset->setid_ = setid;
+ }
+
+ return pcreset;
+}
+
+/**
+ * activate a set of patterns.
+ *
+ * if the setid does not exist, this will silently return
+ */
+
+static void activate_pcreset(struct npc_data *nd,int setid) {
+ struct pcrematch_set *pcreset;
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ if (npcParse == NULL)
+ return; // Nothing to activate...
+ pcreset = npcParse->inactive_;
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+ if (pcreset == NULL)
+ return; // not in inactive list
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset->prev_;
+ if (pcreset->prev_ != NULL)
+ pcreset->prev_->next_ = pcreset->next_;
+ else
+ npcParse->inactive_ = pcreset->next_;
+
+ pcreset->prev_ = NULL;
+ pcreset->next_ = npcParse->active_;
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset;
+ npcParse->active_ = pcreset;
+}
+
+/**
+ * deactivate a set of patterns.
+ *
+ * if the setid does not exist, this will silently return
+ */
+
+static void deactivate_pcreset(struct npc_data *nd,int setid) {
+ struct pcrematch_set *pcreset;
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ if (npcParse == NULL)
+ return; // Nothing to deactivate...
+ if (setid == -1) {
+ while(npcParse->active_ != NULL)
+ deactivate_pcreset(nd, npcParse->active_->setid_);
+ return;
+ }
+ pcreset = npcParse->active_;
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+ if (pcreset == NULL)
+ return; // not in active list
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset->prev_;
+ if (pcreset->prev_ != NULL)
+ pcreset->prev_->next_ = pcreset->next_;
+ else
+ npcParse->active_ = pcreset->next_;
+
+ pcreset->prev_ = NULL;
+ pcreset->next_ = npcParse->inactive_;
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset;
+ npcParse->inactive_ = pcreset;
+}
+
+/**
+ * delete a set of patterns.
+ */
+static void delete_pcreset(struct npc_data *nd,int setid) {
+ int active = 1;
+ struct pcrematch_set *pcreset;
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ if (npcParse == NULL)
+ return; // Nothing to deactivate...
+ pcreset = npcParse->active_;
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+ if (pcreset == NULL) {
+ active = 0;
+ pcreset = npcParse->inactive_;
+ while (pcreset != NULL) {
+ if (pcreset->setid_ == setid)
+ break;
+ pcreset = pcreset->next_;
+ }
+ }
+ if (pcreset == NULL)
+ return;
+
+ if (pcreset->next_ != NULL)
+ pcreset->next_->prev_ = pcreset->prev_;
+ if (pcreset->prev_ != NULL)
+ pcreset->prev_->next_ = pcreset->next_;
+
+ if(active)
+ npcParse->active_ = pcreset->next_;
+ else
+ npcParse->inactive_ = pcreset->next_;
+
+ pcreset->prev_ = NULL;
+ pcreset->next_ = NULL;
+
+ while (pcreset->head_) {
+ struct pcrematch_entry *n = pcreset->head_->next_;
+ finalize_pcrematch_entry(pcreset->head_);
+ aFree(pcreset->head_); // Cleanin' the last ones.. [Lance]
+ pcreset->head_ = n;
+ }
+
+ aFree(pcreset);
+}
+
+/**
+ * create a new pattern entry
+ */
+static struct pcrematch_entry *create_pcrematch_entry(struct pcrematch_set * set) {
+ struct pcrematch_entry * e = (struct pcrematch_entry *)
+ aCalloc(sizeof(struct pcrematch_entry), 1);
+ struct pcrematch_entry * last = set->head_;
+
+ // Normally we would have just stuck it at the end of the list but
+ // this doesn't sink up with peoples usage pattern. They wanted
+ // the items defined first to have a higher priority then the
+ // items defined later.. as a result, we have to do some work up
+ // front..
+
+ /* if we are the first pattern, stick us at the end */
+ if (last == NULL) {
+ set->head_ = e;
+ return e;
+ }
+
+ /* Look for the last entry */
+ while (last->next_ != NULL)
+ last = last->next_;
+
+ last->next_ = e;
+ e->next_ = NULL;
+
+ return e;
+}
+
+/**
+ * define/compile a new pattern
+ */
+
+void npc_chat_def_pattern(struct npc_data *nd, int setid,
+ const char *pattern, const char *label)
+{
+ const char *err;
+ int erroff;
+
+ struct pcrematch_set * s = lookup_pcreset(nd, setid);
+ struct pcrematch_entry *e = create_pcrematch_entry(s);
+ e->pattern_ = aStrdup(pattern);
+ e->label_ = aStrdup(label);
+ e->pcre_ = pcre_compile(pattern, PCRE_CASELESS, &err, &erroff, NULL);
+ e->pcre_extra_ = pcre_study(e->pcre_, 0, &err);
+}
+
+/**
+ * Delete everything associated with a NPC concerning the pattern
+ * matching code
+ *
+ * this could be more efficent but.. how often do you do this?
+ */
+void npc_chat_finalize(struct npc_data *nd)
+{
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ if (npcParse == NULL)
+ return;
+
+ while(npcParse->active_)
+ delete_pcreset(nd, npcParse->active_->setid_);
+
+ while(npcParse->inactive_)
+ delete_pcreset(nd, npcParse->inactive_->setid_);
+
+ // Additional cleaning up [Lance]
+ aFree(npcParse);
+}
+
+/**
+ * Handler called whenever a global message is spoken in a NPC's area
+ */
+int npc_chat_sub(struct block_list *bl, va_list ap)
+{
+ struct npc_data *nd = (struct npc_data *)bl;
+ struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
+ unsigned char *msg;
+ int len, pos, i;
+ struct map_session_data *sd;
+ struct npc_label_list *lst;
+ struct pcrematch_set *pcreset;
+
+ // Not interested in anything you might have to say...
+ if (npcParse == NULL || npcParse->active_ == NULL)
+ return 0;
+
+ msg = va_arg(ap,unsigned char*);
+ len = va_arg(ap,int);
+ sd = va_arg(ap,struct map_session_data *);
+
+ // grab the active list
+ pcreset = npcParse->active_;
+
+ // interate across all active sets
+ while (pcreset != NULL) {
+ struct pcrematch_entry *e = pcreset->head_;
+ // interate across all patterns in that set
+ while (e != NULL) {
+ int offsets[20];
+ char buf[255];
+ // perform pattern match
+ int r = pcre_exec(e->pcre_, e->pcre_extra_, msg, len, 0,
+ 0, offsets, sizeof(offsets) / sizeof(offsets[0]));
+ if (r >= 0) {
+ // save out the matched strings
+ switch (r) {
+ case 10:
+ memcpy(buf, &msg[offsets[18]], offsets[19]);
+ buf[offsets[19]] = '\0';
+ set_var(sd, "$p9$", buf);
+ case 9:
+ memcpy(buf, &msg[offsets[16]], offsets[17]);
+ buf[offsets[17]] = '\0';
+ set_var(sd, "$p8$", buf);
+ case 8:
+ memcpy(buf, &msg[offsets[14]], offsets[15]);
+ buf[offsets[15]] = '\0';
+ set_var(sd, "$p7$", buf);
+ case 7:
+ memcpy(buf, &msg[offsets[12]], offsets[13]);
+ buf[offsets[13]] = '\0';
+ set_var(sd, "$p6$", buf);
+ case 6:
+ memcpy(buf, &msg[offsets[10]], offsets[11]);
+ buf[offsets[11]] = '\0';
+ set_var(sd, "$p5$", buf);
+ case 5:
+ memcpy(buf, &msg[offsets[8]], offsets[9]);
+ buf[offsets[9]] = '\0';
+ set_var(sd, "$p4$", buf);
+ case 4:
+ memcpy(buf, &msg[offsets[6]], offsets[7]);
+ buf[offsets[7]] = '\0';
+ set_var(sd, "$p3$", buf);
+ case 3:
+ memcpy(buf, &msg[offsets[4]], offsets[5]);
+ buf[offsets[5]] = '\0';
+ set_var(sd, "$p2$", buf);
+ case 2:
+ memcpy(buf, &msg[offsets[2]], offsets[3]);
+ buf[offsets[3]] = '\0';
+ set_var(sd, "$p1$", buf);
+ case 1:
+ memcpy(buf, &msg[offsets[0]], offsets[1]);
+ buf[offsets[1]] = '\0';
+ set_var(sd, "$p0$", buf);
+ }
+
+ // find the target label.. this sucks..
+ lst=nd->u.scr.label_list;
+ pos = -1;
+ for (i = 0; i < nd->u.scr.label_list_num; i++) {
+ if (strncmp(lst[i].name, e->label_, sizeof(lst[i].name)) == 0) {
+ pos = lst[i].pos;
+ break;
+ }
+ }
+ if (pos == -1) {
+ ShowWarning("Unable to find label: %s", e->label_);
+ // unable to find label... do something..
+ return 0;
+ }
+ // run the npc script
+ run_script(nd->u.scr.script,pos,sd->bl.id,nd->bl.id);
+ return 0;
+ }
+ e = e->next_;
+ }
+ pcreset = pcreset->next_;
+ }
+
+ return 0;
+}
+
+int mob_chat_sub(struct block_list *bl, va_list ap){
+ struct mob_data *md = (struct mob_data *)bl;
+ if(md->nd){
+ npc_chat_sub(&md->nd->bl, ap);
+ }
+ return 0;
+}
+
+// Various script builtins used to support these functions
+
+int buildin_defpattern(struct script_state *st) {
+ int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ char *pattern=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ char *label=conv_str(st,& (st->stack->stack_data[st->start+4]));
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ npc_chat_def_pattern(nd, setid, pattern, label);
+
+ return 0;
+}
+
+int buildin_activatepset(struct script_state *st) {
+ int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ activate_pcreset(nd, setid);
+
+ return 0;
+}
+int buildin_deactivatepset(struct script_state *st) {
+ int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ deactivate_pcreset(nd, setid);
+
+ return 0;
+}
+int buildin_deletepset(struct script_state *st) {
+ int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ delete_pcreset(nd, setid);
+
+ return 0;
+}
+
+
+#endif
diff --git a/src/map/party.c b/src/map/party.c
index 6c97bd464..babc9129d 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -1,902 +1,902 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "../common/timer.h"
-#include "../common/socket.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-#include "party.h"
-#include "pc.h"
-#include "map.h"
-#include "battle.h"
-#include "intif.h"
-#include "clif.h"
-#include "log.h"
-#include "skill.h"
-#include "status.h"
-
-static struct dbt* party_db;
-static struct party_data* party_cache = NULL; //party in cache for skipping consecutive lookups. [Skotlex]
-int party_share_level = 10;
-int party_send_xy_timer(int tid,unsigned int tick,int id,int data);
-
-/*==========================================
- * Fills the given party_member structure according to the sd provided.
- * Used when creating/adding people to a party. [Skotlex]
- *------------------------------------------
- */
-static void party_fill_member(struct party_member *member, struct map_session_data *sd) {
- member->account_id = sd->status.account_id;
- member->char_id = sd->status.char_id;
- memcpy(member->name,sd->status.name,NAME_LENGTH);
- member->class_ = sd->status.class_;
- member->map = sd->mapindex;
- member->lv = sd->status.base_level;
- member->online = 1;
- member->leader = 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-void do_final_party(void)
-{
- party_db->destroy(party_db,NULL);
-}
-// ‰Šú‰»
-void do_init_party(void)
-{
- party_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- add_timer_func_list(party_send_xy_timer,"party_send_xy_timer");
- add_timer_interval(gettick()+battle_config.party_update_interval,party_send_xy_timer,0,0,battle_config.party_update_interval);
-}
-
-// ŒŸõ
-struct party_data *party_search(int party_id)
-{
- if(!party_id) return NULL;
- if (party_cache && party_cache->party.party_id == party_id)
- return party_cache;
-
- party_cache = idb_get(party_db,party_id);
- return party_cache;
-}
-int party_searchname_sub(DBKey key,void *data,va_list ap)
-{
- struct party_data *p=(struct party_data *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct party_data **);
- if(strncmpi(p->party.name,str,NAME_LENGTH)==0)
- *dst=p;
- return 0;
-}
-
-struct party_data* party_searchname(char *str)
-{
- struct party_data *p=NULL;
- party_db->foreach(party_db,party_searchname_sub,str,&p);
- return p;
-}
-
-int party_create(struct map_session_data *sd,char *name,int item,int item2)
-{
- struct party_member leader;
- nullpo_retr(0, sd);
-
- if(sd->status.party_id) {
- clif_party_created(sd,2);
- return 0;
- }
-
- party_fill_member(&leader, sd);
- leader.leader = 1;
-
- intif_create_party(&leader,name,item,item2);
- return 0;
-}
-
-
-int party_created(int account_id,int char_id,int fail,int party_id,char *name)
-{
- struct map_session_data *sd;
- struct party_data *p;
- sd=map_id2sd(account_id);
-
- nullpo_retr(0, sd);
- if (sd->status.char_id != char_id)
- return 0; //unlikely failure...
-
- if(fail){
- clif_party_created(sd,1);
- return 0;
- }
- sd->status.party_id=party_id;
- if(idb_get(party_db,party_id)!=NULL){
- ShowFatalError("party: id already exists!\n");
- exit(1);
- }
- p=(struct party_data *)aCalloc(1,sizeof(struct party_data));
- p->party.party_id=party_id;
- memcpy(p->party.name, name, NAME_LENGTH);
- idb_put(party_db,party_id,p);
- clif_party_created(sd,0); //Success message
- clif_charnameupdate(sd); //Update other people's display. [Skotlex]
- return 1;
-}
-
-int party_request_info(int party_id)
-{
- return intif_request_partyinfo(party_id);
-}
-
-int party_check_member(struct party *p)
-{
- int i, users;
- struct map_session_data *sd, **all_sd;
-
- nullpo_retr(0, p);
-
- all_sd = map_getallusers(&users);
-
- for(i=0;i<users;i++)
- {
- if((sd = all_sd[i]) && sd->status.party_id==p->party_id)
- {
- int j,f=1;
- for(j=0;j<MAX_PARTY;j++){
- if(p->member[j].account_id==sd->status.account_id &&
- p->member[j].char_id==sd->status.char_id)
- {
- f=0;
- break;
- }
- }
-
- if(f){
- sd->status.party_id=0;
- if(battle_config.error_log)
- ShowWarning("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
- }
- }
- }
- return 0;
-}
-
-int party_recv_noinfo(int party_id)
-{
- int i, users;
- struct map_session_data *sd, **all_sd;
-
- all_sd = map_getallusers(&users);
-
- for(i=0;i<users;i++){
- if((sd = all_sd[i]) && sd->status.party_id==party_id)
- sd->status.party_id=0;
- }
- return 0;
-}
-
-static void* create_party(DBKey key, va_list args) {
- struct party_data *p;
- p=(struct party_data *)aCalloc(1,sizeof(struct party_data));
- return p;
-}
-
-static void party_check_state(struct party_data *p)
-{
- int i;
- malloc_set(&p->state, 0, sizeof(p->state));
- for (i = 0; i < MAX_PARTY; i ++)
- {
- if (!p->party.member[i].online) continue; //Those not online shouldn't aport to skill usage and all that.
- switch (p->party.member[i].class_) {
- case JOB_MONK:
- case JOB_BABY_MONK:
- case JOB_CHAMPION:
- p->state.monk = 1;
- break;
- case JOB_STAR_GLADIATOR:
- p->state.sg = 1;
- break;
- case JOB_SUPER_NOVICE:
- case JOB_SUPER_BABY:
- p->state.snovice = 1;
- break;
- case JOB_TAEKWON:
- p->state.tk = 1;
- break;
- }
- }
-}
-
-int party_recv_info(struct party *sp)
-{
- struct map_session_data *sd;
- struct party_data *p;
- int i;
-
- nullpo_retr(0, sp);
-
- p= idb_ensure(party_db, sp->party_id, create_party);
- if (!p->party.party_id) //party just received.
- party_check_member(sp);
- memcpy(&p->party,sp,sizeof(struct party));
- malloc_set(&p->state, 0, sizeof(p->state));
- malloc_set(&p->data, 0, sizeof(p->data));
- for(i=0;i<MAX_PARTY;i++){
- if (!p->party.member[i].account_id)
- continue;
- sd = map_id2sd(p->party.member[i].account_id);
- if (sd && sd->status.party_id==p->party.party_id
- && sd->status.char_id == p->party.member[i].char_id
- && !sd->state.waitingdisconnect)
- p->data[i].sd = sd;
- }
- party_check_state(p);
- for(i=0;i<MAX_PARTY;i++){
- sd = p->data[i].sd;
- if(!sd || sd->state.party_sent)
- continue;
- clif_party_main_info(p,-1);
- clif_party_option(p,sd,0x100);
- clif_party_info(p,-1);
- sd->state.party_sent=1;
- }
-
- return 0;
-}
-
-int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
-{
- struct party_data *p=party_search(sd->status.party_id);
- int i,flag=0;
-
- nullpo_retr(0, sd);
-
- if(tsd==NULL || p==NULL)
- return 0;
- if(!battle_config.invite_request_check) {
- if (tsd->guild_invite>0 || tsd->trade_partner) {
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- }
- if( tsd->status.party_id>0 || tsd->party_invite>0 ){
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- for(i=0;i<MAX_PARTY;i++){
- if(p->party.member[i].account_id == 0) //Room for a new member.
- flag = 1;
- /* By default Aegis BLOCKS more than one char from the same account on a party.
- * But eA does support it... so this check is left commented.
- if(p->party.member[i].account_id==tsd->status.account_id)
- {
- clif_party_inviteack(sd,tsd->status.name,4);
- return 0;
- }
- */
- }
- if (!flag) { //Full party.
- clif_party_inviteack(sd,tsd->status.name,3);
- return 0;
- }
-
- tsd->party_invite=sd->status.party_id;
- tsd->party_invite_account=sd->status.account_id;
-
- clif_party_invite(sd,tsd);
- return 1;
-}
-
-int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
- struct party_member member;
- nullpo_retr(0, sd);
-
- if(flag==1){
- party_fill_member(&member, sd);
- intif_party_addmember(sd->party_invite, &member);
- return 0;
- }
- sd->party_invite=0;
- sd->party_invite_account=0;
- if(tsd==NULL)
- return 0;
- clif_party_inviteack(tsd,sd->status.name,1);
- return 1;
-}
-
-int party_member_added(int party_id,int account_id,int char_id, int flag)
-{
- struct map_session_data *sd = map_id2sd(account_id),*sd2;
- struct party_data *p = party_search(party_id);
- if(sd == NULL || sd->status.char_id != char_id){
- if (flag == 0) {
- if(battle_config.error_log)
- ShowError("party: member added error %d is not online\n",account_id);
- intif_party_leave(party_id,account_id,char_id);
- }
- return 0;
- }
- sd->party_invite=0;
- sd->party_invite_account=0;
-
- if (!p) {
- if(battle_config.error_log)
- ShowError("party_member_added: party %d not found.\n",party_id);
- intif_party_leave(party_id,account_id,char_id);
- return 0;
- }
-
- if(!flag) {
- sd->state.party_sent=0;
- sd->status.party_id=party_id;
- party_check_conflict(sd);
- clif_party_join_info(&p->party,sd);
- clif_party_hp(sd);
- clif_party_xy(sd);
- clif_charnameupdate(sd); //Update char name's display [Skotlex]
- }
-
- sd2=map_id2sd(sd->party_invite_account);
- if (sd2)
- clif_party_inviteack(sd2,sd->status.name,flag?2:1);
- return 0;
-}
-
-int party_removemember(struct map_session_data *sd,int account_id,char *name)
-{
- struct party_data *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (p = party_search(sd->status.party_id)) == NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->party.member[i].account_id==sd->status.account_id &&
- p->party.member[i].char_id==sd->status.char_id) {
- if(p->party.member[i].leader)
- break;
- return 0;
- }
- }
- if (i >= MAX_PARTY) //Request from someone not in party? o.O
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->party.member[i].account_id==account_id &&
- strncmp(p->party.member[i].name,name,NAME_LENGTH)==0)
- {
- intif_party_leave(p->party.party_id,account_id,p->party.member[i].char_id);
- return 1;
- }
- }
- return 0;
-}
-
-int party_leave(struct map_session_data *sd)
-{
- struct party_data *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (p = party_search(sd->status.party_id)) == NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->party.member[i].account_id==sd->status.account_id &&
- p->party.member[i].char_id==sd->status.char_id){
- intif_party_leave(p->party.party_id,sd->status.account_id,sd->status.char_id);
- return 0;
- }
- }
- return 0;
-}
-
-int party_member_leaved(int party_id,int account_id,int char_id)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct party_data *p=party_search(party_id);
- int i;
- if (sd && sd->status.char_id != char_id) //Wrong target
- sd = NULL;
- if(p!=NULL){
- for(i=0;i<MAX_PARTY;i++)
- if(p->party.member[i].account_id==account_id &&
- p->party.member[i].char_id==char_id){
- clif_party_leaved(p,sd,account_id,p->party.member[i].name,0x00);
- malloc_set(&p->party.member[i], 0, sizeof(p->party.member[0]));
- malloc_set(&p->data[i], 0, sizeof(p->data[0]));
- p->party.count--;
- party_check_state(p);
- break;
- }
- }
- if(sd!=NULL && sd->status.party_id==party_id){
- sd->status.party_id=0;
- sd->state.party_sent=0;
- clif_charnameupdate(sd); //Update name display [Skotlex]
- }
- return 0;
-}
-
-int party_broken(int party_id)
-{
- struct party_data *p;
- int i;
- if( (p=party_search(party_id))==NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->data[i].sd!=NULL){
- clif_party_leaved(p,p->data[i].sd,
- p->party.member[i].account_id,p->party.member[i].name,0x10);
- p->data[i].sd->status.party_id=0;
- p->data[i].sd->state.party_sent=0;
- }
- }
- if (party_cache && party_cache->party.party_id == party_id)
- party_cache = NULL;
- idb_remove(party_db,party_id);
- return 0;
-}
-
-int party_changeoption(struct map_session_data *sd,int exp,int item)
-{
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0)
- return 0;
- intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
- return 0;
-}
-
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag)
-{
- struct party_data *p;
- struct map_session_data *sd=map_id2sd(account_id);
- if( (p=party_search(party_id))==NULL)
- return 0;
-
- if(!(flag&0x01) && p->party.exp != exp) {
- p->party.exp=exp;
- clif_party_option(p,sd,flag); //This packet doesn't updates item info anymore...
- }
- if(!(flag&0x10) && p->party.item != item) {
- p->party.item=item;
- clif_party_main_info(p,-1);
- }
- if(flag&0x01) //Send denied message
- clif_party_option(p,sd,flag);
- return 0;
-}
-
-int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv)
-{
- struct party_data *p;
- int i;
- if( (p=party_search(party_id))==NULL)
- return 0;
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *sd;
- struct party_member *m=&p->party.member[i];
- if(m->account_id==account_id && m->char_id==char_id){
- m->map = map;
- m->online=online;
- m->lv=lv;
- //Check if they still exist on this map server
- sd = map_id2sd(m->account_id);
- p->data[i].sd = (sd!=NULL && sd->status.party_id==p->party.party_id && sd->status.char_id == m->char_id && !sd->state.waitingdisconnect)?sd:NULL;
- break;
- }
- }
- if(i==MAX_PARTY){
- if(battle_config.error_log)
- ShowError("party: not found member %d/%d on %d[%s]",account_id,char_id,party_id,p->party.name);
- return 0;
- }
-
- clif_party_info(p,-1);
- return 0;
-}
-
-int party_send_movemap(struct map_session_data *sd)
-{
- int i;
- struct party_data *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0 )
- return 0;
- intif_party_changemap(sd,1);
-
- p=party_search(sd->status.party_id);
- if (p && sd->fd) {
- //Send dots of other party members to this char. [Skotlex]
- for(i=0; i < MAX_PARTY; i++) {
- if (!p->data[i].sd || p->data[i].sd == sd ||
- p->data[i].sd->bl.m != sd->bl.m)
- continue;
- clif_party_xy_single(sd->fd, p->data[i].sd);
- }
-
- }
-
- if( sd->state.party_sent )
- return 0;
-
- party_check_conflict(sd);
-
- if(p){
- party_check_member(&p->party);
- if(sd->status.party_id==p->party.party_id){
- clif_party_main_info(p,sd->fd);
- clif_party_option(p,sd,0x100);
- clif_party_info(p,sd->fd);
- sd->state.party_sent=1;
- }
- }
-
- return 0;
-}
-
-int party_send_logout(struct map_session_data *sd)
-{
- struct party_data *p;
- int i;
-
- if(!sd->status.party_id)
- return 0;
-
- intif_party_changemap(sd,0);
- p=party_search(sd->status.party_id);
- if(!p) return 0;
-
- for(i=0;i<MAX_PARTY && p->data[i].sd != sd;i++);
- if (i < MAX_PARTY)
- malloc_set(&p->data[i], 0, sizeof(p->data[0]));
-
- return 1;
-}
-
-int party_send_message(struct map_session_data *sd,char *mes,int len)
-{
- if(sd->status.party_id==0)
- return 0;
- intif_party_message(sd->status.party_id,sd->status.account_id,mes,len);
- party_recv_message(sd->status.party_id,sd->status.account_id,mes,len);
- //Chat Logging support Type 'P'
- if(log_config.chat&1 //we log everything then
- || (log_config.chat&4 //if Party bit is on
- && ( !agit_flag || !(log_config.chat&16) ))) //if WOE ONLY flag is off or AGIT is OFF
- log_chat("P", sd->status.party_id, sd->status.char_id, sd->status.account_id, (char*)mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes);
-
- return 0;
-}
-
-int party_recv_message(int party_id,int account_id,char *mes,int len)
-{
- struct party_data *p;
- if( (p=party_search(party_id))==NULL)
- return 0;
- clif_party_message(p,account_id,mes,len);
- return 0;
-}
-
-int party_check_conflict(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- intif_party_checkconflict(sd->status.party_id,sd->status.account_id,sd->status.char_id);
- return 0;
-}
-
-int party_skill_check(struct map_session_data *sd, int party_id, int skillid, int skilllv)
-{
- struct party_data *p;
- struct map_session_data *p_sd;
- int i;
-
- if(!party_id || (p=party_search(party_id))==NULL)
- return 0;
- switch(skillid) {
- case TK_COUNTER: //Increase Triple Attack rate of Monks.
- if (!p->state.monk) return 0;
- break;
- case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators
- if (!p->state.sg) return 0;
- break;
- case AM_TWILIGHT2: //Twilight Pharmacy, requires Super Novice
- return p->state.snovice;
- case AM_TWILIGHT3: //Twilight Pharmacy, Requires Taekwon
- return p->state.tk;
- default:
- return 0; //Unknown case?
- }
-
- for(i=0;i<MAX_PARTY;i++){
- if ((p_sd = p->data[i].sd) == NULL)
- continue;
- if (sd->bl.m != p_sd->bl.m)
- continue;
- switch(skillid) {
- case TK_COUNTER: //Increase Triple Attack rate of Monks.
- if((p_sd->class_&MAPID_UPPERMASK) == MAPID_MONK
- && pc_checkskill(p_sd,MO_TRIPLEATTACK)) {
- sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,
- 50+50*skilllv, //+100/150/200% rate
- 0,0,skill_get_time(SG_FRIEND, 1));
- }
- break;
- case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators
- if((p_sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR
- && sd->sc.data[SC_READYCOUNTER].timer != -1
- && pc_checkskill(p_sd,SG_FRIEND)) {
- sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,
- 50+50*pc_checkskill(p_sd,SG_FRIEND), //+100/150/200% rate
- 0,0,skill_get_time(SG_FRIEND, 1));
- }
- break;
- }
- }
- return 0;
-}
-
-int party_send_xy_timer_sub(DBKey key,void *data,va_list ap)
-{
- struct party_data *p=(struct party_data *)data;
- struct map_session_data *sd;
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- if(!p->data[i].sd) continue;
- sd = p->data[i].sd;
- if (p->data[i].x != sd->bl.x || p->data[i].y != sd->bl.y)
- {
- clif_party_xy(sd);
- p->data[i].x = sd->bl.x;
- p->data[i].y = sd->bl.y;
- }
- if (battle_config.party_hp_mode &&
- p->data[i].hp != sd->battle_status.hp)
- {
- clif_party_hp(sd);
- p->data[i].hp = sd->battle_status.hp;
- }
- }
- return 0;
-}
-
-int party_send_xy_timer(int tid,unsigned int tick,int id,int data)
-{
- party_db->foreach(party_db,party_send_xy_timer_sub,tick);
- return 0;
-}
-
-int party_send_xy_clear(struct party_data *p)
-{
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- if(!p->data[i].sd) continue;
- p->data[i].hp = 0;
- p->data[i].x = 0;
- p->data[i].y = 0;
- }
- return 0;
-}
-
-// exp share and added zeny share [Valaris]
-int party_exp_share(struct party_data *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny)
-{
- struct map_session_data* sd[MAX_PARTY];
- int i;
- unsigned short c;
-
- nullpo_retr(0, p);
-
- for (i = c = 0; i < MAX_PARTY; i++)
- if ((sd[c] = p->data[i].sd)!=NULL && sd[c]->bl.m == src->m && !pc_isdead(sd[c])) {
- if (battle_config.idle_no_share && (sd[c]->chatID || sd[c]->vender_id || (sd[c]->idletime < (last_tick - battle_config.idle_no_share))))
- continue;
- c++;
- }
- if (c < 1)
- return 0;
-
- base_exp/=c;
- job_exp/=c;
- zeny/=c;
-
- if (battle_config.party_even_share_bonus && c > 1) {
- unsigned short bonus =100 + battle_config.party_even_share_bonus*(c-1);
- if (base_exp) {
- if (base_exp/100 > UINT_MAX/bonus)
- base_exp= UINT_MAX; //Exp overflow
- else if (base_exp > 10000)
- base_exp = (base_exp/100)*bonus; //Calculation overflow protection
- else
- base_exp = base_exp*bonus/100;
- }
- if (job_exp) {
- if (job_exp/100 > UINT_MAX/bonus)
- job_exp = UINT_MAX;
- else if (job_exp > 10000)
- job_exp = (job_exp/100)*bonus;
- else
- job_exp = job_exp*bonus/100;
- }
- if (zeny) {
- if (zeny/100 > INT_MAX/bonus)
- zeny = INT_MAX;
- else if (zeny > 10000)
- zeny = (zeny/100)*bonus;
- else
- zeny = zeny*bonus/100;
- }
- }
-
- for (i = 0; i < c; i++)
- {
- pc_gainexp(sd[i], src, base_exp, job_exp);
- if (zeny) // zeny from mobs [Valaris]
- pc_getzeny(sd[i],zeny);
- }
- return 0;
-}
-
-//Does party loot. first holds the id of the player who has time priority to take the item.
-int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, int first)
-{
- TBL_PC *target=NULL;
- int i;
- if (p && p->party.item&2 && (first || !(battle_config.party_share_type&1))) {
- //item distribution to party members.
- if (battle_config.party_share_type&2) { //Round Robin
- TBL_PC *psd;
- i = p->itemc;
- do {
- i++;
- if (i >= MAX_PARTY)
- i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
- if ((psd=p->data[i].sd)==NULL || sd->bl.m != psd->bl.m ||
- pc_isdead(psd) || (battle_config.idle_no_share && (
- psd->chatID || psd->vender_id || (psd->idletime < (last_tick - battle_config.idle_no_share)))
- ))
- continue;
-
- if (pc_additem(psd,item_data,item_data->amount))
- continue; //Chosen char can't pick up loot.
- //Successful pick.
- p->itemc = i;
- target = psd;
- break;
- } while (i != p->itemc);
- } else { //Random pick
- TBL_PC *psd[MAX_PARTY];
- int count=0;
- //Collect pick candidates
- for (i = 0; i < MAX_PARTY; i++) {
- if ((psd[count]=p->data[i].sd) && psd[count]->bl.m == sd->bl.m &&
- !pc_isdead(psd[count]) && (!battle_config.idle_no_share || (
- !psd[count]->chatID && !psd[count]->vender_id &&
- (psd[count]->idletime >= (last_tick - battle_config.idle_no_share)))
- ))
- count++;
- }
- while (count > 0) { //Pick a random member.
- i = rand()%count;
- if (pc_additem(psd[i],item_data,item_data->amount))
- { //Discard this receiver.
- psd[i] = psd[count-1];
- count--;
- } else { //Successful pick.
- target = psd[i];
- break;
- }
- }
- }
- }
- if (!target) { //Give it to the owner.
- target = sd;
- if ((i=pc_additem(sd,item_data,item_data->amount)))
- return i;
- }
-
- if(log_config.enable_logs&0x8) //Logs items, taken by (P)layers [Lupus]
- log_pick_pc(target, "P", item_data->nameid, item_data->amount, item_data);
- //Logs
- if(battle_config.party_show_share_picker && target != sd){
- char output[80];
- sprintf(output, "%s acquired the item.",target->status.name);
- clif_disp_onlyself(sd,output,strlen(output));
- }
- return 0;
-}
-
-int party_send_dot_remove(struct map_session_data *sd)
-{
- if (sd->status.party_id)
- clif_party_xy_remove(sd);
- return 0;
-}
-
-// To use for Taekwon's "Fighting Chant"
-// int c = 0;
-// party_foreachsamemap(party_sub_count, sd, 0, &c);
-int party_sub_count(struct block_list *bl, va_list ap)
-{
- struct map_session_data *sd = (TBL_PC *)bl;
-
- if (sd->state.autotrade)
- return 0;
-
- if (battle_config.idle_no_share && (sd->chatID || sd->vender_id || (sd->idletime < (last_tick - battle_config.idle_no_share))))
- return 0;
-
- return 1;
-}
-
-int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...)
-{
- struct party_data *p;
- va_list ap;
- int i;
- int x0,y0,x1,y1;
- struct block_list *list[MAX_PARTY];
- int blockcount=0;
- int total = 0; //Return value.
-
- nullpo_retr(0,sd);
-
- if((p=party_search(sd->status.party_id))==NULL)
- return 0;
-
- x0=sd->bl.x-range;
- y0=sd->bl.y-range;
- x1=sd->bl.x+range;
- y1=sd->bl.y+range;
-
- va_start(ap,range);
-
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *psd=p->data[i].sd;
- if(!psd) continue;
- if(psd->bl.m!=sd->bl.m || !psd->bl.prev)
- continue;
- if(range &&
- (psd->bl.x<x0 || psd->bl.y<y0 ||
- psd->bl.x>x1 || psd->bl.y>y1 ) )
- continue;
- list[blockcount++]=&psd->bl;
- }
-
- map_freeblock_lock();
-
- for(i=0;i<blockcount;i++)
- total += func(list[i],ap);
-
- map_freeblock_unlock();
-
- va_end(ap);
- return total;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "../common/timer.h"
+#include "../common/socket.h"
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
+#include "party.h"
+#include "pc.h"
+#include "map.h"
+#include "battle.h"
+#include "intif.h"
+#include "clif.h"
+#include "log.h"
+#include "skill.h"
+#include "status.h"
+
+static struct dbt* party_db;
+static struct party_data* party_cache = NULL; //party in cache for skipping consecutive lookups. [Skotlex]
+int party_share_level = 10;
+int party_send_xy_timer(int tid,unsigned int tick,int id,int data);
+
+/*==========================================
+ * Fills the given party_member structure according to the sd provided.
+ * Used when creating/adding people to a party. [Skotlex]
+ *------------------------------------------
+ */
+static void party_fill_member(struct party_member *member, struct map_session_data *sd) {
+ member->account_id = sd->status.account_id;
+ member->char_id = sd->status.char_id;
+ memcpy(member->name,sd->status.name,NAME_LENGTH);
+ member->class_ = sd->status.class_;
+ member->map = sd->mapindex;
+ member->lv = sd->status.base_level;
+ member->online = 1;
+ member->leader = 0;
+}
+
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+void do_final_party(void)
+{
+ party_db->destroy(party_db,NULL);
+}
+// ‰Šú‰»
+void do_init_party(void)
+{
+ party_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ add_timer_func_list(party_send_xy_timer,"party_send_xy_timer");
+ add_timer_interval(gettick()+battle_config.party_update_interval,party_send_xy_timer,0,0,battle_config.party_update_interval);
+}
+
+// ŒŸõ
+struct party_data *party_search(int party_id)
+{
+ if(!party_id) return NULL;
+ if (party_cache && party_cache->party.party_id == party_id)
+ return party_cache;
+
+ party_cache = idb_get(party_db,party_id);
+ return party_cache;
+}
+int party_searchname_sub(DBKey key,void *data,va_list ap)
+{
+ struct party_data *p=(struct party_data *)data,**dst;
+ char *str;
+ str=va_arg(ap,char *);
+ dst=va_arg(ap,struct party_data **);
+ if(strncmpi(p->party.name,str,NAME_LENGTH)==0)
+ *dst=p;
+ return 0;
+}
+
+struct party_data* party_searchname(char *str)
+{
+ struct party_data *p=NULL;
+ party_db->foreach(party_db,party_searchname_sub,str,&p);
+ return p;
+}
+
+int party_create(struct map_session_data *sd,char *name,int item,int item2)
+{
+ struct party_member leader;
+ nullpo_retr(0, sd);
+
+ if(sd->status.party_id) {
+ clif_party_created(sd,2);
+ return 0;
+ }
+
+ party_fill_member(&leader, sd);
+ leader.leader = 1;
+
+ intif_create_party(&leader,name,item,item2);
+ return 0;
+}
+
+
+int party_created(int account_id,int char_id,int fail,int party_id,char *name)
+{
+ struct map_session_data *sd;
+ struct party_data *p;
+ sd=map_id2sd(account_id);
+
+ nullpo_retr(0, sd);
+ if (sd->status.char_id != char_id)
+ return 0; //unlikely failure...
+
+ if(fail){
+ clif_party_created(sd,1);
+ return 0;
+ }
+ sd->status.party_id=party_id;
+ if(idb_get(party_db,party_id)!=NULL){
+ ShowFatalError("party: id already exists!\n");
+ exit(1);
+ }
+ p=(struct party_data *)aCalloc(1,sizeof(struct party_data));
+ p->party.party_id=party_id;
+ memcpy(p->party.name, name, NAME_LENGTH);
+ idb_put(party_db,party_id,p);
+ clif_party_created(sd,0); //Success message
+ clif_charnameupdate(sd); //Update other people's display. [Skotlex]
+ return 1;
+}
+
+int party_request_info(int party_id)
+{
+ return intif_request_partyinfo(party_id);
+}
+
+int party_check_member(struct party *p)
+{
+ int i, users;
+ struct map_session_data *sd, **all_sd;
+
+ nullpo_retr(0, p);
+
+ all_sd = map_getallusers(&users);
+
+ for(i=0;i<users;i++)
+ {
+ if((sd = all_sd[i]) && sd->status.party_id==p->party_id)
+ {
+ int j,f=1;
+ for(j=0;j<MAX_PARTY;j++){
+ if(p->member[j].account_id==sd->status.account_id &&
+ p->member[j].char_id==sd->status.char_id)
+ {
+ f=0;
+ break;
+ }
+ }
+
+ if(f){
+ sd->status.party_id=0;
+ if(battle_config.error_log)
+ ShowWarning("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
+ }
+ }
+ }
+ return 0;
+}
+
+int party_recv_noinfo(int party_id)
+{
+ int i, users;
+ struct map_session_data *sd, **all_sd;
+
+ all_sd = map_getallusers(&users);
+
+ for(i=0;i<users;i++){
+ if((sd = all_sd[i]) && sd->status.party_id==party_id)
+ sd->status.party_id=0;
+ }
+ return 0;
+}
+
+static void* create_party(DBKey key, va_list args) {
+ struct party_data *p;
+ p=(struct party_data *)aCalloc(1,sizeof(struct party_data));
+ return p;
+}
+
+static void party_check_state(struct party_data *p)
+{
+ int i;
+ malloc_set(&p->state, 0, sizeof(p->state));
+ for (i = 0; i < MAX_PARTY; i ++)
+ {
+ if (!p->party.member[i].online) continue; //Those not online shouldn't aport to skill usage and all that.
+ switch (p->party.member[i].class_) {
+ case JOB_MONK:
+ case JOB_BABY_MONK:
+ case JOB_CHAMPION:
+ p->state.monk = 1;
+ break;
+ case JOB_STAR_GLADIATOR:
+ p->state.sg = 1;
+ break;
+ case JOB_SUPER_NOVICE:
+ case JOB_SUPER_BABY:
+ p->state.snovice = 1;
+ break;
+ case JOB_TAEKWON:
+ p->state.tk = 1;
+ break;
+ }
+ }
+}
+
+int party_recv_info(struct party *sp)
+{
+ struct map_session_data *sd;
+ struct party_data *p;
+ int i;
+
+ nullpo_retr(0, sp);
+
+ p= idb_ensure(party_db, sp->party_id, create_party);
+ if (!p->party.party_id) //party just received.
+ party_check_member(sp);
+ memcpy(&p->party,sp,sizeof(struct party));
+ malloc_set(&p->state, 0, sizeof(p->state));
+ malloc_set(&p->data, 0, sizeof(p->data));
+ for(i=0;i<MAX_PARTY;i++){
+ if (!p->party.member[i].account_id)
+ continue;
+ sd = map_id2sd(p->party.member[i].account_id);
+ if (sd && sd->status.party_id==p->party.party_id
+ && sd->status.char_id == p->party.member[i].char_id
+ && !sd->state.waitingdisconnect)
+ p->data[i].sd = sd;
+ }
+ party_check_state(p);
+ for(i=0;i<MAX_PARTY;i++){
+ sd = p->data[i].sd;
+ if(!sd || sd->state.party_sent)
+ continue;
+ clif_party_main_info(p,-1);
+ clif_party_option(p,sd,0x100);
+ clif_party_info(p,-1);
+ sd->state.party_sent=1;
+ }
+
+ return 0;
+}
+
+int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
+{
+ struct party_data *p=party_search(sd->status.party_id);
+ int i,flag=0;
+
+ nullpo_retr(0, sd);
+
+ if(tsd==NULL || p==NULL)
+ return 0;
+ if(!battle_config.invite_request_check) {
+ if (tsd->guild_invite>0 || tsd->trade_partner) {
+ clif_party_inviteack(sd,tsd->status.name,0);
+ return 0;
+ }
+ }
+ if( tsd->status.party_id>0 || tsd->party_invite>0 ){
+ clif_party_inviteack(sd,tsd->status.name,0);
+ return 0;
+ }
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->party.member[i].account_id == 0) //Room for a new member.
+ flag = 1;
+ /* By default Aegis BLOCKS more than one char from the same account on a party.
+ * But eA does support it... so this check is left commented.
+ if(p->party.member[i].account_id==tsd->status.account_id)
+ {
+ clif_party_inviteack(sd,tsd->status.name,4);
+ return 0;
+ }
+ */
+ }
+ if (!flag) { //Full party.
+ clif_party_inviteack(sd,tsd->status.name,3);
+ return 0;
+ }
+
+ tsd->party_invite=sd->status.party_id;
+ tsd->party_invite_account=sd->status.account_id;
+
+ clif_party_invite(sd,tsd);
+ return 1;
+}
+
+int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
+{
+ struct map_session_data *tsd= map_id2sd(account_id);
+ struct party_member member;
+ nullpo_retr(0, sd);
+
+ if(flag==1){
+ party_fill_member(&member, sd);
+ intif_party_addmember(sd->party_invite, &member);
+ return 0;
+ }
+ sd->party_invite=0;
+ sd->party_invite_account=0;
+ if(tsd==NULL)
+ return 0;
+ clif_party_inviteack(tsd,sd->status.name,1);
+ return 1;
+}
+
+int party_member_added(int party_id,int account_id,int char_id, int flag)
+{
+ struct map_session_data *sd = map_id2sd(account_id),*sd2;
+ struct party_data *p = party_search(party_id);
+ if(sd == NULL || sd->status.char_id != char_id){
+ if (flag == 0) {
+ if(battle_config.error_log)
+ ShowError("party: member added error %d is not online\n",account_id);
+ intif_party_leave(party_id,account_id,char_id);
+ }
+ return 0;
+ }
+ sd->party_invite=0;
+ sd->party_invite_account=0;
+
+ if (!p) {
+ if(battle_config.error_log)
+ ShowError("party_member_added: party %d not found.\n",party_id);
+ intif_party_leave(party_id,account_id,char_id);
+ return 0;
+ }
+
+ if(!flag) {
+ sd->state.party_sent=0;
+ sd->status.party_id=party_id;
+ party_check_conflict(sd);
+ clif_party_join_info(&p->party,sd);
+ clif_party_hp(sd);
+ clif_party_xy(sd);
+ clif_charnameupdate(sd); //Update char name's display [Skotlex]
+ }
+
+ sd2=map_id2sd(sd->party_invite_account);
+ if (sd2)
+ clif_party_inviteack(sd2,sd->status.name,flag?2:1);
+ return 0;
+}
+
+int party_removemember(struct map_session_data *sd,int account_id,char *name)
+{
+ struct party_data *p;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if( (p = party_search(sd->status.party_id)) == NULL )
+ return 0;
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->party.member[i].account_id==sd->status.account_id &&
+ p->party.member[i].char_id==sd->status.char_id) {
+ if(p->party.member[i].leader)
+ break;
+ return 0;
+ }
+ }
+ if (i >= MAX_PARTY) //Request from someone not in party? o.O
+ return 0;
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->party.member[i].account_id==account_id &&
+ strncmp(p->party.member[i].name,name,NAME_LENGTH)==0)
+ {
+ intif_party_leave(p->party.party_id,account_id,p->party.member[i].char_id);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int party_leave(struct map_session_data *sd)
+{
+ struct party_data *p;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if( (p = party_search(sd->status.party_id)) == NULL )
+ return 0;
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->party.member[i].account_id==sd->status.account_id &&
+ p->party.member[i].char_id==sd->status.char_id){
+ intif_party_leave(p->party.party_id,sd->status.account_id,sd->status.char_id);
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int party_member_leaved(int party_id,int account_id,int char_id)
+{
+ struct map_session_data *sd=map_id2sd(account_id);
+ struct party_data *p=party_search(party_id);
+ int i;
+ if (sd && sd->status.char_id != char_id) //Wrong target
+ sd = NULL;
+ if(p!=NULL){
+ for(i=0;i<MAX_PARTY;i++)
+ if(p->party.member[i].account_id==account_id &&
+ p->party.member[i].char_id==char_id){
+ clif_party_leaved(p,sd,account_id,p->party.member[i].name,0x00);
+ malloc_set(&p->party.member[i], 0, sizeof(p->party.member[0]));
+ malloc_set(&p->data[i], 0, sizeof(p->data[0]));
+ p->party.count--;
+ party_check_state(p);
+ break;
+ }
+ }
+ if(sd!=NULL && sd->status.party_id==party_id){
+ sd->status.party_id=0;
+ sd->state.party_sent=0;
+ clif_charnameupdate(sd); //Update name display [Skotlex]
+ }
+ return 0;
+}
+
+int party_broken(int party_id)
+{
+ struct party_data *p;
+ int i;
+ if( (p=party_search(party_id))==NULL )
+ return 0;
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->data[i].sd!=NULL){
+ clif_party_leaved(p,p->data[i].sd,
+ p->party.member[i].account_id,p->party.member[i].name,0x10);
+ p->data[i].sd->status.party_id=0;
+ p->data[i].sd->state.party_sent=0;
+ }
+ }
+ if (party_cache && party_cache->party.party_id == party_id)
+ party_cache = NULL;
+ idb_remove(party_db,party_id);
+ return 0;
+}
+
+int party_changeoption(struct map_session_data *sd,int exp,int item)
+{
+ nullpo_retr(0, sd);
+
+ if( sd->status.party_id==0)
+ return 0;
+ intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
+ return 0;
+}
+
+int party_optionchanged(int party_id,int account_id,int exp,int item,int flag)
+{
+ struct party_data *p;
+ struct map_session_data *sd=map_id2sd(account_id);
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+
+ if(!(flag&0x01) && p->party.exp != exp) {
+ p->party.exp=exp;
+ clif_party_option(p,sd,flag); //This packet doesn't updates item info anymore...
+ }
+ if(!(flag&0x10) && p->party.item != item) {
+ p->party.item=item;
+ clif_party_main_info(p,-1);
+ }
+ if(flag&0x01) //Send denied message
+ clif_party_option(p,sd,flag);
+ return 0;
+}
+
+int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv)
+{
+ struct party_data *p;
+ int i;
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+ for(i=0;i<MAX_PARTY;i++){
+ struct map_session_data *sd;
+ struct party_member *m=&p->party.member[i];
+ if(m->account_id==account_id && m->char_id==char_id){
+ m->map = map;
+ m->online=online;
+ m->lv=lv;
+ //Check if they still exist on this map server
+ sd = map_id2sd(m->account_id);
+ p->data[i].sd = (sd!=NULL && sd->status.party_id==p->party.party_id && sd->status.char_id == m->char_id && !sd->state.waitingdisconnect)?sd:NULL;
+ break;
+ }
+ }
+ if(i==MAX_PARTY){
+ if(battle_config.error_log)
+ ShowError("party: not found member %d/%d on %d[%s]",account_id,char_id,party_id,p->party.name);
+ return 0;
+ }
+
+ clif_party_info(p,-1);
+ return 0;
+}
+
+int party_send_movemap(struct map_session_data *sd)
+{
+ int i;
+ struct party_data *p;
+
+ nullpo_retr(0, sd);
+
+ if( sd->status.party_id==0 )
+ return 0;
+ intif_party_changemap(sd,1);
+
+ p=party_search(sd->status.party_id);
+ if (p && sd->fd) {
+ //Send dots of other party members to this char. [Skotlex]
+ for(i=0; i < MAX_PARTY; i++) {
+ if (!p->data[i].sd || p->data[i].sd == sd ||
+ p->data[i].sd->bl.m != sd->bl.m)
+ continue;
+ clif_party_xy_single(sd->fd, p->data[i].sd);
+ }
+
+ }
+
+ if( sd->state.party_sent )
+ return 0;
+
+ party_check_conflict(sd);
+
+ if(p){
+ party_check_member(&p->party);
+ if(sd->status.party_id==p->party.party_id){
+ clif_party_main_info(p,sd->fd);
+ clif_party_option(p,sd,0x100);
+ clif_party_info(p,sd->fd);
+ sd->state.party_sent=1;
+ }
+ }
+
+ return 0;
+}
+
+int party_send_logout(struct map_session_data *sd)
+{
+ struct party_data *p;
+ int i;
+
+ if(!sd->status.party_id)
+ return 0;
+
+ intif_party_changemap(sd,0);
+ p=party_search(sd->status.party_id);
+ if(!p) return 0;
+
+ for(i=0;i<MAX_PARTY && p->data[i].sd != sd;i++);
+ if (i < MAX_PARTY)
+ malloc_set(&p->data[i], 0, sizeof(p->data[0]));
+
+ return 1;
+}
+
+int party_send_message(struct map_session_data *sd,char *mes,int len)
+{
+ if(sd->status.party_id==0)
+ return 0;
+ intif_party_message(sd->status.party_id,sd->status.account_id,mes,len);
+ party_recv_message(sd->status.party_id,sd->status.account_id,mes,len);
+ //Chat Logging support Type 'P'
+ if(log_config.chat&1 //we log everything then
+ || (log_config.chat&4 //if Party bit is on
+ && ( !agit_flag || !(log_config.chat&16) ))) //if WOE ONLY flag is off or AGIT is OFF
+ log_chat("P", sd->status.party_id, sd->status.char_id, sd->status.account_id, (char*)mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes);
+
+ return 0;
+}
+
+int party_recv_message(int party_id,int account_id,char *mes,int len)
+{
+ struct party_data *p;
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+ clif_party_message(p,account_id,mes,len);
+ return 0;
+}
+
+int party_check_conflict(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ intif_party_checkconflict(sd->status.party_id,sd->status.account_id,sd->status.char_id);
+ return 0;
+}
+
+int party_skill_check(struct map_session_data *sd, int party_id, int skillid, int skilllv)
+{
+ struct party_data *p;
+ struct map_session_data *p_sd;
+ int i;
+
+ if(!party_id || (p=party_search(party_id))==NULL)
+ return 0;
+ switch(skillid) {
+ case TK_COUNTER: //Increase Triple Attack rate of Monks.
+ if (!p->state.monk) return 0;
+ break;
+ case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators
+ if (!p->state.sg) return 0;
+ break;
+ case AM_TWILIGHT2: //Twilight Pharmacy, requires Super Novice
+ return p->state.snovice;
+ case AM_TWILIGHT3: //Twilight Pharmacy, Requires Taekwon
+ return p->state.tk;
+ default:
+ return 0; //Unknown case?
+ }
+
+ for(i=0;i<MAX_PARTY;i++){
+ if ((p_sd = p->data[i].sd) == NULL)
+ continue;
+ if (sd->bl.m != p_sd->bl.m)
+ continue;
+ switch(skillid) {
+ case TK_COUNTER: //Increase Triple Attack rate of Monks.
+ if((p_sd->class_&MAPID_UPPERMASK) == MAPID_MONK
+ && pc_checkskill(p_sd,MO_TRIPLEATTACK)) {
+ sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,
+ 50+50*skilllv, //+100/150/200% rate
+ 0,0,skill_get_time(SG_FRIEND, 1));
+ }
+ break;
+ case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators
+ if((p_sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR
+ && sd->sc.data[SC_READYCOUNTER].timer != -1
+ && pc_checkskill(p_sd,SG_FRIEND)) {
+ sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,
+ 50+50*pc_checkskill(p_sd,SG_FRIEND), //+100/150/200% rate
+ 0,0,skill_get_time(SG_FRIEND, 1));
+ }
+ break;
+ }
+ }
+ return 0;
+}
+
+int party_send_xy_timer_sub(DBKey key,void *data,va_list ap)
+{
+ struct party_data *p=(struct party_data *)data;
+ struct map_session_data *sd;
+ int i;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(!p->data[i].sd) continue;
+ sd = p->data[i].sd;
+ if (p->data[i].x != sd->bl.x || p->data[i].y != sd->bl.y)
+ {
+ clif_party_xy(sd);
+ p->data[i].x = sd->bl.x;
+ p->data[i].y = sd->bl.y;
+ }
+ if (battle_config.party_hp_mode &&
+ p->data[i].hp != sd->battle_status.hp)
+ {
+ clif_party_hp(sd);
+ p->data[i].hp = sd->battle_status.hp;
+ }
+ }
+ return 0;
+}
+
+int party_send_xy_timer(int tid,unsigned int tick,int id,int data)
+{
+ party_db->foreach(party_db,party_send_xy_timer_sub,tick);
+ return 0;
+}
+
+int party_send_xy_clear(struct party_data *p)
+{
+ int i;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(!p->data[i].sd) continue;
+ p->data[i].hp = 0;
+ p->data[i].x = 0;
+ p->data[i].y = 0;
+ }
+ return 0;
+}
+
+// exp share and added zeny share [Valaris]
+int party_exp_share(struct party_data *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny)
+{
+ struct map_session_data* sd[MAX_PARTY];
+ int i;
+ unsigned short c;
+
+ nullpo_retr(0, p);
+
+ for (i = c = 0; i < MAX_PARTY; i++)
+ if ((sd[c] = p->data[i].sd)!=NULL && sd[c]->bl.m == src->m && !pc_isdead(sd[c])) {
+ if (battle_config.idle_no_share && (sd[c]->chatID || sd[c]->vender_id || (sd[c]->idletime < (last_tick - battle_config.idle_no_share))))
+ continue;
+ c++;
+ }
+ if (c < 1)
+ return 0;
+
+ base_exp/=c;
+ job_exp/=c;
+ zeny/=c;
+
+ if (battle_config.party_even_share_bonus && c > 1) {
+ unsigned short bonus =100 + battle_config.party_even_share_bonus*(c-1);
+ if (base_exp) {
+ if (base_exp/100 > UINT_MAX/bonus)
+ base_exp= UINT_MAX; //Exp overflow
+ else if (base_exp > 10000)
+ base_exp = (base_exp/100)*bonus; //Calculation overflow protection
+ else
+ base_exp = base_exp*bonus/100;
+ }
+ if (job_exp) {
+ if (job_exp/100 > UINT_MAX/bonus)
+ job_exp = UINT_MAX;
+ else if (job_exp > 10000)
+ job_exp = (job_exp/100)*bonus;
+ else
+ job_exp = job_exp*bonus/100;
+ }
+ if (zeny) {
+ if (zeny/100 > INT_MAX/bonus)
+ zeny = INT_MAX;
+ else if (zeny > 10000)
+ zeny = (zeny/100)*bonus;
+ else
+ zeny = zeny*bonus/100;
+ }
+ }
+
+ for (i = 0; i < c; i++)
+ {
+ pc_gainexp(sd[i], src, base_exp, job_exp);
+ if (zeny) // zeny from mobs [Valaris]
+ pc_getzeny(sd[i],zeny);
+ }
+ return 0;
+}
+
+//Does party loot. first holds the id of the player who has time priority to take the item.
+int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, int first)
+{
+ TBL_PC *target=NULL;
+ int i;
+ if (p && p->party.item&2 && (first || !(battle_config.party_share_type&1))) {
+ //item distribution to party members.
+ if (battle_config.party_share_type&2) { //Round Robin
+ TBL_PC *psd;
+ i = p->itemc;
+ do {
+ i++;
+ if (i >= MAX_PARTY)
+ i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
+ if ((psd=p->data[i].sd)==NULL || sd->bl.m != psd->bl.m ||
+ pc_isdead(psd) || (battle_config.idle_no_share && (
+ psd->chatID || psd->vender_id || (psd->idletime < (last_tick - battle_config.idle_no_share)))
+ ))
+ continue;
+
+ if (pc_additem(psd,item_data,item_data->amount))
+ continue; //Chosen char can't pick up loot.
+ //Successful pick.
+ p->itemc = i;
+ target = psd;
+ break;
+ } while (i != p->itemc);
+ } else { //Random pick
+ TBL_PC *psd[MAX_PARTY];
+ int count=0;
+ //Collect pick candidates
+ for (i = 0; i < MAX_PARTY; i++) {
+ if ((psd[count]=p->data[i].sd) && psd[count]->bl.m == sd->bl.m &&
+ !pc_isdead(psd[count]) && (!battle_config.idle_no_share || (
+ !psd[count]->chatID && !psd[count]->vender_id &&
+ (psd[count]->idletime >= (last_tick - battle_config.idle_no_share)))
+ ))
+ count++;
+ }
+ while (count > 0) { //Pick a random member.
+ i = rand()%count;
+ if (pc_additem(psd[i],item_data,item_data->amount))
+ { //Discard this receiver.
+ psd[i] = psd[count-1];
+ count--;
+ } else { //Successful pick.
+ target = psd[i];
+ break;
+ }
+ }
+ }
+ }
+ if (!target) { //Give it to the owner.
+ target = sd;
+ if ((i=pc_additem(sd,item_data,item_data->amount)))
+ return i;
+ }
+
+ if(log_config.enable_logs&0x8) //Logs items, taken by (P)layers [Lupus]
+ log_pick_pc(target, "P", item_data->nameid, item_data->amount, item_data);
+ //Logs
+ if(battle_config.party_show_share_picker && target != sd){
+ char output[80];
+ sprintf(output, "%s acquired the item.",target->status.name);
+ clif_disp_onlyself(sd,output,strlen(output));
+ }
+ return 0;
+}
+
+int party_send_dot_remove(struct map_session_data *sd)
+{
+ if (sd->status.party_id)
+ clif_party_xy_remove(sd);
+ return 0;
+}
+
+// To use for Taekwon's "Fighting Chant"
+// int c = 0;
+// party_foreachsamemap(party_sub_count, sd, 0, &c);
+int party_sub_count(struct block_list *bl, va_list ap)
+{
+ struct map_session_data *sd = (TBL_PC *)bl;
+
+ if (sd->state.autotrade)
+ return 0;
+
+ if (battle_config.idle_no_share && (sd->chatID || sd->vender_id || (sd->idletime < (last_tick - battle_config.idle_no_share))))
+ return 0;
+
+ return 1;
+}
+
+int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...)
+{
+ struct party_data *p;
+ va_list ap;
+ int i;
+ int x0,y0,x1,y1;
+ struct block_list *list[MAX_PARTY];
+ int blockcount=0;
+ int total = 0; //Return value.
+
+ nullpo_retr(0,sd);
+
+ if((p=party_search(sd->status.party_id))==NULL)
+ return 0;
+
+ x0=sd->bl.x-range;
+ y0=sd->bl.y-range;
+ x1=sd->bl.x+range;
+ y1=sd->bl.y+range;
+
+ va_start(ap,range);
+
+ for(i=0;i<MAX_PARTY;i++){
+ struct map_session_data *psd=p->data[i].sd;
+ if(!psd) continue;
+ if(psd->bl.m!=sd->bl.m || !psd->bl.prev)
+ continue;
+ if(range &&
+ (psd->bl.x<x0 || psd->bl.y<y0 ||
+ psd->bl.x>x1 || psd->bl.y>y1 ) )
+ continue;
+ list[blockcount++]=&psd->bl;
+ }
+
+ map_freeblock_lock();
+
+ for(i=0;i<blockcount;i++)
+ total += func(list[i],ap);
+
+ map_freeblock_unlock();
+
+ va_end(ap);
+ return total;
+}
diff --git a/src/map/party.h b/src/map/party.h
index a3e7cfaa0..92d78a4b6 100644
--- a/src/map/party.h
+++ b/src/map/party.h
@@ -1,49 +1,49 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PARTY_H_
-#define _PARTY_H_
-
-#include <stdarg.h>
-#include "map.h"
-
-extern int party_share_level;
-struct party;
-struct map_session_data;
-struct block_list;
-
-void do_init_party(void);
-void do_final_party(void);
-struct party_data *party_search(int party_id);
-struct party_data *party_searchname(char *str);
-
-int party_create(struct map_session_data *sd,char *name, int item, int item2);
-int party_created(int account_id,int char_id,int fail,int party_id,char *name);
-int party_request_info(int party_id);
-int party_invite(struct map_session_data *sd,struct map_session_data *tsd);
-int party_member_added(int party_id,int account_id,int char_id,int flag);
-int party_leave(struct map_session_data *sd);
-int party_removemember(struct map_session_data *sd,int account_id,char *name);
-int party_member_leaved(int party_id,int account_id,int char_id);
-int party_reply_invite(struct map_session_data *sd,int account_id,int flag);
-int party_recv_noinfo(int party_id);
-int party_recv_info(struct party *sp);
-int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv);
-int party_broken(int party_id);
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag);
-int party_changeoption(struct map_session_data *sd,int exp,int item);
-int party_send_movemap(struct map_session_data *sd);
-int party_send_logout(struct map_session_data *sd);
-int party_send_message(struct map_session_data *sd,char *mes,int len);
-int party_recv_message(int party_id,int account_id,char *mes,int len);
-int party_check_conflict(struct map_session_data *sd);
-int party_skill_check(struct map_session_data *sd, int party_id, int skillid, int skilllv);
-int party_send_xy_clear(struct party_data *p);
-int party_exp_share(struct party_data *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny);
-int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, int type);
-int party_send_dot_remove(struct map_session_data *sd);
-int party_sub_count(struct block_list *bl, va_list ap);
-int party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...);
-
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _PARTY_H_
+#define _PARTY_H_
+
+#include <stdarg.h>
+#include "map.h"
+
+extern int party_share_level;
+struct party;
+struct map_session_data;
+struct block_list;
+
+void do_init_party(void);
+void do_final_party(void);
+struct party_data *party_search(int party_id);
+struct party_data *party_searchname(char *str);
+
+int party_create(struct map_session_data *sd,char *name, int item, int item2);
+int party_created(int account_id,int char_id,int fail,int party_id,char *name);
+int party_request_info(int party_id);
+int party_invite(struct map_session_data *sd,struct map_session_data *tsd);
+int party_member_added(int party_id,int account_id,int char_id,int flag);
+int party_leave(struct map_session_data *sd);
+int party_removemember(struct map_session_data *sd,int account_id,char *name);
+int party_member_leaved(int party_id,int account_id,int char_id);
+int party_reply_invite(struct map_session_data *sd,int account_id,int flag);
+int party_recv_noinfo(int party_id);
+int party_recv_info(struct party *sp);
+int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv);
+int party_broken(int party_id);
+int party_optionchanged(int party_id,int account_id,int exp,int item,int flag);
+int party_changeoption(struct map_session_data *sd,int exp,int item);
+int party_send_movemap(struct map_session_data *sd);
+int party_send_logout(struct map_session_data *sd);
+int party_send_message(struct map_session_data *sd,char *mes,int len);
+int party_recv_message(int party_id,int account_id,char *mes,int len);
+int party_check_conflict(struct map_session_data *sd);
+int party_skill_check(struct map_session_data *sd, int party_id, int skillid, int skilllv);
+int party_send_xy_clear(struct party_data *p);
+int party_exp_share(struct party_data *p,struct block_list *src,unsigned int base_exp,unsigned int job_exp,int zeny);
+int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, int type);
+int party_send_dot_remove(struct map_session_data *sd);
+int party_sub_count(struct block_list *bl, va_list ap);
+int party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...);
+
+
+#endif
diff --git a/src/map/pc.h b/src/map/pc.h
index d4397db8f..9d9809263 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -1,318 +1,318 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PC_H_
-#define _PC_H_
-
-#include "map.h"
-#include "unit.h"
-
-#define OPTION_MASK 0xd7b8
-#define CART_MASK 0x788
-
-//Update this max as necessary. 53 is the value needed for Super Baby currently
-#define MAX_SKILL_TREE 53
-
-enum {
- 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_UNKNOWN, //View 9 seems unused anywhere
- 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_SHOTGUN, //19
- W_GATLING, //20
- W_GRENADE, //21
- W_HUUMA, //22
- MAX_WEAPON_TYPE
-} weapon_type;
-
-enum {
- A_ARROW = 1,
- A_DAGGER, //2
- A_BULLET, //3
- A_SHELL, //4
- A_GRENADE, //5
- A_SHURIKEN, //6
- A_KUNAI //7
-} ammo_type;
-//Equip position constants
-enum {
- EQP_HEAD_LOW = 0x0001,
- EQP_HEAD_MID = 0x0200, //512
- EQP_HEAD_TOP = 0x0100, //256
- EQP_HAND_R = 0x0002,
- EQP_HAND_L = 0x0020, //32
- EQP_ARMOR = 0x0010, //16
- EQP_SHOES = 0x0040, //64
- EQP_GARMENT = 0x0004,
- EQP_ACC_L = 0x0008,
- EQP_ACC_R = 0x0080, //128
- EQP_AMMO = 0x8000, //32768
-} equip_pos_enum;
-
-#define EQP_WEAPON EQP_HAND_R
-#define EQP_SHIELD EQP_HAND_L
-#define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
-#define EQP_HELM (EQP_HEAD_LOW|EQP_HEAD_MID|EQP_HEAD_TOP)
-#define EQP_ACC (EQP_ACC_L|EQP_ACC_R)
-
-//Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
-//where the arrows are equipped)
-enum {
- EQI_ACC_L = 0,
- EQI_ACC_R,
- EQI_SHOES,
- EQI_GARMENT,
- EQI_HEAD_LOW,
- EQI_HEAD_MID,
- EQI_HEAD_TOP,
- EQI_ARMOR,
- EQI_HAND_L,
- EQI_HAND_R,
- EQI_AMMO,
- EQI_MAX
-} equip_index_enum;
-
-#define pc_setdead(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 1)
-#define pc_setsit(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 2)
-#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
-#define pc_issit(sd) ((sd)->vd.dead_sit == 2)
-#define pc_setdir(sd,b,h) ((sd)->ud.dir = (b) ,(sd)->head_dir = (h) )
-#define pc_setchatid(sd,n) ((sd)->chatID = n)
-#define pc_ishiding(sd) ((sd)->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK))
-#define pc_iscloaking(sd) (!((sd)->sc.option&OPTION_CHASEWALK) && ((sd)->sc.option&OPTION_CLOAK))
-#define pc_ischasewalk(sd) ((sd)->sc.option&OPTION_CHASEWALK)
-#define pc_iscarton(sd) ((sd)->sc.option&CART_MASK)
-#define pc_isfalcon(sd) ((sd)->sc.option&OPTION_FALCON)
-#define pc_isriding(sd) ((sd)->sc.option&OPTION_RIDING)
-#define pc_isinvisible(sd) ((sd)->sc.option&OPTION_INVISIBLE)
-#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
-#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
-#define pc_maxparameter(sd) ((sd->class_&JOBL_BABY) ? battle_config.max_baby_parameter : battle_config.max_parameter)
-
-#define pc_stop_attack(sd) { if (sd->ud.attacktimer!=-1) { unit_stop_attack(&sd->bl); sd->ud.target = 0; } }
-#define pc_stop_walking(sd, type) { if (sd->ud.walktimer!=-1) unit_stop_walking(&sd->bl, type); }
-
-//Weapon check considering dual wielding.
-#define pc_check_weapontype(sd, type) ((type)&((sd)->status.weapon < MAX_WEAPON_TYPE? \
- 1<<(sd)->status.weapon:(1<<(sd)->weapontype1)|(1<<(sd)->weapontype2)))
-//Checks if the given class value corresponds to a player class. [Skotlex]
-#define pcdb_checkid(class_) (class_ <= JOB_XMAS || (class_ >= JOB_NOVICE_HIGH && class_ <= JOB_SOUL_LINKER))
-
-int pc_isGM(struct map_session_data *sd);
-int pc_getrefinebonus(int lv,int type);
-int pc_can_give_items(int level); //[Lupus]
-
-int pc_setrestartvalue(struct map_session_data *sd,int type);
-int pc_makesavestatus(struct map_session_data *);
-int pc_setnewpc(struct map_session_data*,int,int,int,unsigned int,int,int);
-int pc_authok(struct map_session_data*, int, time_t, struct mmo_charstatus *);
-int pc_authfail(struct map_session_data *);
-int pc_reg_received(struct map_session_data *sd);
-
-int pc_isequip(struct map_session_data *sd,int n);
-int pc_equippoint(struct map_session_data *sd,int n);
-
-int pc_checkskill(struct map_session_data *sd,int skill_id);
-int pc_checkallowskill(struct map_session_data *sd);
-int pc_checkequip(struct map_session_data *sd,int pos);
-
-int pc_calc_skilltree(struct map_session_data *sd);
-int pc_calc_skilltree_normalize_job(struct map_session_data *sd);
-int pc_clean_skilltree(struct map_session_data *sd);
-
-#define pc_checkoverhp(sd) (sd->battle_status.hp == sd->battle_status.max_hp)
-#define pc_checkoversp(sd) (sd->battle_status.sp == sd->battle_status.max_sp)
-
-int pc_setpos(struct map_session_data*,unsigned short,int,int,int);
-int pc_setsavepoint(struct map_session_data*,short,int,int);
-int pc_randomwarp(struct map_session_data *sd,int type);
-int pc_memo(struct map_session_data *sd,int i);
-int pc_remove_map(struct map_session_data *sd,int clrtype);
-
-int pc_checkadditem(struct map_session_data*,int,int);
-int pc_inventoryblank(struct map_session_data*);
-int pc_search_inventory(struct map_session_data *sd,int item_id);
-int pc_payzeny(struct map_session_data*,int);
-int pc_additem(struct map_session_data*,struct item*,int);
-int pc_getzeny(struct map_session_data*,int);
-int pc_delitem(struct map_session_data*,int,int,int);
-
-int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount);
-int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type);
-int pc_putitemtocart(struct map_session_data *sd,int idx,int amount);
-int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount);
-int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount);
-
-int pc_takeitem(struct map_session_data*,struct flooritem_data*);
-int pc_dropitem(struct map_session_data*,int,int);
-
-int pc_checkweighticon(struct map_session_data *sd);
-
-int pc_bonus(struct map_session_data*,int,int);
-int pc_bonus2(struct map_session_data *sd,int,int,int);
-int pc_bonus3(struct map_session_data *sd,int,int,int,int);
-int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
-int pc_skill(struct map_session_data*,int,int,int);
-
-int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
-
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int skilllv);
-int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
-
-int pc_modifybuyvalue(struct map_session_data*,int);
-int pc_modifysellvalue(struct map_session_data*,int);
-
-int pc_follow(struct map_session_data*, int); // [MouseJstr]
-int pc_stop_following(struct map_session_data*);
-
-unsigned int pc_maxbaselv(struct map_session_data *sd);
-unsigned int pc_maxjoblv(struct map_session_data *sd);
-int pc_checkbaselevelup(struct map_session_data *sd);
-int pc_checkjoblevelup(struct map_session_data *sd);
-int pc_gainexp(struct map_session_data*,struct block_list*,unsigned int,unsigned int);
-unsigned int pc_nextbaseexp(struct map_session_data *);
-unsigned int pc_nextjobexp(struct map_session_data *);
-int pc_need_status_point(struct map_session_data *,int);
-int pc_statusup(struct map_session_data*,int);
-int pc_statusup2(struct map_session_data*,int,int);
-int pc_skillup(struct map_session_data*,int);
-int pc_allskillup(struct map_session_data*);
-int pc_resetlvl(struct map_session_data*,int type);
-int pc_resetstate(struct map_session_data*);
-int pc_resetskill(struct map_session_data*, int);
-int pc_resetfeel(struct map_session_data*);
-int pc_resethate(struct map_session_data*);
-int pc_equipitem(struct map_session_data*,int,int);
-int pc_unequipitem(struct map_session_data*,int,int);
-int pc_checkitem(struct map_session_data*);
-int pc_useitem(struct map_session_data*,int);
-
-void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
-int pc_dead(struct map_session_data *sd,struct block_list *src);
-void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
-void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
-int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp);
-int pc_percentheal(struct map_session_data *sd,int,int);
-int pc_jobchange(struct map_session_data *,int, int);
-int pc_setoption(struct map_session_data *,int);
-int pc_setcart(struct map_session_data *sd,int type);
-int pc_setfalcon(struct map_session_data *sd);
-int pc_setriding(struct map_session_data *sd);
-int pc_changelook(struct map_session_data *,int,int);
-int pc_equiplookall(struct map_session_data *sd);
-
-int pc_readparam(struct map_session_data*,int);
-int pc_setparam(struct map_session_data*,int,int);
-int pc_readreg(struct map_session_data*,int);
-int pc_setreg(struct map_session_data*,int,int);
-char *pc_readregstr(struct map_session_data *sd,int reg);
-int pc_setregstr(struct map_session_data *sd,int reg,char *str);
-
-#define pc_readglobalreg(sd,reg) pc_readregistry(sd,reg,3)
-#define pc_setglobalreg(sd,reg,val) pc_setregistry(sd,reg,val,3)
-#define pc_readglobalreg_str(sd,reg) pc_readregistry_str(sd,reg,3)
-#define pc_setglobalreg_str(sd,reg,val) pc_setregistry_str(sd,reg,val,3)
-#define pc_readaccountreg(sd,reg) pc_readregistry(sd,reg,2)
-#define pc_setaccountreg(sd,reg,val) pc_setregistry(sd,reg,val,2)
-#define pc_readaccountregstr(sd,reg) pc_readregistry_str(sd,reg,2)
-#define pc_setaccountregstr(sd,reg,val) pc_setregistry_str(sd,reg,val,2)
-#define pc_readaccountreg2(sd,reg) pc_readregistry(sd,reg,1)
-#define pc_setaccountreg2(sd,reg,val) pc_setregistry(sd,reg,val,1)
-#define pc_readaccountreg2str(sd,reg) pc_readregistry_str(sd,reg,1)
-#define pc_setaccountreg2str(sd,reg,val) pc_setregistry_str(sd,reg,val,1)
-int pc_readregistry(struct map_session_data*,const char*,int);
-int pc_setregistry(struct map_session_data*,const char*,int,int);
-char *pc_readregistry_str(struct map_session_data*,char*,int);
-int pc_setregistry_str(struct map_session_data*,char*,char*,int);
-
-int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name);
-int pc_deleventtimer(struct map_session_data *sd,const char *name);
-int pc_cleareventtimer(struct map_session_data *sd);
-int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick);
-
-int pc_calc_pvprank(struct map_session_data *sd);
-int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data);
-
-int pc_ismarried(struct map_session_data *sd);
-int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd);
-int pc_divorce(struct map_session_data *sd);
-int pc_adoption(struct map_session_data *sd,struct map_session_data *dstsd,struct map_session_data *jasd);
-struct map_session_data *pc_get_partner(struct map_session_data *sd);
-struct map_session_data *pc_get_father(struct map_session_data *sd);
-struct map_session_data *pc_get_mother(struct map_session_data *sd);
-struct map_session_data *pc_get_child(struct map_session_data *sd);
-
-void pc_bleeding (struct map_session_data *sd, unsigned int diff_tick);
-
-int pc_set_gm_level(int account_id, int level);
-void pc_setstand(struct map_session_data *sd);
-int pc_candrop(struct map_session_data *sd,struct item *item);
-
-int pc_jobid2mapid(unsigned short b_class); // Skotlex
-int pc_mapid2jobid(unsigned short class_, int sex); // Skotlex
-
-char * job_name(int class_);
-
-struct skill_tree_entry {
- short id;
- unsigned char max;
- unsigned char joblv;
- struct {
- short id;
- unsigned char lv;
- } need[5];
-}; // Celest
-extern struct skill_tree_entry skill_tree[MAX_PC_CLASS][MAX_SKILL_TREE];
-
-int pc_read_gm_account(int fd);
-int pc_setinvincibletimer(struct map_session_data *sd,int);
-int pc_delinvincibletimer(struct map_session_data *sd);
-int pc_addspiritball(struct map_session_data *sd,int,int);
-int pc_delspiritball(struct map_session_data *sd,int,int);
-void pc_addfame(struct map_session_data *sd,int count);
-unsigned char pc_famerank(int char_id, int job);
-int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl);
-
-extern struct fame_list smith_fame_list[MAX_FAME_LIST];
-extern struct fame_list chemist_fame_list[MAX_FAME_LIST];
-extern struct fame_list taekwon_fame_list[MAX_FAME_LIST];
-
-int pc_readdb(void);
-int do_init_pc(void);
-void do_final_pc(void);
-
-enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT};
-
-// timer for night.day
-extern int day_timer_tid;
-extern int night_timer_tid;
-int map_day_timer(int,unsigned int,int,int); // by [yor]
-int map_night_timer(int,unsigned int,int,int); // by [yor]
-
-//Duel functions // [LuzZza]
-int duel_create(struct map_session_data* sd, const unsigned int maxpl);
-int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd);
-int duel_accept(const unsigned int did, struct map_session_data* sd);
-int duel_reject(const unsigned int did, struct map_session_data* sd);
-int duel_leave(const unsigned int did, struct map_session_data* sd);
-int duel_showinfo(const unsigned int did, struct map_session_data* sd);
-int duel_checktime(struct map_session_data* sd);
-
-int pc_read_motd(void); // [Valaris]
-int pc_disguise(struct map_session_data *sd, int class_);
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _PC_H_
+#define _PC_H_
+
+#include "map.h"
+#include "unit.h"
+
+#define OPTION_MASK 0xd7b8
+#define CART_MASK 0x788
+
+//Update this max as necessary. 53 is the value needed for Super Baby currently
+#define MAX_SKILL_TREE 53
+
+enum {
+ 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_UNKNOWN, //View 9 seems unused anywhere
+ 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_SHOTGUN, //19
+ W_GATLING, //20
+ W_GRENADE, //21
+ W_HUUMA, //22
+ MAX_WEAPON_TYPE
+} weapon_type;
+
+enum {
+ A_ARROW = 1,
+ A_DAGGER, //2
+ A_BULLET, //3
+ A_SHELL, //4
+ A_GRENADE, //5
+ A_SHURIKEN, //6
+ A_KUNAI //7
+} ammo_type;
+//Equip position constants
+enum {
+ EQP_HEAD_LOW = 0x0001,
+ EQP_HEAD_MID = 0x0200, //512
+ EQP_HEAD_TOP = 0x0100, //256
+ EQP_HAND_R = 0x0002,
+ EQP_HAND_L = 0x0020, //32
+ EQP_ARMOR = 0x0010, //16
+ EQP_SHOES = 0x0040, //64
+ EQP_GARMENT = 0x0004,
+ EQP_ACC_L = 0x0008,
+ EQP_ACC_R = 0x0080, //128
+ EQP_AMMO = 0x8000, //32768
+} equip_pos_enum;
+
+#define EQP_WEAPON EQP_HAND_R
+#define EQP_SHIELD EQP_HAND_L
+#define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
+#define EQP_HELM (EQP_HEAD_LOW|EQP_HEAD_MID|EQP_HEAD_TOP)
+#define EQP_ACC (EQP_ACC_L|EQP_ACC_R)
+
+//Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
+//where the arrows are equipped)
+enum {
+ EQI_ACC_L = 0,
+ EQI_ACC_R,
+ EQI_SHOES,
+ EQI_GARMENT,
+ EQI_HEAD_LOW,
+ EQI_HEAD_MID,
+ EQI_HEAD_TOP,
+ EQI_ARMOR,
+ EQI_HAND_L,
+ EQI_HAND_R,
+ EQI_AMMO,
+ EQI_MAX
+} equip_index_enum;
+
+#define pc_setdead(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 1)
+#define pc_setsit(sd) ((sd)->state.dead_sit = (sd)->vd.dead_sit = 2)
+#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
+#define pc_issit(sd) ((sd)->vd.dead_sit == 2)
+#define pc_setdir(sd,b,h) ((sd)->ud.dir = (b) ,(sd)->head_dir = (h) )
+#define pc_setchatid(sd,n) ((sd)->chatID = n)
+#define pc_ishiding(sd) ((sd)->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK))
+#define pc_iscloaking(sd) (!((sd)->sc.option&OPTION_CHASEWALK) && ((sd)->sc.option&OPTION_CLOAK))
+#define pc_ischasewalk(sd) ((sd)->sc.option&OPTION_CHASEWALK)
+#define pc_iscarton(sd) ((sd)->sc.option&CART_MASK)
+#define pc_isfalcon(sd) ((sd)->sc.option&OPTION_FALCON)
+#define pc_isriding(sd) ((sd)->sc.option&OPTION_RIDING)
+#define pc_isinvisible(sd) ((sd)->sc.option&OPTION_INVISIBLE)
+#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
+#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
+#define pc_maxparameter(sd) ((sd->class_&JOBL_BABY) ? battle_config.max_baby_parameter : battle_config.max_parameter)
+
+#define pc_stop_attack(sd) { if (sd->ud.attacktimer!=-1) { unit_stop_attack(&sd->bl); sd->ud.target = 0; } }
+#define pc_stop_walking(sd, type) { if (sd->ud.walktimer!=-1) unit_stop_walking(&sd->bl, type); }
+
+//Weapon check considering dual wielding.
+#define pc_check_weapontype(sd, type) ((type)&((sd)->status.weapon < MAX_WEAPON_TYPE? \
+ 1<<(sd)->status.weapon:(1<<(sd)->weapontype1)|(1<<(sd)->weapontype2)))
+//Checks if the given class value corresponds to a player class. [Skotlex]
+#define pcdb_checkid(class_) (class_ <= JOB_XMAS || (class_ >= JOB_NOVICE_HIGH && class_ <= JOB_SOUL_LINKER))
+
+int pc_isGM(struct map_session_data *sd);
+int pc_getrefinebonus(int lv,int type);
+int pc_can_give_items(int level); //[Lupus]
+
+int pc_setrestartvalue(struct map_session_data *sd,int type);
+int pc_makesavestatus(struct map_session_data *);
+int pc_setnewpc(struct map_session_data*,int,int,int,unsigned int,int,int);
+int pc_authok(struct map_session_data*, int, time_t, struct mmo_charstatus *);
+int pc_authfail(struct map_session_data *);
+int pc_reg_received(struct map_session_data *sd);
+
+int pc_isequip(struct map_session_data *sd,int n);
+int pc_equippoint(struct map_session_data *sd,int n);
+
+int pc_checkskill(struct map_session_data *sd,int skill_id);
+int pc_checkallowskill(struct map_session_data *sd);
+int pc_checkequip(struct map_session_data *sd,int pos);
+
+int pc_calc_skilltree(struct map_session_data *sd);
+int pc_calc_skilltree_normalize_job(struct map_session_data *sd);
+int pc_clean_skilltree(struct map_session_data *sd);
+
+#define pc_checkoverhp(sd) (sd->battle_status.hp == sd->battle_status.max_hp)
+#define pc_checkoversp(sd) (sd->battle_status.sp == sd->battle_status.max_sp)
+
+int pc_setpos(struct map_session_data*,unsigned short,int,int,int);
+int pc_setsavepoint(struct map_session_data*,short,int,int);
+int pc_randomwarp(struct map_session_data *sd,int type);
+int pc_memo(struct map_session_data *sd,int i);
+int pc_remove_map(struct map_session_data *sd,int clrtype);
+
+int pc_checkadditem(struct map_session_data*,int,int);
+int pc_inventoryblank(struct map_session_data*);
+int pc_search_inventory(struct map_session_data *sd,int item_id);
+int pc_payzeny(struct map_session_data*,int);
+int pc_additem(struct map_session_data*,struct item*,int);
+int pc_getzeny(struct map_session_data*,int);
+int pc_delitem(struct map_session_data*,int,int,int);
+
+int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount);
+int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type);
+int pc_putitemtocart(struct map_session_data *sd,int idx,int amount);
+int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount);
+int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount);
+
+int pc_takeitem(struct map_session_data*,struct flooritem_data*);
+int pc_dropitem(struct map_session_data*,int,int);
+
+int pc_checkweighticon(struct map_session_data *sd);
+
+int pc_bonus(struct map_session_data*,int,int);
+int pc_bonus2(struct map_session_data *sd,int,int,int);
+int pc_bonus3(struct map_session_data *sd,int,int,int,int);
+int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
+int pc_skill(struct map_session_data*,int,int,int);
+
+int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
+
+int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int skilllv);
+int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
+
+int pc_modifybuyvalue(struct map_session_data*,int);
+int pc_modifysellvalue(struct map_session_data*,int);
+
+int pc_follow(struct map_session_data*, int); // [MouseJstr]
+int pc_stop_following(struct map_session_data*);
+
+unsigned int pc_maxbaselv(struct map_session_data *sd);
+unsigned int pc_maxjoblv(struct map_session_data *sd);
+int pc_checkbaselevelup(struct map_session_data *sd);
+int pc_checkjoblevelup(struct map_session_data *sd);
+int pc_gainexp(struct map_session_data*,struct block_list*,unsigned int,unsigned int);
+unsigned int pc_nextbaseexp(struct map_session_data *);
+unsigned int pc_nextjobexp(struct map_session_data *);
+int pc_need_status_point(struct map_session_data *,int);
+int pc_statusup(struct map_session_data*,int);
+int pc_statusup2(struct map_session_data*,int,int);
+int pc_skillup(struct map_session_data*,int);
+int pc_allskillup(struct map_session_data*);
+int pc_resetlvl(struct map_session_data*,int type);
+int pc_resetstate(struct map_session_data*);
+int pc_resetskill(struct map_session_data*, int);
+int pc_resetfeel(struct map_session_data*);
+int pc_resethate(struct map_session_data*);
+int pc_equipitem(struct map_session_data*,int,int);
+int pc_unequipitem(struct map_session_data*,int,int);
+int pc_checkitem(struct map_session_data*);
+int pc_useitem(struct map_session_data*,int);
+
+void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
+int pc_dead(struct map_session_data *sd,struct block_list *src);
+void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
+void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
+int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp);
+int pc_percentheal(struct map_session_data *sd,int,int);
+int pc_jobchange(struct map_session_data *,int, int);
+int pc_setoption(struct map_session_data *,int);
+int pc_setcart(struct map_session_data *sd,int type);
+int pc_setfalcon(struct map_session_data *sd);
+int pc_setriding(struct map_session_data *sd);
+int pc_changelook(struct map_session_data *,int,int);
+int pc_equiplookall(struct map_session_data *sd);
+
+int pc_readparam(struct map_session_data*,int);
+int pc_setparam(struct map_session_data*,int,int);
+int pc_readreg(struct map_session_data*,int);
+int pc_setreg(struct map_session_data*,int,int);
+char *pc_readregstr(struct map_session_data *sd,int reg);
+int pc_setregstr(struct map_session_data *sd,int reg,char *str);
+
+#define pc_readglobalreg(sd,reg) pc_readregistry(sd,reg,3)
+#define pc_setglobalreg(sd,reg,val) pc_setregistry(sd,reg,val,3)
+#define pc_readglobalreg_str(sd,reg) pc_readregistry_str(sd,reg,3)
+#define pc_setglobalreg_str(sd,reg,val) pc_setregistry_str(sd,reg,val,3)
+#define pc_readaccountreg(sd,reg) pc_readregistry(sd,reg,2)
+#define pc_setaccountreg(sd,reg,val) pc_setregistry(sd,reg,val,2)
+#define pc_readaccountregstr(sd,reg) pc_readregistry_str(sd,reg,2)
+#define pc_setaccountregstr(sd,reg,val) pc_setregistry_str(sd,reg,val,2)
+#define pc_readaccountreg2(sd,reg) pc_readregistry(sd,reg,1)
+#define pc_setaccountreg2(sd,reg,val) pc_setregistry(sd,reg,val,1)
+#define pc_readaccountreg2str(sd,reg) pc_readregistry_str(sd,reg,1)
+#define pc_setaccountreg2str(sd,reg,val) pc_setregistry_str(sd,reg,val,1)
+int pc_readregistry(struct map_session_data*,const char*,int);
+int pc_setregistry(struct map_session_data*,const char*,int,int);
+char *pc_readregistry_str(struct map_session_data*,char*,int);
+int pc_setregistry_str(struct map_session_data*,char*,char*,int);
+
+int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name);
+int pc_deleventtimer(struct map_session_data *sd,const char *name);
+int pc_cleareventtimer(struct map_session_data *sd);
+int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick);
+
+int pc_calc_pvprank(struct map_session_data *sd);
+int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data);
+
+int pc_ismarried(struct map_session_data *sd);
+int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd);
+int pc_divorce(struct map_session_data *sd);
+int pc_adoption(struct map_session_data *sd,struct map_session_data *dstsd,struct map_session_data *jasd);
+struct map_session_data *pc_get_partner(struct map_session_data *sd);
+struct map_session_data *pc_get_father(struct map_session_data *sd);
+struct map_session_data *pc_get_mother(struct map_session_data *sd);
+struct map_session_data *pc_get_child(struct map_session_data *sd);
+
+void pc_bleeding (struct map_session_data *sd, unsigned int diff_tick);
+
+int pc_set_gm_level(int account_id, int level);
+void pc_setstand(struct map_session_data *sd);
+int pc_candrop(struct map_session_data *sd,struct item *item);
+
+int pc_jobid2mapid(unsigned short b_class); // Skotlex
+int pc_mapid2jobid(unsigned short class_, int sex); // Skotlex
+
+char * job_name(int class_);
+
+struct skill_tree_entry {
+ short id;
+ unsigned char max;
+ unsigned char joblv;
+ struct {
+ short id;
+ unsigned char lv;
+ } need[5];
+}; // Celest
+extern struct skill_tree_entry skill_tree[MAX_PC_CLASS][MAX_SKILL_TREE];
+
+int pc_read_gm_account(int fd);
+int pc_setinvincibletimer(struct map_session_data *sd,int);
+int pc_delinvincibletimer(struct map_session_data *sd);
+int pc_addspiritball(struct map_session_data *sd,int,int);
+int pc_delspiritball(struct map_session_data *sd,int,int);
+void pc_addfame(struct map_session_data *sd,int count);
+unsigned char pc_famerank(int char_id, int job);
+int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl);
+
+extern struct fame_list smith_fame_list[MAX_FAME_LIST];
+extern struct fame_list chemist_fame_list[MAX_FAME_LIST];
+extern struct fame_list taekwon_fame_list[MAX_FAME_LIST];
+
+int pc_readdb(void);
+int do_init_pc(void);
+void do_final_pc(void);
+
+enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT};
+
+// timer for night.day
+extern int day_timer_tid;
+extern int night_timer_tid;
+int map_day_timer(int,unsigned int,int,int); // by [yor]
+int map_night_timer(int,unsigned int,int,int); // by [yor]
+
+//Duel functions // [LuzZza]
+int duel_create(struct map_session_data* sd, const unsigned int maxpl);
+int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd);
+int duel_accept(const unsigned int did, struct map_session_data* sd);
+int duel_reject(const unsigned int did, struct map_session_data* sd);
+int duel_leave(const unsigned int did, struct map_session_data* sd);
+int duel_showinfo(const unsigned int did, struct map_session_data* sd);
+int duel_checktime(struct map_session_data* sd);
+
+int pc_read_motd(void); // [Valaris]
+int pc_disguise(struct map_session_data *sd, int class_);
+#endif
diff --git a/src/map/pcre.h b/src/map/pcre.h
index 244e55e0d..b2596a83d 100644
--- a/src/map/pcre.h
+++ b/src/map/pcre.h
@@ -1,258 +1,258 @@
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/* In its original form, this is the .in file that is transformed by
-"configure" into pcre.h.
-
- Copyright (c) 1997-2005 University of Cambridge
-
------------------------------------------------------------------------------
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of the University of Cambridge nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
------------------------------------------------------------------------------
-*/
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR 6
-#define PCRE_MINOR 3
-#define PCRE_DATE 15-Aug-2005
-
-/* Win32 uses DLL by default; it needs special stuff for exported functions. */
-
-#ifdef _WIN32
-# ifdef PCRE_DEFINITION
-# ifdef DLL_EXPORT
-# define PCRE_DATA_SCOPE __declspec(dllexport)
-# endif
-# else
-# ifndef PCRE_STATIC
-# define PCRE_DATA_SCOPE extern __declspec(dllimport)
-# endif
-# endif
-#endif
-
-/* For other operating systems, we use the standard "extern". */
-
-#ifndef PCRE_DATA_SCOPE
-# ifdef __cplusplus
-# define PCRE_DATA_SCOPE extern "C"
-# else
-# define PCRE_DATA_SCOPE extern
-# endif
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS 0x00000001
-#define PCRE_MULTILINE 0x00000002
-#define PCRE_DOTALL 0x00000004
-#define PCRE_EXTENDED 0x00000008
-#define PCRE_ANCHORED 0x00000010
-#define PCRE_DOLLAR_ENDONLY 0x00000020
-#define PCRE_EXTRA 0x00000040
-#define PCRE_NOTBOL 0x00000080
-#define PCRE_NOTEOL 0x00000100
-#define PCRE_UNGREEDY 0x00000200
-#define PCRE_NOTEMPTY 0x00000400
-#define PCRE_UTF8 0x00000800
-#define PCRE_NO_AUTO_CAPTURE 0x00001000
-#define PCRE_NO_UTF8_CHECK 0x00002000
-#define PCRE_AUTO_CALLOUT 0x00004000
-#define PCRE_PARTIAL 0x00008000
-#define PCRE_DFA_SHORTEST 0x00010000
-#define PCRE_DFA_RESTART 0x00020000
-#define PCRE_FIRSTLINE 0x00040000
-
-/* Exec-time and get/set-time error codes */
-
-#define PCRE_ERROR_NOMATCH (-1)
-#define PCRE_ERROR_NULL (-2)
-#define PCRE_ERROR_BADOPTION (-3)
-#define PCRE_ERROR_BADMAGIC (-4)
-#define PCRE_ERROR_UNKNOWN_NODE (-5)
-#define PCRE_ERROR_NOMEMORY (-6)
-#define PCRE_ERROR_NOSUBSTRING (-7)
-#define PCRE_ERROR_MATCHLIMIT (-8)
-#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
-#define PCRE_ERROR_BADUTF8 (-10)
-#define PCRE_ERROR_BADUTF8_OFFSET (-11)
-#define PCRE_ERROR_PARTIAL (-12)
-#define PCRE_ERROR_BADPARTIAL (-13)
-#define PCRE_ERROR_INTERNAL (-14)
-#define PCRE_ERROR_BADCOUNT (-15)
-#define PCRE_ERROR_DFA_UITEM (-16)
-#define PCRE_ERROR_DFA_UCOND (-17)
-#define PCRE_ERROR_DFA_UMLIMIT (-18)
-#define PCRE_ERROR_DFA_WSSIZE (-19)
-#define PCRE_ERROR_DFA_RECURSE (-20)
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS 0
-#define PCRE_INFO_SIZE 1
-#define PCRE_INFO_CAPTURECOUNT 2
-#define PCRE_INFO_BACKREFMAX 3
-#define PCRE_INFO_FIRSTBYTE 4
-#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
-#define PCRE_INFO_FIRSTTABLE 5
-#define PCRE_INFO_LASTLITERAL 6
-#define PCRE_INFO_NAMEENTRYSIZE 7
-#define PCRE_INFO_NAMECOUNT 8
-#define PCRE_INFO_NAMETABLE 9
-#define PCRE_INFO_STUDYSIZE 10
-#define PCRE_INFO_DEFAULT_TABLES 11
-
-/* Request types for pcre_config() */
-
-#define PCRE_CONFIG_UTF8 0
-#define PCRE_CONFIG_NEWLINE 1
-#define PCRE_CONFIG_LINK_SIZE 2
-#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
-#define PCRE_CONFIG_MATCH_LIMIT 4
-#define PCRE_CONFIG_STACKRECURSE 5
-#define PCRE_CONFIG_UNICODE_PROPERTIES 6
-
-/* Bit flags for the pcre_extra structure */
-
-#define PCRE_EXTRA_STUDY_DATA 0x0001
-#define PCRE_EXTRA_MATCH_LIMIT 0x0002
-#define PCRE_EXTRA_CALLOUT_DATA 0x0004
-#define PCRE_EXTRA_TABLES 0x0008
-
-/* Types */
-
-struct real_pcre; /* declaration; the definition is private */
-typedef struct real_pcre pcre;
-
-/* The structure for passing additional data to pcre_exec(). This is defined in
-such as way as to be extensible. Always add new fields at the end, in order to
-remain compatible. */
-
-typedef struct pcre_extra {
- unsigned long int flags; /* Bits for which fields are set */
- void *study_data; /* Opaque data from pcre_study() */
- unsigned long int match_limit; /* Maximum number of calls to match() */
- void *callout_data; /* Data passed back in callouts */
- const unsigned char *tables; /* Pointer to character tables */
-} pcre_extra;
-
-/* The structure for passing out data via the pcre_callout_function. We use a
-structure so that new fields can be added on the end in future versions,
-without changing the API of the function, thereby allowing old clients to work
-without modification. */
-
-typedef struct pcre_callout_block {
- int version; /* Identifies version of block */
- /* ------------------------ Version 0 ------------------------------- */
- int callout_number; /* Number compiled into pattern */
- int *offset_vector; /* The offset vector */
- const char *subject; /* The subject being matched */
- int subject_length; /* The length of the subject */
- int start_match; /* Offset to start of this match attempt */
- int current_position; /* Where we currently are in the subject */
- int capture_top; /* Max current capture */
- int capture_last; /* Most recently closed capture */
- void *callout_data; /* Data passed in with the call */
- /* ------------------- Added for Version 1 -------------------------- */
- int pattern_position; /* Offset to next item in the pattern */
- int next_item_length; /* Length of next item in the pattern */
- /* ------------------------------------------------------------------ */
-} pcre_callout_block;
-
-/* Indirection for store get and free functions. These can be set to
-alternative malloc/free functions if required. Special ones are used in the
-non-recursive case for "frames". There is also an optional callout function
-that is triggered by the (?) regex item. For Virtual Pascal, these definitions
-have to take another form. */
-
-#ifndef VPCOMPAT
-PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
-PCRE_DATA_SCOPE void (*pcre_free)(void *);
-PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
-PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
-PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
-#else /* VPCOMPAT */
-PCRE_DATA_SCOPE void *pcre_malloc(size_t);
-PCRE_DATA_SCOPE void pcre_free(void *);
-PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
-PCRE_DATA_SCOPE void pcre_stack_free(void *);
-PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *);
-#endif /* VPCOMPAT */
-
-/* Exported PCRE functions */
-
-PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
- const unsigned char *);
-PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
- int *, const unsigned char *);
-PCRE_DATA_SCOPE int pcre_config(int, void *);
-PCRE_DATA_SCOPE int pcre_copy_named_substring(const pcre *, const char *,
- int *, int, const char *, char *, int);
-PCRE_DATA_SCOPE int pcre_copy_substring(const char *, int *, int, int, char *,
- int);
-PCRE_DATA_SCOPE int pcre_dfa_exec(const pcre *, const pcre_extra *,
- const char *, int, int, int, int *, int , int *, int);
-PCRE_DATA_SCOPE int pcre_exec(const pcre *, const pcre_extra *, const char *,
- int, int, int, int *, int);
-PCRE_DATA_SCOPE void pcre_free_substring(const char *);
-PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
-PCRE_DATA_SCOPE int pcre_fullinfo(const pcre *, const pcre_extra *, int,
- void *);
-PCRE_DATA_SCOPE int pcre_get_named_substring(const pcre *, const char *,
- int *, int, const char *, const char **);
-PCRE_DATA_SCOPE int pcre_get_stringnumber(const pcre *, const char *);
-PCRE_DATA_SCOPE int pcre_get_substring(const char *, int *, int, int,
- const char **);
-PCRE_DATA_SCOPE int pcre_get_substring_list(const char *, int *, int,
- const char ***);
-PCRE_DATA_SCOPE int pcre_info(const pcre *, int *, int *);
-PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
-PCRE_DATA_SCOPE int pcre_refcount(pcre *, int);
-PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
-PCRE_DATA_SCOPE const char *pcre_version(void);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* In its original form, this is the .in file that is transformed by
+"configure" into pcre.h.
+
+ Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _PCRE_H
+#define _PCRE_H
+
+/* The file pcre.h is build by "configure". Do not edit it; instead
+make changes to pcre.in. */
+
+#define PCRE_MAJOR 6
+#define PCRE_MINOR 3
+#define PCRE_DATE 15-Aug-2005
+
+/* Win32 uses DLL by default; it needs special stuff for exported functions. */
+
+#ifdef _WIN32
+# ifdef PCRE_DEFINITION
+# ifdef DLL_EXPORT
+# define PCRE_DATA_SCOPE __declspec(dllexport)
+# endif
+# else
+# ifndef PCRE_STATIC
+# define PCRE_DATA_SCOPE extern __declspec(dllimport)
+# endif
+# endif
+#endif
+
+/* For other operating systems, we use the standard "extern". */
+
+#ifndef PCRE_DATA_SCOPE
+# ifdef __cplusplus
+# define PCRE_DATA_SCOPE extern "C"
+# else
+# define PCRE_DATA_SCOPE extern
+# endif
+#endif
+
+/* Have to include stdlib.h in order to ensure that size_t is defined;
+it is needed here for malloc. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options */
+
+#define PCRE_CASELESS 0x00000001
+#define PCRE_MULTILINE 0x00000002
+#define PCRE_DOTALL 0x00000004
+#define PCRE_EXTENDED 0x00000008
+#define PCRE_ANCHORED 0x00000010
+#define PCRE_DOLLAR_ENDONLY 0x00000020
+#define PCRE_EXTRA 0x00000040
+#define PCRE_NOTBOL 0x00000080
+#define PCRE_NOTEOL 0x00000100
+#define PCRE_UNGREEDY 0x00000200
+#define PCRE_NOTEMPTY 0x00000400
+#define PCRE_UTF8 0x00000800
+#define PCRE_NO_AUTO_CAPTURE 0x00001000
+#define PCRE_NO_UTF8_CHECK 0x00002000
+#define PCRE_AUTO_CALLOUT 0x00004000
+#define PCRE_PARTIAL 0x00008000
+#define PCRE_DFA_SHORTEST 0x00010000
+#define PCRE_DFA_RESTART 0x00020000
+#define PCRE_FIRSTLINE 0x00040000
+
+/* Exec-time and get/set-time error codes */
+
+#define PCRE_ERROR_NOMATCH (-1)
+#define PCRE_ERROR_NULL (-2)
+#define PCRE_ERROR_BADOPTION (-3)
+#define PCRE_ERROR_BADMAGIC (-4)
+#define PCRE_ERROR_UNKNOWN_NODE (-5)
+#define PCRE_ERROR_NOMEMORY (-6)
+#define PCRE_ERROR_NOSUBSTRING (-7)
+#define PCRE_ERROR_MATCHLIMIT (-8)
+#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
+#define PCRE_ERROR_BADUTF8 (-10)
+#define PCRE_ERROR_BADUTF8_OFFSET (-11)
+#define PCRE_ERROR_PARTIAL (-12)
+#define PCRE_ERROR_BADPARTIAL (-13)
+#define PCRE_ERROR_INTERNAL (-14)
+#define PCRE_ERROR_BADCOUNT (-15)
+#define PCRE_ERROR_DFA_UITEM (-16)
+#define PCRE_ERROR_DFA_UCOND (-17)
+#define PCRE_ERROR_DFA_UMLIMIT (-18)
+#define PCRE_ERROR_DFA_WSSIZE (-19)
+#define PCRE_ERROR_DFA_RECURSE (-20)
+
+/* Request types for pcre_fullinfo() */
+
+#define PCRE_INFO_OPTIONS 0
+#define PCRE_INFO_SIZE 1
+#define PCRE_INFO_CAPTURECOUNT 2
+#define PCRE_INFO_BACKREFMAX 3
+#define PCRE_INFO_FIRSTBYTE 4
+#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
+#define PCRE_INFO_FIRSTTABLE 5
+#define PCRE_INFO_LASTLITERAL 6
+#define PCRE_INFO_NAMEENTRYSIZE 7
+#define PCRE_INFO_NAMECOUNT 8
+#define PCRE_INFO_NAMETABLE 9
+#define PCRE_INFO_STUDYSIZE 10
+#define PCRE_INFO_DEFAULT_TABLES 11
+
+/* Request types for pcre_config() */
+
+#define PCRE_CONFIG_UTF8 0
+#define PCRE_CONFIG_NEWLINE 1
+#define PCRE_CONFIG_LINK_SIZE 2
+#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
+#define PCRE_CONFIG_MATCH_LIMIT 4
+#define PCRE_CONFIG_STACKRECURSE 5
+#define PCRE_CONFIG_UNICODE_PROPERTIES 6
+
+/* Bit flags for the pcre_extra structure */
+
+#define PCRE_EXTRA_STUDY_DATA 0x0001
+#define PCRE_EXTRA_MATCH_LIMIT 0x0002
+#define PCRE_EXTRA_CALLOUT_DATA 0x0004
+#define PCRE_EXTRA_TABLES 0x0008
+
+/* Types */
+
+struct real_pcre; /* declaration; the definition is private */
+typedef struct real_pcre pcre;
+
+/* The structure for passing additional data to pcre_exec(). This is defined in
+such as way as to be extensible. Always add new fields at the end, in order to
+remain compatible. */
+
+typedef struct pcre_extra {
+ unsigned long int flags; /* Bits for which fields are set */
+ void *study_data; /* Opaque data from pcre_study() */
+ unsigned long int match_limit; /* Maximum number of calls to match() */
+ void *callout_data; /* Data passed back in callouts */
+ const unsigned char *tables; /* Pointer to character tables */
+} pcre_extra;
+
+/* The structure for passing out data via the pcre_callout_function. We use a
+structure so that new fields can be added on the end in future versions,
+without changing the API of the function, thereby allowing old clients to work
+without modification. */
+
+typedef struct pcre_callout_block {
+ int version; /* Identifies version of block */
+ /* ------------------------ Version 0 ------------------------------- */
+ int callout_number; /* Number compiled into pattern */
+ int *offset_vector; /* The offset vector */
+ const char *subject; /* The subject being matched */
+ int subject_length; /* The length of the subject */
+ int start_match; /* Offset to start of this match attempt */
+ int current_position; /* Where we currently are in the subject */
+ int capture_top; /* Max current capture */
+ int capture_last; /* Most recently closed capture */
+ void *callout_data; /* Data passed in with the call */
+ /* ------------------- Added for Version 1 -------------------------- */
+ int pattern_position; /* Offset to next item in the pattern */
+ int next_item_length; /* Length of next item in the pattern */
+ /* ------------------------------------------------------------------ */
+} pcre_callout_block;
+
+/* Indirection for store get and free functions. These can be set to
+alternative malloc/free functions if required. Special ones are used in the
+non-recursive case for "frames". There is also an optional callout function
+that is triggered by the (?) regex item. For Virtual Pascal, these definitions
+have to take another form. */
+
+#ifndef VPCOMPAT
+PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_free)(void *);
+PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
+PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
+#else /* VPCOMPAT */
+PCRE_DATA_SCOPE void *pcre_malloc(size_t);
+PCRE_DATA_SCOPE void pcre_free(void *);
+PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
+PCRE_DATA_SCOPE void pcre_stack_free(void *);
+PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *);
+#endif /* VPCOMPAT */
+
+/* Exported PCRE functions */
+
+PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
+ const unsigned char *);
+PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
+ int *, const unsigned char *);
+PCRE_DATA_SCOPE int pcre_config(int, void *);
+PCRE_DATA_SCOPE int pcre_copy_named_substring(const pcre *, const char *,
+ int *, int, const char *, char *, int);
+PCRE_DATA_SCOPE int pcre_copy_substring(const char *, int *, int, int, char *,
+ int);
+PCRE_DATA_SCOPE int pcre_dfa_exec(const pcre *, const pcre_extra *,
+ const char *, int, int, int, int *, int , int *, int);
+PCRE_DATA_SCOPE int pcre_exec(const pcre *, const pcre_extra *, const char *,
+ int, int, int, int *, int);
+PCRE_DATA_SCOPE void pcre_free_substring(const char *);
+PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
+PCRE_DATA_SCOPE int pcre_fullinfo(const pcre *, const pcre_extra *, int,
+ void *);
+PCRE_DATA_SCOPE int pcre_get_named_substring(const pcre *, const char *,
+ int *, int, const char *, const char **);
+PCRE_DATA_SCOPE int pcre_get_stringnumber(const pcre *, const char *);
+PCRE_DATA_SCOPE int pcre_get_substring(const char *, int *, int, int,
+ const char **);
+PCRE_DATA_SCOPE int pcre_get_substring_list(const char *, int *, int,
+ const char ***);
+PCRE_DATA_SCOPE int pcre_info(const pcre *, int *, int *);
+PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
+PCRE_DATA_SCOPE int pcre_refcount(pcre *, int);
+PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
+PCRE_DATA_SCOPE const char *pcre_version(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* End of pcre.h */
diff --git a/src/map/pet.c b/src/map/pet.c
index 836c9fa97..4d153be8d 100644
--- a/src/map/pet.c
+++ b/src/map/pet.c
@@ -1,1400 +1,1400 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/db.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-#include "../common/ers.h"
-
-#include "pc.h"
-#include "status.h"
-#include "map.h"
-#include "intif.h"
-#include "clif.h"
-#include "chrif.h"
-#include "pet.h"
-#include "itemdb.h"
-#include "battle.h"
-#include "mob.h"
-#include "npc.h"
-#include "script.h"
-#include "skill.h"
-#include "unit.h"
-
-#define MIN_PETTHINKTIME 100
-
-struct pet_db pet_db[MAX_PET_DB];
-
-static struct eri *item_drop_ers; //For loot drops delay structures.
-static struct eri *item_drop_list_ers;
-
-int pet_hungry_val(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- if(pd->pet.hungry > 90)
- return 4;
- else if(pd->pet.hungry > 75)
- return 3;
- else if(pd->pet.hungry > 25)
- return 2;
- else if(pd->pet.hungry > 10)
- return 1;
- else
- return 0;
-}
-
-static int pet_calc_pos(struct pet_data *pd,int tx,int ty,int dir)
-{
- int x,y,dx,dy;
- int i,k;
-
- nullpo_retr(0, pd);
-
- pd->ud.to_x = tx;
- pd->ud.to_y = ty;
-
- if(dir < 0 || dir >= 8)
- return 1;
-
- dx = -dirx[dir]*2;
- dy = -diry[dir]*2;
- x = tx + dx;
- y = ty + dy;
- if(!unit_can_reach_pos(&pd->bl,x,y,0)) {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if(!unit_can_reach_pos(&pd->bl,x,y,0)) {
- for(i=0;i<12;i++) {
- k = rand()%8;
- dx = -dirx[k]*2;
- dy = -diry[k]*2;
- x = tx + dx;
- y = ty + dy;
- if(unit_can_reach_pos(&pd->bl,x,y,0))
- break;
- else {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if(unit_can_reach_pos(&pd->bl,x,y,0))
- break;
- }
- }
- if(i>=12) {
- x = tx;
- y = ty;
- if(!unit_can_reach_pos(&pd->bl,x,y,0))
- return 1;
- }
- }
- }
- pd->ud.to_x = x;
- pd->ud.to_y = y;
- return 0;
-}
-
-int pet_create_egg(struct map_session_data *sd, int item_id)
-{
- int pet_id = search_petDB_index(item_id, PET_EGG);
- if (pet_id < 0) return 0; //No pet egg here.
- sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(sd->status.account_id, sd->status.char_id,
- (short)pet_db[pet_id].class_,
- (short)mob_db(pet_db[pet_id].class_)->lv,
- (short)pet_db[pet_id].EggID, 0,
- (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- return 1;
-}
-
-int pet_unlocktarget(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- pd->target_id=0;
- pet_stop_attack(pd);
- pet_stop_walking(pd,1);
- return 0;
-}
-
-/*==========================================
- * Pet Attack Skill [Skotlex]
- *------------------------------------------
- */
-int pet_attackskill(struct pet_data *pd, int target_id)
-{
- struct block_list *bl;
- int inf;
-
- if (!battle_config.pet_status_support || !pd->a_skill ||
- (battle_config.pet_equip_required && !pd->pet.equip))
- return 0;
-
- if (DIFF_TICK(pd->ud.canact_tick, gettick()) > 0)
- return 0;
-
- if (rand()%100 < (pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000))
- { //Skotlex: Use pet's skill
- bl=map_id2bl(target_id);
- if(bl == NULL || pd->bl.m != bl->m || bl->prev == NULL || status_isdead(bl) ||
- !check_distance_bl(&pd->bl, bl, pd->db->range3))
- return 0;
-
- inf = skill_get_inf(pd->a_skill->id);
- if (inf & INF_GROUND_SKILL)
- unit_skilluse_pos(&pd->bl, bl->x, bl->y, pd->a_skill->id, pd->a_skill->lv);
- else //Offensive self skill? Could be stuff like GX.
- unit_skilluse_id(&pd->bl,(inf&INF_SELF_SKILL?pd->bl.id:bl->id), pd->a_skill->id, pd->a_skill->lv);
- return 1; //Skill invoked.
- }
- return 0;
-}
-
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
-{
- struct pet_data *pd;
- int rate;
-
- pd = sd->pd;
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(bl == NULL || bl->type != BL_MOB || bl->prev == NULL ||
- pd->pet.intimate < battle_config.pet_support_min_friendly ||
- pd->pet.hungry < 1 ||
- pd->pet.class_ == status_get_class(bl))
- return 0;
-
- if(pd->bl.m != bl->m ||
- !check_distance_bl(&pd->bl, bl, pd->db->range2))
- return 0;
-
- if (!status_check_skilluse(&pd->bl, bl, 0, 0))
- return 0;
-
- if(!type) {
- rate = pd->petDB->attack_rate;
- rate = rate * pd->rate_fix/1000;
- if(pd->petDB->attack_rate > 0 && rate <= 0)
- rate = 1;
- } else {
- rate = pd->petDB->defence_attack_rate;
- rate = rate * pd->rate_fix/1000;
- if(pd->petDB->defence_attack_rate > 0 && rate <= 0)
- rate = 1;
- }
- if(rand()%10000 < rate)
- {
- if(pd->target_id == 0 || rand()%10000 < pd->petDB->change_target_rate)
- pd->target_id = bl->id;
- }
-
- return 0;
-}
-/*==========================================
- * Pet SC Check [Skotlex]
- *------------------------------------------
- */
-int pet_sc_check(struct map_session_data *sd, int type)
-{
- struct pet_data *pd;
-
- nullpo_retr(0, sd);
- pd = sd->pd;
-
- if (pd == NULL ||
- (battle_config.pet_equip_required && pd->pet.equip == 0) ||
- pd->recovery == NULL ||
- pd->recovery->timer != -1 ||
- pd->recovery->type != type)
- return 1;
-
- pd->recovery->timer = add_timer(gettick()+pd->recovery->delay*1000,pet_recovery_timer,sd->bl.id,0);
-
- return 0;
-}
-
-static int pet_hungry(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- struct pet_data *pd;
- int interval,t;
-
- sd=map_id2sd(id);
- if(!sd)
- return 1;
-
- if(!sd->status.pet_id || !sd->pd)
- return 1;
-
- pd = sd->pd;
- if(pd->pet_hungry_timer != tid){
- if(battle_config.error_log)
- ShowError("pet_hungry_timer %d != %d\n",pd->pet_hungry_timer,tid);
- return 0;
- }
- pd->pet_hungry_timer = -1;
-
- if (pd->pet.intimate <= 0)
- return 1; //You lost the pet already, the rest is irrelevant.
-
- pd->pet.hungry--;
- t = pd->pet.intimate;
- if(pd->pet.hungry < 0) {
- pet_stop_attack(pd);
- pd->pet.hungry = 0;
- pd->pet.intimate -= battle_config.pet_hungry_friendly_decrease;
- if(pd->pet.intimate <= 0) {
- pd->pet.intimate = 0;
- pd->status.speed = pd->db->status.speed;
- }
- status_calc_pet(pd, 0);
- clif_send_petdata(sd,1,pd->pet.intimate);
- }
- clif_send_petdata(sd,2,pd->pet.hungry);
-
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (pd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = pd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- pd->pet_hungry_timer = add_timer(tick+interval,pet_hungry,sd->bl.id,0);
-
- return 0;
-}
-
-int search_petDB_index(int key,int type)
-{
- int i;
-
- for(i=0;i<MAX_PET_DB;i++) {
- if(pet_db[i].class_ <= 0)
- continue;
- switch(type) {
- case PET_CLASS:
- if(pet_db[i].class_ == key)
- return i;
- break;
- case PET_CATCH:
- if(pet_db[i].itemID == key)
- return i;
- break;
- case PET_EGG:
- if(pet_db[i].EggID == key)
- return i;
- break;
- case PET_EQUIP:
- if(pet_db[i].AcceID == key)
- return i;
- break;
- case PET_FOOD:
- if(pet_db[i].FoodID == key)
- return i;
- break;
- default:
- return -1;
- }
- }
- return -1;
-}
-
-int pet_hungry_timer_delete(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
- if(pd->pet_hungry_timer != -1) {
- delete_timer(pd->pet_hungry_timer,pet_hungry);
- pd->pet_hungry_timer = -1;
- }
-
- return 1;
-}
-
-static int pet_performance(struct map_session_data *sd, struct pet_data *pd)
-{
- int val;
-
- if (pd->pet.intimate > 900)
- val = (pd->petDB->s_perfor > 0)? 4:3;
- else if(pd->pet.intimate > 750)
- val = 2;
- else
- val = 1;
-
- pet_stop_walking(pd,2000<<8);
- clif_pet_performance(&pd->bl,rand()%val + 1);
- pet_lootitem_drop(pd,NULL);
- return 1;
-}
-
-static int pet_return_egg(struct map_session_data *sd, struct pet_data *pd)
-{
- struct item tmp_item;
- int flag;
-
- pet_lootitem_drop(pd,sd);
- malloc_set(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = pd->petDB->EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = CARD0_PET;
- tmp_item.card[1] = GetWord(pd->pet.pet_id,0);
- tmp_item.card[2] = GetWord(pd->pet.pet_id,1);
- tmp_item.card[3] = pd->pet.rename_flag;
- if((flag = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- pd->pet.incuvate = 1;
- //No need, pet is saved on unit_free below.
- //intif_save_petdata(sd->status.account_id,&pd->pet);
- if(pd->state.skillbonus) {
- pd->state.skillbonus = 0;
- status_calc_pc(sd,0);
- }
- unit_free(&pd->bl,0);
- sd->status.pet_id = 0;
-
- return 1;
-}
-
-int pet_data_init(struct map_session_data *sd, struct s_pet *pet)
-{
- struct pet_data *pd;
- int i=0,interval=0;
-
- nullpo_retr(1, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.account_id != pet->account_id || sd->status.char_id != pet->char_id) {
- sd->status.pet_id = 0;
- return 1;
- }
- if (sd->status.pet_id != pet->pet_id) {
- if (sd->status.pet_id) {
- //Wrong pet?? Set incuvate to no and send it back for saving.
- pet->incuvate = 1;
- intif_save_petdata(sd->status.account_id,pet);
- sd->status.pet_id = 0;
- return 1;
- }
- //The pet_id value was lost? odd... restore it.
- sd->status.pet_id = pet->pet_id;
- }
-
- i = search_petDB_index(pet->class_,PET_CLASS);
- if(i < 0) {
- sd->status.pet_id = 0;
- return 1;
- }
- sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data));
- pd->petDB = &pet_db[i];
- memcpy(&pd->pet, pet, sizeof(struct s_pet));
- pd->bl.m = sd->bl.m;
- pd->bl.x = sd->bl.x;
- pd->bl.y = sd->bl.y;
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->ud.dir);
- pd->bl.x = pd->ud.to_x;
- pd->bl.y = pd->ud.to_y;
- pd->bl.id = npc_get_new_npc_id();
- pd->db = mob_db(pet->class_);
- pd->bl.subtype = MONS;
- pd->bl.type = BL_PET;
- pd->msd = sd;
- status_set_viewdata(&pd->bl, pet->class_);
- unit_dataset(&pd->bl);
- pd->ud.dir = sd->ud.dir;
- pd->last_thinktime = gettick();
-
- map_addiddb(&pd->bl);
-
- // initialise
- status_calc_pet(pd,1);
-
- pd->state.skillbonus = 0;
- if (battle_config.pet_status_support) //Skotlex
- run_script(pet_db[i].script,0,sd->bl.id,0);
-
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (pd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = pd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- pd->pet_hungry_timer = add_timer(gettick()+interval,pet_hungry,sd->bl.id,0);
- return 0;
-}
-
-int pet_birth_process(struct map_session_data *sd, struct s_pet *pet)
-{
- nullpo_retr(1, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.pet_id && pet->incuvate == 1) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- pet->incuvate = 0;
- pet->account_id = sd->status.account_id;
- pet->char_id = sd->status.char_id;
- sd->status.pet_id = pet->pet_id;
- if(pet_data_init(sd, pet)) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- intif_save_petdata(sd->status.account_id,pet);
- if (save_settings&8)
- chrif_save(sd,0); //is it REALLY Needed to save the char for hatching a pet? [Skotlex]
-
- if(sd->bl.prev != NULL) {
- map_addblock(&sd->pd->bl);
- clif_spawn(&sd->pd->bl);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,battle_config.pet_hair_style);
- clif_pet_equip(sd->pd);
- clif_send_petstatus(sd);
- }
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- return 0;
-}
-
-int pet_recv_petdata(int account_id,struct s_pet *p,int flag)
-{
- struct map_session_data *sd;
-
- sd = map_id2sd(account_id);
- if(sd == NULL)
- return 1;
- if(flag == 1) {
- sd->status.pet_id = 0;
- return 1;
- }
- if(p->incuvate == 1) {
- int i;
- //Delete egg from inventory. [Skotlex]
- for (i = 0; i < MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].card[0] == CARD0_PET &&
- p->pet_id == MakeDWord(sd->status.inventory[i].card[1], sd->status.inventory[i].card[2]))
- break;
- }
- if(i >= MAX_INVENTORY) {
- if (battle_config.error_log)
- ShowError("pet_recv_petdata: Hatching pet (%d:%s) aborted, couldn't find egg in inventory for removal!\n",p->pet_id, p->name);
- sd->status.pet_id = 0;
- return 1;
- }
- if (!pet_birth_process(sd,p)) //Pet hatched. Delete egg.
- pc_delitem(sd,i,1,0);
- } else {
- pet_data_init(sd,p);
- if(sd->pd && sd->bl.prev != NULL) {
- map_addblock(&sd->pd->bl);
- clif_spawn(&sd->pd->bl);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,battle_config.pet_hair_style);
- clif_pet_equip(sd->pd);
- clif_send_petstatus(sd);
- }
- }
-
- return 0;
-}
-
-int pet_select_egg(struct map_session_data *sd,short egg_index)
-{
- nullpo_retr(0, sd);
-
- if(egg_index < 0 || egg_index >= MAX_INVENTORY)
- return 0; //Forged packet!
-
- if(sd->status.inventory[egg_index].card[0] == CARD0_PET)
- intif_request_petdata(sd->status.account_id, sd->status.char_id, MakeDWord(sd->status.inventory[egg_index].card[1], sd->status.inventory[egg_index].card[2]) );
- else {
- if(battle_config.error_log)
- ShowError("wrong egg item inventory %d\n",egg_index);
- }
- return 0;
-}
-
-int pet_catch_process1(struct map_session_data *sd,int target_class)
-{
- nullpo_retr(0, sd);
-
- sd->catch_target_class = target_class;
- clif_catch_process(sd);
-
- return 0;
-}
-
-int pet_catch_process2(struct map_session_data *sd,int target_id)
-{
- struct mob_data *md;
- int i=0,pet_catch_rate=0;
-
- nullpo_retr(1, sd);
-
- md=(struct mob_data*)map_id2bl(target_id);
- if(!md || md->bl.type != BL_MOB || md->bl.prev == NULL){
- //Abort capture.
- sd->catch_target_class = -1;
- sd->itemid = sd->itemindex = -1;
- return 1;
- }
-
- if (sd->menuskill_id != SA_TAMINGMONSTER)
- { //Exploit?
- clif_pet_rulet(sd,0);
- sd->catch_target_class = -1;
- return 1;
- }
-
- if (sd->menuskill_lv > 0)
- { //Consume the pet lure [Skotlex]
- i=pc_search_inventory(sd,sd->menuskill_lv);
- if (i < 0)
- { //they tried an exploit?
- clif_pet_rulet(sd,0);
- sd->catch_target_class = -1;
- return 1;
- }
- //Delete the item
- if (sd->itemid == sd->menuskill_lv)
- sd->itemid = sd->itemindex = -1;
- sd->menuskill_id = sd->menuskill_lv = 0;
- pc_delitem(sd,i,1,0);
- }
-
- i = search_petDB_index(md->class_,PET_CLASS);
- //catch_target_class == 0 is used for universal lures. [Skotlex]
- //for now universal lures do not include bosses.
- if (sd->catch_target_class == 0 && !(md->status.mode&MD_BOSS))
- sd->catch_target_class = md->class_;
- if(i < 0 || sd->catch_target_class != md->class_) {
- clif_emotion(&md->bl, 7); //mob will do /ag if wrong lure is used on them.
- clif_pet_rulet(sd,0);
- sd->catch_target_class = -1;
- return 1;
- }
-
- pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - md->level)*30 + sd->battle_status.luk*20)*(200 - md->status.hp*100/md->status.max_hp)/100;
- if(pet_catch_rate < 1) pet_catch_rate = 1;
- if(battle_config.pet_catch_rate != 100)
- pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100;
-
- if(rand()%10000 < pet_catch_rate) {
- unit_remove_map(&md->bl,0);
- status_kill(&md->bl);
- clif_pet_rulet(sd,1);
-// if(battle_config.etc_log)
-// printf("rulet success %d\n",target_id);
- intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db(pet_db[i].class_)->lv,
- pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname);
- }
- else
- {
- sd->catch_target_class = -1;
- clif_pet_rulet(sd,0);
- }
-
- return 0;
-}
-
-int pet_get_egg(int account_id,int pet_id,int flag)
-{ //This function is invoked when a new pet has been created, and at no other time!
- struct map_session_data *sd;
- struct item tmp_item;
- int i=0,ret=0;
-
- if(flag)
- return 0;
-
- sd = map_id2sd(account_id);
- if(sd == NULL)
- return 0;
-
- i = search_petDB_index(sd->catch_target_class,PET_CLASS);
- sd->catch_target_class = -1;
-
- if(i < 0) {
- intif_delete_petdata(pet_id);
- return 0;
- }
-
- malloc_set(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = pet_db[i].EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = CARD0_PET;
- tmp_item.card[1] = GetWord(pet_id,0);
- tmp_item.card[2] = GetWord(pet_id,1);
- tmp_item.card[3] = 0; //New pets are not named.
- if((ret = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,ret);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
-
- return 1;
-}
-
-static int pet_unequipitem(struct map_session_data *sd, struct pet_data *pd);
-static int pet_food(struct map_session_data *sd, struct pet_data *pd);
-static int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
-
-int pet_menu(struct map_session_data *sd,int menunum)
-{
- nullpo_retr(0, sd);
- if (sd->pd == NULL)
- return 1;
-
- //You lost the pet already.
- if(!sd->status.pet_id || sd->pd->pet.intimate <= 0)
- return 1;
-
- switch(menunum) {
- case 0:
- clif_send_petstatus(sd);
- break;
- case 1:
- pet_food(sd, sd->pd);
- break;
- case 2:
- pet_performance(sd, sd->pd);
- break;
- case 3:
- pet_return_egg(sd, sd->pd);
- break;
- case 4:
- pet_unequipitem(sd, sd->pd);
- break;
- }
- return 0;
-}
-
-int pet_change_name(struct map_session_data *sd,char *name, int flag) //flag 0 = check name, 1 = good name
-{
- int i;
- struct pet_data *pd;
- nullpo_retr(1, sd);
-
- pd = sd->pd;
- if((pd == NULL) || (pd->pet.rename_flag == 1 && !battle_config.pet_rename))
- return 1;
-
- for(i=0;i<NAME_LENGTH && name[i];i++){
- if( !(name[i]&0xe0) || name[i]==0x7f)
- return 1;
- }
-
- if (!flag)
- return intif_rename_pet(sd, name);
-
- pet_stop_walking(pd,1);
-
- memcpy(pd->pet.name, name, NAME_LENGTH-1);
-
- clif_charnameack (0,&pd->bl);
- pd->pet.rename_flag = 1;
- clif_pet_equip(pd);
- clif_send_petstatus(sd);
-
- return 0;
-}
-
-int pet_equipitem(struct map_session_data *sd,int index)
-{
- struct pet_data *pd;
- int nameid;
-
- nullpo_retr(1, sd);
- pd = sd->pd;
- if (!pd) return 1;
-
- nameid = sd->status.inventory[index].nameid;
-
- if(pd->petDB->AcceID == 0 || nameid != pd->petDB->AcceID || pd->pet.equip != 0) {
- clif_equipitemack(sd,0,0,0);
- return 1;
- }
-
- pc_delitem(sd,index,1,0);
- pd->pet.equip = nameid;
- status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
- clif_pet_equip(pd);
- if (battle_config.pet_equip_required)
- { //Skotlex: start support timers if need
- unsigned int tick = gettick();
- if (pd->s_skill && pd->s_skill->timer == -1)
- {
- if (pd->s_skill->id)
- pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000, pet_skill_support_timer, sd->bl.id, 0);
- else
- pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000, pet_heal_timer, sd->bl.id, 0);
- }
- if (pd->bonus && pd->bonus->timer == -1)
- pd->bonus->timer=add_timer(tick+pd->bonus->delay*1000, pet_skill_bonus_timer, sd->bl.id, 0);
- }
-
- return 0;
-}
-
-static int pet_unequipitem(struct map_session_data *sd, struct pet_data *pd)
-{
- struct item tmp_item;
- int nameid,flag;
-
- if(pd->pet.equip == 0)
- return 1;
-
- nameid = pd->pet.equip;
- pd->pet.equip = 0;
- status_set_viewdata(&pd->bl, pd->pet.class_);
- clif_pet_equip(pd);
- malloc_set(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = nameid;
- tmp_item.identify = 1;
- if((flag = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- if (battle_config.pet_equip_required)
- { //Skotlex: halt support timers if needed
- if(pd->state.skillbonus) {
- pd->state.skillbonus = 0;
- status_calc_pc(sd,0);
- }
- if (pd->s_skill && pd->s_skill->timer != -1)
- {
- if (pd->s_skill->id)
- delete_timer(pd->s_skill->timer, pet_skill_support_timer);
- else
- delete_timer(pd->s_skill->timer, pet_heal_timer);
- pd->s_skill->timer = -1;
- }
- if (pd->bonus && pd->bonus->timer != -1)
- {
- delete_timer(pd->bonus->timer, pet_skill_bonus_timer);
- pd->bonus->timer = -1;
- }
- }
-
- return 0;
-}
-
-static int pet_food(struct map_session_data *sd, struct pet_data *pd)
-{
- int i,k;
-
- k=pd->petDB->FoodID;
- i=pc_search_inventory(sd,k);
- if(i < 0) {
- clif_pet_food(sd,k,0);
- return 1;
- }
- pc_delitem(sd,i,1,0);
-
- if(pd->pet.hungry > 90)
- pd->pet.intimate -= pd->petDB->r_full;
- else {
- if(battle_config.pet_friendly_rate != 100)
- k = (pd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
- else
- k = pd->petDB->r_hungry;
- if(pd->pet.hungry > 75) {
- k = k >> 1;
- if(k <= 0)
- k = 1;
- }
- pd->pet.intimate += k;
- }
- if(pd->pet.intimate <= 0) {
- pd->pet.intimate = 0;
- pet_stop_attack(pd);
- pd->status.speed = pd->db->status.speed;
- }
- else if(pd->pet.intimate > 1000)
- pd->pet.intimate = 1000;
- status_calc_pet(pd, 0);
- pd->pet.hungry += pd->petDB->fullness;
- if(pd->pet.hungry > 100)
- pd->pet.hungry = 100;
-
- clif_send_petdata(sd,2,pd->pet.hungry);
- clif_send_petdata(sd,1,pd->pet.intimate);
- clif_pet_food(sd,pd->petDB->FoodID,1);
-
- return 0;
-}
-
-static int pet_randomwalk(struct pet_data *pd,unsigned int tick)
-{
- const int retrycount=20;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(DIFF_TICK(pd->next_walktime,tick) < 0 && unit_can_move(&pd->bl)) {
- int i,x,y,c,d=12-pd->move_fail_count;
- if(d<5) d=5;
- for(i=0;i<retrycount;i++){
- int r=rand();
- x=pd->bl.x+r%(d*2+1)-d;
- y=pd->bl.y+r/(d*2+1)%(d*2+1)-d;
- if(map_getcell(pd->bl.m,x,y,CELL_CHKPASS) && unit_walktoxy(&pd->bl,x,y,0)){
- pd->move_fail_count=0;
- break;
- }
- if(i+1>=retrycount){
- pd->move_fail_count++;
- if(pd->move_fail_count>1000){
- if(battle_config.error_log)
- ShowWarning("PET cant move. hold position %d, class = %d\n",pd->bl.id,pd->pet.class_);
- pd->move_fail_count=0;
- pd->ud.canmove_tick = tick + 60000;
- return 0;
- }
- }
- }
- for(i=c=0;i<pd->ud.walkpath.path_len;i++){
- if(pd->ud.walkpath.path[i]&1)
- c+=pd->status.speed*14/10;
- else
- c+=pd->status.speed;
- }
- pd->next_walktime = tick+rand()%3000+3000+c;
-
- return 1;
- }
- return 0;
-}
-
-static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, unsigned int tick)
-{
- struct block_list *target = NULL;
-
- if(pd->bl.prev == NULL || sd == NULL || sd->bl.prev == NULL)
- return 0;
-
- if(DIFF_TICK(tick,pd->last_thinktime) < MIN_PETTHINKTIME)
- return 0;
- pd->last_thinktime=tick;
-
- if(pd->ud.attacktimer != -1 || pd->ud.skilltimer != -1 || pd->bl.m != sd->bl.m)
- return 0;
-
- if(pd->ud.walktimer != -1 && pd->ud.walkpath.path_pos <= 2)
- return 0; //No thinking when you just started to walk.
-
- if(pd->pet.intimate <= 0) {
- //Pet should just... well, random walk.
- pet_randomwalk(pd,tick);
- return 0;
- }
-
- if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range3)) {
- //Master too far, chase.
- if(pd->target_id)
- pet_unlocktarget(pd);
- if(pd->ud.walktimer != -1 && pd->ud.target == sd->bl.id)
- return 0; //Already walking to him
- if (DIFF_TICK(tick, pd->ud.canmove_tick) < 0)
- return 0; //Can't move yet.
- pd->status.speed = (sd->battle_status.speed>>1);
- if(pd->status.speed <= 0)
- pd->status.speed = 1;
- if (!unit_walktobl(&pd->bl, &sd->bl, 3, 0))
- pet_randomwalk(pd,tick);
- return 0;
- }
-
- //Return speed to normal.
- if (pd->status.speed != pd->petDB->speed) {
- if (pd->ud.walktimer != -1)
- return 0; //Wait until the pet finishes walking back to master.
- pd->status.speed = pd->petDB->speed;
- }
-
- if (pd->target_id) {
- target= map_id2bl(pd->target_id);
- if (!target || pd->bl.m != target->m || status_isdead(target) ||
- !check_distance_bl(&pd->bl, target, pd->db->range3))
- {
- target = NULL;
- pet_unlocktarget(pd);
- }
- }
-
- if(!target && pd->loot && pd->loot->count < pd->loot->max && DIFF_TICK(tick,pd->ud.canact_tick)>0) {
- //Use half the pet's range of sight.
- map_foreachinrange(pet_ai_sub_hard_lootsearch,&pd->bl,
- pd->db->range2/2, BL_ITEM,pd,&target);
- }
-
- if (!target) {
- //Just walk around.
- if (check_distance_bl(&sd->bl, &pd->bl, 3))
- return 0; //Already next to master.
-
- if(pd->ud.walktimer != -1 && check_distance_blxy(&sd->bl, pd->ud.to_x,pd->ud.to_y, 3))
- return 0; //Already walking to him
-
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->ud.dir);
- if(!unit_walktoxy(&pd->bl,pd->ud.to_x,pd->ud.to_y,0))
- pet_randomwalk(pd,tick);
-
- return 0;
- }
-
- if(pd->ud.target == target->id &&
- (pd->ud.attacktimer != -1 || pd->ud.walktimer != -1))
- return 0; //Target already locked.
-
- if (target->type != BL_ITEM)
- { //enemy targetted
- if(!battle_check_range(&pd->bl,target,pd->status.rhw.range))
- { //Chase
- if(!unit_walktobl(&pd->bl, target, pd->status.rhw.range, 2))
- pet_unlocktarget(pd); //Unreachable target.
- return 0;
- }
- //Continuous attack.
- unit_attack(&pd->bl, pd->target_id, 1);
- } else { //Item Targeted, attempt loot
- if (!check_distance_bl(&pd->bl, target, 1))
- { //Out of range
- if(!unit_walktobl(&pd->bl, target, 0, 1)) //Unreachable target.
- pet_unlocktarget(pd);
- return 0;
- } else{
- struct flooritem_data *fitem = (struct flooritem_data *)target;
- if(pd->loot->count < pd->loot->max){
- memcpy(&pd->loot->item[pd->loot->count++],&fitem->item_data,sizeof(pd->loot->item[0]));
- pd->loot->weight += itemdb_search(fitem->item_data.nameid)->weight*fitem->item_data.amount;
- map_clearflooritem(target->id);
- }
- //Target is unlocked regardless of whether it was picked or not.
- pet_unlocktarget(pd);
- }
- }
- return 0;
-}
-
-static int pet_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
-{
- unsigned int tick = va_arg(ap,unsigned int);
- if(sd->status.pet_id && sd->pd)
- pet_ai_sub_hard(sd->pd,sd,tick);
-
- return 0;
-}
-
-static int pet_ai_hard(int tid,unsigned int tick,int id,int data)
-{
- clif_foreachclient(pet_ai_sub_foreachclient,tick);
-
- return 0;
-}
-
-static int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
-{
- struct pet_data* pd;
- struct flooritem_data *fitem = (struct flooritem_data *)bl;
- struct block_list **target;
- int sd_id =0;
-
- pd=va_arg(ap,struct pet_data *);
- target=va_arg(ap,struct block_list**);
-
- sd_id = fitem->first_get_id;
-
- if(sd_id && sd_id != pd->msd->bl.id)
- return 0;
-
- if(unit_can_reach_bl(&pd->bl,bl, pd->db->range2, 1, NULL, NULL) &&
- ((*target) == NULL || //New target closer than previous one.
- !check_distance_bl(&pd->bl, *target, distance_bl(&pd->bl, bl))))
- {
- (*target) = bl;
- pd->target_id = bl->id;
- return 1;
- }
-
- return 0;
-}
-
-static int pet_delay_item_drop(int tid,unsigned int tick,int id,int data)
-{
- struct item_drop_list *list;
- struct item_drop *ditem, *ditem_prev;
- list=(struct item_drop_list *)id;
- ditem = list->item;
- while (ditem) {
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,
- list->m,list->x,list->y,
- list->first_sd,list->second_sd,list->third_sd,0);
- ditem_prev = ditem;
- ditem = ditem->next;
- ers_free(item_drop_ers, ditem_prev);
- }
- ers_free(item_drop_list_ers, list);
- return 0;
-}
-
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
-{
- int i,flag=0;
- struct item_drop_list *dlist;
- struct item_drop *ditem;
- struct item *it;
- if(!pd || !pd->loot || !pd->loot->count)
- return 0;
- dlist = ers_alloc(item_drop_list_ers, struct item_drop_list);
- dlist->m = pd->bl.m;
- dlist->x = pd->bl.x;
- dlist->y = pd->bl.y;
- dlist->first_sd = NULL;
- dlist->second_sd = NULL;
- dlist->third_sd = NULL;
- dlist->item = NULL;
-
- for(i=0;i<pd->loot->count;i++) {
- it = &pd->loot->item[i];
- if(sd){
- if((flag = pc_additem(sd,it,it->amount))){
- clif_additem(sd,0,0,flag);
- ditem = ers_alloc(item_drop_ers, struct item_drop);
- memcpy(&ditem->item_data, it, sizeof(struct item));
- ditem->next = dlist->item;
- dlist->item = ditem;
- }
- }
- else {
- ditem = ers_alloc(item_drop_ers, struct item_drop);
- memcpy(&ditem->item_data, it, sizeof(struct item));
- ditem->next = dlist->item;
- dlist->item = ditem;
- }
- }
- //The smart thing to do is use pd->loot->max (thanks for pointing it out, Shinomori)
- malloc_set(pd->loot->item,0,pd->loot->max * sizeof(struct item));
- pd->loot->count = 0;
- pd->loot->weight = 0;
- pd->ud.canact_tick = gettick()+10000; // 10*1000ms‚ÌŠÔE‚í‚È‚¢
-
- if (dlist->item)
- add_timer(gettick()+540,pet_delay_item_drop,(int)dlist,0);
- else
- ers_free(item_drop_list_ers, dlist);
- return 1;
-}
-
-/*==========================================
- * pet bonus giving skills [Valaris] / Rewritten by [Skotlex]
- *------------------------------------------
- */
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- struct pet_data *pd;
- int bonus;
- int timer = 0;
-
- if(sd == NULL || sd->pd==NULL || sd->pd->bonus == NULL)
- return 1;
-
- pd=sd->pd;
-
- if(pd->bonus->timer != tid) {
- if(battle_config.error_log)
- {
- ShowError("pet_skill_bonus_timer %d != %d\n",pd->bonus->timer,tid);
- pd->bonus->timer = -1;
- }
- return 0;
- }
-
- // determine the time for the next timer
- if (pd->state.skillbonus && pd->bonus->delay > 0) {
- bonus = 0;
- timer = pd->bonus->delay*1000; // the duration until pet bonuses will be reactivated again
- } else if (pd->pet.intimate) {
- bonus = 1;
- timer = pd->bonus->duration*1000; // the duration for pet bonuses to be in effect
- } else { //Lost pet...
- pd->bonus->timer = -1;
- return 0;
- }
-
- if (pd->state.skillbonus != bonus) {
- pd->state.skillbonus = bonus;
- status_calc_pc(sd, 0);
- }
- // wait for the next timer
- pd->bonus->timer=add_timer(tick+timer,pet_skill_bonus_timer,sd->bl.id,0);
- return 0;
-}
-
-/*==========================================
- * pet recovery skills [Valaris] / Rewritten by [Skotlex]
- *------------------------------------------
- */
-int pet_recovery_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->pd == NULL || sd->pd->recovery == NULL)
- return 1;
-
- pd=sd->pd;
-
- if(pd->recovery->timer != tid) {
- if(battle_config.error_log)
- ShowError("pet_recovery_timer %d != %d\n",pd->recovery->timer,tid);
- return 0;
- }
-
- if(sd->sc.count && sd->sc.data[pd->recovery->type].timer != -1)
- { //Display a heal animation?
- //Detoxify is chosen for now.
- clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
- status_change_end(&sd->bl,pd->recovery->type,-1);
- clif_emotion(&pd->bl, 33);
- }
-
- pd->recovery->timer = -1;
-
- return 0;
-}
-
-int pet_heal_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- struct status_data *status;
- struct pet_data *pd;
- short rate = 100;
-
- if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
- return 1;
-
- pd=sd->pd;
-
- if(pd->s_skill->timer != tid) {
- if(battle_config.error_log)
- ShowError("pet_heal_timer %d != %d\n",pd->s_skill->timer,tid);
- return 0;
- }
-
- status = status_get_status_data(&sd->bl);
-
- if(pc_isdead(sd) ||
- (rate = status->sp*100/status->max_sp) > pd->s_skill->sp ||
- (rate = status->hp*100/status->max_hp) > pd->s_skill->hp ||
- (rate = (pd->ud.skilltimer != -1)) //Another skill is in effect
- ) { //Wait (how long? 1 sec for every 10% of remaining)
- pd->s_skill->timer=add_timer(gettick()+(rate>10?rate:10)*100,pet_heal_timer,sd->bl.id,0);
- return 0;
- }
- pet_stop_attack(pd);
- pet_stop_walking(pd,1);
- clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1);
- status_heal(&sd->bl, pd->s_skill->lv,0, 0);
- pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
- return 0;
-}
-
-/*==========================================
- * pet support skills [Skotlex]
- *------------------------------------------
- */
-int pet_skill_support_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- struct pet_data *pd;
- struct status_data *status;
- short rate = 100;
- if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
- return 1;
-
- pd=sd->pd;
-
- if(pd->s_skill->timer != tid) {
- if(battle_config.error_log)
- ShowError("pet_skill_support_timer %d != %d\n",pd->s_skill->timer,tid);
- return 0;
- }
-
- status = status_get_status_data(&sd->bl);
-
- if (DIFF_TICK(pd->ud.canact_tick, tick) > 0)
- { //Wait until the pet can act again.
- pd->s_skill->timer=add_timer(pd->ud.canact_tick,pet_skill_support_timer,sd->bl.id,0);
- return 0;
- }
-
- if(pc_isdead(sd) ||
- (rate = status->sp*100/status->max_sp) > pd->s_skill->sp ||
- (rate = status->hp*100/status->max_hp) > pd->s_skill->hp ||
- (rate = (pd->ud.skilltimer != -1)) //Another skill is in effect
- ) { //Wait (how long? 1 sec for every 10% of remaining)
- pd->s_skill->timer=add_timer(tick+(rate>10?rate:10)*100,pet_skill_support_timer,sd->bl.id,0);
- return 0;
- }
-
- pet_stop_attack(pd);
- pet_stop_walking(pd,1);
-
- if (skill_get_inf(pd->s_skill->id) & INF_GROUND_SKILL)
- unit_skilluse_pos(&pd->bl, sd->bl.x, sd->bl.y, pd->s_skill->id, pd->s_skill->lv);
- else
- unit_skilluse_id(&pd->bl, sd->bl.id, pd->s_skill->id, pd->s_skill->lv);
-
- pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_skill_support_timer,sd->bl.id,0);
- return 0;
-}
-
-/*==========================================
- *ƒyƒbƒgƒf[ƒ^“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-int read_petdb()
-{
- FILE *fp;
- char line[1024];
- int nameid,i,k;
- int j=0;
- int lines;
- char *filename[]={"pet_db.txt","pet_db2.txt"};
- char *str[32],*p,*np;
-
-
-//Remove any previous scripts in case reloaddb was invoked.
- for(j =0; j < MAX_PET_DB; j++)
- if (pet_db[j].script) {
- aFree(pet_db[j].script);
- pet_db[j].script = NULL;
- }
- j = 0;
- malloc_set(pet_db,0,sizeof(pet_db));
- for(i=0;i<2;i++){
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp=fopen(line,"r");
- if(fp==NULL){
- if(i>0)
- continue;
- ShowError("can't read %s\n",line);
- return -1;
- }
- lines = 0;
- while(fgets(line,1020,fp) && j < MAX_PET_DB){
-
- lines++;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- for(k=0,p=line;k<20;k++){
- if((np=strchr(p,','))!=NULL){
- str[k]=p;
- *np=0;
- p=np+1;
- } else {
- str[k]=p;
- p+=strlen(p);
- }
- }
-
- nameid=atoi(str[0]);
- if(nameid<=0)
- continue;
-
- if (!mobdb_checkid(nameid)) {
- ShowWarning("pet_db reading: Invalid mob-class %d, pet not read.\n", nameid);
- continue;
- }
-
- pet_db[j].class_ = nameid;
- memcpy(pet_db[j].name,str[1],NAME_LENGTH-1);
- memcpy(pet_db[j].jname,str[2],NAME_LENGTH-1);
- pet_db[j].itemID=atoi(str[3]);
- pet_db[j].EggID=atoi(str[4]);
- pet_db[j].AcceID=atoi(str[5]);
- pet_db[j].FoodID=atoi(str[6]);
- pet_db[j].fullness=atoi(str[7]);
- pet_db[j].hungry_delay=atoi(str[8])*1000;
- pet_db[j].r_hungry=atoi(str[9]);
- if(pet_db[j].r_hungry <= 0)
- pet_db[j].r_hungry=1;
- pet_db[j].r_full=atoi(str[10]);
- pet_db[j].intimate=atoi(str[11]);
- pet_db[j].die=atoi(str[12]);
- pet_db[j].capture=atoi(str[13]);
- pet_db[j].speed=atoi(str[14]);
- pet_db[j].s_perfor=(char)atoi(str[15]);
- pet_db[j].talk_convert_class=atoi(str[16]);
- pet_db[j].attack_rate=atoi(str[17]);
- pet_db[j].defence_attack_rate=atoi(str[18]);
- pet_db[j].change_target_rate=atoi(str[19]);
- pet_db[j].script = NULL;
- if((np=strchr(p,'{'))==NULL)
- continue;
- pet_db[j].script = parse_script((unsigned char *) np, filename[i], lines);
- j++;
- }
- if (j >= MAX_PET_DB)
- ShowWarning("read_petdb: Reached max number of pets [%d]. Remaining pets were not read.\n ", MAX_PET_DB);
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' pets in '"CL_WHITE"%s"CL_RESET"'.\n",j,filename[i]);
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
- *------------------------------------------
- */
-int do_init_pet(void)
-{
- malloc_set(pet_db,0,sizeof(pet_db));
- read_petdb();
-
- item_drop_ers = ers_new((uint32)sizeof(struct item_drop));
- item_drop_list_ers = ers_new((uint32)sizeof(struct item_drop_list));
-
- add_timer_func_list(pet_hungry,"pet_hungry");
- add_timer_func_list(pet_ai_hard,"pet_ai_hard");
- add_timer_func_list(pet_skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris]
- add_timer_func_list(pet_delay_item_drop,"pet_delay_item_drop");
- add_timer_func_list(pet_skill_support_timer, "pet_skill_support_timer"); // [Skotlex]
- add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
- add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
- add_timer_interval(gettick()+MIN_PETTHINKTIME,pet_ai_hard,0,0,MIN_PETTHINKTIME);
-
- return 0;
-}
-
-int do_final_pet(void) {
- int i;
- for(i = 0;i < MAX_PET_DB; i++) {
- if(pet_db[i].script) {
- script_free_code(pet_db[i].script);
- pet_db[i].script = NULL;
- }
- }
- ers_destroy(item_drop_ers);
- ers_destroy(item_drop_list_ers);
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/db.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+#include "../common/ers.h"
+
+#include "pc.h"
+#include "status.h"
+#include "map.h"
+#include "intif.h"
+#include "clif.h"
+#include "chrif.h"
+#include "pet.h"
+#include "itemdb.h"
+#include "battle.h"
+#include "mob.h"
+#include "npc.h"
+#include "script.h"
+#include "skill.h"
+#include "unit.h"
+
+#define MIN_PETTHINKTIME 100
+
+struct pet_db pet_db[MAX_PET_DB];
+
+static struct eri *item_drop_ers; //For loot drops delay structures.
+static struct eri *item_drop_list_ers;
+
+int pet_hungry_val(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+
+ if(pd->pet.hungry > 90)
+ return 4;
+ else if(pd->pet.hungry > 75)
+ return 3;
+ else if(pd->pet.hungry > 25)
+ return 2;
+ else if(pd->pet.hungry > 10)
+ return 1;
+ else
+ return 0;
+}
+
+static int pet_calc_pos(struct pet_data *pd,int tx,int ty,int dir)
+{
+ int x,y,dx,dy;
+ int i,k;
+
+ nullpo_retr(0, pd);
+
+ pd->ud.to_x = tx;
+ pd->ud.to_y = ty;
+
+ if(dir < 0 || dir >= 8)
+ return 1;
+
+ dx = -dirx[dir]*2;
+ dy = -diry[dir]*2;
+ x = tx + dx;
+ y = ty + dy;
+ if(!unit_can_reach_pos(&pd->bl,x,y,0)) {
+ if(dx > 0) x--;
+ else if(dx < 0) x++;
+ if(dy > 0) y--;
+ else if(dy < 0) y++;
+ if(!unit_can_reach_pos(&pd->bl,x,y,0)) {
+ for(i=0;i<12;i++) {
+ k = rand()%8;
+ dx = -dirx[k]*2;
+ dy = -diry[k]*2;
+ x = tx + dx;
+ y = ty + dy;
+ if(unit_can_reach_pos(&pd->bl,x,y,0))
+ break;
+ else {
+ if(dx > 0) x--;
+ else if(dx < 0) x++;
+ if(dy > 0) y--;
+ else if(dy < 0) y++;
+ if(unit_can_reach_pos(&pd->bl,x,y,0))
+ break;
+ }
+ }
+ if(i>=12) {
+ x = tx;
+ y = ty;
+ if(!unit_can_reach_pos(&pd->bl,x,y,0))
+ return 1;
+ }
+ }
+ }
+ pd->ud.to_x = x;
+ pd->ud.to_y = y;
+ return 0;
+}
+
+int pet_create_egg(struct map_session_data *sd, int item_id)
+{
+ int pet_id = search_petDB_index(item_id, PET_EGG);
+ if (pet_id < 0) return 0; //No pet egg here.
+ sd->catch_target_class = pet_db[pet_id].class_;
+ intif_create_pet(sd->status.account_id, sd->status.char_id,
+ (short)pet_db[pet_id].class_,
+ (short)mob_db(pet_db[pet_id].class_)->lv,
+ (short)pet_db[pet_id].EggID, 0,
+ (short)pet_db[pet_id].intimate,
+ 100, 0, 1, pet_db[pet_id].jname);
+ return 1;
+}
+
+int pet_unlocktarget(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+
+ pd->target_id=0;
+ pet_stop_attack(pd);
+ pet_stop_walking(pd,1);
+ return 0;
+}
+
+/*==========================================
+ * Pet Attack Skill [Skotlex]
+ *------------------------------------------
+ */
+int pet_attackskill(struct pet_data *pd, int target_id)
+{
+ struct block_list *bl;
+ int inf;
+
+ if (!battle_config.pet_status_support || !pd->a_skill ||
+ (battle_config.pet_equip_required && !pd->pet.equip))
+ return 0;
+
+ if (DIFF_TICK(pd->ud.canact_tick, gettick()) > 0)
+ return 0;
+
+ if (rand()%100 < (pd->a_skill->rate +pd->pet.intimate*pd->a_skill->bonusrate/1000))
+ { //Skotlex: Use pet's skill
+ bl=map_id2bl(target_id);
+ if(bl == NULL || pd->bl.m != bl->m || bl->prev == NULL || status_isdead(bl) ||
+ !check_distance_bl(&pd->bl, bl, pd->db->range3))
+ return 0;
+
+ inf = skill_get_inf(pd->a_skill->id);
+ if (inf & INF_GROUND_SKILL)
+ unit_skilluse_pos(&pd->bl, bl->x, bl->y, pd->a_skill->id, pd->a_skill->lv);
+ else //Offensive self skill? Could be stuff like GX.
+ unit_skilluse_id(&pd->bl,(inf&INF_SELF_SKILL?pd->bl.id:bl->id), pd->a_skill->id, pd->a_skill->lv);
+ return 1; //Skill invoked.
+ }
+ return 0;
+}
+
+int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
+{
+ struct pet_data *pd;
+ int rate;
+
+ pd = sd->pd;
+
+ Assert((pd->msd == 0) || (pd->msd->pd == pd));
+
+ if(bl == NULL || bl->type != BL_MOB || bl->prev == NULL ||
+ pd->pet.intimate < battle_config.pet_support_min_friendly ||
+ pd->pet.hungry < 1 ||
+ pd->pet.class_ == status_get_class(bl))
+ return 0;
+
+ if(pd->bl.m != bl->m ||
+ !check_distance_bl(&pd->bl, bl, pd->db->range2))
+ return 0;
+
+ if (!status_check_skilluse(&pd->bl, bl, 0, 0))
+ return 0;
+
+ if(!type) {
+ rate = pd->petDB->attack_rate;
+ rate = rate * pd->rate_fix/1000;
+ if(pd->petDB->attack_rate > 0 && rate <= 0)
+ rate = 1;
+ } else {
+ rate = pd->petDB->defence_attack_rate;
+ rate = rate * pd->rate_fix/1000;
+ if(pd->petDB->defence_attack_rate > 0 && rate <= 0)
+ rate = 1;
+ }
+ if(rand()%10000 < rate)
+ {
+ if(pd->target_id == 0 || rand()%10000 < pd->petDB->change_target_rate)
+ pd->target_id = bl->id;
+ }
+
+ return 0;
+}
+/*==========================================
+ * Pet SC Check [Skotlex]
+ *------------------------------------------
+ */
+int pet_sc_check(struct map_session_data *sd, int type)
+{
+ struct pet_data *pd;
+
+ nullpo_retr(0, sd);
+ pd = sd->pd;
+
+ if (pd == NULL ||
+ (battle_config.pet_equip_required && pd->pet.equip == 0) ||
+ pd->recovery == NULL ||
+ pd->recovery->timer != -1 ||
+ pd->recovery->type != type)
+ return 1;
+
+ pd->recovery->timer = add_timer(gettick()+pd->recovery->delay*1000,pet_recovery_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+static int pet_hungry(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd;
+ struct pet_data *pd;
+ int interval,t;
+
+ sd=map_id2sd(id);
+ if(!sd)
+ return 1;
+
+ if(!sd->status.pet_id || !sd->pd)
+ return 1;
+
+ pd = sd->pd;
+ if(pd->pet_hungry_timer != tid){
+ if(battle_config.error_log)
+ ShowError("pet_hungry_timer %d != %d\n",pd->pet_hungry_timer,tid);
+ return 0;
+ }
+ pd->pet_hungry_timer = -1;
+
+ if (pd->pet.intimate <= 0)
+ return 1; //You lost the pet already, the rest is irrelevant.
+
+ pd->pet.hungry--;
+ t = pd->pet.intimate;
+ if(pd->pet.hungry < 0) {
+ pet_stop_attack(pd);
+ pd->pet.hungry = 0;
+ pd->pet.intimate -= battle_config.pet_hungry_friendly_decrease;
+ if(pd->pet.intimate <= 0) {
+ pd->pet.intimate = 0;
+ pd->status.speed = pd->db->status.speed;
+ }
+ status_calc_pet(pd, 0);
+ clif_send_petdata(sd,1,pd->pet.intimate);
+ }
+ clif_send_petdata(sd,2,pd->pet.hungry);
+
+ if(battle_config.pet_hungry_delay_rate != 100)
+ interval = (pd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
+ else
+ interval = pd->petDB->hungry_delay;
+ if(interval <= 0)
+ interval = 1;
+ pd->pet_hungry_timer = add_timer(tick+interval,pet_hungry,sd->bl.id,0);
+
+ return 0;
+}
+
+int search_petDB_index(int key,int type)
+{
+ int i;
+
+ for(i=0;i<MAX_PET_DB;i++) {
+ if(pet_db[i].class_ <= 0)
+ continue;
+ switch(type) {
+ case PET_CLASS:
+ if(pet_db[i].class_ == key)
+ return i;
+ break;
+ case PET_CATCH:
+ if(pet_db[i].itemID == key)
+ return i;
+ break;
+ case PET_EGG:
+ if(pet_db[i].EggID == key)
+ return i;
+ break;
+ case PET_EQUIP:
+ if(pet_db[i].AcceID == key)
+ return i;
+ break;
+ case PET_FOOD:
+ if(pet_db[i].FoodID == key)
+ return i;
+ break;
+ default:
+ return -1;
+ }
+ }
+ return -1;
+}
+
+int pet_hungry_timer_delete(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+ if(pd->pet_hungry_timer != -1) {
+ delete_timer(pd->pet_hungry_timer,pet_hungry);
+ pd->pet_hungry_timer = -1;
+ }
+
+ return 1;
+}
+
+static int pet_performance(struct map_session_data *sd, struct pet_data *pd)
+{
+ int val;
+
+ if (pd->pet.intimate > 900)
+ val = (pd->petDB->s_perfor > 0)? 4:3;
+ else if(pd->pet.intimate > 750)
+ val = 2;
+ else
+ val = 1;
+
+ pet_stop_walking(pd,2000<<8);
+ clif_pet_performance(&pd->bl,rand()%val + 1);
+ pet_lootitem_drop(pd,NULL);
+ return 1;
+}
+
+static int pet_return_egg(struct map_session_data *sd, struct pet_data *pd)
+{
+ struct item tmp_item;
+ int flag;
+
+ pet_lootitem_drop(pd,sd);
+ malloc_set(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = pd->petDB->EggID;
+ tmp_item.identify = 1;
+ tmp_item.card[0] = CARD0_PET;
+ tmp_item.card[1] = GetWord(pd->pet.pet_id,0);
+ tmp_item.card[2] = GetWord(pd->pet.pet_id,1);
+ tmp_item.card[3] = pd->pet.rename_flag;
+ if((flag = pc_additem(sd,&tmp_item,1))) {
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ pd->pet.incuvate = 1;
+ //No need, pet is saved on unit_free below.
+ //intif_save_petdata(sd->status.account_id,&pd->pet);
+ if(pd->state.skillbonus) {
+ pd->state.skillbonus = 0;
+ status_calc_pc(sd,0);
+ }
+ unit_free(&pd->bl,0);
+ sd->status.pet_id = 0;
+
+ return 1;
+}
+
+int pet_data_init(struct map_session_data *sd, struct s_pet *pet)
+{
+ struct pet_data *pd;
+ int i=0,interval=0;
+
+ nullpo_retr(1, sd);
+
+ Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
+
+ if(sd->status.account_id != pet->account_id || sd->status.char_id != pet->char_id) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ if (sd->status.pet_id != pet->pet_id) {
+ if (sd->status.pet_id) {
+ //Wrong pet?? Set incuvate to no and send it back for saving.
+ pet->incuvate = 1;
+ intif_save_petdata(sd->status.account_id,pet);
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ //The pet_id value was lost? odd... restore it.
+ sd->status.pet_id = pet->pet_id;
+ }
+
+ i = search_petDB_index(pet->class_,PET_CLASS);
+ if(i < 0) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data));
+ pd->petDB = &pet_db[i];
+ memcpy(&pd->pet, pet, sizeof(struct s_pet));
+ pd->bl.m = sd->bl.m;
+ pd->bl.x = sd->bl.x;
+ pd->bl.y = sd->bl.y;
+ pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->ud.dir);
+ pd->bl.x = pd->ud.to_x;
+ pd->bl.y = pd->ud.to_y;
+ pd->bl.id = npc_get_new_npc_id();
+ pd->db = mob_db(pet->class_);
+ pd->bl.subtype = MONS;
+ pd->bl.type = BL_PET;
+ pd->msd = sd;
+ status_set_viewdata(&pd->bl, pet->class_);
+ unit_dataset(&pd->bl);
+ pd->ud.dir = sd->ud.dir;
+ pd->last_thinktime = gettick();
+
+ map_addiddb(&pd->bl);
+
+ // initialise
+ status_calc_pet(pd,1);
+
+ pd->state.skillbonus = 0;
+ if (battle_config.pet_status_support) //Skotlex
+ run_script(pet_db[i].script,0,sd->bl.id,0);
+
+ if(battle_config.pet_hungry_delay_rate != 100)
+ interval = (pd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
+ else
+ interval = pd->petDB->hungry_delay;
+ if(interval <= 0)
+ interval = 1;
+ pd->pet_hungry_timer = add_timer(gettick()+interval,pet_hungry,sd->bl.id,0);
+ return 0;
+}
+
+int pet_birth_process(struct map_session_data *sd, struct s_pet *pet)
+{
+ nullpo_retr(1, sd);
+
+ Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
+
+ if(sd->status.pet_id && pet->incuvate == 1) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+
+ pet->incuvate = 0;
+ pet->account_id = sd->status.account_id;
+ pet->char_id = sd->status.char_id;
+ sd->status.pet_id = pet->pet_id;
+ if(pet_data_init(sd, pet)) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+
+ intif_save_petdata(sd->status.account_id,pet);
+ if (save_settings&8)
+ chrif_save(sd,0); //is it REALLY Needed to save the char for hatching a pet? [Skotlex]
+
+ if(sd->bl.prev != NULL) {
+ map_addblock(&sd->pd->bl);
+ clif_spawn(&sd->pd->bl);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,battle_config.pet_hair_style);
+ clif_pet_equip(sd->pd);
+ clif_send_petstatus(sd);
+ }
+ Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
+
+ return 0;
+}
+
+int pet_recv_petdata(int account_id,struct s_pet *p,int flag)
+{
+ struct map_session_data *sd;
+
+ sd = map_id2sd(account_id);
+ if(sd == NULL)
+ return 1;
+ if(flag == 1) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ if(p->incuvate == 1) {
+ int i;
+ //Delete egg from inventory. [Skotlex]
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if(sd->status.inventory[i].card[0] == CARD0_PET &&
+ p->pet_id == MakeDWord(sd->status.inventory[i].card[1], sd->status.inventory[i].card[2]))
+ break;
+ }
+ if(i >= MAX_INVENTORY) {
+ if (battle_config.error_log)
+ ShowError("pet_recv_petdata: Hatching pet (%d:%s) aborted, couldn't find egg in inventory for removal!\n",p->pet_id, p->name);
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ if (!pet_birth_process(sd,p)) //Pet hatched. Delete egg.
+ pc_delitem(sd,i,1,0);
+ } else {
+ pet_data_init(sd,p);
+ if(sd->pd && sd->bl.prev != NULL) {
+ map_addblock(&sd->pd->bl);
+ clif_spawn(&sd->pd->bl);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,battle_config.pet_hair_style);
+ clif_pet_equip(sd->pd);
+ clif_send_petstatus(sd);
+ }
+ }
+
+ return 0;
+}
+
+int pet_select_egg(struct map_session_data *sd,short egg_index)
+{
+ nullpo_retr(0, sd);
+
+ if(egg_index < 0 || egg_index >= MAX_INVENTORY)
+ return 0; //Forged packet!
+
+ if(sd->status.inventory[egg_index].card[0] == CARD0_PET)
+ intif_request_petdata(sd->status.account_id, sd->status.char_id, MakeDWord(sd->status.inventory[egg_index].card[1], sd->status.inventory[egg_index].card[2]) );
+ else {
+ if(battle_config.error_log)
+ ShowError("wrong egg item inventory %d\n",egg_index);
+ }
+ return 0;
+}
+
+int pet_catch_process1(struct map_session_data *sd,int target_class)
+{
+ nullpo_retr(0, sd);
+
+ sd->catch_target_class = target_class;
+ clif_catch_process(sd);
+
+ return 0;
+}
+
+int pet_catch_process2(struct map_session_data *sd,int target_id)
+{
+ struct mob_data *md;
+ int i=0,pet_catch_rate=0;
+
+ nullpo_retr(1, sd);
+
+ md=(struct mob_data*)map_id2bl(target_id);
+ if(!md || md->bl.type != BL_MOB || md->bl.prev == NULL){
+ //Abort capture.
+ sd->catch_target_class = -1;
+ sd->itemid = sd->itemindex = -1;
+ return 1;
+ }
+
+ if (sd->menuskill_id != SA_TAMINGMONSTER)
+ { //Exploit?
+ clif_pet_rulet(sd,0);
+ sd->catch_target_class = -1;
+ return 1;
+ }
+
+ if (sd->menuskill_lv > 0)
+ { //Consume the pet lure [Skotlex]
+ i=pc_search_inventory(sd,sd->menuskill_lv);
+ if (i < 0)
+ { //they tried an exploit?
+ clif_pet_rulet(sd,0);
+ sd->catch_target_class = -1;
+ return 1;
+ }
+ //Delete the item
+ if (sd->itemid == sd->menuskill_lv)
+ sd->itemid = sd->itemindex = -1;
+ sd->menuskill_id = sd->menuskill_lv = 0;
+ pc_delitem(sd,i,1,0);
+ }
+
+ i = search_petDB_index(md->class_,PET_CLASS);
+ //catch_target_class == 0 is used for universal lures. [Skotlex]
+ //for now universal lures do not include bosses.
+ if (sd->catch_target_class == 0 && !(md->status.mode&MD_BOSS))
+ sd->catch_target_class = md->class_;
+ if(i < 0 || sd->catch_target_class != md->class_) {
+ clif_emotion(&md->bl, 7); //mob will do /ag if wrong lure is used on them.
+ clif_pet_rulet(sd,0);
+ sd->catch_target_class = -1;
+ return 1;
+ }
+
+ pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - md->level)*30 + sd->battle_status.luk*20)*(200 - md->status.hp*100/md->status.max_hp)/100;
+ if(pet_catch_rate < 1) pet_catch_rate = 1;
+ if(battle_config.pet_catch_rate != 100)
+ pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100;
+
+ if(rand()%10000 < pet_catch_rate) {
+ unit_remove_map(&md->bl,0);
+ status_kill(&md->bl);
+ clif_pet_rulet(sd,1);
+// if(battle_config.etc_log)
+// printf("rulet success %d\n",target_id);
+ intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db(pet_db[i].class_)->lv,
+ pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname);
+ }
+ else
+ {
+ sd->catch_target_class = -1;
+ clif_pet_rulet(sd,0);
+ }
+
+ return 0;
+}
+
+int pet_get_egg(int account_id,int pet_id,int flag)
+{ //This function is invoked when a new pet has been created, and at no other time!
+ struct map_session_data *sd;
+ struct item tmp_item;
+ int i=0,ret=0;
+
+ if(flag)
+ return 0;
+
+ sd = map_id2sd(account_id);
+ if(sd == NULL)
+ return 0;
+
+ i = search_petDB_index(sd->catch_target_class,PET_CLASS);
+ sd->catch_target_class = -1;
+
+ if(i < 0) {
+ intif_delete_petdata(pet_id);
+ return 0;
+ }
+
+ malloc_set(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = pet_db[i].EggID;
+ tmp_item.identify = 1;
+ tmp_item.card[0] = CARD0_PET;
+ tmp_item.card[1] = GetWord(pet_id,0);
+ tmp_item.card[2] = GetWord(pet_id,1);
+ tmp_item.card[3] = 0; //New pets are not named.
+ if((ret = pc_additem(sd,&tmp_item,1))) {
+ clif_additem(sd,0,0,ret);
+ map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+
+ return 1;
+}
+
+static int pet_unequipitem(struct map_session_data *sd, struct pet_data *pd);
+static int pet_food(struct map_session_data *sd, struct pet_data *pd);
+static int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
+
+int pet_menu(struct map_session_data *sd,int menunum)
+{
+ nullpo_retr(0, sd);
+ if (sd->pd == NULL)
+ return 1;
+
+ //You lost the pet already.
+ if(!sd->status.pet_id || sd->pd->pet.intimate <= 0)
+ return 1;
+
+ switch(menunum) {
+ case 0:
+ clif_send_petstatus(sd);
+ break;
+ case 1:
+ pet_food(sd, sd->pd);
+ break;
+ case 2:
+ pet_performance(sd, sd->pd);
+ break;
+ case 3:
+ pet_return_egg(sd, sd->pd);
+ break;
+ case 4:
+ pet_unequipitem(sd, sd->pd);
+ break;
+ }
+ return 0;
+}
+
+int pet_change_name(struct map_session_data *sd,char *name, int flag) //flag 0 = check name, 1 = good name
+{
+ int i;
+ struct pet_data *pd;
+ nullpo_retr(1, sd);
+
+ pd = sd->pd;
+ if((pd == NULL) || (pd->pet.rename_flag == 1 && !battle_config.pet_rename))
+ return 1;
+
+ for(i=0;i<NAME_LENGTH && name[i];i++){
+ if( !(name[i]&0xe0) || name[i]==0x7f)
+ return 1;
+ }
+
+ if (!flag)
+ return intif_rename_pet(sd, name);
+
+ pet_stop_walking(pd,1);
+
+ memcpy(pd->pet.name, name, NAME_LENGTH-1);
+
+ clif_charnameack (0,&pd->bl);
+ pd->pet.rename_flag = 1;
+ clif_pet_equip(pd);
+ clif_send_petstatus(sd);
+
+ return 0;
+}
+
+int pet_equipitem(struct map_session_data *sd,int index)
+{
+ struct pet_data *pd;
+ int nameid;
+
+ nullpo_retr(1, sd);
+ pd = sd->pd;
+ if (!pd) return 1;
+
+ nameid = sd->status.inventory[index].nameid;
+
+ if(pd->petDB->AcceID == 0 || nameid != pd->petDB->AcceID || pd->pet.equip != 0) {
+ clif_equipitemack(sd,0,0,0);
+ return 1;
+ }
+
+ pc_delitem(sd,index,1,0);
+ pd->pet.equip = nameid;
+ status_set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
+ clif_pet_equip(pd);
+ if (battle_config.pet_equip_required)
+ { //Skotlex: start support timers if need
+ unsigned int tick = gettick();
+ if (pd->s_skill && pd->s_skill->timer == -1)
+ {
+ if (pd->s_skill->id)
+ pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000, pet_skill_support_timer, sd->bl.id, 0);
+ else
+ pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000, pet_heal_timer, sd->bl.id, 0);
+ }
+ if (pd->bonus && pd->bonus->timer == -1)
+ pd->bonus->timer=add_timer(tick+pd->bonus->delay*1000, pet_skill_bonus_timer, sd->bl.id, 0);
+ }
+
+ return 0;
+}
+
+static int pet_unequipitem(struct map_session_data *sd, struct pet_data *pd)
+{
+ struct item tmp_item;
+ int nameid,flag;
+
+ if(pd->pet.equip == 0)
+ return 1;
+
+ nameid = pd->pet.equip;
+ pd->pet.equip = 0;
+ status_set_viewdata(&pd->bl, pd->pet.class_);
+ clif_pet_equip(pd);
+ malloc_set(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = nameid;
+ tmp_item.identify = 1;
+ if((flag = pc_additem(sd,&tmp_item,1))) {
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ if (battle_config.pet_equip_required)
+ { //Skotlex: halt support timers if needed
+ if(pd->state.skillbonus) {
+ pd->state.skillbonus = 0;
+ status_calc_pc(sd,0);
+ }
+ if (pd->s_skill && pd->s_skill->timer != -1)
+ {
+ if (pd->s_skill->id)
+ delete_timer(pd->s_skill->timer, pet_skill_support_timer);
+ else
+ delete_timer(pd->s_skill->timer, pet_heal_timer);
+ pd->s_skill->timer = -1;
+ }
+ if (pd->bonus && pd->bonus->timer != -1)
+ {
+ delete_timer(pd->bonus->timer, pet_skill_bonus_timer);
+ pd->bonus->timer = -1;
+ }
+ }
+
+ return 0;
+}
+
+static int pet_food(struct map_session_data *sd, struct pet_data *pd)
+{
+ int i,k;
+
+ k=pd->petDB->FoodID;
+ i=pc_search_inventory(sd,k);
+ if(i < 0) {
+ clif_pet_food(sd,k,0);
+ return 1;
+ }
+ pc_delitem(sd,i,1,0);
+
+ if(pd->pet.hungry > 90)
+ pd->pet.intimate -= pd->petDB->r_full;
+ else {
+ if(battle_config.pet_friendly_rate != 100)
+ k = (pd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
+ else
+ k = pd->petDB->r_hungry;
+ if(pd->pet.hungry > 75) {
+ k = k >> 1;
+ if(k <= 0)
+ k = 1;
+ }
+ pd->pet.intimate += k;
+ }
+ if(pd->pet.intimate <= 0) {
+ pd->pet.intimate = 0;
+ pet_stop_attack(pd);
+ pd->status.speed = pd->db->status.speed;
+ }
+ else if(pd->pet.intimate > 1000)
+ pd->pet.intimate = 1000;
+ status_calc_pet(pd, 0);
+ pd->pet.hungry += pd->petDB->fullness;
+ if(pd->pet.hungry > 100)
+ pd->pet.hungry = 100;
+
+ clif_send_petdata(sd,2,pd->pet.hungry);
+ clif_send_petdata(sd,1,pd->pet.intimate);
+ clif_pet_food(sd,pd->petDB->FoodID,1);
+
+ return 0;
+}
+
+static int pet_randomwalk(struct pet_data *pd,unsigned int tick)
+{
+ const int retrycount=20;
+
+ nullpo_retr(0, pd);
+
+ Assert((pd->msd == 0) || (pd->msd->pd == pd));
+
+ if(DIFF_TICK(pd->next_walktime,tick) < 0 && unit_can_move(&pd->bl)) {
+ int i,x,y,c,d=12-pd->move_fail_count;
+ if(d<5) d=5;
+ for(i=0;i<retrycount;i++){
+ int r=rand();
+ x=pd->bl.x+r%(d*2+1)-d;
+ y=pd->bl.y+r/(d*2+1)%(d*2+1)-d;
+ if(map_getcell(pd->bl.m,x,y,CELL_CHKPASS) && unit_walktoxy(&pd->bl,x,y,0)){
+ pd->move_fail_count=0;
+ break;
+ }
+ if(i+1>=retrycount){
+ pd->move_fail_count++;
+ if(pd->move_fail_count>1000){
+ if(battle_config.error_log)
+ ShowWarning("PET cant move. hold position %d, class = %d\n",pd->bl.id,pd->pet.class_);
+ pd->move_fail_count=0;
+ pd->ud.canmove_tick = tick + 60000;
+ return 0;
+ }
+ }
+ }
+ for(i=c=0;i<pd->ud.walkpath.path_len;i++){
+ if(pd->ud.walkpath.path[i]&1)
+ c+=pd->status.speed*14/10;
+ else
+ c+=pd->status.speed;
+ }
+ pd->next_walktime = tick+rand()%3000+3000+c;
+
+ return 1;
+ }
+ return 0;
+}
+
+static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, unsigned int tick)
+{
+ struct block_list *target = NULL;
+
+ if(pd->bl.prev == NULL || sd == NULL || sd->bl.prev == NULL)
+ return 0;
+
+ if(DIFF_TICK(tick,pd->last_thinktime) < MIN_PETTHINKTIME)
+ return 0;
+ pd->last_thinktime=tick;
+
+ if(pd->ud.attacktimer != -1 || pd->ud.skilltimer != -1 || pd->bl.m != sd->bl.m)
+ return 0;
+
+ if(pd->ud.walktimer != -1 && pd->ud.walkpath.path_pos <= 2)
+ return 0; //No thinking when you just started to walk.
+
+ if(pd->pet.intimate <= 0) {
+ //Pet should just... well, random walk.
+ pet_randomwalk(pd,tick);
+ return 0;
+ }
+
+ if (!check_distance_bl(&sd->bl, &pd->bl, pd->db->range3)) {
+ //Master too far, chase.
+ if(pd->target_id)
+ pet_unlocktarget(pd);
+ if(pd->ud.walktimer != -1 && pd->ud.target == sd->bl.id)
+ return 0; //Already walking to him
+ if (DIFF_TICK(tick, pd->ud.canmove_tick) < 0)
+ return 0; //Can't move yet.
+ pd->status.speed = (sd->battle_status.speed>>1);
+ if(pd->status.speed <= 0)
+ pd->status.speed = 1;
+ if (!unit_walktobl(&pd->bl, &sd->bl, 3, 0))
+ pet_randomwalk(pd,tick);
+ return 0;
+ }
+
+ //Return speed to normal.
+ if (pd->status.speed != pd->petDB->speed) {
+ if (pd->ud.walktimer != -1)
+ return 0; //Wait until the pet finishes walking back to master.
+ pd->status.speed = pd->petDB->speed;
+ }
+
+ if (pd->target_id) {
+ target= map_id2bl(pd->target_id);
+ if (!target || pd->bl.m != target->m || status_isdead(target) ||
+ !check_distance_bl(&pd->bl, target, pd->db->range3))
+ {
+ target = NULL;
+ pet_unlocktarget(pd);
+ }
+ }
+
+ if(!target && pd->loot && pd->loot->count < pd->loot->max && DIFF_TICK(tick,pd->ud.canact_tick)>0) {
+ //Use half the pet's range of sight.
+ map_foreachinrange(pet_ai_sub_hard_lootsearch,&pd->bl,
+ pd->db->range2/2, BL_ITEM,pd,&target);
+ }
+
+ if (!target) {
+ //Just walk around.
+ if (check_distance_bl(&sd->bl, &pd->bl, 3))
+ return 0; //Already next to master.
+
+ if(pd->ud.walktimer != -1 && check_distance_blxy(&sd->bl, pd->ud.to_x,pd->ud.to_y, 3))
+ return 0; //Already walking to him
+
+ pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->ud.dir);
+ if(!unit_walktoxy(&pd->bl,pd->ud.to_x,pd->ud.to_y,0))
+ pet_randomwalk(pd,tick);
+
+ return 0;
+ }
+
+ if(pd->ud.target == target->id &&
+ (pd->ud.attacktimer != -1 || pd->ud.walktimer != -1))
+ return 0; //Target already locked.
+
+ if (target->type != BL_ITEM)
+ { //enemy targetted
+ if(!battle_check_range(&pd->bl,target,pd->status.rhw.range))
+ { //Chase
+ if(!unit_walktobl(&pd->bl, target, pd->status.rhw.range, 2))
+ pet_unlocktarget(pd); //Unreachable target.
+ return 0;
+ }
+ //Continuous attack.
+ unit_attack(&pd->bl, pd->target_id, 1);
+ } else { //Item Targeted, attempt loot
+ if (!check_distance_bl(&pd->bl, target, 1))
+ { //Out of range
+ if(!unit_walktobl(&pd->bl, target, 0, 1)) //Unreachable target.
+ pet_unlocktarget(pd);
+ return 0;
+ } else{
+ struct flooritem_data *fitem = (struct flooritem_data *)target;
+ if(pd->loot->count < pd->loot->max){
+ memcpy(&pd->loot->item[pd->loot->count++],&fitem->item_data,sizeof(pd->loot->item[0]));
+ pd->loot->weight += itemdb_search(fitem->item_data.nameid)->weight*fitem->item_data.amount;
+ map_clearflooritem(target->id);
+ }
+ //Target is unlocked regardless of whether it was picked or not.
+ pet_unlocktarget(pd);
+ }
+ }
+ return 0;
+}
+
+static int pet_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
+{
+ unsigned int tick = va_arg(ap,unsigned int);
+ if(sd->status.pet_id && sd->pd)
+ pet_ai_sub_hard(sd->pd,sd,tick);
+
+ return 0;
+}
+
+static int pet_ai_hard(int tid,unsigned int tick,int id,int data)
+{
+ clif_foreachclient(pet_ai_sub_foreachclient,tick);
+
+ return 0;
+}
+
+static int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
+{
+ struct pet_data* pd;
+ struct flooritem_data *fitem = (struct flooritem_data *)bl;
+ struct block_list **target;
+ int sd_id =0;
+
+ pd=va_arg(ap,struct pet_data *);
+ target=va_arg(ap,struct block_list**);
+
+ sd_id = fitem->first_get_id;
+
+ if(sd_id && sd_id != pd->msd->bl.id)
+ return 0;
+
+ if(unit_can_reach_bl(&pd->bl,bl, pd->db->range2, 1, NULL, NULL) &&
+ ((*target) == NULL || //New target closer than previous one.
+ !check_distance_bl(&pd->bl, *target, distance_bl(&pd->bl, bl))))
+ {
+ (*target) = bl;
+ pd->target_id = bl->id;
+ return 1;
+ }
+
+ return 0;
+}
+
+static int pet_delay_item_drop(int tid,unsigned int tick,int id,int data)
+{
+ struct item_drop_list *list;
+ struct item_drop *ditem, *ditem_prev;
+ list=(struct item_drop_list *)id;
+ ditem = list->item;
+ while (ditem) {
+ map_addflooritem(&ditem->item_data,ditem->item_data.amount,
+ list->m,list->x,list->y,
+ list->first_sd,list->second_sd,list->third_sd,0);
+ ditem_prev = ditem;
+ ditem = ditem->next;
+ ers_free(item_drop_ers, ditem_prev);
+ }
+ ers_free(item_drop_list_ers, list);
+ return 0;
+}
+
+int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
+{
+ int i,flag=0;
+ struct item_drop_list *dlist;
+ struct item_drop *ditem;
+ struct item *it;
+ if(!pd || !pd->loot || !pd->loot->count)
+ return 0;
+ dlist = ers_alloc(item_drop_list_ers, struct item_drop_list);
+ dlist->m = pd->bl.m;
+ dlist->x = pd->bl.x;
+ dlist->y = pd->bl.y;
+ dlist->first_sd = NULL;
+ dlist->second_sd = NULL;
+ dlist->third_sd = NULL;
+ dlist->item = NULL;
+
+ for(i=0;i<pd->loot->count;i++) {
+ it = &pd->loot->item[i];
+ if(sd){
+ if((flag = pc_additem(sd,it,it->amount))){
+ clif_additem(sd,0,0,flag);
+ ditem = ers_alloc(item_drop_ers, struct item_drop);
+ memcpy(&ditem->item_data, it, sizeof(struct item));
+ ditem->next = dlist->item;
+ dlist->item = ditem;
+ }
+ }
+ else {
+ ditem = ers_alloc(item_drop_ers, struct item_drop);
+ memcpy(&ditem->item_data, it, sizeof(struct item));
+ ditem->next = dlist->item;
+ dlist->item = ditem;
+ }
+ }
+ //The smart thing to do is use pd->loot->max (thanks for pointing it out, Shinomori)
+ malloc_set(pd->loot->item,0,pd->loot->max * sizeof(struct item));
+ pd->loot->count = 0;
+ pd->loot->weight = 0;
+ pd->ud.canact_tick = gettick()+10000; // 10*1000ms‚ÌŠÔE‚í‚È‚¢
+
+ if (dlist->item)
+ add_timer(gettick()+540,pet_delay_item_drop,(int)dlist,0);
+ else
+ ers_free(item_drop_list_ers, dlist);
+ return 1;
+}
+
+/*==========================================
+ * pet bonus giving skills [Valaris] / Rewritten by [Skotlex]
+ *------------------------------------------
+ */
+int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ struct pet_data *pd;
+ int bonus;
+ int timer = 0;
+
+ if(sd == NULL || sd->pd==NULL || sd->pd->bonus == NULL)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd->bonus->timer != tid) {
+ if(battle_config.error_log)
+ {
+ ShowError("pet_skill_bonus_timer %d != %d\n",pd->bonus->timer,tid);
+ pd->bonus->timer = -1;
+ }
+ return 0;
+ }
+
+ // determine the time for the next timer
+ if (pd->state.skillbonus && pd->bonus->delay > 0) {
+ bonus = 0;
+ timer = pd->bonus->delay*1000; // the duration until pet bonuses will be reactivated again
+ } else if (pd->pet.intimate) {
+ bonus = 1;
+ timer = pd->bonus->duration*1000; // the duration for pet bonuses to be in effect
+ } else { //Lost pet...
+ pd->bonus->timer = -1;
+ return 0;
+ }
+
+ if (pd->state.skillbonus != bonus) {
+ pd->state.skillbonus = bonus;
+ status_calc_pc(sd, 0);
+ }
+ // wait for the next timer
+ pd->bonus->timer=add_timer(tick+timer,pet_skill_bonus_timer,sd->bl.id,0);
+ return 0;
+}
+
+/*==========================================
+ * pet recovery skills [Valaris] / Rewritten by [Skotlex]
+ *------------------------------------------
+ */
+int pet_recovery_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->pd == NULL || sd->pd->recovery == NULL)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd->recovery->timer != tid) {
+ if(battle_config.error_log)
+ ShowError("pet_recovery_timer %d != %d\n",pd->recovery->timer,tid);
+ return 0;
+ }
+
+ if(sd->sc.count && sd->sc.data[pd->recovery->type].timer != -1)
+ { //Display a heal animation?
+ //Detoxify is chosen for now.
+ clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
+ status_change_end(&sd->bl,pd->recovery->type,-1);
+ clif_emotion(&pd->bl, 33);
+ }
+
+ pd->recovery->timer = -1;
+
+ return 0;
+}
+
+int pet_heal_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ struct status_data *status;
+ struct pet_data *pd;
+ short rate = 100;
+
+ if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd->s_skill->timer != tid) {
+ if(battle_config.error_log)
+ ShowError("pet_heal_timer %d != %d\n",pd->s_skill->timer,tid);
+ return 0;
+ }
+
+ status = status_get_status_data(&sd->bl);
+
+ if(pc_isdead(sd) ||
+ (rate = status->sp*100/status->max_sp) > pd->s_skill->sp ||
+ (rate = status->hp*100/status->max_hp) > pd->s_skill->hp ||
+ (rate = (pd->ud.skilltimer != -1)) //Another skill is in effect
+ ) { //Wait (how long? 1 sec for every 10% of remaining)
+ pd->s_skill->timer=add_timer(gettick()+(rate>10?rate:10)*100,pet_heal_timer,sd->bl.id,0);
+ return 0;
+ }
+ pet_stop_attack(pd);
+ pet_stop_walking(pd,1);
+ clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1);
+ status_heal(&sd->bl, pd->s_skill->lv,0, 0);
+ pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
+ return 0;
+}
+
+/*==========================================
+ * pet support skills [Skotlex]
+ *------------------------------------------
+ */
+int pet_skill_support_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ struct pet_data *pd;
+ struct status_data *status;
+ short rate = 100;
+ if(sd==NULL || sd->pd == NULL || sd->pd->s_skill == NULL)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd->s_skill->timer != tid) {
+ if(battle_config.error_log)
+ ShowError("pet_skill_support_timer %d != %d\n",pd->s_skill->timer,tid);
+ return 0;
+ }
+
+ status = status_get_status_data(&sd->bl);
+
+ if (DIFF_TICK(pd->ud.canact_tick, tick) > 0)
+ { //Wait until the pet can act again.
+ pd->s_skill->timer=add_timer(pd->ud.canact_tick,pet_skill_support_timer,sd->bl.id,0);
+ return 0;
+ }
+
+ if(pc_isdead(sd) ||
+ (rate = status->sp*100/status->max_sp) > pd->s_skill->sp ||
+ (rate = status->hp*100/status->max_hp) > pd->s_skill->hp ||
+ (rate = (pd->ud.skilltimer != -1)) //Another skill is in effect
+ ) { //Wait (how long? 1 sec for every 10% of remaining)
+ pd->s_skill->timer=add_timer(tick+(rate>10?rate:10)*100,pet_skill_support_timer,sd->bl.id,0);
+ return 0;
+ }
+
+ pet_stop_attack(pd);
+ pet_stop_walking(pd,1);
+
+ if (skill_get_inf(pd->s_skill->id) & INF_GROUND_SKILL)
+ unit_skilluse_pos(&pd->bl, sd->bl.x, sd->bl.y, pd->s_skill->id, pd->s_skill->lv);
+ else
+ unit_skilluse_id(&pd->bl, sd->bl.id, pd->s_skill->id, pd->s_skill->lv);
+
+ pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_skill_support_timer,sd->bl.id,0);
+ return 0;
+}
+
+/*==========================================
+ *ƒyƒbƒgƒf[ƒ^“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+int read_petdb()
+{
+ FILE *fp;
+ char line[1024];
+ int nameid,i,k;
+ int j=0;
+ int lines;
+ char *filename[]={"pet_db.txt","pet_db2.txt"};
+ char *str[32],*p,*np;
+
+
+//Remove any previous scripts in case reloaddb was invoked.
+ for(j =0; j < MAX_PET_DB; j++)
+ if (pet_db[j].script) {
+ aFree(pet_db[j].script);
+ pet_db[j].script = NULL;
+ }
+ j = 0;
+ malloc_set(pet_db,0,sizeof(pet_db));
+ for(i=0;i<2;i++){
+ sprintf(line, "%s/%s", db_path, filename[i]);
+ fp=fopen(line,"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ ShowError("can't read %s\n",line);
+ return -1;
+ }
+ lines = 0;
+ while(fgets(line,1020,fp) && j < MAX_PET_DB){
+
+ lines++;
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ for(k=0,p=line;k<20;k++){
+ if((np=strchr(p,','))!=NULL){
+ str[k]=p;
+ *np=0;
+ p=np+1;
+ } else {
+ str[k]=p;
+ p+=strlen(p);
+ }
+ }
+
+ nameid=atoi(str[0]);
+ if(nameid<=0)
+ continue;
+
+ if (!mobdb_checkid(nameid)) {
+ ShowWarning("pet_db reading: Invalid mob-class %d, pet not read.\n", nameid);
+ continue;
+ }
+
+ pet_db[j].class_ = nameid;
+ memcpy(pet_db[j].name,str[1],NAME_LENGTH-1);
+ memcpy(pet_db[j].jname,str[2],NAME_LENGTH-1);
+ pet_db[j].itemID=atoi(str[3]);
+ pet_db[j].EggID=atoi(str[4]);
+ pet_db[j].AcceID=atoi(str[5]);
+ pet_db[j].FoodID=atoi(str[6]);
+ pet_db[j].fullness=atoi(str[7]);
+ pet_db[j].hungry_delay=atoi(str[8])*1000;
+ pet_db[j].r_hungry=atoi(str[9]);
+ if(pet_db[j].r_hungry <= 0)
+ pet_db[j].r_hungry=1;
+ pet_db[j].r_full=atoi(str[10]);
+ pet_db[j].intimate=atoi(str[11]);
+ pet_db[j].die=atoi(str[12]);
+ pet_db[j].capture=atoi(str[13]);
+ pet_db[j].speed=atoi(str[14]);
+ pet_db[j].s_perfor=(char)atoi(str[15]);
+ pet_db[j].talk_convert_class=atoi(str[16]);
+ pet_db[j].attack_rate=atoi(str[17]);
+ pet_db[j].defence_attack_rate=atoi(str[18]);
+ pet_db[j].change_target_rate=atoi(str[19]);
+ pet_db[j].script = NULL;
+ if((np=strchr(p,'{'))==NULL)
+ continue;
+ pet_db[j].script = parse_script((unsigned char *) np, filename[i], lines);
+ j++;
+ }
+ if (j >= MAX_PET_DB)
+ ShowWarning("read_petdb: Reached max number of pets [%d]. Remaining pets were not read.\n ", MAX_PET_DB);
+ fclose(fp);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' pets in '"CL_WHITE"%s"CL_RESET"'.\n",j,filename[i]);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
+ *------------------------------------------
+ */
+int do_init_pet(void)
+{
+ malloc_set(pet_db,0,sizeof(pet_db));
+ read_petdb();
+
+ item_drop_ers = ers_new((uint32)sizeof(struct item_drop));
+ item_drop_list_ers = ers_new((uint32)sizeof(struct item_drop_list));
+
+ add_timer_func_list(pet_hungry,"pet_hungry");
+ add_timer_func_list(pet_ai_hard,"pet_ai_hard");
+ add_timer_func_list(pet_skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris]
+ add_timer_func_list(pet_delay_item_drop,"pet_delay_item_drop");
+ add_timer_func_list(pet_skill_support_timer, "pet_skill_support_timer"); // [Skotlex]
+ add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
+ add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
+ add_timer_interval(gettick()+MIN_PETTHINKTIME,pet_ai_hard,0,0,MIN_PETTHINKTIME);
+
+ return 0;
+}
+
+int do_final_pet(void) {
+ int i;
+ for(i = 0;i < MAX_PET_DB; i++) {
+ if(pet_db[i].script) {
+ script_free_code(pet_db[i].script);
+ pet_db[i].script = NULL;
+ }
+ }
+ ers_destroy(item_drop_ers);
+ ers_destroy(item_drop_list_ers);
+ return 0;
+}
diff --git a/src/map/pet.h b/src/map/pet.h
index 89ff3dbab..71c1684e5 100644
--- a/src/map/pet.h
+++ b/src/map/pet.h
@@ -1,68 +1,68 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PET_H_
-#define _PET_H_
-
-#define MAX_PET_DB 300
-#define MAX_PETLOOT_SIZE 30 // [Valaris] - Changed to MAX_PETLOOT_SIZE [Skotlex]
-
-struct pet_db {
- short class_;
- char name[NAME_LENGTH],jname[NAME_LENGTH];
- short itemID;
- short EggID;
- short AcceID;
- short FoodID;
- int fullness;
- int hungry_delay;
- int r_hungry;
- int r_full;
- int intimate;
- int die;
- int capture;
- int speed;
- char s_perfor;
- int talk_convert_class;
- int attack_rate;
- int defence_attack_rate;
- int change_target_rate;
- struct script_code *script;
-};
-extern struct pet_db pet_db[MAX_PET_DB];
-
-enum { PET_CLASS,PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
-
-int pet_create_egg(struct map_session_data *sd, int item_id);
-int pet_hungry_val(struct pet_data *pd);
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type);
-int pet_unlocktarget(struct pet_data *pd);
-int pet_sc_check(struct map_session_data *sd, int type); //Skotlex
-int search_petDB_index(int key,int type);
-int pet_hungry_timer_delete(struct pet_data *pd);
-int pet_data_init(struct map_session_data *sd, struct s_pet *pet);
-int pet_birth_process(struct map_session_data *sd, struct s_pet *pet);
-int pet_recv_petdata(int account_id,struct s_pet *p,int flag);
-int pet_select_egg(struct map_session_data *sd,short egg_index);
-int pet_catch_process1(struct map_session_data *sd,int target_class);
-int pet_catch_process2(struct map_session_data *sd,int target_id);
-int pet_get_egg(int account_id,int pet_id,int flag);
-int pet_menu(struct map_session_data *sd,int menunum);
-int pet_change_name(struct map_session_data *sd,char *name,int flag); //flag 0 = check name, 1 = good name
-int pet_equipitem(struct map_session_data *sd,int index);
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
-int pet_attackskill(struct pet_data *pd, int target_id);
-int pet_skill_support_timer(int tid, unsigned int tick, int id, int data); // [Skotlex]
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_recovery_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_heal_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-
-#define pet_stop_walking(pd, type) { if((pd)->ud.walktimer != -1) unit_stop_walking(&(pd)->bl, type); }
-#define pet_stop_attack(pd) { if((pd)->ud.attacktimer != -1) unit_stop_attack(&(pd)->bl); }
-
-int read_petdb(void);
-int do_init_pet(void);
-int do_final_pet(void);
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _PET_H_
+#define _PET_H_
+
+#define MAX_PET_DB 300
+#define MAX_PETLOOT_SIZE 30 // [Valaris] - Changed to MAX_PETLOOT_SIZE [Skotlex]
+
+struct pet_db {
+ short class_;
+ char name[NAME_LENGTH],jname[NAME_LENGTH];
+ short itemID;
+ short EggID;
+ short AcceID;
+ short FoodID;
+ int fullness;
+ int hungry_delay;
+ int r_hungry;
+ int r_full;
+ int intimate;
+ int die;
+ int capture;
+ int speed;
+ char s_perfor;
+ int talk_convert_class;
+ int attack_rate;
+ int defence_attack_rate;
+ int change_target_rate;
+ struct script_code *script;
+};
+extern struct pet_db pet_db[MAX_PET_DB];
+
+enum { PET_CLASS,PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
+
+int pet_create_egg(struct map_session_data *sd, int item_id);
+int pet_hungry_val(struct pet_data *pd);
+int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type);
+int pet_unlocktarget(struct pet_data *pd);
+int pet_sc_check(struct map_session_data *sd, int type); //Skotlex
+int search_petDB_index(int key,int type);
+int pet_hungry_timer_delete(struct pet_data *pd);
+int pet_data_init(struct map_session_data *sd, struct s_pet *pet);
+int pet_birth_process(struct map_session_data *sd, struct s_pet *pet);
+int pet_recv_petdata(int account_id,struct s_pet *p,int flag);
+int pet_select_egg(struct map_session_data *sd,short egg_index);
+int pet_catch_process1(struct map_session_data *sd,int target_class);
+int pet_catch_process2(struct map_session_data *sd,int target_id);
+int pet_get_egg(int account_id,int pet_id,int flag);
+int pet_menu(struct map_session_data *sd,int menunum);
+int pet_change_name(struct map_session_data *sd,char *name,int flag); //flag 0 = check name, 1 = good name
+int pet_equipitem(struct map_session_data *sd,int index);
+int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
+int pet_attackskill(struct pet_data *pd, int target_id);
+int pet_skill_support_timer(int tid, unsigned int tick, int id, int data); // [Skotlex]
+int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+int pet_recovery_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+int pet_heal_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+
+#define pet_stop_walking(pd, type) { if((pd)->ud.walktimer != -1) unit_stop_walking(&(pd)->bl, type); }
+#define pet_stop_attack(pd) { if((pd)->ud.attacktimer != -1) unit_stop_attack(&(pd)->bl); }
+
+int read_petdb(void);
+int do_init_pet(void);
+int do_final_pet(void);
+
+#endif
+
diff --git a/src/map/script.h b/src/map/script.h
index 9fcd2f739..60fc3e990 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -1,91 +1,91 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _SCRIPT_H_
-#define _SCRIPT_H_
-
-extern int potion_flag; //For use on Alchemist improved potions/Potion Pitcher. [Skotlex]
-extern int potion_hp, potion_per_hp, potion_sp, potion_per_sp;
-extern int potion_target;
-
-extern struct Script_Config {
- unsigned verbose_mode : 1;
- unsigned warn_func_no_comma : 1;
- unsigned warn_cmd_no_comma : 1;
- unsigned warn_func_mismatch_paramnum : 1;
- unsigned warn_cmd_mismatch_paramnum : 1;
- int check_cmdcount;
- int check_gotocount;
-
- unsigned event_script_type : 1;
- unsigned event_requires_trigger : 1;
- char die_event_name[NAME_LENGTH];
- char kill_pc_event_name[NAME_LENGTH];
- char kill_mob_event_name[NAME_LENGTH];
- char login_event_name[NAME_LENGTH];
- char logout_event_name[NAME_LENGTH];
- char loadmap_event_name[NAME_LENGTH];
- char baselvup_event_name[NAME_LENGTH];
- char joblvup_event_name[NAME_LENGTH];
-} script_config;
-
-struct script_data {
- int type;
- union {
- int num;
- char *str;
- } u;
- struct linkdb_node** ref;
-};
-
-// Moved defsp from script_state to script_stack since
-// it must be saved when script state is RERUNLINE. [Eoe / jA 1094]
-struct script_code {
- int script_size;
- unsigned char* script_buf;
- struct linkdb_node* script_vars;
-};
-
-struct script_state {
- struct script_stack {
- int sp,sp_max,defsp;
- struct script_data *stack_data;
- struct linkdb_node **var_function; // ŠÖ”ˆË‘¶•Ï”
- } *stack;
- int start,end;
- int pos,state;
- int rid,oid;
- struct script_code *script, *scriptroot;
- struct sleep_data {
- int tick,timer,charid;
- } sleep;
-};
-
-struct script_code* parse_script(unsigned char *,const char*,int);
-void run_script_sub(struct script_code *rootscript,int pos,int rid,int oid, char* file, int lineno);
-void run_script(struct script_code*,int,int,int);
-
-int set_var(struct map_session_data *sd, char *name, void *val);
-int conv_num(struct script_state *st,struct script_data *data);
-char* conv_str(struct script_state *st,struct script_data *data);
-void setd_sub(struct script_state *st, struct map_session_data *sd, char *varname, int elem, void *value, struct linkdb_node **ref);
-int run_script_timer(int tid, unsigned int tick, int id, int data);
-void run_script_main(struct script_state *st);
-
-struct linkdb_node* script_erase_sleepdb(struct linkdb_node *n);
-void script_free_stack(struct script_stack*);
-void script_free_code(struct script_code* code);
-
-struct dbt* script_get_label_db(void);
-struct dbt* script_get_userfunc_db(void);
-
-int script_config_read(char *cfgName);
-int do_init_script(void);
-int do_final_script(void);
-int add_str(const unsigned char *p);
-int script_reload(void);
-
-extern char mapreg_txt[];
-
-#endif
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _SCRIPT_H_
+#define _SCRIPT_H_
+
+extern int potion_flag; //For use on Alchemist improved potions/Potion Pitcher. [Skotlex]
+extern int potion_hp, potion_per_hp, potion_sp, potion_per_sp;
+extern int potion_target;
+
+extern struct Script_Config {
+ unsigned verbose_mode : 1;
+ unsigned warn_func_no_comma : 1;
+ unsigned warn_cmd_no_comma : 1;
+ unsigned warn_func_mismatch_paramnum : 1;
+ unsigned warn_cmd_mismatch_paramnum : 1;
+ int check_cmdcount;
+ int check_gotocount;
+
+ unsigned event_script_type : 1;
+ unsigned event_requires_trigger : 1;
+ char die_event_name[NAME_LENGTH];
+ char kill_pc_event_name[NAME_LENGTH];
+ char kill_mob_event_name[NAME_LENGTH];
+ char login_event_name[NAME_LENGTH];
+ char logout_event_name[NAME_LENGTH];
+ char loadmap_event_name[NAME_LENGTH];
+ char baselvup_event_name[NAME_LENGTH];
+ char joblvup_event_name[NAME_LENGTH];
+} script_config;
+
+struct script_data {
+ int type;
+ union {
+ int num;
+ char *str;
+ } u;
+ struct linkdb_node** ref;
+};
+
+// Moved defsp from script_state to script_stack since
+// it must be saved when script state is RERUNLINE. [Eoe / jA 1094]
+struct script_code {
+ int script_size;
+ unsigned char* script_buf;
+ struct linkdb_node* script_vars;
+};
+
+struct script_state {
+ struct script_stack {
+ int sp,sp_max,defsp;
+ struct script_data *stack_data;
+ struct linkdb_node **var_function; // ŠÖ”ˆË‘¶•Ï”
+ } *stack;
+ int start,end;
+ int pos,state;
+ int rid,oid;
+ struct script_code *script, *scriptroot;
+ struct sleep_data {
+ int tick,timer,charid;
+ } sleep;
+};
+
+struct script_code* parse_script(unsigned char *,const char*,int);
+void run_script_sub(struct script_code *rootscript,int pos,int rid,int oid, char* file, int lineno);
+void run_script(struct script_code*,int,int,int);
+
+int set_var(struct map_session_data *sd, char *name, void *val);
+int conv_num(struct script_state *st,struct script_data *data);
+char* conv_str(struct script_state *st,struct script_data *data);
+void setd_sub(struct script_state *st, struct map_session_data *sd, char *varname, int elem, void *value, struct linkdb_node **ref);
+int run_script_timer(int tid, unsigned int tick, int id, int data);
+void run_script_main(struct script_state *st);
+
+struct linkdb_node* script_erase_sleepdb(struct linkdb_node *n);
+void script_free_stack(struct script_stack*);
+void script_free_code(struct script_code* code);
+
+struct dbt* script_get_label_db(void);
+struct dbt* script_get_userfunc_db(void);
+
+int script_config_read(char *cfgName);
+int do_init_script(void);
+int do_final_script(void);
+int add_str(const unsigned char *p);
+int script_reload(void);
+
+extern char mapreg_txt[];
+
+#endif
+
diff --git a/src/map/skill.h b/src/map/skill.h
index 952448d74..973648499 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1,958 +1,958 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _SKILL_H_
-#define _SKILL_H_
-
-#include "map.h"
-
-#define MAX_SKILL_DB 1100
-#define MAX_SKILL_PRODUCE_DB 150
-#define MAX_PRODUCE_RESOURCE 12
-#define MAX_SKILL_ARROW_DB 150
-#define MAX_SKILL_ABRA_DB 350
-
-//Constants to identify the skill's inf value:
-#define INF_ATTACK_SKILL 1
-#define INF_GROUND_SKILL 2
-// Skills casted on self where target is automatically chosen:
-#define INF_SELF_SKILL 4
-#define INF_SUPPORT_SKILL 16
-#define INF_TARGET_TRAP 32
-
-//Constants to identify a skill's nk value.
-//The NK value applies only to non INF_GROUND_SKILL skills.
-#define NK_NO_DAMAGE 0x1
-#define NK_SPLASH (0x2|0x4) // 0x4 = splash & split
-#define NK_SPLASHSPLIT 0x4
-//A skill with 3 would be no damage + splash: area of effect.
-//Constants to identify a skill's inf2 value.
-#define INF2_QUEST_SKILL 1
-//NPC skills are those that players can't have in their skill tree.
-#define INF2_NPC_SKILL 2
-#define INF2_WEDDING_SKILL 4
-#define INF2_SPIRIT_SKILL 8
-#define INF2_GUILD_SKILL 16
-#define INF2_SONG_DANCE 32
-#define INF2_ENSEMBLE_SKILL 64
-#define INF2_TRAP 128
-//Refers to ground placed skills that will target the caster as well (like Grandcross)
-#define INF2_TARGET_SELF 256
-#define INF2_NO_TARGET_SELF 512
-#define INF2_PARTY_ONLY 1024
-#define INF2_GUILD_ONLY 2048
-//For Party/Guild only skills that can ALSO be used on enemies.
-#define INF2_ALLOW_ENEMY 4096
-
-//Walk intervals at which chase-skills are attempted to be triggered.
-#define WALK_SKILL_INTERVAL 5
-
-// To be passed to skill_attack, whether the skill damage should disable level or animation. [Skotlex]
-#define SD_LEVEL 0x1000
-#define SD_ANIMATION 0x2000
-
-// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX
-struct skill_db {
- char *name;
- char *desc;
- int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,splash[MAX_SKILL_LEVEL],max;
- int num[MAX_SKILL_LEVEL];
- int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
- int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL];
- int castcancel,cast_def_rate;
- int inf2,maxcount,skill_type;
- int blewcount[MAX_SKILL_LEVEL];
- int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
- int weapon,ammo,ammo_qty[MAX_SKILL_LEVEL],state,spiritball[MAX_SKILL_LEVEL];
- int itemid[10],amount[10];
- int castnodex[MAX_SKILL_LEVEL];
- int delaynoagi[MAX_SKILL_LEVEL];
- int nocast;
- int unit_id[2];
- int unit_layout_type[MAX_SKILL_LEVEL];
- int unit_range[MAX_SKILL_LEVEL];
- int unit_interval;
- int unit_target;
- int unit_flag;
-};
-extern struct skill_db skill_db[MAX_SKILL_DB];
-
-struct skill_name_db {
- int id; // skill id
- char *name; // search strings
- char *desc; // description that shows up for search's
-};
-
-#define MAX_SKILL_UNIT_LAYOUT 50
-#define MAX_SQUARE_LAYOUT 5 // 11*11‚̃†ƒjƒbƒg”z’u‚ªÅ‘å
-#define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
-struct skill_unit_layout {
- int count;
- int dx[MAX_SKILL_UNIT_COUNT];
- int dy[MAX_SKILL_UNIT_COUNT];
-};
-
-enum {
- UF_DEFNOTENEMY = 0x0001, // defnotenemy Ý’è‚ÅBCT_NOENEMY‚ÉØ‚è‘Ö‚¦
- UF_NOREITERATION = 0x0002, // d•¡’u‚«‹ÖŽ~
- UF_NOFOOTSET = 0x0004, // ‘«Œ³’u‚«‹ÖŽ~
- UF_NOOVERLAP = 0x0008, // ƒ†ƒjƒbƒgŒø‰Ê‚ªd•¡‚µ‚È‚¢
- UF_NOPC = 0x0010, //May not target players
- UF_NOMOB = 0x0020, //May not target mobs
- UF_SKILL = 0x0080, //May target skills
- UF_DANCE = 0x0100, //Dance
- UF_ENSEMBLE = 0x0200, //Duet
- UF_SONG = 0x0400, //Song
- UF_DUALMODE = 0x0800, //Spells should trigger both ontimer and onplace/onout/onleft effects.
-};
-
-// ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX
-struct skill_produce_db {
- int nameid, trigger;
- int req_skill,req_skill_lv,itemlv;
- int mat_id[MAX_PRODUCE_RESOURCE],mat_amount[MAX_PRODUCE_RESOURCE];
-};
-extern struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
-
-// –î쬃f?ƒ^ƒx?ƒX
-struct skill_arrow_db {
- int nameid, trigger;
- int cre_id[5],cre_amount[5];
-};
-extern struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
-
-// ƒAƒuƒ‰ƒJƒ_ƒuƒ‰ƒf?ƒ^ƒx?ƒX
-struct skill_abra_db {
- int nameid;
- int req_lv;
- int per;
-};
-extern struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
-
-extern int enchant_eff[5];
-extern int deluge_eff[5];
-
-struct block_list;
-struct map_session_data;
-struct skill_unit;
-struct skill_unit_group;
-
-int do_init_skill(void);
-int do_final_skill(void);
-
-//Returns the cast type of the skill: ground cast, castend damage, castend no damage
-enum { CAST_GROUND, CAST_DAMAGE, CAST_NODAMAGE };
-int skill_get_casttype(int id); //[Skotlex]
-// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX‚ւ̃AƒNƒZƒT
-//
-int skill_get_type( int id );
-int skill_get_hit( int id );
-int skill_get_inf( int id );
-int skill_get_pl( int id );
-int skill_get_nk( int id );
-int skill_get_max( int id );
-int skill_get_range( int id , int lv );
-int skill_get_range2(struct block_list *bl, int id, int lv);
-int skill_get_splash( int id , int lv );
-int skill_get_hp( int id ,int lv );
-int skill_get_mhp( int id ,int lv );
-int skill_get_sp( int id ,int lv );
-int skill_get_state(int id);
-int skill_get_zeny( int id ,int lv );
-int skill_get_num( int id ,int lv );
-int skill_get_cast( int id ,int lv );
-int skill_get_delay( int id ,int lv );
-int skill_get_walkdelay( int id ,int lv );
-int skill_get_time( int id ,int lv );
-int skill_get_time2( int id ,int lv );
-int skill_get_castnodex( int id ,int lv );
-int skill_get_castdef( int id );
-int skill_get_weapontype( int id );
-int skill_get_ammotype( int id );
-int skill_get_ammo_qty( int id, int lv );
-int skill_get_nocast( int id );
-int skill_get_unit_id(int id,int flag);
-int skill_get_inf2( int id );
-int skill_get_castcancel( int id );
-int skill_get_maxcount( int id );
-int skill_get_blewcount( int id ,int lv );
-int skill_get_unit_flag( int id );
-int skill_get_unit_target( int id );
-int skill_tree_get_max( int id, int b_class ); // Celest
-const char* skill_get_name( int id ); // [Skotlex]
-
-int skill_isammotype(TBL_PC *sd, int skill);
-int skill_castend_id( int tid, unsigned int tick, int id,int data );
-int skill_castend_pos( int tid, unsigned int tick, int id,int data );
-int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map);
-
-int skill_cleartimerskill(struct block_list *src);
-int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag);
-
-// ’ljÁ?‰Ê
-int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
-int skill_counter_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
-int skill_blown( struct block_list *src, struct block_list *target,int count);
-int skill_break_equip(struct block_list *bl, unsigned short where, int rate, int flag);
-// ƒ†ƒjƒbƒgƒXƒLƒ‹
-struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
-struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2);
-int skill_delunit(struct skill_unit *unit, int flag);
-struct skill_unit_group *skill_initunitgroup(struct block_list *src,
- int count,int skillid,int skilllv,int unit_id, int limit, int interval);
-int skill_delunitgroup(struct block_list *src, struct skill_unit_group *group, int flag);
-int skill_clear_unitgroup(struct block_list *src);
-int skill_clear_group(struct block_list *bl, int flag);
-
-int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
- int damage,unsigned int tick);
-
-int skill_castfix( struct block_list *bl, int skill_id, int skill_lv);
-int skill_castfix_sc( struct block_list *bl, int time);
-int skill_delayfix( struct block_list *bl, int skill_id, int skill_lv);
-int skill_check_condition( struct map_session_data *sd,int skill, int lv, int type);
-int skill_check_pc_partner(struct map_session_data *sd, int skill_id, int* skill_lv, int range, int cast_flag);
-// -- moonsoul (added skill_check_unit_cell)
-int skill_check_unit_cell(int skillid,int m,int x,int y,int unit_id);
-int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range);
-int skill_unit_move(struct block_list *bl,unsigned int tick,int flag);
-int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy);
-void skill_setmapcell(struct block_list *src, int skill_num, int skill_lv, int flag);
-
-struct skill_unit_group *skill_check_dancing( struct block_list *src );
-void skill_stop_dancing(struct block_list *src);
-
-// Guild skills [celest]
-int skill_guildaura_sub (struct block_list *bl,va_list ap);
-
-// ‰r¥ƒLƒƒƒ“ƒZƒ‹
-int skill_castcancel(struct block_list *bl,int type);
-
-int skill_sit (struct map_session_data *sd, int type);
-void skill_brandishspear_first(struct square *tc,int dir,int x,int y);
-void skill_brandishspear_dir(struct square *tc,int dir,int are);
-void skill_repairweapon(struct map_session_data *sd, int idx);
-void skill_identify(struct map_session_data *sd,int idx);
-void skill_weaponrefine(struct map_session_data *sd,int idx); // [Celest]
-int skill_autospell(struct map_session_data *md,int skillid);
-
-int skill_calc_heal(struct block_list *bl, int skill_lv);
-
-int skill_check_cloaking(struct block_list *bl, struct status_change *sc);
-
-// ƒXƒe?ƒ^ƒXˆÙí
-int skill_enchant_elemental_end(struct block_list *bl, int type);
-int skillnotok(int skillid, struct map_session_data *sd);
-int skillnotok_hom (int skillid, struct homun_data *hd) ; //[orn]
-int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap); //[orn]
-
-// ƒAƒCƒeƒ€ì¬
-int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger, int qty);
-int skill_produce_mix( struct map_session_data *sd,
- int skill_id, int nameid, int slot1, int slot2, int slot3, int qty );
-
-int skill_arrow_create( struct map_session_data *sd,int nameid);
-
-// mobƒXƒLƒ‹‚Ì‚½‚ß
-int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
-int skill_blockpc_start (struct map_session_data*,int,int); // [celest]
-int skill_blockmerc_start (struct homun_data*,int,int); //[orn]
-
-// ƒXƒLƒ‹U?ˆêŠ‡?—
-int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
- struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-
-void skill_reload(void);
-
-enum {
- ST_NONE,ST_HIDING,ST_CLOAKING,ST_HIDDEN,ST_RIDING,ST_FALCON,ST_CART,ST_SHIELD,ST_SIGHT,ST_EXPLOSIONSPIRITS,ST_CARTBOOST,
- ST_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER,
-};
-
-enum {
- NV_BASIC = 1,
-
- SM_SWORD,
- SM_TWOHAND,
- SM_RECOVERY,
- SM_BASH,
- SM_PROVOKE,
- SM_MAGNUM,
- SM_ENDURE,
-
- MG_SRECOVERY,
- MG_SIGHT,
- MG_NAPALMBEAT,
- MG_SAFETYWALL,
- MG_SOULSTRIKE,
- MG_COLDBOLT,
- MG_FROSTDIVER,
- MG_STONECURSE,
- MG_FIREBALL,
- MG_FIREWALL,
- MG_FIREBOLT,
- MG_LIGHTNINGBOLT,
- MG_THUNDERSTORM,
-
- AL_DP,
- AL_DEMONBANE,
- AL_RUWACH,
- AL_PNEUMA,
- AL_TELEPORT,
- AL_WARP,
- AL_HEAL,
- AL_INCAGI,
- AL_DECAGI,
- AL_HOLYWATER,
- AL_CRUCIS,
- AL_ANGELUS,
- AL_BLESSING,
- AL_CURE,
-
- MC_INCCARRY,
- MC_DISCOUNT,
- MC_OVERCHARGE,
- MC_PUSHCART,
- MC_IDENTIFY,
- MC_VENDING,
- MC_MAMMONITE,
-
- AC_OWL,
- AC_VULTURE,
- AC_CONCENTRATION,
- AC_DOUBLE,
- AC_SHOWER,
-
- TF_DOUBLE,
- TF_MISS,
- TF_STEAL,
- TF_HIDING,
- TF_POISON,
- TF_DETOXIFY,
-
- ALL_RESURRECTION,
-
- KN_SPEARMASTERY,
- KN_PIERCE,
- KN_BRANDISHSPEAR,
- KN_SPEARSTAB,
- KN_SPEARBOOMERANG,
- KN_TWOHANDQUICKEN,
- KN_AUTOCOUNTER,
- KN_BOWLINGBASH,
- KN_RIDING,
- KN_CAVALIERMASTERY,
-
- PR_MACEMASTERY,
- PR_IMPOSITIO,
- PR_SUFFRAGIUM,
- PR_ASPERSIO,
- PR_BENEDICTIO,
- PR_SANCTUARY,
- PR_SLOWPOISON,
- PR_STRECOVERY,
- PR_KYRIE,
- PR_MAGNIFICAT,
- PR_GLORIA,
- PR_LEXDIVINA,
- PR_TURNUNDEAD,
- PR_LEXAETERNA,
- PR_MAGNUS,
-
- WZ_FIREPILLAR,
- WZ_SIGHTRASHER,
- WZ_FIREIVY,
- WZ_METEOR,
- WZ_JUPITEL,
- WZ_VERMILION,
- WZ_WATERBALL,
- WZ_ICEWALL,
- WZ_FROSTNOVA,
- WZ_STORMGUST,
- WZ_EARTHSPIKE,
- WZ_HEAVENDRIVE,
- WZ_QUAGMIRE,
- WZ_ESTIMATION,
-
- BS_IRON,
- BS_STEEL,
- BS_ENCHANTEDSTONE,
- BS_ORIDEOCON,
- BS_DAGGER,
- BS_SWORD,
- BS_TWOHANDSWORD,
- BS_AXE,
- BS_MACE,
- BS_KNUCKLE,
- BS_SPEAR,
- BS_HILTBINDING,
- BS_FINDINGORE,
- BS_WEAPONRESEARCH,
- BS_REPAIRWEAPON,
- BS_SKINTEMPER,
- BS_HAMMERFALL,
- BS_ADRENALINE,
- BS_WEAPONPERFECT,
- BS_OVERTHRUST,
- BS_MAXIMIZE,
-
- HT_SKIDTRAP,
- HT_LANDMINE,
- HT_ANKLESNARE,
- HT_SHOCKWAVE,
- HT_SANDMAN,
- HT_FLASHER,
- HT_FREEZINGTRAP,
- HT_BLASTMINE,
- HT_CLAYMORETRAP,
- HT_REMOVETRAP,
- HT_TALKIEBOX,
- HT_BEASTBANE,
- HT_FALCON,
- HT_STEELCROW,
- HT_BLITZBEAT,
- HT_DETECTING,
- HT_SPRINGTRAP,
-
- AS_RIGHT,
- AS_LEFT,
- AS_KATAR,
- AS_CLOAKING,
- AS_SONICBLOW,
- AS_GRIMTOOTH,
- AS_ENCHANTPOISON,
- AS_POISONREACT,
- AS_VENOMDUST,
- AS_SPLASHER,
-
- NV_FIRSTAID,
- NV_TRICKDEAD,
- SM_MOVINGRECOVERY,
- SM_FATALBLOW,
- SM_AUTOBERSERK,
- AC_MAKINGARROW,
- AC_CHARGEARROW,
- TF_SPRINKLESAND,
- TF_BACKSLIDING,
- TF_PICKSTONE,
- TF_THROWSTONE,
- MC_CARTREVOLUTION,
- MC_CHANGECART,
- MC_LOUD,
- AL_HOLYLIGHT,
- MG_ENERGYCOAT,
-
- NPC_PIERCINGATT,
- NPC_MENTALBREAKER,
- NPC_RANGEATTACK,
- NPC_ATTRICHANGE,
- NPC_CHANGEWATER,
- NPC_CHANGEGROUND,
- NPC_CHANGEFIRE,
- NPC_CHANGEWIND,
- NPC_CHANGEPOISON,
- NPC_CHANGEHOLY,
- NPC_CHANGEDARKNESS,
- NPC_CHANGETELEKINESIS,
- NPC_CRITICALSLASH,
- NPC_COMBOATTACK,
- NPC_GUIDEDATTACK,
- NPC_SELFDESTRUCTION,
- NPC_SPLASHATTACK,
- NPC_SUICIDE,
- NPC_POISON,
- NPC_BLINDATTACK,
- NPC_SILENCEATTACK,
- NPC_STUNATTACK,
- NPC_PETRIFYATTACK,
- NPC_CURSEATTACK,
- NPC_SLEEPATTACK,
- NPC_RANDOMATTACK,
- NPC_WATERATTACK,
- NPC_GROUNDATTACK,
- NPC_FIREATTACK,
- NPC_WINDATTACK,
- NPC_POISONATTACK,
- NPC_HOLYATTACK,
- NPC_DARKNESSATTACK,
- NPC_TELEKINESISATTACK,
- NPC_MAGICALATTACK,
- NPC_METAMORPHOSIS,
- NPC_PROVOCATION,
- NPC_SMOKING,
- NPC_SUMMONSLAVE,
- NPC_EMOTION,
- NPC_TRANSFORMATION,
- NPC_BLOODDRAIN,
- NPC_ENERGYDRAIN,
- NPC_KEEPING,
- NPC_DARKBREATH,
- NPC_DARKBLESSING,
- NPC_BARRIER,
- NPC_DEFENDER,
- NPC_LICK,
- NPC_HALLUCINATION,
- NPC_REBIRTH,
- NPC_SUMMONMONSTER,
-
- RG_SNATCHER,
- RG_STEALCOIN,
- RG_BACKSTAP,
- RG_TUNNELDRIVE,
- RG_RAID,
- RG_STRIPWEAPON,
- RG_STRIPSHIELD,
- RG_STRIPARMOR,
- RG_STRIPHELM,
- RG_INTIMIDATE,
- RG_GRAFFITI,
- RG_FLAGGRAFFITI,
- RG_CLEANER,
- RG_GANGSTER,
- RG_COMPULSION,
- RG_PLAGIARISM,
-
- AM_AXEMASTERY,
- AM_LEARNINGPOTION,
- AM_PHARMACY,
- AM_DEMONSTRATION,
- AM_ACIDTERROR,
- AM_POTIONPITCHER,
- AM_CANNIBALIZE,
- AM_SPHEREMINE,
- AM_CP_WEAPON,
- AM_CP_SHIELD,
- AM_CP_ARMOR,
- AM_CP_HELM,
- AM_BIOETHICS,
- AM_BIOTECHNOLOGY,
- AM_CREATECREATURE,
- AM_CULTIVATION,
- AM_FLAMECONTROL,
- AM_CALLHOMUN,
- AM_REST,
- AM_DRILLMASTER,
- AM_HEALHOMUN,
- AM_RESURRECTHOMUN,
-
- CR_TRUST,
- CR_AUTOGUARD,
- CR_SHIELDCHARGE,
- CR_SHIELDBOOMERANG,
- CR_REFLECTSHIELD,
- CR_HOLYCROSS,
- CR_GRANDCROSS,
- CR_DEVOTION,
- CR_PROVIDENCE,
- CR_DEFENDER,
- CR_SPEARQUICKEN,
-
- MO_IRONHAND,
- MO_SPIRITSRECOVERY,
- MO_CALLSPIRITS,
- MO_ABSORBSPIRITS,
- MO_TRIPLEATTACK,
- MO_BODYRELOCATION,
- MO_DODGE,
- MO_INVESTIGATE,
- MO_FINGEROFFENSIVE,
- MO_STEELBODY,
- MO_BLADESTOP,
- MO_EXPLOSIONSPIRITS,
- MO_EXTREMITYFIST,
- MO_CHAINCOMBO,
- MO_COMBOFINISH,
-
- SA_ADVANCEDBOOK,
- SA_CASTCANCEL,
- SA_MAGICROD,
- SA_SPELLBREAKER,
- SA_FREECAST,
- SA_AUTOSPELL,
- SA_FLAMELAUNCHER,
- SA_FROSTWEAPON,
- SA_LIGHTNINGLOADER,
- SA_SEISMICWEAPON,
- SA_DRAGONOLOGY,
- SA_VOLCANO,
- SA_DELUGE,
- SA_VIOLENTGALE,
- SA_LANDPROTECTOR,
- SA_DISPELL,
- SA_ABRACADABRA,
- SA_MONOCELL,
- SA_CLASSCHANGE,
- SA_SUMMONMONSTER,
- SA_REVERSEORCISH,
- SA_DEATH,
- SA_FORTUNE,
- SA_TAMINGMONSTER,
- SA_QUESTION,
- SA_GRAVITY,
- SA_LEVELUP,
- SA_INSTANTDEATH,
- SA_FULLRECOVERY,
- SA_COMA,
-
- BD_ADAPTATION,
- BD_ENCORE,
- BD_LULLABY,
- BD_RICHMANKIM,
- BD_ETERNALCHAOS,
- BD_DRUMBATTLEFIELD,
- BD_RINGNIBELUNGEN,
- BD_ROKISWEIL,
- BD_INTOABYSS,
- BD_SIEGFRIED,
- BD_RAGNAROK,
-
- BA_MUSICALLESSON,
- BA_MUSICALSTRIKE,
- BA_DISSONANCE,
- BA_FROSTJOKE,
- BA_WHISTLE,
- BA_ASSASSINCROSS,
- BA_POEMBRAGI,
- BA_APPLEIDUN,
-
- DC_DANCINGLESSON,
- DC_THROWARROW,
- DC_UGLYDANCE,
- DC_SCREAM,
- DC_HUMMING,
- DC_DONTFORGETME,
- DC_FORTUNEKISS,
- DC_SERVICEFORYOU,
-
- NPC_RANDOMMOVE,
- NPC_SPEEDUP,
- NPC_REVENGE,
-
- WE_MALE,
- WE_FEMALE,
- WE_CALLPARTNER,
-
- ITM_TOMAHAWK,
-
- NPC_DARKCROSS,
- NPC_GRANDDARKNESS,
- NPC_DARKSTRIKE,
- NPC_DARKTHUNDER,
- NPC_STOP,
- NPC_BREAKWEAPON,
- NPC_BREAKARMOR,
- NPC_BREAKHELM,
- NPC_BREAKSHIELD,
- NPC_UNDEADATTACK,
- NPC_CHANGEUNDEAD,
- NPC_POWERUP,
- NPC_AGIUP,
- NPC_SIEGEMODE,
- NPC_CALLSLAVE,
- NPC_INVISIBLE,
- NPC_RUN,
-
- LK_AURABLADE,
- LK_PARRYING,
- LK_CONCENTRATION,
- LK_TENSIONRELAX,
- LK_BERSERK,
- LK_FURY,
- HP_ASSUMPTIO,
- HP_BASILICA,
- HP_MEDITATIO,
- HW_SOULDRAIN,
- HW_MAGICCRASHER,
- HW_MAGICPOWER,
- PA_PRESSURE,
- PA_SACRIFICE,
- PA_GOSPEL,
- CH_PALMSTRIKE,
- CH_TIGERFIST,
- CH_CHAINCRUSH,
- PF_HPCONVERSION,
- PF_SOULCHANGE,
- PF_SOULBURN,
- ASC_KATAR,
- ASC_HALLUCINATION,
- ASC_EDP,
- ASC_BREAKER,
- SN_SIGHT,
- SN_FALCONASSAULT,
- SN_SHARPSHOOTING,
- SN_WINDWALK,
- WS_MELTDOWN,
- WS_CREATECOIN,
- WS_CREATENUGGET,
- WS_CARTBOOST,
- WS_SYSTEMCREATE,
- ST_CHASEWALK,
- ST_REJECTSWORD,
- ST_STEALBACKPACK,
- CR_ALCHEMY,
- CR_SYNTHESISPOTION,
- CG_ARROWVULCAN,
- CG_MOONLIT,
- CG_MARIONETTE,
- LK_SPIRALPIERCE,
- LK_HEADCRUSH,
- LK_JOINTBEAT,
- HW_NAPALMVULCAN,
- CH_SOULCOLLECT,
- PF_MINDBREAKER,
- PF_MEMORIZE,
- PF_FOGWALL,
- PF_SPIDERWEB,
- ASC_METEORASSAULT,
- ASC_CDP,
- WE_BABY,
- WE_CALLPARENT,
- WE_CALLBABY,
-
- TK_RUN,
- TK_READYSTORM,
- TK_STORMKICK,
- TK_READYDOWN,
- TK_DOWNKICK,
- TK_READYTURN,
- TK_TURNKICK,
- TK_READYCOUNTER,
- TK_COUNTER,
- TK_DODGE,
- TK_JUMPKICK,
- TK_HPTIME,
- TK_SPTIME,
- TK_POWER,
- TK_SEVENWIND,
- TK_HIGHJUMP,
- SG_FEEL,
- SG_SUN_WARM,
- SG_MOON_WARM,
- SG_STAR_WARM,
- SG_SUN_COMFORT,
- SG_MOON_COMFORT,
- SG_STAR_COMFORT,
- SG_HATE,
- SG_SUN_ANGER,
- SG_MOON_ANGER,
- SG_STAR_ANGER,
- SG_SUN_BLESS,
- SG_MOON_BLESS,
- SG_STAR_BLESS,
- SG_DEVIL,
- SG_FRIEND,
- SG_KNOWLEDGE,
- SG_FUSION,
- SL_ALCHEMIST,
- AM_BERSERKPITCHER,
- SL_MONK,
- SL_STAR,
- SL_SAGE,
- SL_CRUSADER,
- SL_SUPERNOVICE,
- SL_KNIGHT,
- SL_WIZARD,
- SL_PRIEST,
- SL_BARDDANCER,
- SL_ROGUE,
- SL_ASSASIN,
- SL_BLACKSMITH,
- BS_ADRENALINE2,
- SL_HUNTER,
- SL_SOULLINKER,
- SL_KAIZEL,
- SL_KAAHI,
- SL_KAUPE,
- SL_KAITE,
- SL_KAINA,
- SL_STIN,
- SL_STUN,
- SL_SMA,
- SL_SWOO,
- SL_SKE,
- SL_SKA,
-
- SM_SELFPROVOKE,
- NPC_EMOTION_ON,
- ST_PRESERVE,
- ST_FULLSTRIP,
- WS_WEAPONREFINE,
- CR_SLIMPITCHER,
- CR_FULLPROTECTION,
- PA_SHIELDCHAIN,
- HP_MANARECHARGE,
- PF_DOUBLECASTING,
- HW_GANBANTEIN,
- HW_GRAVITATION,
- WS_CARTTERMINATION,
- WS_OVERTHRUSTMAX,
- CG_LONGINGFREEDOM,
- CG_HERMODE,
- CG_TAROTCARD,
- CR_ACIDDEMONSTRATION,
- CR_CULTIVATION,
- //492,missing?
- TK_MISSION = 493,
- SL_HIGH,
- KN_ONEHAND,
- AM_TWILIGHT1,
- AM_TWILIGHT2,
- AM_TWILIGHT3,
- HT_POWER,
- GS_GLITTERING,
- GS_FLING,
- GS_TRIPLEACTION,
- GS_BULLSEYE,
- GS_MADNESSCANCEL,
- GS_ADJUSTMENT,
- GS_INCREASING,
- GS_MAGICALBULLET,
- GS_CRACKER,
- GS_SINGLEACTION,
- GS_SNAKEEYE,
- GS_CHAINACTION,
- GS_TRACKING,
- GS_DISARM,
- GS_PIERCINGSHOT,
- GS_RAPIDSHOWER,
- GS_DESPERADO,
- GS_GATLINGFEVER,
- GS_DUST,
- GS_FULLBUSTER,
- GS_SPREADATTACK,
- GS_GROUNDDRIFT,
- NJ_TOBIDOUGU,
- NJ_SYURIKEN,
- NJ_KUNAI,
- NJ_HUUMA,
- NJ_ZENYNAGE,
- NJ_TATAMIGAESHI,
- NJ_KASUMIKIRI,
- NJ_SHADOWJUMP,
- NJ_KIRIKAGE,
- NJ_UTSUSEMI,
- NJ_BUNSINJYUTSU,
- NJ_NINPOU,
- NJ_KOUENKA,
- NJ_KAENSIN,
- NJ_BAKUENRYU,
- NJ_HYOUSENSOU,
- NJ_SUITON,
- NJ_HYOUSYOURAKU,
- NJ_HUUJIN,
- NJ_RAIGEKISAI,
- NJ_KAMAITACHI,
- NJ_NEN,
- NJ_ISSEN,
-
- KN_CHARGEATK = 1001,
- CR_SHRINK,
- AS_SONICACCEL,
- AS_VENOMKNIFE,
- RG_CLOSECONFINE,
- WZ_SIGHTBLASTER,
- SA_CREATECON,
- SA_ELEMENTWATER,
- HT_PHANTASMIC,
- BA_PANGVOICE,
- DC_WINKCHARM,
- BS_UNFAIRLYTRICK,
- BS_GREED,
- PR_REDEMPTIO,
- MO_KITRANSLATION,
- MO_BALKYOUNG,
- SA_ELEMENTGROUND,
- SA_ELEMENTFIRE,
- SA_ELEMENTWIND,
-
- HLIF_HEAL = 8001,
- HLIF_AVOID,
- HLIF_BRAIN,
- HLIF_CHANGE,
- HAMI_CASTLE,
- HAMI_DEFENCE,
- HAMI_SKIN,
- HAMI_BLOODLUST,
- HFLI_MOON,
- HFLI_FLEET,
- HFLI_SPEED,
- HFLI_SBR44,
- HVAN_CAPRICE,
- HVAN_CHAOTIC,
- HVAN_INSTRUCT,
- HVAN_EXPLOSION,
-};
-
-enum {
- UNT_SAFETYWALL = 0x7e,
- UNT_FIREWALL,
- UNT_WARP_WAITING,
- UNT_WARP_ACTIVE,
- //0x82
- UNT_SANCTUARY = 0x83,
- UNT_MAGNUS,
- UNT_PNEUMA,
- UNT_ATTACK_SKILLS, //These show no effect on the client, therefore can be used for attack skills.
- UNT_FIREPILLAR_WAITING,
- UNT_FIREPILLAR_ACTIVE,
- //0x89, 0x8a, 0x8b
- UNT_USED_TRAPS = 0x8c,
- UNT_ICEWALL,
- UNT_QUAGMIRE,
- UNT_BLASTMINE,
- UNT_SKIDTRAP,
- UNT_ANKLESNARE,
- UNT_VENOMDUST,
- UNT_LANDMINE,
- UNT_SHOCKWAVE,
- UNT_SANDMAN,
- UNT_FLASHER,
- UNT_FREEZINGTRAP,
- UNT_CLAYMORETRAP,
- UNT_TALKIEBOX,
- UNT_VOLCANO,
- UNT_DELUGE,
- UNT_VIOLENTGALE,
- UNT_LANDPROTECTOR,
- UNT_LULLABY,
- UNT_RICHMANKIM,
- UNT_ETERNALCHAOS,
- UNT_DRUMBATTLEFIELD,
- UNT_RINGNIBELUNGEN,
- UNT_ROKISWEIL,
- UNT_INTOABYSS,
- UNT_SIEGFRIED,
- UNT_DISSONANCE,
- UNT_WHISTLE,
- UNT_ASSASSINCROSS,
- UNT_POEMBRAGI,
- UNT_APPLEIDUN,
- UNT_UGLYDANCE,
- UNT_HUMMING,
- UNT_DONTFORGETME,
- UNT_FORTUNEKISS,
- UNT_SERVICEFORYOU,
- UNT_GRAFFITI,
- UNT_DEMONSTRATION,
- UNT_CALLFAMILY,
- UNT_GOSPEL,
- UNT_BASILICA,
- UNT_MOONLIT,//0xb5 //I HOPE this one doesn't shows any effects
- UNT_FOGWALL = 0xb6,
- UNT_SPIDERWEB,
- UNT_GRAVITATION,
- UNT_HERMODE,
- UNT_DESPERADO, //0xba //Temporary setting until correct value is found.
- UNT_SUITON = 0xbb,
- UNT_TATAMIGAESHI,
- UNT_KAENSIN,
- UNT_GROUNDDRIFT_WIND,
- UNT_GROUNDDRIFT_DARK,
- UNT_GROUNDDRIFT_POISON,
- UNT_GROUNDDRIFT_WATER,
- UNT_GROUNDDRIFT_FIRE,
-};
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _SKILL_H_
+#define _SKILL_H_
+
+#include "map.h"
+
+#define MAX_SKILL_DB 1100
+#define MAX_SKILL_PRODUCE_DB 150
+#define MAX_PRODUCE_RESOURCE 12
+#define MAX_SKILL_ARROW_DB 150
+#define MAX_SKILL_ABRA_DB 350
+
+//Constants to identify the skill's inf value:
+#define INF_ATTACK_SKILL 1
+#define INF_GROUND_SKILL 2
+// Skills casted on self where target is automatically chosen:
+#define INF_SELF_SKILL 4
+#define INF_SUPPORT_SKILL 16
+#define INF_TARGET_TRAP 32
+
+//Constants to identify a skill's nk value.
+//The NK value applies only to non INF_GROUND_SKILL skills.
+#define NK_NO_DAMAGE 0x1
+#define NK_SPLASH (0x2|0x4) // 0x4 = splash & split
+#define NK_SPLASHSPLIT 0x4
+//A skill with 3 would be no damage + splash: area of effect.
+//Constants to identify a skill's inf2 value.
+#define INF2_QUEST_SKILL 1
+//NPC skills are those that players can't have in their skill tree.
+#define INF2_NPC_SKILL 2
+#define INF2_WEDDING_SKILL 4
+#define INF2_SPIRIT_SKILL 8
+#define INF2_GUILD_SKILL 16
+#define INF2_SONG_DANCE 32
+#define INF2_ENSEMBLE_SKILL 64
+#define INF2_TRAP 128
+//Refers to ground placed skills that will target the caster as well (like Grandcross)
+#define INF2_TARGET_SELF 256
+#define INF2_NO_TARGET_SELF 512
+#define INF2_PARTY_ONLY 1024
+#define INF2_GUILD_ONLY 2048
+//For Party/Guild only skills that can ALSO be used on enemies.
+#define INF2_ALLOW_ENEMY 4096
+
+//Walk intervals at which chase-skills are attempted to be triggered.
+#define WALK_SKILL_INTERVAL 5
+
+// To be passed to skill_attack, whether the skill damage should disable level or animation. [Skotlex]
+#define SD_LEVEL 0x1000
+#define SD_ANIMATION 0x2000
+
+// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX
+struct skill_db {
+ char *name;
+ char *desc;
+ int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,splash[MAX_SKILL_LEVEL],max;
+ int num[MAX_SKILL_LEVEL];
+ int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
+ int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL];
+ int castcancel,cast_def_rate;
+ int inf2,maxcount,skill_type;
+ int blewcount[MAX_SKILL_LEVEL];
+ int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
+ int weapon,ammo,ammo_qty[MAX_SKILL_LEVEL],state,spiritball[MAX_SKILL_LEVEL];
+ int itemid[10],amount[10];
+ int castnodex[MAX_SKILL_LEVEL];
+ int delaynoagi[MAX_SKILL_LEVEL];
+ int nocast;
+ int unit_id[2];
+ int unit_layout_type[MAX_SKILL_LEVEL];
+ int unit_range[MAX_SKILL_LEVEL];
+ int unit_interval;
+ int unit_target;
+ int unit_flag;
+};
+extern struct skill_db skill_db[MAX_SKILL_DB];
+
+struct skill_name_db {
+ int id; // skill id
+ char *name; // search strings
+ char *desc; // description that shows up for search's
+};
+
+#define MAX_SKILL_UNIT_LAYOUT 50
+#define MAX_SQUARE_LAYOUT 5 // 11*11‚̃†ƒjƒbƒg”z’u‚ªÅ‘å
+#define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
+struct skill_unit_layout {
+ int count;
+ int dx[MAX_SKILL_UNIT_COUNT];
+ int dy[MAX_SKILL_UNIT_COUNT];
+};
+
+enum {
+ UF_DEFNOTENEMY = 0x0001, // defnotenemy Ý’è‚ÅBCT_NOENEMY‚ÉØ‚è‘Ö‚¦
+ UF_NOREITERATION = 0x0002, // d•¡’u‚«‹ÖŽ~
+ UF_NOFOOTSET = 0x0004, // ‘«Œ³’u‚«‹ÖŽ~
+ UF_NOOVERLAP = 0x0008, // ƒ†ƒjƒbƒgŒø‰Ê‚ªd•¡‚µ‚È‚¢
+ UF_NOPC = 0x0010, //May not target players
+ UF_NOMOB = 0x0020, //May not target mobs
+ UF_SKILL = 0x0080, //May target skills
+ UF_DANCE = 0x0100, //Dance
+ UF_ENSEMBLE = 0x0200, //Duet
+ UF_SONG = 0x0400, //Song
+ UF_DUALMODE = 0x0800, //Spells should trigger both ontimer and onplace/onout/onleft effects.
+};
+
+// ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX
+struct skill_produce_db {
+ int nameid, trigger;
+ int req_skill,req_skill_lv,itemlv;
+ int mat_id[MAX_PRODUCE_RESOURCE],mat_amount[MAX_PRODUCE_RESOURCE];
+};
+extern struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
+
+// –î쬃f?ƒ^ƒx?ƒX
+struct skill_arrow_db {
+ int nameid, trigger;
+ int cre_id[5],cre_amount[5];
+};
+extern struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
+
+// ƒAƒuƒ‰ƒJƒ_ƒuƒ‰ƒf?ƒ^ƒx?ƒX
+struct skill_abra_db {
+ int nameid;
+ int req_lv;
+ int per;
+};
+extern struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
+
+extern int enchant_eff[5];
+extern int deluge_eff[5];
+
+struct block_list;
+struct map_session_data;
+struct skill_unit;
+struct skill_unit_group;
+
+int do_init_skill(void);
+int do_final_skill(void);
+
+//Returns the cast type of the skill: ground cast, castend damage, castend no damage
+enum { CAST_GROUND, CAST_DAMAGE, CAST_NODAMAGE };
+int skill_get_casttype(int id); //[Skotlex]
+// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX‚ւ̃AƒNƒZƒT
+//
+int skill_get_type( int id );
+int skill_get_hit( int id );
+int skill_get_inf( int id );
+int skill_get_pl( int id );
+int skill_get_nk( int id );
+int skill_get_max( int id );
+int skill_get_range( int id , int lv );
+int skill_get_range2(struct block_list *bl, int id, int lv);
+int skill_get_splash( int id , int lv );
+int skill_get_hp( int id ,int lv );
+int skill_get_mhp( int id ,int lv );
+int skill_get_sp( int id ,int lv );
+int skill_get_state(int id);
+int skill_get_zeny( int id ,int lv );
+int skill_get_num( int id ,int lv );
+int skill_get_cast( int id ,int lv );
+int skill_get_delay( int id ,int lv );
+int skill_get_walkdelay( int id ,int lv );
+int skill_get_time( int id ,int lv );
+int skill_get_time2( int id ,int lv );
+int skill_get_castnodex( int id ,int lv );
+int skill_get_castdef( int id );
+int skill_get_weapontype( int id );
+int skill_get_ammotype( int id );
+int skill_get_ammo_qty( int id, int lv );
+int skill_get_nocast( int id );
+int skill_get_unit_id(int id,int flag);
+int skill_get_inf2( int id );
+int skill_get_castcancel( int id );
+int skill_get_maxcount( int id );
+int skill_get_blewcount( int id ,int lv );
+int skill_get_unit_flag( int id );
+int skill_get_unit_target( int id );
+int skill_tree_get_max( int id, int b_class ); // Celest
+const char* skill_get_name( int id ); // [Skotlex]
+
+int skill_isammotype(TBL_PC *sd, int skill);
+int skill_castend_id( int tid, unsigned int tick, int id,int data );
+int skill_castend_pos( int tid, unsigned int tick, int id,int data );
+int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map);
+
+int skill_cleartimerskill(struct block_list *src);
+int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag);
+
+// ’ljÁ?‰Ê
+int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
+int skill_counter_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
+int skill_blown( struct block_list *src, struct block_list *target,int count);
+int skill_break_equip(struct block_list *bl, unsigned short where, int rate, int flag);
+// ƒ†ƒjƒbƒgƒXƒLƒ‹
+struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
+struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2);
+int skill_delunit(struct skill_unit *unit, int flag);
+struct skill_unit_group *skill_initunitgroup(struct block_list *src,
+ int count,int skillid,int skilllv,int unit_id, int limit, int interval);
+int skill_delunitgroup(struct block_list *src, struct skill_unit_group *group, int flag);
+int skill_clear_unitgroup(struct block_list *src);
+int skill_clear_group(struct block_list *bl, int flag);
+
+int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
+ int damage,unsigned int tick);
+
+int skill_castfix( struct block_list *bl, int skill_id, int skill_lv);
+int skill_castfix_sc( struct block_list *bl, int time);
+int skill_delayfix( struct block_list *bl, int skill_id, int skill_lv);
+int skill_check_condition( struct map_session_data *sd,int skill, int lv, int type);
+int skill_check_pc_partner(struct map_session_data *sd, int skill_id, int* skill_lv, int range, int cast_flag);
+// -- moonsoul (added skill_check_unit_cell)
+int skill_check_unit_cell(int skillid,int m,int x,int y,int unit_id);
+int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range);
+int skill_unit_move(struct block_list *bl,unsigned int tick,int flag);
+int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy);
+void skill_setmapcell(struct block_list *src, int skill_num, int skill_lv, int flag);
+
+struct skill_unit_group *skill_check_dancing( struct block_list *src );
+void skill_stop_dancing(struct block_list *src);
+
+// Guild skills [celest]
+int skill_guildaura_sub (struct block_list *bl,va_list ap);
+
+// ‰r¥ƒLƒƒƒ“ƒZƒ‹
+int skill_castcancel(struct block_list *bl,int type);
+
+int skill_sit (struct map_session_data *sd, int type);
+void skill_brandishspear_first(struct square *tc,int dir,int x,int y);
+void skill_brandishspear_dir(struct square *tc,int dir,int are);
+void skill_repairweapon(struct map_session_data *sd, int idx);
+void skill_identify(struct map_session_data *sd,int idx);
+void skill_weaponrefine(struct map_session_data *sd,int idx); // [Celest]
+int skill_autospell(struct map_session_data *md,int skillid);
+
+int skill_calc_heal(struct block_list *bl, int skill_lv);
+
+int skill_check_cloaking(struct block_list *bl, struct status_change *sc);
+
+// ƒXƒe?ƒ^ƒXˆÙí
+int skill_enchant_elemental_end(struct block_list *bl, int type);
+int skillnotok(int skillid, struct map_session_data *sd);
+int skillnotok_hom (int skillid, struct homun_data *hd) ; //[orn]
+int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap); //[orn]
+
+// ƒAƒCƒeƒ€ì¬
+int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger, int qty);
+int skill_produce_mix( struct map_session_data *sd,
+ int skill_id, int nameid, int slot1, int slot2, int slot3, int qty );
+
+int skill_arrow_create( struct map_session_data *sd,int nameid);
+
+// mobƒXƒLƒ‹‚Ì‚½‚ß
+int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
+int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
+int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
+int skill_blockpc_start (struct map_session_data*,int,int); // [celest]
+int skill_blockmerc_start (struct homun_data*,int,int); //[orn]
+
+// ƒXƒLƒ‹U?ˆêŠ‡?—
+int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
+ struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
+
+void skill_reload(void);
+
+enum {
+ ST_NONE,ST_HIDING,ST_CLOAKING,ST_HIDDEN,ST_RIDING,ST_FALCON,ST_CART,ST_SHIELD,ST_SIGHT,ST_EXPLOSIONSPIRITS,ST_CARTBOOST,
+ ST_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER,
+};
+
+enum {
+ NV_BASIC = 1,
+
+ SM_SWORD,
+ SM_TWOHAND,
+ SM_RECOVERY,
+ SM_BASH,
+ SM_PROVOKE,
+ SM_MAGNUM,
+ SM_ENDURE,
+
+ MG_SRECOVERY,
+ MG_SIGHT,
+ MG_NAPALMBEAT,
+ MG_SAFETYWALL,
+ MG_SOULSTRIKE,
+ MG_COLDBOLT,
+ MG_FROSTDIVER,
+ MG_STONECURSE,
+ MG_FIREBALL,
+ MG_FIREWALL,
+ MG_FIREBOLT,
+ MG_LIGHTNINGBOLT,
+ MG_THUNDERSTORM,
+
+ AL_DP,
+ AL_DEMONBANE,
+ AL_RUWACH,
+ AL_PNEUMA,
+ AL_TELEPORT,
+ AL_WARP,
+ AL_HEAL,
+ AL_INCAGI,
+ AL_DECAGI,
+ AL_HOLYWATER,
+ AL_CRUCIS,
+ AL_ANGELUS,
+ AL_BLESSING,
+ AL_CURE,
+
+ MC_INCCARRY,
+ MC_DISCOUNT,
+ MC_OVERCHARGE,
+ MC_PUSHCART,
+ MC_IDENTIFY,
+ MC_VENDING,
+ MC_MAMMONITE,
+
+ AC_OWL,
+ AC_VULTURE,
+ AC_CONCENTRATION,
+ AC_DOUBLE,
+ AC_SHOWER,
+
+ TF_DOUBLE,
+ TF_MISS,
+ TF_STEAL,
+ TF_HIDING,
+ TF_POISON,
+ TF_DETOXIFY,
+
+ ALL_RESURRECTION,
+
+ KN_SPEARMASTERY,
+ KN_PIERCE,
+ KN_BRANDISHSPEAR,
+ KN_SPEARSTAB,
+ KN_SPEARBOOMERANG,
+ KN_TWOHANDQUICKEN,
+ KN_AUTOCOUNTER,
+ KN_BOWLINGBASH,
+ KN_RIDING,
+ KN_CAVALIERMASTERY,
+
+ PR_MACEMASTERY,
+ PR_IMPOSITIO,
+ PR_SUFFRAGIUM,
+ PR_ASPERSIO,
+ PR_BENEDICTIO,
+ PR_SANCTUARY,
+ PR_SLOWPOISON,
+ PR_STRECOVERY,
+ PR_KYRIE,
+ PR_MAGNIFICAT,
+ PR_GLORIA,
+ PR_LEXDIVINA,
+ PR_TURNUNDEAD,
+ PR_LEXAETERNA,
+ PR_MAGNUS,
+
+ WZ_FIREPILLAR,
+ WZ_SIGHTRASHER,
+ WZ_FIREIVY,
+ WZ_METEOR,
+ WZ_JUPITEL,
+ WZ_VERMILION,
+ WZ_WATERBALL,
+ WZ_ICEWALL,
+ WZ_FROSTNOVA,
+ WZ_STORMGUST,
+ WZ_EARTHSPIKE,
+ WZ_HEAVENDRIVE,
+ WZ_QUAGMIRE,
+ WZ_ESTIMATION,
+
+ BS_IRON,
+ BS_STEEL,
+ BS_ENCHANTEDSTONE,
+ BS_ORIDEOCON,
+ BS_DAGGER,
+ BS_SWORD,
+ BS_TWOHANDSWORD,
+ BS_AXE,
+ BS_MACE,
+ BS_KNUCKLE,
+ BS_SPEAR,
+ BS_HILTBINDING,
+ BS_FINDINGORE,
+ BS_WEAPONRESEARCH,
+ BS_REPAIRWEAPON,
+ BS_SKINTEMPER,
+ BS_HAMMERFALL,
+ BS_ADRENALINE,
+ BS_WEAPONPERFECT,
+ BS_OVERTHRUST,
+ BS_MAXIMIZE,
+
+ HT_SKIDTRAP,
+ HT_LANDMINE,
+ HT_ANKLESNARE,
+ HT_SHOCKWAVE,
+ HT_SANDMAN,
+ HT_FLASHER,
+ HT_FREEZINGTRAP,
+ HT_BLASTMINE,
+ HT_CLAYMORETRAP,
+ HT_REMOVETRAP,
+ HT_TALKIEBOX,
+ HT_BEASTBANE,
+ HT_FALCON,
+ HT_STEELCROW,
+ HT_BLITZBEAT,
+ HT_DETECTING,
+ HT_SPRINGTRAP,
+
+ AS_RIGHT,
+ AS_LEFT,
+ AS_KATAR,
+ AS_CLOAKING,
+ AS_SONICBLOW,
+ AS_GRIMTOOTH,
+ AS_ENCHANTPOISON,
+ AS_POISONREACT,
+ AS_VENOMDUST,
+ AS_SPLASHER,
+
+ NV_FIRSTAID,
+ NV_TRICKDEAD,
+ SM_MOVINGRECOVERY,
+ SM_FATALBLOW,
+ SM_AUTOBERSERK,
+ AC_MAKINGARROW,
+ AC_CHARGEARROW,
+ TF_SPRINKLESAND,
+ TF_BACKSLIDING,
+ TF_PICKSTONE,
+ TF_THROWSTONE,
+ MC_CARTREVOLUTION,
+ MC_CHANGECART,
+ MC_LOUD,
+ AL_HOLYLIGHT,
+ MG_ENERGYCOAT,
+
+ NPC_PIERCINGATT,
+ NPC_MENTALBREAKER,
+ NPC_RANGEATTACK,
+ NPC_ATTRICHANGE,
+ NPC_CHANGEWATER,
+ NPC_CHANGEGROUND,
+ NPC_CHANGEFIRE,
+ NPC_CHANGEWIND,
+ NPC_CHANGEPOISON,
+ NPC_CHANGEHOLY,
+ NPC_CHANGEDARKNESS,
+ NPC_CHANGETELEKINESIS,
+ NPC_CRITICALSLASH,
+ NPC_COMBOATTACK,
+ NPC_GUIDEDATTACK,
+ NPC_SELFDESTRUCTION,
+ NPC_SPLASHATTACK,
+ NPC_SUICIDE,
+ NPC_POISON,
+ NPC_BLINDATTACK,
+ NPC_SILENCEATTACK,
+ NPC_STUNATTACK,
+ NPC_PETRIFYATTACK,
+ NPC_CURSEATTACK,
+ NPC_SLEEPATTACK,
+ NPC_RANDOMATTACK,
+ NPC_WATERATTACK,
+ NPC_GROUNDATTACK,
+ NPC_FIREATTACK,
+ NPC_WINDATTACK,
+ NPC_POISONATTACK,
+ NPC_HOLYATTACK,
+ NPC_DARKNESSATTACK,
+ NPC_TELEKINESISATTACK,
+ NPC_MAGICALATTACK,
+ NPC_METAMORPHOSIS,
+ NPC_PROVOCATION,
+ NPC_SMOKING,
+ NPC_SUMMONSLAVE,
+ NPC_EMOTION,
+ NPC_TRANSFORMATION,
+ NPC_BLOODDRAIN,
+ NPC_ENERGYDRAIN,
+ NPC_KEEPING,
+ NPC_DARKBREATH,
+ NPC_DARKBLESSING,
+ NPC_BARRIER,
+ NPC_DEFENDER,
+ NPC_LICK,
+ NPC_HALLUCINATION,
+ NPC_REBIRTH,
+ NPC_SUMMONMONSTER,
+
+ RG_SNATCHER,
+ RG_STEALCOIN,
+ RG_BACKSTAP,
+ RG_TUNNELDRIVE,
+ RG_RAID,
+ RG_STRIPWEAPON,
+ RG_STRIPSHIELD,
+ RG_STRIPARMOR,
+ RG_STRIPHELM,
+ RG_INTIMIDATE,
+ RG_GRAFFITI,
+ RG_FLAGGRAFFITI,
+ RG_CLEANER,
+ RG_GANGSTER,
+ RG_COMPULSION,
+ RG_PLAGIARISM,
+
+ AM_AXEMASTERY,
+ AM_LEARNINGPOTION,
+ AM_PHARMACY,
+ AM_DEMONSTRATION,
+ AM_ACIDTERROR,
+ AM_POTIONPITCHER,
+ AM_CANNIBALIZE,
+ AM_SPHEREMINE,
+ AM_CP_WEAPON,
+ AM_CP_SHIELD,
+ AM_CP_ARMOR,
+ AM_CP_HELM,
+ AM_BIOETHICS,
+ AM_BIOTECHNOLOGY,
+ AM_CREATECREATURE,
+ AM_CULTIVATION,
+ AM_FLAMECONTROL,
+ AM_CALLHOMUN,
+ AM_REST,
+ AM_DRILLMASTER,
+ AM_HEALHOMUN,
+ AM_RESURRECTHOMUN,
+
+ CR_TRUST,
+ CR_AUTOGUARD,
+ CR_SHIELDCHARGE,
+ CR_SHIELDBOOMERANG,
+ CR_REFLECTSHIELD,
+ CR_HOLYCROSS,
+ CR_GRANDCROSS,
+ CR_DEVOTION,
+ CR_PROVIDENCE,
+ CR_DEFENDER,
+ CR_SPEARQUICKEN,
+
+ MO_IRONHAND,
+ MO_SPIRITSRECOVERY,
+ MO_CALLSPIRITS,
+ MO_ABSORBSPIRITS,
+ MO_TRIPLEATTACK,
+ MO_BODYRELOCATION,
+ MO_DODGE,
+ MO_INVESTIGATE,
+ MO_FINGEROFFENSIVE,
+ MO_STEELBODY,
+ MO_BLADESTOP,
+ MO_EXPLOSIONSPIRITS,
+ MO_EXTREMITYFIST,
+ MO_CHAINCOMBO,
+ MO_COMBOFINISH,
+
+ SA_ADVANCEDBOOK,
+ SA_CASTCANCEL,
+ SA_MAGICROD,
+ SA_SPELLBREAKER,
+ SA_FREECAST,
+ SA_AUTOSPELL,
+ SA_FLAMELAUNCHER,
+ SA_FROSTWEAPON,
+ SA_LIGHTNINGLOADER,
+ SA_SEISMICWEAPON,
+ SA_DRAGONOLOGY,
+ SA_VOLCANO,
+ SA_DELUGE,
+ SA_VIOLENTGALE,
+ SA_LANDPROTECTOR,
+ SA_DISPELL,
+ SA_ABRACADABRA,
+ SA_MONOCELL,
+ SA_CLASSCHANGE,
+ SA_SUMMONMONSTER,
+ SA_REVERSEORCISH,
+ SA_DEATH,
+ SA_FORTUNE,
+ SA_TAMINGMONSTER,
+ SA_QUESTION,
+ SA_GRAVITY,
+ SA_LEVELUP,
+ SA_INSTANTDEATH,
+ SA_FULLRECOVERY,
+ SA_COMA,
+
+ BD_ADAPTATION,
+ BD_ENCORE,
+ BD_LULLABY,
+ BD_RICHMANKIM,
+ BD_ETERNALCHAOS,
+ BD_DRUMBATTLEFIELD,
+ BD_RINGNIBELUNGEN,
+ BD_ROKISWEIL,
+ BD_INTOABYSS,
+ BD_SIEGFRIED,
+ BD_RAGNAROK,
+
+ BA_MUSICALLESSON,
+ BA_MUSICALSTRIKE,
+ BA_DISSONANCE,
+ BA_FROSTJOKE,
+ BA_WHISTLE,
+ BA_ASSASSINCROSS,
+ BA_POEMBRAGI,
+ BA_APPLEIDUN,
+
+ DC_DANCINGLESSON,
+ DC_THROWARROW,
+ DC_UGLYDANCE,
+ DC_SCREAM,
+ DC_HUMMING,
+ DC_DONTFORGETME,
+ DC_FORTUNEKISS,
+ DC_SERVICEFORYOU,
+
+ NPC_RANDOMMOVE,
+ NPC_SPEEDUP,
+ NPC_REVENGE,
+
+ WE_MALE,
+ WE_FEMALE,
+ WE_CALLPARTNER,
+
+ ITM_TOMAHAWK,
+
+ NPC_DARKCROSS,
+ NPC_GRANDDARKNESS,
+ NPC_DARKSTRIKE,
+ NPC_DARKTHUNDER,
+ NPC_STOP,
+ NPC_BREAKWEAPON,
+ NPC_BREAKARMOR,
+ NPC_BREAKHELM,
+ NPC_BREAKSHIELD,
+ NPC_UNDEADATTACK,
+ NPC_CHANGEUNDEAD,
+ NPC_POWERUP,
+ NPC_AGIUP,
+ NPC_SIEGEMODE,
+ NPC_CALLSLAVE,
+ NPC_INVISIBLE,
+ NPC_RUN,
+
+ LK_AURABLADE,
+ LK_PARRYING,
+ LK_CONCENTRATION,
+ LK_TENSIONRELAX,
+ LK_BERSERK,
+ LK_FURY,
+ HP_ASSUMPTIO,
+ HP_BASILICA,
+ HP_MEDITATIO,
+ HW_SOULDRAIN,
+ HW_MAGICCRASHER,
+ HW_MAGICPOWER,
+ PA_PRESSURE,
+ PA_SACRIFICE,
+ PA_GOSPEL,
+ CH_PALMSTRIKE,
+ CH_TIGERFIST,
+ CH_CHAINCRUSH,
+ PF_HPCONVERSION,
+ PF_SOULCHANGE,
+ PF_SOULBURN,
+ ASC_KATAR,
+ ASC_HALLUCINATION,
+ ASC_EDP,
+ ASC_BREAKER,
+ SN_SIGHT,
+ SN_FALCONASSAULT,
+ SN_SHARPSHOOTING,
+ SN_WINDWALK,
+ WS_MELTDOWN,
+ WS_CREATECOIN,
+ WS_CREATENUGGET,
+ WS_CARTBOOST,
+ WS_SYSTEMCREATE,
+ ST_CHASEWALK,
+ ST_REJECTSWORD,
+ ST_STEALBACKPACK,
+ CR_ALCHEMY,
+ CR_SYNTHESISPOTION,
+ CG_ARROWVULCAN,
+ CG_MOONLIT,
+ CG_MARIONETTE,
+ LK_SPIRALPIERCE,
+ LK_HEADCRUSH,
+ LK_JOINTBEAT,
+ HW_NAPALMVULCAN,
+ CH_SOULCOLLECT,
+ PF_MINDBREAKER,
+ PF_MEMORIZE,
+ PF_FOGWALL,
+ PF_SPIDERWEB,
+ ASC_METEORASSAULT,
+ ASC_CDP,
+ WE_BABY,
+ WE_CALLPARENT,
+ WE_CALLBABY,
+
+ TK_RUN,
+ TK_READYSTORM,
+ TK_STORMKICK,
+ TK_READYDOWN,
+ TK_DOWNKICK,
+ TK_READYTURN,
+ TK_TURNKICK,
+ TK_READYCOUNTER,
+ TK_COUNTER,
+ TK_DODGE,
+ TK_JUMPKICK,
+ TK_HPTIME,
+ TK_SPTIME,
+ TK_POWER,
+ TK_SEVENWIND,
+ TK_HIGHJUMP,
+ SG_FEEL,
+ SG_SUN_WARM,
+ SG_MOON_WARM,
+ SG_STAR_WARM,
+ SG_SUN_COMFORT,
+ SG_MOON_COMFORT,
+ SG_STAR_COMFORT,
+ SG_HATE,
+ SG_SUN_ANGER,
+ SG_MOON_ANGER,
+ SG_STAR_ANGER,
+ SG_SUN_BLESS,
+ SG_MOON_BLESS,
+ SG_STAR_BLESS,
+ SG_DEVIL,
+ SG_FRIEND,
+ SG_KNOWLEDGE,
+ SG_FUSION,
+ SL_ALCHEMIST,
+ AM_BERSERKPITCHER,
+ SL_MONK,
+ SL_STAR,
+ SL_SAGE,
+ SL_CRUSADER,
+ SL_SUPERNOVICE,
+ SL_KNIGHT,
+ SL_WIZARD,
+ SL_PRIEST,
+ SL_BARDDANCER,
+ SL_ROGUE,
+ SL_ASSASIN,
+ SL_BLACKSMITH,
+ BS_ADRENALINE2,
+ SL_HUNTER,
+ SL_SOULLINKER,
+ SL_KAIZEL,
+ SL_KAAHI,
+ SL_KAUPE,
+ SL_KAITE,
+ SL_KAINA,
+ SL_STIN,
+ SL_STUN,
+ SL_SMA,
+ SL_SWOO,
+ SL_SKE,
+ SL_SKA,
+
+ SM_SELFPROVOKE,
+ NPC_EMOTION_ON,
+ ST_PRESERVE,
+ ST_FULLSTRIP,
+ WS_WEAPONREFINE,
+ CR_SLIMPITCHER,
+ CR_FULLPROTECTION,
+ PA_SHIELDCHAIN,
+ HP_MANARECHARGE,
+ PF_DOUBLECASTING,
+ HW_GANBANTEIN,
+ HW_GRAVITATION,
+ WS_CARTTERMINATION,
+ WS_OVERTHRUSTMAX,
+ CG_LONGINGFREEDOM,
+ CG_HERMODE,
+ CG_TAROTCARD,
+ CR_ACIDDEMONSTRATION,
+ CR_CULTIVATION,
+ //492,missing?
+ TK_MISSION = 493,
+ SL_HIGH,
+ KN_ONEHAND,
+ AM_TWILIGHT1,
+ AM_TWILIGHT2,
+ AM_TWILIGHT3,
+ HT_POWER,
+ GS_GLITTERING,
+ GS_FLING,
+ GS_TRIPLEACTION,
+ GS_BULLSEYE,
+ GS_MADNESSCANCEL,
+ GS_ADJUSTMENT,
+ GS_INCREASING,
+ GS_MAGICALBULLET,
+ GS_CRACKER,
+ GS_SINGLEACTION,
+ GS_SNAKEEYE,
+ GS_CHAINACTION,
+ GS_TRACKING,
+ GS_DISARM,
+ GS_PIERCINGSHOT,
+ GS_RAPIDSHOWER,
+ GS_DESPERADO,
+ GS_GATLINGFEVER,
+ GS_DUST,
+ GS_FULLBUSTER,
+ GS_SPREADATTACK,
+ GS_GROUNDDRIFT,
+ NJ_TOBIDOUGU,
+ NJ_SYURIKEN,
+ NJ_KUNAI,
+ NJ_HUUMA,
+ NJ_ZENYNAGE,
+ NJ_TATAMIGAESHI,
+ NJ_KASUMIKIRI,
+ NJ_SHADOWJUMP,
+ NJ_KIRIKAGE,
+ NJ_UTSUSEMI,
+ NJ_BUNSINJYUTSU,
+ NJ_NINPOU,
+ NJ_KOUENKA,
+ NJ_KAENSIN,
+ NJ_BAKUENRYU,
+ NJ_HYOUSENSOU,
+ NJ_SUITON,
+ NJ_HYOUSYOURAKU,
+ NJ_HUUJIN,
+ NJ_RAIGEKISAI,
+ NJ_KAMAITACHI,
+ NJ_NEN,
+ NJ_ISSEN,
+
+ KN_CHARGEATK = 1001,
+ CR_SHRINK,
+ AS_SONICACCEL,
+ AS_VENOMKNIFE,
+ RG_CLOSECONFINE,
+ WZ_SIGHTBLASTER,
+ SA_CREATECON,
+ SA_ELEMENTWATER,
+ HT_PHANTASMIC,
+ BA_PANGVOICE,
+ DC_WINKCHARM,
+ BS_UNFAIRLYTRICK,
+ BS_GREED,
+ PR_REDEMPTIO,
+ MO_KITRANSLATION,
+ MO_BALKYOUNG,
+ SA_ELEMENTGROUND,
+ SA_ELEMENTFIRE,
+ SA_ELEMENTWIND,
+
+ HLIF_HEAL = 8001,
+ HLIF_AVOID,
+ HLIF_BRAIN,
+ HLIF_CHANGE,
+ HAMI_CASTLE,
+ HAMI_DEFENCE,
+ HAMI_SKIN,
+ HAMI_BLOODLUST,
+ HFLI_MOON,
+ HFLI_FLEET,
+ HFLI_SPEED,
+ HFLI_SBR44,
+ HVAN_CAPRICE,
+ HVAN_CHAOTIC,
+ HVAN_INSTRUCT,
+ HVAN_EXPLOSION,
+};
+
+enum {
+ UNT_SAFETYWALL = 0x7e,
+ UNT_FIREWALL,
+ UNT_WARP_WAITING,
+ UNT_WARP_ACTIVE,
+ //0x82
+ UNT_SANCTUARY = 0x83,
+ UNT_MAGNUS,
+ UNT_PNEUMA,
+ UNT_ATTACK_SKILLS, //These show no effect on the client, therefore can be used for attack skills.
+ UNT_FIREPILLAR_WAITING,
+ UNT_FIREPILLAR_ACTIVE,
+ //0x89, 0x8a, 0x8b
+ UNT_USED_TRAPS = 0x8c,
+ UNT_ICEWALL,
+ UNT_QUAGMIRE,
+ UNT_BLASTMINE,
+ UNT_SKIDTRAP,
+ UNT_ANKLESNARE,
+ UNT_VENOMDUST,
+ UNT_LANDMINE,
+ UNT_SHOCKWAVE,
+ UNT_SANDMAN,
+ UNT_FLASHER,
+ UNT_FREEZINGTRAP,
+ UNT_CLAYMORETRAP,
+ UNT_TALKIEBOX,
+ UNT_VOLCANO,
+ UNT_DELUGE,
+ UNT_VIOLENTGALE,
+ UNT_LANDPROTECTOR,
+ UNT_LULLABY,
+ UNT_RICHMANKIM,
+ UNT_ETERNALCHAOS,
+ UNT_DRUMBATTLEFIELD,
+ UNT_RINGNIBELUNGEN,
+ UNT_ROKISWEIL,
+ UNT_INTOABYSS,
+ UNT_SIEGFRIED,
+ UNT_DISSONANCE,
+ UNT_WHISTLE,
+ UNT_ASSASSINCROSS,
+ UNT_POEMBRAGI,
+ UNT_APPLEIDUN,
+ UNT_UGLYDANCE,
+ UNT_HUMMING,
+ UNT_DONTFORGETME,
+ UNT_FORTUNEKISS,
+ UNT_SERVICEFORYOU,
+ UNT_GRAFFITI,
+ UNT_DEMONSTRATION,
+ UNT_CALLFAMILY,
+ UNT_GOSPEL,
+ UNT_BASILICA,
+ UNT_MOONLIT,//0xb5 //I HOPE this one doesn't shows any effects
+ UNT_FOGWALL = 0xb6,
+ UNT_SPIDERWEB,
+ UNT_GRAVITATION,
+ UNT_HERMODE,
+ UNT_DESPERADO, //0xba //Temporary setting until correct value is found.
+ UNT_SUITON = 0xbb,
+ UNT_TATAMIGAESHI,
+ UNT_KAENSIN,
+ UNT_GROUNDDRIFT_WIND,
+ UNT_GROUNDDRIFT_DARK,
+ UNT_GROUNDDRIFT_POISON,
+ UNT_GROUNDDRIFT_WATER,
+ UNT_GROUNDDRIFT_FIRE,
+};
+
+#endif
diff --git a/src/map/status.h b/src/map/status.h
index 5227edc68..c680ab89b 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -1,638 +1,638 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _STATUS_H_
-#define _STATUS_H_
-
-#include "map.h"
-
-//Use this to refer the max refinery level [Skotlex]
-#define MAX_REFINE 10
-#define MAX_REFINE_BONUS 5
-
-extern unsigned long StatusChangeFlagTable[];
-
-// Status changes listing. These code are for use by the server.
-enum {
- //First we enumerate common status ailments which are often used around.
- SC_STONE = 0,
- SC_FREEZE,
- SC_STUN,
- SC_SLEEP,
- SC_POISON,
- SC_CURSE,
- SC_SILENCE,
- SC_CONFUSION,
- SC_BLIND,
- SC_BLEEDING,
- SC_DPOISON, //10
-
- //Next up, we continue on 20, to leave enough room for additional "common" ailments in the future.
- SC_PROVOKE = 20,
- SC_ENDURE,
- SC_TWOHANDQUICKEN,
- SC_CONCENTRATE,
- SC_HIDING,
- SC_CLOAKING,
- SC_ENCPOISON,
- SC_POISONREACT,
- SC_QUAGMIRE,
- SC_ANGELUS,
- SC_BLESSING, //30
- SC_SIGNUMCRUCIS,
- SC_INCREASEAGI,
- SC_DECREASEAGI,
- SC_SLOWPOISON,
- SC_IMPOSITIO ,
- SC_SUFFRAGIUM,
- SC_ASPERSIO,
- SC_BENEDICTIO,
- SC_KYRIE,
- SC_MAGNIFICAT, //40
- SC_GLORIA,
- SC_AETERNA,
- SC_ADRENALINE,
- SC_WEAPONPERFECTION,
- SC_OVERTHRUST,
- SC_MAXIMIZEPOWER,
- SC_TRICKDEAD,
- SC_LOUD,
- SC_ENERGYCOAT,
- SC_BROKENARMOR, //50 - NOTE: These two aren't used anywhere, and they have an icon...
- SC_BROKENWEAPON,
- SC_HALLUCINATION,
- SC_WEIGHT50,
- SC_WEIGHT90,
- SC_ASPDPOTION0,
- SC_ASPDPOTION1,
- SC_ASPDPOTION2,
- SC_ASPDPOTION3,
- SC_SPEEDUP0,
- SC_SPEEDUP1, //60
- SC_ATKPOTION,
- SC_MATKPOTION,
- SC_WEDDING,
- SC_SLOWDOWN,
- SC_ANKLE,
- SC_KEEPING,
- SC_BARRIER,
- SC_STRIPWEAPON,
- SC_STRIPSHIELD,
- SC_STRIPARMOR, //70
- SC_STRIPHELM,
- SC_CP_WEAPON,
- SC_CP_SHIELD,
- SC_CP_ARMOR,
- SC_CP_HELM,
- SC_AUTOGUARD,
- SC_REFLECTSHIELD,
- SC_SPLASHER,
- SC_PROVIDENCE,
- SC_DEFENDER, //80
- SC_MAGICROD,
- SC_SPELLBREAKER,
- SC_AUTOSPELL,
- SC_SIGHTTRASHER,
- SC_AUTOBERSERK,
- SC_SPEARQUICKEN,
- SC_AUTOCOUNTER,
- SC_SIGHT,
- SC_SAFETYWALL,
- SC_RUWACH, //90
- SC_EXTREMITYFIST,
- SC_EXPLOSIONSPIRITS,
- SC_COMBO,
- SC_BLADESTOP_WAIT,
- SC_BLADESTOP,
- SC_FIREWEAPON,
- SC_WATERWEAPON,
- SC_WINDWEAPON,
- SC_EARTHWEAPON,
- SC_VOLCANO, //100,
- SC_DELUGE,
- SC_VIOLENTGALE,
- SC_WATK_ELEMENT,
- SC_ARMOR,
- SC_ARMOR_ELEMENT,
- SC_NOCHAT,
- SC_BABY,
- SC_AURABLADE,
- SC_PARRYING,
- SC_CONCENTRATION, //110
- SC_TENSIONRELAX,
- SC_BERSERK,
- SC_FURY,
- SC_GOSPEL,
- SC_ASSUMPTIO,
- SC_BASILICA,
- SC_GUILDAURA,
- SC_MAGICPOWER,
- SC_EDP,
- SC_TRUESIGHT, //120
- SC_WINDWALK,
- SC_MELTDOWN,
- SC_CARTBOOST,
- SC_CHASEWALK,
- SC_REJECTSWORD,
- SC_MARIONETTE,
- SC_MARIONETTE2,
- SC_UNUSED, //Unused (was SC_MOONLIT)
- SC_JOINTBEAT,
- SC_MINDBREAKER, //130
- SC_MEMORIZE,
- SC_FOGWALL,
- SC_SPIDERWEB,
- SC_DEVOTION,
- SC_SACRIFICE,
- SC_STEELBODY,
- SC_ORCISH,
- SC_READYSTORM,
- SC_READYDOWN,
- SC_READYTURN, //140
- SC_READYCOUNTER,
- SC_DODGE,
- SC_RUN,
- SC_SHADOWWEAPON,
- SC_ADRENALINE2,
- SC_GHOSTWEAPON,
- SC_KAIZEL,
- SC_KAAHI,
- SC_KAUPE,
- SC_ONEHAND, //150
- SC_PRESERVE,
- SC_BATTLEORDERS,
- SC_REGENERATION,
- SC_DOUBLECAST,
- SC_GRAVITATION,
- SC_MAXOVERTHRUST,
- SC_LONGING,
- SC_HERMODE,
- SC_SHRINK,
- SC_SIGHTBLASTER, //160
- SC_WINKCHARM,
- SC_CLOSECONFINE,
- SC_CLOSECONFINE2,
- SC_DANCING,
- SC_ELEMENTALCHANGE,
- SC_RICHMANKIM,
- SC_ETERNALCHAOS,
- SC_DRUMBATTLE,
- SC_NIBELUNGEN,
- SC_ROKISWEIL, //170
- SC_INTOABYSS,
- SC_SIEGFRIED,
- SC_WHISTLE,
- SC_ASSNCROS,
- SC_POEMBRAGI,
- SC_APPLEIDUN,
- SC_MODECHANGE,
- SC_HUMMING,
- SC_DONTFORGETME,
- SC_FORTUNE, //180
- SC_SERVICE4U,
- SC_STOP, //Prevents inflicted chars from walking. [Skotlex]
- SC_SPURT,
- SC_SPIRIT,
- SC_COMA, //Not a real SC_, it makes a char's HP/SP hit 1.
- SC_INTRAVISION,
- SC_INCALLSTATUS,
- SC_INCSTR,
- SC_INCAGI,
- SC_INCVIT, //190
- SC_INCINT,
- SC_INCDEX,
- SC_INCLUK,
- SC_INCHIT,
- SC_INCHITRATE,
- SC_INCFLEE,
- SC_INCFLEERATE,
- SC_INCMHPRATE,
- SC_INCMSPRATE,
- SC_INCATKRATE, //200
- SC_INCMATKRATE,
- SC_INCDEFRATE,
- SC_STRFOOD,
- SC_AGIFOOD,
- SC_VITFOOD,
- SC_INTFOOD,
- SC_DEXFOOD,
- SC_LUKFOOD,
- SC_HITFOOD,
- SC_FLEEFOOD, //210
- SC_BATKFOOD,
- SC_WATKFOOD,
- SC_MATKFOOD,
- SC_SCRESIST, //Increases resistance to status changes.
- SC_XMAS, // Xmas Suit [Valaris]
- SC_WARM, //SG skills [Komurka]
- SC_SUN_COMFORT,
- SC_MOON_COMFORT,
- SC_STAR_COMFORT,
- SC_FUSION, //220
- SC_SKILLRATE_UP,
- SC_SKE,
- SC_KAITE,
- SC_SWOO, // [marquis007]
- SC_SKA, // [marquis007]
- SC_TKREST, // [marquis007]
- SC_MIRACLE, //SG 'hidden' skill [Komurka]
- //Ninja/GS states
- SC_MADNESSCANCEL,
- SC_ADJUSTMENT,
- SC_INCREASING, //230
- SC_GATLINGFEVER,
- SC_TATAMIGAESHI,
- SC_UTSUSEMI,
- SC_BUNSINJYUTSU,
- SC_KAENSIN,
- SC_SUITON,
- SC_NEN,
- SC_KNOWLEDGE,
- SC_SMA,
- SC_FLING, //240
- SC_AVOID,
- SC_CHANGE,
- SC_BLOODLUST,
- SC_FLEET,
- SC_SPEED, //[orn]
- SC_DEFENCE, //[orn]
- SC_INCAGIRATE,
- SC_INCDEXRATE,
- SC_JAILED,
- SC_MAX, //Automatically updated max, used in for's and at startup to check we are within bounds. [Skotlex]
-};
-int SkillStatusChangeTable(int skill);
-extern int StatusSkillChangeTable[SC_MAX];
-
-//Numerates the Number for the status changes (client-dependent), imported from jA
-enum {
- SI_BLANK = -1,
- SI_PROVOKE = 0,
- SI_ENDURE = 1,
- SI_TWOHANDQUICKEN = 2,
- SI_CONCENTRATE = 3,
- SI_HIDING = 4,
- SI_CLOAKING = 5,
- SI_ENCPOISON = 6,
- SI_POISONREACT = 7,
- SI_QUAGMIRE = 8,
- SI_ANGELUS = 9,
- SI_BLESSING = 10,
- SI_SIGNUMCRUCIS = 11,
- SI_INCREASEAGI = 12,
- SI_DECREASEAGI = 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_AETERNA = 22,
- SI_ADRENALINE = 23,
- SI_WEAPONPERFECTION = 24,
- SI_OVERTHRUST = 25,
- SI_MAXIMIZEPOWER = 26,
- SI_RIDING = 27,
- SI_FALCON = 28,
- SI_TRICKDEAD = 29,
- SI_LOUD = 30,
- SI_ENERGYCOAT = 31,
- SI_BROKENARMOR = 32,
- SI_BROKENWEAPON = 33,
- SI_HALLUCINATION = 34,
- SI_WEIGHT50 = 35,
- SI_WEIGHT90 = 36,
- SI_ASPDPOTION = 37,
- //38: Again Aspd Potion
- //39: Again Aspd Potion
- //40: Again Aspd Potion
- SI_SPEEDPOTION1 = 41,
- SI_SPEEDPOTION2 = 42,
- SI_STRIPWEAPON = 50,
- SI_STRIPSHIELD = 51,
- SI_STRIPARMOR = 52,
- SI_STRIPHELM = 53,
- SI_CP_WEAPON = 54,
- SI_CP_SHIELD = 55,
- SI_CP_ARMOR = 56,
- SI_CP_HELM = 57,
- SI_AUTOGUARD = 58,
- SI_REFLECTSHIELD = 59,
- SI_PROVIDENCE = 61,
- SI_DEFENDER = 62,
- SI_AUTOSPELL = 65,
- SI_SPEARQUICKEN = 68,
- SI_EXPLOSIONSPIRITS = 86,
- SI_FURY = 87,
- SI_FIREWEAPON = 90,
- SI_WATERWEAPON = 91,
- SI_WINDWEAPON = 92,
- SI_EARTHWEAPON = 93,
-// 102 = again gloria - from what I saw on screenshots, I wonder if it isn't gospel... [DracoRPG]
- SI_AURABLADE = 103,
- SI_PARRYING = 104,
- SI_CONCENTRATION = 105,
- SI_TENSIONRELAX = 106,
- SI_BERSERK = 107,
- SI_ASSUMPTIO = 110,
- SI_LANDENDOW = 112,
- SI_MAGICPOWER = 113,
- SI_EDP = 114,
- SI_TRUESIGHT = 115,
- SI_WINDWALK = 116,
- SI_MELTDOWN = 117,
- SI_CARTBOOST = 118,
- //119, blank
- SI_REJECTSWORD = 120,
- SI_MARIONETTE = 121,
- SI_MARIONETTE2 = 122,
- SI_MOONLIT = 123,
- SI_BLEEDING = 124,
- SI_JOINTBEAT = 125,
- SI_DEVOTION = 130,
- SI_STEELBODY = 132,
- SI_RUN = 133,
- SI_BUMP = 134,
- SI_READYSTORM = 135,
- SI_READYDOWN = 137,
- SI_READYTURN = 139,
- SI_READYCOUNTER = 141,
- SI_DODGE = 143,
- //SI_RUN = 144, //is not RUN. need info on what this is.
- SI_SPURT = 145,
- SI_SHADOWWEAPON = 146,
- SI_ADRENALINE2 = 147,
- SI_GHOSTWEAPON = 148,
- SI_NIGHT = 149,
- SI_SPIRIT = 149,
- SI_DEVIL = 152,
- SI_KAITE = 153,
- SI_KAIZEL = 156,
- SI_KAAHI = 157,
- SI_KAUPE = 158,
- SI_SMA = 159,
-// 160
- SI_ONEHAND = 161,
- SI_WARM = 165,
-// 166 | The three show the exact same display: ultra red character (165, 166, 167)
-// 167 |
- SI_SUN_COMFORT = 169,
- SI_MOON_COMFORT = 170,
- SI_STAR_COMFORT = 171,
- SI_PRESERVE = 181,
- SI_INCSTR = 182,
- SI_INTRAVISION = 184, //WTF?? creates the black shape of 4_m_02 NPC, with NPC talk cursor. Supposedly intravision shows this.
- SI_DOUBLECAST = 186,
- SI_MAXOVERTHRUST = 188,
- SI_TAROT = 191, // the icon allows no doubt... but what is it really used for ?? [DracoRPG]
- SI_SHRINK = 197,
- SI_SIGHTBLASTER = 198,
- SI_WINKCHARM = 199,
- SI_CLOSECONFINE = 200,
- SI_CLOSECONFINE2 = 201,
- SI_MADNESSCANCEL = 203, //[blackhole89]
- SI_GATLINGFEVER = 204,
- SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
- SI_UTSUSEMI = 206,
- SI_BUNSINJYUTSU = 207,
- SI_NEN = 208,
- SI_ADJUSTMENT = 209,
- SI_ACCURACY = 210
-};
-
-extern int current_equip_item_index;
-extern int current_equip_card_id;
-
-extern int percentrefinery[5][MAX_REFINE+1]; //The last slot always has a 0% success chance [Skotlex]
-
-//Mode definitions to clear up code reading. [Skotlex]
-#define MD_CANMOVE 0x001
-#define MD_LOOTER 0x002
-//MD_ANGRY mobs are also aggressive.
-#define MD_AGGRESSIVE 0x804
-#define MD_ASSIST 0x008
-#define MD_CASTSENSOR 0x010
-#define MD_BOSS 0x020
-#define MD_PLANT 0x040
-#define MD_CANATTACK 0x080
-#define MD_DETECTOR 0x100
-#define MD_CHANGETARGET 0x200
-#define MD_CHANGECHASE 0x400
-#define MD_ANGRY 0x800
-#define MD_MASK 0xFFF
-
-//Status change option definitions (options are what makes status changes visible to chars
-//who were not on your field of sight when it happened)
-//opt1: Non stackable status changes.
-enum {
- OPT1_STONE = 1, //Petrified
- OPT1_FREEZE,
- OPT1_STUN,
- OPT1_SLEEP,
- //What is 5?
- OPT1_STONEWAIT=6 //Petrifying
-};
-
-//opt2: Stackable status changes.
-#define OPT2_POISON 0x001
-#define OPT2_CURSE 0x002
-#define OPT2_SILENCE 0x004
-#define OPT2_SIGNUMCRUCIS 0x008
-#define OPT2_BLIND 0x010
-//0x020 - nothing
-//0x040 - nothing
-#define OPT2_DPOISON 0x080
-//0x100
-
-#define OPTION_SIGHT 0x00000001
-#define OPTION_HIDE 0x00000002
-#define OPTION_CLOAK 0x00000004
-#define OPTION_CART1 0x00000008
-#define OPTION_FALCON 0x00000010
-#define OPTION_RIDING 0x00000020
-#define OPTION_INVISIBLE 0x00000040
-#define OPTION_CART2 0x00000080
-#define OPTION_CART3 0x00000100
-#define OPTION_CART4 0x00000200
-#define OPTION_CART5 0x00000400
-#define OPTION_ORCISH 0x00000800
-#define OPTION_WEDDING 0x00001000
-#define OPTION_RUWACH 0x00002000
-#define OPTION_CHASEWALK 0x00004000
-//Note that clientside Flying and Xmas are 0x8000!!
-#define OPTION_XMAS 0x00020000
-#define OPTION_FLYING 0x0008000
-//TODO: Get these Missing options...
-#define OPTION_SIGHTTRASHER 0x00010000
-
-#define OPTION_CART (OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5)
-
-//Defines for the manner system [Skotlex]
-#define MANNER_NOCHAT 0x01
-#define MANNER_NOSKILL 0x02
-#define MANNER_NOCOMMAND 0x04
-#define MANNER_NOITEM 0x08
-#define MANNER_NOROOM 0x10
-
-//Define flags for the status_calc_bl function. [Skotlex]
-#define SCB_NONE 0x00000000
-#define SCB_BASE 0x00000001
-#define SCB_MAXHP 0x00000002
-#define SCB_MAXSP 0x00000004
-#define SCB_STR 0x00000008
-#define SCB_AGI 0x00000010
-#define SCB_VIT 0x00000020
-#define SCB_INT 0x00000040
-#define SCB_DEX 0x00000080
-#define SCB_LUK 0x00000100
-#define SCB_BATK 0x00000200
-#define SCB_WATK 0x00000400
-#define SCB_MATK 0x00000800
-#define SCB_HIT 0x00001000
-#define SCB_FLEE 0x00002000
-#define SCB_DEF 0x00004000
-#define SCB_DEF2 0x00008000
-#define SCB_MDEF 0x00010000
-#define SCB_MDEF2 0x00020000
-#define SCB_SPEED 0x00040000
-#define SCB_ASPD 0x00080000
-#define SCB_DSPD 0x00100000
-#define SCB_CRI 0x00200000
-#define SCB_FLEE2 0x00400000
-#define SCB_ATK_ELE 0x00800000
-#define SCB_DEF_ELE 0x01000000
-#define SCB_MODE 0x02000000
-#define SCB_SIZE 0x04000000
-#define SCB_RACE 0x08000000
-#define SCB_RANGE 0x10000000
-#define SCB_REGEN 0x20000000
-//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
-#define SCB_DYE 0x40000000
-#define SCB_PC 0x80000000
-#define SCB_ALL 0x3FFFFFFF
-
-//Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex]
-#define BL_CONSUME (BL_PC|BL_HOM)
-//Define to determine who has regen
-#define BL_REGEN (BL_PC|BL_HOM)
-
-int status_damage(struct block_list *src,struct block_list *target,int hp,int sp, int walkdelay, int flag);
-//Define for standard HP damage attacks.
-#define status_fix_damage(src, target, hp, walkdelay) status_damage(src, target, hp, 0, walkdelay, 0)
-//Define for standard HP/SP damage triggers.
-#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1)
-//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills)
-#define status_charge(bl, hp, sp) (!((bl)->type&BL_CONSUME) || status_damage(NULL, bl, hp, sp, 0, 3))
-int status_percent_change(struct block_list *src,struct block_list *target,signed char hp_rate, signed char sp_rate, int flag);
-//Easier handling of status_percent_change
-#define status_percent_heal(bl, hp_rate, sp_rate) status_percent_change(NULL, bl, -(hp_rate), -(sp_rate), 1)
-#define status_percent_damage(src, target, hp_rate, sp_rate) status_percent_change(src, target, hp_rate, sp_rate, 0)
-//Instant kill with no drops/exp/etc
-//
-#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0)
-//Used to set the hp/sp of an object to an absolute value (can't kill)
-int status_set_hp(struct block_list *bl, unsigned int hp, int flag);
-int status_set_sp(struct block_list *bl, unsigned int sp, int flag);
-int status_heal(struct block_list *bl,int hp,int sp, int flag);
-int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp);
-
-//Define for copying a status_data structure from b to a, without overwriting current Hp and Sp, nor messing the lhw pointer.
-#define status_cpy(a, b) { memcpy(&((a)->max_hp), &((b)->max_hp), sizeof(struct status_data)-(sizeof((a)->hp)+sizeof((a)->sp)+sizeof((a)->lhw))); \
- if ((a)->lhw && (b)->lhw) { memcpy((a)->lhw, (b)->lhw, sizeof(struct weapon_atk)); }}
-
-struct regen_data *status_get_regen_data(struct block_list *bl);
-struct status_data *status_get_status_data(struct block_list *bl);
-struct status_data *status_get_base_status(struct block_list *bl);
-const char * status_get_name(struct block_list *bl);
-int status_get_class(struct block_list *bl);
-int status_get_lv(struct block_list *bl);
-#define status_get_range(bl) status_get_status_data(bl)->rhw.range
-#define status_get_hp(bl) status_get_status_data(bl)->hp
-#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
-#define status_get_sp(bl) status_get_status_data(bl)->sp
-#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
-#define status_get_str(bl) status_get_status_data(bl)->str
-#define status_get_agi(bl) status_get_status_data(bl)->agi
-#define status_get_vit(bl) status_get_status_data(bl)->vit
-#define status_get_int(bl) status_get_status_data(bl)->int_
-#define status_get_dex(bl) status_get_status_data(bl)->dex
-#define status_get_luk(bl) status_get_status_data(bl)->luk
-#define status_get_hit(bl) status_get_status_data(bl)->hit
-#define status_get_flee(bl) status_get_status_data(bl)->flee
-unsigned char status_get_def(struct block_list *bl);
-#define status_get_mdef(bl) status_get_status_data(bl)->mdef
-#define status_get_flee2(bl) status_get_status_data(bl)->flee2
-#define status_get_def2(bl) status_get_status_data(bl)->def2
-#define status_get_mdef2(bl) status_get_status_data(bl)->mdef2
-#define status_get_critical(bl) status_get_status_data(bl)->cri
-#define status_get_batk(bl) status_get_status_data(bl)->batk
-#define status_get_watk(bl) status_get_status_data(bl)->rhw.atk
-#define status_get_watk2(bl) status_get_status_data(bl)->rhw.atk2
-#define status_get_matk_max(bl) status_get_status_data(bl)->matk_max
-#define status_get_matk_min(bl) status_get_status_data(bl)->matk_min
-unsigned short status_get_lwatk(struct block_list *bl);
-unsigned short status_get_lwatk2(struct block_list *bl);
-unsigned short status_get_speed(struct block_list *bl);
-#define status_get_adelay(bl) status_get_status_data(bl)->adelay
-#define status_get_amotion(bl) status_get_status_data(bl)->amotion
-#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
-#define status_get_element(bl) status_get_status_data(bl)->def_ele
-#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
-unsigned char status_calc_attack_element(struct block_list *bl, struct status_change *sc, int element);
-#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
-#define status_get_attack_element(bl) status_get_status_data(bl)->rhw.ele
-unsigned char status_get_attack_lelement(struct block_list *bl);
-#define status_get_race(bl) status_get_status_data(bl)->race
-#define status_get_size(bl) status_get_status_data(bl)->size
-#define status_get_mode(bl) status_get_status_data(bl)->mode
-int status_get_party_id(struct block_list *bl);
-int status_get_guild_id(struct block_list *bl);
-int status_get_mexp(struct block_list *bl);
-int status_get_race2(struct block_list *bl);
-
-struct view_data *status_get_viewdata(struct block_list *bl);
-void status_set_viewdata(struct block_list *bl, int class_);
-void status_change_init(struct block_list *bl);
-struct status_change *status_get_sc(struct block_list *bl);
-
-int status_isdead(struct block_list *bl);
-int status_isimmune(struct block_list *bl);
-
-int status_get_sc_def(struct block_list *bl, int type);
-#define status_get_sc_def_mdef(bl) (status_get_sc_def(bl, SP_MDEF1))
-#define status_get_sc_def_vit(bl) (status_get_sc_def(bl, SP_DEF2))
-#define status_get_sc_def_int(bl) (status_get_sc_def(bl, SP_MDEF2))
-#define status_get_sc_def_luk(bl) (status_get_sc_def(bl, SP_LUK))
-
-//Short version, receives rate in 1->100 range, and does not uses a flag setting.
-#define sc_start(bl, type, rate, val1, tick) status_change_start(bl,type,100*(rate),val1,0,0,0,tick,0)
-#define sc_start4(bl, type, rate, val1, val2, val3, val4, tick) status_change_start(bl,type,100*(rate),val1,val2,val3,val4,tick,0)
-
-int status_change_start(struct block_list *bl,int type,int rate,int val1,int val2,int val3,int val4,int tick,int flag);
-int status_change_end( struct block_list* bl , int type,int tid );
-int kaahi_heal_timer(int tid, unsigned int tick, int id, int data);
-int status_change_timer(int tid, unsigned int tick, int id, int data);
-int status_change_timer_sub(struct block_list *bl, va_list ap );
-int status_change_clear(struct block_list *bl,int type);
-int status_change_clear_buffs(struct block_list *bl, int type);
-
-void status_calc_bl(struct block_list *bl, unsigned long flag);
-int status_calc_pet(struct pet_data* pd, int first); // [Skotlex]
-int status_calc_pc(struct map_session_data* sd,int first);
-int status_calc_mob(struct mob_data* md, int first); //[Skotlex]
-int status_calc_homunculus(struct homun_data *hd, int first);
-void status_calc_misc(struct block_list *bl, struct status_data *status, int level);
-void status_calc_regen(struct block_list *bl, struct status_data *status, struct regen_data *regen);
-void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, struct status_change *sc);
-
-void status_freecast_switch(struct map_session_data *sd);
-int status_getrefinebonus(int lv,int type);
-int status_check_skilluse(struct block_list *src, struct block_list *target, int skill_num, int flag); // [Skotlex]
-int status_check_visibility(struct block_list *src, struct block_list *target); //[Skotlex]
-
-int status_readdb(void);
-int do_init_status(void);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _STATUS_H_
+#define _STATUS_H_
+
+#include "map.h"
+
+//Use this to refer the max refinery level [Skotlex]
+#define MAX_REFINE 10
+#define MAX_REFINE_BONUS 5
+
+extern unsigned long StatusChangeFlagTable[];
+
+// Status changes listing. These code are for use by the server.
+enum {
+ //First we enumerate common status ailments which are often used around.
+ SC_STONE = 0,
+ SC_FREEZE,
+ SC_STUN,
+ SC_SLEEP,
+ SC_POISON,
+ SC_CURSE,
+ SC_SILENCE,
+ SC_CONFUSION,
+ SC_BLIND,
+ SC_BLEEDING,
+ SC_DPOISON, //10
+
+ //Next up, we continue on 20, to leave enough room for additional "common" ailments in the future.
+ SC_PROVOKE = 20,
+ SC_ENDURE,
+ SC_TWOHANDQUICKEN,
+ SC_CONCENTRATE,
+ SC_HIDING,
+ SC_CLOAKING,
+ SC_ENCPOISON,
+ SC_POISONREACT,
+ SC_QUAGMIRE,
+ SC_ANGELUS,
+ SC_BLESSING, //30
+ SC_SIGNUMCRUCIS,
+ SC_INCREASEAGI,
+ SC_DECREASEAGI,
+ SC_SLOWPOISON,
+ SC_IMPOSITIO ,
+ SC_SUFFRAGIUM,
+ SC_ASPERSIO,
+ SC_BENEDICTIO,
+ SC_KYRIE,
+ SC_MAGNIFICAT, //40
+ SC_GLORIA,
+ SC_AETERNA,
+ SC_ADRENALINE,
+ SC_WEAPONPERFECTION,
+ SC_OVERTHRUST,
+ SC_MAXIMIZEPOWER,
+ SC_TRICKDEAD,
+ SC_LOUD,
+ SC_ENERGYCOAT,
+ SC_BROKENARMOR, //50 - NOTE: These two aren't used anywhere, and they have an icon...
+ SC_BROKENWEAPON,
+ SC_HALLUCINATION,
+ SC_WEIGHT50,
+ SC_WEIGHT90,
+ SC_ASPDPOTION0,
+ SC_ASPDPOTION1,
+ SC_ASPDPOTION2,
+ SC_ASPDPOTION3,
+ SC_SPEEDUP0,
+ SC_SPEEDUP1, //60
+ SC_ATKPOTION,
+ SC_MATKPOTION,
+ SC_WEDDING,
+ SC_SLOWDOWN,
+ SC_ANKLE,
+ SC_KEEPING,
+ SC_BARRIER,
+ SC_STRIPWEAPON,
+ SC_STRIPSHIELD,
+ SC_STRIPARMOR, //70
+ SC_STRIPHELM,
+ SC_CP_WEAPON,
+ SC_CP_SHIELD,
+ SC_CP_ARMOR,
+ SC_CP_HELM,
+ SC_AUTOGUARD,
+ SC_REFLECTSHIELD,
+ SC_SPLASHER,
+ SC_PROVIDENCE,
+ SC_DEFENDER, //80
+ SC_MAGICROD,
+ SC_SPELLBREAKER,
+ SC_AUTOSPELL,
+ SC_SIGHTTRASHER,
+ SC_AUTOBERSERK,
+ SC_SPEARQUICKEN,
+ SC_AUTOCOUNTER,
+ SC_SIGHT,
+ SC_SAFETYWALL,
+ SC_RUWACH, //90
+ SC_EXTREMITYFIST,
+ SC_EXPLOSIONSPIRITS,
+ SC_COMBO,
+ SC_BLADESTOP_WAIT,
+ SC_BLADESTOP,
+ SC_FIREWEAPON,
+ SC_WATERWEAPON,
+ SC_WINDWEAPON,
+ SC_EARTHWEAPON,
+ SC_VOLCANO, //100,
+ SC_DELUGE,
+ SC_VIOLENTGALE,
+ SC_WATK_ELEMENT,
+ SC_ARMOR,
+ SC_ARMOR_ELEMENT,
+ SC_NOCHAT,
+ SC_BABY,
+ SC_AURABLADE,
+ SC_PARRYING,
+ SC_CONCENTRATION, //110
+ SC_TENSIONRELAX,
+ SC_BERSERK,
+ SC_FURY,
+ SC_GOSPEL,
+ SC_ASSUMPTIO,
+ SC_BASILICA,
+ SC_GUILDAURA,
+ SC_MAGICPOWER,
+ SC_EDP,
+ SC_TRUESIGHT, //120
+ SC_WINDWALK,
+ SC_MELTDOWN,
+ SC_CARTBOOST,
+ SC_CHASEWALK,
+ SC_REJECTSWORD,
+ SC_MARIONETTE,
+ SC_MARIONETTE2,
+ SC_UNUSED, //Unused (was SC_MOONLIT)
+ SC_JOINTBEAT,
+ SC_MINDBREAKER, //130
+ SC_MEMORIZE,
+ SC_FOGWALL,
+ SC_SPIDERWEB,
+ SC_DEVOTION,
+ SC_SACRIFICE,
+ SC_STEELBODY,
+ SC_ORCISH,
+ SC_READYSTORM,
+ SC_READYDOWN,
+ SC_READYTURN, //140
+ SC_READYCOUNTER,
+ SC_DODGE,
+ SC_RUN,
+ SC_SHADOWWEAPON,
+ SC_ADRENALINE2,
+ SC_GHOSTWEAPON,
+ SC_KAIZEL,
+ SC_KAAHI,
+ SC_KAUPE,
+ SC_ONEHAND, //150
+ SC_PRESERVE,
+ SC_BATTLEORDERS,
+ SC_REGENERATION,
+ SC_DOUBLECAST,
+ SC_GRAVITATION,
+ SC_MAXOVERTHRUST,
+ SC_LONGING,
+ SC_HERMODE,
+ SC_SHRINK,
+ SC_SIGHTBLASTER, //160
+ SC_WINKCHARM,
+ SC_CLOSECONFINE,
+ SC_CLOSECONFINE2,
+ SC_DANCING,
+ SC_ELEMENTALCHANGE,
+ SC_RICHMANKIM,
+ SC_ETERNALCHAOS,
+ SC_DRUMBATTLE,
+ SC_NIBELUNGEN,
+ SC_ROKISWEIL, //170
+ SC_INTOABYSS,
+ SC_SIEGFRIED,
+ SC_WHISTLE,
+ SC_ASSNCROS,
+ SC_POEMBRAGI,
+ SC_APPLEIDUN,
+ SC_MODECHANGE,
+ SC_HUMMING,
+ SC_DONTFORGETME,
+ SC_FORTUNE, //180
+ SC_SERVICE4U,
+ SC_STOP, //Prevents inflicted chars from walking. [Skotlex]
+ SC_SPURT,
+ SC_SPIRIT,
+ SC_COMA, //Not a real SC_, it makes a char's HP/SP hit 1.
+ SC_INTRAVISION,
+ SC_INCALLSTATUS,
+ SC_INCSTR,
+ SC_INCAGI,
+ SC_INCVIT, //190
+ SC_INCINT,
+ SC_INCDEX,
+ SC_INCLUK,
+ SC_INCHIT,
+ SC_INCHITRATE,
+ SC_INCFLEE,
+ SC_INCFLEERATE,
+ SC_INCMHPRATE,
+ SC_INCMSPRATE,
+ SC_INCATKRATE, //200
+ SC_INCMATKRATE,
+ SC_INCDEFRATE,
+ SC_STRFOOD,
+ SC_AGIFOOD,
+ SC_VITFOOD,
+ SC_INTFOOD,
+ SC_DEXFOOD,
+ SC_LUKFOOD,
+ SC_HITFOOD,
+ SC_FLEEFOOD, //210
+ SC_BATKFOOD,
+ SC_WATKFOOD,
+ SC_MATKFOOD,
+ SC_SCRESIST, //Increases resistance to status changes.
+ SC_XMAS, // Xmas Suit [Valaris]
+ SC_WARM, //SG skills [Komurka]
+ SC_SUN_COMFORT,
+ SC_MOON_COMFORT,
+ SC_STAR_COMFORT,
+ SC_FUSION, //220
+ SC_SKILLRATE_UP,
+ SC_SKE,
+ SC_KAITE,
+ SC_SWOO, // [marquis007]
+ SC_SKA, // [marquis007]
+ SC_TKREST, // [marquis007]
+ SC_MIRACLE, //SG 'hidden' skill [Komurka]
+ //Ninja/GS states
+ SC_MADNESSCANCEL,
+ SC_ADJUSTMENT,
+ SC_INCREASING, //230
+ SC_GATLINGFEVER,
+ SC_TATAMIGAESHI,
+ SC_UTSUSEMI,
+ SC_BUNSINJYUTSU,
+ SC_KAENSIN,
+ SC_SUITON,
+ SC_NEN,
+ SC_KNOWLEDGE,
+ SC_SMA,
+ SC_FLING, //240
+ SC_AVOID,
+ SC_CHANGE,
+ SC_BLOODLUST,
+ SC_FLEET,
+ SC_SPEED, //[orn]
+ SC_DEFENCE, //[orn]
+ SC_INCAGIRATE,
+ SC_INCDEXRATE,
+ SC_JAILED,
+ SC_MAX, //Automatically updated max, used in for's and at startup to check we are within bounds. [Skotlex]
+};
+int SkillStatusChangeTable(int skill);
+extern int StatusSkillChangeTable[SC_MAX];
+
+//Numerates the Number for the status changes (client-dependent), imported from jA
+enum {
+ SI_BLANK = -1,
+ SI_PROVOKE = 0,
+ SI_ENDURE = 1,
+ SI_TWOHANDQUICKEN = 2,
+ SI_CONCENTRATE = 3,
+ SI_HIDING = 4,
+ SI_CLOAKING = 5,
+ SI_ENCPOISON = 6,
+ SI_POISONREACT = 7,
+ SI_QUAGMIRE = 8,
+ SI_ANGELUS = 9,
+ SI_BLESSING = 10,
+ SI_SIGNUMCRUCIS = 11,
+ SI_INCREASEAGI = 12,
+ SI_DECREASEAGI = 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_AETERNA = 22,
+ SI_ADRENALINE = 23,
+ SI_WEAPONPERFECTION = 24,
+ SI_OVERTHRUST = 25,
+ SI_MAXIMIZEPOWER = 26,
+ SI_RIDING = 27,
+ SI_FALCON = 28,
+ SI_TRICKDEAD = 29,
+ SI_LOUD = 30,
+ SI_ENERGYCOAT = 31,
+ SI_BROKENARMOR = 32,
+ SI_BROKENWEAPON = 33,
+ SI_HALLUCINATION = 34,
+ SI_WEIGHT50 = 35,
+ SI_WEIGHT90 = 36,
+ SI_ASPDPOTION = 37,
+ //38: Again Aspd Potion
+ //39: Again Aspd Potion
+ //40: Again Aspd Potion
+ SI_SPEEDPOTION1 = 41,
+ SI_SPEEDPOTION2 = 42,
+ SI_STRIPWEAPON = 50,
+ SI_STRIPSHIELD = 51,
+ SI_STRIPARMOR = 52,
+ SI_STRIPHELM = 53,
+ SI_CP_WEAPON = 54,
+ SI_CP_SHIELD = 55,
+ SI_CP_ARMOR = 56,
+ SI_CP_HELM = 57,
+ SI_AUTOGUARD = 58,
+ SI_REFLECTSHIELD = 59,
+ SI_PROVIDENCE = 61,
+ SI_DEFENDER = 62,
+ SI_AUTOSPELL = 65,
+ SI_SPEARQUICKEN = 68,
+ SI_EXPLOSIONSPIRITS = 86,
+ SI_FURY = 87,
+ SI_FIREWEAPON = 90,
+ SI_WATERWEAPON = 91,
+ SI_WINDWEAPON = 92,
+ SI_EARTHWEAPON = 93,
+// 102 = again gloria - from what I saw on screenshots, I wonder if it isn't gospel... [DracoRPG]
+ SI_AURABLADE = 103,
+ SI_PARRYING = 104,
+ SI_CONCENTRATION = 105,
+ SI_TENSIONRELAX = 106,
+ SI_BERSERK = 107,
+ SI_ASSUMPTIO = 110,
+ SI_LANDENDOW = 112,
+ SI_MAGICPOWER = 113,
+ SI_EDP = 114,
+ SI_TRUESIGHT = 115,
+ SI_WINDWALK = 116,
+ SI_MELTDOWN = 117,
+ SI_CARTBOOST = 118,
+ //119, blank
+ SI_REJECTSWORD = 120,
+ SI_MARIONETTE = 121,
+ SI_MARIONETTE2 = 122,
+ SI_MOONLIT = 123,
+ SI_BLEEDING = 124,
+ SI_JOINTBEAT = 125,
+ SI_DEVOTION = 130,
+ SI_STEELBODY = 132,
+ SI_RUN = 133,
+ SI_BUMP = 134,
+ SI_READYSTORM = 135,
+ SI_READYDOWN = 137,
+ SI_READYTURN = 139,
+ SI_READYCOUNTER = 141,
+ SI_DODGE = 143,
+ //SI_RUN = 144, //is not RUN. need info on what this is.
+ SI_SPURT = 145,
+ SI_SHADOWWEAPON = 146,
+ SI_ADRENALINE2 = 147,
+ SI_GHOSTWEAPON = 148,
+ SI_NIGHT = 149,
+ SI_SPIRIT = 149,
+ SI_DEVIL = 152,
+ SI_KAITE = 153,
+ SI_KAIZEL = 156,
+ SI_KAAHI = 157,
+ SI_KAUPE = 158,
+ SI_SMA = 159,
+// 160
+ SI_ONEHAND = 161,
+ SI_WARM = 165,
+// 166 | The three show the exact same display: ultra red character (165, 166, 167)
+// 167 |
+ SI_SUN_COMFORT = 169,
+ SI_MOON_COMFORT = 170,
+ SI_STAR_COMFORT = 171,
+ SI_PRESERVE = 181,
+ SI_INCSTR = 182,
+ SI_INTRAVISION = 184, //WTF?? creates the black shape of 4_m_02 NPC, with NPC talk cursor. Supposedly intravision shows this.
+ SI_DOUBLECAST = 186,
+ SI_MAXOVERTHRUST = 188,
+ SI_TAROT = 191, // the icon allows no doubt... but what is it really used for ?? [DracoRPG]
+ SI_SHRINK = 197,
+ SI_SIGHTBLASTER = 198,
+ SI_WINKCHARM = 199,
+ SI_CLOSECONFINE = 200,
+ SI_CLOSECONFINE2 = 201,
+ SI_MADNESSCANCEL = 203, //[blackhole89]
+ SI_GATLINGFEVER = 204,
+ SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
+ SI_UTSUSEMI = 206,
+ SI_BUNSINJYUTSU = 207,
+ SI_NEN = 208,
+ SI_ADJUSTMENT = 209,
+ SI_ACCURACY = 210
+};
+
+extern int current_equip_item_index;
+extern int current_equip_card_id;
+
+extern int percentrefinery[5][MAX_REFINE+1]; //The last slot always has a 0% success chance [Skotlex]
+
+//Mode definitions to clear up code reading. [Skotlex]
+#define MD_CANMOVE 0x001
+#define MD_LOOTER 0x002
+//MD_ANGRY mobs are also aggressive.
+#define MD_AGGRESSIVE 0x804
+#define MD_ASSIST 0x008
+#define MD_CASTSENSOR 0x010
+#define MD_BOSS 0x020
+#define MD_PLANT 0x040
+#define MD_CANATTACK 0x080
+#define MD_DETECTOR 0x100
+#define MD_CHANGETARGET 0x200
+#define MD_CHANGECHASE 0x400
+#define MD_ANGRY 0x800
+#define MD_MASK 0xFFF
+
+//Status change option definitions (options are what makes status changes visible to chars
+//who were not on your field of sight when it happened)
+//opt1: Non stackable status changes.
+enum {
+ OPT1_STONE = 1, //Petrified
+ OPT1_FREEZE,
+ OPT1_STUN,
+ OPT1_SLEEP,
+ //What is 5?
+ OPT1_STONEWAIT=6 //Petrifying
+};
+
+//opt2: Stackable status changes.
+#define OPT2_POISON 0x001
+#define OPT2_CURSE 0x002
+#define OPT2_SILENCE 0x004
+#define OPT2_SIGNUMCRUCIS 0x008
+#define OPT2_BLIND 0x010
+//0x020 - nothing
+//0x040 - nothing
+#define OPT2_DPOISON 0x080
+//0x100
+
+#define OPTION_SIGHT 0x00000001
+#define OPTION_HIDE 0x00000002
+#define OPTION_CLOAK 0x00000004
+#define OPTION_CART1 0x00000008
+#define OPTION_FALCON 0x00000010
+#define OPTION_RIDING 0x00000020
+#define OPTION_INVISIBLE 0x00000040
+#define OPTION_CART2 0x00000080
+#define OPTION_CART3 0x00000100
+#define OPTION_CART4 0x00000200
+#define OPTION_CART5 0x00000400
+#define OPTION_ORCISH 0x00000800
+#define OPTION_WEDDING 0x00001000
+#define OPTION_RUWACH 0x00002000
+#define OPTION_CHASEWALK 0x00004000
+//Note that clientside Flying and Xmas are 0x8000!!
+#define OPTION_XMAS 0x00020000
+#define OPTION_FLYING 0x0008000
+//TODO: Get these Missing options...
+#define OPTION_SIGHTTRASHER 0x00010000
+
+#define OPTION_CART (OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5)
+
+//Defines for the manner system [Skotlex]
+#define MANNER_NOCHAT 0x01
+#define MANNER_NOSKILL 0x02
+#define MANNER_NOCOMMAND 0x04
+#define MANNER_NOITEM 0x08
+#define MANNER_NOROOM 0x10
+
+//Define flags for the status_calc_bl function. [Skotlex]
+#define SCB_NONE 0x00000000
+#define SCB_BASE 0x00000001
+#define SCB_MAXHP 0x00000002
+#define SCB_MAXSP 0x00000004
+#define SCB_STR 0x00000008
+#define SCB_AGI 0x00000010
+#define SCB_VIT 0x00000020
+#define SCB_INT 0x00000040
+#define SCB_DEX 0x00000080
+#define SCB_LUK 0x00000100
+#define SCB_BATK 0x00000200
+#define SCB_WATK 0x00000400
+#define SCB_MATK 0x00000800
+#define SCB_HIT 0x00001000
+#define SCB_FLEE 0x00002000
+#define SCB_DEF 0x00004000
+#define SCB_DEF2 0x00008000
+#define SCB_MDEF 0x00010000
+#define SCB_MDEF2 0x00020000
+#define SCB_SPEED 0x00040000
+#define SCB_ASPD 0x00080000
+#define SCB_DSPD 0x00100000
+#define SCB_CRI 0x00200000
+#define SCB_FLEE2 0x00400000
+#define SCB_ATK_ELE 0x00800000
+#define SCB_DEF_ELE 0x01000000
+#define SCB_MODE 0x02000000
+#define SCB_SIZE 0x04000000
+#define SCB_RACE 0x08000000
+#define SCB_RANGE 0x10000000
+#define SCB_REGEN 0x20000000
+//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
+#define SCB_DYE 0x40000000
+#define SCB_PC 0x80000000
+#define SCB_ALL 0x3FFFFFFF
+
+//Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex]
+#define BL_CONSUME (BL_PC|BL_HOM)
+//Define to determine who has regen
+#define BL_REGEN (BL_PC|BL_HOM)
+
+int status_damage(struct block_list *src,struct block_list *target,int hp,int sp, int walkdelay, int flag);
+//Define for standard HP damage attacks.
+#define status_fix_damage(src, target, hp, walkdelay) status_damage(src, target, hp, 0, walkdelay, 0)
+//Define for standard HP/SP damage triggers.
+#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1)
+//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills)
+#define status_charge(bl, hp, sp) (!((bl)->type&BL_CONSUME) || status_damage(NULL, bl, hp, sp, 0, 3))
+int status_percent_change(struct block_list *src,struct block_list *target,signed char hp_rate, signed char sp_rate, int flag);
+//Easier handling of status_percent_change
+#define status_percent_heal(bl, hp_rate, sp_rate) status_percent_change(NULL, bl, -(hp_rate), -(sp_rate), 1)
+#define status_percent_damage(src, target, hp_rate, sp_rate) status_percent_change(src, target, hp_rate, sp_rate, 0)
+//Instant kill with no drops/exp/etc
+//
+#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0)
+//Used to set the hp/sp of an object to an absolute value (can't kill)
+int status_set_hp(struct block_list *bl, unsigned int hp, int flag);
+int status_set_sp(struct block_list *bl, unsigned int sp, int flag);
+int status_heal(struct block_list *bl,int hp,int sp, int flag);
+int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp);
+
+//Define for copying a status_data structure from b to a, without overwriting current Hp and Sp, nor messing the lhw pointer.
+#define status_cpy(a, b) { memcpy(&((a)->max_hp), &((b)->max_hp), sizeof(struct status_data)-(sizeof((a)->hp)+sizeof((a)->sp)+sizeof((a)->lhw))); \
+ if ((a)->lhw && (b)->lhw) { memcpy((a)->lhw, (b)->lhw, sizeof(struct weapon_atk)); }}
+
+struct regen_data *status_get_regen_data(struct block_list *bl);
+struct status_data *status_get_status_data(struct block_list *bl);
+struct status_data *status_get_base_status(struct block_list *bl);
+const char * status_get_name(struct block_list *bl);
+int status_get_class(struct block_list *bl);
+int status_get_lv(struct block_list *bl);
+#define status_get_range(bl) status_get_status_data(bl)->rhw.range
+#define status_get_hp(bl) status_get_status_data(bl)->hp
+#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
+#define status_get_sp(bl) status_get_status_data(bl)->sp
+#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
+#define status_get_str(bl) status_get_status_data(bl)->str
+#define status_get_agi(bl) status_get_status_data(bl)->agi
+#define status_get_vit(bl) status_get_status_data(bl)->vit
+#define status_get_int(bl) status_get_status_data(bl)->int_
+#define status_get_dex(bl) status_get_status_data(bl)->dex
+#define status_get_luk(bl) status_get_status_data(bl)->luk
+#define status_get_hit(bl) status_get_status_data(bl)->hit
+#define status_get_flee(bl) status_get_status_data(bl)->flee
+unsigned char status_get_def(struct block_list *bl);
+#define status_get_mdef(bl) status_get_status_data(bl)->mdef
+#define status_get_flee2(bl) status_get_status_data(bl)->flee2
+#define status_get_def2(bl) status_get_status_data(bl)->def2
+#define status_get_mdef2(bl) status_get_status_data(bl)->mdef2
+#define status_get_critical(bl) status_get_status_data(bl)->cri
+#define status_get_batk(bl) status_get_status_data(bl)->batk
+#define status_get_watk(bl) status_get_status_data(bl)->rhw.atk
+#define status_get_watk2(bl) status_get_status_data(bl)->rhw.atk2
+#define status_get_matk_max(bl) status_get_status_data(bl)->matk_max
+#define status_get_matk_min(bl) status_get_status_data(bl)->matk_min
+unsigned short status_get_lwatk(struct block_list *bl);
+unsigned short status_get_lwatk2(struct block_list *bl);
+unsigned short status_get_speed(struct block_list *bl);
+#define status_get_adelay(bl) status_get_status_data(bl)->adelay
+#define status_get_amotion(bl) status_get_status_data(bl)->amotion
+#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
+#define status_get_element(bl) status_get_status_data(bl)->def_ele
+#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
+unsigned char status_calc_attack_element(struct block_list *bl, struct status_change *sc, int element);
+#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
+#define status_get_attack_element(bl) status_get_status_data(bl)->rhw.ele
+unsigned char status_get_attack_lelement(struct block_list *bl);
+#define status_get_race(bl) status_get_status_data(bl)->race
+#define status_get_size(bl) status_get_status_data(bl)->size
+#define status_get_mode(bl) status_get_status_data(bl)->mode
+int status_get_party_id(struct block_list *bl);
+int status_get_guild_id(struct block_list *bl);
+int status_get_mexp(struct block_list *bl);
+int status_get_race2(struct block_list *bl);
+
+struct view_data *status_get_viewdata(struct block_list *bl);
+void status_set_viewdata(struct block_list *bl, int class_);
+void status_change_init(struct block_list *bl);
+struct status_change *status_get_sc(struct block_list *bl);
+
+int status_isdead(struct block_list *bl);
+int status_isimmune(struct block_list *bl);
+
+int status_get_sc_def(struct block_list *bl, int type);
+#define status_get_sc_def_mdef(bl) (status_get_sc_def(bl, SP_MDEF1))
+#define status_get_sc_def_vit(bl) (status_get_sc_def(bl, SP_DEF2))
+#define status_get_sc_def_int(bl) (status_get_sc_def(bl, SP_MDEF2))
+#define status_get_sc_def_luk(bl) (status_get_sc_def(bl, SP_LUK))
+
+//Short version, receives rate in 1->100 range, and does not uses a flag setting.
+#define sc_start(bl, type, rate, val1, tick) status_change_start(bl,type,100*(rate),val1,0,0,0,tick,0)
+#define sc_start4(bl, type, rate, val1, val2, val3, val4, tick) status_change_start(bl,type,100*(rate),val1,val2,val3,val4,tick,0)
+
+int status_change_start(struct block_list *bl,int type,int rate,int val1,int val2,int val3,int val4,int tick,int flag);
+int status_change_end( struct block_list* bl , int type,int tid );
+int kaahi_heal_timer(int tid, unsigned int tick, int id, int data);
+int status_change_timer(int tid, unsigned int tick, int id, int data);
+int status_change_timer_sub(struct block_list *bl, va_list ap );
+int status_change_clear(struct block_list *bl,int type);
+int status_change_clear_buffs(struct block_list *bl, int type);
+
+void status_calc_bl(struct block_list *bl, unsigned long flag);
+int status_calc_pet(struct pet_data* pd, int first); // [Skotlex]
+int status_calc_pc(struct map_session_data* sd,int first);
+int status_calc_mob(struct mob_data* md, int first); //[Skotlex]
+int status_calc_homunculus(struct homun_data *hd, int first);
+void status_calc_misc(struct block_list *bl, struct status_data *status, int level);
+void status_calc_regen(struct block_list *bl, struct status_data *status, struct regen_data *regen);
+void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, struct status_change *sc);
+
+void status_freecast_switch(struct map_session_data *sd);
+int status_getrefinebonus(int lv,int type);
+int status_check_skilluse(struct block_list *src, struct block_list *target, int skill_num, int flag); // [Skotlex]
+int status_check_visibility(struct block_list *src, struct block_list *target); //[Skotlex]
+
+int status_readdb(void);
+int do_init_status(void);
+
+#endif
diff --git a/src/map/storage.c b/src/map/storage.c
index 6f504eab3..ba44f0f0d 100644
--- a/src/map/storage.c
+++ b/src/map/storage.c
@@ -1,761 +1,761 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-#include "storage.h"
-#include "chrif.h"
-#include "itemdb.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "guild.h"
-#include "battle.h"
-#include "atcommand.h"
-
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
-
-/*==========================================
- * ‘qŒÉ“àƒAƒCƒeƒ€ƒ\[ƒg
- *------------------------------------------
- */
-int storage_comp_item(const void *_i1, const void *_i2)
-{
- struct item *i1 = (struct item *)_i1;
- struct item *i2 = (struct item *)_i2;
-
- if (i1->nameid == i2->nameid)
- return 0;
- else if (!(i1->nameid) || !(i1->amount))
- return 1;
- else if (!(i2->nameid) || !(i2->amount))
- return -1;
- return i1->nameid - i2->nameid;
-}
-
-void sortage_sortitem (struct storage *stor)
-{
- nullpo_retv(stor);
- qsort(stor->storage_, MAX_STORAGE, sizeof(struct item), storage_comp_item);
-}
-
-void sortage_gsortitem (struct guild_storage* gstor)
-{
- nullpo_retv(gstor);
- qsort(gstor->storage_, MAX_GUILD_STORAGE, sizeof(struct item), storage_comp_item);
-}
-
-/*==========================================
- * ‰Šú‰»‚Æ‚©
- *------------------------------------------
- */
-int do_init_storage(void) // map.c::do_init()‚©‚çŒÄ‚΂ê‚é
-{
- storage_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- guild_storage_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
- return 1;
-}
-void do_final_storage(void) // by [MC Cameri]
-{
- storage_db->destroy(storage_db,NULL);
- guild_storage_db->destroy(guild_storage_db,NULL);
-}
-
-
-static int storage_reconnect_sub(DBKey key,void *data,va_list ap)
-{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex]
- int type = va_arg(ap, int);
- if (type)
- { //Guild Storage
- struct guild_storage* stor = (struct guild_storage*) data;
- if (stor->dirty && stor->storage_status == 0) //Save closed storages.
- storage_guild_storagesave(0, stor->guild_id,0);
- }
- else
- { //Account Storage
- struct storage* stor = (struct storage*) data;
- if (stor->dirty && stor->storage_status == 0) //Save closed storages.
- storage_storage_save(stor->account_id, stor->dirty==2?1:0);
- }
- return 0;
-}
-
-//Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex
-void do_reconnect_storage(void)
-{
- storage_db->foreach(storage_db, storage_reconnect_sub, 0);
- guild_storage_db->foreach(guild_storage_db, storage_reconnect_sub, 1);
-}
-
-static void* create_storage(DBKey key, va_list args) {
- struct storage *stor;
- stor = (struct storage *) aCallocA (sizeof(struct storage), 1);
- stor->account_id = key.i;
- return stor;
-}
-struct storage *account2storage(int account_id)
-{
- return idb_ensure(storage_db,account_id,create_storage);
-}
-
-// Just to ask storage, without creation
-struct storage *account2storage2(int account_id)
-{
- return idb_get(storage_db, account_id);
-}
-
-int storage_delete(int account_id)
-{
- idb_remove(storage_db,account_id);
- return 0;
-}
-
-/*==========================================
- * Opens a storage. Returns:
- * 0 - success
- * 1 - fail
- * 2 - Storage requested from char-server (will open automatically later)
- *------------------------------------------
- */
-int storage_storageopen(struct map_session_data *sd)
-{
- struct storage *stor;
- nullpo_retr(0, sd);
-
- if(sd->state.finalsave) //Refuse to open storage when you had your last save done.
- return 1;
-
- if(sd->state.storage_flag)
- return 1; //Already open?
-
- if(pc_can_give_items(pc_isGM(sd)))
- { //check is this GM level is allowed to put items to storage
- clif_displaymessage(sd->fd, msg_txt(246));
- return 1;
- }
-
- if((stor = idb_get(storage_db,sd->status.account_id)) == NULL)
- { //Request storage.
- intif_request_storage(sd->status.account_id);
- return 2;
- }
-
- if (stor->storage_status)
- return 1; //Already open/player already has it open...
-
- stor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_storagelist(sd,stor);
- clif_updatestorageamount(sd,stor);
- return 0;
-}
-
-/*==========================================
- * Internal add-item function.
- *------------------------------------------
- */
-static int storage_additem(struct map_session_data *sd,struct storage *stor,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i;
-
- if (sd->state.finalsave)
- return 1;
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
-
- data = itemdb_search(item_data->nameid);
-
- if (!itemdb_canstore(item_data, pc_isGM(sd)))
- { //Check if item is storable. [Skotlex]
- clif_displaymessage (sd->fd, msg_txt(264));
- return 1;
- }
-
- if(itemdb_isstackable2(data)){ //Stackable
- for(i=0;i<MAX_STORAGE;i++){
- if( compare_item (&stor->storage_[i], item_data)) {
- if(amount > MAX_AMOUNT - stor->storage_[i].amount)
- return 1;
- stor->storage_[i].amount+=amount;
- clif_storageitemadded(sd,stor,i,amount);
- stor->dirty = 1;
- return 0;
- }
- }
- }
- //Add item
- for(i=0;i<MAX_STORAGE && stor->storage_[i].nameid;i++);
-
- if(i>=MAX_STORAGE)
- return 1;
-
- memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
- stor->storage_[i].amount=amount;
- stor->storage_amount++;
- clif_storageitemadded(sd,stor,i,amount);
- clif_updatestorageamount(sd,stor);
- stor->dirty = 1;
- return 0;
-}
-/*==========================================
- * Internal del-item function
- *------------------------------------------
- */
-static int storage_delitem(struct map_session_data *sd,struct storage *stor,int n,int amount)
-{
-
- if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
- return 1;
-
- stor->storage_[n].amount-=amount;
- if(stor->storage_[n].amount==0){
- malloc_set(&stor->storage_[n],0,sizeof(stor->storage_[0]));
- stor->storage_amount--;
- clif_updatestorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
-
- stor->dirty = 1;
- return 0;
-}
-/*==========================================
- * Add an item to the storage from the inventory.
- *------------------------------------------
- */
-int storage_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if((stor->storage_amount > MAX_STORAGE) || !stor->storage_status)
- return 0; // storage full / storage closed
-
- if(index<0 || index>=MAX_INVENTORY)
- return 0;
-
- if(sd->status.inventory[index].nameid <= 0)
- return 0; //No item on that spot
-
- if(amount < 1 || amount > sd->status.inventory[index].amount)
- return 0;
-
-// log_tostorage(sd, index, 0);
- if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- // remove item from inventory
- pc_delitem(sd,index,amount,0);
-
- return 1;
-}
-
-/*==========================================
- * Retrieve an item from the storage.
- *------------------------------------------
- */
-int storage_storageget(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
- int flag;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
-
- if(index<0 || index>=MAX_STORAGE)
- return 0;
-
- if(stor->storage_[index].nameid <= 0)
- return 0; //Nothing there
-
- if(amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
- storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
-// log_fromstorage(sd, index, 0);
- return 1;
-}
-/*==========================================
- * Move an item from cart to storage.
- *------------------------------------------
- */
-int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if(stor->storage_amount > MAX_STORAGE || !stor->storage_status)
- return 0; // storage full / storage closed
-
- if(index< 0 || index>=MAX_CART)
- return 0;
-
- if(sd->status.cart[index].nameid <= 0)
- return 0; //No item there.
-
- if(amount < 1 || amount > sd->status.cart[index].amount)
- return 0;
-
- if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
-
- return 1;
-}
-
-/*==========================================
- * Get from Storage to the Cart
- *------------------------------------------
- */
-int storage_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if(!stor->storage_status)
- return 0;
-
- if(index< 0 || index>=MAX_STORAGE)
- return 0;
-
- if(stor->storage_[index].nameid <= 0)
- return 0; //Nothing there.
-
- if(amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if(pc_cart_additem(sd,&stor->storage_[index],amount)==0)
- storage_delitem(sd,stor,index,amount);
-
- return 1;
-}
-
-
-/*==========================================
- * Modified By Valaris to save upon closing [massdriller]
- *------------------------------------------
- */
-int storage_storageclose(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- clif_storageclose(sd);
- if (stor->storage_status)
- {
- if (save_settings&4)
- chrif_save(sd,0); //Invokes the storage saving as well.
- else
- storage_storage_save(sd->status.account_id, 0);
- }
- stor->storage_status=0;
- sd->state.storage_flag=0;
- return 0;
-}
-
-/*==========================================
- * When quitting the game.
- *------------------------------------------
- */
-int storage_storage_quit(struct map_session_data *sd, int flag)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if (stor->storage_status)
- {
- if (save_settings&4)
- chrif_save(sd, flag); //Invokes the storage saving as well.
- else
- storage_storage_save(sd->status.account_id, flag);
- }
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
- return 0;
-}
-
-void storage_storage_dirty(struct map_session_data *sd)
-{
- struct storage *stor;
-
- stor=account2storage2(sd->status.account_id);
-
- if(stor)
- stor->dirty = 1;
-}
-
-int storage_storage_save(int account_id, int final)
-{
- struct storage *stor;
-
- stor=account2storage2(account_id);
- if(!stor) return 0;
-
- if(stor->dirty)
- {
- if (final) {
- stor->dirty = 2;
- stor->storage_status = 0; //To prevent further manipulation of it.
- }
- intif_send_storage(stor);
- return 1;
- }
- if (final)
- { //Clear storage from memory. Nothing to save.
- storage_delete(account_id);
- return 1;
- }
-
- return 0;
-}
-
-//Ack from Char-server indicating the storage was saved. [Skotlex]
-int storage_storage_saved(int account_id)
-{
- struct storage *stor;
-
- if((stor=account2storage2(account_id)) == NULL)
- return 0;
-
- if (stor->dirty == 2)
- { //Final save of storage. Remove from memory.
- storage_delete(account_id);
- return 1;
- }
-
- if (stor->dirty && stor->storage_status == 0)
- { //Only mark it clean if it's not in use. [Skotlex]
- stor->dirty = 0;
- sortage_sortitem(stor);
- return 1;
- }
- return 0;
-}
-
-static void* create_guildstorage(DBKey key, va_list args) {
- struct guild_storage *gs = NULL;
- gs = (struct guild_storage *) aCallocA(sizeof(struct guild_storage), 1);
- gs->guild_id=key.i;
- return gs;
-}
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(guild_search(guild_id) != NULL)
- gs=(struct guild_storage *) idb_ensure(guild_storage_db,guild_id,create_guildstorage);
- return gs;
-}
-
-struct guild_storage *guild2storage2(int guild_id)
-{ //For just locating a storage without creating one. [Skotlex]
- return idb_get(guild_storage_db,guild_id);
-}
-
-int guild_storage_delete(int guild_id)
-{
- idb_remove(guild_storage_db,guild_id);
- return 0;
-}
-
-int storage_guild_storageopen(struct map_session_data *sd)
-{
- struct guild_storage *gstor;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id <= 0)
- return 2;
-
- if(sd->state.finalsave) //Refuse to open storage when you had your last save done.
- return 1;
-
- if(sd->state.storage_flag)
- return 1; //Can't open both storages at a time.
-
- if( pc_can_give_items(pc_isGM(sd)) ) { //check is this GM level can open guild storage and store items [Lupus]
- clif_displaymessage(sd->fd, msg_txt(246));
- return 1;
- }
-
- if((gstor = guild2storage2(sd->status.guild_id)) == NULL) {
- intif_request_guild_storage(sd->status.account_id,sd->status.guild_id);
- return 0;
- }
- if(gstor->storage_status)
- return 1;
-
- gstor->storage_status = 1;
- sd->state.storage_flag = 2;
- clif_guildstoragelist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- return 0;
-}
-
-int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
- nullpo_retr(1, item_data);
- nullpo_retr(1, data = itemdb_search(item_data->nameid));
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
-
- if (!itemdb_canguildstore(item_data, pc_isGM(sd)))
- { //Check if item is storable. [Skotlex]
- clif_displaymessage (sd->fd, msg_txt(264));
- return 1;
- }
-
- if(itemdb_isstackable2(data)){ //Stackable
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(compare_item(&stor->storage_[i], item_data)) {
- if(stor->storage_[i].amount+amount > MAX_AMOUNT)
- return 1;
- stor->storage_[i].amount+=amount;
- clif_guildstorageitemadded(sd,stor,i,amount);
- stor->dirty = 1;
- return 0;
- }
- }
- }
- //Add item
- for(i=0;i<MAX_GUILD_STORAGE && stor->storage_[i].nameid;i++);
-
- if(i>=MAX_GUILD_STORAGE)
- return 1;
-
- memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
- stor->storage_[i].amount=amount;
- stor->storage_amount++;
- clif_guildstorageitemadded(sd,stor,i,amount);
- clif_updateguildstorageamount(sd,stor);
- stor->dirty = 1;
- return 0;
-}
-
-int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount)
-{
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
-
- if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
- return 1;
-
- stor->storage_[n].amount-=amount;
- if(stor->storage_[n].amount==0){
- malloc_set(&stor->storage_[n],0,sizeof(stor->storage_[0]));
- stor->storage_amount--;
- clif_updateguildstorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
- stor->dirty = 1;
- return 0;
-}
-
-int storage_guild_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
- return 0;
-
- if(index<0 || index>=MAX_INVENTORY)
- return 0;
-
- if(sd->status.inventory[index].nameid <= 0)
- return 0;
-
- if(amount < 1 || amount > sd->status.inventory[index].amount)
- return 0;
-
-// log_tostorage(sd, index, 1);
- if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- pc_delitem(sd,index,amount,0);
-
- return 1;
-}
-
-int storage_guild_storageget(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
- int flag;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- if(!stor->storage_status)
- return 0;
-
- if(index<0 || index>=MAX_GUILD_STORAGE)
- return 0;
-
- if(stor->storage_[index].nameid <= 0)
- return 0;
-
- if(amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
- guild_storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
-// log_fromstorage(sd, index, 1);
-
- return 0;
-}
-
-int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- if(!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
- return 0;
-
- if(index<0 || index>=MAX_CART)
- return 0;
-
- if(sd->status.cart[index].nameid <= 0)
- return 0;
-
- if(amount < 1 || amount > sd->status.cart[index].amount)
- return 0;
-
- if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
-
- return 1;
-}
-
-int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- if(!stor->storage_status)
- return 0;
-
- if(index<0 || index>=MAX_GUILD_STORAGE)
- return 0;
-
- if(stor->storage_[index].nameid<=0)
- return 0;
-
- if(amount < 1 || amount > stor->storage_[index].amount)
- return 0;
-
- if(pc_cart_additem(sd,&stor->storage_[index],amount)==0)
- guild_storage_delitem(sd,stor,index,amount);
-
- return 1;
-}
-
-int storage_guild_storagesave(int account_id, int guild_id, int flag)
-{
- struct guild_storage *stor = guild2storage2(guild_id);
-
- if(stor)
- {
- if (flag) //Char quitting, close it.
- stor->storage_status = 0;
- if (stor->dirty)
- intif_send_guild_storage(account_id,stor);
- return 1;
- }
- return 0;
-}
-
-int storage_guild_storagesaved(int guild_id)
-{
- struct guild_storage *stor;
-
- if((stor=guild2storage2(guild_id)) != NULL) {
- if (stor->dirty && stor->storage_status == 0)
- { //Storage has been correctly saved.
- stor->dirty = 0;
- sortage_gsortitem(stor);
- }
- return 1;
- }
- return 0;
-}
-
-int storage_guild_storageclose(struct map_session_data *sd)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- clif_storageclose(sd);
- if (stor->storage_status)
- {
- if (save_settings&4)
- chrif_save(sd, 0); //This one also saves the storage. [Skotlex]
- else
- storage_guild_storagesave(sd->status.account_id, sd->status.guild_id,0);
- stor->storage_status=0;
- }
- sd->state.storage_flag = 0;
-
- return 0;
-}
-
-int storage_guild_storage_quit(struct map_session_data *sd,int flag)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
-
- if(flag)
- { //Only during a guild break flag is 1 (don't save storage)
- sd->state.storage_flag = 0;
- stor->storage_status = 0;
- clif_storageclose(sd);
- if (save_settings&4)
- chrif_save(sd,0);
- return 0;
- }
-
- if(stor->storage_status) {
- if (save_settings&4)
- chrif_save(sd,0);
- else
- storage_guild_storagesave(sd->status.account_id,sd->status.guild_id,1);
- }
- sd->state.storage_flag = 0;
- stor->storage_status = 0;
-
- return 0;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
+#include "storage.h"
+#include "chrif.h"
+#include "itemdb.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "guild.h"
+#include "battle.h"
+#include "atcommand.h"
+
+static struct dbt *storage_db;
+static struct dbt *guild_storage_db;
+
+/*==========================================
+ * ‘qŒÉ“àƒAƒCƒeƒ€ƒ\[ƒg
+ *------------------------------------------
+ */
+int storage_comp_item(const void *_i1, const void *_i2)
+{
+ struct item *i1 = (struct item *)_i1;
+ struct item *i2 = (struct item *)_i2;
+
+ if (i1->nameid == i2->nameid)
+ return 0;
+ else if (!(i1->nameid) || !(i1->amount))
+ return 1;
+ else if (!(i2->nameid) || !(i2->amount))
+ return -1;
+ return i1->nameid - i2->nameid;
+}
+
+void sortage_sortitem (struct storage *stor)
+{
+ nullpo_retv(stor);
+ qsort(stor->storage_, MAX_STORAGE, sizeof(struct item), storage_comp_item);
+}
+
+void sortage_gsortitem (struct guild_storage* gstor)
+{
+ nullpo_retv(gstor);
+ qsort(gstor->storage_, MAX_GUILD_STORAGE, sizeof(struct item), storage_comp_item);
+}
+
+/*==========================================
+ * ‰Šú‰»‚Æ‚©
+ *------------------------------------------
+ */
+int do_init_storage(void) // map.c::do_init()‚©‚çŒÄ‚΂ê‚é
+{
+ storage_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ guild_storage_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
+ return 1;
+}
+void do_final_storage(void) // by [MC Cameri]
+{
+ storage_db->destroy(storage_db,NULL);
+ guild_storage_db->destroy(guild_storage_db,NULL);
+}
+
+
+static int storage_reconnect_sub(DBKey key,void *data,va_list ap)
+{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex]
+ int type = va_arg(ap, int);
+ if (type)
+ { //Guild Storage
+ struct guild_storage* stor = (struct guild_storage*) data;
+ if (stor->dirty && stor->storage_status == 0) //Save closed storages.
+ storage_guild_storagesave(0, stor->guild_id,0);
+ }
+ else
+ { //Account Storage
+ struct storage* stor = (struct storage*) data;
+ if (stor->dirty && stor->storage_status == 0) //Save closed storages.
+ storage_storage_save(stor->account_id, stor->dirty==2?1:0);
+ }
+ return 0;
+}
+
+//Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex
+void do_reconnect_storage(void)
+{
+ storage_db->foreach(storage_db, storage_reconnect_sub, 0);
+ guild_storage_db->foreach(guild_storage_db, storage_reconnect_sub, 1);
+}
+
+static void* create_storage(DBKey key, va_list args) {
+ struct storage *stor;
+ stor = (struct storage *) aCallocA (sizeof(struct storage), 1);
+ stor->account_id = key.i;
+ return stor;
+}
+struct storage *account2storage(int account_id)
+{
+ return idb_ensure(storage_db,account_id,create_storage);
+}
+
+// Just to ask storage, without creation
+struct storage *account2storage2(int account_id)
+{
+ return idb_get(storage_db, account_id);
+}
+
+int storage_delete(int account_id)
+{
+ idb_remove(storage_db,account_id);
+ return 0;
+}
+
+/*==========================================
+ * Opens a storage. Returns:
+ * 0 - success
+ * 1 - fail
+ * 2 - Storage requested from char-server (will open automatically later)
+ *------------------------------------------
+ */
+int storage_storageopen(struct map_session_data *sd)
+{
+ struct storage *stor;
+ nullpo_retr(0, sd);
+
+ if(sd->state.finalsave) //Refuse to open storage when you had your last save done.
+ return 1;
+
+ if(sd->state.storage_flag)
+ return 1; //Already open?
+
+ if(pc_can_give_items(pc_isGM(sd)))
+ { //check is this GM level is allowed to put items to storage
+ clif_displaymessage(sd->fd, msg_txt(246));
+ return 1;
+ }
+
+ if((stor = idb_get(storage_db,sd->status.account_id)) == NULL)
+ { //Request storage.
+ intif_request_storage(sd->status.account_id);
+ return 2;
+ }
+
+ if (stor->storage_status)
+ return 1; //Already open/player already has it open...
+
+ stor->storage_status = 1;
+ sd->state.storage_flag = 1;
+ clif_storagelist(sd,stor);
+ clif_updatestorageamount(sd,stor);
+ return 0;
+}
+
+/*==========================================
+ * Internal add-item function.
+ *------------------------------------------
+ */
+static int storage_additem(struct map_session_data *sd,struct storage *stor,struct item *item_data,int amount)
+{
+ struct item_data *data;
+ int i;
+
+ if (sd->state.finalsave)
+ return 1;
+
+ if(item_data->nameid <= 0 || amount <= 0)
+ return 1;
+
+ data = itemdb_search(item_data->nameid);
+
+ if (!itemdb_canstore(item_data, pc_isGM(sd)))
+ { //Check if item is storable. [Skotlex]
+ clif_displaymessage (sd->fd, msg_txt(264));
+ return 1;
+ }
+
+ if(itemdb_isstackable2(data)){ //Stackable
+ for(i=0;i<MAX_STORAGE;i++){
+ if( compare_item (&stor->storage_[i], item_data)) {
+ if(amount > MAX_AMOUNT - stor->storage_[i].amount)
+ return 1;
+ stor->storage_[i].amount+=amount;
+ clif_storageitemadded(sd,stor,i,amount);
+ stor->dirty = 1;
+ return 0;
+ }
+ }
+ }
+ //Add item
+ for(i=0;i<MAX_STORAGE && stor->storage_[i].nameid;i++);
+
+ if(i>=MAX_STORAGE)
+ return 1;
+
+ memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
+ stor->storage_[i].amount=amount;
+ stor->storage_amount++;
+ clif_storageitemadded(sd,stor,i,amount);
+ clif_updatestorageamount(sd,stor);
+ stor->dirty = 1;
+ return 0;
+}
+/*==========================================
+ * Internal del-item function
+ *------------------------------------------
+ */
+static int storage_delitem(struct map_session_data *sd,struct storage *stor,int n,int amount)
+{
+
+ if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
+ return 1;
+
+ stor->storage_[n].amount-=amount;
+ if(stor->storage_[n].amount==0){
+ malloc_set(&stor->storage_[n],0,sizeof(stor->storage_[0]));
+ stor->storage_amount--;
+ clif_updatestorageamount(sd,stor);
+ }
+ clif_storageitemremoved(sd,n,amount);
+
+ stor->dirty = 1;
+ return 0;
+}
+/*==========================================
+ * Add an item to the storage from the inventory.
+ *------------------------------------------
+ */
+int storage_storageadd(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+ if((stor->storage_amount > MAX_STORAGE) || !stor->storage_status)
+ return 0; // storage full / storage closed
+
+ if(index<0 || index>=MAX_INVENTORY)
+ return 0;
+
+ if(sd->status.inventory[index].nameid <= 0)
+ return 0; //No item on that spot
+
+ if(amount < 1 || amount > sd->status.inventory[index].amount)
+ return 0;
+
+// log_tostorage(sd, index, 0);
+ if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
+ // remove item from inventory
+ pc_delitem(sd,index,amount,0);
+
+ return 1;
+}
+
+/*==========================================
+ * Retrieve an item from the storage.
+ *------------------------------------------
+ */
+int storage_storageget(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+ int flag;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+
+ if(index<0 || index>=MAX_STORAGE)
+ return 0;
+
+ if(stor->storage_[index].nameid <= 0)
+ return 0; //Nothing there
+
+ if(amount < 1 || amount > stor->storage_[index].amount)
+ return 0;
+
+ if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
+ storage_delitem(sd,stor,index,amount);
+ else
+ clif_additem(sd,0,0,flag);
+// log_fromstorage(sd, index, 0);
+ return 1;
+}
+/*==========================================
+ * Move an item from cart to storage.
+ *------------------------------------------
+ */
+int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+ if(stor->storage_amount > MAX_STORAGE || !stor->storage_status)
+ return 0; // storage full / storage closed
+
+ if(index< 0 || index>=MAX_CART)
+ return 0;
+
+ if(sd->status.cart[index].nameid <= 0)
+ return 0; //No item there.
+
+ if(amount < 1 || amount > sd->status.cart[index].amount)
+ return 0;
+
+ if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
+ pc_cart_delitem(sd,index,amount,0);
+
+ return 1;
+}
+
+/*==========================================
+ * Get from Storage to the Cart
+ *------------------------------------------
+ */
+int storage_storagegettocart(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+ if(!stor->storage_status)
+ return 0;
+
+ if(index< 0 || index>=MAX_STORAGE)
+ return 0;
+
+ if(stor->storage_[index].nameid <= 0)
+ return 0; //Nothing there.
+
+ if(amount < 1 || amount > stor->storage_[index].amount)
+ return 0;
+
+ if(pc_cart_additem(sd,&stor->storage_[index],amount)==0)
+ storage_delitem(sd,stor,index,amount);
+
+ return 1;
+}
+
+
+/*==========================================
+ * Modified By Valaris to save upon closing [massdriller]
+ *------------------------------------------
+ */
+int storage_storageclose(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+ clif_storageclose(sd);
+ if (stor->storage_status)
+ {
+ if (save_settings&4)
+ chrif_save(sd,0); //Invokes the storage saving as well.
+ else
+ storage_storage_save(sd->status.account_id, 0);
+ }
+ stor->storage_status=0;
+ sd->state.storage_flag=0;
+ return 0;
+}
+
+/*==========================================
+ * When quitting the game.
+ *------------------------------------------
+ */
+int storage_storage_quit(struct map_session_data *sd, int flag)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage2(sd->status.account_id));
+
+ if (stor->storage_status)
+ {
+ if (save_settings&4)
+ chrif_save(sd, flag); //Invokes the storage saving as well.
+ else
+ storage_storage_save(sd->status.account_id, flag);
+ }
+ stor->storage_status = 0;
+ sd->state.storage_flag = 0;
+ return 0;
+}
+
+void storage_storage_dirty(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ stor=account2storage2(sd->status.account_id);
+
+ if(stor)
+ stor->dirty = 1;
+}
+
+int storage_storage_save(int account_id, int final)
+{
+ struct storage *stor;
+
+ stor=account2storage2(account_id);
+ if(!stor) return 0;
+
+ if(stor->dirty)
+ {
+ if (final) {
+ stor->dirty = 2;
+ stor->storage_status = 0; //To prevent further manipulation of it.
+ }
+ intif_send_storage(stor);
+ return 1;
+ }
+ if (final)
+ { //Clear storage from memory. Nothing to save.
+ storage_delete(account_id);
+ return 1;
+ }
+
+ return 0;
+}
+
+//Ack from Char-server indicating the storage was saved. [Skotlex]
+int storage_storage_saved(int account_id)
+{
+ struct storage *stor;
+
+ if((stor=account2storage2(account_id)) == NULL)
+ return 0;
+
+ if (stor->dirty == 2)
+ { //Final save of storage. Remove from memory.
+ storage_delete(account_id);
+ return 1;
+ }
+
+ if (stor->dirty && stor->storage_status == 0)
+ { //Only mark it clean if it's not in use. [Skotlex]
+ stor->dirty = 0;
+ sortage_sortitem(stor);
+ return 1;
+ }
+ return 0;
+}
+
+static void* create_guildstorage(DBKey key, va_list args) {
+ struct guild_storage *gs = NULL;
+ gs = (struct guild_storage *) aCallocA(sizeof(struct guild_storage), 1);
+ gs->guild_id=key.i;
+ return gs;
+}
+struct guild_storage *guild2storage(int guild_id)
+{
+ struct guild_storage *gs = NULL;
+ if(guild_search(guild_id) != NULL)
+ gs=(struct guild_storage *) idb_ensure(guild_storage_db,guild_id,create_guildstorage);
+ return gs;
+}
+
+struct guild_storage *guild2storage2(int guild_id)
+{ //For just locating a storage without creating one. [Skotlex]
+ return idb_get(guild_storage_db,guild_id);
+}
+
+int guild_storage_delete(int guild_id)
+{
+ idb_remove(guild_storage_db,guild_id);
+ return 0;
+}
+
+int storage_guild_storageopen(struct map_session_data *sd)
+{
+ struct guild_storage *gstor;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id <= 0)
+ return 2;
+
+ if(sd->state.finalsave) //Refuse to open storage when you had your last save done.
+ return 1;
+
+ if(sd->state.storage_flag)
+ return 1; //Can't open both storages at a time.
+
+ if( pc_can_give_items(pc_isGM(sd)) ) { //check is this GM level can open guild storage and store items [Lupus]
+ clif_displaymessage(sd->fd, msg_txt(246));
+ return 1;
+ }
+
+ if((gstor = guild2storage2(sd->status.guild_id)) == NULL) {
+ intif_request_guild_storage(sd->status.account_id,sd->status.guild_id);
+ return 0;
+ }
+ if(gstor->storage_status)
+ return 1;
+
+ gstor->storage_status = 1;
+ sd->state.storage_flag = 2;
+ clif_guildstoragelist(sd,gstor);
+ clif_updateguildstorageamount(sd,gstor);
+ return 0;
+}
+
+int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount)
+{
+ struct item_data *data;
+ int i;
+
+ nullpo_retr(1, sd);
+ nullpo_retr(1, stor);
+ nullpo_retr(1, item_data);
+ nullpo_retr(1, data = itemdb_search(item_data->nameid));
+
+ if(item_data->nameid <= 0 || amount <= 0)
+ return 1;
+
+ if (!itemdb_canguildstore(item_data, pc_isGM(sd)))
+ { //Check if item is storable. [Skotlex]
+ clif_displaymessage (sd->fd, msg_txt(264));
+ return 1;
+ }
+
+ if(itemdb_isstackable2(data)){ //Stackable
+ for(i=0;i<MAX_GUILD_STORAGE;i++){
+ if(compare_item(&stor->storage_[i], item_data)) {
+ if(stor->storage_[i].amount+amount > MAX_AMOUNT)
+ return 1;
+ stor->storage_[i].amount+=amount;
+ clif_guildstorageitemadded(sd,stor,i,amount);
+ stor->dirty = 1;
+ return 0;
+ }
+ }
+ }
+ //Add item
+ for(i=0;i<MAX_GUILD_STORAGE && stor->storage_[i].nameid;i++);
+
+ if(i>=MAX_GUILD_STORAGE)
+ return 1;
+
+ memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
+ stor->storage_[i].amount=amount;
+ stor->storage_amount++;
+ clif_guildstorageitemadded(sd,stor,i,amount);
+ clif_updateguildstorageamount(sd,stor);
+ stor->dirty = 1;
+ return 0;
+}
+
+int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount)
+{
+ nullpo_retr(1, sd);
+ nullpo_retr(1, stor);
+
+ if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
+ return 1;
+
+ stor->storage_[n].amount-=amount;
+ if(stor->storage_[n].amount==0){
+ malloc_set(&stor->storage_[n],0,sizeof(stor->storage_[0]));
+ stor->storage_amount--;
+ clif_updateguildstorageamount(sd,stor);
+ }
+ clif_storageitemremoved(sd,n,amount);
+ stor->dirty = 1;
+ return 0;
+}
+
+int storage_guild_storageadd(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
+ return 0;
+
+ if(index<0 || index>=MAX_INVENTORY)
+ return 0;
+
+ if(sd->status.inventory[index].nameid <= 0)
+ return 0;
+
+ if(amount < 1 || amount > sd->status.inventory[index].amount)
+ return 0;
+
+// log_tostorage(sd, index, 1);
+ if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
+ pc_delitem(sd,index,amount,0);
+
+ return 1;
+}
+
+int storage_guild_storageget(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+ int flag;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ if(!stor->storage_status)
+ return 0;
+
+ if(index<0 || index>=MAX_GUILD_STORAGE)
+ return 0;
+
+ if(stor->storage_[index].nameid <= 0)
+ return 0;
+
+ if(amount < 1 || amount > stor->storage_[index].amount)
+ return 0;
+
+ if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
+ guild_storage_delitem(sd,stor,index,amount);
+ else
+ clif_additem(sd,0,0,flag);
+// log_fromstorage(sd, index, 1);
+
+ return 0;
+}
+
+int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ if(!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE)
+ return 0;
+
+ if(index<0 || index>=MAX_CART)
+ return 0;
+
+ if(sd->status.cart[index].nameid <= 0)
+ return 0;
+
+ if(amount < 1 || amount > sd->status.cart[index].amount)
+ return 0;
+
+ if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
+ pc_cart_delitem(sd,index,amount,0);
+
+ return 1;
+}
+
+int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ if(!stor->storage_status)
+ return 0;
+
+ if(index<0 || index>=MAX_GUILD_STORAGE)
+ return 0;
+
+ if(stor->storage_[index].nameid<=0)
+ return 0;
+
+ if(amount < 1 || amount > stor->storage_[index].amount)
+ return 0;
+
+ if(pc_cart_additem(sd,&stor->storage_[index],amount)==0)
+ guild_storage_delitem(sd,stor,index,amount);
+
+ return 1;
+}
+
+int storage_guild_storagesave(int account_id, int guild_id, int flag)
+{
+ struct guild_storage *stor = guild2storage2(guild_id);
+
+ if(stor)
+ {
+ if (flag) //Char quitting, close it.
+ stor->storage_status = 0;
+ if (stor->dirty)
+ intif_send_guild_storage(account_id,stor);
+ return 1;
+ }
+ return 0;
+}
+
+int storage_guild_storagesaved(int guild_id)
+{
+ struct guild_storage *stor;
+
+ if((stor=guild2storage2(guild_id)) != NULL) {
+ if (stor->dirty && stor->storage_status == 0)
+ { //Storage has been correctly saved.
+ stor->dirty = 0;
+ sortage_gsortitem(stor);
+ }
+ return 1;
+ }
+ return 0;
+}
+
+int storage_guild_storageclose(struct map_session_data *sd)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ clif_storageclose(sd);
+ if (stor->storage_status)
+ {
+ if (save_settings&4)
+ chrif_save(sd, 0); //This one also saves the storage. [Skotlex]
+ else
+ storage_guild_storagesave(sd->status.account_id, sd->status.guild_id,0);
+ stor->storage_status=0;
+ }
+ sd->state.storage_flag = 0;
+
+ return 0;
+}
+
+int storage_guild_storage_quit(struct map_session_data *sd,int flag)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=guild2storage2(sd->status.guild_id));
+
+ if(flag)
+ { //Only during a guild break flag is 1 (don't save storage)
+ sd->state.storage_flag = 0;
+ stor->storage_status = 0;
+ clif_storageclose(sd);
+ if (save_settings&4)
+ chrif_save(sd,0);
+ return 0;
+ }
+
+ if(stor->storage_status) {
+ if (save_settings&4)
+ chrif_save(sd,0);
+ else
+ storage_guild_storagesave(sd->status.account_id,sd->status.guild_id,1);
+ }
+ sd->state.storage_flag = 0;
+ stor->storage_status = 0;
+
+ return 0;
+}
diff --git a/src/map/storage.h b/src/map/storage.h
index b62ddb47a..2140a2ec5 100644
--- a/src/map/storage.h
+++ b/src/map/storage.h
@@ -1,45 +1,45 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _STORAGE_H_
-#define _STORAGE_H_
-
-#include "../common/mmo.h"
-
-int storage_storageopen(struct map_session_data *sd);
-int storage_storageadd(struct map_session_data *sd,int index,int amount);
-int storage_storageget(struct map_session_data *sd,int index,int amount);
-int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount);
-int storage_storagegettocart(struct map_session_data *sd,int index,int amount);
-int storage_storageclose(struct map_session_data *sd);
-int do_init_storage(void);
-void do_final_storage(void);
-void do_reconnect_storage(void);
-struct storage *account2storage(int account_id);
-struct storage *account2storage2(int account_id);
-int storage_delete(int account_id);
-int storage_storage_quit(struct map_session_data *sd, int flag);
-int storage_storage_save(int account_id, int final);
-int storage_storage_saved(int account_id); //Ack from char server that guild store was saved.
-void storage_storage_dirty(struct map_session_data *sd);
-
-struct guild_storage *guild2storage(int guild_id);
-int guild_storage_delete(int guild_id);
-int storage_guild_storageopen(struct map_session_data *sd);
-int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount);
-int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount);
-int storage_guild_storageadd(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageget(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount);
-int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageclose(struct map_session_data *sd);
-int storage_guild_storage_quit(struct map_session_data *sd,int flag);
-int storage_guild_storagesave(int account_id, int guild_id, int flag);
-int storage_guild_storagesaved(int guild_id); //Ack from char server that guild store was saved.
-
-int storage_comp_item(const void *_i1, const void *_i2);
-//int storage_comp_item(const struct item* i1, const struct item* i2);
-void sortage_sortitem(struct storage* stor);
-void sortage_gsortitem(struct guild_storage* gstor);
-
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _STORAGE_H_
+#define _STORAGE_H_
+
+#include "../common/mmo.h"
+
+int storage_storageopen(struct map_session_data *sd);
+int storage_storageadd(struct map_session_data *sd,int index,int amount);
+int storage_storageget(struct map_session_data *sd,int index,int amount);
+int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount);
+int storage_storagegettocart(struct map_session_data *sd,int index,int amount);
+int storage_storageclose(struct map_session_data *sd);
+int do_init_storage(void);
+void do_final_storage(void);
+void do_reconnect_storage(void);
+struct storage *account2storage(int account_id);
+struct storage *account2storage2(int account_id);
+int storage_delete(int account_id);
+int storage_storage_quit(struct map_session_data *sd, int flag);
+int storage_storage_save(int account_id, int final);
+int storage_storage_saved(int account_id); //Ack from char server that guild store was saved.
+void storage_storage_dirty(struct map_session_data *sd);
+
+struct guild_storage *guild2storage(int guild_id);
+int guild_storage_delete(int guild_id);
+int storage_guild_storageopen(struct map_session_data *sd);
+int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount);
+int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount);
+int storage_guild_storageadd(struct map_session_data *sd,int index,int amount);
+int storage_guild_storageget(struct map_session_data *sd,int index,int amount);
+int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount);
+int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount);
+int storage_guild_storageclose(struct map_session_data *sd);
+int storage_guild_storage_quit(struct map_session_data *sd,int flag);
+int storage_guild_storagesave(int account_id, int guild_id, int flag);
+int storage_guild_storagesaved(int guild_id); //Ack from char server that guild store was saved.
+
+int storage_comp_item(const void *_i1, const void *_i2);
+//int storage_comp_item(const struct item* i1, const struct item* i2);
+void sortage_sortitem(struct storage* stor);
+void sortage_gsortitem(struct guild_storage* gstor);
+
+#endif
diff --git a/src/map/trade.c b/src/map/trade.c
index 02eb454d3..09b07e02f 100644
--- a/src/map/trade.c
+++ b/src/map/trade.c
@@ -1,553 +1,553 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "clif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "trade.h"
-#include "pc.h"
-#include "npc.h"
-#include "battle.h"
-#include "chrif.h"
-#include "storage.h"
-#include "intif.h"
-#include "atcommand.h"
-#include "log.h"
-#include "../common/malloc.h"
-
-//Max distance from traders to enable a trade to take place.
-#define TRADE_DISTANCE 2
-
-/*==========================================
- * Initiates a trade request.
- *------------------------------------------
- */
-void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd) {
- int level;
-
- nullpo_retv(sd);
-
- if (map[sd->bl.m].flag.notrade) {
- clif_displaymessage (sd->fd, msg_txt(272));
- return; //Can't trade in notrade mapflag maps.
- }
-
- if (target_sd == NULL || sd == target_sd) {
- clif_tradestart(sd, 1); // character does not exist
- return;
- }
-
- if (!battle_config.invite_request_check) {
- if (target_sd->guild_invite > 0 || target_sd->party_invite > 0) {
- clif_tradestart(sd, 2);
- return;
- }
- }
-
- if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) {
- trade_tradecancel(sd); // person is in another trade
- return;
- }
-
- level = pc_isGM(sd);
- if ( pc_can_give_items(level) || pc_can_give_items(pc_isGM(target_sd)) ) //check if both GMs are allowed to trade
- {
- clif_displaymessage(sd->fd, msg_txt(246));
- trade_tradecancel(sd); // GM is not allowed to trade
- return;
- }
-
- //Fixed. Only real GMs can request trade from far away! [Lupus]
- if (level < lowest_gm_level && (sd->bl.m != target_sd->bl.m ||
- !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE)
- )) {
- clif_tradestart(sd, 0); // too far
- return ;
- }
-
- target_sd->trade_partner = sd->status.account_id;
- sd->trade_partner = target_sd->status.account_id;
- clif_traderequest(target_sd, sd->status.name);
-}
-
-/*==========================================
- * Reply to a trade-request.
- *------------------------------------------
- */
-void trade_tradeack(struct map_session_data *sd, int type) {
- struct map_session_data *target_sd;
- nullpo_retv(sd);
-
- if (sd->state.trading || !sd->trade_partner)
- return; //Already trading or no partner set.
-
- if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
- sd->trade_partner=0;
- return;
- }
-
- if (target_sd->state.trading || target_sd->trade_partner != sd->bl.id)
- return; //Already trading or wrong partner.
-
- //Copied here as well since the original character could had warped.
- if (type == 3 && pc_isGM(target_sd) < lowest_gm_level && (sd->bl.m != target_sd->bl.m ||
- !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE)
- )) {
- sd->trade_partner=0;
- target_sd->trade_partner = 0;
- clif_tradestart(sd, 0); // too far
- return;
- }
-
- //TODO: Type 4/3? What would 1/2 and the rest do?
- if (type == 4) { // Cancel
- sd->state.deal_locked = 0;
- sd->trade_partner = 0;
- target_sd->state.deal_locked = 0;
- target_sd->trade_partner = 0;
- clif_tradestart(target_sd, type);
- clif_tradestart(sd, type);
- }
-
- if (type == 3) { //Initiate trade
- sd->state.trading = 1;
- target_sd->state.trading = 1;
- malloc_set(&sd->deal, 0, sizeof(sd->deal));
- malloc_set(&target_sd->deal, 0, sizeof(target_sd->deal));
- clif_tradestart(target_sd, type);
- clif_tradestart(sd, type);
- if (sd->npc_id)
- npc_event_dequeue(sd);
- if (target_sd->npc_id)
- npc_event_dequeue(target_sd);
- }
-}
-
-/*==========================================
- * Check here hacker for duplicate item in trade
- * normal client refuse to have 2 same types of item (except equipment) in same trade window
- * normal client authorise only no equiped item and only from inventory
- *------------------------------------------
- */
-int impossible_trade_check(struct map_session_data *sd) {
- struct item inventory[MAX_INVENTORY];
- char message_to_gm[200];
- int i, index;
-
- nullpo_retr(1, sd);
-
- if(sd->deal.zeny > sd->status.zeny)
- {
- pc_setglobalreg(sd,"ZENY_HACKER",1);
- return -1;
- }
-
- // get inventory of player
- memcpy(&inventory, &sd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
-
- // remove this part: arrows can be trade and equiped
- // re-added! [celest]
- // remove equiped items (they can not be trade)
- for (i = 0; i < MAX_INVENTORY; i++)
- if (inventory[i].nameid > 0 && inventory[i].equip && !(inventory[i].equip & EQP_AMMO))
- malloc_set(&inventory[i], 0, sizeof(struct item));
-
- // check items in player inventory
- for(i = 0; i < 10; i++) {
- if (!sd->deal.item[i].amount)
- continue;
- index = sd->deal.item[i].index;
- if (inventory[index].amount < sd->deal.item[i].amount)
- { // if more than the player have -> hack
- sprintf(message_to_gm, msg_txt(538), sd->status.name, sd->status.account_id); // Hack on trade: character '%s' (account: %d) try to trade more items that he has.
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- sprintf(message_to_gm, msg_txt(539), inventory[index].amount, inventory[index].nameid, sd->deal.item[i].amount); // This player has %d of a kind of item (id: %d), and try to trade %d of them.
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- // if we block people
- if (battle_config.ban_hack_trade < 0) {
- chrif_char_ask_name(-1, sd->status.name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
- clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
- // message about the ban
- sprintf(message_to_gm, msg_txt(540)); // This player has been definitivly blocked.
- // if we ban people
- } else if (battle_config.ban_hack_trade > 0) {
- chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
- clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
- // message about the ban
- sprintf(message_to_gm, msg_txt(507), battle_config.ban_hack_trade); // This player has been banned for %d minute(s).
- } else
- // message about the ban
- sprintf(message_to_gm, msg_txt(508)); // This player hasn't been banned (Ban option is disabled).
-
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- return 1;
- }
- inventory[index].amount -= sd->deal.item[i].amount; // remove item from inventory
- }
- return 0;
-}
-
-/*==========================================
- * Checks if trade is possible (against zeny limits, inventory limits, etc)
- *------------------------------------------
- */
-int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
- struct item inventory[MAX_INVENTORY];
- struct item inventory2[MAX_INVENTORY];
- struct item_data *data;
- int trade_i, i, amount, n;
-
- // check zenys value against hackers (Zeny was already checked on time of adding, but you never know when you lost some zeny since then.
- if(sd->deal.zeny > sd->status.zeny || (tsd->status.zeny > MAX_ZENY - sd->deal.zeny))
- return 0;
- if(tsd->deal.zeny > tsd->status.zeny || (sd->status.zeny > MAX_ZENY - tsd->deal.zeny))
- return 0;
-
- // get inventory of player
- memcpy(&inventory, &sd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
- memcpy(&inventory2, &tsd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
-
- // check free slot in both inventory
- for(trade_i = 0; trade_i < 10; trade_i++) {
- amount = sd->deal.item[trade_i].amount;
- if (amount) {
- n = sd->deal.item[trade_i].index;
- if (amount > inventory[n].amount)
- return 0; //qty Exploit?
-
- data = itemdb_search(inventory[n].nameid);
- i = MAX_INVENTORY;
- if (itemdb_isstackable2(data)) { //Stackable item.
- for(i = 0; i < MAX_INVENTORY; i++)
- if (inventory2[i].nameid == inventory[n].nameid &&
- inventory2[i].card[0] == inventory[n].card[0] && inventory2[i].card[1] == inventory[n].card[1] &&
- inventory2[i].card[2] == inventory[n].card[2] && inventory2[i].card[3] == inventory[n].card[3]) {
- if (inventory2[i].amount + amount > MAX_AMOUNT)
- return 0;
- inventory2[i].amount += amount;
- inventory[n].amount -= amount;
- break;
- }
- }
-
- if (i == MAX_INVENTORY) {// look for an empty slot.
- for(i = 0; i < MAX_INVENTORY && inventory2[i].nameid; i++);
- if (i == MAX_INVENTORY)
- return 0;
- memcpy(&inventory2[i], &inventory[n], sizeof(struct item));
- inventory2[i].amount = amount;
- inventory[n].amount -= amount;
- }
- }
- amount = tsd->deal.item[trade_i].amount;
- if (!amount)
- continue;
- n = tsd->deal.item[trade_i].index;
- if (amount > inventory2[n].amount)
- return 0;
- // search if it's possible to add item (for full inventory)
- data = itemdb_search(inventory2[n].nameid);
- i = MAX_INVENTORY;
- if (itemdb_isstackable2(data)) {
- for(i = 0; i < MAX_INVENTORY; i++)
- if (inventory[i].nameid == inventory2[n].nameid &&
- inventory[i].card[0] == inventory2[n].card[0] && inventory[i].card[1] == inventory2[n].card[1] &&
- inventory[i].card[2] == inventory2[n].card[2] && inventory[i].card[3] == inventory2[n].card[3]) {
- if (inventory[i].amount + amount > MAX_AMOUNT)
- return 0;
- inventory[i].amount += amount;
- inventory2[n].amount -= amount;
- break;
- }
- }
- if (i == MAX_INVENTORY) {
- for(i = 0; i < MAX_INVENTORY && inventory[i].nameid; i++);
- if (i == MAX_INVENTORY)
- return 0;
- memcpy(&inventory[i], &inventory2[n], sizeof(struct item));
- inventory[i].amount = amount;
- inventory2[n].amount -= amount;
- }
- }
-
- return 1;
-}
-
-/*==========================================
- * Adds an item/qty to the trade window [rewrite by Skotlex]
- *------------------------------------------
- */
-void trade_tradeadditem(struct map_session_data *sd, int index, int amount) {
- struct map_session_data *target_sd;
- struct item *item;
- int trade_i, trade_weight;
-
- nullpo_retv(sd);
- if (!sd->state.trading || sd->state.deal_locked > 0)
- return; //Can't add stuff.
-
- if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
- trade_tradecancel(sd);
- return;
- }
-
- if (amount == 0)
- { //Why do this.. ~.~ just send an ack, the item won't display on the trade window.
- clif_tradeitemok(sd, index, 0);
- return;
- }
-
- if (index == 0)
- { //Adding Zeny
- if (amount >= 0 && amount <= sd->status.zeny && // check amount
- (amount <= MAX_ZENY - target_sd->status.zeny)) // fix positiv overflow
- { //Check Ok
- sd->deal.zeny = amount;
- clif_tradeadditem(sd, target_sd, 0, amount);
- } else //Send overweight when trying to add too much zeny? Hope they get the idea...
- clif_tradeitemok(sd, 0, 1);
- return;
- }
-
- index = index -2; //Why the actual index used is -2?
- //Item checks...
- if (index < 0 || index >= MAX_INVENTORY)
- return;
- if (amount < 0 || amount > sd->status.inventory[index].amount)
- return;
-
- item = &sd->status.inventory[index];
- trade_i = pc_isGM(sd); //Recycling the variables to check for trad restrict.
- trade_weight = pc_isGM(target_sd);
- if (!itemdb_cantrade(item, trade_i, trade_weight) && //Can't trade
- (pc_get_partner(sd) != target_sd ||
- !itemdb_canpartnertrade(item, trade_i, trade_weight))) //Can't partner-trade
- {
- clif_displaymessage (sd->fd, msg_txt(260));
- return;
- }
-
- for(trade_i = 0; trade_i < 10; trade_i++)
- { //Locate a trade position
- if (sd->deal.item[trade_i].index == index ||
- sd->deal.item[trade_i].amount == 0)
- break;
- }
- if (trade_i >= 10) //No space left
- {
- clif_tradeitemok(sd, index+2, 1);
- return;
- }
-
- trade_weight = sd->inventory_data[index]->weight * amount;
- if (target_sd->weight + sd->deal.weight + trade_weight > target_sd->max_weight)
- { //fail to add item -- the player was over weighted.
- clif_tradeitemok(sd, index+2, 1);
- return;
- }
-
- if (sd->deal.item[trade_i].index == index)
- { //The same item as before is being readjusted.
- if (sd->deal.item[trade_i].amount + amount > sd->status.inventory[index].amount)
- { //packet deal exploit check
- amount = sd->status.inventory[index].amount - sd->deal.item[trade_i].amount;
- trade_weight = sd->inventory_data[index]->weight * amount;
- }
- sd->deal.item[trade_i].amount += amount;
- } else { //New deal item
- sd->deal.item[trade_i].index = index;
- sd->deal.item[trade_i].amount = amount;
- }
- sd->deal.weight += trade_weight;
-
- clif_tradeitemok(sd, index+2, 0); // Return the index as it was received
- clif_tradeadditem(sd, target_sd, index+2, amount); //index fix
-}
-
-/*==========================================
- * 'Ok' button on the trade window is pressed.
- *------------------------------------------
- */
-void trade_tradeok(struct map_session_data *sd) {
- struct map_session_data *target_sd;
-
- if(sd->state.deal_locked || !sd->state.trading)
- return;
-
- if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
- trade_tradecancel(sd);
- return;
- }
- sd->state.deal_locked = 1;
- clif_tradeitemok(sd, 0, 0);
- clif_tradedeal_lock(sd, 0);
- clif_tradedeal_lock(target_sd, 1);
-}
-
-/*==========================================
- * 'Cancel' is pressed. (or trade was force-cancelled by the code)
- *------------------------------------------
- */
-void trade_tradecancel(struct map_session_data *sd) {
- struct map_session_data *target_sd;
- int trade_i;
-
- if(!sd->state.trading)
- return;
-
- for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual)
- if (!sd->deal.item[trade_i].amount)
- continue;
- clif_additem(sd, sd->deal.item[trade_i].index, sd->deal.item[trade_i].amount, 0);
- sd->deal.item[trade_i].index = 0;
- sd->deal.item[trade_i].amount = 0;
- }
- if (sd->deal.zeny) {
- clif_updatestatus(sd, SP_ZENY);
- sd->deal.zeny = 0;
- }
-
- target_sd = map_id2sd(sd->trade_partner);
- sd->state.deal_locked = 0;
- sd->state.trading = 0;
- sd->trade_partner = 0;
- clif_tradecancelled(sd);
-
- if (!target_sd)
- return;
-
- for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual)
- if (!target_sd->deal.item[trade_i].amount)
- continue;
- clif_additem(target_sd, target_sd->deal.item[trade_i].index, target_sd->deal.item[trade_i].amount, 0);
- target_sd->deal.item[trade_i].index = 0;
- target_sd->deal.item[trade_i].amount = 0;
- }
-
- if (target_sd->deal.zeny) {
- clif_updatestatus(target_sd, SP_ZENY);
- target_sd->deal.zeny = 0;
- }
- target_sd->state.deal_locked = 0;
- target_sd->trade_partner = 0;
- target_sd->state.trading = 0;
- clif_tradecancelled(target_sd);
-}
-
-/*==========================================
- * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- *------------------------------------------
- */
-void trade_tradecommit(struct map_session_data *sd) {
- struct map_session_data *tsd;
- int trade_i;
- int flag;
-
- if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
- return;
-
- if ((tsd = map_id2sd(sd->trade_partner)) == NULL) {
- trade_tradecancel(sd);
- return;
- }
-
- sd->state.deal_locked = 2;
-
- if (tsd->state.deal_locked < 2)
- return; //Not yet time for trading.
-
- //Now is a good time (to save on resources) to check that the trade can indeed be made and it's not exploitable.
- // check exploit (trade more items that you have)
- if (impossible_trade_check(sd)) {
- trade_tradecancel(sd);
- return;
- }
- // check exploit (trade more items that you have)
- if (impossible_trade_check(tsd)) {
- trade_tradecancel(tsd);
- return;
- }
- // check for full inventory (can not add traded items)
- if (!trade_check(sd,tsd)) { // check the both players
- trade_tradecancel(sd);
- return;
- }
-
- // trade is accepted and correct.
- for(trade_i = 0; trade_i < 10; trade_i++) {
- int n;
- if (sd->deal.item[trade_i].amount) {
- n = sd->deal.item[trade_i].index;
-
- flag = pc_additem(tsd, &sd->status.inventory[n], sd->deal.item[trade_i].amount);
- if (flag == 0) {
- //Logs (T)rade [Lupus]
- if(log_config.enable_logs&0x2) {
- log_pick_pc(sd, "T", sd->status.inventory[n].nameid, -(sd->deal.item[trade_i].amount), &sd->status.inventory[n]);
- log_pick_pc(tsd, "T", sd->status.inventory[n].nameid, sd->deal.item[trade_i].amount, &sd->status.inventory[n]);
- }
- //Logs
- pc_delitem(sd, n, sd->deal.item[trade_i].amount, 1);
- } else
- clif_additem(sd, n, sd->deal.item[trade_i].amount, 0);
- sd->deal.item[trade_i].index = 0;
- sd->deal.item[trade_i].amount = 0;
- }
- if (tsd->deal.item[trade_i].amount) {
- n = tsd->deal.item[trade_i].index;
-
- flag = pc_additem(sd, &tsd->status.inventory[n], tsd->deal.item[trade_i].amount);
- if (flag == 0) {
- //Logs (T)rade [Lupus]
- if(log_config.enable_logs&0x2) {
- log_pick_pc(tsd, "T", tsd->status.inventory[n].nameid, -(tsd->deal.item[trade_i].amount), &tsd->status.inventory[n]);
- log_pick_pc(sd, "T", tsd->status.inventory[n].nameid, tsd->deal.item[trade_i].amount, &tsd->status.inventory[n]);
- }
- //Logs
- pc_delitem(tsd, n, tsd->deal.item[trade_i].amount, 1);
- } else
- clif_additem(tsd, n, tsd->deal.item[trade_i].amount, 0);
- tsd->deal.item[trade_i].index = 0;
- tsd->deal.item[trade_i].amount = 0;
- }
- }
- if (sd->deal.zeny || tsd->deal.zeny) {
- if (sd->deal.zeny) {
- sd->status.zeny -= sd->deal.zeny;
- tsd->status.zeny += sd->deal.zeny;
- if (log_config.zeny)
- log_zeny(tsd, "T", sd, sd->deal.zeny);//Logs Zeny (T)rade [Lupus]
- sd->deal.zeny = 0;
- }
- if (tsd->deal.zeny) {
- tsd->status.zeny -= tsd->deal.zeny;
- sd->status.zeny += tsd->deal.zeny;
- if (log_config.zeny)
- log_zeny(sd, "T", tsd, tsd->deal.zeny);//Logs Zeny (T)rade [Lupus]
- tsd->deal.zeny = 0;
- }
- clif_updatestatus(sd, SP_ZENY);
- clif_updatestatus(tsd, SP_ZENY);
- }
-
- sd->state.deal_locked = 0;
- sd->trade_partner = 0;
- sd->state.trading = 0;
-
- tsd->state.deal_locked = 0;
- tsd->trade_partner = 0;
- tsd->state.trading = 0;
-
- clif_tradecompleted(sd, 0);
- clif_tradecompleted(tsd, 0);
- // save both player to avoid crash: they always have no advantage/disadvantage between the 2 players
- if (save_settings&1)
- {
- chrif_save(sd,0);
- chrif_save(tsd,0);
- }
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <string.h>
+
+#include "../common/nullpo.h"
+#include "clif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "trade.h"
+#include "pc.h"
+#include "npc.h"
+#include "battle.h"
+#include "chrif.h"
+#include "storage.h"
+#include "intif.h"
+#include "atcommand.h"
+#include "log.h"
+#include "../common/malloc.h"
+
+//Max distance from traders to enable a trade to take place.
+#define TRADE_DISTANCE 2
+
+/*==========================================
+ * Initiates a trade request.
+ *------------------------------------------
+ */
+void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd) {
+ int level;
+
+ nullpo_retv(sd);
+
+ if (map[sd->bl.m].flag.notrade) {
+ clif_displaymessage (sd->fd, msg_txt(272));
+ return; //Can't trade in notrade mapflag maps.
+ }
+
+ if (target_sd == NULL || sd == target_sd) {
+ clif_tradestart(sd, 1); // character does not exist
+ return;
+ }
+
+ if (!battle_config.invite_request_check) {
+ if (target_sd->guild_invite > 0 || target_sd->party_invite > 0) {
+ clif_tradestart(sd, 2);
+ return;
+ }
+ }
+
+ if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) {
+ trade_tradecancel(sd); // person is in another trade
+ return;
+ }
+
+ level = pc_isGM(sd);
+ if ( pc_can_give_items(level) || pc_can_give_items(pc_isGM(target_sd)) ) //check if both GMs are allowed to trade
+ {
+ clif_displaymessage(sd->fd, msg_txt(246));
+ trade_tradecancel(sd); // GM is not allowed to trade
+ return;
+ }
+
+ //Fixed. Only real GMs can request trade from far away! [Lupus]
+ if (level < lowest_gm_level && (sd->bl.m != target_sd->bl.m ||
+ !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE)
+ )) {
+ clif_tradestart(sd, 0); // too far
+ return ;
+ }
+
+ target_sd->trade_partner = sd->status.account_id;
+ sd->trade_partner = target_sd->status.account_id;
+ clif_traderequest(target_sd, sd->status.name);
+}
+
+/*==========================================
+ * Reply to a trade-request.
+ *------------------------------------------
+ */
+void trade_tradeack(struct map_session_data *sd, int type) {
+ struct map_session_data *target_sd;
+ nullpo_retv(sd);
+
+ if (sd->state.trading || !sd->trade_partner)
+ return; //Already trading or no partner set.
+
+ if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
+ sd->trade_partner=0;
+ return;
+ }
+
+ if (target_sd->state.trading || target_sd->trade_partner != sd->bl.id)
+ return; //Already trading or wrong partner.
+
+ //Copied here as well since the original character could had warped.
+ if (type == 3 && pc_isGM(target_sd) < lowest_gm_level && (sd->bl.m != target_sd->bl.m ||
+ !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE)
+ )) {
+ sd->trade_partner=0;
+ target_sd->trade_partner = 0;
+ clif_tradestart(sd, 0); // too far
+ return;
+ }
+
+ //TODO: Type 4/3? What would 1/2 and the rest do?
+ if (type == 4) { // Cancel
+ sd->state.deal_locked = 0;
+ sd->trade_partner = 0;
+ target_sd->state.deal_locked = 0;
+ target_sd->trade_partner = 0;
+ clif_tradestart(target_sd, type);
+ clif_tradestart(sd, type);
+ }
+
+ if (type == 3) { //Initiate trade
+ sd->state.trading = 1;
+ target_sd->state.trading = 1;
+ malloc_set(&sd->deal, 0, sizeof(sd->deal));
+ malloc_set(&target_sd->deal, 0, sizeof(target_sd->deal));
+ clif_tradestart(target_sd, type);
+ clif_tradestart(sd, type);
+ if (sd->npc_id)
+ npc_event_dequeue(sd);
+ if (target_sd->npc_id)
+ npc_event_dequeue(target_sd);
+ }
+}
+
+/*==========================================
+ * Check here hacker for duplicate item in trade
+ * normal client refuse to have 2 same types of item (except equipment) in same trade window
+ * normal client authorise only no equiped item and only from inventory
+ *------------------------------------------
+ */
+int impossible_trade_check(struct map_session_data *sd) {
+ struct item inventory[MAX_INVENTORY];
+ char message_to_gm[200];
+ int i, index;
+
+ nullpo_retr(1, sd);
+
+ if(sd->deal.zeny > sd->status.zeny)
+ {
+ pc_setglobalreg(sd,"ZENY_HACKER",1);
+ return -1;
+ }
+
+ // get inventory of player
+ memcpy(&inventory, &sd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
+
+ // remove this part: arrows can be trade and equiped
+ // re-added! [celest]
+ // remove equiped items (they can not be trade)
+ for (i = 0; i < MAX_INVENTORY; i++)
+ if (inventory[i].nameid > 0 && inventory[i].equip && !(inventory[i].equip & EQP_AMMO))
+ malloc_set(&inventory[i], 0, sizeof(struct item));
+
+ // check items in player inventory
+ for(i = 0; i < 10; i++) {
+ if (!sd->deal.item[i].amount)
+ continue;
+ index = sd->deal.item[i].index;
+ if (inventory[index].amount < sd->deal.item[i].amount)
+ { // if more than the player have -> hack
+ sprintf(message_to_gm, msg_txt(538), sd->status.name, sd->status.account_id); // Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
+ sprintf(message_to_gm, msg_txt(539), inventory[index].amount, inventory[index].nameid, sd->deal.item[i].amount); // This player has %d of a kind of item (id: %d), and try to trade %d of them.
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
+ // if we block people
+ if (battle_config.ban_hack_trade < 0) {
+ chrif_char_ask_name(-1, sd->status.name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
+ clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
+ // message about the ban
+ sprintf(message_to_gm, msg_txt(540)); // This player has been definitivly blocked.
+ // if we ban people
+ } else if (battle_config.ban_hack_trade > 0) {
+ chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
+ clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
+ // message about the ban
+ sprintf(message_to_gm, msg_txt(507), battle_config.ban_hack_trade); // This player has been banned for %d minute(s).
+ } else
+ // message about the ban
+ sprintf(message_to_gm, msg_txt(508)); // This player hasn't been banned (Ban option is disabled).
+
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
+ return 1;
+ }
+ inventory[index].amount -= sd->deal.item[i].amount; // remove item from inventory
+ }
+ return 0;
+}
+
+/*==========================================
+ * Checks if trade is possible (against zeny limits, inventory limits, etc)
+ *------------------------------------------
+ */
+int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
+ struct item inventory[MAX_INVENTORY];
+ struct item inventory2[MAX_INVENTORY];
+ struct item_data *data;
+ int trade_i, i, amount, n;
+
+ // check zenys value against hackers (Zeny was already checked on time of adding, but you never know when you lost some zeny since then.
+ if(sd->deal.zeny > sd->status.zeny || (tsd->status.zeny > MAX_ZENY - sd->deal.zeny))
+ return 0;
+ if(tsd->deal.zeny > tsd->status.zeny || (sd->status.zeny > MAX_ZENY - tsd->deal.zeny))
+ return 0;
+
+ // get inventory of player
+ memcpy(&inventory, &sd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
+ memcpy(&inventory2, &tsd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
+
+ // check free slot in both inventory
+ for(trade_i = 0; trade_i < 10; trade_i++) {
+ amount = sd->deal.item[trade_i].amount;
+ if (amount) {
+ n = sd->deal.item[trade_i].index;
+ if (amount > inventory[n].amount)
+ return 0; //qty Exploit?
+
+ data = itemdb_search(inventory[n].nameid);
+ i = MAX_INVENTORY;
+ if (itemdb_isstackable2(data)) { //Stackable item.
+ for(i = 0; i < MAX_INVENTORY; i++)
+ if (inventory2[i].nameid == inventory[n].nameid &&
+ inventory2[i].card[0] == inventory[n].card[0] && inventory2[i].card[1] == inventory[n].card[1] &&
+ inventory2[i].card[2] == inventory[n].card[2] && inventory2[i].card[3] == inventory[n].card[3]) {
+ if (inventory2[i].amount + amount > MAX_AMOUNT)
+ return 0;
+ inventory2[i].amount += amount;
+ inventory[n].amount -= amount;
+ break;
+ }
+ }
+
+ if (i == MAX_INVENTORY) {// look for an empty slot.
+ for(i = 0; i < MAX_INVENTORY && inventory2[i].nameid; i++);
+ if (i == MAX_INVENTORY)
+ return 0;
+ memcpy(&inventory2[i], &inventory[n], sizeof(struct item));
+ inventory2[i].amount = amount;
+ inventory[n].amount -= amount;
+ }
+ }
+ amount = tsd->deal.item[trade_i].amount;
+ if (!amount)
+ continue;
+ n = tsd->deal.item[trade_i].index;
+ if (amount > inventory2[n].amount)
+ return 0;
+ // search if it's possible to add item (for full inventory)
+ data = itemdb_search(inventory2[n].nameid);
+ i = MAX_INVENTORY;
+ if (itemdb_isstackable2(data)) {
+ for(i = 0; i < MAX_INVENTORY; i++)
+ if (inventory[i].nameid == inventory2[n].nameid &&
+ inventory[i].card[0] == inventory2[n].card[0] && inventory[i].card[1] == inventory2[n].card[1] &&
+ inventory[i].card[2] == inventory2[n].card[2] && inventory[i].card[3] == inventory2[n].card[3]) {
+ if (inventory[i].amount + amount > MAX_AMOUNT)
+ return 0;
+ inventory[i].amount += amount;
+ inventory2[n].amount -= amount;
+ break;
+ }
+ }
+ if (i == MAX_INVENTORY) {
+ for(i = 0; i < MAX_INVENTORY && inventory[i].nameid; i++);
+ if (i == MAX_INVENTORY)
+ return 0;
+ memcpy(&inventory[i], &inventory2[n], sizeof(struct item));
+ inventory[i].amount = amount;
+ inventory2[n].amount -= amount;
+ }
+ }
+
+ return 1;
+}
+
+/*==========================================
+ * Adds an item/qty to the trade window [rewrite by Skotlex]
+ *------------------------------------------
+ */
+void trade_tradeadditem(struct map_session_data *sd, int index, int amount) {
+ struct map_session_data *target_sd;
+ struct item *item;
+ int trade_i, trade_weight;
+
+ nullpo_retv(sd);
+ if (!sd->state.trading || sd->state.deal_locked > 0)
+ return; //Can't add stuff.
+
+ if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
+ trade_tradecancel(sd);
+ return;
+ }
+
+ if (amount == 0)
+ { //Why do this.. ~.~ just send an ack, the item won't display on the trade window.
+ clif_tradeitemok(sd, index, 0);
+ return;
+ }
+
+ if (index == 0)
+ { //Adding Zeny
+ if (amount >= 0 && amount <= sd->status.zeny && // check amount
+ (amount <= MAX_ZENY - target_sd->status.zeny)) // fix positiv overflow
+ { //Check Ok
+ sd->deal.zeny = amount;
+ clif_tradeadditem(sd, target_sd, 0, amount);
+ } else //Send overweight when trying to add too much zeny? Hope they get the idea...
+ clif_tradeitemok(sd, 0, 1);
+ return;
+ }
+
+ index = index -2; //Why the actual index used is -2?
+ //Item checks...
+ if (index < 0 || index >= MAX_INVENTORY)
+ return;
+ if (amount < 0 || amount > sd->status.inventory[index].amount)
+ return;
+
+ item = &sd->status.inventory[index];
+ trade_i = pc_isGM(sd); //Recycling the variables to check for trad restrict.
+ trade_weight = pc_isGM(target_sd);
+ if (!itemdb_cantrade(item, trade_i, trade_weight) && //Can't trade
+ (pc_get_partner(sd) != target_sd ||
+ !itemdb_canpartnertrade(item, trade_i, trade_weight))) //Can't partner-trade
+ {
+ clif_displaymessage (sd->fd, msg_txt(260));
+ return;
+ }
+
+ for(trade_i = 0; trade_i < 10; trade_i++)
+ { //Locate a trade position
+ if (sd->deal.item[trade_i].index == index ||
+ sd->deal.item[trade_i].amount == 0)
+ break;
+ }
+ if (trade_i >= 10) //No space left
+ {
+ clif_tradeitemok(sd, index+2, 1);
+ return;
+ }
+
+ trade_weight = sd->inventory_data[index]->weight * amount;
+ if (target_sd->weight + sd->deal.weight + trade_weight > target_sd->max_weight)
+ { //fail to add item -- the player was over weighted.
+ clif_tradeitemok(sd, index+2, 1);
+ return;
+ }
+
+ if (sd->deal.item[trade_i].index == index)
+ { //The same item as before is being readjusted.
+ if (sd->deal.item[trade_i].amount + amount > sd->status.inventory[index].amount)
+ { //packet deal exploit check
+ amount = sd->status.inventory[index].amount - sd->deal.item[trade_i].amount;
+ trade_weight = sd->inventory_data[index]->weight * amount;
+ }
+ sd->deal.item[trade_i].amount += amount;
+ } else { //New deal item
+ sd->deal.item[trade_i].index = index;
+ sd->deal.item[trade_i].amount = amount;
+ }
+ sd->deal.weight += trade_weight;
+
+ clif_tradeitemok(sd, index+2, 0); // Return the index as it was received
+ clif_tradeadditem(sd, target_sd, index+2, amount); //index fix
+}
+
+/*==========================================
+ * 'Ok' button on the trade window is pressed.
+ *------------------------------------------
+ */
+void trade_tradeok(struct map_session_data *sd) {
+ struct map_session_data *target_sd;
+
+ if(sd->state.deal_locked || !sd->state.trading)
+ return;
+
+ if ((target_sd = map_id2sd(sd->trade_partner)) == NULL) {
+ trade_tradecancel(sd);
+ return;
+ }
+ sd->state.deal_locked = 1;
+ clif_tradeitemok(sd, 0, 0);
+ clif_tradedeal_lock(sd, 0);
+ clif_tradedeal_lock(target_sd, 1);
+}
+
+/*==========================================
+ * 'Cancel' is pressed. (or trade was force-cancelled by the code)
+ *------------------------------------------
+ */
+void trade_tradecancel(struct map_session_data *sd) {
+ struct map_session_data *target_sd;
+ int trade_i;
+
+ if(!sd->state.trading)
+ return;
+
+ for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual)
+ if (!sd->deal.item[trade_i].amount)
+ continue;
+ clif_additem(sd, sd->deal.item[trade_i].index, sd->deal.item[trade_i].amount, 0);
+ sd->deal.item[trade_i].index = 0;
+ sd->deal.item[trade_i].amount = 0;
+ }
+ if (sd->deal.zeny) {
+ clif_updatestatus(sd, SP_ZENY);
+ sd->deal.zeny = 0;
+ }
+
+ target_sd = map_id2sd(sd->trade_partner);
+ sd->state.deal_locked = 0;
+ sd->state.trading = 0;
+ sd->trade_partner = 0;
+ clif_tradecancelled(sd);
+
+ if (!target_sd)
+ return;
+
+ for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual)
+ if (!target_sd->deal.item[trade_i].amount)
+ continue;
+ clif_additem(target_sd, target_sd->deal.item[trade_i].index, target_sd->deal.item[trade_i].amount, 0);
+ target_sd->deal.item[trade_i].index = 0;
+ target_sd->deal.item[trade_i].amount = 0;
+ }
+
+ if (target_sd->deal.zeny) {
+ clif_updatestatus(target_sd, SP_ZENY);
+ target_sd->deal.zeny = 0;
+ }
+ target_sd->state.deal_locked = 0;
+ target_sd->trade_partner = 0;
+ target_sd->state.trading = 0;
+ clif_tradecancelled(target_sd);
+}
+
+/*==========================================
+ * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
+ *------------------------------------------
+ */
+void trade_tradecommit(struct map_session_data *sd) {
+ struct map_session_data *tsd;
+ int trade_i;
+ int flag;
+
+ if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
+ return;
+
+ if ((tsd = map_id2sd(sd->trade_partner)) == NULL) {
+ trade_tradecancel(sd);
+ return;
+ }
+
+ sd->state.deal_locked = 2;
+
+ if (tsd->state.deal_locked < 2)
+ return; //Not yet time for trading.
+
+ //Now is a good time (to save on resources) to check that the trade can indeed be made and it's not exploitable.
+ // check exploit (trade more items that you have)
+ if (impossible_trade_check(sd)) {
+ trade_tradecancel(sd);
+ return;
+ }
+ // check exploit (trade more items that you have)
+ if (impossible_trade_check(tsd)) {
+ trade_tradecancel(tsd);
+ return;
+ }
+ // check for full inventory (can not add traded items)
+ if (!trade_check(sd,tsd)) { // check the both players
+ trade_tradecancel(sd);
+ return;
+ }
+
+ // trade is accepted and correct.
+ for(trade_i = 0; trade_i < 10; trade_i++) {
+ int n;
+ if (sd->deal.item[trade_i].amount) {
+ n = sd->deal.item[trade_i].index;
+
+ flag = pc_additem(tsd, &sd->status.inventory[n], sd->deal.item[trade_i].amount);
+ if (flag == 0) {
+ //Logs (T)rade [Lupus]
+ if(log_config.enable_logs&0x2) {
+ log_pick_pc(sd, "T", sd->status.inventory[n].nameid, -(sd->deal.item[trade_i].amount), &sd->status.inventory[n]);
+ log_pick_pc(tsd, "T", sd->status.inventory[n].nameid, sd->deal.item[trade_i].amount, &sd->status.inventory[n]);
+ }
+ //Logs
+ pc_delitem(sd, n, sd->deal.item[trade_i].amount, 1);
+ } else
+ clif_additem(sd, n, sd->deal.item[trade_i].amount, 0);
+ sd->deal.item[trade_i].index = 0;
+ sd->deal.item[trade_i].amount = 0;
+ }
+ if (tsd->deal.item[trade_i].amount) {
+ n = tsd->deal.item[trade_i].index;
+
+ flag = pc_additem(sd, &tsd->status.inventory[n], tsd->deal.item[trade_i].amount);
+ if (flag == 0) {
+ //Logs (T)rade [Lupus]
+ if(log_config.enable_logs&0x2) {
+ log_pick_pc(tsd, "T", tsd->status.inventory[n].nameid, -(tsd->deal.item[trade_i].amount), &tsd->status.inventory[n]);
+ log_pick_pc(sd, "T", tsd->status.inventory[n].nameid, tsd->deal.item[trade_i].amount, &tsd->status.inventory[n]);
+ }
+ //Logs
+ pc_delitem(tsd, n, tsd->deal.item[trade_i].amount, 1);
+ } else
+ clif_additem(tsd, n, tsd->deal.item[trade_i].amount, 0);
+ tsd->deal.item[trade_i].index = 0;
+ tsd->deal.item[trade_i].amount = 0;
+ }
+ }
+ if (sd->deal.zeny || tsd->deal.zeny) {
+ if (sd->deal.zeny) {
+ sd->status.zeny -= sd->deal.zeny;
+ tsd->status.zeny += sd->deal.zeny;
+ if (log_config.zeny)
+ log_zeny(tsd, "T", sd, sd->deal.zeny);//Logs Zeny (T)rade [Lupus]
+ sd->deal.zeny = 0;
+ }
+ if (tsd->deal.zeny) {
+ tsd->status.zeny -= tsd->deal.zeny;
+ sd->status.zeny += tsd->deal.zeny;
+ if (log_config.zeny)
+ log_zeny(sd, "T", tsd, tsd->deal.zeny);//Logs Zeny (T)rade [Lupus]
+ tsd->deal.zeny = 0;
+ }
+ clif_updatestatus(sd, SP_ZENY);
+ clif_updatestatus(tsd, SP_ZENY);
+ }
+
+ sd->state.deal_locked = 0;
+ sd->trade_partner = 0;
+ sd->state.trading = 0;
+
+ tsd->state.deal_locked = 0;
+ tsd->trade_partner = 0;
+ tsd->state.trading = 0;
+
+ clif_tradecompleted(sd, 0);
+ clif_tradecompleted(tsd, 0);
+ // save both player to avoid crash: they always have no advantage/disadvantage between the 2 players
+ if (save_settings&1)
+ {
+ chrif_save(sd,0);
+ chrif_save(tsd,0);
+ }
+}
diff --git a/src/map/trade.h b/src/map/trade.h
index a695a50e8..bcd609271 100644
--- a/src/map/trade.h
+++ b/src/map/trade.h
@@ -1,15 +1,15 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _TRADE_H_
-#define _TRADE_H_
-
-#include "map.h"
-void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd);
-void trade_tradeack(struct map_session_data *sd,int type);
-void trade_tradeadditem(struct map_session_data *sd,int index,int amount);
-void trade_tradeok(struct map_session_data *sd);
-void trade_tradecancel(struct map_session_data *sd);
-void trade_tradecommit(struct map_session_data *sd);
-
-#endif // _TRADE_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _TRADE_H_
+#define _TRADE_H_
+
+#include "map.h"
+void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd);
+void trade_tradeack(struct map_session_data *sd,int type);
+void trade_tradeadditem(struct map_session_data *sd,int index,int amount);
+void trade_tradeok(struct map_session_data *sd);
+void trade_tradecancel(struct map_session_data *sd);
+void trade_tradecommit(struct map_session_data *sd);
+
+#endif // _TRADE_H_
diff --git a/src/map/vending.c b/src/map/vending.c
index 0f8ceaa30..9b4b797e0 100644
--- a/src/map/vending.c
+++ b/src/map/vending.c
@@ -1,267 +1,267 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "clif.h"
-#include "itemdb.h"
-#include "atcommand.h"
-#include "map.h"
-#include "chrif.h"
-#include "vending.h"
-#include "pc.h"
-#include "skill.h"
-#include "battle.h"
-#include "log.h"
-
-#include "irc.h"
-
-/*==========================================
- * ˜I“X•Â½
- *------------------------------------------
-*/
-void vending_closevending(struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->vender_id=0;
- clif_closevendingboard(&sd->bl,0);
- if(use_irc && irc_announce_shop_flag)
- irc_announce_shop(sd,0);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
- *------------------------------------------
- */
-void vending_vendinglistreq(struct map_session_data *sd,int id)
-{
- struct map_session_data *vsd;
-
- nullpo_retv(sd);
-
- if( (vsd=map_id2sd(id)) == NULL )
- return;
- if(vsd->vender_id==0)
- return;
- clif_vendinglist(sd,id,vsd->vending);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“ü
- *------------------------------------------
- */
-void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p)
-{
- int i, j, w, new_ = 0, blank, vend_list[MAX_VENDING];
- double z;
- unsigned short amount;
- short idx;
- struct map_session_data *vsd = map_id2sd(id);
- struct vending vending[MAX_VENDING]; // against duplicate packets
-
- nullpo_retv(sd);
-
- if (vsd == NULL)
- return;
- if (vsd->vender_id == 0)
- return;
- if (vsd->vender_id == sd->bl.id)
- return;
-
- // check number of buying items
- if (len < 8 + 4 || len > 8 + 4 * MAX_VENDING) {
- clif_buyvending(sd, 0, 32767, 4); // not enough quantity (index and amount are unknown)
- return;
- }
-
- blank = pc_inventoryblank(sd); //number of free cells in the buyer's inventory
-
- // duplicate item in vending to check hacker with multiple packets
- memcpy(&vending, &vsd->vending, sizeof(struct vending) * MAX_VENDING); // copy vending list
-
- // some checks
- z = 0.;
- w = 0;
- for(i = 0; 8 + 4 * i < len; i++) {
- amount = *(unsigned short*)(p + 4 * i);
- idx = *(short*)(p + 2 + 4 * i) - 2;
-
- if (amount <= 0)
- return;
-
- // check of item index in the cart
- if (idx < 0 || idx >= MAX_CART)
- return;
-
- for(j = 0; j < vsd->vend_num; j++) {
- if (vsd->vending[j].index == idx) {
- vend_list[i] = j;
- break;
- }
- }
- if (j == vsd->vend_num)
- return; //picked non-existing item
-
- z += ((double)vsd->vending[j].value * (double)amount);
- if (z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY) { // fix positiv overflow (buyer)
- clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
- return; // zeny s'<
- }
- if (z + (double)vsd->status.zeny > (double)MAX_ZENY) { // fix positiv overflow (merchand)
- clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
- return; // zeny s'<
- }
- w += itemdb_weight(vsd->status.cart[idx].nameid) * amount;
- if (w + sd->weight > sd->max_weight) {
- clif_buyvending(sd, idx, amount, 2); // you can not buy, because overweight
- return;
- }
-
- if (vending[j].amount > vsd->status.cart[idx].amount) //Check to see if cart/vend info is in sync.
- vending[j].amount = vsd->status.cart[idx].amount;
-
- // if they try to add packets (example: get twice or more 2 apples if marchand has only 3 apples).
- // here, we check cumulativ amounts
- if (vending[j].amount < amount) {
- // send more quantity is not a hack (an other player can have buy items just before)
- clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // not enough quantity
- return;
- } else
- vending[j].amount -= amount;
-
- switch(pc_checkadditem(sd, vsd->status.cart[idx].nameid, amount)) {
- case ADDITEM_EXIST:
- break; //We'd add this item to the existing one (in buyers inventory)
- case ADDITEM_NEW:
- new_++;
- if (new_ > blank)
- return; //Buyer has no space in his inventory
- break;
- case ADDITEM_OVERAMOUNT:
- return; //too many items
- }
- }
-
- //Logs (V)ending Zeny [Lupus]
- if(log_config.zeny > 0 )
- log_zeny(vsd, "V", sd, (int)z);
- //Logs
-
- pc_payzeny(sd, (int)z);
- pc_getzeny(vsd, (int)z);
-
- for(i = 0; 8 + 4 * i < len; i++) {
- amount = *(short*)(p + 4 *i);
- idx = *(short*)(p + 2 + 4 * i) - 2;
- //if (amount < 0) break; // tested at start of the function
-
- //Logs sold (V)ending items [Lupus]
- if(log_config.enable_logs&0x4) {
- log_pick_pc(vsd, "V", vsd->status.cart[idx].nameid, -amount, (struct item*)&vsd->status.cart[idx]);
- log_pick_pc( sd, "V", vsd->status.cart[idx].nameid, amount, (struct item*)&vsd->status.cart[idx]);
- }
- //Logs
-
- // vending item
- pc_additem(sd, &vsd->status.cart[idx], amount);
- vsd->vending[vend_list[i]].amount -= amount;
- pc_cart_delitem(vsd, idx, amount, 0);
- clif_vendingreport(vsd, idx, amount);
-
- //print buyer's name
- if(battle_config.buyer_name) {
- char temp[256];
- sprintf(temp, msg_txt(265), sd->status.name);
- clif_disp_onlyself(vsd,temp,strlen(temp));
- }
- }
-
- //Always save BOTH: buyer and customer
- if (save_settings&2) {
- chrif_save(sd,0);
- chrif_save(vsd,0);
- }
- //check for @AUTOTRADE users [durf]
- if (vsd->state.autotrade)
- {
- //Close Vending (this was automatically done by the client, we have to do it manually for autovenders) [Skotlex]
- for(i = 0; i < vsd->vend_num && vsd->vending[i].amount < 1; i++);
- if (i == vsd->vend_num)
- {
- vending_closevending(vsd);
- map_quit(vsd); //They have no reason to stay around anymore, do they?
- }
- }
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p)
-{
- int i, j;
- int vending_skill_lvl;
- nullpo_retv(sd);
-
- if (map[sd->bl.m].flag.novending) {
- clif_displaymessage (sd->fd, msg_txt(276));
- return; //Can't vend in novending mapflag maps.
- }
-
- //check shopname len
- if(message[0] == '\0')
- return;
-
- vending_skill_lvl = pc_checkskill(sd, MC_VENDING);
- if(!vending_skill_lvl || !pc_iscarton(sd)) { // cart skill and cart check [Valaris]
- clif_skill_fail(sd,MC_VENDING,0,0);
- return;
- }
-
- if (flag) {
- // check number of items in shop
- if (len < 85 + 8 || len > 85 + 8 * MAX_VENDING || len > 85 + 8 * (2 + vending_skill_lvl)) {
- clif_skill_fail(sd, MC_VENDING, 0, 0);
- return;
- }
- for(i = 0, j = 0; (85 + 8 * j < len) && (i < MAX_VENDING); i++, j++) {
- sd->vending[i].index = *(short*)(p+8*j)-2;
- if (sd->vending[i].index < 0 || sd->vending[i].index >= MAX_CART ||
- !itemdb_cantrade(&sd->status.cart[sd->vending[i].index], pc_isGM(sd), pc_isGM(sd)))
- {
- i--; //Preserve the vending index, skip to the next item.
- continue;
- }
- sd->vending[i].amount = *(short*)(p+2+8*j);
- sd->vending[i].value = *(int*)(p+4+8*j);
- if(sd->vending[i].value > battle_config.vending_max_value)
- sd->vending[i].value=battle_config.vending_max_value;
- else if(sd->vending[i].value < 1)
- sd->vending[i].value = 1000000; // auto set to 1 million [celest]
- // ƒJ[ƒg“à‚̃AƒCƒeƒ€”‚Ɣ̔„‚·‚éƒAƒCƒeƒ€”‚É‘Šˆá‚ª‚ ‚Á‚½‚ç’†Ž~
- if(pc_cartitem_amount(sd, sd->vending[i].index, sd->vending[i].amount) < 0) { // fixes by Valaris and fritz
- clif_skill_fail(sd, MC_VENDING, 0, 0);
- return;
- }
- }
- if (i != j)
- { //Some items were not vended. [Skotlex]
- clif_displaymessage (sd->fd, msg_txt(266));
- }
- sd->vender_id = sd->bl.id;
- sd->vend_num = i;
- memcpy(sd->message,message, MESSAGE_SIZE-1);
- if (clif_openvending(sd,sd->vender_id,sd->vending) > 0){
- pc_stop_walking(sd,1);
- clif_showvendingboard(&sd->bl,message,0);
- if(use_irc && irc_announce_shop_flag)
- irc_announce_shop(sd,1);
- } else
- sd->vender_id = 0;
- }
-}
-
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <string.h>
+
+#include "../common/nullpo.h"
+#include "clif.h"
+#include "itemdb.h"
+#include "atcommand.h"
+#include "map.h"
+#include "chrif.h"
+#include "vending.h"
+#include "pc.h"
+#include "skill.h"
+#include "battle.h"
+#include "log.h"
+
+#include "irc.h"
+
+/*==========================================
+ * ˜I“X•Â½
+ *------------------------------------------
+*/
+void vending_closevending(struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ sd->vender_id=0;
+ clif_closevendingboard(&sd->bl,0);
+ if(use_irc && irc_announce_shop_flag)
+ irc_announce_shop(sd,0);
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
+ *------------------------------------------
+ */
+void vending_vendinglistreq(struct map_session_data *sd,int id)
+{
+ struct map_session_data *vsd;
+
+ nullpo_retv(sd);
+
+ if( (vsd=map_id2sd(id)) == NULL )
+ return;
+ if(vsd->vender_id==0)
+ return;
+ clif_vendinglist(sd,id,vsd->vending);
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€w“ü
+ *------------------------------------------
+ */
+void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p)
+{
+ int i, j, w, new_ = 0, blank, vend_list[MAX_VENDING];
+ double z;
+ unsigned short amount;
+ short idx;
+ struct map_session_data *vsd = map_id2sd(id);
+ struct vending vending[MAX_VENDING]; // against duplicate packets
+
+ nullpo_retv(sd);
+
+ if (vsd == NULL)
+ return;
+ if (vsd->vender_id == 0)
+ return;
+ if (vsd->vender_id == sd->bl.id)
+ return;
+
+ // check number of buying items
+ if (len < 8 + 4 || len > 8 + 4 * MAX_VENDING) {
+ clif_buyvending(sd, 0, 32767, 4); // not enough quantity (index and amount are unknown)
+ return;
+ }
+
+ blank = pc_inventoryblank(sd); //number of free cells in the buyer's inventory
+
+ // duplicate item in vending to check hacker with multiple packets
+ memcpy(&vending, &vsd->vending, sizeof(struct vending) * MAX_VENDING); // copy vending list
+
+ // some checks
+ z = 0.;
+ w = 0;
+ for(i = 0; 8 + 4 * i < len; i++) {
+ amount = *(unsigned short*)(p + 4 * i);
+ idx = *(short*)(p + 2 + 4 * i) - 2;
+
+ if (amount <= 0)
+ return;
+
+ // check of item index in the cart
+ if (idx < 0 || idx >= MAX_CART)
+ return;
+
+ for(j = 0; j < vsd->vend_num; j++) {
+ if (vsd->vending[j].index == idx) {
+ vend_list[i] = j;
+ break;
+ }
+ }
+ if (j == vsd->vend_num)
+ return; //picked non-existing item
+
+ z += ((double)vsd->vending[j].value * (double)amount);
+ if (z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY) { // fix positiv overflow (buyer)
+ clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
+ return; // zeny s'<
+ }
+ if (z + (double)vsd->status.zeny > (double)MAX_ZENY) { // fix positiv overflow (merchand)
+ clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
+ return; // zeny s'<
+ }
+ w += itemdb_weight(vsd->status.cart[idx].nameid) * amount;
+ if (w + sd->weight > sd->max_weight) {
+ clif_buyvending(sd, idx, amount, 2); // you can not buy, because overweight
+ return;
+ }
+
+ if (vending[j].amount > vsd->status.cart[idx].amount) //Check to see if cart/vend info is in sync.
+ vending[j].amount = vsd->status.cart[idx].amount;
+
+ // if they try to add packets (example: get twice or more 2 apples if marchand has only 3 apples).
+ // here, we check cumulativ amounts
+ if (vending[j].amount < amount) {
+ // send more quantity is not a hack (an other player can have buy items just before)
+ clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // not enough quantity
+ return;
+ } else
+ vending[j].amount -= amount;
+
+ switch(pc_checkadditem(sd, vsd->status.cart[idx].nameid, amount)) {
+ case ADDITEM_EXIST:
+ break; //We'd add this item to the existing one (in buyers inventory)
+ case ADDITEM_NEW:
+ new_++;
+ if (new_ > blank)
+ return; //Buyer has no space in his inventory
+ break;
+ case ADDITEM_OVERAMOUNT:
+ return; //too many items
+ }
+ }
+
+ //Logs (V)ending Zeny [Lupus]
+ if(log_config.zeny > 0 )
+ log_zeny(vsd, "V", sd, (int)z);
+ //Logs
+
+ pc_payzeny(sd, (int)z);
+ pc_getzeny(vsd, (int)z);
+
+ for(i = 0; 8 + 4 * i < len; i++) {
+ amount = *(short*)(p + 4 *i);
+ idx = *(short*)(p + 2 + 4 * i) - 2;
+ //if (amount < 0) break; // tested at start of the function
+
+ //Logs sold (V)ending items [Lupus]
+ if(log_config.enable_logs&0x4) {
+ log_pick_pc(vsd, "V", vsd->status.cart[idx].nameid, -amount, (struct item*)&vsd->status.cart[idx]);
+ log_pick_pc( sd, "V", vsd->status.cart[idx].nameid, amount, (struct item*)&vsd->status.cart[idx]);
+ }
+ //Logs
+
+ // vending item
+ pc_additem(sd, &vsd->status.cart[idx], amount);
+ vsd->vending[vend_list[i]].amount -= amount;
+ pc_cart_delitem(vsd, idx, amount, 0);
+ clif_vendingreport(vsd, idx, amount);
+
+ //print buyer's name
+ if(battle_config.buyer_name) {
+ char temp[256];
+ sprintf(temp, msg_txt(265), sd->status.name);
+ clif_disp_onlyself(vsd,temp,strlen(temp));
+ }
+ }
+
+ //Always save BOTH: buyer and customer
+ if (save_settings&2) {
+ chrif_save(sd,0);
+ chrif_save(vsd,0);
+ }
+ //check for @AUTOTRADE users [durf]
+ if (vsd->state.autotrade)
+ {
+ //Close Vending (this was automatically done by the client, we have to do it manually for autovenders) [Skotlex]
+ for(i = 0; i < vsd->vend_num && vsd->vending[i].amount < 1; i++);
+ if (i == vsd->vend_num)
+ {
+ vending_closevending(vsd);
+ map_quit(vsd); //They have no reason to stay around anymore, do they?
+ }
+ }
+}
+
+/*==========================================
+ * ˜I“XŠJÝ
+ *------------------------------------------
+ */
+void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p)
+{
+ int i, j;
+ int vending_skill_lvl;
+ nullpo_retv(sd);
+
+ if (map[sd->bl.m].flag.novending) {
+ clif_displaymessage (sd->fd, msg_txt(276));
+ return; //Can't vend in novending mapflag maps.
+ }
+
+ //check shopname len
+ if(message[0] == '\0')
+ return;
+
+ vending_skill_lvl = pc_checkskill(sd, MC_VENDING);
+ if(!vending_skill_lvl || !pc_iscarton(sd)) { // cart skill and cart check [Valaris]
+ clif_skill_fail(sd,MC_VENDING,0,0);
+ return;
+ }
+
+ if (flag) {
+ // check number of items in shop
+ if (len < 85 + 8 || len > 85 + 8 * MAX_VENDING || len > 85 + 8 * (2 + vending_skill_lvl)) {
+ clif_skill_fail(sd, MC_VENDING, 0, 0);
+ return;
+ }
+ for(i = 0, j = 0; (85 + 8 * j < len) && (i < MAX_VENDING); i++, j++) {
+ sd->vending[i].index = *(short*)(p+8*j)-2;
+ if (sd->vending[i].index < 0 || sd->vending[i].index >= MAX_CART ||
+ !itemdb_cantrade(&sd->status.cart[sd->vending[i].index], pc_isGM(sd), pc_isGM(sd)))
+ {
+ i--; //Preserve the vending index, skip to the next item.
+ continue;
+ }
+ sd->vending[i].amount = *(short*)(p+2+8*j);
+ sd->vending[i].value = *(int*)(p+4+8*j);
+ if(sd->vending[i].value > battle_config.vending_max_value)
+ sd->vending[i].value=battle_config.vending_max_value;
+ else if(sd->vending[i].value < 1)
+ sd->vending[i].value = 1000000; // auto set to 1 million [celest]
+ // ƒJ[ƒg“à‚̃AƒCƒeƒ€”‚Ɣ̔„‚·‚éƒAƒCƒeƒ€”‚É‘Šˆá‚ª‚ ‚Á‚½‚ç’†Ž~
+ if(pc_cartitem_amount(sd, sd->vending[i].index, sd->vending[i].amount) < 0) { // fixes by Valaris and fritz
+ clif_skill_fail(sd, MC_VENDING, 0, 0);
+ return;
+ }
+ }
+ if (i != j)
+ { //Some items were not vended. [Skotlex]
+ clif_displaymessage (sd->fd, msg_txt(266));
+ }
+ sd->vender_id = sd->bl.id;
+ sd->vend_num = i;
+ memcpy(sd->message,message, MESSAGE_SIZE-1);
+ if (clif_openvending(sd,sd->vender_id,sd->vending) > 0){
+ pc_stop_walking(sd,1);
+ clif_showvendingboard(&sd->bl,message,0);
+ if(use_irc && irc_announce_shop_flag)
+ irc_announce_shop(sd,1);
+ } else
+ sd->vender_id = 0;
+ }
+}
+
diff --git a/src/map/vending.h b/src/map/vending.h
index 021866d25..f4014a894 100644
--- a/src/map/vending.h
+++ b/src/map/vending.h
@@ -1,14 +1,14 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _VENDING_H_
-#define _VENDING_H_
-
-#include "map.h"
-
-void vending_closevending(struct map_session_data *sd);
-void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p);
-void vending_vendinglistreq(struct map_session_data *sd,int id);
-void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p);
-
-#endif // _VENDING_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _VENDING_H_
+#define _VENDING_H_
+
+#include "map.h"
+
+void vending_closevending(struct map_session_data *sd);
+void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p);
+void vending_vendinglistreq(struct map_session_data *sd,int id);
+void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p);
+
+#endif // _VENDING_H_
diff --git a/src/plugins/gui.c b/src/plugins/gui.c
index 6c9a8d85c..e8c097d21 100644
--- a/src/plugins/gui.c
+++ b/src/plugins/gui.c
@@ -1,101 +1,101 @@
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include "../common/plugin.h"
-//Needed for strcmpi
-#include "../common/mmo.h"
-
-// "I'm Alive" and "Flush stdout" Originally by Mugendai
-// Ported to plugin by Celest
-
-PLUGIN_INFO = {
- "AthenaGUI",
- PLUGIN_CORE,
- "1.0",
- PLUGIN_VERSION,
- "Core plugin for Athena GUI functions"
-};
-
-PLUGIN_EVENTS_TABLE = {
- { "gui_init", "Plugin_Init" },
- { NULL, NULL }
-};
-
-unsigned int (*gettick)();
-int (*add_timer_func_list)(int (*)(int,unsigned int,int,int),char*);
-int (*add_timer_interval)(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-void gui_init ()
-{
- char line[1024], w1[1024], w2[1024];
- int flush_on = 0;
- int flush_time = 100;
- int imalive_on = 0;
- int imalive_time = 30;
- char **argv;
- int *argc;
- FILE *fp;
- int i;
-
- IMPORT_SYMBOL(argc, 2);
- IMPORT_SYMBOL(argv, 3);
- IMPORT_SYMBOL(gettick, 5);
- IMPORT_SYMBOL(add_timer_interval, 8);
- IMPORT_SYMBOL(add_timer_func_list, 9);
-
- do {
- fp = fopen("plugins/gui.conf","r");
- if (fp == NULL)
- break;
-
- while(fgets(line, sizeof(line) -1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if(strcmpi(w1,"imalive_on")==0){
- imalive_on = atoi(w2);
- } else if(strcmpi(w1,"imalive_time")==0){
- imalive_time = atoi(w2);
- } else if(strcmpi(w1,"flush_on")==0){
- flush_on = atoi(w2);
- } else if(strcmpi(w1,"flush_time")==0){
- flush_time = atoi(w2);
- }
- }
- }
- fclose(fp);
- } while (0);
-
- for (i = 1; i < *argc ; i++)
- if (strcmp(argv[i], "--gui") == 0)
- flush_on = imalive_on = 1;
-
- if (flush_on) {
- add_timer_func_list(flush_timer, "flush_timer");
- add_timer_interval(gettick()+1000,flush_timer,0,0,flush_time);
- }
- if (imalive_on) {
- add_timer_func_list(imalive_timer, "imalive_timer");
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
- }
-}
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "../common/plugin.h"
+//Needed for strcmpi
+#include "../common/mmo.h"
+
+// "I'm Alive" and "Flush stdout" Originally by Mugendai
+// Ported to plugin by Celest
+
+PLUGIN_INFO = {
+ "AthenaGUI",
+ PLUGIN_CORE,
+ "1.0",
+ PLUGIN_VERSION,
+ "Core plugin for Athena GUI functions"
+};
+
+PLUGIN_EVENTS_TABLE = {
+ { "gui_init", "Plugin_Init" },
+ { NULL, NULL }
+};
+
+unsigned int (*gettick)();
+int (*add_timer_func_list)(int (*)(int,unsigned int,int,int),char*);
+int (*add_timer_interval)(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
+
+//-----------------------------------------------------
+//I'm Alive Alert
+//Used to output 'I'm Alive' every few seconds
+//Intended to let frontends know if the app froze
+//-----------------------------------------------------
+int imalive_timer(int tid, unsigned int tick, int id, int data){
+ printf("I'm Alive\n");
+ return 0;
+}
+
+//-----------------------------------------------------
+//Flush stdout
+//stdout buffer needs flushed to be seen in GUI
+//-----------------------------------------------------
+int flush_timer(int tid, unsigned int tick, int id, int data){
+ fflush(stdout);
+ return 0;
+}
+
+void gui_init ()
+{
+ char line[1024], w1[1024], w2[1024];
+ int flush_on = 0;
+ int flush_time = 100;
+ int imalive_on = 0;
+ int imalive_time = 30;
+ char **argv;
+ int *argc;
+ FILE *fp;
+ int i;
+
+ IMPORT_SYMBOL(argc, 2);
+ IMPORT_SYMBOL(argv, 3);
+ IMPORT_SYMBOL(gettick, 5);
+ IMPORT_SYMBOL(add_timer_interval, 8);
+ IMPORT_SYMBOL(add_timer_func_list, 9);
+
+ do {
+ fp = fopen("plugins/gui.conf","r");
+ if (fp == NULL)
+ break;
+
+ while(fgets(line, sizeof(line) -1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
+ if(strcmpi(w1,"imalive_on")==0){
+ imalive_on = atoi(w2);
+ } else if(strcmpi(w1,"imalive_time")==0){
+ imalive_time = atoi(w2);
+ } else if(strcmpi(w1,"flush_on")==0){
+ flush_on = atoi(w2);
+ } else if(strcmpi(w1,"flush_time")==0){
+ flush_time = atoi(w2);
+ }
+ }
+ }
+ fclose(fp);
+ } while (0);
+
+ for (i = 1; i < *argc ; i++)
+ if (strcmp(argv[i], "--gui") == 0)
+ flush_on = imalive_on = 1;
+
+ if (flush_on) {
+ add_timer_func_list(flush_timer, "flush_timer");
+ add_timer_interval(gettick()+1000,flush_timer,0,0,flush_time);
+ }
+ if (imalive_on) {
+ add_timer_func_list(imalive_timer, "imalive_timer");
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+ }
+}
diff --git a/src/plugins/gui.txt b/src/plugins/gui.txt
index 87f5ac742..03554aa8d 100644
--- a/src/plugins/gui.txt
+++ b/src/plugins/gui.txt
@@ -1,15 +1,15 @@
-//
-// GUI Plugin Configuration
-//
-
-// Enable I'm Alive?
-imalive_on: 0
-
-// How often to display I'm Alive (in seconds)
-imalive_time: 30
-
-// Enable GUI flushing for Mugendai's GUI?
-flush_on: 0
-
-// How often to flush the buffer on-screen (in seconds)
+//
+// GUI Plugin Configuration
+//
+
+// Enable I'm Alive?
+imalive_on: 0
+
+// How often to display I'm Alive (in seconds)
+imalive_time: 30
+
+// Enable GUI flushing for Mugendai's GUI?
+flush_on: 0
+
+// How often to flush the buffer on-screen (in seconds)
flush_time: 60 \ No newline at end of file
diff --git a/src/plugins/httpd.c b/src/plugins/httpd.c
index de994766f..5e88c7dfd 100644
--- a/src/plugins/httpd.c
+++ b/src/plugins/httpd.c
@@ -1,751 +1,751 @@
-
-#ifdef __WIN32
-#include <windows.h>
-#else
-#include <unistd.h>
-#endif
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/db.h"
-//mmo required for definition of stricmp
-#include "../common/mmo.h"
-#include "../common/utils.h"
-#include "../common/malloc.h"
-#include "../common/socket.h"
-#include "../common/plugin.h"
-//#include "httpd.h"
-
-/** Created by End_of_Exam, ported to plugin and modified by Celest **/
-
-PLUGIN_INFO = {
- "HttpDaemon",
- PLUGIN_CORE,
- "0.1",
- PLUGIN_VERSION,
- "HTTP Daemon"
-};
-
-PLUGIN_EVENTS_TABLE = {
- { "do_init", "Plugin_Init" },
- { "do_final", "Plugin_Final" },
- { NULL, NULL }
-};
-
-enum HTTPD_STATUS {
- HTTPD_REQUEST_WAIT = 0, // ƒŠƒNƒGƒXƒg‘Ò‚¿
- HTTPD_REQUEST_WAIT_POST, // ƒŠƒNƒGƒXƒg‘Ò‚¿(post)
- HTTPD_REQUEST_OK, // ƒŠƒNƒGƒXƒg‰ðŽßŠ®—¹
- HTTPD_SEND_HEADER, // ƒwƒbƒ_‘—MŠ®—¹
- HTTPD_WAITING_SEND // ƒf[ƒ^‚ª‘—M‚µI‚í‚é‚Ü‚Å‘Ò‚Á‚Ä‚¢‚éó‘Ô
-};
-enum {
- HTTPD_METHOD_UNKNOWN = 0,
- HTTPD_METHOD_GET,
- HTTPD_METHOD_POST
-};
-
-struct httpd_session_data {
- int fd;
- int status;
- int http_ver;
- int header_len;
- int data_len;
- int method;
- int persist;
- int request_count;
- unsigned int tick;
- const unsigned char* url;
- const unsigned char* query;
-};
-
-// undefine socket operations included from socket.h,
-// since we are going to use 'sessiond' instead
-#undef RFIFOP
-#undef RFIFOREST
-#undef WFIFOP
-
-#define RFIFOP(fd,pos) (sessiond[fd]->rdata+sessiond[fd]->rdata_pos+(pos))
-#define RFIFOREST(fd) (sessiond[fd]->rdata_size-sessiond[fd]->rdata_pos)
-#define WFIFOP(fd,pos) (sessiond[fd]->wdata+sessiond[fd]->wdata_size+(pos))
-
-struct socket_data **sessiond;
-char *server_type;
-unsigned int (*gettick)();
-int (*add_timer_interval)(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
-int *max_fd;
-int (*delete_sessiond)(int);
-int (*_WFIFOSET)(int,int);
-int (*_RFIFOSKIP)(int,int);
-
-static int max_persist_requests = 32; // Ž‘±’ÊM‚Å‚Ìő僊ƒNƒGƒXƒg”
-static int request_timeout[] = { 2500, 60*1000 }; // ƒ^ƒCƒ€ƒAƒEƒg(ʼnAŽ‘±)
-static char document_root[256] = "./httpd/"; // ƒhƒLƒ…ƒƒ“ƒgƒ‹[ƒg
-
-// httpd ‚É“ü‚Á‚Ä‚¢‚éƒy[ƒW‚ÆAŒÄ‚Ño‚·ƒR[ƒ‹ƒoƒbƒNŠÖ”‚̈ꗗ
-struct dbt *httpd_files;
-
-void httpd_send(struct httpd_session_data*, int, const char *, int, const void *);
-
-int httpd_check (struct socket_data *sd)
-{
- // httpd ‚ɉñ‚·‚Ç‚¤‚©‚Ì”»’肪‚Ü‚¾s‚í‚ê‚Ä‚È‚¢
- // 擪‚QƒoƒCƒg‚ª GE ‚È‚çhttpd ‚ɉñ‚µ‚Ä‚Ý‚é
- if (sd->rdata_size >= 2 &&
- sd->rdata[0] == 'G' && sd->rdata[1] == 'E')
- return 1;
-
- return 0;
-}
-
-int httpd_strcasencmp(const char *s1, const char *s2,int len)
-{
- while(len-- && (*s1 || *s2) ) {
- if((*s1 | 0x20) != (*s2 | 0x20)) {
- return ((*s1 | 0x20) > (*s2 | 0x20) ? 1 : -1);
- }
- s1++; s2++;
- }
- return 0;
-}
-
-// httpd ‚Ƀy[ƒW‚ð’ljÁ‚·‚é
-// for ‚ȂǂŃy[ƒW–¼‚ð‡¬‚Å‚«‚é‚悤‚ÉAkey ‚Ístrdup()‚µ‚½‚à‚Ì‚ðŽg‚¤
-
-void httpd_pages (const char* url, void (*httpd_func)(struct httpd_session_data*, const char*))
-{
- if (strdb_get(httpd_files,(unsigned char*)(url+1)) == NULL) {
- strdb_put(httpd_files, (unsigned char*)aStrdup(url+1), httpd_func);
- } else {
- strdb_put(httpd_files, (unsigned char*)(url+1), httpd_func);
- }
-}
-
-static void (*httpd_default)(struct httpd_session_data* sd,const char* url);
-
-const char *httpd_get_error( struct httpd_session_data* sd, int* status )
-{
- const char* msg;
- // httpd ‚̃Xƒe[ƒ^ƒX‚ðŒˆ‚ß‚é
- switch(*status) {
- case 200: msg = "OK"; break;
- case 400: msg = "Bad Request"; break;
- case 401: msg = "Unauthorized"; break; // –¢Žg—p
- case 403: msg = "Forbidden"; break; // –¢Žg—p
- case 404: msg = "Not Found"; break;
- case 408: msg = "Request Timedout"; break;
- case 411: msg = "Length Required"; break;
- case 413: msg = "Request Entity Too Large"; break;
- default:
- *status = 500; msg = "Internal Server Error"; break;
- }
- return msg;
-}
-
-void httpd_send_error(struct httpd_session_data* sd,int status)
-{
- const char* msg = httpd_get_error( sd, &status );
- httpd_send(sd, status, "text/plain",strlen(msg),msg);
-}
-
-void httpd_send_head (struct httpd_session_data* sd, int status, const char *content_type, int content_len)
-{
- char head[256];
- int len;
- const char* msg;
-
- if (sd->status != HTTPD_REQUEST_OK)
- return;
- msg = httpd_get_error( sd, &status );
-
- if(content_len == -1 || ++sd->request_count >= max_persist_requests ) {
- // ’·‚³‚ª•ª‚©‚ç‚È‚¢ or ƒŠƒNƒGƒXƒgŒÀŠE‚ð’´‚¦‚½‚Ì‚ÅØ’f‚·‚é
- len = sprintf(
- head,
- "HTTP/1.%d %d %s\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
- sd->http_ver,status,msg,content_type
- );
- sd->persist = 0;
- len = sprintf(
- head,
- "HTTP/1.%d %d %s\r\nContent-Type: %s\r\n\r\n",
- sd->http_ver,status,msg,content_type
- );
- sd->http_ver = 0; // ’·‚³‚ª•ª‚©‚ç‚È‚¢‚Ì‚ÅAHTTP/1.0 ˆµ‚¢(Ž©“®Ø’f)‚É‚·‚é
- } else {
- len = sprintf(
- head,
- "HTTP/1.%d %d %s\r\nContent-Type: %s\r\nContent-Length: %d\r\n\r\n",
- sd->http_ver,status,msg,content_type,content_len
- );
- }
- memcpy(WFIFOP(sd->fd,0),head,len);
- _WFIFOSET(sd->fd,len);
- sd->status = HTTPD_SEND_HEADER;
- sd->data_len = content_len;
-}
-
-void httpd_send_data (struct httpd_session_data* sd, int content_len, const void *data)
-{
- const char* msg = (const char*)data;
- if (sd->status == HTTPD_REQUEST_OK) {
- // ƒwƒbƒ_‚Ì‘—M–Y‚ê‚Ä‚¢‚é‚Ì‚ÅA“K“–‚ɕ₤
- httpd_send_head(sd,200,"application/octet-stream",-1);
- } else if(sd->status != HTTPD_SEND_HEADER && sd->status != HTTPD_WAITING_SEND) {
- return;
- }
- sd->data_len -= content_len;
-
- // ‹‘å‚ȃTƒCƒY‚̃tƒ@ƒCƒ‹‚à‘—Mo—ˆ‚é‚悤‚É•ªŠ„‚µ‚Ä‘—‚é
- while (content_len > 0) {
- int send_byte = content_len;
- if(send_byte > 12*1024) send_byte = 12*1024;
- memcpy(WFIFOP(sd->fd,0),msg,send_byte);
- _WFIFOSET(sd->fd,send_byte);
- msg += send_byte; content_len -= send_byte;
- }
- sd->status = HTTPD_WAITING_SEND;
-}
-
-void httpd_send (struct httpd_session_data* sd, int status, const char *content_type, int content_len, const void *data)
-{
- httpd_send_head(sd,status,content_type,content_len);
- httpd_send_data(sd,content_len,data);
-}
-
-void httpd_parse_header(struct httpd_session_data* sd);
-void httpd_parse_request_ok(struct httpd_session_data *sd);
-
-int httpd_parse (int fd)
-{
- struct httpd_session_data *sd = (struct httpd_session_data *)sessiond[fd]->session_data2;
- if (sessiond[fd]->eof) {
- delete_sessiond(fd);
- return 0;
- }
- if (sd == NULL) {
- sd = (struct httpd_session_data*) aMalloc (sizeof(struct httpd_session_data));
- sd->fd = fd;
- sessiond[fd]->session_data2 = sd;
- sd->tick = gettick();
- sd->persist = 0;
- sd->request_count = 0;
- }
- printf ("status %d\n", sd->status);
- switch(sd->status) {
- case HTTPD_REQUEST_WAIT:
- // ƒŠƒNƒGƒXƒg‘Ò‚¿
- if(RFIFOREST(fd) > 1024) {
- // ƒŠƒNƒGƒXƒg‚ª’·‚·‚¬‚é‚Ì‚ÅAƒGƒ‰[ˆµ‚¢‚·‚é
- sd->status = HTTPD_REQUEST_OK;
- httpd_send_error(sd,400); // Bad Request
- } else if( (int)( gettick() - sd->tick ) > request_timeout[sd->persist] ) {
- // ƒŠƒNƒGƒXƒg‚ÉŽžŠÔ‚ª‚©‚©‚è‚·‚¬‚Ä‚¢‚é‚Ì‚ÅAƒGƒ‰[ˆµ‚¢‚·‚é
- sd->status = HTTPD_REQUEST_OK;
- httpd_send_error(sd,408); // Request Timeout
- } else if(sd->header_len == RFIFOREST(fd)) {
- // ó‘Ô‚ªˆÈ‘O‚Æ“¯‚¶‚È‚Ì‚ÅAƒŠƒNƒGƒXƒg‚ðĉðÍ‚·‚é•K—v‚Í–³‚¢
- } else {
- int limit = RFIFOREST(fd);
- unsigned char *req = RFIFOP(fd,0);
- sd->header_len = RFIFOREST(fd);
- do {
- if(*req == '\n' && limit > 0) {
- limit--; req++;
- if(*req == '\r' && limit > 0) { limit--; req++; }
- if(*req == '\n') {
- // HTTPƒwƒbƒ_‚ÌI“_‚ðŒ©‚Â‚¯‚½
- *req = 0;
- sd->header_len = (req - RFIFOP(fd,0)) + 1;
- httpd_parse_header(sd);
- break;
- }
- }
- } while(req++,--limit > 0);
- }
- break;
- case HTTPD_REQUEST_WAIT_POST:
- if(RFIFOREST(sd->fd) >= sd->header_len) {
- unsigned char temp = RFIFOB(sd->fd,sd->header_len);
- RFIFOB(sd->fd,sd->header_len) = 0;
- httpd_parse_request_ok(sd);
- RFIFOB(sd->fd,sd->header_len) = temp;
- }
- break;
- case HTTPD_REQUEST_OK:
- case HTTPD_SEND_HEADER:
- // ƒŠƒNƒGƒXƒg‚ªI‚í‚Á‚½‚܂܉½‚à‘—M‚³‚ê‚Ä‚¢‚È‚¢ó‘Ô‚È‚Ì‚ÅA
- // ‹­§Ø’f
- printf ("httpd: eof\n");
- sessiond[fd]->eof = 1;
- break;
- case HTTPD_WAITING_SEND:
- // ƒf[ƒ^‚Ì‘—M‚ªI‚í‚é‚Ü‚Å‘Ò‹@
- //if(sessiond[fd]->wdata_size == sessiond[fd]->wdata_pos) {
- // i *hope* this is correct o.o;
- if(sessiond[fd]->wdata_size == 0) {
- // HTTP/1.0‚͎蓮ؒf
-// if(sd->http_ver == 0) {
- if(sd->persist == 0) {
- printf ("httpd: eof\n");
- sessiond[fd]->eof = 1;
- }
- // RFIFO ‚©‚烊ƒNƒGƒXƒgƒf[ƒ^‚ÌÁ‹Ž‚Æ\‘¢‘̂̉Šú‰»
- _RFIFOSKIP(fd,sd->header_len);
- sd->status = HTTPD_REQUEST_WAIT;
- sd->tick = gettick();
- sd->header_len = 0;
- sd->query = NULL;
-// sd->http_ver = 0; // ver ‚Í•ÛŽ
- sd->method = HTTPD_METHOD_UNKNOWN;
- printf("httpd_parse: [% 3d] request sended RFIFOREST:%d\n", fd, RFIFOREST(fd));
- }
- break;
- }
- return 0;
-}
-
-void httpd_parse_header_sub( struct httpd_session_data* sd, const char *p1, int* plen )
-{
- int len = 0;
- // HTTP‚̃o[ƒWƒ‡ƒ“‚𒲸
- if(!strncmp(p1 ,"HTTP/1.1",8)) {
- sd->http_ver = 1;
- sd->persist = 1;
- } else {
- sd->http_ver = 0;
- sd->persist = 0;
- }
-
- p1 = strchr(p1,'\n');
- while(p1) {
- // Content-Length: ‚Ì’²¸
- if(!httpd_strcasencmp(p1+1,"Content-Length: ",16)) {
- len = atoi(p1 + 17);
- }
- // Connection: ‚Ì’²¸
- if(!httpd_strcasencmp(p1+1,"Connection: ",12)) {
- if( httpd_strcasencmp(p1+13,"close",5)==0 && sd->http_ver==1 )
- sd->persist = 0;
- if( httpd_strcasencmp(p1+13,"Keep-Alive",10)==0 && sd->http_ver==0 )
- sd->persist = 1;
- }
- p1 = strchr(p1+1,'\n');
- }
- if(plen) *plen = len;
- return;
-}
-
-void httpd_parse_header(struct httpd_session_data* sd)
-{
- int i;
- int status = 400; // Bad Request
- unsigned char* req = RFIFOP(sd->fd,0);
- do {
- if(!strncmp(req,"GET /",5)) {
- // GET ƒŠƒNƒGƒXƒg
- req += 5;
- for(i = 0;req[i]; i++) {
- if(req[i] == ' ' || req[i] == '?') break;
- if(!isalnum(req[i]) && req[i] != '.' && req[i] != '_' && req[i] != '-') break;
- }
- if(req[i] == ' ') {
- req[i] = 0;
- sd->url = req;
- sd->query = NULL;
- sd->status = HTTPD_REQUEST_OK;
- } else if(req[i] == '?') {
- req[i] = 0;
- sd->query = &req[++i];
- for(;req[i];i++) {
- if(
- isalnum(req[i]) || req[i] == '+' || req[i] == '%' || req[i] == '&' ||
- req[i] == '='
- ) {
- continue;
- } else {
- break;
- }
- }
- if(req[i] != ' ') {
- break;
- }
- req[i] = 0;
- sd->url = req;
- } else {
- break;
- }
- // ƒwƒbƒ_‰ðÍ
- httpd_parse_header_sub( sd, &req[i+1], NULL );
-
- printf("httpd: request %s %s\n", sd->url, sd->query);
- sd->method = HTTPD_METHOD_GET;
- httpd_parse_request_ok(sd);
- } else if(!strncmp(req,"POST /",6)) {
- int len;
- req += 6; status = 404;
- for(i = 0;req[i]; i++) {
- if(req[i] == ' ') break;
- if(!isalnum(req[i]) && req[i] != '.' && req[i] != '_' && req[i] != '-') break;
- }
- if(req[i] != ' ') {
- break;
- }
- req[i] = 0;
- sd->url = req;
-
- // ƒwƒbƒ_‰ðÍ
- httpd_parse_header_sub( sd, &req[i+1], &len );
-
- if(len <= 0 || len >= 32*1024) {
- // ‚Æ‚è‚ ‚¦‚¸32KBˆÈã‚̃ŠƒNƒGƒXƒg‚Í•s³ˆµ‚¢
- status = ( len==0 )? 411 : ( len>32*1024 )? 413 : 400;
- break;
- }
-
- sd->query = RFIFOP(sd->fd,sd->header_len);
- sd->method = HTTPD_METHOD_POST;
- sd->header_len += len;
- if(RFIFOREST(sd->fd) >= sd->header_len) {
- unsigned char temp = RFIFOB(sd->fd,sd->header_len);
- RFIFOB(sd->fd,sd->header_len) = 0;
- httpd_parse_request_ok(sd);
- RFIFOB(sd->fd,sd->header_len) = temp;
- } else {
- // POST‚̃f[ƒ^‚ª‘—‚ç‚ê‚Ä‚­‚é‚Ì‚ð‘Ò‚Â
- sd->status = HTTPD_REQUEST_WAIT_POST;
- }
- } else {
- break;
- }
- } while(0);
- if(sd->status == HTTPD_REQUEST_WAIT) {
- sd->status = HTTPD_REQUEST_OK;
- httpd_send_error(sd,status);
- }
-}
-
-void httpd_parse_request_ok (struct httpd_session_data *sd)
-{
- void (*httpd_parse_func)(struct httpd_session_data*,const char*);
- sd->status = HTTPD_REQUEST_OK;
-
- // ƒtƒ@ƒCƒ‹–¼‚ª‹‚Ü‚Á‚½‚Ì‚ÅAƒy[ƒW‚ª–³‚¢‚©ŒŸõ‚·‚é
- // printf("httpd_parse: [% 3d] request /%s\n", fd, req);
- httpd_parse_func = strdb_get(httpd_files,(unsigned char*)sd->url);
- if(httpd_parse_func == NULL) {
- httpd_parse_func = httpd_default;
- }
- if(httpd_parse_func == NULL) {
- httpd_send_error(sd,404); // Not Found
- } else {
- httpd_parse_func(sd,sd->url);
- if(sd->status == HTTPD_REQUEST_OK) {
- httpd_send_error(sd,404); // Not Found
- }
- }
- if(sd->persist == 1 && sd->data_len) {
- // ’·‚³‚ª•Ï‚ȃf[ƒ^(‚±‚ñ‚È‚Ì‘—‚é‚È‚æc)
- printf("httpd_parse: send size mismatch when parsing /%s\n", sd->url);
- sessiond[sd->fd]->eof = 1;
- }
- if(sd->status == HTTPD_REQUEST_OK) {
- httpd_send_error(sd,404);
- }
-}
-
-char* httpd_get_value(struct httpd_session_data* sd,const char* val)
-{
- int src_len = strlen(val);
- const unsigned char* src_p = sd->query;
- if(src_p == NULL) return aStrdup("");
-
- do {
- if(!memcmp(src_p,val,src_len) && src_p[src_len] == '=') {
- break;
- }
- src_p = strchr(src_p + 1,'&');
- if(src_p) src_p++;
- } while(src_p);
-
- if(src_p != NULL) {
- // –Ú“I‚Ì•¶Žš—ñ‚ðŒ©‚Â‚¯‚½
- const unsigned char* p2;
- int dest_len;
- char* dest_p;
- src_p += src_len + 1;
- p2 = strchr(src_p,'&');
- if(p2 == NULL) {
- src_len = strlen(src_p);
- } else {
- src_len = (p2 - src_p);
- }
- dest_p = aMalloc(src_len + 1);
- dest_len = 0;
- while(src_len > 0) {
- if(*src_p == '%' && src_len > 2) {
- int c1 = 0,c2 = 0;
- if(src_p[1] >= '0' && src_p[1] <= '9') c1 = src_p[1] - '0';
- if(src_p[1] >= 'A' && src_p[1] <= 'F') c1 = src_p[1] - 'A' + 10;
- if(src_p[1] >= 'a' && src_p[1] <= 'f') c1 = src_p[1] - 'a' + 10;
- if(src_p[2] >= '0' && src_p[2] <= '9') c2 = src_p[2] - '0';
- if(src_p[2] >= 'A' && src_p[2] <= 'F') c2 = src_p[2] - 'A' + 10;
- if(src_p[2] >= 'a' && src_p[2] <= 'f') c2 = src_p[2] - 'a' + 10;
- dest_p[dest_len++] = (c1 << 4) | c2;
- src_p += 3; src_len -= 3;
- } else if(*src_p == '+') {
- dest_p[dest_len++] = ' ';
- src_p++; src_len--;
- } else {
- dest_p[dest_len++] = *(src_p++); src_len--;
- }
- }
- dest_p[dest_len] = 0;
- return dest_p;
- }
- return aStrdup("");
-}
-
-// MIMEƒ^ƒCƒv”»’èBŽå—v‚È‚à‚Ì‚¾‚¯”»’肵‚ÄAŽc‚è‚Íapplication/octet-stream
-static const char* httpd_mimetype(const char* url)
-{
- char *ext = strrchr(url,'.');
- if(ext) {
- if(!strcmp(ext,".html")) return "text/html";
- if(!strcmp(ext,".htm")) return "text/html";
- if(!strcmp(ext,".css")) return "text/css";
- if(!strcmp(ext,".js")) return "text/javascript";
- if(!strcmp(ext,".txt")) return "text/plain";
- if(!strcmp(ext,".gif")) return "image/gif";
- if(!strcmp(ext,".jpg")) return "image/jpeg";
- if(!strcmp(ext,".jpeg")) return "image/jpeg";
- if(!strcmp(ext,".png")) return "image/png";
- if(!strcmp(ext,".xbm")) return "image/xbm";
- if(!strcmp(ext,".zip")) return "application/zip";
- }
- return "application/octet-stream";
-}
-
-void httpd_send_file(struct httpd_session_data* sd, const char* url)
-{
- FILE *fp;
- int file_size;
- char file_buf[8192];
- if(sd->status != HTTPD_REQUEST_OK) return;
- if(url[0] == '\0') url = "index.html";
-
- // url ‚ÌÅ‘å’·‚Í–ñ1010ƒoƒCƒg‚È‚Ì‚ÅAƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ÌS”z‚Í–³‚µ
- sprintf(file_buf, "%s%s", document_root, url);
-
- fp = fopen(file_buf,"rb");
- if(fp == NULL) {
- httpd_send_error(sd,404);
- } else {
- fseek(fp,0,SEEK_END);
- file_size = ftell(fp);
- fseek(fp,0,SEEK_SET);
- httpd_send_head(sd,200,httpd_mimetype(url),file_size);
- while(file_size > 0) {
- int read_byte = file_size;
- if(file_size > 8192) read_byte = 8192;
- fread(file_buf,1,read_byte,fp);
- httpd_send_data(sd,read_byte,file_buf);
- file_size -= read_byte;
- }
- fclose(fp);
- }
-}
-
-
-char* httpd_binary_encode(const char* val)
-{
- char *buf = aMalloc(strlen(val) * 3 + 1);
- char *p = buf;
- while(*val) {
- if(isalnum((unsigned char)*val)) {
- *(p++) = *(val++);
- } else {
- unsigned char c1 = *(val++);
- unsigned char c2 = (c1 >> 4);
- unsigned char c3 = (c1 & 0x0F);
- *(p++) = '%';
- *(p++) = c2 + (c2 >= 10 ? 'A'-10 : '0');
- *(p++) = c3 + (c3 >= 10 ? 'A'-10 : '0');
- }
- }
- *p = 0;
- return buf;
-}
-
-char* httpd_quote_meta(const char* p1)
-{
- char *buf = aMalloc(strlen(p1) * 6 + 1);
- char *p2 = buf;
- while(*p1) {
- switch(*p1) {
- case '<': memcpy(p2,"&lt;",4); p2 += 4; p1++; break;
- case '>': memcpy(p2,"&gt;",4); p2 += 4; p1++; break;
- case '&': memcpy(p2,"&amp;",5); p2 += 5; p1++; break;
- case '"': memcpy(p2,"&quot;",6); p2 += 6; p1++; break;
- default: *(p2++) = *(p1++);
- }
- }
- *p2 = 0;
- return buf;
-}
-
-///////// Graph / HTML snippets functions /////////////////////////////
-
-struct file_entry {
- char *filename;
- struct file_entry *next;
-};
-struct file_entry *fileentry_head = NULL;
-
-static void httpd_graph_load (const char *filename)
-{
- struct file_entry *entry;
- char type = *server_type + 'a';
- int len = strlen(filename);
-
- if (len <= 7 || filename[len - 7] != type)
- return;
-
- entry = fileentry_head;
- while (entry) {
- if (strcmpi(entry->filename, filename) == 0)
- return;
- entry = entry->next;
- }
-
- entry = (struct file_entry *) aMalloc (sizeof(struct file_entry));
- entry->filename = aStrdup(filename);
- entry->next = fileentry_head;
- fileentry_head = entry;
-}
-
-// scan for available html snippets
-static int httpd_graph_find (int tid, unsigned int tick, int id, int data)
-{
- findfile("httpd", ".graph", httpd_graph_load);
- return 0;
-}
-
-static void httpd_graph_parse (struct httpd_session_data *sd,const char* url)
-{
- // output html
- struct file_entry *entry = fileentry_head;
- char buf[8192];
- char *p = buf;
- FILE *fp;
-
- p += sprintf(p,"<html><head><title>Athena Sensors</title></head>\n\n<body>\n");
- p += sprintf(p,"<h1>Athena Sensors</h1>\n\n");
-
- while (entry) {
- // insert snippets into html
- char line[1024];
- fp = fopen(entry->filename, "r");
- if (fp == NULL) {
- entry = entry->next;
- continue;
- }
- while(fgets(line, sizeof(line) -1, fp))
- p += sprintf(p, line);
- fclose(fp);
- entry = entry->next;
- }
- p += sprintf(p,"</body></html>\n");
- httpd_send(sd,200,"text/html",p - buf,buf);
-}
-
-//////////////// Initialise / Finalise /////////////////////////////
-
-void do_final (void)
-{
- int fd;
- struct file_entry *entry = fileentry_head, *entry2;
-
- // clear up graph entries
- while (entry) {
- entry2 = entry->next;
- aFree(entry->filename);
- aFree(entry);
- entry = entry2;
- }
- // clear up existing http connections
- for (fd = 0; fd < *max_fd; fd++)
- if (sessiond[fd] && sessiond[fd]->type == SESSION_HTTP)
- delete_sessiond(fd);
-
- httpd_files->destroy(httpd_files,NULL);
- // clear up the database
- db_final();
- // clear up allocated memory
- // note: the memory manager, if enabled, would be
- // separate from the parent program, which is also
- // why we need to delete our http sessions
- // separately above
- malloc_final();
-}
-
-void do_init (void)
-{
- struct func_parse_table *parse_table;
- int enable_httpd = 1;
-
- do {
- char line[1024], w1[1024], w2[1024];
- FILE *fp = fopen("plugins/httpd.conf","r");
- if (fp == NULL)
- break;
-
- while(fgets(line, sizeof(line) -1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if(strcmpi(w1,"enable_httpd")==0){
- enable_httpd = atoi(w2);
- } else if(strcmpi(w1,"document_root")==0){
- strcpy(document_root, w2);
- } else if(strcmpi(w1,"request_timeout_first")==0){
- request_timeout[0] = atoi(w2);
- } else if(strcmpi(w1,"request_timeout_persist")==0){
- request_timeout[1] = atoi(w2);
- } else if(strcmpi(w1,"max_persist_request")==0){
- max_persist_requests = atoi(w2);
- }
- }
- }
- fclose(fp);
- } while (0);
-
- if (!enable_httpd)
- return;
-
- malloc_init();
- db_init();
- IMPORT_SYMBOL(server_type, 0);
- IMPORT_SYMBOL(gettick, 5);
- IMPORT_SYMBOL(add_timer_interval, 8);
- IMPORT_SYMBOL(max_fd, 13);
- IMPORT_SYMBOL(sessiond, 14);
- IMPORT_SYMBOL(delete_sessiond, 15);
- IMPORT_SYMBOL(_WFIFOSET, 16);
- IMPORT_SYMBOL(_RFIFOSKIP, 17);
- IMPORT_SYMBOL(parse_table, 18);
-
- // register http parsing function
- parse_table[SESSION_HTTP].check = httpd_check;
- parse_table[SESSION_HTTP].func = httpd_parse;
-
- httpd_files = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_RELEASE_KEY,50);
- httpd_default = httpd_send_file;
-
- httpd_pages ("/graph", httpd_graph_parse);
- add_timer_interval(gettick()+10000,httpd_graph_find,0,0,10000);
-
- return;
-}
+
+#ifdef __WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/db.h"
+//mmo required for definition of stricmp
+#include "../common/mmo.h"
+#include "../common/utils.h"
+#include "../common/malloc.h"
+#include "../common/socket.h"
+#include "../common/plugin.h"
+//#include "httpd.h"
+
+/** Created by End_of_Exam, ported to plugin and modified by Celest **/
+
+PLUGIN_INFO = {
+ "HttpDaemon",
+ PLUGIN_CORE,
+ "0.1",
+ PLUGIN_VERSION,
+ "HTTP Daemon"
+};
+
+PLUGIN_EVENTS_TABLE = {
+ { "do_init", "Plugin_Init" },
+ { "do_final", "Plugin_Final" },
+ { NULL, NULL }
+};
+
+enum HTTPD_STATUS {
+ HTTPD_REQUEST_WAIT = 0, // ƒŠƒNƒGƒXƒg‘Ò‚¿
+ HTTPD_REQUEST_WAIT_POST, // ƒŠƒNƒGƒXƒg‘Ò‚¿(post)
+ HTTPD_REQUEST_OK, // ƒŠƒNƒGƒXƒg‰ðŽßŠ®—¹
+ HTTPD_SEND_HEADER, // ƒwƒbƒ_‘—MŠ®—¹
+ HTTPD_WAITING_SEND // ƒf[ƒ^‚ª‘—M‚µI‚í‚é‚Ü‚Å‘Ò‚Á‚Ä‚¢‚éó‘Ô
+};
+enum {
+ HTTPD_METHOD_UNKNOWN = 0,
+ HTTPD_METHOD_GET,
+ HTTPD_METHOD_POST
+};
+
+struct httpd_session_data {
+ int fd;
+ int status;
+ int http_ver;
+ int header_len;
+ int data_len;
+ int method;
+ int persist;
+ int request_count;
+ unsigned int tick;
+ const unsigned char* url;
+ const unsigned char* query;
+};
+
+// undefine socket operations included from socket.h,
+// since we are going to use 'sessiond' instead
+#undef RFIFOP
+#undef RFIFOREST
+#undef WFIFOP
+
+#define RFIFOP(fd,pos) (sessiond[fd]->rdata+sessiond[fd]->rdata_pos+(pos))
+#define RFIFOREST(fd) (sessiond[fd]->rdata_size-sessiond[fd]->rdata_pos)
+#define WFIFOP(fd,pos) (sessiond[fd]->wdata+sessiond[fd]->wdata_size+(pos))
+
+struct socket_data **sessiond;
+char *server_type;
+unsigned int (*gettick)();
+int (*add_timer_interval)(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
+int *max_fd;
+int (*delete_sessiond)(int);
+int (*_WFIFOSET)(int,int);
+int (*_RFIFOSKIP)(int,int);
+
+static int max_persist_requests = 32; // Ž‘±’ÊM‚Å‚Ìő僊ƒNƒGƒXƒg”
+static int request_timeout[] = { 2500, 60*1000 }; // ƒ^ƒCƒ€ƒAƒEƒg(ʼnAŽ‘±)
+static char document_root[256] = "./httpd/"; // ƒhƒLƒ…ƒƒ“ƒgƒ‹[ƒg
+
+// httpd ‚É“ü‚Á‚Ä‚¢‚éƒy[ƒW‚ÆAŒÄ‚Ño‚·ƒR[ƒ‹ƒoƒbƒNŠÖ”‚̈ꗗ
+struct dbt *httpd_files;
+
+void httpd_send(struct httpd_session_data*, int, const char *, int, const void *);
+
+int httpd_check (struct socket_data *sd)
+{
+ // httpd ‚ɉñ‚·‚Ç‚¤‚©‚Ì”»’肪‚Ü‚¾s‚í‚ê‚Ä‚È‚¢
+ // 擪‚QƒoƒCƒg‚ª GE ‚È‚çhttpd ‚ɉñ‚µ‚Ä‚Ý‚é
+ if (sd->rdata_size >= 2 &&
+ sd->rdata[0] == 'G' && sd->rdata[1] == 'E')
+ return 1;
+
+ return 0;
+}
+
+int httpd_strcasencmp(const char *s1, const char *s2,int len)
+{
+ while(len-- && (*s1 || *s2) ) {
+ if((*s1 | 0x20) != (*s2 | 0x20)) {
+ return ((*s1 | 0x20) > (*s2 | 0x20) ? 1 : -1);
+ }
+ s1++; s2++;
+ }
+ return 0;
+}
+
+// httpd ‚Ƀy[ƒW‚ð’ljÁ‚·‚é
+// for ‚ȂǂŃy[ƒW–¼‚ð‡¬‚Å‚«‚é‚悤‚ÉAkey ‚Ístrdup()‚µ‚½‚à‚Ì‚ðŽg‚¤
+
+void httpd_pages (const char* url, void (*httpd_func)(struct httpd_session_data*, const char*))
+{
+ if (strdb_get(httpd_files,(unsigned char*)(url+1)) == NULL) {
+ strdb_put(httpd_files, (unsigned char*)aStrdup(url+1), httpd_func);
+ } else {
+ strdb_put(httpd_files, (unsigned char*)(url+1), httpd_func);
+ }
+}
+
+static void (*httpd_default)(struct httpd_session_data* sd,const char* url);
+
+const char *httpd_get_error( struct httpd_session_data* sd, int* status )
+{
+ const char* msg;
+ // httpd ‚̃Xƒe[ƒ^ƒX‚ðŒˆ‚ß‚é
+ switch(*status) {
+ case 200: msg = "OK"; break;
+ case 400: msg = "Bad Request"; break;
+ case 401: msg = "Unauthorized"; break; // –¢Žg—p
+ case 403: msg = "Forbidden"; break; // –¢Žg—p
+ case 404: msg = "Not Found"; break;
+ case 408: msg = "Request Timedout"; break;
+ case 411: msg = "Length Required"; break;
+ case 413: msg = "Request Entity Too Large"; break;
+ default:
+ *status = 500; msg = "Internal Server Error"; break;
+ }
+ return msg;
+}
+
+void httpd_send_error(struct httpd_session_data* sd,int status)
+{
+ const char* msg = httpd_get_error( sd, &status );
+ httpd_send(sd, status, "text/plain",strlen(msg),msg);
+}
+
+void httpd_send_head (struct httpd_session_data* sd, int status, const char *content_type, int content_len)
+{
+ char head[256];
+ int len;
+ const char* msg;
+
+ if (sd->status != HTTPD_REQUEST_OK)
+ return;
+ msg = httpd_get_error( sd, &status );
+
+ if(content_len == -1 || ++sd->request_count >= max_persist_requests ) {
+ // ’·‚³‚ª•ª‚©‚ç‚È‚¢ or ƒŠƒNƒGƒXƒgŒÀŠE‚ð’´‚¦‚½‚Ì‚ÅØ’f‚·‚é
+ len = sprintf(
+ head,
+ "HTTP/1.%d %d %s\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
+ sd->http_ver,status,msg,content_type
+ );
+ sd->persist = 0;
+ len = sprintf(
+ head,
+ "HTTP/1.%d %d %s\r\nContent-Type: %s\r\n\r\n",
+ sd->http_ver,status,msg,content_type
+ );
+ sd->http_ver = 0; // ’·‚³‚ª•ª‚©‚ç‚È‚¢‚Ì‚ÅAHTTP/1.0 ˆµ‚¢(Ž©“®Ø’f)‚É‚·‚é
+ } else {
+ len = sprintf(
+ head,
+ "HTTP/1.%d %d %s\r\nContent-Type: %s\r\nContent-Length: %d\r\n\r\n",
+ sd->http_ver,status,msg,content_type,content_len
+ );
+ }
+ memcpy(WFIFOP(sd->fd,0),head,len);
+ _WFIFOSET(sd->fd,len);
+ sd->status = HTTPD_SEND_HEADER;
+ sd->data_len = content_len;
+}
+
+void httpd_send_data (struct httpd_session_data* sd, int content_len, const void *data)
+{
+ const char* msg = (const char*)data;
+ if (sd->status == HTTPD_REQUEST_OK) {
+ // ƒwƒbƒ_‚Ì‘—M–Y‚ê‚Ä‚¢‚é‚Ì‚ÅA“K“–‚ɕ₤
+ httpd_send_head(sd,200,"application/octet-stream",-1);
+ } else if(sd->status != HTTPD_SEND_HEADER && sd->status != HTTPD_WAITING_SEND) {
+ return;
+ }
+ sd->data_len -= content_len;
+
+ // ‹‘å‚ȃTƒCƒY‚̃tƒ@ƒCƒ‹‚à‘—Mo—ˆ‚é‚悤‚É•ªŠ„‚µ‚Ä‘—‚é
+ while (content_len > 0) {
+ int send_byte = content_len;
+ if(send_byte > 12*1024) send_byte = 12*1024;
+ memcpy(WFIFOP(sd->fd,0),msg,send_byte);
+ _WFIFOSET(sd->fd,send_byte);
+ msg += send_byte; content_len -= send_byte;
+ }
+ sd->status = HTTPD_WAITING_SEND;
+}
+
+void httpd_send (struct httpd_session_data* sd, int status, const char *content_type, int content_len, const void *data)
+{
+ httpd_send_head(sd,status,content_type,content_len);
+ httpd_send_data(sd,content_len,data);
+}
+
+void httpd_parse_header(struct httpd_session_data* sd);
+void httpd_parse_request_ok(struct httpd_session_data *sd);
+
+int httpd_parse (int fd)
+{
+ struct httpd_session_data *sd = (struct httpd_session_data *)sessiond[fd]->session_data2;
+ if (sessiond[fd]->eof) {
+ delete_sessiond(fd);
+ return 0;
+ }
+ if (sd == NULL) {
+ sd = (struct httpd_session_data*) aMalloc (sizeof(struct httpd_session_data));
+ sd->fd = fd;
+ sessiond[fd]->session_data2 = sd;
+ sd->tick = gettick();
+ sd->persist = 0;
+ sd->request_count = 0;
+ }
+ printf ("status %d\n", sd->status);
+ switch(sd->status) {
+ case HTTPD_REQUEST_WAIT:
+ // ƒŠƒNƒGƒXƒg‘Ò‚¿
+ if(RFIFOREST(fd) > 1024) {
+ // ƒŠƒNƒGƒXƒg‚ª’·‚·‚¬‚é‚Ì‚ÅAƒGƒ‰[ˆµ‚¢‚·‚é
+ sd->status = HTTPD_REQUEST_OK;
+ httpd_send_error(sd,400); // Bad Request
+ } else if( (int)( gettick() - sd->tick ) > request_timeout[sd->persist] ) {
+ // ƒŠƒNƒGƒXƒg‚ÉŽžŠÔ‚ª‚©‚©‚è‚·‚¬‚Ä‚¢‚é‚Ì‚ÅAƒGƒ‰[ˆµ‚¢‚·‚é
+ sd->status = HTTPD_REQUEST_OK;
+ httpd_send_error(sd,408); // Request Timeout
+ } else if(sd->header_len == RFIFOREST(fd)) {
+ // ó‘Ô‚ªˆÈ‘O‚Æ“¯‚¶‚È‚Ì‚ÅAƒŠƒNƒGƒXƒg‚ðĉðÍ‚·‚é•K—v‚Í–³‚¢
+ } else {
+ int limit = RFIFOREST(fd);
+ unsigned char *req = RFIFOP(fd,0);
+ sd->header_len = RFIFOREST(fd);
+ do {
+ if(*req == '\n' && limit > 0) {
+ limit--; req++;
+ if(*req == '\r' && limit > 0) { limit--; req++; }
+ if(*req == '\n') {
+ // HTTPƒwƒbƒ_‚ÌI“_‚ðŒ©‚Â‚¯‚½
+ *req = 0;
+ sd->header_len = (req - RFIFOP(fd,0)) + 1;
+ httpd_parse_header(sd);
+ break;
+ }
+ }
+ } while(req++,--limit > 0);
+ }
+ break;
+ case HTTPD_REQUEST_WAIT_POST:
+ if(RFIFOREST(sd->fd) >= sd->header_len) {
+ unsigned char temp = RFIFOB(sd->fd,sd->header_len);
+ RFIFOB(sd->fd,sd->header_len) = 0;
+ httpd_parse_request_ok(sd);
+ RFIFOB(sd->fd,sd->header_len) = temp;
+ }
+ break;
+ case HTTPD_REQUEST_OK:
+ case HTTPD_SEND_HEADER:
+ // ƒŠƒNƒGƒXƒg‚ªI‚í‚Á‚½‚܂܉½‚à‘—M‚³‚ê‚Ä‚¢‚È‚¢ó‘Ô‚È‚Ì‚ÅA
+ // ‹­§Ø’f
+ printf ("httpd: eof\n");
+ sessiond[fd]->eof = 1;
+ break;
+ case HTTPD_WAITING_SEND:
+ // ƒf[ƒ^‚Ì‘—M‚ªI‚í‚é‚Ü‚Å‘Ò‹@
+ //if(sessiond[fd]->wdata_size == sessiond[fd]->wdata_pos) {
+ // i *hope* this is correct o.o;
+ if(sessiond[fd]->wdata_size == 0) {
+ // HTTP/1.0‚͎蓮ؒf
+// if(sd->http_ver == 0) {
+ if(sd->persist == 0) {
+ printf ("httpd: eof\n");
+ sessiond[fd]->eof = 1;
+ }
+ // RFIFO ‚©‚烊ƒNƒGƒXƒgƒf[ƒ^‚ÌÁ‹Ž‚Æ\‘¢‘̂̉Šú‰»
+ _RFIFOSKIP(fd,sd->header_len);
+ sd->status = HTTPD_REQUEST_WAIT;
+ sd->tick = gettick();
+ sd->header_len = 0;
+ sd->query = NULL;
+// sd->http_ver = 0; // ver ‚Í•ÛŽ
+ sd->method = HTTPD_METHOD_UNKNOWN;
+ printf("httpd_parse: [% 3d] request sended RFIFOREST:%d\n", fd, RFIFOREST(fd));
+ }
+ break;
+ }
+ return 0;
+}
+
+void httpd_parse_header_sub( struct httpd_session_data* sd, const char *p1, int* plen )
+{
+ int len = 0;
+ // HTTP‚̃o[ƒWƒ‡ƒ“‚𒲸
+ if(!strncmp(p1 ,"HTTP/1.1",8)) {
+ sd->http_ver = 1;
+ sd->persist = 1;
+ } else {
+ sd->http_ver = 0;
+ sd->persist = 0;
+ }
+
+ p1 = strchr(p1,'\n');
+ while(p1) {
+ // Content-Length: ‚Ì’²¸
+ if(!httpd_strcasencmp(p1+1,"Content-Length: ",16)) {
+ len = atoi(p1 + 17);
+ }
+ // Connection: ‚Ì’²¸
+ if(!httpd_strcasencmp(p1+1,"Connection: ",12)) {
+ if( httpd_strcasencmp(p1+13,"close",5)==0 && sd->http_ver==1 )
+ sd->persist = 0;
+ if( httpd_strcasencmp(p1+13,"Keep-Alive",10)==0 && sd->http_ver==0 )
+ sd->persist = 1;
+ }
+ p1 = strchr(p1+1,'\n');
+ }
+ if(plen) *plen = len;
+ return;
+}
+
+void httpd_parse_header(struct httpd_session_data* sd)
+{
+ int i;
+ int status = 400; // Bad Request
+ unsigned char* req = RFIFOP(sd->fd,0);
+ do {
+ if(!strncmp(req,"GET /",5)) {
+ // GET ƒŠƒNƒGƒXƒg
+ req += 5;
+ for(i = 0;req[i]; i++) {
+ if(req[i] == ' ' || req[i] == '?') break;
+ if(!isalnum(req[i]) && req[i] != '.' && req[i] != '_' && req[i] != '-') break;
+ }
+ if(req[i] == ' ') {
+ req[i] = 0;
+ sd->url = req;
+ sd->query = NULL;
+ sd->status = HTTPD_REQUEST_OK;
+ } else if(req[i] == '?') {
+ req[i] = 0;
+ sd->query = &req[++i];
+ for(;req[i];i++) {
+ if(
+ isalnum(req[i]) || req[i] == '+' || req[i] == '%' || req[i] == '&' ||
+ req[i] == '='
+ ) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ if(req[i] != ' ') {
+ break;
+ }
+ req[i] = 0;
+ sd->url = req;
+ } else {
+ break;
+ }
+ // ƒwƒbƒ_‰ðÍ
+ httpd_parse_header_sub( sd, &req[i+1], NULL );
+
+ printf("httpd: request %s %s\n", sd->url, sd->query);
+ sd->method = HTTPD_METHOD_GET;
+ httpd_parse_request_ok(sd);
+ } else if(!strncmp(req,"POST /",6)) {
+ int len;
+ req += 6; status = 404;
+ for(i = 0;req[i]; i++) {
+ if(req[i] == ' ') break;
+ if(!isalnum(req[i]) && req[i] != '.' && req[i] != '_' && req[i] != '-') break;
+ }
+ if(req[i] != ' ') {
+ break;
+ }
+ req[i] = 0;
+ sd->url = req;
+
+ // ƒwƒbƒ_‰ðÍ
+ httpd_parse_header_sub( sd, &req[i+1], &len );
+
+ if(len <= 0 || len >= 32*1024) {
+ // ‚Æ‚è‚ ‚¦‚¸32KBˆÈã‚̃ŠƒNƒGƒXƒg‚Í•s³ˆµ‚¢
+ status = ( len==0 )? 411 : ( len>32*1024 )? 413 : 400;
+ break;
+ }
+
+ sd->query = RFIFOP(sd->fd,sd->header_len);
+ sd->method = HTTPD_METHOD_POST;
+ sd->header_len += len;
+ if(RFIFOREST(sd->fd) >= sd->header_len) {
+ unsigned char temp = RFIFOB(sd->fd,sd->header_len);
+ RFIFOB(sd->fd,sd->header_len) = 0;
+ httpd_parse_request_ok(sd);
+ RFIFOB(sd->fd,sd->header_len) = temp;
+ } else {
+ // POST‚̃f[ƒ^‚ª‘—‚ç‚ê‚Ä‚­‚é‚Ì‚ð‘Ò‚Â
+ sd->status = HTTPD_REQUEST_WAIT_POST;
+ }
+ } else {
+ break;
+ }
+ } while(0);
+ if(sd->status == HTTPD_REQUEST_WAIT) {
+ sd->status = HTTPD_REQUEST_OK;
+ httpd_send_error(sd,status);
+ }
+}
+
+void httpd_parse_request_ok (struct httpd_session_data *sd)
+{
+ void (*httpd_parse_func)(struct httpd_session_data*,const char*);
+ sd->status = HTTPD_REQUEST_OK;
+
+ // ƒtƒ@ƒCƒ‹–¼‚ª‹‚Ü‚Á‚½‚Ì‚ÅAƒy[ƒW‚ª–³‚¢‚©ŒŸõ‚·‚é
+ // printf("httpd_parse: [% 3d] request /%s\n", fd, req);
+ httpd_parse_func = strdb_get(httpd_files,(unsigned char*)sd->url);
+ if(httpd_parse_func == NULL) {
+ httpd_parse_func = httpd_default;
+ }
+ if(httpd_parse_func == NULL) {
+ httpd_send_error(sd,404); // Not Found
+ } else {
+ httpd_parse_func(sd,sd->url);
+ if(sd->status == HTTPD_REQUEST_OK) {
+ httpd_send_error(sd,404); // Not Found
+ }
+ }
+ if(sd->persist == 1 && sd->data_len) {
+ // ’·‚³‚ª•Ï‚ȃf[ƒ^(‚±‚ñ‚È‚Ì‘—‚é‚È‚æc)
+ printf("httpd_parse: send size mismatch when parsing /%s\n", sd->url);
+ sessiond[sd->fd]->eof = 1;
+ }
+ if(sd->status == HTTPD_REQUEST_OK) {
+ httpd_send_error(sd,404);
+ }
+}
+
+char* httpd_get_value(struct httpd_session_data* sd,const char* val)
+{
+ int src_len = strlen(val);
+ const unsigned char* src_p = sd->query;
+ if(src_p == NULL) return aStrdup("");
+
+ do {
+ if(!memcmp(src_p,val,src_len) && src_p[src_len] == '=') {
+ break;
+ }
+ src_p = strchr(src_p + 1,'&');
+ if(src_p) src_p++;
+ } while(src_p);
+
+ if(src_p != NULL) {
+ // –Ú“I‚Ì•¶Žš—ñ‚ðŒ©‚Â‚¯‚½
+ const unsigned char* p2;
+ int dest_len;
+ char* dest_p;
+ src_p += src_len + 1;
+ p2 = strchr(src_p,'&');
+ if(p2 == NULL) {
+ src_len = strlen(src_p);
+ } else {
+ src_len = (p2 - src_p);
+ }
+ dest_p = aMalloc(src_len + 1);
+ dest_len = 0;
+ while(src_len > 0) {
+ if(*src_p == '%' && src_len > 2) {
+ int c1 = 0,c2 = 0;
+ if(src_p[1] >= '0' && src_p[1] <= '9') c1 = src_p[1] - '0';
+ if(src_p[1] >= 'A' && src_p[1] <= 'F') c1 = src_p[1] - 'A' + 10;
+ if(src_p[1] >= 'a' && src_p[1] <= 'f') c1 = src_p[1] - 'a' + 10;
+ if(src_p[2] >= '0' && src_p[2] <= '9') c2 = src_p[2] - '0';
+ if(src_p[2] >= 'A' && src_p[2] <= 'F') c2 = src_p[2] - 'A' + 10;
+ if(src_p[2] >= 'a' && src_p[2] <= 'f') c2 = src_p[2] - 'a' + 10;
+ dest_p[dest_len++] = (c1 << 4) | c2;
+ src_p += 3; src_len -= 3;
+ } else if(*src_p == '+') {
+ dest_p[dest_len++] = ' ';
+ src_p++; src_len--;
+ } else {
+ dest_p[dest_len++] = *(src_p++); src_len--;
+ }
+ }
+ dest_p[dest_len] = 0;
+ return dest_p;
+ }
+ return aStrdup("");
+}
+
+// MIMEƒ^ƒCƒv”»’èBŽå—v‚È‚à‚Ì‚¾‚¯”»’肵‚ÄAŽc‚è‚Íapplication/octet-stream
+static const char* httpd_mimetype(const char* url)
+{
+ char *ext = strrchr(url,'.');
+ if(ext) {
+ if(!strcmp(ext,".html")) return "text/html";
+ if(!strcmp(ext,".htm")) return "text/html";
+ if(!strcmp(ext,".css")) return "text/css";
+ if(!strcmp(ext,".js")) return "text/javascript";
+ if(!strcmp(ext,".txt")) return "text/plain";
+ if(!strcmp(ext,".gif")) return "image/gif";
+ if(!strcmp(ext,".jpg")) return "image/jpeg";
+ if(!strcmp(ext,".jpeg")) return "image/jpeg";
+ if(!strcmp(ext,".png")) return "image/png";
+ if(!strcmp(ext,".xbm")) return "image/xbm";
+ if(!strcmp(ext,".zip")) return "application/zip";
+ }
+ return "application/octet-stream";
+}
+
+void httpd_send_file(struct httpd_session_data* sd, const char* url)
+{
+ FILE *fp;
+ int file_size;
+ char file_buf[8192];
+ if(sd->status != HTTPD_REQUEST_OK) return;
+ if(url[0] == '\0') url = "index.html";
+
+ // url ‚ÌÅ‘å’·‚Í–ñ1010ƒoƒCƒg‚È‚Ì‚ÅAƒoƒbƒtƒ@ƒI[ƒo[ƒtƒ[‚ÌS”z‚Í–³‚µ
+ sprintf(file_buf, "%s%s", document_root, url);
+
+ fp = fopen(file_buf,"rb");
+ if(fp == NULL) {
+ httpd_send_error(sd,404);
+ } else {
+ fseek(fp,0,SEEK_END);
+ file_size = ftell(fp);
+ fseek(fp,0,SEEK_SET);
+ httpd_send_head(sd,200,httpd_mimetype(url),file_size);
+ while(file_size > 0) {
+ int read_byte = file_size;
+ if(file_size > 8192) read_byte = 8192;
+ fread(file_buf,1,read_byte,fp);
+ httpd_send_data(sd,read_byte,file_buf);
+ file_size -= read_byte;
+ }
+ fclose(fp);
+ }
+}
+
+
+char* httpd_binary_encode(const char* val)
+{
+ char *buf = aMalloc(strlen(val) * 3 + 1);
+ char *p = buf;
+ while(*val) {
+ if(isalnum((unsigned char)*val)) {
+ *(p++) = *(val++);
+ } else {
+ unsigned char c1 = *(val++);
+ unsigned char c2 = (c1 >> 4);
+ unsigned char c3 = (c1 & 0x0F);
+ *(p++) = '%';
+ *(p++) = c2 + (c2 >= 10 ? 'A'-10 : '0');
+ *(p++) = c3 + (c3 >= 10 ? 'A'-10 : '0');
+ }
+ }
+ *p = 0;
+ return buf;
+}
+
+char* httpd_quote_meta(const char* p1)
+{
+ char *buf = aMalloc(strlen(p1) * 6 + 1);
+ char *p2 = buf;
+ while(*p1) {
+ switch(*p1) {
+ case '<': memcpy(p2,"&lt;",4); p2 += 4; p1++; break;
+ case '>': memcpy(p2,"&gt;",4); p2 += 4; p1++; break;
+ case '&': memcpy(p2,"&amp;",5); p2 += 5; p1++; break;
+ case '"': memcpy(p2,"&quot;",6); p2 += 6; p1++; break;
+ default: *(p2++) = *(p1++);
+ }
+ }
+ *p2 = 0;
+ return buf;
+}
+
+///////// Graph / HTML snippets functions /////////////////////////////
+
+struct file_entry {
+ char *filename;
+ struct file_entry *next;
+};
+struct file_entry *fileentry_head = NULL;
+
+static void httpd_graph_load (const char *filename)
+{
+ struct file_entry *entry;
+ char type = *server_type + 'a';
+ int len = strlen(filename);
+
+ if (len <= 7 || filename[len - 7] != type)
+ return;
+
+ entry = fileentry_head;
+ while (entry) {
+ if (strcmpi(entry->filename, filename) == 0)
+ return;
+ entry = entry->next;
+ }
+
+ entry = (struct file_entry *) aMalloc (sizeof(struct file_entry));
+ entry->filename = aStrdup(filename);
+ entry->next = fileentry_head;
+ fileentry_head = entry;
+}
+
+// scan for available html snippets
+static int httpd_graph_find (int tid, unsigned int tick, int id, int data)
+{
+ findfile("httpd", ".graph", httpd_graph_load);
+ return 0;
+}
+
+static void httpd_graph_parse (struct httpd_session_data *sd,const char* url)
+{
+ // output html
+ struct file_entry *entry = fileentry_head;
+ char buf[8192];
+ char *p = buf;
+ FILE *fp;
+
+ p += sprintf(p,"<html><head><title>Athena Sensors</title></head>\n\n<body>\n");
+ p += sprintf(p,"<h1>Athena Sensors</h1>\n\n");
+
+ while (entry) {
+ // insert snippets into html
+ char line[1024];
+ fp = fopen(entry->filename, "r");
+ if (fp == NULL) {
+ entry = entry->next;
+ continue;
+ }
+ while(fgets(line, sizeof(line) -1, fp))
+ p += sprintf(p, line);
+ fclose(fp);
+ entry = entry->next;
+ }
+ p += sprintf(p,"</body></html>\n");
+ httpd_send(sd,200,"text/html",p - buf,buf);
+}
+
+//////////////// Initialise / Finalise /////////////////////////////
+
+void do_final (void)
+{
+ int fd;
+ struct file_entry *entry = fileentry_head, *entry2;
+
+ // clear up graph entries
+ while (entry) {
+ entry2 = entry->next;
+ aFree(entry->filename);
+ aFree(entry);
+ entry = entry2;
+ }
+ // clear up existing http connections
+ for (fd = 0; fd < *max_fd; fd++)
+ if (sessiond[fd] && sessiond[fd]->type == SESSION_HTTP)
+ delete_sessiond(fd);
+
+ httpd_files->destroy(httpd_files,NULL);
+ // clear up the database
+ db_final();
+ // clear up allocated memory
+ // note: the memory manager, if enabled, would be
+ // separate from the parent program, which is also
+ // why we need to delete our http sessions
+ // separately above
+ malloc_final();
+}
+
+void do_init (void)
+{
+ struct func_parse_table *parse_table;
+ int enable_httpd = 1;
+
+ do {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp = fopen("plugins/httpd.conf","r");
+ if (fp == NULL)
+ break;
+
+ while(fgets(line, sizeof(line) -1, fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
+ if(strcmpi(w1,"enable_httpd")==0){
+ enable_httpd = atoi(w2);
+ } else if(strcmpi(w1,"document_root")==0){
+ strcpy(document_root, w2);
+ } else if(strcmpi(w1,"request_timeout_first")==0){
+ request_timeout[0] = atoi(w2);
+ } else if(strcmpi(w1,"request_timeout_persist")==0){
+ request_timeout[1] = atoi(w2);
+ } else if(strcmpi(w1,"max_persist_request")==0){
+ max_persist_requests = atoi(w2);
+ }
+ }
+ }
+ fclose(fp);
+ } while (0);
+
+ if (!enable_httpd)
+ return;
+
+ malloc_init();
+ db_init();
+ IMPORT_SYMBOL(server_type, 0);
+ IMPORT_SYMBOL(gettick, 5);
+ IMPORT_SYMBOL(add_timer_interval, 8);
+ IMPORT_SYMBOL(max_fd, 13);
+ IMPORT_SYMBOL(sessiond, 14);
+ IMPORT_SYMBOL(delete_sessiond, 15);
+ IMPORT_SYMBOL(_WFIFOSET, 16);
+ IMPORT_SYMBOL(_RFIFOSKIP, 17);
+ IMPORT_SYMBOL(parse_table, 18);
+
+ // register http parsing function
+ parse_table[SESSION_HTTP].check = httpd_check;
+ parse_table[SESSION_HTTP].func = httpd_parse;
+
+ httpd_files = db_alloc(__FILE__,__LINE__,DB_STRING,DB_OPT_RELEASE_KEY,50);
+ httpd_default = httpd_send_file;
+
+ httpd_pages ("/graph", httpd_graph_parse);
+ add_timer_interval(gettick()+10000,httpd_graph_find,0,0,10000);
+
+ return;
+}
diff --git a/src/plugins/httpd.h b/src/plugins/httpd.h
index 9eef7d915..aa6989421 100644
--- a/src/plugins/httpd.h
+++ b/src/plugins/httpd.h
@@ -1,107 +1,107 @@
-#ifndef _HTTPD_H_
-#define _HTTPD_H_
-
-struct httpd_session_data;
-
-// NOTE by Celest: This file is not used by httpd.c, but included only as an API reference.
-
-// ’ˆÓ
-// 1.athena“à‘ ‚Ìhttpd ‚Å‘å‚«‚ȃtƒ@ƒCƒ‹‚ð‘—M‚·‚邱‚Æ‚Í‚¨Š©‚ß‚µ‚Ü‚¹‚ñB
-// 200KB ‚ð’´‚¦‚é‚悤‚ȃtƒ@ƒCƒ‹‚ÍA•Ê‚̃\ƒtƒg‚ð—˜—p‚·‚邱‚Æ‚ðŠ©‚ß‚Ü‚·B
-// 2.ƒtƒ@ƒCƒ‹–¼‚ÉŽg‚¦‚镶Žš‚ÍA[A-Za-z0-9-_\.] ‚Å‚·B‘¼‚Ì•¶Žš‚ðŽg‚¤‚ÆA
-// BAD REQUEST ‚Å’e‚©‚ê‚Ü‚·B
-
-
-
-void httpd_pages(const char* url,void(*httpd_func)(struct httpd_session_data* sd,const char* url));
-
-// Žw’肳‚ꂽURL ‚ɑ΂·‚éƒR[ƒ‹ƒoƒbƒNŠÖ”‚ðÝ’è‚·‚éB‚±‚ÌŠÖ”‚ÍAˆÈ‰º‚̂悤‚É
-// ŽÀ‘•‚·‚é•K—v‚ª‚ ‚éB
-//
-// 1. URL ‚ÍA擪‚̃Xƒ‰ƒbƒVƒ…‚ªÈ‚©‚ꂽƒtƒ@ƒCƒ‹–¼‚Å‚·B—Ⴆ‚ÎA"GET / HTTP/1.0"
-// ‚Æ‚¢‚¤•—‚ɃŠƒNƒGƒXƒg‚³‚ꂽŽžAURL ‚É‚Í""(‹ó•¶Žš)‚ª“ü‚èA"GET /hoge HTTP/1.0"
-// ‚ÌŽž‚É‚ÍA"hoge"‚ª“ü‚è‚Ü‚·B
-// 2. ƒŠƒNƒGƒXƒg‚³‚ꂽƒy[ƒW‚ªŒ©‚‚©‚Á‚½‚çAhttpd_send() ‚Ü‚½‚ÍAhttpd_send_head()
-// ‚Æhttpd_send_data() ‚Ì‘g‚ðŒÄ‚Ño‚µAƒf[ƒ^‚ðo—Í‚·‚éB
-// 3. httpd_send_file ‚ðŽw’è‚·‚é‚ÆAhttpd/ ˆÈ‰º‚É‚ ‚éƒtƒ@ƒCƒ‹‚ðo—Í‚·‚éBƒtƒ@ƒCƒ‹‚É
-// ‹ó•¶Žš‚ªŽw’肳‚ꂽŽž‚ÍAindex.html‚ªŽw’肳‚ꂽ‚à‚Ì‚Æ‚Ý‚È‚³‚ê‚éB
-
-
-
-char* httpd_get_value(struct httpd_session_data* sd,const char* val);
-
-// ƒŠƒNƒGƒXƒg‚³‚ꂽƒAƒhƒŒƒX‚É“n‚³‚ꂽƒtƒH[ƒ€ƒf[ƒ^‚Ì‚¤‚¿AŠY“–‚·‚镶Žš—ñ‚ð•Ô‚·B
-// —Ⴆ‚ÎA"GET /status/graph?image=users HTTP/1.0"‚Æ‚¢‚¤ƒŠƒNƒGƒXƒg‚Ìê‡A
-// httpd_get_value(sd,"image"); ‚ÍA "users"‚ð•Ô‚·B‚±‚ÌŠÖ”‚Ì–ß‚è’l‚ÍAŒÄ‚Ño‚µŒ³‚ª
-// ‰ð•ú‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚Ü‚½AŠY“–‚·‚镶Žš—ñ‚ª–³‚¢Žž‚ÍA‹ó‚Ì•¶Žš—ñ‚ð•Ô‚·B
-
-unsigned int httpd_get_ip(struct httpd_session_data *sd);
-
-// ƒNƒ‰ƒCƒAƒ“ƒg‚ÌIP‚ð•Ô‚·B
-
-
-void httpd_default_page(void(*httpd_func)(struct httpd_session_data* sd,const char* url));
-
-// Žw’肳‚ꂽURL ‚ª“o˜^‚³‚ê‚Ä‚¢‚È‚¢Žž‚ɌĂÑo‚·ŠÖ”‚ðÝ’è‚·‚éB‚±‚ÌŠÖ”‚ðŒÄ‚Ño‚³‚È‚¢‚©A
-// ŠÖ”‚̈ø”‚ÉNULL‚ðŽw’è‚·‚é‚ÆA404 Not Found ‚ð•Ô‚·B
-
-
-
-
-void httpd_send(struct httpd_session_data* sd,int status,const char *content_type,int content_len,const void *data);
-
-// HTTPƒwƒbƒ_Aƒf[ƒ^‚ð‘g‚É‚µ‚Ä‘—M‚·‚éB‚±‚ÌŠÖ”‚ðŒÄ‚Ño‚µ‚½Œã‚ÉAhttpd_send_data ‚ð
-// ŒÄ‚Ño‚µ‚Ä‚Í‚È‚ç‚È‚¢B
-//
-// sd : httpd_set_parse_func() ‚É“n‚³‚ꂽ‚à‚Ì‚ð‚»‚Ì‚Ü‚Ü“n‚·‚±‚ÆB
-// status : HTTPƒwƒbƒ_‚ɉÁ‚¦‚éstatusB’Êí‚Í200B
-// content_type : ‘—M‚·‚éƒf[ƒ^‚̃^ƒCƒvBtext/html , image/jpeg ‚È‚ÇB
-// content_len : ‘—M‚·‚éƒf[ƒ^‚Ì’·‚³B
-// data : ‘—M‚·‚éƒf[ƒ^‚ւ̃|ƒCƒ“ƒ^
-
-
-
-void httpd_send_head(struct httpd_session_data* sd,int status,const char *content_type,int content_len);
-
-// HTTPƒwƒbƒ_‚ð‘—M‚·‚éB
-//
-// sd : “¯ã
-// status : “¯ã
-// content_type : “¯ã
-// content_len : content_len‚ð-1‚ÉŽw’è‚·‚邱‚Æ‚ÅA‚±‚ÌŠÖ”‚ªŒÄ‚΂ꂽŽž“_‚Å
-// ’·‚³‚ª•ª‚©‚ç‚È‚¢ƒf[ƒ^‚ð‘—M‚·‚邱‚Æ‚ª‚Å‚«‚éB‚±‚ÌꇂÍ
-// ‹­§“I‚ÉHTTP/1.0 Ú‘±‚Æ‚È‚èAƒI[ƒo[ƒwƒbƒh‚ª‘å‚«‚­‚È‚é‚Ì‚ÅA
-// ‚ ‚܂肨Š©‚ß‚Í‚µ‚È‚¢B
-
-
-
-
-void httpd_send_data(struct httpd_session_data* sd,int content_len,const void *data);
-
-// ƒf[ƒ^‚ð‘—M‚·‚éB‚±‚ÌŠÖ”‚ðAhttpd_send_head() ‚ðŒÄ‚Ño‚·‘O‚ɌĂÑo‚³‚ꂽê‡A
-// content_type = application/octet-stream, content_len = -1 ‚Æ‚µ‚ăwƒbƒ_‚ª‘—M‚³‚ê‚éB
-// sd : “¯ã
-// content_len : ‘—M‚·‚éƒf[ƒ^‚Ìdata’·‚³‚ðŽw’è‚·‚éB
-// data : ‘—M‚·‚éƒf[ƒ^
-
-
-
-void httpd_send_file(struct httpd_session_data* sd,const char* url);
-
-// ƒtƒ@ƒCƒ‹‚ð‘—M‚·‚éB‚±‚ÌŠÖ”‚ÍAhttpd_send_head() ‚ðŒÄ‚Ño‚·‘O‚ɌĂÑo‚³‚È‚¯‚ê‚Î
-// ‚È‚ç‚È‚¢Bƒtƒ@ƒCƒ‹‚ɋ󕶎š‚ªŽw’肳‚ꂽ‚Æ‚«‚ÍAindex.html‚ªŽw’肳‚ꂽ‚ÆŒ©‚È‚³‚ê‚éB
-
-
-
-void httpd_send_error(struct httpd_session_data* sd,int status);
-
-// HTTPƒGƒ‰[ƒƒbƒZ[ƒW‚ð‘—M‚·‚éBstatus ‚ÍHTTP‚̃Gƒ‰[ƒR[ƒh‚Æ“¯‚¶B
-// 400 Bad Request, 404 Not Found, 500 Internal Server Error ‚È‚ÇB
-
-int httpd_parse(int fd);
-
-// ‰Šú‰»ˆ—
-void do_init_httpd(void);
-void do_final_httpd(void);
-
-#endif
+#ifndef _HTTPD_H_
+#define _HTTPD_H_
+
+struct httpd_session_data;
+
+// NOTE by Celest: This file is not used by httpd.c, but included only as an API reference.
+
+// ’ˆÓ
+// 1.athena“à‘ ‚Ìhttpd ‚Å‘å‚«‚ȃtƒ@ƒCƒ‹‚ð‘—M‚·‚邱‚Æ‚Í‚¨Š©‚ß‚µ‚Ü‚¹‚ñB
+// 200KB ‚ð’´‚¦‚é‚悤‚ȃtƒ@ƒCƒ‹‚ÍA•Ê‚̃\ƒtƒg‚ð—˜—p‚·‚邱‚Æ‚ðŠ©‚ß‚Ü‚·B
+// 2.ƒtƒ@ƒCƒ‹–¼‚ÉŽg‚¦‚镶Žš‚ÍA[A-Za-z0-9-_\.] ‚Å‚·B‘¼‚Ì•¶Žš‚ðŽg‚¤‚ÆA
+// BAD REQUEST ‚Å’e‚©‚ê‚Ü‚·B
+
+
+
+void httpd_pages(const char* url,void(*httpd_func)(struct httpd_session_data* sd,const char* url));
+
+// Žw’肳‚ꂽURL ‚ɑ΂·‚éƒR[ƒ‹ƒoƒbƒNŠÖ”‚ðÝ’è‚·‚éB‚±‚ÌŠÖ”‚ÍAˆÈ‰º‚̂悤‚É
+// ŽÀ‘•‚·‚é•K—v‚ª‚ ‚éB
+//
+// 1. URL ‚ÍA擪‚̃Xƒ‰ƒbƒVƒ…‚ªÈ‚©‚ꂽƒtƒ@ƒCƒ‹–¼‚Å‚·B—Ⴆ‚ÎA"GET / HTTP/1.0"
+// ‚Æ‚¢‚¤•—‚ɃŠƒNƒGƒXƒg‚³‚ꂽŽžAURL ‚É‚Í""(‹ó•¶Žš)‚ª“ü‚èA"GET /hoge HTTP/1.0"
+// ‚ÌŽž‚É‚ÍA"hoge"‚ª“ü‚è‚Ü‚·B
+// 2. ƒŠƒNƒGƒXƒg‚³‚ꂽƒy[ƒW‚ªŒ©‚‚©‚Á‚½‚çAhttpd_send() ‚Ü‚½‚ÍAhttpd_send_head()
+// ‚Æhttpd_send_data() ‚Ì‘g‚ðŒÄ‚Ño‚µAƒf[ƒ^‚ðo—Í‚·‚éB
+// 3. httpd_send_file ‚ðŽw’è‚·‚é‚ÆAhttpd/ ˆÈ‰º‚É‚ ‚éƒtƒ@ƒCƒ‹‚ðo—Í‚·‚éBƒtƒ@ƒCƒ‹‚É
+// ‹ó•¶Žš‚ªŽw’肳‚ꂽŽž‚ÍAindex.html‚ªŽw’肳‚ꂽ‚à‚Ì‚Æ‚Ý‚È‚³‚ê‚éB
+
+
+
+char* httpd_get_value(struct httpd_session_data* sd,const char* val);
+
+// ƒŠƒNƒGƒXƒg‚³‚ꂽƒAƒhƒŒƒX‚É“n‚³‚ꂽƒtƒH[ƒ€ƒf[ƒ^‚Ì‚¤‚¿AŠY“–‚·‚镶Žš—ñ‚ð•Ô‚·B
+// —Ⴆ‚ÎA"GET /status/graph?image=users HTTP/1.0"‚Æ‚¢‚¤ƒŠƒNƒGƒXƒg‚Ìê‡A
+// httpd_get_value(sd,"image"); ‚ÍA "users"‚ð•Ô‚·B‚±‚ÌŠÖ”‚Ì–ß‚è’l‚ÍAŒÄ‚Ño‚µŒ³‚ª
+// ‰ð•ú‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚Ü‚½AŠY“–‚·‚镶Žš—ñ‚ª–³‚¢Žž‚ÍA‹ó‚Ì•¶Žš—ñ‚ð•Ô‚·B
+
+unsigned int httpd_get_ip(struct httpd_session_data *sd);
+
+// ƒNƒ‰ƒCƒAƒ“ƒg‚ÌIP‚ð•Ô‚·B
+
+
+void httpd_default_page(void(*httpd_func)(struct httpd_session_data* sd,const char* url));
+
+// Žw’肳‚ꂽURL ‚ª“o˜^‚³‚ê‚Ä‚¢‚È‚¢Žž‚ɌĂÑo‚·ŠÖ”‚ðÝ’è‚·‚éB‚±‚ÌŠÖ”‚ðŒÄ‚Ño‚³‚È‚¢‚©A
+// ŠÖ”‚̈ø”‚ÉNULL‚ðŽw’è‚·‚é‚ÆA404 Not Found ‚ð•Ô‚·B
+
+
+
+
+void httpd_send(struct httpd_session_data* sd,int status,const char *content_type,int content_len,const void *data);
+
+// HTTPƒwƒbƒ_Aƒf[ƒ^‚ð‘g‚É‚µ‚Ä‘—M‚·‚éB‚±‚ÌŠÖ”‚ðŒÄ‚Ño‚µ‚½Œã‚ÉAhttpd_send_data ‚ð
+// ŒÄ‚Ño‚µ‚Ä‚Í‚È‚ç‚È‚¢B
+//
+// sd : httpd_set_parse_func() ‚É“n‚³‚ꂽ‚à‚Ì‚ð‚»‚Ì‚Ü‚Ü“n‚·‚±‚ÆB
+// status : HTTPƒwƒbƒ_‚ɉÁ‚¦‚éstatusB’Êí‚Í200B
+// content_type : ‘—M‚·‚éƒf[ƒ^‚̃^ƒCƒvBtext/html , image/jpeg ‚È‚ÇB
+// content_len : ‘—M‚·‚éƒf[ƒ^‚Ì’·‚³B
+// data : ‘—M‚·‚éƒf[ƒ^‚ւ̃|ƒCƒ“ƒ^
+
+
+
+void httpd_send_head(struct httpd_session_data* sd,int status,const char *content_type,int content_len);
+
+// HTTPƒwƒbƒ_‚ð‘—M‚·‚éB
+//
+// sd : “¯ã
+// status : “¯ã
+// content_type : “¯ã
+// content_len : content_len‚ð-1‚ÉŽw’è‚·‚邱‚Æ‚ÅA‚±‚ÌŠÖ”‚ªŒÄ‚΂ꂽŽž“_‚Å
+// ’·‚³‚ª•ª‚©‚ç‚È‚¢ƒf[ƒ^‚ð‘—M‚·‚邱‚Æ‚ª‚Å‚«‚éB‚±‚ÌꇂÍ
+// ‹­§“I‚ÉHTTP/1.0 Ú‘±‚Æ‚È‚èAƒI[ƒo[ƒwƒbƒh‚ª‘å‚«‚­‚È‚é‚Ì‚ÅA
+// ‚ ‚܂肨Š©‚ß‚Í‚µ‚È‚¢B
+
+
+
+
+void httpd_send_data(struct httpd_session_data* sd,int content_len,const void *data);
+
+// ƒf[ƒ^‚ð‘—M‚·‚éB‚±‚ÌŠÖ”‚ðAhttpd_send_head() ‚ðŒÄ‚Ño‚·‘O‚ɌĂÑo‚³‚ꂽê‡A
+// content_type = application/octet-stream, content_len = -1 ‚Æ‚µ‚ăwƒbƒ_‚ª‘—M‚³‚ê‚éB
+// sd : “¯ã
+// content_len : ‘—M‚·‚éƒf[ƒ^‚Ìdata’·‚³‚ðŽw’è‚·‚éB
+// data : ‘—M‚·‚éƒf[ƒ^
+
+
+
+void httpd_send_file(struct httpd_session_data* sd,const char* url);
+
+// ƒtƒ@ƒCƒ‹‚ð‘—M‚·‚éB‚±‚ÌŠÖ”‚ÍAhttpd_send_head() ‚ðŒÄ‚Ño‚·‘O‚ɌĂÑo‚³‚È‚¯‚ê‚Î
+// ‚È‚ç‚È‚¢Bƒtƒ@ƒCƒ‹‚ɋ󕶎š‚ªŽw’肳‚ꂽ‚Æ‚«‚ÍAindex.html‚ªŽw’肳‚ꂽ‚ÆŒ©‚È‚³‚ê‚éB
+
+
+
+void httpd_send_error(struct httpd_session_data* sd,int status);
+
+// HTTPƒGƒ‰[ƒƒbƒZ[ƒW‚ð‘—M‚·‚éBstatus ‚ÍHTTP‚̃Gƒ‰[ƒR[ƒh‚Æ“¯‚¶B
+// 400 Bad Request, 404 Not Found, 500 Internal Server Error ‚È‚ÇB
+
+int httpd_parse(int fd);
+
+// ‰Šú‰»ˆ—
+void do_init_httpd(void);
+void do_final_httpd(void);
+
+#endif
diff --git a/src/plugins/httpd.txt b/src/plugins/httpd.txt
index 2de84e3d8..5a575f680 100644
--- a/src/plugins/httpd.txt
+++ b/src/plugins/httpd.txt
@@ -1,20 +1,20 @@
-//
-// HTTP Daemon Plugin Configuration
-//
-
-// Enabled the http daemon?
-enable_httpd: 1
-
-// WWW Root path
-//(The ending slash is required!)
-document_root: httpd/
-
-// Request timeout (first request)
-// Both of the following are in milliseconds
-request_timeout_first: 2500
-
-// Request timeout (consequent requests)
-request_timeout_persist: 60000
-
-// Maximum persistent requests
+//
+// HTTP Daemon Plugin Configuration
+//
+
+// Enabled the http daemon?
+enable_httpd: 1
+
+// WWW Root path
+//(The ending slash is required!)
+document_root: httpd/
+
+// Request timeout (first request)
+// Both of the following are in milliseconds
+request_timeout_first: 2500
+
+// Request timeout (consequent requests)
+request_timeout_persist: 60000
+
+// Maximum persistent requests
max_persist_request: 32 \ No newline at end of file
diff --git a/src/plugins/pid.c b/src/plugins/pid.c
index 1ceb49b6f..62eb6878c 100644
--- a/src/plugins/pid.c
+++ b/src/plugins/pid.c
@@ -1,54 +1,54 @@
-
-#include <stdio.h>
-#include <string.h>
-#ifndef _WIN32
- #include <unistd.h>
-#else
- #define getpid GetCurrentProcessId
-#endif
-#ifdef MINGW
- #include <process.h>
- #include <io.h>
-#endif
-#include "../common/plugin.h"
-
-PLUGIN_INFO = {
- "ProcessId",
- PLUGIN_ALL,
- "1.0",
- PLUGIN_VERSION,
- "Logs the process ID"
-};
-
-PLUGIN_EVENTS_TABLE = {
- { "pid_create", "Plugin_Init" },
- { "pid_delete", "Plugin_Final" },
- { NULL, NULL }
-};
-
-char pid_file[256];
-char *server_name;
-
-void pid_create ()
-{
- FILE *fp;
- int len;
-
- IMPORT_SYMBOL(server_name, 1);
- len = strlen(server_name);
- strcpy(pid_file, server_name);
- if(len > 4 && pid_file[len - 4] == '.') {
- pid_file[len - 4] = 0;
- }
- strcat(pid_file, ".pid");
- fp = fopen(pid_file, "w");
- if (fp) {
- fprintf(fp, "%d", getpid());
- fclose(fp);
- }
-}
-
-void pid_delete ()
-{
- unlink(pid_file);
-}
+
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32
+ #include <unistd.h>
+#else
+ #define getpid GetCurrentProcessId
+#endif
+#ifdef MINGW
+ #include <process.h>
+ #include <io.h>
+#endif
+#include "../common/plugin.h"
+
+PLUGIN_INFO = {
+ "ProcessId",
+ PLUGIN_ALL,
+ "1.0",
+ PLUGIN_VERSION,
+ "Logs the process ID"
+};
+
+PLUGIN_EVENTS_TABLE = {
+ { "pid_create", "Plugin_Init" },
+ { "pid_delete", "Plugin_Final" },
+ { NULL, NULL }
+};
+
+char pid_file[256];
+char *server_name;
+
+void pid_create ()
+{
+ FILE *fp;
+ int len;
+
+ IMPORT_SYMBOL(server_name, 1);
+ len = strlen(server_name);
+ strcpy(pid_file, server_name);
+ if(len > 4 && pid_file[len - 4] == '.') {
+ pid_file[len - 4] = 0;
+ }
+ strcat(pid_file, ".pid");
+ fp = fopen(pid_file, "w");
+ if (fp) {
+ fprintf(fp, "%d", getpid());
+ fclose(fp);
+ }
+}
+
+void pid_delete ()
+{
+ unlink(pid_file);
+}
diff --git a/src/plugins/sample.c b/src/plugins/sample.c
index 5a8e2a286..39e95752b 100644
--- a/src/plugins/sample.c
+++ b/src/plugins/sample.c
@@ -1,77 +1,77 @@
-// Sample Athena plugin
-
-#include <stdio.h>
-#include <string.h>
-#include "../common/plugin.h"
-
-////// Plugin information ////////
-//
-PLUGIN_INFO = {
-// change only the following area
- "Test", // Plugin name
- PLUGIN_ALL, // Which servers is this plugin for
- "0.1", // Plugin version
- PLUGIN_VERSION, // Minimum plugin engine version to run
- "A sample plugin" // Short description of plugin
-};
-
-////// Plugin event list //////////
-// Format: <plugin function>,<event name>
-// All registered functions to a event gets executed
-// (In descending order) when its called.
-// Multiple functions can be called by multiple events too,
-// So it's up to your creativity ^^
-//
-PLUGIN_EVENTS_TABLE = {
-// change only the following area
- { "test_me", "Plugin_Test" }, // when the plugin is tested for compatibility
- { "do_init", "Plugin_Init" }, // when plugins are loaded
- { "do_final", "Plugin_Final" }, // when plugins are unloaded
- { "some_function", "some_event" },
- { "some_function", "another_event" },
- { NULL, NULL }
-};
-
-///// Variables /////
-char *server_type;
-char *server_name;
-
-//////// Plugin functions //////////
-int do_init ()
-{
- // import symbols from the server
- IMPORT_SYMBOL(server_type, 0);
- IMPORT_SYMBOL(server_name, 1);
-
- printf ("Server type is ");
- switch (*server_type) {
- case PLUGIN_LOGIN: printf ("Login\n"); break;
- case PLUGIN_CHAR: printf ("Char\n"); break;
- case PLUGIN_MAP: printf ("Map\n"); break;
- }
- printf ("Filename is %s\n", server_name);
-
- return 1;
-}
-
-int do_final ()
-{
- printf ("Bye world\n");
-
- return 1;
-}
-
-int some_function ()
-{
- printf ("Some function\n");
- return 0;
-}
-
-// return 1 if the testing passes, otherwise 0
-// (where the plugin will be deactivated)
-int test_me ()
-{
- if (1 + 1 == 2)
- return 1;
- return 0;
-}
+// Sample Athena plugin
+
+#include <stdio.h>
+#include <string.h>
+#include "../common/plugin.h"
+
+////// Plugin information ////////
+//
+PLUGIN_INFO = {
+// change only the following area
+ "Test", // Plugin name
+ PLUGIN_ALL, // Which servers is this plugin for
+ "0.1", // Plugin version
+ PLUGIN_VERSION, // Minimum plugin engine version to run
+ "A sample plugin" // Short description of plugin
+};
+
+////// Plugin event list //////////
+// Format: <plugin function>,<event name>
+// All registered functions to a event gets executed
+// (In descending order) when its called.
+// Multiple functions can be called by multiple events too,
+// So it's up to your creativity ^^
+//
+PLUGIN_EVENTS_TABLE = {
+// change only the following area
+ { "test_me", "Plugin_Test" }, // when the plugin is tested for compatibility
+ { "do_init", "Plugin_Init" }, // when plugins are loaded
+ { "do_final", "Plugin_Final" }, // when plugins are unloaded
+ { "some_function", "some_event" },
+ { "some_function", "another_event" },
+ { NULL, NULL }
+};
+
+///// Variables /////
+char *server_type;
+char *server_name;
+
+//////// Plugin functions //////////
+int do_init ()
+{
+ // import symbols from the server
+ IMPORT_SYMBOL(server_type, 0);
+ IMPORT_SYMBOL(server_name, 1);
+
+ printf ("Server type is ");
+ switch (*server_type) {
+ case PLUGIN_LOGIN: printf ("Login\n"); break;
+ case PLUGIN_CHAR: printf ("Char\n"); break;
+ case PLUGIN_MAP: printf ("Map\n"); break;
+ }
+ printf ("Filename is %s\n", server_name);
+
+ return 1;
+}
+
+int do_final ()
+{
+ printf ("Bye world\n");
+
+ return 1;
+}
+
+int some_function ()
+{
+ printf ("Some function\n");
+ return 0;
+}
+
+// return 1 if the testing passes, otherwise 0
+// (where the plugin will be deactivated)
+int test_me ()
+{
+ if (1 + 1 == 2)
+ return 1;
+ return 0;
+}
diff --git a/src/plugins/sig.c b/src/plugins/sig.c
index 7ddfaf2dc..edd0e55a2 100644
--- a/src/plugins/sig.c
+++ b/src/plugins/sig.c
@@ -1,211 +1,211 @@
-// $Id: sig.c 1 2005-6-13 3:17:17 PM Celestia $
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <time.h>
-#include "../common/plugin.h"
-#include "../common/version.h"
-#include "../common/showmsg.h"
-
-PLUGIN_INFO = {
- "Signals",
- PLUGIN_CORE,
- "1.1",
- PLUGIN_VERSION,
- "Handles program signals"
-};
-
-PLUGIN_EVENTS_TABLE = {
- { "sig_init", "Plugin_Init" },
- { "sig_final", "Plugin_Final" },
- { NULL, NULL }
-};
-
-//////////////////////////////////////
-
-#if defined(_WIN32) || defined(MINGW)
- int sig_init() {
- ShowError("sig: This plugin is not supported - Enable 'exchndl' instead!\n");
- return 0;
- }
- int sig_final() { return 0; }
-#elif defined (__NETBSD__) || defined (__FREEBSD__)
- int sig_init() {
- ShowError("sig: This plugin is not supported!\n");
- return 0;
- }
- int sig_final() { return 0; }
-#else
-
-//////////////////////////////////////
-
-#if !defined(CYGWIN)
- #include <execinfo.h>
-#endif
-
-const char* (*getrevision)();
-unsigned long (*getuptime)();
-char *server_name;
-int crash_flag = 0;
-
-extern const char *strsignal(int);
-int sig_final ();
-
-// by Gabuzomeu
-// This is an implementation of signal() using sigaction() for portability.
-// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
-// Programming in the UNIX Environment_.
-//
-#ifdef WIN32 // windows don't have SIGPIPE
-#define SIGPIPE SIGINT
-#endif
-
-#ifndef POSIX
-#define compat_signal(signo, func) signal(signo, func)
-#else
-sigfunc *compat_signal(int signo, sigfunc *func)
-{
- struct sigaction sact, oact;
-
- sact.sa_handler = func;
- sigemptyset(&sact.sa_mask);
- sact.sa_flags = 0;
-#ifdef SA_INTERRUPT
- sact.sa_flags |= SA_INTERRUPT; /* SunOS */
-#endif
-
- if (sigaction(signo, &sact, &oact) < 0)
- return (SIG_ERR);
-
- return (oact.sa_handler);
-}
-#endif
-
-/*=========================================
- * Dumps the stack using glibc's backtrace
- *-----------------------------------------
- */
-#ifdef CYGWIN
- #define FOPEN_ freopen
- extern void cygwin_stackdump();
-#else
- #define FOPEN_(fn,m,s) fopen(fn,m)
-#endif
-void sig_dump(int sn)
-{
- FILE *fp;
- char file[256];
- int no = 0;
-
- crash_flag = 1;
- // search for a usable filename
- do {
- sprintf (file, "log/%s%04d.stackdump", server_name, ++no);
- } while((fp = fopen(file,"r")) && (fclose(fp), no < 9999));
- // dump the trace into the file
-
- if ((fp = FOPEN_(file, "w", stderr)) != NULL) {
- const char *revision;
- #ifndef CYGWIN
- void* array[20];
- char **stack;
- size_t size;
- #endif
-
- ShowNotice ("Dumping stack to '"CL_WHITE"%s"CL_RESET"'...\n", file);
- if ((revision = getrevision()) != NULL)
- fprintf(fp, "Version: svn%s \n", revision);
- else
- fprintf(fp, "Version: %2d.%02d.%02d mod%02d \n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION, ATHENA_MOD_VERSION);
- fprintf(fp, "Exception: %s \n", strsignal(sn));
- fflush (fp);
-
- #ifdef CYGWIN
- cygwin_stackdump ();
- #else
- fprintf(fp, "Stack trace:\n");
- size = backtrace (array, 20);
- stack = backtrace_symbols (array, size);
- for (no = 0; no < size; no++) {
- fprintf(fp, "%s\n", stack[no]);
- }
- fprintf(fp,"End of stack trace\n");
- free(stack);
- #endif
-
- ShowNotice("%s Saved.\n", file);
- fflush(stdout);
- fclose(fp);
- }
-
- sig_final(); // Log our uptime
- // Pass the signal to the system's default handler
- compat_signal(sn, SIG_DFL);
- raise(sn);
-}
-
-/*=========================================
- * Shutting down (Program did not crash ^^)
- * - Log our current up time
- *-----------------------------------------
- */
-int sig_final ()
-{
- time_t curtime;
- char curtime2[24];
- FILE *fp;
- long seconds = 0, day = 24*60*60, hour = 60*60,
- minute = 60, days = 0, hours = 0, minutes = 0;
-
- fp = fopen("log/uptime.log","a");
- if (fp) {
- time(&curtime);
- strftime(curtime2, 24, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
-
- seconds = getuptime();
- days = seconds/day;
- seconds -= (seconds/day>0)?(seconds/day)*day:0;
- hours = seconds/hour;
- seconds -= (seconds/hour>0)?(seconds/hour)*hour:0;
- minutes = seconds/minute;
- seconds -= (seconds/minute>0)?(seconds/minute)*minute:0;
-
- fprintf(fp, "%s: %s %s - %ld days, %ld hours, %ld minutes, %ld seconds.\n",
- curtime2, server_name, (crash_flag ? "crashed" : "uptime"),
- days, hours, minutes, seconds);
- fclose(fp);
- }
-
- return 1;
-}
-
-/*=========================================
- * Register the signal handlers
- *-----------------------------------------
- */
-int sig_init ()
-{
- void (*func) = sig_dump;
-#ifdef CYGWIN // test if dumper is enabled
- char *buf = getenv ("CYGWIN");
- if (buf && strstr(buf, "error_start") != NULL)
- func = SIG_DFL;
-#endif
-
- IMPORT_SYMBOL(server_name, 1);
- IMPORT_SYMBOL(getrevision, 6);
- IMPORT_SYMBOL(getuptime, 11);
-
- compat_signal(SIGSEGV, func);
- compat_signal(SIGFPE, func);
- compat_signal(SIGILL, func);
- #ifndef __WIN32
- compat_signal(SIGBUS, func);
- #endif
-
- return 1;
-}
-#endif
-
+// $Id: sig.c 1 2005-6-13 3:17:17 PM Celestia $
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <time.h>
+#include "../common/plugin.h"
+#include "../common/version.h"
+#include "../common/showmsg.h"
+
+PLUGIN_INFO = {
+ "Signals",
+ PLUGIN_CORE,
+ "1.1",
+ PLUGIN_VERSION,
+ "Handles program signals"
+};
+
+PLUGIN_EVENTS_TABLE = {
+ { "sig_init", "Plugin_Init" },
+ { "sig_final", "Plugin_Final" },
+ { NULL, NULL }
+};
+
+//////////////////////////////////////
+
+#if defined(_WIN32) || defined(MINGW)
+ int sig_init() {
+ ShowError("sig: This plugin is not supported - Enable 'exchndl' instead!\n");
+ return 0;
+ }
+ int sig_final() { return 0; }
+#elif defined (__NETBSD__) || defined (__FREEBSD__)
+ int sig_init() {
+ ShowError("sig: This plugin is not supported!\n");
+ return 0;
+ }
+ int sig_final() { return 0; }
+#else
+
+//////////////////////////////////////
+
+#if !defined(CYGWIN)
+ #include <execinfo.h>
+#endif
+
+const char* (*getrevision)();
+unsigned long (*getuptime)();
+char *server_name;
+int crash_flag = 0;
+
+extern const char *strsignal(int);
+int sig_final ();
+
+// by Gabuzomeu
+// This is an implementation of signal() using sigaction() for portability.
+// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
+// Programming in the UNIX Environment_.
+//
+#ifdef WIN32 // windows don't have SIGPIPE
+#define SIGPIPE SIGINT
+#endif
+
+#ifndef POSIX
+#define compat_signal(signo, func) signal(signo, func)
+#else
+sigfunc *compat_signal(int signo, sigfunc *func)
+{
+ struct sigaction sact, oact;
+
+ sact.sa_handler = func;
+ sigemptyset(&sact.sa_mask);
+ sact.sa_flags = 0;
+#ifdef SA_INTERRUPT
+ sact.sa_flags |= SA_INTERRUPT; /* SunOS */
+#endif
+
+ if (sigaction(signo, &sact, &oact) < 0)
+ return (SIG_ERR);
+
+ return (oact.sa_handler);
+}
+#endif
+
+/*=========================================
+ * Dumps the stack using glibc's backtrace
+ *-----------------------------------------
+ */
+#ifdef CYGWIN
+ #define FOPEN_ freopen
+ extern void cygwin_stackdump();
+#else
+ #define FOPEN_(fn,m,s) fopen(fn,m)
+#endif
+void sig_dump(int sn)
+{
+ FILE *fp;
+ char file[256];
+ int no = 0;
+
+ crash_flag = 1;
+ // search for a usable filename
+ do {
+ sprintf (file, "log/%s%04d.stackdump", server_name, ++no);
+ } while((fp = fopen(file,"r")) && (fclose(fp), no < 9999));
+ // dump the trace into the file
+
+ if ((fp = FOPEN_(file, "w", stderr)) != NULL) {
+ const char *revision;
+ #ifndef CYGWIN
+ void* array[20];
+ char **stack;
+ size_t size;
+ #endif
+
+ ShowNotice ("Dumping stack to '"CL_WHITE"%s"CL_RESET"'...\n", file);
+ if ((revision = getrevision()) != NULL)
+ fprintf(fp, "Version: svn%s \n", revision);
+ else
+ fprintf(fp, "Version: %2d.%02d.%02d mod%02d \n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION, ATHENA_MOD_VERSION);
+ fprintf(fp, "Exception: %s \n", strsignal(sn));
+ fflush (fp);
+
+ #ifdef CYGWIN
+ cygwin_stackdump ();
+ #else
+ fprintf(fp, "Stack trace:\n");
+ size = backtrace (array, 20);
+ stack = backtrace_symbols (array, size);
+ for (no = 0; no < size; no++) {
+ fprintf(fp, "%s\n", stack[no]);
+ }
+ fprintf(fp,"End of stack trace\n");
+ free(stack);
+ #endif
+
+ ShowNotice("%s Saved.\n", file);
+ fflush(stdout);
+ fclose(fp);
+ }
+
+ sig_final(); // Log our uptime
+ // Pass the signal to the system's default handler
+ compat_signal(sn, SIG_DFL);
+ raise(sn);
+}
+
+/*=========================================
+ * Shutting down (Program did not crash ^^)
+ * - Log our current up time
+ *-----------------------------------------
+ */
+int sig_final ()
+{
+ time_t curtime;
+ char curtime2[24];
+ FILE *fp;
+ long seconds = 0, day = 24*60*60, hour = 60*60,
+ minute = 60, days = 0, hours = 0, minutes = 0;
+
+ fp = fopen("log/uptime.log","a");
+ if (fp) {
+ time(&curtime);
+ strftime(curtime2, 24, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
+
+ seconds = getuptime();
+ days = seconds/day;
+ seconds -= (seconds/day>0)?(seconds/day)*day:0;
+ hours = seconds/hour;
+ seconds -= (seconds/hour>0)?(seconds/hour)*hour:0;
+ minutes = seconds/minute;
+ seconds -= (seconds/minute>0)?(seconds/minute)*minute:0;
+
+ fprintf(fp, "%s: %s %s - %ld days, %ld hours, %ld minutes, %ld seconds.\n",
+ curtime2, server_name, (crash_flag ? "crashed" : "uptime"),
+ days, hours, minutes, seconds);
+ fclose(fp);
+ }
+
+ return 1;
+}
+
+/*=========================================
+ * Register the signal handlers
+ *-----------------------------------------
+ */
+int sig_init ()
+{
+ void (*func) = sig_dump;
+#ifdef CYGWIN // test if dumper is enabled
+ char *buf = getenv ("CYGWIN");
+ if (buf && strstr(buf, "error_start") != NULL)
+ func = SIG_DFL;
+#endif
+
+ IMPORT_SYMBOL(server_name, 1);
+ IMPORT_SYMBOL(getrevision, 6);
+ IMPORT_SYMBOL(getuptime, 11);
+
+ compat_signal(SIGSEGV, func);
+ compat_signal(SIGFPE, func);
+ compat_signal(SIGILL, func);
+ #ifndef __WIN32
+ compat_signal(SIGBUS, func);
+ #endif
+
+ return 1;
+}
+#endif
+
diff --git a/src/plugins/upnp.txt b/src/plugins/upnp.txt
index 32d0e75bf..d5d0d43ff 100644
--- a/src/plugins/upnp.txt
+++ b/src/plugins/upnp.txt
@@ -1,31 +1,31 @@
-//
-// UPnP Plugin Configuration
-//
-
-// Enable UPnP
-enable_upnp: 1
-
-// Remove mapped router ports when shutting down
-release_mappings: 1
-
-// Close opened firewall ports when shutting down
-close_ports: 1
-
-//
-// You can set these if necessary
-// login server port
-//login_port: 6900
-//
-// char server port
-//char_port: 6121
-//
-// map server port
-//map_port: 5121
-//
-// NAT IP address to map your ports to
-//nat_ip: 192.168.0.1
-
-
-// Note: This plugin only works on Windows XP or higher
-// For more info on UPnP try here:
+//
+// UPnP Plugin Configuration
+//
+
+// Enable UPnP
+enable_upnp: 1
+
+// Remove mapped router ports when shutting down
+release_mappings: 1
+
+// Close opened firewall ports when shutting down
+close_ports: 1
+
+//
+// You can set these if necessary
+// login server port
+//login_port: 6900
+//
+// char server port
+//char_port: 6121
+//
+// map server port
+//map_port: 5121
+//
+// NAT IP address to map your ports to
+//nat_ip: 192.168.0.1
+
+
+// Note: This plugin only works on Windows XP or higher
+// For more info on UPnP try here:
// http://www.google.com/search?q=what+is+upnp \ No newline at end of file
diff --git a/src/tool/adduser.c b/src/tool/adduser.c
index 800154997..b8f5d4718 100644
--- a/src/tool/adduser.c
+++ b/src/tool/adduser.c
@@ -1,100 +1,100 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-/*
- This program adds an user to account.txt
- Don't usr it When login-sever is working.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-char *account_txt = "../save/account.txt";
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
-
- for(i = 0; str[i]; i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
-
- return change;
-}
-
-int main(int argc, char *argv[]) {
-
- char username[24];
- char password[24];
- char sex[2];
-
- int next_id, id;
- char line[1024];
- FILE *FPaccin,*FPaccout;
-
- // Check to see if account.txt exists.
- printf("Checking if '%s' file exists...\n", account_txt);
- FPaccin = fopen(account_txt, "r");
- if (FPaccin == NULL) {
- printf("'%s' file not found!\n", account_txt);
- printf("Run the setup wizard please.\n");
- exit(0);
- }
-
- next_id = 2000000;
- while(fgets(line, sizeof(line)-1, FPaccin)) {
- if (line[0] == '/' && line[1] == '/') { continue; }
- if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
- if (next_id < id) {
- next_id = id;
- }
- } else {
- sscanf(line,"%i%[^ ]", &id);
- if (next_id <= id) {
- next_id = id +1;
- }
- }
- }
- close(FPaccin);
- printf("File exists.\n");
-
- printf("Don't create an account if the login-server is online!!!\n");
- printf("If the login-server is online, press ctrl+C now to stop this software.\n");
- printf("\n");
-
- strcpy(username, "");
- while (strlen(username) < 4 || strlen(username) > 23) {
- printf("Enter an username (4-23 characters): ");
- scanf("%s", &username);
- username[23] = 0;
- remove_control_chars(username);
- }
-
- strcpy(password, "");
- while (strlen(password) < 4 || strlen(password) > 23) {
- printf("Enter a password (4-23 characters): ");
- scanf("%s", &password);
- password[23] = 0;
- remove_control_chars(password);
- }
-
- strcpy(sex, "");
- while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
- printf("Enter a gender (M for male, F for female): ");
- scanf("%s", &sex);
- }
-
- FPaccout = fopen(account_txt, "r+");
- fseek(FPaccout, 0, SEEK_END);
- fprintf(FPaccout, "%i %s %s - %s -\r\n", next_id, username, password, sex);
- close(FPaccout);
-
- printf("Account added.\n");
-}
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+/*
+ This program adds an user to account.txt
+ Don't usr it When login-sever is working.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *account_txt = "../save/account.txt";
+
+//-----------------------------------------------------
+// Function to suppress control characters in a string.
+//-----------------------------------------------------
+int remove_control_chars(unsigned char *str) {
+ int i;
+ int change = 0;
+
+ for(i = 0; str[i]; i++) {
+ if (str[i] < 32) {
+ str[i] = '_';
+ change = 1;
+ }
+ }
+
+ return change;
+}
+
+int main(int argc, char *argv[]) {
+
+ char username[24];
+ char password[24];
+ char sex[2];
+
+ int next_id, id;
+ char line[1024];
+ FILE *FPaccin,*FPaccout;
+
+ // Check to see if account.txt exists.
+ printf("Checking if '%s' file exists...\n", account_txt);
+ FPaccin = fopen(account_txt, "r");
+ if (FPaccin == NULL) {
+ printf("'%s' file not found!\n", account_txt);
+ printf("Run the setup wizard please.\n");
+ exit(0);
+ }
+
+ next_id = 2000000;
+ while(fgets(line, sizeof(line)-1, FPaccin)) {
+ if (line[0] == '/' && line[1] == '/') { continue; }
+ if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
+ if (next_id < id) {
+ next_id = id;
+ }
+ } else {
+ sscanf(line,"%i%[^ ]", &id);
+ if (next_id <= id) {
+ next_id = id +1;
+ }
+ }
+ }
+ close(FPaccin);
+ printf("File exists.\n");
+
+ printf("Don't create an account if the login-server is online!!!\n");
+ printf("If the login-server is online, press ctrl+C now to stop this software.\n");
+ printf("\n");
+
+ strcpy(username, "");
+ while (strlen(username) < 4 || strlen(username) > 23) {
+ printf("Enter an username (4-23 characters): ");
+ scanf("%s", &username);
+ username[23] = 0;
+ remove_control_chars(username);
+ }
+
+ strcpy(password, "");
+ while (strlen(password) < 4 || strlen(password) > 23) {
+ printf("Enter a password (4-23 characters): ");
+ scanf("%s", &password);
+ password[23] = 0;
+ remove_control_chars(password);
+ }
+
+ strcpy(sex, "");
+ while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
+ printf("Enter a gender (M for male, F for female): ");
+ scanf("%s", &sex);
+ }
+
+ FPaccout = fopen(account_txt, "r+");
+ fseek(FPaccout, 0, SEEK_END);
+ fprintf(FPaccout, "%i %s %s - %s -\r\n", next_id, username, password, sex);
+ close(FPaccout);
+
+ printf("Account added.\n");
+}
diff --git a/src/tool/convert.c b/src/tool/convert.c
index 2e81bfedd..a71c8c4a6 100644
--- a/src/tool/convert.c
+++ b/src/tool/convert.c
@@ -1,299 +1,299 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#define RETCODE "\r\n"
-
-#define MAX_INVENTORY 100
-#define MAX_CART 100
-#define MAX_SKILL 350
-#define GLOBAL_REG_NUM 16
-
-struct item {
- int id;
- short nameid;
- short amount;
- short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-struct point{
- char map[16];
- short x,y;
-};
-struct skill {
- unsigned short id,lv,flag;
-};
-struct global_reg {
- char str[16];
- int value;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int base_exp,job_exp,zeny;
-
- short class;
- short status_point,skill_point;
- short hp,max_hp,sp,max_sp;
- short option,karma,manner;
- short hair,hair_color,clothes_color;
- int party_id,guild_id,pet_id;
-
- short weapon,shield;
- short head_top,head_mid,head_bottom;
-
- char name[24];
- unsigned char base_level,job_level;
- unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
-
- struct point last_point,save_point,memo_point[3];
- struct item inventory[MAX_INVENTORY],cart[MAX_CART];
- struct skill skill[MAX_SKILL];
- int global_reg_num;
- struct global_reg global_reg[GLOBAL_REG_NUM];
-};
-
-int mmo_char_tostr(char *str,struct mmo_charstatus *p)
-{
- int i;
- sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%s,%d,%d\t%s,%d,%d",
- p->char_id,p->account_id,p->char_num,p->name, //
- p->class,p->base_level,p->job_level,
- p->base_exp,p->job_exp,p->zeny,
- p->hp,p->max_hp,p->sp,p->max_sp,
- p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
- p->status_point,p->skill_point,
- p->option,p->karma,p->manner, //
- p->party_id,p->guild_id,p->pet_id,
- p->hair,p->hair_color,p->clothes_color,
- p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
- p->last_point.map,p->last_point.x,p->last_point.y, //
- p->save_point.map,p->save_point.x,p->save_point.y
- );
- strcat(str,"\t");
- for(i=0;i<3;i++)
- if(p->memo_point[i].map[0]){
- sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_INVENTORY;i++)
- if(p->inventory[i].nameid){
- sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
- p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
- p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_CART;i++)
- if(p->cart[i].nameid){
- sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
- p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
- p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_SKILL;i++)
- if(p->skill[i].id){
- sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
- }
- strcat(str,"\t");
- for(i=0;i<p->global_reg_num;i++)
- sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
- strcat(str,"\t");
- return 0;
-}
-
-int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
- &tmp_int[3],&tmp_int[4],&tmp_int[5],
- &tmp_int[6],&tmp_int[7],&tmp_int[8],
- &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
- &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
- &tmp_int[19],&tmp_int[20],
- &tmp_int[21],&tmp_int[22],&tmp_int[23], //
- &tmp_int[24],&tmp_int[25],
- &tmp_int[26],&tmp_int[27],&tmp_int[28],
- &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
- p->last_point.map,&tmp_int[34],&tmp_int[35], //
- p->save_point.map,&tmp_int[36],&tmp_int[37],&next
- );
- p->char_id=tmp_int[0];
- p->account_id=tmp_int[1];
- p->char_num=tmp_int[2];
- p->class=tmp_int[3];
- p->base_level=tmp_int[4];
- p->job_level=tmp_int[5];
- p->base_exp=tmp_int[6];
- p->job_exp=tmp_int[7];
- p->zeny=tmp_int[8];
- p->hp=tmp_int[9];
- p->max_hp=tmp_int[10];
- p->sp=tmp_int[11];
- p->max_sp=tmp_int[12];
- p->str=tmp_int[13];
- p->agi=tmp_int[14];
- p->vit=tmp_int[15];
- p->int_=tmp_int[16];
- p->dex=tmp_int[17];
- p->luk=tmp_int[18];
- p->status_point=tmp_int[19];
- p->skill_point=tmp_int[20];
- p->option=tmp_int[21];
- p->karma=tmp_int[22];
- p->manner=tmp_int[23];
- p->party_id=tmp_int[24];
- p->guild_id=tmp_int[25];
- p->pet_id=0;
- p->hair=tmp_int[26];
- p->hair_color=tmp_int[27];
- p->clothes_color=tmp_int[28];
- p->weapon=tmp_int[29];
- p->shield=tmp_int[30];
- p->head_top=tmp_int[31];
- p->head_mid=tmp_int[32];
- p->head_bottom=tmp_int[33];
- p->last_point.x=tmp_int[34];
- p->last_point.y=tmp_int[35];
- p->save_point.x=tmp_int[36];
- p->save_point.y=tmp_int[37];
- if(set!=41)
- return 0;
- if(str[next]=='\n' || str[next]=='\r')
- return 1; // V‹Kƒf[ƒ^
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
- if(set!=3)
- return 0;
- p->memo_point[i].x=tmp_int[0];
- p->memo_point[i].y=tmp_int[1];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
- &tmp_int[4],&tmp_int[5],&tmp_int[6],
- &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
- if(set!=11)
- return 0;
- p->inventory[i].id=tmp_int[0];
- p->inventory[i].nameid=tmp_int[1];
- p->inventory[i].amount=tmp_int[2];
- p->inventory[i].equip=tmp_int[3];
- p->inventory[i].identify=tmp_int[4];
- p->inventory[i].refine=tmp_int[5];
- p->inventory[i].attribute=tmp_int[6];
- p->inventory[i].card[0]=tmp_int[7];
- p->inventory[i].card[1]=tmp_int[8];
- p->inventory[i].card[2]=tmp_int[9];
- p->inventory[i].card[3]=tmp_int[10];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
- &tmp_int[4],&tmp_int[5],&tmp_int[6],
- &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
- if(set!=11)
- return 0;
- p->cart[i].id=tmp_int[0];
- p->cart[i].nameid=tmp_int[1];
- p->cart[i].amount=tmp_int[2];
- p->cart[i].equip=tmp_int[3];
- p->cart[i].identify=tmp_int[4];
- p->cart[i].refine=tmp_int[5];
- p->cart[i].attribute=tmp_int[6];
- p->cart[i].card[0]=tmp_int[7];
- p->cart[i].card[1]=tmp_int[8];
- p->cart[i].card[2]=tmp_int[9];
- p->cart[i].card[3]=tmp_int[10];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d%n",
- &tmp_int[0],&tmp_int[1],&len);
- if(set!=2)
- return 0;
- p->skill[tmp_int[0]].id=tmp_int[0];
- p->skill[tmp_int[0]].lv=tmp_int[1];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
- set=sscanf(str+next,"%[^,],%d%n",
- p->global_reg[i].str,&p->global_reg[i].value,&len);
- if(set!=2)
- return 0;
- next+=len;
- if(str[next]==' ')
- next++;
- }
- p->global_reg_num=i;
- return 1;
-}
-
-int mmo_char_convert(char *fname1,char *fname2)
-{
- char line[65536];
- int ret;
- struct mmo_charstatus char_dat;
- FILE *ifp,*ofp;
-
- ifp=fopen(fname1,"r");
- ofp=fopen(fname2,"w");
- if(ifp==NULL) {
- printf("file not found %s\n",fname1);
- return 0;
- }
- if(ofp==NULL) {
- printf("file open error %s\n",fname2);
- return 0;
- }
- while(fgets(line,65535,ifp)){
- memset(&char_dat,0,sizeof(struct mmo_charstatus));
- ret=mmo_char_fromstr(line,&char_dat);
- if(ret){
- mmo_char_tostr(line,&char_dat);
- fprintf(ofp,"%s" RETCODE,line);
- }
- }
- fcloseall();
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- if(argc < 3) {
- printf("Usage: convert <input filename> <output filename>\n");
- exit(0);
- }
- mmo_char_convert(argv[1],argv[2]);
-
- return 0;
-}
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define RETCODE "\r\n"
+
+#define MAX_INVENTORY 100
+#define MAX_CART 100
+#define MAX_SKILL 350
+#define GLOBAL_REG_NUM 16
+
+struct item {
+ int id;
+ short nameid;
+ short amount;
+ short equip;
+ char identify;
+ char refine;
+ char attribute;
+ short card[4];
+};
+struct point{
+ char map[16];
+ short x,y;
+};
+struct skill {
+ unsigned short id,lv,flag;
+};
+struct global_reg {
+ char str[16];
+ int value;
+};
+
+struct mmo_charstatus {
+ int char_id;
+ int account_id;
+ int base_exp,job_exp,zeny;
+
+ short class;
+ short status_point,skill_point;
+ short hp,max_hp,sp,max_sp;
+ short option,karma,manner;
+ short hair,hair_color,clothes_color;
+ int party_id,guild_id,pet_id;
+
+ short weapon,shield;
+ short head_top,head_mid,head_bottom;
+
+ char name[24];
+ unsigned char base_level,job_level;
+ unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
+
+ struct point last_point,save_point,memo_point[3];
+ struct item inventory[MAX_INVENTORY],cart[MAX_CART];
+ struct skill skill[MAX_SKILL];
+ int global_reg_num;
+ struct global_reg global_reg[GLOBAL_REG_NUM];
+};
+
+int mmo_char_tostr(char *str,struct mmo_charstatus *p)
+{
+ int i;
+ sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%s,%d,%d\t%s,%d,%d",
+ p->char_id,p->account_id,p->char_num,p->name, //
+ p->class,p->base_level,p->job_level,
+ p->base_exp,p->job_exp,p->zeny,
+ p->hp,p->max_hp,p->sp,p->max_sp,
+ p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
+ p->status_point,p->skill_point,
+ p->option,p->karma,p->manner, //
+ p->party_id,p->guild_id,p->pet_id,
+ p->hair,p->hair_color,p->clothes_color,
+ p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
+ p->last_point.map,p->last_point.x,p->last_point.y, //
+ p->save_point.map,p->save_point.x,p->save_point.y
+ );
+ strcat(str,"\t");
+ for(i=0;i<3;i++)
+ if(p->memo_point[i].map[0]){
+ sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
+ }
+ strcat(str,"\t");
+ for(i=0;i<MAX_INVENTORY;i++)
+ if(p->inventory[i].nameid){
+ sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
+ p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
+ p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
+ p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
+ }
+ strcat(str,"\t");
+ for(i=0;i<MAX_CART;i++)
+ if(p->cart[i].nameid){
+ sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
+ p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
+ p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
+ p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
+ }
+ strcat(str,"\t");
+ for(i=0;i<MAX_SKILL;i++)
+ if(p->skill[i].id){
+ sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
+ }
+ strcat(str,"\t");
+ for(i=0;i<p->global_reg_num;i++)
+ sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
+ strcat(str,"\t");
+ return 0;
+}
+
+int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
+{
+ int tmp_int[256];
+ int set,next,len,i;
+
+ set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+ "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%[^,],%d,%d\t%[^,],%d,%d%n",
+ &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
+ &tmp_int[3],&tmp_int[4],&tmp_int[5],
+ &tmp_int[6],&tmp_int[7],&tmp_int[8],
+ &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
+ &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
+ &tmp_int[19],&tmp_int[20],
+ &tmp_int[21],&tmp_int[22],&tmp_int[23], //
+ &tmp_int[24],&tmp_int[25],
+ &tmp_int[26],&tmp_int[27],&tmp_int[28],
+ &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
+ p->last_point.map,&tmp_int[34],&tmp_int[35], //
+ p->save_point.map,&tmp_int[36],&tmp_int[37],&next
+ );
+ p->char_id=tmp_int[0];
+ p->account_id=tmp_int[1];
+ p->char_num=tmp_int[2];
+ p->class=tmp_int[3];
+ p->base_level=tmp_int[4];
+ p->job_level=tmp_int[5];
+ p->base_exp=tmp_int[6];
+ p->job_exp=tmp_int[7];
+ p->zeny=tmp_int[8];
+ p->hp=tmp_int[9];
+ p->max_hp=tmp_int[10];
+ p->sp=tmp_int[11];
+ p->max_sp=tmp_int[12];
+ p->str=tmp_int[13];
+ p->agi=tmp_int[14];
+ p->vit=tmp_int[15];
+ p->int_=tmp_int[16];
+ p->dex=tmp_int[17];
+ p->luk=tmp_int[18];
+ p->status_point=tmp_int[19];
+ p->skill_point=tmp_int[20];
+ p->option=tmp_int[21];
+ p->karma=tmp_int[22];
+ p->manner=tmp_int[23];
+ p->party_id=tmp_int[24];
+ p->guild_id=tmp_int[25];
+ p->pet_id=0;
+ p->hair=tmp_int[26];
+ p->hair_color=tmp_int[27];
+ p->clothes_color=tmp_int[28];
+ p->weapon=tmp_int[29];
+ p->shield=tmp_int[30];
+ p->head_top=tmp_int[31];
+ p->head_mid=tmp_int[32];
+ p->head_bottom=tmp_int[33];
+ p->last_point.x=tmp_int[34];
+ p->last_point.y=tmp_int[35];
+ p->save_point.x=tmp_int[36];
+ p->save_point.y=tmp_int[37];
+ if(set!=41)
+ return 0;
+ if(str[next]=='\n' || str[next]=='\r')
+ return 1; // V‹Kƒf[ƒ^
+ next++;
+ for(i=0;str[next] && str[next]!='\t';i++){
+ set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
+ if(set!=3)
+ return 0;
+ p->memo_point[i].x=tmp_int[0];
+ p->memo_point[i].y=tmp_int[1];
+ next+=len;
+ if(str[next]==' ')
+ next++;
+ }
+ next++;
+ for(i=0;str[next] && str[next]!='\t';i++){
+ set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
+ &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
+ &tmp_int[4],&tmp_int[5],&tmp_int[6],
+ &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
+ if(set!=11)
+ return 0;
+ p->inventory[i].id=tmp_int[0];
+ p->inventory[i].nameid=tmp_int[1];
+ p->inventory[i].amount=tmp_int[2];
+ p->inventory[i].equip=tmp_int[3];
+ p->inventory[i].identify=tmp_int[4];
+ p->inventory[i].refine=tmp_int[5];
+ p->inventory[i].attribute=tmp_int[6];
+ p->inventory[i].card[0]=tmp_int[7];
+ p->inventory[i].card[1]=tmp_int[8];
+ p->inventory[i].card[2]=tmp_int[9];
+ p->inventory[i].card[3]=tmp_int[10];
+ next+=len;
+ if(str[next]==' ')
+ next++;
+ }
+ next++;
+ for(i=0;str[next] && str[next]!='\t';i++){
+ set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
+ &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
+ &tmp_int[4],&tmp_int[5],&tmp_int[6],
+ &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
+ if(set!=11)
+ return 0;
+ p->cart[i].id=tmp_int[0];
+ p->cart[i].nameid=tmp_int[1];
+ p->cart[i].amount=tmp_int[2];
+ p->cart[i].equip=tmp_int[3];
+ p->cart[i].identify=tmp_int[4];
+ p->cart[i].refine=tmp_int[5];
+ p->cart[i].attribute=tmp_int[6];
+ p->cart[i].card[0]=tmp_int[7];
+ p->cart[i].card[1]=tmp_int[8];
+ p->cart[i].card[2]=tmp_int[9];
+ p->cart[i].card[3]=tmp_int[10];
+ next+=len;
+ if(str[next]==' ')
+ next++;
+ }
+ next++;
+ for(i=0;str[next] && str[next]!='\t';i++){
+ set=sscanf(str+next,"%d,%d%n",
+ &tmp_int[0],&tmp_int[1],&len);
+ if(set!=2)
+ return 0;
+ p->skill[tmp_int[0]].id=tmp_int[0];
+ p->skill[tmp_int[0]].lv=tmp_int[1];
+ next+=len;
+ if(str[next]==' ')
+ next++;
+ }
+ next++;
+ for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
+ set=sscanf(str+next,"%[^,],%d%n",
+ p->global_reg[i].str,&p->global_reg[i].value,&len);
+ if(set!=2)
+ return 0;
+ next+=len;
+ if(str[next]==' ')
+ next++;
+ }
+ p->global_reg_num=i;
+ return 1;
+}
+
+int mmo_char_convert(char *fname1,char *fname2)
+{
+ char line[65536];
+ int ret;
+ struct mmo_charstatus char_dat;
+ FILE *ifp,*ofp;
+
+ ifp=fopen(fname1,"r");
+ ofp=fopen(fname2,"w");
+ if(ifp==NULL) {
+ printf("file not found %s\n",fname1);
+ return 0;
+ }
+ if(ofp==NULL) {
+ printf("file open error %s\n",fname2);
+ return 0;
+ }
+ while(fgets(line,65535,ifp)){
+ memset(&char_dat,0,sizeof(struct mmo_charstatus));
+ ret=mmo_char_fromstr(line,&char_dat);
+ if(ret){
+ mmo_char_tostr(line,&char_dat);
+ fprintf(ofp,"%s" RETCODE,line);
+ }
+ }
+ fcloseall();
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ if(argc < 3) {
+ printf("Usage: convert <input filename> <output filename>\n");
+ exit(0);
+ }
+ mmo_char_convert(argv[1],argv[2]);
+
+ return 0;
+}
diff --git a/src/txt-converter/char-converter.c b/src/txt-converter/char-converter.c
index 4d435b4d1..29d1c393f 100644
--- a/src/txt-converter/char-converter.c
+++ b/src/txt-converter/char-converter.c
@@ -1,281 +1,281 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/core.h"
-#include "../common/strlib.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/mapindex.h"
-
-#include "../char/char.h"
-#include "../char/int_storage.h"
-#include "../char/int_pet.h"
-#include "../char/int_party.h"
-#include "../char/int_guild.h"
-#include "../char/inter.h"
-
-#include "../char_sql/char.h"
-#include "../char_sql/int_storage.h"
-#include "../char_sql/int_pet.h"
-#include "../char_sql/int_party.h"
-#include "../char_sql/int_guild.h"
-#include "../char_sql/inter.h"
-
-char t_name[256];
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-#define SQL_CONF_NAME "conf/inter_athena.conf"
-#define INTER_CONF_NAME "conf/inter_athena.conf"
-//--------------------------------------------------------
-int convert_init(void){
- char line[65536];
- int ret;
- int set,tmp_int[2], lineno, count;
- char input;
- FILE *fp;
-
- ShowWarning("Make sure you backup your databases before continuing!\n");
- printf("\n");
- ShowNotice("Do you wish to convert your Character Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y'){
- struct character_data char_dat;
- struct accreg reg;
-
- ShowStatus("Converting Character Database...\n");
- fp = fopen(char_txt, "r");
- memset (&char_dat, 0, sizeof(struct character_data));
- if(fp==NULL) {
- ShowError("Unable to open file [%s]!\n", char_txt);
- return 0;
- }
- lineno = count = 0;
- while(fgets(line, 65535, fp)){
- lineno++;
- memset(&char_dat, 0, sizeof(char_dat));
- ret=mmo_char_fromstr(line, &char_dat.status, char_dat.global, &char_dat.global_num);
- if(ret > 0){
- count++;
- parse_friend_txt(&char_dat.status); //Retrieve friends.
- mmo_char_tosql(char_dat.status.char_id , &char_dat.status);
-
- memset(&reg, 0, sizeof(reg));
- reg.account_id = char_dat.status.account_id;
- reg.char_id = char_dat.status.char_id;
- reg.reg_num = char_dat.global_num;
- memcpy(&reg.reg, &char_dat.global, reg.reg_num*sizeof(struct global_reg));
- inter_accreg_tosql(reg.account_id, reg.char_id, &reg, 3); //Type 3: Character regs
- } else {
- ShowError("Error %d converting character line [%s] (at %s:%d).\n", ret, line, char_txt, lineno);
- }
- }
- ShowStatus("Converted %d characters.\n", count);
- fclose(fp);
- ShowStatus("Converting Account variables Database...\n");
- if( (fp=fopen(accreg_txt,"r")) ==NULL )
- {
- ShowError("Unable to open file %s!", accreg_txt);
- return 1;
- }
- lineno=count=0;
- while(fgets(line, sizeof(line), fp)){
- lineno++;
- memset (&reg, 0, sizeof(struct accreg));
- if(inter_accreg_fromstr(line, &reg) == 0 && reg.account_id > 0) {
- count++;
- inter_accreg_tosql(reg.account_id, 0, &reg, 2); //Type 2: Account regs
- }else{
- ShowError("accreg reading: broken data [%s] at %s:%d\n", line, accreg_txt, lineno);
- }
- }
- ShowStatus("Converted %d account registries.\n", count);
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\n");
- ShowNotice("Do you wish to convert your Storage Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- struct storage storage_;
- printf("\n");
- ShowStatus("Converting Storage Database...\n");
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- ShowError("cant't read : %s\n",storage_txt);
- return 0;
- }
- lineno=count=0;
- while(fgets(line,65535,fp)){
- lineno++;
- set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
- if(set==2) {
- memset(&storage_, 0, sizeof(struct storage));
- storage_.account_id=tmp_int[0];
- if (storage_fromstr(line,&storage_) == 0) {
- count++;
- storage_tosql(storage_.account_id,&storage_); //to sql. (dump)
- } else {
- ShowError("Error parsing storage line [%s] (at %s:%d)\n", line, storage_txt, lineno);
- }
- }
- }
- ShowStatus("Converted %d storages.\n", count);
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\n");
- ShowNotice("Do you wish to convert your Pet Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- struct s_pet p;
- printf("\n");
- ShowStatus("Converting Pet Database...\n");
- if( (fp=fopen(pet_txt,"r")) ==NULL )
- {
- ShowError("Unable to open file %s!", pet_txt);
- return 1;
- }
- lineno=count=0;
- while(fgets(line, sizeof(line), fp)){
- lineno++;
- memset (&p, 0, sizeof(struct s_pet));
- if(inter_pet_fromstr(line, &p)==0 && p.pet_id>0){
- count++;
- inter_pet_tosql(p.pet_id,&p);
- }else{
- ShowError("pet reading: broken data [%s] at %s:%d\n", line, pet_txt, lineno);
- }
- }
- ShowStatus("Converted %d pets.\n", count);
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\n");
- ShowNotice("Do you wish to convert your Party Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- struct party p;
- printf("\n");
- ShowStatus("Converting Party Database...\n");
- if( (fp=fopen(party_txt,"r")) ==NULL )
- {
- ShowError("Unable to open file %s!", party_txt);
- return 1;
- }
- lineno=count=0;
- while(fgets(line, sizeof(line), fp)){
- lineno++;
- memset (&p, 0, sizeof(struct party));
- if(inter_party_fromstr(line, &p) == 0 &&
- p.party_id > 0 &&
- inter_party_tosql(&p, PS_CREATE, 0))
- count++;
- else{
- ShowError("party reading: broken data [%s] at %s:%d\n", line, pet_txt, lineno);
- }
- }
- ShowStatus("Converted %d parties.\n", count);
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\n");
- ShowNotice("Do you wish to convert your Guilds/Guild Castles Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- struct guild g;
- struct guild_castle gc;
- printf("\n");
- ShowStatus("Converting Guild Database...\n");
- if( (fp=fopen(guild_txt,"r")) ==NULL )
- {
- ShowError("Unable to open file %s!", guild_txt);
- return 1;
- }
- lineno=count=0;
- while(fgets(line, sizeof(line), fp)){
- lineno++;
- memset (&g, 0, sizeof(struct guild));
- if (inter_guild_fromstr(line, &g) == 0 &&
- g.guild_id > 0 &&
- inter_guild_tosql(&g,GS_MASK))
- count++;
- else
- ShowError("guild reading: broken data [%s] at %s:%d\n", line, guild_txt, lineno);
- }
- ShowStatus("Converted %d guilds.\n", count);
- fclose(fp);
- ShowStatus("Converting Guild Castles Database...\n");
- if( (fp=fopen(castle_txt,"r")) ==NULL )
- {
- ShowError("Unable to open file %s!", castle_txt);
- return 1;
- }
- lineno=count=0;
- while(fgets(line, sizeof(line), fp)){
- lineno++;
- memset (&gc, 0, sizeof(struct guild_castle));
- if (inter_guildcastle_fromstr(line, &gc) == 0) {
- inter_guildcastle_tosql(&gc);
- count++;
- }
- else
- ShowError("guild castle reading: broken data [%s] at %s:%d\n", line, castle_txt, lineno);
- }
- ShowStatus("Converted %d guild castles.\n", count);
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\n");
- ShowNotice("Do you wish to convert your Guild Storage Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- struct guild_storage storage_;
- printf("\n");
- ShowStatus("Converting Guild Storage Database...\n");
- fp=fopen(guild_storage_txt,"r");
- if(fp==NULL){
- ShowError("cant't read : %s\n",guild_storage_txt);
- return 0;
- }
- lineno=count=0;
- while(fgets(line,65535,fp)){
- lineno++;
- memset(&storage_, 0, sizeof(struct guild_storage));
- if (sscanf(line,"%d",&storage_.guild_id) == 1 &&
- storage_.guild_id > 0 &&
- guild_storage_fromstr(line,&storage_) == 0
- ) {
- count++;
- guild_storage_tosql(storage_.guild_id, &storage_);
- } else
- ShowError("Error parsing guild storage line [%s] (at %s:%d)\n", line, guild_storage_txt, lineno);
- }
- ShowStatus("Converted %d guild storages.\n", count);
- fclose(fp);
- }
- return 0;
-}
-
-int do_init(int argc, char **argv){
-
- char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME);
- mapindex_init();
- sql_config_read((argc>2)?argv[2]:SQL_CONF_NAME);
- inter_init_txt((argc > 3) ? argv[3] :INTER_CONF_NAME);
- inter_init_sql((argc > 3) ? argv[3] :INTER_CONF_NAME);
- convert_init();
- ShowStatus("Everything's been converted!\n");
- mapindex_final();
- exit (0);
-}
-
-void do_final () {}
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../common/core.h"
+#include "../common/strlib.h"
+#include "../common/mmo.h"
+#include "../common/showmsg.h"
+#include "../common/mapindex.h"
+
+#include "../char/char.h"
+#include "../char/int_storage.h"
+#include "../char/int_pet.h"
+#include "../char/int_party.h"
+#include "../char/int_guild.h"
+#include "../char/inter.h"
+
+#include "../char_sql/char.h"
+#include "../char_sql/int_storage.h"
+#include "../char_sql/int_pet.h"
+#include "../char_sql/int_party.h"
+#include "../char_sql/int_guild.h"
+#include "../char_sql/inter.h"
+
+char t_name[256];
+
+#define CHAR_CONF_NAME "conf/char_athena.conf"
+#define SQL_CONF_NAME "conf/inter_athena.conf"
+#define INTER_CONF_NAME "conf/inter_athena.conf"
+//--------------------------------------------------------
+int convert_init(void){
+ char line[65536];
+ int ret;
+ int set,tmp_int[2], lineno, count;
+ char input;
+ FILE *fp;
+
+ ShowWarning("Make sure you backup your databases before continuing!\n");
+ printf("\n");
+ ShowNotice("Do you wish to convert your Character Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y'){
+ struct character_data char_dat;
+ struct accreg reg;
+
+ ShowStatus("Converting Character Database...\n");
+ fp = fopen(char_txt, "r");
+ memset (&char_dat, 0, sizeof(struct character_data));
+ if(fp==NULL) {
+ ShowError("Unable to open file [%s]!\n", char_txt);
+ return 0;
+ }
+ lineno = count = 0;
+ while(fgets(line, 65535, fp)){
+ lineno++;
+ memset(&char_dat, 0, sizeof(char_dat));
+ ret=mmo_char_fromstr(line, &char_dat.status, char_dat.global, &char_dat.global_num);
+ if(ret > 0){
+ count++;
+ parse_friend_txt(&char_dat.status); //Retrieve friends.
+ mmo_char_tosql(char_dat.status.char_id , &char_dat.status);
+
+ memset(&reg, 0, sizeof(reg));
+ reg.account_id = char_dat.status.account_id;
+ reg.char_id = char_dat.status.char_id;
+ reg.reg_num = char_dat.global_num;
+ memcpy(&reg.reg, &char_dat.global, reg.reg_num*sizeof(struct global_reg));
+ inter_accreg_tosql(reg.account_id, reg.char_id, &reg, 3); //Type 3: Character regs
+ } else {
+ ShowError("Error %d converting character line [%s] (at %s:%d).\n", ret, line, char_txt, lineno);
+ }
+ }
+ ShowStatus("Converted %d characters.\n", count);
+ fclose(fp);
+ ShowStatus("Converting Account variables Database...\n");
+ if( (fp=fopen(accreg_txt,"r")) ==NULL )
+ {
+ ShowError("Unable to open file %s!", accreg_txt);
+ return 1;
+ }
+ lineno=count=0;
+ while(fgets(line, sizeof(line), fp)){
+ lineno++;
+ memset (&reg, 0, sizeof(struct accreg));
+ if(inter_accreg_fromstr(line, &reg) == 0 && reg.account_id > 0) {
+ count++;
+ inter_accreg_tosql(reg.account_id, 0, &reg, 2); //Type 2: Account regs
+ }else{
+ ShowError("accreg reading: broken data [%s] at %s:%d\n", line, accreg_txt, lineno);
+ }
+ }
+ ShowStatus("Converted %d account registries.\n", count);
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\n");
+ ShowNotice("Do you wish to convert your Storage Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ struct storage storage_;
+ printf("\n");
+ ShowStatus("Converting Storage Database...\n");
+ fp=fopen(storage_txt,"r");
+ if(fp==NULL){
+ ShowError("cant't read : %s\n",storage_txt);
+ return 0;
+ }
+ lineno=count=0;
+ while(fgets(line,65535,fp)){
+ lineno++;
+ set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
+ if(set==2) {
+ memset(&storage_, 0, sizeof(struct storage));
+ storage_.account_id=tmp_int[0];
+ if (storage_fromstr(line,&storage_) == 0) {
+ count++;
+ storage_tosql(storage_.account_id,&storage_); //to sql. (dump)
+ } else {
+ ShowError("Error parsing storage line [%s] (at %s:%d)\n", line, storage_txt, lineno);
+ }
+ }
+ }
+ ShowStatus("Converted %d storages.\n", count);
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\n");
+ ShowNotice("Do you wish to convert your Pet Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ struct s_pet p;
+ printf("\n");
+ ShowStatus("Converting Pet Database...\n");
+ if( (fp=fopen(pet_txt,"r")) ==NULL )
+ {
+ ShowError("Unable to open file %s!", pet_txt);
+ return 1;
+ }
+ lineno=count=0;
+ while(fgets(line, sizeof(line), fp)){
+ lineno++;
+ memset (&p, 0, sizeof(struct s_pet));
+ if(inter_pet_fromstr(line, &p)==0 && p.pet_id>0){
+ count++;
+ inter_pet_tosql(p.pet_id,&p);
+ }else{
+ ShowError("pet reading: broken data [%s] at %s:%d\n", line, pet_txt, lineno);
+ }
+ }
+ ShowStatus("Converted %d pets.\n", count);
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\n");
+ ShowNotice("Do you wish to convert your Party Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ struct party p;
+ printf("\n");
+ ShowStatus("Converting Party Database...\n");
+ if( (fp=fopen(party_txt,"r")) ==NULL )
+ {
+ ShowError("Unable to open file %s!", party_txt);
+ return 1;
+ }
+ lineno=count=0;
+ while(fgets(line, sizeof(line), fp)){
+ lineno++;
+ memset (&p, 0, sizeof(struct party));
+ if(inter_party_fromstr(line, &p) == 0 &&
+ p.party_id > 0 &&
+ inter_party_tosql(&p, PS_CREATE, 0))
+ count++;
+ else{
+ ShowError("party reading: broken data [%s] at %s:%d\n", line, pet_txt, lineno);
+ }
+ }
+ ShowStatus("Converted %d parties.\n", count);
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\n");
+ ShowNotice("Do you wish to convert your Guilds/Guild Castles Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ struct guild g;
+ struct guild_castle gc;
+ printf("\n");
+ ShowStatus("Converting Guild Database...\n");
+ if( (fp=fopen(guild_txt,"r")) ==NULL )
+ {
+ ShowError("Unable to open file %s!", guild_txt);
+ return 1;
+ }
+ lineno=count=0;
+ while(fgets(line, sizeof(line), fp)){
+ lineno++;
+ memset (&g, 0, sizeof(struct guild));
+ if (inter_guild_fromstr(line, &g) == 0 &&
+ g.guild_id > 0 &&
+ inter_guild_tosql(&g,GS_MASK))
+ count++;
+ else
+ ShowError("guild reading: broken data [%s] at %s:%d\n", line, guild_txt, lineno);
+ }
+ ShowStatus("Converted %d guilds.\n", count);
+ fclose(fp);
+ ShowStatus("Converting Guild Castles Database...\n");
+ if( (fp=fopen(castle_txt,"r")) ==NULL )
+ {
+ ShowError("Unable to open file %s!", castle_txt);
+ return 1;
+ }
+ lineno=count=0;
+ while(fgets(line, sizeof(line), fp)){
+ lineno++;
+ memset (&gc, 0, sizeof(struct guild_castle));
+ if (inter_guildcastle_fromstr(line, &gc) == 0) {
+ inter_guildcastle_tosql(&gc);
+ count++;
+ }
+ else
+ ShowError("guild castle reading: broken data [%s] at %s:%d\n", line, castle_txt, lineno);
+ }
+ ShowStatus("Converted %d guild castles.\n", count);
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\n");
+ ShowNotice("Do you wish to convert your Guild Storage Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ struct guild_storage storage_;
+ printf("\n");
+ ShowStatus("Converting Guild Storage Database...\n");
+ fp=fopen(guild_storage_txt,"r");
+ if(fp==NULL){
+ ShowError("cant't read : %s\n",guild_storage_txt);
+ return 0;
+ }
+ lineno=count=0;
+ while(fgets(line,65535,fp)){
+ lineno++;
+ memset(&storage_, 0, sizeof(struct guild_storage));
+ if (sscanf(line,"%d",&storage_.guild_id) == 1 &&
+ storage_.guild_id > 0 &&
+ guild_storage_fromstr(line,&storage_) == 0
+ ) {
+ count++;
+ guild_storage_tosql(storage_.guild_id, &storage_);
+ } else
+ ShowError("Error parsing guild storage line [%s] (at %s:%d)\n", line, guild_storage_txt, lineno);
+ }
+ ShowStatus("Converted %d guild storages.\n", count);
+ fclose(fp);
+ }
+ return 0;
+}
+
+int do_init(int argc, char **argv){
+
+ char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME);
+ mapindex_init();
+ sql_config_read((argc>2)?argv[2]:SQL_CONF_NAME);
+ inter_init_txt((argc > 3) ? argv[3] :INTER_CONF_NAME);
+ inter_init_sql((argc > 3) ? argv[3] :INTER_CONF_NAME);
+ convert_init();
+ ShowStatus("Everything's been converted!\n");
+ mapindex_final();
+ exit (0);
+}
+
+void do_final () {}
diff --git a/src/txt-converter/login-converter.c b/src/txt-converter/login-converter.c
index 667b331e3..ab236d322 100644
--- a/src/txt-converter/login-converter.c
+++ b/src/txt-converter/login-converter.c
@@ -1,228 +1,228 @@
-// (c) eAthena Dev Team - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <my_global.h>
-#include <mysql.h>
-
-#include "../common/core.h"
-#include "../common/db.h"
-#include "../common/mmo.h"
-
-struct auth_dat_ {
- int account_id, sex;
- char userid[24], pass[24], lastlogin[24];
- int logincount;
- int state; // packet 0x006a value + 1 (0: compte OK)
- char email[40]; // e-mail (by default: a@a.com)
- char error_message[20]; // Message of error code #6 = You are Prohibited to log in until %s (packet 0x006a)
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- char last_ip[16]; // save of last IP of connection
- char memo[255]; // a memo field
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-} *auth_dat;
-
-char login_account_id[256]="account_id";
-char login_userid[256]="userid";
-char login_user_pass[256]="user_pass";
-char login_db[256]="login";
-
-static struct dbt *gm_account_db;
-
-int db_server_port = 3306;
-char db_server_ip[16] = "127.0.0.1";
-char db_server_id[32] = "ragnarok";
-char db_server_pw[32] = "ragnarok";
-char db_server_logindb[32] = "ragnarok";
-
-#define INTER_CONF_NAME "conf/inter_athena.conf"
-
-int isGM(int account_id)
-{
- struct gm_account *p;
- p = idb_get(gm_account_db,account_id);
- if( p == NULL)
- return 0;
- return p->level;
-}
-
-int read_gm_account()
-{
- char line[8192];
- struct gm_account *p;
- FILE *fp;
- int c=0;
-
- gm_account_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
-
- printf("Starting reading gm_account\n");
-
- if( (fp=fopen("conf/GM_account.txt","r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- if(line[0] == '/' || line[1] == '/' || line[2] == '/')
- continue;
-
- p = (struct gm_account*)malloc(sizeof(struct gm_account));
- if(p==NULL){
- printf("gm_account: out of memory!\n");
- exit(0);
- }
-
- if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) {
- printf("gm_account: broken data [conf/GM_account.txt] line %d\n",c);
- continue;
- }
- else {
- if(p->level > 99)
- p->level = 99;
- idb_put(gm_account_db,p->account_id,p);
- c++;
- printf("GM ID: %d Level: %d\n",p->account_id,p->level);
- }
- }
- fclose(fp);
- printf("%d ID of gm_accounts read.\n",c);
- return 0;
-}
-
-int mmo_auth_init(void)
-{
- MYSQL mysql_handle;
- char tmpsql[1024];
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row ;
- FILE *fp;
- int account_id, logincount, user_level, state, n, i;
- char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
- time_t ban_until_time;
- time_t connect_until_time;
- char t_uid[256];
-
- mysql_init(&mysql_handle);
- if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw,
- db_server_logindb ,db_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
- else {
- printf ("Connect: Success!\n");
- }
- printf ("Convert start...\n");
-
-
- fp=fopen("save/account.txt","r");
- auth_dat = (struct auth_dat_*)malloc(sizeof(auth_dat[0])*256);
- if(fp==NULL)
- return 0;
- while(fgets(line,1023,fp)!=NULL){
-
- if(line[0]=='/' && line[1]=='/')
- continue;
-
- i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n);
-
- sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`"
- " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, login_user_pass, login_db, login_userid, t_uid);
-
- if(mysql_query(&mysql_handle, tmpsql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- user_level = isGM(account_id);
- printf ("userlevel: %s (%d)- %d\n",userid, account_id, user_level);
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) //no row -> insert
- sprintf(tmpsql, "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);",account_id , userid, pass,lastlogin,sex,logincount, user_level);
- else //row reside -> updating
- sprintf(tmpsql, "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';",account_id , userid, pass,lastlogin,sex,logincount, user_level, account_id);
- printf ("Query: %s\n",tmpsql);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmpsql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- }
- fclose(fp);
-
- printf ("Convert end...\n");
-
- return 0;
-}
-
-int login_config_read(const char *cfgName){
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("Start reading interserver configuration: %s\n",cfgName);
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("File not found: %s\n", cfgName);
- return 1;
- }
-
- while(fgets(line, 1020, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]:%s", w1, w2);
- if(i!=2)
- continue;
-
- //add for DB connection
- if(strcmpi(w1,"db_server_ip")==0){
- strcpy(db_server_ip, w2);
- printf ("set db_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_port")==0){
- db_server_port=atoi(w2);
- printf ("set db_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_id")==0){
- strcpy(db_server_id, w2);
- printf ("set db_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_pw")==0){
- strcpy(db_server_pw, w2);
- printf ("set db_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_logindb")==0){
- strcpy(db_server_logindb, w2);
- printf ("set db_server_logindb : %s\n",w2);
- }
- //support the import command, just like any other config
- else if(strcmpi(w1,"import")==0){
- login_config_read(w2);
- }
- }
- fclose(fp);
- printf ("End reading interserver configuration...\n");
- return 0;
-}
-
-int do_init(int argc,char **argv)
-{
- char input;
- login_config_read( (argc>1)?argv[1]:INTER_CONF_NAME );
- read_gm_account();
-
- printf("\nWarning : Make sure you backup your databases before continuing!\n");
- printf("\nDo you wish to convert your Login Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y')
- mmo_auth_init();
- printf ("Everything's been converted!\n");
- exit (0);
-}
-
-
-void do_final() {}
+// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <my_global.h>
+#include <mysql.h>
+
+#include "../common/core.h"
+#include "../common/db.h"
+#include "../common/mmo.h"
+
+struct auth_dat_ {
+ int account_id, sex;
+ char userid[24], pass[24], lastlogin[24];
+ int logincount;
+ int state; // packet 0x006a value + 1 (0: compte OK)
+ char email[40]; // e-mail (by default: a@a.com)
+ char error_message[20]; // Message of error code #6 = You are Prohibited to log in until %s (packet 0x006a)
+ time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
+ time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
+ char last_ip[16]; // save of last IP of connection
+ char memo[255]; // a memo field
+ int account_reg2_num;
+ struct global_reg account_reg2[ACCOUNT_REG2_NUM];
+} *auth_dat;
+
+char login_account_id[256]="account_id";
+char login_userid[256]="userid";
+char login_user_pass[256]="user_pass";
+char login_db[256]="login";
+
+static struct dbt *gm_account_db;
+
+int db_server_port = 3306;
+char db_server_ip[16] = "127.0.0.1";
+char db_server_id[32] = "ragnarok";
+char db_server_pw[32] = "ragnarok";
+char db_server_logindb[32] = "ragnarok";
+
+#define INTER_CONF_NAME "conf/inter_athena.conf"
+
+int isGM(int account_id)
+{
+ struct gm_account *p;
+ p = idb_get(gm_account_db,account_id);
+ if( p == NULL)
+ return 0;
+ return p->level;
+}
+
+int read_gm_account()
+{
+ char line[8192];
+ struct gm_account *p;
+ FILE *fp;
+ int c=0;
+
+ gm_account_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+
+ printf("Starting reading gm_account\n");
+
+ if( (fp=fopen("conf/GM_account.txt","r"))==NULL )
+ return 1;
+ while(fgets(line,sizeof(line),fp)){
+ if(line[0] == '/' || line[1] == '/' || line[2] == '/')
+ continue;
+
+ p = (struct gm_account*)malloc(sizeof(struct gm_account));
+ if(p==NULL){
+ printf("gm_account: out of memory!\n");
+ exit(0);
+ }
+
+ if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) {
+ printf("gm_account: broken data [conf/GM_account.txt] line %d\n",c);
+ continue;
+ }
+ else {
+ if(p->level > 99)
+ p->level = 99;
+ idb_put(gm_account_db,p->account_id,p);
+ c++;
+ printf("GM ID: %d Level: %d\n",p->account_id,p->level);
+ }
+ }
+ fclose(fp);
+ printf("%d ID of gm_accounts read.\n",c);
+ return 0;
+}
+
+int mmo_auth_init(void)
+{
+ MYSQL mysql_handle;
+ char tmpsql[1024];
+ MYSQL_RES* sql_res ;
+ MYSQL_ROW sql_row ;
+ FILE *fp;
+ int account_id, logincount, user_level, state, n, i;
+ char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
+ time_t ban_until_time;
+ time_t connect_until_time;
+ char t_uid[256];
+
+ mysql_init(&mysql_handle);
+ if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw,
+ db_server_logindb ,db_server_port, (char *)NULL, 0)) {
+ //pointer check
+ printf("%s\n",mysql_error(&mysql_handle));
+ exit(1);
+ }
+ else {
+ printf ("Connect: Success!\n");
+ }
+ printf ("Convert start...\n");
+
+
+ fp=fopen("save/account.txt","r");
+ auth_dat = (struct auth_dat_*)malloc(sizeof(auth_dat[0])*256);
+ if(fp==NULL)
+ return 0;
+ while(fgets(line,1023,fp)!=NULL){
+
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+
+ i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
+ "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
+ &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
+ email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n);
+
+ sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`"
+ " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, login_user_pass, login_db, login_userid, t_uid);
+
+ if(mysql_query(&mysql_handle, tmpsql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ user_level = isGM(account_id);
+ printf ("userlevel: %s (%d)- %d\n",userid, account_id, user_level);
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+ if (!sql_row) //no row -> insert
+ sprintf(tmpsql, "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);",account_id , userid, pass,lastlogin,sex,logincount, user_level);
+ else //row reside -> updating
+ sprintf(tmpsql, "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';",account_id , userid, pass,lastlogin,sex,logincount, user_level, account_id);
+ printf ("Query: %s\n",tmpsql);
+ mysql_free_result(sql_res) ; //resource free
+ if(mysql_query(&mysql_handle, tmpsql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ fclose(fp);
+
+ printf ("Convert end...\n");
+
+ return 0;
+}
+
+int login_config_read(const char *cfgName){
+ int i;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ printf ("Start reading interserver configuration: %s\n",cfgName);
+
+ fp=fopen(cfgName,"r");
+ if(fp==NULL){
+ printf("File not found: %s\n", cfgName);
+ return 1;
+ }
+
+ while(fgets(line, 1020, fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ i=sscanf(line,"%[^:]:%s", w1, w2);
+ if(i!=2)
+ continue;
+
+ //add for DB connection
+ if(strcmpi(w1,"db_server_ip")==0){
+ strcpy(db_server_ip, w2);
+ printf ("set db_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"db_server_port")==0){
+ db_server_port=atoi(w2);
+ printf ("set db_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"db_server_id")==0){
+ strcpy(db_server_id, w2);
+ printf ("set db_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"db_server_pw")==0){
+ strcpy(db_server_pw, w2);
+ printf ("set db_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"db_server_logindb")==0){
+ strcpy(db_server_logindb, w2);
+ printf ("set db_server_logindb : %s\n",w2);
+ }
+ //support the import command, just like any other config
+ else if(strcmpi(w1,"import")==0){
+ login_config_read(w2);
+ }
+ }
+ fclose(fp);
+ printf ("End reading interserver configuration...\n");
+ return 0;
+}
+
+int do_init(int argc,char **argv)
+{
+ char input;
+ login_config_read( (argc>1)?argv[1]:INTER_CONF_NAME );
+ read_gm_account();
+
+ printf("\nWarning : Make sure you backup your databases before continuing!\n");
+ printf("\nDo you wish to convert your Login Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y')
+ mmo_auth_init();
+ printf ("Everything's been converted!\n");
+ exit (0);
+}
+
+
+void do_final() {}
diff --git a/src/webserver/doc/API.txt b/src/webserver/doc/API.txt
index 92f88c5e3..c80f7bd44 100644
--- a/src/webserver/doc/API.txt
+++ b/src/webserver/doc/API.txt
@@ -1,50 +1,50 @@
-Here's the webserver API, so you can work on the webserver.
-
-My personal goal is to make this interface simple, so that coding it
-will be like coding in some scripting language...
-
-
-
-char *get_param(char in_string[500], char swhat[500]);
-
-This function simply returns various data from the query string.
- *Pass get_param NOTHING longer than 500 in length!
-
- What do I pass where in_string is?
- The query string.
-
- What do I pass where swhat is?
- One of two things...
- Either 0 for the path of the 'page'
- or you can pass it the param you wish to lookup.
-
-
-
-
-
-
-char *get_query(char *inquery);
-
-This function simply returns a query string from the raw server request.
-This is used once in main, I doubt you'll need it.
-
-
-
-
-
-void web_send(int sockin, char *in_data);
-
-Super easy way of sending data to a webpage!
-Simply put in the socket name and then the data.
-
- Ex:
- web_send(socket, "I like cheese!\n");
-
-
-
-
-char *html_header(char* title);
-Easy way to print the eAthena header for the server.
-
- Ex:
- web_send(sockethere, html_header("About"));
+Here's the webserver API, so you can work on the webserver.
+
+My personal goal is to make this interface simple, so that coding it
+will be like coding in some scripting language...
+
+
+
+char *get_param(char in_string[500], char swhat[500]);
+
+This function simply returns various data from the query string.
+ *Pass get_param NOTHING longer than 500 in length!
+
+ What do I pass where in_string is?
+ The query string.
+
+ What do I pass where swhat is?
+ One of two things...
+ Either 0 for the path of the 'page'
+ or you can pass it the param you wish to lookup.
+
+
+
+
+
+
+char *get_query(char *inquery);
+
+This function simply returns a query string from the raw server request.
+This is used once in main, I doubt you'll need it.
+
+
+
+
+
+void web_send(int sockin, char *in_data);
+
+Super easy way of sending data to a webpage!
+Simply put in the socket name and then the data.
+
+ Ex:
+ web_send(socket, "I like cheese!\n");
+
+
+
+
+char *html_header(char* title);
+Easy way to print the eAthena header for the server.
+
+ Ex:
+ web_send(sockethere, html_header("About"));
diff --git a/src/webserver/generate.c b/src/webserver/generate.c
index 26d2c7492..ad050db4c 100644
--- a/src/webserver/generate.c
+++ b/src/webserver/generate.c
@@ -1,38 +1,38 @@
-
-void generate_page(char password[25], int sock_in, char *query, char *ip)
-{
- char *page = get_param(query, 0);
- char *ppass = get_param(query, "password");
-
-
- if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
- {
- web_send(sock_in, html_header("Enter your password"));
- web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n");
- web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n");
- web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n");
- }
- else
- {
-
-
- //To make this simple, we will have a bunch of if statements
- //that then shoot out data off into functions.
-
-
- //The 'index'
- if ( strcmp(page, "/") == 0 )
- generate_notdone(sock_in, query, ip);
-
-
- //About page:
- if ( strcmp(page, "/about.html") == 0 )
- generate_about(sock_in, query, ip);
-
-
- //Test page:
- if ( strcmp(page, "/testing/") == 0 )
- generate_sample(sock_in, query, ip);
-
- }
-}
+
+void generate_page(char password[25], int sock_in, char *query, char *ip)
+{
+ char *page = get_param(query, 0);
+ char *ppass = get_param(query, "password");
+
+
+ if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
+ {
+ web_send(sock_in, html_header("Enter your password"));
+ web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n");
+ web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n");
+ web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n");
+ }
+ else
+ {
+
+
+ //To make this simple, we will have a bunch of if statements
+ //that then shoot out data off into functions.
+
+
+ //The 'index'
+ if ( strcmp(page, "/") == 0 )
+ generate_notdone(sock_in, query, ip);
+
+
+ //About page:
+ if ( strcmp(page, "/about.html") == 0 )
+ generate_about(sock_in, query, ip);
+
+
+ //Test page:
+ if ( strcmp(page, "/testing/") == 0 )
+ generate_sample(sock_in, query, ip);
+
+ }
+}
diff --git a/src/webserver/htmlstyle.c b/src/webserver/htmlstyle.c
index a1320a385..c3a4b927a 100644
--- a/src/webserver/htmlstyle.c
+++ b/src/webserver/htmlstyle.c
@@ -1,51 +1,51 @@
-char output[10000];
-
-char *html_header(char *title)
-{
- memset(output, 0x0, 10000);
- char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n"
- "<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n"
- "align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n"
- "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n"
- "<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n"
- "<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n"
- "</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n"
- "cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n";
- "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n"
- "cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>"
- "<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">"
- "<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n"
- "To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n"
- "</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n"
- "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n"
- "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n"
- "cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n"
- "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n"
- "<b>Athena</b> &laquo; Portal &raquo;</font></td></tr></tbody></table></td></tr></tbody>"
- "</table></td></tr></tbody></table>\n";
-
- sprintf(output, "<title>%s</title>\n%s\n", title, text);
-
- return output;
-}
-
-
-
-char *html_start_form(char *location, char *action)
-{
- memset(output, 0x0, 10000);
- sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action);
- return output;
-
-
-}
-
-
-char *html_end_forum(void)
-{
- return "</form>";
-}
-
-
-
+char output[10000];
+
+char *html_header(char *title)
+{
+ memset(output, 0x0, 10000);
+ char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n"
+ "<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n"
+ "align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n"
+ "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n"
+ "<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n"
+ "<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n"
+ "<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n"
+ "</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n"
+ "cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n";
+ "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n"
+ "cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>"
+ "<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">"
+ "<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n"
+ "To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n"
+ "</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n"
+ "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n"
+ "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n"
+ "cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n"
+ "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n"
+ "<b>Athena</b> &laquo; Portal &raquo;</font></td></tr></tbody></table></td></tr></tbody>"
+ "</table></td></tr></tbody></table>\n";
+
+ sprintf(output, "<title>%s</title>\n%s\n", title, text);
+
+ return output;
+}
+
+
+
+char *html_start_form(char *location, char *action)
+{
+ memset(output, 0x0, 10000);
+ sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action);
+ return output;
+
+
+}
+
+
+char *html_end_forum(void)
+{
+ return "</form>";
+}
+
+
+
diff --git a/src/webserver/logs.c b/src/webserver/logs.c
index faa1abf80..405b4882b 100644
--- a/src/webserver/logs.c
+++ b/src/webserver/logs.c
@@ -1,8 +1,8 @@
-#include <time.h>
-
-void log_visit(char *query, char *ip)
-{
- time_t timer;
- timer=time(NULL);
- printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
-}
+#include <time.h>
+
+void log_visit(char *query, char *ip)
+{
+ time_t timer;
+ timer=time(NULL);
+ printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
+}
diff --git a/src/webserver/main.c b/src/webserver/main.c
index ac27c5e71..59362558e 100644
--- a/src/webserver/main.c
+++ b/src/webserver/main.c
@@ -1,142 +1,142 @@
-/***************************************************************************
- description
- -------------------
- author : (C) 2004 by Michael J. Flickinger
- email : mjflick@cpan.org
-
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * 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 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/wait.h>
-#include <signal.h>
-
-#define BLOG 10
-
-char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n";
-char recvin[500], password[25];
-int s_port;
-
-void sigchld_handler(int s)
-{
- while(wait(NULL) > 0);
-}
-
-int main(int argc, char **argv)
-{
- if (argc < 3)
- {
- printf("eAthena Web Server\n");
- printf("usage: %s [password] [port]\n", argv[0]);
- exit(0);
- }
-
- s_port = atoi(argv[2]);
-
- if ((s_port < 1) || (s_port > 65534))
- {
- printf("Error: The port you choose is not valid port.\n");
- exit(0);
- }
-
- if (strlen(argv[1]) > 25)
- {
- printf("Error: Your password is too long.\n");
- printf("It must be shorter than 25 characters.\n");
- exit(0);
- }
-
- memset(password, 0x0, 25);
- memcpy(password, argv[1], strlen(argv[1]));
-
- int sockfd, new_fd;
- struct sockaddr_in my_addr;
- struct sockaddr_in their_addr;
- int sin_size;
-
- struct sigaction sa;
-
- int yes=1;
-
- if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
- {
- perror("Darn, this is broken.");
- exit(0);
- }
-
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
- {
- perror("Error... :-(");
- }
-
- //Now we know we have a working socket. :-)
-
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(s_port);
- my_addr.sin_addr.s_addr = INADDR_ANY;
- memset(&(my_addr.sin_zero), '\0', 8);
-
- if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
- {
- perror("can not bind to this port");
- exit(0);
- }
-
- if ( listen(sockfd, BLOG) == -1)
- {
- perror("can not listen on port");
- exit(0);
- }
-
- sa.sa_handler = sigchld_handler;
-
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESTART;
-
- if (sigaction(SIGCHLD, &sa, NULL) == -1)
- {
- perror("sigaction sucks");
- exit(0);
- }
-
- printf("The eAthena webserver is up and listening on port %i.\n", s_port);
-
- while(1)
- {
- sin_size = sizeof(struct sockaddr_in);
- new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
-
- if (!fork())
- {
- close(sockfd);
- memset(recvin, 0x0, 500);
- recv(new_fd, recvin, 500, 0);
- send(new_fd, header, strlen(header), 0);
- generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
- log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
-
- close(new_fd);
- exit(0);
- }
- close(new_fd);
- }
-
- return 0;
-}
+/***************************************************************************
+ description
+ -------------------
+ author : (C) 2004 by Michael J. Flickinger
+ email : mjflick@cpan.org
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/wait.h>
+#include <signal.h>
+
+#define BLOG 10
+
+char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n";
+char recvin[500], password[25];
+int s_port;
+
+void sigchld_handler(int s)
+{
+ while(wait(NULL) > 0);
+}
+
+int main(int argc, char **argv)
+{
+ if (argc < 3)
+ {
+ printf("eAthena Web Server\n");
+ printf("usage: %s [password] [port]\n", argv[0]);
+ exit(0);
+ }
+
+ s_port = atoi(argv[2]);
+
+ if ((s_port < 1) || (s_port > 65534))
+ {
+ printf("Error: The port you choose is not valid port.\n");
+ exit(0);
+ }
+
+ if (strlen(argv[1]) > 25)
+ {
+ printf("Error: Your password is too long.\n");
+ printf("It must be shorter than 25 characters.\n");
+ exit(0);
+ }
+
+ memset(password, 0x0, 25);
+ memcpy(password, argv[1], strlen(argv[1]));
+
+ int sockfd, new_fd;
+ struct sockaddr_in my_addr;
+ struct sockaddr_in their_addr;
+ int sin_size;
+
+ struct sigaction sa;
+
+ int yes=1;
+
+ if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
+ {
+ perror("Darn, this is broken.");
+ exit(0);
+ }
+
+ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
+ {
+ perror("Error... :-(");
+ }
+
+ //Now we know we have a working socket. :-)
+
+ my_addr.sin_family = AF_INET;
+ my_addr.sin_port = htons(s_port);
+ my_addr.sin_addr.s_addr = INADDR_ANY;
+ memset(&(my_addr.sin_zero), '\0', 8);
+
+ if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
+ {
+ perror("can not bind to this port");
+ exit(0);
+ }
+
+ if ( listen(sockfd, BLOG) == -1)
+ {
+ perror("can not listen on port");
+ exit(0);
+ }
+
+ sa.sa_handler = sigchld_handler;
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+
+ if (sigaction(SIGCHLD, &sa, NULL) == -1)
+ {
+ perror("sigaction sucks");
+ exit(0);
+ }
+
+ printf("The eAthena webserver is up and listening on port %i.\n", s_port);
+
+ while(1)
+ {
+ sin_size = sizeof(struct sockaddr_in);
+ new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
+
+ if (!fork())
+ {
+ close(sockfd);
+ memset(recvin, 0x0, 500);
+ recv(new_fd, recvin, 500, 0);
+ send(new_fd, header, strlen(header), 0);
+ generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
+ log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
+
+ close(new_fd);
+ exit(0);
+ }
+ close(new_fd);
+ }
+
+ return 0;
+}
diff --git a/src/webserver/pages/about.c b/src/webserver/pages/about.c
index f1d94d1e0..2b0002ad8 100644
--- a/src/webserver/pages/about.c
+++ b/src/webserver/pages/about.c
@@ -1,6 +1,6 @@
-void generate_about(int sock_in, char *query, char *ip)
-{
-//printf("%s", html_header("About"));
- web_send(sock_in, html_header("About"));
- web_send(sock_in, "<center>eAthena Web Server!</center>\n");
-}
+void generate_about(int sock_in, char *query, char *ip)
+{
+//printf("%s", html_header("About"));
+ web_send(sock_in, html_header("About"));
+ web_send(sock_in, "<center>eAthena Web Server!</center>\n");
+}
diff --git a/src/webserver/pages/notdone.c b/src/webserver/pages/notdone.c
index 07abd33da..a6492e361 100644
--- a/src/webserver/pages/notdone.c
+++ b/src/webserver/pages/notdone.c
@@ -1,5 +1,5 @@
-void generate_notdone(int sock_in, char *query, char *ip)
-{
- web_send(sock_in, "<title>Not here!</title>\n");
- web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>");
-}
+void generate_notdone(int sock_in, char *query, char *ip)
+{
+ web_send(sock_in, "<title>Not here!</title>\n");
+ web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>");
+}
diff --git a/src/webserver/pages/sample.c b/src/webserver/pages/sample.c
index 7bec663f2..be900a1bf 100644
--- a/src/webserver/pages/sample.c
+++ b/src/webserver/pages/sample.c
@@ -1,24 +1,24 @@
-
-
-void generate_sample(int sock_in, char *query, char *ip)
-{
-
- char *name = get_param(query, "name");
-
- web_send(sock_in, "<title>SAMPLE</title>\n");
-
-
- //If a name was not entered...
- if ( name == '\0' )
- {
- web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n");
- web_send(sock_in, "<input type=\"text\" name=\"name\">\n");
- web_send(sock_in, "<input type=\"submit\">\n");
- }
- else
- {
- web_send(sock_in, "Your name is: ");
- web_send(sock_in, get_param(query, "name"));
- }
-printf("OK!\n");
-}
+
+
+void generate_sample(int sock_in, char *query, char *ip)
+{
+
+ char *name = get_param(query, "name");
+
+ web_send(sock_in, "<title>SAMPLE</title>\n");
+
+
+ //If a name was not entered...
+ if ( name == '\0' )
+ {
+ web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n");
+ web_send(sock_in, "<input type=\"text\" name=\"name\">\n");
+ web_send(sock_in, "<input type=\"submit\">\n");
+ }
+ else
+ {
+ web_send(sock_in, "Your name is: ");
+ web_send(sock_in, get_param(query, "name"));
+ }
+printf("OK!\n");
+}
diff --git a/src/webserver/parse.c b/src/webserver/parse.c
index 323261c6c..8e54a81de 100644
--- a/src/webserver/parse.c
+++ b/src/webserver/parse.c
@@ -1,135 +1,135 @@
-#include <stdlib.h>
-
-char filtered_query[2000];
-char rdata[500];
-char param_n[500];
-char param_d[500];
-
-
-char *get_query(char *inquery)
-{
- memset(filtered_query, 0x0, 2000);
- sscanf(inquery, "GET %s %[$]", filtered_query);
- return(filtered_query);
-}
-
-void web_send(int sockin, char *in_data)
-{
- send(sockin, in_data, strlen(in_data), 0);
-}
-
-
-//THIS IS BAD CODE BE CAREFULL WITH IT!
-//Watch out for buffer overflow...
-//When using please make sure to check the string size.
-
-//Also note:
-//I take no pride in this code, it is a really bad way of doing this...
-char *get_param(char in_string[500], char swhat[500])
-{
- int i = 0;
- int marker, iswitch, pint, dint;
- char flux[500];
- memset(flux, 0x0, 500);
-
- //Get the path of out "page"
- if (swhat == 0)
- {
- //while i is not equal to array size
- while (i != 500)
- {
- //if there is a question mark, halt!
- if (in_string[i] == '?')
- {
- i = 499;
- }
- else
- rdata[i] = in_string[i];
-
- i++;
- }
- return rdata;
- }
- else //so, we want a param...
- {
- //calculate where param begins
- while (i != 500)
- {
- if (in_string[i] == '?')
- {
- marker = i + 1;
- i = 499;
- }
- i++;
- }
-
- i = 0;
-
- //keep morons from trying to crash this
- if ((marker > 500)||(marker < 1))
- marker = 500;
-
- while(marker != 500)
- {
- if ((in_string[marker] != '&') && (in_string[marker] != '\0'))
- {
- flux[i] = in_string[marker];
- i++;
- }
- else
- {
-
- //we have a param, now we must dig through it
-
- //clear temp vars
- memset(param_n, 0x0, 500);
- memset(param_d, 0x0, 500);
- iswitch = 0;
- pint = 0;
- dint = 0;
- i = 0;
-
- //split result into param_n and param_d
- while(i != 500)
- {
- if ( (flux[i] != '=') && (flux[i] != '\0') )
- {
- if (iswitch == 0)
- {
- param_n[pint] = flux[i];
- pint++;
- }
- else
- {
- param_d[dint] = flux[i];
- dint++;
- }
- }
- else
- {
- iswitch = 1;
- }
- if (flux[i] == '\0')
- i = 499;
-
- i++;
- }
-
- if ( strcmp(param_n, swhat) == 0 )
- {
- return param_d;
- }
-
- i = 0;
- }
-
- if (in_string[marker] == '\0')
- {
- marker = 499;
- }
- marker++;
- }
- return 0;
- }
-}
-
+#include <stdlib.h>
+
+char filtered_query[2000];
+char rdata[500];
+char param_n[500];
+char param_d[500];
+
+
+char *get_query(char *inquery)
+{
+ memset(filtered_query, 0x0, 2000);
+ sscanf(inquery, "GET %s %[$]", filtered_query);
+ return(filtered_query);
+}
+
+void web_send(int sockin, char *in_data)
+{
+ send(sockin, in_data, strlen(in_data), 0);
+}
+
+
+//THIS IS BAD CODE BE CAREFULL WITH IT!
+//Watch out for buffer overflow...
+//When using please make sure to check the string size.
+
+//Also note:
+//I take no pride in this code, it is a really bad way of doing this...
+char *get_param(char in_string[500], char swhat[500])
+{
+ int i = 0;
+ int marker, iswitch, pint, dint;
+ char flux[500];
+ memset(flux, 0x0, 500);
+
+ //Get the path of out "page"
+ if (swhat == 0)
+ {
+ //while i is not equal to array size
+ while (i != 500)
+ {
+ //if there is a question mark, halt!
+ if (in_string[i] == '?')
+ {
+ i = 499;
+ }
+ else
+ rdata[i] = in_string[i];
+
+ i++;
+ }
+ return rdata;
+ }
+ else //so, we want a param...
+ {
+ //calculate where param begins
+ while (i != 500)
+ {
+ if (in_string[i] == '?')
+ {
+ marker = i + 1;
+ i = 499;
+ }
+ i++;
+ }
+
+ i = 0;
+
+ //keep morons from trying to crash this
+ if ((marker > 500)||(marker < 1))
+ marker = 500;
+
+ while(marker != 500)
+ {
+ if ((in_string[marker] != '&') && (in_string[marker] != '\0'))
+ {
+ flux[i] = in_string[marker];
+ i++;
+ }
+ else
+ {
+
+ //we have a param, now we must dig through it
+
+ //clear temp vars
+ memset(param_n, 0x0, 500);
+ memset(param_d, 0x0, 500);
+ iswitch = 0;
+ pint = 0;
+ dint = 0;
+ i = 0;
+
+ //split result into param_n and param_d
+ while(i != 500)
+ {
+ if ( (flux[i] != '=') && (flux[i] != '\0') )
+ {
+ if (iswitch == 0)
+ {
+ param_n[pint] = flux[i];
+ pint++;
+ }
+ else
+ {
+ param_d[dint] = flux[i];
+ dint++;
+ }
+ }
+ else
+ {
+ iswitch = 1;
+ }
+ if (flux[i] == '\0')
+ i = 499;
+
+ i++;
+ }
+
+ if ( strcmp(param_n, swhat) == 0 )
+ {
+ return param_d;
+ }
+
+ i = 0;
+ }
+
+ if (in_string[marker] == '\0')
+ {
+ marker = 499;
+ }
+ marker++;
+ }
+ return 0;
+ }
+}
+
diff --git a/src/zlib/crypt.h b/src/zlib/crypt.h
index f14a628b4..622f4bc2e 100644
--- a/src/zlib/crypt.h
+++ b/src/zlib/crypt.h
@@ -1,132 +1,132 @@
-/* crypt.h -- base code for crypt/uncrypt ZIPfile
-
-
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-
- This code is a modified version of crypting code in Infozip distribution
-
- The encryption/decryption parts of this source code (as opposed to the
- non-echoing password parts) were originally written in Europe. The
- whole source package can be freely distributed, including from the USA.
- (Prior to January 2000, re-export from the US was a violation of US law.)
-
- This encryption code is a direct transcription of the algorithm from
- Roger Schlafly, described by Phil Katz in the file appnote.txt. This
- file (appnote.txt) is distributed with the PKZIP program (even in the
- version without encryption capabilities).
-
- If you don't need crypting in your application, just define symbols
- NOCRYPT and NOUNCRYPT.
-
- This code support the "Traditional PKWARE Encryption".
-
- The new AES encryption added on Zip format by Winzip (see the page
- http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
- Encryption is not supported.
-*/
-
-#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
-
-/***********************************************************************
- * Return the next byte in the pseudo-random sequence
- */
-static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
-{
- unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
- * unpredictable manner on 16-bit systems; not a problem
- * with any known compiler so far, though */
-
- temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
- return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
-}
-
-/***********************************************************************
- * Update the encryption keys with the next byte of plain text
- */
-static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
-{
- (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
- (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
- (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
- {
- register int keyshift = (int)((*(pkeys+1)) >> 24);
- (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
- }
- return c;
-}
-
-
-/***********************************************************************
- * Initialize the encryption keys and the random header according to
- * the given password.
- */
-static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
-{
- *(pkeys+0) = 305419896L;
- *(pkeys+1) = 591751049L;
- *(pkeys+2) = 878082192L;
- while (*passwd != '\0') {
- update_keys(pkeys,pcrc_32_tab,(int)*passwd);
- passwd++;
- }
-}
-
-#define zdecode(pkeys,pcrc_32_tab,c) \
- (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
-
-#define zencode(pkeys,pcrc_32_tab,c,t) \
- (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
-
-#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
-
-#define RAND_HEAD_LEN 12
- /* "last resort" source for second part of crypt seed pattern */
-# ifndef ZCR_SEED2
-# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
-# endif
-
-static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
- const char *passwd; /* password string */
- unsigned char *buf; /* where to write header */
- int bufSize;
- unsigned long* pkeys;
- const unsigned long* pcrc_32_tab;
- unsigned long crcForCrypting;
-{
- int n; /* index in random header */
- int t; /* temporary */
- int c; /* random byte */
- unsigned char header[RAND_HEAD_LEN-2]; /* random header */
- static unsigned calls = 0; /* ensure different random header each time */
-
- if (bufSize<RAND_HEAD_LEN)
- return 0;
-
- /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
- * output of rand() to get less predictability, since rand() is
- * often poorly implemented.
- */
- if (++calls == 1)
- {
- srand((unsigned)(time(NULL) ^ ZCR_SEED2));
- }
- init_keys(passwd, pkeys, pcrc_32_tab);
- for (n = 0; n < RAND_HEAD_LEN-2; n++)
- {
- c = (rand() >> 7) & 0xff;
- header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
- }
- /* Encrypt random header (last two bytes is high word of crc) */
- init_keys(passwd, pkeys, pcrc_32_tab);
- for (n = 0; n < RAND_HEAD_LEN-2; n++)
- {
- buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
- }
- buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
- buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
- return n;
-}
-
-#endif
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This code is a modified version of crypting code in Infozip distribution
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ If you don't need crypting in your application, just define symbols
+ NOCRYPT and NOUNCRYPT.
+
+ This code support the "Traditional PKWARE Encryption".
+
+ The new AES encryption added on Zip format by Winzip (see the page
+ http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+ Encryption is not supported.
+*/
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
+{
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
+ * unpredictable manner on 16-bit systems; not a problem
+ * with any known compiler so far, though */
+
+ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+ (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+ (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+ {
+ register int keyshift = (int)((*(pkeys+1)) >> 24);
+ (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+ }
+ return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+ *(pkeys+0) = 305419896L;
+ *(pkeys+1) = 591751049L;
+ *(pkeys+2) = 878082192L;
+ while (*passwd != '\0') {
+ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+ passwd++;
+ }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN 12
+ /* "last resort" source for second part of crypt seed pattern */
+# ifndef ZCR_SEED2
+# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
+# endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+ const char *passwd; /* password string */
+ unsigned char *buf; /* where to write header */
+ int bufSize;
+ unsigned long* pkeys;
+ const unsigned long* pcrc_32_tab;
+ unsigned long crcForCrypting;
+{
+ int n; /* index in random header */
+ int t; /* temporary */
+ int c; /* random byte */
+ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+ static unsigned calls = 0; /* ensure different random header each time */
+
+ if (bufSize<RAND_HEAD_LEN)
+ return 0;
+
+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+ * output of rand() to get less predictability, since rand() is
+ * often poorly implemented.
+ */
+ if (++calls == 1)
+ {
+ srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+ }
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ c = (rand() >> 7) & 0xff;
+ header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+ }
+ /* Encrypt random header (last two bytes is high word of crc) */
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+ }
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+ return n;
+}
+
+#endif
diff --git a/src/zlib/ioapi.c b/src/zlib/ioapi.c
index 7f20c182f..f1bee23e6 100644
--- a/src/zlib/ioapi.c
+++ b/src/zlib/ioapi.c
@@ -1,177 +1,177 @@
-/* ioapi.c -- IO base function header for compress/uncompress .zip
- files using zlib + zip or unzip API
-
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zlib.h"
-#include "ioapi.h"
-
-
-
-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
-
-#ifndef SEEK_CUR
-#define SEEK_CUR 1
-#endif
-
-#ifndef SEEK_END
-#define SEEK_END 2
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET 0
-#endif
-
-voidpf ZCALLBACK fopen_file_func OF((
- voidpf opaque,
- const char* filename,
- int mode));
-
-uLong ZCALLBACK fread_file_func OF((
- voidpf opaque,
- voidpf stream,
- void* buf,
- uLong size));
-
-uLong ZCALLBACK fwrite_file_func OF((
- voidpf opaque,
- voidpf stream,
- const void* buf,
- uLong size));
-
-long ZCALLBACK ftell_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-long ZCALLBACK fseek_file_func OF((
- voidpf opaque,
- voidpf stream,
- uLong offset,
- int origin));
-
-int ZCALLBACK fclose_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-int ZCALLBACK ferror_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-
-voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
- voidpf opaque;
- const char* filename;
- int mode;
-{
- FILE* file = NULL;
- const char* mode_fopen = NULL;
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
- mode_fopen = "rb";
- else
- if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
- mode_fopen = "r+b";
- else
- if (mode & ZLIB_FILEFUNC_MODE_CREATE)
- mode_fopen = "wb";
-
- if ((filename!=NULL) && (mode_fopen != NULL))
- file = fopen(filename, mode_fopen);
- return file;
-}
-
-
-uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
- voidpf opaque;
- voidpf stream;
- void* buf;
- uLong size;
-{
- uLong ret;
- ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
- return ret;
-}
-
-
-uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
- voidpf opaque;
- voidpf stream;
- const void* buf;
- uLong size;
-{
- uLong ret;
- ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
- return ret;
-}
-
-long ZCALLBACK ftell_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- long ret;
- ret = ftell((FILE *)stream);
- return ret;
-}
-
-long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
- voidpf opaque;
- voidpf stream;
- uLong offset;
- int origin;
-{
- int fseek_origin=0;
- long ret;
- switch (origin)
- {
- case ZLIB_FILEFUNC_SEEK_CUR :
- fseek_origin = SEEK_CUR;
- break;
- case ZLIB_FILEFUNC_SEEK_END :
- fseek_origin = SEEK_END;
- break;
- case ZLIB_FILEFUNC_SEEK_SET :
- fseek_origin = SEEK_SET;
- break;
- default: return -1;
- }
- ret = 0;
- fseek((FILE *)stream, offset, fseek_origin);
- return ret;
-}
-
-int ZCALLBACK fclose_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- int ret;
- ret = fclose((FILE *)stream);
- return ret;
-}
-
-int ZCALLBACK ferror_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- int ret;
- ret = ferror((FILE *)stream);
- return ret;
-}
-
-void fill_fopen_filefunc (pzlib_filefunc_def)
- zlib_filefunc_def* pzlib_filefunc_def;
-{
- pzlib_filefunc_def->zopen_file = fopen_file_func;
- pzlib_filefunc_def->zread_file = fread_file_func;
- pzlib_filefunc_def->zwrite_file = fwrite_file_func;
- pzlib_filefunc_def->ztell_file = ftell_file_func;
- pzlib_filefunc_def->zseek_file = fseek_file_func;
- pzlib_filefunc_def->zclose_file = fclose_file_func;
- pzlib_filefunc_def->zerror_file = ferror_file_func;
- pzlib_filefunc_def->opaque = NULL;
-}
+/* ioapi.c -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+voidpf ZCALLBACK fopen_file_func OF((
+ voidpf opaque,
+ const char* filename,
+ int mode));
+
+uLong ZCALLBACK fread_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ void* buf,
+ uLong size));
+
+uLong ZCALLBACK fwrite_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ const void* buf,
+ uLong size));
+
+long ZCALLBACK ftell_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+long ZCALLBACK fseek_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ uLong offset,
+ int origin));
+
+int ZCALLBACK fclose_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+int ZCALLBACK ferror_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+
+voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
+ voidpf opaque;
+ const char* filename;
+ int mode;
+{
+ FILE* file = NULL;
+ const char* mode_fopen = NULL;
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ mode_fopen = "rb";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ mode_fopen = "r+b";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ mode_fopen = "wb";
+
+ if ((filename!=NULL) && (mode_fopen != NULL))
+ file = fopen(filename, mode_fopen);
+ return file;
+}
+
+
+uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
+ voidpf opaque;
+ voidpf stream;
+ void* buf;
+ uLong size;
+{
+ uLong ret;
+ ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
+ return ret;
+}
+
+
+uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
+ voidpf opaque;
+ voidpf stream;
+ const void* buf;
+ uLong size;
+{
+ uLong ret;
+ ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
+ return ret;
+}
+
+long ZCALLBACK ftell_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ long ret;
+ ret = ftell((FILE *)stream);
+ return ret;
+}
+
+long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
+ voidpf opaque;
+ voidpf stream;
+ uLong offset;
+ int origin;
+{
+ int fseek_origin=0;
+ long ret;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ fseek_origin = SEEK_CUR;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ fseek_origin = SEEK_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ fseek_origin = SEEK_SET;
+ break;
+ default: return -1;
+ }
+ ret = 0;
+ fseek((FILE *)stream, offset, fseek_origin);
+ return ret;
+}
+
+int ZCALLBACK fclose_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ int ret;
+ ret = fclose((FILE *)stream);
+ return ret;
+}
+
+int ZCALLBACK ferror_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ int ret;
+ ret = ferror((FILE *)stream);
+ return ret;
+}
+
+void fill_fopen_filefunc (pzlib_filefunc_def)
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ pzlib_filefunc_def->zopen_file = fopen_file_func;
+ pzlib_filefunc_def->zread_file = fread_file_func;
+ pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+ pzlib_filefunc_def->ztell_file = ftell_file_func;
+ pzlib_filefunc_def->zseek_file = fseek_file_func;
+ pzlib_filefunc_def->zclose_file = fclose_file_func;
+ pzlib_filefunc_def->zerror_file = ferror_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
diff --git a/src/zlib/ioapi.h b/src/zlib/ioapi.h
index e73a3b2bd..7d457baab 100644
--- a/src/zlib/ioapi.h
+++ b/src/zlib/ioapi.h
@@ -1,75 +1,75 @@
-/* ioapi.h -- IO base function header for compress/uncompress .zip
- files using zlib + zip or unzip API
-
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-*/
-
-#ifndef _ZLIBIOAPI_H
-#define _ZLIBIOAPI_H
-
-
-#define ZLIB_FILEFUNC_SEEK_CUR (1)
-#define ZLIB_FILEFUNC_SEEK_END (2)
-#define ZLIB_FILEFUNC_SEEK_SET (0)
-
-#define ZLIB_FILEFUNC_MODE_READ (1)
-#define ZLIB_FILEFUNC_MODE_WRITE (2)
-#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
-
-#define ZLIB_FILEFUNC_MODE_EXISTING (4)
-#define ZLIB_FILEFUNC_MODE_CREATE (8)
-
-
-#ifndef ZCALLBACK
-
-#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
-#define ZCALLBACK CALLBACK
-#else
-#define ZCALLBACK
-#endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
-typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
-typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
-typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
-typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
-typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
-typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
-
-typedef struct zlib_filefunc_def_s
-{
- open_file_func zopen_file;
- read_file_func zread_file;
- write_file_func zwrite_file;
- tell_file_func ztell_file;
- seek_file_func zseek_file;
- close_file_func zclose_file;
- testerror_file_func zerror_file;
- voidpf opaque;
-} zlib_filefunc_def;
-
-
-
-void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
-
-#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
-#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
-#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
-#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
-#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
-#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+*/
+
+#ifndef _ZLIBIOAPI_H
+#define _ZLIBIOAPI_H
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ (1)
+#define ZLIB_FILEFUNC_MODE_WRITE (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE (8)
+
+
+#ifndef ZCALLBACK
+
+#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+#define ZCALLBACK CALLBACK
+#else
+#define ZCALLBACK
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
+typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef struct zlib_filefunc_def_s
+{
+ open_file_func zopen_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell_file_func ztell_file;
+ seek_file_func zseek_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ voidpf opaque;
+} zlib_filefunc_def;
+
+
+
+void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
+#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
+#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
+#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
+#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/zlib/iowin32.c b/src/zlib/iowin32.c
index 694bc033b..a9b5f7839 100644
--- a/src/zlib/iowin32.c
+++ b/src/zlib/iowin32.c
@@ -1,270 +1,270 @@
-/* iowin32.c -- IO base function header for compress/uncompress .zip
- files using zlib + zip or unzip API
- This IO API version uses the Win32 API (for Microsoft Windows)
-
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-*/
-
-#include <stdlib.h>
-
-#include "zlib.h"
-#include "ioapi.h"
-#include "iowin32.h"
-
-#ifndef INVALID_HANDLE_VALUE
-#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
-#endif
-
-#ifndef INVALID_SET_FILE_POINTER
-#define INVALID_SET_FILE_POINTER ((DWORD)-1)
-#endif
-
-voidpf ZCALLBACK win32_open_file_func OF((
- voidpf opaque,
- const char* filename,
- int mode));
-
-uLong ZCALLBACK win32_read_file_func OF((
- voidpf opaque,
- voidpf stream,
- void* buf,
- uLong size));
-
-uLong ZCALLBACK win32_write_file_func OF((
- voidpf opaque,
- voidpf stream,
- const void* buf,
- uLong size));
-
-long ZCALLBACK win32_tell_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-long ZCALLBACK win32_seek_file_func OF((
- voidpf opaque,
- voidpf stream,
- uLong offset,
- int origin));
-
-int ZCALLBACK win32_close_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-int ZCALLBACK win32_error_file_func OF((
- voidpf opaque,
- voidpf stream));
-
-typedef struct
-{
- HANDLE hf;
- int error;
-} WIN32FILE_IOWIN;
-
-voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
- voidpf opaque;
- const char* filename;
- int mode;
-{
- const char* mode_fopen = NULL;
- DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
- HANDLE hFile = 0;
- voidpf ret=NULL;
-
- dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
-
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
- {
- dwDesiredAccess = GENERIC_READ;
- dwCreationDisposition = OPEN_EXISTING;
- dwShareMode = FILE_SHARE_READ;
- }
- else
- if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
- {
- dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
- dwCreationDisposition = OPEN_EXISTING;
- }
- else
- if (mode & ZLIB_FILEFUNC_MODE_CREATE)
- {
- dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
- dwCreationDisposition = CREATE_ALWAYS;
- }
-
- if ((filename!=NULL) && (dwDesiredAccess != 0))
- hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
- dwCreationDisposition, dwFlagsAndAttributes, NULL);
-
- if (hFile == INVALID_HANDLE_VALUE)
- hFile = NULL;
-
- if (hFile != NULL)
- {
- WIN32FILE_IOWIN w32fiow;
- w32fiow.hf = hFile;
- w32fiow.error = 0;
- ret = malloc(sizeof(WIN32FILE_IOWIN));
- if (ret==NULL)
- CloseHandle(hFile);
- else *((WIN32FILE_IOWIN*)ret) = w32fiow;
- }
- return ret;
-}
-
-
-uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
- voidpf opaque;
- voidpf stream;
- void* buf;
- uLong size;
-{
- uLong ret=0;
- HANDLE hFile = NULL;
- if (stream!=NULL)
- hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
- if (hFile != NULL)
- if (!ReadFile(hFile, buf, size, &ret, NULL))
- {
- DWORD dwErr = GetLastError();
- if (dwErr == ERROR_HANDLE_EOF)
- dwErr = 0;
- ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
- }
-
- return ret;
-}
-
-
-uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
- voidpf opaque;
- voidpf stream;
- const void* buf;
- uLong size;
-{
- uLong ret=0;
- HANDLE hFile = NULL;
- if (stream!=NULL)
- hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
-
- if (hFile !=NULL)
- if (!WriteFile(hFile, buf, size, &ret, NULL))
- {
- DWORD dwErr = GetLastError();
- if (dwErr == ERROR_HANDLE_EOF)
- dwErr = 0;
- ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
- }
-
- return ret;
-}
-
-long ZCALLBACK win32_tell_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- long ret=-1;
- HANDLE hFile = NULL;
- if (stream!=NULL)
- hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
- if (hFile != NULL)
- {
- DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
- if (dwSet == INVALID_SET_FILE_POINTER)
- {
- DWORD dwErr = GetLastError();
- ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
- ret = -1;
- }
- else
- ret=(long)dwSet;
- }
- return ret;
-}
-
-long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
- voidpf opaque;
- voidpf stream;
- uLong offset;
- int origin;
-{
- DWORD dwMoveMethod=0xFFFFFFFF;
- HANDLE hFile = NULL;
-
- long ret=-1;
- if (stream!=NULL)
- hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
- switch (origin)
- {
- case ZLIB_FILEFUNC_SEEK_CUR :
- dwMoveMethod = FILE_CURRENT;
- break;
- case ZLIB_FILEFUNC_SEEK_END :
- dwMoveMethod = FILE_END;
- break;
- case ZLIB_FILEFUNC_SEEK_SET :
- dwMoveMethod = FILE_BEGIN;
- break;
- default: return -1;
- }
-
- if (hFile != NULL)
- {
- DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
- if (dwSet == INVALID_SET_FILE_POINTER)
- {
- DWORD dwErr = GetLastError();
- ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
- ret = -1;
- }
- else
- ret=0;
- }
- return ret;
-}
-
-int ZCALLBACK win32_close_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- int ret=-1;
-
- if (stream!=NULL)
- {
- HANDLE hFile;
- hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
- if (hFile != NULL)
- {
- CloseHandle(hFile);
- ret=0;
- }
- free(stream);
- }
- return ret;
-}
-
-int ZCALLBACK win32_error_file_func (opaque, stream)
- voidpf opaque;
- voidpf stream;
-{
- int ret=-1;
- if (stream!=NULL)
- {
- ret = ((WIN32FILE_IOWIN*)stream) -> error;
- }
- return ret;
-}
-
-void fill_win32_filefunc (pzlib_filefunc_def)
- zlib_filefunc_def* pzlib_filefunc_def;
-{
- pzlib_filefunc_def->zopen_file = win32_open_file_func;
- pzlib_filefunc_def->zread_file = win32_read_file_func;
- pzlib_filefunc_def->zwrite_file = win32_write_file_func;
- pzlib_filefunc_def->ztell_file = win32_tell_file_func;
- pzlib_filefunc_def->zseek_file = win32_seek_file_func;
- pzlib_filefunc_def->zclose_file = win32_close_file_func;
- pzlib_filefunc_def->zerror_file = win32_error_file_func;
- pzlib_filefunc_def->opaque=NULL;
-}
+/* iowin32.c -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+ This IO API version uses the Win32 API (for Microsoft Windows)
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+*/
+
+#include <stdlib.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "iowin32.h"
+
+#ifndef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
+#endif
+
+#ifndef INVALID_SET_FILE_POINTER
+#define INVALID_SET_FILE_POINTER ((DWORD)-1)
+#endif
+
+voidpf ZCALLBACK win32_open_file_func OF((
+ voidpf opaque,
+ const char* filename,
+ int mode));
+
+uLong ZCALLBACK win32_read_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ void* buf,
+ uLong size));
+
+uLong ZCALLBACK win32_write_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ const void* buf,
+ uLong size));
+
+long ZCALLBACK win32_tell_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+long ZCALLBACK win32_seek_file_func OF((
+ voidpf opaque,
+ voidpf stream,
+ uLong offset,
+ int origin));
+
+int ZCALLBACK win32_close_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+int ZCALLBACK win32_error_file_func OF((
+ voidpf opaque,
+ voidpf stream));
+
+typedef struct
+{
+ HANDLE hf;
+ int error;
+} WIN32FILE_IOWIN;
+
+voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
+ voidpf opaque;
+ const char* filename;
+ int mode;
+{
+ const char* mode_fopen = NULL;
+ DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+ HANDLE hFile = 0;
+ voidpf ret=NULL;
+
+ dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
+
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ {
+ dwDesiredAccess = GENERIC_READ;
+ dwCreationDisposition = OPEN_EXISTING;
+ dwShareMode = FILE_SHARE_READ;
+ }
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ {
+ dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+ dwCreationDisposition = OPEN_EXISTING;
+ }
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ {
+ dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+ dwCreationDisposition = CREATE_ALWAYS;
+ }
+
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
+ dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ hFile = NULL;
+
+ if (hFile != NULL)
+ {
+ WIN32FILE_IOWIN w32fiow;
+ w32fiow.hf = hFile;
+ w32fiow.error = 0;
+ ret = malloc(sizeof(WIN32FILE_IOWIN));
+ if (ret==NULL)
+ CloseHandle(hFile);
+ else *((WIN32FILE_IOWIN*)ret) = w32fiow;
+ }
+ return ret;
+}
+
+
+uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
+ voidpf opaque;
+ voidpf stream;
+ void* buf;
+ uLong size;
+{
+ uLong ret=0;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ if (hFile != NULL)
+ if (!ReadFile(hFile, buf, size, &ret, NULL))
+ {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_HANDLE_EOF)
+ dwErr = 0;
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ }
+
+ return ret;
+}
+
+
+uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
+ voidpf opaque;
+ voidpf stream;
+ const void* buf;
+ uLong size;
+{
+ uLong ret=0;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+ if (hFile !=NULL)
+ if (!WriteFile(hFile, buf, size, &ret, NULL))
+ {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_HANDLE_EOF)
+ dwErr = 0;
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ }
+
+ return ret;
+}
+
+long ZCALLBACK win32_tell_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ long ret=-1;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ if (hFile != NULL)
+ {
+ DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
+ if (dwSet == INVALID_SET_FILE_POINTER)
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = -1;
+ }
+ else
+ ret=(long)dwSet;
+ }
+ return ret;
+}
+
+long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
+ voidpf opaque;
+ voidpf stream;
+ uLong offset;
+ int origin;
+{
+ DWORD dwMoveMethod=0xFFFFFFFF;
+ HANDLE hFile = NULL;
+
+ long ret=-1;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ dwMoveMethod = FILE_CURRENT;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ dwMoveMethod = FILE_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ default: return -1;
+ }
+
+ if (hFile != NULL)
+ {
+ DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
+ if (dwSet == INVALID_SET_FILE_POINTER)
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = -1;
+ }
+ else
+ ret=0;
+ }
+ return ret;
+}
+
+int ZCALLBACK win32_close_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ int ret=-1;
+
+ if (stream!=NULL)
+ {
+ HANDLE hFile;
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ if (hFile != NULL)
+ {
+ CloseHandle(hFile);
+ ret=0;
+ }
+ free(stream);
+ }
+ return ret;
+}
+
+int ZCALLBACK win32_error_file_func (opaque, stream)
+ voidpf opaque;
+ voidpf stream;
+{
+ int ret=-1;
+ if (stream!=NULL)
+ {
+ ret = ((WIN32FILE_IOWIN*)stream) -> error;
+ }
+ return ret;
+}
+
+void fill_win32_filefunc (pzlib_filefunc_def)
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ pzlib_filefunc_def->zopen_file = win32_open_file_func;
+ pzlib_filefunc_def->zread_file = win32_read_file_func;
+ pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+ pzlib_filefunc_def->ztell_file = win32_tell_file_func;
+ pzlib_filefunc_def->zseek_file = win32_seek_file_func;
+ pzlib_filefunc_def->zclose_file = win32_close_file_func;
+ pzlib_filefunc_def->zerror_file = win32_error_file_func;
+ pzlib_filefunc_def->opaque=NULL;
+}
diff --git a/src/zlib/iowin32.h b/src/zlib/iowin32.h
index e9c5f8b90..a3a437adf 100644
--- a/src/zlib/iowin32.h
+++ b/src/zlib/iowin32.h
@@ -1,21 +1,21 @@
-/* iowin32.h -- IO base function header for compress/uncompress .zip
- files using zlib + zip or unzip API
- This IO API version uses the Win32 API (for Microsoft Windows)
-
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-*/
-
-#include <windows.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
-
-#ifdef __cplusplus
-}
-#endif
+/* iowin32.h -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+ This IO API version uses the Win32 API (for Microsoft Windows)
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+*/
+
+#include <windows.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/zlib/unzip.c b/src/zlib/unzip.c
index 37b4f144b..8b5b30204 100644
--- a/src/zlib/unzip.c
+++ b/src/zlib/unzip.c
@@ -1,1602 +1,1602 @@
-/* unzip.c -- IO for uncompress .zip files using zlib
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-
- Read unzip.h for more info
-*/
-
-/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
-compatibility with older software. The following is from the original crypt.c. Code
-woven in by Terry Thorsen 1/2003.
-*/
-/*
- Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
-
- See the accompanying file LICENSE, version 2000-Apr-09 or later
- (the contents of which are also included in zip.h) for terms of use.
- If, for some reason, all these files are missing, the Info-ZIP license
- also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
-*/
-/*
- crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
-
- The encryption/decryption parts of this source code (as opposed to the
- non-echoing password parts) were originally written in Europe. The
- whole source package can be freely distributed, including from the USA.
- (Prior to January 2000, re-export from the US was a violation of US law.)
- */
-
-/*
- This encryption code is a direct transcription of the algorithm from
- Roger Schlafly, described by Phil Katz in the file appnote.txt. This
- file (appnote.txt) is distributed with the PKZIP program (even in the
- version without encryption capabilities).
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "zlib.h"
-#include "unzip.h"
-
-#ifdef STDC
-# include <stddef.h>
-# include <string.h>
-# include <stdlib.h>
-#endif
-#ifdef NO_ERRNO_H
- extern int errno;
-#else
-# include <errno.h>
-#endif
-
-
-#ifndef local
-# define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-
-#ifndef CASESENSITIVITYDEFAULT_NO
-# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
-# define CASESENSITIVITYDEFAULT_NO
-# endif
-#endif
-
-
-#ifndef UNZ_BUFSIZE
-#define UNZ_BUFSIZE (16384)
-#endif
-
-#ifndef UNZ_MAXFILENAMEINZIP
-#define UNZ_MAXFILENAMEINZIP (256)
-#endif
-
-#ifndef ALLOC
-# define ALLOC(size) (malloc(size))
-#endif
-#ifndef TRYFREE
-# define TRYFREE(p) {if (p) free(p);}
-#endif
-
-#define SIZECENTRALDIRITEM (0x2e)
-#define SIZEZIPLOCALHEADER (0x1e)
-
-
-
-
-const char unz_copyright[] =
- " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
-
-/* unz_file_info_interntal contain internal info about a file in zipfile*/
-typedef struct unz_file_info_internal_s
-{
- uLong offset_curfile;/* relative offset of local header 4 bytes */
-} unz_file_info_internal;
-
-
-/* file_in_zip_read_info_s contain internal information about a file in zipfile,
- when reading and decompress it */
-typedef struct
-{
- char *read_buffer; /* internal buffer for compressed data */
- z_stream stream; /* zLib stream structure for inflate */
-
- uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
- uLong stream_initialised; /* flag set if stream structure is initialised*/
-
- uLong offset_local_extrafield;/* offset of the local extra field */
- uInt size_local_extrafield;/* size of the local extra field */
- uLong pos_local_extrafield; /* position in the local extra field in read*/
-
- uLong crc32; /* crc32 of all data uncompressed */
- uLong crc32_wait; /* crc32 we must obtain after decompress all */
- uLong rest_read_compressed; /* number of byte to be decompressed */
- uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
- zlib_filefunc_def z_filefunc;
- voidpf filestream; /* io structore of the zipfile */
- uLong compression_method; /* compression method (0==store) */
- uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
- int raw;
-} file_in_zip_read_info_s;
-
-
-/* unz_s contain internal information about the zipfile
-*/
-typedef struct
-{
- zlib_filefunc_def z_filefunc;
- voidpf filestream; /* io structore of the zipfile */
- unz_global_info gi; /* public global information */
- uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
- uLong num_file; /* number of the current file in the zipfile*/
- uLong pos_in_central_dir; /* pos of the current file in the central dir*/
- uLong current_file_ok; /* flag about the usability of the current file*/
- uLong central_pos; /* position of the beginning of the central dir*/
-
- uLong size_central_dir; /* size of the central directory */
- uLong offset_central_dir; /* offset of start of central directory with
- respect to the starting disk number */
-
- unz_file_info cur_file_info; /* public info about the current file in zip*/
- unz_file_info_internal cur_file_info_internal; /* private info about it*/
- file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
- file if we are decompressing it */
- int encrypted;
-# ifndef NOUNCRYPT
- unsigned long keys[3]; /* keys defining the pseudo-random sequence */
- const unsigned long* pcrc_32_tab;
-# endif
-} unz_s;
-
-
-#ifndef NOUNCRYPT
-#include "crypt.h"
-#endif
-
-/* ===========================================================================
- Read a byte from a gz_stream; update next_in and avail_in. Return EOF
- for end of file.
- IN assertion: the stream s has been sucessfully opened for reading.
-*/
-
-
-local int unzlocal_getByte OF((
- const zlib_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
- int *pi));
-
-local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
- const zlib_filefunc_def* pzlib_filefunc_def;
- voidpf filestream;
- int *pi;
-{
- unsigned char c;
- int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
- if (err==1)
- {
- *pi = (int)c;
- return UNZ_OK;
- }
- else
- {
- if (ZERROR(*pzlib_filefunc_def,filestream))
- return UNZ_ERRNO;
- else
- return UNZ_EOF;
- }
-}
-
-
-/* ===========================================================================
- Reads a long in LSB order from the given gz_stream. Sets
-*/
-local int unzlocal_getShort OF((
- const zlib_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
- uLong *pX));
-
-local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
- const zlib_filefunc_def* pzlib_filefunc_def;
- voidpf filestream;
- uLong *pX;
-{
- uLong x ;
- int i;
- int err;
-
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x = (uLong)i;
-
- if (err==UNZ_OK)
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x += ((uLong)i)<<8;
-
- if (err==UNZ_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-local int unzlocal_getLong OF((
- const zlib_filefunc_def* pzlib_filefunc_def,
- voidpf filestream,
- uLong *pX));
-
-local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
- const zlib_filefunc_def* pzlib_filefunc_def;
- voidpf filestream;
- uLong *pX;
-{
- uLong x ;
- int i;
- int err;
-
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x = (uLong)i;
-
- if (err==UNZ_OK)
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x += ((uLong)i)<<8;
-
- if (err==UNZ_OK)
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x += ((uLong)i)<<16;
-
- if (err==UNZ_OK)
- err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
- x += ((uLong)i)<<24;
-
- if (err==UNZ_OK)
- *pX = x;
- else
- *pX = 0;
- return err;
-}
-
-
-/* My own strcmpi / strcasecmp */
-local int strcmpcasenosensitive_internal (fileName1,fileName2)
- const char* fileName1;
- const char* fileName2;
-{
- for (;;)
- {
- char c1=*(fileName1++);
- char c2=*(fileName2++);
- if ((c1>='a') && (c1<='z'))
- c1 -= 0x20;
- if ((c2>='a') && (c2<='z'))
- c2 -= 0x20;
- if (c1=='\0')
- return ((c2=='\0') ? 0 : -1);
- if (c2=='\0')
- return 1;
- if (c1<c2)
- return -1;
- if (c1>c2)
- return 1;
- }
-}
-
-
-#ifdef CASESENSITIVITYDEFAULT_NO
-#define CASESENSITIVITYDEFAULTVALUE 2
-#else
-#define CASESENSITIVITYDEFAULTVALUE 1
-#endif
-
-#ifndef STRCMPCASENOSENTIVEFUNCTION
-#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
-#endif
-
-/*
- Compare two filename (fileName1,fileName2).
- If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
- If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
- or strcasecmp)
- If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
- (like 1 on Unix, 2 on Windows)
-
-*/
-extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
- const char* fileName1;
- const char* fileName2;
- int iCaseSensitivity;
-{
- if (iCaseSensitivity==0)
- iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
-
- if (iCaseSensitivity==1)
- return strcmp(fileName1,fileName2);
-
- return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
-}
-
-#ifndef BUFREADCOMMENT
-#define BUFREADCOMMENT (0x400)
-#endif
-
-/*
- Locate the Central directory of a zipfile (at the end, just before
- the global comment)
-*/
-local uLong unzlocal_SearchCentralDir OF((
- const zlib_filefunc_def* pzlib_filefunc_def,
- voidpf filestream));
-
-local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
- const zlib_filefunc_def* pzlib_filefunc_def;
- voidpf filestream;
-{
- unsigned char* buf;
- uLong uSizeFile;
- uLong uBackRead;
- uLong uMaxBack=0xffff; /* maximum size of global comment */
- uLong uPosFound=0;
-
- if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
- return 0;
-
-
- uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
-
- if (uMaxBack>uSizeFile)
- uMaxBack = uSizeFile;
-
- buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
- if (buf==NULL)
- return 0;
-
- uBackRead = 4;
- while (uBackRead<uMaxBack)
- {
- uLong uReadSize,uReadPos ;
- int i;
- if (uBackRead+BUFREADCOMMENT>uMaxBack)
- uBackRead = uMaxBack;
- else
- uBackRead+=BUFREADCOMMENT;
- uReadPos = uSizeFile-uBackRead ;
-
- uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
- (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
- if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
- break;
-
- if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
- break;
-
- for (i=(int)uReadSize-3; (i--)>0;)
- if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
- ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
- {
- uPosFound = uReadPos+i;
- break;
- }
-
- if (uPosFound!=0)
- break;
- }
- TRYFREE(buf);
- return uPosFound;
-}
-
-/*
- Open a Zip file. path contain the full pathname (by example,
- on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
- "zlib/zlib114.zip".
- If the zipfile cannot be opened (file doesn't exist or in not valid), the
- return value is NULL.
- Else, the return value is a unzFile Handle, usable with other function
- of this unzip package.
-*/
-extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
- const char *path;
- zlib_filefunc_def* pzlib_filefunc_def;
-{
- unz_s us;
- unz_s *s;
- uLong central_pos,uL;
-
- uLong number_disk; /* number of the current dist, used for
- spaning ZIP, unsupported, always 0*/
- uLong number_disk_with_CD; /* number the the disk with central dir, used
- for spaning ZIP, unsupported, always 0*/
- uLong number_entry_CD; /* total number of entries in
- the central dir
- (same than number_entry on nospan) */
-
- int err=UNZ_OK;
-
- if (unz_copyright[0]!=' ')
- return NULL;
-
- if (pzlib_filefunc_def==NULL)
- fill_fopen_filefunc(&us.z_filefunc);
- else
- us.z_filefunc = *pzlib_filefunc_def;
-
- us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
- path,
- ZLIB_FILEFUNC_MODE_READ |
- ZLIB_FILEFUNC_MODE_EXISTING);
- if (us.filestream==NULL)
- return NULL;
-
- central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
- if (central_pos==0)
- err=UNZ_ERRNO;
-
- if (ZSEEK(us.z_filefunc, us.filestream,
- central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
- err=UNZ_ERRNO;
-
- /* the signature, already checked */
- if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* number of this disk */
- if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* number of the disk with the start of the central directory */
- if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* total number of entries in the central dir on this disk */
- if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* total number of entries in the central dir */
- if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- if ((number_entry_CD!=us.gi.number_entry) ||
- (number_disk_with_CD!=0) ||
- (number_disk!=0))
- err=UNZ_BADZIPFILE;
-
- /* size of the central directory */
- if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* offset of start of central directory with respect to the
- starting disk number */
- if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- /* zipfile comment length */
- if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
- err=UNZ_ERRNO;
-
- if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
- (err==UNZ_OK))
- err=UNZ_BADZIPFILE;
-
- if (err!=UNZ_OK)
- {
- ZCLOSE(us.z_filefunc, us.filestream);
- return NULL;
- }
-
- us.byte_before_the_zipfile = central_pos -
- (us.offset_central_dir+us.size_central_dir);
- us.central_pos = central_pos;
- us.pfile_in_zip_read = NULL;
- us.encrypted = 0;
-
-
- s=(unz_s*)ALLOC(sizeof(unz_s));
- *s=us;
- unzGoToFirstFile((unzFile)s);
- return (unzFile)s;
-}
-
-
-extern unzFile ZEXPORT unzOpen (path)
- const char *path;
-{
- return unzOpen2(path, NULL);
-}
-
-/*
- Close a ZipFile opened with unzipOpen.
- If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
- these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
- return UNZ_OK if there is no problem. */
-extern int ZEXPORT unzClose (file)
- unzFile file;
-{
- unz_s* s;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
-
- if (s->pfile_in_zip_read!=NULL)
- unzCloseCurrentFile(file);
-
- ZCLOSE(s->z_filefunc, s->filestream);
- TRYFREE(s);
- return UNZ_OK;
-}
-
-
-/*
- Write info about the ZipFile in the *pglobal_info structure.
- No preparation of the structure is needed
- return UNZ_OK if there is no problem. */
-extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
- unzFile file;
- unz_global_info *pglobal_info;
-{
- unz_s* s;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- *pglobal_info=s->gi;
- return UNZ_OK;
-}
-
-
-/*
- Translate date/time from Dos format to tm_unz (readable more easilty)
-*/
-local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
- uLong ulDosDate;
- tm_unz* ptm;
-{
- uLong uDate;
- uDate = (uLong)(ulDosDate>>16);
- ptm->tm_mday = (uInt)(uDate&0x1f) ;
- ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
- ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
-
- ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
- ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
- ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
-}
-
-/*
- Get Info about the current file in the zipfile, with internal only info
-*/
-local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
- unz_file_info *pfile_info,
- unz_file_info_internal
- *pfile_info_internal,
- char *szFileName,
- uLong fileNameBufferSize,
- void *extraField,
- uLong extraFieldBufferSize,
- char *szComment,
- uLong commentBufferSize));
-
-local int unzlocal_GetCurrentFileInfoInternal (file,
- pfile_info,
- pfile_info_internal,
- szFileName, fileNameBufferSize,
- extraField, extraFieldBufferSize,
- szComment, commentBufferSize)
- unzFile file;
- unz_file_info *pfile_info;
- unz_file_info_internal *pfile_info_internal;
- char *szFileName;
- uLong fileNameBufferSize;
- void *extraField;
- uLong extraFieldBufferSize;
- char *szComment;
- uLong commentBufferSize;
-{
- unz_s* s;
- unz_file_info file_info;
- unz_file_info_internal file_info_internal;
- int err=UNZ_OK;
- uLong uMagic;
- long lSeek=0;
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- if (ZSEEK(s->z_filefunc, s->filestream,
- s->pos_in_central_dir+s->byte_before_the_zipfile,
- ZLIB_FILEFUNC_SEEK_SET)!=0)
- err=UNZ_ERRNO;
-
-
- /* we check the magic */
- if (err==UNZ_OK) {
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
- err=UNZ_ERRNO;
- else if (uMagic!=0x02014b50)
- err=UNZ_BADZIPFILE;
- }
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
- err=UNZ_ERRNO;
-
- unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
- err=UNZ_ERRNO;
-
- lSeek+=file_info.size_filename;
- if ((err==UNZ_OK) && (szFileName!=NULL))
- {
- uLong uSizeRead ;
- if (file_info.size_filename<fileNameBufferSize)
- {
- *(szFileName+file_info.size_filename)='\0';
- uSizeRead = file_info.size_filename;
- }
- else
- uSizeRead = fileNameBufferSize;
-
- if ((file_info.size_filename>0) && (fileNameBufferSize>0))
- if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
- err=UNZ_ERRNO;
- lSeek -= uSizeRead;
- }
-
-
- if ((err==UNZ_OK) && (extraField!=NULL))
- {
- uLong uSizeRead ;
- if (file_info.size_file_extra<extraFieldBufferSize)
- uSizeRead = file_info.size_file_extra;
- else
- uSizeRead = extraFieldBufferSize;
-
- if (lSeek!=0) {
- if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
- lSeek=0;
- else
- err=UNZ_ERRNO;
- }
- if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
- if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
- err=UNZ_ERRNO;
- lSeek += file_info.size_file_extra - uSizeRead;
- }
- else
- lSeek+=file_info.size_file_extra;
-
-
- if ((err==UNZ_OK) && (szComment!=NULL))
- {
- uLong uSizeRead ;
- if (file_info.size_file_comment<commentBufferSize)
- {
- *(szComment+file_info.size_file_comment)='\0';
- uSizeRead = file_info.size_file_comment;
- }
- else
- uSizeRead = commentBufferSize;
-
- if (lSeek!=0) {
- if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
- lSeek=0;
- else
- err=UNZ_ERRNO;
- }
- if ((file_info.size_file_comment>0) && (commentBufferSize>0))
- if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
- err=UNZ_ERRNO;
- lSeek+=file_info.size_file_comment - uSizeRead;
- }
- else
- lSeek+=file_info.size_file_comment;
-
- if ((err==UNZ_OK) && (pfile_info!=NULL))
- *pfile_info=file_info;
-
- if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
- *pfile_info_internal=file_info_internal;
-
- return err;
-}
-
-
-
-/*
- Write info about the ZipFile in the *pglobal_info structure.
- No preparation of the structure is needed
- return UNZ_OK if there is no problem.
-*/
-extern int ZEXPORT unzGetCurrentFileInfo (file,
- pfile_info,
- szFileName, fileNameBufferSize,
- extraField, extraFieldBufferSize,
- szComment, commentBufferSize)
- unzFile file;
- unz_file_info *pfile_info;
- char *szFileName;
- uLong fileNameBufferSize;
- void *extraField;
- uLong extraFieldBufferSize;
- char *szComment;
- uLong commentBufferSize;
-{
- return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
- szFileName,fileNameBufferSize,
- extraField,extraFieldBufferSize,
- szComment,commentBufferSize);
-}
-
-/*
- Set the current file of the zipfile to the first file.
- return UNZ_OK if there is no problem
-*/
-extern int ZEXPORT unzGoToFirstFile (file)
- unzFile file;
-{
- int err=UNZ_OK;
- unz_s* s;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- s->pos_in_central_dir=s->offset_central_dir;
- s->num_file=0;
- err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
- &s->cur_file_info_internal,
- NULL,0,NULL,0,NULL,0);
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
-
-/*
- Set the current file of the zipfile to the next file.
- return UNZ_OK if there is no problem
- return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
-*/
-extern int ZEXPORT unzGoToNextFile (file)
- unzFile file;
-{
- unz_s* s;
- int err;
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
- if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
- if (s->num_file+1==s->gi.number_entry)
- return UNZ_END_OF_LIST_OF_FILE;
-
- s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
- s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
- s->num_file++;
- err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
- &s->cur_file_info_internal,
- NULL,0,NULL,0,NULL,0);
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
-
-
-/*
- Try locate the file szFileName in the zipfile.
- For the iCaseSensitivity signification, see unzipStringFileNameCompare
-
- return value :
- UNZ_OK if the file is found. It becomes the current file.
- UNZ_END_OF_LIST_OF_FILE if the file is not found
-*/
-extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
- unzFile file;
- const char *szFileName;
- int iCaseSensitivity;
-{
- unz_s* s;
- int err;
-
- /* We remember the 'current' position in the file so that we can jump
- * back there if we fail.
- */
- unz_file_info cur_file_infoSaved;
- unz_file_info_internal cur_file_info_internalSaved;
- uLong num_fileSaved;
- uLong pos_in_central_dirSaved;
-
-
- if (file==NULL)
- return UNZ_PARAMERROR;
-
- if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
- return UNZ_PARAMERROR;
-
- s=(unz_s*)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
-
- /* Save the current state */
- num_fileSaved = s->num_file;
- pos_in_central_dirSaved = s->pos_in_central_dir;
- cur_file_infoSaved = s->cur_file_info;
- cur_file_info_internalSaved = s->cur_file_info_internal;
-
- err = unzGoToFirstFile(file);
-
- while (err == UNZ_OK)
- {
- char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
- err = unzGetCurrentFileInfo(file,NULL,
- szCurrentFileName,sizeof(szCurrentFileName)-1,
- NULL,0,NULL,0);
- if (err == UNZ_OK)
- {
- if (unzStringFileNameCompare(szCurrentFileName,
- szFileName,iCaseSensitivity)==0)
- return UNZ_OK;
- err = unzGoToNextFile(file);
- }
- }
-
- /* We failed, so restore the state of the 'current file' to where we
- * were.
- */
- s->num_file = num_fileSaved ;
- s->pos_in_central_dir = pos_in_central_dirSaved ;
- s->cur_file_info = cur_file_infoSaved;
- s->cur_file_info_internal = cur_file_info_internalSaved;
- return err;
-}
-
-
-/*
-///////////////////////////////////////////
-// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
-// I need random access
-//
-// Further optimization could be realized by adding an ability
-// to cache the directory in memory. The goal being a single
-// comprehensive file read to put the file I need in a memory.
-*/
-
-/*
-typedef struct unz_file_pos_s
-{
- uLong pos_in_zip_directory; // offset in file
- uLong num_of_file; // # of file
-} unz_file_pos;
-*/
-
-extern int ZEXPORT unzGetFilePos(file, file_pos)
- unzFile file;
- unz_file_pos* file_pos;
-{
- unz_s* s;
-
- if (file==NULL || file_pos==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- if (!s->current_file_ok)
- return UNZ_END_OF_LIST_OF_FILE;
-
- file_pos->pos_in_zip_directory = s->pos_in_central_dir;
- file_pos->num_of_file = s->num_file;
-
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzGoToFilePos(file, file_pos)
- unzFile file;
- unz_file_pos* file_pos;
-{
- unz_s* s;
- int err;
-
- if (file==NULL || file_pos==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
-
- /* jump to the right spot */
- s->pos_in_central_dir = file_pos->pos_in_zip_directory;
- s->num_file = file_pos->num_of_file;
-
- /* set the current file */
- err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
- &s->cur_file_info_internal,
- NULL,0,NULL,0,NULL,0);
- /* return results */
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
-
-/*
-// Unzip Helper Functions - should be here?
-///////////////////////////////////////////
-*/
-
-/*
- Read the local header of the current zipfile
- Check the coherency of the local header and info in the end of central
- directory about this file
- store in *piSizeVar the size of extra info in local header
- (filename and size of extra field data)
-*/
-local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
- poffset_local_extrafield,
- psize_local_extrafield)
- unz_s* s;
- uInt* piSizeVar;
- uLong *poffset_local_extrafield;
- uInt *psize_local_extrafield;
-{
- uLong uMagic,uData,uFlags;
- uLong size_filename;
- uLong size_extra_field;
- int err=UNZ_OK;
-
- *piSizeVar = 0;
- *poffset_local_extrafield = 0;
- *psize_local_extrafield = 0;
-
- if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
- s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
- return UNZ_ERRNO;
-
-
- if (err==UNZ_OK) {
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
- err=UNZ_ERRNO;
- else if (uMagic!=0x04034b50)
- err=UNZ_BADZIPFILE;
- }
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
- err=UNZ_ERRNO;
-/*
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
- err=UNZ_BADZIPFILE;
-*/
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
- err=UNZ_ERRNO;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
- err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
- err=UNZ_BADZIPFILE;
-
- if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
- (s->cur_file_info.compression_method!=Z_DEFLATED))
- err=UNZ_BADZIPFILE;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
- err=UNZ_ERRNO;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
- err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
- ((uFlags & 8)==0))
- err=UNZ_BADZIPFILE;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
- err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
- ((uFlags & 8)==0))
- err=UNZ_BADZIPFILE;
-
- if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
- err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
- ((uFlags & 8)==0))
- err=UNZ_BADZIPFILE;
-
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
- err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
- err=UNZ_BADZIPFILE;
-
- *piSizeVar += (uInt)size_filename;
-
- if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
- err=UNZ_ERRNO;
- *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
- SIZEZIPLOCALHEADER + size_filename;
- *psize_local_extrafield = (uInt)size_extra_field;
-
- *piSizeVar += (uInt)size_extra_field;
-
- return err;
-}
-
-/*
- Open for reading data the current file in the zipfile.
- If there is no error and the file is opened, the return value is UNZ_OK.
-*/
-extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
- unzFile file;
- int* method;
- int* level;
- int raw;
- const char* password;
-{
- int err=UNZ_OK;
- uInt iSizeVar;
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- uLong offset_local_extrafield; /* offset of the local extra field */
- uInt size_local_extrafield; /* size of the local extra field */
-# ifndef NOUNCRYPT
- char source[12];
-# else
- if (password != NULL)
- return UNZ_PARAMERROR;
-# endif
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- if (!s->current_file_ok)
- return UNZ_PARAMERROR;
-
- if (s->pfile_in_zip_read != NULL)
- unzCloseCurrentFile(file);
-
- if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
- &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
- return UNZ_BADZIPFILE;
-
- pfile_in_zip_read_info = (file_in_zip_read_info_s*)
- ALLOC(sizeof(file_in_zip_read_info_s));
- if (pfile_in_zip_read_info==NULL)
- return UNZ_INTERNALERROR;
-
- pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
- pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
- pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
- pfile_in_zip_read_info->pos_local_extrafield=0;
- pfile_in_zip_read_info->raw=raw;
-
- if (pfile_in_zip_read_info->read_buffer==NULL)
- {
- TRYFREE(pfile_in_zip_read_info);
- return UNZ_INTERNALERROR;
- }
-
- pfile_in_zip_read_info->stream_initialised=0;
-
- if (method!=NULL)
- *method = (int)s->cur_file_info.compression_method;
-
- if (level!=NULL)
- {
- *level = 6;
- switch (s->cur_file_info.flag & 0x06)
- {
- case 6 : *level = 1; break;
- case 4 : *level = 2; break;
- case 2 : *level = 9; break;
- }
- }
-
- if ((s->cur_file_info.compression_method!=0) &&
- (s->cur_file_info.compression_method!=Z_DEFLATED))
- err=UNZ_BADZIPFILE;
-
- pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
- pfile_in_zip_read_info->crc32=0;
- pfile_in_zip_read_info->compression_method =
- s->cur_file_info.compression_method;
- pfile_in_zip_read_info->filestream=s->filestream;
- pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
- pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
-
- pfile_in_zip_read_info->stream.total_out = 0;
-
- if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
- (!raw))
- {
- pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
- pfile_in_zip_read_info->stream.zfree = (free_func)0;
- pfile_in_zip_read_info->stream.opaque = (voidpf)0;
- pfile_in_zip_read_info->stream.next_in = (voidpf)0;
- pfile_in_zip_read_info->stream.avail_in = 0;
-
- err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
- if (err == Z_OK)
- pfile_in_zip_read_info->stream_initialised=1;
- else
- {
- TRYFREE(pfile_in_zip_read_info);
- return err;
- }
- /* windowBits is passed < 0 to tell that there is no zlib header.
- * Note that in this case inflate *requires* an extra "dummy" byte
- * after the compressed stream in order to complete decompression and
- * return Z_STREAM_END.
- * In unzip, i don't wait absolutely Z_STREAM_END because I known the
- * size of both compressed and uncompressed data
- */
- }
- pfile_in_zip_read_info->rest_read_compressed =
- s->cur_file_info.compressed_size ;
- pfile_in_zip_read_info->rest_read_uncompressed =
- s->cur_file_info.uncompressed_size ;
-
-
- pfile_in_zip_read_info->pos_in_zipfile =
- s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
- iSizeVar;
-
- pfile_in_zip_read_info->stream.avail_in = (uInt)0;
-
- s->pfile_in_zip_read = pfile_in_zip_read_info;
-
-# ifndef NOUNCRYPT
- if (password != NULL)
- {
- int i;
- s->pcrc_32_tab = get_crc_table();
- init_keys(password,s->keys,s->pcrc_32_tab);
- if (ZSEEK(s->z_filefunc, s->filestream,
- s->pfile_in_zip_read->pos_in_zipfile +
- s->pfile_in_zip_read->byte_before_the_zipfile,
- SEEK_SET)!=0)
- return UNZ_INTERNALERROR;
- if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
- return UNZ_INTERNALERROR;
-
- for (i = 0; i<12; i++)
- zdecode(s->keys,s->pcrc_32_tab,source[i]);
-
- s->pfile_in_zip_read->pos_in_zipfile+=12;
- s->encrypted=1;
- }
-# endif
-
-
- return UNZ_OK;
-}
-
-extern int ZEXPORT unzOpenCurrentFile (file)
- unzFile file;
-{
- return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
-}
-
-extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
- unzFile file;
- const char* password;
-{
- return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
-}
-
-extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
- unzFile file;
- int* method;
- int* level;
- int raw;
-{
- return unzOpenCurrentFile3(file, method, level, raw, NULL);
-}
-
-/*
- Read bytes from the current file.
- buf contain buffer where data must be copied
- len the size of buf.
-
- return the number of byte copied if somes bytes are copied
- return 0 if the end of file was reached
- return <0 with error code if there is an error
- (UNZ_ERRNO for IO error, or zLib error for uncompress error)
-*/
-extern int ZEXPORT unzReadCurrentFile (file, buf, len)
- unzFile file;
- voidp buf;
- unsigned len;
-{
- int err=UNZ_OK;
- uInt iRead = 0;
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- pfile_in_zip_read_info=s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info==NULL)
- return UNZ_PARAMERROR;
-
-
- if ((pfile_in_zip_read_info->read_buffer == NULL))
- return UNZ_END_OF_LIST_OF_FILE;
- if (len==0)
- return 0;
-
- pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
-
- pfile_in_zip_read_info->stream.avail_out = (uInt)len;
-
- if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
- (!(pfile_in_zip_read_info->raw)))
- pfile_in_zip_read_info->stream.avail_out =
- (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
-
- if ((len>pfile_in_zip_read_info->rest_read_compressed+
- pfile_in_zip_read_info->stream.avail_in) &&
- (pfile_in_zip_read_info->raw))
- pfile_in_zip_read_info->stream.avail_out =
- (uInt)pfile_in_zip_read_info->rest_read_compressed+
- pfile_in_zip_read_info->stream.avail_in;
-
- while (pfile_in_zip_read_info->stream.avail_out>0)
- {
- if ((pfile_in_zip_read_info->stream.avail_in==0) &&
- (pfile_in_zip_read_info->rest_read_compressed>0))
- {
- uInt uReadThis = UNZ_BUFSIZE;
- if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
- uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
- if (uReadThis == 0)
- return UNZ_EOF;
- if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->pos_in_zipfile +
- pfile_in_zip_read_info->byte_before_the_zipfile,
- ZLIB_FILEFUNC_SEEK_SET)!=0)
- return UNZ_ERRNO;
- if (ZREAD(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->read_buffer,
- uReadThis)!=uReadThis)
- return UNZ_ERRNO;
-
-
-# ifndef NOUNCRYPT
- if(s->encrypted)
- {
- uInt i;
- for(i=0;i<uReadThis;i++)
- pfile_in_zip_read_info->read_buffer[i] =
- zdecode(s->keys,s->pcrc_32_tab,
- pfile_in_zip_read_info->read_buffer[i]);
- }
-# endif
-
-
- pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
-
- pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
-
- pfile_in_zip_read_info->stream.next_in =
- (Bytef*)pfile_in_zip_read_info->read_buffer;
- pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
- }
-
- if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
- {
- uInt uDoCopy,i ;
-
- if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
- (pfile_in_zip_read_info->rest_read_compressed == 0))
- return (iRead==0) ? UNZ_EOF : iRead;
-
- if (pfile_in_zip_read_info->stream.avail_out <
- pfile_in_zip_read_info->stream.avail_in)
- uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
- else
- uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
-
- for (i=0;i<uDoCopy;i++)
- *(pfile_in_zip_read_info->stream.next_out+i) =
- *(pfile_in_zip_read_info->stream.next_in+i);
-
- pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
- pfile_in_zip_read_info->stream.next_out,
- uDoCopy);
- pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
- pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
- pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
- pfile_in_zip_read_info->stream.next_out += uDoCopy;
- pfile_in_zip_read_info->stream.next_in += uDoCopy;
- pfile_in_zip_read_info->stream.total_out += uDoCopy;
- iRead += uDoCopy;
- }
- else
- {
- uLong uTotalOutBefore,uTotalOutAfter;
- const Bytef *bufBefore;
- uLong uOutThis;
- int flush=Z_SYNC_FLUSH;
-
- uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
- bufBefore = pfile_in_zip_read_info->stream.next_out;
-
- /*
- if ((pfile_in_zip_read_info->rest_read_uncompressed ==
- pfile_in_zip_read_info->stream.avail_out) &&
- (pfile_in_zip_read_info->rest_read_compressed == 0))
- flush = Z_FINISH;
- */
- err=inflate(&pfile_in_zip_read_info->stream,flush);
-
- if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
- err = Z_DATA_ERROR;
-
- uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
- uOutThis = uTotalOutAfter-uTotalOutBefore;
-
- pfile_in_zip_read_info->crc32 =
- crc32(pfile_in_zip_read_info->crc32,bufBefore,
- (uInt)(uOutThis));
-
- pfile_in_zip_read_info->rest_read_uncompressed -=
- uOutThis;
-
- iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
-
- if (err==Z_STREAM_END)
- return (iRead==0) ? UNZ_EOF : iRead;
- if (err!=Z_OK)
- break;
- }
- }
-
- if (err==Z_OK)
- return iRead;
- return err;
-}
-
-
-/*
- Give the current position in uncompressed data
-*/
-extern z_off_t ZEXPORT unztell (file)
- unzFile file;
-{
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- pfile_in_zip_read_info=s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info==NULL)
- return UNZ_PARAMERROR;
-
- return (z_off_t)pfile_in_zip_read_info->stream.total_out;
-}
-
-
-/*
- return 1 if the end of file was reached, 0 elsewhere
-*/
-extern int ZEXPORT unzeof (file)
- unzFile file;
-{
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- pfile_in_zip_read_info=s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info==NULL)
- return UNZ_PARAMERROR;
-
- if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
- return 1;
- else
- return 0;
-}
-
-
-
-/*
- Read extra field from the current file (opened by unzOpenCurrentFile)
- This is the local-header version of the extra field (sometimes, there is
- more info in the local-header version than in the central-header)
-
- if buf==NULL, it return the size of the local extra field that can be read
-
- if buf!=NULL, len is the size of the buffer, the extra header is copied in
- buf.
- the return value is the number of bytes copied in buf, or (if <0)
- the error code
-*/
-extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
- unzFile file;
- voidp buf;
- unsigned len;
-{
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- uInt read_now;
- uLong size_to_read;
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- pfile_in_zip_read_info=s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info==NULL)
- return UNZ_PARAMERROR;
-
- size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
- pfile_in_zip_read_info->pos_local_extrafield);
-
- if (buf==NULL)
- return (int)size_to_read;
-
- if (len>size_to_read)
- read_now = (uInt)size_to_read;
- else
- read_now = (uInt)len ;
-
- if (read_now==0)
- return 0;
-
- if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
- pfile_in_zip_read_info->offset_local_extrafield +
- pfile_in_zip_read_info->pos_local_extrafield,
- ZLIB_FILEFUNC_SEEK_SET)!=0)
- return UNZ_ERRNO;
-
- if (ZREAD(pfile_in_zip_read_info->z_filefunc,
- pfile_in_zip_read_info->filestream,
- buf,read_now)!=read_now)
- return UNZ_ERRNO;
-
- return (int)read_now;
-}
-
-/*
- Close the file in zip opened with unzipOpenCurrentFile
- Return UNZ_CRCERROR if all the file was read but the CRC is not good
-*/
-extern int ZEXPORT unzCloseCurrentFile (file)
- unzFile file;
-{
- int err=UNZ_OK;
-
- unz_s* s;
- file_in_zip_read_info_s* pfile_in_zip_read_info;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- pfile_in_zip_read_info=s->pfile_in_zip_read;
-
- if (pfile_in_zip_read_info==NULL)
- return UNZ_PARAMERROR;
-
-
- if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
- (!pfile_in_zip_read_info->raw))
- {
- if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
- err=UNZ_CRCERROR;
- }
-
-
- TRYFREE(pfile_in_zip_read_info->read_buffer);
- pfile_in_zip_read_info->read_buffer = NULL;
- if (pfile_in_zip_read_info->stream_initialised)
- inflateEnd(&pfile_in_zip_read_info->stream);
-
- pfile_in_zip_read_info->stream_initialised = 0;
- TRYFREE(pfile_in_zip_read_info);
-
- s->pfile_in_zip_read=NULL;
-
- return err;
-}
-
-
-/*
- Get the global comment string of the ZipFile, in the szComment buffer.
- uSizeBuf is the size of the szComment buffer.
- return the number of byte copied or an error code <0
-*/
-extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
- unzFile file;
- char *szComment;
- uLong uSizeBuf;
-{
- // int err=UNZ_OK; // Unused [Lance]
- unz_s* s;
- uLong uReadThis ;
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
-
- uReadThis = uSizeBuf;
- if (uReadThis>s->gi.size_comment)
- uReadThis = s->gi.size_comment;
-
- if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
- return UNZ_ERRNO;
-
- if (uReadThis>0)
- {
- *szComment='\0';
- if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
- return UNZ_ERRNO;
- }
-
- if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
- *(szComment+s->gi.size_comment)='\0';
- return (int)uReadThis;
-}
-
-/* Additions by RX '2004 */
-extern uLong ZEXPORT unzGetOffset (file)
- unzFile file;
-{
- unz_s* s;
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
- if (!s->current_file_ok)
- return 0;
- if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
- if (s->num_file==s->gi.number_entry)
- return 0;
- return s->pos_in_central_dir;
-}
-
-extern int ZEXPORT unzSetOffset (file, pos)
- unzFile file;
- uLong pos;
-{
- unz_s* s;
- int err;
-
- if (file==NULL)
- return UNZ_PARAMERROR;
- s=(unz_s*)file;
-
- s->pos_in_central_dir = pos;
- s->num_file = s->gi.number_entry; /* hack */
- err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
- &s->cur_file_info_internal,
- NULL,0,NULL,0,NULL,0);
- s->current_file_ok = (err == UNZ_OK);
- return err;
-}
+/* unzip.c -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Read unzip.h for more info
+*/
+
+/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+compatibility with older software. The following is from the original crypt.c. Code
+woven in by Terry Thorsen 1/2003.
+*/
+/*
+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
+
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
+ (the contents of which are also included in zip.h) for terms of use.
+ If, for some reason, all these files are missing, the Info-ZIP license
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
+*/
+/*
+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+ */
+
+/*
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+# define CASESENSITIVITYDEFAULT_NO
+# endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+
+
+const char unz_copyright[] =
+ " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+ uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+ when reading and decompress it */
+typedef struct
+{
+ char *read_buffer; /* internal buffer for compressed data */
+ z_stream stream; /* zLib stream structure for inflate */
+
+ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
+
+ uLong offset_local_extrafield;/* offset of the local extra field */
+ uInt size_local_extrafield;/* size of the local extra field */
+ uLong pos_local_extrafield; /* position in the local extra field in read*/
+
+ uLong crc32; /* crc32 of all data uncompressed */
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
+ uLong rest_read_compressed; /* number of byte to be decompressed */
+ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ uLong compression_method; /* compression method (0==store) */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ int raw;
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ unz_global_info gi; /* public global information */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ uLong num_file; /* number of the current file in the zipfile*/
+ uLong pos_in_central_dir; /* pos of the current file in the central dir*/
+ uLong current_file_ok; /* flag about the usability of the current file*/
+ uLong central_pos; /* position of the beginning of the central dir*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory with
+ respect to the starting disk number */
+
+ unz_file_info cur_file_info; /* public info about the current file in zip*/
+ unz_file_info_internal cur_file_info_internal; /* private info about it*/
+ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+ file if we are decompressing it */
+ int encrypted;
+# ifndef NOUNCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const unsigned long* pcrc_32_tab;
+# endif
+} unz_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unzlocal_getByte OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ int *pi;
+{
+ unsigned char c;
+ int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return UNZ_OK;
+ }
+ else
+ {
+ if (ZERROR(*pzlib_filefunc_def,filestream))
+ return UNZ_ERRNO;
+ else
+ return UNZ_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unzlocal_getLong OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+ const char* fileName1;
+ const char* fileName2;
+{
+ for (;;)
+ {
+ char c1=*(fileName1++);
+ char c2=*(fileName2++);
+ if ((c1>='a') && (c1<='z'))
+ c1 -= 0x20;
+ if ((c2>='a') && (c2<='z'))
+ c2 -= 0x20;
+ if (c1=='\0')
+ return ((c2=='\0') ? 0 : -1);
+ if (c2=='\0')
+ return 1;
+ if (c1<c2)
+ return -1;
+ if (c1>c2)
+ return 1;
+ }
+}
+
+
+#ifdef CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+ const char* fileName1;
+ const char* fileName2;
+ int iCaseSensitivity;
+{
+ if (iCaseSensitivity==0)
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+ if (iCaseSensitivity==1)
+ return strcmp(fileName1,fileName2);
+
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong unzlocal_SearchCentralDir OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+ "zlib/zlib114.zip".
+ If the zipfile cannot be opened (file doesn't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
+ const char *path;
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ unz_s us;
+ unz_s *s;
+ uLong central_pos,uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err=UNZ_OK;
+
+ if (unz_copyright[0]!=' ')
+ return NULL;
+
+ if (pzlib_filefunc_def==NULL)
+ fill_fopen_filefunc(&us.z_filefunc);
+ else
+ us.z_filefunc = *pzlib_filefunc_def;
+
+ us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
+ path,
+ ZLIB_FILEFUNC_MODE_READ |
+ ZLIB_FILEFUNC_MODE_EXISTING);
+ if (us.filestream==NULL)
+ return NULL;
+
+ central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
+ if (central_pos==0)
+ err=UNZ_ERRNO;
+
+ if (ZSEEK(us.z_filefunc, us.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* zipfile comment length */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==UNZ_OK))
+ err=UNZ_BADZIPFILE;
+
+ if (err!=UNZ_OK)
+ {
+ ZCLOSE(us.z_filefunc, us.filestream);
+ return NULL;
+ }
+
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+ us.encrypted = 0;
+
+
+ s=(unz_s*)ALLOC(sizeof(unz_s));
+ *s=us;
+ unzGoToFirstFile((unzFile)s);
+ return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen (path)
+ const char *path;
+{
+ return unzOpen2(path, NULL);
+}
+
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+ unzFile file;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ if (s->pfile_in_zip_read!=NULL)
+ unzCloseCurrentFile(file);
+
+ ZCLOSE(s->z_filefunc, s->filestream);
+ TRYFREE(s);
+ return UNZ_OK;
+}
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+ unzFile file;
+ unz_global_info *pglobal_info;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ *pglobal_info=s->gi;
+ return UNZ_OK;
+}
+
+
+/*
+ Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+ uLong ulDosDate;
+ tm_unz* ptm;
+{
+ uLong uDate;
+ uDate = (uLong)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+ Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+ unz_file_info *pfile_info,
+ unz_file_info_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+ pfile_info,
+ pfile_info_internal,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ unz_file_info_internal *pfile_info_internal;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ unz_s* s;
+ unz_file_info file_info;
+ unz_file_info_internal file_info_internal;
+ int err=UNZ_OK;
+ uLong uMagic;
+ long lSeek=0;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pos_in_central_dir+s->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+
+ /* we check the magic */
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ lSeek+=file_info.size_filename;
+ if ((err==UNZ_OK) && (szFileName!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_filename<fileNameBufferSize)
+ {
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
+ }
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ lSeek -= uSizeRead;
+ }
+
+
+ if ((err==UNZ_OK) && (extraField!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (lSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ lSeek += file_info.size_file_extra - uSizeRead;
+ }
+ else
+ lSeek+=file_info.size_file_extra;
+
+
+ if ((err==UNZ_OK) && (szComment!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
+ {
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
+ }
+ else
+ uSizeRead = commentBufferSize;
+
+ if (lSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ lSeek+=file_info.size_file_comment - uSizeRead;
+ }
+ else
+ lSeek+=file_info.size_file_comment;
+
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
+
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+ pfile_info,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+}
+
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ s->pos_in_central_dir=s->offset_central_dir;
+ s->num_file=0;
+ err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+ unzFile file;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
+ if (s->num_file+1==s->gi.number_entry)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+ s->num_file++;
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+ unzFile file;
+ const char *szFileName;
+ int iCaseSensitivity;
+{
+ unz_s* s;
+ int err;
+
+ /* We remember the 'current' position in the file so that we can jump
+ * back there if we fail.
+ */
+ unz_file_info cur_file_infoSaved;
+ unz_file_info_internal cur_file_info_internalSaved;
+ uLong num_fileSaved;
+ uLong pos_in_central_dirSaved;
+
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+ return UNZ_PARAMERROR;
+
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ /* Save the current state */
+ num_fileSaved = s->num_file;
+ pos_in_central_dirSaved = s->pos_in_central_dir;
+ cur_file_infoSaved = s->cur_file_info;
+ cur_file_info_internalSaved = s->cur_file_info_internal;
+
+ err = unzGoToFirstFile(file);
+
+ while (err == UNZ_OK)
+ {
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ err = unzGetCurrentFileInfo(file,NULL,
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
+ NULL,0,NULL,0);
+ if (err == UNZ_OK)
+ {
+ if (unzStringFileNameCompare(szCurrentFileName,
+ szFileName,iCaseSensitivity)==0)
+ return UNZ_OK;
+ err = unzGoToNextFile(file);
+ }
+ }
+
+ /* We failed, so restore the state of the 'current file' to where we
+ * were.
+ */
+ s->num_file = num_fileSaved ;
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
+ s->cur_file_info = cur_file_infoSaved;
+ s->cur_file_info_internal = cur_file_info_internalSaved;
+ return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; // offset in file
+ uLong num_of_file; // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ file_pos->pos_in_zip_directory = s->pos_in_central_dir;
+ file_pos->num_of_file = s->num_file;
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzGoToFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ /* jump to the right spot */
+ s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+ s->num_file = file_pos->num_of_file;
+
+ /* set the current file */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ /* return results */
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+ Read the local header of the current zipfile
+ Check the coherency of the local header and info in the end of central
+ directory about this file
+ store in *piSizeVar the size of extra info in local header
+ (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+ poffset_local_extrafield,
+ psize_local_extrafield)
+ unz_s* s;
+ uInt* piSizeVar;
+ uLong *poffset_local_extrafield;
+ uInt *psize_local_extrafield;
+{
+ uLong uMagic,uData,uFlags;
+ uLong size_filename;
+ uLong size_extra_field;
+ int err=UNZ_OK;
+
+ *piSizeVar = 0;
+ *poffset_local_extrafield = 0;
+ *psize_local_extrafield = 0;
+
+ if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+ s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x04034b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+/*
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+ err=UNZ_BADZIPFILE;
+*/
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+ err=UNZ_BADZIPFILE;
+
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+ err=UNZ_BADZIPFILE;
+
+ *piSizeVar += (uInt)size_filename;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+ err=UNZ_ERRNO;
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+ SIZEZIPLOCALHEADER + size_filename;
+ *psize_local_extrafield = (uInt)size_extra_field;
+
+ *piSizeVar += (uInt)size_extra_field;
+
+ return err;
+}
+
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+ const char* password;
+{
+ int err=UNZ_OK;
+ uInt iSizeVar;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uLong offset_local_extrafield; /* offset of the local extra field */
+ uInt size_local_extrafield; /* size of the local extra field */
+# ifndef NOUNCRYPT
+ char source[12];
+# else
+ if (password != NULL)
+ return UNZ_PARAMERROR;
+# endif
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_PARAMERROR;
+
+ if (s->pfile_in_zip_read != NULL)
+ unzCloseCurrentFile(file);
+
+ if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+ &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+ return UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+ ALLOC(sizeof(file_in_zip_read_info_s));
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_INTERNALERROR;
+
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+ pfile_in_zip_read_info->pos_local_extrafield=0;
+ pfile_in_zip_read_info->raw=raw;
+
+ if (pfile_in_zip_read_info->read_buffer==NULL)
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return UNZ_INTERNALERROR;
+ }
+
+ pfile_in_zip_read_info->stream_initialised=0;
+
+ if (method!=NULL)
+ *method = (int)s->cur_file_info.compression_method;
+
+ if (level!=NULL)
+ {
+ *level = 6;
+ switch (s->cur_file_info.flag & 0x06)
+ {
+ case 6 : *level = 1; break;
+ case 4 : *level = 2; break;
+ case 2 : *level = 9; break;
+ }
+ }
+
+ if ((s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+ pfile_in_zip_read_info->crc32=0;
+ pfile_in_zip_read_info->compression_method =
+ s->cur_file_info.compression_method;
+ pfile_in_zip_read_info->filestream=s->filestream;
+ pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+ pfile_in_zip_read_info->stream.total_out = 0;
+
+ if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
+ (!raw))
+ {
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+ pfile_in_zip_read_info->stream.avail_in = 0;
+
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=1;
+ else
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return err;
+ }
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * size of both compressed and uncompressed data
+ */
+ }
+ pfile_in_zip_read_info->rest_read_compressed =
+ s->cur_file_info.compressed_size ;
+ pfile_in_zip_read_info->rest_read_uncompressed =
+ s->cur_file_info.uncompressed_size ;
+
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+ iSizeVar;
+
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
+
+# ifndef NOUNCRYPT
+ if (password != NULL)
+ {
+ int i;
+ s->pcrc_32_tab = get_crc_table();
+ init_keys(password,s->keys,s->pcrc_32_tab);
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pfile_in_zip_read->pos_in_zipfile +
+ s->pfile_in_zip_read->byte_before_the_zipfile,
+ SEEK_SET)!=0)
+ return UNZ_INTERNALERROR;
+ if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
+ return UNZ_INTERNALERROR;
+
+ for (i = 0; i<12; i++)
+ zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+ s->pfile_in_zip_read->pos_in_zipfile+=12;
+ s->encrypted=1;
+ }
+# endif
+
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (file)
+ unzFile file;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
+ unzFile file;
+ const char* password;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+{
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/*
+ Read bytes from the current file.
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile (file, buf, len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ int err=UNZ_OK;
+ uInt iRead = 0;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->read_buffer == NULL))
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (len==0)
+ return 0;
+
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+ if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+ (!(pfile_in_zip_read_info->raw)))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+ if ((len>pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in) &&
+ (pfile_in_zip_read_info->raw))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in;
+
+ while (pfile_in_zip_read_info->stream.avail_out>0)
+ {
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+ (pfile_in_zip_read_info->rest_read_compressed>0))
+ {
+ uInt uReadThis = UNZ_BUFSIZE;
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+ if (uReadThis == 0)
+ return UNZ_EOF;
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->read_buffer,
+ uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+
+
+# ifndef NOUNCRYPT
+ if(s->encrypted)
+ {
+ uInt i;
+ for(i=0;i<uReadThis;i++)
+ pfile_in_zip_read_info->read_buffer[i] =
+ zdecode(s->keys,s->pcrc_32_tab,
+ pfile_in_zip_read_info->read_buffer[i]);
+ }
+# endif
+
+
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+ pfile_in_zip_read_info->stream.next_in =
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+ }
+
+ if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+ {
+ uInt uDoCopy,i ;
+
+ if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ return (iRead==0) ? UNZ_EOF : iRead;
+
+ if (pfile_in_zip_read_info->stream.avail_out <
+ pfile_in_zip_read_info->stream.avail_in)
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+ else
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+ for (i=0;i<uDoCopy;i++)
+ *(pfile_in_zip_read_info->stream.next_out+i) =
+ *(pfile_in_zip_read_info->stream.next_in+i);
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+ pfile_in_zip_read_info->stream.next_out,
+ uDoCopy);
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
+ iRead += uDoCopy;
+ }
+ else
+ {
+ uLong uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ uLong uOutThis;
+ int flush=Z_SYNC_FLUSH;
+
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+ /*
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+ pfile_in_zip_read_info->stream.avail_out) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ flush = Z_FINISH;
+ */
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+ if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+ err = Z_DATA_ERROR;
+
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->crc32 =
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
+ (uInt)(uOutThis));
+
+ pfile_in_zip_read_info->rest_read_uncompressed -=
+ uOutThis;
+
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ if (err==Z_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=Z_OK)
+ break;
+ }
+ }
+
+ if (err==Z_OK)
+ return iRead;
+ return err;
+}
+
+
+/*
+ Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field that can be read
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uInt read_now;
+ uLong size_to_read;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ pfile_in_zip_read_info->pos_local_extrafield);
+
+ if (buf==NULL)
+ return (int)size_to_read;
+
+ if (len>size_to_read)
+ read_now = (uInt)size_to_read;
+ else
+ read_now = (uInt)len ;
+
+ if (read_now==0)
+ return 0;
+
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->pos_local_extrafield,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ buf,read_now)!=read_now)
+ return UNZ_ERRNO;
+
+ return (int)read_now;
+}
+
+/*
+ Close the file in zip opened with unzipOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+ (!pfile_in_zip_read_info->raw))
+ {
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+ err=UNZ_CRCERROR;
+ }
+
+
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
+ pfile_in_zip_read_info->read_buffer = NULL;
+ if (pfile_in_zip_read_info->stream_initialised)
+ inflateEnd(&pfile_in_zip_read_info->stream);
+
+ pfile_in_zip_read_info->stream_initialised = 0;
+ TRYFREE(pfile_in_zip_read_info);
+
+ s->pfile_in_zip_read=NULL;
+
+ return err;
+}
+
+
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+ unzFile file;
+ char *szComment;
+ uLong uSizeBuf;
+{
+ // int err=UNZ_OK; // Unused [Lance]
+ unz_s* s;
+ uLong uReadThis ;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ uReadThis = uSizeBuf;
+ if (uReadThis>s->gi.size_comment)
+ uReadThis = s->gi.size_comment;
+
+ if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (uReadThis>0)
+ {
+ *szComment='\0';
+ if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+ }
+
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+ *(szComment+s->gi.size_comment)='\0';
+ return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern uLong ZEXPORT unzGetOffset (file)
+ unzFile file;
+{
+ unz_s* s;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return 0;
+ if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+ if (s->num_file==s->gi.number_entry)
+ return 0;
+ return s->pos_in_central_dir;
+}
+
+extern int ZEXPORT unzSetOffset (file, pos)
+ unzFile file;
+ uLong pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ s->pos_in_central_dir = pos;
+ s->num_file = s->gi.number_entry; /* hack */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
diff --git a/src/zlib/unzip.h b/src/zlib/unzip.h
index c3206a058..b247937c8 100644
--- a/src/zlib/unzip.h
+++ b/src/zlib/unzip.h
@@ -1,354 +1,354 @@
-/* unzip.h -- IO for uncompress .zip files using zlib
- Version 1.01e, February 12th, 2005
-
- Copyright (C) 1998-2005 Gilles Vollant
-
- This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
- WinZip, InfoZip tools and compatible.
-
- Multi volume ZipFile (span) are not supported.
- Encryption compatible with pkzip 2.04g only supported
- Old compressions used by old PKZip 1.x are not supported
-
-
- I WAIT FEEDBACK at mail info@winimage.com
- Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
-
- Condition of use and distribution are the same than zlib :
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
-
-*/
-
-/* for more info about .ZIP format, see
- http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
- http://www.info-zip.org/pub/infozip/doc/
- PkWare has also a specification at :
- ftp://ftp.pkware.com/probdesc.zip
-*/
-
-#ifndef _unz_H
-#define _unz_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _ZLIB_H
-#include "zlib.h"
-#endif
-
-#ifndef _ZLIBIOAPI_H
-#include "ioapi.h"
-#endif
-
-#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
-/* like the STRICT of WIN32, we define a pointer that cannot be converted
- from (void*) without cast */
-typedef struct TagunzFile__ { int unused; } unzFile__;
-typedef unzFile__ *unzFile;
-#else
-typedef voidp unzFile;
-#endif
-
-
-#define UNZ_OK (0)
-#define UNZ_END_OF_LIST_OF_FILE (-100)
-#define UNZ_ERRNO (Z_ERRNO)
-#define UNZ_EOF (0)
-#define UNZ_PARAMERROR (-102)
-#define UNZ_BADZIPFILE (-103)
-#define UNZ_INTERNALERROR (-104)
-#define UNZ_CRCERROR (-105)
-
-/* tm_unz contain date/time info */
-typedef struct tm_unz_s
-{
- uInt tm_sec; /* seconds after the minute - [0,59] */
- uInt tm_min; /* minutes after the hour - [0,59] */
- uInt tm_hour; /* hours since midnight - [0,23] */
- uInt tm_mday; /* day of the month - [1,31] */
- uInt tm_mon; /* months since January - [0,11] */
- uInt tm_year; /* years - [1980..2044] */
-} tm_unz;
-
-/* unz_global_info structure contain global data about the ZIPfile
- These data comes from the end of central dir */
-typedef struct unz_global_info_s
-{
- uLong number_entry; /* total number of entries in
- the central dir on this disk */
- uLong size_comment; /* size of the global comment of the zipfile */
-} unz_global_info;
-
-
-/* unz_file_info contain information about a file in the zipfile */
-typedef struct unz_file_info_s
-{
- uLong version; /* version made by 2 bytes */
- uLong version_needed; /* version needed to extract 2 bytes */
- uLong flag; /* general purpose bit flag 2 bytes */
- uLong compression_method; /* compression method 2 bytes */
- uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
- uLong crc; /* crc-32 4 bytes */
- uLong compressed_size; /* compressed size 4 bytes */
- uLong uncompressed_size; /* uncompressed size 4 bytes */
- uLong size_filename; /* filename length 2 bytes */
- uLong size_file_extra; /* extra field length 2 bytes */
- uLong size_file_comment; /* file comment length 2 bytes */
-
- uLong disk_num_start; /* disk number start 2 bytes */
- uLong internal_fa; /* internal file attributes 2 bytes */
- uLong external_fa; /* external file attributes 4 bytes */
-
- tm_unz tmu_date;
-} unz_file_info;
-
-extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
- const char* fileName2,
- int iCaseSensitivity));
-/*
- Compare two filename (fileName1,fileName2).
- If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
- If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
- or strcasecmp)
- If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
- (like 1 on Unix, 2 on Windows)
-*/
-
-
-extern unzFile ZEXPORT unzOpen OF((const char *path));
-/*
- Open a Zip file. path contain the full pathname (by example,
- on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
- "zlib/zlib113.zip".
- If the zipfile cannot be opened (file don't exist or in not valid), the
- return value is NULL.
- Else, the return value is a unzFile Handle, usable with other function
- of this unzip package.
-*/
-
-extern unzFile ZEXPORT unzOpen2 OF((const char *path,
- zlib_filefunc_def* pzlib_filefunc_def));
-/*
- Open a Zip file, like unzOpen, but provide a set of file low level API
- for read/write the zip file (see ioapi.h)
-*/
-
-extern int ZEXPORT unzClose OF((unzFile file));
-/*
- Close a ZipFile opened with unzipOpen.
- If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
- these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
- return UNZ_OK if there is no problem. */
-
-extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
- unz_global_info *pglobal_info));
-/*
- Write info about the ZipFile in the *pglobal_info structure.
- No preparation of the structure is needed
- return UNZ_OK if there is no problem. */
-
-
-extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
- char *szComment,
- uLong uSizeBuf));
-/*
- Get the global comment string of the ZipFile, in the szComment buffer.
- uSizeBuf is the size of the szComment buffer.
- return the number of byte copied or an error code <0
-*/
-
-
-/***************************************************************************/
-/* Unzip package allow you browse the directory of the zipfile */
-
-extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
-/*
- Set the current file of the zipfile to the first file.
- return UNZ_OK if there is no problem
-*/
-
-extern int ZEXPORT unzGoToNextFile OF((unzFile file));
-/*
- Set the current file of the zipfile to the next file.
- return UNZ_OK if there is no problem
- return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
-*/
-
-extern int ZEXPORT unzLocateFile OF((unzFile file,
- const char *szFileName,
- int iCaseSensitivity));
-/*
- Try locate the file szFileName in the zipfile.
- For the iCaseSensitivity signification, see unzStringFileNameCompare
-
- return value :
- UNZ_OK if the file is found. It becomes the current file.
- UNZ_END_OF_LIST_OF_FILE if the file is not found
-*/
-
-
-/* ****************************************** */
-/* Ryan supplied functions */
-/* unz_file_info contain information about a file in the zipfile */
-typedef struct unz_file_pos_s
-{
- uLong pos_in_zip_directory; /* offset in zip file directory */
- uLong num_of_file; /* # of file */
-} unz_file_pos;
-
-extern int ZEXPORT unzGetFilePos(
- unzFile file,
- unz_file_pos* file_pos);
-
-extern int ZEXPORT unzGoToFilePos(
- unzFile file,
- unz_file_pos* file_pos);
-
-/* ****************************************** */
-
-extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
- unz_file_info *pfile_info,
- char *szFileName,
- uLong fileNameBufferSize,
- void *extraField,
- uLong extraFieldBufferSize,
- char *szComment,
- uLong commentBufferSize));
-/*
- Get Info about the current file
- if pfile_info!=NULL, the *pfile_info structure will contain somes info about
- the current file
- if szFileName!=NULL, the filemane string will be copied in szFileName
- (fileNameBufferSize is the size of the buffer)
- if extraField!=NULL, the extra field information will be copied in extraField
- (extraFieldBufferSize is the size of the buffer).
- This is the Central-header version of the extra field
- if szComment!=NULL, the comment string of the file will be copied in szComment
- (commentBufferSize is the size of the buffer)
-*/
-
-/***************************************************************************/
-/* for reading the content of the current zipfile, you can open it, read data
- from it, and close it (you can close it before reading all the file)
- */
-
-extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
-/*
- Open for reading data the current file in the zipfile.
- If there is no error, the return value is UNZ_OK.
-*/
-
-extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
- const char* password));
-/*
- Open for reading data the current file in the zipfile.
- password is a crypting password
- If there is no error, the return value is UNZ_OK.
-*/
-
-extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
- int* method,
- int* level,
- int raw));
-/*
- Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
- if raw==1
- *method will receive method of compression, *level will receive level of
- compression
- note : you can set level parameter as NULL (if you did not want known level,
- but you CANNOT set method parameter as NULL
-*/
-
-extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
- int* method,
- int* level,
- int raw,
- const char* password));
-/*
- Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
- if raw==1
- *method will receive method of compression, *level will receive level of
- compression
- note : you can set level parameter as NULL (if you did not want known level,
- but you CANNOT set method parameter as NULL
-*/
-
-
-extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
-/*
- Close the file in zip opened with unzOpenCurrentFile
- Return UNZ_CRCERROR if all the file was read but the CRC is not good
-*/
-
-extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
- voidp buf,
- unsigned len));
-/*
- Read bytes from the current file (opened by unzOpenCurrentFile)
- buf contain buffer where data must be copied
- len the size of buf.
-
- return the number of byte copied if somes bytes are copied
- return 0 if the end of file was reached
- return <0 with error code if there is an error
- (UNZ_ERRNO for IO error, or zLib error for uncompress error)
-*/
-
-extern z_off_t ZEXPORT unztell OF((unzFile file));
-/*
- Give the current position in uncompressed data
-*/
-
-extern int ZEXPORT unzeof OF((unzFile file));
-/*
- return 1 if the end of file was reached, 0 elsewhere
-*/
-
-extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
- voidp buf,
- unsigned len));
-/*
- Read extra field from the current file (opened by unzOpenCurrentFile)
- This is the local-header version of the extra field (sometimes, there is
- more info in the local-header version than in the central-header)
-
- if buf==NULL, it return the size of the local extra field
-
- if buf!=NULL, len is the size of the buffer, the extra header is copied in
- buf.
- the return value is the number of bytes copied in buf, or (if <0)
- the error code
-*/
-
-/***************************************************************************/
-
-/* Get the current file offset */
-extern uLong ZEXPORT unzGetOffset (unzFile file);
-
-/* Set the current file offset */
-extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _unz_H */
+/* unzip.h -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+
+ Multi volume ZipFile (span) are not supported.
+ Encryption compatible with pkzip 2.04g only supported
+ Old compressions used by old PKZip 1.x are not supported
+
+
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+ http://www.info-zip.org/pub/infozip/doc/
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (Z_ERRNO)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+ uLong number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ uLong compressed_size; /* compressed size 4 bytes */
+ uLong uncompressed_size; /* uncompressed size 4 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity));
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((const char *path));
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
+ "zlib/zlib113.zip".
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+
+extern unzFile ZEXPORT unzOpen2 OF((const char *path,
+ zlib_filefunc_def* pzlib_filefunc_def));
+/*
+ Open a Zip file, like unzOpen, but provide a set of file low level API
+ for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+ unz_global_info *pglobal_info));
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+ char *szComment,
+ uLong uSizeBuf));
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+ const char *szFileName,
+ int iCaseSensitivity));
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; /* offset in zip file directory */
+ uLong num_of_file; /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+ unz_file_info *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+/*
+ Get Info about the current file
+ if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+ the current file
+ if szFileName!=NULL, the filemane string will be copied in szFileName
+ (fileNameBufferSize is the size of the buffer)
+ if extraField!=NULL, the extra field information will be copied in extraField
+ (extraFieldBufferSize is the size of the buffer).
+ This is the Central-header version of the extra field
+ if szComment!=NULL, the comment string of the file will be copied in szComment
+ (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+ from it, and close it (you can close it before reading all the file)
+ */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+ const char* password));
+/*
+ Open for reading data the current file in the zipfile.
+ password is a crypting password
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw,
+ const char* password));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read bytes from the current file (opened by unzOpenCurrentFile)
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+ Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern uLong ZEXPORT unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
diff --git a/src/zlib/zconf.h b/src/zlib/zconf.h
index e3b0c962e..03a9431c8 100644
--- a/src/zlib/zconf.h
+++ b/src/zlib/zconf.h
@@ -1,332 +1,332 @@
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2005 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#ifndef ZCONF_H
-#define ZCONF_H
-
-/*
- * If you *really* need a unique prefix for all types and library functions,
- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
- */
-#ifdef Z_PREFIX
-# define deflateInit_ z_deflateInit_
-# define deflate z_deflate
-# define deflateEnd z_deflateEnd
-# define inflateInit_ z_inflateInit_
-# define inflate z_inflate
-# define inflateEnd z_inflateEnd
-# define deflateInit2_ z_deflateInit2_
-# define deflateSetDictionary z_deflateSetDictionary
-# define deflateCopy z_deflateCopy
-# define deflateReset z_deflateReset
-# define deflateParams z_deflateParams
-# define deflateBound z_deflateBound
-# define deflatePrime z_deflatePrime
-# define inflateInit2_ z_inflateInit2_
-# define inflateSetDictionary z_inflateSetDictionary
-# define inflateSync z_inflateSync
-# define inflateSyncPoint z_inflateSyncPoint
-# define inflateCopy z_inflateCopy
-# define inflateReset z_inflateReset
-# define inflateBack z_inflateBack
-# define inflateBackEnd z_inflateBackEnd
-# define compress z_compress
-# define compress2 z_compress2
-# define compressBound z_compressBound
-# define uncompress z_uncompress
-# define adler32 z_adler32
-# define crc32 z_crc32
-# define get_crc_table z_get_crc_table
-# define zError z_zError
-
-# define alloc_func z_alloc_func
-# define free_func z_free_func
-# define in_func z_in_func
-# define out_func z_out_func
-# define Byte z_Byte
-# define uInt z_uInt
-# define uLong z_uLong
-# define Bytef z_Bytef
-# define charf z_charf
-# define intf z_intf
-# define uIntf z_uIntf
-# define uLongf z_uLongf
-# define voidpf z_voidpf
-# define voidp z_voidp
-#endif
-
-#if defined(__MSDOS__) && !defined(MSDOS)
-# define MSDOS
-#endif
-#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
-# define OS2
-#endif
-#if defined(_WINDOWS) && !defined(WINDOWS)
-# define WINDOWS
-#endif
-#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
-# ifndef WIN32
-# define WIN32
-# endif
-#endif
-#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
-# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
-# ifndef SYS16BIT
-# define SYS16BIT
-# endif
-# endif
-#endif
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- */
-#ifdef SYS16BIT
-# define MAXSEG_64K
-#endif
-#ifdef MSDOS
-# define UNALIGNED_OK
-#endif
-
-#ifdef __STDC_VERSION__
-# ifndef STDC
-# define STDC
-# endif
-# if __STDC_VERSION__ >= 199901L
-# ifndef STDC99
-# define STDC99
-# endif
-# endif
-#endif
-#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
-# define STDC
-#endif
-
-#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
-# define STDC
-#endif
-
-#ifndef STDC
-# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
-# define const /* note: need a more gentle solution here */
-# endif
-#endif
-
-/* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
-# define NO_DUMMY_DECL
-#endif
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-# ifdef MAXSEG_64K
-# define MAX_MEM_LEVEL 8
-# else
-# define MAX_MEM_LEVEL 9
-# endif
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2.
- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
- * created by gzip. (Files created by minigzip can still be extracted by
- * gzip.)
- */
-#ifndef MAX_WBITS
-# define MAX_WBITS 15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
- (1 << (windowBits+2)) + (1 << (memLevel+9))
- that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
- make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
- The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
- /* Type declarations */
-
-#ifndef OF /* function prototypes */
-# ifdef STDC
-# define OF(args) args
-# else
-# define OF(args) ()
-# endif
-#endif
-
-/* The following definitions for FAR are needed only for MSDOS mixed
- * model programming (small or medium model with some far allocations).
- * This was tested only with MSC; for other MSDOS compilers you may have
- * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
- * just define FAR to be empty.
- */
-#ifdef SYS16BIT
-# if defined(M_I86SM) || defined(M_I86MM)
- /* MSC small or medium model */
-# define SMALL_MEDIUM
-# ifdef _MSC_VER
-# define FAR _far
-# else
-# define FAR far
-# endif
-# endif
-# if (defined(__SMALL__) || defined(__MEDIUM__))
- /* Turbo C small or medium model */
-# define SMALL_MEDIUM
-# ifdef __BORLANDC__
-# define FAR _far
-# else
-# define FAR far
-# endif
-# endif
-#endif
-
-#if defined(WINDOWS) || defined(WIN32)
- /* If building or using zlib as a DLL, define ZLIB_DLL.
- * This is not mandatory, but it offers a little performance increase.
- */
-# ifdef ZLIB_DLL
-# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
-# ifdef ZLIB_INTERNAL
-# define ZEXTERN extern __declspec(dllexport)
-# else
-# define ZEXTERN extern __declspec(dllimport)
-# endif
-# endif
-# endif /* ZLIB_DLL */
- /* If building or using zlib with the WINAPI/WINAPIV calling convention,
- * define ZLIB_WINAPI.
- * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
- */
-# ifdef ZLIB_WINAPI
-# ifdef FAR
-# undef FAR
-# endif
-# include <windows.h>
- /* No need for _export, use ZLIB.DEF instead. */
- /* For complete Windows compatibility, use WINAPI, not __stdcall. */
-# define ZEXPORT WINAPI
-# ifdef WIN32
-# define ZEXPORTVA WINAPIV
-# else
-# define ZEXPORTVA FAR CDECL
-# endif
-# endif
-#endif
-
-#if defined (__BEOS__)
-# ifdef ZLIB_DLL
-# ifdef ZLIB_INTERNAL
-# define ZEXPORT __declspec(dllexport)
-# define ZEXPORTVA __declspec(dllexport)
-# else
-# define ZEXPORT __declspec(dllimport)
-# define ZEXPORTVA __declspec(dllimport)
-# endif
-# endif
-#endif
-
-#ifndef ZEXTERN
-# define ZEXTERN extern
-#endif
-#ifndef ZEXPORT
-# define ZEXPORT
-#endif
-#ifndef ZEXPORTVA
-# define ZEXPORTVA
-#endif
-
-#ifndef FAR
-# define FAR
-#endif
-
-#if !defined(__MACTYPES__)
-typedef unsigned char Byte; /* 8 bits */
-#endif
-typedef unsigned int uInt; /* 16 bits or more */
-typedef unsigned long uLong; /* 32 bits or more */
-
-#ifdef SMALL_MEDIUM
- /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
-# define Bytef Byte FAR
-#else
- typedef Byte FAR Bytef;
-#endif
-typedef char FAR charf;
-typedef int FAR intf;
-typedef uInt FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
- typedef void const *voidpc;
- typedef void FAR *voidpf;
- typedef void *voidp;
-#else
- typedef Byte const *voidpc;
- typedef Byte FAR *voidpf;
- typedef Byte *voidp;
-#endif
-
-#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
-# include <sys/types.h> /* for off_t */
-# include <unistd.h> /* for SEEK_* and off_t */
-# ifdef VMS
-# include <unixio.h> /* for off_t */
-# endif
-# define z_off_t off_t
-#endif
-#ifndef SEEK_SET
-# define SEEK_SET 0 /* Seek from beginning of file. */
-# define SEEK_CUR 1 /* Seek from current position. */
-# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
-#endif
-#ifndef z_off_t
-# define z_off_t long
-#endif
-
-#if defined(__OS400__)
-# define NO_vsnprintf
-#endif
-
-#if defined(__MVS__)
-# define NO_vsnprintf
-# ifdef FAR
-# undef FAR
-# endif
-#endif
-
-/* MVS linker does not support external names larger than 8 bytes */
-#if defined(__MVS__)
-# pragma map(deflateInit_,"DEIN")
-# pragma map(deflateInit2_,"DEIN2")
-# pragma map(deflateEnd,"DEEND")
-# pragma map(deflateBound,"DEBND")
-# pragma map(inflateInit_,"ININ")
-# pragma map(inflateInit2_,"ININ2")
-# pragma map(inflateEnd,"INEND")
-# pragma map(inflateSync,"INSY")
-# pragma map(inflateSetDictionary,"INSEDI")
-# pragma map(compressBound,"CMBND")
-# pragma map(inflate_table,"INTABL")
-# pragma map(inflate_fast,"INFA")
-# pragma map(inflate_copyright,"INCOPY")
-#endif
-
-#endif /* ZCONF_H */
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+# define deflateInit_ z_deflateInit_
+# define deflate z_deflate
+# define deflateEnd z_deflateEnd
+# define inflateInit_ z_inflateInit_
+# define inflate z_inflate
+# define inflateEnd z_inflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateCopy z_deflateCopy
+# define deflateReset z_deflateReset
+# define deflateParams z_deflateParams
+# define deflateBound z_deflateBound
+# define deflatePrime z_deflatePrime
+# define inflateInit2_ z_inflateInit2_
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateCopy z_inflateCopy
+# define inflateReset z_inflateReset
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# define uncompress z_uncompress
+# define adler32 z_adler32
+# define crc32 z_crc32
+# define get_crc_table z_get_crc_table
+# define zError z_zError
+
+# define alloc_func z_alloc_func
+# define free_func z_free_func
+# define in_func z_in_func
+# define out_func z_out_func
+# define Byte z_Byte
+# define uInt z_uInt
+# define uLong z_uLong
+# define Bytef z_Bytef
+# define charf z_charf
+# define intf z_intf
+# define uIntf z_uIntf
+# define uLongf z_uLongf
+# define voidpf z_voidpf
+# define voidp z_voidp
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
+# include <sys/types.h> /* for off_t */
+# include <unistd.h> /* for SEEK_* and off_t */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if defined(__OS400__)
+# define NO_vsnprintf
+#endif
+
+#if defined(__MVS__)
+# define NO_vsnprintf
+# ifdef FAR
+# undef FAR
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+# pragma map(deflateInit_,"DEIN")
+# pragma map(deflateInit2_,"DEIN2")
+# pragma map(deflateEnd,"DEEND")
+# pragma map(deflateBound,"DEBND")
+# pragma map(inflateInit_,"ININ")
+# pragma map(inflateInit2_,"ININ2")
+# pragma map(inflateEnd,"INEND")
+# pragma map(inflateSync,"INSY")
+# pragma map(inflateSetDictionary,"INSEDI")
+# pragma map(compressBound,"CMBND")
+# pragma map(inflate_table,"INTABL")
+# pragma map(inflate_fast,"INFA")
+# pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/src/zlib/zlib.h b/src/zlib/zlib.h
index 62d0e4675..022817927 100644
--- a/src/zlib/zlib.h
+++ b/src/zlib/zlib.h
@@ -1,1357 +1,1357 @@
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.3, July 18th, 2005
-
- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-
- The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
-*/
-
-#ifndef ZLIB_H
-#define ZLIB_H
-
-#include "zconf.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_VERSION "1.2.3"
-#define ZLIB_VERNUM 0x1230
-
-/*
- The 'zlib' compression library provides in-memory compression and
- decompression functions, including integrity checks of the uncompressed
- data. This version of the library supports only one compression method
- (deflation) but other algorithms will be added later and will have the same
- stream interface.
-
- Compression can be done in a single step if the buffers are large
- enough (for example if an input file is mmap'ed), or can be done by
- repeated calls of the compression function. In the latter case, the
- application must provide more input and/or consume the output
- (providing more output space) before each call.
-
- The compressed data format used by default by the in-memory functions is
- the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
- around a deflate stream, which is itself documented in RFC 1951.
-
- The library also supports reading and writing files in gzip (.gz) format
- with an interface similar to that of stdio using the functions that start
- with "gz". The gzip format is different from the zlib format. gzip is a
- gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
-
- This library can optionally read and write gzip streams in memory as well.
-
- The zlib format was designed to be compact and fast for use in memory
- and on communications channels. The gzip format was designed for single-
- file compression on file systems, has a larger header than zlib to maintain
- directory information, and uses a different, slower check method than zlib.
-
- The library does not install any signal handler. The decoder checks
- the consistency of the compressed data, so the library should never
- crash even in case of corrupted input.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void (*free_func) OF((voidpf opaque, voidpf address));
-
-struct internal_state;
-
-typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
- uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
-
- Bytef *next_out; /* next output byte should be put there */
- uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
-
- char *msg; /* last error message, NULL if no error */
- struct internal_state FAR *state; /* not visible by applications */
-
- alloc_func zalloc; /* used to allocate the internal state */
- free_func zfree; /* used to free the internal state */
- voidpf opaque; /* private data object passed to zalloc and zfree */
-
- int data_type; /* best guess about the data type: binary or text */
- uLong adler; /* adler32 value of the uncompressed data */
- uLong reserved; /* reserved for future use */
-} z_stream;
-
-typedef z_stream FAR *z_streamp;
-
-/*
- gzip header information passed to and from zlib routines. See RFC 1952
- for more details on the meanings of these fields.
-*/
-typedef struct gz_header_s {
- int text; /* true if compressed data believed to be text */
- uLong time; /* modification time */
- int xflags; /* extra flags (not used when writing a gzip file) */
- int os; /* operating system */
- Bytef *extra; /* pointer to extra field or Z_NULL if none */
- uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
- uInt extra_max; /* space at extra (only when reading header) */
- Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
- uInt name_max; /* space at name (only when reading header) */
- Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
- uInt comm_max; /* space at comment (only when reading header) */
- int hcrc; /* true if there was or will be a header crc */
- int done; /* true when done reading gzip header (not used
- when writing a gzip file) */
-} gz_header;
-
-typedef gz_header FAR *gz_headerp;
-
-/*
- The application must update next_in and avail_in when avail_in has
- dropped to zero. It must update next_out and avail_out when avail_out
- has dropped to zero. The application must initialize zalloc, zfree and
- opaque before calling the init function. All other fields are set by the
- compression library and must not be updated by the application.
-
- The opaque value provided by the application will be passed as the first
- parameter for calls of zalloc and zfree. This can be useful for custom
- memory management. The compression library attaches no meaning to the
- opaque value.
-
- zalloc must return Z_NULL if there is not enough memory for the object.
- If zlib is used in a multi-threaded application, zalloc and zfree must be
- thread safe.
-
- On 16-bit systems, the functions zalloc and zfree must be able to allocate
- exactly 65536 bytes, but will not be required to allocate more than this
- if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
- pointers returned by zalloc for objects of exactly 65536 bytes *must*
- have their offset normalized to zero. The default allocation function
- provided by this library ensures this (see zutil.c). To reduce memory
- requirements and avoid any allocation of 64K objects, at the expense of
- compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
- The fields total_in and total_out can be used for statistics or
- progress reports. After compression, total_in holds the total size of
- the uncompressed data and may be saved for use in the decompressor
- (particularly if the decompressor wants to decompress everything in
- a single step).
-*/
-
- /* constants */
-
-#define Z_NO_FLUSH 0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
-#define Z_SYNC_FLUSH 2
-#define Z_FULL_FLUSH 3
-#define Z_FINISH 4
-#define Z_BLOCK 5
-/* Allowed flush values; see deflate() and inflate() below for details */
-
-#define Z_OK 0
-#define Z_STREAM_END 1
-#define Z_NEED_DICT 2
-#define Z_ERRNO (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR (-3)
-#define Z_MEM_ERROR (-4)
-#define Z_BUF_ERROR (-5)
-#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
- */
-
-#define Z_NO_COMPRESSION 0
-#define Z_BEST_SPEED 1
-#define Z_BEST_COMPRESSION 9
-#define Z_DEFAULT_COMPRESSION (-1)
-/* compression levels */
-
-#define Z_FILTERED 1
-#define Z_HUFFMAN_ONLY 2
-#define Z_RLE 3
-#define Z_FIXED 4
-#define Z_DEFAULT_STRATEGY 0
-/* compression strategy; see deflateInit2() below for details */
-
-#define Z_BINARY 0
-#define Z_TEXT 1
-#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
-#define Z_UNKNOWN 2
-/* Possible values of the data_type field (though see inflate()) */
-
-#define Z_DEFLATED 8
-/* The deflate compression method (the only one supported in this version) */
-
-#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-
-#define zlib_version zlibVersion()
-/* for compatibility with versions < 1.0.2 */
-
- /* basic functions */
-
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
- If the first character differs, the library code actually used is
- not compatible with the zlib.h header file used by the application.
- This check is automatically made by deflateInit and inflateInit.
- */
-
-/*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
-
- Initializes the internal stream state for compression. The fields
- zalloc, zfree and opaque must be initialized before by the caller.
- If zalloc and zfree are set to Z_NULL, deflateInit updates them to
- use default allocation functions.
-
- The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
- 1 gives best speed, 9 gives best compression, 0 gives no compression at
- all (the input data is simply copied a block at a time).
- Z_DEFAULT_COMPRESSION requests a default compromise between speed and
- compression (currently equivalent to level 6).
-
- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if level is not a valid compression level,
- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
- with the version assumed by the caller (ZLIB_VERSION).
- msg is set to null if there is no error message. deflateInit does not
- perform any compression: this will be done by deflate().
-*/
-
-
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
-/*
- deflate compresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce some
- output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. deflate performs one or both of the
- following actions:
-
- - Compress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in and avail_in are updated and
- processing will resume at this point for the next call of deflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. This action is forced if the parameter flush is non zero.
- Forcing flush frequently degrades the compression ratio, so this parameter
- should be set only when necessary (in interactive applications).
- Some output may be provided even if flush is not set.
-
- Before the call of deflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating avail_in or avail_out accordingly; avail_out
- should never be zero before the call. The application can consume the
- compressed output when it wants, for example when the output buffer is full
- (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
- and with zero avail_out, it must be called again after making room in the
- output buffer because there might be more output pending.
-
- Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
- decide how much data to accumualte before producing output, in order to
- maximize compression.
-
- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
- flushed to the output buffer and the output is aligned on a byte boundary, so
- that the decompressor can get all input data available so far. (In particular
- avail_in is zero after the call if enough output space has been provided
- before the call.) Flushing may degrade compression for some compression
- algorithms and so it should be used only when necessary.
-
- If flush is set to Z_FULL_FLUSH, all output is flushed as with
- Z_SYNC_FLUSH, and the compression state is reset so that decompression can
- restart from this point if previous compressed data has been damaged or if
- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
- compression.
-
- If deflate returns with avail_out == 0, this function must be called again
- with the same value of the flush parameter and more output space (updated
- avail_out), until the flush is complete (deflate returns with non-zero
- avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
- avail_out is greater than six to avoid repeated flush markers due to
- avail_out == 0 on return.
-
- If the parameter flush is set to Z_FINISH, pending input is processed,
- pending output is flushed and deflate returns with Z_STREAM_END if there
- was enough output space; if deflate returns with Z_OK, this function must be
- called again with Z_FINISH and more output space (updated avail_out) but no
- more input data, until it returns with Z_STREAM_END or an error. After
- deflate has returned Z_STREAM_END, the only possible operations on the
- stream are deflateReset or deflateEnd.
-
- Z_FINISH can be used immediately after deflateInit if all the compression
- is to be done in a single step. In this case, avail_out must be at least
- the value returned by deflateBound (see below). If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
-
- deflate() sets strm->adler to the adler32 checksum of all input read
- so far (that is, total_in bytes).
-
- deflate() may update strm->data_type if it can make a good guess about
- the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
- binary. This field is only for information purposes and does not affect
- the compression algorithm in any manner.
-
- deflate() returns Z_OK if some progress has been made (more input
- processed or more output produced), Z_STREAM_END if all input has been
- consumed and all output has been produced (only when flush is set to
- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
- if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
- (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
- fatal, and deflate() can be called again with more input and more output
- space to continue compressing.
-*/
-
-
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
- stream state was inconsistent, Z_DATA_ERROR if the stream was freed
- prematurely (some input or output was discarded). In the error case,
- msg may be set but then points to a static string (which must not be
- deallocated).
-*/
-
-
-/*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
-
- Initializes the internal stream state for decompression. The fields
- next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
- value depends on the compression method), inflateInit determines the
- compression method from the zlib header and allocates all data structures
- accordingly; otherwise the allocation will be deferred to the first call of
- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
- use default allocation functions.
-
- inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
- version assumed by the caller. msg is set to null if there is no error
- message. inflateInit does not perform any decompression apart from reading
- the zlib header if present: this will be done by inflate(). (So next_in and
- avail_in may be modified, but next_out and avail_out are unchanged.)
-*/
-
-
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
-/*
- inflate decompresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce
- some output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. inflate performs one or both of the
- following actions:
-
- - Decompress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in is updated and processing
- will resume at this point for the next call of inflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. inflate() provides as much output as possible, until there
- is no more input data or no more space in the output buffer (see below
- about the flush parameter).
-
- Before the call of inflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating the next_* and avail_* values accordingly.
- The application can consume the uncompressed output when it wants, for
- example when the output buffer is full (avail_out == 0), or after each
- call of inflate(). If inflate returns Z_OK and with zero avail_out, it
- must be called again after making room in the output buffer because there
- might be more output pending.
-
- The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
- Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
- output as possible to the output buffer. Z_BLOCK requests that inflate() stop
- if and when it gets to the next deflate block boundary. When decoding the
- zlib or gzip format, this will cause inflate() to return immediately after
- the header and before the first block. When doing a raw inflate, inflate()
- will go ahead and process the first block, and will return when it gets to
- the end of that block, or when it runs out of data.
-
- The Z_BLOCK option assists in appending to or combining deflate streams.
- Also to assist in this, on return inflate() will set strm->data_type to the
- number of unused bits in the last byte taken from strm->next_in, plus 64
- if inflate() is currently decoding the last block in the deflate stream,
- plus 128 if inflate() returned immediately after decoding an end-of-block
- code or decoding the complete header up to just before the first byte of the
- deflate stream. The end-of-block will not be indicated until all of the
- uncompressed data from that block has been written to strm->next_out. The
- number of unused bits may in general be greater than seven, except when
- bit 7 of data_type is set, in which case the number of unused bits will be
- less than eight.
-
- inflate() should normally be called until it returns Z_STREAM_END or an
- error. However if all decompression is to be performed in a single step
- (a single call of inflate), the parameter flush should be set to
- Z_FINISH. In this case all pending input is processed and all pending
- output is flushed; avail_out must be large enough to hold all the
- uncompressed data. (The size of the uncompressed data may have been saved
- by the compressor for this purpose.) The next operation on this stream must
- be inflateEnd to deallocate the decompression state. The use of Z_FINISH
- is never required, but can be used to inform inflate that a faster approach
- may be used for the single inflate() call.
-
- In this implementation, inflate() always flushes as much output as
- possible to the output buffer, and always uses the faster approach on the
- first call. So the only effect of the flush parameter in this implementation
- is on the return value of inflate(), as noted below, or when it returns early
- because Z_BLOCK is used.
-
- If a preset dictionary is needed after this call (see inflateSetDictionary
- below), inflate sets strm->adler to the adler32 checksum of the dictionary
- chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
- strm->adler to the adler32 checksum of all output produced so far (that is,
- total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
- below. At the end of the stream, inflate() checks that its computed adler32
- checksum is equal to that saved by the compressor and returns Z_STREAM_END
- only if the checksum is correct.
-
- inflate() will decompress and check either zlib-wrapped or gzip-wrapped
- deflate data. The header type is detected automatically. Any information
- contained in the gzip header is not retained, so applications that need that
- information should instead use raw inflate, see inflateInit2() below, or
- inflateBack() and perform their own processing of the gzip header and
- trailer.
-
- inflate() returns Z_OK if some progress has been made (more input processed
- or more output produced), Z_STREAM_END if the end of the compressed data has
- been reached and all uncompressed output has been produced, Z_NEED_DICT if a
- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
- corrupted (input stream not conforming to the zlib format or incorrect check
- value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
- if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
- Z_BUF_ERROR if no progress is possible or if there was not enough room in the
- output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
- inflate() can be called again with more input and more output space to
- continue decompressing. If Z_DATA_ERROR is returned, the application may then
- call inflateSync() to look for a good compression block if a partial recovery
- of the data is desired.
-*/
-
-
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
- was inconsistent. In the error case, msg may be set but then points to a
- static string (which must not be deallocated).
-*/
-
- /* Advanced functions */
-
-/*
- The following functions are needed only in some special applications.
-*/
-
-/*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
- int level,
- int method,
- int windowBits,
- int memLevel,
- int strategy));
-
- This is another version of deflateInit with more compression options. The
- fields next_in, zalloc, zfree and opaque must be initialized before by
- the caller.
-
- The method parameter is the compression method. It must be Z_DEFLATED in
- this version of the library.
-
- The windowBits parameter is the base two logarithm of the window size
- (the size of the history buffer). It should be in the range 8..15 for this
- version of the library. Larger values of this parameter result in better
- compression at the expense of memory usage. The default value is 15 if
- deflateInit is used instead.
-
- windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
- determines the window size. deflate() will then generate raw deflate data
- with no zlib header or trailer, and will not compute an adler32 check value.
-
- windowBits can also be greater than 15 for optional gzip encoding. Add
- 16 to windowBits to write a simple gzip header and trailer around the
- compressed data instead of a zlib wrapper. The gzip header will have no
- file name, no extra data, no comment, no modification time (set to zero),
- no header crc, and the operating system will be set to 255 (unknown). If a
- gzip stream is being written, strm->adler is a crc32 instead of an adler32.
-
- The memLevel parameter specifies how much memory should be allocated
- for the internal compression state. memLevel=1 uses minimum memory but
- is slow and reduces compression ratio; memLevel=9 uses maximum memory
- for optimal speed. The default value is 8. See zconf.h for total memory
- usage as a function of windowBits and memLevel.
-
- The strategy parameter is used to tune the compression algorithm. Use the
- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
- string match), or Z_RLE to limit match distances to one (run-length
- encoding). Filtered data consists mostly of small values with a somewhat
- random distribution. In this case, the compression algorithm is tuned to
- compress them better. The effect of Z_FILTERED is to force more Huffman
- coding and less string matching; it is somewhat intermediate between
- Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
- Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
- parameter only affects the compression ratio but not the correctness of the
- compressed output even if it is not set appropriately. Z_FIXED prevents the
- use of dynamic Huffman codes, allowing for a simpler decoder for special
- applications.
-
- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
- method). msg is set to null if there is no error message. deflateInit2 does
- not perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any
- call of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
-
- The dictionary should consist of strings (byte sequences) that are likely
- to be encountered later in the data to be compressed, with the most commonly
- used strings preferably put towards the end of the dictionary. Using a
- dictionary is most useful when the data to be compressed is short and can be
- predicted with good accuracy; the data can then be compressed better than
- with the default empty dictionary.
-
- Depending on the size of the compression data structures selected by
- deflateInit or deflateInit2, a part of the dictionary may in effect be
- discarded, for example if the dictionary is larger than the window size in
- deflate or deflate2. Thus the strings most likely to be useful should be
- put at the end of the dictionary, not at the front. In addition, the
- current implementation of deflate will use at most the window size minus
- 262 bytes of the provided dictionary.
-
- Upon return of this function, strm->adler is set to the adler32 value
- of the dictionary; the decompressor may later use this value to determine
- which dictionary has been used by the compressor. (The adler32 value
- applies to the whole dictionary even if only a subset of the dictionary is
- actually used by the compressor.) If a raw deflate was requested, then the
- adler32 value is not computed and strm->adler is not set.
-
- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when several compression strategies will be
- tried, for example when there are several ways of pre-processing the input
- data with a filter. The streams that will be discarded should then be freed
- by calling deflateEnd. Note that deflateCopy duplicates the internal
- compression state which can be quite large, so this strategy is slow and
- can consume lots of memory.
-
- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
-/*
- This function is equivalent to deflateEnd followed by deflateInit,
- but does not free and reallocate all the internal compression state.
- The stream will keep the same compression level and any other attributes
- that may have been set by deflateInit2.
-
- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
- int level,
- int strategy));
-/*
- Dynamically update the compression level and compression strategy. The
- interpretation of level and strategy is as in deflateInit2. This can be
- used to switch between compression and straight copy of the input data, or
- to switch to a different kind of input data requiring a different
- strategy. If the compression level is changed, the input available so far
- is compressed with the old level (and may be flushed); the new level will
- take effect only at the next call of deflate().
-
- Before the call of deflateParams, the stream state must be set as for
- a call of deflate(), since the currently available input may have to
- be compressed and flushed. In particular, strm->avail_out must be non-zero.
-
- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
- if strm->avail_out was zero.
-*/
-
-ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
- int good_length,
- int max_lazy,
- int nice_length,
- int max_chain));
-/*
- Fine tune deflate's internal compression parameters. This should only be
- used by someone who understands the algorithm used by zlib's deflate for
- searching for the best matching string, and even then only by the most
- fanatic optimizer trying to squeeze out the last compressed bit for their
- specific input data. Read the deflate.c source code for the meaning of the
- max_lazy, good_length, nice_length, and max_chain parameters.
-
- deflateTune() can be called after deflateInit() or deflateInit2(), and
- returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
- */
-
-ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
- uLong sourceLen));
-/*
- deflateBound() returns an upper bound on the compressed size after
- deflation of sourceLen bytes. It must be called after deflateInit()
- or deflateInit2(). This would be used to allocate an output buffer
- for deflation in a single pass, and so would be called before deflate().
-*/
-
-ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
- int bits,
- int value));
-/*
- deflatePrime() inserts bits in the deflate output stream. The intent
- is that this function is used to start off the deflate output with the
- bits leftover from a previous deflate stream when appending to it. As such,
- this function can only be used for raw deflate, and must be used before the
- first deflate() call after a deflateInit2() or deflateReset(). bits must be
- less than or equal to 16, and that many of the least significant bits of
- value will be inserted in the output.
-
- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
-*/
-
-ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
- gz_headerp head));
-/*
- deflateSetHeader() provides gzip header information for when a gzip
- stream is requested by deflateInit2(). deflateSetHeader() may be called
- after deflateInit2() or deflateReset() and before the first call of
- deflate(). The text, time, os, extra field, name, and comment information
- in the provided gz_header structure are written to the gzip header (xflag is
- ignored -- the extra flags are set according to the compression level). The
- caller must assure that, if not Z_NULL, name and comment are terminated with
- a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
- available there. If hcrc is true, a gzip header crc is included. Note that
- the current versions of the command-line version of gzip (up through version
- 1.3.x) do not support header crc's, and will report that it is a "multi-part
- gzip file" and give up.
-
- If deflateSetHeader is not used, the default gzip header has text false,
- the time set to zero, and os set to 255, with no extra, name, or comment
- fields. The gzip header is returned to the default state by deflateReset().
-
- deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
- int windowBits));
-
- This is another version of inflateInit with an extra parameter. The
- fields next_in, avail_in, zalloc, zfree and opaque must be initialized
- before by the caller.
-
- The windowBits parameter is the base two logarithm of the maximum window
- size (the size of the history buffer). It should be in the range 8..15 for
- this version of the library. The default value is 15 if inflateInit is used
- instead. windowBits must be greater than or equal to the windowBits value
- provided to deflateInit2() while compressing, or it must be equal to 15 if
- deflateInit2() was not used. If a compressed stream with a larger window
- size is given as input, inflate() will return with the error code
- Z_DATA_ERROR instead of trying to allocate a larger window.
-
- windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
- determines the window size. inflate() will then process raw deflate data,
- not looking for a zlib or gzip header, not generating a check value, and not
- looking for any check values for comparison at the end of the stream. This
- is for use with other formats that use the deflate compressed data format
- such as zip. Those formats provide their own check values. If a custom
- format is developed using the raw deflate format for compressed data, it is
- recommended that a check value such as an adler32 or a crc32 be applied to
- the uncompressed data as is done in the zlib, gzip, and zip formats. For
- most applications, the zlib format should be used as is. Note that comments
- above on the use in deflateInit2() applies to the magnitude of windowBits.
-
- windowBits can also be greater than 15 for optional gzip decoding. Add
- 32 to windowBits to enable zlib and gzip decoding with automatic header
- detection, or add 16 to decode only the gzip format (the zlib format will
- return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
- a crc32 instead of an adler32.
-
- inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
- is set to null if there is no error message. inflateInit2 does not perform
- any decompression apart from reading the zlib header if present: this will
- be done by inflate(). (So next_in and avail_in may be modified, but next_out
- and avail_out are unchanged.)
-*/
-
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the decompression dictionary from the given uncompressed byte
- sequence. This function must be called immediately after a call of inflate,
- if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
- can be determined from the adler32 value returned by that call of inflate.
- The compressor and decompressor must use exactly the same dictionary (see
- deflateSetDictionary). For raw inflate, this function can be called
- immediately after inflateInit2() or inflateReset() and before any call of
- inflate() to set the dictionary. The application must insure that the
- dictionary that was used for compression is provided.
-
- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
- expected one (incorrect adler32 value). inflateSetDictionary does not
- perform any decompression: this will be done by subsequent calls of
- inflate().
-*/
-
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
- available input is skipped. No output is provided.
-
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been found,
- or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
- case, the application may save the current current value of total_in which
- indicates where valid compressed data was found. In the error case, the
- application may repeatedly call inflateSync, providing more input each time,
- until success or end of the input data.
-*/
-
-ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when randomly accessing a large stream. The
- first pass through the stream can periodically record the inflate state,
- allowing restarting inflate at those points when randomly accessing the
- stream.
-
- inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
-/*
- This function is equivalent to inflateEnd followed by inflateInit,
- but does not free and reallocate all the internal decompression state.
- The stream will keep attributes that may have been set by inflateInit2.
-
- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
- int bits,
- int value));
-/*
- This function inserts bits in the inflate input stream. The intent is
- that this function is used to start inflating at a bit position in the
- middle of a byte. The provided bits will be used before any bytes are used
- from next_in. This function should only be used with raw inflate, and
- should be used before the first inflate() call after inflateInit2() or
- inflateReset(). bits must be less than or equal to 16, and that many of the
- least significant bits of value will be inserted in the input.
-
- inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
-*/
-
-ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
- gz_headerp head));
-/*
- inflateGetHeader() requests that gzip header information be stored in the
- provided gz_header structure. inflateGetHeader() may be called after
- inflateInit2() or inflateReset(), and before the first call of inflate().
- As inflate() processes the gzip stream, head->done is zero until the header
- is completed, at which time head->done is set to one. If a zlib stream is
- being decoded, then head->done is set to -1 to indicate that there will be
- no gzip header information forthcoming. Note that Z_BLOCK can be used to
- force inflate() to return immediately after header processing is complete
- and before any actual data is decompressed.
-
- The text, time, xflags, and os fields are filled in with the gzip header
- contents. hcrc is set to true if there is a header CRC. (The header CRC
- was valid if done is set to one.) If extra is not Z_NULL, then extra_max
- contains the maximum number of bytes to write to extra. Once done is true,
- extra_len contains the actual extra field length, and extra contains the
- extra field, or that field truncated if extra_max is less than extra_len.
- If name is not Z_NULL, then up to name_max characters are written there,
- terminated with a zero unless the length is greater than name_max. If
- comment is not Z_NULL, then up to comm_max characters are written there,
- terminated with a zero unless the length is greater than comm_max. When
- any of extra, name, or comment are not Z_NULL and the respective field is
- not present in the header, then that field is set to Z_NULL to signal its
- absence. This allows the use of deflateSetHeader() with the returned
- structure to duplicate the header. However if those fields are set to
- allocated memory, then the application will need to save those pointers
- elsewhere so that they can be eventually freed.
-
- If inflateGetHeader is not used, then the header information is simply
- discarded. The header is always checked for validity, including the header
- CRC if present. inflateReset() will reset the process to discard the header
- information. The application would need to call inflateGetHeader() again to
- retrieve the header from the next gzip stream.
-
- inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
- unsigned char FAR *window));
-
- Initialize the internal stream state for decompression using inflateBack()
- calls. The fields zalloc, zfree and opaque in strm must be initialized
- before the call. If zalloc and zfree are Z_NULL, then the default library-
- derived memory allocation routines are used. windowBits is the base two
- logarithm of the window size, in the range 8..15. window is a caller
- supplied buffer of that size. Except for special applications where it is
- assured that deflate was used with small window sizes, windowBits must be 15
- and a 32K byte window must be supplied to be able to decompress general
- deflate streams.
-
- See inflateBack() for the usage of these routines.
-
- inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
- the paramaters are invalid, Z_MEM_ERROR if the internal state could not
- be allocated, or Z_VERSION_ERROR if the version of the library does not
- match the version of the header file.
-*/
-
-typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
-
-ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
- in_func in, void FAR *in_desc,
- out_func out, void FAR *out_desc));
-/*
- inflateBack() does a raw inflate with a single call using a call-back
- interface for input and output. This is more efficient than inflate() for
- file i/o applications in that it avoids copying between the output and the
- sliding window by simply making the window itself the output buffer. This
- function trusts the application to not change the output buffer passed by
- the output function, at least until inflateBack() returns.
-
- inflateBackInit() must be called first to allocate the internal state
- and to initialize the state with the user-provided window buffer.
- inflateBack() may then be used multiple times to inflate a complete, raw
- deflate stream with each call. inflateBackEnd() is then called to free
- the allocated state.
-
- A raw deflate stream is one with no zlib or gzip header or trailer.
- This routine would normally be used in a utility that reads zip or gzip
- files and writes out uncompressed files. The utility would decode the
- header and process the trailer on its own, hence this routine expects
- only the raw deflate stream to decompress. This is different from the
- normal behavior of inflate(), which expects either a zlib or gzip header and
- trailer around the deflate stream.
-
- inflateBack() uses two subroutines supplied by the caller that are then
- called by inflateBack() for input and output. inflateBack() calls those
- routines until it reads a complete deflate stream and writes out all of the
- uncompressed data, or until it encounters an error. The function's
- parameters and return types are defined above in the in_func and out_func
- typedefs. inflateBack() will call in(in_desc, &buf) which should return the
- number of bytes of provided input, and a pointer to that input in buf. If
- there is no input available, in() must return zero--buf is ignored in that
- case--and inflateBack() will return a buffer error. inflateBack() will call
- out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
- should return zero on success, or non-zero on failure. If out() returns
- non-zero, inflateBack() will return with an error. Neither in() nor out()
- are permitted to change the contents of the window provided to
- inflateBackInit(), which is also the buffer that out() uses to write from.
- The length written by out() will be at most the window size. Any non-zero
- amount of input may be provided by in().
-
- For convenience, inflateBack() can be provided input on the first call by
- setting strm->next_in and strm->avail_in. If that input is exhausted, then
- in() will be called. Therefore strm->next_in must be initialized before
- calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
- immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
- must also be initialized, and then if strm->avail_in is not zero, input will
- initially be taken from strm->next_in[0 .. strm->avail_in - 1].
-
- The in_desc and out_desc parameters of inflateBack() is passed as the
- first parameter of in() and out() respectively when they are called. These
- descriptors can be optionally used to pass any information that the caller-
- supplied in() and out() functions need to do their job.
-
- On return, inflateBack() will set strm->next_in and strm->avail_in to
- pass back any unused input that was provided by the last in() call. The
- return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
- if in() or out() returned an error, Z_DATA_ERROR if there was a format
- error in the deflate stream (in which case strm->msg is set to indicate the
- nature of the error), or Z_STREAM_ERROR if the stream was not properly
- initialized. In the case of Z_BUF_ERROR, an input or output error can be
- distinguished using strm->next_in which will be Z_NULL only if in() returned
- an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
- out() returning non-zero. (in() will always be called before out(), so
- strm->next_in is assured to be defined if out() returns non-zero.) Note
- that inflateBack() cannot return Z_OK.
-*/
-
-ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
-/*
- All memory allocated by inflateBackInit() is freed.
-
- inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
- state was inconsistent.
-*/
-
-ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
-/* Return flags indicating compile-time options.
-
- Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
- 1.0: size of uInt
- 3.2: size of uLong
- 5.4: size of voidpf (pointer)
- 7.6: size of z_off_t
-
- Compiler, assembler, and debug options:
- 8: DEBUG
- 9: ASMV or ASMINF -- use ASM code
- 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
- 11: 0 (reserved)
-
- One-time table building (smaller code, but not thread-safe if true):
- 12: BUILDFIXED -- build static block decoding tables when needed
- 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
- 14,15: 0 (reserved)
-
- Library content (indicates missing functionality):
- 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
- deflate code when not needed)
- 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
- and decode gzip streams (to avoid linking crc code)
- 18-19: 0 (reserved)
-
- Operation variations (changes in library functionality):
- 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
- 21: FASTEST -- deflate algorithm with only one, lowest compression level
- 22,23: 0 (reserved)
-
- The sprintf variant used by gzprintf (zero is best):
- 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
- 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
-
- Remainder:
- 27-31: 0 (reserved)
- */
-
-
- /* utility functions */
-
-/*
- The following utility functions are implemented on top of the
- basic stream-oriented functions. To simplify the interface, some
- default options are assumed (compression level and memory usage,
- standard memory allocation functions). The source code of these
- utility functions can easily be modified if you need special options.
-*/
-
-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Compresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be at least the value returned
- by compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer.
- This function can be used to compress a whole file at once if the
- input file is mmap'ed.
- compress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer.
-*/
-
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen,
- int level));
-/*
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least the value returned by
- compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-
-ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
-/*
- compressBound() returns an upper bound on the compressed size after
- compress() or compress2() on sourceLen bytes. It would be used before
- a compress() or compress2() call to allocate the destination buffer.
-*/
-
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
-*/
-
-
-typedef voidp gzFile;
-
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
-/*
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb") but can also include a compression level
- ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
- Huffman only compression as in "wb1h", or 'R' for run-length encoding
- as in "wb1R". (See the description of deflateInit2 for more information
- about the strategy parameter.)
-
- gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
-
- gzopen returns NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR). */
-
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
-/*
- gzdopen() associates a gzFile with the file descriptor fd. File
- descriptors are obtained from calls like open, dup, creat, pipe or
- fileno (in the file has been previously opened with fopen).
- The mode parameter is as in gzopen.
- The next call of gzclose on the returned gzFile will also close the
- file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
- descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
- gzdopen returns NULL if there was insufficient memory to allocate
- the (de)compression state.
-*/
-
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
-/*
- Dynamically update the compression level or strategy. See the description
- of deflateInit2 for the meaning of these parameters.
- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
- opened for writing.
-*/
-
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
-/*
- Reads the given number of uncompressed bytes from the compressed file.
- If the input file was not in gzip format, gzread copies the given number
- of bytes into the buffer.
- gzread returns the number of uncompressed bytes actually read (0 for
- end of file, -1 for error). */
-
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
- voidpc buf, unsigned len));
-/*
- Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of uncompressed bytes actually written
- (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
-/*
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error). The number of
- uncompressed bytes written is limited to 4095. The caller should assure that
- this limit is not exceeded. If it is exceeded, then gzprintf() will return
- return an error (0) with nothing written. In this case, there may also be a
- buffer overflow with unpredictable consequences, which is possible only if
- zlib was compiled with the insecure functions sprintf() or vsprintf()
- because the secure snprintf() or vsnprintf() functions were not available.
-*/
-
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
-/*
- Writes the given null-terminated string to the compressed file, excluding
- the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
-*/
-
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
-/*
- Reads bytes from the compressed file until len-1 characters are read, or
- a newline character is read and transferred to buf, or an end-of-file
- condition is encountered. The string is then terminated with a null
- character.
- gzgets returns buf, or Z_NULL in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
-/*
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
-/*
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
-*/
-
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
-/*
- Push one character back onto the stream to be read again later.
- Only one character of push-back is allowed. gzungetc() returns the
- character pushed, or -1 on failure. gzungetc() will fail if a
- character has been pushed but not read yet, or if c is -1. The pushed
- character will be discarded if the stream is repositioned with gzseek()
- or gzrewind().
-*/
-
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
-/*
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function. The return value is the zlib
- error number (see function gzerror below). gzflush returns Z_OK if
- the flush parameter is Z_FINISH and all output could be flushed.
- gzflush should be called only when strictly necessary because it can
- degrade compression.
-*/
-
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
-/*
- Sets the starting position for the next gzread or gzwrite on the
- given compressed file. The offset represents a number of bytes in the
- uncompressed data stream. The whence parameter is defined as in lseek(2);
- the value SEEK_END is not supported.
- If the file is opened for reading, this function is emulated but can be
- extremely slow. If the file is opened for writing, only forward seeks are
- supported; gzseek then compresses a sequence of zeroes up to the new
- starting position.
-
- gzseek returns the resulting offset location as measured in bytes from
- the beginning of the uncompressed stream, or -1 in case of error, in
- particular if the file is opened for writing and the new starting position
- would be before the current position.
-*/
-
-ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
-/*
- Rewinds the given file. This function is supported only for reading.
-
- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
-*/
-
-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
-/*
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
-
- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
-*/
-
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
-/*
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
-*/
-
-ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
-/*
- Returns 1 if file is being read directly without decompression, otherwise
- zero.
-*/
-
-ZEXTERN int ZEXPORT gzclose OF((gzFile file));
-/*
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state. The return value is the zlib
- error number (see function gzerror below).
-*/
-
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
-/*
- Returns the error message for the last error which occurred on the
- given compressed file. errnum is set to zlib error number. If an
- error occurred in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
-*/
-
-ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
-/*
- Clears the error and end-of-file flags for file. This is analogous to the
- clearerr() function in stdio. This is useful for continuing to read a gzip
- file that is being written concurrently.
-*/
-
- /* checksum functions */
-
-/*
- These functions are not related to compression but are exported
- anyway because they might be useful in applications using the
- compression library.
-*/
-
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
-/*
- Update a running Adler-32 checksum with the bytes buf[0..len-1] and
- return the updated checksum. If buf is NULL, this function returns
- the required initial value for the checksum.
- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
- much faster. Usage example:
-
- uLong adler = adler32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- adler = adler32(adler, buffer, length);
- }
- if (adler != original_adler) error();
-*/
-
-ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
- z_off_t len2));
-/*
- Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
- and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
- each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
- seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
-*/
-
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
-/*
- Update a running CRC-32 with the bytes buf[0..len-1] and return the
- updated CRC-32. If buf is NULL, this function returns the required initial
- value for the for the crc. Pre- and post-conditioning (one's complement) is
- performed within this function so it shouldn't be done by the application.
- Usage example:
-
- uLong crc = crc32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- crc = crc32(crc, buffer, length);
- }
- if (crc != original_crc) error();
-*/
-
-ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
-
-/*
- Combine two CRC-32 check values into one. For two sequences of bytes,
- seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
- calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
- check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
- len2.
-*/
-
-
- /* various hacks, don't look :) */
-
-/* deflateInit and inflateInit are macros to allow checking the zlib version
- * and the compiler's view of z_stream:
- */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
- int windowBits, int memLevel,
- int strategy, const char *version,
- int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
- unsigned char FAR *window,
- const char *version,
- int stream_size));
-#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
-#define inflateBackInit(strm, windowBits, window) \
- inflateBackInit_((strm), (windowBits), (window), \
- ZLIB_VERSION, sizeof(z_stream))
-
-
-#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-ZEXTERN const char * ZEXPORT zError OF((int));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ZLIB_H */
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.3, July 18th, 2005
+
+ Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.3"
+#define ZLIB_VERNUM 0x1230
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumualte before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ the value returned by deflateBound (see below). If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+ Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+ if and when it gets to the next deflate block boundary. When decoding the
+ zlib or gzip format, this will cause inflate() to return immediately after
+ the header and before the first block. When doing a raw inflate, inflate()
+ will go ahead and process the first block, and will return when it gets to
+ the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64
+ if inflate() is currently decoding the last block in the deflate stream,
+ plus 128 if inflate() returned immediately after decoding an end-of-block
+ code or decoding the complete header up to just before the first byte of the
+ deflate stream. The end-of-block will not be indicated until all of the
+ uncompressed data from that block has been written to strm->next_out. The
+ number of unused bits may in general be greater than seven, except when
+ bit 7 of data_type is set, in which case the number of unused bits will be
+ less than eight.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster approach
+ may be used for the single inflate() call.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the only effect of the flush parameter in this implementation
+ is on the return value of inflate(), as noted below, or when it returns early
+ because Z_BLOCK is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the adler32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() will decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically. Any information
+ contained in the gzip header is not retained, so applications that need that
+ information should instead use raw inflate, see inflateInit2() below, or
+ inflateBack() and perform their own processing of the gzip header and
+ trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may then
+ call inflateSync() to look for a good compression block if a partial recovery
+ of the data is desired.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero),
+ no header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
+ Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
+ parameter only affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately. Z_FIXED prevents the
+ use of dynamic Huffman codes, allowing for a simpler decoder for special
+ applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front. In addition, the
+ current implementation of deflate will use at most the window size minus
+ 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit()
+ or deflateInit2(). This would be used to allocate an output buffer
+ for deflation in a single pass, and so would be called before deflate().
+*/
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the
+ bits leftover from a previous deflate stream when appending to it. As such,
+ this function can only be used for raw deflate, and must be used before the
+ first deflate() call after a deflateInit2() or deflateReset(). bits must be
+ less than or equal to 16, and that many of the least significant bits of
+ value will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
+ a crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
+ is set to null if there is no error message. inflateInit2 does not perform
+ any decompression apart from reading the zlib header if present: this will
+ be done by inflate(). (So next_in and avail_in may be modified, but next_out
+ and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called
+ immediately after inflateInit2() or inflateReset() and before any call of
+ inflate() to set the dictionary. The application must insure that the
+ dictionary that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK can be used to
+ force inflate() to return immediately after header processing is complete
+ and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When
+ any of extra, name, or comment are not Z_NULL and the respective field is
+ not present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the paramaters are invalid, Z_MEM_ERROR if the internal state could not
+ be allocated, or Z_VERSION_ERROR if the version of the library does not
+ match the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is more efficient than inflate() for
+ file i/o applications in that it avoids copying between the output and the
+ sliding window by simply making the window itself the output buffer. This
+ function trusts the application to not change the output buffer passed by
+ the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free
+ the allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects
+ only the raw deflate stream to decompress. This is different from the
+ normal behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format
+ error in the deflate stream (in which case strm->msg is set to indicate the
+ nature of the error), or Z_STREAM_ERROR if the stream was not properly
+ initialized. In the case of Z_BUF_ERROR, an input or output error can be
+ distinguished using strm->next_in which will be Z_NULL only if in() returned
+ an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
+ out() returning non-zero. (in() will always be called before out(), so
+ strm->next_in is assured to be defined if out() returns non-zero.) Note
+ that inflateBack() cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least the value returned
+ by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before
+ a compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h", or 'R' for run-length encoding
+ as in "wb1R". (See the description of deflateInit2 for more information
+ about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error). The number of
+ uncompressed bytes written is limited to 4095. The caller should assure that
+ this limit is not exceeded. If it is exceeded, then gzprintf() will return
+ return an error (0) with nothing written. In this case, there may also be a
+ buffer overflow with unpredictable consequences, which is possible only if
+ zlib was compiled with the insecure functions sprintf() or vsprintf()
+ because the secure snprintf() or vsnprintf() functions were not available.
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read again later.
+ Only one character of push-back is allowed. gzungetc() returns the
+ character pushed, or -1 on failure. gzungetc() will fail if a
+ character has been pushed but not read yet, or if c is -1. The pushed
+ character will be discarded if the stream is repositioned with gzseek()
+ or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns 1 if file is being read directly without decompression, otherwise
+ zero.
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+/*
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is NULL, this function returns the required initial
+ value for the for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+/*
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char * ZEXPORT zError OF((int));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */